ZGlmZiAtLWdpdCBhLy5pbmRlbnQucHJvIGIvLmluZGVudC5wcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkyZWNmMQotLS0gL2Rldi9udWxsCisrKyBiLy5pbmRlbnQucHJvCkBAIC0wLDAgKzEsMzMgQEAKKy0tYmxhbmstbGluZXMtYWZ0ZXItZGVjbGFyYXRpb25zCistLWJsYW5rLWxpbmVzLWFmdGVyLXByb2NlZHVyZXMKKy0tYnJlYWstYmVmb3JlLWJvb2xlYW4tb3BlcmF0b3IKKy0tbm8tYmxhbmstbGluZXMtYWZ0ZXItY29tbWFzCistLWJyYWNlcy1vbi1pZi1saW5lCistLWJyYWNlcy1vbi1zdHJ1Y3QtZGVjbC1saW5lCistLWNvbW1lbnQtaW5kZW50YXRpb24yNQorLS1kZWNsYXJhdGlvbi1jb21tZW50LWNvbHVtbjI1CistLW5vLWNvbW1lbnQtZGVsaW1pdGVycy1vbi1ibGFuay1saW5lcworLS1jdWRkbGUtZWxzZQorLS1jb250aW51YXRpb24taW5kZW50YXRpb240CistLWNhc2UtaW5kZW50YXRpb24wCistLWVsc2UtZW5kaWYtY29sdW1uMzMKKy0tc3BhY2UtYWZ0ZXItY2FzdAorLS1saW5lLWNvbW1lbnRzLWluZGVudGF0aW9uMAorLS1kZWNsYXJhdGlvbi1pbmRlbnRhdGlvbjEKKy0tZG9udC1mb3JtYXQtZmlyc3QtY29sdW1uLWNvbW1lbnRzCistLWRvbnQtZm9ybWF0LWNvbW1lbnRzCistLWhvbm91ci1uZXdsaW5lcworLS1pbmRlbnQtbGV2ZWw0CisvKiBjaGFuZ2VkIGZyb20gMCB0byA0ICovCistLXBhcmFtZXRlci1pbmRlbnRhdGlvbjQKKy0tbGluZS1sZW5ndGg3OCAvKiBjaGFuZ2VkIGZyb20gNzUgKi8KKy0tY29udGludWUtYXQtcGFyZW50aGVzZXMKKy0tbm8tc3BhY2UtYWZ0ZXItZnVuY3Rpb24tY2FsbC1uYW1lcworLS1kb250LWJyZWFrLXByb2NlZHVyZS10eXBlCistLWRvbnQtc3Rhci1jb21tZW50cworLS1sZWF2ZS1vcHRpb25hbC1ibGFuay1saW5lcworLS1kb250LXNwYWNlLXNwZWNpYWwtc2VtaWNvbG9uCistLXRhYi1zaXplNAorLyogYWRkaXRpb25zIGJ5IE1hcmsgKi8KKy0tY2FzZS1icmFjZS1pbmRlbnRhdGlvbjAKKy0tbGVhdmUtcHJlcHJvY2Vzc29yLXNwYWNlCmRpZmYgLS1naXQgYS8ua2VybmVscmVsZWFzZSBiLy5rZXJuZWxyZWxlYXNlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZTgzODQKLS0tIC9kZXYvbnVsbAorKysgYi8ua2VybmVscmVsZWFzZQpAQCAtMCwwICsxIEBACisxLjI0LjEKZGlmZiAtLWdpdCBhL0FVVEhPUlMgYi9BVVRIT1JTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MDhmYzcKLS0tIC9kZXYvbnVsbAorKysgYi9BVVRIT1JTCkBAIC0wLDAgKzEsMTc2IEBACitMaXN0IG9mIHRoZSBhdXRob3JzIG9mIGNvZGUgY29udGFpbmVkIGluIEJ1c3lCb3guCisKK0lmIHlvdSBoYXZlIGNvZGUgaW4gQnVzeUJveCwgeW91IHNob3VsZCBiZSBsaXN0ZWQgaGVyZS4gIElmIHlvdSBzaG91bGQgYmUKK2xpc3RlZCwgb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHdoYXQgeW91IGhhdmUgZG9uZSBuZWVkcyBtb3JlIGRldGFpbCwgb3IgaXMKK2luY29ycmVjdCwgX3BsZWFzZV8gbGV0IG1lIGtub3cuCisKKyAtRXJpaworCistLS0tLS0tLS0tLQorCitQZXRlciBXaWxsaXMgPHBzeXBocmVha0BwaHJlYWtlci5uZXQ+CisgICAgZWplY3QKKworRW1hbnVlbGUgQWluYSA8ZW1hbnVlbGUuYWluYUB0aXNjYWxpLml0PgorICAgIHJ1bi1wYXJ0cworCitFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgICAgVG9ucyBvZiBuZXcgc3R1ZmYsIG1ham9yIHJld3JpdGUgb2YgbW9zdCBvZiB0aGUKKyAgICBjb3JlIGFwcHMsIHRvbnMgb2YgbmV3IGFwcHMgYXMgbm90ZWQgaW4gaGVhZGVyIGZpbGVzLgorICAgIExvdHMgb2YgdGVkaW91cyBlZmZvcnQgd3JpdGluZyB0aGVzZSBib3JpbmcgZG9jcyB0aGF0CisgICAgbm9ib2R5IGlzIGdvaW5nIHRvIGFjdHVhbGx5IHJlYWQuCisKK0xhdXJlbmNlIEFuZGVyc29uIDxsLmQuYW5kZXJzb25Ad2Fyd2ljay5hYy51az4KKyAgICBycG0yY3BpbywgdW56aXAsIGdldF9oZWFkZXJfY3BpbywgcmVhZF9neiBpbnRlcmZhY2UsIHJwbQorCitKZWZmIEFuZ2llbHNraSA8amVmZkB0aGVwdHJncm91cC5jb20+CisgICAgZnRwcHV0LCBmdHBnZXQKKworRW5yaWsgQmVya2hhbiA8RW5yaWsuQmVya2hhbkBpbmthLmRlPgorICAgIHNldGNvbnNvbGUKKworSmltIEJhdWVyIDxqZmJhdWVyQG5mci5jb20+CisgICAgbW9kcHJvYmUgc2hlbGwgZGVwZW5kZW5jeQorCitFZHdhcmQgQmV0dHMgPGVkd2FyZEBkZWJpYW4ub3JnPgorICAgIGV4cHIsIGhvc3RpZCwgbG9nbmFtZSwgd2hvYW1pCisKK0pvaG4gQmVwcHUgPGJlcHB1QGNvZGVwb2V0Lm9yZz4KKyAgICBkdSwgbnNsb29rdXAsIHNvcnQKKworRGF2aWQgQnJvd25lbGwgPGRicm93bmVsbEB1c2Vycy5zb3VyY2Vmb3JnZS5uZXQ+CisgICAgemNpcAorCitCcmlhbiBDYW5kbGVyIDxCLkNhbmRsZXJAcG9ib3guY29tPgorICAgIHRpbnktbHMobHMpCisKK1JhbmRvbHBoIENodW5nIDx0YXVzcUBkZWJpYW4ub3JnPgorICAgIGZic2V0LCBwaW5nLCBob3N0bmFtZQorCitEYXZlIENpbmVnZSA8ZGNpbmVnZUBwc3ljaG9zaXMuY29tPgorICAgIG1vcmUodjIpLCBtYWtlZGV2cywgZHV0bXAsIG1vZHVsYXJpemF0aW9uLCBhdXRvIGxpbmtzIGZpbGUsCisgICAgdmFyaW91cyBmaXhlcywgTGludXggUm91dGVyIFByb2plY3QgbWFpbnRlbmFuY2UKKworSm9yZGFuIENyb3VzZSA8am9yZGFuQGNvc21pY3Blbmd1aW4ubmV0PgorICAgIGlwY2FsYworCitNYWdudXMgRGFtbSA8ZGFtbUBvcGVuc291cmNlLnNlPgorICAgIHRmdHAgY2xpZW50CisgICAgaW5zbW9kIHBvd2VycGMgc3VwcG9ydAorCitMYXJyeSBEb29saXR0bGUgPGxkb29saXR0QHJlY3ljbGUubGJsLmdvdj4KKyAgICBwcmlzdGluZSBzb3VyY2UgZGlyZWN0b3J5IGNvbXBpbGF0aW9uLCBsb3RzIG9mIHBhdGNoZXMgYW5kIGZpeGVzLgorCitHbGVubiBFbmdlbCA8Z2xlbm5lQGVuZ2VsLm9yZz4KKyAgICBodHRwZAorCitHZW5uYWR5IEZlbGRtYW4gPGdmZWxkbWFuQGdlbmEwMS5jb20+CisgICAgU3lza2xvZ2QgKHNpbmdsZSB0aHJlYWRlZCBzeXNsb2dkLCBJUEMgQ2lyY3VsYXIgYnVmZmVyIHN1cHBvcnQsCisgICAgbG9ncmVhZCksIHZhcmlvdXMgZml4ZXMuCisKK1JvYmVydCBHcmllYmwgPHNhbmRtYW5AaGFuZGhlbGRzLm9yZz4KKyAgICBtb2Rwcm9iZSwgaHdjbG9jaywgc3VpZC9zZ2lkIGhhbmRsaW5nLCB0aW55bG9naW4gaW50ZWdyYXRpb24KKyAgICBtYW55IGJ1Z2ZpeGVzIGFuZCBlbmhhbmNlbWVudHMKKworS2FybCBNLiBIZWdibG9vbSA8a2FybGhlZ0BkZWJpYW4ub3JnPgorICAgIGNwX212LmMsIHRoZSB0ZXN0IHN1aXRlLCB2YXJpb3VzIGZpeGVzIHRvIHV0aWxpdHkuYywgJmMuCisKK0RhbmllbCBKYWNvYm93aXR6IDxkYW5AZGViaWFuLm9yZz4KKyAgICBta3RlbXAuYworCitNYXR0IEtyYWFpIDxrcmFhaUBhbHVtbmkuY211LmVkdT4KKyAgICBkb2N1bWVudGF0aW9uLCBidWdmaXhlcywgdGVzdCBzdWl0ZQorCitSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICAgIEJlY2FtZSBidXN5Ym94IG1haW50YWluZXIgaW4gMjAwNi4KKworICAgIHNlZCAobWFqb3IgcmV3cml0ZSBpbiAyMDAzLCBhbmQgSSBub3cgbWFpbnRhaW4gdGhlIHRoaW5nKQorICAgIGJ1bnppcDIgKGNvbXBsZXRlIGZyb20tc2NyYXRjaCByZXdyaXRlLCB0aGVuIG1qbjMgb3B0aW1pemVkIHRoZSByZXN1bHQpCisgICAgc29ydCAobW9yZSBvciBsZXNzIGZyb20gc2NyYXRjaCByZXdyaXRlIGluIDIwMDQsIEkgbm93IG1haW50YWluIGl0KQorICAgIG1vdW50IChyZXdyaXRlIGluIDIwMDUsIEkgbWFpbnRhaW4gdGhlIG5ldyBvbmUpCisKK1N0ZXBoYW4gTGlueiA8bGluekBsaS1wcm8ubmV0PgorICAgIGlwY2FsYywgUmVkIEhhdCBlcXVpdmFsZW5jZQorCitKb2huIExvbWJhcmRvIDxqb2huQGRlbHRhbmV0LmNvbT4KKyAgICB0cgorCitHbGVubiBNY0dyYXRoIDxnbGVubi5sLm1jZ3JhdGhAZ21haWwuY29tPgorICAgIENvbW1vbiB1bmFyY2hpdmluZyBjb2RlIGFuZCB1bmFyY2hpdmluZyBhcHBsZXRzLCBpZnVwZG93biwgZnRwZ2V0cHV0LAorICAgIG5hbWVpZiwgc2VkLCBwYXRjaCwgZm9sZCwgaW5zdGFsbCwgdXVkZWNvZGUuCisgICAgVmFyaW91cyBidWdmaXhlcywgcmV2aWV3IGFuZCBhcHBseSBudW1lcm91cyBwYXRjaGVzLgorCitNYW51ZWwgTm92b2EgSUlJIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAgICBjYXQsIGhlYWQsIG1rZmlmbywgbWtub2QsIHJtZGlyLCBzbGVlcCwgdGVlLCB0dHksIHVuaXEsIHVzbGVlcCwgd2MsIHllcywKKyAgICBtZXNnLCB2Y29uZmlnLCBuaWNlLCByZW5pY2UsCisgICAgbWFrZV9kaXJlY3RvcnksIHBhcnNlX21vZGUsIGRpcm5hbWUsIG1vZGVfc3RyaW5nLAorICAgIGdldF9sYXN0X3BhdGhfY29tcG9uZW50LCBzaW1wbGlmeV9wYXRoLCBhbmQgYSBudW1iZXIgdHJpdmlhbCBsaWJiYiByb3V0aW5lcworCisgICAgYWxzbyBidWcgZml4ZXMsIHBhcnRpYWwgcmV3cml0ZXMsIGFuZCBzaXplIG9wdGltaXphdGlvbnMgaW4KKyAgICBhc2gsIGJhc2VuYW1lLCBjYWwsIGNtcCwgY3AsIGRmLCBkdSwgZWNobywgZW52LCBsbiwgbG9nbmFtZSwgbWQ1c3VtLCBta2RpciwKKyAgICBtdiwgcmVhbHBhdGgsIHJtLCBzb3J0LCB0YWlsLCB0b3VjaCwgdW5hbWUsIHdhdGNoLCBhcml0aCwgaHVtYW5fcmVhZGFibGUsCisgICAgaW50ZXJmYWNlLCBkdXRtcCwgaWZjb25maWcsIHJvdXRlCisKK1ZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4KKyAgICBjbWRlZGl0OyBiYl9ta2RlcCwgeGFyZ3MoY3VycmVudCksIGh0dHBkKGN1cnJlbnQpOworICAgIHBvcnRzOiBhc2gsIGNyb25kLCBmZGlzayAoaW5pdGlhbCwgdW5tYWludGFpbmVkIG5vdyksIGluZXRkLCBzdHR5LCB0cmFjZXJvdXRlLAorICAgIHRvcDsKKyAgICBsb2NhbGUsIHZhcmlvdXMgZml4ZXMKKyAgICBhbmQgaXJyZWNvbmNpbGFibGUgY3JpdGljIG9mIGV2ZXJ5dGhpbmcgbm90IHBlcmZlY3QuCisKK0JydWNlIFBlcmVucyA8YnJ1Y2VAcGl4YXIuY29tPgorICAgIE9yaWdpbmFsIGF1dGhvciBvZiBCdXN5Qm94IGluIDE5OTUsIDE5OTYuIFNvbWUgb2YgaGlzIGNvZGUgY2FuCisgICAgc3RpbGwgYmUgZm91bmQgaGlkaW5nIGhlcmUgYW5kIHRoZXJlLi4uCisKK1JvZG5leSBSYWRmb3JkIDxycmFkZm9yZEBtaW5kc3ByaW5nLmNvbT4KKyAgICBpcGNzLCBpcGNybQorCitUaW0gUmlrZXIgPFRpbUBSaWtlcnMub3JnPgorICAgIGJ1ZyBmaXhlcywgbWVtYmVyIG9mIGZhbiBjbHViCisKK0tlbnQgUm9ib3R0aSA8cm9ib3R0aUBtZXRjb25uZWN0LmNvbT4KKyAgICByZXNldCwgdG9ucyBhbmQgdG9ucyBvZiBidWcgcmVwb3J0cyBhbmQgcGF0Y2hlcy4KKworQ2hpcCBSb3NlbnRoYWwgPGNoaXBAdW5pY29tLmNvbT4sIDxjcm9zZW50aEBjb3ZhZC5jb20+CisgICAgd2dldCAtIENvbnRyaWJ1dGVkIGJ5IHBlcm1pc3Npb24gb2YgQ292YWQgQ29tbXVuaWNhdGlvbnMKKworUGF2ZWwgUm9za2luIDxwcm9za2lAZ251Lm9yZz4KKyAgICBMb3RzIG9mIGJ1Z3MgZml4ZXMgYW5kIHBhdGNoZXMuCisKK0d5ZXBpIFNhbSA8Z3llcGlAcHJheGlzLXN3LmNvbT4KKyAgICBSZW1vdGUgbG9nZ2luZyBmZWF0dXJlIGZvciBzeXNsb2dkCisKK1JvYiBTdWxsaXZhbiA8Y29naXRvLmVyZ28uY29naXRvQGdtYWlsLmNvbT4KKyAgICBjb21tCisKK0xpbnVzIFRvcnZhbGRzCisgICAgbWtzd2FwLCBmc2NrLm1pbml4LCBta2ZzLm1pbml4CisKK01hcmsgV2hpdGxleSA8bWFya3dAY29kZXBvZXQub3JnPgorICAgIGdyZXAsIHNlZCwgY3V0LCB4YXJncyhwcmV2aW91cyksCisgICAgc3R5bGUtZ3VpZGUsIG5ldy1hcHBsZXQtSE9XVE8sIGJ1ZyBmaXhlcywgZXRjLgorCitDaGFybGVzIFAuIFdyaWdodCA8Y3B3cmlnaHRAdmlsbGFnZW5ldC5jb20+CisgICAgZ3ppcCwgbWluaS1uZXRjYXQobmMpCisKK0VucmlxdWUgWmFuYXJkaSA8ZXphbmFyZGlAdWxsLmVzPgorICAgIHRhcmNhdCAoc2luY2UgcmVtb3ZlZCksIGxvYWRrbWFwLCB2YXJpb3VzIGZpeGVzLCBEZWJpYW4gbWFpbnRlbmFuY2UKKworVGl0byBSYWd1c2EgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICAgIGRldmZzZCBhbmQgc2l6ZSBvcHRpbWl6YXRpb25zIGluIHN0cmluZ3MsIG9wZW52dCwgY2h2dCwgZGVhbGxvY3Z0LCBoZHBhcm0sCisgICAgZmRmb3JtYXQsIGxzYXR0ciwgY2hhdHRyLCBpZCBhbmQgZWplY3QuCisKK1BhdWwgRm94IDxwZ2ZAZm94aGFycC5ib3N0b24ubWEudXM+CisgICAgdmkgZWRpdGluZyBtb2RlIGZvciBhc2gsIHZhcmlvdXMgb3RoZXIgcGF0Y2hlcy9maXhlcworCitSb2JlcnRvIEEuIEZvZ2xpZXR0YSA8bWVAcm9iZXJ0by5mb2dsaWV0dGEubmFtZT4KKyAgICBwb3J0OiBkbnNkCisKK0Jlcm5oYXJkIFJldXRuZXItRmlzY2hlciA8cmVwLmRvdC5ub3BAZ21haWwuY29tPgorICAgIG1pc2MKKworTWlrZSBGcnlzaW5nZXIgPHZhcGllckBnZW50b28ub3JnPgorICAgIGluaXRpYWwgZTJmc3Byb2dzLCBwcmludGVudiwgc2V0YXJjaCwgc3VtLCBtaXNjCisKK0ppZSBaaGFuZyA8amllLnpoYW5nQGFuYWxvZy5jb20+CisgICAgZml4ZWQgdHdvIGJ1Z3MgaW4gbXNoIGFuZCBodXNoIChleGl0Y29kZSBvZiBraWxsZWQgcHJvY2Vzc2VzKQpkaWZmIC0tZ2l0IGEvQ29uZmlnLmluIGIvQ29uZmlnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YjRiZjMKLS0tIC9kZXYvbnVsbAorKysgYi9Db25maWcuaW4KQEAgLTAsMCArMSw4NDQgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21haW5tZW51ICJCdXN5Qm94IENvbmZpZ3VyYXRpb24iCisKK2NvbmZpZyBIQVZFX0RPVF9DT05GSUcKKwlib29sCisJZGVmYXVsdCB5CisKK21lbnUgIkJ1c3lib3ggU2V0dGluZ3MiCisKK21lbnUgIkdlbmVyYWwgQ29uZmlndXJhdGlvbiIKKworY29uZmlnIERFU0tUT1AKKwlib29sICJFbmFibGUgb3B0aW9ucyBmb3IgZnVsbC1ibG93biBkZXNrdG9wIHN5c3RlbXMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgRW5hYmxlIG9wdGlvbnMgYW5kIGZlYXR1cmVzIHdoaWNoIGFyZSBub3QgZXNzZW50aWFsLgorCSAgU2VsZWN0IHRoaXMgb25seSBpZiB5b3UgcGxhbiB0byB1c2UgYnVzeWJveCBvbiBmdWxsLWJsb3duCisJICBkZXNrdG9wIG1hY2hpbmUgd2l0aCBjb21tb24gTGludXggZGlzdHJvLCBub3Qgb24gYW4gZW1iZWRkZWQgYm94LgorCitjb25maWcgRVhUUkFfQ09NUEFUCisJYm9vbCAiUHJvdmlkZSBjb21wYXRpYmxlIGJlaGF2aW9yIGZvciByYXJlIGNvcm5lciBjYXNlcyAoYmlnZ2VyIGNvZGUpIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIG1ha2VzIGdyZXAsIHNlZCBldGMgaGFuZGxlIHJhcmUgY29ybmVyIGNhc2VzCisJICAoZW1iZWRkZWQgTlVMIGJ5dGVzIGFuZCBzdWNoKS4gVGhpcyBtYWtlcyBjb2RlIGJpZ2dlciBhbmQgdXNlcworCSAgc29tZSBHTlUgZXh0ZW5zaW9ucyBpbiBsaWJjLiBZb3UgcHJvYmFibHkgb25seSBuZWVkIHRoaXMgb3B0aW9uCisJICBpZiB5b3UgcGxhbiB0byBydW4gYnVzeWJveCBvbiBkZXNrdG9wLgorCitjb25maWcgSU5DTFVERV9TVVN2MgorCWJvb2wgIkVuYWJsZSBvYnNvbGV0ZSBmZWF0dXJlcyByZW1vdmVkIGJlZm9yZSBTVVN2MyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIG9wdGlvbiB3aWxsIGVuYWJsZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIFN1U3YyLAorCSAgc3BlY2lmaWNhbGx5LCBvbGQtc3R5bGUgbnVtZXJpYyBvcHRpb25zICgnY29tbWFuZCAtMSA8ZmlsZT4nKQorCSAgd2lsbCBiZSBzdXBwb3J0ZWQgaW4gaGVhZCwgdGFpbCwgYW5kIGZvbGQuIChOb3RlOiBzaG91bGQKKwkgIGFmZmVjdCByZW5pY2UgdG9vLikKKworY29uZmlnIFVTRV9QT1JUQUJMRV9DT0RFCisJYm9vbCAiQXZvaWQgdXNpbmcgR0NDLXNwZWNpZmljIGNvZGUgY29uc3RydWN0cyIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBVc2UgdGhpcyBvcHRpb24gaWYgeW91IGFyZSB0cnlpbmcgdG8gY29tcGlsZSBidXN5Ym94IHdpdGgKKwkgIGNvbXBpbGVyIG90aGVyIHRoYW4gZ2NjLgorCSAgSWYgeW91IGRvIHVzZSBnY2MsIHRoaXMgb3B0aW9uIG1heSBuZWVkbGVzc2x5IGluY3JlYXNlIGNvZGUgc2l6ZS4KKworY29uZmlnIFBMQVRGT1JNX0xJTlVYCisJYm9vbCAiRW5hYmxlIExpbnV4LXNwZWNpZmljIGFwcGxldHMgYW5kIGZlYXR1cmVzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEZvciB0aGUgbW9zdCBwYXJ0LCBidXN5Ym94IHJlcXVpcmVzIG9ubHkgUE9TSVggY29tcGF0aWJpbGl0eQorCSAgZnJvbSB0aGUgdGFyZ2V0IHN5c3RlbSwgYnV0IHNvbWUgYXBwbGV0cyBhbmQgZmVhdHVyZXMgdXNlCisJICBMaW51eC1zcGVjaWZpYyBpbnRlcmZhY2VzLgorCisJICBBbnN3ZXJpbmcgJ04nIGhlcmUgd2lsbCBkaXNhYmxlIHN1Y2ggYXBwbGV0cyBhbmQgaGlkZSB0aGUKKwkgIGNvcnJlc3BvbmRpbmcgY29uZmlndXJhdGlvbiBvcHRpb25zLgorCitjaG9pY2UKKwlwcm9tcHQgIkJ1ZmZlciBhbGxvY2F0aW9uIHBvbGljeSIKKwlkZWZhdWx0IEZFQVRVUkVfQlVGRkVSU19VU0VfTUFMTE9DCisJaGVscAorCSAgVGhlcmUgYXJlIDMgd2F5cyBCdXN5Qm94IGNhbiBoYW5kbGUgYnVmZmVyIGFsbG9jYXRpb25zOgorCSAgLSBVc2UgbWFsbG9jLiBUaGlzIGNvc3RzIGNvZGUgc2l6ZSBmb3IgdGhlIGNhbGwgdG8geG1hbGxvYy4KKwkgIC0gUHV0IHRoZW0gb24gc3RhY2suIEZvciBzb21lIHZlcnkgc21hbGwgbWFjaGluZXMgd2l0aCBsaW1pdGVkIHN0YWNrCisJICAgIHNwYWNlLCB0aGlzIGNhbiBiZSBkZWFkbHkuIEZvciBtb3N0IGZvbGtzLCB0aGlzIHdvcmtzIGp1c3QgZmluZS4KKwkgIC0gUHV0IHRoZW0gaW4gQlNTLiBUaGlzIHdvcmtzIGJlYXV0aWZ1bGx5IGZvciBjb21wdXRlcnMgd2l0aCBhIHJlYWwKKwkgICAgTU1VIChhbmQgT1Mgc3VwcG9ydCksIGJ1dCB3YXN0ZXMgcnVudGltZSBSQU0gZm9yIHVDTGludXguIFRoaXMKKwkgICAgYmVoYXZpb3Igd2FzIHRoZSBvbmx5IG9uZSBhdmFpbGFibGUgZm9yIEJ1c3lCb3ggdmVyc2lvbnMgMC40OCBhbmQKKwkgICAgZWFybGllci4KKworY29uZmlnIEZFQVRVUkVfQlVGRkVSU19VU0VfTUFMTE9DCisJYm9vbCAiQWxsb2NhdGUgd2l0aCBNYWxsb2MiCisKK2NvbmZpZyBGRUFUVVJFX0JVRkZFUlNfR09fT05fU1RBQ0sKKwlib29sICJBbGxvY2F0ZSBvbiB0aGUgU3RhY2siCisKK2NvbmZpZyBGRUFUVVJFX0JVRkZFUlNfR09fSU5fQlNTCisJYm9vbCAiQWxsb2NhdGUgaW4gdGhlIC5ic3Mgc2VjdGlvbiIKKworZW5kY2hvaWNlCisKK2NvbmZpZyBTSE9XX1VTQUdFCisJYm9vbCAiU2hvdyBhcHBsZXQgdXNhZ2UgbWVzc2FnZXMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgRW5hYmxpbmcgdGhpcyBvcHRpb24sIEJ1c3lCb3ggYXBwbGV0cyB3aWxsIHNob3cgdGVyc2UgaGVscCBtZXNzYWdlcworCSAgd2hlbiBpbnZva2VkIHdpdGggd3JvbmcgYXJndW1lbnRzLgorCSAgSWYgeW91IGRvIG5vdCB3YW50IHRvIHNob3cgYW55IChoZWxwZnVsKSB1c2FnZSBtZXNzYWdlIHdoZW4KKwkgIGlzc3Vpbmcgd3JvbmcgY29tbWFuZCBzeW50YXgsIHlvdSBjYW4gc2F5ICdOJyBoZXJlLAorCSAgc2F2aW5nIGFwcHJveGltYXRlbHkgN2suCisKK2NvbmZpZyBGRUFUVVJFX1ZFUkJPU0VfVVNBR0UKKwlib29sICJTaG93IHZlcmJvc2UgYXBwbGV0IHVzYWdlIG1lc3NhZ2VzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU0hPV19VU0FHRQorCWhlbHAKKwkgIEFsbCBCdXN5Qm94IGFwcGxldHMgd2lsbCBzaG93IHZlcmJvc2UgaGVscCBtZXNzYWdlcyB3aGVuCisJICBidXN5Ym94IGlzIGludm9rZWQgd2l0aCAtLWhlbHAuIFRoaXMgd2lsbCBhZGQgYSBsb3Qgb2YgdGV4dCB0byB0aGUKKwkgIGJ1c3lib3ggYmluYXJ5LiBJbiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLCB0aGlzIHdpbGwgYWRkIGFib3V0CisJICAxM2ssIGJ1dCBpdCBjYW4gYWRkIG11Y2ggbW9yZSBkZXBlbmRpbmcgb24geW91ciBjb25maWd1cmF0aW9uLgorCitjb25maWcgRkVBVFVSRV9DT01QUkVTU19VU0FHRQorCWJvb2wgIlN0b3JlIGFwcGxldCB1c2FnZSBtZXNzYWdlcyBpbiBjb21wcmVzc2VkIGZvcm0iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBTSE9XX1VTQUdFCisJaGVscAorCSAgU3RvcmUgdXNhZ2UgbWVzc2FnZXMgaW4gLmJ6IGNvbXByZXNzZWQgZm9ybSwgdW5jb21wcmVzcyB0aGVtCisJICBvbi10aGUtZmx5IHdoZW4gPGFwcGxldD4gLS1oZWxwIGlzIGNhbGxlZC4KKworCSAgSWYgeW91IGhhdmUgYSByZWFsbHkgdGlueSBidXN5Ym94IHdpdGggZmV3IGFwcGxldHMgZW5hYmxlZCAoYW5kCisJICBidW56aXAyIGlzbid0IG9uZSBvZiB0aGVtKSwgdGhlIG92ZXJoZWFkIG9mIHRoZSBkZWNvbXByZXNzb3IgbWlnaHQKKwkgIGJlIG5vdGljZWFibGUuIEFsc28sIGlmIHlvdSBydW4gZXhlY3V0YWJsZXMgZGlyZWN0bHkgZnJvbSBST00KKwkgIGFuZCBoYXZlIHZlcnkgbGl0dGxlIG1lbW9yeSwgdGhpcyBtaWdodCBub3QgYmUgYSB3aW4uIE90aGVyd2lzZSwKKwkgIHlvdSBwcm9iYWJseSB3YW50IHRoaXMuCisKK2NvbmZpZyBGRUFUVVJFX0lOU1RBTExFUgorCWJvb2wgIlN1cHBvcnQgLS1pbnN0YWxsIFstc10gdG8gaW5zdGFsbCBhcHBsZXQgbGlua3MgYXQgcnVudGltZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBFbmFibGUgJ2J1c3lib3ggLS1pbnN0YWxsIFstc10nIHN1cHBvcnQuIFRoaXMgd2lsbCBhbGxvdyB5b3UgdG8gdXNlCisJICBidXN5Ym94IGF0IHJ1bnRpbWUgdG8gY3JlYXRlIGhhcmQgbGlua3Mgb3Igc3ltbGlua3MgZm9yIGFsbCB0aGUKKwkgIGFwcGxldHMgdGhhdCBhcmUgY29tcGlsZWQgaW50byBidXN5Ym94LgorCitjb25maWcgSU5TVEFMTF9OT19VU1IKKwlib29sICJEb24ndCB1c2UgL3VzciIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBEaXNhYmxlIHVzZSBvZiAvdXNyLiBidXN5Ym94IC0taW5zdGFsbCBhbmQgIm1ha2UgaW5zdGFsbCIKKwkgIHdpbGwgaW5zdGFsbCBhcHBsZXRzIG9ubHkgdG8gL2JpbiBhbmQgL3NiaW4sCisJICBuZXZlciB0byAvdXNyL2JpbiBvciAvdXNyL3NiaW4uCisKK2NvbmZpZyBMT0NBTEVfU1VQUE9SVAorCWJvb2wgIkVuYWJsZSBsb2NhbGUgc3VwcG9ydCAoc3lzdGVtIG5lZWRzIGxvY2FsZSBmb3IgdGhpcyB0byB3b3JrKSIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBFbmFibGUgdGhpcyBpZiB5b3VyIHN5c3RlbSBoYXMgbG9jYWxlIHN1cHBvcnQgYW5kIHlvdSB3b3VsZCBsaWtlCisJICBidXN5Ym94IHRvIHN1cHBvcnQgbG9jYWxlIHNldHRpbmdzLgorCitjb25maWcgVU5JQ09ERV9TVVBQT1JUCisJYm9vbCAiU3VwcG9ydCBVbmljb2RlIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgbWFrZXMgdmFyaW91cyBhcHBsZXRzIGF3YXJlIHRoYXQgb25lIGJ5dGUgaXMgbm90CisJICBvbmUgY2hhcmFjdGVyIG9uIHNjcmVlbi4KKworCSAgQnVzeWJveCBhaW1zIHRvIGV2ZW50dWFsbHkgd29yayBjb3JyZWN0bHkgd2l0aCBVbmljb2RlIGRpc3BsYXlzLgorCSAgQW55IG9sZGVyIGVuY29kaW5ncyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gd29yay4KKwkgIFByb2JhYmx5IGJ5IHRoZSB0aW1lIHdoZW4gYnVzeWJveCB3aWxsIGJlIGZ1bGx5IFVuaWNvZGUtY2xlYW4sCisJICBvdGhlciBlbmNvZGluZ3Mgd2lsbCBiZSBtYWlubHkgb2YgaGlzdG9yaWMgaW50ZXJlc3QuCisKK2NvbmZpZyBVTklDT0RFX1VTSU5HX0xPQ0FMRQorCWJvb2wgIlVzZSBsaWJjIHJvdXRpbmVzIGZvciBVbmljb2RlIChlbHNlIHVzZXMgaW50ZXJuYWwgb25lcykiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBVTklDT0RFX1NVUFBPUlQgJiYgTE9DQUxFX1NVUFBPUlQKKwloZWxwCisJICBXaXRoIHRoaXMgb3B0aW9uIG9uLCBVbmljb2RlIHN1cHBvcnQgaXMgaW1wbGVtZW50ZWQgdXNpbmcgbGliYworCSAgcm91dGluZXMuIE90aGVyd2lzZSwgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gaXMgdXNlZC4KKwkgIEludGVybmFsIGltcGxlbWVudGF0aW9uIGlzIHNtYWxsZXIuCisKK2NvbmZpZyBGRUFUVVJFX0NIRUNLX1VOSUNPREVfSU5fRU5WCisJYm9vbCAiQ2hlY2sgJExDX0FMTCwgJExDX0NUWVBFIGFuZCAkTEFORyBlbnZpcm9ubWVudCB2YXJpYWJsZXMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBVTklDT0RFX1NVUFBPUlQgJiYgIVVOSUNPREVfVVNJTkdfTE9DQUxFCisJaGVscAorCSAgV2l0aCB0aGlzIG9wdGlvbiBvbiwgVW5pY29kZSBzdXBwb3J0IGlzIGFjdGl2YXRlZAorCSAgb25seSBpZiBsb2NhbGUtcmVsYXRlZCB2YXJpYWJsZXMgaGF2ZSB0aGUgdmFsdWUgb2YgdGhlIGZvcm0KKwkgICJ4eHh4LnV0ZjgiCisKKwkgIE90aGVyd2lzZSwgVW5pY29kZSBzdXBwb3J0IHdpbGwgYmUgYWx3YXlzIGVuYWJsZWQgYW5kIGFjdGl2ZS4KKworY29uZmlnIFNVQlNUX1dDSEFSCisJaW50ICJDaGFyYWN0ZXIgY29kZSB0byBzdWJzdGl0dXRlIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMgd2l0aCIKKwlkZXBlbmRzIG9uIFVOSUNPREVfU1VQUE9SVAorCWRlZmF1bHQgNjMKKwloZWxwCisJICBUeXBpY2FsIHZhbHVlcyBhcmUgNjMgZm9yICc/JyAod29ya3Mgd2l0aCBhbnkgb3V0cHV0IGRldmljZSksCisJICAzMCBmb3IgQVNDSUkgc3Vic3RpdHV0ZSBjb250cm9sIGNvZGUsCisJICA2NTUzMyAoMHhmZmZkKSBmb3IgVW5pY29kZSByZXBsYWNlbWVudCBjaGFyYWN0ZXIuCisKK2NvbmZpZyBMQVNUX1NVUFBPUlRFRF9XQ0hBUgorCWludCAiUmFuZ2Ugb2Ygc3VwcG9ydGVkIFVuaWNvZGUgY2hhcmFjdGVycyIKKwlkZXBlbmRzIG9uIFVOSUNPREVfU1VQUE9SVAorCWRlZmF1bHQgNzY3CisJaGVscAorCSAgQW55IGNoYXJhY3RlciB3aXRoIFVuaWNvZGUgdmFsdWUgYmlnZ2VyIHRoYW4gdGhpcyBpcyBhc3N1bWVkCisJICB0byBiZSBub24tcHJpbnRhYmxlIG9uIG91dHB1dCBkZXZpY2UuIE1hbnkgYXBwbGV0cyByZXBsYWNlCisJICBzdWNoIGNoYXJzIHdpdGggc3Vic3RpdHV0aW9uIGNoYXJhY3Rlci4KKworCSAgVGhlIGlkZWEgaXMgdGhhdCBtYW55IHZhbGlkIHByaW50YWJsZSBVbmljb2RlIGNoYXJzIGFyZQorCSAgbmV2ZXJ0aGVsZXNzIGFyZSBub3QgZGlzcGxheWVkIGNvcnJlY3RseS4gVGhpbmsgYWJvdXQKKwkgIGNvbWJpbmluZyBjaGFyYWNoZXJzLCBkb3VibGUtd2lkZSBoaWVyb2dseXBocywgb2JzY3VyZQorCSAgY2hhcmFjdGVycyBpbiBkb3plbnMgb2YgYW5jaWVudCBzY3JpcHRzLi4uCisJICBNYW55IHRlcm1pbmFscywgdGVybWluYWwgZW11bGF0b3JzLCB4dGVybXMgZXRjIHdpbGwgZmFpbAorCSAgdG8gaGFuZGxlIHRoZW0gY29ycmVjdGx5LiBDaG9vc2UgdGhlIHNtYWxsZXN0IHZhbHVlCisJICB3aGljaCBzdWl0cyB5b3VyIG5lZWRzLgorCisJICBUeXBpY2FsIHZhbHVlcyBhcmU6CisJICAxMjYgLSBBU0NJSSBvbmx5CisJICA3NjcgKDB4MmZmKSAtIHRoZXJlIGFyZSBubyBjb21iaW5pbmcgY2hhcnMgaW4gWzAuLjc2N10gcmFuZ2UKKwkJCSh0aGUgcmFuZ2UgaW5jbHVkZXMgTGF0aW4gMSwgTGF0aW4gRXh0LiBBIGFuZCBCKSwKKwkJCWNvZGUgaXMgfjcwMCBieXRlcyBzbWFsbGVyIGZvciB0aGlzIGNhc2UuCisJICA0MzUxICgweDEwZmYpIC0gdGhlcmUgYXJlIG5vIGRvdWJsZS13aWRlIGNoYXJzIGluIFswLi40MzUxXSByYW5nZSwKKwkJCWNvZGUgaXMgfjMwMCBieXRlcyBzbWFsbGVyIGZvciB0aGlzIGNhc2UuCisJICAxMjc5OSAoMHgzMWZmKSAtIG5lYXJseSBhbGwgbm9uLWlkZW9ncmFwaGljIGNoYXJhY3RlcnMgYXJlCisJCQlhdmFpbGFibGUgaW4gWzAuLjEyNzk5XSByYW5nZSwgaW5jbHVkaW5nCisJCQlFYXN0IEFzaWFuIHNjcmlwdHMgbGlrZSBrYXRha2FuYSwgaGlyYWdhbmEsIGhhbmd1bCwKKwkJCWJvcG9tb2ZvLi4uCisJICAwIC0gb2ZmLCBhbnkgdmFsaWQgcHJpbnRhYmxlIFVuaWNvZGUgY2hhcmFjdGVyIHdpbGwgYmUgcHJpbnRlZC4KKworY29uZmlnIFVOSUNPREVfQ09NQklOSU5HX1dDSEFSUworCWJvb2wgIkFsbG93IHplcm8td2lkdGggVW5pY29kZSBjaGFyYWN0ZXJzIG9uIG91dHB1dCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFVOSUNPREVfU1VQUE9SVAorCWhlbHAKKwkgIFdpdGggdGhpcyBvcHRpb24gb2ZmLCBhbnkgVW5pY29kZSBjaGFyIHdpdGggd2lkdGggb2YgMAorCSAgaXMgc3Vic3RpdHV0ZWQgb24gb3V0cHV0LgorCitjb25maWcgVU5JQ09ERV9XSURFX1dDSEFSUworCWJvb2wgIkFsbG93IHdpZGUgVW5pY29kZSBjaGFyYWN0ZXJzIG9uIG91dHB1dCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFVOSUNPREVfU1VQUE9SVAorCWhlbHAKKwkgIFdpdGggdGhpcyBvcHRpb24gb2ZmLCBhbnkgVW5pY29kZSBjaGFyIHdpdGggd2lkdGggPiAxCisJICBpcyBzdWJzdGl0dXRlZCBvbiBvdXRwdXQuCisKK2NvbmZpZyBVTklDT0RFX0JJRElfU1VQUE9SVAorCWJvb2wgIkJpZGlyZWN0aW9uYWwgY2hhcmFjdGVyLWF3YXJlIGxpbmUgaW5wdXQiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBVTklDT0RFX1NVUFBPUlQgJiYgIVVOSUNPREVfVVNJTkdfTE9DQUxFCisJaGVscAorCSAgV2l0aCB0aGlzIG9wdGlvbiBvbiwgcmlnaHQtdG8tbGVmdCBVbmljb2RlIGNoYXJhY3RlcnMKKwkgIGFyZSB0cmVhdGVkIGRpZmZlcmVudGx5IG9uIGlucHV0IChlLmcuIGN1cnNvciBtb3ZlbWVudCkuCisKK2NvbmZpZyBVTklDT0RFX05FVVRSQUxfVEFCTEUKKwlib29sICJJbiBiaWRpIGlucHV0LCBzdXBwb3J0IG5vbi1BU0NJSSBuZXV0cmFsIGNoYXJzIHRvbyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFVOSUNPREVfQklESV9TVVBQT1JUCisJaGVscAorCSAgSW4gbW9zdCBjYXNlcyBpdCdzIGVub3VnaCB0byB0cmVhdCBvbmx5IEFTQ0lJIG5vbi1sZXR0ZXJzCisJICAoaS5lLiBwdW5jdHVhdGlvbiwgbnVtYmVycyBhbmQgc3BhY2UpIGFzIGNoYXJhY3RlcnMKKwkgIHdpdGggbmV1dHJhbCBkaXJlY3Rpb25hbGl0eS4KKwkgIFdpdGggdGhpcyBvcHRpb24gb24sIG1vcmUgZXh0ZW5zaXZlIChhbmQgYmlnZ2VyKSB0YWJsZQorCSAgb2YgbmV1dHJhbCBjaGFycyB3aWxsIGJlIHVzZWQuCisKK2NvbmZpZyBVTklDT0RFX1BSRVNFUlZFX0JST0tFTgorCWJvb2wgIk1ha2UgaXQgcG9zc2libGUgdG8gZW50ZXIgc2VxdWVuY2VzIG9mIGNoYXJzIHdoaWNoIGFyZSBub3QgVW5pY29kZSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFVOSUNPREVfU1VQUE9SVAorCWhlbHAKKwkgIFdpdGggdGhpcyBvcHRpb24gb24sIG9uIGxpbmUtZWRpdGluZyBpbnB1dCAoc3VjaCBhcyB1c2VkIGJ5IHNoZWxscykKKwkgIGludmFsaWQgVVRGLTggYnl0ZXMgYXJlIG5vdCBzdWJzdGl0dXRlZCB3aXRoIHRoZSBzZWxlY3RlZAorCSAgc3Vic3RpdHV0aW9uIGNoYXJhY3Rlci4KKwkgIEZvciBleGFtcGxlLCB0aGlzIG1lYW5zIHRoYXQgZW50ZXJpbmcgJ2wnLCAncycsICcgJywgMHhmZiwgW0VudGVyXQorCSAgYXQgc2hlbGwgcHJvbXB0IHdpbGwgbGlzdCBmaWxlIG5hbWVkIDB4ZmYgKHNpbmdsZSBjaGFyIG5hbWUKKwkgIHdpdGggY2hhciB2YWx1ZSAyNTUpLCBub3QgZmlsZSBuYW1lZCAnPycuCisKK2NvbmZpZyBQQU0KKwlib29sICJTdXBwb3J0IGZvciBQQU0gKFBsdWdnYWJsZSBBdXRoZW50aWNhdGlvbiBNb2R1bGVzKSIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBVc2UgUEFNIGluIHNvbWUgYnVzeWJveCBhcHBsZXRzIChjdXJyZW50bHkgbG9naW4gYW5kIGh0dHBkKSBpbnN0ZWFkCisJICBvZiBkaXJlY3QgYWNjZXNzIHRvIHBhc3N3b3JkIGRhdGFiYXNlLgorCitjb25maWcgRkVBVFVSRV9VU0VfU0VOREZJTEUKKwlib29sICJVc2Ugc2VuZGZpbGUgc3lzdGVtIGNhbGwiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgV2hlbiBlbmFibGVkLCBidXN5Ym94IHdpbGwgdXNlIHRoZSBrZXJuZWwgc2VuZGZpbGUoKSBmdW5jdGlvbgorCSAgaW5zdGVhZCBvZiByZWFkL3dyaXRlIGxvb3BzIHRvIGNvcHkgZGF0YSBiZXR3ZWVuIGZpbGUgZGVzY3JpcHRvcnMKKwkgIChmb3IgZXhhbXBsZSwgY3AgY29tbWFuZCBkb2VzIHRoaXMgYSBsb3QpLgorCSAgSWYgc2VuZGZpbGUoKSBkb2Vzbid0IHdvcmssIGNvcHlpbmcgY29kZSBmYWxscyBiYWNrIHRvIHJlYWQvd3JpdGUKKwkgIGxvb3AuIHNlbmRmaWxlKCkgd2FzIG9yaWdpbmFsbHkgaW1wbGVtZW50ZWQgZm9yIGZhc3RlciBJL08KKwkgIGZyb20gZmlsZXMgdG8gc29ja2V0cywgYnV0IHNpbmNlIExpbnV4IDIuNi4zMyBpdCB3YXMgZXh0ZW5kZWQKKwkgIHRvIHdvcmsgZm9yIG1hbnkgbW9yZSBmaWxlIHR5cGVzLgorCitjb25maWcgTE9OR19PUFRTCisJYm9vbCAiU3VwcG9ydCBmb3IgLS1sb25nLW9wdGlvbnMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgRW5hYmxlIHRoaXMgaWYgeW91IHdhbnQgYnVzeWJveCBhcHBsZXRzIHRvIHVzZSB0aGUgZ251IC0tbG9uZy1vcHRpb24KKwkgIHN0eWxlLCBpbiBhZGRpdGlvbiB0byBzaW5nbGUgY2hhcmFjdGVyIC1hIC1iIC1jIHN0eWxlIG9wdGlvbnMuCisKK2NvbmZpZyBGRUFUVVJFX0RFVlBUUworCWJvb2wgIlVzZSB0aGUgZGV2cHRzIGZpbGVzeXN0ZW0gZm9yIFVuaXg5OCBQVFlzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEVuYWJsZSBpZiB5b3Ugd2FudCBCdXN5Qm94IHRvIHVzZSBVbml4OTggUFRZIHN1cHBvcnQuIElmIGVuYWJsZWQsCisJICBidXN5Ym94IHdpbGwgdXNlIC9kZXYvcHRteCBmb3IgdGhlIG1hc3RlciBzaWRlIG9mIHRoZSBwc2V1ZG90ZXJtaW5hbAorCSAgYW5kIC9kZXYvcHRzLzxudW1iZXI+IGZvciB0aGUgc2xhdmUgc2lkZS4gT3RoZXJ3aXNlLCBCU0Qgc3R5bGUKKwkgIC9kZXYvdHR5cDxudW1iZXI+IHdpbGwgYmUgdXNlZC4gVG8gdXNlIHRoaXMgb3B0aW9uLCB5b3Ugc2hvdWxkIGhhdmUKKwkgIGRldnB0cyBtb3VudGVkLgorCitjb25maWcgRkVBVFVSRV9DTEVBTl9VUAorCWJvb2wgIkNsZWFuIHVwIGFsbCBtZW1vcnkgYmVmb3JlIGV4aXRpbmcgKHVzdWFsbHkgbm90IG5lZWRlZCkiCisJZGVmYXVsdCBuCisJaGVscAorCSAgQXMgYSBzaXplIG9wdGltaXphdGlvbiwgYnVzeWJveCBub3JtYWxseSBleGl0cyB3aXRob3V0IGV4cGxpY2l0bHkKKwkgIGZyZWVpbmcgZHluYW1pY2FsbHkgYWxsb2NhdGVkIG1lbW9yeSBvciBjbG9zaW5nIGZpbGVzLiBUaGlzIHNhdmVzCisJICBzcGFjZSBzaW5jZSB0aGUgT1Mgd2lsbCBjbGVhbiB1cCBmb3IgdXMsIGJ1dCBpdCBjYW4gY29uZnVzZSBkZWJ1Z2dlcnMKKwkgIGxpa2UgdmFsZ3JpbmQsIHdoaWNoIHJlcG9ydCB0b25zIG9mIG1lbW9yeSBhbmQgcmVzb3VyY2UgbGVha3MuCisKKwkgIERvbid0IGVuYWJsZSB0aGlzIHVubGVzcyB5b3UgaGF2ZSBhIHJlYWxseSBnb29kIHJlYXNvbiB0byBjbGVhbgorCSAgdGhpbmdzIHVwIG1hbnVhbGx5LgorCitjb25maWcgRkVBVFVSRV9VVE1QCisJYm9vbCAiU3VwcG9ydCB1dG1wIGZpbGUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIGZpbGUgL3Zhci9ydW4vdXRtcCBpcyB1c2VkIHRvIHRyYWNrIHdobyBpcyBjdXJyZW50bHkgbG9nZ2VkIGluLgorCSAgV2l0aCB0aGlzIG9wdGlvbiBvbiwgY2VydGFpbiBhcHBsZXRzIChnZXR0eSwgbG9naW4sIHRlbG5ldGQgZXRjKQorCSAgd2lsbCBjcmVhdGUgYW5kIGRlbGV0ZSBlbnRyaWVzIHRoZXJlLgorCSAgIndobyIgYXBwbGV0IHJlcXVpcmVzIHRoaXMgb3B0aW9uLgorCitjb25maWcgRkVBVFVSRV9XVE1QCisJYm9vbCAiU3VwcG9ydCB3dG1wIGZpbGUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX1VUTVAKKwloZWxwCisJICBUaGUgZmlsZSAvdmFyL3J1bi93dG1wIGlzIHVzZWQgdG8gdHJhY2sgd2hlbiB1c2VycyBoYXZlIGxvZ2dlZCBpbnRvCisJICBhbmQgbG9nZ2VkIG91dCBvZiB0aGUgc3lzdGVtLgorCSAgV2l0aCB0aGlzIG9wdGlvbiBvbiwgY2VydGFpbiBhcHBsZXRzIChnZXR0eSwgbG9naW4sIHRlbG5ldGQgZXRjKQorCSAgd2lsbCBhcHBlbmQgbmV3IGVudHJpZXMgdGhlcmUuCisJICAibGFzdCIgYXBwbGV0IHJlcXVpcmVzIHRoaXMgb3B0aW9uLgorCitjb25maWcgRkVBVFVSRV9QSURGSUxFCisJYm9vbCAiU3VwcG9ydCB3cml0aW5nIHBpZGZpbGVzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIG1ha2VzIHNvbWUgYXBwbGV0cyAoZS5nLiBjcm9uZCwgc3lzbG9nZCwgaW5ldGQpIHdyaXRlCisJICBhIHBpZGZpbGUgYXQgdGhlIGNvbmZpZ3VyZWQgUElEX0ZJTEVfUEFUSC4gIEl0IGhhcyBubyBlZmZlY3QKKwkgIG9uIGFwcGxldHMgd2hpY2ggcmVxdWlyZSBwaWRmaWxlcyB0byBydW4uCisKK2NvbmZpZyBQSURfRklMRV9QQVRICisJc3RyaW5nICJQYXRoIHRvIGRpcmVjdG9yeSBmb3IgcGlkZmlsZSIKKwlkZWZhdWx0ICIvdmFyL3J1biIKKwlkZXBlbmRzIG9uIEZFQVRVUkVfUElERklMRQorCWhlbHAKKwkgIFRoaXMgaXMgdGhlIGRlZmF1bHQgcGF0aCB3aGVyZSBwaWRmaWxlcyBhcmUgY3JlYXRlZC4gIEFwcGxldHMgd2hpY2gKKwkgIGFsbG93IHlvdSB0byBzZXQgdGhlIHBpZGZpbGUgcGF0aCBvbiB0aGUgY29tbWFuZCBsaW5lIHdpbGwgb3ZlcnJpZGUKKwkgIHRoaXMgdmFsdWUuICBUaGUgb3B0aW9uIGhhcyBubyBlZmZlY3Qgb24gYXBwbGV0cyB0aGF0IHJlcXVpcmUgeW91IHRvCisJICBzcGVjaWZ5IGEgcGlkZmlsZSBwYXRoLgorCitjb25maWcgRkVBVFVSRV9TVUlECisJYm9vbCAiU3VwcG9ydCBmb3IgU1VJRC9TR0lEIGhhbmRsaW5nIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFdpdGggdGhpcyBvcHRpb24geW91IGNhbiBpbnN0YWxsIHRoZSBidXN5Ym94IGJpbmFyeSBiZWxvbmdpbmcKKwkgIHRvIHJvb3Qgd2l0aCB0aGUgc3VpZCBiaXQgc2V0LCBlbmFibGluZyBzb21lIGFwcGxldHMgdG8gcGVyZm9ybQorCSAgcm9vdC1sZXZlbCBvcGVyYXRpb25zIGV2ZW4gd2hlbiBydW4gYnkgb3JkaW5hcnkgdXNlcnMKKwkgIChmb3IgZXhhbXBsZSwgbW91bnRpbmcgb2YgdXNlciBtb3VudHMgaW4gZnN0YWIgbmVlZHMgdGhpcykuCisKKwkgIEJ1c3lib3ggd2lsbCBhdXRvbWF0aWNhbGx5IGRyb3AgcHJpdmlsZWdlcyBmb3IgYXBwbGV0cworCSAgdGhhdCBkb24ndCBuZWVkIHJvb3QgYWNjZXNzLgorCisJICBJZiB5b3UgYXJlIHJlYWxseSBwYXJhbm9pZCBhbmQgZG9uJ3Qgd2FudCB0byBkbyB0aGlzLCBidWlsZCB0d28KKwkgIGJ1c3lib3ggYmluYXJpZXMgd2l0aCBkaWZmZXJlbnQgYXBwbGV0cyBpbiB0aGVtIChhbmQgdGhlIGFwcHJvcHJpYXRlCisJICBzeW1saW5rcyBwb2ludGluZyB0byBlYWNoIGJpbmFyeSksIGFuZCBvbmx5IHNldCB0aGUgc3VpZCBiaXQgb24gdGhlCisJICBvbmUgdGhhdCBuZWVkcyBpdC4KKworCSAgVGhlIGFwcGxldHMgd2hpY2ggcmVxdWlyZSByb290IHJpZ2h0cyAobmVlZCBzdWlkIGJpdCBvcgorCSAgdG8gYmUgcnVuIGJ5IHJvb3QpIGFuZCB3aWxsIHJlZnVzZSB0byBleGVjdXRlIG90aGVyd2lzZToKKwkgIGNyb250YWIsIGxvZ2luLCBwYXNzd2QsIHN1LCB2bG9jaywgd2FsbC4KKworCSAgVGhlIGFwcGxldHMgd2hpY2ggd2lsbCB1c2Ugcm9vdCByaWdodHMgaWYgdGhleSBoYXZlIHRoZW0KKwkgICh2aWEgc3VpZCBiaXQsIG9yIGJlY2F1c2UgcnVuIGJ5IHJvb3QpLCBidXQgd291bGQgdHJ5IHRvIHdvcmsKKwkgIHdpdGhvdXQgcm9vdCByaWdodCBuZXZlcnRoZWxlc3M6CisJICBmaW5kZnMsIHBpbmdbNl0sIHRyYWNlcm91dGVbNl0sIG1vdW50LgorCisJICBOb3RlIHRoYXQgaWYgeW91IERPTlQgc2VsZWN0IHRoaXMgb3B0aW9uLCBidXQgRE8gbWFrZSBidXN5Ym94CisJICBzdWlkIHJvb3QsIEFMTCBhcHBsZXRzIHdpbGwgcnVuIHVuZGVyIHJvb3QsIHdoaWNoIGlzIGEgaHVnZQorCSAgc2VjdXJpdHkgaG9sZSAodGhpbmsgImNwIC9zb21lL2ZpbGUgL2V0Yy9wYXNzd2QiKS4KKworY29uZmlnIEZFQVRVUkVfU1VJRF9DT05GSUcKKwlib29sICJSdW50aW1lIFNVSUQvU0dJRCBjb25maWd1cmF0aW9uIHZpYSAvZXRjL2J1c3lib3guY29uZiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfU1VJRAorCWhlbHAKKwkgIEFsbG93IHRoZSBTVUlEIC8gU0dJRCBzdGF0ZSBvZiBhbiBhcHBsZXQgdG8gYmUgZGV0ZXJtaW5lZCBhdCBydW50aW1lCisJICBieSBjaGVja2luZyAvZXRjL2J1c3lib3guY29uZi4gKFRoaXMgaXMgc29ydCBvZiBhIHBvb3IgbWFuJ3Mgc3Vkby4pCisJICBUaGUgZm9ybWF0IG9mIHRoaXMgZmlsZSBpcyBhcyBmb2xsb3dzOgorCisJICBBUFBMRVQgPSBbU3N4LV1bU3N4LV1beC1dIFtVU0VSLkdST1VQXQorCisJICBzOiBVU0VSIG9yIEdST1VQIGlzIGFsbG93ZWQgdG8gZXhlY3V0ZSBBUFBMRVQuCisJICAgICBBUFBMRVQgd2lsbCBydW4gdW5kZXIgVVNFUiBvciBHUk9VUAorCSAgICAgKHJlYWdhcmRsZXNzIG9mIHdobydzIHJ1bm5pbmcgaXQpLgorCSAgUzogVVNFUiBvciBHUk9VUCBpcyBOT1QgYWxsb3dlZCB0byBleGVjdXRlIEFQUExFVC4KKwkgICAgIEFQUExFVCB3aWxsIHJ1biB1bmRlciBVU0VSIG9yIEdST1VQLgorCSAgICAgVGhpcyBvcHRpb24gaXMgbm90IHZlcnkgc2Vuc2ljYWwuCisJICB4OiBVU0VSL0dST1VQL290aGVycyBhcmUgYWxsb3dlZCB0byBleGVjdXRlIEFQUExFVC4KKwkgICAgIE5vIFVJRC9HSUQgY2hhbmdlIHdpbGwgYmUgZG9uZSB3aGVuIGl0IGlzIHJ1bi4KKwkgIC06IFVTRVIvR1JPVVAvb3RoZXJzIGFyZSBub3QgYWxsb3dlZCB0byBleGVjdXRlIEFQUExFVC4KKworCSAgQW4gZXhhbXBsZSBtaWdodCBoZWxwOgorCisJICBbU1VJRF0KKwkgIHN1ID0gc3N4IHJvb3QuMCAjIGFwcGxldCBzdSBjYW4gYmUgcnVuIGJ5IGFueW9uZSBhbmQgcnVucyB3aXRoCisJICAgICAgICAgICAgICAgICAgIyBldWlkPTAvZWdpZD0wCisJICBzdSA9IHNzeCAgICAgICAgIyBleGFjdGx5IHRoZSBzYW1lCisKKwkgIG1vdW50ID0gc3gtIHJvb3QuZGlzayAjIGFwcGxldCBtb3VudCBjYW4gYmUgcnVuIGJ5IHJvb3QgYW5kIG1lbWJlcnMKKwkgICAgICAgICAgICAgICAgICAgICAgICAjIG9mIGdyb3VwIGRpc2sgKGJ1dCBub3QgYW55b25lIGVsc2UpCisJICAgICAgICAgICAgICAgICAgICAgICAgIyBhbmQgcnVucyB3aXRoIGV1aWQ9MCAoZWdpZCBpcyBub3QgY2hhbmdlZCkKKworCSAgY3AgPSAtLS0gIyBkaXNhYmxlIGFwcGxldCBjcCBmb3IgZXZlcnlvbmUKKworCSAgVGhlIGZpbGUgaGFzIHRvIGJlIG93bmVkIGJ5IHVzZXIgcm9vdCwgZ3JvdXAgcm9vdCBhbmQgaGFzIHRvIGJlCisJICB3cml0ZWFibGUgb25seSBieSByb290OgorCSAgICAgICAgKGNob3duIDAuMCAvZXRjL2J1c3lib3guY29uZjsgY2htb2QgNjAwIC9ldGMvYnVzeWJveC5jb25mKQorCSAgVGhlIGJ1c3lib3ggZXhlY3V0YWJsZSBoYXMgdG8gYmUgb3duZWQgYnkgdXNlciByb290LCBncm91cAorCSAgcm9vdCBhbmQgaGFzIHRvIGJlIHNldHVpZCByb290IGZvciB0aGlzIHRvIHdvcms6CisJICAgICAgICAoY2hvd24gMC4wIC9iaW4vYnVzeWJveDsgY2htb2QgNDc1NSAvYmluL2J1c3lib3gpCisKKwkgIFJvYmVydCAnc2FuZG1hbicgR3JpZWJsIGhhcyBtb3JlIGluZm9ybWF0aW9uIGhlcmU6CisJICA8dXJsOiBodHRwOi8vd3d3LnNvZnRmb3JnZS5kZS9iYi9zdWlkLmh0bWwgPi4KKworY29uZmlnIEZFQVRVUkVfU1VJRF9DT05GSUdfUVVJRVQKKwlib29sICJTdXBwcmVzcyB3YXJuaW5nIG1lc3NhZ2UgaWYgL2V0Yy9idXN5Ym94LmNvbmYgaXMgbm90IHJlYWRhYmxlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9TVUlEX0NPTkZJRworCWhlbHAKKwkgIC9ldGMvYnVzeWJveC5jb25mIHNob3VsZCBiZSByZWFkYWJsZSBieSB0aGUgdXNlciBuZWVkaW5nIHRoZSBTVUlELAorCSAgY2hlY2sgdGhpcyBvcHRpb24gdG8gYXZvaWQgdXNlcnMgdG8gYmUgbm90aWZpZWQgYWJvdXQgbWlzc2luZworCSAgcGVybWlzc2lvbnMuCisKK2NvbmZpZyBTRUxJTlVYCisJYm9vbCAiU3VwcG9ydCBOU0EgU2VjdXJpdHkgRW5oYW5jZWQgTGludXgiCisJZGVmYXVsdCBuCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIFNFTGludXggaW4gYXBwbGV0cyBscywgcHMsIGFuZCBpZC4gQWxzbyBwcm92aWRlCisJICB0aGUgb3B0aW9uIG9mIGNvbXBpbGluZyBpbiBTRUxpbnV4IGFwcGxldHMuCisKKwkgIElmIHlvdSBkbyBub3QgaGF2ZSBhIGNvbXBsZXRlIFNFTGludXggdXNlcmxhbmQgaW5zdGFsbGVkLCB0aGlzIHN0dWZmCisJICB3aWxsIG5vdCBjb21waWxlLiAgU3BlY2lmaWFsbHksIGxpYnNlbGludXggMS4yOCBvciBiZXR0ZXIgaXMKKwkgIGRpcmVjdGx5IHJlcXVpcmVkIGJ5IGJ1c3lib3guIElmIHRoZSBpbnN0YWxsYXRpb24gaXMgbG9jYXRlZCBpbiBhCisJICBub24tc3RhbmRhcmQgZGlyZWN0b3J5LCBwcm92aWRlIGl0IGJ5IGludm9raW5nIG1ha2UgYXMgZm9sbG93czoKKwkJQ0ZMQUdTPS1JPGxpYnNlbGludXgtaW5jbHVkZS1wYXRoPiBcCisJCUxERkxBR1M9LUw8bGlic2VsaW51eC1saWItcGF0aD4gXAorCQltYWtlCisKKwkgIE1vc3QgcGVvcGxlIHdpbGwgbGVhdmUgdGhpcyBzZXQgdG8gJ04nLgorCitjb25maWcgRkVBVFVSRV9QUkVGRVJfQVBQTEVUUworCWJvb2wgImV4ZWMgcHJlZmVycyBhcHBsZXRzIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIG9wdGlvbiB3aGljaCBkaXJlY3RzIGFwcGxldHMgYWJvdXQgdG8KKwkgIGNhbGwgJ2V4ZWMnIHRvIHRyeSBhbmQgZmluZCBhbiBhcHBsaWNhYmxlIGJ1c3lib3ggYXBwbGV0IGJlZm9yZQorCSAgc2VhcmNoaW5nIHRoZSBQQVRILiBUaGlzIGlzIHR5cGljYWxseSBkb25lIGJ5IGV4ZWMnaW5nCisJICAvcHJvYy9zZWxmL2V4ZS4KKwkgIFRoaXMgbWF5IGFmZmVjdCBzaGVsbCwgZmluZCAtZXhlYywgeGFyZ3MgYW5kIHNpbWlsYXIgYXBwbGV0cy4KKwkgIFRoZXkgd2lsbCB1c2UgYXBwbGV0cyBldmVuIGlmIC9iaW4vPGFwcGxldD4gLT4gYnVzeWJveCBsaW5rCisJICBpcyBtaXNzaW5nIChvciBpcyBub3QgYSBsaW5rIHRvIGJ1c3lib3gpLiBIb3dldmVyLCB0aGlzIGNhdXNlcworCSAgcHJvYmxlbXMgaW4gY2hyb290IGphaWxzIHdpdGhvdXQgbW91bnRlZCAvcHJvYyBhbmQgd2l0aCBwcy90b3AKKwkgIChjb21tYW5kIG5hbWUgY2FuIGJlIHNob3duIGFzICdleGUnIGZvciBhcHBsZXRzIHN0YXJ0ZWQgdGhpcyB3YXkpLgorCitjb25maWcgQlVTWUJPWF9FWEVDX1BBVEgKKwlzdHJpbmcgIlBhdGggdG8gQnVzeUJveCBleGVjdXRhYmxlIgorCWRlZmF1bHQgIi9wcm9jL3NlbGYvZXhlIgorCWhlbHAKKwkgIFdoZW4gQnVzeWJveCBhcHBsZXRzIG5lZWQgdG8gcnVuIG90aGVyIGJ1c3lib3ggYXBwbGV0cywgQnVzeUJveAorCSAgc29tZXRpbWVzIG5lZWRzIHRvIGV4ZWMoKSBpdHNlbGYuIFdoZW4gdGhlIC9wcm9jIGZpbGVzeXN0ZW0gaXMKKwkgIG1vdW50ZWQsIC9wcm9jL3NlbGYvZXhlIGFsd2F5cyBwb2ludHMgdG8gdGhlIGN1cnJlbnRseSBydW5uaW5nCisJICBleGVjdXRhYmxlLiBJZiB5b3UgaGF2ZW4ndCBnb3QgL3Byb2MsIHNldCB0aGlzIHRvIHdoZXJldmVyIHlvdQorCSAgd2FudCB0byBydW4gQnVzeUJveCBmcm9tLgorCisjIFRoZXNlIGFyZSBhdXRvLXNlbGVjdGVkIGJ5IG90aGVyIG9wdGlvbnMKKworY29uZmlnIEZFQVRVUkVfU1lTTE9HCisJYm9vbCAjTm8gZGVzY3JpcHRpb24gbWFrZXMgaXQgYSBoaWRkZW4gb3B0aW9uCisJZGVmYXVsdCBuCisJI2hlbHAKKwkjICBUaGlzIG9wdGlvbiBpcyBhdXRvLXNlbGVjdGVkIHdoZW4geW91IHNlbGVjdCBhbnkgYXBwbGV0IHdoaWNoIG1heQorCSMgIHNlbmQgaXRzIG91dHB1dCB0byBzeXNsb2cuIFlvdSBkbyBub3QgbmVlZCB0byBzZWxlY3QgaXQgbWFudWFsbHkuCisKK2NvbmZpZyBGRUFUVVJFX0hBVkVfUlBDCisJYm9vbCAjTm8gZGVzY3JpcHRpb24gbWFrZXMgaXQgYSBoaWRkZW4gb3B0aW9uCisJZGVmYXVsdCBuCisJI2hlbHAKKwkjICBUaGlzIGlzIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgaWYgYW55IG9mIGVuYWJsZWQgYXBwbGV0cyBuZWVkIGl0LgorCSMgIFlvdSBkbyBub3QgbmVlZCB0byBzZWxlY3QgaXQgbWFudWFsbHkuCisKK2VuZG1lbnUKKworbWVudSAnQnVpbGQgT3B0aW9ucycKKworY29uZmlnIFNUQVRJQworCWJvb2wgIkJ1aWxkIEJ1c3lCb3ggYXMgYSBzdGF0aWMgYmluYXJ5IChubyBzaGFyZWQgbGlicykiCisJZGVmYXVsdCBuCisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gYnVpbGQgYSBzdGF0aWMgQnVzeUJveCBiaW5hcnksIHdoaWNoIGRvZXMgbm90CisJICB1c2Ugb3IgcmVxdWlyZSBhbnkgc2hhcmVkIGxpYnJhcmllcywgdGhlbiBlbmFibGUgdGhpcyBvcHRpb24uCisJICBUaGlzIGNhbiBjYXVzZSBCdXN5Qm94IHRvIGJlIGNvbnNpZGVyYWJseSBsYXJnZXIsIHNvIHlvdSBzaG91bGQKKwkgIGxlYXZlIHRoaXMgb3B0aW9uIGZhbHNlIHVubGVzcyB5b3UgaGF2ZSBhIGdvb2QgcmVhc29uIChpLmUuCisJICB5b3VyIHRhcmdldCBwbGF0Zm9ybSBkb2VzIG5vdCBzdXBwb3J0IHNoYXJlZCBsaWJyYXJpZXMsIG9yCisJICB5b3UgYXJlIGJ1aWxkaW5nIGFuIGluaXRyZCB3aGljaCBkb2Vzbid0IG5lZWQgYW55dGhpbmcgYnV0CisJICBCdXN5Qm94LCBldGMpLgorCisJICBNb3N0IHBlb3BsZSB3aWxsIGxlYXZlIHRoaXMgc2V0IHRvICdOJy4KKworY29uZmlnIFBJRQorCWJvb2wgIkJ1aWxkIEJ1c3lCb3ggYXMgYSBwb3NpdGlvbiBpbmRlcGVuZGVudCBleGVjdXRhYmxlIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gIVNUQVRJQworCWhlbHAKKwkgIEhhcmRlbmVkIGNvZGUgb3B0aW9uLiBQSUUgYmluYXJpZXMgYXJlIGxvYWRlZCBhdCBhIGRpZmZlcmVudAorCSAgYWRkcmVzcyBhdCBlYWNoIGludm9jYXRpb24uIFRoaXMgaGFzIHNvbWUgb3ZlcmhlYWQsCisJICBwYXJ0aWN1bGFybHkgb24geDg2LTMyIHdoaWNoIGlzIHNob3J0IG9uIHJlZ2lzdGVycy4KKworCSAgTW9zdCBwZW9wbGUgd2lsbCBsZWF2ZSB0aGlzIHNldCB0byAnTicuCisKK2NvbmZpZyBOT01NVQorCWJvb2wgIkZvcmNlIE5PTU1VIGJ1aWxkIgorCWRlZmF1bHQgbgorCWhlbHAKKwkgIEJ1c3lib3ggdHJpZXMgdG8gZGV0ZWN0IHdoZXRoZXIgYXJjaGl0ZWN0dXJlIGl0IGlzIGJlaW5nCisJICBidWlsdCBhZ2FpbnN0IHN1cHBvcnRzIE1NVSBvciBub3QuIElmIHRoaXMgZGV0ZWN0aW9uIGZhaWxzLAorCSAgb3IgaWYgeW91IHdhbnQgdG8gYnVpbGQgTk9NTVUgdmVyc2lvbiBvZiBidXN5Ym94IGZvciB0ZXN0aW5nLAorCSAgeW91IG1heSBmb3JjZSBOT01NVSBidWlsZCBoZXJlLgorCisJICBNb3N0IHBlb3BsZSB3aWxsIGxlYXZlIHRoaXMgc2V0IHRvICdOJy4KKworIyBQSUUgY2FuIGJlIG1hZGUgdG8gd29yayB3aXRoIEJVSUxEX0xJQkJVU1lCT1gsIGJ1dCBjdXJyZW50bHkKKyMgYnVpbGQgc3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgdGhhdAorY29uZmlnIEJVSUxEX0xJQkJVU1lCT1gKKwlib29sICJCdWlsZCBzaGFyZWQgbGliYnVzeWJveCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uICFGRUFUVVJFX1BSRUZFUl9BUFBMRVRTICYmICFQSUUgJiYgIVNUQVRJQworCWhlbHAKKwkgIEJ1aWxkIGEgc2hhcmVkIGxpYnJhcnkgbGliYnVzeWJveC5zby5OLk4uTiB3aGljaCBjb250YWlucyBhbGwKKwkgIGJ1c3lib3ggY29kZS4KKworCSAgVGhpcyBmZWF0dXJlIGFsbG93cyBldmVyeSBhcHBsZXQgdG8gYmUgYnVpbHQgYXMgYSB0aW55CisJICBzZXBhcmF0ZSBleGVjdXRhYmxlLiBFbmFibGluZyBpdCBmb3IgIm9uZSBiaWcgYnVzeWJveCBiaW5hcnkiCisJICBhcHByb2FjaCBzZXJ2ZXMgbm8gcHVycG9zZSBhbmQgaW5jcmVhc2VzIGNvZGUgc2l6ZS4KKwkgIFlvdSBzaG91bGQgYWxtb3N0IGNlcnRhaW5seSBzYXkgIm5vIiB0byB0aGlzLgorCisjIyMgY29uZmlnIEZFQVRVUkVfRlVMTF9MSUJCVVNZQk9YCisjIyMJYm9vbCAiRmVhdHVyZS1jb21wbGV0ZSBsaWJidXN5Ym94IgorIyMjCWRlZmF1bHQgbiBpZiAhRkVBVFVSRV9TSEFSRURfQlVTWUJPWAorIyMjCWRlcGVuZHMgb24gQlVJTERfTElCQlVTWUJPWAorIyMjCWhlbHAKKyMjIwkgIEJ1aWxkIGEgbGliYnVzeWJveCB3aXRoIHRoZSBjb21wbGV0ZSBmZWF0dXJlLXNldCwgZGlzcmVnYXJkaW5nCisjIyMJICB0aGUgYWN0dWFsbHkgc2VsZWN0ZWQgY29uZmlnLgorIyMjCisjIyMJICBOb3JtYWxseSwgbGliYnVzeWJveCB3aWxsIG9ubHkgY29udGFpbiB0aGUgZmVhdHVyZXMgd2hpY2ggYXJlCisjIyMJICB1c2VkIGJ5IGJ1c3lib3ggaXRzZWxmLiBJZiB5b3UgcGxhbiB0byB3cml0ZSBhIHNlcGFyYXRlCisjIyMJICBzdGFuZGFsb25lIGFwcGxpY2F0aW9uIHdoaWNoIHVzZXMgbGliYnVzeWJveCBzYXkgJ1knLgorIyMjCisjIyMJICBOb3RlOiBsaWJidXN5Ym94IGlzIEdQTCwgbm90IExHUEwsIGFuZCBleHBvcnRzIG5vIHN0YWJsZSBBUEkgdGhhdAorIyMjCSAgbWlnaHQgYWN0IGFzIGEgY29weXJpZ2h0IGJhcnJpZXIuIFdlIGNhbiBhbmQgd2lsbCBtb2RpZnkgdGhlCisjIyMJICBleHBvcnRlZCBmdW5jdGlvbiBzZXQgYmV0d2VlbiByZWxlYXNlcyAoZXZlbiBtaW5vciB2ZXJzaW9uIG51bWJlcgorIyMjCSAgY2hhbmdlcyksIGFuZCBoYXBwaWx5IGJyZWFrIG91dC1vZi10cmVlIGZlYXR1cmVzLgorIyMjCisjIyMJICBTYXkgJ04nIGlmIGluIGRvdWJ0LgorCitjb25maWcgRkVBVFVSRV9JTkRJVklEVUFMCisJYm9vbCAiUHJvZHVjZSBhIGJpbmFyeSBmb3IgZWFjaCBhcHBsZXQsIGxpbmtlZCBhZ2FpbnN0IGxpYmJ1c3lib3giCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBCVUlMRF9MSUJCVVNZQk9YCisJaGVscAorCSAgSWYgeW91ciBDUFUgYXJjaGl0ZWN0dXJlIGRvZXNuJ3QgYWxsb3cgZm9yIHNoYXJpbmcgdGV4dC9yb2RhdGEKKwkgIHNlY3Rpb25zIG9mIHJ1bm5pbmcgYmluYXJpZXMsIGJ1dCBhbGxvd3MgZm9yIHJ1bnRpbWUgZHluYW1pYworCSAgbGlicmFyaWVzLCB0aGlzIG9wdGlvbiB3aWxsIGFsbG93IHlvdSB0byByZWR1Y2UgbWVtb3J5IGZvb3RwcmludAorCSAgd2hlbiB5b3UgaGF2ZSBtYW55IGRpZmZlcmVudCBhcHBsZXRzIHJ1bm5pbmcgYXQgb25jZS4KKworCSAgSWYgeW91ciBDUFUgYXJjaGl0ZWN0dXJlIGFsbG93cyBmb3Igc2hhcmluZyB0ZXh0L3JvZGF0YSwKKwkgIGhhdmluZyBzaW5nbGUgYmluYXJ5IGlzIG1vcmUgb3B0aW1hbC4KKworCSAgRWFjaCBhcHBsZXQgd2lsbCBiZSBhIHRpbnkgcHJvZ3JhbSwgZHluYW1pY2FsbHkgbGlua2VkCisJICBhZ2FpbnN0IGxpYmJ1c3lib3guc28uTi5OLk4uCisKKwkgIFlvdSBuZWVkIHRvIGhhdmUgYSB3b3JraW5nIGR5bmFtaWMgbGlua2VyLgorCitjb25maWcgRkVBVFVSRV9TSEFSRURfQlVTWUJPWAorCWJvb2wgIlByb2R1Y2UgYWRkaXRpb25hbCBidXN5Ym94IGJpbmFyeSBsaW5rZWQgYWdhaW5zdCBsaWJidXN5Ym94IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQlVJTERfTElCQlVTWUJPWAorCWhlbHAKKwkgIEJ1aWxkIGJ1c3lib3gsIGR5bmFtaWNhbGx5IGxpbmtlZCBhZ2FpbnN0IGxpYmJ1c3lib3guc28uTi5OLk4uCisKKwkgIFlvdSBuZWVkIHRvIGhhdmUgYSB3b3JraW5nIGR5bmFtaWMgbGlua2VyLgorCisjIyMgY29uZmlnIEJVSUxEX0FUX09OQ0UKKyMjIwlib29sICJDb21waWxlIGFsbCBzb3VyY2VzIGF0IG9uY2UiCisjIyMJZGVmYXVsdCBuCisjIyMJaGVscAorIyMjCSAgTm9ybWFsbHkgZWFjaCBzb3VyY2UtZmlsZSBpcyBjb21waWxlZCB3aXRoIG9uZSBpbnZvY2F0aW9uIG9mCisjIyMJICB0aGUgY29tcGlsZXIuCisjIyMJICBJZiB5b3Ugc2V0IHRoaXMgb3B0aW9uLCBhbGwgc291cmNlcyBhcmUgY29tcGlsZWQgYXQgb25jZS4KKyMjIwkgIFRoaXMgZ2l2ZXMgdGhlIGNvbXBpbGVyIG1vcmUgb3Bwb3J0dW5pdGllcyB0byBvcHRpbWl6ZSB3aGljaCBjYW4KKyMjIwkgIHJlc3VsdCBpbiBzbWFsbGVyIGFuZC9vciBmYXN0ZXIgYmluYXJpZXMuCisjIyMKKyMjIwkgIFNldHRpbmcgdGhpcyBvcHRpb24gd2lsbCBjb25zdW1lIGFsb3Qgb2YgbWVtb3J5LCBlLmcuIGlmIHlvdQorIyMjCSAgZW5hYmxlIGFsbCBhcHBsZXRzIHdpdGggYWxsIGZlYXR1cmVzLCBnY2MgdXNlcyBtb3JlIHRoYW4gMzAwTUIKKyMjIwkgIFJBTSBkdXJpbmcgY29tcGlsYXRpb24gb2YgYnVzeWJveC4KKyMjIworIyMjCSAgVGhpcyBvcHRpb24gaXMgbW9zdCBsaWtlbHkgb25seSBiZW5lZmljaWFsIGZvciBuZXdlciBjb21waWxlcnMKKyMjIwkgIHN1Y2ggYXMgZ2NjLTQuMSBhbmQgYWJvdmUuCisjIyMKKyMjIwkgIFNheSAnTicgdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZy4KKworY29uZmlnIExGUworCWJvb2wgIkJ1aWxkIHdpdGggTGFyZ2UgRmlsZSBTdXBwb3J0IChmb3IgYWNjZXNzaW5nIGZpbGVzID4gMiBHQikiCisJZGVmYXVsdCB5CisJaGVscAorCSAgSWYgeW91IHdhbnQgdG8gYnVpbGQgQnVzeUJveCB3aXRoIGxhcmdlIGZpbGUgc3VwcG9ydCwgdGhlbiBlbmFibGUKKwkgIHRoaXMgb3B0aW9uLiBUaGlzIHdpbGwgaGF2ZSBubyBlZmZlY3QgaWYgeW91ciBrZXJuZWwgb3IgeW91ciBDCisJICBsaWJyYXJ5IGxhY2tzIGxhcmdlIGZpbGUgc3VwcG9ydCBmb3IgbGFyZ2UgZmlsZXMuIFNvbWUgb2YgdGhlCisJICBwcm9ncmFtcyB0aGF0IGNhbiBiZW5lZml0IGZyb20gbGFyZ2UgZmlsZSBzdXBwb3J0IGluY2x1ZGUgZGQsIGd6aXAsCisJICBjcCwgbW91bnQsIHRhciwgYW5kIG1hbnkgb3RoZXJzLiBJZiB5b3Ugd2FudCB0byBhY2Nlc3MgZmlsZXMgbGFyZ2VyCisJICB0aGFuIDIgR2lnYWJ5dGVzLCBlbmFibGUgdGhpcyBvcHRpb24uIE90aGVyd2lzZSwgbGVhdmUgaXQgc2V0IHRvICdOJy4KKworY29uZmlnIENST1NTX0NPTVBJTEVSX1BSRUZJWAorCXN0cmluZyAiQ3Jvc3MgQ29tcGlsZXIgcHJlZml4IgorCWRlZmF1bHQgIiIKKwloZWxwCisJICBJZiB5b3Ugd2FudCB0byBidWlsZCBCdXN5Qm94IHdpdGggYSBjcm9zcyBjb21waWxlciwgdGhlbiB5b3UKKwkgIHdpbGwgbmVlZCB0byBzZXQgdGhpcyB0byB0aGUgY3Jvc3MtY29tcGlsZXIgcHJlZml4LCBmb3IgZXhhbXBsZSwKKwkgICJpMzg2LXVjbGliYy0iLgorCisJICBOb3RlIHRoYXQgQ1JPU1NfQ09NUElMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSBvcgorCSAgIm1ha2UgQ1JPU1NfQ09NUElMRT14eHggLi4uIiB3aWxsIG92ZXJyaWRlIHRoaXMgc2VsZWN0aW9uLgorCisJICBOYXRpdmUgYnVpbGRzIGxlYXZlIHRoaXMgZW1wdHkuCisKK2NvbmZpZyBTWVNST09UCisJc3RyaW5nICJQYXRoIHRvIHN5c3Jvb3QiCisJZGVmYXVsdCAiIgorCWhlbHAKKwkgIElmIHlvdSB3YW50IHRvIGJ1aWxkIEJ1c3lCb3ggd2l0aCBhIGNyb3NzIGNvbXBpbGVyLCB0aGVuIHlvdQorCSAgbWlnaHQgYWxzbyBuZWVkIHRvIHNwZWNpZnkgd2hlcmUgL3Vzci9pbmNsdWRlIGFuZCAvdXNyL2xpYgorCSAgd2lsbCBiZSBmb3VuZC4KKworCSAgRm9yIGV4YW1wbGUsIEJ1c3lCb3ggY2FuIGJlIGJ1aWx0IGFnYWluc3QgYW4gaW5zdGFsbGVkCisJICBBbmRyb2lkIE5ESywgcGxhdGZvcm0gdmVyc2lvbiA5LCBmb3IgQVJNIEFCSSB3aXRoCisKKwkgIENPTkZJR19TWVNST09UPS9vcHQvYW5kcm9pZC1uZGsvcGxhdGZvcm1zL2FuZHJvaWQtOS9hcmNoLWFybQorCisJICBOYXRpdmUgYnVpbGRzIGxlYXZlIHRoaXMgZW1wdHkuCisKK2NvbmZpZyBFWFRSQV9DRkxBR1MKKwlzdHJpbmcgIkFkZGl0aW9uYWwgQ0ZMQUdTIgorCWRlZmF1bHQgIiIKKwloZWxwCisJICBBZGRpdGlvbmFsIENGTEFHUyB0byBwYXNzIHRvIHRoZSBjb21waWxlciB2ZXJiYXRpbS4KKworY29uZmlnIEVYVFJBX0xERkxBR1MKKwlzdHJpbmcgIkFkZGl0aW9uYWwgTERGTEFHUyIKKwlkZWZhdWx0ICIiCisJaGVscAorCSAgQWRkaXRpb25hbCBMREZMQUdTIHRvIHBhc3MgdG8gdGhlIGxpbmtlciB2ZXJiYXRpbS4KKworY29uZmlnIEVYVFJBX0xETElCUworCXN0cmluZyAiQWRkaXRpb25hbCBMRExJQlMiCisJZGVmYXVsdCAiIgorCWhlbHAKKwkgIEFkZGl0aW9uYWwgTERMSUJTIHRvIHBhc3MgdG8gdGhlIGxpbmtlciB3aXRoIC1sLgorCitlbmRtZW51CisKK21lbnUgJ0RlYnVnZ2luZyBPcHRpb25zJworCitjb25maWcgREVCVUcKKwlib29sICJCdWlsZCBCdXN5Qm94IHdpdGggZXh0cmEgRGVidWdnaW5nIHN5bWJvbHMiCisJZGVmYXVsdCBuCisJaGVscAorCSAgU2F5IFkgaGVyZSBpZiB5b3Ugd2lzaCB0byBleGFtaW5lIEJ1c3lCb3ggaW50ZXJuYWxzIHdoaWxlIGFwcGxldHMgYXJlCisJICBydW5uaW5nLiBUaGlzIGluY3JlYXNlcyB0aGUgc2l6ZSBvZiB0aGUgYmluYXJ5IGNvbnNpZGVyYWJseSwgYW5kCisJICBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gZG9pbmcgZGV2ZWxvcG1lbnQuIElmIHlvdSBhcmUgZG9pbmcKKwkgIGRldmVsb3BtZW50IGFuZCB3YW50IHRvIGRlYnVnIEJ1c3lCb3gsIGFuc3dlciBZLgorCisJICBNb3N0IHBlb3BsZSBzaG91bGQgYW5zd2VyIE4uCisKK2NvbmZpZyBERUJVR19QRVNTSU1JWkUKKwlib29sICJEaXNhYmxlIGNvbXBpbGVyIG9wdGltaXphdGlvbnMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBERUJVRworCWhlbHAKKwkgIFRoZSBjb21waWxlcidzIG9wdGltaXphdGlvbiBvZiBzb3VyY2UgY29kZSBjYW4gZWxpbWluYXRlIGFuZCByZW9yZGVyCisJICBjb2RlLCByZXN1bHRpbmcgaW4gYW4gZXhlY3V0YWJsZSB0aGF0J3MgaGFyZCB0byB1bmRlcnN0YW5kIHdoZW4KKwkgIHN0ZXBwaW5nIHRocm91Z2ggaXQgd2l0aCBhIGRlYnVnZ2VyLiBUaGlzIHN3aXRjaGVzIGl0IG9mZiwgcmVzdWx0aW5nCisJICBpbiBhIG11Y2ggYmlnZ2VyIGV4ZWN1dGFibGUgdGhhdCBtb3JlIGNsb3NlbHkgbWF0Y2hlcyB0aGUgc291cmNlCisJICBjb2RlLgorCitjb25maWcgVU5JVF9URVNUCisJYm9vbCAiQnVpbGQgdW5pdCB0ZXN0cyIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBTYXkgWSBoZXJlIGlmIHlvdSB3YW50IHRvIGJ1aWxkIHVuaXQgdGVzdHMgKGJvdGggdGhlIGZyYW1ld29yayBhbmQKKwkgIHRlc3QgY2FzZXMpIGFzIGEgQnVzeWJveCBhcHBsZXQuIFRoaXMgcmVzdWx0cyBpbiBiaWdnZXIgY29kZSwgc28geW91CisJICBwcm9iYWJseSBkb24ndCB3YW50IHRoaXMgb3B0aW9uIGluIHByb2R1Y3Rpb24gYnVpbGRzLgorCitjb25maWcgV0VSUk9SCisJYm9vbCAiQWJvcnQgY29tcGlsYXRpb24gb24gYW55IHdhcm5pbmciCisJZGVmYXVsdCBuCisJaGVscAorCSAgU2VsZWN0aW5nIHRoaXMgd2lsbCBhZGQgLVdlcnJvciB0byBnY2MgY29tbWFuZCBsaW5lLgorCisJICBNb3N0IHBlb3BsZSBzaG91bGQgYW5zd2VyIE4uCisKK2Nob2ljZQorCXByb21wdCAiQWRkaXRpb25hbCBkZWJ1Z2dpbmcgbGlicmFyeSIKKwlkZWZhdWx0IE5PX0RFQlVHX0xJQgorCWhlbHAKKwkgIFVzaW5nIGFuIGFkZGl0aW9uYWwgZGVidWdnaW5nIGxpYnJhcnkgd2lsbCBtYWtlIEJ1c3lCb3ggYmVjb21lCisJICBjb25zaWRlcmFibGUgbGFyZ2VyIGFuZCB3aWxsIGNhdXNlIGl0IHRvIHJ1biBtb3JlIHNsb3dseS4gWW91CisJICBzaG91bGQgYWx3YXlzIGxlYXZlIHRoaXMgb3B0aW9uIGRpc2FibGVkIGZvciBwcm9kdWN0aW9uIHVzZS4KKworCSAgZG1hbGxvYyBzdXBwb3J0OgorCSAgLS0tLS0tLS0tLS0tLS0tLQorCSAgVGhpcyBlbmFibGVzIGNvbXBpbGluZyB3aXRoIGRtYWxsb2MgKCBodHRwOi8vZG1hbGxvYy5jb20vICkKKwkgIHdoaWNoIGlzIGFuIGV4Y2VsbGVudCBwdWJsaWMgZG9tYWluIG1lbSBsZWFrIGFuZCBtYWxsb2MgcHJvYmxlbQorCSAgZGV0ZWN0b3IuIFRvIGVuYWJsZSBkbWFsbG9jLCBiZWZvcmUgcnVubmluZyBidXN5Ym94IHlvdSB3aWxsCisJICB3YW50IHRvIHByb3Blcmx5IHNldCB5b3VyIGVudmlyb25tZW50LCBmb3IgZXhhbXBsZToKKwkgICAgZXhwb3J0IERNQUxMT0NfT1BUSU9OUz1kZWJ1Zz0weDM0ZjQ3ZDgzLGludGVyPTEwMCxsb2c9bG9nZmlsZQorCSAgVGhlICdkZWJ1Zz0nIHZhbHVlIGlzIGdlbmVyYXRlZCB1c2luZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQKKwkgICAgZG1hbGxvYyAtcCBsb2ctc3RhdHMgLXAgbG9nLW5vbi1mcmVlIC1wIGxvZy1iYWQtc3BhY2UgXAorCSAgICAgICAtcCBsb2ctZWxhcHNlZC10aW1lIC1wIGNoZWNrLWZlbmNlIC1wIGNoZWNrLWhlYXAgXAorCSAgICAgICAtcCBjaGVjay1saXN0cyAtcCBjaGVjay1ibGFuayAtcCBjaGVjay1mdW5jcyAtcCByZWFsbG9jLWNvcHkgXAorCSAgICAgICAtcCBhbGxvdy1mcmVlLW51bGwKKworCSAgRWxlY3RyaWMtZmVuY2Ugc3VwcG9ydDoKKwkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICBUaGlzIGVuYWJsZXMgY29tcGlsaW5nIHdpdGggRWxlY3RyaWMtZmVuY2Ugc3VwcG9ydC4gRWxlY3RyaWMKKwkgIGZlbmNlIGlzIGFub3RoZXIgdmVyeSB1c2VmdWwgbWFsbG9jIGRlYnVnZ2luZyBsaWJyYXJ5IHdoaWNoIHVzZXMKKwkgIHlvdXIgY29tcHV0ZXIncyB2aXJ0dWFsIG1lbW9yeSBoYXJkd2FyZSB0byBkZXRlY3QgaWxsZWdhbCBtZW1vcnkKKwkgIGFjY2Vzc2VzLiBUaGlzIHN1cHBvcnQgd2lsbCBtYWtlIEJ1c3lCb3ggYmUgY29uc2lkZXJhYmxlIGxhcmdlcgorCSAgYW5kIHJ1biBzbG93ZXIsIHNvIHlvdSBzaG91bGQgbGVhdmUgdGhpcyBvcHRpb24gZGlzYWJsZWQgdW5sZXNzCisJICB5b3UgYXJlIGh1bnRpbmcgYSBoYXJkIHRvIGZpbmQgbWVtb3J5IHByb2JsZW0uCisKKworY29uZmlnIE5PX0RFQlVHX0xJQgorCWJvb2wgIk5vbmUiCisKK2NvbmZpZyBETUFMTE9DCisJYm9vbCAiRG1hbGxvYyIKKworY29uZmlnIEVGRU5DRQorCWJvb2wgIkVsZWN0cmljLWZlbmNlIgorCitlbmRjaG9pY2UKKworZW5kbWVudQorCittZW51ICdJbnN0YWxsYXRpb24gT3B0aW9ucyAoIm1ha2UgaW5zdGFsbCIgYmVoYXZpb3IpJworCitjaG9pY2UKKwlwcm9tcHQgIldoYXQga2luZCBvZiBhcHBsZXQgbGlua3MgdG8gaW5zdGFsbCIKKwlkZWZhdWx0IElOU1RBTExfQVBQTEVUX1NZTUxJTktTCisJaGVscAorCSAgQ2hvb3NlIHdoYXQga2luZCBvZiBsaW5rcyB0byBhcHBsZXRzIGFyZSBjcmVhdGVkIGJ5ICJtYWtlIGluc3RhbGwiLgorCitjb25maWcgSU5TVEFMTF9BUFBMRVRfU1lNTElOS1MKKwlib29sICJhcyBzb2Z0LWxpbmtzIgorCWhlbHAKKwkgIEluc3RhbGwgYXBwbGV0cyBhcyBzb2Z0LWxpbmtzIHRvIHRoZSBidXN5Ym94IGJpbmFyeS4gVGhpcyBuZWVkcyBzb21lCisJICBmcmVlIGlub2RlcyBvbiB0aGUgZmlsZXN5c3RlbSwgYnV0IG1pZ2h0IGhlbHAgd2l0aCBmaWxlc3lzdGVtCisJICBnZW5lcmF0b3JzIHRoYXQgY2FuJ3QgY29wZSB3aXRoIGhhcmQtbGlua3MuCisKK2NvbmZpZyBJTlNUQUxMX0FQUExFVF9IQVJETElOS1MKKwlib29sICJhcyBoYXJkLWxpbmtzIgorCWhlbHAKKwkgIEluc3RhbGwgYXBwbGV0cyBhcyBoYXJkLWxpbmtzIHRvIHRoZSBidXN5Ym94IGJpbmFyeS4gVGhpcyBtaWdodAorCSAgY291bnQgb24gYSBmaWxlc3lzdGVtIHdpdGggZmV3IGlub2Rlcy4KKworY29uZmlnIElOU1RBTExfQVBQTEVUX1NDUklQVF9XUkFQUEVSUworCWJvb2wgImFzIHNjcmlwdCB3cmFwcGVycyIKKwloZWxwCisJICBJbnN0YWxsIGFwcGxldHMgYXMgc2NyaXB0IHdyYXBwZXJzIHRoYXQgY2FsbCB0aGUgYnVzeWJveCBiaW5hcnkuCisKK2NvbmZpZyBJTlNUQUxMX0FQUExFVF9ET05UCisJYm9vbCAibm90IGluc3RhbGxlZCIKKwloZWxwCisJICBEbyBub3QgaW5zdGFsbCBhcHBsZXQgbGlua3MuIFVzZWZ1bCB3aGVuIHlvdSBwbGFuIHRvIHVzZQorCSAgYnVzeWJveCAtLWluc3RhbGwgZm9yIGluc3RhbGxpbmcgbGlua3MsIG9yIHBsYW4gdG8gdXNlCisJICBhIHN0YW5kYWxvbmUgc2hlbGwgYW5kIHRodXMgZG9uJ3QgbmVlZCBhcHBsZXQgbGlua3MuCisKK2VuZGNob2ljZQorCitjaG9pY2UKKwlwcm9tcHQgIi9iaW4vc2ggYXBwbGV0IGxpbmsiCisJZGVmYXVsdCBJTlNUQUxMX1NIX0FQUExFVF9TWU1MSU5LCisJZGVwZW5kcyBvbiBJTlNUQUxMX0FQUExFVF9TQ1JJUFRfV1JBUFBFUlMKKwloZWxwCisJICBDaG9vc2UgaG93IHlvdSBpbnN0YWxsIC9iaW4vc2ggYXBwbGV0IGxpbmsuCisKK2NvbmZpZyBJTlNUQUxMX1NIX0FQUExFVF9TWU1MSU5LCisJYm9vbCAiYXMgc29mdC1saW5rIgorCWhlbHAKKwkgIEluc3RhbGwgL2Jpbi9zaCBhcHBsZXQgYXMgc29mdC1saW5rIHRvIHRoZSBidXN5Ym94IGJpbmFyeS4KKworY29uZmlnIElOU1RBTExfU0hfQVBQTEVUX0hBUkRMSU5LCisJYm9vbCAiYXMgaGFyZC1saW5rIgorCWhlbHAKKwkgIEluc3RhbGwgL2Jpbi9zaCBhcHBsZXQgYXMgaGFyZC1saW5rIHRvIHRoZSBidXN5Ym94IGJpbmFyeS4KKworY29uZmlnIElOU1RBTExfU0hfQVBQTEVUX1NDUklQVF9XUkFQUEVSCisJYm9vbCAiYXMgc2NyaXB0IHdyYXBwZXIiCisJaGVscAorCSAgSW5zdGFsbCAvYmluL3NoIGFwcGxldCBhcyBzY3JpcHQgd3JhcHBlciB0aGF0IGNhbGxzCisJICB0aGUgYnVzeWJveCBiaW5hcnkuCisKK2VuZGNob2ljZQorCitjb25maWcgUFJFRklYCisJc3RyaW5nICJCdXN5Qm94IGluc3RhbGxhdGlvbiBwcmVmaXgiCisJZGVmYXVsdCAiLi9faW5zdGFsbCIKKwloZWxwCisJICBEZWZpbmUgeW91ciBkaXJlY3RvcnkgdG8gaW5zdGFsbCBCdXN5Qm94IGZpbGVzL3N1YmRpcnMgaW4uCisKK2VuZG1lbnUKKworc291cmNlIGxpYmJiL0NvbmZpZy5pbgorCitlbmRtZW51CisKK2NvbW1lbnQgIkFwcGxldHMiCisKK3NvdXJjZSBhcmNoaXZhbC9Db25maWcuaW4KK3NvdXJjZSBjb3JldXRpbHMvQ29uZmlnLmluCitzb3VyY2UgY29uc29sZS10b29scy9Db25maWcuaW4KK3NvdXJjZSBkZWJpYW51dGlscy9Db25maWcuaW4KK3NvdXJjZSBlZGl0b3JzL0NvbmZpZy5pbgorc291cmNlIGZpbmR1dGlscy9Db25maWcuaW4KK3NvdXJjZSBpbml0L0NvbmZpZy5pbgorc291cmNlIGxvZ2ludXRpbHMvQ29uZmlnLmluCitzb3VyY2UgZTJmc3Byb2dzL0NvbmZpZy5pbgorc291cmNlIG1vZHV0aWxzL0NvbmZpZy5pbgorc291cmNlIHV0aWwtbGludXgvQ29uZmlnLmluCitzb3VyY2UgbWlzY3V0aWxzL0NvbmZpZy5pbgorc291cmNlIG5ldHdvcmtpbmcvQ29uZmlnLmluCitzb3VyY2UgcHJpbnR1dGlscy9Db25maWcuaW4KK3NvdXJjZSBtYWlsdXRpbHMvQ29uZmlnLmluCitzb3VyY2UgcHJvY3BzL0NvbmZpZy5pbgorc291cmNlIHJ1bml0L0NvbmZpZy5pbgorc291cmNlIHNlbGludXgvQ29uZmlnLmluCitzb3VyY2Ugc2hlbGwvQ29uZmlnLmluCitzb3VyY2Ugc3lza2xvZ2QvQ29uZmlnLmluCmRpZmYgLS1naXQgYS9JTlNUQUxMIGIvSU5TVEFMTApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTBjZmM0Ci0tLSAvZGV2L251bGwKKysrIGIvSU5TVEFMTApAQCAtMCwwICsxLDE0MiBAQAorQnVpbGRpbmc6Cis9PT09PT09PT0KKworVGhlIEJ1c3lCb3ggYnVpbGQgcHJvY2VzcyBpcyBzaW1pbGFyIHRvIHRoZSBMaW51eCBrZXJuZWwgYnVpbGQ6CisKKyAgbWFrZSBtZW51Y29uZmlnICAgICAjIFRoaXMgY3JlYXRlcyBhIGZpbGUgY2FsbGVkICIuY29uZmlnIgorICBtYWtlICAgICAgICAgICAgICAgICMgVGhpcyBjcmVhdGVzIHRoZSAiYnVzeWJveCIgZXhlY3V0YWJsZQorICBtYWtlIGluc3RhbGwgICAgICAgICMgb3IgbWFrZSBDT05GSUdfUFJFRklYPS9wYXRoL2Zyb20vcm9vdCBpbnN0YWxsCisKK1RoZSBmdWxsIGxpc3Qgb2YgY29uZmlndXJhdGlvbiBhbmQgaW5zdGFsbCBvcHRpb25zIGlzIGF2YWlsYWJsZSBieSB0eXBpbmc6CisKKyAgbWFrZSBoZWxwCisKK1F1aWNrIFN0YXJ0OgorPT09PT09PT09PT09CisKK1RoZSBlYXN5IHdheSB0byB0cnkgb3V0IEJ1c3lCb3ggZm9yIHRoZSBmaXJzdCB0aW1lLCB3aXRob3V0IGhhdmluZyB0byBpbnN0YWxsCitpdCwgaXMgdG8gZW5hYmxlIGFsbCBmZWF0dXJlcyBhbmQgdGhlbiB1c2UgInN0YW5kYWxvbmUgc2hlbGwiIG1vZGUgd2l0aCBhCitibGFuayBjb21tYW5kICRQQVRILgorCitUbyBlbmFibGUgYWxsIGZlYXR1cmVzLCB1c2UgIm1ha2UgZGVmY29uZmlnIiwgd2hpY2ggcHJvZHVjZXMgdGhlIGxhcmdlc3QKK2dlbmVyYWwtcHVycG9zZSBjb25maWd1cmF0aW9uLiAgSXQncyBhbGx5ZXNjb25maWcgbWludXMgZGVidWdnaW5nIG9wdGlvbnMsCitvcHRpb25hbCBwYWNrYWdpbmcgY2hvaWNlcywgYW5kIGEgZmV3IHNwZWNpYWwtcHVycG9zZSBmZWF0dXJlcyByZXF1aXJpbmcKK2V4dHJhIGNvbmZpZ3VyYXRpb24gdG8gdXNlLiAgVGhlbiBlbmFibGUgInN0YW5kYWxvbmUgc2hlbGwiIGZlYXR1cmU6CisKKyAgbWFrZSBkZWZjb25maWcKKyAgbWFrZSBtZW51Y29uZmlnCisgICMgc2VsZWN0IEJ1c3lib3ggU2V0dGluZ3MKKyAgIyAgIHRoZW4gR2VuZXJhbCBDb25maWd1cmF0aW9uCisgICMgICAgIHRoZW4gZXhlYyBwcmVmZXJzIGFwcGxldHMKKyAgIyAgIGV4aXQgYmFjayB0byB0b3AgbGV2ZWwgbWVudQorICAjICAgc2VsZWN0IFNoZWxscworICAjICAgICB0aGVuIFN0YW5kYWxvbmUgc2hlbGwKKyAgIyAgIGV4aXQgYmFjayB0byB0b3AgbGV2ZWwgbWVudQorICAjIGV4aXQgYW5kIHNhdmUgbmV3IGNvbmZpZ3VyYXRpb24KKyAgIyAgIE9SCisgICMgdXNlIHRoZXNlIGNvbW1hbmRzIHRvIG1vZGlmeSAuY29uZmlnIGRpcmVjdGx5OgorICBzZWQgLWUgJ3MvLipGRUFUVVJFX1BSRUZFUl9BUFBMRVRTLiovQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFM9eS8nIC1pIC5jb25maWcKKyAgc2VkIC1lICdzLy4qRkVBVFVSRV9TSF9TVEFOREFMT05FLiovQ09ORklHX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORT15LycgLWkgLmNvbmZpZworICBtYWtlCisgIFBBVEg9IC4vYnVzeWJveCBhc2gKKworU3RhbmRhbG9uZSBzaGVsbCBtb2RlIGNhdXNlcyBidXN5Ym94J3MgYnVpbHQtaW4gY29tbWFuZCBzaGVsbCB0byBydW4KK2FueSBidWlsdC1pbiBidXN5Ym94IGFwcGxldHMgZGlyZWN0bHksIHdpdGhvdXQgbG9va2luZyBmb3IgZXh0ZXJuYWwKK3Byb2dyYW1zIGJ5IHRoYXQgbmFtZS4gIFN1cHBseWluZyBhbiBlbXB0eSBjb21tYW5kIHBhdGggKGFzIGFib3ZlKSBtZWFucwordGhlIG9ubHkgY29tbWFuZHMgYnVzeWJveCBjYW4gZmluZCBhcmUgdGhlIGJ1aWx0LWluIG9uZXMuCisKK05vdGUgdGhhdCB0aGUgc3RhbmRhbG9uZSBzaGVsbCByZXF1aXJlcyBDT05GSUdfQlVTWUJPWF9FWEVDX1BBVEgKK3RvIGJlIHNldCBhcHByb3ByaWF0ZWx5LCBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3QgL3Byb2Mvc2VsZi9leGUgaXMKK2F2YWlsYWJsZS4gSWYgeW91IGRvIG5vdCBoYXZlIC9wcm9jLCB0aGVuIHBvaW50IHRoYXQgY29uZmlnIG9wdGlvbgordG8gdGhlIGxvY2F0aW9uIG9mIHlvdXIgYnVzeWJveCBiaW5hcnksIHVzdWFsbHkgL2Jpbi9idXN5Ym94LgorQW5vdGhlciBzb2x1dGlvbiBpcyB0byBwYXRjaCB0aGUga2VybmVsIChzZWUKK2V4YW1wbGVzL2xpbnV4LSpfcHJvY19zZWxmX2V4ZS5wYXRjaCkgdG8gbWFrZSBleGVjKCIvcHJvYy9zZWxmL2V4ZSIpCithbHdheXMgd29yay4KKworQ29uZmlndXJpbmcgQnVzeWJveDoKKz09PT09PT09PT09PT09PT09PT09CisKK0J1c3lib3ggaXMgb3B0aW1pemVkIGZvciBzaXplLCBidXQgZW5hYmxpbmcgdGhlIGZ1bGwgc2V0IG9mIGZ1bmN0aW9uYWxpdHkKK3N0aWxsIHJlc3VsdHMgaW4gYSBmYWlybHkgbGFyZ2UgZXhlY3V0YWJsZSAtLSBtb3JlIHRoYW4gMSBtZWdhYnl0ZSB3aGVuCitzdGF0aWNhbGx5IGxpbmtlZC4gIFRvIHNhdmUgc3BhY2UsIGJ1c3lib3ggY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBvbmx5IHRoZQorc2V0IG9mIGFwcGxldHMgbmVlZGVkIGZvciBlYWNoIGVudmlyb25tZW50LiAgVGhlIG1pbmltYWwgY29uZmlndXJhdGlvbiwgd2l0aAorYWxsIGFwcGxldHMgZGlzYWJsZWQsIHByb2R1Y2VzIGEgNGsgZXhlY3V0YWJsZS4gIChJdCdzIHVzZWxlc3MsIGJ1dCB2ZXJ5IHNtYWxsLikKKworVGhlIG1hbnVhbCBjb25maWd1cmF0b3IgIm1ha2UgbWVudWNvbmZpZyIgbW9kaWZpZXMgdGhlIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24uCisoRm9yIHN5c3RlbXMgd2l0aG91dCBuY3Vyc2VzLCB0cnkgIm1ha2UgY29uZmlnIiBpbnN0ZWFkLikgVGhlIHR3byBtb3N0CitpbnRlcmVzdGluZyBzdGFydGluZyBjb25maWd1cmF0aW9ucyBhcmUgIm1ha2UgYWxsbm9jb25maWciICh0byBzdGFydCB3aXRoCitldmVyeXRoaW5nIGRpc2FibGVkIGFuZCBhZGQganVzdCB3aGF0IHlvdSBuZWVkKSwgYW5kICJtYWtlIGRlZmNvbmZpZyIgKHRvCitzdGFydCB3aXRoIGV2ZXJ5dGhpbmcgZW5hYmxlZCBhbmQgcmVtb3ZlIHdoYXQgeW91IGRvbid0IG5lZWQpLiAgSWYgbWVudWNvbmZpZworaXMgcnVuIHdpdGhvdXQgYW4gZXhpc3RpbmcgY29uZmlndXJhdGlvbiwgbWFrZSBkZWZjb25maWcgd2lsbCBydW4gZmlyc3QgdG8KK2NyZWF0ZSBhIGtub3duIHN0YXJ0aW5nIHBvaW50LgorCitPdGhlciBzdGFydGluZyBjb25maWd1cmF0aW9ucyAobW9zdGx5IHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMpIGluY2x1ZGUKKyJtYWtlIGFsbGJhcmVjb25maWciIChlbmFibGVzIGFsbCBhcHBsZXRzIGJ1dCBkaXNhYmxlcyBhbGwgb3B0aW9uYWwgZmVhdHVyZXMpLAorIm1ha2UgYWxseWVzY29uZmlnIiAoZW5hYmxlcyBhYnNvbHV0ZWx5IGV2ZXJ5dGhpbmcgaW5jbHVkaW5nIGRlYnVnIGZlYXR1cmVzKSwKK2FuZCAibWFrZSByYW5kY29uZmlnIiAocHJvZHVjZSBhIHJhbmRvbSBjb25maWd1cmF0aW9uKS4gIFRoZSBjb25maWdzLyBkaXJlY3RvcnkKK2NvbnRhaW5zIGEgbnVtYmVyIG9mIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBmaWxlcyBlbmRpbmcgaW4gX2RlZmNvbmZpZyB3aGljaAorYXJlIHVzZWZ1bCBpbiBzcGVjaWZpYyBjYXNlcy4gICJtYWtlIGhlbHAiIHdpbGwgbGlzdCB0aGVtLgorCitDb25maWd1cmluZyBCdXN5Qm94IHByb2R1Y2VzIGEgZmlsZSAiLmNvbmZpZyIsIHdoaWNoIGNhbiBiZSBzYXZlZCBmb3IgZnV0dXJlCit1c2UuICBSdW4gIm1ha2Ugb2xkY29uZmlnIiB0byBicmluZyBhIC5jb25maWcgZmlsZSBmcm9tIGFuIG9sZGVyIHZlcnNpb24gb2YKK2J1c3lib3ggdXAgdG8gZGF0ZS4KKworSW5zdGFsbGluZyBCdXN5Ym94OgorPT09PT09PT09PT09PT09PT09PQorCitCdXN5Ym94IGlzIGEgc2luZ2xlIGV4ZWN1dGFibGUgdGhhdCBjYW4gYmVoYXZlIGxpa2UgbWFueSBkaWZmZXJlbnQgY29tbWFuZHMsCithbmQgQnVzeUJveCB1c2VzIHRoZSBuYW1lIGl0IHdhcyBpbnZva2VkIHVuZGVyIHRvIGRldGVybWluZSB0aGUgZGVzaXJlZAorYmVoYXZpb3IuICAoVHJ5ICJtdiBidXN5Ym94IGxzIiBhbmQgdGhlbiAiLi9scyAtbCIuKQorCitJbnN0YWxsaW5nIGJ1c3lib3ggY29uc2lzdHMgb2YgY3JlYXRpbmcgc3ltbGlua3MgKG9yIGhhcmRsaW5rcykgdG8gdGhlIGJ1c3lib3gKK2JpbmFyeSBmb3IgZWFjaCBhcHBsZXQgZW5hYmxlZCBpbiBidXN5Ym94LCBhbmQgbWFraW5nIHN1cmUgdGhlc2Ugc3ltbGlua3MgYXJlCitpbiB0aGUgc2hlbGwncyBjb21tYW5kICRQQVRILiAgUnVubmluZyAibWFrZSBpbnN0YWxsIiBjcmVhdGVzIHRoZXNlIHN5bWxpbmtzLAorb3IgIm1ha2UgaW5zdGFsbC1oYXJkbGlua3MiIGNyZWF0ZXMgaGFyZGxpbmtzIGluc3RlYWQgKHVzZWZ1bCBvbiBzeXN0ZW1zIHdpdGgKK2EgbGltaXRlZCBudW1iZXIgb2YgaW5vZGVzKS4gIFRoaXMgaW5zdGFsbCBwcm9jZXNzIHVzZXMgdGhlIGZpbGUKKyJidXN5Ym94LmxpbmtzIiAoY3JlYXRlZCBieSBtYWtlKSwgd2hpY2ggY29udGFpbnMgdGhlIGxpc3Qgb2YgZW5hYmxlZCBhcHBsZXRzCithbmQgdGhlIHBhdGggYXQgd2hpY2ggdG8gaW5zdGFsbCB0aGVtLgorCitJbnN0YWxsaW5nIGxpbmtzIHRvIGJ1c3lib3ggaXMgbm90IGFsd2F5cyBuZWNlc3NhcnkuICBUaGUgc3BlY2lhbCBhcHBsZXQgbmFtZQorImJ1c3lib3giIChvciB3aXRoIGFueSBvcHRpb25hbCBzdWZmaXgsIHN1Y2ggYXMgImJ1c3lib3gtc3RhdGljIikgdXNlcyB0aGUKK2ZpcnN0IGFyZ3VtZW50IHRvIGRldGVybWluZSB3aGljaCBhcHBsZXQgdG8gYmVoYXZlIGFzLCBmb3IgZXhhbXBsZQorIi4vYnVzeWJveCBjYXQgTElDRU5TRSIuICAoUnVubmluZyB0aGUgYnVzeWJveCBhcHBsZXQgd2l0aCBubyBhcmd1bWVudHMgZ2l2ZXMKK2EgbGlzdCBvZiBhbGwgZW5hYmxlZCBhcHBsZXRzLikgVGhlIHN0YW5kYWxvbmUgc2hlbGwgY2FuIGFsc28gY2FsbCBidXN5Ym94CithcHBsZXRzIHdpdGhvdXQgbGlua3MgdG8gYnVzeWJveCB1bmRlciBvdGhlciBuYW1lcyBpbiB0aGUgZmlsZXN5c3RlbS4gIFlvdSBjYW4KK2Fsc28gY29uZmlndXJlIGEgc3RhbmRhbG9uZSBpbnN0YWxsIGNhcGFiaWxpdHkgaW50byB0aGUgYnVzeWJveCBiYXNlIGFwcGxldCwKK2FuZCB0aGVuIGluc3RhbGwgc3VjaCBsaW5rcyBhdCBydW50aW1lIHdpdGggb25lIG9mICJidXN5Ym94IC0taW5zdGFsbCIgKGZvcgoraGFyZGxpbmtzKSBvciAiYnVzeWJveCAtLWluc3RhbGwgLXMiIChmb3Igc3ltbGlua3MpLgorCitJZiB5b3UgZW5hYmxlZCB0aGUgYnVzeWJveCBzaGFyZWQgbGlicmFyeSBmZWF0dXJlIChsaWJidXN5Ym94LnNvKSBhbmQgd2FudAordG8gcnVuIHRlc3RzIHdpdGhvdXQgaW5zdGFsbGluZywgc2V0IHlvdXIgTERfTElCUkFSWV9QQVRIIGFjY29yZGluZ2x5IHdoZW4KK3J1bm5pbmcgdGhlIGV4ZWN1dGFibGU6CisKKyAgTERfTElCUkFSWV9QQVRIPWBwd2RgIC4vYnVzeWJveAorCitCdWlsZGluZyBvdXQtb2YtdHJlZToKKz09PT09PT09PT09PT09PT09PT09PQorCitCeSBkZWZhdWx0LCB0aGUgQnVzeUJveCBidWlsZCBwdXRzIGl0cyB0ZW1wb3JhcnkgZmlsZXMgaW4gdGhlIHNvdXJjZSB0cmVlLgorQnVpbGRpbmcgZnJvbSBhIHJlYWQtb25seSBzb3VyY2UgdHJlZSwgb3IgYnVpbGRpbmcgbXVsdGlwbGUgY29uZmlndXJhdGlvbnMgZnJvbQordGhlIHNhbWUgc291cmNlIGRpcmVjdG9yeSwgcmVxdWlyZXMgdGhlIGFiaWxpdHkgdG8gcHV0IHRoZSB0ZW1wb3JhcnkgZmlsZXMKK3NvbWV3aGVyZSBlbHNlLgorCitUbyBidWlsZCBvdXQgb2YgdHJlZSwgY2QgdG8gYW4gZW1wdHkgZGlyZWN0b3J5IGFuZCBjb25maWd1cmUgYnVzeWJveCBmcm9tIHRoZXJlOgorCisgIG1ha2UgS0JVSUxEX1NSQz0vcGF0aC90by9zb3VyY2UgLWYgL3BhdGgvdG8vc291cmNlL01ha2VmaWxlIGRlZmNvbmZpZworICBtYWtlCisgIG1ha2UgaW5zdGFsbAorCitBbHRlcm5hdGVseSwgdXNlIHRoZSBPPSRCVUlMRFBBVEggb3B0aW9uICh3aXRoIGFuIGFic29sdXRlIHBhdGgpIGR1cmluZyB0aGUKK2NvbmZpZ3VyYXRpb24gc3RlcCwgYXMgaW46CisKKyAgbWFrZSBPPS9zb21lL2VtcHR5L2RpcmVjdG9yeSBhbGx5ZXNjb25maWcKKyAgY2QgL3NvbWUvZW1wdHkvZGlyZWN0b3J5CisgIG1ha2UKKyAgbWFrZSBDT05GSUdfUFJFRklYPS4gaW5zdGFsbAorCitNb3JlIEluZm9ybWF0aW9uOgorPT09PT09PT09PT09PT09PT0KKworU2UgYWxzbyB0aGUgYnVzeWJveCBGQVEsIHVuZGVyIHRoZSBxdWVzdGlvbnMgIkhvdyBjYW4gSSBnZXQgc3RhcnRlZCB1c2luZworQnVzeUJveCIgYW5kICJIb3cgZG8gSSBidWlsZCBhIEJ1c3lCb3gtYmFzZWQgc3lzdGVtPyIgIFRoZSBCdXN5Qm94IEZBUSBpcworYXZhaWxhYmxlIGZyb20gaHR0cDovL3d3dy5idXN5Ym94Lm5ldC9GQVEuaHRtbApkaWZmIC0tZ2l0IGEvTElDRU5TRSBiL0xJQ0VOU0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY1MGE3MQotLS0gL2Rldi9udWxsCisrKyBiL0xJQ0VOU0UKQEAgLTAsMCArMSwzNDggQEAKKy0tLSBBIG5vdGUgb24gR1BMIHZlcnNpb25zCisKK0J1c3lCb3ggaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdmVyc2lvbiAyIG9mIHRoZSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChpbmNsdWRlZAoraW4gaXRzIGVudGlyZXR5LCBiZWxvdykuICBWZXJzaW9uIDIgaXMgdGhlIG9ubHkgdmVyc2lvbiBvZiB0aGlzIGxpY2Vuc2Ugd2hpY2gKK3RoaXMgdmVyc2lvbiBvZiBCdXN5Qm94IChvciBtb2RpZmllZCB2ZXJzaW9ucyBkZXJpdmVkIGZyb20gdGhpcyBvbmUpIG1heSBiZQorZGlzdHJpYnV0ZWQgdW5kZXIuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKwkJICAgICAgIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAgMDIxMTAtMTMwMSAgVVNBCisgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKwkJCSAgICBQcmVhbWJsZQorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhcmUgZGVzaWduZWQgdG8gdGFrZSBhd2F5IHlvdXIKK2ZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBpdC4gIEJ5IGNvbnRyYXN0LCB0aGUgR05VIEdlbmVyYWwgUHVibGljCitMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlCitzb2Z0d2FyZS0tdG8gbWFrZSBzdXJlIHRoZSBzb2Z0d2FyZSBpcyBmcmVlIGZvciBhbGwgaXRzIHVzZXJzLiAgVGhpcworR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcHBsaWVzIHRvIG1vc3Qgb2YgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQgdG8gYW55IG90aGVyIHByb2dyYW0gd2hvc2UgYXV0aG9ycyBjb21taXQgdG8KK3VzaW5nIGl0LiAgKFNvbWUgb3RoZXIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHNvZnR3YXJlIGlzIGNvdmVyZWQgYnkKK3RoZSBHTlUgTGlicmFyeSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoaXMgc2VydmljZSBpZiB5b3Ugd2lzaCksIHRoYXQgeW91IHJlY2VpdmUgc291cmNlIGNvZGUgb3IgY2FuIGdldCBpdAoraWYgeW91IHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQKK2luIG5ldyBmcmVlIHByb2dyYW1zOyBhbmQgdGhhdCB5b3Uga25vdyB5b3UgY2FuIGRvIHRoZXNlIHRoaW5ncy4KKworICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkCithbnlvbmUgdG8gZGVueSB5b3UgdGhlc2UgcmlnaHRzIG9yIHRvIGFzayB5b3UgdG8gc3VycmVuZGVyIHRoZSByaWdodHMuCitUaGVzZSByZXN0cmljdGlvbnMgdHJhbnNsYXRlIHRvIGNlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBmb3IgeW91IGlmIHlvdQorZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgIEZvciBleGFtcGxlLCBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2Ygc3VjaCBhIHByb2dyYW0sIHdoZXRoZXIKK2dyYXRpcyBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdAoreW91IGhhdmUuICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUKK3NvdXJjZSBjb2RlLiAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIKK3JpZ2h0cy4KKworICBXZSBwcm90ZWN0IHlvdXIgcmlnaHRzIHdpdGggdHdvIHN0ZXBzOiAoMSkgY29weXJpZ2h0IHRoZSBzb2Z0d2FyZSwgYW5kCisoMikgb2ZmZXIgeW91IHRoaXMgbGljZW5zZSB3aGljaCBnaXZlcyB5b3UgbGVnYWwgcGVybWlzc2lvbiB0byBjb3B5LAorZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICBBbHNvLCBmb3IgZWFjaCBhdXRob3IncyBwcm90ZWN0aW9uIGFuZCBvdXJzLCB3ZSB3YW50IHRvIG1ha2UgY2VydGFpbgordGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKK3NvZnR3YXJlLiAgSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQord2FudCBpdHMgcmVjaXBpZW50cyB0byBrbm93IHRoYXQgd2hhdCB0aGV5IGhhdmUgaXMgbm90IHRoZSBvcmlnaW5hbCwgc28KK3RoYXQgYW55IHByb2JsZW1zIGludHJvZHVjZWQgYnkgb3RoZXJzIHdpbGwgbm90IHJlZmxlY3Qgb24gdGhlIG9yaWdpbmFsCithdXRob3JzJyByZXB1dGF0aW9ucy4KKworICBGaW5hbGx5LCBhbnkgZnJlZSBwcm9ncmFtIGlzIHRocmVhdGVuZWQgY29uc3RhbnRseSBieSBzb2Z0d2FyZQorcGF0ZW50cy4gIFdlIHdpc2ggdG8gYXZvaWQgdGhlIGRhbmdlciB0aGF0IHJlZGlzdHJpYnV0b3JzIG9mIGEgZnJlZQorcHJvZ3JhbSB3aWxsIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZQorcHJvZ3JhbSBwcm9wcmlldGFyeS4gIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55CitwYXRlbnQgbXVzdCBiZSBsaWNlbnNlZCBmb3IgZXZlcnlvbmUncyBmcmVlIHVzZSBvciBub3QgbGljZW5zZWQgYXQgYWxsLgorCisgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCittb2RpZmljYXRpb24gZm9sbG93LgorDAorCQkgICAgR05VIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgIDAuIFRoaXMgTGljZW5zZSBhcHBsaWVzIHRvIGFueSBwcm9ncmFtIG9yIG90aGVyIHdvcmsgd2hpY2ggY29udGFpbnMKK2Egbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkCit1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLiAgVGhlICJQcm9ncmFtIiwgYmVsb3csCityZWZlcnMgdG8gYW55IHN1Y2ggcHJvZ3JhbSBvciB3b3JrLCBhbmQgYSAid29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbSIKK21lYW5zIGVpdGhlciB0aGUgUHJvZ3JhbSBvciBhbnkgZGVyaXZhdGl2ZSB3b3JrIHVuZGVyIGNvcHlyaWdodCBsYXc6Cit0aGF0IGlzIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LAorZWl0aGVyIHZlcmJhdGltIG9yIHdpdGggbW9kaWZpY2F0aW9ucyBhbmQvb3IgdHJhbnNsYXRlZCBpbnRvIGFub3RoZXIKK2xhbmd1YWdlLiAgKEhlcmVpbmFmdGVyLCB0cmFuc2xhdGlvbiBpcyBpbmNsdWRlZCB3aXRob3V0IGxpbWl0YXRpb24gaW4KK3RoZSB0ZXJtICJtb2RpZmljYXRpb24iLikgIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLgorCitBY3Rpdml0aWVzIG90aGVyIHRoYW4gY29weWluZywgZGlzdHJpYnV0aW9uIGFuZCBtb2RpZmljYXRpb24gYXJlIG5vdAorY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiAgVGhlIGFjdCBvZgorcnVubmluZyB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbQoraXMgY292ZXJlZCBvbmx5IGlmIGl0cyBjb250ZW50cyBjb25zdGl0dXRlIGEgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0gKGluZGVwZW5kZW50IG9mIGhhdmluZyBiZWVuIG1hZGUgYnkgcnVubmluZyB0aGUgUHJvZ3JhbSkuCitXaGV0aGVyIHRoYXQgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAxLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzIG9mIHRoZSBQcm9ncmFtJ3MKK3NvdXJjZSBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdQorY29uc3BpY3VvdXNseSBhbmQgYXBwcm9wcmlhdGVseSBwdWJsaXNoIG9uIGVhY2ggY29weSBhbiBhcHByb3ByaWF0ZQorY29weXJpZ2h0IG5vdGljZSBhbmQgZGlzY2xhaW1lciBvZiB3YXJyYW50eTsga2VlcCBpbnRhY3QgYWxsIHRoZQorbm90aWNlcyB0aGF0IHJlZmVyIHRvIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OworYW5kIGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFByb2dyYW0gYSBjb3B5IG9mIHRoaXMgTGljZW5zZQorYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworWW91IG1heSBjaGFyZ2UgYSBmZWUgZm9yIHRoZSBwaHlzaWNhbCBhY3Qgb2YgdHJhbnNmZXJyaW5nIGEgY29weSwgYW5kCit5b3UgbWF5IGF0IHlvdXIgb3B0aW9uIG9mZmVyIHdhcnJhbnR5IHByb3RlY3Rpb24gaW4gZXhjaGFuZ2UgZm9yIGEgZmVlLgorCisgIDIuIFlvdSBtYXkgbW9kaWZ5IHlvdXIgY29weSBvciBjb3BpZXMgb2YgdGhlIFByb2dyYW0gb3IgYW55IHBvcnRpb24KK29mIGl0LCB0aHVzIGZvcm1pbmcgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBhbmQgY29weSBhbmQKK2Rpc3RyaWJ1dGUgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMQorYWJvdmUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gbWVldCBhbGwgb2YgdGhlc2UgY29uZGl0aW9uczoKKworICAgIGEpIFlvdSBtdXN0IGNhdXNlIHRoZSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICBiKSBZb3UgbXVzdCBjYXVzZSBhbnkgd29yayB0aGF0IHlvdSBkaXN0cmlidXRlIG9yIHB1Ymxpc2gsIHRoYXQgaW4KKyAgICB3aG9sZSBvciBpbiBwYXJ0IGNvbnRhaW5zIG9yIGlzIGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSBvciBhbnkKKyAgICBwYXJ0IHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZAorICAgIHBhcnRpZXMgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZS4KKworICAgIGMpIElmIHRoZSBtb2RpZmllZCBwcm9ncmFtIG5vcm1hbGx5IHJlYWRzIGNvbW1hbmRzIGludGVyYWN0aXZlbHkKKyAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgaW50ZXJhY3RpdmUgdXNlIGluIHRoZSBtb3N0IG9yZGluYXJ5IHdheSwgdG8gcHJpbnQgb3IgZGlzcGxheSBhbgorICAgIGFubm91bmNlbWVudCBpbmNsdWRpbmcgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSBhbmQgYQorICAgIG5vdGljZSB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZQorICAgIGEgd2FycmFudHkpIGFuZCB0aGF0IHVzZXJzIG1heSByZWRpc3RyaWJ1dGUgdGhlIHByb2dyYW0gdW5kZXIKKyAgICB0aGVzZSBjb25kaXRpb25zLCBhbmQgdGVsbGluZyB0aGUgdXNlciBob3cgdG8gdmlldyBhIGNvcHkgb2YgdGhpcworICAgIExpY2Vuc2UuICAoRXhjZXB0aW9uOiBpZiB0aGUgUHJvZ3JhbSBpdHNlbGYgaXMgaW50ZXJhY3RpdmUgYnV0CisgICAgZG9lcyBub3Qgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbgorICAgIHRoZSBQcm9ncmFtIGlzIG5vdCByZXF1aXJlZCB0byBwcmludCBhbiBhbm5vdW5jZW1lbnQuKQorDAorVGhlc2UgcmVxdWlyZW1lbnRzIGFwcGx5IHRvIHRoZSBtb2RpZmllZCB3b3JrIGFzIGEgd2hvbGUuICBJZgoraWRlbnRpZmlhYmxlIHNlY3Rpb25zIG9mIHRoYXQgd29yayBhcmUgbm90IGRlcml2ZWQgZnJvbSB0aGUgUHJvZ3JhbSwKK2FuZCBjYW4gYmUgcmVhc29uYWJseSBjb25zaWRlcmVkIGluZGVwZW5kZW50IGFuZCBzZXBhcmF0ZSB3b3JrcyBpbgordGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorc2VjdGlvbnMgd2hlbiB5b3UgZGlzdHJpYnV0ZSB0aGVtIGFzIHNlcGFyYXRlIHdvcmtzLiAgQnV0IHdoZW4geW91CitkaXN0cmlidXRlIHRoZSBzYW1lIHNlY3Rpb25zIGFzIHBhcnQgb2YgYSB3aG9sZSB3aGljaCBpcyBhIHdvcmsgYmFzZWQKK29uIHRoZSBQcm9ncmFtLCB0aGUgZGlzdHJpYnV0aW9uIG9mIHRoZSB3aG9sZSBtdXN0IGJlIG9uIHRoZSB0ZXJtcyBvZgordGhpcyBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUKK2VudGlyZSB3aG9sZSwgYW5kIHRodXMgdG8gZWFjaCBhbmQgZXZlcnkgcGFydCByZWdhcmRsZXNzIG9mIHdobyB3cm90ZSBpdC4KKworVGh1cywgaXQgaXMgbm90IHRoZSBpbnRlbnQgb2YgdGhpcyBzZWN0aW9uIHRvIGNsYWltIHJpZ2h0cyBvciBjb250ZXN0Cit5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KK2V4ZXJjaXNlIHRoZSByaWdodCB0byBjb250cm9sIHRoZSBkaXN0cmlidXRpb24gb2YgZGVyaXZhdGl2ZSBvcgorY29sbGVjdGl2ZSB3b3JrcyBiYXNlZCBvbiB0aGUgUHJvZ3JhbS4KKworSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQord2l0aCB0aGUgUHJvZ3JhbSAob3Igd2l0aCBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0pIG9uIGEgdm9sdW1lIG9mCithIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSBkb2VzIG5vdCBicmluZyB0aGUgb3RoZXIgd29yayB1bmRlcgordGhlIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAzLiBZb3UgbWF5IGNvcHkgYW5kIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGEgd29yayBiYXNlZCBvbiBpdCwKK3VuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorU2VjdGlvbnMgMSBhbmQgMiBhYm92ZSBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgorCisgICAgYSkgQWNjb21wYW55IGl0IHdpdGggdGhlIGNvbXBsZXRlIGNvcnJlc3BvbmRpbmcgbWFjaGluZS1yZWFkYWJsZQorICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucworICAgIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgYikgQWNjb21wYW55IGl0IHdpdGggYSB3cml0dGVuIG9mZmVyLCB2YWxpZCBmb3IgYXQgbGVhc3QgdGhyZWUKKyAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91cgorICAgIGNvc3Qgb2YgcGh5c2ljYWxseSBwZXJmb3JtaW5nIHNvdXJjZSBkaXN0cmlidXRpb24sIGEgY29tcGxldGUKKyAgICBtYWNoaW5lLXJlYWRhYmxlIGNvcHkgb2YgdGhlIGNvcnJlc3BvbmRpbmcgc291cmNlIGNvZGUsIHRvIGJlCisgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KKyAgICBjdXN0b21hcmlseSB1c2VkIGZvciBzb2Z0d2FyZSBpbnRlcmNoYW5nZTsgb3IsCisKKyAgICBjKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgaW5mb3JtYXRpb24geW91IHJlY2VpdmVkIGFzIHRvIHRoZSBvZmZlcgorICAgIHRvIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gIChUaGlzIGFsdGVybmF0aXZlIGlzCisgICAgYWxsb3dlZCBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UKKyAgICByZWNlaXZlZCB0aGUgcHJvZ3JhbSBpbiBvYmplY3QgY29kZSBvciBleGVjdXRhYmxlIGZvcm0gd2l0aCBzdWNoCisgICAgYW4gb2ZmZXIsIGluIGFjY29yZCB3aXRoIFN1YnNlY3Rpb24gYiBhYm92ZS4pCisKK1RoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKK21ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlCitjb2RlIG1lYW5zIGFsbCB0aGUgc291cmNlIGNvZGUgZm9yIGFsbCBtb2R1bGVzIGl0IGNvbnRhaW5zLCBwbHVzIGFueQorYXNzb2NpYXRlZCBpbnRlcmZhY2UgZGVmaW5pdGlvbiBmaWxlcywgcGx1cyB0aGUgc2NyaXB0cyB1c2VkIHRvCitjb250cm9sIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuICBIb3dldmVyLCBhcyBhCitzcGVjaWFsIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUKK2FueXRoaW5nIHRoYXQgaXMgbm9ybWFsbHkgZGlzdHJpYnV0ZWQgKGluIGVpdGhlciBzb3VyY2Ugb3IgYmluYXJ5Citmb3JtKSB3aXRoIHRoZSBtYWpvciBjb21wb25lbnRzIChjb21waWxlciwga2VybmVsLCBhbmQgc28gb24pIG9mIHRoZQorb3BlcmF0aW5nIHN5c3RlbSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQKK2l0c2VsZiBhY2NvbXBhbmllcyB0aGUgZXhlY3V0YWJsZS4KKworSWYgZGlzdHJpYnV0aW9uIG9mIGV4ZWN1dGFibGUgb3Igb2JqZWN0IGNvZGUgaXMgbWFkZSBieSBvZmZlcmluZworYWNjZXNzIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudAorYWNjZXNzIHRvIGNvcHkgdGhlIHNvdXJjZSBjb2RlIGZyb20gdGhlIHNhbWUgcGxhY2UgY291bnRzIGFzCitkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZSBjb2RlLCBldmVuIHRob3VnaCB0aGlyZCBwYXJ0aWVzIGFyZSBub3QKK2NvbXBlbGxlZCB0byBjb3B5IHRoZSBzb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisMCisgIDQuIFlvdSBtYXkgbm90IGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSwgb3IgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbQorZXhjZXB0IGFzIGV4cHJlc3NseSBwcm92aWRlZCB1bmRlciB0aGlzIExpY2Vuc2UuICBBbnkgYXR0ZW1wdAorb3RoZXJ3aXNlIHRvIGNvcHksIG1vZGlmeSwgc3VibGljZW5zZSBvciBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIGlzCit2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuCitIb3dldmVyLCBwYXJ0aWVzIHdobyBoYXZlIHJlY2VpdmVkIGNvcGllcywgb3IgcmlnaHRzLCBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlIHdpbGwgbm90IGhhdmUgdGhlaXIgbGljZW5zZXMgdGVybWluYXRlZCBzbyBsb25nIGFzIHN1Y2gKK3BhcnRpZXMgcmVtYWluIGluIGZ1bGwgY29tcGxpYW5jZS4KKworICA1LiBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlLCBzaW5jZSB5b3UgaGF2ZSBub3QKK3NpZ25lZCBpdC4gIEhvd2V2ZXIsIG5vdGhpbmcgZWxzZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gbW9kaWZ5IG9yCitkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiAgVGhlc2UgYWN0aW9ucyBhcmUKK3Byb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gIFRoZXJlZm9yZSwgYnkKK21vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorUHJvZ3JhbSksIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLCBhbmQKK2FsbCBpdHMgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIGNvcHlpbmcsIGRpc3RyaWJ1dGluZyBvciBtb2RpZnlpbmcKK3RoZSBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgIDYuIEVhY2ggdGltZSB5b3UgcmVkaXN0cmlidXRlIHRoZSBQcm9ncmFtIChvciBhbnkgd29yayBiYXNlZCBvbiB0aGUKK1Byb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCitvcmlnaW5hbCBsaWNlbnNvciB0byBjb3B5LCBkaXN0cmlidXRlIG9yIG1vZGlmeSB0aGUgUHJvZ3JhbSBzdWJqZWN0IHRvCit0aGVzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucy4gIFlvdSBtYXkgbm90IGltcG9zZSBhbnkgZnVydGhlcgorcmVzdHJpY3Rpb25zIG9uIHRoZSByZWNpcGllbnRzJyBleGVyY2lzZSBvZiB0aGUgcmlnaHRzIGdyYW50ZWQgaGVyZWluLgorWW91IGFyZSBub3QgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8KK3RoaXMgTGljZW5zZS4KKworICA3LiBJZiwgYXMgYSBjb25zZXF1ZW5jZSBvZiBhIGNvdXJ0IGp1ZGdtZW50IG9yIGFsbGVnYXRpb24gb2YgcGF0ZW50CitpbmZyaW5nZW1lbnQgb3IgZm9yIGFueSBvdGhlciByZWFzb24gKG5vdCBsaW1pdGVkIHRvIHBhdGVudCBpc3N1ZXMpLAorY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorb3RoZXJ3aXNlKSB0aGF0IGNvbnRyYWRpY3QgdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLCB0aGV5IGRvIG5vdAorZXhjdXNlIHlvdSBmcm9tIHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZS4gIElmIHlvdSBjYW5ub3QKK2Rpc3RyaWJ1dGUgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UKK21heSBub3QgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSBhdCBhbGwuICBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQKK2xpY2Vuc2Ugd291bGQgbm90IHBlcm1pdCByb3lhbHR5LWZyZWUgcmVkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0gYnkKK2FsbCB0aG9zZSB3aG8gcmVjZWl2ZSBjb3BpZXMgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSB0aHJvdWdoIHlvdSwgdGhlbgordGhlIG9ubHkgd2F5IHlvdSBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0bworcmVmcmFpbiBlbnRpcmVseSBmcm9tIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbS4KKworSWYgYW55IHBvcnRpb24gb2YgdGhpcyBzZWN0aW9uIGlzIGhlbGQgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCithbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCithcHBseSBhbmQgdGhlIHNlY3Rpb24gYXMgYSB3aG9sZSBpcyBpbnRlbmRlZCB0byBhcHBseSBpbiBvdGhlcgorY2lyY3Vtc3RhbmNlcy4KKworSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorcGF0ZW50cyBvciBvdGhlciBwcm9wZXJ0eSByaWdodCBjbGFpbXMgb3IgdG8gY29udGVzdCB2YWxpZGl0eSBvZiBhbnkKK3N1Y2ggY2xhaW1zOyB0aGlzIHNlY3Rpb24gaGFzIHRoZSBzb2xlIHB1cnBvc2Ugb2YgcHJvdGVjdGluZyB0aGUKK2ludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcworaW1wbGVtZW50ZWQgYnkgcHVibGljIGxpY2Vuc2UgcHJhY3RpY2VzLiAgTWFueSBwZW9wbGUgaGF2ZSBtYWRlCitnZW5lcm91cyBjb250cmlidXRpb25zIHRvIHRoZSB3aWRlIHJhbmdlIG9mIHNvZnR3YXJlIGRpc3RyaWJ1dGVkCit0aHJvdWdoIHRoYXQgc3lzdGVtIGluIHJlbGlhbmNlIG9uIGNvbnNpc3RlbnQgYXBwbGljYXRpb24gb2YgdGhhdAorc3lzdGVtOyBpdCBpcyB1cCB0byB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZwordG8gZGlzdHJpYnV0ZSBzb2Z0d2FyZSB0aHJvdWdoIGFueSBvdGhlciBzeXN0ZW0gYW5kIGEgbGljZW5zZWUgY2Fubm90CitpbXBvc2UgdGhhdCBjaG9pY2UuCisKK1RoaXMgc2VjdGlvbiBpcyBpbnRlbmRlZCB0byBtYWtlIHRob3JvdWdobHkgY2xlYXIgd2hhdCBpcyBiZWxpZXZlZCB0bworYmUgYSBjb25zZXF1ZW5jZSBvZiB0aGUgcmVzdCBvZiB0aGlzIExpY2Vuc2UuCisMCisgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCitjZXJ0YWluIGNvdW50cmllcyBlaXRoZXIgYnkgcGF0ZW50cyBvciBieSBjb3B5cmlnaHRlZCBpbnRlcmZhY2VzLCB0aGUKK29yaWdpbmFsIGNvcHlyaWdodCBob2xkZXIgd2hvIHBsYWNlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIExpY2Vuc2UKK21heSBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZwordGhvc2UgY291bnRyaWVzLCBzbyB0aGF0IGRpc3RyaWJ1dGlvbiBpcyBwZXJtaXR0ZWQgb25seSBpbiBvciBhbW9uZworY291bnRyaWVzIG5vdCB0aHVzIGV4Y2x1ZGVkLiAgSW4gc3VjaCBjYXNlLCB0aGlzIExpY2Vuc2UgaW5jb3Jwb3JhdGVzCit0aGUgbGltaXRhdGlvbiBhcyBpZiB3cml0dGVuIGluIHRoZSBib2R5IG9mIHRoaXMgTGljZW5zZS4KKworICA5LiBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucworb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZnJvbSB0aW1lIHRvIHRpbWUuICBTdWNoIG5ldyB2ZXJzaW9ucyB3aWxsCitiZSBzaW1pbGFyIGluIHNwaXJpdCB0byB0aGUgcHJlc2VudCB2ZXJzaW9uLCBidXQgbWF5IGRpZmZlciBpbiBkZXRhaWwgdG8KK2FkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCitFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZSBQcm9ncmFtCitzcGVjaWZpZXMgYSB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIExpY2Vuc2Ugd2hpY2ggYXBwbGllcyB0byBpdCBhbmQgImFueQorbGF0ZXIgdmVyc2lvbiIsIHlvdSBoYXZlIHRoZSBvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucworZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKK1NvZnR3YXJlIEZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YKK3RoaXMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uCisKKyAgMTAuIElmIHlvdSB3aXNoIHRvIGluY29ycG9yYXRlIHBhcnRzIG9mIHRoZSBQcm9ncmFtIGludG8gb3RoZXIgZnJlZQorcHJvZ3JhbXMgd2hvc2UgZGlzdHJpYnV0aW9uIGNvbmRpdGlvbnMgYXJlIGRpZmZlcmVudCwgd3JpdGUgdG8gdGhlIGF1dGhvcgordG8gYXNrIGZvciBwZXJtaXNzaW9uLiAgRm9yIHNvZnR3YXJlIHdoaWNoIGlzIGNvcHlyaWdodGVkIGJ5IHRoZSBGcmVlCitTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZSBzb21ldGltZXMKK21ha2UgZXhjZXB0aW9ucyBmb3IgdGhpcy4gIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUgdHdvIGdvYWxzCitvZiBwcmVzZXJ2aW5nIHRoZSBmcmVlIHN0YXR1cyBvZiBhbGwgZGVyaXZhdGl2ZXMgb2Ygb3VyIGZyZWUgc29mdHdhcmUgYW5kCitvZiBwcm9tb3RpbmcgdGhlIHNoYXJpbmcgYW5kIHJldXNlIG9mIHNvZnR3YXJlIGdlbmVyYWxseS4KKworCQkJICAgIE5PIFdBUlJBTlRZCisKKyAgMTEuIEJFQ0FVU0UgVEhFIFBST0dSQU0gSVMgTElDRU5TRUQgRlJFRSBPRiBDSEFSR0UsIFRIRVJFIElTIE5PIFdBUlJBTlRZCitGT1IgVEhFIFBST0dSQU0sIFRPIFRIRSBFWFRFTlQgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4KK09USEVSV0lTRSBTVEFURUQgSU4gV1JJVElORyBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMKK1BST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VECitPUiBJTVBMSUVELCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUworVE8gVEhFIFFVQUxJVFkgQU5EIFBFUkZPUk1BTkNFIE9GIFRIRSBQUk9HUkFNIElTIFdJVEggWU9VLiAgU0hPVUxEIFRIRQorUFJPR1JBTSBQUk9WRSBERUZFQ1RJVkUsIFlPVSBBU1NVTUUgVEhFIENPU1QgT0YgQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsCitSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAxMi4gSU4gTk8gRVZFTlQgVU5MRVNTIFJFUVVJUkVEIEJZIEFQUExJQ0FCTEUgTEFXIE9SIEFHUkVFRCBUTyBJTiBXUklUSU5HCitXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkgQU5EL09SCitSRURJU1RSSUJVVEUgVEhFIFBST0dSQU0gQVMgUEVSTUlUVEVEIEFCT1ZFLCBCRSBMSUFCTEUgVE8gWU9VIEZPUiBEQU1BR0VTLAorSU5DTFVESU5HIEFOWSBHRU5FUkFMLCBTUEVDSUFMLCBJTkNJREVOVEFMIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBBUklTSU5HCitPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNIChJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVECitUTyBMT1NTIE9GIERBVEEgT1IgREFUQSBCRUlORyBSRU5ERVJFRCBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkKK1lPVSBPUiBUSElSRCBQQVJUSUVTIE9SIEEgRkFJTFVSRSBPRiBUSEUgUFJPR1JBTSBUTyBPUEVSQVRFIFdJVEggQU5ZIE9USEVSCitQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IgT1RIRVIgUEFSVFkgSEFTIEJFRU4gQURWSVNFRCBPRiBUSEUKK1BPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworCQkgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworDAorCSAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorY29udmV5IHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QKK3RoZSAiY29weXJpZ2h0IiBsaW5lIGFuZCBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGZ1bGwgbm90aWNlIGlzIGZvdW5kLgorCisgICAgPG9uZSBsaW5lIHRvIGdpdmUgdGhlIHByb2dyYW0ncyBuYW1lIGFuZCBhIGJyaWVmIGlkZWEgb2Ygd2hhdCBpdCBkb2VzLj4KKyAgICBDb3B5cmlnaHQgKEMpIDx5ZWFyPiAgPG5hbWUgb2YgYXV0aG9yPgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BICAwMjExMC0xMzAxICBVU0EKKworCitBbHNvIGFkZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gY29udGFjdCB5b3UgYnkgZWxlY3Ryb25pYyBhbmQgcGFwZXIgbWFpbC4KKworSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcword2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIEdub21vdmlzaW9uIHZlcnNpb24gNjksIENvcHlyaWdodCAoQykgeWVhciAgbmFtZSBvZiBhdXRob3IKKyAgICBHbm9tb3Zpc2lvbiBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFk7IGZvciBkZXRhaWxzIHR5cGUgYHNob3cgdycuCisgICAgVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZSBpdAorICAgIHVuZGVyIGNlcnRhaW4gY29uZGl0aW9uczsgdHlwZSBgc2hvdyBjJyBmb3IgZGV0YWlscy4KKworVGhlIGh5cG90aGV0aWNhbCBjb21tYW5kcyBgc2hvdyB3JyBhbmQgYHNob3cgYycgc2hvdWxkIHNob3cgdGhlIGFwcHJvcHJpYXRlCitwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gIE9mIGNvdXJzZSwgdGhlIGNvbW1hbmRzIHlvdSB1c2UgbWF5CitiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5IGNvdWxkIGV2ZW4gYmUKK21vdXNlLWNsaWNrcyBvciBtZW51IGl0ZW1zLS13aGF0ZXZlciBzdWl0cyB5b3VyIHByb2dyYW0uCisKK1lvdSBzaG91bGQgYWxzbyBnZXQgeW91ciBlbXBsb3llciAoaWYgeW91IHdvcmsgYXMgYSBwcm9ncmFtbWVyKSBvciB5b3VyCitzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorbmVjZXNzYXJ5LiAgSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlIHByb2dyYW0KKyAgYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieSBKYW1lcyBIYWNrZXIuCisKKyAgPHNpZ25hdHVyZSBvZiBUeSBDb29uPiwgMSBBcHJpbCAxOTg5CisgIFR5IENvb24sIFByZXNpZGVudCBvZiBWaWNlCisKK1RoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0gaW50bworcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdSBtYXkKK2NvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoIHRoZQorbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeSBHZW5lcmFsCitQdWJsaWMgTGljZW5zZSBpbnN0ZWFkIG9mIHRoaXMgTGljZW5zZS4KZGlmZiAtLWdpdCBhL01ha2VmaWxlIGIvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE5ZGQzZAotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlCkBAIC0wLDAgKzEsMTMyNSBAQAorVkVSU0lPTiA9IDEKK1BBVENITEVWRUwgPSAyNAorU1VCTEVWRUwgPSAxCitFWFRSQVZFUlNJT04gPQorTkFNRSA9IFVubmFtZWQKKworIyAqRE9DVU1FTlRBVElPTioKKyMgVG8gc2VlIGEgbGlzdCBvZiB0eXBpY2FsIHRhcmdldHMgZXhlY3V0ZSAibWFrZSBoZWxwIgorIyBNb3JlIGluZm8gY2FuIGJlIGxvY2F0ZWQgaW4gLi9SRUFETUUKKyMgQ29tbWVudHMgaW4gdGhpcyBmaWxlIGFyZSB0YXJnZXRlZCBvbmx5IHRvIHRoZSBkZXZlbG9wZXIsIGRvIG5vdAorIyBleHBlY3QgdG8gbGVhcm4gaG93IHRvIGJ1aWxkIHRoZSBrZXJuZWwgcmVhZGluZyB0aGlzIGZpbGUuCisKKyMgRG8gbm90IHByaW50ICJFbnRlcmluZyBkaXJlY3RvcnkgLi4uIgorTUFLRUZMQUdTICs9IC0tbm8tcHJpbnQtZGlyZWN0b3J5CisKKyMgV2UgYXJlIHVzaW5nIGEgcmVjdXJzaXZlIGJ1aWxkLCBzbyB3ZSBuZWVkIHRvIGRvIGEgbGl0dGxlIHRoaW5raW5nCisjIHRvIGdldCB0aGUgb3JkZXJpbmcgcmlnaHQuCisjCisjIE1vc3QgaW1wb3J0YW50bHk6IHN1Yi1NYWtlZmlsZXMgc2hvdWxkIG9ubHkgZXZlciBtb2RpZnkgZmlsZXMgaW4KKyMgdGhlaXIgb3duIGRpcmVjdG9yeS4gSWYgaW4gc29tZSBkaXJlY3Rvcnkgd2UgaGF2ZSBhIGRlcGVuZGVuY3kgb24KKyMgYSBmaWxlIGluIGFub3RoZXIgZGlyICh3aGljaCBkb2Vzbid0IGhhcHBlbiBvZnRlbiwgYnV0IGl0J3Mgb2Z0ZW4KKyMgdW5hdm9pZGFibGUgd2hlbiBsaW5raW5nIHRoZSBidWlsdC1pbi5vIHRhcmdldHMgd2hpY2ggZmluYWxseQorIyB0dXJuIGludG8gYnVzeWJveCksIHdlIHdpbGwgY2FsbCBhIHN1YiBtYWtlIGluIHRoYXQgb3RoZXIgZGlyLCBhbmQKKyMgYWZ0ZXIgdGhhdCB3ZSBhcmUgc3VyZSB0aGF0IGV2ZXJ5dGhpbmcgd2hpY2ggaXMgaW4gdGhhdCBvdGhlciBkaXIKKyMgaXMgbm93IHVwIHRvIGRhdGUuCisjCisjIFRoZSBvbmx5IGNhc2VzIHdoZXJlIHdlIG5lZWQgdG8gbW9kaWZ5IGZpbGVzIHdoaWNoIGhhdmUgZ2xvYmFsCisjIGVmZmVjdHMgYXJlIHRodXMgc2VwYXJhdGVkIG91dCBhbmQgZG9uZSBiZWZvcmUgdGhlIHJlY3Vyc2l2ZQorIyBkZXNjZW5kaW5nIGlzIHN0YXJ0ZWQuIFRoZXkgYXJlIG5vdyBleHBsaWNpdGx5IGxpc3RlZCBhcyB0aGUKKyMgcHJlcGFyZSBydWxlLgorCisjIFRvIHB1dCBtb3JlIGZvY3VzIG9uIHdhcm5pbmdzLCBiZSBsZXNzIHZlcmJvc2UgYXMgZGVmYXVsdAorIyBVc2UgJ21ha2UgVj0xJyB0byBzZWUgdGhlIGZ1bGwgY29tbWFuZHMKKworaWZkZWYgVgorICBpZmVxICgiJChvcmlnaW4gVikiLCAiY29tbWFuZCBsaW5lIikKKyAgICBLQlVJTERfVkVSQk9TRSA9ICQoVikKKyAgZW5kaWYKK2VuZGlmCitpZm5kZWYgS0JVSUxEX1ZFUkJPU0UKKyAgS0JVSUxEX1ZFUkJPU0UgPSAwCitlbmRpZgorCisjIENhbGwgc3BhcnNlIGFzIHBhcnQgb2YgY29tcGlsYXRpb24gb2YgQyBmaWxlcworIyBVc2UgJ21ha2UgQz0xJyB0byBlbmFibGUgc3BhcnNlIGNoZWNraW5nCisKK2lmZGVmIEMKKyAgaWZlcSAoIiQob3JpZ2luIEMpIiwgImNvbW1hbmQgbGluZSIpCisgICAgS0JVSUxEX0NIRUNLU1JDID0gJChDKQorICBlbmRpZgorZW5kaWYKK2lmbmRlZiBLQlVJTERfQ0hFQ0tTUkMKKyAgS0JVSUxEX0NIRUNLU1JDID0gMAorZW5kaWYKKworIyBVc2UgbWFrZSBNPWRpciB0byBzcGVjaWZ5IGRpcmVjdG9yeSBvZiBleHRlcm5hbCBtb2R1bGUgdG8gYnVpbGQKKyMgT2xkIHN5bnRheCBtYWtlIC4uLiBTVUJESVJTPSRQV0QgaXMgc3RpbGwgc3VwcG9ydGVkCisjIFNldHRpbmcgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEtCVUlMRF9FWFRNT0QgdGFrZSBwcmVjZWRlbmNlCitpZmRlZiBTVUJESVJTCisgIEtCVUlMRF9FWFRNT0QgPz0gJChTVUJESVJTKQorZW5kaWYKK2lmZGVmIE0KKyAgaWZlcSAoIiQob3JpZ2luIE0pIiwgImNvbW1hbmQgbGluZSIpCisgICAgS0JVSUxEX0VYVE1PRCA6PSAkKE0pCisgIGVuZGlmCitlbmRpZgorCisKKyMga2J1aWxkIHN1cHBvcnRzIHNhdmluZyBvdXRwdXQgZmlsZXMgaW4gYSBzZXBhcmF0ZSBkaXJlY3RvcnkuCisjIFRvIGxvY2F0ZSBvdXRwdXQgZmlsZXMgaW4gYSBzZXBhcmF0ZSBkaXJlY3RvcnkgdHdvIHN5bnRheGVzIGFyZSBzdXBwb3J0ZWQuCisjIEluIGJvdGggY2FzZXMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IG11c3QgYmUgdGhlIHJvb3Qgb2YgdGhlIGtlcm5lbCBzcmMuCisjIDEpIE89CisjIFVzZSAibWFrZSBPPWRpci90by9zdG9yZS9vdXRwdXQvZmlsZXMvIgorIworIyAyKSBTZXQgS0JVSUxEX09VVFBVVAorIyBTZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEtCVUlMRF9PVVRQVVQgdG8gcG9pbnQgdG8gdGhlIGRpcmVjdG9yeQorIyB3aGVyZSB0aGUgb3V0cHV0IGZpbGVzIHNoYWxsIGJlIHBsYWNlZC4KKyMgZXhwb3J0IEtCVUlMRF9PVVRQVVQ9ZGlyL3RvL3N0b3JlL291dHB1dC9maWxlcy8KKyMgbWFrZQorIworIyBUaGUgTz0gYXNzaWdubWVudCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlIEtCVUlMRF9PVVRQVVQgZW52aXJvbm1lbnQKKyMgdmFyaWFibGUuCisKKworIyBLQlVJTERfU1JDIGlzIHNldCBvbiBpbnZvY2F0aW9uIG9mIG1ha2UgaW4gT0JKIGRpcmVjdG9yeQorIyBLQlVJTERfU1JDIGlzIG5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHRoZSByZWd1bGFyIHVzZXIgKGZvciBub3cpCitpZmVxICgkKEtCVUlMRF9TUkMpLCkKKworIyBPSywgTWFrZSBjYWxsZWQgaW4gZGlyZWN0b3J5IHdoZXJlIGtlcm5lbCBzcmMgcmVzaWRlcworIyBEbyB3ZSB3YW50IHRvIGxvY2F0ZSBvdXRwdXQgZmlsZXMgaW4gYSBzZXBhcmF0ZSBkaXJlY3Rvcnk/CitpZmRlZiBPCisgIGlmZXEgKCIkKG9yaWdpbiBPKSIsICJjb21tYW5kIGxpbmUiKQorICAgIEtCVUlMRF9PVVRQVVQgOj0gJChPKQorICBlbmRpZgorZW5kaWYKKworIyBUaGF0J3Mgb3VyIGRlZmF1bHQgdGFyZ2V0IHdoZW4gbm9uZSBpcyBnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lCitQSE9OWSA6PSBfYWxsCitfYWxsOgorCitpZm5lcSAoJChLQlVJTERfT1VUUFVUKSwpCisjIEludm9rZSBhIHNlY29uZCBtYWtlIGluIHRoZSBvdXRwdXQgZGlyZWN0b3J5LCBwYXNzaW5nIHJlbGV2YW50IHZhcmlhYmxlcworIyBjaGVjayB0aGF0IHRoZSBvdXRwdXQgZGlyZWN0b3J5IGFjdHVhbGx5IGV4aXN0cworc2F2ZWQtb3V0cHV0IDo9ICQoS0JVSUxEX09VVFBVVCkKK0tCVUlMRF9PVVRQVVQgOj0gJChzaGVsbCBjZCAkKEtCVUlMRF9PVVRQVVQpICYmIC9iaW4vcHdkKQorJChpZiAkKEtCVUlMRF9PVVRQVVQpLCwgXAorICAgICAkKGVycm9yIG91dHB1dCBkaXJlY3RvcnkgIiQoc2F2ZWQtb3V0cHV0KSIgZG9lcyBub3QgZXhpc3QpKQorCitQSE9OWSArPSAkKE1BS0VDTURHT0FMUykKKworJChmaWx0ZXItb3V0IF9hbGwsJChNQUtFQ01ER09BTFMpKSBfYWxsOgorCSQoaWYgJChLQlVJTERfVkVSQk9TRToxPSksQCkkKE1BS0UpIC1DICQoS0JVSUxEX09VVFBVVCkgXAorCUtCVUlMRF9TUkM9JChDVVJESVIpIFwKKwlLQlVJTERfRVhUTU9EPSIkKEtCVUlMRF9FWFRNT0QpIiAtZiAkKENVUkRJUikvTWFrZWZpbGUgJEAKKworIyBMZWF2ZSBwcm9jZXNzaW5nIHRvIGFib3ZlIGludm9jYXRpb24gb2YgbWFrZQorc2tpcC1tYWtlZmlsZSA6PSAxCitlbmRpZiAjIGlmbmVxICgkKEtCVUlMRF9PVVRQVVQpLCkKK2VuZGlmICMgaWZlcSAoJChLQlVJTERfU1JDKSwpCisKKyMgV2UgcHJvY2VzcyB0aGUgcmVzdCBvZiB0aGUgTWFrZWZpbGUgaWYgdGhpcyBpcyB0aGUgZmluYWwgaW52b2NhdGlvbiBvZiBtYWtlCitpZmVxICgkKHNraXAtbWFrZWZpbGUpLCkKKworIyBJZiBidWlsZGluZyBhbiBleHRlcm5hbCBtb2R1bGUgd2UgZG8gbm90IGNhcmUgYWJvdXQgdGhlIGFsbDogcnVsZQorIyBidXQgaW5zdGVhZCBfYWxsIGRlcGVuZCBvbiBtb2R1bGVzCitQSE9OWSArPSBhbGwKK2lmZXEgKCQoS0JVSUxEX0VYVE1PRCksKQorX2FsbDogYWxsCitlbHNlCitfYWxsOiBtb2R1bGVzCitlbmRpZgorCitzcmN0cmVlCQk6PSAkKGlmICQoS0JVSUxEX1NSQyksJChLQlVJTERfU1JDKSwkKENVUkRJUikpCitUT1BESVIJCTo9ICQoc3JjdHJlZSkKKyMgRklYTUUgLSBUT1BESVIgaXMgb2Jzb2xldGUsIHVzZSBzcmN0cmVlL29ianRyZWUKK29ianRyZWUJCTo9ICQoQ1VSRElSKQorc3JjCQk6PSAkKHNyY3RyZWUpCitvYmoJCTo9ICQob2JqdHJlZSkKKworVlBBVEgJCTo9ICQoc3JjdHJlZSkkKGlmICQoS0JVSUxEX0VYVE1PRCksOiQoS0JVSUxEX0VYVE1PRCkpCisKK2V4cG9ydCBzcmN0cmVlIG9ianRyZWUgVlBBVEggVE9QRElSCisKKworIyBDcm9zcyBjb21waWxpbmcgYW5kIHNlbGVjdGluZyBkaWZmZXJlbnQgc2V0IG9mIGdjYy9iaW4tdXRpbHMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjCisjIFdoZW4gcGVyZm9ybWluZyBjcm9zcyBjb21waWxhdGlvbiBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcyBBUkNIIHNoYWxsIGJlIHNldAorIyB0byB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZS4gKFNlZSBhcmNoLyogZm9yIHRoZSBwb3NzaWJpbGl0aWVzKS4KKyMgQVJDSCBjYW4gYmUgc2V0IGR1cmluZyBpbnZvY2F0aW9uIG9mIG1ha2U6CisjIG1ha2UgQVJDSD1pYTY0CisjIEFub3RoZXIgd2F5IGlzIHRvIGhhdmUgQVJDSCBzZXQgaW4gdGhlIGVudmlyb25tZW50LgorIyBUaGUgZGVmYXVsdCBBUkNIIGlzIHRoZSBob3N0IHdoZXJlIG1ha2UgaXMgZXhlY3V0ZWQuCisKKyMgQ1JPU1NfQ09NUElMRSBzcGVjaWZ5IHRoZSBwcmVmaXggdXNlZCBmb3IgYWxsIGV4ZWN1dGFibGVzIHVzZWQKKyMgZHVyaW5nIGNvbXBpbGF0aW9uLiBPbmx5IGdjYyBhbmQgcmVsYXRlZCBiaW4tdXRpbHMgZXhlY3V0YWJsZXMKKyMgYXJlIHByZWZpeGVkIHdpdGggJChDUk9TU19DT01QSUxFKS4KKyMgQ1JPU1NfQ09NUElMRSBjYW4gYmUgc2V0IG9uIHRoZSBjb21tYW5kIGxpbmUKKyMgbWFrZSBDUk9TU19DT01QSUxFPWlhNjQtbGludXgtCisjIEFsdGVybmF0aXZlbHkgQ1JPU1NfQ09NUElMRSBjYW4gYmUgc2V0IGluIHRoZSBlbnZpcm9ubWVudC4KKyMgRGVmYXVsdCB2YWx1ZSBmb3IgQ1JPU1NfQ09NUElMRSBpcyBub3QgdG8gcHJlZml4IGV4ZWN1dGFibGVzCisjIE5vdGU6IFNvbWUgYXJjaGl0ZWN0dXJlcyBhc3NpZ24gQ1JPU1NfQ09NUElMRSBpbiB0aGVpciBhcmNoLyovTWFrZWZpbGUKKworQ1JPU1NfQ09NUElMRSA/PQorIyBiYm94OiB3ZSBtYXkgaGF2ZSBDT05GSUdfQ1JPU1NfQ09NUElMRVJfUFJFRklYIGluIC5jb25maWcsCisjIGFuZCBpdCBoYXMgbm90IGJlZW4gaW5jbHVkZWQgeWV0Li4uIHRodXMgdXNpbmcgYW4gYXdrd2FyZCBzeW50YXguCitpZmVxICgkKENST1NTX0NPTVBJTEUpLCkKK0NST1NTX0NPTVBJTEUgOj0gJChzaGVsbCBncmVwIF5DT05GSUdfQ1JPU1NfQ09NUElMRVJfUFJFRklYIC5jb25maWcgMj4vZGV2L251bGwpCitDUk9TU19DT01QSUxFIDo9ICQoc3Vic3QgQ09ORklHX0NST1NTX0NPTVBJTEVSX1BSRUZJWD0sLCQoQ1JPU1NfQ09NUElMRSkpCitDUk9TU19DT01QSUxFIDo9ICQoc3Vic3QgIiwsJChDUk9TU19DT01QSUxFKSkKKyMiKQorZW5kaWYKKworIyBTVUJBUkNIIHRlbGxzIHRoZSB1c2VybW9kZSBidWlsZCB3aGF0IHRoZSB1bmRlcmx5aW5nIGFyY2ggaXMuICBUaGF0IGlzIHNldAorIyBmaXJzdCwgYW5kIGlmIGEgdXNlcm1vZGUgYnVpbGQgaXMgaGFwcGVuaW5nLCB0aGUgIkFSQ0g9dW0iIG9uIHRoZSBjb21tYW5kCisjIGxpbmUgb3ZlcnJpZGVzIHRoZSBzZXR0aW5nIG9mIEFSQ0ggYmVsb3cuICBJZiBhIG5hdGl2ZSBidWlsZCBpcyBoYXBwZW5pbmcsCisjIHRoZW4gQVJDSCBpcyBhc3NpZ25lZCwgZ2V0dGluZyB3aGF0ZXZlciB2YWx1ZSBpdCBnZXRzIG5vcm1hbGx5LCBhbmQKKyMgU1VCQVJDSCBpcyBzdWJzZXF1ZW50bHkgaWdub3JlZC4KKworaWZuZXEgKCQoQ1JPU1NfQ09NUElMRSksKQorU1VCQVJDSCA6PSAkKHNoZWxsIGVjaG8gJChDUk9TU19DT01QSUxFKSB8IGN1dCAtZC0gLWYxKQorZWxzZQorU1VCQVJDSCA6PSAkKHNoZWxsIHVuYW1lIC1tKQorZW5kaWYKK1NVQkFSQ0ggOj0gJChzaGVsbCBlY2hvICQoU1VCQVJDSCkgfCBzZWQgLWUgcy9pLjg2L2kzODYvIC1lIHMvc3VuNHUvc3BhcmM2NC8gXAorCQkJCQkgLWUgcy9hcm0uKi9hcm0vIC1lIHMvc2ExMTAvYXJtLyBcCisJCQkJCSAtZSBzL3MzOTB4L3MzOTAvIC1lIHMvcGFyaXNjNjQvcGFyaXNjLyBcCisJCQkJCSAtZSBzL3BwYy4qL3Bvd2VycGMvIC1lIHMvbWlwcy4qL21pcHMvICkKKworQVJDSCA/PSAkKFNVQkFSQ0gpCisKKyMgQXJjaGl0ZWN0dXJlIGFzIHByZXNlbnQgaW4gY29tcGlsZS5oCitVVFNfTUFDSElORSA6PSAkKEFSQ0gpCisKKyMgU0hFTEwgdXNlZCBieSBrYnVpbGQKK0NPTkZJR19TSEVMTCA6PSAkKHNoZWxsIGlmIFsgLXggIiQkQkFTSCIgXTsgdGhlbiBlY2hvICQkQkFTSDsgXAorCSAgZWxzZSBpZiBbIC14IC9iaW4vYmFzaCBdOyB0aGVuIGVjaG8gL2Jpbi9iYXNoOyBcCisJICBlbHNlIGVjaG8gc2g7IGZpIDsgZmkpCisKKyMgCURlY2lkZSB3aGV0aGVyIHRvIGJ1aWxkIGJ1aWx0LWluLCBtb2R1bGFyLCBvciBib3RoLgorIwlOb3JtYWxseSwganVzdCBkbyBidWlsdC1pbi4KKworS0JVSUxEX01PRFVMRVMgOj0KK0tCVUlMRF9CVUlMVElOIDo9IDEKKworIwlJZiB3ZSBoYXZlIG9ubHkgIm1ha2UgbW9kdWxlcyIsIGRvbid0IGNvbXBpbGUgYnVpbHQtaW4gb2JqZWN0cy4KKyMJV2hlbiB3ZSdyZSBidWlsZGluZyBtb2R1bGVzIHdpdGggbW9kdmVyc2lvbnMsIHdlIG5lZWQgdG8gY29uc2lkZXIKKyMJdGhlIGJ1aWx0LWluIG9iamVjdHMgZHVyaW5nIHRoZSBkZXNjZW5kIGFzIHdlbGwsIGluIG9yZGVyIHRvCisjCW1ha2Ugc3VyZSB0aGUgY2hlY2tzdW1zIGFyZSB1cHRvZGF0ZSBiZWZvcmUgd2UgcmVjb3JkIHRoZW0uCisKK2lmZXEgKCQoTUFLRUNNREdPQUxTKSxtb2R1bGVzKQorICBLQlVJTERfQlVJTFRJTiA6PSAkKGlmICQoQ09ORklHX01PRFZFUlNJT05TKSwxKQorZW5kaWYKKworIwlJZiB3ZSBoYXZlICJtYWtlIDx3aGF0ZXZlcj4gbW9kdWxlcyIsIGNvbXBpbGUgbW9kdWxlcworIwlpbiBhZGRpdGlvbiB0byB3aGF0ZXZlciB3ZSBkbyBhbnl3YXkuCisjCUp1c3QgIm1ha2UiIG9yICJtYWtlIGFsbCIgc2hhbGwgYnVpbGQgbW9kdWxlcyBhcyB3ZWxsCisKK2lmbmVxICgkKGZpbHRlciBhbGwgX2FsbCBtb2R1bGVzLCQoTUFLRUNNREdPQUxTKSksKQorICBLQlVJTERfTU9EVUxFUyA6PSAxCitlbmRpZgorCitpZmVxICgkKE1BS0VDTURHT0FMUyksKQorICBLQlVJTERfTU9EVUxFUyA6PSAxCitlbmRpZgorCitleHBvcnQgS0JVSUxEX01PRFVMRVMgS0JVSUxEX0JVSUxUSU4KK2V4cG9ydCBLQlVJTERfQ0hFQ0tTUkMgS0JVSUxEX1NSQyBLQlVJTERfRVhUTU9ECisKKyMgQmVhdXRpZnkgb3V0cHV0CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIworIyBOb3JtYWxseSwgd2UgZWNobyB0aGUgd2hvbGUgY29tbWFuZCBiZWZvcmUgZXhlY3V0aW5nIGl0LiBCeSBtYWtpbmcKKyMgdGhhdCBlY2hvICQoJChxdWlldCkkKGNtZCkpLCB3ZSBub3cgaGF2ZSB0aGUgcG9zc2liaWxpdHkgdG8gc2V0CisjICQocXVpZXQpIHRvIGNob29zZSBvdGhlciBmb3JtcyBvZiBvdXRwdXQgaW5zdGVhZCwgZS5nLgorIworIyAgICAgICAgIHF1aWV0X2NtZF9jY19vX2MgPSBDb21waWxpbmcgJChSRUxESVIpLyRACisjICAgICAgICAgY21kX2NjX29fYyAgICAgICA9ICQoQ0MpICQoY19mbGFncykgLWMgLW8gJEAgJDwKKyMKKyMgSWYgJChxdWlldCkgaXMgZW1wdHksIHRoZSB3aG9sZSBjb21tYW5kIHdpbGwgYmUgcHJpbnRlZC4KKyMgSWYgaXQgaXMgc2V0IHRvICJxdWlldF8iLCBvbmx5IHRoZSBzaG9ydCB2ZXJzaW9uIHdpbGwgYmUgcHJpbnRlZC4KKyMgSWYgaXQgaXMgc2V0IHRvICJzaWxlbnRfIiwgbm90aGluZyB3aWwgYmUgcHJpbnRlZCBhdCBhbGwsIHNpbmNlCisjIHRoZSB2YXJpYWJsZSAkKHNpbGVudF9jbWRfY2Nfb19jKSBkb2Vzbid0IGV4aXN0LgorIworIyBBIHNpbXBsZSB2YXJpYW50IGlzIHRvIHByZWZpeCBjb21tYW5kcyB3aXRoICQoUSkgLSB0aGF0J3MgdXNlZnVsCisjIGZvciBjb21tYW5kcyB0aGF0IHNoYWxsIGJlIGhpZGRlbiBpbiBub24tdmVyYm9zZSBtb2RlLgorIworIwkkKFEpbG4gJEAgOjwKKyMKKyMgSWYgS0JVSUxEX1ZFUkJPU0UgZXF1YWxzIDAgdGhlbiB0aGUgYWJvdmUgY29tbWFuZCB3aWxsIGJlIGhpZGRlbi4KKyMgSWYgS0JVSUxEX1ZFUkJPU0UgZXF1YWxzIDEgdGhlbiB0aGUgYWJvdmUgY29tbWFuZCBpcyBkaXNwbGF5ZWQuCisKK2lmZXEgKCQoS0JVSUxEX1ZFUkJPU0UpLDEpCisgIHF1aWV0ID0KKyAgUSA9CitlbHNlCisgIHF1aWV0PXF1aWV0XworICBRID0gQAorZW5kaWYKKworIyBJZiB0aGUgdXNlciBpcyBydW5uaW5nIG1ha2UgLXMgKHNpbGVudCBtb2RlKSwgc3VwcHJlc3MgZWNob2luZyBvZgorIyBjb21tYW5kcworCitpZm5lcSAoJChmaW5kc3RyaW5nIHMsJChNQUtFRkxBR1MpKSwpCisgIHF1aWV0PXNpbGVudF8KK2VuZGlmCisKK2V4cG9ydCBxdWlldCBRIEtCVUlMRF9WRVJCT1NFCisKKworIyBMb29rIGZvciBtYWtlIGluY2x1ZGUgZmlsZXMgcmVsYXRpdmUgdG8gcm9vdCBvZiBrZXJuZWwgc3JjCitNQUtFRkxBR1MgKz0gLS1pbmNsdWRlLWRpcj0kKHNyY3RyZWUpCisKK0hPU1RDQyAgCT0gZ2NjCitIT1NUQ1hYICAJPSBnKysKK0hPU1RDRkxBR1MJOj0KK0hPU1RDWFhGTEFHUwk6PQorIyBXZSBuZWVkIHNvbWUgZ2VuZXJpYyBkZWZpbml0aW9ucworaW5jbHVkZSAkKHNyY3RyZWUpL3NjcmlwdHMvS2J1aWxkLmluY2x1ZGUKKworSE9TVENGTEFHUwkrPSAkKGNhbGwgaG9zdGNjLW9wdGlvbiwtV2FsbCAtV3N0cmljdC1wcm90b3R5cGVzIC1PMiAtZm9taXQtZnJhbWUtcG9pbnRlciwpCitIT1NUQ1hYRkxBR1MJKz0gLU8yCisKKyMgRm9yIG1heGltdW0gcGVyZm9ybWFuY2UgKCsgcG9zc2libHkgcmFuZG9tIGJyZWFrYWdlLCB1bmNvbW1lbnQKKyMgdGhlIGZvbGxvd2luZykKKworTUFLRUZMQUdTICs9IC1yUgorCisjIE1ha2UgdmFyaWFibGVzIChDQywgZXRjLi4uKQorCitBUwkJPSAkKENST1NTX0NPTVBJTEUpYXMKK0NDCQk9ICQoQ1JPU1NfQ09NUElMRSlnY2MKK0xECQk9ICQoQ0MpIC1ub3N0ZGxpYgorQ1BQCQk9ICQoQ0MpIC1FCitBUgkJPSAkKENST1NTX0NPTVBJTEUpYXIKK05NCQk9ICQoQ1JPU1NfQ09NUElMRSlubQorU1RSSVAJCT0gJChDUk9TU19DT01QSUxFKXN0cmlwCitPQkpDT1BZCQk9ICQoQ1JPU1NfQ09NUElMRSlvYmpjb3B5CitPQkpEVU1QCQk9ICQoQ1JPU1NfQ09NUElMRSlvYmpkdW1wCitQS0dfQ09ORklHCT89ICQoQ1JPU1NfQ09NUElMRSlwa2ctY29uZmlnCitBV0sJCT0gYXdrCitHRU5LU1lNUwk9IHNjcmlwdHMvZ2Vua3N5bXMvZ2Vua3N5bXMKK0RFUE1PRAkJPSAvc2Jpbi9kZXBtb2QKK0tBTExTWU1TCT0gc2NyaXB0cy9rYWxsc3ltcworUEVSTAkJPSBwZXJsCitDSEVDSwkJPSBzcGFyc2UKKworQ0hFQ0tGTEFHUyAgICAgOj0gLURfX2xpbnV4X18gLURsaW51eCAtRF9fU1REQ19fIC1EdW5peCAtRF9fdW5peF9fIC1XYml0d2lzZSAkKENGKQorTU9ERkxBR1MJPSAtRE1PRFVMRQorQ0ZMQUdTX01PRFVMRSAgID0gJChNT0RGTEFHUykKK0FGTEFHU19NT0RVTEUgICA9ICQoTU9ERkxBR1MpCitMREZMQUdTX01PRFVMRSAgPSAtcgorQ0ZMQUdTX0tFUk5FTAk9CitBRkxBR1NfS0VSTkVMCT0KKworCisjIFVzZSBMSU5VWElOQ0xVREUgd2hlbiB5b3UgbXVzdCByZWZlcmVuY2UgdGhlIGluY2x1ZGUvIGRpcmVjdG9yeS4KKyMgTmVlZGVkIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGUgTz0gb3B0aW9uCitDRkxBR1MJCTo9ICQoQ0ZMQUdTKQorIyBBZGRlZCBvbmx5IHRvIGZpbmFsIGxpbmsgc3RhZ2Ugb2YgYnVzeWJveCBiaW5hcnkKK0NGTEFHU19idXN5Ym94CTo9ICQoQ0ZMQUdTX2J1c3lib3gpCitDUFBGTEFHUwk6PSAkKENQUEZMQUdTKQorQUZMQUdTCQk6PSAkKEFGTEFHUykKK0xERkxBR1MJCTo9ICQoTERGTEFHUykKK0xETElCUwkJOj0KKworIyBSZWFkIEtFUk5FTFJFTEVBU0UgZnJvbSAua2VybmVscmVsZWFzZSAoaWYgaXQgZXhpc3RzKQorS0VSTkVMUkVMRUFTRSA9ICQoc2hlbGwgY2F0IC5rZXJuZWxyZWxlYXNlIDI+IC9kZXYvbnVsbCkKK0tFUk5FTFZFUlNJT04gPSAkKFZFUlNJT04pLiQoUEFUQ0hMRVZFTCkuJChTVUJMRVZFTCkkKEVYVFJBVkVSU0lPTikKKworZXhwb3J0CVZFUlNJT04gUEFUQ0hMRVZFTCBTVUJMRVZFTCBLRVJORUxSRUxFQVNFIEtFUk5FTFZFUlNJT04gXAorCUFSQ0ggQ09ORklHX1NIRUxMIEhPU1RDQyBIT1NUQ0ZMQUdTIENST1NTX0NPTVBJTEUgQVMgTEQgQ0MgXAorCUNQUCBBUiBOTSBTVFJJUCBPQkpDT1BZIE9CSkRVTVAgTUFLRSBBV0sgR0VOS1NZTVMgUEVSTCBVVFNfTUFDSElORSBcCisJSE9TVENYWCBIT1NUQ1hYRkxBR1MgTERGTEFHU19NT0RVTEUgQ0hFQ0sgQ0hFQ0tGTEFHUworCitleHBvcnQgQ1BQRkxBR1MgTk9TVERJTkNfRkxBR1MgTElOVVhJTkNMVURFIE9CSkNPUFlGTEFHUyBMREZMQUdTCitleHBvcnQgQ0ZMQUdTIENGTEFHU19LRVJORUwgQ0ZMQUdTX01PRFVMRQorZXhwb3J0IEFGTEFHUyBBRkxBR1NfS0VSTkVMIEFGTEFHU19NT0RVTEUKK2V4cG9ydCBGTFRGTEFHUworCisjIFdoZW4gY29tcGlsaW5nIG91dC1vZi10cmVlIG1vZHVsZXMsIHB1dCBNT0RWRVJESVIgaW4gdGhlIG1vZHVsZQorIyB0cmVlIHJhdGhlciB0aGFuIGluIHRoZSBrZXJuZWwgdHJlZS4gVGhlIGtlcm5lbCB0cmVlIG1pZ2h0CisjIGV2ZW4gYmUgcmVhZC1vbmx5LgorZXhwb3J0IE1PRFZFUkRJUiA6PSAkKGlmICQoS0JVSUxEX0VYVE1PRCksJChmaXJzdHdvcmQgJChLQlVJTERfRVhUTU9EKSkvKS50bXBfdmVyc2lvbnMKKworIyBGaWxlcyB0byBpZ25vcmUgaW4gZmluZCAuLi4gc3RhdGVtZW50cworCitSQ1NfRklORF9JR05PUkUgOj0gXCggLW5hbWUgU0NDUyAtbyAtbmFtZSBCaXRLZWVwZXIgLW8gLW5hbWUgLnN2biAtbyAtbmFtZSBDVlMgLW8gLW5hbWUgLnBjIC1vIC1uYW1lIC5oZyAtbyAtbmFtZSAuZ2l0IFwpIC1wcnVuZSAtbworZXhwb3J0IFJDU19UQVJfSUdOT1JFIDo9IC0tZXhjbHVkZSBTQ0NTIC0tZXhjbHVkZSBCaXRLZWVwZXIgLS1leGNsdWRlIC5zdm4gLS1leGNsdWRlIENWUyAtLWV4Y2x1ZGUgLnBjIC0tZXhjbHVkZSAuaGcgLS1leGNsdWRlIC5naXQKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgUnVsZXMgc2hhcmVkIGJldHdlZW4gKmNvbmZpZyB0YXJnZXRzIGFuZCBidWlsZCB0YXJnZXRzCisKKyMgQmFzaWMgaGVscGVycyBidWlsdCBpbiBzY3JpcHRzLworUEhPTlkgKz0gc2NyaXB0c19iYXNpYworc2NyaXB0c19iYXNpYzoKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT1zY3JpcHRzL2Jhc2ljCisKKyMgVG8gYXZvaWQgYW55IGltcGxpY2l0IHJ1bGUgdG8ga2ljayBpbiwgZGVmaW5lIGFuIGVtcHR5IGNvbW1hbmQuCitzY3JpcHRzL2Jhc2ljLyU6IHNjcmlwdHNfYmFzaWMgOworCisjIFRoaXMgdGFyZ2V0IGdlbmVyYXRlcyBLYnVpbGQncyBhbmQgQ29uZmlnLmluJ3MgZnJvbSAqLmMgZmlsZXMKK1BIT05ZICs9IGdlbl9idWlsZF9maWxlcworZ2VuX2J1aWxkX2ZpbGVzOiAkKHdpbGRjYXJkICQoc3JjdHJlZSkvKi8qLmMpICQod2lsZGNhcmQgJChzcmN0cmVlKS8qLyovKi5jKQorCSQoUSkkKHNyY3RyZWUpL3NjcmlwdHMvZ2VuX2J1aWxkX2ZpbGVzLnNoICQoc3JjdHJlZSkgJChvYmp0cmVlKQorCisjIGJib3g6IHdlIGhhdmUgaGVscGVycyBpbiBhcHBsZXRzLworIyB3ZSBkZXBlbmQgb24gc2NyaXB0c19iYXNpYywgc2luY2Ugc2NyaXB0cy9iYXNpYy9maXhkZXAKKyMgbXVzdCBiZSBidWlsdCBiZWZvcmUgYW55IG90aGVyIGhvc3QgcHJvZworUEhPTlkgKz0gYXBwbGV0c19kaXIKK2FwcGxldHNfZGlyOiBzY3JpcHRzX2Jhc2ljIGdlbl9idWlsZF9maWxlcworCSQoUSkkKE1BS0UpICQoYnVpbGQpPWFwcGxldHMKKworYXBwbGV0cy8lOiBhcHBsZXRzX2RpciA7CisKK1BIT05ZICs9IG91dHB1dG1ha2VmaWxlCisjIG91dHB1dG1ha2VmaWxlIGdlbmVyYXRlcyBhIE1ha2VmaWxlIGluIHRoZSBvdXRwdXQgZGlyZWN0b3J5LCBpZiB1c2luZyBhCisjIHNlcGFyYXRlIG91dHB1dCBkaXJlY3RvcnkuIFRoaXMgYWxsb3dzIGNvbnZlbmllbnQgdXNlIG9mIG1ha2UgaW4gdGhlCisjIG91dHB1dCBkaXJlY3RvcnkuCitvdXRwdXRtYWtlZmlsZToKK2lmbmVxICgkKEtCVUlMRF9TUkMpLCkKKwkkKFEpJChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvc2NyaXB0cy9ta21ha2VmaWxlIFwKKwkgICAgJChzcmN0cmVlKSAkKG9ianRyZWUpICQoVkVSU0lPTikgJChQQVRDSExFVkVMKQorZW5kaWYKKworIyBUbyBtYWtlIHN1cmUgd2UgZG8gbm90IGluY2x1ZGUgLmNvbmZpZyBmb3IgYW55IG9mIHRoZSAqY29uZmlnIHRhcmdldHMKKyMgY2F0Y2ggdGhlbSBlYXJseSwgYW5kIGhhbmQgdGhlbSBvdmVyIHRvIHNjcmlwdHMva2NvbmZpZy9NYWtlZmlsZQorIyBJdCBpcyBhbGxvd2VkIHRvIHNwZWNpZnkgbW9yZSB0YXJnZXRzIHdoZW4gY2FsbGluZyBtYWtlLCBpbmNsdWRpbmcKKyMgbWl4aW5nICpjb25maWcgdGFyZ2V0cyBhbmQgYnVpbGQgdGFyZ2V0cy4KKyMgRm9yIGV4YW1wbGUgJ21ha2Ugb2xkY29uZmlnIGFsbCcuCisjIERldGVjdCB3aGVuIG1peGVkIHRhcmdldHMgaXMgc3BlY2lmaWVkLCBhbmQgbWFrZSBhIHNlY29uZCBpbnZvY2F0aW9uCisjIG9mIG1ha2Ugc28gLmNvbmZpZyBpcyBub3QgaW5jbHVkZWQgaW4gdGhpcyBjYXNlIGVpdGhlciAoZm9yICpjb25maWcpLgorCituby1kb3QtY29uZmlnLXRhcmdldHMgOj0gY2xlYW4gbXJwcm9wZXIgZGlzdGNsZWFuIFwKKwkJCSBjc2NvcGUgVEFHUyB0YWdzIGhlbHAgJWRvY3MKKyNiYm94IyBjaGVjayUgaXMgcmVtb3ZlZCBmcm9tIGFib3ZlCisKK2NvbmZpZy10YXJnZXRzIDo9IDAKK21peGVkLXRhcmdldHMgIDo9IDAKK2RvdC1jb25maWcgICAgIDo9IDEKKworaWZuZXEgKCQoZmlsdGVyICQobm8tZG90LWNvbmZpZy10YXJnZXRzKSwgJChNQUtFQ01ER09BTFMpKSwpCisJaWZlcSAoJChmaWx0ZXItb3V0ICQobm8tZG90LWNvbmZpZy10YXJnZXRzKSwgJChNQUtFQ01ER09BTFMpKSwpCisJCWRvdC1jb25maWcgOj0gMAorCWVuZGlmCitlbmRpZgorCitpZmVxICgkKEtCVUlMRF9FWFRNT0QpLCkKKyAgICAgICAgaWZuZXEgKCQoZmlsdGVyIGNvbmZpZyAlY29uZmlnLCQoTUFLRUNNREdPQUxTKSksKQorICAgICAgICAgICAgICAgIGNvbmZpZy10YXJnZXRzIDo9IDEKKyAgICAgICAgICAgICAgICBpZm5lcSAoJChmaWx0ZXItb3V0IGNvbmZpZyAlY29uZmlnLCQoTUFLRUNNREdPQUxTKSksKQorICAgICAgICAgICAgICAgICAgICAgICAgbWl4ZWQtdGFyZ2V0cyA6PSAxCisgICAgICAgICAgICAgICAgZW5kaWYKKyAgICAgICAgZW5kaWYKK2VuZGlmCisKK2lmZXEgKCQobWl4ZWQtdGFyZ2V0cyksMSkKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFdlJ3JlIGNhbGxlZCB3aXRoIG1peGVkIHRhcmdldHMgKCpjb25maWcgYW5kIGJ1aWxkIHRhcmdldHMpLgorIyBIYW5kbGUgdGhlbSBvbmUgYnkgb25lLgorCislOjogRk9SQ0UKKwkkKFEpJChNQUtFKSAtQyAkKHNyY3RyZWUpIEtCVUlMRF9TUkM9ICRACisKK2Vsc2UKK2lmZXEgKCQoY29uZmlnLXRhcmdldHMpLDEpCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyAqY29uZmlnIHRhcmdldHMgb25seSAtIG1ha2Ugc3VyZSBwcmVyZXF1aXNpdGVzIGFyZSB1cGRhdGVkLCBhbmQgZGVzY2VuZAorIyBpbiBzY3JpcHRzL2tjb25maWcgdG8gbWFrZSB0aGUgKmNvbmZpZyB0YXJnZXQKKworIyBSZWFkIGFyY2ggc3BlY2lmaWMgTWFrZWZpbGUgdG8gc2V0IEtCVUlMRF9ERUZDT05GSUcgYXMgbmVlZGVkLgorIyBLQlVJTERfREVGQ09ORklHIG1heSBwb2ludCBvdXQgYW4gYWx0ZXJuYXRpdmUgZGVmYXVsdCBjb25maWd1cmF0aW9uCisjIHVzZWQgZm9yICdtYWtlIGRlZmNvbmZpZycKKy1pbmNsdWRlICQoc3JjdHJlZSkvYXJjaC8kKEFSQ0gpL01ha2VmaWxlCitleHBvcnQgS0JVSUxEX0RFRkNPTkZJRworCitjb25maWc6IHNjcmlwdHNfYmFzaWMgb3V0cHV0bWFrZWZpbGUgZ2VuX2J1aWxkX2ZpbGVzIEZPUkNFCisJJChRKW1rZGlyIC1wIGluY2x1ZGUKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT1zY3JpcHRzL2tjb25maWcgJEAKKwkkKFEpJChNQUtFKSAtQyAkKHNyY3RyZWUpIEtCVUlMRF9TUkM9IC5rZXJuZWxyZWxlYXNlCisKKyVjb25maWc6IHNjcmlwdHNfYmFzaWMgb3V0cHV0bWFrZWZpbGUgZ2VuX2J1aWxkX2ZpbGVzIEZPUkNFCisJJChRKW1rZGlyIC1wIGluY2x1ZGUKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT1zY3JpcHRzL2tjb25maWcgJEAKKwkkKFEpJChNQUtFKSAtQyAkKHNyY3RyZWUpIEtCVUlMRF9TUkM9IC5rZXJuZWxyZWxlYXNlCisKK2Vsc2UKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEJ1aWxkIHRhcmdldHMgb25seSAtIHRoaXMgaW5jbHVkZXMgYnVzeWJveCwgYXJjaCBzcGVjaWZpYyB0YXJnZXRzLCBjbGVhbgorIyB0YXJnZXRzIGFuZCBvdGhlcnMuIEluIGdlbmVyYWwgYWxsIHRhcmdldHMgZXhjZXB0ICpjb25maWcgdGFyZ2V0cy4KKworaWZlcSAoJChLQlVJTERfRVhUTU9EKSwpCisjIEFkZGl0aW9uYWwgaGVscGVycyBidWlsdCBpbiBzY3JpcHRzLworIyBDYXJlZnVsbHkgbGlzdCBkZXBlbmRlbmNpZXMgc28gd2UgZG8gbm90IHRyeSB0byBidWlsZCBzY3JpcHRzIHR3aWNlCisjIGluIHBhcmFsbGVsCitQSE9OWSArPSBzY3JpcHRzCitzY3JpcHRzOiBnZW5fYnVpbGRfZmlsZXMgc2NyaXB0c19iYXNpYyBpbmNsdWRlL2NvbmZpZy9NQVJLRVIKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKEApCisKK3NjcmlwdHNfYmFzaWM6IGluY2x1ZGUvYXV0b2NvbmYuaAorCisjIE9iamVjdHMgd2Ugd2lsbCBsaW5rIGludG8gYnVzeWJveCAvIHN1YmRpcnMgd2UgbmVlZCB0byB2aXNpdAorY29yZS15CQk6PSBcCisJCWFwcGxldHMvIFwKKworbGlicy15CQk6PSBcCisJCWFyY2hpdmFsLyBcCisJCWFyY2hpdmFsL2xpYmFyY2hpdmUvIFwKKwkJY29uc29sZS10b29scy8gXAorCQljb3JldXRpbHMvIFwKKwkJY29yZXV0aWxzL2xpYmNvcmV1dGlscy8gXAorCQlkZWJpYW51dGlscy8gXAorCQllMmZzcHJvZ3MvIFwKKwkJZWRpdG9ycy8gXAorCQlmaW5kdXRpbHMvIFwKKwkJaW5pdC8gXAorCQlsaWJiYi8gXAorCQlsaWJwd2RncnAvIFwKKwkJbG9naW51dGlscy8gXAorCQltYWlsdXRpbHMvIFwKKwkJbWlzY3V0aWxzLyBcCisJCW1vZHV0aWxzLyBcCisJCW5ldHdvcmtpbmcvIFwKKwkJbmV0d29ya2luZy9saWJpcHJvdXRlLyBcCisJCW5ldHdvcmtpbmcvdWRoY3AvIFwKKwkJcHJpbnR1dGlscy8gXAorCQlwcm9jcHMvIFwKKwkJcnVuaXQvIFwKKwkJc2VsaW51eC8gXAorCQlzaGVsbC8gXAorCQlzeXNrbG9nZC8gXAorCQl1dGlsLWxpbnV4LyBcCisJCXV0aWwtbGludXgvdm9sdW1lX2lkLyBcCisKK2VuZGlmICMgS0JVSUxEX0VYVE1PRAorCitpZmVxICgkKGRvdC1jb25maWcpLDEpCisjIEluIHRoaXMgc2VjdGlvbiwgd2UgbmVlZCAuY29uZmlnCisKKyMgUmVhZCBpbiBkZXBlbmRlbmNpZXMgdG8gYWxsIEtjb25maWcqIGZpbGVzLCBtYWtlIHN1cmUgdG8gcnVuCisjIG9sZGNvbmZpZyBpZiBjaGFuZ2VzIGFyZSBkZXRlY3RlZC4KKy1pbmNsdWRlIC5rY29uZmlnLmQKKworLWluY2x1ZGUgLmNvbmZpZworCisjIElmIC5jb25maWcgbmVlZHMgdG8gYmUgdXBkYXRlZCwgaXQgd2lsbCBiZSBkb25lIHZpYSB0aGUgZGVwZW5kZW5jeQorIyB0aGF0IGF1dG9jb25mIGhhcyBvbiAuY29uZmlnLgorIyBUbyBhdm9pZCBhbnkgaW1wbGljaXQgcnVsZSB0byBraWNrIGluLCBkZWZpbmUgYW4gZW1wdHkgY29tbWFuZAorLmNvbmZpZyAua2NvbmZpZy5kOiA7CisKKyMgTm93IHdlIGNhbiBkZWZpbmUgQ0ZMQUdTIGV0YyBhY2NvcmRpbmcgdG8gLmNvbmZpZworaW5jbHVkZSAkKHNyY3RyZWUpL01ha2VmaWxlLmZsYWdzCisKKyMgSWYgLmNvbmZpZyBpcyBuZXdlciB0aGFuIGluY2x1ZGUvYXV0b2NvbmYuaCwgc29tZW9uZSB0aW5rZXJlZAorIyB3aXRoIGl0IGFuZCBmb3Jnb3QgdG8gcnVuIG1ha2Ugb2xkY29uZmlnLgorIyBJZiBrY29uZmlnLmQgaXMgbWlzc2luZyB0aGVuIHdlIGFyZSBwcm9iYXJseSBpbiBhIGNsZWFuZWQgdHJlZSBzbworIyB3ZSBleGVjdXRlIHRoZSBjb25maWcgc3RlcCB0byBiZSBzdXJlIHRvIGNhdGNoIHVwZGF0ZWQgS2NvbmZpZyBmaWxlcworaW5jbHVkZS9hdXRvY29uZi5oOiAua2NvbmZpZy5kIC5jb25maWcgJCh3aWxkY2FyZCAkKHNyY3RyZWUpLyovKi5jKSAkKHdpbGRjYXJkICQoc3JjdHJlZSkvKi8qLyouYykgfCBnZW5fYnVpbGRfZmlsZXMKKwkkKFEpJChNQUtFKSAtZiAkKHNyY3RyZWUpL01ha2VmaWxlIHNpbGVudG9sZGNvbmZpZworCitpbmNsdWRlL3VzYWdlLmg6IGdlbl9idWlsZF9maWxlcworCitlbHNlCisjIER1bW15IHRhcmdldCBuZWVkZWQsIGJlY2F1c2UgdXNlZCBhcyBwcmVyZXF1aXNpdGUKK2luY2x1ZGUvYXV0b2NvbmYuaDogOworZW5kaWYKKworIyBUaGUgYWxsOiB0YXJnZXQgaXMgdGhlIGRlZmF1bHQgd2hlbiBubyB0YXJnZXQgaXMgZ2l2ZW4gb24gdGhlCisjIGNvbW1hbmQgbGluZS4KKyMgVGhpcyBhbGxvdyBhIHVzZXIgdG8gaXNzdWUgb25seSAnbWFrZScgdG8gYnVpbGQgYSBrZXJuZWwgaW5jbHVkaW5nIG1vZHVsZXMKKyMgRGVmYXVsdHMgYnVzeWJveCBidXQgaXQgaXMgdXN1YWxseSBvdmVycmlkZGVuIGluIHRoZSBhcmNoIG1ha2VmaWxlCithbGw6IGJ1c3lib3ggZG9jCisKKy1pbmNsdWRlICQoc3JjdHJlZSkvYXJjaC8kKEFSQ0gpL01ha2VmaWxlCisKKyMgYXJjaCBNYWtlZmlsZSBtYXkgb3ZlcnJpZGUgQ0Mgc28ga2VlcCB0aGlzIGFmdGVyIGFyY2ggTWFrZWZpbGUgaXMgaW5jbHVkZWQKKyNiYm94IyBOT1NURElOQ19GTEFHUyArPSAtbm9zdGRpbmMgLWlzeXN0ZW0gJChzaGVsbCAkKENDKSAtcHJpbnQtZmlsZS1uYW1lPWluY2x1ZGUpCitDSEVDS0ZMQUdTICs9ICQoTk9TVERJTkNfRkxBR1MpCisKKyMgRGVmYXVsdCBrZXJuZWwgaW1hZ2UgdG8gYnVpbGQgd2hlbiBubyBzcGVjaWZpYyB0YXJnZXQgaXMgZ2l2ZW4uCisjIEtCVUlMRF9JTUFHRSBtYXkgYmUgb3ZlcnJ1bGVkIG9uIHRoZSBjb21tYW5kbGluZSBvcgorIyBzZXQgaW4gdGhlIGVudmlyb25tZW50CisjIEFsc28gYW55IGFzc2lnbm1lbnRzIGluIGFyY2gvJChBUkNIKS9NYWtlZmlsZSB0YWtlIHByZWNlZGVuY2Ugb3ZlcgorIyB0aGlzIGRlZmF1bHQgdmFsdWUKK2V4cG9ydCBLQlVJTERfSU1BR0UgPz0gYnVzeWJveAorCisjCisjIElOU1RBTExfUEFUSCBzcGVjaWZpZXMgd2hlcmUgdG8gcGxhY2UgdGhlIHVwZGF0ZWQga2VybmVsIGFuZCBzeXN0ZW0gbWFwCisjIGltYWdlcy4gRGVmYXVsdCBpcyAvYm9vdCwgYnV0IHlvdSBjYW4gc2V0IGl0IHRvIG90aGVyIHZhbHVlcworZXhwb3J0CUlOU1RBTExfUEFUSCA/PSAvYm9vdAorCisjCisjIElOU1RBTExfTU9EX1BBVEggc3BlY2lmaWVzIGEgcHJlZml4IHRvIE1PRExJQiBmb3IgbW9kdWxlIGRpcmVjdG9yeQorIyByZWxvY2F0aW9ucyByZXF1aXJlZCBieSBidWlsZCByb290cy4gIFRoaXMgaXMgbm90IGRlZmluZWQgaW4gdGhlCisjIG1ha2VmaWxlIGJ1dCB0aGUgYXJndW1lbnQgY2FuIGJlIHBhc3NlZCB0byBtYWtlIGlmIG5lZWRlZC4KKyMKKworTU9ETElCCT0gJChJTlNUQUxMX01PRF9QQVRIKS9saWIvbW9kdWxlcy8kKEtFUk5FTFJFTEVBU0UpCitleHBvcnQgTU9ETElCCisKKworaWZlcSAoJChLQlVJTERfRVhUTU9EKSwpCitidXN5Ym94LWRpcnMJOj0gJChwYXRzdWJzdCAlLywlLCQoZmlsdGVyICUvLCAkKGNvcmUteSkgJChjb3JlLW0pICQobGlicy15KSAkKGxpYnMtbSkpKQorCitidXN5Ym94LWFsbGRpcnMJOj0gJChzb3J0ICQoYnVzeWJveC1kaXJzKSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sIFwKKwkJICAgICAkKGNvcmUtbikgJChjb3JlLSkgJChsaWJzLW4pICQobGlicy0pIFwKKwkJKSkpCisKK2NvcmUteQkJOj0gJChwYXRzdWJzdCAlLywgJS9idWlsdC1pbi5vLCAkKGNvcmUteSkpCitsaWJzLXkxCQk6PSAkKHBhdHN1YnN0ICUvLCAlL2xpYi5hLCAkKGxpYnMteSkpCitsaWJzLXkyCQk6PSAkKHBhdHN1YnN0ICUvLCAlL2J1aWx0LWluLm8sICQobGlicy15KSkKK2xpYnMteQkJOj0gJChsaWJzLXkxKSAkKGxpYnMteTIpCisKKyMgQnVpbGQgYnVzeWJveAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgYnVzeWJveCBpcyBidWlsZCBmcm9tIHRoZSBvYmplY3RzIHNlbGVjdGVkIGJ5ICQoYnVzeWJveC1pbml0KSBhbmQKKyMgJChidXN5Ym94LW1haW4pLiBNb3N0IGFyZSBidWlsdC1pbi5vIGZpbGVzIGZyb20gdG9wLWxldmVsIGRpcmVjdG9yaWVzCisjIGluIHRoZSBrZXJuZWwgdHJlZSwgb3RoZXJzIGFyZSBzcGVjaWZpZWQgaW4gYXJjaC8kKEFSQ0gpTWFrZWZpbGUuCisjIE9yZGVyaW5nIHdoZW4gbGlua2luZyBpcyBpbXBvcnRhbnQsIGFuZCAkKGJ1c3lib3gtaW5pdCkgbXVzdCBiZSBmaXJzdC4KKyMKKyMgYnVzeWJveAorIyAgIF4KKyMgICB8CisjICAgKy08ICQoYnVzeWJveC1pbml0KQorIyAgIHwgICArLS08IGluaXQvdmVyc2lvbi5vICsgbW9yZQorIyAgIHwKKyMgICArLS08ICQoYnVzeWJveC1tYWluKQorIyAgIHwgICAgKy0tPCBkcml2ZXIvYnVpbHQtaW4ubyBtbS9idWlsdC1pbi5vICsgbW9yZQorIyAgIHwKKyMgICArLTwga2FsbHN5bXMubyAoc2VlIGRlc2NyaXB0aW9uIGluIENPTkZJR19LQUxMU1lNUyBzZWN0aW9uKQorIworIyBidXN5Ym94IHZlcnNpb24gKHVuYW1lIC12KSBjYW5ub3QgYmUgdXBkYXRlZCBkdXJpbmcgbm9ybWFsCisjIGRlc2NlbmRpbmctaW50by1zdWJkaXJzIHBoYXNlIHNpbmNlIHdlIGRvIG5vdCB5ZXQga25vdyBpZiB3ZSBuZWVkIHRvCisjIHVwZGF0ZSBidXN5Ym94LgorIyBUaGVyZWZvcmUgdGhpcyBzdGVwIGlzIGRlbGF5ZWQgdW50aWwganVzdCBiZWZvcmUgZmluYWwgbGluayBvZiBidXN5Ym94IC0KKyMgZXhjZXB0IGluIHRoZSBrYWxsc3ltcyBjYXNlIHdoZXJlIGl0IGlzIGRvbmUganVzdCBiZWZvcmUgYWRkaW5nIHRoZQorIyBzeW1ib2xzIHRvIHRoZSBrZXJuZWwuCisjCisjIFN5c3RlbS5tYXAgaXMgZ2VuZXJhdGVkIHRvIGRvY3VtZW50IGFkZHJlc3NlcyBvZiBhbGwga2VybmVsIHN5bWJvbHMKKworYnVzeWJveC1hbGwgIDo9ICQoY29yZS15KSAkKGxpYnMteSkKKworIyBSdWxlIHRvIGxpbmsgYnVzeWJveCAtIGFsc28gdXNlZCBkdXJpbmcgQ09ORklHX0tBTExTWU1TCisjIE1heSBiZSBvdmVycmlkZGVuIGJ5IGFyY2gvJChBUkNIKS9NYWtlZmlsZQorcXVpZXRfY21kX2J1c3lib3hfXyA/PSBMSU5LICAgICRACisgICAgICBjbWRfYnVzeWJveF9fID89ICQoc3JjdHJlZSkvc2NyaXB0cy90cnlsaW5rIFwKKyAgICAgICIkQCIgXAorICAgICAgIiQoQ0MpIiBcCisgICAgICAiJChDRkxBR1MpICQoQ0ZMQUdTX2J1c3lib3gpIiBcCisgICAgICAiJChMREZMQUdTKSAkKEVYVFJBX0xERkxBR1MpIiBcCisgICAgICAiJChjb3JlLXkpIiBcCisgICAgICAiJChsaWJzLXkpIiBcCisgICAgICAiJChMRExJQlMpIgorCisjIEdlbmVyYXRlIFN5c3RlbS5tYXAKK3F1aWV0X2NtZF9zeXNtYXAgPSBTWVNNQVAKKyAgICAgIGNtZF9zeXNtYXAgPSAkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS9zY3JpcHRzL21rc3lzbWFwCisKKyMgTGluayBvZiBidXN5Ym94CisjIElmIENPTkZJR19LQUxMU1lNUyBpcyBzZXQgLnZlcnNpb24gaXMgYWxyZWFkeSB1cGRhdGVkCisjIEdlbmVyYXRlIFN5c3RlbS5tYXAgYW5kIHZlcmlmeSB0aGF0IHRoZSBjb250ZW50IGlzIGNvbnNpc3RlbnQKKyMgVXNlICsgaW4gZnJvbnQgb2YgdGhlIGJ1c3lib3hfdmVyc2lvbiBydWxlIHRvIHNpbGVudCB3YXJuaW5nIHdpdGggbWFrZSAtajIKKyMgRmlyc3QgY29tbWFuZCBpcyAnOicgdG8gYWxsb3cgdXMgdG8gdXNlICsgaW4gZnJvbnQgb2YgdGhlIHJ1bGUKK2RlZmluZSBydWxlX2J1c3lib3hfXworCToKKwkkKGNhbGwgY21kLGJ1c3lib3hfXykKKwkkKFEpZWNobyAnY21kXyRAIDo9ICQoY21kX2J1c3lib3hfXyknID4gJChARCkvLiQoQEYpLmNtZAorZW5kZWYKKworCitpZmRlZiBDT05GSUdfS0FMTFNZTVMKKyMgR2VuZXJhdGUgc2VjdGlvbiBsaXN0aW5nIGFsbCBzeW1ib2xzIGFuZCBhZGQgaXQgaW50byBidXN5Ym94ICQoa2FsbHN5bXMubykKKyMgSXQncyBhIHRocmVlIHN0YWdlIHByb2Nlc3M6CisjIG8gLnRtcF9idXN5Ym94MSBoYXMgYWxsIHN5bWJvbHMgYW5kIHNlY3Rpb25zLCBidXQgX19rYWxsc3ltcyBpcworIyAgIGVtcHR5CisjICAgUnVubmluZyBrYWxsc3ltcyBvbiB0aGF0IGdpdmVzIHVzIC50bXBfa2FsbHN5bXMxLm8gd2l0aAorIyAgIHRoZSByaWdodCBzaXplIC0gYnVzeWJveCB2ZXJzaW9uICh1bmFtZSAtdikgaXMgdXBkYXRlZCBkdXJpbmcgdGhpcyBzdGVwCisjIG8gLnRtcF9idXN5Ym94MiBub3cgaGFzIGEgX19rYWxsc3ltcyBzZWN0aW9uIG9mIHRoZSByaWdodCBzaXplLAorIyAgIGJ1dCBkdWUgdG8gdGhlIGFkZGVkIHNlY3Rpb24sIHNvbWUgYWRkcmVzc2VzIGhhdmUgc2hpZnRlZC4KKyMgICBGcm9tIGhlcmUsIHdlIGdlbmVyYXRlIGEgY29ycmVjdCAudG1wX2thbGxzeW1zMi5vCisjIG8gVGhlIGNvcnJlY3QgLnRtcF9rYWxsc3ltczIubyBpcyBsaW5rZWQgaW50byB0aGUgZmluYWwgYnVzeWJveC4KKyMgbyBWZXJpZnkgdGhhdCB0aGUgU3lzdGVtLm1hcCBmcm9tIGJ1c3lib3ggbWF0Y2hlcyB0aGUgbWFwIGZyb20KKyMgICAudG1wX2J1c3lib3gyLCBqdXN0IGluIGNhc2Ugd2UgZGlkIG5vdCBnZW5lcmF0ZSBrYWxsc3ltcyBjb3JyZWN0bHkuCisjIG8gSWYgQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1MgaXMgc2V0LCBkbyBhbiBleHRyYSBwYXNzIHVzaW5nCisjICAgLnRtcF9idXN5Ym94MyBhbmQgLnRtcF9rYWxsc3ltczMuby4gIFRoaXMgaXMgb25seSBtZWFudCBhcyBhCisjICAgdGVtcG9yYXJ5IGJ5cGFzcyB0byBhbGxvdyB0aGUga2VybmVsIHRvIGJlIGJ1aWx0IHdoaWxlIHRoZQorIyAgIG1haW50YWluZXJzIHdvcmsgb3V0IHdoYXQgd2VudCB3cm9uZyB3aXRoIGthbGxzeW1zLgorCitpZmRlZiBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUworbGFzdF9rYWxsc3ltcyA6PSAzCitlbHNlCitsYXN0X2thbGxzeW1zIDo9IDIKK2VuZGlmCisKK2thbGxzeW1zLm8gOj0gLnRtcF9rYWxsc3ltcyQobGFzdF9rYWxsc3ltcykubworCitkZWZpbmUgdmVyaWZ5X2thbGxzeW1zCisJJChRKSQoaWYgJCgkKHF1aWV0KWNtZF9zeXNtYXApLCAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgZWNobyAnICAkKCQocXVpZXQpY21kX3N5c21hcCkgLnRtcF9TeXN0ZW0ubWFwJyAmJikgIFwKKwkgICQoY21kX3N5c21hcCkgLnRtcF9idXN5Ym94JChsYXN0X2thbGxzeW1zKSAudG1wX1N5c3RlbS5tYXAKKwkkKFEpY21wIC1zIFN5c3RlbS5tYXAgLnRtcF9TeXN0ZW0ubWFwIHx8ICAgICAgICAgICAgICBcCisJCShlY2hvIEluY29uc2lzdGVudCBrYWxsc3ltcyBkYXRhOyAgICAgICAgICAgICBcCisJCSBlY2hvIFRyeSBzZXR0aW5nIENPTkZJR19LQUxMU1lNU19FWFRSQV9QQVNTOyBcCisJCSBybSAudG1wX2thbGxzeW1zKiA7IC9iaW4vZmFsc2UgKQorZW5kZWYKKworIyBVcGRhdGUgYnVzeWJveCB2ZXJzaW9uIGJlZm9yZSBsaW5rCisjIFVzZSArIGluIGZyb250IG9mIHRoaXMgcnVsZSB0byBzaWxlbnQgd2FybmluZyBhYm91dCBtYWtlIC1qMQorIyBGaXJzdCBjb21tYW5kIGlzICc6JyB0byBhbGxvdyB1cyB0byB1c2UgKyBpbiBmcm9udCBvZiB0aGlzIHJ1bGUKK2NtZF9rc3ltX2xkID0gJChjbWRfYnVzeWJveF9fKQorZGVmaW5lIHJ1bGVfa3N5bV9sZAorCToKKwkrJChjYWxsIGNtZCxidXN5Ym94X3ZlcnNpb24pCisJJChjYWxsIGNtZCxidXN5Ym94X18pCisJJChRKWVjaG8gJ2NtZF8kQCA6PSAkKGNtZF9idXN5Ym94X18pJyA+ICQoQEQpLy4kKEBGKS5jbWQKK2VuZGVmCisKKyMgR2VuZXJhdGUgLlMgZmlsZSB3aXRoIGFsbCBrZXJuZWwgc3ltYm9scworcXVpZXRfY21kX2thbGxzeW1zID0gS1NZTSAgICAkQAorICAgICAgY21kX2thbGxzeW1zID0gJChOTSkgLW4gJDwgfCAkKEtBTExTWU1TKSBcCisgICAgICAgICAgICAgICAgICAgICAkKGlmICQoQ09ORklHX0tBTExTWU1TX0FMTCksLS1hbGwtc3ltYm9scykgPiAkQAorCisudG1wX2thbGxzeW1zMS5vIC50bXBfa2FsbHN5bXMyLm8gLnRtcF9rYWxsc3ltczMubzogJS5vOiAlLlMgc2NyaXB0cyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxhc19vX1MpCisKKy50bXBfa2FsbHN5bXMlLlM6IC50bXBfYnVzeWJveCUgJChLQUxMU1lNUykKKwkkKGNhbGwgY21kLGthbGxzeW1zKQorCisjIC50bXBfYnVzeWJveDEgbXVzdCBiZSBjb21wbGV0ZSBleGNlcHQga2FsbHN5bXMsIHNvIHVwZGF0ZSBidXN5Ym94IHZlcnNpb24KKy50bXBfYnVzeWJveDE6ICQoYnVzeWJveC1sZHMpICQoYnVzeWJveC1hbGwpIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfcnVsZSxrc3ltX2xkKQorCisudG1wX2J1c3lib3gyOiAkKGJ1c3lib3gtbGRzKSAkKGJ1c3lib3gtYWxsKSAudG1wX2thbGxzeW1zMS5vIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsYnVzeWJveF9fKQorCisudG1wX2J1c3lib3gzOiAkKGJ1c3lib3gtbGRzKSAkKGJ1c3lib3gtYWxsKSAudG1wX2thbGxzeW1zMi5vIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsYnVzeWJveF9fKQorCisjIE5lZWRzIHRvIHZpc2l0IHNjcmlwdHMvIGJlZm9yZSAkKEtBTExTWU1TKSBjYW4gYmUgdXNlZC4KKyQoS0FMTFNZTVMpOiBzY3JpcHRzIDsKKworIyBHZW5lcmF0ZSBzb21lIGRhdGEgZm9yIGRlYnVnZ2luZyBzdHJhbmdlIGthbGxzeW1zIHByb2JsZW1zCitkZWJ1Z19rYWxsc3ltczogLnRtcF9tYXAkKGxhc3Rfa2FsbHN5bXMpCisKKy50bXBfbWFwJTogLnRtcF9idXN5Ym94JSBGT1JDRQorCSgkKE9CSkRVTVApIC1oICQ8IHwgJChBV0spICcvXiArWzAtOV0ve3ByaW50ICQkNCAiIDAgIiAkJDJ9JzsgJChOTSkgJDwpIHwgc29ydCA+ICRACisKKy50bXBfbWFwMzogLnRtcF9tYXAyCisKKy50bXBfbWFwMjogLnRtcF9tYXAxCisKK2VuZGlmICMgaWZkZWYgQ09ORklHX0tBTExTWU1TCisKKyMgYnVzeWJveCBpbWFnZSAtIGluY2x1ZGluZyB1cGRhdGVkIGtlcm5lbCBzeW1ib2xzCitidXN5Ym94X3Vuc3RyaXBwZWQ6ICQoYnVzeWJveC1hbGwpIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfcnVsZSxidXN5Ym94X18pCisJJChRKXJtIC1mIC5vbGRfdmVyc2lvbgorCitidXN5Ym94OiBidXN5Ym94X3Vuc3RyaXBwZWQKK2lmZXEgKCQoU0tJUF9TVFJJUCkseSkKKwkkKFEpY3AgJDwgJEAKK2Vsc2UKKwkkKFEpJChTVFJJUCkgLXMgLS1yZW1vdmUtc2VjdGlvbj0ubm90ZSAtLXJlbW92ZS1zZWN0aW9uPS5jb21tZW50IFwKKwkJYnVzeWJveF91bnN0cmlwcGVkIC1vICRACisjIHN0cmlwIGlzIGNvbmZ1c2VkIGJ5IFBJRSBleGVjdXRhYmxlIGFuZCBkb2VzIG5vdCBzZXQgZXhlYyBiaXRzCisJJChRKWNobW9kIGEreCAkQAorZW5kaWYKKworIyBUaGUgYWN0dWFsIG9iamVjdHMgYXJlIGdlbmVyYXRlZCB3aGVuIGRlc2NlbmRpbmcsCisjIG1ha2Ugc3VyZSBubyBpbXBsaWNpdCBydWxlIGtpY2tzIGluCiskKHNvcnQgJChidXN5Ym94LWFsbCkpOiAkKGJ1c3lib3gtZGlycykgOworCisjIEhhbmRsZSBkZXNjZW5kaW5nIGludG8gc3ViZGlyZWN0b3JpZXMgbGlzdGVkIGluICQoYnVzeWJveC1kaXJzKQorIyBQcmVzZXQgbG9jYWxlIHZhcmlhYmxlcyB0byBzcGVlZCB1cCB0aGUgYnVpbGQgcHJvY2Vzcy4gTGltaXQgbG9jYWxlCisjIHR3ZWFrcyB0byB0aGlzIHNwb3QgdG8gYXZvaWQgd3JvbmcgbGFuZ3VhZ2Ugc2V0dGluZ3Mgd2hlbiBydW5uaW5nCisjIG1ha2UgbWVudWNvbmZpZyBldGMuCisjIEVycm9yIG1lc3NhZ2VzIHN0aWxsIGFwcGVhcnMgaW4gdGhlIG9yaWdpbmFsIGxhbmd1YWdlCisKK1BIT05ZICs9ICQoYnVzeWJveC1kaXJzKQorJChidXN5Ym94LWRpcnMpOiBwcmVwYXJlIHNjcmlwdHMKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kQAorCisjIEJ1aWxkIHRoZSBrZXJuZWwgcmVsZWFzZSBzdHJpbmcKKyMgVGhlIEtFUk5FTFJFTEVBU0UgaXMgc3RvcmVkIGluIGEgZmlsZSBuYW1lZCAua2VybmVscmVsZWFzZQorIyB0byBiZSB1c2VkIHdoZW4gZXhlY3V0aW5nIGZvciBleGFtcGxlIG1ha2UgaW5zdGFsbCBvciBtYWtlIG1vZHVsZXNfaW5zdGFsbAorIworIyBUYWtlIHRoZSBjb250ZW50cyBvZiBhbnkgZmlsZXMgY2FsbGVkIGxvY2FsdmVyc2lvbiogYW5kIHRoZSBjb25maWcKKyMgdmFyaWFibGUgQ09ORklHX0xPQ0FMVkVSU0lPTiBhbmQgYXBwZW5kIHRoZW0gdG8gS0VSTkVMUkVMRUFTRS4KKyMgTE9DQUxWRVJTSU9OIGZyb20gdGhlIGNvbW1hbmQgbGluZSBvdmVycmlkZSBhbGwgb2YgdGhpcworCitudWxsc3RyaW5nIDo9CitzcGFjZSAgICAgIDo9ICQobnVsbHN0cmluZykgIyBlbmQgb2YgbGluZQorCitfX19sb2NhbHZlciA9ICQob2JqdHJlZSkvbG9jYWx2ZXJzaW9uKiAkKHNyY3RyZWUpL2xvY2FsdmVyc2lvbioKK19fbG9jYWx2ZXIgID0gJChzb3J0ICQod2lsZGNhcmQgJChfX19sb2NhbHZlcikpKQorIyBza2lwIGJhY2t1cCBmaWxlcyAoY29udGFpbmluZyAnficpCitfbG9jYWx2ZXIgPSAkKGZvcmVhY2ggZiwgJChfX2xvY2FsdmVyKSwgJChpZiAkKGZpbmRzdHJpbmcgfiwgJChmKSksLCQoZikpKQorCitsb2NhbHZlciA9ICQoc3Vic3QgJChzcGFjZSksLCBcCisJICAgJChzaGVsbCBjYXQgL2Rldi9udWxsICQoX2xvY2FsdmVyKSkgXAorCSAgICQocGF0c3Vic3QgIiUiLCUsJChDT05GSUdfTE9DQUxWRVJTSU9OKSkpCisKKyMgSWYgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIHNldCBzY3JpcHRzL3NldGxvY2FsdmVyc2lvbiBpcyBjYWxsZWQKKyMgYW5kIGlmIHRoZSBTQ00gaXMga25vdyBhIHRhZyBmcm9tIHRoZSBTQ00gaXMgYXBwZW5kZWQuCisjIFRoZSBhcHBlbmRlZCB0YWcgaXMgZGV0ZXJtaW5kZWQgYnkgdGhlIFNDTSB1c2VkLgorIworIyBDdXJyZW50bHksIG9ubHkgZ2l0IGlzIHN1cHBvcnRlZC4KKyMgT3RoZXIgU0NNcyBjYW4gZWRpdCBzY3JpcHRzL3NldGxvY2FsdmVyc2lvbiBhbmQgYWRkIHRoZSBhcHByb3ByaWF0ZQorIyBjaGVja3MgYXMgbmVlZGVkLgoraWZkZWYgX0JCX0RJU0FCTEVEX0NPTkZJR19MT0NBTFZFUlNJT05fQVVUTworCV9sb2NhbHZlci1hdXRvID0gJChzaGVsbCAkKENPTkZJR19TSEVMTCkgXAorCSAgICAgICAgICAgICAgICAgICQoc3JjdHJlZSkvc2NyaXB0cy9zZXRsb2NhbHZlcnNpb24gJChzcmN0cmVlKSkKKwlsb2NhbHZlci1hdXRvICA9ICQoTE9DQUxWRVJTSU9OKSQoX2xvY2FsdmVyLWF1dG8pCitlbmRpZgorCitsb2NhbHZlci1mdWxsID0gJChsb2NhbHZlcikkKGxvY2FsdmVyLWF1dG8pCisKKyMgU3RvcmUgKG5ldykgS0VSTkVMUkVMQVNFIHN0cmluZyBpbiAua2VybmVscmVsZWFzZQora2VybmVscmVsZWFzZSA9ICQoS0VSTkVMVkVSU0lPTikkKGxvY2FsdmVyLWZ1bGwpCisua2VybmVscmVsZWFzZTogRk9SQ0UKKwkkKFEpcm0gLWYgJEAKKwkkKFEpZWNobyAkKGtlcm5lbHJlbGVhc2UpID4gJEAKKworCisjIFRoaW5ncyB3ZSBuZWVkIHRvIGRvIGJlZm9yZSB3ZSByZWN1cnNpdmVseSBzdGFydCBidWlsZGluZyB0aGUga2VybmVsCisjIG9yIHRoZSBtb2R1bGVzIGFyZSBsaXN0ZWQgaW4gInByZXBhcmUiLgorIyBBIG11bHRpIGxldmVsIGFwcHJvYWNoIGlzIHVzZWQuIHByZXBhcmVOIGlzIHByb2Nlc3NlZCBiZWZvcmUgcHJlcGFyZU4tMS4KKyMgYXJjaHByZXBhcmUgaXMgdXNlZCBpbiBhcmNoIE1ha2VmaWxlcyBhbmQgd2hlbiBwcm9jZXNzZWQgYXNtIHN5bWxpbmssCisjIHZlcnNpb24uaCBhbmQgc2NyaXB0c19iYXNpYyBpcyBwcm9jZXNzZWQgLyBjcmVhdGVkLgorCisjIExpc3RlZCBpbiBkZXBlbmRlbmN5IG9yZGVyCitQSE9OWSArPSBwcmVwYXJlIGFyY2hwcmVwYXJlIHByZXBhcmUwIHByZXBhcmUxIHByZXBhcmUyIHByZXBhcmUzCisKKyMgcHJlcGFyZS1hbGwgaXMgZGVwcmVjYXRlZCwgdXNlIHByZXBhcmUgYXMgdmFsaWQgcmVwbGFjZW1lbnQKK1BIT05ZICs9IHByZXBhcmUtYWxsCisKKyMgcHJlcGFyZTMgaXMgdXNlZCB0byBjaGVjayBpZiB3ZSBhcmUgYnVpbGRpbmcgaW4gYSBzZXBhcmF0ZSBvdXRwdXQgZGlyZWN0b3J5LAorIyBhbmQgaWYgc28gZG86CisjIDEpIENoZWNrIHRoYXQgbWFrZSBoYXMgbm90IGJlZW4gZXhlY3V0ZWQgaW4gdGhlIGtlcm5lbCBzcmMgJChzcmN0cmVlKQorIyAyKSBDcmVhdGUgdGhlIGluY2x1ZGUyIGRpcmVjdG9yeSwgdXNlZCBmb3IgdGhlIHNlY29uZCBhc20gc3ltbGluaworcHJlcGFyZTM6IC5rZXJuZWxyZWxlYXNlCitpZm5lcSAoJChLQlVJTERfU1JDKSwpCisJQGVjaG8gJyAgVXNpbmcgJChzcmN0cmVlKSBhcyBzb3VyY2UgZm9yIGJ1c3lib3gnCisJJChRKWlmIFsgLWYgJChzcmN0cmVlKS8uY29uZmlnIF07IHRoZW4gXAorCQllY2hvICIgICQoc3JjdHJlZSkgaXMgbm90IGNsZWFuLCBwbGVhc2UgcnVuICdtYWtlIG1ycHJvcGVyJyI7XAorCQllY2hvICIgIGluIHRoZSAnJChzcmN0cmVlKScgZGlyZWN0b3J5LiI7XAorCQkvYmluL2ZhbHNlOyBcCisJZmk7CisJJChRKWlmIFsgISAtZCBpbmNsdWRlMiBdOyB0aGVuIG1rZGlyIC1wIGluY2x1ZGUyOyBmaTsKKwkkKFEpbG4gLWZzbiAkKHNyY3RyZWUpL2luY2x1ZGUvYXNtLSQoQVJDSCkgaW5jbHVkZTIvYXNtCitlbmRpZgorCisjIHByZXBhcmUyIGNyZWF0ZXMgYSBtYWtlZmlsZSBpZiB1c2luZyBhIHNlcGFyYXRlIG91dHB1dCBkaXJlY3RvcnkKK3ByZXBhcmUyOiBwcmVwYXJlMyBvdXRwdXRtYWtlZmlsZQorCitwcmVwYXJlMTogcHJlcGFyZTIgaW5jbHVkZS9jb25maWcvTUFSS0VSCitpZm5lcSAoJChLQlVJTERfTU9EVUxFUyksKQorCSQoUSlta2RpciAtcCAkKE1PRFZFUkRJUikKKwkkKFEpcm0gLWYgJChNT0RWRVJESVIpLyoKK2VuZGlmCisKK2FyY2hwcmVwYXJlOiBwcmVwYXJlMSBzY3JpcHRzX2Jhc2ljIGFwcGxldHNfZGlyCisKK3ByZXBhcmUwOiBhcmNocHJlcGFyZSBGT1JDRQorCSQoUSkkKE1BS0UpICQoYnVpbGQpPS4KKworIyBBbGwgdGhlIHByZXBhcmluZy4uCitwcmVwYXJlIHByZXBhcmUtYWxsOiBwcmVwYXJlMAorCisjCUxlYXZlIHRoaXMgYXMgZGVmYXVsdCBmb3IgcHJlcHJvY2Vzc2luZyBidXN5Ym94Lmxkcy5TLCB3aGljaCBpcyBub3cKKyMJZG9uZSBpbiBhcmNoLyQoQVJDSCkva2VybmVsL01ha2VmaWxlCisKK2V4cG9ydCBDUFBGTEFHU19idXN5Ym94LmxkcyArPSAtUCAtQyAtVSQoQVJDSCkKKworIyAJRklYTUU6IFRoZSBhc20gc3ltbGluayBjaGFuZ2VzIHdoZW4gJChBUkNIKSBjaGFuZ2VzLiBUaGF0J3MKKyMJaGFyZCB0byBkZXRlY3QsIGJ1dCBJIHN1cHBvc2UgIm1ha2UgbXJwcm9wZXIiIGlzIGEgZ29vZCBpZGVhCisjCWJlZm9yZSBzd2l0Y2hpbmcgYmV0d2VlbiBhcmNocyBhbnl3YXkuCisKKyNiYm94IyBpbmNsdWRlL2FzbToKKyNiYm94IyAJQGVjaG8gJyAgU1lNTElOSyAkQCAtPiBpbmNsdWRlL2FzbS0kKEFSQ0gpJworI2Jib3gjIAkkKFEpaWYgWyAhIC1kIGluY2x1ZGUgXTsgdGhlbiBta2RpciAtcCBpbmNsdWRlOyBmaTsKKyNiYm94IyAJQGxuIC1mc24gYXNtLSQoQVJDSCkgJEAKKworIyAJU3BsaXQgYXV0b2NvbmYuaCBpbnRvIGluY2x1ZGUvbGludXgvY29uZmlnLyoKK3F1aWV0X2NtZF9nZW5fYmJjb25maWdvcHRzID0gR0VOICAgICBpbmNsdWRlL2JiY29uZmlnb3B0cy5oCisgICAgICBjbWRfZ2VuX2JiY29uZmlnb3B0cyA9ICQoc3JjdHJlZSkvc2NyaXB0cy9ta2NvbmZpZ3MgaW5jbHVkZS9iYmNvbmZpZ29wdHMuaCBpbmNsdWRlL2JiY29uZmlnb3B0c19iejIuaAorcXVpZXRfY21kX3NwbGl0X2F1dG9jb25mICAgPSBTUExJVCAgIGluY2x1ZGUvYXV0b2NvbmYuaCAtPiBpbmNsdWRlL2NvbmZpZy8qCisgICAgICBjbWRfc3BsaXRfYXV0b2NvbmYgICA9IHNjcmlwdHMvYmFzaWMvc3BsaXQtaW5jbHVkZSBpbmNsdWRlL2F1dG9jb25mLmggaW5jbHVkZS9jb25maWcKKyNiYm94IyBwaWdneWJhY2tlZCBnZW5lcmF0aW9uIG9mIGZldyAuaCBmaWxlcworaW5jbHVkZS9jb25maWcvTUFSS0VSOiBzY3JpcHRzL2Jhc2ljL3NwbGl0LWluY2x1ZGUgaW5jbHVkZS9hdXRvY29uZi5oCisJJChjYWxsIGNtZCxzcGxpdF9hdXRvY29uZikKKwkkKGNhbGwgY21kLGdlbl9iYmNvbmZpZ29wdHMpCisJQHRvdWNoICRACisKKyMgR2VuZXJhdGUgc29tZSBmaWxlcworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBLRVJORUxSRUxFQVNFIGNhbiBjaGFuZ2UgZnJvbSBhIGZldyBkaWZmZXJlbnQgcGxhY2VzLCBtZWFuaW5nIHZlcnNpb24uaAorIyBuZWVkcyB0byBiZSB1cGRhdGVkLCBzbyB0aGlzIGNoZWNrIGlzIGZvcmNlZCBvbiBhbGwgYnVpbGRzCisKK3V0c19sZW4gOj0gNjQKKworZGVmaW5lIGZpbGVjaGtfdmVyc2lvbi5oCisJaWYgWyBgZWNobyAtbiAiJChLRVJORUxSRUxFQVNFKSIgfCB3YyAtYyBgIC1ndCAkKHV0c19sZW4pIF07IHRoZW4gXAorCSAgZWNobyAnIiQoS0VSTkVMUkVMRUFTRSkiIGV4Y2VlZHMgJCh1dHNfbGVuKSBjaGFyYWN0ZXJzJyA+JjI7IFwKKwkgIGV4aXQgMTsgXAorCWZpOyBcCisJKGVjaG8gXCNkZWZpbmUgVVRTX1JFTEVBU0UgXCIkKEtFUk5FTFJFTEVBU0UpXCI7IFwKKwkgIGVjaG8gXCNkZWZpbmUgTElOVVhfVkVSU0lPTl9DT0RFIGBleHByICQoVkVSU0lPTikgXFwqIDY1NTM2ICsgJChQQVRDSExFVkVMKSBcXCogMjU2ICsgJChTVUJMRVZFTClgOyBcCisJIGVjaG8gJyNkZWZpbmUgS0VSTkVMX1ZFUlNJT04oYSxiLGMpICgoKGEpIDw8IDE2KSArICgoYikgPDwgOCkgKyAoYykpJzsgXAorCSkKK2VuZGVmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1BIT05ZICs9IGRlcGVuZCBkZXAKK2RlcGVuZCBkZXA6CisJQGVjaG8gJyoqKiBXYXJuaW5nOiBtYWtlICRAIGlzIHVubmVjZXNzYXJ5IG5vdy4nCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIE1vZHVsZXMKKworaWZkZWYgX0JCX0RJU0FCTEVEX0NPTkZJR19NT0RVTEVTCisKKyMgCUJ5IGRlZmF1bHQsIGJ1aWxkIG1vZHVsZXMgYXMgd2VsbAorCithbGw6IG1vZHVsZXMKKworIwlCdWlsZCBtb2R1bGVzCisKK1BIT05ZICs9IG1vZHVsZXMKK21vZHVsZXM6ICQoYnVzeWJveC1kaXJzKSAkKGlmICQoS0JVSUxEX0JVSUxUSU4pLGJ1c3lib3gpCisJQGVjaG8gJyAgQnVpbGRpbmcgbW9kdWxlcywgc3RhZ2UgMi4nOworCSQoUSkkKE1BS0UpIC1yUiAtZiAkKHNyY3RyZWUpL3NjcmlwdHMvTWFrZWZpbGUubW9kcG9zdAorCisKKyMgVGFyZ2V0IHRvIHByZXBhcmUgYnVpbGRpbmcgZXh0ZXJuYWwgbW9kdWxlcworUEhPTlkgKz0gbW9kdWxlc19wcmVwYXJlCittb2R1bGVzX3ByZXBhcmU6IHByZXBhcmUgc2NyaXB0cworCisjIFRhcmdldCB0byBpbnN0YWxsIG1vZHVsZXMKK1BIT05ZICs9IG1vZHVsZXNfaW5zdGFsbAorbW9kdWxlc19pbnN0YWxsOiBfbW9kaW5zdF8gX21vZGluc3RfcG9zdAorCitQSE9OWSArPSBfbW9kaW5zdF8KK19tb2RpbnN0XzoKKwlAaWYgWyAteiAiYCQoREVQTU9EKSAtViAyPi9kZXYvbnVsbCB8IGdyZXAgbW9kdWxlLWluaXQtdG9vbHNgIiBdOyB0aGVuIFwKKwkJZWNobyAiV2FybmluZzogeW91IG1heSBuZWVkIHRvIGluc3RhbGwgbW9kdWxlLWluaXQtdG9vbHMiOyBcCisJCWVjaG8gIlNlZSBodHRwOi8vd3d3LmNvZGVtb25rZXkub3JnLnVrL2RvY3MvcG9zdC1oYWxsb3dlZW4tMi42LnR4dCI7XAorCQlzbGVlcCAxOyBcCisJZmkKKwlAcm0gLXJmICQoTU9ETElCKS9rZXJuZWwKKwlAcm0gLWYgJChNT0RMSUIpL3NvdXJjZQorCUBta2RpciAtcCAkKE1PRExJQikva2VybmVsCisJQGxuIC1zICQoc3JjdHJlZSkgJChNT0RMSUIpL3NvdXJjZQorCUBpZiBbICEgJChvYmp0cmVlKSAtZWYgICQoTU9ETElCKS9idWlsZCBdOyB0aGVuIFwKKwkJcm0gLWYgJChNT0RMSUIpL2J1aWxkIDsgXAorCQlsbiAtcyAkKG9ianRyZWUpICQoTU9ETElCKS9idWlsZCA7IFwKKwlmaQorCSQoUSkkKE1BS0UpIC1yUiAtZiAkKHNyY3RyZWUpL3NjcmlwdHMvTWFrZWZpbGUubW9kaW5zdAorCisjIElmIFN5c3RlbS5tYXAgZXhpc3RzLCBydW4gZGVwbW9kLiAgVGhpcyBkZWxpYmVyYXRlbHkgZG9lcyBub3QgaGF2ZSBhCisjIGRlcGVuZGVuY3kgb24gU3lzdGVtLm1hcCBzaW5jZSB0aGF0IHdvdWxkIHJ1biB0aGUgZGVwZW5kZW5jeSB0cmVlIG9uCisjIGJ1c3lib3guICBUaGlzIGRlcG1vZCBpcyBvbmx5IGZvciBjb252ZW5pZW5jZSB0byBnaXZlIHRoZSBpbml0aWFsCisjIGJvb3QgYSBtb2R1bGVzLmRlcCBldmVuIGJlZm9yZSAvIGlzIG1vdW50ZWQgcmVhZC13cml0ZS4gIEhvd2V2ZXIgdGhlCisjIGJvb3Qgc2NyaXB0IGRlcG1vZCBpcyB0aGUgbWFzdGVyIHZlcnNpb24uCitpZmVxICIkKHN0cmlwICQoSU5TVEFMTF9NT0RfUEFUSCkpIiAiIgorZGVwbW9kX29wdHMJOj0KK2Vsc2UKK2RlcG1vZF9vcHRzCTo9IC1iICQoSU5TVEFMTF9NT0RfUEFUSCkgLXIKK2VuZGlmCitQSE9OWSArPSBfbW9kaW5zdF9wb3N0CitfbW9kaW5zdF9wb3N0OiBfbW9kaW5zdF8KKwlpZiBbIC1yIFN5c3RlbS5tYXAgLWEgLXggJChERVBNT0QpIF07IHRoZW4gJChERVBNT0QpIC1hZSAtRiBTeXN0ZW0ubWFwICQoZGVwbW9kX29wdHMpICQoS0VSTkVMUkVMRUFTRSk7IGZpCisKK2Vsc2UgIyBDT05GSUdfTU9EVUxFUworCisjIE1vZHVsZXMgbm90IGNvbmZpZ3VyZWQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK21vZHVsZXMgbW9kdWxlc19pbnN0YWxsOiBGT1JDRQorCUBlY2hvCisJQGVjaG8gIlRoZSBwcmVzZW50IGJ1c3lib3ggY29uZmlndXJhdGlvbiBoYXMgbW9kdWxlcyBkaXNhYmxlZC4iCisJQGVjaG8gIlR5cGUgJ21ha2UgY29uZmlnJyBhbmQgZW5hYmxlIGxvYWRhYmxlIG1vZHVsZSBzdXBwb3J0LiIKKwlAZWNobyAiVGhlbiBidWlsZCBhIGtlcm5lbCB3aXRoIG1vZHVsZSBzdXBwb3J0IGVuYWJsZWQuIgorCUBlY2hvCisJQGV4aXQgMQorCitlbmRpZiAjIENPTkZJR19NT0RVTEVTCisKKyMjIworIyBDbGVhbmluZyBpcyBkb25lIG9uIHRocmVlIGxldmVscy4KKyMgbWFrZSBjbGVhbiAgICAgRGVsZXRlIG1vc3QgZ2VuZXJhdGVkIGZpbGVzCisjICAgICAgICAgICAgICAgIExlYXZlIGVub3VnaCB0byBidWlsZCBleHRlcm5hbCBtb2R1bGVzCisjIG1ha2UgbXJwcm9wZXIgIERlbGV0ZSB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLCBhbmQgYWxsIGdlbmVyYXRlZCBmaWxlcworIyBtYWtlIGRpc3RjbGVhbiBSZW1vdmUgZWRpdG9yIGJhY2t1cCBmaWxlcywgcGF0Y2ggbGVmdG92ZXIgZmlsZXMgYW5kIHRoZSBsaWtlCisKKyMgRGlyZWN0b3JpZXMgJiBmaWxlcyByZW1vdmVkIHdpdGggJ21ha2UgY2xlYW4nCitDTEVBTl9ESVJTICArPSAkKE1PRFZFUkRJUikgX2luc3RhbGwgMF9saWIKK0NMRUFOX0ZJTEVTICs9CWJ1c3lib3ggYnVzeWJveF91bnN0cmlwcGVkKiBidXN5Ym94LmxpbmtzIFwKKyAgICAgICAgICAgICAgICBTeXN0ZW0ubWFwIC5rZXJuZWxyZWxlYXNlIFwKKyAgICAgICAgICAgICAgICAudG1wX2thbGxzeW1zKiAudG1wX3ZlcnNpb24gLnRtcF9idXN5Ym94KiAudG1wX1N5c3RlbS5tYXAKKworIyBEaXJlY3RvcmllcyAmIGZpbGVzIHJlbW92ZWQgd2l0aCAnbWFrZSBtcnByb3BlcicKK01SUFJPUEVSX0RJUlMgICs9IGluY2x1ZGUvY29uZmlnIGluY2x1ZGUyCitNUlBST1BFUl9GSUxFUyArPSAuY29uZmlnIC5jb25maWcub2xkIGluY2x1ZGUvYXNtIC52ZXJzaW9uIC5vbGRfdmVyc2lvbiBcCisJCSAgaW5jbHVkZS9OVU1fQVBQTEVUUy5oIFwKKwkJICBpbmNsdWRlL2F1dG9jb25mLmggXAorCQkgIGluY2x1ZGUvYmJjb25maWdvcHRzLmggXAorCQkgIGluY2x1ZGUvYmJjb25maWdvcHRzX2J6Mi5oIFwKKwkJICBpbmNsdWRlL3VzYWdlX2NvbXByZXNzZWQuaCBcCisJCSAgaW5jbHVkZS9hcHBsZXRfdGFibGVzLmggXAorCQkgIGluY2x1ZGUvYXBwbGV0cy5oIFwKKwkJICBpbmNsdWRlL3VzYWdlLmggXAorCQkgIGFwcGxldHMvdXNhZ2UgXAorCQkgIC5rZXJuZWxyZWxlYXNlIE1vZHVsZS5zeW12ZXJzIHRhZ3MgVEFHUyBjc2NvcGUqIFwKKwkJICBidXN5Ym94X29sZAorCisjIGNsZWFuIC0gRGVsZXRlIG1vc3QsIGJ1dCBsZWF2ZSBlbm91Z2ggdG8gYnVpbGQgZXh0ZXJuYWwgbW9kdWxlcworIworY2xlYW46IHJtLWRpcnMgIDo9ICQoQ0xFQU5fRElSUykKK2NsZWFuOiBybS1maWxlcyA6PSAkKENMRUFOX0ZJTEVTKQorY2xlYW4tZGlycyAgICAgIDo9ICQoYWRkcHJlZml4IF9jbGVhbl8sJChzcmN0cmVlKSAkKGJ1c3lib3gtYWxsZGlycykpCisKK1BIT05ZICs9ICQoY2xlYW4tZGlycykgY2xlYW4gYXJjaGNsZWFuCiskKGNsZWFuLWRpcnMpOgorCSQoUSkkKE1BS0UpICQoY2xlYW4pPSQocGF0c3Vic3QgX2NsZWFuXyUsJSwkQCkKKworY2xlYW46IGFyY2hjbGVhbiAkKGNsZWFuLWRpcnMpCisJJChjYWxsIGNtZCxybWRpcnMpCisJJChjYWxsIGNtZCxybWZpbGVzKQorCUBmaW5kIC4gJChSQ1NfRklORF9JR05PUkUpIFwKKwkJXCggLW5hbWUgJyouW29hc10nIC1vIC1uYW1lICcqLmtvJyAtbyAtbmFtZSAnLiouY21kJyBcCisJCS1vIC1uYW1lICcuKi5kJyAtbyAtbmFtZSAnLioudG1wJyAtbyAtbmFtZSAnKi5tb2QuYycgXCkgXAorCQktdHlwZSBmIC1wcmludCB8IHhhcmdzIHJtIC1mCisKK1BIT05ZICs9IGRvYy1jbGVhbgorZG9jLWNsZWFuOiBybS1maWxlcyA6PSBkb2NzL2J1c3lib3gucG9kIFwKKwkJICBkb2NzL0J1c3lCb3guaHRtbCBkb2NzL2J1c3lib3guMSBkb2NzL0J1c3lCb3gudHh0Citkb2MtY2xlYW46CisJJChjYWxsIGNtZCxybWZpbGVzKQorCisjIG1ycHJvcGVyIC0gRGVsZXRlIGFsbCBnZW5lcmF0ZWQgZmlsZXMsIGluY2x1ZGluZyAuY29uZmlnCisjCittcnByb3Blcjogcm0tZGlycyAgOj0gJCh3aWxkY2FyZCAkKE1SUFJPUEVSX0RJUlMpKQorbXJwcm9wZXI6IHJtLWZpbGVzIDo9ICQod2lsZGNhcmQgJChNUlBST1BFUl9GSUxFUykpCittcnByb3Blci1kaXJzICAgICAgOj0gJChhZGRwcmVmaXggX21ycHJvcGVyXyxzY3JpcHRzKQorCitQSE9OWSArPSAkKG1ycHJvcGVyLWRpcnMpIG1ycHJvcGVyIGFyY2htcnByb3BlcgorJChtcnByb3Blci1kaXJzKToKKwkkKFEpJChNQUtFKSAkKGNsZWFuKT0kKHBhdHN1YnN0IF9tcnByb3Blcl8lLCUsJEApCisKK21ycHJvcGVyOiBjbGVhbiBhcmNobXJwcm9wZXIgJChtcnByb3Blci1kaXJzKQorCSQoY2FsbCBjbWQscm1kaXJzKQorCSQoY2FsbCBjbWQscm1maWxlcykKKwlAZmluZCAuIC1uYW1lIENvbmZpZy5zcmMgfCBzZWQgJ3MvLnNyYyQkLy5pbi8nIHwgeGFyZ3MgLXIgcm0gLWYKKwlAZmluZCAuIC1uYW1lIEtidWlsZC5zcmMgfCBzZWQgJ3MvLnNyYyQkLy8nIHwgeGFyZ3MgLXIgcm0gLWYKKworIyBkaXN0Y2xlYW4KKyMKK1BIT05ZICs9IGRpc3RjbGVhbgorCitkaXN0Y2xlYW46IG1ycHJvcGVyCisJQGZpbmQgJChzcmN0cmVlKSAkKFJDU19GSU5EX0lHTk9SRSkgXAorCQlcKCAtbmFtZSAnKi5vcmlnJyAtbyAtbmFtZSAnKi5yZWonIC1vIC1uYW1lICcqficgXAorCQktbyAtbmFtZSAnKi5iYWsnIC1vIC1uYW1lICcjKiMnIC1vIC1uYW1lICcuKi5vcmlnJyBcCisJCS1vIC1uYW1lICcuKi5yZWonIC1vIC1uYW1lICcqLnRtcCcgLW8gLXNpemUgMCBcCisJCS1vIC1uYW1lICcqJScgLW8gLW5hbWUgJy4qLmNtZCcgLW8gLW5hbWUgJ2NvcmUnIFwpIFwKKwkJLXR5cGUgZiAtcHJpbnQgfCB4YXJncyBybSAtZgorCisKKyMgUGFja2FnaW5nIG9mIHRoZSBrZXJuZWwgdG8gdmFyaW91cyBmb3JtYXRzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBycG0gdGFyZ2V0IGtlcHQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKK3BhY2thZ2UtZGlyCTo9ICQoc3JjdHJlZSkvc2NyaXB0cy9wYWNrYWdlCisKKyVwa2c6IEZPUkNFCisJJChRKSQoTUFLRSkgJChidWlsZCk9JChwYWNrYWdlLWRpcikgJEAKK3JwbTogRk9SQ0UKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKHBhY2thZ2UtZGlyKSAkQAorCisKKyMgQnJpZWYgZG9jdW1lbnRhdGlvbiBvZiB0aGUgdHlwaWNhbCB0YXJnZXRzIHVzZWQKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2JvYXJkcyA6PSAkKHdpbGRjYXJkICQoc3JjdHJlZSkvY29uZmlncy8qX2RlZmNvbmZpZykKK2JvYXJkcyA6PSAkKG5vdGRpciAkKGJvYXJkcykpCisKKy1pbmNsdWRlICQoc3JjdHJlZSkvTWFrZWZpbGUuaGVscAorCisjIERvY3VtZW50YXRpb24gdGFyZ2V0cworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyVkb2NzOiBzY3JpcHRzX2Jhc2ljIEZPUkNFCisJJChRKSQoTUFLRSkgJChidWlsZCk9RG9jdW1lbnRhdGlvbi9Eb2NCb29rICRACisKK2Vsc2UgIyBLQlVJTERfRVhUTU9ECisKKyMjIworIyBFeHRlcm5hbCBtb2R1bGUgc3VwcG9ydC4KKyMgV2hlbiBidWlsZGluZyBleHRlcm5hbCBtb2R1bGVzIHRoZSBrZXJuZWwgdXNlZCBhcyBiYXNpcyBpcyBjb25zaWRlcmVkCisjIHJlYWQtb25seSwgYW5kIG5vIGNvbnNpc3RlbmN5IGNoZWNrcyBhcmUgbWFkZSBhbmQgdGhlIG1ha2UKKyMgc3lzdGVtIGlzIG5vdCB1c2VkIG9uIHRoZSBiYXNpcyBrZXJuZWwuIElmIHVwZGF0ZXMgYXJlIHJlcXVpcmVkCisjIGluIHRoZSBiYXNpcyBrZXJuZWwgb3JkaW5hcnkgbWFrZSBjb21tYW5kcyAod2l0aG91dCBNPS4uLikgbXVzdAorIyBiZSB1c2VkLgorIworIyBUaGUgZm9sbG93aW5nIGFyZSB0aGUgb25seSB2YWxpZCB0YXJnZXRzIHdoZW4gYnVpbGRpbmcgZXh0ZXJuYWwKKyMgbW9kdWxlcy4KKyMgbWFrZSBNPWRpciBjbGVhbiAgICAgRGVsZXRlIGFsbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlcworIyBtYWtlIE09ZGlyIG1vZHVsZXMgICBNYWtlIGFsbCBtb2R1bGVzIGluIHNwZWNpZmllZCBkaXIKKyMgbWFrZSBNPWRpcgkgICAgICAgU2FtZSBhcyAnbWFrZSBNPWRpciBtb2R1bGVzJworIyBtYWtlIE09ZGlyIG1vZHVsZXNfaW5zdGFsbAorIyAgICAgICAgICAgICAgICAgICAgICBJbnN0YWxsIHRoZSBtb2R1bGVzIGJ1aWxkIGluIHRoZSBtb2R1bGUgZGlyZWN0b3J5CisjICAgICAgICAgICAgICAgICAgICAgIEFzc3VtZXMgaW5zdGFsbCBkaXJlY3RvcnkgaXMgYWxyZWFkeSBjcmVhdGVkCisKKyMgV2UgYXJlIGFsd2F5cyBidWlsZGluZyBtb2R1bGVzCitLQlVJTERfTU9EVUxFUyA6PSAxCitQSE9OWSArPSBjcm1vZHZlcmRpcgorY3Jtb2R2ZXJkaXI6CisJJChRKW1rZGlyIC1wICQoTU9EVkVSRElSKQorCSQoUSlybSAtZiAkKE1PRFZFUkRJUikvKgorCitQSE9OWSArPSAkKG9ianRyZWUpL01vZHVsZS5zeW12ZXJzCiskKG9ianRyZWUpL01vZHVsZS5zeW12ZXJzOgorCUB0ZXN0IC1lICQob2JqdHJlZSkvTW9kdWxlLnN5bXZlcnMgfHwgKCBcCisJZWNobzsgXAorCWVjaG8gIiAgV0FSTklORzogU3ltYm9sIHZlcnNpb24gZHVtcCAkKG9ianRyZWUpL01vZHVsZS5zeW12ZXJzIjsgXAorCWVjaG8gIiAgICAgICAgICAgaXMgbWlzc2luZzsgbW9kdWxlcyB3aWxsIGhhdmUgbm8gZGVwZW5kZW5jaWVzIGFuZCBtb2R2ZXJzaW9ucy4iOyBcCisJZWNobyApCisKK21vZHVsZS1kaXJzIDo9ICQoYWRkcHJlZml4IF9tb2R1bGVfLCQoS0JVSUxEX0VYVE1PRCkpCitQSE9OWSArPSAkKG1vZHVsZS1kaXJzKSBtb2R1bGVzCiskKG1vZHVsZS1kaXJzKTogY3Jtb2R2ZXJkaXIgJChvYmp0cmVlKS9Nb2R1bGUuc3ltdmVycworCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQocGF0c3Vic3QgX21vZHVsZV8lLCUsJEApCisKK21vZHVsZXM6ICQobW9kdWxlLWRpcnMpCisJQGVjaG8gJyAgQnVpbGRpbmcgbW9kdWxlcywgc3RhZ2UgMi4nOworCSQoUSkkKE1BS0UpIC1yUiAtZiAkKHNyY3RyZWUpL3NjcmlwdHMvTWFrZWZpbGUubW9kcG9zdAorCitQSE9OWSArPSBtb2R1bGVzX2luc3RhbGwKK21vZHVsZXNfaW5zdGFsbDogX2Vtb2RpbnN0XyBfZW1vZGluc3RfcG9zdAorCitpbnN0YWxsLWRpciA6PSAkKGlmICQoSU5TVEFMTF9NT0RfRElSKSwkKElOU1RBTExfTU9EX0RJUiksZXh0cmEpCitQSE9OWSArPSBfZW1vZGluc3RfCitfZW1vZGluc3RfOgorCSQoUSlta2RpciAtcCAkKE1PRExJQikvJChpbnN0YWxsLWRpcikKKwkkKFEpJChNQUtFKSAtclIgLWYgJChzcmN0cmVlKS9zY3JpcHRzL01ha2VmaWxlLm1vZGluc3QKKworIyBSdW4gZGVwbW9kIG9ubHkgaXMgd2UgaGF2ZSBTeXN0ZW0ubWFwIGFuZCBkZXBtb2QgaXMgZXhlY3V0YWJsZQorcXVpZXRfY21kX2RlcG1vZCA9IERFUE1PRCAgJChLRVJORUxSRUxFQVNFKQorICAgICAgY21kX2RlcG1vZCA9IGlmIFsgLXIgU3lzdGVtLm1hcCAtYSAteCAkKERFUE1PRCkgXTsgdGhlbiBcCisgICAgICAgICAgICAgICAgICAgICAgJChERVBNT0QpIC1hZSAtRiBTeXN0ZW0ubWFwICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAkKGlmICQoc3RyaXAgJChJTlNUQUxMX01PRF9QQVRIKSksICAgICAgXAorCQkgICAgICAtYiAkKElOU1RBTExfTU9EX1BBVEgpIC1yKSAgICAgICAgICAgICAgXAorCQkgICAgICAkKEtFUk5FTFJFTEVBU0UpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIGZpCisKK1BIT05ZICs9IF9lbW9kaW5zdF9wb3N0CitfZW1vZGluc3RfcG9zdDogX2Vtb2RpbnN0XworCSQoY2FsbCBjbWQsZGVwbW9kKQorCitjbGVhbi1kaXJzIDo9ICQoYWRkcHJlZml4IF9jbGVhbl8sJChLQlVJTERfRVhUTU9EKSkKKworUEhPTlkgKz0gJChjbGVhbi1kaXJzKSBjbGVhbgorJChjbGVhbi1kaXJzKToKKwkkKFEpJChNQUtFKSAkKGNsZWFuKT0kKHBhdHN1YnN0IF9jbGVhbl8lLCUsJEApCisKK2NsZWFuOglybS1kaXJzIDo9ICQoTU9EVkVSRElSKQorY2xlYW46ICQoY2xlYW4tZGlycykKKwkkKGNhbGwgY21kLHJtZGlycykKKwlAZmluZCAkKEtCVUlMRF9FWFRNT0QpICQoUkNTX0ZJTkRfSUdOT1JFKSBcCisJCVwoIC1uYW1lICcqLltvYXNdJyAtbyAtbmFtZSAnKi5rbycgLW8gLW5hbWUgJy4qLmNtZCcgXAorCQktbyAtbmFtZSAnLiouZCcgLW8gLW5hbWUgJy4qLnRtcCcgLW8gLW5hbWUgJyoubW9kLmMnIFwpIFwKKwkJLXR5cGUgZiAtcHJpbnQgfCB4YXJncyBybSAtZgorCisjIER1bW1pZXMuLi4KK1BIT05ZICs9IHByZXBhcmUgc2NyaXB0cworcHJlcGFyZTogOworc2NyaXB0czogOworZW5kaWYgIyBLQlVJTERfRVhUTU9ECisKKyMgR2VuZXJhdGUgdGFncyBmb3IgZWRpdG9ycworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI1dlIHdhbnQgX19zcmN0cmVlIHRvIHRvdGFsbHkgdmFuaXNoIG91dCB3aGVuIEtCVUlMRF9PVVRQVVQgaXMgbm90IHNldAorIyh3aGljaCBpcyB0aGUgbW9zdCBjb21tb24gY2FzZSBJTUhPKSB0byBhdm9pZCB1bm5lZWRlZCBjbHV0dGVyIGluIHRoZSBiaWcgdGFncyBmaWxlLgorI0FkZGluZyAkKHNyY3RyZWUpIGFkZHMgYWJvdXQgMjBNIG9uIGkzODYgdG8gdGhlIHNpemUgb2YgdGhlIG91dHB1dCBmaWxlIQorCitpZmVxICgkKHNyYyksJChvYmopKQorX19zcmN0cmVlID0KK2Vsc2UKK19fc3JjdHJlZSA9ICQoc3JjdHJlZSkvCitlbmRpZgorCitpZmVxICgkKEFMTFNPVVJDRV9BUkNIUyksKQoraWZlcSAoJChBUkNIKSx1bSkKK0FMTElOQ0xVREVfQVJDSFMgOj0gJChBUkNIKSAkKFNVQkFSQ0gpCitlbHNlCitBTExJTkNMVURFX0FSQ0hTIDo9ICQoQVJDSCkKK2VuZGlmCitlbHNlCisjQWxsb3cgdXNlciB0byBzcGVjaWZ5IG9ubHkgQUxMU09VUkNFX1BBVEhTIG9uIHRoZSBjb21tYW5kIGxpbmUsIGtlZXBpbmcgZXhpc3RpbmcgYmVoYXZpb3VyLgorQUxMSU5DTFVERV9BUkNIUyA6PSAkKEFMTFNPVVJDRV9BUkNIUykKK2VuZGlmCisKK0FMTFNPVVJDRV9BUkNIUyA6PSAkKEFSQ0gpCisKK2RlZmluZSBhbGwtc291cmNlcworCSggZmluZCAtcmVnZXggJy4qXC5bY2hdJCQnICkKK2VuZGVmCisKK3F1aWV0X2NtZF9jc2NvcGUtZmlsZSA9IEZJTEVMU1QgY3Njb3BlLmZpbGVzCisgICAgICBjbWRfY3Njb3BlLWZpbGUgPSAoZWNobyBcLWs7IGVjaG8gXC1xOyAkKGFsbC1zb3VyY2VzKSkgPiBjc2NvcGUuZmlsZXMKKworcXVpZXRfY21kX2NzY29wZSA9IE1BS0UgICAgY3Njb3BlLm91dAorICAgICAgY21kX2NzY29wZSA9IGNzY29wZSAtYgorCitjc2NvcGU6IEZPUkNFCisJJChjYWxsIGNtZCxjc2NvcGUtZmlsZSkKKwkkKGNhbGwgY21kLGNzY29wZSkKKworcXVpZXRfY21kX1RBR1MgPSBNQUtFICAgJEAKK2RlZmluZSBjbWRfVEFHUworCXJtIC1mICRAOyBcCisJRVRBR1NGPWBldGFncyAtLXZlcnNpb24gfCBncmVwIC1pIGV4dWJlcmFudCA+L2Rldi9udWxsICYmICAgICBcCisgICAgICAgICAgICAgICAgZWNobyAiLUkgX19pbml0ZGF0YSxfX2V4aXRkYXRhLF9fYWNxdWlyZXMsX19yZWxlYXNlcyAgXAorICAgICAgICAgICAgICAgICAgICAgIC1JIEVYUE9SVF9TWU1CT0wsRVhQT1JUX1NZTUJPTF9HUEwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAtLWV4dHJhPStmIC0tYy1raW5kcz0rcHgiYDsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgJChhbGwtc291cmNlcykgfCB4YXJncyBldGFncyAkJEVUQUdTRiAtYQorZW5kZWYKKworVEFHUzogRk9SQ0UKKwkkKGNhbGwgY21kLFRBR1MpCisKKworcXVpZXRfY21kX3RhZ3MgPSBNQUtFICAgJEAKK2RlZmluZSBjbWRfdGFncworCXJtIC1mICRAOyBcCisJQ1RBR1NGPWBjdGFncyAtLXZlcnNpb24gfCBncmVwIC1pIGV4dWJlcmFudCA+L2Rldi9udWxsICYmICAgICBcCisgICAgICAgICAgICAgICAgZWNobyAiLUkgX19pbml0ZGF0YSxfX2V4aXRkYXRhLF9fYWNxdWlyZXMsX19yZWxlYXNlcyAgXAorICAgICAgICAgICAgICAgICAgICAgIC1JIEVYUE9SVF9TWU1CT0wsRVhQT1JUX1NZTUJPTF9HUEwgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAtLWV4dHJhPStmIC0tYy1raW5kcz0rcHgiYDsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgJChhbGwtc291cmNlcykgfCB4YXJncyBjdGFncyAkJENUQUdTRiAtYQorZW5kZWYKKwordGFnczogRk9SQ0UKKwkkKGNhbGwgY21kLHRhZ3MpCisKKworIyBTY3JpcHRzIHRvIGNoZWNrIHZhcmlvdXMgdGhpbmdzIGZvciBjb25zaXN0ZW5jeQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW5jbHVkZWNoZWNrOgorCWZpbmQgKiAkKFJDU19GSU5EX0lHTk9SRSkgXAorCQktbmFtZSAnKi5baGNTXScgLXR5cGUgZiAtcHJpbnQgfCBzb3J0IFwKKwkJfCB4YXJncyAkKFBFUkwpIC13IHNjcmlwdHMvY2hlY2tpbmNsdWRlcy5wbAorCit2ZXJzaW9uY2hlY2s6CisJZmluZCAqICQoUkNTX0ZJTkRfSUdOT1JFKSBcCisJCS1uYW1lICcqLltoY1NdJyAtdHlwZSBmIC1wcmludCB8IHNvcnQgXAorCQl8IHhhcmdzICQoUEVSTCkgLXcgc2NyaXB0cy9jaGVja3ZlcnNpb24ucGwKKworbmFtZXNwYWNlY2hlY2s6CisJJChQRVJMKSAkKHNyY3RyZWUpL3NjcmlwdHMvbmFtZXNwYWNlLnBsCisKK2VuZGlmICNpZmVxICgkKGNvbmZpZy10YXJnZXRzKSwxKQorZW5kaWYgI2lmZXEgKCQobWl4ZWQtdGFyZ2V0cyksMSkKKworUEhPTlkgKz0gY2hlY2tzdGFjaworY2hlY2tzdGFjazoKKwkkKE9CSkRVTVApIC1kIGJ1c3lib3ggJCQoZmluZCAuIC1uYW1lICcqLmtvJykgfCBcCisJJChQRVJMKSAkKHNyYykvc2NyaXB0cy9jaGVja3N0YWNrLnBsICQoQVJDSCkKKwora2VybmVscmVsZWFzZToKKwkkKGlmICQod2lsZGNhcmQgLmtlcm5lbHJlbGVhc2UpLCAkKFEpZWNobyAkKEtFUk5FTFJFTEVBU0UpLCBcCisJJChlcnJvciBrZXJuZWxyZWxlYXNlIG5vdCB2YWxpZCAtIHJ1biAnbWFrZSAqY29uZmlnJyB0byB1cGRhdGUgaXQpKQora2VybmVsdmVyc2lvbjoKKwlAZWNobyAkKEtFUk5FTFZFUlNJT04pCisKKyMgU2luZ2xlIHRhcmdldHMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFNpbmdsZSB0YXJnZXRzIGFyZSBjb21wYXRpYmxlIHdpdGg6CisjIC0gYnVpbGQgd2hpdGggbWl4ZWQgc291cmNlIGFuZCBvdXRwdXQKKyMgLSBidWlsZCB3aXRoIHNlcGFyYXRlIG91dHB1dCBkaXIgJ21ha2UgTz0uLi4nCisjIC0gZXh0ZXJuYWwgbW9kdWxlcworIworIyAgdGFyZ2V0LWRpciA9PiB3aGVyZSB0byBzdG9yZSBvdXRwdXRmaWxlCisjICBidWlsZC1kaXIgID0+IGRpcmVjdG9yeSBpbiBrZXJuZWwgc291cmNlIHRyZWUgdG8gdXNlCisKK2lmZXEgKCQoS0JVSUxEX0VYVE1PRCksKQorICAgICAgICBidWlsZC1kaXIgID0gJChwYXRzdWJzdCAlLywlLCQoZGlyICRAKSkKKyAgICAgICAgdGFyZ2V0LWRpciA9ICQoZGlyICRAKQorZWxzZQorICAgICAgICB6YXAtc2xhc2g9JChmaWx0ZXItb3V0IC4sJChwYXRzdWJzdCAlLywlLCQoZGlyICRAKSkpCisgICAgICAgIGJ1aWxkLWRpciAgPSAkKEtCVUlMRF9FWFRNT0QpJChpZiAkKHphcC1zbGFzaCksLyQoemFwLXNsYXNoKSkKKyAgICAgICAgdGFyZ2V0LWRpciA9ICQoaWYgJChLQlVJTERfRVhUTU9EKSwkKGRpciAkPCksJChkaXIgJEApKQorZW5kaWYKKworJS5zOiAlLmMgcHJlcGFyZSBzY3JpcHRzIEZPUkNFCisJJChRKSQoTUFLRSkgJChidWlsZCk9JChidWlsZC1kaXIpICQodGFyZ2V0LWRpcikkKG5vdGRpciAkQCkKKyUuaTogJS5jIHByZXBhcmUgc2NyaXB0cyBGT1JDRQorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYnVpbGQtZGlyKSAkKHRhcmdldC1kaXIpJChub3RkaXIgJEApCislLm86ICUuYyBwcmVwYXJlIHNjcmlwdHMgRk9SQ0UKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJ1aWxkLWRpcikgJCh0YXJnZXQtZGlyKSQobm90ZGlyICRAKQorJS5sc3Q6ICUuYyBwcmVwYXJlIHNjcmlwdHMgRk9SQ0UKKwkkKFEpJChNQUtFKSAkKGJ1aWxkKT0kKGJ1aWxkLWRpcikgJCh0YXJnZXQtZGlyKSQobm90ZGlyICRAKQorJS5zOiAlLlMgcHJlcGFyZSBzY3JpcHRzIEZPUkNFCisJJChRKSQoTUFLRSkgJChidWlsZCk9JChidWlsZC1kaXIpICQodGFyZ2V0LWRpcikkKG5vdGRpciAkQCkKKyUubzogJS5TIHByZXBhcmUgc2NyaXB0cyBGT1JDRQorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSQoYnVpbGQtZGlyKSAkKHRhcmdldC1kaXIpJChub3RkaXIgJEApCisKKyMgTW9kdWxlcworJS86IHByZXBhcmUgc2NyaXB0cyBGT1JDRQorCSQoUSkkKE1BS0UpIEtCVUlMRF9NT0RVTEVTPSQoaWYgJChDT05GSUdfTU9EVUxFUyksMSkgXAorCSQoYnVpbGQpPSQoYnVpbGQtZGlyKQorLzogcHJlcGFyZSBzY3JpcHRzIEZPUkNFCisJJChRKSQoTUFLRSkgS0JVSUxEX01PRFVMRVM9JChpZiAkKENPTkZJR19NT0RVTEVTKSwxKSBcCisJJChidWlsZCk9JChidWlsZC1kaXIpCisKKyUua286IHByZXBhcmUgc2NyaXB0cyBGT1JDRQorCSQoUSkkKE1BS0UpIEtCVUlMRF9NT0RVTEVTPSQoaWYgJChDT05GSUdfTU9EVUxFUyksMSkgICBcCisJJChidWlsZCk9JChidWlsZC1kaXIpICQoQDoua289Lm8pCisJJChRKSQoTUFLRSkgLXJSIC1mICQoc3JjdHJlZSkvc2NyaXB0cy9NYWtlZmlsZS5tb2Rwb3N0CisKKyMgRklYTUUgU2hvdWxkIGdvIGludG8gYSBtYWtlLmxpYiBvciBzb21ldGhpbmcKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3F1aWV0X2NtZF9ybWRpcnMgPSAkKGlmICQod2lsZGNhcmQgJChybS1kaXJzKSksQ0xFQU4gICAkKHdpbGRjYXJkICQocm0tZGlycykpKQorICAgICAgY21kX3JtZGlycyA9IHJtIC1yZiAkKHJtLWRpcnMpCisKK3F1aWV0X2NtZF9ybWZpbGVzID0gJChpZiAkKHdpbGRjYXJkICQocm0tZmlsZXMpKSxDTEVBTiAgICQod2lsZGNhcmQgJChybS1maWxlcykpKQorICAgICAgY21kX3JtZmlsZXMgPSBybSAtZiAkKHJtLWZpbGVzKQorCisKK2FfZmxhZ3MgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChBRkxBR1MpICQoQUZMQUdTX0tFUk5FTCkgXAorCSAgJChOT1NURElOQ19GTEFHUykgJChDUFBGTEFHUykgXAorCSAgJChtb2RrZXJuX2FmbGFncykgJChFWFRSQV9BRkxBR1MpICQoQUZMQUdTXyQoKkYpLm8pCisKK3F1aWV0X2NtZF9hc19vX1MgPSBBUyAgICAgICRACitjbWRfYXNfb19TICAgICAgID0gJChDQykgJChhX2ZsYWdzKSAtYyAtbyAkQCAkPAorCisjIHJlYWQgYWxsIHNhdmVkIGNvbW1hbmQgbGluZXMKKwordGFyZ2V0cyA6PSAkKHdpbGRjYXJkICQoc29ydCAkKHRhcmdldHMpKSkKK2NtZF9maWxlcyA6PSAkKHdpbGRjYXJkIC4qLmNtZCAkKGZvcmVhY2ggZiwkKHRhcmdldHMpLCQoZGlyICQoZikpLiQobm90ZGlyICQoZikpLmNtZCkpCisKK2lmbmVxICgkKGNtZF9maWxlcyksKQorICAkKGNtZF9maWxlcyk6IDsJIyBEbyBub3QgdHJ5IHRvIHVwZGF0ZSBpbmNsdWRlZCBkZXBlbmRlbmN5IGZpbGVzCisgIGluY2x1ZGUgJChjbWRfZmlsZXMpCitlbmRpZgorCisjIFNob3J0aGFuZCBmb3IgJChRKSQoTUFLRSkgLWYgc2NyaXB0cy9NYWtlZmlsZS5jbGVhbiBvYmo9ZGlyCisjIFVzYWdlOgorIyAkKFEpJChNQUtFKSAkKGNsZWFuKT1kaXIKK2NsZWFuIDo9IC1mICQoaWYgJChLQlVJTERfU1JDKSwkKHNyY3RyZWUpLylzY3JpcHRzL01ha2VmaWxlLmNsZWFuIG9iagorCitlbmRpZgkjIHNraXAtbWFrZWZpbGUKKworUEhPTlkgKz0gRk9SQ0UKK0ZPUkNFOgorCistaW5jbHVkZSAkKHNyY3RyZWUpL01ha2VmaWxlLmN1c3RvbQorCisjIERlY2xhcmUgdGhlIGNvbnRlbnRzIG9mIHRoZSAuUEhPTlkgdmFyaWFibGUgYXMgcGhvbnkuICBXZSBrZWVwIHRoYXQKKyMgaW5mb3JtYXRpb24gaW4gYSB2YXJpYWJsZSBzZSB3ZSBjYW4gdXNlIGl0IGluIGlmX2NoYW5nZWQgYW5kIGZyaWVuZHMuCisuUEhPTlk6ICQoUEhPTlkpCmRpZmYgLS1naXQgYS9NYWtlZmlsZS5jdXN0b20gYi9NYWtlZmlsZS5jdXN0b20KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkxYzljZQotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlLmN1c3RvbQpAQCAtMCwwICsxLDE5NSBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBCdWlsZCBzeXN0ZW0KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworYnVzeWJveC5saW5rczogJChzcmN0cmVlKS9hcHBsZXRzL2J1c3lib3gubWtsbCAkKG9ianRyZWUpL2luY2x1ZGUvYXV0b2NvbmYuaCBpbmNsdWRlL2FwcGxldHMuaAorCSQoUSktJChTSEVMTCkgJF4gPiAkQAorCitidXN5Ym94LmNmZy5zdWlkOiAkKHNyY3RyZWUpL2FwcGxldHMvYnVzeWJveC5ta3N1aWQgJChvYmp0cmVlKS9pbmNsdWRlL2F1dG9jb25mLmggaW5jbHVkZS9hcHBsZXRzLmgKKwkkKFEpLVNVSUQ9InllcyIgJChTSEVMTCkgJF4gPiAkQAorYnVzeWJveC5jZmcubm9zdWlkOiAkKHNyY3RyZWUpL2FwcGxldHMvYnVzeWJveC5ta3N1aWQgJChvYmp0cmVlKS9pbmNsdWRlL2F1dG9jb25mLmggaW5jbHVkZS9hcHBsZXRzLmgKKwkkKFEpLVNVSUQ9IkRST1AiICQoU0hFTEwpICReID4gJEAKKworLlBIT05ZOiBpbnN0YWxsCitpZmVxICgkKENPTkZJR19JTlNUQUxMX0FQUExFVF9TWU1MSU5LUykseSkKK0lOU1RBTExfT1BUUzo9IC0tc3ltbGlua3MKK2VuZGlmCitpZmVxICgkKENPTkZJR19JTlNUQUxMX0FQUExFVF9IQVJETElOS1MpLHkpCitJTlNUQUxMX09QVFM6PSAtLWhhcmRsaW5rcworZW5kaWYKK2lmZXEgKCQoQ09ORklHX0lOU1RBTExfQVBQTEVUX1NDUklQVF9XUkFQUEVSUykseSkKK2lmZXEgKCQoQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NZTUxJTkspLHkpCitJTlNUQUxMX09QVFM6PSAtLXN3LXNoLXN5bQorZW5kaWYKK2lmZXEgKCQoQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX0hBUkRMSU5LKSx5KQorSU5TVEFMTF9PUFRTOj0gLS1zdy1zaC1oYXJkCitlbmRpZgoraWZlcSAoJChDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfU0NSSVBUX1dSQVBQRVIpLHkpCitJTlNUQUxMX09QVFM6PSAtLXNjcmlwdHdyYXBwZXIKK2VuZGlmCitlbmRpZgoraWZlcSAoJChDT05GSUdfRkVBVFVSRV9JTkRJVklEVUFMKSx5KQorSU5TVEFMTF9PUFRTOj0gLS1iaW5hcmllcworTElCQlVTWUJPWF9TT05BTUU6PSAwX2xpYi9saWJidXN5Ym94LnNvLiQoQkJfVkVSKQorZW5kaWYKK2luc3RhbGw6ICQoc3JjdHJlZSkvYXBwbGV0cy9pbnN0YWxsLnNoIGJ1c3lib3ggYnVzeWJveC5saW5rcworCSQoUSlET19JTlNUQUxMX0xJQlM9IiQoc3RyaXAgJChMSUJCVVNZQk9YX1NPTkFNRSkgJChET19JTlNUQUxMX0xJQlMpKSIgXAorCQkkKFNIRUxMKSAkPCAkKENPTkZJR19QUkVGSVgpICQoSU5TVEFMTF9PUFRTKQoraWZlcSAoJChzdHJpcCAkKENPTkZJR19GRUFUVVJFX1NVSUQpKSx5KQorCUBlY2hvCisJQGVjaG8KKwlAZWNobyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUBlY2hvIFlvdSB3aWxsIHByb2JhYmx5IG5lZWQgdG8gbWFrZSB5b3VyIGJ1c3lib3ggYmluYXJ5CisJQGVjaG8gc2V0dWlkIHJvb3QgdG8gZW5zdXJlIGFsbCBjb25maWd1cmVkIGFwcGxldHMgd2lsbAorCUBlY2hvIHdvcmsgcHJvcGVybHkuCisJQGVjaG8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwlAZWNobworZW5kaWYKKwordW5pbnN0YWxsOiBidXN5Ym94LmxpbmtzCisJcm0gLWYgJChDT05GSUdfUFJFRklYKS9iaW4vYnVzeWJveAorCWZvciBpIGluIGBjYXQgYnVzeWJveC5saW5rc2AgOyBkbyBybSAtZiAkKENPTkZJR19QUkVGSVgpJCRpOyBkb25lCitpZm5lcSAoJChzdHJpcCAkKERPX0lOU1RBTExfTElCUykpLG4pCisJZm9yIGkgaW4gJChMSUJCVVNZQk9YX1NPTkFNRSkgJChET19JTlNUQUxMX0xJQlMpOyBkbyBcCisJCXJtIC1mICQoQ09ORklHX1BSRUZJWCkkJGk7IFwKKwlkb25lCitlbmRpZgorCisjIE5vdCB2ZXJ5IGVsZWdhbnQ6IGNvcGllcyB0ZXN0c3VpdGUgdG8gb2JqZGlyLi4uCisjIChjcCAtcFBSIGlzIFBPU0lYLWNvbXBsaWFudCAoY3AgLWRwUiBvciBjcCAtYSB3b3VsZCBub3QgYmUpKQorLlBIT05ZOiBjaGVjaworLlBIT05ZOiB0ZXN0CitpZmVxICgkKENPTkZJR19VTklUX1RFU1QpLHkpCitVTklUX0NNRCA9IC4vYnVzeWJveCB1bml0CitlbmRpZgorY2hlY2sgdGVzdDogYnVzeWJveCBidXN5Ym94LmxpbmtzCisJJChVTklUX0NNRCkKKwl0ZXN0IC1kICQob2JqdHJlZSkvdGVzdHN1aXRlIHx8IGNwIC1wUFIgJChzcmN0cmVlKS90ZXN0c3VpdGUgJChvYmp0cmVlKQorCWJpbmRpcj0kKG9ianRyZWUpIHNyY2Rpcj0kKHNyY3RyZWUpL3Rlc3RzdWl0ZSBcCisJJChTSEVMTCkgLWMgImNkICQob2JqdHJlZSkvdGVzdHN1aXRlICYmICQoc3JjdHJlZSkvdGVzdHN1aXRlL3J1bnRlc3QgJChpZiAkKEtCVUlMRF9WRVJCT1NFOjA9KSwtdikiCisKKy5QSE9OWTogcmVsZWFzZQorcmVsZWFzZTogZGlzdGNsZWFuCisJY2QgLi47IFwKKwlybSAtciAtZiBidXN5Ym94LSQoVkVSU0lPTikuJChQQVRDSExFVkVMKS4kKFNVQkxFVkVMKSQoRVhUUkFWRVJTSU9OKTsgXAorCWNwIC1wUFIgYnVzeWJveCBidXN5Ym94LSQoVkVSU0lPTikuJChQQVRDSExFVkVMKS4kKFNVQkxFVkVMKSQoRVhUUkFWRVJTSU9OKSAmJiB7IFwKKwlmaW5kIGJ1c3lib3gtJChWRVJTSU9OKS4kKFBBVENITEVWRUwpLiQoU1VCTEVWRUwpJChFWFRSQVZFUlNJT04pLyAtdHlwZSBkIFwKKwkJLW5hbWUgLnN2biBcCisJCS1wcmludCBcCisJCS1leGVjIHJtIC1yIC1mIHt9IFw7IDsgXAorCWZpbmQgYnVzeWJveC0kKFZFUlNJT04pLiQoUEFUQ0hMRVZFTCkuJChTVUJMRVZFTCkkKEVYVFJBVkVSU0lPTikvIC10eXBlIGQgXAorCQktbmFtZSAuZ2l0IFwKKwkJLXByaW50IFwKKwkJLWV4ZWMgcm0gLXIgLWYge30gXDsgOyBcCisJZmluZCBidXN5Ym94LSQoVkVSU0lPTikuJChQQVRDSExFVkVMKS4kKFNVQkxFVkVMKSQoRVhUUkFWRVJTSU9OKS8gLXR5cGUgZiBcCisJCS1uYW1lIC5naXRpZ25vcmUgXAorCQktcHJpbnQgXAorCQktZXhlYyBybSAtZiB7fSBcOyA7IFwKKwlmaW5kIGJ1c3lib3gtJChWRVJTSU9OKS4kKFBBVENITEVWRUwpLiQoU1VCTEVWRUwpJChFWFRSQVZFUlNJT04pLyAtdHlwZSBmIFwKKwkJLW5hbWUgLlwjKiBcCisJCS1wcmludCBcCisJCS1leGVjIHJtIC1mIHt9IFw7IDsgXAorCXRhciAtY3pmIGJ1c3lib3gtJChWRVJTSU9OKS4kKFBBVENITEVWRUwpLiQoU1VCTEVWRUwpJChFWFRSQVZFUlNJT04pLnRhci5neiBcCisJCWJ1c3lib3gtJChWRVJTSU9OKS4kKFBBVENITEVWRUwpLiQoU1VCTEVWRUwpJChFWFRSQVZFUlNJT04pLyA7IH0KKworLlBIT05ZOiBjaGVja2hlbHAKK2NoZWNraGVscDoKKwkkKFEpJChzcmN0cmVlKS9zY3JpcHRzL2NoZWNraGVscC5hd2sgXAorCQkkKHBhdHN1YnN0ICUsJChzcmN0cmVlKS8lLCQod2lsZGNhcmQgJChwYXRzdWJzdCAlLCUvQ29uZmlnLmluLCQoYnVzeWJveC1kaXJzKSAuLykpKQorCisuUEhPTlk6IHNpemVzCitzaXplczogYnVzeWJveF91bnN0cmlwcGVkCisJJChOTSkgLS1zaXplLXNvcnQgJCg8KQorCisuUEhPTlk6IGJsb2F0Y2hlY2sKK2Jsb2F0Y2hlY2s6IGJ1c3lib3hfb2xkIGJ1c3lib3hfdW5zdHJpcHBlZAorCUAkKHNyY3RyZWUpL3NjcmlwdHMvYmxvYXQtby1tZXRlciBidXN5Ym94X29sZCBidXN5Ym94X3Vuc3RyaXBwZWQKKwlAJChDUk9TU19DT01QSUxFKXNpemUgYnVzeWJveF9vbGQgYnVzeWJveF91bnN0cmlwcGVkCisKKy5QSE9OWTogYmFzZWxpbmUKK2Jhc2VsaW5lOiBidXN5Ym94X3Vuc3RyaXBwZWQKKwlAbXYgYnVzeWJveF91bnN0cmlwcGVkIGJ1c3lib3hfb2xkCisKKy5QSE9OWTogb2Jqc2l6ZXMKK29ianNpemVzOiBidXN5Ym94X3Vuc3RyaXBwZWQKKwkkKHNyY3RyZWUpL3NjcmlwdHMvb2Jqc2l6ZXMKKworLlBIT05ZOiBzdGtzaXplcworc3Rrc2l6ZXM6IGJ1c3lib3hfdW5zdHJpcHBlZAorCSQoQ1JPU1NfQ09NUElMRSlvYmpkdW1wIC1kIGJ1c3lib3hfdW5zdHJpcHBlZCB8ICQoc3JjdHJlZSkvc2NyaXB0cy9jaGVja3N0YWNrLnBsICQoQVJDSCkgfCB1bmlxCisKKy5QSE9OWTogYmlnZGF0YQorYmlnZGF0YTogYnVzeWJveF91bnN0cmlwcGVkCisJJChDUk9TU19DT01QSUxFKW5tIC0tc2l6ZS1zb3J0IGJ1c3lib3hfdW5zdHJpcHBlZCB8IGdyZXAgLXZpICcgW3Ryd10gJworCisjIERvY3VtZW50YXRpb24gVGFyZ2V0cworLlBIT05ZOiBkb2MKK2RvYzogZG9jcy9idXN5Ym94LnBvZCBkb2NzL0J1c3lCb3gudHh0IGRvY3MvYnVzeWJveC4xIGRvY3MvQnVzeUJveC5odG1sCisKKyMgRklYTUU6IERvZXNuJ3QgYmVsb25nIGhlcmUKKyAgICAgICBjbWRfZG9jID0KKyBxdWlldF9jbWRfZG9jID0gJChRKWVjaG8gIiAgRE9DICAgICAkKEBGKSIKK3NpbGVudF9jbWRfZG9jID0KK2Rpc3BfZG9jICAgICAgID0gJCgkKHF1aWV0KWNtZF9kb2MpCisKKyMgc2VkIGFkZHMgbmV3bGluZXMgYWZ0ZXIgIk9wdGlvbnM6IiBldGMsCisjIHRoaXMgaXMgbmVlZGVkIGluIG9yZGVyIHRvIGdldCBnb29kIEJ1c3lCb3guezEsdHh0LGh0bWx9Citkb2NzL2J1c3lib3gucG9kOiAkKHNyY3RyZWUpL2RvY3MvYnVzeWJveF9oZWFkZXIucG9kIFwKKwkJaW5jbHVkZS91c2FnZS5oIFwKKwkJJChzcmN0cmVlKS9kb2NzL2J1c3lib3hfZm9vdGVyLnBvZCBcCisJCWFwcGxldHMvdXNhZ2VfcG9kCisJJChkaXNwX2RvYykKKwkkKFEpLW1rZGlyIC1wIGRvY3MKKwkkKFEpLSggXAorCSAgICBjYXQgJChzcmN0cmVlKS9kb2NzL2J1c3lib3hfaGVhZGVyLnBvZDsgXAorCSAgICBlY2hvOyBcCisJICAgIGFwcGxldHMvdXNhZ2VfcG9kIHwgc2VkICdzL15bQS1aYS16XVtBLVphLXogXSpbYS16XTokJC8mXG4vJzsgXAorCSAgICBjYXQgJChzcmN0cmVlKS9kb2NzL2J1c3lib3hfZm9vdGVyLnBvZDsgXAorCSAgICApID4gZG9jcy9idXN5Ym94LnBvZAorCitkb2NzL0J1c3lCb3gudHh0OiBkb2NzL2J1c3lib3gucG9kCisJJChkaXNwX2RvYykKKwkkKFEpLW1rZGlyIC1wIGRvY3MKKwkkKFEpLXBvZDJ0ZXh0ICQ8ID4gJEAKKworZG9jcy9idXN5Ym94LjE6IGRvY3MvYnVzeWJveC5wb2QKKwkkKGRpc3BfZG9jKQorCSQoUSktbWtkaXIgLXAgZG9jcworCSQoUSktcG9kMm1hbiAtLWNlbnRlcj1idXN5Ym94IC0tcmVsZWFzZT0idmVyc2lvbiAkKEtFUk5FTFZFUlNJT04pIiAkPCA+ICRACisKK2RvY3MvQnVzeUJveC5odG1sOiBkb2NzL2J1c3lib3gubmV0L0J1c3lCb3guaHRtbAorCSQoZGlzcF9kb2MpCisJJChRKS1ta2RpciAtcCBkb2NzCisJJChRKS1ybSAtZiBkb2NzL0J1c3lCb3guaHRtbAorCSQoUSktY3AgZG9jcy9idXN5Ym94Lm5ldC9CdXN5Qm94Lmh0bWwgZG9jcy9CdXN5Qm94Lmh0bWwKKworZG9jcy9idXN5Ym94Lm5ldC9CdXN5Qm94Lmh0bWw6IGRvY3MvYnVzeWJveC5wb2QKKwkkKFEpLW1rZGlyIC1wIGRvY3MvYnVzeWJveC5uZXQKKwkkKFEpLXBvZDJodG1sIC0tbm9pbmRleCAkPCA+ICRACisJJChRKS1ybSAtZiBwb2QyaHRtKgorCisjIGRvY3VtZW50YXRpb24sIGNyb3NzLXJlZmVyZW5jZQorIyBNb2Rlcm4gZGlzdHJpYnV0aW9ucyBhbHJlYWR5IHNoaXAgc3lub3BzaXMgcGFja2FnZXMgKGUuZy4gZGViaWFuKQorIyBJZiB5b3UgaGF2ZSBhbiBvbGQgZGlzdHJpYnV0aW9uIGdvIHRvIGh0dHA6Ly9zeW5vcHNpcy5mcmVzY28ub3JnLworc3luX3RndCA9ICQod2lsZGNhcmQgJChwYXRzdWJzdCAlLCUvKi5jLCQoYnVzeWJveC1hbGxkaXJzKSkpCitzeW4gICAgID0gJChwYXRzdWJzdCAlLmMsICUuc3luLCAkKHN5bl90Z3QpKQorCitjb21tYTo9ICwKK2JyYWNlX29wZW46PSAoCiticmFjZV9jbG9zZTo9ICkKKworU1lOX0NQUEZMQUdTIDo9ICQoc3RyaXAgJChDUFBGTEFHUykgJChFWFRSQV9DUFBGTEFHUykpCitTWU5fQ1BQRkxBR1MgOj0gJChzdWJzdCAkKGJyYWNlX29wZW4pLFwkKGJyYWNlX29wZW4pLCQoU1lOX0NQUEZMQUdTKSkKK1NZTl9DUFBGTEFHUyA6PSAkKHN1YnN0ICQoYnJhY2VfY2xvc2UpLFwkKGJyYWNlX2Nsb3NlKSwkKFNZTl9DUFBGTEFHUykpCisjU1lOX0NQUEZMQUdTIDo9ICQoc3Vic3QgIixcIiwkKFNZTl9DUFBGTEFHUykpCisjIikKKyNTWU5fQ1BQRkxBR1MgOj0gWyQocGF0c3Vic3QgJSwnJSckKGNvbW1hKSwkKFNZTl9DUFBGTEFHUykpJyddCisKKyUuc3luOiAlLmMKKwlzeW5vcHNpcyAtcCBDIC1sIENvbW1lbnRzLlNTREZpbHRlcixDb21tZW50cy5QcmV2aW91cyAtV3AscHJlcHJvY2Vzcz1UcnVlLGNwcGZsYWdzPSInJChTWU5fQ1BQRkxBR1MpJyIgLW8gJEAgJDwKKworLlBIT05ZOiBodG1sCitodG1sOiAkKHN5bikKKwlzeW5vcHNpcyAtZiBIVE1MIC1XZix0aXRsZT0iJ0J1c3lCb3ggRG9jdW1lbnRhdGlvbiciIC1vICRAICReCisKKy1pbmNsdWRlICQoc3JjdHJlZSkvTWFrZWZpbGUubG9jYWwKZGlmZiAtLWdpdCBhL01ha2VmaWxlLmZsYWdzIGIvTWFrZWZpbGUuZmxhZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY3NzY3NAotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlLmZsYWdzCkBAIC0wLDAgKzEsMTg2IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEJ1aWxkIHN5c3RlbQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitCQl9WRVIgPSAkKFZFUlNJT04pLiQoUEFUQ0hMRVZFTCkuJChTVUJMRVZFTCkkKEVYVFJBVkVSU0lPTikKK2V4cG9ydCBCQl9WRVIKK1NLSVBfU1RSSVAgPz0gbgorCisjIC1zdGQ9Z251OTkgbmVlZGVkIGZvciBbVV1MTE9OR19NQVggb24gc29tZSBzeXN0ZW1zCitDUFBGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1zdGQ9Z251OTksKQorCitDUFBGTEFHUyArPSBcCisJLUlpbmNsdWRlIC1JbGliYmIgXAorCSQoaWYgJChLQlVJTERfU1JDKSwtSWluY2x1ZGUyIC1JJChzcmN0cmVlKS9pbmNsdWRlIC1JJChzcmN0cmVlKS9saWJiYikgXAorCS1pbmNsdWRlIGluY2x1ZGUvYXV0b2NvbmYuaCBcCisJLURfR05VX1NPVVJDRSAtRE5ERUJVRyBcCisJJChpZiAkKENPTkZJR19MRlMpLC1EX0xBUkdFRklMRV9TT1VSQ0UgLURfTEFSR0VGSUxFNjRfU09VUkNFIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQpIFwKKwktRCJCQl9WRVI9S0JVSUxEX1NUUigkKEJCX1ZFUikpIiAtREJCX0JUPUFVVE9DT05GX1RJTUVTVEFNUAorCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtV2FsbCwpCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtV3NoYWRvdywpCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtV3dyaXRlLXN0cmluZ3MsKQorQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLVd1bmRlZiwpCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtV3N0cmljdC1wcm90b3R5cGVzLCkKK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1XdW51c2VkIC1XdW51c2VkLXBhcmFtZXRlciwpCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtV3VudXNlZC1mdW5jdGlvbiAtV3VudXNlZC12YWx1ZSwpCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtV21pc3NpbmctcHJvdG90eXBlcyAtV21pc3NpbmctZGVjbGFyYXRpb25zLCkKK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1Xbm8tZm9ybWF0LXNlY3VyaXR5LCkKKyMgd2FybiBhYm91dCBDOTkgZGVjbGFyYXRpb24gYWZ0ZXIgc3RhdGVtZW50CitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCwpCisjIElmIHlvdSB3YW50IHRvIGFkZCBtb3JlIC1Xc29tZXRoaW5nIGFib3ZlLCBtYWtlIHN1cmUgdGhhdCBpdCBpcworIyBzdGlsbCBwb3NzaWJsZSB0byBidWlsZCBiYm94IHdpdGhvdXQgd2FybmluZ3MuCisKK2lmZXEgKCQoQ09ORklHX1dFUlJPUikseSkKK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1XZXJyb3IsKQorIyMgVE9ETzoKKyMjIGdjYyB2ZXJzaW9uIDQuNC4wIDIwMDkwNTA2IChSZWQgSGF0IDQuNC4wLTQpIChHQ0MpIGlzIGEgUElUQToKKyMjIGNvbnN0IGNoYXIgKnB0cjsgLi4uIG9mZl90IHYgPSAqKG9mZl90KilwdHI7IC0+IEJPT00KKyMjIGFuZCBubyBlYXN5IHdheSB0byBjb252aW5jZSBpdCB0byBzaHV0IHRoZSBoZWxsIHVwLgorIyMgV2UgaGF2ZSBhIGxvdCBvZiBzdWNoIHRoaW5ncyBhbGwgb3ZlciB0aGUgcGxhY2UuCisjIyBDbGFzc2ljICoob2ZmX3QqKSh2b2lkKilwdHIgZG9lcyBub3Qgd29yaywKKyMjIGFuZCBJIGFtIHVud2lsbGluZyB0byBkbyBjcmF6eSBnY2Mgc3BlY2lmaWMgKHsgdm9pZCAqcHBwID0gLi4uOyB9KQorIyMgc3R1ZmYgaW4gbWFjcm9zLiBUaGlzIHdvdWxkIG9iZnVzY2F0ZSB0aGUgY29kZSB0b28gbXVjaC4KKyMjIE1heWJlIHRyeSBfX2F0dHJpYnV0ZV9fKChfX21heV9hbGlhc19fKSk/CisjQ0ZMQUdTICs9ICQoY2FsbCBjYy1pZnZlcnNpb24sIC1lcSwgMDQwNCwgLWZuby1zdHJpY3QtYWxpYXNpbmcpCitlbmRpZgorIyBnY2MgMy54IGVtaXRzIGJvZ3VzICJvbGQgc3R5bGUgcHJvdG8iIHdhcm5pbmcgb24gZmluZC5jOmFsbG9jX2FjdGlvbigpCitDRkxBR1MgKz0gJChjYWxsIGNjLWlmdmVyc2lvbiwgLWdlLCAwNDAwLCAtV29sZC1zdHlsZS1kZWZpbml0aW9uKQorCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtZm5vLWJ1aWx0aW4tc3RybGVuIC1maW5saW5lLWxpbWl0PTAgLWZvbWl0LWZyYW1lLXBvaW50ZXIgLWZmdW5jdGlvbi1zZWN0aW9ucyAtZmRhdGEtc2VjdGlvbnMsKQorIyAtZm5vLWd1ZXNzLWJyYW5jaC1wcm9iYWJpbGl0eTogcHJvaGliaXQgcHNldWRvLXJhbmRvbSBndWVzc2luZworIyBvZiBicmFuY2ggcHJvYmFiaWxpdGllcyAoaG9wZWZ1bGx5IG1ha2VzIGJsb2F0Y2hlY2sgbW9yZSBzdGFibGUpOgorQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLWZuby1ndWVzcy1icmFuY2gtcHJvYmFiaWxpdHksKQorQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLWZ1bnNpZ25lZC1jaGFyIC1zdGF0aWMtbGliZ2NjLCkKK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1mYWxpZ24tZnVuY3Rpb25zPTEgLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbGFiZWxzPTEgLWZhbGlnbi1sb29wcz0xLCkKKyMgRGVmZWF0IC5laF9mcmFtZSBibG9hdCAoZ2NjIDQuNi4zIHg4Ni0zMiBkZWZjb25maWc6IDIwJSBzbWFsbGVyIGJ1c3lib3ggYmluYXJ5KToKK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1mbm8tdW53aW5kLXRhYmxlcywpCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtZm5vLWFzeW5jaHJvbm91cy11bndpbmQtdGFibGVzLCkKKyMgTm8gYXV0b21hdGljIHByaW50Zi0+cHV0cyxwdXRjaGFyIGNvbnZlcnNpb25zCisjICh0cnkgZGlzYWJsaW5nIHRoaXMgYW5kIGNvbXBhcmluZyBhc3NlbWJseSwgaXQncyBpbnN0cnVjdGl2ZSkKK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1mbm8tYnVpbHRpbi1wcmludGYsKQorCisjIEZJWE1FOiBUaGVzZSB3YXJuaW5ncyBhcmUgYXQgbGVhc3QgcGFydGlhbGx5IHRvIGJlIGNvbmNlcm5lZCBhYm91dCBhbmQgc2hvdWxkCisjIGJlIGZpeGVkLi4KKyNDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtV2NvbnZlcnNpb24sKQorCitpZm5lcSAoJChDT05GSUdfREVCVUcpLHkpCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtT3MsJChjYWxsIGNjLW9wdGlvbiwtTzIsKSkKK2Vsc2UKK0NGTEFHUyArPSAkKGNhbGwgY2Mtb3B0aW9uLC1nLCkKKyNDRkxBR1MgKz0gIi1EX0ZPUlRJRllfU09VUkNFPTIiCitpZmVxICgkKENPTkZJR19ERUJVR19QRVNTSU1JWkUpLHkpCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtTzAsKQorZWxzZQorQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLU9zLCQoY2FsbCBjYy1vcHRpb24sLU8yLCkpCitlbmRpZgorZW5kaWYKKworIyBJZiBhcmNoLyQoQVJDSCkvTWFrZWZpbGUgZGlkIG5vdCBvdmVycmlkZSBpdCAod2l0aCwgc2F5LCAtZlBJQykuLi4KK0FSQ0hfRlBJQyA/PSAtZnBpYworQVJDSF9GUElFID89IC1mcGllCitBUkNIX1BJRSA/PSAtcGllCisKKyMgVXNhZ2U6ICQoZXZhbCAkKGNhbGwgcGtnX2NoZWNrX21vZHVsZXMsVkFSSUFCTEUtUFJFRklYLE1PRFVMRVMpKQorZGVmaW5lIHBrZ19jaGVja19tb2R1bGVzCiskKDEpX0NGTEFHUyA6PSAkKHNoZWxsICQoUEtHX0NPTkZJRykgJChQS0dfQ09ORklHX0ZMQUdTKSAtLWNmbGFncyAkKDIpKQorJCgxKV9MSUJTIDo9ICQoc2hlbGwgJChQS0dfQ09ORklHKSAkKFBLR19DT05GSUdfRkxBR1MpIC0tbGlicyAkKDIpKQorZW5kZWYKKworaWZlcSAoJChDT05GSUdfQlVJTERfTElCQlVTWUJPWCkseSkKKyMgb24gaTM4NjogMTQlIHNtYWxsZXIgbGliYnVzeWJveC5zbworIyAoY29kZSBpdHNlbGYgaXMgOSUgYmlnZ2VyLCB3ZSBzYXZlIG9uIHJlbG9jcy9QTFQvR09UKQorQ0ZMQUdTICs9ICQoQVJDSF9GUElDKQorIyBhbmQgYW5vdGhlciA0JSByZWR1Y3Rpb24gb2YgbGliYnVzeWJveC5zbzoKKyMgKGV4dGVybmFsIGVudHJ5IHBvaW50cyBtdXN0IGJlIG1hcmtlZCBFWFRFUk5BTExZX1ZJU0lCTEUpCitDRkxBR1MgKz0gJChjYWxsIGNjLW9wdGlvbiwtZnZpc2liaWxpdHk9aGlkZGVuKQorZW5kaWYKKworaWZlcSAoJChDT05GSUdfU1RBVElDKSx5KQorQ0ZMQUdTX2J1c3lib3ggKz0gLXN0YXRpYworUEtHX0NPTkZJR19GTEFHUyArPSAtLXN0YXRpYworZW5kaWYKKworaWZlcSAoJChDT05GSUdfUElFKSx5KQorQ0ZMQUdTX2J1c3lib3ggKz0gJChBUkNIX1BJRSkKK0NGTEFHUyArPSAkKEFSQ0hfRlBJRSkKK2VuZGlmCisKK2lmbmVxICgkKENPTkZJR19FWFRSQV9DRkxBR1MpLCkKK0NGTEFHUyArPSAkKHN0cmlwICQoc3Vic3QgIiwsJChDT05GSUdfRVhUUkFfQ0ZMQUdTKSkpCisjIikpCitlbmRpZgorCisjIE5vdGU6IGJvdGggIiIgKHN0cmluZyBjb25zaXN0aW5nIG9mIHR3byBxdW90ZSBjaGFycykgYW5kIGVtcHR5IHN0cmluZworIyBhcmUgcG9zc2libGUsIGFuZCBzaG91bGQgYmUgc2tpcHBlZCBiZWxvdy4KK2lmbmVxICgkKHN1YnN0ICIiLCwkKENPTkZJR19TWVNST09UKSksKQorQ0ZMQUdTICs9IC0tc3lzcm9vdD0kKENPTkZJR19TWVNST09UKQorZXhwb3J0IFNZU1JPT1Q9JChDT05GSUdfU1lTUk9PVCkKK2VuZGlmCisKKyMgQW5kcm9pZCBoYXMgbm8gc2VwYXJhdGUgY3J5cHQgbGlicmFyeQorIyBnY2MtNC4yLjEgZmFpbHMgaWYgd2UgdHJ5IHRvIGZlZWQgQyBzb3VyY2Ugb24gc3RkaW46CisjICBlY2hvICdpbnQgbWFpbih2b2lkKXtyZXR1cm4gMDt9JyB8ICQoQ0MpICQoQ0ZMQUdTKSAtbGNyeXB0IC1vIC9kZXYvbnVsbCAteGMgLQorIyBmYWxsIGJhY2sgdG8gdXNpbmcgYSB0ZW1wIGZpbGU6CitDUllQVF9BVkFJTEFCTEUgOj0gJChzaGVsbCBlY2hvICdpbnQgbWFpbih2b2lkKXtyZXR1cm4gMDt9JyA+Y3J5cHR0ZXN0LmM7ICQoQ0MpICQoQ0ZMQUdTKSAtbGNyeXB0IC1vIC9kZXYvbnVsbCBjcnlwdHRlc3QuYyA+L2Rldi9udWxsIDI+JjEgJiYgZWNobyAieSI7IHJtIGNyeXB0dGVzdC5jKQoraWZlcSAoJChDUllQVF9BVkFJTEFCTEUpLHkpCitMRExJQlMgKz0gbSBjcnlwdAorZWxzZQorTERMSUJTICs9IG0KK2VuZGlmCisKKyMgbGlicGFtIG1heSB1c2UgbGlicHRocmVhZCwgbGliZGwgYW5kL29yIGxpYmF1ZGl0LgorIyBPbiBzb21lIHBsYXRmb3JtcyB0aGF0IHJlcXVpcmVzIGFuIGV4cGxpY2l0IC1scHRocmVhZCwgLWxkbCwgLWxhdWRpdC4KKyMgSG93ZXZlciwgb24gKm90aGVyIHBsYXRmb3JtcyogaXQgZmFpbHMgd2hlbiBzb21lIG9mIHRob3NlIGZsYWdzCisjIGdpdmVuIG5lZWRsZXNzbHkuIE9uIHNvbWUgc3lzdGVtcywgY3J5cHQgbmVlZHMgcHRocmVhZC4KKyMKKyMgSSBldmVuIGhhZCBhIHN5c3RlbSB3aGVyZSBhIHJ1bnRpbWUgdGVzdCBmb3IgcHRocmVhZAorIyAoc2ltaWxhciB0byBDUllQVF9BVkFJTEFCTEUgdGVzdCBhYm92ZSkgd2FzIG5vdCByZWxpYWJsZS4KKyMKKyMgRG8gbm90IHByb3BhZ2F0ZSB0aGlzIG1lc3MgYnkgYWRkaW5nIGxpYnJhcmllcyB0byBDT05GSUdfUEFNL0NSWVBUX0FWQUlMQUJMRSBibG9ja3MuCisjIEFkZCBsaWJyYXJpZXMgeW91IG5lZWQgdG8gQ09ORklHX0VYVFJBX0xETElCUyBpbnN0ZWFkLgorCitpZmVxICgkKENPTkZJR19QQU0pLHkpCitMRExJQlMgKz0gcGFtIHBhbV9taXNjCitlbmRpZgorCitpZmVxICgkKENPTkZJR19TRUxJTlVYKSx5KQorU0VMSU5VWF9QQ19NT0RVTEVTID0gbGlic2VsaW51eCBsaWJzZXBvbAorJChldmFsICQoY2FsbCBwa2dfY2hlY2tfbW9kdWxlcyxTRUxJTlVYLCQoU0VMSU5VWF9QQ19NT0RVTEVTKSkpCitDUFBGTEFHUyArPSAkKFNFTElOVVhfQ0ZMQUdTKQorTERMSUJTICs9ICQoaWYgJChTRUxJTlVYX0xJQlMpLCQoU0VMSU5VWF9MSUJTOi1sJT0lKSwkKFNFTElOVVhfUENfTU9EVUxFUzpsaWIlPSUpKQorZW5kaWYKKworaWZlcSAoJChDT05GSUdfRUZFTkNFKSx5KQorTERMSUJTICs9IGVmZW5jZQorZW5kaWYKKworaWZlcSAoJChDT05GSUdfRE1BTExPQykseSkKK0xETElCUyArPSBkbWFsbG9jCitlbmRpZgorCisjIElmIGEgZmxhdCBiaW5hcnkgc2hvdWxkIGJlIGJ1aWx0LCBDRkxBR1NfYnVzeWJveD0iLWVsZjJmbHQiCisjIGVudiB2YXIgc2hvdWxkIGJlIHNldCBmb3IgbWFrZSBpbnZvY2F0aW9uLgorIyBIZXJlIHdlIGNoZWNrIHdoZXRoZXIgQ0ZMQUdTX2J1c3lib3ggaW5kZWVkIGNvbnRhaW5zIHRoYXQgZmxhZy4KKyMgKEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIHdlIGFsc28gY2hlY2sgTERGTEFHUywgd2hpY2ggZG9lc24ndAorIyBzZWVtIHRvIGJlIGVudGlyZWx5IGNvcnJlY3QgdmFyaWFibGUgdG8gcHV0ICItZWxmMmZsdCIgaW50bykuCitXX0VMRjJGTFQgPSAtZWxmMmZsdAoraWZuZXEgKCwkKGZpbmRzdHJpbmcgJChXX0VMRjJGTFQpLCQoTERGTEFHUykgJChDRkxBR1NfYnVzeWJveCkpKQorU0tJUF9TVFJJUCA9IHkKK2VuZGlmCisKK2lmbmVxICgkKENPTkZJR19FWFRSQV9MREZMQUdTKSwpCitMREZMQUdTICs9ICQoc3RyaXAgJChzdWJzdCAiLCwkKENPTkZJR19FWFRSQV9MREZMQUdTKSkpCisjIikpCitlbmRpZgorCitpZm5lcSAoJChDT05GSUdfRVhUUkFfTERMSUJTKSwpCitMRExJQlMgKz0gJChzdHJpcCAkKHN1YnN0ICIsLCQoQ09ORklHX0VYVFJBX0xETElCUykpKQorIyIpKQorZW5kaWYKKworIyBCdXN5Ym94IGlzIGEgc3RhY2stZmF0dHkgc28gbWFrZSBzdXJlIHdlIGluY3JlYXNlIGRlZmF1bHQgc2l6ZQorIyBUT0RPOiB1c2UgIm1ha2Ugc3Rrc2l6ZXMiIHRvIGZpbmQgJiBmaXggYmlnIHN0YWNrIHVzZXJzCisjICh3ZSBzdG9sZSBzY3JpcHRzL2NoZWNrc3RhY2sucGwgZnJvbSB0aGUga2VybmVsLi4uIHRoYW5rcyBndXlzISkKKyMgUmVkdWNlZCBmcm9tIDIwayB0byAxNmsgaW4gMS45LjAuCitGTFRGTEFHUyArPSAtcyAxNjAwMApkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuaGVscCBiL01ha2VmaWxlLmhlbHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyM2UyYQotLS0gL2Rldi9udWxsCisrKyBiL01ha2VmaWxlLmhlbHAKQEAgLTAsMCArMSw0NCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBCdWlsZCBzeXN0ZW0KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaGVscDoKKwlAZWNobyAnQ2xlYW5pbmc6JworCUBlY2hvICcgIGNsZWFuCQkJLSBkZWxldGUgdGVtcG9yYXJ5IGZpbGVzIGNyZWF0ZWQgYnkgYnVpbGQnCisJQGVjaG8gJyAgZGlzdGNsZWFuCQktIGRlbGV0ZSBhbGwgbm9uLXNvdXJjZSBmaWxlcyAoaW5jbHVkaW5nIC5jb25maWcpJworCUBlY2hvICcgIGRvYy1jbGVhbgkJLSBkZWxldGUgYWxsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uJworCUBlY2hvCisJQGVjaG8gJ0J1aWxkOicKKwlAZWNobyAnICBhbGwJCQktIEV4ZWN1dGFibGUgYW5kIGRvY3VtZW50YXRpb24nCisJQGVjaG8gJyAgYnVzeWJveAkJLSB0aGUgc3dpc3MtYXJteSBleGVjdXRhYmxlJworCUBlY2hvICcgIGRvYwkJCS0gZG9jcy9CdXN5Qm94Lnt0eHQsaHRtbCwxfScKKwlAZWNobyAnICBodG1sCQkJLSBjcmVhdGUgaHRtbC1iYXNlZCBjcm9zcy1yZWZlcmVuY2UnCisJQGVjaG8KKwlAZWNobyAnQ29uZmlndXJhdGlvbjonCisJQGVjaG8gJyAgYWxsbm9jb25maWcJCS0gZGlzYWJsZSBhbGwgc3ltYm9scyBpbiAuY29uZmlnJworCUBlY2hvICcgIGFsbHllc2NvbmZpZwkJLSBlbmFibGUgYWxsIHN5bWJvbHMgaW4gLmNvbmZpZyAoc2VlIGRlZmNvbmZpZyknCisJQGVjaG8gJyAgY29uZmlnCQktIHRleHQgYmFzZWQgY29uZmlndXJhdG9yIChvZiBsYXN0IHJlc29ydCknCisJQGVjaG8gJyAgZGVmY29uZmlnCQktIHNldCAuY29uZmlnIHRvIGxhcmdlc3QgZ2VuZXJpYyBjb25maWd1cmF0aW9uJworCUBlY2hvICcgIG1lbnVjb25maWcJCS0gaW50ZXJhY3RpdmUgY3Vyc2VzLWJhc2VkIGNvbmZpZ3VyYXRvcicKKwlAZWNobyAnICBvbGRjb25maWcJCS0gcmVzb2x2ZSBhbnkgdW5yZXNvbHZlZCBzeW1ib2xzIGluIC5jb25maWcnCisJQCQoaWYgJChib2FyZHMpLCBcCisJCSQoZm9yZWFjaCBiLCAkKGJvYXJkcyksIFwKKwkJcHJpbnRmICIgICUtMjFzIC0gQnVpbGQgZm9yICVzXFxuIiAkKGIpICQoc3Vic3QgX2RlZmNvbmZpZywsJChiKSk7KSBcCisJCWVjaG8gJycpCisJQGVjaG8KKwlAZWNobyAnSW5zdGFsbGF0aW9uOicKKwlAZWNobyAnICBpbnN0YWxsCQktIGluc3RhbGwgYnVzeWJveCBpbnRvIENPTkZJR19QUkVGSVgnCisJQGVjaG8gJyAgdW5pbnN0YWxsJworCUBlY2hvCisJQGVjaG8gJ0RldmVsb3BtZW50OicKKwlAZWNobyAnICBiYXNlbGluZQkJLSBjcmVhdGUgYnVzeWJveF9vbGQgZm9yIGJsb2F0Y2hlY2suJworCUBlY2hvICcgIGJsb2F0Y2hlY2sJCS0gc2hvdyBzaXplIGRpZmZlcmVuY2UgYmV0d2VlbiBvbGQgYW5kIG5ldyB2ZXJzaW9ucycKKwlAZWNobyAnICBjaGVjawkJCS0gcnVuIHRoZSB0ZXN0IHN1aXRlIGZvciBhbGwgYXBwbGV0cycKKwlAZWNobyAnICBjaGVja2hlbHAJCS0gY2hlY2sgZm9yIG1pc3NpbmcgaGVscC1lbnRyaWVzIGluIENvbmZpZy5pbicKKwlAZWNobyAnICByYW5kY29uZmlnCQktIGdlbmVyYXRlIGEgcmFuZG9tIGNvbmZpZ3VyYXRpb24nCisJQGVjaG8gJyAgcmVsZWFzZQkJLSBjcmVhdGUgYSBkaXN0cmlidXRpb24gdGFyYmFsbCcKKwlAZWNobyAnICBzaXplcwkJCS0gc2hvdyBzaXplIG9mIGFsbCBlbmFibGVkIGJ1c3lib3ggc3ltYm9scycKKwlAZWNobyAnICBvYmpzaXplcwkJLSBzaG93IHNpemUgb2YgZWFjaCAubyBvYmplY3QgYnVpbHQnCisJQGVjaG8gJyAgYmlnZGF0YQkJLSBzaG93IGRhdGEgb2JqZWN0cywgYmlnZ2VzdCBmaXJzdCcKKwlAZWNobyAnICBzdGtzaXplcwkJLSBzaG93IHN0YWNrIHVzZXJzLCBiaWdnZXN0IGZpcnN0JworCUBlY2hvCmRpZmYgLS1naXQgYS9SRUFETUUgYi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRhNTkzNQotLS0gL2Rldi9udWxsCisrKyBiL1JFQURNRQpAQCAtMCwwICsxLDIwNCBAQAorUGxlYXNlIHNlZSB0aGUgTElDRU5TRSBmaWxlIGZvciBkZXRhaWxzIG9uIGNvcHlpbmcgYW5kIHVzYWdlLgorUGxlYXNlIHJlZmVyIHRvIHRoZSBJTlNUQUxMIGZpbGUgZm9yIGluc3RydWN0aW9ucyBvbiBob3cgdG8gYnVpbGQuCisKK1doYXQgaXMgYnVzeWJveDoKKworICBCdXN5Qm94IGNvbWJpbmVzIHRpbnkgdmVyc2lvbnMgb2YgbWFueSBjb21tb24gVU5JWCB1dGlsaXRpZXMgaW50byBhIHNpbmdsZQorICBzbWFsbCBleGVjdXRhYmxlLiAgSXQgcHJvdmlkZXMgbWluaW1hbGlzdCByZXBsYWNlbWVudHMgZm9yIG1vc3Qgb2YgdGhlCisgIHV0aWxpdGllcyB5b3UgdXN1YWxseSBmaW5kIGluIGJ6aXAyLCBjb3JldXRpbHMsIGRoY3AsIGRpZmZ1dGlscywgZTJmc3Byb2dzLAorICBmaWxlLCBmaW5kdXRpbHMsIGdhd2ssIGdyZXAsIGluZXR1dGlscywgbGVzcywgbW9kdXRpbHMsIG5ldC10b29scywgcHJvY3BzLAorICBzZWQsIHNoYWRvdywgc3lza2xvZ2QsIHN5c3Zpbml0LCB0YXIsIHV0aWwtbGludXgsIGFuZCB2aW0uICBUaGUgdXRpbGl0aWVzCisgIGluIEJ1c3lCb3ggb2Z0ZW4gaGF2ZSBmZXdlciBvcHRpb25zIHRoYW4gdGhlaXIgZnVsbC1mZWF0dXJlZCBjb3VzaW5zOworICBob3dldmVyLCB0aGUgb3B0aW9ucyB0aGF0IGFyZSBpbmNsdWRlZCBwcm92aWRlIHRoZSBleHBlY3RlZCBmdW5jdGlvbmFsaXR5CisgIGFuZCBiZWhhdmUgdmVyeSBtdWNoIGxpa2UgdGhlaXIgbGFyZ2VyIGNvdW50ZXJwYXJ0cy4KKworICBCdXN5Qm94IGhhcyBiZWVuIHdyaXR0ZW4gd2l0aCBzaXplLW9wdGltaXphdGlvbiBhbmQgbGltaXRlZCByZXNvdXJjZXMgaW4KKyAgbWluZCwgYm90aCB0byBwcm9kdWNlIHNtYWxsIGJpbmFyaWVzIGFuZCB0byByZWR1Y2UgcnVuLXRpbWUgbWVtb3J5IHVzYWdlLgorICBCdXN5Ym94IGlzIGFsc28gZXh0cmVtZWx5IG1vZHVsYXIgc28geW91IGNhbiBlYXNpbHkgaW5jbHVkZSBvciBleGNsdWRlCisgIGNvbW1hbmRzIChvciBmZWF0dXJlcykgYXQgY29tcGlsZSB0aW1lLiAgVGhpcyBtYWtlcyBpdCBlYXN5IHRvIGN1c3RvbWl6ZQorICBlbWJlZGRlZCBzeXN0ZW1zOyB0byBjcmVhdGUgYSB3b3JraW5nIHN5c3RlbSwganVzdCBhZGQgL2RldiwgL2V0YywgYW5kIGEKKyAgTGludXgga2VybmVsLiAgQnVzeWJveCAodXN1YWxseSB0b2dldGhlciB3aXRoIHVDbGliYykgaGFzIGFsc28gYmVlbiB1c2VkIGFzCisgIGEgY29tcG9uZW50IG9mICJ0aGluIGNsaWVudCIgZGVza3RvcCBzeXN0ZW1zLCBsaXZlLUNEIGRpc3RyaWJ1dGlvbnMsIHJlc2N1ZQorICBkaXNrcywgaW5zdGFsbGVycywgYW5kIHNvIG9uLgorCisgIEJ1c3lCb3ggcHJvdmlkZXMgYSBmYWlybHkgY29tcGxldGUgUE9TSVggZW52aXJvbm1lbnQgZm9yIGFueSBzbWFsbCBzeXN0ZW0sCisgIGJvdGggZW1iZWRkZWQgZW52aXJvbm1lbnRzIGFuZCBtb3JlIGZ1bGwgZmVhdHVyZWQgc3lzdGVtcyBjb25jZXJuZWQgYWJvdXQKKyAgc3BhY2UuICBCdXN5Ym94IGlzIHNsb3dseSB3b3JraW5nIHRvd2FyZHMgaW1wbGVtZW50aW5nIHRoZSBmdWxsIFNpbmdsZSBVbml4CisgIFNwZWNpZmljYXRpb24gVjMgKGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS8pLCBidXQgaXNuJ3QKKyAgdGhlcmUgeWV0IChhbmQgZm9yIHNpemUgcmVhc29ucyB3aWxsIHByb2JhYmx5IHN1cHBvcnQgYXQgbW9zdCBVVEYtOCBmb3IKKyAgaW50ZXJuYXRpb25hbGl6YXRpb24pLiAgV2UgYXJlIGFsc28gaW50ZXJlc3RlZCBpbiBwYXNzaW5nIHRoZSBMaW51eCBUZXN0CisgIFByb2plY3QgKGh0dHA6Ly9sdHAuc291cmNlZm9yZ2UubmV0KS4KKworLS0tLS0tLS0tLS0tLS0tLQorCitVc2luZyBidXN5Ym94OgorCisgIEJ1c3lCb3ggaXMgZXh0cmVtZWx5IGNvbmZpZ3VyYWJsZS4gIFRoaXMgYWxsb3dzIHlvdSB0byBpbmNsdWRlIG9ubHkgdGhlCisgIGNvbXBvbmVudHMgYW5kIG9wdGlvbnMgeW91IG5lZWQsIHRoZXJlYnkgcmVkdWNpbmcgYmluYXJ5IHNpemUuICBSdW4gJ21ha2UKKyAgY29uZmlnJyBvciAnbWFrZSBtZW51Y29uZmlnJyB0byBzZWxlY3QgdGhlIGZ1bmN0aW9uYWxpdHkgdGhhdCB5b3Ugd2lzaCB0bworICBlbmFibGUuICAoU2VlICdtYWtlIGhlbHAnIGZvciBtb3JlIGNvbW1hbmRzLikKKworICBUaGUgYmVoYXZpb3Igb2YgYnVzeWJveCBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBuYW1lIGl0J3MgY2FsbGVkIHVuZGVyOiBhcworICAiY3AiIGl0IGJlaGF2ZXMgbGlrZSBjcCwgYXMgInNlZCIgaXQgYmVoYXZlcyBsaWtlIHNlZCwgYW5kIHNvIG9uLiAgQ2FsbGVkCisgIGFzICJidXN5Ym94IiBpdCB0YWtlcyB0aGUgc2Vjb25kIGFyZ3VtZW50IGFzIHRoZSBuYW1lIG9mIHRoZSBhcHBsZXQgdG8KKyAgcnVuIChJLkUuICIuL2J1c3lib3ggbHMgLWwgL3Byb2MiKS4KKworICBUaGUgInN0YW5kYWxvbmUgc2hlbGwiIG1vZGUgaXMgYW4gZWFzeSB3YXkgdG8gdHJ5IG91dCBidXN5Ym94OyB0aGlzIGlzIGEKKyAgY29tbWFuZCBzaGVsbCB0aGF0IGNhbGxzIHRoZSBidWlsdC1pbiBhcHBsZXRzIHdpdGhvdXQgbmVlZGluZyB0aGVtIHRvIGJlCisgIGluc3RhbGxlZCBpbiB0aGUgcGF0aC4gIChOb3RlIHRoYXQgdGhpcyByZXF1aXJlcyAvcHJvYyB0byBiZSBtb3VudGVkLCBpZgorICB0ZXN0aW5nIGZyb20gYSBib290IGZsb3BweSBvciBpbiBhIGNocm9vdCBlbnZpcm9ubWVudC4pCisKKyAgVGhlIGJ1aWxkIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVzIGEgZmlsZSAiYnVzeWJveC5saW5rcyIsIHdoaWNoIGlzIHVzZWQgYnkKKyAgJ21ha2UgaW5zdGFsbCcgdG8gY3JlYXRlIHN5bWxpbmtzIHRvIHRoZSBCdXN5Qm94IGJpbmFyeSBmb3IgYWxsIGNvbXBpbGVkIGluCisgIGNvbW1hbmRzLiAgVGhpcyB1c2VzIHRoZSBDT05GSUdfUFJFRklYIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHNwZWNpZnkKKyAgd2hlcmUgdG8gaW5zdGFsbCwgYW5kIGluc3RhbGxzIGhhcmRsaW5rcyBvciBzeW1saW5rcyBkZXBlbmRpbmcKKyAgb24gdGhlIGNvbmZpZ3VyYXRpb24gcHJlZmVyZW5jZXMuICAoWW91IGNhbiBhbHNvIG1hbnVhbGx5IHJ1bgorICB0aGUgaW5zdGFsbCBzY3JpcHQgYXQgImFwcGxldHMvaW5zdGFsbC5zaCIpLgorCistLS0tLS0tLS0tLS0tLS0tCisKK0Rvd25sb2FkaW5nIHRoZSBjdXJyZW50IHNvdXJjZSBjb2RlOgorCisgIFNvdXJjZSBmb3IgdGhlIGxhdGVzdCByZWxlYXNlZCB2ZXJzaW9uLCBhcyB3ZWxsIGFzIGRhaWx5IHNuYXBzaG90cywgY2FuIGFsd2F5cworICBiZSBkb3dubG9hZGVkIGZyb20KKworICAgIGh0dHA6Ly9idXN5Ym94Lm5ldC9kb3dubG9hZHMvCisKKyAgWW91IGNhbiBicm93c2UgdGhlIHVwIHRvIHRoZSBtaW51dGUgc291cmNlIGNvZGUgYW5kIGNoYW5nZSBoaXN0b3J5IG9ubGluZS4KKworICAgIGh0dHA6Ly9naXQuYnVzeWJveC5uZXQvYnVzeWJveC8KKworICBBbm9ueW1vdXMgR0lUIGFjY2VzcyBpcyBhdmFpbGFibGUuICBGb3IgaW5zdHJ1Y3Rpb25zLCBjaGVjayBvdXQ6CisKKyAgICBodHRwOi8vd3d3LmJ1c3lib3gubmV0L3NvdXJjZS5odG1sCisKKyAgRm9yIHRob3NlIHRoYXQgYXJlIGFjdGl2ZWx5IGNvbnRyaWJ1dGluZyBhbmQgd291bGQgbGlrZSB0byBjaGVjayBmaWxlcyBpbiwKKyAgc2VlOgorCisgICAgaHR0cDovL2J1c3lib3gubmV0L2RldmVsb3Blci5odG1sCisKKyAgVGhlIGRldmVsb3BlcnMgYWxzbyBoYXZlIGEgYnVnIGFuZCBwYXRjaCB0cmFja2luZyBzeXN0ZW0KKyAgKGh0dHBzOi8vYnVncy5idXN5Ym94Lm5ldCkgYWx0aG91Z2ggcG9zdGluZyBhIGJ1Zy9wYXRjaCB0byB0aGUgbWFpbGluZyBsaXN0CisgIGlzIGdlbmVyYWxseSBhIGZhc3RlciB3YXkgb2YgZ2V0dGluZyBpdCBmaXhlZCwgYW5kIHRoZSBjb21wbGV0ZSBhcmNoaXZlIG9mCisgIHdoYXQgaGFwcGVuZWQgaXMgdGhlIGdpdCBjaGFuZ2Vsb2cuCisKKyAgTm90ZTogaWYgeW91IHdhbnQgdG8gY29tcGlsZSBidXN5Ym94IGluIGEgYnVzeWJveCBlbnZpcm9ubWVudCB5b3UgbXVzdAorICBzZWxlY3QgQ09ORklHX0RFU0tUT1AuCisKKy0tLS0tLS0tLS0tLS0tLS0KKworR2V0dGluZyBoZWxwOgorCisgIHdoZW4geW91IGZpbmQgeW91IG5lZWQgaGVscCwgeW91IGNhbiBjaGVjayBvdXQgdGhlIGJ1c3lib3ggbWFpbGluZyBsaXN0CisgIGFyY2hpdmVzIGF0IGh0dHA6Ly9idXN5Ym94Lm5ldC9saXN0cy9idXN5Ym94LyBvciBldmVuIGpvaW4KKyAgdGhlIG1haWxpbmcgbGlzdCBpZiB5b3UgYXJlIGludGVyZXN0ZWQuCisKKy0tLS0tLS0tLS0tLS0tLS0KKworQnVnczoKKworICBpZiB5b3UgZmluZCBidWdzLCBwbGVhc2Ugc3VibWl0IGEgZGV0YWlsZWQgYnVnIHJlcG9ydCB0byB0aGUgYnVzeWJveCBtYWlsaW5nCisgIGxpc3QgYXQgYnVzeWJveEBidXN5Ym94Lm5ldC4gIGEgd2VsbC13cml0dGVuIGJ1ZyByZXBvcnQgc2hvdWxkIGluY2x1ZGUgYQorICB0cmFuc2NyaXB0IG9mIGEgc2hlbGwgc2Vzc2lvbiB0aGF0IGRlbW9uc3RyYXRlcyB0aGUgYmFkIGJlaGF2aW9yIGFuZCBlbmFibGVzCisgIGFueW9uZSBlbHNlIHRvIGR1cGxpY2F0ZSB0aGUgYnVnIG9uIHRoZWlyIG93biBtYWNoaW5lLiB0aGUgZm9sbG93aW5nIGlzIHN1Y2gKKyAgYW4gZXhhbXBsZToKKworICAgIHRvOiBidXN5Ym94QGJ1c3lib3gubmV0CisgICAgZnJvbTogZGlsaWdlbnRAdGVzdGluZy5saW51eC5vcmcKKyAgICBzdWJqZWN0OiAvYmluL2RhdGUgZG9lc24ndCB3b3JrCisKKyAgICBwYWNrYWdlOiBidXN5Ym94CisgICAgdmVyc2lvbjogMS4wMAorCisgICAgd2hlbiBpIGV4ZWN1dGUgYnVzeWJveCAnZGF0ZScgaXQgcHJvZHVjZXMgdW5leHBlY3RlZCByZXN1bHRzLgorICAgIHdpdGggZ251IGRhdGUgaSBnZXQgdGhlIGZvbGxvd2luZyBvdXRwdXQ6CisKKwkkIGRhdGUKKwlmcmkgb2N0ICA4IDE0OjE5OjQxIG1kdCAyMDA0CisKKyAgICBidXQgd2hlbiBpIHVzZSBidXN5Ym94IGRhdGUgaSBnZXQgdGhpcyBpbnN0ZWFkOgorCisJJCBkYXRlCisJaWxsZWdhbCBpbnN0cnVjdGlvbgorCisgICAgaSBhbSB1c2luZyBkZWJpYW4gdW5zdGFibGUsIGtlcm5lbCB2ZXJzaW9uIDIuNC4yNS12cnMyIG9uIGEgbmV0d2luZGVyLAorICAgIGFuZCB0aGUgbGF0ZXN0IHVjbGliYyBmcm9tIGN2cy4KKworCS1kaWxpZ2VudAorCisgIG5vdGUgdGhlIGNhcmVmdWwgZGVzY3JpcHRpb24gYW5kIHVzZSBvZiBleGFtcGxlcyBzaG93aW5nIG5vdCBvbmx5IHdoYXQKKyAgYnVzeWJveCBkb2VzLCBidXQgYWxzbyBhIGNvdW50ZXIgZXhhbXBsZSBzaG93aW5nIHdoYXQgYW4gZXF1aXZhbGVudCBhcHAKKyAgZG9lcyAob3IgcG9pbnRpbmcgdG8gdGhlIHRleHQgb2YgYSByZWxldmFudCBzdGFuZGFyZCkuICBCdWcgcmVwb3J0cyBsYWNraW5nCisgIHN1Y2ggZGV0YWlsIG1heSBuZXZlciBiZSBmaXhlZC4uLiAgVGhhbmtzIGZvciB1bmRlcnN0YW5kaW5nLgorCistLS0tLS0tLS0tLS0tLS0tCisKK1BvcnRhYmlsaXR5OgorCisgIEJ1c3lib3ggaXMgZGV2ZWxvcGVkIGFuZCB0ZXN0ZWQgb24gTGludXggMi40IGFuZCAyLjYga2VybmVscywgY29tcGlsZWQKKyAgd2l0aCBnY2MgKHRoZSB1bml0LWF0LWEtdGltZSBvcHRpbWl6YXRpb25zIGluIHZlcnNpb24gMy40IGFuZCBsYXRlciBhcmUKKyAgd29ydGggdXBncmFkaW5nIHRvIGdldCwgYnV0IG9sZGVyIHZlcnNpb25zIHNob3VsZCB3b3JrKSwgYW5kIGxpbmtlZCBhZ2FpbnN0CisgIHVDbGliYyAoMC45LjI3IG9yIGdyZWF0ZXIpIG9yIGdsaWJjICgyLjIgb3IgZ3JlYXRlcikuICBJbiBzdWNoIGFuCisgIGVudmlyb25tZW50LCB0aGUgZnVsbCBzZXQgb2YgYnVzeWJveCBmZWF0dXJlcyBzaG91bGQgd29yaywgYW5kIGlmCisgIGFueXRoaW5nIGRvZXNuJ3Qgd2Ugd2FudCB0byBrbm93IGFib3V0IGl0IHNvIHdlIGNhbiBmaXggaXQuCisKKyAgVGhlcmUgYXJlIG1hbnkgb3RoZXIgZW52aXJvbm1lbnRzIG91dCB0aGVyZSwgaW4gd2hpY2ggYnVzeWJveCBtYXkgYnVpbGQKKyAgYW5kIHJ1biBqdXN0IGZpbmUuICBXZSBqdXN0IGRvbid0IHRlc3QgdGhlbS4gIFNpbmNlIGJ1c3lib3ggY29uc2lzdHMgb2YgYQorICBsYXJnZSBudW1iZXIgb2YgbW9yZSBvciBsZXNzIGluZGVwZW5kZW50IGFwcGxldHMsIHBvcnRhYmlsaXR5IGlzIGEgcXVlc3Rpb24KKyAgb2Ygd2hpY2ggZmVhdHVyZXMgd29yayB3aGVyZS4gIFNvbWUgYnVzeWJveCBhcHBsZXRzIChzdWNoIGFzIGNhdCBhbmQgcm0pIGFyZQorICBoaWdobHkgcG9ydGFibGUgYW5kIGxpa2VseSB0byB3b3JrIGp1c3QgYWJvdXQgYW55d2hlcmUsIHdoaWxlIG90aGVycyAoc3VjaCBhcworICBpbnNtb2QgYW5kIGxvc2V0dXApIHJlcXVpcmUgcmVjZW50IExpbnV4IGtlcm5lbHMgd2l0aCByZWNlbnQgQyBsaWJyYXJpZXMuCisKKyAgRWFybGllciB2ZXJzaW9ucyBvZiBMaW51eCBhbmQgZ2xpYmMgbWF5IG9yIG1heSBub3Qgd29yaywgZm9yIGFueSBnaXZlbgorICBjb25maWd1cmF0aW9uLiAgTGludXggMi4yIG9yIGVhcmxpZXIgc2hvdWxkIG1vc3RseSB3b3JrICh0aGVyZSdzIHN0aWxsCisgIHNvbWUgc3VwcG9ydCBjb2RlIGluIHRoaW5ncyBsaWtlIG1vdW50LmMpIGJ1dCB0aGlzIGlzIG5vIGxvbmdlciByZWd1bGFybHkKKyAgdGVzdGVkLCBhbmQgaW5oZXJlbnRseSB3b24ndCBzdXBwb3J0IGNlcnRhaW4gZmVhdHVyZXMgKHN1Y2ggYXMgbG9uZyBmaWxlcworICBhbmQgLS1iaW5kIG1vdW50cykuICBUaGUgc2FtZSBpcyB0cnVlIGZvciBnbGliYyAyLjAgYW5kIDIuMTogZXhwZWN0IGEgaGlnaGVyCisgIHRlc3RpbmcgYW5kIGRlYnVnZ2luZyBidXJkZW4gdXNpbmcgc3VjaCBvbGQgaW5mcmFzdHJ1Y3R1cmUuICAoVGhlIGJ1c3lib3gKKyAgZGV2ZWxvcGVycyBhcmUgbm90IHZlcnkgaW50ZXJlc3RlZCBpbiBzdXBwb3J0aW5nIHRoZXNlIG9sZGVyIHZlcnNpb25zLCBidXQKKyAgd2lsbCBwcm9iYWJseSBhY2NlcHQgc21hbGwgc2VsZi1jb250YWluZWQgcGF0Y2hlcyB0byBmaXggc2ltcGxlIHByb2JsZW1zLikKKworICBTb21lIGVudmlyb25tZW50cyBhcmUgbm90IHJlY29tbWVuZGVkLiAgRWFybHkgdmVyc2lvbnMgb2YgdUNsaWJjIHdlcmUgYnVnZ3kKKyAgYW5kIG1pc3NpbmcgbWFueSBmZWF0dXJlczogdXBncmFkZS4gIExpbmtpbmcgYWdhaW5zdCBsaWJjNSBvciBkaWV0bGliYyBpcworICBub3Qgc3VwcG9ydGVkIGFuZCBub3QgaW50ZXJlc3RpbmcgdG8gdGhlIGJ1c3lib3ggZGV2ZWxvcGVycy4gIChUaGUgZmlyc3QgaXMKKyAgb2Jzb2xldGUgYW5kIGhhcyBubyBrbm93biBzaXplIG9yIGZlYXR1cmUgYWR2YW50YWdlcyBvdmVyIHVDbGliYywgdGhlIHNlY29uZAorICBoYXMga25vd24gYnVncyB0aGF0IGl0cyBkZXZlbG9wZXJzIGhhdmUgYWN0aXZlbHkgcmVmdXNlZCB0byBmaXguKSAgQW5jaWVudAorICBMaW51eCBrZXJuZWxzICgyLjAueCBhbmQgZWFybGllcikgYXJlIHNpbWlsYXJseSB1bmludGVyZXN0aW5nLgorCisgIEluIHRoZW9yeSBpdCdzIHBvc3NpYmxlIHRvIHVzZSBCdXN5Ym94IHVuZGVyIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zIChzdWNoIGFzCisgIE1hY09TIFgsIFNvbGFyaXMsIEN5Z3dpbiwgb3IgdGhlIEJTRCBGb3JrIER1IEpvdXIpLiAgVGhpcyBnZW5lcmFsbHkgaW52b2x2ZXMKKyAgYSBkaWZmZXJlbnQga2VybmVsIGFuZCBhIGRpZmZlcmVudCBDIGxpYnJhcnkgYXQgdGhlIHNhbWUgdGltZS4gIFdoaWxlIGl0CisgIHNob3VsZCBiZSBwb3NzaWJsZSB0byBwb3J0IHRoZSBtYWpvcml0eSBvZiB0aGUgY29kZSB0byB3b3JrIGluIG9uZSBvZgorICB0aGVzZSBlbnZpcm9ubWVudHMsIGRvbid0IGJlIHN1cnByaXNlZCBpZiBpdCBkb2Vzbid0IHdvcmsgb3V0IG9mIHRoZSBib3guICBJZgorICB5b3UncmUgaW50byB0aGF0IHNvcnQgb2YgdGhpbmcsIHN0YXJ0IHNtYWxsIChzZWxlY3RpbmcganVzdCBhIGZldyBhcHBsZXRzKQorICBhbmQgd29yayB5b3VyIHdheSB1cC4KKworICBJbiAyMDA1IFNoYXVuIEphY2ttYW4gaGFzIHBvcnRlZCBidXN5Ym94IHRvIGEgY29tYmluYXRpb24gb2YgbmV3bGliCisgIGFuZCBsaWJnbG9zcywgYW5kIHNvbWUgb2YgaGlzIHBhdGNoZXMgaGF2ZSBiZWVuIGludGVncmF0ZWQuCisKK1N1cHBvcnRlZCBoYXJkd2FyZToKKworICBCdXN5Qm94IGluIGdlbmVyYWwgd2lsbCBidWlsZCBvbiBhbnkgYXJjaGl0ZWN0dXJlIHN1cHBvcnRlZCBieSBnY2MuICBXZQorICBzdXBwb3J0IGJvdGggMzIgYW5kIDY0IGJpdCBwbGF0Zm9ybXMsIGFuZCBib3RoIGJpZyBhbmQgbGl0dGxlIGVuZGlhbgorICBzeXN0ZW1zLgorCisgIFVuZGVyIDIuNCBMaW51eCBrZXJuZWxzLCBrZXJuZWwgbW9kdWxlIGxvYWRpbmcgd2FzIGltcGxlbWVudGVkIGluIGEKKyAgcGxhdGZvcm0tc3BlY2lmaWMgbWFubmVyLiAgQnVzeWJveCdzIGluc21vZCB1dGlsaXR5IGhhcyBiZWVuIHJlcG9ydGVkIHRvCisgIHdvcmsgdW5kZXIgQVJNLCBDUklTLCBIOC8zMDAsIHg4NiwgaWE2NCwgeDg2XzY0LCBtNjhrLCBNSVBTLCBQb3dlclBDLCBTMzkwLAorICBTSDMvNC81LCBTcGFyYywgYW5kIHY4NTBlLiAgQW55dGhpbmcgZWxzZSBwcm9iYWJseSB3b24ndCB3b3JrLgorCisgIFRoZSBtb2R1bGUgbG9hZGluZyBtZWNoYW5pc20gZm9yIHRoZSAyLjYga2VybmVsIGlzIG11Y2ggbW9yZSBnZW5lcmljLCBhbmQKKyAgd2UgYmVsaWV2ZSAyLjYueCBrZXJuZWwgbW9kdWxlIGxvYWRpbmcgc3VwcG9ydCBzaG91bGQgd29yayBvbiBhbGwKKyAgYXJjaGl0ZWN0dXJlcyBzdXBwb3J0ZWQgYnkgdGhlIGtlcm5lbC4KKworLS0tLS0tLS0tLS0tLS0tLQorCitQbGVhc2UgZmVlZCBzdWdnZXN0aW9ucywgYnVnIHJlcG9ydHMsIGluc3VsdHMsIGFuZCBicmliZXMgYmFjayB0byB0aGUgYnVzeWJveAorbWFpbGluZyBsaXN0OgorCisJYnVzeWJveEBidXN5Ym94Lm5ldAorCithbmQvb3IgbWFpbnRhaW5lcjoKKworCURlbnlzIFZsYXNlbmtvCisJPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KZGlmZiAtLWdpdCBhL1RPRE8gYi9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZjQ4YzIKLS0tIC9kZXYvbnVsbAorKysgYi9UT0RPCkBAIC0wLDAgKzEsMjYyIEBACitCdXN5Ym94IFRPRE8KKworSGFydmVzdCBwYXRjaGVzIGZyb20KK2h0dHA6Ly9naXQub3BlbmVtYmVkZGVkLm9yZy9jZ2l0LmNnaS9vcGVuZW1iZWRkZWQvdHJlZS9yZWNpcGVzL2J1c3lib3gvCitodHRwczovL2Rldi5vcGVud3J0Lm9yZy9icm93c2VyL3RydW5rL3BhY2thZ2UvYnVzeWJveC9wYXRjaGVzLworCisKK1N0dWZmIHRoYXQgbmVlZHMgdG8gYmUgZG9uZS4gIFRoaXMgaXMgb3JnYW5pemVkIGJ5IHdobyBwbGFucyB0byBnZXQgYXJvdW5kIHRvCitkb2luZyBpdCBldmVudHVhbGx5LCBidXQgdGhhdCBkb2Vzbid0IG1lYW4gdGhleSAib3duIiB0aGUgaXRlbS4gIElmIHlvdSB3YW50IHRvCitkbyBvbmUgb2YgdGhlc2UgYm91bmNlIGFuIGVtYWlsIG9mZiB0aGUgcGVyc29uIGl0J3MgbGlzdGVkIHVuZGVyIHRvIHNlZSBpZiB0aGV5CitoYXZlIGFueSBzdWdnZXN0aW9ucyBob3cgdGhleSBwbGFuIHRvIGdvIGFib3V0IGl0LCBhbmQgdG8gbWluaW1pemUgY29uZmxpY3RzCitiZXR3ZWVuIHlvdXIgd29yayBhbmQgdGhlaXJzLiAgQnV0IG90aGVyd2lzZSwgYWxsIG9mIHRoZXNlIGFyZSBmYWlyIGdhbWUuCisKK1JvYiBMYW5kbGV5IHN1Z2dlc3RlZCB0aGlzOgorICBJbXBsZW1lbnQgYmJfcmVhbHBhdGgoKSB0aGF0IGNhbiBoYW5kbGUgTlVMTCBvbiBub24tZ2xpYmMuCisKKyAgc2gKKyAgICBUaGUgY29tbWFuZCBzaGVsbCBzaXR1YXRpb24gaXMgYSBtZXNzLiAgV2UgaGF2ZSB0d28gZGlmZmVyZW50CisgICAgc2hlbGxzIHRoYXQgZG9uJ3QgcmVhbGx5IHNoYXJlIGFueSBjb2RlLCBhbmQgdGhlICJzdGFuZGFsb25lIHNoZWxsIiBkb2Vzbid0CisgICAgd29yayBhbGwgdGhhdCB3ZWxsIChlc3BlY2lhbGx5IG5vdCBpbiBhIGNocm9vdCBlbnZpcm9ubWVudCksIGR1ZSB0byBhcHBzIG5vdAorICAgIGJlaW5nIHJlZW50cmFudC4KKworICBEbyBhIFNVU3YzIGF1ZGl0CisgICAgTG9vayBhdCB0aGUgZnVsbCBTaW5nbGUgVW5peCBTcGVjaWZpY2F0aW9uIHZlcnNpb24gMyAoYXZhaWxhYmxlIG9ubGluZSBhdAorICAgICJodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDk2OTUzOTkvbmZpbmRleC5odG1sIikgYW5kCisgICAgZmlndXJlIG91dCB3aGljaCBvZiBvdXIgYXBwcyBhcmUgY29tcGxpYW50LCBhbmQgd2hhdCB3ZSdyZSBtaXNzaW5nIHRoYXQKKyAgICB3ZSBtaWdodCBhY3R1YWxseSBjYXJlIGFib3V0LgorCisgICAgRXZlbiBiZXR0ZXIgd291bGQgYmUgc29tZSBraW5kIG9mIGF1dG9tYXRlZCBjb21wbGlhbmNlIHRlc3QgaGFybmVzcyB0aGF0CisgICAgZXhlcmNpc2VzIGVhY2ggY29tbWFuZCBsaW5lIG9wdGlvbiBhbmQgdGhlIHZhcmlvdXMgY29ybmVyIGNhc2VzLgorCisgIEludGVybmF0aW9uYWxpemF0aW9uCisgICAgSG93IG11Y2ggaW50ZXJuYXRpb25hbGl6YXRpb24gc2hvdWxkIHdlIGRvPworCisgICAgVGhlIGxvdyBoYW5naW5nIGZydWl0IGlzIFVURi04IGNoYXJhY3RlciBzZXQgc3VwcG9ydC4gIFdlIHNob3VsZCBkbyB0aGlzLgorICAgIFNlZSBUT0RPX3VuaWNvZGUgZmlsZS4KKworICAgIFdlIGFsc28gaGF2ZSBsb3RzIG9mIGhhcmR3aXJlZCBlbmdsaXNoIHRleHQgbWVzc2FnZXMuICBDb25zb2xpZGF0aW5nIHRoaXMKKyAgICBpbnRvIHNvbWUga2luZCBvZiBtZXNzYWdlIHRhYmxlIG5vdCBvbmx5IG1ha2VzIHRyYW5zbGF0aW9uIGVhc2llciwgYnV0CisgICAgYWxzbyBhbGxvd3MgdXMgdG8gY29uc29saWRhdGUgcmVkdW5kYW50IChvciBjbG9zZSkgc3RyaW5ncy4KKworICAgIFdlIHByb2JhYmx5IGRvbid0IHdhbnQgdG8gYmUgYmxvYXRlZCB3aXRoIGxvY2FsZSBzdXBwb3J0LiAgKE5vdCB1bmxlc3Mgd2UKKyAgICBjYW4gY2xlYW5seSBleHBvcnQgaXQgZnJvbSBvdXIgdW5kZXJseWluZyBDIGxpYnJhcnkgd2l0aG91dCBoYXZpbmcgdG8KKyAgICBjb25jZXJuIG91cnNlbHZlcyB3aXRoIGl0IGRpcmVjdGx5LiAgUGVyaGFwcyBhIGZldyBzcGVjaWZpYyB0aGluZ3MgbGlrZSBhCisgICAgY29uZmlnIG9wdGlvbiBmb3IgImRhdGUiIGFyZSBsb3cgaGFuZ2luZyBmcnVpdCBoZXJlPykKKworICAgIFdoYXQgbGV2ZWwgc2hvdWxkIHRoaW5ncyBoYXBwZW4gYXQ/ICBIb3cgbXVjaCBkbyB3ZSBjYXJlIGFib3V0CisgICAgaW50ZXJuYXRpb25hbGl6aW5nIHRoZSB0ZXh0IGNvbnNvbGUgd2hlbiBYMTEgYW5kIHh0ZXJtcyBhcmUgc28gbXVjaCBiZXR0ZXIKKyAgICBhdCBpdD8gIChUaGVyZSdzIHNvbWUgaW5mcmFzdHJ1Y3R1cmUgaGVyZSB3ZSBkb24ndCBpbXBsZW1lbnQ6IFRoZQorICAgICJ1bmljb2RlX3N0YXJ0IiBhbmQgInVuaWNvZGVfc3RvcCIgc2hlbGwgc2NyaXB0cyBuZWVkICJ2dC1pcy1VVEY4IiBhbmQgYQorICAgIC0tdW5pY29kZSBvcHRpb24gdG8gbG9hZGtleXMuICBUaGF0IGltcGxpZXMgYSByZWFsIGxvYWRrZXlzL2R1bXBrZXlzCisgICAgaW1wbGVtZW50YXRpb24gdG8gcmVwbGFjZSBsb2Fka21hcC9kdW1wa21hcC4gIFBsdXMgbWVzc2luZyB3aXRoIGNvbnNvbGUgZm9udAorICAgIGxvYWRpbmcuICBJcyBpdCB3b3J0aCBpdCwgb3IgZG8gd2UganVzdCBzYXkgInVzZSBYIj8pCisKKyAgSW5kaXZpZHVhbCBjb21waWxhdGlvbiBvZiBhcHBsZXRzLgorICAgIEl0IHdvdWxkIGJlIG5pY2UgaWYgYnVzeWJveCBoYWQgdGhlIG9wdGlvbiB0byBjb21waWxlIHRvIGluZGl2aWR1YWwgYXBwbGV0cywKKyAgICBmb3IgcGVvcGxlIHdobyB3YW50IGFuIGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbiBsZXNzIGJsb2F0ZWQgdGhhbiB0aGUgZ251CisgICAgdXRpbHMgKG9yIHNpbXBseSB3aXRoIGxlc3MgcG9saXRpY2FsIGJhZ2dhZ2UpLCBidXQgd2l0aG91dCBpdCBiZWluZyBvbmUgYmlnCisgICAgZXhlY3V0YWJsZS4KKworICAgIFR1cm5pbmcgbGliYmIgaW50byBhIHJlYWwgZGxsIGlzIGFub3RoZXIgcG9zc2liaWxpdHksIGVzcGVjaWFsbHkgaWYgbGliYmIKKyAgICBjb3VsZCBleHBvcnQgc29tZSBvZiB0aGUgb3RoZXIgbGlicmFyeSBpbnRlcmZhY2VzIHdlJ3ZlIGFscmVhZHkgbW9yZSBvciBsZXNzCisgICAgZ290IHRoZSBjb2RlIGZvciAobGlrZSB6bGliKS4KKworICBidWlsZHJvb3QgLSBNYWtlIGEgImRvZ2Zvb2QiIG9wdGlvbgorICAgIEJ1c3lib3ggMS4xIHdpbGwgYmUgY2FwYWJsZSBvZiByZXBsYWNpbmcgbW9zdCBnbnUgcGFja2FnZXMgZm9yIHJlYWwgd29ybGQKKyAgICB1c2UsIHN1Y2ggYXMgZGV2ZWxvcGluZyBzb2Z0d2FyZSBvciBpbiBhIGxpdmUgQ0QuICBJdCBuZWVkcyB3aWRlciB0ZXN0aW5nLgorCisgICAgQnVzeWJveCBzaG91bGQgbm93IGJlIGFibGUgdG8gcmVwbGFjZSBiemlwMiwgY29yZXV0aWxzLCBlMmZzcHJvZ3MsIGZpbGUsCisgICAgZmluZHV0aWxzLCBnYXdrLCBncmVwLCBpbmV0dXRpbHMsIGxlc3MsIG1vZHV0aWxzLCBuZXQtdG9vbHMsIHBhdGNoLCBwcm9jcHMsCisgICAgc2VkLCBzaGFkb3csIHN5c2tsb2dkLCBzeXN2aW5pdCwgdGFyLCB1dGlsLWxpbnV4LCBhbmQgdmltLiAgVGhlIHJlc3VsdGluZworICAgIHN5c3RlbSBzaG91bGQgYmUgc2VsZi1ob3N0aW5nIChJLkUuIGFibGUgdG8gcmVidWlsZCBpdHNlbGYgZnJvbSBzb3VyY2UKKyAgICBjb2RlKS4gIFRoaXMgbWVhbnMgaXQgd291bGQgbmVlZCAoYXQgbGVhc3QpIGJpbnV0aWxzLCBnY2MsIGFuZCBtYWtlLCBvcgorICAgIGVxdWl2YWxlbnRzLgorCisgICAgSXQgd291bGQgYmUgYSBnb29kICJlYXRpbmcgb3VyIG93biBkb2dmb29kIiB0ZXN0IGlmIGJ1aWxkcm9vdCBoYWQgdGhlIG9wdGlvbgorICAgIG9mIHVzaW5nIGEgIm1ha2UgYWxseWVzY29uZmlnIiBidXN5Ym94IGluc3RlYWQgb2YgdGhlIGFsbCBvZiB0aGUgYWJvdmUKKyAgICBwYWNrYWdlcy4gIEFueXRoaW5nIHRoYXQncyB3cm9uZyB3aXRoIHRoZSByZXN1bHRpbmcgc3lzdGVtLCB3ZSBjYW4gZml4LiAgKEl0CisgICAgd291bGQgYmUgbmljZSB0byBiZSBhYmxlIHRvIHVwZ3JhZGUgYnVzeWJveCB0byBiZSBhYmxlIHRvIHJlcGxhY2UgYmFzaCBhbmQKKyAgICBkaWZmdXRpbHMgYXMgd2VsbCwgYnV0IHdlJ3JlIG5vdCB0aGVyZSB5ZXQuKQorCisgICAgT25lIGV4YW1wbGUgb2YgYW4gZXhpc3Rpbmcgc3lzdGVtIHRoYXQgZG9lcyB0aGlzIGFscmVhZHkgaXMgRmlybXdhcmUgTGludXg6CisgICAgICBodHRwOi8vd3d3LmxhbmRsZXkubmV0L2NvZGUvZmlybXdhcmUKKworICBpbml0cmFtZnMKKyAgICBCdXN5Ym94IHNob3VsZCBoYXZlIGEgc2FtcGxlIGluaXRyYW1mcyBidWlsZCBzY3JpcHQuICBUaGlzIGRlcGVuZHMgb24KKyAgICBzaGVsbCwgbWRldiwgYW5kIHN3aXRjaF9yb290LgorCisgIG1rZGVwCisgICAgV3JpdGUgYSBta2RlcCB0aGF0IGRvZXNuJ3Qgc2VnZmF1bHQgaWYgdGhlcmUncyBhIGRpcmVjdG9yeSBpdCBkb2Vzbid0CisgICAgaGF2ZSBwZXJtaXNzaW9uIHRvIHJlYWQsIGlzbid0IGJhc2VkIG9uIG1hbnVhbGx5IGVkaXRpbmcgdGhlIG91dHB1dCBvZgorICAgIGxleHggYW5kIHlhY2MsIGRvZXNuJ3QgbWFrZSBzdWNoIGEgbWVzcyB1bmRlciBpbmNsdWRlL2NvbmZpZywgZXRjLgorCisgIEdyb3VwIGdsb2JhbHMgaW50byB1bmlvbnMgb2Ygc3RydWN0dXJlcy4KKyAgICBHbyB0aHJvdWdoIGFuZCB0dXJuIGFsbCB0aGUgZ2xvYmFsIGFuZCBzdGF0aWMgdmFyaWFibGVzIGludG8gc3RydWN0dXJlcywKKyAgICBhbmQgaGF2ZSBhbGwgdGhvc2Ugc3RydWN0dXJlcyBiZSBpbiBhIGJpZyB1bmlvbiBzaGFyZWQgYmV0d2VlbiBwcm9jZXNzZXMsCisgICAgc28gYnVzeWJveCB1c2VzIGxlc3MgYnNzLiAgKFRoaXMgaXMgYSBiaWcgd2luIG9uIG5vbW11IG1hY2hpbmVzLikgIFNlZQorICAgIHNlZC5jIGFuZCBtZGV2LmMgZm9yIGV4YW1wbGVzLgorCisgIEdvIHRocm91Z2ggYnVncy5idXN5Ym94Lm5ldCBhbmQgY2xvc2Ugb3V0IGFsbCBvZiB0aGF0IHNvbWVob3cuCisgICAgVGhpcyBvbmUncyBvcGVuIHRvIGV2ZXJ5Ym9keSwgYnV0IEknbGwgd2luZCB1cCBkb2luZyBpdC4uLgorCitCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIgPGJ1c3lib3hAYnVzeWJveC5uZXQ+IHN1Z2dlc3RzIHRvIGxvb2sgYXQgdGhlc2U6CisgIE5ldyBkZWJ1ZyBvcHRpb25zOgorICAgIC1XbGFyZ2VyLXRoYW4tMTI3CisgICAgQ2xlYW51cCBhbnkgYmlnIHVzZXJzCisgIENvbGxhdGUgQlVGU0laIElPQlVGX1NJWkUgTVlfQlVGX1NJWkUgUElQRV9QUk9HUkVTU19TSVpFIEJVRlNJWkUgUElQRVNJWkUKKyAgICBtYWtlIGJiX2NvbW1vbl9idWZzaXoxIGNvbmZpZ3VyYWJsZSwgc2l6ZSB3aXNlLgorICAgIG1ha2UgcGlwZXNpemUgY29uZmlndXJhYmxlLCBzaXplIHdpc2UuCisgICAgVXNlIGJiX2NvbW1vbl9idWZzaXoxIHRocm91Z2hvdXQgYXBwbGV0cyEKKworQXMgeWV0IHVuY2xhaW1lZDoKKworLS0tLQorZGlmZgorICBNYWtlIHN1cmUgd2UgaGFuZGxlIGVtcHR5IGZpbGVzIHByb3Blcmx5OgorICAgIEZyb20gdGhlIHBhdGNoIG1hbiBwYWdlOgorCisgICAgeW91IGNhbiByZW1vdmUgYSBmaWxlIGJ5IHNlbmRpbmcgb3V0IGEgY29udGV4dCBkaWZmIHRoYXQgY29tcGFyZXMKKyAgICB0aGUgZmlsZSB0byBiZSBkZWxldGVkIHdpdGggYW4gZW1wdHkgZmlsZSBkYXRlZCB0aGUgRXBvY2guICBUaGUKKyAgICBmaWxlIHdpbGwgYmUgcmVtb3ZlZCB1bmxlc3MgcGF0Y2ggaXMgY29uZm9ybWluZyB0byBQT1NJWCBhbmQgdGhlCisgICAgLUUgb3IgLS1yZW1vdmUtZW1wdHktZmlsZXMgb3B0aW9uIGlzIG5vdCBnaXZlbi4KKy0tLQorcGF0Y2gKKyAgU2hvdWxkIGhhdmUgc2ltcGxlIGZ1enogZmFjdG9yIHN1cHBvcnQgdG8gYXBwbHkgcGF0Y2hlcyBhdCBhbiBvZmZzZXQgd2hpY2gKKyAgc2hvdWxkbid0IHRha2UgdXAgdG9vIG11Y2ggc3BhY2UuCisKKyAgQW5kIHdoaWxlIHdlJ3JlIGF0IGl0LCBhIG5ldyBwYXRjaCBmaWxlbmFtZSBxdW90aW5nIGZvcm1hdCBpcyBhcHBhcmVudGx5CisgIGNvbWluZyBzb29uOiAgaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1naXQmbT0xMTI5MjczMTY0MDg2OTAmdz0yCisKK0FyY2hpdGVjdHVyYWwgaXNzdWVzOgorCitiYl9jbG9zZSgpIHdpdGggZnN5bmMoKQorICBXZSBzaG91bGQgaGF2ZSBhIGJiX2Nsb3NlKCkgaW4gcGxhY2Ugb2Ygbm9ybWFsIGNsb3NlLCB3aXRoIGEgQ09ORklHXyBvcHRpb24KKyAgdG8gbm90IGp1c3QgY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvZiBjbG9zZSgpIGZvciBhbiBlcnJvciwgYnV0IGZzeW5jKCkuCisgIENsb3NlIGNhbid0IHJlbGlhYmx5IHJlcG9ydCBhbnl0aGluZyB1c2VmdWwgYmVjYXVzZSBpZiB3cml0ZSgpIGFjY2VwdGVkIHRoZQorICBkYXRhIHRoZW4gaXQgZWl0aGVyIHdlbnQgb3V0IHRvIHRoZSBuZXR3b3JrIG9yIGl0J3MgaW4gY2FjaGUgb3IgYSBwaXBlCisgIGJ1ZmZlci4gIEVpdGhlciB3YXksIHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIGl0J2xsIG1ha2UgaXQgdG8gaXRzIGZpbmFsCisgIGRlc3RpbmF0aW9uIGJlZm9yZSBjbG9zZSgpIGdldHMgY2FsbGVkLCBzbyB0aGVyZSdzIG5vIGd1YXJhbnRlZSB0aGF0IGFueQorICBlcnJvciB3aWxsIGJlIHJlcG9ydGVkLgorCisgIFlvdSBuZWVkIHRvIGNhbGwgZnN5bmMoKSBpZiB5b3UgY2FyZSBhYm91dCBlcnJvcnMgdGhhdCBvY2N1ciBhZnRlciB3cml0ZSgpLAorICBidXQgdGhhdCBjYW4gaGF2ZSBhIGJpZyBwZXJmb3JtYW5jZSBpbXBhY3QuICBTbyBtYWtlIGl0IGEgY29uZmlnIG9wdGlvbi4KKy0tLQorVW5pZnkgYXJjaGl2ZXJzCisgIExvdHMgb2YgYXJjaGl2ZXJzIGhhdmUgdGhlIHNhbWUgZ2VuZXJhbCBpbmZyYXN0cnVjdHVyZS4gIFRoZSBkaXJlY3RvcnkKKyAgdHJhdmVyc2FsIGNvZGUgc2hvdWxkIGJlIGZhY3RvcmVkIG91dCwgYW5kIHRoZSBndXRzIG9mIGVhY2ggYXJjaGl2ZXIgY291bGQKKyAgYmUgc29tZSBzZXR1cCBjb2RlIGFuZCBhIHNlcmllcyBvZiBjYWxsYmFja3MgZm9yICJhZGQgdGhpcyBmaWxlIiwKKyAgImFkZCB0aGlzIGRpcmVjdG9yeSIsICJhZGQgdGhpcyBzeW1saW5rIiBhbmQgc28gb24uCisKKyAgVGhpcyBjb3VsZCBjbGVhbiB1cCB0YXIgYW5kIHppcCwgYW5kIG1ha2UgaXQgY2hlYXBlciB0byBhZGQgY3BpbyBhbmQgYXIKKyAgd3JpdGUgc3VwcG9ydCwgYW5kIHBvc3NpYmx5IGV2ZW4gY2hlYXBseSBhZGQgdGhpbmdzIGxpa2UgbWtpc29mcyBvcgorICBta3NxdWFzaGZzIHNvbWVkYXksIGlmIHRoZXkgYmVjb21lIHJlbGV2YW50LgorLS0tCitUZXh0IGJ1ZmZlciBzdXBwb3J0LgorICBTZXZlcmFsIGV4aXN0aW5nIGFwcGxldHMgKHNvcnQsIHZpLCBsZXNzLi4uKSByZWFkCisgIGEgd2hvbGUgZmlsZSBpbnRvIG1lbW9yeSBhbmQgYWN0IG9uIGl0LiAgVXNlIG9wZW5fcmVhZF9jbG9zZSgpLgorLS0tCitNZW1vcnkgQWxsb2NhdGlvbgorICBXZSBoYXZlIGEgQ09ORklHX0JVRkZFUiBtZWNoYW5pc20gdGhhdCBsZXRzIHVzIHNlbGVjdCB3aGV0aGVyIHRvIGRvIG1lbW9yeQorICBhbGxvY2F0aW9uIG9uIHRoZSBzdGFjayBvciB0aGUgaGVhcC4gIFVuZm9ydHVuYXRlbHksIHdlJ3JlIG5vdCB1c2luZyBpdCBtdWNoLgorICBXZSBuZWVkIHRvIGF1ZGl0IG91ciBtZW1vcnkgYWxsb2NhdGlvbnMgYW5kIHR1cm4gYSBsb3Qgb2YgbWFsbG9jL2ZyZWUgY2FsbHMKKyAgaW50byBSRVNFUlZFX0NPTkZJR19CVUZGRVIvUkVMRUFTRV9DT05GSUdfQlVGRkVSLgorICBGb3IgYSBzdGFydCwgc2VlIGUuZy4gbWFrZSBFWFRSQV9DRkxBR1M9LVdsYXJnZXItdGhhbi02NAorCisgIEFuZCB3aGlsZSB3ZSdyZSBhdCBpdCwgbWFueSBvZiB0aGUgQ09ORklHX0ZFQVRVUkVfQ0xFQU5fVVAgI2lmZGVmcyB3aWxsIGJlCisgIG9wdGltaXplZCBvdXQgYnkgdGhlIGNvbXBpbGVyIGluIHRoZSBzdGFjayBhbGxvY2F0aW9uIGNhc2UgKHNpbmNlIHRoZXJlJ3Mgbm8KKyAgZnJlZSBmb3IgYW4gYWxsb2NhKCkpLCBhbmQgdGhpcyBtZWFucyB0aGF0IHZhcmlvdXMgY2xlYW51cCBsb29wcyB0aGF0IGp1c3QKKyAgY2FsbCBmcmVlIG1pZ2h0IGFsc28gYmUgb3B0aW1pemVkIG91dCBieSB0aGUgY29tcGlsZXIgaWYgd3JpdHRlbiByaWdodCwgc28KKyAgd2UgY2FuIHlhbmsgdGhvc2UgI2lmZGVmcyB0b28sIGFuZCBnZW5lcmFsbHkgY2xlYW4gdXAgdGhlIGNvZGUuCistLS0KK0ZFQVRVUkVfQ0xFQU5fVVAKKyAgVGhpcyBpcyBtb3JlIGFuIHVucmVzb2x2ZWQgaXNzdWUgdGhhbiBhIHRvLWRvIGl0ZW0uICBNb3JlIHRob3VnaHQgaXMgbmVlZGVkLgorCisgIE5vcm1hbGx5IHdlIHJlbHkgb24gZXhpdCgpIHRvIGZyZWUgbWVtb3J5LCBjbG9zZSBmaWxlcyBhbmQgdW5tYXAgc2VnbWVudHMKKyAgZm9yIHVzLiAgVGhpcyBtYWtlcyBtb3N0IGNhbGxzIHRvIGZyZWUoKSwgY2xvc2UoKSwgYW5kIHVubWFwKCkgb3B0aW9uYWwgaW4KKyAgYnVzeWJveCBhcHBsZXRzIHRoYXQgZG9uJ3QgaW50ZW5kIHRvIHJ1biBmb3IgdmVyeSBsb25nLCBhbmQgb3B0aW9uYWwgc3R1ZmYKKyAgY2FuIGJlIG9taXR0ZWQgdG8gc2F2ZSBzaXplLgorCisgIFRoZSBpZGVhIHdhcyByYWlzZWQgdGhhdCB3ZSBjb3VsZCBzaW11bGF0ZSBmb3JrL2V4aXQgd2l0aCBzZXRqbXAvbG9uZ2ptcAorICBmb3IgX3JlYWxseV8gYnJhaW5sZXNzIGVtYmVkZGVkIHN5c3RlbXMsIG9yIHNwZWVkIHVwIHRoZSBzdGFuZGFsb25lIHNoZWxsCisgIGJ5IG5vdCBmb3JraW5nLiAgRG9pbmcgc28gd291bGQgcmVxdWlyZSBhIHJlbGlhYmxlIEZFQVRVUkVfQ0xFQU5fVVAuCisgIFVuZm9ydHVuYXRlbHksIHRoaXMgaXNuJ3QgYXMgZWFzeSBhcyBpdCBzb3VuZHMuCisKKyAgVGhlIHByb2JsZW0gaXMsIGxvdHMgb2YgdGhpbmdzIGV4aXQoKSwgc29tZXRpbWVzIHVuZXhwZWN0ZWRseSAoeG1hbGxvYygpKQorICBhbmQgc29tZXRpbWVzIHJlbGlhYmx5IChiYl9wZXJyb3JfbXNnX2FuZF9kaWUoKSBvciBzaG93X3VzYWdlKCkpLiAgVGhpcworICBqdW1wcyBvdXQgb2YgdGhlIG5vcm1hbCBmbG93IGNvbnRyb2wgYW5kIGJ5cGFzc2VzIGFueSBjbGVhbnVwIGNvZGUgd2UKKyAgcHV0IGF0IHRoZSBlbmQgb2Ygb3VyIGFwcGxldHMuCisKKyAgSXQncyBwb3NzaWJsZSB0byBhZGQgaG9va3MgdG8gbGliYmIgZnVuY3Rpb25zIGxpa2UgeG1hbGxvYygpIGFuZCB4b3BlbigpCisgIHRvIGFkZCB0aGVpciBlbnRyaWVzIHRvIGEgbGlua2VkIGxpc3QsIHdoaWNoIGNvdWxkIGJlIHRyYXZlcnNlZCBhbmQKKyAgZnJlZWQvY2xvc2VkIGF1dG9tYXRpY2FsbHkuICAoVGhpcyB3b3VsZCBuZWVkIHRvIGJlIGFibGUgdG8gZnJlZSBqdXN0IHRoZQorICBlbnRyaWVzIGFmdGVyIGEgY2hlY2twb2ludCB0byBiZSB1c2FibGUgZm9yIGEgZm9ya2xlc3Mgc3RhbmRhbG9uZSBzaGVsbC4KKyAgWW91IGRvbid0IHdhbnQgdG8gZnJlZSB0aGUgc2hlbGwncyBvd24gcmVzb3VyY2VzLikKKworICBSaWdodCBub3csIEZFQVRVUkVfQ0xFQU5fVVAgaXMgbW9yZSBvciBsZXNzIGEgZGVidWdnaW5nIGFpZCwgdG8gbWFrZSB0aGluZ3MKKyAgbGlrZSB2YWxncmluZCBoYXBweS4gIEl0J3MgYWxzbyBkb2N1bWVudGF0aW9uIG9mIF93aGF0XyB3ZSdyZSB0cnVzdGluZworICBleGl0KCkgdG8gY2xlYW4gdXAgZm9yIHVzLiAgQnV0IG5ldyBpbmZyYXN0cnVjdHVyZSB0byBhdXRvLWZyZWUgc3R1ZmYgd291bGQKKyAgcmVuZGVyIHRoZSBleGlzdGluZyBGRUFUVVJFX0NMRUFOX1VQIGNvZGUgcmVkdW5kYW50LgorCisgIEZvciByaWdodCBub3csIGV4aXQoKSBoYW5kbGVzIGl0IGp1c3QgZmluZS4KKworCitNaW5vciBzdHVmZjoKKyAgd2F0Y2hkb2cuYyBjb3VsZCBhdXRvZGV0ZWN0IHRoZSB0aW1lciBkdXJhdGlvbiB2aWE6CisgICAgaWYoIWlvY3RsIChmZCwgV0RJT0NfR0VUVElNRU9VVCwgJnRtbykpIHRpbWVyX2R1cmF0aW9uID0gMSArICh0bW8gLyAyKTsKKyAgVW5mb3J0dW5hdGVseSwgdGhhdCBuZWVkcyBsaW51eC93YXRjaGRvZy5oIGFuZCB0aGF0IGNvbnRhaW5zIHVuZmlsdGVyZWQKKyAga2VybmVsIHR5cGVzIG9uIHNvbWUgZGlzdHJvcywgd2hpY2ggYnJlYWtzIHRoZSBidWlsZC4KKy0tLQorICB1c2UgYmJfZXJyb3JfbXNnIHdoZXJlIGFwcHJvcHJpYXRlOiBTZWUKKyAgZWdyZXAgIihwcmludGYuKlwoW1s6c3BhY2U6XV0qKHN0ZGVycnwyKXxbXl9dd3JpdGUuKlwoW1s6c3BhY2U6XV0qKHN0ZGVycnwyKSkiCistLS0KKyAgdXNlIGJiX3BlcnJvcl9tc2cgd2hlcmUgYXBwcm9wcmlhdGU6IFNlZQorICBlZ3JlcCAiW15fXXBlcnJvciIKKy0tLQorICBwb3NzaWJsZSBjb2RlIGR1cGxpY2F0aW9uIGluZ3JvdXAoKSBhbmQgaXNfYV9ncm91cF9tZW1iZXIoKQorLS0tCisgIE1vdmUgX19nZXRfaHooKSB0byBhIGJldHRlciBwbGFjZSBhbmQgKHJlKXVzZSBpdCBpbiByb3V0ZS5jLCBhc2guYworLS0tCisgIFNlZSBncmVwIC1yIHN0cnRvZAorICBBbG90IG9mIGR1cGxpY2F0aW9uIHRoYXQgd2FudHMgY2xlYW51cC4KKy0tLQorICB1bmlmeSBwcm9ncmVzc19tZXRlci4gd2dldCwgZmxhc2hfZXJhc2VhbGwsIHBpcGVfcHJvZ3Jlc3MsIGZic3BsYXNoLCBzZXRmaWxlcy4KKy0tLQorICBzdXBwb3J0IHN0YXJ0LXN0b3AtZGFlbW9uIC1kIDxjaGRpci1wYXRoPgorLS0tCit2ZHByaW50ZigpIC0+IHNpbWlsYXIgc2l6ZWQgZnVuY3Rpb25hbGl0eQorLS0tCisKKyhUT0RPIGxpc3QgYWZ0ZXIgZGlzY3Vzc2lvbiAxMS4wNS4yMDA5KQorCisqIHNocmluayB0Yy9icmN0bC9pcAorICB0Yy9icmN0bCBzZWVtIGxpa2UgZmFpcmx5IGxhcmdlIHRoaW5ncyB0byB0cnkgYW5kIHRhY2tsZSBpbiB5b3VyIHRpbWVmcmFtZSwKKyAgYW5kIGkgdGhpbmsgcGVvcGxlIGhhdmUgcG9zdGVkIGF0dGVtcHRzIGluIHRoZSBwYXN0LiBBZGRpbmcgYWRkaXRpb25hbAorICBvcHRpb25zIHRvIGlwIHRob3VnaCBzZWVtcyByZWFzb25hYmxlLgorCisqIGFkZCB0ZXN0cyBmb3Igc29tZSBhcHBsZXRzCisKKyogaW1wbGVtZW50IFBPU0lYIHV0aWxpdGllcyBhbmQgYXVkaXQgdGhlbSBmb3IgUE9TSVggY29uZm9ybWFuY2UuIHRoZW4KKyAgYXVkaXQgdGhlbSBmb3IgR05VIGNvbmZvcm1hbmNlLiB0aGVuIGRvY3VtZW50IGFsbCB5b3VyIGZpbmRpbmdzIGluIGEgbmV3CisgIGRvYy9jb25mb3JtYW5jZS50eHQgZmlsZSB3aGlsZSBwZXJoYXBzIGltcGxlbWVudGluZyBzb21lIG9mIHRoZSBtaXNzaW5nCisgIGZlYXR1cmVzLgorICB5b3UgY2FuIGZpbmQgdGhlIGxhdGVzdCBQT1NJWCBkb2N1bWVudGF0aW9uICgxMDAzLjEtMjAwOCkgaGVyZToKKyAgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS8KKyAgYW5kIHRoZSBjb21wbGV0ZSBsaXN0IG9mIGFsbCB1dGlsaXRpZXMgdGhhdCBQT1NJWCBjb3ZlcnM6CisgIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvaWR4L3V0aWxpdGllcy5odG1sCisgIFRoZSBmaXJzdCBzdGVwIHdvdWxkIHRvIGdlbmVyYXRlIGEgZmlsZS9tYXRyaXggd2hhdCBpcyBhbHJlYWR5IGFyY2hpdmVkCisgIChhbHNvIElQVjYpCisKKyogaW1wbGVtZW50ICdhdCcKKworKiBycGNiaW5kIChmb3JtZXIgcG9ydG1hcCkgb3IgZXF1aXZhbGVudAorICBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gdXNlIC1vIG5vbG9jayBvbiBuZnMgbW91bnRzCisKKyogY2hlY2sgSVBWNiBjb21wbGlhbmNlCisKKyogZ2VuZXJhdGUgYSBtaW5pIGV4YW1wbGUgdXNpbmcga2VybmVsK2J1c3lib3ggb25seSAoK2xpYmMpIGZvciBleGFtcGxlCisKKyogbW9yZSBzdXBwb3J0IGZvciBhZHZhbmNlZCBsaW51eCAyLjYueCBmZWF0dXJlcywgc2VlOiBpb3RvcAorICBtb3N0IGxpa2VseSB0aGVyZSBpcyBtb3JlCisKKyogZXZlbiBtb3JlIHN1cHBvcnQgZm9yIHN0YXRpc3RpY3M6IG1wc3RhdCwgaW9zdGF0LCBwb3dlcnRvcC4uLi4KZGlmZiAtLWdpdCBhL1RPRE9fdW5pY29kZSBiL1RPRE9fdW5pY29kZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzEwZThkCi0tLSAvZGV2L251bGwKKysrIGIvVE9ET191bmljb2RlCkBAIC0wLDAgKzEsNDUgQEAKK0FscmVhZHkgZml4ZWQgYXBwbGV0czoKK2NhbAorbHNtb2QKK2RmCitkdW1wbGVhc2VzCisKK0FwcGxldHMgd2hpY2ggbWF5IG5lZWQgdW5pY29kZSBoYW5kbGluZyAobW9yZSBleHRlbnNpdmUgdGhhbiBzYW5pdGl6aW5nCitvZiBmaWxlbmFtZXMgaW4gZXJyb3IgbWVzc2FnZXMpOgorCitscyAtIHdvcmsgaW4gcHJvZ3Jlc3MKK2V4cGFuZCwgdW5leHBhbmQgLSB1c2VzIHVuaWNvZGVfc3RybGVuLCBub3Qgc2NybGVuCithc2gsIGh1c2ggdGhyb3VnaCBsaW5lZWRpdCAtIHVzZXMgdW5pY29kZV9zdHJsZW4sIG5vdCBzY3JsZW4KK3RvcCAtIG5lZWQgdG8gc2FuaXRpemUgcHJvY2VzcyBhcmdzCitwcyAtIG5lZWQgdG8gc2FuaXRpemUgcHJvY2VzcyBhcmdzCitsZXNzCittb3JlCit2aQorZWQKK2N1dAorYXdrCitzZWQKK3RyCitncmVwIGVncmVwIGZncmVwCitmb2xkCitzb3J0CitoZWFkLCB0YWlsCitjYXR2IC0gImRpc3BsYXkgbm9ucHJpbnRpbmcgY2hhcnMiIC0gd2hhdCB0aGlzIGNvdWxkIG1lYW4gZm9yIHVuaWNvZGU/Cit3YworY2hhdAorZHVtcGttYXAKK2xhc3QgLSBqdXN0IGxpbmUgdXAgY29sdW1ucworbWFuCittaWNyb2NvbQorc3RyaW5ncword2F0Y2gKKworVW5zdXJlLCBtYXkgbmVlZCBmaXhpbmc6CisKK2hvc3RuYW1lIC0gZG8gd2UgcmVhbGx5IHdhbnQgdG8gcHJvdGVjdCBhZ2FpbnN0IGJhZCBjaGFycyBpbiBpdD8KK3BhdGNoCithZGRncm91cCwgYWRkdXNlciwgZGVsZ3JvdXAsIGRlbHVzZXIKK3RlbG5ldAordGVsbmV0ZAorb2QKK3ByaW50ZgpkaWZmIC0tZ2l0IGEvYXBwbGV0cy9LYnVpbGQuc3JjIGIvYXBwbGV0cy9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MTIzOTkKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBsZXRzL0tidWlsZC5zcmMKQEAgLTAsMCArMSw0NyBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK29iai15IDo9CitvYmoteSArPSBhcHBsZXRzLm8KKworaG9zdHByb2dzLXk6PQoraG9zdHByb2dzLXkgKz0gdXNhZ2UgdXNhZ2VfcG9kIGFwcGxldF90YWJsZXMKKworYWx3YXlzOj0gJChob3N0cHJvZ3MteSkKKworIyBHZW5lcmF0ZWQgZmlsZXMgbmVlZCBhZGRpdGlvbmFsIGxvdmUKKworIyBUaGlzIHRyaWNrIGRlY3JlYXNlcyBhbW91bnQgb2YgcmVidWlsZHMKKyMgaWYgdHJlZSBpcyBtZXJlbHkgcmVuYW1lZC9jb3BpZWQKK2lmZXEgKCQoc3JjdHJlZSksJChvYmp0cmVlKSkKK3NyY3RyZWVfc2xhc2ggPQorZWxzZQorc3JjdHJlZV9zbGFzaCA9ICQoc3JjdHJlZSkvCitlbmRpZgorCitIT1NUQ0ZMQUdTX3VzYWdlLm8gPSAtSSQoc3JjdHJlZV9zbGFzaClpbmNsdWRlIC1JaW5jbHVkZQorSE9TVENGTEFHU191c2FnZV9wb2QubyA9IC1JJChzcmN0cmVlX3NsYXNoKWluY2x1ZGUgLUlpbmNsdWRlCisKK2FwcGxldHMvYXBwbGV0cy5vOiBpbmNsdWRlL3VzYWdlX2NvbXByZXNzZWQuaCBpbmNsdWRlL2FwcGxldF90YWJsZXMuaAorCithcHBsZXRzL2FwcGxldF90YWJsZXM6IC5jb25maWcgaW5jbHVkZS9hcHBsZXRzLmgKK2FwcGxldHMvdXNhZ2U6ICAgICAgICAgLmNvbmZpZyBpbmNsdWRlL2FwcGxldHMuaAorYXBwbGV0cy91c2FnZV9wb2Q6ICAgICAuY29uZmlnIGluY2x1ZGUvYXBwbGV0X3RhYmxlcy5oIGluY2x1ZGUvYXBwbGV0cy5oCisKK3F1aWV0X2NtZF9nZW5fdXNhZ2VfY29tcHJlc3NlZCA9IEdFTiAgICAgaW5jbHVkZS91c2FnZV9jb21wcmVzc2VkLmgKKyAgICAgIGNtZF9nZW5fdXNhZ2VfY29tcHJlc3NlZCA9ICQoc3JjdHJlZV9zbGFzaClhcHBsZXRzL3VzYWdlX2NvbXByZXNzZWQgaW5jbHVkZS91c2FnZV9jb21wcmVzc2VkLmggYXBwbGV0cworCitpbmNsdWRlL3VzYWdlX2NvbXByZXNzZWQuaDogYXBwbGV0cy91c2FnZSAkKHNyY3RyZWVfc2xhc2gpYXBwbGV0cy91c2FnZV9jb21wcmVzc2VkCisJJChjYWxsIGNtZCxnZW5fdXNhZ2VfY29tcHJlc3NlZCkKKworcXVpZXRfY21kX2dlbl9hcHBsZXRfdGFibGVzID0gR0VOICAgICBpbmNsdWRlL2FwcGxldF90YWJsZXMuaAorICAgICAgY21kX2dlbl9hcHBsZXRfdGFibGVzID0gYXBwbGV0cy9hcHBsZXRfdGFibGVzIGluY2x1ZGUvYXBwbGV0X3RhYmxlcy5oIGluY2x1ZGUvTlVNX0FQUExFVFMuaAorCitpbmNsdWRlL2FwcGxldF90YWJsZXMuaDogYXBwbGV0cy9hcHBsZXRfdGFibGVzCisJJChjYWxsIGNtZCxnZW5fYXBwbGV0X3RhYmxlcykKKworaW5jbHVkZS9OVU1fQVBQTEVUUy5oOiBhcHBsZXRzL2FwcGxldF90YWJsZXMKKwkkKGNhbGwgY21kLGdlbl9hcHBsZXRfdGFibGVzKQpkaWZmIC0tZ2l0IGEvYXBwbGV0cy9hcHBsZXRfdGFibGVzLmMgYi9hcHBsZXRzL2FwcGxldF90YWJsZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmJmMWU0Ci0tLSAvZGV2L251bGwKKysrIGIvYXBwbGV0cy9hcHBsZXRfdGFibGVzLmMKQEAgLTAsMCArMSwxNzQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIEFwcGxldCB0YWJsZSBnZW5lcmF0b3IuCisgKiBSdW5zIG9uIGhvc3QgYW5kIHByb2R1Y2VzIGluY2x1ZGUvYXBwbGV0X3RhYmxlcy5oCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyN1bmRlZiBBUlJBWV9TSVpFCisjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKCh1bnNpZ25lZCkoc2l6ZW9mKHgpIC8gc2l6ZW9mKCh4KVswXSkpKQorCisjaW5jbHVkZSAiLi4vaW5jbHVkZS9hdXRvY29uZi5oIgorI2luY2x1ZGUgIi4uL2luY2x1ZGUvYXBwbGV0X21ldGFkYXRhLmgiCisKK3N0cnVjdCBiYl9hcHBsZXQgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqbWFpbjsKKwllbnVtIGJiX2luc3RhbGxfbG9jX3QgaW5zdGFsbF9sb2M7CisJZW51bSBiYl9zdWlkX3QgbmVlZF9zdWlkOworCS8qIHRydWUgaWYgaW5zdGVhZCBvZiBmb3JrKCk7IGV4ZWMoImFwcGxldCIpOyB3YWl0cGlkKCk7CisJICogb25lIGNhbiBkbyBmb3JrKCk7IGV4aXQoYXBwbGV0X21haW4oYXJnYyxhcmd2KSk7IHdhaXRwaWQoKTsgKi8KKwl1bnNpZ25lZCBjaGFyIG5vZXhlYzsKKwkvKiBFdmVuIG5pY2VyICovCisJLyogdHJ1ZSBpZiBpbnN0ZWFkIG9mIGZvcmsoKTsgZXhlYygiYXBwbGV0Iik7IHdhaXRwaWQoKTsKKwkgKiBvbmUgY2FuIHNpbXBseSBjYWxsIGFwcGxldF9tYWluKGFyZ2MsYXJndik7ICovCisJdW5zaWduZWQgY2hhciBub2Zvcms7Cit9OworCisvKiBEZWZpbmUgc3RydWN0IGJiX2FwcGxldCBhcHBsZXRzW10gKi8KKyNpbmNsdWRlICIuLi9pbmNsdWRlL2FwcGxldHMuaCIKKworZW51bSB7IE5VTV9BUFBMRVRTID0gQVJSQVlfU0laRShhcHBsZXRzKSB9OworCitzdGF0aWMgaW50IG9mZnNldFtOVU1fQVBQTEVUU107CisKK3N0YXRpYyBpbnQgY21wX25hbWUoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKwljb25zdCBzdHJ1Y3QgYmJfYXBwbGV0ICphYSA9IGE7CisJY29uc3Qgc3RydWN0IGJiX2FwcGxldCAqYmIgPSBiOworCXJldHVybiBzdHJjbXAoYWEtPm5hbWUsIGJiLT5uYW1lKTsKK30KKworc3RhdGljIGludCBzdHJfaXNhbG51bV8oY29uc3QgY2hhciAqcykKK3sKKwl3aGlsZSAoKnMpIHsKKwkJaWYgKCFpc2FsbnVtKCpzKSAmJiAqcyAhPSAnXycpCisJCQlyZXR1cm4gMDsKKwkJcysrOworCX0KKwlyZXR1cm4gMTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCWludCBvZnM7CisvLwl1bnNpZ25lZCBNQVhfQVBQTEVUX05BTUVfTEVOID0gMTsKKworCXFzb3J0KGFwcGxldHMsIE5VTV9BUFBMRVRTLCBzaXplb2YoYXBwbGV0c1swXSksIGNtcF9uYW1lKTsKKworCW9mcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5VTV9BUFBMRVRTOyBpKyspIHsKKwkJb2Zmc2V0W2ldID0gb2ZzOworCQlvZnMgKz0gc3RybGVuKGFwcGxldHNbaV0ubmFtZSkgKyAxOworCX0KKwkvKiBXZSByZXVzZSA0IGhpZ2gtb3JkZXIgYml0cyBvZiBvZmZzZXQgYXJyYXkgZm9yIG90aGVyIHB1cnBvc2VzLAorCSAqIHNvIGlmIHRoZXkgYXJlIGluZGVlZCBuZWVkZWQsIHJlZnVzZSB0byBwcm9jZWVkICovCisJaWYgKG9mcyA+IDB4ZmZmKQorCQlyZXR1cm4gMTsKKwlpZiAoIWFyZ3ZbMV0pCisJCXJldHVybiAxOworCisJaSA9IG9wZW4oYXJndlsxXSwgT19XUk9OTFkgfCBPX1RSVU5DIHwgT19DUkVBVCwgMDY2Nik7CisJaWYgKGkgPCAwKQorCQlyZXR1cm4gMTsKKwlkdXAyKGksIDEpOworCisJLyogS2VlcCBpbiBzeW5jIHdpdGggaW5jbHVkZS9idXN5Ym94LmghICovCisKKwlwcmludGYoIi8qIFRoaXMgaXMgYSBnZW5lcmF0ZWQgZmlsZSwgZG9uJ3QgZWRpdCAqL1xuXG4iKTsKKworCXByaW50ZigiI2RlZmluZSBOVU1fQVBQTEVUUyAldVxuIiwgTlVNX0FQUExFVFMpOworCWlmIChOVU1fQVBQTEVUUyA9PSAxKSB7CisJCXByaW50ZigiI2RlZmluZSBTSU5HTEVfQVBQTEVUX1NUUiBcIiVzXCJcbiIsIGFwcGxldHNbMF0ubmFtZSk7CisJCXByaW50ZigiI2RlZmluZSBTSU5HTEVfQVBQTEVUX01BSU4gJXNfbWFpblxuIiwgYXBwbGV0c1swXS5tYWluKTsKKwl9CisJcHJpbnRmKCJcbiIpOworCisJLy9wcmludGYoIiNpZm5kZWYgU0tJUF9kZWZpbml0aW9uc1xuIik7CisJcHJpbnRmKCJjb25zdCBjaGFyIGFwcGxldF9uYW1lc1tdIEFMSUdOMSA9IFwiXCJcbiIpOworCWZvciAoaSA9IDA7IGkgPCBOVU1fQVBQTEVUUzsgaSsrKSB7CisJCXByaW50ZigiXCIlc1wiIFwiXFwwXCJcbiIsIGFwcGxldHNbaV0ubmFtZSk7CisvLwkJaWYgKE1BWF9BUFBMRVRfTkFNRV9MRU4gPCBzdHJsZW4oYXBwbGV0c1tpXS5uYW1lKSkKKy8vCQkJTUFYX0FQUExFVF9OQU1FX0xFTiA9IHN0cmxlbihhcHBsZXRzW2ldLm5hbWUpOworCX0KKwlwcmludGYoIjtcblxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0FQUExFVFM7IGkrKykgeworCQlpZiAoc3RyX2lzYWxudW1fKGFwcGxldHNbaV0ubmFtZSkpCisJCQlwcmludGYoIiNkZWZpbmUgQVBQTEVUX05PXyVzICVkXG4iLCBhcHBsZXRzW2ldLm5hbWUsIGkpOworCX0KKwlwcmludGYoIlxuIik7CisKKwlwcmludGYoIiNpZm5kZWYgU0tJUF9hcHBsZXRfbWFpblxuIik7CisJcHJpbnRmKCJpbnQgKCpjb25zdCBhcHBsZXRfbWFpbltdKShpbnQgYXJnYywgY2hhciAqKmFyZ3YpID0ge1xuIik7CisJZm9yIChpID0gMDsgaSA8IE5VTV9BUFBMRVRTOyBpKyspIHsKKwkJcHJpbnRmKCIlc19tYWluLFxuIiwgYXBwbGV0c1tpXS5tYWluKTsKKwl9CisJcHJpbnRmKCJ9O1xuIik7CisJcHJpbnRmKCIjZW5kaWZcblxuIik7CisKKwlwcmludGYoImNvbnN0IHVpbnQxNl90IGFwcGxldF9uYW1lb2ZzW10gQUxJR04yID0ge1xuIik7CisJZm9yIChpID0gMDsgaSA8IE5VTV9BUFBMRVRTOyBpKyspIHsKKwkJcHJpbnRmKCIweCUwNHgsXG4iLAorCQkJb2Zmc2V0W2ldCisjaWYgRU5BQkxFX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFMKKwkJCSsgKGFwcGxldHNbaV0ubm9mb3JrIDw8IDEyKQorCQkJKyAoYXBwbGV0c1tpXS5ub2V4ZWMgPDwgMTMpCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9TVUlECisJCQkrIChhcHBsZXRzW2ldLm5lZWRfc3VpZCA8PCAxNCkgLyogMiBiaXRzICovCisjZW5kaWYKKwkJKTsKKwl9CisJcHJpbnRmKCJ9O1xuXG4iKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU1RBTExFUgorCXByaW50ZigiY29uc3QgdWludDhfdCBhcHBsZXRfaW5zdGFsbF9sb2NbXSBBTElHTjEgPSB7XG4iKTsKKwlpID0gMDsKKwl3aGlsZSAoaSA8IE5VTV9BUFBMRVRTKSB7CisJCWludCB2ID0gYXBwbGV0c1tpXS5pbnN0YWxsX2xvYzsgLyogMyBiaXRzICovCisJCWlmICgrK2kgPCBOVU1fQVBQTEVUUykKKwkJCXYgfD0gYXBwbGV0c1tpXS5pbnN0YWxsX2xvYyA8PCA0OyAvKiAzIGJpdHMgKi8KKwkJcHJpbnRmKCIweCUwMngsXG4iLCB2KTsKKwkJaSsrOworCX0KKwlwcmludGYoIn07XG4iKTsKKyNlbmRpZgorCS8vcHJpbnRmKCIjZW5kaWYgLyogU0tJUF9kZWZpbml0aW9ucyAqL1xuIik7CisvLwlwcmludGYoIlxuIik7CisvLwlwcmludGYoIiNkZWZpbmUgTUFYX0FQUExFVF9OQU1FX0xFTiAldVxuIiwgTUFYX0FQUExFVF9OQU1FX0xFTik7CisKKwlpZiAoYXJndlsyXSkgeworCQljaGFyIGxpbmVfb2xkWzgwXTsKKwkJY2hhciBsaW5lX25ld1s4MF07CisJCUZJTEUgKmZwOworCisJCWxpbmVfb2xkWzBdID0gMDsKKwkJZnAgPSBmb3Blbihhcmd2WzJdLCAiciIpOworCQlpZiAoZnApIHsKKwkJCWZnZXRzKGxpbmVfb2xkLCBzaXplb2YobGluZV9vbGQpLCBmcCk7CisJCQlmY2xvc2UoZnApOworCQl9CisJCXNwcmludGYobGluZV9uZXcsICIjZGVmaW5lIE5VTV9BUFBMRVRTICV1XG4iLCBOVU1fQVBQTEVUUyk7CisJCWlmIChzdHJjbXAobGluZV9vbGQsIGxpbmVfbmV3KSAhPSAwKSB7CisJCQlmcCA9IGZvcGVuKGFyZ3ZbMl0sICJ3Iik7CisJCQlpZiAoIWZwKQorCQkJCXJldHVybiAxOworCQkJZnB1dHMobGluZV9uZXcsIGZwKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXBwbGV0cy9hcHBsZXRzLmMgYi9hcHBsZXRzL2FwcGxldHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGMyYjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYXBwbGV0cy9hcHBsZXRzLmMKQEAgLTAsMCArMSwxNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU3R1YiBmb3IgbGlua2luZyBidXN5Ym94IGJpbmFyeSBhZ2FpbnN0IGxpYmJ1c3lib3guCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImJ1c3lib3guaCIKKworI2lmIEVOQUJMRV9CVUlMRF9MSUJCVVNZQk9YCitpbnQgbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXJldHVybiBsYmJfbWFpbihhcmd2KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXBwbGV0cy9idXN5Ym94Lm1rbGwgYi9hcHBsZXRzL2J1c3lib3gubWtsbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42OGRiZjIxCi0tLSAvZGV2L251bGwKKysrIGIvYXBwbGV0cy9idXN5Ym94Lm1rbGwKQEAgLTAsMCArMSwyNCBAQAorIyEvYmluL3NoCisjIE1ha2UgYnVzeWJveCBsaW5rcyBsaXN0IGZpbGUuCisKKyMgaW5wdXQgJDE6IGZ1bGwgcGF0aCB0byBDb25maWcuaAorIyBpbnB1dCAkMjogZnVsbCBwYXRoIHRvIGFwcGxldHMuaAorIyBvdXRwdXQgKHN0ZG91dCk6IGxpc3Qgb2YgcGF0aG5hbWVzIHRoYXQgc2hvdWxkIGJlIGxpbmtlZCB0byBidXN5Ym94CisKKyMgTWFpbnRhaW5lcjogTGFycnkgRG9vbGl0dGxlIDxsZG9vbGl0dEByZWN5Y2xlLmxibC5nb3Y+CisKK2V4cG9ydCBMQ19BTEw9UE9TSVgKK2V4cG9ydCBMQ19DVFlQRT1QT1NJWAorCitDT05GSUdfSD0kezE6LWluY2x1ZGUvYXV0b2NvbmYuaH0KK0FQUExFVFNfSD0kezI6LWluY2x1ZGUvYXBwbGV0cy5ofQorJEhPU1RDQyAtRSAtRE1BS0VfTElOS1MgLWluY2x1ZGUgJENPTkZJR19IICRBUFBMRVRTX0ggfAorICBhd2sgJy9eWyBcdF0qTElOSy97CisJZGlyPXN1YnN0cigkMiw3KQorCWdzdWIoIl8iLCIvIixkaXIpCisJaWYoZGlyPT0iL1JPT1QiKSBkaXI9IiIKKwlmaWxlPSQzCisJZ3N1YigiXCIiLCIiLGZpbGUpCisJaWYgKGZpbGU9PSJidXN5Ym94IikgbmV4dAorCXByaW50IHRvbG93ZXIoZGlyKSAiLyIgZmlsZQorICB9JwpkaWZmIC0tZ2l0IGEvYXBwbGV0cy9idXN5Ym94Lm1rc3VpZCBiL2FwcGxldHMvYnVzeWJveC5ta3N1aWQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjQ5MmMwNwotLS0gL2Rldi9udWxsCisrKyBiL2FwcGxldHMvYnVzeWJveC5ta3N1aWQKQEAgLTAsMCArMSw1NCBAQAorIyEvYmluL3NoCisjIE1ha2UgbGlzdCBvZiBjb25maWd1cmF0aW9uIHZhcmlhYmxlcyByZWdhcmRpbmcgc3VpZCBoYW5kbGluZworCisjIGlucHV0ICQxOiBmdWxsIHBhdGggdG8gYXV0b2NvbmYuaAorIyBpbnB1dCAkMjogZnVsbCBwYXRoIHRvIGFwcGxldHMuaAorIyBpbnB1dCAkMzogZnVsbCBwYXRoIHRvIC5jb25maWcKKyMgb3V0cHV0IChzdGRvdXQpOiBsaXN0IG9mIENPTkZJR18gdGhhdCBkbyBvciBtYXkgcmVxdWlyZSBzdWlkCisKKyMgSWYgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFNVSUQgaXMgbm90IHNldCBvciBzZXQgdG8gRFJPUCwKKyMgbGlzdHMgYWxsIGNvbmZpZyBvcHRpb25zIHRoYXQgZG8gbm90IHJlcXVpcmUgc3VpZCBwZXJtaXNzaW9ucy4KKyMgT3RoZXJ3aXNlLCBsaXN0cyBhbGwgY29uZmlnIG9wdGlvbnMgZm9yIGFwcGxldHMgdGhhdCBETyBvciBNQVkgcmVxdWlyZQorIyBzdWlkIHBlcm1pc3Npb25zLgorCisjIE1haW50YWluZXI6IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorCitleHBvcnQgTENfQUxMPVBPU0lYCitleHBvcnQgTENfQ1RZUEU9UE9TSVgKKworQ09ORklHX0g9JHsxOi1pbmNsdWRlL2F1dG9jb25mLmh9CitBUFBMRVRTX0g9JHsyOi1pbmNsdWRlL2FwcGxldHMuaH0KK0RPVF9DT05GSUc9JHszOi0uY29uZmlnfQorCitjYXNlICR7U1VJRDotRFJPUH0gaW4KK1tkRF1bclJdW29PXVtwUF0pIFVTRT0iRFJPUCIgOzsKKyopIFVTRT0ic3VpZCIgOzsKK2VzYWMKKworJEhPU1RDQyAtRSAtRE1BS0VfU1VJRCAtaW5jbHVkZSAkQ09ORklHX0ggJEFQUExFVFNfSCB8CisgIGF3ayAtdiBVU0U9JHtVU0V9ICcKKyAgICAvXlNVSURbIFx0XS97CisgICAgICBpZiAoVVNFID09ICJEUk9QIikgeworICAgICAgICBpZiAoJDIgIT0gIkJCX1NVSURfRFJPUCIpIG5leHQKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgkMiA9PSAiQkJfU1VJRF9EUk9QIikgbmV4dAorICAgICAgfQorICAgICAgY2ZnID0gJE5GCisgICAgICBnc3ViKCJcIiIsICIiLCBjZmcpCisgICAgICBjZmcgPSBzdWJzdHIoY2ZnLCA4KQorICAgICAgc1tpKytdID0gIkNPTkZJR18iIGNmZworICAgICAgc1tpKytdID0gIkNPTkZJR19GRUFUVVJFXyIgY2ZnICJfLioiCisgICAgfQorICAgIEVORHsKKyAgICAgIHdoaWxlIChnZXRsaW5lIDwgQVJHVlsyXSkgeworICAgICAgICBmb3IgKGogaW4gcykgeworICAgICAgICAgIGlmICgkMCB+ICJeIiBzW2pdICI9eSQiKSB7CisgICAgICAgICAgICBzdWIoLz0uKi8sICIiKQorICAgICAgICAgICAgcHJpbnQKKyAgICAgICAgICAgIGlmIChzW2pdICF+IC9cKiQvKSBkZWxldGUgc1tqXSAjIGNhbiBkcm9wIHRoaXMgYXBwbGV0IG5vdworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKycgLSAkRE9UX0NPTkZJRworCmRpZmYgLS1naXQgYS9hcHBsZXRzL2luZGl2aWR1YWwuYyBiL2FwcGxldHMvaW5kaXZpZHVhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNDY4ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBsZXRzL2luZGl2aWR1YWwuYwpAQCAtMCwwICsxLDI0IEBACisvKiBNaW5pbWFsIHdyYXBwZXIgdG8gYnVpbGQgYW4gaW5kaXZpZHVhbCBidXN5Ym94IGFwcGxldC4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCitjb25zdCBjaGFyICphcHBsZXRfbmFtZTsKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAidXNhZ2UuaCIKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWFwcGxldF9uYW1lID0gYXJndlswXTsKKwlyZXR1cm4gQVBQTEVUX21haW4oYXJnYywgYXJndik7Cit9CisKK3ZvaWQgYmJfc2hvd191c2FnZSh2b2lkKQoreworCWZwdXRzKEFQUExFVF9mdWxsX3VzYWdlICJcbiIsIHN0ZG91dCk7CisJZXhpdChFWElUX0ZBSUxVUkUpOworfQpkaWZmIC0tZ2l0IGEvYXBwbGV0cy9pbnN0YWxsLnNoIGIvYXBwbGV0cy9pbnN0YWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY2YzA5N2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBsZXRzL2luc3RhbGwuc2gKQEAgLTAsMCArMSwxMzUgQEAKKyMhL2Jpbi9zaAorCitleHBvcnQgTENfQUxMPVBPU0lYCitleHBvcnQgTENfQ1RZUEU9UE9TSVgKKworcHJlZml4PSQxCitpZiBbIC16ICIkcHJlZml4IiBdOyB0aGVuCisJZWNobyAidXNhZ2U6IGFwcGxldHMvaW5zdGFsbC5zaCBERVNUSU5BVElPTiBbLS1zeW1saW5rcy8tLWhhcmRsaW5rcy8tLWJpbmFyaWVzLy0tc2NyaXB0d3JhcHBlcl0iCisJZXhpdCAxCitmaQorCisjIFNvdXJjZSB0aGUgY29uZmlndXJhdGlvbgorLiAuLy5jb25maWcKKworaD1gc29ydCBidXN5Ym94LmxpbmtzIHwgdW5pcWAKKworc2hhcmVkbGliX2Rpcj0iMF9saWIiCisKK2xpbmtvcHRzPSIiCitzY3JpcHR3cmFwcGVyPSJuIgorYmluYXJpZXM9Im4iCitjbGVhbnVwPSIwIgorbm9jbG9iYmVyPSIwIgorY2FzZSAiJDIiIGluCisJLS1oYXJkbGlua3MpICAgICBsaW5rb3B0cz0iLWYiOzsKKwktLXN5bWxpbmtzKSAgICAgIGxpbmtvcHRzPSItZnMiOzsKKwktLWJpbmFyaWVzKSAgICAgIGJpbmFyaWVzPSJ5Ijs7CisJLS1zY3JpcHR3cmFwcGVyKSBzY3JpcHR3cmFwcGVyPSJ5Ijtzd3JhcGFsbD0ieSI7OworCS0tc3ctc2gtaGFyZCkgICAgc2NyaXB0d3JhcHBlcj0ieSI7bGlua29wdHM9Ii1mIjs7CisJLS1zdy1zaC1zeW0pICAgICBzY3JpcHR3cmFwcGVyPSJ5IjtsaW5rb3B0cz0iLWZzIjs7CisJLS1jbGVhbnVwKSAgICAgICBjbGVhbnVwPSIxIjs7CisJLS1ub2Nsb2JiZXIpICAgICBub2Nsb2JiZXI9IjEiOzsKKwkiIikgICAgICAgICAgICAgIGg9IiI7OworCSopICAgICAgICAgICAgICAgZWNobyAiVW5rbm93biBpbnN0YWxsIG9wdGlvbjogJDIiOyBleGl0IDE7OworZXNhYworCitpZiBbIC1uICIkRE9fSU5TVEFMTF9MSUJTIiBdICYmIFsgIiRET19JTlNUQUxMX0xJQlMiICE9ICJuIiBdOyB0aGVuCisJIyBnZXQgdGhlIHRhcmdldCBkaXIgZm9yIHRoZSBsaWJzCisJIyBhc3N1bWUgaXQgc3RhcnRzIHdpdGggbGliCisJbGliZGlyPSQoJENDIC1wcmludC1maWxlLW5hbWU9bGliYy5zbyB8IFwKKwkJIHNlZCAtbiAncyVeLipcKC9saWJbXlwvXSpcKS9saWJjLnNvJVwxJXAnKQorCWlmIHRlc3QgLXogIiRsaWJkaXIiOyB0aGVuCisJCWxpYmRpcj0vbGliCisJZmkKKworCW1rZGlyIC1wICIkcHJlZml4LyRsaWJkaXIiIHx8IGV4aXQgMQorCWZvciBpIGluICRET19JTlNUQUxMX0xJQlM7IGRvCisJCXJtIC1mICIkcHJlZml4LyRsaWJkaXIvJGkiIHx8IGV4aXQgMQorCQlpZiBbIC1mICIkaSIgXTsgdGhlbgorCQkJZWNobyAiICAgSW5zdGFsbGluZyAkaSB0byB0aGUgdGFyZ2V0IGF0ICRwcmVmaXgvJGxpYmRpci8iCisJCQljcCAtcFBSICIkaSIgIiRwcmVmaXgvJGxpYmRpci8iIHx8IGV4aXQgMQorCQkJY2htb2QgMDY0NCAiJHByZWZpeC8kbGliZGlyL2BiYXNlbmFtZSAkaWAiIHx8IGV4aXQgMQorCQlmaQorCWRvbmUKK2ZpCisKK2lmIFsgIiRjbGVhbnVwIiA9ICIxIiBdICYmIFsgLWUgIiRwcmVmaXgvYmluL2J1c3lib3giIF07IHRoZW4KKwlpbm9kZT1gbHMgLWkgIiRwcmVmaXgvYmluL2J1c3lib3giIHwgYXdrICd7cHJpbnQgJDF9J2AKKwlzdWJfc2hlbGxfaXQ9YAorCQljZCAiJHByZWZpeCIKKwkJZm9yIGQgaW4gdXNyL3NiaW4gdXNyL2JpbiBzYmluIGJpbjsgZG8KKwkJCXBkPSRQV0QKKwkJCWlmIFsgLWQgIiRkIiBdOyB0aGVuCisJCQkJY2QgIiRkIgorCQkJCWxzIC1pTCAuIHwgZ3JlcCAiXiAqJGlub2RlIiB8IGF3ayAne3ByaW50ICQyfScgfCBlbnYgLWkgeGFyZ3Mgcm0gLWYKKwkJCWZpCisJCQljZCAiJHBkIgorCQlkb25lCisJCWAKKwlleGl0IDAKK2ZpCisKK3JtIC1mICIkcHJlZml4L2Jpbi9idXN5Ym94IiB8fCBleGl0IDEKK21rZGlyIC1wICIkcHJlZml4L2JpbiIgfHwgZXhpdCAxCitpbnN0YWxsIC1tIDc1NSBidXN5Ym94ICIkcHJlZml4L2Jpbi9idXN5Ym94IiB8fCBleGl0IDEKKworZm9yIGkgaW4gJGg7IGRvCisJYXBwZGlyPWBkaXJuYW1lICIkaSJgCisJYXBwPWBiYXNlbmFtZSAiJGkiYAorCW1rZGlyIC1wICIkcHJlZml4LyRhcHBkaXIiIHx8IGV4aXQgMQorCWlmIFsgIiRzY3JpcHR3cmFwcGVyIiA9ICJ5IiBdOyB0aGVuCisJCWlmIFsgIiRzd3JhcGFsbCIgIT0gInkiIF0gJiYgWyAiJGkiID0gIi9iaW4vc2giIF07IHRoZW4KKwkJCWxuICRsaW5rb3B0cyBidXN5Ym94ICIkcHJlZml4LyRpIiB8fCBleGl0IDEKKwkJZWxzZQorCQkJcm0gLWYgIiRwcmVmaXgvJGkiCisJCQllY2hvICIjIS9iaW4vYnVzeWJveCIgPiIkcHJlZml4LyRpIgorCQkJY2htb2QgK3ggIiRwcmVmaXgvJGkiCisJCWZpCisJCWVjaG8gIgkkcHJlZml4LyRpIgorCWVsaWYgWyAiJGJpbmFyaWVzIiA9ICJ5IiBdOyB0aGVuCisJCSMgQ29weSB0aGUgYmluYXJ5IG92ZXIgcmF0aGVyCisJCWlmIFsgLWUgJHNoYXJlZGxpYl9kaXIvJGFwcCBdOyB0aGVuCisJCQlpZiBbICIkbm9jbG9iYmVyIiA9ICIwIiBdIHx8IFsgISAtZSAiJHByZWZpeC8kaSIgXTsgdGhlbgorCQkJCWVjaG8gIiAgIENvcHlpbmcgJHNoYXJlZGxpYl9kaXIvJGFwcCB0byAkcHJlZml4LyRpIgorCQkJCWNwIC1wUFIgJHNoYXJlZGxpYl9kaXIvJGFwcCAkcHJlZml4LyRpIHx8IGV4aXQgMQorCQkJZWxzZQorCQkJCWVjaG8gIiAgJHByZWZpeC8kaSBhbHJlYWR5IGV4aXN0cyIKKwkJCWZpCisJCWVsc2UKKwkJCWVjaG8gIkVycm9yOiBDb3VsZCBub3QgZmluZCAkc2hhcmVkbGliX2Rpci8kYXBwIgorCQkJZXhpdCAxCisJCWZpCisJZWxzZQorCQlpZiBbICIkMiIgPSAiLS1oYXJkbGlua3MiIF07IHRoZW4KKwkJCWJiX3BhdGg9IiRwcmVmaXgvYmluL2J1c3lib3giCisJCWVsc2UKKwkJCWNhc2UgIiRhcHBkaXIiIGluCisJCQkvKQorCQkJCWJiX3BhdGg9ImJpbi9idXN5Ym94IgorCQkJOzsKKwkJCS9iaW4pCisJCQkJYmJfcGF0aD0iYnVzeWJveCIKKwkJCTs7CisJCQkvc2JpbikKKwkJCQliYl9wYXRoPSIuLi9iaW4vYnVzeWJveCIKKwkJCTs7CisJCQkvdXNyL2JpbiB8IC91c3Ivc2JpbikKKwkJCQliYl9wYXRoPSIuLi8uLi9iaW4vYnVzeWJveCIKKwkJCTs7CisJCQkqKQorCQkJCWVjaG8gIlVua25vd24gaW5zdGFsbGF0aW9uIGRpcmVjdG9yeTogJGFwcGRpciIKKwkJCQlleGl0IDEKKwkJCTs7CisJCQllc2FjCisJCWZpCisJCWlmIFsgIiRub2Nsb2JiZXIiID0gIjAiIF0gfHwgWyAhIC1lICIkcHJlZml4LyRpIiBdOyB0aGVuCisJCQllY2hvICIgICRwcmVmaXgvJGkgLT4gJGJiX3BhdGgiCisJCQlsbiAkbGlua29wdHMgIiRiYl9wYXRoIiAiJHByZWZpeC8kaSIgfHwgZXhpdCAxCisJCWVsc2UKKwkJCWVjaG8gIiAgJHByZWZpeC8kaSBhbHJlYWR5IGV4aXN0cyIKKwkJZmkKKwlmaQorZG9uZQorCitleGl0IDAKZGlmZiAtLWdpdCBhL2FwcGxldHMvdXNhZ2UuYyBiL2FwcGxldHMvdXNhZ2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDUyMGZmCi0tLSAvZGV2L251bGwKKysrIGIvYXBwbGV0cy91c2FnZS5jCkBAIC0wLDAgKzEsNTUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBEZW55cyBWbGFzZW5rby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICJhdXRvY29uZi5oIgorCisvKiBTaW5jZSB3ZSBjYW4ndCB1c2UgcGxhdGZvcm0uaCwgaGF2ZSB0byBkbyB0aGlzIGFnYWluIGJ5IGhhbmQ6ICovCisjaWYgRU5BQkxFX05PTU1VCisjIGRlZmluZSBCQl9NTVUgMAorIyBkZWZpbmUgVVNFX0ZPUl9OT01NVSguLi4pIF9fVkFfQVJHU19fCisjIGRlZmluZSBVU0VfRk9SX01NVSguLi4pCisjZWxzZQorIyBkZWZpbmUgQkJfTU1VIDEKKyMgZGVmaW5lIFVTRV9GT1JfTk9NTVUoLi4uKQorIyBkZWZpbmUgVVNFX0ZPUl9NTVUoLi4uKSBfX1ZBX0FSR1NfXworI2VuZGlmCisKKyNpbmNsdWRlICJ1c2FnZS5oIgorI2RlZmluZSBNQUtFX1VTQUdFKGFuYW1lLCB1c2FnZSkgeyBhbmFtZSwgdXNhZ2UgfSwKK3N0YXRpYyBzdHJ1Y3QgdXNhZ2VfZGF0YSB7CisJY29uc3QgY2hhciAqYW5hbWU7CisJY29uc3QgY2hhciAqdXNhZ2U7Cit9IHVzYWdlX2FycmF5W10gPSB7CisjaW5jbHVkZSAiYXBwbGV0cy5oIgorfTsKKworc3RhdGljIGludCBjb21wYXJlX2Z1bmMoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKwljb25zdCBzdHJ1Y3QgdXNhZ2VfZGF0YSAqdWEgPSBhOworCWNvbnN0IHN0cnVjdCB1c2FnZV9kYXRhICp1YiA9IGI7CisJcmV0dXJuIHN0cmNtcCh1YS0+YW5hbWUsIHViLT5hbmFtZSk7Cit9CisKK2ludCBtYWluKHZvaWQpCit7CisJaW50IGk7CisJaW50IG51bV9tZXNzYWdlcyA9IHNpemVvZih1c2FnZV9hcnJheSkgLyBzaXplb2YodXNhZ2VfYXJyYXlbMF0pOworCisJaWYgKG51bV9tZXNzYWdlcyA9PSAwKQorCQlyZXR1cm4gMDsKKworCXFzb3J0KHVzYWdlX2FycmF5LAorCQludW1fbWVzc2FnZXMsIHNpemVvZih1c2FnZV9hcnJheVswXSksCisJCWNvbXBhcmVfZnVuYyk7CisJZm9yIChpID0gMDsgaSA8IG51bV9tZXNzYWdlczsgaSsrKQorCQl3cml0ZShTVERPVVRfRklMRU5PLCB1c2FnZV9hcnJheVtpXS51c2FnZSwgc3RybGVuKHVzYWdlX2FycmF5W2ldLnVzYWdlKSArIDEpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcHBsZXRzL3VzYWdlX2NvbXByZXNzZWQgYi9hcHBsZXRzL3VzYWdlX2NvbXByZXNzZWQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTg2ZmNkZQotLS0gL2Rldi9udWxsCisrKyBiL2FwcGxldHMvdXNhZ2VfY29tcHJlc3NlZApAQCAtMCwwICsxLDU5IEBACisjIS9iaW4vc2gKKwordGFyZ2V0PSIkMSIKK2xvYz0iJDIiCisKK3Rlc3QgIiR0YXJnZXQiIHx8IGV4aXQgMQordGVzdCAiJGxvYyIgfHwgbG9jPS4KK3Rlc3QgLXggIiRsb2MvdXNhZ2UiIHx8IGV4aXQgMQordGVzdCAiJFNFRCIgfHwgU0VEPXNlZAordGVzdCAiJEREIiB8fCBERD1kZAorCisjIFNvbWUgcGVvcGxlIHdlcmUgYml0dGVuIGJ5IHRoZWlyIHN5c3RlbSBsYWNraW5nIGEgKHByb3Blcikgb2QKK29kIC12IC1iIDwvZGV2L251bGwgPi9kZXYvbnVsbAoraWYgdGVzdCAkPyAhPSAwOyB0aGVuCisJZWNobyAnb2QgdG9vbCBpcyBub3QgaW5zdGFsbGVkIG9yIGNhbm5vdCBhY2NlcHQgIi12IC1iIiBvcHRpb25zJworCWV4aXQgMQorZmkKKworZXhlYyA+IiR0YXJnZXQuJCQiCisKK2VjaG8gJyNkZWZpbmUgVU5QQUNLRURfVVNBR0UgIiIgXCcKKyIkbG9jL3VzYWdlIiB8IG9kIC12IC1iIFwKK3wgZ3JlcCAtdiAnXiAnIFwKK3wgJFNFRCAtZSAncy9eW14gXSovLycgXAorCS1lICdzLyAvL2cnIFwKKwktZSAnL14kL2QnIFwKKwktZSAncy9cKC4uLlwpL1xcXDEvZycgXAorCS1lICdzL14vIi8nIFwKKwktZSAncy8kLyIgXFwvJworZWNobyAnJworIyAiZ3JlcCAtdiAnXiAnIiBpcyBmb3IgdG95Ym94J3Mgb2QgYnVnOiBvZCAtYiBwcmludHMgc29tZSBleHRyYSBsaW5lczoKKyMwMDAwMDAwIDAxMCAwMDAgMDEwIDAwMCAxMzMgMDU1IDE0NCAxNDYgMTM1IDA0MCAxMzMgMDU1IDE0MyAwNDAgMTAzIDExNworIyAgICAgICAgIDAwMDAxMCAwMDAwMTAgMDI2NTMzIDA2MzE0NCAwMjAxMzUgMDI2NTMzIDAyMDE0MyAwNDc1MDMKKyMwMDAwMDIwIDExNiAxMDYgMTA0IDExMSAxMjIgMTM1IDA0MCAxMzMgMDU1IDE1NCAwNDAgMTE0IDExNyAxMDcgMTA2IDExMQorIyAgICAgICAgIDA0MzExNiAwNDQ1MDQgMDU2NTIyIDA1NTQ0MCAwNjYwNTUgMDQ2MDQwIDA0MzUxNyAwNDQ1MDYKKyMwMDAwMDQwIDExNCAxMDUgMTM1IDA0MCAxMzMgMDU1IDE0MSAwNDAgMTAxIDEwMyAxMjQgMTExIDExNyAxMTYgMTA2IDExMQorIyAgICAgICAgIDA0MjUxNCAwMjAxMzUgMDI2NTMzIDAyMDE0MSAwNDE1MDEgMDQ0NTI0IDA0NzExNyAwNDQ1MDYKKworZWNobyAnI2RlZmluZSBQQUNLRURfVVNBR0UgXCcKKyMjIEJyZWFrcyBvbiBiaWctZW5kaWFuIHN5c3RlbXMhCisjIyAjIEV4dHJhIGVmZm9ydCB0byBhdm9pZCB1c2luZyAib2QgLXQgeDEiOiAtdCBpcyBub3QgYXZhaWxhYmxlCisjIyAjIGluIG5vbi1DT05GSUdfREVTS1RPUGVkIGJ1c3lib3ggb2QKKyMjCisjIyAiJGxvYy91c2FnZSIgfCBiemlwMiAtMSB8IG9kIC12IC14IFwKKyMjIHwgJFNFRCAtZSAncy9eW14gXSovLycgXAorIyMJLWUgJ3MvIC8vZycgXAorIyMJLWUgJy9eJC9kJyBcCisjIwktZSAncy9cKC4uXClcKC4uXCkvMHhcMiwweFwxLC9nJworIyMJLWUgJ3MvJC8gXFwvJworIiRsb2MvdXNhZ2UiIHwgYnppcDIgLTEgfCAkREQgYnM9MiBza2lwPTEgMj4vZGV2L251bGwgfCBvZCAtdiAtYiBcCit8IGdyZXAgLXYgJ14gJyBcCit8ICRTRUQgLWUgJ3MvXlteIF0qLy8nIFwKKwktZSAncy8gLy9nJyBcCisJLWUgJy9eJC9kJyBcCisJLWUgJ3MvXCguLi5cKS8wXDEsL2cnIFwKKwktZSAncy8kLyBcXC8nCitlY2hvICcnCisKK212IC0tICIkdGFyZ2V0LiQkIiAiJHRhcmdldCIKZGlmZiAtLWdpdCBhL2FwcGxldHMvdXNhZ2VfcG9kLmMgYi9hcHBsZXRzL3VzYWdlX3BvZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMWM0YWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBsZXRzL3VzYWdlX3BvZC5jCkBAIC0wLDAgKzEsMTExIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRGVueXMgVmxhc2Vua28uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJhdXRvY29uZi5oIgorCisjZGVmaW5lIFNLSVBfYXBwbGV0X21haW4KKyNkZWZpbmUgQUxJR04xIC8qIG5vdGhpbmcsIGp1c3QgdG8gcGxhY2F0ZSBhcHBsZXRfdGFibGVzLmggKi8KKyNkZWZpbmUgQUxJR04yIC8qIG5vdGhpbmcsIGp1c3QgdG8gcGxhY2F0ZSBhcHBsZXRfdGFibGVzLmggKi8KKyNpbmNsdWRlICJhcHBsZXRfdGFibGVzLmgiCisKKy8qIFNpbmNlIHdlIGNhbid0IHVzZSBwbGF0Zm9ybS5oLCBoYXZlIHRvIGRvIHRoaXMgYWdhaW4gYnkgaGFuZDogKi8KKyNpZiBFTkFCTEVfTk9NTVUKKyMgZGVmaW5lIEJCX01NVSAwCisjIGRlZmluZSBVU0VfRk9SX05PTU1VKC4uLikgX19WQV9BUkdTX18KKyMgZGVmaW5lIFVTRV9GT1JfTU1VKC4uLikKKyNlbHNlCisjIGRlZmluZSBCQl9NTVUgMQorIyBkZWZpbmUgVVNFX0ZPUl9OT01NVSguLi4pCisjIGRlZmluZSBVU0VfRk9SX01NVSguLi4pIF9fVkFfQVJHU19fCisjZW5kaWYKKworI2luY2x1ZGUgInVzYWdlLmgiCisjZGVmaW5lIE1BS0VfVVNBR0UoYW5hbWUsIHVzYWdlKSB7IGFuYW1lLCB1c2FnZSB9LAorc3RhdGljIHN0cnVjdCB1c2FnZV9kYXRhIHsKKwljb25zdCBjaGFyICphbmFtZTsKKwljb25zdCBjaGFyICp1c2FnZTsKK30gdXNhZ2VfYXJyYXlbXSA9IHsKKyNpbmNsdWRlICJhcHBsZXRzLmgiCit9OworCitzdGF0aWMgaW50IGNvbXBhcmVfZnVuYyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCWNvbnN0IHN0cnVjdCB1c2FnZV9kYXRhICp1YSA9IGE7CisJY29uc3Qgc3RydWN0IHVzYWdlX2RhdGEgKnViID0gYjsKKwlyZXR1cm4gc3RyY21wKHVhLT5hbmFtZSwgdWItPmFuYW1lKTsKK30KKworaW50IG1haW4odm9pZCkKK3sKKwlpbnQgY29sLCBsZW4yOworCisJaW50IGk7CisJaW50IG51bV9tZXNzYWdlcyA9IHNpemVvZih1c2FnZV9hcnJheSkgLyBzaXplb2YodXNhZ2VfYXJyYXlbMF0pOworCisJaWYgKG51bV9tZXNzYWdlcyA9PSAwKQorCQlyZXR1cm4gMDsKKworCXFzb3J0KHVzYWdlX2FycmF5LAorCQludW1fbWVzc2FnZXMsIHNpemVvZih1c2FnZV9hcnJheVswXSksCisJCWNvbXBhcmVfZnVuYyk7CisKKwljb2wgPSAwOworCWZvciAoaSA9IDA7IGkgPCBudW1fbWVzc2FnZXM7IGkrKykgeworCQlsZW4yID0gc3RybGVuKHVzYWdlX2FycmF5W2ldLmFuYW1lKSArIDI7CisJCWlmIChjb2wgPj0gNzYgLSBsZW4yKSB7CisJCQlwcmludGYoIixcbiIpOworCQkJY29sID0gMDsKKwkJfQorCQlpZiAoY29sID09IDApIHsKKwkJCWNvbCA9IDY7CisJCQlwcmludGYoIlx0Iik7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIiwgIik7CisJCX0KKwkJcHJpbnRmKHVzYWdlX2FycmF5W2ldLmFuYW1lKTsKKwkJY29sICs9IGxlbjI7CisJfQorCXByaW50ZigiXG5cbiIpOworCisJcHJpbnRmKCI9aGVhZDEgQ09NTUFORCBERVNDUklQVElPTlNcblxuIik7CisJcHJpbnRmKCI9b3ZlciA0XG5cbiIpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9tZXNzYWdlczsgaSsrKSB7CisJCWlmICh1c2FnZV9hcnJheVtpXS5hbmFtZVswXSA+PSAnYScgJiYgdXNhZ2VfYXJyYXlbaV0uYW5hbWVbMF0gPD0gJ3onCisJCSAmJiB1c2FnZV9hcnJheVtpXS51c2FnZVswXSAhPSBOT1VTQUdFX1NUUlswXQorCQkpIHsKKwkJCXByaW50ZigiPWl0ZW0gQjwlcz5cblxuIiwgdXNhZ2VfYXJyYXlbaV0uYW5hbWUpOworCQkJaWYgKHVzYWdlX2FycmF5W2ldLnVzYWdlWzBdKQorCQkJCXByaW50ZigiJXMgJXNcblxuIiwgdXNhZ2VfYXJyYXlbaV0uYW5hbWUsIHVzYWdlX2FycmF5W2ldLnVzYWdlKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiVzXG5cbiIsIHVzYWdlX2FycmF5W2ldLmFuYW1lKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyogVE9ETzogd2UgdXNlZCB0byBtYWtlIG9wdGlvbnMgYm9sZCB3aXRoIEI8PiBhbmQgb3V0cHV0IGFuIGV4YW1wbGUgdG9vOgorCis9aXRlbSBCPGNhdD4KKworY2F0IFtCPC11Pl0gW0ZJTEVdLi4uCisKK0NvbmNhdGVuYXRlIEZJTEUocykgYW5kIHByaW50IHRoZW0gdG8gc3Rkb3V0CisKK09wdGlvbnM6CisgICAgICAgIC11ICAgICAgVXNlIHVuYnVmZmVyZWQgaS9vIChpZ25vcmVkKQorCitFeGFtcGxlOgorICAgICAgICAkIGNhdCAvcHJvYy91cHRpbWUKKyAgICAgICAgMTEwNzE2LjcyIDE3LjY3CisKKyovCmRpZmYgLS1naXQgYS9hcHBsZXRzX3NoL1JFQURNRSBiL2FwcGxldHNfc2gvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkY2QzOGEKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBsZXRzX3NoL1JFQURNRQpAQCAtMCwwICsxLDUgQEAKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIGV4YW1wbGVzIG9mIGFwcGxldHMgaW1wbGVtZW50ZWQgYXMgc2hlbGwgc2NyaXB0cy4KKworU28gZmFyIHRoZXNlIHNjcmlwdHMgYXJlIG5vdCBob29rZWQgdG8gdGhlIGJ1aWxkIHN5c3RlbSBhbmQgYXJlIG5vdAoraW5zdGFsbGVkIGJ5ICJtYWtlIGluc3RhbGwiLiBJZiB5b3Ugd2FudCB0byB1c2UgdGhlbSwKK3lvdSBuZWVkIHRvIGluc3RhbGwgdGhlbSBieSBoYW5kLgpkaWZmIC0tZ2l0IGEvYXBwbGV0c19zaC9kb3MydW5peCBiL2FwcGxldHNfc2gvZG9zMnVuaXgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGZkNTIwNgotLS0gL2Rldi9udWxsCisrKyBiL2FwcGxldHNfc2gvZG9zMnVuaXgKQEAgLTAsMCArMSw1IEBACisjIS9iaW4vc2gKKyMgVE9ETzogdXNlIGdldG9wdCB0byBhdm9pZCBwYXJzaW5nIG9wdGlvbnMgYXMgZmlsZW5hbWVzLAorIyBhbmQgdG8gc3VwcG9ydCAtLSBhbmQgLS1oZWxwCitbICQjIC1uZSAwIF0gJiYgREFTSF9JPS1pCitzZWQgJERBU0hfSSAtZSAncy9cciQvLycgIiRAIgpkaWZmIC0tZ2l0IGEvYXBwbGV0c19zaC9ub2xvZ2luIGIvYXBwbGV0c19zaC9ub2xvZ2luCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM3NjhlYWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBsZXRzX3NoL25vbG9naW4KQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKK2NhdCAvZXRjL25vbG9naW4udHh0IDI+L2Rldi9udWxsIHx8IGVjaG8gIlRoaXMgYWNjb3VudCBpcyBub3QgYXZhaWxhYmxlIgorc2xlZXAgNQorZXhpdCAxCmRpZmYgLS1naXQgYS9hcHBsZXRzX3NoL3RhYyBiL2FwcGxldHNfc2gvdGFjCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmM1YThlMzkKLS0tIC9kZXYvbnVsbAorKysgYi9hcHBsZXRzX3NoL3RhYwpAQCAtMCwwICsxLDcgQEAKKyMhL2Jpbi9zaAorIyBUT0RPOiB1c2UgZ2V0b3B0IHRvIGF2b2lkIHBhcnNpbmcgb3B0aW9ucyBhcyBmaWxlbmFtZXMsCisjIGFuZCB0byBzdXBwb3J0IC0tIGFuZCAtLWhlbHAKK2ZvciBpIGluICIkQCIKK2RvCitzZWQgLWUgJzEhRztoOyQhZCcgIiRpIgorZG9uZQpkaWZmIC0tZ2l0IGEvYXBwbGV0c19zaC91bml4MmRvcyBiL2FwcGxldHNfc2gvdW5peDJkb3MKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzBlMDQyOQotLS0gL2Rldi9udWxsCisrKyBiL2FwcGxldHNfc2gvdW5peDJkb3MKQEAgLTAsMCArMSw1IEBACisjIS9iaW4vc2gKKyMgVE9ETzogdXNlIGdldG9wdCB0byBhdm9pZCBwYXJzaW5nIG9wdGlvbnMgYXMgZmlsZW5hbWVzLAorIyBhbmQgdG8gc3VwcG9ydCAtLSBhbmQgLS1oZWxwCitbICQjIC1uZSAwIF0gJiYgREFTSF9JPS1pCitzZWQgJERBU0hfSSAtZSAncy8kL1xyLycgIiRAIgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L01ha2VmaWxlIGIvYXJjaC9pMzg2L01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2Yzk5YzYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYvTWFrZWZpbGUKQEAgLTAsMCArMSw3IEBACisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEJ1aWxkIHN5c3RlbQorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIgaXMgZXNzZW50aWFsIGluIHByZXZlbnRpbmcgZ2NjIDQuMi54CisjIGZyb20gYWxpZ25pbmcgc3RhY2sgdG8gMTYgYnl0ZXMuIChXaGljaCBpcyBnY2MncyB3YXkgb2Ygc3VwcG9ydGluZyBTU0UpLgorQ0ZMQUdTICs9ICQoY2FsbCBjYy1vcHRpb24sLW1hcmNoPWkzODYgLW1wcmVmZXJyZWQtc3RhY2stYm91bmRhcnk9MiwpCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9Db25maWcuc3JjIGIvYXJjaGl2YWwvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjYzNWJhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDQwIEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJBcmNoaXZhbCBVdGlsaXRpZXMiCisKK2NvbmZpZyBGRUFUVVJFX1NFQU1MRVNTX1haCisJYm9vbCAiTWFrZSB0YXIsIHJwbSwgbW9kcHJvYmUgZXRjIHVuZGVyc3RhbmQgLnh6IGRhdGEiCisJZGVmYXVsdCB5CisJaGVscAorCSAgTWFrZSB0YXIsIHJwbSwgbW9kcHJvYmUgZXRjIHVuZGVyc3RhbmQgLnh6IGRhdGEuCisKK2NvbmZpZyBGRUFUVVJFX1NFQU1MRVNTX0xaTUEKKwlib29sICJNYWtlIHRhciwgcnBtLCBtb2Rwcm9iZSBldGMgdW5kZXJzdGFuZCAubHptYSBkYXRhIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIE1ha2UgdGFyLCBycG0sIG1vZHByb2JlIGV0YyB1bmRlcnN0YW5kIC5sem1hIGRhdGEuCisKK2NvbmZpZyBGRUFUVVJFX1NFQU1MRVNTX0JaMgorCWJvb2wgIk1ha2UgdGFyLCBycG0sIG1vZHByb2JlIGV0YyB1bmRlcnN0YW5kIC5iejIgZGF0YSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBNYWtlIHRhciwgcnBtLCBtb2Rwcm9iZSBldGMgdW5kZXJzdGFuZCAuYnoyIGRhdGEuCisKK2NvbmZpZyBGRUFUVVJFX1NFQU1MRVNTX0daCisJYm9vbCAiTWFrZSB0YXIsIHJwbSwgbW9kcHJvYmUgZXRjIHVuZGVyc3RhbmQgLmd6IGRhdGEiCisJZGVmYXVsdCB5CisJaGVscAorCSAgTWFrZSB0YXIsIHJwbSwgbW9kcHJvYmUgZXRjIHVuZGVyc3RhbmQgLmd6IGRhdGEuCisKK2NvbmZpZyBGRUFUVVJFX1NFQU1MRVNTX1oKKwlib29sICJ0YXIsIHJwbSwgbW9kcHJvYmUgZXRjIHVuZGVyc3RhbmQgLlogZGF0YSIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBNYWtlIHRhciwgcnBtLCBtb2Rwcm9iZSBldGMgdW5kZXJzdGFuZCAuWiBkYXRhLgorCitJTlNFUlQKKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvS2J1aWxkLnNyYyBiL2FyY2hpdmFsL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmZDJlYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL0tidWlsZC5zcmMKQEAgLTAsMCArMSwxMSBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYnMteQkJCQkrPSBsaWJhcmNoaXZlLworCitsaWIteTo9CisKK0lOU0VSVApkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvYXIuYyBiL2FyY2hpdmFsL2FyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg2YzUyZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2FyLmMKQEAgLTAsMCArMSwzMDQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgYXIgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgYnkgR2xlbm4gTWNHcmF0aAorICoKKyAqIEJhc2VkIGluIHBhcnQgb24gQnVzeUJveCB0YXIsIERlYmlhbiBkcGtnLWRlYiBhbmQgR05VIGFyLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQXJjaGl2ZSBjcmVhdGlvbiBzdXBwb3J0OgorICogQ29weXJpZ2h0IChDKSAyMDEwIE5va2lhIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogV3JpdHRlbiBieSBBbGV4YW5kZXIgU2hpc2hraW4uCisgKgorICogVGhlcmUgaXMgbm8gc2luZ2xlIHN0YW5kYXJkIHRvIGFkaGVyZSB0byBzbyBhciBtYXkgbm90IHBvcnRhYmxlCisgKiBiZXR3ZWVuIGRpZmZlcmVudCBzeXN0ZW1zCisgKiBodHRwOi8vd3d3LnVuaXgtc3lzdGVtcy5vcmcvc2luZ2xlX3VuaXhfc3BlY2lmaWNhdGlvbl92Mi94Y3UvYXIuaHRtbAorICovCisKKy8vY29uZmlnOmNvbmZpZyBBUgorLy9jb25maWc6CWJvb2wgImFyIgorLy9jb25maWc6CWRlZmF1bHQgbiAgIyBuZWVkcyB0byBiZSBpbXByb3ZlZCB0byBiZSBhYmxlIHRvIHJlcGxhY2UgYmludXRpbHMgYXIKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBhciBpcyBhbiBhcmNoaXZhbCB1dGlsaXR5IHByb2dyYW0gdXNlZCB0byBjcmVhdGUsIG1vZGlmeSwgYW5kCisvL2NvbmZpZzoJICBleHRyYWN0IGNvbnRlbnRzIGZyb20gYXJjaGl2ZXMuIEFuIGFyY2hpdmUgaXMgYSBzaW5nbGUgZmlsZSBob2xkaW5nCisvL2NvbmZpZzoJICBhIGNvbGxlY3Rpb24gb2Ygb3RoZXIgZmlsZXMgaW4gYSBzdHJ1Y3R1cmUgdGhhdCBtYWtlcyBpdCBwb3NzaWJsZSB0bworLy9jb25maWc6CSAgcmV0cmlldmUgdGhlIG9yaWdpbmFsIGluZGl2aWR1YWwgZmlsZXMgKGNhbGxlZCBhcmNoaXZlIG1lbWJlcnMpLgorLy9jb25maWc6CSAgVGhlIG9yaWdpbmFsIGZpbGVzJyBjb250ZW50cywgbW9kZSAocGVybWlzc2lvbnMpLCB0aW1lc3RhbXAsIG93bmVyLAorLy9jb25maWc6CSAgYW5kIGdyb3VwIGFyZSBwcmVzZXJ2ZWQgaW4gdGhlIGFyY2hpdmUsIGFuZCBjYW4gYmUgcmVzdG9yZWQgb24KKy8vY29uZmlnOgkgIGV4dHJhY3Rpb24uCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIFRoZSBzdG9yZWQgZmlsZW5hbWUgaXMgbGltaXRlZCB0byAxNSBjaGFyYWN0ZXJzLiAoZm9yIG1vcmUgaW5mb3JtYXRpb24KKy8vY29uZmlnOgkgIHNlZSBsb25nIGZpbGVuYW1lIHN1cHBvcnQpLgorLy9jb25maWc6CSAgYXIgaGFzIDYwIGJ5dGVzIG9mIG92ZXJoZWFkcyBmb3IgZXZlcnkgc3RvcmVkIGZpbGUuCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgYXIgY2FuIGV4dHJhY3QgYXJjaGl2ZXMsIGl0IGNhbm5vdCBjcmVhdGUgb3IKKy8vY29uZmlnOgkgIG1vZGlmeSB0aGVtLgorLy9jb25maWc6CSAgT24gYW4geDg2IHN5c3RlbSwgdGhlIGFyIGFwcGxldCBhZGRzIGFib3V0IDFLLgorLy9jb25maWc6CisvL2NvbmZpZzoJICBVbmxlc3MgeW91IGhhdmUgYSBzcGVjaWZpYyBhcHBsaWNhdGlvbiB3aGljaCByZXF1aXJlcyBhciwgeW91IHNob3VsZAorLy9jb25maWc6CSAgcHJvYmFibHkgc2F5IE4gaGVyZS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfQVJfTE9OR19GSUxFTkFNRVMKKy8vY29uZmlnOglib29sICJTdXBwb3J0IGZvciBsb25nIGZpbGVuYW1lcyAobm90IG5lZWRlZCBmb3IgZGVicykiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBBUgorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEJ5IGRlZmF1bHQgdGhlIGFyIGZvcm1hdCBjYW4gb25seSBzdG9yZSB0aGUgZmlyc3QgMTUgY2hhcmFjdGVycworLy9jb25maWc6CSAgb2YgdGhlIGZpbGVuYW1lLCB0aGlzIG9wdGlvbiByZW1vdmVzIHRoYXQgbGltaXRhdGlvbi4KKy8vY29uZmlnOgkgIEl0IHN1cHBvcnRzIHRoZSBHTlUgYXIgbG9uZyBmaWxlbmFtZSBtZXRob2Qgd2hpY2ggbW92ZXMgbXVsdGlwbGUgbG9uZworLy9jb25maWc6CSAgZmlsZW5hbWVzIGludG8gYSB0aGUgZGF0YSBzZWN0aW9uIG9mIGEgbmV3IGFyIGVudHJ5LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9BUl9DUkVBVEUKKy8vY29uZmlnOglib29sICJTdXBwb3J0IGFyY2hpdmUgY3JlYXRpb24iCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBBUgorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRoaXMgZW5hYmxlcyBhcmNoaXZlIGNyZWF0aW9uICgtYyBhbmQgLXIpIHdpdGggYnVzeWJveCBhci4KKworLy9hcHBsZXQ6SUZfQVIoQVBQTEVUKGFyLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8va2J1aWxkOmxpYi0kKENPTkZJR19BUikgKz0gYXIubworCisvL3VzYWdlOiNkZWZpbmUgYXJfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstb10gWy12XSBbLXBdIFstdF0gWy14XSBBUkNISVZFIEZJTEVTIgorLy91c2FnZTojZGVmaW5lIGFyX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRXh0cmFjdCBvciBsaXN0IEZJTEVTIGZyb20gYW4gYXIgYXJjaGl2ZVxuIgorLy91c2FnZTogICAgICJcbgktbwlQcmVzZXJ2ZSBvcmlnaW5hbCBkYXRlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJRXh0cmFjdCB0byBzdGRvdXQiCisvL3VzYWdlOiAgICAgIlxuCS10CUxpc3QiCisvL3VzYWdlOiAgICAgIlxuCS14CUV4dHJhY3QiCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImJiX2FyY2hpdmUuaCIKKyNpbmNsdWRlICJhci5oIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfQVJfQ1JFQVRFCisvKiBmaWx0ZXIgb3V0IGVudHJpZXMgd2l0aCBzYW1lIG5hbWVzIGFzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lICovCitzdGF0aWMgY2hhciBGQVNUX0ZVTkMgZmlsdGVyX3JlcGxhY2VhYmxlKGFyY2hpdmVfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwlpZiAoZmluZF9saXN0X2VudHJ5KGhhbmRsZS0+YWNjZXB0LCBoYW5kbGUtPmZpbGVfaGVhZGVyLT5uYW1lKSkKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIG91dHB1dF9hcl9oZWFkZXIoYXJjaGl2ZV9oYW5kbGVfdCAqaGFuZGxlKQoreworCS8qIEdOVSBhciAyLjE5LjUxLjAuMTQgY3JlYXRlcyBtYWxmb3JtZWQgYXJjaGl2ZXMKKwkgKiBpZiBpbnB1dCBmaWxlcyBhcmUgPjEwRy4gSXQgYWxzbyB0cnVuY2F0ZXMgZmlsZXMgPjRHQgorCSAqICh1c2VzICJzaXplIG1vZCA0RyIpLiBXZSBhYm9ydCBpbiB0aGlzIGNhc2U6CisJICogV2UgY291bGQgYWRkIHN1cHBvcnQgZm9yIHVwIHRvIDEwRyBmaWxlcywgYnV0IHRoaXMgaXMgdW5saWtlbHkgdG8gYmUgdXNlZnVsLgorCSAqIE5vdGUgdGhhdCB1bnBhY2tpbmcgc2lkZSBsaW1pdHMgYWxsIGZpZWxkcyB0byAidW5zaWduZWQgaW50IiBkYXRhIHR5cGUsCisJICogYW5kIHRyZWF0cyAiYWxsIG9uZXMiIGFzIGFuIGVycm9yIGluZGljYXRvci4gVGh1cyBtYXggd2UgYWxsb3cgaGVyZSBpcyBVSU5UX01BWC0xLgorCSAqLworCWVudW0geworCQkvKiBmb3IgMm5kIGZpZWxkOiBtdGltZSAqLworCQlNQVgxMUNIQVJTID0gVUlOVF9NQVggPiAweGZmZmZmZmZmID8gKHVuc2lnbmVkKTk5OTk5OTk5OTk5IDogVUlOVF9NQVgtMSwKKwkJLyogZm9yIGxhc3QgZmllbGQ6IGZpbGVzaXplICovCisJCU1BWDEwQ0hBUlMgPSBVSU5UX01BWCA+IDB4ZmZmZmZmZmYgPyAodW5zaWduZWQpOTk5OTk5OTk5OSA6IFVJTlRfTUFYLTEsCisJfTsKKworCXN0cnVjdCBmaWxlX2hlYWRlcl90ICpmaCA9IGhhbmRsZS0+ZmlsZV9oZWFkZXI7CisKKwlpZiAoaGFuZGxlLT5vZmZzZXQgJiAxKSB7CisJCXh3cml0ZShoYW5kbGUtPnNyY19mZCwgIlxuIiwgMSk7CisJCWhhbmRsZS0+b2Zmc2V0Kys7CisJfQorCisJLyogQ2FyZWZ1bCEgVGhlIHdpZHRocyBzaG91bGQgYmUgZXhhY3QuIEZpZWxkcyBtdXN0IGJlIHNlcGFyYXRlZCAqLworCWlmIChzaXplb2Yob2ZmX3QpID4gNCAmJiBmaC0+c2l6ZSA+IChvZmZfdClNQVgxMENIQVJTKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCInJXMnIGlzIGJpZ2dlciB0aGFuIGFyIGNhbiBoYW5kbGUiLCBmaC0+bmFtZSk7CisJfQorCWZkcHJpbnRmKGhhbmRsZS0+c3JjX2ZkLCAiJS0xNi4xNnMlLTEybHUlLTZ1JS02dSUtOG8lLTEwIk9GRl9GTVQidWBcbiIsCisJCQlmaC0+bmFtZSwKKwkJCShzaXplb2YodGltZV90KSA+IDQgJiYgZmgtPm10aW1lID4gTUFYMTFDSEFSUykgPyAobG9uZykwIDogKGxvbmcpZmgtPm10aW1lLAorCQkJZmgtPnVpZCA+IDk5OTk5ID8gMCA6IChpbnQpZmgtPnVpZCwKKwkJCWZoLT5naWQgPiA5OTk5OSA/IDAgOiAoaW50KWZoLT5naWQsCisJCQkoaW50KWZoLT5tb2RlICYgMDc3Nzc3NzcsCisJCQlmaC0+c2l6ZQorCSk7CisKKwloYW5kbGUtPm9mZnNldCArPSBBUl9IRUFERVJfTEVOOworfQorCisvKgorICogd2hlbiByZXBsYWNpbmcgZmlsZXMgaW4gYW4gZXhpc3RpbmcgYXJjaGl2ZSwgY29weSBmcm9tIHRoZQorICogb3JpZ2luYWwgYXJjaGl2ZSB0aG9zZSBmaWxlcyB0aGF0IGFyZSB0byBiZSBsZWZ0IGludGFjdAorICovCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY29weV9kYXRhKGFyY2hpdmVfaGFuZGxlX3QgKmhhbmRsZSkKK3sKKwlhcmNoaXZlX2hhbmRsZV90ICpvdXRfaGFuZGxlID0gaGFuZGxlLT5hcl9fb3V0OworCXN0cnVjdCBmaWxlX2hlYWRlcl90ICpmaCA9IGhhbmRsZS0+ZmlsZV9oZWFkZXI7CisKKwlvdXRfaGFuZGxlLT5maWxlX2hlYWRlciA9IGZoOworCW91dHB1dF9hcl9oZWFkZXIob3V0X2hhbmRsZSk7CisKKwliYl9jb3B5ZmRfZXhhY3Rfc2l6ZShoYW5kbGUtPnNyY19mZCwgb3V0X2hhbmRsZS0+c3JjX2ZkLCBmaC0+c2l6ZSk7CisJb3V0X2hhbmRsZS0+b2Zmc2V0ICs9IGZoLT5zaXplOworfQorCitzdGF0aWMgaW50IHdyaXRlX2FyX2hlYWRlcihhcmNoaXZlX2hhbmRsZV90ICpoYW5kbGUpCit7CisJY2hhciAqZm47CisJY2hhciBmbl9oWzE3XTsgLyogMTUgKyAiLyIgKyBOVUwgKi8KKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpbnQgZmQ7CisKKwlmbiA9IGxsaXN0X3BvcCgmaGFuZGxlLT5hY2NlcHQpOworCWlmICghZm4pCisJCXJldHVybiAtMTsKKworCXhzdGF0KGZuLCAmc3QpOworCisJaGFuZGxlLT5maWxlX2hlYWRlci0+bXRpbWUgPSBzdC5zdF9tdGltZTsKKwloYW5kbGUtPmZpbGVfaGVhZGVyLT51aWQgPSBzdC5zdF91aWQ7CisJaGFuZGxlLT5maWxlX2hlYWRlci0+Z2lkID0gc3Quc3RfZ2lkOworCWhhbmRsZS0+ZmlsZV9oZWFkZXItPm1vZGUgPSBzdC5zdF9tb2RlOworCWhhbmRsZS0+ZmlsZV9oZWFkZXItPnNpemUgPSBzdC5zdF9zaXplOworCWhhbmRsZS0+ZmlsZV9oZWFkZXItPm5hbWUgPSBmbl9oOworLy9UT0RPOiBpZiBFTkFCTEVfRkVBVFVSRV9BUl9MT05HX0ZJTEVOQU1FUy4uLgorCXNwcmludGYoZm5faCwgIiUuMTVzLyIsIGJiX2Jhc2VuYW1lKGZuKSk7CisKKwlvdXRwdXRfYXJfaGVhZGVyKGhhbmRsZSk7CisKKwlmZCA9IHhvcGVuKGZuLCBPX1JET05MWSk7CisJYmJfY29weWZkX2V4YWN0X3NpemUoZmQsIGhhbmRsZS0+c3JjX2ZkLCBzdC5zdF9zaXplKTsKKwljbG9zZShmZCk7CisJaGFuZGxlLT5vZmZzZXQgKz0gc3Quc3Rfc2l6ZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHdyaXRlX2FyX2FyY2hpdmUoYXJjaGl2ZV9oYW5kbGVfdCAqaGFuZGxlKQoreworCXN0cnVjdCBzdGF0IHN0OworCWFyY2hpdmVfaGFuZGxlX3QgKm91dF9oYW5kbGU7CisKKwl4ZnN0YXQoaGFuZGxlLT5zcmNfZmQsICZzdCwgaGFuZGxlLT5hcl9fbmFtZSk7CisKKwkvKiBpZiBhcmNoaXZlIGV4aXN0cywgY3JlYXRlIGEgbmV3IGhhbmRsZSBmb3Igb3V0cHV0LgorCSAqIHdlIGNyZWF0ZSBpdCBpbiBwbGFjZSBvZiB0aGUgb2xkIG9uZS4KKwkgKi8KKwlpZiAoc3Quc3Rfc2l6ZSAhPSAwKSB7CisJCW91dF9oYW5kbGUgPSBpbml0X2hhbmRsZSgpOworCQl4dW5saW5rKGhhbmRsZS0+YXJfX25hbWUpOworCQlvdXRfaGFuZGxlLT5zcmNfZmQgPSB4b3BlbihoYW5kbGUtPmFyX19uYW1lLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DKTsKKwkJb3V0X2hhbmRsZS0+YWNjZXB0ID0gaGFuZGxlLT5hY2NlcHQ7CisJfSBlbHNlIHsKKwkJb3V0X2hhbmRsZSA9IGhhbmRsZTsKKwl9CisKKwloYW5kbGUtPmFyX19vdXQgPSBvdXRfaGFuZGxlOworCisJeHdyaXRlKG91dF9oYW5kbGUtPnNyY19mZCwgQVJfTUFHSUMgIlxuIiwgQVJfTUFHSUNfTEVOICsgMSk7CisJb3V0X2hhbmRsZS0+b2Zmc2V0ICs9IEFSX01BR0lDX0xFTiArIDE7CisKKwkvKiBza2lwIHRvIHRoZSBlbmQgb2YgdGhlIGFyY2hpdmUgaWYgd2UgaGF2ZSB0byBhcHBlbmQgc3R1ZmYgKi8KKwlpZiAoc3Quc3Rfc2l6ZSAhPSAwKSB7CisJCWhhbmRsZS0+ZmlsdGVyID0gZmlsdGVyX3JlcGxhY2VhYmxlOworCQloYW5kbGUtPmFjdGlvbl9kYXRhID0gY29weV9kYXRhOworCQl1bnBhY2tfYXJfYXJjaGl2ZShoYW5kbGUpOworCX0KKworCXdoaWxlICh3cml0ZV9hcl9oZWFkZXIob3V0X2hhbmRsZSkgPT0gMCkKKwkJY29udGludWU7CisKKwkvKiBvcHRpb25hbCwgc2luY2Ugd2UgZXhpdCByaWdodCBhZnRlciB3ZSByZXR1cm4gKi8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJY2xvc2UoaGFuZGxlLT5zcmNfZmQpOworCQlpZiAob3V0X2hhbmRsZS0+c3JjX2ZkICE9IGhhbmRsZS0+c3JjX2ZkKQorCQkJY2xvc2Uob3V0X2hhbmRsZS0+c3JjX2ZkKTsKKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorI2VuZGlmIC8qIEZFQVRVUkVfQVJfQ1JFQVRFICovCisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBoZWFkZXJfdmVyYm9zZV9saXN0X2FyKGNvbnN0IGZpbGVfaGVhZGVyX3QgKmZpbGVfaGVhZGVyKQoreworCWNvbnN0IGNoYXIgKm1vZGUgPSBiYl9tb2RlX3N0cmluZyhmaWxlX2hlYWRlci0+bW9kZSk7CisJY2hhciAqbXRpbWU7CisKKwltdGltZSA9IGN0aW1lKCZmaWxlX2hlYWRlci0+bXRpbWUpOworCW10aW1lWzE2XSA9ICcgJzsKKwltZW1tb3ZlKCZtdGltZVsxN10sICZtdGltZVsyMF0sIDQpOworCW10aW1lWzIxXSA9ICdcMCc7CisJcHJpbnRmKCIlcyAldS8ldSU3Ik9GRl9GTVQidSAlcyAlc1xuIiwgJm1vZGVbMV0sCisJCQkoaW50KWZpbGVfaGVhZGVyLT51aWQsIChpbnQpZmlsZV9oZWFkZXItPmdpZCwKKwkJCWZpbGVfaGVhZGVyLT5zaXplLAorCQkJJm10aW1lWzRdLCBmaWxlX2hlYWRlci0+bmFtZQorCSk7Cit9CisKKyNkZWZpbmUgQVJfT1BUX1ZFUkJPU0UgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgQVJfT1BUX1BSRVNFUlZFX0RBVEUgICAgKDEgPDwgMSkKKy8qICJhciByIiBpbXBsaWVzIGNyZWF0ZSwgYnV0IHdhcm5zIGFib3V0IGl0LiBjIHN1cHByZXNzZXMgd2FybmluZy4KKyAqIGJib3ggYWNjZXB0cyBidXQgaWdub3JlcyBpdDogKi8KKyNkZWZpbmUgQVJfT1BUX0NSRUFURSAgICAgICAgICAgKDEgPDwgMikKKworI2RlZmluZSBBUl9DTURfUFJJTlQgICAgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBGSVJTVF9DTUQgICAgICAgICAgICAgICBBUl9DTURfUFJJTlQKKyNkZWZpbmUgQVJfQ01EX0xJU1QgICAgICAgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgQVJfQ01EX0VYVFJBQ1QgICAgICAgICAgKDEgPDwgNSkKKyNkZWZpbmUgQVJfQ01EX0lOU0VSVCAgICAgICAgICAgKDEgPDwgNikKKworaW50IGFyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBhcl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGU7CisJdW5zaWduZWQgb3B0LCB0OworCisJYXJjaGl2ZV9oYW5kbGUgPSBpbml0X2hhbmRsZSgpOworCisJLyogLS06IHByZXBlbmQgJy0nIHRvIHRoZSBmaXJzdCBhcmd1bWVudCBpZiByZXF1aXJlZCAqLworCS8qIC0xOiBhdCBsZWFzdCBvbmUgcGFyYW0gaXMgcmVxZCAqLworCS8qIG9uZSBvZiBwLHQseFsscl0gaXMgcmVxdWlyZWQgKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICItLTotMTpwOnQ6eCJJRl9GRUFUVVJFX0FSX0NSRUFURSgiOnIiKTsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAidm9jIiJwdHgiSUZfRkVBVFVSRV9BUl9DUkVBVEUoInIiKSk7CisJYXJndiArPSBvcHRpbmQ7CisKKwl0ID0gb3B0IC8gRklSU1RfQ01EOworCWlmICh0ICYgKHQtMSkpIC8qIG1vcmUgdGhhbiBvbmUgb2YgcCx0LHhbLHJdIGFyZSBzcGVjaWZpZWQgKi8KKwkJYmJfc2hvd191c2FnZSgpOworCisJaWYgKG9wdCAmIEFSX0NNRF9QUklOVCkgeworCQlhcmNoaXZlX2hhbmRsZS0+YWN0aW9uX2RhdGEgPSBkYXRhX2V4dHJhY3RfdG9fc3Rkb3V0OworCX0KKwlpZiAob3B0ICYgQVJfQ01EX0xJU1QpIHsKKwkJYXJjaGl2ZV9oYW5kbGUtPmFjdGlvbl9oZWFkZXIgPSBoZWFkZXJfbGlzdDsKKwl9CisJaWYgKG9wdCAmIEFSX0NNRF9FWFRSQUNUKSB7CisJCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25fZGF0YSA9IGRhdGFfZXh0cmFjdF9hbGw7CisJfQorCWlmIChvcHQgJiBBUl9PUFRfUFJFU0VSVkVfREFURSkgeworCQlhcmNoaXZlX2hhbmRsZS0+YWhfZmxhZ3MgfD0gQVJDSElWRV9SRVNUT1JFX0RBVEU7CisJfQorCWlmIChvcHQgJiBBUl9PUFRfVkVSQk9TRSkgeworCQlhcmNoaXZlX2hhbmRsZS0+YWN0aW9uX2hlYWRlciA9IGhlYWRlcl92ZXJib3NlX2xpc3RfYXI7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0FSX0NSRUFURQorCWFyY2hpdmVfaGFuZGxlLT5hcl9fbmFtZSA9ICphcmd2OworI2VuZGlmCisJYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCA9IHhvcGVuKCphcmd2KyssCisJCQkob3B0ICYgQVJfQ01EX0lOU0VSVCkKKwkJCQk/IE9fUkRXUiB8IE9fQ1JFQVQKKwkJCQk6IE9fUkRPTkxZCisJKTsKKworCWlmICgqYXJndikKKwkJYXJjaGl2ZV9oYW5kbGUtPmZpbHRlciA9IGZpbHRlcl9hY2NlcHRfbGlzdDsKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJbGxpc3RfYWRkX3RvX2VuZCgmYXJjaGl2ZV9oYW5kbGUtPmFjY2VwdCwgKmFyZ3YrKyk7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfQVJfQ1JFQVRFCisJaWYgKG9wdCAmIEFSX0NNRF9JTlNFUlQpCisJCXJldHVybiB3cml0ZV9hcl9hcmNoaXZlKGFyY2hpdmVfaGFuZGxlKTsKKyNlbmRpZgorCisJdW5wYWNrX2FyX2FyY2hpdmUoYXJjaGl2ZV9oYW5kbGUpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2JidW56aXAuYyBiL2FyY2hpdmFsL2JidW56aXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGFhYzE0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvYmJ1bnppcC5jCkBAIC0wLDAgKzEsNTM4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb21tb24gY29kZSBmb3IgZ3VuemlwLWxpa2UgYXBwbGV0cworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImJiX2FyY2hpdmUuaCIKKworLyogbHpvcF9tYWluKCkgdXNlcyBiYnVucGFjaygpLCBuZWVkIHRoaXM6ICovCisvL2tidWlsZDpsaWItJChDT05GSUdfTFpPUCkgKz0gYmJ1bnppcC5vCisKKy8qIE5vdGU6IG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggYXJjaGl2YWwvbHpvcC5jICovCitlbnVtIHsKKwlPUFRfU1RET1VUICAgICA9IDEgPDwgMCwKKwlPUFRfRk9SQ0UgICAgICA9IDEgPDwgMSwKKwkvKiBvbmx5IHNvbWUgZGVjb21wcmVzc29yczogKi8KKwlPUFRfVkVSQk9TRSAgICA9IDEgPDwgMiwKKwlPUFRfUVVJRVQgICAgICA9IDEgPDwgMywKKwlPUFRfREVDT01QUkVTUyA9IDEgPDwgNCwKKwlPUFRfVEVTVCAgICAgICA9IDEgPDwgNSwKKwlTRUFNTEVTU19NQUdJQyA9ICgxIDw8IDMxKSAqIFNFQU1MRVNTX0NPTVBSRVNTSU9OLAorfTsKKworc3RhdGljCitpbnQgb3Blbl90b19vcl93YXJuKGludCB0b19mZCwgY29uc3QgY2hhciAqZmlsZW5hbWUsIGludCBmbGFncywgaW50IG1vZGUpCit7CisJaW50IGZkID0gb3BlbjNfb3Jfd2FybihmaWxlbmFtZSwgZmxhZ3MsIG1vZGUpOworCWlmIChmZCA8IDApIHsKKwkJcmV0dXJuIDE7CisJfQorCXhtb3ZlX2ZkKGZkLCB0b19mZCk7CisJcmV0dXJuIDA7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyBhcHBlbmRfZXh0KGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpleHBlY3RlZF9leHQpCit7CisJcmV0dXJuIHhhc3ByaW50ZigiJXMuJXMiLCBmaWxlbmFtZSwgZXhwZWN0ZWRfZXh0KTsKK30KKworaW50IEZBU1RfRlVOQyBiYnVucGFjayhjaGFyICoqYXJndiwKKwlJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IEZBU1RfRlVOQyAoKnVucGFja2VyKSh0cmFuc2Zvcm1lcl9zdGF0ZV90ICp4c3RhdGUpLAorCWNoYXIqIEZBU1RfRlVOQyAoKm1ha2VfbmV3X25hbWUpKGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpleHBlY3RlZF9leHQpLAorCWNvbnN0IGNoYXIgKmV4cGVjdGVkX2V4dAorKQoreworCXN0cnVjdCBzdGF0IHN0YXRfYnVmOworCUlGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgc3RhdHVzID0gMDsKKwljaGFyICpmaWxlbmFtZSwgKm5ld19uYW1lOworCXNtYWxsaW50IGV4aXRjb2RlID0gMDsKKwl0cmFuc2Zvcm1lcl9zdGF0ZV90IHhzdGF0ZTsKKworCWRvIHsKKwkJLyogTkI6IG5ld19uYW1lIGlzICptYXliZSogbWFsbG9jJ2VkISAqLworCQluZXdfbmFtZSA9IE5VTEw7CisJCWZpbGVuYW1lID0gKmFyZ3Y7IC8qIGNhbiBiZSBOVUxMIC0gJ3N0cmVhbWluZycgYnVuemlwMiAqLworCisJCWlmIChmaWxlbmFtZSAmJiBMT05FX0RBU0goZmlsZW5hbWUpKQorCQkJZmlsZW5hbWUgPSBOVUxMOworCisJCS8qIE9wZW4gc3JjICovCisJCWlmIChmaWxlbmFtZSkgeworCQkJaWYgKCEob3B0aW9uX21hc2szMiAmIFNFQU1MRVNTX01BR0lDKSkgeworCQkJCWlmIChzdGF0KGZpbGVuYW1lLCAmc3RhdF9idWYpICE9IDApIHsKKyBlcnJfbmFtZToKKwkJCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coZmlsZW5hbWUpOworIGVycjoKKwkJCQkJZXhpdGNvZGUgPSAxOworCQkJCQlnb3RvIGZyZWVfbmFtZTsKKwkJCQl9CisJCQkJaWYgKG9wZW5fdG9fb3Jfd2FybihTVERJTl9GSUxFTk8sIGZpbGVuYW1lLCBPX1JET05MWSwgMCkpCisJCQkJCWdvdG8gZXJyOworCQkJfSBlbHNlIHsKKwkJCQkvKiAiY2xldmVyIHpjYXQiIHdpdGggRklMRSAqLworCQkJCS8qIGZhaWxfaWZfbm90X2NvbXByZXNzZWQgYmVjYXVzZSB6Y2F0IHJlZnVzZXMgdW5jb21wcmVzc2VkIGlucHV0ICovCisJCQkJaW50IGZkID0gb3Blbl96aXBwZWQoZmlsZW5hbWUsIC8qZmFpbF9pZl9ub3RfY29tcHJlc3NlZDoqLyAxKTsKKwkJCQlpZiAoZmQgPCAwKQorCQkJCQlnb3RvIGVycl9uYW1lOworCQkJCXhtb3ZlX2ZkKGZkLCBTVERJTl9GSUxFTk8pOworCQkJfQorCQl9IGVsc2UKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBTRUFNTEVTU19NQUdJQykgeworCQkJLyogImNsZXZlciB6Y2F0IiBvbiBzdGRpbiAqLworCQkJaWYgKHNldHVwX3VuemlwX29uX2ZkKFNURElOX0ZJTEVOTywgLypmYWlsX2lmX25vdF9jb21wcmVzc2VkKi8gMSkpCisJCQkJZ290byBlcnI7CisJCX0KKworCQkvKiBTcGVjaWFsIGNhc2VzOiB0ZXN0LCBzdGRvdXQgKi8KKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiAoT1BUX1NURE9VVHxPUFRfVEVTVCkpIHsKKwkJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX1RFU1QpCisJCQkJaWYgKG9wZW5fdG9fb3Jfd2FybihTVERPVVRfRklMRU5PLCBiYl9kZXZfbnVsbCwgT19XUk9OTFksIDApKQorCQkJCQl4ZnVuY19kaWUoKTsKKwkJCWZpbGVuYW1lID0gTlVMTDsKKwkJfQorCisJCS8qIE9wZW4gZHN0IGlmIHdlIGFyZSBnb2luZyB0byB1bnBhY2sgdG8gZmlsZSAqLworCQlpZiAoZmlsZW5hbWUpIHsKKwkJCW5ld19uYW1lID0gbWFrZV9uZXdfbmFtZShmaWxlbmFtZSwgZXhwZWN0ZWRfZXh0KTsKKwkJCWlmICghbmV3X25hbWUpIHsKKwkJCQliYl9lcnJvcl9tc2coIiVzOiB1bmtub3duIHN1ZmZpeCAtIGlnbm9yZWQiLCBmaWxlbmFtZSk7CisJCQkJZ290byBlcnI7CisJCQl9CisKKwkJCS8qIC1mOiBvdmVyd3JpdGUgZXhpc3Rpbmcgb3V0cHV0IGZpbGVzICovCisJCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9GT1JDRSkgeworCQkJCXVubGluayhuZXdfbmFtZSk7CisJCQl9CisKKwkJCS8qIE9fRVhDTDogInJlYWwiIGJ1bnppcDIgZG9lc24ndCBvdmVyd3JpdGUgZmlsZXMgKi8KKwkJCS8qIEdOVSBndW56aXAgZG9lcyBub3QgYmFpbCBvdXQsIGJ1dCBnb2VzIHRvIG5leHQgZmlsZSAqLworCQkJaWYgKG9wZW5fdG9fb3Jfd2FybihTVERPVVRfRklMRU5PLCBuZXdfbmFtZSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMLAorCQkJCQlzdGF0X2J1Zi5zdF9tb2RlKSkKKwkJCQlnb3RvIGVycjsKKwkJfQorCisJCS8qIENoZWNrIHRoYXQgdGhlIGlucHV0IGlzIHNhbmUgKi8KKwkJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9GT1JDRSkgJiYgaXNhdHR5KFNURElOX0ZJTEVOTykpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjb21wcmVzc2VkIGRhdGEgbm90IHJlYWQgZnJvbSB0ZXJtaW5hbCwgIgorCQkJCQkidXNlIC1mIHRvIGZvcmNlIGl0Iik7CisJCX0KKworCQlpZiAoIShvcHRpb25fbWFzazMyICYgU0VBTUxFU1NfTUFHSUMpKSB7CisJCQlpbml0X3RyYW5zZm9ybWVyX3N0YXRlKCZ4c3RhdGUpOworCQkJeHN0YXRlLmNoZWNrX3NpZ25hdHVyZSA9IDE7CisJCQkvKnhzdGF0ZS5zcmNfZmQgPSBTVERJTl9GSUxFTk87IC0gYWxyZWFkeSBpcyAqLworCQkJeHN0YXRlLmRzdF9mZCA9IFNURE9VVF9GSUxFTk87CisJCQlzdGF0dXMgPSB1bnBhY2tlcigmeHN0YXRlKTsKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCWV4aXRjb2RlID0gMTsKKwkJfSBlbHNlIHsKKwkJCWlmIChiYl9jb3B5ZmRfZW9mKFNURElOX0ZJTEVOTywgU1RET1VUX0ZJTEVOTykgPCAwKQorCQkJCS8qIERpc2sgZnVsbCwgdHR5IGNsb3NlZCwgZXRjLiBObyBwb2ludCBpbiBjb250aW51aW5nICovCisJCQkJeGZ1bmNfZGllKCk7CisJCX0KKworCQlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX1NURE9VVCkpCisJCQl4Y2xvc2UoU1RET1VUX0ZJTEVOTyk7IC8qIHdpdGggZXJyb3IgY2hlY2shICovCisKKwkJaWYgKGZpbGVuYW1lKSB7CisJCQljaGFyICpkZWwgPSBuZXdfbmFtZTsKKworCQkJaWYgKHN0YXR1cyA+PSAwKSB7CisJCQkJdW5zaWduZWQgbmV3X25hbWVfbGVuOworCisJCQkJLyogVE9ETzogcmVzdG9yZSBvdGhlciB0aGluZ3M/ICovCisJCQkJaWYgKHhzdGF0ZS5tdGltZSAhPSAwKSB7CisJCQkJCXN0cnVjdCB0aW1ldmFsIHRpbWVzWzJdOworCisJCQkJCXRpbWVzWzFdLnR2X3NlYyA9IHRpbWVzWzBdLnR2X3NlYyA9IHhzdGF0ZS5tdGltZTsKKwkJCQkJdGltZXNbMV0udHZfdXNlYyA9IHRpbWVzWzBdLnR2X3VzZWMgPSAwOworCQkJCQkvKiBOb3RlOiB3ZSBjbG9zZWQgaXQgZmlyc3QuCisJCQkJCSAqIE9uIHNvbWUgc3lzdGVtcyBjYWxsaW5nIHV0aW1lcworCQkJCQkgKiB0aGVuIGNsb3NpbmcgcmVzZXRzIHRoZSBtdGltZQorCQkJCQkgKiBiYWNrIHRvIGN1cnJlbnQgdGltZS4gKi8KKwkJCQkJdXRpbWVzKG5ld19uYW1lLCB0aW1lcyk7IC8qIGlnbm9yaW5nIGVycm9ycyAqLworCQkJCX0KKworCQkJCWlmIChFTkFCTEVfREVTS1RPUCkKKwkJCQkJbmV3X25hbWVfbGVuID0gc3RybGVuKG5ld19uYW1lKTsKKwkJCQkvKiBSZXN0b3JlIHNvdXJjZSBmaWxlbmFtZSAodW5sZXNzIHRneiAtPiB0YXIgY2FzZSkgKi8KKwkJCQlpZiAobmV3X25hbWUgPT0gZmlsZW5hbWUpIHsKKwkJCQkJbmV3X25hbWVfbGVuID0gc3RybGVuKGZpbGVuYW1lKTsKKwkJCQkJZmlsZW5hbWVbbmV3X25hbWVfbGVuXSA9ICcuJzsKKwkJCQl9CisJCQkJLyogRXh0cmVtZSBibG9hdCBmb3IgZ3VuemlwIGNvbXBhdCAqLworCQkJCS8qIFNvbWUgdXNlcnMgZG8gd2FudCB0aGlzIGluZm8uLi4gKi8KKwkJCQlpZiAoRU5BQkxFX0RFU0tUT1AgJiYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfVkVSQk9TRSkpIHsKKwkJCQkJdW5zaWduZWQgcGVyY2VudCA9IHN0YXR1cworCQkJCQkJPyAoKHVvZmZfdClzdGF0X2J1Zi5zdF9zaXplICogMTAwdSAvICh1bnNpZ25lZCBsb25nIGxvbmcpc3RhdHVzKQorCQkJCQkJOiAwOworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAldSUlIC0gcmVwbGFjZWQgd2l0aCAlLipzXG4iLAorCQkJCQkJZmlsZW5hbWUsCisJCQkJCQkxMDB1IC0gcGVyY2VudCwKKwkJCQkJCW5ld19uYW1lX2xlbiwgbmV3X25hbWUKKwkJCQkJKTsKKwkJCQl9CisJCQkJLyogRGVsZXRlIF9zb3VyY2VfIGZpbGUgKi8KKwkJCQlkZWwgPSBmaWxlbmFtZTsKKwkJCX0KKwkJCXh1bmxpbmsoZGVsKTsKKyBmcmVlX25hbWU6CisJCQlpZiAobmV3X25hbWUgIT0gZmlsZW5hbWUpCisJCQkJZnJlZShuZXdfbmFtZSk7CisJCX0KKwl9IHdoaWxlICgqYXJndiAmJiAqKythcmd2KTsKKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX1NURE9VVCkKKwkJeGNsb3NlKFNURE9VVF9GSUxFTk8pOyAvKiB3aXRoIGVycm9yIGNoZWNrISAqLworCisJcmV0dXJuIGV4aXRjb2RlOworfQorCisjaWYgRU5BQkxFX1VOQ09NUFJFU1MgfHwgRU5BQkxFX0JVTlpJUDIgfHwgRU5BQkxFX1VOTFpNQSB8fCBFTkFCTEVfVU5YWgorc3RhdGljCitjaGFyKiBGQVNUX0ZVTkMgbWFrZV9uZXdfbmFtZV9nZW5lcmljKGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpleHBlY3RlZF9leHQpCit7CisJY2hhciAqZXh0ZW5zaW9uID0gc3RycmNocihmaWxlbmFtZSwgJy4nKTsKKwlpZiAoIWV4dGVuc2lvbiB8fCBzdHJjbXAoZXh0ZW5zaW9uICsgMSwgZXhwZWN0ZWRfZXh0KSAhPSAwKSB7CisJCS8qIE1pbWljIEdOVSBndW56aXAgLSAicmVhbCIgYnVuemlwMiB0cmllcyB0byAqLworCQkvKiB1bnBhY2sgZmlsZSBhbnl3YXksIHRvIGZpbGUub3V0ICovCisJCXJldHVybiBOVUxMOworCX0KKwkqZXh0ZW5zaW9uID0gJ1wwJzsKKwlyZXR1cm4gZmlsZW5hbWU7Cit9CisjZW5kaWYKKworCisvKgorICogVW5jb21wcmVzcyBhcHBsZXQgZm9yIGJ1c3lib3ggKGMpIDIwMDIgR2xlbm4gTWNHcmF0aAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKy8vdXNhZ2U6I2RlZmluZSB1bmNvbXByZXNzX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWNmXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgdW5jb21wcmVzc19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRlY29tcHJlc3MgLlogZmlsZVtzXVxuIgorLy91c2FnZTogICAgICJcbgktYwlXcml0ZSB0byBzdGRvdXQiCisvL3VzYWdlOiAgICAgIlxuCS1mCU92ZXJ3cml0ZSIKKworLy9jb25maWc6Y29uZmlnIFVOQ09NUFJFU1MKKy8vY29uZmlnOglib29sICJ1bmNvbXByZXNzIgorLy9jb25maWc6CWRlZmF1bHQgbgorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIHVuY29tcHJlc3MgaXMgdXNlZCB0byBkZWNvbXByZXNzIGFyY2hpdmVzIGNyZWF0ZWQgYnkgY29tcHJlc3MuCisvL2NvbmZpZzoJICBOb3QgbXVjaCB1c2VkIGFueW1vcmUsIHJlcGxhY2VkIGJ5IGd6aXAvZ3VuemlwLgorCisvL2FwcGxldDpJRl9VTkNPTVBSRVNTKEFQUExFVCh1bmNvbXByZXNzLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorLy9rYnVpbGQ6bGliLSQoQ09ORklHX1VOQ09NUFJFU1MpICs9IGJidW56aXAubworI2lmIEVOQUJMRV9VTkNPTVBSRVNTCitpbnQgdW5jb21wcmVzc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdW5jb21wcmVzc19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJZ2V0b3B0MzIoYXJndiwgImNmIik7CisJYXJndiArPSBvcHRpbmQ7CisKKwlyZXR1cm4gYmJ1bnBhY2soYXJndiwgdW5wYWNrX1pfc3RyZWFtLCBtYWtlX25ld19uYW1lX2dlbmVyaWMsICJaIik7Cit9CisjZW5kaWYKKworCisvKgorICogR3ppcCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIEJhc2VkIG9uIEdOVSBnemlwIHYxLjIuNCBDb3B5cmlnaHQgKEMpIDE5OTItMTk5MyBKZWFuLWxvdXAgR2FpbGx5LgorICoKKyAqIE9yaWdpbmFsbHkgYWRqdXN0ZWQgZm9yIGJ1c3lib3ggYnkgU3ZlbiBSdWRvbHBoIDxzcjFAaW5mLnR1LWRyZXNkZW4uZGU+CisgKiBiYXNlZCBvbiBnemlwIHNvdXJjZXMKKyAqCisgKiBBZGp1c3RlZCBmdXJ0aGVyIGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4gdG8gc3VwcG9ydCBmaWxlcyBhcworICogd2VsbCBhcyBzdGRpbi9zdGRvdXQsIGFuZCB0byBnZW5lcmFsbHkgYmVoYXZlIGl0c2VsZiB3cnQgY29tbWFuZCBsaW5lCisgKiBoYW5kbGluZy4KKyAqCisgKiBHZW5lcmFsIGNsZWFudXAgdG8gYmV0dGVyIGFkaGVyZSB0byB0aGUgc3R5bGUgZ3VpZGUgYW5kIG1ha2UgdXNlIG9mIHN0YW5kYXJkCisgKiBidXN5Ym94IGZ1bmN0aW9ucyBieSBHbGVubiBNY0dyYXRoCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBnemlwIChHTlUgemlwKSAtLSBjb21wcmVzcyBmaWxlcyB3aXRoIHppcCBhbGdvcml0aG0gYW5kICdjb21wcmVzcycgaW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5MyBKZWFuLWxvdXAgR2FpbGx5CisgKiBUaGUgdW56aXAgY29kZSB3YXMgd3JpdHRlbiBhbmQgcHV0IGluIHRoZSBwdWJsaWMgZG9tYWluIGJ5IE1hcmsgQWRsZXIuCisgKiBQb3J0aW9ucyBvZiB0aGUgbHp3IGNvZGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgcHVibGljIGRvbWFpbiAnY29tcHJlc3MnCisgKiB3cml0dGVuIGJ5IFNwZW5jZXIgVGhvbWFzLCBKb2UgT3Jvc3QsIEphbWVzIFdvb2RzLCBKaW0gTWNLaWUsIFN0ZXZlIERhdmllcywKKyAqIEtlbiBUdXJrb3dza2ksIERhdmUgTWFjayBhbmQgUGV0ZXIgSmFubmVzZW4uCisgKi8KKy8vdXNhZ2U6I2RlZmluZSBndW56aXBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstY2Z0XSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgZ3VuemlwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGVjb21wcmVzcyBGSUxFcyAob3Igc3RkaW4pXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCVdyaXRlIHRvIHN0ZG91dCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UiCisvL3VzYWdlOiAgICAgIlxuCS10CVRlc3QgZmlsZSBpbnRlZ3JpdHkiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGd1bnppcF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBscyAtbGEgL3RtcC9CdXN5Qm94KlxuIgorLy91c2FnZTogICAgICAgIi1ydy1ydy1yLS0gICAgMSBhbmRlcnNlbiBhbmRlcnNlbiAgIDU1NzAwOSBBcHIgMTEgMTA6NTUgL3RtcC9CdXN5Qm94LTAuNDMudGFyLmd6XG4iCisvL3VzYWdlOiAgICAgICAiJCBndW56aXAgL3RtcC9CdXN5Qm94LTAuNDMudGFyLmd6XG4iCisvL3VzYWdlOiAgICAgICAiJCBscyAtbGEgL3RtcC9CdXN5Qm94KlxuIgorLy91c2FnZTogICAgICAgIi1ydy1ydy1yLS0gICAgMSBhbmRlcnNlbiBhbmRlcnNlbiAgMTc2MTI4MCBBcHIgMTQgMTc6NDcgL3RtcC9CdXN5Qm94LTAuNDMudGFyXG4iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHpjYXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSB6Y2F0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGVjb21wcmVzcyB0byBzdGRvdXQiCisKKy8vY29uZmlnOmNvbmZpZyBHVU5aSVAKKy8vY29uZmlnOglib29sICJndW56aXAiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgZ3VuemlwIGlzIHVzZWQgdG8gZGVjb21wcmVzcyBhcmNoaXZlcyBjcmVhdGVkIGJ5IGd6aXAuCisvL2NvbmZpZzoJICBZb3UgY2FuIHVzZSB0aGUgYC10JyBvcHRpb24gdG8gdGVzdCB0aGUgaW50ZWdyaXR5IG9mCisvL2NvbmZpZzoJICBhbiBhcmNoaXZlLCB3aXRob3V0IGRlY29tcHJlc3NpbmcgaXQuCisKKy8vYXBwbGV0OklGX0dVTlpJUChBUFBMRVQoZ3VuemlwLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorLy9hcHBsZXQ6SUZfR1VOWklQKEFQUExFVF9PREROQU1FKHpjYXQsIGd1bnppcCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCB6Y2F0KSkKKy8va2J1aWxkOmxpYi0kKENPTkZJR19HWklQKSArPSBiYnVuemlwLm8KKy8va2J1aWxkOmxpYi0kKENPTkZJR19HVU5aSVApICs9IGJidW56aXAubworI2lmIEVOQUJMRV9HVU5aSVAKK3N0YXRpYworY2hhciogRkFTVF9GVU5DIG1ha2VfbmV3X25hbWVfZ3VuemlwKGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpleHBlY3RlZF9leHQgVU5VU0VEX1BBUkFNKQoreworCWNoYXIgKmV4dGVuc2lvbiA9IHN0cnJjaHIoZmlsZW5hbWUsICcuJyk7CisKKwlpZiAoIWV4dGVuc2lvbikKKwkJcmV0dXJuIE5VTEw7CisKKwlleHRlbnNpb24rKzsKKwlpZiAoc3RyY21wKGV4dGVuc2lvbiwgInRneiIgKyAxKSA9PSAwCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfWgorCSB8fCAoZXh0ZW5zaW9uWzBdID09ICdaJyAmJiBleHRlbnNpb25bMV0gPT0gJ1wwJykKKyNlbmRpZgorCSkgeworCQlleHRlbnNpb25bLTFdID0gJ1wwJzsKKwl9IGVsc2UgaWYgKHN0cmNtcChleHRlbnNpb24sICJ0Z3oiKSA9PSAwKSB7CisJCWZpbGVuYW1lID0geHN0cmR1cChmaWxlbmFtZSk7CisJCWV4dGVuc2lvbiA9IHN0cnJjaHIoZmlsZW5hbWUsICcuJyk7CisJCWV4dGVuc2lvblsyXSA9ICdhJzsKKwkJZXh0ZW5zaW9uWzNdID0gJ3InOworCX0gZWxzZSB7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gZmlsZW5hbWU7Cit9CisvKgorICogTGludXgga2VybmVsIGJ1aWxkIHVzZXMgZ3ppcCAtZCAtbi4gV2UgYWNjZXB0IGFuZCBpZ25vcmUgaXQuCisgKiBNYW4gcGFnZSBzYXlzOgorICogLW4gLS1uby1uYW1lCisgKiBnemlwOiBkbyBub3Qgc2F2ZSB0aGUgb3JpZ2luYWwgZmlsZSBuYW1lIGFuZCB0aW1lIHN0YW1wLgorICogKFRoZSBvcmlnaW5hbCBuYW1lIGlzIGFsd2F5cyBzYXZlZCBpZiB0aGUgbmFtZSBoYWQgdG8gYmUgdHJ1bmNhdGVkLikKKyAqIGd1bnppcDogZG8gbm90IHJlc3RvcmUgdGhlIG9yaWdpbmFsIGZpbGUgbmFtZS90aW1lIGV2ZW4gaWYgcHJlc2VudAorICogKHJlbW92ZSBvbmx5IHRoZSBnemlwIHN1ZmZpeCBmcm9tIHRoZSBjb21wcmVzc2VkIGZpbGUgbmFtZSkuCisgKiBUaGlzIG9wdGlvbiBpcyB0aGUgZGVmYXVsdCB3aGVuIGRlY29tcHJlc3NpbmcuCisgKiAtTiAtLW5hbWUKKyAqIGd6aXA6IGFsd2F5cyBzYXZlIHRoZSBvcmlnaW5hbCBmaWxlIG5hbWUgYW5kIHRpbWUgc3RhbXAgKHRoaXMgaXMgdGhlIGRlZmF1bHQpCisgKiBndW56aXA6IHJlc3RvcmUgdGhlIG9yaWdpbmFsIGZpbGUgbmFtZSBhbmQgdGltZSBzdGFtcCBpZiBwcmVzZW50LgorICovCitpbnQgZ3VuemlwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBndW56aXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWdldG9wdDMyKGFyZ3YsICJjZnZxZHRuIik7CisJYXJndiArPSBvcHRpbmQ7CisKKwkvKiBJZiBjYWxsZWQgYXMgemNhdC4uLgorCSAqIE5vcm1hbGx5LCAiemNhdCIgaXMganVzdCAiZ3VuemlwIC1jIi4KKwkgKiBCdXQgaWYgc2VhbWxlc3MgbWFnaWMgaXMgZW5hYmxlZCwgdGhlbiB3ZSBhcmUgbXVjaCBtb3JlIGNsZXZlci4KKwkgKi8KKwlpZiAoYXBwbGV0X25hbWVbMV0gPT0gJ2MnKQorCQlvcHRpb25fbWFzazMyIHw9IE9QVF9TVERPVVQgfCBTRUFNTEVTU19NQUdJQzsKKworCXJldHVybiBiYnVucGFjayhhcmd2LCB1bnBhY2tfZ3pfc3RyZWFtLCBtYWtlX25ld19uYW1lX2d1bnppcCwgLyp1bnVzZWQ6Ki8gTlVMTCk7Cit9CisjZW5kaWYKKworCisvKgorICogTW9kaWZpZWQgZm9yIGJ1c3lib3ggYnkgR2xlbm4gTWNHcmF0aAorICogQWRkZWQgc3VwcG9ydCBvdXRwdXQgdG8gc3Rkb3V0IGJ5IFRob21hcyBMdW5kcXVpc3QgPHRob21hc2V6QHplbG93Lm5vPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKy8vdXNhZ2U6I2RlZmluZSBidW56aXAyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWNmXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgYnVuemlwMl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRlY29tcHJlc3MgRklMRXMgKG9yIHN0ZGluKVxuIgorLy91c2FnZTogICAgICJcbgktYwlXcml0ZSB0byBzdGRvdXQiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIgorLy91c2FnZTojZGVmaW5lIGJ6Y2F0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgYnpjYXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEZWNvbXByZXNzIHRvIHN0ZG91dCIKKworLy9jb25maWc6Y29uZmlnIEJVTlpJUDIKKy8vY29uZmlnOglib29sICJidW56aXAyIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIGJ1bnppcDIgaXMgYSBjb21wcmVzc2lvbiB1dGlsaXR5IHVzaW5nIHRoZSBCdXJyb3dzLVdoZWVsZXIgYmxvY2sKKy8vY29uZmlnOgkgIHNvcnRpbmcgdGV4dCBjb21wcmVzc2lvbiBhbGdvcml0aG0sIGFuZCBIdWZmbWFuIGNvZGluZy4gQ29tcHJlc3Npb24KKy8vY29uZmlnOgkgIGlzIGdlbmVyYWxseSBjb25zaWRlcmFibHkgYmV0dGVyIHRoYW4gdGhhdCBhY2hpZXZlZCBieSBtb3JlCisvL2NvbmZpZzoJICBjb252ZW50aW9uYWwgTFo3Ny9MWjc4LWJhc2VkIGNvbXByZXNzb3JzLCBhbmQgYXBwcm9hY2hlcyB0aGUKKy8vY29uZmlnOgkgIHBlcmZvcm1hbmNlIG9mIHRoZSBQUE0gZmFtaWx5IG9mIHN0YXRpc3RpY2FsIGNvbXByZXNzb3JzLgorLy9jb25maWc6CisvL2NvbmZpZzoJICBVbmxlc3MgeW91IGhhdmUgYSBzcGVjaWZpYyBhcHBsaWNhdGlvbiB3aGljaCByZXF1aXJlcyBidW56aXAyLCB5b3UKKy8vY29uZmlnOgkgIHNob3VsZCBwcm9iYWJseSBzYXkgTiBoZXJlLgorCisvL2FwcGxldDpJRl9CVU5aSVAyKEFQUExFVChidW56aXAyLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8vYXBwbGV0OklGX0JVTlpJUDIoQVBQTEVUX09ERE5BTUUoYnpjYXQsIGJ1bnppcDIsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGJ6Y2F0KSkKKy8va2J1aWxkOmxpYi0kKENPTkZJR19CWklQMikgKz0gYmJ1bnppcC5vCisvL2tidWlsZDpsaWItJChDT05GSUdfQlVOWklQMikgKz0gYmJ1bnppcC5vCisjaWYgRU5BQkxFX0JVTlpJUDIKK2ludCBidW56aXAyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBidW56aXAyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlnZXRvcHQzMihhcmd2LCAiY2Z2cWR0Iik7CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKGFwcGxldF9uYW1lWzJdID09ICdjJykgLyogYnpjYXQgKi8KKwkJb3B0aW9uX21hc2szMiB8PSBPUFRfU1RET1VUOworCisJcmV0dXJuIGJidW5wYWNrKGFyZ3YsIHVucGFja19iejJfc3RyZWFtLCBtYWtlX25ld19uYW1lX2dlbmVyaWMsICJiejIiKTsKK30KKyNlbmRpZgorCisKKy8qCisgKiBTbWFsbCBsem1hIGRlZmxhdGUgaW1wbGVtZW50YXRpb24uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgIEF1cmVsaWVuIEphY29icyA8YXVyZWxAZ251YWdlLm9yZz4KKyAqCisgKiBCYXNlZCBvbiBidW56aXAuYyBmcm9tIGJ1c3lib3gKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisvL3VzYWdlOiNkZWZpbmUgdW5sem1hX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWNmXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgdW5sem1hX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGVjb21wcmVzcyBGSUxFIChvciBzdGRpbilcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJV3JpdGUgdG8gc3Rkb3V0IgorLy91c2FnZTogICAgICJcbgktZglGb3JjZSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbHptYV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiLWQgWy1jZl0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGx6bWFfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEZWNvbXByZXNzIEZJTEUgKG9yIHN0ZGluKVxuIgorLy91c2FnZTogICAgICJcbgktZAlEZWNvbXByZXNzIgorLy91c2FnZTogICAgICJcbgktYwlXcml0ZSB0byBzdGRvdXQiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBsemNhdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGx6Y2F0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGVjb21wcmVzcyB0byBzdGRvdXQiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHVueHpfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstY2ZdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSB1bnh6X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGVjb21wcmVzcyBGSUxFIChvciBzdGRpbilcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJV3JpdGUgdG8gc3Rkb3V0IgorLy91c2FnZTogICAgICJcbgktZglGb3JjZSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgeHpfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIi1kIFstY2ZdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSB4el9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRlY29tcHJlc3MgRklMRSAob3Igc3RkaW4pXG4iCisvL3VzYWdlOiAgICAgIlxuCS1kCURlY29tcHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCS1jCVdyaXRlIHRvIHN0ZG91dCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHh6Y2F0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgeHpjYXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEZWNvbXByZXNzIHRvIHN0ZG91dCIKKworLy9jb25maWc6Y29uZmlnIFVOTFpNQQorLy9jb25maWc6CWJvb2wgInVubHptYSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICB1bmx6bWEgaXMgYSBjb21wcmVzc2lvbiB1dGlsaXR5IHVzaW5nIHRoZSBMZW1wZWwtWml2LU1hcmtvdiBjaGFpbgorLy9jb25maWc6CSAgY29tcHJlc3Npb24gYWxnb3JpdGhtLCBhbmQgcmFuZ2UgY29kaW5nLiBDb21wcmVzc2lvbgorLy9jb25maWc6CSAgaXMgZ2VuZXJhbGx5IGNvbnNpZGVyYWJseSBiZXR0ZXIgdGhhbiB0aGF0IGFjaGlldmVkIGJ5IHRoZSBiemlwMgorLy9jb25maWc6CSAgY29tcHJlc3NvcnMuCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIFRoZSBCdXN5Qm94IHVubHptYSBhcHBsZXQgaXMgbGltaXRlZCB0byBkZWNvbXByZXNzaW9uIG9ubHkuCisvL2NvbmZpZzoJICBPbiBhbiB4ODYgc3lzdGVtLCB0aGlzIGFwcGxldCBhZGRzIGFib3V0IDRLLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9MWk1BX0ZBU1QKKy8vY29uZmlnOglib29sICJPcHRpbWl6ZSB1bmx6bWEgZm9yIHNwZWVkIgorLy9jb25maWc6CWRlZmF1bHQgbgorLy9jb25maWc6CWRlcGVuZHMgb24gVU5MWk1BCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVGhpcyBvcHRpb24gcmVkdWNlcyBkZWNvbXByZXNzaW9uIHRpbWUgYnkgYWJvdXQgMjUlIGF0IHRoZSBjb3N0IG9mCisvL2NvbmZpZzoJICBhIDFLIGJpZ2dlciBiaW5hcnkuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBMWk1BCisvL2NvbmZpZzoJYm9vbCAiUHJvdmlkZSBsem1hIGFsaWFzIHdoaWNoIHN1cHBvcnRzIG9ubHkgdW5wYWNraW5nIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVU5MWk1BCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IGNvbW1hbmRzIGxpa2UgImx6bWEgLWQiIHRvIHdvcmsuCisvL2NvbmZpZzoJICBJT1c6IHlvdSdsbCBnZXQgbHptYSBhcHBsZXQsIGJ1dCBpdCB3aWxsIGFsd2F5cyByZXF1aXJlIC1kIG9wdGlvbi4KKworLy9hcHBsZXQ6SUZfVU5MWk1BKEFQUExFVCh1bmx6bWEsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorLy9hcHBsZXQ6SUZfVU5MWk1BKEFQUExFVF9PREROQU1FKGx6Y2F0LCB1bmx6bWEsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGx6Y2F0KSkKKy8vYXBwbGV0OklGX0xaTUEoQVBQTEVUX09ERE5BTUUobHptYSwgdW5sem1hLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBsem1hKSkKKy8va2J1aWxkOmxpYi0kKENPTkZJR19VTkxaTUEpICs9IGJidW56aXAubworI2lmIEVOQUJMRV9VTkxaTUEKK2ludCB1bmx6bWFfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHVubHptYV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJSUZfTFpNQShpbnQgb3B0cyA9KSBnZXRvcHQzMihhcmd2LCAiY2Z2cWR0Iik7CisjIGlmIEVOQUJMRV9MWk1BCisJLyogbHptYSB3aXRob3V0IC1kIG9yIC10PyAqLworCWlmIChhcHBsZXRfbmFtZVsyXSA9PSAnbScgJiYgIShvcHRzICYgKE9QVF9ERUNPTVBSRVNTfE9QVF9URVNUKSkpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKyMgZW5kaWYKKwkvKiBsemNhdD8gKi8KKwlpZiAoYXBwbGV0X25hbWVbMl0gPT0gJ2MnKQorCQlvcHRpb25fbWFzazMyIHw9IE9QVF9TVERPVVQ7CisKKwlhcmd2ICs9IG9wdGluZDsKKwlyZXR1cm4gYmJ1bnBhY2soYXJndiwgdW5wYWNrX2x6bWFfc3RyZWFtLCBtYWtlX25ld19uYW1lX2dlbmVyaWMsICJsem1hIik7Cit9CisjZW5kaWYKKworCisvL2NvbmZpZzpjb25maWcgVU5YWgorLy9jb25maWc6CWJvb2wgInVueHoiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgdW54eiBpcyBhIHVubHptYSBzdWNjZXNzb3IuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBYWgorLy9jb25maWc6CWJvb2wgIlByb3ZpZGUgeHogYWxpYXMgd2hpY2ggc3VwcG9ydHMgb25seSB1bnBhY2tpbmciCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBVTlhaCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHRoaXMgb3B0aW9uIGlmIHlvdSB3YW50IGNvbW1hbmRzIGxpa2UgInh6IC1kIiB0byB3b3JrLgorLy9jb25maWc6CSAgSU9XOiB5b3UnbGwgZ2V0IHh6IGFwcGxldCwgYnV0IGl0IHdpbGwgYWx3YXlzIHJlcXVpcmUgLWQgb3B0aW9uLgorCisvL2FwcGxldDpJRl9VTlhaKEFQUExFVCh1bnh6LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8vYXBwbGV0OklGX1VOWFooQVBQTEVUX09ERE5BTUUoeHpjYXQsIHVueHosIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHh6Y2F0KSkKKy8vYXBwbGV0OklGX1haKEFQUExFVF9PREROQU1FKHh6LCB1bnh6LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCB4eikpCisvL2tidWlsZDpsaWItJChDT05GSUdfVU5YWikgKz0gYmJ1bnppcC5vCisjaWYgRU5BQkxFX1VOWFoKK2ludCB1bnh6X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB1bnh6X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlJRl9YWihpbnQgb3B0cyA9KSBnZXRvcHQzMihhcmd2LCAiY2Z2cWR0Iik7CisjIGlmIEVOQUJMRV9YWgorCS8qIHh6IHdpdGhvdXQgLWQgb3IgLXQ/ICovCisJaWYgKGFwcGxldF9uYW1lWzJdID09ICdcMCcgJiYgIShvcHRzICYgKE9QVF9ERUNPTVBSRVNTfE9QVF9URVNUKSkpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKyMgZW5kaWYKKwkvKiB4emNhdD8gKi8KKwlpZiAoYXBwbGV0X25hbWVbMl0gPT0gJ2MnKQorCQlvcHRpb25fbWFzazMyIHw9IE9QVF9TVERPVVQ7CisKKwlhcmd2ICs9IG9wdGluZDsKKwlyZXR1cm4gYmJ1bnBhY2soYXJndiwgdW5wYWNrX3h6X3N0cmVhbSwgbWFrZV9uZXdfbmFtZV9nZW5lcmljLCAieHoiKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvYmJ1bnppcF90ZXN0LnNoIGIvYXJjaGl2YWwvYmJ1bnppcF90ZXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ZTMxYmYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9iYnVuemlwX3Rlc3Quc2gKQEAgLTAsMCArMSw2MSBAQAorIyEvYmluL3NoCisjIFRlc3QgdGhhdCBjb25jYXRlbmF0ZWQgZ3ogZmlsZXMgYXJlIHVucGFja2luZyBjb3JyZWN0bHkuCisjIEl0IGFsc28gdGVzdHMgdGhhdCB1bnBhY2tpbmcgaW4gZ2VuZXJhbCBpcyB3b3JraW5nIHJpZ2h0LgorIyBTaW5jZSB6aXAgY29kZSBoYXMgbWFueSBjb3JuZXIgY2FzZXMsIHJ1biBpdCBmb3IgYSBmZXcgaG91cnMKKyMgdG8gZ2V0IGEgZGVjZW50IGNvdmVyYWdlICgyMDAwMDAgdGVzdHMgb3IgbW9yZSkuCisKK2d6aXA9Imd6aXAiCitndW56aXA9Ii4uL2J1c3lib3ggZ3VuemlwIgorIyBPciB0aGUgb3RoZXIgd2F5IGFyb3VuZDoKKyNnemlwPSIuLi9idXN5Ym94IGd6aXAiCisjZ3VuemlwPSJndW56aXAiCisKK2M9MAoraT0kUElECit3aGlsZSB0cnVlOyBkbworICAgIGM9JCgoYysxKSkKKworICAgICMgUkFORE9NIGlzIG5vdCB2ZXJ5IHJhbmRvbSBvbiBzb21lIHNoZWxscy4gU3BpY2UgaXQgdXAuCisgICAgIyAxMDAwMDMgaXMgcHJpbWUKKyAgICBsZW4xPSQoKCAoKChSQU5ET00qUkFORE9NKV5pKSAmIDB4N2ZmZmZmZikgJSAxMDAwMDMgKSkKKyAgICBpPSQoKGkgKiAxNjY0NTI1ICsgMTAxMzkwNDIyMykpCisgICAgbGVuMj0kKCggKCgoUkFORE9NKlJBTkRPTSleaSkgJiAweDdmZmZmZmYpICUgMTAwMDAzICkpCisKKyAgICAjIEp1c3QgdXNpbmcgdXJhbmRvbSB3aWxsIG1ha2UgZ3ppcCB1c2UgbWV0aG9kIDAgKHN0b3JlKSAtCisgICAgIyBub3QgZ29vZCBmb3IgdGVzdCBjb3ZlcmFnZSEKKyAgICBjYXQgL2Rldi91cmFuZG9tIHwgd2hpbGUgdHJ1ZTsgZG8gcmVhZCBqdW5rOyBlY2hvICJqdW5rICRjICRpICRqdW5rIjsgZG9uZSBcCisgICAgfCBkZCBicz0kbGVuMSBjb3VudD0xID56MSAyPi9kZXYvbnVsbAorICAgIGNhdCAvZGV2L3VyYW5kb20gfCB3aGlsZSB0cnVlOyBkbyByZWFkIGp1bms7IGVjaG8gImp1bmsgJGMgJGkgJGp1bmsiOyBkb25lIFwKKyAgICB8IGRkIGJzPSRsZW4yIGNvdW50PTEgPnoyIDI+L2Rldi9udWxsCisKKyAgICAkZ3ppcCA8ejEgPnp6Lmd6CisgICAgJGd6aXAgPHoyID4+enouZ3oKKyAgICAkZ3VuemlwIC1jIHp6Lmd6ID56OSB8fCB7CisJZWNobyAiRXhpdGNvZGUgJD8iCisJZXhpdAorICAgIH0KKyAgICBzdW09YGNhdCB6MSB6MiB8IG1kNXN1bWAKKyAgICBzdW05PWBtZDVzdW0gPHo5YAorICAgIHRlc3QgIiRzdW0iID09ICIkc3VtOSIgfHwgeworCWVjaG8gIm1kNXN1bXMgZG9uJ3QgbWF0Y2giCisJZXhpdAorICAgIH0KKyAgICBlY2hvICJUZXN0ICRjIG9rOiBsZW4xPSRsZW4xIGxlbjI9JGxlbjIgc3VtPSRzdW0iCisKKyAgICBzdW09YGNhdCB6MSB6MiB6MSB6MiB8IG1kNXN1bWAKKyAgICBybSB6MS5neiB6Mi5neiAyPi9kZXYvbnVsbAorICAgICRnemlwIHoxCisgICAgJGd6aXAgejIKKyAgICBjYXQgejEuZ3ogejIuZ3ogejEuZ3ogejIuZ3ogPnp6Lmd6CisgICAgJGd1bnppcCAtYyB6ei5neiA+ejkgfHwgeworCWVjaG8gIkV4aXRjb2RlICQ/ICgyKSIKKwlleGl0CisgICAgfQorICAgIHN1bTk9YG1kNXN1bSA8ejlgCisgICAgdGVzdCAiJHN1bSIgPT0gIiRzdW05IiB8fCB7CisJZWNobyAibWQ1c3VtcyBkb24ndCBtYXRjaCAoMSkiCisJZXhpdAorICAgIH0KKworICAgIGVjaG8gIlRlc3QgJGMgb2s6IGxlbjE9JGxlbjEgbGVuMj0kbGVuMiBzdW09JHN1bSAoMikiCitkb25lCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9iYnVuemlwX3Rlc3QyLnNoIGIvYXJjaGl2YWwvYmJ1bnppcF90ZXN0Mi5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjdlODNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvYmJ1bnppcF90ZXN0Mi5zaApAQCAtMCwwICsxLDEwIEBACisjIS9iaW4vc2gKKyMgTGVhayB0ZXN0IGZvciBndW56aXAuIFdhdGNoIHRvcCBmb3IgZ3Jvd2luZyBwcm9jZXNzIHNpemUuCisKKyMgSnVzdCB1c2luZyB1cmFuZG9tIHdpbGwgbWFrZSBnemlwIHVzZSBtZXRob2QgMCAoc3RvcmUpIC0KKyMgbm90IGdvb2QgZm9yIHRlc3QgY292ZXJhZ2UhCisKK2NhdCAvZGV2L3VyYW5kb20gXAorfCB3aGlsZSB0cnVlOyBkbyByZWFkIGp1bms7IGVjaG8gImp1bmsgJFJBTkRPTSAkanVuayI7IGRvbmUgXAorfCAuLi9idXN5Ym94IGd6aXAgXAorfCAuLi9idXN5Ym94IGd1bnppcCAtYyA+L2Rldi9udWxsCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9iYnVuemlwX3Rlc3QzLnNoIGIvYXJjaGl2YWwvYmJ1bnppcF90ZXN0My5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGM0YWZkCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvYmJ1bnppcF90ZXN0My5zaApAQCAtMCwwICsxLDIzIEBACisjIS9iaW4vc2gKKyMgTGVhayB0ZXN0IGZvciBndW56aXAuIFdhdGNoIHRvcCBmb3IgZ3Jvd2luZyBwcm9jZXNzIHNpemUuCisjIEluIHRoaXMgY2FzZSB3ZSBsb29rIGZvciBsZWFrcyBpbiAiY29uY2F0ZW5hdGVkIC5neiIgY29kZSAtCisjIHdlIGZlZWQgZ3VuemlwIHdpdGggYSBzdHJlYW0gb2YgLmd6IGZpbGVzLgorCitpPSRQSUQKK2M9MAord2hpbGUgdHJ1ZTsgZG8KKyAgICBjPSQoKGMgKyAxKSkKKyAgICBlY2hvICJCbG9jayMgJGMiID4mMgorICAgICMgUkFORE9NIGlzIG5vdCB2ZXJ5IHJhbmRvbSBvbiBzb21lIHNoZWxscy4gU3BpY2UgaXQgdXAuCisgICAgaT0kKChpICogMTY2NDUyNSArIDEwMTM5MDQyMjMpKQorICAgICMgMTAwMDAzIGlzIHByaW1lCisgICAgbGVuPSQoKCAoKChSQU5ET00qUkFORE9NKV5pKSAmIDB4N2ZmZmZmZikgJSAxMDAwMDMgKSkKKworICAgICMgSnVzdCB1c2luZyB1cmFuZG9tIHdpbGwgbWFrZSBnemlwIHVzZSBtZXRob2QgMCAoc3RvcmUpIC0KKyAgICAjIG5vdCBnb29kIGZvciB0ZXN0IGNvdmVyYWdlIQorICAgIGNhdCAvZGV2L3VyYW5kb20gXAorICAgIHwgd2hpbGUgdHJ1ZTsgZG8gcmVhZCBqdW5rOyBlY2hvICJqdW5rICRjICRpICRqdW5rIjsgZG9uZSBcCisgICAgfCBkZCBicz0kbGVuIGNvdW50PTEgMj4vZGV2L251bGwgXAorICAgIHwgZ3ppcCA+eHh4Lmd6CisgICAgY2F0IHh4eC5neiB4eHguZ3ogeHh4Lmd6IHh4eC5neiB4eHguZ3ogeHh4Lmd6IHh4eC5neiB4eHguZ3oKK2RvbmUgfCAuLi9idXN5Ym94IGd1bnppcCAtYyA+L2Rldi9udWxsCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9iemlwMi5jIGIvYXJjaGl2YWwvYnppcDIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2ZhMjlhCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvYnppcDIuYwpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorICoKKyAqIFRoaXMgZmlsZSB1c2VzIGJ6aXAyIGxpYnJhcnkgY29kZSB3aGljaCBpcyB3cml0dGVuCisgKiBieSBKdWxpYW4gU2V3YXJkIDxqc2V3YXJkQGJ6aXAub3JnPi4KKyAqIFNlZSBSRUFETUUgYW5kIExJQ0VOU0UgZmlsZXMgaW4gYnovIGRpcmVjdG9yeSBmb3IgbW9yZSBpbmZvcm1hdGlvbgorICogYWJvdXQgYnppcDIgbGlicmFyeSBjb2RlLgorICovCisKKy8vY29uZmlnOmNvbmZpZyBCWklQMgorLy9jb25maWc6CWJvb2wgImJ6aXAyIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIGJ6aXAyIGlzIGEgY29tcHJlc3Npb24gdXRpbGl0eSB1c2luZyB0aGUgQnVycm93cy1XaGVlbGVyIGJsb2NrCisvL2NvbmZpZzoJICBzb3J0aW5nIHRleHQgY29tcHJlc3Npb24gYWxnb3JpdGhtLCBhbmQgSHVmZm1hbiBjb2RpbmcuIENvbXByZXNzaW9uCisvL2NvbmZpZzoJICBpcyBnZW5lcmFsbHkgY29uc2lkZXJhYmx5IGJldHRlciB0aGFuIHRoYXQgYWNoaWV2ZWQgYnkgbW9yZQorLy9jb25maWc6CSAgY29udmVudGlvbmFsIExaNzcvTFo3OC1iYXNlZCBjb21wcmVzc29ycywgYW5kIGFwcHJvYWNoZXMgdGhlCisvL2NvbmZpZzoJICBwZXJmb3JtYW5jZSBvZiB0aGUgUFBNIGZhbWlseSBvZiBzdGF0aXN0aWNhbCBjb21wcmVzc29ycy4KKy8vY29uZmlnOgorLy9jb25maWc6CSAgVW5sZXNzIHlvdSBoYXZlIGEgc3BlY2lmaWMgYXBwbGljYXRpb24gd2hpY2ggcmVxdWlyZXMgYnppcDIsIHlvdQorLy9jb25maWc6CSAgc2hvdWxkIHByb2JhYmx5IHNheSBOIGhlcmUuCisKKy8vYXBwbGV0OklGX0JaSVAyKEFQUExFVChiemlwMiwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisvL2tidWlsZDpsaWItJChDT05GSUdfQlpJUDIpICs9IGJ6aXAyLm8KKworLy91c2FnZTojZGVmaW5lIGJ6aXAyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGJ6aXAyX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ29tcHJlc3MgRklMRXMgKG9yIHN0ZGluKSB3aXRoIGJ6aXAyIGFsZ29yaXRobVxuIgorLy91c2FnZTogICAgICJcbgktMS4uOQlDb21wcmVzc2lvbiBsZXZlbCIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJRGVjb21wcmVzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJV3JpdGUgdG8gc3Rkb3V0IgorLy91c2FnZTogICAgICJcbgktZglGb3JjZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYmJfYXJjaGl2ZS5oIgorCisjZGVmaW5lIENPTkZJR19CWklQMl9GQVNUIDEKKworLyogU3BlZWQgdGVzdDoKKyAqIENvbXBpbGVkIHdpdGggZ2NjIDQuMi4xLCBydW4gb24gQXRobG9uIDY0IDE4MDAgTUh6ICg1MTJLIEwyIGNhY2hlKS4KKyAqIFN0b2NrIGJ6aXAyIGlzIDI2LjQlIHNsb3dlciB0aGFuIGJib3ggYnppcDIgYXQgU1BFRUQgMQorICogKHRpbWUgdG8gY29tcHJlc3MgZ2NjLTQuMi4xLnRhciBpcyAxMjYuNCUgY29tcGFyZWQgdG8gYmJveCkuCisgKiBBdCBTUEVFRCA1IGRpZmZlcmVuY2UgaXMgMzIuNyUuCisgKgorICogVGVzdCBydW4gb2YgYWxsIENPTkZJR19CWklQMl9GQVNUIHZhbHVlcyBvbiBhIDExTWIgdGV4dCBmaWxlOgorICogICAgIFNpemUgICBUaW1lICgzIHJ1bnMpCisgKiAwOiAgMTA4MjggIDQuMTQ1IDQuMTQ2IDQuMTQ4CisgKiAxOiAgMTEwOTcgIDMuODQ1IDMuODYwIDMuODYxCisgKiAyOiAgMTEzOTIgIDMuNzYzIDMuNzY3IDMuNzY4CisgKiAzOiAgMTE4OTIgIDMuNzIyIDMuNzI0IDMuNzI3CisgKiA0OiAgMTI3NDAgIDMuNjM3IDMuNjQwIDMuNjQ0CisgKiA1OiAgMTcyNzMgIDMuNDk3IDMuNTA5IDMuNTA5CisgKi8KKworCisjZGVmaW5lIEJaX0RFQlVHIDAKKy8qIFRha2VzIH4zMDAgYnl0ZXMsIGRldGVjdHMgY29ycnVwdGlvbiBjYXVzZWQgYnkgYmFkIFJBTSBldGMgKi8KKyNkZWZpbmUgQlpfTElHSFRfREVCVUcgMAorCisjaW5jbHVkZSAibGliYXJjaGl2ZS9iei9iemxpYi5oIgorCisjaW5jbHVkZSAibGliYXJjaGl2ZS9iei9iemxpYl9wcml2YXRlLmgiCisKKyNpbmNsdWRlICJsaWJhcmNoaXZlL2J6L2Jsb2Nrc29ydC5jIgorI2luY2x1ZGUgImxpYmFyY2hpdmUvYnovYnpsaWIuYyIKKyNpbmNsdWRlICJsaWJhcmNoaXZlL2J6L2NvbXByZXNzLmMiCisjaW5jbHVkZSAibGliYXJjaGl2ZS9iei9odWZmbWFuLmMiCisKKy8qIE5vIHBvaW50IGluIGJlaW5nIHNoeSBhbmQgaGF2aW5nIHZlcnkgc21hbGwgYnVmZmVyIGhlcmUuCisgKiBiemlwMiBpbnRlcm5hbCBidWZmZXJzIGFyZSBtdWNoIGJpZ2dlciBhbnl3YXksIGh1bmRyZWRzIG9mIGtieXRlcy4KKyAqIElmIGlvYnVmIGlzIHNldmVyYWwgcGFnZXMgbG9uZywgbWFsbG9jKCkgbWF5IHVzZSBtbWFwLAorICogbWFraW5nIGlvYnVmIGlzIHBhZ2UgYWxpZ25lZCBhbmQgdGh1cyAobWF5YmUpIGhhdmUgb25lIG1lbWNweSBsZXNzCisgKiBpZiBrZXJuZWwgaXMgY2xldmVyIGVub3VnaC4KKyAqLworZW51bSB7CisJSU9CVUZfU0laRSA9IDggKiAxMDI0Cit9OworCitzdGF0aWMgdWludDhfdCBsZXZlbDsKKworLyogTkI6IGNvbXByZXNzU3RyZWFtKCkgaGFzIHRvIHJldHVybiAtMSBvbiBlcnJvcnMsIG5vdCBkaWUuCisgKiBiYnVucGFjaygpIHdpbGwgY29ycmVjdGx5IGNsZWFuIHVwIGluIHRoaXMgY2FzZQorICogKGRlbGV0ZSBpbmNvbXBsZXRlIC5iejIgZmlsZSkKKyAqLworCisvKiBSZXR1cm5zOgorICogLTEgb24gZXJyb3JzCisgKiB0b3RhbCB3cml0dGVuIGJ5dGVzIHNvIGZhciBvdGhlcndpc2UKKyAqLworc3RhdGljCitJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IGJ6X3dyaXRlKGJ6X3N0cmVhbSAqc3RybSwgdm9pZCogcmJ1Ziwgc3NpemVfdCBybGVuLCB2b2lkICp3YnVmKQoreworCWludCBuLCBuMiwgcmV0OworCisJc3RybS0+YXZhaWxfaW4gPSBybGVuOworCXN0cm0tPm5leHRfaW4gPSByYnVmOworCXdoaWxlICgxKSB7CisJCXN0cm0tPmF2YWlsX291dCA9IElPQlVGX1NJWkU7CisJCXN0cm0tPm5leHRfb3V0ID0gd2J1ZjsKKworCQlyZXQgPSBCWjJfYnpDb21wcmVzcyhzdHJtLCBybGVuID8gQlpfUlVOIDogQlpfRklOSVNIKTsKKwkJaWYgKHJldCAhPSBCWl9SVU5fT0sgLyogQlpfUlVObmluZyAqLworCQkgJiYgcmV0ICE9IEJaX0ZJTklTSF9PSyAvKiBCWl9GSU5JU0hpbmcsIGJ1dCBub3QgZG9uZSB5ZXQgKi8KKwkJICYmIHJldCAhPSBCWl9TVFJFQU1fRU5EIC8qIEJaX0ZJTklTSGVkICovCisJCSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludGVybmFsIGVycm9yICVkIiwgcmV0KTsKKwkJfQorCisJCW4gPSBJT0JVRl9TSVpFIC0gc3RybS0+YXZhaWxfb3V0OworCQlpZiAobikgeworCQkJbjIgPSBmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sIHdidWYsIG4pOworCQkJaWYgKG4yICE9IG4pIHsKKwkJCQlpZiAobjIgPj0gMCkKKwkJCQkJZXJybm8gPSAwOyAvKiBwcmV2ZW50IGJvZ3VzIGVycm9yIG1lc3NhZ2UgKi8KKwkJCQliYl9wZXJyb3JfbXNnKG4yID49IDAgPyAic2hvcnQgd3JpdGUiIDogYmJfbXNnX3dyaXRlX2Vycm9yKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKworCQlpZiAocmV0ID09IEJaX1NUUkVBTV9FTkQpCisJCQlicmVhazsKKwkJaWYgKHJsZW4gJiYgc3RybS0+YXZhaWxfaW4gPT0gMCkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gMCBJRl9ERVNLVE9QKCArIHN0cm0tPnRvdGFsX291dCApOworfQorCitzdGF0aWMKK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgRkFTVF9GVU5DIGNvbXByZXNzU3RyZWFtKHRyYW5zZm9ybWVyX3N0YXRlX3QgKnhzdGF0ZSBVTlVTRURfUEFSQU0pCit7CisJSUZfREVTS1RPUChsb25nIGxvbmcpIGludCB0b3RhbDsKKwlzc2l6ZV90IGNvdW50OworCWJ6X3N0cmVhbSBienM7IC8qIGl0J3Mgc21hbGwgKi8KKyNkZWZpbmUgc3RybSAoJmJ6cykKKwljaGFyICppb2J1ZjsKKyNkZWZpbmUgcmJ1ZiBpb2J1ZgorI2RlZmluZSB3YnVmIChpb2J1ZiArIElPQlVGX1NJWkUpCisKKwlpb2J1ZiA9IHhtYWxsb2MoMiAqIElPQlVGX1NJWkUpOworCUJaMl9iekNvbXByZXNzSW5pdChzdHJtLCBsZXZlbCk7CisKKwl3aGlsZSAoMSkgeworCQljb3VudCA9IGZ1bGxfcmVhZChTVERJTl9GSUxFTk8sIHJidWYsIElPQlVGX1NJWkUpOworCQlpZiAoY291bnQgPCAwKSB7CisJCQliYl9wZXJyb3JfbXNnKGJiX21zZ19yZWFkX2Vycm9yKTsKKwkJCXRvdGFsID0gLTE7CisJCQlicmVhazsKKwkJfQorCQkvKiBpZiBjb3VudCA9PSAwLCBiel93cml0ZSBmaW5hbGl6ZXMgY29tcHJlc3Npb24gKi8KKwkJdG90YWwgPSBiel93cml0ZShzdHJtLCByYnVmLCBjb3VudCwgd2J1Zik7CisJCWlmIChjb3VudCA9PSAwIHx8IHRvdGFsIDwgMCkKKwkJCWJyZWFrOworCX0KKworCS8qIENhbid0IGJlIGNvbmRpdGlvbmFsIG9uIEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQIC0KKwkgKiB3ZSBhcmUgY2FsbGVkIHJlcGVhdGVkbHkKKwkgKi8KKwlCWjJfYnpDb21wcmVzc0VuZChzdHJtKTsKKwlmcmVlKGlvYnVmKTsKKworCXJldHVybiB0b3RhbDsKK30KKworaW50IGJ6aXAyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBiemlwMl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0OworCisJLyogc3RhbmRhcmQgYnppcDIgZmxhZ3MKKwkgKiAtZCAtLWRlY29tcHJlc3MgZm9yY2UgZGVjb21wcmVzc2lvbgorCSAqIC16IC0tY29tcHJlc3MgZm9yY2UgY29tcHJlc3Npb24KKwkgKiAtayAtLWtlZXAgICAgIGtlZXAgKGRvbid0IGRlbGV0ZSkgaW5wdXQgZmlsZXMKKwkgKiAtZiAtLWZvcmNlICAgIG92ZXJ3cml0ZSBleGlzdGluZyBvdXRwdXQgZmlsZXMKKwkgKiAtdCAtLXRlc3QgICAgIHRlc3QgY29tcHJlc3NlZCBmaWxlIGludGVncml0eQorCSAqIC1jIC0tc3Rkb3V0ICAgb3V0cHV0IHRvIHN0YW5kYXJkIG91dAorCSAqIC1xIC0tcXVpZXQgICAgc3VwcHJlc3Mgbm9uY3JpdGljYWwgZXJyb3IgbWVzc2FnZXMKKwkgKiAtdiAtLXZlcmJvc2UgIGJlIHZlcmJvc2UgKGEgMm5kIC12IGdpdmVzIG1vcmUpCisJICogLXMgLS1zbWFsbCAgICB1c2UgbGVzcyBtZW1vcnkgKGF0IG1vc3QgMjUwMGspCisJICogLTEgLi4gLTkgICAgICBzZXQgYmxvY2sgc2l6ZSB0byAxMDBrIC4uIDkwMGsKKwkgKiAtLWZhc3QgICAgICAgIGFsaWFzIGZvciAtMQorCSAqIC0tYmVzdCAgICAgICAgYWxpYXMgZm9yIC05CisJICovCisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJzMiI7IC8qIC1zIG1lYW5zIC0yIChjb21wYXRpYmlsaXR5KSAqLworCS8qIE11c3QgbWF0Y2ggYmJ1bnppcCdzIGNvbnN0YW50cyBPUFRfU1RET1VULCBPUFRfRk9SQ0UhICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImNmdiIgSUZfQlVOWklQMigiZHQiKSAiMTIzNDU2Nzg5cXpzIik7CisjaWYgRU5BQkxFX0JVTlpJUDIgLyogYnVuemlwMl9tYWluIG1heSBub3QgYmUgdmlzaWJsZS4uLiAqLworCWlmIChvcHQgJiAweDE4KSAvLyAtZCBhbmQvb3IgLXQKKwkJcmV0dXJuIGJ1bnppcDJfbWFpbihhcmdjLCBhcmd2KTsKKwlvcHQgPj49IDU7CisjZWxzZQorCW9wdCA+Pj0gMzsKKyNlbmRpZgorCW9wdCA9ICh1aW50OF90KW9wdDsgLyogaXNvbGF0ZSBiaXRzIGZvciAtMS4uLTggKi8KKwlvcHQgfD0gMHgxMDA7IC8qIGlmIG5vdGhpbmcgZWxzZSwgYXNzdW1lIC05ICovCisJbGV2ZWwgPSAxOworCXdoaWxlICghKG9wdCAmIDEpKSB7CisJCWxldmVsKys7CisJCW9wdCA+Pj0gMTsKKwl9CisKKwlhcmd2ICs9IG9wdGluZDsKKwlvcHRpb25fbWFzazMyICY9IDB4NzsgLyogaWdub3JlIGFsbCBleGNlcHQgLWNmdiAqLworCXJldHVybiBiYnVucGFjayhhcmd2LCBjb21wcmVzc1N0cmVhbSwgYXBwZW5kX2V4dCwgImJ6MiIpOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvY3Bpby5jIGIvYXJjaGl2YWwvY3Bpby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkYzE2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9jcGlvLmMKQEAgLTAsMCArMSw0OTAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgY3BpbyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBieSBHbGVubiBNY0dyYXRoCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBMaW1pdGF0aW9uczoKKyAqIERvZXNuJ3QgY2hlY2sgQ1JDJ3MKKyAqIE9ubHkgc3VwcG9ydHMgbmV3IEFTQ0lJIGFuZCBDUkMgZm9ybWF0cworICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJiYl9hcmNoaXZlLmgiCisKKy8vY29uZmlnOmNvbmZpZyBDUElPCisvL2NvbmZpZzoJYm9vbCAiY3BpbyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBjcGlvIGlzIGFuIGFyY2hpdmFsIHV0aWxpdHkgcHJvZ3JhbSB1c2VkIHRvIGNyZWF0ZSwgbW9kaWZ5LCBhbmQKKy8vY29uZmlnOgkgIGV4dHJhY3QgY29udGVudHMgZnJvbSBhcmNoaXZlcy4KKy8vY29uZmlnOgkgIGNwaW8gaGFzIDExMCBieXRlcyBvZiBvdmVyaGVhZHMgZm9yIGV2ZXJ5IHN0b3JlZCBmaWxlLgorLy9jb25maWc6CisvL2NvbmZpZzoJICBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGNwaW8gY2FuIGV4dHJhY3QgY3BpbyBhcmNoaXZlcyBjcmVhdGVkIGluIHRoZQorLy9jb25maWc6CSAgIm5ld2MiIG9yICJjcmMiIGZvcm1hdCwgaXQgY2Fubm90IGNyZWF0ZSBvciBtb2RpZnkgdGhlbS4KKy8vY29uZmlnOgorLy9jb25maWc6CSAgVW5sZXNzIHlvdSBoYXZlIGEgc3BlY2lmaWMgYXBwbGljYXRpb24gd2hpY2ggcmVxdWlyZXMgY3BpbywgeW91CisvL2NvbmZpZzoJICBzaG91bGQgcHJvYmFibHkgc2F5IE4gaGVyZS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfQ1BJT19PCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCBmb3IgYXJjaGl2ZSBjcmVhdGlvbiIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIENQSU8KKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGNwaW8gY2FuIGNyZWF0ZSBjcGlvIGFyY2hpdmVzIGluIHRoZSAibmV3YyIKKy8vY29uZmlnOgkgIGZvcm1hdCBvbmx5LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9DUElPX1AKKy8vY29uZmlnOglib29sICJTdXBwb3J0IGZvciBwYXNzdGhyb3VnaCBtb2RlIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRkVBVFVSRV9DUElPX08KKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBQYXNzdGhyb3VnaCBtb2RlLiBSYXJlbHkgdXNlZC4KKworLy9hcHBsZXQ6SUZfQ1BJTyhBUFBMRVQoY3BpbywgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8va2J1aWxkOmxpYi0kKENPTkZJR19DUElPKSArPSBjcGlvLm8KKworLy91c2FnZTojZGVmaW5lIGNwaW9fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZG12dV0gWy1GIEZJTEVdIiBJRl9GRUFUVVJFX0NQSU9fTygiIFstSCBuZXdjXSIpCisvL3VzYWdlOiAgICAgICAiIFstdGkiSUZfRkVBVFVSRV9DUElPX08oIm8iKSJdIiBJRl9GRUFUVVJFX0NQSU9fUCgiIFstcCBESVJdIikKKy8vdXNhZ2U6ICAgICAgICIgW0VYVFJfRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgY3Bpb19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkV4dHJhY3Qgb3IgbGlzdCBmaWxlcyBmcm9tIGEgY3BpbyBhcmNoaXZlIgorLy91c2FnZToJSUZfRkVBVFVSRV9DUElPX08oIiwgb3IiCisvL3VzYWdlOiAgICAgIlxuY3JlYXRlIGFuIGFyY2hpdmUiIElGX0ZFQVRVUkVfQ1BJT19QKCIgKC1vKSBvciBjb3B5IGZpbGVzICgtcCkiKQorLy91c2FnZToJCSIgdXNpbmcgZmlsZSBsaXN0IG9uIHN0ZGluIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG5NYWluIG9wZXJhdGlvbiBtb2RlOiIKKy8vdXNhZ2U6ICAgICAiXG4JLXQJTGlzdCIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJRXh0cmFjdCBFWFRSX0ZJTEVzIChvciBhbGwpIgorLy91c2FnZToJSUZfRkVBVFVSRV9DUElPX08oCisvL3VzYWdlOiAgICAgIlxuCS1vCUNyZWF0ZSAocmVxdWlyZXMgLUggbmV3YykiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0NQSU9fUCgKKy8vdXNhZ2U6ICAgICAiXG4JLXAgRElSCUNvcHkgZmlsZXMgdG8gRElSIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbk9wdGlvbnM6IgorLy91c2FnZTogICAgICJcbgktZAlNYWtlIGxlYWRpbmcgZGlyZWN0b3JpZXMiCisvL3VzYWdlOiAgICAgIlxuCS1tCVByZXNlcnZlIG10aW1lIgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktdQlPdmVyd3JpdGUiCisvL3VzYWdlOiAgICAgIlxuCS1GIEZJTEUJSW5wdXQgKC10LC1pLC1wKSBvciBvdXRwdXQgKC1vKSBmaWxlIgorLy91c2FnZToJSUZfRkVBVFVSRV9DUElPX08oCisvL3VzYWdlOiAgICAgIlxuCS1IIG5ld2MJQXJjaGl2ZSBmb3JtYXQiCisvL3VzYWdlOgkpCisKKy8qIEdOVSBjcGlvIDIuOSAtLWhlbHAgKGFicmlkZ2VkKToKKworIE1vZGVzOgorICAtdCwgLS1saXN0ICAgICAgICAgICAgICAgICBMaXN0IHRoZSBhcmNoaXZlCisgIC1pLCAtLWV4dHJhY3QgICAgICAgICAgICAgIEV4dHJhY3QgZmlsZXMgZnJvbSBhbiBhcmNoaXZlCisgIC1vLCAtLWNyZWF0ZSAgICAgICAgICAgICAgIENyZWF0ZSB0aGUgYXJjaGl2ZQorICAtcCwgLS1wYXNzLXRocm91Z2ggICAgICAgICBDb3B5LXBhc3MgbW9kZQorCisgT3B0aW9ucyB2YWxpZCBpbiBhbnkgbW9kZToKKyAgICAgIC0tYmxvY2stc2l6ZT1TSVpFICAgICAgSS9PIGJsb2NrIHNpemUgPSBTSVpFICogNTEyIGJ5dGVzCisgIC1CICAgICAgICAgICAgICAgICAgICAgICAgIEkvTyBibG9jayBzaXplID0gNTEyMCBieXRlcworICAtYyAgICAgICAgICAgICAgICAgICAgICAgICBVc2UgdGhlIG9sZCBwb3J0YWJsZSAoQVNDSUkpIGFyY2hpdmUgZm9ybWF0CisgIC1DLCAtLWlvLXNpemU9TlVNQkVSICAgICAgIEkvTyBibG9jayBzaXplIGluIGJ5dGVzCisgIC1mLCAtLW5vbm1hdGNoaW5nICAgICAgICAgIE9ubHkgY29weSBmaWxlcyB0aGF0IGRvIG5vdCBtYXRjaCBnaXZlbiBwYXR0ZXJuCisgIC1GLCAtLWZpbGU9RklMRSAgICAgICAgICAgIFVzZSBGSUxFIGluc3RlYWQgb2Ygc3RhbmRhcmQgaW5wdXQgb3Igb3V0cHV0CisgIC1ILCAtLWZvcm1hdD1GT1JNQVQgICAgICAgIFVzZSBnaXZlbiBhcmNoaXZlIEZPUk1BVAorICAtTSwgLS1tZXNzYWdlPVNUUklORyAgICAgICBQcmludCBTVFJJTkcgd2hlbiB0aGUgZW5kIG9mIGEgdm9sdW1lIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrdXAgbWVkaWEgaXMgcmVhY2hlZAorICAtbiwgLS1udW1lcmljLXVpZC1naWQgICAgICBJZiAtdiwgc2hvdyBudW1lcmljIFVJRCBhbmQgR0lECisgICAgICAtLXF1aWV0ICAgICAgICAgICAgICAgIERvIG5vdCBwcmludCB0aGUgbnVtYmVyIG9mIGJsb2NrcyBjb3BpZWQKKyAgICAgIC0tcnNoLWNvbW1hbmQ9Q09NTUFORCAgVXNlIHJlbW90ZSBDT01NQU5EIGluc3RlYWQgb2YgcnNoCisgIC12LCAtLXZlcmJvc2UgICAgICAgICAgICAgIFZlcmJvc2VseSBsaXN0IHRoZSBmaWxlcyBwcm9jZXNzZWQKKyAgLVYsIC0tZG90ICAgICAgICAgICAgICAgICAgUHJpbnQgYSAiLiIgZm9yIGVhY2ggZmlsZSBwcm9jZXNzZWQKKyAgLVcsIC0td2FybmluZz1GTEFHICAgICAgICAgQ29udHJvbCB3YXJuaW5nIGRpc3BsYXk6ICdub25lJywndHJ1bmNhdGUnLCdhbGwnOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aXBsZSBvcHRpb25zIGFjY3VtdWxhdGUKKworIE9wdGlvbnMgdmFsaWQgb25seSBpbiAtLWV4dHJhY3QgbW9kZToKKyAgLWIsIC0tc3dhcCAgICAgICAgICAgICAgICAgU3dhcCBib3RoIGhhbGZ3b3JkcyBvZiB3b3JkcyBhbmQgYnl0ZXMgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFsZndvcmRzIGluIHRoZSBkYXRhIChlcXVpdmFsZW50IHRvIC1zUykKKyAgLXIsIC0tcmVuYW1lICAgICAgICAgICAgICAgSW50ZXJhY3RpdmVseSByZW5hbWUgZmlsZXMKKyAgLXMsIC0tc3dhcC1ieXRlcyAgICAgICAgICAgU3dhcCB0aGUgYnl0ZXMgb2YgZWFjaCBoYWxmd29yZCBpbiB0aGUgZmlsZXMKKyAgLVMsIC0tc3dhcC1oYWxmd29yZHMgICAgICAgU3dhcCB0aGUgaGFsZndvcmRzIG9mIGVhY2ggd29yZCAoNCBieXRlcykKKyAgICAgIC0tdG8tc3Rkb3V0ICAgICAgICAgICAgRXh0cmFjdCBmaWxlcyB0byBzdGFuZGFyZCBvdXRwdXQKKyAgLUUsIC0tcGF0dGVybi1maWxlPUZJTEUgICAgUmVhZCBhZGRpdGlvbmFsIHBhdHRlcm5zIHNwZWNpZnlpbmcgZmlsZW5hbWVzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3Qgb3IgbGlzdCBmcm9tIEZJTEUKKyAgICAgIC0tb25seS12ZXJpZnktY3JjICAgICAgVmVyaWZ5IENSQydzLCBkb24ndCBhY3R1YWxseSBleHRyYWN0IHRoZSBmaWxlcworCisgT3B0aW9ucyB2YWxpZCBvbmx5IGluIC0tY3JlYXRlIG1vZGU6CisgIC1BLCAtLWFwcGVuZCAgICAgICAgICAgICAgIEFwcGVuZCB0byBhbiBleGlzdGluZyBhcmNoaXZlCisgIC1PIEZJTEUgICAgICAgICAgICAgICAgICAgIEZpbGUgdG8gdXNlIGluc3RlYWQgb2Ygc3RhbmRhcmQgb3V0cHV0CisKKyBPcHRpb25zIHZhbGlkIG9ubHkgaW4gLS1wYXNzLXRocm91Z2ggbW9kZToKKyAgLWwsIC0tbGluayAgICAgICAgICAgICAgICAgTGluayBmaWxlcyBpbnN0ZWFkIG9mIGNvcHlpbmcgdGhlbSwgd2hlbiBwb3NzaWJsZQorCisgT3B0aW9ucyB2YWxpZCBpbiAtLWV4dHJhY3QgYW5kIC0tY3JlYXRlIG1vZGVzOgorICAgICAgLS1hYnNvbHV0ZS1maWxlbmFtZXMgICBEbyBub3Qgc3RyaXAgZmlsZSBzeXN0ZW0gcHJlZml4IGNvbXBvbmVudHMgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSBuYW1lcworICAgICAgLS1uby1hYnNvbHV0ZS1maWxlbmFtZXMgQ3JlYXRlIGFsbCBmaWxlcyByZWxhdGl2ZSB0byB0aGUgY3VycmVudCBkaXIKKworIE9wdGlvbnMgdmFsaWQgaW4gLS1jcmVhdGUgYW5kIC0tcGFzcy10aHJvdWdoIG1vZGVzOgorICAtMCwgLS1udWxsICAgICAgICAgICAgICAgICBBIGxpc3Qgb2YgZmlsZW5hbWVzIGlzIHRlcm1pbmF0ZWQgYnkgYSBOVUwKKyAgLWEsIC0tcmVzZXQtYWNjZXNzLXRpbWUgICAgUmVzZXQgdGhlIGFjY2VzcyB0aW1lcyBvZiBmaWxlcyBhZnRlciByZWFkaW5nIHRoZW0KKyAgLUkgRklMRSAgICAgICAgICAgICAgICAgICAgRmlsZSB0byB1c2UgaW5zdGVhZCBvZiBzdGFuZGFyZCBpbnB1dAorICAtTCwgLS1kZXJlZmVyZW5jZSAgICAgICAgICBEZXJlZmVyZW5jZSBzeW1ib2xpYyBsaW5rcyAoY29weSB0aGUgZmlsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB0aGV5IHBvaW50IHRvIGluc3RlYWQgb2YgY29weWluZyB0aGUgbGlua3MpCisgIC1SLCAtLW93bmVyPVtVU0VSXVs6Ll1bR1JPVVBdIFNldCBvd25lciBvZiBjcmVhdGVkIGZpbGVzCisKKyBPcHRpb25zIHZhbGlkIGluIC0tZXh0cmFjdCBhbmQgLS1wYXNzLXRocm91Z2ggbW9kZXM6CisgIC1kLCAtLW1ha2UtZGlyZWN0b3JpZXMgICAgIENyZWF0ZSBsZWFkaW5nIGRpcmVjdG9yaWVzIHdoZXJlIG5lZWRlZAorICAtbSwgLS1wcmVzZXJ2ZS1tb2RpZmljYXRpb24tdGltZSAgUmV0YWluIG10aW1lIHdoZW4gY3JlYXRpbmcgZmlsZXMKKyAgICAgIC0tbm8tcHJlc2VydmUtb3duZXIgICAgRG8gbm90IGNoYW5nZSB0aGUgb3duZXJzaGlwIG9mIHRoZSBmaWxlcworICAgICAgLS1zcGFyc2UgICAgICAgICAgICAgICBXcml0ZSBmaWxlcyB3aXRoIGJsb2NrcyBvZiB6ZXJvcyBhcyBzcGFyc2UgZmlsZXMKKyAgLXUsIC0tdW5jb25kaXRpb25hbCAgICAgICAgUmVwbGFjZSBhbGwgZmlsZXMgdW5jb25kaXRpb25hbGx5CisgKi8KKworZW51bSB7CisJT1BUX0VYVFJBQ1QgICAgICAgICAgICA9ICgxIDw8IDApLAorCU9QVF9URVNUICAgICAgICAgICAgICAgPSAoMSA8PCAxKSwKKwlPUFRfTlVMX1RFUk1JTkFURUQgICAgID0gKDEgPDwgMiksCisJT1BUX1VOQ09ORElUSU9OQUwgICAgICA9ICgxIDw8IDMpLAorCU9QVF9WRVJCT1NFICAgICAgICAgICAgPSAoMSA8PCA0KSwKKwlPUFRfQ1JFQVRFX0xFQURJTkdfRElSID0gKDEgPDwgNSksCisJT1BUX1BSRVNFUlZFX01USU1FICAgICA9ICgxIDw8IDYpLAorCU9QVF9ERVJFRiAgICAgICAgICAgICAgPSAoMSA8PCA3KSwKKwlPUFRfRklMRSAgICAgICAgICAgICAgID0gKDEgPDwgOCksCisJT1BUQklUX0ZJTEUgPSA4LAorCUlGX0ZFQVRVUkVfQ1BJT19PKE9QVEJJVF9DUkVBVEUgICAgICwpCisJSUZfRkVBVFVSRV9DUElPX08oT1BUQklUX0ZPUk1BVCAgICAgLCkKKwlJRl9GRUFUVVJFX0NQSU9fUChPUFRCSVRfUEFTU1RIUk9VR0gsKQorCUlGX0xPTkdfT1BUUyggICAgIE9QVEJJVF9RVUlFVCAgICAgICwpCisJSUZfTE9OR19PUFRTKCAgICAgT1BUQklUXzJTVERPVVQgICAgLCkKKwlPUFRfQ1JFQVRFICAgICAgICAgICAgID0gSUZfRkVBVFVSRV9DUElPX08oKDEgPDwgT1BUQklUX0NSRUFURSAgICAgKSkgKyAwLAorCU9QVF9GT1JNQVQgICAgICAgICAgICAgPSBJRl9GRUFUVVJFX0NQSU9fTygoMSA8PCBPUFRCSVRfRk9STUFUICAgICApKSArIDAsCisJT1BUX1BBU1NUSFJPVUdIICAgICAgICA9IElGX0ZFQVRVUkVfQ1BJT19QKCgxIDw8IE9QVEJJVF9QQVNTVEhST1VHSCkpICsgMCwKKwlPUFRfUVVJRVQgICAgICAgICAgICAgID0gSUZfTE9OR19PUFRTKCAgICAgKDEgPDwgT1BUQklUX1FVSUVUICAgICAgKSkgKyAwLAorCU9QVF8yU1RET1VUICAgICAgICAgICAgPSBJRl9MT05HX09QVFMoICAgICAoMSA8PCBPUFRCSVRfMlNURE9VVCAgICApKSArIDAsCit9OworCisjZGVmaW5lIE9QVElPTl9TVFIgIml0MHV2ZG1MRjoiCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9DUElPX08KK3N0YXRpYyBvZmZfdCBjcGlvX3BhZDQob2ZmX3Qgc2l6ZSkKK3sKKwlpbnQgaTsKKworCWkgPSAoLSBzaXplKSAmIDM7CisJc2l6ZSArPSBpOworCXdoaWxlICgtLWkgPj0gMCkKKwkJYmJfcHV0Y2hhcignXDAnKTsKKwlyZXR1cm4gc2l6ZTsKK30KKworLyogUmV0dXJuIHZhbHVlIHdpbGwgYmVjb21lIGV4aXQgY29kZS4KKyAqIEl0J3Mgb2sgdG8gZXhpdCBpbnN0ZWFkIG9mIHJldHVybi4gKi8KK3N0YXRpYyBOT0lOTElORSBpbnQgY3Bpb19vKHZvaWQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgdHJhaWxlcltdIEFMSUdOMSA9ICJUUkFJTEVSISEhIjsKKwlzdHJ1Y3QgbmFtZV9zIHsKKwkJc3RydWN0IG5hbWVfcyAqbmV4dDsKKwkJY2hhciBuYW1lWzFdOworCX07CisJc3RydWN0IGlub2Rlc19zIHsKKwkJc3RydWN0IGlub2Rlc19zICpuZXh0OworCQlzdHJ1Y3QgbmFtZV9zICpuYW1lczsKKwkJc3RydWN0IHN0YXQgc3Q7CisJfTsKKworCXN0cnVjdCBpbm9kZXNfcyAqbGlua3MgPSBOVUxMOworCW9mZl90IGJ5dGVzID0gMDsgLyogb3V0cHV0IGJ5dGVzIGNvdW50ICovCisKKwl3aGlsZSAoMSkgeworCQljb25zdCBjaGFyICpuYW1lOworCQljaGFyICpsaW5lOworCQlzdHJ1Y3Qgc3RhdCBzdDsKKworCQlsaW5lID0gKG9wdGlvbl9tYXNrMzIgJiBPUFRfTlVMX1RFUk1JTkFURUQpCisJCQkJPyBiYl9nZXRfY2h1bmtfZnJvbV9maWxlKHN0ZGluLCBOVUxMKQorCQkJCTogeG1hbGxvY19mZ2V0bGluZShzdGRpbik7CisKKwkJaWYgKGxpbmUpIHsKKwkJCS8qIFN0cmlwIGxlYWRpbmcgIi4vWy4vXS4uLiIgZnJvbSB0aGUgZmlsZW5hbWUgKi8KKwkJCW5hbWUgPSBsaW5lOworCQkJd2hpbGUgKG5hbWVbMF0gPT0gJy4nICYmIG5hbWVbMV0gPT0gJy8nKSB7CisJCQkJd2hpbGUgKCorK25hbWUgPT0gJy8nKQorCQkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghKm5hbWUpIHsgLyogbGluZSBpcyBlbXB0eSAqLworCQkJCWZyZWUobGluZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfREVSRUYpCisJCQkJCT8gc3RhdChuYW1lLCAmc3QpCisJCQkJCTogbHN0YXQobmFtZSwgJnN0KQorCQkJKSB7CisgYWJvcnRfY3Bpb19vOgorCQkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUobmFtZSk7CisJCQl9CisKKwkJCWlmICghKFNfSVNMTksoc3Quc3RfbW9kZSkgfHwgU19JU1JFRyhzdC5zdF9tb2RlKSkpCisJCQkJc3Quc3Rfc2l6ZSA9IDA7IC8qIHBhcmFub2lhICovCisKKwkJCS8qIFN0b3JlIGhhcmRsaW5rcyBmb3IgbGF0ZXIgcHJvY2Vzc2luZywgZG9udCBvdXRwdXQgdGhlbSAqLworCQkJaWYgKCFTX0lTRElSKHN0LnN0X21vZGUpICYmIHN0LnN0X25saW5rID4gMSkgeworCQkJCXN0cnVjdCBuYW1lX3MgKm47CisJCQkJc3RydWN0IGlub2Rlc19zICpsOworCisJCQkJLyogRG8gd2UgaGF2ZSB0aGlzIGhhcmRsaW5rIHJlbWVtYmVyZWQ/ICovCisJCQkJbCA9IGxpbmtzOworCQkJCXdoaWxlICgxKSB7CisJCQkJCWlmIChsID09IE5VTEwpIHsKKwkJCQkJCS8qIE5vdCBmb3VuZDogYWRkIG5ldyBpdGVtIHRvICJsaW5rcyIgbGlzdCAqLworCQkJCQkJbCA9IHh6YWxsb2Moc2l6ZW9mKCpsKSk7CisJCQkJCQlsLT5zdCA9IHN0OworCQkJCQkJbC0+bmV4dCA9IGxpbmtzOworCQkJCQkJbGlua3MgPSBsOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJaWYgKGwtPnN0LnN0X2lubyA9PSBzdC5zdF9pbm8pIHsKKwkJCQkJCS8qIGZvdW5kICovCisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlsID0gbC0+bmV4dDsKKwkJCQl9CisJCQkJLyogQWRkIG5ldyBuYW1lIHRvICJsLT5uYW1lcyIgbGlzdCAqLworCQkJCW4gPSB4bWFsbG9jKHNpemVvZigqbikgKyBzdHJsZW4obmFtZSkpOworCQkJCXN0cmNweShuLT5uYW1lLCBuYW1lKTsKKwkJCQluLT5uZXh0ID0gbC0+bmFtZXM7CisJCQkJbC0+bmFtZXMgPSBuOworCisJCQkJZnJlZShsaW5lKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfSBlbHNlIHsgLyogbGluZSA9PSBOVUxMOiBFT0YgKi8KKyBuZXh0X2xpbms6CisJCQlpZiAobGlua3MpIHsKKwkJCQkvKiBPdXRwdXQgaGFyZGxpbmsncyBkYXRhICovCisJCQkJc3QgPSBsaW5rcy0+c3Q7CisJCQkJbmFtZSA9IGxpbmtzLT5uYW1lcy0+bmFtZTsKKwkJCQlsaW5rcy0+bmFtZXMgPSBsaW5rcy0+bmFtZXMtPm5leHQ7CisJCQkJLyogR05VIGNwaW8gaXMgcmVwb3J0ZWQgdG8gZW1pdCBmaWxlIGRhdGEKKwkJCQkgKiBvbmx5IGZvciB0aGUgbGFzdCBpbnN0YW5jZS4gTWltaWMgdGhhdC4gKi8KKwkJCQlpZiAobGlua3MtPm5hbWVzID09IE5VTEwpCisJCQkJCWxpbmtzID0gbGlua3MtPm5leHQ7CisJCQkJZWxzZQorCQkJCQlzdC5zdF9zaXplID0gMDsKKwkJCQkvKiBOQjogd2UgbGVhayBsaW5rcy0+bmFtZXMgYW5kL29yIGxpbmtzLAorCQkJCSAqIHRoaXMgaXMgaW50ZW5kZWQgKHdlIGV4aXQgc29vbiBhbnl3YXkpICovCisJCQl9IGVsc2UgeworCQkJCS8qIElmIG5vIChtb3JlKSBoYXJkbGlua3MgdG8gb3V0cHV0LAorCQkJCSAqIG91dHB1dCAidHJhaWxlciIgZW50cnkgKi8KKwkJCQluYW1lID0gdHJhaWxlcjsKKwkJCQkvKiBzdC5zdF9zaXplID09IDAgaXMgYSBtdXN0LCBidXQgZm9yIHVuaWZvcm1pdHkKKwkJCQkgKiBpbiB0aGUgb3V0cHV0LCB3ZSB6ZXJvIG91dCBldmVyeXRoaW5nICovCisJCQkJbWVtc2V0KCZzdCwgMCwgc2l6ZW9mKHN0KSk7CisJCQkJLyogc3Quc3RfbmxpbmsgPSAxOyAtIEdOVSBjcGlvIGRvZXMgdGhpcyAqLworCQkJfQorCQl9CisKKwkJYnl0ZXMgKz0gcHJpbnRmKCIwNzA3MDEiCisJCQkJIiUwOFglMDhYJTA4WCUwOFglMDhYJTA4WCUwOFgiCisJCQkJIiUwOFglMDhYJTA4WCUwOFgiIC8qIEdOVSBjcGlvIHVzZXMgdXBwZXJjYXNlIGhleCAqLworCQkJCS8qIHN0cmxlbisxOiAqLyAiJTA4WCIKKwkJCQkvKiBjaGtzdW06ICovICAgIjAwMDAwMDAwIiAvKiAob25seSBmb3IgIjA3MDcwMiIgZmlsZXMpICovCisJCQkJLyogbmFtZSxOVUw6ICovICIlcyVjIiwKKwkJCQkodW5zaWduZWQpKHVpbnQzMl90KSBzdC5zdF9pbm8sCisJCQkJKHVuc2lnbmVkKSh1aW50MzJfdCkgc3Quc3RfbW9kZSwKKwkJCQkodW5zaWduZWQpKHVpbnQzMl90KSBzdC5zdF91aWQsCisJCQkJKHVuc2lnbmVkKSh1aW50MzJfdCkgc3Quc3RfZ2lkLAorCQkJCSh1bnNpZ25lZCkodWludDMyX3QpIHN0LnN0X25saW5rLAorCQkJCSh1bnNpZ25lZCkodWludDMyX3QpIHN0LnN0X210aW1lLAorCQkJCSh1bnNpZ25lZCkodWludDMyX3QpIHN0LnN0X3NpemUsCisJCQkJKHVuc2lnbmVkKSh1aW50MzJfdCkgbWFqb3Ioc3Quc3RfZGV2KSwKKwkJCQkodW5zaWduZWQpKHVpbnQzMl90KSBtaW5vcihzdC5zdF9kZXYpLAorCQkJCSh1bnNpZ25lZCkodWludDMyX3QpIG1ham9yKHN0LnN0X3JkZXYpLAorCQkJCSh1bnNpZ25lZCkodWludDMyX3QpIG1pbm9yKHN0LnN0X3JkZXYpLAorCQkJCSh1bnNpZ25lZCkoc3RybGVuKG5hbWUpICsgMSksCisJCQkJbmFtZSwgJ1wwJyk7CisJCWJ5dGVzID0gY3Bpb19wYWQ0KGJ5dGVzKTsKKworCQlpZiAoc3Quc3Rfc2l6ZSkgeworCQkJaWYgKFNfSVNMTksoc3Quc3RfbW9kZSkpIHsKKwkJCQljaGFyICpscGF0aCA9IHhtYWxsb2NfcmVhZGxpbmtfb3Jfd2FybihuYW1lKTsKKwkJCQlpZiAoIWxwYXRoKQorCQkJCQlnb3RvIGFib3J0X2NwaW9fbzsKKwkJCQlieXRlcyArPSBwcmludGYoIiVzIiwgbHBhdGgpOworCQkJCWZyZWUobHBhdGgpOworCQkJfSBlbHNlIHsgLyogU19JU1JFRyAqLworCQkJCWludCBmZCA9IHhvcGVuKG5hbWUsIE9fUkRPTkxZKTsKKwkJCQlmZmx1c2hfYWxsKCk7CisJCQkJLyogV2UgbXVzdCBhYm9ydCBpZiBmaWxlIGdvdCBzaG9ydGVyIHRvbyEgKi8KKwkJCQliYl9jb3B5ZmRfZXhhY3Rfc2l6ZShmZCwgU1RET1VUX0ZJTEVOTywgc3Quc3Rfc2l6ZSk7CisJCQkJYnl0ZXMgKz0gc3Quc3Rfc2l6ZTsKKwkJCQljbG9zZShmZCk7CisJCQl9CisJCQlieXRlcyA9IGNwaW9fcGFkNChieXRlcyk7CisJCX0KKworCQlpZiAoIWxpbmUpIHsKKwkJCWlmIChuYW1lICE9IHRyYWlsZXIpCisJCQkJZ290byBuZXh0X2xpbms7CisJCQkvKiBUT0RPOiBHTlUgY3BpbyBwYWRzIHRyYWlsZXIgdG8gNTEyIGJ5dGVzLCBkbyB3ZSB3YW50IHRoYXQ/ICovCisJCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCQl9CisKKwkJZnJlZShsaW5lKTsKKwl9IC8qIGVuZCBvZiAid2hpbGUgKDEpIiAqLworfQorI2VuZGlmCisKK2ludCBjcGlvX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjcGlvX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZTsKKwljaGFyICpjcGlvX2ZpbGVuYW1lOworCUlGX0ZFQVRVUkVfQ1BJT19PKGNvbnN0IGNoYXIgKmNwaW9fZm10ID0gIiI7KQorCXVuc2lnbmVkIG9wdDsKKworI2lmIEVOQUJMRV9MT05HX09QVFMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0KKwkJImV4dHJhY3RcMCIgICAgICBOb19hcmd1bWVudCAgICAgICAiaSIKKwkJImxpc3RcMCIgICAgICAgICBOb19hcmd1bWVudCAgICAgICAidCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9DUElPX08KKwkJImNyZWF0ZVwwIiAgICAgICBOb19hcmd1bWVudCAgICAgICAibyIKKwkJImZvcm1hdFwwIiAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiSCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9DUElPX1AKKwkJInBhc3MtdGhyb3VnaFwwIiBOb19hcmd1bWVudCAgICAgICAicCIKKyNlbmRpZgorI2VuZGlmCisJCSJ2ZXJib3NlXDAiICAgICAgTm9fYXJndW1lbnQgICAgICAgInYiCisJCSJxdWlldFwwIiAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIlx4ZmYiCisJCSJ0by1zdGRvdXRcMCIgICAgTm9fYXJndW1lbnQgICAgICAgIlx4ZmUiCisJCTsKKyNlbmRpZgorCisJYXJjaGl2ZV9oYW5kbGUgPSBpbml0X2hhbmRsZSgpOworCS8qIGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQgPSBTVERJTl9GSUxFTk87IC0gZG9uZSBieSBpbml0X2hhbmRsZSAqLworCWFyY2hpdmVfaGFuZGxlLT5haF9mbGFncyA9IEFSQ0hJVkVfRVhUUkFDVF9ORVdFUjsKKworCS8qIEFzIG9mIG5vdyB3ZSBkbyBub3QgZW5mb3JjZSB0aGlzOiAqLworCS8qIC1pLC10LC1vLC1wIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgKi8KKwkvKiAtdSwtZCwtbSBtYWtlIHNlbnNlIG9ubHkgd2l0aCAtaSBvciAtcCAqLworCS8qIC1MIG1ha2VzIHNlbnNlIG9ubHkgd2l0aCAtbyBvciAtcCAqLworCisjaWYgIUVOQUJMRV9GRUFUVVJFX0NQSU9fTworCW9wdCA9IGdldG9wdDMyKGFyZ3YsIE9QVElPTl9TVFIsICZjcGlvX2ZpbGVuYW1lKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAob3B0ICYgT1BUX0ZJTEUpIHsgLyogLUYgKi8KKwkJeG1vdmVfZmQoeG9wZW4oY3Bpb19maWxlbmFtZSwgT19SRE9OTFkpLCBTVERJTl9GSUxFTk8pOworCX0KKyNlbHNlCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgT1BUSU9OX1NUUiAib0g6IiBJRl9GRUFUVVJFX0NQSU9fUCgicCIpLCAmY3Bpb19maWxlbmFtZSwgJmNwaW9fZm10KTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoKG9wdCAmIChPUFRfRklMRXxPUFRfQ1JFQVRFKSkgPT0gT1BUX0ZJTEUpIHsgLyogLUYgd2l0aG91dCAtbyAqLworCQl4bW92ZV9mZCh4b3BlbihjcGlvX2ZpbGVuYW1lLCBPX1JET05MWSksIFNURElOX0ZJTEVOTyk7CisJfQorCWlmIChvcHQgJiBPUFRfUEFTU1RIUk9VR0gpIHsKKwkJcGlkX3QgcGlkOworCQlzdHJ1Y3QgZmRfcGFpciBwcDsKKworCQlpZiAoYXJndlswXSA9PSBOVUxMKQorCQkJYmJfc2hvd191c2FnZSgpOworCQlpZiAob3B0ICYgT1BUX0NSRUFURV9MRUFESU5HX0RJUikKKwkJCW1rZGlyKGFyZ3ZbMF0sIDA3NzcpOworCQkvKiBDcnVkZSBleGlzdGVuY2UgY2hlY2s6CisJCSAqIGNsb3NlKHhvcGVuKGFyZ3ZbMF0sIE9fUkRPTkxZIHwgT19ESVJFQ1RPUlkpKTsKKwkJICogV2UgY2FuIGFsc28geG9wZW4sIGZzdGF0LCBJU19ESVIsIGxhdGVyIGZjaGRpci4KKwkJICogVGhpcyB3b3VsZCBjaGVjayBmb3IgZXhpc3RlbmNlIGVhcmxpZXIgYW5kIGNsZWFuZXIuCisJCSAqIEFzIGl0IHN0YW5kcyBub3csIGlmIHdlIGZhaWwgeGNoZGlyIGxhdGVyLAorCQkgKiBjaGlsZCBkaWVzIG9uIEVQSVBFLCB1bmxlc3MgaXQgY2F1Z2h0CisJCSAqIGEgZGlmZnJlcmVudCBwcm9ibGVtIGVhcmxpZXIuCisJCSAqIFRoaXMgaXMgZ29vZCBlbm91Z2ggZm9yIG5vdy4KKwkJICovCisjaWYgIUJCX01NVQorCQlwcC5yZCA9IDM7CisJCXBwLndyID0gNDsKKwkJaWYgKCFyZV9leGVjZWQpIHsKKwkJCWNsb3NlKDMpOworCQkJY2xvc2UoNCk7CisJCQl4cGlwZWRfcGFpcihwcCk7CisJCX0KKyNlbHNlCisJCXhwaXBlZF9wYWlyKHBwKTsKKyNlbmRpZgorCQlwaWQgPSBmb3JrX29yX3JleGVjKGFyZ3YgLSBvcHRpbmQpOworCQlpZiAocGlkID09IDApIHsgLyogY2hpbGQgKi8KKwkJCWNsb3NlKHBwLnJkKTsKKwkJCXhtb3ZlX2ZkKHBwLndyLCBTVERPVVRfRklMRU5PKTsKKwkJCWdvdG8gZHVtcDsKKwkJfQorCQkvKiBwYXJlbnQgKi8KKwkJVVNFX0ZPUl9OT01NVShhcmd2Wy1vcHRpbmRdWzBdICY9IDB4N2YpOyAvKiB1bmRvIGZvcmtfb3JfcmV4ZWMoKSBkYW1hZ2UgKi8KKwkJeGNoZGlyKCphcmd2KyspOworCQljbG9zZShwcC53cik7CisJCXhtb3ZlX2ZkKHBwLnJkLCBTVERJTl9GSUxFTk8pOworCQkvL29wdCAmPSB+T1BUX1BBU1NUSFJPVUdIOworCQlvcHQgfD0gT1BUX0VYVFJBQ1Q7CisJCWdvdG8gc2tpcDsKKwl9CisJLyogLW8gKi8KKwlpZiAob3B0ICYgT1BUX0NSRUFURSkgeworCQlpZiAoY3Bpb19mbXRbMF0gIT0gJ24nKSAvKiB3ZSBfcmVxdWlyZV8gIi1IIG5ld2MiICovCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWlmIChvcHQgJiBPUFRfRklMRSkgeworCQkJeG1vdmVfZmQoeG9wZW4oY3Bpb19maWxlbmFtZSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyksIFNURE9VVF9GSUxFTk8pOworCQl9CisgZHVtcDoKKwkJcmV0dXJuIGNwaW9fbygpOworCX0KKyBza2lwOgorI2VuZGlmCisKKwkvKiBPbmUgb2YgZWl0aGVyIGV4dHJhY3Qgb3IgdGVzdCBvcHRpb25zIG11c3QgYmUgZ2l2ZW4gKi8KKwlpZiAoKG9wdCAmIChPUFRfVEVTVCB8IE9QVF9FWFRSQUNUKSkgPT0gMCkgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJaWYgKG9wdCAmIE9QVF9URVNUKSB7CisJCS8qIGlmIGJvdGggZXh0cmFjdCBhbmQgdGVzdCBvcHRpb25zIGFyZSBnaXZlbiwgaWdub3JlIGV4dHJhY3Qgb3B0aW9uICovCisJCW9wdCAmPSB+T1BUX0VYVFJBQ1Q7CisJCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25faGVhZGVyID0gaGVhZGVyX2xpc3Q7CisJfQorCWlmIChvcHQgJiBPUFRfRVhUUkFDVCkgeworCQlhcmNoaXZlX2hhbmRsZS0+YWN0aW9uX2RhdGEgPSBkYXRhX2V4dHJhY3RfYWxsOworCQlpZiAob3B0ICYgT1BUXzJTVERPVVQpCisJCQlhcmNoaXZlX2hhbmRsZS0+YWN0aW9uX2RhdGEgPSBkYXRhX2V4dHJhY3RfdG9fc3Rkb3V0OworCX0KKwlpZiAob3B0ICYgT1BUX1VOQ09ORElUSU9OQUwpIHsKKwkJYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzIHw9IEFSQ0hJVkVfVU5MSU5LX09MRDsKKwkJYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzICY9IH5BUkNISVZFX0VYVFJBQ1RfTkVXRVI7CisJfQorCWlmIChvcHQgJiBPUFRfVkVSQk9TRSkgeworCQlpZiAoYXJjaGl2ZV9oYW5kbGUtPmFjdGlvbl9oZWFkZXIgPT0gaGVhZGVyX2xpc3QpIHsKKwkJCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25faGVhZGVyID0gaGVhZGVyX3ZlcmJvc2VfbGlzdDsKKwkJfSBlbHNlIHsKKwkJCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25faGVhZGVyID0gaGVhZGVyX2xpc3Q7CisJCX0KKwl9CisJaWYgKG9wdCAmIE9QVF9DUkVBVEVfTEVBRElOR19ESVIpIHsKKwkJYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzIHw9IEFSQ0hJVkVfQ1JFQVRFX0xFQURJTkdfRElSUzsKKwl9CisJaWYgKG9wdCAmIE9QVF9QUkVTRVJWRV9NVElNRSkgeworCQlhcmNoaXZlX2hhbmRsZS0+YWhfZmxhZ3MgfD0gQVJDSElWRV9SRVNUT1JFX0RBVEU7CisJfQorCisJd2hpbGUgKCphcmd2KSB7CisJCWFyY2hpdmVfaGFuZGxlLT5maWx0ZXIgPSBmaWx0ZXJfYWNjZXB0X2xpc3Q7CisJCWxsaXN0X2FkZF90bygmYXJjaGl2ZV9oYW5kbGUtPmFjY2VwdCwgKmFyZ3YpOworCQlhcmd2Kys7CisJfQorCisJLyogc2VlIGdldF9oZWFkZXJfY3BpbyAqLworCWFyY2hpdmVfaGFuZGxlLT5jcGlvX19ibG9ja3MgPSAob2ZmX3QpLTE7CisJd2hpbGUgKGdldF9oZWFkZXJfY3BpbyhhcmNoaXZlX2hhbmRsZSkgPT0gRVhJVF9TVUNDRVNTKQorCQljb250aW51ZTsKKworCWlmIChhcmNoaXZlX2hhbmRsZS0+Y3Bpb19fYmxvY2tzICE9IChvZmZfdCktMQorCSAmJiAhKG9wdCAmIE9QVF9RVUlFVCkKKwkpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlIk9GRl9GTVQidSBibG9ja3NcbiIsIGFyY2hpdmVfaGFuZGxlLT5jcGlvX19ibG9ja3MpOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9kcGtnLmMgYi9hcmNoaXZhbC9kcGtnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY3YTBkYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2Rwa2cuYwpAQCAtMCwwICsxLDE5NDggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqICBtaW5pIGRwa2cgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3guCisgKiAgdGhpcyBpcyBub3QgbWVhbnQgYXMgYSByZXBsYWNlbWVudCBmb3IgZHBrZworICoKKyAqICB3cml0dGVuIGJ5IGdsZW5uIG1jZ3JhdGggd2l0aCB0aGUgaGVscCBvZiBvdGhlcnMKKyAqICBjb3B5cmlnaHQgKGMpIDIwMDEgYnkgZ2xlbm4gbWNncmF0aAorICoKKyAqICBwYXJ0cyBvZiB0aGUgdmVyc2lvbiBjb21wYXJpc29uIGNvZGUgaXMgcGx1Y2tlZCBmcm9tIHRoZSByZWFsIGRwa2cKKyAqICBhcHBsaWNhdGlvbiB3aGljaCBpcyBsaWNlbnNlZCBHUEx2MiBhbmQKKyAqICBjb3B5cmlnaHQgKGMpIDE5OTUgSWFuIEphY2tzb24gPGlhbkBjaGlhcmsuZ3JlZW5lbmQub3JnLnVrPgorICoKKyAqICBzdGFydGVkIGxpZmUgYXMgYSBidXN5Ym94IGltcGxlbWVudGF0aW9uIG9mIHVkcGtnCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworLyoKKyAqIGtub3duIGRpZmZlcmVuY2UgYmV0d2VlbiBidXN5Ym94IGRwa2cgYW5kIHRoZSBvZmZpY2lhbCBkcGtnIHRoYXQgaSBkb24ndAorICogY29uc2lkZXIgaW1wb3J0YW50LCBpdHMgd29ydGgga2VlcGluZyBhIG5vdGUgb2YgZGlmZmVyZW5jZXMgYW55d2F5LCBqdXN0IHRvCisgKiBtYWtlIGl0IGVhc2llciB0byBtYWludGFpbi4KKyAqICAtIHRoZSBmaXJzdCB2YWx1ZSBmb3IgdGhlIGNvbmZmbGlsZTogZmllbGQgaXNudCBwbGFjZWQgb24gYSBuZXcgbGluZS4KKyAqICAtIHdoZW4gaW5zdGFsbGluZyBhIHBhY2thZ2UgdGhlIHN0YXR1czogZmllbGQgaXMgcGxhY2VkIGF0IHRoZSBlbmQgb2YgdGhlCisgKiAgICAgIHNlY3Rpb24sIHJhdGhlciB0aGFuIGp1c3QgYWZ0ZXIgdGhlIHBhY2thZ2U6IGZpZWxkLgorICoKKyAqIGJ1Z3MgdGhhdCBuZWVkIHRvIGJlIGZpeGVkCisgKiAgLSAodW5rbm93biwgcGxlYXNlIGxldCBtZSBrbm93IHdoZW4geW91IGZpbmQgYW55KQorICovCisKKy8vY29uZmlnOmNvbmZpZyBEUEtHCisvL2NvbmZpZzoJYm9vbCAiZHBrZyIKKy8vY29uZmlnOglkZWZhdWx0IG4KKy8vY29uZmlnOglzZWxlY3QgRkVBVFVSRV9TRUFNTEVTU19HWgorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIGRwa2cgaXMgYSBtZWRpdW0tbGV2ZWwgdG9vbCB0byBpbnN0YWxsLCBidWlsZCwgcmVtb3ZlIGFuZCBtYW5hZ2UKKy8vY29uZmlnOgkgIERlYmlhbiBwYWNrYWdlcy4KKy8vY29uZmlnOgorLy9jb25maWc6CSAgVGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBkcGtnIGhhcyBhIG51bWJlciBvZiBsaW1pdGF0aW9ucywKKy8vY29uZmlnOgkgIHlvdSBzaG91bGQgdXNlIHRoZSBvZmZpY2lhbCBkcGtnIGlmIHBvc3NpYmxlLgorCisvL2FwcGxldDpJRl9EUEtHKEFQUExFVChkcGtnLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8va2J1aWxkOmxpYi0kKENPTkZJR19EUEtHKSArPSBkcGtnLm8KKworLy91c2FnZTojZGVmaW5lIGRwa2dfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstaWxDUHJ1XSBbLUYgT1BUXSBQQUNLQUdFIgorLy91c2FnZTojZGVmaW5lIGRwa2dfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJJbnN0YWxsLCByZW1vdmUgYW5kIG1hbmFnZSBEZWJpYW4gcGFja2FnZXNcbiIKKy8vdXNhZ2U6CUlGX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAiXG4JLWksLS1pbnN0YWxsCUluc3RhbGwgdGhlIHBhY2thZ2UiCisvL3VzYWdlOiAgICAgIlxuCS1sLC0tbGlzdAlMaXN0IG9mIGluc3RhbGxlZCBwYWNrYWdlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLS1jb25maWd1cmUJQ29uZmlndXJlIGFuIHVucGFja2FnZWQgcGFja2FnZSIKKy8vdXNhZ2U6ICAgICAiXG4JLVAsLS1wdXJnZQlQdXJnZSBhbGwgZmlsZXMgb2YgYSBwYWNrYWdlIgorLy91c2FnZTogICAgICJcbgktciwtLXJlbW92ZQlSZW1vdmUgYWxsIGJ1dCB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBmb3IgYSBwYWNrYWdlIgorLy91c2FnZTogICAgICJcbgktLXVucGFjawlVbnBhY2sgYSBwYWNrYWdlLCBidXQgZG9uJ3QgY29uZmlndXJlIGl0IgorLy91c2FnZTogICAgICJcbgktLWZvcmNlLWRlcGVuZHMJSWdub3JlIGRlcGVuZGVuY3kgcHJvYmxlbXMiCisvL3VzYWdlOiAgICAgIlxuCS0tZm9yY2UtY29uZm5ldwlPdmVyd3JpdGUgZXhpc3RpbmcgY29uZmlnIGZpbGVzIHdoZW4gaW5zdGFsbGluZyIKKy8vdXNhZ2U6ICAgICAiXG4JLS1mb3JjZS1jb25mb2xkCUtlZXAgb2xkIGNvbmZpZyBmaWxlcyB3aGVuIGluc3RhbGxpbmciCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9OT1RfTE9OR19PUFRTKAorLy91c2FnZTogICAgICJcbgktaQkJSW5zdGFsbCB0aGUgcGFja2FnZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJCUxpc3Qgb2YgaW5zdGFsbGVkIHBhY2thZ2VzIgorLy91c2FnZTogICAgICJcbgktQwkJQ29uZmlndXJlIGFuIHVucGFja2FnZWQgcGFja2FnZSIKKy8vdXNhZ2U6ICAgICAiXG4JLVAJCVB1cmdlIGFsbCBmaWxlcyBvZiBhIHBhY2thZ2UiCisvL3VzYWdlOiAgICAgIlxuCS1yCQlSZW1vdmUgYWxsIGJ1dCB0aGUgY29uZmlndXJhdGlvbiBmaWxlcyBmb3IgYSBwYWNrYWdlIgorLy91c2FnZTogICAgICJcbgktdQkJVW5wYWNrIGEgcGFja2FnZSwgYnV0IGRvbid0IGNvbmZpZ3VyZSBpdCIKKy8vdXNhZ2U6ICAgICAiXG4JLUYgZGVwZW5kcwlJZ25vcmUgZGVwZW5kZW5jeSBwcm9ibGVtcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUYgY29uZm5ldwlPdmVyd3JpdGUgZXhpc3RpbmcgY29uZmlnIGZpbGVzIHdoZW4gaW5zdGFsbGluZyIKKy8vdXNhZ2U6ICAgICAiXG4JLUYgY29uZm9sZAlLZWVwIG9sZCBjb25maWcgZmlsZXMgd2hlbiBpbnN0YWxsaW5nIgorLy91c2FnZToJKQorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisjaW5jbHVkZSAiYmJfYXJjaGl2ZS5oIgorCisvKiBub3RlOiBpZiB5b3UgdmFyeSBoYXNoX3ByaW1lIHNpemVzIGJlIGF3YXJlLAorICogMSkgdHdlYWtpbmcgdGhlc2Ugd2lsbCBoYXZlIGEgYmlnIGVmZmVjdCBvbiBob3cgbXVjaCBtZW1vcnkgdGhpcyBwcm9ncmFtIHVzZXMuCisgKiAyKSBmb3IgY29tcHV0YXRpb25hbCBlZmZpY2llbmN5IHRoZXNlIGhhc2ggdGFibGVzIHNob3VsZCBiZSBhdCBsZWFzdCAyMCUKKyAqICAgIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBzdG9yZWQgaW4gaXQuCisgKiAzKSBhbGwgX2hhc2hfcHJpbWUncyBtdXN0IGJlIGEgcHJpbWUgbnVtYmVyIG9yIGNoYW9zIGlzIGFzc3VyZWQsIGlmIHlvdXIgbG9va2luZworICogICAgZm9yIGEgcHJpbWUsIHRyeSBodHRwOi8vd3d3LnV0bS5lZHUvcmVzZWFyY2gvcHJpbWVzL2xpc3RzL3NtYWxsLzEwMDAwLnR4dAorICogNCkgaWYgeW91IGdvIGJpZ2dlciB0aGFuIDE1IGJpdHMgeW91IG1heSBnZXQgaW50byB0cm91YmxlICh1bnRlc3RlZCkgYXMgaXRzCisgKiAgICBzb21ldGltZXMgY2FzdCB0byBhbiB1bnNpZ25lZCwgaWYgeW91IGdvIHRvIDE2IGJpdCB5b3Ugd2lsbCBvdmVybGFwCisgKiAgICBpbnQncyBhbmQgY2hhb3MgaXMgYXNzdXJlZCwgMTYzODEgaXMgdGhlIG1heCBwcmltZSBmb3IgMTQgYml0IGZpZWxkCisgKi8KKworLyogTkFNRV9IQVNIX1BSSU1FLCBTdG9yZXMgcGFja2FnZSBuYW1lcyBhbmQgdmVyc2lvbnMsCisgKiBJIGVzdGltYXRlIGl0IHNob3VsZCBiZSBhdCBsZWFzdCA1MCUgYmlnZ2VyIHRoYW4gUEFDS0FHRV9IQVNIX1BSSU1FLAorICogYXMgdGhlcmUgYSBsb3Qgb2YgZHVwbGljYXRlIHZlcnNpb24gbnVtYmVycyAqLworI2RlZmluZSBOQU1FX0hBU0hfUFJJTUUgMTYzODEKKworLyogUEFDS0FHRV9IQVNIX1BSSU1FLCBNYXhpbXVtIG51bWJlciBvZiB1bmlxdWUgcGFja2FnZXMsCisgKiBJdCBtdXN0IG5vdCBiZSBzbWFsbGVyIHRoYW4gU1RBVFVTX0hBU0hfUFJJTUUsCisgKiBDdXJyZW50bHkgb25seSBwYWNrYWdlcyBmcm9tIHN0YXR1c19oYXNodGFibGUgYXJlIHN0b3JlZCBpbiBoZXJlLCBidXQgaW4KKyAqIGZ1dHVyZSB0aGlzIG1heSBiZSB1c2VkIHRvIHN0b3JlIHBhY2thZ2VzIG5vdCBvbmx5IGZyb20gYSBzdGF0dXMgZmlsZSwKKyAqIGJ1dCBhbiBhdmFpbGFibGVfaGFzaHRhYmxlLCBhbmQgZXZlbiBtdWx0aXBsZSBwYWNrYWdlcyBmaWxlcy4KKyAqIFBhY2thZ2UgY2FuIGJlIHN0b3JlZCBtb3JlIHRoYW4gb25jZSBpZiB0aGV5IGhhdmUgZGlmZmVyZW50IHZlcnNpb25zLgorICogZS5nLiBUaGUgc2FtZSBwYWNrYWdlIG1heSBoYXZlIGRpZmZlcmVudCB2ZXJzaW9ucyBpbiB0aGUgc3RhdHVzIGZpbGUKKyAqICAgICAgYW5kIGF2YWlsYWJsZSBmaWxlICovCisjZGVmaW5lIFBBQ0tBR0VfSEFTSF9QUklNRSAxMDAwNwordHlwZWRlZiBzdHJ1Y3QgZWRnZV9zIHsKKwl1bnNpZ25lZCBvcGVyYXRvcjo0OyAvKiB3YXM6MyAqLworCXVuc2lnbmVkIHR5cGU6NDsKKwl1bnNpZ25lZCBuYW1lOjE2OyAvKiB3YXM6MTQgKi8KKwl1bnNpZ25lZCB2ZXJzaW9uOjE2OyAvKiB3YXM6MTQgKi8KK30gZWRnZV90OworCit0eXBlZGVmIHN0cnVjdCBjb21tb25fbm9kZV9zIHsKKwl1bnNpZ25lZCBuYW1lOjE2OyAvKiB3YXM6MTQgKi8KKwl1bnNpZ25lZCB2ZXJzaW9uOjE2OyAvKiB3YXM6MTQgKi8KKwl1bnNpZ25lZCBudW1fb2ZfZWRnZXM6MTY7IC8qIHdhczoxNCAqLworCWVkZ2VfdCAqKmVkZ2U7Cit9IGNvbW1vbl9ub2RlX3Q7CisKKy8qIEN1cnJlbnRseSBpdCBkb2VzbnQgc3RvcmUgcGFja2FnZXMgdGhhdCBoYXZlIHN0YXRlLXN0YXR1cyBvZiBub3QtaW5zdGFsbGVkCisgKiBTbyBpdCBvbmx5IHJlYWxseSBoYXMgdG8gYmUgdGhlIHNpemUgb2YgdGhlIG1heGltdW0gbnVtYmVyIG9mIHBhY2thZ2VzCisgKiBsaWtlbHkgdG8gYmUgaW5zdGFsbGVkIGF0IGFueSBvbmUgdGltZSwgc28gdGhlcmUgaXMgYSBiaXQgb2YgbGVld2F5IGhlcmUgKi8KKyNkZWZpbmUgU1RBVFVTX0hBU0hfUFJJTUUgODE5MQordHlwZWRlZiBzdHJ1Y3Qgc3RhdHVzX25vZGVfcyB7CisJdW5zaWduZWQgcGFja2FnZToxNjsgLyogd2FzOjE0ICovICAgICAgIC8qIGhhcyB0byBmaXQgUEFDS0FHRV9IQVNIX1BSSU1FICovCisJdW5zaWduZWQgc3RhdHVzOjE2OyAvKiB3YXM6MTQgKi8gICAgICAgIC8qIGhhcyB0byBmaXQgU1RBVFVTX0hBU0hfUFJJTUUgKi8KK30gc3RhdHVzX25vZGVfdDsKKworCisvKiBHbG9iYWxzICovCitzdHJ1Y3QgZ2xvYmFscyB7CisJY2hhciAgICAgICAgICAqbmFtZV9oYXNodGFibGVbTkFNRV9IQVNIX1BSSU1FICsgMV07CisJY29tbW9uX25vZGVfdCAqcGFja2FnZV9oYXNodGFibGVbUEFDS0FHRV9IQVNIX1BSSU1FICsgMV07CisJc3RhdHVzX25vZGVfdCAqc3RhdHVzX2hhc2h0YWJsZVtTVEFUVVNfSEFTSF9QUklNRSArIDFdOworfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBuYW1lX2hhc2h0YWJsZSAgICAoRy5uYW1lX2hhc2h0YWJsZSAgICkKKyNkZWZpbmUgcGFja2FnZV9oYXNodGFibGUgKEcucGFja2FnZV9oYXNodGFibGUpCisjZGVmaW5lIHN0YXR1c19oYXNodGFibGUgIChHLnN0YXR1c19oYXNodGFibGUgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorfSB3aGlsZSAoMCkKKworCisvKiBFdmVuIG51bWJlcnMgYXJlIGZvciAnZXh0cmFzJywgbGlrZSBvcmVkIGRlcGVuZGVuY2llcyBvciBudWxsICovCitlbnVtIGVkZ2VfdHlwZV9lIHsKKwlFREdFX05VTEwgPSAwLAorCUVER0VfUFJFX0RFUEVORFMgPSAxLAorCUVER0VfT1JfUFJFX0RFUEVORFMgPSAyLAorCUVER0VfREVQRU5EUyA9IDMsCisJRURHRV9PUl9ERVBFTkRTID0gNCwKKwlFREdFX1JFUExBQ0VTID0gNSwKKwlFREdFX1BST1ZJREVTID0gNywKKwlFREdFX0NPTkZMSUNUUyA9IDksCisJRURHRV9TVUdHRVNUUyA9IDExLAorCUVER0VfUkVDT01NRU5EUyA9IDEzLAorCUVER0VfRU5IQU5DRVMgPSAxNQorfTsKK2VudW0gb3BlcmF0b3JfZSB7CisJVkVSX05VTEwgPSAwLAorCVZFUl9FUVVBTCA9IDEsCisJVkVSX0xFU1MgPSAyLAorCVZFUl9MRVNTX0VRVUFMID0gMywKKwlWRVJfTU9SRSA9IDQsCisJVkVSX01PUkVfRVFVQUwgPSA1LAorCVZFUl9BTlkgPSA2Cit9OworCit0eXBlZGVmIHN0cnVjdCBkZWJfZmlsZV9zIHsKKwljaGFyICpjb250cm9sX2ZpbGU7CisJY2hhciAqZmlsZW5hbWU7CisJdW5zaWduZWQgcGFja2FnZToxNjsgLyogd2FzOjE0ICovCit9IGRlYl9maWxlX3Q7CisKKworc3RhdGljIHZvaWQgbWFrZV9oYXNoKGNvbnN0IGNoYXIgKmtleSwgdW5zaWduZWQgKnN0YXJ0LCB1bnNpZ25lZCAqZGVjcmVtZW50LCBjb25zdCBpbnQgaGFzaF9wcmltZSkKK3sKKwl1bnNpZ25lZCBsb25nIGhhc2hfbnVtID0ga2V5WzBdOworCWludCBsZW4gPSBzdHJsZW4oa2V5KTsKKwlpbnQgaTsKKworCS8qIE1heWJlIGkgc2hvdWxkIGhhdmUgdXNlcyBhICJwcm9wZXIiIGhhc2hpbmcgYWxnb3JpdGhtIGhlcmUgaW5zdGVhZAorCSAqIG9mIG1ha2luZyBvbmUgdXAgbXlzZWxmLCBzZWVtcyB0byBiZSB3b3JraW5nIG9rIHRob3VnaC4gKi8KKwlmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKKwkJLyogc2hpZnRzIHRoZSBhc2NpaSBiYXNlZCB2YWx1ZSBhbmQgYWRkcyBpdCB0byBwcmV2aW91cyB2YWx1ZQorCQkgKiBzaGlmdCBhbW91bnQgaXMgbW9kIDI0IGJlY2F1c2UgbG9uZyBpbnQgaXMgMzIgYml0IGFuZCBkYXRhCisJCSAqIHRvIGJlIHNoaWZ0ZWQgaXMgOCwgZG9uJ3Qgd2FudCB0byBzaGlmdCBkYXRhIHRvIHdoZXJlIGl0IGhhcworCQkgKiBubyBlZmZlY3QgKi8KKwkJaGFzaF9udW0gKz0gKGtleVtpXSArIGtleVtpLTFdKSA8PCAoKGtleVtpXSAqIGkpICUgMjQpOworCX0KKwkqc3RhcnQgPSAodW5zaWduZWQpIGhhc2hfbnVtICUgaGFzaF9wcmltZTsKKwkqZGVjcmVtZW50ID0gKHVuc2lnbmVkKSAxICsgKGhhc2hfbnVtICUgKGhhc2hfcHJpbWUgLSAxKSk7Cit9CisKKy8qIHRoaXMgYWRkcyB0aGUga2V5IHRvIHRoZSBoYXNoIHRhYmxlICovCitzdGF0aWMgaW50IHNlYXJjaF9uYW1lX2hhc2h0YWJsZShjb25zdCBjaGFyICprZXkpCit7CisJdW5zaWduZWQgcHJvYmVfYWRkcmVzczsKKwl1bnNpZ25lZCBwcm9iZV9kZWNyZW1lbnQ7CisKKwltYWtlX2hhc2goa2V5LCAmcHJvYmVfYWRkcmVzcywgJnByb2JlX2RlY3JlbWVudCwgTkFNRV9IQVNIX1BSSU1FKTsKKwl3aGlsZSAobmFtZV9oYXNodGFibGVbcHJvYmVfYWRkcmVzc10gIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKG5hbWVfaGFzaHRhYmxlW3Byb2JlX2FkZHJlc3NdLCBrZXkpID09IDApIHsKKwkJCXJldHVybiBwcm9iZV9hZGRyZXNzOworCQl9CisJCXByb2JlX2FkZHJlc3MgLT0gcHJvYmVfZGVjcmVtZW50OworCQlpZiAoKGludClwcm9iZV9hZGRyZXNzIDwgMCkgeworCQkJcHJvYmVfYWRkcmVzcyArPSBOQU1FX0hBU0hfUFJJTUU7CisJCX0KKwl9CisJbmFtZV9oYXNodGFibGVbcHJvYmVfYWRkcmVzc10gPSB4c3RyZHVwKGtleSk7CisJcmV0dXJuIHByb2JlX2FkZHJlc3M7Cit9CisKKy8qIHRoaXMgRE9FU05UIGFkZCB0aGUga2V5IHRvIHRoZSBoYXNodGFibGUKKyAqIFRPRE8gbWFrZSBpdCBjb25zaXN0ZW50IHdpdGggc2VhcmNoX25hbWVfaGFzaHRhYmxlCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBzZWFyY2hfc3RhdHVzX2hhc2h0YWJsZShjb25zdCBjaGFyICprZXkpCit7CisJdW5zaWduZWQgcHJvYmVfYWRkcmVzczsKKwl1bnNpZ25lZCBwcm9iZV9kZWNyZW1lbnQ7CisKKwltYWtlX2hhc2goa2V5LCAmcHJvYmVfYWRkcmVzcywgJnByb2JlX2RlY3JlbWVudCwgU1RBVFVTX0hBU0hfUFJJTUUpOworCXdoaWxlIChzdGF0dXNfaGFzaHRhYmxlW3Byb2JlX2FkZHJlc3NdICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcChrZXksIG5hbWVfaGFzaHRhYmxlW3BhY2thZ2VfaGFzaHRhYmxlW3N0YXR1c19oYXNodGFibGVbcHJvYmVfYWRkcmVzc10tPnBhY2thZ2VdLT5uYW1lXSkgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwkJcHJvYmVfYWRkcmVzcyAtPSBwcm9iZV9kZWNyZW1lbnQ7CisJCWlmICgoaW50KXByb2JlX2FkZHJlc3MgPCAwKSB7CisJCQlwcm9iZV9hZGRyZXNzICs9IFNUQVRVU19IQVNIX1BSSU1FOworCQl9CisJfQorCXJldHVybiBwcm9iZV9hZGRyZXNzOworfQorCitzdGF0aWMgaW50IG9yZGVyKGNoYXIgeCkKK3sKKwlyZXR1cm4gKHggPT0gJ34nID8gLTEKKwkJOiB4ID09ICdcMCcgPyAwCisJCTogaXNkaWdpdCh4KSA/IDAKKwkJOiBpc2FscGhhKHgpID8geAorCQk6ICh1bnNpZ25lZCBjaGFyKXggKyAyNTYKKwkpOworfQorCisvKiBUaGlzIGNvZGUgaXMgdGFrZW4gZnJvbSBkcGtnIGFuZCBtb2RpZmllZCBzbGlnaHRseSB0byB3b3JrIHdpdGggYnVzeWJveCAqLworc3RhdGljIGludCB2ZXJzaW9uX2NvbXBhcmVfcGFydChjb25zdCBjaGFyICp2YWwsIGNvbnN0IGNoYXIgKnJlZikKK3sKKwlpZiAoIXZhbCkgdmFsID0gIiI7CisJaWYgKCFyZWYpIHJlZiA9ICIiOworCisJd2hpbGUgKCp2YWwgfHwgKnJlZikgeworCQlpbnQgZmlyc3RfZGlmZjsKKworCQl3aGlsZSAoKCp2YWwgJiYgIWlzZGlnaXQoKnZhbCkpIHx8ICgqcmVmICYmICFpc2RpZ2l0KCpyZWYpKSkgeworCQkJaW50IHZjID0gb3JkZXIoKnZhbCk7CisJCQlpbnQgcmMgPSBvcmRlcigqcmVmKTsKKwkJCWlmICh2YyAhPSByYykKKwkJCQlyZXR1cm4gdmMgLSByYzsKKwkJCXZhbCsrOworCQkJcmVmKys7CisJCX0KKworCQl3aGlsZSAoKnZhbCA9PSAnMCcpCisJCQl2YWwrKzsKKwkJd2hpbGUgKCpyZWYgPT0gJzAnKQorCQkJcmVmKys7CisKKwkJZmlyc3RfZGlmZiA9IDA7CisJCXdoaWxlIChpc2RpZ2l0KCp2YWwpICYmIGlzZGlnaXQoKnJlZikpIHsKKwkJCWlmIChmaXJzdF9kaWZmID09IDApCisJCQkJZmlyc3RfZGlmZiA9ICp2YWwgLSAqcmVmOworCQkJdmFsKys7CisJCQlyZWYrKzsKKwkJfQorCQlpZiAoaXNkaWdpdCgqdmFsKSkKKwkJCXJldHVybiAxOworCQlpZiAoaXNkaWdpdCgqcmVmKSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKGZpcnN0X2RpZmYpCisJCQlyZXR1cm4gZmlyc3RfZGlmZjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGlmIHZlcjEgPCB2ZXIyIHJldHVybiAtMSwKKyAqIGlmIHZlcjEgPSB2ZXIyIHJldHVybiAwLAorICogaWYgdmVyMSA+IHZlcjIgcmV0dXJuIDEsCisgKi8KK3N0YXRpYyBpbnQgdmVyc2lvbl9jb21wYXJlKGNvbnN0IHVuc2lnbmVkIHZlcjEsIGNvbnN0IHVuc2lnbmVkIHZlcjIpCit7CisJY2hhciAqY2hfdmVyMSA9IG5hbWVfaGFzaHRhYmxlW3ZlcjFdOworCWNoYXIgKmNoX3ZlcjIgPSBuYW1lX2hhc2h0YWJsZVt2ZXIyXTsKKwl1bnNpZ25lZCBlcG9jaDEgPSAwLCBlcG9jaDIgPSAwOworCWNoYXIgKmNvbG9uOworCWNoYXIgKmRlYl92ZXIxLCAqZGViX3ZlcjI7CisJY2hhciAqdXBzdHJlYW1fdmVyMTsKKwljaGFyICp1cHN0cmVhbV92ZXIyOworCWludCByZXN1bHQ7CisKKwkvKiBDb21wYXJlIGVwb2NoICovCisJY29sb24gPSBzdHJjaHIoY2hfdmVyMSwgJzonKTsKKwlpZiAoY29sb24pIHsKKwkJZXBvY2gxID0gYXRvaShjaF92ZXIxKTsKKwkJY2hfdmVyMSA9IGNvbG9uICsgMTsKKwl9CisJY29sb24gPSBzdHJjaHIoY2hfdmVyMiwgJzonKTsKKwlpZiAoY29sb24pIHsKKwkJZXBvY2gyID0gYXRvaShjaF92ZXIyKTsKKwkJY2hfdmVyMiA9IGNvbG9uICsgMTsKKwl9CisJaWYgKGVwb2NoMSA8IGVwb2NoMikgeworCQlyZXR1cm4gLTE7CisJfQorCWlmIChlcG9jaDEgPiBlcG9jaDIpIHsKKwkJcmV0dXJuIDE7CisJfQorCisJLyogQ29tcGFyZSB1cHN0cmVhbSB2ZXJzaW9uICovCisJdXBzdHJlYW1fdmVyMSA9IHhzdHJkdXAoY2hfdmVyMSk7CisJdXBzdHJlYW1fdmVyMiA9IHhzdHJkdXAoY2hfdmVyMik7CisKKwkvKiBDaG9wIG9mZiBkZWJpYW4gdmVyc2lvbiwgYW5kIHN0b3JlIGZvciBsYXRlciB1c2UgKi8KKwlkZWJfdmVyMSA9IHN0cnJjaHIodXBzdHJlYW1fdmVyMSwgJy0nKTsKKwlkZWJfdmVyMiA9IHN0cnJjaHIodXBzdHJlYW1fdmVyMiwgJy0nKTsKKwlpZiAoZGViX3ZlcjEpIHsKKwkJKmRlYl92ZXIxKysgPSAnXDAnOworCX0KKwlpZiAoZGViX3ZlcjIpIHsKKwkJKmRlYl92ZXIyKysgPSAnXDAnOworCX0KKwlyZXN1bHQgPSB2ZXJzaW9uX2NvbXBhcmVfcGFydCh1cHN0cmVhbV92ZXIxLCB1cHN0cmVhbV92ZXIyKTsKKwlpZiAocmVzdWx0ID09IDApIHsKKwkJLyogQ29tcGFyZSBkZWJpYW4gdmVyc2lvbnMgKi8KKwkJcmVzdWx0ID0gdmVyc2lvbl9jb21wYXJlX3BhcnQoZGViX3ZlcjEsIGRlYl92ZXIyKTsKKwl9CisKKwlmcmVlKHVwc3RyZWFtX3ZlcjEpOworCWZyZWUodXBzdHJlYW1fdmVyMik7CisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGludCB0ZXN0X3ZlcnNpb24oY29uc3QgdW5zaWduZWQgdmVyc2lvbjEsIGNvbnN0IHVuc2lnbmVkIHZlcnNpb24yLCBjb25zdCB1bnNpZ25lZCBvcGVyYXRvcikKK3sKKwljb25zdCBpbnQgdmVyc2lvbl9yZXN1bHQgPSB2ZXJzaW9uX2NvbXBhcmUodmVyc2lvbjEsIHZlcnNpb24yKTsKKwlzd2l0Y2ggKG9wZXJhdG9yKSB7CisJY2FzZSBWRVJfQU5ZOgorCQlyZXR1cm4gVFJVRTsKKwljYXNlIFZFUl9FUVVBTDoKKwkJcmV0dXJuICh2ZXJzaW9uX3Jlc3VsdCA9PSAwKTsKKwljYXNlIFZFUl9MRVNTOgorCQlyZXR1cm4gKHZlcnNpb25fcmVzdWx0IDwgMCk7CisJY2FzZSBWRVJfTEVTU19FUVVBTDoKKwkJcmV0dXJuICh2ZXJzaW9uX3Jlc3VsdCA8PSAwKTsKKwljYXNlIFZFUl9NT1JFOgorCQlyZXR1cm4gKHZlcnNpb25fcmVzdWx0ID4gMCk7CisJY2FzZSBWRVJfTU9SRV9FUVVBTDoKKwkJcmV0dXJuICh2ZXJzaW9uX3Jlc3VsdCA+PSAwKTsKKwl9CisJcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50IHNlYXJjaF9wYWNrYWdlX2hhc2h0YWJsZShjb25zdCB1bnNpZ25lZCBuYW1lLCBjb25zdCB1bnNpZ25lZCB2ZXJzaW9uLCBjb25zdCB1bnNpZ25lZCBvcGVyYXRvcikKK3sKKwl1bnNpZ25lZCBwcm9iZV9hZGRyZXNzOworCXVuc2lnbmVkIHByb2JlX2RlY3JlbWVudDsKKworCW1ha2VfaGFzaChuYW1lX2hhc2h0YWJsZVtuYW1lXSwgJnByb2JlX2FkZHJlc3MsICZwcm9iZV9kZWNyZW1lbnQsIFBBQ0tBR0VfSEFTSF9QUklNRSk7CisJd2hpbGUgKHBhY2thZ2VfaGFzaHRhYmxlW3Byb2JlX2FkZHJlc3NdICE9IE5VTEwpIHsKKwkJaWYgKHBhY2thZ2VfaGFzaHRhYmxlW3Byb2JlX2FkZHJlc3NdLT5uYW1lID09IG5hbWUpIHsKKwkJCWlmIChvcGVyYXRvciA9PSBWRVJfQU5ZKSB7CisJCQkJcmV0dXJuIHByb2JlX2FkZHJlc3M7CisJCQl9CisJCQlpZiAodGVzdF92ZXJzaW9uKHBhY2thZ2VfaGFzaHRhYmxlW3Byb2JlX2FkZHJlc3NdLT52ZXJzaW9uLCB2ZXJzaW9uLCBvcGVyYXRvcikpIHsKKwkJCQlyZXR1cm4gcHJvYmVfYWRkcmVzczsKKwkJCX0KKwkJfQorCQlwcm9iZV9hZGRyZXNzIC09IHByb2JlX2RlY3JlbWVudDsKKwkJaWYgKChpbnQpcHJvYmVfYWRkcmVzcyA8IDApIHsKKwkJCXByb2JlX2FkZHJlc3MgKz0gUEFDS0FHRV9IQVNIX1BSSU1FOworCQl9CisJfQorCXJldHVybiBwcm9iZV9hZGRyZXNzOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyB0aHJvdWdoIHRoZSBlbnRpcmUgcGFja2FnZV9oYXNodGFibGUgbG9va2luZworICogZm9yIGEgcGFja2FnZSB3aGljaCBwcm92aWRlcyAibmVlZGxlIi4gSXQgcmV0dXJucyB0aGUgaW5kZXggaW50bworICogdGhlIHBhY2thZ2VfaGFzaHRhYmxlIGZvciB0aGUgcHJvdmlkaW5nIHBhY2thZ2UuCisgKgorICogbmVlZGxlIGlzIHRoZSBpbmRleCBpbnRvIG5hbWVfaGFzaHRhYmxlIG9mIHRoZSBwYWNrYWdlIHdlIGFyZQorICogbG9va2luZyBmb3IuCisgKgorICogc3RhcnRfYXQgaXMgdGhlIGluZGV4IGluIHRoZSBwYWNrYWdlX2hhc2h0YWJsZSB0byBzdGFydCBsb29raW5nCisgKiBhdC4gSWYgc3RhcnRfYXQgaXMgLTEgdGhlbiBzdGFydCBhdCB0aGUgYmVnaW5uaW5nLiBUaGlzIGlzIHRvIGFsbG93CisgKiBmb3IgcmVwZWF0ZWQgc2VhcmNoZXMgc2luY2UgbW9yZSB0aGFuIG9uZSBwYWNrYWdlIG1pZ2h0IHByb3ZpZGUKKyAqIG5lZWRsZS4KKyAqCisgKiBGSVhNRTogSSBkb24ndCB0aGluayB0aGlzIGlzIHZlcnkgZWZmaWNpZW50LCBidXQgSSB0aG91Z2h0IEknZCBrZWVwCisgKiBpdCBzaW1wbGUgZm9yIG5vdyB1bnRpbCBpdCBwcm92ZXMgdG8gYmUgYSBwcm9ibGVtLgorICovCitzdGF0aWMgaW50IHNlYXJjaF9mb3JfcHJvdmlkZXMoaW50IG5lZWRsZSwgaW50IHN0YXJ0X2F0KQoreworCWludCBpLCBqOworCWNvbW1vbl9ub2RlX3QgKnA7CisJZm9yIChpID0gc3RhcnRfYXQgKyAxOyBpIDwgUEFDS0FHRV9IQVNIX1BSSU1FOyBpKyspIHsKKwkJcCA9IHBhY2thZ2VfaGFzaHRhYmxlW2ldOworCQlpZiAocCA9PSBOVUxMKQorCQkJY29udGludWU7CisJCWZvciAoaiA9IDA7IGogPCBwLT5udW1fb2ZfZWRnZXM7IGorKykKKwkJCWlmIChwLT5lZGdlW2pdLT50eXBlID09IEVER0VfUFJPVklERVMgJiYgcC0+ZWRnZVtqXS0+bmFtZSA9PSBuZWVkbGUpCisJCQkJcmV0dXJuIGk7CisJfQorCXJldHVybiAtMTsKK30KKworLyoKKyAqIEFkZCBhbiBlZGdlIHRvIGEgbm9kZQorICovCitzdGF0aWMgdm9pZCBhZGRfZWRnZV90b19ub2RlKGNvbW1vbl9ub2RlX3QgKm5vZGUsIGVkZ2VfdCAqZWRnZSkKK3sKKwlub2RlLT5lZGdlID0geHJlYWxsb2NfdmVjdG9yKG5vZGUtPmVkZ2UsIDIsIG5vZGUtPm51bV9vZl9lZGdlcyk7CisJbm9kZS0+ZWRnZVtub2RlLT5udW1fb2ZfZWRnZXMrK10gPSBlZGdlOworfQorCisvKgorICogQ3JlYXRlIG9uZSBuZXcgbm9kZSBhbmQgb25lIG5ldyBlZGdlIGZvciBldmVyeSBkZXBlbmRlbmN5LgorICoKKyAqIERlcGVuZGVuY2llcyB3aGljaCBjb250YWluIG11bHRpcGxlIGFsdGVybmF0aXZlcyBhcmUgcmVwcmVzZW50ZWQgYXMKKyAqIGFuIEVER0VfT1JfUFJFX0RFUEVORFMgb3IgRURHRV9PUl9ERVBFTkRTIG5vZGUsIGZvbGxvd2VkIGJ5IGEKKyAqIG51bWJlciBvZiBFREdFX1BSRV9ERVBFTkRTIG9yIEVER0VfREVQRU5EUyBub2Rlcy4gVGhlIG5hbWUgZmllbGQgb2YKKyAqIHRoZSBPUiBlZGdlIGNvbnRhaW5zIHRoZSBmdWxsIGRlcGVuZGVuY3kgc3RyaW5nIHdoaWxlIHRoZSB2ZXJzaW9uCisgKiBmaWVsZCBjb250YWlucyB0aGUgbnVtYmVyIG9mIEVER0Ugbm9kZXMgd2hpY2ggZm9sbG93IGFzIHBhcnQgb2YKKyAqIHRoaXMgYWx0ZXJuYXRpdmUuCisgKi8KK3N0YXRpYyB2b2lkIGFkZF9zcGxpdF9kZXBlbmRlbmNpZXMoY29tbW9uX25vZGVfdCAqcGFyZW50X25vZGUsIGNvbnN0IGNoYXIgKndob2xlX2xpbmUsIHVuc2lnbmVkIGVkZ2VfdHlwZSkKK3sKKwljaGFyICpsaW5lID0geHN0cmR1cCh3aG9sZV9saW5lKTsKKwljaGFyICpsaW5lMjsKKwljaGFyICpsaW5lX3B0cjEgPSBOVUxMOworCWNoYXIgKmxpbmVfcHRyMiA9IE5VTEw7CisJY2hhciAqZmllbGQ7CisJY2hhciAqZmllbGQyOworCWNoYXIgKnZlcnNpb247CisJZWRnZV90ICplZGdlOworCWVkZ2VfdCAqb3JfZWRnZTsKKwlpbnQgb2Zmc2V0X2NoOworCisJZmllbGQgPSBzdHJ0b2tfcihsaW5lLCAiLCIsICZsaW5lX3B0cjEpOworCWRvIHsKKwkJLyogc2tpcCBsZWFkaW5nIHNwYWNlcyAqLworCQlmaWVsZCArPSBzdHJzcG4oZmllbGQsICIgIik7CisJCWxpbmUyID0geHN0cmR1cChmaWVsZCk7CisJCWZpZWxkMiA9IHN0cnRva19yKGxpbmUyLCAifCIsICZsaW5lX3B0cjIpOworCQlvcl9lZGdlID0gTlVMTDsKKwkJaWYgKChlZGdlX3R5cGUgPT0gRURHRV9ERVBFTkRTIHx8IGVkZ2VfdHlwZSA9PSBFREdFX1BSRV9ERVBFTkRTKQorCQkgJiYgKHN0cmNtcChmaWVsZCwgZmllbGQyKSAhPSAwKQorCQkpIHsKKwkJCW9yX2VkZ2UgPSB4emFsbG9jKHNpemVvZihlZGdlX3QpKTsKKwkJCW9yX2VkZ2UtPnR5cGUgPSBlZGdlX3R5cGUgKyAxOworCQkJb3JfZWRnZS0+bmFtZSA9IHNlYXJjaF9uYW1lX2hhc2h0YWJsZShmaWVsZCk7CisJCQkvL29yX2VkZ2UtPnZlcnNpb24gPSAwOyAvLyB0cmFja3MgdGhlIG51bWJlciBvZiBhbHRlcm5hdGl2ZXMKKwkJCWFkZF9lZGdlX3RvX25vZGUocGFyZW50X25vZGUsIG9yX2VkZ2UpOworCQl9CisKKwkJZG8geworCQkJZWRnZSA9IHhtYWxsb2Moc2l6ZW9mKGVkZ2VfdCkpOworCQkJZWRnZS0+dHlwZSA9IGVkZ2VfdHlwZTsKKworCQkJLyogU2tpcCBhbnkgZXh0cmEgbGVhZGluZyBzcGFjZXMgKi8KKwkJCWZpZWxkMiArPSBzdHJzcG4oZmllbGQyLCAiICIpOworCisJCQkvKiBHZXQgZGVwZW5kZW5jeSB2ZXJzaW9uIGluZm8gKi8KKwkJCXZlcnNpb24gPSBzdHJjaHIoZmllbGQyLCAnKCcpOworCQkJaWYgKHZlcnNpb24gPT0gTlVMTCkgeworCQkJCWVkZ2UtPm9wZXJhdG9yID0gVkVSX0FOWTsKKwkJCQkvKiBHZXQgdGhlIHZlcnNpb25zIGhhc2ggbnVtYmVyLCBhZGRpbmcgaXQgaWYgdGhlIG51bWJlciBpc250IGFscmVhZHkgaW4gdGhlcmUgKi8KKwkJCQllZGdlLT52ZXJzaW9uID0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKCJBTlkiKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogU2tpcCBsZWFkaW5nICcgJyBvciAnKCcgKi8KKwkJCQl2ZXJzaW9uICs9IHN0cnNwbih2ZXJzaW9uLCAiICgiKTsKKwkJCQkvKiBDYWxjdWxhdGUgbGVuZ3RoIG9mIGFueSBvcGVyYXRvciBjaGFyYWN0ZXJzICovCisJCQkJb2Zmc2V0X2NoID0gc3Ryc3BuKHZlcnNpb24sICI8PT4iKTsKKwkJCQkvKiBEZXRlcm1pbmUgb3BlcmF0b3IgKi8KKwkJCQlpZiAob2Zmc2V0X2NoID4gMCkgeworCQkJCQlpZiAoc3RybmNtcCh2ZXJzaW9uLCAiPSIsIG9mZnNldF9jaCkgPT0gMCkgeworCQkJCQkJZWRnZS0+b3BlcmF0b3IgPSBWRVJfRVFVQUw7CisJCQkJCX0gZWxzZSBpZiAoc3RybmNtcCh2ZXJzaW9uLCAiPDwiLCBvZmZzZXRfY2gpID09IDApIHsKKwkJCQkJCWVkZ2UtPm9wZXJhdG9yID0gVkVSX0xFU1M7CisJCQkJCX0gZWxzZSBpZiAoc3RybmNtcCh2ZXJzaW9uLCAiPD0iLCBvZmZzZXRfY2gpID09IDApIHsKKwkJCQkJCWVkZ2UtPm9wZXJhdG9yID0gVkVSX0xFU1NfRVFVQUw7CisJCQkJCX0gZWxzZSBpZiAoc3RybmNtcCh2ZXJzaW9uLCAiPj4iLCBvZmZzZXRfY2gpID09IDApIHsKKwkJCQkJCWVkZ2UtPm9wZXJhdG9yID0gVkVSX01PUkU7CisJCQkJCX0gZWxzZSBpZiAoc3RybmNtcCh2ZXJzaW9uLCAiPj0iLCBvZmZzZXRfY2gpID09IDApIHsKKwkJCQkJCWVkZ2UtPm9wZXJhdG9yID0gVkVSX01PUkVfRVFVQUw7CisJCQkJCX0gZWxzZSB7CisJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaWxsZWdhbCBvcGVyYXRvciIpOworCQkJCQl9CisJCQkJfQorCQkJCS8qIHNraXAgdG8gc3RhcnQgb2YgdmVyc2lvbiBudW1iZXJzICovCisJCQkJdmVyc2lvbiArPSBvZmZzZXRfY2g7CisJCQkJdmVyc2lvbiArPSBzdHJzcG4odmVyc2lvbiwgIiAiKTsKKworCQkJCS8qIFRydW5jYXRlIHZlcnNpb24gYXQgdHJhaWxpbmcgJyAnIG9yICcpJyAqLworCQkJCXZlcnNpb25bc3RyY3Nwbih2ZXJzaW9uLCAiICkiKV0gPSAnXDAnOworCQkJCS8qIEdldCB0aGUgdmVyc2lvbnMgaGFzaCBudW1iZXIsIGFkZGluZyBpdCBpZiB0aGUgbnVtYmVyIGlzbnQgYWxyZWFkeSBpbiB0aGVyZSAqLworCQkJCWVkZ2UtPnZlcnNpb24gPSBzZWFyY2hfbmFtZV9oYXNodGFibGUodmVyc2lvbik7CisJCQl9CisKKwkJCS8qIEdldCB0aGUgZGVwZW5kZW5jeSBuYW1lICovCisJCQlmaWVsZDJbc3RyY3NwbihmaWVsZDIsICIgKCIpXSA9ICdcMCc7CisJCQllZGdlLT5uYW1lID0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKGZpZWxkMik7CisKKwkJCWlmIChvcl9lZGdlKQorCQkJCW9yX2VkZ2UtPnZlcnNpb24rKzsKKworCQkJYWRkX2VkZ2VfdG9fbm9kZShwYXJlbnRfbm9kZSwgZWRnZSk7CisJCQlmaWVsZDIgPSBzdHJ0b2tfcihOVUxMLCAifCIsICZsaW5lX3B0cjIpOworCQl9IHdoaWxlIChmaWVsZDIgIT0gTlVMTCk7CisKKwkJZnJlZShsaW5lMik7CisJCWZpZWxkID0gc3RydG9rX3IoTlVMTCwgIiwiLCAmbGluZV9wdHIxKTsKKwl9IHdoaWxlIChmaWVsZCAhPSBOVUxMKTsKKworCWZyZWUobGluZSk7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcGFja2FnZShjb21tb25fbm9kZV90ICpub2RlKQoreworCXVuc2lnbmVkIGk7CisJaWYgKG5vZGUpIHsKKwkJZm9yIChpID0gMDsgaSA8IG5vZGUtPm51bV9vZl9lZGdlczsgaSsrKSB7CisJCQlmcmVlKG5vZGUtPmVkZ2VbaV0pOworCQl9CisJCWZyZWUobm9kZS0+ZWRnZSk7CisJCWZyZWUobm9kZSk7CisJfQorfQorCisvKgorICogR2V0cyB0aGUgbmV4dCBwYWNrYWdlIGZpZWxkIGZyb20gcGFja2FnZV9idWZmZXIsIHNlcGFyYXRlZCBpbnRvIHRoZSBmaWVsZCBuYW1lCisgKiBhbmQgZmllbGQgdmFsdWUsIGl0IHJldHVybnMgdGhlIGludCBvZmZzZXQgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgbmV4dCBmaWVsZAorICovCitzdGF0aWMgaW50IHJlYWRfcGFja2FnZV9maWVsZChjb25zdCBjaGFyICpwYWNrYWdlX2J1ZmZlciwgY2hhciAqKmZpZWxkX25hbWUsIGNoYXIgKipmaWVsZF92YWx1ZSkKK3sKKwlpbnQgb2Zmc2V0X25hbWVfc3RhcnQgPSAwOworCWludCBvZmZzZXRfbmFtZV9lbmQgPSAwOworCWludCBvZmZzZXRfdmFsdWVfc3RhcnQgPSAwOworCWludCBvZmZzZXRfdmFsdWVfZW5kID0gMDsKKwlpbnQgb2Zmc2V0ID0gMDsKKwlpbnQgbmV4dF9vZmZzZXQ7CisJaW50IG5hbWVfbGVuZ3RoOworCWludCB2YWx1ZV9sZW5ndGg7CisJaW50IGV4aXRfZmxhZyA9IEZBTFNFOworCisJaWYgKHBhY2thZ2VfYnVmZmVyID09IE5VTEwpIHsKKwkJKmZpZWxkX25hbWUgPSBOVUxMOworCQkqZmllbGRfdmFsdWUgPSBOVUxMOworCQlyZXR1cm4gLTE7CisJfQorCXdoaWxlICgxKSB7CisJCW5leHRfb2Zmc2V0ID0gb2Zmc2V0ICsgMTsKKwkJc3dpdGNoIChwYWNrYWdlX2J1ZmZlcltvZmZzZXRdKSB7CisJCQljYXNlICdcMCc6CisJCQkJZXhpdF9mbGFnID0gVFJVRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJzonOgorCQkJCWlmIChvZmZzZXRfbmFtZV9lbmQgPT0gMCkgeworCQkJCQlvZmZzZXRfbmFtZV9lbmQgPSBvZmZzZXQ7CisJCQkJCW9mZnNldF92YWx1ZV9zdGFydCA9IG5leHRfb2Zmc2V0OworCQkJCX0KKwkJCQkvKiBUT0RPOiBOYW1lIG1pZ2h0IHN0aWxsIGhhdmUgdHJhaWxpbmcgc3BhY2VzIGlmICc6JyBpc250CisJCQkJICogaW1tZWRpYXRlbHkgYWZ0ZXIgbmFtZSAqLworCQkJCWJyZWFrOworCQkJY2FzZSAnXG4nOgorCQkJCS8qIFRPRE86IFRoZSBjaGFyIG5leHRfb2Zmc2V0IG1heSBiZSBvdXQgb2YgYm91bmRzICovCisJCQkJaWYgKHBhY2thZ2VfYnVmZmVyW25leHRfb2Zmc2V0XSAhPSAnICcpIHsKKwkJCQkJZXhpdF9mbGFnID0gVFJVRTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJY2FzZSAnXHQnOgorCQkJY2FzZSAnICc6CisJCQkJLyogaW5jcmVtZW50IHRoZSB2YWx1ZSBzdGFydCBwb2ludCBpZiBpdHMgYSBqdXN0IGZpbGxlciAqLworCQkJCWlmIChvZmZzZXRfbmFtZV9zdGFydCA9PSBvZmZzZXQpIHsKKwkJCQkJb2Zmc2V0X25hbWVfc3RhcnQrKzsKKwkJCQl9CisJCQkJaWYgKG9mZnNldF92YWx1ZV9zdGFydCA9PSBvZmZzZXQpIHsKKwkJCQkJb2Zmc2V0X3ZhbHVlX3N0YXJ0Kys7CisJCQkJfQorCQkJCWJyZWFrOworCQl9CisJCWlmIChleGl0X2ZsYWcpIHsKKwkJCS8qIENoZWNrIHRoYXQgdGhlIG5hbWVzIGFyZSB2YWxpZCAqLworCQkJb2Zmc2V0X3ZhbHVlX2VuZCA9IG9mZnNldDsKKwkJCW5hbWVfbGVuZ3RoID0gb2Zmc2V0X25hbWVfZW5kIC0gb2Zmc2V0X25hbWVfc3RhcnQ7CisJCQl2YWx1ZV9sZW5ndGggPSBvZmZzZXRfdmFsdWVfZW5kIC0gb2Zmc2V0X3ZhbHVlX3N0YXJ0OworCQkJaWYgKG5hbWVfbGVuZ3RoID09IDApIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICgobmFtZV9sZW5ndGggPiAwKSAmJiAodmFsdWVfbGVuZ3RoID4gMCkpIHsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogSWYgbm90IHZhbGlkLCBzdGFydCBmcmVzaCB3aXRoIG5leHQgZmllbGQgKi8KKwkJCWV4aXRfZmxhZyA9IEZBTFNFOworCQkJb2Zmc2V0X25hbWVfc3RhcnQgPSBvZmZzZXQgKyAxOworCQkJb2Zmc2V0X25hbWVfZW5kID0gMDsKKwkJCW9mZnNldF92YWx1ZV9zdGFydCA9IG9mZnNldCArIDE7CisJCQlvZmZzZXRfdmFsdWVfZW5kID0gb2Zmc2V0ICsgMTsKKwkJCW9mZnNldCsrOworCQl9CisJCW9mZnNldCsrOworCX0KKwkqZmllbGRfbmFtZSA9IE5VTEw7CisJaWYgKG5hbWVfbGVuZ3RoKSB7CisJCSpmaWVsZF9uYW1lID0geHN0cm5kdXAoJnBhY2thZ2VfYnVmZmVyW29mZnNldF9uYW1lX3N0YXJ0XSwgbmFtZV9sZW5ndGgpOworCX0KKwkqZmllbGRfdmFsdWUgPSBOVUxMOworCWlmICh2YWx1ZV9sZW5ndGggPiAwKSB7CisJCSpmaWVsZF92YWx1ZSA9IHhzdHJuZHVwKCZwYWNrYWdlX2J1ZmZlcltvZmZzZXRfdmFsdWVfc3RhcnRdLCB2YWx1ZV9sZW5ndGgpOworCX0KKwlyZXR1cm4gbmV4dF9vZmZzZXQ7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBmaWxsX3BhY2thZ2Vfc3RydWN0KGNoYXIgKmNvbnRyb2xfYnVmZmVyKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGZpZWxkX25hbWVzW10gQUxJR04xID0KKwkJIlBhY2thZ2VcMCIiVmVyc2lvblwwIgorCQkiUHJlLURlcGVuZHNcMCIiRGVwZW5kc1wwIiJSZXBsYWNlc1wwIiJQcm92aWRlc1wwIgorCQkiQ29uZmxpY3RzXDAiIlN1Z2dlc3RzXDAiIlJlY29tbWVuZHNcMCIiRW5oYW5jZXNcMCI7CisKKwljb21tb25fbm9kZV90ICpuZXdfbm9kZSA9IHh6YWxsb2Moc2l6ZW9mKGNvbW1vbl9ub2RlX3QpKTsKKwljaGFyICpmaWVsZF9uYW1lOworCWNoYXIgKmZpZWxkX3ZhbHVlOworCWludCBmaWVsZF9zdGFydCA9IDA7CisJaW50IG51bSA9IC0xOworCWludCBidWZmZXJfbGVuZ3RoID0gc3RybGVuKGNvbnRyb2xfYnVmZmVyKTsKKworCW5ld19ub2RlLT52ZXJzaW9uID0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKCJ1bmtub3duIik7CisJd2hpbGUgKGZpZWxkX3N0YXJ0IDwgYnVmZmVyX2xlbmd0aCkgeworCQl1bnNpZ25lZCBmaWVsZF9udW07CisKKwkJZmllbGRfc3RhcnQgKz0gcmVhZF9wYWNrYWdlX2ZpZWxkKCZjb250cm9sX2J1ZmZlcltmaWVsZF9zdGFydF0sCisJCQkJJmZpZWxkX25hbWUsICZmaWVsZF92YWx1ZSk7CisKKwkJaWYgKGZpZWxkX25hbWUgPT0gTlVMTCkgeworCQkJZ290byBmaWxsX3BhY2thZ2Vfc3RydWN0X2NsZWFudXA7CisJCX0KKworCQlmaWVsZF9udW0gPSBpbmRleF9pbl9zdHJpbmdzKGZpZWxkX25hbWVzLCBmaWVsZF9uYW1lKTsKKwkJc3dpdGNoIChmaWVsZF9udW0pIHsKKwkJY2FzZSAwOiAvKiBQYWNrYWdlICovCisJCQluZXdfbm9kZS0+bmFtZSA9IHNlYXJjaF9uYW1lX2hhc2h0YWJsZShmaWVsZF92YWx1ZSk7CisJCQlicmVhazsKKwkJY2FzZSAxOiAvKiBWZXJzaW9uICovCisJCQluZXdfbm9kZS0+dmVyc2lvbiA9IHNlYXJjaF9uYW1lX2hhc2h0YWJsZShmaWVsZF92YWx1ZSk7CisJCQlicmVhazsKKwkJY2FzZSAyOiAvKiBQcmUtRGVwZW5kcyAqLworCQkJYWRkX3NwbGl0X2RlcGVuZGVuY2llcyhuZXdfbm9kZSwgZmllbGRfdmFsdWUsIEVER0VfUFJFX0RFUEVORFMpOworCQkJYnJlYWs7CisJCWNhc2UgMzogLyogRGVwZW5kcyAqLworCQkJYWRkX3NwbGl0X2RlcGVuZGVuY2llcyhuZXdfbm9kZSwgZmllbGRfdmFsdWUsIEVER0VfREVQRU5EUyk7CisJCQlicmVhazsKKwkJY2FzZSA0OiAvKiBSZXBsYWNlcyAqLworCQkJYWRkX3NwbGl0X2RlcGVuZGVuY2llcyhuZXdfbm9kZSwgZmllbGRfdmFsdWUsIEVER0VfUkVQTEFDRVMpOworCQkJYnJlYWs7CisJCWNhc2UgNTogLyogUHJvdmlkZXMgKi8KKwkJCWFkZF9zcGxpdF9kZXBlbmRlbmNpZXMobmV3X25vZGUsIGZpZWxkX3ZhbHVlLCBFREdFX1BST1ZJREVTKTsKKwkJCWJyZWFrOworCQljYXNlIDY6IC8qIENvbmZsaWN0cyAqLworCQkJYWRkX3NwbGl0X2RlcGVuZGVuY2llcyhuZXdfbm9kZSwgZmllbGRfdmFsdWUsIEVER0VfQ09ORkxJQ1RTKTsKKwkJCWJyZWFrOworCQljYXNlIDc6IC8qIFN1Z2dlc3RzICovCisJCQlhZGRfc3BsaXRfZGVwZW5kZW5jaWVzKG5ld19ub2RlLCBmaWVsZF92YWx1ZSwgRURHRV9TVUdHRVNUUyk7CisJCQlicmVhazsKKwkJY2FzZSA4OiAvKiBSZWNvbW1lbmRzICovCisJCQlhZGRfc3BsaXRfZGVwZW5kZW5jaWVzKG5ld19ub2RlLCBmaWVsZF92YWx1ZSwgRURHRV9SRUNPTU1FTkRTKTsKKwkJCWJyZWFrOworCQljYXNlIDk6IC8qIEVuaGFuY2VzICovCisJCQlhZGRfc3BsaXRfZGVwZW5kZW5jaWVzKG5ld19ub2RlLCBmaWVsZF92YWx1ZSwgRURHRV9FTkhBTkNFUyk7CisJCQlicmVhazsKKwkJfQorIGZpbGxfcGFja2FnZV9zdHJ1Y3RfY2xlYW51cDoKKwkJZnJlZShmaWVsZF9uYW1lKTsKKwkJZnJlZShmaWVsZF92YWx1ZSk7CisJfQorCisJaWYgKG5ld19ub2RlLT52ZXJzaW9uID09IHNlYXJjaF9uYW1lX2hhc2h0YWJsZSgidW5rbm93biIpKSB7CisJCWZyZWVfcGFja2FnZShuZXdfbm9kZSk7CisJCXJldHVybiAtMTsKKwl9CisJbnVtID0gc2VhcmNoX3BhY2thZ2VfaGFzaHRhYmxlKG5ld19ub2RlLT5uYW1lLCBuZXdfbm9kZS0+dmVyc2lvbiwgVkVSX0VRVUFMKTsKKwlmcmVlX3BhY2thZ2UocGFja2FnZV9oYXNodGFibGVbbnVtXSk7CisJcGFja2FnZV9oYXNodGFibGVbbnVtXSA9IG5ld19ub2RlOworCXJldHVybiBudW07Cit9CisKKy8qIGlmIG51bSA9IDEsIGl0IHJldHVybnMgdGhlIHdhbnQgc3RhdHVzLCAyIHJldHVybnMgZmxhZywgMyByZXR1cm5zIHN0YXR1cyAqLworc3RhdGljIHVuc2lnbmVkIGdldF9zdGF0dXMoY29uc3QgdW5zaWduZWQgc3RhdHVzX25vZGUsIGNvbnN0IGludCBudW0pCit7CisJY2hhciAqc3RhdHVzX3N0cmluZyA9IG5hbWVfaGFzaHRhYmxlW3N0YXR1c19oYXNodGFibGVbc3RhdHVzX25vZGVdLT5zdGF0dXNdOworCWNoYXIgKnN0YXRlX3N1Yl9zdHJpbmc7CisJdW5zaWduZWQgc3RhdGVfc3ViX251bTsKKwlpbnQgbGVuOworCWludCBpOworCisJLyogc2V0IHRtcF9zdHJpbmcgdG8gcG9pbnQgdG8gdGhlIHN0YXJ0IG9mIHRoZSB3b3JkIG51bWJlciAqLworCWZvciAoaSA9IDE7IGkgPCBudW07IGkrKykgeworCQkvKiBza2lwIHBhc3QgYSB3b3JkICovCisJCXN0YXR1c19zdHJpbmcgKz0gc3RyY3NwbihzdGF0dXNfc3RyaW5nLCAiICIpOworCQkvKiBza2lwIHBhc3QgdGhlIHNlcGFyYXRpbmcgc3BhY2VzICovCisJCXN0YXR1c19zdHJpbmcgKz0gc3Ryc3BuKHN0YXR1c19zdHJpbmcsICIgIik7CisJfQorCWxlbiA9IHN0cmNzcG4oc3RhdHVzX3N0cmluZywgIiBcbiIpOworCXN0YXRlX3N1Yl9zdHJpbmcgPSB4c3RybmR1cChzdGF0dXNfc3RyaW5nLCBsZW4pOworCXN0YXRlX3N1Yl9udW0gPSBzZWFyY2hfbmFtZV9oYXNodGFibGUoc3RhdGVfc3ViX3N0cmluZyk7CisJZnJlZShzdGF0ZV9zdWJfc3RyaW5nKTsKKwlyZXR1cm4gc3RhdGVfc3ViX251bTsKK30KKworc3RhdGljIHZvaWQgc2V0X3N0YXR1cyhjb25zdCB1bnNpZ25lZCBzdGF0dXNfbm9kZV9udW0sIGNvbnN0IGNoYXIgKm5ld192YWx1ZSwgY29uc3QgaW50IHBvc2l0aW9uKQoreworCWNvbnN0IHVuc2lnbmVkIG5ld192YWx1ZV9udW0gPSBzZWFyY2hfbmFtZV9oYXNodGFibGUobmV3X3ZhbHVlKTsKKwl1bnNpZ25lZCB3YW50ID0gZ2V0X3N0YXR1cyhzdGF0dXNfbm9kZV9udW0sIDEpOworCXVuc2lnbmVkIGZsYWcgPSBnZXRfc3RhdHVzKHN0YXR1c19ub2RlX251bSwgMik7CisJdW5zaWduZWQgc3RhdHVzID0gZ2V0X3N0YXR1cyhzdGF0dXNfbm9kZV9udW0sIDMpOworCWNoYXIgKm5ld19zdGF0dXM7CisKKwlzd2l0Y2ggKHBvc2l0aW9uKSB7CisJCWNhc2UgMToKKwkJCXdhbnQgPSBuZXdfdmFsdWVfbnVtOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWZsYWcgPSBuZXdfdmFsdWVfbnVtOworCQkJYnJlYWs7CisJCWNhc2UgMzoKKwkJCXN0YXR1cyA9IG5ld192YWx1ZV9udW07CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJERUJVRyBPTkxZOiB0aGlzIHNob3VsZG50IGhhcHBlbiIpOworCX0KKworCW5ld19zdGF0dXMgPSB4YXNwcmludGYoIiVzICVzICVzIiwgbmFtZV9oYXNodGFibGVbd2FudF0sIG5hbWVfaGFzaHRhYmxlW2ZsYWddLCBuYW1lX2hhc2h0YWJsZVtzdGF0dXNdKTsKKwlzdGF0dXNfaGFzaHRhYmxlW3N0YXR1c19ub2RlX251bV0tPnN0YXR1cyA9IHNlYXJjaF9uYW1lX2hhc2h0YWJsZShuZXdfc3RhdHVzKTsKKwlmcmVlKG5ld19zdGF0dXMpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZGVzY3JpYmVfc3RhdHVzKGludCBzdGF0dXNfbnVtKQoreworCWludCBzdGF0dXNfd2FudCwgc3RhdHVzX3N0YXRlOworCWlmIChzdGF0dXNfaGFzaHRhYmxlW3N0YXR1c19udW1dID09IE5VTEwgfHwgc3RhdHVzX2hhc2h0YWJsZVtzdGF0dXNfbnVtXS0+c3RhdHVzID09IDApCisJCXJldHVybiAiaXMgbm90IGluc3RhbGxlZCBvciBmbGFnZ2VkIHRvIGJlIGluc3RhbGxlZCI7CisKKwlzdGF0dXNfd2FudCA9IGdldF9zdGF0dXMoc3RhdHVzX251bSwgMSk7CisJc3RhdHVzX3N0YXRlID0gZ2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAzKTsKKworCWlmIChzdGF0dXNfc3RhdGUgPT0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKCJpbnN0YWxsZWQiKSkgeworCQlpZiAoc3RhdHVzX3dhbnQgPT0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKCJpbnN0YWxsIikpCisJCQlyZXR1cm4gImlzIGluc3RhbGxlZCI7CisJCWlmIChzdGF0dXNfd2FudCA9PSBzZWFyY2hfbmFtZV9oYXNodGFibGUoImRlaW5zdGFsbCIpKQorCQkJcmV0dXJuICJpcyBtYXJrZWQgdG8gYmUgcmVtb3ZlZCI7CisJCWlmIChzdGF0dXNfd2FudCA9PSBzZWFyY2hfbmFtZV9oYXNodGFibGUoInB1cmdlIikpCisJCQlyZXR1cm4gImlzIG1hcmtlZCB0byBiZSBwdXJnZWQiOworCX0KKwlpZiAoc3RhdHVzX3dhbnQgPT0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKCJ1bmtub3duIikpCisJCXJldHVybiAiaXMgaW4gYW4gaW5kZXRlcm1pbmF0ZSBzdGF0ZSI7CisJaWYgKHN0YXR1c193YW50ID09IHNlYXJjaF9uYW1lX2hhc2h0YWJsZSgiaW5zdGFsbCIpKQorCQlyZXR1cm4gImlzIG1hcmtlZCB0byBiZSBpbnN0YWxsZWQiOworCisJcmV0dXJuICJpcyBub3QgaW5zdGFsbGVkIG9yIGZsYWdnZWQgdG8gYmUgaW5zdGFsbGVkIjsKK30KKworc3RhdGljIHZvaWQgaW5kZXhfc3RhdHVzX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJRklMRSAqc3RhdHVzX2ZpbGU7CisJY2hhciAqY29udHJvbF9idWZmZXI7CisJY2hhciAqc3RhdHVzX2xpbmU7CisJc3RhdHVzX25vZGVfdCAqc3RhdHVzX25vZGUgPSBOVUxMOworCXVuc2lnbmVkIHN0YXR1c19udW07CisKKwlzdGF0dXNfZmlsZSA9IHhmb3Blbl9mb3JfcmVhZChmaWxlbmFtZSk7CisJd2hpbGUgKChjb250cm9sX2J1ZmZlciA9IHhtYWxsb2NfZmdldGxpbmVfc3RyKHN0YXR1c19maWxlLCAiXG5cbiIpKSAhPSBOVUxMKSB7CisJCWNvbnN0IHVuc2lnbmVkIHBhY2thZ2VfbnVtID0gZmlsbF9wYWNrYWdlX3N0cnVjdChjb250cm9sX2J1ZmZlcik7CisJCWlmIChwYWNrYWdlX251bSAhPSAtMSkgeworCQkJc3RhdHVzX25vZGUgPSB4bWFsbG9jKHNpemVvZihzdGF0dXNfbm9kZV90KSk7CisJCQkvKiBmaWxsX3BhY2thZ2Vfc3RydWN0IGRvZXNudCBoYW5kbGUgdGhlIHN0YXR1cyBmaWVsZCAqLworCQkJc3RhdHVzX2xpbmUgPSBzdHJzdHIoY29udHJvbF9idWZmZXIsICJTdGF0dXM6Iik7CisJCQlpZiAoc3RhdHVzX2xpbmUgIT0gTlVMTCkgeworCQkJCXN0YXR1c19saW5lICs9IDc7CisJCQkJc3RhdHVzX2xpbmUgKz0gc3Ryc3BuKHN0YXR1c19saW5lLCAiIFxuXHQiKTsKKwkJCQlzdGF0dXNfbGluZSA9IHhzdHJuZHVwKHN0YXR1c19saW5lLCBzdHJjc3BuKHN0YXR1c19saW5lLCAiXG4iKSk7CisJCQkJc3RhdHVzX25vZGUtPnN0YXR1cyA9IHNlYXJjaF9uYW1lX2hhc2h0YWJsZShzdGF0dXNfbGluZSk7CisJCQkJZnJlZShzdGF0dXNfbGluZSk7CisJCQl9CisJCQlzdGF0dXNfbm9kZS0+cGFja2FnZSA9IHBhY2thZ2VfbnVtOworCQkJc3RhdHVzX251bSA9IHNlYXJjaF9zdGF0dXNfaGFzaHRhYmxlKG5hbWVfaGFzaHRhYmxlW3BhY2thZ2VfaGFzaHRhYmxlW3N0YXR1c19ub2RlLT5wYWNrYWdlXS0+bmFtZV0pOworCQkJc3RhdHVzX2hhc2h0YWJsZVtzdGF0dXNfbnVtXSA9IHN0YXR1c19ub2RlOworCQl9CisJCWZyZWUoY29udHJvbF9idWZmZXIpOworCX0KKwlmY2xvc2Uoc3RhdHVzX2ZpbGUpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9idWZmZXJfbm9fc3RhdHVzKEZJTEUgKm5ld19zdGF0dXNfZmlsZSwgY29uc3QgY2hhciAqY29udHJvbF9idWZmZXIpCit7CisJY2hhciAqbmFtZTsKKwljaGFyICp2YWx1ZTsKKwlpbnQgc3RhcnQgPSAwOworCXdoaWxlICgxKSB7CisJCXN0YXJ0ICs9IHJlYWRfcGFja2FnZV9maWVsZCgmY29udHJvbF9idWZmZXJbc3RhcnRdLCAmbmFtZSwgJnZhbHVlKTsKKwkJaWYgKG5hbWUgPT0gTlVMTCkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHN0cmNtcChuYW1lLCAiU3RhdHVzIikgIT0gMCkgeworCQkJZnByaW50ZihuZXdfc3RhdHVzX2ZpbGUsICIlczogJXNcbiIsIG5hbWUsIHZhbHVlKTsKKwkJfQorCX0KK30KKworLyogVGhpcyBjb3VsZCBkbyB3aXRoIGEgY2xlYW51cCAqLworc3RhdGljIHZvaWQgd3JpdGVfc3RhdHVzX2ZpbGUoZGViX2ZpbGVfdCAqKmRlYl9maWxlKQoreworCUZJTEUgKm9sZF9zdGF0dXNfZmlsZSA9IHhmb3Blbl9mb3JfcmVhZCgiL3Zhci9saWIvZHBrZy9zdGF0dXMiKTsKKwlGSUxFICpuZXdfc3RhdHVzX2ZpbGUgPSB4Zm9wZW5fZm9yX3dyaXRlKCIvdmFyL2xpYi9kcGtnL3N0YXR1cy51ZGViIik7CisJY2hhciAqcGFja2FnZV9uYW1lOworCWNoYXIgKnN0YXR1c19mcm9tX2ZpbGU7CisJY2hhciAqY29udHJvbF9idWZmZXIgPSBOVUxMOworCWNoYXIgKnRtcF9zdHJpbmc7CisJaW50IHN0YXR1c19udW07CisJaW50IGZpZWxkX3N0YXJ0ID0gMDsKKwlpbnQgd3JpdGVfZmxhZzsKKwlpbnQgaSA9IDA7CisKKwkvKiBVcGRhdGUgcHJldmlvdXNseSBrbm93biBwYWNrYWdlcyAqLworCXdoaWxlICgoY29udHJvbF9idWZmZXIgPSB4bWFsbG9jX2ZnZXRsaW5lX3N0cihvbGRfc3RhdHVzX2ZpbGUsICJcblxuIikpICE9IE5VTEwpIHsKKwkJdG1wX3N0cmluZyA9IHN0cnN0cihjb250cm9sX2J1ZmZlciwgIlBhY2thZ2U6Iik7CisJCWlmICh0bXBfc3RyaW5nID09IE5VTEwpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJdG1wX3N0cmluZyArPSA4OworCQl0bXBfc3RyaW5nICs9IHN0cnNwbih0bXBfc3RyaW5nLCAiIFxuXHQiKTsKKwkJcGFja2FnZV9uYW1lID0geHN0cm5kdXAodG1wX3N0cmluZywgc3RyY3Nwbih0bXBfc3RyaW5nLCAiXG4iKSk7CisJCXdyaXRlX2ZsYWcgPSBGQUxTRTsKKwkJdG1wX3N0cmluZyA9IHN0cnN0cihjb250cm9sX2J1ZmZlciwgIlN0YXR1czoiKTsKKwkJaWYgKHRtcF9zdHJpbmcgIT0gTlVMTCkgeworCQkJLyogU2VwYXJhdGUgdGhlIHN0YXR1cyB2YWx1ZSBmcm9tIHRoZSBjb250cm9sIGJ1ZmZlciAqLworCQkJdG1wX3N0cmluZyArPSA3OworCQkJdG1wX3N0cmluZyArPSBzdHJzcG4odG1wX3N0cmluZywgIiBcblx0Iik7CisJCQlzdGF0dXNfZnJvbV9maWxlID0geHN0cm5kdXAodG1wX3N0cmluZywgc3RyY3Nwbih0bXBfc3RyaW5nLCAiXG4iKSk7CisJCX0gZWxzZSB7CisJCQlzdGF0dXNfZnJvbV9maWxlID0gTlVMTDsKKwkJfQorCisJCS8qIEZpbmQgdGhpcyBwYWNrYWdlIGluIHRoZSBzdGF0dXMgaGFzaHRhYmxlICovCisJCXN0YXR1c19udW0gPSBzZWFyY2hfc3RhdHVzX2hhc2h0YWJsZShwYWNrYWdlX25hbWUpOworCQlpZiAoc3RhdHVzX2hhc2h0YWJsZVtzdGF0dXNfbnVtXSAhPSBOVUxMKSB7CisJCQljb25zdCBjaGFyICpzdGF0dXNfZnJvbV9oYXNodGFibGUgPSBuYW1lX2hhc2h0YWJsZVtzdGF0dXNfaGFzaHRhYmxlW3N0YXR1c19udW1dLT5zdGF0dXNdOworCQkJaWYgKHN0cmNtcChzdGF0dXNfZnJvbV9maWxlLCBzdGF0dXNfZnJvbV9oYXNodGFibGUpICE9IDApIHsKKwkJCQkvKiBOZXcgc3RhdHVzIGlzbnQgZXhhY3RseSB0aGUgc2FtZSBhcyBvbGQgc3RhdHVzICovCisJCQkJY29uc3QgaW50IHN0YXRlX3N0YXR1cyA9IGdldF9zdGF0dXMoc3RhdHVzX251bSwgMyk7CisJCQkJaWYgKChzdHJjbXAoImluc3RhbGxlZCIsIG5hbWVfaGFzaHRhYmxlW3N0YXRlX3N0YXR1c10pID09IDApCisJCQkJIHx8IChzdHJjbXAoInVucGFja2VkIiwgbmFtZV9oYXNodGFibGVbc3RhdGVfc3RhdHVzXSkgPT0gMCkKKwkJCQkpIHsKKwkJCQkJLyogV2UgbmVlZCB0byBhZGQgdGhlIGNvbnRyb2wgZmlsZSBmcm9tIHRoZSBwYWNrYWdlICovCisJCQkJCWkgPSAwOworCQkJCQl3aGlsZSAoZGViX2ZpbGVbaV0gIT0gTlVMTCkgeworCQkJCQkJaWYgKHN0cmNtcChwYWNrYWdlX25hbWUsIG5hbWVfaGFzaHRhYmxlW3BhY2thZ2VfaGFzaHRhYmxlW2RlYl9maWxlW2ldLT5wYWNrYWdlXS0+bmFtZV0pID09IDApIHsKKwkJCQkJCQkvKiBXcml0ZSBhIHN0YXR1cyBmaWxlIGVudHJ5IHdpdGggYSBtb2RpZmllZCBzdGF0dXMgKi8KKwkJCQkJCQkvKiByZW1vdmUgdHJhaWxpbmcgXG4ncyAqLworCQkJCQkJCXdyaXRlX2J1ZmZlcl9ub19zdGF0dXMobmV3X3N0YXR1c19maWxlLCBkZWJfZmlsZVtpXS0+Y29udHJvbF9maWxlKTsKKwkJCQkJCQlzZXRfc3RhdHVzKHN0YXR1c19udW0sICJvayIsIDIpOworCQkJCQkJCWZwcmludGYobmV3X3N0YXR1c19maWxlLCAiU3RhdHVzOiAlc1xuXG4iLAorCQkJCQkJCQkJbmFtZV9oYXNodGFibGVbc3RhdHVzX2hhc2h0YWJsZVtzdGF0dXNfbnVtXS0+c3RhdHVzXSk7CisJCQkJCQkJd3JpdGVfZmxhZyA9IFRSVUU7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQlpKys7CisJCQkJCX0KKwkJCQkJLyogVGhpcyBpcyB0ZW1wZXJhcnksIGRlYnVnZ2luZyBvbmx5ICovCisJCQkJCWlmIChkZWJfZmlsZVtpXSA9PSBOVUxMKSB7CisJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiQUxFUlQ6IGNhbm5vdCBmaW5kIGEgY29udHJvbCBmaWxlLCAiCisJCQkJCQkJInlvdXIgc3RhdHVzIGZpbGUgbWF5IGJlIGJyb2tlbiwgc3RhdHVzIG1heSBiZSAiCisJCQkJCQkJImluY29ycmVjdCBmb3IgJXMiLCBwYWNrYWdlX25hbWUpOworCQkJCQl9CisJCQkJfQorCQkJCWVsc2UgaWYgKHN0cmNtcCgibm90LWluc3RhbGxlZCIsIG5hbWVfaGFzaHRhYmxlW3N0YXRlX3N0YXR1c10pID09IDApIHsKKwkJCQkJLyogT25seSB3cml0ZSB0aGUgUGFja2FnZSwgU3RhdHVzLCBQcmlvcml0eSBhbmQgU2VjdGlvbiBsaW5lcyAqLworCQkJCQlmcHJpbnRmKG5ld19zdGF0dXNfZmlsZSwgIlBhY2thZ2U6ICVzXG4iLCBwYWNrYWdlX25hbWUpOworCQkJCQlmcHJpbnRmKG5ld19zdGF0dXNfZmlsZSwgIlN0YXR1czogJXNcbiIsIHN0YXR1c19mcm9tX2hhc2h0YWJsZSk7CisKKwkJCQkJd2hpbGUgKDEpIHsKKwkJCQkJCWNoYXIgKmZpZWxkX25hbWU7CisJCQkJCQljaGFyICpmaWVsZF92YWx1ZTsKKwkJCQkJCWZpZWxkX3N0YXJ0ICs9IHJlYWRfcGFja2FnZV9maWVsZCgmY29udHJvbF9idWZmZXJbZmllbGRfc3RhcnRdLCAmZmllbGRfbmFtZSwgJmZpZWxkX3ZhbHVlKTsKKwkJCQkJCWlmIChmaWVsZF9uYW1lID09IE5VTEwpIHsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCWlmICgoc3RyY21wKGZpZWxkX25hbWUsICJQcmlvcml0eSIpID09IDApCisJCQkJCQkgfHwgKHN0cmNtcChmaWVsZF9uYW1lLCAiU2VjdGlvbiIpID09IDApCisJCQkJCQkpIHsKKwkJCQkJCQlmcHJpbnRmKG5ld19zdGF0dXNfZmlsZSwgIiVzOiAlc1xuIiwgZmllbGRfbmFtZSwgZmllbGRfdmFsdWUpOworCQkJCQkJfQorCQkJCQl9CisJCQkJCXdyaXRlX2ZsYWcgPSBUUlVFOworCQkJCQlmcHV0cygiXG4iLCBuZXdfc3RhdHVzX2ZpbGUpOworCQkJCX0KKwkJCQllbHNlIGlmIChzdHJjbXAoImNvbmZpZy1maWxlcyIsIG5hbWVfaGFzaHRhYmxlW3N0YXRlX3N0YXR1c10pID09IDApIHsKKwkJCQkJLyogb25seSBjaGFuZ2UgdGhlIHN0YXR1cyBsaW5lICovCisJCQkJCXdoaWxlICgxKSB7CisJCQkJCQljaGFyICpmaWVsZF9uYW1lOworCQkJCQkJY2hhciAqZmllbGRfdmFsdWU7CisJCQkJCQlmaWVsZF9zdGFydCArPSByZWFkX3BhY2thZ2VfZmllbGQoJmNvbnRyb2xfYnVmZmVyW2ZpZWxkX3N0YXJ0XSwgJmZpZWxkX25hbWUsICZmaWVsZF92YWx1ZSk7CisJCQkJCQlpZiAoZmllbGRfbmFtZSA9PSBOVUxMKSB7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQkvKiBTZXR1cCBzdGFydCBwb2ludCBmb3IgbmV4dCBmaWVsZCAqLworCQkJCQkJaWYgKHN0cmNtcChmaWVsZF9uYW1lLCAiU3RhdHVzIikgPT0gMCkgeworCQkJCQkJCWZwcmludGYobmV3X3N0YXR1c19maWxlLCAiU3RhdHVzOiAlc1xuIiwgc3RhdHVzX2Zyb21faGFzaHRhYmxlKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJZnByaW50ZihuZXdfc3RhdHVzX2ZpbGUsICIlczogJXNcbiIsIGZpZWxkX25hbWUsIGZpZWxkX3ZhbHVlKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQl3cml0ZV9mbGFnID0gVFJVRTsKKwkJCQkJZnB1dHMoIlxuIiwgbmV3X3N0YXR1c19maWxlKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyogSWYgdGhlIHBhY2thZ2UgZnJvbSB0aGUgc3RhdHVzIGZpbGUgd2FzbnQgaGFuZGxlIGFib3ZlLCBkbyBpdCBub3cqLworCQlpZiAoIXdyaXRlX2ZsYWcpIHsKKwkJCWZwcmludGYobmV3X3N0YXR1c19maWxlLCAiJXNcblxuIiwgY29udHJvbF9idWZmZXIpOworCQl9CisKKwkJZnJlZShzdGF0dXNfZnJvbV9maWxlKTsKKwkJZnJlZShwYWNrYWdlX25hbWUpOworCQlmcmVlKGNvbnRyb2xfYnVmZmVyKTsKKwl9CisKKwkvKiBXcml0ZSBhbnkgbmV3IHBhY2thZ2VzICovCisJZm9yIChpID0gMDsgZGViX2ZpbGVbaV0gIT0gTlVMTDsgaSsrKSB7CisJCXN0YXR1c19udW0gPSBzZWFyY2hfc3RhdHVzX2hhc2h0YWJsZShuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2hhc2h0YWJsZVtkZWJfZmlsZVtpXS0+cGFja2FnZV0tPm5hbWVdKTsKKwkJaWYgKHN0cmNtcCgicmVpbnN0cmVxIiwgbmFtZV9oYXNodGFibGVbZ2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAyKV0pID09IDApIHsKKwkJCXdyaXRlX2J1ZmZlcl9ub19zdGF0dXMobmV3X3N0YXR1c19maWxlLCBkZWJfZmlsZVtpXS0+Y29udHJvbF9maWxlKTsKKwkJCXNldF9zdGF0dXMoc3RhdHVzX251bSwgIm9rIiwgMik7CisJCQlmcHJpbnRmKG5ld19zdGF0dXNfZmlsZSwgIlN0YXR1czogJXNcblxuIiwgbmFtZV9oYXNodGFibGVbc3RhdHVzX2hhc2h0YWJsZVtzdGF0dXNfbnVtXS0+c3RhdHVzXSk7CisJCX0KKwl9CisJZmNsb3NlKG9sZF9zdGF0dXNfZmlsZSk7CisJZmNsb3NlKG5ld19zdGF0dXNfZmlsZSk7CisKKwkvKiBDcmVhdGUgYSBzZXBhcmF0ZSBiYWNrZmlsZSB0byBkcGtnICovCisJaWYgKHJlbmFtZSgiL3Zhci9saWIvZHBrZy9zdGF0dXMiLCAiL3Zhci9saWIvZHBrZy9zdGF0dXMudWRlYi5iYWsiKSA9PSAtMSkgeworCQlpZiAoZXJybm8gIT0gRU5PRU5UKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGNyZWF0ZSBiYWNrdXAgc3RhdHVzIGZpbGUiKTsKKwkJLyogSXRzIG9rIGlmIHJlbmFtaW5nIHRoZSBzdGF0dXMgZmlsZSBmYWlscyBiZWNhdXNlIHN0YXR1cworCQkgKiBmaWxlIGRvZXNudCBleGlzdCwgbWF5YmUgd2UgYXJlIHN0YXJ0aW5nIGZyb20gc2NyYXRjaCAqLworCQliYl9lcnJvcl9tc2coIm5vIHN0YXR1cyBmaWxlIGZvdW5kLCBjcmVhdGluZyBuZXcgb25lIik7CisJfQorCisJeHJlbmFtZSgiL3Zhci9saWIvZHBrZy9zdGF0dXMudWRlYiIsICIvdmFyL2xpYi9kcGtnL3N0YXR1cyIpOworfQorCisvKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgVFJVRSBpZiB0aGUgZ2l2ZW4gcGFja2FnZSBjYW4gc2F0aXNmeSBhCisgKiBkZXBlbmRlbmN5IG9mIHR5cGUgZGVwZW5kX3R5cGUuCisgKgorICogQSBwcmUtZGVwZW5kcyBpcyBzYXRpc2ZpZWQgb25seSBpZiBhIHBhY2thZ2UgaXMgYWxyZWFkeSBpbnN0YWxsZWQsCisgKiB3aGljaCBhIHJlZ3VsYXIgZGVwZW5kcyBjYW4gYmUgc2F0aXNmaWVkIGJ5IGEgcGFja2FnZSB3aGljaCB3ZSB3YW50CisgKiB0byBpbnN0YWxsLgorICovCitzdGF0aWMgaW50IHBhY2thZ2Vfc2F0aXNmaWVzX2RlcGVuZGVuY3koaW50IHBhY2thZ2UsIGludCBkZXBlbmRfdHlwZSkKK3sKKwlpbnQgc3RhdHVzX251bSA9IHNlYXJjaF9zdGF0dXNfaGFzaHRhYmxlKG5hbWVfaGFzaHRhYmxlW3BhY2thZ2VfaGFzaHRhYmxlW3BhY2thZ2VdLT5uYW1lXSk7CisKKwkvKiBzdGF0dXMgY291bGQgYmUgdW5rbm93biBpZiBwYWNrYWdlIGlzIGEgcHVyZSB2aXJ0dWFsCisJICogcHJvdmlkZXMgd2hpY2ggY2Fubm90IHNhdGlzZnkgYW55IGRlcGVuZGVuY3kgYnkgaXRzZWxmLgorCSAqLworCWlmIChzdGF0dXNfaGFzaHRhYmxlW3N0YXR1c19udW1dID09IE5VTEwpCisJCXJldHVybiAwOworCisJc3dpdGNoIChkZXBlbmRfdHlwZSkgeworCWNhc2UgRURHRV9QUkVfREVQRU5EUzogcmV0dXJuIGdldF9zdGF0dXMoc3RhdHVzX251bSwgMykgPT0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKCJpbnN0YWxsZWQiKTsKKwljYXNlIEVER0VfREVQRU5EUzogICAgIHJldHVybiBnZXRfc3RhdHVzKHN0YXR1c19udW0sIDEpID09IHNlYXJjaF9uYW1lX2hhc2h0YWJsZSgiaW5zdGFsbCIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja19kZXBzKGRlYl9maWxlX3QgKipkZWJfZmlsZSwgaW50IGRlYl9zdGFydCAvKiwgaW50IGRlcF9tYXhfY291bnQgLSA/PyAqLykKK3sKKwlpbnQgKmNvbmZsaWN0cyA9IE5VTEw7CisJaW50IGNvbmZsaWN0c19udW0gPSAwOworCWludCBpID0gZGViX3N0YXJ0OworCWludCBqOworCisJLyogQ2hlY2sgZm9yIGNvbmZsaWN0cworCSAqIFRPRE86IFRFU1QgaWYgY29uZmxpY3RzIHdpdGggb3RoZXIgcGFja2FnZXMgdG8gYmUgaW5zdGFsbGVkCisJICoKKwkgKiBBZGQgaW5zdGFsbCBwYWNrYWdlcyBhbmQgdGhlIHBhY2thZ2VzIHRoZXkgcHJvdmlkZQorCSAqIHRvIHRoZSBsaXN0IG9mIGZpbGVzIHRvIGNoZWNrIGNvbmZsaWN0cyBmb3IKKwkgKi8KKworCS8qIENyZWF0ZSBhcnJheSBvZiBwYWNrYWdlIG51bWJlcnMgdG8gY2hlY2sgYWdhaW5zdAorCSAqIGluc3RhbGxlZCBwYWNrYWdlIGZvciBjb25mbGljdHMqLworCXdoaWxlIChkZWJfZmlsZVtpXSAhPSBOVUxMKSB7CisJCWNvbnN0IHVuc2lnbmVkIHBhY2thZ2VfbnVtID0gZGViX2ZpbGVbaV0tPnBhY2thZ2U7CisJCWNvbmZsaWN0cyA9IHhyZWFsbG9jX3ZlY3Rvcihjb25mbGljdHMsIDIsIGNvbmZsaWN0c19udW0pOworCQljb25mbGljdHNbY29uZmxpY3RzX251bV0gPSBwYWNrYWdlX251bTsKKwkJY29uZmxpY3RzX251bSsrOworCQkvKiBhZGQgcHJvdmlkZXMgdG8gY29uZmxpY3RzIGxpc3QgKi8KKwkJZm9yIChqID0gMDsgaiA8IHBhY2thZ2VfaGFzaHRhYmxlW3BhY2thZ2VfbnVtXS0+bnVtX29mX2VkZ2VzOyBqKyspIHsKKwkJCWlmIChwYWNrYWdlX2hhc2h0YWJsZVtwYWNrYWdlX251bV0tPmVkZ2Vbal0tPnR5cGUgPT0gRURHRV9QUk9WSURFUykgeworCQkJCWNvbnN0IGludCBjb25mbGljdHNfcGFja2FnZV9udW0gPSBzZWFyY2hfcGFja2FnZV9oYXNodGFibGUoCisJCQkJCXBhY2thZ2VfaGFzaHRhYmxlW3BhY2thZ2VfbnVtXS0+ZWRnZVtqXS0+bmFtZSwKKwkJCQkJcGFja2FnZV9oYXNodGFibGVbcGFja2FnZV9udW1dLT5lZGdlW2pdLT52ZXJzaW9uLAorCQkJCQlwYWNrYWdlX2hhc2h0YWJsZVtwYWNrYWdlX251bV0tPmVkZ2Vbal0tPm9wZXJhdG9yKTsKKwkJCQlpZiAocGFja2FnZV9oYXNodGFibGVbY29uZmxpY3RzX3BhY2thZ2VfbnVtXSA9PSBOVUxMKSB7CisJCQkJCS8qIGNyZWF0ZSBhIG5ldyBwYWNrYWdlICovCisJCQkJCWNvbW1vbl9ub2RlX3QgKm5ld19ub2RlID0geHphbGxvYyhzaXplb2YoY29tbW9uX25vZGVfdCkpOworCQkJCQluZXdfbm9kZS0+bmFtZSA9IHBhY2thZ2VfaGFzaHRhYmxlW3BhY2thZ2VfbnVtXS0+ZWRnZVtqXS0+bmFtZTsKKwkJCQkJbmV3X25vZGUtPnZlcnNpb24gPSBwYWNrYWdlX2hhc2h0YWJsZVtwYWNrYWdlX251bV0tPmVkZ2Vbal0tPnZlcnNpb247CisJCQkJCXBhY2thZ2VfaGFzaHRhYmxlW2NvbmZsaWN0c19wYWNrYWdlX251bV0gPSBuZXdfbm9kZTsKKwkJCQl9CisJCQkJY29uZmxpY3RzID0geHJlYWxsb2NfdmVjdG9yKGNvbmZsaWN0cywgMiwgY29uZmxpY3RzX251bSk7CisJCQkJY29uZmxpY3RzW2NvbmZsaWN0c19udW1dID0gY29uZmxpY3RzX3BhY2thZ2VfbnVtOworCQkJCWNvbmZsaWN0c19udW0rKzsKKwkJCX0KKwkJfQorCQlpKys7CisJfQorCisJLyogQ2hlY2sgY29uZmxpY3RzICovCisJaSA9IDA7CisJd2hpbGUgKGRlYl9maWxlW2ldICE9IE5VTEwpIHsKKwkJY29uc3QgY29tbW9uX25vZGVfdCAqcGFja2FnZV9ub2RlID0gcGFja2FnZV9oYXNodGFibGVbZGViX2ZpbGVbaV0tPnBhY2thZ2VdOworCQlpbnQgc3RhdHVzX251bSA9IDA7CisJCXN0YXR1c19udW0gPSBzZWFyY2hfc3RhdHVzX2hhc2h0YWJsZShuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX25vZGUtPm5hbWVdKTsKKworCQlpZiAoZ2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAzKSA9PSBzZWFyY2hfbmFtZV9oYXNodGFibGUoImluc3RhbGxlZCIpKSB7CisJCQlpKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCWZvciAoaiA9IDA7IGogPCBwYWNrYWdlX25vZGUtPm51bV9vZl9lZGdlczsgaisrKSB7CisJCQljb25zdCBlZGdlX3QgKnBhY2thZ2VfZWRnZSA9IHBhY2thZ2Vfbm9kZS0+ZWRnZVtqXTsKKworCQkJaWYgKHBhY2thZ2VfZWRnZS0+dHlwZSA9PSBFREdFX0NPTkZMSUNUUykgeworCQkJCWNvbnN0IHVuc2lnbmVkIHBhY2thZ2VfbnVtID0KKwkJCQkJc2VhcmNoX3BhY2thZ2VfaGFzaHRhYmxlKHBhY2thZ2VfZWRnZS0+bmFtZSwKKwkJCQkJCQkJcGFja2FnZV9lZGdlLT52ZXJzaW9uLAorCQkJCQkJCQlwYWNrYWdlX2VkZ2UtPm9wZXJhdG9yKTsKKwkJCQlpbnQgcmVzdWx0ID0gMDsKKwkJCQlpZiAocGFja2FnZV9oYXNodGFibGVbcGFja2FnZV9udW1dICE9IE5VTEwpIHsKKwkJCQkJc3RhdHVzX251bSA9IHNlYXJjaF9zdGF0dXNfaGFzaHRhYmxlKG5hbWVfaGFzaHRhYmxlW3BhY2thZ2VfaGFzaHRhYmxlW3BhY2thZ2VfbnVtXS0+bmFtZV0pOworCisJCQkJCWlmIChnZXRfc3RhdHVzKHN0YXR1c19udW0sIDEpID09IHNlYXJjaF9uYW1lX2hhc2h0YWJsZSgiaW5zdGFsbCIpKSB7CisJCQkJCQlyZXN1bHQgPSB0ZXN0X3ZlcnNpb24ocGFja2FnZV9oYXNodGFibGVbZGViX2ZpbGVbaV0tPnBhY2thZ2VdLT52ZXJzaW9uLAorCQkJCQkJCXBhY2thZ2VfZWRnZS0+dmVyc2lvbiwgcGFja2FnZV9lZGdlLT5vcGVyYXRvcik7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAocmVzdWx0KSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJwYWNrYWdlICVzIGNvbmZsaWN0cyB3aXRoICVzIiwKKwkJCQkJCW5hbWVfaGFzaHRhYmxlW3BhY2thZ2Vfbm9kZS0+bmFtZV0sCisJCQkJCQluYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2VkZ2UtPm5hbWVdKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaSsrOworCX0KKworCisJLyogQ2hlY2sgZGVwZW5kZW5kY2llcyAqLworCWZvciAoaSA9IDA7IGkgPCBQQUNLQUdFX0hBU0hfUFJJTUU7IGkrKykgeworCQlpbnQgc3RhdHVzX251bSA9IDA7CisJCWludCBudW1iZXJfb2ZfYWx0ZXJuYXRpdmVzID0gMDsKKwkJY29uc3QgZWRnZV90ICogcm9vdF9vZl9hbHRlcm5hdGl2ZXMgPSBOVUxMOworCQljb25zdCBjb21tb25fbm9kZV90ICpwYWNrYWdlX25vZGUgPSBwYWNrYWdlX2hhc2h0YWJsZVtpXTsKKworCQkvKiBJZiB0aGUgcGFja2FnZSBub2RlIGRvZXMgbm90IGV4aXN0IHRoZW4gdGhpcworCQkgKiBwYWNrYWdlIGlzIGEgdmlydHVhbCBvbmUuIEluIHdoaWNoIGNhc2UgdGhlcmUgYXJlCisJCSAqIG5vIGRlcGVuZGVuY2llcyB0byBjaGVjay4KKwkJICovCisJCWlmIChwYWNrYWdlX25vZGUgPT0gTlVMTCkgY29udGludWU7CisKKwkJc3RhdHVzX251bSA9IHNlYXJjaF9zdGF0dXNfaGFzaHRhYmxlKG5hbWVfaGFzaHRhYmxlW3BhY2thZ2Vfbm9kZS0+bmFtZV0pOworCisJCS8qIElmIHRoZXJlIGlzIG5vIHN0YXR1cyB0aGVuIHRoaXMgcGFja2FnZSBpcyBhCisJCSAqIHZpcnR1YWwgb25lIHByb3ZpZGVkIGJ5IHNvbWV0aGluZyBlbHNlLiBJbiB3aGljaAorCQkgKiBjYXNlIHRoZXJlIGFyZSBubyBkZXBlbmRlbmNpZXMgdG8gY2hlY2suCisJCSAqLworCQlpZiAoc3RhdHVzX2hhc2h0YWJsZVtzdGF0dXNfbnVtXSA9PSBOVUxMKSBjb250aW51ZTsKKworCQkvKiBJZiB3ZSBkb24ndCB3YW50IHRoaXMgcGFja2FnZSBpbnN0YWxsZWQgdGhlbiB3ZSBtYXkKKwkJICogYXMgd2VsbCBpZ25vcmUgaXQncyBkZXBlbmRlbmNpZXMuCisJCSAqLworCQlpZiAoZ2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAxKSAhPSBzZWFyY2hfbmFtZV9oYXNodGFibGUoImluc3RhbGwiKSkgeworCQkJY29udGludWU7CisJCX0KKworCQkvKiBUaGlzIGNvZGUgaXMgdGVzdGVkIG9ubHkgZm9yIEVER0VfREVQRU5EUywgc2luY2UgSQorCQkgKiBoYXZlIG5vIHN1aXRhYmxlIHByZS1kZXBlbmRzIGF2YWlsYWJsZS4gVGhlcmUgaXMgbm8KKwkJICogcmVhc29uIHRoYXQgaXQgc2hvdWxkbid0IHdvcmsgdGhvdWdoIDotKQorCQkgKi8KKwkJZm9yIChqID0gMDsgaiA8IHBhY2thZ2Vfbm9kZS0+bnVtX29mX2VkZ2VzOyBqKyspIHsKKwkJCWNvbnN0IGVkZ2VfdCAqcGFja2FnZV9lZGdlID0gcGFja2FnZV9ub2RlLT5lZGdlW2pdOworCQkJdW5zaWduZWQgcGFja2FnZV9udW07CisKKwkJCWlmIChwYWNrYWdlX2VkZ2UtPnR5cGUgPT0gRURHRV9PUl9QUkVfREVQRU5EUworCQkJIHx8IHBhY2thZ2VfZWRnZS0+dHlwZSA9PSBFREdFX09SX0RFUEVORFMKKwkJCSkgeworCQkJCS8qIHN0YXJ0IGFuIEVER0VfT1JfIGxpc3QgKi8KKwkJCQludW1iZXJfb2ZfYWx0ZXJuYXRpdmVzID0gcGFja2FnZV9lZGdlLT52ZXJzaW9uOworCQkJCXJvb3Rfb2ZfYWx0ZXJuYXRpdmVzID0gcGFja2FnZV9lZGdlOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKG51bWJlcl9vZl9hbHRlcm5hdGl2ZXMgPT0gMCkgeyAgLyogbm90IGluIHRoZSBtaWRkbGUgb2YgYW4gRURHRV9PUl8gbGlzdCAqLworCQkJCW51bWJlcl9vZl9hbHRlcm5hdGl2ZXMgPSAxOworCQkJCXJvb3Rfb2ZfYWx0ZXJuYXRpdmVzID0gTlVMTDsKKwkJCX0KKworCQkJcGFja2FnZV9udW0gPSBzZWFyY2hfcGFja2FnZV9oYXNodGFibGUocGFja2FnZV9lZGdlLT5uYW1lLCBwYWNrYWdlX2VkZ2UtPnZlcnNpb24sIHBhY2thZ2VfZWRnZS0+b3BlcmF0b3IpOworCisJCQlpZiAocGFja2FnZV9lZGdlLT50eXBlID09IEVER0VfUFJFX0RFUEVORFMKKwkJCSB8fCBwYWNrYWdlX2VkZ2UtPnR5cGUgPT0gRURHRV9ERVBFTkRTCisJCQkpIHsKKwkJCQlpbnQgcmVzdWx0PTE7CisJCQkJc3RhdHVzX251bSA9IDA7CisKKwkJCQkvKiBJZiB3ZSBhcmUgaW5zaWRlIGFuIGFsdGVybmF0aXZlIHRoZW4gY2hlY2sKKwkJCQkgKiB0aGlzIGVkZ2UgaXMgdGhlIHJpZ2h0IHR5cGUuCisJCQkJICoKKwkJCQkgKiBFREdFX0RFUEVORFMgPT0gT1JfREVQRU5EUyAtMQorCQkJCSAqIEVER0VfUFJFX0RFUEVORFMgPT0gT1JfUFJFX0RFUEVORFMgLTEKKwkJCQkgKi8KKwkJCQlpZiAocm9vdF9vZl9hbHRlcm5hdGl2ZXMgJiYgcGFja2FnZV9lZGdlLT50eXBlICE9IHJvb3Rfb2ZfYWx0ZXJuYXRpdmVzLT50eXBlIC0gMSkKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImZhdGFsIGVycm9yLCBwYWNrYWdlIGRlcGVuZGVuY2llcyBjb3JydXB0OiAlZCAhPSAlZCAtIDEiLAorCQkJCQkJCXBhY2thZ2VfZWRnZS0+dHlwZSwgcm9vdF9vZl9hbHRlcm5hdGl2ZXMtPnR5cGUpOworCisJCQkJaWYgKHBhY2thZ2VfaGFzaHRhYmxlW3BhY2thZ2VfbnVtXSAhPSBOVUxMKQorCQkJCQlyZXN1bHQgPSAhcGFja2FnZV9zYXRpc2ZpZXNfZGVwZW5kZW5jeShwYWNrYWdlX251bSwgcGFja2FnZV9lZGdlLT50eXBlKTsKKworCQkJCWlmIChyZXN1bHQpIHsgLyogY2hlY2sgZm9yIG90aGVyIHBhY2thZ2Ugd2hpY2ggcHJvdmlkZSB3aGF0IHdlIGFyZSBsb29raW5nIGZvciAqLworCQkJCQlpbnQgcHJvdmlkZXIgPSAtMTsKKworCQkJCQl3aGlsZSAoKHByb3ZpZGVyID0gc2VhcmNoX2Zvcl9wcm92aWRlcyhwYWNrYWdlX2VkZ2UtPm5hbWUsIHByb3ZpZGVyKSkgPiAtMSkgeworCQkJCQkJaWYgKHBhY2thZ2VfaGFzaHRhYmxlW3Byb3ZpZGVyXSA9PSBOVUxMKSB7CisJCQkJCQkJcHV0cygiSGF2ZSBhIHByb3ZpZGVyIGJ1dCBubyBwYWNrYWdlIGluZm9ybWF0aW9uIGZvciBpdCIpOworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQkJcmVzdWx0ID0gIXBhY2thZ2Vfc2F0aXNmaWVzX2RlcGVuZGVuY3kocHJvdmlkZXIsIHBhY2thZ2VfZWRnZS0+dHlwZSk7CisKKwkJCQkJCWlmIChyZXN1bHQgPT0gMCkKKwkJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8qIEl0IG11c3QgYmUgYWxyZWFkeSBpbnN0YWxsZWQsIG9yIHRvIGJlIGluc3RhbGxlZCAqLworCQkJCW51bWJlcl9vZl9hbHRlcm5hdGl2ZXMtLTsKKwkJCQlpZiAocmVzdWx0ICYmIG51bWJlcl9vZl9hbHRlcm5hdGl2ZXMgPT0gMCkgeworCQkJCQlpZiAocm9vdF9vZl9hbHRlcm5hdGl2ZXMpCisJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgKKwkJCQkJCQkicGFja2FnZSAlcyAlc2RlcGVuZHMgb24gJXMsIHdoaWNoICVzIiwKKwkJCQkJCQluYW1lX2hhc2h0YWJsZVtwYWNrYWdlX25vZGUtPm5hbWVdLAorCQkJCQkJCXBhY2thZ2VfZWRnZS0+dHlwZSA9PSBFREdFX1BSRV9ERVBFTkRTID8gInByZS0iIDogIiIsCisJCQkJCQkJbmFtZV9oYXNodGFibGVbcm9vdF9vZl9hbHRlcm5hdGl2ZXMtPm5hbWVdLAorCQkJCQkJCSJjYW5ub3QgYmUgc2F0aXNmaWVkIik7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKAorCQkJCQkJInBhY2thZ2UgJXMgJXNkZXBlbmRzIG9uICVzLCB3aGljaCAlcyIsCisJCQkJCQluYW1lX2hhc2h0YWJsZVtwYWNrYWdlX25vZGUtPm5hbWVdLAorCQkJCQkJcGFja2FnZV9lZGdlLT50eXBlID09IEVER0VfUFJFX0RFUEVORFMgPyAicHJlLSIgOiAiIiwKKwkJCQkJCW5hbWVfaGFzaHRhYmxlW3BhY2thZ2VfZWRnZS0+bmFtZV0sCisJCQkJCQlkZXNjcmliZV9zdGF0dXMoc3RhdHVzX251bSkpOworCQkJCX0KKwkJCQlpZiAocmVzdWx0ID09IDAgJiYgbnVtYmVyX29mX2FsdGVybmF0aXZlcykgeworCQkJCQkvKiB3ZSd2ZSBmb3VuZCBhIHBhY2thZ2Ugd2hpY2gKKwkJCQkJICogc2F0aXNmaWVzIHRoZSBkZXBlbmRlbmN5LAorCQkJCQkgKiBzbyBza2lwIG92ZXIgdGhlIHJlc3Qgb2YKKwkJCQkJICogdGhlIGFsdGVybmF0aXZlcy4KKwkJCQkJICovCisJCQkJCWogKz0gbnVtYmVyX29mX2FsdGVybmF0aXZlczsKKwkJCQkJbnVtYmVyX29mX2FsdGVybmF0aXZlcyA9IDA7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWZyZWUoY29uZmxpY3RzKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGNoYXIgKipjcmVhdGVfbGlzdChjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlGSUxFICpsaXN0X3N0cmVhbTsKKwljaGFyICoqZmlsZV9saXN0OworCWNoYXIgKmxpbmU7CisJaW50IGNvdW50OworCisJLyogZG9uJ3QgdXNlIFt4d11mb3BlbiBoZXJlLCBoYW5kbGUgZXJyb3Igb3Vyc2VsZiAqLworCWxpc3Rfc3RyZWFtID0gZm9wZW5fZm9yX3JlYWQoZmlsZW5hbWUpOworCWlmIChsaXN0X3N0cmVhbSA9PSBOVUxMKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCWZpbGVfbGlzdCA9IE5VTEw7CisJY291bnQgPSAwOworCXdoaWxlICgobGluZSA9IHhtYWxsb2NfZmdldGxpbmUobGlzdF9zdHJlYW0pKSAhPSBOVUxMKSB7CisJCWZpbGVfbGlzdCA9IHhyZWFsbG9jX3ZlY3RvcihmaWxlX2xpc3QsIDIsIGNvdW50KTsKKwkJZmlsZV9saXN0W2NvdW50KytdID0gbGluZTsKKwkJLypmaWxlX2xpc3RbY291bnRdID0gTlVMTDsgLSB4cmVhbGxvY192ZWN0b3IgZGlkIGl0ICovCisJfQorCWZjbG9zZShsaXN0X3N0cmVhbSk7CisKKwlyZXR1cm4gZmlsZV9saXN0OworfQorCisvKiBtYXliZSBpIHNob3VsZCB0cnkgYW5kIGhvb2sgdGhpcyBpbnRvIHJlbW92ZV9maWxlLmMgc29tZWhvdyAqLworc3RhdGljIGludCByZW1vdmVfZmlsZV9hcnJheShjaGFyICoqcmVtb3ZlX25hbWVzLCBjaGFyICoqZXhjbHVkZV9uYW1lcykKK3sKKwlzdHJ1Y3Qgc3RhdCBwYXRoX3N0YXQ7CisJaW50IHJlbW92ZV9mbGFnID0gMTsgLyogbm90IHJlbW92ZWQgYW55dGhpbmcgeWV0ICovCisJaW50IGksIGo7CisKKwlpZiAocmVtb3ZlX25hbWVzID09IE5VTEwpIHsKKwkJcmV0dXJuIDA7CisJfQorCWZvciAoaSA9IDA7IHJlbW92ZV9uYW1lc1tpXSAhPSBOVUxMOyBpKyspIHsKKwkJaWYgKGV4Y2x1ZGVfbmFtZXMgIT0gTlVMTCkgeworCQkJZm9yIChqID0gMDsgZXhjbHVkZV9uYW1lc1tqXSAhPSBOVUxMOyBqKyspIHsKKwkJCQlpZiAoc3RyY21wKHJlbW92ZV9uYW1lc1tpXSwgZXhjbHVkZV9uYW1lc1tqXSkgPT0gMCkgeworCQkJCQlnb3RvIHNraXA7CisJCQkJfQorCQkJfQorCQl9CisJCS8qIFRPRE86IHdoeSB3ZSBhcmUgY2hlY2tpbmcgbHN0YXQ/IHdlIGNhbiBqdXN0IHRyeSBybS9ybWRpciAqLworCQlpZiAobHN0YXQocmVtb3ZlX25hbWVzW2ldLCAmcGF0aF9zdGF0KSA8IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChTX0lTRElSKHBhdGhfc3RhdC5zdF9tb2RlKSkgeworCQkJcmVtb3ZlX2ZsYWcgJj0gcm1kaXIocmVtb3ZlX25hbWVzW2ldKTsgLyogMCBpZiBubyBlcnJvciAqLworCQl9IGVsc2UgeworCQkJcmVtb3ZlX2ZsYWcgJj0gdW5saW5rKHJlbW92ZV9uYW1lc1tpXSk7IC8qIDAgaWYgbm8gZXJyb3IgKi8KKwkJfQorIHNraXA6CisJCWNvbnRpbnVlOworCX0KKwlyZXR1cm4gKHJlbW92ZV9mbGFnID09IDApOworfQorCitzdGF0aWMgdm9pZCBydW5fcGFja2FnZV9zY3JpcHRfb3JfZGllKGNvbnN0IGNoYXIgKnBhY2thZ2VfbmFtZSwgY29uc3QgY2hhciAqc2NyaXB0X3R5cGUpCit7CisJY2hhciAqc2NyaXB0X3BhdGg7CisJaW50IHJlc3VsdDsKKworCXNjcmlwdF9wYXRoID0geGFzcHJpbnRmKCIvdmFyL2xpYi9kcGtnL2luZm8vJXMuJXMiLCBwYWNrYWdlX25hbWUsIHNjcmlwdF90eXBlKTsKKworCS8qIElmIHRoZSBmaWxlIGRvZXNudCBleGlzdCBpcyBpc250IGZhdGFsICovCisJcmVzdWx0ID0gYWNjZXNzKHNjcmlwdF9wYXRoLCBGX09LKSA/IEVYSVRfU1VDQ0VTUyA6IHN5c3RlbShzY3JpcHRfcGF0aCk7CisJZnJlZShzY3JpcHRfcGF0aCk7CisJaWYgKHJlc3VsdCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIGZhaWxlZCwgZXhpdCBjb2RlICVkIiwgc2NyaXB0X3R5cGUsIHJlc3VsdCk7Cit9CisKKy8qCitUaGUgcG9saWN5IG1hbnVhbCBkZWZpbmVzIHdoYXQgc2NyaXB0cyBnZXQgY2FsbGVkIHdoZW4gYW5kIHdpdGgKK3doYXQgYXJndW1lbnRzLiBJIHJlYWxpemUgdGhhdCBidXN5Ym94IGRvZXMgbm90IHN1cHBvcnQgYWxsIG9mCit0aGVzZSBzY2VuYXJpb3MsIGJ1dCBpdCBkb2VzIHN1cHBvcnQgc29tZSBvZiB0aGVtOyBpdCBkb2VzIG5vdCwKK2hvd2V2ZXIsIHJ1biB0aGVtIHdpdGggYW55IHBhcmFtZXRlcnMgaW4gcnVuX3BhY2thZ2Vfc2NyaXB0X29yX2RpZSgpLgorSGVyZSBhcmUgdGhlIHNjcmlwdHM6CisKK3ByZWluc3QgaW5zdGFsbAorcHJlaW5zdCBpbnN0YWxsIDxvbGRfdmVyc2lvbj4KK3ByZWluc3QgdXBncmFkZSA8b2xkX3ZlcnNpb24+CitwcmVpbnN0IGFib3J0X3VwZ3JhZGUgPG5ld192ZXJzaW9uPgorcG9zdGluc3QgY29uZmlndXJlIDxtb3N0X3JlY2VudF92ZXJzaW9uPgorcG9zdGluc3QgYWJvcnQtdXBnYWRlIDxuZXdfdmVyc2lvbj4KK3Bvc3RpbnN0IGFib3J0LXJlbW92ZQorcG9zdGluc3QgYWJvcnQtcmVtb3ZlIGluLWZhdm91ciA8cGFja2FnZT4gPHZlcnNpb24+Citwb3N0aW5zdCBhYm9ydC1kZWNvbmZpZ3VyZSBpbi1mYXZvciA8ZmFpbGVkX2luc3RhbGxfcGFja2FnZT4gcmVtb3ZpbmcgPGNvbmZsaWN0aW5nX3BhY2thZ2U+IDx2ZXJzaW9uPgorcHJlcm0gcmVtb3ZlCitwcmVybSB1cGdyYWRlIDxuZXdfdmVyc2lvbj4KK3ByZXJtIGZhaWxlZC11cGdyYWRlIDxvbGRfdmVyc2lvbj4KK3ByZXJtIHJlbW92ZSBpbi1mYXZvciA8cGFja2FnZT4gPG5ld192ZXJzaW9uPgorcHJlcm0gZGVjb25maWd1cmUgaW4tZmF2b3VyIDxwYWNrYWdlPiA8dmVyc2lvbj4gcmVtb3ZpbmcgPHBhY2thZ2U+IDx2ZXJzaW9uPgorcG9zdHJtIHJlbW92ZQorcG9zdHJtIHB1cmdlCitwb3N0cm0gdXBncmFkZSA8bmV3X3ZlcnNpb24+Citwb3N0cm0gZmFpbGVkLXVwZ3JhZGUgPG9sZF92ZXJzaW9uPgorcG9zdHJtIGFib3J0LWluc3RhbGwKK3Bvc3RybSBhYm9ydC1pbnN0YWxsIDxvbGRfdmVyc2lvbj4KK3Bvc3RybSBhYm9ydC11cGdyYWRlIDxvbGRfdmVyc2lvbj4KK3Bvc3RybSBkaXNhcHBlYXIgPG92ZXJ3cml0ZXI+IDx2ZXJzaW9uPgorKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBhbGxfY29udHJvbF9maWxlc1tdID0geworCSJwcmVpbnN0IiwgInBvc3RpbnN0IiwgInByZXJtIiwgInBvc3RybSIsCisJImxpc3QiLCAibWQ1c3VtcyIsICJzaGxpYnMiLCAiY29uZmZpbGVzIiwKKwkiY29uZmlnIiwgInRlbXBsYXRlcyIKK307CisKK3N0YXRpYyBjaGFyICoqYWxsX2NvbnRyb2xfbGlzdChjb25zdCBjaGFyICpwYWNrYWdlX25hbWUpCit7CisJdW5zaWduZWQgaSA9IDA7CisJY2hhciAqKnJlbW92ZV9maWxlczsKKworCS8qIENyZWF0ZSBhIGxpc3Qgb2YgYWxsIC92YXIvbGliL2Rwa2cvaW5mby88cGFja2FnZT4gZmlsZXMgKi8KKwlyZW1vdmVfZmlsZXMgPSB4emFsbG9jKHNpemVvZihhbGxfY29udHJvbF9maWxlcykgKyBzaXplb2YoY2hhciopKTsKKwl3aGlsZSAoaSA8IEFSUkFZX1NJWkUoYWxsX2NvbnRyb2xfZmlsZXMpKSB7CisJCXJlbW92ZV9maWxlc1tpXSA9IHhhc3ByaW50ZigiL3Zhci9saWIvZHBrZy9pbmZvLyVzLiVzIiwKKwkJCQlwYWNrYWdlX25hbWUsIGFsbF9jb250cm9sX2ZpbGVzW2ldKTsKKwkJaSsrOworCX0KKworCXJldHVybiByZW1vdmVfZmlsZXM7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfYXJyYXkoY2hhciAqKmFycmF5KQoreworCWlmIChhcnJheSkgeworCQl1bnNpZ25lZCBpID0gMDsKKwkJd2hpbGUgKGFycmF5W2ldKSB7CisJCQlmcmVlKGFycmF5W2ldKTsKKwkJCWkrKzsKKwkJfQorCQlmcmVlKGFycmF5KTsKKwl9Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gbGlzdHMgaW5mb3JtYXRpb24gb24gdGhlIGluc3RhbGxlZCBwYWNrYWdlcy4gSXQgbG9vcHMgdGhyb3VnaAorICogdGhlIHN0YXR1c19oYXNodGFibGUgdG8gcmV0cmlldmUgdGhlIGluZm8uIFRoaXMgcmVzdWx0cyBpbiBzbWFsbGVyIGNvZGUgdGhhbgorICogc2Nhbm5pbmcgdGhlIHN0YXR1cyBmaWxlLiBUaGUgcmVzdWx0aW5nIGxpc3QsIGhvd2V2ZXIsIGlzIHVuc29ydGVkLgorICovCitzdGF0aWMgdm9pZCBsaXN0X3BhY2thZ2VzKGNvbnN0IGNoYXIgKnBhdHRlcm4pCit7CisJaW50IGk7CisKKwlwdXRzKCIgICAgTmFtZSAgICAgICAgICAgVmVyc2lvbiIpOworCXB1dHMoIisrKy09PT09PT09PT09PT09PS09PT09PT09PT09PT09PSIpOworCisJLyogZ28gdGhyb3VnaCBzdGF0dXMgaGFzaCwgZGVyZWZlcmVuY2UgcGFja2FnZSBoYXNoIGFuZCBmaW5hbGx5IHN0cmluZ3MgKi8KKwlmb3IgKGkgPSAwOyBpIDwgU1RBVFVTX0hBU0hfUFJJTUUrMTsgaSsrKSB7CisJCWlmIChzdGF0dXNfaGFzaHRhYmxlW2ldKSB7CisJCQljb25zdCBjaGFyICpzdGF0X3N0cjsgIC8qIHN0YXR1cyBzdHJpbmcgKi8KKwkJCWNvbnN0IGNoYXIgKm5hbWVfc3RyOyAgLyogcGFja2FnZSBuYW1lICovCisJCQljb25zdCBjaGFyICp2ZXJzX3N0cjsgIC8qIHZlcnNpb24gKi8KKwkJCWNoYXIgIHMxLCBzMjsgICAgICAgICAgLyogc3RhdHVzIGFiYnJldmlhdGlvbnMgKi8KKwkJCWludCAgIHNwY2NudDsgICAgICAgICAgLyogc3BhY2UgY291bnQgKi8KKwkJCWludCAgIGo7CisKKwkJCXN0YXRfc3RyID0gbmFtZV9oYXNodGFibGVbc3RhdHVzX2hhc2h0YWJsZVtpXS0+c3RhdHVzXTsKKwkJCW5hbWVfc3RyID0gbmFtZV9oYXNodGFibGVbcGFja2FnZV9oYXNodGFibGVbc3RhdHVzX2hhc2h0YWJsZVtpXS0+cGFja2FnZV0tPm5hbWVdOworCQkJdmVyc19zdHIgPSBuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2hhc2h0YWJsZVtzdGF0dXNfaGFzaHRhYmxlW2ldLT5wYWNrYWdlXS0+dmVyc2lvbl07CisKKwkJCWlmIChwYXR0ZXJuICYmIGZubWF0Y2gocGF0dGVybiwgbmFtZV9zdHIsIDApICE9IDApCisJCQkJY29udGludWU7CisKKwkJCS8qIGdldCBhYmJyZXZpYXRpb24gZm9yIHN0YXR1cyBmaWVsZCAxICovCisJCQlzMSA9IHN0YXRfc3RyWzBdID09ICdpJyA/ICdpJyA6ICdyJzsKKworCQkJLyogZ2V0IGFiYnJldmlhdGlvbiBmb3Igc3RhdHVzIGZpZWxkIDIgKi8KKwkJCWZvciAoaiA9IDAsIHNwY2NudCA9IDA7IHN0YXRfc3RyW2pdICYmIHNwY2NudCA8IDI7IGorKykgeworCQkJCWlmIChzdGF0X3N0cltqXSA9PSAnICcpIHNwY2NudCsrOworCQkJfQorCQkJczIgPSBzdGF0X3N0cltqXTsKKworCQkJLyogcHJpbnQgb3V0IHRoZSBsaW5lIGZvcm1hdHRlZCBsaWtlIERlYmlhbiBkcGtnICovCisJCQlwcmludGYoIiVjJWMgICUtMTRzICVzXG4iLCBzMSwgczIsIG5hbWVfc3RyLCB2ZXJzX3N0cik7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbW92ZV9wYWNrYWdlKGNvbnN0IHVuc2lnbmVkIHBhY2thZ2VfbnVtLCBpbnQgbm9pc3kpCit7CisJY29uc3QgY2hhciAqcGFja2FnZV9uYW1lID0gbmFtZV9oYXNodGFibGVbcGFja2FnZV9oYXNodGFibGVbcGFja2FnZV9udW1dLT5uYW1lXTsKKwljb25zdCBjaGFyICpwYWNrYWdlX3ZlcnNpb24gPSBuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2hhc2h0YWJsZVtwYWNrYWdlX251bV0tPnZlcnNpb25dOworCWNvbnN0IHVuc2lnbmVkIHN0YXR1c19udW0gPSBzZWFyY2hfc3RhdHVzX2hhc2h0YWJsZShwYWNrYWdlX25hbWUpOworCWNvbnN0IGludCBwYWNrYWdlX25hbWVfbGVuZ3RoID0gc3RybGVuKHBhY2thZ2VfbmFtZSk7CisJY2hhciAqKnJlbW92ZV9maWxlczsKKwljaGFyICoqZXhjbHVkZV9maWxlczsKKwljaGFyIGxpc3RfbmFtZVtwYWNrYWdlX25hbWVfbGVuZ3RoICsgMjVdOworCWNoYXIgY29uZmZpbGVfbmFtZVtwYWNrYWdlX25hbWVfbGVuZ3RoICsgMzBdOworCisJaWYgKG5vaXN5KQorCQlwcmludGYoIlJlbW92aW5nICVzICglcykuLi5cbiIsIHBhY2thZ2VfbmFtZSwgcGFja2FnZV92ZXJzaW9uKTsKKworCS8qIFJ1biBwcmVybSBzY3JpcHQgKi8KKwlydW5fcGFja2FnZV9zY3JpcHRfb3JfZGllKHBhY2thZ2VfbmFtZSwgInByZXJtIik7CisKKwkvKiBDcmVhdGUgYSBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZSwgYW5kIGEgc2VwYXJhdGUgbGlzdCBvZiB0aG9zZSB0byBrZWVwICovCisJc3ByaW50ZihsaXN0X25hbWUsICIvdmFyL2xpYi9kcGtnL2luZm8vJXMuJXMiLCBwYWNrYWdlX25hbWUsICJsaXN0Iik7CisJcmVtb3ZlX2ZpbGVzID0gY3JlYXRlX2xpc3QobGlzdF9uYW1lKTsKKworCXNwcmludGYoY29uZmZpbGVfbmFtZSwgIi92YXIvbGliL2Rwa2cvaW5mby8lcy4lcyIsIHBhY2thZ2VfbmFtZSwgImNvbmZmaWxlcyIpOworCWV4Y2x1ZGVfZmlsZXMgPSBjcmVhdGVfbGlzdChjb25mZmlsZV9uYW1lKTsKKworCS8qIFNvbWUgZGlyZWN0b3JpZXMgY2FuJ3QgYmUgcmVtb3ZlZCBzdHJhaWdodCBhd2F5LCBzbyBkbyBtdWx0aXBsZSBwYXNzZXMgKi8KKwl3aGlsZSAocmVtb3ZlX2ZpbGVfYXJyYXkocmVtb3ZlX2ZpbGVzLCBleGNsdWRlX2ZpbGVzKSkKKwkJY29udGludWU7CisJZnJlZV9hcnJheShleGNsdWRlX2ZpbGVzKTsKKwlmcmVlX2FycmF5KHJlbW92ZV9maWxlcyk7CisKKwkvKiBDcmVhdGUgYSBsaXN0IG9mIGZpbGVzIGluIC92YXIvbGliL2Rwa2cvaW5mby88cGFja2FnZT4uKiB0byBrZWVwICovCisJZXhjbHVkZV9maWxlcyA9IHh6YWxsb2Moc2l6ZW9mKGV4Y2x1ZGVfZmlsZXNbMF0pICogMyk7CisJZXhjbHVkZV9maWxlc1swXSA9IHhzdHJkdXAoY29uZmZpbGVfbmFtZSk7CisJZXhjbHVkZV9maWxlc1sxXSA9IHhhc3ByaW50ZigiL3Zhci9saWIvZHBrZy9pbmZvLyVzLiVzIiwgcGFja2FnZV9uYW1lLCAicG9zdHJtIik7CisKKwkvKiBDcmVhdGUgYSBsaXN0IG9mIGFsbCAvdmFyL2xpYi9kcGtnL2luZm8vPHBhY2thZ2U+IGZpbGVzICovCisJcmVtb3ZlX2ZpbGVzID0gYWxsX2NvbnRyb2xfbGlzdChwYWNrYWdlX25hbWUpOworCisJcmVtb3ZlX2ZpbGVfYXJyYXkocmVtb3ZlX2ZpbGVzLCBleGNsdWRlX2ZpbGVzKTsKKwlmcmVlX2FycmF5KHJlbW92ZV9maWxlcyk7CisJZnJlZV9hcnJheShleGNsdWRlX2ZpbGVzKTsKKworCS8qIHJlbmFtZSA8cGFja2FnZT4uY29uZmZpbGVzIHRvIDxwYWNrYWdlPi5saXN0CisJICogVGhlIGNvbmZmaWxlcyBjb250cm9sIGZpbGUgaXNuJ3QgcmVxdWlyZWQgaW4gRGViaWFuIHBhY2thZ2VzLCBzbyBkb24ndAorCSAqIGVycm9yIG91dCBpZiBpdCdzIG1pc3NpbmcuICAqLworCXJlbmFtZShjb25mZmlsZV9uYW1lLCBsaXN0X25hbWUpOworCisJLyogQ2hhbmdlIHBhY2thZ2Ugc3RhdHVzICovCisJc2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAiY29uZmlnLWZpbGVzIiwgMyk7Cit9CisKK3N0YXRpYyB2b2lkIHB1cmdlX3BhY2thZ2UoY29uc3QgdW5zaWduZWQgcGFja2FnZV9udW0pCit7CisJY29uc3QgY2hhciAqcGFja2FnZV9uYW1lID0gbmFtZV9oYXNodGFibGVbcGFja2FnZV9oYXNodGFibGVbcGFja2FnZV9udW1dLT5uYW1lXTsKKwljb25zdCBjaGFyICpwYWNrYWdlX3ZlcnNpb24gPSBuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2hhc2h0YWJsZVtwYWNrYWdlX251bV0tPnZlcnNpb25dOworCWNvbnN0IHVuc2lnbmVkIHN0YXR1c19udW0gPSBzZWFyY2hfc3RhdHVzX2hhc2h0YWJsZShwYWNrYWdlX25hbWUpOworCWNoYXIgKipyZW1vdmVfZmlsZXM7CisJY2hhciAqKmV4Y2x1ZGVfZmlsZXM7CisJY2hhciBsaXN0X25hbWVbc3RybGVuKHBhY2thZ2VfbmFtZSkgKyAyNV07CisKKwlwcmludGYoIlB1cmdpbmcgJXMgKCVzKS4uLlxuIiwgcGFja2FnZV9uYW1lLCBwYWNrYWdlX3ZlcnNpb24pOworCisJLyogUnVuIHByZXJtIHNjcmlwdCAqLworCXJ1bl9wYWNrYWdlX3NjcmlwdF9vcl9kaWUocGFja2FnZV9uYW1lLCAicHJlcm0iKTsKKworCS8qIENyZWF0ZSBhIGxpc3Qgb2YgZmlsZXMgdG8gcmVtb3ZlICovCisJc3ByaW50ZihsaXN0X25hbWUsICIvdmFyL2xpYi9kcGtnL2luZm8vJXMuJXMiLCBwYWNrYWdlX25hbWUsICJsaXN0Iik7CisJcmVtb3ZlX2ZpbGVzID0gY3JlYXRlX2xpc3QobGlzdF9uYW1lKTsKKworCS8qIFNvbWUgZGlyZWN0b3JpZXMgY2FudCBiZSByZW1vdmVkIHN0cmFpZ2h0IGF3YXksIHNvIGRvIG11bHRpcGxlIHBhc3NlcyAqLworCXdoaWxlIChyZW1vdmVfZmlsZV9hcnJheShyZW1vdmVfZmlsZXMsIE5VTEwpKQorCQljb250aW51ZTsKKwlmcmVlX2FycmF5KHJlbW92ZV9maWxlcyk7CisKKwkvKiBDcmVhdGUgYSBsaXN0IG9mIGFsbCAvdmFyL2xpYi9kcGtnL2luZm8vPHBhY2thZ2U+IGZpbGVzICovCisJcmVtb3ZlX2ZpbGVzID0gYWxsX2NvbnRyb2xfbGlzdChwYWNrYWdlX25hbWUpOworCisJLyogRGVsZXRlIGFsbCBvZiB0aGVtIGV4Y2VwdCB0aGUgcG9zdHJtIHNjcmlwdCAqLworCWV4Y2x1ZGVfZmlsZXMgPSB4emFsbG9jKHNpemVvZihleGNsdWRlX2ZpbGVzWzBdKSAqIDIpOworCWV4Y2x1ZGVfZmlsZXNbMF0gPSB4YXNwcmludGYoIi92YXIvbGliL2Rwa2cvaW5mby8lcy4lcyIsIHBhY2thZ2VfbmFtZSwgInBvc3RybSIpOworCXJlbW92ZV9maWxlX2FycmF5KHJlbW92ZV9maWxlcywgZXhjbHVkZV9maWxlcyk7CisJZnJlZV9hcnJheShleGNsdWRlX2ZpbGVzKTsKKworCS8qIFJ1biBhbmQgcmVtb3ZlIHBvc3RybSBzY3JpcHQgKi8KKwlydW5fcGFja2FnZV9zY3JpcHRfb3JfZGllKHBhY2thZ2VfbmFtZSwgInBvc3RybSIpOworCXJlbW92ZV9maWxlX2FycmF5KHJlbW92ZV9maWxlcywgTlVMTCk7CisKKwlmcmVlX2FycmF5KHJlbW92ZV9maWxlcyk7CisKKwkvKiBDaGFuZ2UgcGFja2FnZSBzdGF0dXMgKi8KKwlzZXRfc3RhdHVzKHN0YXR1c19udW0sICJub3QtaW5zdGFsbGVkIiwgMyk7Cit9CisKK3N0YXRpYyBhcmNoaXZlX2hhbmRsZV90ICppbml0X2FyY2hpdmVfZGViX2FyKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWFyY2hpdmVfaGFuZGxlX3QgKmFyX2hhbmRsZTsKKworCS8qIFNldHVwIGFuIGFyIGFyY2hpdmUgaGFuZGxlIHRoYXQgcmVmZXJzIHRvIHRoZSBnemlwIHN1YiBhcmNoaXZlICovCisJYXJfaGFuZGxlID0gaW5pdF9oYW5kbGUoKTsKKwlhcl9oYW5kbGUtPmZpbHRlciA9IGZpbHRlcl9hY2NlcHRfbGlzdF9yZWFzc2lnbjsKKwlhcl9oYW5kbGUtPnNyY19mZCA9IHhvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisKKwlyZXR1cm4gYXJfaGFuZGxlOworfQorCitzdGF0aWMgdm9pZCBpbml0X2FyY2hpdmVfZGViX2NvbnRyb2woYXJjaGl2ZV9oYW5kbGVfdCAqYXJfaGFuZGxlKQoreworCWFyY2hpdmVfaGFuZGxlX3QgKnRhcl9oYW5kbGU7CisKKwkvKiBTZXR1cCB0aGUgdGFyIGFyY2hpdmUgaGFuZGxlICovCisJdGFyX2hhbmRsZSA9IGluaXRfaGFuZGxlKCk7CisJdGFyX2hhbmRsZS0+c3JjX2ZkID0gYXJfaGFuZGxlLT5zcmNfZmQ7CisKKwkvKiBXZSBkb24ndCBjYXJlIGFib3V0IGRhdGEudGFyLiogb3IgZGViaWFuLWJpbmFyeSwganVzdCBjb250cm9sLnRhci4qICovCisJbGxpc3RfYWRkX3RvKCYoYXJfaGFuZGxlLT5hY2NlcHQpLCAoY2hhciopImNvbnRyb2wudGFyIik7CisjaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfR1oKKwlsbGlzdF9hZGRfdG8oJihhcl9oYW5kbGUtPmFjY2VwdCksIChjaGFyKikiY29udHJvbC50YXIuZ3oiKTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0JaMgorCWxsaXN0X2FkZF90bygmKGFyX2hhbmRsZS0+YWNjZXB0KSwgKGNoYXIqKSJjb250cm9sLnRhci5iejIiKTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX1haCisJbGxpc3RfYWRkX3RvKCYoYXJfaGFuZGxlLT5hY2NlcHQpLCAoY2hhciopImNvbnRyb2wudGFyLnh6Iik7CisjZW5kaWYKKworCS8qIEFzc2lnbiB0aGUgdGFyIGhhbmRsZSBhcyBhIHN1YmFyY2hpdmUgb2YgdGhlIGFyIGhhbmRsZSAqLworCWFyX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUgPSB0YXJfaGFuZGxlOworfQorCitzdGF0aWMgdm9pZCBpbml0X2FyY2hpdmVfZGViX2RhdGEoYXJjaGl2ZV9oYW5kbGVfdCAqYXJfaGFuZGxlKQoreworCWFyY2hpdmVfaGFuZGxlX3QgKnRhcl9oYW5kbGU7CisKKwkvKiBTZXR1cCB0aGUgdGFyIGFyY2hpdmUgaGFuZGxlICovCisJdGFyX2hhbmRsZSA9IGluaXRfaGFuZGxlKCk7CisJdGFyX2hhbmRsZS0+c3JjX2ZkID0gYXJfaGFuZGxlLT5zcmNfZmQ7CisKKwkvKiBXZSBkb24ndCBjYXJlIGFib3V0IGNvbnRyb2wudGFyLiogb3IgZGViaWFuLWJpbmFyeSwganVzdCBkYXRhLnRhci4qICovCisJbGxpc3RfYWRkX3RvKCYoYXJfaGFuZGxlLT5hY2NlcHQpLCAoY2hhciopImRhdGEudGFyIik7CisjaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfR1oKKwlsbGlzdF9hZGRfdG8oJihhcl9oYW5kbGUtPmFjY2VwdCksIChjaGFyKikiZGF0YS50YXIuZ3oiKTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0JaMgorCWxsaXN0X2FkZF90bygmKGFyX2hhbmRsZS0+YWNjZXB0KSwgKGNoYXIqKSJkYXRhLnRhci5iejIiKTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0xaTUEKKwlsbGlzdF9hZGRfdG8oJihhcl9oYW5kbGUtPmFjY2VwdCksIChjaGFyKikiZGF0YS50YXIubHptYSIpOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfWFoKKwlsbGlzdF9hZGRfdG8oJihhcl9oYW5kbGUtPmFjY2VwdCksIChjaGFyKikiZGF0YS50YXIueHoiKTsKKyNlbmRpZgorCisJLyogQXNzaWduIHRoZSB0YXIgaGFuZGxlIGFzIGEgc3ViYXJjaGl2ZSBvZiB0aGUgYXIgaGFuZGxlICovCisJYXJfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZSA9IHRhcl9oYW5kbGU7Cit9CisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBkYXRhX2V4dHJhY3RfdG9fYnVmZmVyKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKQoreworCXVuc2lnbmVkIHNpemUgPSBhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXItPnNpemU7CisKKwlhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fYnVmZmVyID0geHphbGxvYyhzaXplICsgMSk7CisJeHJlYWQoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX2J1ZmZlciwgc2l6ZSk7Cit9CisKK3N0YXRpYyBjaGFyICpkZWJfZXh0cmFjdF9jb250cm9sX2ZpbGVfdG9fYnVmZmVyKGFyY2hpdmVfaGFuZGxlX3QgKmFyX2hhbmRsZSwgbGxpc3RfdCAqbXlhY2NlcHQpCit7CisJYXJfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZS0+YWN0aW9uX2RhdGEgPSBkYXRhX2V4dHJhY3RfdG9fYnVmZmVyOworCWFyX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUtPmFjY2VwdCA9IG15YWNjZXB0OworCWFyX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUtPmZpbHRlciA9IGZpbHRlcl9hY2NlcHRfbGlzdDsKKworCXVucGFja19hcl9hcmNoaXZlKGFyX2hhbmRsZSk7CisJY2xvc2UoYXJfaGFuZGxlLT5zcmNfZmQpOworCisJcmV0dXJuIGFyX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUtPmRwa2dfX2J1ZmZlcjsKK30KKworc3RhdGljIHZvaWQgYXBwZW5kX2NvbnRyb2xfZmlsZV90b19sbGlzdChjb25zdCBjaGFyICpwYWNrYWdlX25hbWUsIGNvbnN0IGNoYXIgKmNvbnRyb2xfbmFtZSwgbGxpc3RfdCAqKmxsKQoreworCUZJTEUgKmZwOworCWNoYXIgKmZpbGVuYW1lLCAqbGluZTsKKworCWZpbGVuYW1lID0geGFzcHJpbnRmKCIvdmFyL2xpYi9kcGtnL2luZm8vJXMuJXMiLCBwYWNrYWdlX25hbWUsIGNvbnRyb2xfbmFtZSk7CisJZnAgPSBmb3Blbl9mb3JfcmVhZChmaWxlbmFtZSk7CisJZnJlZShmaWxlbmFtZSk7CisJaWYgKGZwICE9IE5VTEwpIHsKKwkJd2hpbGUgKChsaW5lID0geG1hbGxvY19mZ2V0bGluZShmcCkpICE9IE5VTEwpCisJCQlsbGlzdF9hZGRfdG8obGwsIGxpbmUpOworCQlmY2xvc2UoZnApOworCX0KK30KKworc3RhdGljIGNoYXIgRkFTVF9GVU5DIGZpbHRlcl9yZW5hbWVfY29uZmlnKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKQoreworCWludCBmZDsKKwljaGFyICpuYW1lX3B0ciA9IGFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlci0+bmFtZSArIDE7CisKKwkvKiBJcyB0aGlzIGZpbGUgbWFya2VkIGFzIGNvbmZpZyBmaWxlPyAqLworCWlmICghZmluZF9saXN0X2VudHJ5KGFyY2hpdmVfaGFuZGxlLT5hY2NlcHQsIG5hbWVfcHRyKSkKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsgLyogbm8gKi8KKworCWZkID0gb3BlbihuYW1lX3B0ciwgT19SRE9OTFkpOworCWlmIChmZCA+PSAwKSB7CisJCW1kNV9jdHhfdCBtZDU7CisJCWNoYXIgKm1kNWxpbmUsICpidWY7CisJCWludCBjb3VudDsKKworCQkvKiBDYWxjdWxhdGUgTUQ1IG9mIGV4aXN0aW5nIGZpbGUgKi8KKwkJYnVmID0geG1hbGxvYyg0MDk2KTsKKwkJbWQ1X2JlZ2luKCZtZDUpOworCQl3aGlsZSAoKGNvdW50ID0gc2FmZV9yZWFkKGZkLCBidWYsIDQwOTYpKSA+IDApCisJCQltZDVfaGFzaCgmbWQ1LCBidWYsIGNvdW50KTsKKwkJbWQ1X2VuZCgmbWQ1LCBidWYpOyAvKiB1c2luZyBidWYgYXMgcmVzdWx0IHN0b3JhZ2UgKi8KKwkJY2xvc2UoZmQpOworCisJCW1kNWxpbmUgPSB4bWFsbG9jKDE2ICogMiArIDIgKyBzdHJsZW4obmFtZV9wdHIpICsgMSk7CisJCXNwcmludGYoYmluMmhleChtZDVsaW5lLCBidWYsIDE2KSwgIiAgJXMiLCBuYW1lX3B0cik7CisJCWZyZWUoYnVmKTsKKworCQkvKiBJcyBpdCBjaGFuZ2VkIGFmdGVyIGluc3RhbGw/ICovCisJCWlmIChmaW5kX2xpc3RfZW50cnkoYXJjaGl2ZV9oYW5kbGUtPmFjY2VwdCwgbWQ1bGluZSkgPT0gTlVMTCkgeworCQkJcHJpbnRmKCJXYXJuaW5nOiBDcmVhdGluZyAlcyBhcyAlcy5kcGtnLW5ld1xuIiwgbmFtZV9wdHIsIG5hbWVfcHRyKTsKKwkJCWFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlci0+bmFtZSA9IHhhc3ByaW50ZigiJXMuZHBrZy1uZXciLCBhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXItPm5hbWUpOworCQl9CisJCWZyZWUobWQ1bGluZSk7CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBkYXRhX2V4dHJhY3RfYWxsX3ByZWZpeChhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkKK3sKKwljaGFyICpuYW1lX3B0ciA9IGFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlci0+bmFtZTsKKworCS8qIFNraXAgYWxsIGxlYWRpbmcgIi8iICovCisJd2hpbGUgKCpuYW1lX3B0ciA9PSAnLycpCisJCW5hbWVfcHRyKys7CisJLyogU2tpcCBhbGwgbGVhZGluZyAiLi8iIGFuZCAiLi4vIiAqLworCXdoaWxlIChuYW1lX3B0clswXSA9PSAnLicpIHsKKwkJaWYgKG5hbWVfcHRyWzFdID09ICcuJykKKwkJCW5hbWVfcHRyKys7CisJCWlmIChuYW1lX3B0clsxXSAhPSAnLycpCisJCQlicmVhazsKKwkJbmFtZV9wdHIgKz0gMjsKKwl9CisKKwlpZiAobmFtZV9wdHJbMF0gIT0gJ1wwJykgeworCQlhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXItPm5hbWUgPSB4YXNwcmludGYoIiVzJXMiLCBhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fYnVmZmVyLCBuYW1lX3B0cik7CisJCWRhdGFfZXh0cmFjdF9hbGwoYXJjaGl2ZV9oYW5kbGUpOworCQlpZiAoZm5tYXRjaCgiKi5kcGtnLW5ldyIsIGFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlci0+bmFtZSwgMCkgPT0gMCkgeworCQkJLyogcmVtb3ZlIC5kcGtnLW5ldyBzdWZmaXggKi8KKwkJCWFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlci0+bmFtZVtzdHJsZW4oYXJjaGl2ZV9oYW5kbGUtPmZpbGVfaGVhZGVyLT5uYW1lKSAtIDldID0gJ1wwJzsKKwkJfQorCX0KK30KKworZW51bSB7CisJLyogQ29tbWFuZHMgKi8KKwlPUFRfY29uZmlndXJlICAgICAgICAgICAgPSAoMSA8PCAwKSwKKwlPUFRfaW5zdGFsbCAgICAgICAgICAgICAgPSAoMSA8PCAxKSwKKwlPUFRfbGlzdF9pbnN0YWxsZWQgICAgICAgPSAoMSA8PCAyKSwKKwlPUFRfcHVyZ2UgICAgICAgICAgICAgICAgPSAoMSA8PCAzKSwKKwlPUFRfcmVtb3ZlICAgICAgICAgICAgICAgPSAoMSA8PCA0KSwKKwlPUFRfdW5wYWNrICAgICAgICAgICAgICAgPSAoMSA8PCA1KSwKKwlPUFRNQVNLX2NtZCAgICAgICAgICAgICAgPSAoMSA8PCA2KSAtIDEsCisJLyogT3B0aW9ucyAqLworCU9QVF9mb3JjZSAgICAgICAgICAgICAgICA9ICgxIDw8IDYpLAorCU9QVF9mb3JjZV9pZ25vcmVfZGVwZW5kcyA9ICgxIDw8IDcpLAorCU9QVF9mb3JjZV9jb25mbmV3ICAgICAgICA9ICgxIDw8IDgpLAorCU9QVF9mb3JjZV9jb25mb2xkICAgICAgICA9ICgxIDw8IDkpLAorfTsKKworc3RhdGljIHZvaWQgdW5wYWNrX3BhY2thZ2UoZGViX2ZpbGVfdCAqZGViX2ZpbGUpCit7CisJY29uc3QgY2hhciAqcGFja2FnZV9uYW1lID0gbmFtZV9oYXNodGFibGVbcGFja2FnZV9oYXNodGFibGVbZGViX2ZpbGUtPnBhY2thZ2VdLT5uYW1lXTsKKwljb25zdCB1bnNpZ25lZCBzdGF0dXNfbnVtID0gc2VhcmNoX3N0YXR1c19oYXNodGFibGUocGFja2FnZV9uYW1lKTsKKwljb25zdCB1bnNpZ25lZCBzdGF0dXNfcGFja2FnZV9udW0gPSBzdGF0dXNfaGFzaHRhYmxlW3N0YXR1c19udW1dLT5wYWNrYWdlOworCWNoYXIgKmluZm9fcHJlZml4OworCWNoYXIgKmxpc3RfZmlsZW5hbWU7CisJYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGU7CisJRklMRSAqb3V0X3N0cmVhbTsKKwlsbGlzdF90ICphY2NlcHRfbGlzdDsKKwlsbGlzdF90ICpjb25mZmlsZV9saXN0OworCWludCBpOworCisJLyogSWYgZXhpc3RpbmcgdmVyc2lvbiwgcmVtb3ZlIGl0IGZpcnN0ICovCisJY29uZmZpbGVfbGlzdCA9IE5VTEw7CisJaWYgKHN0cmNtcChuYW1lX2hhc2h0YWJsZVtnZXRfc3RhdHVzKHN0YXR1c19udW0sIDMpXSwgImluc3RhbGxlZCIpID09IDApIHsKKwkJLyogUGFja2FnZSBpcyBhbHJlYWR5IGluc3RhbGxlZCwgcmVtb3ZlIG9sZCB2ZXJzaW9uIGZpcnN0ICovCisJCXByaW50ZigiUHJlcGFyaW5nIHRvIHJlcGxhY2UgJXMgJXMgKHVzaW5nICVzKS4uLlxuIiwgcGFja2FnZV9uYW1lLAorCQkJbmFtZV9oYXNodGFibGVbcGFja2FnZV9oYXNodGFibGVbc3RhdHVzX3BhY2thZ2VfbnVtXS0+dmVyc2lvbl0sCisJCQlkZWJfZmlsZS0+ZmlsZW5hbWUpOworCisJCS8qIFJlYWQgbWQ1c3VtcyBmcm9tIG9sZCBwYWNrYWdlICovCisJCWlmICghKG9wdGlvbl9tYXNrMzIgJiBPUFRfZm9yY2VfY29uZm9sZCkpCisJCQlhcHBlbmRfY29udHJvbF9maWxlX3RvX2xsaXN0KHBhY2thZ2VfbmFtZSwgIm1kNXN1bXMiLCAmY29uZmZpbGVfbGlzdCk7CisKKwkJcmVtb3ZlX3BhY2thZ2Uoc3RhdHVzX3BhY2thZ2VfbnVtLCAwKTsKKwl9IGVsc2UgeworCQlwcmludGYoIlVucGFja2luZyAlcyAoZnJvbSAlcykuLi5cbiIsIHBhY2thZ2VfbmFtZSwgZGViX2ZpbGUtPmZpbGVuYW1lKTsKKwl9CisKKwkvKiBFeHRyYWN0IGNvbnRyb2wudGFyLmd6IHRvIC92YXIvbGliL2Rwa2cvaW5mby88cGFja2FnZT4uZmlsZW5hbWUgKi8KKwlpbmZvX3ByZWZpeCA9IHhhc3ByaW50ZigiL3Zhci9saWIvZHBrZy9pbmZvLyVzLiVzIiwgcGFja2FnZV9uYW1lLCAiIik7CisJYXJjaGl2ZV9oYW5kbGUgPSBpbml0X2FyY2hpdmVfZGViX2FyKGRlYl9maWxlLT5maWxlbmFtZSk7CisJaW5pdF9hcmNoaXZlX2RlYl9jb250cm9sKGFyY2hpdmVfaGFuZGxlKTsKKworCWFjY2VwdF9saXN0ID0gTlVMTDsKKwlpID0gMDsKKwl3aGlsZSAoaSA8IEFSUkFZX1NJWkUoYWxsX2NvbnRyb2xfZmlsZXMpKSB7CisJCWNoYXIgKmMgPSB4YXNwcmludGYoIi4vJXMiLCBhbGxfY29udHJvbF9maWxlc1tpXSk7CisJCWxsaXN0X2FkZF90bygmYWNjZXB0X2xpc3QsIGMpOworCQlpKys7CisJfQorCWFyY2hpdmVfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZS0+YWNjZXB0ID0gYWNjZXB0X2xpc3Q7CisJYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX3N1Yl9hcmNoaXZlLT5maWx0ZXIgPSBmaWx0ZXJfYWNjZXB0X2xpc3Q7CisJYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX3N1Yl9hcmNoaXZlLT5hY3Rpb25fZGF0YSA9IGRhdGFfZXh0cmFjdF9hbGxfcHJlZml4OworCWFyY2hpdmVfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZS0+ZHBrZ19fYnVmZmVyID0gaW5mb19wcmVmaXg7CisJYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX3N1Yl9hcmNoaXZlLT5haF9mbGFncyB8PSBBUkNISVZFX1VOTElOS19PTEQ7CisJdW5wYWNrX2FyX2FyY2hpdmUoYXJjaGl2ZV9oYW5kbGUpOworCisJLyogUnVuIHRoZSBwcmVpbnN0IHByaW9yIHRvIGV4dHJhY3RpbmcgKi8KKwlydW5fcGFja2FnZV9zY3JpcHRfb3JfZGllKHBhY2thZ2VfbmFtZSwgInByZWluc3QiKTsKKworCS8qIERvbid0IG92ZXJ3cml0ZSBleGlzdGluZyBjb25maWcgZmlsZXMgKi8KKwlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX2ZvcmNlX2NvbmZuZXcpKQorCQlhcHBlbmRfY29udHJvbF9maWxlX3RvX2xsaXN0KHBhY2thZ2VfbmFtZSwgImNvbmZmaWxlcyIsICZjb25mZmlsZV9saXN0KTsKKworCS8qIEV4dHJhY3QgZGF0YS50YXIuZ3ogdG8gdGhlIHJvb3QgZGlyZWN0b3J5ICovCisJYXJjaGl2ZV9oYW5kbGUgPSBpbml0X2FyY2hpdmVfZGViX2FyKGRlYl9maWxlLT5maWxlbmFtZSk7CisJaW5pdF9hcmNoaXZlX2RlYl9kYXRhKGFyY2hpdmVfaGFuZGxlKTsKKwlhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUtPmFjY2VwdCA9IGNvbmZmaWxlX2xpc3Q7CisJLyogV2h5IEFSQ0hJVkVfUkVNRU1CRVJfTkFNRVM/CisJICogV2Ugd2FudCBuYW1lcyBjb2xsZWN0ZWQgaW4gLT5wYXNzZWQgbGlzdCBldmVuIGlmIGNvbmZmaWxlX2xpc3QKKwkgKiBpcyBOVUxMIChvdGhlcndpc2UgZ2V0X2hlYWRlcl90YXIgbWF5IG9wdGltaXplIG5hbWUgc2F2aW5nIG91dCk6CisJICovCisJYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX3N1Yl9hcmNoaXZlLT5haF9mbGFncyB8PSBBUkNISVZFX1JFTUVNQkVSX05BTUVTIHwgQVJDSElWRV9VTkxJTktfT0xEOworCWFyY2hpdmVfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZS0+ZmlsdGVyID0gZmlsdGVyX3JlbmFtZV9jb25maWc7CisJYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX3N1Yl9hcmNoaXZlLT5hY3Rpb25fZGF0YSA9IGRhdGFfZXh0cmFjdF9hbGxfcHJlZml4OworCWFyY2hpdmVfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZS0+ZHBrZ19fYnVmZmVyID0gKGNoYXIqKSIvIjsgLyogaHVoPyAqLworCXVucGFja19hcl9hcmNoaXZlKGFyY2hpdmVfaGFuZGxlKTsKKworCS8qIENyZWF0ZSB0aGUgbGlzdCBmaWxlICovCisJbGlzdF9maWxlbmFtZSA9IHhhc3ByaW50ZigiL3Zhci9saWIvZHBrZy9pbmZvLyVzLiVzIiwgcGFja2FnZV9uYW1lLCAibGlzdCIpOworCW91dF9zdHJlYW0gPSB4Zm9wZW5fZm9yX3dyaXRlKGxpc3RfZmlsZW5hbWUpOworCWFyY2hpdmVfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZS0+cGFzc2VkID0gbGxpc3RfcmV2KGFyY2hpdmVfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZS0+cGFzc2VkKTsKKwl3aGlsZSAoYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX3N1Yl9hcmNoaXZlLT5wYXNzZWQpIHsKKwkJY2hhciAqZmlsZW5hbWUgPSBsbGlzdF9wb3AoJmFyY2hpdmVfaGFuZGxlLT5kcGtnX19zdWJfYXJjaGl2ZS0+cGFzc2VkKTsKKwkJLyogdGhlIGxlYWRpbmcgLiBoYXMgYmVlbiBzdHJpcHBlZCBieSBkYXRhX2V4dHJhY3RfYWxsX3ByZWZpeCBhbHJlYWR5ICovCisJCWZwcmludGYob3V0X3N0cmVhbSwgIiVzXG4iLCBmaWxlbmFtZSk7CisJCWZyZWUoZmlsZW5hbWUpOworCX0KKwlmY2xvc2Uob3V0X3N0cmVhbSk7CisKKwkvKiBjaGFuZ2Ugc3RhdHVzICovCisJc2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAiaW5zdGFsbCIsIDEpOworCXNldF9zdGF0dXMoc3RhdHVzX251bSwgInVucGFja2VkIiwgMyk7CisKKwlmcmVlKGluZm9fcHJlZml4KTsKKwlmcmVlKGxpc3RfZmlsZW5hbWUpOworfQorCitzdGF0aWMgdm9pZCBjb25maWd1cmVfcGFja2FnZShkZWJfZmlsZV90ICpkZWJfZmlsZSkKK3sKKwljb25zdCBjaGFyICpwYWNrYWdlX25hbWUgPSBuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2hhc2h0YWJsZVtkZWJfZmlsZS0+cGFja2FnZV0tPm5hbWVdOworCWNvbnN0IGNoYXIgKnBhY2thZ2VfdmVyc2lvbiA9IG5hbWVfaGFzaHRhYmxlW3BhY2thZ2VfaGFzaHRhYmxlW2RlYl9maWxlLT5wYWNrYWdlXS0+dmVyc2lvbl07CisJY29uc3QgaW50IHN0YXR1c19udW0gPSBzZWFyY2hfc3RhdHVzX2hhc2h0YWJsZShwYWNrYWdlX25hbWUpOworCisJcHJpbnRmKCJTZXR0aW5nIHVwICVzICglcykuLi5cbiIsIHBhY2thZ2VfbmFtZSwgcGFja2FnZV92ZXJzaW9uKTsKKworCS8qIFJ1biB0aGUgcG9zdGluc3Qgc2NyaXB0ICovCisJLyogVE9ETzogaGFuZGxlIGZhaWx1cmUgZ3JhY2VmdWxseSAqLworCXJ1bl9wYWNrYWdlX3NjcmlwdF9vcl9kaWUocGFja2FnZV9uYW1lLCAicG9zdGluc3QiKTsKKworCS8qIENoYW5nZSBzdGF0dXMgdG8gcmVmbGVjdCBzdWNjZXNzICovCisJc2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAiaW5zdGFsbCIsIDEpOworCXNldF9zdGF0dXMoc3RhdHVzX251bSwgImluc3RhbGxlZCIsIDMpOworfQorCitpbnQgZHBrZ19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZHBrZ19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJZGViX2ZpbGVfdCAqKmRlYl9maWxlID0gTlVMTDsKKwlzdGF0dXNfbm9kZV90ICpzdGF0dXNfbm9kZTsKKwljaGFyICpzdHJfZjsKKwlpbnQgb3B0OworCWludCBwYWNrYWdlX251bTsKKwlpbnQgZGViX2NvdW50ID0gMDsKKwlpbnQgc3RhdGVfc3RhdHVzOworCWludCBzdGF0dXNfbnVtOworCWludCBpOworI2lmIEVOQUJMRV9MT05HX09QVFMKKwlzdGF0aWMgY29uc3QgY2hhciBkcGtnX2xvbmdvcHRzW10gQUxJR04xID0KKy8vIEZJWE1FOiB3ZSB1c2UgLUMgbm9uLWNvbXBhdGlibHksIHNob3VsZCBiZToKKy8vICItQ3wtLWF1ZGl0IENoZWNrIGZvciBicm9rZW4gcGFja2FnZShzKSIKKwkJImNvbmZpZ3VyZVwwIiAgICAgIE5vX2FyZ3VtZW50ICAgICAgICAiQyIKKwkJImZvcmNlXDAiICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICAiRiIKKwkJImluc3RhbGxcMCIgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICAiaSIKKwkJImxpc3RcMCIgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICAibCIKKwkJInB1cmdlXDAiICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICAiUCIKKwkJInJlbW92ZVwwIiAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICAiciIKKwkJInVucGFja1wwIiAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICAidSIKKwkJImZvcmNlLWRlcGVuZHNcMCIgIE5vX2FyZ3VtZW50ICAgICAgICAiXHhmZiIKKwkJImZvcmNlLWNvbmZuZXdcMCIgIE5vX2FyZ3VtZW50ICAgICAgICAiXHhmZSIKKwkJImZvcmNlLWNvbmZvbGRcMCIgIE5vX2FyZ3VtZW50ICAgICAgICAiXHhmZCIKKwkJOworI2VuZGlmCisKKwlJTklUX0coKTsKKworCUlGX0xPTkdfT1BUUyhhcHBsZXRfbG9uZ19vcHRpb25zID0gZHBrZ19sb25nb3B0cyk7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIkNpbFBydUY6IiwgJnN0cl9mKTsKKwlhcmd2ICs9IG9wdGluZDsKKwkvL2lmIChvcHQgJiBPUFRfY29uZmlndXJlKSAuLi4gLy8gLUMKKwlpZiAob3B0ICYgT1BUX2ZvcmNlKSB7IC8vIC1GICgtLWZvcmNlIGluIG9mZmljaWFsIGRwa2cpCisJCWlmIChzdHJjbXAoc3RyX2YsICJkZXBlbmRzIikgPT0gMCkKKwkJCW9wdCB8PSBPUFRfZm9yY2VfaWdub3JlX2RlcGVuZHM7CisJCWVsc2UgaWYgKHN0cmNtcChzdHJfZiwgImNvbmZuZXciKSA9PSAwKQorCQkJb3B0IHw9IE9QVF9mb3JjZV9jb25mbmV3OworCQllbHNlIGlmIChzdHJjbXAoc3RyX2YsICJjb25mb2xkIikgPT0gMCkKKwkJCW9wdCB8PSBPUFRfZm9yY2VfY29uZm9sZDsKKwkJZWxzZQorCQkJYmJfc2hvd191c2FnZSgpOworCQlvcHRpb25fbWFzazMyID0gb3B0OworCX0KKwkvL2lmIChvcHQgJiBPUFRfaW5zdGFsbCkgLi4uIC8vIC1pCisJLy9pZiAob3B0ICYgT1BUX2xpc3RfaW5zdGFsbGVkKSAuLi4gLy8gLWwKKwkvL2lmIChvcHQgJiBPUFRfcHVyZ2UpIC4uLiAvLyAtUAorCS8vaWYgKG9wdCAmIE9QVF9yZW1vdmUpIC4uLiAvLyAtcgorCS8vaWYgKG9wdCAmIE9QVF91bnBhY2spIC4uLiAvLyAtdSAoLS11bnBhY2sgaW4gb2ZmaWNpYWwgZHBrZykKKwlpZiAoIShvcHQgJiBPUFRNQVNLX2NtZCkgLyogbm8gY21kICovCisJIHx8ICgob3B0ICYgT1BUTUFTS19jbWQpICYgKChvcHQgJiBPUFRNQVNLX2NtZCktMSkpIC8qIG1vcmUgdGhhbiBvbmUgY21kICovCisJKSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKy8qCXB1dHMoIihSZWFkaW5nIGRhdGFiYXNlIC4uLiB4eHh4eCBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgaW5zdGFsbGVkLikiKTsgKi8KKwlpbmRleF9zdGF0dXNfZmlsZSgiL3Zhci9saWIvZHBrZy9zdGF0dXMiKTsKKworCS8qIGlmIHRoZSBsaXN0IGFjdGlvbiB3YXMgZ2l2ZW4gcHJpbnQgdGhlIGluc3RhbGxlZCBwYWNrYWdlcyBhbmQgZXhpdCAqLworCWlmIChvcHQgJiBPUFRfbGlzdF9pbnN0YWxsZWQpIHsKKwkJbGlzdF9wYWNrYWdlcyhhcmd2WzBdKTsgLyogcGFyYW0gY2FuIGJlIE5VTEwgKi8KKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwkvKiBSZWFkIGFyZ3VtZW50cyBhbmQgc3RvcmUgcmVsZXZhbnQgaW5mbyBpbiBzdHJ1Y3RzICovCisJd2hpbGUgKCphcmd2KSB7CisJCS8qIGRlYl9jb3VudCA9IG5iX2VsZW0gLSAxIGFuZCB3ZSBuZWVkIG5iX2VsZW0gKyAxIHRvIGFsbG9jYXRlIHRlcm1pbmFsIG5vZGUgW05VTEwgcG9pbnRlcl0gKi8KKwkJZGViX2ZpbGUgPSB4cmVhbGxvY192ZWN0b3IoZGViX2ZpbGUsIDIsIGRlYl9jb3VudCk7CisJCWRlYl9maWxlW2RlYl9jb3VudF0gPSB4emFsbG9jKHNpemVvZihkZWJfZmlsZVswXVswXSkpOworCQlpZiAob3B0ICYgKE9QVF9pbnN0YWxsIHwgT1BUX3VucGFjaykpIHsKKwkJCS8qIC1pLy11OiByZXF1aXJlIGZpbGVuYW1lICovCisJCQlhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZTsKKwkJCWxsaXN0X3QgKmNvbnRyb2xfbGlzdCA9IE5VTEw7CisKKwkJCS8qIEV4dHJhY3QgdGhlIGNvbnRyb2wgZmlsZSAqLworCQkJbGxpc3RfYWRkX3RvKCZjb250cm9sX2xpc3QsIChjaGFyKikiLi9jb250cm9sIik7CisJCQlhcmNoaXZlX2hhbmRsZSA9IGluaXRfYXJjaGl2ZV9kZWJfYXIoYXJndlswXSk7CisJCQlpbml0X2FyY2hpdmVfZGViX2NvbnRyb2woYXJjaGl2ZV9oYW5kbGUpOworCQkJZGViX2ZpbGVbZGViX2NvdW50XS0+Y29udHJvbF9maWxlID0gZGViX2V4dHJhY3RfY29udHJvbF9maWxlX3RvX2J1ZmZlcihhcmNoaXZlX2hhbmRsZSwgY29udHJvbF9saXN0KTsKKwkJCWlmIChkZWJfZmlsZVtkZWJfY291bnRdLT5jb250cm9sX2ZpbGUgPT0gTlVMTCkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBleHRyYWN0IGNvbnRyb2wgZmlsZSIpOworCQkJfQorCQkJZGViX2ZpbGVbZGViX2NvdW50XS0+ZmlsZW5hbWUgPSB4c3RyZHVwKGFyZ3ZbMF0pOworCQkJcGFja2FnZV9udW0gPSBmaWxsX3BhY2thZ2Vfc3RydWN0KGRlYl9maWxlW2RlYl9jb3VudF0tPmNvbnRyb2xfZmlsZSk7CisKKwkJCWlmIChwYWNrYWdlX251bSA9PSAtMSkgeworCQkJCWJiX2Vycm9yX21zZygiaW52YWxpZCBjb250cm9sIGZpbGUgaW4gJXMiLCBhcmd2WzBdKTsKKwkJCQlhcmd2Kys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlkZWJfZmlsZVtkZWJfY291bnRdLT5wYWNrYWdlID0gKHVuc2lnbmVkKSBwYWNrYWdlX251bTsKKworCQkJLyogQWRkIHRoZSBwYWNrYWdlIHRvIHRoZSBzdGF0dXMgaGFzaHRhYmxlICovCisJCQlpZiAob3B0ICYgKE9QVF91bnBhY2sgfCBPUFRfaW5zdGFsbCkpIHsKKwkJCQkvKiBUcnkgYW5kIGZpbmQgYSBjdXJyZW50bHkgaW5zdGFsbGVkIHZlcnNpb24gb2YgdGhpcyBwYWNrYWdlICovCisJCQkJc3RhdHVzX251bSA9IHNlYXJjaF9zdGF0dXNfaGFzaHRhYmxlKG5hbWVfaGFzaHRhYmxlW3BhY2thZ2VfaGFzaHRhYmxlW2RlYl9maWxlW2RlYl9jb3VudF0tPnBhY2thZ2VdLT5uYW1lXSk7CisJCQkJLyogSWYgbm8gcHJldmlvdXMgZW50cnkgd2FzIGZvdW5kIGluaXRpYWxpc2UgYSBuZXcgZW50cnkgKi8KKwkJCQlpZiAoc3RhdHVzX2hhc2h0YWJsZVtzdGF0dXNfbnVtXSA9PSBOVUxMCisJCQkJIHx8IHN0YXR1c19oYXNodGFibGVbc3RhdHVzX251bV0tPnN0YXR1cyA9PSAwCisJCQkJKSB7CisJCQkJCXN0YXR1c19ub2RlID0geG1hbGxvYyhzaXplb2Yoc3RhdHVzX25vZGVfdCkpOworCQkJCQlzdGF0dXNfbm9kZS0+cGFja2FnZSA9IGRlYl9maWxlW2RlYl9jb3VudF0tPnBhY2thZ2U7CisJCQkJCS8qIHJlaW5zdHJlcSBpc250IGNoYW5nZWQgdG8gIm9rIiB1bnRpbCB0aGUgcGFja2FnZSBjb250cm9sIGluZm8KKwkJCQkJICogaXMgd3JpdHRlbiB0byB0aGUgc3RhdHVzIGZpbGUqLworCQkJCQlzdGF0dXNfbm9kZS0+c3RhdHVzID0gc2VhcmNoX25hbWVfaGFzaHRhYmxlKCJpbnN0YWxsIHJlaW5zdHJlcSBub3QtaW5zdGFsbGVkIik7CisJCQkJCXN0YXR1c19oYXNodGFibGVbc3RhdHVzX251bV0gPSBzdGF0dXNfbm9kZTsKKwkJCQl9IGVsc2UgeworCQkJCQlzZXRfc3RhdHVzKHN0YXR1c19udW0sICJpbnN0YWxsIiwgMSk7CisJCQkJCXNldF9zdGF0dXMoc3RhdHVzX251bSwgInJlaW5zdHJlcSIsIDIpOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChvcHQgJiAoT1BUX2NvbmZpZ3VyZSB8IE9QVF9wdXJnZSB8IE9QVF9yZW1vdmUpKSB7CisJCQkvKiAtQy8tcC8tcjogcmVxdWlyZSBwYWNrYWdlIG5hbWUgKi8KKwkJCWRlYl9maWxlW2RlYl9jb3VudF0tPnBhY2thZ2UgPSBzZWFyY2hfcGFja2FnZV9oYXNodGFibGUoCisJCQkJCXNlYXJjaF9uYW1lX2hhc2h0YWJsZShhcmd2WzBdKSwKKwkJCQkJc2VhcmNoX25hbWVfaGFzaHRhYmxlKCJBTlkiKSwgVkVSX0FOWSk7CisJCQlpZiAocGFja2FnZV9oYXNodGFibGVbZGViX2ZpbGVbZGViX2NvdW50XS0+cGFja2FnZV0gPT0gTlVMTCkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJwYWNrYWdlICVzIGlzIHVuaW5zdGFsbGVkIG9yIHVua25vd24iLCBhcmd2WzBdKTsKKwkJCX0KKwkJCXBhY2thZ2VfbnVtID0gZGViX2ZpbGVbZGViX2NvdW50XS0+cGFja2FnZTsKKwkJCXN0YXR1c19udW0gPSBzZWFyY2hfc3RhdHVzX2hhc2h0YWJsZShuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2hhc2h0YWJsZVtwYWNrYWdlX251bV0tPm5hbWVdKTsKKwkJCXN0YXRlX3N0YXR1cyA9IGdldF9zdGF0dXMoc3RhdHVzX251bSwgMyk7CisKKwkJCS8qIGNoZWNrIHBhY2thZ2Ugc3RhdHVzIGlzICJpbnN0YWxsZWQiICovCisJCQlpZiAob3B0ICYgT1BUX3JlbW92ZSkgeworCQkJCWlmIChzdHJjbXAobmFtZV9oYXNodGFibGVbc3RhdGVfc3RhdHVzXSwgIm5vdC1pbnN0YWxsZWQiKSA9PSAwCisJCQkJIHx8IHN0cmNtcChuYW1lX2hhc2h0YWJsZVtzdGF0ZV9zdGF0dXNdLCAiY29uZmlnLWZpbGVzIikgPT0gMAorCQkJCSkgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgaXMgYWxyZWFkeSByZW1vdmVkIiwgbmFtZV9oYXNodGFibGVbcGFja2FnZV9oYXNodGFibGVbcGFja2FnZV9udW1dLT5uYW1lXSk7CisJCQkJfQorCQkJCXNldF9zdGF0dXMoc3RhdHVzX251bSwgImRlaW5zdGFsbCIsIDEpOworCQkJfSBlbHNlIGlmIChvcHQgJiBPUFRfcHVyZ2UpIHsKKwkJCQkvKiBpZiBwYWNrYWdlIHN0YXR1cyBpcyAiY29uZi1maWxlcyIgdGhlbiBpdHMgb2sgKi8KKwkJCQlpZiAoc3RyY21wKG5hbWVfaGFzaHRhYmxlW3N0YXRlX3N0YXR1c10sICJub3QtaW5zdGFsbGVkIikgPT0gMCkgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgaXMgYWxyZWFkeSBwdXJnZWQiLCBuYW1lX2hhc2h0YWJsZVtwYWNrYWdlX2hhc2h0YWJsZVtwYWNrYWdlX251bV0tPm5hbWVdKTsKKwkJCQl9CisJCQkJc2V0X3N0YXR1cyhzdGF0dXNfbnVtLCAicHVyZ2UiLCAxKTsKKwkJCX0KKwkJfQorCQlkZWJfY291bnQrKzsKKwkJYXJndisrOworCX0KKwlpZiAoIWRlYl9jb3VudCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vIHBhY2thZ2UgZmlsZXMgc3BlY2lmaWVkIik7CisJZGViX2ZpbGVbZGViX2NvdW50XSA9IE5VTEw7CisKKwkvKiBDaGVjayB0aGF0IHRoZSBkZWIgZmlsZSBhcmd1bWVudHMgYXJlIGluc3RhbGxhYmxlICovCisJaWYgKCEob3B0ICYgT1BUX2ZvcmNlX2lnbm9yZV9kZXBlbmRzKSkgeworCQlpZiAoIWNoZWNrX2RlcHMoZGViX2ZpbGUsIDAgLyosIGRlYl9jb3VudCovKSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImRlcGVuZGVuY3kgY2hlY2sgZmFpbGVkIik7CisJCX0KKwl9CisKKwkvKiBUT0RPOiBpbnN0YWxsIG9yIHJlbW92ZSBwYWNrYWdlcyBpbiB0aGUgY29ycmVjdCBkZXBlbmRlbmN5IG9yZGVyICovCisJZm9yIChpID0gMDsgaSA8IGRlYl9jb3VudDsgaSsrKSB7CisJCS8qIFJlbW92ZSBvciBwdXJnZSBwYWNrYWdlcyAqLworCQlpZiAob3B0ICYgT1BUX3JlbW92ZSkgeworCQkJcmVtb3ZlX3BhY2thZ2UoZGViX2ZpbGVbaV0tPnBhY2thZ2UsIDEpOworCQl9CisJCWVsc2UgaWYgKG9wdCAmIE9QVF9wdXJnZSkgeworCQkJcHVyZ2VfcGFja2FnZShkZWJfZmlsZVtpXS0+cGFja2FnZSk7CisJCX0KKwkJZWxzZSBpZiAob3B0ICYgT1BUX3VucGFjaykgeworCQkJdW5wYWNrX3BhY2thZ2UoZGViX2ZpbGVbaV0pOworCQl9CisJCWVsc2UgaWYgKG9wdCAmIE9QVF9pbnN0YWxsKSB7CisJCQl1bnBhY2tfcGFja2FnZShkZWJfZmlsZVtpXSk7CisJCQkvKiBwYWNrYWdlIGlzIGNvbmZpZ3VyZWQgaW4gc2Vjb25kIHBhc3MgYmVsb3cgKi8KKwkJfQorCQllbHNlIGlmIChvcHQgJiBPUFRfY29uZmlndXJlKSB7CisJCQljb25maWd1cmVfcGFja2FnZShkZWJfZmlsZVtpXSk7CisJCX0KKwl9CisJLyogY29uZmlndXJlIGluc3RhbGxlZCBwYWNrYWdlcyAqLworCWlmIChvcHQgJiBPUFRfaW5zdGFsbCkgeworCQlmb3IgKGkgPSAwOyBpIDwgZGViX2NvdW50OyBpKyspCisJCQljb25maWd1cmVfcGFja2FnZShkZWJfZmlsZVtpXSk7CisJfQorCisJd3JpdGVfc3RhdHVzX2ZpbGUoZGViX2ZpbGUpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZvciAoaSA9IDA7IGkgPCBkZWJfY291bnQ7IGkrKykgeworCQkJZnJlZShkZWJfZmlsZVtpXS0+Y29udHJvbF9maWxlKTsKKwkJCWZyZWUoZGViX2ZpbGVbaV0tPmZpbGVuYW1lKTsKKwkJCWZyZWUoZGViX2ZpbGVbaV0pOworCQl9CisKKwkJZnJlZShkZWJfZmlsZSk7CisKKwkJZm9yIChpID0gMDsgaSA8IE5BTUVfSEFTSF9QUklNRTsgaSsrKSB7CisJCQlmcmVlKG5hbWVfaGFzaHRhYmxlW2ldKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBQQUNLQUdFX0hBU0hfUFJJTUU7IGkrKykgeworCQkJZnJlZV9wYWNrYWdlKHBhY2thZ2VfaGFzaHRhYmxlW2ldKTsKKwkJfQorCisJCWZvciAoaSA9IDA7IGkgPCBTVEFUVVNfSEFTSF9QUklNRTsgaSsrKSB7CisJCQlmcmVlKHN0YXR1c19oYXNodGFibGVbaV0pOworCQl9CisKKwkJZnJlZShzdGF0dXNfaGFzaHRhYmxlKTsKKwkJZnJlZShwYWNrYWdlX2hhc2h0YWJsZSk7CisJCWZyZWUobmFtZV9oYXNodGFibGUpOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9kcGtnX2RlYi5jIGIvYXJjaGl2YWwvZHBrZ19kZWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjg1MjczCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvZHBrZ19kZWIuYwpAQCAtMCwwICsxLDE1MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZHBrZy1kZWIgcGFja3MsIHVucGFja3MgYW5kIHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IERlYmlhbiBhcmNoaXZlcy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vY29uZmlnOmNvbmZpZyBEUEtHX0RFQgorLy9jb25maWc6CWJvb2wgImRwa2dfZGViIgorLy9jb25maWc6CWRlZmF1bHQgbgorLy9jb25maWc6CXNlbGVjdCBGRUFUVVJFX1NFQU1MRVNTX0daCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgZHBrZy1kZWIgdW5wYWNrcyBhbmQgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgRGViaWFuIGFyY2hpdmVzLgorLy9jb25maWc6CisvL2NvbmZpZzoJICBUaGlzIGltcGxlbWVudGF0aW9uIG9mIGRwa2ctZGViIGNhbm5vdCBwYWNrIGFyY2hpdmVzLgorLy9jb25maWc6CisvL2NvbmZpZzoJICBVbmxlc3MgeW91IGhhdmUgYSBzcGVjaWZpYyBhcHBsaWNhdGlvbiB3aGljaCByZXF1aXJlcyBkcGtnLWRlYiwKKy8vY29uZmlnOgkgIHNheSBOIGhlcmUuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0RQS0dfREVCX0VYVFJBQ1RfT05MWQorLy9jb25maWc6CWJvb2wgIkV4dHJhY3Qgb25seSAoLXgpIgorLy9jb25maWc6CWRlZmF1bHQgbgorLy9jb25maWc6CWRlcGVuZHMgb24gRFBLR19ERUIKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGlzIHJlZHVjZXMgZHBrZy1kZWIgdG8gdGhlIGVxdWl2YWxlbnQgb2YKKy8vY29uZmlnOgkgICJhciAtcCA8ZGViPiBkYXRhLnRhci5neiB8IHRhciAtengiLiBIb3dldmVyIGl0IHNhdmVzIHNwYWNlIGFzIG5vbmUKKy8vY29uZmlnOgkgIG9mIHRoZSBleHRyYSBkcGtnLWRlYiwgYXIgb3IgdGFyIG9wdGlvbnMgYXJlIG5lZWRlZCwgdGhleSBhcmUgbGlua2VkCisvL2NvbmZpZzoJICB0byBpbnRlcm5hbGx5LgorCisvL2FwcGxldDpJRl9EUEtHX0RFQihBUFBMRVRfT0RETkFNRShkcGtnLWRlYiwgZHBrZ19kZWIsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGRwa2dfZGViKSkKKy8va2J1aWxkOmxpYi0kKENPTkZJR19EUEtHX0RFQikgKz0gZHBrZ19kZWIubworCisvL3VzYWdlOiNkZWZpbmUgZHBrZ19kZWJfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstY2VmeFhdIEZJTEUgW2FyZ3VtZW50XSIKKy8vdXNhZ2U6I2RlZmluZSBkcGtnX2RlYl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlBlcmZvcm0gYWN0aW9ucyBvbiBEZWJpYW4gcGFja2FnZXMgKC5kZWJzKVxuIgorLy91c2FnZTogICAgICJcbgktYwlMaXN0IGNvbnRlbnRzIG9mIGZpbGVzeXN0ZW0gdHJlZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWUJRXh0cmFjdCBjb250cm9sIGZpbGVzIHRvIFthcmd1bWVudF0gZGlyZWN0b3J5IgorLy91c2FnZTogICAgICJcbgktZglEaXNwbGF5IGNvbnRyb2wgZmllbGQgbmFtZSBzdGFydGluZyB3aXRoIFthcmd1bWVudF0iCisvL3VzYWdlOiAgICAgIlxuCS14CUV4dHJhY3QgcGFja2FnZXMgZmlsZXN5c3RlbSB0cmVlIHRvIGRpcmVjdG9yeSIKKy8vdXNhZ2U6ICAgICAiXG4JLVgJVmVyYm9zZSBleHRyYWN0IgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBkcGtnX2RlYl9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBkcGtnLWRlYiAtWCAuL2J1c3lib3hfMC40OC0xX2kzODYuZGViIC90bXBcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYmJfYXJjaGl2ZS5oIgorCisjZGVmaW5lIERQS0dfREVCX09QVF9DT05URU5UUyAgICAgICAgIDEKKyNkZWZpbmUgRFBLR19ERUJfT1BUX0NPTlRST0wgICAgICAgICAgMgorI2RlZmluZSBEUEtHX0RFQl9PUFRfRklFTEQgICAgICAgICAgICA0CisjZGVmaW5lIERQS0dfREVCX09QVF9FWFRSQUNUICAgICAgICAgIDgKKyNkZWZpbmUgRFBLR19ERUJfT1BUX0VYVFJBQ1RfVkVSQk9TRSAxNgorCitpbnQgZHBrZ19kZWJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGRwa2dfZGViX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWFyY2hpdmVfaGFuZGxlX3QgKmFyX2FyY2hpdmU7CisJYXJjaGl2ZV9oYW5kbGVfdCAqdGFyX2FyY2hpdmU7CisJbGxpc3RfdCAqY29udHJvbF90YXJfbGxpc3QgPSBOVUxMOworCXVuc2lnbmVkIG9wdDsKKwljb25zdCBjaGFyICpleHRyYWN0X2RpcjsKKwlpbnQgbmVlZF9hcmdzOworCisJLyogU2V0dXAgdGhlIHRhciBhcmNoaXZlIGhhbmRsZSAqLworCXRhcl9hcmNoaXZlID0gaW5pdF9oYW5kbGUoKTsKKworCS8qIFNldHVwIGFuIGFyIGFyY2hpdmUgaGFuZGxlIHRoYXQgcmVmZXJzIHRvIHRoZSBnemlwIHN1YiBhcmNoaXZlICovCisJYXJfYXJjaGl2ZSA9IGluaXRfaGFuZGxlKCk7CisJYXJfYXJjaGl2ZS0+ZHBrZ19fc3ViX2FyY2hpdmUgPSB0YXJfYXJjaGl2ZTsKKwlhcl9hcmNoaXZlLT5maWx0ZXIgPSBmaWx0ZXJfYWNjZXB0X2xpc3RfcmVhc3NpZ247CisKKwlsbGlzdF9hZGRfdG8oJmFyX2FyY2hpdmUtPmFjY2VwdCwgKGNoYXIqKSJkYXRhLnRhciIpOworCWxsaXN0X2FkZF90bygmY29udHJvbF90YXJfbGxpc3QsIChjaGFyKikiY29udHJvbC50YXIiKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWgorCWxsaXN0X2FkZF90bygmYXJfYXJjaGl2ZS0+YWNjZXB0LCAoY2hhciopImRhdGEudGFyLmd6Iik7CisJbGxpc3RfYWRkX3RvKCZjb250cm9sX3Rhcl9sbGlzdCwgKGNoYXIqKSJjb250cm9sLnRhci5neiIpOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfQloyCisJbGxpc3RfYWRkX3RvKCZhcl9hcmNoaXZlLT5hY2NlcHQsIChjaGFyKikiZGF0YS50YXIuYnoyIik7CisJbGxpc3RfYWRkX3RvKCZjb250cm9sX3Rhcl9sbGlzdCwgKGNoYXIqKSJjb250cm9sLnRhci5iejIiKTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0xaTUEKKwlsbGlzdF9hZGRfdG8oJmFyX2FyY2hpdmUtPmFjY2VwdCwgKGNoYXIqKSJkYXRhLnRhci5sem1hIik7CisJbGxpc3RfYWRkX3RvKCZjb250cm9sX3Rhcl9sbGlzdCwgKGNoYXIqKSJjb250cm9sLnRhci5sem1hIik7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19YWgorCWxsaXN0X2FkZF90bygmYXJfYXJjaGl2ZS0+YWNjZXB0LCAoY2hhciopImRhdGEudGFyLnh6Iik7CisJbGxpc3RfYWRkX3RvKCZjb250cm9sX3Rhcl9sbGlzdCwgKGNoYXIqKSJjb250cm9sLnRhci54eiIpOworI2VuZGlmCisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJjLS1lZlh4OmUtLWNmWHg6Zi0tY2VYeDpYLS1jZWZ4OngtLWNlZlgiOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJjZWZYeCIpOworCWFyZ3YgKz0gb3B0aW5kOworCWFyZ2MgLT0gb3B0aW5kOworCisJaWYgKG9wdCAmIERQS0dfREVCX09QVF9DT05URU5UUykgeworCQl0YXJfYXJjaGl2ZS0+YWN0aW9uX2hlYWRlciA9IGhlYWRlcl92ZXJib3NlX2xpc3Q7CisJfQorCWV4dHJhY3RfZGlyID0gTlVMTDsKKwluZWVkX2FyZ3MgPSAxOworCWlmIChvcHQgJiBEUEtHX0RFQl9PUFRfQ09OVFJPTCkgeworCQlhcl9hcmNoaXZlLT5hY2NlcHQgPSBjb250cm9sX3Rhcl9sbGlzdDsKKwkJdGFyX2FyY2hpdmUtPmFjdGlvbl9kYXRhID0gZGF0YV9leHRyYWN0X2FsbDsKKwkJaWYgKDEgPT0gYXJnYykgeworCQkJZXh0cmFjdF9kaXIgPSAiLi9ERUJJQU4iOworCQl9IGVsc2UgeworCQkJbmVlZF9hcmdzKys7CisJCX0KKwl9CisJaWYgKG9wdCAmIERQS0dfREVCX09QVF9GSUVMRCkgeworCQkvKiBQcmludCB0aGUgZW50aXJlIGNvbnRyb2wgZmlsZQorCQkgKiBpdCBzaG91bGQgYWNjZXB0IGEgc2Vjb25kIGFyZ3VtZW50IHdoaWNoIHNwZWNpZmllcyBhCisJCSAqIHNwZWNpZmljIGZpZWxkIHRvIHByaW50ICovCisJCWFyX2FyY2hpdmUtPmFjY2VwdCA9IGNvbnRyb2xfdGFyX2xsaXN0OworCQlsbGlzdF9hZGRfdG8oJih0YXJfYXJjaGl2ZS0+YWNjZXB0KSwgKGNoYXIqKSIuL2NvbnRyb2wiKTsKKwkJdGFyX2FyY2hpdmUtPmZpbHRlciA9IGZpbHRlcl9hY2NlcHRfbGlzdDsKKwkJdGFyX2FyY2hpdmUtPmFjdGlvbl9kYXRhID0gZGF0YV9leHRyYWN0X3RvX3N0ZG91dDsKKwl9CisJaWYgKG9wdCAmIERQS0dfREVCX09QVF9FWFRSQUNUKSB7CisJCXRhcl9hcmNoaXZlLT5hY3Rpb25faGVhZGVyID0gaGVhZGVyX2xpc3Q7CisJfQorCWlmIChvcHQgJiAoRFBLR19ERUJfT1BUX0VYVFJBQ1RfVkVSQk9TRSB8IERQS0dfREVCX09QVF9FWFRSQUNUKSkgeworCQl0YXJfYXJjaGl2ZS0+YWN0aW9uX2RhdGEgPSBkYXRhX2V4dHJhY3RfYWxsOworCQluZWVkX2FyZ3MgPSAyOworCX0KKworCWlmIChuZWVkX2FyZ3MgIT0gYXJnYykgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJdGFyX2FyY2hpdmUtPnNyY19mZCA9IGFyX2FyY2hpdmUtPnNyY19mZCA9IHhvcGVuKGFyZ3ZbMF0sIE9fUkRPTkxZKTsKKworCS8qIFdvcmsgb3V0IHdoZXJlIHRvIGV4dHJhY3QgdGhlIGZpbGVzICovCisJLyogMm5kIGFyZ3VtZW50IGlzIGEgZGlyIG5hbWUgKi8KKwlpZiAoYXJndlsxXSkgeworCQlleHRyYWN0X2RpciA9IGFyZ3ZbMV07CisJfQorCWlmIChleHRyYWN0X2RpcikgeworCQlta2RpcihleHRyYWN0X2RpciwgMDc3Nyk7IC8qIGJiX21ha2VfZGlyZWN0b3J5KGV4dHJhY3RfZGlyLCAwNzc3LCAwKSAqLworCQl4Y2hkaXIoZXh0cmFjdF9kaXIpOworCX0KKworCS8qIERvIGl0ICovCisJdW5wYWNrX2FyX2FyY2hpdmUoYXJfYXJjaGl2ZSk7CisKKwkvKiBDbGVhbnVwICovCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShhcl9hcmNoaXZlLT5zcmNfZmQpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2d6aXAuYyBiL2FyY2hpdmFsL2d6aXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTE3MTMwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvZ3ppcC5jCkBAIC0wLDAgKzEsMjI0MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogR3ppcCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIEJhc2VkIG9uIEdOVSBnemlwIENvcHlyaWdodCAoQykgMTk5Mi0xOTkzIEplYW4tbG91cCBHYWlsbHkuCisgKgorICogT3JpZ2luYWxseSBhZGp1c3RlZCBmb3IgYnVzeWJveCBieSBDaGFybGVzIFAuIFdyaWdodCA8Y3B3QHVuaXguYXNiLmNvbT4KKyAqICJ0aGlzIGlzIGEgc3RyaXBwZWQgZG93biB2ZXJzaW9uIG9mIGd6aXAgSSBwdXQgaW50byBidXN5Ym94LCBpdCBkb2VzCisgKiBvbmx5IHN0YW5kYXJkIGluIHRvIHN0YW5kYXJkIG91dCB3aXRoIC05IGNvbXByZXNzaW9uLiAgSXQgYWxzbyByZXF1aXJlcworICogdGhlIHpjYXQgbW9kdWxlIGZvciBzb21lIGltcG9ydGFudCBmdW5jdGlvbnMuIgorICoKKyAqIEFkanVzdGVkIGZ1cnRoZXIgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPiB0byBzdXBwb3J0CisgKiBmaWxlcyBhcyB3ZWxsIGFzIHN0ZGluL3N0ZG91dCwgYW5kIHRvIGdlbmVyYWxseSBiZWhhdmUgaXRzZWxmIHdydAorICogY29tbWFuZCBsaW5lIGhhbmRsaW5nLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKy8qIGJpZyBvYmplY3RzIGluIGJzczoKKyAqIDAwMDAwMDIwIGIgYmxfY291bnQKKyAqIDAwMDAwMDc0IGIgYmFzZV9sZW5ndGgKKyAqIDAwMDAwMDc4IGIgYmFzZV9kaXN0CisgKiAwMDAwMDA3OCBiIHN0YXRpY19kdHJlZQorICogMDAwMDAwOWMgYiBibF90cmVlCisgKiAwMDAwMDBmNCBiIGR5bl9kdHJlZQorICogMDAwMDAxMDAgYiBsZW5ndGhfY29kZQorICogMDAwMDAyMDAgYiBkaXN0X2NvZGUKKyAqIDAwMDAwMjNkIGIgZGVwdGgKKyAqIDAwMDAwNDAwIGIgZmxhZ19idWYKKyAqIDAwMDAwNDdhIGIgaGVhcAorICogMDAwMDA0ODAgYiBzdGF0aWNfbHRyZWUKKyAqIDAwMDAwOGY0IGIgZHluX2x0cmVlCisgKi8KKy8qIFRPRE86IGZ1bGwgc3VwcG9ydCBmb3IgLXYgZm9yIERFU0tUT1AKKyAqICIvdXNyL2Jpbi9nemlwIC12IGEgYm9ndXMgYWEiIHNob3VsZCBzYXk6CithOiAgICAgICA4NS4xJSAtLSByZXBsYWNlZCB3aXRoIGEuZ3oKK2d6aXA6IGJvZ3VzOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CithYTogICAgICA4NS4xJSAtLSByZXBsYWNlZCB3aXRoIGFhLmd6CisqLworCisvL2NvbmZpZzpjb25maWcgR1pJUAorLy9jb25maWc6CWJvb2wgImd6aXAiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgZ3ppcCBpcyB1c2VkIHRvIGNvbXByZXNzIGZpbGVzLgorLy9jb25maWc6CSAgSXQncyBwcm9iYWJseSB0aGUgbW9zdCB3aWRlbHkgdXNlZCBVTklYIGNvbXByZXNzaW9uIHByb2dyYW0uCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0daSVBfTE9OR19PUFRJT05TCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEdaSVAgJiYgTE9OR19PUFRTCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHVzZSBvZiBsb25nIG9wdGlvbnMsIGluY3JlYXNlcyBzaXplIGJ5IGFib3V0IDEwNiBCeXRlcworLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgR1pJUF9GQVNUCisvL2NvbmZpZzoJaW50ICJUcmFkZSBtZW1vcnkgZm9yIGd6aXAgc3BlZWQgKDA6c21hbGwsc2xvdyAtIDI6ZmFzdCxiaWcpIgorLy9jb25maWc6CWRlZmF1bHQgMAorLy9jb25maWc6CXJhbmdlIDAgMgorLy9jb25maWc6CWRlcGVuZHMgb24gR1pJUAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBiaWcgbWVtb3J5IG9wdGlvbnMgZm9yIGd6aXAuCisvL2NvbmZpZzoJICAwOiBzbWFsbCBidWZmZXJzLCBzbWFsbCBoYXNoLXRhYmxlcworLy9jb25maWc6CSAgMTogbGFyZ2VyIGJ1ZmZlcnMsIGxhcmdlciBoYXNoLXRhYmxlcworLy9jb25maWc6CSAgMjogbGFyZ2VyIGJ1ZmZlcnMsIGxhcmdlc3QgaGFzaC10YWJsZXMKKy8vY29uZmlnOgkgIExhcmdlciBtb2RlbHMgbWF5IGdpdmUgc2xpZ2h0bHkgYmV0dGVyIGNvbXByZXNzaW9uCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0daSVBfTEVWRUxTCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIGNvbXByZXNzaW9uIGxldmVscyIKKy8vY29uZmlnOglkZWZhdWx0IG4KKy8vY29uZmlnOglkZXBlbmRzIG9uIEdaSVAKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgc3VwcG9ydCBmb3IgY29tcHJlc3Npb24gbGV2ZWxzIDQtOS4gVGhlIGRlZmF1bHQgbGV2ZWwKKy8vY29uZmlnOgkgIGlzIDYuIElmIGxldmVscyAxLTMgYXJlIHNwZWNpZmllZCwgNCBpcyB1c2VkLgorLy9jb25maWc6CSAgSWYgdGhpcyBvcHRpb24gaXMgbm90IHNlbGVjdGVkLCAtTiBvcHRpb25zIGFyZSBpZ25vcmVkIGFuZCAtOQorLy9jb25maWc6CSAgaXMgdXNlZC4KKworLy9hcHBsZXQ6SUZfR1pJUChBUFBMRVQoZ3ppcCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8va2J1aWxkOmxpYi0kKENPTkZJR19HWklQKSArPSBnemlwLm8KKworLy91c2FnZTojZGVmaW5lIGd6aXBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstY2ZkIiBJRl9GRUFUVVJFX0daSVBfTEVWRUxTKCIxMjM0NTY3ODkiKSAiXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgZ3ppcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbXByZXNzIEZJTEVzIChvciBzdGRpbilcbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfR1pJUF9MRVZFTFMoCisvL3VzYWdlOiAgICAgIlxuCS0xLi45CUNvbXByZXNzaW9uIGxldmVsIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktZAlEZWNvbXByZXNzIgorLy91c2FnZTogICAgICJcbgktYwlXcml0ZSB0byBzdGRvdXQiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBnemlwX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGxzIC1sYSAvdG1wL2J1c3lib3gqXG4iCisvL3VzYWdlOiAgICAgICAiLXJ3LXJ3LXItLSAgICAxIGFuZGVyc2VuIGFuZGVyc2VuICAxNzYxMjgwIEFwciAxNCAxNzo0NyAvdG1wL2J1c3lib3gudGFyXG4iCisvL3VzYWdlOiAgICAgICAiJCBnemlwIC90bXAvYnVzeWJveC50YXJcbiIKKy8vdXNhZ2U6ICAgICAgICIkIGxzIC1sYSAvdG1wL2J1c3lib3gqXG4iCisvL3VzYWdlOiAgICAgICAiLXJ3LXJ3LXItLSAgICAxIGFuZGVyc2VuIGFuZGVyc2VuICAgNTU0MDU4IEFwciAxNCAxNzo0OSAvdG1wL2J1c3lib3gudGFyLmd6XG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImJiX2FyY2hpdmUuaCIKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworLy8jZGVmaW5lIERFQlVHIDEKKy8qIERpYWdub3N0aWMgZnVuY3Rpb25zICovCisjaWZkZWYgREVCVUcKKyMgIGRlZmluZSBBc3NlcnQoY29uZCxtc2cpIHsgaWYgKCEoY29uZCkpIGJiX2Vycm9yX21zZyhtc2cpOyB9CisjICBkZWZpbmUgVHJhY2UoeCkgZnByaW50ZiB4CisjICBkZWZpbmUgVHJhY2V2KHgpIHtpZiAodmVyYm9zZSkgZnByaW50ZiB4OyB9CisjICBkZWZpbmUgVHJhY2V2dih4KSB7aWYgKHZlcmJvc2UgPiAxKSBmcHJpbnRmIHg7IH0KKyMgIGRlZmluZSBUcmFjZWMoYyx4KSB7aWYgKHZlcmJvc2UgJiYgKGMpKSBmcHJpbnRmIHg7IH0KKyMgIGRlZmluZSBUcmFjZWN2KGMseCkge2lmICh2ZXJib3NlID4gMSAmJiAoYykpIGZwcmludGYgeDsgfQorI2Vsc2UKKyMgIGRlZmluZSBBc3NlcnQoY29uZCxtc2cpCisjICBkZWZpbmUgVHJhY2UoeCkKKyMgIGRlZmluZSBUcmFjZXYoeCkKKyMgIGRlZmluZSBUcmFjZXZ2KHgpCisjICBkZWZpbmUgVHJhY2VjKGMseCkKKyMgIGRlZmluZSBUcmFjZWN2KGMseCkKKyNlbmRpZgorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisjaWYgICBDT05GSUdfR1pJUF9GQVNUID09IDAKKyMgZGVmaW5lIFNNQUxMX01FTQorI2VsaWYgQ09ORklHX0daSVBfRkFTVCA9PSAxCisjIGRlZmluZSBNRURJVU1fTUVNCisjZWxpZiBDT05GSUdfR1pJUF9GQVNUID09IDIKKyMgZGVmaW5lIEJJR19NRU0KKyNlbHNlCisjIGVycm9yICJJbnZhbGlkIENPTkZJR19HWklQX0ZBU1QgdmFsdWUiCisjZW5kaWYKKworI2lmbmRlZiBJTkJVRlNJWgorIyAgaWZkZWYgU01BTExfTUVNCisjICAgIGRlZmluZSBJTkJVRlNJWiAgMHgyMDAwCS8qIGlucHV0IGJ1ZmZlciBzaXplICovCisjICBlbHNlCisjICAgIGRlZmluZSBJTkJVRlNJWiAgMHg4MDAwCS8qIGlucHV0IGJ1ZmZlciBzaXplICovCisjICBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgT1VUQlVGU0laCisjICBpZmRlZiBTTUFMTF9NRU0KKyMgICAgZGVmaW5lIE9VVEJVRlNJWiAgIDgxOTIJLyogb3V0cHV0IGJ1ZmZlciBzaXplICovCisjICBlbHNlCisjICAgIGRlZmluZSBPVVRCVUZTSVogIDE2Mzg0CS8qIG91dHB1dCBidWZmZXIgc2l6ZSAqLworIyAgZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIERJU1RfQlVGU0laRQorIyAgaWZkZWYgU01BTExfTUVNCisjICAgIGRlZmluZSBESVNUX0JVRlNJWkUgMHgyMDAwCS8qIGJ1ZmZlciBmb3IgZGlzdGFuY2VzLCBzZWUgdHJlZXMuYyAqLworIyAgZWxzZQorIyAgICBkZWZpbmUgRElTVF9CVUZTSVpFIDB4ODAwMAkvKiBidWZmZXIgZm9yIGRpc3RhbmNlcywgc2VlIHRyZWVzLmMgKi8KKyMgIGVuZGlmCisjZW5kaWYKKworLyogZ3ppcCBmbGFnIGJ5dGUgKi8KKyNkZWZpbmUgQVNDSUlfRkxBRyAgIDB4MDEJLyogYml0IDAgc2V0OiBmaWxlIHByb2JhYmx5IGFzY2lpIHRleHQgKi8KKyNkZWZpbmUgQ09OVElOVUFUSU9OIDB4MDIJLyogYml0IDEgc2V0OiBjb250aW51YXRpb24gb2YgbXVsdGktcGFydCBnemlwIGZpbGUgKi8KKyNkZWZpbmUgRVhUUkFfRklFTEQgIDB4MDQJLyogYml0IDIgc2V0OiBleHRyYSBmaWVsZCBwcmVzZW50ICovCisjZGVmaW5lIE9SSUdfTkFNRSAgICAweDA4CS8qIGJpdCAzIHNldDogb3JpZ2luYWwgZmlsZSBuYW1lIHByZXNlbnQgKi8KKyNkZWZpbmUgQ09NTUVOVCAgICAgIDB4MTAJLyogYml0IDQgc2V0OiBmaWxlIGNvbW1lbnQgcHJlc2VudCAqLworI2RlZmluZSBSRVNFUlZFRCAgICAgMHhDMAkvKiBiaXQgNiw3OiAgIHJlc2VydmVkICovCisKKy8qIGludGVybmFsIGZpbGUgYXR0cmlidXRlICovCisjZGVmaW5lIFVOS05PV04gMHhmZmZmCisjZGVmaW5lIEJJTkFSWSAgMAorI2RlZmluZSBBU0NJSSAgIDEKKworI2lmbmRlZiBXU0laRQorIyAgZGVmaW5lIFdTSVpFIDB4ODAwMCAgLyogd2luZG93IHNpemUtLW11c3QgYmUgYSBwb3dlciBvZiB0d28sIGFuZCAqLworI2VuZGlmICAgICAgICAgICAgICAgICAgLyogIGF0IGxlYXN0IDMySyBmb3IgemlwJ3MgZGVmbGF0ZSBtZXRob2QgKi8KKworI2RlZmluZSBNSU5fTUFUQ0ggIDMKKyNkZWZpbmUgTUFYX01BVENIICAyNTgKKy8qIFRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIG1hdGNoIGxlbmd0aHMgKi8KKworI2RlZmluZSBNSU5fTE9PS0FIRUFEIChNQVhfTUFUQ0grTUlOX01BVENIKzEpCisvKiBNaW5pbXVtIGFtb3VudCBvZiBsb29rYWhlYWQsIGV4Y2VwdCBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLgorICogU2VlIGRlZmxhdGUuYyBmb3IgY29tbWVudHMgYWJvdXQgdGhlIE1JTl9NQVRDSCsxLgorICovCisKKyNkZWZpbmUgTUFYX0RJU1QgIChXU0laRS1NSU5fTE9PS0FIRUFEKQorLyogSW4gb3JkZXIgdG8gc2ltcGxpZnkgdGhlIGNvZGUsIHBhcnRpY3VsYXJseSBvbiAxNiBiaXQgbWFjaGluZXMsIG1hdGNoCisgKiBkaXN0YW5jZXMgYXJlIGxpbWl0ZWQgdG8gTUFYX0RJU1QgaW5zdGVhZCBvZiBXU0laRS4KKyAqLworCisjaWZuZGVmIE1BWF9QQVRIX0xFTgorIyAgZGVmaW5lIE1BWF9QQVRIX0xFTiAgIDEwMjQJLyogbWF4IHBhdGhuYW1lIGxlbmd0aCAqLworI2VuZGlmCisKKyNkZWZpbmUgc2Vla2FibGUoKSAgICAwCS8qIGZvcmNlIHNlcXVlbnRpYWwgb3V0cHV0ICovCisjZGVmaW5lIHRyYW5zbGF0ZV9lb2wgMAkvKiBubyBvcHRpb24gLWEgeWV0ICovCisKKyNpZm5kZWYgQklUUworIyAgZGVmaW5lIEJJVFMgMTYKKyNlbmRpZgorI2RlZmluZSBJTklUX0JJVFMgOQkJLyogSW5pdGlhbCBudW1iZXIgb2YgYml0cyBwZXIgY29kZSAqLworCisjZGVmaW5lIEJJVF9NQVNLICAgIDB4MWYJLyogTWFzayBmb3IgJ251bWJlciBvZiBjb21wcmVzc2lvbiBiaXRzJyAqLworLyogTWFzayAweDIwIGlzIHJlc2VydmVkIHRvIG1lYW4gYSBmb3VydGggaGVhZGVyIGJ5dGUsIGFuZCAweDQwIGlzIGZyZWUuCisgKiBJdCdzIGEgcGl0eSB0aGF0IG9sZCB1bmNvbXByZXNzIGRvZXMgbm90IGNoZWNrIGJpdCAweDIwLiBUaGF0IG1ha2VzCisgKiBleHRlbnNpb24gb2YgdGhlIGZvcm1hdCBhY3R1YWxseSB1bmRlc2lyYWJsZSBiZWNhdXNlIG9sZCBjb21wcmVzcworICogd291bGQganVzdCBjcmFzaCBvbiB0aGUgbmV3IGZvcm1hdCBpbnN0ZWFkIG9mIGdpdmluZyBhIG1lYW5pbmdmdWwKKyAqIGVycm9yIG1lc3NhZ2UuIEl0IGRvZXMgY2hlY2sgdGhlIG51bWJlciBvZiBiaXRzLCBidXQgaXQncyBtb3JlCisgKiBoZWxwZnVsIHRvIHNheSAidW5zdXBwb3J0ZWQgZm9ybWF0LCBnZXQgYSBuZXcgdmVyc2lvbiIgdGhhbgorICogImNhbiBvbmx5IGhhbmRsZSAxNiBiaXRzIi4KKyAqLworCisjaWZkZWYgTUFYX0VYVF9DSEFSUworIyAgZGVmaW5lIE1BWF9TVUZGSVggIE1BWF9FWFRfQ0hBUlMKKyNlbHNlCisjICBkZWZpbmUgTUFYX1NVRkZJWCAgMzAKKyNlbmRpZgorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcGlsZSB3aXRoIE1FRElVTV9NRU0gdG8gcmVkdWNlIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIG9yCisgKiB3aXRoIFNNQUxMX01FTSB0byB1c2UgYXMgbGl0dGxlIG1lbW9yeSBhcyBwb3NzaWJsZS4gVXNlIEJJR19NRU0gaWYgdGhlCisgKiBlbnRpcmUgaW5wdXQgZmlsZSBjYW4gYmUgaGVsZCBpbiBtZW1vcnkgKG5vdCBwb3NzaWJsZSBvbiAxNiBiaXQgc3lzdGVtcykuCisgKiBXYXJuaW5nOiBkZWZpbmluZyB0aGVzZSBzeW1ib2xzIGFmZmVjdHMgSEFTSF9CSVRTIChzZWUgYmVsb3cpIGFuZCB0aHVzCisgKiBhZmZlY3RzIHRoZSBjb21wcmVzc2lvbiByYXRpby4gVGhlIGNvbXByZXNzZWQgb3V0cHV0CisgKiBpcyBzdGlsbCBjb3JyZWN0LCBhbmQgbWlnaHQgZXZlbiBiZSBzbWFsbGVyIGluIHNvbWUgY2FzZXMuCisgKi8KKworI2lmZGVmIFNNQUxMX01FTQorIyAgIGRlZmluZSBIQVNIX0JJVFMgIDEzCS8qIE51bWJlciBvZiBiaXRzIHVzZWQgdG8gaGFzaCBzdHJpbmdzICovCisjZW5kaWYKKyNpZmRlZiBNRURJVU1fTUVNCisjICAgZGVmaW5lIEhBU0hfQklUUyAgMTQKKyNlbmRpZgorI2lmbmRlZiBIQVNIX0JJVFMKKyMgICBkZWZpbmUgSEFTSF9CSVRTICAxNQorICAgLyogRm9yIHBvcnRhYmlsaXR5IHRvIDE2IGJpdCBtYWNoaW5lcywgZG8gbm90IHVzZSB2YWx1ZXMgYWJvdmUgMTUuICovCisjZW5kaWYKKworI2RlZmluZSBIQVNIX1NJWkUgKHVuc2lnbmVkKSgxPDxIQVNIX0JJVFMpCisjZGVmaW5lIEhBU0hfTUFTSyAoSEFTSF9TSVpFLTEpCisjZGVmaW5lIFdNQVNLICAgICAoV1NJWkUtMSkKKy8qIEhBU0hfU0laRSBhbmQgV1NJWkUgbXVzdCBiZSBwb3dlcnMgb2YgdHdvICovCisjaWZuZGVmIFRPT19GQVIKKyMgIGRlZmluZSBUT09fRkFSIDQwOTYKKyNlbmRpZgorLyogTWF0Y2hlcyBvZiBsZW5ndGggMyBhcmUgZGlzY2FyZGVkIGlmIHRoZWlyIGRpc3RhbmNlIGV4Y2VlZHMgVE9PX0ZBUiAqLworCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGhlc2UgdHlwZXMgYXJlIG5vdCByZWFsbHkgJ2NoYXInLCAnc2hvcnQnIGFuZCAnbG9uZycKKyAqLwordHlwZWRlZiB1aW50OF90IHVjaDsKK3R5cGVkZWYgdWludDE2X3QgdXNoOwordHlwZWRlZiB1aW50MzJfdCB1bGc7Cit0eXBlZGVmIGludDMyX3QgbG5nOworCit0eXBlZGVmIHVzaCBQb3M7Cit0eXBlZGVmIHVuc2lnbmVkIElQb3M7CisvKiBBIFBvcyBpcyBhbiBpbmRleCBpbiB0aGUgY2hhcmFjdGVyIHdpbmRvdy4gV2UgdXNlIHNob3J0IGluc3RlYWQgb2YgaW50IHRvCisgKiBzYXZlIHNwYWNlIGluIHRoZSB2YXJpb3VzIHRhYmxlcy4gSVBvcyBpcyB1c2VkIG9ubHkgZm9yIHBhcmFtZXRlciBwYXNzaW5nLgorICovCisKK2VudW0geworCVdJTkRPV19TSVpFID0gMiAqIFdTSVpFLAorLyogd2luZG93IHNpemUsIDIqV1NJWkUgZXhjZXB0IGZvciBNTUFQIG9yIEJJR19NRU0sIHdoZXJlIGl0IGlzIHRoZQorICogaW5wdXQgZmlsZSBsZW5ndGggcGx1cyBNSU5fTE9PS0FIRUFELgorICovCisKKyNpZm5kZWYgRU5BQkxFX0ZFQVRVUkVfR1pJUF9MRVZFTFMKKworCW1heF9jaGFpbl9sZW5ndGggPSA0MDk2LAorLyogVG8gc3BlZWQgdXAgZGVmbGF0aW9uLCBoYXNoIGNoYWlucyBhcmUgbmV2ZXIgc2VhcmNoZWQgYmV5b25kIHRoaXMgbGVuZ3RoLgorICogQSBoaWdoZXIgbGltaXQgaW1wcm92ZXMgY29tcHJlc3Npb24gcmF0aW8gYnV0IGRlZ3JhZGVzIHRoZSBzcGVlZC4KKyAqLworCisJbWF4X2xhenlfbWF0Y2ggPSAyNTgsCisvKiBBdHRlbXB0IHRvIGZpbmQgYSBiZXR0ZXIgbWF0Y2ggb25seSB3aGVuIHRoZSBjdXJyZW50IG1hdGNoIGlzIHN0cmljdGx5CisgKiBzbWFsbGVyIHRoYW4gdGhpcyB2YWx1ZS4gVGhpcyBtZWNoYW5pc20gaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvbgorICogbGV2ZWxzID49IDQuCisgKi8KKworCW1heF9pbnNlcnRfbGVuZ3RoID0gbWF4X2xhenlfbWF0Y2gsCisvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoCisgKiBpcyBub3QgZ3JlYXRlciB0aGFuIHRoaXMgbGVuZ3RoLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLgorICogbWF4X2luc2VydF9sZW5ndGggaXMgdXNlZCBvbmx5IGZvciBjb21wcmVzc2lvbiBsZXZlbHMgPD0gMy4KKyAqLworCisJZ29vZF9tYXRjaCA9IDMyLAorLyogVXNlIGEgZmFzdGVyIHNlYXJjaCB3aGVuIHRoZSBwcmV2aW91cyBtYXRjaCBpcyBsb25nZXIgdGhhbiB0aGlzICovCisKKy8qIFZhbHVlcyBmb3IgbWF4X2xhenlfbWF0Y2gsIGdvb2RfbWF0Y2ggYW5kIG1heF9jaGFpbl9sZW5ndGgsIGRlcGVuZGluZyBvbgorICogdGhlIGRlc2lyZWQgcGFjayBsZXZlbCAoMC4uOSkuIFRoZSB2YWx1ZXMgZ2l2ZW4gYmVsb3cgaGF2ZSBiZWVuIHR1bmVkIHRvCisgKiBleGNsdWRlIHdvcnN0IGNhc2UgcGVyZm9ybWFuY2UgZm9yIHBhdGhvbG9naWNhbCBmaWxlcy4gQmV0dGVyIHZhbHVlcyBtYXkgYmUKKyAqIGZvdW5kIGZvciBzcGVjaWZpYyBmaWxlcy4KKyAqLworCisJbmljZV9tYXRjaCA9IDI1OCwJLyogU3RvcCBzZWFyY2hpbmcgd2hlbiBjdXJyZW50IG1hdGNoIGV4Y2VlZHMgdGhpcyAqLworLyogTm90ZTogdGhlIGRlZmxhdGUoKSBjb2RlIHJlcXVpcmVzIG1heF9sYXp5ID49IE1JTl9NQVRDSCBhbmQgbWF4X2NoYWluID49IDQKKyAqIEZvciBkZWZsYXRlX2Zhc3QoKSAobGV2ZWxzIDw9IDMpIGdvb2QgaXMgaWdub3JlZCBhbmQgbGF6eSBoYXMgYSBkaWZmZXJlbnQKKyAqIG1lYW5pbmcuCisgKi8KKyNlbmRpZiAvKiBFTkFCTEVfRkVBVFVSRV9HWklQX0xFVkVMUyAqLworfTsKKworCitzdHJ1Y3QgZ2xvYmFscyB7CisKKyNpZmRlZiBFTkFCTEVfRkVBVFVSRV9HWklQX0xFVkVMUworCXVuc2lnbmVkIG1heF9jaGFpbl9sZW5ndGg7CisJdW5zaWduZWQgbWF4X2xhenlfbWF0Y2g7CisJdW5zaWduZWQgZ29vZF9tYXRjaDsKKwl1bnNpZ25lZCBuaWNlX21hdGNoOworI2RlZmluZSBtYXhfY2hhaW5fbGVuZ3RoIChHMS5tYXhfY2hhaW5fbGVuZ3RoKQorI2RlZmluZSBtYXhfbGF6eV9tYXRjaCAgIChHMS5tYXhfbGF6eV9tYXRjaCkKKyNkZWZpbmUgZ29vZF9tYXRjaAkgKEcxLmdvb2RfbWF0Y2gpCisjZGVmaW5lIG5pY2VfbWF0Y2gJIChHMS5uaWNlX21hdGNoKQorI2VuZGlmCisKKwlsbmcgYmxvY2tfc3RhcnQ7CisKKy8qIHdpbmRvdyBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IG91dHB1dCBibG9jay4gR2V0cworICogbmVnYXRpdmUgd2hlbiB0aGUgd2luZG93IGlzIG1vdmVkIGJhY2t3YXJkcy4KKyAqLworCXVuc2lnbmVkIGluc19oOwkvKiBoYXNoIGluZGV4IG9mIHN0cmluZyB0byBiZSBpbnNlcnRlZCAqLworCisjZGVmaW5lIEhfU0hJRlQgICgoSEFTSF9CSVRTK01JTl9NQVRDSC0xKSAvIE1JTl9NQVRDSCkKKy8qIE51bWJlciBvZiBiaXRzIGJ5IHdoaWNoIGluc19oIGFuZCBkZWxfaCBtdXN0IGJlIHNoaWZ0ZWQgYXQgZWFjaAorICogaW5wdXQgc3RlcC4gSXQgbXVzdCBiZSBzdWNoIHRoYXQgYWZ0ZXIgTUlOX01BVENIIHN0ZXBzLCB0aGUgb2xkZXN0CisgKiBieXRlIG5vIGxvbmdlciB0YWtlcyBwYXJ0IGluIHRoZSBoYXNoIGtleSwgdGhhdCBpczoKKyAqIEhfU0hJRlQgKiBNSU5fTUFUQ0ggPj0gSEFTSF9CSVRTCisgKi8KKworCXVuc2lnbmVkIHByZXZfbGVuZ3RoOworCisvKiBMZW5ndGggb2YgdGhlIGJlc3QgbWF0Y2ggYXQgcHJldmlvdXMgc3RlcC4gTWF0Y2hlcyBub3QgZ3JlYXRlciB0aGFuIHRoaXMKKyAqIGFyZSBkaXNjYXJkZWQuIFRoaXMgaXMgdXNlZCBpbiB0aGUgbGF6eSBtYXRjaCBldmFsdWF0aW9uLgorICovCisKKwl1bnNpZ25lZCBzdHJzdGFydDsJLyogc3RhcnQgb2Ygc3RyaW5nIHRvIGluc2VydCAqLworCXVuc2lnbmVkIG1hdGNoX3N0YXJ0OwkvKiBzdGFydCBvZiBtYXRjaGluZyBzdHJpbmcgKi8KKwl1bnNpZ25lZCBsb29rYWhlYWQ7CS8qIG51bWJlciBvZiB2YWxpZCBieXRlcyBhaGVhZCBpbiB3aW5kb3cgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKi8KKyNkZWZpbmUgREVDTEFSRSh0eXBlLCBhcnJheSwgc2l6ZSkgXAorCXR5cGUgKiBhcnJheQorI2RlZmluZSBBTExPQyh0eXBlLCBhcnJheSwgc2l6ZSkgXAorCWFycmF5ID0geHphbGxvYygoc2l6ZV90KSgoKHNpemUpKzFMKS8yKSAqIDIqc2l6ZW9mKHR5cGUpKQorI2RlZmluZSBGUkVFKGFycmF5KSBcCisJZG8geyBmcmVlKGFycmF5KTsgYXJyYXkgPSBOVUxMOyB9IHdoaWxlICgwKQorCisJLyogZ2xvYmFsIGJ1ZmZlcnMgKi8KKworCS8qIGJ1ZmZlciBmb3IgbGl0ZXJhbHMgb3IgbGVuZ3RocyAqLworCS8qIERFQ0xBUkUodWNoLCBsX2J1ZiwgTElUX0JVRlNJWkUpOyAqLworCURFQ0xBUkUodWNoLCBsX2J1ZiwgSU5CVUZTSVopOworCisJREVDTEFSRSh1c2gsIGRfYnVmLCBESVNUX0JVRlNJWkUpOworCURFQ0xBUkUodWNoLCBvdXRidWYsIE9VVEJVRlNJWik7CisKKy8qIFNsaWRpbmcgd2luZG93LiBJbnB1dCBieXRlcyBhcmUgcmVhZCBpbnRvIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgd2luZG93LAorICogYW5kIG1vdmUgdG8gdGhlIGZpcnN0IGhhbGYgbGF0ZXIgdG8ga2VlcCBhIGRpY3Rpb25hcnkgb2YgYXQgbGVhc3QgV1NJWkUKKyAqIGJ5dGVzLiBXaXRoIHRoaXMgb3JnYW5pemF0aW9uLCBtYXRjaGVzIGFyZSBsaW1pdGVkIHRvIGEgZGlzdGFuY2Ugb2YKKyAqIFdTSVpFLU1BWF9NQVRDSCBieXRlcywgYnV0IHRoaXMgZW5zdXJlcyB0aGF0IElPIGlzIGFsd2F5cworICogcGVyZm9ybWVkIHdpdGggYSBsZW5ndGggbXVsdGlwbGUgb2YgdGhlIGJsb2NrIHNpemUuIEFsc28sIGl0IGxpbWl0cworICogdGhlIHdpbmRvdyBzaXplIHRvIDY0Sywgd2hpY2ggaXMgcXVpdGUgdXNlZnVsIG9uIE1TRE9TLgorICogVG8gZG86IGxpbWl0IHRoZSB3aW5kb3cgc2l6ZSB0byBXU0laRStCU1ogaWYgU01BTExfTUVNICh0aGUgY29kZSB3b3VsZAorICogYmUgbGVzcyBlZmZpY2llbnQpLgorICovCisJREVDTEFSRSh1Y2gsIHdpbmRvdywgMkwgKiBXU0laRSk7CisKKy8qIExpbmsgdG8gb2xkZXIgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGluZGV4LiBUbyBsaW1pdCB0aGUgc2l6ZSBvZiB0aGlzCisgKiBhcnJheSB0byA2NEssIHRoaXMgbGluayBpcyBtYWludGFpbmVkIG9ubHkgZm9yIHRoZSBsYXN0IDMySyBzdHJpbmdzLgorICogQW4gaW5kZXggaW4gdGhpcyBhcnJheSBpcyB0aHVzIGEgd2luZG93IGluZGV4IG1vZHVsbyAzMksuCisgKi8KKwkvKiBERUNMQVJFKFBvcywgcHJldiwgV1NJWkUpOyAqLworCURFQ0xBUkUodXNoLCBwcmV2LCAxTCA8PCBCSVRTKTsKKworLyogSGVhZHMgb2YgdGhlIGhhc2ggY2hhaW5zIG9yIDAuICovCisJLyogREVDTEFSRShQb3MsIGhlYWQsIDE8PEhBU0hfQklUUyk7ICovCisjZGVmaW5lIGhlYWQgKEcxLnByZXYgKyBXU0laRSkgLyogaGFzaCBoZWFkIChzZWUgZGVmbGF0ZS5jKSAqLworCisvKiBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgKi8KKwl1bGcgaXNpemU7CQkvKiBvbmx5IDMyIGJpdHMgc3RvcmVkIGluIC5neiBmaWxlICovCisKKy8qIGJib3ggYWx3YXlzIHVzZSBzdGRpbi9zdGRvdXQgKi8KKyNkZWZpbmUgaWZkIFNURElOX0ZJTEVOTwkvKiBpbnB1dCBmaWxlIGRlc2NyaXB0b3IgKi8KKyNkZWZpbmUgb2ZkIFNURE9VVF9GSUxFTk8JLyogb3V0cHV0IGZpbGUgZGVzY3JpcHRvciAqLworCisjaWZkZWYgREVCVUcKKwl1bnNpZ25lZCBpbnNpemU7CS8qIHZhbGlkIGJ5dGVzIGluIGxfYnVmICovCisjZW5kaWYKKwl1bnNpZ25lZCBvdXRjbnQ7CS8qIGJ5dGVzIGluIG91dHB1dCBidWZmZXIgKi8KKworCXNtYWxsaW50IGVvZmlsZTsJLyogZmxhZyBzZXQgYXQgZW5kIG9mIGlucHV0IGZpbGUgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBMb2NhbCBkYXRhIHVzZWQgYnkgdGhlICJiaXQgc3RyaW5nIiByb3V0aW5lcy4KKyAqLworCisJdW5zaWduZWQgc2hvcnQgYmlfYnVmOworCisvKiBPdXRwdXQgYnVmZmVyLiBiaXRzIGFyZSBpbnNlcnRlZCBzdGFydGluZyBhdCB0aGUgYm90dG9tIChsZWFzdCBzaWduaWZpY2FudAorICogYml0cykuCisgKi8KKworI3VuZGVmIEJVRl9TSVpFCisjZGVmaW5lIEJVRl9TSVpFICg4ICogc2l6ZW9mKEcxLmJpX2J1ZikpCisvKiBOdW1iZXIgb2YgYml0cyB1c2VkIHdpdGhpbiBiaV9idWYuIChiaV9idWYgbWlnaHQgYmUgaW1wbGVtZW50ZWQgb24KKyAqIG1vcmUgdGhhbiAxNiBiaXRzIG9uIHNvbWUgc3lzdGVtcy4pCisgKi8KKworCWludCBiaV92YWxpZDsKKworLyogQ3VycmVudCBpbnB1dCBmdW5jdGlvbi4gU2V0IHRvIG1lbV9yZWFkIGZvciBpbi1tZW1vcnkgY29tcHJlc3Npb24gKi8KKworI2lmZGVmIERFQlVHCisJdWxnIGJpdHNfc2VudDsJCQkvKiBiaXQgbGVuZ3RoIG9mIHRoZSBjb21wcmVzc2VkIGRhdGEgKi8KKyNlbmRpZgorCisJLyp1aW50MzJfdCAqY3JjXzMyX3RhYjsqLworCXVpbnQzMl90IGNyYzsJLyogc2hpZnQgcmVnaXN0ZXIgY29udGVudHMgKi8KK307CisKKyNkZWZpbmUgRzEgKCoocHRyX3RvX2dsb2JhbHMgLSAxKSkKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFdyaXRlIHRoZSBvdXRwdXQgYnVmZmVyIG91dGJ1ZlswLi5vdXRjbnQtMV0gYW5kIHVwZGF0ZSBieXRlc19vdXQuCisgKiAodXNlZCBmb3IgdGhlIGNvbXByZXNzZWQgZGF0YSBvbmx5KQorICovCitzdGF0aWMgdm9pZCBmbHVzaF9vdXRidWYodm9pZCkKK3sKKwlpZiAoRzEub3V0Y250ID09IDApCisJCXJldHVybjsKKworCXh3cml0ZShvZmQsIChjaGFyICopIEcxLm91dGJ1ZiwgRzEub3V0Y250KTsKKwlHMS5vdXRjbnQgPSAwOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICovCisvKiBwdXRfOGJpdCBpcyB1c2VkIGZvciB0aGUgY29tcHJlc3NlZCBvdXRwdXQgKi8KKyNkZWZpbmUgcHV0XzhiaXQoYykgXAorZG8geyBcCisJRzEub3V0YnVmW0cxLm91dGNudCsrXSA9IChjKTsgXAorCWlmIChHMS5vdXRjbnQgPT0gT1VUQlVGU0laKSBcCisJCWZsdXNoX291dGJ1ZigpOyBcCit9IHdoaWxlICgwKQorCisvKiBPdXRwdXQgYSAxNiBiaXQgdmFsdWUsIGxzYiBmaXJzdCAqLworc3RhdGljIHZvaWQgcHV0XzE2Yml0KHVzaCB3KQoreworCS8qIEdDQyA0LjIuMSB3b24ndCBvcHRpbWl6ZSBvdXQgcmVkdW5kYW50IGxvYWRzIG9mIEcxLm91dGNudAorCSAqIChwcm9iYWJseSBiZWNhdXNlIG9mIGZlYXIgb2YgYWxpYXNpbmcgd2l0aCBHMS5vdXRidWZbXQorCSAqIHN0b3JlcyksIGRvIGl0IGV4cGxpY2l0bHk6CisJICovCisJdW5zaWduZWQgb3V0Y250ID0gRzEub3V0Y250OworCXVjaCAqZHN0ID0gJkcxLm91dGJ1ZltvdXRjbnRdOworCisjaWYgQkJfVU5BTElHTkVEX01FTUFDQ0VTU19PSyAmJiBCQl9MSVRUTEVfRU5ESUFOCisJaWYgKG91dGNudCA8IE9VVEJVRlNJWi0yKSB7CisJCS8qIENvbW1vbiBjYXNlICovCisJCXVzaCAqZHN0MTYgPSAodm9pZCopIGRzdDsKKwkJKmRzdDE2ID0gdzsgLyogdW5hbGluZ2VkIExTQiAxNi1iaXQgc3RvcmUgKi8KKwkJRzEub3V0Y250ID0gb3V0Y250ICsgMjsKKwkJcmV0dXJuOworCX0KKwkqZHN0ID0gKHVjaCl3OworCXcgPj49IDg7CisjZWxzZQorCSpkc3QgPSAodWNoKXc7CisJdyA+Pj0gODsKKwlpZiAob3V0Y250IDwgT1VUQlVGU0laLTIpIHsKKwkJLyogQ29tbW9uIGNhc2UgKi8KKwkJZHN0WzFdID0gdzsKKwkJRzEub3V0Y250ID0gb3V0Y250ICsgMjsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCisJLyogU2xvd3BhdGg6IHdlIHdpbGwgbmVlZCB0byBkbyBmbHVzaF9vdXRidWYoKSAqLworCUcxLm91dGNudCA9ICsrb3V0Y250OworCWlmIChvdXRjbnQgPT0gT1VUQlVGU0laKQorCQlmbHVzaF9vdXRidWYoKTsKKwlwdXRfOGJpdCh3KTsKK30KKworc3RhdGljIHZvaWQgcHV0XzMyYml0KHVsZyBuKQoreworCXB1dF8xNmJpdChuKTsKKwlwdXRfMTZiaXQobiA+PiAxNik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogUnVuIGEgc2V0IG9mIGJ5dGVzIHRocm91Z2ggdGhlIGNyYyBzaGlmdCByZWdpc3Rlci4gIElmIHMgaXMgYSBOVUxMCisgKiBwb2ludGVyLCB0aGVuIGluaXRpYWxpemUgdGhlIGNyYyBzaGlmdCByZWdpc3RlciBjb250ZW50cyBpbnN0ZWFkLgorICogUmV0dXJuIHRoZSBjdXJyZW50IGNyYyBpbiBlaXRoZXIgY2FzZS4KKyAqLworc3RhdGljIHZvaWQgdXBkY3JjKHVjaCAqIHMsIHVuc2lnbmVkIG4pCit7CisJRzEuY3JjID0gY3JjMzJfYmxvY2tfZW5kaWFuMChHMS5jcmMsIHMsIG4sIGdsb2JhbF9jcmMzMl90YWJsZSAvKkcxLmNyY18zMl90YWIqLyk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBSZWFkIGEgbmV3IGJ1ZmZlciBmcm9tIHRoZSBjdXJyZW50IGlucHV0IGZpbGUsIHBlcmZvcm0gZW5kLW9mLWxpbmUKKyAqIHRyYW5zbGF0aW9uLCBhbmQgdXBkYXRlIHRoZSBjcmMgYW5kIGlucHV0IGZpbGUgc2l6ZS4KKyAqIElOIGFzc2VydGlvbjogc2l6ZSA+PSAyIChmb3IgZW5kLW9mLWxpbmUgdHJhbnNsYXRpb24pCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBmaWxlX3JlYWQodm9pZCAqYnVmLCB1bnNpZ25lZCBzaXplKQoreworCXVuc2lnbmVkIGxlbjsKKworCUFzc2VydChHMS5pbnNpemUgPT0gMCwgImxfYnVmIG5vdCBlbXB0eSIpOworCisJbGVuID0gc2FmZV9yZWFkKGlmZCwgYnVmLCBzaXplKTsKKwlpZiAobGVuID09ICh1bnNpZ25lZCkoLTEpIHx8IGxlbiA9PSAwKQorCQlyZXR1cm4gbGVuOworCisJdXBkY3JjKGJ1ZiwgbGVuKTsKKwlHMS5pc2l6ZSArPSBsZW47CisJcmV0dXJuIGxlbjsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFNlbmQgYSB2YWx1ZSBvbiBhIGdpdmVuIG51bWJlciBvZiBiaXRzLgorICogSU4gYXNzZXJ0aW9uOiBsZW5ndGggPD0gMTYgYW5kIHZhbHVlIGZpdHMgaW4gbGVuZ3RoIGJpdHMuCisgKi8KK3N0YXRpYyB2b2lkIHNlbmRfYml0cyhpbnQgdmFsdWUsIGludCBsZW5ndGgpCit7CisjaWZkZWYgREVCVUcKKwlUcmFjZXYoKHN0ZGVyciwgIiBsICUyZCB2ICU0eCAiLCBsZW5ndGgsIHZhbHVlKSk7CisJQXNzZXJ0KGxlbmd0aCA+IDAgJiYgbGVuZ3RoIDw9IDE1LCAiaW52YWxpZCBsZW5ndGgiKTsKKwlHMS5iaXRzX3NlbnQgKz0gbGVuZ3RoOworI2VuZGlmCisJLyogSWYgbm90IGVub3VnaCByb29tIGluIGJpX2J1ZiwgdXNlICh2YWxpZCkgYml0cyBmcm9tIGJpX2J1ZiBhbmQKKwkgKiAoMTYgLSBiaV92YWxpZCkgYml0cyBmcm9tIHZhbHVlLCBsZWF2aW5nICh3aWR0aCAtICgxNi1iaV92YWxpZCkpCisJICogdW51c2VkIGJpdHMgaW4gdmFsdWUuCisJICovCisJaWYgKEcxLmJpX3ZhbGlkID4gKGludCkgQlVGX1NJWkUgLSBsZW5ndGgpIHsKKwkJRzEuYmlfYnVmIHw9ICh2YWx1ZSA8PCBHMS5iaV92YWxpZCk7CisJCXB1dF8xNmJpdChHMS5iaV9idWYpOworCQlHMS5iaV9idWYgPSAodXNoKSB2YWx1ZSA+PiAoQlVGX1NJWkUgLSBHMS5iaV92YWxpZCk7CisJCUcxLmJpX3ZhbGlkICs9IGxlbmd0aCAtIEJVRl9TSVpFOworCX0gZWxzZSB7CisJCUcxLmJpX2J1ZiB8PSB2YWx1ZSA8PCBHMS5iaV92YWxpZDsKKwkJRzEuYmlfdmFsaWQgKz0gbGVuZ3RoOworCX0KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJldmVyc2UgdGhlIGZpcnN0IGxlbiBiaXRzIG9mIGEgY29kZSwgdXNpbmcgc3RyYWlnaHRmb3J3YXJkIGNvZGUgKGEgZmFzdGVyCisgKiBtZXRob2Qgd291bGQgdXNlIGEgdGFibGUpCisgKiBJTiBhc3NlcnRpb246IDEgPD0gbGVuIDw9IDE1CisgKi8KK3N0YXRpYyB1bnNpZ25lZCBiaV9yZXZlcnNlKHVuc2lnbmVkIGNvZGUsIGludCBsZW4pCit7CisJdW5zaWduZWQgcmVzID0gMDsKKworCXdoaWxlICgxKSB7CisJCXJlcyB8PSBjb2RlICYgMTsKKwkJaWYgKC0tbGVuIDw9IDApIHJldHVybiByZXM7CisJCWNvZGUgPj49IDE7CisJCXJlcyA8PD0gMTsKKwl9Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBXcml0ZSBvdXQgYW55IHJlbWFpbmluZyBiaXRzIGluIGFuIGluY29tcGxldGUgYnl0ZS4KKyAqLworc3RhdGljIHZvaWQgYmlfd2luZHVwKHZvaWQpCit7CisJaWYgKEcxLmJpX3ZhbGlkID4gOCkgeworCQlwdXRfMTZiaXQoRzEuYmlfYnVmKTsKKwl9IGVsc2UgaWYgKEcxLmJpX3ZhbGlkID4gMCkgeworCQlwdXRfOGJpdChHMS5iaV9idWYpOworCX0KKwlHMS5iaV9idWYgPSAwOworCUcxLmJpX3ZhbGlkID0gMDsKKyNpZmRlZiBERUJVRworCUcxLmJpdHNfc2VudCA9IChHMS5iaXRzX3NlbnQgKyA3KSAmIH43OworI2VuZGlmCit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb3B5IGEgc3RvcmVkIGJsb2NrIHRvIHRoZSB6aXAgZmlsZSwgc3RvcmluZyBmaXJzdCB0aGUgbGVuZ3RoIGFuZCBpdHMKKyAqIG9uZSdzIGNvbXBsZW1lbnQgaWYgcmVxdWVzdGVkLgorICovCitzdGF0aWMgdm9pZCBjb3B5X2Jsb2NrKGNoYXIgKmJ1ZiwgdW5zaWduZWQgbGVuLCBpbnQgaGVhZGVyKQoreworCWJpX3dpbmR1cCgpOwkJLyogYWxpZ24gb24gYnl0ZSBib3VuZGFyeSAqLworCisJaWYgKGhlYWRlcikgeworCQlwdXRfMTZiaXQobGVuKTsKKwkJcHV0XzE2Yml0KH5sZW4pOworI2lmZGVmIERFQlVHCisJCUcxLmJpdHNfc2VudCArPSAyICogMTY7CisjZW5kaWYKKwl9CisjaWZkZWYgREVCVUcKKwlHMS5iaXRzX3NlbnQgKz0gKHVsZykgbGVuIDw8IDM7CisjZW5kaWYKKwl3aGlsZSAobGVuLS0pIHsKKwkJcHV0XzhiaXQoKmJ1ZisrKTsKKwl9Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBGaWxsIHRoZSB3aW5kb3cgd2hlbiB0aGUgbG9va2FoZWFkIGJlY29tZXMgaW5zdWZmaWNpZW50LgorICogVXBkYXRlcyBzdHJzdGFydCBhbmQgbG9va2FoZWFkLCBhbmQgc2V0cyBlb2ZpbGUgaWYgZW5kIG9mIGlucHV0IGZpbGUuCisgKiBJTiBhc3NlcnRpb246IGxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQgJiYgc3Ryc3RhcnQgKyBsb29rYWhlYWQgPiAwCisgKiBPVVQgYXNzZXJ0aW9uczogYXQgbGVhc3Qgb25lIGJ5dGUgaGFzIGJlZW4gcmVhZCwgb3IgZW9maWxlIGlzIHNldDsKKyAqICAgIGZpbGUgcmVhZHMgYXJlIHBlcmZvcm1lZCBmb3IgYXQgbGVhc3QgdHdvIGJ5dGVzIChyZXF1aXJlZCBmb3IgdGhlCisgKiAgICB0cmFuc2xhdGVfZW9sIG9wdGlvbikuCisgKi8KK3N0YXRpYyB2b2lkIGZpbGxfd2luZG93KHZvaWQpCit7CisJdW5zaWduZWQgbiwgbTsKKwl1bnNpZ25lZCBtb3JlID0JV0lORE9XX1NJWkUgLSBHMS5sb29rYWhlYWQgLSBHMS5zdHJzdGFydDsKKwkvKiBBbW91bnQgb2YgZnJlZSBzcGFjZSBhdCB0aGUgZW5kIG9mIHRoZSB3aW5kb3cuICovCisKKwkvKiBJZiB0aGUgd2luZG93IGlzIGFsbW9zdCBmdWxsIGFuZCB0aGVyZSBpcyBpbnN1ZmZpY2llbnQgbG9va2FoZWFkLAorCSAqIG1vdmUgdGhlIHVwcGVyIGhhbGYgdG8gdGhlIGxvd2VyIG9uZSB0byBtYWtlIHJvb20gaW4gdGhlIHVwcGVyIGhhbGYuCisJICovCisJaWYgKG1vcmUgPT0gKHVuc2lnbmVkKSAtMSkgeworCQkvKiBWZXJ5IHVubGlrZWx5LCBidXQgcG9zc2libGUgb24gMTYgYml0IG1hY2hpbmUgaWYgc3Ryc3RhcnQgPT0gMAorCQkgKiBhbmQgbG9va2FoZWFkID09IDEgKGlucHV0IGRvbmUgb25lIGJ5dGUgYXQgdGltZSkKKwkJICovCisJCW1vcmUtLTsKKwl9IGVsc2UgaWYgKEcxLnN0cnN0YXJ0ID49IFdTSVpFICsgTUFYX0RJU1QpIHsKKwkJLyogQnkgdGhlIElOIGFzc2VydGlvbiwgdGhlIHdpbmRvdyBpcyBub3QgZW1wdHkgc28gd2UgY2FuJ3QgY29uZnVzZQorCQkgKiBtb3JlID09IDAgd2l0aCBtb3JlID09IDY0SyBvbiBhIDE2IGJpdCBtYWNoaW5lLgorCQkgKi8KKwkJQXNzZXJ0KFdJTkRPV19TSVpFID09IDIgKiBXU0laRSwgIm5vIHNsaWRpbmcgd2l0aCBCSUdfTUVNIik7CisKKwkJbWVtY3B5KEcxLndpbmRvdywgRzEud2luZG93ICsgV1NJWkUsIFdTSVpFKTsKKwkJRzEubWF0Y2hfc3RhcnQgLT0gV1NJWkU7CisJCUcxLnN0cnN0YXJ0IC09IFdTSVpFOwkvKiB3ZSBub3cgaGF2ZSBzdHJzdGFydCA+PSBNQVhfRElTVDogKi8KKworCQlHMS5ibG9ja19zdGFydCAtPSBXU0laRTsKKworCQlmb3IgKG4gPSAwOyBuIDwgSEFTSF9TSVpFOyBuKyspIHsKKwkJCW0gPSBoZWFkW25dOworCQkJaGVhZFtuXSA9IChQb3MpIChtID49IFdTSVpFID8gbSAtIFdTSVpFIDogMCk7CisJCX0KKwkJZm9yIChuID0gMDsgbiA8IFdTSVpFOyBuKyspIHsKKwkJCW0gPSBHMS5wcmV2W25dOworCQkJRzEucHJldltuXSA9IChQb3MpIChtID49IFdTSVpFID8gbSAtIFdTSVpFIDogMCk7CisJCQkvKiBJZiBuIGlzIG5vdCBvbiBhbnkgaGFzaCBjaGFpbiwgcHJldltuXSBpcyBnYXJiYWdlIGJ1dAorCQkJICogaXRzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgdXNlZC4KKwkJCSAqLworCQl9CisJCW1vcmUgKz0gV1NJWkU7CisJfQorCS8qIEF0IHRoaXMgcG9pbnQsIG1vcmUgPj0gMiAqLworCWlmICghRzEuZW9maWxlKSB7CisJCW4gPSBmaWxlX3JlYWQoRzEud2luZG93ICsgRzEuc3Ryc3RhcnQgKyBHMS5sb29rYWhlYWQsIG1vcmUpOworCQlpZiAobiA9PSAwIHx8IG4gPT0gKHVuc2lnbmVkKSAtMSkgeworCQkJRzEuZW9maWxlID0gMTsKKwkJfSBlbHNlIHsKKwkJCUcxLmxvb2thaGVhZCArPSBuOworCQl9CisJfQorfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2V0IG1hdGNoX3N0YXJ0IHRvIHRoZSBsb25nZXN0IG1hdGNoIHN0YXJ0aW5nIGF0IHRoZSBnaXZlbiBzdHJpbmcgYW5kCisgKiByZXR1cm4gaXRzIGxlbmd0aC4gTWF0Y2hlcyBzaG9ydGVyIG9yIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFyZSBkaXNjYXJkZWQsCisgKiBpbiB3aGljaCBjYXNlIHRoZSByZXN1bHQgaXMgZXF1YWwgdG8gcHJldl9sZW5ndGggYW5kIG1hdGNoX3N0YXJ0IGlzCisgKiBnYXJiYWdlLgorICogSU4gYXNzZXJ0aW9uczogY3VyX21hdGNoIGlzIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluIGZvciB0aGUgY3VycmVudAorICogICBzdHJpbmcgKHN0cnN0YXJ0KSBhbmQgaXRzIGRpc3RhbmNlIGlzIDw9IE1BWF9ESVNULCBhbmQgcHJldl9sZW5ndGggPj0gMQorICovCisKKy8qIEZvciBNU0RPUywgT1MvMiBhbmQgMzg2IFVuaXgsIGFuIG9wdGltaXplZCB2ZXJzaW9uIGlzIGluIG1hdGNoLmFzbSBvcgorICogbWF0Y2gucy4gVGhlIGNvZGUgaXMgZnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQsIHNvIHlvdSBjYW4gdXNlIHRoZSBDIHZlcnNpb24KKyAqIGlmIGRlc2lyZWQuCisgKi8KK3N0YXRpYyBpbnQgbG9uZ2VzdF9tYXRjaChJUG9zIGN1cl9tYXRjaCkKK3sKKwl1bnNpZ25lZCBjaGFpbl9sZW5ndGggPSBtYXhfY2hhaW5fbGVuZ3RoOwkvKiBtYXggaGFzaCBjaGFpbiBsZW5ndGggKi8KKwl1Y2ggKnNjYW4gPSBHMS53aW5kb3cgKyBHMS5zdHJzdGFydDsJLyogY3VycmVudCBzdHJpbmcgKi8KKwl1Y2ggKm1hdGNoOwkvKiBtYXRjaGVkIHN0cmluZyAqLworCWludCBsZW47CS8qIGxlbmd0aCBvZiBjdXJyZW50IG1hdGNoICovCisJaW50IGJlc3RfbGVuID0gRzEucHJldl9sZW5ndGg7CS8qIGJlc3QgbWF0Y2ggbGVuZ3RoIHNvIGZhciAqLworCUlQb3MgbGltaXQgPSBHMS5zdHJzdGFydCA+IChJUG9zKSBNQVhfRElTVCA/IEcxLnN0cnN0YXJ0IC0gKElQb3MpIE1BWF9ESVNUIDogMDsKKwkvKiBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLAorCSAqIHdlIHByZXZlbnQgbWF0Y2hlcyB3aXRoIHRoZSBzdHJpbmcgb2Ygd2luZG93IGluZGV4IDAuCisJICovCisKKy8qIFRoZSBjb2RlIGlzIG9wdGltaXplZCBmb3IgSEFTSF9CSVRTID49IDggYW5kIE1BWF9NQVRDSC0yIG11bHRpcGxlIG9mIDE2LgorICogSXQgaXMgZWFzeSB0byBnZXQgcmlkIG9mIHRoaXMgb3B0aW1pemF0aW9uIGlmIG5lY2Vzc2FyeS4KKyAqLworI2lmIEhBU0hfQklUUyA8IDggfHwgTUFYX01BVENIICE9IDI1OAorIyAgZXJyb3IgQ29kZSB0b28gY2xldmVyCisjZW5kaWYKKwl1Y2ggKnN0cmVuZCA9IEcxLndpbmRvdyArIEcxLnN0cnN0YXJ0ICsgTUFYX01BVENIOworCXVjaCBzY2FuX2VuZDEgPSBzY2FuW2Jlc3RfbGVuIC0gMV07CisJdWNoIHNjYW5fZW5kID0gc2NhbltiZXN0X2xlbl07CisKKwkvKiBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOiAqLworCWlmIChHMS5wcmV2X2xlbmd0aCA+PSBnb29kX21hdGNoKSB7CisJCWNoYWluX2xlbmd0aCA+Pj0gMjsKKwl9CisJQXNzZXJ0KEcxLnN0cnN0YXJ0IDw9IFdJTkRPV19TSVpFIC0gTUlOX0xPT0tBSEVBRCwgImluc3VmZmljaWVudCBsb29rYWhlYWQiKTsKKworCWRvIHsKKwkJQXNzZXJ0KGN1cl9tYXRjaCA8IEcxLnN0cnN0YXJ0LCAibm8gZnV0dXJlIik7CisJCW1hdGNoID0gRzEud2luZG93ICsgY3VyX21hdGNoOworCisJCS8qIFNraXAgdG8gbmV4dCBtYXRjaCBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGNhbm5vdCBpbmNyZWFzZQorCQkgKiBvciBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGlzIGxlc3MgdGhhbiAyOgorCQkgKi8KKwkJaWYgKG1hdGNoW2Jlc3RfbGVuXSAhPSBzY2FuX2VuZAorCQkgfHwgbWF0Y2hbYmVzdF9sZW4gLSAxXSAhPSBzY2FuX2VuZDEKKwkJIHx8ICptYXRjaCAhPSAqc2NhbiB8fCAqKyttYXRjaCAhPSBzY2FuWzFdCisJCSkgeworCQkJY29udGludWU7CisJCX0KKworCQkvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZQorCQkgKiBhZ2FpbiBsYXRlci4gKFRoaXMgaGV1cmlzdGljIGlzIG5vdCBhbHdheXMgYSB3aW4uKQorCQkgKiBJdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNvbXBhcmUgc2NhblsyXSBhbmQgbWF0Y2hbMl0gc2luY2UgdGhleQorCQkgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0CisJCSAqIHRoZSBoYXNoIGtleXMgYXJlIGVxdWFsIGFuZCB0aGF0IEhBU0hfQklUUyA+PSA4LgorCQkgKi8KKwkJc2NhbiArPSAyLCBtYXRjaCsrOworCisJCS8qIFdlIGNoZWNrIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgZXZlcnkgOHRoIGNvbXBhcmlzb247CisJCSAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LgorCQkgKi8KKwkJZG8geworCQl9IHdoaWxlICgqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYKKwkJCQkgKisrc2NhbiA9PSAqKyttYXRjaCAmJiAqKytzY2FuID09ICorK21hdGNoICYmCisJCQkJICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgKisrc2NhbiA9PSAqKyttYXRjaCAmJgorCQkJCSAqKytzY2FuID09ICorK21hdGNoICYmICorK3NjYW4gPT0gKisrbWF0Y2ggJiYgc2NhbiA8IHN0cmVuZCk7CisKKwkJbGVuID0gTUFYX01BVENIIC0gKGludCkgKHN0cmVuZCAtIHNjYW4pOworCQlzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIOworCisJCWlmIChsZW4gPiBiZXN0X2xlbikgeworCQkJRzEubWF0Y2hfc3RhcnQgPSBjdXJfbWF0Y2g7CisJCQliZXN0X2xlbiA9IGxlbjsKKwkJCWlmIChsZW4gPj0gbmljZV9tYXRjaCkKKwkJCQlicmVhazsKKwkJCXNjYW5fZW5kMSA9IHNjYW5bYmVzdF9sZW4gLSAxXTsKKwkJCXNjYW5fZW5kID0gc2NhbltiZXN0X2xlbl07CisJCX0KKwl9IHdoaWxlICgoY3VyX21hdGNoID0gRzEucHJldltjdXJfbWF0Y2ggJiBXTUFTS10pID4gbGltaXQKKwkJCSAmJiAtLWNoYWluX2xlbmd0aCAhPSAwKTsKKworCXJldHVybiBiZXN0X2xlbjsKK30KKworCisjaWZkZWYgREVCVUcKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ2hlY2sgdGhhdCB0aGUgbWF0Y2ggYXQgbWF0Y2hfc3RhcnQgaXMgaW5kZWVkIGEgbWF0Y2guCisgKi8KK3N0YXRpYyB2b2lkIGNoZWNrX21hdGNoKElQb3Mgc3RhcnQsIElQb3MgbWF0Y2gsIGludCBsZW5ndGgpCit7CisJLyogY2hlY2sgdGhhdCB0aGUgbWF0Y2ggaXMgaW5kZWVkIGEgbWF0Y2ggKi8KKwlpZiAobWVtY21wKEcxLndpbmRvdyArIG1hdGNoLCBHMS53aW5kb3cgKyBzdGFydCwgbGVuZ3RoKSAhPSAwKSB7CisJCWJiX2Vycm9yX21zZygiIHN0YXJ0ICVkLCBtYXRjaCAlZCwgbGVuZ3RoICVkIiwgc3RhcnQsIG1hdGNoLCBsZW5ndGgpOworCQliYl9lcnJvcl9tc2coImludmFsaWQgbWF0Y2giKTsKKwl9CisJaWYgKHZlcmJvc2UgPiAxKSB7CisJCWJiX2Vycm9yX21zZygiXFxbJWQsJWRdIiwgc3RhcnQgLSBtYXRjaCwgbGVuZ3RoKTsKKwkJZG8geworCQkJYmJfcHV0Y2hhcl9zdGRlcnIoRzEud2luZG93W3N0YXJ0KytdKTsKKwkJfSB3aGlsZSAoLS1sZW5ndGggIT0gMCk7CisJfQorfQorI2Vsc2UKKyMgIGRlZmluZSBjaGVja19tYXRjaChzdGFydCwgbWF0Y2gsIGxlbmd0aCkgKCh2b2lkKTApCisjZW5kaWYKKworCisvKiB0cmVlcy5jIC0tIG91dHB1dCBkZWZsYXRlZCBkYXRhIHVzaW5nIEh1ZmZtYW4gY29kaW5nCisgKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5MyBKZWFuLWxvdXAgR2FpbGx5CisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICovCisKKy8qICBQVVJQT1NFCisgKiAgICAgIEVuY29kZSB2YXJpb3VzIHNldHMgb2Ygc291cmNlIHZhbHVlcyB1c2luZyB2YXJpYWJsZS1sZW5ndGgKKyAqICAgICAgYmluYXJ5IGNvZGUgdHJlZXMuCisgKgorICogIERJU0NVU1NJT04KKyAqICAgICAgVGhlIFBLWklQICJkZWZsYXRpb24iIHByb2Nlc3MgdXNlcyBzZXZlcmFsIEh1ZmZtYW4gdHJlZXMuIFRoZSBtb3JlCisgKiAgICAgIGNvbW1vbiBzb3VyY2UgdmFsdWVzIGFyZSByZXByZXNlbnRlZCBieSBzaG9ydGVyIGJpdCBzZXF1ZW5jZXMuCisgKgorICogICAgICBFYWNoIGNvZGUgdHJlZSBpcyBzdG9yZWQgaW4gdGhlIFpJUCBmaWxlIGluIGEgY29tcHJlc3NlZCBmb3JtCisgKiAgICAgIHdoaWNoIGlzIGl0c2VsZiBhIEh1ZmZtYW4gZW5jb2Rpbmcgb2YgdGhlIGxlbmd0aHMgb2YKKyAqICAgICAgYWxsIHRoZSBjb2RlIHN0cmluZ3MgKGluIGFzY2VuZGluZyBvcmRlciBieSBzb3VyY2UgdmFsdWVzKS4KKyAqICAgICAgVGhlIGFjdHVhbCBjb2RlIHN0cmluZ3MgYXJlIHJlY29uc3RydWN0ZWQgZnJvbSB0aGUgbGVuZ3RocyBpbgorICogICAgICB0aGUgVU5aSVAgcHJvY2VzcywgYXMgZGVzY3JpYmVkIGluIHRoZSAiYXBwbGljYXRpb24gbm90ZSIKKyAqICAgICAgKEFQUE5PVEUuVFhUKSBkaXN0cmlidXRlZCBhcyBwYXJ0IG9mIFBLV0FSRSdzIFBLWklQIHByb2dyYW0uCisgKgorICogIFJFRkVSRU5DRVMKKyAqICAgICAgTHluY2gsIFRob21hcyBKLgorICogICAgICAgICAgRGF0YSBDb21wcmVzc2lvbjogIFRlY2huaXF1ZXMgYW5kIEFwcGxpY2F0aW9ucywgcHAuIDUzLTU1LgorICogICAgICAgICAgTGlmZXRpbWUgTGVhcm5pbmcgUHVibGljYXRpb25zLCAxOTg1LiAgSVNCTiAwLTUzNC0wMzQxOC03LgorICoKKyAqICAgICAgU3RvcmVyLCBKYW1lcyBBLgorICogICAgICAgICAgRGF0YSBDb21wcmVzc2lvbjogIE1ldGhvZHMgYW5kIFRoZW9yeSwgcHAuIDQ5LTUwLgorICogICAgICAgICAgQ29tcHV0ZXIgU2NpZW5jZSBQcmVzcywgMTk4OC4gIElTQk4gMC03MTY3LTgxNTYtNS4KKyAqCisgKiAgICAgIFNlZGdld2ljaywgUi4KKyAqICAgICAgICAgIEFsZ29yaXRobXMsIHAyOTAuCisgKiAgICAgICAgICBBZGRpc29uLVdlc2xleSwgMTk4My4gSVNCTiAwLTIwMS0wNjY3Mi02LgorICoKKyAqICBJTlRFUkZBQ0UKKyAqICAgICAgdm9pZCBjdF9pbml0KCkKKyAqICAgICAgICAgIEFsbG9jYXRlIHRoZSBtYXRjaCBidWZmZXIsIGluaXRpYWxpemUgdGhlIHZhcmlvdXMgdGFibGVzIFthbmQgc2F2ZQorICogICAgICAgICAgdGhlIGxvY2F0aW9uIG9mIHRoZSBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZSAoYXNjaWkvYmluYXJ5KSBhbmQKKyAqICAgICAgICAgIG1ldGhvZCAoREVGTEFURS9TVE9SRSkgLS0gZGVsZXRlZCBpbiBiYm94XQorICoKKyAqICAgICAgdm9pZCBjdF90YWxseShpbnQgZGlzdCwgaW50IGxjKTsKKyAqICAgICAgICAgIFNhdmUgdGhlIG1hdGNoIGluZm8gYW5kIHRhbGx5IHRoZSBmcmVxdWVuY3kgY291bnRzLgorICoKKyAqICAgICAgdWxnIGZsdXNoX2Jsb2NrKGNoYXIgKmJ1ZiwgdWxnIHN0b3JlZF9sZW4sIGludCBlb2YpCisgKiAgICAgICAgICBEZXRlcm1pbmUgdGhlIGJlc3QgZW5jb2RpbmcgZm9yIHRoZSBjdXJyZW50IGJsb2NrOiBkeW5hbWljIHRyZWVzLAorICogICAgICAgICAgc3RhdGljIHRyZWVzIG9yIHN0b3JlLCBhbmQgb3V0cHV0IHRoZSBlbmNvZGVkIGJsb2NrIHRvIHRoZSB6aXAKKyAqICAgICAgICAgIGZpbGUuIFJldHVybnMgdGhlIHRvdGFsIGNvbXByZXNzZWQgbGVuZ3RoIGZvciB0aGUgZmlsZSBzbyBmYXIuCisgKi8KKworI2RlZmluZSBNQVhfQklUUyAxNQorLyogQWxsIGNvZGVzIG11c3Qgbm90IGV4Y2VlZCBNQVhfQklUUyBiaXRzICovCisKKyNkZWZpbmUgTUFYX0JMX0JJVFMgNworLyogQml0IGxlbmd0aCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JMX0JJVFMgYml0cyAqLworCisjZGVmaW5lIExFTkdUSF9DT0RFUyAyOQorLyogbnVtYmVyIG9mIGxlbmd0aCBjb2Rlcywgbm90IGNvdW50aW5nIHRoZSBzcGVjaWFsIEVORF9CTE9DSyBjb2RlICovCisKKyNkZWZpbmUgTElURVJBTFMgIDI1NgorLyogbnVtYmVyIG9mIGxpdGVyYWwgYnl0ZXMgMC4uMjU1ICovCisKKyNkZWZpbmUgRU5EX0JMT0NLIDI1NgorLyogZW5kIG9mIGJsb2NrIGxpdGVyYWwgY29kZSAqLworCisjZGVmaW5lIExfQ09ERVMgKExJVEVSQUxTKzErTEVOR1RIX0NPREVTKQorLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovCisKKyNkZWZpbmUgRF9DT0RFUyAgIDMwCisvKiBudW1iZXIgb2YgZGlzdGFuY2UgY29kZXMgKi8KKworI2RlZmluZSBCTF9DT0RFUyAgMTkKKy8qIG51bWJlciBvZiBjb2RlcyB1c2VkIHRvIHRyYW5zZmVyIHRoZSBiaXQgbGVuZ3RocyAqLworCisvKiBleHRyYSBiaXRzIGZvciBlYWNoIGxlbmd0aCBjb2RlICovCitzdGF0aWMgY29uc3QgdWludDhfdCBleHRyYV9sYml0c1tMRU5HVEhfQ09ERVNdIEFMSUdOMSA9IHsKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCA0LCA0LAorCTQsIDQsIDUsIDUsIDUsIDUsIDAKK307CisKKy8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZXh0cmFfZGJpdHNbRF9DT0RFU10gQUxJR04xID0geworCTAsIDAsIDAsIDAsIDEsIDEsIDIsIDIsIDMsIDMsIDQsIDQsIDUsIDUsIDYsIDYsIDcsIDcsIDgsIDgsIDksIDksCisJMTAsIDEwLCAxMSwgMTEsIDEyLCAxMiwgMTMsIDEzCit9OworCisvKiBleHRyYSBiaXRzIGZvciBlYWNoIGJpdCBsZW5ndGggY29kZSAqLworc3RhdGljIGNvbnN0IHVpbnQ4X3QgZXh0cmFfYmxiaXRzW0JMX0NPREVTXSBBTElHTjEgPSB7CisJMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMiwgMywgNyB9OworCisvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGJsX29yZGVyW0JMX0NPREVTXSBBTElHTjEgPSB7CisJMTYsIDE3LCAxOCwgMCwgOCwgNywgOSwgNiwgMTAsIDUsIDExLCA0LCAxMiwgMywgMTMsIDIsIDE0LCAxLCAxNSB9OworCisjZGVmaW5lIFNUT1JFRF9CTE9DSyAwCisjZGVmaW5lIFNUQVRJQ19UUkVFUyAxCisjZGVmaW5lIERZTl9UUkVFUyAgICAyCisvKiBUaGUgdGhyZWUga2luZHMgb2YgYmxvY2sgdHlwZSAqLworCisjaWZuZGVmIExJVF9CVUZTSVpFCisjICBpZmRlZiBTTUFMTF9NRU0KKyMgICAgZGVmaW5lIExJVF9CVUZTSVpFICAweDIwMDAKKyMgIGVsc2UKKyMgIGlmZGVmIE1FRElVTV9NRU0KKyMgICAgZGVmaW5lIExJVF9CVUZTSVpFICAweDQwMDAKKyMgIGVsc2UKKyMgICAgZGVmaW5lIExJVF9CVUZTSVpFICAweDgwMDAKKyMgIGVuZGlmCisjICBlbmRpZgorI2VuZGlmCisjaWZuZGVmIERJU1RfQlVGU0laRQorIyAgZGVmaW5lIERJU1RfQlVGU0laRSAgTElUX0JVRlNJWkUKKyNlbmRpZgorLyogU2l6ZXMgb2YgbWF0Y2ggYnVmZmVycyBmb3IgbGl0ZXJhbHMvbGVuZ3RocyBhbmQgZGlzdGFuY2VzLiAgVGhlcmUgYXJlCisgKiA0IHJlYXNvbnMgZm9yIGxpbWl0aW5nIExJVF9CVUZTSVpFIHRvIDY0SzoKKyAqICAgLSBmcmVxdWVuY2llcyBjYW4gYmUga2VwdCBpbiAxNiBiaXQgY291bnRlcnMKKyAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbGwgaW5wdXQgZGF0YSBpcworICogICAgIHN0aWxsIGluIHRoZSB3aW5kb3cgc28gd2UgY2FuIHN0aWxsIGVtaXQgYSBzdG9yZWQgYmxvY2sgZXZlbiB3aGVuIGlucHV0CisgKiAgICAgY29tZXMgZnJvbSBzdGFuZGFyZCBpbnB1dC4gIChUaGlzIGNhbiBhbHNvIGJlIGRvbmUgZm9yIGFsbCBibG9ja3MgaWYKKyAqICAgICBMSVRfQlVGU0laRSBpcyBub3QgZ3JlYXRlciB0aGFuIDMySy4pCisgKiAgIC0gaWYgY29tcHJlc3Npb24gaXMgbm90IHN1Y2Nlc3NmdWwgZm9yIGEgZmlsZSBzbWFsbGVyIHRoYW4gNjRLLCB3ZSBjYW4KKyAqICAgICBldmVuIGVtaXQgYSBzdG9yZWQgZmlsZSBpbnN0ZWFkIG9mIGEgc3RvcmVkIGJsb2NrIChzYXZpbmcgNSBieXRlcykuCisgKiAgIC0gY3JlYXRpbmcgbmV3IEh1ZmZtYW4gdHJlZXMgbGVzcyBmcmVxdWVudGx5IG1heSBub3QgcHJvdmlkZSBmYXN0CisgKiAgICAgYWRhcHRhdGlvbiB0byBjaGFuZ2VzIGluIHRoZSBpbnB1dCBkYXRhIHN0YXRpc3RpY3MuIChUYWtlIGZvcgorICogICAgIGV4YW1wbGUgYSBiaW5hcnkgZmlsZSB3aXRoIHBvb3JseSBjb21wcmVzc2libGUgY29kZSBmb2xsb3dlZCBieQorICogICAgIGEgaGlnaGx5IGNvbXByZXNzaWJsZSBzdHJpbmcgdGFibGUuKSBTbWFsbGVyIGJ1ZmZlciBzaXplcyBnaXZlCisgKiAgICAgZmFzdCBhZGFwdGF0aW9uIGJ1dCBoYXZlIG9mIGNvdXJzZSB0aGUgb3ZlcmhlYWQgb2YgdHJhbnNtaXR0aW5nIHRyZWVzCisgKiAgICAgbW9yZSBmcmVxdWVudGx5LgorICogICAtIEkgY2FuJ3QgY291bnQgYWJvdmUgNAorICogVGhlIGN1cnJlbnQgY29kZSBpcyBnZW5lcmFsIGFuZCBhbGxvd3MgRElTVF9CVUZTSVpFIDwgTElUX0JVRlNJWkUgKHRvIHNhdmUKKyAqIG1lbW9yeSBhdCB0aGUgZXhwZW5zZSBvZiBjb21wcmVzc2lvbikuIFNvbWUgb3B0aW1pemF0aW9ucyB3b3VsZCBiZSBwb3NzaWJsZQorICogaWYgd2UgcmVseSBvbiBESVNUX0JVRlNJWkUgPT0gTElUX0JVRlNJWkUuCisgKi8KKyNkZWZpbmUgUkVQXzNfNiAgICAgIDE2CisvKiByZXBlYXQgcHJldmlvdXMgYml0IGxlbmd0aCAzLTYgdGltZXMgKDIgYml0cyBvZiByZXBlYXQgY291bnQpICovCisjZGVmaW5lIFJFUFpfM18xMCAgICAxNworLyogcmVwZWF0IGEgemVybyBsZW5ndGggMy0xMCB0aW1lcyAgKDMgYml0cyBvZiByZXBlYXQgY291bnQpICovCisjZGVmaW5lIFJFUFpfMTFfMTM4ICAxOAorLyogcmVwZWF0IGEgemVybyBsZW5ndGggMTEtMTM4IHRpbWVzICAoNyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworLyogRGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmluZyBhIHNpbmdsZSB2YWx1ZSBhbmQgaXRzIGNvZGUgc3RyaW5nLiAqLwordHlwZWRlZiBzdHJ1Y3QgY3RfZGF0YSB7CisJdW5pb24geworCQl1c2ggZnJlcTsJCS8qIGZyZXF1ZW5jeSBjb3VudCAqLworCQl1c2ggY29kZTsJCS8qIGJpdCBzdHJpbmcgKi8KKwl9IGZjOworCXVuaW9uIHsKKwkJdXNoIGRhZDsJCS8qIGZhdGhlciBub2RlIGluIEh1ZmZtYW4gdHJlZSAqLworCQl1c2ggbGVuOwkJLyogbGVuZ3RoIG9mIGJpdCBzdHJpbmcgKi8KKwl9IGRsOworfSBjdF9kYXRhOworCisjZGVmaW5lIEZyZXEgZmMuZnJlcQorI2RlZmluZSBDb2RlIGZjLmNvZGUKKyNkZWZpbmUgRGFkICBkbC5kYWQKKyNkZWZpbmUgTGVuICBkbC5sZW4KKworI2RlZmluZSBIRUFQX1NJWkUgKDIqTF9DT0RFUyArIDEpCisvKiBtYXhpbXVtIGhlYXAgc2l6ZSAqLworCit0eXBlZGVmIHN0cnVjdCB0cmVlX2Rlc2MgeworCWN0X2RhdGEgKmR5bl90cmVlOwkvKiB0aGUgZHluYW1pYyB0cmVlICovCisJY3RfZGF0YSAqc3RhdGljX3RyZWU7CS8qIGNvcnJlc3BvbmRpbmcgc3RhdGljIHRyZWUgb3IgTlVMTCAqLworCWNvbnN0IHVpbnQ4X3QgKmV4dHJhX2JpdHM7CS8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggY29kZSBvciBOVUxMICovCisJaW50IGV4dHJhX2Jhc2U7CQkvKiBiYXNlIGluZGV4IGZvciBleHRyYV9iaXRzICovCisJaW50IGVsZW1zOwkJCS8qIG1heCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRyZWUgKi8KKwlpbnQgbWF4X2xlbmd0aDsJCS8qIG1heCBiaXQgbGVuZ3RoIGZvciB0aGUgY29kZXMgKi8KKwlpbnQgbWF4X2NvZGU7CQkvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi8KK30gdHJlZV9kZXNjOworCitzdHJ1Y3QgZ2xvYmFsczIgeworCisJdXNoIGhlYXBbSEVBUF9TSVpFXTsgICAgIC8qIGhlYXAgdXNlZCB0byBidWlsZCB0aGUgSHVmZm1hbiB0cmVlcyAqLworCWludCBoZWFwX2xlbjsgICAgICAgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhlYXAgKi8KKwlpbnQgaGVhcF9tYXg7ICAgICAgICAgICAgLyogZWxlbWVudCBvZiBsYXJnZXN0IGZyZXF1ZW5jeSAqLworCisvKiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLgorICogVGhlIHNhbWUgaGVhcCBhcnJheSBpcyB1c2VkIHRvIGJ1aWxkIGFsbCB0cmVlcy4KKyAqLworCisJY3RfZGF0YSBkeW5fbHRyZWVbSEVBUF9TSVpFXTsJLyogbGl0ZXJhbCBhbmQgbGVuZ3RoIHRyZWUgKi8KKwljdF9kYXRhIGR5bl9kdHJlZVsyICogRF9DT0RFUyArIDFdOwkvKiBkaXN0YW5jZSB0cmVlICovCisKKwljdF9kYXRhIHN0YXRpY19sdHJlZVtMX0NPREVTICsgMl07CisKKy8qIFRoZSBzdGF0aWMgbGl0ZXJhbCB0cmVlLiBTaW5jZSB0aGUgYml0IGxlbmd0aHMgYXJlIGltcG9zZWQsIHRoZXJlIGlzIG5vCisgKiBuZWVkIGZvciB0aGUgTF9DT0RFUyBleHRyYSBjb2RlcyB1c2VkIGR1cmluZyBoZWFwIGNvbnN0cnVjdGlvbi4gSG93ZXZlcgorICogVGhlIGNvZGVzIDI4NiBhbmQgMjg3IGFyZSBuZWVkZWQgdG8gYnVpbGQgYSBjYW5vbmljYWwgdHJlZSAoc2VlIGN0X2luaXQKKyAqIGJlbG93KS4KKyAqLworCisJY3RfZGF0YSBzdGF0aWNfZHRyZWVbRF9DT0RFU107CisKKy8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZS4gKEFjdHVhbGx5IGEgdHJpdmlhbCB0cmVlIHNpbmNlIGFsbCBjb2RlcyB1c2UKKyAqIDUgYml0cy4pCisgKi8KKworCWN0X2RhdGEgYmxfdHJlZVsyICogQkxfQ09ERVMgKyAxXTsKKworLyogSHVmZm1hbiB0cmVlIGZvciB0aGUgYml0IGxlbmd0aHMgKi8KKworCXRyZWVfZGVzYyBsX2Rlc2M7CisJdHJlZV9kZXNjIGRfZGVzYzsKKwl0cmVlX2Rlc2MgYmxfZGVzYzsKKworCXVzaCBibF9jb3VudFtNQVhfQklUUyArIDFdOworCisvKiBUaGUgbGVuZ3RocyBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcyBhcmUgc2VudCBpbiBvcmRlciBvZiBkZWNyZWFzaW5nCisgKiBwcm9iYWJpbGl0eSwgdG8gYXZvaWQgdHJhbnNtaXR0aW5nIHRoZSBsZW5ndGhzIGZvciB1bnVzZWQgYml0IGxlbmd0aCBjb2Rlcy4KKyAqLworCisJdWNoIGRlcHRoWzIgKiBMX0NPREVTICsgMV07CisKKy8qIERlcHRoIG9mIGVhY2ggc3VidHJlZSB1c2VkIGFzIHRpZSBicmVha2VyIGZvciB0cmVlcyBvZiBlcXVhbCBmcmVxdWVuY3kgKi8KKworCXVjaCBsZW5ndGhfY29kZVtNQVhfTUFUQ0ggLSBNSU5fTUFUQ0ggKyAxXTsKKworLyogbGVuZ3RoIGNvZGUgZm9yIGVhY2ggbm9ybWFsaXplZCBtYXRjaCBsZW5ndGggKDAgPT0gTUlOX01BVENIKSAqLworCisJdWNoIGRpc3RfY29kZVs1MTJdOworCisvKiBkaXN0YW5jZSBjb2Rlcy4gVGhlIGZpcnN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgZGlzdGFuY2VzCisgKiAzIC4uIDI1OCwgdGhlIGxhc3QgMjU2IHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSB0b3AgOCBiaXRzIG9mCisgKiB0aGUgMTUgYml0IGRpc3RhbmNlcy4KKyAqLworCisJaW50IGJhc2VfbGVuZ3RoW0xFTkdUSF9DT0RFU107CisKKy8qIEZpcnN0IG5vcm1hbGl6ZWQgbGVuZ3RoIGZvciBlYWNoIGNvZGUgKDAgPSBNSU5fTUFUQ0gpICovCisKKwlpbnQgYmFzZV9kaXN0W0RfQ09ERVNdOworCisvKiBGaXJzdCBub3JtYWxpemVkIGRpc3RhbmNlIGZvciBlYWNoIGNvZGUgKDAgPSBkaXN0YW5jZSBvZiAxKSAqLworCisJdWNoIGZsYWdfYnVmW0xJVF9CVUZTSVpFIC8gOF07CisKKy8qIGZsYWdfYnVmIGlzIGEgYml0IGFycmF5IGRpc3Rpbmd1aXNoaW5nIGxpdGVyYWxzIGZyb20gbGVuZ3RocyBpbgorICogbF9idWYsIHRodXMgaW5kaWNhdGluZyB0aGUgcHJlc2VuY2Ugb3IgYWJzZW5jZSBvZiBhIGRpc3RhbmNlLgorICovCisKKwl1bnNpZ25lZCBsYXN0X2xpdDsgICAgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqLworCXVuc2lnbmVkIGxhc3RfZGlzdDsgICAgICAvKiBydW5uaW5nIGluZGV4IGluIGRfYnVmICovCisJdW5zaWduZWQgbGFzdF9mbGFnczsgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gZmxhZ19idWYgKi8KKwl1Y2ggZmxhZ3M7ICAgICAgICAgICAgICAgLyogY3VycmVudCBmbGFncyBub3QgeWV0IHNhdmVkIGluIGZsYWdfYnVmICovCisJdWNoIGZsYWdfYml0OyAgICAgICAgICAgIC8qIGN1cnJlbnQgYml0IHVzZWQgaW4gZmxhZ3MgKi8KKworLyogYml0cyBhcmUgZmlsbGVkIGluIGZsYWdzIHN0YXJ0aW5nIGF0IGJpdCAwIChsZWFzdCBzaWduaWZpY2FudCkuCisgKiBOb3RlOiB0aGVzZSBmbGFncyBhcmUgb3ZlcmtpbGwgaW4gdGhlIGN1cnJlbnQgY29kZSBzaW5jZSB3ZSBkb24ndAorICogdGFrZSBhZHZhbnRhZ2Ugb2YgRElTVF9CVUZTSVpFID09IExJVF9CVUZTSVpFLgorICovCisKKwl1bGcgb3B0X2xlbjsgICAgICAgICAgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggb3B0aW1hbCB0cmVlcyAqLworCXVsZyBzdGF0aWNfbGVuOyAgICAgICAgICAvKiBiaXQgbGVuZ3RoIG9mIGN1cnJlbnQgYmxvY2sgd2l0aCBzdGF0aWMgdHJlZXMgKi8KKworCXVsZyBjb21wcmVzc2VkX2xlbjsgICAgICAvKiB0b3RhbCBiaXQgbGVuZ3RoIG9mIGNvbXByZXNzZWQgZmlsZSAqLworfTsKKworI2RlZmluZSBHMnB0ciAoKHN0cnVjdCBnbG9iYWxzMiopKHB0cl90b19nbG9iYWxzKSkKKyNkZWZpbmUgRzIgKCpHMnB0cikKKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqLworc3RhdGljIHZvaWQgZ2VuX2NvZGVzKGN0X2RhdGEgKiB0cmVlLCBpbnQgbWF4X2NvZGUpOworc3RhdGljIHZvaWQgYnVpbGRfdHJlZSh0cmVlX2Rlc2MgKiBkZXNjKTsKK3N0YXRpYyB2b2lkIHNjYW5fdHJlZShjdF9kYXRhICogdHJlZSwgaW50IG1heF9jb2RlKTsKK3N0YXRpYyB2b2lkIHNlbmRfdHJlZShjdF9kYXRhICogdHJlZSwgaW50IG1heF9jb2RlKTsKK3N0YXRpYyBpbnQgYnVpbGRfYmxfdHJlZSh2b2lkKTsKK3N0YXRpYyB2b2lkIHNlbmRfYWxsX3RyZWVzKGludCBsY29kZXMsIGludCBkY29kZXMsIGludCBibGNvZGVzKTsKK3N0YXRpYyB2b2lkIGNvbXByZXNzX2Jsb2NrKGN0X2RhdGEgKiBsdHJlZSwgY3RfZGF0YSAqIGR0cmVlKTsKKworCisjaWZuZGVmIERFQlVHCisvKiBTZW5kIGEgY29kZSBvZiB0aGUgZ2l2ZW4gdHJlZS4gYyBhbmQgdHJlZSBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cyAqLworIyAgZGVmaW5lIFNFTkRfQ09ERShjLCB0cmVlKSBzZW5kX2JpdHModHJlZVtjXS5Db2RlLCB0cmVlW2NdLkxlbikKKyNlbHNlCisjICBkZWZpbmUgU0VORF9DT0RFKGMsIHRyZWUpIFwKK3sgXAorCWlmICh2ZXJib3NlID4gMSkgYmJfZXJyb3JfbXNnKCJcbmNkICUzZCAiLCAoYykpOyBcCisJc2VuZF9iaXRzKHRyZWVbY10uQ29kZSwgdHJlZVtjXS5MZW4pOyBcCit9CisjZW5kaWYKKworI2RlZmluZSBEX0NPREUoZGlzdCkgXAorCSgoZGlzdCkgPCAyNTYgPyBHMi5kaXN0X2NvZGVbZGlzdF0gOiBHMi5kaXN0X2NvZGVbMjU2ICsgKChkaXN0KT4+NyldKQorLyogTWFwcGluZyBmcm9tIGEgZGlzdGFuY2UgdG8gYSBkaXN0YW5jZSBjb2RlLiBkaXN0IGlzIHRoZSBkaXN0YW5jZSAtIDEgYW5kCisgKiBtdXN0IG5vdCBoYXZlIHNpZGUgZWZmZWN0cy4gZGlzdF9jb2RlWzI1Nl0gYW5kIGRpc3RfY29kZVsyNTddIGFyZSBuZXZlcgorICogdXNlZC4KKyAqIFRoZSBhcmd1bWVudHMgbXVzdCBub3QgaGF2ZSBzaWRlIGVmZmVjdHMuCisgKi8KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgYSBuZXcgYmxvY2suCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfYmxvY2sodm9pZCkKK3sKKwlpbnQgbjsgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovCisKKwkvKiBJbml0aWFsaXplIHRoZSB0cmVlcy4gKi8KKwlmb3IgKG4gPSAwOyBuIDwgTF9DT0RFUzsgbisrKQorCQlHMi5keW5fbHRyZWVbbl0uRnJlcSA9IDA7CisJZm9yIChuID0gMDsgbiA8IERfQ09ERVM7IG4rKykKKwkJRzIuZHluX2R0cmVlW25dLkZyZXEgPSAwOworCWZvciAobiA9IDA7IG4gPCBCTF9DT0RFUzsgbisrKQorCQlHMi5ibF90cmVlW25dLkZyZXEgPSAwOworCisJRzIuZHluX2x0cmVlW0VORF9CTE9DS10uRnJlcSA9IDE7CisJRzIub3B0X2xlbiA9IEcyLnN0YXRpY19sZW4gPSAwOworCUcyLmxhc3RfbGl0ID0gRzIubGFzdF9kaXN0ID0gRzIubGFzdF9mbGFncyA9IDA7CisJRzIuZmxhZ3MgPSAwOworCUcyLmZsYWdfYml0ID0gMTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFJlc3RvcmUgdGhlIGhlYXAgcHJvcGVydHkgYnkgbW92aW5nIGRvd24gdGhlIHRyZWUgc3RhcnRpbmcgYXQgbm9kZSBrLAorICogZXhjaGFuZ2luZyBhIG5vZGUgd2l0aCB0aGUgc21hbGxlc3Qgb2YgaXRzIHR3byBzb25zIGlmIG5lY2Vzc2FyeSwgc3RvcHBpbmcKKyAqIHdoZW4gdGhlIGhlYXAgcHJvcGVydHkgaXMgcmUtZXN0YWJsaXNoZWQgKGVhY2ggZmF0aGVyIHNtYWxsZXIgdGhhbiBpdHMKKyAqIHR3byBzb25zKS4KKyAqLworCisvKiBDb21wYXJlcyB0byBzdWJ0cmVlcywgdXNpbmcgdGhlIHRyZWUgZGVwdGggYXMgdGllIGJyZWFrZXIgd2hlbgorICogdGhlIHN1YnRyZWVzIGhhdmUgZXF1YWwgZnJlcXVlbmN5LiBUaGlzIG1pbmltaXplcyB0aGUgd29yc3QgY2FzZSBsZW5ndGguICovCisjZGVmaW5lIFNNQUxMRVIodHJlZSwgbiwgbSkgXAorCSh0cmVlW25dLkZyZXEgPCB0cmVlW21dLkZyZXEgXAorCXx8ICh0cmVlW25dLkZyZXEgPT0gdHJlZVttXS5GcmVxICYmIEcyLmRlcHRoW25dIDw9IEcyLmRlcHRoW21dKSkKKworc3RhdGljIHZvaWQgcHFkb3duaGVhcChjdF9kYXRhICogdHJlZSwgaW50IGspCit7CisJaW50IHYgPSBHMi5oZWFwW2tdOworCWludCBqID0gayA8PCAxOwkJLyogbGVmdCBzb24gb2YgayAqLworCisJd2hpbGUgKGogPD0gRzIuaGVhcF9sZW4pIHsKKwkJLyogU2V0IGogdG8gdGhlIHNtYWxsZXN0IG9mIHRoZSB0d28gc29uczogKi8KKwkJaWYgKGogPCBHMi5oZWFwX2xlbiAmJiBTTUFMTEVSKHRyZWUsIEcyLmhlYXBbaiArIDFdLCBHMi5oZWFwW2pdKSkKKwkJCWorKzsKKworCQkvKiBFeGl0IGlmIHYgaXMgc21hbGxlciB0aGFuIGJvdGggc29ucyAqLworCQlpZiAoU01BTExFUih0cmVlLCB2LCBHMi5oZWFwW2pdKSkKKwkJCWJyZWFrOworCisJCS8qIEV4Y2hhbmdlIHYgd2l0aCB0aGUgc21hbGxlc3Qgc29uICovCisJCUcyLmhlYXBba10gPSBHMi5oZWFwW2pdOworCQlrID0gajsKKworCQkvKiBBbmQgY29udGludWUgZG93biB0aGUgdHJlZSwgc2V0dGluZyBqIHRvIHRoZSBsZWZ0IHNvbiBvZiBrICovCisJCWogPDw9IDE7CisJfQorCUcyLmhlYXBba10gPSB2OworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogQ29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyBmb3IgYSB0cmVlIGFuZCB1cGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGgKKyAqIGZvciB0aGUgY3VycmVudCBibG9jay4KKyAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldCwgaGVhcFtoZWFwX21heF0gYW5kCisgKiAgICBhYm92ZSBhcmUgdGhlIHRyZWUgbm9kZXMgc29ydGVkIGJ5IGluY3JlYXNpbmcgZnJlcXVlbmN5LgorICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZCBsZW4gaXMgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgsIHRoZQorICogICAgIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBmcmVxdWVuY2llcyBmb3IgZWFjaCBiaXQgbGVuZ3RoLgorICogICAgIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpcworICogICAgIG5vdCBudWxsLgorICovCitzdGF0aWMgdm9pZCBnZW5fYml0bGVuKHRyZWVfZGVzYyAqIGRlc2MpCit7CisJY3RfZGF0YSAqdHJlZSA9IGRlc2MtPmR5bl90cmVlOworCWNvbnN0IHVpbnQ4X3QgKmV4dHJhID0gZGVzYy0+ZXh0cmFfYml0czsKKwlpbnQgYmFzZSA9IGRlc2MtPmV4dHJhX2Jhc2U7CisJaW50IG1heF9jb2RlID0gZGVzYy0+bWF4X2NvZGU7CisJaW50IG1heF9sZW5ndGggPSBkZXNjLT5tYXhfbGVuZ3RoOworCWN0X2RhdGEgKnN0cmVlID0gZGVzYy0+c3RhdGljX3RyZWU7CisJaW50IGg7CQkJCS8qIGhlYXAgaW5kZXggKi8KKwlpbnQgbiwgbTsJCQkvKiBpdGVyYXRlIG92ZXIgdGhlIHRyZWUgZWxlbWVudHMgKi8KKwlpbnQgYml0czsJCQkvKiBiaXQgbGVuZ3RoICovCisJaW50IHhiaXRzOwkJCS8qIGV4dHJhIGJpdHMgKi8KKwl1c2ggZjsJCQkJLyogZnJlcXVlbmN5ICovCisJaW50IG92ZXJmbG93ID0gMDsJLyogbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGggYml0IGxlbmd0aCB0b28gbGFyZ2UgKi8KKworCWZvciAoYml0cyA9IDA7IGJpdHMgPD0gTUFYX0JJVFM7IGJpdHMrKykKKwkJRzIuYmxfY291bnRbYml0c10gPSAwOworCisJLyogSW4gYSBmaXJzdCBwYXNzLCBjb21wdXRlIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGhzICh3aGljaCBtYXkKKwkgKiBvdmVyZmxvdyBpbiB0aGUgY2FzZSBvZiB0aGUgYml0IGxlbmd0aCB0cmVlKS4KKwkgKi8KKwl0cmVlW0cyLmhlYXBbRzIuaGVhcF9tYXhdXS5MZW4gPSAwOwkvKiByb290IG9mIHRoZSBoZWFwICovCisKKwlmb3IgKGggPSBHMi5oZWFwX21heCArIDE7IGggPCBIRUFQX1NJWkU7IGgrKykgeworCQluID0gRzIuaGVhcFtoXTsKKwkJYml0cyA9IHRyZWVbdHJlZVtuXS5EYWRdLkxlbiArIDE7CisJCWlmIChiaXRzID4gbWF4X2xlbmd0aCkgeworCQkJYml0cyA9IG1heF9sZW5ndGg7CisJCQlvdmVyZmxvdysrOworCQl9CisJCXRyZWVbbl0uTGVuID0gKHVzaCkgYml0czsKKwkJLyogV2Ugb3ZlcndyaXRlIHRyZWVbbl0uRGFkIHdoaWNoIGlzIG5vIGxvbmdlciBuZWVkZWQgKi8KKworCQlpZiAobiA+IG1heF9jb2RlKQorCQkJY29udGludWU7CS8qIG5vdCBhIGxlYWYgbm9kZSAqLworCisJCUcyLmJsX2NvdW50W2JpdHNdKys7CisJCXhiaXRzID0gMDsKKwkJaWYgKG4gPj0gYmFzZSkKKwkJCXhiaXRzID0gZXh0cmFbbiAtIGJhc2VdOworCQlmID0gdHJlZVtuXS5GcmVxOworCQlHMi5vcHRfbGVuICs9ICh1bGcpIGYgKihiaXRzICsgeGJpdHMpOworCisJCWlmIChzdHJlZSkKKwkJCUcyLnN0YXRpY19sZW4gKz0gKHVsZykgZiAqIChzdHJlZVtuXS5MZW4gKyB4Yml0cyk7CisJfQorCWlmIChvdmVyZmxvdyA9PSAwKQorCQlyZXR1cm47CisKKwlUcmFjZSgoc3RkZXJyLCAiXG5iaXQgbGVuZ3RoIG92ZXJmbG93XG4iKSk7CisJLyogVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIG9uIG9iajIgYW5kIHBpYyBvZiB0aGUgQ2FsZ2FyeSBjb3JwdXMgKi8KKworCS8qIEZpbmQgdGhlIGZpcnN0IGJpdCBsZW5ndGggd2hpY2ggY291bGQgaW5jcmVhc2U6ICovCisJZG8geworCQliaXRzID0gbWF4X2xlbmd0aCAtIDE7CisJCXdoaWxlIChHMi5ibF9jb3VudFtiaXRzXSA9PSAwKQorCQkJYml0cy0tOworCQlHMi5ibF9jb3VudFtiaXRzXS0tOwkvKiBtb3ZlIG9uZSBsZWFmIGRvd24gdGhlIHRyZWUgKi8KKwkJRzIuYmxfY291bnRbYml0cyArIDFdICs9IDI7CS8qIG1vdmUgb25lIG92ZXJmbG93IGl0ZW0gYXMgaXRzIGJyb3RoZXIgKi8KKwkJRzIuYmxfY291bnRbbWF4X2xlbmd0aF0tLTsKKwkJLyogVGhlIGJyb3RoZXIgb2YgdGhlIG92ZXJmbG93IGl0ZW0gYWxzbyBtb3ZlcyBvbmUgc3RlcCB1cCwKKwkJICogYnV0IHRoaXMgZG9lcyBub3QgYWZmZWN0IGJsX2NvdW50W21heF9sZW5ndGhdCisJCSAqLworCQlvdmVyZmxvdyAtPSAyOworCX0gd2hpbGUgKG92ZXJmbG93ID4gMCk7CisKKwkvKiBOb3cgcmVjb21wdXRlIGFsbCBiaXQgbGVuZ3Rocywgc2Nhbm5pbmcgaW4gaW5jcmVhc2luZyBmcmVxdWVuY3kuCisJICogaCBpcyBzdGlsbCBlcXVhbCB0byBIRUFQX1NJWkUuIChJdCBpcyBzaW1wbGVyIHRvIHJlY29uc3RydWN0IGFsbAorCSAqIGxlbmd0aHMgaW5zdGVhZCBvZiBmaXhpbmcgb25seSB0aGUgd3Jvbmcgb25lcy4gVGhpcyBpZGVhIGlzIHRha2VuCisJICogZnJvbSAnYXInIHdyaXR0ZW4gYnkgSGFydWhpa28gT2t1bXVyYS4pCisJICovCisJZm9yIChiaXRzID0gbWF4X2xlbmd0aDsgYml0cyAhPSAwOyBiaXRzLS0pIHsKKwkJbiA9IEcyLmJsX2NvdW50W2JpdHNdOworCQl3aGlsZSAobiAhPSAwKSB7CisJCQltID0gRzIuaGVhcFstLWhdOworCQkJaWYgKG0gPiBtYXhfY29kZSkKKwkJCQljb250aW51ZTsKKwkJCWlmICh0cmVlW21dLkxlbiAhPSAodW5zaWduZWQpIGJpdHMpIHsKKwkJCQlUcmFjZSgoc3RkZXJyLCAiY29kZSAlZCBiaXRzICVkLT4lZFxuIiwgbSwgdHJlZVttXS5MZW4sIGJpdHMpKTsKKwkJCQlHMi5vcHRfbGVuICs9ICgoaW50MzJfdCkgYml0cyAtIHRyZWVbbV0uTGVuKSAqIHRyZWVbbV0uRnJlcTsKKwkJCQl0cmVlW21dLkxlbiA9IGJpdHM7CisJCQl9CisJCQluLS07CisJCX0KKwl9Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBHZW5lcmF0ZSB0aGUgY29kZXMgZm9yIGEgZ2l2ZW4gdHJlZSBhbmQgYml0IGNvdW50cyAod2hpY2ggbmVlZCBub3QgYmUKKyAqIG9wdGltYWwpLgorICogSU4gYXNzZXJ0aW9uOiB0aGUgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGJpdCBsZW5ndGggc3RhdGlzdGljcyBmb3IKKyAqIHRoZSBnaXZlbiB0cmVlIGFuZCB0aGUgZmllbGQgbGVuIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuCisgKiBPVVQgYXNzZXJ0aW9uOiB0aGUgZmllbGQgY29kZSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzIG9mIG5vbgorICogICAgIHplcm8gY29kZSBsZW5ndGguCisgKi8KK3N0YXRpYyB2b2lkIGdlbl9jb2RlcyhjdF9kYXRhICogdHJlZSwgaW50IG1heF9jb2RlKQoreworCXVzaCBuZXh0X2NvZGVbTUFYX0JJVFMgKyAxXTsJLyogbmV4dCBjb2RlIHZhbHVlIGZvciBlYWNoIGJpdCBsZW5ndGggKi8KKwl1c2ggY29kZSA9IDA7CQkvKiBydW5uaW5nIGNvZGUgdmFsdWUgKi8KKwlpbnQgYml0czsJCQkvKiBiaXQgaW5kZXggKi8KKwlpbnQgbjsJCQkJLyogY29kZSBpbmRleCAqLworCisJLyogVGhlIGRpc3RyaWJ1dGlvbiBjb3VudHMgYXJlIGZpcnN0IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgdmFsdWVzCisJICogd2l0aG91dCBiaXQgcmV2ZXJzYWwuCisJICovCisJZm9yIChiaXRzID0gMTsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7CisJCW5leHRfY29kZVtiaXRzXSA9IGNvZGUgPSAoY29kZSArIEcyLmJsX2NvdW50W2JpdHMgLSAxXSkgPDwgMTsKKwl9CisJLyogQ2hlY2sgdGhhdCB0aGUgYml0IGNvdW50cyBpbiBibF9jb3VudCBhcmUgY29uc2lzdGVudC4gVGhlIGxhc3QgY29kZQorCSAqIG11c3QgYmUgYWxsIG9uZXMuCisJICovCisJQXNzZXJ0KGNvZGUgKyBHMi5ibF9jb3VudFtNQVhfQklUU10gLSAxID09ICgxIDw8IE1BWF9CSVRTKSAtIDEsCisJCQkiaW5jb25zaXN0ZW50IGJpdCBjb3VudHMiKTsKKwlUcmFjZXYoKHN0ZGVyciwgIlxuZ2VuX2NvZGVzOiBtYXhfY29kZSAlZCAiLCBtYXhfY29kZSkpOworCisJZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7CisJCWludCBsZW4gPSB0cmVlW25dLkxlbjsKKworCQlpZiAobGVuID09IDApCisJCQljb250aW51ZTsKKwkJLyogTm93IHJldmVyc2UgdGhlIGJpdHMgKi8KKwkJdHJlZVtuXS5Db2RlID0gYmlfcmV2ZXJzZShuZXh0X2NvZGVbbGVuXSsrLCBsZW4pOworCisJCVRyYWNlYyh0cmVlICE9IEcyLnN0YXRpY19sdHJlZSwKKwkJCSAgIChzdGRlcnIsICJcbm4gJTNkICVjIGwgJTJkIGMgJTR4ICgleCkgIiwgbiwKKwkJCQkobiA+ICcgJyA/IG4gOiAnICcpLCBsZW4sIHRyZWVbbl0uQ29kZSwKKwkJCQluZXh0X2NvZGVbbGVuXSAtIDEpKTsKKwl9Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb25zdHJ1Y3Qgb25lIEh1ZmZtYW4gdHJlZSBhbmQgYXNzaWducyB0aGUgY29kZSBiaXQgc3RyaW5ncyBhbmQgbGVuZ3Rocy4KKyAqIFVwZGF0ZSB0aGUgdG90YWwgYml0IGxlbmd0aCBmb3IgdGhlIGN1cnJlbnQgYmxvY2suCisgKiBJTiBhc3NlcnRpb246IHRoZSBmaWVsZCBmcmVxIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuCisgKiBPVVQgYXNzZXJ0aW9uczogdGhlIGZpZWxkcyBsZW4gYW5kIGNvZGUgYXJlIHNldCB0byB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RoCisgKiAgICAgYW5kIGNvcnJlc3BvbmRpbmcgY29kZS4gVGhlIGxlbmd0aCBvcHRfbGVuIGlzIHVwZGF0ZWQ7IHN0YXRpY19sZW4gaXMKKyAqICAgICBhbHNvIHVwZGF0ZWQgaWYgc3RyZWUgaXMgbm90IG51bGwuIFRoZSBmaWVsZCBtYXhfY29kZSBpcyBzZXQuCisgKi8KKworLyogUmVtb3ZlIHRoZSBzbWFsbGVzdCBlbGVtZW50IGZyb20gdGhlIGhlYXAgYW5kIHJlY3JlYXRlIHRoZSBoZWFwIHdpdGgKKyAqIG9uZSBsZXNzIGVsZW1lbnQuIFVwZGF0ZXMgaGVhcCBhbmQgaGVhcF9sZW4uICovCisKKyNkZWZpbmUgU01BTExFU1QgMQorLyogSW5kZXggd2l0aGluIHRoZSBoZWFwIGFycmF5IG9mIGxlYXN0IGZyZXF1ZW50IG5vZGUgaW4gdGhlIEh1ZmZtYW4gdHJlZSAqLworCisjZGVmaW5lIFBRUkVNT1ZFKHRyZWUsIHRvcCkgXAorZG8geyBcCisJdG9wID0gRzIuaGVhcFtTTUFMTEVTVF07IFwKKwlHMi5oZWFwW1NNQUxMRVNUXSA9IEcyLmhlYXBbRzIuaGVhcF9sZW4tLV07IFwKKwlwcWRvd25oZWFwKHRyZWUsIFNNQUxMRVNUKTsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgYnVpbGRfdHJlZSh0cmVlX2Rlc2MgKiBkZXNjKQoreworCWN0X2RhdGEgKnRyZWUgPSBkZXNjLT5keW5fdHJlZTsKKwljdF9kYXRhICpzdHJlZSA9IGRlc2MtPnN0YXRpY190cmVlOworCWludCBlbGVtcyA9IGRlc2MtPmVsZW1zOworCWludCBuLCBtOwkJCS8qIGl0ZXJhdGUgb3ZlciBoZWFwIGVsZW1lbnRzICovCisJaW50IG1heF9jb2RlID0gLTE7CS8qIGxhcmdlc3QgY29kZSB3aXRoIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqLworCWludCBub2RlID0gZWxlbXM7CS8qIG5leHQgaW50ZXJuYWwgbm9kZSBvZiB0aGUgdHJlZSAqLworCisJLyogQ29uc3RydWN0IHRoZSBpbml0aWFsIGhlYXAsIHdpdGggbGVhc3QgZnJlcXVlbnQgZWxlbWVudCBpbgorCSAqIGhlYXBbU01BTExFU1RdLiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLgorCSAqIGhlYXBbMF0gaXMgbm90IHVzZWQuCisJICovCisJRzIuaGVhcF9sZW4gPSAwOworCUcyLmhlYXBfbWF4ID0gSEVBUF9TSVpFOworCisJZm9yIChuID0gMDsgbiA8IGVsZW1zOyBuKyspIHsKKwkJaWYgKHRyZWVbbl0uRnJlcSAhPSAwKSB7CisJCQlHMi5oZWFwWysrRzIuaGVhcF9sZW5dID0gbWF4X2NvZGUgPSBuOworCQkJRzIuZGVwdGhbbl0gPSAwOworCQl9IGVsc2UgeworCQkJdHJlZVtuXS5MZW4gPSAwOworCQl9CisJfQorCisJLyogVGhlIHBremlwIGZvcm1hdCByZXF1aXJlcyB0aGF0IGF0IGxlYXN0IG9uZSBkaXN0YW5jZSBjb2RlIGV4aXN0cywKKwkgKiBhbmQgdGhhdCBhdCBsZWFzdCBvbmUgYml0IHNob3VsZCBiZSBzZW50IGV2ZW4gaWYgdGhlcmUgaXMgb25seSBvbmUKKwkgKiBwb3NzaWJsZSBjb2RlLiBTbyB0byBhdm9pZCBzcGVjaWFsIGNoZWNrcyBsYXRlciBvbiB3ZSBmb3JjZSBhdCBsZWFzdAorCSAqIHR3byBjb2RlcyBvZiBub24gemVybyBmcmVxdWVuY3kuCisJICovCisJd2hpbGUgKEcyLmhlYXBfbGVuIDwgMikgeworCQlpbnQgbmV3ID0gRzIuaGVhcFsrK0cyLmhlYXBfbGVuXSA9IChtYXhfY29kZSA8IDIgPyArK21heF9jb2RlIDogMCk7CisKKwkJdHJlZVtuZXddLkZyZXEgPSAxOworCQlHMi5kZXB0aFtuZXddID0gMDsKKwkJRzIub3B0X2xlbi0tOworCQlpZiAoc3RyZWUpCisJCQlHMi5zdGF0aWNfbGVuIC09IHN0cmVlW25ld10uTGVuOworCQkvKiBuZXcgaXMgMCBvciAxIHNvIGl0IGRvZXMgbm90IGhhdmUgZXh0cmEgYml0cyAqLworCX0KKwlkZXNjLT5tYXhfY29kZSA9IG1heF9jb2RlOworCisJLyogVGhlIGVsZW1lbnRzIGhlYXBbaGVhcF9sZW4vMisxIC4uIGhlYXBfbGVuXSBhcmUgbGVhdmVzIG9mIHRoZSB0cmVlLAorCSAqIGVzdGFibGlzaCBzdWItaGVhcHMgb2YgaW5jcmVhc2luZyBsZW5ndGhzOgorCSAqLworCWZvciAobiA9IEcyLmhlYXBfbGVuIC8gMjsgbiA+PSAxOyBuLS0pCisJCXBxZG93bmhlYXAodHJlZSwgbik7CisKKwkvKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBieSByZXBlYXRlZGx5IGNvbWJpbmluZyB0aGUgbGVhc3QgdHdvCisJICogZnJlcXVlbnQgbm9kZXMuCisJICovCisJZG8geworCQlQUVJFTU9WRSh0cmVlLCBuKTsJLyogbiA9IG5vZGUgb2YgbGVhc3QgZnJlcXVlbmN5ICovCisJCW0gPSBHMi5oZWFwW1NNQUxMRVNUXTsJLyogbSA9IG5vZGUgb2YgbmV4dCBsZWFzdCBmcmVxdWVuY3kgKi8KKworCQlHMi5oZWFwWy0tRzIuaGVhcF9tYXhdID0gbjsJLyoga2VlcCB0aGUgbm9kZXMgc29ydGVkIGJ5IGZyZXF1ZW5jeSAqLworCQlHMi5oZWFwWy0tRzIuaGVhcF9tYXhdID0gbTsKKworCQkvKiBDcmVhdGUgYSBuZXcgbm9kZSBmYXRoZXIgb2YgbiBhbmQgbSAqLworCQl0cmVlW25vZGVdLkZyZXEgPSB0cmVlW25dLkZyZXEgKyB0cmVlW21dLkZyZXE7CisJCUcyLmRlcHRoW25vZGVdID0gTUFYKEcyLmRlcHRoW25dLCBHMi5kZXB0aFttXSkgKyAxOworCQl0cmVlW25dLkRhZCA9IHRyZWVbbV0uRGFkID0gKHVzaCkgbm9kZTsKKyNpZmRlZiBEVU1QX0JMX1RSRUUKKwkJaWYgKHRyZWUgPT0gRzIuYmxfdHJlZSkgeworCQkJYmJfZXJyb3JfbXNnKCJcbm5vZGUgJWQoJWQpLCBzb25zICVkKCVkKSAlZCglZCkiLAorCQkJCQlub2RlLCB0cmVlW25vZGVdLkZyZXEsIG4sIHRyZWVbbl0uRnJlcSwgbSwgdHJlZVttXS5GcmVxKTsKKwkJfQorI2VuZGlmCisJCS8qIGFuZCBpbnNlcnQgdGhlIG5ldyBub2RlIGluIHRoZSBoZWFwICovCisJCUcyLmhlYXBbU01BTExFU1RdID0gbm9kZSsrOworCQlwcWRvd25oZWFwKHRyZWUsIFNNQUxMRVNUKTsKKwl9IHdoaWxlIChHMi5oZWFwX2xlbiA+PSAyKTsKKworCUcyLmhlYXBbLS1HMi5oZWFwX21heF0gPSBHMi5oZWFwW1NNQUxMRVNUXTsKKworCS8qIEF0IHRoaXMgcG9pbnQsIHRoZSBmaWVsZHMgZnJlcSBhbmQgZGFkIGFyZSBzZXQuIFdlIGNhbiBub3cKKwkgKiBnZW5lcmF0ZSB0aGUgYml0IGxlbmd0aHMuCisJICovCisJZ2VuX2JpdGxlbigodHJlZV9kZXNjICopIGRlc2MpOworCisJLyogVGhlIGZpZWxkIGxlbiBpcyBub3cgc2V0LCB3ZSBjYW4gZ2VuZXJhdGUgdGhlIGJpdCBjb2RlcyAqLworCWdlbl9jb2RlcygoY3RfZGF0YSAqKSB0cmVlLCBtYXhfY29kZSk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTY2FuIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIHRvIGRldGVybWluZSB0aGUgZnJlcXVlbmNpZXMgb2YgdGhlIGNvZGVzCisgKiBpbiB0aGUgYml0IGxlbmd0aCB0cmVlLiBVcGRhdGVzIG9wdF9sZW4gdG8gdGFrZSBpbnRvIGFjY291bnQgdGhlIHJlcGVhdAorICogY291bnRzLiAoVGhlIGNvbnRyaWJ1dGlvbiBvZiB0aGUgYml0IGxlbmd0aCBjb2RlcyB3aWxsIGJlIGFkZGVkIGxhdGVyCisgKiBkdXJpbmcgdGhlIGNvbnN0cnVjdGlvbiBvZiBibF90cmVlLikKKyAqLworc3RhdGljIHZvaWQgc2Nhbl90cmVlKGN0X2RhdGEgKiB0cmVlLCBpbnQgbWF4X2NvZGUpCit7CisJaW50IG47CQkJCS8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi8KKwlpbnQgcHJldmxlbiA9IC0xOwkvKiBsYXN0IGVtaXR0ZWQgbGVuZ3RoICovCisJaW50IGN1cmxlbjsJCQkvKiBsZW5ndGggb2YgY3VycmVudCBjb2RlICovCisJaW50IG5leHRsZW4gPSB0cmVlWzBdLkxlbjsJLyogbGVuZ3RoIG9mIG5leHQgY29kZSAqLworCWludCBjb3VudCA9IDA7CQkvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqLworCWludCBtYXhfY291bnQgPSA3OwkvKiBtYXggcmVwZWF0IGNvdW50ICovCisJaW50IG1pbl9jb3VudCA9IDQ7CS8qIG1pbiByZXBlYXQgY291bnQgKi8KKworCWlmIChuZXh0bGVuID09IDApIHsKKwkJbWF4X2NvdW50ID0gMTM4OworCQltaW5fY291bnQgPSAzOworCX0KKwl0cmVlW21heF9jb2RlICsgMV0uTGVuID0gMHhmZmZmOyAvKiBndWFyZCAqLworCisJZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7CisJCWN1cmxlbiA9IG5leHRsZW47CisJCW5leHRsZW4gPSB0cmVlW24gKyAxXS5MZW47CisJCWlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PSBuZXh0bGVuKQorCQkJY29udGludWU7CisKKwkJaWYgKGNvdW50IDwgbWluX2NvdW50KSB7CisJCQlHMi5ibF90cmVlW2N1cmxlbl0uRnJlcSArPSBjb3VudDsKKwkJfSBlbHNlIGlmIChjdXJsZW4gIT0gMCkgeworCQkJaWYgKGN1cmxlbiAhPSBwcmV2bGVuKQorCQkJCUcyLmJsX3RyZWVbY3VybGVuXS5GcmVxKys7CisJCQlHMi5ibF90cmVlW1JFUF8zXzZdLkZyZXErKzsKKwkJfSBlbHNlIGlmIChjb3VudCA8PSAxMCkgeworCQkJRzIuYmxfdHJlZVtSRVBaXzNfMTBdLkZyZXErKzsKKwkJfSBlbHNlIHsKKwkJCUcyLmJsX3RyZWVbUkVQWl8xMV8xMzhdLkZyZXErKzsKKwkJfQorCQljb3VudCA9IDA7CisJCXByZXZsZW4gPSBjdXJsZW47CisKKwkJbWF4X2NvdW50ID0gNzsKKwkJbWluX2NvdW50ID0gNDsKKwkJaWYgKG5leHRsZW4gPT0gMCkgeworCQkJbWF4X2NvdW50ID0gMTM4OworCQkJbWluX2NvdW50ID0gMzsKKwkJfSBlbHNlIGlmIChjdXJsZW4gPT0gbmV4dGxlbikgeworCQkJbWF4X2NvdW50ID0gNjsKKwkJCW1pbl9jb3VudCA9IDM7CisJCX0KKwl9Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTZW5kIGEgbGl0ZXJhbCBvciBkaXN0YW5jZSB0cmVlIGluIGNvbXByZXNzZWQgZm9ybSwgdXNpbmcgdGhlIGNvZGVzIGluCisgKiBibF90cmVlLgorICovCitzdGF0aWMgdm9pZCBzZW5kX3RyZWUoY3RfZGF0YSAqIHRyZWUsIGludCBtYXhfY29kZSkKK3sKKwlpbnQgbjsJCQkJLyogaXRlcmF0ZXMgb3ZlciBhbGwgdHJlZSBlbGVtZW50cyAqLworCWludCBwcmV2bGVuID0gLTE7CS8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi8KKwlpbnQgY3VybGVuOwkJCS8qIGxlbmd0aCBvZiBjdXJyZW50IGNvZGUgKi8KKwlpbnQgbmV4dGxlbiA9IHRyZWVbMF0uTGVuOwkvKiBsZW5ndGggb2YgbmV4dCBjb2RlICovCisJaW50IGNvdW50ID0gMDsJCS8qIHJlcGVhdCBjb3VudCBvZiB0aGUgY3VycmVudCBjb2RlICovCisJaW50IG1heF9jb3VudCA9IDc7CS8qIG1heCByZXBlYXQgY291bnQgKi8KKwlpbnQgbWluX2NvdW50ID0gNDsJLyogbWluIHJlcGVhdCBjb3VudCAqLworCisvKiB0cmVlW21heF9jb2RlKzFdLkxlbiA9IC0xOyAqLy8qIGd1YXJkIGFscmVhZHkgc2V0ICovCisJaWYgKG5leHRsZW4gPT0gMCkKKwkJbWF4X2NvdW50ID0gMTM4LCBtaW5fY291bnQgPSAzOworCisJZm9yIChuID0gMDsgbiA8PSBtYXhfY29kZTsgbisrKSB7CisJCWN1cmxlbiA9IG5leHRsZW47CisJCW5leHRsZW4gPSB0cmVlW24gKyAxXS5MZW47CisJCWlmICgrK2NvdW50IDwgbWF4X2NvdW50ICYmIGN1cmxlbiA9PSBuZXh0bGVuKSB7CisJCQljb250aW51ZTsKKwkJfSBlbHNlIGlmIChjb3VudCA8IG1pbl9jb3VudCkgeworCQkJZG8geworCQkJCVNFTkRfQ09ERShjdXJsZW4sIEcyLmJsX3RyZWUpOworCQkJfSB3aGlsZSAoLS1jb3VudCk7CisJCX0gZWxzZSBpZiAoY3VybGVuICE9IDApIHsKKwkJCWlmIChjdXJsZW4gIT0gcHJldmxlbikgeworCQkJCVNFTkRfQ09ERShjdXJsZW4sIEcyLmJsX3RyZWUpOworCQkJCWNvdW50LS07CisJCQl9CisJCQlBc3NlcnQoY291bnQgPj0gMyAmJiBjb3VudCA8PSA2LCAiIDNfNj8iKTsKKwkJCVNFTkRfQ09ERShSRVBfM182LCBHMi5ibF90cmVlKTsKKwkJCXNlbmRfYml0cyhjb3VudCAtIDMsIDIpOworCQl9IGVsc2UgaWYgKGNvdW50IDw9IDEwKSB7CisJCQlTRU5EX0NPREUoUkVQWl8zXzEwLCBHMi5ibF90cmVlKTsKKwkJCXNlbmRfYml0cyhjb3VudCAtIDMsIDMpOworCQl9IGVsc2UgeworCQkJU0VORF9DT0RFKFJFUFpfMTFfMTM4LCBHMi5ibF90cmVlKTsKKwkJCXNlbmRfYml0cyhjb3VudCAtIDExLCA3KTsKKwkJfQorCQljb3VudCA9IDA7CisJCXByZXZsZW4gPSBjdXJsZW47CisJCWlmIChuZXh0bGVuID09IDApIHsKKwkJCW1heF9jb3VudCA9IDEzODsKKwkJCW1pbl9jb3VudCA9IDM7CisJCX0gZWxzZSBpZiAoY3VybGVuID09IG5leHRsZW4pIHsKKwkJCW1heF9jb3VudCA9IDY7CisJCQltaW5fY291bnQgPSAzOworCQl9IGVsc2UgeworCQkJbWF4X2NvdW50ID0gNzsKKwkJCW1pbl9jb3VudCA9IDQ7CisJCX0KKwl9Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBmb3IgdGhlIGJpdCBsZW5ndGhzIGFuZCByZXR1cm4gdGhlIGluZGV4IGluCisgKiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC4KKyAqLworc3RhdGljIGludCBidWlsZF9ibF90cmVlKHZvaWQpCit7CisJaW50IG1heF9ibGluZGV4OwkvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovCisKKwkvKiBEZXRlcm1pbmUgdGhlIGJpdCBsZW5ndGggZnJlcXVlbmNpZXMgZm9yIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovCisJc2Nhbl90cmVlKEcyLmR5bl9sdHJlZSwgRzIubF9kZXNjLm1heF9jb2RlKTsKKwlzY2FuX3RyZWUoRzIuZHluX2R0cmVlLCBHMi5kX2Rlc2MubWF4X2NvZGUpOworCisJLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZTogKi8KKwlidWlsZF90cmVlKCZHMi5ibF9kZXNjKTsKKwkvKiBvcHRfbGVuIG5vdyBpbmNsdWRlcyB0aGUgbGVuZ3RoIG9mIHRoZSB0cmVlIHJlcHJlc2VudGF0aW9ucywgZXhjZXB0CisJICogdGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGhzIGNvZGVzIGFuZCB0aGUgNSs1KzQgYml0cyBmb3IgdGhlIGNvdW50cy4KKwkgKi8KKworCS8qIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGJpdCBsZW5ndGggY29kZXMgdG8gc2VuZC4gVGhlIHBremlwIGZvcm1hdAorCSAqIHJlcXVpcmVzIHRoYXQgYXQgbGVhc3QgNCBiaXQgbGVuZ3RoIGNvZGVzIGJlIHNlbnQuIChhcHBub3RlLnR4dCBzYXlzCisJICogMyBidXQgdGhlIGFjdHVhbCB2YWx1ZSB1c2VkIGlzIDQuKQorCSAqLworCWZvciAobWF4X2JsaW5kZXggPSBCTF9DT0RFUyAtIDE7IG1heF9ibGluZGV4ID49IDM7IG1heF9ibGluZGV4LS0pIHsKKwkJaWYgKEcyLmJsX3RyZWVbYmxfb3JkZXJbbWF4X2JsaW5kZXhdXS5MZW4gIT0gMCkKKwkJCWJyZWFrOworCX0KKwkvKiBVcGRhdGUgb3B0X2xlbiB0byBpbmNsdWRlIHRoZSBiaXQgbGVuZ3RoIHRyZWUgYW5kIGNvdW50cyAqLworCUcyLm9wdF9sZW4gKz0gMyAqIChtYXhfYmxpbmRleCArIDEpICsgNSArIDUgKyA0OworCVRyYWNldigoc3RkZXJyLCAiXG5keW4gdHJlZXM6IGR5biAlbGQsIHN0YXQgJWxkIiwgRzIub3B0X2xlbiwgRzIuc3RhdGljX2xlbikpOworCisJcmV0dXJuIG1heF9ibGluZGV4OworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCB0aGUgaGVhZGVyIGZvciBhIGJsb2NrIHVzaW5nIGR5bmFtaWMgSHVmZm1hbiB0cmVlczogdGhlIGNvdW50cywgdGhlCisgKiBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzLCB0aGUgbGl0ZXJhbCB0cmVlIGFuZCB0aGUgZGlzdGFuY2UgdHJlZS4KKyAqIElOIGFzc2VydGlvbjogbGNvZGVzID49IDI1NywgZGNvZGVzID49IDEsIGJsY29kZXMgPj0gNC4KKyAqLworc3RhdGljIHZvaWQgc2VuZF9hbGxfdHJlZXMoaW50IGxjb2RlcywgaW50IGRjb2RlcywgaW50IGJsY29kZXMpCit7CisJaW50IHJhbms7CQkJLyogaW5kZXggaW4gYmxfb3JkZXIgKi8KKworCUFzc2VydChsY29kZXMgPj0gMjU3ICYmIGRjb2RlcyA+PSAxICYmIGJsY29kZXMgPj0gNCwgIm5vdCBlbm91Z2ggY29kZXMiKTsKKwlBc3NlcnQobGNvZGVzIDw9IExfQ09ERVMgJiYgZGNvZGVzIDw9IERfQ09ERVMKKwkJICAgJiYgYmxjb2RlcyA8PSBCTF9DT0RFUywgInRvbyBtYW55IGNvZGVzIik7CisJVHJhY2V2KChzdGRlcnIsICJcbmJsIGNvdW50czogIikpOworCXNlbmRfYml0cyhsY29kZXMgLSAyNTcsIDUpOwkvKiBub3QgKzI1NSBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi8KKwlzZW5kX2JpdHMoZGNvZGVzIC0gMSwgNSk7CisJc2VuZF9iaXRzKGJsY29kZXMgLSA0LCA0KTsJLyogbm90IC0zIGFzIHN0YXRlZCBpbiBhcHBub3RlLnR4dCAqLworCWZvciAocmFuayA9IDA7IHJhbmsgPCBibGNvZGVzOyByYW5rKyspIHsKKwkJVHJhY2V2KChzdGRlcnIsICJcbmJsIGNvZGUgJTJkICIsIGJsX29yZGVyW3JhbmtdKSk7CisJCXNlbmRfYml0cyhHMi5ibF90cmVlW2JsX29yZGVyW3JhbmtdXS5MZW4sIDMpOworCX0KKwlUcmFjZXYoKHN0ZGVyciwgIlxuYmwgdHJlZTogc2VudCAlbGQiLCBHMS5iaXRzX3NlbnQpKTsKKworCXNlbmRfdHJlZSgoY3RfZGF0YSAqKSBHMi5keW5fbHRyZWUsIGxjb2RlcyAtIDEpOwkvKiBzZW5kIHRoZSBsaXRlcmFsIHRyZWUgKi8KKwlUcmFjZXYoKHN0ZGVyciwgIlxubGl0IHRyZWU6IHNlbnQgJWxkIiwgRzEuYml0c19zZW50KSk7CisKKwlzZW5kX3RyZWUoKGN0X2RhdGEgKikgRzIuZHluX2R0cmVlLCBkY29kZXMgLSAxKTsJLyogc2VuZCB0aGUgZGlzdGFuY2UgdHJlZSAqLworCVRyYWNldigoc3RkZXJyLCAiXG5kaXN0IHRyZWU6IHNlbnQgJWxkIiwgRzEuYml0c19zZW50KSk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBTYXZlIHRoZSBtYXRjaCBpbmZvIGFuZCB0YWxseSB0aGUgZnJlcXVlbmN5IGNvdW50cy4gUmV0dXJuIHRydWUgaWYKKyAqIHRoZSBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZC4KKyAqLworc3RhdGljIGludCBjdF90YWxseShpbnQgZGlzdCwgaW50IGxjKQoreworCUcxLmxfYnVmW0cyLmxhc3RfbGl0KytdID0gbGM7CisJaWYgKGRpc3QgPT0gMCkgeworCQkvKiBsYyBpcyB0aGUgdW5tYXRjaGVkIGNoYXIgKi8KKwkJRzIuZHluX2x0cmVlW2xjXS5GcmVxKys7CisJfSBlbHNlIHsKKwkJLyogSGVyZSwgbGMgaXMgdGhlIG1hdGNoIGxlbmd0aCAtIE1JTl9NQVRDSCAqLworCQlkaXN0LS07CQkJLyogZGlzdCA9IG1hdGNoIGRpc3RhbmNlIC0gMSAqLworCQlBc3NlcnQoKHVzaCkgZGlzdCA8ICh1c2gpIE1BWF9ESVNUCisJCSAmJiAodXNoKSBsYyA8PSAodXNoKSAoTUFYX01BVENIIC0gTUlOX01BVENIKQorCQkgJiYgKHVzaCkgRF9DT0RFKGRpc3QpIDwgKHVzaCkgRF9DT0RFUywgImN0X3RhbGx5OiBiYWQgbWF0Y2giCisJCSk7CisKKwkJRzIuZHluX2x0cmVlW0cyLmxlbmd0aF9jb2RlW2xjXSArIExJVEVSQUxTICsgMV0uRnJlcSsrOworCQlHMi5keW5fZHRyZWVbRF9DT0RFKGRpc3QpXS5GcmVxKys7CisKKwkJRzEuZF9idWZbRzIubGFzdF9kaXN0KytdID0gZGlzdDsKKwkJRzIuZmxhZ3MgfD0gRzIuZmxhZ19iaXQ7CisJfQorCUcyLmZsYWdfYml0IDw8PSAxOworCisJLyogT3V0cHV0IHRoZSBmbGFncyBpZiB0aGV5IGZpbGwgYSBieXRlOiAqLworCWlmICgoRzIubGFzdF9saXQgJiA3KSA9PSAwKSB7CisJCUcyLmZsYWdfYnVmW0cyLmxhc3RfZmxhZ3MrK10gPSBHMi5mbGFnczsKKwkJRzIuZmxhZ3MgPSAwOworCQlHMi5mbGFnX2JpdCA9IDE7CisJfQorCS8qIFRyeSB0byBndWVzcyBpZiBpdCBpcyBwcm9maXRhYmxlIHRvIHN0b3AgdGhlIGN1cnJlbnQgYmxvY2sgaGVyZSAqLworCWlmICgoRzIubGFzdF9saXQgJiAweGZmZikgPT0gMCkgeworCQkvKiBDb21wdXRlIGFuIHVwcGVyIGJvdW5kIGZvciB0aGUgY29tcHJlc3NlZCBsZW5ndGggKi8KKwkJdWxnIG91dF9sZW5ndGggPSBHMi5sYXN0X2xpdCAqIDhMOworCQl1bGcgaW5fbGVuZ3RoID0gKHVsZykgRzEuc3Ryc3RhcnQgLSBHMS5ibG9ja19zdGFydDsKKwkJaW50IGRjb2RlOworCisJCWZvciAoZGNvZGUgPSAwOyBkY29kZSA8IERfQ09ERVM7IGRjb2RlKyspIHsKKwkJCW91dF9sZW5ndGggKz0gRzIuZHluX2R0cmVlW2Rjb2RlXS5GcmVxICogKDVMICsgZXh0cmFfZGJpdHNbZGNvZGVdKTsKKwkJfQorCQlvdXRfbGVuZ3RoID4+PSAzOworCQlUcmFjZSgoc3RkZXJyLAorCQkJCSJcbmxhc3RfbGl0ICV1LCBsYXN0X2Rpc3QgJXUsIGluICVsZCwgb3V0IH4lbGQoJWxkJSUpICIsCisJCQkJRzIubGFzdF9saXQsIEcyLmxhc3RfZGlzdCwgaW5fbGVuZ3RoLCBvdXRfbGVuZ3RoLAorCQkJCTEwMEwgLSBvdXRfbGVuZ3RoICogMTAwTCAvIGluX2xlbmd0aCkpOworCQlpZiAoRzIubGFzdF9kaXN0IDwgRzIubGFzdF9saXQgLyAyICYmIG91dF9sZW5ndGggPCBpbl9sZW5ndGggLyAyKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAoRzIubGFzdF9saXQgPT0gTElUX0JVRlNJWkUgLSAxIHx8IEcyLmxhc3RfZGlzdCA9PSBESVNUX0JVRlNJWkUpOworCS8qIFdlIGF2b2lkIGVxdWFsaXR5IHdpdGggTElUX0JVRlNJWkUgYmVjYXVzZSBvZiB3cmFwYXJvdW5kIGF0IDY0SworCSAqIG9uIDE2IGJpdCBtYWNoaW5lcyBhbmQgYmVjYXVzZSBzdG9yZWQgYmxvY2tzIGFyZSByZXN0cmljdGVkIHRvCisJICogNjRLLTEgYnl0ZXMuCisJICovCit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2VuZCB0aGUgYmxvY2sgZGF0YSBjb21wcmVzc2VkIHVzaW5nIHRoZSBnaXZlbiBIdWZmbWFuIHRyZWVzCisgKi8KK3N0YXRpYyB2b2lkIGNvbXByZXNzX2Jsb2NrKGN0X2RhdGEgKiBsdHJlZSwgY3RfZGF0YSAqIGR0cmVlKQoreworCXVuc2lnbmVkIGRpc3Q7ICAgICAgICAgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovCisJaW50IGxjOyAgICAgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0ID09IDApICovCisJdW5zaWduZWQgbHggPSAwOyAgICAgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqLworCXVuc2lnbmVkIGR4ID0gMDsgICAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gZF9idWYgKi8KKwl1bnNpZ25lZCBmeCA9IDA7ICAgICAgICAvKiBydW5uaW5nIGluZGV4IGluIGZsYWdfYnVmICovCisJdWNoIGZsYWcgPSAwOyAgICAgICAgICAgLyogY3VycmVudCBmbGFncyAqLworCXVuc2lnbmVkIGNvZGU7ICAgICAgICAgIC8qIHRoZSBjb2RlIHRvIHNlbmQgKi8KKwlpbnQgZXh0cmE7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBzZW5kICovCisKKwlpZiAoRzIubGFzdF9saXQgIT0gMCkgZG8geworCQlpZiAoKGx4ICYgNykgPT0gMCkKKwkJCWZsYWcgPSBHMi5mbGFnX2J1ZltmeCsrXTsKKwkJbGMgPSBHMS5sX2J1ZltseCsrXTsKKwkJaWYgKChmbGFnICYgMSkgPT0gMCkgeworCQkJU0VORF9DT0RFKGxjLCBsdHJlZSk7CS8qIHNlbmQgYSBsaXRlcmFsIGJ5dGUgKi8KKwkJCVRyYWNlY3YobGMgPiAnICcsIChzdGRlcnIsICIgJyVjJyAiLCBsYykpOworCQl9IGVsc2UgeworCQkJLyogSGVyZSwgbGMgaXMgdGhlIG1hdGNoIGxlbmd0aCAtIE1JTl9NQVRDSCAqLworCQkJY29kZSA9IEcyLmxlbmd0aF9jb2RlW2xjXTsKKwkJCVNFTkRfQ09ERShjb2RlICsgTElURVJBTFMgKyAxLCBsdHJlZSk7CS8qIHNlbmQgdGhlIGxlbmd0aCBjb2RlICovCisJCQlleHRyYSA9IGV4dHJhX2xiaXRzW2NvZGVdOworCQkJaWYgKGV4dHJhICE9IDApIHsKKwkJCQlsYyAtPSBHMi5iYXNlX2xlbmd0aFtjb2RlXTsKKwkJCQlzZW5kX2JpdHMobGMsIGV4dHJhKTsJLyogc2VuZCB0aGUgZXh0cmEgbGVuZ3RoIGJpdHMgKi8KKwkJCX0KKwkJCWRpc3QgPSBHMS5kX2J1ZltkeCsrXTsKKwkJCS8qIEhlcmUsIGRpc3QgaXMgdGhlIG1hdGNoIGRpc3RhbmNlIC0gMSAqLworCQkJY29kZSA9IERfQ09ERShkaXN0KTsKKwkJCUFzc2VydChjb2RlIDwgRF9DT0RFUywgImJhZCBkX2NvZGUiKTsKKworCQkJU0VORF9DT0RFKGNvZGUsIGR0cmVlKTsJLyogc2VuZCB0aGUgZGlzdGFuY2UgY29kZSAqLworCQkJZXh0cmEgPSBleHRyYV9kYml0c1tjb2RlXTsKKwkJCWlmIChleHRyYSAhPSAwKSB7CisJCQkJZGlzdCAtPSBHMi5iYXNlX2Rpc3RbY29kZV07CisJCQkJc2VuZF9iaXRzKGRpc3QsIGV4dHJhKTsJLyogc2VuZCB0aGUgZXh0cmEgZGlzdGFuY2UgYml0cyAqLworCQkJfQorCQl9CQkJLyogbGl0ZXJhbCBvciBtYXRjaCBwYWlyID8gKi8KKwkJZmxhZyA+Pj0gMTsKKwl9IHdoaWxlIChseCA8IEcyLmxhc3RfbGl0KTsKKworCVNFTkRfQ09ERShFTkRfQkxPQ0ssIGx0cmVlKTsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZyBmb3IgdGhlIGN1cnJlbnQgYmxvY2s6IGR5bmFtaWMgdHJlZXMsIHN0YXRpYworICogdHJlZXMgb3Igc3RvcmUsIGFuZCBvdXRwdXQgdGhlIGVuY29kZWQgYmxvY2sgdG8gdGhlIHppcCBmaWxlLiBUaGlzIGZ1bmN0aW9uCisgKiByZXR1cm5zIHRoZSB0b3RhbCBjb21wcmVzc2VkIGxlbmd0aCBmb3IgdGhlIGZpbGUgc28gZmFyLgorICovCitzdGF0aWMgdWxnIGZsdXNoX2Jsb2NrKGNoYXIgKmJ1ZiwgdWxnIHN0b3JlZF9sZW4sIGludCBlb2YpCit7CisJdWxnIG9wdF9sZW5iLCBzdGF0aWNfbGVuYjsgICAgICAvKiBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGluIGJ5dGVzICovCisJaW50IG1heF9ibGluZGV4OyAgICAgICAgICAgICAgICAvKiBpbmRleCBvZiBsYXN0IGJpdCBsZW5ndGggY29kZSBvZiBub24gemVybyBmcmVxICovCisKKwlHMi5mbGFnX2J1ZltHMi5sYXN0X2ZsYWdzXSA9IEcyLmZsYWdzOyAgIC8qIFNhdmUgdGhlIGZsYWdzIGZvciB0aGUgbGFzdCA4IGl0ZW1zICovCisKKwkvKiBDb25zdHJ1Y3QgdGhlIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovCisJYnVpbGRfdHJlZSgmRzIubF9kZXNjKTsKKwlUcmFjZXYoKHN0ZGVyciwgIlxubGl0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkIiwgRzIub3B0X2xlbiwgRzIuc3RhdGljX2xlbikpOworCisJYnVpbGRfdHJlZSgmRzIuZF9kZXNjKTsKKwlUcmFjZXYoKHN0ZGVyciwgIlxuZGlzdCBkYXRhOiBkeW4gJWxkLCBzdGF0ICVsZCIsIEcyLm9wdF9sZW4sIEcyLnN0YXRpY19sZW4pKTsKKwkvKiBBdCB0aGlzIHBvaW50LCBvcHRfbGVuIGFuZCBzdGF0aWNfbGVuIGFyZSB0aGUgdG90YWwgYml0IGxlbmd0aHMgb2YKKwkgKiB0aGUgY29tcHJlc3NlZCBibG9jayBkYXRhLCBleGNsdWRpbmcgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLgorCSAqLworCisJLyogQnVpbGQgdGhlIGJpdCBsZW5ndGggdHJlZSBmb3IgdGhlIGFib3ZlIHR3byB0cmVlcywgYW5kIGdldCB0aGUgaW5kZXgKKwkgKiBpbiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC4KKwkgKi8KKwltYXhfYmxpbmRleCA9IGJ1aWxkX2JsX3RyZWUoKTsKKworCS8qIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZy4gQ29tcHV0ZSBmaXJzdCB0aGUgYmxvY2sgbGVuZ3RoIGluIGJ5dGVzICovCisJb3B0X2xlbmIgPSAoRzIub3B0X2xlbiArIDMgKyA3KSA+PiAzOworCXN0YXRpY19sZW5iID0gKEcyLnN0YXRpY19sZW4gKyAzICsgNykgPj4gMzsKKworCVRyYWNlKChzdGRlcnIsCisJCQkiXG5vcHQgJWx1KCVsdSkgc3RhdCAlbHUoJWx1KSBzdG9yZWQgJWx1IGxpdCAldSBkaXN0ICV1ICIsCisJCQlvcHRfbGVuYiwgRzIub3B0X2xlbiwgc3RhdGljX2xlbmIsIEcyLnN0YXRpY19sZW4sIHN0b3JlZF9sZW4sCisJCQlHMi5sYXN0X2xpdCwgRzIubGFzdF9kaXN0KSk7CisKKwlpZiAoc3RhdGljX2xlbmIgPD0gb3B0X2xlbmIpCisJCW9wdF9sZW5iID0gc3RhdGljX2xlbmI7CisKKwkvKiBJZiBjb21wcmVzc2lvbiBmYWlsZWQgYW5kIHRoaXMgaXMgdGhlIGZpcnN0IGFuZCBsYXN0IGJsb2NrLAorCSAqIGFuZCBpZiB0aGUgemlwIGZpbGUgY2FuIGJlIHNlZWtlZCAodG8gcmV3cml0ZSB0aGUgbG9jYWwgaGVhZGVyKSwKKwkgKiB0aGUgd2hvbGUgZmlsZSBpcyB0cmFuc2Zvcm1lZCBpbnRvIGEgc3RvcmVkIGZpbGU6CisJICovCisJaWYgKHN0b3JlZF9sZW4gPD0gb3B0X2xlbmIgJiYgZW9mICYmIEcyLmNvbXByZXNzZWRfbGVuID09IDBMICYmIHNlZWthYmxlKCkpIHsKKwkJLyogU2luY2UgTElUX0JVRlNJWkUgPD0gMipXU0laRSwgdGhlIGlucHV0IGRhdGEgbXVzdCBiZSB0aGVyZTogKi8KKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJYmJfZXJyb3JfbXNnKCJibG9jayB2YW5pc2hlZCIpOworCisJCWNvcHlfYmxvY2soYnVmLCAodW5zaWduZWQpIHN0b3JlZF9sZW4sIDApOwkvKiB3aXRob3V0IGhlYWRlciAqLworCQlHMi5jb21wcmVzc2VkX2xlbiA9IHN0b3JlZF9sZW4gPDwgMzsKKwl9IGVsc2UgaWYgKHN0b3JlZF9sZW4gKyA0IDw9IG9wdF9sZW5iICYmIGJ1ZiAhPSBOVUxMKSB7CisJCS8qIDQ6IHR3byB3b3JkcyBmb3IgdGhlIGxlbmd0aHMgKi8KKwkJLyogVGhlIHRlc3QgYnVmICE9IE5VTEwgaXMgb25seSBuZWNlc3NhcnkgaWYgTElUX0JVRlNJWkUgPiBXU0laRS4KKwkJICogT3RoZXJ3aXNlIHdlIGNhbid0IGhhdmUgcHJvY2Vzc2VkIG1vcmUgdGhhbiBXU0laRSBpbnB1dCBieXRlcyBzaW5jZQorCQkgKiB0aGUgbGFzdCBibG9jayBmbHVzaCwgYmVjYXVzZSBjb21wcmVzc2lvbiB3b3VsZCBoYXZlIGJlZW4KKwkJICogc3VjY2Vzc2Z1bC4gSWYgTElUX0JVRlNJWkUgPD0gV1NJWkUsIGl0IGlzIG5ldmVyIHRvbyBsYXRlIHRvCisJCSAqIHRyYW5zZm9ybSBhIGJsb2NrIGludG8gYSBzdG9yZWQgYmxvY2suCisJCSAqLworCQlzZW5kX2JpdHMoKFNUT1JFRF9CTE9DSyA8PCAxKSArIGVvZiwgMyk7CS8qIHNlbmQgYmxvY2sgdHlwZSAqLworCQlHMi5jb21wcmVzc2VkX2xlbiA9IChHMi5jb21wcmVzc2VkX2xlbiArIDMgKyA3KSAmIH43TDsKKwkJRzIuY29tcHJlc3NlZF9sZW4gKz0gKHN0b3JlZF9sZW4gKyA0KSA8PCAzOworCisJCWNvcHlfYmxvY2soYnVmLCAodW5zaWduZWQpIHN0b3JlZF9sZW4sIDEpOwkvKiB3aXRoIGhlYWRlciAqLworCX0gZWxzZSBpZiAoc3RhdGljX2xlbmIgPT0gb3B0X2xlbmIpIHsKKwkJc2VuZF9iaXRzKChTVEFUSUNfVFJFRVMgPDwgMSkgKyBlb2YsIDMpOworCQljb21wcmVzc19ibG9jaygoY3RfZGF0YSAqKSBHMi5zdGF0aWNfbHRyZWUsIChjdF9kYXRhICopIEcyLnN0YXRpY19kdHJlZSk7CisJCUcyLmNvbXByZXNzZWRfbGVuICs9IDMgKyBHMi5zdGF0aWNfbGVuOworCX0gZWxzZSB7CisJCXNlbmRfYml0cygoRFlOX1RSRUVTIDw8IDEpICsgZW9mLCAzKTsKKwkJc2VuZF9hbGxfdHJlZXMoRzIubF9kZXNjLm1heF9jb2RlICsgMSwgRzIuZF9kZXNjLm1heF9jb2RlICsgMSwKKwkJCQkJbWF4X2JsaW5kZXggKyAxKTsKKwkJY29tcHJlc3NfYmxvY2soKGN0X2RhdGEgKikgRzIuZHluX2x0cmVlLCAoY3RfZGF0YSAqKSBHMi5keW5fZHRyZWUpOworCQlHMi5jb21wcmVzc2VkX2xlbiArPSAzICsgRzIub3B0X2xlbjsKKwl9CisJQXNzZXJ0KEcyLmNvbXByZXNzZWRfbGVuID09IEcxLmJpdHNfc2VudCwgImJhZCBjb21wcmVzc2VkIHNpemUiKTsKKwlpbml0X2Jsb2NrKCk7CisKKwlpZiAoZW9mKSB7CisJCWJpX3dpbmR1cCgpOworCQlHMi5jb21wcmVzc2VkX2xlbiArPSA3OwkvKiBhbGlnbiBvbiBieXRlIGJvdW5kYXJ5ICovCisJfQorCVRyYWNldigoc3RkZXJyLCAiXG5jb21wcmxlbiAlbHUoJWx1KSAiLCBHMi5jb21wcmVzc2VkX2xlbiA+PiAzLAorCQkJRzIuY29tcHJlc3NlZF9sZW4gLSA3ICogZW9mKSk7CisKKwlyZXR1cm4gRzIuY29tcHJlc3NlZF9sZW4gPj4gMzsKK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIFVwZGF0ZSBhIGhhc2ggdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gaW5wdXQgYnl0ZQorICogSU4gIGFzc2VydGlvbjogYWxsIGNhbGxzIHRvIFVQREFURV9IQVNIIGFyZSBtYWRlIHdpdGggY29uc2VjdXRpdmUKKyAqICAgIGlucHV0IGNoYXJhY3RlcnMsIHNvIHRoYXQgYSBydW5uaW5nIGhhc2gga2V5IGNhbiBiZSBjb21wdXRlZCBmcm9tIHRoZQorICogICAgcHJldmlvdXMga2V5IGluc3RlYWQgb2YgY29tcGxldGUgcmVjYWxjdWxhdGlvbiBlYWNoIHRpbWUuCisgKi8KKyNkZWZpbmUgVVBEQVRFX0hBU0goaCwgYykgKGggPSAoKChoKTw8SF9TSElGVCkgXiAoYykpICYgSEFTSF9NQVNLKQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogU2FtZSBhcyBhYm92ZSwgYnV0IGFjaGlldmVzIGJldHRlciBjb21wcmVzc2lvbi4gV2UgdXNlIGEgbGF6eQorICogZXZhbHVhdGlvbiBmb3IgbWF0Y2hlczogYSBtYXRjaCBpcyBmaW5hbGx5IGFkb3B0ZWQgb25seSBpZiB0aGVyZSBpcworICogbm8gYmV0dGVyIG1hdGNoIGF0IHRoZSBuZXh0IHdpbmRvdyBwb3NpdGlvbi4KKyAqCisgKiBQcm9jZXNzZXMgYSBuZXcgaW5wdXQgZmlsZSBhbmQgcmV0dXJuIGl0cyBjb21wcmVzc2VkIGxlbmd0aC4gU2V0cworICogdGhlIGNvbXByZXNzZWQgbGVuZ3RoLCBjcmMsIGRlZmxhdGUgZmxhZ3MgYW5kIGludGVybmFsIGZpbGUKKyAqIGF0dHJpYnV0ZXMuCisgKi8KKworLyogRmx1c2ggdGhlIGN1cnJlbnQgYmxvY2ssIHdpdGggZ2l2ZW4gZW5kLW9mLWZpbGUgZmxhZy4KKyAqIElOIGFzc2VydGlvbjogc3Ryc3RhcnQgaXMgc2V0IHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbWF0Y2guICovCisjZGVmaW5lIEZMVVNIX0JMT0NLKGVvZikgXAorCWZsdXNoX2Jsb2NrKCBcCisJCUcxLmJsb2NrX3N0YXJ0ID49IDBMIFwKKwkJCT8gKGNoYXIqKSZHMS53aW5kb3dbKHVuc2lnbmVkKUcxLmJsb2NrX3N0YXJ0XSBcCisJCQk6IChjaGFyKilOVUxMLCBcCisJCSh1bGcpRzEuc3Ryc3RhcnQgLSBHMS5ibG9ja19zdGFydCwgXAorCQkoZW9mKSBcCisJKQorCisvKiBJbnNlcnQgc3RyaW5nIHMgaW4gdGhlIGRpY3Rpb25hcnkgYW5kIHNldCBtYXRjaF9oZWFkIHRvIHRoZSBwcmV2aW91cyBoZWFkCisgKiBvZiB0aGUgaGFzaCBjaGFpbiAodGhlIG1vc3QgcmVjZW50IHN0cmluZyB3aXRoIHNhbWUgaGFzaCBrZXkpLiBSZXR1cm4KKyAqIHRoZSBwcmV2aW91cyBsZW5ndGggb2YgdGhlIGhhc2ggY2hhaW4uCisgKiBJTiAgYXNzZXJ0aW9uOiBhbGwgY2FsbHMgdG8gSU5TRVJUX1NUUklORyBhcmUgbWFkZSB3aXRoIGNvbnNlY3V0aXZlCisgKiAgICBpbnB1dCBjaGFyYWN0ZXJzIGFuZCB0aGUgZmlyc3QgTUlOX01BVENIIGJ5dGVzIG9mIHMgYXJlIHZhbGlkCisgKiAgICAoZXhjZXB0IGZvciB0aGUgbGFzdCBNSU5fTUFUQ0gtMSBieXRlcyBvZiB0aGUgaW5wdXQgZmlsZSkuICovCisjZGVmaW5lIElOU0VSVF9TVFJJTkcocywgbWF0Y2hfaGVhZCkgXAorZG8geyBcCisJVVBEQVRFX0hBU0goRzEuaW5zX2gsIEcxLndpbmRvd1socykgKyBNSU5fTUFUQ0gtMV0pOyBcCisJRzEucHJldlsocykgJiBXTUFTS10gPSBtYXRjaF9oZWFkID0gaGVhZFtHMS5pbnNfaF07IFwKKwloZWFkW0cxLmluc19oXSA9IChzKTsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHVsZyBkZWZsYXRlKHZvaWQpCit7CisJSVBvcyBoYXNoX2hlYWQ7CQkvKiBoZWFkIG9mIGhhc2ggY2hhaW4gKi8KKwlJUG9zIHByZXZfbWF0Y2g7CS8qIHByZXZpb3VzIG1hdGNoICovCisJaW50IGZsdXNoOwkJCS8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqLworCWludCBtYXRjaF9hdmFpbGFibGUgPSAwOwkvKiBzZXQgaWYgcHJldmlvdXMgbWF0Y2ggZXhpc3RzICovCisJdW5zaWduZWQgbWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTsJLyogbGVuZ3RoIG9mIGJlc3QgbWF0Y2ggKi8KKworCS8qIFByb2Nlc3MgdGhlIGlucHV0IGJsb2NrLiAqLworCXdoaWxlIChHMS5sb29rYWhlYWQgIT0gMCkgeworCQkvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlCisJCSAqIGRpY3Rpb25hcnksIGFuZCBzZXQgaGFzaF9oZWFkIHRvIHRoZSBoZWFkIG9mIHRoZSBoYXNoIGNoYWluOgorCQkgKi8KKwkJSU5TRVJUX1NUUklORyhHMS5zdHJzdGFydCwgaGFzaF9oZWFkKTsKKworCQkvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLgorCQkgKi8KKwkJRzEucHJldl9sZW5ndGggPSBtYXRjaF9sZW5ndGg7CisJCXByZXZfbWF0Y2ggPSBHMS5tYXRjaF9zdGFydDsKKwkJbWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTsKKworCQlpZiAoaGFzaF9oZWFkICE9IDAgJiYgRzEucHJldl9sZW5ndGggPCBtYXhfbGF6eV9tYXRjaAorCQkgJiYgRzEuc3Ryc3RhcnQgLSBoYXNoX2hlYWQgPD0gTUFYX0RJU1QKKwkJKSB7CisJCQkvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZworCQkJICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoCisJCQkgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuCisJCQkgKi8KKwkJCW1hdGNoX2xlbmd0aCA9IGxvbmdlc3RfbWF0Y2goaGFzaF9oZWFkKTsKKwkJCS8qIGxvbmdlc3RfbWF0Y2goKSBzZXRzIG1hdGNoX3N0YXJ0ICovCisJCQlpZiAobWF0Y2hfbGVuZ3RoID4gRzEubG9va2FoZWFkKQorCQkJCW1hdGNoX2xlbmd0aCA9IEcxLmxvb2thaGVhZDsKKworCQkJLyogSWdub3JlIGEgbGVuZ3RoIDMgbWF0Y2ggaWYgaXQgaXMgdG9vIGRpc3RhbnQ6ICovCisJCQlpZiAobWF0Y2hfbGVuZ3RoID09IE1JTl9NQVRDSCAmJiBHMS5zdHJzdGFydCAtIEcxLm1hdGNoX3N0YXJ0ID4gVE9PX0ZBUikgeworCQkJCS8qIElmIHByZXZfbWF0Y2ggaXMgYWxzbyBNSU5fTUFUQ0gsIEcxLm1hdGNoX3N0YXJ0IGlzIGdhcmJhZ2UKKwkJCQkgKiBidXQgd2Ugd2lsbCBpZ25vcmUgdGhlIGN1cnJlbnQgbWF0Y2ggYW55d2F5LgorCQkJCSAqLworCQkJCW1hdGNoX2xlbmd0aC0tOworCQkJfQorCQl9CisJCS8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudAorCQkgKiBtYXRjaCBpcyBub3QgYmV0dGVyLCBvdXRwdXQgdGhlIHByZXZpb3VzIG1hdGNoOgorCQkgKi8KKwkJaWYgKEcxLnByZXZfbGVuZ3RoID49IE1JTl9NQVRDSCAmJiBtYXRjaF9sZW5ndGggPD0gRzEucHJldl9sZW5ndGgpIHsKKwkJCWNoZWNrX21hdGNoKEcxLnN0cnN0YXJ0IC0gMSwgcHJldl9tYXRjaCwgRzEucHJldl9sZW5ndGgpOworCQkJZmx1c2ggPSBjdF90YWxseShHMS5zdHJzdGFydCAtIDEgLSBwcmV2X21hdGNoLCBHMS5wcmV2X2xlbmd0aCAtIE1JTl9NQVRDSCk7CisKKwkJCS8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLgorCQkJICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuCisJCQkgKi8KKwkJCUcxLmxvb2thaGVhZCAtPSBHMS5wcmV2X2xlbmd0aCAtIDE7CisJCQlHMS5wcmV2X2xlbmd0aCAtPSAyOworCQkJZG8geworCQkJCUcxLnN0cnN0YXJ0Kys7CisJCQkJSU5TRVJUX1NUUklORyhHMS5zdHJzdGFydCwgaGFzaF9oZWFkKTsKKwkJCQkvKiBzdHJzdGFydCBuZXZlciBleGNlZWRzIFdTSVpFLU1BWF9NQVRDSCwgc28gdGhlcmUgYXJlCisJCQkJICogYWx3YXlzIE1JTl9NQVRDSCBieXRlcyBhaGVhZC4gSWYgbG9va2FoZWFkIDwgTUlOX01BVENICisJCQkJICogdGhlc2UgYnl0ZXMgYXJlIGdhcmJhZ2UsIGJ1dCBpdCBkb2VzIG5vdCBtYXR0ZXIgc2luY2UgdGhlCisJCQkJICogbmV4dCBsb29rYWhlYWQgYnl0ZXMgd2lsbCBhbHdheXMgYmUgZW1pdHRlZCBhcyBsaXRlcmFscy4KKwkJCQkgKi8KKwkJCX0gd2hpbGUgKC0tRzEucHJldl9sZW5ndGggIT0gMCk7CisJCQltYXRjaF9hdmFpbGFibGUgPSAwOworCQkJbWF0Y2hfbGVuZ3RoID0gTUlOX01BVENIIC0gMTsKKwkJCUcxLnN0cnN0YXJ0Kys7CisJCQlpZiAoZmx1c2gpIHsKKwkJCQlGTFVTSF9CTE9DSygwKTsKKwkJCQlHMS5ibG9ja19zdGFydCA9IEcxLnN0cnN0YXJ0OworCQkJfQorCQl9IGVsc2UgaWYgKG1hdGNoX2F2YWlsYWJsZSkgeworCQkJLyogSWYgdGhlcmUgd2FzIG5vIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBwb3NpdGlvbiwgb3V0cHV0IGEKKwkJCSAqIHNpbmdsZSBsaXRlcmFsLiBJZiB0aGVyZSB3YXMgYSBtYXRjaCBidXQgdGhlIGN1cnJlbnQgbWF0Y2gKKwkJCSAqIGlzIGxvbmdlciwgdHJ1bmNhdGUgdGhlIHByZXZpb3VzIG1hdGNoIHRvIGEgc2luZ2xlIGxpdGVyYWwuCisJCQkgKi8KKwkJCVRyYWNldnYoKHN0ZGVyciwgIiVjIiwgRzEud2luZG93W0cxLnN0cnN0YXJ0IC0gMV0pKTsKKwkJCWlmIChjdF90YWxseSgwLCBHMS53aW5kb3dbRzEuc3Ryc3RhcnQgLSAxXSkpIHsKKwkJCQlGTFVTSF9CTE9DSygwKTsKKwkJCQlHMS5ibG9ja19zdGFydCA9IEcxLnN0cnN0YXJ0OworCQkJfQorCQkJRzEuc3Ryc3RhcnQrKzsKKwkJCUcxLmxvb2thaGVhZC0tOworCQl9IGVsc2UgeworCQkJLyogVGhlcmUgaXMgbm8gcHJldmlvdXMgbWF0Y2ggdG8gY29tcGFyZSB3aXRoLCB3YWl0IGZvcgorCQkJICogdGhlIG5leHQgc3RlcCB0byBkZWNpZGUuCisJCQkgKi8KKwkJCW1hdGNoX2F2YWlsYWJsZSA9IDE7CisJCQlHMS5zdHJzdGFydCsrOworCQkJRzEubG9va2FoZWFkLS07CisJCX0KKwkJQXNzZXJ0KEcxLnN0cnN0YXJ0IDw9IEcxLmlzaXplICYmIGxvb2thaGVhZCA8PSBHMS5pc2l6ZSwgImEgYml0IHRvbyBmYXIiKTsKKworCQkvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHQKKwkJICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXMKKwkJICogZm9yIHRoZSBuZXh0IG1hdGNoLCBwbHVzIE1JTl9NQVRDSCBieXRlcyB0byBpbnNlcnQgdGhlCisJCSAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guCisJCSAqLworCQl3aGlsZSAoRzEubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiAhRzEuZW9maWxlKQorCQkJZmlsbF93aW5kb3coKTsKKwl9CisJaWYgKG1hdGNoX2F2YWlsYWJsZSkKKwkJY3RfdGFsbHkoMCwgRzEud2luZG93W0cxLnN0cnN0YXJ0IC0gMV0pOworCisJcmV0dXJuIEZMVVNIX0JMT0NLKDEpOwkvKiBlb2YgKi8KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEluaXRpYWxpemUgdGhlIGJpdCBzdHJpbmcgcm91dGluZXMuCisgKi8KK3N0YXRpYyB2b2lkIGJpX2luaXQodm9pZCkKK3sKKwlHMS5iaV9idWYgPSAwOworCUcxLmJpX3ZhbGlkID0gMDsKKyNpZmRlZiBERUJVRworCUcxLmJpdHNfc2VudCA9IDBMOworI2VuZGlmCit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisgKiBJbml0aWFsaXplIHRoZSAibG9uZ2VzdCBtYXRjaCIgcm91dGluZXMgZm9yIGEgbmV3IGZpbGUKKyAqLworc3RhdGljIHZvaWQgbG1faW5pdCh1c2ggKiBmbGFnc3ApCit7CisJdW5zaWduZWQgajsKKworCS8qIEluaXRpYWxpemUgdGhlIGhhc2ggdGFibGUuICovCisJbWVtc2V0KGhlYWQsIDAsIEhBU0hfU0laRSAqIHNpemVvZigqaGVhZCkpOworCS8qIHByZXYgd2lsbCBiZSBpbml0aWFsaXplZCBvbiB0aGUgZmx5ICovCisKKwkvKiBzcGVlZCBvcHRpb25zIGZvciB0aGUgZ2VuZXJhbCBwdXJwb3NlIGJpdCBmbGFnICovCisJKmZsYWdzcCB8PSAyOwkvKiBGQVNUIDQsIFNMT1cgMiAqLworCS8qID8/PyByZWR1Y2UgbWF4X2NoYWluX2xlbmd0aCBmb3IgYmluYXJ5IGZpbGVzICovCisKKwlHMS5zdHJzdGFydCA9IDA7CisJRzEuYmxvY2tfc3RhcnQgPSAwTDsKKworCUcxLmxvb2thaGVhZCA9IGZpbGVfcmVhZChHMS53aW5kb3csCisJCQlzaXplb2YoaW50KSA8PSAyID8gKHVuc2lnbmVkKSBXU0laRSA6IDIgKiBXU0laRSk7CisKKwlpZiAoRzEubG9va2FoZWFkID09IDAgfHwgRzEubG9va2FoZWFkID09ICh1bnNpZ25lZCkgLTEpIHsKKwkJRzEuZW9maWxlID0gMTsKKwkJRzEubG9va2FoZWFkID0gMDsKKwkJcmV0dXJuOworCX0KKwlHMS5lb2ZpbGUgPSAwOworCS8qIE1ha2Ugc3VyZSB0aGF0IHdlIGFsd2F5cyBoYXZlIGVub3VnaCBsb29rYWhlYWQuIFRoaXMgaXMgaW1wb3J0YW50CisJICogaWYgaW5wdXQgY29tZXMgZnJvbSBhIGRldmljZSBzdWNoIGFzIGEgdHR5LgorCSAqLworCXdoaWxlIChHMS5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmICFHMS5lb2ZpbGUpCisJCWZpbGxfd2luZG93KCk7CisKKwlHMS5pbnNfaCA9IDA7CisJZm9yIChqID0gMDsgaiA8IE1JTl9NQVRDSCAtIDE7IGorKykKKwkJVVBEQVRFX0hBU0goRzEuaW5zX2gsIEcxLndpbmRvd1tqXSk7CisJLyogSWYgbG9va2FoZWFkIDwgTUlOX01BVENILCBpbnNfaCBpcyBnYXJiYWdlLCBidXQgdGhpcyBpcworCSAqIG5vdCBpbXBvcnRhbnQgc2luY2Ugb25seSBsaXRlcmFsIGJ5dGVzIHdpbGwgYmUgZW1pdHRlZC4KKwkgKi8KK30KKworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqIEFsbG9jYXRlIHRoZSBtYXRjaCBidWZmZXIsIGluaXRpYWxpemUgdGhlIHZhcmlvdXMgdGFibGVzIGFuZCBzYXZlIHRoZQorICogbG9jYXRpb24gb2YgdGhlIGludGVybmFsIGZpbGUgYXR0cmlidXRlIChhc2NpaS9iaW5hcnkpIGFuZCBtZXRob2QKKyAqIChERUZMQVRFL1NUT1JFKS4KKyAqIE9uZSBjYWxsc2l0ZSBpbiB6aXAoKQorICovCitzdGF0aWMgdm9pZCBjdF9pbml0KHZvaWQpCit7CisJaW50IG47CQkJCS8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqLworCWludCBsZW5ndGg7CQkJLyogbGVuZ3RoIHZhbHVlICovCisJaW50IGNvZGU7CQkJLyogY29kZSB2YWx1ZSAqLworCWludCBkaXN0OwkJCS8qIGRpc3RhbmNlIGluZGV4ICovCisKKwlHMi5jb21wcmVzc2VkX2xlbiA9IDBMOworCisjaWZkZWYgTk9UX05FRURFRAorCWlmIChHMi5zdGF0aWNfZHRyZWVbMF0uTGVuICE9IDApCisJCXJldHVybjsJCQkvKiBjdF9pbml0IGFscmVhZHkgY2FsbGVkICovCisjZW5kaWYKKworCS8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgbGVuZ3RoICgwLi4yNTUpIC0+IGxlbmd0aCBjb2RlICgwLi4yOCkgKi8KKwlsZW5ndGggPSAwOworCWZvciAoY29kZSA9IDA7IGNvZGUgPCBMRU5HVEhfQ09ERVMgLSAxOyBjb2RlKyspIHsKKwkJRzIuYmFzZV9sZW5ndGhbY29kZV0gPSBsZW5ndGg7CisJCWZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9sYml0c1tjb2RlXSk7IG4rKykgeworCQkJRzIubGVuZ3RoX2NvZGVbbGVuZ3RoKytdID0gY29kZTsKKwkJfQorCX0KKwlBc3NlcnQobGVuZ3RoID09IDI1NiwgImN0X2luaXQ6IGxlbmd0aCAhPSAyNTYiKTsKKwkvKiBOb3RlIHRoYXQgdGhlIGxlbmd0aCAyNTUgKG1hdGNoIGxlbmd0aCAyNTgpIGNhbiBiZSByZXByZXNlbnRlZAorCSAqIGluIHR3byBkaWZmZXJlbnQgd2F5czogY29kZSAyODQgKyA1IGJpdHMgb3IgY29kZSAyODUsIHNvIHdlCisJICogb3ZlcndyaXRlIGxlbmd0aF9jb2RlWzI1NV0gdG8gdXNlIHRoZSBiZXN0IGVuY29kaW5nOgorCSAqLworCUcyLmxlbmd0aF9jb2RlW2xlbmd0aCAtIDFdID0gY29kZTsKKworCS8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgZGlzdCAoMC4uMzJLKSAtPiBkaXN0IGNvZGUgKDAuLjI5KSAqLworCWRpc3QgPSAwOworCWZvciAoY29kZSA9IDA7IGNvZGUgPCAxNjsgY29kZSsrKSB7CisJCUcyLmJhc2VfZGlzdFtjb2RlXSA9IGRpc3Q7CisJCWZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9kYml0c1tjb2RlXSk7IG4rKykgeworCQkJRzIuZGlzdF9jb2RlW2Rpc3QrK10gPSBjb2RlOworCQl9CisJfQorCUFzc2VydChkaXN0ID09IDI1NiwgImN0X2luaXQ6IGRpc3QgIT0gMjU2Iik7CisJZGlzdCA+Pj0gNzsJCQkvKiBmcm9tIG5vdyBvbiwgYWxsIGRpc3RhbmNlcyBhcmUgZGl2aWRlZCBieSAxMjggKi8KKwlmb3IgKDsgY29kZSA8IERfQ09ERVM7IGNvZGUrKykgeworCQlHMi5iYXNlX2Rpc3RbY29kZV0gPSBkaXN0IDw8IDc7CisJCWZvciAobiA9IDA7IG4gPCAoMSA8PCAoZXh0cmFfZGJpdHNbY29kZV0gLSA3KSk7IG4rKykgeworCQkJRzIuZGlzdF9jb2RlWzI1NiArIGRpc3QrK10gPSBjb2RlOworCQl9CisJfQorCUFzc2VydChkaXN0ID09IDI1NiwgImN0X2luaXQ6IDI1NitkaXN0ICE9IDUxMiIpOworCisJLyogQ29uc3RydWN0IHRoZSBjb2RlcyBvZiB0aGUgc3RhdGljIGxpdGVyYWwgdHJlZSAqLworCS8qIGFscmVhZHkgemVyb2VkIC0gaXQncyBpbiBic3MKKwlmb3IgKG4gPSAwOyBuIDw9IE1BWF9CSVRTOyBuKyspCisJCUcyLmJsX2NvdW50W25dID0gMDsgKi8KKworCW4gPSAwOworCXdoaWxlIChuIDw9IDE0MykgeworCQlHMi5zdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA4OworCQlHMi5ibF9jb3VudFs4XSsrOworCX0KKwl3aGlsZSAobiA8PSAyNTUpIHsKKwkJRzIuc3RhdGljX2x0cmVlW24rK10uTGVuID0gOTsKKwkJRzIuYmxfY291bnRbOV0rKzsKKwl9CisJd2hpbGUgKG4gPD0gMjc5KSB7CisJCUcyLnN0YXRpY19sdHJlZVtuKytdLkxlbiA9IDc7CisJCUcyLmJsX2NvdW50WzddKys7CisJfQorCXdoaWxlIChuIDw9IDI4NykgeworCQlHMi5zdGF0aWNfbHRyZWVbbisrXS5MZW4gPSA4OworCQlHMi5ibF9jb3VudFs4XSsrOworCX0KKwkvKiBDb2RlcyAyODYgYW5kIDI4NyBkbyBub3QgZXhpc3QsIGJ1dCB3ZSBtdXN0IGluY2x1ZGUgdGhlbSBpbiB0aGUKKwkgKiB0cmVlIGNvbnN0cnVjdGlvbiB0byBnZXQgYSBjYW5vbmljYWwgSHVmZm1hbiB0cmVlIChsb25nZXN0IGNvZGUKKwkgKiBhbGwgb25lcykKKwkgKi8KKwlnZW5fY29kZXMoKGN0X2RhdGEgKikgRzIuc3RhdGljX2x0cmVlLCBMX0NPREVTICsgMSk7CisKKwkvKiBUaGUgc3RhdGljIGRpc3RhbmNlIHRyZWUgaXMgdHJpdmlhbDogKi8KKwlmb3IgKG4gPSAwOyBuIDwgRF9DT0RFUzsgbisrKSB7CisJCUcyLnN0YXRpY19kdHJlZVtuXS5MZW4gPSA1OworCQlHMi5zdGF0aWNfZHRyZWVbbl0uQ29kZSA9IGJpX3JldmVyc2UobiwgNSk7CisJfQorCisJLyogSW5pdGlhbGl6ZSB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIGZpcnN0IGZpbGU6ICovCisJaW5pdF9ibG9jaygpOworfQorCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogRGVmbGF0ZSBpbiB0byBvdXQuCisgKiBJTiBhc3NlcnRpb25zOiB0aGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGFyZSBjbGVhcmVkLgorICovCisKK3N0YXRpYyB2b2lkIHppcCh2b2lkKQoreworCXVzaCBkZWZsYXRlX2ZsYWdzID0gMDsgIC8qIHBremlwIC1lcywgLWVuIG9yIC1leCBlcXVpdmFsZW50ICovCisKKwlHMS5vdXRjbnQgPSAwOworCisJLyogV3JpdGUgdGhlIGhlYWRlciB0byB0aGUgZ3ppcCBmaWxlLiBTZWUgYWxnb3JpdGhtLmRvYyBmb3IgdGhlIGZvcm1hdCAqLworCS8qIG1hZ2ljIGhlYWRlciBmb3IgZ3ppcCBmaWxlczogMUYgOEIgKi8KKwkvKiBjb21wcmVzc2lvbiBtZXRob2Q6IDggKERFRkxBVEVEKSAqLworCS8qIGdlbmVyYWwgZmxhZ3M6IDAgKi8KKwlwdXRfMzJiaXQoMHgwMDA4OGIxZik7CisJcHV0XzMyYml0KDApOwkJLyogVW5peCB0aW1lc3RhbXAgKi8KKworCS8qIFdyaXRlIGRlZmxhdGVkIGZpbGUgdG8gemlwIGZpbGUgKi8KKwlHMS5jcmMgPSB+MDsKKworCWJpX2luaXQoKTsKKwljdF9pbml0KCk7CisJbG1faW5pdCgmZGVmbGF0ZV9mbGFncyk7CisKKwlwdXRfOGJpdChkZWZsYXRlX2ZsYWdzKTsJLyogZXh0cmEgZmxhZ3MgKi8KKwlwdXRfOGJpdCgzKTsJLyogT1MgaWRlbnRpZmllciA9IDMgKFVuaXgpICovCisKKwlkZWZsYXRlKCk7CisKKwkvKiBXcml0ZSB0aGUgY3JjIGFuZCB1bmNvbXByZXNzZWQgc2l6ZSAqLworCXB1dF8zMmJpdCh+RzEuY3JjKTsKKwlwdXRfMzJiaXQoRzEuaXNpemUpOworCisJZmx1c2hfb3V0YnVmKCk7Cit9CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitzdGF0aWMKK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgRkFTVF9GVU5DIHBhY2tfZ3ppcCh0cmFuc2Zvcm1lcl9zdGF0ZV90ICp4c3RhdGUgVU5VU0VEX1BBUkFNKQoreworCS8qIENsZWFyIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyAqLworCUcxLm91dGNudCA9IDA7CisjaWZkZWYgREVCVUcKKwlHMS5pbnNpemUgPSAwOworI2VuZGlmCisJRzEuaXNpemUgPSAwOworCisJLyogUmVpbml0IEcyLnh4eCAqLworCW1lbXNldCgmRzIsIDAsIHNpemVvZihHMikpOworCUcyLmxfZGVzYy5keW5fdHJlZSAgICAgPSBHMi5keW5fbHRyZWU7CisJRzIubF9kZXNjLnN0YXRpY190cmVlICA9IEcyLnN0YXRpY19sdHJlZTsKKwlHMi5sX2Rlc2MuZXh0cmFfYml0cyAgID0gZXh0cmFfbGJpdHM7CisJRzIubF9kZXNjLmV4dHJhX2Jhc2UgICA9IExJVEVSQUxTICsgMTsKKwlHMi5sX2Rlc2MuZWxlbXMgICAgICAgID0gTF9DT0RFUzsKKwlHMi5sX2Rlc2MubWF4X2xlbmd0aCAgID0gTUFYX0JJVFM7CisJLy9HMi5sX2Rlc2MubWF4X2NvZGUgICAgID0gMDsKKwlHMi5kX2Rlc2MuZHluX3RyZWUgICAgID0gRzIuZHluX2R0cmVlOworCUcyLmRfZGVzYy5zdGF0aWNfdHJlZSAgPSBHMi5zdGF0aWNfZHRyZWU7CisJRzIuZF9kZXNjLmV4dHJhX2JpdHMgICA9IGV4dHJhX2RiaXRzOworCS8vRzIuZF9kZXNjLmV4dHJhX2Jhc2UgICA9IDA7CisJRzIuZF9kZXNjLmVsZW1zICAgICAgICA9IERfQ09ERVM7CisJRzIuZF9kZXNjLm1heF9sZW5ndGggICA9IE1BWF9CSVRTOworCS8vRzIuZF9kZXNjLm1heF9jb2RlICAgICA9IDA7CisJRzIuYmxfZGVzYy5keW5fdHJlZSAgICA9IEcyLmJsX3RyZWU7CisJLy9HMi5ibF9kZXNjLnN0YXRpY190cmVlID0gTlVMTDsKKwlHMi5ibF9kZXNjLmV4dHJhX2JpdHMgID0gZXh0cmFfYmxiaXRzLAorCS8vRzIuYmxfZGVzYy5leHRyYV9iYXNlICA9IDA7CisJRzIuYmxfZGVzYy5lbGVtcyAgICAgICA9IEJMX0NPREVTOworCUcyLmJsX2Rlc2MubWF4X2xlbmd0aCAgPSBNQVhfQkxfQklUUzsKKwkvL0cyLmJsX2Rlc2MubWF4X2NvZGUgICAgPSAwOworCisjaWYgMAorCS8qIFNhdmluZyBvZiB0aW1lc3RhbXAgaXMgZGlzYWJsZWQuIFdoeT8KKwkgKiAtIGl0IGlzIG5vdCBZMjAzOC1zYWZlLgorCSAqIC0gc29tZSBwZW9wbGUgd2FudCBkZXRlcm1pbmlzdGljIHJlc3VsdHMKKwkgKiAgIChub3JtYWxseSB0aGV5J2QgdXNlIC1uLCBidXQgb3VyIC1uIGlzIGEgbm9wKS4KKwkgKiAtIGl0J3MgYmxvYXQuCisJICogUGVyIFJGQyAxOTUyLCBnemZpbGUudGltZT0wIGlzICJubyB0aW1lc3RhbXAiLgorCSAqIElmIHVzZXJzIHdpbGwgZGVtYW5kIHRoaXMgdG8gYmUgcmVpbnN0YXRlZCwKKwkgKiBpbXBsZW1lbnQgLW4gImRvbid0IHNhdmUgdGltZXN0YW1wIi4KKwkgKi8KKwlzdHJ1Y3Qgc3RhdCBzOworCXMuc3RfY3RpbWUgPSAwOworCWZzdGF0KFNURElOX0ZJTEVOTywgJnMpOworCXppcChzLnN0X2N0aW1lKTsKKyNlbHNlCisJemlwKCk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0daSVBfTE9OR19PUFRJT05TCitzdGF0aWMgY29uc3QgY2hhciBnemlwX2xvbmdvcHRzW10gQUxJR04xID0KKwkic3Rkb3V0XDAiICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiYyIKKwkidG8tc3Rkb3V0XDAiICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiYyIKKwkiZm9yY2VcMCIgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiZiIKKwkidmVyYm9zZVwwIiAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAidiIKKyNpZiBFTkFCTEVfR1VOWklQCisJImRlY29tcHJlc3NcMCIgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImQiCisJInVuY29tcHJlc3NcMCIgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImQiCisJInRlc3RcMCIgICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInQiCisjZW5kaWYKKwkicXVpZXRcMCIgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAicSIKKwkiZmFzdFwwIiAgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiMSIKKwkiYmVzdFwwIiAgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiOSIKKwk7CisjZW5kaWYKKworLyoKKyAqIExpbnV4IGtlcm5lbCBidWlsZCB1c2VzIGd6aXAgLWQgLW4uIFdlIGFjY2VwdCBhbmQgaWdub3JlIC1uLgorICogTWFuIHBhZ2Ugc2F5czoKKyAqIC1uIC0tbm8tbmFtZQorICogZ3ppcDogZG8gbm90IHNhdmUgdGhlIG9yaWdpbmFsIGZpbGUgbmFtZSBhbmQgdGltZSBzdGFtcC4KKyAqIChUaGUgb3JpZ2luYWwgbmFtZSBpcyBhbHdheXMgc2F2ZWQgaWYgdGhlIG5hbWUgaGFkIHRvIGJlIHRydW5jYXRlZC4pCisgKiBndW56aXA6IGRvIG5vdCByZXN0b3JlIHRoZSBvcmlnaW5hbCBmaWxlIG5hbWUvdGltZSBldmVuIGlmIHByZXNlbnQKKyAqIChyZW1vdmUgb25seSB0aGUgZ3ppcCBzdWZmaXggZnJvbSB0aGUgY29tcHJlc3NlZCBmaWxlIG5hbWUpLgorICogVGhpcyBvcHRpb24gaXMgdGhlIGRlZmF1bHQgd2hlbiBkZWNvbXByZXNzaW5nLgorICogLU4gLS1uYW1lCisgKiBnemlwOiBhbHdheXMgc2F2ZSB0aGUgb3JpZ2luYWwgZmlsZSBuYW1lIGFuZCB0aW1lIHN0YW1wICh0aGlzIGlzIHRoZSBkZWZhdWx0KQorICogZ3VuemlwOiByZXN0b3JlIHRoZSBvcmlnaW5hbCBmaWxlIG5hbWUgYW5kIHRpbWUgc3RhbXAgaWYgcHJlc2VudC4KKyAqLworCitpbnQgZ3ppcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CisjaWYgRU5BQkxFX0dVTlpJUAoraW50IGd6aXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCisjZWxzZQoraW50IGd6aXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQorI2VuZGlmCit7CisJdW5zaWduZWQgb3B0OworI2lmZGVmIEVOQUJMRV9GRUFUVVJFX0daSVBfTEVWRUxTCisJc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJCXVpbnQ4X3QgZ29vZDsKKwkJdWludDhfdCBjaGFpbl9zaGlmdDsKKwkJdWludDhfdCBsYXp5MjsKKwkJdWludDhfdCBuaWNlMjsKKwl9IGd6aXBfbGV2ZWxfY29uZmlnWzZdID0geworCQl7NCwgICA0LCAgIDQvMiwgIDE2LzJ9LCAvKiBMZXZlbCA0ICovCisJCXs4LCAgIDUsICAxNi8yLCAgMzIvMn0sIC8qIExldmVsIDUgKi8KKwkJezgsICAgNywgIDE2LzIsIDEyOC8yfSwgLyogTGV2ZWwgNiAqLworCQl7OCwgICA4LCAgMzIvMiwgMTI4LzJ9LCAvKiBMZXZlbCA3ICovCisJCXszMiwgMTAsIDEyOC8yLCAyNTgvMn0sIC8qIExldmVsIDggKi8KKwkJezMyLCAxMiwgMjU4LzIsIDI1OC8yfSwgLyogTGV2ZWwgOSAqLworCX07CisjZW5kaWYKKworCVNFVF9QVFJfVE9fR0xPQkFMUygoY2hhciAqKXh6YWxsb2Moc2l6ZW9mKHN0cnVjdCBnbG9iYWxzKStzaXplb2Yoc3RydWN0IGdsb2JhbHMyKSkKKwkJCSsgc2l6ZW9mKHN0cnVjdCBnbG9iYWxzKSk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9HWklQX0xPTkdfT1BUSU9OUworCWFwcGxldF9sb25nX29wdGlvbnMgPSBnemlwX2xvbmdvcHRzOworI2VuZGlmCisJLyogTXVzdCBtYXRjaCBiYnVuemlwJ3MgY29uc3RhbnRzIE9QVF9TVERPVVQsIE9QVF9GT1JDRSEgKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiY2Z2IiBJRl9HVU5aSVAoImR0IikgInFuMTIzNDU2Nzg5Iik7CisjaWYgRU5BQkxFX0dVTlpJUCAvKiBndW56aXBfbWFpbiBtYXkgbm90IGJlIHZpc2libGUuLi4gKi8KKwlpZiAob3B0ICYgMHgxOCkgLy8gLWQgYW5kL29yIC10CisJCXJldHVybiBndW56aXBfbWFpbihhcmdjLCBhcmd2KTsKKyNlbmRpZgorI2lmZGVmIEVOQUJMRV9GRUFUVVJFX0daSVBfTEVWRUxTCisJb3B0ID4+PSBFTkFCTEVfR1VOWklQID8gNyA6IDU7IC8qIGRyb3AgY2Z2W2R0XXFuIGJpdHMgKi8KKwlpZiAob3B0ID09IDApCisJCW9wdCA9IDEgPDwgNjsgLyogZGVmYXVsdDogNiAqLworCS8qIE1hcCAxLi4zIHRvIDQgKi8KKwlpZiAob3B0ICYgMHg3KQorCQlvcHQgfD0gMSA8PCA0OworCW9wdCA9IGZmcyhvcHQgPj4gMyk7CisJbWF4X2NoYWluX2xlbmd0aCA9IDEgPDwgZ3ppcF9sZXZlbF9jb25maWdbb3B0XS5jaGFpbl9zaGlmdDsKKwlnb29kX21hdGNoCSA9IGd6aXBfbGV2ZWxfY29uZmlnW29wdF0uZ29vZDsKKwltYXhfbGF6eV9tYXRjaAkgPSBnemlwX2xldmVsX2NvbmZpZ1tvcHRdLmxhenkyICogMjsKKwluaWNlX21hdGNoCSA9IGd6aXBfbGV2ZWxfY29uZmlnW29wdF0ubmljZTIgKiAyOworI2VuZGlmCisJb3B0aW9uX21hc2szMiAmPSAweDc7IC8qIHJldGFpbiBvbmx5IC1jZnYgKi8KKworCS8qIEFsbG9jYXRlIGFsbCBnbG9iYWwgYnVmZmVycyAoZm9yIERZTl9BTExPQyBvcHRpb24pICovCisJQUxMT0ModWNoLCBHMS5sX2J1ZiwgSU5CVUZTSVopOworCUFMTE9DKHVjaCwgRzEub3V0YnVmLCBPVVRCVUZTSVopOworCUFMTE9DKHVzaCwgRzEuZF9idWYsIERJU1RfQlVGU0laRSk7CisJQUxMT0ModWNoLCBHMS53aW5kb3csIDJMICogV1NJWkUpOworCUFMTE9DKHVzaCwgRzEucHJldiwgMUwgPDwgQklUUyk7CisKKwkvKiBJbml0aWFsaXplIHRoZSBDUkMzMiB0YWJsZSAqLworCWdsb2JhbF9jcmMzMl90YWJsZSA9IGNyYzMyX2ZpbGx0YWJsZShOVUxMLCAwKTsKKworCWFyZ3YgKz0gb3B0aW5kOworCXJldHVybiBiYnVucGFjayhhcmd2LCBwYWNrX2d6aXAsIGFwcGVuZF9leHQsICJneiIpOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9LYnVpbGQuc3JjIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZmFhZjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL0tidWlsZC5zcmMKQEAgLTAsMCArMSw4NSBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15Oj0KKworQ09NTU9OX0ZJTEVTOj0gXAorXAorCWRhdGFfc2tpcC5vIFwKKwlkYXRhX2V4dHJhY3RfYWxsLm8gXAorCWRhdGFfZXh0cmFjdF90b19zdGRvdXQubyBcCitcCisJZmlsdGVyX2FjY2VwdF9hbGwubyBcCisJZmlsdGVyX2FjY2VwdF9saXN0Lm8gXAorCWZpbHRlcl9hY2NlcHRfcmVqZWN0X2xpc3QubyBcCitcCisJaGVhZGVyX3NraXAubyBcCisJaGVhZGVyX2xpc3QubyBcCisJaGVhZGVyX3ZlcmJvc2VfbGlzdC5vIFwKK1wKKwlzZWVrX2J5X3JlYWQubyBcCisJc2Vla19ieV9qdW1wLm8gXAorXAorCWRhdGFfYWxpZ24ubyBcCisJZmluZF9saXN0X2VudHJ5Lm8gXAorCWluaXRfaGFuZGxlLm8KKworRFBLR19GSUxFUzo9IFwKKwl1bnBhY2tfYXJfYXJjaGl2ZS5vIFwKKwlmaWx0ZXJfYWNjZXB0X2xpc3RfcmVhc3NpZ24ubyBcCisJdW5zYWZlX3ByZWZpeC5vIFwKKwlnZXRfaGVhZGVyX2FyLm8gXAorCWdldF9oZWFkZXJfdGFyLm8gXAorCWdldF9oZWFkZXJfdGFyX2d6Lm8gXAorCWdldF9oZWFkZXJfdGFyX2J6Mi5vIFwKKwlnZXRfaGVhZGVyX3Rhcl9sem1hLm8gXAorCWdldF9oZWFkZXJfdGFyX3h6Lm8gXAorCitJTlNFUlQKKworbGliLSQoQ09ORklHX0RQS0cpICAgICAgICAgICAgICAgICAgICAgICs9ICQoRFBLR19GSUxFUykKK2xpYi0kKENPTkZJR19EUEtHX0RFQikgICAgICAgICAgICAgICAgICArPSAkKERQS0dfRklMRVMpCisKK2xpYi0kKENPTkZJR19BUikgICAgICAgICAgICAgICAgICAgICAgICArPSBnZXRfaGVhZGVyX2FyLm8gdW5wYWNrX2FyX2FyY2hpdmUubworbGliLSQoQ09ORklHX0NQSU8pICAgICAgICAgICAgICAgICAgICAgICs9IGdldF9oZWFkZXJfY3Bpby5vCitsaWItJChDT05GSUdfVEFSKSAgICAgICAgICAgICAgICAgICAgICAgKz0gZ2V0X2hlYWRlcl90YXIubyB1bnNhZmVfcHJlZml4Lm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1RBUl9UT19DT01NQU5EKSAgICArPSBkYXRhX2V4dHJhY3RfdG9fY29tbWFuZC5vCitsaWItJChDT05GSUdfTFpPUCkgICAgICAgICAgICAgICAgICAgICAgKz0gbHpvMXhfMS5vIGx6bzF4XzFvLm8gbHpvMXhfZC5vCitsaWItJChDT05GSUdfTFpPUF9DT01QUl9ISUdIKSAgICAgICAgICAgKz0gbHpvMXhfOXgubworbGliLSQoQ09ORklHX0JVTlpJUDIpICAgICAgICAgICAgICAgICAgICs9IG9wZW5fdHJhbnNmb3JtZXIubyBkZWNvbXByZXNzX2J1bnppcDIubworbGliLSQoQ09ORklHX1VOTFpNQSkgICAgICAgICAgICAgICAgICAgICs9IG9wZW5fdHJhbnNmb3JtZXIubyBkZWNvbXByZXNzX3VubHptYS5vCitsaWItJChDT05GSUdfVU5YWikgICAgICAgICAgICAgICAgICAgICAgKz0gb3Blbl90cmFuc2Zvcm1lci5vIGRlY29tcHJlc3NfdW54ei5vCitsaWItJChDT05GSUdfR1VOWklQKSAgICAgICAgICAgICAgICAgICAgKz0gb3Blbl90cmFuc2Zvcm1lci5vIGRlY29tcHJlc3NfZ3VuemlwLm8KK2xpYi0kKENPTkZJR19VTkNPTVBSRVNTKSAgICAgICAgICAgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8gZGVjb21wcmVzc191bmNvbXByZXNzLm8KK2xpYi0kKENPTkZJR19VTlpJUCkgICAgICAgICAgICAgICAgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8gZGVjb21wcmVzc19ndW56aXAubyB1bnNhZmVfcHJlZml4Lm8KK2xpYi0kKENPTkZJR19SUE0yQ1BJTykgICAgICAgICAgICAgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8gZGVjb21wcmVzc19ndW56aXAubyBnZXRfaGVhZGVyX2NwaW8ubworbGliLSQoQ09ORklHX1JQTSkgICAgICAgICAgICAgICAgICAgICAgICs9IG9wZW5fdHJhbnNmb3JtZXIubyBkZWNvbXByZXNzX2d1bnppcC5vIGdldF9oZWFkZXJfY3Bpby5vCisKK2xpYi0kKENPTkZJR19HWklQKSAgICAgICAgICAgICAgICAgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8KK2xpYi0kKENPTkZJR19CWklQMikgICAgICAgICAgICAgICAgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8KK2xpYi0kKENPTkZJR19MWk9QKSAgICAgICAgICAgICAgICAgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8KK2xpYi0kKENPTkZJR19NQU4pICAgICAgICAgICAgICAgICAgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8KK2xpYi0kKENPTkZJR19TRVRGT05UKSAgICAgICAgICAgICAgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTKSAgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8KK2xpYi0kKENPTkZJR19NT0RJTkZPKSAgICAgICAgICAgICAgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8KK2xpYi0kKENPTkZJR19JTlNNT0QpICAgICAgICAgICAgICAgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8KK2xpYi0kKENPTkZJR19ERVBNT0QpICAgICAgICAgICAgICAgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8KK2xpYi0kKENPTkZJR19STU1PRCkgICAgICAgICAgICAgICAgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8KK2xpYi0kKENPTkZJR19MU01PRCkgICAgICAgICAgICAgICAgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8KK2xpYi0kKENPTkZJR19NT0RQUk9CRSkgICAgICAgICAgICAgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8KK2xpYi0kKENPTkZJR19NT0RQUk9CRV9TTUFMTCkgICAgICAgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8KKworbGliLSQoQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWikgICAgICAgICs9IG9wZW5fdHJhbnNmb3JtZXIubyBkZWNvbXByZXNzX3VuY29tcHJlc3MubworbGliLSQoQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfR1opICAgICAgICs9IG9wZW5fdHJhbnNmb3JtZXIubyBkZWNvbXByZXNzX2d1bnppcC5vCitsaWItJChDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19CWjIpICAgICAgKz0gb3Blbl90cmFuc2Zvcm1lci5vIGRlY29tcHJlc3NfYnVuemlwMi5vCitsaWItJChDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19MWk1BKSAgICAgKz0gb3Blbl90cmFuc2Zvcm1lci5vIGRlY29tcHJlc3NfdW5sem1hLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX1NFQU1MRVNTX1haKSAgICAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8gZGVjb21wcmVzc191bnh6Lm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX0NPTVBSRVNTX1VTQUdFKSAgICArPSBvcGVuX3RyYW5zZm9ybWVyLm8gZGVjb21wcmVzc19idW56aXAyLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX0NPTVBSRVNTX0JCQ09ORklHKSArPSBvcGVuX3RyYW5zZm9ybWVyLm8gZGVjb21wcmVzc19idW56aXAyLm8KKworaWZuZXEgKCQobGliLXkpLCkKK2xpYi15ICs9ICQoQ09NTU9OX0ZJTEVTKQorZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovTElDRU5TRSBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTQzNDY1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9MSUNFTlNFCkBAIC0wLDAgKzEsNDQgQEAKK2J6aXAyIGFwcGxldCBpbiBidXN5Ym94IGlzIGJhc2VkIG9uIGxpZ2h0bHktbW9kaWZpZWQgc291cmNlCitvZiBiemlwMiB2ZXJzaW9uIDEuMC40LiBiemlwMiBzb3VyY2UgaXMgZGlzdHJpYnV0ZWQKK3VuZGVyIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyAoY29waWVkIHZlcmJhdGltIGZyb20gTElDRU5TRSBmaWxlKQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitUaGlzIHByb2dyYW0sICJiemlwMiIsIHRoZSBhc3NvY2lhdGVkIGxpYnJhcnkgImxpYmJ6aXAyIiwgYW5kIGFsbAorZG9jdW1lbnRhdGlvbiwgYXJlIGNvcHlyaWdodCAoQykgMTk5Ni0yMDA2IEp1bGlhbiBSIFNld2FyZC4gIEFsbAorcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworYXJlIG1ldDoKKworMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKworMi4gVGhlIG9yaWdpbiBvZiB0aGlzIHNvZnR3YXJlIG11c3Qgbm90IGJlIG1pc3JlcHJlc2VudGVkOyB5b3UgbXVzdAorICAgbm90IGNsYWltIHRoYXQgeW91IHdyb3RlIHRoZSBvcmlnaW5hbCBzb2Z0d2FyZS4gIElmIHlvdSB1c2UgdGhpcworICAgc29mdHdhcmUgaW4gYSBwcm9kdWN0LCBhbiBhY2tub3dsZWRnbWVudCBpbiB0aGUgcHJvZHVjdAorICAgZG9jdW1lbnRhdGlvbiB3b3VsZCBiZSBhcHByZWNpYXRlZCBidXQgaXMgbm90IHJlcXVpcmVkLgorCiszLiBBbHRlcmVkIHNvdXJjZSB2ZXJzaW9ucyBtdXN0IGJlIHBsYWlubHkgbWFya2VkIGFzIHN1Y2gsIGFuZCBtdXN0CisgICBub3QgYmUgbWlzcmVwcmVzZW50ZWQgYXMgYmVpbmcgdGhlIG9yaWdpbmFsIHNvZnR3YXJlLgorCis0LiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAgIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbgorICAgcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MKK09SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECitXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKK0FSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWQorRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCitEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURQorR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCitXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKK05FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUworU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKK0p1bGlhbiBTZXdhcmQsIENhbWJyaWRnZSwgVUsuCitqc2V3YXJkQGJ6aXAub3JnCitiemlwMi9saWJiemlwMiB2ZXJzaW9uIDEuMC40IG9mIDIwIERlY2VtYmVyIDIwMDYKZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovUkVBRE1FIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZmZDQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovUkVBRE1FCkBAIC0wLDAgKzEsOTAgQEAKK1RoaXMgZmlsZSBpcyBhbiBhYnJpZGdlZCB2ZXJzaW9uIG9mIFJFQURNRSBmcm9tIGJ6aXAyIDEuMC40CitCdWlsZCBpbnN0cnVjdGlvbnMgKHdoaWNoIGFyZSBub3QgcmVsZXZhbnQgdG8gYnVzeWJveGVkIGJ6aXAyKQorYXJlIHJlbW92ZWQuCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKK1RoaXMgaXMgdGhlIFJFQURNRSBmb3IgYnppcDIvbGliemlwMi4KK1RoaXMgdmVyc2lvbiBpcyBmdWxseSBjb21wYXRpYmxlIHdpdGggdGhlIHByZXZpb3VzIHB1YmxpYyByZWxlYXNlcy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitUaGlzIGZpbGUgaXMgcGFydCBvZiBiemlwMi9saWJiemlwMiwgYSBwcm9ncmFtIGFuZCBsaWJyYXJ5IGZvcgorbG9zc2xlc3MsIGJsb2NrLXNvcnRpbmcgZGF0YSBjb21wcmVzc2lvbi4KKworYnppcDIvbGliYnppcDIgdmVyc2lvbiAxLjAuNCBvZiAyMCBEZWNlbWJlciAyMDA2CitDb3B5cmlnaHQgKEMpIDE5OTYtMjAwNiBKdWxpYW4gU2V3YXJkIDxqc2V3YXJkQGJ6aXAub3JnPgorCitQbGVhc2UgcmVhZCB0aGUgV0FSTklORywgRElTQ0xBSU1FUiBhbmQgUEFURU5UUyBzZWN0aW9ucyBpbiB0aGlzIGZpbGUuCisKK1RoaXMgcHJvZ3JhbSBpcyByZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGxpY2Vuc2UgY29udGFpbmVkCitpbiB0aGUgZmlsZSBMSUNFTlNFLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1BsZWFzZSByZWFkIGFuZCBiZSBhd2FyZSBvZiB0aGUgZm9sbG93aW5nOgorCisKK1dBUk5JTkc6CisKKyAgIFRoaXMgcHJvZ3JhbSBhbmQgbGlicmFyeSAoYXR0ZW1wdHMgdG8pIGNvbXByZXNzIGRhdGEgYnkKKyAgIHBlcmZvcm1pbmcgc2V2ZXJhbCBub24tdHJpdmlhbCB0cmFuc2Zvcm1hdGlvbnMgb24gaXQuCisgICBVbmxlc3MgeW91IGFyZSAxMDAlIGZhbWlsaWFyIHdpdGggKmFsbCogdGhlIGFsZ29yaXRobXMKKyAgIGNvbnRhaW5lZCBoZXJlaW4sIGFuZCB3aXRoIHRoZSBjb25zZXF1ZW5jZXMgb2YgbW9kaWZ5aW5nIHRoZW0sCisgICB5b3Ugc2hvdWxkIE5PVCBtZWRkbGUgd2l0aCB0aGUgY29tcHJlc3Npb24gb3IgZGVjb21wcmVzc2lvbgorICAgbWFjaGluZXJ5LiAgSW5jb3JyZWN0IGNoYW5nZXMgY2FuIGFuZCB2ZXJ5IGxpa2VseSAqd2lsbCoKKyAgIGxlYWQgdG8gZGlzYXN0cm91cyBsb3NzIG9mIGRhdGEuCisKKworRElTQ0xBSU1FUjoKKworICAgSSBUQUtFIE5PIFJFU1BPTlNJQklMSVRZIEZPUiBBTlkgTE9TUyBPRiBEQVRBIEFSSVNJTkcgRlJPTSBUSEUKKyAgIFVTRSBPRiBUSElTIFBST0dSQU0vTElCUkFSWSwgSE9XU09FVkVSIENBVVNFRC4KKworICAgRXZlcnkgY29tcHJlc3Npb24gb2YgYSBmaWxlIGltcGxpZXMgYW4gYXNzdW1wdGlvbiB0aGF0IHRoZQorICAgY29tcHJlc3NlZCBmaWxlIGNhbiBiZSBkZWNvbXByZXNzZWQgdG8gcmVwcm9kdWNlIHRoZSBvcmlnaW5hbC4KKyAgIEdyZWF0IGVmZm9ydHMgaW4gZGVzaWduLCBjb2RpbmcgYW5kIHRlc3RpbmcgaGF2ZSBiZWVuIG1hZGUgdG8KKyAgIGVuc3VyZSB0aGF0IHRoaXMgcHJvZ3JhbSB3b3JrcyBjb3JyZWN0bHkuICBIb3dldmVyLCB0aGUgY29tcGxleGl0eQorICAgb2YgdGhlIGFsZ29yaXRobXMsIGFuZCwgaW4gcGFydGljdWxhciwgdGhlIHByZXNlbmNlIG9mIHZhcmlvdXMKKyAgIHNwZWNpYWwgY2FzZXMgaW4gdGhlIGNvZGUgd2hpY2ggb2NjdXIgd2l0aCB2ZXJ5IGxvdyBidXQgbm9uLXplcm8KKyAgIHByb2JhYmlsaXR5IG1ha2UgaXQgaW1wb3NzaWJsZSB0byBydWxlIG91dCB0aGUgcG9zc2liaWxpdHkgb2YgYnVncworICAgcmVtYWluaW5nIGluIHRoZSBwcm9ncmFtLiAgRE8gTk9UIENPTVBSRVNTIEFOWSBEQVRBIFdJVEggVEhJUworICAgUFJPR1JBTSBVTkxFU1MgWU9VIEFSRSBQUkVQQVJFRCBUTyBBQ0NFUFQgVEhFIFBPU1NJQklMSVRZLCBIT1dFVkVSCisgICBTTUFMTCwgVEhBVCBUSEUgREFUQSBXSUxMIE5PVCBCRSBSRUNPVkVSQUJMRS4KKworICAgVGhhdCBpcyBub3QgdG8gc2F5IHRoaXMgcHJvZ3JhbSBpcyBpbmhlcmVudGx5IHVucmVsaWFibGUuCisgICBJbmRlZWQsIEkgdmVyeSBtdWNoIGhvcGUgdGhlIG9wcG9zaXRlIGlzIHRydWUuICBiemlwMi9saWJiemlwMgorICAgaGFzIGJlZW4gY2FyZWZ1bGx5IGNvbnN0cnVjdGVkIGFuZCBleHRlbnNpdmVseSB0ZXN0ZWQuCisKKworUEFURU5UUzoKKworICAgVG8gdGhlIGJlc3Qgb2YgbXkga25vd2xlZGdlLCBiemlwMi9saWJiemlwMiBkb2VzIG5vdCB1c2UgYW55CisgICBwYXRlbnRlZCBhbGdvcml0aG1zLiAgSG93ZXZlciwgSSBkbyBub3QgaGF2ZSB0aGUgcmVzb3VyY2VzCisgICB0byBjYXJyeSBvdXQgYSBwYXRlbnQgc2VhcmNoLiAgVGhlcmVmb3JlIEkgY2Fubm90IGdpdmUgYW55CisgICBndWFyYW50ZWUgb2YgdGhlIGFib3ZlIHN0YXRlbWVudC4KKworCitJIGhvcGUgeW91IGZpbmQgYnppcDIgdXNlZnVsLiAgRmVlbCBmcmVlIHRvIGNvbnRhY3QgbWUgYXQKKyAgIGpzZXdhcmRAYnppcC5vcmcKK2lmIHlvdSBoYXZlIGFueSBzdWdnZXN0aW9ucyBvciBxdWVyaWVzLiAgTWFueSBwZW9wbGUgbWFpbGVkIG1lIHdpdGgKK2NvbW1lbnRzLCBzdWdnZXN0aW9ucyBhbmQgcGF0Y2hlcyBhZnRlciB0aGUgcmVsZWFzZXMgb2YgYnppcC0wLjE1LAorYnppcC0wLjIxLCBhbmQgYnppcDIgdmVyc2lvbnMgMC4xcGwyLCAwLjkuMCwgMC45LjUsIDEuMC4wLCAxLjAuMSwKKzEuMC4yIGFuZCAxLjAuMywgYW5kIHRoZSBjaGFuZ2VzIGluIGJ6aXAyIGFyZSBsYXJnZWx5IGEgcmVzdWx0IG9mIHRoaXMKK2ZlZWRiYWNrLiAgSSB0aGFuayB5b3UgZm9yIHlvdXIgY29tbWVudHMuCisKK2J6aXAyJ3MgImhvbWUiIGlzIGh0dHA6Ly93d3cuYnppcC5vcmcvCisKK0p1bGlhbiBTZXdhcmQKK2pzZXdhcmRAYnppcC5vcmcKK0NhbWJyaWRnZSwgVUsuCisKKzE4ICAgICBKdWx5IDE5OTYgKHZlcnNpb24gMC4xNSkKKzI1ICAgQXVndXN0IDE5OTYgKHZlcnNpb24gMC4yMSkKKyA3ICAgQXVndXN0IDE5OTcgKGJ6aXAyLCB2ZXJzaW9uIDAuMSkKKzI5ICAgQXVndXN0IDE5OTcgKGJ6aXAyLCB2ZXJzaW9uIDAuMXBsMikKKzIzICAgQXVndXN0IDE5OTggKGJ6aXAyLCB2ZXJzaW9uIDAuOS4wKQorIDggICAgIEp1bmUgMTk5OSAoYnppcDIsIHZlcnNpb24gMC45LjUpCisgNCAgICAgU2VwdCAxOTk5IChiemlwMiwgdmVyc2lvbiAwLjkuNWQpCisgNSAgICAgIE1heSAyMDAwIChiemlwMiwgdmVyc2lvbiAxLjBwcmU4KQorMzAgRGVjZW1iZXIgMjAwMSAoYnppcDIsIHZlcnNpb24gMS4wLjJwcmUxKQorMTUgRmVicnVhcnkgMjAwNSAoYnppcDIsIHZlcnNpb24gMS4wLjMpCisyMCBEZWNlbWJlciAyMDA2IChiemlwMiwgdmVyc2lvbiAxLjAuNCkKZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovYmxvY2tzb3J0LmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L2Jsb2Nrc29ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MDBjYjcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L2Jsb2Nrc29ydC5jCkBAIC0wLDAgKzEsMTA3MiBAQAorLyoKKyAqIGJ6aXAyIGlzIHdyaXR0ZW4gYnkgSnVsaWFuIFNld2FyZCA8anNld2FyZEBiemlwLm9yZz4uCisgKiBBZGFwdGVkIGZvciBidXN5Ym94IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+LgorICogU2VlIFJFQURNRSBhbmQgTElDRU5TRSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gQmxvY2sgc29ydGluZyBtYWNoaW5lcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tKi8KKy8qLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2Nrc29ydC5jIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIGJ6aXAyL2xpYmJ6aXAyLCBhIHByb2dyYW0gYW5kIGxpYnJhcnkgZm9yCitsb3NzbGVzcywgYmxvY2stc29ydGluZyBkYXRhIGNvbXByZXNzaW9uLgorCitiemlwMi9saWJiemlwMiB2ZXJzaW9uIDEuMC40IG9mIDIwIERlY2VtYmVyIDIwMDYKK0NvcHlyaWdodCAoQykgMTk5Ni0yMDA2IEp1bGlhbiBTZXdhcmQgPGpzZXdhcmRAYnppcC5vcmc+CisKK1BsZWFzZSByZWFkIHRoZSBXQVJOSU5HLCBESVNDTEFJTUVSIGFuZCBQQVRFTlRTIHNlY3Rpb25zIGluIHRoZQorUkVBRE1FIGZpbGUuCisKK1RoaXMgcHJvZ3JhbSBpcyByZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGxpY2Vuc2UgY29udGFpbmVkCitpbiB0aGUgZmlsZSBMSUNFTlNFLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qICNpbmNsdWRlICJiemxpYl9wcml2YXRlLmgiICovCisKKyNkZWZpbmUgbXN3YXAoenoxLCB6ejIpIFwKK3sgXAorCWludDMyX3Qgenp0bXAgPSB6ejE7IFwKKwl6ejEgPSB6ejI7IFwKKwl6ejIgPSB6enRtcDsgXAorfQorCitzdGF0aWMKKy8qIE5vIG1lYXN1cmFibGUgc3BlZWQgZ2FpbiB3aXRoIGlubGluaW5nICovCisvKiBBTFdBWVNfSU5MSU5FICovCit2b2lkIG12c3dhcCh1aW50MzJfdCogcHRyLCBpbnQzMl90IHp6cDEsIGludDMyX3QgenpwMiwgaW50MzJfdCB6em4pCit7CisJd2hpbGUgKHp6biA+IDApIHsKKwkJbXN3YXAocHRyW3p6cDFdLCBwdHJbenpwMl0pOworCQl6enAxKys7CisJCXp6cDIrKzsKKwkJenpuLS07CisJfQorfQorCitzdGF0aWMKK0FMV0FZU19JTkxJTkUKK2ludDMyX3QgbW1pbihpbnQzMl90IGEsIGludDMyX3QgYikKK3sKKwlyZXR1cm4gKGEgPCBiKSA/IGEgOiBiOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIEZhbGxiYWNrIE8oTiBsb2coTileMikgc29ydGluZyAgICAgICAgLS0tKi8KKy8qLS0tIGFsZ29yaXRobSwgZm9yIHJlcGV0aXRpdmUgYmxvY2tzICAgICAgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCitpbmxpbmUKK3ZvaWQgZmFsbGJhY2tTaW1wbGVTb3J0KHVpbnQzMl90KiBmbWFwLAorCQl1aW50MzJfdCogZWNsYXNzLAorCQlpbnQzMl90ICAgbG8sCisJCWludDMyX3QgICBoaSkKK3sKKwlpbnQzMl90IGksIGosIHRtcDsKKwl1aW50MzJfdCBlY190bXA7CisKKwlpZiAobG8gPT0gaGkpIHJldHVybjsKKworCWlmIChoaSAtIGxvID4gMykgeworCQlmb3IgKGkgPSBoaS00OyBpID49IGxvOyBpLS0pIHsKKwkJCXRtcCA9IGZtYXBbaV07CisJCQllY190bXAgPSBlY2xhc3NbdG1wXTsKKwkJCWZvciAoaiA9IGkrNDsgaiA8PSBoaSAmJiBlY190bXAgPiBlY2xhc3NbZm1hcFtqXV07IGogKz0gNCkKKwkJCQlmbWFwW2otNF0gPSBmbWFwW2pdOworCQkJZm1hcFtqLTRdID0gdG1wOworCQl9CisJfQorCisJZm9yIChpID0gaGktMTsgaSA+PSBsbzsgaS0tKSB7CisJCXRtcCA9IGZtYXBbaV07CisJCWVjX3RtcCA9IGVjbGFzc1t0bXBdOworCQlmb3IgKGogPSBpKzE7IGogPD0gaGkgJiYgZWNfdG1wID4gZWNsYXNzW2ZtYXBbal1dOyBqKyspCisJCQlmbWFwW2otMV0gPSBmbWFwW2pdOworCQlmbWFwW2otMV0gPSB0bXA7CisJfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgZnB1c2gobHosaHopIHsgXAorCXN0YWNrTG9bc3BdID0gbHo7IFwKKwlzdGFja0hpW3NwXSA9IGh6OyBcCisJc3ArKzsgXAorfQorCisjZGVmaW5lIGZwb3AobHosaHopIHsgXAorCXNwLS07IFwKKwlseiA9IHN0YWNrTG9bc3BdOyBcCisJaHogPSBzdGFja0hpW3NwXTsgXAorfQorCisjZGVmaW5lIEZBTExCQUNLX1FTT1JUX1NNQUxMX1RIUkVTSCAxMAorI2RlZmluZSBGQUxMQkFDS19RU09SVF9TVEFDS19TSVpFICAgMTAwCisKK3N0YXRpYwordm9pZCBmYWxsYmFja1FTb3J0Myh1aW50MzJfdCogZm1hcCwKKwkJdWludDMyX3QqIGVjbGFzcywKKwkJaW50MzJfdCAgIGxvU3QsCisJCWludDMyX3QgICBoaVN0KQoreworCWludDMyX3QgdW5MbywgdW5IaSwgbHRMbywgZ3RIaSwgbiwgbTsKKwlpbnQzMl90IHNwLCBsbywgaGk7CisJdWludDMyX3QgbWVkLCByLCByMzsKKwlpbnQzMl90IHN0YWNrTG9bRkFMTEJBQ0tfUVNPUlRfU1RBQ0tfU0laRV07CisJaW50MzJfdCBzdGFja0hpW0ZBTExCQUNLX1FTT1JUX1NUQUNLX1NJWkVdOworCisJciA9IDA7CisKKwlzcCA9IDA7CisJZnB1c2gobG9TdCwgaGlTdCk7CisKKwl3aGlsZSAoc3AgPiAwKSB7CisJCUFzc2VydEgoc3AgPCBGQUxMQkFDS19RU09SVF9TVEFDS19TSVpFIC0gMSwgMTAwNCk7CisKKwkJZnBvcChsbywgaGkpOworCQlpZiAoaGkgLSBsbyA8IEZBTExCQUNLX1FTT1JUX1NNQUxMX1RIUkVTSCkgeworCQkJZmFsbGJhY2tTaW1wbGVTb3J0KGZtYXAsIGVjbGFzcywgbG8sIGhpKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogUmFuZG9tIHBhcnRpdGlvbmluZy4gIE1lZGlhbiBvZiAzIHNvbWV0aW1lcyBmYWlscyB0bworCQkgKiBhdm9pZCBiYWQgY2FzZXMuICBNZWRpYW4gb2YgOSBzZWVtcyB0byBoZWxwIGJ1dAorCQkgKiBsb29rcyByYXRoZXIgZXhwZW5zaXZlLiAgVGhpcyB0b28gc2VlbXMgdG8gd29yayBidXQKKwkJICogaXMgY2hlYXBlci4gIEd1aWRhbmNlIGZvciB0aGUgbWFnaWMgY29uc3RhbnRzCisJCSAqIDc2MjEgYW5kIDMyNzY4IGlzIHRha2VuIGZyb20gU2VkZ2V3aWNrJ3MgYWxnb3JpdGhtcworCQkgKiBib29rLCBjaGFwdGVyIDM1LgorCQkgKi8KKwkJciA9ICgociAqIDc2MjEpICsgMSkgJSAzMjc2ODsKKwkJcjMgPSByICUgMzsKKwkJaWYgKHIzID09IDApCisJCQltZWQgPSBlY2xhc3NbZm1hcFtsb11dOworCQllbHNlIGlmIChyMyA9PSAxKQorCQkJbWVkID0gZWNsYXNzW2ZtYXBbKGxvK2hpKT4+MV1dOworCQllbHNlCisJCQltZWQgPSBlY2xhc3NbZm1hcFtoaV1dOworCisJCXVuTG8gPSBsdExvID0gbG87CisJCXVuSGkgPSBndEhpID0gaGk7CisKKwkJd2hpbGUgKDEpIHsKKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKHVuTG8gPiB1bkhpKSBicmVhazsKKwkJCQluID0gKGludDMyX3QpZWNsYXNzW2ZtYXBbdW5Mb11dIC0gKGludDMyX3QpbWVkOworCQkJCWlmIChuID09IDApIHsKKwkJCQkJbXN3YXAoZm1hcFt1bkxvXSwgZm1hcFtsdExvXSk7CisJCQkJCWx0TG8rKzsKKwkJCQkJdW5MbysrOworCQkJCQljb250aW51ZTsKKwkJCQl9OworCQkJCWlmIChuID4gMCkgYnJlYWs7CisJCQkJdW5MbysrOworCQkJfQorCQkJd2hpbGUgKDEpIHsKKwkJCQlpZiAodW5MbyA+IHVuSGkpIGJyZWFrOworCQkJCW4gPSAoaW50MzJfdCllY2xhc3NbZm1hcFt1bkhpXV0gLSAoaW50MzJfdCltZWQ7CisJCQkJaWYgKG4gPT0gMCkgeworCQkJCQltc3dhcChmbWFwW3VuSGldLCBmbWFwW2d0SGldKTsKKwkJCQkJZ3RIaS0tOyB1bkhpLS07CisJCQkJCWNvbnRpbnVlOworCQkJCX07CisJCQkJaWYgKG4gPCAwKSBicmVhazsKKwkJCQl1bkhpLS07CisJCQl9CisJCQlpZiAodW5MbyA+IHVuSGkpIGJyZWFrOworCQkJbXN3YXAoZm1hcFt1bkxvXSwgZm1hcFt1bkhpXSk7IHVuTG8rKzsgdW5IaS0tOworCQl9CisKKwkJQXNzZXJ0RCh1bkhpID09IHVuTG8tMSwgImZhbGxiYWNrUVNvcnQzKDIpIik7CisKKwkJaWYgKGd0SGkgPCBsdExvKSBjb250aW51ZTsKKworCQluID0gbW1pbihsdExvLWxvLCB1bkxvLWx0TG8pOyBtdnN3YXAoZm1hcCwgbG8sIHVuTG8tbiwgbik7CisJCW0gPSBtbWluKGhpLWd0SGksIGd0SGktdW5IaSk7IG12c3dhcChmbWFwLCB1bkxvLCBoaS1tKzEsIG0pOworCisJCW4gPSBsbyArIHVuTG8gLSBsdExvIC0gMTsKKwkJbSA9IGhpIC0gKGd0SGkgLSB1bkhpKSArIDE7CisKKwkJaWYgKG4gLSBsbyA+IGhpIC0gbSkgeworCQkJZnB1c2gobG8sIG4pOworCQkJZnB1c2gobSwgaGkpOworCQl9IGVsc2UgeworCQkJZnB1c2gobSwgaGkpOworCQkJZnB1c2gobG8sIG4pOworCQl9CisJfQorfQorCisjdW5kZWYgZnB1c2gKKyN1bmRlZiBmcG9wCisjdW5kZWYgRkFMTEJBQ0tfUVNPUlRfU01BTExfVEhSRVNICisjdW5kZWYgRkFMTEJBQ0tfUVNPUlRfU1RBQ0tfU0laRQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIFByZToKKyAqCW5ibG9jayA+IDAKKyAqCWVjbGFzcyBleGlzdHMgZm9yIFswIC4uIG5ibG9jay0xXQorICoJKCh1aW50OF90KillY2xhc3MpIFswIC4uIG5ibG9jay0xXSBob2xkcyBibG9jaworICoJcHRyIGV4aXN0cyBmb3IgWzAgLi4gbmJsb2NrLTFdCisgKgorICogUG9zdDoKKyAqCSgodWludDhfdCopZWNsYXNzKSBbMCAuLiBuYmxvY2stMV0gaG9sZHMgYmxvY2sKKyAqCUFsbCBvdGhlciBhcmVhcyBvZiBlY2xhc3MgZGVzdHJveWVkCisgKglmbWFwIFswIC4uIG5ibG9jay0xXSBob2xkcyBzb3J0ZWQgb3JkZXIKKyAqCWJodGFiWzAgLi4gMisobmJsb2NrLzMyKV0gZGVzdHJveWVkCisqLworCisjZGVmaW5lICAgICAgIFNFVF9CSCh6eikgIGJodGFiWyh6eikgPj4gNV0gfD0gKDEgPDwgKCh6eikgJiAzMSkpCisjZGVmaW5lICAgICBDTEVBUl9CSCh6eikgIGJodGFiWyh6eikgPj4gNV0gJj0gfigxIDw8ICgoenopICYgMzEpKQorI2RlZmluZSAgICAgSVNTRVRfQkgoenopICAoYmh0YWJbKHp6KSA+PiA1XSAmICgxIDw8ICgoenopICYgMzEpKSkKKyNkZWZpbmUgICAgICBXT1JEX0JIKHp6KSAgYmh0YWJbKHp6KSA+PiA1XQorI2RlZmluZSBVTkFMSUdORURfQkgoenopICAoKHp6KSAmIDB4MDFmKQorCitzdGF0aWMKK3ZvaWQgZmFsbGJhY2tTb3J0KHVpbnQzMl90KiBmbWFwLAorCQl1aW50MzJfdCogZWNsYXNzLAorCQl1aW50MzJfdCogYmh0YWIsCisJCWludDMyX3QgICBuYmxvY2spCit7CisJaW50MzJfdCBmdGFiWzI1N107CisJaW50MzJfdCBmdGFiQ29weVsyNTZdOworCWludDMyX3QgSCwgaSwgaiwgaywgbCwgciwgY2MsIGNjMTsKKwlpbnQzMl90IG5Ob3REb25lOworCWludDMyX3QgbkJodGFiOworCXVpbnQ4X3QqIGVjbGFzczggPSAodWludDhfdCopZWNsYXNzOworCisJLyoKKwkgKiBJbml0aWFsIDEtY2hhciByYWRpeCBzb3J0IHRvIGdlbmVyYXRlCisJICogaW5pdGlhbCBmbWFwIGFuZCBpbml0aWFsIEJIIGJpdHMuCisJICovCisJZm9yIChpID0gMDsgaSA8IDI1NzsgICAgaSsrKSBmdGFiW2ldID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbmJsb2NrOyBpKyspIGZ0YWJbZWNsYXNzOFtpXV0rKzsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyAgICBpKyspIGZ0YWJDb3B5W2ldID0gZnRhYltpXTsKKworCWogPSBmdGFiWzBdOyAgLyogYmJveDogb3B0aW1pemVkICovCisJZm9yIChpID0gMTsgaSA8IDI1NzsgICAgaSsrKSB7CisJCWogKz0gZnRhYltpXTsKKwkJZnRhYltpXSA9IGo7CisJfQorCisJZm9yIChpID0gMDsgaSA8IG5ibG9jazsgaSsrKSB7CisJCWogPSBlY2xhc3M4W2ldOworCQlrID0gZnRhYltqXSAtIDE7CisJCWZ0YWJbal0gPSBrOworCQlmbWFwW2tdID0gaTsKKwl9CisKKwluQmh0YWIgPSAyICsgKCh1aW50MzJfdCluYmxvY2sgLyAzMik7IC8qIGJib3g6IHVuc2lnbmVkIGRpdiBpcyBlYXNpZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbkJodGFiOyBpKyspIGJodGFiW2ldID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIFNFVF9CSChmdGFiW2ldKTsKKworCS8qCisJICogSW5kdWN0aXZlbHkgcmVmaW5lIHRoZSBidWNrZXRzLiAgS2luZC1vZiBhbgorCSAqICJleHBvbmVudGlhbCByYWRpeCBzb3J0IiAoISksIGluc3BpcmVkIGJ5IHRoZQorCSAqIE1hbmJlci1NeWVycyBzdWZmaXggYXJyYXkgY29uc3RydWN0aW9uIGFsZ29yaXRobS4KKwkgKi8KKworCS8qLS0gc2V0IHNlbnRpbmVsIGJpdHMgZm9yIGJsb2NrLWVuZCBkZXRlY3Rpb24gLS0qLworCWZvciAoaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisJCVNFVF9CSChuYmxvY2sgKyAyKmkpOworCQlDTEVBUl9CSChuYmxvY2sgKyAyKmkgKyAxKTsKKwl9CisKKwkvKi0tIHRoZSBsb2coTikgbG9vcCAtLSovCisJSCA9IDE7CisJd2hpbGUgKDEpIHsKKwkJaiA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBuYmxvY2s7IGkrKykgeworCQkJaWYgKElTU0VUX0JIKGkpKQorCQkJCWogPSBpOworCQkJayA9IGZtYXBbaV0gLSBIOworCQkJaWYgKGsgPCAwKQorCQkJCWsgKz0gbmJsb2NrOworCQkJZWNsYXNzW2tdID0gajsKKwkJfQorCisJCW5Ob3REb25lID0gMDsKKwkJciA9IC0xOworCQl3aGlsZSAoMSkgeworCisJCS8qLS0gZmluZCB0aGUgbmV4dCBub24tc2luZ2xldG9uIGJ1Y2tldCAtLSovCisJCQlrID0gciArIDE7CisJCQl3aGlsZSAoSVNTRVRfQkgoaykgJiYgVU5BTElHTkVEX0JIKGspKQorCQkJCWsrKzsKKwkJCWlmIChJU1NFVF9CSChrKSkgeworCQkJCXdoaWxlIChXT1JEX0JIKGspID09IDB4ZmZmZmZmZmYpIGsgKz0gMzI7CisJCQkJd2hpbGUgKElTU0VUX0JIKGspKSBrKys7CisJCQl9CisJCQlsID0gayAtIDE7CisJCQlpZiAobCA+PSBuYmxvY2spCisJCQkJYnJlYWs7CisJCQl3aGlsZSAoIUlTU0VUX0JIKGspICYmIFVOQUxJR05FRF9CSChrKSkKKwkJCQlrKys7CisJCQlpZiAoIUlTU0VUX0JIKGspKSB7CisJCQkJd2hpbGUgKFdPUkRfQkgoaykgPT0gMHgwMDAwMDAwMCkgayArPSAzMjsKKwkJCQl3aGlsZSAoIUlTU0VUX0JIKGspKSBrKys7CisJCQl9CisJCQlyID0gayAtIDE7CisJCQlpZiAociA+PSBuYmxvY2spCisJCQkJYnJlYWs7CisKKwkJCS8qLS0gbm93IFtsLCByXSBicmFja2V0IGN1cnJlbnQgYnVja2V0IC0tKi8KKwkJCWlmIChyID4gbCkgeworCQkJCW5Ob3REb25lICs9IChyIC0gbCArIDEpOworCQkJCWZhbGxiYWNrUVNvcnQzKGZtYXAsIGVjbGFzcywgbCwgcik7CisKKwkJCQkvKi0tIHNjYW4gYnVja2V0IGFuZCBnZW5lcmF0ZSBoZWFkZXIgYml0cy0tICovCisJCQkJY2MgPSAtMTsKKwkJCQlmb3IgKGkgPSBsOyBpIDw9IHI7IGkrKykgeworCQkJCQljYzEgPSBlY2xhc3NbZm1hcFtpXV07CisJCQkJCWlmIChjYyAhPSBjYzEpIHsKKwkJCQkJCVNFVF9CSChpKTsKKwkJCQkJCWNjID0gY2MxOworCQkJCQl9OworCQkJCX0KKwkJCX0KKwkJfQorCisJCUggKj0gMjsKKwkJaWYgKEggPiBuYmxvY2sgfHwgbk5vdERvbmUgPT0gMCkKKwkJCWJyZWFrOworCX0KKworCS8qCisJICogUmVjb25zdHJ1Y3QgdGhlIG9yaWdpbmFsIGJsb2NrIGluCisJICogZWNsYXNzOCBbMCAuLiBuYmxvY2stMV0sIHNpbmNlIHRoZQorCSAqIHByZXZpb3VzIHBoYXNlIGRlc3Ryb3llZCBpdC4KKwkgKi8KKwlqID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbmJsb2NrOyBpKyspIHsKKwkJd2hpbGUgKGZ0YWJDb3B5W2pdID09IDApCisJCQlqKys7CisJCWZ0YWJDb3B5W2pdLS07CisJCWVjbGFzczhbZm1hcFtpXV0gPSAodWludDhfdClqOworCX0KKwlBc3NlcnRIKGogPCAyNTYsIDEwMDUpOworfQorCisjdW5kZWYgICAgICAgU0VUX0JICisjdW5kZWYgICAgIENMRUFSX0JICisjdW5kZWYgICAgIElTU0VUX0JICisjdW5kZWYgICAgICBXT1JEX0JICisjdW5kZWYgVU5BTElHTkVEX0JICisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gVGhlIG1haW4sIE8oTl4yIGxvZyhOKSkgc29ydGluZyAgICAgICAtLS0qLworLyotLS0gYWxnb3JpdGhtLiAgRmFzdGVyIGZvciAibm9ybWFsIiAgICAgICAtLS0qLworLyotLS0gbm9uLXJlcGV0aXRpdmUgYmxvY2tzLiAgICAgICAgICAgICAgICAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK05PSU5MSU5FCitpbnQgbWFpbkd0VSgKKwkJdWludDMyX3QgIGkxLAorCQl1aW50MzJfdCAgaTIsCisJCXVpbnQ4X3QqICBibG9jaywKKwkJdWludDE2X3QqIHF1YWRyYW50LAorCQl1aW50MzJfdCAgbmJsb2NrLAorCQlpbnQzMl90KiAgYnVkZ2V0KQoreworCWludDMyX3QgIGs7CisJdWludDhfdCAgYzEsIGMyOworCXVpbnQxNl90IHMxLCBzMjsKKworLyogTG9vcCB1bnJvbGxpbmcgaGVyZSBpcyBhY3R1YWxseSB2ZXJ5IHVzZWZ1bAorICogKGdlbmVyYXRlZCBjb2RlIGlzIG11Y2ggc2ltcGxlciksCisgKiBjb2RlIHNpemUgaW5jcmVhc2UgaXMgb25seSAyNzAgYnl0ZXMgKGkzODYpCisgKiBidXQgc3BlZWRzIHVwIGNvbXByZXNzaW9uIDEwJSBvdmVyYWxsCisgKi8KKworI2lmIENPTkZJR19CWklQMl9GQVNUID49IDEKKworI2RlZmluZSBUSU1FU184KGNvZGUpIFwKKwljb2RlOyBjb2RlOyBjb2RlOyBjb2RlOyBcCisJY29kZTsgY29kZTsgY29kZTsgY29kZTsKKyNkZWZpbmUgVElNRVNfMTIoY29kZSkgXAorCWNvZGU7IGNvZGU7IGNvZGU7IGNvZGU7IFwKKwljb2RlOyBjb2RlOyBjb2RlOyBjb2RlOyBcCisJY29kZTsgY29kZTsgY29kZTsgY29kZTsKKworI2Vsc2UKKworI2RlZmluZSBUSU1FU184KGNvZGUpIFwKK3sgXAorCWludCBubiA9IDg7IFwKKwlkbyB7IFwKKwkJY29kZTsgXAorCX0gd2hpbGUgKC0tbm4pOyBcCit9CisjZGVmaW5lIFRJTUVTXzEyKGNvZGUpIFwKK3sgXAorCWludCBubiA9IDEyOyBcCisJZG8geyBcCisJCWNvZGU7IFwKKwl9IHdoaWxlICgtLW5uKTsgXAorfQorCisjZW5kaWYKKworCUFzc2VydEQoaTEgIT0gaTIsICJtYWluR3RVIik7CisJVElNRVNfMTIoCisJCWMxID0gYmxvY2tbaTFdOyBjMiA9IGJsb2NrW2kyXTsKKwkJaWYgKGMxICE9IGMyKSByZXR1cm4gKGMxID4gYzIpOworCQlpMSsrOyBpMisrOworCSkKKworCWsgPSBuYmxvY2sgKyA4OworCisJZG8geworCQlUSU1FU184KAorCQkJYzEgPSBibG9ja1tpMV07IGMyID0gYmxvY2tbaTJdOworCQkJaWYgKGMxICE9IGMyKSByZXR1cm4gKGMxID4gYzIpOworCQkJczEgPSBxdWFkcmFudFtpMV07IHMyID0gcXVhZHJhbnRbaTJdOworCQkJaWYgKHMxICE9IHMyKSByZXR1cm4gKHMxID4gczIpOworCQkJaTErKzsgaTIrKzsKKwkJKQorCisJCWlmIChpMSA+PSBuYmxvY2spIGkxIC09IG5ibG9jazsKKwkJaWYgKGkyID49IG5ibG9jaykgaTIgLT0gbmJsb2NrOworCisJCSgqYnVkZ2V0KS0tOworCQlrIC09IDg7CisJfSB3aGlsZSAoayA+PSAwKTsKKworCXJldHVybiBGYWxzZTsKK30KKyN1bmRlZiBUSU1FU184CisjdW5kZWYgVElNRVNfMTIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyoKKyAqIEtudXRoJ3MgaW5jcmVtZW50cyBzZWVtIHRvIHdvcmsgYmV0dGVyCisgKiB0aGFuIEluY2VycGktU2VkZ2V3aWNrIGhlcmUuICBQb3NzaWJseQorICogYmVjYXVzZSB0aGUgbnVtYmVyIG9mIGVsZW1zIHRvIHNvcnQgaXMKKyAqIHVzdWFsbHkgc21hbGwsIHR5cGljYWxseSA8PSAyMC4KKyAqLworc3RhdGljCitjb25zdCBpbnQzMl90IGluY3NbMTRdID0geworCTEsIDQsIDEzLCA0MCwgMTIxLCAzNjQsIDEwOTMsIDMyODAsCisJOTg0MSwgMjk1MjQsIDg4NTczLCAyNjU3MjAsCisJNzk3MTYxLCAyMzkxNDg0Cit9OworCitzdGF0aWMKK3ZvaWQgbWFpblNpbXBsZVNvcnQodWludDMyX3QqIHB0ciwKKwkJdWludDhfdCogIGJsb2NrLAorCQl1aW50MTZfdCogcXVhZHJhbnQsCisJCWludDMyX3QgICBuYmxvY2ssCisJCWludDMyX3QgICBsbywKKwkJaW50MzJfdCAgIGhpLAorCQlpbnQzMl90ICAgZCwKKwkJaW50MzJfdCogIGJ1ZGdldCkKK3sKKwlpbnQzMl90IGksIGosIGgsIGJpZ04sIGhwOworCXVpbnQzMl90IHY7CisKKwliaWdOID0gaGkgLSBsbyArIDE7CisJaWYgKGJpZ04gPCAyKSByZXR1cm47CisKKwlocCA9IDA7CisJd2hpbGUgKGluY3NbaHBdIDwgYmlnTikgaHArKzsKKwlocC0tOworCisJZm9yICg7IGhwID49IDA7IGhwLS0pIHsKKwkJaCA9IGluY3NbaHBdOworCisJCWkgPSBsbyArIGg7CisJCXdoaWxlICgxKSB7CisJCQkvKi0tIGNvcHkgMSAtLSovCisJCQlpZiAoaSA+IGhpKSBicmVhazsKKwkJCXYgPSBwdHJbaV07CisJCQlqID0gaTsKKwkJCXdoaWxlIChtYWluR3RVKHB0cltqLWhdK2QsIHYrZCwgYmxvY2ssIHF1YWRyYW50LCBuYmxvY2ssIGJ1ZGdldCkpIHsKKwkJCQlwdHJbal0gPSBwdHJbai1oXTsKKwkJCQlqID0gaiAtIGg7CisJCQkJaWYgKGogPD0gKGxvICsgaCAtIDEpKSBicmVhazsKKwkJCX0KKwkJCXB0cltqXSA9IHY7CisJCQlpKys7CisKKy8qIDEuNSUgb3ZlcmFsbCBzcGVlZHVwLCArMjkwIGJ5dGVzICovCisjaWYgQ09ORklHX0JaSVAyX0ZBU1QgPj0gMworCQkJLyotLSBjb3B5IDIgLS0qLworCQkJaWYgKGkgPiBoaSkgYnJlYWs7CisJCQl2ID0gcHRyW2ldOworCQkJaiA9IGk7CisJCQl3aGlsZSAobWFpbkd0VShwdHJbai1oXStkLCB2K2QsIGJsb2NrLCBxdWFkcmFudCwgbmJsb2NrLCBidWRnZXQpKSB7CisJCQkJcHRyW2pdID0gcHRyW2otaF07CisJCQkJaiA9IGogLSBoOworCQkJCWlmIChqIDw9IChsbyArIGggLSAxKSkgYnJlYWs7CisJCQl9CisJCQlwdHJbal0gPSB2OworCQkJaSsrOworCisJCQkvKi0tIGNvcHkgMyAtLSovCisJCQlpZiAoaSA+IGhpKSBicmVhazsKKwkJCXYgPSBwdHJbaV07CisJCQlqID0gaTsKKwkJCXdoaWxlIChtYWluR3RVKHB0cltqLWhdK2QsIHYrZCwgYmxvY2ssIHF1YWRyYW50LCBuYmxvY2ssIGJ1ZGdldCkpIHsKKwkJCQlwdHJbal0gPSBwdHJbai1oXTsKKwkJCQlqID0gaiAtIGg7CisJCQkJaWYgKGogPD0gKGxvICsgaCAtIDEpKSBicmVhazsKKwkJCX0KKwkJCXB0cltqXSA9IHY7CisJCQlpKys7CisjZW5kaWYKKwkJCWlmICgqYnVkZ2V0IDwgMCkgcmV0dXJuOworCQl9CisJfQorfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qCisgKiBUaGUgZm9sbG93aW5nIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mCisgKiBhbiBlbGVnYW50IDMtd2F5IHF1aWNrc29ydCBmb3Igc3RyaW5ncywKKyAqIGRlc2NyaWJlZCBpbiBhIHBhcGVyICJGYXN0IEFsZ29yaXRobXMgZm9yCisgKiBTb3J0aW5nIGFuZCBTZWFyY2hpbmcgU3RyaW5ncyIsIGJ5IFJvYmVydAorICogU2VkZ2V3aWNrIGFuZCBKb24gTC4gQmVudGxleS4KKyAqLworCitzdGF0aWMKK0FMV0FZU19JTkxJTkUKK3VpbnQ4X3QgbW1lZDModWludDhfdCBhLCB1aW50OF90IGIsIHVpbnQ4X3QgYykKK3sKKwl1aW50OF90IHQ7CisJaWYgKGEgPiBiKSB7CisJCXQgPSBhOworCQlhID0gYjsKKwkJYiA9IHQ7CisJfTsKKwkvKiBoZXJlIGIgPj0gYSAqLworCWlmIChiID4gYykgeworCQliID0gYzsKKwkJaWYgKGEgPiBiKQorCQkJYiA9IGE7CisJfQorCXJldHVybiBiOworfQorCisjZGVmaW5lIG1wdXNoKGx6LGh6LGR6KSBcCit7IFwKKwlzdGFja0xvW3NwXSA9IGx6OyBcCisJc3RhY2tIaVtzcF0gPSBoejsgXAorCXN0YWNrRCBbc3BdID0gZHo7IFwKKwlzcCsrOyBcCit9CisKKyNkZWZpbmUgbXBvcChseixoeixkeikgXAoreyBcCisJc3AtLTsgXAorCWx6ID0gc3RhY2tMb1tzcF07IFwKKwloeiA9IHN0YWNrSGlbc3BdOyBcCisJZHogPSBzdGFja0QgW3NwXTsgXAorfQorCisjZGVmaW5lIG1uZXh0c2l6ZShheikgKG5leHRIaVthel0gLSBuZXh0TG9bYXpdKQorCisjZGVmaW5lIG1uZXh0c3dhcChheixieikgXAoreyBcCisJaW50MzJfdCB0ejsgXAorCXR6ID0gbmV4dExvW2F6XTsgbmV4dExvW2F6XSA9IG5leHRMb1tiel07IG5leHRMb1tiel0gPSB0ejsgXAorCXR6ID0gbmV4dEhpW2F6XTsgbmV4dEhpW2F6XSA9IG5leHRIaVtiel07IG5leHRIaVtiel0gPSB0ejsgXAorCXR6ID0gbmV4dEQgW2F6XTsgbmV4dEQgW2F6XSA9IG5leHREIFtiel07IG5leHREIFtiel0gPSB0ejsgXAorfQorCisjZGVmaW5lIE1BSU5fUVNPUlRfU01BTExfVEhSRVNIIDIwCisjZGVmaW5lIE1BSU5fUVNPUlRfREVQVEhfVEhSRVNIIChCWl9OX1JBRElYICsgQlpfTl9RU09SVCkKKyNkZWZpbmUgTUFJTl9RU09SVF9TVEFDS19TSVpFICAgMTAwCisKK3N0YXRpYyBOT0lOTElORQordm9pZCBtYWluUVNvcnQzKHVpbnQzMl90KiBwdHIsCisJCXVpbnQ4X3QqICBibG9jaywKKwkJdWludDE2X3QqIHF1YWRyYW50LAorCQlpbnQzMl90ICAgbmJsb2NrLAorCQlpbnQzMl90ICAgbG9TdCwKKwkJaW50MzJfdCAgIGhpU3QsCisJCWludDMyX3QgICBkU3QsCisJCWludDMyX3QqICBidWRnZXQpCit7CisJaW50MzJfdCB1bkxvLCB1bkhpLCBsdExvLCBndEhpLCBuLCBtLCBtZWQ7CisJaW50MzJfdCBzcCwgbG8sIGhpLCBkOworCisJaW50MzJfdCBzdGFja0xvW01BSU5fUVNPUlRfU1RBQ0tfU0laRV07CisJaW50MzJfdCBzdGFja0hpW01BSU5fUVNPUlRfU1RBQ0tfU0laRV07CisJaW50MzJfdCBzdGFja0QgW01BSU5fUVNPUlRfU1RBQ0tfU0laRV07CisKKwlpbnQzMl90IG5leHRMb1szXTsKKwlpbnQzMl90IG5leHRIaVszXTsKKwlpbnQzMl90IG5leHREIFszXTsKKworCXNwID0gMDsKKwltcHVzaChsb1N0LCBoaVN0LCBkU3QpOworCisJd2hpbGUgKHNwID4gMCkgeworCQlBc3NlcnRIKHNwIDwgTUFJTl9RU09SVF9TVEFDS19TSVpFIC0gMiwgMTAwMSk7CisKKwkJbXBvcChsbywgaGksIGQpOworCQlpZiAoaGkgLSBsbyA8IE1BSU5fUVNPUlRfU01BTExfVEhSRVNICisJCSB8fCBkID4gTUFJTl9RU09SVF9ERVBUSF9USFJFU0gKKwkJKSB7CisJCQltYWluU2ltcGxlU29ydChwdHIsIGJsb2NrLCBxdWFkcmFudCwgbmJsb2NrLCBsbywgaGksIGQsIGJ1ZGdldCk7CisJCQlpZiAoKmJ1ZGdldCA8IDApCisJCQkJcmV0dXJuOworCQkJY29udGludWU7CisJCX0KKwkJbWVkID0gKGludDMyX3QpCW1tZWQzKGJsb2NrW3B0cltsbyAgICAgICAgICBdICsgZF0sCisJCSAgICAgICAgICAgICAgICAgICAgICBibG9ja1twdHJbaGkgICAgICAgICAgXSArIGRdLAorCQkgICAgICAgICAgICAgICAgICAgICAgYmxvY2tbcHRyWyhsbytoaSkgPj4gMV0gKyBkXSk7CisKKwkJdW5MbyA9IGx0TG8gPSBsbzsKKwkJdW5IaSA9IGd0SGkgPSBoaTsKKworCQl3aGlsZSAoMSkgeworCQkJd2hpbGUgKDEpIHsKKwkJCQlpZiAodW5MbyA+IHVuSGkpCisJCQkJCWJyZWFrOworCQkJCW4gPSAoKGludDMyX3QpYmxvY2tbcHRyW3VuTG9dK2RdKSAtIG1lZDsKKwkJCQlpZiAobiA9PSAwKSB7CisJCQkJCW1zd2FwKHB0clt1bkxvXSwgcHRyW2x0TG9dKTsKKwkJCQkJbHRMbysrOworCQkJCQl1bkxvKys7CisJCQkJCWNvbnRpbnVlOworCQkJCX07CisJCQkJaWYgKG4gPiAgMCkgYnJlYWs7CisJCQkJdW5MbysrOworCQkJfQorCQkJd2hpbGUgKDEpIHsKKwkJCQlpZiAodW5MbyA+IHVuSGkpCisJCQkJCWJyZWFrOworCQkJCW4gPSAoKGludDMyX3QpYmxvY2tbcHRyW3VuSGldK2RdKSAtIG1lZDsKKwkJCQlpZiAobiA9PSAwKSB7CisJCQkJCW1zd2FwKHB0clt1bkhpXSwgcHRyW2d0SGldKTsKKwkJCQkJZ3RIaS0tOworCQkJCQl1bkhpLS07CisJCQkJCWNvbnRpbnVlOworCQkJCX07CisJCQkJaWYgKG4gPCAgMCkgYnJlYWs7CisJCQkJdW5IaS0tOworCQkJfQorCQkJaWYgKHVuTG8gPiB1bkhpKQorCQkJCWJyZWFrOworCQkJbXN3YXAocHRyW3VuTG9dLCBwdHJbdW5IaV0pOworCQkJdW5MbysrOworCQkJdW5IaS0tOworCQl9CisKKwkJQXNzZXJ0RCh1bkhpID09IHVuTG8tMSwgIm1haW5RU29ydDMoMikiKTsKKworCQlpZiAoZ3RIaSA8IGx0TG8pIHsKKwkJCW1wdXNoKGxvLCBoaSwgZCArIDEpOworCQkJY29udGludWU7CisJCX0KKworCQluID0gbW1pbihsdExvLWxvLCB1bkxvLWx0TG8pOyBtdnN3YXAocHRyLCBsbywgdW5Mby1uLCBuKTsKKwkJbSA9IG1taW4oaGktZ3RIaSwgZ3RIaS11bkhpKTsgbXZzd2FwKHB0ciwgdW5MbywgaGktbSsxLCBtKTsKKworCQluID0gbG8gKyB1bkxvIC0gbHRMbyAtIDE7CisJCW0gPSBoaSAtIChndEhpIC0gdW5IaSkgKyAxOworCisJCW5leHRMb1swXSA9IGxvOyAgbmV4dEhpWzBdID0gbjsgICBuZXh0RFswXSA9IGQ7CisJCW5leHRMb1sxXSA9IG07ICAgbmV4dEhpWzFdID0gaGk7ICBuZXh0RFsxXSA9IGQ7CisJCW5leHRMb1syXSA9IG4rMTsgbmV4dEhpWzJdID0gbS0xOyBuZXh0RFsyXSA9IGQrMTsKKworCQlpZiAobW5leHRzaXplKDApIDwgbW5leHRzaXplKDEpKSBtbmV4dHN3YXAoMCwgMSk7CisJCWlmIChtbmV4dHNpemUoMSkgPCBtbmV4dHNpemUoMikpIG1uZXh0c3dhcCgxLCAyKTsKKwkJaWYgKG1uZXh0c2l6ZSgwKSA8IG1uZXh0c2l6ZSgxKSkgbW5leHRzd2FwKDAsIDEpOworCisJCUFzc2VydEQgKG1uZXh0c2l6ZSgwKSA+PSBtbmV4dHNpemUoMSksICJtYWluUVNvcnQzKDgpIik7CisJCUFzc2VydEQgKG1uZXh0c2l6ZSgxKSA+PSBtbmV4dHNpemUoMiksICJtYWluUVNvcnQzKDkpIik7CisKKwkJbXB1c2gobmV4dExvWzBdLCBuZXh0SGlbMF0sIG5leHREWzBdKTsKKwkJbXB1c2gobmV4dExvWzFdLCBuZXh0SGlbMV0sIG5leHREWzFdKTsKKwkJbXB1c2gobmV4dExvWzJdLCBuZXh0SGlbMl0sIG5leHREWzJdKTsKKwl9Cit9CisKKyN1bmRlZiBtcHVzaAorI3VuZGVmIG1wb3AKKyN1bmRlZiBtbmV4dHNpemUKKyN1bmRlZiBtbmV4dHN3YXAKKyN1bmRlZiBNQUlOX1FTT1JUX1NNQUxMX1RIUkVTSAorI3VuZGVmIE1BSU5fUVNPUlRfREVQVEhfVEhSRVNICisjdW5kZWYgTUFJTl9RU09SVF9TVEFDS19TSVpFCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogUHJlOgorICoJbmJsb2NrID4gTl9PVkVSU0hPT1QKKyAqCWJsb2NrMzIgZXhpc3RzIGZvciBbMCAuLiBuYmxvY2stMSArTl9PVkVSU0hPT1RdCisgKgkoKHVpbnQ4X3QqKWJsb2NrMzIpIFswIC4uIG5ibG9jay0xXSBob2xkcyBibG9jaworICoJcHRyIGV4aXN0cyBmb3IgWzAgLi4gbmJsb2NrLTFdCisgKgorICogUG9zdDoKKyAqCSgodWludDhfdCopYmxvY2szMikgWzAgLi4gbmJsb2NrLTFdIGhvbGRzIGJsb2NrCisgKglBbGwgb3RoZXIgYXJlYXMgb2YgYmxvY2szMiBkZXN0cm95ZWQKKyAqCWZ0YWJbMCAuLiA2NTUzNl0gZGVzdHJveWVkCisgKglwdHIgWzAgLi4gbmJsb2NrLTFdIGhvbGRzIHNvcnRlZCBvcmRlcgorICoJaWYgKCpidWRnZXQgPCAwKSwgc29ydGluZyB3YXMgYWJhbmRvbmVkCisgKi8KKworI2RlZmluZSBCSUdGUkVRKGIpIChmdGFiWygoYikrMSkgPDwgOF0gLSBmdGFiWyhiKSA8PCA4XSkKKyNkZWZpbmUgU0VUTUFTSyAoMSA8PCAyMSkKKyNkZWZpbmUgQ0xFQVJNQVNLICh+KFNFVE1BU0spKQorCitzdGF0aWMgTk9JTkxJTkUKK3ZvaWQgbWFpblNvcnQoRVN0YXRlKiBzdGF0ZSwKKwkJdWludDMyX3QqIHB0ciwKKwkJdWludDhfdCogIGJsb2NrLAorCQl1aW50MTZfdCogcXVhZHJhbnQsCisJCXVpbnQzMl90KiBmdGFiLAorCQlpbnQzMl90ICAgbmJsb2NrLAorCQlpbnQzMl90KiAgYnVkZ2V0KQoreworCWludDMyX3QgIGksIGosIGssIHNzLCBzYjsKKwl1aW50OF90ICBjMTsKKwlpbnQzMl90ICBudW1RU29ydGVkOworCXVpbnQxNl90IHM7CisJQm9vbCAgICAgYmlnRG9uZVsyNTZdOworCS8qIGJib3g6IG1vdmVkIHRvIEVTdGF0ZSB0byBzYXZlIHN0YWNrCisJaW50MzJfdCAgcnVubmluZ09yZGVyWzI1Nl07CisJaW50MzJfdCAgY29weVN0YXJ0WzI1Nl07CisJaW50MzJfdCAgY29weUVuZCAgWzI1Nl07CisJKi8KKyNkZWZpbmUgcnVubmluZ09yZGVyIChzdGF0ZS0+bWFpblNvcnRfX3J1bm5pbmdPcmRlcikKKyNkZWZpbmUgY29weVN0YXJ0ICAgIChzdGF0ZS0+bWFpblNvcnRfX2NvcHlTdGFydCkKKyNkZWZpbmUgY29weUVuZCAgICAgIChzdGF0ZS0+bWFpblNvcnRfX2NvcHlFbmQpCisKKwkvKi0tIHNldCB1cCB0aGUgMi1ieXRlIGZyZXF1ZW5jeSB0YWJsZSAtLSovCisJLyogd2FzOiBmb3IgKGkgPSA2NTUzNjsgaSA+PSAwOyBpLS0pIGZ0YWJbaV0gPSAwOyAqLworCW1lbXNldChmdGFiLCAwLCA2NTUzNyAqIHNpemVvZihmdGFiWzBdKSk7CisKKwlqID0gYmxvY2tbMF0gPDwgODsKKwlpID0gbmJsb2NrIC0gMTsKKy8qIDMlLCArMzAwIGJ5dGVzICovCisjaWYgQ09ORklHX0JaSVAyX0ZBU1QgPj0gMgorCWZvciAoOyBpID49IDM7IGkgLT0gNCkgeworCQlxdWFkcmFudFtpXSA9IDA7CisJCWogPSAoaiA+PiA4KSB8ICgoKHVpbnQxNl90KWJsb2NrW2ldKSA8PCA4KTsKKwkJZnRhYltqXSsrOworCQlxdWFkcmFudFtpLTFdID0gMDsKKwkJaiA9IChqID4+IDgpIHwgKCgodWludDE2X3QpYmxvY2tbaS0xXSkgPDwgOCk7CisJCWZ0YWJbal0rKzsKKwkJcXVhZHJhbnRbaS0yXSA9IDA7CisJCWogPSAoaiA+PiA4KSB8ICgoKHVpbnQxNl90KWJsb2NrW2ktMl0pIDw8IDgpOworCQlmdGFiW2pdKys7CisJCXF1YWRyYW50W2ktM10gPSAwOworCQlqID0gKGogPj4gOCkgfCAoKCh1aW50MTZfdClibG9ja1tpLTNdKSA8PCA4KTsKKwkJZnRhYltqXSsrOworCX0KKyNlbmRpZgorCWZvciAoOyBpID49IDA7IGktLSkgeworCQlxdWFkcmFudFtpXSA9IDA7CisJCWogPSAoaiA+PiA4KSB8ICgoKHVpbnQxNl90KWJsb2NrW2ldKSA8PCA4KTsKKwkJZnRhYltqXSsrOworCX0KKworCS8qLS0gKGVtcGhhc2lzZXMgY2xvc2UgcmVsYXRpb25zaGlwIG9mIGJsb2NrICYgcXVhZHJhbnQpIC0tKi8KKwlmb3IgKGkgPSAwOyBpIDwgQlpfTl9PVkVSU0hPT1Q7IGkrKykgeworCQlibG9jayAgIFtuYmxvY2sraV0gPSBibG9ja1tpXTsKKwkJcXVhZHJhbnRbbmJsb2NrK2ldID0gMDsKKwl9CisKKwkvKi0tIENvbXBsZXRlIHRoZSBpbml0aWFsIHJhZGl4IHNvcnQgLS0qLworCWogPSBmdGFiWzBdOyAvKiBiYm94OiBvcHRpbWl6ZWQgKi8KKwlmb3IgKGkgPSAxOyBpIDw9IDY1NTM2OyBpKyspIHsKKwkJaiArPSBmdGFiW2ldOworCQlmdGFiW2ldID0gajsKKwl9CisKKwlzID0gYmxvY2tbMF0gPDwgODsKKwlpID0gbmJsb2NrIC0gMTsKKyNpZiBDT05GSUdfQlpJUDJfRkFTVCA+PSAyCisJZm9yICg7IGkgPj0gMzsgaSAtPSA0KSB7CisJCXMgPSAocyA+PiA4KSB8IChibG9ja1tpXSA8PCA4KTsKKwkJaiA9IGZ0YWJbc10gLSAxOworCQlmdGFiW3NdID0gajsKKwkJcHRyW2pdID0gaTsKKwkJcyA9IChzID4+IDgpIHwgKGJsb2NrW2ktMV0gPDwgOCk7CisJCWogPSBmdGFiW3NdIC0gMTsKKwkJZnRhYltzXSA9IGo7CisJCXB0cltqXSA9IGktMTsKKwkJcyA9IChzID4+IDgpIHwgKGJsb2NrW2ktMl0gPDwgOCk7CisJCWogPSBmdGFiW3NdIC0gMTsKKwkJZnRhYltzXSA9IGo7CisJCXB0cltqXSA9IGktMjsKKwkJcyA9IChzID4+IDgpIHwgKGJsb2NrW2ktM10gPDwgOCk7CisJCWogPSBmdGFiW3NdIC0gMTsKKwkJZnRhYltzXSA9IGo7CisJCXB0cltqXSA9IGktMzsKKwl9CisjZW5kaWYKKwlmb3IgKDsgaSA+PSAwOyBpLS0pIHsKKwkJcyA9IChzID4+IDgpIHwgKGJsb2NrW2ldIDw8IDgpOworCQlqID0gZnRhYltzXSAtIDE7CisJCWZ0YWJbc10gPSBqOworCQlwdHJbal0gPSBpOworCX0KKworCS8qCisJICogTm93IGZ0YWIgY29udGFpbnMgdGhlIGZpcnN0IGxvYyBvZiBldmVyeSBzbWFsbCBidWNrZXQuCisJICogQ2FsY3VsYXRlIHRoZSBydW5uaW5nIG9yZGVyLCBmcm9tIHNtYWxsZXN0IHRvIGxhcmdlc3QKKwkgKiBiaWcgYnVja2V0LgorCSAqLworCWZvciAoaSA9IDA7IGkgPD0gMjU1OyBpKyspIHsKKwkJYmlnRG9uZSAgICAgW2ldID0gRmFsc2U7CisJCXJ1bm5pbmdPcmRlcltpXSA9IGk7CisJfQorCisJeworCQlpbnQzMl90IHZ2OworCQkvKiBiYm94OiB3YXM6IGludDMyX3QgaCA9IDE7ICovCisJCS8qIGRvIGggPSAzICogaCArIDE7IHdoaWxlIChoIDw9IDI1Nik7ICovCisJCXVpbnQzMl90IGggPSAzNjQ7CisKKwkJZG8geworCQkJLypoID0gaCAvIDM7Ki8KKwkJCWggPSAoaCAqIDE3MSkgPj4gOTsgLyogYmJveDogZmFzdCBoLzMgKi8KKwkJCWZvciAoaSA9IGg7IGkgPD0gMjU1OyBpKyspIHsKKwkJCQl2diA9IHJ1bm5pbmdPcmRlcltpXTsKKwkJCQlqID0gaTsKKwkJCQl3aGlsZSAoQklHRlJFUShydW5uaW5nT3JkZXJbai1oXSkgPiBCSUdGUkVRKHZ2KSkgeworCQkJCQlydW5uaW5nT3JkZXJbal0gPSBydW5uaW5nT3JkZXJbai1oXTsKKwkJCQkJaiA9IGogLSBoOworCQkJCQlpZiAoaiA8PSAoaCAtIDEpKQorCQkJCQkJZ290byB6ZXJvOworCQkJCX0KKyB6ZXJvOgorCQkJCXJ1bm5pbmdPcmRlcltqXSA9IHZ2OworCQkJfQorCQl9IHdoaWxlIChoICE9IDEpOworCX0KKworCS8qCisJICogVGhlIG1haW4gc29ydGluZyBsb29wLgorCSAqLworCisJbnVtUVNvcnRlZCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDw9IDI1NTsgaSsrKSB7CisKKwkJLyoKKwkJICogUHJvY2VzcyBiaWcgYnVja2V0cywgc3RhcnRpbmcgd2l0aCB0aGUgbGVhc3QgZnVsbC4KKwkJICogQmFzaWNhbGx5IHRoaXMgaXMgYSAzLXN0ZXAgcHJvY2VzcyBpbiB3aGljaCB3ZSBjYWxsCisJCSAqIG1haW5RU29ydDMgdG8gc29ydCB0aGUgc21hbGwgYnVja2V0cyBbc3MsIGpdLCBidXQKKwkJICogYWxzbyBtYWtlIGEgYmlnIGVmZm9ydCB0byBhdm9pZCB0aGUgY2FsbHMgaWYgd2UgY2FuLgorCQkgKi8KKwkJc3MgPSBydW5uaW5nT3JkZXJbaV07CisKKwkJLyoKKwkJICogU3RlcCAxOgorCQkgKiBDb21wbGV0ZSB0aGUgYmlnIGJ1Y2tldCBbc3NdIGJ5IHF1aWNrc29ydGluZworCQkgKiBhbnkgdW5zb3J0ZWQgc21hbGwgYnVja2V0cyBbc3MsIGpdLCBmb3IgaiAhPSBzcy4KKwkJICogSG9wZWZ1bGx5IHByZXZpb3VzIHBvaW50ZXItc2Nhbm5pbmcgcGhhc2VzIGhhdmUgYWxyZWFkeQorCQkgKiBjb21wbGV0ZWQgbWFueSBvZiB0aGUgc21hbGwgYnVja2V0cyBbc3MsIGpdLCBzbworCQkgKiB3ZSBkb24ndCBoYXZlIHRvIHNvcnQgdGhlbSBhdCBhbGwuCisJCSAqLworCQlmb3IgKGogPSAwOyBqIDw9IDI1NTsgaisrKSB7CisJCQlpZiAoaiAhPSBzcykgeworCQkJCXNiID0gKHNzIDw8IDgpICsgajsKKwkJCQlpZiAoIShmdGFiW3NiXSAmIFNFVE1BU0spKSB7CisJCQkJCWludDMyX3QgbG8gPSAgZnRhYltzYl0gICAmIENMRUFSTUFTSzsKKwkJCQkJaW50MzJfdCBoaSA9IChmdGFiW3NiKzFdICYgQ0xFQVJNQVNLKSAtIDE7CisJCQkJCWlmIChoaSA+IGxvKSB7CisJCQkJCQltYWluUVNvcnQzKAorCQkJCQkJCXB0ciwgYmxvY2ssIHF1YWRyYW50LCBuYmxvY2ssCisJCQkJCQkJbG8sIGhpLCBCWl9OX1JBRElYLCBidWRnZXQKKwkJCQkJCSk7CisJCQkJCQlpZiAoKmJ1ZGdldCA8IDApIHJldHVybjsKKwkJCQkJCW51bVFTb3J0ZWQgKz0gKGhpIC0gbG8gKyAxKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlmdGFiW3NiXSB8PSBTRVRNQVNLOworCQkJfQorCQl9CisKKwkJQXNzZXJ0SCghYmlnRG9uZVtzc10sIDEwMDYpOworCisJCS8qCisJCSAqIFN0ZXAgMjoKKwkJICogTm93IHNjYW4gdGhpcyBiaWcgYnVja2V0IFtzc10gc28gYXMgdG8gc3ludGhlc2lzZSB0aGUKKwkJICogc29ydGVkIG9yZGVyIGZvciBzbWFsbCBidWNrZXRzIFt0LCBzc10gZm9yIGFsbCB0LAorCQkgKiBpbmNsdWRpbmcsIG1hZ2ljYWxseSwgdGhlIGJ1Y2tldCBbc3Msc3NdIHRvby4KKwkJICogVGhpcyB3aWxsIGF2b2lkIGRvaW5nIFJlYWwgV29yayBpbiBzdWJzZXF1ZW50IFN0ZXAgMSdzLgorCQkgKi8KKwkJeworCQkJZm9yIChqID0gMDsgaiA8PSAyNTU7IGorKykgeworCQkJCWNvcHlTdGFydFtqXSA9ICBmdGFiWyhqIDw8IDgpICsgc3NdICAgICAmIENMRUFSTUFTSzsKKwkJCQljb3B5RW5kICBbal0gPSAoZnRhYlsoaiA8PCA4KSArIHNzICsgMV0gJiBDTEVBUk1BU0spIC0gMTsKKwkJCX0KKwkJCWZvciAoaiA9IGZ0YWJbc3MgPDwgOF0gJiBDTEVBUk1BU0s7IGogPCBjb3B5U3RhcnRbc3NdOyBqKyspIHsKKwkJCQlrID0gcHRyW2pdIC0gMTsKKwkJCQlpZiAoayA8IDApCisJCQkJCWsgKz0gbmJsb2NrOworCQkJCWMxID0gYmxvY2tba107CisJCQkJaWYgKCFiaWdEb25lW2MxXSkKKwkJCQkJcHRyW2NvcHlTdGFydFtjMV0rK10gPSBrOworCQkJfQorCQkJZm9yIChqID0gKGZ0YWJbKHNzKzEpIDw8IDhdICYgQ0xFQVJNQVNLKSAtIDE7IGogPiBjb3B5RW5kW3NzXTsgai0tKSB7CisJCQkJayA9IHB0cltqXS0xOworCQkJCWlmIChrIDwgMCkKKwkJCQkJayArPSBuYmxvY2s7CisJCQkJYzEgPSBibG9ja1trXTsKKwkJCQlpZiAoIWJpZ0RvbmVbYzFdKQorCQkJCQlwdHJbY29weUVuZFtjMV0tLV0gPSBrOworCQkJfQorCQl9CisKKwkJLyogRXh0cmVtZWx5IHJhcmUgY2FzZSBtaXNzaW5nIGluIGJ6aXAyLTEuMC4wIGFuZCAxLjAuMS4KKwkJICogTmVjZXNzaXR5IGZvciB0aGlzIGNhc2UgaXMgZGVtb25zdHJhdGVkIGJ5IGNvbXByZXNzaW5nCisJCSAqIGEgc2VxdWVuY2Ugb2YgYXBwcm94aW1hdGVseSA0OC41IG1pbGxpb24gb2YgY2hhcmFjdGVyCisJCSAqIDI1MTsgMS4wLjAvMS4wLjEgd2lsbCB0aGVuIGRpZSBoZXJlLiAqLworCQlBc3NlcnRIKChjb3B5U3RhcnRbc3NdLTEgPT0gY29weUVuZFtzc10pIFwKKwkJICAgICB8fCAoY29weVN0YXJ0W3NzXSA9PSAwICYmIGNvcHlFbmRbc3NdID09IG5ibG9jay0xKSwgMTAwNyk7CisKKwkJZm9yIChqID0gMDsgaiA8PSAyNTU7IGorKykKKwkJCWZ0YWJbKGogPDwgOCkgKyBzc10gfD0gU0VUTUFTSzsKKworCQkvKgorCQkgKiBTdGVwIDM6CisJCSAqIFRoZSBbc3NdIGJpZyBidWNrZXQgaXMgbm93IGRvbmUuICBSZWNvcmQgdGhpcyBmYWN0LAorCQkgKiBhbmQgdXBkYXRlIHRoZSBxdWFkcmFudCBkZXNjcmlwdG9ycy4gIFJlbWVtYmVyIHRvCisJCSAqIHVwZGF0ZSBxdWFkcmFudHMgaW4gdGhlIG92ZXJzaG9vdCBhcmVhIHRvbywgaWYKKwkJICogbmVjZXNzYXJ5LiAgVGhlICJpZiAoaSA8IDI1NSkiIHRlc3QgbWVyZWx5IHNraXBzCisJCSAqIHRoaXMgdXBkYXRpbmcgZm9yIHRoZSBsYXN0IGJ1Y2tldCBwcm9jZXNzZWQsIHNpbmNlCisJCSAqIHVwZGF0aW5nIGZvciB0aGUgbGFzdCBidWNrZXQgaXMgcG9pbnRsZXNzLgorCQkgKgorCQkgKiBUaGUgcXVhZHJhbnQgYXJyYXkgcHJvdmlkZXMgYSB3YXkgdG8gaW5jcmVtZW50YWxseQorCQkgKiBjYWNoZSBzb3J0IG9yZGVyaW5ncywgYXMgdGhleSBhcHBlYXIsIHNvIGFzIHRvCisJCSAqIG1ha2Ugc3Vic2VxdWVudCBjb21wYXJpc29ucyBpbiBmdWxsR3RVKCkgY29tcGxldGUKKwkJICogZmFzdGVyLiAgRm9yIHJlcGV0aXRpdmUgYmxvY2tzIHRoaXMgbWFrZXMgYSBiaWcKKwkJICogZGlmZmVyZW5jZSAoYnV0IG5vdCBiaWcgZW5vdWdoIHRvIGJlIGFibGUgdG8gYXZvaWQKKwkJICogdGhlIGZhbGxiYWNrIHNvcnRpbmcgbWVjaGFuaXNtLCBleHBvbmVudGlhbCByYWRpeCBzb3J0KS4KKwkJICoKKwkJICogVGhlIHByZWNpc2UgbWVhbmluZyBpczogYXQgYWxsIHRpbWVzOgorCQkgKgorCQkgKglmb3IgMCA8PSBpIDwgbmJsb2NrIGFuZCAwIDw9IGogPD0gbmJsb2NrCisJCSAqCisJCSAqCWlmIGJsb2NrW2ldICE9IGJsb2NrW2pdLAorCQkgKgorCQkgKgkJdGhlbiB0aGUgcmVsYXRpdmUgdmFsdWVzIG9mIHF1YWRyYW50W2ldIGFuZAorCQkgKgkJCSAgcXVhZHJhbnRbal0gYXJlIG1lYW5pbmdsZXNzLgorCQkgKgorCQkgKgkJZWxzZSB7CisJCSAqCQkJaWYgcXVhZHJhbnRbaV0gPCBxdWFkcmFudFtqXQorCQkgKgkJCQl0aGVuIHRoZSBzdHJpbmcgc3RhcnRpbmcgYXQgaSBsZXhpY29ncmFwaGljYWxseQorCQkgKgkJCQlwcmVjZWRlcyB0aGUgc3RyaW5nIHN0YXJ0aW5nIGF0IGoKKwkJICoKKwkJICoJCQllbHNlIGlmIHF1YWRyYW50W2ldID4gcXVhZHJhbnRbal0KKwkJICoJCQkJdGhlbiB0aGUgc3RyaW5nIHN0YXJ0aW5nIGF0IGogbGV4aWNvZ3JhcGhpY2FsbHkKKwkJICoJCQkJcHJlY2VkZXMgdGhlIHN0cmluZyBzdGFydGluZyBhdCBpCisJCSAqCisJCSAqCQkJZWxzZQorCQkgKgkJCQl0aGUgcmVsYXRpdmUgb3JkZXJpbmcgb2YgdGhlIHN0cmluZ3Mgc3RhcnRpbmcKKwkJICoJCQkJYXQgaSBhbmQgaiBoYXMgbm90IHlldCBiZWVuIGRldGVybWluZWQuCisJCSAqCQl9CisJCSAqLworCQliaWdEb25lW3NzXSA9IFRydWU7CisKKwkJaWYgKGkgPCAyNTUpIHsKKwkJCWludDMyX3QgYmJTdGFydCA9IGZ0YWJbc3MgPDwgOF0gJiBDTEVBUk1BU0s7CisJCQlpbnQzMl90IGJiU2l6ZSAgPSAoZnRhYlsoc3MrMSkgPDwgOF0gJiBDTEVBUk1BU0spIC0gYmJTdGFydDsKKwkJCWludDMyX3Qgc2hpZnRzICA9IDA7CisKKwkJCXdoaWxlICgoYmJTaXplID4+IHNoaWZ0cykgPiA2NTUzNCkgc2hpZnRzKys7CisKKwkJCWZvciAoaiA9IGJiU2l6ZS0xOyBqID49IDA7IGotLSkgeworCQkJCWludDMyX3QgYTJ1cGRhdGUgICA9IHB0cltiYlN0YXJ0ICsgal07CisJCQkJdWludDE2X3QgcVZhbCAgICAgID0gKHVpbnQxNl90KShqID4+IHNoaWZ0cyk7CisJCQkJcXVhZHJhbnRbYTJ1cGRhdGVdID0gcVZhbDsKKwkJCQlpZiAoYTJ1cGRhdGUgPCBCWl9OX09WRVJTSE9PVCkKKwkJCQkJcXVhZHJhbnRbYTJ1cGRhdGUgKyBuYmxvY2tdID0gcVZhbDsKKwkJCX0KKwkJCUFzc2VydEgoKChiYlNpemUtMSkgPj4gc2hpZnRzKSA8PSA2NTUzNSwgMTAwMik7CisJCX0KKwl9CisjdW5kZWYgcnVubmluZ09yZGVyCisjdW5kZWYgY29weVN0YXJ0CisjdW5kZWYgY29weUVuZAorfQorCisjdW5kZWYgQklHRlJFUQorI3VuZGVmIFNFVE1BU0sKKyN1bmRlZiBDTEVBUk1BU0sKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBQcmU6CisgKgluYmxvY2sgPiAwCisgKglhcnIyIGV4aXN0cyBmb3IgWzAgLi4gbmJsb2NrLTEgK05fT1ZFUlNIT09UXQorICoJICAoKHVpbnQ4X3QqKWFycjIpWzAgLi4gbmJsb2NrLTFdIGhvbGRzIGJsb2NrCisgKglhcnIxIGV4aXN0cyBmb3IgWzAgLi4gbmJsb2NrLTFdCisgKgorICogUG9zdDoKKyAqCSgodWludDhfdCopYXJyMikgWzAgLi4gbmJsb2NrLTFdIGhvbGRzIGJsb2NrCisgKglBbGwgb3RoZXIgYXJlYXMgb2YgYmxvY2sgZGVzdHJveWVkCisgKglmdGFiWzAgLi4gNjU1MzZdIGRlc3Ryb3llZAorICoJYXJyMVswIC4uIG5ibG9jay0xXSBob2xkcyBzb3J0ZWQgb3JkZXIKKyAqLworc3RhdGljIE5PSU5MSU5FCit2b2lkIEJaMl9ibG9ja1NvcnQoRVN0YXRlKiBzKQoreworCS8qIEluIG9yaWdpbmFsIGJ6aXAyIDEuMC40LCBpdCdzIGEgcGFyYW1ldGVyLCBidXQgMzAKKwkgKiAod2hpY2ggd2FzIHRoZSBkZWZhdWx0KSBzaG91bGQgd29yayBvay4gKi8KKwllbnVtIHsgd2ZhY3QgPSAzMCB9OworCisJdWludDMyX3QqIHB0ciAgICA9IHMtPnB0cjsKKwl1aW50OF90KiAgYmxvY2sgID0gcy0+YmxvY2s7CisJdWludDMyX3QqIGZ0YWIgICA9IHMtPmZ0YWI7CisJaW50MzJfdCAgIG5ibG9jayA9IHMtPm5ibG9jazsKKwl1aW50MTZfdCogcXVhZHJhbnQ7CisJaW50MzJfdCAgIGJ1ZGdldDsKKwlpbnQzMl90ICAgaTsKKworCWlmIChuYmxvY2sgPCAxMDAwMCkgeworCQlmYWxsYmFja1NvcnQocy0+YXJyMSwgcy0+YXJyMiwgZnRhYiwgbmJsb2NrKTsKKwl9IGVsc2UgeworCQkvKiBDYWxjdWxhdGUgdGhlIGxvY2F0aW9uIGZvciBxdWFkcmFudCwgcmVtZW1iZXJpbmcgdG8gZ2V0CisJCSAqIHRoZSBhbGlnbm1lbnQgcmlnaHQuICBBc3N1bWVzIHRoYXQgJihibG9ja1swXSkgaXMgYXQgbGVhc3QKKwkJICogMi1ieXRlIGFsaWduZWQgLS0gdGhpcyBzaG91bGQgYmUgb2sgc2luY2UgYmxvY2sgaXMgcmVhbGx5CisJCSAqIHRoZSBmaXJzdCBzZWN0aW9uIG9mIGFycjIuCisJCSAqLworCQlpID0gbmJsb2NrICsgQlpfTl9PVkVSU0hPT1Q7CisJCWlmIChpICYgMSkgaSsrOworCQlxdWFkcmFudCA9ICh1aW50MTZfdCopKCYoYmxvY2tbaV0pKTsKKworCQkvKiAod2ZhY3QtMSkgLyAzIHB1dHMgdGhlIGRlZmF1bHQtZmFjdG9yLTMwCisJCSAqIHRyYW5zaXRpb24gcG9pbnQgYXQgdmVyeSByb3VnaGx5IHRoZSBzYW1lIHBsYWNlIGFzCisJCSAqIHdpdGggdjAuMSBhbmQgdjAuOS4wLgorCQkgKiBOb3QgdGhhdCBpdCBwYXJ0aWN1bGFybHkgbWF0dGVycyBhbnkgbW9yZSwgc2luY2UgdGhlCisJCSAqIHJlc3VsdGluZyBjb21wcmVzc2VkIHN0cmVhbSBpcyBub3cgdGhlIHNhbWUgcmVnYXJkbGVzcworCQkgKiBvZiB3aGV0aGVyIG9yIG5vdCB3ZSB1c2UgdGhlIG1haW4gc29ydCBvciBmYWxsYmFjayBzb3J0LgorCQkgKi8KKwkJYnVkZ2V0ID0gbmJsb2NrICogKCh3ZmFjdC0xKSAvIDMpOworCisJCW1haW5Tb3J0KHMsIHB0ciwgYmxvY2ssIHF1YWRyYW50LCBmdGFiLCBuYmxvY2ssICZidWRnZXQpOworCQlpZiAoYnVkZ2V0IDwgMCkgeworCQkJZmFsbGJhY2tTb3J0KHMtPmFycjEsIHMtPmFycjIsIGZ0YWIsIG5ibG9jayk7CisJCX0KKwl9CisKKwlzLT5vcmlnUHRyID0gLTE7CisJZm9yIChpID0gMDsgaSA8IHMtPm5ibG9jazsgaSsrKQorCQlpZiAocHRyW2ldID09IDApIHsKKwkJCXMtPm9yaWdQdHIgPSBpOworCQkJYnJlYWs7CisJCX07CisKKwlBc3NlcnRIKHMtPm9yaWdQdHIgIT0gLTEsIDEwMDMpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9ja3NvcnQuYyAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovYnpsaWIuYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovYnpsaWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjdkYjc0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9iemxpYi5jCkBAIC0wLDAgKzEsNDI5IEBACisvKgorICogYnppcDIgaXMgd3JpdHRlbiBieSBKdWxpYW4gU2V3YXJkIDxqc2V3YXJkQGJ6aXAub3JnPi4KKyAqIEFkYXB0ZWQgZm9yIGJ1c3lib3ggYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4uCisgKiBTZWUgUkVBRE1FIGFuZCBMSUNFTlNFIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBMaWJyYXJ5IHRvcC1sZXZlbCBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0qLworLyotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ6bGliLmMgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhpcyBmaWxlIGlzIHBhcnQgb2YgYnppcDIvbGliYnppcDIsIGEgcHJvZ3JhbSBhbmQgbGlicmFyeSBmb3IKK2xvc3NsZXNzLCBibG9jay1zb3J0aW5nIGRhdGEgY29tcHJlc3Npb24uCisKK2J6aXAyL2xpYmJ6aXAyIHZlcnNpb24gMS4wLjQgb2YgMjAgRGVjZW1iZXIgMjAwNgorQ29weXJpZ2h0IChDKSAxOTk2LTIwMDYgSnVsaWFuIFNld2FyZCA8anNld2FyZEBiemlwLm9yZz4KKworUGxlYXNlIHJlYWQgdGhlIFdBUk5JTkcsIERJU0NMQUlNRVIgYW5kIFBBVEVOVFMgc2VjdGlvbnMgaW4gdGhlCitSRUFETUUgZmlsZS4KKworVGhpcyBwcm9ncmFtIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgbGljZW5zZSBjb250YWluZWQKK2luIHRoZSBmaWxlIExJQ0VOU0UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQ0hBTkdFUworICogMC45LjAgICAgLS0gb3JpZ2luYWwgdmVyc2lvbi4KKyAqIDAuOS4wYS9iIC0tIG5vIGNoYW5nZXMgaW4gdGhpcyBmaWxlLgorICogMC45LjBjICAgLS0gbWFkZSB6ZXJvLWxlbmd0aCBCWl9GTFVTSCB3b3JrIGNvcnJlY3RseSBpbiBiekNvbXByZXNzKCkuCisgKiAgICAgICAgICAgICBmaXhlZCBieldyaXRlL2J6UmVhZCB0byBpZ25vcmUgemVyby1sZW5ndGggcmVxdWVzdHMuCisgKiAgICAgICAgICAgICBmaXhlZCBienJlYWQgdG8gY29ycmVjdGx5IGhhbmRsZSByZWFkIHJlcXVlc3RzIGFmdGVyIEVPRi4KKyAqICAgICAgICAgICAgIHdyb25nIHBhcmFtZXRlciBvcmRlciBpbiBjYWxsIHRvIGJ6RGVjb21wcmVzc0luaXQgaW4KKyAqICAgICAgICAgICAgIGJ6QnVmZlRvQnVmZkRlY29tcHJlc3MuICBGaXhlZC4KKyAqLworCisvKiAjaW5jbHVkZSAiYnpsaWJfcHJpdmF0ZS5oIiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBDb21wcmVzc2lvbiBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpZiBCWl9MSUdIVF9ERUJVRworc3RhdGljCit2b2lkIGJ6X2Fzc2VydF9mYWlsKGludCBlcnJjb2RlKQoreworCS8qIGlmIChlcnJjb2RlID09IDEwMDcpIGJiX2Vycm9yX21zZ19hbmRfZGllKCJwcm9iYWJseSBiYWQgUkFNIik7ICovCisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludGVybmFsIGVycm9yICVkIiwgZXJyY29kZSk7Cit9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCit2b2lkIHByZXBhcmVfbmV3X2Jsb2NrKEVTdGF0ZSogcykKK3sKKwlpbnQgaTsKKwlzLT5uYmxvY2sgPSAwOworCXMtPm51bVogPSAwOworCXMtPnN0YXRlX291dF9wb3MgPSAwOworCUJaX0lOSVRJQUxJU0VfQ1JDKHMtPmJsb2NrQ1JDKTsKKwkvKiBpbmxpbmVkIG1lbXNldCB3b3VsZCBiZSBuaWNlIHRvIGhhdmUgaGVyZSAqLworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJcy0+aW5Vc2VbaV0gPSAwOworCXMtPmJsb2NrTm8rKzsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK0FMV0FZU19JTkxJTkUKK3ZvaWQgaW5pdF9STChFU3RhdGUqIHMpCit7CisJcy0+c3RhdGVfaW5fY2ggPSAyNTY7CisJcy0+c3RhdGVfaW5fbGVuID0gMDsKK30KKworCitzdGF0aWMKK2ludCBpc2VtcHR5X1JMKEVTdGF0ZSogcykKK3sKKwlyZXR1cm4gKHMtPnN0YXRlX2luX2NoID49IDI1NiB8fCBzLT5zdGF0ZV9pbl9sZW4gPD0gMCk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCit2b2lkIEJaMl9iekNvbXByZXNzSW5pdChiel9zdHJlYW0gKnN0cm0sIGludCBibG9ja1NpemUxMDBrKQoreworCWludDMyX3QgbjsKKwlFU3RhdGUqIHM7CisKKwlzID0geHphbGxvYyhzaXplb2YoRVN0YXRlKSk7CisJcy0+c3RybSA9IHN0cm07CisKKwluICAgICAgICA9IDEwMDAwMCAqIGJsb2NrU2l6ZTEwMGs7CisJcy0+YXJyMSAgPSB4bWFsbG9jKG4gICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKHVpbnQzMl90KSk7CisJcy0+bXRmdiAgPSAodWludDE2X3QqKXMtPmFycjE7CisJcy0+cHRyICAgPSAodWludDMyX3QqKXMtPmFycjE7CisJcy0+YXJyMiAgPSB4bWFsbG9jKChuICsgQlpfTl9PVkVSU0hPT1QpICogc2l6ZW9mKHVpbnQzMl90KSk7CisJcy0+YmxvY2sgPSAodWludDhfdCopcy0+YXJyMjsKKwlzLT5mdGFiICA9IHhtYWxsb2MoNjU1MzcgICAgICAgICAgICAgICAgKiBzaXplb2YodWludDMyX3QpKTsKKworCXMtPmNyYzMydGFibGUgPSBjcmMzMl9maWxsdGFibGUoTlVMTCwgMSk7CisKKwlzLT5zdGF0ZSAgICAgICAgICAgICA9IEJaX1NfSU5QVVQ7CisJcy0+bW9kZSAgICAgICAgICAgICAgPSBCWl9NX1JVTk5JTkc7CisJcy0+YmxvY2tTaXplMTAwayAgICAgPSBibG9ja1NpemUxMDBrOworCXMtPm5ibG9ja01BWCAgICAgICAgID0gbiAtIDE5OworCisJc3RybS0+c3RhdGUgICAgICAgICAgPSBzOworCS8qc3RybS0+dG90YWxfaW4gICAgID0gMDsqLworCXN0cm0tPnRvdGFsX291dCAgICAgID0gMDsKKwlpbml0X1JMKHMpOworCXByZXBhcmVfbmV3X2Jsb2NrKHMpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwordm9pZCBhZGRfcGFpcl90b19ibG9jayhFU3RhdGUqIHMpCit7CisJaW50MzJfdCBpOworCXVpbnQ4X3QgY2ggPSAodWludDhfdCkocy0+c3RhdGVfaW5fY2gpOworCWZvciAoaSA9IDA7IGkgPCBzLT5zdGF0ZV9pbl9sZW47IGkrKykgeworCQlCWl9VUERBVEVfQ1JDKHMsIHMtPmJsb2NrQ1JDLCBjaCk7CisJfQorCXMtPmluVXNlW3MtPnN0YXRlX2luX2NoXSA9IDE7CisJc3dpdGNoIChzLT5zdGF0ZV9pbl9sZW4pIHsKKwkJY2FzZSAzOgorCQkJcy0+YmxvY2tbcy0+bmJsb2NrXSA9ICh1aW50OF90KWNoOyBzLT5uYmxvY2srKzsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIDI6CisJCQlzLT5ibG9ja1tzLT5uYmxvY2tdID0gKHVpbnQ4X3QpY2g7IHMtPm5ibG9jaysrOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgMToKKwkJCXMtPmJsb2NrW3MtPm5ibG9ja10gPSAodWludDhfdCljaDsgcy0+bmJsb2NrKys7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXMtPmluVXNlW3MtPnN0YXRlX2luX2xlbiAtIDRdID0gMTsKKwkJCXMtPmJsb2NrW3MtPm5ibG9ja10gPSAodWludDhfdCljaDsgcy0+bmJsb2NrKys7CisJCQlzLT5ibG9ja1tzLT5uYmxvY2tdID0gKHVpbnQ4X3QpY2g7IHMtPm5ibG9jaysrOworCQkJcy0+YmxvY2tbcy0+bmJsb2NrXSA9ICh1aW50OF90KWNoOyBzLT5uYmxvY2srKzsKKwkJCXMtPmJsb2NrW3MtPm5ibG9ja10gPSAodWludDhfdCljaDsgcy0+bmJsb2NrKys7CisJCQlzLT5ibG9ja1tzLT5uYmxvY2tdID0gKHVpbnQ4X3QpKHMtPnN0YXRlX2luX2xlbiAtIDQpOworCQkJcy0+bmJsb2NrKys7CisJCQlicmVhazsKKwl9Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCit2b2lkIGZsdXNoX1JMKEVTdGF0ZSogcykKK3sKKwlpZiAocy0+c3RhdGVfaW5fY2ggPCAyNTYpIGFkZF9wYWlyX3RvX2Jsb2NrKHMpOworCWluaXRfUkwocyk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBBRERfQ0hBUl9UT19CTE9DSyh6cywgemNoaDApIFwKK3sgXAorCXVpbnQzMl90IHpjaGggPSAodWludDMyX3QpKHpjaGgwKTsgXAorCS8qLS0gZmFzdCB0cmFjayB0aGUgY29tbW9uIGNhc2UgLS0qLyBcCisJaWYgKHpjaGggIT0genMtPnN0YXRlX2luX2NoICYmIHpzLT5zdGF0ZV9pbl9sZW4gPT0gMSkgeyBcCisJCXVpbnQ4X3QgY2ggPSAodWludDhfdCkoenMtPnN0YXRlX2luX2NoKTsgXAorCQlCWl9VUERBVEVfQ1JDKHpzLCB6cy0+YmxvY2tDUkMsIGNoKTsgXAorCQl6cy0+aW5Vc2VbenMtPnN0YXRlX2luX2NoXSA9IDE7IFwKKwkJenMtPmJsb2NrW3pzLT5uYmxvY2tdID0gKHVpbnQ4X3QpY2g7IFwKKwkJenMtPm5ibG9jaysrOyBcCisJCXpzLT5zdGF0ZV9pbl9jaCA9IHpjaGg7IFwKKwl9IFwKKwllbHNlIFwKKwkvKi0tIGdlbmVyYWwsIHVuY29tbW9uIGNhc2VzIC0tKi8gXAorCWlmICh6Y2hoICE9IHpzLT5zdGF0ZV9pbl9jaCB8fCB6cy0+c3RhdGVfaW5fbGVuID09IDI1NSkgeyBcCisJCWlmICh6cy0+c3RhdGVfaW5fY2ggPCAyNTYpIFwKKwkJCWFkZF9wYWlyX3RvX2Jsb2NrKHpzKTsgXAorCQl6cy0+c3RhdGVfaW5fY2ggPSB6Y2hoOyBcCisJCXpzLT5zdGF0ZV9pbl9sZW4gPSAxOyBcCisJfSBlbHNlIHsgXAorCQl6cy0+c3RhdGVfaW5fbGVuKys7IFwKKwl9IFwKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK3ZvaWQgLypCb29sKi8gY29weV9pbnB1dF91bnRpbF9zdG9wKEVTdGF0ZSogcykKK3sKKwkvKkJvb2wgcHJvZ3Jlc3NfaW4gPSBGYWxzZTsqLworCisjaWZkZWYgU0FNRV9DT0RFX0FTX0JFTE9XCisJaWYgKHMtPm1vZGUgPT0gQlpfTV9SVU5OSU5HKSB7CisJCS8qLS0gZmFzdCB0cmFjayB0aGUgY29tbW9uIGNhc2UgLS0qLworCQl3aGlsZSAoMSkgeworCQkJLyotLSBubyBpbnB1dD8gLS0qLworCQkJaWYgKHMtPnN0cm0tPmF2YWlsX2luID09IDApIGJyZWFrOworCQkJLyotLSBibG9jayBmdWxsPyAtLSovCisJCQlpZiAocy0+bmJsb2NrID49IHMtPm5ibG9ja01BWCkgYnJlYWs7CisJCQkvKnByb2dyZXNzX2luID0gVHJ1ZTsqLworCQkJQUREX0NIQVJfVE9fQkxPQ0socywgKHVpbnQzMl90KSgqKHVpbnQ4X3QqKShzLT5zdHJtLT5uZXh0X2luKSkpOworCQkJcy0+c3RybS0+bmV4dF9pbisrOworCQkJcy0+c3RybS0+YXZhaWxfaW4tLTsKKwkJCS8qcy0+c3RybS0+dG90YWxfaW4rKzsqLworCQl9CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCS8qLS0gZ2VuZXJhbCwgdW5jb21tb24gY2FzZSAtLSovCisJCXdoaWxlICgxKSB7CisJCQkvKi0tIG5vIGlucHV0PyAtLSovCisJCQlpZiAocy0+c3RybS0+YXZhaWxfaW4gPT0gMCkgYnJlYWs7CisJCQkvKi0tIGJsb2NrIGZ1bGw/IC0tKi8KKwkJCWlmIChzLT5uYmxvY2sgPj0gcy0+bmJsb2NrTUFYKSBicmVhazsKKwkJLy8jCS8qLS0gZmx1c2gvZmluaXNoIGVuZD8gLS0qLworCQkvLyMJaWYgKHMtPmF2YWlsX2luX2V4cGVjdCA9PSAwKSBicmVhazsKKwkJCS8qcHJvZ3Jlc3NfaW4gPSBUcnVlOyovCisJCQlBRERfQ0hBUl9UT19CTE9DSyhzLCAqKHVpbnQ4X3QqKShzLT5zdHJtLT5uZXh0X2luKSk7CisJCQlzLT5zdHJtLT5uZXh0X2luKys7CisJCQlzLT5zdHJtLT5hdmFpbF9pbi0tOworCQkJLypzLT5zdHJtLT50b3RhbF9pbisrOyovCisJCS8vIwlzLT5hdmFpbF9pbl9leHBlY3QtLTsKKwkJfQorCX0KKwkvKnJldHVybiBwcm9ncmVzc19pbjsqLworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwordm9pZCAvKkJvb2wqLyBjb3B5X291dHB1dF91bnRpbF9zdG9wKEVTdGF0ZSogcykKK3sKKwkvKkJvb2wgcHJvZ3Jlc3Nfb3V0ID0gRmFsc2U7Ki8KKworCXdoaWxlICgxKSB7CisJCS8qLS0gbm8gb3V0cHV0IHNwYWNlPyAtLSovCisJCWlmIChzLT5zdHJtLT5hdmFpbF9vdXQgPT0gMCkgYnJlYWs7CisKKwkJLyotLSBibG9jayBkb25lPyAtLSovCisJCWlmIChzLT5zdGF0ZV9vdXRfcG9zID49IHMtPm51bVopIGJyZWFrOworCisJCS8qcHJvZ3Jlc3Nfb3V0ID0gVHJ1ZTsqLworCQkqKHMtPnN0cm0tPm5leHRfb3V0KSA9IHMtPnpiaXRzW3MtPnN0YXRlX291dF9wb3NdOworCQlzLT5zdGF0ZV9vdXRfcG9zKys7CisJCXMtPnN0cm0tPmF2YWlsX291dC0tOworCQlzLT5zdHJtLT5uZXh0X291dCsrOworCQlzLT5zdHJtLT50b3RhbF9vdXQrKzsKKwl9CisJLypyZXR1cm4gcHJvZ3Jlc3Nfb3V0OyovCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCit2b2lkIC8qQm9vbCovIGhhbmRsZV9jb21wcmVzcyhiel9zdHJlYW0gKnN0cm0pCit7CisJLypCb29sIHByb2dyZXNzX2luICA9IEZhbHNlOyovCisJLypCb29sIHByb2dyZXNzX291dCA9IEZhbHNlOyovCisJRVN0YXRlKiBzID0gc3RybS0+c3RhdGU7CisKKwl3aGlsZSAoMSkgeworCQlpZiAocy0+c3RhdGUgPT0gQlpfU19PVVRQVVQpIHsKKwkJCS8qcHJvZ3Jlc3Nfb3V0IHw9Ki8gY29weV9vdXRwdXRfdW50aWxfc3RvcChzKTsKKwkJCWlmIChzLT5zdGF0ZV9vdXRfcG9zIDwgcy0+bnVtWikgYnJlYWs7CisJCQlpZiAocy0+bW9kZSA9PSBCWl9NX0ZJTklTSElORworCQkJLy8jICYmIHMtPmF2YWlsX2luX2V4cGVjdCA9PSAwCisJCQkgJiYgcy0+c3RybS0+YXZhaWxfaW4gPT0gMAorCQkJICYmIGlzZW1wdHlfUkwocykpCisJCQkJYnJlYWs7CisJCQlwcmVwYXJlX25ld19ibG9jayhzKTsKKwkJCXMtPnN0YXRlID0gQlpfU19JTlBVVDsKKyNpZmRlZiBGTFVTSF9JU19VTlVTRUQKKwkJCWlmIChzLT5tb2RlID09IEJaX01fRkxVU0hJTkcKKwkJCSAmJiBzLT5hdmFpbF9pbl9leHBlY3QgPT0gMAorCQkJICYmIGlzZW1wdHlfUkwocykpCisJCQkJYnJlYWs7CisjZW5kaWYKKwkJfQorCisJCWlmIChzLT5zdGF0ZSA9PSBCWl9TX0lOUFVUKSB7CisJCQkvKnByb2dyZXNzX2luIHw9Ki8gY29weV9pbnB1dF91bnRpbF9zdG9wKHMpOworCQkJLy8jaWYgKHMtPm1vZGUgIT0gQlpfTV9SVU5OSU5HICYmIHMtPmF2YWlsX2luX2V4cGVjdCA9PSAwKSB7CisJCQlpZiAocy0+bW9kZSAhPSBCWl9NX1JVTk5JTkcgJiYgcy0+c3RybS0+YXZhaWxfaW4gPT0gMCkgeworCQkJCWZsdXNoX1JMKHMpOworCQkJCUJaMl9jb21wcmVzc0Jsb2NrKHMsIChzLT5tb2RlID09IEJaX01fRklOSVNISU5HKSk7CisJCQkJcy0+c3RhdGUgPSBCWl9TX09VVFBVVDsKKwkJCX0gZWxzZQorCQkJaWYgKHMtPm5ibG9jayA+PSBzLT5uYmxvY2tNQVgpIHsKKwkJCQlCWjJfY29tcHJlc3NCbG9jayhzLCAwKTsKKwkJCQlzLT5zdGF0ZSA9IEJaX1NfT1VUUFVUOworCQkJfSBlbHNlCisJCQlpZiAocy0+c3RybS0+YXZhaWxfaW4gPT0gMCkgeworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCisJLypyZXR1cm4gcHJvZ3Jlc3NfaW4gfHwgcHJvZ3Jlc3Nfb3V0OyovCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCitpbnQgQloyX2J6Q29tcHJlc3MoYnpfc3RyZWFtICpzdHJtLCBpbnQgYWN0aW9uKQoreworCS8qQm9vbCBwcm9ncmVzczsqLworCUVTdGF0ZSogczsKKworCXMgPSBzdHJtLT5zdGF0ZTsKKworCXN3aXRjaCAocy0+bW9kZSkgeworCQljYXNlIEJaX01fUlVOTklORzoKKwkJCWlmIChhY3Rpb24gPT0gQlpfUlVOKSB7CisJCQkJLypwcm9ncmVzcyA9Ki8gaGFuZGxlX2NvbXByZXNzKHN0cm0pOworCQkJCS8qcmV0dXJuIHByb2dyZXNzID8gQlpfUlVOX09LIDogQlpfUEFSQU1fRVJST1I7Ki8KKwkJCQlyZXR1cm4gQlpfUlVOX09LOworCQkJfQorI2lmZGVmIEZMVVNIX0lTX1VOVVNFRAorCQkJZWxzZQorCQkJaWYgKGFjdGlvbiA9PSBCWl9GTFVTSCkgeworCQkJCS8vI3MtPmF2YWlsX2luX2V4cGVjdCA9IHN0cm0tPmF2YWlsX2luOworCQkJCXMtPm1vZGUgPSBCWl9NX0ZMVVNISU5HOworCQkJCWdvdG8gY2FzZV9CWl9NX0ZMVVNISU5HOworCQkJfQorI2VuZGlmCisJCQllbHNlCisJCQkvKmlmIChhY3Rpb24gPT0gQlpfRklOSVNIKSovIHsKKwkJCQkvLyNzLT5hdmFpbF9pbl9leHBlY3QgPSBzdHJtLT5hdmFpbF9pbjsKKwkJCQlzLT5tb2RlID0gQlpfTV9GSU5JU0hJTkc7CisJCQkJZ290byBjYXNlX0JaX01fRklOSVNISU5HOworCQkJfQorCisjaWZkZWYgRkxVU0hfSVNfVU5VU0VECisgY2FzZV9CWl9NX0ZMVVNISU5HOgorCQljYXNlIEJaX01fRkxVU0hJTkc6CisJCQkvKmlmIChzLT5hdmFpbF9pbl9leHBlY3QgIT0gcy0+c3RybS0+YXZhaWxfaW4pCisJCQkJcmV0dXJuIEJaX1NFUVVFTkNFX0VSUk9SOyovCisJCQkvKnByb2dyZXNzID0qLyBoYW5kbGVfY29tcHJlc3Moc3RybSk7CisJCQlpZiAocy0+YXZhaWxfaW5fZXhwZWN0ID4gMCB8fCAhaXNlbXB0eV9STChzKSB8fCBzLT5zdGF0ZV9vdXRfcG9zIDwgcy0+bnVtWikKKwkJCQlyZXR1cm4gQlpfRkxVU0hfT0s7CisJCQlzLT5tb2RlID0gQlpfTV9SVU5OSU5HOworCQkJcmV0dXJuIEJaX1JVTl9PSzsKKyNlbmRpZgorCisgY2FzZV9CWl9NX0ZJTklTSElORzoKKwkJLypjYXNlIEJaX01fRklOSVNISU5HOiovCisJCWRlZmF1bHQ6CisJCQkvKmlmIChzLT5hdmFpbF9pbl9leHBlY3QgIT0gcy0+c3RybS0+YXZhaWxfaW4pCisJCQkJcmV0dXJuIEJaX1NFUVVFTkNFX0VSUk9SOyovCisJCQkvKnByb2dyZXNzID0qLyBoYW5kbGVfY29tcHJlc3Moc3RybSk7CisJCQkvKmlmICghcHJvZ3Jlc3MpIHJldHVybiBCWl9TRVFVRU5DRV9FUlJPUjsqLworCQkJLy8jaWYgKHMtPmF2YWlsX2luX2V4cGVjdCA+IDAgfHwgIWlzZW1wdHlfUkwocykgfHwgcy0+c3RhdGVfb3V0X3BvcyA8IHMtPm51bVopCisJCQkvLyMJcmV0dXJuIEJaX0ZJTklTSF9PSzsKKwkJCWlmIChzLT5zdHJtLT5hdmFpbF9pbiA+IDAgfHwgIWlzZW1wdHlfUkwocykgfHwgcy0+c3RhdGVfb3V0X3BvcyA8IHMtPm51bVopCisJCQkJcmV0dXJuIEJaX0ZJTklTSF9PSzsKKwkJCS8qcy0+bW9kZSA9IEJaX01fSURMRTsqLworCQkJcmV0dXJuIEJaX1NUUkVBTV9FTkQ7CisJfQorCS8qIHJldHVybiBCWl9PSzsgLS1ub3QgcmVhY2hlZC0tKi8KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK3ZvaWQgQloyX2J6Q29tcHJlc3NFbmQoYnpfc3RyZWFtICpzdHJtKQoreworCUVTdGF0ZSogczsKKworCXMgPSBzdHJtLT5zdGF0ZTsKKwlmcmVlKHMtPmFycjEpOworCWZyZWUocy0+YXJyMik7CisJZnJlZShzLT5mdGFiKTsKKwlmcmVlKHMtPmNyYzMydGFibGUpOworCWZyZWUocyk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gTWlzYyBjb252ZW5pZW5jZSBzdHVmZiAgICAgICAgICAgICAgICAgICAgICAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaWZkZWYgRVhBTVBMRV9DT0RFX0ZPUl9NRU1fVE9fTUVNX0NPTVBSRVNTSU9OCitzdGF0aWMKK2ludCBCWjJfYnpCdWZmVG9CdWZmQ29tcHJlc3MoY2hhciogZGVzdCwKKwkJdW5zaWduZWQgaW50KiBkZXN0TGVuLAorCQljaGFyKiAgICAgICAgIHNvdXJjZSwKKwkJdW5zaWduZWQgaW50ICBzb3VyY2VMZW4sCisJCWludCAgICAgICAgICAgYmxvY2tTaXplMTAwaykKK3sKKwliel9zdHJlYW0gc3RybTsKKwlpbnQgcmV0OworCisJaWYgKGRlc3QgPT0gTlVMTCB8fCBkZXN0TGVuID09IE5VTEwKKwkgfHwgc291cmNlID09IE5VTEwKKwkgfHwgYmxvY2tTaXplMTAwayA8IDEgfHwgYmxvY2tTaXplMTAwayA+IDkKKwkpIHsKKwkJcmV0dXJuIEJaX1BBUkFNX0VSUk9SOworCX0KKworCUJaMl9iekNvbXByZXNzSW5pdCgmc3RybSwgYmxvY2tTaXplMTAwayk7CisKKwlzdHJtLm5leHRfaW4gPSBzb3VyY2U7CisJc3RybS5uZXh0X291dCA9IGRlc3Q7CisJc3RybS5hdmFpbF9pbiA9IHNvdXJjZUxlbjsKKwlzdHJtLmF2YWlsX291dCA9ICpkZXN0TGVuOworCisJcmV0ID0gQloyX2J6Q29tcHJlc3MoJnN0cm0sIEJaX0ZJTklTSCk7CisJaWYgKHJldCA9PSBCWl9GSU5JU0hfT0spIGdvdG8gb3V0cHV0X292ZXJmbG93OworCWlmIChyZXQgIT0gQlpfU1RSRUFNX0VORCkgZ290byBlcnJoYW5kbGVyOworCisJLyogbm9ybWFsIHRlcm1pbmF0aW9uICovCisJKmRlc3RMZW4gLT0gc3RybS5hdmFpbF9vdXQ7CisJQloyX2J6Q29tcHJlc3NFbmQoJnN0cm0pOworCXJldHVybiBCWl9PSzsKKworIG91dHB1dF9vdmVyZmxvdzoKKwlCWjJfYnpDb21wcmVzc0VuZCgmc3RybSk7CisJcmV0dXJuIEJaX09VVEJVRkZfRlVMTDsKKworIGVycmhhbmRsZXI6CisJQloyX2J6Q29tcHJlc3NFbmQoJnN0cm0pOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qLS0tIGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiemxpYi5jIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9iemxpYi5oIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9iemxpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYjgxMWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L2J6bGliLmgKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIGJ6aXAyIGlzIHdyaXR0ZW4gYnkgSnVsaWFuIFNld2FyZCA8anNld2FyZEBiemlwLm9yZz4uCisgKiBBZGFwdGVkIGZvciBidXN5Ym94IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+LgorICogU2VlIFJFQURNRSBhbmQgTElDRU5TRSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gUHVibGljIGhlYWRlciBmaWxlIGZvciB0aGUgbGlicmFyeS4gICAgICAgICAgICAgICAgICAgLS0tKi8KKy8qLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiemxpYi5oIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIGJ6aXAyL2xpYmJ6aXAyLCBhIHByb2dyYW0gYW5kIGxpYnJhcnkgZm9yCitsb3NzbGVzcywgYmxvY2stc29ydGluZyBkYXRhIGNvbXByZXNzaW9uLgorCitiemlwMi9saWJiemlwMiB2ZXJzaW9uIDEuMC40IG9mIDIwIERlY2VtYmVyIDIwMDYKK0NvcHlyaWdodCAoQykgMTk5Ni0yMDA2IEp1bGlhbiBTZXdhcmQgPGpzZXdhcmRAYnppcC5vcmc+CisKK1BsZWFzZSByZWFkIHRoZSBXQVJOSU5HLCBESVNDTEFJTUVSIGFuZCBQQVRFTlRTIHNlY3Rpb25zIGluIHRoZQorUkVBRE1FIGZpbGUuCisKK1RoaXMgcHJvZ3JhbSBpcyByZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGxpY2Vuc2UgY29udGFpbmVkCitpbiB0aGUgZmlsZSBMSUNFTlNFLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgQlpfUlVOICAgICAgICAgICAgICAgMAorI2RlZmluZSBCWl9GTFVTSCAgICAgICAgICAgICAxCisjZGVmaW5lIEJaX0ZJTklTSCAgICAgICAgICAgIDIKKworI2RlZmluZSBCWl9PSyAgICAgICAgICAgICAgICAwCisjZGVmaW5lIEJaX1JVTl9PSyAgICAgICAgICAgIDEKKyNkZWZpbmUgQlpfRkxVU0hfT0sgICAgICAgICAgMgorI2RlZmluZSBCWl9GSU5JU0hfT0sgICAgICAgICAzCisjZGVmaW5lIEJaX1NUUkVBTV9FTkQgICAgICAgIDQKKyNkZWZpbmUgQlpfU0VRVUVOQ0VfRVJST1IgICAgKC0xKQorI2RlZmluZSBCWl9QQVJBTV9FUlJPUiAgICAgICAoLTIpCisjZGVmaW5lIEJaX01FTV9FUlJPUiAgICAgICAgICgtMykKKyNkZWZpbmUgQlpfREFUQV9FUlJPUiAgICAgICAgKC00KQorI2RlZmluZSBCWl9EQVRBX0VSUk9SX01BR0lDICAoLTUpCisjZGVmaW5lIEJaX0lPX0VSUk9SICAgICAgICAgICgtNikKKyNkZWZpbmUgQlpfVU5FWFBFQ1RFRF9FT0YgICAgKC03KQorI2RlZmluZSBCWl9PVVRCVUZGX0ZVTEwgICAgICAoLTgpCisjZGVmaW5lIEJaX0NPTkZJR19FUlJPUiAgICAgICgtOSkKKwordHlwZWRlZiBzdHJ1Y3QgYnpfc3RyZWFtIHsKKwl2b2lkICpzdGF0ZTsKKwljaGFyICpuZXh0X2luOworCWNoYXIgKm5leHRfb3V0OworCXVuc2lnbmVkIGF2YWlsX2luOworCXVuc2lnbmVkIGF2YWlsX291dDsKKwkvKnVuc2lnbmVkIGxvbmcgbG9uZyB0b3RhbF9pbjsqLworCXVuc2lnbmVkIGxvbmcgbG9uZyB0b3RhbF9vdXQ7Cit9IGJ6X3N0cmVhbTsKKworLyotLSBDb3JlIChsb3ctbGV2ZWwpIGxpYnJhcnkgZnVuY3Rpb25zIC0tKi8KKworc3RhdGljIHZvaWQgQloyX2J6Q29tcHJlc3NJbml0KGJ6X3N0cmVhbSAqc3RybSwgaW50IGJsb2NrU2l6ZTEwMGspOworc3RhdGljIGludCBCWjJfYnpDb21wcmVzcyhiel9zdHJlYW0gKnN0cm0sIGludCBhY3Rpb24pOworI2lmIEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQCitzdGF0aWMgdm9pZCBCWjJfYnpDb21wcmVzc0VuZChiel9zdHJlYW0gKnN0cm0pOworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBlbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnpsaWIuaCAtLS0qLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovYnpsaWJfcHJpdmF0ZS5oIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9iei9iemxpYl9wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNlNjc0YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovYnpsaWJfcHJpdmF0ZS5oCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogYnppcDIgaXMgd3JpdHRlbiBieSBKdWxpYW4gU2V3YXJkIDxqc2V3YXJkQGJ6aXAub3JnPi4KKyAqIEFkYXB0ZWQgZm9yIGJ1c3lib3ggYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4uCisgKiBTZWUgUkVBRE1FIGFuZCBMSUNFTlNFIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBQcml2YXRlIGhlYWRlciBmaWxlIGZvciB0aGUgbGlicmFyeS4gICAgICAgICAgICAgICAgICAtLS0qLworLyotLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiemxpYl9wcml2YXRlLmggLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhpcyBmaWxlIGlzIHBhcnQgb2YgYnppcDIvbGliYnppcDIsIGEgcHJvZ3JhbSBhbmQgbGlicmFyeSBmb3IKK2xvc3NsZXNzLCBibG9jay1zb3J0aW5nIGRhdGEgY29tcHJlc3Npb24uCisKK2J6aXAyL2xpYmJ6aXAyIHZlcnNpb24gMS4wLjQgb2YgMjAgRGVjZW1iZXIgMjAwNgorQ29weXJpZ2h0IChDKSAxOTk2LTIwMDYgSnVsaWFuIFNld2FyZCA8anNld2FyZEBiemlwLm9yZz4KKworUGxlYXNlIHJlYWQgdGhlIFdBUk5JTkcsIERJU0NMQUlNRVIgYW5kIFBBVEVOVFMgc2VjdGlvbnMgaW4gdGhlCitSRUFETUUgZmlsZS4KKworVGhpcyBwcm9ncmFtIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgbGljZW5zZSBjb250YWluZWQKK2luIHRoZSBmaWxlIExJQ0VOU0UuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogI2luY2x1ZGUgImJ6bGliLmgiICovCisKKy8qLS0gR2VuZXJhbCBzdHVmZi4gLS0qLworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgQm9vbDsKKworI2RlZmluZSBUcnVlICAoKEJvb2wpMSkKKyNkZWZpbmUgRmFsc2UgKChCb29sKTApCisKKyNpZiBCWl9MSUdIVF9ERUJVRworc3RhdGljIHZvaWQgYnpfYXNzZXJ0X2ZhaWwoaW50IGVycmNvZGUpIE5PUkVUVVJOOworI2RlZmluZSBBc3NlcnRIKGNvbmQsIGVycmNvZGUpIFwKK2RvIHsgXAorCWlmICghKGNvbmQpKSBcCisJCWJ6X2Fzc2VydF9mYWlsKGVycmNvZGUpOyBcCit9IHdoaWxlICgwKQorI2Vsc2UKKyNkZWZpbmUgQXNzZXJ0SChjb25kLCBtc2cpIGRvIHsgfSB3aGlsZSAoMCkKKyNlbmRpZgorCisjaWYgQlpfREVCVUcKKyNkZWZpbmUgQXNzZXJ0RChjb25kLCBtc2cpIFwKK2RvIHsgXAorCWlmICghKGNvbmQpKSBcCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIoZGVidWcgYnVpbGQpOiBpbnRlcm5hbCBlcnJvciAlcyIsIG1zZyk7IFwKK30gd2hpbGUgKDApCisjZWxzZQorI2RlZmluZSBBc3NlcnREKGNvbmQsIG1zZykgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKworLyotLSBIZWFkZXIgYnl0ZXMuIC0tKi8KKworI2RlZmluZSBCWl9IRFJfQiAweDQyICAgLyogJ0InICovCisjZGVmaW5lIEJaX0hEUl9aIDB4NWEgICAvKiAnWicgKi8KKyNkZWZpbmUgQlpfSERSX2ggMHg2OCAgIC8qICdoJyAqLworI2RlZmluZSBCWl9IRFJfMCAweDMwICAgLyogJzAnICovCisKKyNkZWZpbmUgQlpfSERSX0JaaDAgMHg0MjVhNjgzMAorCisvKi0tIENvbnN0YW50cyBmb3IgdGhlIGJhY2sgZW5kLiAtLSovCisKKyNkZWZpbmUgQlpfTUFYX0FMUEhBX1NJWkUgMjU4CisjZGVmaW5lIEJaX01BWF9DT0RFX0xFTiAgICAyMworCisjZGVmaW5lIEJaX1JVTkEgMAorI2RlZmluZSBCWl9SVU5CIDEKKworI2RlZmluZSBCWl9OX0dST1VQUyA2CisjZGVmaW5lIEJaX0dfU0laRSAgIDUwCisjZGVmaW5lIEJaX05fSVRFUlMgIDQKKworI2RlZmluZSBCWl9NQVhfU0VMRUNUT1JTICgyICsgKDkwMDAwMCAvIEJaX0dfU0laRSkpCisKKworLyotLSBTdHVmZiBmb3IgZG9pbmcgQ1JDcy4gLS0qLworCisjZGVmaW5lIEJaX0lOSVRJQUxJU0VfQ1JDKGNyY1ZhcikgXAoreyBcCisJY3JjVmFyID0gMHhmZmZmZmZmZkw7IFwKK30KKworI2RlZmluZSBCWl9GSU5BTElTRV9DUkMoY3JjVmFyKSBcCit7IFwKKwljcmNWYXIgPSB+KGNyY1Zhcik7IFwKK30KKworI2RlZmluZSBCWl9VUERBVEVfQ1JDKHMsIGNyY1ZhciwgY2hhKSBcCit7IFwKKwljcmNWYXIgPSAoY3JjVmFyIDw8IDgpIF4gcy0+Y3JjMzJ0YWJsZVsoY3JjVmFyID4+IDI0KSBeICgodWludDhfdCljaGEpXTsgXAorfQorCisKKy8qLS0gU3RhdGVzIGFuZCBtb2RlcyBmb3IgY29tcHJlc3Npb24uIC0tKi8KKworI2RlZmluZSBCWl9NX0lETEUgICAgICAxCisjZGVmaW5lIEJaX01fUlVOTklORyAgIDIKKyNkZWZpbmUgQlpfTV9GTFVTSElORyAgMworI2RlZmluZSBCWl9NX0ZJTklTSElORyA0CisKKyNkZWZpbmUgQlpfU19PVVRQVVQgICAgMQorI2RlZmluZSBCWl9TX0lOUFVUICAgICAyCisKKyNkZWZpbmUgQlpfTl9SQURJWCAyCisjZGVmaW5lIEJaX05fUVNPUlQgMTIKKyNkZWZpbmUgQlpfTl9TSEVMTCAxOAorI2RlZmluZSBCWl9OX09WRVJTSE9PVCAoQlpfTl9SQURJWCArIEJaX05fUVNPUlQgKyBCWl9OX1NIRUxMICsgMikKKworCisvKi0tIFN0cnVjdHVyZSBob2xkaW5nIGFsbCB0aGUgY29tcHJlc3Npb24tc2lkZSBzdHVmZi4gLS0qLworCit0eXBlZGVmIHN0cnVjdCBFU3RhdGUgeworCS8qIHBvaW50ZXIgYmFjayB0byB0aGUgc3RydWN0IGJ6X3N0cmVhbSAqLworCWJ6X3N0cmVhbSAqc3RybTsKKworCS8qIG1vZGUgdGhpcyBzdHJlYW0gaXMgaW4sIGFuZCB3aGV0aGVyIGlucHV0dGluZyAqLworCS8qIG9yIG91dHB1dHRpbmcgZGF0YSAqLworCWludDMyX3QgIG1vZGU7CisJaW50MzJfdCAgc3RhdGU7CisKKwkvKiByZW1lbWJlcnMgYXZhaWxfaW4gd2hlbiBmbHVzaC9maW5pc2ggcmVxdWVzdGVkICovCisvKiBiYm94OiBub3QgbmVlZGVkLCBzdHJtLT5hdmFpbF9pbiBhbHdheXMgaGFzIHRoZSBzYW1lIHZhbHVlICovCisvKiBjb21tZW50ZWQgb3V0IHdpdGggJy8vIycgdGhyb3VnaG91dCB0aGUgY29kZSAqLworCS8qIHVpbnQzMl90IGF2YWlsX2luX2V4cGVjdDsgKi8KKworCS8qIGZvciBkb2luZyB0aGUgYmxvY2sgc29ydGluZyAqLworCWludDMyX3QgIG9yaWdQdHI7CisJdWludDMyX3QgKmFycjE7CisJdWludDMyX3QgKmFycjI7CisJdWludDMyX3QgKmZ0YWI7CisKKwkvKiBhbGlhc2VzIGZvciBhcnIxIGFuZCBhcnIyICovCisJdWludDMyX3QgKnB0cjsKKwl1aW50OF90ICAqYmxvY2s7CisJdWludDE2X3QgKm10ZnY7CisJdWludDhfdCAgKnpiaXRzOworCisJLyogZ3Vlc3Mgd2hhdCAqLworCXVpbnQzMl90ICpjcmMzMnRhYmxlOworCisJLyogcnVuLWxlbmd0aC1lbmNvZGluZyBvZiB0aGUgaW5wdXQgKi8KKwl1aW50MzJfdCBzdGF0ZV9pbl9jaDsKKwlpbnQzMl90ICBzdGF0ZV9pbl9sZW47CisKKwkvKiBpbnB1dCBhbmQgb3V0cHV0IGxpbWl0cyBhbmQgY3VycmVudCBwb3NucyAqLworCWludDMyX3QgIG5ibG9jazsKKwlpbnQzMl90ICBuYmxvY2tNQVg7CisJaW50MzJfdCAgbnVtWjsKKwlpbnQzMl90ICBzdGF0ZV9vdXRfcG9zOworCisJLyogdGhlIGJ1ZmZlciBmb3IgYml0IHN0cmVhbSBjcmVhdGlvbiAqLworCXVpbnQzMl90IGJzQnVmZjsKKwlpbnQzMl90ICBic0xpdmU7CisKKwkvKiBibG9jayBhbmQgY29tYmluZWQgQ1JDcyAqLworCXVpbnQzMl90IGJsb2NrQ1JDOworCXVpbnQzMl90IGNvbWJpbmVkQ1JDOworCisJLyogbWlzYyBhZG1pbmlzdHJhdGl1bSAqLworCWludDMyX3QgIGJsb2NrTm87CisJaW50MzJfdCAgYmxvY2tTaXplMTAwazsKKworCS8qIHN0dWZmIGZvciBjb2RpbmcgdGhlIE1URiB2YWx1ZXMgKi8KKwlpbnQzMl90ICBuTVRGOworCisJLyogbWFwIG9mIGJ5dGVzIHVzZWQgaW4gYmxvY2sgKi8KKwlpbnQzMl90ICBuSW5Vc2U7CisJQm9vbCAgICAgaW5Vc2VbMjU2XSBBTElHTkVEKHNpemVvZihsb25nKSk7CisJdWludDhfdCAgdW5zZXFUb1NlcVsyNTZdOworCisJLyogc3R1ZmYgZm9yIGNvZGluZyB0aGUgTVRGIHZhbHVlcyAqLworCWludDMyX3QgIG10ZkZyZXEgICAgW0JaX01BWF9BTFBIQV9TSVpFXTsKKwl1aW50OF90ICBzZWxlY3RvciAgIFtCWl9NQVhfU0VMRUNUT1JTXTsKKwl1aW50OF90ICBzZWxlY3Rvck10ZltCWl9NQVhfU0VMRUNUT1JTXTsKKworCXVpbnQ4X3QgIGxlbltCWl9OX0dST1VQU11bQlpfTUFYX0FMUEhBX1NJWkVdOworCisJLyogc3RhY2stc2F2aW5nIG1lYXN1cmVzOiB0aGVzZSBjYW4gYmUgbG9jYWwsIGJ1dCB0aGV5IGFyZSB0b28gYmlnICovCisJaW50MzJfdCAgc2VuZE1URlZhbHVlc19fY29kZSBbQlpfTl9HUk9VUFNdW0JaX01BWF9BTFBIQV9TSVpFXTsKKwlpbnQzMl90ICBzZW5kTVRGVmFsdWVzX19yZnJlcVtCWl9OX0dST1VQU11bQlpfTUFYX0FMUEhBX1NJWkVdOworI2lmIENPTkZJR19CWklQMl9GQVNUID49IDUKKwkvKiBzZWNvbmQgZGltZW5zaW9uOiBvbmx5IDMgbmVlZGVkOyA0IG1ha2VzIGluZGV4IGNhbGN1bGF0aW9ucyBmYXN0ZXIgKi8KKwl1aW50MzJfdCBzZW5kTVRGVmFsdWVzX19sZW5fcGFja1tCWl9NQVhfQUxQSEFfU0laRV1bNF07CisjZW5kaWYKKwlpbnQzMl90ICBCWjJfaGJNYWtlQ29kZUxlbmd0aHNfX2hlYXAgIFtCWl9NQVhfQUxQSEFfU0laRSArIDJdOworCWludDMyX3QgIEJaMl9oYk1ha2VDb2RlTGVuZ3Roc19fd2VpZ2h0W0JaX01BWF9BTFBIQV9TSVpFICogMl07CisJaW50MzJfdCAgQloyX2hiTWFrZUNvZGVMZW5ndGhzX19wYXJlbnRbQlpfTUFYX0FMUEhBX1NJWkUgKiAyXTsKKworCWludDMyX3QgIG1haW5Tb3J0X19ydW5uaW5nT3JkZXJbMjU2XTsKKwlpbnQzMl90ICBtYWluU29ydF9fY29weVN0YXJ0WzI1Nl07CisJaW50MzJfdCAgbWFpblNvcnRfX2NvcHlFbmRbMjU2XTsKK30gRVN0YXRlOworCisKKy8qLS0gY29tcHJlc3Npb24uIC0tKi8KKworc3RhdGljIHZvaWQKK0JaMl9ibG9ja1NvcnQoRVN0YXRlKik7CisKK3N0YXRpYyB2b2lkCitCWjJfY29tcHJlc3NCbG9jayhFU3RhdGUqLCBpbnQpOworCitzdGF0aWMgdm9pZAorQloyX2JzSW5pdFdyaXRlKEVTdGF0ZSopOworCitzdGF0aWMgdm9pZAorQloyX2hiQXNzaWduQ29kZXMoaW50MzJfdCosIHVpbnQ4X3QqLCBpbnQzMl90LCBpbnQzMl90LCBpbnQzMl90KTsKKworc3RhdGljIHZvaWQKK0JaMl9oYk1ha2VDb2RlTGVuZ3RocyhFU3RhdGUqLCB1aW50OF90KiwgaW50MzJfdCosIGludDMyX3QsIGludDMyX3QpOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiemxpYl9wcml2YXRlLmggLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L2NvbXByZXNzLmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L2NvbXByZXNzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ5OTQ2OAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovY29tcHJlc3MuYwpAQCAtMCwwICsxLDY3NyBAQAorLyoKKyAqIGJ6aXAyIGlzIHdyaXR0ZW4gYnkgSnVsaWFuIFNld2FyZCA8anNld2FyZEBiemlwLm9yZz4uCisgKiBBZGFwdGVkIGZvciBidXN5Ym94IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+LgorICogU2VlIFJFQURNRSBhbmQgTElDRU5TRSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gQ29tcHJlc3Npb24gbWFjaGluZXJ5IChub3QgaW5jbCBibG9jayBzb3J0aW5nKSAgICAgICAgLS0tKi8KKy8qLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wcmVzcy5jIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIGJ6aXAyL2xpYmJ6aXAyLCBhIHByb2dyYW0gYW5kIGxpYnJhcnkgZm9yCitsb3NzbGVzcywgYmxvY2stc29ydGluZyBkYXRhIGNvbXByZXNzaW9uLgorCitiemlwMi9saWJiemlwMiB2ZXJzaW9uIDEuMC40IG9mIDIwIERlY2VtYmVyIDIwMDYKK0NvcHlyaWdodCAoQykgMTk5Ni0yMDA2IEp1bGlhbiBTZXdhcmQgPGpzZXdhcmRAYnppcC5vcmc+CisKK1BsZWFzZSByZWFkIHRoZSBXQVJOSU5HLCBESVNDTEFJTUVSIGFuZCBQQVRFTlRTIHNlY3Rpb25zIGluIHRoZQorUkVBRE1FIGZpbGUuCisKK1RoaXMgcHJvZ3JhbSBpcyByZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGxpY2Vuc2UgY29udGFpbmVkCitpbiB0aGUgZmlsZSBMSUNFTlNFLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIENIQU5HRVMKKyAqIDAuOS4wICAgIC0tIG9yaWdpbmFsIHZlcnNpb24uCisgKiAwLjkuMGEvYiAtLSBubyBjaGFuZ2VzIGluIHRoaXMgZmlsZS4KKyAqIDAuOS4wYyAgIC0tIGNoYW5nZWQgc2V0dGluZyBvZiBuR3JvdXBzIGluIHNlbmRNVEZWYWx1ZXMoKQorICogICAgICAgICAgICAgc28gYXMgdG8gZG8gYSBiaXQgYmV0dGVyIG9uIHNtYWxsIGZpbGVzCisqLworCisvKiAjaW5jbHVkZSAiYnpsaWJfcHJpdmF0ZS5oIiAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBCaXQgc3RyZWFtIEkvTyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwordm9pZCBCWjJfYnNJbml0V3JpdGUoRVN0YXRlKiBzKQoreworCXMtPmJzTGl2ZSA9IDA7CisJcy0+YnNCdWZmID0gMDsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgTk9JTkxJTkUKK3ZvaWQgYnNGaW5pc2hXcml0ZShFU3RhdGUqIHMpCit7CisJd2hpbGUgKHMtPmJzTGl2ZSA+IDApIHsKKwkJcy0+emJpdHNbcy0+bnVtWl0gPSAodWludDhfdCkocy0+YnNCdWZmID4+IDI0KTsKKwkJcy0+bnVtWisrOworCQlzLT5ic0J1ZmYgPDw9IDg7CisJCXMtPmJzTGl2ZSAtPSA4OworCX0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKKy8qIEhlbHBzIG9ubHkgb24gbGV2ZWwgNSwgb24gb3RoZXIgbGV2ZWxzIGh1cnRzLiA/ICovCisjaWYgQ09ORklHX0JaSVAyX0ZBU1QgPj0gNQorQUxXQVlTX0lOTElORQorI2VuZGlmCit2b2lkIGJzVyhFU3RhdGUqIHMsIGludDMyX3QgbiwgdWludDMyX3QgdikKK3sKKwl3aGlsZSAocy0+YnNMaXZlID49IDgpIHsKKwkJcy0+emJpdHNbcy0+bnVtWl0gPSAodWludDhfdCkocy0+YnNCdWZmID4+IDI0KTsKKwkJcy0+bnVtWisrOworCQlzLT5ic0J1ZmYgPDw9IDg7CisJCXMtPmJzTGl2ZSAtPSA4OworCX0KKwlzLT5ic0J1ZmYgfD0gKHYgPDwgKDMyIC0gcy0+YnNMaXZlIC0gbikpOworCXMtPmJzTGl2ZSArPSBuOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwordm9pZCBic1B1dFUzMihFU3RhdGUqIHMsIHVuc2lnbmVkIHUpCit7CisJYnNXKHMsIDgsICh1ID4+IDI0KSAmIDB4ZmYpOworCWJzVyhzLCA4LCAodSA+PiAxNikgJiAweGZmKTsKKwlic1cocywgOCwgKHUgPj4gIDgpICYgMHhmZik7CisJYnNXKHMsIDgsICB1ICAgICAgICAmIDB4ZmYpOworfQorCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwordm9pZCBic1B1dFUxNihFU3RhdGUqIHMsIHVuc2lnbmVkIHUpCit7CisJYnNXKHMsIDgsICh1ID4+ICA4KSAmIDB4ZmYpOworCWJzVyhzLCA4LCAgdSAgICAgICAgJiAweGZmKTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKi0tLSBUaGUgYmFjayBlbmQgcHJvcGVyICAgICAgICAgICAgICAgICAgICAgICAgIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwordm9pZCBtYWtlTWFwc19lKEVTdGF0ZSogcykKK3sKKwlpbnQgaTsKKwlzLT5uSW5Vc2UgPSAwOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlpZiAocy0+aW5Vc2VbaV0pIHsKKwkJCXMtPnVuc2VxVG9TZXFbaV0gPSBzLT5uSW5Vc2U7CisJCQlzLT5uSW5Vc2UrKzsKKwkJfQorCX0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMgTk9JTkxJTkUKK3ZvaWQgZ2VuZXJhdGVNVEZWYWx1ZXMoRVN0YXRlKiBzKQoreworCXVpbnQ4X3QgeXlbMjU2XTsKKwlpbnQzMl90IGksIGo7CisJaW50MzJfdCB6UGVuZDsKKwlpbnQzMl90IHdyOworCWludDMyX3QgRU9COworCisJLyoKKwkgKiBBZnRlciBzb3J0aW5nIChlZywgaGVyZSksCisJICogcy0+YXJyMVswIC4uIHMtPm5ibG9jay0xXSBob2xkcyBzb3J0ZWQgb3JkZXIsCisJICogYW5kCisJICogKCh1aW50OF90KilzLT5hcnIyKVswIC4uIHMtPm5ibG9jay0xXQorCSAqIGhvbGRzIHRoZSBvcmlnaW5hbCBibG9jayBkYXRhLgorCSAqCisJICogVGhlIGZpcnN0IHRoaW5nIHRvIGRvIGlzIGdlbmVyYXRlIHRoZSBNVEYgdmFsdWVzLAorCSAqIGFuZCBwdXQgdGhlbSBpbiAoKHVpbnQxNl90KilzLT5hcnIxKVswIC4uIHMtPm5ibG9jay0xXS4KKwkgKgorCSAqIEJlY2F1c2UgdGhlcmUgYXJlIHN0cmljdGx5IGZld2VyIG9yIGVxdWFsIE1URiB2YWx1ZXMKKwkgKiB0aGFuIGJsb2NrIHZhbHVlcywgcHRyIHZhbHVlcyBpbiB0aGlzIGFyZWEgYXJlIG92ZXJ3cml0dGVuCisJICogd2l0aCBNVEYgdmFsdWVzIG9ubHkgd2hlbiB0aGV5IGFyZSBubyBsb25nZXIgbmVlZGVkLgorCSAqCisJICogVGhlIGZpbmFsIGNvbXByZXNzZWQgYml0c3RyZWFtIGlzIGdlbmVyYXRlZCBpbnRvIHRoZQorCSAqIGFyZWEgc3RhcnRpbmcgYXQgJigodWludDhfdCopcy0+YXJyMilbcy0+bmJsb2NrXQorCSAqCisJICogVGhlc2Ugc3RvcmFnZSBhbGlhc2VzIGFyZSBzZXQgdXAgaW4gYnpDb21wcmVzc0luaXQoKSwKKwkgKiBleGNlcHQgZm9yIHRoZSBsYXN0IG9uZSwgd2hpY2ggaXMgYXJyYW5nZWQgaW4KKwkgKiBjb21wcmVzc0Jsb2NrKCkuCisJICovCisJdWludDMyX3QqIHB0ciAgID0gcy0+cHRyOworCXVpbnQ4X3QqICBibG9jayA9IHMtPmJsb2NrOworCXVpbnQxNl90KiBtdGZ2ICA9IHMtPm10ZnY7CisKKwltYWtlTWFwc19lKHMpOworCUVPQiA9IHMtPm5JblVzZSsxOworCisJZm9yIChpID0gMDsgaSA8PSBFT0I7IGkrKykKKwkJcy0+bXRmRnJlcVtpXSA9IDA7CisKKwl3ciA9IDA7CisJelBlbmQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBzLT5uSW5Vc2U7IGkrKykKKwkJeXlbaV0gPSAodWludDhfdCkgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzLT5uYmxvY2s7IGkrKykgeworCQl1aW50OF90IGxsX2k7CisJCUFzc2VydEQod3IgPD0gaSwgImdlbmVyYXRlTVRGVmFsdWVzKDEpIik7CisJCWogPSBwdHJbaV0gLSAxOworCQlpZiAoaiA8IDApCisJCQlqICs9IHMtPm5ibG9jazsKKwkJbGxfaSA9IHMtPnVuc2VxVG9TZXFbYmxvY2tbal1dOworCQlBc3NlcnREKGxsX2kgPCBzLT5uSW5Vc2UsICJnZW5lcmF0ZU1URlZhbHVlcygyYSkiKTsKKworCQlpZiAoeXlbMF0gPT0gbGxfaSkgeworCQkJelBlbmQrKzsKKwkJfSBlbHNlIHsKKwkJCWlmICh6UGVuZCA+IDApIHsKKwkJCQl6UGVuZC0tOworCQkJCXdoaWxlICgxKSB7CisJCQkJCWlmICh6UGVuZCAmIDEpIHsKKwkJCQkJCW10ZnZbd3JdID0gQlpfUlVOQjsgd3IrKzsKKwkJCQkJCXMtPm10ZkZyZXFbQlpfUlVOQl0rKzsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCW10ZnZbd3JdID0gQlpfUlVOQTsgd3IrKzsKKwkJCQkJCXMtPm10ZkZyZXFbQlpfUlVOQV0rKzsKKwkJCQkJfQorCQkJCQlpZiAoelBlbmQgPCAyKSBicmVhazsKKwkJCQkJelBlbmQgPSAodWludDMyX3QpKHpQZW5kIC0gMikgLyAyOworCQkJCQkvKiBiYm94OiB1bnNpZ25lZCBkaXYgaXMgZWFzaWVyICovCisJCQkJfTsKKwkJCQl6UGVuZCA9IDA7CisJCQl9CisJCQl7CisJCQkJcmVnaXN0ZXIgdWludDhfdCAgcnRtcDsKKwkJCQlyZWdpc3RlciB1aW50OF90KiByeXlfajsKKwkJCQlyZWdpc3RlciB1aW50OF90ICBybGxfaTsKKwkJCQlydG1wICA9IHl5WzFdOworCQkJCXl5WzFdID0geXlbMF07CisJCQkJcnl5X2ogPSAmKHl5WzFdKTsKKwkJCQlybGxfaSA9IGxsX2k7CisJCQkJd2hpbGUgKHJsbF9pICE9IHJ0bXApIHsKKwkJCQkJcmVnaXN0ZXIgdWludDhfdCBydG1wMjsKKwkJCQkJcnl5X2orKzsKKwkJCQkJcnRtcDIgID0gcnRtcDsKKwkJCQkJcnRtcCAgID0gKnJ5eV9qOworCQkJCQkqcnl5X2ogPSBydG1wMjsKKwkJCQl9OworCQkJCXl5WzBdID0gcnRtcDsKKwkJCQlqID0gcnl5X2ogLSAmKHl5WzBdKTsKKwkJCQltdGZ2W3dyXSA9IGorMTsKKwkJCQl3cisrOworCQkJCXMtPm10ZkZyZXFbaisxXSsrOworCQkJfQorCQl9CisJfQorCisJaWYgKHpQZW5kID4gMCkgeworCQl6UGVuZC0tOworCQl3aGlsZSAoMSkgeworCQkJaWYgKHpQZW5kICYgMSkgeworCQkJCW10ZnZbd3JdID0gQlpfUlVOQjsKKwkJCQl3cisrOworCQkJCXMtPm10ZkZyZXFbQlpfUlVOQl0rKzsKKwkJCX0gZWxzZSB7CisJCQkJbXRmdlt3cl0gPSBCWl9SVU5BOworCQkJCXdyKys7CisJCQkJcy0+bXRmRnJlcVtCWl9SVU5BXSsrOworCQkJfQorCQkJaWYgKHpQZW5kIDwgMikKKwkJCQlicmVhazsKKwkJCXpQZW5kID0gKHVpbnQzMl90KSh6UGVuZCAtIDIpIC8gMjsKKwkJCS8qIGJib3g6IHVuc2lnbmVkIGRpdiBpcyBlYXNpZXIgKi8KKwkJfTsKKwkJelBlbmQgPSAwOworCX0KKworCW10ZnZbd3JdID0gRU9COworCXdyKys7CisJcy0+bXRmRnJlcVtFT0JdKys7CisKKwlzLT5uTVRGID0gd3I7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2RlZmluZSBCWl9MRVNTRVJfSUNPU1QgIDAKKyNkZWZpbmUgQlpfR1JFQVRFUl9JQ09TVCAxNQorCitzdGF0aWMgTk9JTkxJTkUKK3ZvaWQgc2VuZE1URlZhbHVlcyhFU3RhdGUqIHMpCit7CisJaW50MzJfdCB2LCB0LCBpLCBqLCBncywgZ2UsIGJ0LCBiYywgaXRlcjsKKwlpbnQzMl90IG5TZWxlY3RvcnMsIGFscGhhU2l6ZSwgbWluTGVuLCBtYXhMZW4sIHNlbEN0cjsKKwlpbnQzMl90IG5Hcm91cHM7CisKKwkvKgorCSAqIHVpbnQ4X3QgbGVuW0JaX05fR1JPVVBTXVtCWl9NQVhfQUxQSEFfU0laRV07CisJICogaXMgYSBnbG9iYWwgc2luY2UgdGhlIGRlY29kZXIgYWxzbyBuZWVkcyBpdC4KKwkgKgorCSAqIGludDMyX3QgIGNvZGVbQlpfTl9HUk9VUFNdW0JaX01BWF9BTFBIQV9TSVpFXTsKKwkgKiBpbnQzMl90ICByZnJlcVtCWl9OX0dST1VQU11bQlpfTUFYX0FMUEhBX1NJWkVdOworCSAqIGFyZSBhbHNvIGdsb2JhbHMgb25seSB1c2VkIGluIHRoaXMgcHJvYy4KKwkgKiBNYWRlIGdsb2JhbCB0byBrZWVwIHN0YWNrIGZyYW1lIHNpemUgc21hbGwuCisJICovCisjZGVmaW5lIGNvZGUgICAgIHNlbmRNVEZWYWx1ZXNfX2NvZGUKKyNkZWZpbmUgcmZyZXEgICAgc2VuZE1URlZhbHVlc19fcmZyZXEKKyNkZWZpbmUgbGVuX3BhY2sgc2VuZE1URlZhbHVlc19fbGVuX3BhY2sKKworCXVpbnQxNl90IGNvc3RbQlpfTl9HUk9VUFNdOworCWludDMyX3QgIGZhdmVbQlpfTl9HUk9VUFNdOworCisJdWludDE2X3QqIG10ZnYgPSBzLT5tdGZ2OworCisJYWxwaGFTaXplID0gcy0+bkluVXNlICsgMjsKKwlmb3IgKHQgPSAwOyB0IDwgQlpfTl9HUk9VUFM7IHQrKykKKwkJZm9yICh2ID0gMDsgdiA8IGFscGhhU2l6ZTsgdisrKQorCQkJcy0+bGVuW3RdW3ZdID0gQlpfR1JFQVRFUl9JQ09TVDsKKworCS8qLS0tIERlY2lkZSBob3cgbWFueSBjb2RpbmcgdGFibGVzIHRvIHVzZSAtLS0qLworCUFzc2VydEgocy0+bk1URiA+IDAsIDMwMDEpOworCWlmIChzLT5uTVRGIDwgMjAwKSAgbkdyb3VwcyA9IDI7IGVsc2UKKwlpZiAocy0+bk1URiA8IDYwMCkgIG5Hcm91cHMgPSAzOyBlbHNlCisJaWYgKHMtPm5NVEYgPCAxMjAwKSBuR3JvdXBzID0gNDsgZWxzZQorCWlmIChzLT5uTVRGIDwgMjQwMCkgbkdyb3VwcyA9IDU7IGVsc2UKKwluR3JvdXBzID0gNjsKKworCS8qLS0tIEdlbmVyYXRlIGFuIGluaXRpYWwgc2V0IG9mIGNvZGluZyB0YWJsZXMgLS0tKi8KKwl7CisJCWludDMyX3QgblBhcnQsIHJlbUYsIHRGcmVxLCBhRnJlcTsKKworCQluUGFydCA9IG5Hcm91cHM7CisJCXJlbUYgID0gcy0+bk1URjsKKwkJZ3MgPSAwOworCQl3aGlsZSAoblBhcnQgPiAwKSB7CisJCQl0RnJlcSA9IHJlbUYgLyBuUGFydDsKKwkJCWdlID0gZ3MgLSAxOworCQkJYUZyZXEgPSAwOworCQkJd2hpbGUgKGFGcmVxIDwgdEZyZXEgJiYgZ2UgPCBhbHBoYVNpemUtMSkgeworCQkJCWdlKys7CisJCQkJYUZyZXEgKz0gcy0+bXRmRnJlcVtnZV07CisJCQl9CisKKwkJCWlmIChnZSA+IGdzCisJCQkgJiYgblBhcnQgIT0gbkdyb3VwcyAmJiBuUGFydCAhPSAxCisJCQkgJiYgKChuR3JvdXBzIC0gblBhcnQpICUgMiA9PSAxKSAvKiBiYm94OiBjYW4gdGhpcyBiZSByZXBsYWNlZCBieSB4ICYgMT8gKi8KKwkJCSkgeworCQkJCWFGcmVxIC09IHMtPm10ZkZyZXFbZ2VdOworCQkJCWdlLS07CisJCQl9CisKKwkJCWZvciAodiA9IDA7IHYgPCBhbHBoYVNpemU7IHYrKykKKwkJCQlpZiAodiA+PSBncyAmJiB2IDw9IGdlKQorCQkJCQlzLT5sZW5bblBhcnQtMV1bdl0gPSBCWl9MRVNTRVJfSUNPU1Q7CisJCQkJZWxzZQorCQkJCQlzLT5sZW5bblBhcnQtMV1bdl0gPSBCWl9HUkVBVEVSX0lDT1NUOworCisJCQluUGFydC0tOworCQkJZ3MgPSBnZSArIDE7CisJCQlyZW1GIC09IGFGcmVxOworCQl9CisJfQorCisJLyoKKwkgKiBJdGVyYXRlIHVwIHRvIEJaX05fSVRFUlMgdGltZXMgdG8gaW1wcm92ZSB0aGUgdGFibGVzLgorCSAqLworCWZvciAoaXRlciA9IDA7IGl0ZXIgPCBCWl9OX0lURVJTOyBpdGVyKyspIHsKKwkJZm9yICh0ID0gMDsgdCA8IG5Hcm91cHM7IHQrKykKKwkJCWZhdmVbdF0gPSAwOworCisJCWZvciAodCA9IDA7IHQgPCBuR3JvdXBzOyB0KyspCisJCQlmb3IgKHYgPSAwOyB2IDwgYWxwaGFTaXplOyB2KyspCisJCQkJcy0+cmZyZXFbdF1bdl0gPSAwOworCisjaWYgQ09ORklHX0JaSVAyX0ZBU1QgPj0gNQorCQkvKgorCQkgKiBTZXQgdXAgYW4gYXV4aWxpYXJ5IGxlbmd0aCB0YWJsZSB3aGljaCBpcyB1c2VkIHRvIGZhc3QtdHJhY2sKKwkJICogdGhlIGNvbW1vbiBjYXNlIChuR3JvdXBzID09IDYpLgorCQkgKi8KKwkJaWYgKG5Hcm91cHMgPT0gNikgeworCQkJZm9yICh2ID0gMDsgdiA8IGFscGhhU2l6ZTsgdisrKSB7CisJCQkJcy0+bGVuX3BhY2tbdl1bMF0gPSAocy0+bGVuWzFdW3ZdIDw8IDE2KSB8IHMtPmxlblswXVt2XTsKKwkJCQlzLT5sZW5fcGFja1t2XVsxXSA9IChzLT5sZW5bM11bdl0gPDwgMTYpIHwgcy0+bGVuWzJdW3ZdOworCQkJCXMtPmxlbl9wYWNrW3ZdWzJdID0gKHMtPmxlbls1XVt2XSA8PCAxNikgfCBzLT5sZW5bNF1bdl07CisJCQl9CisJCX0KKyNlbmRpZgorCQluU2VsZWN0b3JzID0gMDsKKwkJZ3MgPSAwOworCQl3aGlsZSAoMSkgeworCQkJLyotLS0gU2V0IGdyb3VwIHN0YXJ0ICYgZW5kIG1hcmtzLiAtLSovCisJCQlpZiAoZ3MgPj0gcy0+bk1URikKKwkJCQlicmVhazsKKwkJCWdlID0gZ3MgKyBCWl9HX1NJWkUgLSAxOworCQkJaWYgKGdlID49IHMtPm5NVEYpCisJCQkJZ2UgPSBzLT5uTVRGLTE7CisKKwkJCS8qCisJCQkgKiBDYWxjdWxhdGUgdGhlIGNvc3Qgb2YgdGhpcyBncm91cCBhcyBjb2RlZAorCQkJICogYnkgZWFjaCBvZiB0aGUgY29kaW5nIHRhYmxlcy4KKwkJCSAqLworCQkJZm9yICh0ID0gMDsgdCA8IG5Hcm91cHM7IHQrKykKKwkJCQljb3N0W3RdID0gMDsKKyNpZiBDT05GSUdfQlpJUDJfRkFTVCA+PSA1CisJCQlpZiAobkdyb3VwcyA9PSA2ICYmIDUwID09IGdlLWdzKzEpIHsKKwkJCQkvKi0tLSBmYXN0IHRyYWNrIHRoZSBjb21tb24gY2FzZSAtLS0qLworCQkJCXJlZ2lzdGVyIHVpbnQzMl90IGNvc3QwMSwgY29zdDIzLCBjb3N0NDU7CisJCQkJcmVnaXN0ZXIgdWludDE2X3QgaWN2OworCQkJCWNvc3QwMSA9IGNvc3QyMyA9IGNvc3Q0NSA9IDA7CisjZGVmaW5lIEJaX0lURVIobm4pIFwKKwlpY3YgPSBtdGZ2W2dzKyhubildOyBcCisJY29zdDAxICs9IHMtPmxlbl9wYWNrW2ljdl1bMF07IFwKKwljb3N0MjMgKz0gcy0+bGVuX3BhY2tbaWN2XVsxXTsgXAorCWNvc3Q0NSArPSBzLT5sZW5fcGFja1tpY3ZdWzJdOworCQkJCUJaX0lURVIoMCk7ICBCWl9JVEVSKDEpOyAgQlpfSVRFUigyKTsgIEJaX0lURVIoMyk7ICBCWl9JVEVSKDQpOworCQkJCUJaX0lURVIoNSk7ICBCWl9JVEVSKDYpOyAgQlpfSVRFUig3KTsgIEJaX0lURVIoOCk7ICBCWl9JVEVSKDkpOworCQkJCUJaX0lURVIoMTApOyBCWl9JVEVSKDExKTsgQlpfSVRFUigxMik7IEJaX0lURVIoMTMpOyBCWl9JVEVSKDE0KTsKKwkJCQlCWl9JVEVSKDE1KTsgQlpfSVRFUigxNik7IEJaX0lURVIoMTcpOyBCWl9JVEVSKDE4KTsgQlpfSVRFUigxOSk7CisJCQkJQlpfSVRFUigyMCk7IEJaX0lURVIoMjEpOyBCWl9JVEVSKDIyKTsgQlpfSVRFUigyMyk7IEJaX0lURVIoMjQpOworCQkJCUJaX0lURVIoMjUpOyBCWl9JVEVSKDI2KTsgQlpfSVRFUigyNyk7IEJaX0lURVIoMjgpOyBCWl9JVEVSKDI5KTsKKwkJCQlCWl9JVEVSKDMwKTsgQlpfSVRFUigzMSk7IEJaX0lURVIoMzIpOyBCWl9JVEVSKDMzKTsgQlpfSVRFUigzNCk7CisJCQkJQlpfSVRFUigzNSk7IEJaX0lURVIoMzYpOyBCWl9JVEVSKDM3KTsgQlpfSVRFUigzOCk7IEJaX0lURVIoMzkpOworCQkJCUJaX0lURVIoNDApOyBCWl9JVEVSKDQxKTsgQlpfSVRFUig0Mik7IEJaX0lURVIoNDMpOyBCWl9JVEVSKDQ0KTsKKwkJCQlCWl9JVEVSKDQ1KTsgQlpfSVRFUig0Nik7IEJaX0lURVIoNDcpOyBCWl9JVEVSKDQ4KTsgQlpfSVRFUig0OSk7CisjdW5kZWYgQlpfSVRFUgorCQkJCWNvc3RbMF0gPSBjb3N0MDEgJiAweGZmZmY7IGNvc3RbMV0gPSBjb3N0MDEgPj4gMTY7CisJCQkJY29zdFsyXSA9IGNvc3QyMyAmIDB4ZmZmZjsgY29zdFszXSA9IGNvc3QyMyA+PiAxNjsKKwkJCQljb3N0WzRdID0gY29zdDQ1ICYgMHhmZmZmOyBjb3N0WzVdID0gY29zdDQ1ID4+IDE2OworCQkJfSBlbHNlCisjZW5kaWYKKwkJCXsKKwkJCQkvKi0tLSBzbG93IHZlcnNpb24gd2hpY2ggY29ycmVjdGx5IGhhbmRsZXMgYWxsIHNpdHVhdGlvbnMgLS0tKi8KKwkJCQlmb3IgKGkgPSBnczsgaSA8PSBnZTsgaSsrKSB7CisJCQkJCXVpbnQxNl90IGljdiA9IG10ZnZbaV07CisJCQkJCWZvciAodCA9IDA7IHQgPCBuR3JvdXBzOyB0KyspCisJCQkJCQljb3N0W3RdICs9IHMtPmxlblt0XVtpY3ZdOworCQkJCX0KKwkJCX0KKwkJCS8qCisJCQkgKiBGaW5kIHRoZSBjb2RpbmcgdGFibGUgd2hpY2ggaXMgYmVzdCBmb3IgdGhpcyBncm91cCwKKwkJCSAqIGFuZCByZWNvcmQgaXRzIGlkZW50aXR5IGluIHRoZSBzZWxlY3RvciB0YWJsZS4KKwkJCSAqLworCQkJLypiYyA9IDk5OTk5OTk5OTsqLworCQkJLypidCA9IC0xOyovCisJCQliYyA9IGNvc3RbMF07CisJCQlidCA9IDA7CisJCQlmb3IgKHQgPSAxIC8qMCovOyB0IDwgbkdyb3VwczsgdCsrKSB7CisJCQkJaWYgKGNvc3RbdF0gPCBiYykgeworCQkJCQliYyA9IGNvc3RbdF07CisJCQkJCWJ0ID0gdDsKKwkJCQl9CisJCQl9CisJCQlmYXZlW2J0XSsrOworCQkJcy0+c2VsZWN0b3JbblNlbGVjdG9yc10gPSBidDsKKwkJCW5TZWxlY3RvcnMrKzsKKworCQkJLyoKKwkJCSAqIEluY3JlbWVudCB0aGUgc3ltYm9sIGZyZXF1ZW5jaWVzIGZvciB0aGUgc2VsZWN0ZWQgdGFibGUuCisJCQkgKi8KKy8qIDElIGZhc3RlciBjb21wcmVzcy4gKzgwMCBieXRlcyAqLworI2lmIENPTkZJR19CWklQMl9GQVNUID49IDQKKwkJCWlmIChuR3JvdXBzID09IDYgJiYgNTAgPT0gZ2UtZ3MrMSkgeworCQkJCS8qLS0tIGZhc3QgdHJhY2sgdGhlIGNvbW1vbiBjYXNlIC0tLSovCisjZGVmaW5lIEJaX0lUVVIobm4pIHMtPnJmcmVxW2J0XVttdGZ2W2dzICsgKG5uKV1dKysKKwkJCQlCWl9JVFVSKDApOyAgQlpfSVRVUigxKTsgIEJaX0lUVVIoMik7ICBCWl9JVFVSKDMpOyAgQlpfSVRVUig0KTsKKwkJCQlCWl9JVFVSKDUpOyAgQlpfSVRVUig2KTsgIEJaX0lUVVIoNyk7ICBCWl9JVFVSKDgpOyAgQlpfSVRVUig5KTsKKwkJCQlCWl9JVFVSKDEwKTsgQlpfSVRVUigxMSk7IEJaX0lUVVIoMTIpOyBCWl9JVFVSKDEzKTsgQlpfSVRVUigxNCk7CisJCQkJQlpfSVRVUigxNSk7IEJaX0lUVVIoMTYpOyBCWl9JVFVSKDE3KTsgQlpfSVRVUigxOCk7IEJaX0lUVVIoMTkpOworCQkJCUJaX0lUVVIoMjApOyBCWl9JVFVSKDIxKTsgQlpfSVRVUigyMik7IEJaX0lUVVIoMjMpOyBCWl9JVFVSKDI0KTsKKwkJCQlCWl9JVFVSKDI1KTsgQlpfSVRVUigyNik7IEJaX0lUVVIoMjcpOyBCWl9JVFVSKDI4KTsgQlpfSVRVUigyOSk7CisJCQkJQlpfSVRVUigzMCk7IEJaX0lUVVIoMzEpOyBCWl9JVFVSKDMyKTsgQlpfSVRVUigzMyk7IEJaX0lUVVIoMzQpOworCQkJCUJaX0lUVVIoMzUpOyBCWl9JVFVSKDM2KTsgQlpfSVRVUigzNyk7IEJaX0lUVVIoMzgpOyBCWl9JVFVSKDM5KTsKKwkJCQlCWl9JVFVSKDQwKTsgQlpfSVRVUig0MSk7IEJaX0lUVVIoNDIpOyBCWl9JVFVSKDQzKTsgQlpfSVRVUig0NCk7CisJCQkJQlpfSVRVUig0NSk7IEJaX0lUVVIoNDYpOyBCWl9JVFVSKDQ3KTsgQlpfSVRVUig0OCk7IEJaX0lUVVIoNDkpOworI3VuZGVmIEJaX0lUVVIKKwkJCQlncyA9IGdlICsgMTsKKwkJCX0gZWxzZQorI2VuZGlmCisJCQl7CisJCQkJLyotLS0gc2xvdyB2ZXJzaW9uIHdoaWNoIGNvcnJlY3RseSBoYW5kbGVzIGFsbCBzaXR1YXRpb25zIC0tLSovCisJCQkJd2hpbGUgKGdzIDw9IGdlKSB7CisJCQkJCXMtPnJmcmVxW2J0XVttdGZ2W2dzXV0rKzsKKwkJCQkJZ3MrKzsKKwkJCQl9CisJCQkJLyogYWxyZWFkeSBpczogZ3MgPSBnZSArIDE7ICovCisJCQl9CisJCX0KKworCQkvKgorCQkgKiBSZWNvbXB1dGUgdGhlIHRhYmxlcyBiYXNlZCBvbiB0aGUgYWNjdW11bGF0ZWQgZnJlcXVlbmNpZXMuCisJCSAqLworCQkvKiBtYXhMZW4gd2FzIGNoYW5nZWQgZnJvbSAyMCB0byAxNyBpbiBiemlwMi0xLjAuMy4gIFNlZQorCQkgKiBjb21tZW50IGluIGh1ZmZtYW4uYyBmb3IgZGV0YWlscy4gKi8KKwkJZm9yICh0ID0gMDsgdCA8IG5Hcm91cHM7IHQrKykKKwkJCUJaMl9oYk1ha2VDb2RlTGVuZ3RocyhzLCAmKHMtPmxlblt0XVswXSksICYocy0+cmZyZXFbdF1bMF0pLCBhbHBoYVNpemUsIDE3IC8qMjAqLyk7CisJfQorCisJQXNzZXJ0SChuR3JvdXBzIDwgOCwgMzAwMik7CisJQXNzZXJ0SChuU2VsZWN0b3JzIDwgMzI3NjggJiYgblNlbGVjdG9ycyA8PSAoMiArICg5MDAwMDAgLyBCWl9HX1NJWkUpKSwgMzAwMyk7CisKKwkvKi0tLSBDb21wdXRlIE1URiB2YWx1ZXMgZm9yIHRoZSBzZWxlY3RvcnMuIC0tLSovCisJeworCQl1aW50OF90IHBvc1tCWl9OX0dST1VQU10sIGxsX2ksIHRtcDIsIHRtcDsKKworCQlmb3IgKGkgPSAwOyBpIDwgbkdyb3VwczsgaSsrKQorCQkJcG9zW2ldID0gaTsKKwkJZm9yIChpID0gMDsgaSA8IG5TZWxlY3RvcnM7IGkrKykgeworCQkJbGxfaSA9IHMtPnNlbGVjdG9yW2ldOworCQkJaiA9IDA7CisJCQl0bXAgPSBwb3Nbal07CisJCQl3aGlsZSAobGxfaSAhPSB0bXApIHsKKwkJCQlqKys7CisJCQkJdG1wMiA9IHRtcDsKKwkJCQl0bXAgPSBwb3Nbal07CisJCQkJcG9zW2pdID0gdG1wMjsKKwkJCX07CisJCQlwb3NbMF0gPSB0bXA7CisJCQlzLT5zZWxlY3Rvck10ZltpXSA9IGo7CisJCX0KKwl9OworCisJLyotLS0gQXNzaWduIGFjdHVhbCBjb2RlcyBmb3IgdGhlIHRhYmxlcy4gLS0qLworCWZvciAodCA9IDA7IHQgPCBuR3JvdXBzOyB0KyspIHsKKwkJbWluTGVuID0gMzI7CisJCW1heExlbiA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBhbHBoYVNpemU7IGkrKykgeworCQkJaWYgKHMtPmxlblt0XVtpXSA+IG1heExlbikgbWF4TGVuID0gcy0+bGVuW3RdW2ldOworCQkJaWYgKHMtPmxlblt0XVtpXSA8IG1pbkxlbikgbWluTGVuID0gcy0+bGVuW3RdW2ldOworCQl9CisJCUFzc2VydEgoIShtYXhMZW4gPiAxNyAvKjIwKi8pLCAzMDA0KTsKKwkJQXNzZXJ0SCghKG1pbkxlbiA8IDEpLCAzMDA1KTsKKwkJQloyX2hiQXNzaWduQ29kZXMoJihzLT5jb2RlW3RdWzBdKSwgJihzLT5sZW5bdF1bMF0pLCBtaW5MZW4sIG1heExlbiwgYWxwaGFTaXplKTsKKwl9CisKKwkvKi0tLSBUcmFuc21pdCB0aGUgbWFwcGluZyB0YWJsZS4gLS0tKi8KKwl7CisJCS8qIGJib3g6IG9wdGltaXplZCBhIGJpdCBtb3JlIHRoYW4gaW4gYnppcDIgKi8KKwkJaW50IGluVXNlMTYgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJaWYgKHNpemVvZihsb25nKSA8PSA0KSB7CisJCQkJaW5Vc2UxNiA9IGluVXNlMTYqMiArCisJCQkJCSgoKihiYl9fYWxpYXNlZF91aW50MzJfdCopJihzLT5pblVzZVtpICogMTYgKyAwXSkKKwkJCQkJfCAqKGJiX19hbGlhc2VkX3VpbnQzMl90KikmKHMtPmluVXNlW2kgKiAxNiArIDRdKQorCQkJCQl8ICooYmJfX2FsaWFzZWRfdWludDMyX3QqKSYocy0+aW5Vc2VbaSAqIDE2ICsgOF0pCisJCQkJCXwgKihiYl9fYWxpYXNlZF91aW50MzJfdCopJihzLT5pblVzZVtpICogMTYgKyAxMl0pKSAhPSAwKTsKKwkJCX0gZWxzZSB7IC8qIE91ciBDUFUgY2FuIGRvIGJldHRlciAqLworCQkJCWluVXNlMTYgPSBpblVzZTE2KjIgKworCQkJCQkoKCooYmJfX2FsaWFzZWRfdWludDY0X3QqKSYocy0+aW5Vc2VbaSAqIDE2ICsgMF0pCisJCQkJCXwgKihiYl9fYWxpYXNlZF91aW50NjRfdCopJihzLT5pblVzZVtpICogMTYgKyA4XSkpICE9IDApOworCQkJfQorCQl9CisKKwkJYnNXKHMsIDE2LCBpblVzZTE2KTsKKworCQlpblVzZTE2IDw8PSAoc2l6ZW9mKGludCkqOCAtIDE2KTsgLyogbW92ZSAxNXRoIGJpdCBpbnRvIHNpZ24gYml0ICovCisJCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCQlpZiAoaW5Vc2UxNiA8IDApIHsKKwkJCQl1bnNpZ25lZCB2MTYgPSAwOworCQkJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKQorCQkJCQl2MTYgPSB2MTYqMiArIHMtPmluVXNlW2kgKiAxNiArIGpdOworCQkJCWJzVyhzLCAxNiwgdjE2KTsKKwkJCX0KKwkJCWluVXNlMTYgPDw9IDE7CisJCX0KKwl9CisKKwkvKi0tLSBOb3cgdGhlIHNlbGVjdG9ycy4gLS0tKi8KKwlic1cocywgMywgbkdyb3Vwcyk7CisJYnNXKHMsIDE1LCBuU2VsZWN0b3JzKTsKKwlmb3IgKGkgPSAwOyBpIDwgblNlbGVjdG9yczsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBzLT5zZWxlY3Rvck10ZltpXTsgaisrKQorCQkJYnNXKHMsIDEsIDEpOworCQlic1cocywgMSwgMCk7CisJfQorCisJLyotLS0gTm93IHRoZSBjb2RpbmcgdGFibGVzLiAtLS0qLworCWZvciAodCA9IDA7IHQgPCBuR3JvdXBzOyB0KyspIHsKKwkJaW50MzJfdCBjdXJyID0gcy0+bGVuW3RdWzBdOworCQlic1cocywgNSwgY3Vycik7CisJCWZvciAoaSA9IDA7IGkgPCBhbHBoYVNpemU7IGkrKykgeworCQkJd2hpbGUgKGN1cnIgPCBzLT5sZW5bdF1baV0pIHsgYnNXKHMsIDIsIDIpOyBjdXJyKys7IC8qIDEwICovIH07CisJCQl3aGlsZSAoY3VyciA+IHMtPmxlblt0XVtpXSkgeyBic1cocywgMiwgMyk7IGN1cnItLTsgLyogMTEgKi8gfTsKKwkJCWJzVyhzLCAxLCAwKTsKKwkJfQorCX0KKworCS8qLS0tIEFuZCBmaW5hbGx5LCB0aGUgYmxvY2sgZGF0YSBwcm9wZXIgLS0tKi8KKwlzZWxDdHIgPSAwOworCWdzID0gMDsKKwl3aGlsZSAoMSkgeworCQlpZiAoZ3MgPj0gcy0+bk1URikKKwkJCWJyZWFrOworCQlnZSA9IGdzICsgQlpfR19TSVpFIC0gMTsKKwkJaWYgKGdlID49IHMtPm5NVEYpCisJCQlnZSA9IHMtPm5NVEYtMTsKKwkJQXNzZXJ0SChzLT5zZWxlY3RvcltzZWxDdHJdIDwgbkdyb3VwcywgMzAwNik7CisKKy8qIENvc3RzIDEzMDAgYnl0ZXMgYW5kIGlzIF9zbG93ZXJfIChvbiBJbnRlbCBDb3JlIDIpICovCisjaWYgMAorCQlpZiAobkdyb3VwcyA9PSA2ICYmIDUwID09IGdlLWdzKzEpIHsKKwkJCS8qLS0tIGZhc3QgdHJhY2sgdGhlIGNvbW1vbiBjYXNlIC0tLSovCisJCQl1aW50MTZfdCBtdGZ2X2k7CisJCQl1aW50OF90KiBzX2xlbl9zZWxfc2VsQ3RyICA9ICYocy0+bGVuW3MtPnNlbGVjdG9yW3NlbEN0cl1dWzBdKTsKKwkJCWludDMyX3QqIHNfY29kZV9zZWxfc2VsQ3RyID0gJihzLT5jb2RlW3MtPnNlbGVjdG9yW3NlbEN0cl1dWzBdKTsKKyNkZWZpbmUgQlpfSVRBSChubikgXAorCW10ZnZfaSA9IG10ZnZbZ3MrKG5uKV07IFwKKwlic1cocywgc19sZW5fc2VsX3NlbEN0clttdGZ2X2ldLCBzX2NvZGVfc2VsX3NlbEN0clttdGZ2X2ldKQorCQkJQlpfSVRBSCgwKTsgIEJaX0lUQUgoMSk7ICBCWl9JVEFIKDIpOyAgQlpfSVRBSCgzKTsgIEJaX0lUQUgoNCk7CisJCQlCWl9JVEFIKDUpOyAgQlpfSVRBSCg2KTsgIEJaX0lUQUgoNyk7ICBCWl9JVEFIKDgpOyAgQlpfSVRBSCg5KTsKKwkJCUJaX0lUQUgoMTApOyBCWl9JVEFIKDExKTsgQlpfSVRBSCgxMik7IEJaX0lUQUgoMTMpOyBCWl9JVEFIKDE0KTsKKwkJCUJaX0lUQUgoMTUpOyBCWl9JVEFIKDE2KTsgQlpfSVRBSCgxNyk7IEJaX0lUQUgoMTgpOyBCWl9JVEFIKDE5KTsKKwkJCUJaX0lUQUgoMjApOyBCWl9JVEFIKDIxKTsgQlpfSVRBSCgyMik7IEJaX0lUQUgoMjMpOyBCWl9JVEFIKDI0KTsKKwkJCUJaX0lUQUgoMjUpOyBCWl9JVEFIKDI2KTsgQlpfSVRBSCgyNyk7IEJaX0lUQUgoMjgpOyBCWl9JVEFIKDI5KTsKKwkJCUJaX0lUQUgoMzApOyBCWl9JVEFIKDMxKTsgQlpfSVRBSCgzMik7IEJaX0lUQUgoMzMpOyBCWl9JVEFIKDM0KTsKKwkJCUJaX0lUQUgoMzUpOyBCWl9JVEFIKDM2KTsgQlpfSVRBSCgzNyk7IEJaX0lUQUgoMzgpOyBCWl9JVEFIKDM5KTsKKwkJCUJaX0lUQUgoNDApOyBCWl9JVEFIKDQxKTsgQlpfSVRBSCg0Mik7IEJaX0lUQUgoNDMpOyBCWl9JVEFIKDQ0KTsKKwkJCUJaX0lUQUgoNDUpOyBCWl9JVEFIKDQ2KTsgQlpfSVRBSCg0Nyk7IEJaX0lUQUgoNDgpOyBCWl9JVEFIKDQ5KTsKKyN1bmRlZiBCWl9JVEFICisJCQlncyA9IGdlKzE7CisJCX0gZWxzZQorI2VuZGlmCisJCXsKKwkJCS8qLS0tIHNsb3cgdmVyc2lvbiB3aGljaCBjb3JyZWN0bHkgaGFuZGxlcyBhbGwgc2l0dWF0aW9ucyAtLS0qLworCQkJLyogY29kZSBpcyBiaXQgYmlnZ2VyLCBidXQgbW92ZXMgbXVsdGlwbHkgb3V0IG9mIHRoZSBsb29wICovCisJCQl1aW50OF90KiBzX2xlbl9zZWxfc2VsQ3RyICA9ICYocy0+bGVuIFtzLT5zZWxlY3RvcltzZWxDdHJdXVswXSk7CisJCQlpbnQzMl90KiBzX2NvZGVfc2VsX3NlbEN0ciA9ICYocy0+Y29kZVtzLT5zZWxlY3RvcltzZWxDdHJdXVswXSk7CisJCQl3aGlsZSAoZ3MgPD0gZ2UpIHsKKwkJCQlic1cocywKKwkJCQkJc19sZW5fc2VsX3NlbEN0clttdGZ2W2dzXV0sCisJCQkJCXNfY29kZV9zZWxfc2VsQ3RyW210ZnZbZ3NdXQorCQkJCSk7CisJCQkJZ3MrKzsKKwkJCX0KKwkJCS8qIGFscmVhZHkgaXM6IGdzID0gZ2UrMTsgKi8KKwkJfQorCQlzZWxDdHIrKzsKKwl9CisJQXNzZXJ0SChzZWxDdHIgPT0gblNlbGVjdG9ycywgMzAwNyk7CisjdW5kZWYgY29kZQorI3VuZGVmIHJmcmVxCisjdW5kZWYgbGVuX3BhY2sKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitzdGF0aWMKK3ZvaWQgQloyX2NvbXByZXNzQmxvY2soRVN0YXRlKiBzLCBpbnQgaXNfbGFzdF9ibG9jaykKK3sKKwlpZiAocy0+bmJsb2NrID4gMCkgeworCQlCWl9GSU5BTElTRV9DUkMocy0+YmxvY2tDUkMpOworCQlzLT5jb21iaW5lZENSQyA9IChzLT5jb21iaW5lZENSQyA8PCAxKSB8IChzLT5jb21iaW5lZENSQyA+PiAzMSk7CisJCXMtPmNvbWJpbmVkQ1JDIF49IHMtPmJsb2NrQ1JDOworCQlpZiAocy0+YmxvY2tObyA+IDEpCisJCQlzLT5udW1aID0gMDsKKworCQlCWjJfYmxvY2tTb3J0KHMpOworCX0KKworCXMtPnpiaXRzID0gJigodWludDhfdCopcy0+YXJyMilbcy0+bmJsb2NrXTsKKworCS8qLS0gSWYgdGhpcyBpcyB0aGUgZmlyc3QgYmxvY2ssIGNyZWF0ZSB0aGUgc3RyZWFtIGhlYWRlci4gLS0qLworCWlmIChzLT5ibG9ja05vID09IDEpIHsKKwkJQloyX2JzSW5pdFdyaXRlKHMpOworCQkvKmJzUHV0VTgocywgQlpfSERSX0IpOyovCisJCS8qYnNQdXRVOChzLCBCWl9IRFJfWik7Ki8KKwkJLypic1B1dFU4KHMsIEJaX0hEUl9oKTsqLworCQkvKmJzUHV0VTgocywgQlpfSERSXzAgKyBzLT5ibG9ja1NpemUxMDBrKTsqLworCQlic1B1dFUzMihzLCBCWl9IRFJfQlpoMCArIHMtPmJsb2NrU2l6ZTEwMGspOworCX0KKworCWlmIChzLT5uYmxvY2sgPiAwKSB7CisJCS8qYnNQdXRVOChzLCAweDMxKTsqLworCQkvKmJzUHV0VTgocywgMHg0MSk7Ki8KKwkJLypic1B1dFU4KHMsIDB4NTkpOyovCisJCS8qYnNQdXRVOChzLCAweDI2KTsqLworCQlic1B1dFUzMihzLCAweDMxNDE1OTI2KTsKKwkJLypic1B1dFU4KHMsIDB4NTMpOyovCisJCS8qYnNQdXRVOChzLCAweDU5KTsqLworCQlic1B1dFUxNihzLCAweDUzNTkpOworCisJCS8qLS0gTm93IHRoZSBibG9jaydzIENSQywgc28gaXQgaXMgaW4gYSBrbm93biBwbGFjZS4gLS0qLworCQlic1B1dFUzMihzLCBzLT5ibG9ja0NSQyk7CisKKwkJLyoKKwkJICogTm93IGEgc2luZ2xlIGJpdCBpbmRpY2F0aW5nIChub24tKXJhbmRvbWlzYXRpb24uCisJCSAqIEFzIG9mIHZlcnNpb24gMC45LjUsIHdlIHVzZSBhIGJldHRlciBzb3J0aW5nIGFsZ29yaXRobQorCQkgKiB3aGljaCBtYWtlcyByYW5kb21pc2F0aW9uIHVubmVjZXNzYXJ5LiAgU28gYWx3YXlzIHNldAorCQkgKiB0aGUgcmFuZG9taXNlZCBiaXQgdG8gJ25vJy4gIE9mIGNvdXJzZSwgdGhlIGRlY29kZXIKKwkJICogc3RpbGwgbmVlZHMgdG8gYmUgYWJsZSB0byBoYW5kbGUgcmFuZG9taXNlZCBibG9ja3MKKwkJICogc28gYXMgdG8gbWFpbnRhaW4gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aAorCQkgKiBvbGRlciB2ZXJzaW9ucyBvZiBiemlwMi4KKwkJICovCisJCWJzVyhzLCAxLCAwKTsKKworCQlic1cocywgMjQsIHMtPm9yaWdQdHIpOworCQlnZW5lcmF0ZU1URlZhbHVlcyhzKTsKKwkJc2VuZE1URlZhbHVlcyhzKTsKKwl9CisKKwkvKi0tIElmIHRoaXMgaXMgdGhlIGxhc3QgYmxvY2ssIGFkZCB0aGUgc3RyZWFtIHRyYWlsZXIuIC0tKi8KKwlpZiAoaXNfbGFzdF9ibG9jaykgeworCQkvKmJzUHV0VTgocywgMHgxNyk7Ki8KKwkJLypic1B1dFU4KHMsIDB4NzIpOyovCisJCS8qYnNQdXRVOChzLCAweDQ1KTsqLworCQkvKmJzUHV0VTgocywgMHgzOCk7Ki8KKwkJYnNQdXRVMzIocywgMHgxNzcyNDUzOCk7CisJCS8qYnNQdXRVOChzLCAweDUwKTsqLworCQkvKmJzUHV0VTgocywgMHg5MCk7Ki8KKwkJYnNQdXRVMTYocywgMHg1MDkwKTsKKwkJYnNQdXRVMzIocywgcy0+Y29tYmluZWRDUkMpOworCQlic0ZpbmlzaFdyaXRlKHMpOworCX0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXByZXNzLmMgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L2h1ZmZtYW4uYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvYnovaHVmZm1hbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZWMxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2J6L2h1ZmZtYW4uYwpAQCAtMCwwICsxLDIyOSBAQAorLyoKKyAqIGJ6aXAyIGlzIHdyaXR0ZW4gYnkgSnVsaWFuIFNld2FyZCA8anNld2FyZEBiemlwLm9yZz4uCisgKiBBZGFwdGVkIGZvciBidXN5Ym94IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+LgorICogU2VlIFJFQURNRSBhbmQgTElDRU5TRSBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gSHVmZm1hbiBjb2RpbmcgbG93LWxldmVsIHN0dWZmICAgICAgICAgICAgICAgICAgICAgICAgLS0tKi8KKy8qLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHVmZm1hbi5jIC0tLSovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoaXMgZmlsZSBpcyBwYXJ0IG9mIGJ6aXAyL2xpYmJ6aXAyLCBhIHByb2dyYW0gYW5kIGxpYnJhcnkgZm9yCitsb3NzbGVzcywgYmxvY2stc29ydGluZyBkYXRhIGNvbXByZXNzaW9uLgorCitiemlwMi9saWJiemlwMiB2ZXJzaW9uIDEuMC40IG9mIDIwIERlY2VtYmVyIDIwMDYKK0NvcHlyaWdodCAoQykgMTk5Ni0yMDA2IEp1bGlhbiBTZXdhcmQgPGpzZXdhcmRAYnppcC5vcmc+CisKK1BsZWFzZSByZWFkIHRoZSBXQVJOSU5HLCBESVNDTEFJTUVSIGFuZCBQQVRFTlRTIHNlY3Rpb25zIGluIHRoZQorUkVBRE1FIGZpbGUuCisKK1RoaXMgcHJvZ3JhbSBpcyByZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIGxpY2Vuc2UgY29udGFpbmVkCitpbiB0aGUgZmlsZSBMSUNFTlNFLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qICNpbmNsdWRlICJiemxpYl9wcml2YXRlLmgiICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNkZWZpbmUgV0VJR0hUT0YoenowKSAgKCh6ejApICYgMHhmZmZmZmYwMCkKKyNkZWZpbmUgREVQVEhPRih6ejEpICAgKCh6ejEpICYgMHgwMDAwMDBmZikKKyNkZWZpbmUgTVlNQVgoenoyLHp6MykgKCh6ejIpID4gKHp6MykgPyAoenoyKSA6ICh6ejMpKQorCisjZGVmaW5lIEFERFdFSUdIVFMoencxLHp3MikgXAorCShXRUlHSFRPRih6dzEpK1dFSUdIVE9GKHp3MikpIHwgXAorCSgxICsgTVlNQVgoREVQVEhPRih6dzEpLERFUFRIT0YoencyKSkpCisKKyNkZWZpbmUgVVBIRUFQKHopIFwKK3sgXAorCWludDMyX3QgenosIHRtcDsgXAorCXp6ID0gejsgXAorCXRtcCA9IGhlYXBbenpdOyBcCisJd2hpbGUgKHdlaWdodFt0bXBdIDwgd2VpZ2h0W2hlYXBbenogPj4gMV1dKSB7IFwKKwkJaGVhcFt6el0gPSBoZWFwW3p6ID4+IDFdOyBcCisJCXp6ID4+PSAxOyBcCisJfSBcCisJaGVhcFt6el0gPSB0bXA7IFwKK30KKworCisvKiA5MCBieXRlcywgMC4zJSBvZiBvdmVyYWxsIGNvbXByZXNzIHNwZWVkICovCisjaWYgQ09ORklHX0JaSVAyX0ZBU1QgPj0gMQorCisvKiBtYWNybyB3b3JrcyBiZXR0ZXIgdGhhbiBpbmxpbmUgKGdjYyA0LjIuMSkgKi8KKyNkZWZpbmUgRE9XTkhFQVAxKGhlYXAsIHdlaWdodCwgSGVhcCkgXAoreyBcCisJaW50MzJfdCB6eiwgeXksIHRtcDsgXAorCXp6ID0gMTsgXAorCXRtcCA9IGhlYXBbenpdOyBcCisJd2hpbGUgKDEpIHsgXAorCQl5eSA9IHp6IDw8IDE7IFwKKwkJaWYgKHl5ID4gbkhlYXApIFwKKwkJCWJyZWFrOyBcCisJCWlmICh5eSA8IG5IZWFwIFwKKwkJICYmIHdlaWdodFtoZWFwW3l5KzFdXSA8IHdlaWdodFtoZWFwW3l5XV0pIFwKKwkJCXl5Kys7IFwKKwkJaWYgKHdlaWdodFt0bXBdIDwgd2VpZ2h0W2hlYXBbeXldXSkgXAorCQkJYnJlYWs7IFwKKwkJaGVhcFt6el0gPSBoZWFwW3l5XTsgXAorCQl6eiA9IHl5OyBcCisJfSBcCisJaGVhcFt6el0gPSB0bXA7IFwKK30KKworI2Vsc2UKKworc3RhdGljCit2b2lkIERPV05IRUFQMShpbnQzMl90ICpoZWFwLCBpbnQzMl90ICp3ZWlnaHQsIGludDMyX3QgbkhlYXApCit7CisJaW50MzJfdCB6eiwgeXksIHRtcDsKKwl6eiA9IDE7CisJdG1wID0gaGVhcFt6el07CisJd2hpbGUgKDEpIHsKKwkJeXkgPSB6eiA8PCAxOworCQlpZiAoeXkgPiBuSGVhcCkKKwkJCWJyZWFrOworCQlpZiAoeXkgPCBuSGVhcAorCQkgJiYgd2VpZ2h0W2hlYXBbeXkgKyAxXV0gPCB3ZWlnaHRbaGVhcFt5eV1dKQorCQkJeXkrKzsKKwkJaWYgKHdlaWdodFt0bXBdIDwgd2VpZ2h0W2hlYXBbeXldXSkKKwkJCWJyZWFrOworCQloZWFwW3p6XSA9IGhlYXBbeXldOworCQl6eiA9IHl5OworCX0KKwloZWFwW3p6XSA9IHRtcDsKK30KKworI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3N0YXRpYwordm9pZCBCWjJfaGJNYWtlQ29kZUxlbmd0aHMoRVN0YXRlICpzLAorCQl1aW50OF90ICpsZW4sCisJCWludDMyX3QgKmZyZXEsCisJCWludDMyX3QgYWxwaGFTaXplLAorCQlpbnQzMl90IG1heExlbikKK3sKKwkvKgorCSAqIE5vZGVzIGFuZCBoZWFwIGVudHJpZXMgcnVuIGZyb20gMS4gIEVudHJ5IDAKKwkgKiBmb3IgYm90aCB0aGUgaGVhcCBhbmQgbm9kZXMgaXMgYSBzZW50aW5lbC4KKwkgKi8KKwlpbnQzMl90IG5Ob2RlcywgbkhlYXAsIG4xLCBuMiwgaSwgaiwgazsKKwlCb29sICB0b29Mb25nOworCisJLyogYmJveDogbW92ZWQgdG8gRVN0YXRlIHRvIHNhdmUgc3RhY2sKKwlpbnQzMl90IGhlYXAgIFtCWl9NQVhfQUxQSEFfU0laRSArIDJdOworCWludDMyX3Qgd2VpZ2h0W0JaX01BWF9BTFBIQV9TSVpFICogMl07CisJaW50MzJfdCBwYXJlbnRbQlpfTUFYX0FMUEhBX1NJWkUgKiAyXTsKKwkqLworI2RlZmluZSBoZWFwICAgKHMtPkJaMl9oYk1ha2VDb2RlTGVuZ3Roc19faGVhcCkKKyNkZWZpbmUgd2VpZ2h0IChzLT5CWjJfaGJNYWtlQ29kZUxlbmd0aHNfX3dlaWdodCkKKyNkZWZpbmUgcGFyZW50IChzLT5CWjJfaGJNYWtlQ29kZUxlbmd0aHNfX3BhcmVudCkKKworCWZvciAoaSA9IDA7IGkgPCBhbHBoYVNpemU7IGkrKykKKwkJd2VpZ2h0W2krMV0gPSAoZnJlcVtpXSA9PSAwID8gMSA6IGZyZXFbaV0pIDw8IDg7CisKKwl3aGlsZSAoMSkgeworCQluTm9kZXMgPSBhbHBoYVNpemU7CisJCW5IZWFwID0gMDsKKworCQloZWFwWzBdID0gMDsKKwkJd2VpZ2h0WzBdID0gMDsKKwkJcGFyZW50WzBdID0gLTI7CisKKwkJZm9yIChpID0gMTsgaSA8PSBhbHBoYVNpemU7IGkrKykgeworCQkJcGFyZW50W2ldID0gLTE7CisJCQluSGVhcCsrOworCQkJaGVhcFtuSGVhcF0gPSBpOworCQkJVVBIRUFQKG5IZWFwKTsKKwkJfQorCisJCUFzc2VydEgobkhlYXAgPCAoQlpfTUFYX0FMUEhBX1NJWkUrMiksIDIwMDEpOworCisJCXdoaWxlIChuSGVhcCA+IDEpIHsKKwkJCW4xID0gaGVhcFsxXTsgaGVhcFsxXSA9IGhlYXBbbkhlYXBdOyBuSGVhcC0tOyBET1dOSEVBUDEoaGVhcCwgd2VpZ2h0LCBuSGVhcCk7CisJCQluMiA9IGhlYXBbMV07IGhlYXBbMV0gPSBoZWFwW25IZWFwXTsgbkhlYXAtLTsgRE9XTkhFQVAxKGhlYXAsIHdlaWdodCwgbkhlYXApOworCQkJbk5vZGVzKys7CisJCQlwYXJlbnRbbjFdID0gcGFyZW50W24yXSA9IG5Ob2RlczsKKwkJCXdlaWdodFtuTm9kZXNdID0gQUREV0VJR0hUUyh3ZWlnaHRbbjFdLCB3ZWlnaHRbbjJdKTsKKwkJCXBhcmVudFtuTm9kZXNdID0gLTE7CisJCQluSGVhcCsrOworCQkJaGVhcFtuSGVhcF0gPSBuTm9kZXM7CisJCQlVUEhFQVAobkhlYXApOworCQl9CisKKwkJQXNzZXJ0SChuTm9kZXMgPCAoQlpfTUFYX0FMUEhBX1NJWkUgKiAyKSwgMjAwMik7CisKKwkJdG9vTG9uZyA9IEZhbHNlOworCQlmb3IgKGkgPSAxOyBpIDw9IGFscGhhU2l6ZTsgaSsrKSB7CisJCQlqID0gMDsKKwkJCWsgPSBpOworCQkJd2hpbGUgKHBhcmVudFtrXSA+PSAwKSB7CisJCQkJayA9IHBhcmVudFtrXTsKKwkJCQlqKys7CisJCQl9CisJCQlsZW5baS0xXSA9IGo7CisJCQlpZiAoaiA+IG1heExlbikKKwkJCQl0b29Mb25nID0gVHJ1ZTsKKwkJfQorCisJCWlmICghdG9vTG9uZykKKwkJCWJyZWFrOworCisJCS8qIDE3IE9jdCAwNDoga2VlcC1nb2luZyBjb25kaXRpb24gZm9yIHRoZSBmb2xsb3dpbmcgbG9vcCB1c2VkCisJCXRvIGJlICdpIDwgYWxwaGFTaXplJywgd2hpY2ggbWlzc2VkIHRoZSBsYXN0IGVsZW1lbnQsCisJCXRoZW9yZXRpY2FsbHkgbGVhZGluZyB0byB0aGUgcG9zc2liaWxpdHkgb2YgdGhlIGNvbXByZXNzb3IKKwkJbG9vcGluZy4gIEhvd2V2ZXIsIHRoaXMgY291bnQtc2NhbGluZyBzdGVwIGlzIG9ubHkgbmVlZGVkIGlmCisJCW9uZSBvZiB0aGUgZ2VuZXJhdGVkIEh1ZmZtYW4gY29kZSB3b3JkcyBpcyBsb25nZXIgdGhhbgorCQltYXhMZW4sIHdoaWNoIHVwIHRvIGFuZCBpbmNsdWRpbmcgdmVyc2lvbiAxLjAuMiB3YXMgMjAgYml0cywKKwkJd2hpY2ggaXMgZXh0cmVtZWx5IHVubGlrZWx5LiAgSW4gdmVyc2lvbiAxLjAuMyBtYXhMZW4gd2FzCisJCWNoYW5nZWQgdG8gMTcgYml0cywgd2hpY2ggaGFzIG1pbmltYWwgZWZmZWN0IG9uIGNvbXByZXNzaW9uCisJCXJhdGlvLCBidXQgZG9lcyBtZWFuIHRoaXMgc2NhbGluZyBzdGVwIGlzIHVzZWQgZnJvbSB0aW1lIHRvCisJCXRpbWUsIGVub3VnaCB0byB2ZXJpZnkgdGhhdCBpdCB3b3Jrcy4KKworCQlUaGlzIG1lYW5zIHRoYXQgYnppcDItMS4wLjMgYW5kIGxhdGVyIHdpbGwgb25seSBwcm9kdWNlCisJCUh1ZmZtYW4gY29kZXMgd2l0aCBhIG1heGltdW0gbGVuZ3RoIG9mIDE3IGJpdHMuICBIb3dldmVyLCBpbgorCQlvcmRlciB0byBwcmVzZXJ2ZSBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGJpdHN0cmVhbXMKKwkJcHJvZHVjZWQgYnkgdmVyc2lvbnMgcHJlLTEuMC4zLCB0aGUgZGVjb21wcmVzc29yIG11c3Qgc3RpbGwKKwkJaGFuZGxlIGxlbmd0aHMgb2YgdXAgdG8gMjAuICovCisKKwkJZm9yIChpID0gMTsgaSA8PSBhbHBoYVNpemU7IGkrKykgeworCQkJaiA9IHdlaWdodFtpXSA+PiA4OworCQkJLyogYmJveDogeWVzLCBpdCBpcyBhIHNpZ25lZCBkaXZpc2lvbi4KKwkJCSAqIGRvbid0IHJlcGxhY2Ugd2l0aCBzaGlmdCEgKi8KKwkJCWogPSAxICsgKGogLyAyKTsKKwkJCXdlaWdodFtpXSA9IGogPDwgODsKKwkJfQorCX0KKyN1bmRlZiBoZWFwCisjdW5kZWYgd2VpZ2h0CisjdW5kZWYgcGFyZW50Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworc3RhdGljCit2b2lkIEJaMl9oYkFzc2lnbkNvZGVzKGludDMyX3QgKmNvZGUsCisJCXVpbnQ4X3QgKmxlbmd0aCwKKwkJaW50MzJfdCBtaW5MZW4sCisJCWludDMyX3QgbWF4TGVuLAorCQlpbnQzMl90IGFscGhhU2l6ZSkKK3sKKwlpbnQzMl90IG4sIHZlYywgaTsKKworCXZlYyA9IDA7CisJZm9yIChuID0gbWluTGVuOyBuIDw9IG1heExlbjsgbisrKSB7CisJCWZvciAoaSA9IDA7IGkgPCBhbHBoYVNpemU7IGkrKykgeworCQkJaWYgKGxlbmd0aFtpXSA9PSBuKSB7CisJCQkJY29kZVtpXSA9IHZlYzsKKwkJCQl2ZWMrKzsKKwkJCX07CisJCX0KKwkJdmVjIDw8PSAxOworCX0KK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyotLS0gZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodWZmbWFuLmMgLS0tKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2RhdGFfYWxpZ24uYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGF0YV9hbGlnbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2Yjg0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2RhdGFfYWxpZ24uYwpAQCAtMCwwICsxLDE1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImJiX2FyY2hpdmUuaCIKKwordm9pZCBGQVNUX0ZVTkMgZGF0YV9hbGlnbihhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSwgdW5zaWduZWQgYm91bmRhcnkpCit7CisJdW5zaWduZWQgc2tpcF9hbW91bnQgPSAoYm91bmRhcnkgLSAoYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCAlIGJvdW5kYXJ5KSkgJSBib3VuZGFyeTsKKworCWFyY2hpdmVfaGFuZGxlLT5zZWVrKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsIHNraXBfYW1vdW50KTsKKwlhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0ICs9IHNraXBfYW1vdW50OworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9kYXRhX2V4dHJhY3RfYWxsLmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2RhdGFfZXh0cmFjdF9hbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTc3NmRjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9kYXRhX2V4dHJhY3RfYWxsLmMKQEAgLTAsMCArMSwyMTMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYmJfYXJjaGl2ZS5oIgorCit2b2lkIEZBU1RfRlVOQyBkYXRhX2V4dHJhY3RfYWxsKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKQoreworCWZpbGVfaGVhZGVyX3QgKmZpbGVfaGVhZGVyID0gYXJjaGl2ZV9oYW5kbGUtPmZpbGVfaGVhZGVyOworCWludCBkc3RfZmQ7CisJaW50IHJlczsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9TRUxJTlVYCisJY2hhciAqc2N0eCA9IGFyY2hpdmVfaGFuZGxlLT50YXJfX3NjdHhbUEFYX05FWFRfRklMRV07CisJaWYgKCFzY3R4KQorCQlzY3R4ID0gYXJjaGl2ZV9oYW5kbGUtPnRhcl9fc2N0eFtQQVhfR0xPQkFMXTsKKwlpZiAoc2N0eCkgeyAvKiBzZXRmc2NyZWF0ZWNvbiBpcyA0IHN5c2NhbGxzLCBhdm9pZCBpZiBwb3NzaWJsZSAqLworCQlzZXRmc2NyZWF0ZWNvbihzY3R4KTsKKwkJZnJlZShhcmNoaXZlX2hhbmRsZS0+dGFyX19zY3R4W1BBWF9ORVhUX0ZJTEVdKTsKKwkJYXJjaGl2ZV9oYW5kbGUtPnRhcl9fc2N0eFtQQVhfTkVYVF9GSUxFXSA9IE5VTEw7CisJfQorI2VuZGlmCisKKwlpZiAoYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzICYgQVJDSElWRV9DUkVBVEVfTEVBRElOR19ESVJTKSB7CisJCWNoYXIgKnNsYXNoID0gc3RycmNocihmaWxlX2hlYWRlci0+bmFtZSwgJy8nKTsKKwkJaWYgKHNsYXNoKSB7CisJCQkqc2xhc2ggPSAnXDAnOworCQkJYmJfbWFrZV9kaXJlY3RvcnkoZmlsZV9oZWFkZXItPm5hbWUsIC0xLCBGSUxFVVRJTFNfUkVDVVIpOworCQkJKnNsYXNoID0gJy8nOworCQl9CisJfQorCisJaWYgKGFyY2hpdmVfaGFuZGxlLT5haF9mbGFncyAmIEFSQ0hJVkVfVU5MSU5LX09MRCkgeworCQkvKiBSZW1vdmUgdGhlIGVudHJ5IGlmIGl0IGV4aXN0cyAqLworCQlpZiAoIVNfSVNESVIoZmlsZV9oZWFkZXItPm1vZGUpKSB7CisJCQkvKiBJcyBpdCBoYXJkbGluaz8KKwkJCSAqIFdlIGVuY29kZSBoYXJkIGxpbmtzIGFzIHJlZ3VsYXIgZmlsZXMgb2Ygc2l6ZSAwIHdpdGggYSBzeW1saW5rICovCisJCQlpZiAoU19JU1JFRyhmaWxlX2hlYWRlci0+bW9kZSkKKwkJCSAmJiBmaWxlX2hlYWRlci0+bGlua190YXJnZXQKKwkJCSAmJiBmaWxlX2hlYWRlci0+c2l6ZSA9PSAwCisJCQkpIHsKKwkJCQkvKiBVZ2x5IHNwZWNpYWwgY2FzZToKKwkJCQkgKiB0YXIgY2YgdC50YXIgaGFyZGxpbmsxIGhhcmRsaW5rMiBoYXJkbGluazEKKwkJCQkgKiByZXN1bHRzIGluIHRoaXMgdGFyYmFsbCBzdHJ1Y3R1cmU6CisJCQkJICogaGFyZGxpbmsxCisJCQkJICogaGFyZGxpbmsyIC0+IGhhcmRsaW5rMQorCQkJCSAqIGhhcmRsaW5rMSAtPiBoYXJkbGluazEgPD09ICEhIQorCQkJCSAqLworCQkJCWlmIChzdHJjbXAoZmlsZV9oZWFkZXItPmxpbmtfdGFyZ2V0LCBmaWxlX2hlYWRlci0+bmFtZSkgPT0gMCkKKwkJCQkJZ290byByZXQ7CisJCQl9CisJCQkvKiBQcm9jZWVkIHdpdGggZGVsZXRpbmcgKi8KKwkJCWlmICh1bmxpbmsoZmlsZV9oZWFkZXItPm5hbWUpID09IC0xCisJCQkgJiYgZXJybm8gIT0gRU5PRU5UCisJCQkpIHsKKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJlbW92ZSBvbGQgZmlsZSAlcyIsCisJCQkJCQlmaWxlX2hlYWRlci0+bmFtZSk7CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZiAoYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzICYgQVJDSElWRV9FWFRSQUNUX05FV0VSKSB7CisJCS8qIFJlbW92ZSB0aGUgZXhpc3RpbmcgZW50cnkgaWYgaXRzIG9sZGVyIHRoYW4gdGhlIGV4dHJhY3RlZCBlbnRyeSAqLworCQlzdHJ1Y3Qgc3RhdCBleGlzdGluZ19zYjsKKwkJaWYgKGxzdGF0KGZpbGVfaGVhZGVyLT5uYW1lLCAmZXhpc3Rpbmdfc2IpID09IC0xKSB7CisJCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzdGF0IG9sZCBmaWxlIik7CisJCQl9CisJCX0KKwkJZWxzZSBpZiAoZXhpc3Rpbmdfc2Iuc3RfbXRpbWUgPj0gZmlsZV9oZWFkZXItPm10aW1lKSB7CisJCQlpZiAoIShhcmNoaXZlX2hhbmRsZS0+YWhfZmxhZ3MgJiBBUkNISVZFX0VYVFJBQ1RfUVVJRVQpCisJCQkgJiYgIVNfSVNESVIoZmlsZV9oZWFkZXItPm1vZGUpCisJCQkpIHsKKwkJCQliYl9lcnJvcl9tc2coIiVzIG5vdCBjcmVhdGVkOiBuZXdlciBvciAiCisJCQkJCSJzYW1lIGFnZSBmaWxlIGV4aXN0cyIsIGZpbGVfaGVhZGVyLT5uYW1lKTsKKwkJCX0KKwkJCWRhdGFfc2tpcChhcmNoaXZlX2hhbmRsZSk7CisJCQlnb3RvIHJldDsKKwkJfQorCQllbHNlIGlmICgodW5saW5rKGZpbGVfaGVhZGVyLT5uYW1lKSA9PSAtMSkgJiYgKGVycm5vICE9IEVJU0RJUikpIHsKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgcmVtb3ZlIG9sZCBmaWxlICVzIiwKKwkJCQkJZmlsZV9oZWFkZXItPm5hbWUpOworCQl9CisJfQorCisJLyogSGFuZGxlIGhhcmQgbGlua3Mgc2VwYXJhdGVseQorCSAqIFdlIGVuY29kZSBoYXJkIGxpbmtzIGFzIHJlZ3VsYXIgZmlsZXMgb2Ygc2l6ZSAwIHdpdGggYSBzeW1saW5rICovCisJaWYgKFNfSVNSRUcoZmlsZV9oZWFkZXItPm1vZGUpCisJICYmIGZpbGVfaGVhZGVyLT5saW5rX3RhcmdldAorCSAmJiBmaWxlX2hlYWRlci0+c2l6ZSA9PSAwCisJKSB7CisJCS8qIGhhcmQgbGluayAqLworCQlyZXMgPSBsaW5rKGZpbGVfaGVhZGVyLT5saW5rX3RhcmdldCwgZmlsZV9oZWFkZXItPm5hbWUpOworCQlpZiAoKHJlcyA9PSAtMSkgJiYgIShhcmNoaXZlX2hhbmRsZS0+YWhfZmxhZ3MgJiBBUkNISVZFX0VYVFJBQ1RfUVVJRVQpKSB7CisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjcmVhdGUgJXNsaW5rICIKKwkJCQkJImZyb20gJXMgdG8gJXMiLCAiaGFyZCIsCisJCQkJCWZpbGVfaGVhZGVyLT5uYW1lLAorCQkJCQlmaWxlX2hlYWRlci0+bGlua190YXJnZXQpOworCQl9CisJCS8qIEhhcmRsaW5rcyBoYXZlIG5vIHNlcGFyYXRlIG1vZGUvb3duZXJzaGlwLCBza2lwIGNob3duL2NobW9kICovCisJCWdvdG8gcmV0OworCX0KKworCS8qIENyZWF0ZSB0aGUgZmlsZXN5c3RlbSBlbnRyeSAqLworCXN3aXRjaCAoZmlsZV9oZWFkZXItPm1vZGUgJiBTX0lGTVQpIHsKKwljYXNlIFNfSUZSRUc6IHsKKwkJLyogUmVndWxhciBmaWxlICovCisJCWNoYXIgKmRzdF9uYW1lOworCQlpbnQgZmxhZ3MgPSBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0VYQ0w7CisJCWlmIChhcmNoaXZlX2hhbmRsZS0+YWhfZmxhZ3MgJiBBUkNISVZFX09fVFJVTkMpCisJCQlmbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkM7CisJCWRzdF9uYW1lID0gZmlsZV9oZWFkZXItPm5hbWU7CisjaWZkZWYgQVJDSElWRV9SRVBMQUNFX1ZJQV9SRU5BTUUKKwkJaWYgKGFyY2hpdmVfaGFuZGxlLT5haF9mbGFncyAmIEFSQ0hJVkVfUkVQTEFDRV9WSUFfUkVOQU1FKQorCQkJLyogcnBtLXN0eWxlIHRlbXAgZmlsZSBuYW1lICovCisJCQlkc3RfbmFtZSA9IHhhc3ByaW50ZigiJXM7JXgiLCBkc3RfbmFtZSwgKGludClnZXRwaWQoKSk7CisjZW5kaWYKKwkJZHN0X2ZkID0geG9wZW4zKGRzdF9uYW1lLAorCQkJZmxhZ3MsCisJCQlmaWxlX2hlYWRlci0+bW9kZQorCQkJKTsKKwkJYmJfY29weWZkX2V4YWN0X3NpemUoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgZHN0X2ZkLCBmaWxlX2hlYWRlci0+c2l6ZSk7CisJCWNsb3NlKGRzdF9mZCk7CisjaWZkZWYgQVJDSElWRV9SRVBMQUNFX1ZJQV9SRU5BTUUKKwkJaWYgKGFyY2hpdmVfaGFuZGxlLT5haF9mbGFncyAmIEFSQ0hJVkVfUkVQTEFDRV9WSUFfUkVOQU1FKSB7CisJCQl4cmVuYW1lKGRzdF9uYW1lLCBmaWxlX2hlYWRlci0+bmFtZSk7CisJCQlmcmVlKGRzdF9uYW1lKTsKKwkJfQorI2VuZGlmCisJCWJyZWFrOworCX0KKwljYXNlIFNfSUZESVI6CisJCXJlcyA9IG1rZGlyKGZpbGVfaGVhZGVyLT5uYW1lLCBmaWxlX2hlYWRlci0+bW9kZSk7CisJCWlmICgocmVzID09IC0xKQorCQkgJiYgKGVycm5vICE9IEVJU0RJUikgLyogYnR3LCBMaW51eCBkb2Vzbid0IHJldHVybiB0aGlzICovCisJCSAmJiAoZXJybm8gIT0gRUVYSVNUKQorCQkgJiYgIShhcmNoaXZlX2hhbmRsZS0+YWhfZmxhZ3MgJiBBUkNISVZFX0VYVFJBQ1RfUVVJRVQpCisJCSkgeworCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgbWFrZSBkaXIgJXMiLCBmaWxlX2hlYWRlci0+bmFtZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTX0lGTE5LOgorCQkvKiBTeW1saW5rICovCisvL1RPRE86IHdoYXQgaWYgZmlsZV9oZWFkZXItPmxpbmtfdGFyZ2V0ID09IE5VTEwgKHNheSwgY29ycnVwdGVkIHRhcmJhbGw/KQorCQlyZXMgPSBzeW1saW5rKGZpbGVfaGVhZGVyLT5saW5rX3RhcmdldCwgZmlsZV9oZWFkZXItPm5hbWUpOworCQlpZiAoKHJlcyA9PSAtMSkKKwkJICYmICEoYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzICYgQVJDSElWRV9FWFRSQUNUX1FVSUVUKQorCQkpIHsKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IGNyZWF0ZSAlc2xpbmsgIgorCQkJCSJmcm9tICVzIHRvICVzIiwgInN5bSIsCisJCQkJZmlsZV9oZWFkZXItPm5hbWUsCisJCQkJZmlsZV9oZWFkZXItPmxpbmtfdGFyZ2V0KTsKKwkJfQorCQlicmVhazsKKwljYXNlIFNfSUZTT0NLOgorCWNhc2UgU19JRkJMSzoKKwljYXNlIFNfSUZDSFI6CisJY2FzZSBTX0lGSUZPOgorCQlyZXMgPSBta25vZChmaWxlX2hlYWRlci0+bmFtZSwgZmlsZV9oZWFkZXItPm1vZGUsIGZpbGVfaGVhZGVyLT5kZXZpY2UpOworCQlpZiAoKHJlcyA9PSAtMSkKKwkJICYmICEoYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzICYgQVJDSElWRV9FWFRSQUNUX1FVSUVUKQorCQkpIHsKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IGNyZWF0ZSBub2RlICVzIiwgZmlsZV9oZWFkZXItPm5hbWUpOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bnJlY29nbml6ZWQgZmlsZSB0eXBlIik7CisJfQorCisJaWYgKCFTX0lTTE5LKGZpbGVfaGVhZGVyLT5tb2RlKSkgeworCQlpZiAoIShhcmNoaXZlX2hhbmRsZS0+YWhfZmxhZ3MgJiBBUkNISVZFX0RPTlRfUkVTVE9SRV9PV05FUikpIHsKKwkJCXVpZF90IHVpZCA9IGZpbGVfaGVhZGVyLT51aWQ7CisJCQlnaWRfdCBnaWQgPSBmaWxlX2hlYWRlci0+Z2lkOworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9VTkFNRV9HTkFNRQorCQkJaWYgKCEoYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzICYgQVJDSElWRV9OVU1FUklDX09XTkVSKSkgeworCQkJCWlmIChmaWxlX2hlYWRlci0+dGFyX191bmFtZSkgeworLy9UT0RPOiBjYWNoZSBsYXN0IG5hbWUvaWQgcGFpcj8KKwkJCQkJc3RydWN0IHBhc3N3ZCAqcHdkID0gZ2V0cHduYW0oZmlsZV9oZWFkZXItPnRhcl9fdW5hbWUpOworCQkJCQlpZiAocHdkKSB1aWQgPSBwd2QtPnB3X3VpZDsKKwkJCQl9CisJCQkJaWYgKGZpbGVfaGVhZGVyLT50YXJfX2duYW1lKSB7CisJCQkJCXN0cnVjdCBncm91cCAqZ3JwID0gZ2V0Z3JuYW0oZmlsZV9oZWFkZXItPnRhcl9fZ25hbWUpOworCQkJCQlpZiAoZ3JwKSBnaWQgPSBncnAtPmdyX2dpZDsKKwkJCQl9CisJCQl9CisjZW5kaWYKKwkJCS8qIEdOVSB0YXIgMS4xNS4xIHVzZXMgY2hvd24sIG5vdCBsY2hvd24gKi8KKwkJCWNob3duKGZpbGVfaGVhZGVyLT5uYW1lLCB1aWQsIGdpZCk7CisJCX0KKwkJLyogdWNsaWJjIGhhcyBubyBsY2htb2QsIGdsaWJjIGlzIGV2ZW4gc3RyYW5nZXIgLQorCQkgKiBpdCBoYXMgbGNobW9kIHdoaWNoIHNlZW1zIHRvIGRvIG5vdGhpbmchCisJCSAqIHNvIHdlIHVzZSBjaG1vZC4uLiAqLworCQlpZiAoIShhcmNoaXZlX2hhbmRsZS0+YWhfZmxhZ3MgJiBBUkNISVZFX0RPTlRfUkVTVE9SRV9QRVJNKSkgeworCQkJY2htb2QoZmlsZV9oZWFkZXItPm5hbWUsIGZpbGVfaGVhZGVyLT5tb2RlKTsKKwkJfQorCQlpZiAoYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzICYgQVJDSElWRV9SRVNUT1JFX0RBVEUpIHsKKwkJCXN0cnVjdCB0aW1ldmFsIHRbMl07CisKKwkJCXRbMV0udHZfc2VjID0gdFswXS50dl9zZWMgPSBmaWxlX2hlYWRlci0+bXRpbWU7CisJCQl0WzFdLnR2X3VzZWMgPSB0WzBdLnR2X3VzZWMgPSAwOworCQkJdXRpbWVzKGZpbGVfaGVhZGVyLT5uYW1lLCB0KTsKKwkJfQorCX0KKworIHJldDogOworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9TRUxJTlVYCisJaWYgKHNjdHgpIHsKKwkJLyogcmVzZXQgdGhlIGNvbnRleHQgYWZ0ZXIgY3JlYXRpbmcgYW4gZW50cnkgKi8KKwkJc2V0ZnNjcmVhdGVjb24oTlVMTCk7CisJfQorI2VuZGlmCit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2RhdGFfZXh0cmFjdF90b19jb21tYW5kLmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2RhdGFfZXh0cmFjdF90b19jb21tYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY1MzE3YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGF0YV9leHRyYWN0X3RvX2NvbW1hbmQuYwpAQCAtMCwwICsxLDEzOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJiYl9hcmNoaXZlLmgiCisKK2VudW0geworCS8vVEFSX0ZJTEVUWVBFLAorCVRBUl9NT0RFLAorCVRBUl9GSUxFTkFNRSwKKwlUQVJfUkVBTE5BTUUsCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FCisJVEFSX1VOQU1FLAorCVRBUl9HTkFNRSwKKyNlbmRpZgorCVRBUl9TSVpFLAorCVRBUl9VSUQsCisJVEFSX0dJRCwKKwlUQVJfTUFYLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhcl92YXJbXSA9IHsKKwkvLyAiRklMRVRZUEUiLAorCSJNT0RFIiwKKwkiRklMRU5BTUUiLAorCSJSRUFMTkFNRSIsCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FCisJIlVOQU1FIiwKKwkiR05BTUUiLAorI2VuZGlmCisJIlNJWkUiLAorCSJVSUQiLAorCSJHSUQiLAorfTsKKworc3RhdGljIHZvaWQgeHB1dGVudihjaGFyICpzdHIpCit7CisJaWYgKHB1dGVudihzdHIpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfbWVtb3J5X2V4aGF1c3RlZCk7Cit9CisKK3N0YXRpYyB2b2lkIHN0cjJlbnYoY2hhciAqZW52W10sIGludCBpZHgsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwllbnZbaWR4XSA9IHhhc3ByaW50ZigiVEFSXyVzPSVzIiwgdGFyX3ZhcltpZHhdLCBzdHIpOworCXhwdXRlbnYoZW52W2lkeF0pOworfQorCitzdGF0aWMgdm9pZCBkZWMyZW52KGNoYXIgKmVudltdLCBpbnQgaWR4LCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsKQoreworCWVudltpZHhdID0geGFzcHJpbnRmKCJUQVJfJXM9JWxsdSIsIHRhcl92YXJbaWR4XSwgdmFsKTsKKwl4cHV0ZW52KGVudltpZHhdKTsKK30KKworc3RhdGljIHZvaWQgb2N0MmVudihjaGFyICplbnZbXSwgaW50IGlkeCwgdW5zaWduZWQgbG9uZyB2YWwpCit7CisJZW52W2lkeF0gPSB4YXNwcmludGYoIlRBUl8lcz0lbG8iLCB0YXJfdmFyW2lkeF0sIHZhbCk7CisJeHB1dGVudihlbnZbaWR4XSk7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIGRhdGFfZXh0cmFjdF90b19jb21tYW5kKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKQoreworCWZpbGVfaGVhZGVyX3QgKmZpbGVfaGVhZGVyID0gYXJjaGl2ZV9oYW5kbGUtPmZpbGVfaGVhZGVyOworCisjaWYgMCAvKiBkbyB3ZSBuZWVkIHRoaXM/IEVOQUJMRV9GRUFUVVJFX1RBUl9TRUxJTlVYICovCisJY2hhciAqc2N0eCA9IGFyY2hpdmVfaGFuZGxlLT50YXJfX3NjdHhbUEFYX05FWFRfRklMRV07CisJaWYgKCFzY3R4KQorCQlzY3R4ID0gYXJjaGl2ZV9oYW5kbGUtPnRhcl9fc2N0eFtQQVhfR0xPQkFMXTsKKwlpZiAoc2N0eCkgeyAvKiBzZXRmc2NyZWF0ZWNvbiBpcyA0IHN5c2NhbGxzLCBhdm9pZCBpZiBwb3NzaWJsZSAqLworCQlzZXRmc2NyZWF0ZWNvbihzY3R4KTsKKwkJZnJlZShhcmNoaXZlX2hhbmRsZS0+dGFyX19zY3R4W1BBWF9ORVhUX0ZJTEVdKTsKKwkJYXJjaGl2ZV9oYW5kbGUtPnRhcl9fc2N0eFtQQVhfTkVYVF9GSUxFXSA9IE5VTEw7CisJfQorI2VuZGlmCisKKwlpZiAoKGZpbGVfaGVhZGVyLT5tb2RlICYgU19JRk1UKSA9PSBTX0lGUkVHKSB7CisJCXBpZF90IHBpZDsKKwkJaW50IHBbMl0sIHN0YXR1czsKKwkJY2hhciAqdGFyX2VudltUQVJfTUFYXTsKKworCQltZW1zZXQodGFyX2VudiwgMCwgc2l6ZW9mKHRhcl9lbnYpKTsKKworCQl4cGlwZShwKTsKKwkJcGlkID0gQkJfTU1VID8geGZvcmsoKSA6IHh2Zm9yaygpOworCQlpZiAocGlkID09IDApIHsKKwkJCS8qIENoaWxkICovCisJCQkvKiBzdHIyZW52KHRhcl9lbnYsIFRBUl9GSUxFVFlQRSwgImYiKTsgLSBwYXJlbnQgc2hvdWxkIGRvIGl0IG9uY2UgKi8KKwkJCW9jdDJlbnYodGFyX2VudiwgVEFSX01PREUsIGZpbGVfaGVhZGVyLT5tb2RlKTsKKwkJCXN0cjJlbnYodGFyX2VudiwgVEFSX0ZJTEVOQU1FLCBmaWxlX2hlYWRlci0+bmFtZSk7CisJCQlzdHIyZW52KHRhcl9lbnYsIFRBUl9SRUFMTkFNRSwgZmlsZV9oZWFkZXItPm5hbWUpOworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9VTkFNRV9HTkFNRQorCQkJc3RyMmVudih0YXJfZW52LCBUQVJfVU5BTUUsIGZpbGVfaGVhZGVyLT50YXJfX3VuYW1lKTsKKwkJCXN0cjJlbnYodGFyX2VudiwgVEFSX0dOQU1FLCBmaWxlX2hlYWRlci0+dGFyX19nbmFtZSk7CisjZW5kaWYKKwkJCWRlYzJlbnYodGFyX2VudiwgVEFSX1NJWkUsIGZpbGVfaGVhZGVyLT5zaXplKTsKKwkJCWRlYzJlbnYodGFyX2VudiwgVEFSX1VJRCwgZmlsZV9oZWFkZXItPnVpZCk7CisJCQlkZWMyZW52KHRhcl9lbnYsIFRBUl9HSUQsIGZpbGVfaGVhZGVyLT5naWQpOworCQkJY2xvc2UocFsxXSk7CisJCQl4ZHVwMihwWzBdLCBTVERJTl9GSUxFTk8pOworCQkJc2lnbmFsKFNJR1BJUEUsIFNJR19ERkwpOworCQkJZXhlY2woYXJjaGl2ZV9oYW5kbGUtPnRhcl9fdG9fY29tbWFuZF9zaGVsbCwKKwkJCQlhcmNoaXZlX2hhbmRsZS0+dGFyX190b19jb21tYW5kX3NoZWxsLAorCQkJCSItYyIsCisJCQkJYXJjaGl2ZV9oYW5kbGUtPnRhcl9fdG9fY29tbWFuZCwKKwkJCQkoY2hhciAqKTApOworCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBleGVjdXRlICclcyciLCBhcmNoaXZlX2hhbmRsZS0+dGFyX190b19jb21tYW5kX3NoZWxsKTsKKwkJfQorCQljbG9zZShwWzBdKTsKKwkJLyogT3VyIGNhbGxlciBpcyBleHBlY3RlZCB0byBkbyBzaWduYWwoU0lHUElQRSwgU0lHX0lHTikKKwkJICogc28gdGhhdCB3ZSBkb24ndCBkaWUgaWYgY2hpbGQgZG9uJ3QgcmVhZCBhbGwgdGhlIGlucHV0OiAqLworCQliYl9jb3B5ZmRfZXhhY3Rfc2l6ZShhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCBwWzFdLCAtZmlsZV9oZWFkZXItPnNpemUpOworCQljbG9zZShwWzFdKTsKKworCQlpZiAoc2FmZV93YWl0cGlkKHBpZCwgJnN0YXR1cywgMCkgPT0gLTEpCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIndhaXRwaWQiKTsKKwkJaWYgKFdJRkVYSVRFRChzdGF0dXMpICYmIFdFWElUU1RBVFVTKHN0YXR1cykpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJyVzJyByZXR1cm5lZCBzdGF0dXMgJWQiLAorCQkJCWFyY2hpdmVfaGFuZGxlLT50YXJfX3RvX2NvbW1hbmQsIFdFWElUU1RBVFVTKHN0YXR1cykpOworCQlpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCInJXMnIHRlcm1pbmF0ZWQgYnkgc2lnbmFsICVkIiwKKwkJCQlhcmNoaXZlX2hhbmRsZS0+dGFyX190b19jb21tYW5kLCBXVEVSTVNJRyhzdGF0dXMpKTsKKworCQlpZiAoIUJCX01NVSkgeworCQkJaW50IGk7CisJCQlmb3IgKGkgPSAwOyBpIDwgVEFSX01BWDsgaSsrKSB7CisJCQkJaWYgKHRhcl9lbnZbaV0pCisJCQkJCWJiX3Vuc2V0ZW52X2FuZF9mcmVlKHRhcl9lbnZbaV0pOworCQkJfQorCQl9CisJfQorCisjaWYgMCAvKiBFTkFCTEVfRkVBVFVSRV9UQVJfU0VMSU5VWCAqLworCWlmIChzY3R4KQorCQkvKiByZXNldCB0aGUgY29udGV4dCBhZnRlciBjcmVhdGluZyBhbiBlbnRyeSAqLworCQlzZXRmc2NyZWF0ZWNvbihOVUxMKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9kYXRhX2V4dHJhY3RfdG9fc3Rkb3V0LmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2RhdGFfZXh0cmFjdF90b19zdGRvdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODQ5ZjNiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9kYXRhX2V4dHJhY3RfdG9fc3Rkb3V0LmMKQEAgLTAsMCArMSwxNCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJiYl9hcmNoaXZlLmgiCisKK3ZvaWQgRkFTVF9GVU5DIGRhdGFfZXh0cmFjdF90b19zdGRvdXQoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpCit7CisJYmJfY29weWZkX2V4YWN0X3NpemUoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwKKwkJCVNURE9VVF9GSUxFTk8sCisJCQlhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXItPnNpemUpOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9kYXRhX3NraXAuYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGF0YV9za2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg4MTY3ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGF0YV9za2lwLmMKQEAgLTAsMCArMSwxMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJiYl9hcmNoaXZlLmgiCisKK3ZvaWQgRkFTVF9GVU5DIGRhdGFfc2tpcChhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkKK3sKKwlhcmNoaXZlX2hhbmRsZS0+c2VlayhhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCBhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXItPnNpemUpOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9kZWNvbXByZXNzX2J1bnppcDIuYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGVjb21wcmVzc19idW56aXAyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU1OTUzZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGVjb21wcmVzc19idW56aXAyLmMKQEAgLTAsMCArMSw4MjkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogU21hbGwgYnppcDIgZGVmbGF0ZSBpbXBsZW1lbnRhdGlvbiwgYnkgUm9iIExhbmRsZXkgKHJvYkBsYW5kbGV5Lm5ldCkuCisKKyAgIEJhc2VkIG9uIGJ6aXAyIGRlY29tcHJlc3Npb24gY29kZSBieSBKdWxpYW4gUiBTZXdhcmQgKGpzZXdhcmRAYWNtLm9yZyksCisgICB3aGljaCBhbHNvIGFja25vd2xlZGdlcyBjb250cmlidXRpb25zIGJ5IE1pa2UgQnVycm93cywgRGF2aWQgV2hlZWxlciwKKyAgIFBldGVyIEZlbndpY2ssIEFsaXN0YWlyIE1vZmZhdCwgUmFkZm9yZCBOZWFsLCBJYW4gSC4gV2l0dGVuLAorICAgUm9iZXJ0IFNlZGdld2ljaywgYW5kIEpvbiBMLiBCZW50bGV5LgorCisgICBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorKi8KKworLyoKKwlTaXplIGFuZCBzcGVlZCBvcHRpbWl6YXRpb25zIGJ5IE1hbnVlbCBOb3ZvYSBJSUkgIChtam4zQGNvZGVwb2V0Lm9yZykuCisKKwlNb3JlIGVmZmljaWVudCByZWFkaW5nIG9mIEh1ZmZtYW4gY29kZXMsIGEgc3RyZWFtbGluZWQgcmVhZF9idW56aXAoKQorCWZ1bmN0aW9uLCBhbmQgdmFyaW91cyBvdGhlciB0d2Vha3MuICBJbiAobGltaXRlZCkgdGVzdHMsIGFwcHJveGltYXRlbHkKKwkyMCUgZmFzdGVyIHRoYW4gYnpjYXQgb24geDg2IGFuZCBhYm91dCAxMCUgZmFzdGVyIG9uIGFybS4KKworCU5vdGUgdGhhdCBhYm91dCAyLzMgb2YgdGhlIHRpbWUgaXMgc3BlbnQgaW4gcmVhZF9idW56aXAoKSByZXZlcnNpbmcKKwl0aGUgQnVycm93cy1XaGVlbGVyIHRyYW5zZm9ybWF0aW9uLiAgTXVjaCBvZiB0aGF0IHRpbWUgaXMgZGVsYXkKKwlyZXN1bHRpbmcgZnJvbSBjYWNoZSBtaXNzZXMuCisKKwkoMjAxMCB1cGRhdGUgYnkgdmRhOiBwcm9maWxlZCAiYnpjYXQgPDg0bWJ5dGUuYnoyID4vZGV2L251bGwiCisJb24geDg2LTY0IENQVSB3aXRoIEwyID4gMU06IGdldF9uZXh0X2Jsb2NrIGlzIGhvdHRlciB0aGFuIHJlYWRfYnVuemlwOgorCSV0aW1lIHNlY29uZHMgICBjYWxscyBmdW5jdGlvbgorCTcxLjAxICAgMTIuNjkgICAgIDQ0NCBnZXRfbmV4dF9ibG9jaworCTI4LjY1ICAgIDUuMTIgICA5MzA2NSByZWFkX2J1bnppcAorCTAwLjIyICAgIDAuMDQgNzczNjQ5MCBnZXRfYml0cworCTAwLjExICAgIDAuMDIgICAgICA0NyBkZWFsbG9jX2J1bnppcAorCTAwLjAwICAgIDAuMDAgICA5MzAxOCBmdWxsX3dyaXRlCisJLi4uKQorCisKKwlJIHdvdWxkIGFzayB0aGF0IGFueW9uZSBiZW5lZml0aW5nIGZyb20gdGhpcyB3b3JrLCBlc3BlY2lhbGx5IHRob3NlCisJdXNpbmcgaXQgaW4gY29tbWVyY2lhbCBwcm9kdWN0cywgY29uc2lkZXIgbWFraW5nIGEgZG9uYXRpb24gdG8gbXkgbG9jYWwKKwlub24tcHJvZml0IGhvc3BpY2Ugb3JnYW5pemF0aW9uICh3d3cuaG9zcGljZWFjYWRpYW5hLmNvbSkgaW4gdGhlIG5hbWUgb2YKKwl0aGUgd29tYW4gSSBsb3ZlZCwgVG9uaSBXLiBIYWdhbiwgd2hvIHBhc3NlZCBhd2F5IEZlYi4gMTIsIDIwMDMuCisKKwlNYW51ZWwKKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJiYl9hcmNoaXZlLmgiCisKKyNpZiAwCisjIGRlZmluZSBkYmcoLi4uKSBiYl9lcnJvcl9tc2coX19WQV9BUkdTX18pCisjZWxzZQorIyBkZWZpbmUgZGJnKC4uLikgKCh2b2lkKTApCisjZW5kaWYKKworLyogQ29uc3RhbnRzIGZvciBIdWZmbWFuIGNvZGluZyAqLworI2RlZmluZSBNQVhfR1JPVVBTICAgICAgICAgIDYKKyNkZWZpbmUgR1JPVVBfU0laRSAgICAgICAgICA1MCAgICAgIC8qIDY0IHdvdWxkIGhhdmUgYmVlbiBtb3JlIGVmZmljaWVudCAqLworI2RlZmluZSBNQVhfSFVGQ09ERV9CSVRTICAgIDIwICAgICAgLyogTG9uZ2VzdCBIdWZmbWFuIGNvZGUgYWxsb3dlZCAqLworI2RlZmluZSBNQVhfU1lNQk9MUyAgICAgICAgIDI1OCAgICAgLyogMjU2IGxpdGVyYWxzICsgUlVOQSArIFJVTkIgKi8KKyNkZWZpbmUgU1lNQk9MX1JVTkEgICAgICAgICAwCisjZGVmaW5lIFNZTUJPTF9SVU5CICAgICAgICAgMQorCisvKiBTdGF0dXMgcmV0dXJuIHZhbHVlcyAqLworI2RlZmluZSBSRVRWQUxfT0sgICAgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgUkVUVkFMX0xBU1RfQkxPQ0sgICAgICAgICAgICAgICAoZGJnKCIlZCIsIF9fTElORV9fKSwgLTEpCisjZGVmaW5lIFJFVFZBTF9OT1RfQlpJUF9EQVRBICAgICAgICAgICAgKGRiZygiJWQiLCBfX0xJTkVfXyksIC0yKQorI2RlZmluZSBSRVRWQUxfVU5FWFBFQ1RFRF9JTlBVVF9FT0YgICAgIChkYmcoIiVkIiwgX19MSU5FX18pLCAtMykKKyNkZWZpbmUgUkVUVkFMX1NIT1JUX1dSSVRFICAgICAgICAgICAgICAoZGJnKCIlZCIsIF9fTElORV9fKSwgLTQpCisjZGVmaW5lIFJFVFZBTF9EQVRBX0VSUk9SICAgICAgICAgICAgICAgKGRiZygiJWQiLCBfX0xJTkVfXyksIC01KQorI2RlZmluZSBSRVRWQUxfT1VUX09GX01FTU9SWSAgICAgICAgICAgIChkYmcoIiVkIiwgX19MSU5FX18pLCAtNikKKyNkZWZpbmUgUkVUVkFMX09CU09MRVRFX0lOUFVUICAgICAgICAgICAoZGJnKCIlZCIsIF9fTElORV9fKSwgLTcpCisKKy8qIE90aGVyIGhvdXNla2VlcGluZyBjb25zdGFudHMgKi8KKyNkZWZpbmUgSU9CVUZfU0laRSAgICAgICAgICA0MDk2CisKKy8qIFRoaXMgaXMgd2hhdCB3ZSBrbm93IGFib3V0IGVhY2ggSHVmZm1hbiBjb2RpbmcgZ3JvdXAgKi8KK3N0cnVjdCBncm91cF9kYXRhIHsKKwkvKiBXZSBoYXZlIGFuIGV4dHJhIHNsb3QgYXQgdGhlIGVuZCBvZiBsaW1pdFtdIGZvciBhIHNlbnRpbmVsIHZhbHVlLiAqLworCWludCBsaW1pdFtNQVhfSFVGQ09ERV9CSVRTKzFdLCBiYXNlW01BWF9IVUZDT0RFX0JJVFNdLCBwZXJtdXRlW01BWF9TWU1CT0xTXTsKKwlpbnQgbWluTGVuLCBtYXhMZW47Cit9OworCisvKiBTdHJ1Y3R1cmUgaG9sZGluZyBhbGwgdGhlIGhvdXNla2VlcGluZyBkYXRhLCBpbmNsdWRpbmcgSU8gYnVmZmVycyBhbmQKKyAqIG1lbW9yeSB0aGF0IHBlcnNpc3RzIGJldHdlZW4gY2FsbHMgdG8gYnVuemlwCisgKiBGb3VuZCB0aGUgbW9zdCB1c2VkIG1lbWJlcjoKKyAqICBjYXQgdGhpc19maWxlLmMgfCBzZWQgLWUgJ3MvIi8gL2cnIC1lICJzLycvIC9nIiB8IHhhcmdzIC1uMSBcCisgKiAgfCBncmVwICdiZC0+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+cGVybXV0ZVtuZXh0U3ltXTsKKworCQkvKiBXZSBoYXZlIG5vdyBkZWNvZGVkIHRoZSBzeW1ib2wsIHdoaWNoIGluZGljYXRlcyBlaXRoZXIgYSBuZXcgbGl0ZXJhbAorCQkgICBieXRlLCBvciBhIHJlcGVhdGVkIHJ1biBvZiB0aGUgbW9zdCByZWNlbnQgbGl0ZXJhbCBieXRlLiAgRmlyc3QsCisJCSAgIGNoZWNrIGlmIG5leHRTeW0gaW5kaWNhdGVzIGEgcmVwZWF0ZWQgcnVuLCBhbmQgaWYgc28gbG9vcCBjb2xsZWN0aW5nCisJCSAgIGhvdyBtYW55IHRpbWVzIHRvIHJlcGVhdCB0aGUgbGFzdCBsaXRlcmFsLiAqLworCQlpZiAoKHVuc2lnbmVkKW5leHRTeW0gPD0gU1lNQk9MX1JVTkIpIHsgLyogUlVOQSBvciBSVU5CICovCisKKwkJCS8qIElmIHRoaXMgaXMgdGhlIHN0YXJ0IG9mIGEgbmV3IHJ1biwgemVybyBvdXQgY291bnRlciAqLworCQkJaWYgKHJ1blBvcyA9PSAwKSB7CisJCQkJcnVuUG9zID0gMTsKKwkJCQlydW5DbnQgPSAwOworCQkJfQorCisJCQkvKiBOZWF0IHRyaWNrIHRoYXQgc2F2ZXMgMSBzeW1ib2w6IGluc3RlYWQgb2Ygb3ItaW5nIDAgb3IgMSBhdAorCQkJICAgZWFjaCBiaXQgcG9zaXRpb24sIGFkZCAxIG9yIDIgaW5zdGVhZC4gIEZvciBleGFtcGxlLAorCQkJICAgMTAxMSBpcyAxPDwwICsgMTw8MSArIDI8PDIuICAxMDEwIGlzIDI8PDAgKyAyPDwxICsgMTw8Mi4KKwkJCSAgIFlvdSBjYW4gbWFrZSBhbnkgYml0IHBhdHRlcm4gdGhhdCB3YXkgdXNpbmcgMSBsZXNzIHN5bWJvbCB0aGFuCisJCQkgICB0aGUgYmFzaWMgb3IgMC8xIG1ldGhvZCAoZXhjZXB0IGFsbCBiaXRzIDAsIHdoaWNoIHdvdWxkIHVzZSBubworCQkJICAgc3ltYm9scywgYnV0IGEgcnVuIG9mIGxlbmd0aCAwIGRvZXNuJ3QgbWVhbiBhbnl0aGluZyBpbiB0aGlzCisJCQkgICBjb250ZXh0KS4gIFRodXMgc3BhY2UgaXMgc2F2ZWQuICovCisJCQlydW5DbnQgKz0gKHJ1blBvcyA8PCBuZXh0U3ltKTsgLyogK3J1blBvcyBpZiBSVU5BOyArMipydW5Qb3MgaWYgUlVOQiAqLworCQkJaWYgKHJ1blBvcyA8IGRidWZTaXplKSBydW5Qb3MgPDw9IDE7CisJCQlnb3RvIGVuZF9vZl9odWZmbWFuX2xvb3A7CisJCX0KKworCQkvKiBXaGVuIHdlIGhpdCB0aGUgZmlyc3Qgbm9uLXJ1biBzeW1ib2wgYWZ0ZXIgYSBydW4sIHdlIG5vdyBrbm93CisJCSAgIGhvdyBtYW55IHRpbWVzIHRvIHJlcGVhdCB0aGUgbGFzdCBsaXRlcmFsLCBzbyBhcHBlbmQgdGhhdCBtYW55CisJCSAgIGNvcGllcyB0byBvdXIgYnVmZmVyIG9mIGRlY29kZWQgc3ltYm9scyAoZGJ1Zikgbm93LiAgKFRoZSBsYXN0CisJCSAgIGxpdGVyYWwgdXNlZCBpcyB0aGUgb25lIGF0IHRoZSBoZWFkIG9mIHRoZSBtdGZTeW1ib2wgYXJyYXkuKSAqLworCQlpZiAocnVuUG9zICE9IDApIHsKKwkJCXVpbnQ4X3QgdG1wX2J5dGU7CisJCQlpZiAoZGJ1ZkNvdW50ICsgcnVuQ250ID4gZGJ1ZlNpemUpIHsKKwkJCQlkYmcoImRidWZDb3VudDolZCtydW5DbnQ6JWQgJWQgPiBkYnVmU2l6ZTolZCBSRVRWQUxfREFUQV9FUlJPUiIsCisJCQkJCQlkYnVmQ291bnQsIHJ1bkNudCwgZGJ1ZkNvdW50ICsgcnVuQ250LCBkYnVmU2l6ZSk7CisJCQkJcmV0dXJuIFJFVFZBTF9EQVRBX0VSUk9SOworCQkJfQorCQkJdG1wX2J5dGUgPSBzeW1Ub0J5dGVbbXRmU3ltYm9sWzBdXTsKKwkJCWJ5dGVDb3VudFt0bXBfYnl0ZV0gKz0gcnVuQ250OworCQkJd2hpbGUgKC0tcnVuQ250ID49IDApIGRidWZbZGJ1ZkNvdW50KytdID0gKHVpbnQzMl90KXRtcF9ieXRlOworCQkJcnVuUG9zID0gMDsKKwkJfQorCisJCS8qIElzIHRoaXMgdGhlIHRlcm1pbmF0aW5nIHN5bWJvbD8gKi8KKwkJaWYgKG5leHRTeW0gPiBzeW1Ub3RhbCkgYnJlYWs7CisKKwkJLyogQXQgdGhpcyBwb2ludCwgbmV4dFN5bSBpbmRpY2F0ZXMgYSBuZXcgbGl0ZXJhbCBjaGFyYWN0ZXIuICBTdWJ0cmFjdAorCQkgICBvbmUgdG8gZ2V0IHRoZSBwb3NpdGlvbiBpbiB0aGUgTVRGIGFycmF5IGF0IHdoaWNoIHRoaXMgbGl0ZXJhbCBpcworCQkgICBjdXJyZW50bHkgdG8gYmUgZm91bmQuICAoTm90ZSB0aGF0IHRoZSByZXN1bHQgY2FuJ3QgYmUgLTEgb3IgMCwKKwkJICAgYmVjYXVzZSAwIGFuZCAxIGFyZSBSVU5BIGFuZCBSVU5CLiAgQnV0IGFub3RoZXIgaW5zdGFuY2Ugb2YgdGhlCisJCSAgIGZpcnN0IHN5bWJvbCBpbiB0aGUgbXRmIGFycmF5LCBwb3NpdGlvbiAwLCB3b3VsZCBoYXZlIGJlZW4gaGFuZGxlZAorCQkgICBhcyBwYXJ0IG9mIGEgcnVuIGFib3ZlLiAgVGhlcmVmb3JlIDEgdW51c2VkIG10ZiBwb3NpdGlvbiBtaW51cworCQkgICAyIG5vbi1saXRlcmFsIG5leHRTeW0gdmFsdWVzIGVxdWFscyAtMS4pICovCisJCWlmIChkYnVmQ291bnQgPj0gZGJ1ZlNpemUpIHJldHVybiBSRVRWQUxfREFUQV9FUlJPUjsKKwkJaSA9IG5leHRTeW0gLSAxOworCQl1YyA9IG10ZlN5bWJvbFtpXTsKKworCQkvKiBBZGp1c3QgdGhlIE1URiBhcnJheS4gIFNpbmNlIHdlIHR5cGljYWxseSBleHBlY3QgdG8gbW92ZSBvbmx5IGEKKwkJICogc21hbGwgbnVtYmVyIG9mIHN5bWJvbHMsIGFuZCBhcmUgYm91bmQgYnkgMjU2IGluIGFueSBjYXNlLCB1c2luZworCQkgKiBtZW1tb3ZlIGhlcmUgd291bGQgdHlwaWNhbGx5IGJlIGJpZ2dlciBhbmQgc2xvd2VyIGR1ZSB0byBmdW5jdGlvbgorCQkgKiBjYWxsIG92ZXJoZWFkIGFuZCBvdGhlciBhc3NvcnRlZCBzZXR1cCBjb3N0cy4gKi8KKwkJZG8geworCQkJbXRmU3ltYm9sW2ldID0gbXRmU3ltYm9sW2ktMV07CisJCX0gd2hpbGUgKC0taSk7CisJCW10ZlN5bWJvbFswXSA9IHVjOworCQl1YyA9IHN5bVRvQnl0ZVt1Y107CisKKwkJLyogV2UgaGF2ZSBvdXIgbGl0ZXJhbCBieXRlLiAgU2F2ZSBpdCBpbnRvIGRidWYuICovCisJCWJ5dGVDb3VudFt1Y10rKzsKKwkJZGJ1ZltkYnVmQ291bnQrK10gPSAodWludDMyX3QpdWM7CisKKwkJLyogU2tpcCBncm91cCBpbml0aWFsaXphdGlvbiBpZiB3ZSdyZSBub3QgZG9uZSB3aXRoIHRoaXMgZ3JvdXAuICBEb25lCisJCSAqIHRoaXMgd2F5IHRvIGF2b2lkIGNvbXBpbGVyIHdhcm5pbmcuICovCisgZW5kX29mX2h1ZmZtYW5fbG9vcDoKKwkJaWYgKC0tc3ltQ291bnQgPj0gMCkgZ290byBjb250aW51ZV90aGlzX2dyb3VwOworCX0KKworCS8qIEF0IHRoaXMgcG9pbnQsIHdlJ3ZlIHJlYWQgYWxsIHRoZSBIdWZmbWFuLWNvZGVkIHN5bWJvbHMgKGFuZCByZXBlYXRlZAorCSAgIHJ1bnMpIGZvciB0aGlzIGJsb2NrIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgYW5kIGRlY29kZWQgdGhlbSBpbnRvIHRoZQorCSAgIGludGVybWVkaWF0ZSBidWZmZXIuICBUaGVyZSBhcmUgZGJ1ZkNvdW50IG1hbnkgZGVjb2RlZCBieXRlcyBpbiBkYnVmW10uCisJICAgTm93IHVuZG8gdGhlIEJ1cnJvd3MtV2hlZWxlciB0cmFuc2Zvcm0gb24gZGJ1Zi4KKwkgICBTZWUgaHR0cDovL2RvZ21hLm5ldC9tYXJrbi9hcnRpY2xlcy9id3QvYnd0Lmh0bQorCSAqLworCisJLyogVHVybiBieXRlQ291bnQgaW50byBjdW11bGF0aXZlIG9jY3VycmVuY2UgY291bnRzIG9mIDAgdG8gbi0xLiAqLworCWogPSAwOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlpbnQgdG1wX2NvdW50ID0gaiArIGJ5dGVDb3VudFtpXTsKKwkJYnl0ZUNvdW50W2ldID0gajsKKwkJaiA9IHRtcF9jb3VudDsKKwl9CisKKwkvKiBGaWd1cmUgb3V0IHdoYXQgb3JkZXIgZGJ1ZiB3b3VsZCBiZSBpbiBpZiB3ZSBzb3J0ZWQgaXQuICovCisJZm9yIChpID0gMDsgaSA8IGRidWZDb3VudDsgaSsrKSB7CisJCXVpbnQ4X3QgdG1wX2J5dGUgPSAodWludDhfdClkYnVmW2ldOworCQlpbnQgdG1wX2NvdW50ID0gYnl0ZUNvdW50W3RtcF9ieXRlXTsKKwkJZGJ1Zlt0bXBfY291bnRdIHw9IChpIDw8IDgpOworCQlieXRlQ291bnRbdG1wX2J5dGVdID0gdG1wX2NvdW50ICsgMTsKKwl9CisKKwkvKiBEZWNvZGUgZmlyc3QgYnl0ZSBieSBoYW5kIHRvIGluaXRpYWxpemUgInByZXZpb3VzIiBieXRlLiAgTm90ZSB0aGF0IGl0CisJICAgZG9lc24ndCBnZXQgb3V0cHV0LCBhbmQgaWYgdGhlIGZpcnN0IHRocmVlIGNoYXJhY3RlcnMgYXJlIGlkZW50aWNhbAorCSAgIGl0IGRvZXNuJ3QgcXVhbGlmeSBhcyBhIHJ1biAoaGVuY2Ugd3JpdGVSdW5Db3VudGRvd249NSkuICovCisJaWYgKGRidWZDb3VudCkgeworCQl1aW50MzJfdCB0bXA7CisJCWlmICgoaW50KW9yaWdQdHIgPj0gZGJ1ZkNvdW50KSByZXR1cm4gUkVUVkFMX0RBVEFfRVJST1I7CisJCXRtcCA9IGRidWZbb3JpZ1B0cl07CisJCWJkLT53cml0ZUN1cnJlbnQgPSAodWludDhfdCl0bXA7CisJCWJkLT53cml0ZVBvcyA9ICh0bXAgPj4gOCk7CisJCWJkLT53cml0ZVJ1bkNvdW50ZG93biA9IDU7CisJfQorCWJkLT53cml0ZUNvdW50ID0gZGJ1ZkNvdW50OworCisJcmV0dXJuIFJFVFZBTF9PSzsKK30KKworLyogVW5kbyBCdXJyb3dzLVdoZWVsZXIgdHJhbnNmb3JtIG9uIGludGVybWVkaWF0ZSBidWZmZXIgdG8gcHJvZHVjZSBvdXRwdXQuCisgICBJZiBzdGFydF9idW56aXAgd2FzIGluaXRpYWxpemVkIHdpdGggb3V0X2ZkPS0xLCB0aGVuIHVwIHRvIGxlbiBieXRlcyBvZgorICAgZGF0YSBhcmUgd3JpdHRlbiB0byBvdXRidWYuICBSZXR1cm4gdmFsdWUgaXMgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gb3IKKyAgIGVycm9yIChhbGwgZXJyb3JzIGFyZSBuZWdhdGl2ZSBudW1iZXJzKS4gIElmIG91dF9mZCE9LTEsIG91dGJ1ZiBhbmQgbGVuCisgICBhcmUgaWdub3JlZCwgZGF0YSBpcyB3cml0dGVuIHRvIG91dF9mZCBhbmQgcmV0dXJuIGlzIFJFVFZBTF9PSyBvciBlcnJvci4KKworICAgTkI6IHJlYWRfYnVuemlwIHJldHVybnMgPCAwIG9uIGVycm9yLCBvciB0aGUgbnVtYmVyIG9mICp1bmZpbGxlZCogYnl0ZXMKKyAgIGluIG91dGJ1Zi4gSU9XOiBvbiBFT0YgcmV0dXJucyBsZW4gKCJhbGwgYnl0ZXMgYXJlIG5vdCBmaWxsZWQiKSwgbm90IDAuCisgICAoV2h5PyBUaGlzIGFsbG93cyB0byBnZXQgcmlkIG9mIG9uZSBsb2NhbCB2YXJpYWJsZSkKKyovCitpbnQgRkFTVF9GVU5DIHJlYWRfYnVuemlwKGJ1bnppcF9kYXRhICpiZCwgY2hhciAqb3V0YnVmLCBpbnQgbGVuKQoreworCWNvbnN0IHVpbnQzMl90ICpkYnVmOworCWludCBwb3MsIGN1cnJlbnQsIHByZXZpb3VzOworCXVpbnQzMl90IENSQzsKKworCS8qIElmIHdlIGFscmVhZHkgaGF2ZSBlcnJvci9lbmQgaW5kaWNhdG9yLCByZXR1cm4gaXQgKi8KKwlpZiAoYmQtPndyaXRlQ291bnQgPCAwKQorCQlyZXR1cm4gYmQtPndyaXRlQ291bnQ7CisKKwlkYnVmID0gYmQtPmRidWY7CisKKwkvKiBSZWdpc3Rlci1jYWNoZWQgc3RhdGUgKGhvcGVmdWxseSk6ICovCisJcG9zID0gYmQtPndyaXRlUG9zOworCWN1cnJlbnQgPSBiZC0+d3JpdGVDdXJyZW50OworCUNSQyA9IGJkLT53cml0ZUNSQzsgLyogc21hbGwgbG9zcyBvbiB4ODYtMzIgKG5vdCBlbm91Z2ggcmVncyksIHdpbiBvbiB4ODYtNjQgKi8KKworCS8qIFdlIHdpbGwgYWx3YXlzIGhhdmUgcGVuZGluZyBkZWNvZGVkIGRhdGEgdG8gd3JpdGUgaW50byB0aGUgb3V0cHV0CisJICAgYnVmZmVyIHVubGVzcyB0aGlzIGlzIHRoZSB2ZXJ5IGZpcnN0IGNhbGwgKGluIHdoaWNoIGNhc2Ugd2UgaGF2ZW4ndAorCSAgIEh1ZmZtYW4tZGVjb2RlZCBhIGJsb2NrIGludG8gdGhlIGludGVybWVkaWF0ZSBidWZmZXIgeWV0KS4gKi8KKwlpZiAoYmQtPndyaXRlQ29waWVzKSB7CisKKyBkZWNfd3JpdGVDb3BpZXM6CisJCS8qIEluc2lkZSB0aGUgbG9vcCwgd3JpdGVDb3BpZXMgbWVhbnMgZXh0cmEgY29waWVzIChiZXlvbmQgMSkgKi8KKwkJLS1iZC0+d3JpdGVDb3BpZXM7CisKKwkJLyogTG9vcCBvdXRwdXR0aW5nIGJ5dGVzICovCisJCWZvciAoOzspIHsKKworCQkJLyogSWYgdGhlIG91dHB1dCBidWZmZXIgaXMgZnVsbCwgc2F2ZSBjYWNoZWQgc3RhdGUgYW5kIHJldHVybiAqLworCQkJaWYgKC0tbGVuIDwgMCkgeworCQkJCS8qIFVubGlrZWx5IGJyYW5jaC4KKwkJCQkgKiBVc2Ugb2YgImdvdG8iIGluc3RlYWQgb2Yga2VlcGluZyBjb2RlIGhlcmUKKwkJCQkgKiBoZWxwcyBjb21waWxlciB0byByZWFsaXplIHRoaXMuICovCisJCQkJZ290byBvdXRidWZfZnVsbDsKKwkJCX0KKworCQkJLyogV3JpdGUgbmV4dCBieXRlIGludG8gb3V0cHV0IGJ1ZmZlciwgdXBkYXRpbmcgQ1JDICovCisJCQkqb3V0YnVmKysgPSBjdXJyZW50OworCQkJQ1JDID0gKENSQyA8PCA4KSBeIGJkLT5jcmMzMlRhYmxlWyhDUkMgPj4gMjQpIF4gY3VycmVudF07CisKKwkJCS8qIExvb3Agbm93IGlmIHdlJ3JlIG91dHB1dHRpbmcgbXVsdGlwbGUgY29waWVzIG9mIHRoaXMgYnl0ZSAqLworCQkJaWYgKGJkLT53cml0ZUNvcGllcykgeworCQkJCS8qIFVubGlrZWx5IGJyYW5jaCAqLworCQkJCS8qLS1iZC0+d3JpdGVDb3BpZXM7Ki8KKwkJCQkvKmNvbnRpbnVlOyovCisJCQkJLyogU2FtZSwgYnV0IChhYil1c2luZyBvdGhlciBleGlzdGluZyAtLXdyaXRlQ29waWVzIG9wZXJhdGlvbgorCQkJCSAqIChhbmQgdGhpcyBpZigpIGNvbXBpbGVzIGludG8ganVzdCB0ZXN0K2JyYW5jaCBwYWlyKTogKi8KKwkJCQlnb3RvIGRlY193cml0ZUNvcGllczsKKwkJCX0KKyBkZWNvZGVfbmV4dF9ieXRlOgorCQkJaWYgKC0tYmQtPndyaXRlQ291bnQgPCAwKQorCQkJCWJyZWFrOyAvKiBpbnB1dCBibG9jayBpcyBmdWxseSBjb25zdW1lZCwgbmVlZCBuZXh0IG9uZSAqLworCisJCQkvKiBGb2xsb3cgc2VxdWVuY2UgdmVjdG9yIHRvIHVuZG8gQnVycm93cy1XaGVlbGVyIHRyYW5zZm9ybSAqLworCQkJcHJldmlvdXMgPSBjdXJyZW50OworCQkJcG9zID0gZGJ1Zltwb3NdOworCQkJY3VycmVudCA9ICh1aW50OF90KXBvczsKKwkJCXBvcyA+Pj0gODsKKworCQkJLyogQWZ0ZXIgMyBjb25zZWN1dGl2ZSBjb3BpZXMgb2YgdGhlIHNhbWUgYnl0ZSwgdGhlIDR0aAorCQkJICogaXMgYSByZXBlYXQgY291bnQuICBXZSBjb3VudCBkb3duIGZyb20gNCBpbnN0ZWFkCisJCQkgKiBvZiBjb3VudGluZyB1cCBiZWNhdXNlIHRlc3RpbmcgZm9yIG5vbi16ZXJvIGlzIGZhc3RlciAqLworCQkJaWYgKC0tYmQtPndyaXRlUnVuQ291bnRkb3duICE9IDApIHsKKwkJCQlpZiAoY3VycmVudCAhPSBwcmV2aW91cykKKwkJCQkJYmQtPndyaXRlUnVuQ291bnRkb3duID0gNDsKKwkJCX0gZWxzZSB7CisJCQkJLyogVW5saWtlbHkgYnJhbmNoICovCisJCQkJLyogV2UgaGF2ZSBhIHJlcGVhdGVkIHJ1biwgdGhpcyBieXRlIGluZGljYXRlcyB0aGUgY291bnQgKi8KKwkJCQliZC0+d3JpdGVDb3BpZXMgPSBjdXJyZW50OworCQkJCWN1cnJlbnQgPSBwcmV2aW91czsKKwkJCQliZC0+d3JpdGVSdW5Db3VudGRvd24gPSA1OworCisJCQkJLyogU29tZXRpbWVzIHRoZXJlIGFyZSBqdXN0IDMgYnl0ZXMgKHJ1biBsZW5ndGggMCkgKi8KKwkJCQlpZiAoIWJkLT53cml0ZUNvcGllcykgZ290byBkZWNvZGVfbmV4dF9ieXRlOworCisJCQkJLyogU3VidHJhY3QgdGhlIDEgY29weSB3ZSdkIG91dHB1dCBhbnl3YXkgdG8gZ2V0IGV4dHJhcyAqLworCQkJCS0tYmQtPndyaXRlQ29waWVzOworCQkJfQorCQl9IC8qIGZvcig7OykgKi8KKworCQkvKiBEZWNvbXByZXNzaW9uIG9mIHRoaXMgaW5wdXQgYmxvY2sgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqLworCQliZC0+d3JpdGVDUkMgPSBDUkMgPSB+Q1JDOworCQliZC0+dG90YWxDUkMgPSAoKGJkLT50b3RhbENSQyA8PCAxKSB8IChiZC0+dG90YWxDUkMgPj4gMzEpKSBeIENSQzsKKworCQkvKiBJZiB0aGlzIGJsb2NrIGhhZCBhIENSQyBlcnJvciwgZm9yY2UgZmlsZSBsZXZlbCBDUkMgZXJyb3IgKi8KKwkJaWYgKENSQyAhPSBiZC0+aGVhZGVyQ1JDKSB7CisJCQliZC0+dG90YWxDUkMgPSBiZC0+aGVhZGVyQ1JDICsgMTsKKwkJCXJldHVybiBSRVRWQUxfTEFTVF9CTE9DSzsKKwkJfQorCX0KKworCS8qIFJlZmlsbCB0aGUgaW50ZXJtZWRpYXRlIGJ1ZmZlciBieSBIdWZmbWFuLWRlY29kaW5nIG5leHQgYmxvY2sgb2YgaW5wdXQgKi8KKwl7CisJCWludCByID0gZ2V0X25leHRfYmxvY2soYmQpOworCQlpZiAocikgeyAvKiBlcnJvci9lbmQgKi8KKwkJCWJkLT53cml0ZUNvdW50ID0gcjsKKwkJCXJldHVybiAociAhPSBSRVRWQUxfTEFTVF9CTE9DSykgPyByIDogbGVuOworCQl9CisJfQorCisJQ1JDID0gfjA7CisJcG9zID0gYmQtPndyaXRlUG9zOworCWN1cnJlbnQgPSBiZC0+d3JpdGVDdXJyZW50OworCWdvdG8gZGVjb2RlX25leHRfYnl0ZTsKKworIG91dGJ1Zl9mdWxsOgorCS8qIE91dHB1dCBidWZmZXIgaXMgZnVsbCwgc2F2ZSBjYWNoZWQgc3RhdGUgYW5kIHJldHVybiAqLworCWJkLT53cml0ZVBvcyA9IHBvczsKKwliZC0+d3JpdGVDdXJyZW50ID0gY3VycmVudDsKKwliZC0+d3JpdGVDUkMgPSBDUkM7CisKKwliZC0+d3JpdGVDb3BpZXMrKzsKKworCXJldHVybiAwOworfQorCisvKiBBbGxvY2F0ZSB0aGUgc3RydWN0dXJlLCByZWFkIGZpbGUgaGVhZGVyLiAgSWYgaW5fZmQ9PS0xLCBpbmJ1ZiBtdXN0IGNvbnRhaW4KKyAgIGEgY29tcGxldGUgYnVuemlwIGZpbGUgKGxlbiBieXRlcyBsb25nKS4gIElmIGluX2ZkIT0tMSwgaW5idWYgYW5kIGxlbiBhcmUKKyAgIGlnbm9yZWQsIGFuZCBkYXRhIGlzIHJlYWQgZnJvbSBmaWxlIGhhbmRsZSBpbnRvIHRlbXBvcmFyeSBidWZmZXIuICovCisKKy8qIEJlY2F1c2UgYnVuemlwMiBpcyB1c2VkIGZvciBoZWxwIHRleHQgdW5wYWNraW5nLCBhbmQgYmVjYXVzZSBiYl9zaG93X3VzYWdlKCkKKyAgIHNob3VsZCB3b3JrIGZvciBOT0ZPUksgYXBwbGV0cyB0b28sIHdlIG11c3QgYmUgZXh0cmVtZWx5IGNhcmVmdWwgdG8gbm90IGxlYWsKKyAgIGFueSBhbGxvY2F0aW9ucyEgKi8KK2ludCBGQVNUX0ZVTkMgc3RhcnRfYnVuemlwKGJ1bnppcF9kYXRhICoqYmRwLCBpbnQgaW5fZmQsCisJCWNvbnN0IHZvaWQgKmluYnVmLCBpbnQgbGVuKQoreworCWJ1bnppcF9kYXRhICpiZDsKKwl1bnNpZ25lZCBpOworCWVudW0geworCQlCWmgwID0gKCdCJyA8PCAyNCkgKyAoJ1onIDw8IDE2KSArICgnaCcgPDwgOCkgKyAnMCcsCisJCWgwID0gKCdoJyA8PCA4KSArICcwJywKKwl9OworCisJLyogRmlndXJlIG91dCBob3cgbXVjaCBkYXRhIHRvIGFsbG9jYXRlICovCisJaSA9IHNpemVvZihidW56aXBfZGF0YSk7CisJaWYgKGluX2ZkICE9IC0xKSBpICs9IElPQlVGX1NJWkU7CisKKwkvKiBBbGxvY2F0ZSBidW56aXBfZGF0YS4gIE1vc3QgZmllbGRzIGluaXRpYWxpemUgdG8gemVyby4gKi8KKwliZCA9ICpiZHAgPSB4emFsbG9jKGkpOworCisJLyogU2V0dXAgaW5wdXQgYnVmZmVyICovCisJYmQtPmluX2ZkID0gaW5fZmQ7CisJaWYgKC0xID09IGluX2ZkKSB7CisJCS8qIGluIHRoaXMgY2FzZSwgYmQtPmluYnVmIGlzIHJlYWQtb25seSAqLworCQliZC0+aW5idWYgPSAodm9pZCopaW5idWY7IC8qIGNhc3QgYXdheSBjb25zdC1uZXNzICovCisJfSBlbHNlIHsKKwkJYmQtPmluYnVmID0gKHVpbnQ4X3QqKShiZCArIDEpOworCQltZW1jcHkoYmQtPmluYnVmLCBpbmJ1ZiwgbGVuKTsKKwl9CisJYmQtPmluYnVmQ291bnQgPSBsZW47CisKKwkvKiBJbml0IHRoZSBDUkMzMiB0YWJsZSAoYmlnIGVuZGlhbikgKi8KKwljcmMzMl9maWxsdGFibGUoYmQtPmNyYzMyVGFibGUsIDEpOworCisJLyogU2V0dXAgZm9yIEkvTyBlcnJvciBoYW5kbGluZyB2aWEgbG9uZ2ptcCAqLworCWkgPSBzZXRqbXAoYmQtPmptcGJ1Zik7CisJaWYgKGkpIHJldHVybiBpOworCisJLyogRW5zdXJlIHRoYXQgZmlsZSBzdGFydHMgd2l0aCAiQlpoWycxJy0nOSddLiIgKi8KKwkvKiBVcGRhdGU6IG5vdyBjYWxsZXIgdmVyaWZpZXMgMXN0IHR3byBieXRlcywgbWFrZXMgLmd6Ly5iejIKKwkgKiBpbnRlZ3JhdGlvbiBlYXNpZXIgKi8KKwkvKiB3YXM6ICovCisJLyogaSA9IGdldF9iaXRzKGJkLCAzMik7ICovCisJLyogaWYgKCh1bnNpZ25lZCkoaSAtIEJaaDAgLSAxKSA+PSA5KSByZXR1cm4gUkVUVkFMX05PVF9CWklQX0RBVEE7ICovCisJaSA9IGdldF9iaXRzKGJkLCAxNik7CisJaWYgKCh1bnNpZ25lZCkoaSAtIGgwIC0gMSkgPj0gOSkgcmV0dXJuIFJFVFZBTF9OT1RfQlpJUF9EQVRBOworCisJLyogRm91cnRoIGJ5dGUgKGFzY2lpICcxJy0nOScpIGluZGljYXRlcyBibG9jayBzaXplIGluIHVuaXRzIG9mIDEwMGsgb2YKKwkgICB1bmNvbXByZXNzZWQgZGF0YS4gIEFsbG9jYXRlIGludGVybWVkaWF0ZSBidWZmZXIgZm9yIGJsb2NrLiAqLworCS8qIGJkLT5kYnVmU2l6ZSA9IDEwMDAwMCAqIChpIC0gQlpoMCk7ICovCisJYmQtPmRidWZTaXplID0gMTAwMDAwICogKGkgLSBoMCk7CisKKwkvKiBDYW5ub3QgdXNlIHhtYWxsb2MgLSBtYXkgbGVhayBiZCBpbiBOT0ZPUksgY2FzZSEgKi8KKwliZC0+ZGJ1ZiA9IG1hbGxvY19vcl93YXJuKGJkLT5kYnVmU2l6ZSAqIHNpemVvZihiZC0+ZGJ1ZlswXSkpOworCWlmICghYmQtPmRidWYpIHsKKwkJZnJlZShiZCk7CisJCXhmdW5jX2RpZSgpOworCX0KKwlyZXR1cm4gUkVUVkFMX09LOworfQorCit2b2lkIEZBU1RfRlVOQyBkZWFsbG9jX2J1bnppcChidW56aXBfZGF0YSAqYmQpCit7CisJZnJlZShiZC0+ZGJ1Zik7CisJZnJlZShiZCk7Cit9CisKKworLyogRGVjb21wcmVzcyBzcmNfZmQgdG8gZHN0X2ZkLiAgU3RvcHMgYXQgZW5kIG9mIGJ6aXAgZGF0YSwgbm90IGVuZCBvZiBmaWxlLiAqLworSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMKK3VucGFja19iejJfc3RyZWFtKHRyYW5zZm9ybWVyX3N0YXRlX3QgKnhzdGF0ZSkKK3sKKwlJRl9ERVNLVE9QKGxvbmcgbG9uZyB0b3RhbF93cml0dGVuID0gMDspCisJYnVuemlwX2RhdGEgKmJkOworCWNoYXIgKm91dGJ1ZjsKKwlpbnQgaTsKKwl1bnNpZ25lZCBsZW47CisKKwlpZiAoY2hlY2tfc2lnbmF0dXJlMTYoeHN0YXRlLCBCWklQMl9NQUdJQykpCisJCXJldHVybiAtMTsKKworCW91dGJ1ZiA9IHhtYWxsb2MoSU9CVUZfU0laRSk7CisJbGVuID0gMDsKKwl3aGlsZSAoMSkgeyAvKiAiUHJvY2VzcyBvbmUgQlouLi4gc3RyZWFtIiBsb29wICovCisKKwkJaSA9IHN0YXJ0X2J1bnppcCgmYmQsIHhzdGF0ZS0+c3JjX2ZkLCBvdXRidWYgKyAyLCBsZW4pOworCisJCWlmIChpID09IDApIHsKKwkJCXdoaWxlICgxKSB7IC8qICJQcm9kdWNlIHNvbWUgb3V0cHV0IGJ5dGVzIiBsb29wICovCisJCQkJaSA9IHJlYWRfYnVuemlwKGJkLCBvdXRidWYsIElPQlVGX1NJWkUpOworCQkJCWlmIChpIDwgMCkgLyogZXJyb3I/ICovCisJCQkJCWJyZWFrOworCQkJCWkgPSBJT0JVRl9TSVpFIC0gaTsgLyogbnVtYmVyIG9mIGJ5dGVzIHByb2R1Y2VkICovCisJCQkJaWYgKGkgPT0gMCkgLyogRU9GPyAqLworCQkJCQlicmVhazsKKwkJCQlpZiAoaSAhPSB0cmFuc2Zvcm1lcl93cml0ZSh4c3RhdGUsIG91dGJ1ZiwgaSkpIHsKKwkJCQkJaSA9IFJFVFZBTF9TSE9SVF9XUklURTsKKwkJCQkJZ290byByZWxlYXNlX21lbTsKKwkJCQl9CisJCQkJSUZfREVTS1RPUCh0b3RhbF93cml0dGVuICs9IGk7KQorCQkJfQorCQl9CisKKwkJaWYgKGkgIT0gUkVUVkFMX0xBU1RfQkxPQ0sKKwkJLyogT2JzZXJ2ZWQgY2FzZSB3aGVuIGkgPT0gUkVUVkFMX09LOgorCQkgKiAiYnpjYXQgei5iejIiLCB3aGVyZSAiei5iejIiIGlzIGEgYnppcHBlZCB6ZXJvLWxlbmd0aCBmaWxlCisJCSAqICh0byBiZSBleGFjdCwgei5iejIgaXMgZXhhY3RseSB0aGVzZSAxNCBieXRlczoKKwkJICogNDIgNWEgNjggMzkgMTcgNzIgNDUgMzggIDUwIDkwIDAwIDAwIDAwIDAwKS4KKwkJICovCisJCSAmJiBpICE9IFJFVFZBTF9PSworCQkpIHsKKwkJCWJiX2Vycm9yX21zZygiYnVuemlwIGVycm9yICVkIiwgaSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoYmQtPmhlYWRlckNSQyAhPSBiZC0+dG90YWxDUkMpIHsKKwkJCWJiX2Vycm9yX21zZygiQ1JDIGVycm9yIik7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFN1Y2Nlc3NmdWxseSB1bnBhY2tlZCBvbmUgQlogc3RyZWFtICovCisJCWkgPSBSRVRWQUxfT0s7CisKKwkJLyogRG8gd2UgaGF2ZSAiQlouLi4iIGFmdGVyIGxhc3QgcHJvY2Vzc2VkIGJ5dGU/CisJCSAqIHBiemlwMiAocGFyYWxsZWxpemVkIGJ6aXAyKSBwcm9kdWNlcyBzdWNoIGZpbGVzLgorCQkgKi8KKwkJbGVuID0gYmQtPmluYnVmQ291bnQgLSBiZC0+aW5idWZQb3M7CisJCW1lbWNweShvdXRidWYsICZiZC0+aW5idWZbYmQtPmluYnVmUG9zXSwgbGVuKTsKKwkJaWYgKGxlbiA8IDIpIHsKKwkJCWlmIChzYWZlX3JlYWQoeHN0YXRlLT5zcmNfZmQsIG91dGJ1ZiArIGxlbiwgMiAtIGxlbikgIT0gMiAtIGxlbikKKwkJCQlicmVhazsKKwkJCWxlbiA9IDI7CisJCX0KKwkJaWYgKCoodWludDE2X3QqKW91dGJ1ZiAhPSBCWklQMl9NQUdJQykgLyogIkJaIj8gKi8KKwkJCWJyZWFrOworCQlkZWFsbG9jX2J1bnppcChiZCk7CisJCWxlbiAtPSAyOworCX0KKworIHJlbGVhc2VfbWVtOgorCWRlYWxsb2NfYnVuemlwKGJkKTsKKwlmcmVlKG91dGJ1Zik7CisKKwlyZXR1cm4gaSA/IGkgOiBJRl9ERVNLVE9QKHRvdGFsX3dyaXR0ZW4pICsgMDsKK30KKworI2lmZGVmIFRFU1RJTkcKKworc3RhdGljIGNoYXIgKmNvbnN0IGJ1bnppcF9lcnJvcnNbXSA9IHsKKwlOVUxMLCAiQmFkIGZpbGUgY2hlY2tzdW0iLCAiTm90IGJ6aXAgZGF0YSIsCisJIlVuZXhwZWN0ZWQgaW5wdXQgRU9GIiwgIlVuZXhwZWN0ZWQgb3V0cHV0IEVPRiIsICJEYXRhIGVycm9yIiwKKwkiT3V0IG9mIG1lbW9yeSIsICJPYnNvbGV0ZSAocHJlIDAuOS41KSBiemlwIGZvcm1hdCBub3Qgc3VwcG9ydGVkIgorfTsKKworLyogRHVtYiBsaXR0bGUgdGVzdCB0aGluZywgZGVjb21wcmVzcyBzdGRpbiB0byBzdGRvdXQgKi8KK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyIGM7CisKKwlpbnQgaSA9IHVucGFja19iejJfc3RyZWFtKDAsIDEpOworCWlmIChpIDwgMCkKKwkJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgYnVuemlwX2Vycm9yc1staV0pOworCWVsc2UgaWYgKHJlYWQoU1RESU5fRklMRU5PLCAmYywgMSkpCisJCWZwcmludGYoc3RkZXJyLCAiVHJhaWxpbmcgZ2FyYmFnZSBpZ25vcmVkXG4iKTsKKwlyZXR1cm4gLWk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGVjb21wcmVzc19ndW56aXAuYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGVjb21wcmVzc19ndW56aXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzYwYWJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9kZWNvbXByZXNzX2d1bnppcC5jCkBAIC0wLDAgKzEsMTI2OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZ3VuemlwIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQmFzZWQgb24gR05VIGd6aXAgdjEuMi40IENvcHlyaWdodCAoQykgMTk5Mi0xOTkzIEplYW4tbG91cCBHYWlsbHkuCisgKgorICogT3JpZ2luYWxseSBhZGp1c3RlZCBmb3IgYnVzeWJveCBieSBTdmVuIFJ1ZG9scGggPHNyMUBpbmYudHUtZHJlc2Rlbi5kZT4KKyAqIGJhc2VkIG9uIGd6aXAgc291cmNlcworICoKKyAqIEFkanVzdGVkIGZ1cnRoZXIgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPiB0byBzdXBwb3J0CisgKiBmaWxlcyBhcyB3ZWxsIGFzIHN0ZGluL3N0ZG91dCwgYW5kIHRvIGdlbmVyYWxseSBiZWhhdmUgaXRzZWxmIHdydAorICogY29tbWFuZCBsaW5lIGhhbmRsaW5nLgorICoKKyAqIEdlbmVyYWwgY2xlYW51cCB0byBiZXR0ZXIgYWRoZXJlIHRvIHRoZSBzdHlsZSBndWlkZSBhbmQgbWFrZSB1c2Ugb2Ygc3RhbmRhcmQKKyAqIGJ1c3lib3ggZnVuY3Rpb25zIGJ5IEdsZW5uIE1jR3JhdGgKKyAqCisgKiByZWFkX2d6IGludGVyZmFjZSArIGFzc29jaWF0ZWQgaGFja2luZyBieSBMYXVyZW5jZSBBbmRlcnNvbgorICoKKyAqIEZpeGVkIGh1ZnRfYnVpbGQoKSBzbyBkZWNvZGluZyBlbmQtb2YtYmxvY2sgY29kZSBkb2VzIG5vdCBncmFiIG1vcmUgYml0cworICogdGhhbiBuZWNlc3NhcnkgKHRoaXMgaXMgcmVxdWlyZWQgYnkgdW56aXAgYXBwbGV0KSwgYWRkZWQgaW5mbGF0ZV9jbGVhbnVwKCkKKyAqIHRvIGZyZWUgbGVha2VkIGJ5dGVidWZmZXIgbWVtb3J5ICh1c2VkIGluIHVuemlwLmMpLCBhbmQgc29tZSBtaW5vciBzdHlsZQorICogZ3VpZGUgY2xlYW51cHMgYnkgRWQgQ2xhcmsKKyAqCisgKiBnemlwIChHTlUgemlwKSAtLSBjb21wcmVzcyBmaWxlcyB3aXRoIHppcCBhbGdvcml0aG0gYW5kICdjb21wcmVzcycgaW50ZXJmYWNlCisgKiBDb3B5cmlnaHQgKEMpIDE5OTItMTk5MyBKZWFuLWxvdXAgR2FpbGx5CisgKiBUaGUgdW56aXAgY29kZSB3YXMgd3JpdHRlbiBhbmQgcHV0IGluIHRoZSBwdWJsaWMgZG9tYWluIGJ5IE1hcmsgQWRsZXIuCisgKiBQb3J0aW9ucyBvZiB0aGUgbHp3IGNvZGUgYXJlIGRlcml2ZWQgZnJvbSB0aGUgcHVibGljIGRvbWFpbiAnY29tcHJlc3MnCisgKiB3cml0dGVuIGJ5IFNwZW5jZXIgVGhvbWFzLCBKb2UgT3Jvc3QsIEphbWVzIFdvb2RzLCBKaW0gTWNLaWUsIFN0ZXZlIERhdmllcywKKyAqIEtlbiBUdXJrb3dza2ksIERhdmUgTWFjayBhbmQgUGV0ZXIgSmFubmVzZW4uCisgKgorICogU2VlIHRoZSBmaWxlIGFsZ29yaXRobS5kb2MgZm9yIHRoZSBjb21wcmVzc2lvbiBhbGdvcml0aG1zIGFuZCBmaWxlIGZvcm1hdHMuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJiYl9hcmNoaXZlLmgiCisKK3R5cGVkZWYgc3RydWN0IGh1ZnRfdCB7CisJdW5zaWduZWQgY2hhciBlOwkvKiBudW1iZXIgb2YgZXh0cmEgYml0cyBvciBvcGVyYXRpb24gKi8KKwl1bnNpZ25lZCBjaGFyIGI7CS8qIG51bWJlciBvZiBiaXRzIGluIHRoaXMgY29kZSBvciBzdWJjb2RlICovCisJdW5pb24geworCQl1bnNpZ25lZCBzaG9ydCBuOwkvKiBsaXRlcmFsLCBsZW5ndGggYmFzZSwgb3IgZGlzdGFuY2UgYmFzZSAqLworCQlzdHJ1Y3QgaHVmdF90ICp0OwkvKiBwb2ludGVyIHRvIG5leHQgbGV2ZWwgb2YgdGFibGUgKi8KKwl9IHY7Cit9IGh1ZnRfdDsKKworZW51bSB7CisJLyogZ3VuemlwX3dpbmRvdyBzaXplLS1tdXN0IGJlIGEgcG93ZXIgb2YgdHdvLCBhbmQKKwkgKiBhdCBsZWFzdCAzMksgZm9yIHppcCdzIGRlZmxhdGUgbWV0aG9kICovCisJR1VOWklQX1dTSVpFID0gMHg4MDAwLAorCS8qIElmIEJNQVggbmVlZHMgdG8gYmUgbGFyZ2VyIHRoYW4gMTYsIHRoZW4gaCBhbmQgeFtdIHNob3VsZCBiZSB1bGcuICovCisJQk1BWCA9IDE2LAkvKiBtYXhpbXVtIGJpdCBsZW5ndGggb2YgYW55IGNvZGUgKDE2IGZvciBleHBsb2RlKSAqLworCU5fTUFYID0gMjg4LAkvKiBtYXhpbXVtIG51bWJlciBvZiBjb2RlcyBpbiBhbnkgc2V0ICovCit9OworCisKKy8qIFRoaXMgaXMgc29tZXdoYXQgY29tcGxleC1sb29raW5nIGFycmFuZ2VtZW50LCBidXQgaXQgYWxsb3dzCisgKiB0byBwbGFjZSBkZWNvbXByZXNzb3Igc3RhdGUgZWl0aGVyIGluIGJzcyBvciBpbgorICogbWFsbG9jJ2VkIHNwYWNlIHNpbXBseSBieSBjaGFuZ2luZyAjZGVmaW5lcyBiZWxvdy4KKyAqIFNpemVzIG9uIGkzODY6CisgKiB0ZXh0ICAgIGRhdGEgICAgIGJzcyAgICAgZGVjICAgICBoZXgKKyAqIDUyNTYgICAgICAgMCAgICAgMTA4ICAgIDUzNjQgICAgMTRmNCAtIGJzcworICogNDkxNSAgICAgICAwICAgICAgIDAgICAgNDkxNSAgICAxMzMzIC0gbWFsbG9jCisgKi8KKyNkZWZpbmUgU1RBVEVfSU5fQlNTIDAKKyNkZWZpbmUgU1RBVEVfSU5fTUFMTE9DIDEKKworCit0eXBlZGVmIHN0cnVjdCBzdGF0ZV90IHsKKwlvZmZfdCBndW56aXBfYnl0ZXNfb3V0OyAvKiBudW1iZXIgb2Ygb3V0cHV0IGJ5dGVzICovCisJdWludDMyX3QgZ3VuemlwX2NyYzsKKworCWludCBndW56aXBfc3JjX2ZkOworCXVuc2lnbmVkIGd1bnppcF9vdXRidWZfY291bnQ7IC8qIGJ5dGVzIGluIG91dHB1dCBidWZmZXIgKi8KKworCXVuc2lnbmVkIGNoYXIgKmd1bnppcF93aW5kb3c7CisKKwl1aW50MzJfdCAqZ3VuemlwX2NyY190YWJsZTsKKworCS8qIGJpdGJ1ZmZlciAqLworCXVuc2lnbmVkIGd1bnppcF9iYjsgLyogYml0IGJ1ZmZlciAqLworCXVuc2lnbmVkIGNoYXIgZ3VuemlwX2JrOyAvKiBiaXRzIGluIGJpdCBidWZmZXIgKi8KKworCS8qIGlucHV0IChjb21wcmVzc2VkKSBkYXRhICovCisJdW5zaWduZWQgY2hhciAqYnl0ZWJ1ZmZlcjsgICAgICAvKiBidWZmZXIgaXRzZWxmICovCisJb2ZmX3QgdG9fcmVhZDsJCQkvKiBjb21wcmVzc2VkIGJ5dGVzIHRvIHJlYWQgKHVuemlwIG9ubHksIC0xIGZvciBndW56aXApICovCisvLwl1bnNpZ25lZCBieXRlYnVmZmVyX21heDsgICAgICAgIC8qIGJ1ZmZlciBzaXplICovCisJdW5zaWduZWQgYnl0ZWJ1ZmZlcl9vZmZzZXQ7ICAgICAvKiBidWZmZXIgcG9zaXRpb24gKi8KKwl1bnNpZ25lZCBieXRlYnVmZmVyX3NpemU7ICAgICAgIC8qIGhvdyBtdWNoIGRhdGEgaXMgdGhlcmUgKHNpemUgPD0gbWF4KSAqLworCisJLyogcHJpdmF0ZSBkYXRhIG9mIGluZmxhdGVfY29kZXMoKSAqLworCXVuc2lnbmVkIGluZmxhdGVfY29kZXNfbWw7IC8qIG1hc2tzIGZvciBibCBhbmQgYmQgYml0cyAqLworCXVuc2lnbmVkIGluZmxhdGVfY29kZXNfbWQ7IC8qIG1hc2tzIGZvciBibCBhbmQgYmQgYml0cyAqLworCXVuc2lnbmVkIGluZmxhdGVfY29kZXNfYmI7IC8qIGJpdCBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbmZsYXRlX2NvZGVzX2s7IC8qIG51bWJlciBvZiBiaXRzIGluIGJpdCBidWZmZXIgKi8KKwl1bnNpZ25lZCBpbmZsYXRlX2NvZGVzX3c7IC8qIGN1cnJlbnQgZ3VuemlwX3dpbmRvdyBwb3NpdGlvbiAqLworCWh1ZnRfdCAqaW5mbGF0ZV9jb2Rlc190bDsKKwlodWZ0X3QgKmluZmxhdGVfY29kZXNfdGQ7CisJdW5zaWduZWQgaW5mbGF0ZV9jb2Rlc19ibDsKKwl1bnNpZ25lZCBpbmZsYXRlX2NvZGVzX2JkOworCXVuc2lnbmVkIGluZmxhdGVfY29kZXNfbm47IC8qIGxlbmd0aCBhbmQgaW5kZXggZm9yIGNvcHkgKi8KKwl1bnNpZ25lZCBpbmZsYXRlX2NvZGVzX2RkOworCisJc21hbGxpbnQgcmVzdW1lX2NvcHk7CisKKwkvKiBwcml2YXRlIGRhdGEgb2YgaW5mbGF0ZV9nZXRfbmV4dF93aW5kb3coKSAqLworCXNtYWxsaW50IG1ldGhvZDsgLyogbWV0aG9kID09IC0xIGZvciBzdG9yZWQsIC0yIGZvciBjb2RlcyAqLworCXNtYWxsaW50IG5lZWRfYW5vdGhlcl9ibG9jazsKKwlzbWFsbGludCBlbmRfcmVhY2hlZDsKKworCS8qIHByaXZhdGUgZGF0YSBvZiBpbmZsYXRlX3N0b3JlZCgpICovCisJdW5zaWduZWQgaW5mbGF0ZV9zdG9yZWRfbjsKKwl1bnNpZ25lZCBpbmZsYXRlX3N0b3JlZF9iOworCXVuc2lnbmVkIGluZmxhdGVfc3RvcmVkX2s7CisJdW5zaWduZWQgaW5mbGF0ZV9zdG9yZWRfdzsKKworCWNvbnN0IGNoYXIgKmVycm9yX21zZzsKKwlqbXBfYnVmIGVycm9yX2ptcDsKK30gc3RhdGVfdDsKKyNkZWZpbmUgZ3VuemlwX2J5dGVzX291dCAgICAoUygpZ3VuemlwX2J5dGVzX291dCAgICkKKyNkZWZpbmUgZ3VuemlwX2NyYyAgICAgICAgICAoUygpZ3VuemlwX2NyYyAgICAgICAgICkKKyNkZWZpbmUgZ3VuemlwX3NyY19mZCAgICAgICAoUygpZ3VuemlwX3NyY19mZCAgICAgICkKKyNkZWZpbmUgZ3VuemlwX291dGJ1Zl9jb3VudCAoUygpZ3VuemlwX291dGJ1Zl9jb3VudCkKKyNkZWZpbmUgZ3VuemlwX3dpbmRvdyAgICAgICAoUygpZ3VuemlwX3dpbmRvdyAgICAgICkKKyNkZWZpbmUgZ3VuemlwX2NyY190YWJsZSAgICAoUygpZ3VuemlwX2NyY190YWJsZSAgICkKKyNkZWZpbmUgZ3VuemlwX2JiICAgICAgICAgICAoUygpZ3VuemlwX2JiICAgICAgICAgICkKKyNkZWZpbmUgZ3VuemlwX2JrICAgICAgICAgICAoUygpZ3VuemlwX2JrICAgICAgICAgICkKKyNkZWZpbmUgdG9fcmVhZCAgICAgICAgICAgICAoUygpdG9fcmVhZCAgICAgICAgICAgICkKKy8vICNkZWZpbmUgYnl0ZWJ1ZmZlcl9tYXggICAoUygpYnl0ZWJ1ZmZlcl9tYXggICAgICkKKy8vIEJvdGggZ3VuemlwIGFuZCB1bnppcCBjYW4gdXNlIGNvbnN0YW50IGJ1ZmZlciBzaXplIG5vdyAoMTZrKToKKyNkZWZpbmUgYnl0ZWJ1ZmZlcl9tYXggICAgICAweDQwMDAKKyNkZWZpbmUgYnl0ZWJ1ZmZlciAgICAgICAgICAoUygpYnl0ZWJ1ZmZlciAgICAgICAgICkKKyNkZWZpbmUgYnl0ZWJ1ZmZlcl9vZmZzZXQgICAoUygpYnl0ZWJ1ZmZlcl9vZmZzZXQgICkKKyNkZWZpbmUgYnl0ZWJ1ZmZlcl9zaXplICAgICAoUygpYnl0ZWJ1ZmZlcl9zaXplICAgICkKKyNkZWZpbmUgaW5mbGF0ZV9jb2Rlc19tbCAgICAoUygpaW5mbGF0ZV9jb2Rlc19tbCAgICkKKyNkZWZpbmUgaW5mbGF0ZV9jb2Rlc19tZCAgICAoUygpaW5mbGF0ZV9jb2Rlc19tZCAgICkKKyNkZWZpbmUgaW5mbGF0ZV9jb2Rlc19iYiAgICAoUygpaW5mbGF0ZV9jb2Rlc19iYiAgICkKKyNkZWZpbmUgaW5mbGF0ZV9jb2Rlc19rICAgICAoUygpaW5mbGF0ZV9jb2Rlc19rICAgICkKKyNkZWZpbmUgaW5mbGF0ZV9jb2Rlc193ICAgICAoUygpaW5mbGF0ZV9jb2Rlc193ICAgICkKKyNkZWZpbmUgaW5mbGF0ZV9jb2Rlc190bCAgICAoUygpaW5mbGF0ZV9jb2Rlc190bCAgICkKKyNkZWZpbmUgaW5mbGF0ZV9jb2Rlc190ZCAgICAoUygpaW5mbGF0ZV9jb2Rlc190ZCAgICkKKyNkZWZpbmUgaW5mbGF0ZV9jb2Rlc19ibCAgICAoUygpaW5mbGF0ZV9jb2Rlc19ibCAgICkKKyNkZWZpbmUgaW5mbGF0ZV9jb2Rlc19iZCAgICAoUygpaW5mbGF0ZV9jb2Rlc19iZCAgICkKKyNkZWZpbmUgaW5mbGF0ZV9jb2Rlc19ubiAgICAoUygpaW5mbGF0ZV9jb2Rlc19ubiAgICkKKyNkZWZpbmUgaW5mbGF0ZV9jb2Rlc19kZCAgICAoUygpaW5mbGF0ZV9jb2Rlc19kZCAgICkKKyNkZWZpbmUgcmVzdW1lX2NvcHkgICAgICAgICAoUygpcmVzdW1lX2NvcHkgICAgICAgICkKKyNkZWZpbmUgbWV0aG9kICAgICAgICAgICAgICAoUygpbWV0aG9kICAgICAgICAgICAgICkKKyNkZWZpbmUgbmVlZF9hbm90aGVyX2Jsb2NrICAoUygpbmVlZF9hbm90aGVyX2Jsb2NrICkKKyNkZWZpbmUgZW5kX3JlYWNoZWQgICAgICAgICAoUygpZW5kX3JlYWNoZWQgICAgICAgICkKKyNkZWZpbmUgaW5mbGF0ZV9zdG9yZWRfbiAgICAoUygpaW5mbGF0ZV9zdG9yZWRfbiAgICkKKyNkZWZpbmUgaW5mbGF0ZV9zdG9yZWRfYiAgICAoUygpaW5mbGF0ZV9zdG9yZWRfYiAgICkKKyNkZWZpbmUgaW5mbGF0ZV9zdG9yZWRfayAgICAoUygpaW5mbGF0ZV9zdG9yZWRfayAgICkKKyNkZWZpbmUgaW5mbGF0ZV9zdG9yZWRfdyAgICAoUygpaW5mbGF0ZV9zdG9yZWRfdyAgICkKKyNkZWZpbmUgZXJyb3JfbXNnICAgICAgICAgICAoUygpZXJyb3JfbXNnICAgICAgICAgICkKKyNkZWZpbmUgZXJyb3Jfam1wICAgICAgICAgICAoUygpZXJyb3Jfam1wICAgICAgICAgICkKKworLyogVGhpcyBpcyBhIGdlbmVyaWMgcGFydCAqLworI2lmIFNUQVRFX0lOX0JTUyAvKiBVc2UgZ2xvYmFsIGRhdGEgc2VnbWVudCAqLworI2RlZmluZSBERUNMQVJFX1NUQVRFIC8qbm90aGluZyovCisjZGVmaW5lIEFMTE9DX1NUQVRFIC8qbm90aGluZyovCisjZGVmaW5lIERFQUxMT0NfU1RBVEUgKCh2b2lkKTApCisjZGVmaW5lIFMoKSBzdGF0ZS4KKyNkZWZpbmUgUEFTU19TVEFURSAvKm5vdGhpbmcqLworI2RlZmluZSBQQVNTX1NUQVRFX09OTFkgLypub3RoaW5nKi8KKyNkZWZpbmUgU1RBVEVfUEFSQU0gLypub3RoaW5nKi8KKyNkZWZpbmUgU1RBVEVfUEFSQU1fT05MWSB2b2lkCitzdGF0aWMgc3RhdGVfdCBzdGF0ZTsKKyNlbmRpZgorCisjaWYgU1RBVEVfSU5fTUFMTE9DIC8qIFVzZSBtYWxsb2Mgc3BhY2UgKi8KKyNkZWZpbmUgREVDTEFSRV9TVEFURSBzdGF0ZV90ICpzdGF0ZQorI2RlZmluZSBBTExPQ19TVEFURSAoc3RhdGUgPSB4emFsbG9jKHNpemVvZigqc3RhdGUpKSkKKyNkZWZpbmUgREVBTExPQ19TVEFURSBmcmVlKHN0YXRlKQorI2RlZmluZSBTKCkgc3RhdGUtPgorI2RlZmluZSBQQVNTX1NUQVRFIHN0YXRlLAorI2RlZmluZSBQQVNTX1NUQVRFX09OTFkgc3RhdGUKKyNkZWZpbmUgU1RBVEVfUEFSQU0gc3RhdGVfdCAqc3RhdGUsCisjZGVmaW5lIFNUQVRFX1BBUkFNX09OTFkgc3RhdGVfdCAqc3RhdGUKKyNlbmRpZgorCisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBtYXNrX2JpdHNbXSBBTElHTjIgPSB7CisJMHgwMDAwLCAweDAwMDEsIDB4MDAwMywgMHgwMDA3LCAweDAwMGYsIDB4MDAxZiwgMHgwMDNmLCAweDAwN2YsIDB4MDBmZiwKKwkweDAxZmYsIDB4MDNmZiwgMHgwN2ZmLCAweDBmZmYsIDB4MWZmZiwgMHgzZmZmLCAweDdmZmYsIDB4ZmZmZgorfTsKKworLyogQ29weSBsZW5ndGhzIGZvciBsaXRlcmFsIGNvZGVzIDI1Ny4uMjg1ICovCitzdGF0aWMgY29uc3QgdWludDE2X3QgY3BsZW5zW10gQUxJR04yID0geworCTMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE1LCAxNywgMTksIDIzLCAyNywgMzEsIDM1LCA0MywgNTEsIDU5LAorCTY3LCA4MywgOTksIDExNSwgMTMxLCAxNjMsIDE5NSwgMjI3LCAyNTgsIDAsIDAKK307CisKKy8qIG5vdGU6IHNlZSBub3RlICMxMyBhYm92ZSBhYm91dCB0aGUgMjU4IGluIHRoaXMgbGlzdC4gKi8KKy8qIEV4dHJhIGJpdHMgZm9yIGxpdGVyYWwgY29kZXMgMjU3Li4yODUgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGNwbGV4dFtdIEFMSUdOMSA9IHsKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxLCAxLCAxLCAxLCAyLCAyLCAyLCAyLCAzLCAzLCAzLCAzLCA0LCA0LCA0LCA0LCA1LAorCTUsIDUsIDUsIDAsIDk5LCA5OQorfTsgLyogOTkgPT0gaW52YWxpZCAqLworCisvKiBDb3B5IG9mZnNldHMgZm9yIGRpc3RhbmNlIGNvZGVzIDAuLjI5ICovCitzdGF0aWMgY29uc3QgdWludDE2X3QgY3BkaXN0W10gQUxJR04yID0geworCTEsIDIsIDMsIDQsIDUsIDcsIDksIDEzLCAxNywgMjUsIDMzLCA0OSwgNjUsIDk3LCAxMjksIDE5MywgMjU3LCAzODUsIDUxMywKKwk3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1NzcKK307CisKKy8qIEV4dHJhIGJpdHMgZm9yIGRpc3RhbmNlIGNvZGVzICovCitzdGF0aWMgY29uc3QgdWludDhfdCBjcGRleHRbXSBBTElHTjEgPSB7CisJMCwgMCwgMCwgMCwgMSwgMSwgMiwgMiwgMywgMywgNCwgNCwgNSwgNSwgNiwgNiwgNywgNywgOCwgOCwgOSwgOSwgMTAsIDEwLAorCTExLCAxMSwgMTIsIDEyLCAxMywgMTMKK307CisKKy8qIFRhYmxlcyBmb3IgZGVmbGF0ZSBmcm9tIFBLWklQJ3MgYXBwbm90ZS50eHQuICovCisvKiBPcmRlciBvZiB0aGUgYml0IGxlbmd0aCBjb2RlIGxlbmd0aHMgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGJvcmRlcltdIEFMSUdOMSA9IHsKKwkxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1Cit9OworCisKKy8qCisgKiBGcmVlIHRoZSBtYWxsb2MnZWQgdGFibGVzIGJ1aWx0IGJ5IGh1ZnRfYnVpbGQoKSwgd2hpY2ggbWFrZXMgYSBsaW5rZWQKKyAqIGxpc3Qgb2YgdGhlIHRhYmxlcyBpdCBtYWRlLCB3aXRoIHRoZSBsaW5rcyBpbiBhIGR1bW15IGZpcnN0IGVudHJ5IG9mCisgKiBlYWNoIHRhYmxlLgorICogdDogdGFibGUgdG8gZnJlZQorICovCitzdGF0aWMgdm9pZCBodWZ0X2ZyZWUoaHVmdF90ICpwKQoreworCWh1ZnRfdCAqcTsKKworCS8qIEdvIHRocm91Z2ggbGlua2VkIGxpc3QsIGZyZWVpbmcgZnJvbSB0aGUgbWFsbG9jZWQgKHRbLTFdKSBhZGRyZXNzLiAqLworCXdoaWxlIChwKSB7CisJCXEgPSAoLS1wKS0+di50OworCQlmcmVlKHApOworCQlwID0gcTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGh1ZnRfZnJlZV9hbGwoU1RBVEVfUEFSQU1fT05MWSkKK3sKKwlodWZ0X2ZyZWUoaW5mbGF0ZV9jb2Rlc190bCk7CisJaHVmdF9mcmVlKGluZmxhdGVfY29kZXNfdGQpOworCWluZmxhdGVfY29kZXNfdGwgPSBOVUxMOworCWluZmxhdGVfY29kZXNfdGQgPSBOVUxMOworfQorCitzdGF0aWMgdm9pZCBhYm9ydF91bnppcChTVEFURV9QQVJBTV9PTkxZKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGFib3J0X3VuemlwKFNUQVRFX1BBUkFNX09OTFkpCit7CisJaHVmdF9mcmVlX2FsbChQQVNTX1NUQVRFX09OTFkpOworCWxvbmdqbXAoZXJyb3Jfam1wLCAxKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGZpbGxfYml0YnVmZmVyKFNUQVRFX1BBUkFNIHVuc2lnbmVkIGJpdGJ1ZmZlciwgdW5zaWduZWQgKmN1cnJlbnQsIGNvbnN0IHVuc2lnbmVkIHJlcXVpcmVkKQoreworCXdoaWxlICgqY3VycmVudCA8IHJlcXVpcmVkKSB7CisJCWlmIChieXRlYnVmZmVyX29mZnNldCA+PSBieXRlYnVmZmVyX3NpemUpIHsKKwkJCXVuc2lnbmVkIHN6ID0gYnl0ZWJ1ZmZlcl9tYXggLSA0OworCQkJaWYgKHRvX3JlYWQgPj0gMCAmJiB0b19yZWFkIDwgc3opIC8qIHVuemlwIG9ubHkgKi8KKwkJCQlzeiA9IHRvX3JlYWQ7CisJCQkvKiBMZWF2ZSB0aGUgZmlyc3QgNCBieXRlcyBlbXB0eSBzbyB3ZSBjYW4gYWx3YXlzIHVud2luZCB0aGUgYml0YnVmZmVyCisJCQkgKiB0byB0aGUgZnJvbnQgb2YgdGhlIGJ5dGVidWZmZXIgKi8KKwkJCWJ5dGVidWZmZXJfc2l6ZSA9IHNhZmVfcmVhZChndW56aXBfc3JjX2ZkLCAmYnl0ZWJ1ZmZlcls0XSwgc3opOworCQkJaWYgKChpbnQpYnl0ZWJ1ZmZlcl9zaXplIDwgMSkgeworCQkJCWVycm9yX21zZyA9ICJ1bmV4cGVjdGVkIGVuZCBvZiBmaWxlIjsKKwkJCQlhYm9ydF91bnppcChQQVNTX1NUQVRFX09OTFkpOworCQkJfQorCQkJaWYgKHRvX3JlYWQgPj0gMCkgLyogdW56aXAgb25seSAqLworCQkJCXRvX3JlYWQgLT0gYnl0ZWJ1ZmZlcl9zaXplOworCQkJYnl0ZWJ1ZmZlcl9zaXplICs9IDQ7CisJCQlieXRlYnVmZmVyX29mZnNldCA9IDQ7CisJCX0KKwkJYml0YnVmZmVyIHw9ICgodW5zaWduZWQpIGJ5dGVidWZmZXJbYnl0ZWJ1ZmZlcl9vZmZzZXRdKSA8PCAqY3VycmVudDsKKwkJYnl0ZWJ1ZmZlcl9vZmZzZXQrKzsKKwkJKmN1cnJlbnQgKz0gODsKKwl9CisJcmV0dXJuIGJpdGJ1ZmZlcjsKK30KKworCisvKiBHaXZlbiBhIGxpc3Qgb2YgY29kZSBsZW5ndGhzIGFuZCBhIG1heGltdW0gdGFibGUgc2l6ZSwgbWFrZSBhIHNldCBvZgorICogdGFibGVzIHRvIGRlY29kZSB0aGF0IHNldCBvZiBjb2Rlcy4gIFJldHVybiB6ZXJvIG9uIHN1Y2Nlc3MsIG9uZSBpZgorICogdGhlIGdpdmVuIGNvZGUgc2V0IGlzIGluY29tcGxldGUgKHRoZSB0YWJsZXMgYXJlIHN0aWxsIGJ1aWx0IGluIHRoaXMKKyAqIGNhc2UpLCB0d28gaWYgdGhlIGlucHV0IGlzIGludmFsaWQgKGFsbCB6ZXJvIGxlbmd0aCBjb2RlcyBvciBhbgorICogb3ZlcnN1YnNjcmliZWQgc2V0IG9mIGxlbmd0aHMpIC0gaW4gdGhpcyBjYXNlIHN0b3JlcyBOVUxMIGluICp0LgorICoKKyAqIGI6CWNvZGUgbGVuZ3RocyBpbiBiaXRzIChhbGwgYXNzdW1lZCA8PSBCTUFYKQorICogbjoJbnVtYmVyIG9mIGNvZGVzIChhc3N1bWVkIDw9IE5fTUFYKQorICogczoJbnVtYmVyIG9mIHNpbXBsZS12YWx1ZWQgY29kZXMgKDAuLnMtMSkKKyAqIGQ6CWxpc3Qgb2YgYmFzZSB2YWx1ZXMgZm9yIG5vbi1zaW1wbGUgY29kZXMKKyAqIGU6CWxpc3Qgb2YgZXh0cmEgYml0cyBmb3Igbm9uLXNpbXBsZSBjb2RlcworICogdDoJcmVzdWx0OiBzdGFydGluZyB0YWJsZQorICogbToJbWF4aW11bSBsb29rdXAgYml0cywgcmV0dXJucyBhY3R1YWwKKyAqLworc3RhdGljIGludCBodWZ0X2J1aWxkKGNvbnN0IHVuc2lnbmVkICpiLCBjb25zdCB1bnNpZ25lZCBuLAorCQkJY29uc3QgdW5zaWduZWQgcywgY29uc3QgdW5zaWduZWQgc2hvcnQgKmQsCisJCQljb25zdCB1bnNpZ25lZCBjaGFyICplLCBodWZ0X3QgKip0LCB1bnNpZ25lZCAqbSkKK3sKKwl1bnNpZ25lZCBhOyAgICAgICAgICAgICAvKiBjb3VudGVyIGZvciBjb2RlcyBvZiBsZW5ndGggayAqLworCXVuc2lnbmVkIGNbQk1BWCArIDFdOyAgIC8qIGJpdCBsZW5ndGggY291bnQgdGFibGUgKi8KKwl1bnNpZ25lZCBlb2JfbGVuOyAgICAgICAvKiBsZW5ndGggb2YgZW5kLW9mLWJsb2NrIGNvZGUgKHZhbHVlIDI1NikgKi8KKwl1bnNpZ25lZCBmOyAgICAgICAgICAgICAvKiBpIHJlcGVhdHMgaW4gdGFibGUgZXZlcnkgZiBlbnRyaWVzICovCisJaW50IGc7ICAgICAgICAgICAgICAgICAgLyogbWF4aW11bSBjb2RlIGxlbmd0aCAqLworCWludCBodGw7ICAgICAgICAgICAgICAgIC8qIHRhYmxlIGxldmVsICovCisJdW5zaWduZWQgaTsgICAgICAgICAgICAgLyogY291bnRlciwgY3VycmVudCBjb2RlICovCisJdW5zaWduZWQgajsgICAgICAgICAgICAgLyogY291bnRlciAqLworCWludCBrOyAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIGN1cnJlbnQgY29kZSAqLworCXVuc2lnbmVkICpwOyAgICAgICAgICAgIC8qIHBvaW50ZXIgaW50byBjW10sIGJbXSwgb3IgdltdICovCisJaHVmdF90ICpxOyAgICAgICAgICAgICAgLyogcG9pbnRzIHRvIGN1cnJlbnQgdGFibGUgKi8KKwlodWZ0X3QgcjsgICAgICAgICAgICAgICAvKiB0YWJsZSBlbnRyeSBmb3Igc3RydWN0dXJlIGFzc2lnbm1lbnQgKi8KKwlodWZ0X3QgKnVbQk1BWF07ICAgICAgICAvKiB0YWJsZSBzdGFjayAqLworCXVuc2lnbmVkIHZbTl9NQVhdOyAgICAgIC8qIHZhbHVlcyBpbiBvcmRlciBvZiBiaXQgbGVuZ3RoICovCisJaW50IHdzW0JNQVggKyAxXTsgICAgICAgLyogYml0cyBkZWNvZGVkIHN0YWNrICovCisJaW50IHc7ICAgICAgICAgICAgICAgICAgLyogYml0cyBkZWNvZGVkICovCisJdW5zaWduZWQgeFtCTUFYICsgMV07ICAgLyogYml0IG9mZnNldHMsIHRoZW4gY29kZSBzdGFjayAqLworCXVuc2lnbmVkICp4cDsgICAgICAgICAgIC8qIHBvaW50ZXIgaW50byB4ICovCisJaW50IHk7ICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGR1bW15IGNvZGVzIGFkZGVkICovCisJdW5zaWduZWQgejsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGVudHJpZXMgaW4gY3VycmVudCB0YWJsZSAqLworCisJLyogTGVuZ3RoIG9mIEVPQiBjb2RlLCBpZiBhbnkgKi8KKwllb2JfbGVuID0gbiA+IDI1NiA/IGJbMjU2XSA6IEJNQVg7CisKKwkqdCA9IE5VTEw7CisKKwkvKiBHZW5lcmF0ZSBjb3VudHMgZm9yIGVhY2ggYml0IGxlbmd0aCAqLworCW1lbXNldChjLCAwLCBzaXplb2YoYykpOworCXAgPSAodW5zaWduZWQgKikgYjsgLyogY2FzdCBhbGxvd3MgdXMgdG8gcmV1c2UgcCBmb3IgcG9pbnRpbmcgdG8gYiAqLworCWkgPSBuOworCWRvIHsKKwkJY1sqcF0rKzsgLyogYXNzdW1lIGFsbCBlbnRyaWVzIDw9IEJNQVggKi8KKwkJcCsrOyAgICAgLyogY2FuJ3QgY29tYmluZSB3aXRoIGFib3ZlIGxpbmUgKFNvbGFyaXMgYnVnKSAqLworCX0gd2hpbGUgKC0taSk7CisJaWYgKGNbMF0gPT0gbikgeyAgLyogbnVsbCBpbnB1dCAtIGFsbCB6ZXJvIGxlbmd0aCBjb2RlcyAqLworCQkqbSA9IDA7CisJCXJldHVybiAyOworCX0KKworCS8qIEZpbmQgbWluaW11bSBhbmQgbWF4aW11bSBsZW5ndGgsIGJvdW5kICptIGJ5IHRob3NlICovCisJZm9yIChqID0gMTsgKGogPD0gQk1BWCkgJiYgKGNbal0gPT0gMCk7IGorKykKKwkJY29udGludWU7CisJayA9IGo7IC8qIG1pbmltdW0gY29kZSBsZW5ndGggKi8KKwlmb3IgKGkgPSBCTUFYOyAoY1tpXSA9PSAwKSAmJiBpOyBpLS0pCisJCWNvbnRpbnVlOworCWcgPSBpOyAvKiBtYXhpbXVtIGNvZGUgbGVuZ3RoICovCisJKm0gPSAoKm0gPCBqKSA/IGogOiAoKCptID4gaSkgPyBpIDogKm0pOworCisJLyogQWRqdXN0IGxhc3QgbGVuZ3RoIGNvdW50IHRvIGZpbGwgb3V0IGNvZGVzLCBpZiBuZWVkZWQgKi8KKwlmb3IgKHkgPSAxIDw8IGo7IGogPCBpOyBqKyssIHkgPDw9IDEpIHsKKwkJeSAtPSBjW2pdOworCQlpZiAoeSA8IDApCisJCQlyZXR1cm4gMjsgLyogYmFkIGlucHV0OiBtb3JlIGNvZGVzIHRoYW4gYml0cyAqLworCX0KKwl5IC09IGNbaV07CisJaWYgKHkgPCAwKQorCQlyZXR1cm4gMjsKKwljW2ldICs9IHk7CisKKwkvKiBHZW5lcmF0ZSBzdGFydGluZyBvZmZzZXRzIGludG8gdGhlIHZhbHVlIHRhYmxlIGZvciBlYWNoIGxlbmd0aCAqLworCXhbMV0gPSBqID0gMDsKKwlwID0gYyArIDE7CisJeHAgPSB4ICsgMjsKKwl3aGlsZSAoLS1pKSB7IC8qIG5vdGUgdGhhdCBpID09IGcgZnJvbSBhYm92ZSAqLworCQlqICs9ICpwKys7CisJCSp4cCsrID0gajsKKwl9CisKKwkvKiBNYWtlIGEgdGFibGUgb2YgdmFsdWVzIGluIG9yZGVyIG9mIGJpdCBsZW5ndGhzICovCisJcCA9ICh1bnNpZ25lZCAqKSBiOworCWkgPSAwOworCWRvIHsKKwkJaiA9ICpwKys7CisJCWlmIChqICE9IDApIHsKKwkJCXZbeFtqXSsrXSA9IGk7CisJCX0KKwl9IHdoaWxlICgrK2kgPCBuKTsKKworCS8qIEdlbmVyYXRlIHRoZSBIdWZmbWFuIGNvZGVzIGFuZCBmb3IgZWFjaCwgbWFrZSB0aGUgdGFibGUgZW50cmllcyAqLworCXhbMF0gPSBpID0gMDsgICAvKiBmaXJzdCBIdWZmbWFuIGNvZGUgaXMgemVybyAqLworCXAgPSB2OyAgICAgICAgICAvKiBncmFiIHZhbHVlcyBpbiBiaXQgb3JkZXIgKi8KKwlodGwgPSAtMTsgICAgICAgLyogbm8gdGFibGVzIHlldC0tbGV2ZWwgLTEgKi8KKwl3ID0gd3NbMF0gPSAwOyAgLyogYml0cyBkZWNvZGVkICovCisJdVswXSA9IE5VTEw7ICAgIC8qIGp1c3QgdG8ga2VlcCBjb21waWxlcnMgaGFwcHkgKi8KKwlxID0gTlVMTDsgICAgICAgLyogZGl0dG8gKi8KKwl6ID0gMDsgICAgICAgICAgLyogZGl0dG8gKi8KKworCS8qIGdvIHRocm91Z2ggdGhlIGJpdCBsZW5ndGhzIChrIGFscmVhZHkgaXMgYml0cyBpbiBzaG9ydGVzdCBjb2RlKSAqLworCWZvciAoOyBrIDw9IGc7IGsrKykgeworCQlhID0gY1trXTsKKwkJd2hpbGUgKGEtLSkgeworCQkJLyogaGVyZSBpIGlzIHRoZSBIdWZmbWFuIGNvZGUgb2YgbGVuZ3RoIGsgYml0cyBmb3IgdmFsdWUgKnAgKi8KKwkJCS8qIG1ha2UgdGFibGVzIHVwIHRvIHJlcXVpcmVkIGxldmVsICovCisJCQl3aGlsZSAoayA+IHdzW2h0bCArIDFdKSB7CisJCQkJdyA9IHdzWysraHRsXTsKKworCQkJCS8qIGNvbXB1dGUgbWluaW11bSBzaXplIHRhYmxlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAqbSBiaXRzICovCisJCQkJeiA9IGcgLSB3OworCQkJCXogPSB6ID4gKm0gPyAqbSA6IHo7IC8qIHVwcGVyIGxpbWl0IG9uIHRhYmxlIHNpemUgKi8KKwkJCQlqID0gayAtIHc7CisJCQkJZiA9IDEgPDwgajsKKwkJCQlpZiAoZiA+IGEgKyAxKSB7IC8qIHRyeSBhIGstdyBiaXQgdGFibGUgKi8KKwkJCQkJLyogdG9vIGZldyBjb2RlcyBmb3Igay13IGJpdCB0YWJsZSAqLworCQkJCQlmIC09IGEgKyAxOyAvKiBkZWR1Y3QgY29kZXMgZnJvbSBwYXR0ZXJucyBsZWZ0ICovCisJCQkJCXhwID0gYyArIGs7CisJCQkJCXdoaWxlICgrK2ogPCB6KSB7IC8qIHRyeSBzbWFsbGVyIHRhYmxlcyB1cCB0byB6IGJpdHMgKi8KKwkJCQkJCWYgPDw9IDE7CisJCQkJCQlpZiAoZiA8PSAqKyt4cCkgeworCQkJCQkJCWJyZWFrOyAvKiBlbm91Z2ggY29kZXMgdG8gdXNlIHVwIGogYml0cyAqLworCQkJCQkJfQorCQkJCQkJZiAtPSAqeHA7IC8qIGVsc2UgZGVkdWN0IGNvZGVzIGZyb20gcGF0dGVybnMgKi8KKwkJCQkJfQorCQkJCX0KKwkJCQlqID0gKHcgKyBqID4gZW9iX2xlbiAmJiB3IDwgZW9iX2xlbikgPyBlb2JfbGVuIC0gdyA6IGo7CS8qIG1ha2UgRU9CIGNvZGUgZW5kIGF0IHRhYmxlICovCisJCQkJeiA9IDEgPDwgajsJLyogdGFibGUgZW50cmllcyBmb3Igai1iaXQgdGFibGUgKi8KKwkJCQl3c1todGwrMV0gPSB3ICsgajsJLyogc2V0IGJpdHMgZGVjb2RlZCBpbiBzdGFjayAqLworCisJCQkJLyogYWxsb2NhdGUgYW5kIGxpbmsgaW4gbmV3IHRhYmxlICovCisJCQkJcSA9IHh6YWxsb2MoKHogKyAxKSAqIHNpemVvZihodWZ0X3QpKTsKKwkJCQkqdCA9IHEgKyAxOwkvKiBsaW5rIHRvIGxpc3QgZm9yIGh1ZnRfZnJlZSgpICovCisJCQkJdCA9ICYocS0+di50KTsKKwkJCQl1W2h0bF0gPSArK3E7CS8qIHRhYmxlIHN0YXJ0cyBhZnRlciBsaW5rICovCisKKwkJCQkvKiBjb25uZWN0IHRvIGxhc3QgdGFibGUsIGlmIHRoZXJlIGlzIG9uZSAqLworCQkJCWlmIChodGwpIHsKKwkJCQkJeFtodGxdID0gaTsgLyogc2F2ZSBwYXR0ZXJuIGZvciBiYWNraW5nIHVwICovCisJCQkJCXIuYiA9ICh1bnNpZ25lZCBjaGFyKSAodyAtIHdzW2h0bCAtIDFdKTsgLyogYml0cyB0byBkdW1wIGJlZm9yZSB0aGlzIHRhYmxlICovCisJCQkJCXIuZSA9ICh1bnNpZ25lZCBjaGFyKSAoMTYgKyBqKTsgLyogYml0cyBpbiB0aGlzIHRhYmxlICovCisJCQkJCXIudi50ID0gcTsgLyogcG9pbnRlciB0byB0aGlzIHRhYmxlICovCisJCQkJCWogPSAoaSAmICgoMSA8PCB3KSAtIDEpKSA+PiB3c1todGwgLSAxXTsKKwkJCQkJdVtodGwgLSAxXVtqXSA9IHI7IC8qIGNvbm5lY3QgdG8gbGFzdCB0YWJsZSAqLworCQkJCX0KKwkJCX0KKworCQkJLyogc2V0IHVwIHRhYmxlIGVudHJ5IGluIHIgKi8KKwkJCXIuYiA9ICh1bnNpZ25lZCBjaGFyKSAoayAtIHcpOworCQkJaWYgKHAgPj0gdiArIG4pIHsKKwkJCQlyLmUgPSA5OTsgLyogb3V0IG9mIHZhbHVlcy0taW52YWxpZCBjb2RlICovCisJCQl9IGVsc2UgaWYgKCpwIDwgcykgeworCQkJCXIuZSA9ICh1bnNpZ25lZCBjaGFyKSAoKnAgPCAyNTYgPyAxNiA6IDE1KTsJLyogMjU2IGlzIEVPQiBjb2RlICovCisJCQkJci52Lm4gPSAodW5zaWduZWQgc2hvcnQpICgqcCsrKTsgLyogc2ltcGxlIGNvZGUgaXMganVzdCB0aGUgdmFsdWUgKi8KKwkJCX0gZWxzZSB7CisJCQkJci5lID0gKHVuc2lnbmVkIGNoYXIpIGVbKnAgLSBzXTsgLyogbm9uLXNpbXBsZS0tbG9vayB1cCBpbiBsaXN0cyAqLworCQkJCXIudi5uID0gZFsqcCsrIC0gc107CisJCQl9CisKKwkJCS8qIGZpbGwgY29kZS1saWtlIGVudHJpZXMgd2l0aCByICovCisJCQlmID0gMSA8PCAoayAtIHcpOworCQkJZm9yIChqID0gaSA+PiB3OyBqIDwgejsgaiArPSBmKSB7CisJCQkJcVtqXSA9IHI7CisJCQl9CisKKwkJCS8qIGJhY2t3YXJkcyBpbmNyZW1lbnQgdGhlIGstYml0IGNvZGUgaSAqLworCQkJZm9yIChqID0gMSA8PCAoayAtIDEpOyBpICYgajsgaiA+Pj0gMSkgeworCQkJCWkgXj0gajsKKwkJCX0KKwkJCWkgXj0gajsKKworCQkJLyogYmFja3VwIG92ZXIgZmluaXNoZWQgdGFibGVzICovCisJCQl3aGlsZSAoKGkgJiAoKDEgPDwgdykgLSAxKSkgIT0geFtodGxdKSB7CisJCQkJdyA9IHdzWy0taHRsXTsKKwkJCX0KKwkJfQorCX0KKworCS8qIHJldHVybiBhY3R1YWwgc2l6ZSBvZiBiYXNlIHRhYmxlICovCisJKm0gPSB3c1sxXTsKKworCS8qIFJldHVybiAxIGlmIHdlIHdlcmUgZ2l2ZW4gYW4gaW5jb21wbGV0ZSB0YWJsZSAqLworCXJldHVybiB5ICE9IDAgJiYgZyAhPSAxOworfQorCisKKy8qCisgKiBpbmZsYXRlIChkZWNvbXByZXNzKSB0aGUgY29kZXMgaW4gYSBkZWZsYXRlZCAoY29tcHJlc3NlZCkgYmxvY2suCisgKiBSZXR1cm4gYW4gZXJyb3IgY29kZSBvciB6ZXJvIGlmIGl0IGFsbCBnb2VzIG9rLgorICoKKyAqIHRsLCB0ZDogbGl0ZXJhbC9sZW5ndGggYW5kIGRpc3RhbmNlIGRlY29kZXIgdGFibGVzCisgKiBibCwgYmQ6IG51bWJlciBvZiBiaXRzIGRlY29kZWQgYnkgdGxbXSBhbmQgdGRbXQorICovCisvKiBjYWxsZWQgb25jZSBmcm9tIGluZmxhdGVfYmxvY2sgKi8KKworLyogbWFwIGZvcm1lcmx5IGxvY2FsIHN0YXRpYyB2YXJpYWJsZXMgdG8gZ2xvYmFscyAqLworI2RlZmluZSBtbCBpbmZsYXRlX2NvZGVzX21sCisjZGVmaW5lIG1kIGluZmxhdGVfY29kZXNfbWQKKyNkZWZpbmUgYmIgaW5mbGF0ZV9jb2Rlc19iYgorI2RlZmluZSBrICBpbmZsYXRlX2NvZGVzX2sKKyNkZWZpbmUgdyAgaW5mbGF0ZV9jb2Rlc193CisjZGVmaW5lIHRsIGluZmxhdGVfY29kZXNfdGwKKyNkZWZpbmUgdGQgaW5mbGF0ZV9jb2Rlc190ZAorI2RlZmluZSBibCBpbmZsYXRlX2NvZGVzX2JsCisjZGVmaW5lIGJkIGluZmxhdGVfY29kZXNfYmQKKyNkZWZpbmUgbm4gaW5mbGF0ZV9jb2Rlc19ubgorI2RlZmluZSBkZCBpbmZsYXRlX2NvZGVzX2RkCitzdGF0aWMgdm9pZCBpbmZsYXRlX2NvZGVzX3NldHVwKFNUQVRFX1BBUkFNIHVuc2lnbmVkIG15X2JsLCB1bnNpZ25lZCBteV9iZCkKK3sKKwlibCA9IG15X2JsOworCWJkID0gbXlfYmQ7CisJLyogbWFrZSBsb2NhbCBjb3BpZXMgb2YgZ2xvYmFscyAqLworCWJiID0gZ3VuemlwX2JiOwkJCS8qIGluaXRpYWxpemUgYml0IGJ1ZmZlciAqLworCWsgPSBndW56aXBfYms7CisJdyA9IGd1bnppcF9vdXRidWZfY291bnQ7CS8qIGluaXRpYWxpemUgZ3VuemlwX3dpbmRvdyBwb3NpdGlvbiAqLworCS8qIGluZmxhdGUgdGhlIGNvZGVkIGRhdGEgKi8KKwltbCA9IG1hc2tfYml0c1tibF07CQkvKiBwcmVjb21wdXRlIG1hc2tzIGZvciBzcGVlZCAqLworCW1kID0gbWFza19iaXRzW2JkXTsKK30KKy8qIGNhbGxlZCBvbmNlIGZyb20gaW5mbGF0ZV9nZXRfbmV4dF93aW5kb3cgKi8KK3N0YXRpYyBOT0lOTElORSBpbnQgaW5mbGF0ZV9jb2RlcyhTVEFURV9QQVJBTV9PTkxZKQoreworCXVuc2lnbmVkIGU7CS8qIHRhYmxlIGVudHJ5IGZsYWcvbnVtYmVyIG9mIGV4dHJhIGJpdHMgKi8KKwlodWZ0X3QgKnQ7CS8qIHBvaW50ZXIgdG8gdGFibGUgZW50cnkgKi8KKworCWlmIChyZXN1bWVfY29weSkKKwkJZ290byBkb19jb3B5OworCisJd2hpbGUgKDEpIHsJCQkvKiBkbyB1bnRpbCBlbmQgb2YgYmxvY2sgKi8KKwkJYmIgPSBmaWxsX2JpdGJ1ZmZlcihQQVNTX1NUQVRFIGJiLCAmaywgYmwpOworCQl0ID0gdGwgKyAoKHVuc2lnbmVkKSBiYiAmIG1sKTsKKwkJZSA9IHQtPmU7CisJCWlmIChlID4gMTYpCisJCQlkbyB7CisJCQkJaWYgKGUgPT0gOTkpCisJCQkJCWFib3J0X3VuemlwKFBBU1NfU1RBVEVfT05MWSk7OworCQkJCWJiID4+PSB0LT5iOworCQkJCWsgLT0gdC0+YjsKKwkJCQllIC09IDE2OworCQkJCWJiID0gZmlsbF9iaXRidWZmZXIoUEFTU19TVEFURSBiYiwgJmssIGUpOworCQkJCXQgPSB0LT52LnQgKyAoKHVuc2lnbmVkKSBiYiAmIG1hc2tfYml0c1tlXSk7CisJCQkJZSA9IHQtPmU7CisJCQl9IHdoaWxlIChlID4gMTYpOworCQliYiA+Pj0gdC0+YjsKKwkJayAtPSB0LT5iOworCQlpZiAoZSA9PSAxNikgewkvKiB0aGVuIGl0J3MgYSBsaXRlcmFsICovCisJCQlndW56aXBfd2luZG93W3crK10gPSAodW5zaWduZWQgY2hhcikgdC0+di5uOworCQkJaWYgKHcgPT0gR1VOWklQX1dTSVpFKSB7CisJCQkJZ3VuemlwX291dGJ1Zl9jb3VudCA9IHc7CisJCQkJLy9mbHVzaF9ndW56aXBfd2luZG93KCk7CisJCQkJdyA9IDA7CisJCQkJcmV0dXJuIDE7IC8vIFdlIGhhdmUgYSBibG9jayB0byByZWFkCisJCQl9CisJCX0gZWxzZSB7CQkvKiBpdCdzIGFuIEVPQiBvciBhIGxlbmd0aCAqLworCQkJLyogZXhpdCBpZiBlbmQgb2YgYmxvY2sgKi8KKwkJCWlmIChlID09IDE1KSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIGdldCBsZW5ndGggb2YgYmxvY2sgdG8gY29weSAqLworCQkJYmIgPSBmaWxsX2JpdGJ1ZmZlcihQQVNTX1NUQVRFIGJiLCAmaywgZSk7CisJCQlubiA9IHQtPnYubiArICgodW5zaWduZWQpIGJiICYgbWFza19iaXRzW2VdKTsKKwkJCWJiID4+PSBlOworCQkJayAtPSBlOworCisJCQkvKiBkZWNvZGUgZGlzdGFuY2Ugb2YgYmxvY2sgdG8gY29weSAqLworCQkJYmIgPSBmaWxsX2JpdGJ1ZmZlcihQQVNTX1NUQVRFIGJiLCAmaywgYmQpOworCQkJdCA9IHRkICsgKCh1bnNpZ25lZCkgYmIgJiBtZCk7CisJCQllID0gdC0+ZTsKKwkJCWlmIChlID4gMTYpCisJCQkJZG8geworCQkJCQlpZiAoZSA9PSA5OSkKKwkJCQkJCWFib3J0X3VuemlwKFBBU1NfU1RBVEVfT05MWSk7CisJCQkJCWJiID4+PSB0LT5iOworCQkJCQlrIC09IHQtPmI7CisJCQkJCWUgLT0gMTY7CisJCQkJCWJiID0gZmlsbF9iaXRidWZmZXIoUEFTU19TVEFURSBiYiwgJmssIGUpOworCQkJCQl0ID0gdC0+di50ICsgKCh1bnNpZ25lZCkgYmIgJiBtYXNrX2JpdHNbZV0pOworCQkJCQllID0gdC0+ZTsKKwkJCQl9IHdoaWxlIChlID4gMTYpOworCQkJYmIgPj49IHQtPmI7CisJCQlrIC09IHQtPmI7CisJCQliYiA9IGZpbGxfYml0YnVmZmVyKFBBU1NfU1RBVEUgYmIsICZrLCBlKTsKKwkJCWRkID0gdyAtIHQtPnYubiAtICgodW5zaWduZWQpIGJiICYgbWFza19iaXRzW2VdKTsKKwkJCWJiID4+PSBlOworCQkJayAtPSBlOworCisJCQkvKiBkbyB0aGUgY29weSAqLworIGRvX2NvcHk6CisJCQlkbyB7CisJCQkJLyogV2FzOiBubiAtPSAoZSA9IChlID0gR1VOWklQX1dTSVpFIC0gKChkZCAmPSBHVU5aSVBfV1NJWkUgLSAxKSA+IHcgPyBkZCA6IHcpKSA+IG5uID8gbm4gOiBlKTsgKi8KKwkJCQkvKiBXaG8gd3JvdGUgVEhBVD8/IHJld3JpdHRlbiBhczogKi8KKwkJCQl1bnNpZ25lZCBkZWx0YTsKKworCQkJCWRkICY9IEdVTlpJUF9XU0laRSAtIDE7CisJCQkJZSA9IEdVTlpJUF9XU0laRSAtIChkZCA+IHcgPyBkZCA6IHcpOworCQkJCWRlbHRhID0gdyA+IGRkID8gdyAtIGRkIDogZGQgLSB3OworCQkJCWlmIChlID4gbm4pIGUgPSBubjsKKwkJCQlubiAtPSBlOworCisJCQkJLyogY29weSB0byBuZXcgYnVmZmVyIHRvIHByZXZlbnQgcG9zc2libGUgb3ZlcndyaXRlICovCisJCQkJaWYgKGRlbHRhID49IGUpIHsKKwkJCQkJbWVtY3B5KGd1bnppcF93aW5kb3cgKyB3LCBndW56aXBfd2luZG93ICsgZGQsIGUpOworCQkJCQl3ICs9IGU7CisJCQkJCWRkICs9IGU7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogZG8gaXQgc2xvdyB0byBhdm9pZCBtZW1jcHkoKSBvdmVybGFwICovCisJCQkJCS8qICFOT01FTUNQWSAqLworCQkJCQlkbyB7CisJCQkJCQlndW56aXBfd2luZG93W3crK10gPSBndW56aXBfd2luZG93W2RkKytdOworCQkJCQl9IHdoaWxlICgtLWUpOworCQkJCX0KKwkJCQlpZiAodyA9PSBHVU5aSVBfV1NJWkUpIHsKKwkJCQkJZ3VuemlwX291dGJ1Zl9jb3VudCA9IHc7CisJCQkJCXJlc3VtZV9jb3B5ID0gKG5uICE9IDApOworCQkJCQkvL2ZsdXNoX2d1bnppcF93aW5kb3coKTsKKwkJCQkJdyA9IDA7CisJCQkJCXJldHVybiAxOworCQkJCX0KKwkJCX0gd2hpbGUgKG5uKTsKKwkJCXJlc3VtZV9jb3B5ID0gMDsKKwkJfQorCX0KKworCS8qIHJlc3RvcmUgdGhlIGdsb2JhbHMgZnJvbSB0aGUgbG9jYWxzICovCisJZ3VuemlwX291dGJ1Zl9jb3VudCA9IHc7CS8qIHJlc3RvcmUgZ2xvYmFsIGd1bnppcF93aW5kb3cgcG9pbnRlciAqLworCWd1bnppcF9iYiA9IGJiOwkJCS8qIHJlc3RvcmUgZ2xvYmFsIGJpdCBidWZmZXIgKi8KKwlndW56aXBfYmsgPSBrOworCisJLyogbm9ybWFsbHkganVzdCBhZnRlciBjYWxsIHRvIGluZmxhdGVfY29kZXMsIGJ1dCBzYXZlIGNvZGUgYnkgcHV0dGluZyBpdCBoZXJlICovCisJLyogZnJlZSB0aGUgZGVjb2RpbmcgdGFibGVzICh0bCBhbmQgdGQpLCByZXR1cm4gKi8KKwlodWZ0X2ZyZWVfYWxsKFBBU1NfU1RBVEVfT05MWSk7CisKKwkvKiBkb25lICovCisJcmV0dXJuIDA7Cit9CisjdW5kZWYgbWwKKyN1bmRlZiBtZAorI3VuZGVmIGJiCisjdW5kZWYgaworI3VuZGVmIHcKKyN1bmRlZiB0bAorI3VuZGVmIHRkCisjdW5kZWYgYmwKKyN1bmRlZiBiZAorI3VuZGVmIG5uCisjdW5kZWYgZGQKKworCisvKiBjYWxsZWQgb25jZSBmcm9tIGluZmxhdGVfYmxvY2sgKi8KK3N0YXRpYyB2b2lkIGluZmxhdGVfc3RvcmVkX3NldHVwKFNUQVRFX1BBUkFNIGludCBteV9uLCBpbnQgbXlfYiwgaW50IG15X2spCit7CisJaW5mbGF0ZV9zdG9yZWRfbiA9IG15X247CisJaW5mbGF0ZV9zdG9yZWRfYiA9IG15X2I7CisJaW5mbGF0ZV9zdG9yZWRfayA9IG15X2s7CisJLyogaW5pdGlhbGl6ZSBndW56aXBfd2luZG93IHBvc2l0aW9uICovCisJaW5mbGF0ZV9zdG9yZWRfdyA9IGd1bnppcF9vdXRidWZfY291bnQ7Cit9CisvKiBjYWxsZWQgb25jZSBmcm9tIGluZmxhdGVfZ2V0X25leHRfd2luZG93ICovCitzdGF0aWMgaW50IGluZmxhdGVfc3RvcmVkKFNUQVRFX1BBUkFNX09OTFkpCit7CisJLyogcmVhZCBhbmQgb3V0cHV0IHRoZSBjb21wcmVzc2VkIGRhdGEgKi8KKwl3aGlsZSAoaW5mbGF0ZV9zdG9yZWRfbi0tKSB7CisJCWluZmxhdGVfc3RvcmVkX2IgPSBmaWxsX2JpdGJ1ZmZlcihQQVNTX1NUQVRFIGluZmxhdGVfc3RvcmVkX2IsICZpbmZsYXRlX3N0b3JlZF9rLCA4KTsKKwkJZ3VuemlwX3dpbmRvd1tpbmZsYXRlX3N0b3JlZF93KytdID0gKHVuc2lnbmVkIGNoYXIpIGluZmxhdGVfc3RvcmVkX2I7CisJCWlmIChpbmZsYXRlX3N0b3JlZF93ID09IEdVTlpJUF9XU0laRSkgeworCQkJZ3VuemlwX291dGJ1Zl9jb3VudCA9IGluZmxhdGVfc3RvcmVkX3c7CisJCQkvL2ZsdXNoX2d1bnppcF93aW5kb3coKTsKKwkJCWluZmxhdGVfc3RvcmVkX3cgPSAwOworCQkJaW5mbGF0ZV9zdG9yZWRfYiA+Pj0gODsKKwkJCWluZmxhdGVfc3RvcmVkX2sgLT0gODsKKwkJCXJldHVybiAxOyAvKiBXZSBoYXZlIGEgYmxvY2sgKi8KKwkJfQorCQlpbmZsYXRlX3N0b3JlZF9iID4+PSA4OworCQlpbmZsYXRlX3N0b3JlZF9rIC09IDg7CisJfQorCisJLyogcmVzdG9yZSB0aGUgZ2xvYmFscyBmcm9tIHRoZSBsb2NhbHMgKi8KKwlndW56aXBfb3V0YnVmX2NvdW50ID0gaW5mbGF0ZV9zdG9yZWRfdzsJCS8qIHJlc3RvcmUgZ2xvYmFsIGd1bnppcF93aW5kb3cgcG9pbnRlciAqLworCWd1bnppcF9iYiA9IGluZmxhdGVfc3RvcmVkX2I7CS8qIHJlc3RvcmUgZ2xvYmFsIGJpdCBidWZmZXIgKi8KKwlndW56aXBfYmsgPSBpbmZsYXRlX3N0b3JlZF9rOworCXJldHVybiAwOyAvKiBGaW5pc2hlZCAqLworfQorCisKKy8qCisgKiBkZWNvbXByZXNzIGFuIGluZmxhdGVkIGJsb2NrCisgKiBlOiBsYXN0IGJsb2NrIGZsYWcKKyAqCisgKiBHTE9CQUwgVkFSSUFCTEVTOiBiYiwga2ssCisgKi8KKy8qIFJldHVybiB2YWx1ZXM6IC0xID0gaW5mbGF0ZV9zdG9yZWQsIC0yID0gaW5mbGF0ZV9jb2RlcyAqLworLyogT25lIGNhbGxzaXRlIGluIGluZmxhdGVfZ2V0X25leHRfd2luZG93ICovCitzdGF0aWMgaW50IGluZmxhdGVfYmxvY2soU1RBVEVfUEFSQU0gc21hbGxpbnQgKmUpCit7CisJdW5zaWduZWQgbGxbMjg2ICsgMzBdOyAgLyogbGl0ZXJhbC9sZW5ndGggYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqLworCXVuc2lnbmVkIHQ7ICAgICAvKiBibG9jayB0eXBlICovCisJdW5zaWduZWQgYjsgICAgIC8qIGJpdCBidWZmZXIgKi8KKwl1bnNpZ25lZCBrOyAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworCisJLyogbWFrZSBsb2NhbCBiaXQgYnVmZmVyICovCisKKwliID0gZ3VuemlwX2JiOworCWsgPSBndW56aXBfYms7CisKKwkvKiByZWFkIGluIGxhc3QgYmxvY2sgYml0ICovCisJYiA9IGZpbGxfYml0YnVmZmVyKFBBU1NfU1RBVEUgYiwgJmssIDEpOworCSplID0gYiAmIDE7CisJYiA+Pj0gMTsKKwlrIC09IDE7CisKKwkvKiByZWFkIGluIGJsb2NrIHR5cGUgKi8KKwliID0gZmlsbF9iaXRidWZmZXIoUEFTU19TVEFURSBiLCAmaywgMik7CisJdCA9ICh1bnNpZ25lZCkgYiAmIDM7CisJYiA+Pj0gMjsKKwlrIC09IDI7CisKKwkvKiByZXN0b3JlIHRoZSBnbG9iYWwgYml0IGJ1ZmZlciAqLworCWd1bnppcF9iYiA9IGI7CisJZ3VuemlwX2JrID0gazsKKworCS8qIERvIHdlIHNlZSBibG9jayB0eXBlIDEgb2Z0ZW4/IFllcyEKKwkgKiBUT0RPOiBmaXggcGVyZm9ybWFuY2UgcHJvYmxlbSAoc2VlIGJlbG93KSAqLworCS8vYmJfZXJyb3JfbXNnKCJibGt0eXBlICVkIiwgdCk7CisKKwkvKiBpbmZsYXRlIHRoYXQgYmxvY2sgdHlwZSAqLworCXN3aXRjaCAodCkgeworCWNhc2UgMDogLyogSW5mbGF0ZSBzdG9yZWQgKi8KKwl7CisJCXVuc2lnbmVkIG47CS8qIG51bWJlciBvZiBieXRlcyBpbiBibG9jayAqLworCQl1bnNpZ25lZCBiX3N0b3JlZDsJLyogYml0IGJ1ZmZlciAqLworCQl1bnNpZ25lZCBrX3N0b3JlZDsJLyogbnVtYmVyIG9mIGJpdHMgaW4gYml0IGJ1ZmZlciAqLworCisJCS8qIG1ha2UgbG9jYWwgY29waWVzIG9mIGdsb2JhbHMgKi8KKwkJYl9zdG9yZWQgPSBndW56aXBfYmI7CS8qIGluaXRpYWxpemUgYml0IGJ1ZmZlciAqLworCQlrX3N0b3JlZCA9IGd1bnppcF9iazsKKworCQkvKiBnbyB0byBieXRlIGJvdW5kYXJ5ICovCisJCW4gPSBrX3N0b3JlZCAmIDc7CisJCWJfc3RvcmVkID4+PSBuOworCQlrX3N0b3JlZCAtPSBuOworCisJCS8qIGdldCB0aGUgbGVuZ3RoIGFuZCBpdHMgY29tcGxlbWVudCAqLworCQliX3N0b3JlZCA9IGZpbGxfYml0YnVmZmVyKFBBU1NfU1RBVEUgYl9zdG9yZWQsICZrX3N0b3JlZCwgMTYpOworCQluID0gKCh1bnNpZ25lZCkgYl9zdG9yZWQgJiAweGZmZmYpOworCQliX3N0b3JlZCA+Pj0gMTY7CisJCWtfc3RvcmVkIC09IDE2OworCisJCWJfc3RvcmVkID0gZmlsbF9iaXRidWZmZXIoUEFTU19TVEFURSBiX3N0b3JlZCwgJmtfc3RvcmVkLCAxNik7CisJCWlmIChuICE9ICh1bnNpZ25lZCkgKCh+Yl9zdG9yZWQpICYgMHhmZmZmKSkgeworCQkJYWJvcnRfdW56aXAoUEFTU19TVEFURV9PTkxZKTsJLyogZXJyb3IgaW4gY29tcHJlc3NlZCBkYXRhICovCisJCX0KKwkJYl9zdG9yZWQgPj49IDE2OworCQlrX3N0b3JlZCAtPSAxNjsKKworCQlpbmZsYXRlX3N0b3JlZF9zZXR1cChQQVNTX1NUQVRFIG4sIGJfc3RvcmVkLCBrX3N0b3JlZCk7CisKKwkJcmV0dXJuIC0xOworCX0KKwljYXNlIDE6CisJLyogSW5mbGF0ZSBmaXhlZAorCSAqIGRlY29tcHJlc3MgYW4gaW5mbGF0ZWQgdHlwZSAxIChmaXhlZCBIdWZmbWFuIGNvZGVzKSBibG9jay4gV2Ugc2hvdWxkCisJICogZWl0aGVyIHJlcGxhY2UgdGhpcyB3aXRoIGEgY3VzdG9tIGRlY29kZXIsIG9yIGF0IGxlYXN0IHByZWNvbXB1dGUgdGhlCisJICogSHVmZm1hbiB0YWJsZXMuIFRPRE8gKi8KKwl7CisJCWludCBpOyAgICAgICAgICAgICAgICAgIC8qIHRlbXBvcmFyeSB2YXJpYWJsZSAqLworCQl1bnNpZ25lZCBibDsgICAgICAgICAgICAvKiBsb29rdXAgYml0cyBmb3IgdGwgKi8KKwkJdW5zaWduZWQgYmQ7ICAgICAgICAgICAgLyogbG9va3VwIGJpdHMgZm9yIHRkICovCisJCS8qIGdjYyA0LjIuMSBpcyB0b28gZHVtYiB0byByZXVzZSBzdGFja3NwYWNlLiBNb3ZlZCB1cC4uLiAqLworCQkvL3Vuc2lnbmVkIGxsWzI4OF07ICAgICAvKiBsZW5ndGggbGlzdCBmb3IgaHVmdF9idWlsZCAqLworCisJCS8qIHNldCB1cCBsaXRlcmFsIHRhYmxlICovCisJCWZvciAoaSA9IDA7IGkgPCAxNDQ7IGkrKykKKwkJCWxsW2ldID0gODsKKwkJZm9yICg7IGkgPCAyNTY7IGkrKykKKwkJCWxsW2ldID0gOTsKKwkJZm9yICg7IGkgPCAyODA7IGkrKykKKwkJCWxsW2ldID0gNzsKKwkJZm9yICg7IGkgPCAyODg7IGkrKykgLyogbWFrZSBhIGNvbXBsZXRlLCBidXQgd3JvbmcgY29kZSBzZXQgKi8KKwkJCWxsW2ldID0gODsKKwkJYmwgPSA3OworCQlodWZ0X2J1aWxkKGxsLCAyODgsIDI1NywgY3BsZW5zLCBjcGxleHQsICZpbmZsYXRlX2NvZGVzX3RsLCAmYmwpOworCQkvKiBodWZ0X2J1aWxkKCkgbmV2ZXIgcmV0dXJuIG5vbnplcm8gLSB3ZSB1c2Uga25vd24gZGF0YSAqLworCisJCS8qIHNldCB1cCBkaXN0YW5jZSB0YWJsZSAqLworCQlmb3IgKGkgPSAwOyBpIDwgMzA7IGkrKykgLyogbWFrZSBhbiBpbmNvbXBsZXRlIGNvZGUgc2V0ICovCisJCQlsbFtpXSA9IDU7CisJCWJkID0gNTsKKwkJaHVmdF9idWlsZChsbCwgMzAsIDAsIGNwZGlzdCwgY3BkZXh0LCAmaW5mbGF0ZV9jb2Rlc190ZCwgJmJkKTsKKworCQkvKiBzZXQgdXAgZGF0YSBmb3IgaW5mbGF0ZV9jb2RlcygpICovCisJCWluZmxhdGVfY29kZXNfc2V0dXAoUEFTU19TVEFURSBibCwgYmQpOworCisJCS8qIGh1ZnRfZnJlZSBjb2RlIG1vdmVkIGludG8gaW5mbGF0ZV9jb2RlcyAqLworCisJCXJldHVybiAtMjsKKwl9CisJY2FzZSAyOiAvKiBJbmZsYXRlIGR5bmFtaWMgKi8KKwl7CisJCWVudW0geyBkYml0cyA9IDYgfTsgICAgIC8qIGJpdHMgaW4gYmFzZSBkaXN0YW5jZSBsb29rdXAgdGFibGUgKi8KKwkJZW51bSB7IGxiaXRzID0gOSB9OyAgICAgLyogYml0cyBpbiBiYXNlIGxpdGVyYWwvbGVuZ3RoIGxvb2t1cCB0YWJsZSAqLworCisJCWh1ZnRfdCAqdGQ7ICAgICAgICAgICAgIC8qIGRpc3RhbmNlIGNvZGUgdGFibGUgKi8KKwkJdW5zaWduZWQgaTsgICAgICAgICAgICAgLyogdGVtcG9yYXJ5IHZhcmlhYmxlcyAqLworCQl1bnNpZ25lZCBqOworCQl1bnNpZ25lZCBsOyAgICAgICAgICAgICAvKiBsYXN0IGxlbmd0aCAqLworCQl1bnNpZ25lZCBtOyAgICAgICAgICAgICAvKiBtYXNrIGZvciBiaXQgbGVuZ3RocyB0YWJsZSAqLworCQl1bnNpZ25lZCBuOyAgICAgICAgICAgICAvKiBudW1iZXIgb2YgbGVuZ3RocyB0byBnZXQgKi8KKwkJdW5zaWduZWQgYmw7ICAgICAgICAgICAgLyogbG9va3VwIGJpdHMgZm9yIHRsICovCisJCXVuc2lnbmVkIGJkOyAgICAgICAgICAgIC8qIGxvb2t1cCBiaXRzIGZvciB0ZCAqLworCQl1bnNpZ25lZCBuYjsgICAgICAgICAgICAvKiBudW1iZXIgb2YgYml0IGxlbmd0aCBjb2RlcyAqLworCQl1bnNpZ25lZCBubDsgICAgICAgICAgICAvKiBudW1iZXIgb2YgbGl0ZXJhbC9sZW5ndGggY29kZXMgKi8KKwkJdW5zaWduZWQgbmQ7ICAgICAgICAgICAgLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovCisKKwkJLy91bnNpZ25lZCBsbFsyODYgKyAzMF07LyogbGl0ZXJhbC9sZW5ndGggYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqLworCQl1bnNpZ25lZCBiX2R5bmFtaWM7ICAgICAvKiBiaXQgYnVmZmVyICovCisJCXVuc2lnbmVkIGtfZHluYW1pYzsgICAgIC8qIG51bWJlciBvZiBiaXRzIGluIGJpdCBidWZmZXIgKi8KKworCQkvKiBtYWtlIGxvY2FsIGJpdCBidWZmZXIgKi8KKwkJYl9keW5hbWljID0gZ3VuemlwX2JiOworCQlrX2R5bmFtaWMgPSBndW56aXBfYms7CisKKwkJLyogcmVhZCBpbiB0YWJsZSBsZW5ndGhzICovCisJCWJfZHluYW1pYyA9IGZpbGxfYml0YnVmZmVyKFBBU1NfU1RBVEUgYl9keW5hbWljLCAma19keW5hbWljLCA1KTsKKwkJbmwgPSAyNTcgKyAoKHVuc2lnbmVkKSBiX2R5bmFtaWMgJiAweDFmKTsJLyogbnVtYmVyIG9mIGxpdGVyYWwvbGVuZ3RoIGNvZGVzICovCisKKwkJYl9keW5hbWljID4+PSA1OworCQlrX2R5bmFtaWMgLT0gNTsKKwkJYl9keW5hbWljID0gZmlsbF9iaXRidWZmZXIoUEFTU19TVEFURSBiX2R5bmFtaWMsICZrX2R5bmFtaWMsIDUpOworCQluZCA9IDEgKyAoKHVuc2lnbmVkKSBiX2R5bmFtaWMgJiAweDFmKTsJLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovCisKKwkJYl9keW5hbWljID4+PSA1OworCQlrX2R5bmFtaWMgLT0gNTsKKwkJYl9keW5hbWljID0gZmlsbF9iaXRidWZmZXIoUEFTU19TVEFURSBiX2R5bmFtaWMsICZrX2R5bmFtaWMsIDQpOworCQluYiA9IDQgKyAoKHVuc2lnbmVkKSBiX2R5bmFtaWMgJiAweGYpOwkvKiBudW1iZXIgb2YgYml0IGxlbmd0aCBjb2RlcyAqLworCisJCWJfZHluYW1pYyA+Pj0gNDsKKwkJa19keW5hbWljIC09IDQ7CisJCWlmIChubCA+IDI4NiB8fCBuZCA+IDMwKQorCQkJYWJvcnRfdW56aXAoUEFTU19TVEFURV9PTkxZKTsJLyogYmFkIGxlbmd0aHMgKi8KKworCQkvKiByZWFkIGluIGJpdC1sZW5ndGgtY29kZSBsZW5ndGhzICovCisJCWZvciAoaiA9IDA7IGogPCBuYjsgaisrKSB7CisJCQliX2R5bmFtaWMgPSBmaWxsX2JpdGJ1ZmZlcihQQVNTX1NUQVRFIGJfZHluYW1pYywgJmtfZHluYW1pYywgMyk7CisJCQlsbFtib3JkZXJbal1dID0gKHVuc2lnbmVkKSBiX2R5bmFtaWMgJiA3OworCQkJYl9keW5hbWljID4+PSAzOworCQkJa19keW5hbWljIC09IDM7CisJCX0KKwkJZm9yICg7IGogPCAxOTsgaisrKQorCQkJbGxbYm9yZGVyW2pdXSA9IDA7CisKKwkJLyogYnVpbGQgZGVjb2RpbmcgdGFibGUgZm9yIHRyZWVzIC0gc2luZ2xlIGxldmVsLCA3IGJpdCBsb29rdXAgKi8KKwkJYmwgPSA3OworCQlpID0gaHVmdF9idWlsZChsbCwgMTksIDE5LCBOVUxMLCBOVUxMLCAmaW5mbGF0ZV9jb2Rlc190bCwgJmJsKTsKKwkJaWYgKGkgIT0gMCkgeworCQkJYWJvcnRfdW56aXAoUEFTU19TVEFURV9PTkxZKTsgLy9yZXR1cm4gaTsJLyogaW5jb21wbGV0ZSBjb2RlIHNldCAqLworCQl9CisKKwkJLyogcmVhZCBpbiBsaXRlcmFsIGFuZCBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi8KKwkJbiA9IG5sICsgbmQ7CisJCW0gPSBtYXNrX2JpdHNbYmxdOworCQlpID0gbCA9IDA7CisJCXdoaWxlICgodW5zaWduZWQpIGkgPCBuKSB7CisJCQliX2R5bmFtaWMgPSBmaWxsX2JpdGJ1ZmZlcihQQVNTX1NUQVRFIGJfZHluYW1pYywgJmtfZHluYW1pYywgKHVuc2lnbmVkKWJsKTsKKwkJCXRkID0gaW5mbGF0ZV9jb2Rlc190bCArICgodW5zaWduZWQpIGJfZHluYW1pYyAmIG0pOworCQkJaiA9IHRkLT5iOworCQkJYl9keW5hbWljID4+PSBqOworCQkJa19keW5hbWljIC09IGo7CisJCQlqID0gdGQtPnYubjsKKwkJCWlmIChqIDwgMTYpIHsJLyogbGVuZ3RoIG9mIGNvZGUgaW4gYml0cyAoMC4uMTUpICovCisJCQkJbGxbaSsrXSA9IGwgPSBqOwkvKiBzYXZlIGxhc3QgbGVuZ3RoIGluIGwgKi8KKwkJCX0gZWxzZSBpZiAoaiA9PSAxNikgewkvKiByZXBlYXQgbGFzdCBsZW5ndGggMyB0byA2IHRpbWVzICovCisJCQkJYl9keW5hbWljID0gZmlsbF9iaXRidWZmZXIoUEFTU19TVEFURSBiX2R5bmFtaWMsICZrX2R5bmFtaWMsIDIpOworCQkJCWogPSAzICsgKCh1bnNpZ25lZCkgYl9keW5hbWljICYgMyk7CisJCQkJYl9keW5hbWljID4+PSAyOworCQkJCWtfZHluYW1pYyAtPSAyOworCQkJCWlmICgodW5zaWduZWQpIGkgKyBqID4gbikgeworCQkJCQlhYm9ydF91bnppcChQQVNTX1NUQVRFX09OTFkpOyAvL3JldHVybiAxOworCQkJCX0KKwkJCQl3aGlsZSAoai0tKSB7CisJCQkJCWxsW2krK10gPSBsOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoaiA9PSAxNykgewkvKiAzIHRvIDEwIHplcm8gbGVuZ3RoIGNvZGVzICovCisJCQkJYl9keW5hbWljID0gZmlsbF9iaXRidWZmZXIoUEFTU19TVEFURSBiX2R5bmFtaWMsICZrX2R5bmFtaWMsIDMpOworCQkJCWogPSAzICsgKCh1bnNpZ25lZCkgYl9keW5hbWljICYgNyk7CisJCQkJYl9keW5hbWljID4+PSAzOworCQkJCWtfZHluYW1pYyAtPSAzOworCQkJCWlmICgodW5zaWduZWQpIGkgKyBqID4gbikgeworCQkJCQlhYm9ydF91bnppcChQQVNTX1NUQVRFX09OTFkpOyAvL3JldHVybiAxOworCQkJCX0KKwkJCQl3aGlsZSAoai0tKSB7CisJCQkJCWxsW2krK10gPSAwOworCQkJCX0KKwkJCQlsID0gMDsKKwkJCX0gZWxzZSB7CS8qIGogPT0gMTg6IDExIHRvIDEzOCB6ZXJvIGxlbmd0aCBjb2RlcyAqLworCQkJCWJfZHluYW1pYyA9IGZpbGxfYml0YnVmZmVyKFBBU1NfU1RBVEUgYl9keW5hbWljLCAma19keW5hbWljLCA3KTsKKwkJCQlqID0gMTEgKyAoKHVuc2lnbmVkKSBiX2R5bmFtaWMgJiAweDdmKTsKKwkJCQliX2R5bmFtaWMgPj49IDc7CisJCQkJa19keW5hbWljIC09IDc7CisJCQkJaWYgKCh1bnNpZ25lZCkgaSArIGogPiBuKSB7CisJCQkJCWFib3J0X3VuemlwKFBBU1NfU1RBVEVfT05MWSk7IC8vcmV0dXJuIDE7CisJCQkJfQorCQkJCXdoaWxlIChqLS0pIHsKKwkJCQkJbGxbaSsrXSA9IDA7CisJCQkJfQorCQkJCWwgPSAwOworCQkJfQorCQl9CisKKwkJLyogZnJlZSBkZWNvZGluZyB0YWJsZSBmb3IgdHJlZXMgKi8KKwkJaHVmdF9mcmVlKGluZmxhdGVfY29kZXNfdGwpOworCisJCS8qIHJlc3RvcmUgdGhlIGdsb2JhbCBiaXQgYnVmZmVyICovCisJCWd1bnppcF9iYiA9IGJfZHluYW1pYzsKKwkJZ3VuemlwX2JrID0ga19keW5hbWljOworCisJCS8qIGJ1aWxkIHRoZSBkZWNvZGluZyB0YWJsZXMgZm9yIGxpdGVyYWwvbGVuZ3RoIGFuZCBkaXN0YW5jZSBjb2RlcyAqLworCQlibCA9IGxiaXRzOworCisJCWkgPSBodWZ0X2J1aWxkKGxsLCBubCwgMjU3LCBjcGxlbnMsIGNwbGV4dCwgJmluZmxhdGVfY29kZXNfdGwsICZibCk7CisJCWlmIChpICE9IDApCisJCQlhYm9ydF91bnppcChQQVNTX1NUQVRFX09OTFkpOworCQliZCA9IGRiaXRzOworCQlpID0gaHVmdF9idWlsZChsbCArIG5sLCBuZCwgMCwgY3BkaXN0LCBjcGRleHQsICZpbmZsYXRlX2NvZGVzX3RkLCAmYmQpOworCQlpZiAoaSAhPSAwKQorCQkJYWJvcnRfdW56aXAoUEFTU19TVEFURV9PTkxZKTsKKworCQkvKiBzZXQgdXAgZGF0YSBmb3IgaW5mbGF0ZV9jb2RlcygpICovCisJCWluZmxhdGVfY29kZXNfc2V0dXAoUEFTU19TVEFURSBibCwgYmQpOworCisJCS8qIGh1ZnRfZnJlZSBjb2RlIG1vdmVkIGludG8gaW5mbGF0ZV9jb2RlcyAqLworCisJCXJldHVybiAtMjsKKwl9CisJZGVmYXVsdDoKKwkJYWJvcnRfdW56aXAoUEFTU19TVEFURV9PTkxZKTsKKwl9Cit9CisKKy8qIFR3byBjYWxsc2l0ZXMsIGJvdGggaW4gaW5mbGF0ZV9nZXRfbmV4dF93aW5kb3cgKi8KK3N0YXRpYyB2b2lkIGNhbGN1bGF0ZV9ndW56aXBfY3JjKFNUQVRFX1BBUkFNX09OTFkpCit7CisJZ3VuemlwX2NyYyA9IGNyYzMyX2Jsb2NrX2VuZGlhbjAoZ3VuemlwX2NyYywgZ3VuemlwX3dpbmRvdywgZ3VuemlwX291dGJ1Zl9jb3VudCwgZ3VuemlwX2NyY190YWJsZSk7CisJZ3VuemlwX2J5dGVzX291dCArPSBndW56aXBfb3V0YnVmX2NvdW50OworfQorCisvKiBPbmUgY2FsbHNpdGUgaW4gaW5mbGF0ZV91bnppcF9pbnRlcm5hbCAqLworc3RhdGljIGludCBpbmZsYXRlX2dldF9uZXh0X3dpbmRvdyhTVEFURV9QQVJBTV9PTkxZKQoreworCWd1bnppcF9vdXRidWZfY291bnQgPSAwOworCisJd2hpbGUgKDEpIHsKKwkJaW50IHJldDsKKworCQlpZiAobmVlZF9hbm90aGVyX2Jsb2NrKSB7CisJCQlpZiAoZW5kX3JlYWNoZWQpIHsKKwkJCQljYWxjdWxhdGVfZ3VuemlwX2NyYyhQQVNTX1NUQVRFX09OTFkpOworCQkJCWVuZF9yZWFjaGVkID0gMDsKKwkJCQkvKiBOQjogbmVlZF9hbm90aGVyX2Jsb2NrIGlzIHN0aWxsIHNldCAqLworCQkJCXJldHVybiAwOyAvKiBMYXN0IGJsb2NrICovCisJCQl9CisJCQltZXRob2QgPSBpbmZsYXRlX2Jsb2NrKFBBU1NfU1RBVEUgJmVuZF9yZWFjaGVkKTsKKwkJCW5lZWRfYW5vdGhlcl9ibG9jayA9IDA7CisJCX0KKworCQlzd2l0Y2ggKG1ldGhvZCkgeworCQljYXNlIC0xOgorCQkJcmV0ID0gaW5mbGF0ZV9zdG9yZWQoUEFTU19TVEFURV9PTkxZKTsKKwkJCWJyZWFrOworCQljYXNlIC0yOgorCQkJcmV0ID0gaW5mbGF0ZV9jb2RlcyhQQVNTX1NUQVRFX09OTFkpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8qIGNhbm5vdCBoYXBwZW4gKi8KKwkJCWFib3J0X3VuemlwKFBBU1NfU1RBVEVfT05MWSk7CisJCX0KKworCQlpZiAocmV0ID09IDEpIHsKKwkJCWNhbGN1bGF0ZV9ndW56aXBfY3JjKFBBU1NfU1RBVEVfT05MWSk7CisJCQlyZXR1cm4gMTsgLyogbW9yZSBkYXRhIGxlZnQgKi8KKwkJfQorCQluZWVkX2Fub3RoZXJfYmxvY2sgPSAxOyAvKiBlbmQgb2YgdGhhdCBibG9jayAqLworCX0KKwkvKiBEb2VzbnQgZ2V0IGhlcmUgKi8KK30KKworCisvKiBDYWxsZWQgZnJvbSB1bnBhY2tfZ3pfc3RyZWFtKCkgYW5kIGluZmxhdGVfdW56aXAoKSAqLworc3RhdGljIElGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQKK2luZmxhdGVfdW56aXBfaW50ZXJuYWwoU1RBVEVfUEFSQU0gdHJhbnNmb3JtZXJfc3RhdGVfdCAqeHN0YXRlKQoreworCUlGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgbiA9IDA7CisJc3NpemVfdCBud3JvdGU7CisKKwkvKiBBbGxvY2F0ZSBhbGwgZ2xvYmFsIGJ1ZmZlcnMgKGZvciBEWU5fQUxMT0Mgb3B0aW9uKSAqLworCWd1bnppcF93aW5kb3cgPSB4bWFsbG9jKEdVTlpJUF9XU0laRSk7CisJZ3VuemlwX291dGJ1Zl9jb3VudCA9IDA7CisJZ3VuemlwX2J5dGVzX291dCA9IDA7CisJZ3VuemlwX3NyY19mZCA9IHhzdGF0ZS0+c3JjX2ZkOworCisJLyogKHJlKSBpbml0aWFsaXplIHN0YXRlICovCisJbWV0aG9kID0gLTE7CisJbmVlZF9hbm90aGVyX2Jsb2NrID0gMTsKKwlyZXN1bWVfY29weSA9IDA7CisJZ3VuemlwX2JrID0gMDsKKwlndW56aXBfYmIgPSAwOworCisJLyogQ3JlYXRlIHRoZSBjcmMgdGFibGUgKi8KKwlndW56aXBfY3JjX3RhYmxlID0gY3JjMzJfZmlsbHRhYmxlKE5VTEwsIDApOworCWd1bnppcF9jcmMgPSB+MDsKKworCWVycm9yX21zZyA9ICJjb3JydXB0ZWQgZGF0YSI7CisJaWYgKHNldGptcChlcnJvcl9qbXApKSB7CisJCS8qIEVycm9yIGZyb20gZGVlcCBpbnNpZGUgemlwIG1hY2hpbmVyeSAqLworCQluID0gLTE7CisJCWdvdG8gcmV0OworCX0KKworCXdoaWxlICgxKSB7CisJCWludCByID0gaW5mbGF0ZV9nZXRfbmV4dF93aW5kb3coUEFTU19TVEFURV9PTkxZKTsKKwkJbndyb3RlID0gdHJhbnNmb3JtZXJfd3JpdGUoeHN0YXRlLCBndW56aXBfd2luZG93LCBndW56aXBfb3V0YnVmX2NvdW50KTsKKwkJaWYgKG53cm90ZSA9PSAoc3NpemVfdCktMSkgeworCQkJbiA9IC0xOworCQkJZ290byByZXQ7CisJCX0KKwkJSUZfREVTS1RPUChuICs9IG53cm90ZTspCisJCWlmIChyID09IDApIGJyZWFrOworCX0KKworCS8qIFN0b3JlIHVudXNlZCBieXRlcyBpbiBhIGdsb2JhbCBidWZmZXIgc28gY2FsbGluZyBhcHBsZXRzIGNhbiBhY2Nlc3MgaXQgKi8KKwlpZiAoZ3VuemlwX2JrID49IDgpIHsKKwkJLyogVW5kbyB0b28gbXVjaCBsb29rYWhlYWQuIFRoZSBuZXh0IHJlYWQgd2lsbCBiZSBieXRlIGFsaWduZWQKKwkJICogc28gd2UgY2FuIGRpc2NhcmQgdW51c2VkIGJpdHMgaW4gdGhlIGxhc3QgbWVhbmluZ2Z1bCBieXRlLiAqLworCQlieXRlYnVmZmVyX29mZnNldC0tOworCQlieXRlYnVmZmVyW2J5dGVidWZmZXJfb2Zmc2V0XSA9IGd1bnppcF9iYiAmIDB4ZmY7CisJCWd1bnppcF9iYiA+Pj0gODsKKwkJZ3VuemlwX2JrIC09IDg7CisJfQorIHJldDoKKwkvKiBDbGVhbnVwICovCisJZnJlZShndW56aXBfd2luZG93KTsKKwlmcmVlKGd1bnppcF9jcmNfdGFibGUpOworCXJldHVybiBuOworfQorCisKKy8qIEV4dGVybmFsIGVudHJ5IHBvaW50cyAqLworCisvKiBGb3IgdW56aXAgKi8KKworSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMKK2luZmxhdGVfdW56aXAodHJhbnNmb3JtZXJfc3RhdGVfdCAqeHN0YXRlKQoreworCUlGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgbjsKKwlERUNMQVJFX1NUQVRFOworCisJQUxMT0NfU1RBVEU7CisKKwl0b19yZWFkID0geHN0YXRlLT5ieXRlc19pbjsKKy8vCWJ5dGVidWZmZXJfbWF4ID0gMHg4MDAwOworCWJ5dGVidWZmZXJfb2Zmc2V0ID0gNDsKKwlieXRlYnVmZmVyID0geG1hbGxvYyhieXRlYnVmZmVyX21heCk7CisJbiA9IGluZmxhdGVfdW56aXBfaW50ZXJuYWwoUEFTU19TVEFURSB4c3RhdGUpOworCWZyZWUoYnl0ZWJ1ZmZlcik7CisKKwl4c3RhdGUtPmNyYzMyID0gZ3VuemlwX2NyYzsKKwl4c3RhdGUtPmJ5dGVzX291dCA9IGd1bnppcF9ieXRlc19vdXQ7CisJREVBTExPQ19TVEFURTsKKwlyZXR1cm4gbjsKK30KKworCisvKiBGb3IgZ3VuemlwICovCisKKy8qIGhlbHBlcnMgZmlyc3QgKi8KKworLyogVG9wIHVwIHRoZSBpbnB1dCBidWZmZXIgd2l0aCBhdCBsZWFzdCBuIGJ5dGVzLiAqLworc3RhdGljIGludCB0b3BfdXAoU1RBVEVfUEFSQU0gdW5zaWduZWQgbikKK3sKKwlpbnQgY291bnQgPSBieXRlYnVmZmVyX3NpemUgLSBieXRlYnVmZmVyX29mZnNldDsKKworCWlmIChjb3VudCA8IChpbnQpbikgeworCQltZW1tb3ZlKGJ5dGVidWZmZXIsICZieXRlYnVmZmVyW2J5dGVidWZmZXJfb2Zmc2V0XSwgY291bnQpOworCQlieXRlYnVmZmVyX29mZnNldCA9IDA7CisJCWJ5dGVidWZmZXJfc2l6ZSA9IGZ1bGxfcmVhZChndW56aXBfc3JjX2ZkLCAmYnl0ZWJ1ZmZlcltjb3VudF0sIGJ5dGVidWZmZXJfbWF4IC0gY291bnQpOworCQlpZiAoKGludClieXRlYnVmZmVyX3NpemUgPCAwKSB7CisJCQliYl9lcnJvcl9tc2coYmJfbXNnX3JlYWRfZXJyb3IpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYnl0ZWJ1ZmZlcl9zaXplICs9IGNvdW50OworCQlpZiAoYnl0ZWJ1ZmZlcl9zaXplIDwgbikKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHVpbnQxNl90IGJ1ZmZlcl9yZWFkX2xlX3UxNihTVEFURV9QQVJBTV9PTkxZKQoreworCXVpbnQxNl90IHJlczsKKyNpZiBCQl9MSVRUTEVfRU5ESUFOCisJbW92ZV9mcm9tX3VuYWxpZ25lZDE2KHJlcywgJmJ5dGVidWZmZXJbYnl0ZWJ1ZmZlcl9vZmZzZXRdKTsKKyNlbHNlCisJcmVzID0gYnl0ZWJ1ZmZlcltieXRlYnVmZmVyX29mZnNldF07CisJcmVzIHw9IGJ5dGVidWZmZXJbYnl0ZWJ1ZmZlcl9vZmZzZXQgKyAxXSA8PCA4OworI2VuZGlmCisJYnl0ZWJ1ZmZlcl9vZmZzZXQgKz0gMjsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdWludDMyX3QgYnVmZmVyX3JlYWRfbGVfdTMyKFNUQVRFX1BBUkFNX09OTFkpCit7CisJdWludDMyX3QgcmVzOworI2lmIEJCX0xJVFRMRV9FTkRJQU4KKwltb3ZlX2Zyb21fdW5hbGlnbmVkMzIocmVzLCAmYnl0ZWJ1ZmZlcltieXRlYnVmZmVyX29mZnNldF0pOworI2Vsc2UKKwlyZXMgPSBieXRlYnVmZmVyW2J5dGVidWZmZXJfb2Zmc2V0XTsKKwlyZXMgfD0gYnl0ZWJ1ZmZlcltieXRlYnVmZmVyX29mZnNldCArIDFdIDw8IDg7CisJcmVzIHw9IGJ5dGVidWZmZXJbYnl0ZWJ1ZmZlcl9vZmZzZXQgKyAyXSA8PCAxNjsKKwlyZXMgfD0gYnl0ZWJ1ZmZlcltieXRlYnVmZmVyX29mZnNldCArIDNdIDw8IDI0OworI2VuZGlmCisJYnl0ZWJ1ZmZlcl9vZmZzZXQgKz0gNDsKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgaW50IGNoZWNrX2hlYWRlcl9nemlwKFNUQVRFX1BBUkFNIHRyYW5zZm9ybWVyX3N0YXRlX3QgKnhzdGF0ZSkKK3sKKwl1bmlvbiB7CisJCXVuc2lnbmVkIGNoYXIgcmF3WzhdOworCQlzdHJ1Y3QgeworCQkJdWludDhfdCBnel9tZXRob2Q7CisJCQl1aW50OF90IGZsYWdzOworCQkJdWludDMyX3QgbXRpbWU7CisJCQl1aW50OF90IHh0cmFfZmxhZ3NfVU5VU0VEOworCQkJdWludDhfdCBvc19mbGFnc19VTlVTRUQ7CisJCX0gUEFDS0VEIGZvcm1hdHRlZDsKKwl9IGhlYWRlcjsKKwlzdHJ1Y3QgQlVHX2hlYWRlciB7CisJCWNoYXIgQlVHX2hlYWRlcltzaXplb2YoaGVhZGVyKSA9PSA4ID8gMSA6IC0xXTsKKwl9OworCisJLyoKKwkgKiBSZXdpbmQgYnl0ZWJ1ZmZlci4gV2UgdXNlIHRoZSBiZWdpbm5pbmcgYmVjYXVzZSB0aGUgaGVhZGVyIGhhcyA4CisJICogYnl0ZXMsIGxlYXZpbmcgZW5vdWdoIGZvciB1bndpbmRpbmcgYWZ0ZXJ3YXJkcy4KKwkgKi8KKwlieXRlYnVmZmVyX3NpemUgLT0gYnl0ZWJ1ZmZlcl9vZmZzZXQ7CisJbWVtbW92ZShieXRlYnVmZmVyLCAmYnl0ZWJ1ZmZlcltieXRlYnVmZmVyX29mZnNldF0sIGJ5dGVidWZmZXJfc2l6ZSk7CisJYnl0ZWJ1ZmZlcl9vZmZzZXQgPSAwOworCisJaWYgKCF0b3BfdXAoUEFTU19TVEFURSA4KSkKKwkJcmV0dXJuIDA7CisJbWVtY3B5KGhlYWRlci5yYXcsICZieXRlYnVmZmVyW2J5dGVidWZmZXJfb2Zmc2V0XSwgOCk7CisJYnl0ZWJ1ZmZlcl9vZmZzZXQgKz0gODsKKworCS8qIENoZWNrIHRoZSBjb21wcmVzc2lvbiBtZXRob2QgKi8KKwlpZiAoaGVhZGVyLmZvcm1hdHRlZC5nel9tZXRob2QgIT0gOCkgeworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoaGVhZGVyLmZvcm1hdHRlZC5mbGFncyAmIDB4MDQpIHsKKwkJLyogYml0IDIgc2V0OiBleHRyYSBmaWVsZCBwcmVzZW50ICovCisJCXVuc2lnbmVkIGV4dHJhX3Nob3J0OworCisJCWlmICghdG9wX3VwKFBBU1NfU1RBVEUgMikpCisJCQlyZXR1cm4gMDsKKwkJZXh0cmFfc2hvcnQgPSBidWZmZXJfcmVhZF9sZV91MTYoUEFTU19TVEFURV9PTkxZKTsKKwkJaWYgKCF0b3BfdXAoUEFTU19TVEFURSBleHRyYV9zaG9ydCkpCisJCQlyZXR1cm4gMDsKKwkJLyogSWdub3JlIGV4dHJhIGZpZWxkICovCisJCWJ5dGVidWZmZXJfb2Zmc2V0ICs9IGV4dHJhX3Nob3J0OworCX0KKworCS8qIERpc2NhcmQgb3JpZ2luYWwgbmFtZSBhbmQgZmlsZSBjb21tZW50IGlmIGFueSAqLworCS8qIGJpdCAzIHNldDogb3JpZ2luYWwgZmlsZSBuYW1lIHByZXNlbnQgKi8KKwkvKiBiaXQgNCBzZXQ6IGZpbGUgY29tbWVudCBwcmVzZW50ICovCisJaWYgKGhlYWRlci5mb3JtYXR0ZWQuZmxhZ3MgJiAweDE4KSB7CisJCXdoaWxlICgxKSB7CisJCQlkbyB7CisJCQkJaWYgKCF0b3BfdXAoUEFTU19TVEFURSAxKSkKKwkJCQkJcmV0dXJuIDA7CisJCQl9IHdoaWxlIChieXRlYnVmZmVyW2J5dGVidWZmZXJfb2Zmc2V0KytdICE9IDApOworCQkJaWYgKChoZWFkZXIuZm9ybWF0dGVkLmZsYWdzICYgMHgxOCkgIT0gMHgxOCkKKwkJCQlicmVhazsKKwkJCWhlYWRlci5mb3JtYXR0ZWQuZmxhZ3MgJj0gfjB4MTg7CisJCX0KKwl9CisKKwl4c3RhdGUtPm10aW1lID0gU1dBUF9MRTMyKGhlYWRlci5mb3JtYXR0ZWQubXRpbWUpOworCisJLyogUmVhZCB0aGUgaGVhZGVyIGNoZWNrc3VtICovCisJaWYgKGhlYWRlci5mb3JtYXR0ZWQuZmxhZ3MgJiAweDAyKSB7CisJCWlmICghdG9wX3VwKFBBU1NfU1RBVEUgMikpCisJCQlyZXR1cm4gMDsKKwkJYnl0ZWJ1ZmZlcl9vZmZzZXQgKz0gMjsKKwl9CisJcmV0dXJuIDE7Cit9CisKK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgRkFTVF9GVU5DCit1bnBhY2tfZ3pfc3RyZWFtKHRyYW5zZm9ybWVyX3N0YXRlX3QgKnhzdGF0ZSkKK3sKKwl1aW50MzJfdCB2MzI7CisJSUZfREVTS1RPUChsb25nIGxvbmcpIGludCB0b3RhbCwgbjsKKwlERUNMQVJFX1NUQVRFOworCisjaWYgIUVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX1oKKwlpZiAoY2hlY2tfc2lnbmF0dXJlMTYoeHN0YXRlLCBHWklQX01BR0lDKSkKKwkJcmV0dXJuIC0xOworI2Vsc2UKKwlpZiAoeHN0YXRlLT5jaGVja19zaWduYXR1cmUpIHsKKwkJdWludDE2X3QgbWFnaWMyOworCisJCWlmIChmdWxsX3JlYWQoeHN0YXRlLT5zcmNfZmQsICZtYWdpYzIsIDIpICE9IDIpIHsKKyBiYWRfbWFnaWM6CisJCQliYl9lcnJvcl9tc2coImludmFsaWQgbWFnaWMiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAobWFnaWMyID09IENPTVBSRVNTX01BR0lDKSB7CisJCQl4c3RhdGUtPmNoZWNrX3NpZ25hdHVyZSA9IDA7CisJCQlyZXR1cm4gdW5wYWNrX1pfc3RyZWFtKHhzdGF0ZSk7CisJCX0KKwkJaWYgKG1hZ2ljMiAhPSBHWklQX01BR0lDKQorCQkJZ290byBiYWRfbWFnaWM7CisJfQorI2VuZGlmCisKKwl0b3RhbCA9IDA7CisKKwlBTExPQ19TVEFURTsKKwl0b19yZWFkID0gLTE7CisvLwlieXRlYnVmZmVyX21heCA9IDB4ODAwMDsKKwlieXRlYnVmZmVyID0geG1hbGxvYyhieXRlYnVmZmVyX21heCk7CisJZ3VuemlwX3NyY19mZCA9IHhzdGF0ZS0+c3JjX2ZkOworCisgYWdhaW46CisJaWYgKCFjaGVja19oZWFkZXJfZ3ppcChQQVNTX1NUQVRFIHhzdGF0ZSkpIHsKKwkJYmJfZXJyb3JfbXNnKCJjb3JydXB0ZWQgZGF0YSIpOworCQl0b3RhbCA9IC0xOworCQlnb3RvIHJldDsKKwl9CisKKwluID0gaW5mbGF0ZV91bnppcF9pbnRlcm5hbChQQVNTX1NUQVRFIHhzdGF0ZSk7CisJaWYgKG4gPCAwKSB7CisJCXRvdGFsID0gLTE7CisJCWdvdG8gcmV0OworCX0KKwl0b3RhbCArPSBuOworCisJaWYgKCF0b3BfdXAoUEFTU19TVEFURSA4KSkgeworCQliYl9lcnJvcl9tc2coImNvcnJ1cHRlZCBkYXRhIik7CisJCXRvdGFsID0gLTE7CisJCWdvdG8gcmV0OworCX0KKworCS8qIFZhbGlkYXRlIGRlY29tcHJlc3Npb24gLSBjcmMgKi8KKwl2MzIgPSBidWZmZXJfcmVhZF9sZV91MzIoUEFTU19TVEFURV9PTkxZKTsKKwlpZiAoKH5ndW56aXBfY3JjKSAhPSB2MzIpIHsKKwkJYmJfZXJyb3JfbXNnKCJjcmMgZXJyb3IiKTsKKwkJdG90YWwgPSAtMTsKKwkJZ290byByZXQ7CisJfQorCisJLyogVmFsaWRhdGUgZGVjb21wcmVzc2lvbiAtIHNpemUgKi8KKwl2MzIgPSBidWZmZXJfcmVhZF9sZV91MzIoUEFTU19TVEFURV9PTkxZKTsKKwlpZiAoKHVpbnQzMl90KWd1bnppcF9ieXRlc19vdXQgIT0gdjMyKSB7CisJCWJiX2Vycm9yX21zZygiaW5jb3JyZWN0IGxlbmd0aCIpOworCQl0b3RhbCA9IC0xOworCX0KKworCWlmICghdG9wX3VwKFBBU1NfU1RBVEUgMikpCisJCWdvdG8gcmV0OyAvKiBFT0YgKi8KKworCWlmIChieXRlYnVmZmVyW2J5dGVidWZmZXJfb2Zmc2V0XSA9PSAweDFmCisJICYmIGJ5dGVidWZmZXJbYnl0ZWJ1ZmZlcl9vZmZzZXQgKyAxXSA9PSAweDhiCisJKSB7CisJCWJ5dGVidWZmZXJfb2Zmc2V0ICs9IDI7CisJCWdvdG8gYWdhaW47CisJfQorCS8qIEdOVSBnemlwIHNheXM6ICovCisJLypiYl9lcnJvcl9tc2coImRlY29tcHJlc3Npb24gT0ssIHRyYWlsaW5nIGdhcmJhZ2UgaWdub3JlZCIpOyovCisKKyByZXQ6CisJZnJlZShieXRlYnVmZmVyKTsKKwlERUFMTE9DX1NUQVRFOworCXJldHVybiB0b3RhbDsKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGVjb21wcmVzc191bmNvbXByZXNzLmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2RlY29tcHJlc3NfdW5jb21wcmVzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNGVkNTAKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2RlY29tcHJlc3NfdW5jb21wcmVzcy5jCkBAIC0wLDAgKzEsMzE0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIHVuY29tcHJlc3MgZm9yIGJ1c3lib3ggLS0gKGMpIDIwMDIgUm9iZXJ0IEdyaWVibAorICoKKyAqIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCBjb21wcmVzczQyLmMgc291cmNlCisgKiAoc2VlIGRpc2NsYWltZXIgYmVsb3cpCisgKi8KKworLyogKE4pY29tcHJlc3M0Mi5jIC0gRmlsZSBjb21wcmVzc2lvbiBhbGEgSUVFRSBDb21wdXRlciwgTWFyIDE5OTIuCisgKgorICogQXV0aG9yczoKKyAqICAgU3BlbmNlciBXLiBUaG9tYXMgICAoZGVjdmF4IWhhcnBvIXV0YWgtY3MhdXRhaC1nciF0aG9tYXMpCisgKiAgIEppbSBNY0tpZSAgICAgICAgICAgKGRlY3ZheCFtY3ZheCFqaW0pCisgKiAgIFN0ZXZlIERhdmllcyAgICAgICAgKGRlY3ZheCF2YXgxMzUhcGV0c2QhcGVvcmEhc3JkKQorICogICBLZW4gVHVya293c2tpICAgICAgIChkZWN2YXghZGVjd3JsIXR1cnRsZXZheCFrZW4pCisgKiAgIEphbWVzIEEuIFdvb2RzICAgICAgKGRlY3ZheCFpaG5wNCFhbWVzIWphdykKKyAqICAgSm9lIE9yb3N0ICAgICAgICAgICAoZGVjdmF4IXZheDEzNSFwZXRzZCFqb2UpCisgKiAgIERhdmUgTWFjayAgICAgICAgICAgKGNzdUBhbGVtYmljLmFjcy5jb20pCisgKiAgIFBldGVyIEphbm5lc2VuLCBOZXR3b3JrIENvbW11bmljYXRpb24gU3lzdGVtcworICogICAgICAgICAgICAgICAgICAgICAgIChwZXRlckBuY3MubmwpCisgKgorICogbWFyY0BzdXNlLmRlIDogYSBzbWFsbCBzZWN1cml0eSBmaXggZm9yIGEgYnVmZmVyIG92ZXJmbG93CisgKgorICogWy4uLiBIaXN0b3J5IHNuaXBwZWQgLi4uXQorICoKKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJiYl9hcmNoaXZlLmgiCisKKworLyogRGVmYXVsdCBpbnB1dCBidWZmZXIgc2l6ZSAqLworI2RlZmluZSBJQlVGU0laIDIwNDgKKworLyogRGVmYXVsdCBvdXRwdXQgYnVmZmVyIHNpemUgKi8KKyNkZWZpbmUgT0JVRlNJWiAyMDQ4CisKKy8qIERlZmluZXMgZm9yIHRoaXJkIGJ5dGUgb2YgaGVhZGVyICovCisjZGVmaW5lIEJJVF9NQVNLICAgICAgICAweDFmICAgIC8qIE1hc2sgZm9yICdudW1iZXIgb2YgY29tcHJlc3NzaW9uIGJpdHMnICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hc2tzIDB4MjAgYW5kIDB4NDAgYXJlIGZyZWUuICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEkgdGhpbmsgMHgyMCBzaG91bGQgbWVhbiB0aGF0IHRoZXJlIGlzICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEgZm91cnRoIGhlYWRlciBieXRlIChmb3IgZXhwYW5zaW9uKS4gICAgICAgICovCisjZGVmaW5lIEJMT0NLX01PREUgICAgICAweDgwICAgIC8qIEJsb2NrIGNvbXByZXNzaW9uIGlmIHRhYmxlIGlzIGZ1bGwgYW5kICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbXByZXNzaW9uIHJhdGUgaXMgZHJvcHBpbmcgZmx1c2ggdGFibGVzICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRoZSBuZXh0IHR3byBjb2RlcyBzaG91bGQgbm90IGJlIGNoYW5nZWQgbGlnaHRseSwgYXMgdGhleSBtdXN0IG5vdCAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpZSB3aXRoaW4gdGhlIGNvbnRpZ3VvdXMgZ2VuZXJhbCBjb2RlIHNwYWNlLiAgICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIEZJUlNUICAgMjU3ICAgICAvKiBmaXJzdCBmcmVlIGVudHJ5ICovCisjZGVmaW5lIENMRUFSICAgMjU2ICAgICAvKiB0YWJsZSBjbGVhciBvdXRwdXQgY29kZSAqLworCisjZGVmaW5lIElOSVRfQklUUyA5ICAgICAvKiBpbml0aWFsIG51bWJlciBvZiBiaXRzL2NvZGUgKi8KKworCisvKiBtYWNoaW5lIHZhcmlhbnRzIHdoaWNoIHJlcXVpcmUgY2MgLURtYWNoaW5lOiAgcGRwMTEsIHo4MDAwLCBET1MgKi8KKyNkZWZpbmUgSEJJVFMgICAgICAxNyAgIC8qIDUwJSBvY2N1cGFuY3kgKi8KKyNkZWZpbmUgSFNJWkUgICAgICAoMTw8SEJJVFMpCisjZGVmaW5lIEhNQVNLICAgICAgKEhTSVpFLTEpICAgIC8qIHVudXNlZCAqLworI2RlZmluZSBIUFJJTUUgICAgIDk5NDEgICAgICAgICAvKiB1bnVzZWQgKi8KKyNkZWZpbmUgQklUUyAgICAgICAxNgorI2RlZmluZSBCSVRTX1NUUiAgICIxNiIKKyN1bmRlZiAgTUFYU0VHXzY0SyAgICAgICAgICAgICAgLyogdW51c2VkICovCisjZGVmaW5lIE1BWENPREUobikgKDFMIDw8IChuKSkKKworI2RlZmluZSBodGFib2YoaSkgICAgICAgICAgICAgICBodGFiW2ldCisjZGVmaW5lIGNvZGV0YWJvZihpKSAgICAgICAgICAgIGNvZGV0YWJbaV0KKyNkZWZpbmUgdGFiX3ByZWZpeG9mKGkpICAgICAgICAgY29kZXRhYm9mKGkpCisjZGVmaW5lIHRhYl9zdWZmaXhvZihpKSAgICAgICAgICgodW5zaWduZWQgY2hhciAqKShodGFiKSlbaV0KKyNkZWZpbmUgZGVfc3RhY2sgICAgICAgICAgICAgICAgKCh1bnNpZ25lZCBjaGFyICopJihodGFiW0hTSVpFLTFdKSkKKyNkZWZpbmUgY2xlYXJfdGFiX3ByZWZpeG9mKCkgICAgbWVtc2V0KGNvZGV0YWIsIDAsIDI1NikKKworLyoKKyAqIERlY29tcHJlc3Mgc3RkaW4gdG8gc3Rkb3V0LiAgVGhpcyByb3V0aW5lIGFkYXB0cyB0byB0aGUgY29kZXMgaW4gdGhlCisgKiBmaWxlIGJ1aWxkaW5nIHRoZSAic3RyaW5nIiB0YWJsZSBvbi10aGUtZmx5OyByZXF1aXJpbmcgbm8gdGFibGUgdG8KKyAqIGJlIHN0b3JlZCBpbiB0aGUgY29tcHJlc3NlZCBmaWxlLgorICovCisKK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgRkFTVF9GVU5DCit1bnBhY2tfWl9zdHJlYW0odHJhbnNmb3JtZXJfc3RhdGVfdCAqeHN0YXRlKQoreworCUlGX0RFU0tUT1AobG9uZyBsb25nIHRvdGFsX3dyaXR0ZW4gPSAwOykKKwlJRl9ERVNLVE9QKGxvbmcgbG9uZykgaW50IHJldHZhbCA9IC0xOworCXVuc2lnbmVkIGNoYXIgKnN0YWNrcDsKKwlpbnQgZmluY2hhcjsKKwlsb25nIG9sZGNvZGU7CisJbG9uZyBpbmNvZGU7CisJaW50IGluYml0czsKKwlpbnQgcG9zYml0czsKKwlpbnQgb3V0cG9zOworCWludCBpbnNpemU7CisJaW50IGJpdG1hc2s7CisJbG9uZyBmcmVlX2VudDsKKwlsb25nIG1heGNvZGU7CisJbG9uZyBtYXhtYXhjb2RlOworCWludCBuX2JpdHM7CisJaW50IHJzaXplID0gMDsKKwl1bnNpZ25lZCBjaGFyICppbmJ1ZjsgLyogd2VyZSBlYXRpbmcgaW5zYW5lIGFtb3VudHMgb2Ygc3RhY2sgLSAqLworCXVuc2lnbmVkIGNoYXIgKm91dGJ1ZjsgLyogYmFkIGZvciBzb21lIGVtYmVkZGVkIHRhcmdldHMgKi8KKwl1bnNpZ25lZCBjaGFyICpodGFiOworCXVuc2lnbmVkIHNob3J0ICpjb2RldGFiOworCisJLyogSG1tLCB0aGVzZSB3ZXJlIHN0YXRpY3MgLSB3aHk/ISAqLworCS8qIHVzZXIgc2V0dGFibGUgbWF4ICMgYml0cy9jb2RlICovCisJaW50IG1heGJpdHM7IC8qID0gQklUUzsgKi8KKwkvKiBibG9jayBjb21wcmVzcyBtb2RlIC1DIGNvbXBhdGlibGUgd2l0aCAyLjAgKi8KKwlpbnQgYmxvY2tfbW9kZTsgLyogPSBCTE9DS19NT0RFOyAqLworCisJaWYgKGNoZWNrX3NpZ25hdHVyZTE2KHhzdGF0ZSwgQ09NUFJFU1NfTUFHSUMpKQorCQlyZXR1cm4gLTE7CisKKwlpbmJ1ZiA9IHh6YWxsb2MoSUJVRlNJWiArIDY0KTsKKwlvdXRidWYgPSB4emFsbG9jKE9CVUZTSVogKyAyMDQ4KTsKKwlodGFiID0geHphbGxvYyhIU0laRSk7ICAvKiB3YXNuJ3QgemVyb2VkIG91dCBiZWZvcmUsIG1heWJlIGNhbiB4bWFsbG9jPyAqLworCWNvZGV0YWIgPSB4emFsbG9jKEhTSVpFICogc2l6ZW9mKGNvZGV0YWJbMF0pKTsKKworCWluc2l6ZSA9IDA7CisKKwkvKiB4cmVhZCBpc24ndCBnb29kIGhlcmUsIHdlIGhhdmUgdG8gcmV0dXJuIC0gY2FsbGVyIG1heSB3YW50CisJICogdG8gZG8gc29tZSBjbGVhbnVwIChlLmcuIGRlbGV0ZSBpbmNvbXBsZXRlIHVucGFja2VkIGZpbGUgZXRjKSAqLworCWlmIChmdWxsX3JlYWQoeHN0YXRlLT5zcmNfZmQsIGluYnVmLCAxKSAhPSAxKSB7CisJCWJiX2Vycm9yX21zZygic2hvcnQgcmVhZCIpOworCQlnb3RvIGVycjsKKwl9CisKKwltYXhiaXRzID0gaW5idWZbMF0gJiBCSVRfTUFTSzsKKwlibG9ja19tb2RlID0gaW5idWZbMF0gJiBCTE9DS19NT0RFOworCW1heG1heGNvZGUgPSBNQVhDT0RFKG1heGJpdHMpOworCisJaWYgKG1heGJpdHMgPiBCSVRTKSB7CisJCWJiX2Vycm9yX21zZygiY29tcHJlc3NlZCB3aXRoICVkIGJpdHMsIGNhbiBvbmx5IGhhbmRsZSAiCisJCQkJQklUU19TVFIiIGJpdHMiLCBtYXhiaXRzKTsKKwkJZ290byBlcnI7CisJfQorCisJbl9iaXRzID0gSU5JVF9CSVRTOworCW1heGNvZGUgPSBNQVhDT0RFKElOSVRfQklUUykgLSAxOworCWJpdG1hc2sgPSAoMSA8PCBJTklUX0JJVFMpIC0gMTsKKwlvbGRjb2RlID0gLTE7CisJZmluY2hhciA9IDA7CisJb3V0cG9zID0gMDsKKwlwb3NiaXRzID0gMCA8PCAzOworCisJZnJlZV9lbnQgPSAoKGJsb2NrX21vZGUpID8gRklSU1QgOiAyNTYpOworCisJLyogQXMgYWJvdmUsIGluaXRpYWxpemUgdGhlIGZpcnN0IDI1NiBlbnRyaWVzIGluIHRoZSB0YWJsZS4gKi8KKwkvKmNsZWFyX3RhYl9wcmVmaXhvZigpOyAtIGRvbmUgYnkgeHphbGxvYyAqLworCisJeworCQlpbnQgaTsKKwkJZm9yIChpID0gMjU1OyBpID49IDA7IC0taSkKKwkJCXRhYl9zdWZmaXhvZihpKSA9ICh1bnNpZ25lZCBjaGFyKSBpOworCX0KKworCWRvIHsKKyByZXNldGJ1ZjoKKwkJeworCQkJaW50IGk7CisJCQlpbnQgZTsKKwkJCWludCBvOworCisJCQlvID0gcG9zYml0cyA+PiAzOworCQkJZSA9IGluc2l6ZSAtIG87CisKKwkJCWZvciAoaSA9IDA7IGkgPCBlOyArK2kpCisJCQkJaW5idWZbaV0gPSBpbmJ1ZltpICsgb107CisKKwkJCWluc2l6ZSA9IGU7CisJCQlwb3NiaXRzID0gMDsKKwkJfQorCisJCWlmIChpbnNpemUgPCAoaW50KSAoSUJVRlNJWiArIDY0KSAtIElCVUZTSVopIHsKKwkJCXJzaXplID0gc2FmZV9yZWFkKHhzdGF0ZS0+c3JjX2ZkLCBpbmJ1ZiArIGluc2l6ZSwgSUJVRlNJWik7CisJCQlpZiAocnNpemUgPCAwKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZWFkX2Vycm9yKTsKKwkJCWluc2l6ZSArPSByc2l6ZTsKKwkJfQorCisJCWluYml0cyA9ICgocnNpemUgPiAwKSA/IChpbnNpemUgLSBpbnNpemUgJSBuX2JpdHMpIDw8IDMgOgorCQkJCSAgKGluc2l6ZSA8PCAzKSAtIChuX2JpdHMgLSAxKSk7CisKKwkJd2hpbGUgKGluYml0cyA+IHBvc2JpdHMpIHsKKwkJCWxvbmcgY29kZTsKKworCQkJaWYgKGZyZWVfZW50ID4gbWF4Y29kZSkgeworCQkJCXBvc2JpdHMgPQorCQkJCQkoKHBvc2JpdHMgLSAxKSArCisJCQkJCSAoKG5fYml0cyA8PCAzKSAtCisJCQkJCSAgKHBvc2JpdHMgLSAxICsgKG5fYml0cyA8PCAzKSkgJSAobl9iaXRzIDw8IDMpKSk7CisJCQkJKytuX2JpdHM7CisJCQkJaWYgKG5fYml0cyA9PSBtYXhiaXRzKSB7CisJCQkJCW1heGNvZGUgPSBtYXhtYXhjb2RlOworCQkJCX0gZWxzZSB7CisJCQkJCW1heGNvZGUgPSBNQVhDT0RFKG5fYml0cykgLSAxOworCQkJCX0KKwkJCQliaXRtYXNrID0gKDEgPDwgbl9iaXRzKSAtIDE7CisJCQkJZ290byByZXNldGJ1ZjsKKwkJCX0KKwkJCXsKKwkJCQl1bnNpZ25lZCBjaGFyICpwID0gJmluYnVmW3Bvc2JpdHMgPj4gM107CisJCQkJY29kZSA9ICgocFswXQorCQkJCQl8ICgobG9uZykgKHBbMV0pIDw8IDgpCisJCQkJCXwgKChsb25nKSAocFsyXSkgPDwgMTYpKSA+PiAocG9zYml0cyAmIDB4NykpICYgYml0bWFzazsKKwkJCX0KKwkJCXBvc2JpdHMgKz0gbl9iaXRzOworCisJCQlpZiAob2xkY29kZSA9PSAtMSkgeworCQkJCWlmIChjb2RlID49IDI1NikKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNvcnJ1cHRlZCBkYXRhIik7IC8qICVsZCIsIGNvZGUpOyAqLworCQkJCW9sZGNvZGUgPSBjb2RlOworCQkJCWZpbmNoYXIgPSAoaW50KSBvbGRjb2RlOworCQkJCW91dGJ1ZltvdXRwb3MrK10gPSAodW5zaWduZWQgY2hhcikgZmluY2hhcjsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKGNvZGUgPT0gQ0xFQVIgJiYgYmxvY2tfbW9kZSkgeworCQkJCWNsZWFyX3RhYl9wcmVmaXhvZigpOworCQkJCWZyZWVfZW50ID0gRklSU1QgLSAxOworCQkJCXBvc2JpdHMgPQorCQkJCQkoKHBvc2JpdHMgLSAxKSArCisJCQkJCSAoKG5fYml0cyA8PCAzKSAtCisJCQkJCSAgKHBvc2JpdHMgLSAxICsgKG5fYml0cyA8PCAzKSkgJSAobl9iaXRzIDw8IDMpKSk7CisJCQkJbl9iaXRzID0gSU5JVF9CSVRTOworCQkJCW1heGNvZGUgPSBNQVhDT0RFKElOSVRfQklUUykgLSAxOworCQkJCWJpdG1hc2sgPSAoMSA8PCBJTklUX0JJVFMpIC0gMTsKKwkJCQlnb3RvIHJlc2V0YnVmOworCQkJfQorCisJCQlpbmNvZGUgPSBjb2RlOworCQkJc3RhY2twID0gZGVfc3RhY2s7CisKKwkJCS8qIFNwZWNpYWwgY2FzZSBmb3IgS3dLd0sgc3RyaW5nLiAqLworCQkJaWYgKGNvZGUgPj0gZnJlZV9lbnQpIHsKKwkJCQlpZiAoY29kZSA+IGZyZWVfZW50KSB7CisvKgorCQkJCQl1bnNpZ25lZCBjaGFyICpwOworCisJCQkJCXBvc2JpdHMgLT0gbl9iaXRzOworCQkJCQlwID0gJmluYnVmW3Bvc2JpdHMgPj4gM107CisJCQkJCWJiX2Vycm9yX21zZworCQkJCQkJKCJpbnNpemU6JWQgcG9zYml0czolZCBpbmJ1ZjolMDJYICUwMlggJTAyWCAlMDJYICUwMlggKCVkKSIsCisJCQkJCQlpbnNpemUsIHBvc2JpdHMsIHBbLTFdLCBwWzBdLCBwWzFdLCBwWzJdLCBwWzNdLAorCQkJCQkJKHBvc2JpdHMgJiAwNykpOworKi8KKwkJCQkJYmJfZXJyb3JfbXNnKCJjb3JydXB0ZWQgZGF0YSIpOworCQkJCQlnb3RvIGVycjsKKwkJCQl9CisKKwkJCQkqLS1zdGFja3AgPSAodW5zaWduZWQgY2hhcikgZmluY2hhcjsKKwkJCQljb2RlID0gb2xkY29kZTsKKwkJCX0KKworCQkJLyogR2VuZXJhdGUgb3V0cHV0IGNoYXJhY3RlcnMgaW4gcmV2ZXJzZSBvcmRlciAqLworCQkJd2hpbGUgKGNvZGUgPj0gMjU2KSB7CisJCQkJaWYgKHN0YWNrcCA8PSAmaHRhYm9mKDApKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY29ycnVwdGVkIGRhdGEiKTsKKwkJCQkqLS1zdGFja3AgPSB0YWJfc3VmZml4b2YoY29kZSk7CisJCQkJY29kZSA9IHRhYl9wcmVmaXhvZihjb2RlKTsKKwkJCX0KKworCQkJZmluY2hhciA9IHRhYl9zdWZmaXhvZihjb2RlKTsKKwkJCSotLXN0YWNrcCA9ICh1bnNpZ25lZCBjaGFyKSBmaW5jaGFyOworCisJCQkvKiBBbmQgcHV0IHRoZW0gb3V0IGluIGZvcndhcmQgb3JkZXIgKi8KKwkJCXsKKwkJCQlpbnQgaTsKKworCQkJCWkgPSBkZV9zdGFjayAtIHN0YWNrcDsKKwkJCQlpZiAob3V0cG9zICsgaSA+PSBPQlVGU0laKSB7CisJCQkJCWRvIHsKKwkJCQkJCWlmIChpID4gT0JVRlNJWiAtIG91dHBvcykgeworCQkJCQkJCWkgPSBPQlVGU0laIC0gb3V0cG9zOworCQkJCQkJfQorCisJCQkJCQlpZiAoaSA+IDApIHsKKwkJCQkJCQltZW1jcHkob3V0YnVmICsgb3V0cG9zLCBzdGFja3AsIGkpOworCQkJCQkJCW91dHBvcyArPSBpOworCQkJCQkJfQorCisJCQkJCQlpZiAob3V0cG9zID49IE9CVUZTSVopIHsKKwkJCQkJCQl4dHJhbnNmb3JtZXJfd3JpdGUoeHN0YXRlLCBvdXRidWYsIG91dHBvcyk7CisJCQkJCQkJSUZfREVTS1RPUCh0b3RhbF93cml0dGVuICs9IG91dHBvczspCisJCQkJCQkJb3V0cG9zID0gMDsKKwkJCQkJCX0KKwkJCQkJCXN0YWNrcCArPSBpOworCQkJCQkJaSA9IGRlX3N0YWNrIC0gc3RhY2twOworCQkJCQl9IHdoaWxlIChpID4gMCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJbWVtY3B5KG91dGJ1ZiArIG91dHBvcywgc3RhY2twLCBpKTsKKwkJCQkJb3V0cG9zICs9IGk7CisJCQkJfQorCQkJfQorCisJCQkvKiBHZW5lcmF0ZSB0aGUgbmV3IGVudHJ5LiAqLworCQkJaWYgKGZyZWVfZW50IDwgbWF4bWF4Y29kZSkgeworCQkJCXRhYl9wcmVmaXhvZihmcmVlX2VudCkgPSAodW5zaWduZWQgc2hvcnQpIG9sZGNvZGU7CisJCQkJdGFiX3N1ZmZpeG9mKGZyZWVfZW50KSA9ICh1bnNpZ25lZCBjaGFyKSBmaW5jaGFyOworCQkJCWZyZWVfZW50Kys7CisJCQl9CisKKwkJCS8qIFJlbWVtYmVyIHByZXZpb3VzIGNvZGUuICAqLworCQkJb2xkY29kZSA9IGluY29kZTsKKwkJfQorCX0gd2hpbGUgKHJzaXplID4gMCk7CisKKwlpZiAob3V0cG9zID4gMCkgeworCQl4dHJhbnNmb3JtZXJfd3JpdGUoeHN0YXRlLCBvdXRidWYsIG91dHBvcyk7CisJCUlGX0RFU0tUT1AodG90YWxfd3JpdHRlbiArPSBvdXRwb3M7KQorCX0KKworCXJldHZhbCA9IElGX0RFU0tUT1AodG90YWxfd3JpdHRlbikgKyAwOworIGVycjoKKwlmcmVlKGluYnVmKTsKKwlmcmVlKG91dGJ1Zik7CisJZnJlZShodGFiKTsKKwlmcmVlKGNvZGV0YWIpOworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2RlY29tcHJlc3NfdW5sem1hLmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2RlY29tcHJlc3NfdW5sem1hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg2MjJmOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGVjb21wcmVzc191bmx6bWEuYwpAQCAtMCwwICsxLDQ2NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU21hbGwgbHptYSBkZWZsYXRlIGltcGxlbWVudGF0aW9uLgorICogQ29weXJpZ2h0IChDKSAyMDA2ICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+CisgKgorICogQmFzZWQgb24gTHptYURlY29kZS5jIGZyb20gdGhlIExaTUEgU0RLIDQuMjIgKGh0dHA6Ly93d3cuNy16aXAub3JnLykKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA1ICBJZ29yIFBhdmxvdgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImJiX2FyY2hpdmUuaCIKKworI2lmIEVOQUJMRV9GRUFUVVJFX0xaTUFfRkFTVAorIyAgZGVmaW5lIHNwZWVkX2lubGluZSBBTFdBWVNfSU5MSU5FCisjICBkZWZpbmUgc2l6ZV9pbmxpbmUKKyNlbHNlCisjICBkZWZpbmUgc3BlZWRfaW5saW5lCisjICBkZWZpbmUgc2l6ZV9pbmxpbmUgQUxXQVlTX0lOTElORQorI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgeworCWludCBmZDsKKwl1aW50OF90ICpwdHI7CisKKy8qIFdhcyBrZWVwaW5nIHJjIG9uIHN0YWNrIGluIHVubHptYSBhbmQgc2VwYXJhdGVseSBhbGxvY2F0aW5nIGJ1ZmZlciwKKyAqIGJ1dCB3aXRoICJidWZmZXIgJ2F0dGFjaGVkIHRvJyBhbGxvY2F0ZWQgcmMiIGNvZGUgaXMgc21hbGxlcjogKi8KKwkvKiB1aW50OF90ICpidWZmZXI7ICovCisjZGVmaW5lIFJDX0JVRkZFUiAoKHVpbnQ4X3QqKShyYysxKSkKKworCXVpbnQ4X3QgKmJ1ZmZlcl9lbmQ7CisKKy8qIEhhZCBwcm92aXNpb25zIGZvciB2YXJpYWJsZSBidWZmZXIsIGJ1dCB3ZSBkb24ndCBuZWVkIGl0IGhlcmUgKi8KKwkvKiBpbnQgYnVmZmVyX3NpemU7ICovCisjZGVmaW5lIFJDX0JVRkZFUl9TSVpFIDB4MTAwMDAKKworCXVpbnQzMl90IGNvZGU7CisJdWludDMyX3QgcmFuZ2U7CisJdWludDMyX3QgYm91bmQ7Cit9IHJjX3Q7CisKKyNkZWZpbmUgUkNfVE9QX0JJVFMgMjQKKyNkZWZpbmUgUkNfTU9WRV9CSVRTIDUKKyNkZWZpbmUgUkNfTU9ERUxfVE9UQUxfQklUUyAxMQorCisKKy8qIENhbGxlZCBvbmNlIGluIHJjX2RvX25vcm1hbGl6ZSgpICovCitzdGF0aWMgdm9pZCByY19yZWFkKHJjX3QgKnJjKQoreworCWludCBidWZmZXJfc2l6ZSA9IHNhZmVfcmVhZChyYy0+ZmQsIFJDX0JVRkZFUiwgUkNfQlVGRkVSX1NJWkUpOworLy9UT0RPOiByZXR1cm4gLTEgaW5zdGVhZAorLy9UaGlzIHdpbGwgbWFrZSB1bmx6bWEgZGVsZXRlIGJyb2tlbiB1bnBhY2tlZCBmaWxlIG9uIHVucGFjayBlcnJvcnMKKwlpZiAoYnVmZmVyX3NpemUgPD0gMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVuZXhwZWN0ZWQgRU9GIik7CisJcmMtPmJ1ZmZlcl9lbmQgPSBSQ19CVUZGRVIgKyBidWZmZXJfc2l6ZTsKKwlyYy0+cHRyID0gUkNfQlVGRkVSOworfQorCisvKiBDYWxsZWQgdHdpY2UsIGJ1dCBvbmUgY2FsbHNpdGUgaXMgaW4gc3BlZWRfaW5saW5lJ2QgcmNfaXNfYml0XzEoKSAqLworc3RhdGljIHZvaWQgcmNfZG9fbm9ybWFsaXplKHJjX3QgKnJjKQoreworCWlmIChyYy0+cHRyID49IHJjLT5idWZmZXJfZW5kKQorCQlyY19yZWFkKHJjKTsKKwlyYy0+cmFuZ2UgPDw9IDg7CisJcmMtPmNvZGUgPSAocmMtPmNvZGUgPDwgOCkgfCAqcmMtPnB0cisrOworfQorc3RhdGljIEFMV0FZU19JTkxJTkUgdm9pZCByY19ub3JtYWxpemUocmNfdCAqcmMpCit7CisJaWYgKHJjLT5yYW5nZSA8ICgxIDw8IFJDX1RPUF9CSVRTKSkgeworCQlyY19kb19ub3JtYWxpemUocmMpOworCX0KK30KKworLyogQ2FsbGVkIG9uY2UgKi8KK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHJjX3QqIHJjX2luaXQoaW50IGZkKSAvKiwgaW50IGJ1ZmZlcl9zaXplKSAqLworeworCWludCBpOworCXJjX3QgKnJjOworCisJcmMgPSB4emFsbG9jKHNpemVvZigqcmMpICsgUkNfQlVGRkVSX1NJWkUpOworCisJcmMtPmZkID0gZmQ7CisJLyogcmMtPnB0ciA9IHJjLT5idWZmZXJfZW5kOyAqLworCisJZm9yIChpID0gMDsgaSA8IDU7IGkrKykgeworCQlyY19kb19ub3JtYWxpemUocmMpOworCX0KKwlyYy0+cmFuZ2UgPSAweGZmZmZmZmZmOworCXJldHVybiByYzsKK30KKworLyogQ2FsbGVkIG9uY2UgICovCitzdGF0aWMgQUxXQVlTX0lOTElORSB2b2lkIHJjX2ZyZWUocmNfdCAqcmMpCit7CisJZnJlZShyYyk7Cit9CisKKy8qIHJjX2lzX2JpdF8xIGlzIGNhbGxlZCA5IHRpbWVzICovCitzdGF0aWMgc3BlZWRfaW5saW5lIGludCByY19pc19iaXRfMShyY190ICpyYywgdWludDE2X3QgKnApCit7CisJcmNfbm9ybWFsaXplKHJjKTsKKwlyYy0+Ym91bmQgPSAqcCAqIChyYy0+cmFuZ2UgPj4gUkNfTU9ERUxfVE9UQUxfQklUUyk7CisJaWYgKHJjLT5jb2RlIDwgcmMtPmJvdW5kKSB7CisJCXJjLT5yYW5nZSA9IHJjLT5ib3VuZDsKKwkJKnAgKz0gKCgxIDw8IFJDX01PREVMX1RPVEFMX0JJVFMpIC0gKnApID4+IFJDX01PVkVfQklUUzsKKwkJcmV0dXJuIDA7CisJfQorCXJjLT5yYW5nZSAtPSByYy0+Ym91bmQ7CisJcmMtPmNvZGUgLT0gcmMtPmJvdW5kOworCSpwIC09ICpwID4+IFJDX01PVkVfQklUUzsKKwlyZXR1cm4gMTsKK30KKworLyogQ2FsbGVkIDQgdGltZXMgaW4gdW5sem1hIGxvb3AgKi8KK3N0YXRpYyBBTFdBWVNfSU5MSU5FIGludCByY19nZXRfYml0KHJjX3QgKnJjLCB1aW50MTZfdCAqcCwgaW50ICpzeW1ib2wpCit7CisJaW50IHJldCA9IHJjX2lzX2JpdF8xKHJjLCBwKTsKKwkqc3ltYm9sID0gKnN5bWJvbCAqIDIgKyByZXQ7CisJcmV0dXJuIHJldDsKK30KKworLyogQ2FsbGVkIG9uY2UgKi8KK3N0YXRpYyBBTFdBWVNfSU5MSU5FIGludCByY19kaXJlY3RfYml0KHJjX3QgKnJjKQoreworCXJjX25vcm1hbGl6ZShyYyk7CisJcmMtPnJhbmdlID4+PSAxOworCWlmIChyYy0+Y29kZSA+PSByYy0+cmFuZ2UpIHsKKwkJcmMtPmNvZGUgLT0gcmMtPnJhbmdlOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxlZCB0d2ljZSAqLworc3RhdGljIHNwZWVkX2lubGluZSB2b2lkCityY19iaXRfdHJlZV9kZWNvZGUocmNfdCAqcmMsIHVpbnQxNl90ICpwLCBpbnQgbnVtX2xldmVscywgaW50ICpzeW1ib2wpCit7CisJaW50IGkgPSBudW1fbGV2ZWxzOworCisJKnN5bWJvbCA9IDE7CisJd2hpbGUgKGktLSkKKwkJcmNfZ2V0X2JpdChyYywgcCArICpzeW1ib2wsIHN5bWJvbCk7CisJKnN5bWJvbCAtPSAxIDw8IG51bV9sZXZlbHM7Cit9CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgcG9zOworCXVpbnQzMl90IGRpY3Rfc2l6ZTsKKwl1aW50NjRfdCBkc3Rfc2l6ZTsKK30gUEFDS0VEIGx6bWFfaGVhZGVyX3Q7CisKKworLyogI2RlZmluZXMgd2lsbCBmb3JjZSBjb21waWxlciB0byBjb21wdXRlL29wdGltaXplIGVhY2ggb25lIHdpdGggZWFjaCB1c2FnZS4KKyAqIEhhdmUgaGVhcnQgYW5kIHVzZSBlbnVtIGluc3RlYWQuICovCitlbnVtIHsKKwlMWk1BX0JBU0VfU0laRSA9IDE4NDYsCisJTFpNQV9MSVRfU0laRSAgPSA3NjgsCisKKwlMWk1BX05VTV9QT1NfQklUU19NQVggPSA0LAorCisJTFpNQV9MRU5fTlVNX0xPV19CSVRTICA9IDMsCisJTFpNQV9MRU5fTlVNX01JRF9CSVRTICA9IDMsCisJTFpNQV9MRU5fTlVNX0hJR0hfQklUUyA9IDgsCisKKwlMWk1BX0xFTl9DSE9JQ0UgICAgID0gMCwKKwlMWk1BX0xFTl9DSE9JQ0VfMiAgID0gKExaTUFfTEVOX0NIT0lDRSArIDEpLAorCUxaTUFfTEVOX0xPVyAgICAgICAgPSAoTFpNQV9MRU5fQ0hPSUNFXzIgKyAxKSwKKwlMWk1BX0xFTl9NSUQgICAgICAgID0gKExaTUFfTEVOX0xPVyBcCisJICAgICAgICAgICAgICAgICAgICAgICsgKDEgPDwgKExaTUFfTlVNX1BPU19CSVRTX01BWCArIExaTUFfTEVOX05VTV9MT1dfQklUUykpKSwKKwlMWk1BX0xFTl9ISUdIICAgICAgID0gKExaTUFfTEVOX01JRCBcCisJICAgICAgICAgICAgICAgICAgICAgICsgKDEgPDwgKExaTUFfTlVNX1BPU19CSVRTX01BWCArIExaTUFfTEVOX05VTV9NSURfQklUUykpKSwKKwlMWk1BX05VTV9MRU5fUFJPQlMgID0gKExaTUFfTEVOX0hJR0ggKyAoMSA8PCBMWk1BX0xFTl9OVU1fSElHSF9CSVRTKSksCisKKwlMWk1BX05VTV9TVEFURVMgICAgID0gMTIsCisJTFpNQV9OVU1fTElUX1NUQVRFUyA9IDcsCisKKwlMWk1BX1NUQVJUX1BPU19NT0RFTF9JTkRFWCA9IDQsCisJTFpNQV9FTkRfUE9TX01PREVMX0lOREVYICAgPSAxNCwKKwlMWk1BX05VTV9GVUxMX0RJU1RBTkNFUyAgICA9ICgxIDw8IChMWk1BX0VORF9QT1NfTU9ERUxfSU5ERVggPj4gMSkpLAorCisJTFpNQV9OVU1fUE9TX1NMT1RfQklUUyA9IDYsCisJTFpNQV9OVU1fTEVOX1RPX1BPU19TVEFURVMgPSA0LAorCisJTFpNQV9OVU1fQUxJR05fQklUUyA9IDQsCisKKwlMWk1BX01BVENIX01JTl9MRU4gID0gMiwKKworCUxaTUFfSVNfTUFUQ0ggICAgICAgPSAwLAorCUxaTUFfSVNfUkVQICAgICAgICAgPSAoTFpNQV9JU19NQVRDSCArIChMWk1BX05VTV9TVEFURVMgPDwgTFpNQV9OVU1fUE9TX0JJVFNfTUFYKSksCisJTFpNQV9JU19SRVBfRzAgICAgICA9IChMWk1BX0lTX1JFUCArIExaTUFfTlVNX1NUQVRFUyksCisJTFpNQV9JU19SRVBfRzEgICAgICA9IChMWk1BX0lTX1JFUF9HMCArIExaTUFfTlVNX1NUQVRFUyksCisJTFpNQV9JU19SRVBfRzIgICAgICA9IChMWk1BX0lTX1JFUF9HMSArIExaTUFfTlVNX1NUQVRFUyksCisJTFpNQV9JU19SRVBfMF9MT05HICA9IChMWk1BX0lTX1JFUF9HMiArIExaTUFfTlVNX1NUQVRFUyksCisJTFpNQV9QT1NfU0xPVCAgICAgICA9IChMWk1BX0lTX1JFUF8wX0xPTkcgXAorCSAgICAgICAgICAgICAgICAgICAgICArIChMWk1BX05VTV9TVEFURVMgPDwgTFpNQV9OVU1fUE9TX0JJVFNfTUFYKSksCisJTFpNQV9TUEVDX1BPUyAgICAgICA9IChMWk1BX1BPU19TTE9UIFwKKwkgICAgICAgICAgICAgICAgICAgICAgKyAoTFpNQV9OVU1fTEVOX1RPX1BPU19TVEFURVMgPDwgTFpNQV9OVU1fUE9TX1NMT1RfQklUUykpLAorCUxaTUFfQUxJR04gICAgICAgICAgPSAoTFpNQV9TUEVDX1BPUyBcCisJICAgICAgICAgICAgICAgICAgICAgICsgTFpNQV9OVU1fRlVMTF9ESVNUQU5DRVMgLSBMWk1BX0VORF9QT1NfTU9ERUxfSU5ERVgpLAorCUxaTUFfTEVOX0NPREVSICAgICAgPSAoTFpNQV9BTElHTiArICgxIDw8IExaTUFfTlVNX0FMSUdOX0JJVFMpKSwKKwlMWk1BX1JFUF9MRU5fQ09ERVIgID0gKExaTUFfTEVOX0NPREVSICsgTFpNQV9OVU1fTEVOX1BST0JTKSwKKwlMWk1BX0xJVEVSQUwgICAgICAgID0gKExaTUFfUkVQX0xFTl9DT0RFUiArIExaTUFfTlVNX0xFTl9QUk9CUyksCit9OworCisKK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgRkFTVF9GVU5DCit1bnBhY2tfbHptYV9zdHJlYW0odHJhbnNmb3JtZXJfc3RhdGVfdCAqeHN0YXRlKQoreworCUlGX0RFU0tUT1AobG9uZyBsb25nIHRvdGFsX3dyaXR0ZW4gPSAwOykKKwlsem1hX2hlYWRlcl90IGhlYWRlcjsKKwlpbnQgbGMsIHBiLCBscDsKKwl1aW50MzJfdCBwb3Nfc3RhdGVfbWFzazsKKwl1aW50MzJfdCBsaXRlcmFsX3Bvc19tYXNrOworCXVpbnQxNl90ICpwOworCXJjX3QgKnJjOworCWludCBpOworCXVpbnQ4X3QgKmJ1ZmZlcjsKKwl1aW50OF90IHByZXZpb3VzX2J5dGUgPSAwOworCXNpemVfdCBidWZmZXJfcG9zID0gMCwgZ2xvYmFsX3BvcyA9IDA7CisJaW50IGxlbiA9IDA7CisJaW50IHN0YXRlID0gMDsKKwl1aW50MzJfdCByZXAwID0gMSwgcmVwMSA9IDEsIHJlcDIgPSAxLCByZXAzID0gMTsKKworCWlmIChmdWxsX3JlYWQoeHN0YXRlLT5zcmNfZmQsICZoZWFkZXIsIHNpemVvZihoZWFkZXIpKSAhPSBzaXplb2YoaGVhZGVyKQorCSB8fCBoZWFkZXIucG9zID49ICg5ICogNSAqIDUpCisJKSB7CisJCWJiX2Vycm9yX21zZygiYmFkIGx6bWEgaGVhZGVyIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpID0gaGVhZGVyLnBvcyAvIDk7CisJbGMgPSBoZWFkZXIucG9zICUgOTsKKwlwYiA9IGkgLyA1OworCWxwID0gaSAlIDU7CisJcG9zX3N0YXRlX21hc2sgPSAoMSA8PCBwYikgLSAxOworCWxpdGVyYWxfcG9zX21hc2sgPSAoMSA8PCBscCkgLSAxOworCisJLyogRXhhbXBsZSB2YWx1ZXMgZnJvbSBsaW51eC0zLjMuNC50YXIubHptYToKKwkgKiBkaWN0X3NpemU6IDY0TSwgZHN0X3NpemU6IDJeNjQtMQorCSAqLworCWhlYWRlci5kaWN0X3NpemUgPSBTV0FQX0xFMzIoaGVhZGVyLmRpY3Rfc2l6ZSk7CisJaGVhZGVyLmRzdF9zaXplID0gU1dBUF9MRTY0KGhlYWRlci5kc3Rfc2l6ZSk7CisKKwlpZiAoaGVhZGVyLmRpY3Rfc2l6ZSA9PSAwKQorCQloZWFkZXIuZGljdF9zaXplKys7CisKKwlidWZmZXIgPSB4bWFsbG9jKE1JTihoZWFkZXIuZHN0X3NpemUsIGhlYWRlci5kaWN0X3NpemUpKTsKKworCXsKKwkJaW50IG51bV9wcm9iczsKKworCQludW1fcHJvYnMgPSBMWk1BX0JBU0VfU0laRSArIChMWk1BX0xJVF9TSVpFIDw8IChsYyArIGxwKSk7CisJCXAgPSB4bWFsbG9jKG51bV9wcm9icyAqIHNpemVvZigqcCkpOworCQludW1fcHJvYnMgKz0gTFpNQV9MSVRFUkFMIC0gTFpNQV9CQVNFX1NJWkU7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fcHJvYnM7IGkrKykKKwkJCXBbaV0gPSAoMSA8PCBSQ19NT0RFTF9UT1RBTF9CSVRTKSA+PiAxOworCX0KKworCXJjID0gcmNfaW5pdCh4c3RhdGUtPnNyY19mZCk7IC8qLCBSQ19CVUZGRVJfU0laRSk7ICovCisKKwl3aGlsZSAoZ2xvYmFsX3BvcyArIGJ1ZmZlcl9wb3MgPCBoZWFkZXIuZHN0X3NpemUpIHsKKwkJaW50IHBvc19zdGF0ZSA9IChidWZmZXJfcG9zICsgZ2xvYmFsX3BvcykgJiBwb3Nfc3RhdGVfbWFzazsKKwkJdWludDE2X3QgKnByb2IgPSBwICsgTFpNQV9JU19NQVRDSCArIChzdGF0ZSA8PCBMWk1BX05VTV9QT1NfQklUU19NQVgpICsgcG9zX3N0YXRlOworCisJCWlmICghcmNfaXNfYml0XzEocmMsIHByb2IpKSB7CisJCQlzdGF0aWMgY29uc3QgY2hhciBuZXh0X3N0YXRlW0xaTUFfTlVNX1NUQVRFU10gPQorCQkJCXsgMCwgMCwgMCwgMCwgMSwgMiwgMywgNCwgNSwgNiwgNCwgNSB9OworCQkJaW50IG1pID0gMTsKKworCQkJcHJvYiA9IChwICsgTFpNQV9MSVRFUkFMCisJCQkgICAgICAgICsgKExaTUFfTElUX1NJWkUgKiAoKCgoYnVmZmVyX3BvcyArIGdsb2JhbF9wb3MpICYgbGl0ZXJhbF9wb3NfbWFzaykgPDwgbGMpCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAocHJldmlvdXNfYnl0ZSA+PiAoOCAtIGxjKSkKKwkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKwkJCSAgICAgICAgICApCisJCQkpOworCisJCQlpZiAoc3RhdGUgPj0gTFpNQV9OVU1fTElUX1NUQVRFUykgeworCQkJCWludCBtYXRjaF9ieXRlOworCQkJCXVpbnQzMl90IHBvcyA9IGJ1ZmZlcl9wb3MgLSByZXAwOworCisJCQkJd2hpbGUgKHBvcyA+PSBoZWFkZXIuZGljdF9zaXplKQorCQkJCQlwb3MgKz0gaGVhZGVyLmRpY3Rfc2l6ZTsKKwkJCQltYXRjaF9ieXRlID0gYnVmZmVyW3Bvc107CisJCQkJZG8geworCQkJCQlpbnQgYml0OworCisJCQkJCW1hdGNoX2J5dGUgPDw9IDE7CisJCQkJCWJpdCA9IG1hdGNoX2J5dGUgJiAweDEwMDsKKwkJCQkJYml0IF49IChyY19nZXRfYml0KHJjLCBwcm9iICsgMHgxMDAgKyBiaXQgKyBtaSwgJm1pKSA8PCA4KTsgLyogMHgxMDAgb3IgMCAqLworCQkJCQlpZiAoYml0KQorCQkJCQkJYnJlYWs7CisJCQkJfSB3aGlsZSAobWkgPCAweDEwMCk7CisJCQl9CisJCQl3aGlsZSAobWkgPCAweDEwMCkgeworCQkJCXJjX2dldF9iaXQocmMsIHByb2IgKyBtaSwgJm1pKTsKKwkJCX0KKworCQkJc3RhdGUgPSBuZXh0X3N0YXRlW3N0YXRlXTsKKworCQkJcHJldmlvdXNfYnl0ZSA9ICh1aW50OF90KSBtaTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MWk1BX0ZBU1QKKyBvbmVfYnl0ZTE6CisJCQlidWZmZXJbYnVmZmVyX3BvcysrXSA9IHByZXZpb3VzX2J5dGU7CisJCQlpZiAoYnVmZmVyX3BvcyA9PSBoZWFkZXIuZGljdF9zaXplKSB7CisJCQkJYnVmZmVyX3BvcyA9IDA7CisJCQkJZ2xvYmFsX3BvcyArPSBoZWFkZXIuZGljdF9zaXplOworCQkJCWlmICh0cmFuc2Zvcm1lcl93cml0ZSh4c3RhdGUsIGJ1ZmZlciwgaGVhZGVyLmRpY3Rfc2l6ZSkgIT0gKHNzaXplX3QpaGVhZGVyLmRpY3Rfc2l6ZSkKKwkJCQkJZ290byBiYWQ7CisJCQkJSUZfREVTS1RPUCh0b3RhbF93cml0dGVuICs9IGhlYWRlci5kaWN0X3NpemU7KQorCQkJfQorI2Vsc2UKKwkJCWxlbiA9IDE7CisJCQlnb3RvIG9uZV9ieXRlMjsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJaW50IG51bV9iaXRzOworCQkJaW50IG9mZnNldDsKKwkJCXVpbnQxNl90ICpwcm9iMjsKKyNkZWZpbmUgcHJvYl9sZW4gcHJvYjIKKworCQkJcHJvYjIgPSBwICsgTFpNQV9JU19SRVAgKyBzdGF0ZTsKKwkJCWlmICghcmNfaXNfYml0XzEocmMsIHByb2IyKSkgeworCQkJCXJlcDMgPSByZXAyOworCQkJCXJlcDIgPSByZXAxOworCQkJCXJlcDEgPSByZXAwOworCQkJCXN0YXRlID0gc3RhdGUgPCBMWk1BX05VTV9MSVRfU1RBVEVTID8gMCA6IDM7CisJCQkJcHJvYjIgPSBwICsgTFpNQV9MRU5fQ09ERVI7CisJCQl9IGVsc2UgeworCQkJCXByb2IyICs9IExaTUFfSVNfUkVQX0cwIC0gTFpNQV9JU19SRVA7CisJCQkJaWYgKCFyY19pc19iaXRfMShyYywgcHJvYjIpKSB7CisJCQkJCXByb2IyID0gKHAgKyBMWk1BX0lTX1JFUF8wX0xPTkcKKwkJCQkJICAgICAgICArIChzdGF0ZSA8PCBMWk1BX05VTV9QT1NfQklUU19NQVgpCisJCQkJCSAgICAgICAgKyBwb3Nfc3RhdGUKKwkJCQkJKTsKKwkJCQkJaWYgKCFyY19pc19iaXRfMShyYywgcHJvYjIpKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTFpNQV9GQVNUCisJCQkJCQl1aW50MzJfdCBwb3MgPSBidWZmZXJfcG9zIC0gcmVwMDsKKwkJCQkJCXN0YXRlID0gc3RhdGUgPCBMWk1BX05VTV9MSVRfU1RBVEVTID8gOSA6IDExOworCQkJCQkJd2hpbGUgKHBvcyA+PSBoZWFkZXIuZGljdF9zaXplKQorCQkJCQkJCXBvcyArPSBoZWFkZXIuZGljdF9zaXplOworCQkJCQkJcHJldmlvdXNfYnl0ZSA9IGJ1ZmZlcltwb3NdOworCQkJCQkJZ290byBvbmVfYnl0ZTE7CisjZWxzZQorCQkJCQkJc3RhdGUgPSBzdGF0ZSA8IExaTUFfTlVNX0xJVF9TVEFURVMgPyA5IDogMTE7CisJCQkJCQlsZW4gPSAxOworCQkJCQkJZ290byBzdHJpbmc7CisjZW5kaWYKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCXVpbnQzMl90IGRpc3RhbmNlOworCisJCQkJCXByb2IyICs9IExaTUFfSVNfUkVQX0cxIC0gTFpNQV9JU19SRVBfRzA7CisJCQkJCWRpc3RhbmNlID0gcmVwMTsKKwkJCQkJaWYgKHJjX2lzX2JpdF8xKHJjLCBwcm9iMikpIHsKKwkJCQkJCXByb2IyICs9IExaTUFfSVNfUkVQX0cyIC0gTFpNQV9JU19SRVBfRzE7CisJCQkJCQlkaXN0YW5jZSA9IHJlcDI7CisJCQkJCQlpZiAocmNfaXNfYml0XzEocmMsIHByb2IyKSkgeworCQkJCQkJCWRpc3RhbmNlID0gcmVwMzsKKwkJCQkJCQlyZXAzID0gcmVwMjsKKwkJCQkJCX0KKwkJCQkJCXJlcDIgPSByZXAxOworCQkJCQl9CisJCQkJCXJlcDEgPSByZXAwOworCQkJCQlyZXAwID0gZGlzdGFuY2U7CisJCQkJfQorCQkJCXN0YXRlID0gc3RhdGUgPCBMWk1BX05VTV9MSVRfU1RBVEVTID8gOCA6IDExOworCQkJCXByb2IyID0gcCArIExaTUFfUkVQX0xFTl9DT0RFUjsKKwkJCX0KKworCQkJcHJvYl9sZW4gPSBwcm9iMiArIExaTUFfTEVOX0NIT0lDRTsKKwkJCW51bV9iaXRzID0gTFpNQV9MRU5fTlVNX0xPV19CSVRTOworCQkJaWYgKCFyY19pc19iaXRfMShyYywgcHJvYl9sZW4pKSB7CisJCQkJcHJvYl9sZW4gKz0gTFpNQV9MRU5fTE9XIC0gTFpNQV9MRU5fQ0hPSUNFCisJCQkJICAgICAgICAgICAgKyAocG9zX3N0YXRlIDw8IExaTUFfTEVOX05VTV9MT1dfQklUUyk7CisJCQkJb2Zmc2V0ID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJcHJvYl9sZW4gKz0gTFpNQV9MRU5fQ0hPSUNFXzIgLSBMWk1BX0xFTl9DSE9JQ0U7CisJCQkJaWYgKCFyY19pc19iaXRfMShyYywgcHJvYl9sZW4pKSB7CisJCQkJCXByb2JfbGVuICs9IExaTUFfTEVOX01JRCAtIExaTUFfTEVOX0NIT0lDRV8yCisJCQkJCSAgICAgICAgICAgICsgKHBvc19zdGF0ZSA8PCBMWk1BX0xFTl9OVU1fTUlEX0JJVFMpOworCQkJCQlvZmZzZXQgPSAxIDw8IExaTUFfTEVOX05VTV9MT1dfQklUUzsKKwkJCQkJbnVtX2JpdHMgKz0gTFpNQV9MRU5fTlVNX01JRF9CSVRTIC0gTFpNQV9MRU5fTlVNX0xPV19CSVRTOworCQkJCX0gZWxzZSB7CisJCQkJCXByb2JfbGVuICs9IExaTUFfTEVOX0hJR0ggLSBMWk1BX0xFTl9DSE9JQ0VfMjsKKwkJCQkJb2Zmc2V0ID0gKCgxIDw8IExaTUFfTEVOX05VTV9MT1dfQklUUykKKwkJCQkJICAgICAgICAgICsgKDEgPDwgTFpNQV9MRU5fTlVNX01JRF9CSVRTKSk7CisJCQkJCW51bV9iaXRzICs9IExaTUFfTEVOX05VTV9ISUdIX0JJVFMgLSBMWk1BX0xFTl9OVU1fTE9XX0JJVFM7CisJCQkJfQorCQkJfQorCQkJcmNfYml0X3RyZWVfZGVjb2RlKHJjLCBwcm9iX2xlbiwgbnVtX2JpdHMsICZsZW4pOworCQkJbGVuICs9IG9mZnNldDsKKworCQkJaWYgKHN0YXRlIDwgNCkgeworCQkJCWludCBwb3Nfc2xvdDsKKwkJCQl1aW50MTZfdCAqcHJvYjM7CisKKwkJCQlzdGF0ZSArPSBMWk1BX05VTV9MSVRfU1RBVEVTOworCQkJCXByb2IzID0gcCArIExaTUFfUE9TX1NMT1QgKworCQkJCSAgICAgICAoKGxlbiA8IExaTUFfTlVNX0xFTl9UT19QT1NfU1RBVEVTID8gbGVuIDoKKwkJCQkgICAgICAgICBMWk1BX05VTV9MRU5fVE9fUE9TX1NUQVRFUyAtIDEpCisJCQkJICAgICAgICAgPDwgTFpNQV9OVU1fUE9TX1NMT1RfQklUUyk7CisJCQkJcmNfYml0X3RyZWVfZGVjb2RlKHJjLCBwcm9iMywKKwkJCQkJTFpNQV9OVU1fUE9TX1NMT1RfQklUUywgJnBvc19zbG90KTsKKwkJCQlyZXAwID0gcG9zX3Nsb3Q7CisJCQkJaWYgKHBvc19zbG90ID49IExaTUFfU1RBUlRfUE9TX01PREVMX0lOREVYKSB7CisJCQkJCWludCBpMiwgbWkyLCBudW1fYml0czIgPSAocG9zX3Nsb3QgPj4gMSkgLSAxOworCQkJCQlyZXAwID0gMiB8IChwb3Nfc2xvdCAmIDEpOworCQkJCQlpZiAocG9zX3Nsb3QgPCBMWk1BX0VORF9QT1NfTU9ERUxfSU5ERVgpIHsKKwkJCQkJCXJlcDAgPDw9IG51bV9iaXRzMjsKKwkJCQkJCXByb2IzID0gcCArIExaTUFfU1BFQ19QT1MgKyByZXAwIC0gcG9zX3Nsb3QgLSAxOworCQkJCQl9IGVsc2UgeworCQkJCQkJZm9yICg7IG51bV9iaXRzMiAhPSBMWk1BX05VTV9BTElHTl9CSVRTOyBudW1fYml0czItLSkKKwkJCQkJCQlyZXAwID0gKHJlcDAgPDwgMSkgfCByY19kaXJlY3RfYml0KHJjKTsKKwkJCQkJCXJlcDAgPDw9IExaTUFfTlVNX0FMSUdOX0JJVFM7CisJCQkJCQlwcm9iMyA9IHAgKyBMWk1BX0FMSUdOOworCQkJCQl9CisJCQkJCWkyID0gMTsKKwkJCQkJbWkyID0gMTsKKwkJCQkJd2hpbGUgKG51bV9iaXRzMi0tKSB7CisJCQkJCQlpZiAocmNfZ2V0X2JpdChyYywgcHJvYjMgKyBtaTIsICZtaTIpKQorCQkJCQkJCXJlcDAgfD0gaTI7CisJCQkJCQlpMiA8PD0gMTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAoKytyZXAwID09IDApCisJCQkJCWJyZWFrOworCQkJfQorCisJCQlsZW4gKz0gTFpNQV9NQVRDSF9NSU5fTEVOOworIElGX05PVF9GRUFUVVJFX0xaTUFfRkFTVChzdHJpbmc6KQorCQkJZG8geworCQkJCXVpbnQzMl90IHBvcyA9IGJ1ZmZlcl9wb3MgLSByZXAwOworCQkJCXdoaWxlIChwb3MgPj0gaGVhZGVyLmRpY3Rfc2l6ZSkKKwkJCQkJcG9zICs9IGhlYWRlci5kaWN0X3NpemU7CisJCQkJcHJldmlvdXNfYnl0ZSA9IGJ1ZmZlcltwb3NdOworIElGX05PVF9GRUFUVVJFX0xaTUFfRkFTVChvbmVfYnl0ZTI6KQorCQkJCWJ1ZmZlcltidWZmZXJfcG9zKytdID0gcHJldmlvdXNfYnl0ZTsKKwkJCQlpZiAoYnVmZmVyX3BvcyA9PSBoZWFkZXIuZGljdF9zaXplKSB7CisJCQkJCWJ1ZmZlcl9wb3MgPSAwOworCQkJCQlnbG9iYWxfcG9zICs9IGhlYWRlci5kaWN0X3NpemU7CisJCQkJCWlmICh0cmFuc2Zvcm1lcl93cml0ZSh4c3RhdGUsIGJ1ZmZlciwgaGVhZGVyLmRpY3Rfc2l6ZSkgIT0gKHNzaXplX3QpaGVhZGVyLmRpY3Rfc2l6ZSkKKwkJCQkJCWdvdG8gYmFkOworCQkJCQlJRl9ERVNLVE9QKHRvdGFsX3dyaXR0ZW4gKz0gaGVhZGVyLmRpY3Rfc2l6ZTspCisJCQkJfQorCQkJCWxlbi0tOworCQkJfSB3aGlsZSAobGVuICE9IDAgJiYgYnVmZmVyX3BvcyA8IGhlYWRlci5kc3Rfc2l6ZSk7CisJCQkvKiBGSVhNRTogLi4uLi4uLi4uLi5eXl5eXgorCQkJICogc2hvdWxkbid0IGl0IGJlICJnbG9iYWxfcG9zICsgYnVmZmVyX3BvcyA8IGhlYWRlci5kc3Rfc2l6ZSI/CisJCQkgKi8KKwkJfQorCX0KKworCXsKKwkJSUZfTk9UX0RFU0tUT1AoaW50IHRvdGFsX3dyaXR0ZW4gPSAwOyAvKiBzdWNjZXNzICovKQorCQlJRl9ERVNLVE9QKHRvdGFsX3dyaXR0ZW4gKz0gYnVmZmVyX3BvczspCisJCWlmICh0cmFuc2Zvcm1lcl93cml0ZSh4c3RhdGUsIGJ1ZmZlciwgYnVmZmVyX3BvcykgIT0gKHNzaXplX3QpYnVmZmVyX3BvcykgeworIGJhZDoKKwkJCXRvdGFsX3dyaXR0ZW4gPSAtMTsgLyogZmFpbHVyZSAqLworCQl9CisJCXJjX2ZyZWUocmMpOworCQlmcmVlKHApOworCQlmcmVlKGJ1ZmZlcik7CisJCXJldHVybiB0b3RhbF93cml0dGVuOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvZGVjb21wcmVzc191bnh6LmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2RlY29tcHJlc3NfdW54ei5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNDA4YWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2RlY29tcHJlc3NfdW54ei5jCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogVGhpcyBmaWxlIHVzZXMgWFogRW1iZWRkZWQgbGlicmFyeSBjb2RlIHdoaWNoIGlzIHdyaXR0ZW4KKyAqIGJ5IExhc3NlIENvbGxpbiA8bGFzc2UuY29sbGluQHR1a2Fhbmkub3JnPgorICogYW5kIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBTZWUgUkVBRE1FIGZpbGUgaW4gdW54ei8gZGlyZWN0b3J5IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoKKyAqIFRoaXMgZmlsZSBpczoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYmJfYXJjaGl2ZS5oIgorCisjZGVmaW5lIFhaX0ZVTkMgRkFTVF9GVU5DCisjZGVmaW5lIFhaX0VYVEVSTiBzdGF0aWMKKworI2RlZmluZSBYWl9ERUNfRFlOQUxMT0MKKworLyogU2tpcCBjaGVjayAocmF0aGVyIHRoYW4gZmFpbCkgb2YgdW5zdXBwb3J0ZWQgaGFzaCBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgWFpfREVDX0FOWV9DSEVDSyAgMQorCisvKiBXZSB1c2Ugb3VyIG93biBjcmMzMiBmdW5jdGlvbiAqLworI2RlZmluZSBYWl9JTlRFUk5BTF9DUkMzMiAwCitzdGF0aWMgdWludDMyX3QgeHpfY3JjMzIoY29uc3QgdWludDhfdCAqYnVmLCBzaXplX3Qgc2l6ZSwgdWludDMyX3QgY3JjKQoreworCXJldHVybiB+Y3JjMzJfYmxvY2tfZW5kaWFuMCh+Y3JjLCBidWYsIHNpemUsIGdsb2JhbF9jcmMzMl90YWJsZSk7Cit9CisKKy8qIFdlIHVzZSBhcmNoLW9wdGltaXplZCB1bmFsaWduZWQgYWNjZXNzb3JzICovCisjZGVmaW5lIGdldF91bmFsaWduZWRfbGUzMihidWYpICh7IHVpbnQzMl90IHY7IG1vdmVfZnJvbV91bmFsaWduZWQzMih2LCBidWYpOyBTV0FQX0xFMzIodik7IH0pCisjZGVmaW5lIGdldF91bmFsaWduZWRfYmUzMihidWYpICh7IHVpbnQzMl90IHY7IG1vdmVfZnJvbV91bmFsaWduZWQzMih2LCBidWYpOyBTV0FQX0JFMzIodik7IH0pCisjZGVmaW5lIHB1dF91bmFsaWduZWRfbGUzMih2YWwsIGJ1ZikgbW92ZV90b191bmFsaWduZWQzMihidWYsIFNXQVBfTEUzMih2YWwpKQorI2RlZmluZSBwdXRfdW5hbGlnbmVkX2JlMzIodmFsLCBidWYpIG1vdmVfdG9fdW5hbGlnbmVkMzIoYnVmLCBTV0FQX0JFMzIodmFsKSkKKworI2luY2x1ZGUgInVueHoveHpfZGVjX2Jjai5jIgorI2luY2x1ZGUgInVueHoveHpfZGVjX2x6bWEyLmMiCisjaW5jbHVkZSAidW54ei94el9kZWNfc3RyZWFtLmMiCisKK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgRkFTVF9GVU5DCit1bnBhY2tfeHpfc3RyZWFtKHRyYW5zZm9ybWVyX3N0YXRlX3QgKnhzdGF0ZSkKK3sKKwllbnVtIHh6X3JldCB4el9yZXN1bHQ7CisJc3RydWN0IHh6X2J1ZiBpb2J1ZjsKKwlzdHJ1Y3QgeHpfZGVjICpzdGF0ZTsKKwl1bnNpZ25lZCBjaGFyICptZW1idWY7CisJSUZfREVTS1RPUChsb25nIGxvbmcpIGludCB0b3RhbCA9IDA7CisKKwlpZiAoIWdsb2JhbF9jcmMzMl90YWJsZSkKKwkJZ2xvYmFsX2NyYzMyX3RhYmxlID0gY3JjMzJfZmlsbHRhYmxlKE5VTEwsIC8qZW5kaWFuOiovIDApOworCisJbWVtc2V0KCZpb2J1ZiwgMCwgc2l6ZW9mKGlvYnVmKSk7CisJbWVtYnVmID0geG1hbGxvYygyICogQlVGU0laKTsKKwlpb2J1Zi5pbiA9IG1lbWJ1ZjsKKwlpb2J1Zi5vdXQgPSBtZW1idWYgKyBCVUZTSVo7CisJaW9idWYub3V0X3NpemUgPSBCVUZTSVo7CisKKwlpZiAoIXhzdGF0ZSB8fCB4c3RhdGUtPmNoZWNrX3NpZ25hdHVyZSA9PSAwKSB7CisJCS8qIFByZWxvYWQgWFogZmlsZSBzaWduYXR1cmUgKi8KKwkJc3RyY3B5KChjaGFyKiltZW1idWYsIEhFQURFUl9NQUdJQyk7CisJCWlvYnVmLmluX3NpemUgPSBIRUFERVJfTUFHSUNfU0laRTsKKwl9IC8qIGVsc2U6IGxldCB4eiBjb2RlIHJlYWQgJiBjaGVjayBpdCAqLworCisJLyogTGltaXQgbWVtb3J5IHVzYWdlIHRvIGFib3V0IDY0IE1pQi4gKi8KKwlzdGF0ZSA9IHh6X2RlY19pbml0KFhaX0RZTkFMTE9DLCA2NCoxMDI0KjEwMjQpOworCisJeHpfcmVzdWx0ID0gWF9PSzsKKwl3aGlsZSAoMSkgeworCQlpZiAoaW9idWYuaW5fcG9zID09IGlvYnVmLmluX3NpemUpIHsKKwkJCWludCByZCA9IHNhZmVfcmVhZCh4c3RhdGUtPnNyY19mZCwgbWVtYnVmLCBCVUZTSVopOworCQkJaWYgKHJkIDwgMCkgeworCQkJCWJiX2Vycm9yX21zZyhiYl9tc2dfcmVhZF9lcnJvcik7CisJCQkJdG90YWwgPSAtMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChyZCA9PSAwICYmIHh6X3Jlc3VsdCA9PSBYWl9TVFJFQU1fRU5EKQorCQkJCWJyZWFrOworCQkJaW9idWYuaW5fc2l6ZSA9IHJkOworCQkJaW9idWYuaW5fcG9zID0gMDsKKwkJfQorCQlpZiAoeHpfcmVzdWx0ID09IFhaX1NUUkVBTV9FTkQpIHsKKwkJCS8qCisJCQkgKiBUcnkgdG8gc3RhcnQgZGVjb2RpbmcgbmV4dCBjb25jYXRlbmF0ZWQgc3RyZWFtLgorCQkJICogU3RyZWFtIHBhZGRpbmcgbXVzdCBhbHdheXMgYmUgYSBtdWx0aXBsZSBvZiBmb3VyCisJCQkgKiBieXRlcyB0byBwcmVzZXJ2ZSBmb3VyLWJ5dGUgYWxpZ25tZW50LiBUbyBrZWVwIHRoZQorCQkJICogY29kZSBzbGlnaHRseSBzbWFsbGVyLCB3ZSBhcmVuJ3QgYXMgc3RyaWN0IGhlcmUgYXMKKwkJCSAqIHRoZSAueHogc3BlYyByZXF1aXJlcy4gV2UganVzdCBza2lwIGFsbCB6ZXJvLWJ5dGVzCisJCQkgKiB3aXRob3V0IGNoZWNraW5nIHRoZSBhbGlnbm1lbnQgYW5kIHRodXMgY2FuIGFjY2VwdAorCQkJICogZmlsZXMgdGhhdCBhcmVuJ3QgdmFsaWQsIGUuZy4gdGhlIFhaIHV0aWxzIHRlc3QKKwkJCSAqIGZpbGVzIGJhZC0wcGFkLWVtcHR5Lnh6IGFuZCBiYWQtMGNhdHBhZC1lbXB0eS54ei4KKwkJCSAqLworCQkJZG8geworCQkJCWlmIChtZW1idWZbaW9idWYuaW5fcG9zXSAhPSAwKSB7CisJCQkJCXh6X2RlY19yZXNldChzdGF0ZSk7CisJCQkJCWdvdG8gZG9fcnVuOworCQkJCX0KKwkJCQlpb2J1Zi5pbl9wb3MrKzsKKwkJCX0gd2hpbGUgKGlvYnVmLmluX3BvcyA8IGlvYnVmLmluX3NpemUpOworCQl9CisgZG9fcnVuOgorLy8JCWJiX2Vycm9yX21zZygiPmluIHBvczolZCBzaXplOiVkIG91dCBwb3M6JWQgc2l6ZTolZCIsCisvLwkJCQlpb2J1Zi5pbl9wb3MsIGlvYnVmLmluX3NpemUsIGlvYnVmLm91dF9wb3MsIGlvYnVmLm91dF9zaXplKTsKKwkJeHpfcmVzdWx0ID0geHpfZGVjX3J1bihzdGF0ZSwgJmlvYnVmKTsKKy8vCQliYl9lcnJvcl9tc2coIjxpbiBwb3M6JWQgc2l6ZTolZCBvdXQgcG9zOiVkIHNpemU6JWQgcjolZCIsCisvLwkJCQlpb2J1Zi5pbl9wb3MsIGlvYnVmLmluX3NpemUsIGlvYnVmLm91dF9wb3MsIGlvYnVmLm91dF9zaXplLCB4el9yZXN1bHQpOworCQlpZiAoaW9idWYub3V0X3BvcykgeworCQkJeHRyYW5zZm9ybWVyX3dyaXRlKHhzdGF0ZSwgaW9idWYub3V0LCBpb2J1Zi5vdXRfcG9zKTsKKwkJCUlGX0RFU0tUT1AodG90YWwgKz0gaW9idWYub3V0X3BvczspCisJCQlpb2J1Zi5vdXRfcG9zID0gMDsKKwkJfQorCQlpZiAoeHpfcmVzdWx0ID09IFhaX1NUUkVBTV9FTkQpIHsKKwkJCS8qCisJCQkgKiBDYW4ganVzdCAiYnJlYWs7IiBoZXJlLCBpZiBub3QgZm9yIGNvbmNhdGVuYXRlZAorCQkJICogLnh6IHN0cmVhbXMuCisJCQkgKiBDaGVja2luZyBmb3IgcGFkZGluZyBtYXkgcmVxdWlyZSBidWZmZXIKKwkJCSAqIHJlcGxlbmlzaG1lbnQuIENhbid0IGRvIGl0IGhlcmUuCisJCQkgKi8KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICh4el9yZXN1bHQgIT0gWFpfT0sgJiYgeHpfcmVzdWx0ICE9IFhaX1VOU1VQUE9SVEVEX0NIRUNLKSB7CisJCQliYl9lcnJvcl9tc2coImNvcnJ1cHRlZCBkYXRhIik7CisJCQl0b3RhbCA9IC0xOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwl4el9kZWNfZW5kKHN0YXRlKTsKKwlmcmVlKG1lbWJ1Zik7CisKKwlyZXR1cm4gdG90YWw7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2ZpbHRlcl9hY2NlcHRfYWxsLmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2ZpbHRlcl9hY2NlcHRfYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMzZjdkMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZmlsdGVyX2FjY2VwdF9hbGwuYwpAQCAtMCwwICsxLDE3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgR2xlbm4gTWNHcmF0aAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYmJfYXJjaGl2ZS5oIgorCisvKiBBY2NlcHQgYW55IG5vbi1udWxsIG5hbWUsIGl0cyBub3QgcmVhbGx5IGEgZmlsdGVyIGF0IGFsbCAqLworY2hhciBGQVNUX0ZVTkMgZmlsdGVyX2FjY2VwdF9hbGwoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpCit7CisJaWYgKGFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlci0+bmFtZSkKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9maWx0ZXJfYWNjZXB0X2xpc3QuYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZmlsdGVyX2FjY2VwdF9saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJkNGIyMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZmlsdGVyX2FjY2VwdF9saXN0LmMKQEAgLTAsMCArMSwxOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIGJ5IEdsZW5uIE1jR3JhdGgKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImJiX2FyY2hpdmUuaCIKKworLyoKKyAqIEFjY2VwdCBuYW1lcyB0aGF0IGFyZSBpbiB0aGUgYWNjZXB0IGxpc3QsIGlnbm9yaW5nIHJlamVjdCBsaXN0LgorICovCitjaGFyIEZBU1RfRlVOQyBmaWx0ZXJfYWNjZXB0X2xpc3QoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpCit7CisJaWYgKGZpbmRfbGlzdF9lbnRyeShhcmNoaXZlX2hhbmRsZS0+YWNjZXB0LCBhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXItPm5hbWUpKQorCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCXJldHVybiBFWElUX0ZBSUxVUkU7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2ZpbHRlcl9hY2NlcHRfbGlzdF9yZWFzc2lnbi5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9maWx0ZXJfYWNjZXB0X2xpc3RfcmVhc3NpZ24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWFjZmJjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9maWx0ZXJfYWNjZXB0X2xpc3RfcmVhc3NpZ24uYwpAQCAtMCwwICsxLDYxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIGJ5IEdsZW5uIE1jR3JhdGgKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImJiX2FyY2hpdmUuaCIKKworLyogQnVpbHQgYW5kIHVzZWQgb25seSBpZiBFTkFCTEVfRFBLRyB8fCBFTkFCTEVfRFBLR19ERUIgKi8KKworLyoKKyAqIFJlYXNzaWduIHRoZSBzdWJhcmNoaXZlIG1ldGFkYXRhIHBhcnNlciBiYXNlZCBvbiB0aGUgZmlsZW5hbWUgZXh0ZW5zaW9uCisgKiBlLmcuIGlmIGl0cyBhIC50YXIuZ3ogbW9kaWZ5IGFyY2hpdmVfaGFuZGxlLT5zdWJfYXJjaGl2ZSB0byBwcm9jZXNzIGEgLnRhci5negorICogb3IgaWYgaXRzIGEgLnRhci5iejIgbWFrZSBhcmNoaXZlX2hhbmRsZS0+c3ViX2FyY2hpdmUgaGFuZGxlIHRoYXQKKyAqLworY2hhciBGQVNUX0ZVTkMgZmlsdGVyX2FjY2VwdF9saXN0X3JlYXNzaWduKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKQoreworCS8qIENoZWNrIHRoZSBmaWxlIGVudHJ5IGlzIGluIHRoZSBhY2NlcHQgbGlzdCAqLworCWlmIChmaW5kX2xpc3RfZW50cnkoYXJjaGl2ZV9oYW5kbGUtPmFjY2VwdCwgYXJjaGl2ZV9oYW5kbGUtPmZpbGVfaGVhZGVyLT5uYW1lKSkgeworCQljb25zdCBjaGFyICpuYW1lX3B0cjsKKworCQkvKiBGaW5kIGV4dGVuc2lvbiAqLworCQluYW1lX3B0ciA9IHN0cnJjaHIoYXJjaGl2ZV9oYW5kbGUtPmZpbGVfaGVhZGVyLT5uYW1lLCAnLicpOworCQlpZiAoIW5hbWVfcHRyKQorCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJbmFtZV9wdHIrKzsKKworCQkvKiBNb2RpZnkgdGhlIHN1YmFyY2hpdmUgaGFuZGxlciBiYXNlZCBvbiB0aGUgZXh0ZW5zaW9uICovCisJCWlmIChzdHJjbXAobmFtZV9wdHIsICJ0YXIiKSA9PSAwKSB7CisJCQlhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fYWN0aW9uX2RhdGFfc3ViYXJjaGl2ZSA9IGdldF9oZWFkZXJfdGFyOworCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJfQorCQlpZiAoRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfR1oKKwkJICYmIHN0cmNtcChuYW1lX3B0ciwgImd6IikgPT0gMAorCQkpIHsKKwkJCWFyY2hpdmVfaGFuZGxlLT5kcGtnX19hY3Rpb25fZGF0YV9zdWJhcmNoaXZlID0gZ2V0X2hlYWRlcl90YXJfZ3o7CisJCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCQl9CisJCWlmIChFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19CWjIKKwkJICYmIHN0cmNtcChuYW1lX3B0ciwgImJ6MiIpID09IDAKKwkJKSB7CisJCQlhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fYWN0aW9uX2RhdGFfc3ViYXJjaGl2ZSA9IGdldF9oZWFkZXJfdGFyX2J6MjsKKwkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCX0KKwkJaWYgKEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0xaTUEKKwkJICYmIHN0cmNtcChuYW1lX3B0ciwgImx6bWEiKSA9PSAwCisJCSkgeworCQkJYXJjaGl2ZV9oYW5kbGUtPmRwa2dfX2FjdGlvbl9kYXRhX3N1YmFyY2hpdmUgPSBnZXRfaGVhZGVyX3Rhcl9sem1hOworCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJfQorCQlpZiAoRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfWFoKKwkJICYmIHN0cmNtcChuYW1lX3B0ciwgInh6IikgPT0gMAorCQkpIHsKKwkJCWFyY2hpdmVfaGFuZGxlLT5kcGtnX19hY3Rpb25fZGF0YV9zdWJhcmNoaXZlID0gZ2V0X2hlYWRlcl90YXJfeHo7CisJCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCQl9CisJfQorCXJldHVybiBFWElUX0ZBSUxVUkU7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2ZpbHRlcl9hY2NlcHRfcmVqZWN0X2xpc3QuYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZmlsdGVyX2FjY2VwdF9yZWplY3RfbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ODM3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2ZpbHRlcl9hY2NlcHRfcmVqZWN0X2xpc3QuYwpAQCAtMCwwICsxLDM4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgR2xlbm4gTWNHcmF0aAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYmJfYXJjaGl2ZS5oIgorCisvKgorICogQWNjZXB0IG5hbWVzIHRoYXQgYXJlIGluIHRoZSBhY2NlcHQgbGlzdCBhbmQgbm90IGluIHRoZSByZWplY3QgbGlzdAorICovCitjaGFyIEZBU1RfRlVOQyBmaWx0ZXJfYWNjZXB0X3JlamVjdF9saXN0KGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKQoreworCWNvbnN0IGNoYXIgKmtleTsKKwljb25zdCBsbGlzdF90ICpyZWplY3RfZW50cnk7CisJY29uc3QgbGxpc3RfdCAqYWNjZXB0X2VudHJ5OworCisJa2V5ID0gYXJjaGl2ZV9oYW5kbGUtPmZpbGVfaGVhZGVyLT5uYW1lOworCisJLyogSWYgdGhlIGtleSBpcyBpbiBhIHJlamVjdCBsaXN0IGZhaWwgKi8KKwlyZWplY3RfZW50cnkgPSBmaW5kX2xpc3RfZW50cnkyKGFyY2hpdmVfaGFuZGxlLT5yZWplY3QsIGtleSk7CisJaWYgKHJlamVjdF9lbnRyeSkgeworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKworCS8qIEZhaWwgaWYgYW4gYWNjZXB0IGxpc3Qgd2FzIHNwZWNpZmllZCBhbmQgdGhlIGtleSB3YXNudCBpbiB0aGVyZSAqLworCWlmIChhcmNoaXZlX2hhbmRsZS0+YWNjZXB0KSB7CisJCWFjY2VwdF9lbnRyeSA9IGZpbmRfbGlzdF9lbnRyeTIoYXJjaGl2ZV9oYW5kbGUtPmFjY2VwdCwga2V5KTsKKwkJaWYgKCFhY2NlcHRfZW50cnkpIHsKKwkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJCX0KKwl9CisKKwkvKiBBY2NlcHRlZCAqLworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2ZpbmRfbGlzdF9lbnRyeS5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9maW5kX2xpc3RfZW50cnkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjAzMmM2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9maW5kX2xpc3RfZW50cnkuYwpAQCAtMCwwICsxLDU0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgYnkgR2xlbm4gTWNHcmF0aAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImJiX2FyY2hpdmUuaCIKKworLyogRmluZCBhIHN0cmluZyBpbiBhIHNoZWxsIHBhdHRlcm4gbGlzdCAqLworY29uc3QgbGxpc3RfdCogRkFTVF9GVU5DIGZpbmRfbGlzdF9lbnRyeShjb25zdCBsbGlzdF90ICpsaXN0LCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwl3aGlsZSAobGlzdCkgeworCQlpZiAoZm5tYXRjaChsaXN0LT5kYXRhLCBmaWxlbmFtZSwgMCkgPT0gMCkgeworCQkJcmV0dXJuIGxpc3Q7CisJCX0KKwkJbGlzdCA9IGxpc3QtPmxpbms7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBTYW1lLCBidXQgY29tcGFyZXMgb25seSBwYXRoIGNvbXBvbmVudHMgcHJlc2VudCBpbiBwYXR0ZXJuCisgKiAoZXh0cmEgdHJhaWxpbmcgcGF0aCBjb21wb25lbnRzIGluIGZpbGVuYW1lIGFyZSBhc3N1bWVkIHRvIG1hdGNoKQorICovCitjb25zdCBsbGlzdF90KiBGQVNUX0ZVTkMgZmluZF9saXN0X2VudHJ5Mihjb25zdCBsbGlzdF90ICpsaXN0LCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwljaGFyIGJ1ZltQQVRIX01BWF07CisJaW50IHBhdHRlcm5fc2xhc2hfY250OworCWNvbnN0IGNoYXIgKmM7CisJY2hhciAqZDsKKworCXdoaWxlIChsaXN0KSB7CisJCWMgPSBsaXN0LT5kYXRhOworCQlwYXR0ZXJuX3NsYXNoX2NudCA9IDA7CisJCXdoaWxlICgqYykKKwkJCWlmICgqYysrID09ICcvJykgcGF0dGVybl9zbGFzaF9jbnQrKzsKKwkJYyA9IGZpbGVuYW1lOworCQlkID0gYnVmOworCQkvKiBwYXJhbm9pYSBpcyBiZXR0ZXIgdGhhbiBidWZmZXIgb3ZlcmZsb3dzICovCisJCXdoaWxlICgqYyAmJiBkICE9IGJ1ZiArIHNpemVvZihidWYpLTEpIHsKKwkJCWlmICgqYyA9PSAnLycgJiYgLS1wYXR0ZXJuX3NsYXNoX2NudCA8IDApCisJCQkJYnJlYWs7CisJCQkqZCsrID0gKmMrKzsKKwkJfQorCQkqZCA9ICdcMCc7CisJCWlmIChmbm1hdGNoKGxpc3QtPmRhdGEsIGJ1ZiwgMCkgPT0gMCkgeworCQkJcmV0dXJuIGxpc3Q7CisJCX0KKwkJbGlzdCA9IGxpc3QtPmxpbms7CisJfQorCXJldHVybiBOVUxMOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX2FyLmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2dldF9oZWFkZXJfYXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjZiYjNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX2FyLmMKQEAgLTAsMCArMSwxNDQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogQ29weXJpZ2h0IDIwMDEgR2xlbm4gTWNHcmF0aC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImJiX2FyY2hpdmUuaCIKKyNpbmNsdWRlICJhci5oIgorCisvKiBXQVJOSU5HOiBDbG9iYmVycyBzdHJbbGVuXSwgc28gZmllbGRzIG11c3QgYmUgcmVhZCBpbiByZXZlcnNlIG9yZGVyISAqLworc3RhdGljIHVuc2lnbmVkIHJlYWRfbnVtKGNoYXIgKnN0ciwgaW50IGJhc2UsIGludCBsZW4pCit7CisJaW50IGVycjsKKworCS8qIGFyIGZpZWxkcyBhcmUgZml4ZWQgbGVuZ3RoIHRleHQgc3RyaW5ncyAocGFkZGVkIHdpdGggc3BhY2VzKS4KKwkgKiBFbnN1cmUgYmJfc3RydG91IGRvZXNuJ3QgcmVhZCBwYXN0IHRoZSBmaWVsZCBpbiBjYXNlIHRoZSBmdWxsCisJICogd2lkdGggaXMgdXNlZC4gKi8KKwlzdHJbbGVuXSA9IDA7CisKKwkvKiBUaGlzIGNvZGUgd29ya3MgYmVjYXVzZQorCSAqIG9uIG1pc2Zvcm1hdHRlZCBudW1iZXJzIGJiX3N0cnRvdSByZXR1cm5zIGFsbC1vbmVzICovCisJZXJyID0gYmJfc3RydG91KHN0ciwgTlVMTCwgYmFzZSk7CisJaWYgKGVyciA9PSAtMSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgYXIgaGVhZGVyIik7CisJcmV0dXJuIGVycjsKK30KKworY2hhciBGQVNUX0ZVTkMgZ2V0X2hlYWRlcl9hcihhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkKK3sKKwlmaWxlX2hlYWRlcl90ICp0eXBlZCA9IGFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlcjsKKwl1bnNpZ25lZCBzaXplOworCXVuaW9uIHsKKwkJY2hhciByYXdbNjBdOworCQlzdHJ1Y3QgYXJfaGVhZGVyIGZvcm1hdHRlZDsKKwl9IGFyOworI2lmIEVOQUJMRV9GRUFUVVJFX0FSX0xPTkdfRklMRU5BTUVTCisJc3RhdGljIGNoYXIgKmFyX2xvbmdfbmFtZXM7CisJc3RhdGljIHVuc2lnbmVkIGFyX2xvbmdfbmFtZV9zaXplOworI2VuZGlmCisKKwkvKiBkb250IHVzZSB4cmVhZCBhcyB3ZSB3YW50IHRvIGhhbmRsZSB0aGUgZXJyb3Igb3Vyc2VsZiAqLworCWlmIChyZWFkKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsIGFyLnJhdywgNjApICE9IDYwKSB7CisJCS8qIEVuZCBPZiBGaWxlICovCisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCisJLyogYXIgaGVhZGVyIHN0YXJ0cyBvbiBhbiBldmVuIGJ5dGUgKDIgYnl0ZSBhbGlnbmVkKQorCSAqICdcbicgaXMgdXNlZCBmb3IgcGFkZGluZworCSAqLworCWlmIChhci5yYXdbMF0gPT0gJ1xuJykgeworCQkvKiBmaXggdXAgdGhlIGhlYWRlciwgd2Ugc3RhcnRlZCByZWFkaW5nIDEgYnl0ZSB0b28gZWFybHkgKi8KKwkJbWVtbW92ZShhci5yYXcsICZhci5yYXdbMV0sIDU5KTsKKwkJYXIucmF3WzU5XSA9IHhyZWFkX2NoYXIoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCk7CisJCWFyY2hpdmVfaGFuZGxlLT5vZmZzZXQrKzsKKwl9CisJYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCArPSA2MDsKKworCWlmIChhci5mb3JtYXR0ZWQubWFnaWNbMF0gIT0gJ2AnIHx8IGFyLmZvcm1hdHRlZC5tYWdpY1sxXSAhPSAnXG4nKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBhciBoZWFkZXIiKTsKKworCS8qCisJICogTm90ZSB0aGF0IHRoZSBmaWVsZHMgTVVTVCBiZSByZWFkIGluIHJldmVyc2Ugb3JkZXIgYXMKKwkgKiByZWFkX251bSgpIGNsb2JiZXJzIHRoZSBuZXh0IGJ5dGUgYWZ0ZXIgdGhlIGZpZWxkIQorCSAqIE9yZGVyIGlzOiBuYW1lLCBkYXRlLCB1aWQsIGdpZCwgbW9kZSwgc2l6ZSwgbWFnaWMuCisJICovCisJdHlwZWQtPnNpemUgPSBzaXplID0gcmVhZF9udW0oYXIuZm9ybWF0dGVkLnNpemUsIDEwLAorCQkJCSAgICAgIHNpemVvZihhci5mb3JtYXR0ZWQuc2l6ZSkpOworCisJLyogc3BlY2lhbCBmaWxlbmFtZXMgaGF2ZSAnLycgYXMgdGhlIGZpcnN0IGNoYXJhY3RlciAqLworCWlmIChhci5mb3JtYXR0ZWQubmFtZVswXSA9PSAnLycpIHsKKwkJaWYgKGFyLmZvcm1hdHRlZC5uYW1lWzFdID09ICcgJykgeworCQkJLyogVGhpcyBpcyB0aGUgaW5kZXggb2Ygc3ltYm9scyBpbiB0aGUgZmlsZSBmb3IgY29tcGlsZXJzICovCisJCQlkYXRhX3NraXAoYXJjaGl2ZV9oYW5kbGUpOworCQkJYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCArPSBzaXplOworCQkJcmV0dXJuIGdldF9oZWFkZXJfYXIoYXJjaGl2ZV9oYW5kbGUpOyAvKiBSZXR1cm4gbmV4dCBoZWFkZXIgKi8KKwkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0FSX0xPTkdfRklMRU5BTUVTCisJCWlmIChhci5mb3JtYXR0ZWQubmFtZVsxXSA9PSAnLycpIHsKKwkJCS8qIElmIHRoZSBzZWNvbmQgY2hhciBpcyBhICcvJyB0aGVuIHRoaXMgZW50cmllcyBkYXRhIHNlY3Rpb24KKwkJCSAqIHN0b3JlcyBsb25nIGZpbGVuYW1lIGZvciBtdWx0aXBsZSBlbnRyaWVzLCB0aGV5IGFyZSBzdG9yZWQKKwkJCSAqIGluIHN0YXRpYyB2YXJpYWJsZSBsb25nX25hbWVzIGZvciB1c2UgaW4gZnV0dXJlIGVudHJpZXMKKwkJCSAqLworCQkJYXJfbG9uZ19uYW1lX3NpemUgPSBzaXplOworCQkJZnJlZShhcl9sb25nX25hbWVzKTsKKwkJCWFyX2xvbmdfbmFtZXMgPSB4bWFsbG9jKHNpemUpOworCQkJeHJlYWQoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgYXJfbG9uZ19uYW1lcywgc2l6ZSk7CisJCQlhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0ICs9IHNpemU7CisJCQkvKiBSZXR1cm4gbmV4dCBoZWFkZXIgKi8KKwkJCXJldHVybiBnZXRfaGVhZGVyX2FyKGFyY2hpdmVfaGFuZGxlKTsKKwkJfQorI2Vsc2UKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImxvbmcgZmlsZW5hbWVzIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorCX0KKwkvKiBPbmx5IHNpemUgaXMgYWx3YXlzIHByZXNlbnQsIHRoZSByZXN0IG1heSBiZSBtaXNzaW5nIGluCisJICogbG9uZyBmaWxlbmFtZSBwc2V1ZG8gZmlsZS4gVGh1cyB3ZSBkZWNvZGUgdGhlIHJlc3QKKwkgKiBhZnRlciBkZWFsaW5nIHdpdGggbG9uZyBmaWxlbmFtZSBwc2V1ZG8gZmlsZS4KKwkgKi8KKwl0eXBlZC0+bW9kZSA9IHJlYWRfbnVtKGFyLmZvcm1hdHRlZC5tb2RlLCA4LCBzaXplb2YoYXIuZm9ybWF0dGVkLm1vZGUpKTsKKwl0eXBlZC0+Z2lkID0gcmVhZF9udW0oYXIuZm9ybWF0dGVkLmdpZCwgMTAsIHNpemVvZihhci5mb3JtYXR0ZWQuZ2lkKSk7CisJdHlwZWQtPnVpZCA9IHJlYWRfbnVtKGFyLmZvcm1hdHRlZC51aWQsIDEwLCBzaXplb2YoYXIuZm9ybWF0dGVkLnVpZCkpOworCXR5cGVkLT5tdGltZSA9IHJlYWRfbnVtKGFyLmZvcm1hdHRlZC5kYXRlLCAxMCwgc2l6ZW9mKGFyLmZvcm1hdHRlZC5kYXRlKSk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9BUl9MT05HX0ZJTEVOQU1FUworCWlmIChhci5mb3JtYXR0ZWQubmFtZVswXSA9PSAnLycpIHsKKwkJdW5zaWduZWQgbG9uZ19vZmZzZXQ7CisKKwkJLyogVGhlIG51bWJlciBhZnRlciB0aGUgJy8nIGluZGljYXRlcyB0aGUgb2Zmc2V0IGluIHRoZSBhciBkYXRhIHNlY3Rpb24KKwkJICogKHNhdmVkIGluIGFyX2xvbmdfbmFtZXMpIHRoYXQgY29uYXRhaW5zIHRoZSByZWFsIGZpbGVuYW1lICovCisJCWxvbmdfb2Zmc2V0ID0gcmVhZF9udW0oJmFyLmZvcm1hdHRlZC5uYW1lWzFdLCAxMCwKKwkJCQkgICAgICAgc2l6ZW9mKGFyLmZvcm1hdHRlZC5uYW1lKSAtIDEpOworCQlpZiAobG9uZ19vZmZzZXQgPj0gYXJfbG9uZ19uYW1lX3NpemUpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCByZXNvbHZlIGxvbmcgZmlsZW5hbWUiKTsKKwkJfQorCQl0eXBlZC0+bmFtZSA9IHhzdHJkdXAoYXJfbG9uZ19uYW1lcyArIGxvbmdfb2Zmc2V0KTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJLyogc2hvcnQgZmlsZW5hbWVzICovCisJCXR5cGVkLT5uYW1lID0geHN0cm5kdXAoYXIuZm9ybWF0dGVkLm5hbWUsIDE2KTsKKwl9CisKKwl0eXBlZC0+bmFtZVtzdHJjc3BuKHR5cGVkLT5uYW1lLCAiIC8iKV0gPSAnXDAnOworCisJaWYgKGFyY2hpdmVfaGFuZGxlLT5maWx0ZXIoYXJjaGl2ZV9oYW5kbGUpID09IEVYSVRfU1VDQ0VTUykgeworCQlhcmNoaXZlX2hhbmRsZS0+YWN0aW9uX2hlYWRlcih0eXBlZCk7CisjaWYgRU5BQkxFX0RQS0cgfHwgRU5BQkxFX0RQS0dfREVCCisJCWlmIChhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUpIHsKKwkJCXdoaWxlIChhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fYWN0aW9uX2RhdGFfc3ViYXJjaGl2ZShhcmNoaXZlX2hhbmRsZS0+ZHBrZ19fc3ViX2FyY2hpdmUpID09IEVYSVRfU1VDQ0VTUykKKwkJCQljb250aW51ZTsKKwkJfSBlbHNlCisjZW5kaWYKKwkJCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25fZGF0YShhcmNoaXZlX2hhbmRsZSk7CisJfSBlbHNlIHsKKwkJZGF0YV9za2lwKGFyY2hpdmVfaGFuZGxlKTsKKwl9CisKKwlhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0ICs9IHR5cGVkLT5zaXplOworCS8qIFNldCB0aGUgZmlsZSBwb2ludGVyIHRvIHRoZSBjb3JyZWN0IHNwb3QsIHdlIG1heSBoYXZlIGJlZW4gcmVhZGluZyBhIGNvbXByZXNzZWQgZmlsZSAqLworCWxzZWVrKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsIGFyY2hpdmVfaGFuZGxlLT5vZmZzZXQsIFNFRUtfU0VUKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2dldF9oZWFkZXJfY3Bpby5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX2NwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODYxZDFmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX2NwaW8uYwpAQCAtMCwwICsxLDE4NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBDb3B5cmlnaHQgMjAwMiBMYXVyZW5jZSBBbmRlcnNvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYmJfYXJjaGl2ZS5oIgorCit0eXBlZGVmIHN0cnVjdCBoYXJkbGlua3NfdCB7CisJc3RydWN0IGhhcmRsaW5rc190ICpuZXh0OworCWludCBpbm9kZTsgLyogVE9ETzogbXVzdCBtYXRjaCBtYWovbWluIHRvbyEgKi8KKwlpbnQgbW9kZSA7CisJaW50IG10aW1lOyAvKiBUaGVzZSB0aHJlZSBhcmUgdXNlZnVsIG9ubHkgaW4gY29ybmVyIGNhc2UgKi8KKwlpbnQgdWlkICA7IC8qIG9mIGhhcmRsaW5rcyB3aXRoIHplcm8gc2l6ZSBib2R5ICovCisJaW50IGdpZCAgOworCWNoYXIgbmFtZVsxXTsKK30gaGFyZGxpbmtzX3Q7CisKK2NoYXIgRkFTVF9GVU5DIGdldF9oZWFkZXJfY3BpbyhhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkKK3sKKwlmaWxlX2hlYWRlcl90ICpmaWxlX2hlYWRlciA9IGFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlcjsKKwljaGFyIGNwaW9faGVhZGVyWzExMF07CisJaW50IG5hbWVzaXplOworCWludCBtYWpvciwgbWlub3IsIG5saW5rLCBtb2RlLCBpbm9kZTsKKwl1bnNpZ25lZCBzaXplLCB1aWQsIGdpZCwgbXRpbWU7CisKKwkvKiBUaGVyZSBjYW4gYmUgcGFkZGluZyBiZWZvcmUgYXJjaGl2ZSBoZWFkZXIgKi8KKwlkYXRhX2FsaWduKGFyY2hpdmVfaGFuZGxlLCA0KTsKKworCXNpemUgPSBmdWxsX3JlYWQoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgY3Bpb19oZWFkZXIsIDExMCk7CisJaWYgKHNpemUgPT0gMCkgeworCQlnb3RvIGNyZWF0ZV9oYXJkbGlua3M7CisJfQorCWlmIChzaXplICE9IDExMCkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic2hvcnQgcmVhZCIpOworCX0KKwlhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0ICs9IDExMDsKKworCWlmICghaXNfcHJlZml4ZWRfd2l0aCgmY3Bpb19oZWFkZXJbMF0sICIwNzA3MCIpCisJIHx8IChjcGlvX2hlYWRlcls1XSAhPSAnMScgJiYgY3Bpb19oZWFkZXJbNV0gIT0gJzInKQorCSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5zdXBwb3J0ZWQgY3BpbyBmb3JtYXQsIHVzZSBuZXdjIG9yIGNyYyIpOworCX0KKworCWlmIChzc2NhbmYoY3Bpb19oZWFkZXIgKyA2LAorCQkJIiU4eCIgIiU4eCIgIiU4eCIgIiU4eCIKKwkJCSIlOHgiICIlOHgiICIlOHgiIC8qbWFqLG1pbjoqLyAiJSoxNmMiCisJCQkvKnJtYWoscm1pbjoqLyIlOHgiICIlOHgiICIlOHgiIC8qY2hrc3VtOiAiJSo4YyIqLywKKwkJCSZpbm9kZSwgJm1vZGUsICZ1aWQsICZnaWQsCisJCQkmbmxpbmssICZtdGltZSwgJnNpemUsCisJCQkmbWFqb3IsICZtaW5vciwgJm5hbWVzaXplKSAhPSAxMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImRhbWFnZWQgY3BpbyBmaWxlIik7CisJZmlsZV9oZWFkZXItPm1vZGUgPSBtb2RlOworCWZpbGVfaGVhZGVyLT51aWQgPSB1aWQ7CisJZmlsZV9oZWFkZXItPmdpZCA9IGdpZDsKKwlmaWxlX2hlYWRlci0+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+bmV4dDsKKwkJZnJlZShwKTsKKwl9CisKKwlyZXR1cm4gRVhJVF9GQUlMVVJFOyAvKiAiTm8gbW9yZSBmaWxlcyB0byBwcm9jZXNzIiAqLworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX3Rhci5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX3Rhci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNjg2NzMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2dldF9oZWFkZXJfdGFyLmMKQEAgLTAsMCArMSw0NTMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBGSVhNRToKKyAqICAgIEluIHByaXZpbGVnZWQgbW9kZSBpZiB1bmFtZSBhbmQgZ25hbWUgbWFwIHRvIGEgdWlkIGFuZCBnaWQgdGhlbiB1c2UgdGhlCisgKiAgICBtYXBwZWQgdmFsdWUgaW5zdGVhZCBvZiB0aGUgdWlkL2dpZCB2YWx1ZXMgaW4gdGFyIGhlYWRlcgorICoKKyAqIFJlZmVyZW5jZXM6CisgKiAgICBHTlUgdGFyIGFuZCBzdGFyIG1hbiBwYWdlcywKKyAqICAgIE9wZW5ncm91cCdzIHVzdGFyIGludGVyY2hhbmdlIGZvcm1hdCwKKyAqICAgIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvcGF4Lmh0bWwKKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJiYl9hcmNoaXZlLmgiCisKK3R5cGVkZWYgdWludDMyX3QgYWxpYXNlZF91aW50MzJfdCBGSVhfQUxJQVNJTkc7Cit0eXBlZGVmIG9mZl90ICAgIGFsaWFzZWRfb2ZmX3QgICAgRklYX0FMSUFTSU5HOworCisvKiBOQjogX0RFU1RST1lTXyBzdHJbbGVuXSBjaGFyYWN0ZXIhICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGdldE9jdGFsKGNoYXIgKnN0ciwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdjsKKwljaGFyICplbmQ7CisJLyogTkI6IGxlYWRpbmcgc3BhY2VzIGFyZSBhbGxvd2VkLiBVc2luZyBzdHJ0b3VsbCB0byBoYW5kbGUgdGhhdC4KKwkgKiBUaGUgZG93bnNpZGUgaXMgdGhhdCB3ZSBhY2NlcHQgZS5nLiAiLTEyMyIgdG9vIDooCisJICovCisJc3RyW2xlbl0gPSAnXDAnOworCXYgPSBzdHJ0b3VsbChzdHIsICZlbmQsIDgpOworCS8qIHN0ZDogIkVhY2ggbnVtZXJpYyBmaWVsZCBpcyB0ZXJtaW5hdGVkIGJ5IG9uZSBvciBtb3JlCisJICogPHNwYWNlPiBvciBOVUwgY2hhcmFjdGVycyIuIFdlIG11c3Qgc3VwcG9ydCAnICchICovCisJaWYgKCplbmQgIT0gJ1wwJyAmJiAqZW5kICE9ICcgJykgeworCQlpbnQ4X3QgZmlyc3QgPSBzdHJbMF07CisJCWlmICghKGZpcnN0ICYgMHg4MCkpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY29ycnVwdGVkIG9jdGFsIHZhbHVlIGluIHRhciBoZWFkZXIiKTsKKwkJLyoKKwkJICogR05VIHRhciB1c2VzICJiYXNlLTI1NiBlbmNvZGluZyIgZm9yIHZlcnkgbGFyZ2UgbnVtYmVycy4KKwkJICogRW5jb2RpbmcgaXMgYmluYXJ5LCB3aXRoIGhpZ2hlc3QgYml0IGFsd2F5cyBzZXQgYXMgYSBtYXJrZXIKKwkJICogYW5kIHNpZ24gaW4gbmV4dC1oaWdoZXN0IGJpdDoKKwkJICogODAgMDAgLi4gMDAgLSB6ZXJvCisJCSAqIGJmIGZmIC4uIGZmIC0gbGFyZ2VzdCBwb3NpdGl2ZSBudW1iZXIKKwkJICogZmYgZmYgLi4gZmYgLSBtaW51cyAxCisJCSAqIGMwIDAwIC4uIDAwIC0gc21hbGxlc3QgbmVnYXRpdmUgbnVtYmVyCisJCSAqCisJCSAqIEV4YW1wbGUgb2YgdGFyIGZpbGUgd2l0aCA4OTE0OTkzMTUzICgweDIxMzYwMDAwMSkgYnl0ZSBmaWxlLgorCQkgKiBGaWVsZCBzdGFydHMgYXQgb2Zmc2V0IDdjOgorCQkgKiAwMDA3MCAgMzAgMzAgMzAgMDAgMzAgMzAgMzAgMzAgIDMwIDMwIDMwIDAwIDgwIDAwIDAwIDAwICB8MDAwLjAwMDAwMDAuLi4uLnwKKwkJICogMDAwODAgIDAwIDAwIDAwIDAyIDEzIDYwIDAwIDAxICAzMSAzMSAzMSAzMiAzMCAzMyAzMyAzNiAgfC4uLi4uYC4uMTExMjAzMzZ8CisJCSAqCisJCSAqIE5COiB0YXJiYWxscyB3aXRoIE5FR0FUSVZFIHVuaXggdGltZXMgZW5jb2RlZCB0aGF0IHdheSB3ZXJlIHNlZW4hCisJCSAqLworCQkvKiBTaWduLWV4dGVuZCA3Yml0ICdmaXJzdCcgdG8gNjRiaXQgJ3YnICh0aGF0IGlzLCB1c2luZyA2dGggYml0IGFzIHNpZ24pOiAqLworCQlmaXJzdCA8PD0gMTsKKwkJZmlyc3QgPj49IDE7IC8qIG5vdyA3dGggYml0ID0gNnRoIGJpdCAqLworCQl2ID0gZmlyc3Q7ICAgLyogc2lnbi1leHRlbmQgOCBiaXRzIHRvIDY0ICovCisJCXdoaWxlICgtLWxlbiAhPSAwKQorCQkJdiA9ICh2IDw8IDgpICsgKHVpbnQ4X3QpICorK3N0cjsKKwl9CisJcmV0dXJuIHY7Cit9CisjZGVmaW5lIEdFVF9PQ1RBTChhKSBnZXRPY3RhbCgoYSksIHNpemVvZihhKSkKKworLyogImdsb2JhbCIgaXMgMCBvciAxICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX3BheF9oZHIoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUsIHVuc2lnbmVkIHN6LCBpbnQgZ2xvYmFsKQoreworCWNoYXIgKmJ1ZiwgKnA7CisJdW5zaWduZWQgYmxrX3N6OworCisJYmxrX3N6ID0gKHN6ICsgNTExKSAmICh+NTExKTsKKwlwID0gYnVmID0geG1hbGxvYyhibGtfc3ogKyAxKTsKKwl4cmVhZChhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCBidWYsIGJsa19zeik7CisJYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCArPSBibGtfc3o7CisKKwkvKiBwcmV2ZW50IGJiX3N0cnRvdSBmcm9tIHJ1bm5pbmcgb2ZmIHRoZSBidWZmZXIgKi8KKwlidWZbc3pdID0gJ1wwJzsKKworCXdoaWxlIChzeiAhPSAwKSB7CisJCWNoYXIgKmVuZCwgKnZhbHVlOworCQl1bnNpZ25lZCBsZW47CisKKwkJLyogRXZlcnkgcmVjb3JkIGhhcyB0aGlzIGZvcm1hdDogIkxFTiBOQU1FPVZBTFVFXG4iICovCisJCWxlbiA9IGJiX3N0cnRvdShwLCAmZW5kLCAxMCk7CisJCS8qIGV4cGVjdCBlcnJubyB0byBiZSBFSU5WQUwsIGJlY2F1c2UgdGhlIGNoYXJhY3RlcgorCQkgKiBmb2xsb3dpbmcgdGhlIGRpZ2l0cyBzaG91bGQgYmUgYSBzcGFjZQorCQkgKi8KKwkJcCArPSBsZW47CisJCXN6IC09IGxlbjsKKwkJaWYgKAorCQkvKiogKGludClzeiA8IDAgLSBub3QgZ29vZCBlbm91Z2ggZm9yIGh1Z2UgbWFsaWNpb3VzIFZBTFVFIG9mIDJeMzItMSAqLworCQkgICAgKGludCkoc3p8bGVuKSA8IDAgLyogdGhpcyB3b3JrcyAqLworCQkgfHwgbGVuID09IDAKKwkJIHx8IGVycm5vICE9IEVJTlZBTAorCQkgfHwgKmVuZCAhPSAnICcKKwkJKSB7CisJCQliYl9lcnJvcl9tc2coIm1hbGZvcm1lZCBleHRlbmRlZCBoZWFkZXIsIHNraXBwZWQiKTsKKwkJCS8vIE1vcmUgdmVyYm9zZSB2ZXJzaW9uOgorCQkJLy9iYl9lcnJvcl9tc2coIm1hbGZvcm1lZCBleHRlbmRlZCBoZWFkZXIgYXQgJSJPRkZfRk1UImQsIHNraXBwZWQiLAorCQkJLy8JCWFyY2hpdmVfaGFuZGxlLT5vZmZzZXQgLSAoc3ogKyBsZW4pKTsKKwkJCWJyZWFrOworCQl9CisJCS8qIG92ZXJ3cml0ZSB0aGUgdGVybWluYXRpbmcgbmV3bGluZSB3aXRoIE5VTAorCQkgKiAod2UgZG8gbm90IGJvdGhlciB0byBjaGVjayB0aGF0IGl0ICp3YXMqIGEgbmV3bGluZSkKKwkJICovCisJCXBbLTFdID0gJ1wwJzsKKwkJdmFsdWUgPSBlbmQgKyAxOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TCisJCWlmICghZ2xvYmFsICYmIGlzX3ByZWZpeGVkX3dpdGgodmFsdWUsICJwYXRoPSIpKSB7CisJCQl2YWx1ZSArPSBzaXplb2YoInBhdGg9IikgLSAxOworCQkJZnJlZShhcmNoaXZlX2hhbmRsZS0+dGFyX19sb25nbmFtZSk7CisJCQlhcmNoaXZlX2hhbmRsZS0+dGFyX19sb25nbmFtZSA9IHhzdHJkdXAodmFsdWUpOworCQkJY29udGludWU7CisJCX0KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX1NFTElOVVgKKwkJLyogU2NhbiBmb3IgU0VMaW51eCBjb250ZXh0cywgdmlhICJSSFQuc2VjdXJpdHkuc2VsaW51eCIga2V5d29yZC4KKwkJICogVGhpcyBpcyB3aGF0IFJlZCBIYXQncyBwYXRjaGVkIHZlcnNpb24gb2YgdGFyIHVzZXMuCisJCSAqLworIyBkZWZpbmUgU0VMSU5VWF9DT05URVhUX0tFWVdPUkQgIlJIVC5zZWN1cml0eS5zZWxpbnV4IgorCQlpZiAoaXNfcHJlZml4ZWRfd2l0aCh2YWx1ZSwgU0VMSU5VWF9DT05URVhUX0tFWVdPUkQiPSIpKSB7CisJCQl2YWx1ZSArPSBzaXplb2YoU0VMSU5VWF9DT05URVhUX0tFWVdPUkQiPSIpIC0gMTsKKwkJCWZyZWUoYXJjaGl2ZV9oYW5kbGUtPnRhcl9fc2N0eFtnbG9iYWxdKTsKKwkJCWFyY2hpdmVfaGFuZGxlLT50YXJfX3NjdHhbZ2xvYmFsXSA9IHhzdHJkdXAodmFsdWUpOworCQkJY29udGludWU7CisJCX0KKyNlbmRpZgorCX0KKworCWZyZWUoYnVmKTsKK30KKworY2hhciBGQVNUX0ZVTkMgZ2V0X2hlYWRlcl90YXIoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpCit7CisJZmlsZV9oZWFkZXJfdCAqZmlsZV9oZWFkZXIgPSBhcmNoaXZlX2hhbmRsZS0+ZmlsZV9oZWFkZXI7CisJc3RydWN0IHRhcl9oZWFkZXJfdCB0YXI7CisJY2hhciAqY3A7CisJaW50IGksIHN1bV91LCBzdW07CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX09MRFNVTl9DT01QQVRJQklMSVRZCisJaW50IHN1bV9zOworI2VuZGlmCisJaW50IHBhcnNlX25hbWVzOworCisJLyogT3VyICJwcml2YXRlIGRhdGEiICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TCisjIGRlZmluZSBwX2xvbmduYW1lIChhcmNoaXZlX2hhbmRsZS0+dGFyX19sb25nbmFtZSkKKyMgZGVmaW5lIHBfbGlua25hbWUgKGFyY2hpdmVfaGFuZGxlLT50YXJfX2xpbmtuYW1lKQorI2Vsc2UKKyMgZGVmaW5lIHBfbG9uZ25hbWUgMAorIyBkZWZpbmUgcF9saW5rbmFtZSAwCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9HTlVfRVhURU5TSU9OUyB8fCBFTkFCTEVfRkVBVFVSRV9UQVJfU0VMSU5VWAorIGFnYWluOgorI2VuZGlmCisJLyogQWxpZ24gaGVhZGVyICovCisJZGF0YV9hbGlnbihhcmNoaXZlX2hhbmRsZSwgNTEyKTsKKworIGFnYWluX2FmdGVyX2FsaWduOgorCisjaWYgRU5BQkxFX0RFU0tUT1AgfHwgRU5BQkxFX0ZFQVRVUkVfVEFSX0FVVE9ERVRFQ1QKKwkvKiB0byBwcmV2ZW50IG1pc2RldGVjdGlvbiBvZiBiejIgc2lnICovCisJKihhbGlhc2VkX3VpbnQzMl90KikmdGFyID0gMDsKKwlpID0gZnVsbF9yZWFkKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsICZ0YXIsIDUxMik7CisJLyogSWYgR05VIHRhciBzZWVzIEVPRiBpbiBhYm92ZSByZWFkLCBpdCBzYXlzOgorCSAqICJ0YXI6IEEgbG9uZSB6ZXJvIGJsb2NrIGF0IE4iLCB3aGVyZSBOID0ga2lsb2J5dGUKKwkgKiB3aGVyZSBFT0Ygd2FzIG1ldCAobm90IEVPRiBibG9jaywgYWN0dWFsIEVPRiEpLAorCSAqIGFuZCBleGl0cyB3aXRoIEVYSVRfU1VDQ0VTUy4KKwkgKiBXZSB3aWxsIG1pbWljIGV4aXQoRVhJVF9TVUNDRVNTKSwgYWx0aG91Z2ggd2Ugd2lsbCBub3QgbWltaWMKKwkgKiB0aGUgbWVzc2FnZSBhbmQgd2UgZG9uJ3QgY2hlY2sgd2hldGhlciB3ZSBpbmRlZWQKKwkgKiBzYXcgemVybyBibG9jayBkaXJlY3RseSBiZWZvcmUgdGhpcy4gKi8KKwlpZiAoaSA9PSAwKSB7CisJCWJiX2Vycm9yX21zZygic2hvcnQgcmVhZCIpOworCQkvKiB0aGlzIG1lcmVseSBzaWduYWxzIGVuZCBvZiBhcmNoaXZlLCBub3QgZXhpdCgxKTogKi8KKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisJaWYgKGkgIT0gNTEyKSB7CisJCUlGX0ZFQVRVUkVfVEFSX0FVVE9ERVRFQ1QoZ290byBhdXRvZGV0ZWN0OykKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInNob3J0IHJlYWQiKTsKKwl9CisKKyNlbHNlCisJaSA9IDUxMjsKKwl4cmVhZChhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCAmdGFyLCBpKTsKKyNlbmRpZgorCWFyY2hpdmVfaGFuZGxlLT5vZmZzZXQgKz0gaTsKKworCS8qIElmIHRoZXJlIGlzIG5vIGZpbGVuYW1lIGl0cyBhbiBlbXB0eSBoZWFkZXIgKi8KKwlpZiAodGFyLm5hbWVbMF0gPT0gMCAmJiB0YXIucHJlZml4WzBdID09IDApIHsKKwkJaWYgKGFyY2hpdmVfaGFuZGxlLT50YXJfX2VuZCkgeworCQkJLyogU2Vjb25kIGNvbnNlY3V0aXZlIGVtcHR5IGhlYWRlciAtIGVuZCBvZiBhcmNoaXZlLgorCQkJICogUmVhZCB1bnRpbCB0aGUgZW5kIHRvIGVtcHR5IHRoZSBwaXBlIGZyb20gZ3ogb3IgYnoyCisJCQkgKi8KKwkJCXdoaWxlIChmdWxsX3JlYWQoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgJnRhciwgNTEyKSA9PSA1MTIpCisJCQkJY29udGludWU7CisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOyAvKiAiZW5kIG9mIGFyY2hpdmUiICovCisJCX0KKwkJYXJjaGl2ZV9oYW5kbGUtPnRhcl9fZW5kID0gMTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsgLyogImRlY29kZWQgb25lIGhlYWRlciIgKi8KKwl9CisJYXJjaGl2ZV9oYW5kbGUtPnRhcl9fZW5kID0gMDsKKworCS8qIENoZWNrIGhlYWRlciBoYXMgdmFsaWQgbWFnaWMsICJ1c3RhciIgaXMgZm9yIHRoZSBwcm9wZXIgdGFyLAorCSAqIGZpdmUgTlVMcyBhcmUgZm9yIHRoZSBvbGQgdGFyIGZvcm1hdCAgKi8KKwlpZiAoIWlzX3ByZWZpeGVkX3dpdGgodGFyLm1hZ2ljLCAidXN0YXIiKQorCSAmJiAoIUVOQUJMRV9GRUFUVVJFX1RBUl9PTERHTlVfQ09NUEFUSUJJTElUWQorCSAgICAgfHwgbWVtY21wKHRhci5tYWdpYywgIlwwXDBcMFwwIiwgNSkgIT0gMCkKKwkpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfQVVUT0RFVEVDVAorIGF1dG9kZXRlY3Q6CisJCS8qIFR3byBkaWZmZXJlbnQgY2F1c2VzIGZvciBsc2VlaygpICE9IDA6CisJCSAqIHVuc2Vla2FibGUgZmQgKHdvdWxkIGxpa2UgdG8gc3VwcG9ydCB0aGF0IHRvbywgYnV0Li4uKSwKKwkJICogb3Igbm90IGZpcnN0IGJsb2NrIChmYWxzZSBwb3NpdGl2ZSwgaXQncyBub3QgLmd6Ly5iejIhKSAqLworCQlpZiAobHNlZWsoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgLWksIFNFRUtfQ1VSKSAhPSAwKQorCQkJZ290byBlcnI7CisJCWlmIChzZXR1cF91bnppcF9vbl9mZChhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCAvKmZhaWxfaWZfbm90X2NvbXByZXNzZWQ6Ki8gMCkgIT0gMCkKKyBlcnI6CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCB0YXIgbWFnaWMiKTsKKwkJYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCA9IDA7CisJCWdvdG8gYWdhaW5fYWZ0ZXJfYWxpZ247CisjZW5kaWYKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgdGFyIG1hZ2ljIik7CisJfQorCisJLyogRG8gY2hlY2tzdW0gb24gaGVhZGVycy4KKwkgKiBQT1NJWCBzYXlzIHRoYXQgY2hlY2tzdW0gaXMgZG9uZSBvbiB1bnNpZ25lZCBieXRlcywgYnV0CisJICogU3VuIGFuZCBIUC1VWCBnZXRzIGl0IHdyb25nLi4uIG1vcmUgZGV0YWlscyBpbgorCSAqIEdOVSB0YXIgc291cmNlLiAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9PTERTVU5fQ09NUEFUSUJJTElUWQorCXN1bV9zID0gJyAnICogc2l6ZW9mKHRhci5jaGtzdW0pOworI2VuZGlmCisJc3VtX3UgPSAnICcgKiBzaXplb2YodGFyLmNoa3N1bSk7CisJZm9yIChpID0gMDsgaSA8IDE0ODsgaSsrKSB7CisJCXN1bV91ICs9ICgodW5zaWduZWQgY2hhciopJnRhcilbaV07CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX09MRFNVTl9DT01QQVRJQklMSVRZCisJCXN1bV9zICs9ICgoc2lnbmVkIGNoYXIqKSZ0YXIpW2ldOworI2VuZGlmCisJfQorCWZvciAoaSA9IDE1NjsgaSA8IDUxMjsgaSsrKSB7CisJCXN1bV91ICs9ICgodW5zaWduZWQgY2hhciopJnRhcilbaV07CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX09MRFNVTl9DT01QQVRJQklMSVRZCisJCXN1bV9zICs9ICgoc2lnbmVkIGNoYXIqKSZ0YXIpW2ldOworI2VuZGlmCisJfQorCS8qIFRoaXMgZmllbGQgZG9lcyBub3QgbmVlZCBzcGVjaWFsIHRyZWF0bWVudCAoZ2V0T2N0YWwpICovCisJeworCQljaGFyICplbmRwOyAvKiBnY2MgbGlrZXMgdGVtcCB2YXIgZm9yICZlbmRwICovCisJCXN1bSA9IHN0cnRvdWwodGFyLmNoa3N1bSwgJmVuZHAsIDgpOworCQlpZiAoKCplbmRwICE9ICdcMCcgJiYgKmVuZHAgIT0gJyAnKQorCQkgfHwgKHN1bV91ICE9IHN1bSBJRl9GRUFUVVJFX1RBUl9PTERTVU5fQ09NUEFUSUJJTElUWSgmJiBzdW1fcyAhPSBzdW0pKQorCQkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIHRhciBoZWFkZXIgY2hlY2tzdW0iKTsKKwkJfQorCX0KKwkvKiBkb24ndCB1c2UgeHN0cnRvdWwsIHRhci5jaGtzdW0gbWF5IGhhdmUgbGVhZGluZyBzcGFjZXMgKi8KKwlzdW0gPSBzdHJ0b3VsKHRhci5jaGtzdW0sIE5VTEwsIDgpOworCWlmIChzdW1fdSAhPSBzdW0gSUZfRkVBVFVSRV9UQVJfT0xEU1VOX0NPTVBBVElCSUxJVFkoJiYgc3VtX3MgIT0gc3VtKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCB0YXIgaGVhZGVyIGNoZWNrc3VtIik7CisJfQorCisJLyogMCBpcyByZXNlcnZlZCBmb3IgaGlnaCBwZXJmIGZpbGUsIHRyZWF0IGFzIG5vcm1hbCBmaWxlICovCisJaWYgKCF0YXIudHlwZWZsYWcpIHRhci50eXBlZmxhZyA9ICcwJzsKKwlwYXJzZV9uYW1lcyA9ICh0YXIudHlwZWZsYWcgPj0gJzAnICYmIHRhci50eXBlZmxhZyA8PSAnNycpOworCisJLyogZ2V0T2N0YWwgdHJhc2hlcyBzdWJzZXF1ZW50IGZpZWxkLCB0aGVyZWZvcmUgd2UgY2FsbCBpdAorCSAqIG9uIGZpZWxkcyBpbiByZXZlcnNlIG9yZGVyICovCisJaWYgKHRhci5kZXZtYWpvclswXSkgeworCQljaGFyIHQgPSB0YXIucHJlZml4WzBdOworCQkvKiB3ZSB0cmFzaCBwcmVmaXhbMF0gaGVyZSwgYnV0IHdlIERPIG5lZWQgaXQgbGF0ZXIhICovCisJCXVuc2lnbmVkIG1pbm9yID0gR0VUX09DVEFMKHRhci5kZXZtaW5vcik7CisJCXVuc2lnbmVkIG1ham9yID0gR0VUX09DVEFMKHRhci5kZXZtYWpvcik7CisJCWZpbGVfaGVhZGVyLT5kZXZpY2UgPSBtYWtlZGV2KG1ham9yLCBtaW5vcik7CisJCXRhci5wcmVmaXhbMF0gPSB0OworCX0KKwlmaWxlX2hlYWRlci0+bGlua190YXJnZXQgPSBOVUxMOworCWlmICghcF9saW5rbmFtZSAmJiBwYXJzZV9uYW1lcyAmJiB0YXIubGlua25hbWVbMF0pIHsKKwkJZmlsZV9oZWFkZXItPmxpbmtfdGFyZ2V0ID0geHN0cm5kdXAodGFyLmxpbmtuYW1lLCBzaXplb2YodGFyLmxpbmtuYW1lKSk7CisJCS8qIEZJWE1FOiB3aGF0IGlmIHdlIGhhdmUgbm9uLWxpbmsgb2JqZWN0IHdpdGggbGlua190YXJnZXQ/ICovCisJCS8qIFdpbGwgbGlua190YXJnZXQgYmUgZnJlZSgpZWQ/ICovCisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9VTkFNRV9HTkFNRQorCWZpbGVfaGVhZGVyLT50YXJfX3VuYW1lID0gdGFyLnVuYW1lWzBdID8geHN0cm5kdXAodGFyLnVuYW1lLCBzaXplb2YodGFyLnVuYW1lKSkgOiBOVUxMOworCWZpbGVfaGVhZGVyLT50YXJfX2duYW1lID0gdGFyLmduYW1lWzBdID8geHN0cm5kdXAodGFyLmduYW1lLCBzaXplb2YodGFyLmduYW1lKSkgOiBOVUxMOworI2VuZGlmCisJZmlsZV9oZWFkZXItPm10aW1lID0gR0VUX09DVEFMKHRhci5tdGltZSk7CisJZmlsZV9oZWFkZXItPnNpemUgPSBHRVRfT0NUQUwodGFyLnNpemUpOworCWZpbGVfaGVhZGVyLT5naWQgPSBHRVRfT0NUQUwodGFyLmdpZCk7CisJZmlsZV9oZWFkZXItPnVpZCA9IEdFVF9PQ1RBTCh0YXIudWlkKTsKKwkvKiBTZXQgYml0cyAwLTExIG9mIHRoZSBmaWxlcyBtb2RlICovCisJZmlsZV9oZWFkZXItPm1vZGUgPSAwNzc3NyAmIEdFVF9PQ1RBTCh0YXIubW9kZSk7CisKKwlmaWxlX2hlYWRlci0+bmFtZSA9IE5VTEw7CisJaWYgKCFwX2xvbmduYW1lICYmIHBhcnNlX25hbWVzKSB7CisJCS8qIHdlIHRyYXNoIG1vZGVbMF0gaGVyZSwgaXQncyBvayAqLworCQkvL3Rhci5uYW1lW3NpemVvZih0YXIubmFtZSldID0gJ1wwJzsgLSBnY2MgNC4zLjAgd291bGQgY29tcGxhaW4KKwkJdGFyLm1vZGVbMF0gPSAnXDAnOworCQlpZiAodGFyLnByZWZpeFswXSkgeworCQkJLyogYW5kIHBhZGRpbmdbMF0gKi8KKwkJCS8vdGFyLnByZWZpeFtzaXplb2YodGFyLnByZWZpeCldID0gJ1wwJzsgLSBnY2MgNC4zLjAgd291bGQgY29tcGxhaW4KKwkJCXRhci5wYWRkaW5nWzBdID0gJ1wwJzsKKwkJCWZpbGVfaGVhZGVyLT5uYW1lID0gY29uY2F0X3BhdGhfZmlsZSh0YXIucHJlZml4LCB0YXIubmFtZSk7CisJCX0gZWxzZQorCQkJZmlsZV9oZWFkZXItPm5hbWUgPSB4c3RyZHVwKHRhci5uYW1lKTsKKwl9CisKKwkvKiBTZXQgYml0cyAxMi0xNSBvZiB0aGUgZmlsZXMgbW9kZSAqLworCS8qICh0eXBlZmxhZyB3YXMgbm90IHRyYXNoZWQgYmVjYXVzZSBjaGtzdW0gZG9lcyBub3QgdXNlIGdldE9jdGFsKSAqLworCXN3aXRjaCAodGFyLnR5cGVmbGFnKSB7CisJY2FzZSAnMSc6IC8qIGhhcmRsaW5rICovCisJCS8qIHdlIG1hcmsgaGFyZGxpbmtzIGFzIHJlZ3VsYXIgZmlsZXMgd2l0aCB6ZXJvIHNpemUgYW5kIGEgbGluayBuYW1lICovCisJCWZpbGVfaGVhZGVyLT5tb2RlIHw9IFNfSUZSRUc7CisJCS8qIG9uIHNpemUgb2YgbGluayBmaWVsZHMgZnJvbSBzdGFyKDQpCisJCSAqIC4uLiBGb3IgdGFyIGFyY2hpdmVzIHdyaXR0ZW4gYnkgcHJlIFBPU0lYLjEtMTk4OAorCQkgKiBpbXBsZW1lbnRhdGlvbnMsIHRoZSBzaXplIGZpZWxkIHVzdWFsbHkgY29udGFpbnMgdGhlIHNpemUgb2YKKwkJICogdGhlIGZpbGUgYW5kIG5lZWRzIHRvIGJlIGlnbm9yZWQgYXMgbm8gZGF0YSBtYXkgZm9sbG93IHRoaXMKKwkJICogaGVhZGVyIHR5cGUuICBGb3IgUE9TSVguMS0gMTk4OCBjb21wbGlhbnQgYXJjaGl2ZXMsIHRoZSBzaXplCisJCSAqIGZpZWxkIG5lZWRzIHRvIGJlIDAuICBGb3IgUE9TSVguMS0yMDAxIGNvbXBsaWFudCBhcmNoaXZlcywKKwkJICogdGhlIHNpemUgZmllbGQgbWF5IGJlIG5vbiB6ZXJvLCBpbmRpY2F0aW5nIHRoYXQgZmlsZSBkYXRhIGlzCisJCSAqIGluY2x1ZGVkIGluIHRoZSBhcmNoaXZlLgorCQkgKiBpLmU7IGFsd2F5cyBhc3N1bWUgdGhpcyBpcyB6ZXJvIGZvciBzYWZldHkuCisJCSAqLworCQlnb3RvIHNpemUwOworCWNhc2UgJzcnOgorCS8qIGNhc2UgMDogKi8KKwljYXNlICcwJzoKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfT0xER05VX0NPTVBBVElCSUxJVFkKKwkJaWYgKGxhc3RfY2hhcl9pcyhmaWxlX2hlYWRlci0+bmFtZSwgJy8nKSkgeworCQkJZ290byBzZXRfZGlyOworCQl9CisjZW5kaWYKKwkJZmlsZV9oZWFkZXItPm1vZGUgfD0gU19JRlJFRzsKKwkJYnJlYWs7CisJY2FzZSAnMic6CisJCWZpbGVfaGVhZGVyLT5tb2RlIHw9IFNfSUZMTks7CisJCS8qIGhhdmUgc2VlbiB0YXJiYWxscyB3aXRoIHNpemUgZmllbGQgY29udGFpbmluZworCQkgKiB0aGUgc2l6ZSBvZiB0aGUgbGluayB0YXJnZXQncyBuYW1lICovCisgc2l6ZTA6CisJCWZpbGVfaGVhZGVyLT5zaXplID0gMDsKKwkJYnJlYWs7CisJY2FzZSAnMyc6CisJCWZpbGVfaGVhZGVyLT5tb2RlIHw9IFNfSUZDSFI7CisJCWdvdG8gc2l6ZTA7IC8qIHBhcmFub2lhICovCisJY2FzZSAnNCc6CisJCWZpbGVfaGVhZGVyLT5tb2RlIHw9IFNfSUZCTEs7CisJCWdvdG8gc2l6ZTA7CisJY2FzZSAnNSc6CisgSUZfRkVBVFVSRV9UQVJfT0xER05VX0NPTVBBVElCSUxJVFkoc2V0X2RpcjopCisJCWZpbGVfaGVhZGVyLT5tb2RlIHw9IFNfSUZESVI7CisJCWdvdG8gc2l6ZTA7CisJY2FzZSAnNic6CisJCWZpbGVfaGVhZGVyLT5tb2RlIHw9IFNfSUZJRk87CisJCWdvdG8gc2l6ZTA7CisJY2FzZSAnZyc6CS8qIHBheCBnbG9iYWwgaGVhZGVyICovCisJY2FzZSAneCc6IHsJLyogcGF4IGV4dGVuZGVkIGhlYWRlciAqLworCQlpZiAoKHVvZmZfdClmaWxlX2hlYWRlci0+c2l6ZSA+IDB4ZmZmZmYpIC8qIHBhcmFub2lhICovCisJCQlnb3RvIHNraXBfZXh0X2hkcjsKKwkJcHJvY2Vzc19wYXhfaGRyKGFyY2hpdmVfaGFuZGxlLCBmaWxlX2hlYWRlci0+c2l6ZSwgKHRhci50eXBlZmxhZyA9PSAnZycpKTsKKwkJZ290byBhZ2Fpbl9hZnRlcl9hbGlnbjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfR05VX0VYVEVOU0lPTlMKKy8qIFNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvdGFyL21hbnVhbC9odG1sX25vZGUvRXh0ZW5zaW9ucy5odG1sICovCisJY2FzZSAnTCc6CisJCS8qIGZyZWU6IHBhcmFub2lhOiB0YXIgd2l0aCBzZXZlcmFsIGNvbnNlY3V0aXZlIGxvbmduYW1lcyAqLworCQlmcmVlKHBfbG9uZ25hbWUpOworCQkvKiBGb3IgcGFyYW5vaWEgcmVhc29ucyB3ZSBhbGxvY2F0ZSBleHRyYSBOVUwgY2hhciAqLworCQlwX2xvbmduYW1lID0geHphbGxvYyhmaWxlX2hlYWRlci0+c2l6ZSArIDEpOworCQkvKiBXZSByZWFkIEFTQ0laIHN0cmluZywgaW5jbHVkaW5nIE5VTCAqLworCQl4cmVhZChhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCBwX2xvbmduYW1lLCBmaWxlX2hlYWRlci0+c2l6ZSk7CisJCWFyY2hpdmVfaGFuZGxlLT5vZmZzZXQgKz0gZmlsZV9oZWFkZXItPnNpemU7CisJCS8qIHJldHVybiBnZXRfaGVhZGVyX3RhcihhcmNoaXZlX2hhbmRsZSk7ICovCisJCS8qIGdjYyA0LjEuMSBkaWRuJ3Qgb3B0aW1pemUgaXQgaW50byBqdW1wICovCisJCS8qIHNvIHdlIHdpbGwgZG8gaXQgb3Vyc2VsZiwgdGhpcyBhbHNvIHNhdmVzIHN0YWNrICovCisJCWdvdG8gYWdhaW47CisJY2FzZSAnSyc6CisJCWZyZWUocF9saW5rbmFtZSk7CisJCXBfbGlua25hbWUgPSB4emFsbG9jKGZpbGVfaGVhZGVyLT5zaXplICsgMSk7CisJCXhyZWFkKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsIHBfbGlua25hbWUsIGZpbGVfaGVhZGVyLT5zaXplKTsKKwkJYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCArPSBmaWxlX2hlYWRlci0+c2l6ZTsKKwkJLyogcmV0dXJuIGdldF9oZWFkZXJfdGFyKGFyY2hpdmVfaGFuZGxlKTsgKi8KKwkJZ290byBhZ2FpbjsKKy8qCisgKgljYXNlICdTJzoJLy8gU3BhcnNlIGZpbGUKKyAqIFdhcyBzZWVuIGluIHRoZSB3aWxkLiBOb3Qgc3VwcG9ydGVkICh5ZXQ/KS4KKyAqIFNlZSBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL3Rhci9tYW51YWwvaHRtbF9zZWN0aW9uL3Rhcl85Mi5odG1sCisgKiBmb3IgdGhlIGZvcm1hdC4gKEFuICJPbGQgR05VIEZvcm1hdCIgd2FzIHNlZW4sIG5vdCBQQVggZm9ybWF0cykuCisgKi8KKy8vCWNhc2UgJ0QnOgkvKiBHTlUgZHVtcCBkaXIgKi8KKy8vCWNhc2UgJ00nOgkvKiBDb250aW51YXRpb24gb2YgbXVsdGkgdm9sdW1lIGFyY2hpdmUgKi8KKy8vCWNhc2UgJ04nOgkvKiBPbGQgR05VIGZvciBuYW1lcyA+IDEwMCBjaGFyYWN0ZXJzICovCisvLwljYXNlICdWJzoJLyogVm9sdW1lIGhlYWRlciAqLworI2VuZGlmCisJfQorIHNraXBfZXh0X2hkcjoKKwl7CisJCW9mZl90IHN6OworCQliYl9lcnJvcl9tc2coIndhcm5pbmc6IHNraXBwaW5nIGhlYWRlciAnJWMnIiwgdGFyLnR5cGVmbGFnKTsKKwkJc3ogPSAoZmlsZV9oZWFkZXItPnNpemUgKyA1MTEpICYgfihvZmZfdCk1MTE7CisJCWFyY2hpdmVfaGFuZGxlLT5vZmZzZXQgKz0gc3o7CisJCXN6ID4+PSA5OyAvKiBzeiAvPSA1MTIgYnV0IHcvbyBjb250b3J0aW9ucyBmb3Igc2lnbmVkIGRpdiAqLworCQl3aGlsZSAoc3otLSkKKwkJCXhyZWFkKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsICZ0YXIsIDUxMik7CisJCS8qIHJldHVybiBnZXRfaGVhZGVyX3RhcihhcmNoaXZlX2hhbmRsZSk7ICovCisJCWdvdG8gYWdhaW5fYWZ0ZXJfYWxpZ247CisJfQorCWRlZmF1bHQ6CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duIHR5cGVmbGFnOiAweCV4IiwgdGFyLnR5cGVmbGFnKTsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfR05VX0VYVEVOU0lPTlMKKwlpZiAocF9sb25nbmFtZSkgeworCQlmaWxlX2hlYWRlci0+bmFtZSA9IHBfbG9uZ25hbWU7CisJCXBfbG9uZ25hbWUgPSBOVUxMOworCX0KKwlpZiAocF9saW5rbmFtZSkgeworCQlmaWxlX2hlYWRlci0+bGlua190YXJnZXQgPSBwX2xpbmtuYW1lOworCQlwX2xpbmtuYW1lID0gTlVMTDsKKwl9CisjZW5kaWYKKworCS8qIEV2ZXJ5dGhpbmcgdXAgdG8gYW5kIGluY2x1ZGluZyBsYXN0ICIuLiIgY29tcG9uZW50IGlzIHN0cmlwcGVkICovCisJb3ZlcmxhcHBpbmdfc3RyY3B5KGZpbGVfaGVhZGVyLT5uYW1lLCBzdHJpcF91bnNhZmVfcHJlZml4KGZpbGVfaGVhZGVyLT5uYW1lKSk7CisKKwkvKiBTdHJpcCB0cmFpbGluZyAnLycgaW4gZGlyZWN0b3JpZXMgKi8KKwkvKiBNdXN0IGJlIGRvbmUgYWZ0ZXIgbW9kZSBpcyBzZXQgYXMgJy8nIGlzIHVzZWQgdG8gY2hlY2sgaWYgaXQncyBhIGRpcmVjdG9yeSAqLworCWNwID0gbGFzdF9jaGFyX2lzKGZpbGVfaGVhZGVyLT5uYW1lLCAnLycpOworCisJaWYgKGFyY2hpdmVfaGFuZGxlLT5maWx0ZXIoYXJjaGl2ZV9oYW5kbGUpID09IEVYSVRfU1VDQ0VTUykgeworCQlhcmNoaXZlX2hhbmRsZS0+YWN0aW9uX2hlYWRlcigvKmFyY2hpdmVfaGFuZGxlLT4qLyBmaWxlX2hlYWRlcik7CisJCS8qIE5vdGUgdGhhdCB3ZSBraWxsIHRoZSAnLycgb25seSBhZnRlciBhY3Rpb25faGVhZGVyKCkgKi8KKwkJLyogKGxpa2UgR05VIHRhciAxLjE1LjE6IHZlcmJvc2UgbW9kZSBvdXRwdXRzICJkaXIvZGlyLyIpICovCisJCWlmIChjcCkKKwkJCSpjcCA9ICdcMCc7CisJCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25fZGF0YShhcmNoaXZlX2hhbmRsZSk7CisJCWlmIChhcmNoaXZlX2hhbmRsZS0+YWNjZXB0IHx8IGFyY2hpdmVfaGFuZGxlLT5yZWplY3QKKwkJIHx8IChhcmNoaXZlX2hhbmRsZS0+YWhfZmxhZ3MgJiBBUkNISVZFX1JFTUVNQkVSX05BTUVTKQorCQkpIHsKKwkJCWxsaXN0X2FkZF90bygmYXJjaGl2ZV9oYW5kbGUtPnBhc3NlZCwgZmlsZV9oZWFkZXItPm5hbWUpOworCQl9IGVsc2UgLyogQ2FsbGVyIGlzbid0IGludGVyZXN0ZWQgaW4gbGlzdCBvZiB1bnBhY2tlZCBmaWxlcyAqLworCQkJZnJlZShmaWxlX2hlYWRlci0+bmFtZSk7CisJfSBlbHNlIHsKKwkJZGF0YV9za2lwKGFyY2hpdmVfaGFuZGxlKTsKKwkJZnJlZShmaWxlX2hlYWRlci0+bmFtZSk7CisJfQorCWFyY2hpdmVfaGFuZGxlLT5vZmZzZXQgKz0gZmlsZV9oZWFkZXItPnNpemU7CisKKwlmcmVlKGZpbGVfaGVhZGVyLT5saW5rX3RhcmdldCk7CisJLyogRG8gbm90IGZyZWUoZmlsZV9oZWFkZXItPm5hbWUpIQorCSAqIEl0IG1pZ2h0IGJlIGluc2VydGVkIGluIGFyY2hpdmVfaGFuZGxlLT5wYXNzZWQgLSBzZWUgYWJvdmUgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfVU5BTUVfR05BTUUKKwlmcmVlKGZpbGVfaGVhZGVyLT50YXJfX3VuYW1lKTsKKwlmcmVlKGZpbGVfaGVhZGVyLT50YXJfX2duYW1lKTsKKyNlbmRpZgorCXJldHVybiBFWElUX1NVQ0NFU1M7IC8qICJkZWNvZGVkIG9uZSBoZWFkZXIiICovCit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2dldF9oZWFkZXJfdGFyX2J6Mi5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX3Rhcl9iejIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGY3OGE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX3Rhcl9iejIuYwpAQCAtMCwwICsxLDIxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImJiX2FyY2hpdmUuaCIKKworY2hhciBGQVNUX0ZVTkMgZ2V0X2hlYWRlcl90YXJfYnoyKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKQoreworCS8qIENhbid0IGxzZWVrIG92ZXIgcGlwZXMgKi8KKwlhcmNoaXZlX2hhbmRsZS0+c2VlayA9IHNlZWtfYnlfcmVhZDsKKworCWZvcmtfdHJhbnNmb3JtZXJfd2l0aF9zaWcoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgdW5wYWNrX2J6Ml9zdHJlYW0sICJidW56aXAyIik7CisJYXJjaGl2ZV9oYW5kbGUtPm9mZnNldCA9IDA7CisJd2hpbGUgKGdldF9oZWFkZXJfdGFyKGFyY2hpdmVfaGFuZGxlKSA9PSBFWElUX1NVQ0NFU1MpCisJCWNvbnRpbnVlOworCisJLyogQ2FuIG9ubHkgZG8gb25lIGZpbGUgYXQgYSB0aW1lICovCisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvZ2V0X2hlYWRlcl90YXJfZ3ouYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvZ2V0X2hlYWRlcl90YXJfZ3ouYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTFmNTAzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX3Rhcl9nei5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYmJfYXJjaGl2ZS5oIgorCitjaGFyIEZBU1RfRlVOQyBnZXRfaGVhZGVyX3Rhcl9neihhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkKK3sKKwkvKiBDYW4ndCBsc2VlayBvdmVyIHBpcGVzICovCisJYXJjaGl2ZV9oYW5kbGUtPnNlZWsgPSBzZWVrX2J5X3JlYWQ7CisKKwlmb3JrX3RyYW5zZm9ybWVyX3dpdGhfc2lnKGFyY2hpdmVfaGFuZGxlLT5zcmNfZmQsIHVucGFja19nel9zdHJlYW0sICJndW56aXAiKTsKKwlhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0ID0gMDsKKwl3aGlsZSAoZ2V0X2hlYWRlcl90YXIoYXJjaGl2ZV9oYW5kbGUpID09IEVYSVRfU1VDQ0VTUykKKwkJY29udGludWU7CisKKwkvKiBDYW4gb25seSBkbyBvbmUgZmlsZSBhdCBhIHRpbWUgKi8KKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX3Rhcl9sem1hLmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2dldF9oZWFkZXJfdGFyX2x6bWEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjI4Y2JjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX3Rhcl9sem1hLmMKQEAgLTAsMCArMSwyNCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU21hbGwgbHptYSBkZWZsYXRlIGltcGxlbWVudGF0aW9uLgorICogQ29weXJpZ2h0IChDKSAyMDA2ICBBdXJlbGllbiBKYWNvYnMgPGF1cmVsQGdudWFnZS5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJiYl9hcmNoaXZlLmgiCisKK2NoYXIgRkFTVF9GVU5DIGdldF9oZWFkZXJfdGFyX2x6bWEoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpCit7CisJLyogQ2FuJ3QgbHNlZWsgb3ZlciBwaXBlcyAqLworCWFyY2hpdmVfaGFuZGxlLT5zZWVrID0gc2Vla19ieV9yZWFkOworCisJZm9ya190cmFuc2Zvcm1lcl93aXRoX3NpZyhhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCB1bnBhY2tfbHptYV9zdHJlYW0sICJ1bmx6bWEiKTsKKwlhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0ID0gMDsKKwl3aGlsZSAoZ2V0X2hlYWRlcl90YXIoYXJjaGl2ZV9oYW5kbGUpID09IEVYSVRfU1VDQ0VTUykKKwkJY29udGludWU7CisKKwkvKiBDYW4gb25seSBkbyBvbmUgZmlsZSBhdCBhIHRpbWUgKi8KKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX3Rhcl94ei5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9nZXRfaGVhZGVyX3Rhcl94ei5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiZjNiM2IKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2dldF9oZWFkZXJfdGFyX3h6LmMKQEAgLTAsMCArMSwyMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJiYl9hcmNoaXZlLmgiCisKK2NoYXIgRkFTVF9GVU5DIGdldF9oZWFkZXJfdGFyX3h6KGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKQoreworCS8qIENhbid0IGxzZWVrIG92ZXIgcGlwZXMgKi8KKwlhcmNoaXZlX2hhbmRsZS0+c2VlayA9IHNlZWtfYnlfcmVhZDsKKworCWZvcmtfdHJhbnNmb3JtZXJfd2l0aF9zaWcoYXJjaGl2ZV9oYW5kbGUtPnNyY19mZCwgdW5wYWNrX3h6X3N0cmVhbSwgInVueHoiKTsKKwlhcmNoaXZlX2hhbmRsZS0+b2Zmc2V0ID0gMDsKKwl3aGlsZSAoZ2V0X2hlYWRlcl90YXIoYXJjaGl2ZV9oYW5kbGUpID09IEVYSVRfU1VDQ0VTUykKKwkJY29udGludWU7CisKKwkvKiBDYW4gb25seSBkbyBvbmUgZmlsZSBhdCBhIHRpbWUgKi8KKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9oZWFkZXJfbGlzdC5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9oZWFkZXJfbGlzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MjFhYTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2hlYWRlcl9saXN0LmMKQEAgLTAsMCArMSwxMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYmJfYXJjaGl2ZS5oIgorCit2b2lkIEZBU1RfRlVOQyBoZWFkZXJfbGlzdChjb25zdCBmaWxlX2hlYWRlcl90ICpmaWxlX2hlYWRlcikKK3sKKy8vVE9ETzogY3BpbyAtdnAgRElSIHNob3VsZCBvdXRwdXQgIkRJUi9OQU1FIiwgbm90IGp1c3QgIk5BTUUiICovCisJcHV0cyhmaWxlX2hlYWRlci0+bmFtZSk7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2hlYWRlcl9za2lwLmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2hlYWRlcl9za2lwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU5ODdiZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvaGVhZGVyX3NraXAuYwpAQCAtMCwwICsxLDEwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJiYl9hcmNoaXZlLmgiCisKK3ZvaWQgRkFTVF9GVU5DIGhlYWRlcl9za2lwKGNvbnN0IGZpbGVfaGVhZGVyX3QgKmZpbGVfaGVhZGVyIFVOVVNFRF9QQVJBTSkKK3sKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvaGVhZGVyX3ZlcmJvc2VfbGlzdC5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9oZWFkZXJfdmVyYm9zZV9saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdkZDgyMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvaGVhZGVyX3ZlcmJvc2VfbGlzdC5jCkBAIC0wLDAgKzEsNjkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYmJfYXJjaGl2ZS5oIgorCit2b2lkIEZBU1RfRlVOQyBoZWFkZXJfdmVyYm9zZV9saXN0KGNvbnN0IGZpbGVfaGVhZGVyX3QgKmZpbGVfaGVhZGVyKQoreworCXN0cnVjdCB0bSB0bV90aW1lOworCXN0cnVjdCB0bSAqcHRtID0gJnRtX3RpbWU7IC8vbG9jYWx0aW1lKCZmaWxlX2hlYWRlci0+bXRpbWUpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FCisJY2hhciB1aWRbc2l6ZW9mKGludCkqMyArIDJdOworCS8qY2hhciBnaWRbc2l6ZW9mKGludCkqMyArIDJdOyovCisJY2hhciAqdXNlcjsKKwljaGFyICpncm91cDsKKworCWxvY2FsdGltZV9yKCZmaWxlX2hlYWRlci0+bXRpbWUsIHB0bSk7CisKKwl1c2VyID0gZmlsZV9oZWFkZXItPnRhcl9fdW5hbWU7CisJaWYgKHVzZXIgPT0gTlVMTCkgeworCQlzcHJpbnRmKHVpZCwgIiV1IiwgKHVuc2lnbmVkKWZpbGVfaGVhZGVyLT51aWQpOworCQl1c2VyID0gdWlkOworCX0KKwlncm91cCA9IGZpbGVfaGVhZGVyLT50YXJfX2duYW1lOworCWlmIChncm91cCA9PSBOVUxMKSB7CisJCS8qc3ByaW50ZihnaWQsICIldSIsICh1bnNpZ25lZClmaWxlX2hlYWRlci0+Z2lkKTsqLworCQlncm91cCA9IHV0b2EoZmlsZV9oZWFkZXItPmdpZCk7CisJfQorCXByaW50ZigiJXMgJXMvJXMgJTkiT0ZGX0ZNVCJ1ICU0dS0lMDJ1LSUwMnUgJTAydTolMDJ1OiUwMnUgJXMiLAorCQliYl9tb2RlX3N0cmluZyhmaWxlX2hlYWRlci0+bW9kZSksCisJCXVzZXIsCisJCWdyb3VwLAorCQlmaWxlX2hlYWRlci0+c2l6ZSwKKwkJMTkwMCArIHB0bS0+dG1feWVhciwKKwkJMSArIHB0bS0+dG1fbW9uLAorCQlwdG0tPnRtX21kYXksCisJCXB0bS0+dG1faG91ciwKKwkJcHRtLT50bV9taW4sCisJCXB0bS0+dG1fc2VjLAorCQlmaWxlX2hlYWRlci0+bmFtZSk7CisKKyNlbHNlIC8qICFGRUFUVVJFX1RBUl9VTkFNRV9HTkFNRSAqLworCisJbG9jYWx0aW1lX3IoJmZpbGVfaGVhZGVyLT5tdGltZSwgcHRtKTsKKworCXByaW50ZigiJXMgJXUvJXUgJTkiT0ZGX0ZNVCJ1ICU0dS0lMDJ1LSUwMnUgJTAydTolMDJ1OiUwMnUgJXMiLAorCQliYl9tb2RlX3N0cmluZyhmaWxlX2hlYWRlci0+bW9kZSksCisJCSh1bnNpZ25lZClmaWxlX2hlYWRlci0+dWlkLAorCQkodW5zaWduZWQpZmlsZV9oZWFkZXItPmdpZCwKKwkJZmlsZV9oZWFkZXItPnNpemUsCisJCTE5MDAgKyBwdG0tPnRtX3llYXIsCisJCTEgKyBwdG0tPnRtX21vbiwKKwkJcHRtLT50bV9tZGF5LAorCQlwdG0tPnRtX2hvdXIsCisJCXB0bS0+dG1fbWluLAorCQlwdG0tPnRtX3NlYywKKwkJZmlsZV9oZWFkZXItPm5hbWUpOworCisjZW5kaWYgLyogRkVBVFVSRV9UQVJfVU5BTUVfR05BTUUgKi8KKworCS8qIE5COiBHTlUgdGFyIHNob3dzICItPiIgZm9yIHN5bWxpbmtzIGFuZCAibGluayB0byIgZm9yIGhhcmRsaW5rcyAqLworCWlmIChmaWxlX2hlYWRlci0+bGlua190YXJnZXQpIHsKKwkJcHJpbnRmKCIgLT4gJXMiLCBmaWxlX2hlYWRlci0+bGlua190YXJnZXQpOworCX0KKwliYl9wdXRjaGFyKCdcbicpOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9pbml0X2hhbmRsZS5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9pbml0X2hhbmRsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYWUwNmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2luaXRfaGFuZGxlLmMKQEAgLTAsMCArMSwyMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJiYl9hcmNoaXZlLmgiCisKK2FyY2hpdmVfaGFuZGxlX3QqIEZBU1RfRlVOQyBpbml0X2hhbmRsZSh2b2lkKQoreworCWFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlOworCisJLyogSW5pdGlhbGl6ZSBkZWZhdWx0IHZhbHVlcyAqLworCWFyY2hpdmVfaGFuZGxlID0geHphbGxvYyhzaXplb2YoYXJjaGl2ZV9oYW5kbGVfdCkpOworCWFyY2hpdmVfaGFuZGxlLT5maWxlX2hlYWRlciA9IHh6YWxsb2Moc2l6ZW9mKGZpbGVfaGVhZGVyX3QpKTsKKwlhcmNoaXZlX2hhbmRsZS0+YWN0aW9uX2hlYWRlciA9IGhlYWRlcl9za2lwOworCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25fZGF0YSA9IGRhdGFfc2tpcDsKKwlhcmNoaXZlX2hhbmRsZS0+ZmlsdGVyID0gZmlsdGVyX2FjY2VwdF9hbGw7CisJYXJjaGl2ZV9oYW5kbGUtPnNlZWsgPSBzZWVrX2J5X2p1bXA7CisKKwlyZXR1cm4gYXJjaGl2ZV9oYW5kbGU7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2xpYmx6by5oIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9saWJsem8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTk2NjIwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9saWJsem8uaApAQCAtMCwwICsxLDk1IEBACisvKgorICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYuLjIwMDggTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworI2luY2x1ZGUgImxpYmx6b19pbnRlcmZhY2UuaCIKKworLyogbHpvLTIuMDMvc3JjL2NvbmZpZzF4LmggKi8KKyNkZWZpbmUgTTJfTUlOX0xFTiAgICAgIDMKKyNkZWZpbmUgTTJfTUFYX0xFTiAgICAgIDgKKyNkZWZpbmUgTTNfTUFYX0xFTiAgICAgIDMzCisjZGVmaW5lIE00X01BWF9MRU4gICAgICA5CisjZGVmaW5lIE0xX01BWF9PRkZTRVQgICAweDA0MDAKKyNkZWZpbmUgTTJfTUFYX09GRlNFVCAgIDB4MDgwMAorI2RlZmluZSBNM19NQVhfT0ZGU0VUICAgMHg0MDAwCisjZGVmaW5lIE00X01BWF9PRkZTRVQgICAweGJmZmYKKyNkZWZpbmUgTTFfTUFSS0VSICAgICAgIDAKKyNkZWZpbmUgTTNfTUFSS0VSICAgICAgIDMyCisjZGVmaW5lIE00X01BUktFUiAgICAgICAxNgorCisjZGVmaW5lIE1YX01BWF9PRkZTRVQgICAoTTFfTUFYX09GRlNFVCArIE0yX01BWF9PRkZTRVQpCisjZGVmaW5lIE1JTl9MT09LQUhFQUQgICAoTTJfTUFYX0xFTiArIDEpCisKKyNkZWZpbmUgTFpPX0VPRl9DT0RFCisKKy8qIGx6by0yLjAzL3NyYy9sem9fZGljdC5oICovCisjZGVmaW5lIEdJTkRFWChtX3BvcyxtX29mZixkaWN0LGRpbmRleCxpbikgICAgbV9wb3MgPSBkaWN0W2RpbmRleF0KKyNkZWZpbmUgRFgyKHAsczEsczIpIFwKKyAgICAgICAgKCgoKCh1bnNpZ25lZCkoKHApWzJdKSA8PCAoczIpKSBeIChwKVsxXSkgPDwgKHMxKSkgXiAocClbMF0pCisvLyNkZWZpbmUgREEzKHAsczEsczIsczMpICgoREEyKChwKSsxLHMyLHMzKSA8PCAoczEpKSArIChwKVswXSkKKy8vI2RlZmluZSBEUzMocCxzMSxzMixzMykgKChEUzIoKHApKzEsczIsczMpIDw8IChzMSkpIC0gKHApWzBdKQorI2RlZmluZSBEWDMocCxzMSxzMixzMykgKChEWDIoKHApKzEsczIsczMpIDw8IChzMSkpIF4gKHApWzBdKQorCisjZGVmaW5lIERfU0laRSAgICAgICAgKDFVIDw8IERfQklUUykKKyNkZWZpbmUgRF9NQVNLICAgICAgICAoKDFVIDw8IERfQklUUykgLSAxKQorI2RlZmluZSBEX0hJR0ggICAgICAgICgoRF9NQVNLID4+IDEpICsgMSkKKworI2RlZmluZSBMWk9fQ0hFQ0tfTVBPU19OT05fREVUKG1fcG9zLG1fb2ZmLGluLGlwLG1heF9vZmZzZXQpIFwKKyAgICAoIFwKKyAgICAgICAgbV9wb3MgPSBpcCAtICh1bnNpZ25lZCkoaXAgLSBtX3BvcyksIFwKKyAgICAgICAgKCh1aW50cHRyX3QpbV9wb3MgPCAodWludHB0cl90KWluIFwKKwl8fCAobV9vZmYgPSAodW5zaWduZWQpKGlwIC0gbV9wb3MpKSA8PSAwIFwKKwl8fCBtX29mZiA+IG1heF9vZmZzZXQpIFwKKyAgICApCisKKyNkZWZpbmUgREVOVFJZKHAsaW4pICAgICAgICAgICAgICAgICAgICAgIChwKQorI2RlZmluZSBVUERBVEVfSShkaWN0LGRydW4saW5kZXgscCxpbikgICAgZGljdFtpbmRleF0gPSBERU5UUlkocCxpbikKKworI2RlZmluZSBETVModixzKSAgKCh1bnNpZ25lZCkgKCgodikgJiAoRF9NQVNLID4+IChzKSkpIDw8IChzKSkpCisjZGVmaW5lIERNKHYpICAgICAoKHVuc2lnbmVkKSAoKHYpICYgRF9NQVNLKSkKKyNkZWZpbmUgRE1VTChhLGIpICgodW5zaWduZWQpICgoYSkgKiAoYikpKQorCisvKiBsem8tMi4wMy9zcmMvbHpvX3B0ci5oICovCisjZGVmaW5lIHBkKGEsYikgICgodW5zaWduZWQpKChhKS0oYikpKQorCisjICAgIGRlZmluZSBURVNUX0lQICAgICAgICAgICAgIChpcCA8IGlwX2VuZCkKKyMgICAgZGVmaW5lIE5FRURfSVAoeCkgXAorICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkoaXBfZW5kIC0gaXApIDwgKHVuc2lnbmVkKSh4KSkgIGdvdG8gaW5wdXRfb3ZlcnJ1bgorIyAgICBkZWZpbmUgVEVTVF9JVih4KSAgICAgICAgICBpZiAoKHgpID4gKHVuc2lnbmVkKTAgLSAoNTExKSkgZ290byBpbnB1dF9vdmVycnVuCisKKyMgICAgdW5kZWYgVEVTVF9PUCAgICAgICAgICAgICAgLyogZG9uJ3QgbmVlZCBib3RoIG9mIHRoZSB0ZXN0cyBoZXJlICovCisjICAgIGRlZmluZSBURVNUX09QICAgICAgICAgICAgIDEKKyMgICAgZGVmaW5lIE5FRURfT1AoeCkgXAorICAgICAgICAgICAgaWYgKCh1bnNpZ25lZCkob3BfZW5kIC0gb3ApIDwgKHVuc2lnbmVkKSh4KSkgIGdvdG8gb3V0cHV0X292ZXJydW4KKyMgICAgZGVmaW5lIFRFU1RfT1YoeCkgICAgICAgICAgaWYgKCh4KSA+ICh1bnNpZ25lZCkwIC0gKDUxMSkpIGdvdG8gb3V0cHV0X292ZXJydW4KKworI2RlZmluZSBIQVZFX0FOWV9PUCAxCisKKy8vI2lmIGRlZmluZWQoTFpPX1RFU1RfT1ZFUlJVTl9MT09LQkVISU5EKQorIyAgZGVmaW5lIFRFU1RfTEIobV9wb3MpICAgICAgICBpZiAobV9wb3MgPCBvdXQgfHwgbV9wb3MgPj0gb3ApIGdvdG8gbG9va2JlaGluZF9vdmVycnVuCisvLyMgIGRlZmluZSBURVNUX0xCTyhtX3BvcyxvKSAgICAgaWYgKG1fcG9zIDwgb3V0IHx8IG1fcG9zID49IG9wIC0gKG8pKSBnb3RvIGxvb2tiZWhpbmRfb3ZlcnJ1bgorLy8jZWxzZQorLy8jICBkZWZpbmUgVEVTVF9MQihtX3BvcykgICAgICAgICgodm9pZCkgMCkKKy8vIyAgZGVmaW5lIFRFU1RfTEJPKG1fcG9zLG8pICAgICAoKHZvaWQpIDApCisvLyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9sem8xeF8xLmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2x6bzF4XzEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODg4Mzk4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9sem8xeF8xLmMKQEAgLTAsMCArMSwzNSBAQAorLyogTFpPMVgtMSBjb21wcmVzc2lvbgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTFpPIHJlYWwtdGltZSBkYXRhIGNvbXByZXNzaW9uIGxpYnJhcnkuCisKKyAgIENvcHlyaWdodCAoQykgMTk5Ni4uMjAwOCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBBbGwgUmlnaHRzIFJlc2VydmVkLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lciA8bWFya3VzQG9iZXJodW1lci5jb20+CisgICBodHRwOi8vd3d3Lm9iZXJodW1lci5jb20vb3BlbnNvdXJjZS9sem8vCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCisgICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgorICAgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBMWk8gbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoZSBMWk8gbGlicmFyeTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuCisgICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgICA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibGlibHpvLmgiCisKKyNkZWZpbmUgRF9CSVRTICAgICAgICAgIDE0CisjZGVmaW5lIERfSU5ERVgxKGQscCkgICBkID0gRE0oRE1VTCgweDIxLERYMyhwLDUsNSw2KSkgPj4gNSkKKyNkZWZpbmUgRF9JTkRFWDIoZCxwKSAgIGQgPSAoZCAmIChEX01BU0sgJiAweDdmZikpIF4gKERfSElHSCB8IDB4MWYpCisKKyNkZWZpbmUgRE9fQ09NUFJFU1MgICAgIGx6bzF4XzFfY29tcHJlc3MKKworI2luY2x1ZGUgImx6bzF4X2MuYyIKZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvbHpvMXhfMW8uYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvbHpvMXhfMW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzYxMjUzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9sem8xeF8xby5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIExaTzFYLTEoMTUpIGNvbXByZXNzaW9uCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2Li4yMDA4IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJsaWJsem8uaCIKKworI2RlZmluZSBEX0JJVFMgICAgICAgICAgMTUKKyNkZWZpbmUgRF9JTkRFWDEoZCxwKSAgIGQgPSBETShETVVMKDB4MjEsRFgzKHAsNSw1LDYpKSA+PiA1KQorI2RlZmluZSBEX0lOREVYMihkLHApICAgZCA9IChkICYgKERfTUFTSyAmIDB4N2ZmKSkgXiAoRF9ISUdIIHwgMHgxZikKKworI2RlZmluZSBET19DT01QUkVTUyAgICAgbHpvMXhfMV8xNV9jb21wcmVzcworCisjaW5jbHVkZSAibHpvMXhfYy5jIgpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9sem8xeF85eC5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9sem8xeF85eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZWU0YmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2x6bzF4Xzl4LmMKQEAgLTAsMCArMSw5MTkgQEAKKy8qIGx6bzF4Xzl4LmMgLS0gaW1wbGVtZW50YXRpb24gb2YgdGhlIExaTzFYLTk5OSBjb21wcmVzc2lvbiBhbGdvcml0aG0KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDIwMDggTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAyMDA3IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMjAwNiBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDIwMDUgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAyMDA0IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMjAwMyBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDIwMDIgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAyMDAxIE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMjAwMCBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDE5OTkgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQ29weXJpZ2h0IChDKSAxOTk4IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIENvcHlyaWdodCAoQykgMTk5NyBNYXJrdXMgRnJhbnogWGF2ZXIgSm9oYW5uZXMgT2Jlcmh1bWVyCisgICBDb3B5cmlnaHQgKEMpIDE5OTYgTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorCisgICBNYXJrdXMgRi5YLkouIE9iZXJodW1lcgorICAgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGUgZm9sbG93aW5nIGlzIHByb2JhYmx5IG9ubHkgc2FmZSBvbiBJbnRlbC1jb21wYXRpYmxlIHByb2Nlc3NvcnMgLi4uICovCisjZGVmaW5lIExaT19VTkFMSUdORURfT0tfMgorI2RlZmluZSBMWk9fVU5BTElHTkVEX09LXzQKKworI2luY2x1ZGUgImxpYmx6by5oIgorCisjZGVmaW5lIExaT19NQVgoYSxiKSAgICAgICAgKChhKSA+PSAoYikgPyAoYSkgOiAoYikpCisjZGVmaW5lIExaT19NSU4oYSxiKSAgICAgICAgKChhKSA8PSAoYikgPyAoYSkgOiAoYikpCisjZGVmaW5lIExaT19NQVgzKGEsYixjKSAgICAgKChhKSA+PSAoYikgPyBMWk9fTUFYKGEsYykgOiBMWk9fTUFYKGIsYykpCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgU1dEX04gICAgICAgICAgIE00X01BWF9PRkZTRVQgICAvKiBzaXplIG9mIHJpbmcgYnVmZmVyICovCisjZGVmaW5lIFNXRF9GICAgICAgICAgICAyMDQ4ICAgICAgICAgICAvKiB1cHBlciBsaW1pdCBmb3IgbWF0Y2ggbGVuZ3RoICovCisKKyNkZWZpbmUgU1dEX0JFU1RfT0ZGICAgIChMWk9fTUFYMyhNMl9NQVhfTEVOLCBNM19NQVhfTEVOLCBNNF9NQVhfTEVOKSArIDEpCisKK3R5cGVkZWYgc3RydWN0IHsKKwlpbnQgaW5pdDsKKworCXVuc2lnbmVkIGxvb2s7ICAgICAgICAgIC8qIGJ5dGVzIGluIGxvb2thaGVhZCBidWZmZXIgKi8KKworCXVuc2lnbmVkIG1fbGVuOworCXVuc2lnbmVkIG1fb2ZmOworCisJY29uc3QgdWludDhfdCAqYnA7CisJY29uc3QgdWludDhfdCAqaXA7CisJY29uc3QgdWludDhfdCAqaW47CisJY29uc3QgdWludDhfdCAqaW5fZW5kOworCXVpbnQ4X3QgKm91dDsKKworCXVuc2lnbmVkIHIxX2xpdDsKK30gbHpvMXhfOTk5X3Q7CisKKyNkZWZpbmUgZ2V0Ynl0ZShjKSAgKChjKS5pcCA8IChjKS5pbl9lbmQgPyAqKChjKS5pcCkrKyA6ICgtMSkpCisKKy8qIGx6b19zd2QuYyAtLSBzbGlkaW5nIHdpbmRvdyBkaWN0aW9uYXJ5ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgU1dEX1VJTlRfTUFYICAgICAgVVNIUlRfTUFYCisKKyNpZm5kZWYgU1dEX0hTSVpFCisjICBkZWZpbmUgU1dEX0hTSVpFICAgICAgICAgMTYzODQKKyNlbmRpZgorI2lmbmRlZiBTV0RfTUFYX0NIQUlOCisjICBkZWZpbmUgU1dEX01BWF9DSEFJTiAgICAgMjA0OAorI2VuZGlmCisKKyNkZWZpbmUgSEVBRDMoYiwgcCkgXAorCSggKCgweDlmNWYgKiAoKCgoYltwXTw8NSleYltwKzFdKTw8NSkgXiBiW3ArMl0pKSA+PiA1KSAmIChTV0RfSFNJWkUtMSkgKQorCisjaWYgZGVmaW5lZChMWk9fVU5BTElHTkVEX09LXzIpCisjICBkZWZpbmUgSEVBRDIoYixwKSAgICAgICgqIChiYl9fYWxpYXNlZF91aW50MTZfdCAqKSAmKGJbcF0pKQorI2Vsc2UKKyMgIGRlZmluZSBIRUFEMihiLHApICAgICAgKGJbcF0gXiAoKHVuc2lnbmVkKWJbcCsxXTw8OCkpCisjZW5kaWYKKyNkZWZpbmUgTklMMiAgICAgICAgICAgICAgU1dEX1VJTlRfTUFYCisKK3R5cGVkZWYgc3RydWN0IGx6b19zd2QgeworCS8qIHB1YmxpYyAtICJidWlsdC1pbiIgKi8KKworCS8qIHB1YmxpYyAtIGNvbmZpZ3VyYXRpb24gKi8KKwl1bnNpZ25lZCBtYXhfY2hhaW47CisJaW50IHVzZV9iZXN0X29mZjsKKworCS8qIHB1YmxpYyAtIG91dHB1dCAqLworCXVuc2lnbmVkIG1fbGVuOworCXVuc2lnbmVkIG1fb2ZmOworCXVuc2lnbmVkIGxvb2s7CisJaW50IGJfY2hhcjsKKyNpZiBkZWZpbmVkKFNXRF9CRVNUX09GRikKKwl1bnNpZ25lZCBiZXN0X29mZltTV0RfQkVTVF9PRkZdOworI2VuZGlmCisKKwkvKiBzZW1pIHB1YmxpYyAqLworCWx6bzF4Xzk5OV90ICpjOworCXVuc2lnbmVkIG1fcG9zOworI2lmIGRlZmluZWQoU1dEX0JFU1RfT0ZGKQorCXVuc2lnbmVkIGJlc3RfcG9zW1NXRF9CRVNUX09GRl07CisjZW5kaWYKKworCS8qIHByaXZhdGUgKi8KKwl1bnNpZ25lZCBpcDsgICAgICAgICAgICAgICAgLyogaW5wdXQgcG9pbnRlciAobG9va2FoZWFkKSAqLworCXVuc2lnbmVkIGJwOyAgICAgICAgICAgICAgICAvKiBidWZmZXIgcG9pbnRlciAqLworCXVuc2lnbmVkIHJwOyAgICAgICAgICAgICAgICAvKiByZW1vdmUgcG9pbnRlciAqLworCisJdW5zaWduZWQgbm9kZV9jb3VudDsKKwl1bnNpZ25lZCBmaXJzdF9ycDsKKworCXVpbnQ4X3QgYltTV0RfTiArIFNXRF9GXTsKKwl1aW50OF90IGJfd3JhcFtTV0RfRl07IC8qIG11c3QgZm9sbG93IGIgKi8KKwl1aW50MTZfdCBoZWFkM1tTV0RfSFNJWkVdOworCXVpbnQxNl90IHN1Y2MzW1NXRF9OICsgU1dEX0ZdOworCXVpbnQxNl90IGJlc3QzW1NXRF9OICsgU1dEX0ZdOworCXVpbnQxNl90IGxsZW4zW1NXRF9IU0laRV07CisjaWZkZWYgSEVBRDIKKwl1aW50MTZfdCBoZWFkMls2NTUzNkxdOworI2VuZGlmCit9IGx6b19zd2RfdCwgKmx6b19zd2RfcDsKKworI2RlZmluZSBTSVpFT0ZfTFpPX1NXRF9UICAgIChzaXplb2YobHpvX3N3ZF90KSkKKworCisvKiBBY2Nlc3MgbWFjcm8gZm9yIGhlYWQzLgorICogaGVhZDNba2V5XSBtYXkgYmUgdW5pbml0aWFsaXplZCwgYnV0IHRoZW4gaXRzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgdXNlZC4KKyAqLworI2RlZmluZSBzX2dldF9oZWFkMyhzLGtleSkgICAgcy0+aGVhZDNba2V5XQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQl9TSVpFIChTV0RfTiArIFNXRF9GKQorCitzdGF0aWMgaW50IHN3ZF9pbml0KGx6b19zd2RfcCBzKQoreworCS8qIGRlZmF1bHRzICovCisJcy0+bm9kZV9jb3VudCA9IFNXRF9OOworCisJbWVtc2V0KHMtPmxsZW4zLCAwLCBzaXplb2Yocy0+bGxlbjNbMF0pICogKHVuc2lnbmVkKVNXRF9IU0laRSk7CisjaWZkZWYgSEVBRDIKKwltZW1zZXQocy0+aGVhZDIsIDB4ZmYsIHNpemVvZihzLT5oZWFkMlswXSkgKiA2NTUzNkwpOworCWFzc2VydChzLT5oZWFkMlswXSA9PSBOSUwyKTsKKyNlbmRpZgorCisJcy0+aXAgPSAwOworCXMtPmJwID0gcy0+aXA7CisJcy0+Zmlyc3RfcnAgPSBzLT5pcDsKKworCWFzc2VydChzLT5pcCArIFNXRF9GIDw9IEJfU0laRSk7CisJcy0+bG9vayA9ICh1bnNpZ25lZCkgKHMtPmMtPmluX2VuZCAtIHMtPmMtPmlwKTsKKwlpZiAocy0+bG9vayA+IDApIHsKKwkJaWYgKHMtPmxvb2sgPiBTV0RfRikKKwkJCXMtPmxvb2sgPSBTV0RfRjsKKwkJbWVtY3B5KCZzLT5iW3MtPmlwXSwgcy0+Yy0+aXAsIHMtPmxvb2spOworCQlzLT5jLT5pcCArPSBzLT5sb29rOworCQlzLT5pcCArPSBzLT5sb29rOworCX0KKwlpZiAocy0+aXAgPT0gQl9TSVpFKQorCQlzLT5pcCA9IDA7CisKKwlzLT5ycCA9IHMtPmZpcnN0X3JwOworCWlmIChzLT5ycCA+PSBzLT5ub2RlX2NvdW50KQorCQlzLT5ycCAtPSBzLT5ub2RlX2NvdW50OworCWVsc2UKKwkJcy0+cnAgKz0gQl9TSVpFIC0gcy0+bm9kZV9jb3VudDsKKworCXJldHVybiBMWk9fRV9PSzsKK30KKworI2RlZmluZSBzd2RfcG9zMm9mZihzLHBvcykgXAorCShzLT5icCA+IChwb3MpID8gcy0+YnAgLSAocG9zKSA6IEJfU0laRSAtICgocG9zKSAtIHMtPmJwKSkKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBzd2RfZ2V0Ynl0ZShsem9fc3dkX3AgcykKK3sKKwlpbnQgYzsKKworCWlmICgoYyA9IGdldGJ5dGUoKihzLT5jKSkpIDwgMCkgeworCQlpZiAocy0+bG9vayA+IDApCisJCQktLXMtPmxvb2s7CisJfSBlbHNlIHsKKwkJcy0+YltzLT5pcF0gPSBjOworCQlpZiAocy0+aXAgPCBTV0RfRikKKwkJCXMtPmJfd3JhcFtzLT5pcF0gPSBjOworCX0KKwlpZiAoKytzLT5pcCA9PSBCX1NJWkUpCisJCXMtPmlwID0gMDsKKwlpZiAoKytzLT5icCA9PSBCX1NJWkUpCisJCXMtPmJwID0gMDsKKwlpZiAoKytzLT5ycCA9PSBCX1NJWkUpCisJCXMtPnJwID0gMDsKK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIHJlbW92ZSBub2RlIGZyb20gbGlzdHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHN3ZF9yZW1vdmVfbm9kZShsem9fc3dkX3AgcywgdW5zaWduZWQgbm9kZSkKK3sKKwlpZiAocy0+bm9kZV9jb3VudCA9PSAwKSB7CisJCXVuc2lnbmVkIGtleTsKKworCQlrZXkgPSBIRUFEMyhzLT5iLG5vZGUpOworCQlhc3NlcnQocy0+bGxlbjNba2V5XSA+IDApOworCQktLXMtPmxsZW4zW2tleV07CisKKyNpZmRlZiBIRUFEMgorCQlrZXkgPSBIRUFEMihzLT5iLG5vZGUpOworCQlhc3NlcnQocy0+aGVhZDJba2V5XSAhPSBOSUwyKTsKKwkJaWYgKCh1bnNpZ25lZCkgcy0+aGVhZDJba2V5XSA9PSBub2RlKQorCQkJcy0+aGVhZDJba2V5XSA9IE5JTDI7CisjZW5kaWYKKwl9IGVsc2UKKwkJLS1zLT5ub2RlX2NvdW50OworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIHN3ZF9hY2NlcHQobHpvX3N3ZF9wIHMsIHVuc2lnbmVkIG4pCit7CisJYXNzZXJ0KG4gPD0gcy0+bG9vayk7CisKKwl3aGlsZSAobi0tKSB7CisJCXVuc2lnbmVkIGtleTsKKworCQlzd2RfcmVtb3ZlX25vZGUocyxzLT5ycCk7CisKKwkJLyogYWRkIGJwIGludG8gSEVBRDMgKi8KKwkJa2V5ID0gSEVBRDMocy0+Yiwgcy0+YnApOworCQlzLT5zdWNjM1tzLT5icF0gPSBzX2dldF9oZWFkMyhzLCBrZXkpOworCQlzLT5oZWFkM1trZXldID0gcy0+YnA7CisJCXMtPmJlc3QzW3MtPmJwXSA9IFNXRF9GICsgMTsKKwkJcy0+bGxlbjNba2V5XSsrOworCQlhc3NlcnQocy0+bGxlbjNba2V5XSA8PSBTV0RfTik7CisKKyNpZmRlZiBIRUFEMgorCQkvKiBhZGQgYnAgaW50byBIRUFEMiAqLworCQlrZXkgPSBIRUFEMihzLT5iLCBzLT5icCk7CisJCXMtPmhlYWQyW2tleV0gPSBzLT5icDsKKyNlbmRpZgorCisJCXN3ZF9nZXRieXRlKHMpOworCX0KK30KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBzd2Rfc2VhcmNoKGx6b19zd2RfcCBzLCB1bnNpZ25lZCBub2RlLCB1bnNpZ25lZCBjbnQpCit7CisJY29uc3QgdWludDhfdCAqcDE7CisJY29uc3QgdWludDhfdCAqcDI7CisJY29uc3QgdWludDhfdCAqcHg7CisJdW5zaWduZWQgbV9sZW4gPSBzLT5tX2xlbjsKKwljb25zdCB1aW50OF90ICpiICA9IHMtPmI7CisJY29uc3QgdWludDhfdCAqYnAgPSBzLT5iICsgcy0+YnA7CisJY29uc3QgdWludDhfdCAqYnggPSBzLT5iICsgcy0+YnAgKyBzLT5sb29rOworCXVuc2lnbmVkIGNoYXIgc2Nhbl9lbmQxOworCisJYXNzZXJ0KHMtPm1fbGVuID4gMCk7CisKKwlzY2FuX2VuZDEgPSBicFttX2xlbiAtIDFdOworCWZvciAoIDsgY250LS0gPiAwOyBub2RlID0gcy0+c3VjYzNbbm9kZV0pIHsKKwkJcDEgPSBicDsKKwkJcDIgPSBiICsgbm9kZTsKKwkJcHggPSBieDsKKworCQlhc3NlcnQobV9sZW4gPCBzLT5sb29rKTsKKworCQlpZiAocDJbbV9sZW4gLSAxXSA9PSBzY2FuX2VuZDEKKwkJICYmIHAyW21fbGVuXSA9PSBwMVttX2xlbl0KKwkJICYmIHAyWzBdID09IHAxWzBdCisJCSAmJiBwMlsxXSA9PSBwMVsxXQorCQkpIHsKKwkJCXVuc2lnbmVkIGk7CisJCQlhc3NlcnQobHpvX21lbWNtcChicCwgJmJbbm9kZV0sIDMpID09IDApOworCisJCQlwMSArPSAyOyBwMiArPSAyOworCQkJZG8ge30gd2hpbGUgKCsrcDEgPCBweCAmJiAqcDEgPT0gKisrcDIpOworCQkJaSA9IHAxLWJwOworCisJCQlhc3NlcnQobHpvX21lbWNtcChicCwgJmJbbm9kZV0sIGkpID09IDApOworCisjaWYgZGVmaW5lZChTV0RfQkVTVF9PRkYpCisJCQlpZiAoaSA8IFNXRF9CRVNUX09GRikgeworCQkJCWlmIChzLT5iZXN0X3Bvc1tpXSA9PSAwKQorCQkJCQlzLT5iZXN0X3Bvc1tpXSA9IG5vZGUgKyAxOworCQkJfQorI2VuZGlmCisJCQlpZiAoaSA+IG1fbGVuKSB7CisJCQkJcy0+bV9sZW4gPSBtX2xlbiA9IGk7CisJCQkJcy0+bV9wb3MgPSBub2RlOworCQkJCWlmIChtX2xlbiA9PSBzLT5sb29rKQorCQkJCQlyZXR1cm47CisJCQkJaWYgKG1fbGVuID49IFNXRF9GKQorCQkJCQlyZXR1cm47CisJCQkJaWYgKG1fbGVuID4gKHVuc2lnbmVkKSBzLT5iZXN0M1tub2RlXSkKKwkJCQkJcmV0dXJuOworCQkJCXNjYW5fZW5kMSA9IGJwW21fbGVuIC0gMV07CisJCQl9CisJCX0KKwl9Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIEhFQUQyCisKK3N0YXRpYyBpbnQgc3dkX3NlYXJjaDIobHpvX3N3ZF9wIHMpCit7CisJdW5zaWduZWQga2V5OworCisJYXNzZXJ0KHMtPmxvb2sgPj0gMik7CisJYXNzZXJ0KHMtPm1fbGVuID4gMCk7CisKKwlrZXkgPSBzLT5oZWFkMltIRUFEMihzLT5iLCBzLT5icCldOworCWlmIChrZXkgPT0gTklMMikKKwkJcmV0dXJuIDA7CisJYXNzZXJ0KGx6b19tZW1jbXAoJnMtPmJbcy0+YnBdLCAmcy0+YltrZXldLCAyKSA9PSAwKTsKKyNpZiBkZWZpbmVkKFNXRF9CRVNUX09GRikKKwlpZiAocy0+YmVzdF9wb3NbMl0gPT0gMCkKKwkJcy0+YmVzdF9wb3NbMl0gPSBrZXkgKyAxOworI2VuZGlmCisKKwlpZiAocy0+bV9sZW4gPCAyKSB7CisJCXMtPm1fbGVuID0gMjsKKwkJcy0+bV9wb3MgPSBrZXk7CisJfQorCXJldHVybiAxOworfQorCisjZW5kaWYKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBzd2RfZmluZGJlc3QobHpvX3N3ZF9wIHMpCit7CisJdW5zaWduZWQga2V5OworCXVuc2lnbmVkIGNudCwgbm9kZTsKKwl1bnNpZ25lZCBsZW47CisKKwlhc3NlcnQocy0+bV9sZW4gPiAwKTsKKworCS8qIGdldCBjdXJyZW50IGhlYWQsIGFkZCBicCBpbnRvIEhFQUQzICovCisJa2V5ID0gSEVBRDMocy0+YixzLT5icCk7CisJbm9kZSA9IHMtPnN1Y2MzW3MtPmJwXSA9IHNfZ2V0X2hlYWQzKHMsIGtleSk7CisJY250ID0gcy0+bGxlbjNba2V5XSsrOworCWFzc2VydChzLT5sbGVuM1trZXldIDw9IFNXRF9OICsgU1dEX0YpOworCWlmIChjbnQgPiBzLT5tYXhfY2hhaW4pCisJCWNudCA9IHMtPm1heF9jaGFpbjsKKwlzLT5oZWFkM1trZXldID0gcy0+YnA7CisKKwlzLT5iX2NoYXIgPSBzLT5iW3MtPmJwXTsKKwlsZW4gPSBzLT5tX2xlbjsKKwlpZiAocy0+bV9sZW4gPj0gcy0+bG9vaykgeworCQlpZiAocy0+bG9vayA9PSAwKQorCQkJcy0+Yl9jaGFyID0gLTE7CisJCXMtPm1fb2ZmID0gMDsKKwkJcy0+YmVzdDNbcy0+YnBdID0gU1dEX0YgKyAxOworCX0gZWxzZSB7CisjaWZkZWYgSEVBRDIKKwkJaWYgKHN3ZF9zZWFyY2gyKHMpKQorI2VuZGlmCisJCQlpZiAocy0+bG9vayA+PSAzKQorCQkJCXN3ZF9zZWFyY2gocywgbm9kZSwgY250KTsKKwkJaWYgKHMtPm1fbGVuID4gbGVuKQorCQkJcy0+bV9vZmYgPSBzd2RfcG9zMm9mZihzLHMtPm1fcG9zKTsKKwkJcy0+YmVzdDNbcy0+YnBdID0gcy0+bV9sZW47CisKKyNpZiBkZWZpbmVkKFNXRF9CRVNUX09GRikKKwkJaWYgKHMtPnVzZV9iZXN0X29mZikgeworCQkJaW50IGk7CisJCQlmb3IgKGkgPSAyOyBpIDwgU1dEX0JFU1RfT0ZGOyBpKyspIHsKKwkJCQlpZiAocy0+YmVzdF9wb3NbaV0gPiAwKQorCQkJCQlzLT5iZXN0X29mZltpXSA9IHN3ZF9wb3Myb2ZmKHMsIHMtPmJlc3RfcG9zW2ldLTEpOworCQkJCWVsc2UKKwkJCQkJcy0+YmVzdF9vZmZbaV0gPSAwOworCQkJfQorCQl9CisjZW5kaWYKKwl9CisKKwlzd2RfcmVtb3ZlX25vZGUocyxzLT5ycCk7CisKKyNpZmRlZiBIRUFEMgorCS8qIGFkZCBicCBpbnRvIEhFQUQyICovCisJa2V5ID0gSEVBRDIocy0+Yiwgcy0+YnApOworCXMtPmhlYWQyW2tleV0gPSBzLT5icDsKKyNlbmRpZgorfQorCisjdW5kZWYgSEVBRDMKKyN1bmRlZiBIRUFEMgorI3VuZGVmIHNfZ2V0X2hlYWQzCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBpbml0X21hdGNoKGx6bzF4Xzk5OV90ICpjLCBsem9fc3dkX3AgcywgdWludDMyX3QgdXNlX2Jlc3Rfb2ZmKQoreworCWludCByOworCisJYXNzZXJ0KCFjLT5pbml0KTsKKwljLT5pbml0ID0gMTsKKworCXMtPmMgPSBjOworCisJciA9IHN3ZF9pbml0KHMpOworCWlmIChyICE9IDApCisJCXJldHVybiByOworCisJcy0+dXNlX2Jlc3Rfb2ZmID0gdXNlX2Jlc3Rfb2ZmOworCXJldHVybiByOworfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBpbnQgZmluZF9tYXRjaChsem8xeF85OTlfdCAqYywgbHpvX3N3ZF9wIHMsCisJCXVuc2lnbmVkIHRoaXNfbGVuLCB1bnNpZ25lZCBza2lwKQoreworCWFzc2VydChjLT5pbml0KTsKKworCWlmIChza2lwID4gMCkgeworCQlhc3NlcnQodGhpc19sZW4gPj0gc2tpcCk7CisJCXN3ZF9hY2NlcHQocywgdGhpc19sZW4gLSBza2lwKTsKKwl9IGVsc2UgeworCQlhc3NlcnQodGhpc19sZW4gPD0gMSk7CisJfQorCisJcy0+bV9sZW4gPSAxOworI2lmZGVmIFNXRF9CRVNUX09GRgorCWlmIChzLT51c2VfYmVzdF9vZmYpCisJCW1lbXNldChzLT5iZXN0X3BvcywgMCwgc2l6ZW9mKHMtPmJlc3RfcG9zKSk7CisjZW5kaWYKKwlzd2RfZmluZGJlc3Qocyk7CisJYy0+bV9sZW4gPSBzLT5tX2xlbjsKKwljLT5tX29mZiA9IHMtPm1fb2ZmOworCisJc3dkX2dldGJ5dGUocyk7CisKKwlpZiAocy0+Yl9jaGFyIDwgMCkgeworCQljLT5sb29rID0gMDsKKwkJYy0+bV9sZW4gPSAwOworCX0gZWxzZSB7CisJCWMtPmxvb2sgPSBzLT5sb29rICsgMTsKKwl9CisJYy0+YnAgPSBjLT5pcCAtIGMtPmxvb2s7CisKKwlyZXR1cm4gTFpPX0VfT0s7Cit9CisKKy8qIHRoaXMgaXMgYSBwdWJsaWMgZnVuY3Rpb25zLCBidXQgdGhlcmUgaXMgbm8gcHJvdG90eXBlIGluIGEgaGVhZGVyIGZpbGUgKi8KK3N0YXRpYyBpbnQgbHpvMXhfOTk5X2NvbXByZXNzX2ludGVybmFsKGNvbnN0IHVpbnQ4X3QgKmluICwgdW5zaWduZWQgaW5fbGVuLAorCQl1aW50OF90ICpvdXQsIHVuc2lnbmVkICpvdXRfbGVuLAorCQl2b2lkICp3cmttZW0sCisJCXVuc2lnbmVkIGdvb2RfbGVuZ3RoLAorCQl1bnNpZ25lZCBtYXhfbGF6eSwKKwkJdW5zaWduZWQgbWF4X2NoYWluLAorCQl1aW50MzJfdCB1c2VfYmVzdF9vZmYpOworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB1aW50OF90ICpjb2RlX21hdGNoKGx6bzF4Xzk5OV90ICpjLAorCQl1aW50OF90ICpvcCwgdW5zaWduZWQgbV9sZW4sIHVuc2lnbmVkIG1fb2ZmKQoreworCWFzc2VydChvcCA+IGMtPm91dCk7CisJaWYgKG1fbGVuID09IDIpIHsKKwkJYXNzZXJ0KG1fb2ZmIDw9IE0xX01BWF9PRkZTRVQpOworCQlhc3NlcnQoYy0+cjFfbGl0ID4gMCk7CisJCWFzc2VydChjLT5yMV9saXQgPCA0KTsKKwkJbV9vZmYgLT0gMTsKKwkJKm9wKysgPSBNMV9NQVJLRVIgfCAoKG1fb2ZmICYgMykgPDwgMik7CisJCSpvcCsrID0gbV9vZmYgPj4gMjsKKwl9IGVsc2UgaWYgKG1fbGVuIDw9IE0yX01BWF9MRU4gJiYgbV9vZmYgPD0gTTJfTUFYX09GRlNFVCkgeworCQlhc3NlcnQobV9sZW4gPj0gMyk7CisJCW1fb2ZmIC09IDE7CisJCSpvcCsrID0gKChtX2xlbiAtIDEpIDw8IDUpIHwgKChtX29mZiAmIDcpIDw8IDIpOworCQkqb3ArKyA9IG1fb2ZmID4+IDM7CisJCWFzc2VydChvcFstMl0gPj0gTTJfTUFSS0VSKTsKKwl9IGVsc2UgaWYgKG1fbGVuID09IE0yX01JTl9MRU4gJiYgbV9vZmYgPD0gTVhfTUFYX09GRlNFVCAmJiBjLT5yMV9saXQgPj0gNCkgeworCQlhc3NlcnQobV9sZW4gPT0gMyk7CisJCWFzc2VydChtX29mZiA+IE0yX01BWF9PRkZTRVQpOworCQltX29mZiAtPSAxICsgTTJfTUFYX09GRlNFVDsKKwkJKm9wKysgPSBNMV9NQVJLRVIgfCAoKG1fb2ZmICYgMykgPDwgMik7CisJCSpvcCsrID0gbV9vZmYgPj4gMjsKKwl9IGVsc2UgaWYgKG1fb2ZmIDw9IE0zX01BWF9PRkZTRVQpIHsKKwkJYXNzZXJ0KG1fbGVuID49IDMpOworCQltX29mZiAtPSAxOworCQlpZiAobV9sZW4gPD0gTTNfTUFYX0xFTikKKwkJCSpvcCsrID0gTTNfTUFSS0VSIHwgKG1fbGVuIC0gMik7CisJCWVsc2UgeworCQkJbV9sZW4gLT0gTTNfTUFYX0xFTjsKKwkJCSpvcCsrID0gTTNfTUFSS0VSIHwgMDsKKwkJCXdoaWxlIChtX2xlbiA+IDI1NSkgeworCQkJCW1fbGVuIC09IDI1NTsKKwkJCQkqb3ArKyA9IDA7CisJCQl9CisJCQlhc3NlcnQobV9sZW4gPiAwKTsKKwkJCSpvcCsrID0gbV9sZW47CisJCX0KKwkJKm9wKysgPSBtX29mZiA8PCAyOworCQkqb3ArKyA9IG1fb2ZmID4+IDY7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgazsKKworCQlhc3NlcnQobV9sZW4gPj0gMyk7CisJCWFzc2VydChtX29mZiA+IDB4NDAwMCk7CisJCWFzc2VydChtX29mZiA8PSAweGJmZmYpOworCQltX29mZiAtPSAweDQwMDA7CisJCWsgPSAobV9vZmYgJiAweDQwMDApID4+IDExOworCQlpZiAobV9sZW4gPD0gTTRfTUFYX0xFTikKKwkJCSpvcCsrID0gTTRfTUFSS0VSIHwgayB8IChtX2xlbiAtIDIpOworCQllbHNlIHsKKwkJCW1fbGVuIC09IE00X01BWF9MRU47CisJCQkqb3ArKyA9IE00X01BUktFUiB8IGsgfCAwOworCQkJd2hpbGUgKG1fbGVuID4gMjU1KSB7CisJCQkJbV9sZW4gLT0gMjU1OworCQkJCSpvcCsrID0gMDsKKwkJCX0KKwkJCWFzc2VydChtX2xlbiA+IDApOworCQkJKm9wKysgPSBtX2xlbjsKKwkJfQorCQkqb3ArKyA9IG1fb2ZmIDw8IDI7CisJCSpvcCsrID0gbV9vZmYgPj4gNjsKKwl9CisKKwlyZXR1cm4gb3A7Cit9CisKKworc3RhdGljIHVpbnQ4X3QgKlNUT1JFX1JVTihsem8xeF85OTlfdCAqYywgdWludDhfdCAqb3AsCisJCWNvbnN0IHVpbnQ4X3QgKmlpLCB1bnNpZ25lZCB0KQoreworCWlmIChvcCA9PSBjLT5vdXQgJiYgdCA8PSAyMzgpIHsKKwkJKm9wKysgPSAxNyArIHQ7CisJfSBlbHNlIGlmICh0IDw9IDMpIHsKKwkJb3BbLTJdIHw9IHQ7CisJfSBlbHNlIGlmICh0IDw9IDE4KSB7CisJCSpvcCsrID0gdCAtIDM7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgdHQgPSB0IC0gMTg7CisKKwkJKm9wKysgPSAwOworCQl3aGlsZSAodHQgPiAyNTUpIHsKKwkJCXR0IC09IDI1NTsKKwkJCSpvcCsrID0gMDsKKwkJfQorCQlhc3NlcnQodHQgPiAwKTsKKwkJKm9wKysgPSB0dDsKKwl9CisJZG8gKm9wKysgPSAqaWkrKzsgd2hpbGUgKC0tdCA+IDApOworCisJcmV0dXJuIG9wOworfQorCisKK3N0YXRpYyB1aW50OF90ICpjb2RlX3J1bihsem8xeF85OTlfdCAqYywgdWludDhfdCAqb3AsIGNvbnN0IHVpbnQ4X3QgKmlpLAorCQl1bnNpZ25lZCBsaXQpCit7CisJaWYgKGxpdCA+IDApIHsKKwkJYXNzZXJ0KG1fbGVuID49IDIpOworCQlvcCA9IFNUT1JFX1JVTihjLCBvcCwgaWksIGxpdCk7CisJfSBlbHNlIHsKKwkJYXNzZXJ0KG1fbGVuID49IDMpOworCX0KKwljLT5yMV9saXQgPSBsaXQ7CisKKwlyZXR1cm4gb3A7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBsZW5fb2ZfY29kZWRfbWF0Y2godW5zaWduZWQgbV9sZW4sIHVuc2lnbmVkIG1fb2ZmLCB1bnNpZ25lZCBsaXQpCit7CisJaW50IG4gPSA0OworCisJaWYgKG1fbGVuIDwgMikKKwkJcmV0dXJuIC0xOworCWlmIChtX2xlbiA9PSAyKQorCQlyZXR1cm4gKG1fb2ZmIDw9IE0xX01BWF9PRkZTRVQgJiYgbGl0ID4gMCAmJiBsaXQgPCA0KSA/IDIgOiAtMTsKKwlpZiAobV9sZW4gPD0gTTJfTUFYX0xFTiAmJiBtX29mZiA8PSBNMl9NQVhfT0ZGU0VUKQorCQlyZXR1cm4gMjsKKwlpZiAobV9sZW4gPT0gTTJfTUlOX0xFTiAmJiBtX29mZiA8PSBNWF9NQVhfT0ZGU0VUICYmIGxpdCA+PSA0KQorCQlyZXR1cm4gMjsKKwlpZiAobV9vZmYgPD0gTTNfTUFYX09GRlNFVCkgeworCQlpZiAobV9sZW4gPD0gTTNfTUFYX0xFTikKKwkJCXJldHVybiAzOworCQltX2xlbiAtPSBNM19NQVhfTEVOOworCX0gZWxzZSBpZiAobV9vZmYgPD0gTTRfTUFYX09GRlNFVCkgeworCQlpZiAobV9sZW4gPD0gTTRfTUFYX0xFTikKKwkJCXJldHVybiAzOworCQltX2xlbiAtPSBNNF9NQVhfTEVOOworCX0gZWxzZQorCQlyZXR1cm4gLTE7CisJd2hpbGUgKG1fbGVuID4gMjU1KSB7CisJCW1fbGVuIC09IDI1NTsKKwkJbisrOworCX0KKwlyZXR1cm4gbjsKK30KKworCitzdGF0aWMgaW50IG1pbl9nYWluKHVuc2lnbmVkIGFoZWFkLCB1bnNpZ25lZCBsaXQxLAorCQkJdW5zaWduZWQgbGl0MiwgaW50IGwxLCBpbnQgbDIsIGludCBsMykKK3sKKwlpbnQgbGF6eV9tYXRjaF9taW5fZ2FpbiA9IDA7CisKKwlhc3NlcnQgKGFoZWFkID49IDEpOworCWxhenlfbWF0Y2hfbWluX2dhaW4gKz0gYWhlYWQ7CisKKwlpZiAobGl0MSA8PSAzKQorCQlsYXp5X21hdGNoX21pbl9nYWluICs9IChsaXQyIDw9IDMpID8gMCA6IDI7CisJZWxzZSBpZiAobGl0MSA8PSAxOCkKKwkJbGF6eV9tYXRjaF9taW5fZ2FpbiArPSAobGl0MiA8PSAxOCkgPyAwIDogMTsKKworCWxhenlfbWF0Y2hfbWluX2dhaW4gKz0gKGwyIC0gbDEpICogMjsKKwlpZiAobDMgPiAwKQorCQlsYXp5X21hdGNoX21pbl9nYWluIC09IChhaGVhZCAtIGwzKSAqIDI7CisKKwlpZiAobGF6eV9tYXRjaF9taW5fZ2FpbiA8IDApCisJCWxhenlfbWF0Y2hfbWluX2dhaW4gPSAwOworCisJcmV0dXJuIGxhenlfbWF0Y2hfbWluX2dhaW47Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmIGRlZmluZWQoU1dEX0JFU1RfT0ZGKQorCitzdGF0aWMgdm9pZCBiZXR0ZXJfbWF0Y2goY29uc3QgbHpvX3N3ZF9wIHN3ZCwKKwkJCXVuc2lnbmVkICptX2xlbiwgdW5zaWduZWQgKm1fb2ZmKQoreworCWlmICgqbV9sZW4gPD0gTTJfTUlOX0xFTikKKwkJcmV0dXJuOworCisJaWYgKCptX29mZiA8PSBNMl9NQVhfT0ZGU0VUKQorCQlyZXR1cm47CisKKwkvKiBNMy9NNCAtPiBNMiAqLworCWlmICgqbV9vZmYgPiBNMl9NQVhfT0ZGU0VUCisJICYmICptX2xlbiA+PSBNMl9NSU5fTEVOICsgMSAmJiAqbV9sZW4gPD0gTTJfTUFYX0xFTiArIDEKKwkgJiYgc3dkLT5iZXN0X29mZlsqbV9sZW4tMV0gJiYgc3dkLT5iZXN0X29mZlsqbV9sZW4tMV0gPD0gTTJfTUFYX09GRlNFVAorCSkgeworCQkqbV9sZW4gPSAqbV9sZW4gLSAxOworCQkqbV9vZmYgPSBzd2QtPmJlc3Rfb2ZmWyptX2xlbl07CisJCXJldHVybjsKKwl9CisKKwkvKiBNNCAtPiBNMiAqLworCWlmICgqbV9vZmYgPiBNM19NQVhfT0ZGU0VUCisJICYmICptX2xlbiA+PSBNNF9NQVhfTEVOICsgMSAmJiAqbV9sZW4gPD0gTTJfTUFYX0xFTiArIDIKKwkgJiYgc3dkLT5iZXN0X29mZlsqbV9sZW4tMl0gJiYgc3dkLT5iZXN0X29mZlsqbV9sZW4tMl0gPD0gTTJfTUFYX09GRlNFVAorCSkgeworCQkqbV9sZW4gPSAqbV9sZW4gLSAyOworCQkqbV9vZmYgPSBzd2QtPmJlc3Rfb2ZmWyptX2xlbl07CisJCXJldHVybjsKKwl9CisJLyogTTQgLT4gTTMgKi8KKwlpZiAoKm1fb2ZmID4gTTNfTUFYX09GRlNFVAorCSAmJiAqbV9sZW4gPj0gTTRfTUFYX0xFTiArIDEgJiYgKm1fbGVuIDw9IE0zX01BWF9MRU4gKyAxCisJICYmIHN3ZC0+YmVzdF9vZmZbKm1fbGVuLTFdICYmIHN3ZC0+YmVzdF9vZmZbKm1fbGVuLTFdIDw9IE0zX01BWF9PRkZTRVQKKwkpIHsKKwkJKm1fbGVuID0gKm1fbGVuIC0gMTsKKwkJKm1fb2ZmID0gc3dkLT5iZXN0X29mZlsqbV9sZW5dOworCX0KK30KKworI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIGludCBsem8xeF85OTlfY29tcHJlc3NfaW50ZXJuYWwoY29uc3QgdWludDhfdCAqaW4sIHVuc2lnbmVkIGluX2xlbiwKKwkJdWludDhfdCAqb3V0LCB1bnNpZ25lZCAqb3V0X2xlbiwKKwkJdm9pZCAqd3JrbWVtLAorCQl1bnNpZ25lZCBnb29kX2xlbmd0aCwKKwkJdW5zaWduZWQgbWF4X2xhenksCisJCXVuc2lnbmVkIG1heF9jaGFpbiwKKwkJdWludDMyX3QgdXNlX2Jlc3Rfb2ZmKQoreworCXVpbnQ4X3QgKm9wOworCWNvbnN0IHVpbnQ4X3QgKmlpOworCXVuc2lnbmVkIGxpdDsKKwl1bnNpZ25lZCBtX2xlbiwgbV9vZmY7CisJbHpvMXhfOTk5X3QgY2M7CisJbHpvMXhfOTk5X3QgKmNvbnN0IGMgPSAmY2M7CisJY29uc3QgbHpvX3N3ZF9wIHN3ZCA9IChsem9fc3dkX3ApIHdya21lbTsKKwlpbnQgcjsKKworCWMtPmluaXQgPSAwOworCWMtPmlwID0gYy0+aW4gPSBpbjsKKwljLT5pbl9lbmQgPSBpbiArIGluX2xlbjsKKwljLT5vdXQgPSBvdXQ7CisKKwlvcCA9IG91dDsKKwlpaSA9IGMtPmlwOyAgICAgICAgICAgICAvKiBwb2ludCB0byBzdGFydCBvZiBsaXRlcmFsIHJ1biAqLworCWxpdCA9IDA7CisJYy0+cjFfbGl0ID0gMDsKKworCXIgPSBpbml0X21hdGNoKGMsIHN3ZCwgdXNlX2Jlc3Rfb2ZmKTsKKwlpZiAociAhPSAwKQorCQlyZXR1cm4gcjsKKwlzd2QtPm1heF9jaGFpbiA9IG1heF9jaGFpbjsKKworCXIgPSBmaW5kX21hdGNoKGMsIHN3ZCwgMCwgMCk7CisJaWYgKHIgIT0gMCkKKwkJcmV0dXJuIHI7CisKKwl3aGlsZSAoYy0+bG9vayA+IDApIHsKKwkJdW5zaWduZWQgYWhlYWQ7CisJCXVuc2lnbmVkIG1heF9haGVhZDsKKwkJaW50IGwxLCBsMiwgbDM7CisKKwkJbV9sZW4gPSBjLT5tX2xlbjsKKwkJbV9vZmYgPSBjLT5tX29mZjsKKworCQlhc3NlcnQoYy0+YnAgPT0gYy0+aXAgLSBjLT5sb29rKTsKKwkJYXNzZXJ0KGMtPmJwID49IGluKTsKKwkJaWYgKGxpdCA9PSAwKQorCQkJaWkgPSBjLT5icDsKKwkJYXNzZXJ0KGlpICsgbGl0ID09IGMtPmJwKTsKKwkJYXNzZXJ0KHN3ZC0+Yl9jaGFyID09ICooYy0+YnApKTsKKworCQlpZiAobV9sZW4gPCAyCisJCSB8fCAobV9sZW4gPT0gMiAmJiAobV9vZmYgPiBNMV9NQVhfT0ZGU0VUIHx8IGxpdCA9PSAwIHx8IGxpdCA+PSA0KSkKKwkJICAgIC8qIERvIG5vdCBhY2NlcHQgdGhpcyBtYXRjaCBmb3IgY29tcHJlc3NlZC1kYXRhIGNvbXBhdGliaWxpdHkKKwkJICAgICAqIHdpdGggTFpPIHYxLjAxIGFuZCBiZWZvcmUKKwkJICAgICAqIFsgbWlnaHQgYmUgYSBwcm9ibGVtIGZvciBkZWNvbXByZXNzKCkgYW5kIG9wdGltaXplKCkgXQorCQkgICAgICovCisJCSB8fCAobV9sZW4gPT0gMiAmJiBvcCA9PSBvdXQpCisJCSB8fCAob3AgPT0gb3V0ICYmIGxpdCA9PSAwKQorCQkpIHsKKwkJCS8qIGEgbGl0ZXJhbCAqLworCQkJbV9sZW4gPSAwOworCQl9CisJCWVsc2UgaWYgKG1fbGVuID09IE0yX01JTl9MRU4pIHsKKwkJCS8qIGNvbXByZXNzaW9uIHJhdGlvIGltcHJvdmVzIGlmIHdlIGNvZGUgYSBsaXRlcmFsIGluIHNvbWUgY2FzZXMgKi8KKwkJCWlmIChtX29mZiA+IE1YX01BWF9PRkZTRVQgJiYgbGl0ID49IDQpCisJCQkJbV9sZW4gPSAwOworCQl9CisKKwkJaWYgKG1fbGVuID09IDApIHsKKwkJCS8qIGEgbGl0ZXJhbCAqLworCQkJbGl0Kys7CisJCQlzd2QtPm1heF9jaGFpbiA9IG1heF9jaGFpbjsKKwkJCXIgPSBmaW5kX21hdGNoKGMsIHN3ZCwgMSwgMCk7CisJCQlhc3NlcnQociA9PSAwKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogYSBtYXRjaCAqLworI2lmIGRlZmluZWQoU1dEX0JFU1RfT0ZGKQorCQlpZiAoc3dkLT51c2VfYmVzdF9vZmYpCisJCQliZXR0ZXJfbWF0Y2goc3dkLCAmbV9sZW4sICZtX29mZik7CisjZW5kaWYKKworCQkvKiBzaGFsbCB3ZSB0cnkgYSBsYXp5IG1hdGNoID8gKi8KKwkJYWhlYWQgPSAwOworCQlpZiAobV9sZW4gPj0gbWF4X2xhenkpIHsKKwkJCS8qIG5vICovCisJCQlsMSA9IDA7CisJCQltYXhfYWhlYWQgPSAwOworCQl9IGVsc2UgeworCQkJLyogeWVzLCB0cnkgYSBsYXp5IG1hdGNoICovCisJCQlsMSA9IGxlbl9vZl9jb2RlZF9tYXRjaChtX2xlbiwgbV9vZmYsIGxpdCk7CisJCQlhc3NlcnQobDEgPiAwKTsKKwkJCW1heF9haGVhZCA9IExaT19NSU4oMiwgKHVuc2lnbmVkKWwxIC0gMSk7CisJCX0KKworCisJCXdoaWxlIChhaGVhZCA8IG1heF9haGVhZCAmJiBjLT5sb29rID4gbV9sZW4pIHsKKwkJCWludCBsYXp5X21hdGNoX21pbl9nYWluOworCisJCQlpZiAobV9sZW4gPj0gZ29vZF9sZW5ndGgpCisJCQkJc3dkLT5tYXhfY2hhaW4gPSBtYXhfY2hhaW4gPj4gMjsKKwkJCWVsc2UKKwkJCQlzd2QtPm1heF9jaGFpbiA9IG1heF9jaGFpbjsKKwkJCXIgPSBmaW5kX21hdGNoKGMsIHN3ZCwgMSwgMCk7CisJCQlhaGVhZCsrOworCisJCQlhc3NlcnQociA9PSAwKTsKKwkJCWFzc2VydChjLT5sb29rID4gMCk7CisJCQlhc3NlcnQoaWkgKyBsaXQgKyBhaGVhZCA9PSBjLT5icCk7CisKKwkJCWlmIChjLT5tX2xlbiA8IG1fbGVuKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGMtPm1fbGVuID09IG1fbGVuICYmIGMtPm1fb2ZmID49IG1fb2ZmKQorCQkJCWNvbnRpbnVlOworI2lmIGRlZmluZWQoU1dEX0JFU1RfT0ZGKQorCQkJaWYgKHN3ZC0+dXNlX2Jlc3Rfb2ZmKQorCQkJCWJldHRlcl9tYXRjaChzd2QsICZjLT5tX2xlbiwgJmMtPm1fb2ZmKTsKKyNlbmRpZgorCQkJbDIgPSBsZW5fb2ZfY29kZWRfbWF0Y2goYy0+bV9sZW4sIGMtPm1fb2ZmLCBsaXQrYWhlYWQpOworCQkJaWYgKGwyIDwgMCkKKwkJCQljb250aW51ZTsKKworCQkJLyogY29tcHJlc3NlZC1kYXRhIGNvbXBhdGliaWxpdHkgW3NlZSBhYm92ZV0gKi8KKwkJCWwzID0gKG9wID09IG91dCkgPyAtMSA6IGxlbl9vZl9jb2RlZF9tYXRjaChhaGVhZCwgbV9vZmYsIGxpdCk7CisKKwkJCWxhenlfbWF0Y2hfbWluX2dhaW4gPSBtaW5fZ2FpbihhaGVhZCwgbGl0LCBsaXQrYWhlYWQsIGwxLCBsMiwgbDMpOworCQkJaWYgKGMtPm1fbGVuID49IG1fbGVuICsgbGF6eV9tYXRjaF9taW5fZ2FpbikgeworCQkJCWlmIChsMyA+IDApIHsKKwkJCQkJLyogY29kZSBwcmV2aW91cyBydW4gKi8KKwkJCQkJb3AgPSBjb2RlX3J1bihjLCBvcCwgaWksIGxpdCk7CisJCQkJCWxpdCA9IDA7CisJCQkJCS8qIGNvZGUgc2hvcnRlbmVkIG1hdGNoICovCisJCQkJCW9wID0gY29kZV9tYXRjaChjLCBvcCwgYWhlYWQsIG1fb2ZmKTsKKwkJCQl9IGVsc2UgeworCQkJCQlsaXQgKz0gYWhlYWQ7CisJCQkJCWFzc2VydChpaSArIGxpdCA9PSBjLT5icCk7CisJCQkJfQorCQkJCWdvdG8gbGF6eV9tYXRjaF9kb25lOworCQkJfQorCQl9CisKKwkJYXNzZXJ0KGlpICsgbGl0ICsgYWhlYWQgPT0gYy0+YnApOworCisJCS8qIDEgLSBjb2RlIHJ1biAqLworCQlvcCA9IGNvZGVfcnVuKGMsIG9wLCBpaSwgbGl0KTsKKwkJbGl0ID0gMDsKKworCQkvKiAyIC0gY29kZSBtYXRjaCAqLworCQlvcCA9IGNvZGVfbWF0Y2goYywgb3AsIG1fbGVuLCBtX29mZik7CisJCXN3ZC0+bWF4X2NoYWluID0gbWF4X2NoYWluOworCQlyID0gZmluZF9tYXRjaChjLCBzd2QsIG1fbGVuLCAxK2FoZWFkKTsKKwkJYXNzZXJ0KHIgPT0gMCk7CisKKyBsYXp5X21hdGNoX2RvbmU6IDsKKwl9CisKKwkvKiBzdG9yZSBmaW5hbCBydW4gKi8KKwlpZiAobGl0ID4gMCkKKwkJb3AgPSBTVE9SRV9SVU4oYywgb3AsIGlpLCBsaXQpOworCisjaWYgZGVmaW5lZChMWk9fRU9GX0NPREUpCisJKm9wKysgPSBNNF9NQVJLRVIgfCAxOworCSpvcCsrID0gMDsKKwkqb3ArKyA9IDA7CisjZW5kaWYKKworCSpvdXRfbGVuID0gb3AgLSBvdXQ7CisKKwlyZXR1cm4gTFpPX0VfT0s7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50IGx6bzF4Xzk5OV9jb21wcmVzc19sZXZlbChjb25zdCB1aW50OF90ICppbiwgdW5zaWduZWQgaW5fbGVuLAorCQl1aW50OF90ICpvdXQsIHVuc2lnbmVkICpvdXRfbGVuLAorCQl2b2lkICp3cmttZW0sCisJCWludCBjb21wcmVzc2lvbl9sZXZlbCkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJdWludDE2X3QgZ29vZF9sZW5ndGg7CisJCXVpbnQxNl90IG1heF9sYXp5OworCQl1aW50MTZfdCBtYXhfY2hhaW47CisJCXVpbnQxNl90IHVzZV9iZXN0X29mZjsKKwl9IGNbM10gPSB7CisJCXsgICAgIDgsICAgIDMyLCAgMjU2LCAgIDAgfSwKKwkJeyAgICAzMiwgICAxMjgsIDIwNDgsICAgMSB9LAorCQl7IFNXRF9GLCBTV0RfRiwgNDA5NiwgICAxIH0gICAgICAgLyogbWF4LiBjb21wcmVzc2lvbiAqLworCX07CisKKwlpZiAoY29tcHJlc3Npb25fbGV2ZWwgPCA3IHx8IGNvbXByZXNzaW9uX2xldmVsID4gOSkKKwkJcmV0dXJuIExaT19FX0VSUk9SOworCisJY29tcHJlc3Npb25fbGV2ZWwgLT0gNzsKKwlyZXR1cm4gbHpvMXhfOTk5X2NvbXByZXNzX2ludGVybmFsKGluLCBpbl9sZW4sIG91dCwgb3V0X2xlbiwgd3JrbWVtLAorCQkJCQljW2NvbXByZXNzaW9uX2xldmVsXS5nb29kX2xlbmd0aCwKKwkJCQkJY1tjb21wcmVzc2lvbl9sZXZlbF0ubWF4X2xhenksCisJCQkJCWNbY29tcHJlc3Npb25fbGV2ZWxdLm1heF9jaGFpbiwKKwkJCQkJY1tjb21wcmVzc2lvbl9sZXZlbF0udXNlX2Jlc3Rfb2ZmKTsKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvbHpvMXhfYy5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9sem8xeF9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM3NzA3MgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvbHpvMXhfYy5jCkBAIC0wLDAgKzEsMjk2IEBACisvKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTFpPMVtYWV0tMSBjb21wcmVzc2lvbiBhbGdvcml0aG0KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExaTyByZWFsLXRpbWUgZGF0YSBjb21wcmVzc2lvbiBsaWJyYXJ5LgorCisgICBDb3B5cmlnaHQgKEMpIDE5OTYuLjIwMDggTWFya3VzIEZyYW56IFhhdmVyIEpvaGFubmVzIE9iZXJodW1lcgorICAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKworICAgTWFya3VzIEYuWC5KLiBPYmVyaHVtZXIgPG1hcmt1c0BvYmVyaHVtZXIuY29tPgorICAgaHR0cDovL3d3dy5vYmVyaHVtZXIuY29tL29wZW5zb3VyY2UvbHpvLworCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICAgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YKKyAgIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgTFpPIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGUgTFpPIGxpYnJhcnk7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLgorICAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBjb21wcmVzcyBhIGJsb2NrIG9mIGRhdGEuCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgTk9JTkxJTkUgdW5zaWduZWQKK2RvX2NvbXByZXNzKGNvbnN0IHVpbnQ4X3QqIGluLCB1bnNpZ25lZCBpbl9sZW4sCisJCXVpbnQ4X3QqIG91dCwgdW5zaWduZWQqIG91dF9sZW4sCisJCXZvaWQqIHdya21lbSkKK3sKKwlyZWdpc3RlciBjb25zdCB1aW50OF90KiBpcDsKKwl1aW50OF90KiBvcDsKKwljb25zdCB1aW50OF90KiBjb25zdCBpbl9lbmQgPSBpbiArIGluX2xlbjsKKwljb25zdCB1aW50OF90KiBjb25zdCBpcF9lbmQgPSBpbiArIGluX2xlbiAtIE0yX01BWF9MRU4gLSA1OworCWNvbnN0IHVpbnQ4X3QqIGlpOworCWNvbnN0IHZvaWQqICpjb25zdCBkaWN0ID0gKGNvbnN0IHZvaWQqKikgd3JrbWVtOworCisJb3AgPSBvdXQ7CisJaXAgPSBpbjsKKwlpaSA9IGlwOworCisJaXAgKz0gNDsKKwlmb3IgKDs7KSB7CisJCXJlZ2lzdGVyIGNvbnN0IHVpbnQ4X3QqIG1fcG9zOworCQl1bnNpZ25lZCBtX29mZjsKKwkJdW5zaWduZWQgbV9sZW47CisJCXVuc2lnbmVkIGRpbmRleDsKKworCQlEX0lOREVYMShkaW5kZXgsaXApOworCQlHSU5ERVgobV9wb3MsbV9vZmYsZGljdCxkaW5kZXgsaW4pOworCQlpZiAoTFpPX0NIRUNLX01QT1NfTk9OX0RFVChtX3BvcyxtX29mZixpbixpcCxNNF9NQVhfT0ZGU0VUKSkKKwkJCWdvdG8gbGl0ZXJhbDsKKyNpZiAxCisJCWlmIChtX29mZiA8PSBNMl9NQVhfT0ZGU0VUIHx8IG1fcG9zWzNdID09IGlwWzNdKQorCQkJZ290byB0cnlfbWF0Y2g7CisJCURfSU5ERVgyKGRpbmRleCxpcCk7CisjZW5kaWYKKwkJR0lOREVYKG1fcG9zLG1fb2ZmLGRpY3QsZGluZGV4LGluKTsKKwkJaWYgKExaT19DSEVDS19NUE9TX05PTl9ERVQobV9wb3MsbV9vZmYsaW4saXAsTTRfTUFYX09GRlNFVCkpCisJCQlnb3RvIGxpdGVyYWw7CisJCWlmIChtX29mZiA8PSBNMl9NQVhfT0ZGU0VUIHx8IG1fcG9zWzNdID09IGlwWzNdKQorCQkJZ290byB0cnlfbWF0Y2g7CisJCWdvdG8gbGl0ZXJhbDsKKworIHRyeV9tYXRjaDoKKyNpZiAxICYmIGRlZmluZWQoTFpPX1VOQUxJR05FRF9PS18yKQorCQlpZiAoKiAoY29uc3QgbHpvX3VzaG9ydHApIG1fcG9zICE9ICogKGNvbnN0IGx6b191c2hvcnRwKSBpcCkKKyNlbHNlCisJCWlmIChtX3Bvc1swXSAhPSBpcFswXSB8fCBtX3Bvc1sxXSAhPSBpcFsxXSkKKyNlbmRpZgorCQl7CisJCX0gZWxzZSB7CisJCQlpZiAobV9wb3NbMl0gPT0gaXBbMl0pIHsKKyNpZiAwCisJCQkJaWYgKG1fb2ZmIDw9IE0yX01BWF9PRkZTRVQpCisJCQkJCWdvdG8gbWF0Y2g7CisJCQkJaWYgKGxpdCA8PSAzKQorCQkJCQlnb3RvIG1hdGNoOworCQkJCWlmIChsaXQgPT0gMykgewkJCSAgLyogYmV0dGVyIGNvbXByZXNzaW9uLCBidXQgc2xvd2VyICovCisJCQkJCWFzc2VydChvcCAtIDIgPiBvdXQpOyBvcFstMl0gfD0gKHVpbnQ4X3QpKDMpOworCQkJCQkqb3ArKyA9ICppaSsrOyAqb3ArKyA9ICppaSsrOyAqb3ArKyA9ICppaSsrOworCQkJCQlnb3RvIGNvZGVfbWF0Y2g7CisJCQkJfQorCQkJCWlmIChtX3Bvc1szXSA9PSBpcFszXSkKKyNlbmRpZgorCQkJCQlnb3RvIG1hdGNoOworCQkJfQorCQkJZWxzZSB7CisJCQkJLyogc3RpbGwgbmVlZCBhIGJldHRlciB3YXkgZm9yIGZpbmRpbmcgTTEgbWF0Y2hlcyAqLworI2lmIDAKKwkJCQkvKiBhIE0xIG1hdGNoICovCisjaWYgMAorCQkJCWlmIChtX29mZiA8PSBNMV9NQVhfT0ZGU0VUICYmIGxpdCA+IDAgJiYgbGl0IDw9IDMpCisjZWxzZQorCQkJCWlmIChtX29mZiA8PSBNMV9NQVhfT0ZGU0VUICYmIGxpdCA9PSAzKQorI2VuZGlmCisJCQkJeworCQkJCQlyZWdpc3RlciB1bnNpZ25lZCB0OworCisJCQkJCXQgPSBsaXQ7CisJCQkJCWFzc2VydChvcCAtIDIgPiBvdXQpOyBvcFstMl0gfD0gKHVpbnQ4X3QpKHQpOworCQkJCQlkbyAqb3ArKyA9ICppaSsrOyB3aGlsZSAoLS10ID4gMCk7CisJCQkJCWFzc2VydChpaSA9PSBpcCk7CisJCQkJCW1fb2ZmIC09IDE7CisJCQkJCSpvcCsrID0gKHVpbnQ4X3QpKE0xX01BUktFUiB8ICgobV9vZmYgJiAzKSA8PCAyKSk7CisJCQkJCSpvcCsrID0gKHVpbnQ4X3QpKG1fb2ZmID4+IDIpOworCQkJCQlpcCArPSAyOworCQkJCQlnb3RvIG1hdGNoX2RvbmU7CisJCQkJfQorI2VuZGlmCisJCQl9CisJCX0KKworCQkvKiBhIGxpdGVyYWwgKi8KKyBsaXRlcmFsOgorCQlVUERBVEVfSShkaWN0LCAwLCBkaW5kZXgsIGlwLCBpbik7CisJCSsraXA7CisJCWlmIChpcCA+PSBpcF9lbmQpCisJCQlicmVhazsKKwkJY29udGludWU7CisKKwkJLyogYSBtYXRjaCAqLworbWF0Y2g6CisJCVVQREFURV9JKGRpY3QsIDAsIGRpbmRleCwgaXAsIGluKTsKKwkJLyogc3RvcmUgY3VycmVudCBsaXRlcmFsIHJ1biAqLworCQlpZiAocGQoaXAsIGlpKSA+IDApIHsKKwkJCXJlZ2lzdGVyIHVuc2lnbmVkIHQgPSBwZChpcCwgaWkpOworCisJCQlpZiAodCA8PSAzKSB7CisJCQkJYXNzZXJ0KG9wIC0gMiA+IG91dCk7CisJCQkJb3BbLTJdIHw9ICh1aW50OF90KSh0KTsKKwkJCX0KKwkJCWVsc2UgaWYgKHQgPD0gMTgpCisJCQkJKm9wKysgPSAodWludDhfdCkodCAtIDMpOworCQkJZWxzZSB7CisJCQkJcmVnaXN0ZXIgdW5zaWduZWQgdHQgPSB0IC0gMTg7CisKKwkJCQkqb3ArKyA9IDA7CisJCQkJd2hpbGUgKHR0ID4gMjU1KSB7CisJCQkJCXR0IC09IDI1NTsKKwkJCQkJKm9wKysgPSAwOworCQkJCX0KKwkJCQlhc3NlcnQodHQgPiAwKTsKKwkJCQkqb3ArKyA9ICh1aW50OF90KSh0dCk7CisJCQl9CisJCQlkbyAqb3ArKyA9ICppaSsrOyB3aGlsZSAoLS10ID4gMCk7CisJCX0KKworCQkvKiBjb2RlIHRoZSBtYXRjaCAqLworCQlhc3NlcnQoaWkgPT0gaXApOworCQlpcCArPSAzOworCQlpZiAobV9wb3NbM10gIT0gKmlwKysgfHwgbV9wb3NbNF0gIT0gKmlwKysgfHwgbV9wb3NbNV0gIT0gKmlwKysKKwkJIHx8IG1fcG9zWzZdICE9ICppcCsrIHx8IG1fcG9zWzddICE9ICppcCsrIHx8IG1fcG9zWzhdICE9ICppcCsrCisjaWZkZWYgTFpPMVkKKwkJIHx8IG1fcG9zWyA5XSAhPSAqaXArKyB8fCBtX3Bvc1sxMF0gIT0gKmlwKysgfHwgbV9wb3NbMTFdICE9ICppcCsrCisJCSB8fCBtX3Bvc1sxMl0gIT0gKmlwKysgfHwgbV9wb3NbMTNdICE9ICppcCsrIHx8IG1fcG9zWzE0XSAhPSAqaXArKworI2VuZGlmCisJCSkgeworCQkJLS1pcDsKKwkJCW1fbGVuID0gcGQoaXAsIGlpKTsKKwkJCWFzc2VydChtX2xlbiA+PSAzKTsKKwkJCWFzc2VydChtX2xlbiA8PSBNMl9NQVhfTEVOKTsKKworCQkJaWYgKG1fb2ZmIDw9IE0yX01BWF9PRkZTRVQpIHsKKwkJCQltX29mZiAtPSAxOworI2lmIGRlZmluZWQoTFpPMVgpCisJCQkJKm9wKysgPSAodWludDhfdCkoKChtX2xlbiAtIDEpIDw8IDUpIHwgKChtX29mZiAmIDcpIDw8IDIpKTsKKwkJCQkqb3ArKyA9ICh1aW50OF90KShtX29mZiA+PiAzKTsKKyNlbGlmIGRlZmluZWQoTFpPMVkpCisJCQkJKm9wKysgPSAodWludDhfdCkoKChtX2xlbiArIDEpIDw8IDQpIHwgKChtX29mZiAmIDMpIDw8IDIpKTsKKwkJCQkqb3ArKyA9ICh1aW50OF90KShtX29mZiA+PiAyKTsKKyNlbmRpZgorCQkJfQorCQkJZWxzZSBpZiAobV9vZmYgPD0gTTNfTUFYX09GRlNFVCkgeworCQkJCW1fb2ZmIC09IDE7CisJCQkJKm9wKysgPSAodWludDhfdCkoTTNfTUFSS0VSIHwgKG1fbGVuIC0gMikpOworCQkJCWdvdG8gbTNfbTRfb2Zmc2V0OworCQkJfSBlbHNlIHsKKyNpZiBkZWZpbmVkKExaTzFYKQorCQkJCW1fb2ZmIC09IDB4NDAwMDsKKwkJCQlhc3NlcnQobV9vZmYgPiAwKTsKKwkJCQlhc3NlcnQobV9vZmYgPD0gMHg3ZmZmKTsKKwkJCQkqb3ArKyA9ICh1aW50OF90KShNNF9NQVJLRVIgfCAoKG1fb2ZmICYgMHg0MDAwKSA+PiAxMSkgfCAobV9sZW4gLSAyKSk7CisJCQkJZ290byBtM19tNF9vZmZzZXQ7CisjZWxpZiBkZWZpbmVkKExaTzFZKQorCQkJCWdvdG8gbTRfbWF0Y2g7CisjZW5kaWYKKwkJCX0KKwkJfQorCQllbHNlIHsKKwkJCXsKKwkJCQljb25zdCB1aW50OF90KiBlbmQgPSBpbl9lbmQ7CisJCQkJY29uc3QgdWludDhfdCogbSA9IG1fcG9zICsgTTJfTUFYX0xFTiArIDE7CisJCQkJd2hpbGUgKGlwIDwgZW5kICYmICptID09ICppcCkKKwkJCQkJbSsrLCBpcCsrOworCQkJCW1fbGVuID0gcGQoaXAsIGlpKTsKKwkJCX0KKwkJCWFzc2VydChtX2xlbiA+IE0yX01BWF9MRU4pOworCisJCQlpZiAobV9vZmYgPD0gTTNfTUFYX09GRlNFVCkgeworCQkJCW1fb2ZmIC09IDE7CisJCQkJaWYgKG1fbGVuIDw9IDMzKQorCQkJCQkqb3ArKyA9ICh1aW50OF90KShNM19NQVJLRVIgfCAobV9sZW4gLSAyKSk7CisJCQkJZWxzZSB7CisJCQkJCW1fbGVuIC09IDMzOworCQkJCQkqb3ArKyA9IE0zX01BUktFUiB8IDA7CisJCQkJCWdvdG8gbTNfbTRfbGVuOworCQkJCX0KKwkJCX0gZWxzZSB7CisjaWYgZGVmaW5lZChMWk8xWSkKKyBtNF9tYXRjaDoKKyNlbmRpZgorCQkJCW1fb2ZmIC09IDB4NDAwMDsKKwkJCQlhc3NlcnQobV9vZmYgPiAwKTsKKwkJCQlhc3NlcnQobV9vZmYgPD0gMHg3ZmZmKTsKKwkJCQlpZiAobV9sZW4gPD0gTTRfTUFYX0xFTikKKwkJCQkJKm9wKysgPSAodWludDhfdCkoTTRfTUFSS0VSIHwgKChtX29mZiAmIDB4NDAwMCkgPj4gMTEpIHwgKG1fbGVuIC0gMikpOworCQkJCWVsc2UgeworCQkJCQltX2xlbiAtPSBNNF9NQVhfTEVOOworCQkJCQkqb3ArKyA9ICh1aW50OF90KShNNF9NQVJLRVIgfCAoKG1fb2ZmICYgMHg0MDAwKSA+PiAxMSkpOworIG0zX200X2xlbjoKKwkJCQkJd2hpbGUgKG1fbGVuID4gMjU1KSB7CisJCQkJCQltX2xlbiAtPSAyNTU7CisJCQkJCQkqb3ArKyA9IDA7CisJCQkJCX0KKwkJCQkJYXNzZXJ0KG1fbGVuID4gMCk7CisJCQkJCSpvcCsrID0gKHVpbnQ4X3QpKG1fbGVuKTsKKwkJCQl9CisJCQl9CisgbTNfbTRfb2Zmc2V0OgorCQkJKm9wKysgPSAodWludDhfdCkoKG1fb2ZmICYgNjMpIDw8IDIpOworCQkJKm9wKysgPSAodWludDhfdCkobV9vZmYgPj4gNik7CisJCX0KKyNpZiAwCisgbWF0Y2hfZG9uZToKKyNlbmRpZgorCQlpaSA9IGlwOworCQlpZiAoaXAgPj0gaXBfZW5kKQorCQkJYnJlYWs7CisJfQorCisJKm91dF9sZW4gPSBwZChvcCwgb3V0KTsKKwlyZXR1cm4gcGQoaW5fZW5kLCBpaSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gcHVibGljIGVudHJ5IHBvaW50CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitpbnQgRE9fQ09NUFJFU1MoY29uc3QgdWludDhfdCogaW4sIHVuc2lnbmVkIGluX2xlbiwKKwkJdWludDhfdCogb3V0LCB1bnNpZ25lZCogb3V0X2xlbiwKKwkJdm9pZCogd3JrbWVtKQoreworCXVpbnQ4X3QqIG9wID0gb3V0OworCXVuc2lnbmVkIHQ7CisKKwlpZiAoaW5fbGVuIDw9IE0yX01BWF9MRU4gKyA1KQorCQl0ID0gaW5fbGVuOworCWVsc2UgeworCQl0ID0gZG9fY29tcHJlc3MoaW4saW5fbGVuLG9wLG91dF9sZW4sd3JrbWVtKTsKKwkJb3AgKz0gKm91dF9sZW47CisJfQorCisJaWYgKHQgPiAwKSB7CisJCWNvbnN0IHVpbnQ4X3QqIGlpID0gaW4gKyBpbl9sZW4gLSB0OworCisJCWlmIChvcCA9PSBvdXQgJiYgdCA8PSAyMzgpCisJCQkqb3ArKyA9ICh1aW50OF90KSgxNyArIHQpOworCQllbHNlIGlmICh0IDw9IDMpCisJCQlvcFstMl0gfD0gKHVpbnQ4X3QpKHQpOworCQllbHNlIGlmICh0IDw9IDE4KQorCQkJKm9wKysgPSAodWludDhfdCkodCAtIDMpOworCQllbHNlIHsKKwkJCXVuc2lnbmVkIHR0ID0gdCAtIDE4OworCisJCQkqb3ArKyA9IDA7CisJCQl3aGlsZSAodHQgPiAyNTUpIHsKKwkJCQl0dCAtPSAyNTU7CisJCQkJKm9wKysgPSAwOworCQkJfQorCQkJYXNzZXJ0KHR0ID4gMCk7CisJCQkqb3ArKyA9ICh1aW50OF90KSh0dCk7CisJCX0KKwkJZG8gKm9wKysgPSAqaWkrKzsgd2hpbGUgKC0tdCA+IDApOworCX0KKworCSpvcCsrID0gTTRfTUFSS0VSIHwgMTsKKwkqb3ArKyA9IDA7CisJKm9wKysgPSAwOworCisJKm91dF9sZW4gPSBwZChvcCwgb3V0KTsKKwlyZXR1cm4gMDsgLypMWk9fRV9PSyovCit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL2x6bzF4X2QuYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvbHpvMXhfZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYjE2N2UKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL2x6bzF4X2QuYwpAQCAtMCwwICsxLDQyMyBAQAorLyogaW1wbGVtZW50YXRpb24gb2YgdGhlIExaTzFYIGRlY29tcHJlc3Npb24gYWxnb3JpdGhtCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2Li4yMDA4IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJsaWJsem8uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBkZWNvbXByZXNzIGEgYmxvY2sgb2YgZGF0YS4KKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIHNhZmUgZGVjb21wcmVzc2lvbiB3aXRoIG92ZXJydW4gdGVzdGluZyAqLworaW50IGx6bzF4X2RlY29tcHJlc3Nfc2FmZShjb25zdCB1aW50OF90KiBpbiwgdW5zaWduZWQgaW5fbGVuLAorCQl1aW50OF90KiBvdXQsIHVuc2lnbmVkKiBvdXRfbGVuLAorCQl2b2lkKiB3cmttZW0gVU5VU0VEX1BBUkFNKQoreworCXJlZ2lzdGVyIHVpbnQ4X3QqIG9wOworCXJlZ2lzdGVyIGNvbnN0IHVpbnQ4X3QqIGlwOworCXJlZ2lzdGVyIHVuc2lnbmVkIHQ7CisjaWYgZGVmaW5lZChDT1BZX0RJQ1QpCisJdW5zaWduZWQgbV9vZmY7CisJY29uc3QgdWludDhfdCogZGljdF9lbmQ7CisjZWxzZQorCXJlZ2lzdGVyIGNvbnN0IHVpbnQ4X3QqIG1fcG9zID0gTlVMTDsgLyogcG9zc2libHkgbm90IG5lZWRlZCAqLworI2VuZGlmCisJY29uc3QgdWludDhfdCogY29uc3QgaXBfZW5kID0gaW4gKyBpbl9sZW47CisjaWYgZGVmaW5lZChIQVZFX0FOWV9PUCkKKwl1aW50OF90KiBjb25zdCBvcF9lbmQgPSBvdXQgKyAqb3V0X2xlbjsKKyNlbmRpZgorI2lmIGRlZmluZWQoTFpPMVopCisJdW5zaWduZWQgbGFzdF9tX29mZiA9IDA7CisjZW5kaWYKKworLy8JTFpPX1VOVVNFRCh3cmttZW0pOworCisjaWYgZGVmaW5lZChDT1BZX0RJQ1QpCisJaWYgKGRpY3QpIHsKKwkJaWYgKGRpY3RfbGVuID4gTTRfTUFYX09GRlNFVCkgeworCQkJZGljdCArPSBkaWN0X2xlbiAtIE00X01BWF9PRkZTRVQ7CisJCQlkaWN0X2xlbiA9IE00X01BWF9PRkZTRVQ7CisJCX0KKwkJZGljdF9lbmQgPSBkaWN0ICsgZGljdF9sZW47CisJfSBlbHNlIHsKKwkJZGljdF9sZW4gPSAwOworCQlkaWN0X2VuZCA9IE5VTEw7CisJfQorI2VuZGlmIC8qIENPUFlfRElDVCAqLworCisJKm91dF9sZW4gPSAwOworCisJb3AgPSBvdXQ7CisJaXAgPSBpbjsKKworCWlmICgqaXAgPiAxNykgeworCQl0ID0gKmlwKysgLSAxNzsKKwkJaWYgKHQgPCA0KQorCQkJZ290byBtYXRjaF9uZXh0OworCQlhc3NlcnQodCA+IDApOyBORUVEX09QKHQpOyBORUVEX0lQKHQrMSk7CisJCWRvICpvcCsrID0gKmlwKys7IHdoaWxlICgtLXQgPiAwKTsKKwkJZ290byBmaXJzdF9saXRlcmFsX3J1bjsKKwl9CisKKwl3aGlsZSAoVEVTVF9JUCAmJiBURVNUX09QKSB7CisJCXQgPSAqaXArKzsKKwkJaWYgKHQgPj0gMTYpCisJCQlnb3RvIG1hdGNoOworCQkvKiBhIGxpdGVyYWwgcnVuICovCisJCWlmICh0ID09IDApIHsKKwkJCU5FRURfSVAoMSk7CisJCQl3aGlsZSAoKmlwID09IDApIHsKKwkJCQl0ICs9IDI1NTsKKwkJCQlpcCsrOworCQkJCU5FRURfSVAoMSk7CisJCQl9CisJCQlURVNUX0lWKHQpOworCQkJdCArPSAxNSArICppcCsrOworCQl9CisJCS8qIGNvcHkgbGl0ZXJhbHMgKi8KKwkJYXNzZXJ0KHQgPiAwKTsKKwkJTkVFRF9PUCh0KzMpOworCQlORUVEX0lQKHQrNCk7CisjaWYgZGVmaW5lZChMWk9fVU5BTElHTkVEX09LXzQpIHx8IGRlZmluZWQoTFpPX0FMSUdORURfT0tfNCkKKyMgaWYgIWRlZmluZWQoTFpPX1VOQUxJR05FRF9PS180KQorCQlpZiAoUFRSX0FMSUdORUQyXzQob3AsIGlwKSkKKyMgZW5kaWYKKwkJeworCQkJQ09QWTQob3AsIGlwKTsKKwkJCW9wICs9IDQ7CisJCQlpcCArPSA0OworCQkJaWYgKC0tdCA+IDApIHsKKwkJCQlpZiAodCA+PSA0KSB7CisJCQkJCWRvIHsKKwkJCQkJCUNPUFk0KG9wLCBpcCk7CisJCQkJCQlvcCArPSA0OworCQkJCQkJaXAgKz0gNDsKKwkJCQkJCXQgLT0gNDsKKwkJCQkJfSB3aGlsZSAodCA+PSA0KTsKKwkJCQkJaWYgKHQgPiAwKQorCQkJCQkJZG8gKm9wKysgPSAqaXArKzsgd2hpbGUgKC0tdCA+IDApOworCQkJCX0gZWxzZSB7CisJCQkJCWRvICpvcCsrID0gKmlwKys7IHdoaWxlICgtLXQgPiAwKTsKKwkJCQl9CisJCQl9CisJCX0KKyMgaWYgIWRlZmluZWQoTFpPX1VOQUxJR05FRF9PS180KQorCQllbHNlCisjIGVuZGlmCisjZW5kaWYKKyNpZiAhZGVmaW5lZChMWk9fVU5BTElHTkVEX09LXzQpCisJCXsKKwkJCSpvcCsrID0gKmlwKys7CisJCQkqb3ArKyA9ICppcCsrOworCQkJKm9wKysgPSAqaXArKzsKKwkJCWRvICpvcCsrID0gKmlwKys7IHdoaWxlICgtLXQgPiAwKTsKKwkJfQorI2VuZGlmCisKKyBmaXJzdF9saXRlcmFsX3J1bjoKKwkJdCA9ICppcCsrOworCQlpZiAodCA+PSAxNikKKwkJCWdvdG8gbWF0Y2g7CisjaWYgZGVmaW5lZChDT1BZX0RJQ1QpCisjaWYgZGVmaW5lZChMWk8xWikKKwkJbV9vZmYgPSAoMSArIE0yX01BWF9PRkZTRVQpICsgKHQgPDwgNikgKyAoKmlwKysgPj4gMik7CisJCWxhc3RfbV9vZmYgPSBtX29mZjsKKyNlbHNlCisJCW1fb2ZmID0gKDEgKyBNMl9NQVhfT0ZGU0VUKSArICh0ID4+IDIpICsgKCppcCsrIDw8IDIpOworI2VuZGlmCisJCU5FRURfT1AoMyk7CisJCXQgPSAzOyBDT1BZX0RJQ1QodCxtX29mZikKKyNlbHNlIC8qICFDT1BZX0RJQ1QgKi8KKyNpZiBkZWZpbmVkKExaTzFaKQorCQl0ID0gKDEgKyBNMl9NQVhfT0ZGU0VUKSArICh0IDw8IDYpICsgKCppcCsrID4+IDIpOworCQltX3BvcyA9IG9wIC0gdDsKKwkJbGFzdF9tX29mZiA9IHQ7CisjZWxzZQorCQltX3BvcyA9IG9wIC0gKDEgKyBNMl9NQVhfT0ZGU0VUKTsKKwkJbV9wb3MgLT0gdCA+PiAyOworCQltX3BvcyAtPSAqaXArKyA8PCAyOworI2VuZGlmCisJCVRFU1RfTEIobV9wb3MpOyBORUVEX09QKDMpOworCQkqb3ArKyA9ICptX3BvcysrOworCQkqb3ArKyA9ICptX3BvcysrOworCQkqb3ArKyA9ICptX3BvczsKKyNlbmRpZiAvKiBDT1BZX0RJQ1QgKi8KKwkJZ290byBtYXRjaF9kb25lOworCisJCS8qIGhhbmRsZSBtYXRjaGVzICovCisJCWRvIHsKKyBtYXRjaDoKKwkJCWlmICh0ID49IDY0KSB7CQkvKiBhIE0yIG1hdGNoICovCisjaWYgZGVmaW5lZChDT1BZX0RJQ1QpCisjaWYgZGVmaW5lZChMWk8xWCkKKwkJCQltX29mZiA9IDEgKyAoKHQgPj4gMikgJiA3KSArICgqaXArKyA8PCAzKTsKKwkJCQl0ID0gKHQgPj4gNSkgLSAxOworI2VsaWYgZGVmaW5lZChMWk8xWSkKKwkJCQltX29mZiA9IDEgKyAoKHQgPj4gMikgJiAzKSArICgqaXArKyA8PCAyKTsKKwkJCQl0ID0gKHQgPj4gNCkgLSAzOworI2VsaWYgZGVmaW5lZChMWk8xWikKKwkJCQltX29mZiA9IHQgJiAweDFmOworCQkJCWlmIChtX29mZiA+PSAweDFjKQorCQkJCQltX29mZiA9IGxhc3RfbV9vZmY7CisJCQkJZWxzZSB7CisJCQkJCW1fb2ZmID0gMSArIChtX29mZiA8PCA2KSArICgqaXArKyA+PiAyKTsKKwkJCQkJbGFzdF9tX29mZiA9IG1fb2ZmOworCQkJCX0KKwkJCQl0ID0gKHQgPj4gNSkgLSAxOworI2VuZGlmCisjZWxzZSAvKiAhQ09QWV9ESUNUICovCisjaWYgZGVmaW5lZChMWk8xWCkKKwkJCQltX3BvcyA9IG9wIC0gMTsKKwkJCQltX3BvcyAtPSAodCA+PiAyKSAmIDc7CisJCQkJbV9wb3MgLT0gKmlwKysgPDwgMzsKKwkJCQl0ID0gKHQgPj4gNSkgLSAxOworI2VsaWYgZGVmaW5lZChMWk8xWSkKKwkJCQltX3BvcyA9IG9wIC0gMTsKKwkJCQltX3BvcyAtPSAodCA+PiAyKSAmIDM7CisJCQkJbV9wb3MgLT0gKmlwKysgPDwgMjsKKwkJCQl0ID0gKHQgPj4gNCkgLSAzOworI2VsaWYgZGVmaW5lZChMWk8xWikKKwkJCQl7CisJCQkJCXVuc2lnbmVkIG9mZiA9IHQgJiAweDFmOworCQkJCQltX3BvcyA9IG9wOworCQkJCQlpZiAob2ZmID49IDB4MWMpIHsKKwkJCQkJCWFzc2VydChsYXN0X21fb2ZmID4gMCk7CisJCQkJCQltX3BvcyAtPSBsYXN0X21fb2ZmOworCQkJCQl9IGVsc2UgeworCQkJCQkJb2ZmID0gMSArIChvZmYgPDwgNikgKyAoKmlwKysgPj4gMik7CisJCQkJCQltX3BvcyAtPSBvZmY7CisJCQkJCQlsYXN0X21fb2ZmID0gb2ZmOworCQkJCQl9CisJCQkJfQorCQkJCXQgPSAodCA+PiA1KSAtIDE7CisjZW5kaWYKKwkJCQlURVNUX0xCKG1fcG9zKTsgYXNzZXJ0KHQgPiAwKTsgTkVFRF9PUCh0KzMtMSk7CisJCQkJZ290byBjb3B5X21hdGNoOworI2VuZGlmIC8qIENPUFlfRElDVCAqLworCQkJfQorCQkJZWxzZSBpZiAodCA+PSAzMikgewkJCS8qIGEgTTMgbWF0Y2ggKi8KKwkJCQl0ICY9IDMxOworCQkJCWlmICh0ID09IDApIHsKKwkJCQkJTkVFRF9JUCgxKTsKKwkJCQkJd2hpbGUgKCppcCA9PSAwKSB7CisJCQkJCQl0ICs9IDI1NTsKKwkJCQkJCWlwKys7CisJCQkJCQlORUVEX0lQKDEpOworCQkJCQl9CisJCQkJCVRFU1RfSVYodCk7CisJCQkJCXQgKz0gMzEgKyAqaXArKzsKKwkJCQl9CisjaWYgZGVmaW5lZChDT1BZX0RJQ1QpCisjaWYgZGVmaW5lZChMWk8xWikKKwkJCQltX29mZiA9IDEgKyAoaXBbMF0gPDwgNikgKyAoaXBbMV0gPj4gMik7CisJCQkJbGFzdF9tX29mZiA9IG1fb2ZmOworI2Vsc2UKKwkJCQltX29mZiA9IDEgKyAoaXBbMF0gPj4gMikgKyAoaXBbMV0gPDwgNik7CisjZW5kaWYKKyNlbHNlIC8qICFDT1BZX0RJQ1QgKi8KKyNpZiBkZWZpbmVkKExaTzFaKQorCQkJCXsKKwkJCQkJdW5zaWduZWQgb2ZmID0gMSArIChpcFswXSA8PCA2KSArIChpcFsxXSA+PiAyKTsKKwkJCQkJbV9wb3MgPSBvcCAtIG9mZjsKKwkJCQkJbGFzdF9tX29mZiA9IG9mZjsKKwkJCQl9CisjZWxpZiBkZWZpbmVkKExaT19VTkFMSUdORURfT0tfMikgJiYgZGVmaW5lZChMWk9fQUJJX0xJVFRMRV9FTkRJQU4pCisJCQkJbV9wb3MgPSBvcCAtIDE7CisJCQkJbV9wb3MgLT0gKCogKGNvbnN0IGx6b191c2hvcnRwKSBpcCkgPj4gMjsKKyNlbHNlCisJCQkJbV9wb3MgPSBvcCAtIDE7CisJCQkJbV9wb3MgLT0gKGlwWzBdID4+IDIpICsgKGlwWzFdIDw8IDYpOworI2VuZGlmCisjZW5kaWYgLyogQ09QWV9ESUNUICovCisJCQkJaXAgKz0gMjsKKwkJCX0KKwkJCWVsc2UgaWYgKHQgPj0gMTYpIHsJCQkvKiBhIE00IG1hdGNoICovCisjaWYgZGVmaW5lZChDT1BZX0RJQ1QpCisJCQkJbV9vZmYgPSAodCAmIDgpIDw8IDExOworI2Vsc2UgLyogIUNPUFlfRElDVCAqLworCQkJCW1fcG9zID0gb3A7CisJCQkJbV9wb3MgLT0gKHQgJiA4KSA8PCAxMTsKKyNlbmRpZiAvKiBDT1BZX0RJQ1QgKi8KKwkJCQl0ICY9IDc7CisJCQkJaWYgKHQgPT0gMCkgeworCQkJCQlORUVEX0lQKDEpOworCQkJCQl3aGlsZSAoKmlwID09IDApIHsKKwkJCQkJCXQgKz0gMjU1OworCQkJCQkJaXArKzsKKwkJCQkJCU5FRURfSVAoMSk7CisJCQkJCX0KKwkJCQkJVEVTVF9JVih0KTsKKwkJCQkJdCArPSA3ICsgKmlwKys7CisJCQkJfQorI2lmIGRlZmluZWQoQ09QWV9ESUNUKQorI2lmIGRlZmluZWQoTFpPMVopCisJCQkJbV9vZmYgKz0gKGlwWzBdIDw8IDYpICsgKGlwWzFdID4+IDIpOworI2Vsc2UKKwkJCQltX29mZiArPSAoaXBbMF0gPj4gMikgKyAoaXBbMV0gPDwgNik7CisjZW5kaWYKKwkJCQlpcCArPSAyOworCQkJCWlmIChtX29mZiA9PSAwKQorCQkJCQlnb3RvIGVvZl9mb3VuZDsKKwkJCQltX29mZiArPSAweDQwMDA7CisjaWYgZGVmaW5lZChMWk8xWikKKwkJCQlsYXN0X21fb2ZmID0gbV9vZmY7CisjZW5kaWYKKyNlbHNlIC8qICFDT1BZX0RJQ1QgKi8KKyNpZiBkZWZpbmVkKExaTzFaKQorCQkJCW1fcG9zIC09IChpcFswXSA8PCA2KSArIChpcFsxXSA+PiAyKTsKKyNlbGlmIGRlZmluZWQoTFpPX1VOQUxJR05FRF9PS18yKSAmJiBkZWZpbmVkKExaT19BQklfTElUVExFX0VORElBTikKKwkJCQltX3BvcyAtPSAoKiAoY29uc3QgbHpvX3VzaG9ydHApIGlwKSA+PiAyOworI2Vsc2UKKwkJCQltX3BvcyAtPSAoaXBbMF0gPj4gMikgKyAoaXBbMV0gPDwgNik7CisjZW5kaWYKKwkJCQlpcCArPSAyOworCQkJCWlmIChtX3BvcyA9PSBvcCkKKwkJCQkJZ290byBlb2ZfZm91bmQ7CisJCQkJbV9wb3MgLT0gMHg0MDAwOworI2lmIGRlZmluZWQoTFpPMVopCisJCQkJbGFzdF9tX29mZiA9IHBkKChjb25zdCB1aW50OF90KilvcCwgbV9wb3MpOworI2VuZGlmCisjZW5kaWYgLyogQ09QWV9ESUNUICovCisJCQl9CisJCQllbHNlIHsJCQkJLyogYSBNMSBtYXRjaCAqLworI2lmIGRlZmluZWQoQ09QWV9ESUNUKQorI2lmIGRlZmluZWQoTFpPMVopCisJCQkJbV9vZmYgPSAxICsgKHQgPDwgNikgKyAoKmlwKysgPj4gMik7CisJCQkJbGFzdF9tX29mZiA9IG1fb2ZmOworI2Vsc2UKKwkJCQltX29mZiA9IDEgKyAodCA+PiAyKSArICgqaXArKyA8PCAyKTsKKyNlbmRpZgorCQkJCU5FRURfT1AoMik7CisJCQkJdCA9IDI7IENPUFlfRElDVCh0LG1fb2ZmKQorI2Vsc2UgLyogIUNPUFlfRElDVCAqLworI2lmIGRlZmluZWQoTFpPMVopCisJCQkJdCA9IDEgKyAodCA8PCA2KSArICgqaXArKyA+PiAyKTsKKwkJCQltX3BvcyA9IG9wIC0gdDsKKwkJCQlsYXN0X21fb2ZmID0gdDsKKyNlbHNlCisJCQkJbV9wb3MgPSBvcCAtIDE7CisJCQkJbV9wb3MgLT0gdCA+PiAyOworCQkJCW1fcG9zIC09ICppcCsrIDw8IDI7CisjZW5kaWYKKwkJCQlURVNUX0xCKG1fcG9zKTsgTkVFRF9PUCgyKTsKKwkJCQkqb3ArKyA9ICptX3BvcysrOworCQkJCSpvcCsrID0gKm1fcG9zOworI2VuZGlmIC8qIENPUFlfRElDVCAqLworCQkJCWdvdG8gbWF0Y2hfZG9uZTsKKwkJCX0KKworCQkJLyogY29weSBtYXRjaCAqLworI2lmIGRlZmluZWQoQ09QWV9ESUNUKQorCisJCQlORUVEX09QKHQrMy0xKTsKKwkJCXQgKz0gMy0xOyBDT1BZX0RJQ1QodCxtX29mZikKKworI2Vsc2UgLyogIUNPUFlfRElDVCAqLworCisJCQlURVNUX0xCKG1fcG9zKTsgYXNzZXJ0KHQgPiAwKTsgTkVFRF9PUCh0KzMtMSk7CisjaWYgZGVmaW5lZChMWk9fVU5BTElHTkVEX09LXzQpIHx8IGRlZmluZWQoTFpPX0FMSUdORURfT0tfNCkKKyMgaWYgIWRlZmluZWQoTFpPX1VOQUxJR05FRF9PS180KQorCQkJaWYgKHQgPj0gMiAqIDQgLSAoMyAtIDEpICYmIFBUUl9BTElHTkVEMl80KG9wLG1fcG9zKSkgeworCQkJCWFzc2VydCgob3AgLSBtX3BvcykgPj0gNCk7CS8qIGJvdGggcG9pbnRlcnMgYXJlIGFsaWduZWQgKi8KKyMgZWxzZQorCQkJaWYgKHQgPj0gMiAqIDQgLSAoMyAtIDEpICYmIChvcCAtIG1fcG9zKSA+PSA0KSB7CisjIGVuZGlmCisJCQkJQ09QWTQob3AsbV9wb3MpOworCQkJCW9wICs9IDQ7IG1fcG9zICs9IDQ7IHQgLT0gNCAtICgzIC0gMSk7CisJCQkJZG8geworCQkJCQlDT1BZNChvcCxtX3Bvcyk7CisJCQkJCW9wICs9IDQ7IG1fcG9zICs9IDQ7IHQgLT0gNDsKKwkJCQl9IHdoaWxlICh0ID49IDQpOworCQkJCWlmICh0ID4gMCkKKwkJCQkJZG8gKm9wKysgPSAqbV9wb3MrKzsgd2hpbGUgKC0tdCA+IDApOworCQkJfQorCQkJZWxzZQorI2VuZGlmCisJCQl7CisgY29weV9tYXRjaDoKKwkJCQkqb3ArKyA9ICptX3BvcysrOyAqb3ArKyA9ICptX3BvcysrOworCQkJCWRvICpvcCsrID0gKm1fcG9zKys7IHdoaWxlICgtLXQgPiAwKTsKKwkJCX0KKworI2VuZGlmIC8qIENPUFlfRElDVCAqLworCisgbWF0Y2hfZG9uZToKKyNpZiBkZWZpbmVkKExaTzFaKQorCQkJdCA9IGlwWy0xXSAmIDM7CisjZWxzZQorCQkJdCA9IGlwWy0yXSAmIDM7CisjZW5kaWYKKwkJCWlmICh0ID09IDApCisJCQkJYnJlYWs7CisKKwkJCS8qIGNvcHkgbGl0ZXJhbHMgKi8KKyBtYXRjaF9uZXh0OgorCQkJYXNzZXJ0KHQgPiAwKTsKKwkJCWFzc2VydCh0IDwgNCk7CisJCQlORUVEX09QKHQpOworCQkJTkVFRF9JUCh0KzEpOworI2lmIDAKKwkJCWRvICpvcCsrID0gKmlwKys7IHdoaWxlICgtLXQgPiAwKTsKKyNlbHNlCisJCQkqb3ArKyA9ICppcCsrOworCQkJaWYgKHQgPiAxKSB7CisJCQkJKm9wKysgPSAqaXArKzsKKwkJCQlpZiAodCA+IDIpCisJCQkJCSpvcCsrID0gKmlwKys7CisJCQl9CisjZW5kaWYKKwkJCXQgPSAqaXArKzsKKwkJfSB3aGlsZSAoVEVTVF9JUCAmJiBURVNUX09QKTsKKwl9CisKKy8vI2lmIGRlZmluZWQoSEFWRV9URVNUX0lQKSB8fCBkZWZpbmVkKEhBVkVfVEVTVF9PUCkKKwkvKiBubyBFT0YgY29kZSB3YXMgZm91bmQgKi8KKwkqb3V0X2xlbiA9IHBkKG9wLCBvdXQpOworCXJldHVybiBMWk9fRV9FT0ZfTk9UX0ZPVU5EOworLy8jZW5kaWYKKworIGVvZl9mb3VuZDoKKwlhc3NlcnQodCA9PSAxKTsKKwkqb3V0X2xlbiA9IHBkKG9wLCBvdXQpOworCXJldHVybiAoaXAgPT0gaXBfZW5kID8gTFpPX0VfT0sgOgorCQkgICAoaXAgPCBpcF9lbmQJID8gTFpPX0VfSU5QVVRfTk9UX0NPTlNVTUVEIDogTFpPX0VfSU5QVVRfT1ZFUlJVTikpOworCisvLyNpZiBkZWZpbmVkKEhBVkVfTkVFRF9JUCkKKyBpbnB1dF9vdmVycnVuOgorCSpvdXRfbGVuID0gcGQob3AsIG91dCk7CisJcmV0dXJuIExaT19FX0lOUFVUX09WRVJSVU47CisvLyNlbmRpZgorCisvLyNpZiBkZWZpbmVkKEhBVkVfTkVFRF9PUCkKKyBvdXRwdXRfb3ZlcnJ1bjoKKwkqb3V0X2xlbiA9IHBkKG9wLCBvdXQpOworCXJldHVybiBMWk9fRV9PVVRQVVRfT1ZFUlJVTjsKKy8vI2VuZGlmCisKKy8vI2lmIGRlZmluZWQoTFpPX1RFU1RfT1ZFUlJVTl9MT09LQkVISU5EKQorIGxvb2tiZWhpbmRfb3ZlcnJ1bjoKKwkqb3V0X2xlbiA9IHBkKG9wLCBvdXQpOworCXJldHVybiBMWk9fRV9MT09LQkVISU5EX09WRVJSVU47CisvLyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS9vcGVuX3RyYW5zZm9ybWVyLmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL29wZW5fdHJhbnNmb3JtZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTUzNmEzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS9vcGVuX3RyYW5zZm9ybWVyLmMKQEAgLTAsMCArMSwzNTkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYmJfYXJjaGl2ZS5oIgorCit2b2lkIEZBU1RfRlVOQyBpbml0X3RyYW5zZm9ybWVyX3N0YXRlKHRyYW5zZm9ybWVyX3N0YXRlX3QgKnhzdGF0ZSkKK3sKKwltZW1zZXQoeHN0YXRlLCAwLCBzaXplb2YoKnhzdGF0ZSkpOworfQorCitpbnQgRkFTVF9GVU5DIGNoZWNrX3NpZ25hdHVyZTE2KHRyYW5zZm9ybWVyX3N0YXRlX3QgKnhzdGF0ZSwgdW5zaWduZWQgbWFnaWMxNikKK3sKKwlpZiAoeHN0YXRlLT5jaGVja19zaWduYXR1cmUpIHsKKwkJdWludDE2X3QgbWFnaWMyOworCQlpZiAoZnVsbF9yZWFkKHhzdGF0ZS0+c3JjX2ZkLCAmbWFnaWMyLCAyKSAhPSAyIHx8IG1hZ2ljMiAhPSBtYWdpYzE2KSB7CisJCQliYl9lcnJvcl9tc2coImludmFsaWQgbWFnaWMiKTsKKyNpZiAwIC8qIHBvc3NpYmxlIGZ1dHVyZSBleHRlbnNpb24gKi8KKwkJCWlmICh4c3RhdGUtPmNoZWNrX3NpZ25hdHVyZSA+IDEpCisJCQkJeGZ1bmNfZGllKCk7CisjZW5kaWYKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3NpemVfdCBGQVNUX0ZVTkMgdHJhbnNmb3JtZXJfd3JpdGUodHJhbnNmb3JtZXJfc3RhdGVfdCAqeHN0YXRlLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBidWZzaXplKQoreworCXNzaXplX3Qgbndyb3RlOworCisJaWYgKHhzdGF0ZS0+bWVtX291dHB1dF9zaXplX21heCAhPSAwKSB7CisJCXNpemVfdCBwb3MgPSB4c3RhdGUtPm1lbV9vdXRwdXRfc2l6ZTsKKwkJc2l6ZV90IHNpemU7CisKKwkJc2l6ZSA9ICh4c3RhdGUtPm1lbV9vdXRwdXRfc2l6ZSArPSBidWZzaXplKTsKKwkJaWYgKHNpemUgPiB4c3RhdGUtPm1lbV9vdXRwdXRfc2l6ZV9tYXgpIHsKKwkJCWZyZWUoeHN0YXRlLT5tZW1fb3V0cHV0X2J1Zik7CisJCQl4c3RhdGUtPm1lbV9vdXRwdXRfYnVmID0gTlVMTDsKKwkJCWJiX3BlcnJvcl9tc2coImJ1ZmZlciAldSB0b28gc21hbGwiLCAodW5zaWduZWQpeHN0YXRlLT5tZW1fb3V0cHV0X3NpemVfbWF4KTsKKwkJCW53cm90ZSA9IC0xOworCQkJZ290byByZXQ7CisJCX0KKwkJeHN0YXRlLT5tZW1fb3V0cHV0X2J1ZiA9IHhyZWFsbG9jKHhzdGF0ZS0+bWVtX291dHB1dF9idWYsIHNpemUgKyAxKTsKKwkJbWVtY3B5KHhzdGF0ZS0+bWVtX291dHB1dF9idWYgKyBwb3MsIGJ1ZiwgYnVmc2l6ZSk7CisJCXhzdGF0ZS0+bWVtX291dHB1dF9idWZbc2l6ZV0gPSAnXDAnOworCQlud3JvdGUgPSBidWZzaXplOworCX0gZWxzZSB7CisJCW53cm90ZSA9IGZ1bGxfd3JpdGUoeHN0YXRlLT5kc3RfZmQsIGJ1ZiwgYnVmc2l6ZSk7CisJCWlmIChud3JvdGUgIT0gKHNzaXplX3QpYnVmc2l6ZSkgeworCQkJYmJfcGVycm9yX21zZygid3JpdGUiKTsKKwkJCW53cm90ZSA9IC0xOworCQkJZ290byByZXQ7CisJCX0KKwl9CisgcmV0OgorCXJldHVybiBud3JvdGU7Cit9CisKK3NzaXplX3QgRkFTVF9GVU5DIHh0cmFuc2Zvcm1lcl93cml0ZSh0cmFuc2Zvcm1lcl9zdGF0ZV90ICp4c3RhdGUsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUpCit7CisJc3NpemVfdCBud3JvdGUgPSB0cmFuc2Zvcm1lcl93cml0ZSh4c3RhdGUsIGJ1ZiwgYnVmc2l6ZSk7CisJaWYgKG53cm90ZSAhPSAoc3NpemVfdClidWZzaXplKSB7CisJCXhmdW5jX2RpZSgpOworCX0KKwlyZXR1cm4gbndyb3RlOworfQorCit2b2lkIGNoZWNrX2Vycm9yc19pbl9jaGlsZHJlbihpbnQgc2lnbm8pCit7CisJaW50IHN0YXR1czsKKworCWlmICghc2lnbm8pIHsKKwkJLyogYmxvY2sgd2FpdGluZyBmb3IgYW55IGNoaWxkICovCisJCWlmICh3YWl0KCZzdGF0dXMpIDwgMCkKKy8vRklYTUU6IGNoZWNrIEVJTlRSPworCQkJcmV0dXJuOyAvKiBwcm9iYWJseSB0aGVyZSBhcmUgbm8gY2hpbGRyZW4gKi8KKwkJZ290byBjaGVja19zdGF0dXM7CisJfQorCisJLyogV2FpdCBmb3IgYW55IGNoaWxkIHdpdGhvdXQgYmxvY2tpbmcgKi8KKwlmb3IgKDs7KSB7CisJCWlmICh3YWl0X2FueV9ub2hhbmcoJnN0YXR1cykgPCAwKQorLy9GSVhNRTogY2hlY2sgRUlOVFI/CisJCQkvKiB3YWl0IGZhaWxlZD8hIEknbSBjb25mdXNlZC4uLiAqLworCQkJcmV0dXJuOworIGNoZWNrX3N0YXR1czoKKwkJLyppZiAoV0lGRVhJVEVEKHN0YXR1cykgJiYgV0VYSVRTVEFUVVMoc3RhdHVzKSA9PSAwKSovCisJCS8qIE9uIExpbnV4LCB0aGUgYWJvdmUgY2FuIGJlIGNoZWNrZWQgc2ltcGx5IGFzOiAqLworCQlpZiAoc3RhdHVzID09IDApCisJCQkvKiB0aGlzIGNoaWxkIGV4aXRlZCB3aXRoIDAgKi8KKwkJCWNvbnRpbnVlOworCQkvKiBDYW5ub3QgaGFwcGVuOgorCQlpZiAoIVdJRlNJR05BTEVEKHN0YXR1cykgJiYgIVdJRkVYSVRFRChzdGF0dXMpKSA/Pz87CisJCSAqLworCQliYl9nb3Rfc2lnbmFsID0gMTsKKwl9Cit9CisKKy8qIHRyYW5zZm9ybWVyKCksIG1vcmUgdGhhbiBtZWV0cyB0aGUgZXllICovCisjaWYgQkJfTU1VCit2b2lkIEZBU1RfRlVOQyBmb3JrX3RyYW5zZm9ybWVyKGludCBmZCwKKwlpbnQgY2hlY2tfc2lnbmF0dXJlLAorCUlGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgRkFTVF9GVU5DICgqdHJhbnNmb3JtZXIpKHRyYW5zZm9ybWVyX3N0YXRlX3QgKnhzdGF0ZSkKKykKKyNlbHNlCit2b2lkIEZBU1RfRlVOQyBmb3JrX3RyYW5zZm9ybWVyKGludCBmZCwgY29uc3QgY2hhciAqdHJhbnNmb3JtX3Byb2cpCisjZW5kaWYKK3sKKwlzdHJ1Y3QgZmRfcGFpciBmZF9waXBlOworCWludCBwaWQ7CisKKwl4cGlwZWRfcGFpcihmZF9waXBlKTsKKwlwaWQgPSBCQl9NTVUgPyB4Zm9yaygpIDogeHZmb3JrKCk7CisJaWYgKHBpZCA9PSAwKSB7CisJCS8qIENoaWxkICovCisJCWNsb3NlKGZkX3BpcGUucmQpOyAvKiB3ZSBkb24ndCB3YW50IHRvIHJlYWQgZnJvbSB0aGUgcGFyZW50ICovCisJCS8vIEZJWE1FOiBlcnJvciBjaGVjaz8KKyNpZiBCQl9NTVUKKwkJeworCQkJSUZfREVTS1RPUChsb25nIGxvbmcpIGludCByOworCQkJdHJhbnNmb3JtZXJfc3RhdGVfdCB4c3RhdGU7CisJCQlpbml0X3RyYW5zZm9ybWVyX3N0YXRlKCZ4c3RhdGUpOworCQkJeHN0YXRlLmNoZWNrX3NpZ25hdHVyZSA9IGNoZWNrX3NpZ25hdHVyZTsKKwkJCXhzdGF0ZS5zcmNfZmQgPSBmZDsKKwkJCXhzdGF0ZS5kc3RfZmQgPSBmZF9waXBlLndyOworCQkJciA9IHRyYW5zZm9ybWVyKCZ4c3RhdGUpOworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCQkJY2xvc2UoZmRfcGlwZS53cik7IC8qIHNlbmQgRU9GICovCisJCQkJY2xvc2UoZmQpOworCQkJfQorCQkJLyogbXVzdCBiZSBfZXhpdCEgYnVnIHdhcyBhY3R1YWxseSBzZWVuIGhlcmUgKi8KKwkJCV9leGl0KC8qZXJyb3IgaWY6Ki8gciA8IDApOworCQl9CisjZWxzZQorCQl7CisJCQljaGFyICphcmd2WzRdOworCQkJeG1vdmVfZmQoZmQsIDApOworCQkJeG1vdmVfZmQoZmRfcGlwZS53ciwgMSk7CisJCQlhcmd2WzBdID0gKGNoYXIqKXRyYW5zZm9ybV9wcm9nOworCQkJYXJndlsxXSA9IChjaGFyKikiLWNmIjsKKwkJCWFyZ3ZbMl0gPSAoY2hhciopIi0iOworCQkJYXJndlszXSA9IE5VTEw7CisJCQlCQl9FWEVDVlAodHJhbnNmb3JtX3Byb2csIGFyZ3YpOworCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBleGVjdXRlICclcyciLCB0cmFuc2Zvcm1fcHJvZyk7CisJCX0KKyNlbmRpZgorCQkvKiBub3RyZWFjaGVkICovCisJfQorCisJLyogcGFyZW50IHByb2Nlc3MgKi8KKwljbG9zZShmZF9waXBlLndyKTsgLyogZG9uJ3Qgd2FudCB0byB3cml0ZSB0byB0aGUgY2hpbGQgKi8KKwl4bW92ZV9mZChmZF9waXBlLnJkLCBmZCk7Cit9CisKKworI2lmIFNFQU1MRVNTX0NPTVBSRVNTSU9OCisKKy8qIFVzZWQgYnkgZS5nLiBycG0gd2hpY2ggZ2l2ZXMgdXMgYSBmZCB3aXRob3V0IGZpbGVuYW1lLAorICogdGh1cyB3ZSBjYW4ndCBndWVzcyB0aGUgZm9ybWF0IGZyb20gZmlsZW5hbWUncyBleHRlbnNpb24uCisgKi8KK3N0YXRpYyB0cmFuc2Zvcm1lcl9zdGF0ZV90ICpzZXR1cF90cmFuc2Zvcm1lcl9vbl9mZChpbnQgZmQsIGludCBmYWlsX2lmX25vdF9jb21wcmVzc2VkKQoreworCXVuaW9uIHsKKwkJdWludDhfdCBiWzRdOworCQl1aW50MTZfdCBiMTZbMl07CisJCXVpbnQzMl90IGIzMlsxXTsKKwl9IG1hZ2ljOworCWludCBvZmZzZXQ7CisJdHJhbnNmb3JtZXJfc3RhdGVfdCAqeHN0YXRlOworCisJb2Zmc2V0ID0gLTI7CisJeHN0YXRlID0geHphbGxvYyhzaXplb2YoKnhzdGF0ZSkpOworCXhzdGF0ZS0+c3JjX2ZkID0gZmQ7CisKKwkvKiAuZ3ogYW5kIC5iejIgYm90aCBoYXZlIDItYnl0ZSBzaWduYXR1cmUsIGFuZCB0aGVpcgorCSAqIHVucGFja19YWFhfc3RyZWFtIHdhbnRzIHRoaXMgaGVhZGVyIHNraXBwZWQuICovCisJeHJlYWQoZmQsIG1hZ2ljLmIxNiwgc2l6ZW9mKG1hZ2ljLmIxNlswXSkpOworCWlmIChFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19HWgorCSAmJiBtYWdpYy5iMTZbMF0gPT0gR1pJUF9NQUdJQworCSkgeworCQl4c3RhdGUtPnhmb3JtZXIgPSB1bnBhY2tfZ3pfc3RyZWFtOworCQlVU0VfRk9SX05PTU1VKHhzdGF0ZS0+eGZvcm1lcl9wcm9nID0gImd1bnppcCI7KQorCQlnb3RvIGZvdW5kX21hZ2ljOworCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfWgorCSAmJiBtYWdpYy5iMTZbMF0gPT0gQ09NUFJFU1NfTUFHSUMKKwkpIHsKKwkJeHN0YXRlLT54Zm9ybWVyID0gdW5wYWNrX1pfc3RyZWFtOworCQlVU0VfRk9SX05PTU1VKHhzdGF0ZS0+eGZvcm1lcl9wcm9nID0gInVuY29tcHJlc3MiOykKKwkJZ290byBmb3VuZF9tYWdpYzsKKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0JaMgorCSAmJiBtYWdpYy5iMTZbMF0gPT0gQlpJUDJfTUFHSUMKKwkpIHsKKwkJeHN0YXRlLT54Zm9ybWVyID0gdW5wYWNrX2J6Ml9zdHJlYW07CisJCVVTRV9GT1JfTk9NTVUoeHN0YXRlLT54Zm9ybWVyX3Byb2cgPSAiYnVuemlwMiI7KQorCQlnb3RvIGZvdW5kX21hZ2ljOworCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfWFoKKwkgJiYgbWFnaWMuYjE2WzBdID09IFhaX01BR0lDMQorCSkgeworCQlvZmZzZXQgPSAtNjsKKwkJeHJlYWQoZmQsIG1hZ2ljLmIzMiwgc2l6ZW9mKG1hZ2ljLmIzMlswXSkpOworCQlpZiAobWFnaWMuYjMyWzBdID09IFhaX01BR0lDMikgeworCQkJeHN0YXRlLT54Zm9ybWVyID0gdW5wYWNrX3h6X3N0cmVhbTsKKwkJCVVTRV9GT1JfTk9NTVUoeHN0YXRlLT54Zm9ybWVyX3Byb2cgPSAidW54eiI7KQorCQkJZ290byBmb3VuZF9tYWdpYzsKKwkJfQorCX0KKworCS8qIE5vIGtub3duIG1hZ2ljIHNlZW4gKi8KKwlpZiAoZmFpbF9pZl9ub3RfY29tcHJlc3NlZCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vIGd6aXAiCisJCQlJRl9GRUFUVVJFX1NFQU1MRVNTX0JaMigiL2J6aXAyIikKKwkJCUlGX0ZFQVRVUkVfU0VBTUxFU1NfWFooIi94eiIpCisJCQkiIG1hZ2ljIik7CisKKwkvKiBTb21lIGNhbGxlcnMgZXhwZWN0IHRoaXMgZnVuY3Rpb24gdG8gImNvbnN1bWUiIGZkCisJICogZXZlbiBpZiBkYXRhIGlzIG5vdCBjb21wcmVzc2VkLiBJbiB0aGlzIGNhc2UsCisJICogd2UgcmV0dXJuIGEgc3RhdGUgd2l0aCB0cml2aWFsIHRyYW5zZm9ybWVyLgorCSAqLworLy8JVVNFX0ZPUl9NTVUoeHN0YXRlLT54Zm9ybWVyID0gY29weV9zdHJlYW07KQorLy8JVVNFX0ZPUl9OT01NVSh4c3RhdGUtPnhmb3JtZXJfcHJvZyA9ICJjYXQiOykKKwkvKiBmYWxsIHRocm91Z2ggdG8gc2Vla2luZyBiY2sgb3ZlciBieXRlcyB3ZSByZWFkIGVhcmxpZXIgKi8KKworIFVTRV9GT1JfTk9NTVUoZm91bmRfbWFnaWM6KQorCS8qIE5PTU1VIHZlcnNpb24gb2YgZm9ya190cmFuc2Zvcm1lciBleGVjcworCSAqIGFuIGV4dGVybmFsIHVuemlwcGVyIHRoYXQgd2FudHMKKwkgKiBmaWxlIHBvc2l0aW9uIGF0IHRoZSBzdGFydCBvZiB0aGUgZmlsZS4KKwkgKi8KKwl4bHNlZWsoZmQsIG9mZnNldCwgU0VFS19DVVIpOworCisgVVNFX0ZPUl9NTVUoZm91bmRfbWFnaWM6KQorCS8qIEluIE1NVSBjYXNlLCBpZiBtYWdpYyB3YXMgZm91bmQsIHNlZWtpbmcgYmFjayBpcyBub3QgbmVjZXNzYXJ5ICovCisKKwlyZXR1cm4geHN0YXRlOworfQorCisvKiBVc2VkIGJ5IGUuZy4gcnBtIHdoaWNoIGdpdmVzIHVzIGEgZmQgd2l0aG91dCBmaWxlbmFtZSwKKyAqIHRodXMgd2UgY2FuJ3QgZ3Vlc3MgdGhlIGZvcm1hdCBmcm9tIGZpbGVuYW1lJ3MgZXh0ZW5zaW9uLgorICovCitpbnQgRkFTVF9GVU5DIHNldHVwX3VuemlwX29uX2ZkKGludCBmZCwgaW50IGZhaWxfaWZfbm90X2NvbXByZXNzZWQpCit7CisJdHJhbnNmb3JtZXJfc3RhdGVfdCAqeHN0YXRlID0gc2V0dXBfdHJhbnNmb3JtZXJfb25fZmQoZmQsIGZhaWxfaWZfbm90X2NvbXByZXNzZWQpOworCisJaWYgKCF4c3RhdGUgfHwgIXhzdGF0ZS0+eGZvcm1lcikgeworCQlmcmVlKHhzdGF0ZSk7CisJCXJldHVybiAxOworCX0KKworIyBpZiBCQl9NTVUKKwlmb3JrX3RyYW5zZm9ybWVyX3dpdGhfbm9fc2lnKHhzdGF0ZS0+c3JjX2ZkLCB4c3RhdGUtPnhmb3JtZXIpOworIyBlbHNlCisJZm9ya190cmFuc2Zvcm1lcl93aXRoX3NpZyh4c3RhdGUtPnNyY19mZCwgeHN0YXRlLT54Zm9ybWVyLCB4c3RhdGUtPnhmb3JtZXJfcHJvZyk7CisjIGVuZGlmCisJZnJlZSh4c3RhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdHJhbnNmb3JtZXJfc3RhdGVfdCAqb3Blbl90cmFuc2Zvcm1lcihjb25zdCBjaGFyICpmbmFtZSwgaW50IGZhaWxfaWZfbm90X2NvbXByZXNzZWQpCit7CisJdHJhbnNmb3JtZXJfc3RhdGVfdCAqeHN0YXRlOworCWludCBmZDsKKworCWZkID0gb3BlbihmbmFtZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApCisJCXJldHVybiBOVUxMOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0xaTUEpIHsKKwkJLyogLmx6bWEgaGFzIG5vIGhlYWRlci9zaWduYXR1cmUsIGNhbiBvbmx5IGRldGVjdCBpdCBieSBleHRlbnNpb24gKi8KKwkJY2hhciAqc2Z4ID0gc3RycmNocihmbmFtZSwgJy4nKTsKKwkJaWYgKHNmeCAmJiBzdHJjbXAoc2Z4KzEsICJsem1hIikgPT0gMCkgeworCQkJeHN0YXRlID0geHphbGxvYyhzaXplb2YoKnhzdGF0ZSkpOworCQkJeHN0YXRlLT5zcmNfZmQgPSBmZDsKKwkJCXhzdGF0ZS0+eGZvcm1lciA9IHVucGFja19sem1hX3N0cmVhbTsKKwkJCVVTRV9GT1JfTk9NTVUoeHN0YXRlLT54Zm9ybWVyX3Byb2cgPSAidW5sem1hIjspCisJCQlyZXR1cm4geHN0YXRlOworCQl9CisJfQorCisJeHN0YXRlID0gc2V0dXBfdHJhbnNmb3JtZXJfb25fZmQoZmQsIGZhaWxfaWZfbm90X2NvbXByZXNzZWQpOworCisJcmV0dXJuIHhzdGF0ZTsKK30KKworaW50IEZBU1RfRlVOQyBvcGVuX3ppcHBlZChjb25zdCBjaGFyICpmbmFtZSwgaW50IGZhaWxfaWZfbm90X2NvbXByZXNzZWQpCit7CisJaW50IGZkOworCXRyYW5zZm9ybWVyX3N0YXRlX3QgKnhzdGF0ZTsKKworCXhzdGF0ZSA9IG9wZW5fdHJhbnNmb3JtZXIoZm5hbWUsIGZhaWxfaWZfbm90X2NvbXByZXNzZWQpOworCWlmICgheHN0YXRlKQorCQlyZXR1cm4gLTE7CisKKwlmZCA9IHhzdGF0ZS0+c3JjX2ZkOworCWlmICh4c3RhdGUtPnhmb3JtZXIpIHsKKyMgaWYgQkJfTU1VCisJCWZvcmtfdHJhbnNmb3JtZXJfd2l0aF9ub19zaWcoeHN0YXRlLT5zcmNfZmQsIHhzdGF0ZS0+eGZvcm1lcik7CisjIGVsc2UKKwkJZm9ya190cmFuc2Zvcm1lcl93aXRoX3NpZyh4c3RhdGUtPnNyY19mZCwgeHN0YXRlLT54Zm9ybWVyLCB4c3RhdGUtPnhmb3JtZXJfcHJvZyk7CisjIGVuZGlmCisJfQorCS8qIGVsc2U6IHRoZSBmaWxlIGlzIG5vdCBjb21wcmVzc2VkICovCisKKwlmcmVlKHhzdGF0ZSk7CisJcmV0dXJuIGZkOworfQorCit2b2lkKiBGQVNUX0ZVTkMgeG1hbGxvY19vcGVuX3ppcHBlZF9yZWFkX2Nsb3NlKGNvbnN0IGNoYXIgKmZuYW1lLCBzaXplX3QgKm1heHN6X3ApCit7CisjIGlmIDEKKwl0cmFuc2Zvcm1lcl9zdGF0ZV90ICp4c3RhdGU7CisJY2hhciAqaW1hZ2U7CisKKwl4c3RhdGUgPSBvcGVuX3RyYW5zZm9ybWVyKGZuYW1lLCAvKmZhaWxfaWZfbm90X2NvbXByZXNzZWQ6Ki8gMCk7CisJaWYgKCF4c3RhdGUpIC8qIGZpbGUgb3BlbiBlcnJvciAqLworCQlyZXR1cm4gTlVMTDsKKworCWltYWdlID0gTlVMTDsKKwlpZiAoeHN0YXRlLT54Zm9ybWVyKSB7CisJCS8qIEluLW1lbW9yeSBkZWNvbXByZXNzaW9uICovCisJCXhzdGF0ZS0+bWVtX291dHB1dF9zaXplX21heCA9IG1heHN6X3AgPyAqbWF4c3pfcCA6IChzaXplX3QpKElOVF9NQVggLSA0MDk1KTsKKwkJeHN0YXRlLT54Zm9ybWVyKHhzdGF0ZSk7CisJCWlmICh4c3RhdGUtPm1lbV9vdXRwdXRfYnVmKSB7CisJCQlpbWFnZSA9IHhzdGF0ZS0+bWVtX291dHB1dF9idWY7CisJCQlpZiAobWF4c3pfcCkKKwkJCQkqbWF4c3pfcCA9IHhzdGF0ZS0+bWVtX291dHB1dF9zaXplOworCQl9CisJfSBlbHNlIHsKKwkJLyogRmlsZSBpcyBub3QgY29tcHJlc3NlZCAqLworCQlpbWFnZSA9IHhtYWxsb2NfcmVhZCh4c3RhdGUtPnNyY19mZCwgbWF4c3pfcCk7CisJfQorCisJaWYgKCFpbWFnZSkKKwkJYmJfcGVycm9yX21zZygicmVhZCBlcnJvciBmcm9tICclcyciLCBmbmFtZSk7CisJY2xvc2UoeHN0YXRlLT5zcmNfZmQpOworCWZyZWUoeHN0YXRlKTsKKwlyZXR1cm4gaW1hZ2U7CisjIGVsc2UKKwkvKiBUaGlzIHZlcnNpb24gZm9ya3MgYSBzdWJwcm9jZXNzIC0gbXVjaCBtb3JlIGV4cGVuc2l2ZSAqLworCWludCBmZDsKKwljaGFyICppbWFnZTsKKworCWZkID0gb3Blbl96aXBwZWQoZm5hbWUsIC8qZmFpbF9pZl9ub3RfY29tcHJlc3NlZDoqLyAwKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCWltYWdlID0geG1hbGxvY19yZWFkKGZkLCBtYXhzel9wKTsKKwlpZiAoIWltYWdlKQorCQliYl9wZXJyb3JfbXNnKCJyZWFkIGVycm9yIGZyb20gJyVzJyIsIGZuYW1lKTsKKwljbG9zZShmZCk7CisJcmV0dXJuIGltYWdlOworIyBlbmRpZgorfQorCisjZW5kaWYgLyogU0VBTUxFU1NfQ09NUFJFU1NJT04gKi8KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvc2Vla19ieV9qdW1wLmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL3NlZWtfYnlfanVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmY2Q5OWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL3NlZWtfYnlfanVtcC5jCkBAIC0wLDAgKzEsMTkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYmJfYXJjaGl2ZS5oIgorCit2b2lkIEZBU1RfRlVOQyBzZWVrX2J5X2p1bXAoaW50IGZkLCBvZmZfdCBhbW91bnQpCit7CisJaWYgKGFtb3VudAorCSAmJiBsc2VlayhmZCwgYW1vdW50LCBTRUVLX0NVUikgPT0gKG9mZl90KSAtMQorCSkgeworCQlpZiAoZXJybm8gPT0gRVNQSVBFKQorCQkJc2Vla19ieV9yZWFkKGZkLCBhbW91bnQpOworCQllbHNlCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNlZWsgZmFpbHVyZSIpOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvc2Vla19ieV9yZWFkLmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL3NlZWtfYnlfcmVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZmRlOTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL3NlZWtfYnlfcmVhZC5jCkBAIC0wLDAgKzEsMTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYmJfYXJjaGl2ZS5oIgorCisvKiAgSWYgd2UgYXJlIHJlYWRpbmcgdGhyb3VnaCBhIHBpcGUsIG9yIGZyb20gc3RkaW4gdGhlbiB3ZSBjYW4ndCBsc2VlaywKKyAqICB3ZSBtdXN0IHJlYWQgYW5kIGRpc2NhcmQgdGhlIGRhdGEgdG8gc2tpcCBvdmVyIGl0LgorICovCit2b2lkIEZBU1RfRlVOQyBzZWVrX2J5X3JlYWQoaW50IGZkLCBvZmZfdCBhbW91bnQpCit7CisJaWYgKGFtb3VudCkKKwkJYmJfY29weWZkX2V4YWN0X3NpemUoZmQsIC0xLCBhbW91bnQpOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnBhY2tfYXJfYXJjaGl2ZS5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnBhY2tfYXJfYXJjaGl2ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYzAzMDMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL3VucGFja19hcl9hcmNoaXZlLmMKQEAgLTAsMCArMSwyMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJiYl9hcmNoaXZlLmgiCisjaW5jbHVkZSAiYXIuaCIKKwordm9pZCBGQVNUX0ZVTkMgdW5wYWNrX2FyX2FyY2hpdmUoYXJjaGl2ZV9oYW5kbGVfdCAqYXJfYXJjaGl2ZSkKK3sKKwljaGFyIG1hZ2ljWzddOworCisJeHJlYWQoYXJfYXJjaGl2ZS0+c3JjX2ZkLCBtYWdpYywgQVJfTUFHSUNfTEVOKTsKKwlpZiAoIWlzX3ByZWZpeGVkX3dpdGgobWFnaWMsIEFSX01BR0lDKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBhciBtYWdpYyIpOworCX0KKwlhcl9hcmNoaXZlLT5vZmZzZXQgKz0gQVJfTUFHSUNfTEVOOworCisJd2hpbGUgKGdldF9oZWFkZXJfYXIoYXJfYXJjaGl2ZSkgPT0gRVhJVF9TVUNDRVNTKQorCQljb250aW51ZTsKK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW5zYWZlX3ByZWZpeC5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnNhZmVfcHJlZml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk5NGY0ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW5zYWZlX3ByZWZpeC5jCkBAIC0wLDAgKzEsMzYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYmJfYXJjaGl2ZS5oIgorCitjb25zdCBjaGFyKiBGQVNUX0ZVTkMgc3RyaXBfdW5zYWZlX3ByZWZpeChjb25zdCBjaGFyICpzdHIpCit7CisJY29uc3QgY2hhciAqY3AgPSBzdHI7CisJd2hpbGUgKDEpIHsKKwkJY2hhciAqY3AyOworCQlpZiAoKmNwID09ICcvJykgeworCQkJY3ArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChpc19wcmVmaXhlZF93aXRoKGNwLCAiLy4uLyIrMSkpIHsKKwkJCWNwICs9IDM7CisJCQljb250aW51ZTsKKwkJfQorCQljcDIgPSBzdHJzdHIoY3AsICIvLi4vIik7CisJCWlmICghY3AyKQorCQkJYnJlYWs7CisJCWNwID0gY3AyICsgNDsKKwl9CisJaWYgKGNwICE9IHN0cikgeworCQlzdGF0aWMgc21hbGxpbnQgd2FybmVkID0gMDsKKwkJaWYgKCF3YXJuZWQpIHsKKwkJCXdhcm5lZCA9IDE7CisJCQliYl9lcnJvcl9tc2coInJlbW92aW5nIGxlYWRpbmcgJyUuKnMnIGZyb20gbWVtYmVyIG5hbWVzIiwKKwkJCQkoaW50KShjcCAtIHN0ciksIHN0cik7CisJCX0KKwl9CisJcmV0dXJuIGNwOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L1JFQURNRSBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg0OTEyMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei9SRUFETUUKQEAgLTAsMCArMSwxMzUgQEAKKworWFogRW1iZWRkZWQKKz09PT09PT09PT09CisKKyAgICBYWiBFbWJlZGRlZCBpcyBhIHJlbGF0aXZlbHkgc21hbGwsIGxpbWl0ZWQgaW1wbGVtZW50YXRpb24gb2YgdGhlIC54egorICAgIGZpbGUgZm9ybWF0LiBDdXJyZW50bHkgb25seSBkZWNvZGluZyBpcyBpbXBsZW1lbnRlZC4KKworICAgIFhaIEVtYmVkZGVkIHdhcyB3cml0dGVuIGZvciB1c2UgaW4gdGhlIExpbnV4IGtlcm5lbCwgYnV0IHRoZSBjb2RlIGNhbgorICAgIGJlIGVhc2lseSB1c2VkIGluIG90aGVyIGVudmlyb25tZW50cyB0b28sIGluY2x1ZGluZyByZWd1bGFyIHVzZXJzcGFjZQorICAgIGFwcGxpY2F0aW9ucy4gU2VlIHVzZXJzcGFjZS94em1pbmlkZWMuYyBmb3IgYW4gZXhhbXBsZSBwcm9ncmFtLgorCisgICAgVGhpcyBSRUFETUUgY29udGFpbnMgaW5mb3JtYXRpb24gdGhhdCBpcyB1c2VmdWwgb25seSB3aGVuIHRoZSBjb3B5CisgICAgb2YgWFogRW1iZWRkZWQgaXNuJ3QgcGFydCBvZiB0aGUgTGludXgga2VybmVsIHRyZWUuIFlvdSBzaG91bGQgYWxzbworICAgIHJlYWQgbGludXgvRG9jdW1lbnRhdGlvbi94ei50eHQgZXZlbiBpZiB5b3UgYXJlbid0IHVzaW5nIFhaIEVtYmVkZGVkCisgICAgYXMgcGFydCBvZiBMaW51eDsgaW5mb3JtYXRpb24gaW4gdGhhdCBmaWxlIGlzIG5vdCByZXBlYXRlZCBpbiB0aGlzCisgICAgUkVBRE1FLgorCitDb21waWxpbmcgdGhlIExpbnV4IGtlcm5lbCBtb2R1bGUKKworICAgIFRoZSB4el9kZWMgbW9kdWxlIGRlcGVuZHMgb24gY3JjMzIgbW9kdWxlLCBzbyBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZQorICAgIGl0IGVuYWJsZWQgKENPTkZJR19DUkMzMikuCisKKyAgICBCdWlsZGluZyB0aGUgeHpfZGVjIGFuZCB4el9kZWNfdGVzdCBtb2R1bGVzIHdpdGhvdXQgc3VwcG9ydCBmb3IgQkNKCisgICAgZmlsdGVyczoKKworICAgICAgICBjZCBsaW51eC9saWIveHoKKyAgICAgICAgbWFrZSAtQyAvcGF0aC90by9rZXJuZWwvc291cmNlIFwKKyAgICAgICAgICAgICAgICBLQ1BQRkxBR1M9LUkiJChwd2QpLy4uLy4uL2luY2x1ZGUiIE09IiQocHdkKSIgXAorICAgICAgICAgICAgICAgIENPTkZJR19YWl9ERUM9bSBDT05GSUdfWFpfREVDX1RFU1Q9bQorCisgICAgQnVpbGRpbmcgdGhlIHh6X2RlYyBhbmQgeHpfZGVjX3Rlc3QgbW9kdWxlcyB3aXRoIHN1cHBvcnQgZm9yIEJDSgorICAgIGZpbHRlcnM6CisKKyAgICAgICAgY2QgbGludXgvbGliL3h6CisgICAgICAgIG1ha2UgLUMgL3BhdGgvdG8va2VybmVsL3NvdXJjZSBcCisgICAgICAgICAgICAgICAgS0NQUEZMQUdTPS1JIiQocHdkKS8uLi8uLi9pbmNsdWRlIiBNPSIkKHB3ZCkiIFwKKyAgICAgICAgICAgICAgICBDT05GSUdfWFpfREVDPW0gQ09ORklHX1haX0RFQ19URVNUPW0gQ09ORklHX1haX0RFQ19CQ0o9eSBcCisgICAgICAgICAgICAgICAgQ09ORklHX1haX0RFQ19YODY9eSBDT05GSUdfWFpfREVDX1BPV0VSUEM9eSBcCisgICAgICAgICAgICAgICAgQ09ORklHX1haX0RFQ19JQTY0PXkgQ09ORklHX1haX0RFQ19BUk09eSBcCisgICAgICAgICAgICAgICAgQ09ORklHX1haX0RFQ19BUk1USFVNQj15IENPTkZJR19YWl9ERUNfU1BBUkM9eQorCisgICAgSWYgeW91IHdhbnQgb25seSBvbmUgb3IgYSBmZXcgb2YgdGhlIEJDSiBmaWx0ZXJzLCBvbWl0IHRoZSBhcHByb3ByaWF0ZQorICAgIHZhcmlhYmxlcy4gQ09ORklHX1haX0RFQ19CQ0o9eSBpcyBhbHdheXMgcmVxdWlyZWQgdG8gYnVpbGQgdGhlIHN1cHBvcnQKKyAgICBjb2RlIHNoYXJlZCBiZXR3ZWVuIGFsbCBCQ0ogZmlsdGVycy4KKworICAgIE1vc3QgcGVvcGxlIGRvbid0IG5lZWQgdGhlIHh6X2RlY190ZXN0IG1vZHVsZS4gWW91IGNhbiBza2lwIGJ1aWxkaW5nCisgICAgaXQgYnkgb21pdHRpbmcgQ09ORklHX1haX0RFQ19URVNUPW0gZnJvbSB0aGUgbWFrZSBjb21tYW5kIGxpbmUuCisKK0NvbXBpbGVyIHJlcXVpcmVtZW50cworCisgICAgWFogRW1iZWRkZWQgc2hvdWxkIGNvbXBpbGUgYXMgZWl0aGVyIEdOVS1DODkgKHVzZWQgaW4gdGhlIExpbnV4CisgICAga2VybmVsKSBvciB3aXRoIGFueSBDOTkgY29tcGlsZXIuIEdldHRpbmcgdGhlIGNvZGUgdG8gY29tcGlsZSB3aXRoCisgICAgbm9uLUdOVSBDODkgY29tcGlsZXIgb3IgYSBDKysgY29tcGlsZXIgc2hvdWxkIGJlIHF1aXRlIGVhc3kgYXMKKyAgICBsb25nIGFzIHRoZXJlIGlzIGEgZGF0YSB0eXBlIGZvciB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciAob3IgdGhlCisgICAgY29kZSBpcyBtb2RpZmllZCBub3QgdG8gc3VwcG9ydCBsYXJnZSBmaWxlcywgd2hpY2ggbmVlZHMgc29tZSBtb3JlCisgICAgY2FyZSB0aGFuIGp1c3QgdXNpbmcgMzItYml0IGludGVnZXIgaW5zdGVhZCBvZiA2NC1iaXQpLgorCisgICAgSWYgeW91IHVzZSBHQ0MsIHRyeSB0byB1c2UgYSByZWNlbnQgdmVyc2lvbi4gRm9yIGV4YW1wbGUsIG9uIHg4Ni0zMiwKKyAgICB4el9kZWNfbHptYTIuYyBjb21waWxlZCB3aXRoIEdDQyAzLjMuNiBpcyAxNS0yNSAlIHNsb3dlciB0aGFuIHdoZW4KKyAgICBjb21waWxlZCB3aXRoIEdDQyA0LjMuMy4KKworRW1iZWRkaW5nIGludG8gdXNlcnNwYWNlIGFwcGxpY2F0aW9ucworCisgICAgVG8gZW1iZWQgdGhlIFhaIGRlY29kZXIsIGNvcHkgdGhlIGZvbGxvd2luZyBmaWxlcyBpbnRvIGEgc2luZ2xlCisgICAgZGlyZWN0b3J5IGluIHlvdXIgc291cmNlIGNvZGUgdHJlZToKKworICAgICAgICBsaW51eC9pbmNsdWRlL2xpbnV4L3h6LmgKKyAgICAgICAgbGludXgvbGliL3h6L3h6X2NyYzMyLmMKKyAgICAgICAgbGludXgvbGliL3h6L3h6X2RlY19sem1hMi5jCisgICAgICAgIGxpbnV4L2xpYi94ei94el9kZWNfc3RyZWFtLmMKKyAgICAgICAgbGludXgvbGliL3h6L3h6X2x6bWEyLmgKKyAgICAgICAgbGludXgvbGliL3h6L3h6X3ByaXZhdGUuaAorICAgICAgICBsaW51eC9saWIveHoveHpfc3RyZWFtLmgKKyAgICAgICAgdXNlcnNwYWNlL3h6X2NvbmZpZy5oCisKKyAgICBBbHRlcm5hdGl2ZWx5LCB4ei5oIG1heSBiZSBwbGFjZWQgaW50byBhIGRpZmZlcmVudCBkaXJlY3RvcnkgYnV0IHRoZW4KKyAgICB0aGF0IGRpcmVjdG9yeSBtdXN0IGJlIGluIHRoZSBjb21waWxlciBpbmNsdWRlIHBhdGggd2hlbiBjb21waWxpbmcKKyAgICB0aGUgLmMgZmlsZXMuCisKKyAgICBZb3VyIGNvZGUgc2hvdWxkIHVzZSBvbmx5IHRoZSBmdW5jdGlvbnMgZGVjbGFyZWQgaW4geHouaC4gVGhlIHJlc3Qgb2YKKyAgICB0aGUgLmggZmlsZXMgYXJlIG1lYW50IG9ubHkgZm9yIGludGVybmFsIHVzZSBpbiBYWiBFbWJlZGRlZC4KKworICAgIFlvdSBtYXkgd2FudCB0byBtb2RpZnkgeHpfY29uZmlnLmggdG8gYmUgbW9yZSBzdWl0YWJsZSBmb3IgeW91ciBidWlsZAorICAgIGVudmlyb25tZW50LiBQcm9iYWJseSB5b3Ugc2hvdWxkIGF0IGxlYXN0IHNraW0gdGhyb3VnaCBpdCBldmVuIGlmIHRoZQorICAgIGRlZmF1bHQgZmlsZSB3b3JrcyBhcyBpcy4KKworQkNKIGZpbHRlciBzdXBwb3J0CisKKyAgICBJZiB5b3Ugd2FudCBzdXBwb3J0IGZvciBvbmUgb3IgbW9yZSBCQ0ogZmlsdGVycywgeW91IG5lZWQgdG8gY29weSBhbHNvCisgICAgbGludXgvbGliL3h6L3h6X2RlY19iY2ouYyBpbnRvIHlvdXIgYXBwbGljYXRpb24sIGFuZCB1c2UgYXBwcm9wcmlhdGUKKyAgICAjZGVmaW5lcyBpbiB4el9jb25maWcuaCBvciBpbiBjb21waWxlciBmbGFncy4gWW91IGRvbid0IG5lZWQgdGhlc2UKKyAgICAjZGVmaW5lcyBpbiB0aGUgY29kZSB0aGF0IGp1c3QgdXNlcyBYWiBFbWJlZGRlZCB2aWEgeHouaCwgYnV0IGhhdmluZworICAgIHRoZW0gYWx3YXlzICNkZWZpbmVkIGRvZXNuJ3QgaHVydCBlaXRoZXIuCisKKyAgICAgICAgI2RlZmluZSAgICAgICAgICAgICBJbnN0cnVjdGlvbiBzZXQgICAgIEJDSiBmaWx0ZXIgZW5kaWFubmVzcworICAgICAgICBYWl9ERUNfWDg2ICAgICAgICAgIHg4Ni0zMiBvciB4ODYtNjQgICAgTGl0dGxlIGVuZGlhbiBvbmx5CisgICAgICAgIFhaX0RFQ19QT1dFUlBDICAgICAgUG93ZXJQQyAgICAgICAgICAgICBCaWcgZW5kaWFuIG9ubHkKKyAgICAgICAgWFpfREVDX0lBNjQgICAgICAgICBJdGFuaXVtIChJQS02NCkgICAgIEJpZyBvciBsaXR0bGUgZW5kaWFuCisgICAgICAgIFhaX0RFQ19BUk0gICAgICAgICAgQVJNICAgICAgICAgICAgICAgICBMaXR0bGUgZW5kaWFuIG9ubHkKKyAgICAgICAgWFpfREVDX0FSTVRIVU1CICAgICBBUk0tVGh1bWIgICAgICAgICAgIExpdHRsZSBlbmRpYW4gb25seQorICAgICAgICBYWl9ERUNfU1BBUkMgICAgICAgIFNQQVJDICAgICAgICAgICAgICAgQmlnIG9yIGxpdHRsZSBlbmRpYW4KKworICAgIFdoaWxlIHNvbWUgYXJjaGl0ZWN0dXJlcyBhcmUgKHBhcnRpYWxseSkgYmktZW5kaWFuLCB0aGUgZW5kaWFubmVzcworICAgIHNldHRpbmcgZG9lc24ndCBjaGFuZ2UgdGhlIGVuZGlhbm5lc3Mgb2YgdGhlIGluc3RydWN0aW9ucyBvbiBhbGwKKyAgICBhcmNoaXRlY3R1cmVzLiBUaGF0J3Mgd2h5IEl0YW5pdW0gYW5kIFNQQVJDIGZpbHRlcnMgd29yayBmb3IgYm90aCBiaWcKKyAgICBhbmQgbGl0dGxlIGVuZGlhbiBleGVjdXRhYmxlcyAoSXRhbml1bSBoYXMgbGl0dGxlIGVuZGlhbiBpbnN0cnVjdGlvbnMKKyAgICBhbmQgU1BBUkMgaGFzIGJpZyBlbmRpYW4gaW5zdHJ1Y3Rpb25zKS4KKworICAgIFRoZXJlIGN1cnJlbnRseSBpcyBubyBmaWx0ZXIgZm9yIGxpdHRsZSBlbmRpYW4gUG93ZXJQQyBvciBiaWcgZW5kaWFuCisgICAgQVJNIG9yIEFSTS1UaHVtYi4gSW1wbGVtZW50aW5nIGZpbHRlcnMgZm9yIHRoZW0gY2FuIGJlIGNvbnNpZGVyZWQgaWYKKyAgICB0aGVyZSBpcyBhIG5lZWQgZm9yIHN1Y2ggZmlsdGVycyBpbiByZWFsLXdvcmxkIGFwcGxpY2F0aW9ucy4KKworTm90ZXMgYWJvdXQgc2hhcmVkIGxpYnJhcmllcworCisgICAgSWYgeW91IGFyZSBpbmNsdWRpbmcgWFogRW1iZWRkZWQgaW50byBhIHNoYXJlZCBsaWJyYXJ5LCB5b3UgdmVyeQorICAgIHByb2JhYmx5IHNob3VsZCByZW5hbWUgdGhlIHh6XyogZnVuY3Rpb25zIHRvIHByZXZlbnQgc3ltYm9sCisgICAgY29uZmxpY3RzIGluIGNhc2UgeW91ciBsaWJyYXJ5IGlzIGxpbmtlZCBhZ2FpbnN0IHNvbWUgb3RoZXIgbGlicmFyeQorICAgIG9yIGFwcGxpY2F0aW9uIHRoYXQgYWxzbyBoYXMgWFogRW1iZWRkZWQgaW4gaXQgKHdoaWNoIG1heSBldmVuIGJlCisgICAgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiBYWiBFbWJlZGRlZCkuIFRPRE86IFByb3ZpZGUgYW4gZWFzeSB3YXkKKyAgICB0byBkbyB0aGlzLgorCisgICAgUGxlYXNlIGRvbid0IGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IG9mIFhaIEVtYmVkZGVkIGl0c2VsZiB1bmxlc3MKKyAgICBpdCBpcyBmaW5lIHRvIHJlYnVpbGQgZXZlcnl0aGluZyBkZXBlbmRpbmcgb24gdGhhdCBzaGFyZWQgbGlicmFyeQorICAgIGV2ZXJ5dGltZSB5b3UgdXBncmFkZSB0byBhIG5ld2VyIHZlcnNpb24gb2YgWFogRW1iZWRkZWQuIFRoZXJlIGFyZQorICAgIG5vIEFQSSBvciBBQkkgc3RhYmlsaXR5IGd1YXJhbnRlZXMgYmV0d2VlbiBkaWZmZXJlbnQgdmVyc2lvbnMgb2YKKyAgICBYWiBFbWJlZGRlZC4KKworU3BlY2lmeWluZyB0aGUgY2FsbGluZyBjb252ZW50aW9uCisKKyAgICBYWl9GVU5DIG1hY3JvIHdhcyBpbmNsdWRlZCB0byBzdXBwb3J0IGRlY2xhcmluZyBmdW5jdGlvbnMgd2l0aCBfX2luaXQKKyAgICBpbiBMaW51eC4gT3V0c2lkZSBMaW51eCwgaXQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY2FsbGluZworICAgIGNvbnZlbnRpb24gb24gc3lzdGVtcyB0aGF0IHN1cHBvcnQgbXVsdGlwbGUgY2FsbGluZyBjb252ZW50aW9ucy4KKyAgICBGb3IgZXhhbXBsZSwgb24gV2luZG93cywgeW91IG1heSBtYWtlIGFsbCBmdW5jdGlvbnMgdXNlIHRoZSBzdGRjYWxsCisgICAgY2FsbGluZyBjb252ZW50aW9uIGJ5IGRlZmluaW5nIFhaX0ZVTkM9X19zdGRjYWxsIHdoZW4gYnVpbGRpbmcgYW5kCisgICAgdXNpbmcgdGhlIGZ1bmN0aW9ucyBmcm9tIFhaIEVtYmVkZGVkLgpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6LmggYi9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHoveHouaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGIyMmRiCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6LmgKQEAgLTAsMCArMSwyODAgQEAKKy8qCisgKiBYWiBkZWNvbXByZXNzb3IKKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgWFpfSAorI2RlZmluZSBYWl9ICisKKyNpZmRlZiBfX0tFUk5FTF9fCisjCWluY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorIwlpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2Vsc2UKKyMJaW5jbHVkZSA8c3RkZGVmLmg+CisjCWluY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogSW4gTGludXgsIHRoaXMgaXMgdXNlZCB0byBtYWtlIGV4dGVybiBmdW5jdGlvbnMgc3RhdGljIHdoZW4gbmVlZGVkLiAqLworI2lmbmRlZiBYWl9FWFRFUk4KKyMJZGVmaW5lIFhaX0VYVEVSTiBleHRlcm4KKyNlbmRpZgorCisvKiBJbiBMaW51eCwgdGhpcyBpcyB1c2VkIHRvIG1hcmsgdGhlIGZ1bmN0aW9ucyB3aXRoIF9faW5pdCB3aGVuIG5lZWRlZC4gKi8KKyNpZm5kZWYgWFpfRlVOQworIwlkZWZpbmUgWFpfRlVOQworI2VuZGlmCisKKy8qKgorICogZW51bSB4el9tb2RlIC0gT3BlcmF0aW9uIG1vZGUKKyAqCisgKiBAWFpfU0lOR0xFOiAgICAgICAgICAgICAgU2luZ2xlLWNhbGwgbW9kZS4gVGhpcyB1c2VzIGxlc3MgUkFNIHRoYW4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGFuIG11bHRpLWNhbGwgbW9kZXMsIGJlY2F1c2UgdGhlIExaTUEyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGljdGlvbmFyeSBkb2Vzbid0IG5lZWQgdG8gYmUgYWxsb2NhdGVkIGFzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCBvZiB0aGUgZGVjb2RlciBzdGF0ZS4gQWxsIHJlcXVpcmVkIGRhdGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGFyZSBhbGxvY2F0ZWQgYXQgaW5pdGlhbGl6YXRpb24sCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc28geHpfZGVjX3J1bigpIGNhbm5vdCByZXR1cm4gWFpfTUVNX0VSUk9SLgorICogQFhaX1BSRUFMTE9DOiAgICAgICAgICAgIE11bHRpLWNhbGwgbW9kZSB3aXRoIHByZWFsbG9jYXRlZCBMWk1BMgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3Rpb25hcnkgYnVmZmVyLiBBbGwgZGF0YSBzdHJ1Y3R1cmVzIGFyZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBhdCBpbml0aWFsaXphdGlvbiwgc28geHpfZGVjX3J1bigpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY2Fubm90IHJldHVybiBYWl9NRU1fRVJST1IuCisgKiBAWFpfRFlOQUxMT0M6ICAgICAgICAgICAgTXVsdGktY2FsbCBtb2RlLiBUaGUgTFpNQTIgZGljdGlvbmFyeSBpcworICogICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBvbmNlIHRoZSByZXF1aXJlZCBzaXplIGhhcyBiZWVuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkIGZyb20gdGhlIHN0cmVhbSBoZWFkZXJzLiBJZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0aW9uIGZhaWxzLCB4el9kZWNfcnVuKCkgd2lsbCByZXR1cm4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWl9NRU1fRVJST1IuCisgKgorICogSXQgaXMgcG9zc2libGUgdG8gZW5hYmxlIHN1cHBvcnQgb25seSBmb3IgYSBzdWJzZXQgb2YgdGhlIGFib3ZlCisgKiBtb2RlcyBhdCBjb21waWxlIHRpbWUgYnkgZGVmaW5pbmcgWFpfREVDX1NJTkdMRSwgWFpfREVDX1BSRUFMTE9DLAorICogb3IgWFpfREVDX0RZTkFMTE9DLiBUaGUgeHpfZGVjIGtlcm5lbCBtb2R1bGUgaXMgYWx3YXlzIGNvbXBpbGVkCisgKiB3aXRoIHN1cHBvcnQgZm9yIGFsbCBvcGVyYXRpb24gbW9kZXMsIGJ1dCB0aGUgcHJlYm9vdCBjb2RlIG1heQorICogYmUgYnVpbHQgd2l0aCBmZXdlciBmZWF0dXJlcyB0byBtaW5pbWl6ZSBjb2RlIHNpemUuCisgKi8KK2VudW0geHpfbW9kZSB7CisJWFpfU0lOR0xFLAorCVhaX1BSRUFMTE9DLAorCVhaX0RZTkFMTE9DCit9OworCisvKioKKyAqIGVudW0geHpfcmV0IC0gUmV0dXJuIGNvZGVzCisgKiBAWFpfT0s6ICAgICAgICAgICAgICAgICAgRXZlcnl0aGluZyBpcyBPSyBzbyBmYXIuIE1vcmUgaW5wdXQgb3IgbW9yZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBzcGFjZSBpcyByZXF1aXJlZCB0byBjb250aW51ZS4gVGhpcworICogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2RlIGlzIHBvc3NpYmxlIG9ubHkgaW4gbXVsdGktY2FsbCBtb2RlCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgKFhaX1BSRUFMTE9DIG9yIFhaX0RZTkFMTE9DKS4KKyAqIEBYWl9TVFJFQU1fRU5EOiAgICAgICAgICBPcGVyYXRpb24gZmluaXNoZWQgc3VjY2Vzc2Z1bGx5LgorICogQFhaX1VOU1VQUE9SVEVEX0NIRUNLOiAgIEludGVncml0eSBjaGVjayB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQuIERlY29kaW5nCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgc3RpbGwgcG9zc2libGUgaW4gbXVsdGktY2FsbCBtb2RlIGJ5IHNpbXBseQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmcgeHpfZGVjX3J1bigpIGFnYWluLgorICogICAgICAgICAgICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGlzIHJldHVybiB2YWx1ZSBpcyB1c2VkIG9ubHkgaWYKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWl9ERUNfQU5ZX0NIRUNLIHdhcyBkZWZpbmVkIGF0IGJ1aWxkIHRpbWUsCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpY2ggaXMgbm90IHVzZWQgaW4gdGhlIGtlcm5lbC4gVW5zdXBwb3J0ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVjayB0eXBlcyByZXR1cm4gWFpfT1BUSU9OU19FUlJPUiBpZgorICogICAgICAgICAgICAgICAgICAgICAgICAgIFhaX0RFQ19BTllfQ0hFQ0sgd2FzIG5vdCBkZWZpbmVkIGF0IGJ1aWxkIHRpbWUuCisgKiBAWFpfTUVNX0VSUk9SOiAgICAgICAgICAgQWxsb2NhdGluZyBtZW1vcnkgZmFpbGVkLiBUaGlzIHJldHVybiBjb2RlIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgb25seSBpZiB0aGUgZGVjb2RlciB3YXMgaW5pdGlhbGl6ZWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIFhaX0RZTkFMTE9DLiBUaGUgYW1vdW50IG9mIG1lbW9yeSB0aGF0IHdhcworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRyaWVkIHRvIGJlIGFsbG9jYXRlZCB3YXMgbm8gbW9yZSB0aGFuIHRoZQorICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpY3RfbWF4IGFyZ3VtZW50IGdpdmVuIHRvIHh6X2RlY19pbml0KCkuCisgKiBAWFpfTUVNTElNSVRfRVJST1I6ICAgICAgQSBiaWdnZXIgTFpNQTIgZGljdGlvbmFyeSB3b3VsZCBiZSBuZWVkZWQgdGhhbgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWQgYnkgdGhlIGRpY3RfbWF4IGFyZ3VtZW50IGdpdmVuIHRvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgeHpfZGVjX2luaXQoKS4gVGhpcyByZXR1cm4gdmFsdWUgaXMgcG9zc2libGUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBvbmx5IGluIG11bHRpLWNhbGwgbW9kZSAoWFpfUFJFQUxMT0Mgb3IKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBYWl9EWU5BTExPQyk7IHRoZSBzaW5nbGUtY2FsbCBtb2RlIChYWl9TSU5HTEUpCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlcyB0aGUgZGljdF9tYXggYXJndW1lbnQuCisgKiBAWFpfRk9STUFUX0VSUk9SOiAgICAgICAgRmlsZSBmb3JtYXQgd2FzIG5vdCByZWNvZ25pemVkICh3cm9uZyBtYWdpYworICogICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzKS4KKyAqIEBYWl9PUFRJT05TX0VSUk9SOiAgICAgICBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3Qgc3VwcG9ydCB0aGUgcmVxdWVzdGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcHJlc3Npb24gb3B0aW9ucy4gSW4gdGhlIGRlY29kZXIgdGhpcyBtZWFucworICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgdGhlIGhlYWRlciBDUkMzMiBtYXRjaGVzLCBidXQgdGhlIGhlYWRlcgorICogICAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZiBzcGVjaWZpZXMgc29tZXRoaW5nIHRoYXQgd2UgZG9uJ3Qgc3VwcG9ydC4KKyAqIEBYWl9EQVRBX0VSUk9SOiAgICAgICAgICBDb21wcmVzc2VkIGRhdGEgaXMgY29ycnVwdC4KKyAqIEBYWl9CVUZfRVJST1I6ICAgICAgICAgICBDYW5ub3QgbWFrZSBhbnkgcHJvZ3Jlc3MuIERldGFpbHMgYXJlIHNsaWdodGx5CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IGJldHdlZW4gbXVsdGktY2FsbCBhbmQgc2luZ2xlLWNhbGwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlOyBtb3JlIGluZm9ybWF0aW9uIGJlbG93LgorICoKKyAqIEluIG11bHRpLWNhbGwgbW9kZSwgWFpfQlVGX0VSUk9SIGlzIHJldHVybmVkIHdoZW4gdHdvIGNvbnNlY3V0aXZlIGNhbGxzCisgKiB0byBYWiBjb2RlIGNhbm5vdCBjb25zdW1lIGFueSBpbnB1dCBhbmQgY2Fubm90IHByb2R1Y2UgYW55IG5ldyBvdXRwdXQuCisgKiBUaGlzIGhhcHBlbnMgd2hlbiB0aGVyZSBpcyBubyBuZXcgaW5wdXQgYXZhaWxhYmxlLCBvciB0aGUgb3V0cHV0IGJ1ZmZlcgorICogaXMgZnVsbCB3aGlsZSBhdCBsZWFzdCBvbmUgb3V0cHV0IGJ5dGUgaXMgc3RpbGwgcGVuZGluZy4gQXNzdW1pbmcgeW91cgorICogY29kZSBpcyBub3QgYnVnZ3ksIHlvdSBjYW4gZ2V0IHRoaXMgZXJyb3Igb25seSB3aGVuIGRlY29kaW5nIGEgY29tcHJlc3NlZAorICogc3RyZWFtIHRoYXQgaXMgdHJ1bmNhdGVkIG9yIG90aGVyd2lzZSBjb3JydXB0LgorICoKKyAqIEluIHNpbmdsZS1jYWxsIG1vZGUsIFhaX0JVRl9FUlJPUiBpcyByZXR1cm5lZCBvbmx5IHdoZW4gdGhlIG91dHB1dCBidWZmZXIKKyAqIGlzIHRvbyBzbWFsbCBvciB0aGUgY29tcHJlc3NlZCBpbnB1dCBpcyBjb3JydXB0IGluIGEgd2F5IHRoYXQgbWFrZXMgdGhlCisgKiBkZWNvZGVyIHByb2R1Y2UgbW9yZSBvdXRwdXQgdGhhbiB0aGUgY2FsbGVyIGV4cGVjdGVkLiBXaGVuIGl0IGlzCisgKiAocmVsYXRpdmVseSkgY2xlYXIgdGhhdCB0aGUgY29tcHJlc3NlZCBpbnB1dCBpcyB0cnVuY2F0ZWQsIFhaX0RBVEFfRVJST1IKKyAqIGlzIHVzZWQgaW5zdGVhZCBvZiBYWl9CVUZfRVJST1IuCisgKi8KK2VudW0geHpfcmV0IHsKKwlYWl9PSywKKwlYWl9TVFJFQU1fRU5ELAorCVhaX1VOU1VQUE9SVEVEX0NIRUNLLAorCVhaX01FTV9FUlJPUiwKKwlYWl9NRU1MSU1JVF9FUlJPUiwKKwlYWl9GT1JNQVRfRVJST1IsCisJWFpfT1BUSU9OU19FUlJPUiwKKwlYWl9EQVRBX0VSUk9SLAorCVhaX0JVRl9FUlJPUgorfTsKKworLyoqCisgKiBzdHJ1Y3QgeHpfYnVmIC0gUGFzc2luZyBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgdG8gWFogY29kZQorICogQGluOiAgICAgICAgIEJlZ2lubmluZyBvZiB0aGUgaW5wdXQgYnVmZmVyLiBUaGlzIG1heSBiZSBOVUxMIGlmIGFuZCBvbmx5CisgKiAgICAgICAgICAgICAgaWYgaW5fcG9zIGlzIGVxdWFsIHRvIGluX3NpemUuCisgKiBAaW5fcG9zOiAgICAgQ3VycmVudCBwb3NpdGlvbiBpbiB0aGUgaW5wdXQgYnVmZmVyLiBUaGlzIG11c3Qgbm90IGV4Y2VlZAorICogICAgICAgICAgICAgIGluX3NpemUuCisgKiBAaW5fc2l6ZTogICAgU2l6ZSBvZiB0aGUgaW5wdXQgYnVmZmVyCisgKiBAb3V0OiAgICAgICAgQmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQgYnVmZmVyLiBUaGlzIG1heSBiZSBOVUxMIGlmIGFuZCBvbmx5CisgKiAgICAgICAgICAgICAgaWYgb3V0X3BvcyBpcyBlcXVhbCB0byBvdXRfc2l6ZS4KKyAqIEBvdXRfcG9zOiAgICBDdXJyZW50IHBvc2l0aW9uIGluIHRoZSBvdXRwdXQgYnVmZmVyLiBUaGlzIG11c3Qgbm90IGV4Y2VlZAorICogICAgICAgICAgICAgIG91dF9zaXplLgorICogQG91dF9zaXplOiAgIFNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIKKyAqCisgKiBPbmx5IHRoZSBjb250ZW50cyBvZiB0aGUgb3V0cHV0IGJ1ZmZlciBmcm9tIG91dFtvdXRfcG9zXSBvbndhcmQsIGFuZAorICogdGhlIHZhcmlhYmxlcyBpbl9wb3MgYW5kIG91dF9wb3MgYXJlIG1vZGlmaWVkIGJ5IHRoZSBYWiBjb2RlLgorICovCitzdHJ1Y3QgeHpfYnVmIHsKKwljb25zdCB1aW50OF90ICppbjsKKwlzaXplX3QgaW5fcG9zOworCXNpemVfdCBpbl9zaXplOworCisJdWludDhfdCAqb3V0OworCXNpemVfdCBvdXRfcG9zOworCXNpemVfdCBvdXRfc2l6ZTsKK307CisKKy8qKgorICogc3RydWN0IHh6X2RlYyAtIE9wYXF1ZSB0eXBlIHRvIGhvbGQgdGhlIFhaIGRlY29kZXIgc3RhdGUKKyAqLworc3RydWN0IHh6X2RlYzsKKworLyoqCisgKiB4el9kZWNfaW5pdCgpIC0gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSBYWiBkZWNvZGVyIHN0YXRlCisgKiBAbW9kZTogICAgICAgT3BlcmF0aW9uIG1vZGUKKyAqIEBkaWN0X21heDogICBNYXhpbXVtIHNpemUgb2YgdGhlIExaTUEyIGRpY3Rpb25hcnkgKGhpc3RvcnkgYnVmZmVyKSBmb3IKKyAqICAgICAgICAgICAgICBtdWx0aS1jYWxsIGRlY29kaW5nLiBUaGlzIGlzIGlnbm9yZWQgaW4gc2luZ2xlLWNhbGwgbW9kZQorICogICAgICAgICAgICAgIChtb2RlID09IFhaX1NJTkdMRSkuIExaTUEyIGRpY3Rpb25hcnkgaXMgYWx3YXlzIDJebiBieXRlcworICogICAgICAgICAgICAgIG9yIDJebiArIDJeKG4tMSkgYnl0ZXMgKHRoZSBsYXR0ZXIgc2l6ZXMgYXJlIGxlc3MgY29tbW9uCisgKiAgICAgICAgICAgICAgaW4gcHJhY3RpY2UpLCBzbyBvdGhlciB2YWx1ZXMgZm9yIGRpY3RfbWF4IGRvbid0IG1ha2Ugc2Vuc2UuCisgKiAgICAgICAgICAgICAgSW4gdGhlIGtlcm5lbCwgZGljdGlvbmFyeSBzaXplcyBvZiA2NCBLaUIsIDEyOCBLaUIsIDI1NiBLaUIsCisgKiAgICAgICAgICAgICAgNTEyIEtpQiwgYW5kIDEgTWlCIGFyZSBwcm9iYWJseSB0aGUgb25seSByZWFzb25hYmxlIHZhbHVlcywKKyAqICAgICAgICAgICAgICBleGNlcHQgZm9yIGtlcm5lbCBhbmQgaW5pdHJhbWZzIGltYWdlcyB3aGVyZSBhIGJpZ2dlcgorICogICAgICAgICAgICAgIGRpY3Rpb25hcnkgY2FuIGJlIGZpbmUgYW5kIHVzZWZ1bC4KKyAqCisgKiBTaW5nbGUtY2FsbCBtb2RlIChYWl9TSU5HTEUpOiB4el9kZWNfcnVuKCkgZGVjb2RlcyB0aGUgd2hvbGUgc3RyZWFtIGF0CisgKiBvbmNlLiBUaGUgY2FsbGVyIG11c3QgcHJvdmlkZSBlbm91Z2ggb3V0cHV0IHNwYWNlIG9yIHRoZSBkZWNvZGluZyB3aWxsCisgKiBmYWlsLiBUaGUgb3V0cHV0IHNwYWNlIGlzIHVzZWQgYXMgdGhlIGRpY3Rpb25hcnkgYnVmZmVyLCB3aGljaCBpcyB3aHkKKyAqIHRoZXJlIGlzIG5vIG5lZWQgdG8gYWxsb2NhdGUgdGhlIGRpY3Rpb25hcnkgYXMgcGFydCBvZiB0aGUgZGVjb2RlcidzCisgKiBpbnRlcm5hbCBzdGF0ZS4KKyAqCisgKiBCZWNhdXNlIHRoZSBvdXRwdXQgYnVmZmVyIGlzIHVzZWQgYXMgdGhlIHdvcmtzcGFjZSwgc3RyZWFtcyBlbmNvZGVkIHVzaW5nCisgKiBhIGJpZyBkaWN0aW9uYXJ5IGFyZSBub3QgYSBwcm9ibGVtIGluIHNpbmdsZS1jYWxsIG1vZGUuIEl0IGlzIGVub3VnaCB0aGF0CisgKiB0aGUgb3V0cHV0IGJ1ZmZlciBpcyBiaWcgZW5vdWdoIHRvIGhvbGQgdGhlIGFjdHVhbCB1bmNvbXByZXNzZWQgZGF0YTsgaXQKKyAqIGNhbiBiZSBzbWFsbGVyIHRoYW4gdGhlIGRpY3Rpb25hcnkgc2l6ZSBzdG9yZWQgaW4gdGhlIHN0cmVhbSBoZWFkZXJzLgorICoKKyAqIE11bHRpLWNhbGwgbW9kZSB3aXRoIHByZWFsbG9jYXRlZCBkaWN0aW9uYXJ5IChYWl9QUkVBTExPQyk6IGRpY3RfbWF4IGJ5dGVzCisgKiBvZiBtZW1vcnkgaXMgcHJlYWxsb2NhdGVkIGZvciB0aGUgTFpNQTIgZGljdGlvbmFyeS4gVGhpcyB3YXkgdGhlcmUgaXMgbm8KKyAqIHJpc2sgdGhhdCB4el9kZWNfcnVuKCkgY291bGQgcnVuIG91dCBvZiBtZW1vcnksIHNpbmNlIHh6X2RlY19ydW4oKSB3aWxsCisgKiBuZXZlciBhbGxvY2F0ZSBhbnkgbWVtb3J5LiBJbnN0ZWFkLCBpZiB0aGUgcHJlYWxsb2NhdGVkIGRpY3Rpb25hcnkgaXMgdG9vCisgKiBzbWFsbCBmb3IgZGVjb2RpbmcgdGhlIGdpdmVuIGlucHV0IHN0cmVhbSwgeHpfZGVjX3J1bigpIHdpbGwgcmV0dXJuCisgKiBYWl9NRU1MSU1JVF9FUlJPUi4gVGh1cywgaXQgaXMgaW1wb3J0YW50IHRvIGtub3cgd2hhdCBraW5kIG9mIGRhdGEgd2lsbCBiZQorICogZGVjb2RlZCB0byBhdm9pZCBhbGxvY2F0aW5nIGV4Y2Vzc2l2ZSBhbW91bnQgb2YgbWVtb3J5IGZvciB0aGUgZGljdGlvbmFyeS4KKyAqCisgKiBNdWx0aS1jYWxsIG1vZGUgd2l0aCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZGljdGlvbmFyeSAoWFpfRFlOQUxMT0MpOgorICogZGljdF9tYXggc3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFsbG93ZWQgZGljdGlvbmFyeSBzaXplIHRoYXQgeHpfZGVjX3J1bigpCisgKiBtYXkgYWxsb2NhdGUgb25jZSBpdCBoYXMgcGFyc2VkIHRoZSBkaWN0aW9uYXJ5IHNpemUgZnJvbSB0aGUgc3RyZWFtCisgKiBoZWFkZXJzLiBUaGlzIHdheSBleGNlc3NpdmUgYWxsb2NhdGlvbnMgY2FuIGJlIGF2b2lkZWQgd2hpbGUgc3RpbGwKKyAqIGxpbWl0aW5nIHRoZSBtYXhpbXVtIG1lbW9yeSB1c2FnZSB0byBhIHNhbmUgdmFsdWUgdG8gcHJldmVudCBydW5uaW5nIHRoZQorICogc3lzdGVtIG91dCBvZiBtZW1vcnkgd2hlbiBkZWNvbXByZXNzaW5nIHN0cmVhbXMgZnJvbSB1bnRydXN0ZWQgc291cmNlcy4KKyAqCisgKiBPbiBzdWNjZXNzLCB4el9kZWNfaW5pdCgpIHJldHVybnMgYSBwb2ludGVyIHRvIHN0cnVjdCB4el9kZWMsIHdoaWNoIGlzCisgKiByZWFkeSB0byBiZSB1c2VkIHdpdGggeHpfZGVjX3J1bigpLiBJZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscywKKyAqIHh6X2RlY19pbml0KCkgcmV0dXJucyBOVUxMLgorICovCitYWl9FWFRFUk4gc3RydWN0IHh6X2RlYyAqIFhaX0ZVTkMgeHpfZGVjX2luaXQoCisJCWVudW0geHpfbW9kZSBtb2RlLCB1aW50MzJfdCBkaWN0X21heCk7CisKKy8qKgorICogeHpfZGVjX3J1bigpIC0gUnVuIHRoZSBYWiBkZWNvZGVyCisgKiBAczogICAgICAgICAgRGVjb2RlciBzdGF0ZSBhbGxvY2F0ZWQgdXNpbmcgeHpfZGVjX2luaXQoKQorICogQGI6ICAgICAgICAgIElucHV0IGFuZCBvdXRwdXQgYnVmZmVycworICoKKyAqIFRoZSBwb3NzaWJsZSByZXR1cm4gdmFsdWVzIGRlcGVuZCBvbiBidWlsZCBvcHRpb25zIGFuZCBvcGVyYXRpb24gbW9kZS4KKyAqIFNlZSBlbnVtIHh6X3JldCBmb3IgZGV0YWlscy4KKyAqCisgKiBOb3RlIHRoYXQgaWYgYW4gZXJyb3Igb2NjdXJzIGluIHNpbmdsZS1jYWxsIG1vZGUgKHJldHVybiB2YWx1ZSBpcyBub3QKKyAqIFhaX1NUUkVBTV9FTkQpLCBiLT5pbl9wb3MgYW5kIGItPm91dF9wb3MgYXJlIG5vdCBtb2RpZmllZCBhbmQgdGhlCisgKiBjb250ZW50cyBvZiB0aGUgb3V0cHV0IGJ1ZmZlciBmcm9tIGItPm91dFtiLT5vdXRfcG9zXSBvbndhcmQgYXJlCisgKiB1bmRlZmluZWQuIFRoaXMgaXMgdHJ1ZSBldmVuIGFmdGVyIFhaX0JVRl9FUlJPUiwgYmVjYXVzZSB3aXRoIHNvbWUgZmlsdGVyCisgKiBjaGFpbnMsIHRoZXJlIG1heSBiZSBhIHNlY29uZCBwYXNzIG92ZXIgdGhlIG91dHB1dCBidWZmZXIsIGFuZCB0aGlzIHBhc3MKKyAqIGNhbm5vdCBiZSBwcm9wZXJseSBkb25lIGlmIHRoZSBvdXRwdXQgYnVmZmVyIGlzIHRydW5jYXRlZC4gVGh1cywgeW91CisgKiBjYW5ub3QgZ2l2ZSB0aGUgc2luZ2xlLWNhbGwgZGVjb2RlciBhIHRvbyBzbWFsbCBidWZmZXIgYW5kIHRoZW4gZXhwZWN0IHRvCisgKiBnZXQgdGhhdCBhbW91bnQgdmFsaWQgZGF0YSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN0cmVhbS4gWW91IG11c3QgdXNlCisgKiB0aGUgbXVsdGktY2FsbCBkZWNvZGVyIGlmIHlvdSBkb24ndCB3YW50IHRvIHVuY29tcHJlc3MgdGhlIHdob2xlIHN0cmVhbS4KKyAqLworWFpfRVhURVJOIGVudW0geHpfcmV0IFhaX0ZVTkMgeHpfZGVjX3J1bihzdHJ1Y3QgeHpfZGVjICpzLCBzdHJ1Y3QgeHpfYnVmICpiKTsKKworLyoqCisgKiB4el9kZWNfcmVzZXQoKSAtIFJlc2V0IGFuIGFscmVhZHkgYWxsb2NhdGVkIGRlY29kZXIgc3RhdGUKKyAqIEBzOiAgICAgICAgICBEZWNvZGVyIHN0YXRlIGFsbG9jYXRlZCB1c2luZyB4el9kZWNfaW5pdCgpCisgKgorICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byByZXNldCB0aGUgbXVsdGktY2FsbCBkZWNvZGVyIHN0YXRlIHdpdGhvdXQKKyAqIGZyZWVpbmcgYW5kIHJlYWxsb2NhdGluZyBtZW1vcnkgd2l0aCB4el9kZWNfZW5kKCkgYW5kIHh6X2RlY19pbml0KCkuCisgKgorICogSW4gc2luZ2xlLWNhbGwgbW9kZSwgeHpfZGVjX3Jlc2V0KCkgaXMgYWx3YXlzIGNhbGxlZCBpbiB0aGUgYmVnaW5uaW5nIG9mCisgKiB4el9kZWNfcnVuKCkuIFRodXMsIGV4cGxpY2l0IGNhbGwgdG8geHpfZGVjX3Jlc2V0KCkgaXMgdXNlZnVsIG9ubHkgaW4KKyAqIG11bHRpLWNhbGwgbW9kZS4KKyAqLworWFpfRVhURVJOIHZvaWQgWFpfRlVOQyB4el9kZWNfcmVzZXQoc3RydWN0IHh6X2RlYyAqcyk7CisKKy8qKgorICogeHpfZGVjX2VuZCgpIC0gRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIGRlY29kZXIgc3RhdGUKKyAqIEBzOiAgICAgICAgICBEZWNvZGVyIHN0YXRlIGFsbG9jYXRlZCB1c2luZyB4el9kZWNfaW5pdCgpLiBJZiBzIGlzIE5VTEwsCisgKiAgICAgICAgICAgICAgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdGhpbmcuCisgKi8KK1haX0VYVEVSTiB2b2lkIFhaX0ZVTkMgeHpfZGVjX2VuZChzdHJ1Y3QgeHpfZGVjICpzKTsKKworLyoKKyAqIFN0YW5kYWxvbmUgYnVpbGQgKHVzZXJzcGFjZSBidWlsZCBvciBpbi1rZXJuZWwgYnVpbGQgZm9yIGJvb3QgdGltZSB1c2UpCisgKiBuZWVkcyBhIENSQzMyIGltcGxlbWVudGF0aW9uLiBGb3Igbm9ybWFsIGluLWtlcm5lbCB1c2UsIGtlcm5lbCdzIG93bgorICogQ1JDMzIgbW9kdWxlIGlzIHVzZWQgaW5zdGVhZCwgYW5kIHVzZXJzIG9mIHRoaXMgbW9kdWxlIGRvbid0IG5lZWQgdG8KKyAqIGNhcmUgYWJvdXQgdGhlIGZ1bmN0aW9ucyBiZWxvdy4KKyAqLworI2lmbmRlZiBYWl9JTlRFUk5BTF9DUkMzMgorIwlpZmRlZiBfX0tFUk5FTF9fCisjCQlkZWZpbmUgWFpfSU5URVJOQUxfQ1JDMzIgMAorIwllbHNlCisjCQlkZWZpbmUgWFpfSU5URVJOQUxfQ1JDMzIgMQorIwllbmRpZgorI2VuZGlmCisKKyNpZiBYWl9JTlRFUk5BTF9DUkMzMgorLyoKKyAqIFRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciB4el8qIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUKKyAqIHRoZSBDUkMzMiBsb29rdXAgdGFibGUuCisgKi8KK1haX0VYVEVSTiB2b2lkIFhaX0ZVTkMgeHpfY3JjMzJfaW5pdCh2b2lkKTsKKworLyoKKyAqIFVwZGF0ZSBDUkMzMiB2YWx1ZSB1c2luZyB0aGUgcG9seW5vbWlhbCBmcm9tIElFRUUtODAyLjMuIFRvIHN0YXJ0IGEgbmV3CisgKiBjYWxjdWxhdGlvbiwgdGhlIHRoaXJkIGFyZ3VtZW50IG11c3QgYmUgemVyby4gVG8gY29udGludWUgdGhlIGNhbGN1bGF0aW9uLAorICogdGhlIHByZXZpb3VzbHkgcmV0dXJuZWQgdmFsdWUgaXMgcGFzc2VkIGFzIHRoZSB0aGlyZCBhcmd1bWVudC4KKyAqLworWFpfRVhURVJOIHVpbnQzMl90IFhaX0ZVTkMgeHpfY3JjMzIoCisJCWNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUsIHVpbnQzMl90IGNyYyk7CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHoveHpfY29uZmlnLmggYi9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHoveHpfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg3ZTFjYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9jb25maWcuaApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIFByaXZhdGUgaW5jbHVkZXMgYW5kIGRlZmluaXRpb25zIGZvciB1c2Vyc3BhY2UgdXNlIG9mIFhaIEVtYmVkZGVkCisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgWFpfQ09ORklHX0gKKyNkZWZpbmUgWFpfQ09ORklHX0gKKworLyogVW5jb21tZW50IGFzIG5lZWRlZCB0byBlbmFibGUgQkNKIGZpbHRlciBkZWNvZGVycy4gKi8KKy8qICNkZWZpbmUgWFpfREVDX1g4NiAqLworLyogI2RlZmluZSBYWl9ERUNfUE9XRVJQQyAqLworLyogI2RlZmluZSBYWl9ERUNfSUE2NCAqLworLyogI2RlZmluZSBYWl9ERUNfQVJNICovCisvKiAjZGVmaW5lIFhaX0RFQ19BUk1USFVNQiAqLworLyogI2RlZmluZSBYWl9ERUNfU1BBUkMgKi8KKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgInh6LmgiCisKKyNkZWZpbmUga21hbGxvYyhzaXplLCBmbGFncykgbWFsbG9jKHNpemUpCisjZGVmaW5lIGtmcmVlKHB0cikgZnJlZShwdHIpCisjZGVmaW5lIHZtYWxsb2Moc2l6ZSkgbWFsbG9jKHNpemUpCisjZGVmaW5lIHZmcmVlKHB0cikgZnJlZShwdHIpCisKKyNkZWZpbmUgbWVtZXEoYSwgYiwgc2l6ZSkgKG1lbWNtcChhLCBiLCBzaXplKSA9PSAwKQorI2RlZmluZSBtZW16ZXJvKGJ1Ziwgc2l6ZSkgbWVtc2V0KGJ1ZiwgMCwgc2l6ZSkKKworI3VuZGVmIG1pbgorI3VuZGVmIG1pbl90CisjZGVmaW5lIG1pbih4LCB5KSAoKHgpIDwgKHkpID8gKHgpIDogKHkpKQorI2RlZmluZSBtaW5fdCh0eXBlLCB4LCB5KSBtaW4oeCwgeSkKKworLyoKKyAqIFNvbWUgZnVuY3Rpb25zIGhhdmUgYmVlbiBtYXJrZWQgd2l0aCBfX2Fsd2F5c19pbmxpbmUgdG8ga2VlcCB0aGUKKyAqIHBlcmZvcm1hbmNlIHJlYXNvbmFibGUgZXZlbiB3aGVuIHRoZSBjb21waWxlciBpcyBvcHRpbWl6aW5nIGZvcgorICogc21hbGwgY29kZSBzaXplLiBZb3UgbWF5IGJlIGFibGUgdG8gc2F2ZSBhIGZldyBieXRlcyBieSAjZGVmaW5pbmcKKyAqIF9fYWx3YXlzX2lubGluZSB0byBwbGFpbiBpbmxpbmUsIGJ1dCBkb24ndCBjb21wbGFpbiBpZiB0aGUgY29kZQorICogYmVjb21lcyBzbG93LgorICoKKyAqIE5PVEU6IFN5c3RlbSBoZWFkZXJzIG9uIEdOVS9MaW51eCBtYXkgI2RlZmluZSB0aGlzIG1hY3JvIGFscmVhZHksCisgKiBzbyBpZiB5b3Ugd2FudCB0byBjaGFuZ2UgaXQsIHlvdSBuZWVkIHRvICN1bmRlZiBpdCBmaXJzdC4KKyAqLworI2lmbmRlZiBfX2Fsd2F5c19pbmxpbmUKKyMJaWZkZWYgX19HTlVDX18KKyMJCWRlZmluZSBfX2Fsd2F5c19pbmxpbmUgXAorCQkJaW5saW5lIF9fYXR0cmlidXRlX18oKF9fYWx3YXlzX2lubGluZV9fKSkKKyMJZWxzZQorIwkJZGVmaW5lIF9fYWx3YXlzX2lubGluZSBpbmxpbmUKKyMJZW5kaWYKKyNlbmRpZgorCisvKgorICogU29tZSBmdW5jdGlvbnMgYXJlIG1hcmtlZCB0byBuZXZlciBiZSBpbmxpbmVkIHRvIHJlZHVjZSBzdGFjayB1c2FnZS4KKyAqIElmIHlvdSBkb24ndCBjYXJlIGFib3V0IHN0YWNrIHVzYWdlLCB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5IHRoaXMgc28KKyAqIHRoYXQgbm9pbmxpbmVfZm9yX3N0YWNrIGlzICNkZWZpbmVkIHRvIGJlIGVtcHR5IGV2ZW4gd2hlbiB1c2luZyBHQ0MuCisgKiBEb2luZyBzbyBtYXkgc2F2ZSBhIGZldyBieXRlcyBpbiBiaW5hcnkgc2l6ZS4KKyAqLworI2lmbmRlZiBub2lubGluZV9mb3Jfc3RhY2sKKyMJaWZkZWYgX19HTlVDX18KKyMJCWRlZmluZSBub2lubGluZV9mb3Jfc3RhY2sgX19hdHRyaWJ1dGVfXygoX19ub2lubGluZV9fKSkKKyMJZWxzZQorIwkJZGVmaW5lIG5vaW5saW5lX2Zvcl9zdGFjaworIwllbmRpZgorI2VuZGlmCisKKy8qIElubGluZSBmdW5jdGlvbnMgdG8gYWNjZXNzIHVuYWxpZ25lZCB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlcnMgKi8KKyNpZm5kZWYgZ2V0X3VuYWxpZ25lZF9sZTMyCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFhaX0ZVTkMgZ2V0X3VuYWxpZ25lZF9sZTMyKGNvbnN0IHVpbnQ4X3QgKmJ1ZikKK3sKKwlyZXR1cm4gKHVpbnQzMl90KWJ1ZlswXQorCQkJfCAoKHVpbnQzMl90KWJ1ZlsxXSA8PCA4KQorCQkJfCAoKHVpbnQzMl90KWJ1ZlsyXSA8PCAxNikKKwkJCXwgKCh1aW50MzJfdClidWZbM10gPDwgMjQpOworfQorI2VuZGlmCisKKyNpZm5kZWYgZ2V0X3VuYWxpZ25lZF9iZTMyCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFhaX0ZVTkMgZ2V0X3VuYWxpZ25lZF9iZTMyKGNvbnN0IHVpbnQ4X3QgKmJ1ZikKK3sKKwlyZXR1cm4gKHVpbnQzMl90KShidWZbMF0gPDwgMjQpCisJCQl8ICgodWludDMyX3QpYnVmWzFdIDw8IDE2KQorCQkJfCAoKHVpbnQzMl90KWJ1ZlsyXSA8PCA4KQorCQkJfCAodWludDMyX3QpYnVmWzNdOworfQorI2VuZGlmCisKKyNpZm5kZWYgcHV0X3VuYWxpZ25lZF9sZTMyCitzdGF0aWMgaW5saW5lIHZvaWQgWFpfRlVOQyBwdXRfdW5hbGlnbmVkX2xlMzIodWludDMyX3QgdmFsLCB1aW50OF90ICpidWYpCit7CisJYnVmWzBdID0gKHVpbnQ4X3QpdmFsOworCWJ1ZlsxXSA9ICh1aW50OF90KSh2YWwgPj4gOCk7CisJYnVmWzJdID0gKHVpbnQ4X3QpKHZhbCA+PiAxNik7CisJYnVmWzNdID0gKHVpbnQ4X3QpKHZhbCA+PiAyNCk7Cit9CisjZW5kaWYKKworI2lmbmRlZiBwdXRfdW5hbGlnbmVkX2JlMzIKK3N0YXRpYyBpbmxpbmUgdm9pZCBYWl9GVU5DIHB1dF91bmFsaWduZWRfYmUzMih1aW50MzJfdCB2YWwsIHVpbnQ4X3QgKmJ1ZikKK3sKKwlidWZbMF0gPSAodWludDhfdCkodmFsID4+IDI0KTsKKwlidWZbMV0gPSAodWludDhfdCkodmFsID4+IDE2KTsKKwlidWZbMl0gPSAodWludDhfdCkodmFsID4+IDgpOworCWJ1ZlszXSA9ICh1aW50OF90KXZhbDsKK30KKyNlbmRpZgorCisvKgorICogVXNlIGdldF91bmFsaWduZWRfbGUzMigpIGFsc28gZm9yIGFsaWduZWQgYWNjZXNzIGZvciBzaW1wbGljaXR5LiBPbgorICogbGl0dGxlIGVuZGlhbiBzeXN0ZW1zLCAjZGVmaW5lIGdldF9sZTMyKHB0cikgKCooY29uc3QgdWludDMyX3QgKikocHRyKSkKKyAqIGNvdWxkIHNhdmUgYSBmZXcgYnl0ZXMgaW4gY29kZSBzaXplLgorICovCisjaWZuZGVmIGdldF9sZTMyCisjCWRlZmluZSBnZXRfbGUzMiBnZXRfdW5hbGlnbmVkX2xlMzIKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9kZWNfYmNqLmMgYi9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHoveHpfZGVjX2Jjai5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZjkxM2EKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHoveHpfZGVjX2Jjai5jCkBAIC0wLDAgKzEsNTgwIEBACisvKgorICogQnJhbmNoL0NhbGwvSnVtcCAoQkNKKSBmaWx0ZXIgZGVjb2RlcnMKKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpbmNsdWRlICJ4el9wcml2YXRlLmgiCisKKy8qCisgKiBUaGUgcmVzdCBvZiB0aGUgZmlsZSBpcyBpbnNpZGUgdGhpcyBpZmRlZi4gSXQgbWFrZXMgdGhpbmdzIGEgbGl0dGxlIG1vcmUKKyAqIGNvbnZlbmllbnQgd2hlbiBidWlsZGluZyB3aXRob3V0IHN1cHBvcnQgZm9yIGFueSBCQ0ogZmlsdGVycy4KKyAqLworI2lmZGVmIFhaX0RFQ19CQ0oKKworc3RydWN0IHh6X2RlY19iY2ogeworCS8qIFR5cGUgb2YgdGhlIEJDSiBmaWx0ZXIgYmVpbmcgdXNlZCAqLworCWVudW0geworCQlCQ0pfWDg2ID0gNCwgICAgICAgIC8qIHg4NiBvciB4ODYtNjQgKi8KKwkJQkNKX1BPV0VSUEMgPSA1LCAgICAvKiBCaWcgZW5kaWFuIG9ubHkgKi8KKwkJQkNKX0lBNjQgPSA2LCAgICAgICAvKiBCaWcgb3IgbGl0dGxlIGVuZGlhbiAqLworCQlCQ0pfQVJNID0gNywgICAgICAgIC8qIExpdHRsZSBlbmRpYW4gb25seSAqLworCQlCQ0pfQVJNVEhVTUIgPSA4LCAgIC8qIExpdHRsZSBlbmRpYW4gb25seSAqLworCQlCQ0pfU1BBUkMgPSA5ICAgICAgIC8qIEJpZyBvciBsaXR0bGUgZW5kaWFuICovCisJfSB0eXBlOworCisJLyoKKwkgKiBSZXR1cm4gdmFsdWUgb2YgdGhlIG5leHQgZmlsdGVyIGluIHRoZSBjaGFpbi4gV2UgbmVlZCB0byBwcmVzZXJ2ZQorCSAqIHRoaXMgaW5mb3JtYXRpb24gYWNyb3NzIGNhbGxzLCBiZWNhdXNlIHdlIG11c3Qgbm90IGNhbGwgdGhlIG5leHQKKwkgKiBmaWx0ZXIgYW55bW9yZSBvbmNlIGl0IGhhcyByZXR1cm5lZCBYWl9TVFJFQU1fRU5ELgorCSAqLworCWVudW0geHpfcmV0IHJldDsKKworCS8qIFRydWUgaWYgd2UgYXJlIG9wZXJhdGluZyBpbiBzaW5nbGUtY2FsbCBtb2RlLiAqLworCWJvb2wgc2luZ2xlX2NhbGw7CisKKwkvKgorCSAqIEFic29sdXRlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHVuY29tcHJlc3NlZAorCSAqIGRhdGEgKGluIGEgc2luZ2xlIC54eiBCbG9jaykuIFdlIGNhcmUgb25seSBhYm91dCB0aGUgbG93ZXN0IDMyCisJICogYml0cyBzbyB0aGlzIGRvZXNuJ3QgbmVlZCB0byBiZSB1aW50NjRfdCBldmVuIHdpdGggYmlnIGZpbGVzLgorCSAqLworCXVpbnQzMl90IHBvczsKKworCS8qIHg4NiBmaWx0ZXIgc3RhdGUgKi8KKwl1aW50MzJfdCB4ODZfcHJldl9tYXNrOworCisJLyogVGVtcG9yYXJ5IHNwYWNlIHRvIGhvbGQgdGhlIHZhcmlhYmxlcyBmcm9tIHN0cnVjdCB4el9idWYgKi8KKwl1aW50OF90ICpvdXQ7CisJc2l6ZV90IG91dF9wb3M7CisJc2l6ZV90IG91dF9zaXplOworCisJc3RydWN0IHsKKwkJLyogQW1vdW50IG9mIGFscmVhZHkgZmlsdGVyZWQgZGF0YSBpbiB0aGUgYmVnaW5uaW5nIG9mIGJ1ZiAqLworCQlzaXplX3QgZmlsdGVyZWQ7CisKKwkJLyogVG90YWwgYW1vdW50IG9mIGRhdGEgY3VycmVudGx5IHN0b3JlZCBpbiBidWYgICovCisJCXNpemVfdCBzaXplOworCisJCS8qCisJCSAqIEJ1ZmZlciB0byBob2xkIGEgbWl4IG9mIGZpbHRlcmVkIGFuZCB1bmZpbHRlcmVkIGRhdGEuIFRoaXMKKwkJICogbmVlZHMgdG8gYmUgYmlnIGVub3VnaCB0byBob2xkIEFsaWdubWVudCArIDIgKiBMb29rLWFoZWFkOgorCQkgKgorCQkgKiBUeXBlICAgICAgICAgQWxpZ25tZW50ICAgTG9vay1haGVhZAorCQkgKiB4ODYgICAgICAgICAgICAgIDEgICAgICAgICAgIDQKKwkJICogUG93ZXJQQyAgICAgICAgICA0ICAgICAgICAgICAwCisJCSAqIElBLTY0ICAgICAgICAgICAxNiAgICAgICAgICAgMAorCQkgKiBBUk0gICAgICAgICAgICAgIDQgICAgICAgICAgIDAKKwkJICogQVJNLVRodW1iICAgICAgICAyICAgICAgICAgICAyCisJCSAqIFNQQVJDICAgICAgICAgICAgNCAgICAgICAgICAgMAorCQkgKi8KKwkJdWludDhfdCBidWZbMTZdOworCX0gdGVtcDsKK307CisKKyNpZmRlZiBYWl9ERUNfWDg2CisvKgorICogVGhpcyBpcyB1c2VkIHRvIHRlc3QgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYnl0ZSBvZiBhIG1lbW9yeSBhZGRyZXNzCisgKiBpbiBhbiB4ODYgaW5zdHJ1Y3Rpb24uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGJjal94ODZfdGVzdF9tc2J5dGUodWludDhfdCBiKQoreworCXJldHVybiBiID09IDB4MDAgfHwgYiA9PSAweEZGOworfQorCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIHNpemVfdCBYWl9GVU5DIGJjal94ODYoCisJCXN0cnVjdCB4el9kZWNfYmNqICpzLCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplKQoreworCXN0YXRpYyBjb25zdCBib29sIG1hc2tfdG9fYWxsb3dlZF9zdGF0dXNbOF0KKwkJPSB7IHRydWUsIHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlIH07CisKKwlzdGF0aWMgY29uc3QgdWludDhfdCBtYXNrX3RvX2JpdF9udW1bOF0gPSB7IDAsIDEsIDIsIDIsIDMsIDMsIDMsIDMgfTsKKworCXNpemVfdCBpOworCXNpemVfdCBwcmV2X3BvcyA9IChzaXplX3QpLTE7CisJdWludDMyX3QgcHJldl9tYXNrID0gcy0+eDg2X3ByZXZfbWFzazsKKwl1aW50MzJfdCBzcmM7CisJdWludDMyX3QgZGVzdDsKKwl1aW50MzJfdCBqOworCXVpbnQ4X3QgYjsKKworCWlmIChzaXplIDw9IDQpCisJCXJldHVybiAwOworCisJc2l6ZSAtPSA0OworCWZvciAoaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKKwkJaWYgKChidWZbaV0gJiAweEZFKSAhPSAweEU4KQorCQkJY29udGludWU7CisKKwkJcHJldl9wb3MgPSBpIC0gcHJldl9wb3M7CisJCWlmIChwcmV2X3BvcyA+IDMpIHsKKwkJCXByZXZfbWFzayA9IDA7CisJCX0gZWxzZSB7CisJCQlwcmV2X21hc2sgPSAocHJldl9tYXNrIDw8IChwcmV2X3BvcyAtIDEpKSAmIDc7CisJCQlpZiAocHJldl9tYXNrICE9IDApIHsKKwkJCQliID0gYnVmW2kgKyA0IC0gbWFza190b19iaXRfbnVtW3ByZXZfbWFza11dOworCQkJCWlmICghbWFza190b19hbGxvd2VkX3N0YXR1c1twcmV2X21hc2tdCisJCQkJCQl8fCBiY2pfeDg2X3Rlc3RfbXNieXRlKGIpKSB7CisJCQkJCXByZXZfcG9zID0gaTsKKwkJCQkJcHJldl9tYXNrID0gKHByZXZfbWFzayA8PCAxKSB8IDE7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJfQorCisJCXByZXZfcG9zID0gaTsKKworCQlpZiAoYmNqX3g4Nl90ZXN0X21zYnl0ZShidWZbaSArIDRdKSkgeworCQkJc3JjID0gZ2V0X3VuYWxpZ25lZF9sZTMyKGJ1ZiArIGkgKyAxKTsKKwkJCXdoaWxlICh0cnVlKSB7CisJCQkJZGVzdCA9IHNyYyAtIChzLT5wb3MgKyAodWludDMyX3QpaSArIDUpOworCQkJCWlmIChwcmV2X21hc2sgPT0gMCkKKwkJCQkJYnJlYWs7CisKKwkJCQlqID0gbWFza190b19iaXRfbnVtW3ByZXZfbWFza10gKiA4OworCQkJCWIgPSAodWludDhfdCkoZGVzdCA+PiAoMjQgLSBqKSk7CisJCQkJaWYgKCFiY2pfeDg2X3Rlc3RfbXNieXRlKGIpKQorCQkJCQlicmVhazsKKworCQkJCXNyYyA9IGRlc3QgXiAoKCh1aW50MzJfdCkxIDw8ICgzMiAtIGopKSAtIDEpOworCQkJfQorCisJCQlkZXN0ICY9IDB4MDFGRkZGRkY7CisJCQlkZXN0IHw9ICh1aW50MzJfdCkwIC0gKGRlc3QgJiAweDAxMDAwMDAwKTsKKwkJCXB1dF91bmFsaWduZWRfbGUzMihkZXN0LCBidWYgKyBpICsgMSk7CisJCQlpICs9IDQ7CisJCX0gZWxzZSB7CisJCQlwcmV2X21hc2sgPSAocHJldl9tYXNrIDw8IDEpIHwgMTsKKwkJfQorCX0KKworCXByZXZfcG9zID0gaSAtIHByZXZfcG9zOworCXMtPng4Nl9wcmV2X21hc2sgPSBwcmV2X3BvcyA+IDMgPyAwIDogcHJldl9tYXNrIDw8IChwcmV2X3BvcyAtIDEpOworCXJldHVybiBpOworfQorI2VuZGlmCisKKyNpZmRlZiBYWl9ERUNfUE9XRVJQQworc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjayBzaXplX3QgWFpfRlVOQyBiY2pfcG93ZXJwYygKKwkJc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IGk7CisJdWludDMyX3QgaW5zdHI7CisKKwlmb3IgKGkgPSAwOyBpICsgNCA8PSBzaXplOyBpICs9IDQpIHsKKwkJaW5zdHIgPSBnZXRfdW5hbGlnbmVkX2JlMzIoYnVmICsgaSk7CisJCWlmICgoaW5zdHIgJiAweEZDMDAwMDAzKSA9PSAweDQ4MDAwMDAxKSB7CisJCQlpbnN0ciAmPSAweDAzRkZGRkZDOworCQkJaW5zdHIgLT0gcy0+cG9zICsgKHVpbnQzMl90KWk7CisJCQlpbnN0ciAmPSAweDAzRkZGRkZDOworCQkJaW5zdHIgfD0gMHg0ODAwMDAwMTsKKwkJCXB1dF91bmFsaWduZWRfYmUzMihpbnN0ciwgYnVmICsgaSk7CisJCX0KKwl9CisKKwlyZXR1cm4gaTsKK30KKyNlbmRpZgorCisjaWZkZWYgWFpfREVDX0lBNjQKK3N0YXRpYyBub2lubGluZV9mb3Jfc3RhY2sgc2l6ZV90IFhaX0ZVTkMgYmNqX2lhNjQoCisJCXN0cnVjdCB4el9kZWNfYmNqICpzLCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplKQoreworCXN0YXRpYyBjb25zdCB1aW50OF90IGJyYW5jaF90YWJsZVszMl0gPSB7CisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisJCTQsIDQsIDYsIDYsIDAsIDAsIDcsIDcsCisJCTQsIDQsIDAsIDAsIDQsIDQsIDAsIDAKKwl9OworCisJLyoKKwkgKiBUaGUgbG9jYWwgdmFyaWFibGVzIHRha2UgYSBsaXR0bGUgYml0IHN0YWNrIHNwYWNlLCBidXQgaXQncyBsZXNzCisJICogdGhhbiB3aGF0IExaTUEyIGRlY29kZXIgdGFrZXMsIHNvIGl0IGRvZXNuJ3QgbWFrZSBzZW5zZSB0byByZWR1Y2UKKwkgKiBzdGFjayB1c2FnZSBoZXJlIHdpdGhvdXQgZG9pbmcgdGhhdCBmb3IgdGhlIExaTUEyIGRlY29kZXIgdG9vLgorCSAqLworCisJLyogTG9vcCBjb3VudGVycyAqLworCXNpemVfdCBpOworCXNpemVfdCBqOworCisJLyogSW5zdHJ1Y3Rpb24gc2xvdCAoMCwgMSwgb3IgMikgaW4gdGhlIDEyOC1iaXQgaW5zdHJ1Y3Rpb24gd29yZCAqLworCXVpbnQzMl90IHNsb3Q7CisKKwkvKiBCaXR3aXNlIG9mZnNldCBvZiB0aGUgaW5zdHJ1Y3Rpb24gaW5kaWNhdGVkIGJ5IHNsb3QgKi8KKwl1aW50MzJfdCBiaXRfcG9zOworCisJLyogYml0X3BvcyBzcGxpdCBpbnRvIGJ5dGUgYW5kIGJpdCBwYXJ0cyAqLworCXVpbnQzMl90IGJ5dGVfcG9zOworCXVpbnQzMl90IGJpdF9yZXM7CisKKwkvKiBBZGRyZXNzIHBhcnQgb2YgYW4gaW5zdHJ1Y3Rpb24gKi8KKwl1aW50MzJfdCBhZGRyOworCisJLyogTWFzayB1c2VkIHRvIGRldGVjdCB3aGljaCBpbnN0cnVjdGlvbnMgdG8gY29udmVydCAqLworCXVpbnQzMl90IG1hc2s7CisKKwkvKiA0MS1iaXQgaW5zdHJ1Y3Rpb24gc3RvcmVkIHNvbWV3aGVyZSBpbiB0aGUgbG93ZXN0IDQ4IGJpdHMgKi8KKwl1aW50NjRfdCBpbnN0cjsKKworCS8qIEluc3RydWN0aW9uIG5vcm1hbGl6ZWQgd2l0aCBiaXRfcmVzIGZvciBlYXNpZXIgbWFuaXB1bGF0aW9uICovCisJdWludDY0X3Qgbm9ybTsKKworCWZvciAoaSA9IDA7IGkgKyAxNiA8PSBzaXplOyBpICs9IDE2KSB7CisJCW1hc2sgPSBicmFuY2hfdGFibGVbYnVmW2ldICYgMHgxRl07CisJCWZvciAoc2xvdCA9IDAsIGJpdF9wb3MgPSA1OyBzbG90IDwgMzsgKytzbG90LCBiaXRfcG9zICs9IDQxKSB7CisJCQlpZiAoKChtYXNrID4+IHNsb3QpICYgMSkgPT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJYnl0ZV9wb3MgPSBiaXRfcG9zID4+IDM7CisJCQliaXRfcmVzID0gYml0X3BvcyAmIDc7CisJCQlpbnN0ciA9IDA7CisJCQlmb3IgKGogPSAwOyBqIDwgNjsgKytqKQorCQkJCWluc3RyIHw9ICh1aW50NjRfdCkoYnVmW2kgKyBqICsgYnl0ZV9wb3NdKQorCQkJCQkJPDwgKDggKiBqKTsKKworCQkJbm9ybSA9IGluc3RyID4+IGJpdF9yZXM7CisKKwkJCWlmICgoKG5vcm0gPj4gMzcpICYgMHgwRikgPT0gMHgwNQorCQkJCQkmJiAoKG5vcm0gPj4gOSkgJiAweDA3KSA9PSAwKSB7CisJCQkJYWRkciA9IChub3JtID4+IDEzKSAmIDB4MEZGRkZGOworCQkJCWFkZHIgfD0gKCh1aW50MzJfdCkobm9ybSA+PiAzNikgJiAxKSA8PCAyMDsKKwkJCQlhZGRyIDw8PSA0OworCQkJCWFkZHIgLT0gcy0+cG9zICsgKHVpbnQzMl90KWk7CisJCQkJYWRkciA+Pj0gNDsKKworCQkJCW5vcm0gJj0gfigodWludDY0X3QpMHg4RkZGRkYgPDwgMTMpOworCQkJCW5vcm0gfD0gKHVpbnQ2NF90KShhZGRyICYgMHgwRkZGRkYpIDw8IDEzOworCQkJCW5vcm0gfD0gKHVpbnQ2NF90KShhZGRyICYgMHgxMDAwMDApCisJCQkJCQk8PCAoMzYgLSAyMCk7CisKKwkJCQlpbnN0ciAmPSAoMSA8PCBiaXRfcmVzKSAtIDE7CisJCQkJaW5zdHIgfD0gbm9ybSA8PCBiaXRfcmVzOworCisJCQkJZm9yIChqID0gMDsgaiA8IDY7IGorKykKKwkJCQkJYnVmW2kgKyBqICsgYnl0ZV9wb3NdCisJCQkJCQk9ICh1aW50OF90KShpbnN0ciA+PiAoOCAqIGopKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBpOworfQorI2VuZGlmCisKKyNpZmRlZiBYWl9ERUNfQVJNCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIHNpemVfdCBYWl9GVU5DIGJjal9hcm0oCisJCXN0cnVjdCB4el9kZWNfYmNqICpzLCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplKQoreworCXNpemVfdCBpOworCXVpbnQzMl90IGFkZHI7CisKKwlmb3IgKGkgPSAwOyBpICsgNCA8PSBzaXplOyBpICs9IDQpIHsKKwkJaWYgKGJ1ZltpICsgM10gPT0gMHhFQikgeworCQkJYWRkciA9ICh1aW50MzJfdClidWZbaV0gfCAoKHVpbnQzMl90KWJ1ZltpICsgMV0gPDwgOCkKKwkJCQkJfCAoKHVpbnQzMl90KWJ1ZltpICsgMl0gPDwgMTYpOworCQkJYWRkciA8PD0gMjsKKwkJCWFkZHIgLT0gcy0+cG9zICsgKHVpbnQzMl90KWkgKyA4OworCQkJYWRkciA+Pj0gMjsKKwkJCWJ1ZltpXSA9ICh1aW50OF90KWFkZHI7CisJCQlidWZbaSArIDFdID0gKHVpbnQ4X3QpKGFkZHIgPj4gOCk7CisJCQlidWZbaSArIDJdID0gKHVpbnQ4X3QpKGFkZHIgPj4gMTYpOworCQl9CisJfQorCisJcmV0dXJuIGk7Cit9CisjZW5kaWYKKworI2lmZGVmIFhaX0RFQ19BUk1USFVNQgorc3RhdGljIG5vaW5saW5lX2Zvcl9zdGFjayBzaXplX3QgWFpfRlVOQyBiY2pfYXJtdGh1bWIoCisJCXN0cnVjdCB4el9kZWNfYmNqICpzLCB1aW50OF90ICpidWYsIHNpemVfdCBzaXplKQoreworCXNpemVfdCBpOworCXVpbnQzMl90IGFkZHI7CisKKwlmb3IgKGkgPSAwOyBpICsgNCA8PSBzaXplOyBpICs9IDIpIHsKKwkJaWYgKChidWZbaSArIDFdICYgMHhGOCkgPT0gMHhGMAorCQkJCSYmIChidWZbaSArIDNdICYgMHhGOCkgPT0gMHhGOCkgeworCQkJYWRkciA9ICgoKHVpbnQzMl90KWJ1ZltpICsgMV0gJiAweDA3KSA8PCAxOSkKKwkJCQkJfCAoKHVpbnQzMl90KWJ1ZltpXSA8PCAxMSkKKwkJCQkJfCAoKCh1aW50MzJfdClidWZbaSArIDNdICYgMHgwNykgPDwgOCkKKwkJCQkJfCAodWludDMyX3QpYnVmW2kgKyAyXTsKKwkJCWFkZHIgPDw9IDE7CisJCQlhZGRyIC09IHMtPnBvcyArICh1aW50MzJfdClpICsgNDsKKwkJCWFkZHIgPj49IDE7CisJCQlidWZbaSArIDFdID0gKHVpbnQ4X3QpKDB4RjAgfCAoKGFkZHIgPj4gMTkpICYgMHgwNykpOworCQkJYnVmW2ldID0gKHVpbnQ4X3QpKGFkZHIgPj4gMTEpOworCQkJYnVmW2kgKyAzXSA9ICh1aW50OF90KSgweEY4IHwgKChhZGRyID4+IDgpICYgMHgwNykpOworCQkJYnVmW2kgKyAyXSA9ICh1aW50OF90KWFkZHI7CisJCQlpICs9IDI7CisJCX0KKwl9CisKKwlyZXR1cm4gaTsKK30KKyNlbmRpZgorCisjaWZkZWYgWFpfREVDX1NQQVJDCitzdGF0aWMgbm9pbmxpbmVfZm9yX3N0YWNrIHNpemVfdCBYWl9GVU5DIGJjal9zcGFyYygKKwkJc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IGk7CisJdWludDMyX3QgaW5zdHI7CisKKwlmb3IgKGkgPSAwOyBpICsgNCA8PSBzaXplOyBpICs9IDQpIHsKKwkJaW5zdHIgPSBnZXRfdW5hbGlnbmVkX2JlMzIoYnVmICsgaSk7CisJCWlmICgoaW5zdHIgPj4gMjIpID09IDB4MTAwIHx8IChpbnN0ciA+PiAyMikgPT0gMHgxRkYpIHsKKwkJCWluc3RyIDw8PSAyOworCQkJaW5zdHIgLT0gcy0+cG9zICsgKHVpbnQzMl90KWk7CisJCQlpbnN0ciA+Pj0gMjsKKwkJCWluc3RyID0gKCh1aW50MzJfdCkweDQwMDAwMDAwIC0gKGluc3RyICYgMHg0MDAwMDApKQorCQkJCQl8IDB4NDAwMDAwMDAgfCAoaW5zdHIgJiAweDNGRkZGRik7CisJCQlwdXRfdW5hbGlnbmVkX2JlMzIoaW5zdHIsIGJ1ZiArIGkpOworCQl9CisJfQorCisJcmV0dXJuIGk7Cit9CisjZW5kaWYKKworLyoKKyAqIEFwcGx5IHRoZSBzZWxlY3RlZCBCQ0ogZmlsdGVyLiBVcGRhdGUgKnBvcyBhbmQgcy0+cG9zIHRvIG1hdGNoIHRoZSBhbW91bnQKKyAqIG9mIGRhdGEgdGhhdCBnb3QgZmlsdGVyZWQuCisgKgorICogTk9URTogVGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHN3aXRjaCBzdGF0ZW1lbnQgdG8gYXZvaWQgdXNpbmcgZnVuY3Rpb24KKyAqIHBvaW50ZXJzLCB3aGljaCBjb3VsZCBiZSBwcm9ibGVtYXRpYyBpbiB0aGUga2VybmVsIGJvb3QgY29kZSwgd2hpY2ggbXVzdAorICogYXZvaWQgcG9pbnRlcnMgdG8gc3RhdGljIGRhdGEgKGF0IGxlYXN0IG9uIHg4NikuCisgKi8KK3N0YXRpYyB2b2lkIFhaX0ZVTkMgYmNqX2FwcGx5KHN0cnVjdCB4el9kZWNfYmNqICpzLAorCQl1aW50OF90ICpidWYsIHNpemVfdCAqcG9zLCBzaXplX3Qgc2l6ZSkKK3sKKwlzaXplX3QgZmlsdGVyZWQ7CisKKwlidWYgKz0gKnBvczsKKwlzaXplIC09ICpwb3M7CisKKwlzd2l0Y2ggKHMtPnR5cGUpIHsKKyNpZmRlZiBYWl9ERUNfWDg2CisJY2FzZSBCQ0pfWDg2OgorCQlmaWx0ZXJlZCA9IGJjal94ODYocywgYnVmLCBzaXplKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfUE9XRVJQQworCWNhc2UgQkNKX1BPV0VSUEM6CisJCWZpbHRlcmVkID0gYmNqX3Bvd2VycGMocywgYnVmLCBzaXplKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfSUE2NAorCWNhc2UgQkNKX0lBNjQ6CisJCWZpbHRlcmVkID0gYmNqX2lhNjQocywgYnVmLCBzaXplKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfQVJNCisJY2FzZSBCQ0pfQVJNOgorCQlmaWx0ZXJlZCA9IGJjal9hcm0ocywgYnVmLCBzaXplKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfQVJNVEhVTUIKKwljYXNlIEJDSl9BUk1USFVNQjoKKwkJZmlsdGVyZWQgPSBiY2pfYXJtdGh1bWIocywgYnVmLCBzaXplKTsKKwkJYnJlYWs7CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfU1BBUkMKKwljYXNlIEJDSl9TUEFSQzoKKwkJZmlsdGVyZWQgPSBiY2pfc3BhcmMocywgYnVmLCBzaXplKTsKKwkJYnJlYWs7CisjZW5kaWYKKwlkZWZhdWx0OgorCQkvKiBOZXZlciByZWFjaGVkIGJ1dCBzaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmdzLiAqLworCQlmaWx0ZXJlZCA9IDA7CisJCWJyZWFrOworCX0KKworCSpwb3MgKz0gZmlsdGVyZWQ7CisJcy0+cG9zICs9IGZpbHRlcmVkOworfQorCisvKgorICogRmx1c2ggcGVuZGluZyBmaWx0ZXJlZCBkYXRhIGZyb20gdGVtcCB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAqIE1vdmUgdGhlIHJlbWFpbmluZyBtaXh0dXJlIG9mIHBvc3NpYmx5IGZpbHRlcmVkIGFuZCB1bmZpbHRlcmVkCisgKiBkYXRhIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGVtcC4KKyAqLworc3RhdGljIHZvaWQgWFpfRlVOQyBiY2pfZmx1c2goc3RydWN0IHh6X2RlY19iY2ogKnMsIHN0cnVjdCB4el9idWYgKmIpCit7CisJc2l6ZV90IGNvcHlfc2l6ZTsKKworCWNvcHlfc2l6ZSA9IG1pbl90KHNpemVfdCwgcy0+dGVtcC5maWx0ZXJlZCwgYi0+b3V0X3NpemUgLSBiLT5vdXRfcG9zKTsKKwltZW1jcHkoYi0+b3V0ICsgYi0+b3V0X3Bvcywgcy0+dGVtcC5idWYsIGNvcHlfc2l6ZSk7CisJYi0+b3V0X3BvcyArPSBjb3B5X3NpemU7CisKKwlzLT50ZW1wLmZpbHRlcmVkIC09IGNvcHlfc2l6ZTsKKwlzLT50ZW1wLnNpemUgLT0gY29weV9zaXplOworCW1lbW1vdmUocy0+dGVtcC5idWYsIHMtPnRlbXAuYnVmICsgY29weV9zaXplLCBzLT50ZW1wLnNpemUpOworfQorCisvKgorICogVGhlIEJDSiBmaWx0ZXIgZnVuY3Rpb25zIGFyZSBwcmltaXRpdmUgaW4gc2Vuc2UgdGhhdCB0aGV5IHByb2Nlc3MgdGhlCisgKiBkYXRhIGluIGNodW5rcyBvZiAxLTE2IGJ5dGVzLiBUbyBoaWRlIHRoaXMgaXNzdWUsIHRoaXMgZnVuY3Rpb24gZG9lcworICogc29tZSBidWZmZXJpbmcuCisgKi8KK1haX0VYVEVSTiBlbnVtIHh6X3JldCBYWl9GVU5DIHh6X2RlY19iY2pfcnVuKHN0cnVjdCB4el9kZWNfYmNqICpzLAorCQlzdHJ1Y3QgeHpfZGVjX2x6bWEyICpsem1hMiwgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwlzaXplX3Qgb3V0X3N0YXJ0OworCisJLyoKKwkgKiBGbHVzaCBwZW5kaW5nIGFscmVhZHkgZmlsdGVyZWQgZGF0YSB0byB0aGUgb3V0cHV0IGJ1ZmZlci4gUmV0dXJuCisJICogaW1tZWRpYXRlbGx5IGlmIHdlIGNvdWxkbid0IGZsdXNoIGV2ZXJ5dGhpbmcsIG9yIGlmIHRoZSBuZXh0CisJICogZmlsdGVyIGluIHRoZSBjaGFpbiBoYWQgYWxyZWFkeSByZXR1cm5lZCBYWl9TVFJFQU1fRU5ELgorCSAqLworCWlmIChzLT50ZW1wLmZpbHRlcmVkID4gMCkgeworCQliY2pfZmx1c2gocywgYik7CisJCWlmIChzLT50ZW1wLmZpbHRlcmVkID4gMCkKKwkJCXJldHVybiBYWl9PSzsKKworCQlpZiAocy0+cmV0ID09IFhaX1NUUkVBTV9FTkQpCisJCQlyZXR1cm4gWFpfU1RSRUFNX0VORDsKKwl9CisKKwkvKgorCSAqIElmIHdlIGhhdmUgbW9yZSBvdXRwdXQgc3BhY2UgdGhhbiB3aGF0IGlzIGN1cnJlbnRseSBwZW5kaW5nIGluCisJICogdGVtcCwgY29weSB0aGUgdW5maWx0ZXJlZCBkYXRhIGZyb20gdGVtcCB0byB0aGUgb3V0cHV0IGJ1ZmZlcgorCSAqIGFuZCB0cnkgdG8gZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlciBieSBkZWNvZGluZyBtb3JlIGRhdGEgZnJvbSB0aGUKKwkgKiBuZXh0IGZpbHRlciBpbiB0aGUgY2hhaW4uIEFwcGx5IHRoZSBCQ0ogZmlsdGVyIG9uIHRoZSBuZXcgZGF0YQorCSAqIGluIHRoZSBvdXRwdXQgYnVmZmVyLiBJZiBldmVyeXRoaW5nIGNhbm5vdCBiZSBmaWx0ZXJlZCwgY29weSBpdAorCSAqIHRvIHRlbXAgYW5kIHJld2luZCB0aGUgb3V0cHV0IGJ1ZmZlciBwb3NpdGlvbiBhY2NvcmRpbmdseS4KKwkgKgorCSAqIFRoaXMgbmVlZHMgdG8gYmUgYWx3YXlzIHJ1biB3aGVuIHRlbXAuc2l6ZSA9PSAwIHRvIGhhbmRsZSBhIHNwZWNpYWwKKwkgKiBjYXNlIHdoZXJlIHRoZSBvdXRwdXQgYnVmZmVyIGlzIGZ1bGwgYW5kIHRoZSBuZXh0IGZpbHRlciBoYXMgbm8KKwkgKiBtb3JlIG91dHB1dCBjb21pbmcgYnV0IGhhc24ndCByZXR1cm5lZCBYWl9TVFJFQU1fRU5EIHlldC4KKwkgKi8KKwlpZiAocy0+dGVtcC5zaXplIDwgYi0+b3V0X3NpemUgLSBiLT5vdXRfcG9zIHx8IHMtPnRlbXAuc2l6ZSA9PSAwKSB7CisJCW91dF9zdGFydCA9IGItPm91dF9wb3M7CisJCW1lbWNweShiLT5vdXQgKyBiLT5vdXRfcG9zLCBzLT50ZW1wLmJ1Ziwgcy0+dGVtcC5zaXplKTsKKwkJYi0+b3V0X3BvcyArPSBzLT50ZW1wLnNpemU7CisKKwkJcy0+cmV0ID0geHpfZGVjX2x6bWEyX3J1bihsem1hMiwgYik7CisJCWlmIChzLT5yZXQgIT0gWFpfU1RSRUFNX0VORAorCQkJCSYmIChzLT5yZXQgIT0gWFpfT0sgfHwgcy0+c2luZ2xlX2NhbGwpKQorCQkJcmV0dXJuIHMtPnJldDsKKworCQliY2pfYXBwbHkocywgYi0+b3V0LCAmb3V0X3N0YXJ0LCBiLT5vdXRfcG9zKTsKKworCQkvKgorCQkgKiBBcyBhbiBleGNlcHRpb24sIGlmIHRoZSBuZXh0IGZpbHRlciByZXR1cm5lZCBYWl9TVFJFQU1fRU5ELAorCQkgKiB3ZSBjYW4gZG8gdGhhdCB0b28sIHNpbmNlIHRoZSBsYXN0IGZldyBieXRlcyB0aGF0IHJlbWFpbgorCQkgKiB1bmZpbHRlcmVkIGFyZSBtZWFudCB0byByZW1haW4gdW5maWx0ZXJlZC4KKwkJICovCisJCWlmIChzLT5yZXQgPT0gWFpfU1RSRUFNX0VORCkKKwkJCXJldHVybiBYWl9TVFJFQU1fRU5EOworCisJCXMtPnRlbXAuc2l6ZSA9IGItPm91dF9wb3MgLSBvdXRfc3RhcnQ7CisJCWItPm91dF9wb3MgLT0gcy0+dGVtcC5zaXplOworCQltZW1jcHkocy0+dGVtcC5idWYsIGItPm91dCArIGItPm91dF9wb3MsIHMtPnRlbXAuc2l6ZSk7CisKKwkJLyoKKwkJICogSWYgdGhlcmUgd2Fzbid0IGVub3VnaCBpbnB1dCB0byB0aGUgbmV4dCBmaWx0ZXIgdG8gZmlsbAorCQkgKiB0aGUgb3V0cHV0IGJ1ZmZlciB3aXRoIHVuZmlsdGVyZWQgZGF0YSwgdGhlcmUncyBubyBwb2ludAorCQkgKiB0byB0cnkgZGVjb2RpbmcgbW9yZSBkYXRhIHRvIHRlbXAuCisJCSAqLworCQlpZiAoYi0+b3V0X3BvcyArIHMtPnRlbXAuc2l6ZSA8IGItPm91dF9zaXplKQorCQkJcmV0dXJuIFhaX09LOworCX0KKworCS8qCisJICogV2UgaGF2ZSB1bmZpbHRlcmVkIGRhdGEgaW4gdGVtcC4gSWYgdGhlIG91dHB1dCBidWZmZXIgaXNuJ3QgZnVsbAorCSAqIHlldCwgdHJ5IHRvIGZpbGwgdGhlIHRlbXAgYnVmZmVyIGJ5IGRlY29kaW5nIG1vcmUgZGF0YSBmcm9tIHRoZQorCSAqIG5leHQgZmlsdGVyLiBBcHBseSB0aGUgQkNKIGZpbHRlciBvbiB0ZW1wLiBUaGVuIHdlIGhvcGVmdWxseSBjYW4KKwkgKiBmaWxsIHRoZSBhY3R1YWwgb3V0cHV0IGJ1ZmZlciBieSBjb3B5aW5nIGZpbHRlcmVkIGRhdGEgZnJvbSB0ZW1wLgorCSAqIEEgbWl4IG9mIGZpbHRlcmVkIGFuZCB1bmZpbHRlcmVkIGRhdGEgbWF5IGJlIGxlZnQgaW4gdGVtcDsgaXQgd2lsbAorCSAqIGJlIHRha2VuIGNhcmUgb24gdGhlIG5leHQgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLgorCSAqLworCWlmIChiLT5vdXRfcG9zIDwgYi0+b3V0X3NpemUpIHsKKwkJLyogTWFrZSBiLT5vdXR7LF9wb3MsX3NpemV9IHRlbXBvcmFyaWx5IHBvaW50IHRvIHMtPnRlbXAuICovCisJCXMtPm91dCA9IGItPm91dDsKKwkJcy0+b3V0X3BvcyA9IGItPm91dF9wb3M7CisJCXMtPm91dF9zaXplID0gYi0+b3V0X3NpemU7CisJCWItPm91dCA9IHMtPnRlbXAuYnVmOworCQliLT5vdXRfcG9zID0gcy0+dGVtcC5zaXplOworCQliLT5vdXRfc2l6ZSA9IHNpemVvZihzLT50ZW1wLmJ1Zik7CisKKwkJcy0+cmV0ID0geHpfZGVjX2x6bWEyX3J1bihsem1hMiwgYik7CisKKwkJcy0+dGVtcC5zaXplID0gYi0+b3V0X3BvczsKKwkJYi0+b3V0ID0gcy0+b3V0OworCQliLT5vdXRfcG9zID0gcy0+b3V0X3BvczsKKwkJYi0+b3V0X3NpemUgPSBzLT5vdXRfc2l6ZTsKKworCQlpZiAocy0+cmV0ICE9IFhaX09LICYmIHMtPnJldCAhPSBYWl9TVFJFQU1fRU5EKQorCQkJcmV0dXJuIHMtPnJldDsKKworCQliY2pfYXBwbHkocywgcy0+dGVtcC5idWYsICZzLT50ZW1wLmZpbHRlcmVkLCBzLT50ZW1wLnNpemUpOworCisJCS8qCisJCSAqIElmIHRoZSBuZXh0IGZpbHRlciByZXR1cm5lZCBYWl9TVFJFQU1fRU5ELCB3ZSBtYXJrIHRoYXQKKwkJICogZXZlcnl0aGluZyBpcyBmaWx0ZXJlZCwgc2luY2UgdGhlIGxhc3QgdW5maWx0ZXJlZCBieXRlcworCQkgKiBvZiB0aGUgc3RyZWFtIGFyZSBtZWFudCB0byBiZSBsZWZ0IGFzIGlzLgorCQkgKi8KKwkJaWYgKHMtPnJldCA9PSBYWl9TVFJFQU1fRU5EKQorCQkJcy0+dGVtcC5maWx0ZXJlZCA9IHMtPnRlbXAuc2l6ZTsKKworCQliY2pfZmx1c2gocywgYik7CisJCWlmIChzLT50ZW1wLmZpbHRlcmVkID4gMCkKKwkJCXJldHVybiBYWl9PSzsKKwl9CisKKwlyZXR1cm4gcy0+cmV0OworfQorCitYWl9FWFRFUk4gc3RydWN0IHh6X2RlY19iY2ogKiBYWl9GVU5DIHh6X2RlY19iY2pfY3JlYXRlKGJvb2wgc2luZ2xlX2NhbGwpCit7CisJc3RydWN0IHh6X2RlY19iY2ogKnMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCWlmIChzICE9IE5VTEwpCisJCXMtPnNpbmdsZV9jYWxsID0gc2luZ2xlX2NhbGw7CisKKwlyZXR1cm4gczsKK30KKworWFpfRVhURVJOIGVudW0geHpfcmV0IFhaX0ZVTkMgeHpfZGVjX2Jjal9yZXNldCgKKwkJc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgaWQpCit7CisJc3dpdGNoIChpZCkgeworI2lmZGVmIFhaX0RFQ19YODYKKwljYXNlIEJDSl9YODY6CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfUE9XRVJQQworCWNhc2UgQkNKX1BPV0VSUEM6CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfSUE2NAorCWNhc2UgQkNKX0lBNjQ6CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfQVJNCisJY2FzZSBCQ0pfQVJNOgorI2VuZGlmCisjaWZkZWYgWFpfREVDX0FSTVRIVU1CCisJY2FzZSBCQ0pfQVJNVEhVTUI6CisjZW5kaWYKKyNpZmRlZiBYWl9ERUNfU1BBUkMKKwljYXNlIEJDSl9TUEFSQzoKKyNlbmRpZgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCS8qIFVuc3VwcG9ydGVkIEZpbHRlciBJRCAqLworCQlyZXR1cm4gWFpfT1BUSU9OU19FUlJPUjsKKwl9CisKKwlzLT50eXBlID0gaWQ7CisJcy0+cmV0ID0gWFpfT0s7CisJcy0+cG9zID0gMDsKKwlzLT54ODZfcHJldl9tYXNrID0gMDsKKwlzLT50ZW1wLmZpbHRlcmVkID0gMDsKKwlzLT50ZW1wLnNpemUgPSAwOworCisJcmV0dXJuIFhaX09LOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9kZWNfbHptYTIuYyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9kZWNfbHptYTIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTEyNTFmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6X2RlY19sem1hMi5jCkBAIC0wLDAgKzEsMTE3MSBAQAorLyoKKyAqIExaTUEyIGRlY29kZXIKKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpbmNsdWRlICJ4el9wcml2YXRlLmgiCisjaW5jbHVkZSAieHpfbHptYTIuaCIKKworLyoKKyAqIFJhbmdlIGRlY29kZXIgaW5pdGlhbGl6YXRpb24gZWF0cyB0aGUgZmlyc3QgZml2ZSBieXRlcyBvZiBlYWNoIExaTUEgY2h1bmsuCisgKi8KKyNkZWZpbmUgUkNfSU5JVF9CWVRFUyA1CisKKy8qCisgKiBNaW5pbXVtIG51bWJlciBvZiB1c2FibGUgaW5wdXQgYnVmZmVyIHRvIHNhZmVseSBkZWNvZGUgb25lIExaTUEgc3ltYm9sLgorICogVGhlIHdvcnN0IGNhc2UgaXMgdGhhdCB3ZSBkZWNvZGUgMjIgYml0cyB1c2luZyBwcm9iYWJpbGl0aWVzIGFuZCAyNgorICogZGlyZWN0IGJpdHMuIFRoaXMgbWF5IGRlY29kZSBhdCBtYXhpbXVtIG9mIDIwIGJ5dGVzIG9mIGlucHV0LiBIb3dldmVyLAorICogbHptYV9tYWluKCkgZG9lcyBhbiBleHRyYSBub3JtYWxpemF0aW9uIGJlZm9yZSByZXR1cm5pbmcsIHRodXMgd2UKKyAqIG5lZWQgdG8gcHV0IDIxIGhlcmUuCisgKi8KKyNkZWZpbmUgTFpNQV9JTl9SRVFVSVJFRCAyMQorCisvKgorICogRGljdGlvbmFyeSAoaGlzdG9yeSBidWZmZXIpCisgKgorICogVGhlc2UgYXJlIGFsd2F5cyB0cnVlOgorICogICAgc3RhcnQgPD0gcG9zIDw9IGZ1bGwgPD0gZW5kCisgKiAgICBwb3MgPD0gbGltaXQgPD0gZW5kCisgKgorICogSW4gbXVsdGktY2FsbCBtb2RlLCBhbHNvIHRoZXNlIGFyZSB0cnVlOgorICogICAgZW5kID09IHNpemUKKyAqICAgIHNpemUgPD0gc2l6ZV9tYXgKKyAqICAgIGFsbG9jYXRlZCA8PSBzaXplCisgKgorICogTW9zdCBvZiB0aGVzZSB2YXJpYWJsZXMgYXJlIHNpemVfdCB0byBzdXBwb3J0IHNpbmdsZS1jYWxsIG1vZGUsCisgKiBpbiB3aGljaCB0aGUgZGljdGlvbmFyeSB2YXJpYWJsZXMgYWRkcmVzcyB0aGUgYWN0dWFsIG91dHB1dAorICogYnVmZmVyIGRpcmVjdGx5LgorICovCitzdHJ1Y3QgZGljdGlvbmFyeSB7CisJLyogQmVnaW5uaW5nIG9mIHRoZSBoaXN0b3J5IGJ1ZmZlciAqLworCXVpbnQ4X3QgKmJ1ZjsKKworCS8qIE9sZCBwb3NpdGlvbiBpbiBidWYgKGJlZm9yZSBkZWNvZGluZyBtb3JlIGRhdGEpICovCisJc2l6ZV90IHN0YXJ0OworCisJLyogUG9zaXRpb24gaW4gYnVmICovCisJc2l6ZV90IHBvczsKKworCS8qCisJICogSG93IGZ1bGwgZGljdGlvbmFyeSBpcy4gVGhpcyBpcyB1c2VkIHRvIGRldGVjdCBjb3JydXB0IGlucHV0IHRoYXQKKwkgKiB3b3VsZCByZWFkIGJleW9uZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB1bmNvbXByZXNzZWQgc3RyZWFtLgorCSAqLworCXNpemVfdCBmdWxsOworCisJLyogV3JpdGUgbGltaXQ7IHdlIGRvbid0IHdyaXRlIHRvIGJ1ZltsaW1pdF0gb3IgbGF0ZXIgYnl0ZXMuICovCisJc2l6ZV90IGxpbWl0OworCisJLyoKKwkgKiBFbmQgb2YgdGhlIGRpY3Rpb25hcnkgYnVmZmVyLiBJbiBtdWx0aS1jYWxsIG1vZGUsIHRoaXMgaXMKKwkgKiB0aGUgc2FtZSBhcyB0aGUgZGljdGlvbmFyeSBzaXplLiBJbiBzaW5nbGUtY2FsbCBtb2RlLCB0aGlzCisJICogaW5kaWNhdGVzIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgorCSAqLworCXNpemVfdCBlbmQ7CisKKwkvKgorCSAqIFNpemUgb2YgdGhlIGRpY3Rpb25hcnkgYXMgc3BlY2lmaWVkIGluIEJsb2NrIEhlYWRlci4gVGhpcyBpcyB1c2VkCisJICogdG9nZXRoZXIgd2l0aCAiZnVsbCIgdG8gZGV0ZWN0IGNvcnJ1cHQgaW5wdXQgdGhhdCB3b3VsZCBtYWtlIHVzCisJICogcmVhZCBiZXlvbmQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdW5jb21wcmVzc2VkIHN0cmVhbS4KKwkgKi8KKwl1aW50MzJfdCBzaXplOworCisJLyoKKwkgKiBNYXhpbXVtIGFsbG93ZWQgZGljdGlvbmFyeSBzaXplIGluIG11bHRpLWNhbGwgbW9kZS4KKwkgKiBUaGlzIGlzIGlnbm9yZWQgaW4gc2luZ2xlLWNhbGwgbW9kZS4KKwkgKi8KKwl1aW50MzJfdCBzaXplX21heDsKKworCS8qCisJICogQW1vdW50IG9mIG1lbW9yeSBjdXJyZW50bHkgYWxsb2NhdGVkIGZvciB0aGUgZGljdGlvbmFyeS4KKwkgKiBUaGlzIGlzIHVzZWQgb25seSB3aXRoIFhaX0RZTkFMTE9DLiAoV2l0aCBYWl9QUkVBTExPQywKKwkgKiBzaXplX21heCBpcyBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIGFsbG9jYXRlZCBzaXplLikKKwkgKi8KKwl1aW50MzJfdCBhbGxvY2F0ZWQ7CisKKwkvKiBPcGVyYXRpb24gbW9kZSAqLworCWVudW0geHpfbW9kZSBtb2RlOworfTsKKworLyogUmFuZ2UgZGVjb2RlciAqLworc3RydWN0IHJjX2RlYyB7CisJdWludDMyX3QgcmFuZ2U7CisJdWludDMyX3QgY29kZTsKKworCS8qCisJICogTnVtYmVyIG9mIGluaXRpYWxpemluZyBieXRlcyByZW1haW5pbmcgdG8gYmUgcmVhZAorCSAqIGJ5IHJjX3JlYWRfaW5pdCgpLgorCSAqLworCXVpbnQzMl90IGluaXRfYnl0ZXNfbGVmdDsKKworCS8qCisJICogQnVmZmVyIGZyb20gd2hpY2ggd2UgcmVhZCBvdXIgaW5wdXQuIEl0IGNhbiBiZSBlaXRoZXIKKwkgKiB0ZW1wLmJ1ZiBvciB0aGUgY2FsbGVyLXByb3ZpZGVkIGlucHV0IGJ1ZmZlci4KKwkgKi8KKwljb25zdCB1aW50OF90ICppbjsKKwlzaXplX3QgaW5fcG9zOworCXNpemVfdCBpbl9saW1pdDsKK307CisKKy8qIFByb2JhYmlsaXRpZXMgZm9yIGEgbGVuZ3RoIGRlY29kZXIuICovCitzdHJ1Y3QgbHptYV9sZW5fZGVjIHsKKwkvKiBQcm9iYWJpbGl0eSBvZiBtYXRjaCBsZW5ndGggYmVpbmcgYXQgbGVhc3QgMTAgKi8KKwl1aW50MTZfdCBjaG9pY2U7CisKKwkvKiBQcm9iYWJpbGl0eSBvZiBtYXRjaCBsZW5ndGggYmVpbmcgYXQgbGVhc3QgMTggKi8KKwl1aW50MTZfdCBjaG9pY2UyOworCisJLyogUHJvYmFiaWxpdGllcyBmb3IgbWF0Y2ggbGVuZ3RocyAyLTkgKi8KKwl1aW50MTZfdCBsb3dbUE9TX1NUQVRFU19NQVhdW0xFTl9MT1dfU1lNQk9MU107CisKKwkvKiBQcm9iYWJpbGl0aWVzIGZvciBtYXRjaCBsZW5ndGhzIDEwLTE3ICovCisJdWludDE2X3QgbWlkW1BPU19TVEFURVNfTUFYXVtMRU5fTUlEX1NZTUJPTFNdOworCisJLyogUHJvYmFiaWxpdGllcyBmb3IgbWF0Y2ggbGVuZ3RocyAxOC0yNzMgKi8KKwl1aW50MTZfdCBoaWdoW0xFTl9ISUdIX1NZTUJPTFNdOworfTsKKworc3RydWN0IGx6bWFfZGVjIHsKKwkvKiBEaXN0YW5jZXMgb2YgbGF0ZXN0IGZvdXIgbWF0Y2hlcyAqLworCXVpbnQzMl90IHJlcDA7CisJdWludDMyX3QgcmVwMTsKKwl1aW50MzJfdCByZXAyOworCXVpbnQzMl90IHJlcDM7CisKKwkvKiBUeXBlcyBvZiB0aGUgbW9zdCByZWNlbnRseSBzZWVuIExaTUEgc3ltYm9scyAqLworCWVudW0gbHptYV9zdGF0ZSBzdGF0ZTsKKworCS8qCisJICogTGVuZ3RoIG9mIGEgbWF0Y2guIFRoaXMgaXMgdXBkYXRlZCBzbyB0aGF0IGRpY3RfcmVwZWF0IGNhbgorCSAqIGJlIGNhbGxlZCBhZ2FpbiB0byBmaW5pc2ggcmVwZWF0aW5nIHRoZSB3aG9sZSBtYXRjaC4KKwkgKi8KKwl1aW50MzJfdCBsZW47CisKKwkvKgorCSAqIExaTUEgcHJvcGVydGllcyBvciByZWxhdGVkIGJpdCBtYXNrcyAobnVtYmVyIG9mIGxpdGVyYWwKKwkgKiBjb250ZXh0IGJpdHMsIGEgbWFzayBkZXJ2aWVkIGZyb20gdGhlIG51bWJlciBvZiBsaXRlcmFsCisJICogcG9zaXRpb24gYml0cywgYW5kIGEgbWFzayBkZXJ2aWVkIGZyb20gdGhlIG51bWJlcgorCSAqIHBvc2l0aW9uIGJpdHMpCisJICovCisJdWludDMyX3QgbGM7CisJdWludDMyX3QgbGl0ZXJhbF9wb3NfbWFzazsgLyogKDEgPDwgbHApIC0gMSAqLworCXVpbnQzMl90IHBvc19tYXNrOyAgICAgICAgIC8qICgxIDw8IHBiKSAtIDEgKi8KKworCS8qIElmIDEsIGl0J3MgYSBtYXRjaC4gT3RoZXJ3aXNlIGl0J3MgYSBzaW5nbGUgOC1iaXQgbGl0ZXJhbC4gKi8KKwl1aW50MTZfdCBpc19tYXRjaFtTVEFURVNdW1BPU19TVEFURVNfTUFYXTsKKworCS8qIElmIDEsIGl0J3MgYSByZXBlYXRlZCBtYXRjaC4gVGhlIGRpc3RhbmNlIGlzIG9uZSBvZiByZXAwIC4uIHJlcDMuICovCisJdWludDE2X3QgaXNfcmVwW1NUQVRFU107CisKKwkvKgorCSAqIElmIDAsIGRpc3RhbmNlIG9mIGEgcmVwZWF0ZWQgbWF0Y2ggaXMgcmVwMC4KKwkgKiBPdGhlcndpc2UgY2hlY2sgaXNfcmVwMS4KKwkgKi8KKwl1aW50MTZfdCBpc19yZXAwW1NUQVRFU107CisKKwkvKgorCSAqIElmIDAsIGRpc3RhbmNlIG9mIGEgcmVwZWF0ZWQgbWF0Y2ggaXMgcmVwMS4KKwkgKiBPdGhlcndpc2UgY2hlY2sgaXNfcmVwMi4KKwkgKi8KKwl1aW50MTZfdCBpc19yZXAxW1NUQVRFU107CisKKwkvKiBJZiAwLCBkaXN0YW5jZSBvZiBhIHJlcGVhdGVkIG1hdGNoIGlzIHJlcDIuIE90aGVyd2lzZSBpdCBpcyByZXAzLiAqLworCXVpbnQxNl90IGlzX3JlcDJbU1RBVEVTXTsKKworCS8qCisJICogSWYgMSwgdGhlIHJlcGVhdGVkIG1hdGNoIGhhcyBsZW5ndGggb2Ygb25lIGJ5dGUuIE90aGVyd2lzZQorCSAqIHRoZSBsZW5ndGggaXMgZGVjb2RlZCBmcm9tIHJlcF9sZW5fZGVjb2Rlci4KKwkgKi8KKwl1aW50MTZfdCBpc19yZXAwX2xvbmdbU1RBVEVTXVtQT1NfU1RBVEVTX01BWF07CisKKwkvKgorCSAqIFByb2JhYmlsaXR5IHRyZWUgZm9yIHRoZSBoaWdoZXN0IHR3byBiaXRzIG9mIHRoZSBtYXRjaAorCSAqIGRpc3RhbmNlLiBUaGVyZSBpcyBhIHNlcGFyYXRlIHByb2JhYmlsaXR5IHRyZWUgZm9yIG1hdGNoCisJICogbGVuZ3RocyBvZiAyIChpLmUuIE1BVENIX0xFTl9NSU4pLCAzLCA0LCBhbmQgWzUsIDI3M10uCisJICovCisJdWludDE2X3QgZGlzdF9zbG90W0RJU1RfU1RBVEVTXVtESVNUX1NMT1RTXTsKKworCS8qCisJICogUHJvYmlsaXR5IHRyZWVzIGZvciBhZGRpdGlvbmFsIGJpdHMgZm9yIG1hdGNoIGRpc3RhbmNlCisJICogd2hlbiB0aGUgZGlzdGFuY2UgaXMgaW4gdGhlIHJhbmdlIFs0LCAxMjddLgorCSAqLworCXVpbnQxNl90IGRpc3Rfc3BlY2lhbFtGVUxMX0RJU1RBTkNFUyAtIERJU1RfTU9ERUxfRU5EXTsKKworCS8qCisJICogUHJvYmFiaWxpdHkgdHJlZSBmb3IgdGhlIGxvd2VzdCBmb3VyIGJpdHMgb2YgYSBtYXRjaAorCSAqIGRpc3RhbmNlIHRoYXQgaXMgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIDEyOC4KKwkgKi8KKwl1aW50MTZfdCBkaXN0X2FsaWduW0FMSUdOX1NJWkVdOworCisJLyogTGVuZ3RoIG9mIGEgbm9ybWFsIG1hdGNoICovCisJc3RydWN0IGx6bWFfbGVuX2RlYyBtYXRjaF9sZW5fZGVjOworCisJLyogTGVuZ3RoIG9mIGEgcmVwZWF0ZWQgbWF0Y2ggKi8KKwlzdHJ1Y3QgbHptYV9sZW5fZGVjIHJlcF9sZW5fZGVjOworCisJLyogUHJvYmFiaWxpdGllcyBvZiBsaXRlcmFscyAqLworCXVpbnQxNl90IGxpdGVyYWxbTElURVJBTF9DT0RFUlNfTUFYXVtMSVRFUkFMX0NPREVSX1NJWkVdOworfTsKKworc3RydWN0IGx6bWEyX2RlYyB7CisJLyogUG9zaXRpb24gaW4geHpfZGVjX2x6bWEyX3J1bigpLiAqLworCWVudW0gbHptYTJfc2VxIHsKKwkJU0VRX0NPTlRST0wsCisJCVNFUV9VTkNPTVBSRVNTRURfMSwKKwkJU0VRX1VOQ09NUFJFU1NFRF8yLAorCQlTRVFfQ09NUFJFU1NFRF8wLAorCQlTRVFfQ09NUFJFU1NFRF8xLAorCQlTRVFfUFJPUEVSVElFUywKKwkJU0VRX0xaTUFfUFJFUEFSRSwKKwkJU0VRX0xaTUFfUlVOLAorCQlTRVFfQ09QWQorCX0gc2VxdWVuY2U7CisKKwkvKiBOZXh0IHBvc2l0aW9uIGFmdGVyIGRlY29kaW5nIHRoZSBjb21wcmVzc2VkIHNpemUgb2YgdGhlIGNodW5rLiAqLworCWVudW0gbHptYTJfc2VxIG5leHRfc2VxdWVuY2U7CisKKwkvKiBVbmNvbXByZXNzZWQgc2l6ZSBvZiBMWk1BIGNodW5rICgyIE1pQiBhdCBtYXhpbXVtKSAqLworCXVpbnQzMl90IHVuY29tcHJlc3NlZDsKKworCS8qCisJICogQ29tcHJlc3NlZCBzaXplIG9mIExaTUEgY2h1bmsgb3IgY29tcHJlc3NlZC91bmNvbXByZXNzZWQKKwkgKiBzaXplIG9mIHVuY29tcHJlc3NlZCBjaHVuayAoNjQgS2lCIGF0IG1heGltdW0pCisJICovCisJdWludDMyX3QgY29tcHJlc3NlZDsKKworCS8qCisJICogVHJ1ZSBpZiBkaWN0aW9uYXJ5IHJlc2V0IGlzIG5lZWRlZC4gVGhpcyBpcyBmYWxzZSBiZWZvcmUKKwkgKiB0aGUgZmlyc3QgY2h1bmsgKExaTUEgb3IgdW5jb21wcmVzc2VkKS4KKwkgKi8KKwlib29sIG5lZWRfZGljdF9yZXNldDsKKworCS8qCisJICogVHJ1ZSBpZiBuZXcgTFpNQSBwcm9wZXJ0aWVzIGFyZSBuZWVkZWQuIFRoaXMgaXMgZmFsc2UKKwkgKiBiZWZvcmUgdGhlIGZpcnN0IExaTUEgY2h1bmsuCisJICovCisJYm9vbCBuZWVkX3Byb3BzOworfTsKKworc3RydWN0IHh6X2RlY19sem1hMiB7CisJLyoKKwkgKiBUaGUgb3JkZXIgYmVsb3cgaXMgaW1wb3J0YW50IG9uIHg4NiB0byByZWR1Y2UgY29kZSBzaXplIGFuZAorCSAqIGl0IHNob3VsZG4ndCBodXJ0IG9uIG90aGVyIHBsYXRmb3Jtcy4gRXZlcnl0aGluZyB1cCB0byBhbmQKKwkgKiBpbmNsdWRpbmcgbHptYS5wb3NfbWFzayBhcmUgaW4gdGhlIGZpcnN0IDEyOCBieXRlcyBvbiB4ODYtMzIsCisJICogd2hpY2ggYWxsb3dzIHVzaW5nIHNtYWxsZXIgaW5zdHJ1Y3Rpb25zIHRvIGFjY2VzcyB0aG9zZQorCSAqIHZhcmlhYmxlcy4gT24geDg2LTY0LCBmZXdlciB2YXJpYWJsZXMgZml0IGludG8gdGhlIGZpcnN0IDEyOAorCSAqIGJ5dGVzLCBidXQgdGhpcyBpcyBzdGlsbCB0aGUgYmVzdCBvcmRlciB3aXRob3V0IHNhY3JpZmljaW5nCisJICogdGhlIHJlYWRhYmlsaXR5IGJ5IHNwbGl0dGluZyB0aGUgc3RydWN0dXJlcy4KKwkgKi8KKwlzdHJ1Y3QgcmNfZGVjIHJjOworCXN0cnVjdCBkaWN0aW9uYXJ5IGRpY3Q7CisJc3RydWN0IGx6bWEyX2RlYyBsem1hMjsKKwlzdHJ1Y3QgbHptYV9kZWMgbHptYTsKKworCS8qCisJICogVGVtcG9yYXJ5IGJ1ZmZlciB3aGljaCBob2xkcyBzbWFsbCBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgYmV0d2VlbgorCSAqIGRlY29kZXIgY2FsbHMuIFNlZSBsem1hMl9sem1hKCkgZm9yIGRldGFpbHMuCisJICovCisJc3RydWN0IHsKKwkJdWludDMyX3Qgc2l6ZTsKKwkJdWludDhfdCBidWZbMyAqIExaTUFfSU5fUkVRVUlSRURdOworCX0gdGVtcDsKK307CisKKy8qKioqKioqKioqKioqKgorICogRGljdGlvbmFyeSAqCisgKioqKioqKioqKioqKiovCisKKy8qCisgKiBSZXNldCB0aGUgZGljdGlvbmFyeSBzdGF0ZS4gV2hlbiBpbiBzaW5nbGUtY2FsbCBtb2RlLCBzZXQgdXAgdGhlIGJlZ2lubmluZworICogb2YgdGhlIGRpY3Rpb25hcnkgdG8gcG9pbnQgdG8gdGhlIGFjdHVhbCBvdXRwdXQgYnVmZmVyLgorICovCitzdGF0aWMgdm9pZCBYWl9GVU5DIGRpY3RfcmVzZXQoc3RydWN0IGRpY3Rpb25hcnkgKmRpY3QsIHN0cnVjdCB4el9idWYgKmIpCit7CisJaWYgKERFQ19JU19TSU5HTEUoZGljdC0+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+cG9zOworCisJCWItPm91dF9wb3MgKz0gY29weV9zaXplOworCQliLT5pbl9wb3MgKz0gY29weV9zaXplOworCX0KK30KKworLyoKKyAqIEZsdXNoIHBlbmRpbmcgZGF0YSBmcm9tIGRpY3Rpb25hcnkgdG8gYi0+b3V0LiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlcmUgaXMKKyAqIGVub3VnaCBzcGFjZSBpbiBiLT5vdXQuIFRoaXMgaXMgZ3VhcmFudGVlZCBiZWNhdXNlIGNhbGxlciB1c2VzIGRpY3RfbGltaXQoKQorICogYmVmb3JlIGRlY29kaW5nIGRhdGEgaW50byB0aGUgZGljdGlvbmFyeS4KKyAqLworc3RhdGljIHVpbnQzMl90IFhaX0ZVTkMgZGljdF9mbHVzaChzdHJ1Y3QgZGljdGlvbmFyeSAqZGljdCwgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwlzaXplX3QgY29weV9zaXplID0gZGljdC0+cG9zIC0gZGljdC0+c3RhcnQ7CisKKwlpZiAoREVDX0lTX01VTFRJKGRpY3QtPm1vZGUpKSB7CisJCWlmIChkaWN0LT5wb3MgPT0gZGljdC0+ZW5kKQorCQkJZGljdC0+cG9zID0gMDsKKworCQltZW1jcHkoYi0+b3V0ICsgYi0+b3V0X3BvcywgZGljdC0+YnVmICsgZGljdC0+c3RhcnQsCisJCQkJY29weV9zaXplKTsKKwl9CisKKwlkaWN0LT5zdGFydCA9IGRpY3QtPnBvczsKKwliLT5vdXRfcG9zICs9IGNvcHlfc2l6ZTsKKwlyZXR1cm4gY29weV9zaXplOworfQorCisvKioqKioqKioqKioqKioqKioKKyAqIFJhbmdlIGRlY29kZXIgKgorICoqKioqKioqKioqKioqKioqLworCisvKiBSZXNldCB0aGUgcmFuZ2UgZGVjb2Rlci4gKi8KK3N0YXRpYyB2b2lkIFhaX0ZVTkMgcmNfcmVzZXQoc3RydWN0IHJjX2RlYyAqcmMpCit7CisJcmMtPnJhbmdlID0gKHVpbnQzMl90KS0xOworCXJjLT5jb2RlID0gMDsKKwlyYy0+aW5pdF9ieXRlc19sZWZ0ID0gUkNfSU5JVF9CWVRFUzsKK30KKworLyoKKyAqIFJlYWQgdGhlIGZpcnN0IGZpdmUgaW5pdGlhbCBieXRlcyBpbnRvIHJjLT5jb2RlIGlmIHRoZXkgaGF2ZW4ndCBiZWVuCisgKiByZWFkIGFscmVhZHkuIChZZXMsIHRoZSBmaXJzdCBieXRlIGdldHMgY29tcGxldGVseSBpZ25vcmVkLikKKyAqLworc3RhdGljIGJvb2wgWFpfRlVOQyByY19yZWFkX2luaXQoc3RydWN0IHJjX2RlYyAqcmMsIHN0cnVjdCB4el9idWYgKmIpCit7CisJd2hpbGUgKHJjLT5pbml0X2J5dGVzX2xlZnQgPiAwKSB7CisJCWlmIChiLT5pbl9wb3MgPT0gYi0+aW5fc2l6ZSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlyYy0+Y29kZSA9IChyYy0+Y29kZSA8PCA4KSArIGItPmluW2ItPmluX3BvcysrXTsKKwkJLS1yYy0+aW5pdF9ieXRlc19sZWZ0OworCX0KKworCXJldHVybiB0cnVlOworfQorCisvKiBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBtYXkgbm90IGJlIGVub3VnaCBpbnB1dCBmb3IgdGhlIG5leHQgZGVjb2RpbmcgbG9vcC4gKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBYWl9GVU5DIHJjX2xpbWl0X2V4Y2VlZGVkKGNvbnN0IHN0cnVjdCByY19kZWMgKnJjKQoreworCXJldHVybiByYy0+aW5fcG9zID4gcmMtPmluX2xpbWl0OworfQorCisvKgorICogUmV0dXJuIHRydWUgaWYgaXQgaXMgcG9zc2libGUgKGZyb20gcG9pbnQgb2YgdmlldyBvZiByYW5nZSBkZWNvZGVyKSB0aGF0CisgKiB3ZSBoYXZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgTFpNQSBjaHVuay4KKyAqLworc3RhdGljIGlubGluZSBib29sIFhaX0ZVTkMgcmNfaXNfZmluaXNoZWQoY29uc3Qgc3RydWN0IHJjX2RlYyAqcmMpCit7CisJcmV0dXJuIHJjLT5jb2RlID09IDA7Cit9CisKKy8qIFJlYWQgdGhlIG5leHQgaW5wdXQgYnl0ZSBpZiBuZWVkZWQuICovCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgWFpfRlVOQyByY19ub3JtYWxpemUoc3RydWN0IHJjX2RlYyAqcmMpCit7CisJaWYgKHJjLT5yYW5nZSA8IFJDX1RPUF9WQUxVRSkgeworCQlyYy0+cmFuZ2UgPDw9IFJDX1NISUZUX0JJVFM7CisJCXJjLT5jb2RlID0gKHJjLT5jb2RlIDw8IFJDX1NISUZUX0JJVFMpICsgcmMtPmluW3JjLT5pbl9wb3MrK107CisJfQorfQorCisvKgorICogRGVjb2RlIG9uZSBiaXQuIEluIHNvbWUgdmVyc2lvbnMsIHRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gc3BsaXR0ZWQgaW4gdGhyZWUKKyAqIGZ1bmN0aW9ucyBzbyB0aGF0IHRoZSBjb21waWxlciBpcyBzdXBwb3NlZCB0byBiZSBhYmxlIHRvIG1vcmUgZWFzaWx5IGF2b2lkCisgKiBhbiBleHRyYSBicmFuY2guIEluIHRoaXMgcGFydGljdWxhciB2ZXJzaW9uIG9mIHRoZSBMWk1BIGRlY29kZXIsIHRoaXMKKyAqIGRvZXNuJ3Qgc2VlbSB0byBiZSBhIGdvb2QgaWRlYSAodGVzdGVkIHdpdGggR0NDIDMuMy42LCAzLjQuNiwgYW5kIDQuMy4zCisgKiBvbiB4ODYpLiBVc2luZyBhIG5vbi1zcGxpdHRlZCB2ZXJzaW9uIHJlc3VsdHMgaW4gbmljZXIgbG9va2luZyBjb2RlIHRvby4KKyAqCisgKiBOT1RFOiBUaGlzIG11c3QgcmV0dXJuIGFuIGludC4gRG8gbm90IG1ha2UgaXQgcmV0dXJuIGEgYm9vbCBvciB0aGUgc3BlZWQKKyAqIG9mIHRoZSBjb2RlIGdlbmVyYXRlZCBieSBHQ0MgMy54IGRlY3JlYXNlcyAxMC0xNSAlLiAoR0NDIDQuMyBkb2Vzbid0IGNhcmUsCisgKiBhbmQgaXQgZ2VuZXJhdGVzIDEwLTIwICUgZmFzdGVyIGNvZGUgdGhhbiBHQ0MgMy54IGZyb20gdGhpcyBmaWxlIGFueXdheS4pCisgKi8KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgaW50IFhaX0ZVTkMgcmNfYml0KHN0cnVjdCByY19kZWMgKnJjLCB1aW50MTZfdCAqcHJvYikKK3sKKwl1aW50MzJfdCBib3VuZDsKKwlpbnQgYml0OworCisJcmNfbm9ybWFsaXplKHJjKTsKKwlib3VuZCA9IChyYy0+cmFuZ2UgPj4gUkNfQklUX01PREVMX1RPVEFMX0JJVFMpICogKnByb2I7CisJaWYgKHJjLT5jb2RlIDwgYm91bmQpIHsKKwkJcmMtPnJhbmdlID0gYm91bmQ7CisJCSpwcm9iICs9IChSQ19CSVRfTU9ERUxfVE9UQUwgLSAqcHJvYikgPj4gUkNfTU9WRV9CSVRTOworCQliaXQgPSAwOworCX0gZWxzZSB7CisJCXJjLT5yYW5nZSAtPSBib3VuZDsKKwkJcmMtPmNvZGUgLT0gYm91bmQ7CisJCSpwcm9iIC09ICpwcm9iID4+IFJDX01PVkVfQklUUzsKKwkJYml0ID0gMTsKKwl9CisKKwlyZXR1cm4gYml0OworfQorCisvKiBEZWNvZGUgYSBiaXR0cmVlIHN0YXJ0aW5nIGZyb20gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0LiAqLworc3RhdGljIF9fYWx3YXlzX2lubGluZSB1aW50MzJfdCBYWl9GVU5DIHJjX2JpdHRyZWUoCisJCXN0cnVjdCByY19kZWMgKnJjLCB1aW50MTZfdCAqcHJvYnMsIHVpbnQzMl90IGxpbWl0KQoreworCXVpbnQzMl90IHN5bWJvbCA9IDE7CisKKwlkbyB7CisJCWlmIChyY19iaXQocmMsICZwcm9ic1tzeW1ib2xdKSkKKwkJCXN5bWJvbCA9IChzeW1ib2wgPDwgMSkgKyAxOworCQllbHNlCisJCQlzeW1ib2wgPDw9IDE7CisJfSB3aGlsZSAoc3ltYm9sIDwgbGltaXQpOworCisJcmV0dXJuIHN5bWJvbDsKK30KKworLyogRGVjb2RlIGEgYml0dHJlZSBzdGFydGluZyBmcm9tIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQuICovCitzdGF0aWMgX19hbHdheXNfaW5saW5lIHZvaWQgWFpfRlVOQyByY19iaXR0cmVlX3JldmVyc2Uoc3RydWN0IHJjX2RlYyAqcmMsCisJCXVpbnQxNl90ICpwcm9icywgdWludDMyX3QgKmRlc3QsIHVpbnQzMl90IGxpbWl0KQoreworCXVpbnQzMl90IHN5bWJvbCA9IDE7CisJdWludDMyX3QgaSA9IDA7CisKKwlkbyB7CisJCWlmIChyY19iaXQocmMsICZwcm9ic1tzeW1ib2xdKSkgeworCQkJc3ltYm9sID0gKHN5bWJvbCA8PCAxKSArIDE7CisJCQkqZGVzdCArPSAxIDw8IGk7CisJCX0gZWxzZSB7CisJCQlzeW1ib2wgPDw9IDE7CisJCX0KKwl9IHdoaWxlICgrK2kgPCBsaW1pdCk7Cit9CisKKy8qIERlY29kZSBkaXJlY3QgYml0cyAoZml4ZWQgZmlmdHktZmlmdHkgcHJvYmFiaWxpdHkpICovCitzdGF0aWMgaW5saW5lIHZvaWQgWFpfRlVOQyByY19kaXJlY3QoCisJCXN0cnVjdCByY19kZWMgKnJjLCB1aW50MzJfdCAqZGVzdCwgdWludDMyX3QgbGltaXQpCit7CisJdWludDMyX3QgbWFzazsKKworCWRvIHsKKwkJcmNfbm9ybWFsaXplKHJjKTsKKwkJcmMtPnJhbmdlID4+PSAxOworCQlyYy0+Y29kZSAtPSByYy0+cmFuZ2U7CisJCW1hc2sgPSAodWludDMyX3QpMCAtIChyYy0+Y29kZSA+PiAzMSk7CisJCXJjLT5jb2RlICs9IHJjLT5yYW5nZSAmIG1hc2s7CisJCSpkZXN0ID0gKCpkZXN0IDw8IDEpICsgKG1hc2sgKyAxKTsKKwl9IHdoaWxlICgtLWxpbWl0ID4gMCk7Cit9CisKKy8qKioqKioqKgorICogTFpNQSAqCisgKioqKioqKiovCisKKy8qIEdldCBwb2ludGVyIHRvIGxpdGVyYWwgY29kZXIgcHJvYmFiaWxpdHkgYXJyYXkuICovCitzdGF0aWMgdWludDE2X3QgKiBYWl9GVU5DIGx6bWFfbGl0ZXJhbF9wcm9icyhzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzKQoreworCXVpbnQzMl90IHByZXZfYnl0ZSA9IGRpY3RfZ2V0KCZzLT5kaWN0LCAwKTsKKwl1aW50MzJfdCBsb3cgPSBwcmV2X2J5dGUgPj4gKDggLSBzLT5sem1hLmxjKTsKKwl1aW50MzJfdCBoaWdoID0gKHMtPmRpY3QucG9zICYgcy0+bHptYS5saXRlcmFsX3Bvc19tYXNrKSA8PCBzLT5sem1hLmxjOworCXJldHVybiBzLT5sem1hLmxpdGVyYWxbbG93ICsgaGlnaF07Cit9CisKKy8qIERlY29kZSBhIGxpdGVyYWwgKG9uZSA4LWJpdCBieXRlKSAqLworc3RhdGljIHZvaWQgWFpfRlVOQyBsem1hX2xpdGVyYWwoc3RydWN0IHh6X2RlY19sem1hMiAqcykKK3sKKwl1aW50MTZfdCAqcHJvYnM7CisJdWludDMyX3Qgc3ltYm9sOworCXVpbnQzMl90IG1hdGNoX2J5dGU7CisJdWludDMyX3QgbWF0Y2hfYml0OworCXVpbnQzMl90IG9mZnNldDsKKwl1aW50MzJfdCBpOworCisJcHJvYnMgPSBsem1hX2xpdGVyYWxfcHJvYnMocyk7CisKKwlpZiAobHptYV9zdGF0ZV9pc19saXRlcmFsKHMtPmx6bWEuc3RhdGUpKSB7CisJCXN5bWJvbCA9IHJjX2JpdHRyZWUoJnMtPnJjLCBwcm9icywgMHgxMDApOworCX0gZWxzZSB7CisJCXN5bWJvbCA9IDE7CisJCW1hdGNoX2J5dGUgPSBkaWN0X2dldCgmcy0+ZGljdCwgcy0+bHptYS5yZXAwKSA8PCAxOworCQlvZmZzZXQgPSAweDEwMDsKKworCQlkbyB7CisJCQltYXRjaF9iaXQgPSBtYXRjaF9ieXRlICYgb2Zmc2V0OworCQkJbWF0Y2hfYnl0ZSA8PD0gMTsKKwkJCWkgPSBvZmZzZXQgKyBtYXRjaF9iaXQgKyBzeW1ib2w7CisKKwkJCWlmIChyY19iaXQoJnMtPnJjLCAmcHJvYnNbaV0pKSB7CisJCQkJc3ltYm9sID0gKHN5bWJvbCA8PCAxKSArIDE7CisJCQkJb2Zmc2V0ICY9IG1hdGNoX2JpdDsKKwkJCX0gZWxzZSB7CisJCQkJc3ltYm9sIDw8PSAxOworCQkJCW9mZnNldCAmPSB+bWF0Y2hfYml0OworCQkJfQorCQl9IHdoaWxlIChzeW1ib2wgPCAweDEwMCk7CisJfQorCisJZGljdF9wdXQoJnMtPmRpY3QsICh1aW50OF90KXN5bWJvbCk7CisJbHptYV9zdGF0ZV9saXRlcmFsKCZzLT5sem1hLnN0YXRlKTsKK30KKworLyogRGVjb2RlIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGludG8gcy0+bHptYS5sZW4uICovCitzdGF0aWMgdm9pZCBYWl9GVU5DIGx6bWFfbGVuKHN0cnVjdCB4el9kZWNfbHptYTIgKnMsIHN0cnVjdCBsem1hX2xlbl9kZWMgKmwsCisJCXVpbnQzMl90IHBvc19zdGF0ZSkKK3sKKwl1aW50MTZfdCAqcHJvYnM7CisJdWludDMyX3QgbGltaXQ7CisKKwlpZiAoIXJjX2JpdCgmcy0+cmMsICZsLT5jaG9pY2UpKSB7CisJCXByb2JzID0gbC0+bG93W3Bvc19zdGF0ZV07CisJCWxpbWl0ID0gTEVOX0xPV19TWU1CT0xTOworCQlzLT5sem1hLmxlbiA9IE1BVENIX0xFTl9NSU47CisJfSBlbHNlIHsKKwkJaWYgKCFyY19iaXQoJnMtPnJjLCAmbC0+Y2hvaWNlMikpIHsKKwkJCXByb2JzID0gbC0+bWlkW3Bvc19zdGF0ZV07CisJCQlsaW1pdCA9IExFTl9NSURfU1lNQk9MUzsKKwkJCXMtPmx6bWEubGVuID0gTUFUQ0hfTEVOX01JTiArIExFTl9MT1dfU1lNQk9MUzsKKwkJfSBlbHNlIHsKKwkJCXByb2JzID0gbC0+aGlnaDsKKwkJCWxpbWl0ID0gTEVOX0hJR0hfU1lNQk9MUzsKKwkJCXMtPmx6bWEubGVuID0gTUFUQ0hfTEVOX01JTiArIExFTl9MT1dfU1lNQk9MUworCQkJCQkrIExFTl9NSURfU1lNQk9MUzsKKwkJfQorCX0KKworCXMtPmx6bWEubGVuICs9IHJjX2JpdHRyZWUoJnMtPnJjLCBwcm9icywgbGltaXQpIC0gbGltaXQ7Cit9CisKKy8qIERlY29kZSBhIG1hdGNoLiBUaGUgZGlzdGFuY2Ugd2lsbCBiZSBzdG9yZWQgaW4gcy0+bHptYS5yZXAwLiAqLworc3RhdGljIHZvaWQgWFpfRlVOQyBsem1hX21hdGNoKHN0cnVjdCB4el9kZWNfbHptYTIgKnMsIHVpbnQzMl90IHBvc19zdGF0ZSkKK3sKKwl1aW50MTZfdCAqcHJvYnM7CisJdWludDMyX3QgZGlzdF9zbG90OworCXVpbnQzMl90IGxpbWl0OworCisJbHptYV9zdGF0ZV9tYXRjaCgmcy0+bHptYS5zdGF0ZSk7CisKKwlzLT5sem1hLnJlcDMgPSBzLT5sem1hLnJlcDI7CisJcy0+bHptYS5yZXAyID0gcy0+bHptYS5yZXAxOworCXMtPmx6bWEucmVwMSA9IHMtPmx6bWEucmVwMDsKKworCWx6bWFfbGVuKHMsICZzLT5sem1hLm1hdGNoX2xlbl9kZWMsIHBvc19zdGF0ZSk7CisKKwlwcm9icyA9IHMtPmx6bWEuZGlzdF9zbG90W2x6bWFfZ2V0X2Rpc3Rfc3RhdGUocy0+bHptYS5sZW4pXTsKKwlkaXN0X3Nsb3QgPSByY19iaXR0cmVlKCZzLT5yYywgcHJvYnMsIERJU1RfU0xPVFMpIC0gRElTVF9TTE9UUzsKKworCWlmIChkaXN0X3Nsb3QgPCBESVNUX01PREVMX1NUQVJUKSB7CisJCXMtPmx6bWEucmVwMCA9IGRpc3Rfc2xvdDsKKwl9IGVsc2UgeworCQlsaW1pdCA9IChkaXN0X3Nsb3QgPj4gMSkgLSAxOworCQlzLT5sem1hLnJlcDAgPSAyICsgKGRpc3Rfc2xvdCAmIDEpOworCisJCWlmIChkaXN0X3Nsb3QgPCBESVNUX01PREVMX0VORCkgeworCQkJcy0+bHptYS5yZXAwIDw8PSBsaW1pdDsKKwkJCXByb2JzID0gcy0+bHptYS5kaXN0X3NwZWNpYWwgKyBzLT5sem1hLnJlcDAKKwkJCQkJLSBkaXN0X3Nsb3QgLSAxOworCQkJcmNfYml0dHJlZV9yZXZlcnNlKCZzLT5yYywgcHJvYnMsCisJCQkJCSZzLT5sem1hLnJlcDAsIGxpbWl0KTsKKwkJfSBlbHNlIHsKKwkJCXJjX2RpcmVjdCgmcy0+cmMsICZzLT5sem1hLnJlcDAsIGxpbWl0IC0gQUxJR05fQklUUyk7CisJCQlzLT5sem1hLnJlcDAgPDw9IEFMSUdOX0JJVFM7CisJCQlyY19iaXR0cmVlX3JldmVyc2UoJnMtPnJjLCBzLT5sem1hLmRpc3RfYWxpZ24sCisJCQkJCSZzLT5sem1hLnJlcDAsIEFMSUdOX0JJVFMpOworCQl9CisJfQorfQorCisvKgorICogRGVjb2RlIGEgcmVwZWF0ZWQgbWF0Y2guIFRoZSBkaXN0YW5jZSBpcyBvbmUgb2YgdGhlIGZvdXIgbW9zdCByZWNlbnRseQorICogc2VlbiBtYXRjaGVzLiBUaGUgZGlzdGFuY2Ugd2lsbCBiZSBzdG9yZWQgaW4gcy0+bHptYS5yZXAwLgorICovCitzdGF0aWMgdm9pZCBYWl9GVU5DIGx6bWFfcmVwX21hdGNoKHN0cnVjdCB4el9kZWNfbHptYTIgKnMsIHVpbnQzMl90IHBvc19zdGF0ZSkKK3sKKwl1aW50MzJfdCB0bXA7CisKKwlpZiAoIXJjX2JpdCgmcy0+cmMsICZzLT5sem1hLmlzX3JlcDBbcy0+bHptYS5zdGF0ZV0pKSB7CisJCWlmICghcmNfYml0KCZzLT5yYywgJnMtPmx6bWEuaXNfcmVwMF9sb25nWworCQkJCXMtPmx6bWEuc3RhdGVdW3Bvc19zdGF0ZV0pKSB7CisJCQlsem1hX3N0YXRlX3Nob3J0X3JlcCgmcy0+bHptYS5zdGF0ZSk7CisJCQlzLT5sem1hLmxlbiA9IDE7CisJCQlyZXR1cm47CisJCX0KKwl9IGVsc2UgeworCQlpZiAoIXJjX2JpdCgmcy0+cmMsICZzLT5sem1hLmlzX3JlcDFbcy0+bHptYS5zdGF0ZV0pKSB7CisJCQl0bXAgPSBzLT5sem1hLnJlcDE7CisJCX0gZWxzZSB7CisJCQlpZiAoIXJjX2JpdCgmcy0+cmMsICZzLT5sem1hLmlzX3JlcDJbcy0+bHptYS5zdGF0ZV0pKSB7CisJCQkJdG1wID0gcy0+bHptYS5yZXAyOworCQkJfSBlbHNlIHsKKwkJCQl0bXAgPSBzLT5sem1hLnJlcDM7CisJCQkJcy0+bHptYS5yZXAzID0gcy0+bHptYS5yZXAyOworCQkJfQorCisJCQlzLT5sem1hLnJlcDIgPSBzLT5sem1hLnJlcDE7CisJCX0KKworCQlzLT5sem1hLnJlcDEgPSBzLT5sem1hLnJlcDA7CisJCXMtPmx6bWEucmVwMCA9IHRtcDsKKwl9CisKKwlsem1hX3N0YXRlX2xvbmdfcmVwKCZzLT5sem1hLnN0YXRlKTsKKwlsem1hX2xlbihzLCAmcy0+bHptYS5yZXBfbGVuX2RlYywgcG9zX3N0YXRlKTsKK30KKworLyogTFpNQSBkZWNvZGVyIGNvcmUgKi8KK3N0YXRpYyBib29sIFhaX0ZVTkMgbHptYV9tYWluKHN0cnVjdCB4el9kZWNfbHptYTIgKnMpCit7CisJdWludDMyX3QgcG9zX3N0YXRlOworCisJLyoKKwkgKiBJZiB0aGUgZGljdGlvbmFyeSB3YXMgcmVhY2hlZCBkdXJpbmcgdGhlIHByZXZpb3VzIGNhbGwsIHRyeSB0bworCSAqIGZpbmlzaCB0aGUgcG9zc2libHkgcGVuZGluZyByZXBlYXQgaW4gdGhlIGRpY3Rpb25hcnkuCisJICovCisJaWYgKGRpY3RfaGFzX3NwYWNlKCZzLT5kaWN0KSAmJiBzLT5sem1hLmxlbiA+IDApCisJCWRpY3RfcmVwZWF0KCZzLT5kaWN0LCAmcy0+bHptYS5sZW4sIHMtPmx6bWEucmVwMCk7CisKKwkvKgorCSAqIERlY29kZSBtb3JlIExaTUEgc3ltYm9scy4gT25lIGl0ZXJhdGlvbiBtYXkgY29uc3VtZSB1cCB0bworCSAqIExaTUFfSU5fUkVRVUlSRUQgLSAxIGJ5dGVzLgorCSAqLworCXdoaWxlIChkaWN0X2hhc19zcGFjZSgmcy0+ZGljdCkgJiYgIXJjX2xpbWl0X2V4Y2VlZGVkKCZzLT5yYykpIHsKKwkJcG9zX3N0YXRlID0gcy0+ZGljdC5wb3MgJiBzLT5sem1hLnBvc19tYXNrOworCisJCWlmICghcmNfYml0KCZzLT5yYywgJnMtPmx6bWEuaXNfbWF0Y2hbCisJCQkJcy0+bHptYS5zdGF0ZV1bcG9zX3N0YXRlXSkpIHsKKwkJCWx6bWFfbGl0ZXJhbChzKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChyY19iaXQoJnMtPnJjLCAmcy0+bHptYS5pc19yZXBbcy0+bHptYS5zdGF0ZV0pKQorCQkJCWx6bWFfcmVwX21hdGNoKHMsIHBvc19zdGF0ZSk7CisJCQllbHNlCisJCQkJbHptYV9tYXRjaChzLCBwb3Nfc3RhdGUpOworCisJCQlpZiAoIWRpY3RfcmVwZWF0KCZzLT5kaWN0LCAmcy0+bHptYS5sZW4sIHMtPmx6bWEucmVwMCkpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJLyoKKwkgKiBIYXZpbmcgdGhlIHJhbmdlIGRlY29kZXIgYWx3YXlzIG5vcm1hbGl6ZWQgd2hlbiB3ZSBhcmUgb3V0c2lkZQorCSAqIHRoaXMgZnVuY3Rpb24gbWFrZXMgaXQgZWFzaWVyIHRvIGNvcnJlY3RseSBoYW5kbGUgZW5kIG9mIHRoZSBjaHVuay4KKwkgKi8KKwlyY19ub3JtYWxpemUoJnMtPnJjKTsKKworCXJldHVybiB0cnVlOworfQorCisvKgorICogUmVzZXQgdGhlIExaTUEgZGVjb2RlciBhbmQgcmFuZ2UgZGVjb2RlciBzdGF0ZS4gRGljdGlvbmFyeSBpcyBub3JlIHJlc2V0CisgKiBoZXJlLCBiZWNhdXNlIExaTUEgc3RhdGUgbWF5IGJlIHJlc2V0IHdpdGhvdXQgcmVzZXR0aW5nIHRoZSBkaWN0aW9uYXJ5LgorICovCitzdGF0aWMgdm9pZCBYWl9GVU5DIGx6bWFfcmVzZXQoc3RydWN0IHh6X2RlY19sem1hMiAqcykKK3sKKwl1aW50MTZfdCAqcHJvYnM7CisJc2l6ZV90IGk7CisKKwlzLT5sem1hLnN0YXRlID0gU1RBVEVfTElUX0xJVDsKKwlzLT5sem1hLnJlcDAgPSAwOworCXMtPmx6bWEucmVwMSA9IDA7CisJcy0+bHptYS5yZXAyID0gMDsKKwlzLT5sem1hLnJlcDMgPSAwOworCisJLyoKKwkgKiBBbGwgcHJvYmFiaWxpdGllcyBhcmUgaW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWUuIFRoaXMgaGFjaworCSAqIG1ha2VzIHRoZSBjb2RlIHNtYWxsZXIgYnkgYXZvaWRpbmcgYSBzZXBhcmF0ZSBsb29wIGZvciBlYWNoCisJICogcHJvYmFiaWxpdHkgYXJyYXkuCisJICoKKwkgKiBUaGlzIGNvdWxkIGJlIG9wdGltaXplZCBzbyB0aGF0IG9ubHkgdGhhdCBwYXJ0IG9mIGxpdGVyYWwKKwkgKiBwcm9iYWJpbGl0aWVzIHRoYXQgYXJlIGFjdHVhbGx5IHJlcXVpcmVkLiBJbiB0aGUgY29tbW9uIGNhc2UKKwkgKiB3ZSB3b3VsZCB3cml0ZSAxMiBLaUIgbGVzcy4KKwkgKi8KKwlwcm9icyA9IHMtPmx6bWEuaXNfbWF0Y2hbMF07CisJZm9yIChpID0gMDsgaSA8IFBST0JTX1RPVEFMOyArK2kpCisJCXByb2JzW2ldID0gUkNfQklUX01PREVMX1RPVEFMIC8gMjsKKworCXJjX3Jlc2V0KCZzLT5yYyk7Cit9CisKKy8qCisgKiBEZWNvZGUgYW5kIHZhbGlkYXRlIExaTUEgcHJvcGVydGllcyAobGMvbHAvcGIpIGFuZCBjYWxjdWxhdGUgdGhlIGJpdCBtYXNrcworICogZnJvbSB0aGUgZGVjb2RlZCBscCBhbmQgcGIgdmFsdWVzLiBPbiBzdWNjZXNzLCB0aGUgTFpNQSBkZWNvZGVyIHN0YXRlIGlzCisgKiByZXNldCBhbmQgdHJ1ZSBpcyByZXR1cm5lZC4KKyAqLworc3RhdGljIGJvb2wgWFpfRlVOQyBsem1hX3Byb3BzKHN0cnVjdCB4el9kZWNfbHptYTIgKnMsIHVpbnQ4X3QgcHJvcHMpCit7CisJaWYgKHByb3BzID4gKDQgKiA1ICsgNCkgKiA5ICsgOCkKKwkJcmV0dXJuIGZhbHNlOworCisJcy0+bHptYS5wb3NfbWFzayA9IDA7CisJd2hpbGUgKHByb3BzID49IDkgKiA1KSB7CisJCXByb3BzIC09IDkgKiA1OworCQkrK3MtPmx6bWEucG9zX21hc2s7CisJfQorCisJcy0+bHptYS5wb3NfbWFzayA9ICgxIDw8IHMtPmx6bWEucG9zX21hc2spIC0gMTsKKworCXMtPmx6bWEubGl0ZXJhbF9wb3NfbWFzayA9IDA7CisJd2hpbGUgKHByb3BzID49IDkpIHsKKwkJcHJvcHMgLT0gOTsKKwkJKytzLT5sem1hLmxpdGVyYWxfcG9zX21hc2s7CisJfQorCisJcy0+bHptYS5sYyA9IHByb3BzOworCisJaWYgKHMtPmx6bWEubGMgKyBzLT5sem1hLmxpdGVyYWxfcG9zX21hc2sgPiA0KQorCQlyZXR1cm4gZmFsc2U7CisKKwlzLT5sem1hLmxpdGVyYWxfcG9zX21hc2sgPSAoMSA8PCBzLT5sem1hLmxpdGVyYWxfcG9zX21hc2spIC0gMTsKKworCWx6bWFfcmVzZXQocyk7CisKKwlyZXR1cm4gdHJ1ZTsKK30KKworLyoqKioqKioqKgorICogTFpNQTIgKgorICoqKioqKioqKi8KKworLyoKKyAqIFRoZSBMWk1BIGRlY29kZXIgYXNzdW1lcyB0aGF0IGlmIHRoZSBpbnB1dCBsaW1pdCAocy0+cmMuaW5fbGltaXQpIGhhc24ndAorICogYmVlbiBleGNlZWRlZCwgaXQgaXMgc2FmZSB0byByZWFkIHVwIHRvIExaTUFfSU5fUkVRVUlSRUQgYnl0ZXMuIFRoaXMKKyAqIHdyYXBwZXIgZnVuY3Rpb24gdGFrZXMgY2FyZSBvZiBtYWtpbmcgdGhlIExaTUEgZGVjb2RlcidzIGFzc3VtcHRpb24gc2FmZS4KKyAqCisgKiBBcyBsb25nIGFzIHRoZXJlIGlzIHBsZW50eSBvZiBpbnB1dCBsZWZ0IHRvIGJlIGRlY29kZWQgaW4gdGhlIGN1cnJlbnQgTFpNQQorICogY2h1bmssIHdlIGRlY29kZSBkaXJlY3RseSBmcm9tIHRoZSBjYWxsZXItc3VwcGxpZWQgaW5wdXQgYnVmZmVyIHVudGlsCisgKiB0aGVyZSdzIExaTUFfSU5fUkVRVUlSRUQgYnl0ZXMgbGVmdC4gVGhvc2UgcmVtYWluaW5nIGJ5dGVzIGFyZSBjb3BpZWQgaW50bworICogcy0+dGVtcC5idWYsIHdoaWNoIChob3BlZnVsbHkpIGdldHMgZmlsbGVkIG9uIHRoZSBuZXh0IGNhbGwgdG8gdGhpcworICogZnVuY3Rpb24uIFdlIGRlY29kZSBhIGZldyBieXRlcyBmcm9tIHRoZSB0ZW1wb3JhcnkgYnVmZmVyIHNvIHRoYXQgd2UgY2FuCisgKiBjb250aW51ZSBkZWNvZGluZyBmcm9tIHRoZSBjYWxsZXItc3VwcGxpZWQgaW5wdXQgYnVmZmVyIGFnYWluLgorICovCitzdGF0aWMgYm9vbCBYWl9GVU5DIGx6bWEyX2x6bWEoc3RydWN0IHh6X2RlY19sem1hMiAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwlzaXplX3QgaW5fYXZhaWw7CisJdWludDMyX3QgdG1wOworCisJaW5fYXZhaWwgPSBiLT5pbl9zaXplIC0gYi0+aW5fcG9zOworCWlmIChzLT50ZW1wLnNpemUgPiAwIHx8IHMtPmx6bWEyLmNvbXByZXNzZWQgPT0gMCkgeworCQl0bXAgPSAyICogTFpNQV9JTl9SRVFVSVJFRCAtIHMtPnRlbXAuc2l6ZTsKKwkJaWYgKHRtcCA+IHMtPmx6bWEyLmNvbXByZXNzZWQgLSBzLT50ZW1wLnNpemUpCisJCQl0bXAgPSBzLT5sem1hMi5jb21wcmVzc2VkIC0gcy0+dGVtcC5zaXplOworCQlpZiAodG1wID4gaW5fYXZhaWwpCisJCQl0bXAgPSBpbl9hdmFpbDsKKworCQltZW1jcHkocy0+dGVtcC5idWYgKyBzLT50ZW1wLnNpemUsIGItPmluICsgYi0+aW5fcG9zLCB0bXApOworCisJCWlmIChzLT50ZW1wLnNpemUgKyB0bXAgPT0gcy0+bHptYTIuY29tcHJlc3NlZCkgeworCQkJbWVtemVybyhzLT50ZW1wLmJ1ZiArIHMtPnRlbXAuc2l6ZSArIHRtcCwKKwkJCQkJc2l6ZW9mKHMtPnRlbXAuYnVmKQorCQkJCQkJLSBzLT50ZW1wLnNpemUgLSB0bXApOworCQkJcy0+cmMuaW5fbGltaXQgPSBzLT50ZW1wLnNpemUgKyB0bXA7CisJCX0gZWxzZSBpZiAocy0+dGVtcC5zaXplICsgdG1wIDwgTFpNQV9JTl9SRVFVSVJFRCkgeworCQkJcy0+dGVtcC5zaXplICs9IHRtcDsKKwkJCWItPmluX3BvcyArPSB0bXA7CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfSBlbHNlIHsKKwkJCXMtPnJjLmluX2xpbWl0ID0gcy0+dGVtcC5zaXplICsgdG1wIC0gTFpNQV9JTl9SRVFVSVJFRDsKKwkJfQorCisJCXMtPnJjLmluID0gcy0+dGVtcC5idWY7CisJCXMtPnJjLmluX3BvcyA9IDA7CisKKwkJaWYgKCFsem1hX21haW4ocykgfHwgcy0+cmMuaW5fcG9zID4gcy0+dGVtcC5zaXplICsgdG1wKQorCQkJcmV0dXJuIGZhbHNlOworCisJCXMtPmx6bWEyLmNvbXByZXNzZWQgLT0gcy0+cmMuaW5fcG9zOworCisJCWlmIChzLT5yYy5pbl9wb3MgPCBzLT50ZW1wLnNpemUpIHsKKwkJCXMtPnRlbXAuc2l6ZSAtPSBzLT5yYy5pbl9wb3M7CisJCQltZW1tb3ZlKHMtPnRlbXAuYnVmLCBzLT50ZW1wLmJ1ZiArIHMtPnJjLmluX3BvcywKKwkJCQkJcy0+dGVtcC5zaXplKTsKKwkJCXJldHVybiB0cnVlOworCQl9CisKKwkJYi0+aW5fcG9zICs9IHMtPnJjLmluX3BvcyAtIHMtPnRlbXAuc2l6ZTsKKwkJcy0+dGVtcC5zaXplID0gMDsKKwl9CisKKwlpbl9hdmFpbCA9IGItPmluX3NpemUgLSBiLT5pbl9wb3M7CisJaWYgKGluX2F2YWlsID49IExaTUFfSU5fUkVRVUlSRUQpIHsKKwkJcy0+cmMuaW4gPSBiLT5pbjsKKwkJcy0+cmMuaW5fcG9zID0gYi0+aW5fcG9zOworCisJCWlmIChpbl9hdmFpbCA+PSBzLT5sem1hMi5jb21wcmVzc2VkICsgTFpNQV9JTl9SRVFVSVJFRCkKKwkJCXMtPnJjLmluX2xpbWl0ID0gYi0+aW5fcG9zICsgcy0+bHptYTIuY29tcHJlc3NlZDsKKwkJZWxzZQorCQkJcy0+cmMuaW5fbGltaXQgPSBiLT5pbl9zaXplIC0gTFpNQV9JTl9SRVFVSVJFRDsKKworCQlpZiAoIWx6bWFfbWFpbihzKSkKKwkJCXJldHVybiBmYWxzZTsKKworCQlpbl9hdmFpbCA9IHMtPnJjLmluX3BvcyAtIGItPmluX3BvczsKKwkJaWYgKGluX2F2YWlsID4gcy0+bHptYTIuY29tcHJlc3NlZCkKKwkJCXJldHVybiBmYWxzZTsKKworCQlzLT5sem1hMi5jb21wcmVzc2VkIC09IGluX2F2YWlsOworCQliLT5pbl9wb3MgPSBzLT5yYy5pbl9wb3M7CisJfQorCisJaW5fYXZhaWwgPSBiLT5pbl9zaXplIC0gYi0+aW5fcG9zOworCWlmIChpbl9hdmFpbCA8IExaTUFfSU5fUkVRVUlSRUQpIHsKKwkJaWYgKGluX2F2YWlsID4gcy0+bHptYTIuY29tcHJlc3NlZCkKKwkJCWluX2F2YWlsID0gcy0+bHptYTIuY29tcHJlc3NlZDsKKworCQltZW1jcHkocy0+dGVtcC5idWYsIGItPmluICsgYi0+aW5fcG9zLCBpbl9hdmFpbCk7CisJCXMtPnRlbXAuc2l6ZSA9IGluX2F2YWlsOworCQliLT5pbl9wb3MgKz0gaW5fYXZhaWw7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKKy8qCisgKiBUYWtlIGNhcmUgb2YgdGhlIExaTUEyIGNvbnRyb2wgbGF5ZXIsIGFuZCBmb3J3YXJkIHRoZSBqb2Igb2YgYWN0dWFsIExaTUEKKyAqIGRlY29kaW5nIG9yIGNvcHlpbmcgb2YgdW5jb21wcmVzc2VkIGNodW5rcyB0byBvdGhlciBmdW5jdGlvbnMuCisgKi8KK1haX0VYVEVSTiBOT0lOTElORSBlbnVtIHh6X3JldCBYWl9GVU5DIHh6X2RlY19sem1hMl9ydW4oCisJCXN0cnVjdCB4el9kZWNfbHptYTIgKnMsIHN0cnVjdCB4el9idWYgKmIpCit7CisJdWludDMyX3QgdG1wOworCisJd2hpbGUgKGItPmluX3BvcyA8IGItPmluX3NpemUgfHwgcy0+bHptYTIuc2VxdWVuY2UgPT0gU0VRX0xaTUFfUlVOKSB7CisJCXN3aXRjaCAocy0+bHptYTIuc2VxdWVuY2UpIHsKKwkJY2FzZSBTRVFfQ09OVFJPTDoKKwkJCS8qCisJCQkgKiBMWk1BMiBjb250cm9sIGJ5dGUKKwkJCSAqCisJCQkgKiBFeGFjdCB2YWx1ZXM6CisJCQkgKiAgIDB4MDAgICBFbmQgbWFya2VyCisJCQkgKiAgIDB4MDEgICBEaWN0aW9uYXJ5IHJlc2V0IGZvbGxvd2VkIGJ5CisJCQkgKiAgICAgICAgICBhbiB1bmNvbXByZXNzZWQgY2h1bmsKKwkJCSAqICAgMHgwMiAgIFVuY29tcHJlc3NlZCBjaHVuayAobm8gZGljdGlvbmFyeSByZXNldCkKKwkJCSAqCisJCQkgKiBIaWdoZXN0IHRocmVlIGJpdHMgKHMtPmNvbnRyb2wgJiAweEUwKToKKwkJCSAqICAgMHhFMCAgIERpY3Rpb25hcnkgcmVzZXQsIG5ldyBwcm9wZXJ0aWVzIGFuZCBzdGF0ZQorCQkJICogICAgICAgICAgcmVzZXQsIGZvbGxvd2VkIGJ5IExaTUEgY29tcHJlc3NlZCBjaHVuaworCQkJICogICAweEMwICAgTmV3IHByb3BlcnRpZXMgYW5kIHN0YXRlIHJlc2V0LCBmb2xsb3dlZAorCQkJICogICAgICAgICAgYnkgTFpNQSBjb21wcmVzc2VkIGNodW5rIChubyBkaWN0aW9uYXJ5CisJCQkgKiAgICAgICAgICByZXNldCkKKwkJCSAqICAgMHhBMCAgIFN0YXRlIHJlc2V0IHVzaW5nIG9sZCBwcm9wZXJ0aWVzLAorCQkJICogICAgICAgICAgZm9sbG93ZWQgYnkgTFpNQSBjb21wcmVzc2VkIGNodW5rIChubworCQkJICogICAgICAgICAgZGljdGlvbmFyeSByZXNldCkKKwkJCSAqICAgMHg4MCAgIExaTUEgY2h1bmsgKG5vIGRpY3Rpb25hcnkgb3Igc3RhdGUgcmVzZXQpCisJCQkgKgorCQkJICogRm9yIExaTUEgY29tcHJlc3NlZCBjaHVua3MsIHRoZSBsb3dlc3QgZml2ZSBiaXRzCisJCQkgKiAocy0+Y29udHJvbCAmIDFGKSBhcmUgdGhlIGhpZ2hlc3QgYml0cyBvZiB0aGUKKwkJCSAqIHVuY29tcHJlc3NlZCBzaXplIChiaXRzIDE2LTIwKS4KKwkJCSAqCisJCQkgKiBBIG5ldyBMWk1BMiBzdHJlYW0gbXVzdCBiZWdpbiB3aXRoIGEgZGljdGlvbmFyeQorCQkJICogcmVzZXQuIFRoZSBmaXJzdCBMWk1BIGNodW5rIG11c3Qgc2V0IG5ldworCQkJICogcHJvcGVydGllcyBhbmQgcmVzZXQgdGhlIExaTUEgc3RhdGUuCisJCQkgKgorCQkJICogVmFsdWVzIHRoYXQgZG9uJ3QgbWF0Y2ggYW55dGhpbmcgZGVzY3JpYmVkIGFib3ZlCisJCQkgKiBhcmUgaW52YWxpZCBhbmQgd2UgcmV0dXJuIFhaX0RBVEFfRVJST1IuCisJCQkgKi8KKwkJCXRtcCA9IGItPmluW2ItPmluX3BvcysrXTsKKworCQkJaWYgKHRtcCA9PSAweDAwKQorCQkJCXJldHVybiBYWl9TVFJFQU1fRU5EOworCisJCQlpZiAodG1wID49IDB4RTAgfHwgdG1wID09IDB4MDEpIHsKKwkJCQlzLT5sem1hMi5uZWVkX3Byb3BzID0gdHJ1ZTsKKwkJCQlzLT5sem1hMi5uZWVkX2RpY3RfcmVzZXQgPSBmYWxzZTsKKwkJCQlkaWN0X3Jlc2V0KCZzLT5kaWN0LCBiKTsKKwkJCX0gZWxzZSBpZiAocy0+bHptYTIubmVlZF9kaWN0X3Jlc2V0KSB7CisJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisJCQl9CisKKwkJCWlmICh0bXAgPj0gMHg4MCkgeworCQkJCXMtPmx6bWEyLnVuY29tcHJlc3NlZCA9ICh0bXAgJiAweDFGKSA8PCAxNjsKKwkJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9VTkNPTVBSRVNTRURfMTsKKworCQkJCWlmICh0bXAgPj0gMHhDMCkgeworCQkJCQkvKgorCQkJCQkgKiBXaGVuIHRoZXJlIGFyZSBuZXcgcHJvcGVydGllcywKKwkJCQkJICogc3RhdGUgcmVzZXQgaXMgZG9uZSBhdAorCQkJCQkgKiBTRVFfUFJPUEVSVElFUy4KKwkJCQkJICovCisJCQkJCXMtPmx6bWEyLm5lZWRfcHJvcHMgPSBmYWxzZTsKKwkJCQkJcy0+bHptYTIubmV4dF9zZXF1ZW5jZQorCQkJCQkJCT0gU0VRX1BST1BFUlRJRVM7CisJCQkJfSBlbHNlIGlmIChzLT5sem1hMi5uZWVkX3Byb3BzKSB7CisJCQkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCQkJCX0gZWxzZSB7CisJCQkJCXMtPmx6bWEyLm5leHRfc2VxdWVuY2UKKwkJCQkJCQk9IFNFUV9MWk1BX1BSRVBBUkU7CisJCQkJCWlmICh0bXAgPj0gMHhBMCkKKwkJCQkJCWx6bWFfcmVzZXQocyk7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAodG1wID4gMHgwMikKKwkJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9DT01QUkVTU0VEXzA7CisJCQkJcy0+bHptYTIubmV4dF9zZXF1ZW5jZSA9IFNFUV9DT1BZOworCQkJfQorCisJCQlicmVhazsKKworCQljYXNlIFNFUV9VTkNPTVBSRVNTRURfMToKKwkJCXMtPmx6bWEyLnVuY29tcHJlc3NlZAorCQkJCQkrPSAodWludDMyX3QpYi0+aW5bYi0+aW5fcG9zKytdIDw8IDg7CisJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9VTkNPTVBSRVNTRURfMjsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX1VOQ09NUFJFU1NFRF8yOgorCQkJcy0+bHptYTIudW5jb21wcmVzc2VkCisJCQkJCSs9ICh1aW50MzJfdCliLT5pbltiLT5pbl9wb3MrK10gKyAxOworCQkJcy0+bHptYTIuc2VxdWVuY2UgPSBTRVFfQ09NUFJFU1NFRF8wOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfQ09NUFJFU1NFRF8wOgorCQkJcy0+bHptYTIuY29tcHJlc3NlZAorCQkJCQk9ICh1aW50MzJfdCliLT5pbltiLT5pbl9wb3MrK10gPDwgODsKKwkJCXMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0NPTVBSRVNTRURfMTsKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX0NPTVBSRVNTRURfMToKKwkJCXMtPmx6bWEyLmNvbXByZXNzZWQKKwkJCQkJKz0gKHVpbnQzMl90KWItPmluW2ItPmluX3BvcysrXSArIDE7CisJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IHMtPmx6bWEyLm5leHRfc2VxdWVuY2U7CisJCQlicmVhazsKKworCQljYXNlIFNFUV9QUk9QRVJUSUVTOgorCQkJaWYgKCFsem1hX3Byb3BzKHMsIGItPmluW2ItPmluX3BvcysrXSkpCisJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCXMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0xaTUFfUFJFUEFSRTsKKworCQljYXNlIFNFUV9MWk1BX1BSRVBBUkU6CisJCQlpZiAocy0+bHptYTIuY29tcHJlc3NlZCA8IFJDX0lOSVRfQllURVMpCisJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCWlmICghcmNfcmVhZF9pbml0KCZzLT5yYywgYikpCisJCQkJcmV0dXJuIFhaX09LOworCisJCQlzLT5sem1hMi5jb21wcmVzc2VkIC09IFJDX0lOSVRfQllURVM7CisJCQlzLT5sem1hMi5zZXF1ZW5jZSA9IFNFUV9MWk1BX1JVTjsKKworCQljYXNlIFNFUV9MWk1BX1JVTjoKKwkJCS8qCisJCQkgKiBTZXQgZGljdGlvbmFyeSBsaW1pdCB0byBpbmRpY2F0ZSBob3cgbXVjaCB3ZSB3YW50CisJCQkgKiB0byBiZSBlbmNvZGVkIGF0IG1heGltdW0uIERlY29kZSBuZXcgZGF0YSBpbnRvIHRoZQorCQkJICogZGljdGlvbmFyeS4gRmx1c2ggdGhlIG5ldyBkYXRhIGZyb20gZGljdGlvbmFyeSB0bworCQkJICogYi0+b3V0LiBDaGVjayBpZiB3ZSBmaW5pc2hlZCBkZWNvZGluZyB0aGlzIGNodW5rLgorCQkJICogSW4gY2FzZSB0aGUgZGljdGlvbmFyeSBnb3QgZnVsbCBidXQgd2UgZGlkbid0IGZpbGwKKwkJCSAqIHRoZSBvdXRwdXQgYnVmZmVyIHlldCwgd2UgbWF5IHJ1biB0aGlzIGxvb3AKKwkJCSAqIG11bHRpcGxlIHRpbWVzIHdpdGhvdXQgY2hhbmdpbmcgcy0+bHptYTIuc2VxdWVuY2UuCisJCQkgKi8KKwkJCWRpY3RfbGltaXQoJnMtPmRpY3QsIG1pbl90KHNpemVfdCwKKwkJCQkJYi0+b3V0X3NpemUgLSBiLT5vdXRfcG9zLAorCQkJCQlzLT5sem1hMi51bmNvbXByZXNzZWQpKTsKKwkJCWlmICghbHptYTJfbHptYShzLCBiKSkKKwkJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQkJcy0+bHptYTIudW5jb21wcmVzc2VkIC09IGRpY3RfZmx1c2goJnMtPmRpY3QsIGIpOworCisJCQlpZiAocy0+bHptYTIudW5jb21wcmVzc2VkID09IDApIHsKKwkJCQlpZiAocy0+bHptYTIuY29tcHJlc3NlZCA+IDAgfHwgcy0+bHptYS5sZW4gPiAwCisJCQkJCQl8fCAhcmNfaXNfZmluaXNoZWQoJnMtPnJjKSkKKwkJCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJCQlyY19yZXNldCgmcy0+cmMpOworCQkJCXMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0NPTlRST0w7CisJCQl9IGVsc2UgaWYgKGItPm91dF9wb3MgPT0gYi0+b3V0X3NpemUKKwkJCQkJfHwgKGItPmluX3BvcyA9PSBiLT5pbl9zaXplCisJCQkJCQkmJiBzLT50ZW1wLnNpemUKKwkJCQkJCTwgcy0+bHptYTIuY29tcHJlc3NlZCkpIHsKKwkJCQlyZXR1cm4gWFpfT0s7CisJCQl9CisKKwkJCWJyZWFrOworCisJCWNhc2UgU0VRX0NPUFk6CisJCQlkaWN0X3VuY29tcHJlc3NlZCgmcy0+ZGljdCwgYiwgJnMtPmx6bWEyLmNvbXByZXNzZWQpOworCQkJaWYgKHMtPmx6bWEyLmNvbXByZXNzZWQgPiAwKQorCQkJCXJldHVybiBYWl9PSzsKKworCQkJcy0+bHptYTIuc2VxdWVuY2UgPSBTRVFfQ09OVFJPTDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIFhaX09LOworfQorCitYWl9FWFRFUk4gc3RydWN0IHh6X2RlY19sem1hMiAqIFhaX0ZVTkMgeHpfZGVjX2x6bWEyX2NyZWF0ZSgKKwkJZW51bSB4el9tb2RlIG1vZGUsIHVpbnQzMl90IGRpY3RfbWF4KQoreworCXN0cnVjdCB4el9kZWNfbHptYTIgKnMgPSBrbWFsbG9jKHNpemVvZigqcyksIEdGUF9LRVJORUwpOworCWlmIChzID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJcy0+ZGljdC5tb2RlID0gbW9kZTsKKwlzLT5kaWN0LnNpemVfbWF4ID0gZGljdF9tYXg7CisKKwlpZiAoREVDX0lTX1BSRUFMTE9DKG1vZGUpKSB7CisJCXMtPmRpY3QuYnVmID0gdm1hbGxvYyhkaWN0X21heCk7CisJCWlmIChzLT5kaWN0LmJ1ZiA9PSBOVUxMKSB7CisJCQlrZnJlZShzKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfSBlbHNlIGlmIChERUNfSVNfRFlOQUxMT0MobW9kZSkpIHsKKwkJcy0+ZGljdC5idWYgPSBOVUxMOworCQlzLT5kaWN0LmFsbG9jYXRlZCA9IDA7CisJfQorCisJcmV0dXJuIHM7Cit9CisKK1haX0VYVEVSTiBlbnVtIHh6X3JldCBYWl9GVU5DIHh6X2RlY19sem1hMl9yZXNldCgKKwkJc3RydWN0IHh6X2RlY19sem1hMiAqcywgdWludDhfdCBwcm9wcykKK3sKKwkvKiBUaGlzIGxpbWl0cyBkaWN0aW9uYXJ5IHNpemUgdG8gMyBHaUIgdG8ga2VlcCBwYXJzaW5nIHNpbXBsZXIuICovCisJaWYgKHByb3BzID4gMzkpCisJCXJldHVybiBYWl9PUFRJT05TX0VSUk9SOworCisJcy0+ZGljdC5zaXplID0gMiArIChwcm9wcyAmIDEpOworCXMtPmRpY3Quc2l6ZSA8PD0gKHByb3BzID4+IDEpICsgMTE7CisKKwlpZiAoREVDX0lTX01VTFRJKHMtPmRpY3QubW9kZSkpIHsKKwkJaWYgKHMtPmRpY3Quc2l6ZSA+IHMtPmRpY3Quc2l6ZV9tYXgpCisJCQlyZXR1cm4gWFpfTUVNTElNSVRfRVJST1I7CisKKwkJcy0+ZGljdC5lbmQgPSBzLT5kaWN0LnNpemU7CisKKwkJaWYgKERFQ19JU19EWU5BTExPQyhzLT5kaWN0Lm1vZGUpKSB7CisJCQlpZiAocy0+ZGljdC5hbGxvY2F0ZWQgPCBzLT5kaWN0LnNpemUpIHsKKwkJCQl2ZnJlZShzLT5kaWN0LmJ1Zik7CisJCQkJcy0+ZGljdC5idWYgPSB2bWFsbG9jKHMtPmRpY3Quc2l6ZSk7CisJCQkJaWYgKHMtPmRpY3QuYnVmID09IE5VTEwpIHsKKwkJCQkJcy0+ZGljdC5hbGxvY2F0ZWQgPSAwOworCQkJCQlyZXR1cm4gWFpfTUVNX0VSUk9SOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXMtPmx6bWEubGVuID0gMDsKKworCXMtPmx6bWEyLnNlcXVlbmNlID0gU0VRX0NPTlRST0w7CisJcy0+bHptYTIubmVlZF9kaWN0X3Jlc2V0ID0gdHJ1ZTsKKworCXMtPnRlbXAuc2l6ZSA9IDA7CisKKwlyZXR1cm4gWFpfT0s7Cit9CisKK1haX0VYVEVSTiB2b2lkIFhaX0ZVTkMgeHpfZGVjX2x6bWEyX2VuZChzdHJ1Y3QgeHpfZGVjX2x6bWEyICpzKQoreworCWlmIChERUNfSVNfTVVMVEkocy0+ZGljdC5tb2RlKSkKKwkJdmZyZWUocy0+ZGljdC5idWYpOworCisJa2ZyZWUocyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHoveHpfZGVjX3N0cmVhbS5jIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6X2RlY19zdHJlYW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjc5MTA1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6X2RlY19zdHJlYW0uYwpAQCAtMCwwICsxLDgyMCBAQAorLyoKKyAqIC54eiBTdHJlYW0gZGVjb2RlcgorICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCisjaW5jbHVkZSAieHpfcHJpdmF0ZS5oIgorI2luY2x1ZGUgInh6X3N0cmVhbS5oIgorCisvKiBIYXNoIHVzZWQgdG8gdmFsaWRhdGUgdGhlIEluZGV4IGZpZWxkICovCitzdHJ1Y3QgeHpfZGVjX2hhc2ggeworCXZsaV90eXBlIHVucGFkZGVkOworCXZsaV90eXBlIHVuY29tcHJlc3NlZDsKKwl1aW50MzJfdCBjcmMzMjsKK307CisKK3N0cnVjdCB4el9kZWMgeworCS8qIFBvc2l0aW9uIGluIGRlY19tYWluKCkgKi8KKwllbnVtIHsKKwkJU0VRX1NUUkVBTV9IRUFERVIsCisJCVNFUV9CTE9DS19TVEFSVCwKKwkJU0VRX0JMT0NLX0hFQURFUiwKKwkJU0VRX0JMT0NLX1VOQ09NUFJFU1MsCisJCVNFUV9CTE9DS19QQURESU5HLAorCQlTRVFfQkxPQ0tfQ0hFQ0ssCisJCVNFUV9JTkRFWCwKKwkJU0VRX0lOREVYX1BBRERJTkcsCisJCVNFUV9JTkRFWF9DUkMzMiwKKwkJU0VRX1NUUkVBTV9GT09URVIKKwl9IHNlcXVlbmNlOworCisJLyogUG9zaXRpb24gaW4gdmFyaWFibGUtbGVuZ3RoIGludGVnZXJzIGFuZCBDaGVjayBmaWVsZHMgKi8KKwl1aW50MzJfdCBwb3M7CisKKwkvKiBWYXJpYWJsZS1sZW5ndGggaW50ZWdlciBkZWNvZGVkIGJ5IGRlY192bGkoKSAqLworCXZsaV90eXBlIHZsaTsKKworCS8qIFNhdmVkIGluX3BvcyBhbmQgb3V0X3BvcyAqLworCXNpemVfdCBpbl9zdGFydDsKKwlzaXplX3Qgb3V0X3N0YXJ0OworCisJLyogQ1JDMzIgdmFsdWUgaW4gQmxvY2sgb3IgSW5kZXggKi8KKwl1aW50MzJfdCBjcmMzMjsKKworCS8qIFR5cGUgb2YgdGhlIGludGVncml0eSBjaGVjayBjYWxjdWxhdGVkIGZyb20gdW5jb21wcmVzc2VkIGRhdGEgKi8KKwllbnVtIHh6X2NoZWNrIGNoZWNrX3R5cGU7CisKKwkvKiBPcGVyYXRpb24gbW9kZSAqLworCWVudW0geHpfbW9kZSBtb2RlOworCisJLyoKKwkgKiBUcnVlIGlmIHRoZSBuZXh0IGNhbGwgdG8geHpfZGVjX3J1bigpIGlzIGFsbG93ZWQgdG8gcmV0dXJuCisJICogWFpfQlVGX0VSUk9SLgorCSAqLworCWJvb2wgYWxsb3dfYnVmX2Vycm9yOworCisJLyogSW5mb3JtYXRpb24gc3RvcmVkIGluIEJsb2NrIEhlYWRlciAqLworCXN0cnVjdCB7CisJCS8qCisJCSAqIFZhbHVlIHN0b3JlZCBpbiB0aGUgQ29tcHJlc3NlZCBTaXplIGZpZWxkLCBvcgorCQkgKiBWTElfVU5LTk9XTiBpZiBDb21wcmVzc2VkIFNpemUgaXMgbm90IHByZXNlbnQuCisJCSAqLworCQl2bGlfdHlwZSBjb21wcmVzc2VkOworCisJCS8qCisJCSAqIFZhbHVlIHN0b3JlZCBpbiB0aGUgVW5jb21wcmVzc2VkIFNpemUgZmllbGQsIG9yCisJCSAqIFZMSV9VTktOT1dOIGlmIFVuY29tcHJlc3NlZCBTaXplIGlzIG5vdCBwcmVzZW50LgorCQkgKi8KKwkJdmxpX3R5cGUgdW5jb21wcmVzc2VkOworCisJCS8qIFNpemUgb2YgdGhlIEJsb2NrIEhlYWRlciBmaWVsZCAqLworCQl1aW50MzJfdCBzaXplOworCX0gYmxvY2tfaGVhZGVyOworCisJLyogSW5mb3JtYXRpb24gY29sbGVjdGVkIHdoZW4gZGVjb2RpbmcgQmxvY2tzICovCisJc3RydWN0IHsKKwkJLyogT2JzZXJ2ZWQgY29tcHJlc3NlZCBzaXplIG9mIHRoZSBjdXJyZW50IEJsb2NrICovCisJCXZsaV90eXBlIGNvbXByZXNzZWQ7CisKKwkJLyogT2JzZXJ2ZWQgdW5jb21wcmVzc2VkIHNpemUgb2YgdGhlIGN1cnJlbnQgQmxvY2sgKi8KKwkJdmxpX3R5cGUgdW5jb21wcmVzc2VkOworCisJCS8qIE51bWJlciBvZiBCbG9ja3MgZGVjb2RlZCBzbyBmYXIgKi8KKwkJdmxpX3R5cGUgY291bnQ7CisKKwkJLyoKKwkJICogSGFzaCBjYWxjdWxhdGVkIGZyb20gdGhlIEJsb2NrIHNpemVzLiBUaGlzIGlzIHVzZWQgdG8KKwkJICogdmFsaWRhdGUgdGhlIEluZGV4IGZpZWxkLgorCQkgKi8KKwkJc3RydWN0IHh6X2RlY19oYXNoIGhhc2g7CisJfSBibG9jazsKKworCS8qIFZhcmlhYmxlcyBuZWVkZWQgd2hlbiB2ZXJpZnlpbmcgdGhlIEluZGV4IGZpZWxkICovCisJc3RydWN0IHsKKwkJLyogUG9zaXRpb24gaW4gZGVjX2luZGV4KCkgKi8KKwkJZW51bSB7CisJCQlTRVFfSU5ERVhfQ09VTlQsCisJCQlTRVFfSU5ERVhfVU5QQURERUQsCisJCQlTRVFfSU5ERVhfVU5DT01QUkVTU0VECisJCX0gc2VxdWVuY2U7CisKKwkJLyogU2l6ZSBvZiB0aGUgSW5kZXggaW4gYnl0ZXMgKi8KKwkJdmxpX3R5cGUgc2l6ZTsKKworCQkvKiBOdW1iZXIgb2YgUmVjb3JkcyAobWF0Y2hlcyBibG9jay5jb3VudCBpbiB2YWxpZCBmaWxlcykgKi8KKwkJdmxpX3R5cGUgY291bnQ7CisKKwkJLyoKKwkJICogSGFzaCBjYWxjdWxhdGVkIGZyb20gdGhlIFJlY29yZHMgKG1hdGNoZXMgYmxvY2suaGFzaCBpbgorCQkgKiB2YWxpZCBmaWxlcykuCisJCSAqLworCQlzdHJ1Y3QgeHpfZGVjX2hhc2ggaGFzaDsKKwl9IGluZGV4OworCisJLyoKKwkgKiBUZW1wb3JhcnkgYnVmZmVyIG5lZWRlZCB0byBob2xkIFN0cmVhbSBIZWFkZXIsIEJsb2NrIEhlYWRlciwKKwkgKiBhbmQgU3RyZWFtIEZvb3Rlci4gVGhlIEJsb2NrIEhlYWRlciBpcyB0aGUgYmlnZ2VzdCAoMSBLaUIpCisJICogc28gd2UgcmVzZXJ2ZSBzcGFjZSBhY2NvcmRpbmcgdG8gdGhhdC4gYnVmW10gaGFzIHRvIGJlIGFsaWduZWQKKwkgKiB0byBhIG11bHRpcGxlIG9mIGZvdXIgYnl0ZXM7IHRoZSBzaXplX3QgdmFyaWFibGVzIGJlZm9yZSBpdAorCSAqIHNob3VsZCBndWFyYW50ZWUgdGhpcy4KKwkgKi8KKwlzdHJ1Y3QgeworCQlzaXplX3QgcG9zOworCQlzaXplX3Qgc2l6ZTsKKwkJdWludDhfdCBidWZbMTAyNF07CisJfSB0ZW1wOworCisJc3RydWN0IHh6X2RlY19sem1hMiAqbHptYTI7CisKKyNpZmRlZiBYWl9ERUNfQkNKCisJc3RydWN0IHh6X2RlY19iY2ogKmJjajsKKwlib29sIGJjal9hY3RpdmU7CisjZW5kaWYKK307CisKKyNpZmRlZiBYWl9ERUNfQU5ZX0NIRUNLCisvKiBTaXplcyBvZiB0aGUgQ2hlY2sgZmllbGQgd2l0aCBkaWZmZXJlbnQgQ2hlY2sgSURzICovCitzdGF0aWMgY29uc3QgdWludDhfdCBjaGVja19zaXplc1sxNl0gPSB7CisJMCwKKwk0LCA0LCA0LAorCTgsIDgsIDgsCisJMTYsIDE2LCAxNiwKKwkzMiwgMzIsIDMyLAorCTY0LCA2NCwgNjQKK307CisjZW5kaWYKKworLyoKKyAqIEZpbGwgcy0+dGVtcCBieSBjb3B5aW5nIGRhdGEgc3RhcnRpbmcgZnJvbSBiLT5pbltiLT5pbl9wb3NdLiBDYWxsZXIKKyAqIG11c3QgaGF2ZSBzZXQgcy0+dGVtcC5wb3MgdG8gaW5kaWNhdGUgaG93IG11Y2ggZGF0YSB3ZSBhcmUgc3VwcG9zZWQKKyAqIHRvIGNvcHkgaW50byBzLT50ZW1wLmJ1Zi4gUmV0dXJuIHRydWUgb25jZSBzLT50ZW1wLnBvcyBoYXMgcmVhY2hlZAorICogcy0+dGVtcC5zaXplLgorICovCitzdGF0aWMgYm9vbCBYWl9GVU5DIGZpbGxfdGVtcChzdHJ1Y3QgeHpfZGVjICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCXNpemVfdCBjb3B5X3NpemUgPSBtaW5fdChzaXplX3QsCisJCQliLT5pbl9zaXplIC0gYi0+aW5fcG9zLCBzLT50ZW1wLnNpemUgLSBzLT50ZW1wLnBvcyk7CisKKwltZW1jcHkocy0+dGVtcC5idWYgKyBzLT50ZW1wLnBvcywgYi0+aW4gKyBiLT5pbl9wb3MsIGNvcHlfc2l6ZSk7CisJYi0+aW5fcG9zICs9IGNvcHlfc2l6ZTsKKwlzLT50ZW1wLnBvcyArPSBjb3B5X3NpemU7CisKKwlpZiAocy0+dGVtcC5wb3MgPT0gcy0+dGVtcC5zaXplKSB7CisJCXMtPnRlbXAucG9zID0gMDsKKwkJcmV0dXJuIHRydWU7CisJfQorCisJcmV0dXJuIGZhbHNlOworfQorCisvKiBEZWNvZGUgYSB2YXJpYWJsZS1sZW5ndGggaW50ZWdlciAobGl0dGxlLWVuZGlhbiBiYXNlLTEyOCBlbmNvZGluZykgKi8KK3N0YXRpYyBlbnVtIHh6X3JldCBYWl9GVU5DIGRlY192bGkoc3RydWN0IHh6X2RlYyAqcywKKwkJY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCAqaW5fcG9zLCBzaXplX3QgaW5fc2l6ZSkKK3sKKwl1aW50OF90IGJ5dGU7CisKKwlpZiAocy0+cG9zID09IDApCisJCXMtPnZsaSA9IDA7CisKKwl3aGlsZSAoKmluX3BvcyA8IGluX3NpemUpIHsKKwkJYnl0ZSA9IGluWyppbl9wb3NdOworCQkrKyppbl9wb3M7CisKKwkJcy0+dmxpIHw9ICh2bGlfdHlwZSkoYnl0ZSAmIDB4N0YpIDw8IHMtPnBvczsKKworCQlpZiAoKGJ5dGUgJiAweDgwKSA9PSAwKSB7CisJCQkvKiBEb24ndCBhbGxvdyBub24tbWluaW1hbCBlbmNvZGluZ3MuICovCisJCQlpZiAoYnl0ZSA9PSAwICYmIHMtPnBvcyAhPSAwKQorCQkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCQlzLT5wb3MgPSAwOworCQkJcmV0dXJuIFhaX1NUUkVBTV9FTkQ7CisJCX0KKworCQlzLT5wb3MgKz0gNzsKKwkJaWYgKHMtPnBvcyA9PSA3ICogVkxJX0JZVEVTX01BWCkKKwkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCX0KKworCXJldHVybiBYWl9PSzsKK30KKworLyoKKyAqIERlY29kZSB0aGUgQ29tcHJlc3NlZCBEYXRhIGZpZWxkIGZyb20gYSBCbG9jay4gVXBkYXRlIGFuZCB2YWxpZGF0ZQorICogdGhlIG9ic2VydmVkIGNvbXByZXNzZWQgYW5kIHVuY29tcHJlc3NlZCBzaXplcyBvZiB0aGUgQmxvY2sgc28gdGhhdAorICogdGhleSBkb24ndCBleGNlZWQgdGhlIHZhbHVlcyBwb3NzaWJseSBzdG9yZWQgaW4gdGhlIEJsb2NrIEhlYWRlcgorICogKHZhbGlkYXRpb24gYXNzdW1lcyB0aGF0IG5vIGludGVnZXIgb3ZlcmZsb3cgb2NjdXJzLCBzaW5jZSB2bGlfdHlwZQorICogaXMgbm9ybWFsbHkgdWludDY0X3QpLiBVcGRhdGUgdGhlIENSQzMyIGlmIHByZXNlbmNlIG9mIHRoZSBDUkMzMgorICogZmllbGQgd2FzIGluZGljYXRlZCBpbiBTdHJlYW0gSGVhZGVyLgorICoKKyAqIE9uY2UgdGhlIGRlY29kaW5nIGlzIGZpbmlzaGVkLCB2YWxpZGF0ZSB0aGF0IHRoZSBvYnNlcnZlZCBzaXplcyBtYXRjaAorICogdGhlIHNpemVzIHBvc3NpYmx5IHN0b3JlZCBpbiB0aGUgQmxvY2sgSGVhZGVyLiBVcGRhdGUgdGhlIGhhc2ggYW5kCisgKiBCbG9jayBjb3VudCwgd2hpY2ggYXJlIGxhdGVyIHVzZWQgdG8gdmFsaWRhdGUgdGhlIEluZGV4IGZpZWxkLgorICovCitzdGF0aWMgZW51bSB4el9yZXQgWFpfRlVOQyBkZWNfYmxvY2soc3RydWN0IHh6X2RlYyAqcywgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwllbnVtIHh6X3JldCByZXQ7CisKKwlzLT5pbl9zdGFydCA9IGItPmluX3BvczsKKwlzLT5vdXRfc3RhcnQgPSBiLT5vdXRfcG9zOworCisjaWZkZWYgWFpfREVDX0JDSgorCWlmIChzLT5iY2pfYWN0aXZlKQorCQlyZXQgPSB4el9kZWNfYmNqX3J1bihzLT5iY2osIHMtPmx6bWEyLCBiKTsKKwllbHNlCisjZW5kaWYKKwkJcmV0ID0geHpfZGVjX2x6bWEyX3J1bihzLT5sem1hMiwgYik7CisKKwlzLT5ibG9jay5jb21wcmVzc2VkICs9IGItPmluX3BvcyAtIHMtPmluX3N0YXJ0OworCXMtPmJsb2NrLnVuY29tcHJlc3NlZCArPSBiLT5vdXRfcG9zIC0gcy0+b3V0X3N0YXJ0OworCisJLyoKKwkgKiBUaGVyZSBpcyBubyBuZWVkIHRvIHNlcGFyYXRlbHkgY2hlY2sgZm9yIFZMSV9VTktOT1dOLCBzaW5jZQorCSAqIHRoZSBvYnNlcnZlZCBzaXplcyBhcmUgYWx3YXlzIHNtYWxsZXIgdGhhbiBWTElfVU5LTk9XTi4KKwkgKi8KKwlpZiAocy0+YmxvY2suY29tcHJlc3NlZCA+IHMtPmJsb2NrX2hlYWRlci5jb21wcmVzc2VkCisJCQl8fCBzLT5ibG9jay51bmNvbXByZXNzZWQKKwkJCQk+IHMtPmJsb2NrX2hlYWRlci51bmNvbXByZXNzZWQpCisJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJaWYgKHMtPmNoZWNrX3R5cGUgPT0gWFpfQ0hFQ0tfQ1JDMzIpCisJCXMtPmNyYzMyID0geHpfY3JjMzIoYi0+b3V0ICsgcy0+b3V0X3N0YXJ0LAorCQkJCWItPm91dF9wb3MgLSBzLT5vdXRfc3RhcnQsIHMtPmNyYzMyKTsKKworCWlmIChyZXQgPT0gWFpfU1RSRUFNX0VORCkgeworCQlpZiAocy0+YmxvY2tfaGVhZGVyLmNvbXByZXNzZWQgIT0gVkxJX1VOS05PV04KKwkJCQkmJiBzLT5ibG9ja19oZWFkZXIuY29tcHJlc3NlZAorCQkJCQkhPSBzLT5ibG9jay5jb21wcmVzc2VkKQorCQkJcmV0dXJuIFhaX0RBVEFfRVJST1I7CisKKwkJaWYgKHMtPmJsb2NrX2hlYWRlci51bmNvbXByZXNzZWQgIT0gVkxJX1VOS05PV04KKwkJCQkmJiBzLT5ibG9ja19oZWFkZXIudW5jb21wcmVzc2VkCisJCQkJCSE9IHMtPmJsb2NrLnVuY29tcHJlc3NlZCkKKwkJCXJldHVybiBYWl9EQVRBX0VSUk9SOworCisJCXMtPmJsb2NrLmhhc2gudW5wYWRkZWQgKz0gcy0+YmxvY2tfaGVhZGVyLnNpemUKKwkJCQkrIHMtPmJsb2NrLmNvbXByZXNzZWQ7CisKKyNpZmRlZiBYWl9ERUNfQU5ZX0NIRUNLCisJCXMtPmJsb2NrLmhhc2gudW5wYWRkZWQgKz0gY2hlY2tfc2l6ZXNbcy0+Y2hlY2tfdHlwZV07CisjZWxzZQorCQlpZiAocy0+Y2hlY2tfdHlwZSA9PSBYWl9DSEVDS19DUkMzMikKKwkJCXMtPmJsb2NrLmhhc2gudW5wYWRkZWQgKz0gNDsKKyNlbmRpZgorCisJCXMtPmJsb2NrLmhhc2gudW5jb21wcmVzc2VkICs9IHMtPmJsb2NrLnVuY29tcHJlc3NlZDsKKwkJcy0+YmxvY2suaGFzaC5jcmMzMiA9IHh6X2NyYzMyKAorCQkJCShjb25zdCB1aW50OF90ICopJnMtPmJsb2NrLmhhc2gsCisJCQkJc2l6ZW9mKHMtPmJsb2NrLmhhc2gpLCBzLT5ibG9jay5oYXNoLmNyYzMyKTsKKworCQkrK3MtPmJsb2NrLmNvdW50OworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIFVwZGF0ZSB0aGUgSW5kZXggc2l6ZSBhbmQgdGhlIENSQzMyIHZhbHVlLiAqLworc3RhdGljIHZvaWQgWFpfRlVOQyBpbmRleF91cGRhdGUoc3RydWN0IHh6X2RlYyAqcywgY29uc3Qgc3RydWN0IHh6X2J1ZiAqYikKK3sKKwlzaXplX3QgaW5fdXNlZCA9IGItPmluX3BvcyAtIHMtPmluX3N0YXJ0OworCXMtPmluZGV4LnNpemUgKz0gaW5fdXNlZDsKKwlzLT5jcmMzMiA9IHh6X2NyYzMyKGItPmluICsgcy0+aW5fc3RhcnQsIGluX3VzZWQsIHMtPmNyYzMyKTsKK30KKworLyoKKyAqIERlY29kZSB0aGUgTnVtYmVyIG9mIFJlY29yZHMsIFVucGFkZGVkIFNpemUsIGFuZCBVbmNvbXByZXNzZWQgU2l6ZQorICogZmllbGRzIGZyb20gdGhlIEluZGV4IGZpZWxkLiBUaGF0IGlzLCBJbmRleCBQYWRkaW5nIGFuZCBDUkMzMiBhcmUgbm90CisgKiBkZWNvZGVkIGJ5IHRoaXMgZnVuY3Rpb24uCisgKgorICogVGhpcyBjYW4gcmV0dXJuIFhaX09LIChtb3JlIGlucHV0IG5lZWRlZCksIFhaX1NUUkVBTV9FTkQgKGV2ZXJ5dGhpbmcKKyAqIHN1Y2Nlc3NmdWxseSBkZWNvZGVkKSwgb3IgWFpfREFUQV9FUlJPUiAoaW5wdXQgaXMgY29ycnVwdCkuCisgKi8KK3N0YXRpYyBlbnVtIHh6X3JldCBYWl9GVU5DIGRlY19pbmRleChzdHJ1Y3QgeHpfZGVjICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCWVudW0geHpfcmV0IHJldDsKKworCWRvIHsKKwkJcmV0ID0gZGVjX3ZsaShzLCBiLT5pbiwgJmItPmluX3BvcywgYi0+aW5fc2l6ZSk7CisJCWlmIChyZXQgIT0gWFpfU1RSRUFNX0VORCkgeworCQkJaW5kZXhfdXBkYXRlKHMsIGIpOworCQkJcmV0dXJuIHJldDsKKwkJfQorCisJCXN3aXRjaCAocy0+aW5kZXguc2VxdWVuY2UpIHsKKwkJY2FzZSBTRVFfSU5ERVhfQ09VTlQ6CisJCQlzLT5pbmRleC5jb3VudCA9IHMtPnZsaTsKKworCQkJLyoKKwkJCSAqIFZhbGlkYXRlIHRoYXQgdGhlIE51bWJlciBvZiBSZWNvcmRzIGZpZWxkCisJCQkgKiBpbmRpY2F0ZXMgdGhlIHNhbWUgbnVtYmVyIG9mIFJlY29yZHMgYXMKKwkJCSAqIHRoZXJlIHdlcmUgQmxvY2tzIGluIHRoZSBTdHJlYW0uCisJCQkgKi8KKwkJCWlmIChzLT5pbmRleC5jb3VudCAhPSBzLT5ibG9jay5jb3VudCkKKwkJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQkJcy0+aW5kZXguc2VxdWVuY2UgPSBTRVFfSU5ERVhfVU5QQURERUQ7CisJCQlicmVhazsKKworCQljYXNlIFNFUV9JTkRFWF9VTlBBRERFRDoKKwkJCXMtPmluZGV4Lmhhc2gudW5wYWRkZWQgKz0gcy0+dmxpOworCQkJcy0+aW5kZXguc2VxdWVuY2UgPSBTRVFfSU5ERVhfVU5DT01QUkVTU0VEOworCQkJYnJlYWs7CisKKwkJY2FzZSBTRVFfSU5ERVhfVU5DT01QUkVTU0VEOgorCQkJcy0+aW5kZXguaGFzaC51bmNvbXByZXNzZWQgKz0gcy0+dmxpOworCQkJcy0+aW5kZXguaGFzaC5jcmMzMiA9IHh6X2NyYzMyKAorCQkJCQkoY29uc3QgdWludDhfdCAqKSZzLT5pbmRleC5oYXNoLAorCQkJCQlzaXplb2Yocy0+aW5kZXguaGFzaCksCisJCQkJCXMtPmluZGV4Lmhhc2guY3JjMzIpOworCQkJLS1zLT5pbmRleC5jb3VudDsKKwkJCXMtPmluZGV4LnNlcXVlbmNlID0gU0VRX0lOREVYX1VOUEFEREVEOworCQkJYnJlYWs7CisJCX0KKwl9IHdoaWxlIChzLT5pbmRleC5jb3VudCA+IDApOworCisJcmV0dXJuIFhaX1NUUkVBTV9FTkQ7Cit9CisKKy8qCisgKiBWYWxpZGF0ZSB0aGF0IHRoZSBuZXh0IGZvdXIgaW5wdXQgYnl0ZXMgbWF0Y2ggdGhlIHZhbHVlIG9mIHMtPmNyYzMyLgorICogcy0+cG9zIG11c3QgYmUgemVybyB3aGVuIHN0YXJ0aW5nIHRvIHZhbGlkYXRlIHRoZSBmaXJzdCBieXRlLgorICovCitzdGF0aWMgZW51bSB4el9yZXQgWFpfRlVOQyBjcmMzMl92YWxpZGF0ZShzdHJ1Y3QgeHpfZGVjICpzLCBzdHJ1Y3QgeHpfYnVmICpiKQoreworCWRvIHsKKwkJaWYgKGItPmluX3BvcyA9PSBiLT5pbl9zaXplKQorCQkJcmV0dXJuIFhaX09LOworCisJCWlmICgoKHMtPmNyYzMyID4+IHMtPnBvcykgJiAweEZGKSAhPSBiLT5pbltiLT5pbl9wb3MrK10pCisJCQlyZXR1cm4gWFpfREFUQV9FUlJPUjsKKworCQlzLT5wb3MgKz0gODsKKwl9IHdoaWxlIChzLT5wb3MgPCAzMik7CisKKwlzLT5jcmMzMiA9IDA7CisJcy0+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/IFhaX0RBVEFfRVJST1IgOiBYWl9CVUZfRVJST1I7CisKKwkJaWYgKHJldCAhPSBYWl9TVFJFQU1fRU5EKSB7CisJCQliLT5pbl9wb3MgPSBpbl9zdGFydDsKKwkJCWItPm91dF9wb3MgPSBvdXRfc3RhcnQ7CisJCX0KKwl9IGVsc2UgaWYgKHJldCA9PSBYWl9PSyAmJiBpbl9zdGFydCA9PSBiLT5pbl9wb3MKKwkJCSYmIG91dF9zdGFydCA9PSBiLT5vdXRfcG9zKSB7CisJCWlmIChzLT5hbGxvd19idWZfZXJyb3IpCisJCQlyZXQgPSBYWl9CVUZfRVJST1I7CisKKwkJcy0+YWxsb3dfYnVmX2Vycm9yID0gdHJ1ZTsKKwl9IGVsc2UgeworCQlzLT5hbGxvd19idWZfZXJyb3IgPSBmYWxzZTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitYWl9FWFRFUk4gc3RydWN0IHh6X2RlYyAqIFhaX0ZVTkMgeHpfZGVjX2luaXQoCisJCWVudW0geHpfbW9kZSBtb2RlLCB1aW50MzJfdCBkaWN0X21heCkKK3sKKwlzdHJ1Y3QgeHpfZGVjICpzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAocyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCXMtPm1vZGUgPSBtb2RlOworCisjaWZkZWYgWFpfREVDX0JDSgorCXMtPmJjaiA9IHh6X2RlY19iY2pfY3JlYXRlKERFQ19JU19TSU5HTEUobW9kZSkpOworCWlmIChzLT5iY2ogPT0gTlVMTCkKKwkJZ290byBlcnJvcl9iY2o7CisjZW5kaWYKKworCXMtPmx6bWEyID0geHpfZGVjX2x6bWEyX2NyZWF0ZShtb2RlLCBkaWN0X21heCk7CisJaWYgKHMtPmx6bWEyID09IE5VTEwpCisJCWdvdG8gZXJyb3JfbHptYTI7CisKKwl4el9kZWNfcmVzZXQocyk7CisJcmV0dXJuIHM7CisKK2Vycm9yX2x6bWEyOgorI2lmZGVmIFhaX0RFQ19CQ0oKKwl4el9kZWNfYmNqX2VuZChzLT5iY2opOworZXJyb3JfYmNqOgorI2VuZGlmCisJa2ZyZWUocyk7CisJcmV0dXJuIE5VTEw7Cit9CisKK1haX0VYVEVSTiB2b2lkIFhaX0ZVTkMgeHpfZGVjX3Jlc2V0KHN0cnVjdCB4el9kZWMgKnMpCit7CisJcy0+c2VxdWVuY2UgPSBTRVFfU1RSRUFNX0hFQURFUjsKKwlzLT5hbGxvd19idWZfZXJyb3IgPSBmYWxzZTsKKwlzLT5wb3MgPSAwOworCXMtPmNyYzMyID0gMDsKKwltZW16ZXJvKCZzLT5ibG9jaywgc2l6ZW9mKHMtPmJsb2NrKSk7CisJbWVtemVybygmcy0+aW5kZXgsIHNpemVvZihzLT5pbmRleCkpOworCXMtPnRlbXAucG9zID0gMDsKKwlzLT50ZW1wLnNpemUgPSBTVFJFQU1fSEVBREVSX1NJWkU7Cit9CisKK1haX0VYVEVSTiB2b2lkIFhaX0ZVTkMgeHpfZGVjX2VuZChzdHJ1Y3QgeHpfZGVjICpzKQoreworCWlmIChzICE9IE5VTEwpIHsKKwkJeHpfZGVjX2x6bWEyX2VuZChzLT5sem1hMik7CisjaWZkZWYgWFpfREVDX0JDSgorCQl4el9kZWNfYmNqX2VuZChzLT5iY2opOworI2VuZGlmCisJCWtmcmVlKHMpOworCX0KK30KZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9sem1hMi5oIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6X2x6bWEyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmMjFhZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9sem1hMi5oCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogTFpNQTIgZGVmaW5pdGlvbnMKKyAqCisgKiBBdXRob3JzOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqICAgICAgICAgIElnb3IgUGF2bG92IDxodHRwOi8vNy16aXAub3JnLz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgWFpfTFpNQTJfSAorI2RlZmluZSBYWl9MWk1BMl9ICisKKy8qIFJhbmdlIGNvZGVyIGNvbnN0YW50cyAqLworI2RlZmluZSBSQ19TSElGVF9CSVRTIDgKKyNkZWZpbmUgUkNfVE9QX0JJVFMgMjQKKyNkZWZpbmUgUkNfVE9QX1ZBTFVFICgxIDw8IFJDX1RPUF9CSVRTKQorI2RlZmluZSBSQ19CSVRfTU9ERUxfVE9UQUxfQklUUyAxMQorI2RlZmluZSBSQ19CSVRfTU9ERUxfVE9UQUwgKDEgPDwgUkNfQklUX01PREVMX1RPVEFMX0JJVFMpCisjZGVmaW5lIFJDX01PVkVfQklUUyA1CisKKy8qCisgKiBNYXhpbXVtIG51bWJlciBvZiBwb3NpdGlvbiBzdGF0ZXMuIEEgcG9zaXRpb24gc3RhdGUgaXMgdGhlIGxvd2VzdCBwYgorICogbnVtYmVyIG9mIGJpdHMgb2YgdGhlIGN1cnJlbnQgdW5jb21wcmVzc2VkIG9mZnNldC4gSW4gc29tZSBwbGFjZXMgdGhlcmUKKyAqIGFyZSBkaWZmZXJlbnQgc2V0cyBvZiBwcm9iYWJpbGl0aWVzIGZvciBkaWZmZXJlbnQgcG9zaXRpb24gc3RhdGVzLgorICovCisjZGVmaW5lIFBPU19TVEFURVNfTUFYICgxIDw8IDQpCisKKy8qCisgKiBUaGlzIGVudW0gaXMgdXNlZCB0byB0cmFjayB3aGljaCBMWk1BIHN5bWJvbHMgaGF2ZSBvY2N1cnJlZCBtb3N0IHJlY2VudGx5CisgKiBhbmQgaW4gd2hpY2ggb3JkZXIuIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBwcmVkaWN0IHRoZSBuZXh0IHN5bWJvbC4KKyAqCisgKiBTeW1ib2xzOgorICogIC0gTGl0ZXJhbDogT25lIDgtYml0IGJ5dGUKKyAqICAtIE1hdGNoOiBSZXBlYXQgYSBjaHVuayBvZiBkYXRhIGF0IHNvbWUgZGlzdGFuY2UKKyAqICAtIExvbmcgcmVwZWF0OiBNdWx0aS1ieXRlIG1hdGNoIGF0IGEgcmVjZW50bHkgc2VlbiBkaXN0YW5jZQorICogIC0gU2hvcnQgcmVwZWF0OiBPbmUtYnl0ZSByZXBlYXQgYXQgYSByZWNlbnRseSBzZWVuIGRpc3RhbmNlCisgKgorICogVGhlIHN5bWJvbCBuYW1lcyBhcmUgaW4gZnJvbSBTVEFURV9vbGRlc3Rfb2xkZXJfcHJldmlvdXMuIFJFUCBtZWFucworICogZWl0aGVyIHNob3J0IG9yIGxvbmcgcmVwZWF0ZWQgbWF0Y2gsIGFuZCBOT05MSVQgbWVhbnMgYW55IG5vbi1saXRlcmFsLgorICovCitlbnVtIGx6bWFfc3RhdGUgeworCVNUQVRFX0xJVF9MSVQsCisJU1RBVEVfTUFUQ0hfTElUX0xJVCwKKwlTVEFURV9SRVBfTElUX0xJVCwKKwlTVEFURV9TSE9SVFJFUF9MSVRfTElULAorCVNUQVRFX01BVENIX0xJVCwKKwlTVEFURV9SRVBfTElULAorCVNUQVRFX1NIT1JUUkVQX0xJVCwKKwlTVEFURV9MSVRfTUFUQ0gsCisJU1RBVEVfTElUX0xPTkdSRVAsCisJU1RBVEVfTElUX1NIT1JUUkVQLAorCVNUQVRFX05PTkxJVF9NQVRDSCwKKwlTVEFURV9OT05MSVRfUkVQCit9OworCisvKiBUb3RhbCBudW1iZXIgb2Ygc3RhdGVzICovCisjZGVmaW5lIFNUQVRFUyAxMgorCisvKiBUaGUgbG93ZXN0IDcgc3RhdGVzIGluZGljYXRlIHRoYXQgdGhlIHByZXZpb3VzIHN0YXRlIHdhcyBhIGxpdGVyYWwuICovCisjZGVmaW5lIExJVF9TVEFURVMgNworCisvKiBJbmRpY2F0ZSB0aGF0IHRoZSBsYXRlc3Qgc3ltYm9sIHdhcyBhIGxpdGVyYWwuICovCitzdGF0aWMgaW5saW5lIHZvaWQgWFpfRlVOQyBsem1hX3N0YXRlX2xpdGVyYWwoZW51bSBsem1hX3N0YXRlICpzdGF0ZSkKK3sKKwlpZiAoKnN0YXRlIDw9IFNUQVRFX1NIT1JUUkVQX0xJVF9MSVQpCisJCSpzdGF0ZSA9IFNUQVRFX0xJVF9MSVQ7CisJZWxzZSBpZiAoKnN0YXRlIDw9IFNUQVRFX0xJVF9TSE9SVFJFUCkKKwkJKnN0YXRlIC09IDM7CisJZWxzZQorCQkqc3RhdGUgLT0gNjsKK30KKworLyogSW5kaWNhdGUgdGhhdCB0aGUgbGF0ZXN0IHN5bWJvbCB3YXMgYSBtYXRjaC4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBYWl9GVU5DIGx6bWFfc3RhdGVfbWF0Y2goZW51bSBsem1hX3N0YXRlICpzdGF0ZSkKK3sKKwkqc3RhdGUgPSAqc3RhdGUgPCBMSVRfU1RBVEVTID8gU1RBVEVfTElUX01BVENIIDogU1RBVEVfTk9OTElUX01BVENIOworfQorCisvKiBJbmRpY2F0ZSB0aGF0IHRoZSBsYXRlc3Qgc3RhdGUgd2FzIGEgbG9uZyByZXBlYXRlZCBtYXRjaC4gKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBYWl9GVU5DIGx6bWFfc3RhdGVfbG9uZ19yZXAoZW51bSBsem1hX3N0YXRlICpzdGF0ZSkKK3sKKwkqc3RhdGUgPSAqc3RhdGUgPCBMSVRfU1RBVEVTID8gU1RBVEVfTElUX0xPTkdSRVAgOiBTVEFURV9OT05MSVRfUkVQOworfQorCisvKiBJbmRpY2F0ZSB0aGF0IHRoZSBsYXRlc3Qgc3ltYm9sIHdhcyBhIHNob3J0IG1hdGNoLiAqLworc3RhdGljIGlubGluZSB2b2lkIFhaX0ZVTkMgbHptYV9zdGF0ZV9zaG9ydF9yZXAoZW51bSBsem1hX3N0YXRlICpzdGF0ZSkKK3sKKwkqc3RhdGUgPSAqc3RhdGUgPCBMSVRfU1RBVEVTID8gU1RBVEVfTElUX1NIT1JUUkVQIDogU1RBVEVfTk9OTElUX1JFUDsKK30KKworLyogVGVzdCBpZiB0aGUgcHJldmlvdXMgc3ltYm9sIHdhcyBhIGxpdGVyYWwuICovCitzdGF0aWMgaW5saW5lIGJvb2wgWFpfRlVOQyBsem1hX3N0YXRlX2lzX2xpdGVyYWwoZW51bSBsem1hX3N0YXRlIHN0YXRlKQoreworCXJldHVybiBzdGF0ZSA8IExJVF9TVEFURVM7Cit9CisKKy8qIEVhY2ggbGl0ZXJhbCBjb2RlciBpcyBkaXZpZGVkIGluIHRocmVlIHNlY3Rpb25zOgorICogICAtIDB4MDAxLTB4MEZGOiBXaXRob3V0IG1hdGNoIGJ5dGUKKyAqICAgLSAweDEwMS0weDFGRjogV2l0aCBtYXRjaCBieXRlOyBtYXRjaCBiaXQgaXMgMAorICogICAtIDB4MjAxLTB4MkZGOiBXaXRoIG1hdGNoIGJ5dGU7IG1hdGNoIGJpdCBpcyAxCisgKgorICogTWF0Y2ggYnl0ZSBpcyB1c2VkIHdoZW4gdGhlIHByZXZpb3VzIExaTUEgc3ltYm9sIHdhcyBzb21ldGhpbmcgZWxzZSB0aGFuCisgKiBhIGxpdGVyYWwgKHRoYXQgaXMsIGl0IHdhcyBzb21lIGtpbmQgb2YgbWF0Y2gpLgorICovCisjZGVmaW5lIExJVEVSQUxfQ09ERVJfU0laRSAweDMwMAorCisvKiBNYXhpbXVtIG51bWJlciBvZiBsaXRlcmFsIGNvZGVycyAqLworI2RlZmluZSBMSVRFUkFMX0NPREVSU19NQVggKDEgPDwgNCkKKworLyogTWluaW11bSBsZW5ndGggb2YgYSBtYXRjaCBpcyB0d28gYnl0ZXMuICovCisjZGVmaW5lIE1BVENIX0xFTl9NSU4gMgorCisvKiBNYXRjaCBsZW5ndGggaXMgZW5jb2RlZCB3aXRoIDQsIDUsIG9yIDEwIGJpdHMuCisgKgorICogTGVuZ3RoICAgQml0cworICogIDItOSAgICAgIDQgPSBDaG9pY2U9MCArIDMgYml0cworICogMTAtMTcgICAgIDUgPSBDaG9pY2U9MSArIENob2ljZTI9MCArIDMgYml0cworICogMTgtMjczICAgMTAgPSBDaG9pY2U9MSArIENob2ljZTI9MSArIDggYml0cworICovCisjZGVmaW5lIExFTl9MT1dfQklUUyAzCisjZGVmaW5lIExFTl9MT1dfU1lNQk9MUyAoMSA8PCBMRU5fTE9XX0JJVFMpCisjZGVmaW5lIExFTl9NSURfQklUUyAzCisjZGVmaW5lIExFTl9NSURfU1lNQk9MUyAoMSA8PCBMRU5fTUlEX0JJVFMpCisjZGVmaW5lIExFTl9ISUdIX0JJVFMgOAorI2RlZmluZSBMRU5fSElHSF9TWU1CT0xTICgxIDw8IExFTl9ISUdIX0JJVFMpCisjZGVmaW5lIExFTl9TWU1CT0xTIChMRU5fTE9XX1NZTUJPTFMgKyBMRU5fTUlEX1NZTUJPTFMgKyBMRU5fSElHSF9TWU1CT0xTKQorCisvKgorICogTWF4aW11bSBsZW5ndGggb2YgYSBtYXRjaCBpcyAyNzMgd2hpY2ggaXMgYSByZXN1bHQgb2YgdGhlIGVuY29kaW5nCisgKiBkZXNjcmliZWQgYWJvdmUuCisgKi8KKyNkZWZpbmUgTUFUQ0hfTEVOX01BWCAoTUFUQ0hfTEVOX01JTiArIExFTl9TWU1CT0xTIC0gMSkKKworLyoKKyAqIERpZmZlcmVudCBzZXRzIG9mIHByb2JhYmlsaXRpZXMgYXJlIHVzZWQgZm9yIG1hdGNoIGRpc3RhbmNlcyB0aGF0IGhhdmUKKyAqIHZlcnkgc2hvcnQgbWF0Y2ggbGVuZ3RoOiBMZW5ndGhzIG9mIDIsIDMsIGFuZCA0IGJ5dGVzIGhhdmUgYSBzZXBhcmF0ZQorICogc2V0IG9mIHByb2JhYmlsaXRpZXMgZm9yIGVhY2ggbGVuZ3RoLiBUaGUgbWF0Y2hlcyB3aXRoIGxvbmdlciBsZW5ndGgKKyAqIHVzZSBhIHNoYXJlZCBzZXQgb2YgcHJvYmFiaWxpdGllcy4KKyAqLworI2RlZmluZSBESVNUX1NUQVRFUyA0CisKKy8qCisgKiBHZXQgdGhlIGluZGV4IG9mIHRoZSBhcHByb3ByaWF0ZSBwcm9iYWJpbGl0eSBhcnJheSBmb3IgZGVjb2RpbmcKKyAqIHRoZSBkaXN0YW5jZSBzbG90LgorICovCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IFhaX0ZVTkMgbHptYV9nZXRfZGlzdF9zdGF0ZSh1aW50MzJfdCBsZW4pCit7CisJcmV0dXJuIGxlbiA8IERJU1RfU1RBVEVTICsgTUFUQ0hfTEVOX01JTgorCQkJPyBsZW4gLSBNQVRDSF9MRU5fTUlOIDogRElTVF9TVEFURVMgLSAxOworfQorCisvKgorICogVGhlIGhpZ2hlc3QgdHdvIGJpdHMgb2YgYSAzMi1iaXQgbWF0Y2ggZGlzdGFuY2UgYXJlIGVuY29kZWQgdXNpbmcgc2l4IGJpdHMuCisgKiBUaGlzIHNpeC1iaXQgdmFsdWUgaXMgY2FsbGVkIGEgZGlzdGFuY2Ugc2xvdC4gVGhpcyB3YXkgZW5jb2RpbmcgYSAzMi1iaXQKKyAqIHZhbHVlIHRha2VzIDYtMzYgYml0cywgbGFyZ2VyIHZhbHVlcyB0YWtpbmcgbW9yZSBiaXRzLgorICovCisjZGVmaW5lIERJU1RfU0xPVF9CSVRTIDYKKyNkZWZpbmUgRElTVF9TTE9UUyAoMSA8PCBESVNUX1NMT1RfQklUUykKKworLyogTWF0Y2ggZGlzdGFuY2VzIHVwIHRvIDEyNyBhcmUgZnVsbHkgZW5jb2RlZCB1c2luZyBwcm9iYWJpbGl0aWVzLiBTaW5jZQorICogdGhlIGhpZ2hlc3QgdHdvIGJpdHMgKGRpc3RhbmNlIHNsb3QpIGFyZSBhbHdheXMgZW5jb2RlZCB1c2luZyBzaXggYml0cywKKyAqIHRoZSBkaXN0YW5jZXMgMC0zIGRvbid0IG5lZWQgYW55IGFkZGl0aW9uYWwgYml0cyB0byBlbmNvZGUsIHNpbmNlIHRoZQorICogZGlzdGFuY2Ugc2xvdCBpdHNlbGYgaXMgdGhlIHNhbWUgYXMgdGhlIGFjdHVhbCBkaXN0YW5jZS4gRElTVF9NT0RFTF9TVEFSVAorICogaW5kaWNhdGVzIHRoZSBmaXJzdCBkaXN0YW5jZSBzbG90IHdoZXJlIGF0IGxlYXN0IG9uZSBhZGRpdGlvbmFsIGJpdCBpcworICogbmVlZGVkLgorICovCisjZGVmaW5lIERJU1RfTU9ERUxfU1RBUlQgNAorCisvKgorICogTWF0Y2ggZGlzdGFuY2VzIGdyZWF0ZXIgdGhhbiAxMjcgYXJlIGVuY29kZWQgaW4gdGhyZWUgcGllY2VzOgorICogICAtIGRpc3RhbmNlIHNsb3Q6IHRoZSBoaWdoZXN0IHR3byBiaXRzCisgKiAgIC0gZGlyZWN0IGJpdHM6IDItMjYgYml0cyBiZWxvdyB0aGUgaGlnaGVzdCB0d28gYml0cworICogICAtIGFsaWdubWVudCBiaXRzOiBmb3VyIGxvd2VzdCBiaXRzCisgKgorICogRGlyZWN0IGJpdHMgZG9uJ3QgdXNlIGFueSBwcm9iYWJpbGl0aWVzLgorICoKKyAqIFRoZSBkaXN0YW5jZSBzbG90IHZhbHVlIG9mIDE0IGlzIGZvciBkaXN0YW5jZXMgMTI4LTE5MS4KKyAqLworI2RlZmluZSBESVNUX01PREVMX0VORCAxNAorCisvKiBEaXN0YW5jZSBzbG90cyB0aGF0IGluZGljYXRlIGEgZGlzdGFuY2UgPD0gMTI3LiAqLworI2RlZmluZSBGVUxMX0RJU1RBTkNFU19CSVRTIChESVNUX01PREVMX0VORCAvIDIpCisjZGVmaW5lIEZVTExfRElTVEFOQ0VTICgxIDw8IEZVTExfRElTVEFOQ0VTX0JJVFMpCisKKy8qCisgKiBGb3IgbWF0Y2ggZGlzdGFuY2VzIGdyZWF0ZXIgdGhhbiAxMjcsIG9ubHkgdGhlIGhpZ2hlc3QgdHdvIGJpdHMgYW5kIHRoZQorICogbG93ZXN0IGZvdXIgYml0cyAoYWxpZ25tZW50KSBpcyBlbmNvZGVkIHVzaW5nIHByb2JhYmlsaXRpZXMuCisgKi8KKyNkZWZpbmUgQUxJR05fQklUUyA0CisjZGVmaW5lIEFMSUdOX1NJWkUgKDEgPDwgQUxJR05fQklUUykKKyNkZWZpbmUgQUxJR05fTUFTSyAoQUxJR05fU0laRSAtIDEpCisKKy8qIFRvdGFsIG51bWJlciBvZiBhbGwgcHJvYmFiaWxpdHkgdmFyaWFibGVzICovCisjZGVmaW5lIFBST0JTX1RPVEFMICgxODQ2ICsgTElURVJBTF9DT0RFUlNfTUFYICogTElURVJBTF9DT0RFUl9TSVpFKQorCisvKgorICogTFpNQSByZW1lbWJlcnMgdGhlIGZvdXIgbW9zdCByZWNlbnQgbWF0Y2ggZGlzdGFuY2VzLiBSZXVzaW5nIHRoZXNlCisgKiBkaXN0YW5jZXMgdGVuZHMgdG8gdGFrZSBsZXNzIHNwYWNlIHRoYW4gcmUtZW5jb2RpbmcgdGhlIGFjdHVhbAorICogZGlzdGFuY2UgdmFsdWUuCisgKi8KKyNkZWZpbmUgUkVQUyA0CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6X3ByaXZhdGUuaCBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9wcml2YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ1NjQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL2xpYmFyY2hpdmUvdW54ei94el9wcml2YXRlLmgKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBQcml2YXRlIGluY2x1ZGVzIGFuZCBkZWZpbml0aW9ucworICoKKyAqIEF1dGhvcjogTGFzc2UgQ29sbGluIDxsYXNzZS5jb2xsaW5AdHVrYWFuaS5vcmc+CisgKgorICogVGhpcyBmaWxlIGhhcyBiZWVuIHB1dCBpbnRvIHRoZSBwdWJsaWMgZG9tYWluLgorICogWW91IGNhbiBkbyB3aGF0ZXZlciB5b3Ugd2FudCB3aXRoIHRoaXMgZmlsZS4KKyAqLworCisjaWZuZGVmIFhaX1BSSVZBVEVfSAorI2RlZmluZSBYWl9QUklWQVRFX0gKKworI2lmZGVmIF9fS0VSTkVMX18KKwkvKiBYWl9QUkVCT09UIG1heSBiZSBkZWZpbmVkIG9ubHkgdmlhIGRlY29tcHJlc3NfdW54ei5jLiAqLworIwlpZm5kZWYgWFpfUFJFQk9PVAorIwkJaW5jbHVkZSA8bGludXgvc2xhYi5oPgorIwkJaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgorIwkJaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjCQlkZWZpbmUgbWVtZXEoYSwgYiwgc2l6ZSkgKG1lbWNtcChhLCBiLCBzaXplKSA9PSAwKQorIwkJZGVmaW5lIG1lbXplcm8oYnVmLCBzaXplKSBtZW1zZXQoYnVmLCAwLCBzaXplKQorIwllbmRpZgorIwlpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisjCWluY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KKyMJZGVmaW5lIGdldF9sZTMyKHApIGxlMzJfdG9fY3B1cCgoY29uc3QgdWludDMyX3QgKikocCkpCisJLyogWFpfSUdOT1JFX0tDT05GSUcgbWF5IGJlIGRlZmluZWQgb25seSB2aWEgZGVjb21wcmVzc191bnh6LmMuICovCisjCWlmbmRlZiBYWl9JR05PUkVfS0NPTkZJRworIwkJaWZkZWYgQ09ORklHX1haX0RFQ19YODYKKyMJCQlkZWZpbmUgWFpfREVDX1g4NgorIwkJZW5kaWYKKyMJCWlmZGVmIENPTkZJR19YWl9ERUNfUE9XRVJQQworIwkJCWRlZmluZSBYWl9ERUNfUE9XRVJQQworIwkJZW5kaWYKKyMJCWlmZGVmIENPTkZJR19YWl9ERUNfSUE2NAorIwkJCWRlZmluZSBYWl9ERUNfSUE2NAorIwkJZW5kaWYKKyMJCWlmZGVmIENPTkZJR19YWl9ERUNfQVJNCisjCQkJZGVmaW5lIFhaX0RFQ19BUk0KKyMJCWVuZGlmCisjCQlpZmRlZiBDT05GSUdfWFpfREVDX0FSTVRIVU1CCisjCQkJZGVmaW5lIFhaX0RFQ19BUk1USFVNQgorIwkJZW5kaWYKKyMJCWlmZGVmIENPTkZJR19YWl9ERUNfU1BBUkMKKyMJCQlkZWZpbmUgWFpfREVDX1NQQVJDCisjCQllbmRpZgorIwllbmRpZgorIwlpbmNsdWRlIDxsaW51eC94ei5oPgorI2Vsc2UKKwkvKgorCSAqIEZvciB1c2Vyc3BhY2UgYnVpbGRzLCB1c2UgYSBzZXBhcmF0ZSBoZWFkZXIgdG8gZGVmaW5lIHRoZSByZXF1aXJlZAorCSAqIG1hY3JvcyBhbmQgZnVuY3Rpb25zLiBUaGlzIG1ha2VzIGl0IGVhc2llciB0byBhZGFwdCB0aGUgY29kZSBpbnRvCisJICogZGlmZmVyZW50IGVudmlyb25tZW50cyBhbmQgYXZvaWRzIGNsdXR0ZXIgaW4gdGhlIExpbnV4IGtlcm5lbCB0cmVlLgorCSAqLworIwlpbmNsdWRlICJ4el9jb25maWcuaCIKKyNlbmRpZgorCisvKiBJZiBubyBzcGVjaWZpYyBkZWNvZGluZyBtb2RlIGlzIHJlcXVlc3RlZCwgZW5hYmxlIHN1cHBvcnQgZm9yIGFsbCBtb2Rlcy4gKi8KKyNpZiAhZGVmaW5lZChYWl9ERUNfU0lOR0xFKSAmJiAhZGVmaW5lZChYWl9ERUNfUFJFQUxMT0MpIFwKKwkJJiYgIWRlZmluZWQoWFpfREVDX0RZTkFMTE9DKQorIwlkZWZpbmUgWFpfREVDX1NJTkdMRQorIwlkZWZpbmUgWFpfREVDX1BSRUFMTE9DCisjCWRlZmluZSBYWl9ERUNfRFlOQUxMT0MKKyNlbmRpZgorCisvKgorICogVGhlIERFQ19JU19mb28obW9kZSkgbWFjcm9zIGFyZSB1c2VkIGluICJpZiIgc3RhdGVtZW50cy4gSWYgb25seSBzb21lCisgKiBvZiB0aGUgc3VwcG9ydGVkIG1vZGVzIGFyZSBlbmFibGVkLCB0aGVzZSBtYWNyb3Mgd2lsbCBldmFsdWF0ZSB0byB0cnVlIG9yCisgKiBmYWxzZSBhdCBjb21waWxlIHRpbWUgYW5kIHRodXMgYWxsb3cgdGhlIGNvbXBpbGVyIHRvIG9taXQgdW5uZWVkZWQgY29kZS4KKyAqLworI2lmZGVmIFhaX0RFQ19TSU5HTEUKKyMJZGVmaW5lIERFQ19JU19TSU5HTEUobW9kZSkgKChtb2RlKSA9PSBYWl9TSU5HTEUpCisjZWxzZQorIwlkZWZpbmUgREVDX0lTX1NJTkdMRShtb2RlKSAoZmFsc2UpCisjZW5kaWYKKworI2lmZGVmIFhaX0RFQ19QUkVBTExPQworIwlkZWZpbmUgREVDX0lTX1BSRUFMTE9DKG1vZGUpICgobW9kZSkgPT0gWFpfUFJFQUxMT0MpCisjZWxzZQorIwlkZWZpbmUgREVDX0lTX1BSRUFMTE9DKG1vZGUpIChmYWxzZSkKKyNlbmRpZgorCisjaWZkZWYgWFpfREVDX0RZTkFMTE9DCisjCWRlZmluZSBERUNfSVNfRFlOQUxMT0MobW9kZSkgKChtb2RlKSA9PSBYWl9EWU5BTExPQykKKyNlbHNlCisjCWRlZmluZSBERUNfSVNfRFlOQUxMT0MobW9kZSkgKGZhbHNlKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChYWl9ERUNfU0lOR0xFKQorIwlkZWZpbmUgREVDX0lTX01VTFRJKG1vZGUpICh0cnVlKQorI2VsaWYgZGVmaW5lZChYWl9ERUNfUFJFQUxMT0MpIHx8IGRlZmluZWQoWFpfREVDX0RZTkFMTE9DKQorIwlkZWZpbmUgREVDX0lTX01VTFRJKG1vZGUpICgobW9kZSkgIT0gWFpfU0lOR0xFKQorI2Vsc2UKKyMJZGVmaW5lIERFQ19JU19NVUxUSShtb2RlKSAoZmFsc2UpCisjZW5kaWYKKworLyoKKyAqIElmIGFueSBvZiB0aGUgQkNKIGZpbHRlciBkZWNvZGVycyBhcmUgd2FudGVkLCBkZWZpbmUgWFpfREVDX0JDSi4KKyAqIFhaX0RFQ19CQ0ogaXMgdXNlZCB0byBlbmFibGUgZ2VuZXJpYyBzdXBwb3J0IGZvciBCQ0ogZGVjb2RlcnMuCisgKi8KKyNpZm5kZWYgWFpfREVDX0JDSgorIwlpZiBkZWZpbmVkKFhaX0RFQ19YODYpIHx8IGRlZmluZWQoWFpfREVDX1BPV0VSUEMpIFwKKwkJCXx8IGRlZmluZWQoWFpfREVDX0lBNjQpIHx8IGRlZmluZWQoWFpfREVDX0FSTSkgXAorCQkJfHwgZGVmaW5lZChYWl9ERUNfQVJNKSB8fCBkZWZpbmVkKFhaX0RFQ19BUk1USFVNQikgXAorCQkJfHwgZGVmaW5lZChYWl9ERUNfU1BBUkMpCisjCQlkZWZpbmUgWFpfREVDX0JDSgorIwllbmRpZgorI2VuZGlmCisKKy8qCisgKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIExaTUEyIGRlY29kZXIuIHh6X2RlY19sem1hMl9yZXNldCgpIG11c3QgYmUgdXNlZAorICogYmVmb3JlIGNhbGxpbmcgeHpfZGVjX2x6bWEyX3J1bigpLgorICovCitYWl9FWFRFUk4gc3RydWN0IHh6X2RlY19sem1hMiAqIFhaX0ZVTkMgeHpfZGVjX2x6bWEyX2NyZWF0ZSgKKwkJZW51bSB4el9tb2RlIG1vZGUsIHVpbnQzMl90IGRpY3RfbWF4KTsKKworLyoKKyAqIERlY29kZSB0aGUgTFpNQTIgcHJvcGVydGllcyAob25lIGJ5dGUpIGFuZCByZXNldCB0aGUgZGVjb2Rlci4gUmV0dXJuCisgKiBYWl9PSyBvbiBzdWNjZXNzLCBYWl9NRU1MSU1JVF9FUlJPUiBpZiB0aGUgcHJlYWxsb2NhdGVkIGRpY3Rpb25hcnkgaXMgbm90CisgKiBiaWcgZW5vdWdoLCBhbmQgWFpfT1BUSU9OU19FUlJPUiBpZiBwcm9wcyBpbmRpY2F0ZXMgc29tZXRoaW5nIHRoYXQgdGhpcworICogZGVjb2RlciBkb2Vzbid0IHN1cHBvcnQuCisgKi8KK1haX0VYVEVSTiBlbnVtIHh6X3JldCBYWl9GVU5DIHh6X2RlY19sem1hMl9yZXNldCgKKwkJc3RydWN0IHh6X2RlY19sem1hMiAqcywgdWludDhfdCBwcm9wcyk7CisKKy8qIERlY29kZSByYXcgTFpNQTIgc3RyZWFtIGZyb20gYi0+aW4gdG8gYi0+b3V0LiAqLworWFpfRVhURVJOIGVudW0geHpfcmV0IFhaX0ZVTkMgeHpfZGVjX2x6bWEyX3J1bigKKwkJc3RydWN0IHh6X2RlY19sem1hMiAqcywgc3RydWN0IHh6X2J1ZiAqYik7CisKKy8qIEZyZWUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoZSBMWk1BMiBkZWNvZGVyLiAqLworWFpfRVhURVJOIHZvaWQgWFpfRlVOQyB4el9kZWNfbHptYTJfZW5kKHN0cnVjdCB4el9kZWNfbHptYTIgKnMpOworCisjaWZkZWYgWFpfREVDX0JDSgorLyoKKyAqIEFsbG9jYXRlIG1lbW9yeSBmb3IgQkNKIGRlY29kZXJzLiB4el9kZWNfYmNqX3Jlc2V0KCkgbXVzdCBiZSB1c2VkIGJlZm9yZQorICogY2FsbGluZyB4el9kZWNfYmNqX3J1bigpLgorICovCitYWl9FWFRFUk4gc3RydWN0IHh6X2RlY19iY2ogKiBYWl9GVU5DIHh6X2RlY19iY2pfY3JlYXRlKGJvb2wgc2luZ2xlX2NhbGwpOworCisvKgorICogRGVjb2RlIHRoZSBGaWx0ZXIgSUQgb2YgYSBCQ0ogZmlsdGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QKKyAqIHN1cHBvcnQgY3VzdG9tIHN0YXJ0IG9mZnNldHMsIHNvIG5vIGRlY29kaW5nIG9mIEZpbHRlciBQcm9wZXJ0aWVzCisgKiBpcyBuZWVkZWQuIFJldHVybnMgWFpfT0sgaWYgdGhlIGdpdmVuIEZpbHRlciBJRCBpcyBzdXBwb3J0ZWQuCisgKiBPdGhlcndpc2UgWFpfT1BUSU9OU19FUlJPUiBpcyByZXR1cm5lZC4KKyAqLworWFpfRVhURVJOIGVudW0geHpfcmV0IFhaX0ZVTkMgeHpfZGVjX2Jjal9yZXNldCgKKwkJc3RydWN0IHh6X2RlY19iY2ogKnMsIHVpbnQ4X3QgaWQpOworCisvKgorICogRGVjb2RlIHJhdyBCQ0ogKyBMWk1BMiBzdHJlYW0uIFRoaXMgbXVzdCBiZSB1c2VkIG9ubHkgaWYgdGhlcmUgYWN0dWFsbHkgaXMKKyAqIGEgQkNKIGZpbHRlciBpbiB0aGUgY2hhaW4uIElmIHRoZSBjaGFpbiBoYXMgb25seSBMWk1BMiwgeHpfZGVjX2x6bWEyX3J1bigpCisgKiBtdXN0IGJlIGNhbGxlZCBkaXJlY3RseS4KKyAqLworWFpfRVhURVJOIGVudW0geHpfcmV0IFhaX0ZVTkMgeHpfZGVjX2Jjal9ydW4oc3RydWN0IHh6X2RlY19iY2ogKnMsCisJCXN0cnVjdCB4el9kZWNfbHptYTIgKmx6bWEyLCBzdHJ1Y3QgeHpfYnVmICpiKTsKKworLyogRnJlZSB0aGUgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIEJDSiBmaWx0ZXJzLiAqLworI2RlZmluZSB4el9kZWNfYmNqX2VuZChzKSBrZnJlZShzKQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6X3N0cmVhbS5oIGIvYXJjaGl2YWwvbGliYXJjaGl2ZS91bnh6L3h6X3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2Y2I1YTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoaXZhbC9saWJhcmNoaXZlL3VueHoveHpfc3RyZWFtLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIERlZmluaXRpb25zIGZvciBoYW5kbGluZyB0aGUgLnh6IGZpbGUgZm9ybWF0CisgKgorICogQXV0aG9yOiBMYXNzZSBDb2xsaW4gPGxhc3NlLmNvbGxpbkB0dWthYW5pLm9yZz4KKyAqCisgKiBUaGlzIGZpbGUgaGFzIGJlZW4gcHV0IGludG8gdGhlIHB1YmxpYyBkb21haW4uCisgKiBZb3UgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBmaWxlLgorICovCisKKyNpZm5kZWYgWFpfU1RSRUFNX0gKKyNkZWZpbmUgWFpfU1RSRUFNX0gKKworI2lmIGRlZmluZWQoX19LRVJORUxfXykgJiYgIVhaX0lOVEVSTkFMX0NSQzMyCisjCWluY2x1ZGUgPGxpbnV4L2NyYzMyLmg+CisjCXVuZGVmIGNyYzMyCisjCWRlZmluZSB4el9jcmMzMihidWYsIHNpemUsIGNyYykgXAorCQkofmNyYzMyX2xlKH4odWludDMyX3QpKGNyYyksIGJ1Ziwgc2l6ZSkpCisjZW5kaWYKKworLyoKKyAqIFNlZSB0aGUgLnh6IGZpbGUgZm9ybWF0IHNwZWNpZmljYXRpb24gYXQKKyAqIGh0dHA6Ly90dWthYW5pLm9yZy94ei94ei1maWxlLWZvcm1hdC50eHQKKyAqIHRvIHVuZGVyc3RhbmQgdGhlIGNvbnRhaW5lciBmb3JtYXQuCisgKi8KKworI2RlZmluZSBTVFJFQU1fSEVBREVSX1NJWkUgMTIKKworI2RlZmluZSBIRUFERVJfTUFHSUMgIlwzNzU3elhaIgorI2RlZmluZSBIRUFERVJfTUFHSUNfU0laRSA2CisKKyNkZWZpbmUgRk9PVEVSX01BR0lDICJZWiIKKyNkZWZpbmUgRk9PVEVSX01BR0lDX1NJWkUgMgorCisvKgorICogVmFyaWFibGUtbGVuZ3RoIGludGVnZXIgY2FuIGhvbGQgYSA2My1iaXQgdW5zaWduZWQgaW50ZWdlciBvciBhIHNwZWNpYWwKKyAqIHZhbHVlIGluZGljYXRpbmcgdGhhdCB0aGUgdmFsdWUgaXMgdW5rbm93bi4KKyAqCisgKiBFeHBlcmltZW50YWw6IHZsaV90eXBlIGNhbiBiZSBkZWZpbmVkIHRvIHVpbnQzMl90IHRvIHNhdmUgYSBmZXcgYnl0ZXMKKyAqIGluIGNvZGUgc2l6ZSAobm8gZWZmZWN0IG9uIHNwZWVkKS4gRG9pbmcgc28gbGltaXRzIHRoZSB1bmNvbXByZXNzZWQgYW5kCisgKiBjb21wcmVzc2VkIHNpemUgb2YgdGhlIGZpbGUgdG8gbGVzcyB0aGFuIDI1NiBNaUIgYW5kIG1heSBhbHNvIHdlYWtlbgorICogZXJyb3IgZGV0ZWN0aW9uIHNsaWdodGx5LgorICovCit0eXBlZGVmIHVpbnQ2NF90IHZsaV90eXBlOworCisjZGVmaW5lIFZMSV9NQVggKCh2bGlfdHlwZSktMSAvIDIpCisjZGVmaW5lIFZMSV9VTktOT1dOICgodmxpX3R5cGUpLTEpCisKKy8qIE1heGltdW0gZW5jb2RlZCBzaXplIG9mIGEgVkxJICovCisjZGVmaW5lIFZMSV9CWVRFU19NQVggKHNpemVvZih2bGlfdHlwZSkgKiA4IC8gNykKKworLyogSW50ZWdyaXR5IENoZWNrIHR5cGVzICovCitlbnVtIHh6X2NoZWNrIHsKKwlYWl9DSEVDS19OT05FID0gMCwKKwlYWl9DSEVDS19DUkMzMiA9IDEsCisJWFpfQ0hFQ0tfQ1JDNjQgPSA0LAorCVhaX0NIRUNLX1NIQTI1NiA9IDEwCit9OworCisvKiBNYXhpbXVtIHBvc3NpYmxlIENoZWNrIElEICovCisjZGVmaW5lIFhaX0NIRUNLX01BWCAxNQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2hpdmFsL2x6b3AuYyBiL2FyY2hpdmFsL2x6b3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2QxMWE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvbHpvcC5jCkBAIC0wLDAgKzEsMTEyMyBAQAorLyoKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBsem9wIGZpbGUgY29tcHJlc3Nvci4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2Li4yMDAzIE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6b3AvCisKKyAgIGx6b3AgYW5kIHRoZSBMWk8gbGlicmFyeSBhcmUgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgdGhlbQorICAgYW5kL29yIG1vZGlmeSB0aGVtIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisKKyAgICJNaW5pbWFsaXplZCIgZm9yIGJ1c3lib3ggYnkgQWxhaW4gS25hZmYKKyovCisKKy8vY29uZmlnOmNvbmZpZyBMWk9QCisvL2NvbmZpZzoJYm9vbCAibHpvcCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBMem9wIGNvbXByZXNzaW9uL2RlY29tcHJlc2lvbi4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIExaT1BfQ09NUFJfSElHSAorLy9jb25maWc6CWJvb2wgImx6b3AgY29tcHJlc3Npb24gbGV2ZWxzIDcsOCw5IChub3QgdmVyeSB1c2VmdWwpIgorLy9jb25maWc6CWRlZmF1bHQgbgorLy9jb25maWc6CWRlcGVuZHMgb24gTFpPUAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEhpZ2ggbGV2ZWxzICg3LDgsOSkgb2YgbHpvcCBjb21wcmVzc2lvbi4gVGhlc2UgbGV2ZWxzCisvL2NvbmZpZzoJICBhcmUgYWN0dWFsbHkgc2xvd2VyIHRoYW4gZ3ppcCBhdCBlcXVpdmFsZW50IGNvbXByZXNzaW9uIHJhdGlvcworLy9jb25maWc6CSAgYW5kIHRha2UgdXAgMy4ySyBvZiBjb2RlLgorCisvL2FwcGxldDpJRl9MWk9QKEFQUExFVChsem9wLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorLy9hcHBsZXQ6SUZfTFpPUChBUFBMRVRfT0RETkFNRShsem9wY2F0LCBsem9wLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBsem9wY2F0KSkKKy8vYXBwbGV0OklGX0xaT1AoQVBQTEVUX09ERE5BTUUodW5sem9wLCBsem9wLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCB1bmx6b3ApKQorLy9rYnVpbGQ6bGliLSQoQ09ORklHX0xaT1ApICs9IGx6b3AubworCisvL3VzYWdlOiNkZWZpbmUgbHpvcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jZnZkMTIzNDU2Nzg5Q0ZdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBsem9wX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS0xLi45CUNvbXByZXNzaW9uIGxldmVsIgorLy91c2FnZTogICAgICJcbgktZAlEZWNvbXByZXNzIgorLy91c2FnZTogICAgICJcbgktYwlXcml0ZSB0byBzdGRvdXQiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktRglEb24ndCBzdG9yZSBvciB2ZXJpZnkgY2hlY2tzdW0iCisvL3VzYWdlOiAgICAgIlxuCS1DCUFsc28gd3JpdGUgY2hlY2tzdW0gb2YgY29tcHJlc3NlZCBibG9jayIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbHpvcGNhdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy12Q0ZdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBsem9wY2F0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS12CVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS1GCURvbid0IHN0b3JlIG9yIHZlcmlmeSBjaGVja3N1bSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdW5sem9wX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWNmdkNGXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgdW5sem9wX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1jCVdyaXRlIHRvIHN0ZG91dCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UiCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS1GCURvbid0IHN0b3JlIG9yIHZlcmlmeSBjaGVja3N1bSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiYmJfYXJjaGl2ZS5oIgorI2luY2x1ZGUgImxpYmx6b19pbnRlcmZhY2UuaCIKKworLyogbHpvLTIuMDMvc3JjL2x6b19wdHIuaCAqLworI2RlZmluZSBwZChhLGIpCSAoKHVuc2lnbmVkKSgoYSktKGIpKSkKKworI2RlZmluZSBsem9fdmVyc2lvbigpCQkJTFpPX1ZFUlNJT04KKyNkZWZpbmUgbHpvX3NpemVvZl9kaWN0X3QJCShzaXplb2YodWludDhfdCopKQorCisvKiBsem8tMi4wMy9pbmNsdWRlL2x6by9sem8xeC5oICovCisjZGVmaW5lIExaTzFYXzFfTUVNX0NPTVBSRVNTCSgxNjM4NCAqIGx6b19zaXplb2ZfZGljdF90KQorI2RlZmluZSBMWk8xWF8xXzE1X01FTV9DT01QUkVTUyAoMzI3NjggKiBsem9fc2l6ZW9mX2RpY3RfdCkKKyNkZWZpbmUgTFpPMVhfOTk5X01FTV9DT01QUkVTUwkoMTQgKiAxNjM4NCAqIHNpemVvZihzaG9ydCkpCisKKy8qIGx6by0yLjAzL3NyYy9sem8xeF9vby5jICovCisjZGVmaW5lIE5PX0xJVCBVSU5UX01BWAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyB2b2lkIGNvcHkyKHVpbnQ4X3QqIGlwLCBjb25zdCB1aW50OF90KiBtX3BvcywgdW5zaWduZWQgb2ZmKQoreworCWlwWzBdID0gbV9wb3NbMF07CisJaWYgKG9mZiA9PSAxKQorCQlpcFsxXSA9IG1fcG9zWzBdOworCWVsc2UKKwkJaXBbMV0gPSBtX3Bvc1sxXTsKK30KKworc3RhdGljIHZvaWQgY29weTModWludDhfdCogaXAsIGNvbnN0IHVpbnQ4X3QqIG1fcG9zLCB1bnNpZ25lZCBvZmYpCit7CisJaXBbMF0gPSBtX3Bvc1swXTsKKwlpZiAob2ZmID09IDEpIHsKKwkJaXBbMl0gPSBpcFsxXSA9IG1fcG9zWzBdOworCX0KKwllbHNlIGlmIChvZmYgPT0gMikgeworCQlpcFsxXSA9IG1fcG9zWzFdOworCQlpcFsyXSA9IG1fcG9zWzBdOworCX0KKwllbHNlIHsKKwkJaXBbMV0gPSBtX3Bvc1sxXTsKKwkJaXBbMl0gPSBtX3Bvc1syXTsKKwl9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gb3B0aW1pemUgYSBibG9jayBvZiBkYXRhLgorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIFRFU1RfSVAJCShpcCA8IGlwX2VuZCkKKyNkZWZpbmUgVEVTVF9PUAkJKG9wIDw9IG9wX2VuZCkKKworc3RhdGljIE5PSU5MSU5FIGludCBsem8xeF9vcHRpbWl6ZSh1aW50OF90ICppbiwgdW5zaWduZWQgaW5fbGVuLAorCQl1aW50OF90ICpvdXQsIHVuc2lnbmVkICpvdXRfbGVuLAorCQl2b2lkKiB3cmttZW0gVU5VU0VEX1BBUkFNKQoreworCXVpbnQ4X3QqIG9wOworCXVpbnQ4X3QqIGlwOworCXVuc2lnbmVkIHQ7CisJdWludDhfdCogbV9wb3M7CisJdWludDhfdCogY29uc3QgaXBfZW5kID0gaW4gKyBpbl9sZW47CisJdWludDhfdCogY29uc3Qgb3BfZW5kID0gb3V0ICsgKm91dF9sZW47CisJdWludDhfdCogbGl0cCA9IE5VTEw7CisJdW5zaWduZWQgbGl0ID0gMDsKKwl1bnNpZ25lZCBuZXh0X2xpdCA9IE5PX0xJVDsKKwl1bnNpZ25lZCBubDsKKwl1bnNpZ25lZCBsb25nIG9fbTFfYSA9IDAsIG9fbTFfYiA9IDAsIG9fbTIgPSAwLCBvX20zX2EgPSAwLCBvX20zX2IgPSAwOworCisvLwlMWk9fVU5VU0VEKHdya21lbSk7CisKKwkqb3V0X2xlbiA9IDA7CisKKwlvcCA9IG91dDsKKwlpcCA9IGluOworCisJaWYgKCppcCA+IDE3KSB7CisJCXQgPSAqaXArKyAtIDE3OworCQlpZiAodCA8IDQpCisJCQlnb3RvIG1hdGNoX25leHQ7CisJCWdvdG8gZmlyc3RfbGl0ZXJhbF9ydW47CisJfQorCisJd2hpbGUgKFRFU1RfSVAgJiYgVEVTVF9PUCkgeworCQl0ID0gKmlwKys7CisJCWlmICh0ID49IDE2KQorCQkJZ290byBtYXRjaDsKKwkJLyogYSBsaXRlcmFsIHJ1biAqLworCQlsaXRwID0gaXAgLSAxOworCQlpZiAodCA9PSAwKSB7CisJCQl0ID0gMTU7CisJCQl3aGlsZSAoKmlwID09IDApCisJCQkJdCArPSAyNTUsIGlwKys7CisJCQl0ICs9ICppcCsrOworCQl9CisJCWxpdCA9IHQgKyAzOworCQkvKiBjb3B5IGxpdGVyYWxzICovCisgY29weV9saXRlcmFsX3J1bjoKKwkJKm9wKysgPSAqaXArKzsKKwkJKm9wKysgPSAqaXArKzsKKwkJKm9wKysgPSAqaXArKzsKKyBmaXJzdF9saXRlcmFsX3J1bjoKKwkJZG8gKm9wKysgPSAqaXArKzsgd2hpbGUgKC0tdCA+IDApOworCisJCXQgPSAqaXArKzsKKworCQlpZiAodCA+PSAxNikKKwkJCWdvdG8gbWF0Y2g7CisjaWYgZGVmaW5lZChMWk8xWCkKKwkJbV9wb3MgPSBvcCAtIDEgLSAweDgwMDsKKyNlbGlmIGRlZmluZWQoTFpPMVkpCisJCW1fcG9zID0gb3AgLSAxIC0gMHg0MDA7CisjZW5kaWYKKwkJbV9wb3MgLT0gdCA+PiAyOworCQltX3BvcyAtPSAqaXArKyA8PCAyOworCQkqb3ArKyA9ICptX3BvcysrOworCQkqb3ArKyA9ICptX3BvcysrOworCQkqb3ArKyA9ICptX3BvcysrOworCQlsaXQgPSAwOworCQlnb3RvIG1hdGNoX2RvbmU7CisKKworCQkvKiBoYW5kbGUgbWF0Y2hlcyAqLworCQlkbyB7CisJCQlpZiAodCA8IDE2KSB7IC8qIGEgTTEgbWF0Y2ggKi8KKwkJCQltX3BvcyA9IG9wIC0gMTsKKwkJCQltX3BvcyAtPSB0ID4+IDI7CisJCQkJbV9wb3MgLT0gKmlwKysgPDwgMjsKKworCQkJCWlmIChsaXRwID09IE5VTEwpCisJCQkJCWdvdG8gY29weV9tMTsKKworCQkJCW5sID0gaXBbLTJdICYgMzsKKwkJCQkvKiB0ZXN0IGlmIGEgbWF0Y2ggZm9sbG93cyAqLworCQkJCWlmIChubCA9PSAwICYmIGxpdCA9PSAxICYmIGlwWzBdID49IDE2KSB7CisJCQkJCW5leHRfbGl0ID0gbmw7CisJCQkJCS8qIGFkanVzdCBsZW5ndGggb2YgcHJldmlvdXMgc2hvcnQgcnVuICovCisJCQkJCWxpdCArPSAyOworCQkJCQkqbGl0cCA9ICh1bnNpZ25lZCBjaGFyKSgoKmxpdHAgJiB+MykgfCBsaXQpOworCQkJCQkvKiBjb3B5IG92ZXIgdGhlIDIgbGl0ZXJhbHMgdGhhdCByZXBsYWNlIHRoZSBtYXRjaCAqLworCQkJCQljb3B5MihpcC0yLCBtX3BvcywgcGQob3AsIG1fcG9zKSk7CisJCQkJCW9fbTFfYSsrOworCQkJCX0KKwkJCQkvKiB0ZXN0IGlmIGEgbGl0ZXJhbCBydW4gZm9sbG93cyAqLworCQkJCWVsc2UKKwkJCQlpZiAobmwgPT0gMAorCQkJCSAmJiBpcFswXSA8IDE2CisJCQkJICYmIGlwWzBdICE9IDAKKwkJCQkgJiYgKGxpdCArIDIgKyBpcFswXSA8IDE2KQorCQkJCSkgeworCQkJCQl0ID0gKmlwKys7CisJCQkJCS8qIHJlbW92ZSBzaG9ydCBydW4gKi8KKwkJCQkJKmxpdHAgJj0gfjM7CisJCQkJCS8qIGNvcHkgb3ZlciB0aGUgMiBsaXRlcmFscyB0aGF0IHJlcGxhY2UgdGhlIG1hdGNoICovCisJCQkJCWNvcHkyKGlwLTMrMSwgbV9wb3MsIHBkKG9wLCBtX3BvcykpOworCQkJCQkvKiBtb3ZlIGxpdGVyYWxzIDEgYnl0ZSBhaGVhZCAqLworCQkJCQlsaXRwICs9IDI7CisJCQkJCWlmIChsaXQgPiAwKQorCQkJCQkJbWVtbW92ZShsaXRwKzEsIGxpdHAsIGxpdCk7CisJCQkJCS8qIGluc2VydCBuZXcgbGVuZ3RoIG9mIGxvbmcgbGl0ZXJhbCBydW4gKi8KKwkJCQkJbGl0ICs9IDIgKyB0ICsgMzsKKwkJCQkJKmxpdHAgPSAodW5zaWduZWQgY2hhcikobGl0IC0gMyk7CisKKwkJCQkJb19tMV9iKys7CisJCQkJCSpvcCsrID0gKm1fcG9zKys7CisJCQkJCSpvcCsrID0gKm1fcG9zKys7CisJCQkJCWdvdG8gY29weV9saXRlcmFsX3J1bjsKKwkJCQl9CisgY29weV9tMToKKwkJCQkqb3ArKyA9ICptX3BvcysrOworCQkJCSpvcCsrID0gKm1fcG9zKys7CisJCQl9IGVsc2UgeworIG1hdGNoOgorCQkJCWlmICh0ID49IDY0KSB7CQkJCS8qIGEgTTIgbWF0Y2ggKi8KKwkJCQkJbV9wb3MgPSBvcCAtIDE7CisjaWYgZGVmaW5lZChMWk8xWCkKKwkJCQkJbV9wb3MgLT0gKHQgPj4gMikgJiA3OworCQkJCQltX3BvcyAtPSAqaXArKyA8PCAzOworCQkJCQl0ID0gKHQgPj4gNSkgLSAxOworI2VsaWYgZGVmaW5lZChMWk8xWSkKKwkJCQkJbV9wb3MgLT0gKHQgPj4gMikgJiAzOworCQkJCQltX3BvcyAtPSAqaXArKyA8PCAyOworCQkJCQl0ID0gKHQgPj4gNCkgLSAzOworI2VuZGlmCisJCQkJCWlmIChsaXRwID09IE5VTEwpCisJCQkJCQlnb3RvIGNvcHlfbTsKKworCQkJCQlubCA9IGlwWy0yXSAmIDM7CisJCQkJCS8qIHRlc3QgaWYgaW4gYmVldHdlZW4gdHdvIGxvbmcgbGl0ZXJhbCBydW5zICovCisJCQkJCWlmICh0ID09IDEgJiYgbGl0ID4gMyAmJiBubCA9PSAwCisJCQkJCSAmJiBpcFswXSA8IDE2ICYmIGlwWzBdICE9IDAgJiYgKGxpdCArIDMgKyBpcFswXSA8IDE2KQorCQkJCQkpIHsKKwkJCQkJCXQgPSAqaXArKzsKKwkJCQkJCS8qIGNvcHkgb3ZlciB0aGUgMyBsaXRlcmFscyB0aGF0IHJlcGxhY2UgdGhlIG1hdGNoICovCisJCQkJCQljb3B5MyhpcC0xLTIsIG1fcG9zLCBwZChvcCwgbV9wb3MpKTsKKwkJCQkJCS8qIHNldCBuZXcgbGVuZ3RoIG9mIHByZXZpb3VzIGxpdGVyYWwgcnVuICovCisJCQkJCQlsaXQgKz0gMyArIHQgKyAzOworCQkJCQkJKmxpdHAgPSAodW5zaWduZWQgY2hhcikobGl0IC0gMyk7CisJCQkJCQlvX20yKys7CisJCQkJCQkqb3ArKyA9ICptX3BvcysrOworCQkJCQkJKm9wKysgPSAqbV9wb3MrKzsKKwkJCQkJCSpvcCsrID0gKm1fcG9zKys7CisJCQkJCQlnb3RvIGNvcHlfbGl0ZXJhbF9ydW47CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlpZiAodCA+PSAzMikgewkJCS8qIGEgTTMgbWF0Y2ggKi8KKwkJCQkJCXQgJj0gMzE7CisJCQkJCQlpZiAodCA9PSAwKSB7CisJCQkJCQkJdCA9IDMxOworCQkJCQkJCXdoaWxlICgqaXAgPT0gMCkKKwkJCQkJCQkJdCArPSAyNTUsIGlwKys7CisJCQkJCQkJdCArPSAqaXArKzsKKwkJCQkJCX0KKwkJCQkJCW1fcG9zID0gb3AgLSAxOworCQkJCQkJbV9wb3MgLT0gKmlwKysgPj4gMjsKKwkJCQkJCW1fcG9zIC09ICppcCsrIDw8IDY7CisJCQkJCX0gZWxzZSB7CQkJCQkvKiBhIE00IG1hdGNoICovCisJCQkJCQltX3BvcyA9IG9wOworCQkJCQkJbV9wb3MgLT0gKHQgJiA4KSA8PCAxMTsKKwkJCQkJCXQgJj0gNzsKKwkJCQkJCWlmICh0ID09IDApIHsKKwkJCQkJCQl0ID0gNzsKKwkJCQkJCQl3aGlsZSAoKmlwID09IDApCisJCQkJCQkJCXQgKz0gMjU1LCBpcCsrOworCQkJCQkJCXQgKz0gKmlwKys7CisJCQkJCQl9CisJCQkJCQltX3BvcyAtPSAqaXArKyA+PiAyOworCQkJCQkJbV9wb3MgLT0gKmlwKysgPDwgNjsKKwkJCQkJCWlmIChtX3BvcyA9PSBvcCkKKwkJCQkJCQlnb3RvIGVvZl9mb3VuZDsKKwkJCQkJCW1fcG9zIC09IDB4NDAwMDsKKwkJCQkJfQorCQkJCQlpZiAobGl0cCA9PSBOVUxMKQorCQkJCQkJZ290byBjb3B5X207CisKKwkJCQkJbmwgPSBpcFstMl0gJiAzOworCQkJCQkvKiB0ZXN0IGlmIGluIGJlZXR3ZWVuIHR3byBtYXRjaGVzICovCisJCQkJCWlmICh0ID09IDEgJiYgbGl0ID09IDAgJiYgbmwgPT0gMCAmJiBpcFswXSA+PSAxNikgeworCQkJCQkJbmV4dF9saXQgPSBubDsKKwkJCQkJCS8qIG1ha2UgYSBwcmV2aW91cyBzaG9ydCBydW4gKi8KKwkJCQkJCWxpdCArPSAzOworCQkJCQkJKmxpdHAgPSAodW5zaWduZWQgY2hhcikoKCpsaXRwICYgfjMpIHwgbGl0KTsKKwkJCQkJCS8qIGNvcHkgb3ZlciB0aGUgMyBsaXRlcmFscyB0aGF0IHJlcGxhY2UgdGhlIG1hdGNoICovCisJCQkJCQljb3B5MyhpcC0zLCBtX3BvcywgcGQob3AsIG1fcG9zKSk7CisJCQkJCQlvX20zX2ErKzsKKwkJCQkJfQorCQkJCQkvKiB0ZXN0IGlmIGEgbGl0ZXJhbCBydW4gZm9sbG93cyAqLworCQkJCQllbHNlIGlmICh0ID09IDEgJiYgbGl0IDw9IDMgJiYgbmwgPT0gMAorCQkJCQkgJiYgaXBbMF0gPCAxNiAmJiBpcFswXSAhPSAwICYmIChsaXQgKyAzICsgaXBbMF0gPCAxNikKKwkJCQkJKSB7CisJCQkJCQl0ID0gKmlwKys7CisJCQkJCQkvKiByZW1vdmUgc2hvcnQgcnVuICovCisJCQkJCQkqbGl0cCAmPSB+MzsKKwkJCQkJCS8qIGNvcHkgb3ZlciB0aGUgMyBsaXRlcmFscyB0aGF0IHJlcGxhY2UgdGhlIG1hdGNoICovCisJCQkJCQljb3B5MyhpcC00KzEsIG1fcG9zLCBwZChvcCwgbV9wb3MpKTsKKwkJCQkJCS8qIG1vdmUgbGl0ZXJhbHMgMSBieXRlIGFoZWFkICovCisJCQkJCQlsaXRwICs9IDI7CisJCQkJCQlpZiAobGl0ID4gMCkKKwkJCQkJCQltZW1tb3ZlKGxpdHArMSxsaXRwLGxpdCk7CisJCQkJCQkvKiBpbnNlcnQgbmV3IGxlbmd0aCBvZiBsb25nIGxpdGVyYWwgcnVuICovCisJCQkJCQlsaXQgKz0gMyArIHQgKyAzOworCQkJCQkJKmxpdHAgPSAodW5zaWduZWQgY2hhcikobGl0IC0gMyk7CisKKwkJCQkJCW9fbTNfYisrOworCQkJCQkJKm9wKysgPSAqbV9wb3MrKzsKKwkJCQkJCSpvcCsrID0gKm1fcG9zKys7CisJCQkJCQkqb3ArKyA9ICptX3BvcysrOworCQkJCQkJZ290byBjb3B5X2xpdGVyYWxfcnVuOworCQkJCQl9CisJCQkJfQorIGNvcHlfbToKKwkJCQkqb3ArKyA9ICptX3BvcysrOworCQkJCSpvcCsrID0gKm1fcG9zKys7CisJCQkJZG8gKm9wKysgPSAqbV9wb3MrKzsgd2hpbGUgKC0tdCA+IDApOworCQkJfQorCisgbWF0Y2hfZG9uZToKKwkJCWlmIChuZXh0X2xpdCA9PSBOT19MSVQpIHsKKwkJCQl0ID0gaXBbLTJdICYgMzsKKwkJCQlsaXQgPSB0OworCQkJCWxpdHAgPSBpcCAtIDI7CisJCQl9CisJCQllbHNlCisJCQkJdCA9IG5leHRfbGl0OworCQkJbmV4dF9saXQgPSBOT19MSVQ7CisJCQlpZiAodCA9PSAwKQorCQkJCWJyZWFrOworCQkJLyogY29weSBsaXRlcmFscyAqLworIG1hdGNoX25leHQ6CisJCQlkbyAqb3ArKyA9ICppcCsrOyB3aGlsZSAoLS10ID4gMCk7CisJCQl0ID0gKmlwKys7CisJCX0gd2hpbGUgKFRFU1RfSVAgJiYgVEVTVF9PUCk7CisJfQorCisJLyogbm8gRU9GIGNvZGUgd2FzIGZvdW5kICovCisJKm91dF9sZW4gPSBwZChvcCwgb3V0KTsKKwlyZXR1cm4gTFpPX0VfRU9GX05PVF9GT1VORDsKKworIGVvZl9mb3VuZDoKKy8vCUxaT19VTlVTRUQob19tMV9hKTsgTFpPX1VOVVNFRChvX20xX2IpOyBMWk9fVU5VU0VEKG9fbTIpOworLy8JTFpPX1VOVVNFRChvX20zX2EpOyBMWk9fVU5VU0VEKG9fbTNfYik7CisJKm91dF9sZW4gPSBwZChvcCwgb3V0KTsKKwlyZXR1cm4gKGlwID09IGlwX2VuZCA/IExaT19FX09LIDoKKwkJKGlwIDwgaXBfZW5kID8gTFpPX0VfSU5QVVRfTk9UX0NPTlNVTUVEIDogTFpPX0VfSU5QVVRfT1ZFUlJVTikpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgRl9PUyBGX09TX1VOSVgKKyNkZWZpbmUgRl9DUyBGX0NTX05BVElWRQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgQURMRVIzMl9JTklUX1ZBTFVFIDEKKyNkZWZpbmUgQ1JDMzJfSU5JVF9WQUxVRSAgIDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitlbnVtIHsKKwlNX0xaTzFYXzEgICAgPSAxLAorCU1fTFpPMVhfMV8xNSA9IDIsCisJTV9MWk8xWF85OTkgID0gMywKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogaGVhZGVyIGZsYWdzICovCisjZGVmaW5lIEZfQURMRVIzMl9EICAgICAweDAwMDAwMDAxTAorI2RlZmluZSBGX0FETEVSMzJfQyAgICAgMHgwMDAwMDAwMkwKKyNkZWZpbmUgRl9IX0VYVFJBX0ZJRUxEIDB4MDAwMDAwNDBMCisjZGVmaW5lIEZfSF9HTVRESUZGICAgICAweDAwMDAwMDgwTAorI2RlZmluZSBGX0NSQzMyX0QgICAgICAgMHgwMDAwMDEwMEwKKyNkZWZpbmUgRl9DUkMzMl9DICAgICAgIDB4MDAwMDAyMDBMCisjZGVmaW5lIEZfSF9GSUxURVIgICAgICAweDAwMDAwODAwTAorI2RlZmluZSBGX0hfQ1JDMzIgICAgICAgMHgwMDAwMTAwMEwKKyNkZWZpbmUgRl9NQVNLICAgICAgICAgIDB4MDAwMDNGRkZMCisKKy8qIG9wZXJhdGluZyBzeXN0ZW0gJiBmaWxlIHN5c3RlbSB0aGF0IGNyZWF0ZWQgdGhlIGZpbGUgW21vc3RseSB1bnVzZWRdICovCisjZGVmaW5lIEZfT1NfVU5JWCAgICAgICAweDAzMDAwMDAwTAorI2RlZmluZSBGX09TX1NISUZUICAgICAgMjQKKyNkZWZpbmUgRl9PU19NQVNLICAgICAgIDB4ZmYwMDAwMDBMCisKKy8qIGNoYXJhY3RlciBzZXQgZm9yIGZpbGUgbmFtZSBlbmNvZGluZyBbbW9zdGx5IHVudXNlZF0gKi8KKyNkZWZpbmUgRl9DU19OQVRJVkUgICAgIDB4MDAwMDAwMDBMCisjZGVmaW5lIEZfQ1NfU0hJRlQgICAgICAyMAorI2RlZmluZSBGX0NTX01BU0sgICAgICAgMHgwMGYwMDAwMEwKKworLyogdGhlc2UgYml0cyBtdXN0IGJlIHplcm8gKi8KKyNkZWZpbmUgRl9SRVNFUlZFRCAgICAgICgoRl9NQVNLIHwgRl9PU19NQVNLIHwgRl9DU19NQVNLKSBeIDB4ZmZmZmZmZmZMKQorCit0eXBlZGVmIHN0cnVjdCBjaGtzdW1fdCB7CisJdWludDMyX3QgZl9hZGxlcjMyOworCXVpbnQzMl90IGZfY3JjMzI7Cit9IGNoa3N1bV90OworCit0eXBlZGVmIHN0cnVjdCBoZWFkZXJfdCB7CisJdW5zaWduZWQgdmVyc2lvbjsKKwl1bnNpZ25lZCBsaWJfdmVyc2lvbjsKKwl1bnNpZ25lZCB2ZXJzaW9uX25lZWRlZF90b19leHRyYWN0OworCXVpbnQzMl90IGZsYWdzOworCXVpbnQzMl90IG1vZGU7CisJdWludDMyX3QgbXRpbWU7CisJdWludDMyX3QgZ210ZGlmZjsKKwl1aW50MzJfdCBoZWFkZXJfY2hlY2tzdW07CisKKwl1aW50MzJfdCBleHRyYV9maWVsZF9sZW47CisJdWludDMyX3QgZXh0cmFfZmllbGRfY2hlY2tzdW07CisKKwl1bnNpZ25lZCBjaGFyIG1ldGhvZDsKKwl1bnNpZ25lZCBjaGFyIGxldmVsOworCisJLyogaW5mbyAqLworCWNoYXIgbmFtZVsyNTUrMV07Cit9IGhlYWRlcl90OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJLypjb25zdCB1aW50MzJfdCAqbHpvX2NyYzMyX3RhYmxlOyovCisJY2hrc3VtX3QgY2hrc3VtX2luOworCWNoa3N1bV90IGNoa3N1bV9vdXQ7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBJTklUX0coKSBkbyB7IH0gd2hpbGUgKDApCisvLyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorLy8jZGVmaW5lIElOSVRfRygpIGRvIHsKKy8vCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOworLy99IHdoaWxlICgwKQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBMWk9QX1ZFUlNJT04gICAgICAgICAgICAweDEwMTAKKy8vI2RlZmluZSBMWk9QX1ZFUlNJT05fU1RSSU5HICAgICAiMS4wMSIKKy8vI2RlZmluZSBMWk9QX1ZFUlNJT05fREFURSAgICAgICAiQXByIDI3dGggMjAwMyIKKworI2RlZmluZSBPUFRJT05fU1RSSU5HICJjZnZxZHQxMjM0NTY3ODlDRiIKKworLyogTm90ZTogbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCBhcmNoaXZhbC9iYnVuemlwLmMgKi8KK2VudW0geworCU9QVF9TVERPVVQgICAgICA9ICgxIDw8IDApLAorCU9QVF9GT1JDRSAgICAgICA9ICgxIDw8IDEpLAorCU9QVF9WRVJCT1NFICAgICA9ICgxIDw8IDIpLAorCU9QVF9RVUlFVCAgICAgICA9ICgxIDw8IDMpLAorCU9QVF9ERUNPTVBSRVNTICA9ICgxIDw8IDQpLAorCU9QVF9URVNUICAgICAgICA9ICgxIDw8IDUpLAorCU9QVF8xICAgICAgICAgICA9ICgxIDw8IDYpLAorCU9QVF8yICAgICAgICAgICA9ICgxIDw8IDcpLAorCU9QVF8zICAgICAgICAgICA9ICgxIDw8IDgpLAorCU9QVF80ICAgICAgICAgICA9ICgxIDw8IDkpLAorCU9QVF81ICAgICAgICAgICA9ICgxIDw8IDEwKSwKKwlPUFRfNiAgICAgICAgICAgPSAoMSA8PCAxMSksCisJT1BUXzc4OSAgICAgICAgID0gKDcgPDwgMTIpLAorCU9QVF83ICAgICAgICAgICA9ICgxIDw8IDEzKSwKKwlPUFRfOCAgICAgICAgICAgPSAoMSA8PCAxNCksCisJT1BUX0MgICAgICAgICAgID0gKDEgPDwgMTUpLAorCU9QVF9GICAgICAgICAgICA9ICgxIDw8IDE2KSwKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gYWRsZXIzMiBjaGVja3N1bQorLy8gYWRhcHRlZCBmcm9tIGZyZWUgY29kZSBieSBNYXJrIEFkbGVyIDxtYWRsZXJAYWx1bW5pLmNhbHRlY2guZWR1PgorLy8gc2VlIGh0dHA6Ly93d3cuemxpYi5vcmcvCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBGQVNUX0ZVTkMgdWludDMyX3QKK2x6b19hZGxlcjMyKHVpbnQzMl90IGFkbGVyLCBjb25zdCB1aW50OF90KiBidWYsIHVuc2lnbmVkIGxlbikKK3sKKwllbnVtIHsKKwkJTFpPX0JBU0UgPSA2NTUyMSwgLyogbGFyZ2VzdCBwcmltZSBzbWFsbGVyIHRoYW4gNjU1MzYgKi8KKwkJLyogTk1BWCBpcyB0aGUgbGFyZ2VzdCBuIHN1Y2ggdGhhdAorCQkgKiAyNTVuKG4rMSkvMiArIChuKzEpKEJBU0UtMSkgPD0gMl4zMi0xICovCisJCUxaT19OTUFYID0gNTU1MiwKKwl9OworCXVpbnQzMl90IHMxID0gYWRsZXIgJiAweGZmZmY7CisJdWludDMyX3QgczIgPSAoYWRsZXIgPj4gMTYpICYgMHhmZmZmOworCXVuc2lnbmVkIGs7CisKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiAxOworCisJd2hpbGUgKGxlbiA+IDApIHsKKwkJayA9IGxlbiA8IExaT19OTUFYID8gKHVuc2lnbmVkKSBsZW4gOiBMWk9fTk1BWDsKKwkJbGVuIC09IGs7CisJCWlmIChrICE9IDApIGRvIHsKKwkJCXMxICs9ICpidWYrKzsKKwkJCXMyICs9IHMxOworCQl9IHdoaWxlICgtLWsgPiAwKTsKKwkJczEgJT0gTFpPX0JBU0U7CisJCXMyICU9IExaT19CQVNFOworCX0KKwlyZXR1cm4gKHMyIDw8IDE2KSB8IHMxOworfQorCitzdGF0aWMgRkFTVF9GVU5DIHVpbnQzMl90Citsem9fY3JjMzIodWludDMyX3QgYywgY29uc3QgdWludDhfdCogYnVmLCB1bnNpZ25lZCBsZW4pCit7CisJLy9pZiAoYnVmID09IE5VTEwpIC0gaW1wb3NzaWJsZQorCS8vCXJldHVybiAwOworCisJcmV0dXJuIH5jcmMzMl9ibG9ja19lbmRpYW4wKH5jLCBidWYsIGxlbiwgZ2xvYmFsX2NyYzMyX3RhYmxlKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgdm9pZCBpbml0X2Noa3N1bShjaGtzdW1fdCAqY3QpCit7CisJY3QtPmZfYWRsZXIzMiA9IEFETEVSMzJfSU5JVF9WQUxVRTsKKwljdC0+Zl9jcmMzMiA9IENSQzMyX0lOSVRfVkFMVUU7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9ieXRlc190b19jaGtzdW0oY2hrc3VtX3QgKmN0LCBjb25zdCB2b2lkKiBidWYsIGludCBjbnQpCit7CisJLyogV2UgbmVlZCB0byBoYW5kbGUgdGhlIHR3byBjaGVja3N1bXMgYXQgb25jZSwgYmVjYXVzZSBhdCB0aGUKKwkgKiBiZWdpbm5pbmcgb2YgdGhlIGhlYWRlciwgd2UgZG9uJ3Qga25vdyB5ZXQgd2hpY2ggb25lIHdlJ2xsCisJICogZXZlbnR1YWxseSBuZWVkICovCisJY3QtPmZfYWRsZXIzMiA9IGx6b19hZGxlcjMyKGN0LT5mX2FkbGVyMzIsIChjb25zdCB1aW50OF90KilidWYsIGNudCk7CisJY3QtPmZfY3JjMzIgPSBsem9fY3JjMzIoY3QtPmZfY3JjMzIsIChjb25zdCB1aW50OF90KilidWYsIGNudCk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBjaGtzdW1fZ2V0cmVzdWx0KGNoa3N1bV90ICpjdCwgY29uc3QgaGVhZGVyX3QgKmgpCit7CisJcmV0dXJuIChoLT5mbGFncyAmIEZfSF9DUkMzMikgPyBjdC0+Zl9jcmMzMiA6IGN0LT5mX2FkbGVyMzI7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHVpbnQzMl90IHJlYWQzMih2b2lkKQoreworCXVpbnQzMl90IHY7CisJeHJlYWQoMCwgJnYsIDQpOworCXJldHVybiBudG9obCh2KTsKK30KKworc3RhdGljIHZvaWQgd3JpdGUzMih1aW50MzJfdCB2KQoreworCXYgPSBodG9ubCh2KTsKKwl4d3JpdGUoMSwgJnYsIDQpOworfQorCitzdGF0aWMgdm9pZCBmX3dyaXRlKGNvbnN0IHZvaWQqIGJ1ZiwgaW50IGNudCkKK3sKKwl4d3JpdGUoMSwgYnVmLCBjbnQpOworCWFkZF9ieXRlc190b19jaGtzdW0oJkcuY2hrc3VtX291dCwgYnVmLCBjbnQpOworfQorCitzdGF0aWMgdm9pZCBmX3JlYWQodm9pZCogYnVmLCBpbnQgY250KQoreworCXhyZWFkKDAsIGJ1ZiwgY250KTsKKwlhZGRfYnl0ZXNfdG9fY2hrc3VtKCZHLmNoa3N1bV9pbiwgYnVmLCBjbnQpOworfQorCitzdGF0aWMgaW50IGZfcmVhZDgodm9pZCkKK3sKKwl1aW50OF90IHY7CisJZl9yZWFkKCZ2LCAxKTsKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIHZvaWQgZl93cml0ZTgodWludDhfdCB2KQoreworCWZfd3JpdGUoJnYsIDEpOworfQorCitzdGF0aWMgdW5zaWduZWQgZl9yZWFkMTYodm9pZCkKK3sKKwl1aW50MTZfdCB2OworCWZfcmVhZCgmdiwgMik7CisJcmV0dXJuIG50b2hzKHYpOworfQorCitzdGF0aWMgdm9pZCBmX3dyaXRlMTYodWludDE2X3QgdikKK3sKKwl2ID0gaHRvbnModik7CisJZl93cml0ZSgmdiwgMik7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBmX3JlYWQzMih2b2lkKQoreworCXVpbnQzMl90IHY7CisJZl9yZWFkKCZ2LCA0KTsKKwlyZXR1cm4gbnRvaGwodik7Cit9CisKK3N0YXRpYyB2b2lkIGZfd3JpdGUzMih1aW50MzJfdCB2KQoreworCXYgPSBodG9ubCh2KTsKKwlmX3dyaXRlKCZ2LCA0KTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgaW50IGx6b19nZXRfbWV0aG9kKGhlYWRlcl90ICpoKQoreworCS8qIGNoZWNrIG1ldGhvZCAqLworCWlmIChoLT5tZXRob2QgPT0gTV9MWk8xWF8xKSB7CisJCWlmIChoLT5sZXZlbCA9PSAwKQorCQkJaC0+bGV2ZWwgPSAzOworCX0gZWxzZSBpZiAoaC0+bWV0aG9kID09IE1fTFpPMVhfMV8xNSkgeworCQlpZiAoaC0+bGV2ZWwgPT0gMCkKKwkJCWgtPmxldmVsID0gMTsKKwl9IGVsc2UgaWYgKGgtPm1ldGhvZCA9PSBNX0xaTzFYXzk5OSkgeworCQlpZiAoaC0+bGV2ZWwgPT0gMCkKKwkJCWgtPmxldmVsID0gOTsKKwl9IGVsc2UKKwkJcmV0dXJuIC0xOwkJLyogbm90IGEgTFpPIG1ldGhvZCAqLworCisJLyogY2hlY2sgY29tcHJlc3Npb24gbGV2ZWwgKi8KKwlpZiAoaC0+bGV2ZWwgPCAxIHx8IGgtPmxldmVsID4gOSkKKwkJcmV0dXJuIDE1OworCisJcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBMWk9fQkxPQ0tfU0laRQkoMjU2ICogMTAyNGwpCisjZGVmaW5lIE1BWF9CTE9DS19TSVpFCSg2NCAqIDEwMjRsICogMTAyNGwpCS8qIERPIE5PVCBDSEFOR0UgKi8KKworLyogTFpPIG1heSBleHBhbmQgdW5jb21wcmVzc2libGUgZGF0YSBieSBhIHNtYWxsIGFtb3VudCAqLworI2RlZmluZSBNQVhfQ09NUFJFU1NFRF9TSVpFKHgpCSgoeCkgKyAoeCkgLyAxNiArIDY0ICsgMykKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvLyBjb21wcmVzcyBhIGZpbGUKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIE5PSU5MSU5FIHNtYWxsaW50IGx6b19jb21wcmVzcyhjb25zdCBoZWFkZXJfdCAqaCkKK3sKKwl1bnNpZ25lZCBibG9ja19zaXplID0gTFpPX0JMT0NLX1NJWkU7CisJaW50IHIgPSAwOyAvKiBMWk9fRV9PSyAqLworCXVpbnQ4X3QgKmNvbnN0IGIxID0geHphbGxvYyhibG9ja19zaXplKTsKKwl1aW50OF90ICpjb25zdCBiMiA9IHh6YWxsb2MoTUFYX0NPTVBSRVNTRURfU0laRShibG9ja19zaXplKSk7CisJdW5zaWduZWQgc3JjX2xlbiA9IDAsIGRzdF9sZW4gPSAwOworCXVpbnQzMl90IGRfYWRsZXIzMiA9IEFETEVSMzJfSU5JVF9WQUxVRTsKKwl1aW50MzJfdCBkX2NyYzMyID0gQ1JDMzJfSU5JVF9WQUxVRTsKKwlpbnQgbDsKKwlzbWFsbGludCBvayA9IDE7CisJdWludDhfdCAqd3JrX21lbSA9IE5VTEw7CisKKwlpZiAoaC0+bWV0aG9kID09IE1fTFpPMVhfMSkKKwkJd3JrX21lbSA9IHh6YWxsb2MoTFpPMVhfMV9NRU1fQ09NUFJFU1MpOworCWVsc2UgaWYgKGgtPm1ldGhvZCA9PSBNX0xaTzFYXzFfMTUpCisJCXdya19tZW0gPSB4emFsbG9jKExaTzFYXzFfMTVfTUVNX0NPTVBSRVNTKTsKKwllbHNlIGlmIChoLT5tZXRob2QgPT0gTV9MWk8xWF85OTkpCisJCXdya19tZW0gPSB4emFsbG9jKExaTzFYXzk5OV9NRU1fQ09NUFJFU1MpOworCisJZm9yICg7OykgeworCQkvKiByZWFkIGEgYmxvY2sgKi8KKwkJbCA9IGZ1bGxfcmVhZCgwLCBiMSwgYmxvY2tfc2l6ZSk7CisJCXNyY19sZW4gPSAobCA+IDAgPyBsIDogMCk7CisKKwkJLyogd3JpdGUgdW5jb21wcmVzc2VkIGJsb2NrIHNpemUgKi8KKwkJd3JpdGUzMihzcmNfbGVuKTsKKworCQkvKiBleGl0IGlmIGxhc3QgYmxvY2sgKi8KKwkJaWYgKHNyY19sZW4gPT0gMCkKKwkJCWJyZWFrOworCisJCS8qIGNvbXB1dGUgY2hlY2tzdW0gb2YgdW5jb21wcmVzc2VkIGJsb2NrICovCisJCWlmIChoLT5mbGFncyAmIEZfQURMRVIzMl9EKQorCQkJZF9hZGxlcjMyID0gbHpvX2FkbGVyMzIoQURMRVIzMl9JTklUX1ZBTFVFLCBiMSwgc3JjX2xlbik7CisJCWlmIChoLT5mbGFncyAmIEZfQ1JDMzJfRCkKKwkJCWRfY3JjMzIgPSBsem9fY3JjMzIoQ1JDMzJfSU5JVF9WQUxVRSwgYjEsIHNyY19sZW4pOworCisJCS8qIGNvbXByZXNzICovCisJCWlmIChoLT5tZXRob2QgPT0gTV9MWk8xWF8xKQorCQkJciA9IGx6bzF4XzFfY29tcHJlc3MoYjEsIHNyY19sZW4sIGIyLCAmZHN0X2xlbiwgd3JrX21lbSk7CisJCWVsc2UgaWYgKGgtPm1ldGhvZCA9PSBNX0xaTzFYXzFfMTUpCisJCQlyID0gbHpvMXhfMV8xNV9jb21wcmVzcyhiMSwgc3JjX2xlbiwgYjIsICZkc3RfbGVuLCB3cmtfbWVtKTsKKyNpZiBFTkFCTEVfTFpPUF9DT01QUl9ISUdICisJCWVsc2UgaWYgKGgtPm1ldGhvZCA9PSBNX0xaTzFYXzk5OSkKKwkJCXIgPSBsem8xeF85OTlfY29tcHJlc3NfbGV2ZWwoYjEsIHNyY19sZW4sIGIyLCAmZHN0X2xlbiwKKwkJCQkJCXdya19tZW0sIGgtPmxldmVsKTsKKyNlbmRpZgorCQllbHNlCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW50ZXJuYWwgZXJyb3IiKTsKKworCQlpZiAociAhPSAwKSAvKiBub3QgTFpPX0VfT0sgKi8KKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnRlcm5hbCBlcnJvciAtIGNvbXByZXNzaW9uIGZhaWxlZCIpOworCisJCS8qIHdyaXRlIGNvbXByZXNzZWQgYmxvY2sgc2l6ZSAqLworCQlpZiAoZHN0X2xlbiA8IHNyY19sZW4pIHsKKwkJCS8qIG9wdGltaXplICovCisJCQlpZiAoaC0+bWV0aG9kID09IE1fTFpPMVhfOTk5KSB7CisJCQkJdW5zaWduZWQgbmV3X2xlbiA9IHNyY19sZW47CisJCQkJciA9IGx6bzF4X29wdGltaXplKGIyLCBkc3RfbGVuLCBiMSwgJm5ld19sZW4sIE5VTEwpOworCQkJCWlmIChyICE9IDAgLypMWk9fRV9PSyovIHx8IG5ld19sZW4gIT0gc3JjX2xlbikKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludGVybmFsIGVycm9yIC0gb3B0aW1pemF0aW9uIGZhaWxlZCIpOworCQkJfQorCQkJd3JpdGUzMihkc3RfbGVuKTsKKwkJfSBlbHNlIHsKKwkJCS8qIGRhdGEgYWN0dWFsbHkgZXhwYW5kZWQgPT4gc3RvcmUgZGF0YSB1bmNvbXByZXNzZWQgKi8KKwkJCXdyaXRlMzIoc3JjX2xlbik7CisJCX0KKworCQkvKiB3cml0ZSBjaGVja3N1bSBvZiB1bmNvbXByZXNzZWQgYmxvY2sgKi8KKwkJaWYgKGgtPmZsYWdzICYgRl9BRExFUjMyX0QpCisJCQl3cml0ZTMyKGRfYWRsZXIzMik7CisJCWlmIChoLT5mbGFncyAmIEZfQ1JDMzJfRCkKKwkJCXdyaXRlMzIoZF9jcmMzMik7CisKKwkJaWYgKGRzdF9sZW4gPCBzcmNfbGVuKSB7CisJCQkvKiB3cml0ZSBjaGVja3N1bSBvZiBjb21wcmVzc2VkIGJsb2NrICovCisJCQlpZiAoaC0+ZmxhZ3MgJiBGX0FETEVSMzJfQykKKwkJCQl3cml0ZTMyKGx6b19hZGxlcjMyKEFETEVSMzJfSU5JVF9WQUxVRSwgYjIsIGRzdF9sZW4pKTsKKwkJCWlmIChoLT5mbGFncyAmIEZfQ1JDMzJfQykKKwkJCQl3cml0ZTMyKGx6b19jcmMzMihDUkMzMl9JTklUX1ZBTFVFLCBiMiwgZHN0X2xlbikpOworCQkJLyogd3JpdGUgY29tcHJlc3NlZCBibG9jayBkYXRhICovCisJCQl4d3JpdGUoMSwgYjIsIGRzdF9sZW4pOworCQl9IGVsc2UgeworCQkJLyogd3JpdGUgdW5jb21wcmVzc2VkIGJsb2NrIGRhdGEgKi8KKwkJCXh3cml0ZSgxLCBiMSwgc3JjX2xlbik7CisJCX0KKwl9CisKKwlmcmVlKHdya19tZW0pOworCWZyZWUoYjEpOworCWZyZWUoYjIpOworCXJldHVybiBvazsKK30KKworc3RhdGljIEZBU1RfRlVOQyB2b2lkIGx6b19jaGVjaygKKwkJdWludDMyX3QgaW5pdCwKKwkJdWludDhfdCogYnVmLCB1bnNpZ25lZCBsZW4sCisJCXVpbnQzMl90IEZBU1RfRlVOQyAoKmZuKSh1aW50MzJfdCwgY29uc3QgdWludDhfdCosIHVuc2lnbmVkKSwKKwkJdWludDMyX3QgcmVmKQoreworCS8qIFRoaXMgZnVuY3Rpb24sIGJ5IGhhdmluZyB0aGUgc2FtZSBvcmRlciBvZiBwYXJhbWV0ZXJzCisJICogYXMgZm4sIGFuZCBieSBiZWluZyBtYXJrZWQgRkFTVF9GVU5DIChzYW1lIGFzIGZuKSwKKwkgKiBzYXZlcyBhIGRvemVuIGJ5dGVzIG9mIGNvZGUuCisJICovCisJdWludDMyX3QgYyA9IGZuKGluaXQsIGJ1ZiwgbGVuKTsKKwlpZiAoYyAhPSByZWYpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjaGVja3N1bSBlcnJvciIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIGRlY29tcHJlc3MgYSBmaWxlCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBOT0lOTElORSBzbWFsbGludCBsem9fZGVjb21wcmVzcyhjb25zdCBoZWFkZXJfdCAqaCkKK3sKKwl1bnNpZ25lZCBibG9ja19zaXplID0gTFpPX0JMT0NLX1NJWkU7CisJaW50IHI7CisJdWludDMyX3Qgc3JjX2xlbiwgZHN0X2xlbjsKKwl1aW50MzJfdCBjX2FkbGVyMzIgPSBBRExFUjMyX0lOSVRfVkFMVUU7CisJdWludDMyX3QgZF9hZGxlcjMyID0gQURMRVIzMl9JTklUX1ZBTFVFOworCXVpbnQzMl90IGNfY3JjMzIgPSBDUkMzMl9JTklUX1ZBTFVFLCBkX2NyYzMyID0gQ1JDMzJfSU5JVF9WQUxVRTsKKwlzbWFsbGludCBvayA9IDE7CisJdWludDhfdCAqYjE7CisJdWludDMyX3QgbWNzX2Jsb2NrX3NpemUgPSBNQVhfQ09NUFJFU1NFRF9TSVpFKGJsb2NrX3NpemUpOworCXVpbnQ4X3QgKmIyID0gTlVMTDsKKworCWZvciAoOzspIHsKKwkJdWludDhfdCAqZHN0OworCisJCS8qIHJlYWQgdW5jb21wcmVzc2VkIGJsb2NrIHNpemUgKi8KKwkJZHN0X2xlbiA9IHJlYWQzMigpOworCisJCS8qIGV4aXQgaWYgbGFzdCBibG9jayAqLworCQlpZiAoZHN0X2xlbiA9PSAwKQorCQkJYnJlYWs7CisKKwkJLyogZXJyb3IgaWYgc3BsaXQgZmlsZSAqLworCQlpZiAoZHN0X2xlbiA9PSAweGZmZmZmZmZmTCkKKwkJCS8qIHNob3VsZCBub3QgaGFwcGVuIC0gbm90IHlldCBpbXBsZW1lbnRlZCAqLworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRoaXMgZmlsZSBpcyBhIHNwbGl0IGx6b3AgZmlsZSIpOworCisJCWlmIChkc3RfbGVuID4gTUFYX0JMT0NLX1NJWkUpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY29ycnVwdGVkIGRhdGEiKTsKKworCQkvKiByZWFkIGNvbXByZXNzZWQgYmxvY2sgc2l6ZSAqLworCQlzcmNfbGVuID0gcmVhZDMyKCk7CisJCWlmIChzcmNfbGVuIDw9IDAgfHwgc3JjX2xlbiA+IGRzdF9sZW4pCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY29ycnVwdGVkIGRhdGEiKTsKKworCQlpZiAoZHN0X2xlbiA+IGJsb2NrX3NpemUpIHsKKwkJCWlmIChiMikgeworCQkJCWZyZWUoYjIpOworCQkJCWIyID0gTlVMTDsKKwkJCX0KKwkJCWJsb2NrX3NpemUgPSBkc3RfbGVuOworCQkJbWNzX2Jsb2NrX3NpemUgPSBNQVhfQ09NUFJFU1NFRF9TSVpFKGJsb2NrX3NpemUpOworCQl9CisKKwkJLyogcmVhZCBjaGVja3N1bSBvZiB1bmNvbXByZXNzZWQgYmxvY2sgKi8KKwkJaWYgKGgtPmZsYWdzICYgRl9BRExFUjMyX0QpCisJCQlkX2FkbGVyMzIgPSByZWFkMzIoKTsKKwkJaWYgKGgtPmZsYWdzICYgRl9DUkMzMl9EKQorCQkJZF9jcmMzMiA9IHJlYWQzMigpOworCisJCS8qIHJlYWQgY2hlY2tzdW0gb2YgY29tcHJlc3NlZCBibG9jayAqLworCQlpZiAoc3JjX2xlbiA8IGRzdF9sZW4pIHsKKwkJCWlmIChoLT5mbGFncyAmIEZfQURMRVIzMl9DKQorCQkJCWNfYWRsZXIzMiA9IHJlYWQzMigpOworCQkJaWYgKGgtPmZsYWdzICYgRl9DUkMzMl9DKQorCQkJCWNfY3JjMzIgPSByZWFkMzIoKTsKKwkJfQorCisJCWlmIChiMiA9PSBOVUxMKQorCQkJYjIgPSB4emFsbG9jKG1jc19ibG9ja19zaXplKTsKKwkJLyogcmVhZCB0aGUgYmxvY2sgaW50byB0aGUgZW5kIG9mIG91ciBidWZmZXIgKi8KKwkJYjEgPSBiMiArIG1jc19ibG9ja19zaXplIC0gc3JjX2xlbjsKKwkJeHJlYWQoMCwgYjEsIHNyY19sZW4pOworCisJCWlmIChzcmNfbGVuIDwgZHN0X2xlbikgeworCQkJdW5zaWduZWQgZCA9IGRzdF9sZW47CisKKwkJCWlmICghKG9wdGlvbl9tYXNrMzIgJiBPUFRfRikpIHsKKwkJCQkvKiB2ZXJpZnkgY2hlY2tzdW0gb2YgY29tcHJlc3NlZCBibG9jayAqLworCQkJCWlmIChoLT5mbGFncyAmIEZfQURMRVIzMl9DKQorCQkJCQlsem9fY2hlY2soQURMRVIzMl9JTklUX1ZBTFVFLAorCQkJCQkJCWIxLCBzcmNfbGVuLAorCQkJCQkJCWx6b19hZGxlcjMyLCBjX2FkbGVyMzIpOworCQkJCWlmIChoLT5mbGFncyAmIEZfQ1JDMzJfQykKKwkJCQkJbHpvX2NoZWNrKENSQzMyX0lOSVRfVkFMVUUsCisJCQkJCQkJYjEsIHNyY19sZW4sCisJCQkJCQkJbHpvX2NyYzMyLCBjX2NyYzMyKTsKKwkJCX0KKworCQkJLyogZGVjb21wcmVzcyAqLworLy8JCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9GKQorLy8JCQkJciA9IGx6bzF4X2RlY29tcHJlc3MoYjEsIHNyY19sZW4sIGIyLCAmZCwgTlVMTCk7CisvLwkJCWVsc2UKKwkJCQlyID0gbHpvMXhfZGVjb21wcmVzc19zYWZlKGIxLCBzcmNfbGVuLCBiMiwgJmQsIE5VTEwpOworCisJCQlpZiAociAhPSAwIC8qTFpPX0VfT0sqLyB8fCBkc3RfbGVuICE9IGQpIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY29ycnVwdGVkIGRhdGEiKTsKKwkJCX0KKwkJCWRzdCA9IGIyOworCQl9IGVsc2UgeworCQkJLyogInN0b3JlZCIgYmxvY2sgPT4gbm8gZGVjb21wcmVzc2lvbiAqLworCQkJZHN0ID0gYjE7CisJCX0KKworCQlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX0YpKSB7CisJCQkvKiB2ZXJpZnkgY2hlY2tzdW0gb2YgdW5jb21wcmVzc2VkIGJsb2NrICovCisJCQlpZiAoaC0+ZmxhZ3MgJiBGX0FETEVSMzJfRCkKKwkJCQlsem9fY2hlY2soQURMRVIzMl9JTklUX1ZBTFVFLAorCQkJCQlkc3QsIGRzdF9sZW4sCisJCQkJCWx6b19hZGxlcjMyLCBkX2FkbGVyMzIpOworCQkJaWYgKGgtPmZsYWdzICYgRl9DUkMzMl9EKQorCQkJCWx6b19jaGVjayhDUkMzMl9JTklUX1ZBTFVFLAorCQkJCQlkc3QsIGRzdF9sZW4sCisJCQkJCWx6b19jcmMzMiwgZF9jcmMzMik7CisJCX0KKworCQkvKiB3cml0ZSB1bmNvbXByZXNzZWQgYmxvY2sgZGF0YSAqLworCQl4d3JpdGUoMSwgZHN0LCBkc3RfbGVuKTsKKwl9CisKKwlmcmVlKGIyKTsKKwlyZXR1cm4gb2s7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gbHpvcCBmaWxlIHNpZ25hdHVyZSAoc2hhbWVsZXNzbHkgYm9ycm93ZWQgZnJvbSBQTkcpCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qCisgKiBUaGUgZmlyc3QgbmluZSBieXRlcyBvZiBhIGx6b3AgZmlsZSBhbHdheXMgY29udGFpbiB0aGUgZm9sbG93aW5nIHZhbHVlczoKKyAqCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYgICA3ICAgOAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0tIC0tLSAtLS0gLS0tIC0tLSAtLS0gLS0tIC0tLSAtLS0KKyAqIChoZXgpICAgICAgICAgICAgICAgICAgICAgICAgICA4OSAgNGMgIDVhICA0ZiAgMDAgIDBkICAwYSAgMWEgIDBhCisgKiAoZGVjaW1hbCkgICAgICAgICAgICAgICAgICAgICAxMzcgIDc2ICA5MCAgNzkgICAwICAxMyAgMTAgIDI2ICAxMAorICogKEMgbm90YXRpb24gLSBBU0NJSSkgICAgICAgICBcMjExICAgTCAgIFogICBPICBcMCAgXHIgIFxuIFwwMzIgXG4KKyAqLworCisvKiAodmRhKSBjb21wYXJpc29uIHdpdGggbHpvcCB2MS4wMnJjMSAoImx6b3AgLTEgPEZJTEUiIGNtZCk6CisgKiBPbmx5IHNsaWdodCBkaWZmZXJlbmNlcyBpbiBoZWFkZXI6CisgKiAtMDAwMDAwMDAgIDg5IDRjIDVhIDRmIDAwIDBkIDBhIDFhIDBhIDEwIDIwIDIwIDIwIDA5IDQwIDAyCisgKiArMDAwMDAwMDAgIDg5IDRjIDVhIDRmIDAwIDBkIDBhIDFhIDBhIDEwIDEwIDIwIDMwIDA5IDQwIDAyCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF5eXl5eIF5eXl5eCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uIGxpYl92ZXJzaW9uCisgKiAtMDAwMDAwMTAgIDAxIDAzIDAwIDAwIDBkIDAwIDAwIDgxIGE0IDQ5IGY3IGE2IDNmIDAwIDAwIDAwCisgKiArMDAwMDAwMTAgIDAxIDAzIDAwIDAwIDAxIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwCisgKiAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eIF5eXl5eXl5eXl5eIF5eXl5eXl5eXl5eCisgKiAgICAgICAgICAgICAgIGZsYWdzICAgICAgIG1vZGUgICAgICAgIG10aW1lCisgKiAtMDAwMDAwMjAgIDAwIDAwIDJkIDY3IDA0IDE3IDAwIDA0IDAwIDAwIDAwIDAzIGVkIGVjIDlkIDZkCisgKiArMDAwMDAwMjAgIDAwIDAwIDEwIDVmIDAwIGMxIDAwIDA0IDAwIDAwIDAwIDAzIGVkIGVjIDlkIDZkCisgKiAgICAgICAgICAgICAgICAgIF5eXl5eXl5eXl5eCisgKiAgICAgICAgICAgICAgICAgIGNoa3N1bV9vdXQKKyAqIFRoZSByZXN0IGlzIGlkZW50aWNhbC4KKyovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBsem9wX21hZ2ljWzldID0geworCTB4ODksIDB4NGMsIDB4NWEsIDB4NGYsIDB4MDAsIDB4MGQsIDB4MGEsIDB4MWEsIDB4MGEKK307CisKKy8qIFRoaXMgY29kaW5nIGlzIGRlcml2ZWQgZnJvbSBBbGV4YW5kZXIgTGVobWFubidzIHBuZ2NoZWNrIGNvZGUuICovCitzdGF0aWMgdm9pZCBjaGVja19tYWdpYyh2b2lkKQoreworCXVuc2lnbmVkIGNoYXIgbWFnaWNbc2l6ZW9mKGx6b3BfbWFnaWMpXTsKKwl4cmVhZCgwLCBtYWdpYywgc2l6ZW9mKG1hZ2ljKSk7CisJaWYgKG1lbWNtcChtYWdpYywgbHpvcF9tYWdpYywgc2l6ZW9mKGx6b3BfbWFnaWMpKSAhPSAwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIG1hZ2ljIG51bWJlciIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8vIGx6b3AgZmlsZSBoZWFkZXIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgd3JpdGVfaGVhZGVyKGNvbnN0IGhlYWRlcl90ICpoKQoreworCWludCBsOworCisJeHdyaXRlKDEsIGx6b3BfbWFnaWMsIHNpemVvZihsem9wX21hZ2ljKSk7CisKKwlpbml0X2Noa3N1bSgmRy5jaGtzdW1fb3V0KTsKKworCWZfd3JpdGUxNihoLT52ZXJzaW9uKTsKKwlmX3dyaXRlMTYoaC0+bGliX3ZlcnNpb24pOworCWZfd3JpdGUxNihoLT52ZXJzaW9uX25lZWRlZF90b19leHRyYWN0KTsKKwlmX3dyaXRlOChoLT5tZXRob2QpOworCWZfd3JpdGU4KGgtPmxldmVsKTsKKwlmX3dyaXRlMzIoaC0+ZmxhZ3MpOworCWZfd3JpdGUzMihoLT5tb2RlKTsKKwlmX3dyaXRlMzIoaC0+bXRpbWUpOworCWZfd3JpdGUzMihoLT5nbXRkaWZmKTsKKworCWwgPSAoaW50KSBzdHJsZW4oaC0+bmFtZSk7CisJZl93cml0ZTgobCk7CisJaWYgKGwpCisJCWZfd3JpdGUoaC0+bmFtZSwgbCk7CisKKwlmX3dyaXRlMzIoY2hrc3VtX2dldHJlc3VsdCgmRy5jaGtzdW1fb3V0LCBoKSk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9oZWFkZXIoaGVhZGVyX3QgKmgpCit7CisJaW50IHI7CisJaW50IGw7CisJdWludDMyX3QgY2hlY2tzdW07CisKKwltZW1zZXQoaCwgMCwgc2l6ZW9mKCpoKSk7CisJaC0+dmVyc2lvbl9uZWVkZWRfdG9fZXh0cmFjdCA9IDB4MDkwMDsJLyogZmlyc3QgbHpvcCB2ZXJzaW9uICovCisJaC0+bGV2ZWwgPSAwOworCisJaW5pdF9jaGtzdW0oJkcuY2hrc3VtX2luKTsKKworCWgtPnZlcnNpb24gPSBmX3JlYWQxNigpOworCWlmIChoLT52ZXJzaW9uIDwgMHgwOTAwKQorCQlyZXR1cm4gMzsKKwloLT5saWJfdmVyc2lvbiA9IGZfcmVhZDE2KCk7CisJaWYgKGgtPnZlcnNpb24gPj0gMHgwOTQwKSB7CisJCWgtPnZlcnNpb25fbmVlZGVkX3RvX2V4dHJhY3QgPSBmX3JlYWQxNigpOworCQlpZiAoaC0+dmVyc2lvbl9uZWVkZWRfdG9fZXh0cmFjdCA+IExaT1BfVkVSU0lPTikKKwkJCXJldHVybiAxNjsKKwkJaWYgKGgtPnZlcnNpb25fbmVlZGVkX3RvX2V4dHJhY3QgPCAweDA5MDApCisJCQlyZXR1cm4gMzsKKwl9CisJaC0+bWV0aG9kID0gZl9yZWFkOCgpOworCWlmIChoLT52ZXJzaW9uID49IDB4MDk0MCkKKwkJaC0+bGV2ZWwgPSBmX3JlYWQ4KCk7CisJaC0+ZmxhZ3MgPSBmX3JlYWQzMigpOworCWlmIChoLT5mbGFncyAmIEZfSF9GSUxURVIpCisJCXJldHVybiAxNjsgLyogZmlsdGVyIG5vdCBzdXBwb3J0ZWQgKi8KKwloLT5tb2RlID0gZl9yZWFkMzIoKTsKKwloLT5tdGltZSA9IGZfcmVhZDMyKCk7CisJaWYgKGgtPnZlcnNpb24gPj0gMHgwOTQwKQorCQloLT5nbXRkaWZmID0gZl9yZWFkMzIoKTsKKworCWwgPSBmX3JlYWQ4KCk7CisJaWYgKGwgPiAwKQorCQlmX3JlYWQoaC0+bmFtZSwgbCk7CisJaC0+bmFtZVtsXSA9IDA7CisKKwljaGVja3N1bSA9IGNoa3N1bV9nZXRyZXN1bHQoJkcuY2hrc3VtX2luLCBoKTsKKwloLT5oZWFkZXJfY2hlY2tzdW0gPSBmX3JlYWQzMigpOworCWlmIChoLT5oZWFkZXJfY2hlY2tzdW0gIT0gY2hlY2tzdW0pCisJCXJldHVybiAyOworCisJaWYgKGgtPm1ldGhvZCA8PSAwKQorCQlyZXR1cm4gMTQ7CisJciA9IGx6b19nZXRfbWV0aG9kKGgpOworCWlmIChyICE9IDApCisJCXJldHVybiByOworCisJLyogY2hlY2sgcmVzZXJ2ZWQgZmxhZ3MgKi8KKwlpZiAoaC0+ZmxhZ3MgJiBGX1JFU0VSVkVEKQorCQlyZXR1cm4gLTEzOworCisJLyogc2tpcCBleHRyYSBmaWVsZCBbbm90IHVzZWQgeWV0XSAqLworCWlmIChoLT5mbGFncyAmIEZfSF9FWFRSQV9GSUVMRCkgeworCQl1aW50MzJfdCBrOworCisJCS8qIG5vdGU6IHRoZSBjaGVja3N1bSBhbHNvIGNvdmVycyB0aGUgbGVuZ3RoICovCisJCWluaXRfY2hrc3VtKCZHLmNoa3N1bV9pbik7CisJCWgtPmV4dHJhX2ZpZWxkX2xlbiA9IGZfcmVhZDMyKCk7CisJCWZvciAoayA9IDA7IGsgPCBoLT5leHRyYV9maWVsZF9sZW47IGsrKykKKwkJCWZfcmVhZDgoKTsKKwkJY2hlY2tzdW0gPSBjaGtzdW1fZ2V0cmVzdWx0KCZHLmNoa3N1bV9pbiwgaCk7CisJCWgtPmV4dHJhX2ZpZWxkX2NoZWNrc3VtID0gZl9yZWFkMzIoKTsKKwkJaWYgKGgtPmV4dHJhX2ZpZWxkX2NoZWNrc3VtICE9IGNoZWNrc3VtKQorCQkJcmV0dXJuIDM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBfaGVhZGVyKGhlYWRlcl90ICpoKQoreworCWludCByOworCisJciA9IHJlYWRfaGVhZGVyKGgpOworCWlmIChyID09IDApCisJCXJldHVybjsKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaGVhZGVyX2Vycm9yICVkIiwgcik7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gY29tcHJlc3MKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworc3RhdGljIHZvaWQgbHpvX3NldF9tZXRob2QoaGVhZGVyX3QgKmgpCit7CisJaW50IGxldmVsID0gMTsKKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUXzEpIHsKKwkJaC0+bWV0aG9kID0gTV9MWk8xWF8xXzE1OworCX0gZWxzZSBpZiAob3B0aW9uX21hc2szMiAmIE9QVF83ODkpIHsKKyNpZiBFTkFCTEVfTFpPUF9DT01QUl9ISUdICisJCWgtPm1ldGhvZCA9IE1fTFpPMVhfOTk5OworCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF83KQorCQkJbGV2ZWwgPSA3OworCQllbHNlIGlmIChvcHRpb25fbWFzazMyICYgT1BUXzgpCisJCQlsZXZlbCA9IDg7CisJCWVsc2UKKwkJCWxldmVsID0gOTsKKyNlbHNlCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJoaWdoIGNvbXByZXNzaW9uIG5vdCBjb21waWxlZCBpbiIpOworI2VuZGlmCisJfSBlbHNlIHsgLyogbGV2ZWxzIDIuLjYgb3Igbm9uZSAoZGVmYXVsdHMgdG8gbGV2ZWwgMykgKi8KKwkJaC0+bWV0aG9kID0gTV9MWk8xWF8xOworCQlsZXZlbCA9IDU7IC8qIGxldmVscyAyLTYgYXJlIGFjdHVhbGx5IHRoZSBzYW1lICovCisJfQorCisJaC0+bGV2ZWwgPSBsZXZlbDsKK30KKworc3RhdGljIHNtYWxsaW50IGRvX2x6b19jb21wcmVzcyh2b2lkKQoreworCWhlYWRlcl90IGhlYWRlcjsKKworI2RlZmluZSBoICgmaGVhZGVyKQorCW1lbXNldChoLCAwLCBzaXplb2YoKmgpKTsKKworCWx6b19zZXRfbWV0aG9kKGgpOworCisJaC0+dmVyc2lvbiA9IChMWk9QX1ZFUlNJT04gJiAweGZmZmYpOworCWgtPnZlcnNpb25fbmVlZGVkX3RvX2V4dHJhY3QgPSAweDA5NDA7CisJaC0+bGliX3ZlcnNpb24gPSBsem9fdmVyc2lvbigpICYgMHhmZmZmOworCisJaC0+ZmxhZ3MgPSAoRl9PUyAmIEZfT1NfTUFTSykgfCAoRl9DUyAmIEZfQ1NfTUFTSyk7CisKKwlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX0YpIHx8IGgtPm1ldGhvZCA9PSBNX0xaTzFYXzk5OSkgeworCQloLT5mbGFncyB8PSBGX0FETEVSMzJfRDsKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfQykKKwkJCWgtPmZsYWdzIHw9IEZfQURMRVIzMl9DOworCX0KKwl3cml0ZV9oZWFkZXIoaCk7CisJcmV0dXJuIGx6b19jb21wcmVzcyhoKTsKKyN1bmRlZiBoCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLy8gZGVjb21wcmVzcworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitzdGF0aWMgc21hbGxpbnQgZG9fbHpvX2RlY29tcHJlc3Modm9pZCkKK3sKKwloZWFkZXJfdCBoZWFkZXI7CisKKwljaGVja19tYWdpYygpOworCXBfaGVhZGVyKCZoZWFkZXIpOworCXJldHVybiBsem9fZGVjb21wcmVzcygmaGVhZGVyKTsKK30KKworc3RhdGljIGNoYXIqIEZBU1RfRlVOQyBtYWtlX25ld19uYW1lX2x6b3AoY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmV4cGVjdGVkX2V4dCBVTlVTRURfUEFSQU0pCit7CisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfREVDT01QUkVTUykgeworCQljaGFyICpleHRlbnNpb24gPSBzdHJyY2hyKGZpbGVuYW1lLCAnLicpOworCQlpZiAoIWV4dGVuc2lvbiB8fCBzdHJjbXAoZXh0ZW5zaW9uICsgMSwgImx6byIpICE9IDApCisJCQlyZXR1cm4geGFzcHJpbnRmKCIlcy5vdXQiLCBmaWxlbmFtZSk7CisJCSpleHRlbnNpb24gPSAnXDAnOworCQlyZXR1cm4gZmlsZW5hbWU7CisJfQorCXJldHVybiB4YXNwcmludGYoIiVzLmx6byIsIGZpbGVuYW1lKTsKK30KKworc3RhdGljIElGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgRkFTVF9GVU5DIHBhY2tfbHpvcCh0cmFuc2Zvcm1lcl9zdGF0ZV90ICp4c3RhdGUgVU5VU0VEX1BBUkFNKQoreworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX0RFQ09NUFJFU1MpCisJCXJldHVybiBkb19sem9fZGVjb21wcmVzcygpOworCXJldHVybiBkb19sem9fY29tcHJlc3MoKTsKK30KKworaW50IGx6b3BfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGx6b3BfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWdldG9wdDMyKGFyZ3YsIE9QVElPTl9TVFJJTkcpOworCWFyZ3YgKz0gb3B0aW5kOworCS8qIGx6b3BjYXQ/ICovCisJaWYgKGFwcGxldF9uYW1lWzRdID09ICdjJykKKwkJb3B0aW9uX21hc2szMiB8PSAoT1BUX1NURE9VVCB8IE9QVF9ERUNPTVBSRVNTKTsKKwkvKiB1bmx6b3A/ICovCisJaWYgKGFwcGxldF9uYW1lWzRdID09ICdvJykKKwkJb3B0aW9uX21hc2szMiB8PSBPUFRfREVDT01QUkVTUzsKKworCWdsb2JhbF9jcmMzMl90YWJsZSA9IGNyYzMyX2ZpbGx0YWJsZShOVUxMLCAwKTsKKwlyZXR1cm4gYmJ1bnBhY2soYXJndiwgcGFja19sem9wLCBtYWtlX25ld19uYW1lX2x6b3AsIC8qdW51c2VkOiovIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvcnBtLmMgYi9hcmNoaXZhbC9ycG0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDUzOTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvcnBtLmMKQEAgLTAsMCArMSw0MDQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgcnBtIGFwcGxldCBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIGJ5IExhdXJlbmNlIEFuZGVyc29uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2NvbmZpZzpjb25maWcgUlBNCisvL2NvbmZpZzoJYm9vbCAicnBtIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIE1pbmkgUlBNIGFwcGxldCAtIHF1ZXJpZXMgYW5kIGV4dHJhY3RzIFJQTSBwYWNrYWdlcy4KKworLy9hcHBsZXQ6SUZfUlBNKEFQUExFVChycG0sIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCisvL2tidWlsZDpsaWItJChDT05GSUdfUlBNKSArPSBycG0ubworCisvL3VzYWdlOiNkZWZpbmUgcnBtX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICItaSBQQUNLQUdFLnJwbTsgcnBtIC1xcFtpbGRjXSBQQUNLQUdFLnJwbSIKKy8vdXNhZ2U6I2RlZmluZSBycG1fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJNYW5pcHVsYXRlIFJQTSBwYWNrYWdlc1xuIgorLy91c2FnZTogICAgICJcbkNvbW1hbmRzOiIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJSW5zdGFsbCBwYWNrYWdlIgorLy91c2FnZTogICAgICJcbgktcXAJUXVlcnkgcGFja2FnZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXFwaQlTaG93IGluZm9ybWF0aW9uIgorLy91c2FnZTogICAgICJcbgktcXBsCUxpc3QgY29udGVudHMiCisvL3VzYWdlOiAgICAgIlxuCS1xcGQJTGlzdCBkb2N1bWVudHMiCisvL3VzYWdlOiAgICAgIlxuCS1xcGMJTGlzdCBjb25maWcgZmlsZXMiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImJiX2FyY2hpdmUuaCIKKyNpbmNsdWRlICJycG0uaCIKKworI2RlZmluZSBSUE1fQ0hBUl9UWVBFICAgICAgICAgICAxCisjZGVmaW5lIFJQTV9JTlQ4X1RZUEUgICAgICAgICAgIDIKKyNkZWZpbmUgUlBNX0lOVDE2X1RZUEUgICAgICAgICAgMworI2RlZmluZSBSUE1fSU5UMzJfVFlQRSAgICAgICAgICA0CisvKiAjZGVmaW5lIFJQTV9JTlQ2NF9UWVBFICAgICAgIDUgICAtLS0tIFRoZXNlIGFyZW4ndCBzdXBwb3J0ZWQgKHlldCkgKi8KKyNkZWZpbmUgUlBNX1NUUklOR19UWVBFICAgICAgICAgNgorI2RlZmluZSBSUE1fQklOX1RZUEUgICAgICAgICAgICA3CisjZGVmaW5lIFJQTV9TVFJJTkdfQVJSQVlfVFlQRSAgIDgKKyNkZWZpbmUgUlBNX0kxOE5TVFJJTkdfVFlQRSAgICAgOQorCisjZGVmaW5lIFRBR19OQU1FICAgICAgICAgICAgICAgIDEwMDAKKyNkZWZpbmUgVEFHX1ZFUlNJT04gICAgICAgICAgICAgMTAwMQorI2RlZmluZSBUQUdfUkVMRUFTRSAgICAgICAgICAgICAxMDAyCisjZGVmaW5lIFRBR19TVU1NQVJZICAgICAgICAgICAgIDEwMDQKKyNkZWZpbmUgVEFHX0RFU0NSSVBUSU9OICAgICAgICAgMTAwNQorI2RlZmluZSBUQUdfQlVJTERUSU1FICAgICAgICAgICAxMDA2CisjZGVmaW5lIFRBR19CVUlMREhPU1QgICAgICAgICAgIDEwMDcKKyNkZWZpbmUgVEFHX1NJWkUgICAgICAgICAgICAgICAgMTAwOQorI2RlZmluZSBUQUdfVkVORE9SICAgICAgICAgICAgICAxMDExCisjZGVmaW5lIFRBR19MSUNFTlNFICAgICAgICAgICAgIDEwMTQKKyNkZWZpbmUgVEFHX1BBQ0tBR0VSICAgICAgICAgICAgMTAxNQorI2RlZmluZSBUQUdfR1JPVVAgICAgICAgICAgICAgICAxMDE2CisjZGVmaW5lIFRBR19VUkwgICAgICAgICAgICAgICAgIDEwMjAKKyNkZWZpbmUgVEFHX1BSRUlOICAgICAgICAgICAgICAgMTAyMworI2RlZmluZSBUQUdfUE9TVElOICAgICAgICAgICAgICAxMDI0CisjZGVmaW5lIFRBR19GSUxFRkxBR1MgICAgICAgICAgIDEwMzcKKyNkZWZpbmUgVEFHX0ZJTEVVU0VSTkFNRSAgICAgICAgMTAzOQorI2RlZmluZSBUQUdfRklMRUdST1VQTkFNRSAgICAgICAxMDQwCisjZGVmaW5lIFRBR19TT1VSQ0VSUE0gICAgICAgICAgIDEwNDQKKyNkZWZpbmUgVEFHX1BSRUlOUFJPRyAgICAgICAgICAgMTA4NQorI2RlZmluZSBUQUdfUE9TVElOUFJPRyAgICAgICAgICAxMDg2CisjZGVmaW5lIFRBR19QUkVGSVhTICAgICAgICAgICAgIDEwOTgKKyNkZWZpbmUgVEFHX0RJUklOREVYRVMgICAgICAgICAgMTExNgorI2RlZmluZSBUQUdfQkFTRU5BTUVTICAgICAgICAgICAxMTE3CisjZGVmaW5lIFRBR19ESVJOQU1FUyAgICAgICAgICAgIDExMTgKKworI2RlZmluZSBSUE1GSUxFX0NPTkZJRyAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBSUE1GSUxFX0RPQyAgICAgICAgICAgICAoMSA8PCAxKQorCitlbnVtIHJwbV9mdW5jdGlvbnNfZSB7CisJcnBtX3F1ZXJ5ID0gMSwKKwlycG1faW5zdGFsbCA9IDIsCisJcnBtX3F1ZXJ5X2luZm8gPSA0LAorCXJwbV9xdWVyeV9wYWNrYWdlID0gOCwKKwlycG1fcXVlcnlfbGlzdCA9IDE2LAorCXJwbV9xdWVyeV9saXN0X2RvYyA9IDMyLAorCXJwbV9xdWVyeV9saXN0X2NvbmZpZyA9IDY0Cit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDMyX3QgdGFnOyAvKiA0IGJ5dGUgdGFnICovCisJdWludDMyX3QgdHlwZTsgLyogNCBieXRlIHR5cGUgKi8KKwl1aW50MzJfdCBvZmZzZXQ7IC8qIDQgYnl0ZSBvZmZzZXQgKi8KKwl1aW50MzJfdCBjb3VudDsgLyogNCBieXRlIGNvdW50ICovCit9IHJwbV9pbmRleDsKKworc3RydWN0IGdsb2JhbHMgeworCXZvaWQgKm1hcDsKKwlycG1faW5kZXggKipteXRhZ3M7CisJaW50IHRhZ2NvdW50OworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBleHRyYWN0X2NwaW8oaW50IGZkLCBjb25zdCBjaGFyICpzb3VyY2VfcnBtKQoreworCWFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlOworCisJaWYgKHNvdXJjZV9ycG0gIT0gTlVMTCkgeworCQkvKiBCaW5hcnkgcnBtIChpdCB3YXMgYnVpbHQgZnJvbSBzb21lIFNSUE0pLCBpbnN0YWxsIHRvIHJvb3QgKi8KKwkJeGNoZGlyKCIvIik7CisJfSAvKiBlbHNlOiBTUlBNLCBpbnN0YWxsIHRvIGN1cnJlbnQgZGlyICovCisKKwkvKiBJbml0aWFsaXplICovCisJYXJjaGl2ZV9oYW5kbGUgPSBpbml0X2hhbmRsZSgpOworCWFyY2hpdmVfaGFuZGxlLT5zZWVrID0gc2Vla19ieV9yZWFkOworCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25fZGF0YSA9IGRhdGFfZXh0cmFjdF9hbGw7CisjaWYgMCAvKiBGb3IgdGVzdGluZyAocnBtIC1pIG9ubHkgbGlzdHMgdGhlIGZpbGVzIGluIGludGVybmFsIGNwaW8pOiAqLworCWFyY2hpdmVfaGFuZGxlLT5hY3Rpb25faGVhZGVyID0gaGVhZGVyX2xpc3Q7CisJYXJjaGl2ZV9oYW5kbGUtPmFjdGlvbl9kYXRhID0gZGF0YV9za2lwOworI2VuZGlmCisJYXJjaGl2ZV9oYW5kbGUtPmFoX2ZsYWdzID0gQVJDSElWRV9SRVNUT1JFX0RBVEUgfCBBUkNISVZFX0NSRUFURV9MRUFESU5HX0RJUlMKKwkJLyogY29tcGF0OiBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMuCisJCSAqIHRyeSAicnBtIC1pIGZvby5zcmMucnBtIiBmZXcgdGltZXMgaW4gYSByb3cgLQorCQkgKiBzdGFuZGFyZCBycG0gd2lsbCBub3QgY29tcGxhaW4uCisJCSAqLworCQl8IEFSQ0hJVkVfUkVQTEFDRV9WSUFfUkVOQU1FOworCWFyY2hpdmVfaGFuZGxlLT5zcmNfZmQgPSBmZDsKKwkvKmFyY2hpdmVfaGFuZGxlLT5vZmZzZXQgPSAwOyAtIGluaXRfaGFuZGxlKCkgZGlkIGl0ICovCisKKwlzZXR1cF91bnppcF9vbl9mZChhcmNoaXZlX2hhbmRsZS0+c3JjX2ZkLCAvKmZhaWxfaWZfbm90X2NvbXByZXNzZWQ6Ki8gMSk7CisJd2hpbGUgKGdldF9oZWFkZXJfY3BpbyhhcmNoaXZlX2hhbmRsZSkgPT0gRVhJVF9TVUNDRVNTKQorCQljb250aW51ZTsKK30KKworc3RhdGljIHJwbV9pbmRleCAqKnJwbV9nZXR0YWdzKGludCBmZCwgaW50ICpudW1fdGFncykKK3sKKwkvKiBXZSBzaG91bGQgbmV2ZXIgbmVlZCBtb3JlIHRoYW4gMjAwIChzaHJpbmsgdmlhIHJlYWxsb2MgbGF0ZXIpICovCisJcnBtX2luZGV4ICoqdGFncyA9IHh6YWxsb2MoMjAwICogc2l6ZW9mKHRhZ3NbMF0pKTsKKwlpbnQgcGFzcywgdGFnaW5kZXggPSAwOworCisJeGxzZWVrKGZkLCA5NiwgU0VFS19DVVIpOyAvKiBTZWVrIHBhc3QgdGhlIHVudXNlZCBsZWFkICovCisKKwkvKiAxc3QgcGFzcyBpcyB0aGUgc2lnbmF0dXJlIGhlYWRlcnMsIDJuZCBpcyB0aGUgbWFpbiBzdHVmZiAqLworCWZvciAocGFzcyA9IDA7IHBhc3MgPCAyOyBwYXNzKyspIHsKKwkJc3RydWN0IHJwbV9oZWFkZXIgaGVhZGVyOworCQlycG1faW5kZXggKnRtcGluZGV4OworCQlpbnQgc3RvcmVwb3M7CisKKwkJeHJlYWQoZmQsICZoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKKwkJaWYgKGhlYWRlci5tYWdpY19hbmRfdmVyICE9IGh0b25sKFJQTV9IRUFERVJfTUFHSUNuVkVSKSkKKwkJCXJldHVybiBOVUxMOyAvKiBJbnZhbGlkIG1hZ2ljLCBvciBub3QgdmVyc2lvbiAxICovCisJCWhlYWRlci5zaXplID0gbnRvaGwoaGVhZGVyLnNpemUpOworCQloZWFkZXIuZW50cmllcyA9IG50b2hsKGhlYWRlci5lbnRyaWVzKTsKKwkJc3RvcmVwb3MgPSB4bHNlZWsoZmQsIDAsIFNFRUtfQ1VSKSArIGhlYWRlci5lbnRyaWVzICogMTY7CisKKwkJd2hpbGUgKGhlYWRlci5lbnRyaWVzLS0pIHsKKwkJCXRtcGluZGV4ID0gdGFnc1t0YWdpbmRleCsrXSA9IHhtYWxsb2Moc2l6ZW9mKCp0bXBpbmRleCkpOworCQkJeHJlYWQoZmQsIHRtcGluZGV4LCBzaXplb2YoKnRtcGluZGV4KSk7CisJCQl0bXBpbmRleC0+dGFnID0gbnRvaGwodG1waW5kZXgtPnRhZyk7CisJCQl0bXBpbmRleC0+dHlwZSA9IG50b2hsKHRtcGluZGV4LT50eXBlKTsKKwkJCXRtcGluZGV4LT5jb3VudCA9IG50b2hsKHRtcGluZGV4LT5jb3VudCk7CisJCQl0bXBpbmRleC0+b2Zmc2V0ID0gc3RvcmVwb3MgKyBudG9obCh0bXBpbmRleC0+b2Zmc2V0KTsKKwkJCWlmIChwYXNzID09IDApCisJCQkJdG1waW5kZXgtPnRhZyAtPSA3NDM7CisJCX0KKwkJc3RvcmVwb3MgPSB4bHNlZWsoZmQsIGhlYWRlci5zaXplLCBTRUVLX0NVUik7IC8qIFNlZWsgcGFzdCBzdG9yZSAqLworCQkvKiBTa2lwIHBhZGRpbmcgdG8gOCBieXRlIGJvdW5kYXJ5IGFmdGVyIHJlYWRpbmcgc2lnbmF0dXJlIGhlYWRlcnMgKi8KKwkJaWYgKHBhc3MgPT0gMCkKKwkJCXhsc2VlayhmZCwgKC1zdG9yZXBvcykgJiAweDcsIFNFRUtfQ1VSKTsKKwl9CisJLyogcmVhbGxvYyB0YWdzIHRvIHNhdmUgc3BhY2UgKi8KKwl0YWdzID0geHJlYWxsb2ModGFncywgdGFnaW5kZXggKiBzaXplb2YodGFnc1swXSkpOworCSpudW1fdGFncyA9IHRhZ2luZGV4OworCS8qIEFsbCBkb25lLCBsZWF2ZSB0aGUgZmlsZSBhdCB0aGUgc3RhcnQgb2YgdGhlIGd6aXBwZWQgY3BpbyBhcmNoaXZlICovCisJcmV0dXJuIHRhZ3M7Cit9CisKK3N0YXRpYyBpbnQgYnNlYXJjaF9ycG10YWcoY29uc3Qgdm9pZCAqa2V5LCBjb25zdCB2b2lkICppdGVtKQoreworCWludCAqdGFnID0gKGludCAqKWtleTsKKwlycG1faW5kZXggKip0bXAgPSAocnBtX2luZGV4ICoqKSBpdGVtOworCXJldHVybiAoKnRhZyAtIHRtcFswXS0+dGFnKTsKK30KKworc3RhdGljIGludCBycG1fZ2V0Y291bnQoaW50IHRhZykKK3sKKwlycG1faW5kZXggKipmb3VuZDsKKwlmb3VuZCA9IGJzZWFyY2goJnRhZywgRy5teXRhZ3MsIEcudGFnY291bnQsIHNpemVvZihzdHJ1Y3QgcnBtdGFnICopLCBic2VhcmNoX3JwbXRhZyk7CisJaWYgKCFmb3VuZCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGZvdW5kWzBdLT5jb3VudDsKK30KKworc3RhdGljIGNoYXIgKnJwbV9nZXRzdHIoaW50IHRhZywgaW50IGl0ZW1pbmRleCkKK3sKKwlycG1faW5kZXggKipmb3VuZDsKKwlmb3VuZCA9IGJzZWFyY2goJnRhZywgRy5teXRhZ3MsIEcudGFnY291bnQsIHNpemVvZihzdHJ1Y3QgcnBtdGFnICopLCBic2VhcmNoX3JwbXRhZyk7CisJaWYgKCFmb3VuZCB8fCBpdGVtaW5kZXggPj0gZm91bmRbMF0tPmNvdW50KQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoZm91bmRbMF0tPnR5cGUgPT0gUlBNX1NUUklOR19UWVBFCisJIHx8IGZvdW5kWzBdLT50eXBlID09IFJQTV9JMThOU1RSSU5HX1RZUEUKKwkgfHwgZm91bmRbMF0tPnR5cGUgPT0gUlBNX1NUUklOR19BUlJBWV9UWVBFCisJKSB7CisJCWludCBuOworCQljaGFyICp0bXBzdHIgPSAoY2hhciAqKSBHLm1hcCArIGZvdW5kWzBdLT5vZmZzZXQ7CisJCWZvciAobiA9IDA7IG4gPCBpdGVtaW5kZXg7IG4rKykKKwkJCXRtcHN0ciA9IHRtcHN0ciArIHN0cmxlbih0bXBzdHIpICsgMTsKKwkJcmV0dXJuIHRtcHN0cjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcnBtX2dldGludChpbnQgdGFnLCBpbnQgaXRlbWluZGV4KQoreworCXJwbV9pbmRleCAqKmZvdW5kOworCWNoYXIgKnRtcGludDsKKworCS8qIGdjYyB0aHJvd3Mgd2FybmluZ3MgaGVyZSB3aGVuIHNpemVvZih2b2lkKikhPXNpemVvZihpbnQpIC4uLgorCSAqIGl0J3Mgb2sgdG8gaWdub3JlIGl0IGJlY2F1c2UgdGFnIHdvbid0IGJlIHVzZWQgYXMgYSBwb2ludGVyICovCisJZm91bmQgPSBic2VhcmNoKCZ0YWcsIEcubXl0YWdzLCBHLnRhZ2NvdW50LCBzaXplb2Yoc3RydWN0IHJwbXRhZyAqKSwgYnNlYXJjaF9ycG10YWcpOworCWlmICghZm91bmQgfHwgaXRlbWluZGV4ID49IGZvdW5kWzBdLT5jb3VudCkKKwkJcmV0dXJuIC0xOworCisJdG1waW50ID0gKGNoYXIgKikgRy5tYXAgKyBmb3VuZFswXS0+b2Zmc2V0OworCWlmIChmb3VuZFswXS0+dHlwZSA9PSBSUE1fSU5UMzJfVFlQRSkgeworCQl0bXBpbnQgKz0gaXRlbWluZGV4KjQ7CisJCXJldHVybiBudG9obCgqKGludDMyX3QqKXRtcGludCk7CisJfQorCWlmIChmb3VuZFswXS0+dHlwZSA9PSBSUE1fSU5UMTZfVFlQRSkgeworCQl0bXBpbnQgKz0gaXRlbWluZGV4KjI7CisJCXJldHVybiBudG9ocygqKGludDE2X3QqKXRtcGludCk7CisJfQorCWlmIChmb3VuZFswXS0+dHlwZSA9PSBSUE1fSU5UOF9UWVBFKSB7CisJCXRtcGludCArPSBpdGVtaW5kZXg7CisJCXJldHVybiAqKGludDhfdCopdG1waW50OworCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGVhY3Rpb25fZG9iYWNrdXAoY2hhciAqZmlsZW5hbWUsIGludCBmaWxlcmVmKQoreworCXN0cnVjdCBzdGF0IG9sZGZpbGU7CisJaW50IHN0YXRfcmVzOworCWNoYXIgKm5ld25hbWU7CisJaWYgKHJwbV9nZXRpbnQoVEFHX0ZJTEVGTEFHUywgZmlsZXJlZikgJiBSUE1GSUxFX0NPTkZJRykgeworCQkvKiBPbmx5IG5lZWQgdG8gYmFja3VwIGNvbmZpZyBmaWxlcyAqLworCQlzdGF0X3JlcyA9IGxzdGF0KGZpbGVuYW1lLCAmb2xkZmlsZSk7CisJCWlmIChzdGF0X3JlcyA9PSAwICYmIFNfSVNSRUcob2xkZmlsZS5zdF9tb2RlKSkgeworCQkJLyogRmlsZSBhbHJlYWR5IGV4aXN0cyAgLSByZWFsbHkgc2hvdWxkIGNoZWNrIE1ENSdzIGV0YyB0byBzZWUgaWYgZGlmZmVyZW50ICovCisJCQluZXduYW1lID0geGFzcHJpbnRmKCIlcy5ycG1vcmlnIiwgZmlsZW5hbWUpOworCQkJY29weV9maWxlKGZpbGVuYW1lLCBuZXduYW1lLCBGSUxFVVRJTFNfUkVDVVIgfCBGSUxFVVRJTFNfUFJFU0VSVkVfU1RBVFVTKTsKKwkJCXJlbW92ZV9maWxlKGZpbGVuYW1lLCBGSUxFVVRJTFNfUkVDVVIgfCBGSUxFVVRJTFNfRk9SQ0UpOworCQkJZnJlZShuZXduYW1lKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZmlsZWFjdGlvbl9zZXRvd25ncnAoY2hhciAqZmlsZW5hbWUsIGludCBmaWxlcmVmKQoreworCS8qIHJlYWwgcnBtIHdhcm5zOiAidXNlciBmb28gZG9lcyBub3QgZXhpc3QgLSB1c2luZyA8eW91PiIgKi8KKwlzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3bmFtKHJwbV9nZXRzdHIoVEFHX0ZJTEVVU0VSTkFNRSwgZmlsZXJlZikpOworCWludCB1aWQgPSBwdyA/IHB3LT5wd191aWQgOiBnZXR1aWQoKTsgLyogb3IgZXVpZD8gKi8KKwlzdHJ1Y3QgZ3JvdXAgKmdyID0gZ2V0Z3JuYW0ocnBtX2dldHN0cihUQUdfRklMRUdST1VQTkFNRSwgZmlsZXJlZikpOworCWludCBnaWQgPSBnciA/IGdyLT5ncl9naWQgOiBnZXRnaWQoKTsKKwljaG93bihmaWxlbmFtZSwgdWlkLCBnaWQpOworfQorCitzdGF0aWMgdm9pZCBsb29wX3Rocm91Z2hfZmlsZXMoaW50IGZpbGV0YWcsIHZvaWQgKCpmaWxlYWN0aW9uKShjaGFyICpmaWxlbmFtZSwgaW50IGZpbGVyZWYpKQoreworCWludCBjb3VudCA9IDA7CisJd2hpbGUgKHJwbV9nZXRzdHIoZmlsZXRhZywgY291bnQpKSB7CisJCWNoYXIqIGZpbGVuYW1lID0geGFzcHJpbnRmKCIlcyVzIiwKKwkJCXJwbV9nZXRzdHIoVEFHX0RJUk5BTUVTLCBycG1fZ2V0aW50KFRBR19ESVJJTkRFWEVTLCBjb3VudCkpLAorCQkJcnBtX2dldHN0cihUQUdfQkFTRU5BTUVTLCBjb3VudCkpOworCQlmaWxlYWN0aW9uKGZpbGVuYW1lLCBjb3VudCsrKTsKKwkJZnJlZShmaWxlbmFtZSk7CisJfQorfQorCitpbnQgcnBtX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBycG1fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IG9wdCwgZnVuYyA9IDA7CisJY29uc3QgdW5zaWduZWQgcGFnZXNpemUgPSBnZXRwYWdlc2l6ZSgpOworCisJd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgImlxcGxkYyIpKSAhPSAtMSkgeworCQlzd2l0Y2ggKG9wdCkgeworCQljYXNlICdpJzogLyogRmlyc3QgYXJnOiBJbnN0YWxsIG1vZGUsIHdpdGggcTogSW5mb3JtYXRpb24gKi8KKwkJCWlmICghZnVuYykgZnVuYyA9IHJwbV9pbnN0YWxsOworCQkJZWxzZSBmdW5jIHw9IHJwbV9xdWVyeV9pbmZvOworCQkJYnJlYWs7CisJCWNhc2UgJ3EnOiAvKiBGaXJzdCBhcmc6IFF1ZXJ5IG1vZGUgKi8KKwkJCWlmIChmdW5jKSBiYl9zaG93X3VzYWdlKCk7CisJCQlmdW5jID0gcnBtX3F1ZXJ5OworCQkJYnJlYWs7CisJCWNhc2UgJ3AnOiAvKiBRdWVyeSBhIHBhY2thZ2UgKi8KKwkJCWZ1bmMgfD0gcnBtX3F1ZXJ5X3BhY2thZ2U7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6IC8qIExpc3QgZmlsZXMgaW4gYSBwYWNrYWdlICovCisJCQlmdW5jIHw9IHJwbV9xdWVyeV9saXN0OworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOiAvKiBMaXN0IGRvYyBmaWxlcyBpbiBhIHBhY2thZ2UgKGltcGxpZXMgbGlzdCkgKi8KKwkJCWZ1bmMgfD0gcnBtX3F1ZXJ5X2xpc3Q7CisJCQlmdW5jIHw9IHJwbV9xdWVyeV9saXN0X2RvYzsKKwkJCWJyZWFrOworCQljYXNlICdjJzogLyogTGlzdCBjb25maWcgZmlsZXMgaW4gYSBwYWNrYWdlIChpbXBsaWVzIGxpc3QpICovCisJCQlmdW5jIHw9IHJwbV9xdWVyeV9saXN0OworCQkJZnVuYyB8PSBycG1fcXVlcnlfbGlzdF9jb25maWc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJfQorCX0KKwlhcmd2ICs9IG9wdGluZDsKKwkvL2FyZ2MgLT0gb3B0aW5kOworCWlmICghYXJndlswXSkgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJd2hpbGUgKCphcmd2KSB7CisJCWludCBycG1fZmQ7CisJCXVuc2lnbmVkIG1hcHNpemU7CisJCWNvbnN0IGNoYXIgKnNvdXJjZV9ycG07CisKKwkJcnBtX2ZkID0geG9wZW4oKmFyZ3YrKywgT19SRE9OTFkpOworCQlHLm15dGFncyA9IHJwbV9nZXR0YWdzKHJwbV9mZCwgJkcudGFnY291bnQpOworCQlpZiAoIUcubXl0YWdzKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImVycm9yIHJlYWRpbmcgcnBtIGhlYWRlciIpOworCQltYXBzaXplID0geGxzZWVrKHJwbV9mZCwgMCwgU0VFS19DVVIpOworCQltYXBzaXplID0gKG1hcHNpemUgKyBwYWdlc2l6ZSkgJiAtKGludClwYWdlc2l6ZTsKKwkJLyogU29tZSBOT01NVSBzeXN0ZW1zIHByZWZlciBNQVBfUFJJVkFURSBvdmVyIE1BUF9TSEFSRUQgKi8KKwkJRy5tYXAgPSBtbWFwKDAsIG1hcHNpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIHJwbV9mZCwgMCk7CisvL0ZJWE1FOiBlcnJvciBjaGVjaz8KKworCQlzb3VyY2VfcnBtID0gcnBtX2dldHN0cihUQUdfU09VUkNFUlBNLCAwKTsKKworCQlpZiAoZnVuYyAmIHJwbV9pbnN0YWxsKSB7CisJCQkvKiBCYWNrdXAgYW55IGNvbmZpZyBmaWxlcyAqLworCQkJbG9vcF90aHJvdWdoX2ZpbGVzKFRBR19CQVNFTkFNRVMsIGZpbGVhY3Rpb25fZG9iYWNrdXApOworCQkJLyogRXh0YWN0IHRoZSBhcmNoaXZlICovCisJCQlleHRyYWN0X2NwaW8ocnBtX2ZkLCBzb3VyY2VfcnBtKTsKKwkJCS8qIFNldCB0aGUgY29ycmVjdCBmaWxlIHVpZC9naWQncyAqLworCQkJbG9vcF90aHJvdWdoX2ZpbGVzKFRBR19CQVNFTkFNRVMsIGZpbGVhY3Rpb25fc2V0b3duZ3JwKTsKKwkJfQorCQllbHNlIGlmICgoZnVuYyAmIChycG1fcXVlcnl8cnBtX3F1ZXJ5X3BhY2thZ2UpKSA9PSAocnBtX3F1ZXJ5fHJwbV9xdWVyeV9wYWNrYWdlKSkgeworCQkJaWYgKCEoZnVuYyAmIChycG1fcXVlcnlfaW5mb3xycG1fcXVlcnlfbGlzdCkpKSB7CisJCQkJLyogSWYganVzdCBhIHN0cmFpZ2h0IHF1ZXJ5LCBqdXN0IGdpdmUgcGFja2FnZSBuYW1lICovCisJCQkJcHJpbnRmKCIlcy0lcy0lc1xuIiwgcnBtX2dldHN0cihUQUdfTkFNRSwgMCksIHJwbV9nZXRzdHIoVEFHX1ZFUlNJT04sIDApLCBycG1fZ2V0c3RyKFRBR19SRUxFQVNFLCAwKSk7CisJCQl9CisJCQlpZiAoZnVuYyAmIHJwbV9xdWVyeV9pbmZvKSB7CisJCQkJLyogRG8gdGhlIG5pY2UgcHJpbnRvdXQgKi8KKwkJCQl0aW1lX3QgYmRhdGVfdGltZTsKKwkJCQlzdHJ1Y3QgdG0gKmJkYXRlX3B0bTsKKwkJCQljaGFyIGJkYXRlc3RyaW5nWzUwXTsKKwkJCQljb25zdCBjaGFyICpwOworCisJCQkJcHJpbnRmKCIlLTEyczogJXNcbiIsICJOYW1lIiAgICAgICAgLCBycG1fZ2V0c3RyKFRBR19OQU1FLCAwKSk7CisJCQkJLyogVE9ETyBjb21wYXQ6IGFkZCAiRXBvY2giIGhlcmUgKi8KKwkJCQlwcmludGYoIiUtMTJzOiAlc1xuIiwgIlZlcnNpb24iICAgICAsIHJwbV9nZXRzdHIoVEFHX1ZFUlNJT04sIDApKTsKKwkJCQlwcmludGYoIiUtMTJzOiAlc1xuIiwgIlJlbGVhc2UiICAgICAsIHJwbV9nZXRzdHIoVEFHX1JFTEVBU0UsIDApKTsKKwkJCQkvKiBhZGQgIkFyY2hpdGVjdHVyZSIgKi8KKwkJCQlwcmludGYoIiUtMTJzOiAlc1xuIiwgIkluc3RhbGwgRGF0ZSIsICIobm90IGluc3RhbGxlZCkiKTsKKwkJCQlwcmludGYoIiUtMTJzOiAlc1xuIiwgIkdyb3VwIiAgICAgICAsIHJwbV9nZXRzdHIoVEFHX0dST1VQLCAwKSk7CisJCQkJcHJpbnRmKCIlLTEyczogJWRcbiIsICJTaXplIiAgICAgICAgLCBycG1fZ2V0aW50KFRBR19TSVpFLCAwKSk7CisJCQkJcHJpbnRmKCIlLTEyczogJXNcbiIsICJMaWNlbnNlIiAgICAgLCBycG1fZ2V0c3RyKFRBR19MSUNFTlNFLCAwKSk7CisJCQkJLyogYWRkICJTaWduYXR1cmUiICovCisJCQkJcHJpbnRmKCIlLTEyczogJXNcbiIsICJTb3VyY2UgUlBNIiAgLCBzb3VyY2VfcnBtID8gc291cmNlX3JwbSA6ICIobm9uZSkiKTsKKwkJCQliZGF0ZV90aW1lID0gcnBtX2dldGludChUQUdfQlVJTERUSU1FLCAwKTsKKwkJCQliZGF0ZV9wdG0gPSBsb2NhbHRpbWUoJmJkYXRlX3RpbWUpOworCQkJCXN0cmZ0aW1lKGJkYXRlc3RyaW5nLCA1MCwgIiVhICVkICViICVZICVUICVaIiwgYmRhdGVfcHRtKTsKKwkJCQlwcmludGYoIiUtMTJzOiAlc1xuIiwgIkJ1aWxkIERhdGUiICAsIGJkYXRlc3RyaW5nKTsKKwkJCQlwcmludGYoIiUtMTJzOiAlc1xuIiwgIkJ1aWxkIEhvc3QiICAsIHJwbV9nZXRzdHIoVEFHX0JVSUxESE9TVCwgMCkpOworCQkJCXAgPSBycG1fZ2V0c3RyKFRBR19QUkVGSVhTLCAwKTsKKwkJCQlwcmludGYoIiUtMTJzOiAlc1xuIiwgIlJlbG9jYXRpb25zIiAsIHAgPyBwIDogIihub3QgcmVsb2NhdGFibGUpIik7CisJCQkJLyogYWRkICJQYWNrYWdlciIgKi8KKwkJCQlwID0gcnBtX2dldHN0cihUQUdfVkVORE9SLCAwKTsKKwkJCQlwcmludGYoIiUtMTJzOiAlc1xuIiwgIlZlbmRvciIgICAgICAsIHAgPyBwIDogIihub25lKSIpOworCQkJCXByaW50ZigiJS0xMnM6ICVzXG4iLCAiVVJMIiAgICAgICAgICwgcnBtX2dldHN0cihUQUdfVVJMLCAwKSk7CisJCQkJcHJpbnRmKCIlLTEyczogJXNcbiIsICJTdW1tYXJ5IiAgICAgLCBycG1fZ2V0c3RyKFRBR19TVU1NQVJZLCAwKSk7CisJCQkJcHJpbnRmKCJEZXNjcmlwdGlvbiA6XG4lc1xuIiwgcnBtX2dldHN0cihUQUdfREVTQ1JJUFRJT04sIDApKTsKKwkJCX0KKwkJCWlmIChmdW5jICYgcnBtX3F1ZXJ5X2xpc3QpIHsKKwkJCQlpbnQgY291bnQsIGl0LCBmbGFnczsKKwkJCQljb3VudCA9IHJwbV9nZXRjb3VudChUQUdfQkFTRU5BTUVTKTsKKwkJCQlmb3IgKGl0ID0gMDsgaXQgPCBjb3VudDsgaXQrKykgeworCQkJCQlmbGFncyA9IHJwbV9nZXRpbnQoVEFHX0ZJTEVGTEFHUywgaXQpOworCQkJCQlzd2l0Y2ggKGZ1bmMgJiAocnBtX3F1ZXJ5X2xpc3RfZG9jfHJwbV9xdWVyeV9saXN0X2NvbmZpZykpIHsKKwkJCQkJY2FzZSBycG1fcXVlcnlfbGlzdF9kb2M6CisJCQkJCQlpZiAoIShmbGFncyAmIFJQTUZJTEVfRE9DKSkgY29udGludWU7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBycG1fcXVlcnlfbGlzdF9jb25maWc6CisJCQkJCQlpZiAoIShmbGFncyAmIFJQTUZJTEVfQ09ORklHKSkgY29udGludWU7CisJCQkJCQlicmVhazsKKwkJCQkJY2FzZSBycG1fcXVlcnlfbGlzdF9kb2N8cnBtX3F1ZXJ5X2xpc3RfY29uZmlnOgorCQkJCQkJaWYgKCEoZmxhZ3MgJiAoUlBNRklMRV9DT05GSUd8UlBNRklMRV9ET0MpKSkgY29udGludWU7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlwcmludGYoIiVzJXNcbiIsCisJCQkJCQlycG1fZ2V0c3RyKFRBR19ESVJOQU1FUywgcnBtX2dldGludChUQUdfRElSSU5ERVhFUywgaXQpKSwKKwkJCQkJCXJwbV9nZXRzdHIoVEFHX0JBU0VOQU1FUywgaXQpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJbXVubWFwKEcubWFwLCBtYXBzaXplKTsKKwkJZnJlZShHLm15dGFncyk7CisJCWNsb3NlKHJwbV9mZCk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvcnBtLmggYi9hcmNoaXZhbC9ycG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmUyYjU1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvcnBtLmgKQEAgLTAsMCArMSwzOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogUlBNIHN0cnVjdHMgYW5kIGNvbnN0cworICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBieSBMYXVyZW5jZSBBbmRlcnNvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogUlBNIGZpbGUgc3RhcnRzIHdpdGggdGhpcyBzdHJ1Y3Q6ICovCitzdHJ1Y3QgcnBtX2xlYWQgeworCXVpbnQzMl90IG1hZ2ljOworCXVpbnQ4X3QgIG1ham9yLCBtaW5vcjsKKwl1aW50MTZfdCB0eXBlOworCXVpbnQxNl90IGFyY2hudW07CisJY2hhciAgICAgbmFtZVs2Nl07CisJdWludDE2X3Qgb3NudW07CisJdWludDE2X3Qgc2lnbmF0dXJlX3R5cGU7CisJY2hhciAgICAgcmVzZXJ2ZWRbMTZdOworfTsKK3N0cnVjdCBCVUdfcnBtX2xlYWQgeworCWNoYXIgYnVnW3NpemVvZihzdHJ1Y3QgcnBtX2xlYWQpID09IDk2ID8gMSA6IC0xXTsKK307CisjZGVmaW5lIFJQTV9MRUFEX01BR0lDICAgICAgMHhlZGFiZWVkYgorI2RlZmluZSBSUE1fTEVBRF9NQUdJQ19TVFIgICJcMzU1XDI1M1wzNTZcMzMzIgorCisvKiBUaGVuIGZvbGxvd3MgdGhlIGhlYWRlcjogKi8KK3N0cnVjdCBycG1faGVhZGVyIHsKKwl1aW50MzJfdCBtYWdpY19hbmRfdmVyOyAvKiAzIGJ5dGUgbWFnaWM6IDB4OGUgMHhhZCAweGU4OyAxIGJ5dGUgdmVyc2lvbjogMHgwMSAqLworCXVpbnQzMl90IHJlc2VydmVkOyAgICAgIC8qIDQgYnl0ZXMgcmVzZXJ2ZWQgKi8KKwl1aW50MzJfdCBlbnRyaWVzOyAgICAgICAvKiBOdW1iZXIgb2YgZW50cmllcyBpbiBoZWFkZXIgKDQgYnl0ZXMpICovCisJdWludDMyX3Qgc2l6ZTsgICAgICAgICAgLyogU2l6ZSBvZiBzdG9yZSAoNCBieXRlcykgKi8KK307CitzdHJ1Y3QgQlVHX3JwbV9oZWFkZXIgeworCWNoYXIgYnVnW3NpemVvZihzdHJ1Y3QgcnBtX2hlYWRlcikgPT0gMTYgPyAxIDogLTFdOworfTsKKyNkZWZpbmUgUlBNX0hFQURFUl9NQUdJQ25WRVIgIDB4OGVhZGU4MDEKKyNkZWZpbmUgUlBNX0hFQURFUl9NQUdJQ19TVFIgICJcMjE2XDI1NVwzNTAiCmRpZmYgLS1naXQgYS9hcmNoaXZhbC9ycG0yY3Bpby5jIGIvYXJjaGl2YWwvcnBtMmNwaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDU3NTcwCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvcnBtMmNwaW8uYwpAQCAtMCwwICsxLDk2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHJwbTJjcGlvIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIGJ5IExhdXJlbmNlIEFuZGVyc29uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2NvbmZpZzpjb25maWcgUlBNMkNQSU8KKy8vY29uZmlnOglib29sICJycG0yY3BpbyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBDb252ZXJ0cyBhIFJQTSBmaWxlIGludG8gYSBDUElPIGFyY2hpdmUuCisKKy8vYXBwbGV0OklGX1JQTTJDUElPKEFQUExFVChycG0yY3BpbywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisvL2tidWlsZDpsaWItJChDT05GSUdfUlBNMkNQSU8pICs9IHJwbTJjcGlvLm8KKworLy91c2FnZTojZGVmaW5lIHJwbTJjcGlvX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJwYWNrYWdlLnJwbSIKKy8vdXNhZ2U6I2RlZmluZSBycG0yY3Bpb19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIk91dHB1dCBhIGNwaW8gYXJjaGl2ZSBvZiB0aGUgcnBtIGZpbGUiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImJiX2FyY2hpdmUuaCIKKyNpbmNsdWRlICJycG0uaCIKKworZW51bSB7IHJwbV9mZCA9IFNURElOX0ZJTEVOTyB9OworCitzdGF0aWMgdW5zaWduZWQgc2tpcF9oZWFkZXIodm9pZCkKK3sKKwlzdHJ1Y3QgcnBtX2hlYWRlciBoZWFkZXI7CisJdW5zaWduZWQgbGVuOworCisJeHJlYWQocnBtX2ZkLCAmaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7CisvLwlpZiAoc3RybmNtcCgoY2hhciAqKSAmaGVhZGVyLm1hZ2ljLCBSUE1fSEVBREVSX01BR0lDX1NUUiwgMykgIT0gMCkgeworLy8JCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIFJQTSBoZWFkZXIgbWFnaWMiKTsKKy8vCX0KKy8vCWlmIChoZWFkZXIudmVyc2lvbiAhPSAxKSB7CisvLwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVuc3VwcG9ydGVkIFJQTSBoZWFkZXIgdmVyc2lvbiIpOworLy8JfQorCWlmIChoZWFkZXIubWFnaWNfYW5kX3ZlciAhPSBodG9ubChSUE1fSEVBREVSX01BR0lDblZFUikpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgUlBNIGhlYWRlciBtYWdpYyBvciB1bnN1cHBvcnRlZCB2ZXJzaW9uIik7CisJCS8vICI6ICV4ICE9ICV4IiwgaGVhZGVyLm1hZ2ljX2FuZF92ZXIsIGh0b25sKFJQTV9IRUFERVJfTUFHSUNuVkVSKSk7CisJfQorCisJLyogU2VlayBwYXN0IGluZGV4IGVudHJpZXMsIGFuZCBwYXN0IHN0b3JlICovCisJbGVuID0gMTYgKiBudG9obChoZWFkZXIuZW50cmllcykgKyBudG9obChoZWFkZXIuc2l6ZSk7CisJc2Vla19ieV9qdW1wKHJwbV9mZCwgbGVuKTsKKworCXJldHVybiBzaXplb2YoaGVhZGVyKSArIGxlbjsKK30KKworLyogTm8gZ2V0b3B0IHJlcXVpcmVkICovCitpbnQgcnBtMmNwaW9fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJwbTJjcGlvX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgcnBtX2xlYWQgbGVhZDsKKwl1bnNpZ25lZCBwb3M7CisKKwlpZiAoYXJndlsxXSkgeworCQl4bW92ZV9mZCh4b3Blbihhcmd2WzFdLCBPX1JET05MWSksIHJwbV9mZCk7CisJfQorCXhyZWFkKHJwbV9mZCwgJmxlYWQsIHNpemVvZihsZWFkKSk7CisKKwkvKiBKdXN0IGNoZWNrIHRoZSBtYWdpYywgdGhlIHJlc3QgaXMgaXJyZWxldmFudCAqLworCWlmIChsZWFkLm1hZ2ljICE9IGh0b25sKFJQTV9MRUFEX01BR0lDKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBSUE0gbWFnaWMiKTsKKwl9CisKKwkvKiBTa2lwIHRoZSBzaWduYXR1cmUgaGVhZGVyLCBhbGlnbiB0byA4IGJ5dGVzICovCisJcG9zID0gc2tpcF9oZWFkZXIoKTsKKwlzZWVrX2J5X2p1bXAocnBtX2ZkLCAoLShpbnQpcG9zKSAmIDcpOworCisJLyogU2tpcCB0aGUgbWFpbiBoZWFkZXIgKi8KKwlza2lwX2hlYWRlcigpOworCisJLy9pZiAoU0VBTUxFU1NfQ09NUFJFU1NJT04pCisJLy8JLyogV2UgbmVlZCB0byBrbm93IHdoZXRoZXIgY2hpbGQgKGd6aXAvYnppcC9ldGMpIGV4aXRzIGFibm9ybWFsbHkgKi8KKwkvLwlzaWduYWwoU0lHQ0hMRCwgY2hlY2tfZXJyb3JzX2luX2NoaWxkcmVuKTsKKworCS8qIFRoaXMgd29ya3MsIGJ1dCBkb2Vzbid0IHJlcG9ydCB1bmNvbXByZXNzIGVycm9ycyAodGhleSBoYXBwZW4gaW4gY2hpbGQpICovCisJc2V0dXBfdW56aXBfb25fZmQocnBtX2ZkLCAvKmZhaWxfaWZfbm90X2NvbXByZXNzZWQ6Ki8gMSk7CisJaWYgKGJiX2NvcHlmZF9lb2YocnBtX2ZkLCBTVERPVVRfRklMRU5PKSA8IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJlcnJvciB1bnBhY2tpbmciKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQljbG9zZShycG1fZmQpOworCX0KKworCWlmIChTRUFNTEVTU19DT01QUkVTU0lPTikgeworCQljaGVja19lcnJvcnNfaW5fY2hpbGRyZW4oMCk7CisJCXJldHVybiBiYl9nb3Rfc2lnbmFsOworCX0KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvdGFyLmMgYi9hcmNoaXZhbC90YXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTAzYmE5Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGl2YWwvdGFyLmMKQEAgLTAsMCArMSwxMjE1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHRhciBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIE1vZGlmaWVkIHRvIHVzZSBjb21tb24gZXh0cmFjdGlvbiBjb2RlIHVzZWQgYnkgYXIsIGNwaW8sIGRwa2ctZGViLCBkcGtnCisgKiAgYnkgR2xlbm4gTWNHcmF0aAorICoKKyAqIE5vdGUsIHRoYXQgYXMgb2YgQnVzeUJveC0wLjQzLCB0YXIgaGFzIGJlZW4gY29tcGxldGVseSByZXdyaXR0ZW4gZnJvbSB0aGUKKyAqIGdyb3VuZCB1cC4gIEl0IHN0aWxsIGhhcyByZW1uYW50cyBvZiB0aGUgb2xkIGNvZGUgbHlpbmcgYWJvdXQsIGJ1dCBpdCBpcworICogdmVyeSBkaWZmZXJlbnQgbm93IChpLmUuLCBjbGVhbmVyLCBsZXNzIGdsb2JhbCB2YXJpYWJsZXMsIGV0Yy4pCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIEJhc2VkIGluIHBhcnQgaW4gdGhlIHRhciBpbXBsZW1lbnRhdGlvbiBpbiBzYXNoCisgKiAgQ29weXJpZ2h0IChjKSAxOTk5IGJ5IERhdmlkIEkuIEJlbGwKKyAqICBQZXJtaXNzaW9uIGlzIGdyYW50ZWQgdG8gdXNlLCBkaXN0cmlidXRlLCBvciBtb2RpZnkgdGhpcyBzb3VyY2UsCisgKiAgcHJvdmlkZWQgdGhhdCB0aGlzIGNvcHlyaWdodCBub3RpY2UgcmVtYWlucyBpbnRhY3QuCisgKiAgUGVybWlzc2lvbiB0byBkaXN0cmlidXRlIHNhc2ggZGVyaXZlZCBjb2RlIHVuZGVyIEdQTCBoYXMgYmVlbiBncmFudGVkLgorICoKKyAqIEJhc2VkIGluIHBhcnQgb24gdGhlIHRhciBpbXBsZW1lbnRhdGlvbiBmcm9tIGJ1c3lib3gtMC4yOAorICogIENvcHlyaWdodCAoQykgMTk5NSBCcnVjZSBQZXJlbnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisvKiBUT0RPOiBzZWN1cml0eSB3aXRoIC1DIERFU1RESVIgb3B0aW9uIGNhbiBiZSBlbmhhbmNlZC4KKyAqIENvbnNpZGVyIHRhciBmaWxlIGNyZWF0ZWQgdmlhOgorICogJCB0YXIgY3ZmIGJ1Zy50YXIgYW55dGhpbmcudHh0CisgKiAkIGxuIC1zIC90bXAgc3ltbGluaworICogJCB0YXIgLS1hcHBlbmQgLWYgYnVnLnRhciBzeW1saW5rCisgKiAkIHJtIHN5bWxpbmsKKyAqICQgbWtkaXIgc3ltbGluaworICogJCB0YXIgLS1hcHBlbmQgLWYgYnVnLnRhciBzeW1saW5rL2V2aWwucHkKKyAqCisgKiBUaGlzIHdpbGwgcmVzdWx0IGluIGFuIGFyY2hpdmUgd2hpY2ggY29udGFpbnM6CisgKiAkIHRhciAtLWxpc3QgLWYgYnVnLnRhcgorICogYW55dGhpbmcudHh0CisgKiBzeW1saW5rCisgKiBzeW1saW5rL2V2aWwucHkKKyAqCisgKiBVbnRhcnJpbmcgaXQgcHV0cyBldmlsLnB5IGluICcvdG1wJyBldmVuIGlmIHRoZSAtQyBERVNURElSIGlzIGdpdmVuLgorICogVGhpcyBkb2Vzbid0IGZlZWwgcmlnaHQsIGFuZCBJSVJDIEdOVSB0YXIgZG9lc24ndCBkbyB0aGF0LgorICovCisKKy8vY29uZmlnOmNvbmZpZyBUQVIKKy8vY29uZmlnOglib29sICJ0YXIiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgdGFyIGlzIGFuIGFyY2hpdmluZyBwcm9ncmFtLiBJdCdzIGNvbW1vbmx5IHVzZWQgd2l0aCBnemlwIHRvCisvL2NvbmZpZzoJICBjcmVhdGUgY29tcHJlc3NlZCBhcmNoaXZlcy4gSXQncyBwcm9iYWJseSB0aGUgbW9zdCB3aWRlbHkgdXNlZAorLy9jb25maWc6CSAgVU5JWCBhcmNoaXZlIHByb2dyYW0uCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1RBUl9DUkVBVEUKKy8vY29uZmlnOglib29sICJFbmFibGUgYXJjaGl2ZSBjcmVhdGlvbiIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFRBUgorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIElmIHlvdSBlbmFibGUgdGhpcyBvcHRpb24geW91J2xsIGJlIGFibGUgdG8gY3JlYXRlCisvL2NvbmZpZzoJICB0YXIgYXJjaGl2ZXMgdXNpbmcgdGhlIGAtYycgb3B0aW9uLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9UQVJfQVVUT0RFVEVDVAorLy9jb25maWc6CWJvb2wgIkF1dG9kZXRlY3QgY29tcHJlc3NlZCB0YXJiYWxscyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFRBUiAmJiAoRkVBVFVSRV9TRUFNTEVTU19aIHx8IEZFQVRVUkVfU0VBTUxFU1NfR1ogfHwgRkVBVFVSRV9TRUFNTEVTU19CWjIgfHwgRkVBVFVSRV9TRUFNTEVTU19MWk1BIHx8IEZFQVRVUkVfU0VBTUxFU1NfWFopCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgV2l0aCB0aGlzIG9wdGlvbiB0YXIgY2FuIGF1dG9tYXRpY2FsbHkgZGV0ZWN0IGNvbXByZXNzZWQKKy8vY29uZmlnOgkgIHRhcmJhbGxzLiBDdXJyZW50bHkgaXQgd29ya3Mgb25seSBvbiBmaWxlcyAobm90IHBpcGVzIGV0YykuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1RBUl9GUk9NCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1YIChleGNsdWRlIGZyb20pIGFuZCAtVCAoaW5jbHVkZSBmcm9tKSBvcHRpb25zKSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFRBUgorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIElmIHlvdSBlbmFibGUgdGhpcyBvcHRpb24geW91J2xsIGJlIGFibGUgdG8gc3BlY2lmeQorLy9jb25maWc6CSAgYSBsaXN0IG9mIGZpbGVzIHRvIGluY2x1ZGUgb3IgZXhjbHVkZSBmcm9tIGFuIGFyY2hpdmUuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1RBUl9PTERHTlVfQ09NUEFUSUJJTElUWQorLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgZm9yIG9sZCB0YXIgaGVhZGVyIGZvcm1hdCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFRBUiB8fCBEUEtHCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVGhpcyBvcHRpb24gaXMgcmVxdWlyZWQgdG8gdW5wYWNrIGFyY2hpdmVzIGNyZWF0ZWQgaW4KKy8vY29uZmlnOgkgIHRoZSBvbGQgR05VIGZvcm1hdDsgaGVscCB0byBraWxsIHRoaXMgb2xkIGZvcm1hdCBieQorLy9jb25maWc6CSAgcmVwYWNraW5nIHlvdXIgYW5jaWVudCBhcmNoaXZlcyB3aXRoIHRoZSBuZXcgZm9ybWF0LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9UQVJfT0xEU1VOX0NPTVBBVElCSUxJVFkKKy8vY29uZmlnOglib29sICJFbmFibGUgdW50YXJyaW5nIG9mIHRhcmJhbGxzIHdpdGggY2hlY2tzdW1zIHByb2R1Y2VkIGJ5IGJ1Z2d5IFN1biB0YXIiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBUQVIgfHwgRFBLRworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRoaXMgb3B0aW9uIGlzIHJlcXVpcmVkIHRvIHVucGFjayBhcmNoaXZlcyBjcmVhdGVkIGJ5IHNvbWUgb2xkCisvL2NvbmZpZzoJICB2ZXJzaW9uIG9mIFN1bidzIHRhciAoaXQgd2FzIGNhbGN1bGF0aW5nIGNoZWNrc3VtIHVzaW5nIHNpZ25lZAorLy9jb25maWc6CSAgYXJpdGhtZXRpYykuIEl0IGlzIHNhaWQgdG8gYmUgZml4ZWQgaW4gbmV3ZXIgU3VuIHRhciwgYnV0ICJvbGQiCisvL2NvbmZpZzoJICB0YXJiYWxscyBzdGlsbCBleGlzdC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCBmb3IgR05VIHRhciBleHRlbnNpb25zIChsb25nIGZpbGVuYW1lcykiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBUQVIgfHwgRFBLRworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFdpdGggdGhpcyBvcHRpb24gYnVzeWJveCBzdXBwb3J0cyBHTlUgbG9uZyBmaWxlbmFtZXMgYW5kCisvL2NvbmZpZzoJICBsaW5rbmFtZXMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1RBUl9MT05HX09QVElPTlMKKy8vY29uZmlnOglib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVEFSICYmIExPTkdfT1BUUworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSB1c2Ugb2YgbG9uZyBvcHRpb25zLCBpbmNyZWFzZXMgc2l6ZSBieSBhYm91dCA0MDAgQnl0ZXMKKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVEFSX1RPX0NPTU1BTkQKKy8vY29uZmlnOglib29sICJTdXBwb3J0IGZvciB3cml0aW5nIHRvIGFuIGV4dGVybmFsIHByb2dyYW0iCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBUQVIgJiYgRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgSWYgeW91IGVuYWJsZSB0aGlzIG9wdGlvbiB5b3UnbGwgYmUgYWJsZSB0byBpbnN0cnVjdCB0YXIgdG8gc2VuZAorLy9jb25maWc6CSAgdGhlIGNvbnRlbnRzIG9mIGVhY2ggZXh0cmFjdGVkIGZpbGUgdG8gdGhlIHN0YW5kYXJkIGlucHV0IG9mIGFuCisvL2NvbmZpZzoJICBleHRlcm5hbCBwcm9ncmFtLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9UQVJfVU5BTUVfR05BTUUKKy8vY29uZmlnOglib29sICJFbmFibGUgdXNlIG9mIHVzZXIgYW5kIGdyb3VwIG5hbWVzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVEFSCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlcyB1c2Ugb2YgdXNlciBhbmQgZ3JvdXAgbmFtZXMgaW4gdGFyLiBUaGlzIGFmZmVjdHMgY29udGVudHMKKy8vY29uZmlnOgkgIGxpc3RpbmdzICgtdCkgYW5kIHByZXNlcnZpbmcgcGVybWlzc2lvbnMgd2hlbiB1bnBhY2tpbmcgKC1wKS4KKy8vY29uZmlnOgkgICsyMDAgYnl0ZXMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1RBUl9OT1BSRVNFUlZFX1RJTUUKKy8vY29uZmlnOglib29sICJFbmFibGUgLW0gKGRvIG5vdCBwcmVzZXJ2ZSB0aW1lKSBvcHRpb24iCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBUQVIKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBXaXRoIHRoaXMgb3B0aW9uIGJ1c3lib3ggc3VwcG9ydHMgR05VIHRhciAtbQorLy9jb25maWc6CSAgKGRvIG5vdCBwcmVzZXJ2ZSB0aW1lKSBvcHRpb24uCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1RBUl9TRUxJTlVYCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCBmb3IgZXh0cmFjdGluZyBTRUxpbnV4IGxhYmVscyIKKy8vY29uZmlnOglkZWZhdWx0IG4KKy8vY29uZmlnOglkZXBlbmRzIG9uIFRBUiAmJiBTRUxJTlVYCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgV2l0aCB0aGlzIG9wdGlvbiBidXN5Ym94IHN1cHBvcnRzIHJlc3RvcmluZyBTRUxpbnV4IGxhYmVscworLy9jb25maWc6CSAgd2hlbiBleHRyYWN0aW5nIGZpbGVzIGZyb20gdGFyIGFyY2hpdmVzLgorCisvL2FwcGxldDpJRl9UQVIoQVBQTEVUKHRhciwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8va2J1aWxkOmxpYi0kKENPTkZJR19UQVIpICs9IHRhci5vCisKKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJiYl9hcmNoaXZlLmgiCisvKiBGSVhNRTogU3RvcCB1c2luZyB0aGlzIG5vbi1zdGFuZGFyZCBmZWF0dXJlICovCisjaWZuZGVmIEZOTV9MRUFESU5HX0RJUgorIyBkZWZpbmUgRk5NX0xFQURJTkdfRElSIDAKKyNlbmRpZgorCisKKy8vI2RlZmluZSBEQkcoZm10LCAuLi4pIGJiX2Vycm9yX21zZygiJXM6ICIgZm10LCBfX2Z1bmNfXywgIyMgX19WQV9BUkdTX18pCisjZGVmaW5lIERCRyguLi4pICgodm9pZCkwKQorCisKKyNkZWZpbmUgYmxvY2tfYnVmIGJiX2NvbW1vbl9idWZzaXoxCisKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9DUkVBVEUKKworLyoKKyoqIHdyaXRlVGFyRmlsZSgpLCB3cml0ZUZpbGVUb1RhcmJhbGwoKSwgYW5kIHdyaXRlVGFySGVhZGVyKCkgYXJlCisqKiB0aGUgb25seSBmdW5jdGlvbnMgdGhhdCBkZWFsIHdpdGggdGhlIEhhcmRMaW5rSW5mbyBzdHJ1Y3R1cmUuCisqKiBFdmVuIHRoZXNlIGZ1bmN0aW9ucyB1c2UgdGhlIHh4eEhhcmRMaW5rSW5mbygpIGZ1bmN0aW9ucy4KKyovCit0eXBlZGVmIHN0cnVjdCBIYXJkTGlua0luZm8geworCXN0cnVjdCBIYXJkTGlua0luZm8gKm5leHQ7IC8qIE5leHQgZW50cnkgaW4gbGlzdCAqLworCWRldl90IGRldjsgICAgICAgICAgICAgICAgIC8qIERldmljZSBudW1iZXIgKi8KKwlpbm9fdCBpbm87ICAgICAgICAgICAgICAgICAvKiBJbm9kZSBudW1iZXIgKi8KKy8vCXNob3J0IGxpbmtDb3VudDsgICAgICAgICAgIC8qIChIYXJkKSBMaW5rIENvdW50ICovCisJY2hhciBuYW1lWzFdOyAgICAgICAgICAgICAgLyogU3RhcnQgb2YgZmlsZW5hbWUgKG11c3QgYmUgbGFzdCkgKi8KK30gSGFyZExpbmtJbmZvOworCisvKiBTb21lIGluZm8gdG8gYmUgY2FycmllZCBhbG9uZyB3aGVuIGNyZWF0aW5nIGEgbmV3IHRhcmJhbGwgKi8KK3R5cGVkZWYgc3RydWN0IFRhckJhbGxJbmZvIHsKKwlpbnQgdGFyRmQ7ICAgICAgICAgICAgICAgICAgICAgIC8qIE9wZW4tZm9yLXdyaXRlIGZpbGUgZGVzY3JpcHRvcgorCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZm9yIHRoZSB0YXJiYWxsICovCisJaW50IHZlcmJvc2VGbGFnOyAgICAgICAgICAgICAgICAvKiBXaGV0aGVyIHRvIHByaW50IGV4dHJhIHN0dWZmIG9yIG5vdCAqLworCWNvbnN0IGxsaXN0X3QgKmV4Y2x1ZGVMaXN0OyAgICAgLyogTGlzdCBvZiBmaWxlcyB0byBub3QgaW5jbHVkZSAqLworCUhhcmRMaW5rSW5mbyAqaGxJbmZvSGVhZDsgICAgICAgLyogSGFyZCBMaW5rIFRyYWNraW5nIEluZm9ybWF0aW9uICovCisJSGFyZExpbmtJbmZvICpobEluZm87ICAgICAgICAgICAvKiBIYXJkIExpbmsgSW5mbyBmb3IgdGhlIGN1cnJlbnQgZmlsZSAqLworLy9UT0RPOiBzYXZlIG9ubHkgc3RfZGV2ICsgc3RfaW5vCisJc3RydWN0IHN0YXQgdGFyRmlsZVN0YXRCdWY7ICAgICAvKiBTdGF0IGluZm8gZm9yIHRoZSB0YXJiYWxsLCBsZXR0aW5nCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB1cyBrbm93IHRoZSBpbm9kZSBhbmQgZGV2aWNlIHRoYXQgdGhlCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0YXJiYWxsIGxpdmVzLCBzbyB3ZSBjYW4gYXZvaWQgdHJ5aW5nCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiB0byBpbmNsdWRlIHRoZSB0YXJiYWxsIGludG8gaXRzZWxmICovCit9IFRhckJhbGxJbmZvOworCisvKiBBIG5pY2UgZW51bSB3aXRoIGFsbCB0aGUgcG9zc2libGUgdGFyIGZpbGUgY29udGVudCB0eXBlcyAqLworZW51bSB7CisJUkVHVFlQRSA9ICcwJywJCS8qIHJlZ3VsYXIgZmlsZSAqLworCVJFR1RZUEUwID0gJ1wwJywJLyogcmVndWxhciBmaWxlIChhbmNpZW50IGJ1ZyBjb21wYXQpICovCisJTE5LVFlQRSA9ICcxJywJCS8qIGhhcmQgbGluayAqLworCVNZTVRZUEUgPSAnMicsCQkvKiBzeW1ib2xpYyBsaW5rICovCisJQ0hSVFlQRSA9ICczJywJCS8qIGNoYXJhY3RlciBzcGVjaWFsICovCisJQkxLVFlQRSA9ICc0JywJCS8qIGJsb2NrIHNwZWNpYWwgKi8KKwlESVJUWVBFID0gJzUnLAkJLyogZGlyZWN0b3J5ICovCisJRklGT1RZUEUgPSAnNicsCQkvKiBGSUZPIHNwZWNpYWwgKi8KKwlDT05UVFlQRSA9ICc3JywJCS8qIHJlc2VydmVkICovCisJR05VTE9OR0xJTksgPSAnSycsCS8qIEdOVSBsb25nICg+MTAwIGNoYXJzKSBsaW5rIG5hbWUgKi8KKwlHTlVMT05HTkFNRSA9ICdMJywJLyogR05VIGxvbmcgKD4xMDAgY2hhcnMpIGZpbGUgbmFtZSAqLworfTsKKworLyogTWlnaHQgYmUgZmFzdGVyIChhbmQgYmlnZ2VyKSBpZiB0aGUgZGV2L2lubyB3ZXJlIHN0b3JlZCBpbiBudW1lcmljIG9yZGVyOykgKi8KK3N0YXRpYyB2b2lkIGFkZEhhcmRMaW5rSW5mbyhIYXJkTGlua0luZm8gKipobEluZm9IZWFkUHRyLAorCQkJCQlzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZiwKKwkJCQkJY29uc3QgY2hhciAqZmlsZU5hbWUpCit7CisJLyogTm90ZTogaGxJbmZvSGVhZFB0ciBjYW4gbmV2ZXIgYmUgTlVMTCEgKi8KKwlIYXJkTGlua0luZm8gKmhsSW5mbzsKKworCWhsSW5mbyA9IHhtYWxsb2Moc2l6ZW9mKEhhcmRMaW5rSW5mbykgKyBzdHJsZW4oZmlsZU5hbWUpKTsKKwlobEluZm8tPm5leHQgPSAqaGxJbmZvSGVhZFB0cjsKKwkqaGxJbmZvSGVhZFB0ciA9IGhsSW5mbzsKKwlobEluZm8tPmRldiA9IHN0YXRidWYtPnN0X2RldjsKKwlobEluZm8tPmlubyA9IHN0YXRidWYtPnN0X2lubzsKKy8vCWhsSW5mby0+bGlua0NvdW50ID0gc3RhdGJ1Zi0+c3Rfbmxpbms7CisJc3RyY3B5KGhsSW5mby0+bmFtZSwgZmlsZU5hbWUpOworfQorCitzdGF0aWMgdm9pZCBmcmVlSGFyZExpbmtJbmZvKEhhcmRMaW5rSW5mbyAqKmhsSW5mb0hlYWRQdHIpCit7CisJSGFyZExpbmtJbmZvICpobEluZm87CisJSGFyZExpbmtJbmZvICpobEluZm9OZXh0OworCisJaWYgKGhsSW5mb0hlYWRQdHIpIHsKKwkJaGxJbmZvID0gKmhsSW5mb0hlYWRQdHI7CisJCXdoaWxlIChobEluZm8pIHsKKwkJCWhsSW5mb05leHQgPSBobEluZm8tPm5leHQ7CisJCQlmcmVlKGhsSW5mbyk7CisJCQlobEluZm8gPSBobEluZm9OZXh0OworCQl9CisJCSpobEluZm9IZWFkUHRyID0gTlVMTDsKKwl9Cit9CisKKy8qIE1pZ2h0IGJlIGZhc3RlciAoYW5kIGJpZ2dlcikgaWYgdGhlIGRldi9pbm8gd2VyZSBzdG9yZWQgaW4gbnVtZXJpYyBvcmRlciA7KSAqLworc3RhdGljIEhhcmRMaW5rSW5mbyAqZmluZEhhcmRMaW5rSW5mbyhIYXJkTGlua0luZm8gKmhsSW5mbywgc3RydWN0IHN0YXQgKnN0YXRidWYpCit7CisJd2hpbGUgKGhsSW5mbykgeworCQlpZiAoc3RhdGJ1Zi0+c3RfaW5vID09IGhsSW5mby0+aW5vCisJCSAmJiBzdGF0YnVmLT5zdF9kZXYgPT0gaGxJbmZvLT5kZXYKKwkJKSB7CisJCQlEQkcoImZvdW5kIGhhcmRsaW5rOiclcyciLCBobEluZm8tPm5hbWUpOworCQkJYnJlYWs7CisJCX0KKwkJaGxJbmZvID0gaGxJbmZvLT5uZXh0OworCX0KKwlyZXR1cm4gaGxJbmZvOworfQorCisvKiBQdXQgYW4gb2N0YWwgc3RyaW5nIGludG8gdGhlIHNwZWNpZmllZCBidWZmZXIuCisgKiBUaGUgbnVtYmVyIGlzIHplcm8gcGFkZGVkIGFuZCBwb3NzaWJseSBudWxsIHRlcm1pbmF0ZWQuCisgKiBTdG9yZXMgbG93LW9yZGVyIGJpdHMgb25seSBpZiB3aG9sZSB2YWx1ZSBkb2VzIG5vdCBmaXQuICovCitzdGF0aWMgdm9pZCBwdXRPY3RhbChjaGFyICpjcCwgaW50IGxlbiwgb2ZmX3QgdmFsdWUpCit7CisJY2hhciB0ZW1wQnVmZmVyW3NpemVvZihvZmZfdCkqMyArIDFdOworCWNoYXIgKnRlbXBTdHJpbmcgPSB0ZW1wQnVmZmVyOworCWludCB3aWR0aDsKKworCXdpZHRoID0gc3ByaW50Zih0ZW1wQnVmZmVyLCAiJTAqIk9GRl9GTVQibyIsIGxlbiwgdmFsdWUpOworCXRlbXBTdHJpbmcgKz0gKHdpZHRoIC0gbGVuKTsKKworCS8qIElmIHN0cmluZyBoYXMgbGVhZGluZyB6ZXJvZXMsIHdlIGNhbiBkcm9wIG9uZSAqLworCS8qIGFuZCBmaWVsZCB3aWxsIGhhdmUgdHJhaWxpbmcgJ1wwJyAqLworCS8qIChpbmNyZWFzZXMgY2hhbmNlcyBvZiBjb21wYXQgd2l0aCBvdGhlciB0YXJzKSAqLworCWlmICh0ZW1wU3RyaW5nWzBdID09ICcwJykKKwkJdGVtcFN0cmluZysrOworCisJLyogQ29weSB0aGUgc3RyaW5nIHRvIHRoZSBmaWVsZCAqLworCW1lbWNweShjcCwgdGVtcFN0cmluZywgbGVuKTsKK30KKyNkZWZpbmUgUFVUX09DVEFMKGEsIGIpIHB1dE9jdGFsKChhKSwgc2l6ZW9mKGEpLCAoYikpCisKK3N0YXRpYyB2b2lkIGNoa3N1bV9hbmRfeHdyaXRlKGludCBmZCwgc3RydWN0IHRhcl9oZWFkZXJfdCogaHApCit7CisJLyogUE9TSVggc2F5cyB0aGF0IGNoZWNrc3VtIGlzIGRvbmUgb24gdW5zaWduZWQgYnl0ZXMKKwkgKiAoU3VuIGFuZCBIUC1VWCBnZXRzIGl0IHdyb25nLi4uIG1vcmUgZGV0YWlscyBpbgorCSAqIEdOVSB0YXIgc291cmNlKSAqLworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNwOworCWludCBjaGtzdW0sIHNpemU7CisKKwlzdHJjcHkoaHAtPm1hZ2ljLCAidXN0YXIgICIpOworCisJLyogQ2FsY3VsYXRlIGFuZCBzdG9yZSB0aGUgY2hlY2tzdW0gKGkuZS4sIHRoZSBzdW0gb2YgYWxsIG9mIHRoZSBieXRlcyBvZgorCSAqIHRoZSBoZWFkZXIpLiAgVGhlIGNoZWNrc3VtIGZpZWxkIG11c3QgYmUgZmlsbGVkIHdpdGggYmxhbmtzIGZvciB0aGUKKwkgKiBjYWxjdWxhdGlvbi4gIFRoZSBjaGVja3N1bSBmaWVsZCBpcyBmb3JtYXR0ZWQgZGlmZmVyZW50bHkgZnJvbSB0aGUKKwkgKiBvdGhlciBmaWVsZHM6IGl0IGhhcyA2IGRpZ2l0cywgYSBudWxsLCB0aGVuIGEgc3BhY2UgLS0gcmF0aGVyIHRoYW4KKwkgKiBkaWdpdHMsIGZvbGxvd2VkIGJ5IGEgbnVsbCBsaWtlIHRoZSBvdGhlciBmaWVsZHMuLi4gKi8KKwltZW1zZXQoaHAtPmNoa3N1bSwgJyAnLCBzaXplb2YoaHAtPmNoa3N1bSkpOworCWNwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgaHA7CisJY2hrc3VtID0gMDsKKwlzaXplID0gc2l6ZW9mKCpocCk7CisJZG8geyBjaGtzdW0gKz0gKmNwKys7IH0gd2hpbGUgKC0tc2l6ZSk7CisJcHV0T2N0YWwoaHAtPmNoa3N1bSwgc2l6ZW9mKGhwLT5jaGtzdW0pLTEsIGNoa3N1bSk7CisKKwkvKiBOb3cgd3JpdGUgdGhlIGhlYWRlciBvdXQgdG8gZGlzayAqLworCXh3cml0ZShmZCwgaHAsIHNpemVvZigqaHApKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9HTlVfRVhURU5TSU9OUworc3RhdGljIHZvaWQgd3JpdGVMb25nbmFtZShpbnQgZmQsIGludCB0eXBlLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZGlyKQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQljaGFyIG1vZGVbOF07ICAgICAgICAgICAgIC8qIDEwMC0xMDcgKi8KKwkJY2hhciB1aWRbOF07ICAgICAgICAgICAgICAvKiAxMDgtMTE1ICovCisJCWNoYXIgZ2lkWzhdOyAgICAgICAgICAgICAgLyogMTE2LTEyMyAqLworCQljaGFyIHNpemVbMTJdOyAgICAgICAgICAgIC8qIDEyNC0xMzUgKi8KKwkJY2hhciBtdGltZVsxMl07ICAgICAgICAgICAvKiAxMzYtMTQ3ICovCisJfSBwcmVmaWxsZWQgPSB7CisJCSIwMDAwMDAwIiwKKwkJIjAwMDAwMDAiLAorCQkiMDAwMDAwMCIsCisJCSIwMDAwMDAwMDAwMCIsCisJCSIwMDAwMDAwMDAwMCIsCisJfTsKKwlzdHJ1Y3QgdGFyX2hlYWRlcl90IGhlYWRlcjsKKwlpbnQgc2l6ZTsKKworCWRpciA9ICEhZGlyOyAvKiBub3JtYWxpemU6IDAvMSAqLworCXNpemUgPSBzdHJsZW4obmFtZSkgKyAxICsgZGlyOyAvKiBHTlUgdGFyIHVzZXMgc3RybGVuKzEgKi8KKwkvKiArIGRpcjogYWNjb3VudCBmb3IgcG9zc2libGUgJy8nICovCisKKwltZW1zZXQoJmhlYWRlciwgMCwgc2l6ZW9mKGhlYWRlcikpOworCXN0cmNweShoZWFkZXIubmFtZSwgIi4vLi9ATG9uZ0xpbmsiKTsKKwltZW1jcHkoaGVhZGVyLm1vZGUsIHByZWZpbGxlZC5tb2RlLCBzaXplb2YocHJlZmlsbGVkKSk7CisJUFVUX09DVEFMKGhlYWRlci5zaXplLCBzaXplKTsKKwloZWFkZXIudHlwZWZsYWcgPSB0eXBlOworCWNoa3N1bV9hbmRfeHdyaXRlKGZkLCAmaGVhZGVyKTsKKworCS8qIFdyaXRlIGZpbGVuYW1lWy9dIGFuZCBwYWQgdGhlIGJsb2NrLiAqLworCS8qIGRpcj0wOiB3cml0ZXMgJ25hbWU8TlVMPicsIHBhZHMgKi8KKwkvKiBkaXI9MTogd3JpdGVzICduYW1lJywgd3JpdGVzICcvPE5VTD4nLCBwYWRzICovCisJZGlyICo9IDI7CisJeHdyaXRlKGZkLCBuYW1lLCBzaXplIC0gZGlyKTsKKwl4d3JpdGUoZmQsICIvIiwgZGlyKTsKKwlzaXplID0gKC1zaXplKSAmIChUQVJfQkxPQ0tfU0laRS0xKTsKKwltZW1zZXQoJmhlYWRlciwgMCwgc2l6ZSk7CisJeHdyaXRlKGZkLCAmaGVhZGVyLCBzaXplKTsKK30KKyNlbmRpZgorCisvKiBXcml0ZSBvdXQgYSB0YXIgaGVhZGVyIGZvciB0aGUgc3BlY2lmaWVkIGZpbGUvZGlyZWN0b3J5L3doYXRldmVyICovCitzdGF0aWMgaW50IHdyaXRlVGFySGVhZGVyKHN0cnVjdCBUYXJCYWxsSW5mbyAqdGJJbmZvLAorCQljb25zdCBjaGFyICpoZWFkZXJfbmFtZSwgY29uc3QgY2hhciAqZmlsZU5hbWUsIHN0cnVjdCBzdGF0ICpzdGF0YnVmKQoreworCXN0cnVjdCB0YXJfaGVhZGVyX3QgaGVhZGVyOworCisJbWVtc2V0KCZoZWFkZXIsIDAsIHNpemVvZihoZWFkZXIpKTsKKworCXN0cm5jcHkoaGVhZGVyLm5hbWUsIGhlYWRlcl9uYW1lLCBzaXplb2YoaGVhZGVyLm5hbWUpKTsKKworCS8qIFBPU0lYIHNheXMgdG8gbWFzayBtb2RlIHdpdGggMDc3NzcuICovCisJUFVUX09DVEFMKGhlYWRlci5tb2RlLCBzdGF0YnVmLT5zdF9tb2RlICYgMDc3NzcpOworCVBVVF9PQ1RBTChoZWFkZXIudWlkLCBzdGF0YnVmLT5zdF91aWQpOworCVBVVF9PQ1RBTChoZWFkZXIuZ2lkLCBzdGF0YnVmLT5zdF9naWQpOworCW1lbXNldChoZWFkZXIuc2l6ZSwgJzAnLCBzaXplb2YoaGVhZGVyLnNpemUpLTEpOyAvKiBSZWd1bGFyIGZpbGUgc2l6ZSBpcyBoYW5kbGVkIGxhdGVyICovCisJLyogdXNlcnMgcmVwb3J0IHRoYXQgZmlsZXMgd2l0aCBuZWdhdGl2ZSBzdF9tdGltZSBjYXVzZSB0cm91YmxlLCBzbzogKi8KKwlQVVRfT0NUQUwoaGVhZGVyLm10aW1lLCBzdGF0YnVmLT5zdF9tdGltZSA+PSAwID8gc3RhdGJ1Zi0+c3RfbXRpbWUgOiAwKTsKKworCS8qIEVudGVyIHRoZSB1c2VyIGFuZCBncm91cCBuYW1lcyAqLworCXNhZmVfc3RybmNweShoZWFkZXIudW5hbWUsIGdldF9jYWNoZWRfdXNlcm5hbWUoc3RhdGJ1Zi0+c3RfdWlkKSwgc2l6ZW9mKGhlYWRlci51bmFtZSkpOworCXNhZmVfc3RybmNweShoZWFkZXIuZ25hbWUsIGdldF9jYWNoZWRfZ3JvdXBuYW1lKHN0YXRidWYtPnN0X2dpZCksIHNpemVvZihoZWFkZXIuZ25hbWUpKTsKKworCWlmICh0YkluZm8tPmhsSW5mbykgeworCQkvKiBUaGlzIGlzIGEgaGFyZCBsaW5rICovCisJCWhlYWRlci50eXBlZmxhZyA9IExOS1RZUEU7CisJCXN0cm5jcHkoaGVhZGVyLmxpbmtuYW1lLCB0YkluZm8tPmhsSW5mby0+bmFtZSwKKwkJCQlzaXplb2YoaGVhZGVyLmxpbmtuYW1lKSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TCisJCS8qIFdyaXRlIG91dCBsb25nIGxpbmtuYW1lIGlmIG5lZWRlZCAqLworCQlpZiAoaGVhZGVyLmxpbmtuYW1lW3NpemVvZihoZWFkZXIubGlua25hbWUpLTFdKQorCQkJd3JpdGVMb25nbmFtZSh0YkluZm8tPnRhckZkLCBHTlVMT05HTElOSywKKwkJCQkJdGJJbmZvLT5obEluZm8tPm5hbWUsIDApOworI2VuZGlmCisJfSBlbHNlIGlmIChTX0lTTE5LKHN0YXRidWYtPnN0X21vZGUpKSB7CisJCWNoYXIgKmxwYXRoID0geG1hbGxvY19yZWFkbGlua19vcl93YXJuKGZpbGVOYW1lKTsKKwkJaWYgKCFscGF0aCkKKwkJCXJldHVybiBGQUxTRTsKKwkJaGVhZGVyLnR5cGVmbGFnID0gU1lNVFlQRTsKKwkJc3RybmNweShoZWFkZXIubGlua25hbWUsIGxwYXRoLCBzaXplb2YoaGVhZGVyLmxpbmtuYW1lKSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TCisJCS8qIFdyaXRlIG91dCBsb25nIGxpbmtuYW1lIGlmIG5lZWRlZCAqLworCQlpZiAoaGVhZGVyLmxpbmtuYW1lW3NpemVvZihoZWFkZXIubGlua25hbWUpLTFdKQorCQkJd3JpdGVMb25nbmFtZSh0YkluZm8tPnRhckZkLCBHTlVMT05HTElOSywgbHBhdGgsIDApOworI2Vsc2UKKwkJLyogSWYgaXQgaXMgbGFyZ2VyIHRoYW4gMTAwIGJ5dGVzLCBiYWlsIG91dCAqLworCQlpZiAoaGVhZGVyLmxpbmtuYW1lW3NpemVvZihoZWFkZXIubGlua25hbWUpLTFdKSB7CisJCQlmcmVlKGxwYXRoKTsKKwkJCWJiX2Vycm9yX21zZygibmFtZXMgbG9uZ2VyIHRoYW4gIk5BTUVfU0laRV9TVFIiIGNoYXJzIG5vdCBzdXBwb3J0ZWQiKTsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorI2VuZGlmCisJCWZyZWUobHBhdGgpOworCX0gZWxzZSBpZiAoU19JU0RJUihzdGF0YnVmLT5zdF9tb2RlKSkgeworCQloZWFkZXIudHlwZWZsYWcgPSBESVJUWVBFOworCQkvKiBBcHBlbmQgJy8nIG9ubHkgaWYgdGhlcmUgaXMgYSBzcGFjZSBmb3IgaXQgKi8KKwkJaWYgKCFoZWFkZXIubmFtZVtzaXplb2YoaGVhZGVyLm5hbWUpLTFdKQorCQkJaGVhZGVyLm5hbWVbc3RybGVuKGhlYWRlci5uYW1lKV0gPSAnLyc7CisJfSBlbHNlIGlmIChTX0lTQ0hSKHN0YXRidWYtPnN0X21vZGUpKSB7CisJCWhlYWRlci50eXBlZmxhZyA9IENIUlRZUEU7CisJCVBVVF9PQ1RBTChoZWFkZXIuZGV2bWFqb3IsIG1ham9yKHN0YXRidWYtPnN0X3JkZXYpKTsKKwkJUFVUX09DVEFMKGhlYWRlci5kZXZtaW5vciwgbWlub3Ioc3RhdGJ1Zi0+c3RfcmRldikpOworCX0gZWxzZSBpZiAoU19JU0JMSyhzdGF0YnVmLT5zdF9tb2RlKSkgeworCQloZWFkZXIudHlwZWZsYWcgPSBCTEtUWVBFOworCQlQVVRfT0NUQUwoaGVhZGVyLmRldm1ham9yLCBtYWpvcihzdGF0YnVmLT5zdF9yZGV2KSk7CisJCVBVVF9PQ1RBTChoZWFkZXIuZGV2bWlub3IsIG1pbm9yKHN0YXRidWYtPnN0X3JkZXYpKTsKKwl9IGVsc2UgaWYgKFNfSVNGSUZPKHN0YXRidWYtPnN0X21vZGUpKSB7CisJCWhlYWRlci50eXBlZmxhZyA9IEZJRk9UWVBFOworCX0gZWxzZSBpZiAoU19JU1JFRyhzdGF0YnVmLT5zdF9tb2RlKSkgeworCQkvKiBoZWFkZXIuc2l6ZSBmaWVsZCBpcyAxMiBieXRlcyBsb25nICovCisJCS8qIERvZXMgb2N0YWwtZW5jb2RlZCBzaXplIGZpdD8gKi8KKwkJdW9mZl90IGZpbGVzaXplID0gc3RhdGJ1Zi0+c3Rfc2l6ZTsKKwkJaWYgKHNpemVvZihmaWxlc2l6ZSkgPD0gNAorCQkgfHwgZmlsZXNpemUgPD0gKHVvZmZfdCkwNzc3Nzc3Nzc3Nzc3TEwKKwkJKSB7CisJCQlQVVRfT0NUQUwoaGVhZGVyLnNpemUsIGZpbGVzaXplKTsKKwkJfQorCQkvKiBEb2VzIGJhc2UyNTYtZW5jb2RlZCBzaXplIGZpdD8KKwkJICogSXQgYWx3YXlzIGRvZXMgdW5sZXNzIG9mZl90IGlzIHdpZGVyIHRoYW4gNjQgYml0cy4KKwkJICovCisJCWVsc2UgaWYgKEVOQUJMRV9GRUFUVVJFX1RBUl9HTlVfRVhURU5TSU9OUworI2lmIFVMTE9OR19NQVggPiAweGZmZmZmZmZmZmZmZmZmZmZMTCAvKiAyXjY0LTEgKi8KKwkJICYmIChmaWxlc2l6ZSA8PSAweDNmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZkxMKQorI2VuZGlmCisJCSkgeworCQkJLyogR05VIHRhciB1c2VzICJiYXNlLTI1NiBlbmNvZGluZyIgZm9yIHZlcnkgbGFyZ2UgbnVtYmVycy4KKwkJCSAqIEVuY29kaW5nIGlzIGJpbmFyeSwgd2l0aCBoaWdoZXN0IGJpdCBhbHdheXMgc2V0IGFzIGEgbWFya2VyCisJCQkgKiBhbmQgc2lnbiBpbiBuZXh0LWhpZ2hlc3QgYml0OgorCQkJICogODAgMDAgLi4gMDAgLSB6ZXJvCisJCQkgKiBiZiBmZiAuLiBmZiAtIGxhcmdlc3QgcG9zaXRpdmUgbnVtYmVyCisJCQkgKiBmZiBmZiAuLiBmZiAtIG1pbnVzIDEKKwkJCSAqIGMwIDAwIC4uIDAwIC0gc21hbGxlc3QgbmVnYXRpdmUgbnVtYmVyCisJCQkgKi8KKwkJCWNoYXIgKnA4ID0gaGVhZGVyLnNpemUgKyBzaXplb2YoaGVhZGVyLnNpemUpOworCQkJZG8geworCQkJCSotLXA4ID0gKHVpbnQ4X3QpZmlsZXNpemU7CisJCQkJZmlsZXNpemUgPj49IDg7CisJCQl9IHdoaWxlIChwOCAhPSBoZWFkZXIuc2l6ZSk7CisJCQkqcDggfD0gMHg4MDsKKwkJfSBlbHNlIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzdG9yZSBmaWxlICclcycgIgorCQkJCSJvZiBzaXplICUiT0ZGX0ZNVCJ1LCBhYm9ydGluZyIsCisJCQkJZmlsZU5hbWUsIHN0YXRidWYtPnN0X3NpemUpOworCQl9CisJCWhlYWRlci50eXBlZmxhZyA9IFJFR1RZUEU7CisJfSBlbHNlIHsKKwkJYmJfZXJyb3JfbXNnKCIlczogdW5rbm93biBmaWxlIHR5cGUiLCBmaWxlTmFtZSk7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfR05VX0VYVEVOU0lPTlMKKwkvKiBXcml0ZSBvdXQgbG9uZyBuYW1lIGlmIG5lZWRlZCAqLworCS8qICh3ZSwgbGlrZSBHTlUgdGFyLCBvdXRwdXQgbG9uZyBsaW5rbmFtZSAqYmVmb3JlKiBsb25nIG5hbWUpICovCisJaWYgKGhlYWRlci5uYW1lW3NpemVvZihoZWFkZXIubmFtZSktMV0pCisJCXdyaXRlTG9uZ25hbWUodGJJbmZvLT50YXJGZCwgR05VTE9OR05BTUUsCisJCQkJaGVhZGVyX25hbWUsIFNfSVNESVIoc3RhdGJ1Zi0+c3RfbW9kZSkpOworI2VuZGlmCisKKwkvKiBOb3cgd3JpdGUgdGhlIGhlYWRlciBvdXQgdG8gZGlzayAqLworCWNoa3N1bV9hbmRfeHdyaXRlKHRiSW5mby0+dGFyRmQsICZoZWFkZXIpOworCisJLyogTm93IGRvIHRoZSB2ZXJib3NlIHRoaW5nIChvciBub3QpICovCisJaWYgKHRiSW5mby0+dmVyYm9zZUZsYWcpIHsKKwkJRklMRSAqdmJGZCA9IHN0ZG91dDsKKworCQkvKiBJZiBhcmNoaXZlIGdvZXMgdG8gc3Rkb3V0LCB2ZXJib3NlIGdvZXMgdG8gc3RkZXJyICovCisJCWlmICh0YkluZm8tPnRhckZkID09IFNURE9VVF9GSUxFTk8pCisJCQl2YkZkID0gc3RkZXJyOworCQkvKiBHTlUgInRhciBjdnZmIiBwcmludHMgImV4dGVuZGVkIiBsaXN0aW5nIGEtbGEgImxzIC1sIiAqLworCQkvKiBXZSBkb24ndCBoYXZlIHN1Y2ggZXhjZXNzZXMgaGVyZTogZm9yIHVzICJ2IiA9PSAidnYiICovCisJCS8qICcvJyBpcyBwcm9iYWJseSBhIEdOVWlzbSAqLworCQlmcHJpbnRmKHZiRmQsICIlcyVzXG4iLCBoZWFkZXJfbmFtZSwKKwkJCQlTX0lTRElSKHN0YXRidWYtPnN0X21vZGUpID8gIi8iIDogIiIpOworCX0KKworCXJldHVybiBUUlVFOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0ZST00KK3N0YXRpYyBpbnQgZXhjbHVkZV9maWxlKGNvbnN0IGxsaXN0X3QgKmV4Y2x1ZGVkX2ZpbGVzLCBjb25zdCBjaGFyICpmaWxlKQoreworCXdoaWxlIChleGNsdWRlZF9maWxlcykgeworCQlpZiAoZXhjbHVkZWRfZmlsZXMtPmRhdGFbMF0gPT0gJy8nKSB7CisJCQlpZiAoZm5tYXRjaChleGNsdWRlZF9maWxlcy0+ZGF0YSwgZmlsZSwKKwkJCQkJRk5NX1BBVEhOQU1FIHwgRk5NX0xFQURJTkdfRElSKSA9PSAwKQorCQkJCXJldHVybiAxOworCQl9IGVsc2UgeworCQkJY29uc3QgY2hhciAqcDsKKworCQkJZm9yIChwID0gZmlsZTsgcFswXSAhPSAnXDAnOyBwKyspIHsKKwkJCQlpZiAoKHAgPT0gZmlsZSB8fCBwWy0xXSA9PSAnLycpCisJCQkJICYmIHBbMF0gIT0gJy8nCisJCQkJICYmIGZubWF0Y2goZXhjbHVkZWRfZmlsZXMtPmRhdGEsIHAsCisJCQkJCQlGTk1fUEFUSE5BTUUgfCBGTk1fTEVBRElOR19ESVIpID09IDAKKwkJCQkpIHsKKwkJCQkJcmV0dXJuIDE7CisJCQkJfQorCQkJfQorCQl9CisJCWV4Y2x1ZGVkX2ZpbGVzID0gZXhjbHVkZWRfZmlsZXMtPmxpbms7CisJfQorCisJcmV0dXJuIDA7Cit9CisjZWxzZQorIyBkZWZpbmUgZXhjbHVkZV9maWxlKGV4Y2x1ZGVkX2ZpbGVzLCBmaWxlKSAwCisjZW5kaWYKKworc3RhdGljIGludCBGQVNUX0ZVTkMgd3JpdGVGaWxlVG9UYXJiYWxsKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZiwKKwkJCXZvaWQgKnVzZXJEYXRhLCBpbnQgZGVwdGggVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCBUYXJCYWxsSW5mbyAqdGJJbmZvID0gKHN0cnVjdCBUYXJCYWxsSW5mbyAqKSB1c2VyRGF0YTsKKwljb25zdCBjaGFyICpoZWFkZXJfbmFtZTsKKwlpbnQgaW5wdXRGaWxlRmQgPSAtMTsKKworCURCRygid3JpdGVGaWxlVG9UYXJiYWxsKCclcycpIiwgZmlsZU5hbWUpOworCisJLyogU3RyaXAgbGVhZGluZyAnLycgYW5kIHN1Y2ggKG11c3QgYmUgYmVmb3JlIG1lbW9yaXppbmcgaGFyZGxpbmsncyBuYW1lKSAqLworCWhlYWRlcl9uYW1lID0gc3RyaXBfdW5zYWZlX3ByZWZpeChmaWxlTmFtZSk7CisKKwlpZiAoaGVhZGVyX25hbWVbMF0gPT0gJ1wwJykKKwkJcmV0dXJuIFRSVUU7CisKKwkvKiBJdCBpcyBhZ2FpbnN0IHRoZSBydWxlcyB0byBhcmNoaXZlIGEgc29ja2V0ICovCisJaWYgKFNfSVNTT0NLKHN0YXRidWYtPnN0X21vZGUpKSB7CisJCWJiX2Vycm9yX21zZygiJXM6IHNvY2tldCBpZ25vcmVkIiwgZmlsZU5hbWUpOworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwkvKgorCSAqIENoZWNrIHRvIHNlZSBpZiB3ZSBhcmUgZGVhbGluZyB3aXRoIGEgaGFyZCBsaW5rLgorCSAqIElmIHNvIC0KKwkgKiBUcmVhdCB0aGUgZmlyc3Qgb2NjdXJhbmNlIG9mIGEgZ2l2ZW4gZGV2L2lub2RlIGFzIGEgZmlsZSB3aGlsZQorCSAqIHRyZWF0aW5nIGFueSBhZGRpdGlvbmFsIG9jY3VyYW5jZXMgYXMgaGFyZCBsaW5rcy4gIFRoaXMgaXMgZG9uZQorCSAqIGJ5IGFkZGluZyB0aGUgZmlsZSBpbmZvcm1hdGlvbiB0byB0aGUgSGFyZExpbmtJbmZvIGxpbmtlZCBsaXN0LgorCSAqLworCXRiSW5mby0+aGxJbmZvID0gTlVMTDsKKwlpZiAoIVNfSVNESVIoc3RhdGJ1Zi0+c3RfbW9kZSkgJiYgc3RhdGJ1Zi0+c3RfbmxpbmsgPiAxKSB7CisJCURCRygiJyVzJzogc3RfbmxpbmsgPiAxIiwgaGVhZGVyX25hbWUpOworCQl0YkluZm8tPmhsSW5mbyA9IGZpbmRIYXJkTGlua0luZm8odGJJbmZvLT5obEluZm9IZWFkLCBzdGF0YnVmKTsKKwkJaWYgKHRiSW5mby0+aGxJbmZvID09IE5VTEwpIHsKKwkJCURCRygiJyVzJzogYWRkSGFyZExpbmtJbmZvIiwgaGVhZGVyX25hbWUpOworCQkJYWRkSGFyZExpbmtJbmZvKCZ0YkluZm8tPmhsSW5mb0hlYWQsIHN0YXRidWYsIGhlYWRlcl9uYW1lKTsKKwkJfQorCX0KKworCS8qIEl0IGlzIGEgYmFkIGlkZWEgdG8gc3RvcmUgdGhlIGFyY2hpdmUgd2UgYXJlIGluIHRoZSBwcm9jZXNzIG9mIGNyZWF0aW5nLAorCSAqIHNvIGNoZWNrIHRoZSBkZXZpY2UgYW5kIGlub2RlIHRvIGJlIHN1cmUgdGhhdCB0aGlzIHBhcnRpY3VsYXIgZmlsZSBpc24ndAorCSAqIHRoZSBuZXcgdGFyYmFsbCAqLworCWlmICh0YkluZm8tPnRhckZpbGVTdGF0QnVmLnN0X2RldiA9PSBzdGF0YnVmLT5zdF9kZXYKKwkgJiYgdGJJbmZvLT50YXJGaWxlU3RhdEJ1Zi5zdF9pbm8gPT0gc3RhdGJ1Zi0+c3RfaW5vCisJKSB7CisJCWJiX2Vycm9yX21zZygiJXM6IGZpbGUgaXMgdGhlIGFyY2hpdmU7IHNraXBwaW5nIiwgZmlsZU5hbWUpOworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlpZiAoZXhjbHVkZV9maWxlKHRiSW5mby0+ZXhjbHVkZUxpc3QsIGhlYWRlcl9uYW1lKSkKKwkJcmV0dXJuIFNLSVA7CisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TCisJaWYgKHN0cmxlbihoZWFkZXJfbmFtZSkgPj0gTkFNRV9TSVpFKSB7CisJCWJiX2Vycm9yX21zZygibmFtZXMgbG9uZ2VyIHRoYW4gIk5BTUVfU0laRV9TVFIiIGNoYXJzIG5vdCBzdXBwb3J0ZWQiKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorI2VuZGlmCisKKwkvKiBJcyB0aGlzIGEgcmVndWxhciBmaWxlPyAqLworCWlmICh0YkluZm8tPmhsSW5mbyA9PSBOVUxMICYmIFNfSVNSRUcoc3RhdGJ1Zi0+c3RfbW9kZSkpIHsKKwkJLyogb3BlbiB0aGUgZmlsZSB3ZSB3YW50IHRvIGFyY2hpdmUsIGFuZCBtYWtlIHN1cmUgYWxsIGlzIHdlbGwgKi8KKwkJaW5wdXRGaWxlRmQgPSBvcGVuX29yX3dhcm4oZmlsZU5hbWUsIE9fUkRPTkxZKTsKKwkJaWYgKGlucHV0RmlsZUZkIDwgMCkgeworCQkJcmV0dXJuIEZBTFNFOworCQl9CisJfQorCisJLyogQWRkIGFuIGVudHJ5IHRvIHRoZSB0YXJiYWxsICovCisJaWYgKHdyaXRlVGFySGVhZGVyKHRiSW5mbywgaGVhZGVyX25hbWUsIGZpbGVOYW1lLCBzdGF0YnVmKSA9PSBGQUxTRSkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJLyogSWYgaXQgd2FzIGEgcmVndWxhciBmaWxlLCB3cml0ZSBvdXQgdGhlIGJvZHkgKi8KKwlpZiAoaW5wdXRGaWxlRmQgPj0gMCkgeworCQlzaXplX3QgcmVhZFNpemU7CisJCS8qIFdyaXRlIHRoZSBmaWxlIHRvIHRoZSBhcmNoaXZlLiAqLworCQkvKiBXZSByZWNvcmQgc2l6ZSBpbnRvIGhlYWRlciBmaXJzdCwgKi8KKwkJLyogYW5kIHRoZW4gd3JpdGUgb3V0IGZpbGUuIElmIGZpbGUgc2hyaW5rcyBpbiBiZXR3ZWVuLCAqLworCQkvKiB0YXIgd2lsbCBiZSBjb3JydXB0ZWQuIFNvIHdlIGRvbid0IGFsbG93IGZvciB0aGF0LiAqLworCQkvKiBOQjogR05VIHRhciAxLjE2IHdhcm5zIGFuZCBwYWRzIHdpdGggemVyb2VzICovCisJCS8qIG9yIGV2ZW4gc2Vla3MgYmFjayBhbmQgdXBkYXRlcyBoZWFkZXIgKi8KKwkJYmJfY29weWZkX2V4YWN0X3NpemUoaW5wdXRGaWxlRmQsIHRiSW5mby0+dGFyRmQsIHN0YXRidWYtPnN0X3NpemUpOworCQkvLy8vb2ZmX3QgcmVhZFNpemU7CisJCS8vLy9yZWFkU2l6ZSA9IGJiX2NvcHlmZF9zaXplKGlucHV0RmlsZUZkLCB0YkluZm8tPnRhckZkLCBzdGF0YnVmLT5zdF9zaXplKTsKKwkJLy8vL2lmIChyZWFkU2l6ZSAhPSBzdGF0YnVmLT5zdF9zaXplICYmIHJlYWRTaXplID49IDApIHsKKwkJLy8vLwliYl9lcnJvcl9tc2dfYW5kX2RpZSgic2hvcnQgcmVhZCBmcm9tICVzLCBhYm9ydGluZyIsIGZpbGVOYW1lKTsKKwkJLy8vL30KKworCQkvKiBDaGVjayB0aGF0IGZpbGUgZGlkIG5vdCBncm93IGluIGJldHdlZW4/ICovCisJCS8qIGlmIChzYWZlX3JlYWQoaW5wdXRGaWxlRmQsIDEpID09IDEpIHdhcm4gYnV0IGNvbnRpbnVlPyAqLworCisJCWNsb3NlKGlucHV0RmlsZUZkKTsKKworCQkvKiBQYWQgdGhlIGZpbGUgdXAgdG8gdGhlIHRhciBibG9jayBzaXplICovCisJCS8qIChhIGZldyB0cmlja3MgaGVyZSBpbiB0aGUgbmFtZSBvZiBjb2RlIHNpemUpICovCisJCXJlYWRTaXplID0gKC0oaW50KXN0YXRidWYtPnN0X3NpemUpICYgKFRBUl9CTE9DS19TSVpFLTEpOworCQltZW1zZXQoYmxvY2tfYnVmLCAwLCByZWFkU2l6ZSk7CisJCXh3cml0ZSh0YkluZm8tPnRhckZkLCBibG9ja19idWYsIHJlYWRTaXplKTsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworI2lmIFNFQU1MRVNTX0NPTVBSRVNTSU9OCisvKiBEb24ndCBpbmxpbmU6IHZmb3JrIHNjYXJlcyBnY2MgYW5kIHBlc3NpbWl6ZXMgY29kZSAqLworc3RhdGljIHZvaWQgTk9JTkxJTkUgdmZvcmtfY29tcHJlc3NvcihpbnQgdGFyX2ZkLCBjb25zdCBjaGFyICpnemlwKQoreworCXBpZF90IGd6aXBQaWQ7CisKKwkvLyBPbiBMaW51eCwgdmZvcmsgbmV2ZXIgdW5wYXVzZXMgcGFyZW50IGVhcmx5LCBhbHRob3VnaCBzdGFuZGFyZAorCS8vIGFsbG93cyBmb3IgdGhhdC4gRG8gd2Ugd2FudCB0byB3YXN0ZSBieXRlcyBjaGVja2luZyBmb3IgaXQ/CisjIGRlZmluZSBXQUlUX0ZPUl9DSElMRCAwCisJdm9sYXRpbGUgaW50IHZmb3JrX2V4ZWNfZXJybm8gPSAwOworCXN0cnVjdCBmZF9wYWlyIGd6aXBEYXRhUGlwZTsKKyMgaWYgV0FJVF9GT1JfQ0hJTEQKKwlzdHJ1Y3QgZmRfcGFpciBnemlwU3RhdHVzUGlwZTsKKwl4cGlwZWRfcGFpcihnemlwU3RhdHVzUGlwZSk7CisjIGVuZGlmCisJeHBpcGVkX3BhaXIoZ3ppcERhdGFQaXBlKTsKKworCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsgLyogd2Ugb25seSB3YW50IEVQSVBFIG9uIGVycm9ycyAqLworCisJZ3ppcFBpZCA9IHh2Zm9yaygpOworCisJaWYgKGd6aXBQaWQgPT0gMCkgeworCQkvKiBjaGlsZCAqLworCQkvKiBOQjogY2xvc2UgX2ZpcnN0XywgdGhlbiBtb3ZlIGZkcyEgKi8KKwkJY2xvc2UoZ3ppcERhdGFQaXBlLndyKTsKKyMgaWYgV0FJVF9GT1JfQ0hJTEQKKwkJY2xvc2UoZ3ppcFN0YXR1c1BpcGUucmQpOworCQkvKiBnemlwU3RhdHVzUGlwZS53ciB3aWxsIGNsb3NlIG9ubHkgb24gZXhlYyAtCisJCSAqIHBhcmVudCB3YWl0cyBmb3IgdGhpcyBjbG9zZSB0byBoYXBwZW4gKi8KKwkJZmNudGwoZ3ppcFN0YXR1c1BpcGUud3IsIEZfU0VURkQsIEZEX0NMT0VYRUMpOworIyBlbmRpZgorCQl4bW92ZV9mZChnemlwRGF0YVBpcGUucmQsIDApOworCQl4bW92ZV9mZCh0YXJfZmQsIDEpOworCQkvKiBleGVjIGd6aXAvYnppcDIgcHJvZ3JhbS9hcHBsZXQgKi8KKwkJQkJfRVhFQ0xQKGd6aXAsIGd6aXAsICItZiIsIChjaGFyICopMCk7CisJCXZmb3JrX2V4ZWNfZXJybm8gPSBlcnJubzsKKwkJX2V4aXQoRVhJVF9GQUlMVVJFKTsKKwl9CisKKwkvKiBwYXJlbnQgKi8KKwl4bW92ZV9mZChnemlwRGF0YVBpcGUud3IsIHRhcl9mZCk7CisJY2xvc2UoZ3ppcERhdGFQaXBlLnJkKTsKKyMgaWYgV0FJVF9GT1JfQ0hJTEQKKwljbG9zZShnemlwU3RhdHVzUGlwZS53cik7CisJd2hpbGUgKDEpIHsKKwkJY2hhciBidWY7CisJCWludCBuOworCisJCS8qIFdhaXQgdW50aWwgY2hpbGQgZXhlY3MgKG9yIGZhaWxzIHRvKSAqLworCQluID0gZnVsbF9yZWFkKGd6aXBTdGF0dXNQaXBlLnJkLCAmYnVmLCAxKTsKKwkJaWYgKG4gPCAwIC8qICYmIGVycm5vID09IEVBR0FJTiAqLykKKwkJCWNvbnRpbnVlOwkvKiB0cnkgaXQgYWdhaW4gKi8KKwl9CisJY2xvc2UoZ3ppcFN0YXR1c1BpcGUucmQpOworIyBlbmRpZgorCWlmICh2Zm9ya19leGVjX2Vycm5vKSB7CisJCWVycm5vID0gdmZvcmtfZXhlY19lcnJubzsKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBleGVjdXRlICclcyciLCBnemlwKTsKKwl9Cit9CisjZW5kaWYgLyogU0VBTUxFU1NfQ09NUFJFU1NJT04gKi8KKworCisjaWYgIVNFQU1MRVNTX0NPTVBSRVNTSU9OCisvKiBEbyBub3QgcGFzcyBnemlwIGZsYWcgdG8gd3JpdGVUYXJGaWxlKCkgKi8KKyNkZWZpbmUgd3JpdGVUYXJGaWxlKHRhcl9mZCwgdmVyYm9zZUZsYWcsIHJlY3Vyc2VGbGFncywgaW5jbHVkZSwgZXhjbHVkZSwgZ3ppcCkgXAorCXdyaXRlVGFyRmlsZSh0YXJfZmQsIHZlcmJvc2VGbGFnLCByZWN1cnNlRmxhZ3MsIGluY2x1ZGUsIGV4Y2x1ZGUpCisjZW5kaWYKKy8qIGdjYyA0LjIuMSBpbmxpbmVzIGl0LCBtYWtpbmcgY29kZSBiaWdnZXIgKi8KK3N0YXRpYyBOT0lOTElORSBpbnQgd3JpdGVUYXJGaWxlKGludCB0YXJfZmQsIGludCB2ZXJib3NlRmxhZywKKwlpbnQgcmVjdXJzZUZsYWdzLCBjb25zdCBsbGlzdF90ICppbmNsdWRlLAorCWNvbnN0IGxsaXN0X3QgKmV4Y2x1ZGUsIGNvbnN0IGNoYXIgKmd6aXApCit7CisJaW50IGVycm9yRmxhZyA9IEZBTFNFOworCXN0cnVjdCBUYXJCYWxsSW5mbyB0YkluZm87CisKKwl0YkluZm8uaGxJbmZvSGVhZCA9IE5VTEw7CisJdGJJbmZvLnRhckZkID0gdGFyX2ZkOworCXRiSW5mby52ZXJib3NlRmxhZyA9IHZlcmJvc2VGbGFnOworCisJLyogU3RvcmUgdGhlIHN0YXQgaW5mbyBmb3IgdGhlIHRhcmJhbGwncyBmaWxlLCBzbworCSAqIGNhbiBhdm9pZCBpbmNsdWRpbmcgdGhlIHRhcmJhbGwgaW50byBpdHNlbGYuLi4uICAqLworCXhmc3RhdCh0YkluZm8udGFyRmQsICZ0YkluZm8udGFyRmlsZVN0YXRCdWYsICJjYW4ndCBzdGF0IHRhciBmaWxlIik7CisKKyNpZiBTRUFNTEVTU19DT01QUkVTU0lPTgorCWlmIChnemlwKQorCQl2Zm9ya19jb21wcmVzc29yKHRiSW5mby50YXJGZCwgZ3ppcCk7CisjZW5kaWYKKworCXRiSW5mby5leGNsdWRlTGlzdCA9IGV4Y2x1ZGU7CisKKwkvKiBSZWFkIHRoZSBkaXJlY3RvcnkvZmlsZXMgYW5kIGl0ZXJhdGUgb3ZlciB0aGVtIG9uZSBhdCBhIHRpbWUgKi8KKwl3aGlsZSAoaW5jbHVkZSkgeworCQlpZiAoIXJlY3Vyc2l2ZV9hY3Rpb24oaW5jbHVkZS0+ZGF0YSwgcmVjdXJzZUZsYWdzLAorCQkJCXdyaXRlRmlsZVRvVGFyYmFsbCwgd3JpdGVGaWxlVG9UYXJiYWxsLCAmdGJJbmZvLCAwKQorCQkpIHsKKwkJCWVycm9yRmxhZyA9IFRSVUU7CisJCX0KKwkJaW5jbHVkZSA9IGluY2x1ZGUtPmxpbms7CisJfQorCS8qIFdyaXRlIHR3byBlbXB0eSBibG9ja3MgdG8gdGhlIGVuZCBvZiB0aGUgYXJjaGl2ZSAqLworCW1lbXNldChibG9ja19idWYsIDAsIDIqVEFSX0JMT0NLX1NJWkUpOworCXh3cml0ZSh0YkluZm8udGFyRmQsIGJsb2NrX2J1ZiwgMipUQVJfQkxPQ0tfU0laRSk7CisKKwkvKiBUbyBiZSBwZWRhbnRpY2FsbHkgY29ycmVjdCwgd2Ugd291bGQgY2hlY2sgaWYgdGhlIHRhcmJhbGwKKwkgKiBpcyBzbWFsbGVyIHRoYW4gMjAgdGFyIGJsb2NrcywgYW5kIHBhZCBpdCBpZiBpdCB3YXMgc21hbGxlciwKKwkgKiBidXQgdGhhdCBpc24ndCBuZWNlc3NhcnkgZm9yIEdOVSB0YXIgaW50ZXJvcGVyYWJpbGl0eSwgYW5kCisJICogc28gaXMgY29uc2lkZXJlZCBhIHdhc3RlIG9mIHNwYWNlICovCisKKwkvKiBDbG9zZSBzbyB0aGUgY2hpbGQgcHJvY2VzcyAoaWYgYW55KSB3aWxsIGV4aXQgKi8KKwljbG9zZSh0YkluZm8udGFyRmQpOworCisJLyogSGFuZyB1cCB0aGUgdG9vbHMsIGNsb3NlIHVwIHNob3AsIGhlYWQgaG9tZSAqLworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZUhhcmRMaW5rSW5mbygmdGJJbmZvLmhsSW5mb0hlYWQpOworCisJaWYgKGVycm9yRmxhZykKKwkJYmJfZXJyb3JfbXNnKCJlcnJvciBleGl0IGRlbGF5ZWQgZnJvbSBwcmV2aW91cyBlcnJvcnMiKTsKKworI2lmIFNFQU1MRVNTX0NPTVBSRVNTSU9OCisJaWYgKGd6aXApIHsKKwkJaW50IHN0YXR1czsKKwkJaWYgKHNhZmVfd2FpdHBpZCgtMSwgJnN0YXR1cywgMCkgPT0gLTEpCisJCQliYl9wZXJyb3JfbXNnKCJ3YWl0cGlkIik7CisJCWVsc2UgaWYgKCFXSUZFWElURUQoc3RhdHVzKSB8fCBXRVhJVFNUQVRVUyhzdGF0dXMpKQorCQkJLyogZ3ppcCB3YXMga2lsbGVkIG9yIGhhcyBleGl0ZWQgd2l0aCBub256ZXJvISAqLworCQkJZXJyb3JGbGFnID0gVFJVRTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gZXJyb3JGbGFnOworfQorI2Vsc2UgLyogIUZFQVRVUkVfVEFSX0NSRUFURSAqLworIyBkZWZpbmUgd3JpdGVUYXJGaWxlKC4uLikgMAorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfRlJPTQorc3RhdGljIGxsaXN0X3QgKmFwcGVuZF9maWxlX2xpc3RfdG9fbGlzdChsbGlzdF90ICpsaXN0KQoreworCUZJTEUgKnNyY19zdHJlYW07CisJY2hhciAqbGluZTsKKwlsbGlzdF90ICpuZXdsaXN0ID0gTlVMTDsKKworCXdoaWxlIChsaXN0KSB7CisJCXNyY19zdHJlYW0gPSB4Zm9wZW5fc3RkaW4obGxpc3RfcG9wKCZsaXN0KSk7CisJCXdoaWxlICgobGluZSA9IHhtYWxsb2NfZmdldGxpbmUoc3JjX3N0cmVhbSkpICE9IE5VTEwpIHsKKwkJCS8qIGtpbGwgdHJhaWxpbmcgJy8nIHVubGVzcyB0aGUgc3RyaW5nIGlzIGp1c3QgIi8iICovCisJCQljaGFyICpjcCA9IGxhc3RfY2hhcl9pcyhsaW5lLCAnLycpOworCQkJaWYgKGNwID4gbGluZSkKKwkJCQkqY3AgPSAnXDAnOworCQkJbGxpc3RfYWRkX3RvX2VuZCgmbmV3bGlzdCwgbGluZSk7CisJCX0KKwkJZmNsb3NlKHNyY19zdHJlYW0pOworCX0KKwlyZXR1cm4gbmV3bGlzdDsKK30KKyNlbmRpZgorCisvL3VzYWdlOiNkZWZpbmUgdGFyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSItWyIgSUZfRkVBVFVSRV9UQVJfQ1JFQVRFKCJjIikgInh0IgorLy91c2FnZToJSUZfRkVBVFVSRV9TRUFNTEVTU19aKCJaIikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU0VBTUxFU1NfR1ooInoiKQorLy91c2FnZToJSUZfRkVBVFVSRV9TRUFNTEVTU19YWigiSiIpCisvL3VzYWdlOglJRl9GRUFUVVJFX1NFQU1MRVNTX0JaMigiaiIpCisvL3VzYWdlOglJRl9GRUFUVVJFX1NFQU1MRVNTX0xaTUEoImEiKQorLy91c2FnZToJSUZfRkVBVFVSRV9UQVJfQ1JFQVRFKCJoIikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVEFSX05PUFJFU0VSVkVfVElNRSgibSIpCisvL3VzYWdlOgkidk9dICIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVEFSX0ZST00oIlstWCBGSUxFXSBbLVQgRklMRV0gIikKKy8vdXNhZ2U6CSJbLWYgVEFSRklMRV0gWy1DIERJUl0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHRhcl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9UQVJfQ1JFQVRFKCJDcmVhdGUsIGV4dHJhY3QsICIpCisvL3VzYWdlOglJRl9OT1RfRkVBVFVSRV9UQVJfQ1JFQVRFKCJFeHRyYWN0ICIpCisvL3VzYWdlOgkib3IgbGlzdCBmaWxlcyBmcm9tIGEgdGFyIGZpbGVcbiIKKy8vdXNhZ2U6ICAgICAiXG5PcGVyYXRpb246IgorLy91c2FnZToJSUZfRkVBVFVSRV9UQVJfQ1JFQVRFKAorLy91c2FnZTogICAgICJcbgljCUNyZWF0ZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JeAlFeHRyYWN0IgorLy91c2FnZTogICAgICJcbgl0CUxpc3QiCisvL3VzYWdlOiAgICAgIlxuCWYJTmFtZSBvZiBUQVJGSUxFICgnLScgZm9yIHN0ZGluL291dCkiCisvL3VzYWdlOiAgICAgIlxuCUMJQ2hhbmdlIHRvIERJUiBiZWZvcmUgb3BlcmF0aW9uIgorLy91c2FnZTogICAgICJcbgl2CVZlcmJvc2UiCisvL3VzYWdlOglJRl9GRUFUVVJFX1NFQU1MRVNTX1ooCisvL3VzYWdlOiAgICAgIlxuCVoJKERlKWNvbXByZXNzIHVzaW5nIGNvbXByZXNzIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9TRUFNTEVTU19HWigKKy8vdXNhZ2U6ICAgICAiXG4JegkoRGUpY29tcHJlc3MgdXNpbmcgZ3ppcCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU0VBTUxFU1NfWFooCisvL3VzYWdlOiAgICAgIlxuCUoJKERlKWNvbXByZXNzIHVzaW5nIHh6IgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9TRUFNTEVTU19CWjIoCisvL3VzYWdlOiAgICAgIlxuCWoJKERlKWNvbXByZXNzIHVzaW5nIGJ6aXAyIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9TRUFNTEVTU19MWk1BKAorLy91c2FnZTogICAgICJcbglhCShEZSljb21wcmVzcyB1c2luZyBsem1hIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbglPCUV4dHJhY3QgdG8gc3Rkb3V0IgorLy91c2FnZToJSUZfRkVBVFVSRV9UQVJfQ1JFQVRFKAorLy91c2FnZTogICAgICJcbgloCUZvbGxvdyBzeW1saW5rcyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVEFSX05PUFJFU0VSVkVfVElNRSgKKy8vdXNhZ2U6ICAgICAiXG4JbQlEb24ndCByZXN0b3JlIG10aW1lIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9UQVJfRlJPTSgKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG4JZXhjbHVkZQlGaWxlIHRvIGV4Y2x1ZGUiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCVgJRmlsZSB3aXRoIG5hbWVzIHRvIGV4Y2x1ZGUiCisvL3VzYWdlOiAgICAgIlxuCVQJRmlsZSB3aXRoIG5hbWVzIHRvIGluY2x1ZGUiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHRhcl9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCB6Y2F0IC90bXAvdGFyYmFsbC50YXIuZ3ogfCB0YXIgLXhmIC1cbiIKKy8vdXNhZ2U6ICAgICAgICIkIHRhciAtY2YgL3RtcC90YXJiYWxsLnRhciAvdXNyL2xvY2FsXG4iCisKKy8vIFN1cHBvcnRlZCBidXQgYXJlbid0IGluIC0taGVscDoKKy8vCW8Jbm8tc2FtZS1vd25lcgorLy8JcAlzYW1lLXBlcm1pc3Npb25zCisvLwlrCWtlZXAtb2xkCisvLwluby1yZWN1cnNpb24KKy8vCW51bWVyaWMtb3duZXIKKy8vCW5vLXNhbWUtcGVybWlzc2lvbnMKKy8vCW92ZXJ3cml0ZQorLy9JRl9GRUFUVVJFX1RBUl9UT19DT01NQU5EKAorLy8JdG8tY29tbWFuZAorLy8pCisKK2VudW0geworCU9QVEJJVF9LRUVQX09MRCA9IDgsCisJSUZfRkVBVFVSRV9UQVJfQ1JFQVRFKCAgIE9QVEJJVF9DUkVBVEUgICAgICAsKQorCUlGX0ZFQVRVUkVfVEFSX0NSRUFURSggICBPUFRCSVRfREVSRUZFUkVOQ0UgLCkKKwlJRl9GRUFUVVJFX1NFQU1MRVNTX0JaMiggT1BUQklUX0JaSVAyICAgICAgICwpCisJSUZfRkVBVFVSRV9TRUFNTEVTU19MWk1BKE9QVEJJVF9MWk1BICAgICAgICAsKQorCUlGX0ZFQVRVUkVfVEFSX0ZST00oICAgICBPUFRCSVRfSU5DTFVERV9GUk9NLCkKKwlJRl9GRUFUVVJFX1RBUl9GUk9NKCAgICAgT1BUQklUX0VYQ0xVREVfRlJPTSwpCisJSUZfRkVBVFVSRV9TRUFNTEVTU19HWiggIE9QVEJJVF9HWklQICAgICAgICAsKQorCUlGX0ZFQVRVUkVfU0VBTUxFU1NfWFooICBPUFRCSVRfWFogICAgICAgICAgLCkgLy8gMTZ0aCBiaXQKKwlJRl9GRUFUVVJFX1NFQU1MRVNTX1ooICAgT1BUQklUX0NPTVBSRVNTICAgICwpCisJSUZfRkVBVFVSRV9UQVJfTk9QUkVTRVJWRV9USU1FKE9QVEJJVF9OT1BSRVNFUlZFX1RJTUUsKQorI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9MT05HX09QVElPTlMKKwlPUFRCSVRfTk9SRUNVUlNJT04sCisJSUZfRkVBVFVSRV9UQVJfVE9fQ09NTUFORChPUFRCSVRfMkNPTU1BTkQgICAsKQorCU9QVEJJVF9OVU1FUklDX09XTkVSLAorCU9QVEJJVF9OT1BSRVNFUlZFX1BFUk0sCisJT1BUQklUX09WRVJXUklURSwKKyNlbmRpZgorCU9QVF9URVNUICAgICAgICAgPSAxIDw8IDAsIC8vIHQKKwlPUFRfRVhUUkFDVCAgICAgID0gMSA8PCAxLCAvLyB4CisJT1BUX0JBU0VESVIgICAgICA9IDEgPDwgMiwgLy8gQworCU9QVF9UQVJOQU1FICAgICAgPSAxIDw8IDMsIC8vIGYKKwlPUFRfMlNURE9VVCAgICAgID0gMSA8PCA0LCAvLyBPCisJT1BUX05PUFJFU0VSVkVfT1dORVIgPSAxIDw8IDUsIC8vIG8gPT0gbm8tc2FtZS1vd25lcgorCU9QVF9QICAgICAgICAgICAgPSAxIDw8IDYsIC8vIHAKKwlPUFRfVkVSQk9TRSAgICAgID0gMSA8PCA3LCAvLyB2CisJT1BUX0tFRVBfT0xEICAgICA9IDEgPDwgOCwgLy8gaworCU9QVF9DUkVBVEUgICAgICAgPSBJRl9GRUFUVVJFX1RBUl9DUkVBVEUoICAgKDEgPDwgT1BUQklUX0NSRUFURSAgICAgICkpICsgMCwgLy8gYworCU9QVF9ERVJFRkVSRU5DRSAgPSBJRl9GRUFUVVJFX1RBUl9DUkVBVEUoICAgKDEgPDwgT1BUQklUX0RFUkVGRVJFTkNFICkpICsgMCwgLy8gaAorCU9QVF9CWklQMiAgICAgICAgPSBJRl9GRUFUVVJFX1NFQU1MRVNTX0JaMiggKDEgPDwgT1BUQklUX0JaSVAyICAgICAgICkpICsgMCwgLy8gagorCU9QVF9MWk1BICAgICAgICAgPSBJRl9GRUFUVVJFX1NFQU1MRVNTX0xaTUEoKDEgPDwgT1BUQklUX0xaTUEgICAgICAgICkpICsgMCwgLy8gYQorCU9QVF9JTkNMVURFX0ZST00gPSBJRl9GRUFUVVJFX1RBUl9GUk9NKCAgICAgKDEgPDwgT1BUQklUX0lOQ0xVREVfRlJPTSkpICsgMCwgLy8gVAorCU9QVF9FWENMVURFX0ZST00gPSBJRl9GRUFUVVJFX1RBUl9GUk9NKCAgICAgKDEgPDwgT1BUQklUX0VYQ0xVREVfRlJPTSkpICsgMCwgLy8gWAorCU9QVF9HWklQICAgICAgICAgPSBJRl9GRUFUVVJFX1NFQU1MRVNTX0daKCAgKDEgPDwgT1BUQklUX0daSVAgICAgICAgICkpICsgMCwgLy8gegorCU9QVF9YWiAgICAgICAgICAgPSBJRl9GRUFUVVJFX1NFQU1MRVNTX1haKCAgKDEgPDwgT1BUQklUX1haICAgICAgICAgICkpICsgMCwgLy8gSgorCU9QVF9DT01QUkVTUyAgICAgPSBJRl9GRUFUVVJFX1NFQU1MRVNTX1ooICAgKDEgPDwgT1BUQklUX0NPTVBSRVNTICAgICkpICsgMCwgLy8gWgorCU9QVF9OT1BSRVNFUlZFX1RJTUUgPSBJRl9GRUFUVVJFX1RBUl9OT1BSRVNFUlZFX1RJTUUoKDEgPDwgT1BUQklUX05PUFJFU0VSVkVfVElNRSkpICsgMCwgLy8gbQorCU9QVF9OT1JFQ1VSU0lPTiAgICAgPSBJRl9GRUFUVVJFX1RBUl9MT05HX09QVElPTlMoKDEgPDwgT1BUQklUX05PUkVDVVJTSU9OICAgICkpICsgMCwgLy8gbm8tcmVjdXJzaW9uCisJT1BUXzJDT01NQU5EICAgICAgICA9IElGX0ZFQVRVUkVfVEFSX1RPX0NPTU1BTkQoICAoMSA8PCBPUFRCSVRfMkNPTU1BTkQgICAgICAgKSkgKyAwLCAvLyB0by1jb21tYW5kCisJT1BUX05VTUVSSUNfT1dORVIgICA9IElGX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUygoMSA8PCBPUFRCSVRfTlVNRVJJQ19PV05FUiAgKSkgKyAwLCAvLyBudW1lcmljLW93bmVyCisJT1BUX05PUFJFU0VSVkVfUEVSTSA9IElGX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUygoMSA8PCBPUFRCSVRfTk9QUkVTRVJWRV9QRVJNKSkgKyAwLCAvLyBuby1zYW1lLXBlcm1pc3Npb25zCisJT1BUX09WRVJXUklURSAgICAgICA9IElGX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUygoMSA8PCBPUFRCSVRfT1ZFUldSSVRFICAgICAgKSkgKyAwLCAvLyBvdmVyd3JpdGUKKworCU9QVF9BTllfQ09NUFJFU1MgPSAoT1BUX0JaSVAyIHwgT1BUX0xaTUEgfCBPUFRfR1pJUCB8IE9QVF9YWiB8IE9QVF9DT01QUkVTUyksCit9OworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9MT05HX09QVElPTlMKK3N0YXRpYyBjb25zdCBjaGFyIHRhcl9sb25nb3B0c1tdIEFMSUdOMSA9CisJImxpc3RcMCIgICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInQiCisJImV4dHJhY3RcMCIgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIngiCisJImRpcmVjdG9yeVwwIiAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIkMiCisJImZpbGVcMCIgICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgImYiCisJInRvLXN0ZG91dFwwIiAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIk8iCisJLyogZG8gbm90IHJlc3RvcmUgb3duZXIgKi8KKwkvKiBOb3RlOiBHTlUgdGFyIGhhbmRsZXMgJ28nIGFzIG5vLXNhbWUtb3duZXIgb25seSBvbiBleHRyYWN0LAorCSAqIG9uIGNyZWF0ZSwgJ28nIGlzIC0tb2xkLWFyY2hpdmUuIFdlIGRvIG5vdCBzdXBwb3J0IC0tb2xkLWFyY2hpdmUuICovCisJIm5vLXNhbWUtb3duZXJcMCIgICAgICAgTm9fYXJndW1lbnQgICAgICAgIm8iCisJInNhbWUtcGVybWlzc2lvbnNcMCIgICAgTm9fYXJndW1lbnQgICAgICAgInAiCisJInZlcmJvc2VcMCIgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInYiCisJImtlZXAtb2xkXDAiICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImsiCisjIGlmIEVOQUJMRV9GRUFUVVJFX1RBUl9DUkVBVEUKKwkiY3JlYXRlXDAiICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiYyIKKwkiZGVyZWZlcmVuY2VcMCIgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiaCIKKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfQloyCisJImJ6aXAyXDAiICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImoiCisjIGVuZGlmCisjIGlmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0xaTUEKKwkibHptYVwwIiAgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiYSIKKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0ZST00KKwkiZmlsZXMtZnJvbVwwIiAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiVCIKKwkiZXhjbHVkZS1mcm9tXDAiICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiWCIKKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfR1oKKwkiZ3ppcFwwIiAgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAieiIKKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfWFoKKwkieHpcMCIgICAgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiSiIKKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfWgorCSJjb21wcmVzc1wwIiAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJaIgorIyBlbmRpZgorIyBpZiBFTkFCTEVfRkVBVFVSRV9UQVJfTk9QUkVTRVJWRV9USU1FCisJInRvdWNoXDAiICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIm0iCisjIGVuZGlmCisJIm5vLXJlY3Vyc2lvblwwIglOb19hcmd1bWVudCAgICAgICAiXHhmYSIKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX1RPX0NPTU1BTkQKKwkidG8tY29tbWFuZFwwIgkJUmVxdWlyZWRfYXJndW1lbnQgIlx4ZmIiCisjIGVuZGlmCisJLyogdXNlIG51bWVyaWMgdWlkL2dpZCBmcm9tIHRhciBoZWFkZXIsIG5vdCB0ZXh0dWFsICovCisJIm51bWVyaWMtb3duZXJcMCIgICAgICAgTm9fYXJndW1lbnQgICAgICAgIlx4ZmMiCisJLyogZG8gbm90IHJlc3RvcmUgbW9kZSAqLworCSJuby1zYW1lLXBlcm1pc3Npb25zXDAiIE5vX2FyZ3VtZW50ICAgICAgICJceGZkIgorCS8qIG9uIHVucGFjaywgb3BlbiB3aXRoIE9fVFJVTkMgYW5kICFPX0VYQ0wgKi8KKwkib3ZlcndyaXRlXDAiICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiXHhmZSIKKwkvKiAtLWV4Y2x1ZGUgdGFrZXMgbmV4dCBiaXQgcG9zaXRpb24gaW4gb3B0aW9uIG1hc2ssICovCisJLyogdGhlcmVmb3JlIHdlIGhhdmUgdG8gcHV0IGl0IF9hZnRlcl8gLS1uby1zYW1lLXBlcm1pc3Npb25zICovCisjIGlmIEVOQUJMRV9GRUFUVVJFX1RBUl9GUk9NCisJImV4Y2x1ZGVcMCIgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIlx4ZmYiCisjIGVuZGlmCisJOworI2VuZGlmCisKK2ludCB0YXJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHRhcl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJYXJjaGl2ZV9oYW5kbGVfdCAqdGFyX2hhbmRsZTsKKwljaGFyICpiYXNlX2RpciA9IE5VTEw7CisJY29uc3QgY2hhciAqdGFyX2ZpbGVuYW1lID0gIi0iOworCXVuc2lnbmVkIG9wdDsKKwlpbnQgdmVyYm9zZUZsYWcgPSAwOworI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9MT05HX09QVElPTlMgJiYgRU5BQkxFX0ZFQVRVUkVfVEFSX0ZST00KKwlsbGlzdF90ICpleGNsdWRlcyA9IE5VTEw7CisjZW5kaWYKKworCS8qIEluaXRpYWxpc2UgZGVmYXVsdCB2YWx1ZXMgKi8KKwl0YXJfaGFuZGxlID0gaW5pdF9oYW5kbGUoKTsKKwl0YXJfaGFuZGxlLT5haF9mbGFncyA9IEFSQ0hJVkVfQ1JFQVRFX0xFQURJTkdfRElSUworCSAgICAgICAgICAgICAgICAgICAgIHwgQVJDSElWRV9SRVNUT1JFX0RBVEUKKwkgICAgICAgICAgICAgICAgICAgICB8IEFSQ0hJVkVfVU5MSU5LX09MRDsKKworCS8qIEFwcGFyZW50bHkgb25seSByb290J3MgdGFyIHByZXNlcnZlcyBwZXJtcyAoc2VlIGJ1ZyAzODQ0KSAqLworCWlmIChnZXR1aWQoKSAhPSAwKQorCQl0YXJfaGFuZGxlLT5haF9mbGFncyB8PSBBUkNISVZFX0RPTlRfUkVTVE9SRV9QRVJNOworCisJLyogUHJlcGVuZCAnLScgdG8gdGhlIGZpcnN0IGFyZ3VtZW50IGlmIHJlcXVpcmVkICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLS06IiAvLyBmaXJzdCBhcmcgaXMgb3B0aW9ucworCQkidHQ6dnY6IiAvLyBjb3VudCAtdCwtdgorCQlJRl9GRUFUVVJFX1RBUl9GUk9NKCJYOjpUOjoiKSAvLyBjdW11bGF0aXZlIGxpc3RzCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUyAmJiBFTkFCTEVfRkVBVFVSRV9UQVJfRlJPTQorCQkiXHhmZjo6IiAvLyBjdW11bGF0aXZlIGxpc3RzIGZvciAtLWV4Y2x1ZGUKKyNlbmRpZgorCQlJRl9GRUFUVVJFX1RBUl9DUkVBVEUoImM6IikgInQ6eDoiIC8vIGF0IGxlYXN0IG9uZSBvZiB0aGVzZSBpcyByZXFkCisJCUlGX0ZFQVRVUkVfVEFSX0NSRUFURSgiYy0tdHg6dC0tY3g6eC0tY3QiKSAvLyBtdXR1YWxseSBleGNsdXNpdmUKKwkJSUZfTk9UX0ZFQVRVUkVfVEFSX0NSRUFURSgidC0teDp4LS10Iik7IC8vIG11dHVhbGx5IGV4Y2x1c2l2ZQorI2lmIEVOQUJMRV9GRUFUVVJFX1RBUl9MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gdGFyX2xvbmdvcHRzOworI2VuZGlmCisjaWYgRU5BQkxFX0RFU0tUT1AKKwlpZiAoYXJndlsxXSAmJiBhcmd2WzFdWzBdICE9ICctJykgeworCQkvKiBDb21wYXQ6CisJCSAqIDFzdCBhcmd1bWVudCB3aXRob3V0IGRhc2ggaGFuZGxlcyBvcHRpb25zIHdpdGggcGFyYW1ldGVycworCQkgKiBkaWZmZXJlbnRseSBmcm9tIGRhc2hlZCBvbmU6IGl0IHRha2VzICpuZXh0IGFyZ3ZbaV0qCisJCSAqIGFzIHBhcmFtZW50ZXIgZXZlbiBpZiB0aGVyZSBhcmUgbW9yZSBjaGFycyBpbiAxc3QgYXJndW1lbnQ6CisJCSAqICAidGFyIGZ4IFRBUkZJTEUiIC0gIngiIGlzIG5vdCB0YWtlbiBhcyBmJ3MgcGFyYW0KKwkJICogIGJ1dCBpcyBpbnRlcnByZXRlZCBhcyAteCBvcHRpb24KKwkJICogICJ0YXIgLXhmIFRBUkZJTEUiIC0gZGFzaGVkIGVxdWl2YWxlbnQgb2YgdGhlIGFib3ZlCisJCSAqICAidGFyIC1meCAuLi4iIC0gIngiIGlzIHRha2VuIGFzIGYncyBwYXJhbQorCQkgKiBnZXRvcHQzMiB3b3VsZG4ndCBoYW5kbGUgMXN0IGNvbW1hbmQgY29ycmVjdGx5LgorCQkgKiBVbmZvcnR1bmF0ZWx5LCBwZW9wbGUgZG8gdXNlIHN1Y2ggY29tbWFuZHMuCisJCSAqIFdlIG1hc3NhZ2UgYXJndlsxXSB0byB3b3JrIGFyb3VuZCBpdCBieSBtb3ZpbmcgJ2YnCisJCSAqIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KKwkJICogTW9yZSBjb250cml2ZWQgInRhciBmQ3ggVEFSRklMRSBESVIiIHN0aWxsIGZhaWxzLAorCQkgKiBidXQgc3VjaCBjb21tYW5kcyBhcmUgbXVjaCBsZXNzIGxpa2VseSB0byBiZSB1c2VkLgorCQkgKi8KKwkJY2hhciAqZiA9IHN0cmNocihhcmd2WzFdLCAnZicpOworCQlpZiAoZikgeworCQkJd2hpbGUgKGZbMV0gIT0gJ1wwJykgeworCQkJCSpmID0gZlsxXTsKKwkJCQlmKys7CisJCQl9CisJCQkqZiA9ICdmJzsKKwkJfQorCX0KKyNlbmRpZgorCW9wdCA9IGdldG9wdDMyKGFyZ3YsCisJCSJ0eEM6ZjpPb3B2ayIKKwkJSUZfRkVBVFVSRV9UQVJfQ1JFQVRFKCAgICJjaCIgICkKKwkJSUZfRkVBVFVSRV9TRUFNTEVTU19CWjIoICJqIiAgICkKKwkJSUZfRkVBVFVSRV9TRUFNTEVTU19MWk1BKCJhIiAgICkKKwkJSUZfRkVBVFVSRV9UQVJfRlJPTSggICAgICJUOlg6IikKKwkJSUZfRkVBVFVSRV9TRUFNTEVTU19HWiggICJ6IiAgICkKKwkJSUZfRkVBVFVSRV9TRUFNTEVTU19YWiggICJKIiAgICkKKwkJSUZfRkVBVFVSRV9TRUFNTEVTU19aKCAgICJaIiAgICkKKwkJSUZfRkVBVFVSRV9UQVJfTk9QUkVTRVJWRV9USU1FKCJtIikKKwkJLCAmYmFzZV9kaXIgLy8gLUMgZGlyCisJCSwgJnRhcl9maWxlbmFtZSAvLyAtZiBmaWxlbmFtZQorCQlJRl9GRUFUVVJFX1RBUl9GUk9NKCwgJih0YXJfaGFuZGxlLT5hY2NlcHQpKSAvLyBUCisJCUlGX0ZFQVRVUkVfVEFSX0ZST00oLCAmKHRhcl9oYW5kbGUtPnJlamVjdCkpIC8vIFgKKwkJSUZfRkVBVFVSRV9UQVJfVE9fQ09NTUFORCgsICYodGFyX2hhbmRsZS0+dGFyX190b19jb21tYW5kKSkgLy8gLS10by1jb21tYW5kCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUyAmJiBFTkFCTEVfRkVBVFVSRV9UQVJfRlJPTQorCQksICZleGNsdWRlcyAvLyAtLWV4Y2x1ZGUKKyNlbmRpZgorCQksICZ2ZXJib3NlRmxhZyAvLyBjb21iaW5lZCBjb3VudCBmb3IgLXQgYW5kIC12CisJCSwgJnZlcmJvc2VGbGFnIC8vIGNvbWJpbmVkIGNvdW50IGZvciAtdCBhbmQgLXYKKwkJKTsKKwkvL2JiX2Vycm9yX21zZygib3B0OiUwOHgiLCBvcHQpOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKHZlcmJvc2VGbGFnKSB0YXJfaGFuZGxlLT5hY3Rpb25faGVhZGVyID0gaGVhZGVyX3ZlcmJvc2VfbGlzdDsKKwlpZiAodmVyYm9zZUZsYWcgPT0gMSkgdGFyX2hhbmRsZS0+YWN0aW9uX2hlYWRlciA9IGhlYWRlcl9saXN0OworCisJaWYgKG9wdCAmIE9QVF9FWFRSQUNUKQorCQl0YXJfaGFuZGxlLT5hY3Rpb25fZGF0YSA9IGRhdGFfZXh0cmFjdF9hbGw7CisKKwlpZiAob3B0ICYgT1BUXzJTVERPVVQpCisJCXRhcl9oYW5kbGUtPmFjdGlvbl9kYXRhID0gZGF0YV9leHRyYWN0X3RvX3N0ZG91dDsKKworCWlmIChvcHQgJiBPUFRfMkNPTU1BTkQpIHsKKwkJcHV0ZW52KChjaGFyKikiVEFSX0ZJTEVUWVBFPWYiKTsKKwkJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCQl0YXJfaGFuZGxlLT5hY3Rpb25fZGF0YSA9IGRhdGFfZXh0cmFjdF90b19jb21tYW5kOworCQlJRl9GRUFUVVJFX1RBUl9UT19DT01NQU5EKHRhcl9oYW5kbGUtPnRhcl9fdG9fY29tbWFuZF9zaGVsbCA9IHhzdHJkdXAoZ2V0X3NoZWxsX25hbWUoKSk7KQorCX0KKworCWlmIChvcHQgJiBPUFRfS0VFUF9PTEQpCisJCXRhcl9oYW5kbGUtPmFoX2ZsYWdzICY9IH5BUkNISVZFX1VOTElOS19PTEQ7CisKKwlpZiAob3B0ICYgT1BUX05VTUVSSUNfT1dORVIpCisJCXRhcl9oYW5kbGUtPmFoX2ZsYWdzIHw9IEFSQ0hJVkVfTlVNRVJJQ19PV05FUjsKKworCWlmIChvcHQgJiBPUFRfTk9QUkVTRVJWRV9PV05FUikKKwkJdGFyX2hhbmRsZS0+YWhfZmxhZ3MgfD0gQVJDSElWRV9ET05UX1JFU1RPUkVfT1dORVI7CisKKwlpZiAob3B0ICYgT1BUX05PUFJFU0VSVkVfUEVSTSkKKwkJdGFyX2hhbmRsZS0+YWhfZmxhZ3MgfD0gQVJDSElWRV9ET05UX1JFU1RPUkVfUEVSTTsKKworCWlmIChvcHQgJiBPUFRfT1ZFUldSSVRFKSB7CisJCXRhcl9oYW5kbGUtPmFoX2ZsYWdzICY9IH5BUkNISVZFX1VOTElOS19PTEQ7CisJCXRhcl9oYW5kbGUtPmFoX2ZsYWdzIHw9IEFSQ0hJVkVfT19UUlVOQzsKKwl9CisKKwlpZiAob3B0ICYgT1BUX05PUFJFU0VSVkVfVElNRSkKKwkJdGFyX2hhbmRsZS0+YWhfZmxhZ3MgJj0gfkFSQ0hJVkVfUkVTVE9SRV9EQVRFOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0ZST00KKwl0YXJfaGFuZGxlLT5yZWplY3QgPSBhcHBlbmRfZmlsZV9saXN0X3RvX2xpc3QodGFyX2hhbmRsZS0+cmVqZWN0KTsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUworCS8qIEFwcGVuZCBleGNsdWRlcyB0byByZWplY3QgKi8KKwl3aGlsZSAoZXhjbHVkZXMpIHsKKwkJbGxpc3RfdCAqbmV4dCA9IGV4Y2x1ZGVzLT5saW5rOworCQlleGNsdWRlcy0+bGluayA9IHRhcl9oYW5kbGUtPnJlamVjdDsKKwkJdGFyX2hhbmRsZS0+cmVqZWN0ID0gZXhjbHVkZXM7CisJCWV4Y2x1ZGVzID0gbmV4dDsKKwl9CisjIGVuZGlmCisJdGFyX2hhbmRsZS0+YWNjZXB0ID0gYXBwZW5kX2ZpbGVfbGlzdF90b19saXN0KHRhcl9oYW5kbGUtPmFjY2VwdCk7CisjZW5kaWYKKworCS8qIFNldHVwIGFuIGFycmF5IG9mIGZpbGVuYW1lcyB0byB3b3JrIHdpdGggKi8KKwkvKiBUT0RPOiBUaGlzIGlzIHRoZSBzYW1lIGFzIGluIGFyLCBtYWtlIGEgc2VwYXJhdGUgZnVuY3Rpb24/ICovCisJd2hpbGUgKCphcmd2KSB7CisJCS8qIGtpbGwgdHJhaWxpbmcgJy8nIHVubGVzcyB0aGUgc3RyaW5nIGlzIGp1c3QgIi8iICovCisJCWNoYXIgKmNwID0gbGFzdF9jaGFyX2lzKCphcmd2LCAnLycpOworCQlpZiAoY3AgPiAqYXJndikKKwkJCSpjcCA9ICdcMCc7CisJCWxsaXN0X2FkZF90b19lbmQoJnRhcl9oYW5kbGUtPmFjY2VwdCwgKmFyZ3YpOworCQlhcmd2Kys7CisJfQorCisJaWYgKHRhcl9oYW5kbGUtPmFjY2VwdCB8fCB0YXJfaGFuZGxlLT5yZWplY3QpCisJCXRhcl9oYW5kbGUtPmZpbHRlciA9IGZpbHRlcl9hY2NlcHRfcmVqZWN0X2xpc3Q7CisKKwkvKiBPcGVuIHRoZSB0YXIgZmlsZSAqLworCXsKKwkJaW50IHRhcl9mZCA9IFNURElOX0ZJTEVOTzsKKwkJaW50IGZsYWdzID0gT19SRE9OTFk7CisKKwkJaWYgKG9wdCAmIE9QVF9DUkVBVEUpIHsKKwkJCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZmlsZSB0byB0YXIgdXAgKi8KKwkJCWlmICh0YXJfaGFuZGxlLT5hY2NlcHQgPT0gTlVMTCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZW1wdHkgYXJjaGl2ZSIpOworCisJCQl0YXJfZmQgPSBTVERPVVRfRklMRU5POworCQkJLyogTWltaWNraW5nIEdOVSB0YXIgMS4xNS4xOiAqLworCQkJZmxhZ3MgPSBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DOworCQl9CisKKwkJaWYgKExPTkVfREFTSCh0YXJfZmlsZW5hbWUpKSB7CisJCQl0YXJfaGFuZGxlLT5zcmNfZmQgPSB0YXJfZmQ7CisJCQl0YXJfaGFuZGxlLT5zZWVrID0gc2Vla19ieV9yZWFkOworCQl9IGVsc2UgeworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX1RBUl9BVVRPREVURUNUCisJCQkgJiYgZmxhZ3MgPT0gT19SRE9OTFkKKwkJCSAmJiAhKG9wdCAmIE9QVF9BTllfQ09NUFJFU1MpCisJCQkpIHsKKwkJCQl0YXJfaGFuZGxlLT5zcmNfZmQgPSBvcGVuX3ppcHBlZCh0YXJfZmlsZW5hbWUsIC8qZmFpbF9pZl9ub3RfY29tcHJlc3NlZDoqLyAwKTsKKwkJCQlpZiAodGFyX2hhbmRsZS0+c3JjX2ZkIDwgMCkKKwkJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBvcGVuICclcyciLCB0YXJfZmlsZW5hbWUpOworCQkJfSBlbHNlIHsKKwkJCQl0YXJfaGFuZGxlLT5zcmNfZmQgPSB4b3Blbih0YXJfZmlsZW5hbWUsIGZsYWdzKTsKKwkJCX0KKwkJfQorCX0KKworCWlmIChiYXNlX2RpcikKKwkJeGNoZGlyKGJhc2VfZGlyKTsKKworCS8vaWYgKFNFQU1MRVNTX0NPTVBSRVNTSU9OKQorCS8vCS8qIFdlIG5lZWQgdG8ga25vdyB3aGV0aGVyIGNoaWxkIChnemlwL2J6aXAvZXRjKSBleGl0cyBhYm5vcm1hbGx5ICovCisJLy8Jc2lnbmFsKFNJR0NITEQsIGNoZWNrX2Vycm9yc19pbl9jaGlsZHJlbik7CisKKwkvKiBDcmVhdGUgYW4gYXJjaGl2ZSAqLworCWlmIChvcHQgJiBPUFRfQ1JFQVRFKSB7CisjaWYgU0VBTUxFU1NfQ09NUFJFU1NJT04KKwkJY29uc3QgY2hhciAqemlwTW9kZSA9IE5VTEw7CisJCWlmIChvcHQgJiBPUFRfQ09NUFJFU1MpCisJCQl6aXBNb2RlID0gImNvbXByZXNzIjsKKwkJaWYgKG9wdCAmIE9QVF9HWklQKQorCQkJemlwTW9kZSA9ICJnemlwIjsKKwkJaWYgKG9wdCAmIE9QVF9CWklQMikKKwkJCXppcE1vZGUgPSAiYnppcDIiOworCQlpZiAob3B0ICYgT1BUX0xaTUEpCisJCQl6aXBNb2RlID0gImx6bWEiOworCQlpZiAob3B0ICYgT1BUX1haKQorCQkJemlwTW9kZSA9ICJ4eiI7CisjZW5kaWYKKwkJLyogTkI6IHdyaXRlVGFyRmlsZSgpIGNsb3NlcyB0YXJfaGFuZGxlLT5zcmNfZmQgKi8KKwkJcmV0dXJuIHdyaXRlVGFyRmlsZSh0YXJfaGFuZGxlLT5zcmNfZmQsIHZlcmJvc2VGbGFnLAorCQkJCShvcHQgJiBPUFRfREVSRUZFUkVOQ0UgPyBBQ1RJT05fRk9MTE9XTElOS1MgOiAwKQorCQkJCXwgKG9wdCAmIE9QVF9OT1JFQ1VSU0lPTiA/IDAgOiBBQ1RJT05fUkVDVVJTRSksCisJCQkJdGFyX2hhbmRsZS0+YWNjZXB0LAorCQkJCXRhcl9oYW5kbGUtPnJlamVjdCwgemlwTW9kZSk7CisJfQorCisJaWYgKG9wdCAmIE9QVF9BTllfQ09NUFJFU1MpIHsKKwkJVVNFX0ZPUl9NTVUoSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMgKCp4Zm9ybWVyKSh0cmFuc2Zvcm1lcl9zdGF0ZV90ICp4c3RhdGUpOykKKwkJVVNFX0ZPUl9OT01NVShjb25zdCBjaGFyICp4Zm9ybWVyX3Byb2c7KQorCisJCWlmIChvcHQgJiBPUFRfQ09NUFJFU1MpCisJCQlVU0VfRk9SX01NVSh4Zm9ybWVyID0gdW5wYWNrX1pfc3RyZWFtOykKKwkJCVVTRV9GT1JfTk9NTVUoeGZvcm1lcl9wcm9nID0gInVuY29tcHJlc3MiOykKKwkJaWYgKG9wdCAmIE9QVF9HWklQKQorCQkJVVNFX0ZPUl9NTVUoeGZvcm1lciA9IHVucGFja19nel9zdHJlYW07KQorCQkJVVNFX0ZPUl9OT01NVSh4Zm9ybWVyX3Byb2cgPSAiZ3VuemlwIjspCisJCWlmIChvcHQgJiBPUFRfQlpJUDIpCisJCQlVU0VfRk9SX01NVSh4Zm9ybWVyID0gdW5wYWNrX2J6Ml9zdHJlYW07KQorCQkJVVNFX0ZPUl9OT01NVSh4Zm9ybWVyX3Byb2cgPSAiYnVuemlwMiI7KQorCQlpZiAob3B0ICYgT1BUX0xaTUEpCisJCQlVU0VfRk9SX01NVSh4Zm9ybWVyID0gdW5wYWNrX2x6bWFfc3RyZWFtOykKKwkJCVVTRV9GT1JfTk9NTVUoeGZvcm1lcl9wcm9nID0gInVubHptYSI7KQorCQlpZiAob3B0ICYgT1BUX1haKQorCQkJVVNFX0ZPUl9NTVUoeGZvcm1lciA9IHVucGFja194el9zdHJlYW07KQorCQkJVVNFX0ZPUl9OT01NVSh4Zm9ybWVyX3Byb2cgPSAidW54eiI7KQorCisJCWZvcmtfdHJhbnNmb3JtZXJfd2l0aF9zaWcodGFyX2hhbmRsZS0+c3JjX2ZkLCB4Zm9ybWVyLCB4Zm9ybWVyX3Byb2cpOworCQkvKiBDYW4ndCBsc2VlayBvdmVyIHBpcGVzICovCisJCXRhcl9oYW5kbGUtPnNlZWsgPSBzZWVrX2J5X3JlYWQ7CisJCS8qdGFyX2hhbmRsZS0+b2Zmc2V0ID0gMDsgLSBhbHJlYWR5IGlzICovCisJfQorCisJLyogWmVybyBwcm9jZXNzZWQgaGVhZGVycyAoPT0gZW1wdHkgZmlsZSkgaXMgbm90IGEgdmFsaWQgdGFyYmFsbC4KKwkgKiBXZSAoYWIpdXNlIGJiX2dvdF9zaWduYWwgYXMgZXhpdGNvZGUgaGVyZSwKKwkgKiBiZWNhdXNlIGNoZWNrX2Vycm9yc19pbl9jaGlsZHJlbigpIHVzZXMgX2l0XyBhcyBlcnJvciBpbmRpY2F0b3IuCisJICovCisJYmJfZ290X3NpZ25hbCA9IEVYSVRfRkFJTFVSRTsKKworCXdoaWxlIChnZXRfaGVhZGVyX3Rhcih0YXJfaGFuZGxlKSA9PSBFWElUX1NVQ0NFU1MpCisJCWJiX2dvdF9zaWduYWwgPSBFWElUX1NVQ0NFU1M7IC8qIHNhdyBhdCBsZWFzdCBvbmUgaGVhZGVyLCBnb29kICovCisKKwkvKiBDaGVjayB0aGF0IGV2ZXJ5IGZpbGUgdGhhdCBzaG91bGQgaGF2ZSBiZWVuIGV4dHJhY3RlZCB3YXMgKi8KKwl3aGlsZSAodGFyX2hhbmRsZS0+YWNjZXB0KSB7CisJCWlmICghZmluZF9saXN0X2VudHJ5KHRhcl9oYW5kbGUtPnJlamVjdCwgdGFyX2hhbmRsZS0+YWNjZXB0LT5kYXRhKQorCQkgJiYgIWZpbmRfbGlzdF9lbnRyeSh0YXJfaGFuZGxlLT5wYXNzZWQsIHRhcl9oYW5kbGUtPmFjY2VwdC0+ZGF0YSkKKwkJKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6IG5vdCBmb3VuZCBpbiBhcmNoaXZlIiwKKwkJCQl0YXJfaGFuZGxlLT5hY2NlcHQtPmRhdGEpOworCQl9CisJCXRhcl9oYW5kbGUtPmFjY2VwdCA9IHRhcl9oYW5kbGUtPmFjY2VwdC0+bGluazsKKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQIC8qICYmIHRhcl9oYW5kbGUtPnNyY19mZCAhPSBTVERJTl9GSUxFTk8gKi8pCisJCWNsb3NlKHRhcl9oYW5kbGUtPnNyY19mZCk7CisKKwlpZiAoU0VBTUxFU1NfQ09NUFJFU1NJT04gfHwgT1BUX0NPTVBSRVNTKSB7CisJCS8qIFNldCBiYl9nb3Rfc2lnbmFsIHRvIDEgaWYgYSBjaGlsZCBkaWVkIHdpdGggITAgZXhpdGNvZGUgKi8KKwkJY2hlY2tfZXJyb3JzX2luX2NoaWxkcmVuKDApOworCX0KKworCXJldHVybiBiYl9nb3Rfc2lnbmFsOworfQpkaWZmIC0tZ2l0IGEvYXJjaGl2YWwvdW56aXAuYyBiL2FyY2hpdmFsL3VuemlwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQxYWI2ZgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hpdmFsL3VuemlwLmMKQEAgLTAsMCArMSw3NjYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgdW56aXAgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRWQgQ2xhcmsKKyAqCisgKiBMb29zZWx5IGJhc2VkIG9uIG9yaWdpbmFsIGJ1c3lib3ggdW56aXAgYXBwbGV0IGJ5IExhdXJlbmNlIEFuZGVyc29uLgorICogQWxsIG9wdGlvbnMgYW5kIGZlYXR1cmVzIHNob3VsZCB3b3JrIGluIHRoaXMgdmVyc2lvbi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisvKiBGb3IgcmVmZXJlbmNlIHNlZQorICogaHR0cDovL3d3dy5wa3dhcmUuY29tL2NvbXBhbnkvc3RhbmRhcmRzL2FwcG5vdGUvCisgKiBodHRwOi8vd3d3LmluZm8temlwLm9yZy9wdWIvaW5mb3ppcC9kb2MvYXBwbm90ZS1pei1sYXRlc3QuemlwCisgKgorICogVE9ETworICogWmlwNjQgKyBvdGhlciBtZXRob2RzCisgKi8KKworLy9jb25maWc6Y29uZmlnIFVOWklQCisvL2NvbmZpZzoJYm9vbCAidW56aXAiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgdW56aXAgd2lsbCBsaXN0IG9yIGV4dHJhY3QgZmlsZXMgZnJvbSBhIFpJUCBhcmNoaXZlLAorLy9jb25maWc6CSAgY29tbW9ubHkgZm91bmQgb24gRE9TL1dJTiBzeXN0ZW1zLiBUaGUgZGVmYXVsdCBiZWhhdmlvcgorLy9jb25maWc6CSAgKHdpdGggbm8gb3B0aW9ucykgaXMgdG8gZXh0cmFjdCB0aGUgYXJjaGl2ZSBpbnRvIHRoZQorLy9jb25maWc6CSAgY3VycmVudCBkaXJlY3RvcnkuIFVzZSB0aGUgYC1kJyBvcHRpb24gdG8gZXh0cmFjdCB0byBhCisvL2NvbmZpZzoJICBkaXJlY3Rvcnkgb2YgeW91ciBjaG9pY2UuCisKKy8vYXBwbGV0OklGX1VOWklQKEFQUExFVCh1bnppcCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisvL2tidWlsZDpsaWItJChDT05GSUdfVU5aSVApICs9IHVuemlwLm8KKworLy91c2FnZTojZGVmaW5lIHVuemlwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWxub3BxXSBGSUxFWy56aXBdIFtGSUxFXS4uLiBbLXggRklMRS4uLl0gWy1kIERJUl0iCisvL3VzYWdlOiNkZWZpbmUgdW56aXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJFeHRyYWN0IEZJTEVzIGZyb20gWklQIGFyY2hpdmVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGlzdCBjb250ZW50cyAod2l0aCAtcSBmb3Igc2hvcnQgZm9ybSkiCisvL3VzYWdlOiAgICAgIlxuCS1uCU5ldmVyIG92ZXJ3cml0ZSBmaWxlcyAoZGVmYXVsdDogYXNrKSIKKy8vdXNhZ2U6ICAgICAiXG4JLW8JT3ZlcndyaXRlIgorLy91c2FnZTogICAgICJcbgktcAlQcmludCB0byBzdGRvdXQiCisvL3VzYWdlOiAgICAgIlxuCS1xCVF1aWV0IgorLy91c2FnZTogICAgICJcbgkteCBGSUxFCUV4Y2x1ZGUgRklMRXMiCisvL3VzYWdlOiAgICAgIlxuCS1kIERJUglFeHRyYWN0IGludG8gRElSIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJiYl9hcmNoaXZlLmgiCisKK2VudW0geworI2lmIEJCX0JJR19FTkRJQU4KKwlaSVBfRklMRUhFQURFUl9NQUdJQyA9IDB4NTA0YjAzMDQsCisJWklQX0NERl9NQUdJQyAgICAgICAgPSAweDUwNGIwMTAyLCAvKiBjZW50cmFsIGRpcmVjdG9yeSdzIGZpbGUgaGVhZGVyICovCisJWklQX0NERV9NQUdJQyAgICAgICAgPSAweDUwNGIwNTA2LCAvKiAiZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IiByZWNvcmQgKi8KKwlaSVBfRERfTUFHSUMgICAgICAgICA9IDB4NTA0YjA3MDgsCisjZWxzZQorCVpJUF9GSUxFSEVBREVSX01BR0lDID0gMHgwNDAzNGI1MCwKKwlaSVBfQ0RGX01BR0lDICAgICAgICA9IDB4MDIwMTRiNTAsCisJWklQX0NERV9NQUdJQyAgICAgICAgPSAweDA2MDU0YjUwLAorCVpJUF9ERF9NQUdJQyAgICAgICAgID0gMHgwODA3NGI1MCwKKyNlbmRpZgorfTsKKworI2RlZmluZSBaSVBfSEVBREVSX0xFTiAyNgorCit0eXBlZGVmIHVuaW9uIHsKKwl1aW50OF90IHJhd1taSVBfSEVBREVSX0xFTl07CisJc3RydWN0IHsKKwkJdWludDE2X3QgdmVyc2lvbjsgICAgICAgICAgICAgICAvKiAwLTEgKi8KKwkJdWludDE2X3QgemlwX2ZsYWdzOyAgICAgICAgICAgICAvKiAyLTMgKi8KKwkJdWludDE2X3QgbWV0aG9kOyAgICAgICAgICAgICAgICAvKiA0LTUgKi8KKwkJdWludDE2X3QgbW9kdGltZTsgICAgICAgICAgICAgICAvKiA2LTcgKi8KKwkJdWludDE2X3QgbW9kZGF0ZTsgICAgICAgICAgICAgICAvKiA4LTkgKi8KKwkJdWludDMyX3QgY3JjMzIgUEFDS0VEOyAgICAgICAgICAvKiAxMC0xMyAqLworCQl1aW50MzJfdCBjbXBzaXplIFBBQ0tFRDsgICAgICAgIC8qIDE0LTE3ICovCisJCXVpbnQzMl90IHVjbXBzaXplIFBBQ0tFRDsgICAgICAgLyogMTgtMjEgKi8KKwkJdWludDE2X3QgZmlsZW5hbWVfbGVuOyAgICAgICAgICAvKiAyMi0yMyAqLworCQl1aW50MTZfdCBleHRyYV9sZW47ICAgICAgICAgICAgIC8qIDI0LTI1ICovCisJfSBmb3JtYXR0ZWQgUEFDS0VEOworfSB6aXBfaGVhZGVyX3Q7IC8qIFBBQ0tFRCAtIGdjYyA0LjIuMSBkb2Vzbid0IGxpa2UgaXQgKHNwZXdzIHdhcm5pbmcpICovCisKKy8qIENoZWNrIHRoZSBvZmZzZXQgb2YgdGhlIGxhc3QgZWxlbWVudCwgbm90IHRoZSBsZW5ndGguICBUaGlzIGxlbmllbmN5CisgKiBhbGxvd3MgZm9yIHBvb3IgcGFja2luZywgd2hlcmVieSB0aGUgb3ZlcmFsbCBzdHJ1Y3QgbWF5IGJlIHRvbyBsb25nLAorICogZXZlbiB0aG91Z2ggdGhlIGVsZW1lbnRzIGFyZSBhbGwgaW4gdGhlIHJpZ2h0IHBsYWNlLgorICovCitzdHJ1Y3QgQlVHX3ppcF9oZWFkZXJfbXVzdF9iZV8yNl9ieXRlcyB7CisJY2hhciBCVUdfemlwX2hlYWRlcl9tdXN0X2JlXzI2X2J5dGVzWworCQlvZmZzZXRvZih6aXBfaGVhZGVyX3QsIGZvcm1hdHRlZC5leHRyYV9sZW4pICsgMgorCQkJPT0gWklQX0hFQURFUl9MRU4gPyAxIDogLTFdOworfTsKKworI2RlZmluZSBGSVhfRU5ESUFOTkVTU19aSVAoemlwX2hlYWRlcikgZG8geyBcCisJKHppcF9oZWFkZXIpLmZvcm1hdHRlZC52ZXJzaW9uICAgICAgPSBTV0FQX0xFMTYoKHppcF9oZWFkZXIpLmZvcm1hdHRlZC52ZXJzaW9uICAgICApOyBcCisJKHppcF9oZWFkZXIpLmZvcm1hdHRlZC5tZXRob2QgICAgICAgPSBTV0FQX0xFMTYoKHppcF9oZWFkZXIpLmZvcm1hdHRlZC5tZXRob2QgICAgICApOyBcCisJKHppcF9oZWFkZXIpLmZvcm1hdHRlZC5tb2R0aW1lICAgICAgPSBTV0FQX0xFMTYoKHppcF9oZWFkZXIpLmZvcm1hdHRlZC5tb2R0aW1lICAgICApOyBcCisJKHppcF9oZWFkZXIpLmZvcm1hdHRlZC5tb2RkYXRlICAgICAgPSBTV0FQX0xFMTYoKHppcF9oZWFkZXIpLmZvcm1hdHRlZC5tb2RkYXRlICAgICApOyBcCisJKHppcF9oZWFkZXIpLmZvcm1hdHRlZC5jcmMzMiAgICAgICAgPSBTV0FQX0xFMzIoKHppcF9oZWFkZXIpLmZvcm1hdHRlZC5jcmMzMiAgICAgICApOyBcCisJKHppcF9oZWFkZXIpLmZvcm1hdHRlZC5jbXBzaXplICAgICAgPSBTV0FQX0xFMzIoKHppcF9oZWFkZXIpLmZvcm1hdHRlZC5jbXBzaXplICAgICApOyBcCisJKHppcF9oZWFkZXIpLmZvcm1hdHRlZC51Y21wc2l6ZSAgICAgPSBTV0FQX0xFMzIoKHppcF9oZWFkZXIpLmZvcm1hdHRlZC51Y21wc2l6ZSAgICApOyBcCisJKHppcF9oZWFkZXIpLmZvcm1hdHRlZC5maWxlbmFtZV9sZW4gPSBTV0FQX0xFMTYoKHppcF9oZWFkZXIpLmZvcm1hdHRlZC5maWxlbmFtZV9sZW4pOyBcCisJKHppcF9oZWFkZXIpLmZvcm1hdHRlZC5leHRyYV9sZW4gICAgPSBTV0FQX0xFMTYoKHppcF9oZWFkZXIpLmZvcm1hdHRlZC5leHRyYV9sZW4gICApOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENERl9IRUFERVJfTEVOIDQyCisKK3R5cGVkZWYgdW5pb24geworCXVpbnQ4X3QgcmF3W0NERl9IRUFERVJfTEVOXTsKKwlzdHJ1Y3QgeworCQkvKiB1aW50MzJfdCBzaWduYXR1cmU7IDUwIDRiIDAxIDAyICovCisJCXVpbnQxNl90IHZlcnNpb25fbWFkZV9ieTsgICAgICAgLyogMC0xICovCisJCXVpbnQxNl90IHZlcnNpb25fbmVlZGVkOyAgICAgICAgLyogMi0zICovCisJCXVpbnQxNl90IGNkZl9mbGFnczsgICAgICAgICAgICAgLyogNC01ICovCisJCXVpbnQxNl90IG1ldGhvZDsgICAgICAgICAgICAgICAgLyogNi03ICovCisJCXVpbnQxNl90IG10aW1lOyAgICAgICAgICAgICAgICAgLyogOC05ICovCisJCXVpbnQxNl90IG1kYXRlOyAgICAgICAgICAgICAgICAgLyogMTAtMTEgKi8KKwkJdWludDMyX3QgY3JjMzI7ICAgICAgICAgICAgICAgICAvKiAxMi0xNSAqLworCQl1aW50MzJfdCBjbXBzaXplOyAgICAgICAgICAgICAgIC8qIDE2LTE5ICovCisJCXVpbnQzMl90IHVjbXBzaXplOyAgICAgICAgICAgICAgLyogMjAtMjMgKi8KKwkJdWludDE2X3QgZmlsZV9uYW1lX2xlbmd0aDsgICAgICAvKiAyNC0yNSAqLworCQl1aW50MTZfdCBleHRyYV9maWVsZF9sZW5ndGg7ICAgIC8qIDI2LTI3ICovCisJCXVpbnQxNl90IGZpbGVfY29tbWVudF9sZW5ndGg7ICAgLyogMjgtMjkgKi8KKwkJdWludDE2X3QgZGlza19udW1iZXJfc3RhcnQ7ICAgICAvKiAzMC0zMSAqLworCQl1aW50MTZfdCBpbnRlcm5hbF9maWxlX2F0dHJpYnV0ZXM7IC8qIDMyLTMzICovCisJCXVpbnQzMl90IGV4dGVybmFsX2ZpbGVfYXR0cmlidXRlcyBQQUNLRUQ7IC8qIDM0LTM3ICovCisJCXVpbnQzMl90IHJlbGF0aXZlX29mZnNldF9vZl9sb2NhbF9oZWFkZXIgUEFDS0VEOyAvKiAzOC00MSAqLworCX0gZm9ybWF0dGVkIFBBQ0tFRDsKK30gY2RmX2hlYWRlcl90OworCitzdHJ1Y3QgQlVHX2NkZl9oZWFkZXJfbXVzdF9iZV80Ml9ieXRlcyB7CisJY2hhciBCVUdfY2RmX2hlYWRlcl9tdXN0X2JlXzQyX2J5dGVzWworCQlvZmZzZXRvZihjZGZfaGVhZGVyX3QsIGZvcm1hdHRlZC5yZWxhdGl2ZV9vZmZzZXRfb2ZfbG9jYWxfaGVhZGVyKSArIDQKKwkJCT09IENERl9IRUFERVJfTEVOID8gMSA6IC0xXTsKK307CisKKyNkZWZpbmUgRklYX0VORElBTk5FU1NfQ0RGKGNkZl9oZWFkZXIpIGRvIHsgXAorCShjZGZfaGVhZGVyKS5mb3JtYXR0ZWQuY3JjMzIgICAgICAgID0gU1dBUF9MRTMyKChjZGZfaGVhZGVyKS5mb3JtYXR0ZWQuY3JjMzIgICAgICAgKTsgXAorCShjZGZfaGVhZGVyKS5mb3JtYXR0ZWQuY21wc2l6ZSAgICAgID0gU1dBUF9MRTMyKChjZGZfaGVhZGVyKS5mb3JtYXR0ZWQuY21wc2l6ZSAgICAgKTsgXAorCShjZGZfaGVhZGVyKS5mb3JtYXR0ZWQudWNtcHNpemUgICAgID0gU1dBUF9MRTMyKChjZGZfaGVhZGVyKS5mb3JtYXR0ZWQudWNtcHNpemUgICAgKTsgXAorCShjZGZfaGVhZGVyKS5mb3JtYXR0ZWQuZmlsZV9uYW1lX2xlbmd0aCA9IFNXQVBfTEUxNigoY2RmX2hlYWRlcikuZm9ybWF0dGVkLmZpbGVfbmFtZV9sZW5ndGgpOyBcCisJKGNkZl9oZWFkZXIpLmZvcm1hdHRlZC5leHRyYV9maWVsZF9sZW5ndGggPSBTV0FQX0xFMTYoKGNkZl9oZWFkZXIpLmZvcm1hdHRlZC5leHRyYV9maWVsZF9sZW5ndGgpOyBcCisJKGNkZl9oZWFkZXIpLmZvcm1hdHRlZC5maWxlX2NvbW1lbnRfbGVuZ3RoID0gU1dBUF9MRTE2KChjZGZfaGVhZGVyKS5mb3JtYXR0ZWQuZmlsZV9jb21tZW50X2xlbmd0aCk7IFwKKwlJRl9ERVNLVE9QKCBcCisJKGNkZl9oZWFkZXIpLmZvcm1hdHRlZC52ZXJzaW9uX21hZGVfYnkgPSBTV0FQX0xFMTYoKGNkZl9oZWFkZXIpLmZvcm1hdHRlZC52ZXJzaW9uX21hZGVfYnkpOyBcCisJKGNkZl9oZWFkZXIpLmZvcm1hdHRlZC5leHRlcm5hbF9maWxlX2F0dHJpYnV0ZXMgPSBTV0FQX0xFMzIoKGNkZl9oZWFkZXIpLmZvcm1hdHRlZC5leHRlcm5hbF9maWxlX2F0dHJpYnV0ZXMpOyBcCisJKSBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIENERV9IRUFERVJfTEVOIDE2CisKK3R5cGVkZWYgdW5pb24geworCXVpbnQ4X3QgcmF3W0NERV9IRUFERVJfTEVOXTsKKwlzdHJ1Y3QgeworCQkvKiB1aW50MzJfdCBzaWduYXR1cmU7IDUwIDRiIDA1IDA2ICovCisJCXVpbnQxNl90IHRoaXNfZGlza19ubzsKKwkJdWludDE2X3QgZGlza193aXRoX2NkZl9ubzsKKwkJdWludDE2X3QgY2RmX2VudHJpZXNfb25fdGhpc19kaXNrOworCQl1aW50MTZfdCBjZGZfZW50cmllc190b3RhbDsKKwkJdWludDMyX3QgY2RmX3NpemU7CisJCXVpbnQzMl90IGNkZl9vZmZzZXQ7CisJCS8qIHVpbnQxNl90IGZpbGVfY29tbWVudF9sZW5ndGg7ICovCisJCS8qIC5aSVAgZmlsZSBjb21tZW50ICh2YXJpYWJsZSBzaXplKSAqLworCX0gZm9ybWF0dGVkIFBBQ0tFRDsKK30gY2RlX2hlYWRlcl90OworCitzdHJ1Y3QgQlVHX2NkZV9oZWFkZXJfbXVzdF9iZV8xNl9ieXRlcyB7CisJY2hhciBCVUdfY2RlX2hlYWRlcl9tdXN0X2JlXzE2X2J5dGVzWworCQlzaXplb2YoY2RlX2hlYWRlcl90KSA9PSBDREVfSEVBREVSX0xFTiA/IDEgOiAtMV07Cit9OworCisjZGVmaW5lIEZJWF9FTkRJQU5ORVNTX0NERShjZGVfaGVhZGVyKSBkbyB7IFwKKwkoY2RlX2hlYWRlcikuZm9ybWF0dGVkLmNkZl9vZmZzZXQgPSBTV0FQX0xFMzIoKGNkZV9oZWFkZXIpLmZvcm1hdHRlZC5jZGZfb2Zmc2V0KTsgXAorfSB3aGlsZSAoMCkKKworZW51bSB7IHppcF9mZCA9IDMgfTsKKworCisjaWYgRU5BQkxFX0RFU0tUT1AKKworLyogU2VlbiBpbiB0aGUgd2lsZDoKKyAqIFNlbGYtZXh0cmFjdGluZyBQUk8ySzNYUF8zMi5leGUgY29udGFpbnMgMTkwNzg0NjQgYnl0ZSB6aXAgYXJjaGl2ZSwKKyAqIHdoZXJlIENERSB3YXMgbmVhcmx5IDQ4IGtieXRlcyBiZWZvcmUgRU9GLgorICogKFN1cnByaXNpbmdseSwgaXQgYWxzbyBhcHBhcmVudGx5IGhhcyAqYW5vdGhlciogQ0RFIHN0cnVjdHVyZQorICogY2xvc2VyIHRvIHRoZSBlbmQsIHdpdGggYm9ndXMgY2RmX29mZnNldCkuCisgKiBUbyBtYWtlIGV4dHJhY3Rpb24gd29yaywgYnVtcGVkIFBFRUtfRlJPTV9FTkQgZnJvbSAxNmsgdG8gNjRrLgorICovCisjZGVmaW5lIFBFRUtfRlJPTV9FTkQgKDY0KjEwMjQpCisKKy8qIFRoaXMgdmFsdWUgbWVhbnMgdGhhdCB3ZSBmYWlsZWQgdG8gZmluZCBDREYgKi8KKyNkZWZpbmUgQkFEX0NERl9PRkZTRVQgKCh1aW50MzJfdCkweGZmZmZmZmZmKQorCisvKiBOQjogZG9lcyBub3QgcHJlc2VydmUgZmlsZSBwb3NpdGlvbiEgKi8KK3N0YXRpYyB1aW50MzJfdCBmaW5kX2NkZl9vZmZzZXQodm9pZCkKK3sKKwljZGVfaGVhZGVyX3QgY2RlX2hlYWRlcjsKKwl1bnNpZ25lZCBjaGFyICpwOworCW9mZl90IGVuZDsKKwl1bnNpZ25lZCBjaGFyICpidWYgPSB4emFsbG9jKFBFRUtfRlJPTV9FTkQpOworCisJZW5kID0geGxzZWVrKHppcF9mZCwgMCwgU0VFS19FTkQpOworCWVuZCAtPSBQRUVLX0ZST01fRU5EOworCWlmIChlbmQgPCAwKQorCQllbmQgPSAwOworCXhsc2Vlayh6aXBfZmQsIGVuZCwgU0VFS19TRVQpOworCWZ1bGxfcmVhZCh6aXBfZmQsIGJ1ZiwgUEVFS19GUk9NX0VORCk7CisKKwljZGVfaGVhZGVyLmZvcm1hdHRlZC5jZGZfb2Zmc2V0ID0gQkFEX0NERl9PRkZTRVQ7CisJcCA9IGJ1ZjsKKwl3aGlsZSAocCA8PSBidWYgKyBQRUVLX0ZST01fRU5EIC0gQ0RFX0hFQURFUl9MRU4gLSA0KSB7CisJCWlmICgqcCAhPSAnUCcpIHsKKwkJCXArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgqKytwICE9ICdLJykKKwkJCWNvbnRpbnVlOworCQlpZiAoKisrcCAhPSA1KQorCQkJY29udGludWU7CisJCWlmICgqKytwICE9IDYpCisJCQljb250aW51ZTsKKwkJLyogd2UgZm91bmQgQ0RFISAqLworCQltZW1jcHkoY2RlX2hlYWRlci5yYXcsIHAgKyAxLCBDREVfSEVBREVSX0xFTik7CisJCUZJWF9FTkRJQU5ORVNTX0NERShjZGVfaGVhZGVyKTsKKwkJLyoKKwkJICogSSd2ZSBzZWVuIC5aSVAgZmlsZXMgd2l0aCBzZWVtaW5nbHkgdmFsaWQgQ0RFcworCQkgKiB3aGVyZSBjZGZfb2Zmc2V0IHBvaW50cyBwYXN0IEVPRiAtID8/CisJCSAqIElnbm9yZSBzdWNoIENERXM6CisJCSAqLworCQlpZiAoY2RlX2hlYWRlci5mb3JtYXR0ZWQuY2RmX29mZnNldCA8IGVuZCArIChwIC0gYnVmKSkKKwkJCWJyZWFrOworCQljZGVfaGVhZGVyLmZvcm1hdHRlZC5jZGZfb2Zmc2V0ID0gQkFEX0NERl9PRkZTRVQ7CisJfQorCWZyZWUoYnVmKTsKKwlyZXR1cm4gY2RlX2hlYWRlci5mb3JtYXR0ZWQuY2RmX29mZnNldDsKK307CisKK3N0YXRpYyB1aW50MzJfdCByZWFkX25leHRfY2RmKHVpbnQzMl90IGNkZl9vZmZzZXQsIGNkZl9oZWFkZXJfdCAqY2RmX3B0cikKK3sKKwlvZmZfdCBvcmc7CisKKwlvcmcgPSB4bHNlZWsoemlwX2ZkLCAwLCBTRUVLX0NVUik7CisKKwlpZiAoIWNkZl9vZmZzZXQpCisJCWNkZl9vZmZzZXQgPSBmaW5kX2NkZl9vZmZzZXQoKTsKKworCWlmIChjZGZfb2Zmc2V0ICE9IEJBRF9DREZfT0ZGU0VUKSB7CisJCXhsc2Vlayh6aXBfZmQsIGNkZl9vZmZzZXQgKyA0LCBTRUVLX1NFVCk7CisJCXhyZWFkKHppcF9mZCwgY2RmX3B0ci0+cmF3LCBDREZfSEVBREVSX0xFTik7CisJCUZJWF9FTkRJQU5ORVNTX0NERigqY2RmX3B0cik7CisJCWNkZl9vZmZzZXQgKz0gNCArIENERl9IRUFERVJfTEVOCisJCQkrIGNkZl9wdHItPmZvcm1hdHRlZC5maWxlX25hbWVfbGVuZ3RoCisJCQkrIGNkZl9wdHItPmZvcm1hdHRlZC5leHRyYV9maWVsZF9sZW5ndGgKKwkJCSsgY2RmX3B0ci0+Zm9ybWF0dGVkLmZpbGVfY29tbWVudF9sZW5ndGg7CisJfQorCisJeGxzZWVrKHppcF9mZCwgb3JnLCBTRUVLX1NFVCk7CisJcmV0dXJuIGNkZl9vZmZzZXQ7Cit9OworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHVuemlwX3NraXAob2ZmX3Qgc2tpcCkKK3sKKwlpZiAoc2tpcCAhPSAwKQorCQlpZiAobHNlZWsoemlwX2ZkLCBza2lwLCBTRUVLX0NVUikgPT0gKG9mZl90KS0xKQorCQkJYmJfY29weWZkX2V4YWN0X3NpemUoemlwX2ZkLCAtMSwgc2tpcCk7Cit9CisKK3N0YXRpYyB2b2lkIHVuemlwX2NyZWF0ZV9sZWFkaW5nX2RpcnMoY29uc3QgY2hhciAqZm4pCit7CisJLyogQ3JlYXRlIGFsbCBsZWFkaW5nIGRpcmVjdG9yaWVzICovCisJY2hhciAqbmFtZSA9IHhzdHJkdXAoZm4pOworCWlmIChiYl9tYWtlX2RpcmVjdG9yeShkaXJuYW1lKG5hbWUpLCAwNzc3LCBGSUxFVVRJTFNfUkVDVVIpKSB7CisJCXhmdW5jX2RpZSgpOyAvKiBiYl9tYWtlX2RpcmVjdG9yeSBpcyBub2lzeSAqLworCX0KKwlmcmVlKG5hbWUpOworfQorCitzdGF0aWMgdm9pZCB1bnppcF9leHRyYWN0KHppcF9oZWFkZXJfdCAqemlwX2hlYWRlciwgaW50IGRzdF9mZCkKK3sKKwlpZiAoemlwX2hlYWRlci0+Zm9ybWF0dGVkLm1ldGhvZCA9PSAwKSB7CisJCS8qIE1ldGhvZCAwIC0gc3RvcmVkIChub3QgY29tcHJlc3NlZCkgKi8KKwkJb2ZmX3Qgc2l6ZSA9IHppcF9oZWFkZXItPmZvcm1hdHRlZC51Y21wc2l6ZTsKKwkJaWYgKHNpemUpCisJCQliYl9jb3B5ZmRfZXhhY3Rfc2l6ZSh6aXBfZmQsIGRzdF9mZCwgc2l6ZSk7CisJfSBlbHNlIHsKKwkJLyogTWV0aG9kIDggLSBpbmZsYXRlICovCisJCXRyYW5zZm9ybWVyX3N0YXRlX3QgeHN0YXRlOworCQlpbml0X3RyYW5zZm9ybWVyX3N0YXRlKCZ4c3RhdGUpOworCQl4c3RhdGUuYnl0ZXNfaW4gPSB6aXBfaGVhZGVyLT5mb3JtYXR0ZWQuY21wc2l6ZTsKKwkJeHN0YXRlLnNyY19mZCA9IHppcF9mZDsKKwkJeHN0YXRlLmRzdF9mZCA9IGRzdF9mZDsKKwkJaWYgKGluZmxhdGVfdW56aXAoJnhzdGF0ZSkgPCAwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImluZmxhdGUgZXJyb3IiKTsKKwkJLyogVmFsaWRhdGUgZGVjb21wcmVzc2lvbiAtIGNyYyAqLworCQlpZiAoemlwX2hlYWRlci0+Zm9ybWF0dGVkLmNyYzMyICE9ICh4c3RhdGUuY3JjMzIgXiAweGZmZmZmZmZmTCkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjcmMgZXJyb3IiKTsKKwkJfQorCQkvKiBWYWxpZGF0ZSBkZWNvbXByZXNzaW9uIC0gc2l6ZSAqLworCQlpZiAoemlwX2hlYWRlci0+Zm9ybWF0dGVkLnVjbXBzaXplICE9IHhzdGF0ZS5ieXRlc19vdXQpIHsKKwkJCS8qIERvbid0IGRpZS4gV2hvIGtub3dzLCBtYXliZSBsZW4gY2FsY3VsYXRpb24KKwkJCSAqIHdhcyBib3RjaGVkIHNvbWV3aGVyZS4gQWZ0ZXIgYWxsLCBjcmMgbWF0Y2hlZCEgKi8KKwkJCWJiX2Vycm9yX21zZygiYmFkIGxlbmd0aCIpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBteV9mZ2V0czgwKGNoYXIgKmJ1ZjgwKQoreworCWZmbHVzaF9hbGwoKTsKKwlpZiAoIWZnZXRzKGJ1ZjgwLCA4MCwgc3RkaW4pKSB7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgcmVhZCBzdGFuZGFyZCBpbnB1dCIpOworCX0KK30KKworaW50IHVuemlwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB1bnppcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwllbnVtIHsgT19QUk9NUFQsIE9fTkVWRVIsIE9fQUxXQVlTIH07CisKKwl6aXBfaGVhZGVyX3QgemlwX2hlYWRlcjsKKwlzbWFsbGludCBxdWlldCA9IDA7CisJSUZfTk9UX0RFU0tUT1AoY29uc3QpIHNtYWxsaW50IHZlcmJvc2UgPSAwOworCXNtYWxsaW50IGxpc3RpbmcgPSAwOworCXNtYWxsaW50IG92ZXJ3cml0ZSA9IE9fUFJPTVBUOworCXNtYWxsaW50IHhfb3B0X3NlZW47CisjaWYgRU5BQkxFX0RFU0tUT1AKKwl1aW50MzJfdCBjZGZfb2Zmc2V0OworI2VuZGlmCisJdW5zaWduZWQgbG9uZyB0b3RhbF91c2l6ZTsKKwl1bnNpZ25lZCBsb25nIHRvdGFsX3NpemU7CisJdW5zaWduZWQgdG90YWxfZW50cmllczsKKwlpbnQgZHN0X2ZkID0gLTE7CisJY2hhciAqc3JjX2ZuID0gTlVMTDsKKwljaGFyICpkc3RfZm4gPSBOVUxMOworCWxsaXN0X3QgKnphY2NlcHQgPSBOVUxMOworCWxsaXN0X3QgKnpyZWplY3QgPSBOVUxMOworCWNoYXIgKmJhc2VfZGlyID0gTlVMTDsKKwlpbnQgaSwgb3B0OworCWNoYXIga2V5X2J1Zls4MF07IC8qIG11c3QgbWF0Y2ggc2l6ZSB1c2VkIGJ5IG15X2ZnZXRzODAgKi8KKwlzdHJ1Y3Qgc3RhdCBzdGF0X2J1ZjsKKworLyogLXEsIC1sIGFuZCAtdjogVW5aaXAgNS41MiBvZiAyOCBGZWJydWFyeSAyMDA1LCBieSBJbmZvLVpJUDoKKyAqCisgKiAjIC91c3IvYmluL3VuemlwIC1xcSAtdiBkZWNvbXByZXNzX3VubHptYS5pLnppcAorICogICAyMDQzNzIgIERlZmw6TiAgICAzNTI3OCAgODMlICAwOS0wNi0wOSAxNDoyMyAgMGQwNTYyNTIgIGRlY29tcHJlc3NfdW5sem1hLmkKKyAqICMgL3Vzci9iaW4vdW56aXAgLXEgLXYgZGVjb21wcmVzc191bmx6bWEuaS56aXAKKyAqICBMZW5ndGggICBNZXRob2QgICAgU2l6ZSAgUmF0aW8gICBEYXRlICAgVGltZSAgIENSQy0zMiAgICBOYW1lCisgKiAtLS0tLS0tLSAgLS0tLS0tICAtLS0tLS0tIC0tLS0tICAgLS0tLSAgIC0tLS0gICAtLS0tLS0gICAgLS0tLQorICogICAyMDQzNzIgIERlZmw6TiAgICAzNTI3OCAgODMlICAwOS0wNi0wOSAxNDoyMyAgMGQwNTYyNTIgIGRlY29tcHJlc3NfdW5sem1hLmkKKyAqIC0tLS0tLS0tICAgICAgICAgIC0tLS0tLS0gIC0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tCisgKiAgIDIwNDM3MiAgICAgICAgICAgIDM1Mjc4ICA4MyUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBmaWxlCisgKiAjIC91c3IvYmluL3VuemlwIC12IGRlY29tcHJlc3NfdW5sem1hLmkuemlwCisgKiBBcmNoaXZlOiAgZGVjb21wcmVzc191bmx6bWEuaS56aXAKKyAqICBMZW5ndGggICBNZXRob2QgICAgU2l6ZSAgUmF0aW8gICBEYXRlICAgVGltZSAgIENSQy0zMiAgICBOYW1lCisgKiAtLS0tLS0tLSAgLS0tLS0tICAtLS0tLS0tIC0tLS0tICAgLS0tLSAgIC0tLS0gICAtLS0tLS0gICAgLS0tLQorICogICAyMDQzNzIgIERlZmw6TiAgICAzNTI3OCAgODMlICAwOS0wNi0wOSAxNDoyMyAgMGQwNTYyNTIgIGRlY29tcHJlc3NfdW5sem1hLmkKKyAqIC0tLS0tLS0tICAgICAgICAgIC0tLS0tLS0gIC0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tCisgKiAgIDIwNDM3MiAgICAgICAgICAgIDM1Mjc4ICA4MyUgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSBmaWxlCisgKiAjIHVuemlwIC12IGRlY29tcHJlc3NfdW5sem1hLmkuemlwCisgKiBBcmNoaXZlOiAgZGVjb21wcmVzc191bmx6bWEuaS56aXAKKyAqICAgTGVuZ3RoICAgICBEYXRlICAgVGltZSAgICBOYW1lCisgKiAgLS0tLS0tLS0gICAgLS0tLSAgIC0tLS0gICAgLS0tLQorICogICAgMjA0MzcyICAwOS0wNi0wOSAxNDoyMyAgIGRlY29tcHJlc3NfdW5sem1hLmkKKyAqICAtLS0tLS0tLSAgICAgICAgICAgICAgICAgICAtLS0tLS0tCisgKiAgICAyMDQzNzIgICAgICAgICAgICAgICAgICAgMSBmaWxlcworICogIyAvdXNyL2Jpbi91bnppcCAtbCAtcXEgZGVjb21wcmVzc191bmx6bWEuaS56aXAKKyAqICAgIDIwNDM3MiAgMDktMDYtMDkgMTQ6MjMgICBkZWNvbXByZXNzX3VubHptYS5pCisgKiAjIC91c3IvYmluL3VuemlwIC1sIC1xIGRlY29tcHJlc3NfdW5sem1hLmkuemlwCisgKiAgIExlbmd0aCAgICAgRGF0ZSAgIFRpbWUgICAgTmFtZQorICogIC0tLS0tLS0tICAgIC0tLS0gICAtLS0tICAgIC0tLS0KKyAqICAgIDIwNDM3MiAgMDktMDYtMDkgMTQ6MjMgICBkZWNvbXByZXNzX3VubHptYS5pCisgKiAgLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgLS0tLS0tLQorICogICAgMjA0MzcyICAgICAgICAgICAgICAgICAgIDEgZmlsZQorICogIyAvdXNyL2Jpbi91bnppcCAtbCBkZWNvbXByZXNzX3VubHptYS5pLnppcAorICogQXJjaGl2ZTogIGRlY29tcHJlc3NfdW5sem1hLmkuemlwCisgKiAgIExlbmd0aCAgICAgRGF0ZSAgIFRpbWUgICAgTmFtZQorICogIC0tLS0tLS0tICAgIC0tLS0gICAtLS0tICAgIC0tLS0KKyAqICAgIDIwNDM3MiAgMDktMDYtMDkgMTQ6MjMgICBkZWNvbXByZXNzX3VubHptYS5pCisgKiAgLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgLS0tLS0tLQorICogICAgMjA0MzcyICAgICAgICAgICAgICAgICAgIDEgZmlsZQorICovCisKKwl4X29wdF9zZWVuID0gMDsKKwkvKiAnLScgbWFrZXMgZ2V0b3B0IHJldHVybiAxIGZvciBub24tb3B0aW9ucyAqLworCXdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICItZDpsbm9wcXh2IikpICE9IC0xKSB7CisJCXN3aXRjaCAob3B0KSB7CisJCWNhc2UgJ2QnOiAgLyogRXh0cmFjdCB0byBiYXNlIGRpcmVjdG9yeSAqLworCQkJYmFzZV9kaXIgPSBvcHRhcmc7CisJCQlicmVhazsKKworCQljYXNlICdsJzogLyogTGlzdCAqLworCQkJbGlzdGluZyA9IDE7CisJCQlicmVhazsKKworCQljYXNlICduJzogLyogTmV2ZXIgb3ZlcndyaXRlIGV4aXN0aW5nIGZpbGVzICovCisJCQlvdmVyd3JpdGUgPSBPX05FVkVSOworCQkJYnJlYWs7CisKKwkJY2FzZSAnbyc6IC8qIEFsd2F5cyBvdmVyd3JpdGUgZXhpc3RpbmcgZmlsZXMgKi8KKwkJCW92ZXJ3cml0ZSA9IE9fQUxXQVlTOworCQkJYnJlYWs7CisKKwkJY2FzZSAncCc6IC8qIEV4dHJhY3QgZmlsZXMgdG8gc3Rkb3V0IGFuZCBmYWxsIHRocm91Z2ggdG8gc2V0IHZlcmJvc2l0eSAqLworCQkJZHN0X2ZkID0gU1RET1VUX0ZJTEVOTzsKKworCQljYXNlICdxJzogLyogQmUgcXVpZXQgKi8KKwkJCXF1aWV0Kys7CisJCQlicmVhazsKKworCQljYXNlICd2JzogLyogVmVyYm9zZSBsaXN0ICovCisJCQlJRl9ERVNLVE9QKHZlcmJvc2UrKzspCisJCQlsaXN0aW5nID0gMTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ3gnOgorCQkJeF9vcHRfc2VlbiA9IDE7CisJCQlicmVhazsKKworCQljYXNlIDE6CisJCQlpZiAoIXNyY19mbikgeworCQkJCS8qIFRoZSB6aXAgZmlsZSAqLworCQkJCS8qICs1OiBzcGFjZSBmb3IgIi56aXAiIGFuZCBOVUwgKi8KKwkJCQlzcmNfZm4gPSB4bWFsbG9jKHN0cmxlbihvcHRhcmcpICsgNSk7CisJCQkJc3RyY3B5KHNyY19mbiwgb3B0YXJnKTsKKwkJCX0gZWxzZSBpZiAoIXhfb3B0X3NlZW4pIHsKKwkJCQkvKiBJbmNsdWRlIGZpbGVzICovCisJCQkJbGxpc3RfYWRkX3RvKCZ6YWNjZXB0LCBvcHRhcmcpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBFeGNsdWRlIGZpbGVzICovCisJCQkJbGxpc3RfYWRkX3RvKCZ6cmVqZWN0LCBvcHRhcmcpOworCQkJfQorCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJfQorCX0KKworI2lmbmRlZiBfX0dMSUJDX18KKwkvKgorCSAqIFRoaXMgY29kZSBpcyBuZWVkZWQgZm9yIG5vbi1HTlUgZ2V0b3B0CisJICogd2hpY2ggZG9lc24ndCB1bmRlcnN0YW5kICItIiBpbiBvcHRpb24gc3RyaW5nLgorCSAqIFRoZSAteCBvcHRpb24gd29uJ3Qgd29yayBwcm9wZXJseSBpbiB0aGlzIGNhc2U6CisJICogInVuemlwIGEuemlwIHEgLXggdyBlIiB3aWxsIGJlIGludGVycHJldGVkIGFzCisJICogInVuemlwIGEuemlwIHEgdyBlIC14IiA9ICJ1bnppcCBhLnppcCBxIHcgZSIKKwkgKi8KKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoYXJndlswXSkgeworCQkvKiArNTogc3BhY2UgZm9yICIuemlwIiBhbmQgTlVMICovCisJCXNyY19mbiA9IHhtYWxsb2Moc3RybGVuKGFyZ3ZbMF0pICsgNSk7CisJCXN0cmNweShzcmNfZm4sIGFyZ3ZbMF0pOworCQl3aGlsZSAoKisrYXJndikKKwkJCWxsaXN0X2FkZF90bygmemFjY2VwdCwgKmFyZ3YpOworCX0KKyNlbmRpZgorCisJaWYgKCFzcmNfZm4pIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCS8qIE9wZW4gaW5wdXQgZmlsZSAqLworCWlmIChMT05FX0RBU0goc3JjX2ZuKSkgeworCQl4ZHVwMihTVERJTl9GSUxFTk8sIHppcF9mZCk7CisJCS8qIENhbm5vdCB1c2UgcHJvbXB0IG1vZGUgc2luY2UgemlwIGRhdGEgaXMgYXJyaXZpbmcgb24gU1RESU4gKi8KKwkJaWYgKG92ZXJ3cml0ZSA9PSBPX1BST01QVCkKKwkJCW92ZXJ3cml0ZSA9IE9fTkVWRVI7CisJfSBlbHNlIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgZXh0bltdWzVdID0geyAiLnppcCIsICIuWklQIiB9OworCQljaGFyICpleHQgPSBzcmNfZm4gKyBzdHJsZW4oc3JjX2ZuKTsKKwkJaW50IHNyY19mZDsKKworCQlpID0gMDsKKwkJZm9yICg7OykgeworCQkJc3JjX2ZkID0gb3BlbihzcmNfZm4sIE9fUkRPTkxZKTsKKwkJCWlmIChzcmNfZmQgPj0gMCkKKwkJCQlicmVhazsKKwkJCWlmICgrK2kgPiAyKSB7CisJCQkJKmV4dCA9ICdcMCc7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IG9wZW4gJXNbLnppcF0iLCBzcmNfZm4pOworCQkJfQorCQkJc3RyY3B5KGV4dCwgZXh0bltpIC0gMV0pOworCQl9CisJCXhtb3ZlX2ZkKHNyY19mZCwgemlwX2ZkKTsKKwl9CisKKwkvKiBDaGFuZ2UgZGlyIGlmIG5lY2Vzc2FyeSAqLworCWlmIChiYXNlX2RpcikKKwkJeGNoZGlyKGJhc2VfZGlyKTsKKworCWlmIChxdWlldCA8PSAxKSB7IC8qIG5vdCAtcXEgKi8KKwkJaWYgKHF1aWV0ID09IDApCisJCQlwcmludGYoIkFyY2hpdmU6ICAlc1xuIiwgc3JjX2ZuKTsKKwkJaWYgKGxpc3RpbmcpIHsKKwkJCXB1dHModmVyYm9zZSA/CisJCQkJIiBMZW5ndGggICBNZXRob2QgICAgU2l6ZSAgUmF0aW8gICBEYXRlICAgVGltZSAgIENSQy0zMiAgICBOYW1lXG4iCisJCQkJIi0tLS0tLS0tICAtLS0tLS0gIC0tLS0tLS0gLS0tLS0gICAtLS0tICAgLS0tLSAgIC0tLS0tLSAgICAtLS0tIgorCQkJCToKKwkJCQkiICBMZW5ndGggICAgIERhdGUgICBUaW1lICAgIE5hbWVcbiIKKwkJCQkiIC0tLS0tLS0tICAgIC0tLS0gICAtLS0tICAgIC0tLS0iCisJCQkJKTsKKwkJfQorCX0KKworLyogRXhhbXBsZSBvZiBhbiBhcmNoaXZlIHdpdGggb25lIDAtYnl0ZSBsb25nIGZpbGUgbmFtZWQgJ3onCisgKiBjcmVhdGVkIGJ5IFppcCAyLjMxIG9uIFVuaXg6CisgKiAwMDAwIFs1MCA0Yl0wMyAwNCAwYSAwMCAwMCAwMCAwMCAwMCA0MiAxYSBiOCAzYyAwMCAwMCB8UEsuLi4uLi4uLkIuLjwuLnwKKyAqICAgICAgIHNpZy4uLi4uLi4uIHZuZWVkIGZsYWdzIGNvbXByIG10aW1lIG1kYXRlIGNyYzMyPgorICogMDAxMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDEgMDAgMTUgMDAgN2EgNTUgfC4uLi4uLi4uLi4uLi4uelV8CisgKiAgICAgID4uLi4uLiBjc2l6ZS4uLi4uLiB1c2l6ZS4uLi4uLiBmbmxlbiBleGxlbiBmbiBleD4KKyAqIDAwMjAgIDU0IDA5IDAwIDAzIGNjIGQzIGY5IDRiIGNjIGQzIGY5IDRiIDU1IDc4IDA0IDAwIHxULi4uLi4uSy4uLktVeC4ufAorICogICAgICA+dHJhX2ZpZWxkLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4KKyAqIDAwMzAgIDAwIDAwIDAwIDAwWzUwIDRiXTAxIDAyIDE3IDAzIDBhIDAwIDAwIDAwIDAwIDAwIHwuLi4uUEsuLi4uLi4uLi4ufAorICogICAgICAgLi4uLi4uLi4uLi4gc2lnLi4uLi4uLi4gdm1hZGUgdm5lZWQgZmxhZ3MgY29tcHIKKyAqIDAwNDAgIDQyIDFhIGI4IDNjIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIHxCLi48Li4uLi4uLi4uLi4ufAorICogICAgICAgbXRpbWUgbWRhdGUgY3JjMzIuLi4uLi4gY3NpemUuLi4uLi4gdXNpemUuLi4uLi4KKyAqIDAwNTAgIDAxIDAwIDBkIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIGE0IDgxIDAwIDAwIHwuLi4uLi4uLi4uLi4uLi4ufAorICogICAgICAgZm5sZW4gZXhsZW4gY2xlbi4gZG51bS4gaWF0dHIgZWF0dHIuLi4uLi4gcmVsb2ZzPiAoZWF0dHIgPSBydy1yLS1yLS0pCisgKiAwMDYwICAwMCAwMCA3YSA1NSA1NCAwNSAwMCAwMyBjYyBkMyBmOSA0YiA1NSA3OCAwMCAwMCB8Li56VVQuLi4uLi5LVXguLnwKKyAqICAgICAgPi4uLi4uIGZuIGV4dHJhX2ZpZWxkLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uCisgKiAwMDcwIFs1MCA0Yl0wNSAwNiAwMCAwMCAwMCAwMCAwMSAwMCAwMSAwMCAzYyAwMCAwMCAwMCB8UEsuLi4uLi4uLi4uPC4uLnwKKyAqIDAwODAgIDM0IDAwIDAwIDAwIDAwIDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHw0Li4uLi58CisgKi8KKwl0b3RhbF91c2l6ZSA9IDA7CisJdG90YWxfc2l6ZSA9IDA7CisJdG90YWxfZW50cmllcyA9IDA7CisjaWYgRU5BQkxFX0RFU0tUT1AKKwljZGZfb2Zmc2V0ID0gMDsKKyNlbmRpZgorCXdoaWxlICgxKSB7CisJCXVpbnQzMl90IG1hZ2ljOworCQltb2RlX3QgZGlyX21vZGUgPSAwNzc3OworI2lmIEVOQUJMRV9ERVNLVE9QCisJCW1vZGVfdCBmaWxlX21vZGUgPSAwNjY2OworI2VuZGlmCisKKwkJLyogQ2hlY2sgbWFnaWMgbnVtYmVyICovCisJCXhyZWFkKHppcF9mZCwgJm1hZ2ljLCA0KTsKKwkJLyogQ2VudHJhbCBkaXJlY3Rvcnk/IEl0J3MgYXQgdGhlIGVuZCwgc28gZXhpdCAqLworCQlpZiAobWFnaWMgPT0gWklQX0NERl9NQUdJQykKKwkJCWJyZWFrOworI2lmIEVOQUJMRV9ERVNLVE9QCisJCS8qIERhdGEgZGVzY3JpcHRvcj8gSXQgd2FzIGEgc3RyZWFtaW5nIGZpbGUsIGdvIG9uICovCisJCWlmIChtYWdpYyA9PSBaSVBfRERfTUFHSUMpIHsKKwkJCS8qIHNraXAgb3ZlciBkdXBsaWNhdGUgY3JjMzIsIGNtcHNpemUgYW5kIHVjbXBzaXplICovCisJCQl1bnppcF9za2lwKDMgKiA0KTsKKwkJCWNvbnRpbnVlOworCQl9CisjZW5kaWYKKwkJaWYgKG1hZ2ljICE9IFpJUF9GSUxFSEVBREVSX01BR0lDKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgemlwIG1hZ2ljICUwOFgiLCAoaW50KW1hZ2ljKTsKKworCQkvKiBSZWFkIHRoZSBmaWxlIGhlYWRlciAqLworCQl4cmVhZCh6aXBfZmQsIHppcF9oZWFkZXIucmF3LCBaSVBfSEVBREVSX0xFTik7CisJCUZJWF9FTkRJQU5ORVNTX1pJUCh6aXBfaGVhZGVyKTsKKwkJaWYgKCh6aXBfaGVhZGVyLmZvcm1hdHRlZC5tZXRob2QgIT0gMCkgJiYgKHppcF9oZWFkZXIuZm9ybWF0dGVkLm1ldGhvZCAhPSA4KSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVuc3VwcG9ydGVkIG1ldGhvZCAlZCIsIHppcF9oZWFkZXIuZm9ybWF0dGVkLm1ldGhvZCk7CisJCX0KKyNpZiAhRU5BQkxFX0RFU0tUT1AKKwkJaWYgKHppcF9oZWFkZXIuZm9ybWF0dGVkLnppcF9mbGFncyAmIFNXQVBfTEUxNigweDAwMDkpKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiemlwIGZsYWdzIDEgYW5kIDggYXJlIG5vdCBzdXBwb3J0ZWQiKTsKKwkJfQorI2Vsc2UKKwkJaWYgKHppcF9oZWFkZXIuZm9ybWF0dGVkLnppcF9mbGFncyAmIFNXQVBfTEUxNigweDAwMDEpKSB7CisJCQkvKiAweDAwMDEgLSBlbmNyeXB0ZWQgKi8KKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ6aXAgZmxhZyAxIChlbmNyeXB0aW9uKSBpcyBub3Qgc3VwcG9ydGVkIik7CisJCX0KKworCQlpZiAoY2RmX29mZnNldCAhPSBCQURfQ0RGX09GRlNFVCkgeworCQkJY2RmX2hlYWRlcl90IGNkZl9oZWFkZXI7CisJCQljZGZfb2Zmc2V0ID0gcmVhZF9uZXh0X2NkZihjZGZfb2Zmc2V0LCAmY2RmX2hlYWRlcik7CisJCQkvKgorCQkJICogTm90ZTogY2RmX29mZnNldCBjYW4gYmVjb21lIEJBRF9DREZfT0ZGU0VUIGFmdGVyIHRoZSBhYm92ZSBjYWxsLgorCQkJICovCisJCQlpZiAoemlwX2hlYWRlci5mb3JtYXR0ZWQuemlwX2ZsYWdzICYgU1dBUF9MRTE2KDB4MDAwOCkpIHsKKwkJCQkvKiAweDAwMDggLSBzdHJlYW1pbmcuIFt1XWNtcHNpemUgY2FuIGJlIHJlbGlhYmx5IGdvdHRlbgorCQkJCSAqIG9ubHkgZnJvbSBDZW50cmFsIERpcmVjdG9yeS4gU2VlIHVuemlwX2RvYy50eHQKKwkJCQkgKi8KKwkJCQl6aXBfaGVhZGVyLmZvcm1hdHRlZC5jcmMzMiAgICA9IGNkZl9oZWFkZXIuZm9ybWF0dGVkLmNyYzMyOworCQkJCXppcF9oZWFkZXIuZm9ybWF0dGVkLmNtcHNpemUgID0gY2RmX2hlYWRlci5mb3JtYXR0ZWQuY21wc2l6ZTsKKwkJCQl6aXBfaGVhZGVyLmZvcm1hdHRlZC51Y21wc2l6ZSA9IGNkZl9oZWFkZXIuZm9ybWF0dGVkLnVjbXBzaXplOworCQkJfQorCQkJaWYgKChjZGZfaGVhZGVyLmZvcm1hdHRlZC52ZXJzaW9uX21hZGVfYnkgPj4gOCkgPT0gMykgeworCQkJCS8qIFRoaXMgYXJjaGl2ZSBpcyBjcmVhdGVkIG9uIFVuaXggKi8KKwkJCQlkaXJfbW9kZSA9IGZpbGVfbW9kZSA9IChjZGZfaGVhZGVyLmZvcm1hdHRlZC5leHRlcm5hbF9maWxlX2F0dHJpYnV0ZXMgPj4gMTYpOworCQkJfQorCQl9CisJCWlmIChjZGZfb2Zmc2V0ID09IEJBRF9DREZfT0ZGU0VUCisJCSAmJiAoemlwX2hlYWRlci5mb3JtYXR0ZWQuemlwX2ZsYWdzICYgU1dBUF9MRTE2KDB4MDAwOCkpCisJCSkgeworCQkJLyogSWYgaXQncyBhIHN0cmVhbWluZyB6aXAsIHdlIF9yZXF1aXJlXyBDREYgKi8KKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBmaW5kIGZpbGUgdGFibGUiKTsKKwkJfQorI2VuZGlmCisKKwkJLyogUmVhZCBmaWxlbmFtZSAqLworCQlmcmVlKGRzdF9mbik7CisJCWRzdF9mbiA9IHh6YWxsb2MoemlwX2hlYWRlci5mb3JtYXR0ZWQuZmlsZW5hbWVfbGVuICsgMSk7CisJCXhyZWFkKHppcF9mZCwgZHN0X2ZuLCB6aXBfaGVhZGVyLmZvcm1hdHRlZC5maWxlbmFtZV9sZW4pOworCisJCS8qIFNraXAgZXh0cmEgaGVhZGVyIGJ5dGVzICovCisJCXVuemlwX3NraXAoemlwX2hlYWRlci5mb3JtYXR0ZWQuZXh0cmFfbGVuKTsKKworCQkvKiBHdWFyZCBhZ2FpbnN0ICIvYWJzcGF0aCIsICIvLi4vIiBhbmQgc2ltaWxhciBhdHRhY2tzICovCisJCW92ZXJsYXBwaW5nX3N0cmNweShkc3RfZm4sIHN0cmlwX3Vuc2FmZV9wcmVmaXgoZHN0X2ZuKSk7CisKKwkJLyogRmlsdGVyIHppcCBlbnRyaWVzICovCisJCWlmIChmaW5kX2xpc3RfZW50cnkoenJlamVjdCwgZHN0X2ZuKQorCQkgfHwgKHphY2NlcHQgJiYgIWZpbmRfbGlzdF9lbnRyeSh6YWNjZXB0LCBkc3RfZm4pKQorCQkpIHsgLyogU2tpcCBlbnRyeSAqLworCQkJaSA9ICduJzsKKwkJfSBlbHNlIHsKKwkJCWlmIChsaXN0aW5nKSB7CisJCQkJLyogTGlzdCBlbnRyeSAqLworCQkJCXVuc2lnbmVkIGRvc3RpbWUgPSB6aXBfaGVhZGVyLmZvcm1hdHRlZC5tb2R0aW1lIHwgKHppcF9oZWFkZXIuZm9ybWF0dGVkLm1vZGRhdGUgPDwgMTYpOworCQkJCWlmICghdmVyYm9zZSkgeworCQkJCQkvLyAgICAgICIgIExlbmd0aCAgICAgRGF0ZSAgIFRpbWUgICAgTmFtZVxuIgorCQkJCQkvLyAgICAgICIgLS0tLS0tLS0gICAgLS0tLSAgIC0tLS0gICAgLS0tLSIKKwkJCQkJcHJpbnRmKCAgICAgICAiJTl1ICAlMDJ1LSUwMnUtJTAydSAlMDJ1OiUwMnUgICAlc1xuIiwKKwkJCQkJCSh1bnNpZ25lZCl6aXBfaGVhZGVyLmZvcm1hdHRlZC51Y21wc2l6ZSwKKwkJCQkJCShkb3N0aW1lICYgMHgwMWUwMDAwMCkgPj4gMjEsCisJCQkJCQkoZG9zdGltZSAmIDB4MDAxZjAwMDApID4+IDE2LAorCQkJCQkJKCgoZG9zdGltZSAmIDB4ZmUwMDAwMDApID4+IDI1KSArIDE5ODApICUgMTAwLAorCQkJCQkJKGRvc3RpbWUgJiAweDAwMDBmODAwKSA+PiAxMSwKKwkJCQkJCShkb3N0aW1lICYgMHgwMDAwMDdlMCkgPj4gNSwKKwkJCQkJCWRzdF9mbik7CisJCQkJCXRvdGFsX3VzaXplICs9IHppcF9oZWFkZXIuZm9ybWF0dGVkLnVjbXBzaXplOworCQkJCX0gZWxzZSB7CisJCQkJCXVuc2lnbmVkIGxvbmcgcGVyY2VudHMgPSB6aXBfaGVhZGVyLmZvcm1hdHRlZC51Y21wc2l6ZSAtIHppcF9oZWFkZXIuZm9ybWF0dGVkLmNtcHNpemU7CisJCQkJCXBlcmNlbnRzID0gcGVyY2VudHMgKiAxMDA7CisJCQkJCWlmICh6aXBfaGVhZGVyLmZvcm1hdHRlZC51Y21wc2l6ZSkKKwkJCQkJCXBlcmNlbnRzIC89IHppcF9oZWFkZXIuZm9ybWF0dGVkLnVjbXBzaXplOworCQkJCQkvLyAgICAgICIgTGVuZ3RoICAgTWV0aG9kICAgIFNpemUgIFJhdGlvICAgRGF0ZSAgIFRpbWUgICBDUkMtMzIgICAgTmFtZVxuIgorCQkJCQkvLyAgICAgICItLS0tLS0tLSAgLS0tLS0tICAtLS0tLS0tIC0tLS0tICAgLS0tLSAgIC0tLS0gICAtLS0tLS0gICAgLS0tLSIKKwkJCQkJcHJpbnRmKCAgICAgICIlOHUgIERlZmw6TiIgICAgIiU5dSU0dSUlICAlMDJ1LSUwMnUtJTAydSAlMDJ1OiUwMnUgICUwOHggICVzXG4iLAorCQkJCQkJKHVuc2lnbmVkKXppcF9oZWFkZXIuZm9ybWF0dGVkLnVjbXBzaXplLAorCQkJCQkJKHVuc2lnbmVkKXppcF9oZWFkZXIuZm9ybWF0dGVkLmNtcHNpemUsCisJCQkJCQkodW5zaWduZWQpcGVyY2VudHMsCisJCQkJCQkoZG9zdGltZSAmIDB4MDFlMDAwMDApID4+IDIxLAorCQkJCQkJKGRvc3RpbWUgJiAweDAwMWYwMDAwKSA+PiAxNiwKKwkJCQkJCSgoKGRvc3RpbWUgJiAweGZlMDAwMDAwKSA+PiAyNSkgKyAxOTgwKSAlIDEwMCwKKwkJCQkJCShkb3N0aW1lICYgMHgwMDAwZjgwMCkgPj4gMTEsCisJCQkJCQkoZG9zdGltZSAmIDB4MDAwMDA3ZTApID4+IDUsCisJCQkJCQl6aXBfaGVhZGVyLmZvcm1hdHRlZC5jcmMzMiwKKwkJCQkJCWRzdF9mbik7CisJCQkJCXRvdGFsX3VzaXplICs9IHppcF9oZWFkZXIuZm9ybWF0dGVkLnVjbXBzaXplOworCQkJCQl0b3RhbF9zaXplICs9IHppcF9oZWFkZXIuZm9ybWF0dGVkLmNtcHNpemU7CisJCQkJfQorCQkJCWkgPSAnbic7CisJCQl9IGVsc2UgaWYgKGRzdF9mZCA9PSBTVERPVVRfRklMRU5PKSB7CisJCQkJLyogRXh0cmFjdGluZyB0byBTVERPVVQgKi8KKwkJCQlpID0gLTE7CisJCQl9IGVsc2UgaWYgKGxhc3RfY2hhcl9pcyhkc3RfZm4sICcvJykpIHsKKwkJCQkvKiBFeHRyYWN0IGRpcmVjdG9yeSAqLworCQkJCWlmIChzdGF0KGRzdF9mbiwgJnN0YXRfYnVmKSA9PSAtMSkgeworCQkJCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisJCQkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHN0YXQgJyVzJyIsIGRzdF9mbik7CisJCQkJCX0KKwkJCQkJaWYgKCFxdWlldCkgeworCQkJCQkJcHJpbnRmKCIgICBjcmVhdGluZzogJXNcbiIsIGRzdF9mbik7CisJCQkJCX0KKwkJCQkJdW56aXBfY3JlYXRlX2xlYWRpbmdfZGlycyhkc3RfZm4pOworCQkJCQlpZiAoYmJfbWFrZV9kaXJlY3RvcnkoZHN0X2ZuLCBkaXJfbW9kZSwgRklMRVVUSUxTX0lHTk9SRV9DSE1PRF9FUlIpKSB7CisJCQkJCQl4ZnVuY19kaWUoKTsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWlmICghU19JU0RJUihzdGF0X2J1Zi5zdF9tb2RlKSkgeworCQkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiclcycgZXhpc3RzIGJ1dCBpcyBub3QgYSAlcyIsCisJCQkJCQkJZHN0X2ZuLCAiZGlyZWN0b3J5Iik7CisJCQkJCX0KKwkJCQl9CisJCQkJaSA9ICduJzsKKwkJCX0gZWxzZSB7CisJCQkJLyogRXh0cmFjdCBmaWxlICovCisgY2hlY2tfZmlsZToKKwkJCQlpZiAoc3RhdChkc3RfZm4sICZzdGF0X2J1ZikgPT0gLTEpIHsKKwkJCQkJLyogRmlsZSBkb2VzIG5vdCBleGlzdCAqLworCQkJCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisJCQkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHN0YXQgJyVzJyIsIGRzdF9mbik7CisJCQkJCX0KKwkJCQkJaSA9ICd5JzsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBGaWxlIGFscmVhZHkgZXhpc3RzICovCisJCQkJCWlmIChvdmVyd3JpdGUgPT0gT19ORVZFUikgeworCQkJCQkJaSA9ICduJzsKKwkJCQkJfSBlbHNlIGlmIChTX0lTUkVHKHN0YXRfYnVmLnN0X21vZGUpKSB7CisJCQkJCQkvKiBGaWxlIGlzIHJlZ3VsYXIgZmlsZSAqLworCQkJCQkJaWYgKG92ZXJ3cml0ZSA9PSBPX0FMV0FZUykgeworCQkJCQkJCWkgPSAneSc7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCXByaW50ZigicmVwbGFjZSAlcz8gW3ldZXMsIFtuXW8sIFtBXWxsLCBbTl1vbmUsIFtyXWVuYW1lOiAiLCBkc3RfZm4pOworCQkJCQkJCW15X2ZnZXRzODAoa2V5X2J1Zik7CisJCQkJCQkJaSA9IGtleV9idWZbMF07CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQkvKiBGaWxlIGlzIG5vdCByZWd1bGFyIGZpbGUgKi8KKwkJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCInJXMnIGV4aXN0cyBidXQgaXMgbm90IGEgJXMiLAorCQkJCQkJCWRzdF9mbiwgInJlZ3VsYXIgZmlsZSIpOworCQkJCQl9CisJCQkJfQorCQkJfQorCQl9CisKKwkJc3dpdGNoIChpKSB7CisJCWNhc2UgJ0EnOgorCQkJb3ZlcndyaXRlID0gT19BTFdBWVM7CisJCWNhc2UgJ3knOiAvKiBPcGVuIGZpbGUgYW5kIGZhbGwgaW50byB1bnppcCAqLworCQkJdW56aXBfY3JlYXRlX2xlYWRpbmdfZGlycyhkc3RfZm4pOworI2lmIEVOQUJMRV9ERVNLVE9QCisJCQlkc3RfZmQgPSB4b3BlbjMoZHN0X2ZuLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DLCBmaWxlX21vZGUpOworI2Vsc2UKKwkJCWRzdF9mZCA9IHhvcGVuKGRzdF9mbiwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyk7CisjZW5kaWYKKwkJY2FzZSAtMTogLyogVW56aXAgKi8KKwkJCWlmICghcXVpZXQpIHsKKwkJCQlwcmludGYoIiAgaW5mbGF0aW5nOiAlc1xuIiwgZHN0X2ZuKTsKKwkJCX0KKwkJCXVuemlwX2V4dHJhY3QoJnppcF9oZWFkZXIsIGRzdF9mZCk7CisJCQlpZiAoZHN0X2ZkICE9IFNURE9VVF9GSUxFTk8pIHsKKwkJCQkvKiBjbG9zaW5nIFNURE9VVCBpcyBwb3RlbnRpYWxseSBiYWQgZm9yIGZ1dHVyZSBidXNpbmVzcyAqLworCQkJCWNsb3NlKGRzdF9mZCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlICdOJzoKKwkJCW92ZXJ3cml0ZSA9IE9fTkVWRVI7CisJCWNhc2UgJ24nOgorCQkJLyogU2tpcCBlbnRyeSBkYXRhICovCisJCQl1bnppcF9za2lwKHppcF9oZWFkZXIuZm9ybWF0dGVkLmNtcHNpemUpOworCQkJYnJlYWs7CisKKwkJY2FzZSAncic6CisJCQkvKiBQcm9tcHQgZm9yIG5ldyBuYW1lICovCisJCQlwcmludGYoIm5ldyBuYW1lOiAiKTsKKwkJCW15X2ZnZXRzODAoa2V5X2J1Zik7CisJCQlmcmVlKGRzdF9mbik7CisJCQlkc3RfZm4gPSB4c3RyZHVwKGtleV9idWYpOworCQkJY2hvbXAoZHN0X2ZuKTsKKwkJCWdvdG8gY2hlY2tfZmlsZTsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCJlcnJvcjogaW52YWxpZCByZXNwb25zZSBbJWNdXG4iLCAoY2hhcilpKTsKKwkJCWdvdG8gY2hlY2tfZmlsZTsKKwkJfQorCisJCXRvdGFsX2VudHJpZXMrKzsKKwl9CisKKwlpZiAobGlzdGluZyAmJiBxdWlldCA8PSAxKSB7CisJCWlmICghdmVyYm9zZSkgeworCQkJLy8gICAgICAiICBMZW5ndGggICAgIERhdGUgICBUaW1lICAgIE5hbWVcbiIKKwkJCS8vICAgICAgIiAtLS0tLS0tLSAgICAtLS0tICAgLS0tLSAgICAtLS0tIgorCQkJcHJpbnRmKCAiIC0tLS0tLS0tICAgICAgICAgICAgICAgICAgIC0tLS0tLS1cbiIKKwkJCQkiJTlsdSIgICAiICAgICAgICAgICAgICAgICAgICV1IGZpbGVzXG4iLAorCQkJCXRvdGFsX3VzaXplLCB0b3RhbF9lbnRyaWVzKTsKKwkJfSBlbHNlIHsKKwkJCXVuc2lnbmVkIGxvbmcgcGVyY2VudHMgPSB0b3RhbF91c2l6ZSAtIHRvdGFsX3NpemU7CisJCQlwZXJjZW50cyA9IHBlcmNlbnRzICogMTAwOworCQkJaWYgKHRvdGFsX3VzaXplKQorCQkJCXBlcmNlbnRzIC89IHRvdGFsX3VzaXplOworCQkJLy8gICAgICAiIExlbmd0aCAgIE1ldGhvZCAgICBTaXplICBSYXRpbyAgIERhdGUgICBUaW1lICAgQ1JDLTMyICAgIE5hbWVcbiIKKwkJCS8vICAgICAgIi0tLS0tLS0tICAtLS0tLS0gIC0tLS0tLS0gLS0tLS0gICAtLS0tICAgLS0tLSAgIC0tLS0tLSAgICAtLS0tIgorCQkJcHJpbnRmKCAiLS0tLS0tLS0gICAgICAgICAgLS0tLS0tLSAgLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS1cbiIKKwkJCQkiJThsdSIgICAgICAgICAgICAgICIlMTdsdSU0dSUlICAgICAgICAgICAgICAgICAgICAgICAgICAgICV1IGZpbGVzXG4iLAorCQkJCXRvdGFsX3VzaXplLCB0b3RhbF9zaXplLCAodW5zaWduZWQpcGVyY2VudHMsCisJCQkJdG90YWxfZW50cmllcyk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvbmZpZ3MvVEVTVF9ub21tdV9kZWZjb25maWcgYi9jb25maWdzL1RFU1Rfbm9tbXVfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOWI5NTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWdzL1RFU1Rfbm9tbXVfZGVmY29uZmlnCkBAIC0wLDAgKzEsOTI1IEBACisjCisjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0CisjIEJ1c3lib3ggdmVyc2lvbjogMS4xNi4wCisjIFdlZCBKYW4gMjcgMjE6MDE6MjYgMjAxMAorIworQ09ORklHX0hBVkVfRE9UX0NPTkZJRz15CisKKyMKKyMgQnVzeWJveCBTZXR0aW5ncworIworCisjCisjIEdlbmVyYWwgQ29uZmlndXJhdGlvbgorIworQ09ORklHX0RFU0tUT1A9eQorQ09ORklHX0VYVFJBX0NPTVBBVD15CitDT05GSUdfSU5DTFVERV9TVVN2Mj15CisjIENPTkZJR19VU0VfUE9SVEFCTEVfQ09ERSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9CVUZGRVJTX1VTRV9NQUxMT0M9eQorIyBDT05GSUdfRkVBVFVSRV9CVUZGRVJTX0dPX09OX1NUQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlVGRkVSU19HT19JTl9CU1MgaXMgbm90IHNldAorQ09ORklHX1NIT1dfVVNBR0U9eQorQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9VU0FHRT15CitDT05GSUdfRkVBVFVSRV9DT01QUkVTU19VU0FHRT15CitDT05GSUdfRkVBVFVSRV9JTlNUQUxMRVI9eQorIyBDT05GSUdfTE9DQUxFX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfVU5JQ09ERV9JTl9FTlYgaXMgbm90IHNldAorQ09ORklHX0xPTkdfT1BUUz15CitDT05GSUdfRkVBVFVSRV9ERVZQVFM9eQorIyBDT05GSUdfRkVBVFVSRV9DTEVBTl9VUCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9QSURGSUxFPXkKK0NPTkZJR19GRUFUVVJFX1NVSUQ9eQorQ09ORklHX0ZFQVRVUkVfU1VJRF9DT05GSUc9eQorQ09ORklHX0ZFQVRVUkVfU1VJRF9DT05GSUdfUVVJRVQ9eQorQ09ORklHX1NFTElOVVg9eQorQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFM9eQorQ09ORklHX0JVU1lCT1hfRVhFQ19QQVRIPSIvcHJvYy9zZWxmL2V4ZSIKK0NPTkZJR19GRUFUVVJFX1NZU0xPRz15CitDT05GSUdfRkVBVFVSRV9IQVZFX1JQQz15CisKKyMKKyMgQnVpbGQgT3B0aW9ucworIworIyBDT05GSUdfU1RBVElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJRSBpcyBub3Qgc2V0CitDT05GSUdfTk9NTVU9eQorIyBDT05GSUdfQlVJTERfTElCQlVTWUJPWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORElWSURVQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSEFSRURfQlVTWUJPWCBpcyBub3Qgc2V0CitDT05GSUdfTEZTPXkKK0NPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVg9IiIKK0NPTkZJR19FWFRSQV9DRkxBR1M9IiIKKworIworIyBEZWJ1Z2dpbmcgT3B0aW9ucworIworIyBDT05GSUdfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUEVTU0lNSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dFUlJPUiBpcyBub3Qgc2V0CitDT05GSUdfTk9fREVCVUdfTElCPXkKKyMgQ09ORklHX0RNQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfRUZFTkNFIGlzIG5vdCBzZXQKKworIworIyBJbnN0YWxsYXRpb24gT3B0aW9ucworIworIyBDT05GSUdfSU5TVEFMTF9OT19VU1IgaXMgbm90IHNldAorQ09ORklHX0lOU1RBTExfQVBQTEVUX1NZTUxJTktTPXkKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX0hBUkRMSU5LUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9TQ1JJUFRfV1JBUFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfRE9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9TWU1MSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX0hBUkRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NDUklQVF9XUkFQUEVSIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVGSVg9Ii4vX2luc3RhbGwiCisKKyMKKyMgQnVzeWJveCBMaWJyYXJ5IFR1bmluZworIworQ09ORklHX1BBU1NXT1JEX01JTkxFTj02CitDT05GSUdfTUQ1X1NNQUxMPTEKK0NPTkZJR19GRUFUVVJFX0ZBU1RfVE9QPXkKK0NPTkZJR19GRUFUVVJFX0VUQ19ORVRXT1JLUz15CitDT05GSUdfRkVBVFVSRV9FRElUSU5HPXkKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfTUFYX0xFTj0xMDI0CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX1ZJPXkKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfSElTVE9SWT0xNQorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX1NBVkVISVNUT1JZIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1RBQl9DT01QTEVUSU9OPXkKK0NPTkZJR19GRUFUVVJFX1VTRVJOQU1FX0NPTVBMRVRJT049eQorQ09ORklHX0ZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQ9eQorQ09ORklHX0ZFQVRVUkVfRURJVElOR19BU0tfVEVSTUlOQUw9eQorQ09ORklHX0ZFQVRVUkVfTk9OX1BPU0lYX0NQPXkKK0NPTkZJR19GRUFUVVJFX1ZFUkJPU0VfQ1BfTUVTU0FHRT15CitDT05GSUdfRkVBVFVSRV9DT1BZQlVGX0tCPTQKK0NPTkZJR19NT05PVE9OSUNfU1lTQ0FMTD15CitDT05GSUdfSU9DVExfSEVYMlNUUl9FUlJPUj15CitDT05GSUdfRkVBVFVSRV9IV0lCPXkKKworIworIyBBcHBsZXRzCisjCisKKyMKKyMgQXJjaGl2YWwgVXRpbGl0aWVzCisjCitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19MWk1BPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0JaMj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19HWj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19aPXkKK0NPTkZJR19BUj15CitDT05GSUdfRkVBVFVSRV9BUl9MT05HX0ZJTEVOQU1FUz15CitDT05GSUdfQlVOWklQMj15CitDT05GSUdfQlpJUDI9eQorQ09ORklHX0NQSU89eQorQ09ORklHX0ZFQVRVUkVfQ1BJT19PPXkKK0NPTkZJR19GRUFUVVJFX0NQSU9fUD15CitDT05GSUdfRFBLRz15CitDT05GSUdfRFBLR19ERUI9eQorQ09ORklHX0ZFQVRVUkVfRFBLR19ERUJfRVhUUkFDVF9PTkxZPXkKK0NPTkZJR19HVU5aSVA9eQorQ09ORklHX0daSVA9eQorQ09ORklHX0ZFQVRVUkVfR1pJUF9MT05HX09QVElPTlM9eQorQ09ORklHX0xaT1A9eQorQ09ORklHX0xaT1BfQ09NUFJfSElHSD15CitDT05GSUdfUlBNMkNQSU89eQorQ09ORklHX1JQTT15CitDT05GSUdfVEFSPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9DUkVBVEU9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0FVVE9ERVRFQ1Q9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0ZST009eQorQ09ORklHX0ZFQVRVUkVfVEFSX09MREdOVV9DT01QQVRJQklMSVRZPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9PTERTVU5fQ09NUEFUSUJJTElUWT15CitDT05GSUdfRkVBVFVSRV9UQVJfR05VX0VYVEVOU0lPTlM9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRkVBVFVSRV9UQVJfVU5BTUVfR05BTUU9eQorQ09ORklHX0ZFQVRVUkVfVEFSX05PUFJFU0VSVkVfVElNRT15CitDT05GSUdfVU5DT01QUkVTUz15CitDT05GSUdfVU5MWk1BPXkKK0NPTkZJR19GRUFUVVJFX0xaTUFfRkFTVD15CitDT05GSUdfVU5aSVA9eQorCisjCisjIENvcmV1dGlscworIworQ09ORklHX0JBU0VOQU1FPXkKK0NPTkZJR19DQUw9eQorQ09ORklHX0NBVD15CitDT05GSUdfQ0FUVj15CitDT05GSUdfQ0hHUlA9eQorQ09ORklHX0NITU9EPXkKK0NPTkZJR19DSE9XTj15CitDT05GSUdfRkVBVFVSRV9DSE9XTl9MT05HX09QVElPTlM9eQorQ09ORklHX0NIUk9PVD15CitDT05GSUdfQ0tTVU09eQorQ09ORklHX0NPTU09eQorQ09ORklHX0NQPXkKK0NPTkZJR19GRUFUVVJFX0NQX0xPTkdfT1BUSU9OUz15CitDT05GSUdfQ1VUPXkKK0NPTkZJR19EQVRFPXkKK0NPTkZJR19GRUFUVVJFX0RBVEVfSVNPRk1UPXkKK0NPTkZJR19GRUFUVVJFX0RBVEVfQ09NUEFUPXkKK0NPTkZJR19ERD15CitDT05GSUdfRkVBVFVSRV9ERF9TSUdOQUxfSEFORExJTkc9eQorQ09ORklHX0ZFQVRVUkVfRERfVEhJUkRfU1RBVFVTX0xJTkU9eQorQ09ORklHX0ZFQVRVUkVfRERfSUJTX09CUz15CitDT05GSUdfREY9eQorQ09ORklHX0ZFQVRVUkVfREZfRkFOQ1k9eQorQ09ORklHX0RJUk5BTUU9eQorQ09ORklHX0RPUzJVTklYPXkKK0NPTkZJR19VTklYMkRPUz15CitDT05GSUdfRFU9eQorQ09ORklHX0ZFQVRVUkVfRFVfREVGQVVMVF9CTE9DS1NJWkVfMUs9eQorQ09ORklHX0VDSE89eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfRUNITz15CitDT05GSUdfRU5WPXkKK0NPTkZJR19GRUFUVVJFX0VOVl9MT05HX09QVElPTlM9eQorQ09ORklHX0VYUEFORD15CitDT05GSUdfRkVBVFVSRV9FWFBBTkRfTE9OR19PUFRJT05TPXkKK0NPTkZJR19FWFBSPXkKK0NPTkZJR19FWFBSX01BVEhfU1VQUE9SVF82ND15CitDT05GSUdfRkFMU0U9eQorQ09ORklHX0ZPTEQ9eQorQ09ORklHX0ZTWU5DPXkKK0NPTkZJR19IRUFEPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX0hFQUQ9eQorQ09ORklHX0hPU1RJRD15CitDT05GSUdfSUQ9eQorQ09ORklHX0lOU1RBTEw9eQorQ09ORklHX0ZFQVRVUkVfSU5TVEFMTF9MT05HX09QVElPTlM9eQorQ09ORklHX0xOPXkKK0NPTkZJR19MT0dOQU1FPXkKK0NPTkZJR19MUz15CitDT05GSUdfRkVBVFVSRV9MU19GSUxFVFlQRVM9eQorQ09ORklHX0ZFQVRVUkVfTFNfRk9MTE9XTElOS1M9eQorQ09ORklHX0ZFQVRVUkVfTFNfUkVDVVJTSVZFPXkKK0NPTkZJR19GRUFUVVJFX0xTX1NPUlRGSUxFUz15CitDT05GSUdfRkVBVFVSRV9MU19USU1FU1RBTVBTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1VTRVJOQU1FPXkKK0NPTkZJR19GRUFUVVJFX0xTX0NPTE9SPXkKK0NPTkZJR19GRUFUVVJFX0xTX0NPTE9SX0lTX0RFRkFVTFQ9eQorQ09ORklHX01ENVNVTT15CitDT05GSUdfTUtESVI9eQorQ09ORklHX0ZFQVRVUkVfTUtESVJfTE9OR19PUFRJT05TPXkKK0NPTkZJR19NS0ZJRk89eQorQ09ORklHX01LTk9EPXkKK0NPTkZJR19NVj15CitDT05GSUdfRkVBVFVSRV9NVl9MT05HX09QVElPTlM9eQorQ09ORklHX05JQ0U9eQorQ09ORklHX05PSFVQPXkKK0NPTkZJR19PRD15CitDT05GSUdfUFJJTlRFTlY9eQorQ09ORklHX1BSSU5URj15CitDT05GSUdfUFdEPXkKK0NPTkZJR19SRUFETElOSz15CitDT05GSUdfRkVBVFVSRV9SRUFETElOS19GT0xMT1c9eQorQ09ORklHX1JFQUxQQVRIPXkKK0NPTkZJR19STT15CitDT05GSUdfUk1ESVI9eQorQ09ORklHX0ZFQVRVUkVfUk1ESVJfTE9OR19PUFRJT05TPXkKK0NPTkZJR19TRVE9eQorQ09ORklHX1NIQTFTVU09eQorQ09ORklHX1NIQTI1NlNVTT15CitDT05GSUdfU0hBNTEyU1VNPXkKK0NPTkZJR19TTEVFUD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9TTEVFUD15CitDT05GSUdfRkVBVFVSRV9GTE9BVF9TTEVFUD15CitDT05GSUdfU09SVD15CitDT05GSUdfRkVBVFVSRV9TT1JUX0JJRz15CitDT05GSUdfU1BMSVQ9eQorQ09ORklHX0ZFQVRVUkVfU1BMSVRfRkFOQ1k9eQorQ09ORklHX1NUQVQ9eQorQ09ORklHX0ZFQVRVUkVfU1RBVF9GT1JNQVQ9eQorQ09ORklHX1NUVFk9eQorQ09ORklHX1NVTT15CitDT05GSUdfU1lOQz15CitDT05GSUdfVEFDPXkKK0NPTkZJR19UQUlMPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX1RBSUw9eQorQ09ORklHX1RFRT15CitDT05GSUdfRkVBVFVSRV9URUVfVVNFX0JMT0NLX0lPPXkKK0NPTkZJR19URVNUPXkKK0NPTkZJR19GRUFUVVJFX1RFU1RfNjQ9eQorQ09ORklHX1RPVUNIPXkKK0NPTkZJR19UUj15CitDT05GSUdfRkVBVFVSRV9UUl9DTEFTU0VTPXkKK0NPTkZJR19GRUFUVVJFX1RSX0VRVUlWPXkKK0NPTkZJR19UUlVFPXkKK0NPTkZJR19UVFk9eQorQ09ORklHX1VOQU1FPXkKK0NPTkZJR19VTkVYUEFORD15CitDT05GSUdfRkVBVFVSRV9VTkVYUEFORF9MT05HX09QVElPTlM9eQorQ09ORklHX1VOSVE9eQorQ09ORklHX1VTTEVFUD15CitDT05GSUdfVVVERUNPREU9eQorQ09ORklHX1VVRU5DT0RFPXkKK0NPTkZJR19XQz15CitDT05GSUdfRkVBVFVSRV9XQ19MQVJHRT15CitDT05GSUdfV0hPPXkKK0NPTkZJR19XSE9BTUk9eQorQ09ORklHX1lFUz15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGNwIGFuZCBtdgorIworQ09ORklHX0ZFQVRVUkVfUFJFU0VSVkVfSEFSRExJTktTPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbHMsIG1vcmUgYW5kIHRlbG5ldAorIworQ09ORklHX0ZFQVRVUkVfQVVUT1dJRFRIPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgZGYsIGR1LCBscworIworQ09ORklHX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEU9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBtZDVzdW0sIHNoYTFzdW0sIHNoYTI1NnN1bSwgc2hhNTEyc3VtCisjCitDT05GSUdfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0s9eQorCisjCisjIENvbnNvbGUgVXRpbGl0aWVzCisjCitDT05GSUdfQ0hWVD15CitDT05GSUdfQ0xFQVI9eQorQ09ORklHX0RFQUxMT0NWVD15CitDT05GSUdfRFVNUEtNQVA9eQorQ09ORklHX0tCRF9NT0RFPXkKK0NPTkZJR19MT0FERk9OVD15CitDT05GSUdfTE9BREtNQVA9eQorQ09ORklHX09QRU5WVD15CitDT05GSUdfUkVTRVQ9eQorQ09ORklHX1JFU0laRT15CitDT05GSUdfRkVBVFVSRV9SRVNJWkVfUFJJTlQ9eQorQ09ORklHX1NFVENPTlNPTEU9eQorQ09ORklHX0ZFQVRVUkVfU0VUQ09OU09MRV9MT05HX09QVElPTlM9eQorQ09ORklHX1NFVEZPTlQ9eQorQ09ORklHX0ZFQVRVUkVfU0VURk9OVF9URVhUVUFMX01BUD15CitDT05GSUdfREVGQVVMVF9TRVRGT05UX0RJUj0iIgorQ09ORklHX1NFVEtFWUNPREVTPXkKK0NPTkZJR19TRVRMT0dDT05TPXkKK0NPTkZJR19TSE9XS0VZPXkKKworIworIyBEZWJpYW4gVXRpbGl0aWVzCisjCitDT05GSUdfTUtURU1QPXkKK0NPTkZJR19QSVBFX1BST0dSRVNTPXkKK0NPTkZJR19SVU5fUEFSVFM9eQorQ09ORklHX0ZFQVRVUkVfUlVOX1BBUlRTX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRkVBVFVSRV9SVU5fUEFSVFNfRkFOQ1k9eQorQ09ORklHX1NUQVJUX1NUT1BfREFFTU9OPXkKK0NPTkZJR19GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZPXkKK0NPTkZJR19GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0xPTkdfT1BUSU9OUz15CitDT05GSUdfV0hJQ0g9eQorCisjCisjIEVkaXRvcnMKKyMKK0NPTkZJR19BV0s9eQorQ09ORklHX0ZFQVRVUkVfQVdLX0xJQk09eQorQ09ORklHX0NNUD15CitDT05GSUdfRElGRj15CitDT05GSUdfRkVBVFVSRV9ESUZGX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRkVBVFVSRV9ESUZGX0RJUj15CitDT05GSUdfRUQ9eQorQ09ORklHX1BBVENIPXkKK0NPTkZJR19TRUQ9eQorQ09ORklHX1ZJPXkKK0NPTkZJR19GRUFUVVJFX1ZJX01BWF9MRU49NDA5NgorQ09ORklHX0ZFQVRVUkVfVklfOEJJVD15CitDT05GSUdfRkVBVFVSRV9WSV9DT0xPTj15CitDT05GSUdfRkVBVFVSRV9WSV9ZQU5LTUFSSz15CitDT05GSUdfRkVBVFVSRV9WSV9TRUFSQ0g9eQorQ09ORklHX0ZFQVRVUkVfVklfVVNFX1NJR05BTFM9eQorQ09ORklHX0ZFQVRVUkVfVklfRE9UX0NNRD15CitDT05GSUdfRkVBVFVSRV9WSV9SRUFET05MWT15CitDT05GSUdfRkVBVFVSRV9WSV9TRVRPUFRTPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1NFVD15CitDT05GSUdfRkVBVFVSRV9WSV9XSU5fUkVTSVpFPXkKK0NPTkZJR19GRUFUVVJFX0FMTE9XX0VYRUM9eQorCisjCisjIEZpbmRpbmcgVXRpbGl0aWVzCisjCitDT05GSUdfRklORD15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BSSU5UMD15CitDT05GSUdfRkVBVFVSRV9GSU5EX01USU1FPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTU1JTj15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BFUk09eQorQ09ORklHX0ZFQVRVUkVfRklORF9UWVBFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfWERFVj15CitDT05GSUdfRkVBVFVSRV9GSU5EX01BWERFUFRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTkVXRVI9eQorQ09ORklHX0ZFQVRVUkVfRklORF9JTlVNPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfRVhFQz15CitDT05GSUdfRkVBVFVSRV9GSU5EX1VTRVI9eQorQ09ORklHX0ZFQVRVUkVfRklORF9HUk9VUD15CitDT05GSUdfRkVBVFVSRV9GSU5EX05PVD15CitDT05GSUdfRkVBVFVSRV9GSU5EX0RFUFRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUEFSRU49eQorQ09ORklHX0ZFQVRVUkVfRklORF9TSVpFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUFJVTkU9eQorQ09ORklHX0ZFQVRVUkVfRklORF9ERUxFVEU9eQorQ09ORklHX0ZFQVRVUkVfRklORF9QQVRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUkVHRVg9eQorQ09ORklHX0ZFQVRVUkVfRklORF9DT05URVhUPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTElOS1M9eQorQ09ORklHX0dSRVA9eQorQ09ORklHX0ZFQVRVUkVfR1JFUF9FR1JFUF9BTElBUz15CitDT05GSUdfRkVBVFVSRV9HUkVQX0ZHUkVQX0FMSUFTPXkKK0NPTkZJR19GRUFUVVJFX0dSRVBfQ09OVEVYVD15CitDT05GSUdfWEFSR1M9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT049eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9RVU9URVM9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9URVJNT1BUPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNPXkKKworIworIyBJbml0IFV0aWxpdGllcworIworQ09ORklHX0lOSVQ9eQorQ09ORklHX0ZFQVRVUkVfVVNFX0lOSVRUQUI9eQorQ09ORklHX0ZFQVRVUkVfS0lMTF9SRU1PVkVEPXkKK0NPTkZJR19GRUFUVVJFX0tJTExfREVMQVk9MQorQ09ORklHX0ZFQVRVUkVfSU5JVF9TQ1RUWT15CitDT05GSUdfRkVBVFVSRV9JTklUX1NZU0xPRz15CitDT05GSUdfRkVBVFVSRV9FWFRSQV9RVUlFVD15CitDT05GSUdfRkVBVFVSRV9JTklUX0NPUkVEVU1QUz15CitDT05GSUdfRkVBVFVSRV9JTklUUkQ9eQorQ09ORklHX0hBTFQ9eQorIyBDT05GSUdfRkVBVFVSRV9DQUxMX1RFTElOSVQgaXMgbm90IHNldAorQ09ORklHX1RFTElOSVRfUEFUSD0iIgorQ09ORklHX01FU0c9eQorCisjCisjIExvZ2luL1Bhc3N3b3JkIE1hbmFnZW1lbnQgVXRpbGl0aWVzCisjCitDT05GSUdfRkVBVFVSRV9TSEFET1dQQVNTV0RTPXkKK0NPTkZJR19VU0VfQkJfUFdEX0dSUD15CitDT05GSUdfVVNFX0JCX1NIQURPVz15CitDT05GSUdfVVNFX0JCX0NSWVBUPXkKK0NPTkZJR19VU0VfQkJfQ1JZUFRfU0hBPXkKK0NPTkZJR19BRERHUk9VUD15CitDT05GSUdfRkVBVFVSRV9BRERHUk9VUF9MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfQUREVVNFUl9UT19HUk9VUD15CitDT05GSUdfREVMR1JPVVA9eQorQ09ORklHX0ZFQVRVUkVfREVMX1VTRVJfRlJPTV9HUk9VUD15CitDT05GSUdfRkVBVFVSRV9DSEVDS19OQU1FUz15CitDT05GSUdfQUREVVNFUj15CitDT05GSUdfRkVBVFVSRV9BRERVU0VSX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRklSU1RfU1lTVEVNX0lEPTEwMAorQ09ORklHX0xBU1RfU1lTVEVNX0lEPTk5OQorQ09ORklHX0RFTFVTRVI9eQorQ09ORklHX0dFVFRZPXkKK0NPTkZJR19GRUFUVVJFX1VUTVA9eQorQ09ORklHX0ZFQVRVUkVfV1RNUD15CitDT05GSUdfTE9HSU49eQorIyBDT05GSUdfUEFNIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dJTl9TQ1JJUFRTPXkKK0NPTkZJR19GRUFUVVJFX05PTE9HSU49eQorQ09ORklHX0ZFQVRVUkVfU0VDVVJFVFRZPXkKK0NPTkZJR19QQVNTV0Q9eQorQ09ORklHX0ZFQVRVUkVfUEFTU1dEX1dFQUtfQ0hFQ0s9eQorQ09ORklHX0NSWVBUUFc9eQorQ09ORklHX0NIUEFTU1dEPXkKK0NPTkZJR19TVT15CitDT05GSUdfRkVBVFVSRV9TVV9TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfU1VfQ0hFQ0tTX1NIRUxMUz15CitDT05GSUdfU1VMT0dJTj15CitDT05GSUdfVkxPQ0s9eQorCisjCisjIExpbnV4IEV4dDIgRlMgUHJvZ3MKKyMKK0NPTkZJR19DSEFUVFI9eQorQ09ORklHX0ZTQ0s9eQorQ09ORklHX0xTQVRUUj15CisKKyMKKyMgTGludXggTW9kdWxlIFV0aWxpdGllcworIworQ09ORklHX01PRFBST0JFX1NNQUxMPXkKK0NPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX09QVElPTlNfT05fQ01ETElORT15CitDT05GSUdfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9DSEVDS19BTFJFQURZX0xPQURFRD15CisjIENPTkZJR19JTlNNT0QgaXMgbm90IHNldAorIyBDT05GSUdfUk1NT0QgaXMgbm90IHNldAorIyBDT05GSUdfTFNNT0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MU01PRF9QUkVUVFlfMl82X09VVFBVVCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RQUk9CRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFBST0JFX0JMQUNLTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVBNT0QgaXMgbm90IHNldAorCisjCisjIE9wdGlvbnMgY29tbW9uIHRvIG11bHRpcGxlIG1vZHV0aWxzCisjCisjIENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0lOU01PRF9UUllfTU1BUD15CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0tTWU1PT1BTX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRElOS01FTSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FEX01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FEX01BUF9GVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfVEFJTlRFRF9NT0RVTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT0RVVElMU19BTElBUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFVUSUxTX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfTU9EVUxFU19ESVI9Ii9saWIvbW9kdWxlcyIKK0NPTkZJR19ERUZBVUxUX0RFUE1PRF9GSUxFPSJtb2R1bGVzLmRlcCIKKworIworIyBMaW51eCBTeXN0ZW0gVXRpbGl0aWVzCisjCisjIENPTkZJR19BQ1BJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FDUElEX0NPTVBBVCBpcyBub3Qgc2V0CitDT05GSUdfQkxLSUQ9eQorQ09ORklHX0RNRVNHPXkKK0NPTkZJR19GRUFUVVJFX0RNRVNHX1BSRVRUWT15CitDT05GSUdfRkJTRVQ9eQorQ09ORklHX0ZFQVRVUkVfRkJTRVRfRkFOQ1k9eQorQ09ORklHX0ZFQVRVUkVfRkJTRVRfUkVBRE1PREU9eQorQ09ORklHX0ZERkxVU0g9eQorQ09ORklHX0ZERk9STUFUPXkKK0NPTkZJR19GRElTSz15CitDT05GSUdfRkRJU0tfU1VQUE9SVF9MQVJHRV9ESVNLUz15CitDT05GSUdfRkVBVFVSRV9GRElTS19XUklUQUJMRT15CitDT05GSUdfRkVBVFVSRV9BSVhfTEFCRUw9eQorQ09ORklHX0ZFQVRVUkVfU0dJX0xBQkVMPXkKK0NPTkZJR19GRUFUVVJFX1NVTl9MQUJFTD15CitDT05GSUdfRkVBVFVSRV9PU0ZfTEFCRUw9eQorQ09ORklHX0ZFQVRVUkVfRkRJU0tfQURWQU5DRUQ9eQorQ09ORklHX0ZJTkRGUz15CitDT05GSUdfRlJFRVJBTURJU0s9eQorQ09ORklHX0ZTQ0tfTUlOSVg9eQorQ09ORklHX01LRlNfRVhUMj15CitDT05GSUdfTUtGU19NSU5JWD15CisKKyMKKyMgTWluaXggZmlsZXN5c3RlbSBzdXBwb3J0CisjCitDT05GSUdfRkVBVFVSRV9NSU5JWDI9eQorQ09ORklHX01LRlNfUkVJU0VSPXkKK0NPTkZJR19NS0ZTX1ZGQVQ9eQorQ09ORklHX0dFVE9QVD15CitDT05GSUdfRkVBVFVSRV9HRVRPUFRfTE9ORz15CitDT05GSUdfSEVYRFVNUD15CitDT05GSUdfRkVBVFVSRV9IRVhEVU1QX1JFVkVSU0U9eQorQ09ORklHX0hEPXkKK0NPTkZJR19IV0NMT0NLPXkKK0NPTkZJR19GRUFUVVJFX0hXQ0xPQ0tfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX0hXQ0xPQ0tfQURKVElNRV9GSFM9eQorQ09ORklHX0lQQ1JNPXkKK0NPTkZJR19JUENTPXkKK0NPTkZJR19MT1NFVFVQPXkKK0NPTkZJR19MU1BDST15CitDT05GSUdfTFNVU0I9eQorQ09ORklHX01ERVY9eQorQ09ORklHX0ZFQVRVUkVfTURFVl9DT05GPXkKK0NPTkZJR19GRUFUVVJFX01ERVZfUkVOQU1FPXkKK0NPTkZJR19GRUFUVVJFX01ERVZfUkVOQU1FX1JFR0VYUD15CitDT05GSUdfRkVBVFVSRV9NREVWX0VYRUM9eQorQ09ORklHX0ZFQVRVUkVfTURFVl9MT0FEX0ZJUk1XQVJFPXkKK0NPTkZJR19NS1NXQVA9eQorQ09ORklHX0ZFQVRVUkVfTUtTV0FQX1VVSUQ9eQorQ09ORklHX01PUkU9eQorQ09ORklHX0ZFQVRVUkVfVVNFX1RFUk1JT1M9eQorQ09ORklHX1ZPTFVNRUlEPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0VYVD15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9CVFJGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9SRUlTRVJGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9GQVQ9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSEZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0pGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9YRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTlRGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9JU085NjYwPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1VERj15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MVUtTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xJTlVYU1dBUD15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9DUkFNRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfUk9NRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfU1lTVj15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9PQ0ZTMj15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFJBSUQ9eQorQ09ORklHX01PVU5UPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0ZBS0U9eQorQ09ORklHX0ZFQVRVUkVfTU9VTlRfVkVSQk9TRT15CitDT05GSUdfRkVBVFVSRV9NT1VOVF9IRUxQRVJTPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0xBQkVMPXkKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTkZTIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX01PVU5UX0NJRlM9eQorQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkxBR1M9eQorQ09ORklHX0ZFQVRVUkVfTU9VTlRfRlNUQUI9eQorQ09ORklHX1BJVk9UX1JPT1Q9eQorQ09ORklHX1JEQVRFPXkKK0NPTkZJR19SREVWPXkKK0NPTkZJR19SRUFEUFJPRklMRT15CitDT05GSUdfUlRDV0FLRT15CitDT05GSUdfU0NSSVBUPXkKK0NPTkZJR19TQ1JJUFRSRVBMQVk9eQorQ09ORklHX1NFVEFSQ0g9eQorQ09ORklHX1NXQVBPTk9GRj15CitDT05GSUdfRkVBVFVSRV9TV0FQT05fUFJJPXkKK0NPTkZJR19TV0lUQ0hfUk9PVD15CitDT05GSUdfVU1PVU5UPXkKK0NPTkZJR19GRUFUVVJFX1VNT1VOVF9BTEw9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBtb3VudC91bW91bnQKKyMKK0NPTkZJR19GRUFUVVJFX01PVU5UX0xPT1A9eQorIyBDT05GSUdfRkVBVFVSRV9NVEFCX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVXRpbGl0aWVzCisjCitDT05GSUdfQURKVElNRVg9eQorQ09ORklHX0JCQ09ORklHPXkKK0NPTkZJR19CRUVQPXkKK0NPTkZJR19GRUFUVVJFX0JFRVBfRlJFUT00MDAwCitDT05GSUdfRkVBVFVSRV9CRUVQX0xFTkdUSF9NUz0zMAorQ09ORklHX0NIQVQ9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9OT0ZBSUw9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9UVFlfSElGST15CitDT05GSUdfRkVBVFVSRV9DSEFUX0lNUExJQ0lUX0NSPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfU1dBTExPV19PUFRTPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfU0VORF9FU0NBUEVTPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfVkFSX0FCT1JUX0xFTj15CitDT05GSUdfRkVBVFVSRV9DSEFUX0NMUl9BQk9SVD15CitDT05GSUdfQ0hSVD15CitDT05GSUdfQ1JPTkQ9eQorQ09ORklHX0ZFQVRVUkVfQ1JPTkRfRD15CitDT05GSUdfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMPXkKK0NPTkZJR19GRUFUVVJFX0NST05EX0RJUj0iL3Zhci9zcG9vbC9jcm9uIgorQ09ORklHX0NST05UQUI9eQorQ09ORklHX0RDPXkKK0NPTkZJR19GRUFUVVJFX0RDX0xJQk09eQorIyBDT05GSUdfREVWRlNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRF9NT0RMT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRF9GR19OUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfVkVSQk9TRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RFVkZTIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZNRU09eQorQ09ORklHX0VKRUNUPXkKK0NPTkZJR19GRUFUVVJFX0VKRUNUX1NDU0k9eQorQ09ORklHX0ZCU1BMQVNIPXkKK0NPTkZJR19GTEFTSENQPXkKKyMgQ09ORklHX0ZMQVNIX0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkxBU0hfVU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX0VSQVNFQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19JT05JQ0U9eQorQ09ORklHX0lOT1RJRllEPXkKK0NPTkZJR19MQVNUPXkKK0NPTkZJR19GRUFUVVJFX0xBU1RfU01BTEw9eQorIyBDT05GSUdfRkVBVFVSRV9MQVNUX0ZBTkNZIGlzIG5vdCBzZXQKK0NPTkZJR19MRVNTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfTUFYTElORVM9OTk5OTk5OQorQ09ORklHX0ZFQVRVUkVfTEVTU19CUkFDS0VUUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX0ZMQUdTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfTUFSS1M9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19SRUdFWFA9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19XSU5DSD15CitDT05GSUdfRkVBVFVSRV9MRVNTX0RBU0hDTUQ9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19MSU5FTlVNUz15CitDT05GSUdfSERQQVJNPXkKK0NPTkZJR19GRUFUVVJFX0hEUEFSTV9HRVRfSURFTlRJVFk9eQorQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fU0NBTl9IV0lGPXkKK0NPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1VOUkVHSVNURVJfSFdJRj15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19EUklWRV9SRVNFVD15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19UUklTVEFURV9IV0lGPXkKK0NPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX0dFVFNFVF9ETUE9eQorQ09ORklHX01BS0VERVZTPXkKKyMgQ09ORklHX0ZFQVRVUkVfTUFLRURFVlNfTEVBRiBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9NQUtFREVWU19UQUJMRT15CitDT05GSUdfTUFOPXkKK0NPTkZJR19NSUNST0NPTT15CitDT05GSUdfTU9VTlRQT0lOVD15CitDT05GSUdfTVQ9eQorQ09ORklHX1JBSURBVVRPUlVOPXkKK0NPTkZJR19SRUFEQUhFQUQ9eQorQ09ORklHX1JVTkxFVkVMPXkKK0NPTkZJR19SWD15CitDT05GSUdfU0VUU0lEPXkKK0NPTkZJR19TVFJJTkdTPXkKK0NPTkZJR19UQVNLU0VUPXkKK0NPTkZJR19GRUFUVVJFX1RBU0tTRVRfRkFOQ1k9eQorQ09ORklHX1RJTUU9eQorQ09ORklHX1RJTUVPVVQ9eQorQ09ORklHX1RUWVNJWkU9eQorQ09ORklHX1ZPTE5BTUU9eQorQ09ORklHX1dBTEw9eQorQ09ORklHX1dBVENIRE9HPXkKKworIworIyBOZXR3b3JraW5nIFV0aWxpdGllcworIworQ09ORklHX0ZFQVRVUkVfSVBWNj15CitDT05GSUdfRkVBVFVSRV9VTklYX0xPQ0FMPXkKK0NPTkZJR19GRUFUVVJFX1BSRUZFUl9JUFY0X0FERFJFU1M9eQorQ09ORklHX1ZFUkJPU0VfUkVTT0xVVElPTl9FUlJPUlM9eQorQ09ORklHX0FSUD15CitDT05GSUdfQVJQSU5HPXkKK0NPTkZJR19CUkNUTD15CitDT05GSUdfRkVBVFVSRV9CUkNUTF9GQU5DWT15CitDT05GSUdfRkVBVFVSRV9CUkNUTF9TSE9XPXkKK0NPTkZJR19ETlNEPXkKK0NPTkZJR19FVEhFUl9XQUtFPXkKK0NPTkZJR19GQUtFSURFTlREPXkKK0NPTkZJR19GVFBEPXkKK0NPTkZJR19GRUFUVVJFX0ZUUF9XUklURT15CitDT05GSUdfRkVBVFVSRV9GVFBEX0FDQ0VQVF9CUk9LRU5fTElTVD15CitDT05GSUdfRlRQR0VUPXkKK0NPTkZJR19GVFBQVVQ9eQorQ09ORklHX0ZFQVRVUkVfRlRQR0VUUFVUX0xPTkdfT1BUSU9OUz15CitDT05GSUdfSE9TVE5BTUU9eQorQ09ORklHX0hUVFBEPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1JBTkdFUz15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9VU0VfU0VOREZJTEU9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfU0VUVUlEPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEg9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfQVVUSF9NRDU9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfQ0dJPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0NPTkZJR19XSVRIX1NDUklQVF9JTlRFUlBSPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1NFVF9SRU1PVEVfUE9SVF9UT19FTlY9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfRU5DT0RFX1VSTF9TVFI9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfRVJST1JfUEFHRVM9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfUFJPWFk9eQorQ09ORklHX0lGQ09ORklHPXkKK0NPTkZJR19GRUFUVVJFX0lGQ09ORklHX1NUQVRVUz15CitDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19TTElQPXkKK0NPTkZJR19GRUFUVVJFX0lGQ09ORklHX01FTVNUQVJUX0lPQUREUl9JUlE9eQorQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfSFc9eQorQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfQlJPQURDQVNUX1BMVVM9eQorQ09ORklHX0lGRU5TTEFWRT15CitDT05GSUdfSUZQTFVHRD15CitDT05GSUdfSUZVUERPV049eQorQ09ORklHX0lGVVBET1dOX0lGU1RBVEVfUEFUSD0iL3Zhci9ydW4vaWZzdGF0ZSIKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQPXkKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQX0JVSUxUSU49eQorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JRkNPTkZJR19CVUlMVElOIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQVjQ9eQorQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWNj15CitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HPXkKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX0VYVEVSTkFMX0RIQ1A9eQorQ09ORklHX0lORVREPXkKK0NPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9FQ0hPPXkKK0NPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9ESVNDQVJEPXkKK0NPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9USU1FPXkKK0NPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9EQVlUSU1FPXkKK0NPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9DSEFSR0VOPXkKK0NPTkZJR19GRUFUVVJFX0lORVREX1JQQz15CitDT05GSUdfSVA9eQorQ09ORklHX0ZFQVRVUkVfSVBfQUREUkVTUz15CitDT05GSUdfRkVBVFVSRV9JUF9MSU5LPXkKK0NPTkZJR19GRUFUVVJFX0lQX1JPVVRFPXkKK0NPTkZJR19GRUFUVVJFX0lQX1RVTk5FTD15CitDT05GSUdfRkVBVFVSRV9JUF9SVUxFPXkKK0NPTkZJR19GRUFUVVJFX0lQX1NIT1JUX0ZPUk1TPXkKK0NPTkZJR19GRUFUVVJFX0lQX1JBUkVfUFJPVE9DT0xTPXkKK0NPTkZJR19JUEFERFI9eQorQ09ORklHX0lQTElOSz15CitDT05GSUdfSVBST1VURT15CitDT05GSUdfSVBUVU5ORUw9eQorQ09ORklHX0lQUlVMRT15CitDT05GSUdfSVBDQUxDPXkKK0NPTkZJR19GRUFUVVJFX0lQQ0FMQ19GQU5DWT15CitDT05GSUdfRkVBVFVSRV9JUENBTENfTE9OR19PUFRJT05TPXkKK0NPTkZJR19OQU1FSUY9eQorQ09ORklHX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVEPXkKK0NPTkZJR19OQz15CitDT05GSUdfTkNfU0VSVkVSPXkKK0NPTkZJR19OQ19FWFRSQT15CitDT05GSUdfTkVUU1RBVD15CitDT05GSUdfRkVBVFVSRV9ORVRTVEFUX1dJREU9eQorQ09ORklHX0ZFQVRVUkVfTkVUU1RBVF9QUkc9eQorQ09ORklHX05TTE9PS1VQPXkKK0NPTkZJR19OVFBEPXkKK0NPTkZJR19GRUFUVVJFX05UUERfU0VSVkVSPXkKK0NPTkZJR19QSU5HPXkKK0NPTkZJR19QSU5HNj15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9QSU5HPXkKK0NPTkZJR19QU0NBTj15CitDT05GSUdfUk9VVEU9eQorQ09ORklHX1NMQVRUQUNIPXkKK0NPTkZJR19URUxORVQ9eQorQ09ORklHX0ZFQVRVUkVfVEVMTkVUX1RUWVBFPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVF9BVVRPTE9HSU49eQorQ09ORklHX1RFTE5FVEQ9eQorQ09ORklHX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVERfSU5FVERfV0FJVD15CitDT05GSUdfVEZUUD15CitDT05GSUdfVEZUUEQ9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9HRVQ9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9QVVQ9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkU9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9QUk9HUkVTU19CQVI9eQorQ09ORklHX1RGVFBfREVCVUc9eQorQ09ORklHX1RSQUNFUk9VVEU9eQorQ09ORklHX1RSQUNFUk9VVEU2PXkKK0NPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfVkVSQk9TRT15CitDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1NPVVJDRV9ST1VURT15CitDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1VTRV9JQ01QPXkKK0NPTkZJR19VREhDUEQ9eQorQ09ORklHX0RIQ1BSRUxBWT15CitDT05GSUdfRFVNUExFQVNFUz15CitDT05GSUdfRkVBVFVSRV9VREhDUERfV1JJVEVfTEVBU0VTX0VBUkxZPXkKK0NPTkZJR19ESENQRF9MRUFTRVNfRklMRT0iL3Zhci9saWIvbWlzYy91ZGhjcGQubGVhc2VzIgorQ09ORklHX1VESENQQz15CitDT05GSUdfRkVBVFVSRV9VREhDUENfQVJQSU5HPXkKK0NPTkZJR19GRUFUVVJFX1VESENQX1BPUlQ9eQorQ09ORklHX1VESENQX0RFQlVHPTkKK0NPTkZJR19GRUFUVVJFX1VESENQX1JGQzMzOTc9eQorQ09ORklHX1VESENQQ19ERUZBVUxUX1NDUklQVD0iL3Vzci9zaGFyZS91ZGhjcGMvZGVmYXVsdC5zY3JpcHQiCitDT05GSUdfVURIQ1BDX1NMQUNLX0ZPUl9CVUdHWV9TRVJWRVJTPTgwCitDT05GSUdfSUZVUERPV05fVURIQ1BDX0NNRF9PUFRJT05TPSItUiAtbiIKK0NPTkZJR19WQ09ORklHPXkKK0NPTkZJR19XR0VUPXkKK0NPTkZJR19GRUFUVVJFX1dHRVRfU1RBVFVTQkFSPXkKK0NPTkZJR19GRUFUVVJFX1dHRVRfQVVUSEVOVElDQVRJT049eQorQ09ORklHX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlM9eQorQ09ORklHX1pDSVA9eQorQ09ORklHX1RDUFNWRD15CitDT05GSUdfVFVOQ1RMPXkKK0NPTkZJR19GRUFUVVJFX1RVTkNUTF9VRz15CitDT05GSUdfVURQU1ZEPXkKKworIworIyBQcmludCBVdGlsaXRpZXMKKyMKK0NPTkZJR19MUEQ9eQorQ09ORklHX0xQUj15CitDT05GSUdfTFBRPXkKKworIworIyBNYWlsIFV0aWxpdGllcworIworQ09ORklHX01BS0VNSU1FPXkKK0NPTkZJR19GRUFUVVJFX01JTUVfQ0hBUlNFVD0idXMtYXNjaWkiCitDT05GSUdfUE9QTUFJTERJUj15CitDT05GSUdfRkVBVFVSRV9QT1BNQUlMRElSX0RFTElWRVJZPXkKK0NPTkZJR19SRUZPUk1JTUU9eQorQ09ORklHX0ZFQVRVUkVfUkVGT1JNSU1FX0NPTVBBVD15CitDT05GSUdfU0VORE1BSUw9eQorCisjCisjIFByb2Nlc3MgVXRpbGl0aWVzCisjCitDT05GSUdfRlJFRT15CitDT05GSUdfRlVTRVI9eQorQ09ORklHX0tJTEw9eQorQ09ORklHX0tJTExBTEw9eQorQ09ORklHX0tJTExBTEw1PXkKK0NPTkZJR19OTUVURVI9eQorQ09ORklHX1BHUkVQPXkKK0NPTkZJR19QSURPRj15CitDT05GSUdfRkVBVFVSRV9QSURPRl9TSU5HTEU9eQorQ09ORklHX0ZFQVRVUkVfUElET0ZfT01JVD15CitDT05GSUdfUEtJTEw9eQorQ09ORklHX1BTPXkKK0NPTkZJR19GRUFUVVJFX1BTX1dJREU9eQorQ09ORklHX0ZFQVRVUkVfUFNfVElNRT15CitDT05GSUdfRkVBVFVSRV9QU19BRERJVElPTkFMX0NPTFVNTlM9eQorQ09ORklHX0ZFQVRVUkVfUFNfVU5VU1VBTF9TWVNURU1TPXkKK0NPTkZJR19SRU5JQ0U9eQorQ09ORklHX0JCX1NZU0NUTD15CitDT05GSUdfVE9QPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRT15CitDT05GSUdfRkVBVFVSRV9UT1BfQ1BVX0dMT0JBTF9QRVJDRU5UUz15CitDT05GSUdfRkVBVFVSRV9UT1BfU01QX0NQVT15CitDT05GSUdfRkVBVFVSRV9UT1BfREVDSU1BTFM9eQorQ09ORklHX0ZFQVRVUkVfVE9QX1NNUF9QUk9DRVNTPXkKK0NPTkZJR19GRUFUVVJFX1RPUE1FTT15CitDT05GSUdfRkVBVFVSRV9TSE9XX1RIUkVBRFM9eQorQ09ORklHX1VQVElNRT15CitDT05GSUdfV0FUQ0g9eQorCisjCisjIFJ1bml0IFV0aWxpdGllcworIworQ09ORklHX1JVTlNWPXkKK0NPTkZJR19SVU5TVkRJUj15CitDT05GSUdfRkVBVFVSRV9SVU5TVkRJUl9MT0c9eQorQ09ORklHX1NWPXkKK0NPTkZJR19TVl9ERUZBVUxUX1NFUlZJQ0VfRElSPSIvdmFyL3NlcnZpY2UiCitDT05GSUdfU1ZMT0dEPXkKK0NPTkZJR19DSFBTVD15CitDT05GSUdfU0VUVUlER0lEPXkKK0NPTkZJR19FTlZVSURHSUQ9eQorQ09ORklHX0VOVkRJUj15CitDT05GSUdfU09GVExJTUlUPXkKKworIworIyBTRUxpbnV4IFV0aWxpdGllcworIworQ09ORklHX0NIQ09OPXkKK0NPTkZJR19GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUz15CitDT05GSUdfR0VURU5GT1JDRT15CitDT05GSUdfR0VUU0VCT09MPXkKK0NPTkZJR19MT0FEX1BPTElDWT15CitDT05GSUdfTUFUQ0hQQVRIQ09OPXkKK0NPTkZJR19SRVNUT1JFQ09OPXkKK0NPTkZJR19SVU5DT049eQorQ09ORklHX0ZFQVRVUkVfUlVOQ09OX0xPTkdfT1BUSU9OUz15CitDT05GSUdfU0VMSU5VWEVOQUJMRUQ9eQorQ09ORklHX1NFVEVORk9SQ0U9eQorQ09ORklHX1NFVEZJTEVTPXkKK0NPTkZJR19GRUFUVVJFX1NFVEZJTEVTX0NIRUNLX09QVElPTj15CitDT05GSUdfU0VUU0VCT09MPXkKK0NPTkZJR19TRVNUQVRVUz15CisKKyMKKyMgU2hlbGxzCisjCisjIENPTkZJR19GRUFUVVJFX1NIX0lTX0FTSCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TSF9JU19IVVNIPXkKKyMgQ09ORklHX0ZFQVRVUkVfU0hfSVNfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19BU0ggaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0JBU0hfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9KT0JfQ09OVFJPTCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQUxJQVMgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0dFVE9QVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0JVSUxUSU5fRUNITyBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQlVJTFRJTl9QUklOVEYgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0JVSUxUSU5fVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQ01EQ01EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9NQUlMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfUkFORE9NX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0VYUEFORF9QUk1UIGlzIG5vdCBzZXQKK0NPTkZJR19IVVNIPXkKK0NPTkZJR19IVVNIX0JBU0hfQ09NUEFUPXkKK0NPTkZJR19IVVNIX0hFTFA9eQorQ09ORklHX0hVU0hfSU5URVJBQ1RJVkU9eQorQ09ORklHX0hVU0hfSk9CPXkKK0NPTkZJR19IVVNIX1RJQ0s9eQorQ09ORklHX0hVU0hfSUY9eQorQ09ORklHX0hVU0hfTE9PUFM9eQorQ09ORklHX0hVU0hfQ0FTRT15CitDT05GSUdfSFVTSF9GVU5DVElPTlM9eQorQ09ORklHX0hVU0hfTE9DQUw9eQorQ09ORklHX0hVU0hfRVhQT1JUX049eQorQ09ORklHX0hVU0hfUkFORE9NX1NVUFBPUlQ9eQorQ09ORklHX01TSD15CitDT05GSUdfU0hfTUFUSF9TVVBQT1JUPXkKK0NPTkZJR19TSF9NQVRIX1NVUFBPUlRfNjQ9eQorQ09ORklHX0ZFQVRVUkVfU0hfRVhUUkFfUVVJRVQ9eQorQ09ORklHX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORT15CitDT05GSUdfRkVBVFVSRV9TSF9OT0ZPUks9eQorQ09ORklHX0NUVFlIQUNLPXkKKworIworIyBTeXN0ZW0gTG9nZ2luZyBVdGlsaXRpZXMKKyMKK0NPTkZJR19TWVNMT0dEPXkKK0NPTkZJR19GRUFUVVJFX1JPVEFURV9MT0dGSUxFPXkKK0NPTkZJR19GRUFUVVJFX1JFTU9URV9MT0c9eQorQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9EVVA9eQorQ09ORklHX0ZFQVRVUkVfSVBDX1NZU0xPRz15CitDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HX0JVRkZFUl9TSVpFPTE2CitDT05GSUdfTE9HUkVBRD15CitDT05GSUdfRkVBVFVSRV9MT0dSRUFEX1JFRFVDRURfTE9DS0lORz15CitDT05GSUdfS0xPR0Q9eQorQ09ORklHX0xPR0dFUj15CmRpZmYgLS1naXQgYS9jb25maWdzL1RFU1Rfbm9wcmludGZfZGVmY29uZmlnIGIvY29uZmlncy9URVNUX25vcHJpbnRmX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDliNjBjCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlncy9URVNUX25vcHJpbnRmX2RlZmNvbmZpZwpAQCAtMCwwICsxLDkyNiBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBCdXN5Ym94IHZlcnNpb246IDEuMTcuMC5naXQKKyMgTW9uIEp1biAgNyAxMzozNzo1NSAyMDEwCisjCitDT05GSUdfSEFWRV9ET1RfQ09ORklHPXkKKworIworIyBCdXN5Ym94IFNldHRpbmdzCisjCisKKyMKKyMgR2VuZXJhbCBDb25maWd1cmF0aW9uCisjCitDT05GSUdfREVTS1RPUD15CitDT05GSUdfRVhUUkFfQ09NUEFUPXkKK0NPTkZJR19JTkNMVURFX1NVU3YyPXkKKyMgQ09ORklHX1VTRV9QT1JUQUJMRV9DT0RFIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0JVRkZFUlNfVVNFX01BTExPQz15CisjIENPTkZJR19GRUFUVVJFX0JVRkZFUlNfR09fT05fU1RBQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CVUZGRVJTX0dPX0lOX0JTUyBpcyBub3Qgc2V0CitDT05GSUdfU0hPV19VU0FHRT15CitDT05GSUdfRkVBVFVSRV9WRVJCT1NFX1VTQUdFPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ09NUFJFU1NfVVNBR0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNUQUxMRVIgaXMgbm90IHNldAorIyBDT05GSUdfTE9DQUxFX1NVUFBPUlQgaXMgbm90IHNldAorQ09ORklHX1VOSUNPREVfU1VQUE9SVD15CisjIENPTkZJR19VTklDT0RFX1VTSU5HX0xPQ0FMRSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9DSEVDS19VTklDT0RFX0lOX0VOVj15CitDT05GSUdfU1VCU1RfV0NIQVI9NjMKK0NPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUj02NTUzNQorQ09ORklHX1VOSUNPREVfQ09NQklOSU5HX1dDSEFSUz15CitDT05GSUdfVU5JQ09ERV9XSURFX1dDSEFSUz15CitDT05GSUdfVU5JQ09ERV9CSURJX1NVUFBPUlQ9eQorIyBDT05GSUdfVU5JQ09ERV9ORVVUUkFMX1RBQkxFIGlzIG5vdCBzZXQKK0NPTkZJR19VTklDT0RFX1BSRVNFUlZFX0JST0tFTj15CitDT05GSUdfTE9OR19PUFRTPXkKK0NPTkZJR19GRUFUVVJFX0RFVlBUUz15CisjIENPTkZJR19GRUFUVVJFX0NMRUFOX1VQIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1VUTVA9eQorQ09ORklHX0ZFQVRVUkVfV1RNUD15CitDT05GSUdfRkVBVFVSRV9QSURGSUxFPXkKKyMgQ09ORklHX0ZFQVRVUkVfU1VJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVSURfQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VJRF9DT05GSUdfUVVJRVQgaXMgbm90IHNldAorIyBDT05GSUdfU0VMSU5VWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BSRUZFUl9BUFBMRVRTIGlzIG5vdCBzZXQKK0NPTkZJR19CVVNZQk9YX0VYRUNfUEFUSD0iL3Byb2Mvc2VsZi9leGUiCisjIENPTkZJR19GRUFUVVJFX1NZU0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hBVkVfUlBDIGlzIG5vdCBzZXQKKworIworIyBCdWlsZCBPcHRpb25zCisjCitDT05GSUdfU1RBVElDPXkKKyMgQ09ORklHX1BJRSBpcyBub3Qgc2V0CisjIENPTkZJR19OT01NVSBpcyBub3Qgc2V0CisjIENPTkZJR19CVUlMRF9MSUJCVVNZQk9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5ESVZJRFVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIQVJFRF9CVVNZQk9YIGlzIG5vdCBzZXQKK0NPTkZJR19MRlM9eQorQ09ORklHX0NST1NTX0NPTVBJTEVSX1BSRUZJWD0iaTQ4Ni1saW51eC11Y2xpYmMtIgorQ09ORklHX0VYVFJBX0NGTEFHUz0iIgorCisjCisjIERlYnVnZ2luZyBPcHRpb25zCisjCisjIENPTkZJR19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19QRVNTSU1JWkUgaXMgbm90IHNldAorQ09ORklHX1dFUlJPUj15CitDT05GSUdfTk9fREVCVUdfTElCPXkKKyMgQ09ORklHX0RNQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfRUZFTkNFIGlzIG5vdCBzZXQKKworIworIyBJbnN0YWxsYXRpb24gT3B0aW9ucworIworIyBDT05GSUdfSU5TVEFMTF9OT19VU1IgaXMgbm90IHNldAorQ09ORklHX0lOU1RBTExfQVBQTEVUX1NZTUxJTktTPXkKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX0hBUkRMSU5LUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9TQ1JJUFRfV1JBUFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfRE9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9TWU1MSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX0hBUkRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NDUklQVF9XUkFQUEVSIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVGSVg9Ii4vX2luc3RhbGwiCisKKyMKKyMgQnVzeWJveCBMaWJyYXJ5IFR1bmluZworIworQ09ORklHX1BBU1NXT1JEX01JTkxFTj02CitDT05GSUdfTUQ1X1NNQUxMPTEKK0NPTkZJR19GRUFUVVJFX0ZBU1RfVE9QPXkKKyMgQ09ORklHX0ZFQVRVUkVfRVRDX05FVFdPUktTIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0VESVRJTkc9eQorQ09ORklHX0ZFQVRVUkVfRURJVElOR19NQVhfTEVOPTEwMjQKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfVkk9eQorQ09ORklHX0ZFQVRVUkVfRURJVElOR19ISVNUT1JZPTE1CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT049eQorQ09ORklHX0ZFQVRVUkVfVVNFUk5BTUVfQ09NUExFVElPTj15CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVD15CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX0FTS19URVJNSU5BTD15CitDT05GSUdfRkVBVFVSRV9OT05fUE9TSVhfQ1A9eQorIyBDT05GSUdfRkVBVFVSRV9WRVJCT1NFX0NQX01FU1NBR0UgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQ09QWUJVRl9LQj02NAorQ09ORklHX01PTk9UT05JQ19TWVNDQUxMPXkKKyMgQ09ORklHX0lPQ1RMX0hFWDJTVFJfRVJST1IgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfSFdJQj15CisKKyMKKyMgQXBwbGV0cworIworCisjCisjIEFyY2hpdmFsIFV0aWxpdGllcworIworQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWFo9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfTFpNQT15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19CWjI9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfR1o9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWj15CisjIENPTkZJR19BUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FSX0xPTkdfRklMRU5BTUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQVJfQ1JFQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JVTlpJUDIgaXMgbm90IHNldAorIyBDT05GSUdfQlpJUDIgaXMgbm90IHNldAorIyBDT05GSUdfQ1BJTyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NQSU9fTyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NQSU9fUCBpcyBub3Qgc2V0CisjIENPTkZJR19EUEtHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RQS0dfREVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRFBLR19ERUJfRVhUUkFDVF9PTkxZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dVTlpJUCBpcyBub3Qgc2V0CisjIENPTkZJR19HWklQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfR1pJUF9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfTFpPUCBpcyBub3Qgc2V0CisjIENPTkZJR19MWk9QX0NPTVBSX0hJR0ggaXMgbm90IHNldAorIyBDT05GSUdfUlBNMkNQSU8gaXMgbm90IHNldAorIyBDT05GSUdfUlBNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RBUl9DUkVBVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVJfQVVUT0RFVEVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RBUl9GUk9NIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX09MREdOVV9DT01QQVRJQklMSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX09MRFNVTl9DT01QQVRJQklMSVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RBUl9VTkFNRV9HTkFNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RBUl9OT1BSRVNFUlZFX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVJfU0VMSU5VWCBpcyBub3Qgc2V0CisjIENPTkZJR19VTkNPTVBSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOTFpNQSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xaTUFfRkFTVCBpcyBub3Qgc2V0CisjIENPTkZJR19MWk1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOWFogaXMgbm90IHNldAorIyBDT05GSUdfWFogaXMgbm90IHNldAorIyBDT05GSUdfVU5aSVAgaXMgbm90IHNldAorCisjCisjIENvcmV1dGlscworIworQ09ORklHX0JBU0VOQU1FPXkKKyMgQ09ORklHX0NBVCBpcyBub3Qgc2V0CisjIENPTkZJR19EQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREFURV9JU09GTVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EQVRFX05BTk8gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EQVRFX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEVTVF82NCBpcyBub3Qgc2V0CisjIENPTkZJR19UUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RSX0NMQVNTRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UUl9FUVVJViBpcyBub3Qgc2V0CisjIENPTkZJR19DQUwgaXMgbm90IHNldAorIyBDT05GSUdfQ0FUViBpcyBub3Qgc2V0CisjIENPTkZJR19DSEdSUCBpcyBub3Qgc2V0CisjIENPTkZJR19DSE1PRCBpcyBub3Qgc2V0CisjIENPTkZJR19DSE9XTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIT1dOX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJPT1QgaXMgbm90IHNldAorIyBDT05GSUdfQ0tTVU0gaXMgbm90IHNldAorIyBDT05GSUdfQ09NTSBpcyBub3Qgc2V0CisjIENPTkZJR19DUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NQX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19DVVQgaXMgbm90IHNldAorIyBDT05GSUdfREQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERF9TSUdOQUxfSEFORExJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERF9USElSRF9TVEFUVVNfTElORSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0REX0lCU19PQlMgaXMgbm90IHNldAorIyBDT05GSUdfREYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERl9GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19ESVJOQU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RPUzJVTklYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVgyRE9TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RVIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRFVfREVGQVVMVF9CTE9DS1NJWkVfMUsgaXMgbm90IHNldAorIyBDT05GSUdfRUNITyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZBTkNZX0VDSE8gaXMgbm90IHNldAorIyBDT05GSUdfRU5WIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRU5WX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFBBTkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FWFBBTkRfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYUFIgaXMgbm90IHNldAorIyBDT05GSUdfRVhQUl9NQVRIX1NVUFBPUlRfNjQgaXMgbm90IHNldAorQ09ORklHX0ZBTFNFPXkKKyMgQ09ORklHX0ZPTEQgaXMgbm90IHNldAorIyBDT05GSUdfRlNZTkMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZBTkNZX0hFQUQgaXMgbm90IHNldAorIyBDT05GSUdfSE9TVElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNUQUxMX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19MTiBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dOQU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTFNfRklMRVRZUEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTFNfRk9MTE9XTElOS1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MU19SRUNVUlNJVkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MU19TT1JURklMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MU19USU1FU1RBTVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTFNfVVNFUk5BTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MU19DT0xPUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xTX0NPTE9SX0lTX0RFRkFVTFQgaXMgbm90IHNldAorIyBDT05GSUdfTUQ1U1VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRElSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTUtESVJfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRklGTyBpcyBub3Qgc2V0CisjIENPTkZJR19NS05PRCBpcyBub3Qgc2V0CisjIENPTkZJR19NViBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01WX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19OSUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PSFVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX09EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSSU5URU5WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BSSU5URiBpcyBub3Qgc2V0CisjIENPTkZJR19QV0QgaXMgbm90IHNldAorIyBDT05GSUdfUkVBRExJTksgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SRUFETElOS19GT0xMT1cgaXMgbm90IHNldAorIyBDT05GSUdfUkVBTFBBVEggaXMgbm90IHNldAorIyBDT05GSUdfUk0gaXMgbm90IHNldAorIyBDT05GSUdfUk1ESVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9STURJUl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfU0VRIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQTFTVU0gaXMgbm90IHNldAorIyBDT05GSUdfU0hBMjU2U1VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIQTUxMlNVTSBpcyBub3Qgc2V0CisjIENPTkZJR19TTEVFUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZBTkNZX1NMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRkxPQVRfU0xFRVAgaXMgbm90IHNldAorIyBDT05GSUdfU09SVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NPUlRfQklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NQTElUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1BMSVRfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NUQVRfRk9STUFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NUVFkgaXMgbm90IHNldAorIyBDT05GSUdfU1VNIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NZTkMgaXMgbm90IHNldAorIyBDT05GSUdfVEFDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBSUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GQU5DWV9UQUlMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RFRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RFRV9VU0VfQkxPQ0tfSU8gaXMgbm90IHNldAorIyBDT05GSUdfVE9VQ0ggaXMgbm90IHNldAorQ09ORklHX1RSVUU9eQorIyBDT05GSUdfVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOQU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VORVhQQU5EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVU5FWFBBTkRfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSVEgaXMgbm90IHNldAorIyBDT05GSUdfVVNMRUVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VVREVDT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VVRU5DT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfV0NfTEFSR0UgaXMgbm90IHNldAorIyBDT05GSUdfV0hPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dIT0FNSSBpcyBub3Qgc2V0CisjIENPTkZJR19ZRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QUkVTRVJWRV9IQVJETElOS1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BVVRPV0lEVEggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSyBpcyBub3Qgc2V0CisKKyMKKyMgQ29uc29sZSBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0NIVlQgaXMgbm90IHNldAorIyBDT05GSUdfRkdDT05TT0xFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NMRUFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQUxMT0NWVCBpcyBub3Qgc2V0CisjIENPTkZJR19EVU1QS01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19LQkRfTU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FERk9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FES01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19PUEVOVlQgaXMgbm90IHNldAorIyBDT05GSUdfUkVTRVQgaXMgbm90IHNldAorIyBDT05GSUdfUkVTSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUkVTSVpFX1BSSU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRDT05TT0xFX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRGT05UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0VURk9OVF9URVhUVUFMX01BUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9TRVRGT05UX0RJUj0iIgorIyBDT05GSUdfU0VUS0VZQ09ERVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VUTE9HQ09OUyBpcyBub3Qgc2V0CisjIENPTkZJR19TSE9XS0VZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTE9BREZPTlRfUFNGMiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xPQURGT05UX1JBVyBpcyBub3Qgc2V0CisKKyMKKyMgRGViaWFuIFV0aWxpdGllcworIworIyBDT05GSUdfTUtURU1QIGlzIG5vdCBzZXQKK0NPTkZJR19QSVBFX1BST0dSRVNTPXkKKyMgQ09ORklHX1JVTl9QQVJUUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JVTl9QQVJUU19MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SVU5fUEFSVFNfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfU1RBUlRfU1RPUF9EQUVNT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19XSElDSCBpcyBub3Qgc2V0CisKKyMKKyMgRWRpdG9ycworIworIyBDT05GSUdfQVdLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQVdLX0xJQk0gaXMgbm90IHNldAorIyBDT05GSUdfQ01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RJRkYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ESUZGX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RJRkZfRElSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVENIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFRCBpcyBub3Qgc2V0CisjIENPTkZJR19WSSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9WSV9NQVhfTEVOPTAKKyMgQ09ORklHX0ZFQVRVUkVfVklfOEJJVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX0NPTE9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVklfWUFOS01BUksgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9TRUFSQ0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9VU0VfU0lHTkFMUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX0RPVF9DTUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9SRUFET05MWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX1NFVE9QVFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9TRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9XSU5fUkVTSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVklfQVNLX1RFUk1JTkFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUxMT1dfRVhFQyBpcyBub3Qgc2V0CisKKyMKKyMgRmluZGluZyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0ZJTkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1BSSU5UMCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfTVRJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX01NSU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1BFUk0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1RZUEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1hERVYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX01BWERFUFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9ORVdFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfSU5VTSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfRVhFQyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfR1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX05PVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfREVQVEggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1BBUkVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9TSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9QUlVORSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfREVMRVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9QQVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9SRUdFWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfQ09OVEVYVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfTElOS1MgaXMgbm90IHNldAorIyBDT05GSUdfR1JFUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0dSRVBfRUdSRVBfQUxJQVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9HUkVQX0ZHUkVQX0FMSUFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfR1JFUF9DT05URVhUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1hBUkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1FVT1RFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfVEVSTU9QVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNIGlzIG5vdCBzZXQKKworIworIyBJbml0IFV0aWxpdGllcworIworIyBDT05GSUdfSU5JVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VTRV9JTklUVEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfS0lMTF9SRU1PVkVEIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0tJTExfREVMQVk9MAorIyBDT05GSUdfRkVBVFVSRV9JTklUX1NDVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5JVF9TWVNMT0cgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FWFRSQV9RVUlFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOSVRfQ09SRURVTVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5JVFJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hBTFQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DQUxMX1RFTElOSVQgaXMgbm90IHNldAorQ09ORklHX1RFTElOSVRfUEFUSD0iIgorIyBDT05GSUdfTUVTRyBpcyBub3Qgc2V0CisjIENPTkZJR19CT09UQ0hBUlREIGlzIG5vdCBzZXQKKworIworIyBMb2dpbi9QYXNzd29yZCBNYW5hZ2VtZW50IFV0aWxpdGllcworIworIyBDT05GSUdfRkVBVFVSRV9TSEFET1dQQVNTV0RTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9CQl9QV0RfR1JQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9CQl9TSEFET1cgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0JCX0NSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9CQl9DUllQVF9TSEEgaXMgbm90IHNldAorIyBDT05GSUdfQURER1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BRERHUk9VUF9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BRERVU0VSX1RPX0dST1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFTEdST1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREVMX1VTRVJfRlJPTV9HUk9VUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX05BTUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FERFVTRVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BRERVU0VSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfRklSU1RfU1lTVEVNX0lEPTAKK0NPTkZJR19MQVNUX1NZU1RFTV9JRD0wCisjIENPTkZJR19ERUxVU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBTSBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dJTl9TQ1JJUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTk9MT0dJTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NFQ1VSRVRUWSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVNTV0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QQVNTV0RfV0VBS19DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVFBXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUEFTU1dEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VfU1lTTE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VfQ0hFQ0tTX1NIRUxMUyBpcyBub3Qgc2V0CisjIENPTkZJR19TVUxPR0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMT0NLIGlzIG5vdCBzZXQKKworIworIyBMaW51eCBFeHQyIEZTIFByb2dzCisjCisjIENPTkZJR19DSEFUVFIgaXMgbm90IHNldAorIyBDT05GSUdfRlNDSyBpcyBub3Qgc2V0CisjIENPTkZJR19MU0FUVFIgaXMgbm90IHNldAorIyBDT05GSUdfVFVORTJGUyBpcyBub3Qgc2V0CisKKyMKKyMgTGludXggTW9kdWxlIFV0aWxpdGllcworIworIyBDT05GSUdfTU9ESU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RQUk9CRV9TTUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX09QVElPTlNfT05fQ01ETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX0NIRUNLX0FMUkVBRFlfTE9BREVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU01PRCBpcyBub3Qgc2V0CisjIENPTkZJR19STU1PRCBpcyBub3Qgc2V0CisjIENPTkZJR19MU01PRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xTTU9EX1BSRVRUWV8yXzZfT1VUUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFBST0JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfQkxBQ0tMSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFUE1PRCBpcyBub3Qgc2V0CisKKyMKKyMgT3B0aW9ucyBjb21tb24gdG8gbXVsdGlwbGUgbW9kdXRpbHMKKyMKKyMgQ09ORklHX0ZFQVRVUkVfMl80X01PRFVMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVFJZX01NQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURJTktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVBfRlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EVVRJTFNfQUxJQVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT0RVVElMU19TWU1CT0xTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX01PRFVMRVNfRElSPSIiCitDT05GSUdfREVGQVVMVF9ERVBNT0RfRklMRT0iIgorCisjCisjIExpbnV4IFN5c3RlbSBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0FDUElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUNQSURfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS0lEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNRVNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRE1FU0dfUFJFVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRkJTRVRfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GQlNFVF9SRUFETU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19GREZMVVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZERk9STUFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZESVNLIGlzIG5vdCBzZXQKK0NPTkZJR19GRElTS19TVVBQT1JUX0xBUkdFX0RJU0tTPXkKKyMgQ09ORklHX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BSVhfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TR0lfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVU5fTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9PU0ZfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GRElTS19BRFZBTkNFRCBpcyBub3Qgc2V0CisjIENPTkZJR19GSU5ERlMgaXMgbm90IHNldAorIyBDT05GSUdfRkxPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRlJFRVJBTURJU0sgaXMgbm90IHNldAorIyBDT05GSUdfRlNDS19NSU5JWCBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX0VYVDIgaXMgbm90IHNldAorIyBDT05GSUdfTUtGU19NSU5JWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01JTklYMiBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX1JFSVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX1ZGQVQgaXMgbm90IHNldAorIyBDT05GSUdfR0VUT1BUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfR0VUT1BUX0xPTkcgaXMgbm90IHNldAorIyBDT05GSUdfSEVYRFVNUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hFWERVTVBfUkVWRVJTRSBpcyBub3Qgc2V0CisjIENPTkZJR19IRCBpcyBub3Qgc2V0CisjIENPTkZJR19IV0NMT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFdDTE9DS19MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IV0NMT0NLX0FESlRJTUVfRkhTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQQ1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQQ1MgaXMgbm90IHNldAorIyBDT05GSUdfTE9TRVRVUCBpcyBub3Qgc2V0CisjIENPTkZJR19MU1BDSSBpcyBub3Qgc2V0CisjIENPTkZJR19MU1VTQiBpcyBub3Qgc2V0CisjIENPTkZJR19NREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9DT05GIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9SRU5BTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX1JFTkFNRV9SRUdFWFAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX0VYRUMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX0xPQURfRklSTVdBUkUgaXMgbm90IHNldAorIyBDT05GSUdfTUtTV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTUtTV0FQX1VVSUQgaXMgbm90IHNldAorIyBDT05GSUdfTU9SRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VTRV9URVJNSU9TIGlzIG5vdCBzZXQKK0NPTkZJR19WT0xVTUVJRD15CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0JUUkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfUkVJU0VSRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9GQVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9IRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9KRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9YRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9OVEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSVNPOTY2MCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1VERiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xVS1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFNXQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9ST01GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1NZU1YgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9PQ0ZTMiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xJTlVYUkFJRCBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0ZBS0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9WRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0ZMQUdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRlNUQUIgaXMgbm90IHNldAorIyBDT05GSUdfUElWT1RfUk9PVCBpcyBub3Qgc2V0CisjIENPTkZJR19SREFURSBpcyBub3Qgc2V0CisjIENPTkZJR19SREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFQURQUk9GSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ1dBS0UgaXMgbm90IHNldAorIyBDT05GSUdfU0NSSVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDUklQVFJFUExBWSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRBUkNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXQVBPTk9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NXQVBPTl9QUkkgaXMgbm90IHNldAorIyBDT05GSUdfU1dJVENIX1JPT1QgaXMgbm90IHNldAorIyBDT05GSUdfVU1PVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVU1PVU5UX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9MT09QX0NSRUFURSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01UQUJfU1VQUE9SVCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0FESlRJTUVYIGlzIG5vdCBzZXQKK0NPTkZJR19CQkNPTkZJRz15CisjIENPTkZJR19CRUVQIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0JFRVBfRlJFUT0wCitDT05GSUdfRkVBVFVSRV9CRUVQX0xFTkdUSF9NUz0wCisjIENPTkZJR19DSEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9OT0ZBSUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX1RUWV9ISUZJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9JTVBMSUNJVF9DUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfU1dBTExPV19PUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9TRU5EX0VTQ0FQRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX1ZBUl9BQk9SVF9MRU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX0NMUl9BQk9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NST05EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ1JPTkRfRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NST05EX0NBTExfU0VORE1BSUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQ1JPTkRfRElSPSIiCisjIENPTkZJR19DUk9OVEFCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRENfTElCTSBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0QgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX01PRExPQUQgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX0ZHX05QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRF9WRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREVWRlMgaXMgbm90IHNldAorIyBDT05GSUdfREVWTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VKRUNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRUpFQ1RfU0NTSSBpcyBub3Qgc2V0CisjIENPTkZJR19GQlNQTEFTSCBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkxBU0hfVU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX0VSQVNFQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPTklDRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTk9USUZZRCBpcyBub3Qgc2V0CisjIENPTkZJR19MQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEFTVF9TTUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xBU1RfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTEVTUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9MRVNTX01BWExJTkVTPTAKKyMgQ09ORklHX0ZFQVRVUkVfTEVTU19CUkFDS0VUUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xFU1NfRkxBR1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MRVNTX01BUktTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEVTU19SRUdFWFAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MRVNTX1dJTkNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEVTU19EQVNIQ01EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEVTU19MSU5FTlVNUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRFBBUk0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fU0NBTl9IV0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fVU5SRUdJU1RFUl9IV0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fRFJJVkVfUkVTRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19UUklTVEFURV9IV0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fR0VUU0VUX0RNQSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUtFREVWUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01BS0VERVZTX0xFQUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NQUtFREVWU19UQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19NQU4gaXMgbm90IHNldAorIyBDT05GSUdfTUlDUk9DT00gaXMgbm90IHNldAorIyBDT05GSUdfTU9VTlRQT0lOVCBpcyBub3Qgc2V0CisjIENPTkZJR19NVCBpcyBub3Qgc2V0CisjIENPTkZJR19SQUlEQVVUT1JVTiBpcyBub3Qgc2V0CisjIENPTkZJR19SRUFEQUhFQUQgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JVTkxFVkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVFNJRCBpcyBub3Qgc2V0CisjIENPTkZJR19TVFJJTkdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RBU0tTRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVNLU0VUX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfVElNRU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19UVFlTSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZPTE5BTUUgaXMgbm90IHNldAorIyBDT05GSUdfV0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0ZFQVRVUkVfSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VOSVhfTE9DQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QUkVGRVJfSVBWNF9BRERSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZFUkJPU0VfUkVTT0xVVElPTl9FUlJPUlMgaXMgbm90IHNldAorIyBDT05GSUdfQVJQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUElORyBpcyBub3Qgc2V0CisjIENPTkZJR19CUkNUTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JSQ1RMX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlJDVExfU0hPVyBpcyBub3Qgc2V0CisjIENPTkZJR19ETlNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUSEVSX1dBS0UgaXMgbm90IHNldAorIyBDT05GSUdfRkFLRUlERU5URCBpcyBub3Qgc2V0CisjIENPTkZJR19GVFBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRlRQX1dSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRlRQRF9BQ0NFUFRfQlJPS0VOX0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfRlRQR0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUFBVVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZUUEdFVFBVVF9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfSE9TVE5BTUUgaXMgbm90IHNldAorIyBDT05GSUdfSFRUUEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9SQU5HRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9VU0VfU0VOREZJTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9TRVRVSUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfQVVUSF9NRDUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9DR0kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9DT05GSUdfV0lUSF9TQ1JJUFRfSU5URVJQUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX1NFVF9SRU1PVEVfUE9SVF9UT19FTlYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9FTkNPREVfVVJMX1NUUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hUVFBEX0VSUk9SX1BBR0VTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfUFJPWFkgaXMgbm90IHNldAorIyBDT05GSUdfSUZDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19TVEFUVVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19TTElQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfTUVNU1RBUlRfSU9BRERSX0lSUSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGQ09ORklHX0hXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfQlJPQURDQVNUX1BMVVMgaXMgbm90IHNldAorIyBDT05GSUdfSUZFTlNMQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lGUExVR0QgaXMgbm90IHNldAorIyBDT05GSUdfSUZVUERPV04gaXMgbm90IHNldAorQ09ORklHX0lGVVBET1dOX0lGU1RBVEVfUEFUSD0iIgorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQX0JVSUxUSU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JRkNPTkZJR19CVUlMVElOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWNCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fRVhURVJOQUxfREhDUCBpcyBub3Qgc2V0CisjIENPTkZJR19JTkVURCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9FQ0hPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RJU0NBUkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9EQVlUSU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0NIQVJHRU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9SUEMgaXMgbm90IHNldAorIyBDT05GSUdfSVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9BRERSRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX1JPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUlVMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX1NIT1JUX0ZPUk1TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUkFSRV9QUk9UT0NPTFMgaXMgbm90IHNldAorIyBDT05GSUdfSVBBRERSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JUFJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQVFVOTkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQUlVMRSBpcyBub3Qgc2V0CisjIENPTkZJR19JUENBTEMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUENBTENfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUENBTENfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTUVJRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05BTUVJRl9FWFRFTkRFRCBpcyBub3Qgc2V0CisjIENPTkZJR19OQyBpcyBub3Qgc2V0CisjIENPTkZJR19OQ19TRVJWRVIgaXMgbm90IHNldAorIyBDT05GSUdfTkNfRVhUUkEgaXMgbm90IHNldAorIyBDT05GSUdfTkVUU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05FVFNUQVRfV0lERSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05FVFNUQVRfUFJHIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TTE9PS1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05UUEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9OVFBEX1NFUlZFUiBpcyBub3Qgc2V0CisjIENPTkZJR19QSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJTkc2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRkFOQ1lfUElORyBpcyBub3Qgc2V0CisjIENPTkZJR19QU0NBTiBpcyBub3Qgc2V0CisjIENPTkZJR19ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19TTEFUVEFDSCBpcyBub3Qgc2V0CisjIENPTkZJR19UQ1BTVkQgaXMgbm90IHNldAorIyBDT05GSUdfVEVMTkVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEVMTkVUX1RUWVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEVMTkVUX0FVVE9MT0dJTiBpcyBub3Qgc2V0CisjIENPTkZJR19URUxORVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEVMTkVURF9JTkVURF9XQUlUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RGVFAgaXMgbm90IHNldAorIyBDT05GSUdfVEZUUEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URlRQX0dFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RGVFBfUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URlRQX1BST0dSRVNTX0JBUiBpcyBub3Qgc2V0CisjIENPTkZJR19URlRQX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSQUNFUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfVFJBQ0VST1VURTYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1NPVVJDRV9ST1VURSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfVVNFX0lDTVAgaXMgbm90IHNldAorIyBDT05GSUdfVFVOQ1RMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVFVOQ1RMX1VHIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VESENQRCBpcyBub3Qgc2V0CisjIENPTkZJR19ESENQUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfRFVNUExFQVNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQRF9XUklURV9MRUFTRVNfRUFSTFkgaXMgbm90IHNldAorQ09ORklHX0RIQ1BEX0xFQVNFU19GSUxFPSIiCisjIENPTkZJR19VREhDUEMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUENfQVJQSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BfUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfVURIQ1BfREVCVUc9MAorIyBDT05GSUdfRkVBVFVSRV9VREhDUF9SRkMzMzk3IGlzIG5vdCBzZXQKK0NPTkZJR19VREhDUENfREVGQVVMVF9TQ1JJUFQ9IiIKK0NPTkZJR19VREhDUENfU0xBQ0tfRk9SX0JVR0dZX1NFUlZFUlM9MAorQ09ORklHX0lGVVBET1dOX1VESENQQ19DTURfT1BUSU9OUz0iIgorIyBDT05GSUdfVURQU1ZEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfV0dFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1dHRVRfU1RBVFVTQkFSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfV0dFVF9BVVRIRU5USUNBVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1pDSVAgaXMgbm90IHNldAorCisjCisjIFByaW50IFV0aWxpdGllcworIworIyBDT05GSUdfTFBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xQUiBpcyBub3Qgc2V0CisjIENPTkZJR19MUFEgaXMgbm90IHNldAorCisjCisjIE1haWwgVXRpbGl0aWVzCisjCisjIENPTkZJR19NQUtFTUlNRSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9NSU1FX0NIQVJTRVQ9IiIKKyMgQ09ORklHX1BPUE1BSUxESVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QT1BNQUlMRElSX0RFTElWRVJZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFRk9STUlNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JFRk9STUlNRV9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfU0VORE1BSUwgaXMgbm90IHNldAorCisjCisjIFByb2Nlc3MgVXRpbGl0aWVzCisjCisjIENPTkZJR19GUkVFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tJTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0lMTEFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LSUxMQUxMNSBpcyBub3Qgc2V0CisjIENPTkZJR19OTUVURVIgaXMgbm90IHNldAorIyBDT05GSUdfUEdSRVAgaXMgbm90IHNldAorIyBDT05GSUdfUElET0YgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QSURPRl9TSU5HTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QSURPRl9PTUlUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFNfV0lERSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BTX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19BRERJVElPTkFMX0NPTFVNTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19VTlVTVUFMX1NZU1RFTVMgaXMgbm90IHNldAorIyBDT05GSUdfUkVOSUNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JCX1NZU0NUTCBpcyBub3Qgc2V0CisjIENPTkZJR19UT1AgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UT1BfQ1BVX0dMT0JBTF9QRVJDRU5UUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUF9TTVBfQ1BVIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVE9QX0RFQ0lNQUxTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVE9QX1NNUF9QUk9DRVNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVE9QTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hPV19USFJFQURTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VQVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSCBpcyBub3Qgc2V0CisKKyMKKyMgUnVuaXQgVXRpbGl0aWVzCisjCisjIENPTkZJR19SVU5TViBpcyBub3Qgc2V0CisjIENPTkZJR19SVU5TVkRJUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JVTlNWRElSX0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19TViBpcyBub3Qgc2V0CitDT05GSUdfU1ZfREVGQVVMVF9TRVJWSUNFX0RJUj0iIgorIyBDT05GSUdfU1ZMT0dEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUFNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVFVJREdJRCBpcyBub3Qgc2V0CisjIENPTkZJR19FTlZVSURHSUQgaXMgbm90IHNldAorIyBDT05GSUdfRU5WRElSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPRlRMSU1JVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSENPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRVRFTkZPUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFVFNFQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FEX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NQVRDSFBBVEhDT04gaXMgbm90IHNldAorIyBDT05GSUdfUkVTVE9SRUNPTiBpcyBub3Qgc2V0CisjIENPTkZJR19SVU5DT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SVU5DT05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTElOVVhFTkFCTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEVORk9SQ0UgaXMgbm90IHNldAorIyBDT05GSUdfU0VURklMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRGSUxFU19DSEVDS19PUFRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0VUU0VCT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFU1RBVFVTIGlzIG5vdCBzZXQKKworIworIyBTaGVsbHMKKyMKKyMgQ09ORklHX0FTSCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQkFTSF9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0pPQl9DT05UUk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9BTElBUyBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfR0VUT1BUUyBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQlVJTFRJTl9FQ0hPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9CVUlMVElOX1BSSU5URiBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQlVJTFRJTl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9DTURDTUQgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX01BSUwgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9SQU5ET01fU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfRVhQQU5EX1BSTVQgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0JBU0hfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSEVMUCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0lOVEVSQUNUSVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSk9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfTE9PUFMgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9DQVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfRlVOQ1RJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfTE9DQUwgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9FWFBPUlRfTiBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX1JBTkRPTV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfSVNfQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfSVNfSFVTSCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TSF9JU19OT05FPXkKKyMgQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19BU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CQVNIX0lTX0hVU0ggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19OT05FPXkKKyMgQ09ORklHX01TSCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9NQVRIX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0hfTUFUSF9TVVBQT1JUXzY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfRVhUUkFfUVVJRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9TVEFOREFMT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfTk9GT1JLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NUVFlIQUNLIGlzIG5vdCBzZXQKKworIworIyBTeXN0ZW0gTG9nZ2luZyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX1NZU0xPR0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ST1RBVEVfTE9HRklMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JFTU9URV9MT0cgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TWVNMT0dEX0RVUCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TWVNMT0dEX1JFQURfQlVGRkVSX1NJWkU9MAorIyBDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0lQQ19TWVNMT0dfQlVGRkVSX1NJWkU9MAorIyBDT05GSUdfTE9HUkVBRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xPR1JFQURfUkVEVUNFRF9MT0NLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tMT0dEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR0dFUiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9jb25maWdzL1RFU1Rfcmg5X2RlZmNvbmZpZyBiL2NvbmZpZ3MvVEVTVF9yaDlfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NzhlNDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWdzL1RFU1Rfcmg5X2RlZmNvbmZpZwpAQCAtMCwwICsxLDk0MCBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBCdXN5Ym94IHZlcnNpb246IDEuMTcuMC5naXQKKyMgRnJpIEFwciAxNiAyMjoyNToyMiAyMDEwCisjCitDT05GSUdfSEFWRV9ET1RfQ09ORklHPXkKKworIworIyBCdXN5Ym94IFNldHRpbmdzCisjCisKKyMKKyMgR2VuZXJhbCBDb25maWd1cmF0aW9uCisjCisjIENPTkZJR19ERVNLVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VYVFJBX0NPTVBBVCBpcyBub3Qgc2V0CitDT05GSUdfSU5DTFVERV9TVVN2Mj15CisjIENPTkZJR19VU0VfUE9SVEFCTEVfQ09ERSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9CVUZGRVJTX1VTRV9NQUxMT0M9eQorIyBDT05GSUdfRkVBVFVSRV9CVUZGRVJTX0dPX09OX1NUQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlVGRkVSU19HT19JTl9CU1MgaXMgbm90IHNldAorQ09ORklHX1NIT1dfVVNBR0U9eQorQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9VU0FHRT15CitDT05GSUdfRkVBVFVSRV9DT01QUkVTU19VU0FHRT15CitDT05GSUdfRkVBVFVSRV9JTlNUQUxMRVI9eQorQ09ORklHX0xPQ0FMRV9TVVBQT1JUPXkKK0NPTkZJR19VTklDT0RFX1NVUFBPUlQ9eQorIyBDT05GSUdfVU5JQ09ERV9VU0lOR19MT0NBTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEVDS19VTklDT0RFX0lOX0VOViBpcyBub3Qgc2V0CitDT05GSUdfU1VCU1RfV0NIQVI9NjMKK0NPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUj03NjcKKyMgQ09ORklHX1VOSUNPREVfQ09NQklOSU5HX1dDSEFSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX1dJREVfV0NIQVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfQklESV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfTkVVVFJBTF9UQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfTE9OR19PUFRTPXkKK0NPTkZJR19GRUFUVVJFX0RFVlBUUz15CisjIENPTkZJR19GRUFUVVJFX0NMRUFOX1VQIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1VUTVA9eQorQ09ORklHX0ZFQVRVUkVfV1RNUD15CitDT05GSUdfRkVBVFVSRV9QSURGSUxFPXkKK0NPTkZJR19GRUFUVVJFX1NVSUQ9eQorQ09ORklHX0ZFQVRVUkVfU1VJRF9DT05GSUc9eQorQ09ORklHX0ZFQVRVUkVfU1VJRF9DT05GSUdfUVVJRVQ9eQorIyBDT05GSUdfU0VMSU5VWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BSRUZFUl9BUFBMRVRTIGlzIG5vdCBzZXQKK0NPTkZJR19CVVNZQk9YX0VYRUNfUEFUSD0iL3Byb2Mvc2VsZi9leGUiCitDT05GSUdfRkVBVFVSRV9TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfSEFWRV9SUEM9eQorCisjCisjIEJ1aWxkIE9wdGlvbnMKKyMKKyMgQ09ORklHX1NUQVRJQyBpcyBub3Qgc2V0CisjIENPTkZJR19QSUUgaXMgbm90IHNldAorIyBDT05GSUdfTk9NTVUgaXMgbm90IHNldAorIyBDT05GSUdfQlVJTERfTElCQlVTWUJPWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORElWSURVQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSEFSRURfQlVTWUJPWCBpcyBub3Qgc2V0CitDT05GSUdfTEZTPXkKK0NPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVg9IiIKK0NPTkZJR19FWFRSQV9DRkxBR1M9IiIKKworIworIyBEZWJ1Z2dpbmcgT3B0aW9ucworIworIyBDT05GSUdfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUEVTU0lNSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dFUlJPUiBpcyBub3Qgc2V0CitDT05GSUdfTk9fREVCVUdfTElCPXkKKyMgQ09ORklHX0RNQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfRUZFTkNFIGlzIG5vdCBzZXQKKworIworIyBJbnN0YWxsYXRpb24gT3B0aW9ucworIworIyBDT05GSUdfSU5TVEFMTF9OT19VU1IgaXMgbm90IHNldAorQ09ORklHX0lOU1RBTExfQVBQTEVUX1NZTUxJTktTPXkKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX0hBUkRMSU5LUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9TQ1JJUFRfV1JBUFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfRE9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9TWU1MSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX0hBUkRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NDUklQVF9XUkFQUEVSIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVGSVg9Ii4vX2luc3RhbGwiCisKKyMKKyMgQnVzeWJveCBMaWJyYXJ5IFR1bmluZworIworQ09ORklHX1BBU1NXT1JEX01JTkxFTj02CitDT05GSUdfTUQ1X1NNQUxMPTEKK0NPTkZJR19GRUFUVVJFX0ZBU1RfVE9QPXkKKyMgQ09ORklHX0ZFQVRVUkVfRVRDX05FVFdPUktTIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0VESVRJTkc9eQorQ09ORklHX0ZFQVRVUkVfRURJVElOR19NQVhfTEVOPTEwMjQKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElOR19WSSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX0hJU1RPUlk9MTUKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlk9eQorQ09ORklHX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT049eQorIyBDT05GSUdfRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX0FTS19URVJNSU5BTCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9OT05fUE9TSVhfQ1A9eQorIyBDT05GSUdfRkVBVFVSRV9WRVJCT1NFX0NQX01FU1NBR0UgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQ09QWUJVRl9LQj00CisjIENPTkZJR19NT05PVE9OSUNfU1lTQ0FMTCBpcyBub3Qgc2V0CitDT05GSUdfSU9DVExfSEVYMlNUUl9FUlJPUj15CisjIENPTkZJR19GRUFUVVJFX0hXSUIgaXMgbm90IHNldAorCisjCisjIEFwcGxldHMKKyMKKworIworIyBBcmNoaXZhbCBVdGlsaXRpZXMKKyMKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0xaTUE9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfQloyPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0daPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX1o9eQorQ09ORklHX0FSPXkKK0NPTkZJR19GRUFUVVJFX0FSX0xPTkdfRklMRU5BTUVTPXkKK0NPTkZJR19GRUFUVVJFX0FSX0NSRUFURT15CitDT05GSUdfQlVOWklQMj15CitDT05GSUdfQlpJUDI9eQorQ09ORklHX0NQSU89eQorQ09ORklHX0ZFQVRVUkVfQ1BJT19PPXkKK0NPTkZJR19GRUFUVVJFX0NQSU9fUD15CisjIENPTkZJR19EUEtHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RQS0dfREVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRFBLR19ERUJfRVhUUkFDVF9PTkxZIGlzIG5vdCBzZXQKK0NPTkZJR19HVU5aSVA9eQorQ09ORklHX0daSVA9eQorQ09ORklHX0ZFQVRVUkVfR1pJUF9MT05HX09QVElPTlM9eQorQ09ORklHX0xaT1A9eQorIyBDT05GSUdfTFpPUF9DT01QUl9ISUdIIGlzIG5vdCBzZXQKK0NPTkZJR19SUE0yQ1BJTz15CitDT05GSUdfUlBNPXkKK0NPTkZJR19UQVI9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0NSRUFURT15CitDT05GSUdfRkVBVFVSRV9UQVJfQVVUT0RFVEVDVD15CitDT05GSUdfRkVBVFVSRV9UQVJfRlJPTT15CitDT05GSUdfRkVBVFVSRV9UQVJfT0xER05VX0NPTVBBVElCSUxJVFk9eQorQ09ORklHX0ZFQVRVUkVfVEFSX09MRFNVTl9DT01QQVRJQklMSVRZPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9HTlVfRVhURU5TSU9OUz15CitDT05GSUdfRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9VTkFNRV9HTkFNRT15CitDT05GSUdfRkVBVFVSRV9UQVJfTk9QUkVTRVJWRV9USU1FPXkKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX1NFTElOVVggaXMgbm90IHNldAorQ09ORklHX1VOQ09NUFJFU1M9eQorQ09ORklHX1VOTFpNQT15CitDT05GSUdfRkVBVFVSRV9MWk1BX0ZBU1Q9eQorQ09ORklHX1VOWklQPXkKKworIworIyBDb3JldXRpbHMKKyMKK0NPTkZJR19CQVNFTkFNRT15CitDT05GSUdfQ0FMPXkKK0NPTkZJR19DQVQ9eQorQ09ORklHX0NBVFY9eQorQ09ORklHX0NIR1JQPXkKK0NPTkZJR19DSE1PRD15CitDT05GSUdfQ0hPV049eQorQ09ORklHX0ZFQVRVUkVfQ0hPV05fTE9OR19PUFRJT05TPXkKK0NPTkZJR19DSFJPT1Q9eQorQ09ORklHX0NLU1VNPXkKK0NPTkZJR19DT01NPXkKK0NPTkZJR19DUD15CitDT05GSUdfRkVBVFVSRV9DUF9MT05HX09QVElPTlM9eQorQ09ORklHX0NVVD15CitDT05GSUdfREFURT15CitDT05GSUdfRkVBVFVSRV9EQVRFX0lTT0ZNVD15CitDT05GSUdfRkVBVFVSRV9EQVRFX0NPTVBBVD15CitDT05GSUdfREQ9eQorQ09ORklHX0ZFQVRVUkVfRERfU0lHTkFMX0hBTkRMSU5HPXkKK0NPTkZJR19GRUFUVVJFX0REX1RISVJEX1NUQVRVU19MSU5FPXkKK0NPTkZJR19GRUFUVVJFX0REX0lCU19PQlM9eQorQ09ORklHX0RGPXkKK0NPTkZJR19GRUFUVVJFX0RGX0ZBTkNZPXkKK0NPTkZJR19ESVJOQU1FPXkKK0NPTkZJR19ET1MyVU5JWD15CitDT05GSUdfVU5JWDJET1M9eQorQ09ORklHX0RVPXkKK0NPTkZJR19GRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLPXkKK0NPTkZJR19FQ0hPPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX0VDSE89eQorQ09ORklHX0VOVj15CitDT05GSUdfRkVBVFVSRV9FTlZfTE9OR19PUFRJT05TPXkKK0NPTkZJR19FWFBBTkQ9eQorQ09ORklHX0ZFQVRVUkVfRVhQQU5EX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRVhQUj15CitDT05GSUdfRVhQUl9NQVRIX1NVUFBPUlRfNjQ9eQorQ09ORklHX0ZBTFNFPXkKK0NPTkZJR19GT0xEPXkKK0NPTkZJR19GU1lOQz15CitDT05GSUdfSEVBRD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9IRUFEPXkKK0NPTkZJR19IT1NUSUQ9eQorQ09ORklHX0lEPXkKK0NPTkZJR19JTlNUQUxMPXkKK0NPTkZJR19GRUFUVVJFX0lOU1RBTExfTE9OR19PUFRJT05TPXkKK0NPTkZJR19MTj15CitDT05GSUdfTE9HTkFNRT15CitDT05GSUdfTFM9eQorQ09ORklHX0ZFQVRVUkVfTFNfRklMRVRZUEVTPXkKK0NPTkZJR19GRUFUVVJFX0xTX0ZPTExPV0xJTktTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1JFQ1VSU0lWRT15CitDT05GSUdfRkVBVFVSRV9MU19TT1JURklMRVM9eQorQ09ORklHX0ZFQVRVUkVfTFNfVElNRVNUQU1QUz15CitDT05GSUdfRkVBVFVSRV9MU19VU0VSTkFNRT15CitDT05GSUdfRkVBVFVSRV9MU19DT0xPUj15CitDT05GSUdfRkVBVFVSRV9MU19DT0xPUl9JU19ERUZBVUxUPXkKK0NPTkZJR19NRDVTVU09eQorQ09ORklHX01LRElSPXkKK0NPTkZJR19GRUFUVVJFX01LRElSX0xPTkdfT1BUSU9OUz15CitDT05GSUdfTUtGSUZPPXkKK0NPTkZJR19NS05PRD15CitDT05GSUdfTVY9eQorQ09ORklHX0ZFQVRVUkVfTVZfTE9OR19PUFRJT05TPXkKK0NPTkZJR19OSUNFPXkKK0NPTkZJR19OT0hVUD15CitDT05GSUdfT0Q9eQorQ09ORklHX1BSSU5URU5WPXkKK0NPTkZJR19QUklOVEY9eQorQ09ORklHX1BXRD15CitDT05GSUdfUkVBRExJTks9eQorQ09ORklHX0ZFQVRVUkVfUkVBRExJTktfRk9MTE9XPXkKK0NPTkZJR19SRUFMUEFUSD15CitDT05GSUdfUk09eQorQ09ORklHX1JNRElSPXkKK0NPTkZJR19GRUFUVVJFX1JNRElSX0xPTkdfT1BUSU9OUz15CitDT05GSUdfU0VRPXkKK0NPTkZJR19TSEExU1VNPXkKK0NPTkZJR19TSEEyNTZTVU09eQorQ09ORklHX1NIQTUxMlNVTT15CitDT05GSUdfU0xFRVA9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfU0xFRVA9eQorQ09ORklHX0ZFQVRVUkVfRkxPQVRfU0xFRVA9eQorQ09ORklHX1NPUlQ9eQorQ09ORklHX0ZFQVRVUkVfU09SVF9CSUc9eQorQ09ORklHX1NQTElUPXkKK0NPTkZJR19GRUFUVVJFX1NQTElUX0ZBTkNZPXkKK0NPTkZJR19TVEFUPXkKK0NPTkZJR19GRUFUVVJFX1NUQVRfRk9STUFUPXkKK0NPTkZJR19TVFRZPXkKK0NPTkZJR19TVU09eQorQ09ORklHX1NZTkM9eQorQ09ORklHX1RBQz15CitDT05GSUdfVEFJTD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9UQUlMPXkKK0NPTkZJR19URUU9eQorQ09ORklHX0ZFQVRVUkVfVEVFX1VTRV9CTE9DS19JTz15CitDT05GSUdfVEVTVD15CitDT05GSUdfRkVBVFVSRV9URVNUXzY0PXkKK0NPTkZJR19UT1VDSD15CitDT05GSUdfVFI9eQorQ09ORklHX0ZFQVRVUkVfVFJfQ0xBU1NFUz15CitDT05GSUdfRkVBVFVSRV9UUl9FUVVJVj15CitDT05GSUdfVFJVRT15CitDT05GSUdfVFRZPXkKK0NPTkZJR19VTkFNRT15CitDT05GSUdfVU5FWFBBTkQ9eQorQ09ORklHX0ZFQVRVUkVfVU5FWFBBTkRfTE9OR19PUFRJT05TPXkKK0NPTkZJR19VTklRPXkKK0NPTkZJR19VU0xFRVA9eQorQ09ORklHX1VVREVDT0RFPXkKK0NPTkZJR19VVUVOQ09ERT15CitDT05GSUdfV0M9eQorQ09ORklHX0ZFQVRVUkVfV0NfTEFSR0U9eQorQ09ORklHX1dITz15CitDT05GSUdfV0hPQU1JPXkKK0NPTkZJR19ZRVM9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBjcCBhbmQgbXYKKyMKK0NPTkZJR19GRUFUVVJFX1BSRVNFUlZFX0hBUkRMSU5LUz15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGxzLCBtb3JlIGFuZCB0ZWxuZXQKKyMKK0NPTkZJR19GRUFUVVJFX0FVVE9XSURUSD15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGRmLCBkdSwgbHMKKyMKK0NPTkZJR19GRUFUVVJFX0hVTUFOX1JFQURBQkxFPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbWQ1c3VtLCBzaGExc3VtLCBzaGEyNTZzdW0sIHNoYTUxMnN1bQorIworQ09ORklHX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLPXkKKworIworIyBDb25zb2xlIFV0aWxpdGllcworIworQ09ORklHX0NIVlQ9eQorQ09ORklHX0NMRUFSPXkKK0NPTkZJR19ERUFMTE9DVlQ9eQorQ09ORklHX0RVTVBLTUFQPXkKK0NPTkZJR19LQkRfTU9ERT15CitDT05GSUdfTE9BREZPTlQ9eQorQ09ORklHX0xPQURLTUFQPXkKK0NPTkZJR19PUEVOVlQ9eQorQ09ORklHX1JFU0VUPXkKK0NPTkZJR19SRVNJWkU9eQorQ09ORklHX0ZFQVRVUkVfUkVTSVpFX1BSSU5UPXkKK0NPTkZJR19TRVRDT05TT0xFPXkKK0NPTkZJR19GRUFUVVJFX1NFVENPTlNPTEVfTE9OR19PUFRJT05TPXkKK0NPTkZJR19TRVRGT05UPXkKK0NPTkZJR19GRUFUVVJFX1NFVEZPTlRfVEVYVFVBTF9NQVA9eQorQ09ORklHX0RFRkFVTFRfU0VURk9OVF9ESVI9IiIKK0NPTkZJR19TRVRLRVlDT0RFUz15CitDT05GSUdfU0VUTE9HQ09OUz15CitDT05GSUdfU0hPV0tFWT15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGxvYWRmb250IGFuZCBzZXRmb250CisjCisjIENPTkZJR19GRUFUVVJFX0xPQURGT05UX1BTRjIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MT0FERk9OVF9SQVcgaXMgbm90IHNldAorCisjCisjIERlYmlhbiBVdGlsaXRpZXMKKyMKK0NPTkZJR19NS1RFTVA9eQorQ09ORklHX1BJUEVfUFJPR1JFU1M9eQorQ09ORklHX1JVTl9QQVJUUz15CitDT05GSUdfRkVBVFVSRV9SVU5fUEFSVFNfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX1JVTl9QQVJUU19GQU5DWT15CitDT05GSUdfU1RBUlRfU1RPUF9EQUVNT049eQorQ09ORklHX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fRkFOQ1k9eQorQ09ORklHX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fTE9OR19PUFRJT05TPXkKK0NPTkZJR19XSElDSD15CisKKyMKKyMgRWRpdG9ycworIworQ09ORklHX0FXSz15CitDT05GSUdfRkVBVFVSRV9BV0tfTElCTT15CitDT05GSUdfQ01QPXkKK0NPTkZJR19ESUZGPXkKK0NPTkZJR19GRUFUVVJFX0RJRkZfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX0RJRkZfRElSPXkKK0NPTkZJR19FRD15CitDT05GSUdfUEFUQ0g9eQorQ09ORklHX1NFRD15CitDT05GSUdfVkk9eQorQ09ORklHX0ZFQVRVUkVfVklfTUFYX0xFTj00MDk2CisjIENPTkZJR19GRUFUVVJFX1ZJXzhCSVQgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVklfQ09MT049eQorQ09ORklHX0ZFQVRVUkVfVklfWUFOS01BUks9eQorQ09ORklHX0ZFQVRVUkVfVklfU0VBUkNIPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1VTRV9TSUdOQUxTPXkKK0NPTkZJR19GRUFUVVJFX1ZJX0RPVF9DTUQ9eQorQ09ORklHX0ZFQVRVUkVfVklfUkVBRE9OTFk9eQorQ09ORklHX0ZFQVRVUkVfVklfU0VUT1BUUz15CitDT05GSUdfRkVBVFVSRV9WSV9TRVQ9eQorQ09ORklHX0ZFQVRVUkVfVklfV0lOX1JFU0laRT15CitDT05GSUdfRkVBVFVSRV9BTExPV19FWEVDPXkKKworIworIyBGaW5kaW5nIFV0aWxpdGllcworIworQ09ORklHX0ZJTkQ9eQorQ09ORklHX0ZFQVRVUkVfRklORF9QUklOVDA9eQorQ09ORklHX0ZFQVRVUkVfRklORF9NVElNRT15CitDT05GSUdfRkVBVFVSRV9GSU5EX01NSU49eQorQ09ORklHX0ZFQVRVUkVfRklORF9QRVJNPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfVFlQRT15CitDT05GSUdfRkVBVFVSRV9GSU5EX1hERVY9eQorQ09ORklHX0ZFQVRVUkVfRklORF9NQVhERVBUSD15CitDT05GSUdfRkVBVFVSRV9GSU5EX05FV0VSPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfSU5VTT15CitDT05GSUdfRkVBVFVSRV9GSU5EX0VYRUM9eQorQ09ORklHX0ZFQVRVUkVfRklORF9VU0VSPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfR1JPVVA9eQorQ09ORklHX0ZFQVRVUkVfRklORF9OT1Q9eQorQ09ORklHX0ZFQVRVUkVfRklORF9ERVBUSD15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BBUkVOPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfU0laRT15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BSVU5FPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfREVMRVRFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUEFUSD15CitDT05GSUdfRkVBVFVSRV9GSU5EX1JFR0VYPXkKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9DT05URVhUIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTElOS1M9eQorQ09ORklHX0dSRVA9eQorQ09ORklHX0ZFQVRVUkVfR1JFUF9FR1JFUF9BTElBUz15CitDT05GSUdfRkVBVFVSRV9HUkVQX0ZHUkVQX0FMSUFTPXkKK0NPTkZJR19GRUFUVVJFX0dSRVBfQ09OVEVYVD15CitDT05GSUdfWEFSR1M9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT049eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9RVU9URVM9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9URVJNT1BUPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNPXkKKworIworIyBJbml0IFV0aWxpdGllcworIworQ09ORklHX0lOSVQ9eQorQ09ORklHX0ZFQVRVUkVfVVNFX0lOSVRUQUI9eQorIyBDT05GSUdfRkVBVFVSRV9LSUxMX1JFTU9WRUQgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfS0lMTF9ERUxBWT0wCitDT05GSUdfRkVBVFVSRV9JTklUX1NDVFRZPXkKK0NPTkZJR19GRUFUVVJFX0lOSVRfU1lTTE9HPXkKK0NPTkZJR19GRUFUVVJFX0VYVFJBX1FVSUVUPXkKK0NPTkZJR19GRUFUVVJFX0lOSVRfQ09SRURVTVBTPXkKK0NPTkZJR19GRUFUVVJFX0lOSVRSRD15CitDT05GSUdfSEFMVD15CisjIENPTkZJR19GRUFUVVJFX0NBTExfVEVMSU5JVCBpcyBub3Qgc2V0CitDT05GSUdfVEVMSU5JVF9QQVRIPSIiCitDT05GSUdfTUVTRz15CisKKyMKKyMgTG9naW4vUGFzc3dvcmQgTWFuYWdlbWVudCBVdGlsaXRpZXMKKyMKK0NPTkZJR19GRUFUVVJFX1NIQURPV1BBU1NXRFM9eQorQ09ORklHX1VTRV9CQl9QV0RfR1JQPXkKK0NPTkZJR19VU0VfQkJfU0hBRE9XPXkKK0NPTkZJR19VU0VfQkJfQ1JZUFQ9eQorQ09ORklHX1VTRV9CQl9DUllQVF9TSEE9eQorQ09ORklHX0FEREdST1VQPXkKK0NPTkZJR19GRUFUVVJFX0FEREdST1VQX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRkVBVFVSRV9BRERVU0VSX1RPX0dST1VQPXkKK0NPTkZJR19ERUxHUk9VUD15CitDT05GSUdfRkVBVFVSRV9ERUxfVVNFUl9GUk9NX0dST1VQPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfTkFNRVMgaXMgbm90IHNldAorQ09ORklHX0FERFVTRVI9eQorQ09ORklHX0ZFQVRVUkVfQUREVVNFUl9MT05HX09QVElPTlM9eQorQ09ORklHX0ZJUlNUX1NZU1RFTV9JRD0xMDAKK0NPTkZJR19MQVNUX1NZU1RFTV9JRD05OTkKK0NPTkZJR19ERUxVU0VSPXkKK0NPTkZJR19HRVRUWT15CitDT05GSUdfTE9HSU49eQorIyBDT05GSUdfUEFNIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dJTl9TQ1JJUFRTPXkKK0NPTkZJR19GRUFUVVJFX05PTE9HSU49eQorQ09ORklHX0ZFQVRVUkVfU0VDVVJFVFRZPXkKK0NPTkZJR19QQVNTV0Q9eQorQ09ORklHX0ZFQVRVUkVfUEFTU1dEX1dFQUtfQ0hFQ0s9eQorQ09ORklHX0NSWVBUUFc9eQorQ09ORklHX0NIUEFTU1dEPXkKK0NPTkZJR19TVT15CitDT05GSUdfRkVBVFVSRV9TVV9TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfU1VfQ0hFQ0tTX1NIRUxMUz15CitDT05GSUdfU1VMT0dJTj15CitDT05GSUdfVkxPQ0s9eQorCisjCisjIExpbnV4IEV4dDIgRlMgUHJvZ3MKKyMKK0NPTkZJR19DSEFUVFI9eQorQ09ORklHX0ZTQ0s9eQorQ09ORklHX0xTQVRUUj15CisKKyMKKyMgTGludXggTW9kdWxlIFV0aWxpdGllcworIworQ09ORklHX01PRFBST0JFX1NNQUxMPXkKK0NPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX09QVElPTlNfT05fQ01ETElORT15CitDT05GSUdfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9DSEVDS19BTFJFQURZX0xPQURFRD15CisjIENPTkZJR19JTlNNT0QgaXMgbm90IHNldAorIyBDT05GSUdfUk1NT0QgaXMgbm90IHNldAorIyBDT05GSUdfTFNNT0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MU01PRF9QUkVUVFlfMl82X09VVFBVVCBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RQUk9CRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFBST0JFX0JMQUNLTElTVCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVBNT0QgaXMgbm90IHNldAorCisjCisjIE9wdGlvbnMgY29tbW9uIHRvIG11bHRpcGxlIG1vZHV0aWxzCisjCisjIENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1RSWV9NTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfS1NZTU9PUFNfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FESU5LTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQX0ZVTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFVUSUxTX0FMSUFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EVVRJTFNfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9NT0RVTEVTX0RJUj0iL2xpYi9tb2R1bGVzIgorQ09ORklHX0RFRkFVTFRfREVQTU9EX0ZJTEU9Im1vZHVsZXMuZGVwIgorCisjCisjIExpbnV4IFN5c3RlbSBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0FDUElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUNQSURfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtJRD15CitDT05GSUdfRE1FU0c9eQorQ09ORklHX0ZFQVRVUkVfRE1FU0dfUFJFVFRZPXkKK0NPTkZJR19GQlNFVD15CitDT05GSUdfRkVBVFVSRV9GQlNFVF9GQU5DWT15CitDT05GSUdfRkVBVFVSRV9GQlNFVF9SRUFETU9ERT15CitDT05GSUdfRkRGTFVTSD15CitDT05GSUdfRkRGT1JNQVQ9eQorQ09ORklHX0ZESVNLPXkKK0NPTkZJR19GRElTS19TVVBQT1JUX0xBUkdFX0RJU0tTPXkKK0NPTkZJR19GRUFUVVJFX0ZESVNLX1dSSVRBQkxFPXkKKyMgQ09ORklHX0ZFQVRVUkVfQUlYX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0dJX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VOX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfT1NGX0xBQkVMIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0ZESVNLX0FEVkFOQ0VEPXkKK0NPTkZJR19GSU5ERlM9eQorIyBDT05GSUdfRkxPQ0sgaXMgbm90IHNldAorQ09ORklHX0ZSRUVSQU1ESVNLPXkKK0NPTkZJR19GU0NLX01JTklYPXkKKyMgQ09ORklHX01LRlNfRVhUMiBpcyBub3Qgc2V0CitDT05GSUdfTUtGU19NSU5JWD15CisKKyMKKyMgTWluaXggZmlsZXN5c3RlbSBzdXBwb3J0CisjCitDT05GSUdfRkVBVFVSRV9NSU5JWDI9eQorIyBDT05GSUdfTUtGU19SRUlTRVIgaXMgbm90IHNldAorQ09ORklHX01LRlNfVkZBVD15CitDT05GSUdfR0VUT1BUPXkKK0NPTkZJR19GRUFUVVJFX0dFVE9QVF9MT05HPXkKK0NPTkZJR19IRVhEVU1QPXkKK0NPTkZJR19GRUFUVVJFX0hFWERVTVBfUkVWRVJTRT15CitDT05GSUdfSEQ9eQorQ09ORklHX0hXQ0xPQ0s9eQorQ09ORklHX0ZFQVRVUkVfSFdDTE9DS19MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfSFdDTE9DS19BREpUSU1FX0ZIUz15CitDT05GSUdfSVBDUk09eQorQ09ORklHX0lQQ1M9eQorQ09ORklHX0xPU0VUVVA9eQorQ09ORklHX0xTUENJPXkKK0NPTkZJR19MU1VTQj15CitDT05GSUdfTURFVj15CitDT05GSUdfRkVBVFVSRV9NREVWX0NPTkY9eQorQ09ORklHX0ZFQVRVUkVfTURFVl9SRU5BTUU9eQorQ09ORklHX0ZFQVRVUkVfTURFVl9SRU5BTUVfUkVHRVhQPXkKK0NPTkZJR19GRUFUVVJFX01ERVZfRVhFQz15CitDT05GSUdfRkVBVFVSRV9NREVWX0xPQURfRklSTVdBUkU9eQorQ09ORklHX01LU1dBUD15CitDT05GSUdfRkVBVFVSRV9NS1NXQVBfVVVJRD15CitDT05GSUdfTU9SRT15CitDT05GSUdfRkVBVFVSRV9VU0VfVEVSTUlPUz15CitDT05GSUdfVk9MVU1FSUQ9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfRVhUPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0JUUkZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1JFSVNFUkZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0ZBVD15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9IRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSkZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1hGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9OVEZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0lTTzk2NjA9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfVURGPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xVS1M9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTElOVVhTV0FQPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0NSQU1GUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9ST01GUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9TWVNWPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX09DRlMyPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xJTlVYUkFJRD15CitDT05GSUdfTU9VTlQ9eQorQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkFLRT15CitDT05GSUdfRkVBVFVSRV9NT1VOVF9WRVJCT1NFPXkKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfSEVMUEVSUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9NT1VOVF9MQUJFTD15CisjIENPTkZJR19GRUFUVVJFX01PVU5UX05GUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9NT1VOVF9DSUZTPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0ZMQUdTPXkKK0NPTkZJR19GRUFUVVJFX01PVU5UX0ZTVEFCPXkKK0NPTkZJR19QSVZPVF9ST09UPXkKK0NPTkZJR19SREFURT15CitDT05GSUdfUkRFVj15CitDT05GSUdfUkVBRFBST0ZJTEU9eQorQ09ORklHX1JUQ1dBS0U9eQorQ09ORklHX1NDUklQVD15CitDT05GSUdfU0NSSVBUUkVQTEFZPXkKK0NPTkZJR19TRVRBUkNIPXkKK0NPTkZJR19TV0FQT05PRkY9eQorQ09ORklHX0ZFQVRVUkVfU1dBUE9OX1BSST15CitDT05GSUdfU1dJVENIX1JPT1Q9eQorQ09ORklHX1VNT1VOVD15CitDT05GSUdfRkVBVFVSRV9VTU9VTlRfQUxMPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbW91bnQvdW1vdW50CisjCitDT05GSUdfRkVBVFVSRV9NT1VOVF9MT09QPXkKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTE9PUF9DUkVBVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NVEFCX1NVUFBPUlQgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVXRpbGl0aWVzCisjCitDT05GSUdfQURKVElNRVg9eQorIyBDT05GSUdfQkJDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0JFRVA9eQorQ09ORklHX0ZFQVRVUkVfQkVFUF9GUkVRPTQwMDAKK0NPTkZJR19GRUFUVVJFX0JFRVBfTEVOR1RIX01TPTMwCitDT05GSUdfQ0hBVD15CitDT05GSUdfRkVBVFVSRV9DSEFUX05PRkFJTD15CisjIENPTkZJR19GRUFUVVJFX0NIQVRfVFRZX0hJRkkgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQ0hBVF9JTVBMSUNJVF9DUj15CitDT05GSUdfRkVBVFVSRV9DSEFUX1NXQUxMT1dfT1BUUz15CitDT05GSUdfRkVBVFVSRV9DSEFUX1NFTkRfRVNDQVBFUz15CitDT05GSUdfRkVBVFVSRV9DSEFUX1ZBUl9BQk9SVF9MRU49eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9DTFJfQUJPUlQ9eQorQ09ORklHX0NIUlQ9eQorQ09ORklHX0NST05EPXkKK0NPTkZJR19GRUFUVVJFX0NST05EX0Q9eQorQ09ORklHX0ZFQVRVUkVfQ1JPTkRfQ0FMTF9TRU5ETUFJTD15CitDT05GSUdfRkVBVFVSRV9DUk9ORF9ESVI9Ii92YXIvc3Bvb2wvY3JvbiIKK0NPTkZJR19DUk9OVEFCPXkKK0NPTkZJR19EQz15CitDT05GSUdfRkVBVFVSRV9EQ19MSUJNPXkKKyMgQ09ORklHX0RFVkZTRCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfTU9ETE9BRCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfRkdfTlAgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERVZGUyBpcyBub3Qgc2V0CitDT05GSUdfREVWTUVNPXkKK0NPTkZJR19FSkVDVD15CitDT05GSUdfRkVBVFVSRV9FSkVDVF9TQ1NJPXkKK0NPTkZJR19GQlNQTEFTSD15CisjIENPTkZJR19GTEFTSENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkxBU0hfVU5MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX0VSQVNFQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPTklDRSBpcyBub3Qgc2V0CisjIENPTkZJR19JTk9USUZZRCBpcyBub3Qgc2V0CitDT05GSUdfTEFTVD15CisjIENPTkZJR19GRUFUVVJFX0xBU1RfU01BTEwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTEFTVF9GQU5DWT15CitDT05GSUdfTEVTUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX01BWExJTkVTPTk5OTk5OTkKK0NPTkZJR19GRUFUVVJFX0xFU1NfQlJBQ0tFVFM9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19GTEFHUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX01BUktTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfUkVHRVhQPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfV0lOQ0g9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19EQVNIQ01EPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfTElORU5VTVM9eQorQ09ORklHX0hEUEFSTT15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZPXkKK0NPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1NDQU5fSFdJRj15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19VTlJFR0lTVEVSX0hXSUY9eQorQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fRFJJVkVfUkVTRVQ9eQorQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRj15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19HRVRTRVRfRE1BPXkKK0NPTkZJR19NQUtFREVWUz15CisjIENPTkZJR19GRUFUVVJFX01BS0VERVZTX0xFQUYgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTUFLRURFVlNfVEFCTEU9eQorQ09ORklHX01BTj15CitDT05GSUdfTUlDUk9DT009eQorQ09ORklHX01PVU5UUE9JTlQ9eQorQ09ORklHX01UPXkKK0NPTkZJR19SQUlEQVVUT1JVTj15CisjIENPTkZJR19SRUFEQUhFQUQgaXMgbm90IHNldAorQ09ORklHX1JVTkxFVkVMPXkKK0NPTkZJR19SWD15CitDT05GSUdfU0VUU0lEPXkKK0NPTkZJR19TVFJJTkdTPXkKKyMgQ09ORklHX1RBU0tTRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVNLU0VUX0ZBTkNZIGlzIG5vdCBzZXQKK0NPTkZJR19USU1FPXkKK0NPTkZJR19USU1FT1VUPXkKK0NPTkZJR19UVFlTSVpFPXkKK0NPTkZJR19WT0xOQU1FPXkKK0NPTkZJR19XQUxMPXkKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nIFV0aWxpdGllcworIworQ09ORklHX0ZFQVRVUkVfSVBWNj15CisjIENPTkZJR19GRUFUVVJFX1VOSVhfTE9DQUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0lQVjRfQUREUkVTUz15CisjIENPTkZJR19WRVJCT1NFX1JFU09MVVRJT05fRVJST1JTIGlzIG5vdCBzZXQKK0NPTkZJR19BUlA9eQorQ09ORklHX0FSUElORz15CitDT05GSUdfQlJDVEw9eQorQ09ORklHX0ZFQVRVUkVfQlJDVExfRkFOQ1k9eQorQ09ORklHX0ZFQVRVUkVfQlJDVExfU0hPVz15CitDT05GSUdfRE5TRD15CitDT05GSUdfRVRIRVJfV0FLRT15CitDT05GSUdfRkFLRUlERU5URD15CitDT05GSUdfRlRQRD15CitDT05GSUdfRkVBVFVSRV9GVFBfV1JJVEU9eQorQ09ORklHX0ZFQVRVUkVfRlRQRF9BQ0NFUFRfQlJPS0VOX0xJU1Q9eQorQ09ORklHX0ZUUEdFVD15CitDT05GSUdfRlRQUFVUPXkKK0NPTkZJR19GRUFUVVJFX0ZUUEdFVFBVVF9MT05HX09QVElPTlM9eQorQ09ORklHX0hPU1ROQU1FPXkKK0NPTkZJR19IVFRQRD15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9SQU5HRVM9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfVVNFX1NFTkRGSUxFPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1NFVFVJRD15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRIPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1PXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0NHST15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9DT05GSUdfV0lUSF9TQ1JJUFRfSU5URVJQUj15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9TRVRfUkVNT1RFX1BPUlRfVE9fRU5WPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0VOQ09ERV9VUkxfU1RSPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0VSUk9SX1BBR0VTPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1BST1hZPXkKK0NPTkZJR19JRkNPTkZJRz15CitDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19TVEFUVVM9eQorQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfU0xJUD15CitDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19NRU1TVEFSVF9JT0FERFJfSVJRPXkKK0NPTkZJR19GRUFUVVJFX0lGQ09ORklHX0hXPXkKK0NPTkZJR19GRUFUVVJFX0lGQ09ORklHX0JST0FEQ0FTVF9QTFVTPXkKKyMgQ09ORklHX0lGRU5TTEFWRSBpcyBub3Qgc2V0CitDT05GSUdfSUZQTFVHRD15CitDT05GSUdfSUZVUERPV049eQorQ09ORklHX0lGVVBET1dOX0lGU1RBVEVfUEFUSD0iL3Zhci9ydW4vaWZzdGF0ZSIKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQPXkKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQX0JVSUxUSU49eQorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JRkNPTkZJR19CVUlMVElOIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQVjQ9eQorQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWNj15CitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HPXkKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fRVhURVJOQUxfREhDUCBpcyBub3Qgc2V0CitDT05GSUdfSU5FVEQ9eQorQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0VDSE89eQorQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RJU0NBUkQ9eQorQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX1RJTUU9eQorQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RBWVRJTUU9eQorQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0NIQVJHRU49eQorQ09ORklHX0ZFQVRVUkVfSU5FVERfUlBDPXkKK0NPTkZJR19JUD15CitDT05GSUdfRkVBVFVSRV9JUF9BRERSRVNTPXkKK0NPTkZJR19GRUFUVVJFX0lQX0xJTks9eQorQ09ORklHX0ZFQVRVUkVfSVBfUk9VVEU9eQorQ09ORklHX0ZFQVRVUkVfSVBfVFVOTkVMPXkKK0NPTkZJR19GRUFUVVJFX0lQX1JVTEU9eQorQ09ORklHX0ZFQVRVUkVfSVBfU0hPUlRfRk9STVM9eQorIyBDT05GSUdfRkVBVFVSRV9JUF9SQVJFX1BST1RPQ09MUyBpcyBub3Qgc2V0CitDT05GSUdfSVBBRERSPXkKK0NPTkZJR19JUExJTks9eQorQ09ORklHX0lQUk9VVEU9eQorQ09ORklHX0lQVFVOTkVMPXkKK0NPTkZJR19JUFJVTEU9eQorQ09ORklHX0lQQ0FMQz15CitDT05GSUdfRkVBVFVSRV9JUENBTENfRkFOQ1k9eQorQ09ORklHX0ZFQVRVUkVfSVBDQUxDX0xPTkdfT1BUSU9OUz15CitDT05GSUdfTkFNRUlGPXkKK0NPTkZJR19GRUFUVVJFX05BTUVJRl9FWFRFTkRFRD15CitDT05GSUdfTkM9eQorQ09ORklHX05DX1NFUlZFUj15CitDT05GSUdfTkNfRVhUUkE9eQorQ09ORklHX05FVFNUQVQ9eQorQ09ORklHX0ZFQVRVUkVfTkVUU1RBVF9XSURFPXkKK0NPTkZJR19GRUFUVVJFX05FVFNUQVRfUFJHPXkKK0NPTkZJR19OU0xPT0tVUD15CitDT05GSUdfTlRQRD15CitDT05GSUdfRkVBVFVSRV9OVFBEX1NFUlZFUj15CitDT05GSUdfUElORz15CitDT05GSUdfUElORzY9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfUElORz15CitDT05GSUdfUFNDQU49eQorQ09ORklHX1JPVVRFPXkKK0NPTkZJR19TTEFUVEFDSD15CitDT05GSUdfVENQU1ZEPXkKK0NPTkZJR19URUxORVQ9eQorQ09ORklHX0ZFQVRVUkVfVEVMTkVUX1RUWVBFPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVF9BVVRPTE9HSU49eQorQ09ORklHX1RFTE5FVEQ9eQorQ09ORklHX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVERfSU5FVERfV0FJVD15CitDT05GSUdfVEZUUD15CitDT05GSUdfVEZUUEQ9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9HRVQ9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9QVVQ9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkU9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9QUk9HUkVTU19CQVI9eQorIyBDT05GSUdfVEZUUF9ERUJVRyBpcyBub3Qgc2V0CitDT05GSUdfVFJBQ0VST1VURT15CitDT05GSUdfVFJBQ0VST1VURTY9eQorQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFPXkKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1VTRV9JQ01QIGlzIG5vdCBzZXQKK0NPTkZJR19UVU5DVEw9eQorQ09ORklHX0ZFQVRVUkVfVFVOQ1RMX1VHPXkKK0NPTkZJR19VREhDUEQ9eQorQ09ORklHX0RIQ1BSRUxBWT15CitDT05GSUdfRFVNUExFQVNFUz15CitDT05GSUdfRkVBVFVSRV9VREhDUERfV1JJVEVfTEVBU0VTX0VBUkxZPXkKK0NPTkZJR19ESENQRF9MRUFTRVNfRklMRT0iL3Zhci9saWIvbWlzYy91ZGhjcGQubGVhc2VzIgorQ09ORklHX1VESENQQz15CitDT05GSUdfRkVBVFVSRV9VREhDUENfQVJQSU5HPXkKK0NPTkZJR19GRUFUVVJFX1VESENQX1BPUlQ9eQorQ09ORklHX1VESENQX0RFQlVHPTkKK0NPTkZJR19GRUFUVVJFX1VESENQX1JGQzMzOTc9eQorQ09ORklHX1VESENQQ19ERUZBVUxUX1NDUklQVD0iL3Vzci9zaGFyZS91ZGhjcGMvZGVmYXVsdC5zY3JpcHQiCitDT05GSUdfVURIQ1BDX1NMQUNLX0ZPUl9CVUdHWV9TRVJWRVJTPTgwCitDT05GSUdfSUZVUERPV05fVURIQ1BDX0NNRF9PUFRJT05TPSItUiAtbiIKK0NPTkZJR19VRFBTVkQ9eQorQ09ORklHX1ZDT05GSUc9eQorQ09ORklHX1dHRVQ9eQorQ09ORklHX0ZFQVRVUkVfV0dFVF9TVEFUVVNCQVI9eQorQ09ORklHX0ZFQVRVUkVfV0dFVF9BVVRIRU5USUNBVElPTj15CitDT05GSUdfRkVBVFVSRV9XR0VUX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRkVBVFVSRV9XR0VUX1RJTUVPVVQ9eQorQ09ORklHX1pDSVA9eQorCisjCisjIFByaW50IFV0aWxpdGllcworIworQ09ORklHX0xQRD15CitDT05GSUdfTFBSPXkKK0NPTkZJR19MUFE9eQorCisjCisjIE1haWwgVXRpbGl0aWVzCisjCitDT05GSUdfTUFLRU1JTUU9eQorQ09ORklHX0ZFQVRVUkVfTUlNRV9DSEFSU0VUPSJ1cy1hc2NpaSIKK0NPTkZJR19QT1BNQUlMRElSPXkKK0NPTkZJR19GRUFUVVJFX1BPUE1BSUxESVJfREVMSVZFUlk9eQorQ09ORklHX1JFRk9STUlNRT15CitDT05GSUdfRkVBVFVSRV9SRUZPUk1JTUVfQ09NUEFUPXkKK0NPTkZJR19TRU5ETUFJTD15CisKKyMKKyMgUHJvY2VzcyBVdGlsaXRpZXMKKyMKK0NPTkZJR19GUkVFPXkKK0NPTkZJR19GVVNFUj15CitDT05GSUdfS0lMTD15CitDT05GSUdfS0lMTEFMTD15CitDT05GSUdfS0lMTEFMTDU9eQorQ09ORklHX05NRVRFUj15CitDT05GSUdfUEdSRVA9eQorQ09ORklHX1BJRE9GPXkKK0NPTkZJR19GRUFUVVJFX1BJRE9GX1NJTkdMRT15CitDT05GSUdfRkVBVFVSRV9QSURPRl9PTUlUPXkKK0NPTkZJR19QS0lMTD15CitDT05GSUdfUFM9eQorQ09ORklHX0ZFQVRVUkVfUFNfV0lERT15CisjIENPTkZJR19GRUFUVVJFX1BTX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19BRERJVElPTkFMX0NPTFVNTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19VTlVTVUFMX1NZU1RFTVMgaXMgbm90IHNldAorQ09ORklHX1JFTklDRT15CitDT05GSUdfQkJfU1lTQ1RMPXkKK0NPTkZJR19UT1A9eQorQ09ORklHX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9DUFVfR0xPQkFMX1BFUkNFTlRTPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9TTVBfQ1BVPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9ERUNJTUFMUz15CitDT05GSUdfRkVBVFVSRV9UT1BfU01QX1BST0NFU1M9eQorQ09ORklHX0ZFQVRVUkVfVE9QTUVNPXkKK0NPTkZJR19GRUFUVVJFX1NIT1dfVEhSRUFEUz15CitDT05GSUdfVVBUSU1FPXkKK0NPTkZJR19XQVRDSD15CisKKyMKKyMgUnVuaXQgVXRpbGl0aWVzCisjCitDT05GSUdfUlVOU1Y9eQorQ09ORklHX1JVTlNWRElSPXkKKyMgQ09ORklHX0ZFQVRVUkVfUlVOU1ZESVJfTE9HIGlzIG5vdCBzZXQKK0NPTkZJR19TVj15CitDT05GSUdfU1ZfREVGQVVMVF9TRVJWSUNFX0RJUj0iL3Zhci9zZXJ2aWNlIgorQ09ORklHX1NWTE9HRD15CitDT05GSUdfQ0hQU1Q9eQorQ09ORklHX1NFVFVJREdJRD15CitDT05GSUdfRU5WVUlER0lEPXkKK0NPTkZJR19FTlZESVI9eQorQ09ORklHX1NPRlRMSU1JVD15CisjIENPTkZJR19DSENPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRVRFTkZPUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFVFNFQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FEX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NQVRDSFBBVEhDT04gaXMgbm90IHNldAorIyBDT05GSUdfUkVTVE9SRUNPTiBpcyBub3Qgc2V0CisjIENPTkZJR19SVU5DT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SVU5DT05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTElOVVhFTkFCTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEVORk9SQ0UgaXMgbm90IHNldAorIyBDT05GSUdfU0VURklMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRGSUxFU19DSEVDS19PUFRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0VUU0VCT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFU1RBVFVTIGlzIG5vdCBzZXQKKworIworIyBTaGVsbHMKKyMKK0NPTkZJR19GRUFUVVJFX1NIX0lTX0FTSD15CisjIENPTkZJR19GRUFUVVJFX1NIX0lTX0hVU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9JU19OT05FIGlzIG5vdCBzZXQKK0NPTkZJR19BU0g9eQorQ09ORklHX0FTSF9CQVNIX0NPTVBBVD15CitDT05GSUdfQVNIX0pPQl9DT05UUk9MPXkKK0NPTkZJR19BU0hfQUxJQVM9eQorQ09ORklHX0FTSF9HRVRPUFRTPXkKK0NPTkZJR19BU0hfQlVJTFRJTl9FQ0hPPXkKK0NPTkZJR19BU0hfQlVJTFRJTl9QUklOVEY9eQorQ09ORklHX0FTSF9CVUlMVElOX1RFU1Q9eQorQ09ORklHX0FTSF9DTURDTUQ9eQorIyBDT05GSUdfQVNIX01BSUwgaXMgbm90IHNldAorQ09ORklHX0FTSF9PUFRJTUlaRV9GT1JfU0laRT15CitDT05GSUdfQVNIX1JBTkRPTV9TVVBQT1JUPXkKK0NPTkZJR19BU0hfRVhQQU5EX1BSTVQ9eQorQ09ORklHX0hVU0g9eQorQ09ORklHX0hVU0hfQkFTSF9DT01QQVQ9eQorQ09ORklHX0hVU0hfSEVMUD15CitDT05GSUdfSFVTSF9JTlRFUkFDVElWRT15CitDT05GSUdfSFVTSF9KT0I9eQorQ09ORklHX0hVU0hfVElDSz15CitDT05GSUdfSFVTSF9JRj15CitDT05GSUdfSFVTSF9MT09QUz15CitDT05GSUdfSFVTSF9DQVNFPXkKK0NPTkZJR19IVVNIX0ZVTkNUSU9OUz15CitDT05GSUdfSFVTSF9MT0NBTD15CitDT05GSUdfSFVTSF9FWFBPUlRfTj15CitDT05GSUdfSFVTSF9SQU5ET01fU1VQUE9SVD15CitDT05GSUdfTVNIPXkKK0NPTkZJR19TSF9NQVRIX1NVUFBPUlQ9eQorQ09ORklHX1NIX01BVEhfU1VQUE9SVF82ND15CitDT05GSUdfRkVBVFVSRV9TSF9FWFRSQV9RVUlFVD15CisjIENPTkZJR19GRUFUVVJFX1NIX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9OT0ZPUksgaXMgbm90IHNldAorQ09ORklHX0NUVFlIQUNLPXkKKworIworIyBTeXN0ZW0gTG9nZ2luZyBVdGlsaXRpZXMKKyMKK0NPTkZJR19TWVNMT0dEPXkKK0NPTkZJR19GRUFUVVJFX1JPVEFURV9MT0dGSUxFPXkKK0NPTkZJR19GRUFUVVJFX1JFTU9URV9MT0c9eQorQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9EVVA9eQorQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9SRUFEX0JVRkZFUl9TSVpFPTI1NgorQ09ORklHX0ZFQVRVUkVfSVBDX1NZU0xPRz15CitDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HX0JVRkZFUl9TSVpFPTE2CitDT05GSUdfTE9HUkVBRD15CitDT05GSUdfRkVBVFVSRV9MT0dSRUFEX1JFRFVDRURfTE9DS0lORz15CitDT05GSUdfS0xPR0Q9eQorQ09ORklHX0xPR0dFUj15CmRpZmYgLS1naXQgYS9jb25maWdzL2FuZHJvaWQyX2RlZmNvbmZpZyBiL2NvbmZpZ3MvYW5kcm9pZDJfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZmJkYjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWdzL2FuZHJvaWQyX2RlZmNvbmZpZwpAQCAtMCwwICsxLDk5NiBAQAorIyBSdW4gIm1ha2UgYW5kcm9pZDJfZGVmY29uZmlnIiwgdGhlbiAibWFrZSIuCisjCisjIFRlc3RlZCB3aXRoIHRoZSBzdGFuZGFsb25lIHRvb2xjaGFpbiBmcm9tIG5kayByNjoKKyMgYW5kcm9pZC1uZGstcjYvYnVpbGQvdG9vbHMvbWFrZS1zdGFuZGFsb25lLXRvb2xjaGFpbi5zaCAtLXBsYXRmb3JtPWFuZHJvaWQtOAorIworQ09ORklHX0hBVkVfRE9UX0NPTkZJRz15CisKKyMKKyMgQnVzeWJveCBTZXR0aW5ncworIworCisjCisjIEdlbmVyYWwgQ29uZmlndXJhdGlvbgorIworIyBDT05GSUdfREVTS1RPUCBpcyBub3Qgc2V0CisjIENPTkZJR19FWFRSQV9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5DTFVERV9TVVN2MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VfUE9SVEFCTEVfQ09ERSBpcyBub3Qgc2V0CitDT05GSUdfUExBVEZPUk1fTElOVVg9eQorQ09ORklHX0ZFQVRVUkVfQlVGRkVSU19VU0VfTUFMTE9DPXkKKyMgQ09ORklHX0ZFQVRVUkVfQlVGRkVSU19HT19PTl9TVEFDSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JVRkZFUlNfR09fSU5fQlNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIT1dfVVNBR0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WRVJCT1NFX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ09NUFJFU1NfVVNBR0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNUQUxMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9OT19VU1IgaXMgbm90IHNldAorIyBDT05GSUdfTE9DQUxFX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfVVNJTkdfTE9DQUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfVU5JQ09ERV9JTl9FTlYgaXMgbm90IHNldAorQ09ORklHX1NVQlNUX1dDSEFSPTAKK0NPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUj0wCisjIENPTkZJR19VTklDT0RFX0NPTUJJTklOR19XQ0hBUlMgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9XSURFX1dDSEFSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX0JJRElfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX05FVVRSQUxfVEFCTEUgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9QUkVTRVJWRV9CUk9LRU4gaXMgbm90IHNldAorIyBDT05GSUdfTE9OR19PUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREVWUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0xFQU5fVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VVE1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfV1RNUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BJREZJTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VJRF9DT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVUlEX0NPTkZJR19RVUlFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRUxJTlVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFMgaXMgbm90IHNldAorQ09ORklHX0JVU1lCT1hfRVhFQ19QQVRIPSIvcHJvYy9zZWxmL2V4ZSIKK0NPTkZJR19GRUFUVVJFX1NZU0xPRz15CisjIENPTkZJR19GRUFUVVJFX0hBVkVfUlBDIGlzIG5vdCBzZXQKKworIworIyBCdWlsZCBPcHRpb25zCisjCisjIENPTkZJR19TVEFUSUMgaXMgbm90IHNldAorIyBDT05GSUdfUElFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PTU1VIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JVSUxEX0xJQkJVU1lCT1ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkRJVklEVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hBUkVEX0JVU1lCT1ggaXMgbm90IHNldAorIyBDT05GSUdfTEZTIGlzIG5vdCBzZXQKK0NPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVg9ImFybS1saW51eC1hbmRyb2lkZWFiaS0iCitDT05GSUdfRVhUUkFfQ0ZMQUdTPSIiCisKKyMKKyMgRGVidWdnaW5nIE9wdGlvbnMKKyMKKyMgQ09ORklHX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1BFU1NJTUlaRSBpcyBub3Qgc2V0CisjIENPTkZJR19XRVJST1IgaXMgbm90IHNldAorQ09ORklHX05PX0RFQlVHX0xJQj15CisjIENPTkZJR19ETUFMTE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VGRU5DRSBpcyBub3Qgc2V0CisKKyMKKyMgSW5zdGFsbGF0aW9uIE9wdGlvbnMgKCJtYWtlIGluc3RhbGwiIGJlaGF2aW9yKQorIworQ09ORklHX0lOU1RBTExfQVBQTEVUX1NZTUxJTktTPXkKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX0hBUkRMSU5LUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9TQ1JJUFRfV1JBUFBFUlMgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfRE9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9TWU1MSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX0hBUkRMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NDUklQVF9XUkFQUEVSIGlzIG5vdCBzZXQKK0NPTkZJR19QUkVGSVg9Ii4vX2luc3RhbGwiCisKKyMKKyMgQnVzeWJveCBMaWJyYXJ5IFR1bmluZworIworIyBDT05GSUdfRkVBVFVSRV9TWVNURU1EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUlRNSU5NQVggaXMgbm90IHNldAorQ09ORklHX1BBU1NXT1JEX01JTkxFTj02CitDT05GSUdfTUQ1X1NNQUxMPTEKKyMgQ09ORklHX0ZFQVRVUkVfRkFTVF9UT1AgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FVENfTkVUV09SS1MgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVVNFX1RFUk1JT1M9eQorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfTUFYX0xFTj0wCisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfVkkgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfRURJVElOR19ISVNUT1JZPTAKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElOR19TQVZFSElTVE9SWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RBQl9DT01QTEVUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVVNFUk5BTUVfQ09NUExFVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfRkFOQ1lfUFJPTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElOR19BU0tfVEVSTUlOQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9OT05fUE9TSVhfQ1AgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WRVJCT1NFX0NQX01FU1NBR0UgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQ09QWUJVRl9LQj00CisjIENPTkZJR19GRUFUVVJFX1NLSVBfUk9PVEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PTk9UT05JQ19TWVNDQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPQ1RMX0hFWDJTVFJfRVJST1IgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IV0lCIGlzIG5vdCBzZXQKKworIworIyBBcHBsZXRzCisjCisKKyMKKyMgQXJjaGl2YWwgVXRpbGl0aWVzCisjCitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19YWj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19MWk1BPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0JaMj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19HWj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19aPXkKK0NPTkZJR19BUj15CitDT05GSUdfRkVBVFVSRV9BUl9MT05HX0ZJTEVOQU1FUz15CitDT05GSUdfRkVBVFVSRV9BUl9DUkVBVEU9eQorQ09ORklHX0JVTlpJUDI9eQorQ09ORklHX0JaSVAyPXkKK0NPTkZJR19DUElPPXkKK0NPTkZJR19GRUFUVVJFX0NQSU9fTz15CitDT05GSUdfRkVBVFVSRV9DUElPX1A9eQorQ09ORklHX0RQS0c9eQorQ09ORklHX0RQS0dfREVCPXkKKyMgQ09ORklHX0ZFQVRVUkVfRFBLR19ERUJfRVhUUkFDVF9PTkxZIGlzIG5vdCBzZXQKK0NPTkZJR19HVU5aSVA9eQorQ09ORklHX0daSVA9eQorIyBDT05GSUdfRkVBVFVSRV9HWklQX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTFpPUD15CitDT05GSUdfTFpPUF9DT01QUl9ISUdIPXkKK0NPTkZJR19SUE0yQ1BJTz15CitDT05GSUdfUlBNPXkKK0NPTkZJR19UQVI9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0NSRUFURT15CitDT05GSUdfRkVBVFVSRV9UQVJfQVVUT0RFVEVDVD15CitDT05GSUdfRkVBVFVSRV9UQVJfRlJPTT15CitDT05GSUdfRkVBVFVSRV9UQVJfT0xER05VX0NPTVBBVElCSUxJVFk9eQorQ09ORklHX0ZFQVRVUkVfVEFSX09MRFNVTl9DT01QQVRJQklMSVRZPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9HTlVfRVhURU5TSU9OUz15CisjIENPTkZJR19GRUFUVVJFX1RBUl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVJfVE9fQ09NTUFORCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9UQVJfVU5BTUVfR05BTUU9eQorQ09ORklHX0ZFQVRVUkVfVEFSX05PUFJFU0VSVkVfVElNRT15CisjIENPTkZJR19GRUFUVVJFX1RBUl9TRUxJTlVYIGlzIG5vdCBzZXQKK0NPTkZJR19VTkNPTVBSRVNTPXkKK0NPTkZJR19VTkxaTUE9eQorQ09ORklHX0ZFQVRVUkVfTFpNQV9GQVNUPXkKK0NPTkZJR19MWk1BPXkKK0NPTkZJR19VTlhaPXkKK0NPTkZJR19YWj15CitDT05GSUdfVU5aSVA9eQorCisjCisjIENvcmV1dGlscworIworQ09ORklHX0JBU0VOQU1FPXkKK0NPTkZJR19DQVQ9eQorIyBDT05GSUdfREFURSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RBVEVfSVNPRk1UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREFURV9OQU5PIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREFURV9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfSUQgaXMgbm90IHNldAorIyBDT05GSUdfR1JPVVBTIGlzIG5vdCBzZXQKK0NPTkZJR19URVNUPXkKK0NPTkZJR19GRUFUVVJFX1RFU1RfNjQ9eQorQ09ORklHX1RPVUNIPXkKK0NPTkZJR19UUj15CitDT05GSUdfRkVBVFVSRV9UUl9DTEFTU0VTPXkKK0NPTkZJR19GRUFUVVJFX1RSX0VRVUlWPXkKK0NPTkZJR19CQVNFNjQ9eQorQ09ORklHX0NBTD15CitDT05GSUdfQ0FUVj15CitDT05GSUdfQ0hHUlA9eQorQ09ORklHX0NITU9EPXkKK0NPTkZJR19DSE9XTj15CisjIENPTkZJR19GRUFUVVJFX0NIT1dOX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfQ0hST09UPXkKK0NPTkZJR19DS1NVTT15CitDT05GSUdfQ09NTT15CitDT05GSUdfQ1A9eQorIyBDT05GSUdfRkVBVFVSRV9DUF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0NVVD15CitDT05GSUdfREQ9eQorQ09ORklHX0ZFQVRVUkVfRERfU0lHTkFMX0hBTkRMSU5HPXkKK0NPTkZJR19GRUFUVVJFX0REX1RISVJEX1NUQVRVU19MSU5FPXkKK0NPTkZJR19GRUFUVVJFX0REX0lCU19PQlM9eQorIyBDT05GSUdfREYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERl9GQU5DWSBpcyBub3Qgc2V0CitDT05GSUdfRElSTkFNRT15CitDT05GSUdfRE9TMlVOSVg9eQorQ09ORklHX1VOSVgyRE9TPXkKK0NPTkZJR19EVT15CitDT05GSUdfRkVBVFVSRV9EVV9ERUZBVUxUX0JMT0NLU0laRV8xSz15CitDT05GSUdfRUNITz15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9FQ0hPPXkKKyMgQ09ORklHX0VOViBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VOVl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0VYUEFORD15CisjIENPTkZJR19GRUFUVVJFX0VYUEFORF9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhQUiBpcyBub3Qgc2V0CisjIENPTkZJR19FWFBSX01BVEhfU1VQUE9SVF82NCBpcyBub3Qgc2V0CitDT05GSUdfRkFMU0U9eQorQ09ORklHX0ZPTEQ9eQorIyBDT05GSUdfRlNZTkMgaXMgbm90IHNldAorQ09ORklHX0hFQUQ9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfSEVBRD15CisjIENPTkZJR19IT1NUSUQgaXMgbm90IHNldAorQ09ORklHX0lOU1RBTEw9eQorIyBDT05GSUdfRkVBVFVSRV9JTlNUQUxMX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTE49eQorIyBDT05GSUdfTE9HTkFNRSBpcyBub3Qgc2V0CitDT05GSUdfTFM9eQorQ09ORklHX0ZFQVRVUkVfTFNfRklMRVRZUEVTPXkKK0NPTkZJR19GRUFUVVJFX0xTX0ZPTExPV0xJTktTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1JFQ1VSU0lWRT15CitDT05GSUdfRkVBVFVSRV9MU19TT1JURklMRVM9eQorQ09ORklHX0ZFQVRVUkVfTFNfVElNRVNUQU1QUz15CitDT05GSUdfRkVBVFVSRV9MU19VU0VSTkFNRT15CisjIENPTkZJR19GRUFUVVJFX0xTX0NPTE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTFNfQ09MT1JfSVNfREVGQVVMVCBpcyBub3Qgc2V0CitDT05GSUdfTUQ1U1VNPXkKK0NPTkZJR19NS0RJUj15CisjIENPTkZJR19GRUFUVVJFX01LRElSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTUtGSUZPPXkKK0NPTkZJR19NS05PRD15CitDT05GSUdfTVY9eQorIyBDT05GSUdfRkVBVFVSRV9NVl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX05JQ0U9eQorQ09ORklHX05PSFVQPXkKK0NPTkZJR19PRD15CitDT05GSUdfUFJJTlRFTlY9eQorQ09ORklHX1BSSU5URj15CitDT05GSUdfUFdEPXkKK0NPTkZJR19SRUFETElOSz15CitDT05GSUdfRkVBVFVSRV9SRUFETElOS19GT0xMT1c9eQorQ09ORklHX1JFQUxQQVRIPXkKK0NPTkZJR19STT15CitDT05GSUdfUk1ESVI9eQorIyBDT05GSUdfRkVBVFVSRV9STURJUl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX1NFUT15CitDT05GSUdfU0hBMVNVTT15CitDT05GSUdfU0hBMjU2U1VNPXkKK0NPTkZJR19TSEE1MTJTVU09eQorQ09ORklHX1NMRUVQPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX1NMRUVQPXkKK0NPTkZJR19GRUFUVVJFX0ZMT0FUX1NMRUVQPXkKK0NPTkZJR19TT1JUPXkKK0NPTkZJR19GRUFUVVJFX1NPUlRfQklHPXkKK0NPTkZJR19TUExJVD15CitDT05GSUdfRkVBVFVSRV9TUExJVF9GQU5DWT15CisjIENPTkZJR19TVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1RBVF9GT1JNQVQgaXMgbm90IHNldAorQ09ORklHX1NUVFk9eQorQ09ORklHX1NVTT15CitDT05GSUdfU1lOQz15CitDT05GSUdfVEFDPXkKK0NPTkZJR19UQUlMPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX1RBSUw9eQorQ09ORklHX1RFRT15CitDT05GSUdfRkVBVFVSRV9URUVfVVNFX0JMT0NLX0lPPXkKK0NPTkZJR19UUlVFPXkKKyMgQ09ORklHX1RUWSBpcyBub3Qgc2V0CitDT05GSUdfVU5BTUU9eQorQ09ORklHX1VORVhQQU5EPXkKKyMgQ09ORklHX0ZFQVRVUkVfVU5FWFBBTkRfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19VTklRPXkKKyMgQ09ORklHX1VTTEVFUCBpcyBub3Qgc2V0CitDT05GSUdfVVVERUNPREU9eQorQ09ORklHX1VVRU5DT0RFPXkKK0NPTkZJR19XQz15CitDT05GSUdfRkVBVFVSRV9XQ19MQVJHRT15CisjIENPTkZJR19XSE8gaXMgbm90IHNldAorQ09ORklHX1dIT0FNST15CitDT05GSUdfWUVTPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgY3AgYW5kIG12CisjCitDT05GSUdfRkVBVFVSRV9QUkVTRVJWRV9IQVJETElOS1M9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBscywgbW9yZSBhbmQgdGVsbmV0CisjCitDT05GSUdfRkVBVFVSRV9BVVRPV0lEVEg9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBkZiwgZHUsIGxzCisjCitDT05GSUdfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRT15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIG1kNXN1bSwgc2hhMXN1bSwgc2hhMjU2c3VtLCBzaGE1MTJzdW0KKyMKK0NPTkZJR19GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSz15CisKKyMKKyMgQ29uc29sZSBVdGlsaXRpZXMKKyMKK0NPTkZJR19DSFZUPXkKK0NPTkZJR19GR0NPTlNPTEU9eQorQ09ORklHX0NMRUFSPXkKK0NPTkZJR19ERUFMTE9DVlQ9eQorQ09ORklHX0RVTVBLTUFQPXkKKyMgQ09ORklHX0tCRF9NT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQURGT05UIGlzIG5vdCBzZXQKK0NPTkZJR19MT0FES01BUD15CitDT05GSUdfT1BFTlZUPXkKK0NPTkZJR19SRVNFVD15CitDT05GSUdfUkVTSVpFPXkKK0NPTkZJR19GRUFUVVJFX1JFU0laRV9QUklOVD15CitDT05GSUdfU0VUQ09OU09MRT15CisjIENPTkZJR19GRUFUVVJFX1NFVENPTlNPTEVfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEZPTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRGT05UX1RFWFRVQUxfTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX1NFVEZPTlRfRElSPSIiCitDT05GSUdfU0VUS0VZQ09ERVM9eQorQ09ORklHX1NFVExPR0NPTlM9eQorQ09ORklHX1NIT1dLRVk9eQorIyBDT05GSUdfRkVBVFVSRV9MT0FERk9OVF9QU0YyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTE9BREZPTlRfUkFXIGlzIG5vdCBzZXQKKworIworIyBEZWJpYW4gVXRpbGl0aWVzCisjCitDT05GSUdfTUtURU1QPXkKK0NPTkZJR19QSVBFX1BST0dSRVNTPXkKK0NPTkZJR19SVU5fUEFSVFM9eQorIyBDT05GSUdfRkVBVFVSRV9SVU5fUEFSVFNfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1JVTl9QQVJUU19GQU5DWT15CitDT05GSUdfU1RBUlRfU1RPUF9EQUVNT049eQorQ09ORklHX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fRkFOQ1k9eQorIyBDT05GSUdfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX1dISUNIPXkKKworIworIyBFZGl0b3JzCisjCitDT05GSUdfUEFUQ0g9eQorIyBDT05GSUdfVkkgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVklfTUFYX0xFTj0wCisjIENPTkZJR19GRUFUVVJFX1ZJXzhCSVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9DT0xPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX1lBTktNQVJLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVklfU0VBUkNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVklfUkVHRVhfU0VBUkNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVklfVVNFX1NJR05BTFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9ET1RfQ01EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVklfUkVBRE9OTFkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WSV9TRVRPUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVklfU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVklfV0lOX1JFU0laRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZJX0FTS19URVJNSU5BTCBpcyBub3Qgc2V0CisjIENPTkZJR19BV0sgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BV0tfTElCTSBpcyBub3Qgc2V0CitDT05GSUdfQ01QPXkKK0NPTkZJR19ESUZGPXkKKyMgQ09ORklHX0ZFQVRVUkVfRElGRl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfRElGRl9ESVI9eQorIyBDT05GSUdfRUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUxMT1dfRVhFQyBpcyBub3Qgc2V0CisKKyMKKyMgRmluZGluZyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0ZJTkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1BSSU5UMCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfTVRJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX01NSU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1BFUk0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1RZUEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1hERVYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX01BWERFUFRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9ORVdFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfSU5VTSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfRVhFQyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfR1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX05PVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfREVQVEggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GSU5EX1BBUkVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9TSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9QUlVORSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfREVMRVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9QQVRIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9SRUdFWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfQ09OVEVYVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfTElOS1MgaXMgbm90IHNldAorIyBDT05GSUdfR1JFUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0dSRVBfRUdSRVBfQUxJQVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9HUkVQX0ZHUkVQX0FMSUFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfR1JFUF9DT05URVhUIGlzIG5vdCBzZXQKK0NPTkZJR19YQVJHUz15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX0NPTkZJUk1BVElPTj15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1FVT1RFUz15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1RFUk1PUFQ9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9aRVJPX1RFUk09eQorCisjCisjIEluaXQgVXRpbGl0aWVzCisjCisjIENPTkZJR19CT09UQ0hBUlREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQk9PVENIQVJURF9CTE9BVEVEX0hFQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JPT1RDSEFSVERfQ09ORklHX0ZJTEUgaXMgbm90IHNldAorQ09ORklHX0hBTFQ9eQorIyBDT05GSUdfRkVBVFVSRV9DQUxMX1RFTElOSVQgaXMgbm90IHNldAorQ09ORklHX1RFTElOSVRfUEFUSD0iIgorQ09ORklHX0lOSVQ9eQorQ09ORklHX0ZFQVRVUkVfVVNFX0lOSVRUQUI9eQorIyBDT05GSUdfRkVBVFVSRV9LSUxMX1JFTU9WRUQgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfS0lMTF9ERUxBWT0wCitDT05GSUdfRkVBVFVSRV9JTklUX1NDVFRZPXkKK0NPTkZJR19GRUFUVVJFX0lOSVRfU1lTTE9HPXkKK0NPTkZJR19GRUFUVVJFX0VYVFJBX1FVSUVUPXkKK0NPTkZJR19GRUFUVVJFX0lOSVRfQ09SRURVTVBTPXkKK0NPTkZJR19GRUFUVVJFX0lOSVRSRD15CitDT05GSUdfSU5JVF9URVJNSU5BTF9UWVBFPSJsaW51eCIKK0NPTkZJR19NRVNHPXkKK0NPTkZJR19GRUFUVVJFX01FU0dfRU5BQkxFX09OTFlfR1JPVVA9eQorCisjCisjIExvZ2luL1Bhc3N3b3JkIE1hbmFnZW1lbnQgVXRpbGl0aWVzCisjCisjIENPTkZJR19BRERfU0hFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUkVNT1ZFX1NIRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hBRE9XUEFTU1dEUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VfQkJfUFdEX0dSUCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VfQkJfU0hBRE9XIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9CQl9DUllQVCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VfQkJfQ1JZUFRfU0hBIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FERFVTRVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BRERVU0VSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX05BTUVTIGlzIG5vdCBzZXQKK0NPTkZJR19GSVJTVF9TWVNURU1fSUQ9MAorQ09ORklHX0xBU1RfU1lTVEVNX0lEPTAKKyMgQ09ORklHX0FEREdST1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQURER1JPVVBfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUREVVNFUl9UT19HUk9VUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERUxVU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFTEdST1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREVMX1VTRVJfRlJPTV9HUk9VUCBpcyBub3Qgc2V0CisjIENPTkZJR19HRVRUWSBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dJTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQU0gaXMgbm90IHNldAorIyBDT05GSUdfTE9HSU5fU0NSSVBUUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05PTE9HSU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRUNVUkVUVFkgaXMgbm90IHNldAorIyBDT05GSUdfUEFTU1dEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUEFTU1dEX1dFQUtfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRQVyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFBBU1NXRCBpcyBub3Qgc2V0CisjIENPTkZJR19TVSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVX1NZU0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVX0NIRUNLU19TSEVMTFMgaXMgbm90IHNldAorIyBDT05GSUdfU1VMT0dJTiBpcyBub3Qgc2V0CisjIENPTkZJR19WTE9DSyBpcyBub3Qgc2V0CisKKyMKKyMgTGludXggRXh0MiBGUyBQcm9ncworIworQ09ORklHX0NIQVRUUj15CisjIENPTkZJR19GU0NLIGlzIG5vdCBzZXQKK0NPTkZJR19MU0FUVFI9eQorQ09ORklHX1RVTkUyRlM9eQorCisjCisjIExpbnV4IE1vZHVsZSBVdGlsaXRpZXMKKyMKK0NPTkZJR19NT0RJTkZPPXkKK0NPTkZJR19NT0RQUk9CRV9TTUFMTD15CitDT05GSUdfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9PUFRJT05TX09OX0NNRExJTkU9eQorQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfU01BTExfQ0hFQ0tfQUxSRUFEWV9MT0FERUQ9eQorIyBDT05GSUdfSU5TTU9EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JNTU9EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTTU9EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTFNNT0RfUFJFVFRZXzJfNl9PVVRQVVQgaXMgbm90IHNldAorIyBDT05GSUdfTU9EUFJPQkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT0RQUk9CRV9CTEFDS0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVQTU9EIGlzIG5vdCBzZXQKKworIworIyBPcHRpb25zIGNvbW1vbiB0byBtdWx0aXBsZSBtb2R1dGlscworIworIyBDT05GSUdfRkVBVFVSRV8yXzRfTU9EVUxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9UUllfTU1BUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0tTWU1PT1BTX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRElOS01FTSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FEX01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FEX01BUF9GVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfVEFJTlRFRF9NT0RVTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT0RVVElMU19BTElBUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFVUSUxTX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfTU9EVUxFU19ESVI9Ii9saWIvbW9kdWxlcyIKK0NPTkZJR19ERUZBVUxUX0RFUE1PRF9GSUxFPSJtb2R1bGVzLmRlcCIKKworIworIyBMaW51eCBTeXN0ZW0gVXRpbGl0aWVzCisjCitDT05GSUdfQkxPQ0tERVY9eQorQ09ORklHX1JFVj15CisjIENPTkZJR19BQ1BJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FDUElEX0NPTVBBVCBpcyBub3Qgc2V0CitDT05GSUdfQkxLSUQ9eQorIyBDT05GSUdfRkVBVFVSRV9CTEtJRF9UWVBFIGlzIG5vdCBzZXQKK0NPTkZJR19ETUVTRz15CitDT05GSUdfRkVBVFVSRV9ETUVTR19QUkVUVFk9eQorQ09ORklHX0ZCU0VUPXkKK0NPTkZJR19GRUFUVVJFX0ZCU0VUX0ZBTkNZPXkKK0NPTkZJR19GRUFUVVJFX0ZCU0VUX1JFQURNT0RFPXkKK0NPTkZJR19GREZMVVNIPXkKK0NPTkZJR19GREZPUk1BVD15CitDT05GSUdfRkRJU0s9eQorQ09ORklHX0ZESVNLX1NVUFBPUlRfTEFSR0VfRElTS1M9eQorQ09ORklHX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEU9eQorIyBDT05GSUdfRkVBVFVSRV9BSVhfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TR0lfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVU5fTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9PU0ZfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9HUFRfTEFCRUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfRkRJU0tfQURWQU5DRUQ9eQorQ09ORklHX0ZJTkRGUz15CitDT05GSUdfRkxPQ0s9eQorQ09ORklHX0ZSRUVSQU1ESVNLPXkKKyMgQ09ORklHX0ZTQ0tfTUlOSVggaXMgbm90IHNldAorIyBDT05GSUdfTUtGU19FWFQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRlNfTUlOSVggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NSU5JWDIgaXMgbm90IHNldAorIyBDT05GSUdfTUtGU19SRUlTRVIgaXMgbm90IHNldAorIyBDT05GSUdfTUtGU19WRkFUIGlzIG5vdCBzZXQKK0NPTkZJR19HRVRPUFQ9eQorQ09ORklHX0ZFQVRVUkVfR0VUT1BUX0xPTkc9eQorQ09ORklHX0hFWERVTVA9eQorQ09ORklHX0ZFQVRVUkVfSEVYRFVNUF9SRVZFUlNFPXkKK0NPTkZJR19IRD15CisjIENPTkZJR19IV0NMT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFdDTE9DS19MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IV0NMT0NLX0FESlRJTUVfRkhTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQQ1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQQ1MgaXMgbm90IHNldAorQ09ORklHX0xPU0VUVVA9eQorQ09ORklHX0xTUENJPXkKK0NPTkZJR19MU1VTQj15CisjIENPTkZJR19NREVWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9DT05GIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9SRU5BTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX1JFTkFNRV9SRUdFWFAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX0VYRUMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX0xPQURfRklSTVdBUkUgaXMgbm90IHNldAorQ09ORklHX01LU1dBUD15CitDT05GSUdfRkVBVFVSRV9NS1NXQVBfVVVJRD15CitDT05GSUdfTU9SRT15CisjIENPTkZJR19NT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0ZBS0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9WRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfSEVMUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfQ0lGUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0ZMQUdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRlNUQUIgaXMgbm90IHNldAorIyBDT05GSUdfUElWT1RfUk9PVCBpcyBub3Qgc2V0CisjIENPTkZJR19SREFURSBpcyBub3Qgc2V0CitDT05GSUdfUkRFVj15CitDT05GSUdfUkVBRFBST0ZJTEU9eQorQ09ORklHX1JUQ1dBS0U9eQorQ09ORklHX1NDUklQVD15CitDT05GSUdfU0NSSVBUUkVQTEFZPXkKKyMgQ09ORklHX1NFVEFSQ0ggaXMgbm90IHNldAorIyBDT05GSUdfU1dBUE9OT0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1dBUE9OX1BSSSBpcyBub3Qgc2V0CisjIENPTkZJR19TV0lUQ0hfUk9PVCBpcyBub3Qgc2V0CisjIENPTkZJR19VTU9VTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VTU9VTlRfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0xPT1BfQ1JFQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTVRBQl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19WT0xVTUVJRD15CisKKyMKKyMgRmlsZXN5c3RlbS9Wb2x1bWUgaWRlbnRpZmljYXRpb24KKyMKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0VYVD15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9CVFJGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9SRUlTRVJGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9GQVQ9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSEZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0pGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9YRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTlRGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9JU085NjYwPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1VERj15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MVUtTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xJTlVYU1dBUD15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9DUkFNRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfUk9NRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfU1lTVj15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9PQ0ZTMj15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFJBSUQ9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgVXRpbGl0aWVzCisjCisjIENPTkZJR19DT05TUFkgaXMgbm90IHNldAorIyBDT05GSUdfTkFORFdSSVRFIGlzIG5vdCBzZXQKK0NPTkZJR19OQU5ERFVNUD15CitDT05GSUdfU0VUU0VSSUFMPXkKKyMgQ09ORklHX1VCSUFUVEFDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VQklERVRBQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVUJJTUtWT0wgaXMgbm90IHNldAorIyBDT05GSUdfVUJJUk1WT0wgaXMgbm90IHNldAorIyBDT05GSUdfVUJJUlNWT0wgaXMgbm90IHNldAorIyBDT05GSUdfVUJJVVBEQVRFVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FESlRJTUVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JCQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ09NUFJFU1NfQkJDT05GSUcgaXMgbm90IHNldAorQ09ORklHX0JFRVA9eQorQ09ORklHX0ZFQVRVUkVfQkVFUF9GUkVRPTQwMDAKK0NPTkZJR19GRUFUVVJFX0JFRVBfTEVOR1RIX01TPTMwCitDT05GSUdfQ0hBVD15CitDT05GSUdfRkVBVFVSRV9DSEFUX05PRkFJTD15CisjIENPTkZJR19GRUFUVVJFX0NIQVRfVFRZX0hJRkkgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQ0hBVF9JTVBMSUNJVF9DUj15CitDT05GSUdfRkVBVFVSRV9DSEFUX1NXQUxMT1dfT1BUUz15CitDT05GSUdfRkVBVFVSRV9DSEFUX1NFTkRfRVNDQVBFUz15CitDT05GSUdfRkVBVFVSRV9DSEFUX1ZBUl9BQk9SVF9MRU49eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9DTFJfQUJPUlQ9eQorQ09ORklHX0NIUlQ9eQorIyBDT05GSUdfQ1JPTkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DUk9ORF9EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ1JPTkRfQ0FMTF9TRU5ETUFJTCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9DUk9ORF9ESVI9IiIKKyMgQ09ORklHX0NST05UQUIgaXMgbm90IHNldAorQ09ORklHX0RDPXkKK0NPTkZJR19GRUFUVVJFX0RDX0xJQk09eQorIyBDT05GSUdfREVWRlNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRF9NT0RMT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRF9GR19OUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfVkVSQk9TRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RFVkZTIGlzIG5vdCBzZXQKK0NPTkZJR19ERVZNRU09eQorIyBDT05GSUdfRUpFQ1QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FSkVDVF9TQ1NJIGlzIG5vdCBzZXQKK0NPTkZJR19GQlNQTEFTSD15CitDT05GSUdfRkxBU0hDUD15CitDT05GSUdfRkxBU0hfTE9DSz15CitDT05GSUdfRkxBU0hfVU5MT0NLPXkKKyMgQ09ORklHX0ZMQVNIX0VSQVNFQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPTklDRSBpcyBub3Qgc2V0CitDT05GSUdfSU5PVElGWUQ9eQorIyBDT05GSUdfTEFTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xBU1RfU01BTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MQVNUX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFU1MgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTEVTU19NQVhMSU5FUz0wCisjIENPTkZJR19GRUFUVVJFX0xFU1NfQlJBQ0tFVFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MRVNTX0ZMQUdTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEVTU19NQVJLUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xFU1NfUkVHRVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEVTU19XSU5DSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xFU1NfREFTSENNRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xFU1NfTElORU5VTVMgaXMgbm90IHNldAorQ09ORklHX0hEUEFSTT15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZPXkKK0NPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1NDQU5fSFdJRj15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19VTlJFR0lTVEVSX0hXSUY9eQorQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fRFJJVkVfUkVTRVQ9eQorQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRj15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19HRVRTRVRfRE1BPXkKK0NPTkZJR19NQUtFREVWUz15CisjIENPTkZJR19GRUFUVVJFX01BS0VERVZTX0xFQUYgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTUFLRURFVlNfVEFCTEU9eQorQ09ORklHX01BTj15CisjIENPTkZJR19NSUNST0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VOVFBPSU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01UIGlzIG5vdCBzZXQKK0NPTkZJR19SQUlEQVVUT1JVTj15CisjIENPTkZJR19SRUFEQUhFQUQgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JVTkxFVkVMIGlzIG5vdCBzZXQKK0NPTkZJR19SWD15CitDT05GSUdfU0VUU0lEPXkKK0NPTkZJR19TVFJJTkdTPXkKKyMgQ09ORklHX1RBU0tTRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVNLU0VUX0ZBTkNZIGlzIG5vdCBzZXQKK0NPTkZJR19USU1FPXkKK0NPTkZJR19USU1FT1VUPXkKK0NPTkZJR19UVFlTSVpFPXkKK0NPTkZJR19WT0xOQU1FPXkKKyMgQ09ORklHX1dBTEwgaXMgbm90IHNldAorIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmtpbmcgVXRpbGl0aWVzCisjCisjIENPTkZJR19OQU1FSUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQgaXMgbm90IHNldAorQ09ORklHX05CRENMSUVOVD15CitDT05GSUdfTkM9eQorQ09ORklHX05DX1NFUlZFUj15CitDT05GSUdfTkNfRVhUUkE9eQorIyBDT05GSUdfTkNfMTEwX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19QSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJTkc2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRkFOQ1lfUElORyBpcyBub3Qgc2V0CitDT05GSUdfV0hPSVM9eQorIyBDT05GSUdfRkVBVFVSRV9JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVU5JWF9MT0NBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BSRUZFUl9JUFY0X0FERFJFU1MgaXMgbm90IHNldAorIyBDT05GSUdfVkVSQk9TRV9SRVNPTFVUSU9OX0VSUk9SUyBpcyBub3Qgc2V0CitDT05GSUdfQVJQPXkKKyMgQ09ORklHX0FSUElORyBpcyBub3Qgc2V0CisjIENPTkZJR19CUkNUTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JSQ1RMX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlJDVExfU0hPVyBpcyBub3Qgc2V0CitDT05GSUdfRE5TRD15CisjIENPTkZJR19FVEhFUl9XQUtFIGlzIG5vdCBzZXQKK0NPTkZJR19GQUtFSURFTlREPXkKK0NPTkZJR19GVFBEPXkKK0NPTkZJR19GRUFUVVJFX0ZUUF9XUklURT15CitDT05GSUdfRkVBVFVSRV9GVFBEX0FDQ0VQVF9CUk9LRU5fTElTVD15CitDT05GSUdfRlRQR0VUPXkKK0NPTkZJR19GVFBQVVQ9eQorIyBDT05GSUdfRkVBVFVSRV9GVFBHRVRQVVRfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPU1ROQU1FIGlzIG5vdCBzZXQKK0NPTkZJR19IVFRQRD15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9SQU5HRVM9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfVVNFX1NFTkRGSUxFPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1NFVFVJRD15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRIPXkKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfQVVUSF9NRDUgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfSFRUUERfQ0dJPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0NPTkZJR19XSVRIX1NDUklQVF9JTlRFUlBSPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1NFVF9SRU1PVEVfUE9SVF9UT19FTlY9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfRU5DT0RFX1VSTF9TVFI9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfRVJST1JfUEFHRVM9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfUFJPWFk9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfR1pJUD15CitDT05GSUdfSUZDT05GSUc9eQorQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfU1RBVFVTPXkKKyMgQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfU0xJUCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19NRU1TVEFSVF9JT0FERFJfSVJRPXkKK0NPTkZJR19GRUFUVVJFX0lGQ09ORklHX0hXPXkKK0NPTkZJR19GRUFUVVJFX0lGQ09ORklHX0JST0FEQ0FTVF9QTFVTPXkKKyMgQ09ORklHX0lGRU5TTEFWRSBpcyBub3Qgc2V0CisjIENPTkZJR19JRlBMVUdEIGlzIG5vdCBzZXQKK0NPTkZJR19JRlVQRE9XTj15CitDT05GSUdfSUZVUERPV05fSUZTVEFURV9QQVRIPSIvdmFyL3J1bi9pZnN0YXRlIgorQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVA9eQorQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBfQlVJTFRJTj15CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lGQ09ORklHX0JVSUxUSU4gaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWND15CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQVjYgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fTUFQUElORz15CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0VYVEVSTkFMX0RIQ1AgaXMgbm90IHNldAorIyBDT05GSUdfSU5FVEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRUNITyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9ESVNDQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fREFZVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9DSEFSR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfUlBDIGlzIG5vdCBzZXQKK0NPTkZJR19JUD15CitDT05GSUdfRkVBVFVSRV9JUF9BRERSRVNTPXkKK0NPTkZJR19GRUFUVVJFX0lQX0xJTks9eQorQ09ORklHX0ZFQVRVUkVfSVBfUk9VVEU9eQorQ09ORklHX0ZFQVRVUkVfSVBfVFVOTkVMPXkKK0NPTkZJR19GRUFUVVJFX0lQX1JVTEU9eQorQ09ORklHX0ZFQVRVUkVfSVBfU0hPUlRfRk9STVM9eQorIyBDT05GSUdfRkVBVFVSRV9JUF9SQVJFX1BST1RPQ09MUyBpcyBub3Qgc2V0CitDT05GSUdfSVBBRERSPXkKK0NPTkZJR19JUExJTks9eQorQ09ORklHX0lQUk9VVEU9eQorQ09ORklHX0lQVFVOTkVMPXkKK0NPTkZJR19JUFJVTEU9eQorQ09ORklHX0lQQ0FMQz15CitDT05GSUdfRkVBVFVSRV9JUENBTENfRkFOQ1k9eQorIyBDT05GSUdfRkVBVFVSRV9JUENBTENfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRTVEFUPXkKK0NPTkZJR19GRUFUVVJFX05FVFNUQVRfV0lERT15CitDT05GSUdfRkVBVFVSRV9ORVRTVEFUX1BSRz15CisjIENPTkZJR19OU0xPT0tVUCBpcyBub3Qgc2V0CisjIENPTkZJR19OVFBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTlRQRF9TRVJWRVIgaXMgbm90IHNldAorQ09ORklHX1BTQ0FOPXkKK0NPTkZJR19ST1VURT15CisjIENPTkZJR19TTEFUVEFDSCBpcyBub3Qgc2V0CitDT05GSUdfVENQU1ZEPXkKKyMgQ09ORklHX1RFTE5FVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RFTE5FVF9UVFlQRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RFTE5FVF9BVVRPTE9HSU4gaXMgbm90IHNldAorIyBDT05GSUdfVEVMTkVURCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RFTE5FVERfSU5FVERfV0FJVCBpcyBub3Qgc2V0CisjIENPTkZJR19URlRQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RGVFBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEZUUF9HRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9URlRQX1BVVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEZUUF9QUk9HUkVTU19CQVIgaXMgbm90IHNldAorIyBDT05GSUdfVEZUUF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSQUNFUk9VVEU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1VTRV9JQ01QIGlzIG5vdCBzZXQKK0NPTkZJR19UVU5DVEw9eQorQ09ORklHX0ZFQVRVUkVfVFVOQ1RMX1VHPXkKKyMgQ09ORklHX1VESENQRCBpcyBub3Qgc2V0CisjIENPTkZJR19ESENQUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfRFVNUExFQVNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQRF9XUklURV9MRUFTRVNfRUFSTFkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUERfQkFTRV9JUF9PTl9NQUMgaXMgbm90IHNldAorQ09ORklHX0RIQ1BEX0xFQVNFU19GSUxFPSIiCitDT05GSUdfVURIQ1BDPXkKK0NPTkZJR19GRUFUVVJFX1VESENQQ19BUlBJTkc9eQorIyBDT05GSUdfRkVBVFVSRV9VREhDUF9QT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19VREhDUF9ERUJVRz05CitDT05GSUdfRkVBVFVSRV9VREhDUF9SRkMzMzk3PXkKK0NPTkZJR19GRUFUVVJFX1VESENQXzgwMjFRPXkKK0NPTkZJR19VREhDUENfREVGQVVMVF9TQ1JJUFQ9Ii91c3Ivc2hhcmUvdWRoY3BjL2RlZmF1bHQuc2NyaXB0IgorQ09ORklHX1VESENQQ19TTEFDS19GT1JfQlVHR1lfU0VSVkVSUz04MAorQ09ORklHX0lGVVBET1dOX1VESENQQ19DTURfT1BUSU9OUz0iLVIgLW4iCisjIENPTkZJR19VRFBTVkQgaXMgbm90IHNldAorIyBDT05GSUdfVkNPTkZJRyBpcyBub3Qgc2V0CitDT05GSUdfV0dFVD15CitDT05GSUdfRkVBVFVSRV9XR0VUX1NUQVRVU0JBUj15CitDT05GSUdfRkVBVFVSRV9XR0VUX0FVVEhFTlRJQ0FUSU9OPXkKKyMgQ09ORklHX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfV0dFVF9USU1FT1VUPXkKKyMgQ09ORklHX1pDSVAgaXMgbm90IHNldAorCisjCisjIFByaW50IFV0aWxpdGllcworIworQ09ORklHX0xQRD15CitDT05GSUdfTFBSPXkKK0NPTkZJR19MUFE9eQorCisjCisjIE1haWwgVXRpbGl0aWVzCisjCitDT05GSUdfTUFLRU1JTUU9eQorQ09ORklHX0ZFQVRVUkVfTUlNRV9DSEFSU0VUPSJ1cy1hc2NpaSIKK0NPTkZJR19QT1BNQUlMRElSPXkKK0NPTkZJR19GRUFUVVJFX1BPUE1BSUxESVJfREVMSVZFUlk9eQorQ09ORklHX1JFRk9STUlNRT15CitDT05GSUdfRkVBVFVSRV9SRUZPUk1JTUVfQ09NUEFUPXkKK0NPTkZJR19TRU5ETUFJTD15CisKKyMKKyMgUHJvY2VzcyBVdGlsaXRpZXMKKyMKK0NPTkZJR19JT1NUQVQ9eQorQ09ORklHX01QU1RBVD15CitDT05GSUdfTk1FVEVSPXkKK0NPTkZJR19QTUFQPXkKK0NPTkZJR19QT1dFUlRPUD15CitDT05GSUdfUFNUUkVFPXkKK0NPTkZJR19QV0RYPXkKK0NPTkZJR19TTUVNQ0FQPXkKKyMgQ09ORklHX0ZSRUUgaXMgbm90IHNldAorQ09ORklHX0ZVU0VSPXkKKyMgQ09ORklHX0tJTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0lMTEFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LSUxMQUxMNSBpcyBub3Qgc2V0CisjIENPTkZJR19QR1JFUCBpcyBub3Qgc2V0CitDT05GSUdfUElET0Y9eQorQ09ORklHX0ZFQVRVUkVfUElET0ZfU0lOR0xFPXkKK0NPTkZJR19GRUFUVVJFX1BJRE9GX09NSVQ9eQorIyBDT05GSUdfUEtJTEwgaXMgbm90IHNldAorIyBDT05GSUdfUFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19XSURFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFNfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BTX0FERElUSU9OQUxfQ09MVU1OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BTX1VOVVNVQUxfU1lTVEVNUyBpcyBub3Qgc2V0CitDT05GSUdfUkVOSUNFPXkKK0NPTkZJR19CQl9TWVNDVEw9eQorQ09ORklHX1RPUD15CitDT05GSUdfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0U9eQorQ09ORklHX0ZFQVRVUkVfVE9QX0NQVV9HTE9CQUxfUEVSQ0VOVFM9eQorQ09ORklHX0ZFQVRVUkVfVE9QX1NNUF9DUFU9eQorQ09ORklHX0ZFQVRVUkVfVE9QX0RFQ0lNQUxTPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUz15CitDT05GSUdfRkVBVFVSRV9UT1BNRU09eQorQ09ORklHX0ZFQVRVUkVfU0hPV19USFJFQURTPXkKKyMgQ09ORklHX1VQVElNRSBpcyBub3Qgc2V0CitDT05GSUdfV0FUQ0g9eQorCisjCisjIFJ1bml0IFV0aWxpdGllcworIworQ09ORklHX1JVTlNWPXkKK0NPTkZJR19SVU5TVkRJUj15CisjIENPTkZJR19GRUFUVVJFX1JVTlNWRElSX0xPRyBpcyBub3Qgc2V0CitDT05GSUdfU1Y9eQorQ09ORklHX1NWX0RFRkFVTFRfU0VSVklDRV9ESVI9Ii92YXIvc2VydmljZSIKK0NPTkZJR19TVkxPR0Q9eQorQ09ORklHX0NIUFNUPXkKK0NPTkZJR19TRVRVSURHSUQ9eQorQ09ORklHX0VOVlVJREdJRD15CitDT05GSUdfRU5WRElSPXkKK0NPTkZJR19TT0ZUTElNSVQ9eQorIyBDT05GSUdfQ0hDT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSENPTl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfR0VURU5GT1JDRSBpcyBub3Qgc2V0CisjIENPTkZJR19HRVRTRUJPT0wgaXMgbm90IHNldAorIyBDT05GSUdfTE9BRF9QT0xJQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTUFUQ0hQQVRIQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFU1RPUkVDT04gaXMgbm90IHNldAorIyBDT05GSUdfUlVOQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUlVOQ09OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUxJTlVYRU5BQkxFRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRFTkZPUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEZJTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0VURklMRVNfQ0hFQ0tfT1BUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVFNFQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19TRVNUQVRVUyBpcyBub3Qgc2V0CisKKyMKKyMgU2hlbGxzCisjCisjIENPTkZJR19BU0ggaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0JBU0hfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9JRExFX1RJTUVPVVQgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0pPQl9DT05UUk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9BTElBUyBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfR0VUT1BUUyBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQlVJTFRJTl9FQ0hPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9CVUlMVElOX1BSSU5URiBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQlVJTFRJTl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9DTURDTUQgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX01BSUwgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9SQU5ET01fU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfRVhQQU5EX1BSTVQgaXMgbm90IHNldAorQ09ORklHX0NUVFlIQUNLPXkKKyMgQ09ORklHX0hVU0ggaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9CQVNIX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0JSQUNFX0VYUEFOU0lPTiBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0hFTFAgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9JTlRFUkFDVElWRSBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX1NBVkVISVNUT1JZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSk9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfTE9PUFMgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9DQVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfRlVOQ1RJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfTE9DQUwgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9SQU5ET01fU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0VYUE9SVF9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfTU9ERV9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX01TSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIX0lTX0FTSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIX0lTX0hVU0ggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfU0hfSVNfTk9ORT15CisjIENPTkZJR19GRUFUVVJFX0JBU0hfSVNfQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19IVVNIIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0JBU0hfSVNfTk9ORT15CisjIENPTkZJR19TSF9NQVRIX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfU0hfTUFUSF9TVVBQT1JUXzY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfRVhUUkFfUVVJRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9TVEFOREFMT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfTk9GT1JLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfSElTVEZJTEVTSVpFIGlzIG5vdCBzZXQKKworIworIyBTeXN0ZW0gTG9nZ2luZyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX1NZU0xPR0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ST1RBVEVfTE9HRklMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JFTU9URV9MT0cgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TWVNMT0dEX0RVUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NZU0xPR0RfQ0ZHIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1NZU0xPR0RfUkVBRF9CVUZGRVJfU0laRT0wCisjIENPTkZJR19GRUFUVVJFX0lQQ19TWVNMT0cgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfSVBDX1NZU0xPR19CVUZGRVJfU0laRT0wCisjIENPTkZJR19MT0dSRUFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTE9HUkVBRF9SRURVQ0VEX0xPQ0tJTkcgaXMgbm90IHNldAorQ09ORklHX0tMT0dEPXkKK0NPTkZJR19GRUFUVVJFX0tMT0dEX0tMT0dDVEw9eQorIyBDT05GSUdfTE9HR0VSIGlzIG5vdCBzZXQKZGlmZiAtLWdpdCBhL2NvbmZpZ3MvYW5kcm9pZF9kZWZjb25maWcgYi9jb25maWdzL2FuZHJvaWRfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNTgzMGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWdzL2FuZHJvaWRfZGVmY29uZmlnCkBAIC0wLDAgKzEsMTAyOCBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBCdXN5Ym94IHZlcnNpb246IDEuMjAuMC5naXQKKyMgU3VuIE5vdiAgNiAwNzo1MTozOCAyMDExCisjCitDT05GSUdfSEFWRV9ET1RfQ09ORklHPXkKKworIworIyBCdXN5Ym94IFNldHRpbmdzCisjCisKKyMKKyMgR2VuZXJhbCBDb25maWd1cmF0aW9uCisjCitDT05GSUdfREVTS1RPUD15CisjIENPTkZJR19FWFRSQV9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfSU5DTFVERV9TVVN2MiBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VfUE9SVEFCTEVfQ09ERSBpcyBub3Qgc2V0CitDT05GSUdfUExBVEZPUk1fTElOVVg9eQorQ09ORklHX0ZFQVRVUkVfQlVGRkVSU19VU0VfTUFMTE9DPXkKKyMgQ09ORklHX0ZFQVRVUkVfQlVGRkVSU19HT19PTl9TVEFDSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JVRkZFUlNfR09fSU5fQlNTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIT1dfVVNBR0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WRVJCT1NFX1VTQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ09NUFJFU1NfVVNBR0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNUQUxMRVIgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9OT19VU1IgaXMgbm90IHNldAorIyBDT05GSUdfTE9DQUxFX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfVVNJTkdfTE9DQUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfVU5JQ09ERV9JTl9FTlYgaXMgbm90IHNldAorQ09ORklHX1NVQlNUX1dDSEFSPTAKK0NPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUj0wCisjIENPTkZJR19VTklDT0RFX0NPTUJJTklOR19XQ0hBUlMgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9XSURFX1dDSEFSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX0JJRElfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX05FVVRSQUxfVEFCTEUgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9QUkVTRVJWRV9CUk9LRU4gaXMgbm90IHNldAorIyBDT05GSUdfTE9OR19PUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREVWUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0xFQU5fVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VVE1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfV1RNUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BJREZJTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VJRF9DT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVUlEX0NPTkZJR19RVUlFVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRUxJTlVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFMgaXMgbm90IHNldAorQ09ORklHX0JVU1lCT1hfRVhFQ19QQVRIPSIvcHJvYy9zZWxmL2V4ZSIKK0NPTkZJR19GRUFUVVJFX1NZU0xPRz15CisjIENPTkZJR19GRUFUVVJFX0hBVkVfUlBDIGlzIG5vdCBzZXQKKworIworIyBCdWlsZCBPcHRpb25zCisjCisjIENPTkZJR19TVEFUSUMgaXMgbm90IHNldAorIyBDT05GSUdfUElFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05PTU1VIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JVSUxEX0xJQkJVU1lCT1ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkRJVklEVUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hBUkVEX0JVU1lCT1ggaXMgbm90IHNldAorIyBDT05GSUdfTEZTIGlzIG5vdCBzZXQKK0NPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVg9ImFybS1lYWJpLSIKKyMKKyMgUmVtb3ZlZDoKKyMgd2FybmluZyBmbGFnczoKKyMgLVduby1tdWx0aWNoYXIgLVcgLVdhbGwgLVduby11bnVzZWQgLVdpbml0LXNlbGYgLVdwb2ludGVyLWFyaXRoCisjIC1XZXJyb3I9cmV0dXJuLXR5cGUgLVdlcnJvcj1ub24tdmlydHVhbC1kdG9yIC1XZXJyb3I9YWRkcmVzcworIyAtV2Vycm9yPXNlcXVlbmNlLXBvaW50IC1Xc3RyaWN0LWFsaWFzaW5nPTIgLVduby11bmRlZiAtV25vLXNoYWRvdworIyBiYm94IGFscmVhZHkgYWRkcyB0aGVzZToKKyMgLWZmdW5jdGlvbi1zZWN0aW9ucyAtZm9taXQtZnJhbWUtcG9pbnRlcgorIyBlbmFibGVkIGltcGxpY2l0bHkgYnkgLU9zOgorIyAtZnJlcnVuLWNzZS1hZnRlci1sb29wCisjIHNob3VsZCBiZSBub3QgbmVlZGVkLCBvciBldmVuIGluY3JlYXNlcyBjb2RlIHNpemU6CisjIC1maW5saW5lLWZ1bmN0aW9ucyAtZm5vLWlubGluZS1mdW5jdGlvbnMtY2FsbGVkLW9uY2UgLWZpbmxpbmUtbGltaXQ9NjQKKyMgLWZzdGFjay1wcm90ZWN0b3IgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZuby1leGNlcHRpb25zIC1mdW53aW5kLXRhYmxlcworIyAtZm1lc3NhZ2UtbGVuZ3RoPTAgKG9ubHkgYWZmZWN0cyBlcnJvciBtZXNzYWdlIGZvcm1hdCkKKyMgdG9kbzogZG8gd2UgbmVlZCB0aGVzZT8gLQorIyAtZm5vLXNob3J0LWVudW1zCisjIC1mZ2NzZS1hZnRlci1yZWxvYWQKKyMgLWZyZW5hbWUtcmVnaXN0ZXJzCitDT05GSUdfRVhUUkFfQ0ZMQUdTPSItSSRBL3N5c3RlbS9jb3JlL2luY2x1ZGUgLUkkQS9iaW9uaWMvbGliYy9hcmNoLWFybS9pbmNsdWRlIC1JJEEvYmlvbmljL2xpYmMvaW5jbHVkZSAtSSRBL2Jpb25pYy9saWJjL2tlcm5lbC9jb21tb24gLUkkQS9iaW9uaWMvbGliYy9rZXJuZWwvYXJjaC1hcm0gLUkkQS9iaW9uaWMvbGlibS9pbmNsdWRlIC1JJEEvYmlvbmljL2xpYm0vaW5jbHVkZS9hcmNoL2FybSAtaW5jbHVkZSAkQS9zeXN0ZW0vY29yZS9pbmNsdWRlL2FyY2gvbGludXgtYXJtL0FuZHJvaWRDb25maWcuaCAtSSRBL3N5c3RlbS9jb3JlL2luY2x1ZGUvYXJjaC9saW51eC1hcm0vIC1EX19BTkRST0lEX18gLURTS19SRUxFQVNFIC1ub3N0ZGxpYiAtbWFyY2g9YXJtdjctYSAtbXNvZnQtZmxvYXQgLW1mbG9hdC1hYmk9c29mdGZwIC1tZnB1PW5lb24gLW10aHVtYiAtbXRodW1iLWludGVyd29yayAtZnBpYyAtZm5vLXNob3J0LWVudW1zIC1mZ2NzZS1hZnRlci1yZWxvYWQgLWZyZW5hbWUtcmVnaXN0ZXJzIgorCisjCisjIERlYnVnZ2luZyBPcHRpb25zCisjCisjIENPTkZJR19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19QRVNTSU1JWkUgaXMgbm90IHNldAorIyBDT05GSUdfV0VSUk9SIGlzIG5vdCBzZXQKK0NPTkZJR19OT19ERUJVR19MSUI9eQorIyBDT05GSUdfRE1BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19FRkVOQ0UgaXMgbm90IHNldAorCisjCisjIEluc3RhbGxhdGlvbiBPcHRpb25zICgibWFrZSBpbnN0YWxsIiBiZWhhdmlvcikKKyMKK0NPTkZJR19JTlNUQUxMX0FQUExFVF9TWU1MSU5LUz15CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9IQVJETElOS1MgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfU0NSSVBUX1dSQVBQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX0RPTlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfU1lNTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9IQVJETElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9TQ1JJUFRfV1JBUFBFUiBpcyBub3Qgc2V0CitDT05GSUdfUFJFRklYPSIuL19pbnN0YWxsIgorCisjCisjIEJ1c3lib3ggTGlicmFyeSBUdW5pbmcKKyMKKyMgQ09ORklHX0ZFQVRVUkVfU1lTVEVNRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JUTUlOTUFYIGlzIG5vdCBzZXQKK0NPTkZJR19QQVNTV09SRF9NSU5MRU49NgorQ09ORklHX01ENV9TTUFMTD0xCisjIENPTkZJR19GRUFUVVJFX0ZBU1RfVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRVRDX05FVFdPUktTIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1VTRV9URVJNSU9TPXkKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElORyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX01BWF9MRU49MAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX1ZJIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfSElTVE9SWT0wCisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX1NBVkVfT05fRVhJVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JFVkVSU0VfU0VBUkNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX0FTS19URVJNSU5BTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05PTl9QT1NJWF9DUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZFUkJPU0VfQ1BfTUVTU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9DT1BZQlVGX0tCPTQKKyMgQ09ORklHX0ZFQVRVUkVfU0tJUF9ST09URlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9OT1RPTklDX1NZU0NBTEwgaXMgbm90IHNldAorIyBDT05GSUdfSU9DVExfSEVYMlNUUl9FUlJPUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hXSUIgaXMgbm90IHNldAorCisjCisjIEFwcGxldHMKKyMKKworIworIyBBcmNoaXZhbCBVdGlsaXRpZXMKKyMKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX1haPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0xaTUE9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfQloyPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0daPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX1o9eQorQ09ORklHX0FSPXkKK0NPTkZJR19GRUFUVVJFX0FSX0xPTkdfRklMRU5BTUVTPXkKK0NPTkZJR19GRUFUVVJFX0FSX0NSRUFURT15CitDT05GSUdfQlVOWklQMj15CitDT05GSUdfQlpJUDI9eQorQ09ORklHX0NQSU89eQorQ09ORklHX0ZFQVRVUkVfQ1BJT19PPXkKK0NPTkZJR19GRUFUVVJFX0NQSU9fUD15CitDT05GSUdfRFBLRz15CitDT05GSUdfRFBLR19ERUI9eQorIyBDT05GSUdfRkVBVFVSRV9EUEtHX0RFQl9FWFRSQUNUX09OTFkgaXMgbm90IHNldAorQ09ORklHX0dVTlpJUD15CitDT05GSUdfR1pJUD15CisjIENPTkZJR19GRUFUVVJFX0daSVBfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19HWklQX0ZBU1Q9MAorQ09ORklHX0xaT1A9eQorQ09ORklHX0xaT1BfQ09NUFJfSElHSD15CitDT05GSUdfUlBNMkNQSU89eQorQ09ORklHX1JQTT15CitDT05GSUdfVEFSPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9DUkVBVEU9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0FVVE9ERVRFQ1Q9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0ZST009eQorQ09ORklHX0ZFQVRVUkVfVEFSX09MREdOVV9DT01QQVRJQklMSVRZPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9PTERTVU5fQ09NUEFUSUJJTElUWT15CitDT05GSUdfRkVBVFVSRV9UQVJfR05VX0VYVEVOU0lPTlM9eQorIyBDT05GSUdfRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX1RPX0NPTU1BTkQgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9OT1BSRVNFUlZFX1RJTUU9eQorIyBDT05GSUdfRkVBVFVSRV9UQVJfU0VMSU5VWCBpcyBub3Qgc2V0CitDT05GSUdfVU5DT01QUkVTUz15CitDT05GSUdfVU5MWk1BPXkKK0NPTkZJR19GRUFUVVJFX0xaTUFfRkFTVD15CitDT05GSUdfTFpNQT15CitDT05GSUdfVU5YWj15CitDT05GSUdfWFo9eQorQ09ORklHX1VOWklQPXkKKworIworIyBDb3JldXRpbHMKKyMKK0NPTkZJR19CQVNFTkFNRT15CitDT05GSUdfQ0FUPXkKKyMgQ09ORklHX0RBVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EQVRFX0lTT0ZNVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RBVEVfTkFOTyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RBVEVfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPU1RJRCBpcyBub3Qgc2V0CisjIENPTkZJR19JRCBpcyBub3Qgc2V0CisjIENPTkZJR19HUk9VUFMgaXMgbm90IHNldAorQ09ORklHX1RFU1Q9eQorQ09ORklHX0ZFQVRVUkVfVEVTVF82ND15CitDT05GSUdfVE9VQ0g9eQorQ09ORklHX0ZFQVRVUkVfVE9VQ0hfU1VTVjM9eQorQ09ORklHX1RSPXkKK0NPTkZJR19GRUFUVVJFX1RSX0NMQVNTRVM9eQorQ09ORklHX0ZFQVRVUkVfVFJfRVFVSVY9eQorQ09ORklHX0JBU0U2ND15CisjIENPTkZJR19XSE8gaXMgbm90IHNldAorIyBDT05GSUdfVVNFUlMgaXMgbm90IHNldAorQ09ORklHX0NBTD15CitDT05GSUdfQ0FUVj15CitDT05GSUdfQ0hHUlA9eQorQ09ORklHX0NITU9EPXkKK0NPTkZJR19DSE9XTj15CisjIENPTkZJR19GRUFUVVJFX0NIT1dOX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfQ0hST09UPXkKK0NPTkZJR19DS1NVTT15CitDT05GSUdfQ09NTT15CitDT05GSUdfQ1A9eQorIyBDT05GSUdfRkVBVFVSRV9DUF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0NVVD15CitDT05GSUdfREQ9eQorQ09ORklHX0ZFQVRVUkVfRERfU0lHTkFMX0hBTkRMSU5HPXkKK0NPTkZJR19GRUFUVVJFX0REX1RISVJEX1NUQVRVU19MSU5FPXkKK0NPTkZJR19GRUFUVVJFX0REX0lCU19PQlM9eQorIyBDT05GSUdfREYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERl9GQU5DWSBpcyBub3Qgc2V0CitDT05GSUdfRElSTkFNRT15CitDT05GSUdfRE9TMlVOSVg9eQorQ09ORklHX1VOSVgyRE9TPXkKK0NPTkZJR19EVT15CitDT05GSUdfRkVBVFVSRV9EVV9ERUZBVUxUX0JMT0NLU0laRV8xSz15CitDT05GSUdfRUNITz15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9FQ0hPPXkKK0NPTkZJR19FTlY9eQorIyBDT05GSUdfRkVBVFVSRV9FTlZfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19FWFBBTkQ9eQorIyBDT05GSUdfRkVBVFVSRV9FWFBBTkRfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19FWFBSPXkKK0NPTkZJR19FWFBSX01BVEhfU1VQUE9SVF82ND15CitDT05GSUdfRkFMU0U9eQorQ09ORklHX0ZPTEQ9eQorQ09ORklHX0ZTWU5DPXkKK0NPTkZJR19IRUFEPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX0hFQUQ9eQorQ09ORklHX0lOU1RBTEw9eQorIyBDT05GSUdfRkVBVFVSRV9JTlNUQUxMX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTE49eQorIyBDT05GSUdfTE9HTkFNRSBpcyBub3Qgc2V0CitDT05GSUdfTFM9eQorQ09ORklHX0ZFQVRVUkVfTFNfRklMRVRZUEVTPXkKK0NPTkZJR19GRUFUVVJFX0xTX0ZPTExPV0xJTktTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1JFQ1VSU0lWRT15CitDT05GSUdfRkVBVFVSRV9MU19TT1JURklMRVM9eQorQ09ORklHX0ZFQVRVUkVfTFNfVElNRVNUQU1QUz15CitDT05GSUdfRkVBVFVSRV9MU19VU0VSTkFNRT15CisjIENPTkZJR19GRUFUVVJFX0xTX0NPTE9SIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTFNfQ09MT1JfSVNfREVGQVVMVCBpcyBub3Qgc2V0CitDT05GSUdfTUQ1U1VNPXkKK0NPTkZJR19NS0RJUj15CisjIENPTkZJR19GRUFUVVJFX01LRElSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTUtGSUZPPXkKK0NPTkZJR19NS05PRD15CitDT05GSUdfTVY9eQorIyBDT05GSUdfRkVBVFVSRV9NVl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX05JQ0U9eQorQ09ORklHX05PSFVQPXkKK0NPTkZJR19PRD15CitDT05GSUdfUFJJTlRFTlY9eQorQ09ORklHX1BSSU5URj15CitDT05GSUdfUFdEPXkKK0NPTkZJR19SRUFETElOSz15CitDT05GSUdfRkVBVFVSRV9SRUFETElOS19GT0xMT1c9eQorQ09ORklHX1JFQUxQQVRIPXkKK0NPTkZJR19STT15CitDT05GSUdfUk1ESVI9eQorIyBDT05GSUdfRkVBVFVSRV9STURJUl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX1NFUT15CitDT05GSUdfU0hBMVNVTT15CitDT05GSUdfU0hBMjU2U1VNPXkKK0NPTkZJR19TSEE1MTJTVU09eQorQ09ORklHX1NMRUVQPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX1NMRUVQPXkKK0NPTkZJR19GRUFUVVJFX0ZMT0FUX1NMRUVQPXkKK0NPTkZJR19TT1JUPXkKK0NPTkZJR19GRUFUVVJFX1NPUlRfQklHPXkKK0NPTkZJR19TUExJVD15CitDT05GSUdfRkVBVFVSRV9TUExJVF9GQU5DWT15CisjIENPTkZJR19TVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1RBVF9GT1JNQVQgaXMgbm90IHNldAorQ09ORklHX1NUVFk9eQorQ09ORklHX1NVTT15CitDT05GSUdfU1lOQz15CitDT05GSUdfVEFDPXkKK0NPTkZJR19UQUlMPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX1RBSUw9eQorQ09ORklHX1RFRT15CitDT05GSUdfRkVBVFVSRV9URUVfVVNFX0JMT0NLX0lPPXkKK0NPTkZJR19UUlVFPXkKKyMgQ09ORklHX1RUWSBpcyBub3Qgc2V0CitDT05GSUdfVU5BTUU9eQorQ09ORklHX1VORVhQQU5EPXkKKyMgQ09ORklHX0ZFQVRVUkVfVU5FWFBBTkRfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19VTklRPXkKK0NPTkZJR19VU0xFRVA9eQorQ09ORklHX1VVREVDT0RFPXkKK0NPTkZJR19VVUVOQ09ERT15CitDT05GSUdfV0M9eQorQ09ORklHX0ZFQVRVUkVfV0NfTEFSR0U9eQorQ09ORklHX1dIT0FNST15CitDT05GSUdfWUVTPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgY3AgYW5kIG12CisjCitDT05GSUdfRkVBVFVSRV9QUkVTRVJWRV9IQVJETElOS1M9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBscywgbW9yZSBhbmQgdGVsbmV0CisjCitDT05GSUdfRkVBVFVSRV9BVVRPV0lEVEg9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBkZiwgZHUsIGxzCisjCitDT05GSUdfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRT15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIG1kNXN1bSwgc2hhMXN1bSwgc2hhMjU2c3VtLCBzaGE1MTJzdW0KKyMKK0NPTkZJR19GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSz15CisKKyMKKyMgQ29uc29sZSBVdGlsaXRpZXMKKyMKK0NPTkZJR19DSFZUPXkKK0NPTkZJR19GR0NPTlNPTEU9eQorQ09ORklHX0NMRUFSPXkKK0NPTkZJR19ERUFMTE9DVlQ9eQorQ09ORklHX0RVTVBLTUFQPXkKKyMgQ09ORklHX0tCRF9NT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQURGT05UIGlzIG5vdCBzZXQKK0NPTkZJR19MT0FES01BUD15CitDT05GSUdfT1BFTlZUPXkKK0NPTkZJR19SRVNFVD15CitDT05GSUdfUkVTSVpFPXkKK0NPTkZJR19GRUFUVVJFX1JFU0laRV9QUklOVD15CitDT05GSUdfU0VUQ09OU09MRT15CisjIENPTkZJR19GRUFUVVJFX1NFVENPTlNPTEVfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEZPTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRGT05UX1RFWFRVQUxfTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX1NFVEZPTlRfRElSPSIiCitDT05GSUdfU0VUS0VZQ09ERVM9eQorQ09ORklHX1NFVExPR0NPTlM9eQorQ09ORklHX1NIT1dLRVk9eQorIyBDT05GSUdfRkVBVFVSRV9MT0FERk9OVF9QU0YyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTE9BREZPTlRfUkFXIGlzIG5vdCBzZXQKKworIworIyBEZWJpYW4gVXRpbGl0aWVzCisjCitDT05GSUdfTUtURU1QPXkKK0NPTkZJR19QSVBFX1BST0dSRVNTPXkKK0NPTkZJR19SVU5fUEFSVFM9eQorIyBDT05GSUdfRkVBVFVSRV9SVU5fUEFSVFNfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1JVTl9QQVJUU19GQU5DWT15CitDT05GSUdfU1RBUlRfU1RPUF9EQUVNT049eQorQ09ORklHX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fRkFOQ1k9eQorIyBDT05GSUdfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX1dISUNIPXkKKworIworIyBFZGl0b3JzCisjCitDT05GSUdfUEFUQ0g9eQorQ09ORklHX1ZJPXkKK0NPTkZJR19GRUFUVVJFX1ZJX01BWF9MRU49NDA5NgorQ09ORklHX0ZFQVRVUkVfVklfOEJJVD15CitDT05GSUdfRkVBVFVSRV9WSV9DT0xPTj15CitDT05GSUdfRkVBVFVSRV9WSV9ZQU5LTUFSSz15CitDT05GSUdfRkVBVFVSRV9WSV9TRUFSQ0g9eQorIyBDT05GSUdfRkVBVFVSRV9WSV9SRUdFWF9TRUFSQ0ggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVklfVVNFX1NJR05BTFM9eQorQ09ORklHX0ZFQVRVUkVfVklfRE9UX0NNRD15CitDT05GSUdfRkVBVFVSRV9WSV9SRUFET05MWT15CitDT05GSUdfRkVBVFVSRV9WSV9TRVRPUFRTPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1NFVD15CitDT05GSUdfRkVBVFVSRV9WSV9XSU5fUkVTSVpFPXkKK0NPTkZJR19GRUFUVVJFX1ZJX0FTS19URVJNSU5BTD15CitDT05GSUdfQVdLPXkKK0NPTkZJR19GRUFUVVJFX0FXS19MSUJNPXkKK0NPTkZJR19DTVA9eQorQ09ORklHX0RJRkY9eQorIyBDT05GSUdfRkVBVFVSRV9ESUZGX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9ESUZGX0RJUj15CitDT05GSUdfRUQ9eQorQ09ORklHX1NFRD15CitDT05GSUdfRkVBVFVSRV9BTExPV19FWEVDPXkKKworIworIyBGaW5kaW5nIFV0aWxpdGllcworIworQ09ORklHX0ZJTkQ9eQorQ09ORklHX0ZFQVRVUkVfRklORF9QUklOVDA9eQorQ09ORklHX0ZFQVRVUkVfRklORF9NVElNRT15CitDT05GSUdfRkVBVFVSRV9GSU5EX01NSU49eQorQ09ORklHX0ZFQVRVUkVfRklORF9QRVJNPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfVFlQRT15CitDT05GSUdfRkVBVFVSRV9GSU5EX1hERVY9eQorQ09ORklHX0ZFQVRVUkVfRklORF9NQVhERVBUSD15CitDT05GSUdfRkVBVFVSRV9GSU5EX05FV0VSPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfSU5VTT15CitDT05GSUdfRkVBVFVSRV9GSU5EX0VYRUM9eQorQ09ORklHX0ZFQVRVUkVfRklORF9VU0VSPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfR1JPVVA9eQorQ09ORklHX0ZFQVRVUkVfRklORF9OT1Q9eQorQ09ORklHX0ZFQVRVUkVfRklORF9ERVBUSD15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BBUkVOPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfU0laRT15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BSVU5FPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfREVMRVRFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUEFUSD15CitDT05GSUdfRkVBVFVSRV9GSU5EX1JFR0VYPXkKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9DT05URVhUIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTElOS1M9eQorQ09ORklHX0dSRVA9eQorQ09ORklHX0ZFQVRVUkVfR1JFUF9FR1JFUF9BTElBUz15CitDT05GSUdfRkVBVFVSRV9HUkVQX0ZHUkVQX0FMSUFTPXkKK0NPTkZJR19GRUFUVVJFX0dSRVBfQ09OVEVYVD15CitDT05GSUdfWEFSR1M9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT049eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9RVU9URVM9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9URVJNT1BUPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNPXkKKworIworIyBJbml0IFV0aWxpdGllcworIworQ09ORklHX0JPT1RDSEFSVEQ9eQorQ09ORklHX0ZFQVRVUkVfQk9PVENIQVJURF9CTE9BVEVEX0hFQURFUj15CitDT05GSUdfRkVBVFVSRV9CT09UQ0hBUlREX0NPTkZJR19GSUxFPXkKK0NPTkZJR19IQUxUPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ0FMTF9URUxJTklUIGlzIG5vdCBzZXQKK0NPTkZJR19URUxJTklUX1BBVEg9IiIKK0NPTkZJR19JTklUPXkKK0NPTkZJR19GRUFUVVJFX1VTRV9JTklUVEFCPXkKKyMgQ09ORklHX0ZFQVRVUkVfS0lMTF9SRU1PVkVEIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0tJTExfREVMQVk9MAorQ09ORklHX0ZFQVRVUkVfSU5JVF9TQ1RUWT15CitDT05GSUdfRkVBVFVSRV9JTklUX1NZU0xPRz15CitDT05GSUdfRkVBVFVSRV9FWFRSQV9RVUlFVD15CitDT05GSUdfRkVBVFVSRV9JTklUX0NPUkVEVU1QUz15CitDT05GSUdfRkVBVFVSRV9JTklUUkQ9eQorQ09ORklHX0lOSVRfVEVSTUlOQUxfVFlQRT0ibGludXgiCitDT05GSUdfTUVTRz15CitDT05GSUdfRkVBVFVSRV9NRVNHX0VOQUJMRV9PTkxZX0dST1VQPXkKKworIworIyBMb2dpbi9QYXNzd29yZCBNYW5hZ2VtZW50IFV0aWxpdGllcworIworIyBDT05GSUdfQUREX1NIRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTU9WRV9TSEVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIQURPV1BBU1NXRFMgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0JCX1BXRF9HUlAgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0JCX1NIQURPVyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VfQkJfQ1JZUFQgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0JCX0NSWVBUX1NIQSBpcyBub3Qgc2V0CisjIENPTkZJR19BRERVU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUREVVNFUl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEVDS19OQU1FUyBpcyBub3Qgc2V0CitDT05GSUdfRklSU1RfU1lTVEVNX0lEPTAKK0NPTkZJR19MQVNUX1NZU1RFTV9JRD0wCisjIENPTkZJR19BRERHUk9VUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FEREdST1VQX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FERFVTRVJfVE9fR1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfREVMVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19ERUxHUk9VUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RFTF9VU0VSX0ZST01fR1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfR0VUVFkgaXMgbm90IHNldAorIyBDT05GSUdfTE9HSU4gaXMgbm90IHNldAorIyBDT05GSUdfTE9HSU5fU0VTU0lPTl9BU19DSElMRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQU0gaXMgbm90IHNldAorIyBDT05GSUdfTE9HSU5fU0NSSVBUUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05PTE9HSU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRUNVUkVUVFkgaXMgbm90IHNldAorIyBDT05GSUdfUEFTU1dEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUEFTU1dEX1dFQUtfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRQVyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFBBU1NXRCBpcyBub3Qgc2V0CisjIENPTkZJR19TVSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVX1NZU0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVX0NIRUNLU19TSEVMTFMgaXMgbm90IHNldAorIyBDT05GSUdfU1VMT0dJTiBpcyBub3Qgc2V0CisjIENPTkZJR19WTE9DSyBpcyBub3Qgc2V0CisKKyMKKyMgTGludXggRXh0MiBGUyBQcm9ncworIworQ09ORklHX0NIQVRUUj15CisjIENPTkZJR19GU0NLIGlzIG5vdCBzZXQKK0NPTkZJR19MU0FUVFI9eQorQ09ORklHX1RVTkUyRlM9eQorCisjCisjIExpbnV4IE1vZHVsZSBVdGlsaXRpZXMKKyMKK0NPTkZJR19NT0RJTkZPPXkKK0NPTkZJR19NT0RQUk9CRV9TTUFMTD15CitDT05GSUdfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9PUFRJT05TX09OX0NNRExJTkU9eQorQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfU01BTExfQ0hFQ0tfQUxSRUFEWV9MT0FERUQ9eQorIyBDT05GSUdfSU5TTU9EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JNTU9EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTTU9EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTFNNT0RfUFJFVFRZXzJfNl9PVVRQVVQgaXMgbm90IHNldAorIyBDT05GSUdfTU9EUFJPQkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT0RQUk9CRV9CTEFDS0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVQTU9EIGlzIG5vdCBzZXQKKworIworIyBPcHRpb25zIGNvbW1vbiB0byBtdWx0aXBsZSBtb2R1dGlscworIworIyBDT05GSUdfRkVBVFVSRV8yXzRfTU9EVUxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9UUllfTU1BUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0tTWU1PT1BTX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRElOS01FTSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FEX01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FEX01BUF9GVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfVEFJTlRFRF9NT0RVTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT0RVVElMU19BTElBUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFVUSUxTX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfTU9EVUxFU19ESVI9Ii9saWIvbW9kdWxlcyIKK0NPTkZJR19ERUZBVUxUX0RFUE1PRF9GSUxFPSJtb2R1bGVzLmRlcCIKKworIworIyBMaW51eCBTeXN0ZW0gVXRpbGl0aWVzCisjCitDT05GSUdfQkxPQ0tERVY9eQorQ09ORklHX01ERVY9eQorQ09ORklHX0ZFQVRVUkVfTURFVl9DT05GPXkKK0NPTkZJR19GRUFUVVJFX01ERVZfUkVOQU1FPXkKK0NPTkZJR19GRUFUVVJFX01ERVZfUkVOQU1FX1JFR0VYUD15CitDT05GSUdfRkVBVFVSRV9NREVWX0VYRUM9eQorQ09ORklHX0ZFQVRVUkVfTURFVl9MT0FEX0ZJUk1XQVJFPXkKK0NPTkZJR19SRVY9eQorIyBDT05GSUdfQUNQSUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BQ1BJRF9DT01QQVQgaXMgbm90IHNldAorQ09ORklHX0JMS0lEPXkKK0NPTkZJR19GRUFUVVJFX0JMS0lEX1RZUEU9eQorQ09ORklHX0RNRVNHPXkKK0NPTkZJR19GRUFUVVJFX0RNRVNHX1BSRVRUWT15CitDT05GSUdfRkJTRVQ9eQorQ09ORklHX0ZFQVRVUkVfRkJTRVRfRkFOQ1k9eQorQ09ORklHX0ZFQVRVUkVfRkJTRVRfUkVBRE1PREU9eQorQ09ORklHX0ZERkxVU0g9eQorQ09ORklHX0ZERk9STUFUPXkKK0NPTkZJR19GRElTSz15CitDT05GSUdfRkRJU0tfU1VQUE9SVF9MQVJHRV9ESVNLUz15CitDT05GSUdfRkVBVFVSRV9GRElTS19XUklUQUJMRT15CisjIENPTkZJR19GRUFUVVJFX0FJWF9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NHSV9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVTl9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX09TRl9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0dQVF9MQUJFTCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9GRElTS19BRFZBTkNFRD15CitDT05GSUdfRklOREZTPXkKK0NPTkZJR19GTE9DSz15CitDT05GSUdfRlJFRVJBTURJU0s9eQorIyBDT05GSUdfRlNDS19NSU5JWCBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX0VYVDIgaXMgbm90IHNldAorIyBDT05GSUdfTUtGU19NSU5JWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01JTklYMiBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX1JFSVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX1ZGQVQgaXMgbm90IHNldAorQ09ORklHX0dFVE9QVD15CitDT05GSUdfRkVBVFVSRV9HRVRPUFRfTE9ORz15CitDT05GSUdfSEVYRFVNUD15CitDT05GSUdfRkVBVFVSRV9IRVhEVU1QX1JFVkVSU0U9eQorQ09ORklHX0hEPXkKK0NPTkZJR19IV0NMT0NLPXkKKyMgQ09ORklHX0ZFQVRVUkVfSFdDTE9DS19MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IV0NMT0NLX0FESlRJTUVfRkhTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQQ1JNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQQ1MgaXMgbm90IHNldAorQ09ORklHX0xPU0VUVVA9eQorQ09ORklHX0xTUENJPXkKK0NPTkZJR19MU1VTQj15CitDT05GSUdfTUtTV0FQPXkKK0NPTkZJR19GRUFUVVJFX01LU1dBUF9VVUlEPXkKK0NPTkZJR19NT1JFPXkKKyMgQ09ORklHX01PVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkFLRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9ORlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkxBR1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9GU1RBQiBpcyBub3Qgc2V0CisjIENPTkZJR19QSVZPVF9ST09UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEQVRFIGlzIG5vdCBzZXQKK0NPTkZJR19SREVWPXkKK0NPTkZJR19SRUFEUFJPRklMRT15CitDT05GSUdfUlRDV0FLRT15CitDT05GSUdfU0NSSVBUPXkKK0NPTkZJR19TQ1JJUFRSRVBMQVk9eQorIyBDT05GSUdfU0VUQVJDSCBpcyBub3Qgc2V0CisjIENPTkZJR19TV0FQT05PRkYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TV0FQT05fUFJJIGlzIG5vdCBzZXQKK0NPTkZJR19TV0lUQ0hfUk9PVD15CisjIENPTkZJR19VTU9VTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VTU9VTlRfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0xPT1BfQ1JFQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTVRBQl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19WT0xVTUVJRD15CisKKyMKKyMgRmlsZXN5c3RlbS9Wb2x1bWUgaWRlbnRpZmljYXRpb24KKyMKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0VYVD15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9CVFJGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9SRUlTRVJGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9GQVQ9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSEZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0pGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9YRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTlRGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9JU085NjYwPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1VERj15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MVUtTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xJTlVYU1dBUD15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9DUkFNRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfUk9NRlM9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfU1lTVj15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9PQ0ZTMj15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFJBSUQ9eQorCisjCisjIE1pc2NlbGxhbmVvdXMgVXRpbGl0aWVzCisjCisjIENPTkZJR19DT05TUFkgaXMgbm90IHNldAorQ09ORklHX0xFU1M9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19NQVhMSU5FUz05OTk5OTk5CitDT05GSUdfRkVBVFVSRV9MRVNTX0JSQUNLRVRTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfRkxBR1M9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19NQVJLUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX1JFR0VYUD15CitDT05GSUdfRkVBVFVSRV9MRVNTX1dJTkNIPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfQVNLX1RFUk1JTkFMPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfREFTSENNRD15CitDT05GSUdfRkVBVFVSRV9MRVNTX0xJTkVOVU1TPXkKKyMgQ09ORklHX05BTkRXUklURSBpcyBub3Qgc2V0CitDT05GSUdfTkFORERVTVA9eQorQ09ORklHX1NFVFNFUklBTD15CisjIENPTkZJR19VQklBVFRBQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVUJJREVUQUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSU1LVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVJNVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVJTVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVVQREFURVZPTCBpcyBub3Qgc2V0CisjIENPTkZJR19BREpUSU1FWCBpcyBub3Qgc2V0CisjIENPTkZJR19CQkNPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NPTVBSRVNTX0JCQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19CRUVQPXkKK0NPTkZJR19GRUFUVVJFX0JFRVBfRlJFUT00MDAwCitDT05GSUdfRkVBVFVSRV9CRUVQX0xFTkdUSF9NUz0zMAorQ09ORklHX0NIQVQ9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9OT0ZBSUw9eQorIyBDT05GSUdfRkVBVFVSRV9DSEFUX1RUWV9ISUZJIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0NIQVRfSU1QTElDSVRfQ1I9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9TV0FMTE9XX09QVFM9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9TRU5EX0VTQ0FQRVM9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9WQVJfQUJPUlRfTEVOPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfQ0xSX0FCT1JUPXkKK0NPTkZJR19DSFJUPXkKK0NPTkZJR19DUk9ORD15CitDT05GSUdfRkVBVFVSRV9DUk9ORF9EPXkKK0NPTkZJR19GRUFUVVJFX0NST05EX0NBTExfU0VORE1BSUw9eQorQ09ORklHX0ZFQVRVUkVfQ1JPTkRfRElSPSIvdmFyL3Nwb29sL2Nyb24iCitDT05GSUdfQ1JPTlRBQj15CitDT05GSUdfREM9eQorQ09ORklHX0ZFQVRVUkVfRENfTElCTT15CisjIENPTkZJR19ERVZGU0QgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX01PRExPQUQgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX0ZHX05QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRF9WRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREVWRlMgaXMgbm90IHNldAorQ09ORklHX0RFVk1FTT15CisjIENPTkZJR19FSkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VKRUNUX1NDU0kgaXMgbm90IHNldAorQ09ORklHX0ZCU1BMQVNIPXkKK0NPTkZJR19GTEFTSENQPXkKK0NPTkZJR19GTEFTSF9MT0NLPXkKK0NPTkZJR19GTEFTSF9VTkxPQ0s9eQorIyBDT05GSUdfRkxBU0hfRVJBU0VBTEwgaXMgbm90IHNldAorIyBDT05GSUdfSU9OSUNFIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZRD15CisjIENPTkZJR19MQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEFTVF9TTUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xBU1RfRkFOQ1kgaXMgbm90IHNldAorQ09ORklHX0hEUEFSTT15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZPXkKK0NPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1NDQU5fSFdJRj15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19VTlJFR0lTVEVSX0hXSUY9eQorQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fRFJJVkVfUkVTRVQ9eQorQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRj15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19HRVRTRVRfRE1BPXkKK0NPTkZJR19NQUtFREVWUz15CisjIENPTkZJR19GRUFUVVJFX01BS0VERVZTX0xFQUYgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTUFLRURFVlNfVEFCTEU9eQorQ09ORklHX01BTj15CisjIENPTkZJR19NSUNST0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VOVFBPSU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01UIGlzIG5vdCBzZXQKK0NPTkZJR19SQUlEQVVUT1JVTj15CisjIENPTkZJR19SRUFEQUhFQUQgaXMgbm90IHNldAorIyBDT05GSUdfUkZLSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JVTkxFVkVMIGlzIG5vdCBzZXQKK0NPTkZJR19SWD15CitDT05GSUdfU0VUU0lEPXkKK0NPTkZJR19TVFJJTkdTPXkKKyMgQ09ORklHX1RBU0tTRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVNLU0VUX0ZBTkNZIGlzIG5vdCBzZXQKK0NPTkZJR19USU1FPXkKK0NPTkZJR19USU1FT1VUPXkKK0NPTkZJR19UVFlTSVpFPXkKK0NPTkZJR19WT0xOQU1FPXkKKyMgQ09ORklHX1dBTEwgaXMgbm90IHNldAorIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmtpbmcgVXRpbGl0aWVzCisjCisjIENPTkZJR19OQU1FSUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQgaXMgbm90IHNldAorQ09ORklHX05CRENMSUVOVD15CitDT05GSUdfTkM9eQorQ09ORklHX05DX1NFUlZFUj15CitDT05GSUdfTkNfRVhUUkE9eQorIyBDT05GSUdfTkNfMTEwX0NPTVBBVCBpcyBub3Qgc2V0CitDT05GSUdfUElORz15CisjIENPTkZJR19QSU5HNiBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9GQU5DWV9QSU5HPXkKK0NPTkZJR19XSE9JUz15CisjIENPTkZJR19GRUFUVVJFX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VTklYX0xPQ0FMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0lQVjRfQUREUkVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRVJCT1NFX1JFU09MVVRJT05fRVJST1JTIGlzIG5vdCBzZXQKK0NPTkZJR19BUlA9eQorIyBDT05GSUdfQVJQSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSQ1RMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlJDVExfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CUkNUTF9TSE9XIGlzIG5vdCBzZXQKK0NPTkZJR19ETlNEPXkKKyMgQ09ORklHX0VUSEVSX1dBS0UgaXMgbm90IHNldAorQ09ORklHX0ZBS0VJREVOVEQ9eQorQ09ORklHX0ZUUEQ9eQorQ09ORklHX0ZFQVRVUkVfRlRQX1dSSVRFPXkKK0NPTkZJR19GRUFUVVJFX0ZUUERfQUNDRVBUX0JST0tFTl9MSVNUPXkKK0NPTkZJR19GVFBHRVQ9eQorQ09ORklHX0ZUUFBVVD15CisjIENPTkZJR19GRUFUVVJFX0ZUUEdFVFBVVF9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfSE9TVE5BTUUgaXMgbm90IHNldAorQ09ORklHX0hUVFBEPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1JBTkdFUz15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9VU0VfU0VOREZJTEU9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfU0VUVUlEPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEg9eQorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9BVVRIX01ENSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9IVFRQRF9DR0k9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfQ09ORklHX1dJVEhfU0NSSVBUX0lOVEVSUFI9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfU0VUX1JFTU9URV9QT1JUX1RPX0VOVj15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9FTkNPREVfVVJMX1NUUj15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9FUlJPUl9QQUdFUz15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9QUk9YWT15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9HWklQPXkKK0NPTkZJR19JRkNPTkZJRz15CitDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19TVEFUVVM9eQorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19TTElQIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0lGQ09ORklHX01FTVNUQVJUX0lPQUREUl9JUlE9eQorQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfSFc9eQorQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfQlJPQURDQVNUX1BMVVM9eQorIyBDT05GSUdfSUZFTlNMQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lGUExVR0QgaXMgbm90IHNldAorQ09ORklHX0lGVVBET1dOPXkKK0NPTkZJR19JRlVQRE9XTl9JRlNUQVRFX1BBVEg9Ii92YXIvcnVuL2lmc3RhdGUiCitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUD15CitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUF9CVUlMVElOPXkKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSUZDT05GSUdfQlVJTFRJTiBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUFY0PXkKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWNiBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HPXkKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX0VYVEVSTkFMX0RIQ1A9eQorIyBDT05GSUdfSU5FVEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRUNITyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9ESVNDQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fREFZVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9DSEFSR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfUlBDIGlzIG5vdCBzZXQKK0NPTkZJR19JUD15CitDT05GSUdfRkVBVFVSRV9JUF9BRERSRVNTPXkKK0NPTkZJR19GRUFUVVJFX0lQX0xJTks9eQorQ09ORklHX0ZFQVRVUkVfSVBfUk9VVEU9eQorQ09ORklHX0ZFQVRVUkVfSVBfVFVOTkVMPXkKK0NPTkZJR19GRUFUVVJFX0lQX1JVTEU9eQorQ09ORklHX0ZFQVRVUkVfSVBfU0hPUlRfRk9STVM9eQorIyBDT05GSUdfRkVBVFVSRV9JUF9SQVJFX1BST1RPQ09MUyBpcyBub3Qgc2V0CitDT05GSUdfSVBBRERSPXkKK0NPTkZJR19JUExJTks9eQorQ09ORklHX0lQUk9VVEU9eQorQ09ORklHX0lQVFVOTkVMPXkKK0NPTkZJR19JUFJVTEU9eQorQ09ORklHX0lQQ0FMQz15CitDT05GSUdfRkVBVFVSRV9JUENBTENfRkFOQ1k9eQorIyBDT05GSUdfRkVBVFVSRV9JUENBTENfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRTVEFUPXkKK0NPTkZJR19GRUFUVVJFX05FVFNUQVRfV0lERT15CitDT05GSUdfRkVBVFVSRV9ORVRTVEFUX1BSRz15CisjIENPTkZJR19OU0xPT0tVUCBpcyBub3Qgc2V0CisjIENPTkZJR19OVFBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTlRQRF9TRVJWRVIgaXMgbm90IHNldAorQ09ORklHX1BTQ0FOPXkKK0NPTkZJR19ST1VURT15CisjIENPTkZJR19TTEFUVEFDSCBpcyBub3Qgc2V0CitDT05GSUdfVENQU1ZEPXkKK0NPTkZJR19URUxORVQ9eQorQ09ORklHX0ZFQVRVUkVfVEVMTkVUX1RUWVBFPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVF9BVVRPTE9HSU49eQorQ09ORklHX1RFTE5FVEQ9eQorQ09ORklHX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVERfSU5FVERfV0FJVD15CitDT05GSUdfVEZUUD15CitDT05GSUdfVEZUUEQ9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciB0ZnRwL3RmdHBkCisjCitDT05GSUdfRkVBVFVSRV9URlRQX0dFVD15CitDT05GSUdfRkVBVFVSRV9URlRQX1BVVD15CitDT05GSUdfRkVBVFVSRV9URlRQX0JMT0NLU0laRT15CitDT05GSUdfRkVBVFVSRV9URlRQX1BST0dSRVNTX0JBUj15CisjIENPTkZJR19URlRQX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19UUkFDRVJPVVRFPXkKKyMgQ09ORklHX1RSQUNFUk9VVEU2IGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfVkVSQk9TRT15CisjIENPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfU09VUkNFX1JPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9VU0VfSUNNUCBpcyBub3Qgc2V0CitDT05GSUdfVFVOQ1RMPXkKK0NPTkZJR19GRUFUVVJFX1RVTkNUTF9VRz15CisjIENPTkZJR19VREhDUEM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VESENQRCBpcyBub3Qgc2V0CisjIENPTkZJR19ESENQUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfRFVNUExFQVNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQRF9XUklURV9MRUFTRVNfRUFSTFkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUERfQkFTRV9JUF9PTl9NQUMgaXMgbm90IHNldAorQ09ORklHX0RIQ1BEX0xFQVNFU19GSUxFPSIiCitDT05GSUdfVURIQ1BDPXkKK0NPTkZJR19GRUFUVVJFX1VESENQQ19BUlBJTkc9eQorQ09ORklHX0ZFQVRVUkVfVURIQ1BfUE9SVD15CitDT05GSUdfVURIQ1BfREVCVUc9OQorQ09ORklHX0ZFQVRVUkVfVURIQ1BfUkZDMzM5Nz15CitDT05GSUdfRkVBVFVSRV9VREhDUF84MDIxUT15CitDT05GSUdfVURIQ1BDX0RFRkFVTFRfU0NSSVBUPSIvdXNyL3NoYXJlL3VkaGNwYy9kZWZhdWx0LnNjcmlwdCIKK0NPTkZJR19VREhDUENfU0xBQ0tfRk9SX0JVR0dZX1NFUlZFUlM9ODAKK0NPTkZJR19JRlVQRE9XTl9VREhDUENfQ01EX09QVElPTlM9Ii1SIC1uIgorQ09ORklHX1VEUFNWRD15CitDT05GSUdfVkNPTkZJRz15CitDT05GSUdfV0dFVD15CitDT05GSUdfRkVBVFVSRV9XR0VUX1NUQVRVU0JBUj15CitDT05GSUdfRkVBVFVSRV9XR0VUX0FVVEhFTlRJQ0FUSU9OPXkKKyMgQ09ORklHX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfV0dFVF9USU1FT1VUPXkKKyMgQ09ORklHX1pDSVAgaXMgbm90IHNldAorCisjCisjIFByaW50IFV0aWxpdGllcworIworQ09ORklHX0xQRD15CitDT05GSUdfTFBSPXkKK0NPTkZJR19MUFE9eQorCisjCisjIE1haWwgVXRpbGl0aWVzCisjCitDT05GSUdfTUFLRU1JTUU9eQorQ09ORklHX0ZFQVRVUkVfTUlNRV9DSEFSU0VUPSJ1cy1hc2NpaSIKK0NPTkZJR19QT1BNQUlMRElSPXkKK0NPTkZJR19GRUFUVVJFX1BPUE1BSUxESVJfREVMSVZFUlk9eQorQ09ORklHX1JFRk9STUlNRT15CitDT05GSUdfRkVBVFVSRV9SRUZPUk1JTUVfQ09NUEFUPXkKK0NPTkZJR19TRU5ETUFJTD15CisKKyMKKyMgUHJvY2VzcyBVdGlsaXRpZXMKKyMKK0NPTkZJR19JT1NUQVQ9eQorQ09ORklHX01QU1RBVD15CitDT05GSUdfTk1FVEVSPXkKK0NPTkZJR19QTUFQPXkKK0NPTkZJR19QT1dFUlRPUD15CitDT05GSUdfUFNUUkVFPXkKK0NPTkZJR19QV0RYPXkKK0NPTkZJR19TTUVNQ0FQPXkKK0NPTkZJR19VUFRJTUU9eQorIyBDT05GSUdfRkVBVFVSRV9VUFRJTUVfVVRNUF9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19GUkVFPXkKK0NPTkZJR19GVVNFUj15CisjIENPTkZJR19LSUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tJTExBTEwgaXMgbm90IHNldAorIyBDT05GSUdfS0lMTEFMTDUgaXMgbm90IHNldAorIyBDT05GSUdfUEdSRVAgaXMgbm90IHNldAorQ09ORklHX1BJRE9GPXkKK0NPTkZJR19GRUFUVVJFX1BJRE9GX1NJTkdMRT15CitDT05GSUdfRkVBVFVSRV9QSURPRl9PTUlUPXkKKyMgQ09ORklHX1BLSUxMIGlzIG5vdCBzZXQKK0NPTkZJR19QUz15CisjIENPTkZJR19GRUFUVVJFX1BTX1dJREUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QU19MT05HIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1BTX1RJTUU9eQorQ09ORklHX0ZFQVRVUkVfUFNfQURESVRJT05BTF9DT0xVTU5TPXkKKyMgQ09ORklHX0ZFQVRVUkVfUFNfVU5VU1VBTF9TWVNURU1TIGlzIG5vdCBzZXQKK0NPTkZJR19SRU5JQ0U9eQorQ09ORklHX0JCX1NZU0NUTD15CitDT05GSUdfVE9QPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRT15CitDT05GSUdfRkVBVFVSRV9UT1BfQ1BVX0dMT0JBTF9QRVJDRU5UUz15CitDT05GSUdfRkVBVFVSRV9UT1BfU01QX0NQVT15CitDT05GSUdfRkVBVFVSRV9UT1BfREVDSU1BTFM9eQorQ09ORklHX0ZFQVRVUkVfVE9QX1NNUF9QUk9DRVNTPXkKK0NPTkZJR19GRUFUVVJFX1RPUE1FTT15CitDT05GSUdfRkVBVFVSRV9TSE9XX1RIUkVBRFM9eQorQ09ORklHX1dBVENIPXkKKworIworIyBSdW5pdCBVdGlsaXRpZXMKKyMKK0NPTkZJR19SVU5TVj15CitDT05GSUdfUlVOU1ZESVI9eQorIyBDT05GSUdfRkVBVFVSRV9SVU5TVkRJUl9MT0cgaXMgbm90IHNldAorQ09ORklHX1NWPXkKK0NPTkZJR19TVl9ERUZBVUxUX1NFUlZJQ0VfRElSPSIvdmFyL3NlcnZpY2UiCitDT05GSUdfU1ZMT0dEPXkKK0NPTkZJR19DSFBTVD15CitDT05GSUdfU0VUVUlER0lEPXkKK0NPTkZJR19FTlZVSURHSUQ9eQorQ09ORklHX0VOVkRJUj15CitDT05GSUdfU09GVExJTUlUPXkKKyMgQ09ORklHX0NIQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hDT05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFVEVORk9SQ0UgaXMgbm90IHNldAorIyBDT05GSUdfR0VUU0VCT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQURfUE9MSUNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX01BVENIUEFUSENPTiBpcyBub3Qgc2V0CisjIENPTkZJR19SRVNUT1JFQ09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JVTkNPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JVTkNPTl9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfU0VMSU5VWEVOQUJMRUQgaXMgbm90IHNldAorIyBDT05GSUdfU0VURU5GT1JDRSBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRGSUxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NFVEZJTEVTX0NIRUNLX09QVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRTRUJPT0wgaXMgbm90IHNldAorIyBDT05GSUdfU0VTVEFUVVMgaXMgbm90IHNldAorCisjCisjIFNoZWxscworIworIyBDT05GSUdfQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9CQVNIX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfSURMRV9USU1FT1VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9KT0JfQ09OVFJPTCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQUxJQVMgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0dFVE9QVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0JVSUxUSU5fRUNITyBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQlVJTFRJTl9QUklOVEYgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0JVSUxUSU5fVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQ01EQ01EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9NQUlMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfUkFORE9NX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0VYUEFORF9QUk1UIGlzIG5vdCBzZXQKK0NPTkZJR19DVFRZSEFDSz15CisjIENPTkZJR19IVVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfQkFTSF9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9CUkFDRV9FWFBBTlNJT04gaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9IRUxQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSU5URVJBQ1RJVkUgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9TQVZFSElTVE9SWSBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0pPQiBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX1RJQ0sgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9JRiBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0xPT1BTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfQ0FTRSBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0ZVTkNUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0xPQ0FMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfUkFORE9NX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9FWFBPUlRfTiBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX01PREVfWCBpcyBub3Qgc2V0CisjIENPTkZJR19NU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9JU19BU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9JU19IVVNIIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1NIX0lTX05PTkU9eQorIyBDT05GSUdfRkVBVFVSRV9CQVNIX0lTX0FTSCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JBU0hfSVNfSFVTSCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9CQVNIX0lTX05PTkU9eQorIyBDT05GSUdfU0hfTUFUSF9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIX01BVEhfU1VQUE9SVF82NCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIX0VYVFJBX1FVSUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIX05PRk9SSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIX0hJU1RGSUxFU0laRSBpcyBub3Qgc2V0CisKKyMKKyMgU3lzdGVtIExvZ2dpbmcgVXRpbGl0aWVzCisjCisjIENPTkZJR19TWVNMT0dEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SRU1PVEVfTE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9EVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TWVNMT0dEX0NGRyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TWVNMT0dEX1JFQURfQlVGRkVSX1NJWkU9MAorIyBDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0lQQ19TWVNMT0dfQlVGRkVSX1NJWkU9MAorIyBDT05GSUdfTE9HUkVBRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xPR1JFQURfUkVEVUNFRF9MT0NLSU5HIGlzIG5vdCBzZXQKK0NPTkZJR19LTE9HRD15CitDT05GSUdfRkVBVFVSRV9LTE9HRF9LTE9HQ1RMPXkKKyMgQ09ORklHX0xPR0dFUiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9jb25maWdzL2FuZHJvaWRfbmRrX2RlZmNvbmZpZyBiL2NvbmZpZ3MvYW5kcm9pZF9uZGtfZGVmY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2Yzg1MjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb25maWdzL2FuZHJvaWRfbmRrX2RlZmNvbmZpZwpAQCAtMCwwICsxLDEwNTggQEAKKyMKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKKyMgQnVzeWJveCB2ZXJzaW9uOiAxLjI0LjAuZ2l0CisjIEZyaSBTZXAgMTggMjA6Mzk6MjkgMjAxNQorIworQ09ORklHX0hBVkVfRE9UX0NPTkZJRz15CisKKyMKKyMgQnVzeWJveCBTZXR0aW5ncworIworCisjCisjIEdlbmVyYWwgQ29uZmlndXJhdGlvbgorIworQ09ORklHX0RFU0tUT1A9eQorIyBDT05GSUdfRVhUUkFfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOQ0xVREVfU1VTdjIgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX1BPUlRBQkxFX0NPREUgaXMgbm90IHNldAorQ09ORklHX1BMQVRGT1JNX0xJTlVYPXkKK0NPTkZJR19GRUFUVVJFX0JVRkZFUlNfVVNFX01BTExPQz15CisjIENPTkZJR19GRUFUVVJFX0JVRkZFUlNfR09fT05fU1RBQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CVUZGRVJTX0dPX0lOX0JTUyBpcyBub3Qgc2V0CitDT05GSUdfU0hPV19VU0FHRT15CitDT05GSUdfRkVBVFVSRV9WRVJCT1NFX1VTQUdFPXkKK0NPTkZJR19GRUFUVVJFX0NPTVBSRVNTX1VTQUdFPXkKK0NPTkZJR19GRUFUVVJFX0lOU1RBTExFUj15CitDT05GSUdfSU5TVEFMTF9OT19VU1I9eQorIyBDT05GSUdfTE9DQUxFX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfVVNJTkdfTE9DQUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfVU5JQ09ERV9JTl9FTlYgaXMgbm90IHNldAorQ09ORklHX1NVQlNUX1dDSEFSPTAKK0NPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUj0wCisjIENPTkZJR19VTklDT0RFX0NPTUJJTklOR19XQ0hBUlMgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9XSURFX1dDSEFSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX0JJRElfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX05FVVRSQUxfVEFCTEUgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9QUkVTRVJWRV9CUk9LRU4gaXMgbm90IHNldAorIyBDT05GSUdfUEFNIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1VTRV9TRU5ERklMRT15CitDT05GSUdfTE9OR19PUFRTPXkKKyMgQ09ORklHX0ZFQVRVUkVfREVWUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0xFQU5fVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VVE1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfV1RNUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BJREZJTEUgaXMgbm90IHNldAorQ09ORklHX1BJRF9GSUxFX1BBVEg9IiIKKyMgQ09ORklHX0ZFQVRVUkVfU1VJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVSURfQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VJRF9DT05GSUdfUVVJRVQgaXMgbm90IHNldAorIyBDT05GSUdfU0VMSU5VWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BSRUZFUl9BUFBMRVRTIGlzIG5vdCBzZXQKK0NPTkZJR19CVVNZQk9YX0VYRUNfUEFUSD0iL3Byb2Mvc2VsZi9leGUiCitDT05GSUdfRkVBVFVSRV9TWVNMT0c9eQorIyBDT05GSUdfRkVBVFVSRV9IQVZFX1JQQyBpcyBub3Qgc2V0CisKKyMKKyMgQnVpbGQgT3B0aW9ucworIworIyBDT05GSUdfU1RBVElDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJRSBpcyBub3Qgc2V0CisjIENPTkZJR19OT01NVSBpcyBub3Qgc2V0CisjIENPTkZJR19CVUlMRF9MSUJCVVNZQk9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5ESVZJRFVBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIQVJFRF9CVVNZQk9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xGUyBpcyBub3Qgc2V0CitDT05GSUdfQ1JPU1NfQ09NUElMRVJfUFJFRklYPSJhcm0tbGludXgtYW5kcm9pZGVhYmktIgorQ09ORklHX1NZU1JPT1Q9Ii9vcHQvYW5kcm9pZC1uZGsvcGxhdGZvcm1zL2FuZHJvaWQtOS9hcmNoLWFybSIKK0NPTkZJR19FWFRSQV9DRkxBR1M9Ii1EQU5EUk9JRCAtRF9fQU5EUk9JRF9fIC1EU0tfUkVMRUFTRSAtbm9zdGRsaWIgLW1hcmNoPWFybXY3LWEgLW1zb2Z0LWZsb2F0IC1tZmxvYXQtYWJpPXNvZnRmcCAtbWZwdT1uZW9uIC1tdGh1bWIgLW10aHVtYi1pbnRlcndvcmsgLWZwaWMgLWZuby1zaG9ydC1lbnVtcyAtZmdjc2UtYWZ0ZXItcmVsb2FkIC1mcmVuYW1lLXJlZ2lzdGVycyAtZnVzZS1sZD1iZmQiCitDT05GSUdfRVhUUkFfTERGTEFHUz0iLVhsaW5rZXIgLXogLVhsaW5rZXIgbXVsZGVmcyAtbm9zdGRsaWIgLUJkeW5hbWljIC1YbGlua2VyIC1keW5hbWljLWxpbmtlciAtWGxpbmtlciAvc3lzdGVtL2Jpbi9saW5rZXIgLVhsaW5rZXIgLXogLVhsaW5rZXIgbm9jb3B5cmVsb2MgLVhsaW5rZXIgLS1uby11bmRlZmluZWQgJHtTWVNST09UfS91c3IvbGliL2NydGJlZ2luX2R5bmFtaWMubyAke1NZU1JPT1R9L3Vzci9saWIvY3J0ZW5kX2FuZHJvaWQubyIKK0NPTkZJR19FWFRSQV9MRExJQlM9ImRsIG0gYyBnY2MiCisKKyMKKyMgRGVidWdnaW5nIE9wdGlvbnMKKyMKKyMgQ09ORklHX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFQlVHX1BFU1NJTUlaRSBpcyBub3Qgc2V0CisjIENPTkZJR19VTklUX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfV0VSUk9SIGlzIG5vdCBzZXQKK0NPTkZJR19OT19ERUJVR19MSUI9eQorIyBDT05GSUdfRE1BTExPQyBpcyBub3Qgc2V0CisjIENPTkZJR19FRkVOQ0UgaXMgbm90IHNldAorCisjCisjIEluc3RhbGxhdGlvbiBPcHRpb25zICgibWFrZSBpbnN0YWxsIiBiZWhhdmlvcikKKyMKK0NPTkZJR19JTlNUQUxMX0FQUExFVF9TWU1MSU5LUz15CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9IQVJETElOS1MgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfU0NSSVBUX1dSQVBQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX0RPTlQgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfU1lNTElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9IQVJETElOSyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX1NIX0FQUExFVF9TQ1JJUFRfV1JBUFBFUiBpcyBub3Qgc2V0CitDT05GSUdfUFJFRklYPSIuL19pbnN0YWxsIgorCisjCisjIEJ1c3lib3ggTGlicmFyeSBUdW5pbmcKKyMKKyMgQ09ORklHX0ZFQVRVUkVfU1lTVEVNRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JUTUlOTUFYIGlzIG5vdCBzZXQKK0NPTkZJR19QQVNTV09SRF9NSU5MRU49NgorQ09ORklHX01ENV9TTUFMTD0xCitDT05GSUdfU0hBM19TTUFMTD0xCisjIENPTkZJR19GRUFUVVJFX0ZBU1RfVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRVRDX05FVFdPUktTIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1VTRV9URVJNSU9TPXkKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElORyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX01BWF9MRU49MAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX1ZJIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfSElTVE9SWT0wCisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX1NBVkVfT05fRVhJVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JFVkVSU0VfU0VBUkNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX0FTS19URVJNSU5BTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05PTl9QT1NJWF9DUCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9WRVJCT1NFX0NQX01FU1NBR0U9eQorQ09ORklHX0ZFQVRVUkVfQ09QWUJVRl9LQj00CisjIENPTkZJR19GRUFUVVJFX1NLSVBfUk9PVEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PTk9UT05JQ19TWVNDQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lPQ1RMX0hFWDJTVFJfRVJST1IgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IV0lCIGlzIG5vdCBzZXQKKworIworIyBBcHBsZXRzCisjCisKKyMKKyMgQXJjaGl2YWwgVXRpbGl0aWVzCisjCitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19YWj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19MWk1BPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0JaMj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19HWj15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19aPXkKK0NPTkZJR19BUj15CitDT05GSUdfRkVBVFVSRV9BUl9MT05HX0ZJTEVOQU1FUz15CitDT05GSUdfRkVBVFVSRV9BUl9DUkVBVEU9eQorQ09ORklHX1VOQ09NUFJFU1M9eQorQ09ORklHX0dVTlpJUD15CitDT05GSUdfQlVOWklQMj15CitDT05GSUdfVU5MWk1BPXkKK0NPTkZJR19GRUFUVVJFX0xaTUFfRkFTVD15CitDT05GSUdfTFpNQT15CitDT05GSUdfVU5YWj15CitDT05GSUdfWFo9eQorQ09ORklHX0JaSVAyPXkKK0NPTkZJR19DUElPPXkKK0NPTkZJR19GRUFUVVJFX0NQSU9fTz15CitDT05GSUdfRkVBVFVSRV9DUElPX1A9eQorQ09ORklHX0RQS0c9eQorQ09ORklHX0RQS0dfREVCPXkKKyMgQ09ORklHX0ZFQVRVUkVfRFBLR19ERUJfRVhUUkFDVF9PTkxZIGlzIG5vdCBzZXQKK0NPTkZJR19HWklQPXkKKyMgQ09ORklHX0ZFQVRVUkVfR1pJUF9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0daSVBfRkFTVD0wCisjIENPTkZJR19GRUFUVVJFX0daSVBfTEVWRUxTIGlzIG5vdCBzZXQKK0NPTkZJR19MWk9QPXkKK0NPTkZJR19MWk9QX0NPTVBSX0hJR0g9eQorQ09ORklHX1JQTT15CitDT05GSUdfUlBNMkNQSU89eQorQ09ORklHX1RBUj15CitDT05GSUdfRkVBVFVSRV9UQVJfQ1JFQVRFPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9BVVRPREVURUNUPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9GUk9NPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9PTERHTlVfQ09NUEFUSUJJTElUWT15CitDT05GSUdfRkVBVFVSRV9UQVJfT0xEU1VOX0NPTVBBVElCSUxJVFk9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TPXkKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RBUl9UT19DT01NQU5EIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1RBUl9VTkFNRV9HTkFNRT15CitDT05GSUdfRkVBVFVSRV9UQVJfTk9QUkVTRVJWRV9USU1FPXkKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX1NFTElOVVggaXMgbm90IHNldAorQ09ORklHX1VOWklQPXkKKworIworIyBDb3JldXRpbHMKKyMKK0NPTkZJR19CQVNFTkFNRT15CitDT05GSUdfQ0FUPXkKKyMgQ09ORklHX0RBVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EQVRFX0lTT0ZNVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RBVEVfTkFOTyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RBVEVfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19ERD15CitDT05GSUdfRkVBVFVSRV9ERF9TSUdOQUxfSEFORExJTkc9eQorQ09ORklHX0ZFQVRVUkVfRERfVEhJUkRfU1RBVFVTX0xJTkU9eQorQ09ORklHX0ZFQVRVUkVfRERfSUJTX09CUz15CitDT05GSUdfRkVBVFVSRV9ERF9TVEFUVVM9eQorIyBDT05GSUdfSE9TVElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dST1VQUyBpcyBub3Qgc2V0CitDT05GSUdfU0hVRj15CitDT05GSUdfU1lOQz15CisjIENPTkZJR19GRUFUVVJFX1NZTkNfRkFOQ1kgaXMgbm90IHNldAorQ09ORklHX1RFU1Q9eQorQ09ORklHX0ZFQVRVUkVfVEVTVF82ND15CitDT05GSUdfVE9VQ0g9eQorIyBDT05GSUdfRkVBVFVSRV9UT1VDSF9OT0RFUkVGIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1RPVUNIX1NVU1YzPXkKK0NPTkZJR19UUj15CitDT05GSUdfRkVBVFVSRV9UUl9DTEFTU0VTPXkKK0NPTkZJR19GRUFUVVJFX1RSX0VRVUlWPXkKK0NPTkZJR19UUlVOQ0FURT15CitDT05GSUdfVU5MSU5LPXkKK0NPTkZJR19CQVNFNjQ9eQorIyBDT05GSUdfV0hPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRVJTIGlzIG5vdCBzZXQKK0NPTkZJR19DQUw9eQorQ09ORklHX0NBVFY9eQorQ09ORklHX0NIR1JQPXkKK0NPTkZJR19DSE1PRD15CitDT05GSUdfQ0hPV049eQorIyBDT05GSUdfRkVBVFVSRV9DSE9XTl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0NIUk9PVD15CitDT05GSUdfQ0tTVU09eQorQ09ORklHX0NPTU09eQorQ09ORklHX0NQPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ1BfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19DVVQ9eQorIyBDT05GSUdfREYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERl9GQU5DWSBpcyBub3Qgc2V0CitDT05GSUdfRElSTkFNRT15CitDT05GSUdfRE9TMlVOSVg9eQorQ09ORklHX1VOSVgyRE9TPXkKK0NPTkZJR19EVT15CitDT05GSUdfRkVBVFVSRV9EVV9ERUZBVUxUX0JMT0NLU0laRV8xSz15CitDT05GSUdfRUNITz15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9FQ0hPPXkKK0NPTkZJR19FTlY9eQorIyBDT05GSUdfRkVBVFVSRV9FTlZfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19FWFBBTkQ9eQorIyBDT05GSUdfRkVBVFVSRV9FWFBBTkRfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19FWFBSPXkKK0NPTkZJR19FWFBSX01BVEhfU1VQUE9SVF82ND15CitDT05GSUdfRkFMU0U9eQorQ09ORklHX0ZPTEQ9eQorQ09ORklHX0ZTWU5DPXkKK0NPTkZJR19IRUFEPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX0hFQUQ9eQorQ09ORklHX0lOU1RBTEw9eQorIyBDT05GSUdfRkVBVFVSRV9JTlNUQUxMX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfTE49eQorIyBDT05GSUdfTE9HTkFNRSBpcyBub3Qgc2V0CitDT05GSUdfTFM9eQorQ09ORklHX0ZFQVRVUkVfTFNfRklMRVRZUEVTPXkKK0NPTkZJR19GRUFUVVJFX0xTX0ZPTExPV0xJTktTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1JFQ1VSU0lWRT15CitDT05GSUdfRkVBVFVSRV9MU19TT1JURklMRVM9eQorQ09ORklHX0ZFQVRVUkVfTFNfVElNRVNUQU1QUz15CitDT05GSUdfRkVBVFVSRV9MU19VU0VSTkFNRT15CitDT05GSUdfRkVBVFVSRV9MU19DT0xPUj15CisjIENPTkZJR19GRUFUVVJFX0xTX0NPTE9SX0lTX0RFRkFVTFQgaXMgbm90IHNldAorQ09ORklHX01ENVNVTT15CitDT05GSUdfTUtESVI9eQorIyBDT05GSUdfRkVBVFVSRV9NS0RJUl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX01LRklGTz15CitDT05GSUdfTUtOT0Q9eQorQ09ORklHX01WPXkKKyMgQ09ORklHX0ZFQVRVUkVfTVZfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19OSUNFPXkKK0NPTkZJR19OT0hVUD15CitDT05GSUdfT0Q9eQorQ09ORklHX1BSSU5URU5WPXkKK0NPTkZJR19QUklOVEY9eQorQ09ORklHX1BXRD15CitDT05GSUdfUkVBRExJTks9eQorQ09ORklHX0ZFQVRVUkVfUkVBRExJTktfRk9MTE9XPXkKK0NPTkZJR19SRUFMUEFUSD15CitDT05GSUdfUk09eQorQ09ORklHX1JNRElSPXkKKyMgQ09ORklHX0ZFQVRVUkVfUk1ESVJfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19TRVE9eQorQ09ORklHX1NIQTFTVU09eQorQ09ORklHX1NIQTI1NlNVTT15CitDT05GSUdfU0hBNTEyU1VNPXkKK0NPTkZJR19TSEEzU1VNPXkKK0NPTkZJR19TTEVFUD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9TTEVFUD15CitDT05GSUdfRkVBVFVSRV9GTE9BVF9TTEVFUD15CitDT05GSUdfU09SVD15CitDT05GSUdfRkVBVFVSRV9TT1JUX0JJRz15CitDT05GSUdfU1BMSVQ9eQorQ09ORklHX0ZFQVRVUkVfU1BMSVRfRkFOQ1k9eQorIyBDT05GSUdfU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NUQVRfRk9STUFUIGlzIG5vdCBzZXQKK0NPTkZJR19TVFRZPXkKK0NPTkZJR19TVU09eQorQ09ORklHX1RBQz15CitDT05GSUdfVEFJTD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9UQUlMPXkKK0NPTkZJR19URUU9eQorQ09ORklHX0ZFQVRVUkVfVEVFX1VTRV9CTE9DS19JTz15CitDT05GSUdfVFJVRT15CisjIENPTkZJR19UVFkgaXMgbm90IHNldAorQ09ORklHX1VOQU1FPXkKK0NPTkZJR19VTkFNRV9PU05BTUU9IkdOVS9MaW51eCIKK0NPTkZJR19VTkVYUEFORD15CisjIENPTkZJR19GRUFUVVJFX1VORVhQQU5EX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfVU5JUT15CitDT05GSUdfVVNMRUVQPXkKK0NPTkZJR19VVURFQ09ERT15CitDT05GSUdfVVVFTkNPREU9eQorQ09ORklHX1dDPXkKK0NPTkZJR19GRUFUVVJFX1dDX0xBUkdFPXkKK0NPTkZJR19XSE9BTUk9eQorQ09ORklHX1lFUz15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMKKyMKK0NPTkZJR19GRUFUVVJFX1ZFUkJPU0U9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBjcCBhbmQgbXYKKyMKK0NPTkZJR19GRUFUVVJFX1BSRVNFUlZFX0hBUkRMSU5LUz15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGxzLCBtb3JlIGFuZCB0ZWxuZXQKKyMKK0NPTkZJR19GRUFUVVJFX0FVVE9XSURUSD15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGRmLCBkdSwgbHMKKyMKK0NPTkZJR19GRUFUVVJFX0hVTUFOX1JFQURBQkxFPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbWQ1c3VtLCBzaGExc3VtLCBzaGEyNTZzdW0sIHNoYTUxMnN1bSwgc2hhM3N1bQorIworQ09ORklHX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLPXkKKworIworIyBDb25zb2xlIFV0aWxpdGllcworIworQ09ORklHX0NIVlQ9eQorQ09ORklHX0ZHQ09OU09MRT15CitDT05GSUdfQ0xFQVI9eQorQ09ORklHX0RFQUxMT0NWVD15CitDT05GSUdfRFVNUEtNQVA9eQorIyBDT05GSUdfS0JEX01PREUgaXMgbm90IHNldAorIyBDT05GSUdfTE9BREZPTlQgaXMgbm90IHNldAorQ09ORklHX0xPQURLTUFQPXkKK0NPTkZJR19PUEVOVlQ9eQorQ09ORklHX1JFU0VUPXkKK0NPTkZJR19SRVNJWkU9eQorQ09ORklHX0ZFQVRVUkVfUkVTSVpFX1BSSU5UPXkKK0NPTkZJR19TRVRDT05TT0xFPXkKKyMgQ09ORklHX0ZFQVRVUkVfU0VUQ09OU09MRV9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfU0VURk9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NFVEZPTlRfVEVYVFVBTF9NQVAgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfU0VURk9OVF9ESVI9IiIKK0NPTkZJR19TRVRLRVlDT0RFUz15CitDT05GSUdfU0VUTE9HQ09OUz15CitDT05GSUdfU0hPV0tFWT15CisjIENPTkZJR19GRUFUVVJFX0xPQURGT05UX1BTRjIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MT0FERk9OVF9SQVcgaXMgbm90IHNldAorCisjCisjIERlYmlhbiBVdGlsaXRpZXMKKyMKK0NPTkZJR19NS1RFTVA9eQorQ09ORklHX1BJUEVfUFJPR1JFU1M9eQorQ09ORklHX1JVTl9QQVJUUz15CisjIENPTkZJR19GRUFUVVJFX1JVTl9QQVJUU19MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfUlVOX1BBUlRTX0ZBTkNZPXkKK0NPTkZJR19TVEFSVF9TVE9QX0RBRU1PTj15CitDT05GSUdfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWT15CisjIENPTkZJR19GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfV0hJQ0g9eQorCisjCisjIEVkaXRvcnMKKyMKK0NPTkZJR19BV0s9eQorQ09ORklHX0ZFQVRVUkVfQVdLX0xJQk09eQorQ09ORklHX0ZFQVRVUkVfQVdLX0dOVV9FWFRFTlNJT05TPXkKK0NPTkZJR19DTVA9eQorQ09ORklHX0RJRkY9eQorIyBDT05GSUdfRkVBVFVSRV9ESUZGX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9ESUZGX0RJUj15CitDT05GSUdfRUQ9eQorQ09ORklHX1BBVENIPXkKK0NPTkZJR19TRUQ9eQorQ09ORklHX1ZJPXkKK0NPTkZJR19GRUFUVVJFX1ZJX01BWF9MRU49NDA5NgorQ09ORklHX0ZFQVRVUkVfVklfOEJJVD15CitDT05GSUdfRkVBVFVSRV9WSV9DT0xPTj15CitDT05GSUdfRkVBVFVSRV9WSV9ZQU5LTUFSSz15CitDT05GSUdfRkVBVFVSRV9WSV9TRUFSQ0g9eQorIyBDT05GSUdfRkVBVFVSRV9WSV9SRUdFWF9TRUFSQ0ggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVklfVVNFX1NJR05BTFM9eQorQ09ORklHX0ZFQVRVUkVfVklfRE9UX0NNRD15CitDT05GSUdfRkVBVFVSRV9WSV9SRUFET05MWT15CitDT05GSUdfRkVBVFVSRV9WSV9TRVRPUFRTPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1NFVD15CitDT05GSUdfRkVBVFVSRV9WSV9XSU5fUkVTSVpFPXkKK0NPTkZJR19GRUFUVVJFX1ZJX0FTS19URVJNSU5BTD15CitDT05GSUdfRkVBVFVSRV9WSV9VTkRPPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1VORE9fUVVFVUU9eQorQ09ORklHX0ZFQVRVUkVfVklfVU5ET19RVUVVRV9NQVg9MjU2CitDT05GSUdfRkVBVFVSRV9BTExPV19FWEVDPXkKKworIworIyBGaW5kaW5nIFV0aWxpdGllcworIworQ09ORklHX0ZJTkQ9eQorQ09ORklHX0ZFQVRVUkVfRklORF9QUklOVDA9eQorQ09ORklHX0ZFQVRVUkVfRklORF9NVElNRT15CitDT05GSUdfRkVBVFVSRV9GSU5EX01NSU49eQorQ09ORklHX0ZFQVRVUkVfRklORF9QRVJNPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfVFlQRT15CitDT05GSUdfRkVBVFVSRV9GSU5EX1hERVY9eQorQ09ORklHX0ZFQVRVUkVfRklORF9NQVhERVBUSD15CitDT05GSUdfRkVBVFVSRV9GSU5EX05FV0VSPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfSU5VTT15CitDT05GSUdfRkVBVFVSRV9GSU5EX0VYRUM9eQorQ09ORklHX0ZFQVRVUkVfRklORF9FWEVDX1BMVVM9eQorQ09ORklHX0ZFQVRVUkVfRklORF9VU0VSPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfR1JPVVA9eQorQ09ORklHX0ZFQVRVUkVfRklORF9OT1Q9eQorQ09ORklHX0ZFQVRVUkVfRklORF9ERVBUSD15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BBUkVOPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfU0laRT15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BSVU5FPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfREVMRVRFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUEFUSD15CitDT05GSUdfRkVBVFVSRV9GSU5EX1JFR0VYPXkKKyMgQ09ORklHX0ZFQVRVUkVfRklORF9DT05URVhUIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTElOS1M9eQorQ09ORklHX0dSRVA9eQorQ09ORklHX0ZFQVRVUkVfR1JFUF9FR1JFUF9BTElBUz15CitDT05GSUdfRkVBVFVSRV9HUkVQX0ZHUkVQX0FMSUFTPXkKK0NPTkZJR19GRUFUVVJFX0dSRVBfQ09OVEVYVD15CitDT05GSUdfWEFSR1M9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT049eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9RVU9URVM9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9URVJNT1BUPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfUkVQTF9TVFI9eQorCisjCisjIEluaXQgVXRpbGl0aWVzCisjCitDT05GSUdfQk9PVENIQVJURD15CitDT05GSUdfRkVBVFVSRV9CT09UQ0hBUlREX0JMT0FURURfSEVBREVSPXkKK0NPTkZJR19GRUFUVVJFX0JPT1RDSEFSVERfQ09ORklHX0ZJTEU9eQorQ09ORklHX0hBTFQ9eQorIyBDT05GSUdfRkVBVFVSRV9DQUxMX1RFTElOSVQgaXMgbm90IHNldAorQ09ORklHX1RFTElOSVRfUEFUSD0iIgorQ09ORklHX0lOSVQ9eQorQ09ORklHX0ZFQVRVUkVfVVNFX0lOSVRUQUI9eQorIyBDT05GSUdfRkVBVFVSRV9LSUxMX1JFTU9WRUQgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfS0lMTF9ERUxBWT0wCitDT05GSUdfRkVBVFVSRV9JTklUX1NDVFRZPXkKK0NPTkZJR19GRUFUVVJFX0lOSVRfU1lTTE9HPXkKK0NPTkZJR19GRUFUVVJFX0VYVFJBX1FVSUVUPXkKK0NPTkZJR19GRUFUVVJFX0lOSVRfQ09SRURVTVBTPXkKK0NPTkZJR19GRUFUVVJFX0lOSVRSRD15CitDT05GSUdfSU5JVF9URVJNSU5BTF9UWVBFPSJsaW51eCIKK0NPTkZJR19NRVNHPXkKK0NPTkZJR19GRUFUVVJFX01FU0dfRU5BQkxFX09OTFlfR1JPVVA9eQorCisjCisjIExvZ2luL1Bhc3N3b3JkIE1hbmFnZW1lbnQgVXRpbGl0aWVzCisjCisjIENPTkZJR19BRERfU0hFTEwgaXMgbm90IHNldAorIyBDT05GSUdfUkVNT1ZFX1NIRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hBRE9XUEFTU1dEUyBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VfQkJfUFdEX0dSUCBpcyBub3Qgc2V0CisjIENPTkZJR19VU0VfQkJfU0hBRE9XIGlzIG5vdCBzZXQKK0NPTkZJR19VU0VfQkJfQ1JZUFQ9eQorQ09ORklHX1VTRV9CQl9DUllQVF9TSEE9eQorIyBDT05GSUdfQUREVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FERFVTRVJfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfTkFNRVMgaXMgbm90IHNldAorQ09ORklHX0xBU1RfSUQ9MAorQ09ORklHX0ZJUlNUX1NZU1RFTV9JRD0wCitDT05GSUdfTEFTVF9TWVNURU1fSUQ9MAorIyBDT05GSUdfQURER1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BRERHUk9VUF9MT05HX09QVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BRERVU0VSX1RPX0dST1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFTFVTRVIgaXMgbm90IHNldAorIyBDT05GSUdfREVMR1JPVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERUxfVVNFUl9GUk9NX0dST1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR0lOX1NFU1NJT05fQVNfQ0hJTEQgaXMgbm90IHNldAorIyBDT05GSUdfTE9HSU5fU0NSSVBUUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05PTE9HSU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRUNVUkVUVFkgaXMgbm90IHNldAorIyBDT05GSUdfUEFTU1dEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUEFTU1dEX1dFQUtfQ0hFQ0sgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRQVyBpcyBub3Qgc2V0CisjIENPTkZJR19DSFBBU1NXRCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9ERUZBVUxUX1BBU1NXRF9BTEdPPSIiCisjIENPTkZJR19TVSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVX1NZU0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVX0NIRUNLU19TSEVMTFMgaXMgbm90IHNldAorIyBDT05GSUdfU1VMT0dJTiBpcyBub3Qgc2V0CisjIENPTkZJR19WTE9DSyBpcyBub3Qgc2V0CisKKyMKKyMgTGludXggRXh0MiBGUyBQcm9ncworIworQ09ORklHX0NIQVRUUj15CisjIENPTkZJR19GU0NLIGlzIG5vdCBzZXQKK0NPTkZJR19MU0FUVFI9eQorQ09ORklHX1RVTkUyRlM9eQorCisjCisjIExpbnV4IE1vZHVsZSBVdGlsaXRpZXMKKyMKK0NPTkZJR19NT0RJTkZPPXkKK0NPTkZJR19NT0RQUk9CRV9TTUFMTD15CitDT05GSUdfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9PUFRJT05TX09OX0NNRExJTkU9eQorQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfU01BTExfQ0hFQ0tfQUxSRUFEWV9MT0FERUQ9eQorIyBDT05GSUdfSU5TTU9EIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JNTU9EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTTU9EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTFNNT0RfUFJFVFRZXzJfNl9PVVRQVVQgaXMgbm90IHNldAorIyBDT05GSUdfTU9EUFJPQkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT0RQUk9CRV9CTEFDS0xJU1QgaXMgbm90IHNldAorIyBDT05GSUdfREVQTU9EIGlzIG5vdCBzZXQKKworIworIyBPcHRpb25zIGNvbW1vbiB0byBtdWx0aXBsZSBtb2R1dGlscworIworIyBDT05GSUdfRkVBVFVSRV8yXzRfTU9EVUxFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9UUllfTU1BUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0tTWU1PT1BTX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRElOS01FTSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FEX01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FEX01BUF9GVUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfVEFJTlRFRF9NT0RVTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT0RVVElMU19BTElBUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFVUSUxTX1NZTUJPTFMgaXMgbm90IHNldAorQ09ORklHX0RFRkFVTFRfTU9EVUxFU19ESVI9Ii9zeXN0ZW0vbGliL21vZHVsZXMiCitDT05GSUdfREVGQVVMVF9ERVBNT0RfRklMRT0ibW9kdWxlcy5kZXAiCisKKyMKKyMgTGludXggU3lzdGVtIFV0aWxpdGllcworIworQ09ORklHX0JMT0NLREVWPXkKK0NPTkZJR19GQVRBVFRSPXkKK0NPTkZJR19GU1RSSU09eQorIyBDT05GSUdfTURFViBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfQ09ORiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfUkVOQU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9SRU5BTUVfUkVHRVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9FWEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9MT0FEX0ZJUk1XQVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkFLRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9ORlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkxBR1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9GU1RBQiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX09USEVSVEFCIGlzIG5vdCBzZXQKK0NPTkZJR19SRVY9eQorQ09ORklHX1VFVkVOVD15CisjIENPTkZJR19BQ1BJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FDUElEX0NPTVBBVCBpcyBub3Qgc2V0CitDT05GSUdfQkxLSUQ9eQorQ09ORklHX0ZFQVRVUkVfQkxLSURfVFlQRT15CitDT05GSUdfRE1FU0c9eQorQ09ORklHX0ZFQVRVUkVfRE1FU0dfUFJFVFRZPXkKK0NPTkZJR19GQlNFVD15CitDT05GSUdfRkVBVFVSRV9GQlNFVF9GQU5DWT15CitDT05GSUdfRkVBVFVSRV9GQlNFVF9SRUFETU9ERT15CitDT05GSUdfRkRGTFVTSD15CitDT05GSUdfRkRGT1JNQVQ9eQorQ09ORklHX0ZESVNLPXkKK0NPTkZJR19GRElTS19TVVBQT1JUX0xBUkdFX0RJU0tTPXkKK0NPTkZJR19GRUFUVVJFX0ZESVNLX1dSSVRBQkxFPXkKKyMgQ09ORklHX0ZFQVRVUkVfQUlYX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0dJX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VOX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfT1NGX0xBQkVMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfR1BUX0xBQkVMIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0ZESVNLX0FEVkFOQ0VEPXkKK0NPTkZJR19GSU5ERlM9eQorQ09ORklHX0ZMT0NLPXkKK0NPTkZJR19GUkVFUkFNRElTSz15CisjIENPTkZJR19GU0NLX01JTklYIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRlNfRVhUMiBpcyBub3Qgc2V0CisjIENPTkZJR19NS0ZTX01JTklYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTUlOSVgyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRlNfUkVJU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRlNfVkZBVCBpcyBub3Qgc2V0CitDT05GSUdfR0VUT1BUPXkKK0NPTkZJR19GRUFUVVJFX0dFVE9QVF9MT05HPXkKK0NPTkZJR19IRVhEVU1QPXkKK0NPTkZJR19GRUFUVVJFX0hFWERVTVBfUkVWRVJTRT15CitDT05GSUdfSEQ9eQorQ09ORklHX0hXQ0xPQ0s9eQorIyBDT05GSUdfRkVBVFVSRV9IV0NMT0NLX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hXQ0xPQ0tfQURKVElNRV9GSFMgaXMgbm90IHNldAorIyBDT05GSUdfSVBDUk0gaXMgbm90IHNldAorIyBDT05GSUdfSVBDUyBpcyBub3Qgc2V0CitDT05GSUdfTE9TRVRVUD15CitDT05GSUdfTFNQQ0k9eQorQ09ORklHX0xTVVNCPXkKK0NPTkZJR19NS1NXQVA9eQorQ09ORklHX0ZFQVRVUkVfTUtTV0FQX1VVSUQ9eQorQ09ORklHX01PUkU9eQorIyBDT05GSUdfUElWT1RfUk9PVCBpcyBub3Qgc2V0CisjIENPTkZJR19SREFURSBpcyBub3Qgc2V0CitDT05GSUdfUkRFVj15CitDT05GSUdfUkVBRFBST0ZJTEU9eQorQ09ORklHX1JUQ1dBS0U9eQorQ09ORklHX1NDUklQVD15CitDT05GSUdfU0NSSVBUUkVQTEFZPXkKKyMgQ09ORklHX1NFVEFSQ0ggaXMgbm90IHNldAorIyBDT05GSUdfU1dBUE9OT0ZGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1dBUE9OX0RJU0NBUkQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TV0FQT05fUFJJIGlzIG5vdCBzZXQKK0NPTkZJR19TV0lUQ0hfUk9PVD15CisjIENPTkZJR19VTU9VTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VTU9VTlRfQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTE9PUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0xPT1BfQ1JFQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTVRBQl9TVVBQT1JUIGlzIG5vdCBzZXQKK0NPTkZJR19WT0xVTUVJRD15CisKKyMKKyMgRmlsZXN5c3RlbS9Wb2x1bWUgaWRlbnRpZmljYXRpb24KKyMKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0JUUkZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0NSQU1GUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9FWEZBVD15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9FWFQ9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfRjJGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9GQVQ9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSEZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0lTTzk2NjA9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSkZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xJTlVYUkFJRD15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFNXQVA9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTFVLUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9OSUxGUz15CitDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9OVEZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX09DRlMyPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1JFSVNFUkZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1JPTUZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1NRVUFTSEZTPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1NZU1Y9eQorQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfVURGPXkKK0NPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1hGUz15CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0NPTlNQWSBpcyBub3Qgc2V0CitDT05GSUdfQ1JPTkQ9eQorQ09ORklHX0ZFQVRVUkVfQ1JPTkRfRD15CitDT05GSUdfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMPXkKK0NPTkZJR19GRUFUVVJFX0NST05EX0RJUj0iL3Zhci9zcG9vbC9jcm9uIgorQ09ORklHX0kyQ0dFVD15CitDT05GSUdfSTJDU0VUPXkKK0NPTkZJR19JMkNEVU1QPXkKK0NPTkZJR19JMkNERVRFQ1Q9eQorQ09ORklHX0xFU1M9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19NQVhMSU5FUz05OTk5OTk5CitDT05GSUdfRkVBVFVSRV9MRVNTX0JSQUNLRVRTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfRkxBR1M9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19UUlVOQ0FURT15CitDT05GSUdfRkVBVFVSRV9MRVNTX01BUktTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfUkVHRVhQPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfV0lOQ0g9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19BU0tfVEVSTUlOQUw9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19EQVNIQ01EPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfTElORU5VTVM9eQorIyBDT05GSUdfTkFORFdSSVRFIGlzIG5vdCBzZXQKK0NPTkZJR19OQU5ERFVNUD15CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorQ09ORklHX1NFVFNFUklBTD15CisjIENPTkZJR19UQVNLU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFTS1NFVF9GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19VQklBVFRBQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVUJJREVUQUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSU1LVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVJNVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVJTVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSVVQREFURVZPTCBpcyBub3Qgc2V0CisjIENPTkZJR19XQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FESlRJTUVYIGlzIG5vdCBzZXQKK0NPTkZJR19CQkNPTkZJRz15CitDT05GSUdfRkVBVFVSRV9DT01QUkVTU19CQkNPTkZJRz15CitDT05GSUdfQkVFUD15CitDT05GSUdfRkVBVFVSRV9CRUVQX0ZSRVE9NDAwMAorQ09ORklHX0ZFQVRVUkVfQkVFUF9MRU5HVEhfTVM9MzAKK0NPTkZJR19DSEFUPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfTk9GQUlMPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9UVFlfSElGSSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9DSEFUX0lNUExJQ0lUX0NSPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfU1dBTExPV19PUFRTPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfU0VORF9FU0NBUEVTPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfVkFSX0FCT1JUX0xFTj15CitDT05GSUdfRkVBVFVSRV9DSEFUX0NMUl9BQk9SVD15CitDT05GSUdfQ0hSVD15CitDT05GSUdfQ1JPTlRBQj15CitDT05GSUdfREM9eQorQ09ORklHX0ZFQVRVUkVfRENfTElCTT15CisjIENPTkZJR19ERVZGU0QgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX01PRExPQUQgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX0ZHX05QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRF9WRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREVWRlMgaXMgbm90IHNldAorQ09ORklHX0RFVk1FTT15CisjIENPTkZJR19FSkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VKRUNUX1NDU0kgaXMgbm90IHNldAorQ09ORklHX0ZCU1BMQVNIPXkKK0NPTkZJR19GTEFTSENQPXkKK0NPTkZJR19GTEFTSF9MT0NLPXkKK0NPTkZJR19GTEFTSF9VTkxPQ0s9eQorIyBDT05GSUdfRkxBU0hfRVJBU0VBTEwgaXMgbm90IHNldAorIyBDT05GSUdfSU9OSUNFIGlzIG5vdCBzZXQKK0NPTkZJR19JTk9USUZZRD15CisjIENPTkZJR19MQVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEFTVF9TTUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xBU1RfRkFOQ1kgaXMgbm90IHNldAorQ09ORklHX0hEUEFSTT15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZPXkKK0NPTkZJR19GRUFUVVJFX0hEUEFSTV9IRElPX1NDQU5fSFdJRj15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19VTlJFR0lTVEVSX0hXSUY9eQorQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fRFJJVkVfUkVTRVQ9eQorQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRj15CitDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19HRVRTRVRfRE1BPXkKK0NPTkZJR19NQUtFREVWUz15CisjIENPTkZJR19GRUFUVVJFX01BS0VERVZTX0xFQUYgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTUFLRURFVlNfVEFCTEU9eQorQ09ORklHX01BTj15CisjIENPTkZJR19NSUNST0NPTSBpcyBub3Qgc2V0CisjIENPTkZJR19NT1VOVFBPSU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX01UIGlzIG5vdCBzZXQKK0NPTkZJR19SQUlEQVVUT1JVTj15CisjIENPTkZJR19SRUFEQUhFQUQgaXMgbm90IHNldAorIyBDT05GSUdfUlVOTEVWRUwgaXMgbm90IHNldAorQ09ORklHX1JYPXkKK0NPTkZJR19TRVRTSUQ9eQorQ09ORklHX1NUUklOR1M9eQorQ09ORklHX1RJTUU9eQorQ09ORklHX1RJTUVPVVQ9eQorQ09ORklHX1RUWVNJWkU9eQorQ09ORklHX1ZPTE5BTUU9eQorIyBDT05GSUdfV0FUQ0hET0cgaXMgbm90IHNldAorCisjCisjIE5ldHdvcmtpbmcgVXRpbGl0aWVzCisjCisjIENPTkZJR19OQU1FSUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQgaXMgbm90IHNldAorQ09ORklHX05CRENMSUVOVD15CitDT05GSUdfTkM9eQorQ09ORklHX05DX1NFUlZFUj15CitDT05GSUdfTkNfRVhUUkE9eQorIyBDT05GSUdfTkNfMTEwX0NPTVBBVCBpcyBub3Qgc2V0CitDT05GSUdfUElORz15CisjIENPTkZJR19QSU5HNiBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9GQU5DWV9QSU5HPXkKK0NPTkZJR19XSE9JUz15CisjIENPTkZJR19GRUFUVVJFX0lQVjYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VTklYX0xPQ0FMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0lQVjRfQUREUkVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19WRVJCT1NFX1JFU09MVVRJT05fRVJST1JTIGlzIG5vdCBzZXQKK0NPTkZJR19BUlA9eQorIyBDT05GSUdfQVJQSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSQ1RMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlJDVExfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CUkNUTF9TSE9XIGlzIG5vdCBzZXQKK0NPTkZJR19ETlNEPXkKKyMgQ09ORklHX0VUSEVSX1dBS0UgaXMgbm90IHNldAorQ09ORklHX0ZBS0VJREVOVEQ9eQorQ09ORklHX0ZUUEQ9eQorQ09ORklHX0ZFQVRVUkVfRlRQX1dSSVRFPXkKK0NPTkZJR19GRUFUVVJFX0ZUUERfQUNDRVBUX0JST0tFTl9MSVNUPXkKK0NPTkZJR19GRUFUVVJFX0ZUUF9BVVRIRU5USUNBVElPTj15CitDT05GSUdfRlRQR0VUPXkKK0NPTkZJR19GVFBQVVQ9eQorIyBDT05GSUdfRkVBVFVSRV9GVFBHRVRQVVRfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hPU1ROQU1FIGlzIG5vdCBzZXQKK0NPTkZJR19IVFRQRD15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9SQU5HRVM9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfU0VUVUlEPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEg9eQorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9BVVRIX01ENSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9IVFRQRF9DR0k9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfQ09ORklHX1dJVEhfU0NSSVBUX0lOVEVSUFI9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfU0VUX1JFTU9URV9QT1JUX1RPX0VOVj15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9FTkNPREVfVVJMX1NUUj15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9FUlJPUl9QQUdFUz15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9QUk9YWT15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9HWklQPXkKK0NPTkZJR19JRkNPTkZJRz15CitDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19TVEFUVVM9eQorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19TTElQIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0lGQ09ORklHX01FTVNUQVJUX0lPQUREUl9JUlE9eQorQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfSFc9eQorQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfQlJPQURDQVNUX1BMVVM9eQorIyBDT05GSUdfSUZFTlNMQVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lGUExVR0QgaXMgbm90IHNldAorQ09ORklHX0lGVVBET1dOPXkKK0NPTkZJR19JRlVQRE9XTl9JRlNUQVRFX1BBVEg9Ii92YXIvcnVuL2lmc3RhdGUiCitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUD15CitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUF9CVUlMVElOPXkKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSUZDT05GSUdfQlVJTFRJTiBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUFY0PXkKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWNiBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HPXkKK0NPTkZJR19GRUFUVVJFX0lGVVBET1dOX0VYVEVSTkFMX0RIQ1A9eQorIyBDT05GSUdfSU5FVEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRUNITyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9ESVNDQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX1RJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fREFZVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9DSEFSR0VOIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfUlBDIGlzIG5vdCBzZXQKK0NPTkZJR19JUD15CitDT05GSUdfRkVBVFVSRV9JUF9BRERSRVNTPXkKK0NPTkZJR19GRUFUVVJFX0lQX0xJTks9eQorQ09ORklHX0ZFQVRVUkVfSVBfUk9VVEU9eQorQ09ORklHX0ZFQVRVUkVfSVBfVFVOTkVMPXkKK0NPTkZJR19GRUFUVVJFX0lQX1JVTEU9eQorQ09ORklHX0ZFQVRVUkVfSVBfU0hPUlRfRk9STVM9eQorIyBDT05GSUdfRkVBVFVSRV9JUF9SQVJFX1BST1RPQ09MUyBpcyBub3Qgc2V0CitDT05GSUdfSVBBRERSPXkKK0NPTkZJR19JUExJTks9eQorQ09ORklHX0lQUk9VVEU9eQorQ09ORklHX0lQVFVOTkVMPXkKK0NPTkZJR19JUFJVTEU9eQorQ09ORklHX0lQQ0FMQz15CitDT05GSUdfRkVBVFVSRV9JUENBTENfRkFOQ1k9eQorIyBDT05GSUdfRkVBVFVSRV9JUENBTENfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19ORVRTVEFUPXkKK0NPTkZJR19GRUFUVVJFX05FVFNUQVRfV0lERT15CitDT05GSUdfRkVBVFVSRV9ORVRTVEFUX1BSRz15CisjIENPTkZJR19OU0xPT0tVUCBpcyBub3Qgc2V0CisjIENPTkZJR19OVFBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTlRQRF9TRVJWRVIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9OVFBEX0NPTkYgaXMgbm90IHNldAorQ09ORklHX1BTQ0FOPXkKK0NPTkZJR19ST1VURT15CisjIENPTkZJR19TTEFUVEFDSCBpcyBub3Qgc2V0CitDT05GSUdfVENQU1ZEPXkKK0NPTkZJR19URUxORVQ9eQorQ09ORklHX0ZFQVRVUkVfVEVMTkVUX1RUWVBFPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVF9BVVRPTE9HSU49eQorQ09ORklHX1RFTE5FVEQ9eQorQ09ORklHX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVERfSU5FVERfV0FJVD15CitDT05GSUdfVEZUUD15CitDT05GSUdfVEZUUEQ9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciB0ZnRwL3RmdHBkCisjCitDT05GSUdfRkVBVFVSRV9URlRQX0dFVD15CitDT05GSUdfRkVBVFVSRV9URlRQX1BVVD15CitDT05GSUdfRkVBVFVSRV9URlRQX0JMT0NLU0laRT15CitDT05GSUdfRkVBVFVSRV9URlRQX1BST0dSRVNTX0JBUj15CisjIENPTkZJR19URlRQX0RFQlVHIGlzIG5vdCBzZXQKK0NPTkZJR19UUkFDRVJPVVRFPXkKKyMgQ09ORklHX1RSQUNFUk9VVEU2IGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfVkVSQk9TRT15CisjIENPTkZJR19GRUFUVVJFX1RSQUNFUk9VVEVfU09VUkNFX1JPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9VU0VfSUNNUCBpcyBub3Qgc2V0CitDT05GSUdfVFVOQ1RMPXkKK0NPTkZJR19GRUFUVVJFX1RVTkNUTF9VRz15CisjIENPTkZJR19VREhDUEM2IGlzIG5vdCBzZXQKKyMgQ09ORklHX1VESENQRCBpcyBub3Qgc2V0CisjIENPTkZJR19ESENQUkVMQVkgaXMgbm90IHNldAorIyBDT05GSUdfRFVNUExFQVNFUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQRF9XUklURV9MRUFTRVNfRUFSTFkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUERfQkFTRV9JUF9PTl9NQUMgaXMgbm90IHNldAorQ09ORklHX0RIQ1BEX0xFQVNFU19GSUxFPSIiCitDT05GSUdfVURIQ1BDPXkKK0NPTkZJR19GRUFUVVJFX1VESENQQ19BUlBJTkc9eQorQ09ORklHX0ZFQVRVUkVfVURIQ1BDX1NBTklUSVpFT1BUPXkKK0NPTkZJR19GRUFUVVJFX1VESENQX1BPUlQ9eQorQ09ORklHX1VESENQX0RFQlVHPTkKK0NPTkZJR19GRUFUVVJFX1VESENQX1JGQzMzOTc9eQorQ09ORklHX0ZFQVRVUkVfVURIQ1BfODAyMVE9eQorQ09ORklHX1VESENQQ19ERUZBVUxUX1NDUklQVD0iL3Vzci9zaGFyZS91ZGhjcGMvZGVmYXVsdC5zY3JpcHQiCitDT05GSUdfVURIQ1BDX1NMQUNLX0ZPUl9CVUdHWV9TRVJWRVJTPTgwCitDT05GSUdfSUZVUERPV05fVURIQ1BDX0NNRF9PUFRJT05TPSItUiAtbiIKK0NPTkZJR19VRFBTVkQ9eQorQ09ORklHX1ZDT05GSUc9eQorQ09ORklHX1dHRVQ9eQorQ09ORklHX0ZFQVRVUkVfV0dFVF9TVEFUVVNCQVI9eQorQ09ORklHX0ZFQVRVUkVfV0dFVF9BVVRIRU5USUNBVElPTj15CisjIENPTkZJR19GRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1dHRVRfVElNRU9VVD15CisjIENPTkZJR19aQ0lQIGlzIG5vdCBzZXQKKworIworIyBQcmludCBVdGlsaXRpZXMKKyMKK0NPTkZJR19MUEQ9eQorQ09ORklHX0xQUj15CitDT05GSUdfTFBRPXkKKworIworIyBNYWlsIFV0aWxpdGllcworIworQ09ORklHX01BS0VNSU1FPXkKK0NPTkZJR19GRUFUVVJFX01JTUVfQ0hBUlNFVD0idXMtYXNjaWkiCitDT05GSUdfUE9QTUFJTERJUj15CitDT05GSUdfRkVBVFVSRV9QT1BNQUlMRElSX0RFTElWRVJZPXkKK0NPTkZJR19SRUZPUk1JTUU9eQorQ09ORklHX0ZFQVRVUkVfUkVGT1JNSU1FX0NPTVBBVD15CitDT05GSUdfU0VORE1BSUw9eQorCisjCisjIFByb2Nlc3MgVXRpbGl0aWVzCisjCitDT05GSUdfSU9TVEFUPXkKK0NPTkZJR19MU09GPXkKK0NPTkZJR19NUFNUQVQ9eQorQ09ORklHX05NRVRFUj15CitDT05GSUdfUE1BUD15CitDT05GSUdfUE9XRVJUT1A9eQorQ09ORklHX1BTVFJFRT15CitDT05GSUdfUFdEWD15CitDT05GSUdfU01FTUNBUD15CitDT05GSUdfVE9QPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRT15CitDT05GSUdfRkVBVFVSRV9UT1BfQ1BVX0dMT0JBTF9QRVJDRU5UUz15CitDT05GSUdfRkVBVFVSRV9UT1BfU01QX0NQVT15CitDT05GSUdfRkVBVFVSRV9UT1BfREVDSU1BTFM9eQorQ09ORklHX0ZFQVRVUkVfVE9QX1NNUF9QUk9DRVNTPXkKK0NPTkZJR19GRUFUVVJFX1RPUE1FTT15CitDT05GSUdfVVBUSU1FPXkKKyMgQ09ORklHX0ZFQVRVUkVfVVBUSU1FX1VUTVBfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfRlJFRT15CitDT05GSUdfRlVTRVI9eQorIyBDT05GSUdfS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19LSUxMQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tJTExBTEw1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1BHUkVQIGlzIG5vdCBzZXQKK0NPTkZJR19QSURPRj15CitDT05GSUdfRkVBVFVSRV9QSURPRl9TSU5HTEU9eQorQ09ORklHX0ZFQVRVUkVfUElET0ZfT01JVD15CisjIENPTkZJR19QS0lMTCBpcyBub3Qgc2V0CitDT05GSUdfUFM9eQorIyBDT05GSUdfRkVBVFVSRV9QU19XSURFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUFNfTE9ORyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9QU19USU1FPXkKK0NPTkZJR19GRUFUVVJFX1BTX0FERElUSU9OQUxfQ09MVU1OUz15CisjIENPTkZJR19GRUFUVVJFX1BTX1VOVVNVQUxfU1lTVEVNUyBpcyBub3Qgc2V0CitDT05GSUdfUkVOSUNFPXkKK0NPTkZJR19CQl9TWVNDVEw9eQorQ09ORklHX0ZFQVRVUkVfU0hPV19USFJFQURTPXkKK0NPTkZJR19XQVRDSD15CisKKyMKKyMgUnVuaXQgVXRpbGl0aWVzCisjCitDT05GSUdfUlVOU1Y9eQorQ09ORklHX1JVTlNWRElSPXkKKyMgQ09ORklHX0ZFQVRVUkVfUlVOU1ZESVJfTE9HIGlzIG5vdCBzZXQKK0NPTkZJR19TVj15CitDT05GSUdfU1ZfREVGQVVMVF9TRVJWSUNFX0RJUj0iL3Zhci9zZXJ2aWNlIgorQ09ORklHX1NWTE9HRD15CitDT05GSUdfQ0hQU1Q9eQorQ09ORklHX1NFVFVJREdJRD15CitDT05GSUdfRU5WVUlER0lEPXkKK0NPTkZJR19FTlZESVI9eQorQ09ORklHX1NPRlRMSU1JVD15CisjIENPTkZJR19DSENPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRVRFTkZPUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFVFNFQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FEX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NQVRDSFBBVEhDT04gaXMgbm90IHNldAorIyBDT05GSUdfUkVTVE9SRUNPTiBpcyBub3Qgc2V0CisjIENPTkZJR19SVU5DT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SVU5DT05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTElOVVhFTkFCTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEVORk9SQ0UgaXMgbm90IHNldAorIyBDT05GSUdfU0VURklMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRGSUxFU19DSEVDS19PUFRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0VUU0VCT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFU1RBVFVTIGlzIG5vdCBzZXQKKworIworIyBTaGVsbHMKKyMKKyMgQ09ORklHX0FTSCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQkFTSF9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0lETEVfVElNRU9VVCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfSk9CX0NPTlRST0wgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0FMSUFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9HRVRPUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9CVUlMVElOX0VDSE8gaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0JVSUxUSU5fUFJJTlRGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9CVUlMVElOX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0hFTFAgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0NNRENNRCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfTUFJTCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfT1BUSU1JWkVfRk9SX1NJWkUgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX1JBTkRPTV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9FWFBBTkRfUFJNVCBpcyBub3Qgc2V0CitDT05GSUdfQ1RUWUhBQ0s9eQorIyBDT05GSUdfSFVTSCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0JBU0hfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfQlJBQ0VfRVhQQU5TSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSEVMUCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0lOVEVSQUNUSVZFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfU0FWRUhJU1RPUlkgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9KT0IgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9USUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSUYgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9MT09QUyBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0NBU0UgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9GVU5DVElPTlMgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9MT0NBTCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX1JBTkRPTV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfRVhQT1JUX04gaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9NT0RFX1ggaXMgbm90IHNldAorIyBDT05GSUdfTVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfSVNfQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfSVNfSFVTSCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TSF9JU19OT05FPXkKKyMgQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19BU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CQVNIX0lTX0hVU0ggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19OT05FPXkKKyMgQ09ORklHX1NIX01BVEhfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9NQVRIX1NVUFBPUlRfNjQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9FWFRSQV9RVUlFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9OT0ZPUksgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9ISVNURklMRVNJWkUgaXMgbm90IHNldAorCisjCisjIFN5c3RlbSBMb2dnaW5nIFV0aWxpdGllcworIworIyBDT05GSUdfU1lTTE9HRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JPVEFURV9MT0dGSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUkVNT1RFX0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NZU0xPR0RfRFVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9DRkcgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9SRUFEX0JVRkZFUl9TSVpFPTAKKyMgQ09ORklHX0ZFQVRVUkVfSVBDX1NZU0xPRyBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HX0JVRkZFUl9TSVpFPTAKKyMgQ09ORklHX0xPR1JFQUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MT0dSRUFEX1JFRFVDRURfTE9DS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0tNU0dfU1lTTE9HIGlzIG5vdCBzZXQKK0NPTkZJR19LTE9HRD15CitDT05GSUdfRkVBVFVSRV9LTE9HRF9LTE9HQ1RMPXkKKyMgQ09ORklHX0xPR0dFUiBpcyBub3Qgc2V0CmRpZmYgLS1naXQgYS9jb25maWdzL2N5Z3dpbl9kZWZjb25maWcgYi9jb25maWdzL2N5Z3dpbl9kZWZjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEzNDZlMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbmZpZ3MvY3lnd2luX2RlZmNvbmZpZwpAQCAtMCwwICsxLDk5NiBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBCdXN5Ym94IHZlcnNpb246IDEuMTkuMC5naXQKKyMgU3VuIEp1bCAxMCAxMjo0ODo1MCAyMDExCisjCitDT05GSUdfSEFWRV9ET1RfQ09ORklHPXkKKworIworIyBCdXN5Ym94IFNldHRpbmdzCisjCisKKyMKKyMgR2VuZXJhbCBDb25maWd1cmF0aW9uCisjCitDT05GSUdfREVTS1RPUD15CisjIENPTkZJR19FWFRSQV9DT01QQVQgaXMgbm90IHNldAorQ09ORklHX0lOQ0xVREVfU1VTdjI9eQorIyBDT05GSUdfVVNFX1BPUlRBQkxFX0NPREUgaXMgbm90IHNldAorQ09ORklHX1BMQVRGT1JNX0xJTlVYPXkKK0NPTkZJR19GRUFUVVJFX0JVRkZFUlNfVVNFX01BTExPQz15CisjIENPTkZJR19GRUFUVVJFX0JVRkZFUlNfR09fT05fU1RBQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CVUZGRVJTX0dPX0lOX0JTUyBpcyBub3Qgc2V0CitDT05GSUdfU0hPV19VU0FHRT15CitDT05GSUdfRkVBVFVSRV9WRVJCT1NFX1VTQUdFPXkKK0NPTkZJR19GRUFUVVJFX0NPTVBSRVNTX1VTQUdFPXkKK0NPTkZJR19GRUFUVVJFX0lOU1RBTExFUj15CisjIENPTkZJR19JTlNUQUxMX05PX1VTUiBpcyBub3Qgc2V0CisjIENPTkZJR19MT0NBTEVfU1VQUE9SVCBpcyBub3Qgc2V0CitDT05GSUdfVU5JQ09ERV9TVVBQT1JUPXkKKyMgQ09ORklHX1VOSUNPREVfVVNJTkdfTE9DQUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfVU5JQ09ERV9JTl9FTlYgaXMgbm90IHNldAorQ09ORklHX1NVQlNUX1dDSEFSPTY1NTMzCitDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVI9MAorIyBDT05GSUdfVU5JQ09ERV9DT01CSU5JTkdfV0NIQVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfV0lERV9XQ0hBUlMgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9CSURJX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVU5JQ09ERV9ORVVUUkFMX1RBQkxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfUFJFU0VSVkVfQlJPS0VOIGlzIG5vdCBzZXQKK0NPTkZJR19MT05HX09QVFM9eQorQ09ORklHX0ZFQVRVUkVfREVWUFRTPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ0xFQU5fVVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VVE1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfV1RNUCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9QSURGSUxFPXkKK0NPTkZJR19GRUFUVVJFX1NVSUQ9eQorIyBDT05GSUdfRkVBVFVSRV9TVUlEX0NPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVSURfQ09ORklHX1FVSUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTElOVVggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QUkVGRVJfQVBQTEVUUyBpcyBub3Qgc2V0CitDT05GSUdfQlVTWUJPWF9FWEVDX1BBVEg9Ii9wcm9jL3NlbGYvZXhlIgorQ09ORklHX0ZFQVRVUkVfU1lTTE9HPXkKKyMgQ09ORklHX0ZFQVRVUkVfSEFWRV9SUEMgaXMgbm90IHNldAorCisjCisjIEJ1aWxkIE9wdGlvbnMKKyMKKyMgQ09ORklHX1NUQVRJQyBpcyBub3Qgc2V0CisjIENPTkZJR19QSUUgaXMgbm90IHNldAorIyBDT05GSUdfTk9NTVUgaXMgbm90IHNldAorIyBDT05GSUdfQlVJTERfTElCQlVTWUJPWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORElWSURVQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSEFSRURfQlVTWUJPWCBpcyBub3Qgc2V0CitDT05GSUdfTEZTPXkKK0NPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVg9IiIKK0NPTkZJR19FWFRSQV9DRkxBR1M9IiIKKworIworIyBEZWJ1Z2dpbmcgT3B0aW9ucworIworIyBDT05GSUdfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUEVTU0lNSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dFUlJPUiBpcyBub3Qgc2V0CitDT05GSUdfTk9fREVCVUdfTElCPXkKKyMgQ09ORklHX0RNQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfRUZFTkNFIGlzIG5vdCBzZXQKKworIworIyBJbnN0YWxsYXRpb24gT3B0aW9ucyAoIm1ha2UgaW5zdGFsbCIgYmVoYXZpb3IpCisjCitDT05GSUdfSU5TVEFMTF9BUFBMRVRfU1lNTElOS1M9eQorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfSEFSRExJTktTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX1NDUklQVF9XUkFQUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9ET05UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NZTUxJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfSEFSRExJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfU0NSSVBUX1dSQVBQRVIgaXMgbm90IHNldAorQ09ORklHX1BSRUZJWD0iLi9faW5zdGFsbCIKKworIworIyBCdXN5Ym94IExpYnJhcnkgVHVuaW5nCisjCisjIENPTkZJR19GRUFUVVJFX1NZU1RFTUQgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfUlRNSU5NQVg9eQorQ09ORklHX1BBU1NXT1JEX01JTkxFTj02CitDT05GSUdfTUQ1X1NNQUxMPTEKK0NPTkZJR19GRUFUVVJFX0ZBU1RfVE9QPXkKKyMgQ09ORklHX0ZFQVRVUkVfRVRDX05FVFdPUktTIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1VTRV9URVJNSU9TPXkKK0NPTkZJR19GRUFUVVJFX0VESVRJTkc9eQorQ09ORklHX0ZFQVRVUkVfRURJVElOR19NQVhfTEVOPTEwMjQKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElOR19WSSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX0hJU1RPUlk9MjU1CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX1NBVkVISVNUT1JZPXkKK0NPTkZJR19GRUFUVVJFX1RBQl9DT01QTEVUSU9OPXkKKyMgQ09ORklHX0ZFQVRVUkVfVVNFUk5BTUVfQ09NUExFVElPTiBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVD15CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfQVNLX1RFUk1JTkFMIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX05PTl9QT1NJWF9DUD15CisjIENPTkZJR19GRUFUVVJFX1ZFUkJPU0VfQ1BfTUVTU0FHRSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9DT1BZQlVGX0tCPTQKK0NPTkZJR19GRUFUVVJFX1NLSVBfUk9PVEZTPXkKKyMgQ09ORklHX01PTk9UT05JQ19TWVNDQUxMIGlzIG5vdCBzZXQKK0NPTkZJR19JT0NUTF9IRVgyU1RSX0VSUk9SPXkKK0NPTkZJR19GRUFUVVJFX0hXSUI9eQorCisjCisjIEFwcGxldHMKKyMKKworIworIyBBcmNoaXZhbCBVdGlsaXRpZXMKKyMKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX1haPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0xaTUE9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfQloyPXkKK0NPTkZJR19GRUFUVVJFX1NFQU1MRVNTX0daPXkKKyMgQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWiBpcyBub3Qgc2V0CisjIENPTkZJR19BUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FSX0xPTkdfRklMRU5BTUVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQVJfQ1JFQVRFIGlzIG5vdCBzZXQKK0NPTkZJR19CVU5aSVAyPXkKK0NPTkZJR19CWklQMj15CitDT05GSUdfQ1BJTz15CitDT05GSUdfRkVBVFVSRV9DUElPX089eQorQ09ORklHX0ZFQVRVUkVfQ1BJT19QPXkKKyMgQ09ORklHX0RQS0cgaXMgbm90IHNldAorIyBDT05GSUdfRFBLR19ERUIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EUEtHX0RFQl9FWFRSQUNUX09OTFkgaXMgbm90IHNldAorQ09ORklHX0dVTlpJUD15CitDT05GSUdfR1pJUD15CitDT05GSUdfRkVBVFVSRV9HWklQX0xPTkdfT1BUSU9OUz15CitDT05GSUdfTFpPUD15CisjIENPTkZJR19MWk9QX0NPTVBSX0hJR0ggaXMgbm90IHNldAorQ09ORklHX1JQTTJDUElPPXkKK0NPTkZJR19SUE09eQorQ09ORklHX1RBUj15CitDT05GSUdfRkVBVFVSRV9UQVJfQ1JFQVRFPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9BVVRPREVURUNUPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9GUk9NPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9PTERHTlVfQ09NUEFUSUJJTElUWT15CitDT05GSUdfRkVBVFVSRV9UQVJfT0xEU1VOX0NPTVBBVElCSUxJVFk9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0dOVV9FWFRFTlNJT05TPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfVEFSX1RPX0NPTU1BTkQ9eQorQ09ORklHX0ZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9OT1BSRVNFUlZFX1RJTUU9eQorIyBDT05GSUdfRkVBVFVSRV9UQVJfU0VMSU5VWCBpcyBub3Qgc2V0CisjIENPTkZJR19VTkNPTVBSRVNTIGlzIG5vdCBzZXQKK0NPTkZJR19VTkxaTUE9eQorQ09ORklHX0ZFQVRVUkVfTFpNQV9GQVNUPXkKK0NPTkZJR19MWk1BPXkKK0NPTkZJR19VTlhaPXkKK0NPTkZJR19YWj15CitDT05GSUdfVU5aSVA9eQorCisjCisjIENvcmV1dGlscworIworQ09ORklHX0JBU0VOQU1FPXkKK0NPTkZJR19DQVQ9eQorQ09ORklHX0RBVEU9eQorQ09ORklHX0ZFQVRVUkVfREFURV9JU09GTVQ9eQorIyBDT05GSUdfRkVBVFVSRV9EQVRFX05BTk8gaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfREFURV9DT01QQVQ9eQorQ09ORklHX0lEPXkKK0NPTkZJR19HUk9VUFM9eQorQ09ORklHX1RFU1Q9eQorQ09ORklHX0ZFQVRVUkVfVEVTVF82ND15CitDT05GSUdfVE9VQ0g9eQorQ09ORklHX1RSPXkKK0NPTkZJR19GRUFUVVJFX1RSX0NMQVNTRVM9eQorQ09ORklHX0ZFQVRVUkVfVFJfRVFVSVY9eQorQ09ORklHX0JBU0U2ND15CitDT05GSUdfQ0FMPXkKK0NPTkZJR19DQVRWPXkKK0NPTkZJR19DSEdSUD15CitDT05GSUdfQ0hNT0Q9eQorQ09ORklHX0NIT1dOPXkKK0NPTkZJR19GRUFUVVJFX0NIT1dOX0xPTkdfT1BUSU9OUz15CitDT05GSUdfQ0hST09UPXkKK0NPTkZJR19DS1NVTT15CitDT05GSUdfQ09NTT15CitDT05GSUdfQ1A9eQorQ09ORklHX0ZFQVRVUkVfQ1BfTE9OR19PUFRJT05TPXkKK0NPTkZJR19DVVQ9eQorQ09ORklHX0REPXkKK0NPTkZJR19GRUFUVVJFX0REX1NJR05BTF9IQU5ETElORz15CitDT05GSUdfRkVBVFVSRV9ERF9USElSRF9TVEFUVVNfTElORT15CitDT05GSUdfRkVBVFVSRV9ERF9JQlNfT0JTPXkKK0NPTkZJR19ERj15CitDT05GSUdfRkVBVFVSRV9ERl9GQU5DWT15CitDT05GSUdfRElSTkFNRT15CitDT05GSUdfRE9TMlVOSVg9eQorQ09ORklHX1VOSVgyRE9TPXkKK0NPTkZJR19EVT15CisjIENPTkZJR19GRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLIGlzIG5vdCBzZXQKK0NPTkZJR19FQ0hPPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX0VDSE89eQorQ09ORklHX0VOVj15CitDT05GSUdfRkVBVFVSRV9FTlZfTE9OR19PUFRJT05TPXkKK0NPTkZJR19FWFBBTkQ9eQorQ09ORklHX0ZFQVRVUkVfRVhQQU5EX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRVhQUj15CitDT05GSUdfRVhQUl9NQVRIX1NVUFBPUlRfNjQ9eQorQ09ORklHX0ZBTFNFPXkKK0NPTkZJR19GT0xEPXkKK0NPTkZJR19GU1lOQz15CitDT05GSUdfSEVBRD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9IRUFEPXkKK0NPTkZJR19IT1NUSUQ9eQorQ09ORklHX0lOU1RBTEw9eQorQ09ORklHX0ZFQVRVUkVfSU5TVEFMTF9MT05HX09QVElPTlM9eQorQ09ORklHX0xOPXkKK0NPTkZJR19MT0dOQU1FPXkKK0NPTkZJR19MUz15CitDT05GSUdfRkVBVFVSRV9MU19GSUxFVFlQRVM9eQorQ09ORklHX0ZFQVRVUkVfTFNfRk9MTE9XTElOS1M9eQorQ09ORklHX0ZFQVRVUkVfTFNfUkVDVVJTSVZFPXkKK0NPTkZJR19GRUFUVVJFX0xTX1NPUlRGSUxFUz15CitDT05GSUdfRkVBVFVSRV9MU19USU1FU1RBTVBTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1VTRVJOQU1FPXkKK0NPTkZJR19GRUFUVVJFX0xTX0NPTE9SPXkKK0NPTkZJR19GRUFUVVJFX0xTX0NPTE9SX0lTX0RFRkFVTFQ9eQorQ09ORklHX01ENVNVTT15CitDT05GSUdfTUtESVI9eQorQ09ORklHX0ZFQVRVUkVfTUtESVJfTE9OR19PUFRJT05TPXkKK0NPTkZJR19NS0ZJRk89eQorQ09ORklHX01LTk9EPXkKK0NPTkZJR19NVj15CitDT05GSUdfRkVBVFVSRV9NVl9MT05HX09QVElPTlM9eQorQ09ORklHX05JQ0U9eQorQ09ORklHX05PSFVQPXkKK0NPTkZJR19PRD15CitDT05GSUdfUFJJTlRFTlY9eQorQ09ORklHX1BSSU5URj15CitDT05GSUdfUFdEPXkKK0NPTkZJR19SRUFETElOSz15CitDT05GSUdfRkVBVFVSRV9SRUFETElOS19GT0xMT1c9eQorQ09ORklHX1JFQUxQQVRIPXkKK0NPTkZJR19STT15CitDT05GSUdfUk1ESVI9eQorQ09ORklHX0ZFQVRVUkVfUk1ESVJfTE9OR19PUFRJT05TPXkKK0NPTkZJR19TRVE9eQorQ09ORklHX1NIQTFTVU09eQorQ09ORklHX1NIQTI1NlNVTT15CitDT05GSUdfU0hBNTEyU1VNPXkKK0NPTkZJR19TTEVFUD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9TTEVFUD15CitDT05GSUdfRkVBVFVSRV9GTE9BVF9TTEVFUD15CitDT05GSUdfU09SVD15CitDT05GSUdfRkVBVFVSRV9TT1JUX0JJRz15CitDT05GSUdfU1BMSVQ9eQorQ09ORklHX0ZFQVRVUkVfU1BMSVRfRkFOQ1k9eQorIyBDT05GSUdfU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NUQVRfRk9STUFUIGlzIG5vdCBzZXQKK0NPTkZJR19TVFRZPXkKK0NPTkZJR19TVU09eQorQ09ORklHX1NZTkM9eQorQ09ORklHX1RBQz15CitDT05GSUdfVEFJTD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9UQUlMPXkKK0NPTkZJR19URUU9eQorQ09ORklHX0ZFQVRVUkVfVEVFX1VTRV9CTE9DS19JTz15CitDT05GSUdfVFJVRT15CitDT05GSUdfVFRZPXkKK0NPTkZJR19VTkFNRT15CitDT05GSUdfVU5FWFBBTkQ9eQorQ09ORklHX0ZFQVRVUkVfVU5FWFBBTkRfTE9OR19PUFRJT05TPXkKK0NPTkZJR19VTklRPXkKK0NPTkZJR19VU0xFRVA9eQorQ09ORklHX1VVREVDT0RFPXkKK0NPTkZJR19VVUVOQ09ERT15CitDT05GSUdfV0M9eQorQ09ORklHX0ZFQVRVUkVfV0NfTEFSR0U9eQorIyBDT05GSUdfV0hPIGlzIG5vdCBzZXQKK0NPTkZJR19XSE9BTUk9eQorQ09ORklHX1lFUz15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGNwIGFuZCBtdgorIworQ09ORklHX0ZFQVRVUkVfUFJFU0VSVkVfSEFSRExJTktTPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbHMsIG1vcmUgYW5kIHRlbG5ldAorIworQ09ORklHX0ZFQVRVUkVfQVVUT1dJRFRIPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgZGYsIGR1LCBscworIworQ09ORklHX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEU9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBtZDVzdW0sIHNoYTFzdW0sIHNoYTI1NnN1bSwgc2hhNTEyc3VtCisjCitDT05GSUdfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0s9eQorCisjCisjIENvbnNvbGUgVXRpbGl0aWVzCisjCisjIENPTkZJR19DSFZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZHQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfQ0xFQVI9eQorIyBDT05GSUdfREVBTExPQ1ZUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RVTVBLTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tCRF9NT0RFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQURGT05UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPQURLTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX09QRU5WVCBpcyBub3Qgc2V0CitDT05GSUdfUkVTRVQ9eQorQ09ORklHX1JFU0laRT15CitDT05GSUdfRkVBVFVSRV9SRVNJWkVfUFJJTlQ9eQorIyBDT05GSUdfU0VUQ09OU09MRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NFVENPTlNPTEVfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEZPTlQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRGT05UX1RFWFRVQUxfTUFQIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX1NFVEZPTlRfRElSPSIiCisjIENPTkZJR19TRVRLRVlDT0RFUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRMT0dDT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NIT1dLRVkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MT0FERk9OVF9QU0YyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTE9BREZPTlRfUkFXIGlzIG5vdCBzZXQKKworIworIyBEZWJpYW4gVXRpbGl0aWVzCisjCitDT05GSUdfTUtURU1QPXkKK0NPTkZJR19QSVBFX1BST0dSRVNTPXkKK0NPTkZJR19SVU5fUEFSVFM9eQorQ09ORklHX0ZFQVRVUkVfUlVOX1BBUlRTX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRkVBVFVSRV9SVU5fUEFSVFNfRkFOQ1k9eQorQ09ORklHX1NUQVJUX1NUT1BfREFFTU9OPXkKK0NPTkZJR19GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZPXkKK0NPTkZJR19GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0xPTkdfT1BUSU9OUz15CitDT05GSUdfV0hJQ0g9eQorCisjCisjIEVkaXRvcnMKKyMKK0NPTkZJR19QQVRDSD15CitDT05GSUdfVkk9eQorQ09ORklHX0ZFQVRVUkVfVklfTUFYX0xFTj00MDk2CisjIENPTkZJR19GRUFUVVJFX1ZJXzhCSVQgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVklfQ09MT049eQorQ09ORklHX0ZFQVRVUkVfVklfWUFOS01BUks9eQorQ09ORklHX0ZFQVRVUkVfVklfU0VBUkNIPXkKKyMgQ09ORklHX0ZFQVRVUkVfVklfUkVHRVhfU0VBUkNIIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1ZJX1VTRV9TSUdOQUxTPXkKK0NPTkZJR19GRUFUVVJFX1ZJX0RPVF9DTUQ9eQorQ09ORklHX0ZFQVRVUkVfVklfUkVBRE9OTFk9eQorQ09ORklHX0ZFQVRVUkVfVklfU0VUT1BUUz15CitDT05GSUdfRkVBVFVSRV9WSV9TRVQ9eQorQ09ORklHX0ZFQVRVUkVfVklfV0lOX1JFU0laRT15CitDT05GSUdfRkVBVFVSRV9WSV9BU0tfVEVSTUlOQUw9eQorQ09ORklHX0FXSz15CitDT05GSUdfRkVBVFVSRV9BV0tfTElCTT15CitDT05GSUdfQ01QPXkKK0NPTkZJR19ESUZGPXkKK0NPTkZJR19GRUFUVVJFX0RJRkZfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX0RJRkZfRElSPXkKK0NPTkZJR19FRD15CitDT05GSUdfU0VEPXkKK0NPTkZJR19GRUFUVVJFX0FMTE9XX0VYRUM9eQorCisjCisjIEZpbmRpbmcgVXRpbGl0aWVzCisjCitDT05GSUdfRklORD15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BSSU5UMD15CitDT05GSUdfRkVBVFVSRV9GSU5EX01USU1FPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTU1JTj15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BFUk09eQorQ09ORklHX0ZFQVRVUkVfRklORF9UWVBFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfWERFVj15CitDT05GSUdfRkVBVFVSRV9GSU5EX01BWERFUFRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTkVXRVI9eQorQ09ORklHX0ZFQVRVUkVfRklORF9JTlVNPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfRVhFQz15CitDT05GSUdfRkVBVFVSRV9GSU5EX1VTRVI9eQorQ09ORklHX0ZFQVRVUkVfRklORF9HUk9VUD15CitDT05GSUdfRkVBVFVSRV9GSU5EX05PVD15CitDT05GSUdfRkVBVFVSRV9GSU5EX0RFUFRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUEFSRU49eQorQ09ORklHX0ZFQVRVUkVfRklORF9TSVpFPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUFJVTkU9eQorQ09ORklHX0ZFQVRVUkVfRklORF9ERUxFVEU9eQorQ09ORklHX0ZFQVRVUkVfRklORF9QQVRIPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUkVHRVg9eQorIyBDT05GSUdfRkVBVFVSRV9GSU5EX0NPTlRFWFQgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfRklORF9MSU5LUz15CitDT05GSUdfR1JFUD15CitDT05GSUdfRkVBVFVSRV9HUkVQX0VHUkVQX0FMSUFTPXkKK0NPTkZJR19GRUFUVVJFX0dSRVBfRkdSRVBfQUxJQVM9eQorQ09ORklHX0ZFQVRVUkVfR1JFUF9DT05URVhUPXkKK0NPTkZJR19YQVJHUz15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX0NPTkZJUk1BVElPTj15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1FVT1RFUz15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1RFUk1PUFQ9eQorQ09ORklHX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9aRVJPX1RFUk09eQorCisjCisjIEluaXQgVXRpbGl0aWVzCisjCisjIENPTkZJR19CT09UQ0hBUlREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQk9PVENIQVJURF9CTE9BVEVEX0hFQURFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JPT1RDSEFSVERfQ09ORklHX0ZJTEUgaXMgbm90IHNldAorIyBDT05GSUdfSEFMVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NBTExfVEVMSU5JVCBpcyBub3Qgc2V0CitDT05GSUdfVEVMSU5JVF9QQVRIPSIiCisjIENPTkZJR19JTklUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVVNFX0lOSVRUQUIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9LSUxMX1JFTU9WRUQgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfS0lMTF9ERUxBWT0wCisjIENPTkZJR19GRUFUVVJFX0lOSVRfU0NUVFkgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTklUX1NZU0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VYVFJBX1FVSUVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5JVF9DT1JFRFVNUFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTklUUkQgaXMgbm90IHNldAorQ09ORklHX0lOSVRfVEVSTUlOQUxfVFlQRT0iIgorQ09ORklHX01FU0c9eQorQ09ORklHX0ZFQVRVUkVfTUVTR19FTkFCTEVfT05MWV9HUk9VUD15CisKKyMKKyMgTG9naW4vUGFzc3dvcmQgTWFuYWdlbWVudCBVdGlsaXRpZXMKKyMKK0NPTkZJR19BRERfU0hFTEw9eQorQ09ORklHX1JFTU9WRV9TSEVMTD15CitDT05GSUdfRkVBVFVSRV9TSEFET1dQQVNTV0RTPXkKK0NPTkZJR19VU0VfQkJfUFdEX0dSUD15CitDT05GSUdfVVNFX0JCX1NIQURPVz15CitDT05GSUdfVVNFX0JCX0NSWVBUPXkKK0NPTkZJR19VU0VfQkJfQ1JZUFRfU0hBPXkKK0NPTkZJR19BRERVU0VSPXkKK0NPTkZJR19GRUFUVVJFX0FERFVTRVJfTE9OR19PUFRJT05TPXkKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfTkFNRVMgaXMgbm90IHNldAorQ09ORklHX0ZJUlNUX1NZU1RFTV9JRD0xMDAKK0NPTkZJR19MQVNUX1NZU1RFTV9JRD05OTkKK0NPTkZJR19BRERHUk9VUD15CitDT05GSUdfRkVBVFVSRV9BRERHUk9VUF9MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfQUREVVNFUl9UT19HUk9VUD15CitDT05GSUdfREVMVVNFUj15CitDT05GSUdfREVMR1JPVVA9eQorQ09ORklHX0ZFQVRVUkVfREVMX1VTRVJfRlJPTV9HUk9VUD15CisjIENPTkZJR19HRVRUWSBpcyBub3Qgc2V0CitDT05GSUdfTE9HSU49eQorIyBDT05GSUdfUEFNIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dJTl9TQ1JJUFRTPXkKK0NPTkZJR19GRUFUVVJFX05PTE9HSU49eQorQ09ORklHX0ZFQVRVUkVfU0VDVVJFVFRZPXkKK0NPTkZJR19QQVNTV0Q9eQorQ09ORklHX0ZFQVRVUkVfUEFTU1dEX1dFQUtfQ0hFQ0s9eQorQ09ORklHX0NSWVBUUFc9eQorQ09ORklHX0NIUEFTU1dEPXkKK0NPTkZJR19TVT15CitDT05GSUdfRkVBVFVSRV9TVV9TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfU1VfQ0hFQ0tTX1NIRUxMUz15CitDT05GSUdfU1VMT0dJTj15CitDT05GSUdfVkxPQ0s9eQorCisjCisjIExpbnV4IEV4dDIgRlMgUHJvZ3MKKyMKK0NPTkZJR19DSEFUVFI9eQorIyBDT05GSUdfRlNDSyBpcyBub3Qgc2V0CisjIENPTkZJR19MU0FUVFIgaXMgbm90IHNldAorIyBDT05GSUdfVFVORTJGUyBpcyBub3Qgc2V0CisKKyMKKyMgTGludXggTW9kdWxlIFV0aWxpdGllcworIworIyBDT05GSUdfTU9ESU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RQUk9CRV9TTUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX09QVElPTlNfT05fQ01ETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX0NIRUNLX0FMUkVBRFlfTE9BREVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU01PRCBpcyBub3Qgc2V0CisjIENPTkZJR19STU1PRCBpcyBub3Qgc2V0CisjIENPTkZJR19MU01PRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xTTU9EX1BSRVRUWV8yXzZfT1VUUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFBST0JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfQkxBQ0tMSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFUE1PRCBpcyBub3Qgc2V0CisKKyMKKyMgT3B0aW9ucyBjb21tb24gdG8gbXVsdGlwbGUgbW9kdXRpbHMKKyMKKyMgQ09ORklHX0ZFQVRVUkVfMl80X01PRFVMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVFJZX01NQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURJTktNRU0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVBfRlVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EVVRJTFNfQUxJQVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT0RVVElMU19TWU1CT0xTIGlzIG5vdCBzZXQKK0NPTkZJR19ERUZBVUxUX01PRFVMRVNfRElSPSIiCitDT05GSUdfREVGQVVMVF9ERVBNT0RfRklMRT0iIgorCisjCisjIExpbnV4IFN5c3RlbSBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0JMT0NLREVWIGlzIG5vdCBzZXQKK0NPTkZJR19SRVY9eQorIyBDT05GSUdfQUNQSUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BQ1BJRF9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfQkxLSUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CTEtJRF9UWVBFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNRVNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRE1FU0dfUFJFVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRkJTRVRfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GQlNFVF9SRUFETU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19GREZMVVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZERk9STUFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZESVNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZESVNLX1NVUFBPUlRfTEFSR0VfRElTS1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GRElTS19XUklUQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FJWF9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NHSV9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NVTl9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX09TRl9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0dQVF9MQUJFTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZESVNLX0FEVkFOQ0VEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZJTkRGUyBpcyBub3Qgc2V0CitDT05GSUdfRkxPQ0s9eQorIyBDT05GSUdfRlJFRVJBTURJU0sgaXMgbm90IHNldAorQ09ORklHX0ZTQ0tfTUlOSVg9eQorIyBDT05GSUdfTUtGU19FWFQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRlNfTUlOSVggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTUlOSVgyPXkKKyMgQ09ORklHX01LRlNfUkVJU0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRlNfVkZBVCBpcyBub3Qgc2V0CitDT05GSUdfR0VUT1BUPXkKK0NPTkZJR19GRUFUVVJFX0dFVE9QVF9MT05HPXkKK0NPTkZJR19IRVhEVU1QPXkKK0NPTkZJR19GRUFUVVJFX0hFWERVTVBfUkVWRVJTRT15CitDT05GSUdfSEQ9eQorIyBDT05GSUdfSFdDTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hXQ0xPQ0tfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFdDTE9DS19BREpUSU1FX0ZIUyBpcyBub3Qgc2V0CitDT05GSUdfSVBDUk09eQorIyBDT05GSUdfSVBDUyBpcyBub3Qgc2V0CisjIENPTkZJR19MT1NFVFVQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTUENJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xTVVNCIGlzIG5vdCBzZXQKKyMgQ09ORklHX01ERVYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX0NPTkYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NREVWX1JFTkFNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfUkVOQU1FX1JFR0VYUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfRVhFQyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfTE9BRF9GSVJNV0FSRSBpcyBub3Qgc2V0CitDT05GSUdfTUtTV0FQPXkKK0NPTkZJR19GRUFUVVJFX01LU1dBUF9VVUlEPXkKK0NPTkZJR19NT1JFPXkKKyMgQ09ORklHX01PVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkFLRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9ORlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkxBR1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9GU1RBQiBpcyBub3Qgc2V0CisjIENPTkZJR19QSVZPVF9ST09UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEQVRFIGlzIG5vdCBzZXQKK0NPTkZJR19SREVWPXkKK0NPTkZJR19SRUFEUFJPRklMRT15CisjIENPTkZJR19SVENXQUtFIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1JJUFQ9eQorQ09ORklHX1NDUklQVFJFUExBWT15CisjIENPTkZJR19TRVRBUkNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXQVBPTk9GRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NXQVBPTl9QUkkgaXMgbm90IHNldAorIyBDT05GSUdfU1dJVENIX1JPT1QgaXMgbm90IHNldAorIyBDT05GSUdfVU1PVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVU1PVU5UX0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX0xPT1AgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9MT09QX0NSRUFURSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01UQUJfU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19WT0xVTUVJRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0VYVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0JUUkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfUkVJU0VSRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9GQVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9IRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9KRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9YRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9OVEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSVNPOTY2MCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1VERiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xVS1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFNXQVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9DUkFNRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9ST01GUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1NZU1YgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9PQ0ZTMiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0xJTlVYUkFJRCBpcyBub3Qgc2V0CisKKyMKKyMgTWlzY2VsbGFuZW91cyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0NPTlNQWSBpcyBub3Qgc2V0CisjIENPTkZJR19OQU5EV1JJVEUgaXMgbm90IHNldAorIyBDT05GSUdfTkFORERVTVAgaXMgbm90IHNldAorIyBDT05GSUdfU0VUU0VSSUFMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSUFUVEFDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VQklERVRBQ0ggaXMgbm90IHNldAorIyBDT05GSUdfVUJJTUtWT0wgaXMgbm90IHNldAorIyBDT05GSUdfVUJJUk1WT0wgaXMgbm90IHNldAorIyBDT05GSUdfVUJJUlNWT0wgaXMgbm90IHNldAorIyBDT05GSUdfVUJJVVBEQVRFVk9MIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FESlRJTUVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JCQ09ORklHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ09NUFJFU1NfQkJDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfQkVFUCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9CRUVQX0ZSRVE9MAorQ09ORklHX0ZFQVRVUkVfQkVFUF9MRU5HVEhfTVM9MAorQ09ORklHX0NIQVQ9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9OT0ZBSUw9eQorIyBDT05GSUdfRkVBVFVSRV9DSEFUX1RUWV9ISUZJIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0NIQVRfSU1QTElDSVRfQ1I9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9TV0FMTE9XX09QVFM9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9TRU5EX0VTQ0FQRVM9eQorQ09ORklHX0ZFQVRVUkVfQ0hBVF9WQVJfQUJPUlRfTEVOPXkKK0NPTkZJR19GRUFUVVJFX0NIQVRfQ0xSX0FCT1JUPXkKK0NPTkZJR19DSFJUPXkKK0NPTkZJR19DUk9ORD15CitDT05GSUdfRkVBVFVSRV9DUk9ORF9EPXkKK0NPTkZJR19GRUFUVVJFX0NST05EX0NBTExfU0VORE1BSUw9eQorQ09ORklHX0ZFQVRVUkVfQ1JPTkRfRElSPSIvdmFyL3Nwb29sL2Nyb24iCitDT05GSUdfQ1JPTlRBQj15CitDT05GSUdfREM9eQorQ09ORklHX0ZFQVRVUkVfRENfTElCTT15CisjIENPTkZJR19ERVZGU0QgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX01PRExPQUQgaXMgbm90IHNldAorIyBDT05GSUdfREVWRlNEX0ZHX05QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRF9WRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfREVWRlMgaXMgbm90IHNldAorQ09ORklHX0RFVk1FTT15CisjIENPTkZJR19FSkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VKRUNUX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfRkJTUExBU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkxBU0hDUCBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX1VOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9FUkFTRUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19JT05JQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5PVElGWUQgaXMgbm90IHNldAorIyBDT05GSUdfTEFTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xBU1RfU01BTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MQVNUX0ZBTkNZIGlzIG5vdCBzZXQKK0NPTkZJR19MRVNTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfTUFYTElORVM9OTk5OTk5OQorQ09ORklHX0ZFQVRVUkVfTEVTU19CUkFDS0VUUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX0ZMQUdTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfTUFSS1M9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19SRUdFWFA9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19XSU5DSD15CitDT05GSUdfRkVBVFVSRV9MRVNTX0RBU0hDTUQ9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19MSU5FTlVNUz15CisjIENPTkZJR19IRFBBUk0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fU0NBTl9IV0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fVU5SRUdJU1RFUl9IV0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fRFJJVkVfUkVTRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19UUklTVEFURV9IV0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fR0VUU0VUX0RNQSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUtFREVWUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01BS0VERVZTX0xFQUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NQUtFREVWU19UQUJMRSBpcyBub3Qgc2V0CitDT05GSUdfTUFOPXkKKyMgQ09ORklHX01JQ1JPQ09NIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PVU5UUE9JTlQgaXMgbm90IHNldAorQ09ORklHX01UPXkKKyMgQ09ORklHX1JBSURBVVRPUlVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFQURBSEVBRCBpcyBub3Qgc2V0CisjIENPTkZJR19SRktJTEwgaXMgbm90IHNldAorIyBDT05GSUdfUlVOTEVWRUwgaXMgbm90IHNldAorIyBDT05GSUdfUlggaXMgbm90IHNldAorQ09ORklHX1NFVFNJRD15CitDT05GSUdfU1RSSU5HUz15CisjIENPTkZJR19UQVNLU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVEFTS1NFVF9GQU5DWSBpcyBub3Qgc2V0CitDT05GSUdfVElNRT15CitDT05GSUdfVElNRU9VVD15CitDT05GSUdfVFRZU0laRT15CitDT05GSUdfVk9MTkFNRT15CisjIENPTkZJR19XQUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dBVENIRE9HIGlzIG5vdCBzZXQKKworIworIyBOZXR3b3JraW5nIFV0aWxpdGllcworIworIyBDT05GSUdfTkFNRUlGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05CRENMSUVOVCBpcyBub3Qgc2V0CitDT05GSUdfTkM9eQorQ09ORklHX05DX1NFUlZFUj15CitDT05GSUdfTkNfRVhUUkE9eQorIyBDT05GSUdfTkNfMTEwX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19QSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BJTkc2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRkFOQ1lfUElORyBpcyBub3Qgc2V0CitDT05GSUdfV0hPSVM9eQorQ09ORklHX0ZFQVRVUkVfSVBWNj15CisjIENPTkZJR19GRUFUVVJFX1VOSVhfTE9DQUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfUFJFRkVSX0lQVjRfQUREUkVTUz15CisjIENPTkZJR19WRVJCT1NFX1JFU09MVVRJT05fRVJST1JTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSUCBpcyBub3Qgc2V0CisjIENPTkZJR19BUlBJTkcgaXMgbm90IHNldAorIyBDT05GSUdfQlJDVEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CUkNUTF9GQU5DWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JSQ1RMX1NIT1cgaXMgbm90IHNldAorQ09ORklHX0ROU0Q9eQorIyBDT05GSUdfRVRIRVJfV0FLRSBpcyBub3Qgc2V0CitDT05GSUdfRkFLRUlERU5URD15CitDT05GSUdfRlRQRD15CitDT05GSUdfRkVBVFVSRV9GVFBfV1JJVEU9eQorQ09ORklHX0ZFQVRVUkVfRlRQRF9BQ0NFUFRfQlJPS0VOX0xJU1Q9eQorQ09ORklHX0ZUUEdFVD15CitDT05GSUdfRlRQUFVUPXkKK0NPTkZJR19GRUFUVVJFX0ZUUEdFVFBVVF9MT05HX09QVElPTlM9eQorQ09ORklHX0hPU1ROQU1FPXkKK0NPTkZJR19IVFRQRD15CitDT05GSUdfRkVBVFVSRV9IVFRQRF9SQU5HRVM9eQorIyBDT05GSUdfRkVBVFVSRV9IVFRQRF9VU0VfU0VOREZJTEUgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfSFRUUERfU0VUVUlEPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEg9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfQVVUSF9NRDU9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfQ0dJPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0NPTkZJR19XSVRIX1NDUklQVF9JTlRFUlBSPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1NFVF9SRU1PVEVfUE9SVF9UT19FTlY9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfRU5DT0RFX1VSTF9TVFI9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfRVJST1JfUEFHRVM9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfUFJPWFk9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfR1pJUD15CisjIENPTkZJR19JRkNPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGQ09ORklHX1NUQVRVUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19NRU1TVEFSVF9JT0FERFJfSVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfSFcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19CUk9BRENBU1RfUExVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JRkVOU0xBVkUgaXMgbm90IHNldAorIyBDT05GSUdfSUZQTFVHRCBpcyBub3Qgc2V0CisjIENPTkZJR19JRlVQRE9XTiBpcyBub3Qgc2V0CitDT05GSUdfSUZVUERPV05fSUZTVEFURV9QQVRIPSIiCisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBfQlVJTFRJTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lGQ09ORklHX0JVSUxUSU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUFY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX01BUFBJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9FWFRFUk5BTF9ESENQIGlzIG5vdCBzZXQKK0NPTkZJR19JTkVURD15CitDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRUNITz15CitDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRElTQ0FSRD15CitDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fVElNRT15CitDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fREFZVElNRT15CitDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fQ0hBUkdFTj15CisjIENPTkZJR19GRUFUVVJFX0lORVREX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19JUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX0FERFJFU1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9MSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9SVUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfU0hPUlRfRk9STVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9SQVJFX1BST1RPQ09MUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUEFERFIgaXMgbm90IHNldAorIyBDT05GSUdfSVBMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfSVBUVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSVBSVUxFIGlzIG5vdCBzZXQKK0NPTkZJR19JUENBTEM9eQorQ09ORklHX0ZFQVRVUkVfSVBDQUxDX0ZBTkNZPXkKK0NPTkZJR19GRUFUVVJFX0lQQ0FMQ19MT05HX09QVElPTlM9eQorIyBDT05GSUdfTkVUU1RBVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05FVFNUQVRfV0lERSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX05FVFNUQVRfUFJHIGlzIG5vdCBzZXQKKyMgQ09ORklHX05TTE9PS1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX05UUEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9OVFBEX1NFUlZFUiBpcyBub3Qgc2V0CitDT05GSUdfUFNDQU49eQorIyBDT05GSUdfUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfU0xBVFRBQ0ggaXMgbm90IHNldAorQ09ORklHX1RDUFNWRD15CitDT05GSUdfVEVMTkVUPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVF9UVFlQRT15CitDT05GSUdfRkVBVFVSRV9URUxORVRfQVVUT0xPR0lOPXkKK0NPTkZJR19URUxORVREPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORT15CitDT05GSUdfRkVBVFVSRV9URUxORVREX0lORVREX1dBSVQ9eQorQ09ORklHX1RGVFA9eQorQ09ORklHX1RGVFBEPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgdGZ0cC90ZnRwZAorIworQ09ORklHX0ZFQVRVUkVfVEZUUF9HRVQ9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9QVVQ9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkU9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9QUk9HUkVTU19CQVI9eQorIyBDT05GSUdfVEZUUF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSQUNFUk9VVEU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1VTRV9JQ01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTkNUTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RVTkNUTF9VRyBpcyBub3Qgc2V0CisjIENPTkZJR19VREhDUEQgaXMgbm90IHNldAorIyBDT05GSUdfREhDUFJFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RVTVBMRUFTRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUERfV1JJVEVfTEVBU0VTX0VBUkxZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BEX0JBU0VfSVBfT05fTUFDIGlzIG5vdCBzZXQKK0NPTkZJR19ESENQRF9MRUFTRVNfRklMRT0iIgorIyBDT05GSUdfVURIQ1BDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BDX0FSUElORyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQX1BPUlQgaXMgbm90IHNldAorQ09ORklHX1VESENQX0RFQlVHPTAKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BfUkZDMzM5NyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQXzgwMjFRIGlzIG5vdCBzZXQKK0NPTkZJR19VREhDUENfREVGQVVMVF9TQ1JJUFQ9IiIKK0NPTkZJR19VREhDUENfU0xBQ0tfRk9SX0JVR0dZX1NFUlZFUlM9MAorQ09ORklHX0lGVVBET1dOX1VESENQQ19DTURfT1BUSU9OUz0iIgorQ09ORklHX1VEUFNWRD15CisjIENPTkZJR19WQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19XR0VUPXkKK0NPTkZJR19GRUFUVVJFX1dHRVRfU1RBVFVTQkFSPXkKK0NPTkZJR19GRUFUVVJFX1dHRVRfQVVUSEVOVElDQVRJT049eQorQ09ORklHX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfV0dFVF9USU1FT1VUPXkKKyMgQ09ORklHX1pDSVAgaXMgbm90IHNldAorCisjCisjIFByaW50IFV0aWxpdGllcworIworQ09ORklHX0xQRD15CitDT05GSUdfTFBSPXkKK0NPTkZJR19MUFE9eQorCisjCisjIE1haWwgVXRpbGl0aWVzCisjCitDT05GSUdfTUFLRU1JTUU9eQorQ09ORklHX0ZFQVRVUkVfTUlNRV9DSEFSU0VUPSJ1cy1hc2NpaSIKK0NPTkZJR19QT1BNQUlMRElSPXkKK0NPTkZJR19GRUFUVVJFX1BPUE1BSUxESVJfREVMSVZFUlk9eQorQ09ORklHX1JFRk9STUlNRT15CitDT05GSUdfRkVBVFVSRV9SRUZPUk1JTUVfQ09NUEFUPXkKK0NPTkZJR19TRU5ETUFJTD15CisKKyMKKyMgUHJvY2VzcyBVdGlsaXRpZXMKKyMKK0NPTkZJR19JT1NUQVQ9eQorQ09ORklHX01QU1RBVD15CitDT05GSUdfTk1FVEVSPXkKKyMgQ09ORklHX1BNQVAgaXMgbm90IHNldAorIyBDT05GSUdfUE9XRVJUT1AgaXMgbm90IHNldAorQ09ORklHX1BTVFJFRT15CitDT05GSUdfUFdEWD15CitDT05GSUdfU01FTUNBUD15CisjIENPTkZJR19GUkVFIGlzIG5vdCBzZXQKK0NPTkZJR19GVVNFUj15CitDT05GSUdfS0lMTD15CitDT05GSUdfS0lMTEFMTD15CitDT05GSUdfS0lMTEFMTDU9eQorQ09ORklHX1BHUkVQPXkKK0NPTkZJR19QSURPRj15CitDT05GSUdfRkVBVFVSRV9QSURPRl9TSU5HTEU9eQorQ09ORklHX0ZFQVRVUkVfUElET0ZfT01JVD15CitDT05GSUdfUEtJTEw9eQorQ09ORklHX1BTPXkKK0NPTkZJR19GRUFUVVJFX1BTX1dJREU9eQorIyBDT05GSUdfRkVBVFVSRV9QU19USU1FIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1BTX0FERElUSU9OQUxfQ09MVU1OUz15CisjIENPTkZJR19GRUFUVVJFX1BTX1VOVVNVQUxfU1lTVEVNUyBpcyBub3Qgc2V0CitDT05GSUdfUkVOSUNFPXkKK0NPTkZJR19CQl9TWVNDVEw9eQorQ09ORklHX1RPUD15CitDT05GSUdfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0U9eQorQ09ORklHX0ZFQVRVUkVfVE9QX0NQVV9HTE9CQUxfUEVSQ0VOVFM9eQorQ09ORklHX0ZFQVRVUkVfVE9QX1NNUF9DUFU9eQorQ09ORklHX0ZFQVRVUkVfVE9QX0RFQ0lNQUxTPXkKK0NPTkZJR19GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUz15CitDT05GSUdfRkVBVFVSRV9UT1BNRU09eQorIyBDT05GSUdfRkVBVFVSRV9TSE9XX1RIUkVBRFMgaXMgbm90IHNldAorIyBDT05GSUdfVVBUSU1FIGlzIG5vdCBzZXQKK0NPTkZJR19XQVRDSD15CisKKyMKKyMgUnVuaXQgVXRpbGl0aWVzCisjCitDT05GSUdfUlVOU1Y9eQorQ09ORklHX1JVTlNWRElSPXkKKyMgQ09ORklHX0ZFQVRVUkVfUlVOU1ZESVJfTE9HIGlzIG5vdCBzZXQKK0NPTkZJR19TVj15CitDT05GSUdfU1ZfREVGQVVMVF9TRVJWSUNFX0RJUj0iL3Zhci9zZXJ2aWNlIgorQ09ORklHX1NWTE9HRD15CitDT05GSUdfQ0hQU1Q9eQorQ09ORklHX1NFVFVJREdJRD15CitDT05GSUdfRU5WVUlER0lEPXkKK0NPTkZJR19FTlZESVI9eQorQ09ORklHX1NPRlRMSU1JVD15CisjIENPTkZJR19DSENPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRVRFTkZPUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFVFNFQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FEX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NQVRDSFBBVEhDT04gaXMgbm90IHNldAorIyBDT05GSUdfUkVTVE9SRUNPTiBpcyBub3Qgc2V0CisjIENPTkZJR19SVU5DT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SVU5DT05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTElOVVhFTkFCTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEVORk9SQ0UgaXMgbm90IHNldAorIyBDT05GSUdfU0VURklMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRGSUxFU19DSEVDS19PUFRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0VUU0VCT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFU1RBVFVTIGlzIG5vdCBzZXQKKworIworIyBTaGVsbHMKKyMKK0NPTkZJR19BU0g9eQorQ09ORklHX0FTSF9CQVNIX0NPTVBBVD15CisjIENPTkZJR19BU0hfSURMRV9USU1FT1VUIGlzIG5vdCBzZXQKK0NPTkZJR19BU0hfSk9CX0NPTlRST0w9eQorQ09ORklHX0FTSF9BTElBUz15CitDT05GSUdfQVNIX0dFVE9QVFM9eQorQ09ORklHX0FTSF9CVUlMVElOX0VDSE89eQorQ09ORklHX0FTSF9CVUlMVElOX1BSSU5URj15CitDT05GSUdfQVNIX0JVSUxUSU5fVEVTVD15CitDT05GSUdfQVNIX0NNRENNRD15CisjIENPTkZJR19BU0hfTUFJTCBpcyBub3Qgc2V0CitDT05GSUdfQVNIX09QVElNSVpFX0ZPUl9TSVpFPXkKK0NPTkZJR19BU0hfUkFORE9NX1NVUFBPUlQ9eQorQ09ORklHX0FTSF9FWFBBTkRfUFJNVD15CisjIENPTkZJR19DVFRZSEFDSyBpcyBub3Qgc2V0CitDT05GSUdfSFVTSD15CitDT05GSUdfSFVTSF9CQVNIX0NPTVBBVD15CitDT05GSUdfSFVTSF9CUkFDRV9FWFBBTlNJT049eQorQ09ORklHX0hVU0hfSEVMUD15CitDT05GSUdfSFVTSF9JTlRFUkFDVElWRT15CitDT05GSUdfSFVTSF9TQVZFSElTVE9SWT15CitDT05GSUdfSFVTSF9KT0I9eQorQ09ORklHX0hVU0hfVElDSz15CitDT05GSUdfSFVTSF9JRj15CitDT05GSUdfSFVTSF9MT09QUz15CitDT05GSUdfSFVTSF9DQVNFPXkKK0NPTkZJR19IVVNIX0ZVTkNUSU9OUz15CitDT05GSUdfSFVTSF9MT0NBTD15CitDT05GSUdfSFVTSF9SQU5ET01fU1VQUE9SVD15CitDT05GSUdfSFVTSF9FWFBPUlRfTj15CitDT05GSUdfSFVTSF9NT0RFX1g9eQorIyBDT05GSUdfTVNIIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1NIX0lTX0FTSD15CisjIENPTkZJR19GRUFUVVJFX1NIX0lTX0hVU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9JU19OT05FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19BU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CQVNIX0lTX0hVU0ggaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19OT05FPXkKK0NPTkZJR19TSF9NQVRIX1NVUFBPUlQ9eQorQ09ORklHX1NIX01BVEhfU1VQUE9SVF82ND15CitDT05GSUdfRkVBVFVSRV9TSF9FWFRSQV9RVUlFVD15CisjIENPTkZJR19GRUFUVVJFX1NIX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9OT0ZPUksgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfU0hfSElTVEZJTEVTSVpFPXkKKworIworIyBTeXN0ZW0gTG9nZ2luZyBVdGlsaXRpZXMKKyMKK0NPTkZJR19TWVNMT0dEPXkKK0NPTkZJR19GRUFUVVJFX1JPVEFURV9MT0dGSUxFPXkKK0NPTkZJR19GRUFUVVJFX1JFTU9URV9MT0c9eQorQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9EVVA9eQorQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9DRkc9eQorQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9SRUFEX0JVRkZFUl9TSVpFPTI1NgorQ09ORklHX0ZFQVRVUkVfSVBDX1NZU0xPRz15CitDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HX0JVRkZFUl9TSVpFPTE2CitDT05GSUdfTE9HUkVBRD15CitDT05GSUdfRkVBVFVSRV9MT0dSRUFEX1JFRFVDRURfTE9DS0lORz15CisjIENPTkZJR19LTE9HRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0tMT0dEX0tMT0dDVEwgaXMgbm90IHNldAorQ09ORklHX0xPR0dFUj15CmRpZmYgLS1naXQgYS9jb25maWdzL2ZyZWVic2RfZGVmY29uZmlnIGIvY29uZmlncy9mcmVlYnNkX2RlZmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzNlZDAzCi0tLSAvZGV2L251bGwKKysrIGIvY29uZmlncy9mcmVlYnNkX2RlZmNvbmZpZwpAQCAtMCwwICsxLDk2OSBAQAorIworIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAorIyBCdXN5Ym94IHZlcnNpb246IDEuMTguMQorIyBUdWUgRGVjIDIxIDE5OjQ3OjQwIDIwMTAKKyMKK0NPTkZJR19IQVZFX0RPVF9DT05GSUc9eQorCisjCisjIEJ1c3lib3ggU2V0dGluZ3MKKyMKKworIworIyBHZW5lcmFsIENvbmZpZ3VyYXRpb24KKyMKKyMgQ09ORklHX0RFU0tUT1AgaXMgbm90IHNldAorIyBDT05GSUdfRVhUUkFfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19JTkNMVURFX1NVU3YyPXkKK0NPTkZJR19VU0VfUE9SVEFCTEVfQ09ERT15CisjIENPTkZJR19QTEFURk9STV9MSU5VWCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9CVUZGRVJTX1VTRV9NQUxMT0M9eQorIyBDT05GSUdfRkVBVFVSRV9CVUZGRVJTX0dPX09OX1NUQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlVGRkVSU19HT19JTl9CU1MgaXMgbm90IHNldAorQ09ORklHX1NIT1dfVVNBR0U9eQorQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9VU0FHRT15CitDT05GSUdfRkVBVFVSRV9DT01QUkVTU19VU0FHRT15CitDT05GSUdfRkVBVFVSRV9JTlNUQUxMRVI9eQorIyBDT05GSUdfSU5TVEFMTF9OT19VU1IgaXMgbm90IHNldAorQ09ORklHX0xPQ0FMRV9TVVBQT1JUPXkKK0NPTkZJR19VTklDT0RFX1NVUFBPUlQ9eQorIyBDT05GSUdfVU5JQ09ERV9VU0lOR19MT0NBTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEVDS19VTklDT0RFX0lOX0VOViBpcyBub3Qgc2V0CitDT05GSUdfU1VCU1RfV0NIQVI9NjMKK0NPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUj03NjcKKyMgQ09ORklHX1VOSUNPREVfQ09NQklOSU5HX1dDSEFSUyBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX1dJREVfV0NIQVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfQklESV9TVVBQT1JUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VOSUNPREVfTkVVVFJBTF9UQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19VTklDT0RFX1BSRVNFUlZFX0JST0tFTiBpcyBub3Qgc2V0CitDT05GSUdfTE9OR19PUFRTPXkKK0NPTkZJR19GRUFUVVJFX0RFVlBUUz15CisjIENPTkZJR19GRUFUVVJFX0NMRUFOX1VQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfV1RNUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VUTVAgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfUElERklMRT15CitDT05GSUdfRkVBVFVSRV9TVUlEPXkKK0NPTkZJR19GRUFUVVJFX1NVSURfQ09ORklHPXkKK0NPTkZJR19GRUFUVVJFX1NVSURfQ09ORklHX1FVSUVUPXkKKyMgQ09ORklHX1NFTElOVVggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QUkVGRVJfQVBQTEVUUyBpcyBub3Qgc2V0CitDT05GSUdfQlVTWUJPWF9FWEVDX1BBVEg9Ii9wcm9jL3NlbGYvZXhlIgorQ09ORklHX0ZFQVRVUkVfU1lTTE9HPXkKKyMgQ09ORklHX0ZFQVRVUkVfSEFWRV9SUEMgaXMgbm90IHNldAorCisjCisjIEJ1aWxkIE9wdGlvbnMKKyMKKyMgQ09ORklHX1NUQVRJQyBpcyBub3Qgc2V0CisjIENPTkZJR19QSUUgaXMgbm90IHNldAorIyBDT05GSUdfTk9NTVUgaXMgbm90IHNldAorIyBDT05GSUdfQlVJTERfTElCQlVTWUJPWCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORElWSURVQUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSEFSRURfQlVTWUJPWCBpcyBub3Qgc2V0CitDT05GSUdfTEZTPXkKK0NPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVg9IiIKK0NPTkZJR19FWFRSQV9DRkxBR1M9IiIKKworIworIyBEZWJ1Z2dpbmcgT3B0aW9ucworIworIyBDT05GSUdfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfUEVTU0lNSVpFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1dFUlJPUiBpcyBub3Qgc2V0CitDT05GSUdfTk9fREVCVUdfTElCPXkKKyMgQ09ORklHX0RNQUxMT0MgaXMgbm90IHNldAorIyBDT05GSUdfRUZFTkNFIGlzIG5vdCBzZXQKKworIworIyBJbnN0YWxsYXRpb24gT3B0aW9ucyAoIm1ha2UgaW5zdGFsbCIgYmVoYXZpb3IpCisjCitDT05GSUdfSU5TVEFMTF9BUFBMRVRfU1lNTElOS1M9eQorIyBDT05GSUdfSU5TVEFMTF9BUFBMRVRfSEFSRExJTktTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfQVBQTEVUX1NDUklQVF9XUkFQUEVSUyBpcyBub3Qgc2V0CisjIENPTkZJR19JTlNUQUxMX0FQUExFVF9ET05UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU1RBTExfU0hfQVBQTEVUX1NZTUxJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfSEFSRExJTksgaXMgbm90IHNldAorIyBDT05GSUdfSU5TVEFMTF9TSF9BUFBMRVRfU0NSSVBUX1dSQVBQRVIgaXMgbm90IHNldAorQ09ORklHX1BSRUZJWD0iLi9faW5zdGFsbCIKKworIworIyBCdXN5Ym94IExpYnJhcnkgVHVuaW5nCisjCitDT05GSUdfUEFTU1dPUkRfTUlOTEVOPTYKK0NPTkZJR19NRDVfU01BTEw9MQorQ09ORklHX0ZFQVRVUkVfRkFTVF9UT1A9eQorIyBDT05GSUdfRkVBVFVSRV9FVENfTkVUV09SS1MgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfVVNFX1RFUk1JT1M9eQorQ09ORklHX0ZFQVRVUkVfRURJVElORz15CitDT05GSUdfRkVBVFVSRV9FRElUSU5HX01BWF9MRU49MTAyNAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX1ZJIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0VESVRJTkdfSElTVE9SWT0zMAorIyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX1NBVkVISVNUT1JZIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1RBQl9DT01QTEVUSU9OPXkKKyMgQ09ORklHX0ZFQVRVUkVfVVNFUk5BTUVfQ09NUExFVElPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VESVRJTkdfRkFOQ1lfUFJPTVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRURJVElOR19BU0tfVEVSTUlOQUwgaXMgbm90IHNldAorQ09ORklHX0ZFQVRVUkVfTk9OX1BPU0lYX0NQPXkKKyMgQ09ORklHX0ZFQVRVUkVfVkVSQk9TRV9DUF9NRVNTQUdFIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0NPUFlCVUZfS0I9NAorIyBDT05GSUdfTU9OT1RPTklDX1NZU0NBTEwgaXMgbm90IHNldAorQ09ORklHX0lPQ1RMX0hFWDJTVFJfRVJST1I9eQorQ09ORklHX0ZFQVRVUkVfSFdJQj15CisKKyMKKyMgQXBwbGV0cworIworCisjCisjIEFyY2hpdmFsIFV0aWxpdGllcworIworQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWFo9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfTFpNQT15CitDT05GSUdfRkVBVFVSRV9TRUFNTEVTU19CWjI9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfR1o9eQorQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfWj15CitDT05GSUdfQVI9eQorQ09ORklHX0ZFQVRVUkVfQVJfTE9OR19GSUxFTkFNRVM9eQorQ09ORklHX0ZFQVRVUkVfQVJfQ1JFQVRFPXkKK0NPTkZJR19CVU5aSVAyPXkKK0NPTkZJR19CWklQMj15CitDT05GSUdfQ1BJTz15CisjIENPTkZJR19GRUFUVVJFX0NQSU9fTyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NQSU9fUCBpcyBub3Qgc2V0CisjIENPTkZJR19EUEtHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RQS0dfREVCIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRFBLR19ERUJfRVhUUkFDVF9PTkxZIGlzIG5vdCBzZXQKK0NPTkZJR19HVU5aSVA9eQorQ09ORklHX0daSVA9eQorQ09ORklHX0ZFQVRVUkVfR1pJUF9MT05HX09QVElPTlM9eQorQ09ORklHX0xaT1A9eQorIyBDT05GSUdfTFpPUF9DT01QUl9ISUdIIGlzIG5vdCBzZXQKK0NPTkZJR19SUE0yQ1BJTz15CitDT05GSUdfUlBNPXkKK0NPTkZJR19UQVI9eQorQ09ORklHX0ZFQVRVUkVfVEFSX0NSRUFURT15CitDT05GSUdfRkVBVFVSRV9UQVJfQVVUT0RFVEVDVD15CitDT05GSUdfRkVBVFVSRV9UQVJfRlJPTT15CitDT05GSUdfRkVBVFVSRV9UQVJfT0xER05VX0NPTVBBVElCSUxJVFk9eQorQ09ORklHX0ZFQVRVUkVfVEFSX09MRFNVTl9DT01QQVRJQklMSVRZPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9HTlVfRVhURU5TSU9OUz15CitDT05GSUdfRkVBVFVSRV9UQVJfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX1RBUl9UT19DT01NQU5EPXkKKyMgQ09ORklHX0ZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1RBUl9OT1BSRVNFUlZFX1RJTUU9eQorIyBDT05GSUdfRkVBVFVSRV9UQVJfU0VMSU5VWCBpcyBub3Qgc2V0CitDT05GSUdfVU5DT01QUkVTUz15CitDT05GSUdfVU5MWk1BPXkKK0NPTkZJR19GRUFUVVJFX0xaTUFfRkFTVD15CitDT05GSUdfTFpNQT15CitDT05GSUdfVU5YWj15CitDT05GSUdfWFo9eQorQ09ORklHX1VOWklQPXkKKworIworIyBDb3JldXRpbHMKKyMKK0NPTkZJR19CQVNFTkFNRT15CitDT05GSUdfQ0FUPXkKKyMgQ09ORklHX0RBVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9EQVRFX0lTT0ZNVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RBVEVfTkFOTyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RBVEVfQ09NUEFUIGlzIG5vdCBzZXQKK0NPTkZJR19URVNUPXkKK0NPTkZJR19GRUFUVVJFX1RFU1RfNjQ9eQorQ09ORklHX1RSPXkKK0NPTkZJR19GRUFUVVJFX1RSX0NMQVNTRVM9eQorQ09ORklHX0ZFQVRVUkVfVFJfRVFVSVY9eQorIyBDT05GSUdfQkFTRTY0IGlzIG5vdCBzZXQKK0NPTkZJR19DQUw9eQorQ09ORklHX0NBVFY9eQorQ09ORklHX0NIR1JQPXkKK0NPTkZJR19DSE1PRD15CitDT05GSUdfQ0hPV049eQorQ09ORklHX0ZFQVRVUkVfQ0hPV05fTE9OR19PUFRJT05TPXkKK0NPTkZJR19DSFJPT1Q9eQorQ09ORklHX0NLU1VNPXkKK0NPTkZJR19DT01NPXkKK0NPTkZJR19DUD15CitDT05GSUdfRkVBVFVSRV9DUF9MT05HX09QVElPTlM9eQorQ09ORklHX0NVVD15CitDT05GSUdfREQ9eQorQ09ORklHX0ZFQVRVUkVfRERfU0lHTkFMX0hBTkRMSU5HPXkKK0NPTkZJR19GRUFUVVJFX0REX1RISVJEX1NUQVRVU19MSU5FPXkKK0NPTkZJR19GRUFUVVJFX0REX0lCU19PQlM9eQorIyBDT05GSUdfREYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ERl9GQU5DWSBpcyBub3Qgc2V0CitDT05GSUdfRElSTkFNRT15CitDT05GSUdfRE9TMlVOSVg9eQorQ09ORklHX1VOSVgyRE9TPXkKK0NPTkZJR19EVT15CitDT05GSUdfRkVBVFVSRV9EVV9ERUZBVUxUX0JMT0NLU0laRV8xSz15CitDT05GSUdfRUNITz15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9FQ0hPPXkKK0NPTkZJR19FTlY9eQorQ09ORklHX0ZFQVRVUkVfRU5WX0xPTkdfT1BUSU9OUz15CitDT05GSUdfRVhQQU5EPXkKK0NPTkZJR19GRUFUVVJFX0VYUEFORF9MT05HX09QVElPTlM9eQorQ09ORklHX0VYUFI9eQorQ09ORklHX0VYUFJfTUFUSF9TVVBQT1JUXzY0PXkKK0NPTkZJR19GQUxTRT15CitDT05GSUdfRk9MRD15CitDT05GSUdfRlNZTkM9eQorQ09ORklHX0hFQUQ9eQorQ09ORklHX0ZFQVRVUkVfRkFOQ1lfSEVBRD15CitDT05GSUdfSE9TVElEPXkKK0NPTkZJR19JRD15CitDT05GSUdfSU5TVEFMTD15CitDT05GSUdfRkVBVFVSRV9JTlNUQUxMX0xPTkdfT1BUSU9OUz15CitDT05GSUdfTEVOR1RIPXkKK0NPTkZJR19MTj15CitDT05GSUdfTE9HTkFNRT15CitDT05GSUdfTFM9eQorQ09ORklHX0ZFQVRVUkVfTFNfRklMRVRZUEVTPXkKK0NPTkZJR19GRUFUVVJFX0xTX0ZPTExPV0xJTktTPXkKK0NPTkZJR19GRUFUVVJFX0xTX1JFQ1VSU0lWRT15CitDT05GSUdfRkVBVFVSRV9MU19TT1JURklMRVM9eQorQ09ORklHX0ZFQVRVUkVfTFNfVElNRVNUQU1QUz15CitDT05GSUdfRkVBVFVSRV9MU19VU0VSTkFNRT15CitDT05GSUdfRkVBVFVSRV9MU19DT0xPUj15CitDT05GSUdfRkVBVFVSRV9MU19DT0xPUl9JU19ERUZBVUxUPXkKK0NPTkZJR19NRDVTVU09eQorQ09ORklHX01LRElSPXkKK0NPTkZJR19GRUFUVVJFX01LRElSX0xPTkdfT1BUSU9OUz15CitDT05GSUdfTUtGSUZPPXkKKyMgQ09ORklHX01LTk9EIGlzIG5vdCBzZXQKK0NPTkZJR19NVj15CitDT05GSUdfRkVBVFVSRV9NVl9MT05HX09QVElPTlM9eQorQ09ORklHX05JQ0U9eQorQ09ORklHX05PSFVQPXkKK0NPTkZJR19PRD15CitDT05GSUdfUFJJTlRFTlY9eQorQ09ORklHX1BSSU5URj15CitDT05GSUdfUFdEPXkKK0NPTkZJR19SRUFETElOSz15CitDT05GSUdfRkVBVFVSRV9SRUFETElOS19GT0xMT1c9eQorQ09ORklHX1JFQUxQQVRIPXkKK0NPTkZJR19STT15CitDT05GSUdfUk1ESVI9eQorIyBDT05GSUdfRkVBVFVSRV9STURJUl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX1NFUT15CitDT05GSUdfU0hBMVNVTT15CitDT05GSUdfU0hBMjU2U1VNPXkKK0NPTkZJR19TSEE1MTJTVU09eQorQ09ORklHX1NMRUVQPXkKK0NPTkZJR19GRUFUVVJFX0ZBTkNZX1NMRUVQPXkKK0NPTkZJR19GRUFUVVJFX0ZMT0FUX1NMRUVQPXkKK0NPTkZJR19TT1JUPXkKK0NPTkZJR19GRUFUVVJFX1NPUlRfQklHPXkKK0NPTkZJR19TUExJVD15CitDT05GSUdfRkVBVFVSRV9TUExJVF9GQU5DWT15CisjIENPTkZJR19TVEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1RBVF9GT1JNQVQgaXMgbm90IHNldAorIyBDT05GSUdfU1RUWSBpcyBub3Qgc2V0CitDT05GSUdfU1VNPXkKK0NPTkZJR19TWU5DPXkKKyMgQ09ORklHX1RBQyBpcyBub3Qgc2V0CitDT05GSUdfVEFJTD15CitDT05GSUdfRkVBVFVSRV9GQU5DWV9UQUlMPXkKK0NPTkZJR19URUU9eQorQ09ORklHX0ZFQVRVUkVfVEVFX1VTRV9CTE9DS19JTz15CitDT05GSUdfVE9VQ0g9eQorQ09ORklHX1RSVUU9eQorQ09ORklHX1RUWT15CitDT05GSUdfVU5BTUU9eQorQ09ORklHX1VORVhQQU5EPXkKK0NPTkZJR19GRUFUVVJFX1VORVhQQU5EX0xPTkdfT1BUSU9OUz15CitDT05GSUdfVU5JUT15CitDT05GSUdfVVNMRUVQPXkKK0NPTkZJR19VVURFQ09ERT15CitDT05GSUdfVVVFTkNPREU9eQorQ09ORklHX1dDPXkKK0NPTkZJR19GRUFUVVJFX1dDX0xBUkdFPXkKKyMgQ09ORklHX1dITyBpcyBub3Qgc2V0CitDT05GSUdfV0hPQU1JPXkKK0NPTkZJR19ZRVM9eQorCisjCisjIENvbW1vbiBvcHRpb25zIGZvciBjcCBhbmQgbXYKKyMKK0NPTkZJR19GRUFUVVJFX1BSRVNFUlZFX0hBUkRMSU5LUz15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGxzLCBtb3JlIGFuZCB0ZWxuZXQKKyMKK0NPTkZJR19GRUFUVVJFX0FVVE9XSURUSD15CisKKyMKKyMgQ29tbW9uIG9wdGlvbnMgZm9yIGRmLCBkdSwgbHMKKyMKK0NPTkZJR19GRUFUVVJFX0hVTUFOX1JFQURBQkxFPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgbWQ1c3VtLCBzaGExc3VtLCBzaGEyNTZzdW0sIHNoYTUxMnN1bQorIworQ09ORklHX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLPXkKKworIworIyBDb25zb2xlIFV0aWxpdGllcworIworIyBDT05GSUdfQ0hWVCBpcyBub3Qgc2V0CisjIENPTkZJR19GR0NPTlNPTEUgaXMgbm90IHNldAorQ09ORklHX0NMRUFSPXkKKyMgQ09ORklHX0RFQUxMT0NWVCBpcyBub3Qgc2V0CisjIENPTkZJR19EVU1QS01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19LQkRfTU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FERk9OVCBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FES01BUCBpcyBub3Qgc2V0CisjIENPTkZJR19PUEVOVlQgaXMgbm90IHNldAorQ09ORklHX1JFU0VUPXkKK0NPTkZJR19SRVNJWkU9eQorQ09ORklHX0ZFQVRVUkVfUkVTSVpFX1BSSU5UPXkKKyMgQ09ORklHX1NFVENPTlNPTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRDT05TT0xFX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19TRVRGT05UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0VURk9OVF9URVhUVUFMX01BUCBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9TRVRGT05UX0RJUj0iIgorIyBDT05GSUdfU0VUS0VZQ09ERVMgaXMgbm90IHNldAorIyBDT05GSUdfU0VUTE9HQ09OUyBpcyBub3Qgc2V0CisjIENPTkZJR19TSE9XS0VZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTE9BREZPTlRfUFNGMiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xPQURGT05UX1JBVyBpcyBub3Qgc2V0CisKKyMKKyMgRGViaWFuIFV0aWxpdGllcworIworQ09ORklHX01LVEVNUD15CitDT05GSUdfUElQRV9QUk9HUkVTUz15CitDT05GSUdfUlVOX1BBUlRTPXkKK0NPTkZJR19GRUFUVVJFX1JVTl9QQVJUU19MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfUlVOX1BBUlRTX0ZBTkNZPXkKKyMgQ09ORklHX1NUQVJUX1NUT1BfREFFTU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9MT05HX09QVElPTlMgaXMgbm90IHNldAorQ09ORklHX1dISUNIPXkKKworIworIyBFZGl0b3JzCisjCitDT05GSUdfUEFUQ0g9eQorQ09ORklHX0FXSz15CitDT05GSUdfRkVBVFVSRV9BV0tfTElCTT15CitDT05GSUdfQ01QPXkKK0NPTkZJR19ESUZGPXkKK0NPTkZJR19GRUFUVVJFX0RJRkZfTE9OR19PUFRJT05TPXkKK0NPTkZJR19GRUFUVVJFX0RJRkZfRElSPXkKK0NPTkZJR19FRD15CitDT05GSUdfU0VEPXkKK0NPTkZJR19WST15CitDT05GSUdfRkVBVFVSRV9WSV9NQVhfTEVOPTEwMjQKK0NPTkZJR19GRUFUVVJFX1ZJXzhCSVQ9eQorQ09ORklHX0ZFQVRVUkVfVklfQ09MT049eQorQ09ORklHX0ZFQVRVUkVfVklfWUFOS01BUks9eQorQ09ORklHX0ZFQVRVUkVfVklfU0VBUkNIPXkKK0NPTkZJR19GRUFUVVJFX1ZJX1VTRV9TSUdOQUxTPXkKK0NPTkZJR19GRUFUVVJFX1ZJX0RPVF9DTUQ9eQorQ09ORklHX0ZFQVRVUkVfVklfUkVBRE9OTFk9eQorQ09ORklHX0ZFQVRVUkVfVklfU0VUT1BUUz15CitDT05GSUdfRkVBVFVSRV9WSV9TRVQ9eQorQ09ORklHX0ZFQVRVUkVfVklfV0lOX1JFU0laRT15CitDT05GSUdfRkVBVFVSRV9WSV9BU0tfVEVSTUlOQUw9eQorQ09ORklHX0ZFQVRVUkVfQUxMT1dfRVhFQz15CisKKyMKKyMgRmluZGluZyBVdGlsaXRpZXMKKyMKK0NPTkZJR19GSU5EPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUFJJTlQwPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTVRJTUU9eQorQ09ORklHX0ZFQVRVUkVfRklORF9NTUlOPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfUEVSTT15CitDT05GSUdfRkVBVFVSRV9GSU5EX1RZUEU9eQorQ09ORklHX0ZFQVRVUkVfRklORF9YREVWPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTUFYREVQVEg9eQorQ09ORklHX0ZFQVRVUkVfRklORF9ORVdFUj15CitDT05GSUdfRkVBVFVSRV9GSU5EX0lOVU09eQorQ09ORklHX0ZFQVRVUkVfRklORF9FWEVDPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfVVNFUj15CitDT05GSUdfRkVBVFVSRV9GSU5EX0dST1VQPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfTk9UPXkKK0NPTkZJR19GRUFUVVJFX0ZJTkRfREVQVEg9eQorQ09ORklHX0ZFQVRVUkVfRklORF9QQVJFTj15CitDT05GSUdfRkVBVFVSRV9GSU5EX1NJWkU9eQorQ09ORklHX0ZFQVRVUkVfRklORF9QUlVORT15CitDT05GSUdfRkVBVFVSRV9GSU5EX0RFTEVURT15CitDT05GSUdfRkVBVFVSRV9GSU5EX1BBVEg9eQorQ09ORklHX0ZFQVRVUkVfRklORF9SRUdFWD15CisjIENPTkZJR19GRUFUVVJFX0ZJTkRfQ09OVEVYVCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9GSU5EX0xJTktTPXkKK0NPTkZJR19HUkVQPXkKK0NPTkZJR19GRUFUVVJFX0dSRVBfRUdSRVBfQUxJQVM9eQorQ09ORklHX0ZFQVRVUkVfR1JFUF9GR1JFUF9BTElBUz15CitDT05GSUdfRkVBVFVSRV9HUkVQX0NPTlRFWFQ9eQorQ09ORklHX1hBUkdTPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfQ09ORklSTUFUSU9OPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfUVVPVEVTPXkKK0NPTkZJR19GRUFUVVJFX1hBUkdTX1NVUFBPUlRfVEVSTU9QVD15CitDT05GSUdfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1pFUk9fVEVSTT15CisKKyMKKyMgSW5pdCBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX0JPT1RDSEFSVEQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CT09UQ0hBUlREX0JMT0FURURfSEVBREVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQk9PVENIQVJURF9DT05GSUdfRklMRSBpcyBub3Qgc2V0CisjIENPTkZJR19IQUxUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0FMTF9URUxJTklUIGlzIG5vdCBzZXQKK0NPTkZJR19URUxJTklUX1BBVEg9IiIKKyMgQ09ORklHX0lOSVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VU0VfSU5JVFRBQiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0tJTExfUkVNT1ZFRCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9LSUxMX0RFTEFZPTAKKyMgQ09ORklHX0ZFQVRVUkVfSU5JVF9TQ1RUWSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOSVRfU1lTTE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRVhUUkFfUVVJRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTklUX0NPUkVEVU1QUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOSVRSRCBpcyBub3Qgc2V0CitDT05GSUdfSU5JVF9URVJNSU5BTF9UWVBFPSIiCisjIENPTkZJR19NRVNHIGlzIG5vdCBzZXQKKworIworIyBMb2dpbi9QYXNzd29yZCBNYW5hZ2VtZW50IFV0aWxpdGllcworIworIyBDT05GSUdfQUREX1NIRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JFTU9WRV9TSEVMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIQURPV1BBU1NXRFMgaXMgbm90IHNldAorQ09ORklHX1VTRV9CQl9QV0RfR1JQPXkKKyMgQ09ORklHX1VTRV9CQl9TSEFET1cgaXMgbm90IHNldAorIyBDT05GSUdfVVNFX0JCX0NSWVBUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VTRV9CQl9DUllQVF9TSEEgaXMgbm90IHNldAorIyBDT05GSUdfQUREVVNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0FERFVTRVJfTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hFQ0tfTkFNRVMgaXMgbm90IHNldAorQ09ORklHX0ZJUlNUX1NZU1RFTV9JRD0xMDAKK0NPTkZJR19MQVNUX1NZU1RFTV9JRD05OTkKK0NPTkZJR19BRERHUk9VUD15CitDT05GSUdfRkVBVFVSRV9BRERHUk9VUF9MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfQUREVVNFUl9UT19HUk9VUD15CisjIENPTkZJR19ERUxVU0VSIGlzIG5vdCBzZXQKK0NPTkZJR19ERUxHUk9VUD15CitDT05GSUdfRkVBVFVSRV9ERUxfVVNFUl9GUk9NX0dST1VQPXkKKyMgQ09ORklHX0dFVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xPR0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBTSBpcyBub3Qgc2V0CisjIENPTkZJR19MT0dJTl9TQ1JJUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTk9MT0dJTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NFQ1VSRVRUWSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVNTV0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9QQVNTV0RfV0VBS19DSEVDSyBpcyBub3Qgc2V0CisjIENPTkZJR19DUllQVFBXIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUEFTU1dEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NVIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VfU1lTTE9HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU1VfQ0hFQ0tTX1NIRUxMUyBpcyBub3Qgc2V0CisjIENPTkZJR19TVUxPR0lOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1ZMT0NLIGlzIG5vdCBzZXQKKworIworIyBMaW51eCBFeHQyIEZTIFByb2dzCisjCitDT05GSUdfQ0hBVFRSPXkKKyMgQ09ORklHX0ZTQ0sgaXMgbm90IHNldAorIyBDT05GSUdfTFNBVFRSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTkUyRlMgaXMgbm90IHNldAorIyBDT05GSUdfTU9ESU5GTyBpcyBub3Qgc2V0CisjIENPTkZJR19NT0RQUk9CRV9TTUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX09QVElPTlNfT05fQ01ETElORSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFBST0JFX1NNQUxMX0NIRUNLX0FMUkVBRFlfTE9BREVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lOU01PRCBpcyBub3Qgc2V0CisjIENPTkZJR19STU1PRCBpcyBub3Qgc2V0CisjIENPTkZJR19MU01PRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xTTU9EX1BSRVRUWV8yXzZfT1VUUFVUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01PRFBST0JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EUFJPQkVfQkxBQ0tMSVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFUE1PRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1RSWV9NTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTlNNT0RfS1NZTU9PUFNfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lOU01PRF9MT0FESU5LTUVNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQX0ZVTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PRFVUSUxTX0FMSUFTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9EVVRJTFNfU1lNQk9MUyBpcyBub3Qgc2V0CitDT05GSUdfREVGQVVMVF9NT0RVTEVTX0RJUj0iIgorQ09ORklHX0RFRkFVTFRfREVQTU9EX0ZJTEU9IiIKKworIworIyBMaW51eCBTeXN0ZW0gVXRpbGl0aWVzCisjCisjIENPTkZJR19CTE9DS0RFViBpcyBub3Qgc2V0CitDT05GSUdfUkVWPXkKKyMgQ09ORklHX0FDUElEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQUNQSURfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS0lEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNRVNHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRE1FU0dfUFJFVFRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZCU0VUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfRkJTRVRfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GQlNFVF9SRUFETU9ERSBpcyBub3Qgc2V0CisjIENPTkZJR19GREZMVVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZERk9STUFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZESVNLIGlzIG5vdCBzZXQKK0NPTkZJR19GRElTS19TVVBQT1JUX0xBUkdFX0RJU0tTPXkKKyMgQ09ORklHX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9BSVhfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TR0lfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TVU5fTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9PU0ZfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9HUFRfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9GRElTS19BRFZBTkNFRCBpcyBub3Qgc2V0CisjIENPTkZJR19GSU5ERlMgaXMgbm90IHNldAorQ09ORklHX0ZMT0NLPXkKKyMgQ09ORklHX0ZSRUVSQU1ESVNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZTQ0tfTUlOSVggaXMgbm90IHNldAorIyBDT05GSUdfTUtGU19FWFQyIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LRlNfTUlOSVggaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NSU5JWDIgaXMgbm90IHNldAorIyBDT05GSUdfTUtGU19SRUlTRVIgaXMgbm90IHNldAorIyBDT05GSUdfTUtGU19WRkFUIGlzIG5vdCBzZXQKK0NPTkZJR19HRVRPUFQ9eQorQ09ORklHX0ZFQVRVUkVfR0VUT1BUX0xPTkc9eQorQ09ORklHX0hFWERVTVA9eQorIyBDT05GSUdfRkVBVFVSRV9IRVhEVU1QX1JFVkVSU0UgaXMgbm90IHNldAorQ09ORklHX0hEPXkKKyMgQ09ORklHX0hXQ0xPQ0sgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IV0NMT0NLX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0hXQ0xPQ0tfQURKVElNRV9GSFMgaXMgbm90IHNldAorIyBDT05GSUdfSVBDUk0gaXMgbm90IHNldAorIyBDT05GSUdfSVBDUyBpcyBub3Qgc2V0CisjIENPTkZJR19MT1NFVFVQIGlzIG5vdCBzZXQKK0NPTkZJR19MU1BDST15CitDT05GSUdfTFNVU0I9eQorIyBDT05GSUdfTURFViBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfQ09ORiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01ERVZfUkVOQU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9SRU5BTUVfUkVHRVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9FWEVDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTURFVl9MT0FEX0ZJUk1XQVJFIGlzIG5vdCBzZXQKKyMgQ09ORklHX01LU1dBUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01LU1dBUF9VVUlEIGlzIG5vdCBzZXQKK0NPTkZJR19NT1JFPXkKKyMgQ09ORklHX01PVU5UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkFLRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01PVU5UX1ZFUkJPU0UgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9IRUxQRVJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTEFCRUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9ORlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9DSUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfRkxBR1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9GU1RBQiBpcyBub3Qgc2V0CisjIENPTkZJR19QSVZPVF9ST09UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JEQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JERVYgaXMgbm90IHNldAorQ09ORklHX1JFQURQUk9GSUxFPXkKKyMgQ09ORklHX1JUQ1dBS0UgaXMgbm90IHNldAorIyBDT05GSUdfU0NSSVBUIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1JJUFRSRVBMQVk9eQorIyBDT05GSUdfU0VUQVJDSCBpcyBub3Qgc2V0CisjIENPTkZJR19TV0FQT05PRkYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TV0FQT05fUFJJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NXSVRDSF9ST09UIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VNT1VOVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VNT1VOVF9BTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NT1VOVF9MT09QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTU9VTlRfTE9PUF9DUkVBVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NVEFCX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfVk9MVU1FSUQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9FWFQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9CVFJGUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1JFSVNFUkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfRkFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfWEZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTlRGUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0lTTzk2NjAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9VREYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MVUtTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTElOVVhTV0FQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfQ1JBTUZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfUk9NRlMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9TWVNWIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfT0NGUzIgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFJBSUQgaXMgbm90IHNldAorCisjCisjIE1pc2NlbGxhbmVvdXMgVXRpbGl0aWVzCisjCisjIENPTkZJR19DT05TUFkgaXMgbm90IHNldAorIyBDT05GSUdfTkFORFdSSVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05BTkREVU1QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1VCSUFUVEFDSCBpcyBub3Qgc2V0CisjIENPTkZJR19VQklERVRBQ0ggaXMgbm90IHNldAorIyBDT05GSUdfQURKVElNRVggaXMgbm90IHNldAorIyBDT05GSUdfQkJDT05GSUcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DT01QUkVTU19CQkNPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19CRUVQIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0JFRVBfRlJFUT0wCitDT05GSUdfRkVBVFVSRV9CRUVQX0xFTkdUSF9NUz0wCisjIENPTkZJR19DSEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9OT0ZBSUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX1RUWV9ISUZJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9JTVBMSUNJVF9DUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQVRfU1dBTExPV19PUFRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQ0hBVF9TRU5EX0VTQ0FQRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX1ZBUl9BQk9SVF9MRU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DSEFUX0NMUl9BQk9SVCBpcyBub3Qgc2V0CitDT05GSUdfQ0hSVD15CisjIENPTkZJR19DUk9ORCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NST05EX0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0NST05EX0RJUj0iL3Zhci9zcG9vbC9jcm9uIgorQ09ORklHX0NST05UQUI9eQorQ09ORklHX0RDPXkKK0NPTkZJR19GRUFUVVJFX0RDX0xJQk09eQorIyBDT05GSUdfREVWRlNEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRF9NT0RMT0FEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVkZTRF9GR19OUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVZGU0RfVkVSQk9TRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0RFVkZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RFVk1FTSBpcyBub3Qgc2V0CisjIENPTkZJR19FSkVDVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0VKRUNUX1NDU0kgaXMgbm90IHNldAorIyBDT05GSUdfRkJTUExBU0ggaXMgbm90IHNldAorIyBDT05GSUdfRkxBU0hDUCBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9MT0NLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZMQVNIX1VOTE9DSyBpcyBub3Qgc2V0CisjIENPTkZJR19GTEFTSF9FUkFTRUFMTCBpcyBub3Qgc2V0CisjIENPTkZJR19JT05JQ0UgaXMgbm90IHNldAorIyBDT05GSUdfSU5PVElGWUQgaXMgbm90IHNldAorIyBDT05GSUdfTEFTVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0xBU1RfU01BTEwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9MQVNUX0ZBTkNZIGlzIG5vdCBzZXQKK0NPTkZJR19MRVNTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfTUFYTElORVM9OTk5OTk5OQorQ09ORklHX0ZFQVRVUkVfTEVTU19CUkFDS0VUUz15CitDT05GSUdfRkVBVFVSRV9MRVNTX0ZMQUdTPXkKK0NPTkZJR19GRUFUVVJFX0xFU1NfTUFSS1M9eQorQ09ORklHX0ZFQVRVUkVfTEVTU19SRUdFWFA9eQorIyBDT05GSUdfRkVBVFVSRV9MRVNTX1dJTkNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEVTU19EQVNIQ01EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTEVTU19MSU5FTlVNUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRFBBUk0gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fU0NBTl9IV0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fVU5SRUdJU1RFUl9IV0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fRFJJVkVfUkVTRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9IRFBBUk1fSERJT19UUklTVEFURV9IV0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSERQQVJNX0hESU9fR0VUU0VUX0RNQSBpcyBub3Qgc2V0CisjIENPTkZJR19NQUtFREVWUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX01BS0VERVZTX0xFQUYgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9NQUtFREVWU19UQUJMRSBpcyBub3Qgc2V0CisjIENPTkZJR19NQU4gaXMgbm90IHNldAorQ09ORklHX01JQ1JPQ09NPXkKKyMgQ09ORklHX01PVU5UUE9JTlQgaXMgbm90IHNldAorIyBDT05GSUdfTVQgaXMgbm90IHNldAorIyBDT05GSUdfUkFJREFVVE9SVU4gaXMgbm90IHNldAorIyBDT05GSUdfUkVBREFIRUFEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JGS0lMTCBpcyBub3Qgc2V0CisjIENPTkZJR19SVU5MRVZFTCBpcyBub3Qgc2V0CisjIENPTkZJR19SWCBpcyBub3Qgc2V0CitDT05GSUdfU0VUU0lEPXkKK0NPTkZJR19TVFJJTkdTPXkKKyMgQ09ORklHX1RBU0tTRVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UQVNLU0VUX0ZBTkNZIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RJTUUgaXMgbm90IHNldAorQ09ORklHX1RJTUVPVVQ9eQorQ09ORklHX1RUWVNJWkU9eQorQ09ORklHX1ZPTE5BTUU9eQorIyBDT05GSUdfV0FMTCBpcyBub3Qgc2V0CisjIENPTkZJR19XQVRDSERPRyBpcyBub3Qgc2V0CisKKyMKKyMgTmV0d29ya2luZyBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX05CRENMSUVOVCBpcyBub3Qgc2V0CitDT05GSUdfTkM9eQorIyBDT05GSUdfTkNfU0VSVkVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DX0VYVFJBIGlzIG5vdCBzZXQKKyMgQ09ORklHX05DXzExMF9DT01QQVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUFY2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVU5JWF9MT0NBTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BSRUZFUl9JUFY0X0FERFJFU1MgaXMgbm90IHNldAorIyBDT05GSUdfVkVSQk9TRV9SRVNPTFVUSU9OX0VSUk9SUyBpcyBub3Qgc2V0CisjIENPTkZJR19BUlAgaXMgbm90IHNldAorIyBDT05GSUdfQVJQSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JSQ1RMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQlJDVExfRkFOQ1kgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9CUkNUTF9TSE9XIGlzIG5vdCBzZXQKK0NPTkZJR19ETlNEPXkKKyMgQ09ORklHX0VUSEVSX1dBS0UgaXMgbm90IHNldAorQ09ORklHX0ZBS0VJREVOVEQ9eQorQ09ORklHX0ZUUEQ9eQorQ09ORklHX0ZFQVRVUkVfRlRQX1dSSVRFPXkKK0NPTkZJR19GRUFUVVJFX0ZUUERfQUNDRVBUX0JST0tFTl9MSVNUPXkKK0NPTkZJR19GVFBHRVQ9eQorQ09ORklHX0ZUUFBVVD15CitDT05GSUdfRkVBVFVSRV9GVFBHRVRQVVRfTE9OR19PUFRJT05TPXkKK0NPTkZJR19IT1NUTkFNRT15CitDT05GSUdfSFRUUEQ9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfUkFOR0VTPXkKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfVVNFX1NFTkRGSUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSFRUUERfU0VUVUlEIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEg9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfQVVUSF9NRDU9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfQ0dJPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX0NPTkZJR19XSVRIX1NDUklQVF9JTlRFUlBSPXkKK0NPTkZJR19GRUFUVVJFX0hUVFBEX1NFVF9SRU1PVEVfUE9SVF9UT19FTlY9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfRU5DT0RFX1VSTF9TVFI9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfRVJST1JfUEFHRVM9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfUFJPWFk9eQorQ09ORklHX0ZFQVRVUkVfSFRUUERfR1pJUD15CisjIENPTkZJR19JRkNPTkZJRyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGQ09ORklHX1NUQVRVUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19NRU1TVEFSVF9JT0FERFJfSVJRIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZDT05GSUdfSFcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRkNPTkZJR19CUk9BRENBU1RfUExVUyBpcyBub3Qgc2V0CisjIENPTkZJR19JRkVOU0xBVkUgaXMgbm90IHNldAorIyBDT05GSUdfSUZQTFVHRCBpcyBub3Qgc2V0CisjIENPTkZJR19JRlVQRE9XTiBpcyBub3Qgc2V0CitDT05GSUdfSUZVUERPV05fSUZTVEFURV9QQVRIPSIiCisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBfQlVJTFRJTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX0lGQ09ORklHX0JVSUxUSU4gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9JUFY0IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSUZVUERPV05fSVBWNiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lGVVBET1dOX01BUFBJTkcgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JRlVQRE9XTl9FWFRFUk5BTF9ESENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lORVREIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0VDSE8gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRElTQ0FSRCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9USU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RBWVRJTUUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fQ0hBUkdFTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lORVREX1JQQyBpcyBub3Qgc2V0CisjIENPTkZJR19JUCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0lQX0FERFJFU1MgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9MSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9UVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9SVUxFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfSVBfU0hPUlRfRk9STVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9JUF9SQVJFX1BST1RPQ09MUyBpcyBub3Qgc2V0CisjIENPTkZJR19JUEFERFIgaXMgbm90IHNldAorIyBDT05GSUdfSVBMSU5LIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lQUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfSVBUVU5ORUwgaXMgbm90IHNldAorIyBDT05GSUdfSVBSVUxFIGlzIG5vdCBzZXQKK0NPTkZJR19JUENBTEM9eQorQ09ORklHX0ZFQVRVUkVfSVBDQUxDX0ZBTkNZPXkKK0NPTkZJR19GRUFUVVJFX0lQQ0FMQ19MT05HX09QVElPTlM9eQorIyBDT05GSUdfTkFNRUlGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVFNUQVQgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ORVRTVEFUX1dJREUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9ORVRTVEFUX1BSRyBpcyBub3Qgc2V0CisjIENPTkZJR19OU0xPT0tVUCBpcyBub3Qgc2V0CisjIENPTkZJR19OVFBEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfTlRQRF9TRVJWRVIgaXMgbm90IHNldAorIyBDT05GSUdfUElORyBpcyBub3Qgc2V0CisjIENPTkZJR19QSU5HNiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0ZBTkNZX1BJTkcgaXMgbm90IHNldAorQ09ORklHX1BTQ0FOPXkKKyMgQ09ORklHX1JPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NMQVRUQUNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RDUFNWRCBpcyBub3Qgc2V0CitDT05GSUdfVEVMTkVUPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVF9UVFlQRT15CitDT05GSUdfRkVBVFVSRV9URUxORVRfQVVUT0xPR0lOPXkKK0NPTkZJR19URUxORVREPXkKK0NPTkZJR19GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORT15CitDT05GSUdfRkVBVFVSRV9URUxORVREX0lORVREX1dBSVQ9eQorQ09ORklHX1RGVFA9eQorQ09ORklHX1RGVFBEPXkKKworIworIyBDb21tb24gb3B0aW9ucyBmb3IgdGZ0cC90ZnRwZAorIworQ09ORklHX0ZFQVRVUkVfVEZUUF9HRVQ9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9QVVQ9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkU9eQorQ09ORklHX0ZFQVRVUkVfVEZUUF9QUk9HUkVTU19CQVI9eQorIyBDT05GSUdfVEZUUF9ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19UUkFDRVJPVVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RSQUNFUk9VVEU2IGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UUkFDRVJPVVRFX1VTRV9JQ01QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1RVTkNUTCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RVTkNUTF9VRyBpcyBub3Qgc2V0CisjIENPTkZJR19VREhDUEQgaXMgbm90IHNldAorIyBDT05GSUdfREhDUFJFTEFZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RVTVBMRUFTRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9VREhDUERfV1JJVEVfTEVBU0VTX0VBUkxZIGlzIG5vdCBzZXQKK0NPTkZJR19ESENQRF9MRUFTRVNfRklMRT0iIgorIyBDT05GSUdfVURIQ1BDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BDX0FSUElORyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1VESENQX1BPUlQgaXMgbm90IHNldAorQ09ORklHX1VESENQX0RFQlVHPTAKKyMgQ09ORklHX0ZFQVRVUkVfVURIQ1BfUkZDMzM5NyBpcyBub3Qgc2V0CitDT05GSUdfVURIQ1BDX0RFRkFVTFRfU0NSSVBUPSIiCitDT05GSUdfVURIQ1BDX1NMQUNLX0ZPUl9CVUdHWV9TRVJWRVJTPTAKK0NPTkZJR19JRlVQRE9XTl9VREhDUENfQ01EX09QVElPTlM9IiIKKyMgQ09ORklHX1VEUFNWRCBpcyBub3Qgc2V0CisjIENPTkZJR19WQ09ORklHIGlzIG5vdCBzZXQKK0NPTkZJR19XR0VUPXkKK0NPTkZJR19GRUFUVVJFX1dHRVRfU1RBVFVTQkFSPXkKK0NPTkZJR19GRUFUVVJFX1dHRVRfQVVUSEVOVElDQVRJT049eQorQ09ORklHX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlM9eQorQ09ORklHX0ZFQVRVUkVfV0dFVF9USU1FT1VUPXkKKyMgQ09ORklHX1pDSVAgaXMgbm90IHNldAorCisjCisjIFByaW50IFV0aWxpdGllcworIworIyBDT05GSUdfTFBEIGlzIG5vdCBzZXQKK0NPTkZJR19MUFI9eQorQ09ORklHX0xQUT15CisKKyMKKyMgTWFpbCBVdGlsaXRpZXMKKyMKKyMgQ09ORklHX01BS0VNSU1FIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX01JTUVfQ0hBUlNFVD0iIgorIyBDT05GSUdfUE9QTUFJTERJUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BPUE1BSUxESVJfREVMSVZFUlkgaXMgbm90IHNldAorIyBDT05GSUdfUkVGT1JNSU1FIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfUkVGT1JNSU1FX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5ETUFJTCBpcyBub3Qgc2V0CisKKyMKKyMgUHJvY2VzcyBVdGlsaXRpZXMKKyMKK0NPTkZJR19JT1NUQVQ9eQorQ09ORklHX01QU1RBVD15CitDT05GSUdfUE1BUD15CitDT05GSUdfUE9XRVJUT1A9eQorQ09ORklHX1NNRU1DQVA9eQorIyBDT05GSUdfRlJFRSBpcyBub3Qgc2V0CisjIENPTkZJR19GVVNFUiBpcyBub3Qgc2V0CitDT05GSUdfS0lMTD15CitDT05GSUdfS0lMTEFMTD15CitDT05GSUdfS0lMTEFMTDU9eQorIyBDT05GSUdfTk1FVEVSIGlzIG5vdCBzZXQKK0NPTkZJR19QR1JFUD15CisjIENPTkZJR19QSURPRiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BJRE9GX1NJTkdMRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BJRE9GX09NSVQgaXMgbm90IHNldAorQ09ORklHX1BLSUxMPXkKK0NPTkZJR19QUz15CitDT05GSUdfRkVBVFVSRV9QU19XSURFPXkKKyMgQ09ORklHX0ZFQVRVUkVfUFNfVElNRSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BTX0FERElUSU9OQUxfQ09MVU1OUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1BTX1VOVVNVQUxfU1lTVEVNUyBpcyBub3Qgc2V0CitDT05GSUdfUkVOSUNFPXkKK0NPTkZJR19CQl9TWVNDVEw9eQorIyBDT05GSUdfVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfVE9QX0NQVV9HTE9CQUxfUEVSQ0VOVFMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9UT1BfU01QX0NQVSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUF9ERUNJTUFMUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUyBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1RPUE1FTSBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TSE9XX1RIUkVBRFM9eQorIyBDT05GSUdfVVBUSU1FIGlzIG5vdCBzZXQKK0NPTkZJR19XQVRDSD15CisKKyMKKyMgUnVuaXQgVXRpbGl0aWVzCisjCisjIENPTkZJR19SVU5TViBpcyBub3Qgc2V0CisjIENPTkZJR19SVU5TVkRJUiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1JVTlNWRElSX0xPRyBpcyBub3Qgc2V0CisjIENPTkZJR19TViBpcyBub3Qgc2V0CitDT05GSUdfU1ZfREVGQVVMVF9TRVJWSUNFX0RJUj0iIgorIyBDT05GSUdfU1ZMT0dEIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUFNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVFVJREdJRCBpcyBub3Qgc2V0CisjIENPTkZJR19FTlZVSURHSUQgaXMgbm90IHNldAorIyBDT05GSUdfRU5WRElSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NPRlRMSU1JVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSENPTiBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRVRFTkZPUkNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dFVFNFQk9PTCBpcyBub3Qgc2V0CisjIENPTkZJR19MT0FEX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19NQVRDSFBBVEhDT04gaXMgbm90IHNldAorIyBDT05GSUdfUkVTVE9SRUNPTiBpcyBub3Qgc2V0CisjIENPTkZJR19SVU5DT04gaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9SVU5DT05fTE9OR19PUFRJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTElOVVhFTkFCTEVEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFVEVORk9SQ0UgaXMgbm90IHNldAorIyBDT05GSUdfU0VURklMRVMgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TRVRGSUxFU19DSEVDS19PUFRJT04gaXMgbm90IHNldAorIyBDT05GSUdfU0VUU0VCT09MIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFU1RBVFVTIGlzIG5vdCBzZXQKKworIworIyBTaGVsbHMKKyMKK0NPTkZJR19BU0g9eQorIyBDT05GSUdfQVNIX0JBU0hfQ09NUEFUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9KT0JfQ09OVFJPTCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQUxJQVMgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0dFVE9QVFMgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0JVSUxUSU5fRUNITyBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQlVJTFRJTl9QUklOVEYgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0JVSUxUSU5fVEVTVCBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfQ01EQ01EIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9NQUlMIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FTSF9PUFRJTUlaRV9GT1JfU0laRSBpcyBub3Qgc2V0CisjIENPTkZJR19BU0hfUkFORE9NX1NVUFBPUlQgaXMgbm90IHNldAorIyBDT05GSUdfQVNIX0VYUEFORF9QUk1UIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NUVFlIQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0ggaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9CQVNIX0NPTVBBVCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0JSQUNFX0VYUEFOU0lPTiBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0hFTFAgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9JTlRFUkFDVElWRSBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX1NBVkVISVNUT1JZIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfSk9CIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfVElDSyBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0lGIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfTE9PUFMgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9DQVNFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfRlVOQ1RJT05TIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfTE9DQUwgaXMgbm90IHNldAorIyBDT05GSUdfSFVTSF9SQU5ET01fU1VQUE9SVCBpcyBub3Qgc2V0CisjIENPTkZJR19IVVNIX0VYUE9SVF9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hVU0hfTU9ERV9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX01TSCBpcyBub3Qgc2V0CitDT05GSUdfRkVBVFVSRV9TSF9JU19BU0g9eQorIyBDT05GSUdfRkVBVFVSRV9TSF9JU19IVVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfU0hfSVNfTk9ORSBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX0JBU0hfSVNfQVNIIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZFQVRVUkVfQkFTSF9JU19IVVNIIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX0JBU0hfSVNfTk9ORT15CitDT05GSUdfU0hfTUFUSF9TVVBQT1JUPXkKK0NPTkZJR19TSF9NQVRIX1NVUFBPUlRfNjQ9eQorIyBDT05GSUdfRkVBVFVSRV9TSF9FWFRSQV9RVUlFVCBpcyBub3Qgc2V0CisjIENPTkZJR19GRUFUVVJFX1NIX1NUQU5EQUxPTkUgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9TSF9OT0ZPUksgaXMgbm90IHNldAorCisjCisjIFN5c3RlbSBMb2dnaW5nIFV0aWxpdGllcworIworQ09ORklHX1NZU0xPR0Q9eQorQ09ORklHX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEU9eQorQ09ORklHX0ZFQVRVUkVfUkVNT1RFX0xPRz15CisjIENPTkZJR19GRUFUVVJFX1NZU0xPR0RfRFVQIGlzIG5vdCBzZXQKK0NPTkZJR19GRUFUVVJFX1NZU0xPR0RfUkVBRF9CVUZGRVJfU0laRT0yNTYKK0NPTkZJR19GRUFUVVJFX0lQQ19TWVNMT0c9eQorQ09ORklHX0ZFQVRVUkVfSVBDX1NZU0xPR19CVUZGRVJfU0laRT0xNgorQ09ORklHX0xPR1JFQUQ9eQorQ09ORklHX0ZFQVRVUkVfTE9HUkVBRF9SRURVQ0VEX0xPQ0tJTkc9eQorIyBDT05GSUdfS0xPR0QgaXMgbm90IHNldAorIyBDT05GSUdfRkVBVFVSRV9LTE9HRF9LTE9HQ1RMIGlzIG5vdCBzZXQKK0NPTkZJR19MT0dHRVI9eQpkaWZmIC0tZ2l0IGEvY29uc29sZS10b29scy9Db25maWcuc3JjIGIvY29uc29sZS10b29scy9Db25maWcuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2NTcwNDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb25zb2xlLXRvb2xzL0NvbmZpZy5zcmMKQEAgLTAsMCArMSwxNzYgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIkNvbnNvbGUgVXRpbGl0aWVzIgorCitJTlNFUlQKKworY29uZmlnIENIVlQKKwlib29sICJjaHZ0IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSBpcyB1c2VkIHRvIGNoYW5nZSB0byBhbm90aGVyIHRlcm1pbmFsLgorCSAgRXhhbXBsZTogY2h2dCA0IChjaGFuZ2UgdG8gdGVybWluYWwgL2Rldi90dHk0KQorCitjb25maWcgRkdDT05TT0xFCisJYm9vbCAiZmdjb25zb2xlIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSBwcmludHMgYWN0aXZlIChmb3JlZ3JvdW5kKSBjb25zb2xlIG51bWJlci4KKworY29uZmlnIENMRUFSCisJYm9vbCAiY2xlYXIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBwcm9ncmFtIGNsZWFycyB0aGUgdGVybWluYWwgc2NyZWVuLgorCitjb25maWcgREVBTExPQ1ZUCisJYm9vbCAiZGVhbGxvY3Z0IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSBkZWFsbG9jYXRlcyB1bnVzZWQgdmlydHVhbCBjb25zb2xlcy4KKworY29uZmlnIERVTVBLTUFQCisJYm9vbCAiZHVtcGttYXAiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhpcyBwcm9ncmFtIGR1bXBzIHRoZSBrZXJuZWwncyBrZXlib2FyZCB0cmFuc2xhdGlvbiB0YWJsZSB0bworCSAgc3Rkb3V0LCBpbiBiaW5hcnkgZm9ybWF0LiBZb3UgY2FuIHRoZW4gdXNlIGxvYWRrbWFwIHRvIGxvYWQgaXQuCisKK2NvbmZpZyBLQkRfTU9ERQorCWJvb2wgImtiZF9tb2RlIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSByZXBvcnRzIGFuZCBzZXRzIGtleWJvYXJkIG1vZGUuCisKK2NvbmZpZyBMT0FERk9OVAorCWJvb2wgImxvYWRmb250IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSBsb2FkcyBhIGNvbnNvbGUgZm9udCBmcm9tIHN0YW5kYXJkIGlucHV0LgorCitjb25maWcgTE9BREtNQVAKKwlib29sICJsb2Fka21hcCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIHByb2dyYW0gbG9hZHMgYSBrZXlib2FyZCB0cmFuc2xhdGlvbiB0YWJsZSBmcm9tCisJICBzdGFuZGFyZCBpbnB1dC4KKworY29uZmlnIE9QRU5WVAorCWJvb2wgIm9wZW52dCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGlzIHByb2dyYW0gaXMgdXNlZCB0byBzdGFydCBhIGNvbW1hbmQgb24gYW4gdW51c2VkCisJICB2aXJ0dWFsIHRlcm1pbmFsLgorCitjb25maWcgUkVTRVQKKwlib29sICJyZXNldCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIHByb2dyYW0gaXMgdXNlZCB0byByZXNldCB0aGUgdGVybWluYWwgc2NyZWVuLCBpZiBpdAorCSAgZ2V0cyBtZXNzZWQgdXAuCisKK2NvbmZpZyBSRVNJWkUKKwlib29sICJyZXNpemUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBwcm9ncmFtIGlzIHVzZWQgdG8gKHJlKXNldCB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB5b3VyIGN1cnJlbnQKKwkgIHRlcm1pbmFsLgorCitjb25maWcgRkVBVFVSRV9SRVNJWkVfUFJJTlQKKwlib29sICJQcmludCBlbnZpcm9ubWVudCB2YXJpYWJsZXMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBSRVNJWkUKKwloZWxwCisJICBQcmludHMgdGhlIG5ld2x5IHNldCBzaXplIChudW1iZXIgb2YgY29sdW1ucyBhbmQgcm93cykgb2YKKwkgIHRoZSB0ZXJtaW5hbC4KKwkgIEUuZy46CisJICBDT0xVTU5TPTgwO0xJTkVTPTQ0O2V4cG9ydCBDT0xVTU5TIExJTkVTOworCitjb25maWcgU0VUQ09OU09MRQorCWJvb2wgInNldGNvbnNvbGUiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhpcyBwcm9ncmFtIHJlZGlyZWN0cyB0aGUgc3lzdGVtIGNvbnNvbGUgdG8gYW5vdGhlciBkZXZpY2UsCisJICBsaWtlIHRoZSBjdXJyZW50IHR0eSB3aGlsZSBsb2dnZWQgaW4gdmlhIHRlbG5ldC4KKworY29uZmlnIEZFQVRVUkVfU0VUQ09OU09MRV9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU0VUQ09OU09MRSAmJiBMT05HX09QVFMKKwloZWxwCisJICBTdXBwb3J0IGxvbmcgb3B0aW9ucyBmb3IgdGhlIHNldGNvbnNvbGUgYXBwbGV0LgorCitjb25maWcgU0VURk9OVAorCWJvb2wgInNldGZvbnQiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgQWxsb3dzIHRvIGxvYWQgY29uc29sZSBzY3JlZW4gbWFwLiBVc2VmdWwgZm9yIGkxOG4uCisKK2NvbmZpZyBGRUFUVVJFX1NFVEZPTlRfVEVYVFVBTF9NQVAKKwlib29sICJTdXBwb3J0IHJlYWRpbmcgdGV4dHVhbCBzY3JlZW4gbWFwcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNFVEZPTlQKKwloZWxwCisJICBTdXBwb3J0IHJlYWRpbmcgdGV4dHVhbCBzY3JlZW4gbWFwcy4KKworY29uZmlnIERFRkFVTFRfU0VURk9OVF9ESVIKKwlzdHJpbmcgIkRlZmF1bHQgZGlyZWN0b3J5IGZvciBjb25zb2xlLXRvb2xzIGZpbGVzIgorCWRlZmF1bHQgIiIKKwlkZXBlbmRzIG9uIFNFVEZPTlQKKwloZWxwCisJICBEaXJlY3RvcnkgdG8gdXNlIGlmIHNldGZvbnQncyBwYXJhbXMgYXJlIHNpbXBsZSBmaWxlbmFtZXMKKwkgIChub3QgL3BhdGgvdG8vZmlsZSBvciAuL2ZpbGUpLiBEZWZhdWx0IGlzICIiIChubyBkZWZhdWx0IGRpcmVjdG9yeSkuCisKK2NvbmZpZyBTRVRLRVlDT0RFUworCWJvb2wgInNldGtleWNvZGVzIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgcHJvZ3JhbSBsb2FkcyBlbnRyaWVzIGludG8gdGhlIGtlcm5lbCdzIHNjYW5jb2RlLXRvLWtleWNvZGUKKwkgIG1hcCwgYWxsb3dpbmcgdW51c3VhbCBrZXlib2FyZHMgdG8gZ2VuZXJhdGUgdXNhYmxlIGtleWNvZGVzLgorCitjb25maWcgU0VUTE9HQ09OUworCWJvb2wgInNldGxvZ2NvbnMiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhpcyBwcm9ncmFtIHJlZGlyZWN0cyB0aGUgb3V0cHV0IGNvbnNvbGUgb2Yga2VybmVsIG1lc3NhZ2VzLgorCitjb25maWcgU0hPV0tFWQorCWJvb2wgInNob3drZXkiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgU2hvd3Mga2V5cyBwcmVzc2VkLgorCitjb21tZW50ICJDb21tb24gb3B0aW9ucyBmb3IgbG9hZGZvbnQgYW5kIHNldGZvbnQiCisJZGVwZW5kcyBvbiBMT0FERk9OVCB8fCBTRVRGT05UCisKK2NvbmZpZyBGRUFUVVJFX0xPQURGT05UX1BTRjIKKwlib29sICJTdXBwb3J0IGZvciBQU0YyIGNvbnNvbGUgZm9udHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBMT0FERk9OVCB8fCBTRVRGT05UCisJaGVscAorCSAgU3VwcG9ydCBQU0YyIGNvbnNvbGUgZm9udHMuCisKK2NvbmZpZyBGRUFUVVJFX0xPQURGT05UX1JBVworCWJvb2wgIlN1cHBvcnQgZm9yIG9sZCAocmF3KSBjb25zb2xlIGZvbnRzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTE9BREZPTlQgfHwgU0VURk9OVAorCWhlbHAKKwkgIFN1cHBvcnQgb2xkIChyYXcpIGNvbnNvbGUgZm9udHMuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL2NvbnNvbGUtdG9vbHMvS2J1aWxkLnNyYyBiL2NvbnNvbGUtdG9vbHMvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGRlOWFkCi0tLSAvZGV2L251bGwKKysrIGIvY29uc29sZS10b29scy9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsMjUgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitsaWIteTo9CisKK0lOU0VSVAorbGliLSQoQ09ORklHX0NIVlQpCQkrPSBjaHZ0Lm8KK2xpYi0kKENPTkZJR19GR0NPTlNPTEUpCQkrPSBmZ2NvbnNvbGUubworbGliLSQoQ09ORklHX0NMRUFSKQkJKz0gY2xlYXIubworbGliLSQoQ09ORklHX0RFQUxMT0NWVCkJCSs9IGRlYWxsb2N2dC5vCitsaWItJChDT05GSUdfRFVNUEtNQVApCQkrPSBkdW1wa21hcC5vCitsaWItJChDT05GSUdfU0VUQ09OU09MRSkJKz0gc2V0Y29uc29sZS5vCitsaWItJChDT05GSUdfS0JEX01PREUpCQkrPSBrYmRfbW9kZS5vCitsaWItJChDT05GSUdfTE9BREZPTlQpCQkrPSBsb2FkZm9udC5vCitsaWItJChDT05GSUdfTE9BREtNQVApCQkrPSBsb2Fka21hcC5vCitsaWItJChDT05GSUdfT1BFTlZUKQkJKz0gb3BlbnZ0Lm8KK2xpYi0kKENPTkZJR19SRVNFVCkJCSs9IHJlc2V0Lm8KK2xpYi0kKENPTkZJR19SRVNJWkUpCQkrPSByZXNpemUubworbGliLSQoQ09ORklHX1NFVEZPTlQpCQkrPSBsb2FkZm9udC5vCitsaWItJChDT05GSUdfU0VUS0VZQ09ERVMpCSs9IHNldGtleWNvZGVzLm8KK2xpYi0kKENPTkZJR19TRVRMT0dDT05TKQkrPSBzZXRsb2djb25zLm8KK2xpYi0kKENPTkZJR19TSE9XS0VZKQkJKz0gc2hvd2tleS5vCmRpZmYgLS1naXQgYS9jb25zb2xlLXRvb2xzL2NodnQuYyBiL2NvbnNvbGUtdG9vbHMvY2h2dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5Yzk3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb25zb2xlLXRvb2xzL2NodnQuYwpAQCAtMCwwICsxLDIzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGNodnQgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgY2h2dF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiTiIKKy8vdXNhZ2U6I2RlZmluZSBjaHZ0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ2hhbmdlIHRoZSBmb3JlZ3JvdW5kIHZpcnR1YWwgdGVybWluYWwgdG8gL2Rldi90dHlOIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IGNodnRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGNodnRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBudW0gPSB4YXRvdV9yYW5nZShzaW5nbGVfYXJndihhcmd2KSwgMSwgNjMpOworCWNvbnNvbGVfbWFrZV9hY3RpdmUoZ2V0X2NvbnNvbGVfZmRfb3JfZGllKCksIG51bSk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2NvbnNvbGUtdG9vbHMvY2xlYXIuYyBiL2NvbnNvbGUtdG9vbHMvY2xlYXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzIyYjc4Ci0tLSAvZGV2L251bGwKKysrIGIvY29uc29sZS10b29scy9jbGVhci5jCkBAIC0wLDAgKzEsMjIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgY2xlYXIgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgY2xlYXJfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIiIKKy8vdXNhZ2U6I2RlZmluZSBjbGVhcl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNsZWFyIHNjcmVlbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBjbGVhcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY2xlYXJfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwkvKiBob21lOyBjbGVhciB0byB0aGUgZW5kIG9mIHNjcmVlbiAqLworCXJldHVybiBmdWxsX3dyaXRlMV9zdHIoIlwwMzNbSCIiXDAzM1tKIikgIT0gNjsKK30KZGlmZiAtLWdpdCBhL2NvbnNvbGUtdG9vbHMvZGVhbGxvY3Z0LmMgYi9jb25zb2xlLXRvb2xzL2RlYWxsb2N2dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMzFjMGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb25zb2xlLXRvb2xzL2RlYWxsb2N2dC5jCkBAIC0wLDAgKzEsMzggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIERpc2FsbG9jYXRlIHZpcnR1YWwgdGVybWluYWwocykKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgYnkgVGl0byBSYWd1c2EgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogbm8gb3B0aW9ucywgbm8gZ2V0b3B0ICovCisKKy8vdXNhZ2U6I2RlZmluZSBkZWFsbG9jdnRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltOXSIKKy8vdXNhZ2U6I2RlZmluZSBkZWFsbG9jdnRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEZWFsbG9jYXRlIHVudXNlZCB2aXJ0dWFsIHRlcm1pbmFsIC9kZXYvdHR5TiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIEZyb20gPGxpbnV4L3Z0Lmg+ICovCitlbnVtIHsgVlRfRElTQUxMT0NBVEUgPSAweDU2MDggfTsgLyogZnJlZSBtZW1vcnkgYXNzb2NpYXRlZCB0byB2dCAqLworCitpbnQgZGVhbGxvY3Z0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBkZWFsbG9jdnRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCS8qIG51bSA9IDAgZGVhbGxvY2F0ZSBhbGwgdW51c2VkIGNvbnNvbGVzICovCisJaW50IG51bSA9IDA7CisKKwlpZiAoYXJndlsxXSkgeworCQlpZiAoYXJndlsyXSkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJbnVtID0geGF0b3VfcmFuZ2UoYXJndlsxXSwgMSwgNjMpOworCX0KKworCS8qIGRvdWJsZSBjYXN0IHN1cHByZXNzZXMgImNhc3QgdG8gcHRyIGZyb20gaW50IG9mIGRpZmZlcmVudCBzaXplIiAqLworCXhpb2N0bChnZXRfY29uc29sZV9mZF9vcl9kaWUoKSwgVlRfRElTQUxMT0NBVEUsICh2b2lkICopKHB0cmRpZmZfdCludW0pOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb25zb2xlLXRvb2xzL2R1bXBrbWFwLmMgYi9jb25zb2xlLXRvb2xzL2R1bXBrbWFwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4ZDY5MAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnNvbGUtdG9vbHMvZHVtcGttYXAuYwpAQCAtMCwwICsxLDkxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGR1bXBrbWFwIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSBBcm5lIEJlcm5pbiA8YXJuZUBtYXRyaXgubG9vcGJhY2sub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICovCisvKiBubyBvcHRpb25zLCBubyBnZXRvcHQgKi8KKworLy91c2FnZTojZGVmaW5lIGR1bXBrbWFwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICI+IGtleW1hcCIKKy8vdXNhZ2U6I2RlZmluZSBkdW1wa21hcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IGEgYmluYXJ5IGtleWJvYXJkIHRyYW5zbGF0aW9uIHRhYmxlIHRvIHN0ZG91dCIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZHVtcGttYXBfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgZHVtcGttYXAgPiBrZXltYXBcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIEZyb20gPGxpbnV4L2tkLmg+ICovCitzdHJ1Y3Qga2JlbnRyeSB7CisJdW5zaWduZWQgY2hhciBrYl90YWJsZTsKKwl1bnNpZ25lZCBjaGFyIGtiX2luZGV4OworCXVuc2lnbmVkIHNob3J0IGtiX3ZhbHVlOworfTsKKyNkZWZpbmUgS0RHS0JFTlQgMHg0QjQ2ICAvKiBnZXRzIG9uZSBlbnRyeSBpbiB0cmFuc2xhdGlvbiB0YWJsZSAqLworCisvKiBGcm9tIDxsaW51eC9rZXlib2FyZC5oPiAqLworI2RlZmluZSBOUl9LRVlTIDEyOAorI2RlZmluZSBNQVhfTlJfS0VZTUFQUyAyNTYKKworaW50IGR1bXBrbWFwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBkdW1wa21hcF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGtiZW50cnkga2U7CisJaW50IGksIGosIGZkOworI2RlZmluZSBmbGFncyBiYl9jb21tb25fYnVmc2l6MQorCisJLyogV2hlbiB1c2VyIGFjY2lkZW50YWxseSBydW5zICJkdW1wa21hcCBGSUxFIgorCSAqIGluc3RlYWQgb2YgImR1bXBrbWFwID5GSUxFIiwgd2UnZCBkdW1wIGJpbmFyeSBzdHVmZiB0byB0dHkuCisJICogTGV0J3MgcHJldmVudCBpdDoKKwkgKi8KKwlpZiAoYXJndlsxXSkKKwkJYmJfc2hvd191c2FnZSgpOworLyoJYmJfd2Fybl9pZ25vcmluZ19hcmdzKGFyZ3ZbMV0pOyovCisKKwlmZCA9IGdldF9jb25zb2xlX2ZkX29yX2RpZSgpOworCisjaWYgMAorCXdyaXRlKFNURE9VVF9GSUxFTk8sICJia2V5bWFwIiwgNyk7CisJLyogSGVyZSB3ZSB3YW50IHRvIHNldCBldmVyeXRoaW5nIHRvIDAgZXhjZXB0IGZvciBpbmRleGVzOgorCSAqIFswLTJdIFs0LTZdIFs4LTEwXSBbMTJdCisJICovCisJLyptZW1zZXQoZmxhZ3MsIDB4MDAsIE1BWF9OUl9LRVlNQVBTKTsgLSBhbHJlYWR5IGlzICovCisJbWVtc2V0KGZsYWdzLCAweDAxLCAxMyk7CisJZmxhZ3NbM10gPSBmbGFnc1s3XSA9IGZsYWdzWzExXSA9IDA7CisJLyogZHVtcCBmbGFncyAqLworCXdyaXRlKFNURE9VVF9GSUxFTk8sIGZsYWdzLCBNQVhfTlJfS0VZTUFQUyk7CisjZGVmaW5lIGZsYWdzNyBmbGFncworI2Vsc2UKKwkvKiBTYW1lIGVmZmVjdCAqLworCS8qICAgICAgICAgICAgICAgICAgICAgMCAxIDIgMyA0IDUgNiA3IDggOSBhIGIgYz0xMiAqLworCW1lbWNweShmbGFncywgImJrZXltYXBcMVwxXDFcMFwxXDFcMVwwXDFcMVwxXDBcMSIsCisJLyogQ2FuIHVzZSBzaXplb2YsIG9yIHNpemVvZi0xLiBzaXplb2YgaXMgZXZlbiwgdXNpbmcgdGhhdCAqLworCS8qKioqLyBzaXplb2YoImJrZXltYXBcMVwxXDFcMFwxXDFcMVwwXDFcMVwxXDBcMSIpCisJKTsKKwl3cml0ZShTVERPVVRfRklMRU5PLCBmbGFncywgNyArIE1BWF9OUl9LRVlNQVBTKTsKKyNkZWZpbmUgZmxhZ3M3IChmbGFncyArIDcpCisjZW5kaWYKKworCWZvciAoaSA9IDA7IGkgPCAxMzsgaSsrKSB7CisJCWlmIChmbGFnczdbaV0pIHsKKwkJCWZvciAoaiA9IDA7IGogPCBOUl9LRVlTOyBqKyspIHsKKwkJCQlrZS5rYl9pbmRleCA9IGo7CisJCQkJa2Uua2JfdGFibGUgPSBpOworCQkJCWlmICghaW9jdGxfb3JfcGVycm9yKGZkLCBLREdLQkVOVCwgJmtlLAorCQkJCQkJImlvY3RsKEtER0tCRU5UeyVkLCVkfSkgZmFpbGVkIiwKKwkJCQkJCWosIGkpCisJCQkJKSB7CisJCQkJCXdyaXRlKFNURE9VVF9GSUxFTk8sICZrZS5rYl92YWx1ZSwgMik7CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQljbG9zZShmZCk7CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb25zb2xlLXRvb2xzL2ZnY29uc29sZS5jIGIvY29uc29sZS10b29scy9mZ2NvbnNvbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDM1NWJlCi0tLSAvZGV2L251bGwKKysrIGIvY29uc29sZS10b29scy9mZ2NvbnNvbGUuYwpAQCAtMCwwICsxLDM1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGZnY29uc29sZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBieSBHcmlnb3J5IEJhdGFsb3YgPGJnYUBhbHRsaW51eC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZmdjb25zb2xlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSIiCisvL3VzYWdlOiNkZWZpbmUgZmdjb25zb2xlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOgkiR2V0IGFjdGl2ZSBjb25zb2xlIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogRnJvbSA8bGludXgvdnQuaD4gKi8KK3N0cnVjdCB2dF9zdGF0IHsKKwl1bnNpZ25lZCBzaG9ydCB2X2FjdGl2ZTsgICAgICAgIC8qIGFjdGl2ZSB2dCAqLworCXVuc2lnbmVkIHNob3J0IHZfc2lnbmFsOyAgICAgICAgLyogc2lnbmFsIHRvIHNlbmQgKi8KKwl1bnNpZ25lZCBzaG9ydCB2X3N0YXRlOyAgICAgICAgIC8qIHZ0IGJpdG1hc2sgKi8KK307CitlbnVtIHsgVlRfR0VUU1RBVEUgPSAweDU2MDMgfTsgLyogZ2V0IGdsb2JhbCB2dCBzdGF0ZSBpbmZvICovCisKK2ludCBmZ2NvbnNvbGVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZnY29uc29sZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCB2dF9zdGF0IHZ0c3RhdDsKKworCXZ0c3RhdC52X2FjdGl2ZSA9IDA7CisJeGlvY3RsKGdldF9jb25zb2xlX2ZkX29yX2RpZSgpLCBWVF9HRVRTVEFURSwgJnZ0c3RhdCk7CisJcHJpbnRmKCIlZFxuIiwgdnRzdGF0LnZfYWN0aXZlKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb25zb2xlLXRvb2xzL2tiZF9tb2RlLmMgYi9jb25zb2xlLXRvb2xzL2tiZF9tb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM4NTM2NwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnNvbGUtdG9vbHMva2JkX21vZGUuYwpAQCAtMCwwICsxLDY2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGtiZF9tb2RlIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IExvaWMgR3JlbmllIDxsb2ljLmdyZW5pZUBnbWFpbC5jb20+CisgKiAgIHdyaXR0ZW4gdXNpbmcgQW5kcmllcyBCcm91d2VyIDxhZWJAY3dpLm5sPidzIGtiZF9tb2RlIGZyb20KKyAqICAgY29uc29sZS11dGlscyB2MC4yLjMsIGxpY2Vuc2VkIHVuZGVyIEdOVSBHUEx2MgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGtiZF9tb2RlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWF8a3xzfHVdIFstQyBUVFldIgorLy91c2FnZTojZGVmaW5lIGtiZF9tb2RlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVwb3J0IG9yIHNldCB0aGUga2V5Ym9hcmQgbW9kZVxuIgorLy91c2FnZTogICAgICJcbgktYQlEZWZhdWx0IChBU0NJSSkiCisvL3VzYWdlOiAgICAgIlxuCS1rCU1lZGl1bS1yYXcgKGtleWJvYXJkKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJUmF3IChzY2FuY29kZSkiCisvL3VzYWdlOiAgICAgIlxuCS11CVVuaWNvZGUgKHV0Zi04KSIKKy8vdXNhZ2U6ICAgICAiXG4JLUMgVFRZCUFmZmVjdCBUVFkgaW5zdGVhZCBvZiAvZGV2L3R0eSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bGludXgva2QuaD4KKworaW50IGtiZF9tb2RlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBrYmRfbW9kZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJZW51bSB7CisJCVNDQU5DT0RFICA9ICgxIDw8IDApLAorCQlBU0NJSSAgICAgPSAoMSA8PCAxKSwKKwkJTUVESVVNUkFXID0gKDEgPDwgMiksCisJCVVOSUNPREUgICA9ICgxIDw8IDMpLAorCX07CisJaW50IGZkOworCXVuc2lnbmVkIG9wdDsKKwljb25zdCBjaGFyICp0dHlfbmFtZSA9IENVUlJFTlRfVFRZOworCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgInNha3VDOiIsICZ0dHlfbmFtZSk7CisJZmQgPSB4b3Blbl9ub25ibG9ja2luZyh0dHlfbmFtZSk7CisJb3B0ICY9IDB4ZjsgLyogY2xlYXIgLUMgYml0LCBzZWUgKCopICovCisKKwlpZiAoIW9wdCkgeyAvKiBwcmludCBjdXJyZW50IHNldHRpbmcgKi8KKwkJY29uc3QgY2hhciAqbW9kZSA9ICJ1bmtub3duIjsKKwkJaW50IG07CisKKwkJeGlvY3RsKGZkLCBLREdLQk1PREUsICZtKTsKKwkJaWYgKG0gPT0gS19SQVcpCisJCQltb2RlID0gInJhdyAoc2NhbmNvZGUpIjsKKwkJZWxzZSBpZiAobSA9PSBLX1hMQVRFKQorCQkJbW9kZSA9ICJkZWZhdWx0IChBU0NJSSkiOworCQllbHNlIGlmIChtID09IEtfTUVESVVNUkFXKQorCQkJbW9kZSA9ICJtZWRpdW1yYXcgKGtleWNvZGUpIjsKKwkJZWxzZSBpZiAobSA9PSBLX1VOSUNPREUpCisJCQltb2RlID0gIlVuaWNvZGUgKFVURi04KSI7CisJCXByaW50ZigiVGhlIGtleWJvYXJkIGlzIGluICVzIG1vZGVcbiIsIG1vZGUpOworCX0gZWxzZSB7CisJCS8qIGhlcmUgd2UgZGVwZW5kIG9uIHNwZWNpZmljIGJpdHMgYXNzaWduZWQgdG8gb3B0aW9ucyAoKikgKi8KKwkJb3B0ID0gb3B0ICYgVU5JQ09ERSA/IDMgOiBvcHQgPj4gMTsKKwkJLyogZG91YmxlIGNhc3QgcHJldmVudHMgd2FybmluZ3MgYWJvdXQgd2lkZW5pbmcgY29udmVyc2lvbiAqLworCQl4aW9jdGwoZmQsIEtEU0tCTU9ERSwgKHZvaWQqKShwdHJkaWZmX3Qpb3B0KTsKKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsb3NlKGZkKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvY29uc29sZS10b29scy9sb2FkZm9udC5jIGIvY29uc29sZS10b29scy9sb2FkZm9udC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMjUwNmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb25zb2xlLXRvb2xzL2xvYWRmb250LmMKQEAgLTAsMCArMSw0OTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGxvYWRmb250LmMgLSBFdWdlbmUgQ3Jvc3NlciAmIEFuZHJpZXMgQnJvdXdlcgorICoKKyAqIFZlcnNpb24gMC45NmJiCisgKgorICogTG9hZHMgdGhlIGNvbnNvbGUgZm9udCwgYW5kIHBvc3NpYmx5IHRoZSBjb3JyZXNwb25kaW5nIHNjcmVlbiBtYXAocykuCisgKiAoQWRhcHRlZCBmb3IgYnVzeWJveCBieSBNYXRlaiBWZWxhLikKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBsb2FkZm9udF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiPCBmb250IgorLy91c2FnZTojZGVmaW5lIGxvYWRmb250X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTG9hZCBhIGNvbnNvbGUgZm9udCBmcm9tIHN0ZGluIgorLyogLy91c2FnZTogICAgICJcbgktQyBUVFkJQWZmZWN0IFRUWSBpbnN0ZWFkIG9mIC9kZXYvdHR5IiAqLworLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBsb2FkZm9udF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBsb2FkZm9udCA8IC9ldGMvaTE4bi9mb250bmFtZVxuIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBzZXRmb250X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJGT05UIFstbSBNQVBGSUxFXSBbLUMgVFRZXSIKKy8vdXNhZ2U6I2RlZmluZSBzZXRmb250X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTG9hZCBhIGNvbnNvbGUgZm9udFxuIgorLy91c2FnZTogICAgICJcbgktbSBNQVBGSUxFCUxvYWQgY29uc29sZSBzY3JlZW4gbWFwIgorLy91c2FnZTogICAgICJcbgktQyBUVFkJCUFmZmVjdCBUVFkgaW5zdGVhZCBvZiAvZGV2L3R0eSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgc2V0Zm9udF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBzZXRmb250IC1tIGtvaTgtciAvZXRjL2kxOG4vZm9udG5hbWVcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzL2tkLmg+CisKKyNpZm5kZWYgS0RGT05UT1AKKyMgZGVmaW5lIEtERk9OVE9QIDB4NEI3Mgorc3RydWN0IGNvbnNvbGVfZm9udF9vcCB7CisJdW5zaWduZWQgb3A7ICAgICAgICAgICAgLyogS0RfRk9OVF9PUF8qICovCisJdW5zaWduZWQgZmxhZ3M7ICAgICAgICAgLyogS0RfRk9OVF9GTEFHXyogKi8KKwl1bnNpZ25lZCB3aWR0aCwgaGVpZ2h0OworCXVuc2lnbmVkIGNoYXJjb3VudDsKKwl1bnNpZ25lZCBjaGFyICpkYXRhOyAgICAvKiBmb250IGRhdGEgd2l0aCBoZWlnaHQgZml4ZWQgdG8gMzIgKi8KK307CisjIGRlZmluZSBLRF9GT05UX09QX1NFVCAgICAgICAgICAwICAvKiBTZXQgZm9udCAqLworIyBkZWZpbmUgS0RfRk9OVF9PUF9HRVQgICAgICAgICAgMSAgLyogR2V0IGZvbnQgKi8KKyMgZGVmaW5lIEtEX0ZPTlRfT1BfU0VUX0RFRkFVTFQgIDIgIC8qIFNldCBmb250IHRvIGRlZmF1bHQsIGRhdGEgcG9pbnRzIHRvIG5hbWUgLyBOVUxMICovCisjIGRlZmluZSBLRF9GT05UX09QX0NPUFkgICAgICAgICAzICAvKiBDb3B5IGZyb20gYW5vdGhlciBjb25zb2xlICovCisjIGRlZmluZSBLRF9GT05UX0ZMQUdfT0xEICAgICAgICAweDgwMDAwMDAwIC8qIEludm9rZWQgdmlhIG9sZCBpbnRlcmZhY2UgKi8KKyMgZGVmaW5lIEtEX0ZPTlRfRkxBR19ET05UX1JFQ0FMQyAxIC8qIERvbid0IGNhbGwgYWRqdXN0X2hlaWdodCgpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIChVc2VkIGludGVybmFsbHkgZm9yIFBJT19GT05UIHN1cHBvcnQpICovCisjZW5kaWYgLyogS0RGT05UT1AgKi8KKworCitlbnVtIHsKKwlQU0YxX01BR0lDMCA9IDB4MzYsCisJUFNGMV9NQUdJQzEgPSAweDA0LAorCVBTRjFfTU9ERTUxMiA9IDB4MDEsCisJUFNGMV9NT0RFSEFTVEFCID0gMHgwMiwKKwlQU0YxX01PREVIQVNTRVEgPSAweDA0LAorCVBTRjFfTUFYTU9ERSA9IDB4MDUsCisJUFNGMV9TVEFSVFNFUSA9IDB4ZmZmZSwKKwlQU0YxX1NFUEFSQVRPUiA9IDB4ZmZmZiwKK307CisKK3N0cnVjdCBwc2YxX2hlYWRlciB7CisJdW5zaWduZWQgY2hhciBtYWdpY1syXTsgICAgICAgICAvKiBNYWdpYyBudW1iZXIgKi8KKwl1bnNpZ25lZCBjaGFyIG1vZGU7ICAgICAgICAgICAgIC8qIFBTRiBmb250IG1vZGUgKi8KKwl1bnNpZ25lZCBjaGFyIGNoYXJzaXplOyAgICAgICAgIC8qIENoYXJhY3RlciBzaXplICovCit9OworCisjZGVmaW5lIHBzZjFoKHgpICgoc3RydWN0IHBzZjFfaGVhZGVyKikoeCkpCisKKyNkZWZpbmUgUFNGMV9NQUdJQ19PSyh4KSAoIFwKKyAgICAgKHgpLT5tYWdpY1swXSA9PSBQU0YxX01BR0lDMCBcCisgICYmICh4KS0+bWFnaWNbMV0gPT0gUFNGMV9NQUdJQzEgXAorKQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTE9BREZPTlRfUFNGMgorZW51bSB7CisJUFNGMl9NQUdJQzAgPSAweDcyLAorCVBTRjJfTUFHSUMxID0gMHhiNSwKKwlQU0YyX01BR0lDMiA9IDB4NGEsCisJUFNGMl9NQUdJQzMgPSAweDg2LAorCVBTRjJfSEFTX1VOSUNPREVfVEFCTEUgPSAweDAxLAorCVBTRjJfTUFYVkVSU0lPTiA9IDAsCisJUFNGMl9TVEFSVFNFUSA9IDB4ZmUsCisJUFNGMl9TRVBBUkFUT1IgPSAweGZmCit9OworCitzdHJ1Y3QgcHNmMl9oZWFkZXIgeworCXVuc2lnbmVkIGNoYXIgbWFnaWNbNF07CisJdW5zaWduZWQgaW50IHZlcnNpb247CisJdW5zaWduZWQgaW50IGhlYWRlcnNpemU7ICAgIC8qIG9mZnNldCBvZiBiaXRtYXBzIGluIGZpbGUgKi8KKwl1bnNpZ25lZCBpbnQgZmxhZ3M7CisJdW5zaWduZWQgaW50IGxlbmd0aDsgICAgICAgIC8qIG51bWJlciBvZiBnbHlwaHMgKi8KKwl1bnNpZ25lZCBpbnQgY2hhcnNpemU7ICAgICAgLyogbnVtYmVyIG9mIGJ5dGVzIGZvciBlYWNoIGNoYXJhY3RlciAqLworCXVuc2lnbmVkIGludCBoZWlnaHQ7ICAgICAgICAvKiBtYXggZGltZW5zaW9ucyBvZiBnbHlwaHMgKi8KKwl1bnNpZ25lZCBpbnQgd2lkdGg7ICAgICAgICAgLyogY2hhcnNpemUgPSBoZWlnaHQgKiAoKHdpZHRoICsgNykgLyA4KSAqLworfTsKKworI2RlZmluZSBwc2YyaCh4KSAoKHN0cnVjdCBwc2YyX2hlYWRlciopKHgpKQorCisjZGVmaW5lIFBTRjJfTUFHSUNfT0soeCkgKCBcCisgICAgICh4KS0+bWFnaWNbMF0gPT0gUFNGMl9NQUdJQzAgXAorICAmJiAoeCktPm1hZ2ljWzFdID09IFBTRjJfTUFHSUMxIFwKKyAgJiYgKHgpLT5tYWdpY1syXSA9PSBQU0YyX01BR0lDMiBcCisgICYmICh4KS0+bWFnaWNbM10gPT0gUFNGMl9NQUdJQzMgXAorKQorI2VuZGlmIC8qIEVOQUJMRV9GRUFUVVJFX0xPQURGT05UX1BTRjIgKi8KKworCitzdGF0aWMgdm9pZCBkb19sb2FkZm9udChpbnQgZmQsIHVuc2lnbmVkIGNoYXIgKmluYnVmLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGludCBjaGFyc2l6ZSwgaW50IGZvbnRzaXplKQoreworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKwlpbnQgY2hhcndpZHRoID0gMzIgKiAoKHdpZHRoKzcpLzgpOworCWludCBpOworCisJaWYgKGhlaWdodCA8IDEgfHwgaGVpZ2h0ID4gMzIgfHwgd2lkdGggPCAxIHx8IHdpZHRoID4gMzIpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgY2hhcmFjdGVyIHNpemUgJWR4JWQiLCBoZWlnaHQsIHdpZHRoKTsKKworCWJ1ZiA9IHh6YWxsb2MoY2hhcndpZHRoICogKChmb250c2l6ZSA8IDEyOCkgPyAxMjggOiBmb250c2l6ZSkpOworCWZvciAoaSA9IDA7IGkgPCBmb250c2l6ZTsgaSsrKQorCQltZW1jcHkoYnVmICsgKGkqY2hhcndpZHRoKSwgaW5idWYgKyAoaSpjaGFyc2l6ZSksIGNoYXJzaXplKTsKKworCXsgLyogS0RGT05UT1AgKi8KKwkJc3RydWN0IGNvbnNvbGVfZm9udF9vcCBjZm87CisJCWNmby5vcCA9IEtEX0ZPTlRfT1BfU0VUOworCQljZm8uZmxhZ3MgPSAwOworCQljZm8ud2lkdGggPSB3aWR0aDsKKwkJY2ZvLmhlaWdodCA9IGhlaWdodDsKKwkJY2ZvLmNoYXJjb3VudCA9IGZvbnRzaXplOworCQljZm8uZGF0YSA9IGJ1ZjsKKwkJeGlvY3RsKGZkLCBLREZPTlRPUCwgJmNmbyk7CisJfQorCisJZnJlZShidWYpOworfQorCisvKgorICogRm9ybWF0IG9mIHRoZSBVbmljb2RlIGluZm9ybWF0aW9uOgorICoKKyAqIEZvciBlYWNoIGZvbnQgcG9zaXRpb24gPHVjPio8c2VxPio8dGVybT4KKyAqIHdoZXJlIDx1Yz4gaXMgYSAyLWJ5dGUgbGl0dGxlIGVuZGlhbiBVbmljb2RlIHZhbHVlIChQU0YxKQorICogb3IgYW4gVVRGLTggY29kZWQgdmFsdWUgKFBTRjIpLAorICogPHNlcT4gPSA8c3M+PHVjPjx1Yz4qLCA8c3M+ID0gcHNmMSA/IDB4RkZGRSA6IDB4RkUsCisgKiA8dGVybT4gPSBwc2YxID8gMHhGRkZGIDogMHhGRi4KKyAqIGFuZCAqIGRlbm90ZXMgemVybyBvciBtb3JlIG9jY3VycmVuY2VzIG9mIHRoZSBwcmVjZWRpbmcgaXRlbS4KKyAqCisgKiBTZW1hbnRpY3M6CisgKiBUaGUgbGVhZGluZyA8dWM+KiBwYXJ0IGdpdmVzIFVuaWNvZGUgc3ltYm9scyB0aGF0IGFyZSBhbGwKKyAqIHJlcHJlc2VudGVkIGJ5IHRoaXMgZm9udCBwb3NpdGlvbi4gVGhlIGZvbGxvd2luZyBzZXF1ZW5jZXMKKyAqIGFyZSBzZXF1ZW5jZXMgb2YgVW5pY29kZSBzeW1ib2xzIC0gcHJvYmFibHkgYSBzeW1ib2wKKyAqIHRvZ2V0aGVyIHdpdGggY29tYmluaW5nIGFjY2VudHMgLSBhbHNvIHJlcHJlc2VudGVkIGJ5CisgKiB0aGlzIGZvbnQgcG9zaXRpb24uCisgKgorICogRXhhbXBsZToKKyAqIEF0IHRoZSBmb250IHBvc2l0aW9uIGZvciBhIGNhcGl0YWwgQS1yaW5nIGdseXBoLCB3ZQorICogbWF5IGhhdmU6CisgKiAgIDAwQzUsMjEyQixGRkZFLDAwNDEsMDMwQSxGRkZGCisgKiBTb21lIGZvbnQgcG9zaXRpb25zIG1heSBiZSBkZXNjcmliZWQgYnkgc2VxdWVuY2VzIG9ubHksCisgKiBuYW1lbHkgd2hlbiB0aGVyZSBpcyBubyBwcmVjb21wb3NlZCBVbmljb2RlIHZhbHVlIGZvciB0aGUgZ2x5cGguCisgKi8KKyNpZiAhRU5BQkxFX0ZFQVRVUkVfTE9BREZPTlRfUFNGMgorI2RlZmluZSBkb19sb2FkdGFibGUoZmQsIGluYnVmLCB0YWlsc3osIGZvbnRzaXplLCBwc2YyKSBcCisJZG9fbG9hZHRhYmxlKGZkLCBpbmJ1ZiwgdGFpbHN6LCBmb250c2l6ZSkKKyNlbmRpZgorc3RhdGljIHZvaWQgZG9fbG9hZHRhYmxlKGludCBmZCwgdW5zaWduZWQgY2hhciAqaW5idWYsIGludCB0YWlsc3osIGludCBmb250c2l6ZSwgaW50IHBzZjIpCit7CisjaWYgIUVOQUJMRV9GRUFUVVJFX0xPQURGT05UX1BTRjIKKy8qIGdjYyA0LjMuMSBjb2RlIHNpemU6ICovCisjIGRlZmluZSBwc2YyIDAgLyogKzAgYnl0ZXMgKi8KKy8vCWNvbnN0IGludCBwc2YyID0gMDsgLyogKzggYnl0ZXMgKi8KKy8vCWVudW0geyBwc2YyID0gMCB9OyAvKiArMTMgYnl0ZXMgKi8KKyNlbmRpZgorCXN0cnVjdCB1bmltYXBpbml0IGFkdmljZTsKKwlzdHJ1Y3QgdW5pbWFwZGVzYyB1ZDsKKwlzdHJ1Y3QgdW5pcGFpciAqdXA7CisJaW50IGN0ID0gMCwgbWF4Y3Q7CisJaW50IGdseXBoOworCXVpbnQxNl90IHVuaWNvZGU7CisKKwltYXhjdCA9IHRhaWxzejsgLyogbW9yZSB0aGFuIGVub3VnaCAqLworCXVwID0geG1hbGxvYyhtYXhjdCAqIHNpemVvZigqdXApKTsKKworCWZvciAoZ2x5cGggPSAwOyBnbHlwaCA8IGZvbnRzaXplOyBnbHlwaCsrKSB7CisJCXdoaWxlICh0YWlsc3ogPiAwKSB7CisJCQlpZiAoIXBzZjIpIHsgLyogUFNGMSAqLworCQkJCXVuaWNvZGUgPSAoKCh1aW50MTZfdCkgaW5idWZbMV0pIDw8IDgpICsgaW5idWZbMF07CisJCQkJdGFpbHN6IC09IDI7CisJCQkJaW5idWYgKz0gMjsKKwkJCQlpZiAodW5pY29kZSA9PSBQU0YxX1NFUEFSQVRPUikKKwkJCQkJYnJlYWs7CisJCQl9IGVsc2UgeyAvKiBQU0YyICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfTE9BREZPTlRfUFNGMgorCQkJCS0tdGFpbHN6OworCQkJCXVuaWNvZGUgPSAqaW5idWYrKzsKKwkJCQlpZiAodW5pY29kZSA9PSBQU0YyX1NFUEFSQVRPUikgeworCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgaWYgKHVuaWNvZGUgPT0gUFNGMl9TVEFSVFNFUSkgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5pY29kZSBzZXF1ZW5jZXMgbm90IGltcGxlbWVudGVkIik7CisJCQkJfSBlbHNlIGlmICh1bmljb2RlID49IDB4QzApIHsKKwkJCQkJaWYgKHVuaWNvZGUgPj0gMHhGQykKKwkJCQkJCXVuaWNvZGUgJj0gMHgwMSwgbWF4Y3QgPSA1OworCQkJCQllbHNlIGlmICh1bmljb2RlID49IDB4RjgpCisJCQkJCQl1bmljb2RlICY9IDB4MDMsIG1heGN0ID0gNDsKKwkJCQkJZWxzZSBpZiAodW5pY29kZSA+PSAweEYwKQorCQkJCQkJdW5pY29kZSAmPSAweDA3LCBtYXhjdCA9IDM7CisJCQkJCWVsc2UgaWYgKHVuaWNvZGUgPj0gMHhFMCkKKwkJCQkJCXVuaWNvZGUgJj0gMHgwRiwgbWF4Y3QgPSAyOworCQkJCQllbHNlCisJCQkJCQl1bmljb2RlICY9IDB4MUYsIG1heGN0ID0gMTsKKwkJCQkJZG8geworCQkJCQkJaWYgKHRhaWxzeiA8PSAwIHx8ICppbmJ1ZiA8IDB4ODAgfHwgKmluYnVmID4gMHhCRikKKwkJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaWxsZWdhbCBVVEYtOCBjaGFyYWN0ZXIiKTsKKwkJCQkJCS0tdGFpbHN6OworCQkJCQkJdW5pY29kZSA9ICh1bmljb2RlIDw8IDYpICsgKCppbmJ1ZisrICYgMHgzRik7CisJCQkJCX0gd2hpbGUgKC0tbWF4Y3QgPiAwKTsKKwkJCQl9IGVsc2UgaWYgKHVuaWNvZGUgPj0gMHg4MCkgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaWxsZWdhbCBVVEYtOCBjaGFyYWN0ZXIiKTsKKwkJCQl9CisjZWxzZQorCQkJCXJldHVybjsKKyNlbmRpZgorCQkJfQorCQkJdXBbY3RdLnVuaWNvZGUgPSB1bmljb2RlOworCQkJdXBbY3RdLmZvbnRwb3MgPSBnbHlwaDsKKwkJCWN0Kys7CisJCX0KKwl9CisKKwkvKiBOb3RlOiBhZnRlciBQSU9fVU5JTUFQQ0xSIGFuZCBiZWZvcmUgUElPX1VOSU1BUAorCSAqIHRoaXMgcHJpbnRmIGRpZCBub3Qgd29yayBvbiBtYW55IGtlcm5lbHMgKi8KKworCWFkdmljZS5hZHZpc2VkX2hhc2hzaXplID0gMDsKKwlhZHZpY2UuYWR2aXNlZF9oYXNoc3RlcCA9IDA7CisJYWR2aWNlLmFkdmlzZWRfaGFzaGxldmVsID0gMDsKKwl4aW9jdGwoZmQsIFBJT19VTklNQVBDTFIsICZhZHZpY2UpOworCXVkLmVudHJ5X2N0ID0gY3Q7CisJdWQuZW50cmllcyA9IHVwOworCXhpb2N0bChmZCwgUElPX1VOSU1BUCwgJnVkKTsKKyN1bmRlZiBwc2YyCit9CisKK3N0YXRpYyB2b2lkIGRvX2xvYWQoaW50IGZkLCB1bnNpZ25lZCBjaGFyICpidWZmZXIsIHNpemVfdCBsZW4pCit7CisJaW50IGhlaWdodDsKKwlpbnQgd2lkdGggPSA4OworCWludCBjaGFyc2l6ZTsKKwlpbnQgZm9udHNpemUgPSAyNTY7CisJaW50IGhhc190YWJsZSA9IDA7CisJdW5zaWduZWQgY2hhciAqZm9udCA9IGJ1ZmZlcjsKKwl1bnNpZ25lZCBjaGFyICp0YWJsZTsKKworCWlmIChsZW4gPj0gc2l6ZW9mKHN0cnVjdCBwc2YxX2hlYWRlcikgJiYgUFNGMV9NQUdJQ19PSyhwc2YxaChidWZmZXIpKSkgeworCQlpZiAocHNmMWgoYnVmZmVyKS0+bW9kZSA+IFBTRjFfTUFYTU9ERSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bnN1cHBvcnRlZCBwc2YgZmlsZSBtb2RlIik7CisJCWlmIChwc2YxaChidWZmZXIpLT5tb2RlICYgUFNGMV9NT0RFNTEyKQorCQkJZm9udHNpemUgPSA1MTI7CisJCWlmIChwc2YxaChidWZmZXIpLT5tb2RlICYgUFNGMV9NT0RFSEFTVEFCKQorCQkJaGFzX3RhYmxlID0gMTsKKwkJaGVpZ2h0ID0gY2hhcnNpemUgPSBwc2YxaChidWZmZXIpLT5jaGFyc2l6ZTsKKwkJZm9udCArPSBzaXplb2Yoc3RydWN0IHBzZjFfaGVhZGVyKTsKKwl9IGVsc2UKKyNpZiBFTkFCTEVfRkVBVFVSRV9MT0FERk9OVF9QU0YyCisJaWYgKGxlbiA+PSBzaXplb2Yoc3RydWN0IHBzZjJfaGVhZGVyKSAmJiBQU0YyX01BR0lDX09LKHBzZjJoKGJ1ZmZlcikpKSB7CisJCWlmIChwc2YyaChidWZmZXIpLT52ZXJzaW9uID4gUFNGMl9NQVhWRVJTSU9OKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVuc3VwcG9ydGVkIHBzZiBmaWxlIHZlcnNpb24iKTsKKwkJZm9udHNpemUgPSBwc2YyaChidWZmZXIpLT5sZW5ndGg7CisJCWlmIChwc2YyaChidWZmZXIpLT5mbGFncyAmIFBTRjJfSEFTX1VOSUNPREVfVEFCTEUpCisJCQloYXNfdGFibGUgPSAyOworCQljaGFyc2l6ZSA9IHBzZjJoKGJ1ZmZlciktPmNoYXJzaXplOworCQloZWlnaHQgPSBwc2YyaChidWZmZXIpLT5oZWlnaHQ7CisJCXdpZHRoID0gcHNmMmgoYnVmZmVyKS0+d2lkdGg7CisJCWZvbnQgKz0gcHNmMmgoYnVmZmVyKS0+aGVhZGVyc2l6ZTsKKwl9IGVsc2UKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0xPQURGT05UX1JBVworCWlmIChsZW4gPT0gOTc4MCkgeyAgLyogZmlsZSB3aXRoIHRocmVlIGNvZGUgcGFnZXM/ICovCisJCWNoYXJzaXplID0gaGVpZ2h0ID0gMTY7CisJCWZvbnQgKz0gNDA7CisJfSBlbHNlIGlmICgobGVuICYgMDM3NykgPT0gMCkgeyAgLyogYmFyZSBmb250ICovCisJCWNoYXJzaXplID0gaGVpZ2h0ID0gbGVuIC8gMjU2OworCX0gZWxzZQorI2VuZGlmCisJeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW5wdXQgZmlsZTogYmFkIGxlbmd0aCBvciB1bnN1cHBvcnRlZCBmb250IHR5cGUiKTsKKwl9CisKKyNpZiAhZGVmaW5lZChQSU9fRk9OVFgpIHx8IGRlZmluZWQoX19zcGFyY19fKQorCWlmIChmb250c2l6ZSAhPSAyNTYpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJvbmx5IGZvbnRzaXplIDI1NiBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorCisJdGFibGUgPSBmb250ICsgZm9udHNpemUgKiBjaGFyc2l6ZTsKKwlidWZmZXIgKz0gbGVuOworCisJaWYgKHRhYmxlID4gYnVmZmVyIHx8ICghaGFzX3RhYmxlICYmIHRhYmxlICE9IGJ1ZmZlcikpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnB1dCBmaWxlOiBiYWQgbGVuZ3RoIik7CisKKwlkb19sb2FkZm9udChmZCwgZm9udCwgaGVpZ2h0LCB3aWR0aCwgY2hhcnNpemUsIGZvbnRzaXplKTsKKworCWlmIChoYXNfdGFibGUpCisJCWRvX2xvYWR0YWJsZShmZCwgdGFibGUsIGJ1ZmZlciAtIHRhYmxlLCBmb250c2l6ZSwgaGFzX3RhYmxlIC0gMSk7Cit9CisKKworI2lmIEVOQUJMRV9MT0FERk9OVAoraW50IGxvYWRmb250X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBsb2FkZm9udF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc2l6ZV90IGxlbjsKKwl1bnNpZ25lZCBjaGFyICpidWZmZXI7CisKKwkvLyBubyBhcmd1bWVudHMgYWxsb3dlZCEKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MCI7CisJZ2V0b3B0MzIoYXJndiwgIiIpOworCisJLyoKKwkgKiBXZSB1c2VkIHRvIGxvb2sgYXQgdGhlIGxlbmd0aCBvZiB0aGUgaW5wdXQgZmlsZQorCSAqIHdpdGggc3RhdCgpOyBub3cgdGhhdCB3ZSBhY2NlcHQgY29tcHJlc3NlZCBmaWxlcywKKwkgKiBqdXN0IHJlYWQgdGhlIGVudGlyZSBmaWxlLgorCSAqLworCWxlbiA9IDMyKjEwMjQ7IC8vIGNhbid0IGJlIGxhcmdlcgorCWJ1ZmZlciA9IHhtYWxsb2NfcmVhZChTVERJTl9GSUxFTk8sICZsZW4pOworCS8vIHhtYWxsb2Nfb3Blbl96aXBwZWRfcmVhZF9jbG9zZShmaWxlbmFtZSwgJmxlbik7CisJaWYgKCFidWZmZXIpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3IgcmVhZGluZyBpbnB1dCBmb250Iik7CisJZG9fbG9hZChnZXRfY29uc29sZV9mZF9vcl9kaWUoKSwgYnVmZmVyLCBsZW4pOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX1NFVEZPTlQKKworLyoKK2tiZC0xLjEyOgorCitzZXRmb250IFstTyBmb250K3VtYXAub3JpZ10gWy1vIGZvbnQub3JpZ10gWy1vbSBjbWFwLm9yaWddCitbLW91IHVtYXAub3JpZ10gWy1OXSBbZm9udC5uZXcgLi4uXSBbLW0gY21hcF0gWy11IHVtYXBdIFstQyBjb25zb2xlXQorWy1oTk5dIFstdl0gWy1WXQorCistaCBOTiAgT3ZlcnJpZGUgZm9udCBoZWlnaHQKKy1vIGZpbGUKKyAgICAgICBTYXZlIHByZXZpb3VzIGZvbnQgaW4gZmlsZQorLU8gZmlsZQorICAgICAgIFNhdmUgcHJldmlvdXMgZm9udCBhbmQgVW5pY29kZSBtYXAgaW4gZmlsZQorLW9tIGZpbGUKKyAgICAgICBTdG9yZSBjb25zb2xlIG1hcCBpbiBmaWxlCistb3UgZmlsZQorICAgICAgIFNhdmUgcHJldmlvdXMgVW5pY29kZSBtYXAgaW4gZmlsZQorLW0gZmlsZQorICAgICAgIExvYWQgY29uc29sZSBtYXAgb3IgVW5pY29kZSBjb25zb2xlIG1hcCBmcm9tIGZpbGUKKy11IGZpbGUKKyAgICAgICBMb2FkIFVuaWNvZGUgdGFibGUgZGVzY3JpYmluZyB0aGUgZm9udCBmcm9tIGZpbGUKKyAgICAgICBFeGFtcGxlOgorICAgICAgICMgY3A4NjYKKyAgICAgICAweDAwLTB4N2YgICAgICAgaWRlbQorICAgICAgICMKKyAgICAgICAweDgwICAgIFUrMDQxMCAgIyBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBBCisgICAgICAgMHg4MSAgICBVKzA0MTEgICMgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQkUKKyAgICAgICAweDgyICAgIFUrMDQxMiAgIyBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBWRQorLUMgY29uc29sZQorICAgICAgIFNldCB0aGUgZm9udCBmb3IgdGhlIGluZGljYXRlZCBjb25zb2xlCistdiAgICAgVmVyYm9zZQorLVYgICAgIFZlcnNpb24KKyovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRVRGT05UX1RFWFRVQUxfTUFQCitzdGF0aWMgaW50IGN0b2koY2hhciAqcykKK3sKKwlpZiAoc1swXSA9PSAnXCcnICYmIHNbMV0gIT0gJ1wwJyAmJiBzWzJdID09ICdcJycgJiYgc1szXSA9PSAnXDAnKQorCQlyZXR1cm4gc1sxXTsKKwkvLyBVKyBtZWFucyAweAorCWlmIChzWzBdID09ICdVJyAmJiBzWzFdID09ICcrJykgeworCQlzWzBdID0gJzAnOworCQlzWzFdID0gJ3gnOworCX0KKwlpZiAoIWlzZGlnaXQoc1swXSkpCisJCXJldHVybiAtMTsKKwlyZXR1cm4geHN0cnRvdWwocywgMCk7Cit9CisjZW5kaWYKKworaW50IHNldGZvbnRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNldGZvbnRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXNpemVfdCBsZW47CisJdW5zaWduZWQgb3B0czsKKwlpbnQgZmQ7CisJdW5zaWduZWQgY2hhciAqYnVmZmVyOworCWNoYXIgKm1hcGZpbGVuYW1lOworCWNvbnN0IGNoYXIgKnR0eV9uYW1lID0gQ1VSUkVOVF9UVFk7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MSI7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJtOkM6IiwgJm1hcGZpbGVuYW1lLCAmdHR5X25hbWUpOworCWFyZ3YgKz0gb3B0aW5kOworCisJZmQgPSB4b3Blbl9ub25ibG9ja2luZyh0dHlfbmFtZSk7CisKKwlpZiAoc2l6ZW9mKENPTkZJR19ERUZBVUxUX1NFVEZPTlRfRElSKSA+IDEpIHsgLy8gaWYgbm90ICIiCisJCWlmICgqYXJndlswXSAhPSAnLycpIHsKKwkJCS8vIGdvdG8gZGVmYXVsdCBmb250cyBsb2NhdGlvbi4gZG9uJ3QgZGllIGlmIGRvZXNuJ3QgZXhpc3QKKwkJCWNoZGlyKENPTkZJR19ERUZBVUxUX1NFVEZPTlRfRElSICIvY29uc29sZWZvbnRzIik7CisJCX0KKwl9CisJLy8gbG9hZCBmb250CisJbGVuID0gMzIqMTAyNDsgLy8gY2FuJ3QgYmUgbGFyZ2VyCisJYnVmZmVyID0geG1hbGxvY19vcGVuX3ppcHBlZF9yZWFkX2Nsb3NlKCphcmd2LCAmbGVuKTsKKwlpZiAoIWJ1ZmZlcikKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZSgqYXJndik7CisJZG9fbG9hZChmZCwgYnVmZmVyLCBsZW4pOworCisJLy8gbG9hZCB0aGUgc2NyZWVuIG1hcCwgaWYgYW55CisJaWYgKG9wdHMgJiAxKSB7IC8vIC1tCisJCXVuc2lnbmVkIG1vZGUgPSBQSU9fU0NSTk1BUDsKKwkJdm9pZCAqbWFwOworCisJCWlmIChzaXplb2YoQ09ORklHX0RFRkFVTFRfU0VURk9OVF9ESVIpID4gMSkgeyAvLyBpZiBub3QgIiIKKwkJCWlmIChtYXBmaWxlbmFtZVswXSAhPSAnLycpIHsKKwkJCQkvLyBnb3RvIGRlZmF1bHQga2V5bWFwcyBsb2NhdGlvbgorCQkJCWNoZGlyKENPTkZJR19ERUZBVUxUX1NFVEZPTlRfRElSICIvY29uc29sZXRyYW5zIik7CisJCQl9CisJCX0KKwkJLy8gZmV0Y2gga2V5bWFwCisJCW1hcCA9IHhtYWxsb2Nfb3Blbl96aXBwZWRfcmVhZF9jbG9zZShtYXBmaWxlbmFtZSwgJmxlbik7CisJCWlmICghbWFwKQorCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShtYXBmaWxlbmFtZSk7CisJCS8vIGZpbGUgc2l6ZSBpcyAyNTYgb3IgNTEyIGJ5dGVzPyAtPiBhc3N1bWUgYmluYXJ5IG1hcAorCQlpZiAobGVuID09IEVfVEFCU1ogfHwgbGVuID09IDIqRV9UQUJTWikgeworCQkJaWYgKGxlbiA9PSAyKkVfVEFCU1opCisJCQkJbW9kZSA9IFBJT19VTklTQ1JOTUFQOworCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfU0VURk9OVF9URVhUVUFMX01BUAorCQkvLyBhc3N1bWUgdGV4dHVhbCBVbmljb2RlIGNvbnNvbGUgbWFwczoKKwkJLy8gMHgwMCBVKzAwMDAgICMgIE5VTEwgKE5VTCkKKwkJLy8gMHgwMSBVKzAwMDEgICMgIFNUQVJUIE9GIEhFQURJTkcgKFNPSCkKKwkJLy8gMHgwMiBVKzAwMDIgICMgIFNUQVJUIE9GIFRFWFQgKFNUWCkKKwkJLy8gMHgwMyBVKzAwMDMgICMgIEVORCBPRiBURVhUIChFVFgpCisJCWVsc2UgeworCQkJaW50IGk7CisJCQljaGFyICp0b2tlblsyXTsKKwkJCXBhcnNlcl90ICpwYXJzZXI7CisKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCQlmcmVlKG1hcCk7CisJCQltYXAgPSB4bWFsbG9jKEVfVEFCU1ogKiBzaXplb2YodW5zaWduZWQgc2hvcnQpKTsKKworI2RlZmluZSB1bmljb2RlcyAoKHVuc2lnbmVkIHNob3J0ICopbWFwKQorCQkJLy8gZmlsbCB2YW5pbGxhIG1hcAorCQkJZm9yIChpID0gMDsgaSA8IEVfVEFCU1o7IGkrKykKKwkJCQl1bmljb2Rlc1tpXSA9IDB4ZjAwMCArIGk7CisKKwkJCXBhcnNlciA9IGNvbmZpZ19vcGVuKG1hcGZpbGVuYW1lKTsKKwkJCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRva2VuLCAyLCAyLCAiIyBcdCIsIFBBUlNFX05PUk1BTCB8IFBBUlNFX01JTl9ESUUpKSB7CisJCQkJLy8gcGFyc2UgY29kZS92YWx1ZSBwYWlyCisJCQkJaW50IGEgPSBjdG9pKHRva2VuWzBdKTsKKwkJCQlpbnQgYiA9IGN0b2kodG9rZW5bMV0pOworCQkJCWlmIChhIDwgMCB8fCBhID49IEVfVEFCU1oKKwkJCQkgfHwgYiA8IDAgfHwgYiA+IDY1NTM1CisJCQkJKSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtYXAgZm9ybWF0Iik7CisJCQkJfQorCQkJCS8vIHBhdGNoIG1hcAorCQkJCXVuaWNvZGVzW2FdID0gYjsKKwkJCQkvLyB1bmljb2RlIGNoYXJhY3RlciBpcyBtZXQ/CisJCQkJaWYgKGIgPiAyNTUpCisJCQkJCW1vZGUgPSBQSU9fVU5JU0NSTk1BUDsKKwkJCX0KKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCQljb25maWdfY2xvc2UocGFyc2VyKTsKKworCQkJaWYgKG1vZGUgIT0gUElPX1VOSVNDUk5NQVApIHsKKyNkZWZpbmUgYXNjaWlzICgodW5zaWduZWQgY2hhciAqKW1hcCkKKwkJCQlmb3IgKGkgPSAwOyBpIDwgRV9UQUJTWjsgaSsrKQorCQkJCQlhc2NpaXNbaV0gPSB1bmljb2Rlc1tpXTsKKyN1bmRlZiBhc2NpaXMKKwkJCX0KKyN1bmRlZiB1bmljb2RlcworCQl9CisjZW5kaWYgLy8gRU5BQkxFX0ZFQVRVUkVfU0VURk9OVF9URVhUVUFMX01BUAorCisJCS8vIGRvIHNldCBzY3JlZW4gbWFwCisJCXhpb2N0bChmZCwgbW9kZSwgbWFwKTsKKworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQlmcmVlKG1hcCk7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29uc29sZS10b29scy9sb2Fka21hcC5jIGIvY29uc29sZS10b29scy9sb2Fka21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MjVlZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25zb2xlLXRvb2xzL2xvYWRrbWFwLmMKQEAgLTAsMCArMSw5MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBsb2Fka21hcCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCBFbnJpcXVlIFphbmFyZGkgPGV6YW5hcmRpQHVsbC5lcz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBsb2Fka21hcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiPCBrZXltYXAiCisvL3VzYWdlOiNkZWZpbmUgbG9hZGttYXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJMb2FkIGEgYmluYXJ5IGtleWJvYXJkIHRyYW5zbGF0aW9uIHRhYmxlIGZyb20gc3RkaW4iCisvLy8vdXNhZ2U6ICAgICAgICJcbiIKKy8vLy91c2FnZTogICAgICAgIlxuCS1DIFRUWQlBZmZlY3QgVFRZIGluc3RlYWQgb2YgL2Rldi90dHkiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGxvYWRrbWFwX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGxvYWRrbWFwIDwgL2V0Yy9pMThuL2xhbmcta2V5bWFwXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjZGVmaW5lIEJJTkFSWV9LRVlNQVBfTUFHSUMgImJrZXltYXAiCisKKy8qIEZyb20gPGxpbnV4L2tkLmg+ICovCitzdHJ1Y3Qga2JlbnRyeSB7CisJdW5zaWduZWQgY2hhciBrYl90YWJsZTsKKwl1bnNpZ25lZCBjaGFyIGtiX2luZGV4OworCXVuc2lnbmVkIHNob3J0IGtiX3ZhbHVlOworfTsKKy8qIHNldHMgb25lIGVudHJ5IGluIHRyYW5zbGF0aW9uIHRhYmxlICovCisjZGVmaW5lIEtEU0tCRU5UICAgICAgICAweDRCNDcKKworLyogRnJvbSA8bGludXgva2V5Ym9hcmQuaD4gKi8KKyNkZWZpbmUgTlJfS0VZUyAgICAgICAgIDEyOAorI2RlZmluZSBNQVhfTlJfS0VZTUFQUyAgMjU2CisKK2ludCBsb2Fka21hcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbG9hZGttYXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBrYmVudHJ5IGtlOworCWludCBpLCBqLCBmZDsKKwl1aW50MTZfdCBpYnVmZltOUl9LRVlTXTsKKy8qCWNvbnN0IGNoYXIgKnR0eV9uYW1lID0gQ1VSUkVOVF9UVFk7ICovCisJUkVTRVJWRV9DT05GSUdfQlVGRkVSKGZsYWdzLCBNQVhfTlJfS0VZTUFQUyk7CisKKwkvKiBXaGVuIHVzZXIgYWNjaWRlbnRhbGx5IHJ1bnMgImxvYWRrbWFwIEZJTEUiCisJICogaW5zdGVhZCBvZiAibG9hZGttYXAgPEZJTEUiLCB3ZSBlbmQgdXAgd2FpdGluZyBmb3IgaW5wdXQgZnJvbSB0dHkuCisJICogTGV0J3MgcHJldmVudCBpdDogKi8KKwlpZiAoYXJndlsxXSkKKwkJYmJfc2hvd191c2FnZSgpOworLyogYmJfd2Fybl9pZ25vcmluZ19hcmdzKGFyZ3ZbMV0pOyAqLworCisJZmQgPSBnZXRfY29uc29sZV9mZF9vcl9kaWUoKTsKKy8qIG9yIG1heWJlOgorCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJDOiIsICZ0dHlfbmFtZSk7CisJZmQgPSB4b3Blbl9ub25ibG9ja2luZyh0dHlfbmFtZSk7CisqLworCisJeHJlYWQoU1RESU5fRklMRU5PLCBmbGFncywgNyk7CisJaWYgKCFpc19wcmVmaXhlZF93aXRoKGZsYWdzLCBCSU5BUllfS0VZTUFQX01BR0lDKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vdCBhIHZhbGlkIGJpbmFyeSBrZXltYXAiKTsKKworCXhyZWFkKFNURElOX0ZJTEVOTywgZmxhZ3MsIE1BWF9OUl9LRVlNQVBTKTsKKworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlJfS0VZTUFQUzsgaSsrKSB7CisJCWlmIChmbGFnc1tpXSAhPSAxKQorCQkJY29udGludWU7CisJCXhyZWFkKFNURElOX0ZJTEVOTywgaWJ1ZmYsIE5SX0tFWVMgKiBzaXplb2YodWludDE2X3QpKTsKKwkJZm9yIChqID0gMDsgaiA8IE5SX0tFWVM7IGorKykgeworCQkJa2Uua2JfaW5kZXggPSBqOworCQkJa2Uua2JfdGFibGUgPSBpOworCQkJa2Uua2JfdmFsdWUgPSBpYnVmZltqXTsKKwkJCS8qCisJCQkgKiBOb3RlOiB0YWJsZVtpZHg6MF0gY2FuIGNvbnRhaW4gc3BlY2lhbCB2YWx1ZQorCQkJICogS19BTExPQ0FURUQgKG1hcmtzIGFsbG9jYXRlZCB0YWJsZXMgaW4ga2VybmVsKS4KKwkJCSAqIGR1bXBrbWFwIHNhdmVzIHRoZSB2YWx1ZSBhcy1pczsgYnV0IGF0dGVtcHRzCisJCQkgKiB0byBsb2FkIGl0IGhlcmUgZmFpbCwgc2luY2UgaXQgaXNuJ3QgYSB2YWxpZAorCQkJICoga2V5IHZhbHVlOiBpdCBpcyBLKEtUX1NQRUMsMTI2KSA9PSAyPDw4ICsgMTI2LAorCQkJICogd2hlcmVhcyBsYXN0IHZhbGlkIEtUX1NQRUMgaXMKKwkJCSAqIEtfQkFSRU5VTUxPQ0sgPT0gSyhLVF9TUEVDLDE5KS4KKwkJCSAqIFNvIGZhciB3ZSBqdXN0IGlnbm9yZSB0aGVzZSBlcnJvcnM6CisJCQkgKi8KKwkJCWlvY3RsKGZkLCBLRFNLQkVOVCwgJmtlKTsKKwkJfQorCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQljbG9zZShmZCk7CisJCVJFTEVBU0VfQ09ORklHX0JVRkZFUihmbGFncyk7CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb25zb2xlLXRvb2xzL29wZW52dC5jIGIvY29uc29sZS10b29scy9vcGVudnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTIzNTY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29uc29sZS10b29scy9vcGVudnQuYwpAQCAtMCwwICsxLDE4OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogIG9wZW52dC5jIC0gb3BlbiBhIHZ0IHRvIHJ1biBhIGNvbW1hbmQuCisgKgorICogIGJ1c3lib3hlZCBieSBRdXkgVG9udGhhdCA8cXV5QHNpZ25hbDMuY29tPgorICogIGhhY2tlZCBieSBUaXRvIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBvcGVudnRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYyBOXSBbLXN3XSBbUFJPRyBBUkdTXSIKKy8vdXNhZ2U6I2RlZmluZSBvcGVudnRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTdGFydCBQUk9HIG9uIGEgbmV3IHZpcnR1YWwgdGVybWluYWxcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMgTglVc2Ugc3BlY2lmaWVkIFZUIgorLy91c2FnZTogICAgICJcbgktcwlTd2l0Y2ggdG8gdGhlIFZUIgorLyogLy91c2FnZTogICAgICJcbgktbAlSdW4gUFJPRyBhcyBsb2dpbiBzaGVsbCAoYnkgcHJlcGVuZGluZyAnLScpIiAqLworLy91c2FnZTogICAgICJcbgktdwlXYWl0IGZvciBQUk9HIHRvIGV4aXQiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG9wZW52dF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAib3BlbnZ0IDIgL2Jpbi9hc2hcbiIKKworI2luY2x1ZGUgPGxpbnV4L3Z0Lmg+CisjaW5jbHVkZSAibGliYmIuaCIKKworLyogIlN0YW5kYXJkIiBvcGVudnQncyBtYW4gcGFnZSAod2UgZG8gbm90IHN1cHBvcnQgYWxsIG9mIHRoaXMpOgorCitvcGVudnQgWy1jIE5VTV0gWy1mc3Vsdl0gWy0tXSBbY29tbWFuZCBbYXJnc11dCisKK0ZpbmQgdGhlIGZpcnN0IGF2YWlsYWJsZSBWVCwgYW5kIHJ1biBjb21tYW5kIG9uIGl0LiBTdGRpbyBpcyBkaXJlY3RlZAordG8gdGhhdCBWVC4gSWYgbm8gY29tbWFuZCBpcyBzcGVjaWZpZWQgdGhlbiAkU0hFTEwgaXMgdXNlZC4KKworLWMgTlVNCisgICAgVXNlIHRoZSBnaXZlbiBWVCBudW1iZXIsIG5vdCB0aGUgZmlyc3QgZnJlZSBvbmUuCistZgorICAgIEZvcmNlIG9wZW5pbmcgYSBWVDogZG9uJ3QgdHJ5IHRvIGNoZWNrIGlmIFZUIGlzIGFscmVhZHkgaW4gdXNlLgorLXMKKyAgICBTd2l0Y2ggdG8gdGhlIG5ldyBWVCB3aGVuIHN0YXJ0aW5nIHRoZSBjb21tYW5kLgorICAgIFRoZSBWVCBvZiB0aGUgbmV3IGNvbW1hbmQgd2lsbCBiZSBtYWRlIHRoZSBuZXcgY3VycmVudCBWVC4KKy11CisgICAgRmlndXJlIG91dCB0aGUgb3duZXIgb2YgdGhlIGN1cnJlbnQgVlQsIGFuZCBydW4gbG9naW4gYXMgdGhhdCB1c2VyLgorICAgIFN1aXRhYmxlIHRvIGJlIGNhbGxlZCBieSBpbml0LiBTaG91bGRuJ3QgYmUgdXNlZCB3aXRoIC1jIG9yIC1sLgorLWwKKyAgICBNYWtlIHRoZSBjb21tYW5kIGEgbG9naW4gc2hlbGw6IGEgIi0iIGlzIHByZXBlbmRlZCB0byB0aGUgYXJndlswXQorICAgIHdoZW4gY29tbWFuZCBpcyBleGVjdXRlZC4KKy12CisgICAgVmVyYm9zZS4KKy13CisgICAgV2FpdCBmb3IgY29tbWFuZCB0byBjb21wbGV0ZS4gSWYgLXcgYW5kIC1zIGFyZSB1c2VkIHRvZ2V0aGVyLAorICAgIHN3aXRjaCBiYWNrIHRvIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbCB3aGVuIHRoZSBjb21tYW5kIGNvbXBsZXRlcy4KKworYmJveDoKKy11OiBub3QgaW1wbGVtZW50ZWQKKy1mOiBhbHdheXMgaW4gZWZmZWN0CistbDogbm90IGltcGxlbWVudGVkLCBpZ25vcmVkCistdjogaWdub3JlZAorLXdzOiBkb2VzIE5PVCBzd2l0Y2ggYmFjaworKi8KKworLyogSGVscGVyOiBkb2VzIHRoaXMgZmQgdW5kZXJzdGFuZCBWVF94eHg/ICovCitzdGF0aWMgaW50IG5vdF92dF9mZChpbnQgZmQpCit7CisJc3RydWN0IHZ0X3N0YXQgdnRzdGF0OworCXJldHVybiBpb2N0bChmZCwgVlRfR0VUU1RBVEUsICZ2dHN0YXQpOyAvKiAhMDogZXJyb3IsIGl0J3Mgbm90IFZUIGZkICovCit9CisKKy8qIEhlbHBlcjogZ2V0IGEgZmQgc3VpdGFibGUgZm9yIFZUX3h4eCAqLworc3RhdGljIGludCBnZXRfdnRfZmQodm9pZCkKK3sKKwlpbnQgZmQ7CisKKwkvKiBEbyB3ZSwgYnkgY2hhbmNlLCBhbHJlYWR5IGhhdmUgaXQ/ICovCisJZm9yIChmZCA9IDA7IGZkIDwgMzsgZmQrKykKKwkJaWYgKCFub3RfdnRfZmQoZmQpKQorCQkJcmV0dXJuIGZkOworCWZkID0gb3BlbihERVZfQ09OU09MRSwgT19SRE9OTFkgfCBPX05PTkJMT0NLKTsKKwlpZiAoZmQgPj0gMCAmJiAhbm90X3Z0X2ZkKGZkKSkKKwkJcmV0dXJuIGZkOworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBmaW5kIG9wZW4gVlQiKTsKK30KKworc3RhdGljIGludCBmaW5kX2ZyZWVfdnRubyh2b2lkKQoreworCWludCB2dG5vOworCWludCBmZCA9IGdldF92dF9mZCgpOworCisJZXJybm8gPSAwOworCS8qeGZ1bmNfZXJyb3JfcmV0dmFsID0gMzsgLSBkbyB3ZSBuZWVkIGNvbXBhdD8gKi8KKwlpZiAoaW9jdGwoZmQsIFZUX09QRU5RUlksICZ2dG5vKSAhPSAwIHx8IHZ0bm8gPD0gMCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBmaW5kIG9wZW4gVlQiKTsKKy8vIE5vdCByZWFsbHkgbmVlZGVkLCBncmVwIGZvciBEQUVNT05fT05MWV9TQU5JVElaRQorLy8JaWYgKGZkID4gMikKKy8vCQljbG9zZShmZCk7CisJcmV0dXJuIHZ0bm87Cit9CisKKy8qIHZmb3JrIHNjYXJlcyBnY2MsIGl0IGdlbmVyYXRlcyBiaWdnZXIgY29kZS4KKyAqIEtlZXAgaXQgYXdheSBmcm9tIG1haW4gcHJvZ3JhbS4KKyAqIFRPRE86IG1vdmUgdG8gbGliYmI7IG9yIGFkYXB0IGV4aXN0aW5nIGxpYmJiJ3Mgc3Bhd24oKS4KKyAqLworc3RhdGljIE5PSU5MSU5FIHZvaWQgdmZvcmtfY2hpbGQoY2hhciAqKmFyZ3YpCit7CisJaWYgKHZmb3JrKCkgPT0gMCkgeworCQkvKiBDSElMRCAqLworCQkvKiBUcnkgdG8gbWFrZSB0aGlzIFZUIG91ciBjb250cm9sbGluZyB0dHkgKi8KKwkJc2V0c2lkKCk7IC8qIGxvc2Ugb2xkIGN0dHkgKi8KKwkJaW9jdGwoU1RESU5fRklMRU5PLCBUSU9DU0NUVFksIDAgLyogMDogZG9uJ3QgZm9yY2libHkgc3RlYWwgKi8pOworCQkvL2JiX2Vycm9yX21zZygib3VyIHNpZCAlZCIsIGdldHNpZCgwKSk7CisJCS8vYmJfZXJyb3JfbXNnKCJvdXIgcGdycCAlZCIsIGdldHBncnAoKSk7CisJCS8vYmJfZXJyb3JfbXNnKCJWVCdzIHNpZCAlZCIsIHRjZ2V0c2lkKDApKTsKKwkJLy9iYl9lcnJvcl9tc2coIlZUJ3MgcGdycCAlZCIsIHRjZ2V0cGdycCgwKSk7CisJCUJCX0VYRUNWUF9vcl9kaWUoYXJndik7CisJfQorfQorCitpbnQgb3BlbnZ0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBvcGVudnRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgdnRuYW1lW3NpemVvZihWQ19GT1JNQVQpICsgc2l6ZW9mKGludCkqM107CisJc3RydWN0IHZ0X3N0YXQgdnRzdGF0OworCWNoYXIgKnN0cl9jOworCWludCB2dG5vOworCWludCBmbGFnczsKKwllbnVtIHsKKwkJT1BUX2MgPSAoMSA8PCAwKSwKKwkJT1BUX3cgPSAoMSA8PCAxKSwKKwkJT1BUX3MgPSAoMSA8PCAyKSwKKwkJT1BUX2wgPSAoMSA8PCAzKSwKKwkJT1BUX2YgPSAoMSA8PCA0KSwKKwkJT1BUX3YgPSAoMSA8PCA1KSwKKwl9OworCisJLyogIisiIC0gc3RvcCBvbiBmaXJzdCBub24tb3B0aW9uICovCisJZmxhZ3MgPSBnZXRvcHQzMihhcmd2LCAiK2M6d3NsZnYiLCAmc3RyX2MpOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKGZsYWdzICYgT1BUX2MpIHsKKwkJLyogQ2hlY2sgZm9yIGlsbGVnYWwgdnQgbnVtYmVyOiA8IDEgb3IgPiA2MyAqLworCQl2dG5vID0geGF0b3VfcmFuZ2Uoc3RyX2MsIDEsIDYzKTsKKwl9IGVsc2UgeworCQl2dG5vID0gZmluZF9mcmVlX3Z0bm8oKTsKKwl9CisKKwkvKiBHcmFiIG5ldyBWVCAqLworCXNwcmludGYodnRuYW1lLCBWQ19GT1JNQVQsIHZ0bm8pOworCS8qIChUcnkgdG8pIGNsZWFuIHVwIHN0cmF5IG9wZW4gZmRzIGFib3ZlIGZkIDIgKi8KKwliYl9kYWVtb25pemVfb3JfcmV4ZWMoREFFTU9OX0NMT1NFX0VYVFJBX0ZEUyB8IERBRU1PTl9PTkxZX1NBTklUSVpFLCBOVUxMKTsKKwljbG9zZShTVERJTl9GSUxFTk8pOworCS8qc2V0c2lkKCk7IC0gQkFEIElERUE6IGFmdGVyIHdlIGV4aXQsIGNoaWxkIGlzIFNJR0hVUGVkLi4uICovCisJeG9wZW4odnRuYW1lLCBPX1JEV1IpOworCXhpb2N0bChTVERJTl9GSUxFTk8sIFZUX0dFVFNUQVRFLCAmdnRzdGF0KTsKKworCWlmIChmbGFncyAmIE9QVF9zKSB7CisJCWNvbnNvbGVfbWFrZV9hY3RpdmUoU1RESU5fRklMRU5PLCB2dG5vKTsKKwl9CisKKwlpZiAoIWFyZ3ZbMF0pIHsKKwkJYXJndi0tOworCQlhcmd2WzBdID0gKGNoYXIgKikgZ2V0X3NoZWxsX25hbWUoKTsKKwkJLyphcmd2WzFdID0gTlVMTDsgLSBhbHJlYWR5IGlzICovCisJfQorCisJeGR1cDIoU1RESU5fRklMRU5PLCBTVERPVVRfRklMRU5PKTsKKwl4ZHVwMihTVERJTl9GSUxFTk8sIFNUREVSUl9GSUxFTk8pOworCisjaWZkZWYgQkxPQVQKKwl7CisJLyogSGFuZGxlIC1sIChsb2dpbiBzaGVsbCkgb3B0aW9uICovCisJY29uc3QgY2hhciAqcHJvZyA9IGFyZ3ZbMF07CisJaWYgKGZsYWdzICYgT1BUX2wpCisJCWFyZ3ZbMF0gPSB4YXNwcmludGYoIi0lcyIsIGFyZ3ZbMF0pOworCX0KKyNlbmRpZgorCisJdmZvcmtfY2hpbGQoYXJndik7CisJaWYgKGZsYWdzICYgT1BUX3cpIHsKKwkJLyogV2UgaGF2ZSBvbmx5IG9uZSBjaGlsZCwgd2FpdCBmb3IgaXQgKi8KKwkJc2FmZV93YWl0cGlkKC0xLCBOVUxMLCAwKTsgLyogbG9vcHMgb24gRUlOVFIgKi8KKwkJaWYgKGZsYWdzICYgT1BUX3MpIHsKKwkJCWNvbnNvbGVfbWFrZV9hY3RpdmUoU1RESU5fRklMRU5PLCB2dHN0YXQudl9hY3RpdmUpOworCQkJLy8gQ29tcGF0OiBldmVuIHdpdGggLWMgTiAodHJ5IHRvKSBkaXNhbGxvY2F0ZToKKwkJCS8vICMgL3Vzci9hcHAva2JkLTEuMTIvYmluL29wZW52dCAtZiAtYyA5IC13cyBzbGVlcCA1CisJCQkvLyBvcGVudnQ6IGNvdWxkIG5vdCBkZWFsbG9jYXRlIGNvbnNvbGUgOQorCQkJeGlvY3RsKFNURElOX0ZJTEVOTywgVlRfRElTQUxMT0NBVEUsICh2b2lkKikocHRyZGlmZl90KXZ0bm8pOworCQl9CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb25zb2xlLXRvb2xzL3Jlc2V0LmMgYi9jb25zb2xlLXRvb2xzL3Jlc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU5NDBiZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnNvbGUtdG9vbHMvcmVzZXQuYwpAQCAtMCwwICsxLDU0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHJlc2V0IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogV3JpdHRlbiBieSBFcmlrIEFuZGVyc2VuIGFuZCBLZW50IFJvYm90dGkgPHJvYm90dGlAbWV0Y29ubmVjdC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCVFcsIHdoaWNoICJzdGFuZGFyZCIgcGFja2FnZSBoYXMgdGhpcyB1dGlsaXR5PyBJdCBkb2Vzbid0IHNlZW0KKyAqIHRvIGJlIG5jdXJzZXMsIGNvcmV1dGlscywgY29uc29sZS10b29scy4uLiB0aGVuIHdoYXQ/ICovCisKKy8vdXNhZ2U6I2RlZmluZSByZXNldF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIHJlc2V0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVzZXQgdGhlIHNjcmVlbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgRVNDICJcMDMzIgorCisjaWYgRU5BQkxFX1NUVFkKK2ludCBzdHR5X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKKyNlbmRpZgorCitpbnQgcmVzZXRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJlc2V0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGFyZ3NbXSA9IHsKKwkJInN0dHkiLCAic2FuZSIsIE5VTEwKKwl9OworCisJLyogbm8gb3B0aW9ucywgbm8gZ2V0b3B0ICovCisKKwlpZiAoLyppc2F0dHkoU1RESU5fRklMRU5PKSAmJiovIGlzYXR0eShTVERPVVRfRklMRU5PKSkgeworCQkvKiBTZWUgJ21hbiA0IGNvbnNvbGVfY29kZXMnIGZvciBkZXRhaWxzOgorCQkgKiAiRVNDIGMiICAgICAgICAtLSBSZXNldAorCQkgKiAiRVNDICggQiIgICAgICAtLSBTZWxlY3QgRzAgQ2hhcmFjdGVyIFNldCAoQiA9IFVTKQorCQkgKiAiRVNDIFsgMCBtIiAgICAtLSBSZXNldCBhbGwgZGlzcGxheSBhdHRyaWJ1dGVzCisJCSAqICJFU0MgWyBKIiAgICAgIC0tIEVyYXNlIHRvIHRoZSBlbmQgb2Ygc2NyZWVuCisJCSAqICJFU0MgWyA/IDI1IGgiIC0tIE1ha2UgY3Vyc29yIHZpc2libGUKKwkJICovCisJCXByaW50ZihFU0MiYyIgRVNDIihCIiBFU0MiWzBtIiBFU0MiW0oiIEVTQyJbPzI1aCIpOworCQkvKiBodHRwOi8vYnVncy5idXN5Ym94Lm5ldC92aWV3LnBocD9pZD0xNDE0OgorCQkgKiBwZW9wbGUgd2FudCBpdCB0byByZXNldCBlY2hvIGV0YzogKi8KKyNpZiBFTkFCTEVfU1RUWQorCQlyZXR1cm4gc3R0eV9tYWluKDIsIChjaGFyKiopYXJncyk7CisjZWxzZQorCQlleGVjdnAoInN0dHkiLCAoY2hhcioqKWFyZ3MpOworI2VuZGlmCisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb25zb2xlLXRvb2xzL3Jlc2l6ZS5jIGIvY29uc29sZS10b29scy9yZXNpemUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjBkNjNhCi0tLSAvZGV2L251bGwKKysrIGIvY29uc29sZS10b29scy9yZXNpemUuYwpAQCAtMCwwICsxLDc4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiByZXNpemUgLSBzZXQgdGVybWluYWwgd2lkdGggYW5kIGhlaWdodC4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNiBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisvKiBubyBvcHRpb25zLCBubyBnZXRvcHQgKi8KKworLy91c2FnZTojZGVmaW5lIHJlc2l6ZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIHJlc2l6ZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJlc2l6ZSB0aGUgc2NyZWVuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2RlZmluZSBFU0MgIlwwMzMiCisKKyNkZWZpbmUgb2xkX3Rlcm1pb3NfcCAoKHN0cnVjdCB0ZXJtaW9zKikmYmJfY29tbW9uX2J1ZnNpejEpCisKK3N0YXRpYyB2b2lkCitvbmludHIoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJdGNzZXRhdHRyKFNUREVSUl9GSUxFTk8sIFRDU0FOT1csIG9sZF90ZXJtaW9zX3ApOworCV9leGl0KEVYSVRfRkFJTFVSRSk7Cit9CisKK2ludCByZXNpemVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJlc2l6ZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCB0ZXJtaW9zIG5ldzsKKwlzdHJ1Y3Qgd2luc2l6ZSB3ID0geyAwLCAwLCAwLCAwIH07CisJaW50IHJldDsKKworCS8qIFdlIHVzZSBfc3RkZXJyXyBpbiBvcmRlciB0byBtYWtlIHJlc2l6ZSB1c2FibGUKKwkgKiBpbiBzaGVsbCBiYWNrdGlja3MgKHRob3NlIHJlZGlyZWN0IHN0ZG91dCBhd2F5IGZyb20gdHR5KS4KKwkgKiBOQjogb3RoZXIgdmVyc2lvbnMgb2YgcmVzaXplIG9wZW4gIi9kZXYvdHR5IgorCSAqIGFuZCBvcGVyYXRlIG9uIGl0IC0gc2hvdWxkIHdlIGRvIHRoZSBzYW1lPworCSAqLworCisJdGNnZXRhdHRyKFNUREVSUl9GSUxFTk8sIG9sZF90ZXJtaW9zX3ApOyAvKiBmaWRkbGUgZWNobyAqLworCW1lbWNweSgmbmV3LCBvbGRfdGVybWlvc19wLCBzaXplb2YobmV3KSk7CisJbmV3LmNfY2ZsYWcgfD0gKENMT0NBTCB8IENSRUFEKTsKKwluZXcuY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8gfCBFQ0hPRSB8IElTSUcpOworCWJiX3NpZ25hbHMoMAorCQkrICgxIDw8IFNJR0lOVCkKKwkJKyAoMSA8PCBTSUdRVUlUKQorCQkrICgxIDw8IFNJR1RFUk0pCisJCSsgKDEgPDwgU0lHQUxSTSkKKwkJLCBvbmludHIpOworCXRjc2V0YXR0cihTVERFUlJfRklMRU5PLCBUQ1NBTk9XLCAmbmV3KTsKKworCS8qIHNhdmVfY3Vyc29yX3BvcyA3CisJICogc2Nyb2xsX3dob2xlX3NjcmVlbiBbcgorCSAqIHB1dF9jdXJzb3Jfd2FhYWF5X29mZiBbJHg7JHlICisJICogZ2V0X2N1cnNvcl9wb3MgWzZuCisJICogcmVzdG9yZV9jdXJzb3JfcG9zIDgKKwkgKi8KKwlmcHJpbnRmKHN0ZGVyciwgRVNDIjciIEVTQyJbciIgRVNDIls5OTk7OTk5SCIgRVNDIls2biIpOworCWFsYXJtKDMpOyAvKiBKdXN0IGluIGNhc2UgdGVybWluYWwgd29uJ3QgYW5zd2VyICovCisvL0JVRzogZGVhdGggYnkgc2lnbmFsIHdvbid0IHJlc3RvcmUgdGVybWlvcworCXNjYW5mKEVTQyJbJWh1OyVodVIiLCAmdy53c19yb3csICZ3LndzX2NvbCk7CisJZnByaW50ZihzdGRlcnIsIEVTQyI4Iik7CisKKwkvKiBCVFcsIG90aGVyIHZlcnNpb25zIG9mIHJlc2l6ZSByZWNhbGN1bGF0ZSB3LndzX3hwaXhlbCwgd3Mud3NfeXBpeGVsCisJICogYnkgY2FsY3VsYXRpbmcgY2hhcmFjdGVyIGNlbGwgSHhXIGZyb20gb2xkIHZhbHVlcworCSAqIChnb3R0ZW4gdmlhIFRJT0NHV0lOU1opIGFuZCByZWNvbXB1dGluZyAqcGl4ZWwgdmFsdWVzICovCisJcmV0ID0gaW9jdGwoU1RERVJSX0ZJTEVOTywgVElPQ1NXSU5TWiwgJncpOworCisJdGNzZXRhdHRyKFNUREVSUl9GSUxFTk8sIFRDU0FOT1csIG9sZF90ZXJtaW9zX3ApOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX1JFU0laRV9QUklOVCkKKwkJcHJpbnRmKCJDT0xVTU5TPSVkO0xJTkVTPSVkO2V4cG9ydCBDT0xVTU5TIExJTkVTO1xuIiwKKwkJCXcud3NfY29sLCB3LndzX3Jvdyk7CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY29uc29sZS10b29scy9zZXRjb25zb2xlLmMgYi9jb25zb2xlLXRvb2xzL3NldGNvbnNvbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDA1MWRjCi0tLSAvZGV2L251bGwKKysrIGIvY29uc29sZS10b29scy9zZXRjb25zb2xlLmMKQEAgLTAsMCArMSw0NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogIHNldGNvbnNvbGUuYyAtIHJlZGlyZWN0IHN5c3RlbSBjb25zb2xlIG91dHB1dAorICoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDQsMjAwNSAgRW5yaWsgQmVya2hhbiA8RW5yaWsuQmVya2hhbkBpbmthLmRlPgorICogIENvcHlyaWdodCAoQykgMjAwOCBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzZXRjb25zb2xlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXIiIElGX0ZFQVRVUkVfU0VUQ09OU09MRV9MT05HX09QVElPTlMoInwtLXJlc2V0IikgIl0gW0RFVklDRV0iCisvL3VzYWdlOiNkZWZpbmUgc2V0Y29uc29sZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJlZGlyZWN0IHN5c3RlbSBjb25zb2xlIG91dHB1dCB0byBERVZJQ0UgKGRlZmF1bHQ6IC9kZXYvdHR5KVxuIgorLy91c2FnZTogICAgICJcbgktcglSZXNldCBvdXRwdXQgdG8gL2Rldi9jb25zb2xlIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IHNldGNvbnNvbGVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNldGNvbnNvbGVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKmRldmljZSA9IENVUlJFTlRfVFRZOworCWJvb2wgcmVzZXQ7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRVRDT05TT0xFX0xPTkdfT1BUSU9OUworCXN0YXRpYyBjb25zdCBjaGFyIHNldGNvbnNvbGVfbG9uZ29wdHNbXSBBTElHTjEgPQorCQkicmVzZXRcMCIgTm9fYXJndW1lbnQgInIiCisJCTsKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gc2V0Y29uc29sZV9sb25nb3B0czsKKyNlbmRpZgorCS8qIGF0IG1vc3Qgb25lIG5vbi1vcHRpb24gYXJndW1lbnQgKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICI/MSI7CisJcmVzZXQgPSBnZXRvcHQzMihhcmd2LCAiciIpOworCisJYXJndiArPSAxICsgcmVzZXQ7CisJaWYgKCphcmd2KSB7CisJCWRldmljZSA9ICphcmd2OworCX0gZWxzZSB7CisJCWlmIChyZXNldCkKKwkJCWRldmljZSA9IERFVl9DT05TT0xFOworCX0KKworCXhpb2N0bCh4b3BlbihkZXZpY2UsIE9fV1JPTkxZKSwgVElPQ0NPTlMsIE5VTEwpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb25zb2xlLXRvb2xzL3NldGtleWNvZGVzLmMgYi9jb25zb2xlLXRvb2xzL3NldGtleWNvZGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZhN2MyMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnNvbGUtdG9vbHMvc2V0a2V5Y29kZXMuYwpAQCAtMCwwICsxLDU5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzZXRrZXljb2RlcworICoKKyAqIENvcHlyaWdodCAoQykgMTk5NC0xOTk4IEFuZHJpZXMgRS4gQnJvdXdlciA8YWViQGN3aS5ubD4KKyAqCisgKiBBZGp1c3RlZCBmb3IgQnVzeUJveCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgc2V0a2V5Y29kZXNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlNDQU5DT0RFIEtFWUNPREUuLi4iCisvL3VzYWdlOiNkZWZpbmUgc2V0a2V5Y29kZXNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZXQgZW50cmllcyBpbnRvIHRoZSBrZXJuZWwncyBzY2FuY29kZS10by1rZXljb2RlIG1hcCxcbiIKKy8vdXNhZ2U6ICAgICAgICJhbGxvd2luZyB1bnVzdWFsIGtleWJvYXJkcyB0byBnZW5lcmF0ZSB1c2FibGUga2V5Y29kZXMuXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTQ0FOQ09ERSBtYXkgYmUgZWl0aGVyIHh4IG9yIGUweHggKGhleGFkZWNpbWFsKSxcbiIKKy8vdXNhZ2U6ICAgICAgICJhbmQgS0VZQ09ERSBpcyBnaXZlbiBpbiBkZWNpbWFsLiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgc2V0a2V5Y29kZXNfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgc2V0a2V5Y29kZXMgZTAzMCAxMjdcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIEZyb20gPGxpbnV4L2tkLmg+ICovCitzdHJ1Y3Qga2JrZXljb2RlIHsKKwl1bnNpZ25lZCBzY2FuY29kZSwga2V5Y29kZTsKK307CitlbnVtIHsKKwlLRFNFVEtFWUNPREUgPSAweDRCNEQgIC8qIHdyaXRlIGtlcm5lbCBrZXljb2RlIHRhYmxlIGVudHJ5ICovCit9OworCitpbnQgc2V0a2V5Y29kZXNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNldGtleWNvZGVzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBmZDsKKwlzdHJ1Y3Qga2JrZXljb2RlIGE7CisKKwlpZiAoIShhcmdjICYgMSkgLyogaWYgZXZlbiAqLyB8fCBhcmdjIDwgMikgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJZmQgPSBnZXRfY29uc29sZV9mZF9vcl9kaWUoKTsKKworCXdoaWxlIChhcmd2WzFdKSB7CisJCWludCBzYyA9IHhzdHJ0b3VsX3JhbmdlKGFyZ3ZbMV0sIDE2LCAwLCAweGUwN2YpOworCQlpZiAoc2MgPj0gMHhlMDAwKSB7CisJCQlzYyAtPSAweGUwMDA7CisJCQlzYyArPSAweDAwODA7CisJCX0KKwkJYS5zY2FuY29kZSA9IHNjOworCQlhLmtleWNvZGUgPSB4YXRvdV9yYW5nZShhcmd2WzJdLCAwLCAyNTUpOworCQlpb2N0bF9vcl9wZXJyb3JfYW5kX2RpZShmZCwgS0RTRVRLRVlDT0RFLCAmYSwKKwkJCSJjYW4ndCBzZXQgU0NBTkNPREUgJXggdG8gS0VZQ09ERSAlZCIsCisJCQlzYywgYS5rZXljb2RlKTsKKwkJYXJndiArPSAyOworCX0KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvY29uc29sZS10b29scy9zZXRsb2djb25zLmMgYi9jb25zb2xlLXRvb2xzL3NldGxvZ2NvbnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTExZGEzCi0tLSAvZGV2L251bGwKKysrIGIvY29uc29sZS10b29scy9zZXRsb2djb25zLmMKQEAgLTAsMCArMSwzNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogc2V0bG9nY29uczogU2VuZCBrZXJuZWwgbWVzc2FnZXMgdG8gdGhlIGN1cnJlbnQgY29uc29sZSBvciB0byBjb25zb2xlIE4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgYnkgSmFuIEtpc3prYSA8amFuLmtpc3prYUB3ZWIuZGU+CisgKgorICogQmFzZWQgb24gc2V0bG9nY29ucyAoa2JkLTEuMTIpIGJ5IEFuZHJpZXMgRS4gQnJvdXdlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHNldGxvZ2NvbnNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltOXSIKKy8vdXNhZ2U6I2RlZmluZSBzZXRsb2djb25zX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVkaXJlY3QgdGhlIGtlcm5lbCBvdXRwdXQgdG8gY29uc29sZSBOLiBEZWZhdWx0OjAgKGN1cnJlbnQgY29uc29sZSkiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgc2V0bG9nY29uc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc2V0bG9nY29uc19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHsKKwkJY2hhciBmbjsKKwkJY2hhciBzdWJhcmc7CisJfSBhcmcgPSB7CisJCTExLCAvKiByZWRpcmVjdCBrZXJuZWwgbWVzc2FnZXMgKi8KKwkJMCAgIC8qIHRvIHNwZWNpZmllZCBjb25zb2xlIChjdXJyZW50IGFzIGRlZmF1bHQpICovCisJfTsKKworCWlmIChhcmd2WzFdKQorCQlhcmcuc3ViYXJnID0geGF0b3VfcmFuZ2UoYXJndlsxXSwgMCwgNjMpOworCisJeGlvY3RsKHhvcGVuKFZDXzEsIE9fUkRPTkxZKSwgVElPQ0xJTlVYLCAmYXJnKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb25zb2xlLXRvb2xzL3Nob3drZXkuYyBiL2NvbnNvbGUtdG9vbHMvc2hvd2tleS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YjRjMzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb25zb2xlLXRvb2xzL3Nob3drZXkuYwpAQCAtMCwwICsxLDE0OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogc2hvd3Mga2V5cyBwcmVzc2VkLiBpbnNwaXJlZCBieSBrYmQgcGFja2FnZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBWbGFkaW1pciBEcm9ubmlrb3YgPGRyb25uaWtvdkBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgc2hvd2tleV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hIHwgLWsgfCAtc10iCisvL3VzYWdlOiNkZWZpbmUgc2hvd2tleV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNob3cga2V5cyBwcmVzc2VkXG4iCisvL3VzYWdlOiAgICAgIlxuCS1hCURpc3BsYXkgZGVjaW1hbC9vY3RhbC9oZXggdmFsdWVzIG9mIHRoZSBrZXlzIgorLy91c2FnZTogICAgICJcbgktawlEaXNwbGF5IGludGVycHJldGVkIGtleWNvZGVzIChkZWZhdWx0KSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJRGlzcGxheSByYXcgc2Nhbi1jb2RlcyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bGludXgva2QuaD4KKworCitzdHJ1Y3QgZ2xvYmFscyB7CisJaW50IGtibW9kZTsKKwlzdHJ1Y3QgdGVybWlvcyB0aW8sIHRpbzA7Cit9OworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIGtibW9kZSAoRy5rYm1vZGUpCisjZGVmaW5lIHRpbyAgICAoRy50aW8pCisjZGVmaW5lIHRpbzAgICAoRy50aW8wKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorfSB3aGlsZSAoMCkKKworCisvLyBzZXQgcmF3IHR0eSBtb2RlCisvLyBhbHNvIHVzZWQgYnkgbWljcm9jb20KKy8vIGxpYmJiIGNhbmRpZGF0ZXM/CitzdGF0aWMgdm9pZCB4Z2V0MShzdHJ1Y3QgdGVybWlvcyAqdCwgc3RydWN0IHRlcm1pb3MgKm9sZHQpCit7CisJdGNnZXRhdHRyKFNURElOX0ZJTEVOTywgb2xkdCk7CisJKnQgPSAqb2xkdDsKKwljZm1ha2VyYXcodCk7Cit9CisKK3N0YXRpYyB2b2lkIHhzZXQxKHN0cnVjdCB0ZXJtaW9zICp0KQoreworCWludCByZXQgPSB0Y3NldGF0dHIoU1RESU5fRklMRU5PLCBUQ1NBRkxVU0gsIHQpOworCWlmIChyZXQpIHsKKwkJYmJfcGVycm9yX21zZygiY2FuJ3QgdGNzZXRhdHRyIGZvciBzdGRpbiIpOworCX0KK30KKworaW50IHNob3drZXlfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNob3drZXlfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWVudW0geworCQlPUFRfYSA9ICgxPDwwKSwgLy8gZGlzcGxheSB0aGUgZGVjaW1hbC9vY3RhbC9oZXggdmFsdWVzIG9mIHRoZSBrZXlzCisJCU9QVF9rID0gKDE8PDEpLCAvLyBkaXNwbGF5IG9ubHkgdGhlIGludGVycHJldGVkIGtleWNvZGVzIChkZWZhdWx0KQorCQlPUFRfcyA9ICgxPDwyKSwgLy8gZGlzcGxheSBvbmx5IHRoZSByYXcgc2Nhbi1jb2RlcworCX07CisKKwlJTklUX0coKTsKKworCS8vIEZJWE1FOiBha3MgYXJlIGFsbCBtdXR1YWxseSBleGNsdXNpdmUKKwlnZXRvcHQzMihhcmd2LCAiYWtzIik7CisKKwkvLyBwcmVwYXJlIGZvciByYXcgbW9kZQorCXhnZXQxKCZ0aW8sICZ0aW8wKTsKKwkvLyBwdXQgc3RkaW4gaW4gcmF3IG1vZGUKKwl4c2V0MSgmdGlvKTsKKworI2RlZmluZSBwcmVzc19rZXlzICJQcmVzcyBhbnkga2V5cywgcHJvZ3JhbSB0ZXJtaW5hdGVzICVzOlxyXG5cbiIKKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX2EpIHsKKwkJLy8ganVzdCByZWFkIHN0ZGluIGNoYXIgYnkgY2hhcgorCQl1bnNpZ25lZCBjaGFyIGM7CisKKwkJcHJpbnRmKHByZXNzX2tleXMsICJvbiBFT0YgKGN0cmwtRCkiKTsKKworCQkvLyByZWFkIGFuZCBzaG93IGJ5dGUgdmFsdWVzCisJCXdoaWxlICgxID09IHJlYWQoU1RESU5fRklMRU5PLCAmYywgMSkpIHsKKwkJCXByaW50ZigiJTN1IDAlMDNvIDB4JTAyeFxyXG4iLCBjLCBjLCBjKTsKKwkJCWlmICgwNCAvKkNUUkwtRCovID09IGMpCisJCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQkvLyB3ZSBhc3N1bWUgYSBQQyBrZXlib2FyZAorCQl4aW9jdGwoU1RESU5fRklMRU5PLCBLREdLQk1PREUsICZrYm1vZGUpOworCQlwcmludGYoIktleWJvYXJkIG1vZGUgd2FzICVzLlxyXG5cbiIsCisJCQlrYm1vZGUgPT0gS19SQVcgPyAiUkFXIiA6CisJCQkJKGtibW9kZSA9PSBLX1hMQVRFID8gIlhMQVRFIiA6CisJCQkJCShrYm1vZGUgPT0gS19NRURJVU1SQVcgPyAiTUVESVVNUkFXIiA6CisJCQkJCQkoa2Jtb2RlID09IEtfVU5JQ09ERSA/ICJVTklDT0RFIiA6ICJVTktOT1dOIikpKQorCQkpOworCisJCS8vIHNldCByYXcga2V5Ym9hcmQgbW9kZQorCQl4aW9jdGwoU1RESU5fRklMRU5PLCBLRFNLQk1PREUsICh2b2lkICopKHB0cmRpZmZfdCkoKG9wdGlvbl9tYXNrMzIgJiBPUFRfaykgPyBLX01FRElVTVJBVyA6IEtfUkFXKSk7CisKKwkJLy8gd2Ugc2hvdWxkIGV4aXQgb24gYW55IHNpZ25hbDsgc2lnbmFscyBzaG91bGQgaW50ZXJydXB0IHJlYWQKKwkJYmJfc2lnbmFsc19yZWN1cnNpdmVfbm9yZXN0YXJ0KEJCX0ZBVEFMX1NJR1MsIHJlY29yZF9zaWdubyk7CisKKwkJLy8gaW5mb3JtIHVzZXIgdGhhdCBwcm9ncmFtIGVuZHMgYWZ0ZXIgdGltZSBvZiBpbmFjdGl2aXR5CisJCXByaW50ZihwcmVzc19rZXlzLCAiMTBzIGFmdGVyIGxhc3Qga2V5cHJlc3MiKTsKKworCQkvLyByZWFkIGFuZCBzaG93IHNjYW5jb2RlcworCQl3aGlsZSAoIWJiX2dvdF9zaWduYWwpIHsKKwkJCWNoYXIgYnVmWzE4XTsKKwkJCWludCBpLCBuOworCisJCQkvLyBzZXR1cCAxMHMgd2F0Y2hkb2cKKwkJCWFsYXJtKDEwKTsKKworCQkJLy8gcmVhZCBzY2FuY29kZXMKKwkJCW4gPSByZWFkKFNURElOX0ZJTEVOTywgYnVmLCBzaXplb2YoYnVmKSk7CisJCQlpID0gMDsKKwkJCXdoaWxlIChpIDwgbikgeworCQkJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX3MpIHsKKwkJCQkJLy8gc2hvdyByYXcgc2NhbmNvZGVzCisJCQkJCXByaW50ZigiMHglMDJ4ICIsIGJ1ZltpKytdKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyBzaG93IGludGVycHJldGVkIHNjYW5jb2RlcyAoZGVmYXVsdCkKKwkJCQkJY2hhciBjID0gYnVmW2ldOworCQkJCQlpbnQga2M7CisJCQkJCWlmIChpKzIgPCBuCisJCQkJCSAmJiAoYyAmIDB4N2YpID09IDAKKwkJCQkJICYmIChidWZbaSsxXSAmIDB4ODApICE9IDAKKwkJCQkJICYmIChidWZbaSsyXSAmIDB4ODApICE9IDAKKwkJCQkJKSB7CisJCQkJCQlrYyA9ICgoYnVmW2krMV0gJiAweDdmKSA8PCA3KSB8IChidWZbaSsyXSAmIDB4N2YpOworCQkJCQkJaSArPSAzOworCQkJCQl9IGVsc2UgeworCQkJCQkJa2MgPSAoYyAmIDB4N2YpOworCQkJCQkJaSsrOworCQkJCQl9CisJCQkJCXByaW50Zigia2V5Y29kZSAlM3UgJXMiLCBrYywgKGMgJiAweDgwKSA/ICJyZWxlYXNlIiA6ICJwcmVzcyIpOworCQkJCX0KKwkJCX0KKwkJCXB1dHMoIlxyIik7CisJCX0KKworCQkvLyByZXN0b3JlIGtleWJvYXJkIG1vZGUKKwkJeGlvY3RsKFNURElOX0ZJTEVOTywgS0RTS0JNT0RFLCAodm9pZCAqKShwdHJkaWZmX3Qpa2Jtb2RlKTsKKwl9CisKKwkvLyByZXN0b3JlIGNvbnNvbGUgc2V0dGluZ3MKKwl4c2V0MSgmdGlvMCk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL0NvbmZpZy5zcmMgYi9jb3JldXRpbHMvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmJlZjFhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL0NvbmZpZy5zcmMKQEAgLTAsMCArMSw3NjMgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIkNvcmV1dGlscyIKKworSU5TRVJUCisKK2NvbmZpZyBDQUwKKwlib29sICJjYWwiCisJZGVmYXVsdCB5CisJaGVscAorCSAgY2FsIGlzIHVzZWQgdG8gZGlzcGxheSBhIG1vbnRobHkgY2FsZW5kYXIuCisKK2NvbmZpZyBDQVRWCisJYm9vbCAiY2F0diIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBEaXNwbGF5IG5vbnByaW50aW5nIGNoYXJhY3RlcnMgYXMgZXNjYXBlIHNlcXVlbmNlcyAobGlrZSBzb21lCisJICBpbXBsZW1lbnRhdGlvbnMnIGNhdCAtdiBvcHRpb24pLgorCitjb25maWcgQ0hHUlAKKwlib29sICJjaGdycCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBjaGdycCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgZ3JvdXAgb3duZXJzaGlwIG9mIGZpbGVzLgorCitjb25maWcgQ0hNT0QKKwlib29sICJjaG1vZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBjaG1vZCBpcyB1c2VkIHRvIGNoYW5nZSB0aGUgYWNjZXNzIHBlcm1pc3Npb24gb2YgZmlsZXMuCisKK2NvbmZpZyBDSE9XTgorCWJvb2wgImNob3duIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGNob3duIGlzIHVzZWQgdG8gY2hhbmdlIHRoZSB1c2VyIGFuZC9vciBncm91cCBvd25lcnNoaXAKKwkgIG9mIGZpbGVzLgorCitjb25maWcgRkVBVFVSRV9DSE9XTl9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQ0hPV04gJiYgTE9OR19PUFRTCisJaGVscAorCSAgRW5hYmxlIHVzZSBvZiBsb25nIG9wdGlvbnMKKworY29uZmlnIENIUk9PVAorCWJvb2wgImNocm9vdCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBjaHJvb3QgaXMgdXNlZCB0byBjaGFuZ2UgdGhlIHJvb3QgZGlyZWN0b3J5IGFuZCBydW4gYSBjb21tYW5kLgorCSAgVGhlIGRlZmF1bHQgY29tbWFuZCBpcyBgL2Jpbi9zaCcuCisKK2NvbmZpZyBDS1NVTQorCWJvb2wgImNrc3VtIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGNrc3VtIGlzIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBDUkMzMiBjaGVja3N1bSBvZiBhIGZpbGUuCisKK2NvbmZpZyBDT01NCisJYm9vbCAiY29tbSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBjb21tIGlzIHVzZWQgdG8gY29tcGFyZSB0d28gZmlsZXMgbGluZSBieSBsaW5lIGFuZCByZXR1cm4KKwkgIGEgdGhyZWUtY29sdW1uIG91dHB1dC4KKworY29uZmlnIENQCisJYm9vbCAiY3AiCisJZGVmYXVsdCB5CisJaGVscAorCSAgY3AgaXMgdXNlZCB0byBjb3B5IGZpbGVzIGFuZCBkaXJlY3Rvcmllcy4KKworY29uZmlnIEZFQVRVUkVfQ1BfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyBmb3IgY3AiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBDUCAmJiBMT05HX09QVFMKKwloZWxwCisJICBFbmFibGUgbG9uZyBvcHRpb25zIGZvciBjcC4KKwkgIEFsc28gYWRkIHN1cHBvcnQgZm9yIC0tcGFyZW50cyBvcHRpb24uCisKK2NvbmZpZyBDVVQKKwlib29sICJjdXQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgY3V0IGlzIHVzZWQgdG8gcHJpbnQgc2VsZWN0ZWQgcGFydHMgb2YgbGluZXMgZnJvbQorCSAgZWFjaCBmaWxlIHRvIHN0ZG91dC4KKworY29uZmlnIERGCisJYm9vbCAiZGYiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZGYgcmVwb3J0cyB0aGUgYW1vdW50IG9mIGRpc2sgc3BhY2UgdXNlZCBhbmQgYXZhaWxhYmxlCisJICBvbiBmaWxlc3lzdGVtcy4KKworY29uZmlnIEZFQVRVUkVfREZfRkFOQ1kKKwlib29sICJFbmFibGUgLWEsIC1pLCAtQiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIERGCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyAtYSwgLWkgYW5kIC1CLgorCisJICAgIC1hIFNob3cgYWxsIGZpbGVzeXN0ZW1zCisJICAgIC1pIElub2RlcworCSAgICAtQiA8U0laRT4gQmxvY2tzaXplCisKK2NvbmZpZyBESVJOQU1FCisJYm9vbCAiZGlybmFtZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBkaXJuYW1lIGlzIHVzZWQgdG8gc3RyaXAgYSBub24tZGlyZWN0b3J5IHN1ZmZpeCBmcm9tCisJICBhIGZpbGUgbmFtZS4KKworY29uZmlnIERPUzJVTklYCisJYm9vbCAiZG9zMnVuaXgvdW5peDJkb3MiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZG9zMnVuaXggaXMgdXNlZCB0byBjb252ZXJ0IGEgdGV4dCBmaWxlIGZyb20gRE9TIGZvcm1hdCB0bworCSAgVU5JWCBmb3JtYXQsIGFuZCB2aWNlIHZlcnNhLgorCitjb25maWcgVU5JWDJET1MKKwlib29sCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBET1MyVU5JWAorCWhlbHAKKwkgIHVuaXgyZG9zIGlzIHVzZWQgdG8gY29udmVydCBhIHRleHQgZmlsZSBmcm9tIFVOSVggZm9ybWF0IHRvCisJICBET1MgZm9ybWF0LCBhbmQgdmljZSB2ZXJzYS4KKworY29uZmlnIERVCisJYm9vbCAiZHUgKGRlZmF1bHQgYmxvY2tzaXplIG9mIDUxMiBieXRlcykiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZHUgaXMgdXNlZCB0byByZXBvcnQgdGhlIGFtb3VudCBvZiBkaXNrIHNwYWNlIHVzZWQKKwkgIGZvciBzcGVjaWZpZWQgZmlsZXMuCisKK2NvbmZpZyBGRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLCisJYm9vbCAiVXNlIGEgZGVmYXVsdCBibG9ja3NpemUgb2YgMTAyNCBieXRlcyAoMUspIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRFUKKwloZWxwCisJICBVc2UgYSBibG9ja3NpemUgb2YgKDFLKSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IDUxMmIuCisKK2NvbmZpZyBFQ0hPCisJYm9vbCAiZWNobyAoYmFzaWMgU3VTdjMgdmVyc2lvbiB0YWtpbmcgbm8gb3B0aW9ucykiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZWNobyBpcyB1c2VkIHRvIHByaW50IGEgc3BlY2lmaWVkIHN0cmluZyB0byBzdGRvdXQuCisKKyMgdGhpcyBlbnRyeSBhbHNvIGFwcGVhcnMgaW4gc2hlbGwvQ29uZmlnLmluLCBuZXh0IHRvIHRoZSBlY2hvIGJ1aWx0aW4KK2NvbmZpZyBGRUFUVVJFX0ZBTkNZX0VDSE8KKwlib29sICJFbmFibGUgZWNobyBvcHRpb25zICgtbiBhbmQgLWUpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRUNITyB8fCBBU0hfQlVJTFRJTl9FQ0hPIHx8IEhVU0gKKwloZWxwCisJICBUaGlzIGFkZHMgb3B0aW9ucyAoLW4gYW5kIC1lKSB0byBlY2hvLgorCitjb25maWcgRU5WCisJYm9vbCAiZW52IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGVudiBpcyB1c2VkIHRvIHNldCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBhbmQgcnVuCisJICBhIGNvbW1hbmQ7IHdpdGhvdXQgb3B0aW9ucyBpdCBkaXNwbGF5cyB0aGUgY3VycmVudAorCSAgZW52aXJvbm1lbnQuCisKK2NvbmZpZyBGRUFUVVJFX0VOVl9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRU5WICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgZW52IGFwcGxldC4KKworY29uZmlnIEVYUEFORAorCWJvb2wgImV4cGFuZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBCeSBkZWZhdWx0LCBjb252ZXJ0IGFsbCB0YWJzIHRvIHNwYWNlcy4KKworY29uZmlnIEZFQVRVUkVfRVhQQU5EX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBFWFBBTkQgJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBleHBhbmQgYXBwbGV0LgorCitjb25maWcgRVhQUgorCWJvb2wgImV4cHIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZXhwciBpcyB1c2VkIHRvIGNhbGN1bGF0ZSBudW1iZXJzIGFuZCBwcmludCB0aGUgcmVzdWx0CisJICB0byBzdGFuZGFyZCBvdXRwdXQuCisKK2NvbmZpZyBFWFBSX01BVEhfU1VQUE9SVF82NAorCWJvb2wgIkV4dGVuZCBQb3NpeCBudW1iZXJzIHN1cHBvcnQgdG8gNjQgYml0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRVhQUgorCWhlbHAKKwkgIEVuYWJsZSA2NC1iaXQgbWF0aCBzdXBwb3J0IGluIHRoZSBleHByIGFwcGxldC4gVGhpcyB3aWxsIG1ha2UKKwkgIHRoZSBhcHBsZXQgc2xpZ2h0bHkgbGFyZ2VyLCBidXQgd2lsbCBhbGxvdyBjb21wdXRhdGlvbiB3aXRoIHZlcnkKKwkgIGxhcmdlIG51bWJlcnMuCisKK2NvbmZpZyBGQUxTRQorCWJvb2wgImZhbHNlIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGZhbHNlIHJldHVybnMgYW4gZXhpdCBjb2RlIG9mIEZBTFNFICgxKS4KKworY29uZmlnIEZPTEQKKwlib29sICJmb2xkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFdyYXAgdGV4dCB0byBmaXQgYSBzcGVjaWZpYyB3aWR0aC4KKworY29uZmlnIEZTWU5DCisJYm9vbCAiZnN5bmMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZnN5bmMgaXMgdXNlZCB0byBmbHVzaCBmaWxlLXJlbGF0ZWQgY2FjaGVkIGJsb2NrcyB0byBkaXNrLgorCitjb25maWcgSEVBRAorCWJvb2wgImhlYWQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgaGVhZCBpcyB1c2VkIHRvIHByaW50IHRoZSBmaXJzdCBzcGVjaWZpZWQgbnVtYmVyIG9mIGxpbmVzCisJICBmcm9tIGZpbGVzLgorCitjb25maWcgRkVBVFVSRV9GQU5DWV9IRUFECisJYm9vbCAiRW5hYmxlIGhlYWQgb3B0aW9ucyAoLWMsIC1xLCBhbmQgLXYpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSEVBRAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyB0aGUgaGVhZCBvcHRpb25zICgtYywgLXEsIGFuZCAtdikuCisKK2NvbmZpZyBJTlNUQUxMCisJYm9vbCAiaW5zdGFsbCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBDb3B5IGZpbGVzIGFuZCBzZXQgYXR0cmlidXRlcy4KKworY29uZmlnIEZFQVRVUkVfSU5TVEFMTF9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSU5TVEFMTCAmJiBMT05HX09QVFMKKwloZWxwCisJICBTdXBwb3J0IGxvbmcgb3B0aW9ucyBmb3IgdGhlIGluc3RhbGwgYXBwbGV0LgorCisjIyMjY29uZmlnIExFTkdUSAorIyMjIwlib29sICJsZW5ndGgiCisjIyMjCWRlZmF1bHQgeQorIyMjIwloZWxwCisjIyMjCSAgbGVuZ3RoIGlzIHVzZWQgdG8gcHJpbnQgb3V0IHRoZSBsZW5ndGggb2YgYSBzcGVjaWZpZWQgc3RyaW5nLgorCitjb25maWcgTE4KKwlib29sICJsbiIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBsbiBpcyB1c2VkIHRvIGNyZWF0ZSBoYXJkIG9yIHNvZnQgbGlua3MgYmV0d2VlbiBmaWxlcy4KKworY29uZmlnIExPR05BTUUKKwlib29sICJsb2duYW1lIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGxvZ25hbWUgaXMgdXNlZCB0byBwcmludCB0aGUgY3VycmVudCB1c2VyJ3MgbG9naW4gbmFtZS4KKworY29uZmlnIExTCisJYm9vbCAibHMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgbHMgaXMgdXNlZCB0byBsaXN0IHRoZSBjb250ZW50cyBvZiBkaXJlY3Rvcmllcy4KKworY29uZmlnIEZFQVRVUkVfTFNfRklMRVRZUEVTCisJYm9vbCAiRW5hYmxlIGZpbGV0eXBpbmcgb3B0aW9ucyAoLXAgYW5kIC1GKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExTCisJaGVscAorCSAgRW5hYmxlIHRoZSBscyBvcHRpb25zICgtcCBhbmQgLUYpLgorCitjb25maWcgRkVBVFVSRV9MU19GT0xMT1dMSU5LUworCWJvb2wgIkVuYWJsZSBzeW1saW5rcyBkZXJlZmVyZW5jaW5nICgtTCkiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBMUworCWhlbHAKKwkgIEVuYWJsZSB0aGUgbHMgb3B0aW9uICgtTCkuCisKK2NvbmZpZyBGRUFUVVJFX0xTX1JFQ1VSU0lWRQorCWJvb2wgIkVuYWJsZSByZWN1cnNpb24gKC1SKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExTCisJaGVscAorCSAgRW5hYmxlIHRoZSBscyBvcHRpb24gKC1SKS4KKworY29uZmlnIEZFQVRVUkVfTFNfU09SVEZJTEVTCisJYm9vbCAiU29ydCB0aGUgZmlsZSBuYW1lcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExTCisJaGVscAorCSAgQWxsb3cgbHMgdG8gc29ydCBmaWxlIG5hbWVzIGFscGhhYmV0aWNhbGx5LgorCitjb25maWcgRkVBVFVSRV9MU19USU1FU1RBTVBTCisJYm9vbCAiU2hvdyBmaWxlIHRpbWVzdGFtcHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBMUworCWhlbHAKKwkgIEFsbG93IGxzIHRvIGRpc3BsYXkgdGltZXN0YW1wcyBmb3IgZmlsZXMuCisKK2NvbmZpZyBGRUFUVVJFX0xTX1VTRVJOQU1FCisJYm9vbCAiU2hvdyB1c2VybmFtZS9ncm91cG5hbWVzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTFMKKwloZWxwCisJICBBbGxvdyBscyB0byBkaXNwbGF5IHVzZXJuYW1lL2dyb3VwbmFtZSBmb3IgZmlsZXMuCisKK2NvbmZpZyBGRUFUVVJFX0xTX0NPTE9SCisJYm9vbCAiQWxsb3cgdXNlIG9mIGNvbG9yIHRvIGlkZW50aWZ5IGZpbGUgdHlwZXMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBMUyAmJiBMT05HX09QVFMKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgdGhlIC0tY29sb3Igb3B0aW9uIHRvIGxzLgorCitjb25maWcgRkVBVFVSRV9MU19DT0xPUl9JU19ERUZBVUxUCisJYm9vbCAiUHJvZHVjZSBjb2xvcmVkIGxzIG91dHB1dCBieSBkZWZhdWx0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9MU19DT0xPUgorCWhlbHAKKwkgIFNheWluZyB5ZXMgaGVyZSB3aWxsIHR1cm4gY29sb3Jpbmcgb24gYnkgZGVmYXVsdCwKKwkgIGV2ZW4gaWYgbm8gIi0tY29sb3IiIG9wdGlvbiBpcyBnaXZlbiB0byB0aGUgbHMgY29tbWFuZC4KKwkgIFRoaXMgaXMgbm90IHJlY29tbWVuZGVkLCBzaW5jZSB0aGUgY29sb3JzIGFyZSBub3QKKwkgIGNvbmZpZ3VyYWJsZSwgYW5kIHRoZSBvdXRwdXQgbWF5IG5vdCBiZSBsZWdpYmxlIG9uCisJICBtYW55IG91dHB1dCBzY3JlZW5zLgorCitjb25maWcgTUQ1U1VNCisJYm9vbCAibWQ1c3VtIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIG1kNXN1bSBpcyB1c2VkIHRvIHByaW50IG9yIGNoZWNrIE1ENSBjaGVja3N1bXMuCisKK2NvbmZpZyBNS0RJUgorCWJvb2wgIm1rZGlyIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIG1rZGlyIGlzIHVzZWQgdG8gY3JlYXRlIGRpcmVjdG9yaWVzIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lcy4KKworY29uZmlnIEZFQVRVUkVfTUtESVJfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE1LRElSICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgbWtkaXIgYXBwbGV0LgorCitjb25maWcgTUtGSUZPCisJYm9vbCAibWtmaWZvIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIG1rZmlmbyBpcyB1c2VkIHRvIGNyZWF0ZSBGSUZPcyAobmFtZWQgcGlwZXMpLgorCSAgVGhlIGBta25vZCcgcHJvZ3JhbSBjYW4gYWxzbyBjcmVhdGUgRklGT3MuCisKK2NvbmZpZyBNS05PRAorCWJvb2wgIm1rbm9kIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIG1rbm9kIGlzIHVzZWQgdG8gY3JlYXRlIEZJRk9zIG9yIGJsb2NrL2NoYXJhY3RlciBzcGVjaWFsCisJICBmaWxlcyB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZXMuCisKK2NvbmZpZyBNVgorCWJvb2wgIm12IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIG12IGlzIHVzZWQgdG8gbW92ZSBvciByZW5hbWUgZmlsZXMgb3IgZGlyZWN0b3JpZXMuCisKK2NvbmZpZyBGRUFUVVJFX01WX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBNViAmJiBMT05HX09QVFMKKwloZWxwCisJICBTdXBwb3J0IGxvbmcgb3B0aW9ucyBmb3IgdGhlIG12IGFwcGxldC4KKworY29uZmlnIE5JQ0UKKwlib29sICJuaWNlIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIG5pY2UgcnVucyBhIHByb2dyYW0gd2l0aCBtb2RpZmllZCBzY2hlZHVsaW5nIHByaW9yaXR5LgorCitjb25maWcgTk9IVVAKKwlib29sICJub2h1cCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBydW4gYSBjb21tYW5kIGltbXVuZSB0byBoYW5ndXBzLCB3aXRoIG91dHB1dCB0byBhIG5vbi10dHkuCisKK2NvbmZpZyBPRAorCWJvb2wgIm9kIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIG9kIGlzIHVzZWQgdG8gZHVtcCBiaW5hcnkgZmlsZXMgaW4gb2N0YWwgYW5kIG90aGVyIGZvcm1hdHMuCisKK2NvbmZpZyBQUklOVEVOVgorCWJvb2wgInByaW50ZW52IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHByaW50ZW52IGlzIHVzZWQgdG8gcHJpbnQgYWxsIG9yIHBhcnQgb2YgZW52aXJvbm1lbnQuCisKK2NvbmZpZyBQUklOVEYKKwlib29sICJwcmludGYiCisJZGVmYXVsdCB5CisJaGVscAorCSAgcHJpbnRmIGlzIHVzZWQgdG8gZm9ybWF0IGFuZCBwcmludCBzcGVjaWZpZWQgc3RyaW5ncy4KKwkgIEl0J3Mgc2ltaWxhciB0byBgZWNobycgZXhjZXB0IGl0IGhhcyBtb3JlIG9wdGlvbnMuCisKK2NvbmZpZyBQV0QKKwlib29sICJwd2QiCisJZGVmYXVsdCB5CisJaGVscAorCSAgcHdkIGlzIHVzZWQgdG8gcHJpbnQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorCitjb25maWcgUkVBRExJTksKKwlib29sICJyZWFkbGluayIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIHByb2dyYW0gcmVhZHMgYSBzeW1ib2xpYyBsaW5rIGFuZCByZXR1cm5zIHRoZSBuYW1lCisJICBvZiB0aGUgZmlsZSBpdCBwb2ludHMgdG8KKworY29uZmlnIEZFQVRVUkVfUkVBRExJTktfRk9MTE9XCisJYm9vbCAiRW5hYmxlIGNhbm9uaWNhbGl6YXRpb24gYnkgZm9sbG93aW5nIGFsbCBzeW1saW5rcyAoLWYpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUkVBRExJTksKKwloZWxwCisJICBFbmFibGUgdGhlIHJlYWRsaW5rIG9wdGlvbiAoLWYpLgorCitjb25maWcgUkVBTFBBVEgKKwlib29sICJyZWFscGF0aCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBSZXR1cm4gdGhlIGNhbm9uaWNhbGl6ZWQgYWJzb2x1dGUgcGF0aG5hbWUuCisJICBUaGlzIGlzbid0IHByb3ZpZGVkIGJ5IEdOVSBzaGVsbHV0aWxzLCBidXQgd2hlcmUgZWxzZSBkb2VzIGl0IGJlbG9uZy4KKworY29uZmlnIFJNCisJYm9vbCAicm0iCisJZGVmYXVsdCB5CisJaGVscAorCSAgcm0gaXMgdXNlZCB0byByZW1vdmUgZmlsZXMgb3IgZGlyZWN0b3JpZXMuCisKK2NvbmZpZyBSTURJUgorCWJvb2wgInJtZGlyIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHJtZGlyIGlzIHVzZWQgdG8gcmVtb3ZlIGVtcHR5IGRpcmVjdG9yaWVzLgorCitjb25maWcgRkVBVFVSRV9STURJUl9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUk1ESVIgJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBybWRpciBhcHBsZXQsIGluY2x1ZGluZworCSAgLS1pZ25vcmUtZmFpbC1vbi1ub24tZW1wdHkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBHTlUgcm1kaXIuCisKK2NvbmZpZyBTRVEKKwlib29sICJzZXEiCisJZGVmYXVsdCB5CisJaGVscAorCSAgcHJpbnQgYSBzZXF1ZW5jZSBvZiBudW1iZXJzCisKK2NvbmZpZyBTSEExU1VNCisJYm9vbCAic2hhMXN1bSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBDb21wdXRlIGFuZCBjaGVjayBTSEExIG1lc3NhZ2UgZGlnZXN0CisKK2NvbmZpZyBTSEEyNTZTVU0KKwlib29sICJzaGEyNTZzdW0iCisJZGVmYXVsdCB5CisJaGVscAorCSAgQ29tcHV0ZSBhbmQgY2hlY2sgU0hBMjU2IG1lc3NhZ2UgZGlnZXN0CisKK2NvbmZpZyBTSEE1MTJTVU0KKwlib29sICJzaGE1MTJzdW0iCisJZGVmYXVsdCB5CisJaGVscAorCSAgQ29tcHV0ZSBhbmQgY2hlY2sgU0hBNTEyIG1lc3NhZ2UgZGlnZXN0CisKK2NvbmZpZyBTSEEzU1VNCisJYm9vbCAic2hhM3N1bSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBDb21wdXRlIGFuZCBjaGVjayBTSEEzICg1MTItYml0KSBtZXNzYWdlIGRpZ2VzdAorCitjb25maWcgU0xFRVAKKwlib29sICJzbGVlcCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBzbGVlcCBpcyB1c2VkIHRvIHBhdXNlIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2Ygc2Vjb25kcy4KKwkgIEl0IGNvbWVzIGluIDMgdmVyc2lvbnM6CisJICAtIHNtYWxsOiB0YWtlcyBvbmUgaW50ZWdlciBwYXJhbWV0ZXIKKwkgIC0gZmFuY3k6IHRha2VzIG11bHRpcGxlIGludGVnZXIgYXJndW1lbnRzIHdpdGggc3VmZml4ZXM6CisJICAgIHNsZWVwIDFkIDJoIDNtIDE1cworCSAgLSBmYW5jeSB3aXRoIGZyYWN0aW9uYWwgbnVtYmVyczoKKwkgICAgc2xlZXAgMi4zcyA0LjVoIHNsZWVwcyBmb3IgMTYyMDIuMyBzZWNvbmRzCisJICBMYXN0IG9uZSBpcyAidGhlIG1vc3QgY29tcGF0aWJsZSIgd2l0aCBjb3JldXRpbHMgc2xlZXAsCisJICBidXQgaXQgYWRkcyBhcm91bmQgMWsgb2YgY29kZS4KKworY29uZmlnIEZFQVRVUkVfRkFOQ1lfU0xFRVAKKwlib29sICJFbmFibGUgbXVsdGlwbGUgYXJndW1lbnRzIGFuZCBzL20vaC9kIHN1ZmZpeGVzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU0xFRVAKKwloZWxwCisJICBBbGxvdyBzbGVlcCB0byBwYXVzZSBmb3Igc3BlY2lmaWVkIG1pbnV0ZXMsIGhvdXJzLCBhbmQgZGF5cy4KKworY29uZmlnIEZFQVRVUkVfRkxPQVRfU0xFRVAKKwlib29sICJFbmFibGUgZnJhY3Rpb25hbCBhcmd1bWVudHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0ZBTkNZX1NMRUVQCisJaGVscAorCSAgQWxsb3cgZm9yIGZyYWN0aW9uYWwgbnVtZXJpYyBwYXJhbWV0ZXJzLgorCitjb25maWcgU09SVAorCWJvb2wgInNvcnQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgc29ydCBpcyB1c2VkIHRvIHNvcnQgbGluZXMgb2YgdGV4dCBpbiBzcGVjaWZpZWQgZmlsZXMuCisKK2NvbmZpZyBGRUFUVVJFX1NPUlRfQklHCisJYm9vbCAiRnVsbCBTdVN2MyBjb21wbGlhbnQgc29ydCAoc3VwcG9ydCAta3Rjc2JkZmlvemdNKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNPUlQKKwloZWxwCisJICBXaXRob3V0IHRoaXMsIHNvcnQgb25seSBzdXBwb3J0cyAtciwgLXUsIGFuZCBhbiBpbnRlZ2VyIHZlcnNpb24KKwkgIG9mIC1uLiBTZWxlY3RpbmcgdGhpcyBhZGRzIHNvcnQga2V5cywgZmxvYXRpbmcgcG9pbnQgc3VwcG9ydCwgYW5kCisJICBtb3JlLiBUaGlzIGFkZHMgYSBsaXR0bGUgb3ZlciAzayB0byBhIG5vbnN0YXRpYyBidWlsZCBvbiB4ODYuCisKKwkgIFRoZSBTdVN2MyBzb3J0IHN0YW5kYXJkIGlzIGF2YWlsYWJsZSBhdDoKKwkgIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvc29ydC5odG1sCisKK2NvbmZpZyBTUExJVAorCWJvb2wgInNwbGl0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHNwbGl0IGEgZmlsZSBpbnRvIHBpZWNlcy4KKworY29uZmlnIEZFQVRVUkVfU1BMSVRfRkFOQ1kKKwlib29sICJGYW5jeSBleHRlbnNpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU1BMSVQKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3IgZmVhdHVyZXMgbm90IHJlcXVpcmVkIGJ5IFNVU3YzLgorCSAgU3VwcG9ydHMgYWRkaXRpb25hbCBzdWZmaXhlcyAnYicgZm9yIDUxMiBieXRlcywKKwkgICdnJyBmb3IgMUdpQiBmb3IgdGhlIC1iIG9wdGlvbi4KKworY29uZmlnIFNUQVQKKwlib29sICJzdGF0IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWCAjIHN0YXRmcygpCisJaGVscAorCSAgZGlzcGxheSBmaWxlIG9yIGZpbGVzeXN0ZW0gc3RhdHVzLgorCitjb25maWcgRkVBVFVSRV9TVEFUX0ZPUk1BVAorCWJvb2wgIkVuYWJsZSBjdXN0b20gZm9ybWF0cyAoLWMpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU1RBVAorCWhlbHAKKwkgIFdpdGhvdXQgdGhpcywgc3RhdCB3aWxsIG5vdCBzdXBwb3J0IHRoZSAnLWMgZm9ybWF0JyBvcHRpb24gd2hlcmUKKwkgIHVzZXJzIGNhbiBwYXNzIGEgY3VzdG9tIGZvcm1hdCBzdHJpbmcgZm9yIG91dHB1dC4gVGhpcyBhZGRzIGFib3V0CisJICA3ayB0byBhIG5vbnN0YXRpYyBidWlsZCBvbiBhbWQ2NC4KKworY29uZmlnIFNUVFkKKwlib29sICJzdHR5IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHN0dHkgaXMgdXNlZCB0byBjaGFuZ2UgYW5kIHByaW50IHRlcm1pbmFsIGxpbmUgc2V0dGluZ3MuCisKK2NvbmZpZyBTVU0KKwlib29sICJzdW0iCisJZGVmYXVsdCB5CisJaGVscAorCSAgY2hlY2tzdW0gYW5kIGNvdW50IHRoZSBibG9ja3MgaW4gYSBmaWxlCisKK2NvbmZpZyBUQUMKKwlib29sICJ0YWMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgdGFjIGlzIHVzZWQgdG8gY29uY2F0ZW5hdGUgYW5kIHByaW50IGZpbGVzIGluIHJldmVyc2UuCisKK2NvbmZpZyBUQUlMCisJYm9vbCAidGFpbCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB0YWlsIGlzIHVzZWQgdG8gcHJpbnQgdGhlIGxhc3Qgc3BlY2lmaWVkIG51bWJlciBvZiBsaW5lcworCSAgZnJvbSBmaWxlcy4KKworY29uZmlnIEZFQVRVUkVfRkFOQ1lfVEFJTAorCWJvb2wgIkVuYWJsZSBleHRyYSB0YWlsIG9wdGlvbnMgKC1xLCAtcywgLXYsIGFuZCAtRikiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBUQUlMCisJaGVscAorCSAgVGhlIG9wdGlvbnMgKC1xLCAtcywgLXYgYW5kIC1GKSBhcmUgcHJvdmlkZWQgYnkgR05VIHRhaWwsIGJ1dAorCSAgYXJlIG5vdCBzcGVjaWZpYyBpbiB0aGUgU1VTdjMgc3RhbmRhcmQuCisKKwkgICAgLXEgICAgICBOZXZlciBvdXRwdXQgaGVhZGVycyBnaXZpbmcgZmlsZSBuYW1lcworCSAgICAtcyBTRUMgIFdhaXQgU0VDIHNlY29uZHMgYmV0d2VlbiByZWFkcyB3aXRoIC1mCisJICAgIC12ICAgICAgQWx3YXlzIG91dHB1dCBoZWFkZXJzIGdpdmluZyBmaWxlIG5hbWVzCisJICAgIC1GICAgICAgU2FtZSBhcyAtZiwgYnV0IGtlZXAgcmV0cnlpbmcKKworY29uZmlnIFRFRQorCWJvb2wgInRlZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB0ZWUgaXMgdXNlZCB0byByZWFkIGZyb20gc3RhbmRhcmQgaW5wdXQgYW5kIHdyaXRlCisJICB0byBzdGFuZGFyZCBvdXRwdXQgYW5kIGZpbGVzLgorCitjb25maWcgRkVBVFVSRV9URUVfVVNFX0JMT0NLX0lPCisJYm9vbCAiRW5hYmxlIGJsb2NrIEkvTyAobGFyZ2VyL2Zhc3RlcikgaW5zdGVhZCBvZiBieXRlIEkvTyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRFRQorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIG9wdGlvbiBmb3IgYSBmYXN0ZXIgdGVlLCBhdCBleHBlbnNlIG9mIHNpemUuCisKK2NvbmZpZyBUUlVFCisJYm9vbCAidHJ1ZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB0cnVlIHJldHVybnMgYW4gZXhpdCBjb2RlIG9mIFRSVUUgKDApLgorCitjb25maWcgVFRZCisJYm9vbCAidHR5IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHR0eSBpcyB1c2VkIHRvIHByaW50IHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRlcm1pbmFsIHRvCisJICBzdGFuZGFyZCBvdXRwdXQuCisKK2NvbmZpZyBVTkFNRQorCWJvb2wgInVuYW1lIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHVuYW1lIGlzIHVzZWQgdG8gcHJpbnQgc3lzdGVtIGluZm9ybWF0aW9uLgorCitjb25maWcgVU5BTUVfT1NOQU1FCisJc3RyaW5nICJPcGVyYXRpbmcgc3lzdGVtIG5hbWUiCisJZGVmYXVsdCAiR05VL0xpbnV4IgorCWRlcGVuZHMgb24gVU5BTUUKKwloZWxwCisJICBTZXRzIHRoZSBvcGVyYXRpbmcgc3lzdGVtIG5hbWUgcmVwb3J0ZWQgYnkgdW5hbWUgLW8uICBUaGUKKwkgIGRlZmF1bHQgaXMgIkdOVS9MaW51eCIuCisKK2NvbmZpZyBVTkVYUEFORAorCWJvb2wgInVuZXhwYW5kIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEJ5IGRlZmF1bHQsIGNvbnZlcnQgb25seSBsZWFkaW5nIHNlcXVlbmNlcyBvZiBibGFua3MgdG8gdGFicy4KKworY29uZmlnIEZFQVRVUkVfVU5FWFBBTkRfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFVORVhQQU5EICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgdW5leHBhbmQgYXBwbGV0LgorCitjb25maWcgVU5JUQorCWJvb2wgInVuaXEiCisJZGVmYXVsdCB5CisJaGVscAorCSAgdW5pcSBpcyB1c2VkIHRvIHJlbW92ZSBkdXBsaWNhdGUgbGluZXMgZnJvbSBhIHNvcnRlZCBmaWxlLgorCitjb25maWcgVVNMRUVQCisJYm9vbCAidXNsZWVwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHVzbGVlcCBpcyB1c2VkIHRvIHBhdXNlIGZvciBhIHNwZWNpZmllZCBudW1iZXIgb2YgbWljcm9zZWNvbmRzLgorCitjb25maWcgVVVERUNPREUKKwlib29sICJ1dWRlY29kZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB1dWRlY29kZSBpcyB1c2VkIHRvIGRlY29kZSBhIHV1ZW5jb2RlZCBmaWxlLgorCitjb25maWcgVVVFTkNPREUKKwlib29sICJ1dWVuY29kZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB1dWVuY29kZSBpcyB1c2VkIHRvIHV1ZW5jb2RlIGEgZmlsZS4KKworY29uZmlnIFdDCisJYm9vbCAid2MiCisJZGVmYXVsdCB5CisJaGVscAorCSAgd2MgaXMgdXNlZCB0byBwcmludCB0aGUgbnVtYmVyIG9mIGJ5dGVzLCB3b3JkcywgYW5kIGxpbmVzLAorCSAgaW4gc3BlY2lmaWVkIGZpbGVzLgorCitjb25maWcgRkVBVFVSRV9XQ19MQVJHRQorCWJvb2wgIlN1cHBvcnQgdmVyeSBsYXJnZSBmaWxlcyBpbiB3YyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFdDCisJaGVscAorCSAgVXNlICJ1bnNpZ25lZCBsb25nIGxvbmciIGluIHdjIGZvciBjb3VudGVyIHZhcmlhYmxlcy4KKworY29uZmlnIFdIT0FNSQorCWJvb2wgIndob2FtaSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB3aG9hbWkgaXMgdXNlZCB0byBwcmludCB0aGUgdXNlcm5hbWUgb2YgdGhlIGN1cnJlbnQKKwkgIHVzZXIgaWQgKHNhbWUgYXMgaWQgLXVuKS4KKworY29uZmlnIFlFUworCWJvb2wgInllcyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB5ZXMgaXMgdXNlZCB0byByZXBlYXRlZGx5IG91dHB1dCBhIHNwZWNpZmljIHN0cmluZywgb3IKKwkgIHRoZSBkZWZhdWx0IHN0cmluZyBgeScuCisKK2NvbW1lbnQgIkNvbW1vbiBvcHRpb25zIgorCitjb25maWcgRkVBVFVSRV9WRVJCT1NFCisJYm9vbCAiU3VwcG9ydCB2ZXJib3NlIG9wdGlvbnMgKHVzdWFsbHkgLXYpIGZvciB2YXJpb3VzIGFwcGxldHMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgRW5hYmxlIGNwIC12LCBybSAtdiBhbmQgc2ltaWxhciBtZXNzYWdlcy4KKwkgIEFsc28gZW5hYmxlcyBsb25nIG9wdGlvbiAoLS12ZXJib3NlKSBpZiBpdCBleGlzdHMuCisJICBXaXRob3V0IHRoaXMgb3B0aW9uLCAtdiBpcyBhY2NlcHRlZCBidXQgaWdub3JlZC4KKworY29tbWVudCAiQ29tbW9uIG9wdGlvbnMgZm9yIGNwIGFuZCBtdiIKKwlkZXBlbmRzIG9uIENQIHx8IE1WCisKK2NvbmZpZyBGRUFUVVJFX1BSRVNFUlZFX0hBUkRMSU5LUworCWJvb2wgIlByZXNlcnZlIGhhcmQgbGlua3MiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBDUCB8fCBNVgorCWhlbHAKKwkgIEFsbG93IGNwIGFuZCBtdiB0byBwcmVzZXJ2ZSBoYXJkIGxpbmtzLgorCitjb21tZW50ICJDb21tb24gb3B0aW9ucyBmb3IgbHMsIG1vcmUgYW5kIHRlbG5ldCIKKwlkZXBlbmRzIG9uIExTIHx8IE1PUkUgfHwgVEVMTkVUCisKK2NvbmZpZyBGRUFUVVJFX0FVVE9XSURUSAorCWJvb2wgIkNhbGN1bGF0ZSB0ZXJtaW5hbCAmIGNvbHVtbiB3aWR0aHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBMUyB8fCBNT1JFIHx8IFRFTE5FVAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFsbG93cyB1dGlsaXRpZXMgc3VjaCBhcyAnbHMnLCAnbW9yZScgYW5kICd0ZWxuZXQnCisJICB0byBkZXRlcm1pbmUgdGhlIHdpZHRoIG9mIHRoZSBzY3JlZW4sIHdoaWNoIGNhbiBhbGxvdyB0aGVtIHRvCisJICBkaXNwbGF5IGFkZGl0aW9uYWwgdGV4dCBvciBhdm9pZCB3cmFwcGluZyB0ZXh0IG9udG8gdGhlIG5leHQgbGluZS4KKwkgIElmIHlvdSBsZWF2ZSB0aGlzIGRpc2FibGVkLCB5b3VyIHV0aWxpdGllcyB3aWxsIGJlIGVzcGVjaWFsbHkKKwkgIHByaW1pdGl2ZSBhbmQgd2lsbCBiZSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNjcmVlbiB3aWR0aC4KKworY29tbWVudCAiQ29tbW9uIG9wdGlvbnMgZm9yIGRmLCBkdSwgbHMiCisJZGVwZW5kcyBvbiBERiB8fCBEVSB8fCBMUworCitjb25maWcgRkVBVFVSRV9IVU1BTl9SRUFEQUJMRQorCWJvb2wgIlN1cHBvcnQgZm9yIGh1bWFuIHJlYWRhYmxlIG91dHB1dCAoZXhhbXBsZSAxM2ssIDIzTSwgMjM1RykiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBERiB8fCBEVSB8fCBMUworCWhlbHAKKwkgIEFsbG93IGRmLCBkdSwgYW5kIGxzIHRvIGhhdmUgaHVtYW4gcmVhZGFibGUgb3V0cHV0LgorCitjb21tZW50ICJDb21tb24gb3B0aW9ucyBmb3IgbWQ1c3VtLCBzaGExc3VtLCBzaGEyNTZzdW0sIHNoYTUxMnN1bSwgc2hhM3N1bSIKKwlkZXBlbmRzIG9uIE1ENVNVTSB8fCBTSEExU1VNIHx8IFNIQTI1NlNVTSB8fCBTSEE1MTJTVU0gfHwgU0hBM1NVTQorCitjb25maWcgRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0sKKwlib29sICJFbmFibGUgLWMsIC1zIGFuZCAtdyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTUQ1U1VNIHx8IFNIQTFTVU0gfHwgU0hBMjU2U1VNIHx8IFNIQTUxMlNVTSB8fCBTSEEzU1VNCisJaGVscAorCSAgRW5hYmxpbmcgdGhlIC1jIG9wdGlvbnMgYWxsb3dzIGZpbGVzIHRvIGJlIGNoZWNrZWQKKwkgIGFnYWluc3QgcHJlLWNhbGN1bGF0ZWQgaGFzaCB2YWx1ZXMuCisKKwkgIC1zIGFuZCAtdyBhcmUgdXNlZnVsIG9wdGlvbnMgd2hlbiB2ZXJpZnlpbmcgY2hlY2tzdW1zLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvS2J1aWxkLnNyYyBiL2NvcmV1dGlscy9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYzA3NWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDgzIEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGlicy15CQkJKz0gbGliY29yZXV0aWxzLworCitsaWIteTo9CisKK0lOU0VSVAorbGliLSQoQ09ORklHX0NBTCkgICAgICAgKz0gY2FsLm8KK2xpYi0kKENPTkZJR19DQVRWKSAgICAgICs9IGNhdHYubworbGliLSQoQ09ORklHX0NIR1JQKSAgICAgKz0gY2hncnAubyBjaG93bi5vCitsaWItJChDT05GSUdfQ0hNT0QpICAgICArPSBjaG1vZC5vCitsaWItJChDT05GSUdfQ0hPV04pICAgICArPSBjaG93bi5vCitsaWItJChDT05GSUdfQUREVVNFUikgICArPSBjaG93bi5vICMgdXNlZCBieSBhZGR1c2VyCitsaWItJChDT05GSUdfQURER1JPVVApICArPSBjaG93bi5vICMgdXNlZCBieSBhZGR1c2VyCitsaWItJChDT05GSUdfQ0hST09UKSAgICArPSBjaHJvb3QubworbGliLSQoQ09ORklHX0NLU1VNKSAgICAgKz0gY2tzdW0ubworbGliLSQoQ09ORklHX0NPTU0pICAgICAgKz0gY29tbS5vCitsaWItJChDT05GSUdfQ1ApICAgICAgICArPSBjcC5vCitsaWItJChDT05GSUdfQ1VUKSAgICAgICArPSBjdXQubworbGliLSQoQ09ORklHX0REKSAgICAgICAgKz0gZGQubworbGliLSQoQ09ORklHX0RGKSAgICAgICAgKz0gZGYubworbGliLSQoQ09ORklHX0RJUk5BTUUpICAgKz0gZGlybmFtZS5vCitsaWItJChDT05GSUdfRE9TMlVOSVgpICArPSBkb3MydW5peC5vCitsaWItJChDT05GSUdfRFUpICAgICAgICArPSBkdS5vCitsaWItJChDT05GSUdfRUNITykgICAgICArPSBlY2hvLm8KK2xpYi0kKENPTkZJR19BU0gpICAgICAgICs9IGVjaG8ubyAjIHVzZWQgYnkgYXNoCitsaWItJChDT05GSUdfSFVTSCkgICAgICArPSBlY2hvLm8gIyB1c2VkIGJ5IGh1c2gKK2xpYi0kKENPTkZJR19FTlYpICAgICAgICs9IGVudi5vCitsaWItJChDT05GSUdfRVhQUikgICAgICArPSBleHByLm8KK2xpYi0kKENPTkZJR19FWFBBTkQpICAgICs9IGV4cGFuZC5vCitsaWItJChDT05GSUdfRkFMU0UpICAgICArPSBmYWxzZS5vCitsaWItJChDT05GSUdfRk9MRCkgICAgICArPSBmb2xkLm8KK2xpYi0kKENPTkZJR19GU1lOQykgICAgICs9IGZzeW5jLm8KK2xpYi0kKENPTkZJR19JTlNUQUxMKSAgICs9IGluc3RhbGwubworI2xpYi0kKENPTkZJR19MRU5HVEgpICAgICs9IGxlbmd0aC5vCitsaWItJChDT05GSUdfTE4pICAgICAgICArPSBsbi5vCitsaWItJChDT05GSUdfTE9HTkFNRSkgICArPSBsb2duYW1lLm8KK2xpYi0kKENPTkZJR19MUykgICAgICAgICs9IGxzLm8KK2xpYi0kKENPTkZJR19GVFBEKSAgICAgICs9IGxzLm8KK2xpYi0kKENPTkZJR19NRDVTVU0pICAgICs9IG1kNV9zaGExX3N1bS5vCitsaWItJChDT05GSUdfTUtESVIpICAgICArPSBta2Rpci5vCitsaWItJChDT05GSUdfTUtGSUZPKSAgICArPSBta2ZpZm8ubworbGliLSQoQ09ORklHX01LTk9EKSAgICAgKz0gbWtub2QubworbGliLSQoQ09ORklHX01WKSAgICAgICAgKz0gbXYubworbGliLSQoQ09ORklHX05JQ0UpICAgICAgKz0gbmljZS5vCitsaWItJChDT05GSUdfTk9IVVApICAgICArPSBub2h1cC5vCitsaWItJChDT05GSUdfT0QpICAgICAgICArPSBvZC5vCitsaWItJChDT05GSUdfUFJJTlRFTlYpICArPSBwcmludGVudi5vCitsaWItJChDT05GSUdfUFJJTlRGKSAgICArPSBwcmludGYubworbGliLSQoQ09ORklHX0FTSF9CVUlMVElOX1BSSU5URikgKz0gcHJpbnRmLm8KK2xpYi0kKENPTkZJR19QV0QpICAgICAgICs9IHB3ZC5vCitsaWItJChDT05GSUdfUkVBRExJTkspICArPSByZWFkbGluay5vCitsaWItJChDT05GSUdfUkVBTFBBVEgpICArPSByZWFscGF0aC5vCitsaWItJChDT05GSUdfUk0pICAgICAgICArPSBybS5vCitsaWItJChDT05GSUdfUk1ESVIpICAgICArPSBybWRpci5vCitsaWItJChDT05GSUdfU0VRKSAgICAgICArPSBzZXEubworbGliLSQoQ09ORklHX1NIQTFTVU0pICAgKz0gbWQ1X3NoYTFfc3VtLm8KK2xpYi0kKENPTkZJR19TSEEyNTZTVU0pICs9IG1kNV9zaGExX3N1bS5vCitsaWItJChDT05GSUdfU0hBNTEyU1VNKSArPSBtZDVfc2hhMV9zdW0ubworbGliLSQoQ09ORklHX1NIQTNTVU0pICAgKz0gbWQ1X3NoYTFfc3VtLm8KK2xpYi0kKENPTkZJR19TTEVFUCkgICAgICs9IHNsZWVwLm8KK2xpYi0kKENPTkZJR19TUExJVCkgICAgICs9IHNwbGl0Lm8KK2xpYi0kKENPTkZJR19TT1JUKSAgICAgICs9IHNvcnQubworbGliLSQoQ09ORklHX1NUQVQpICAgICAgKz0gc3RhdC5vCitsaWItJChDT05GSUdfU1RUWSkgICAgICArPSBzdHR5Lm8KK2xpYi0kKENPTkZJR19TVU0pICAgICAgICs9IHN1bS5vCitsaWItJChDT05GSUdfVEFDKSAgICAgICArPSB0YWMubworbGliLSQoQ09ORklHX1RFRSkgICAgICAgKz0gdGVlLm8KK2xpYi0kKENPTkZJR19UUlVFKSAgICAgICs9IHRydWUubworbGliLSQoQ09ORklHX1RUWSkgICAgICAgKz0gdHR5Lm8KK2xpYi0kKENPTkZJR19VTkFNRSkgICAgICs9IHVuYW1lLm8KK2xpYi0kKENPTkZJR19VTkVYUEFORCkgICs9IGV4cGFuZC5vCitsaWItJChDT05GSUdfVU5JUSkgICAgICArPSB1bmlxLm8KK2xpYi0kKENPTkZJR19VU0xFRVApICAgICs9IHVzbGVlcC5vCitsaWItJChDT05GSUdfVVVERUNPREUpICArPSB1dWRlY29kZS5vCitsaWItJChDT05GSUdfVVVFTkNPREUpICArPSB1dWVuY29kZS5vCitsaWItJChDT05GSUdfV0MpICAgICAgICArPSB3Yy5vCitsaWItJChDT05GSUdfV0hPQU1JKSAgICArPSB3aG9hbWkubworbGliLSQoQ09ORklHX1lFUykgICAgICAgKz0geWVzLm8KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9iYXNlbmFtZS5jIGIvY29yZXV0aWxzL2Jhc2VuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIwYzk3MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9iYXNlbmFtZS5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgYmFzZW5hbWUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBNYXIgMTYsIDIwMDMgICAgICBNYW51ZWwgTm92b2EgSUlJICAgKG1qbjNAY29kZXBvZXQub3JnKQorICoKKyAqIENoYW5nZXM6CisgKiAxKSBOb3cgY2hlY2tzIGZvciB0b28gbWFueSBhcmdzLiAgTmVlZCBhdCBsZWFzdCBvbmUgYW5kIGF0IG1vc3QgdHdvLgorICogMikgRG9uJ3QgY2hlY2sgZm9yIG9wdGlvbnMsIGFzIHBlciBTVVN2My4KKyAqIDMpIFNhdmUgc29tZSBzcGFjZSBieSB1c2luZyBzdHJjbXAoKS4gIENhbGxpbmcgc3RybmNtcCgpIGhlcmUgd2FzIHNpbGx5LgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudCAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9iYXNlbmFtZS5odG1sICovCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19CQVNFTkFNRSkgKz0gYmFzZW5hbWUubworCisvL2NvbmZpZzpjb25maWcgQkFTRU5BTUUKKy8vY29uZmlnOglib29sICJiYXNlbmFtZSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBiYXNlbmFtZSBpcyB1c2VkIHRvIHN0cmlwIHRoZSBkaXJlY3RvcnkgYW5kIHN1ZmZpeCBmcm9tIGZpbGVuYW1lcywKKy8vY29uZmlnOgkgIGxlYXZpbmcganVzdCB0aGUgZmlsZW5hbWUgaXRzZWxmLiBFbmFibGUgdGhpcyBvcHRpb24gaWYgeW91IHdpc2gKKy8vY29uZmlnOgkgIHRvIGVuYWJsZSB0aGUgJ2Jhc2VuYW1lJyB1dGlsaXR5LgorCisvL3VzYWdlOiNkZWZpbmUgYmFzZW5hbWVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkZJTEUgW1NVRkZJWF0iCisvL3VzYWdlOiNkZWZpbmUgYmFzZW5hbWVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTdHJpcCBkaXJlY3RvcnkgcGF0aCBhbmQgLlNVRkZJWCBmcm9tIEZJTEUiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGJhc2VuYW1lX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGJhc2VuYW1lIC91c3IvbG9jYWwvYmluL2Zvb1xuIgorLy91c2FnZTogICAgICAgImZvb1xuIgorLy91c2FnZTogICAgICAgIiQgYmFzZW5hbWUgL3Vzci9sb2NhbC9iaW4vXG4iCisvL3VzYWdlOiAgICAgICAiYmluXG4iCisvL3VzYWdlOiAgICAgICAiJCBiYXNlbmFtZSAvZm9vL2Jhci50eHQgLnR4dFxuIgorLy91c2FnZTogICAgICAgImJhciIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0ZPUksgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK2ludCBiYXNlbmFtZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgYmFzZW5hbWVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc2l6ZV90IG0sIG47CisJY2hhciAqczsKKworCWlmIChhcmd2WzFdICYmIHN0cmNtcChhcmd2WzFdLCAiLS0iKSA9PSAwKSB7CisJCWFyZ3YrKzsKKwkJYXJnYy0tOworCX0KKworCWlmICgodW5zaWduZWQpKGFyZ2MtMikgPj0gMikgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJLyogSXQgc2hvdWxkIHN0cmlwIHNsYXNoOiAvYWJjL2RlZi8gLT4gZGVmICovCisJcyA9IGJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50X3N0cmlwKCorK2FyZ3YpOworCisJbSA9IHN0cmxlbihzKTsKKwlpZiAoKisrYXJndikgeworCQluID0gc3RybGVuKCphcmd2KTsKKwkJaWYgKChtID4gbikgJiYgKHN0cmNtcChzK20tbiwgKmFyZ3YpID09IDApKSB7CisJCQltIC09IG47CisJCQkvKnNbbV0gPSAnXDAnOyAtIHJlZHVuZGFudCAqLworCQl9CisJfQorCisJLyogcHV0cyhzKSB3aWxsIGRvLCBidXQgd2UgY2FuIGRvIHdpdGhvdXQgc3RkaW8gdGhpcyB3YXk6ICovCisJc1ttKytdID0gJ1xuJzsKKwkvKiBOQjogIT0gaXMgY29ycmVjdCBoZXJlOiAqLworCXJldHVybiBmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sIHMsIG0pICE9IChzc2l6ZV90KW07Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvY2FsLmMgYi9jb3JldXRpbHMvY2FsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjNDZiMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9jYWwuYwpAQCAtMCwwICsxLDM4MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ2FsZW5kYXIgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBTZWUgb3JpZ2luYWwgY29weXJpZ2h0IGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgd2l0aCAtaiBhbmQgLXkgZXh0ZW5zaW9ucyAoZnJvbSB1dGlsLWxpbnV4KS4gKi8KKy8qIEJCX0FVRElUIEJVRzogVGhlIG91dHB1dCBvZiAnY2FsIC1qIDE3NTInIGlzIGluY29ycmVjdC4gIFRoZSB1cHN0cmVhbQorICogQkJfQVVESVQgQlVHOiB2ZXJzaW9uIGluIHV0aWwtbGludXggc2VlbXMgdG8gYmUgYnJva2VuIGFzIHdlbGwuICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2NhbC5odG1sICovCisKKy8qIE1hciAxNiwgMjAwMyAgICAgIE1hbnVlbCBOb3ZvYSBJSUkgICAobWpuM0Bjb2RlcG9ldC5vcmcpCisgKgorICogTWFqb3Igc2l6ZSByZWR1Y3Rpb24uLi4gb3ZlciA1MCUgKD4xLjVrKSBvbiBpMzg2LgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBjYWxfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstanldIFtbTU9OVEhdIFlFQVJdIgorLy91c2FnZTojZGVmaW5lIGNhbF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRpc3BsYXkgYSBjYWxlbmRhclxuIgorLy91c2FnZTogICAgICJcbgktaglVc2UganVsaWFuIGRhdGVzIgorLy91c2FnZTogICAgICJcbgkteQlEaXNwbGF5IHRoZSBlbnRpcmUgeWVhciIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAidW5pY29kZS5oIgorCisvKiBXZSBvZnRlbiB1c2UgInVuc2lnbmVkIiBpbnRlYWQgb2YgImludCIsIGl0J3MgZWFzaWVyIHRvIGRpdiBvbiBtb3N0IENQVXMgKi8KKworI2RlZmluZQlUSFVSU0RBWQkJNAkJLyogZm9yIHJlZm9ybWF0aW9uICovCisjZGVmaW5lCVNBVFVSREFZCQk2CQkvKiAxIEphbiAxIHdhcyBhIFNhdHVyZGF5ICovCisKKyNkZWZpbmUJRklSU1RfTUlTU0lOR19EQVkJNjM5Nzg3CQkvKiAzIFNlcCAxNzUyICovCisjZGVmaW5lCU5VTUJFUl9NSVNTSU5HX0RBWVMJMTEJCS8qIDExIGRheSBjb3JyZWN0aW9uICovCisKKyNkZWZpbmUJTUFYREFZUwkJCTQyCQkvKiBtYXggc2xvdHMgaW4gYSBtb250aCBhcnJheSAqLworI2RlZmluZQlTUEFDRQkJCS0xCQkvKiB1c2VkIGluIGRheSBhcnJheSAqLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBkYXlzX2luX21vbnRoW10gQUxJR04xID0geworCTAsIDMxLCAyOCwgMzEsIDMwLCAzMSwgMzAsIDMxLCAzMSwgMzAsIDMxLCAzMCwgMzEKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHNlcDE3NTJbXSBBTElHTjEgPSB7CisJCTEsCTIsCTE0LAkxNSwJMTYsCisJMTcsCTE4LAkxOSwJMjAsCTIxLAkyMiwJMjMsCisJMjQsCTI1LAkyNiwJMjcsCTI4LAkyOSwJMzAKK307CisKKy8qIFNldCB0byAwIG9yIDEgaW4gbWFpbiAqLworI2RlZmluZSBqdWxpYW4gKCh1bnNpZ25lZClvcHRpb25fbWFzazMyKQorCisvKiBsZWFwIHllYXIgLS0gYWNjb3VudCBmb3IgR3JlZ29yaWFuIHJlZm9ybWF0aW9uIGluIDE3NTIgKi8KK3N0YXRpYyBpbnQgbGVhcF95ZWFyKHVuc2lnbmVkIHlyKQoreworCWlmICh5ciA8PSAxNzUyKQorCQlyZXR1cm4gISh5ciAlIDQpOworCXJldHVybiAoISh5ciAlIDQpICYmICh5ciAlIDEwMCkpIHx8ICEoeXIgJSA0MDApOworfQorCisvKiBudW1iZXIgb2YgY2VudHVyaWVzIHNpbmNlIDE3MDAsIG5vdCBpbmNsdXNpdmUgKi8KKyNkZWZpbmUJY2VudHVyaWVzX3NpbmNlXzE3MDAoeXIpIFwKKwkoKHlyKSA+IDE3MDAgPyAoeXIpIC8gMTAwIC0gMTcgOiAwKQorCisvKiBudW1iZXIgb2YgY2VudHVyaWVzIHNpbmNlIDE3MDAgd2hvc2UgbW9kdWxvIG9mIDQwMCBpcyAwICovCisjZGVmaW5lCXF1YWRfY2VudHVyaWVzX3NpbmNlXzE3MDAoeXIpIFwKKwkoKHlyKSA+IDE2MDAgPyAoKHlyKSAtIDE2MDApIC8gNDAwIDogMCkKKworLyogbnVtYmVyIG9mIGxlYXAgeWVhcnMgYmV0d2VlbiB5ZWFyIDEgYW5kIHRoaXMgeWVhciwgbm90IGluY2x1c2l2ZSAqLworI2RlZmluZQlsZWFwX3llYXJzX3NpbmNlX3llYXJfMSh5cikgXAorCSgoeXIpIC8gNCAtIGNlbnR1cmllc19zaW5jZV8xNzAwKHlyKSArIHF1YWRfY2VudHVyaWVzX3NpbmNlXzE3MDAoeXIpKQorCitzdGF0aWMgdm9pZCBjZW50ZXIoY2hhciAqLCB1bnNpZ25lZCwgdW5zaWduZWQpOworc3RhdGljIHZvaWQgZGF5X2FycmF5KHVuc2lnbmVkLCB1bnNpZ25lZCwgdW5zaWduZWQgKik7CitzdGF0aWMgdm9pZCB0cmltX3RyYWlsaW5nX3NwYWNlc19hbmRfcHJpbnQoY2hhciAqKTsKKworc3RhdGljIHZvaWQgYmxhbmtfc3RyaW5nKGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1Zmxlbik7CitzdGF0aWMgY2hhciAqYnVpbGRfcm93KGNoYXIgKnAsIHVuc2lnbmVkICpkcCk7CisKKyNkZWZpbmUJREFZX0xFTgkJMwkJLyogMyBzcGFjZXMgcGVyIGRheSAqLworI2RlZmluZQlKX0RBWV9MRU4JKERBWV9MRU4gKyAxKQorI2RlZmluZQlXRUVLX0xFTgkyMAkJLyogNyAqIDMgLSBvbmUgc3BhY2UgYXQgdGhlIGVuZCAqLworI2RlZmluZQlKX1dFRUtfTEVOCShXRUVLX0xFTiArIDcpCisjZGVmaW5lCUhFQURfU0VQCTIJCS8qIHNwYWNlcyBiZXR3ZWVuIGRheSBoZWFkaW5ncyAqLworCitpbnQgY2FsX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjYWxfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB0bSB6ZXJvX3RtOworCXRpbWVfdCBub3c7CisJdW5zaWduZWQgbW9udGgsIHllYXIsIGZsYWdzLCBpOworCWNoYXIgKm1vbnRoX25hbWVzWzEyXTsKKwkvKiBub3JtYWwgaGVhZGluZzogKi8KKwkvKiAiU3UgTW8gVHUgV2UgVGggRnIgU2EiICovCisJLyogLWogaGVhZGluZzogKi8KKwkvKiAiIFN1ICBNbyAgVHUgIFdlICBUaCAgRnIgIFNhIiAqLworCWNoYXIgZGF5X2hlYWRpbmdzW0VOQUJMRV9VTklDT0RFX1NVUFBPUlQgPyAyOCAqIDYgOiAyOF07CisJSUZfVU5JQ09ERV9TVVBQT1JUKGNoYXIgKmhwID0gZGF5X2hlYWRpbmdzOykKKwljaGFyIGJ1Zls0MF07CisKKwlpbml0X3VuaWNvZGUoKTsKKworCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgImp5Iik7CisJLyogVGhpcyBzZXRzIGp1bGlhbiA9IGZsYWdzICYgMTogKi8KKwlvcHRpb25fbWFzazMyICY9IDE7CisJbW9udGggPSAwOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKCFhcmd2WzBdKSB7CisJCXN0cnVjdCB0bSAqcHRtOworCisJCXRpbWUoJm5vdyk7CisJCXB0bSA9IGxvY2FsdGltZSgmbm93KTsKKwkJeWVhciA9IHB0bS0+dG1feWVhciArIDE5MDA7CisJCWlmICghKGZsYWdzICYgMikpIHsgLyogbm8gLXkgKi8KKwkJCW1vbnRoID0gcHRtLT50bV9tb24gKyAxOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGFyZ3ZbMV0pIHsKKwkJCWlmIChhcmd2WzJdKSB7CisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJfQorCQkJaWYgKCEoZmxhZ3MgJiAyKSkgeyAvKiBubyAteSAqLworCQkJCW1vbnRoID0geGF0b3VfcmFuZ2UoKmFyZ3YsIDEsIDEyKTsKKwkJCX0KKwkJCWFyZ3YrKzsKKwkJfQorCQl5ZWFyID0geGF0b3VfcmFuZ2UoKmFyZ3YsIDEsIDk5OTkpOworCX0KKworCWJsYW5rX3N0cmluZyhkYXlfaGVhZGluZ3MsIHNpemVvZihkYXlfaGVhZGluZ3MpIC0gNyArIDcqanVsaWFuKTsKKworCWkgPSAwOworCWRvIHsKKwkJemVyb190bS50bV9tb24gPSBpOworCQkvKiBmdWxsIG1vbnRoIG5hbWUgYWNjb3JkaW5nIHRvIGxvY2FsZSAqLworCQlzdHJmdGltZShidWYsIHNpemVvZihidWYpLCAiJUIiLCAmemVyb190bSk7CisJCW1vbnRoX25hbWVzW2ldID0geHN0cmR1cChidWYpOworCisJCWlmIChpIDwgNykgeworCQkJemVyb190bS50bV93ZGF5ID0gaTsKKwkJCS8qIGFiYnJldmlhdGVkIHdlZWtkYXkgbmFtZSBhY2NvcmRpbmcgdG8gbG9jYWxlICovCisJCQlzdHJmdGltZShidWYsIHNpemVvZihidWYpLCAiJWEiLCAmemVyb190bSk7CisjaWYgRU5BQkxFX1VOSUNPREVfU1VQUE9SVAorCQkJaWYgKGp1bGlhbikKKwkJCQkqaHArKyA9ICcgJzsKKwkJCXsKKwkJCQljaGFyICp0d29fd2NoYXJzID0gdW5pY29kZV9jb252X3RvX3ByaW50YWJsZV9maXhlZHdpZHRoKC8qTlVMTCwqLyBidWYsIDIpOworCQkJCXN0cmNweShocCwgdHdvX3djaGFycyk7CisJCQkJZnJlZSh0d29fd2NoYXJzKTsKKwkJCX0KKwkJCWhwICs9IHN0cmxlbihocCk7CisJCQkqaHArKyA9ICcgJzsKKyNlbHNlCisJCQlzdHJuY3B5KGRheV9oZWFkaW5ncyArIGkgKiAoMytqdWxpYW4pICsganVsaWFuLCBidWYsIDIpOworI2VuZGlmCisJCX0KKwl9IHdoaWxlICgrK2kgPCAxMik7CisJSUZfVU5JQ09ERV9TVVBQT1JUKGhwWy0xXSA9ICdcMCc7KQorCisJaWYgKG1vbnRoKSB7CisJCXVuc2lnbmVkIHJvdywgbGVuLCBkYXlzW01BWERBWVNdOworCQl1bnNpZ25lZCAqZHAgPSBkYXlzOworCQljaGFyIGxpbmVvdXRbMzBdOworCisJCWRheV9hcnJheShtb250aCwgeWVhciwgZHApOworCQlsZW4gPSBzcHJpbnRmKGxpbmVvdXQsICIlcyAldSIsIG1vbnRoX25hbWVzW21vbnRoIC0gMV0sIHllYXIpOworCQlwcmludGYoIiUqcyVzXG4lc1xuIiwKKwkJCQkoKDcqanVsaWFuICsgV0VFS19MRU4pIC0gbGVuKSAvIDIsICIiLAorCQkJCWxpbmVvdXQsIGRheV9oZWFkaW5ncyk7CisJCWZvciAocm93ID0gMDsgcm93IDwgNjsgcm93KyspIHsKKwkJCWJ1aWxkX3JvdyhsaW5lb3V0LCBkcClbMF0gPSAnXDAnOworCQkJZHAgKz0gNzsKKwkJCXRyaW1fdHJhaWxpbmdfc3BhY2VzX2FuZF9wcmludChsaW5lb3V0KTsKKwkJfQorCX0gZWxzZSB7CisJCXVuc2lnbmVkIHJvdywgd2hpY2hfY2FsLCB3ZWVrX2xlbiwgZGF5c1sxMl1bTUFYREFZU107CisJCXVuc2lnbmVkICpkcDsKKwkJY2hhciBsaW5lb3V0WzgwXTsKKworCQlzcHJpbnRmKGxpbmVvdXQsICIldSIsIHllYXIpOworCQljZW50ZXIobGluZW91dCwKKwkJCQkoV0VFS19MRU4gKiAzICsgSEVBRF9TRVAgKiAyKQorCQkJCSsganVsaWFuICogKEpfV0VFS19MRU4gKiAyICsgSEVBRF9TRVAKKwkJCQkJCS0gKFdFRUtfTEVOICogMyArIEhFQURfU0VQICogMikpLAorCQkJCTAKKwkJKTsKKwkJcHV0cygiXG4iKTsJCS8qIHR3byBcbidzICovCisJCWZvciAoaSA9IDA7IGkgPCAxMjsgaSsrKSB7CisJCQlkYXlfYXJyYXkoaSArIDEsIHllYXIsIGRheXNbaV0pOworCQl9CisJCWJsYW5rX3N0cmluZyhsaW5lb3V0LCBzaXplb2YobGluZW91dCkpOworCQl3ZWVrX2xlbiA9IFdFRUtfTEVOICsganVsaWFuICogKEpfV0VFS19MRU4gLSBXRUVLX0xFTik7CisJCWZvciAobW9udGggPSAwOyBtb250aCA8IDEyOyBtb250aCArPSAzLWp1bGlhbikgeworCQkJY2VudGVyKG1vbnRoX25hbWVzW21vbnRoXSwgd2Vla19sZW4sIEhFQURfU0VQKTsKKwkJCWlmICghanVsaWFuKSB7CisJCQkJY2VudGVyKG1vbnRoX25hbWVzW21vbnRoICsgMV0sIHdlZWtfbGVuLCBIRUFEX1NFUCk7CisJCQl9CisJCQljZW50ZXIobW9udGhfbmFtZXNbbW9udGggKyAyIC0ganVsaWFuXSwgd2Vla19sZW4sIDApOworCQkJcHJpbnRmKCJcbiVzJSpzJXMiLCBkYXlfaGVhZGluZ3MsIEhFQURfU0VQLCAiIiwgZGF5X2hlYWRpbmdzKTsKKwkJCWlmICghanVsaWFuKSB7CisJCQkJcHJpbnRmKCIlKnMlcyIsIEhFQURfU0VQLCAiIiwgZGF5X2hlYWRpbmdzKTsKKwkJCX0KKwkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCQlmb3IgKHJvdyA9IDA7IHJvdyA8ICg2KjcpOyByb3cgKz0gNykgeworCQkJCWZvciAod2hpY2hfY2FsID0gMDsgd2hpY2hfY2FsIDwgMy1qdWxpYW47IHdoaWNoX2NhbCsrKSB7CisJCQkJCWRwID0gZGF5c1ttb250aCArIHdoaWNoX2NhbF0gKyByb3c7CisJCQkJCWJ1aWxkX3JvdyhsaW5lb3V0ICsgd2hpY2hfY2FsICogKHdlZWtfbGVuICsgMiksIGRwKTsKKwkJCQl9CisJCQkJLyogYmxhbmtfc3RyaW5nIHRvb2sgY2FyZSBvZiBudWwgdGVybWluYXRpb24uICovCisJCQkJdHJpbV90cmFpbGluZ19zcGFjZXNfYW5kX3ByaW50KGxpbmVvdXQpOworCQkJfQorCQl9CisJfQorCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChFWElUX1NVQ0NFU1MpOworfQorCisvKgorICogZGF5X2FycmF5IC0tCisgKglGaWxsIGluIGFuIGFycmF5IG9mIDQyIGludGVnZXJzIHdpdGggYSBjYWxlbmRhci4gIEFzc3VtZSBmb3IgYSBtb21lbnQKKyAqCXRoYXQgeW91IHRvb2sgdGhlIChtYXhpbXVtKSA2IHJvd3MgaW4gYSBjYWxlbmRhciBhbmQgc3RyZXRjaGVkIHRoZW0KKyAqCW91dCBlbmQgdG8gZW5kLiAgWW91IHdvdWxkIGhhdmUgNDIgbnVtYmVycyBvciBzcGFjZXMuICBUaGlzIHJvdXRpbmUKKyAqCWJ1aWxkcyB0aGF0IGFycmF5IGZvciBhbnkgbW9udGggZnJvbSBKYW4uIDEgdGhyb3VnaCBEZWMuIDk5OTkuCisgKi8KK3N0YXRpYyB2b2lkIGRheV9hcnJheSh1bnNpZ25lZCBtb250aCwgdW5zaWduZWQgeWVhciwgdW5zaWduZWQgKmRheXMpCit7CisJdW5zaWduZWQgbG9uZyB0ZW1wOworCXVuc2lnbmVkIGk7CisJdW5zaWduZWQgZGF5LCBkdywgZG07CisKKwltZW1zZXQoZGF5cywgU1BBQ0UsIE1BWERBWVMgKiBzaXplb2YoaW50KSk7CisKKwlpZiAoKG1vbnRoID09IDkpICYmICh5ZWFyID09IDE3NTIpKSB7CisJCS8qIEFzc3VtZXMgdGhlIEdyZWdvcmlhbiByZWZvcm1hdGlvbiBlbGltaW5hdGVzCisJCSAqIDMgU2VwLiAxNzUyIHRocm91Z2ggMTMgU2VwLiAxNzUyLgorCQkgKi8KKwkJdW5zaWduZWQgal9vZmZzZXQgPSBqdWxpYW4gKiAyNDQ7CisJCXNpemVfdCBvZGF5ID0gMDsKKworCQlkbyB7CisJCQlkYXlzW29kYXkrMl0gPSBzZXAxNzUyW29kYXldICsgal9vZmZzZXQ7CisJCX0gd2hpbGUgKCsrb2RheSA8IHNpemVvZihzZXAxNzUyKSk7CisKKwkJcmV0dXJuOworCX0KKworCS8qIGRheV9pbl95ZWFyCisJICogcmV0dXJuIHRoZSAxIGJhc2VkIGRheSBudW1iZXIgd2l0aGluIHRoZSB5ZWFyCisJICovCisJZGF5ID0gMTsKKwlpZiAoKG1vbnRoID4gMikgJiYgbGVhcF95ZWFyKHllYXIpKSB7CisJCSsrZGF5OworCX0KKworCWkgPSBtb250aDsKKwl3aGlsZSAoaSkgeworCQlkYXkgKz0gZGF5c19pbl9tb250aFstLWldOworCX0KKworCS8qIGRheV9pbl93ZWVrCisJICogcmV0dXJuIHRoZSAwIGJhc2VkIGRheSBudW1iZXIgZm9yIGFueSBkYXRlIGZyb20gMSBKYW4uIDEgdG8KKwkgKiAzMSBEZWMuIDk5OTkuICBBc3N1bWVzIHRoZSBHcmVnb3JpYW4gcmVmb3JtYXRpb24gZWxpbWluYXRlcworCSAqIDMgU2VwLiAxNzUyIHRocm91Z2ggMTMgU2VwLiAxNzUyLiAgUmV0dXJucyBUaHVyc2RheSBmb3IgYWxsCisJICogbWlzc2luZyBkYXlzLgorCSAqLworCXRlbXAgPSAobG9uZykoeWVhciAtIDEpICogMzY1ICsgbGVhcF95ZWFyc19zaW5jZV95ZWFyXzEoeWVhciAtIDEpICsgZGF5OworCWlmICh0ZW1wIDwgRklSU1RfTUlTU0lOR19EQVkpIHsKKwkJZHcgPSAoKHRlbXAgLSAxICsgU0FUVVJEQVkpICUgNyk7CisJfSBlbHNlIHsKKwkJZHcgPSAoKCh0ZW1wIC0gMSArIFNBVFVSREFZKSAtIE5VTUJFUl9NSVNTSU5HX0RBWVMpICUgNyk7CisJfQorCisJaWYgKCFqdWxpYW4pIHsKKwkJZGF5ID0gMTsKKwl9CisKKwlkbSA9IGRheXNfaW5fbW9udGhbbW9udGhdOworCWlmICgobW9udGggPT0gMikgJiYgbGVhcF95ZWFyKHllYXIpKSB7CisJCSsrZG07CisJfQorCisJZG8geworCQlkYXlzW2R3KytdID0gZGF5Kys7CisJfSB3aGlsZSAoLS1kbSk7Cit9CisKK3N0YXRpYyB2b2lkIHRyaW1fdHJhaWxpbmdfc3BhY2VzX2FuZF9wcmludChjaGFyICpzKQoreworCWNoYXIgKnAgPSBzOworCisJd2hpbGUgKCpwKSB7CisJCSsrcDsKKwl9CisJd2hpbGUgKHAgIT0gcykgeworCQktLXA7CisJCWlmICghaXNzcGFjZSgqcCkpIHsKKwkJCXBbMV0gPSAnXDAnOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlwdXRzKHMpOworfQorCitzdGF0aWMgdm9pZCBjZW50ZXIoY2hhciAqc3RyLCB1bnNpZ25lZCBsZW4sIHVuc2lnbmVkIHNlcGFyYXRlKQoreworCXVuc2lnbmVkIG4gPSBzdHJsZW4oc3RyKTsKKwlsZW4gLT0gbjsKKwlwcmludGYoIiUqcyUqcyIsIChsZW4vMikgKyBuLCBzdHIsIChsZW4vMikgKyAobGVuICUgMikgKyBzZXBhcmF0ZSwgIiIpOworfQorCitzdGF0aWMgdm9pZCBibGFua19zdHJpbmcoY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQoreworCW1lbXNldChidWYsICcgJywgYnVmbGVuKTsKKwlidWZbYnVmbGVuLTFdID0gJ1wwJzsKK30KKworc3RhdGljIGNoYXIgKmJ1aWxkX3JvdyhjaGFyICpwLCB1bnNpZ25lZCAqZHApCit7CisJdW5zaWduZWQgY29sLCB2YWwsIGRheTsKKworCW1lbXNldChwLCAnICcsIChqdWxpYW4gKyBEQVlfTEVOKSAqIDcpOworCisJY29sID0gMDsKKwlkbyB7CisJCWRheSA9ICpkcCsrOworCQlpZiAoZGF5ICE9IFNQQUNFKSB7CisJCQlpZiAoanVsaWFuKSB7CisJCQkJKytwOworCQkJCWlmIChkYXkgPj0gMTAwKSB7CisJCQkJCSpwID0gJzAnOworCQkJCQlwWy0xXSA9IChkYXkgLyAxMDApICsgJzAnOworCQkJCQlkYXkgJT0gMTAwOworCQkJCX0KKwkJCX0KKwkJCXZhbCA9IGRheSAvIDEwOworCQkJaWYgKHZhbCA+IDApIHsKKwkJCQkqcCA9IHZhbCArICcwJzsKKwkJCX0KKwkJCSorK3AgPSBkYXkgJSAxMCArICcwJzsKKwkJCXAgKz0gMjsKKwkJfSBlbHNlIHsKKwkJCXAgKz0gREFZX0xFTiArIGp1bGlhbjsKKwkJfQorCX0gd2hpbGUgKCsrY29sIDwgNyk7CisKKwlyZXR1cm4gcDsKK30KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MywgMTk5NAorICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogS2ltIExldGtlbWFuLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLwpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2NhdC5jIGIvY29yZXV0aWxzL2NhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYzM4ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvY2F0LmMKQEAgLTAsMCArMSw2OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogY2F0IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvY2F0Lmh0bWwgKi8KKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0NBVCkgICAgICs9IGNhdC5vCisvL2tidWlsZDpsaWItJChDT05GSUdfTU9SRSkgICAgKz0gY2F0Lm8gIyBtb3JlIHVzZXMgaXQgaWYgc3Rkb3V0IGlzbid0IGEgdHR5CisvL2tidWlsZDpsaWItJChDT05GSUdfTEVTUykgICAgKz0gY2F0Lm8gIyBsZXNzIHRvbworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0NST05UQUIpICs9IGNhdC5vICMgY3JvbnRhYiAtbAorCisvL2NvbmZpZzpjb25maWcgQ0FUCisvL2NvbmZpZzoJYm9vbCAiY2F0IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIGNhdCBpcyB1c2VkIHRvIGNvbmNhdGVuYXRlIGZpbGVzIGFuZCBwcmludCB0aGVtIHRvIHRoZSBzdGFuZGFyZAorLy9jb25maWc6CSAgb3V0cHV0LiBFbmFibGUgdGhpcyBvcHRpb24gaWYgeW91IHdpc2ggdG8gZW5hYmxlIHRoZSAnY2F0JyB1dGlsaXR5LgorCisvL3VzYWdlOiNkZWZpbmUgY2F0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgY2F0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ29uY2F0ZW5hdGUgRklMRXMgYW5kIHByaW50IHRoZW0gdG8gc3Rkb3V0IgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBjYXRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgY2F0IC9wcm9jL3VwdGltZVxuIgorLy91c2FnZTogICAgICAgIjExMDcxNi43MiAxNy42NyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0ZPUksgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKKworaW50IGJiX2NhdChjaGFyICoqYXJndikKK3sKKwlpbnQgZmQ7CisJaW50IHJldHZhbCA9IEVYSVRfU1VDQ0VTUzsKKworCWlmICghKmFyZ3YpCisJCWFyZ3YgPSAoY2hhcioqKSAmYmJfYXJndl9kYXNoOworCisJZG8geworCQlmZCA9IG9wZW5fb3Jfd2Fybl9zdGRpbigqYXJndik7CisJCWlmIChmZCA+PSAwKSB7CisJCQkvKiBUaGlzIGlzIG5vdCBhIHhmdW5jIC0gbmV2ZXIgZXhpdHMgKi8KKwkJCW9mZl90IHIgPSBiYl9jb3B5ZmRfZW9mKGZkLCBTVERPVVRfRklMRU5PKTsKKwkJCWlmIChmZCAhPSBTVERJTl9GSUxFTk8pCisJCQkJY2xvc2UoZmQpOworCQkJaWYgKHIgPj0gMCkKKwkJCQljb250aW51ZTsKKwkJfQorCQlyZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJfSB3aGlsZSAoKisrYXJndik7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgY2F0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjYXRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWdldG9wdDMyKGFyZ3YsICJ1Iik7CisJYXJndiArPSBvcHRpbmQ7CisJcmV0dXJuIGJiX2NhdChhcmd2KTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9jYXR2LmMgYi9jb3JldXRpbHMvY2F0di5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYjczYmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvY2F0di5jCkBAIC0wLDAgKzEsODIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGNhdCAtdiBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogU2VlICJDYXQgLXYgY29uc2lkZXJlZCBoYXJtZnVsIiBhdAorICogaHR0cDovL2NtLmJlbGwtbGFicy5jb20vY20vY3MvZG9jLzg0L2twLnBzLmd6ICovCisKKy8vdXNhZ2U6I2RlZmluZSBjYXR2X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWV0dl0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGNhdHZfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEaXNwbGF5IG5vbnByaW50aW5nIGNoYXJhY3RlcnMgYXMgXnggb3IgTS14XG4iCisvL3VzYWdlOiAgICAgIlxuCS1lCUVuZCBlYWNoIGxpbmUgd2l0aCAkIgorLy91c2FnZTogICAgICJcbgktdAlTaG93IHRhYnMgYXMgXkkiCisvL3VzYWdlOiAgICAgIlxuCS12CURvbid0IHVzZSBeeCBvciBNLXggZXNjYXBlcyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgQ0FUVl9PUFRfZSAoMTw8MCkKKyNkZWZpbmUgQ0FUVl9PUFRfdCAoMTw8MSkKKyNkZWZpbmUgQ0FUVl9PUFRfdiAoMTw8MikKK3N0cnVjdCBCVUdfY29uc3RfbWlzbWF0Y2ggeworCWNoYXIgQlVHX2NvbnN0X21pc21hdGNoWworCQlDQVRWX09QVF9lID09IFZJU0lCTEVfRU5ETElORSAmJiBDQVRWX09QVF90ID09IFZJU0lCTEVfU0hPV19UQUJTCisJCT8gMSA6IC0xCisJXTsKK307CisKK2ludCBjYXR2X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjYXR2X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmV0dmFsID0gRVhJVF9TVUNDRVNTOworCWludCBmZDsKKwl1bnNpZ25lZCBvcHRzOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiZXR2Iik7CisJYXJndiArPSBvcHRpbmQ7CisjaWYgMCAvKiBUaGVzZSBjb25zdHMgbWF0Y2gsIHdlIGNhbiBqdXN0IHBhc3MgIm9wdHMiIHRvIHZpc2libGUoKSAqLworCWlmIChvcHRzICYgQ0FUVl9PUFRfZSkKKwkJZmxhZ3MgfD0gVklTSUJMRV9FTkRMSU5FOworCWlmIChvcHRzICYgQ0FUVl9PUFRfdCkKKwkJZmxhZ3MgfD0gVklTSUJMRV9TSE9XX1RBQlM7CisjZW5kaWYKKworCS8qIFJlYWQgZnJvbSBzdGRpbiBpZiB0aGVyZSdzIG5vdGhpbmcgZWxzZSB0byBkby4gKi8KKwlpZiAoIWFyZ3ZbMF0pCisJCSotLWFyZ3YgPSAoY2hhciopIi0iOworCWRvIHsKKwkJZmQgPSBvcGVuX29yX3dhcm5fc3RkaW4oKmFyZ3YpOworCQlpZiAoZmQgPCAwKSB7CisJCQlyZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJCQljb250aW51ZTsKKwkJfQorCQlmb3IgKDs7KSB7CisJCQlpbnQgaSwgcmVzOworCisjZGVmaW5lIHJlYWRfYnVmIGJiX2NvbW1vbl9idWZzaXoxCisJCQlyZXMgPSByZWFkKGZkLCByZWFkX2J1ZiwgQ09NTU9OX0JVRlNJWkUpOworCQkJaWYgKHJlcyA8IDApCisJCQkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCQkJaWYgKHJlcyA8PSAwKQorCQkJCWJyZWFrOworCQkJZm9yIChpID0gMDsgaSA8IHJlczsgaSsrKSB7CisJCQkJdW5zaWduZWQgY2hhciBjID0gcmVhZF9idWZbaV07CisJCQkJaWYgKG9wdHMgJiBDQVRWX09QVF92KSB7CisJCQkJCXB1dGNoYXIoYyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJY2hhciBidWZbc2l6ZW9mKCJNLV5jIildOworCQkJCQl2aXNpYmxlKGMsIGJ1Ziwgb3B0cyk7CisJCQkJCWZwdXRzKGJ1Ziwgc3Rkb3V0KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQICYmIGZkKQorCQkJY2xvc2UoZmQpOworCX0gd2hpbGUgKCorK2FyZ3YpOworCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChyZXR2YWwpOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2NoZ3JwLmMgYi9jb3JldXRpbHMvY2hncnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDc2ZGI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL2NoZ3JwLmMKQEAgLTAsMCArMSw1MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBjaGdycCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGRlZmVjdHMgLSBub25lPyAqLworLyogQkJfQVVESVQgR05VIGRlZmVjdHMgLSB1bnN1cHBvcnRlZCBsb25nIG9wdGlvbnMuICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2NoZ3JwLmh0bWwgKi8KKworLy91c2FnZTojZGVmaW5lIGNoZ3JwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLVJoTEhQIklGX0RFU0tUT1AoImN2ZiIpIl0uLi4gR1JPVVAgRklMRS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBjaGdycF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoYW5nZSB0aGUgZ3JvdXAgbWVtYmVyc2hpcCBvZiBlYWNoIEZJTEUgdG8gR1JPVVBcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLVIJUmVjdXJzZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWgJQWZmZWN0IHN5bWxpbmtzIGluc3RlYWQgb2Ygc3ltbGluayB0YXJnZXRzIgorLy91c2FnZTogICAgICJcbgktTAlUcmF2ZXJzZSBhbGwgc3ltbGlua3MgdG8gZGlyZWN0b3JpZXMiCisvL3VzYWdlOiAgICAgIlxuCS1ICVRyYXZlcnNlIHN5bWxpbmtzIG9uIGNvbW1hbmQgbGluZSBvbmx5IgorLy91c2FnZTogICAgICJcbgktUAlEb24ndCB0cmF2ZXJzZSBzeW1saW5rcyAoZGVmYXVsdCkiCisvL3VzYWdlOglJRl9ERVNLVE9QKAorLy91c2FnZTogICAgICJcbgktYwlMaXN0IGNoYW5nZWQgZmlsZXMiCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS1mCUhpZGUgZXJyb3JzIgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBjaGdycF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBscyAtbCAvdG1wL2Zvb1xuIgorLy91c2FnZTogICAgICAgIi1yLS1yLS1yLS0gICAgMSBhbmRlcnNlbiBhbmRlcnNlbiAgICAgICAgMCBBcHIgMTIgMTg6MjUgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICIkIGNoZ3JwIHJvb3QgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICIkIGxzIC1sIC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiLXItLXItLXItLSAgICAxIGFuZGVyc2VuIHJvb3QgICAgICAgICAgICAwIEFwciAxMiAxODoyNSAvdG1wL2Zvb1xuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworCitpbnQgY2hncnBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGNoZ3JwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCS8qICJjaGdycCBbb3B0c10gYWJjIGZpbGUocykiID09ICJjaG93biBbb3B0c10gOmFiYyBmaWxlKHMpIiAqLworCWNoYXIgKipwID0gYXJndjsKKwl3aGlsZSAoKisrcCkgeworCQlpZiAocFswXVswXSAhPSAnLScpIHsKKwkJCXBbMF0gPSB4YXNwcmludGYoIjolcyIsIHBbMF0pOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGNob3duX21haW4oYXJnYywgYXJndik7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvY2htb2QuYyBiL2NvcmV1dGlscy9jaG1vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMWM2ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvY2htb2QuYwpAQCAtMCwwICsxLDE4MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBjaG1vZCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBSZXdvcmtlZCBieSAoQykgMjAwMiBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+CisgKiAgdG8gY29ycmVjdGx5IHBhcnNlICctcnd4Z29hJworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50ICovCisvKiBCQl9BVURJVCBHTlUgZGVmZWN0cyAtIHVuc3VwcG9ydGVkIGxvbmcgb3B0aW9ucy4gKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvY2htb2QuaHRtbCAqLworCisvL3VzYWdlOiNkZWZpbmUgY2htb2RfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstUiJJRl9ERVNLVE9QKCJjdmYiKSJdIE1PREVbLE1PREVdLi4uIEZJTEUuLi4iCisvL3VzYWdlOiNkZWZpbmUgY2htb2RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJFYWNoIE1PREUgaXMgb25lIG9yIG1vcmUgb2YgdGhlIGxldHRlcnMgdWdvYSwgb25lIG9mIHRoZVxuIgorLy91c2FnZTogICAgICAgInN5bWJvbHMgKy09IGFuZCBvbmUgb3IgbW9yZSBvZiB0aGUgbGV0dGVycyByd3hzdFxuIgorLy91c2FnZTogICAgICJcbgktUglSZWN1cnNlIgorLy91c2FnZToJSUZfREVTS1RPUCgKKy8vdXNhZ2U6ICAgICAiXG4JLWMJTGlzdCBjaGFuZ2VkIGZpbGVzIgorLy91c2FnZTogICAgICJcbgktdglMaXN0IGFsbCBmaWxlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJSGlkZSBlcnJvcnMiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGNobW9kX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGxzIC1sIC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiLXJ3LXJ3LXItLSAgICAxIHJvb3QgICAgIHJvb3QgICAgICAgICAgICAwIEFwciAxMiAxODoyNSAvdG1wL2Zvb1xuIgorLy91c2FnZTogICAgICAgIiQgY2htb2QgdSt4IC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiJCBscyAtbCAvdG1wL2Zvb1xuIgorLy91c2FnZTogICAgICAgIi1yd3hydy1yLS0gICAgMSByb290ICAgICByb290ICAgICAgICAgICAgMCBBcHIgMTIgMTg6MjUgL3RtcC9mb28qXG4iCisvL3VzYWdlOiAgICAgICAiJCBjaG1vZCA0NDQgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICIkIGxzIC1sIC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiLXItLXItLXItLSAgICAxIHJvb3QgICAgIHJvb3QgICAgICAgICAgICAwIEFwciAxMiAxODoyNSAvdG1wL2Zvb1xuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworCisjZGVmaW5lIE9QVF9SRUNVUlNFIChvcHRpb25fbWFzazMyICYgMSkKKyNkZWZpbmUgT1BUX1ZFUkJPU0UgKElGX0RFU0tUT1Aob3B0aW9uX21hc2szMiAmIDIpIElGX05PVF9ERVNLVE9QKDApKQorI2RlZmluZSBPUFRfQ0hBTkdFRCAoSUZfREVTS1RPUChvcHRpb25fbWFzazMyICYgNCkgSUZfTk9UX0RFU0tUT1AoMCkpCisjZGVmaW5lIE9QVF9RVUlFVCAgIChJRl9ERVNLVE9QKG9wdGlvbl9tYXNrMzIgJiA4KSBJRl9OT1RfREVTS1RPUCgwKSkKKyNkZWZpbmUgT1BUX1NUUiAgICAgIlIiIElGX0RFU0tUT1AoInZjZiIpCisKKy8qIGNvcmV1dGlsczoKKyAqIGNobW9kIG5ldmVyIGNoYW5nZXMgdGhlIHBlcm1pc3Npb25zIG9mIHN5bWJvbGljIGxpbmtzOyB0aGUgY2htb2QKKyAqIHN5c3RlbSBjYWxsIGNhbm5vdCBjaGFuZ2UgdGhlaXIgcGVybWlzc2lvbnMuIFRoaXMgaXMgbm90IGEgcHJvYmxlbQorICogc2luY2UgdGhlIHBlcm1pc3Npb25zIG9mIHN5bWJvbGljIGxpbmtzIGFyZSBuZXZlciB1c2VkLgorICogSG93ZXZlciwgZm9yIGVhY2ggc3ltYm9saWMgbGluayBsaXN0ZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgY2htb2QgY2hhbmdlcworICogdGhlIHBlcm1pc3Npb25zIG9mIHRoZSBwb2ludGVkLXRvIGZpbGUuIEluIGNvbnRyYXN0LCBjaG1vZCBpZ25vcmVzCisgKiBzeW1ib2xpYyBsaW5rcyBlbmNvdW50ZXJlZCBkdXJpbmcgcmVjdXJzaXZlIGRpcmVjdG9yeSB0cmF2ZXJzYWxzLgorICovCisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGZpbGVBY3Rpb24oY29uc3QgY2hhciAqZmlsZU5hbWUsIHN0cnVjdCBzdGF0ICpzdGF0YnVmLCB2b2lkKiBwYXJhbSwgaW50IGRlcHRoKQoreworCW1vZGVfdCBuZXdtb2RlOworCisJLyogbWF0Y2ggY29yZXV0aWxzIGJlaGF2aW9yICovCisJaWYgKGRlcHRoID09IDApIHsKKwkJLyogc3RhdGJ1ZiBob2xkcyBsc3RhdCByZXN1bHQsIGJ1dCB3ZSBuZWVkIHN0YXQgKGZvbGxvdyBsaW5rKSAqLworCQlpZiAoc3RhdChmaWxlTmFtZSwgc3RhdGJ1ZikpCisJCQlnb3RvIGVycjsKKwl9IGVsc2UgeyAvKiBkZXB0aCA+IDA6IHNraXAgbGlua3MgKi8KKwkJaWYgKFNfSVNMTksoc3RhdGJ1Zi0+c3RfbW9kZSkpCisJCQlyZXR1cm4gVFJVRTsKKwl9CisKKwluZXdtb2RlID0gYmJfcGFyc2VfbW9kZSgoY2hhciAqKXBhcmFtLCBzdGF0YnVmLT5zdF9tb2RlKTsKKwlpZiAobmV3bW9kZSA9PSAobW9kZV90KS0xKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBtb2RlICclcyciLCAoY2hhciAqKXBhcmFtKTsKKworCWlmIChjaG1vZChmaWxlTmFtZSwgbmV3bW9kZSkgPT0gMCkgeworCQlpZiAoT1BUX1ZFUkJPU0UKKwkJIHx8IChPUFRfQ0hBTkdFRCAmJiBzdGF0YnVmLT5zdF9tb2RlICE9IG5ld21vZGUpCisJCSkgeworCQkJcHJpbnRmKCJtb2RlIG9mICclcycgY2hhbmdlZCB0byAlMDRvICglcylcbiIsIGZpbGVOYW1lLAorCQkJCW5ld21vZGUgJiAwNzc3NywgYmJfbW9kZV9zdHJpbmcobmV3bW9kZSkrMSk7CisJCX0KKwkJcmV0dXJuIFRSVUU7CisJfQorIGVycjoKKwlpZiAoIU9QVF9RVUlFVCkKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2coZmlsZU5hbWUpOworCXJldHVybiBGQUxTRTsKK30KKworaW50IGNobW9kX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjaG1vZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHJldHZhbCA9IEVYSVRfU1VDQ0VTUzsKKwljaGFyICphcmcsICoqYXJncDsKKwljaGFyICpzbW9kZTsKKworCS8qIENvbnZlcnQgZmlyc3QgZW5jb3VudGVyZWQgLXIgaW50byBhciwgLXcgaW50byBhdyBldGMKKwkgKiBzbyB0aGF0IGdldG9wdCB3b3VsZCBub3QgZWF0IGl0ICovCisJYXJncCA9IGFyZ3Y7CisJd2hpbGUgKChhcmcgPSAqKythcmdwKSkgeworCQkvKiBNb2RlIHNwZWMgbXVzdCBiZSB0aGUgZmlyc3QgYXJnIChzYW5zIC1SIGV0YykgKi8KKwkJLyogKHByb3RlY3QgYWdhaW5zdCBtaXNoYW5kbGluZyBlLmcuICJjaG1vZCA2NDQgLXIiKSAqLworCQlpZiAoYXJnWzBdICE9ICctJykgeworCQkJYXJnID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCS8qIEFuIG9wdGlvbi4gTm90IGEgLS0gb3IgdmFsaWQgb3B0aW9uPyAqLworCQlpZiAoYXJnWzFdICYmICFzdHJjaHIoIi0iT1BUX1NUUiwgYXJnWzFdKSkgeworCQkJYXJnWzBdID0gJ2EnOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBQYXJzZSBvcHRpb25zICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTIiOworCWdldG9wdDMyKGFyZ3YsICgiLSJPUFRfU1RSKSArIDEpOyAvKiBSZXVzZSBzdHJpbmcgKi8KKwlhcmd2ICs9IG9wdGluZDsKKworCS8qIFJlc3RvcmUgb3B0aW9uLWxpa2UgbW9kZSBpZiBuZWVkZWQgKi8KKwlpZiAoYXJnKSBhcmdbMF0gPSAnLSc7CisKKwkvKiBPaywgcmVhZHkgdG8gZG8gdGhlIGRlZWQgbm93ICovCisJc21vZGUgPSAqYXJndisrOworCWRvIHsKKwkJaWYgKCFyZWN1cnNpdmVfYWN0aW9uKCphcmd2LAorCQkJT1BUX1JFQ1VSU0UsICAgIC8vIHJlY3Vyc2UKKwkJCWZpbGVBY3Rpb24sICAgICAvLyBmaWxlIGFjdGlvbgorCQkJZmlsZUFjdGlvbiwgICAgIC8vIGRpciBhY3Rpb24KKwkJCXNtb2RlLCAgICAgICAgICAvLyB1c2VyIGRhdGEKKwkJCTApICAgICAgICAgICAgICAvLyBkZXB0aAorCQkpIHsKKwkJCXJldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwkJfQorCX0gd2hpbGUgKCorK2FyZ3YpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworLyoKK1NlY3VyaXR5OiBjaG1vZCBpcyB0b28gaW1wb3J0YW50IGFuZCB0b28gc3VidGxlLgorVGhpcyBpcyBhIHRlc3Qgc2NyaXB0IChidXN5Ym94IGNobW9kIHZlcnN1cyBjb3JldXRpbHMpLgorUnVuIGl0IGluIGVtcHR5IGRpcmVjdG9yeS4KKworIyEvYmluL3NoCit0MT0iL3RtcC9idXN5Ym94IGNobW9kIgordDI9Ii91c3IvYmluL2NobW9kIgorY3JlYXRlKCkgeworICAgIHJtIC1yZiAkMTsgbWtkaXIgJDEKKyAgICAoCisgICAgY2QgJDEgfHwgZXhpdCAxCisgICAgbWtkaXIgZGlyCisgICAgPnVwCisgICAgPmZpbGUKKyAgICA+ZGlyL2ZpbGUKKyAgICBsbiAtcyBkaXIgbGlua2RpcgorICAgIGxuIC1zIGZpbGUgbGlua2ZpbGUKKyAgICBsbiAtcyAuLi91cCBkaXIvdXAKKyAgICApCit9Cit0c3QoKSB7CisgICAgKGNkIHRlc3QxOyAkdDEgJDEpCisgICAgKGNkIHRlc3QyOyAkdDIgJDEpCisgICAgKGNkIHRlc3QxOyBscyAtbFIpID5vdXQxCisgICAgKGNkIHRlc3QyOyBscyAtbFIpID5vdXQyCisgICAgZWNobyAiY2htb2QgJDEiID5vdXQuZGlmZgorICAgIGlmICEgZGlmZiAtdSBvdXQxIG91dDIgPj5vdXQuZGlmZjsgdGhlbiBleGl0IDE7IGZpCisgICAgcm0gb3V0LmRpZmYKK30KK2VjaG8gIklmIHNjcmlwdCBwcm9kdWNlZCAnb3V0LmRpZmYnIGZpbGUsIHRoZW4gYXQgbGVhc3Qgb25lIHRlc3RjYXNlIGZhaWxlZCIKK2NyZWF0ZSB0ZXN0MTsgY3JlYXRlIHRlc3QyCit0c3QgImErdyBmaWxlIgordHN0ICJhLXcgZGlyIgordHN0ICJhK3cgbGlua2ZpbGUiCit0c3QgImEtdyBsaW5rZGlyIgordHN0ICItUiBhK3cgZmlsZSIKK3RzdCAiLVIgYS13IGRpciIKK3RzdCAiLVIgYSt3IGxpbmtmaWxlIgordHN0ICItUiBhLXcgbGlua2RpciIKK3RzdCAiYS1yLGEreCBsaW5rZmlsZSIKKyovCmRpZmYgLS1naXQgYS9jb3JldXRpbHMvY2hvd24uYyBiL2NvcmV1dGlscy9jaG93bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OWMwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvY2hvd24uYwpAQCAtMCwwICsxLDIyMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBjaG93biBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGRlZmVjdHMgLSBub25lPyAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9jaG93bi5odG1sICovCisKKy8vdXNhZ2U6I2RlZmluZSBjaG93bl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1SaCJJRl9ERVNLVE9QKCJMSFBjdmYiKSJdLi4uIE9XTkVSWzwufDo+W0dST1VQXV0gRklMRS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBjaG93bl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoYW5nZSB0aGUgb3duZXIgYW5kL29yIGdyb3VwIG9mIGVhY2ggRklMRSB0byBPV05FUiBhbmQvb3IgR1JPVVBcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLVIJUmVjdXJzZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWgJQWZmZWN0IHN5bWxpbmtzIGluc3RlYWQgb2Ygc3ltbGluayB0YXJnZXRzIgorLy91c2FnZToJSUZfREVTS1RPUCgKKy8vdXNhZ2U6ICAgICAiXG4JLUwJVHJhdmVyc2UgYWxsIHN5bWxpbmtzIHRvIGRpcmVjdG9yaWVzIgorLy91c2FnZTogICAgICJcbgktSAlUcmF2ZXJzZSBzeW1saW5rcyBvbiBjb21tYW5kIGxpbmUgb25seSIKKy8vdXNhZ2U6ICAgICAiXG4JLVAJRG9uJ3QgdHJhdmVyc2Ugc3ltbGlua3MgKGRlZmF1bHQpIgorLy91c2FnZTogICAgICJcbgktYwlMaXN0IGNoYW5nZWQgZmlsZXMiCisvL3VzYWdlOiAgICAgIlxuCS12CUxpc3QgYWxsIGZpbGVzIgorLy91c2FnZTogICAgICJcbgktZglIaWRlIGVycm9ycyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgY2hvd25fZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbHMgLWwgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICItci0tci0tci0tICAgIDEgYW5kZXJzZW4gYW5kZXJzZW4gICAgICAgIDAgQXByIDEyIDE4OjI1IC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiJCBjaG93biByb290IC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiJCBscyAtbCAvdG1wL2Zvb1xuIgorLy91c2FnZTogICAgICAgIi1yLS1yLS1yLS0gICAgMSByb290ICAgICBhbmRlcnNlbiAgICAgICAgMCBBcHIgMTIgMTg6MjUgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICIkIGNob3duIHJvb3Qucm9vdCAvdG1wL2Zvb1xuIgorLy91c2FnZTogICAgICAgImxzIC1sIC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiLXItLXItLXItLSAgICAxIHJvb3QgICAgIHJvb3QgICAgICAgICAgICAwIEFwciAxMiAxODoyNSAvdG1wL2Zvb1xuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworCisjZGVmaW5lIE9QVF9TVFIgICAgICgiUmgiIElGX0RFU0tUT1AoInZjZkxIUCIpKQorI2RlZmluZSBCSVRfUkVDVVJTRSAxCisjZGVmaW5lIE9QVF9SRUNVUlNFIChvcHQgJiAxKQorI2RlZmluZSBPUFRfTk9ERVJFRiAob3B0ICYgMikKKyNkZWZpbmUgT1BUX1ZFUkJPU0UgKElGX0RFU0tUT1Aob3B0ICYgMHgwNCkgSUZfTk9UX0RFU0tUT1AoMCkpCisjZGVmaW5lIE9QVF9DSEFOR0VEIChJRl9ERVNLVE9QKG9wdCAmIDB4MDgpIElGX05PVF9ERVNLVE9QKDApKQorI2RlZmluZSBPUFRfUVVJRVQgICAoSUZfREVTS1RPUChvcHQgJiAweDEwKSBJRl9OT1RfREVTS1RPUCgwKSkKKy8qIFBPU0lYIG9wdGlvbnMKKyAqIC1MIHRyYXZlcnNlIGV2ZXJ5IHN5bWJvbGljIGxpbmsgdG8gYSBkaXJlY3RvcnkgZW5jb3VudGVyZWQKKyAqIC1IIGlmIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50IGlzIGEgc3ltYm9saWMgbGluayB0byBhIGRpcmVjdG9yeSwgdHJhdmVyc2UgaXQKKyAqIC1QIGRvIG5vdCB0cmF2ZXJzZSBhbnkgc3ltYm9saWMgbGlua3MgKGRlZmF1bHQpCisgKiBXZSBkbyBub3QgY29uZm9ybSB0byB0aGUgZm9sbG93aW5nOgorICogIlNwZWNpZnlpbmcgbW9yZSB0aGFuIG9uZSBvZiAtSCwgLUwsIGFuZCAtUCBpcyBub3QgYW4gZXJyb3IuCisgKiBUaGUgbGFzdCBvcHRpb24gc3BlY2lmaWVkIHNoYWxsIGRldGVybWluZSB0aGUgYmVoYXZpb3Igb2YgdGhlIHV0aWxpdHkuIiAqLworLyogLUwgKi8KKyNkZWZpbmUgQklUX1RSQVZFUlNFIDB4MjAKKyNkZWZpbmUgT1BUX1RSQVZFUlNFIChJRl9ERVNLVE9QKG9wdCAmIEJJVF9UUkFWRVJTRSkgSUZfTk9UX0RFU0tUT1AoMCkpCisvKiAtSCBvciAtTCAqLworI2RlZmluZSBCSVRfVFJBVkVSU0VfVE9QICgweDIwfDB4NDApCisjZGVmaW5lIE9QVF9UUkFWRVJTRV9UT1AgKElGX0RFU0tUT1Aob3B0ICYgQklUX1RSQVZFUlNFX1RPUCkgSUZfTk9UX0RFU0tUT1AoMCkpCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSE9XTl9MT05HX09QVElPTlMKK3N0YXRpYyBjb25zdCBjaGFyIGNob3duX2xvbmdvcHRzW10gQUxJR04xID0KKwkicmVjdXJzaXZlXDAiICAgICAgICBOb19hcmd1bWVudCAgICJSIgorCSJkZXJlZmVyZW5jZVwwIiAgICAgIE5vX2FyZ3VtZW50ICAgIlx4ZmYiCisJIm5vLWRlcmVmZXJlbmNlXDAiICAgTm9fYXJndW1lbnQgICAiaCIKKyMgaWYgRU5BQkxFX0RFU0tUT1AKKwkiY2hhbmdlc1wwIiAgICAgICAgICBOb19hcmd1bWVudCAgICJjIgorCSJzaWxlbnRcMCIgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgImYiCisJInF1aWV0XDAiICAgICAgICAgICAgTm9fYXJndW1lbnQgICAiZiIKKwkidmVyYm9zZVwwIiAgICAgICAgICBOb19hcmd1bWVudCAgICJ2IgorIyBlbmRpZgorCTsKKyNlbmRpZgorCit0eXBlZGVmIGludCAoKmNob3duX2ZwdHIpKGNvbnN0IGNoYXIgKiwgdWlkX3QsIGdpZF90KTsKKworc3RydWN0IHBhcmFtX3QgeworCXN0cnVjdCBiYl91aWRnaWRfdCB1Z2lkOworCWNob3duX2ZwdHIgY2hvd25fZnVuYzsKK307CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGZpbGVBY3Rpb24oY29uc3QgY2hhciAqZmlsZU5hbWUsIHN0cnVjdCBzdGF0ICpzdGF0YnVmLAorCQl2b2lkICp2cGFyYW0sIGludCBkZXB0aCBVTlVTRURfUEFSQU0pCit7CisjZGVmaW5lIHBhcmFtICAoKihzdHJ1Y3QgcGFyYW1fdCopdnBhcmFtKQorI2RlZmluZSBvcHQgb3B0aW9uX21hc2szMgorCXVpZF90IHUgPSAocGFyYW0udWdpZC51aWQgPT0gKHVpZF90KS0xTCkgPyBzdGF0YnVmLT5zdF91aWQgOiBwYXJhbS51Z2lkLnVpZDsKKwlnaWRfdCBnID0gKHBhcmFtLnVnaWQuZ2lkID09IChnaWRfdCktMUwpID8gc3RhdGJ1Zi0+c3RfZ2lkIDogcGFyYW0udWdpZC5naWQ7CisKKwlpZiAocGFyYW0uY2hvd25fZnVuYyhmaWxlTmFtZSwgdSwgZykgPT0gMCkgeworCQlpZiAoT1BUX1ZFUkJPU0UKKwkJIHx8IChPUFRfQ0hBTkdFRCAmJiAoc3RhdGJ1Zi0+c3RfdWlkICE9IHUgfHwgc3RhdGJ1Zi0+c3RfZ2lkICE9IGcpKQorCQkpIHsKKwkJCXByaW50ZigiY2hhbmdlZCBvd25lcnNoaXAgb2YgJyVzJyB0byAldToldVxuIiwKKwkJCQkJZmlsZU5hbWUsICh1bnNpZ25lZCl1LCAodW5zaWduZWQpZyk7CisJCX0KKwkJcmV0dXJuIFRSVUU7CisJfQorCWlmICghT1BUX1FVSUVUKQorCQliYl9zaW1wbGVfcGVycm9yX21zZyhmaWxlTmFtZSk7CisJcmV0dXJuIEZBTFNFOworI3VuZGVmIG9wdAorI3VuZGVmIHBhcmFtCit9CisKK2ludCBjaG93bl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHJldHZhbCA9IEVYSVRfU1VDQ0VTUzsKKwlpbnQgb3B0LCBmbGFnczsKKwlzdHJ1Y3QgcGFyYW1fdCBwYXJhbTsKKworCS8qIEp1c3QgLTEgbWlnaHQgbm90IHdvcms6IHVpZF90IG1heSBiZSB1bnNpZ25lZCBsb25nICovCisJcGFyYW0udWdpZC51aWQgPSAtMUw7CisJcGFyYW0udWdpZC5naWQgPSAtMUw7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSE9XTl9MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gY2hvd25fbG9uZ29wdHM7CisjZW5kaWYKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMiI7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgT1BUX1NUUik7CisJYXJndiArPSBvcHRpbmQ7CisKKwkvKiBUaGlzIG1hdGNoZXMgY29yZXV0aWxzIGJlaGF2aW9yIChhbG1vc3QgLSBzZWUgYmVsb3cpICovCisJcGFyYW0uY2hvd25fZnVuYyA9IGNob3duOworCWlmIChPUFRfTk9ERVJFRgorCS8qIHx8IChPUFRfUkVDVVJTRSAmJiAhT1BUX1RSQVZFUlNFX1RPUCk6ICovCisJSUZfREVTS1RPUCggfHwgKG9wdCAmIChCSVRfUkVDVVJTRXxCSVRfVFJBVkVSU0VfVE9QKSkgPT0gQklUX1JFQ1VSU0UpCisJKSB7CisJCXBhcmFtLmNob3duX2Z1bmMgPSBsY2hvd247CisJfQorCisJZmxhZ3MgPSBBQ1RJT05fREVQVEhGSVJTVDsgLyogbWF0Y2ggY29yZXV0aWxzIG9yZGVyICovCisJaWYgKE9QVF9SRUNVUlNFKQorCQlmbGFncyB8PSBBQ1RJT05fUkVDVVJTRTsKKwlpZiAoT1BUX1RSQVZFUlNFX1RPUCkKKwkJZmxhZ3MgfD0gQUNUSU9OX0ZPTExPV0xJTktTX0wwOyAvKiAtSC8tTDogZm9sbG93IGxpbmtzIG9uIGRlcHRoIDAgKi8KKwlpZiAoT1BUX1RSQVZFUlNFKQorCQlmbGFncyB8PSBBQ1RJT05fRk9MTE9XTElOS1M7IC8qIGZvbGxvdyBsaW5rcyBpZiAtTCAqLworCisJcGFyc2VfY2hvd25fdXNlcmdyb3VwX29yX2RpZSgmcGFyYW0udWdpZCwgYXJndlswXSk7CisKKwkvKiBPaywgcmVhZHkgdG8gZG8gdGhlIGRlZWQgbm93ICovCisJd2hpbGUgKCorK2FyZ3YpIHsKKwkJaWYgKCFyZWN1cnNpdmVfYWN0aW9uKCphcmd2LAorCQkJCWZsYWdzLCAgICAgICAgICAvKiBmbGFncyAqLworCQkJCWZpbGVBY3Rpb24sICAgICAvKiBmaWxlIGFjdGlvbiAqLworCQkJCWZpbGVBY3Rpb24sICAgICAvKiBkaXIgYWN0aW9uICovCisJCQkJJnBhcmFtLCAgICAgICAgIC8qIHVzZXIgZGF0YSAqLworCQkJCTApICAgICAgICAgICAgICAvKiBkZXB0aCAqLworCQkpIHsKKwkJCXJldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwkJfQorCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qCitUZXN0Y2FzZS4gUnVuIGluIGVtcHR5IGRpcmVjdG9yeS4KKworIyEvYmluL3NoCit0MT0iL3RtcC9idXN5Ym94IGNob3duIgordDI9Ii91c3IvYmluL2Nob3duIgorY3JlYXRlKCkgeworICAgIHJtIC1yZiAkMTsgbWtkaXIgJDEKKyAgICAoCisgICAgY2QgJDEgfHwgZXhpdCAxCisgICAgbWtkaXIgZGlyIGRpcjIKKyAgICA+dXAKKyAgICA+ZmlsZQorICAgID5kaXIvZmlsZQorICAgID5kaXIyL2ZpbGUKKyAgICBsbiAtcyBkaXIgbGlua2RpcgorICAgIGxuIC1zIGZpbGUgbGlua2ZpbGUKKyAgICBsbiAtcyAuLi91cCBkaXIvbGlua3VwCisgICAgbG4gLXMgLi4vZGlyMiBkaXIvbGlua3VwZGlyMgorICAgICkKKyAgICBjaG93biAtUiAwOjAgJDEKK30KK3RzdCgpIHsKKyAgICBjcmVhdGUgdGVzdDEKKyAgICBjcmVhdGUgdGVzdDIKKyAgICBlY2hvICJbJDFdIiA+PnRlc3QxLm91dAorICAgIGVjaG8gIlskMV0iID4+dGVzdDIub3V0CisgICAgKGNkIHRlc3QxOyAkdDEgJDEpID4+dGVzdDEub3V0IDI+JjEKKyAgICAoY2QgdGVzdDI7ICR0MiAkMSkgPj50ZXN0Mi5vdXQgMj4mMQorICAgIChjZCB0ZXN0MTsgbHMgLWxuUikgPm91dDEKKyAgICAoY2QgdGVzdDI7IGxzIC1sblIpID5vdXQyCisgICAgZWNobyAiY2hvd24gJDEiID5vdXQuZGlmZgorICAgIGlmICEgZGlmZiAtdSBvdXQxIG91dDIgPj5vdXQuZGlmZjsgdGhlbiBleGl0IDE7IGZpCisgICAgcm0gb3V0LmRpZmYKK30KK3RzdF9mb3JfZWFjaCgpIHsKKyAgICB0c3QgIiQxIDE6MSBmaWxlIgorICAgIHRzdCAiJDEgMToxIGRpciIKKyAgICB0c3QgIiQxIDE6MSBsaW5rZGlyIgorICAgIHRzdCAiJDEgMToxIGxpbmtmaWxlIgorfQorZWNobyAiSWYgc2NyaXB0IHByb2R1Y2VkICdvdXQuZGlmZicgZmlsZSwgdGhlbiBhdCBsZWFzdCBvbmUgdGVzdGNhc2UgZmFpbGVkIgorPnRlc3QxLm91dAorPnRlc3QyLm91dAorIyBUaGVzZSBtYXRjaCBjb3JldXRpbHMgNi44OgordHN0X2Zvcl9lYWNoICItdiIKK3RzdF9mb3JfZWFjaCAiLXZSIgordHN0X2Zvcl9lYWNoICItdlJQIgordHN0X2Zvcl9lYWNoICItdlJMIgordHN0X2Zvcl9lYWNoICItdlJIIgordHN0X2Zvcl9lYWNoICItdmgiCit0c3RfZm9yX2VhY2ggIi12aFIiCit0c3RfZm9yX2VhY2ggIi12aFJQIgordHN0X2Zvcl9lYWNoICItdmhSTCIKK3RzdF9mb3JfZWFjaCAiLXZoUkgiCisjIEZpeCBgbmFtZScgaW4gY29yZXV0aWxzIG91dHB1dAorc2VkICdzL2AvJyInIicvZycgLWkgdGVzdDIub3V0CisjIENvbXBhcmUgdXMgd2l0aCBjb3JldXRpbHMgb3V0cHV0CitkaWZmIC11IHRlc3QxLm91dCB0ZXN0Mi5vdXQKKworKi8KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9jaHJvb3QuYyBiL2NvcmV1dGlscy9jaHJvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzNlNjZiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL2Nocm9vdC5jCkBAIC0wLDAgKzEsNDQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgY2hyb290IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgTi9BIC0tIE1hdGNoZXMgR05VIGJlaGF2aW9yLiAqLworCisvL3VzYWdlOiNkZWZpbmUgY2hyb290X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJORVdST09UIFtQUk9HIEFSR1NdIgorLy91c2FnZTojZGVmaW5lIGNocm9vdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJ1biBQUk9HIHdpdGggcm9vdCBkaXJlY3Rvcnkgc2V0IHRvIE5FV1JPT1QiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGNocm9vdF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBscyAtbCAvYmluL2xzXG4iCisvL3VzYWdlOiAgICAgICAibHJ3eHJ3eHJ3eCAgICAxIHJvb3QgICAgIHJvb3QgICAgICAgICAgMTIgQXByIDEzIDAwOjQ2IC9iaW4vbHMgLT4gL0J1c3lCb3hcbiIKKy8vdXNhZ2U6ICAgICAgICIjIG1vdW50IC9kZXYvaGRjMSAvbW50IC10IG1pbml4XG4iCisvL3VzYWdlOiAgICAgICAiIyBjaHJvb3QgL21udFxuIgorLy91c2FnZTogICAgICAgIiMgbHMgLWwgL2Jpbi9sc1xuIgorLy91c2FnZTogICAgICAgIi1yd3hyLXhyLXggICAgMSByb290ICAgICByb290ICAgICAgICA0MDgxNiBGZWIgIDUgMDc6NDUgL2Jpbi9scypcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBjaHJvb3RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGNocm9vdF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJKythcmd2OworCWlmICghKmFyZ3YpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl4Y2hyb290KCphcmd2KTsKKworCSsrYXJndjsKKwlpZiAoISphcmd2KSB7IC8qIG5vIDJuZCBwYXJhbSAoUFJPRyksIHVzZSBzaGVsbCAqLworCQlhcmd2IC09IDI7CisJCWFyZ3ZbMF0gPSAoY2hhciAqKSBnZXRfc2hlbGxfbmFtZSgpOworCQlhcmd2WzFdID0gKGNoYXIgKikgIi1pIjsgLyogR05VIGNvcmV1dGlscyA4LjQgY29tcGF0ICovCisJCS8qYXJndlsyXSA9IE5VTEw7IC0gYWxyZWFkeSBpcyAqLworCX0KKworCUJCX0VYRUNWUF9vcl9kaWUoYXJndik7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvY2tzdW0uYyBiL2NvcmV1dGlscy9ja3N1bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMGIwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvY2tzdW0uYwpAQCAtMCwwICsxLDcxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBja3N1bSAtIGNhbGN1bGF0ZSB0aGUgQ1JDMzIgY2hlY2tzdW0gb2YgYSBmaWxlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IGJ5IFJvYiBTdWxsaXZhbiwgd2l0aCBpZGVhcyBmcm9tIGNvZGUgYnkgV2FsdGVyIEhhcm1zCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgY2tzdW1fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkZJTEVTLi4uIgorLy91c2FnZTojZGVmaW5lIGNrc3VtX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ2FsY3VsYXRlIHRoZSBDUkMzMiBjaGVja3N1bXMgb2YgRklMRVMiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9FWEVDIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitpbnQgY2tzdW1fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGNrc3VtX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1aW50MzJfdCAqY3JjMzJfdGFibGUgPSBjcmMzMl9maWxsdGFibGUoTlVMTCwgMSk7CisJdWludDMyX3QgY3JjOworCW9mZl90IGxlbmd0aCwgZmlsZXNpemU7CisJaW50IGJ5dGVzX3JlYWQ7CisJaW50IGV4aXRfY29kZSA9IEVYSVRfU1VDQ0VTUzsKKworI2lmIEVOQUJMRV9ERVNLVE9QCisJZ2V0b3B0MzIoYXJndiwgIiIpOyAvKiBjb3JldXRpbHMgNi45IGNvbXBhdCAqLworCWFyZ3YgKz0gb3B0aW5kOworI2Vsc2UKKwlhcmd2Kys7CisjZW5kaWYKKworCWRvIHsKKwkJaW50IGZkID0gb3Blbl9vcl93YXJuX3N0ZGluKCphcmd2ID8gKmFyZ3YgOiBiYl9tc2dfc3RhbmRhcmRfaW5wdXQpOworCisJCWlmIChmZCA8IDApIHsKKwkJCWV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNyYyA9IDA7CisJCWxlbmd0aCA9IDA7CisKKyNkZWZpbmUgcmVhZF9idWYgYmJfY29tbW9uX2J1ZnNpejEKKwkJd2hpbGUgKChieXRlc19yZWFkID0gc2FmZV9yZWFkKGZkLCByZWFkX2J1Ziwgc2l6ZW9mKHJlYWRfYnVmKSkpID4gMCkgeworCQkJbGVuZ3RoICs9IGJ5dGVzX3JlYWQ7CisJCQljcmMgPSBjcmMzMl9ibG9ja19lbmRpYW4xKGNyYywgcmVhZF9idWYsIGJ5dGVzX3JlYWQsIGNyYzMyX3RhYmxlKTsKKwkJfQorCQljbG9zZShmZCk7CisKKwkJZmlsZXNpemUgPSBsZW5ndGg7CisKKwkJd2hpbGUgKGxlbmd0aCkgeworCQkJY3JjID0gKGNyYyA8PCA4KSBeIGNyYzMyX3RhYmxlWyh1aW50OF90KShjcmMgPj4gMjQpIF4gKHVpbnQ4X3QpbGVuZ3RoXTsKKwkJCS8qIG11c3QgZW5zdXJlIHRoYXQgc2hpZnQgaXMgdW5zaWduZWQhICovCisJCQlpZiAoc2l6ZW9mKGxlbmd0aCkgPD0gc2l6ZW9mKHVuc2lnbmVkKSkKKwkJCQlsZW5ndGggPSAodW5zaWduZWQpbGVuZ3RoID4+IDg7CisJCQllbHNlIGlmIChzaXplb2YobGVuZ3RoKSA8PSBzaXplb2YodW5zaWduZWQgbG9uZykpCisJCQkJbGVuZ3RoID0gKHVuc2lnbmVkIGxvbmcpbGVuZ3RoID4+IDg7CisJCQllbHNlCisJCQkJbGVuZ3RoID0gKHVuc2lnbmVkIGxvbmcgbG9uZylsZW5ndGggPj4gODsKKwkJfQorCQljcmMgPSB+Y3JjOworCisJCXByaW50ZigoKmFyZ3YgPyAiJSJQUkl1MzIiICUiT0ZGX0ZNVCJpICVzXG4iIDogIiUiUFJJdTMyIiAlIk9GRl9GTVQiaVxuIiksCisJCQkJY3JjLCBmaWxlc2l6ZSwgKmFyZ3YpOworCX0gd2hpbGUgKCphcmd2ICYmICorK2FyZ3YpOworCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChleGl0X2NvZGUpOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2NvbW0uYyBiL2NvcmV1dGlscy9jb21tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q0NTA5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9jb21tLmMKQEAgLTAsMCArMSwxMDggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgY29tbSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBieSBSb2JlcnQgU3VsbGl2YW4gPGNvZ2l0by5lcmdvLmNvZ2l0b0BnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgY29tbV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy0xMjNdIEZJTEUxIEZJTEUyIgorLy91c2FnZTojZGVmaW5lIGNvbW1fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb21wYXJlIEZJTEUxIHdpdGggRklMRTJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLTEJU3VwcHJlc3MgbGluZXMgdW5pcXVlIHRvIEZJTEUxIgorLy91c2FnZTogICAgICJcbgktMglTdXBwcmVzcyBsaW5lcyB1bmlxdWUgdG8gRklMRTIiCisvL3VzYWdlOiAgICAgIlxuCS0zCVN1cHByZXNzIGxpbmVzIGNvbW1vbiB0byBib3RoIGZpbGVzIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2RlZmluZSBDT01NX09QVF8xICgxIDw8IDApCisjZGVmaW5lIENPTU1fT1BUXzIgKDEgPDwgMSkKKyNkZWZpbmUgQ09NTV9PUFRfMyAoMSA8PCAyKQorCisvKiB3cml0ZWxpbmUgb3V0cHV0cyB0aGUgaW5wdXQgZ2l2ZW4sIGFwcHJvcHJpYXRlbHkgYWxpZ25lZCBhY2NvcmRpbmcgdG8gY2xhc3MgKi8KK3N0YXRpYyB2b2lkIHdyaXRlbGluZShjaGFyICpsaW5lLCBpbnQgY2xhc3MpCit7CisJaW50IGZsYWdzID0gb3B0aW9uX21hc2szMjsKKwlpZiAoY2xhc3MgPT0gMCkgeworCQlpZiAoZmxhZ3MgJiBDT01NX09QVF8xKQorCQkJcmV0dXJuOworCX0gZWxzZSBpZiAoY2xhc3MgPT0gMSkgeworCQlpZiAoZmxhZ3MgJiBDT01NX09QVF8yKQorCQkJcmV0dXJuOworCQlpZiAoIShmbGFncyAmIENPTU1fT1BUXzEpKQorCQkJcHV0Y2hhcignXHQnKTsKKwl9IGVsc2UgLyppZiAoY2xhc3MgPT0gMikqLyB7CisJCWlmIChmbGFncyAmIENPTU1fT1BUXzMpCisJCQlyZXR1cm47CisJCWlmICghKGZsYWdzICYgQ09NTV9PUFRfMSkpCisJCQlwdXRjaGFyKCdcdCcpOworCQlpZiAoIShmbGFncyAmIENPTU1fT1BUXzIpKQorCQkJcHV0Y2hhcignXHQnKTsKKwl9CisJcHV0cyhsaW5lKTsKK30KKworaW50IGNvbW1fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGNvbW1fbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKnRoaXNsaW5lWzJdOworCUZJTEUgKnN0cmVhbVsyXTsKKwlpbnQgaTsKKwlpbnQgb3JkZXI7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MiI7CisJZ2V0b3B0MzIoYXJndiwgIjEyMyIpOworCWFyZ3YgKz0gb3B0aW5kOworCisJZm9yIChpID0gMDsgaSA8IDI7ICsraSkgeworCQlzdHJlYW1baV0gPSB4Zm9wZW5fc3RkaW4oYXJndltpXSk7CisJfQorCisJb3JkZXIgPSAwOworCXRoaXNsaW5lWzFdID0gdGhpc2xpbmVbMF0gPSBOVUxMOworCXdoaWxlICgxKSB7CisJCWlmIChvcmRlciA8PSAwKSB7CisJCQlmcmVlKHRoaXNsaW5lWzBdKTsKKwkJCXRoaXNsaW5lWzBdID0geG1hbGxvY19mZ2V0bGluZShzdHJlYW1bMF0pOworCQl9CisJCWlmIChvcmRlciA+PSAwKSB7CisJCQlmcmVlKHRoaXNsaW5lWzFdKTsKKwkJCXRoaXNsaW5lWzFdID0geG1hbGxvY19mZ2V0bGluZShzdHJlYW1bMV0pOworCQl9CisKKwkJaSA9ICF0aGlzbGluZVswXSArICghdGhpc2xpbmVbMV0gPDwgMSk7CisJCWlmIChpKQorCQkJYnJlYWs7CisJCW9yZGVyID0gc3RyY21wKHRoaXNsaW5lWzBdLCB0aGlzbGluZVsxXSk7CisKKwkJaWYgKG9yZGVyID49IDApCisJCQl3cml0ZWxpbmUodGhpc2xpbmVbMV0sIG9yZGVyID8gMSA6IDIpOworCQllbHNlCisJCQl3cml0ZWxpbmUodGhpc2xpbmVbMF0sIDApOworCX0KKworCS8qIEVPRiBhdCBsZWFzdCBvbiBvbmUgb2YgdGhlIHN0cmVhbXMgKi8KKwlpICY9IDE7CisJaWYgKHRoaXNsaW5lW2ldKSB7CisJCS8qIHN0cmVhbVtpXSBpcyBub3QgYXQgRU9GIHlldCAqLworCQkvKiB3ZSBkaWQgbm90IHByaW50IHRoaXNsaW5lW2ldIHlldCAqLworCQljaGFyICpwID0gdGhpc2xpbmVbaV07CisJCXdyaXRlbGluZShwLCBpKTsKKwkJd2hpbGUgKDEpIHsKKwkJCWZyZWUocCk7CisJCQlwID0geG1hbGxvY19mZ2V0bGluZShzdHJlYW1baV0pOworCQkJaWYgKCFwKQorCQkJCWJyZWFrOworCQkJd3JpdGVsaW5lKHAsIGkpOworCQl9CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZjbG9zZShzdHJlYW1bMF0pOworCQlmY2xvc2Uoc3RyZWFtWzFdKTsKKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2NwLmMgYi9jb3JldXRpbHMvY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDdlZDBmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL2NwLmMKQEAgLTAsMCArMSwyMDcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgY3AgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgYnkgTWF0dCBLcmFhaSA8a3JhYWlAYWx1bW5pLmNhcm5lZ2llbWVsbG9uLmVkdT4KKyAqIFNFTGludXggc3VwcG9ydCBieSBZdWljaGkgTmFrYW11cmEgPHluYWthbUBoaXRhY2hpc29mdC5qcD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvY3AuaHRtbCAqLworCisvKiBNYXIgMTYsIDIwMDMgICAgICBNYW51ZWwgTm92b2EgSUlJICAgKG1qbjNAY29kZXBvZXQub3JnKQorICoKKyAqIFNpemUgcmVkdWN0aW9uLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBjcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFNPVVJDRS4uLiBERVNUIgorLy91c2FnZTojZGVmaW5lIGNwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ29weSBTT1VSQ0UocykgdG8gREVTVFxuIgorLy91c2FnZTogICAgICJcbgktYQlTYW1lIGFzIC1kcFIiCisvL3VzYWdlOglJRl9TRUxJTlVYKAorLy91c2FnZTogICAgICJcbgktYwlQcmVzZXJ2ZSBzZWN1cml0eSBjb250ZXh0IgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktUiwtcglSZWN1cnNlIgorLy91c2FnZTogICAgICJcbgktZCwtUAlQcmVzZXJ2ZSBzeW1saW5rcyAoZGVmYXVsdCBpZiAtUikiCisvL3VzYWdlOiAgICAgIlxuCS1MCUZvbGxvdyBhbGwgc3ltbGlua3MiCisvL3VzYWdlOiAgICAgIlxuCS1ICUZvbGxvdyBzeW1saW5rcyBvbiBjb21tYW5kIGxpbmUiCisvL3VzYWdlOiAgICAgIlxuCS1wCVByZXNlcnZlIGZpbGUgYXR0cmlidXRlcyBpZiBwb3NzaWJsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJT3ZlcndyaXRlIgorLy91c2FnZTogICAgICJcbgktaQlQcm9tcHQgYmVmb3JlIG92ZXJ3cml0ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWwsLXMJQ3JlYXRlIChzeW0pbGlua3MiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImxpYmNvcmV1dGlscy9jb3JldXRpbHMuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworaW50IGNwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3Qgc3RhdCBzb3VyY2Vfc3RhdDsKKwlzdHJ1Y3Qgc3RhdCBkZXN0X3N0YXQ7CisJY29uc3QgY2hhciAqbGFzdDsKKwljb25zdCBjaGFyICpkZXN0OworCWludCBzX2ZsYWdzOworCWludCBkX2ZsYWdzOworCWludCBmbGFnczsKKwlpbnQgc3RhdHVzOworCWVudW0geworCQlPUFRfYSA9IDEgPDwgKHNpemVvZihGSUxFVVRJTFNfQ1BfT1BUU1RSKS0xKSwKKwkJT1BUX3IgPSAxIDw8IChzaXplb2YoRklMRVVUSUxTX0NQX09QVFNUUikpLAorCQlPUFRfUCA9IDEgPDwgKHNpemVvZihGSUxFVVRJTFNfQ1BfT1BUU1RSKSsxKSwKKwkJT1BUX3YgPSAxIDw8IChzaXplb2YoRklMRVVUSUxTX0NQX09QVFNUUikrMiksCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ1BfTE9OR19PUFRJT05TCisJCU9QVF9wYXJlbnRzID0gMSA8PCAoc2l6ZW9mKEZJTEVVVElMU19DUF9PUFRTVFIpKzMpLAorI2VuZGlmCisJfTsKKworCS8vIE5lZWQgYXQgbGVhc3QgdHdvIGFyZ3VtZW50cworCS8vIFNvZnQtIGFuZCBoYXJkbGlua2luZyBkb2Vzbid0IG1peAorCS8vIC1QIGFuZCAtZCBhcmUgdGhlIHNhbWUgKC1QIGlzIFBPU0lYLCAtZCBpcyBHTlUpCisJLy8gLXIgYW5kIC1SIGFyZSB0aGUgc2FtZQorCS8vIC1SIChhbmQgdGhlcmVmb3JlIC1yKSB0dXJucyBvbiAtZCAoY29yZXV0aWxzIGRvZXMgdGhpcykKKwkvLyAtYSA9IC1wZFIKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMjpsLS1zOnMtLWw6UGQ6clJkOlJkOmFwZFIiOworI2lmIEVOQUJMRV9GRUFUVVJFX0NQX0xPTkdfT1BUSU9OUworCWFwcGxldF9sb25nX29wdGlvbnMgPQorCQkiYXJjaGl2ZVwwIiAgICAgICAgTm9fYXJndW1lbnQgImEiCisJCSJmb3JjZVwwIiAgICAgICAgICBOb19hcmd1bWVudCAiZiIKKwkJImludGVyYWN0aXZlXDAiICAgIE5vX2FyZ3VtZW50ICJpIgorCQkibGlua1wwIiAgICAgICAgICAgTm9fYXJndW1lbnQgImwiCisJCSJkZXJlZmVyZW5jZVwwIiAgICBOb19hcmd1bWVudCAiTCIKKwkJIm5vLWRlcmVmZXJlbmNlXDAiIE5vX2FyZ3VtZW50ICJQIgorCQkicmVjdXJzaXZlXDAiICAgICAgTm9fYXJndW1lbnQgIlIiCisJCSJzeW1ib2xpYy1saW5rXDAiICBOb19hcmd1bWVudCAicyIKKwkJInZlcmJvc2VcMCIgICAgICAgIE5vX2FyZ3VtZW50ICJ2IgorCQkicGFyZW50c1wwIiAgICAgICAgTm9fYXJndW1lbnQgIlx4ZmYiCisJCTsKKyNlbmRpZgorCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgRklMRVVUSUxTX0NQX09QVFNUUiAiYXJQdiIpOworCS8qIE9wdGlvbnMgb2YgY3AgZnJvbSBHTlUgY29yZXV0aWxzIDYuMTA6CisJICogLWEsIC0tYXJjaGl2ZQorCSAqIC1mLCAtLWZvcmNlCisJICogLWksIC0taW50ZXJhY3RpdmUKKwkgKiAtbCwgLS1saW5rCisJICogLUwsIC0tZGVyZWZlcmVuY2UKKwkgKiAtUCwgLS1uby1kZXJlZmVyZW5jZQorCSAqIC1SLCAtciwgLS1yZWN1cnNpdmUKKwkgKiAtcywgLS1zeW1ib2xpYy1saW5rCisJICogLXYsIC0tdmVyYm9zZQorCSAqIC1ICWZvbGxvdyBjb21tYW5kLWxpbmUgc3ltYm9saWMgbGlua3MgaW4gU09VUkNFCisJICogLWQJc2FtZSBhcyAtLW5vLWRlcmVmZXJlbmNlIC0tcHJlc2VydmU9bGlua3MKKwkgKiAtcAlzYW1lIGFzIC0tcHJlc2VydmU9bW9kZSxvd25lcnNoaXAsdGltZXN0YW1wcworCSAqIC1jCXNhbWUgYXMgLS1wcmVzZXJ2ZT1jb250ZXh0CisJICogLS1wYXJlbnRzCisJICoJdXNlIGZ1bGwgc291cmNlIGZpbGUgbmFtZSB1bmRlciBESVJFQ1RPUlkKKwkgKiBOT1QgU1VQUE9SVEVEIElOIEJCT1g6CisJICogLS1iYWNrdXBbPUNPTlRST0xdCisJICoJbWFrZSBhIGJhY2t1cCBvZiBlYWNoIGV4aXN0aW5nIGRlc3RpbmF0aW9uIGZpbGUKKwkgKiAtYglsaWtlIC0tYmFja3VwIGJ1dCBkb2VzIG5vdCBhY2NlcHQgYW4gYXJndW1lbnQKKwkgKiAtLWNvcHktY29udGVudHMKKwkgKgljb3B5IGNvbnRlbnRzIG9mIHNwZWNpYWwgZmlsZXMgd2hlbiByZWN1cnNpdmUKKwkgKiAtLXByZXNlcnZlWz1BVFRSX0xJU1RdCisJICoJcHJlc2VydmUgYXR0cmlidXRlcyAoZGVmYXVsdDogbW9kZSxvd25lcnNoaXAsdGltZXN0YW1wcyksCisJICoJaWYgcG9zc2libGUgYWRkaXRpb25hbCBhdHRyaWJ1dGVzOiBzZWN1cml0eSBjb250ZXh0LGxpbmtzLGFsbAorCSAqIC0tbm8tcHJlc2VydmU9QVRUUl9MSVNUCisJICogLS1yZW1vdmUtZGVzdGluYXRpb24KKwkgKglyZW1vdmUgIGVhY2ggZXhpc3RpbmcgZGVzdGluYXRpb24gZmlsZSBiZWZvcmUgYXR0ZW1wdGluZyB0byBvcGVuCisJICogLS1zcGFyc2U9V0hFTgorCSAqCWNvbnRyb2wgY3JlYXRpb24gb2Ygc3BhcnNlIGZpbGVzCisJICogLS1zdHJpcC10cmFpbGluZy1zbGFzaGVzCisJICoJcmVtb3ZlIGFueSB0cmFpbGluZyBzbGFzaGVzIGZyb20gZWFjaCBTT1VSQ0UgYXJndW1lbnQKKwkgKiAtUywgLS1zdWZmaXg9U1VGRklYCisJICoJb3ZlcnJpZGUgdGhlIHVzdWFsIGJhY2t1cCBzdWZmaXgKKwkgKiAtdCwgLS10YXJnZXQtZGlyZWN0b3J5PURJUkVDVE9SWQorCSAqCWNvcHkgYWxsIFNPVVJDRSBhcmd1bWVudHMgaW50byBESVJFQ1RPUlkKKwkgKiAtVCwgLS1uby10YXJnZXQtZGlyZWN0b3J5CisJICoJdHJlYXQgREVTVCBhcyBhIG5vcm1hbCBmaWxlCisJICogLXUsIC0tdXBkYXRlCisJICoJY29weSBvbmx5IHdoZW4gdGhlIFNPVVJDRSBmaWxlIGlzIG5ld2VyIHRoYW4gdGhlIGRlc3RpbmF0aW9uCisJICoJZmlsZSBvciB3aGVuIHRoZSBkZXN0aW5hdGlvbiBmaWxlIGlzIG1pc3NpbmcKKwkgKiAteCwgLS1vbmUtZmlsZS1zeXN0ZW0KKwkgKglzdGF5IG9uIHRoaXMgZmlsZSBzeXN0ZW0KKwkgKiAtWiwgLS1jb250ZXh0PUNPTlRFWFQKKwkgKgkoU0VMaW51eCkgc2V0IFNFTGludXggc2VjdXJpdHkgY29udGV4dCBvZiBjb3B5IHRvIENPTlRFWFQKKwkgKi8KKwlhcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKwkvKiBSZXZlcnNlIHRoaXMgYml0LiBJZiB0aGVyZSBpcyAtZCwgYml0IGlzIG5vdCBzZXQ6ICovCisJZmxhZ3MgXj0gRklMRVVUSUxTX0RFUkVGRVJFTkNFOworCS8qIGNvcmV1dGlscyA2LjkgY29tcGF0OgorCSAqIGJ5IGRlZmF1bHQsICJjcCIgZGVyZWZzIHN5bWxpbmtzIChjcmVhdGVzIHJlZ3VsYXIgZGVzdCBmaWxlcyksCisJICogYnV0ICJjcCAtUiIgZG9lcyBub3QuIFdlIHN3aXRjaCBvZmYgZGVyZWYgaWYgLXIgb3IgLVIgKHNlZSBhYm92ZSkuCisJICogSG93ZXZlciwgImNwIC1STCIgbXVzdCBzdGlsbCBkZXJlZiBzeW1saW5rczogKi8KKwlpZiAoZmxhZ3MgJiBGSUxFVVRJTFNfREVSRUZfU09GVExJTkspIC8qIC1MICovCisJCWZsYWdzIHw9IEZJTEVVVElMU19ERVJFRkVSRU5DRTsKKworI2lmIEVOQUJMRV9TRUxJTlVYCisJaWYgKGZsYWdzICYgRklMRVVUSUxTX1BSRVNFUlZFX1NFQ1VSSVRZX0NPTlRFWFQpIHsKKwkJc2VsaW51eF9vcl9kaWUoKTsKKwl9CisjZW5kaWYKKworCXN0YXR1cyA9IEVYSVRfU1VDQ0VTUzsKKwlsYXN0ID0gYXJndlthcmdjIC0gMV07CisJLyogSWYgdGhlcmUgYXJlIG9ubHkgdHdvIGFyZ3VtZW50cyBhbmQuLi4gICovCisJaWYgKGFyZ2MgPT0gMikgeworCQlzX2ZsYWdzID0gY3BfbXZfc3RhdDIoKmFyZ3YsICZzb3VyY2Vfc3RhdCwKKwkJCQkoZmxhZ3MgJiBGSUxFVVRJTFNfREVSRUZFUkVOQ0UpID8gc3RhdCA6IGxzdGF0KTsKKwkJaWYgKHNfZmxhZ3MgPCAwKQorCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJZF9mbGFncyA9IGNwX212X3N0YXQobGFzdCwgJmRlc3Rfc3RhdCk7CisJCWlmIChkX2ZsYWdzIDwgMCkKKwkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9DUF9MT05HX09QVElPTlMKKwkJaWYgKGZsYWdzICYgT1BUX3BhcmVudHMpIHsKKwkJCWlmICghKGRfZmxhZ3MgJiAyKSkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ3aXRoIC0tcGFyZW50cywgdGhlIGRlc3RpbmF0aW9uIG11c3QgYmUgYSBkaXJlY3RvcnkiKTsKKwkJCX0KKwkJfQorI2VuZGlmCisKKwkJLyogLi4uaWYgbmVpdGhlciBpcyBhIGRpcmVjdG9yeS4uLiAgKi8KKwkJaWYgKCEoKHNfZmxhZ3MgfCBkX2ZsYWdzKSAmIDIpCisJCSAgICAvKiAuLi5vcjogcmVjdXJzaW5nLCB0aGUgMXN0IGlzIGEgZGlyZWN0b3J5LCBhbmQgdGhlIDJuZCBkb2Vzbid0IGV4aXN0Li4uICovCisJCSB8fCAoKGZsYWdzICYgRklMRVVUSUxTX1JFQ1VSKSAmJiAoc19mbGFncyAmIDIpICYmICFkX2ZsYWdzKQorCQkpIHsKKwkJCS8qIERvIGEgc2ltcGxlIGNvcHkgKi8KKwkJCWRlc3QgPSBsYXN0OworCQkJZ290byBET19DT1BZOyAvKiBOQjogYXJnYz09MiAtPiAqKythcmd2PT1sYXN0ICovCisJCX0KKwl9CisKKwl3aGlsZSAoMSkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0NQX0xPTkdfT1BUSU9OUworCQlpZiAoZmxhZ3MgJiBPUFRfcGFyZW50cykgeworCQkJY2hhciAqZGVzdF9kdXA7CisJCQljaGFyICpkZXN0X2RpcjsKKwkJCWRlc3QgPSBjb25jYXRfcGF0aF9maWxlKGxhc3QsICphcmd2KTsKKwkJCWRlc3RfZHVwID0geHN0cmR1cChkZXN0KTsKKwkJCWRlc3RfZGlyID0gZGlybmFtZShkZXN0X2R1cCk7CisJCQlpZiAoYmJfbWFrZV9kaXJlY3RvcnkoZGVzdF9kaXIsIC0xLCBGSUxFVVRJTFNfUkVDVVIpKSB7CisJCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJCX0KKwkJCWZyZWUoZGVzdF9kdXApOworCQkJZ290byBET19DT1BZOworCQl9CisjZW5kaWYKKwkJZGVzdCA9IGNvbmNhdF9wYXRoX2ZpbGUobGFzdCwgYmJfZ2V0X2xhc3RfcGF0aF9jb21wb25lbnRfc3RyaXAoKmFyZ3YpKTsKKyBET19DT1BZOgorCQlpZiAoY29weV9maWxlKCphcmd2LCBkZXN0LCBmbGFncykgPCAwKSB7CisJCQlzdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCX0KKwkJaWYgKCorK2FyZ3YgPT0gbGFzdCkgeworCQkJLyogcG9zc2libHkgbGVha2luZyBkZXN0Li4uICovCisJCQlicmVhazsKKwkJfQorCQkvKiBkb24ndCBtb3ZlIHVwOiBkZXN0IG1heSBiZSA9PSBsYXN0IGFuZCBub3QgbWFsbG9jZWQhICovCisJCWZyZWUoKHZvaWQqKWRlc3QpOworCX0KKworCS8qIEV4aXQuIFdlIGFyZSBOT0VYRUMsIG5vdCBOT0ZPUksuIFdlIGRvIGV4aXQgYXQgdGhlIGVuZCBvZiBtYWluKCkgKi8KKwlyZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2N1dC5jIGIvY29yZXV0aWxzL2N1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NDQ5YzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvY3V0LmMKQEAgLTAsMCArMSwzMDYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGN1dC5jIC0gbWluaW1hbGlzdCB2ZXJzaW9uIG9mIGN1dAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwLDIwMDEgYnkgTGluZW8sIGluYy4KKyAqIFdyaXR0ZW4gYnkgTWFyayBXaGl0bGV5IDxtYXJrd0Bjb2RlcG9ldC5vcmc+CisgKiBkZWJsb2F0ZWQgYnkgQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgY3V0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGN1dF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IHNlbGVjdGVkIGZpZWxkcyBmcm9tIGVhY2ggaW5wdXQgRklMRSB0byBzdGRvdXRcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWIgTElTVAlPdXRwdXQgb25seSBieXRlcyBmcm9tIExJU1QiCisvL3VzYWdlOiAgICAgIlxuCS1jIExJU1QJT3V0cHV0IG9ubHkgY2hhcmFjdGVycyBmcm9tIExJU1QiCisvL3VzYWdlOiAgICAgIlxuCS1kIENIQVIJVXNlIENIQVIgaW5zdGVhZCBvZiB0YWIgYXMgdGhlIGZpZWxkIGRlbGltaXRlciIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJT3V0cHV0IG9ubHkgdGhlIGxpbmVzIGNvbnRhaW5pbmcgZGVsaW1pdGVyIgorLy91c2FnZTogICAgICJcbgktZiBOCVByaW50IG9ubHkgdGhlc2UgZmllbGRzIgorLy91c2FnZTogICAgICJcbgktbglJZ25vcmVkIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBjdXRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgZWNobyBcIkhlbGxvIHdvcmxkXCIgfCBjdXQgLWYgMSAtZCAnICdcbiIKKy8vdXNhZ2U6ICAgICAgICJIZWxsb1xuIgorLy91c2FnZTogICAgICAgIiQgZWNobyBcIkhlbGxvIHdvcmxkXCIgfCBjdXQgLWYgMiAtZCAnICdcbiIKKy8vdXNhZ2U6ICAgICAgICJ3b3JsZFxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworCisvKiBvcHRpb24gdmFycyAqLworc3RhdGljIGNvbnN0IGNoYXIgb3B0c3RyaW5nW10gQUxJR04xID0gImI6YzpmOmQ6c24iOworI2RlZmluZSBDVVRfT1BUX0JZVEVfRkxHUyAgICAgKDEgPDwgMCkKKyNkZWZpbmUgQ1VUX09QVF9DSEFSX0ZMR1MgICAgICgxIDw8IDEpCisjZGVmaW5lIENVVF9PUFRfRklFTERTX0ZMR1MgICAoMSA8PCAyKQorI2RlZmluZSBDVVRfT1BUX0RFTElNX0ZMR1MgICAgKDEgPDwgMykKKyNkZWZpbmUgQ1VUX09QVF9TVVBQUkVTU19GTEdTICgxIDw8IDQpCisKK3N0cnVjdCBjdXRfbGlzdCB7CisJaW50IHN0YXJ0cG9zOworCWludCBlbmRwb3M7Cit9OworCitlbnVtIHsKKwlCT0wgPSAwLAorCUVPTCA9IElOVF9NQVgsCisJTk9OX1JBTkdFID0gLTEKK307CisKK3N0YXRpYyBpbnQgY21wZnVuYyhjb25zdCB2b2lkICphLCBjb25zdCB2b2lkICpiKQoreworCXJldHVybiAoKChzdHJ1Y3QgY3V0X2xpc3QgKikgYSktPnN0YXJ0cG9zIC0KKwkJCSgoc3RydWN0IGN1dF9saXN0ICopIGIpLT5zdGFydHBvcyk7Cit9CisKK3N0YXRpYyB2b2lkIGN1dF9maWxlKEZJTEUgKmZpbGUsIGNoYXIgZGVsaW0sIGNvbnN0IHN0cnVjdCBjdXRfbGlzdCAqY3V0X2xpc3RzLCB1bnNpZ25lZCBubGlzdHMpCit7CisJY2hhciAqbGluZTsKKwl1bnNpZ25lZCBsaW5lbnVtID0gMDsJLyoga2VlcCB0aGVzZSB6ZXJvLWJhc2VkIHRvIGJlIGNvbnNpc3RlbnQgKi8KKworCS8qIGdvIHRocm91Z2ggZXZlcnkgbGluZSBpbiB0aGUgZmlsZSAqLworCXdoaWxlICgobGluZSA9IHhtYWxsb2NfZmdldGxpbmUoZmlsZSkpICE9IE5VTEwpIHsKKworCQkvKiBzZXQgdXAgYSBsaXN0IHNvIHdlIGNhbiBrZWVwIHRyYWNrIG9mIHdoYXQncyBiZWVuIHByaW50ZWQgKi8KKwkJaW50IGxpbmVsZW4gPSBzdHJsZW4obGluZSk7CisJCWNoYXIgKnByaW50ZWQgPSB4emFsbG9jKGxpbmVsZW4gKyAxKTsKKwkJY2hhciAqb3JpZ19saW5lID0gbGluZTsKKwkJdW5zaWduZWQgY2xfcG9zID0gMDsKKwkJaW50IHNwb3M7CisKKwkJLyogY3V0IGJhc2VkIG9uIGNoYXJzL2J5dGVzIFhYWDogb25seSB3b3JrcyB3aGVuIHNpemVvZihjaGFyKSA9PSBieXRlICovCisJCWlmIChvcHRpb25fbWFzazMyICYgKENVVF9PUFRfQ0hBUl9GTEdTIHwgQ1VUX09QVF9CWVRFX0ZMR1MpKSB7CisJCQkvKiBwcmludCB0aGUgY2hhcnMgc3BlY2lmaWVkIGluIGVhY2ggY3V0IGxpc3QgKi8KKwkJCWZvciAoOyBjbF9wb3MgPCBubGlzdHM7IGNsX3BvcysrKSB7CisJCQkJc3BvcyA9IGN1dF9saXN0c1tjbF9wb3NdLnN0YXJ0cG9zOworCQkJCXdoaWxlIChzcG9zIDwgbGluZWxlbikgeworCQkJCQlpZiAoIXByaW50ZWRbc3Bvc10pIHsKKwkJCQkJCXByaW50ZWRbc3Bvc10gPSAnWCc7CisJCQkJCQlwdXRjaGFyKGxpbmVbc3Bvc10pOworCQkJCQl9CisJCQkJCXNwb3MrKzsKKwkJCQkJaWYgKHNwb3MgPiBjdXRfbGlzdHNbY2xfcG9zXS5lbmRwb3MKKwkJCQkJLyogTk9OX1JBTkdFIGlzIC0xLCBzbyBpZiBiZWxvdyBpcyB0cnVlLAorCQkJCQkgKiB0aGUgYWJvdmUgd2FzIHRydWUgdG9vIChzcG9zIGlzID49IDApICovCisJCQkJCS8qIHx8IGN1dF9saXN0c1tjbF9wb3NdLmVuZHBvcyA9PSBOT05fUkFOR0UgKi8KKwkJCQkJKSB7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSBlbHNlIGlmIChkZWxpbSA9PSAnXG4nKSB7CS8qIGN1dCBieSBsaW5lcyAqLworCQkJc3BvcyA9IGN1dF9saXN0c1tjbF9wb3NdLnN0YXJ0cG9zOworCisJCQkvKiBnZXQgb3V0IGlmIHdlIGhhdmUgbm8gbW9yZSBsaXN0cyB0byBwcm9jZXNzIG9yIGlmIHRoZSBsaW5lcworCQkJICogYXJlIGxvd2VyIHRoYW4gd2hhdCB3ZSdyZSBpbnRlcmVzdGVkIGluICovCisJCQlpZiAoKChpbnQpbGluZW51bSA8IHNwb3MpIHx8IChjbF9wb3MgPj0gbmxpc3RzKSkKKwkJCQlnb3RvIG5leHRfbGluZTsKKworCQkJLyogaWYgdGhlIGxpbmUgd2UncmUgbG9va2luZyBmb3IgaXMgbG93ZXIgdGhhbiB0aGUgb25lIHdlIHdlcmUKKwkJCSAqIHBhc3NlZCwgaXQgbWVhbnMgd2UgZGlzcGxheWVkIGl0IGFscmVhZHksIHNvIG1vdmUgb24gKi8KKwkJCXdoaWxlIChzcG9zIDwgKGludClsaW5lbnVtKSB7CisJCQkJc3BvcysrOworCQkJCS8qIGdvIHRvIHRoZSBuZXh0IGxpc3QgaWYgd2UncmUgYXQgdGhlIGVuZCBvZiB0aGlzIG9uZSAqLworCQkJCWlmIChzcG9zID4gY3V0X2xpc3RzW2NsX3Bvc10uZW5kcG9zCisJCQkJIHx8IGN1dF9saXN0c1tjbF9wb3NdLmVuZHBvcyA9PSBOT05fUkFOR0UKKwkJCQkpIHsKKwkJCQkJY2xfcG9zKys7CisJCQkJCS8qIGdldCBvdXQgaWYgdGhlcmUncyBubyBtb3JlIGxpc3RzIHRvIHByb2Nlc3MgKi8KKwkJCQkJaWYgKGNsX3BvcyA+PSBubGlzdHMpCisJCQkJCQlnb3RvIG5leHRfbGluZTsKKwkJCQkJc3BvcyA9IGN1dF9saXN0c1tjbF9wb3NdLnN0YXJ0cG9zOworCQkJCQkvKiBnZXQgb3V0IGlmIHRoZSBjdXJyZW50IGxpbmUgaXMgbG93ZXIgdGhhbiB0aGUgb25lCisJCQkJCSAqIHdlIGp1c3QgYmVjYW1lIGludGVyZXN0ZWQgaW4gKi8KKwkJCQkJaWYgKChpbnQpbGluZW51bSA8IHNwb3MpCisJCQkJCQlnb3RvIG5leHRfbGluZTsKKwkJCQl9CisJCQl9CisKKwkJCS8qIElmIHdlIG1hZGUgaXQgaGVyZSwgaXQgbWVhbnMgd2UndmUgZm91bmQgdGhlIGxpbmUgd2UncmUKKwkJCSAqIGxvb2tpbmcgZm9yLCBzbyBwcmludCBpdCAqLworCQkJcHV0cyhsaW5lKTsKKwkJCWdvdG8gbmV4dF9saW5lOworCQl9IGVsc2UgewkJLyogY3V0IGJ5IGZpZWxkcyAqLworCQkJaW50IG5kZWxpbSA9IC0xOwkvKiB6ZXJvLWJhc2VkIC8gb25lLWJhc2VkIHByb2JsZW0gKi8KKwkJCWludCBuZmllbGRzX3ByaW50ZWQgPSAwOworCQkJY2hhciAqZmllbGQgPSBOVUxMOworCQkJY2hhciBkZWxpbWl0ZXJbMl07CisKKwkJCWRlbGltaXRlclswXSA9IGRlbGltOworCQkJZGVsaW1pdGVyWzFdID0gMDsKKworCQkJLyogZG9lcyB0aGlzIGxpbmUgY29udGFpbiBhbnkgZGVsaW1pdGVycz8gKi8KKwkJCWlmIChzdHJjaHIobGluZSwgZGVsaW0pID09IE5VTEwpIHsKKwkJCQlpZiAoIShvcHRpb25fbWFzazMyICYgQ1VUX09QVF9TVVBQUkVTU19GTEdTKSkKKwkJCQkJcHV0cyhsaW5lKTsKKwkJCQlnb3RvIG5leHRfbGluZTsKKwkJCX0KKworCQkJLyogcHJvY2VzcyBlYWNoIGxpc3Qgb24gdGhpcyBsaW5lLCBmb3IgYXMgbG9uZyBhcyB3ZSd2ZSBnb3QKKwkJCSAqIGEgbGluZSB0byBwcm9jZXNzICovCisJCQlmb3IgKDsgY2xfcG9zIDwgbmxpc3RzICYmIGxpbmU7IGNsX3BvcysrKSB7CisJCQkJc3BvcyA9IGN1dF9saXN0c1tjbF9wb3NdLnN0YXJ0cG9zOworCQkJCWRvIHsKKwkJCQkJLyogZmluZCB0aGUgZmllbGQgd2UncmUgbG9va2luZyBmb3IgKi8KKwkJCQkJd2hpbGUgKGxpbmUgJiYgbmRlbGltIDwgc3BvcykgeworCQkJCQkJZmllbGQgPSBzdHJzZXAoJmxpbmUsIGRlbGltaXRlcik7CisJCQkJCQluZGVsaW0rKzsKKwkJCQkJfQorCisJCQkJCS8qIHdlIGZvdW5kIGl0LCBhbmQgaXQgaGFzbid0IGJlZW4gcHJpbnRlZCB5ZXQgKi8KKwkJCQkJaWYgKGZpZWxkICYmIG5kZWxpbSA9PSBzcG9zICYmICFwcmludGVkW25kZWxpbV0pIHsKKwkJCQkJCS8qIGlmIHRoaXMgaXNuJ3Qgb3VyIGZpcnN0IHRpbWUgdGhyb3VnaCwgd2UgbmVlZCB0bworCQkJCQkJICogcHJpbnQgdGhlIGRlbGltaXRlciBhZnRlciB0aGUgbGFzdCBmaWVsZCB0aGF0IHdhcworCQkJCQkJICogcHJpbnRlZCAqLworCQkJCQkJaWYgKG5maWVsZHNfcHJpbnRlZCA+IDApCisJCQkJCQkJcHV0Y2hhcihkZWxpbSk7CisJCQkJCQlmcHV0cyhmaWVsZCwgc3Rkb3V0KTsKKwkJCQkJCXByaW50ZWRbbmRlbGltXSA9ICdYJzsKKwkJCQkJCW5maWVsZHNfcHJpbnRlZCsrOwkvKiBzaG91bGRuJ3Qgb3ZlcmZsb3cuLiAqLworCQkJCQl9CisKKwkJCQkJc3BvcysrOworCisJCQkJCS8qIGtlZXAgZ29pbmcgYXMgbG9uZyBhcyB3ZSBoYXZlIGEgbGluZSB0byB3b3JrIHdpdGgsCisJCQkJCSAqIHRoaXMgaXMgYSBsaXN0LCBhbmQgd2UncmUgbm90IGF0IHRoZSBlbmQgb2YgdGhhdAorCQkJCQkgKiBsaXN0ICovCisJCQkJfSB3aGlsZSAoc3BvcyA8PSBjdXRfbGlzdHNbY2xfcG9zXS5lbmRwb3MgJiYgbGluZQorCQkJCQkJJiYgY3V0X2xpc3RzW2NsX3Bvc10uZW5kcG9zICE9IE5PTl9SQU5HRSk7CisJCQl9CisJCX0KKwkJLyogaWYgd2UgcHJpbnRlZCBhbnl0aGluZyBhdCBhbGwsIHdlIG5lZWQgdG8gZmluaXNoIGl0IHdpdGggYQorCQkgKiBuZXdsaW5lIGN1eiB3ZSB3ZXJlIGhhbmRlZCBhIGNob21wZWQgbGluZSAqLworCQlwdXRjaGFyKCdcbicpOworIG5leHRfbGluZToKKwkJbGluZW51bSsrOworCQlmcmVlKHByaW50ZWQpOworCQlmcmVlKG9yaWdfbGluZSk7CisJfQorfQorCitpbnQgY3V0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjdXRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCS8qIGdyb3dhYmxlIGFycmF5IGhvbGRpbmcgYSBzZXJpZXMgb2YgbGlzdHMgKi8KKwlzdHJ1Y3QgY3V0X2xpc3QgKmN1dF9saXN0cyA9IE5VTEw7CisJdW5zaWduZWQgbmxpc3RzID0gMDsJLyogbnVtYmVyIG9mIGVsZW1lbnRzIGluIGFib3ZlIGxpc3QgKi8KKwljaGFyIGRlbGltID0gJ1x0JzsJLyogZGVsaW1pdGVyLCBkZWZhdWx0IGlzIHRhYiAqLworCWNoYXIgKnNvcHQsICpsdG9rOworCXVuc2lnbmVkIG9wdDsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gImItLWJjZjpjLS1iY2Y6Zi0tYmNmIjsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCBvcHRzdHJpbmcsICZzb3B0LCAmc29wdCwgJnNvcHQsICZsdG9rKTsKKy8vCWFyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCWlmICghKG9wdCAmIChDVVRfT1BUX0JZVEVfRkxHUyB8IENVVF9PUFRfQ0hBUl9GTEdTIHwgQ1VUX09QVF9GSUVMRFNfRkxHUykpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZXhwZWN0ZWQgYSBsaXN0IG9mIGJ5dGVzLCBjaGFyYWN0ZXJzLCBvciBmaWVsZHMiKTsKKworCWlmIChvcHQgJiBDVVRfT1BUX0RFTElNX0ZMR1MpIHsKKwkJaWYgKGx0b2tbMF0gJiYgbHRva1sxXSkgeyAvKiBtb3JlIHRoYW4gMSBjaGFyPyAqLworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRoZSBkZWxpbWl0ZXIgbXVzdCBiZSBhIHNpbmdsZSBjaGFyYWN0ZXIiKTsKKwkJfQorCQlkZWxpbSA9IGx0b2tbMF07CisJfQorCisJLyogIG5vbi1maWVsZCAoY2hhciBvciBieXRlKSBjdXR0aW5nIGhhcyBzb21lIHNwZWNpYWwgaGFuZGxpbmcgKi8KKwlpZiAoIShvcHQgJiBDVVRfT1BUX0ZJRUxEU19GTEdTKSkgeworCQlzdGF0aWMgY29uc3QgY2hhciBfb3Bfb25fZmllbGRbXSBBTElHTjEgPSAiIG9ubHkgd2hlbiBvcGVyYXRpbmcgb24gZmllbGRzIjsKKworCQlpZiAob3B0ICYgQ1VUX09QVF9TVVBQUkVTU19GTEdTKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZQorCQkJCSgic3VwcHJlc3Npbmcgbm9uLWRlbGltaXRlZCBsaW5lcyBtYWtlcyBzZW5zZSVzIiwKKwkJCQlfb3Bfb25fZmllbGQpOworCQl9CisJCWlmIChkZWxpbSAhPSAnXHQnKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZQorCQkJCSgiYSBkZWxpbWl0ZXIgbWF5IGJlIHNwZWNpZmllZCVzIiwgX29wX29uX2ZpZWxkKTsKKwkJfQorCX0KKworCS8qCisJICogcGFyc2UgbGlzdCBhbmQgcHV0IHZhbHVlcyBpbnRvIHN0YXJ0cG9zIGFuZCBlbmRwb3MuCisJICogdmFsaWQgbGlzdCBmb3JtYXRzOiBOLCBOLSwgTi1NLCAtTQorCSAqIG1vcmUgdGhhbiBvbmUgbGlzdCBjYW4gYmUgc2VwYXJhdGVkIGJ5IGNvbW1hcworCSAqLworCXsKKwkJY2hhciAqbnRvazsKKwkJaW50IHMgPSAwLCBlID0gMDsKKworCQkvKiB0YWtlIGFwYXJ0IHRoZSBsaXN0cywgb25lIGJ5IG9uZSAodGhleSBhcmUgc2VwYXJhdGVkIHdpdGggY29tbWFzKSAqLworCQl3aGlsZSAoKGx0b2sgPSBzdHJzZXAoJnNvcHQsICIsIikpICE9IE5VTEwpIHsKKworCQkJLyogaXQncyBhY3R1YWxseSBsZWdhbCB0byBwYXNzIGFuIGVtcHR5IGxpc3QgKi8KKwkJCWlmICghbHRva1swXSkKKwkJCQljb250aW51ZTsKKworCQkJLyogZ2V0IHRoZSBzdGFydCBwb3MgKi8KKwkJCW50b2sgPSBzdHJzZXAoJmx0b2ssICItIik7CisJCQlpZiAoIW50b2tbMF0pIHsKKwkJCQlzID0gQk9MOworCQkJfSBlbHNlIHsKKwkJCQlzID0geGF0b2lfcG9zaXRpdmUobnRvayk7CisJCQkJLyogYWNjb3VudCBmb3IgdGhlIGZhY3QgdGhhdCBhcnJheXMgYXJlIHplcm8gYmFzZWQsIHdoaWxlCisJCQkJICogdGhlIHVzZXIgZXhwZWN0cyB0aGUgZmlyc3QgY2hhciBvbiB0aGUgbGluZSB0byBiZSBjaGFyICMxICovCisJCQkJaWYgKHMgIT0gMCkKKwkJCQkJcy0tOworCQkJfQorCisJCQkvKiBnZXQgdGhlIGVuZCBwb3MgKi8KKwkJCWlmIChsdG9rID09IE5VTEwpIHsKKwkJCQllID0gTk9OX1JBTkdFOworCQkJfSBlbHNlIGlmICghbHRva1swXSkgeworCQkJCWUgPSBFT0w7CisJCQl9IGVsc2UgeworCQkJCWUgPSB4YXRvaV9wb3NpdGl2ZShsdG9rKTsKKwkJCQkvKiBpZiB0aGUgdXNlciBzcGVjaWZpZWQgYW5kIGVuZCBwb3NpdGlvbiBvZiAwLAorCQkJCSAqIHRoYXQgbWVhbnMgInRpbCB0aGUgZW5kIG9mIHRoZSBsaW5lIiAqLworCQkJCWlmIChlID09IDApCisJCQkJCWUgPSBFT0w7CisJCQkJZS0tOwkvKiBhZ2FpbiwgYXJyYXlzIGFyZSB6ZXJvIGJhc2VkLCBsaW5lcyBhcmUgMSBiYXNlZCAqLworCQkJCWlmIChlID09IHMpCisJCQkJCWUgPSBOT05fUkFOR0U7CisJCQl9CisKKwkJCS8qIGFkZCB0aGUgbmV3IGxpc3QgKi8KKwkJCWN1dF9saXN0cyA9IHhyZWFsbG9jX3ZlY3RvcihjdXRfbGlzdHMsIDQsIG5saXN0cyk7CisJCQkvKiBOQjogc3RhcnRwb3MgaXMgYWx3YXlzID49IDAsCisJCQkgKiB3aGlsZSBlbmRwb3MgbWF5IGJlID0gTk9OX1JBTkdFICgtMSkgKi8KKwkJCWN1dF9saXN0c1tubGlzdHNdLnN0YXJ0cG9zID0gczsKKwkJCWN1dF9saXN0c1tubGlzdHNdLmVuZHBvcyA9IGU7CisJCQlubGlzdHMrKzsKKwkJfQorCisJCS8qIG1ha2Ugc3VyZSB3ZSBnb3Qgc29tZSBjdXQgcG9zaXRpb25zIG91dCBvZiBhbGwgdGhhdCAqLworCQlpZiAobmxpc3RzID09IDApCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibWlzc2luZyBsaXN0IG9mIHBvc2l0aW9ucyIpOworCisJCS8qIG5vdyB0aGF0IHRoZSBsaXN0cyBhcmUgcGFyc2VkLCB3ZSBuZWVkIHRvIHNvcnQgdGhlbSB0byBtYWtlIGxpZmUKKwkJICogZWFzaWVyIG9uIHVzIHdoZW4gaXQgY29tZXMgdGltZSB0byBwcmludCB0aGUgY2hhcnMgLyBmaWVsZHMgLyBsaW5lcworCQkgKi8KKwkJcXNvcnQoY3V0X2xpc3RzLCBubGlzdHMsIHNpemVvZihjdXRfbGlzdHNbMF0pLCBjbXBmdW5jKTsKKwl9CisKKwl7CisJCWludCByZXR2YWwgPSBFWElUX1NVQ0NFU1M7CisKKwkJaWYgKCEqYXJndikKKwkJCSotLWFyZ3YgPSAoY2hhciAqKSItIjsKKworCQlkbyB7CisJCQlGSUxFICpmaWxlID0gZm9wZW5fb3Jfd2Fybl9zdGRpbigqYXJndik7CisJCQlpZiAoIWZpbGUpIHsKKwkJCQlyZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJCQkJY29udGludWU7CisJCQl9CisJCQljdXRfZmlsZShmaWxlLCBkZWxpbSwgY3V0X2xpc3RzLCBubGlzdHMpOworCQkJZmNsb3NlX2lmX25vdF9zdGRpbihmaWxlKTsKKwkJfSB3aGlsZSAoKisrYXJndik7CisKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZShjdXRfbGlzdHMpOworCQlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KHJldHZhbCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2RhdGUuYyBiL2NvcmV1dGlscy9kYXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk2NTc3NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9kYXRlLmMKQEAgLTAsMCArMSwzODUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgZGF0ZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIGJ5IE1hdHRoZXcgR3JhbnQgPGdyYW50bWFAYW5hdGhvdGguZ2VuLm56PgorICoKKyAqIGlzby1mb3JtYXQgaGFuZGxpbmcgYWRkZWQgYnkgUm9iZXJ0IEdyaWVibCA8Z3JpZWJsQGdteC5kZT4KKyAqIGJ1Z2ZpeGVzIGFuZCBjbGVhbnVwIGJ5IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisqLworCisvKiBUaGlzICdkYXRlJyBjb21tYW5kIHN1cHBvcnRzIG9ubHkgMiB0aW1lIHNldHRpbmcgZm9ybWF0cywKKyAgIGFsbCB0aGUgR05VIHN0cmZ0aW1lIHN0dWZmIChpdHMgaW4gbGliYywgbGV0cyB1c2UgaXQpLAorICAgc2V0dGluZyB0aW1lIHVzaW5nIFVUQyBhbmQgZGlzcGxheWluZyBpdCwgYXMgd2VsbCBhcworICAgYW4gUkZDIDI4MjIgY29tcGxpYW50IGRhdGUgb3V0cHV0IGZvciBzaGVsbCBzY3JpcHRpbmcKKyAgIG1haWwgY29tbWFuZHMgKi8KKworLyogSW5wdXQgcGFyc2luZyBjb2RlIGlzIGFsd2F5cyBidWxreSAtIHVzZWQgaGVhdnkgZHV0eSBsaWJjIHN0dWZmIGFzCisgICBtdWNoIGFzIHBvc3NpYmxlLCBtaXNzZWQgb3V0IGEgbG90IG9mIGJvdW5kcyBjaGVja2luZyAqLworCisvL2FwcGxldDpJRl9EQVRFKEFQUExFVChkYXRlLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfREFURSkgKz0gZGF0ZS5vCisKKy8vY29uZmlnOmNvbmZpZyBEQVRFCisvL2NvbmZpZzoJYm9vbCAiZGF0ZSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBkYXRlIGlzIHVzZWQgdG8gc2V0IHRoZSBzeXN0ZW0gZGF0ZSBvciBkaXNwbGF5IHRoZQorLy9jb25maWc6CSAgY3VycmVudCB0aW1lIGluIHRoZSBnaXZlbiBmb3JtYXQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0RBVEVfSVNPRk1UCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIElTTyBkYXRlIGZvcm1hdCBvdXRwdXQgKC1JKSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIERBVEUKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgb3B0aW9uICgtSSkgdG8gb3V0cHV0IGFuIElTTy04NjAxIGNvbXBsaWFudAorLy9jb25maWc6CSAgZGF0ZS90aW1lIHN0cmluZy4KKy8vY29uZmlnOgorLy9jb25maWc6IyBkZWZhdWx0cyB0byAibm8iOiBzdGF0J3MgbmFub3NlY29uZCBmaWVsZCBpcyBhIGJpdCBub24tcG9ydGFibGUKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0RBVEVfTkFOTworLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgJVtudW1dTiBuYW5vc2Vjb25kIGZvcm1hdCBzcGVjaWZpZXIiCisvL2NvbmZpZzoJZGVmYXVsdCBuCisvL2NvbmZpZzoJZGVwZW5kcyBvbiBEQVRFICAjIHN5c2NhbGwoX19OUl9jbG9ja19nZXR0aW1lKQorLy9jb25maWc6CXNlbGVjdCBQTEFURk9STV9MSU5VWAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN1cHBvcnQgJVtudW1dTiBmb3JtYXQgc3BlY2lmaWVyLiBBZGRzIH4yNTAgYnl0ZXMgb2YgY29kZS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfREFURV9DT01QQVQKKy8vY29uZmlnOglib29sICJTdXBwb3J0IHdlaXJkICdkYXRlIE1NRERoaG1tW1tZWV1ZWV1bLnNzXScgZm9ybWF0IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gREFURQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN5c3RlbSB0aW1lIGNhbiBiZSBzZXQgYnkgJ2RhdGUgLXMgREFURScgYW5kIHNpbXBseSAnZGF0ZSBEQVRFJywKKy8vY29uZmlnOgkgIGJ1dCBmb3JtYXRzIG9mIERBVEUgc3RyaW5nIGFyZSBkaWZmZXJlbnQuICdkYXRlIERBVEUnIGFjY2VwdHMKKy8vY29uZmlnOgkgIGEgcmF0aGVyIHdlaXJkIE1NRERoaG1tW1tZWV1ZWV1bLnNzXSBmb3JtYXQgd2l0aCBjb21wbGV0ZWx5CisvL2NvbmZpZzoJICB1bm5hdHVyYWwgcGxhY2VtZW50IG9mIHllYXIgYmV0d2VlbiBtaW51dGVzIGFuZCBzZWNvbmRzLgorLy9jb25maWc6CSAgZGF0ZSAtcyAoYW5kIG90aGVyIGNvbW1hbmRzIGxpa2UgdG91Y2ggLWQpIHVzZSBtb3JlIHNlbnNpYmxlCisvL2NvbmZpZzoJICBmb3JtYXRzIChmb3Igb25lLCBJU08gZm9ybWF0IFlZWVktTU0tREQgaGg6bW06c3Muc3Nzc3NzKS4KKy8vY29uZmlnOgorLy9jb25maWc6CSAgV2l0aCB0aGlzIG9wdGlvbiBvZmYsICdkYXRlIERBVEUnIGlzICdkYXRlIC1zIERBVEUnIHN1cHBvcnQKKy8vY29uZmlnOgkgIHRoZSBzYW1lIGZvcm1hdC4gV2l0aCBpdCBvbiwgJ2RhdGUgREFURScgYWRkaXRpb25hbGx5IHN1cHBvcnRzCisvL2NvbmZpZzoJICBNTUREaGhtbVtbWVldWVldWy5zc10gZm9ybWF0LgorCisvKiBHTlUgY29yZXV0aWxzIDYuOSBtYW4gcGFnZToKKyAqIGRhdGUgW09QVElPTl0uLi4gWytGT1JNQVRdCisgKiBkYXRlIFstdXwtLXV0Y3wtLXVuaXZlcnNhbF0gW01NRERoaG1tW1tDQ11ZWV1bLnNzXV0KKyAqIC1kLCAtLWRhdGU9U1RSSU5HCisgKiAgICAgIGRpc3BsYXkgdGltZSBkZXNjcmliZWQgYnkgU1RSSU5HLCBub3QgYG5vdycKKyAqIC1mLCAtLWZpbGU9REFURUZJTEUKKyAqICAgICAgbGlrZSAtLWRhdGUgb25jZSBmb3IgZWFjaCBsaW5lIG9mIERBVEVGSUxFCisgKiAtciwgLS1yZWZlcmVuY2U9RklMRQorICogICAgICBkaXNwbGF5IHRoZSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lIG9mIEZJTEUKKyAqIC1SLCAtLXJmYy0yODIyCisgKiAgICAgIG91dHB1dCBkYXRlIGFuZCB0aW1lIGluIFJGQyAyODIyIGZvcm1hdC4KKyAqICAgICAgRXhhbXBsZTogTW9uLCAwNyBBdWcgMjAwNiAxMjozNDo1NiAtMDYwMAorICogLS1yZmMtMzMzOT1USU1FU1BFQworICogICAgICBvdXRwdXQgZGF0ZSBhbmQgdGltZSBpbiBSRkMgMzMzOSBmb3JtYXQuCisgKiAgICAgIFRJTUVTUEVDPSdkYXRlJywgJ3NlY29uZHMnLCBvciAnbnMnCisgKiAgICAgIERhdGUgYW5kIHRpbWUgY29tcG9uZW50cyBhcmUgc2VwYXJhdGVkIGJ5IGEgc2luZ2xlIHNwYWNlOgorICogICAgICAyMDA2LTA4LTA3IDEyOjM0OjU2LTA2OjAwCisgKiAtcywgLS1zZXQ9U1RSSU5HCisgKiAgICAgIHNldCB0aW1lIGRlc2NyaWJlZCBieSBTVFJJTkcKKyAqIC11LCAtLXV0YywgLS11bml2ZXJzYWwKKyAqICAgICAgcHJpbnQgb3Igc2V0IENvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lCisgKgorICogQnVzeWJveDoKKyAqIGxvbmcgb3B0aW9ucyBhcmUgbm90IHN1cHBvcnRlZAorICogLWYgaXMgbm90IHN1cHBvcnRlZAorICogLUkgc2VlbXMgdG8gcm91Z2hseSBtYXRjaCAtLXJmYy0zMzM5LCBidXQgLUkgaGFzIF9vcHRpb25hbF8gcGFyYW0KKyAqICAgICh0aHVzICItSSBzZWNvbmRzIiBkb2Vzbid0IHdvcmssIG9ubHkgIi1Jc2Vjb25kcyIpLAorICogICAgYW5kIGRvZXMgbm90IHN1cHBvcnQgLUlucworICogLUQgRk1UIGlzIGEgYmJveCBleHRlbnNpb24gZm9yIF9pbnB1dF8gY29udmVyc2lvbiBvZiAtZCBEQVRFCisgKi8KKworLy91c2FnZTojZGVmaW5lIGRhdGVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbK0ZNVF0gW1RJTUVdIgorLy91c2FnZTojZGVmaW5lIGRhdGVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEaXNwbGF5IHRpbWUgKHVzaW5nICtGTVQpLCBvciBzZXQgdGltZVxuIgorLy91c2FnZToJSUZfTk9UX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAiXG4JWy1zXSBUSU1FCVNldCB0aW1lIHRvIFRJTUUiCisvL3VzYWdlOiAgICAgIlxuCS11CQlXb3JrIGluIFVUQyAoZG9uJ3QgY29udmVydCB0byBsb2NhbCB0aW1lKSIKKy8vdXNhZ2U6ICAgICAiXG4JLVIJCU91dHB1dCBSRkMtMjgyMiBjb21wbGlhbnQgZGF0ZSBzdHJpbmciCisvL3VzYWdlOgkpIElGX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAiXG4JWy1zLC0tc2V0XSBUSU1FCVNldCB0aW1lIHRvIFRJTUUiCisvL3VzYWdlOiAgICAgIlxuCS11LC0tdXRjCVdvcmsgaW4gVVRDIChkb24ndCBjb252ZXJ0IHRvIGxvY2FsIHRpbWUpIgorLy91c2FnZTogICAgICJcbgktUiwtLXJmYy0yODIyCU91dHB1dCBSRkMtMjgyMiBjb21wbGlhbnQgZGF0ZSBzdHJpbmciCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0RBVEVfSVNPRk1UKAorLy91c2FnZTogICAgICJcbgktSVtTUEVDXQlPdXRwdXQgSVNPLTg2MDEgY29tcGxpYW50IGRhdGUgc3RyaW5nIgorLy91c2FnZTogICAgICJcbgkJCVNQRUM9J2RhdGUnIChkZWZhdWx0KSBmb3IgZGF0ZSBvbmx5LCIKKy8vdXNhZ2U6ICAgICAiXG4JCQknaG91cnMnLCAnbWludXRlcycsIG9yICdzZWNvbmRzJyBmb3IgZGF0ZSBhbmQiCisvL3VzYWdlOiAgICAgIlxuCQkJdGltZSB0byB0aGUgaW5kaWNhdGVkIHByZWNpc2lvbiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgIlxuCS1yIEZJTEUJCURpc3BsYXkgbGFzdCBtb2RpZmljYXRpb24gdGltZSBvZiBGSUxFIgorLy91c2FnZTogICAgICJcbgktZCBUSU1FCQlEaXNwbGF5IFRJTUUsIG5vdCAnbm93JyIKKy8vdXNhZ2U6CSkgSUZfTE9OR19PUFRTKAorLy91c2FnZTogICAgICJcbgktciwtLXJlZmVyZW5jZSBGSUxFCURpc3BsYXkgbGFzdCBtb2RpZmljYXRpb24gdGltZSBvZiBGSUxFIgorLy91c2FnZTogICAgICJcbgktZCwtLWRhdGUgVElNRQlEaXNwbGF5IFRJTUUsIG5vdCAnbm93JyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfREFURV9JU09GTVQoCisvL3VzYWdlOiAgICAgIlxuCS1EIEZNVAkJVXNlIEZNVCBmb3IgLWQgVElNRSBjb252ZXJzaW9uIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG5SZWNvZ25pemVkIFRJTUUgZm9ybWF0czoiCisvL3VzYWdlOiAgICAgIlxuCWhoOm1tWzpzc10iCisvL3VzYWdlOiAgICAgIlxuCVtZWVlZLl1NTS5ERC1oaDptbVs6c3NdIgorLy91c2FnZTogICAgICJcbglZWVlZLU1NLUREIGhoOm1tWzpzc10iCisvL3VzYWdlOiAgICAgIlxuCVtbW1tbWVldWVldTU1dRERdaGhdbW1bLnNzXSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfREFURV9DT01QQVQoCisvL3VzYWdlOiAgICAgIlxuCSdkYXRlIFRJTUUnIGZvcm0gYWNjZXB0cyBNTUREaGhtbVtbWVldWVldWy5zc10gaW5zdGVhZCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZGF0ZV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBkYXRlXG4iCisvL3VzYWdlOiAgICAgICAiV2VkIEFwciAxMiAxODo1Mjo0MSBNRFQgMjAwMFxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9EQVRFX05BTk8KKyMgaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNlbmRpZgorCitlbnVtIHsKKwlPUFRfUkZDMjgyMiAgID0gKDEgPDwgMCksIC8qIFIgKi8KKwlPUFRfU0VUICAgICAgID0gKDEgPDwgMSksIC8qIHMgKi8KKwlPUFRfVVRDICAgICAgID0gKDEgPDwgMiksIC8qIHUgKi8KKwlPUFRfREFURSAgICAgID0gKDEgPDwgMyksIC8qIGQgKi8KKwlPUFRfUkVGRVJFTkNFID0gKDEgPDwgNCksIC8qIHIgKi8KKwlPUFRfVElNRVNQRUMgID0gKDEgPDwgNSkgKiBFTkFCTEVfRkVBVFVSRV9EQVRFX0lTT0ZNVCwgLyogSSAqLworCU9QVF9ISU5UICAgICAgPSAoMSA8PCA2KSAqIEVOQUJMRV9GRUFUVVJFX0RBVEVfSVNPRk1ULCAvKiBEICovCit9OworCitzdGF0aWMgdm9pZCBtYXliZV9zZXRfdXRjKGludCBvcHQpCit7CisJaWYgKG9wdCAmIE9QVF9VVEMpCisJCXB1dGVudigoY2hhciopIlRaPVVUQzAiKTsKK30KKworI2lmIEVOQUJMRV9MT05HX09QVFMKK3N0YXRpYyBjb25zdCBjaGFyIGRhdGVfbG9uZ29wdHNbXSBBTElHTjEgPQorCQkicmZjLTgyMlwwIiAgIE5vX2FyZ3VtZW50ICAgICAgICJSIgorCQkicmZjLTI4MjJcMCIgIE5vX2FyZ3VtZW50ICAgICAgICJSIgorCQkic2V0XDAiICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJzIgorCQkidXRjXDAiICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJ1IgorCS8qCSJ1bml2ZXJzYWxcMCIgTm9fYXJndW1lbnQgICAgICAgInUiICovCisJCSJkYXRlXDAiICAgICAgUmVxdWlyZWRfYXJndW1lbnQgImQiCisJCSJyZWZlcmVuY2VcMCIgUmVxdWlyZWRfYXJndW1lbnQgInIiCisJCTsKKyNlbmRpZgorCitpbnQgZGF0ZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZGF0ZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCXN0cnVjdCB0bSB0bV90aW1lOworCWNoYXIgYnVmX2ZtdF9kdDJzdHJbNjRdOworCXVuc2lnbmVkIG9wdDsKKwlpbnQgaWZtdCA9IC0xOworCWNoYXIgKmRhdGVfc3RyOworCWNoYXIgKmZtdF9kdDJzdHI7CisJY2hhciAqZm10X3N0cjJkdDsKKwljaGFyICpmaWxlbmFtZTsKKwljaGFyICppc29mbXRfYXJnID0gTlVMTDsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gImQtLXM6cy0tZCIKKwkJSUZfRkVBVFVSRV9EQVRFX0lTT0ZNVCgiOlItLUk6SS0tUiIpOworCUlGX0xPTkdfT1BUUyhhcHBsZXRfbG9uZ19vcHRpb25zID0gZGF0ZV9sb25nb3B0czspCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIlJzOnVkOnI6IgorCQkJSUZfRkVBVFVSRV9EQVRFX0lTT0ZNVCgiSTo6RDoiKSwKKwkJCSZkYXRlX3N0ciwgJmRhdGVfc3RyLCAmZmlsZW5hbWUKKwkJCUlGX0ZFQVRVUkVfREFURV9JU09GTVQoLCAmaXNvZm10X2FyZywgJmZtdF9zdHIyZHQpKTsKKwlhcmd2ICs9IG9wdGluZDsKKwltYXliZV9zZXRfdXRjKG9wdCk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfREFURV9JU09GTVQgJiYgKG9wdCAmIE9QVF9USU1FU1BFQykpIHsKKwkJaWZtdCA9IDA7IC8qIGRlZmF1bHQgaXMgZGF0ZSAqLworCQlpZiAoaXNvZm10X2FyZykgeworCQkJc3RhdGljIGNvbnN0IGNoYXIgaXNvZm9ybWF0c1tdIEFMSUdOMSA9CisJCQkJImRhdGVcMCIiaG91cnNcMCIibWludXRlc1wwIiJzZWNvbmRzXDAiOyAvKiBucz8gKi8KKwkJCWlmbXQgPSBpbmRleF9pbl9zdWJzdHJpbmdzKGlzb2Zvcm1hdHMsIGlzb2ZtdF9hcmcpOworCQkJaWYgKGlmbXQgPCAwKQorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJfQorCX0KKworCWZtdF9kdDJzdHIgPSBOVUxMOworCWlmIChhcmd2WzBdICYmIGFyZ3ZbMF1bMF0gPT0gJysnKSB7CisJCWZtdF9kdDJzdHIgPSAmYXJndlswXVsxXTsgLyogc2tpcCBvdmVyIHRoZSAnKycgKi8KKwkJYXJndisrOworCX0KKwlpZiAoIShvcHQgJiAoT1BUX1NFVCB8IE9QVF9EQVRFKSkpIHsKKwkJb3B0IHw9IE9QVF9TRVQ7CisJCWRhdGVfc3RyID0gYXJndlswXTsgLyogY2FuIGJlIE5VTEwgKi8KKwkJaWYgKGRhdGVfc3RyKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfREFURV9DT01QQVQKKwkJCWludCBsZW4gPSBzdHJzcG4oZGF0ZV9zdHIsICIwMTIzNDU2Nzg5Iik7CisJCQlpZiAoZGF0ZV9zdHJbbGVuXSA9PSAnXDAnCisJCQkgfHwgKGRhdGVfc3RyW2xlbl0gPT0gJy4nCisJCQkgICAgJiYgaXNkaWdpdChkYXRlX3N0cltsZW4rMV0pCisJCQkgICAgJiYgaXNkaWdpdChkYXRlX3N0cltsZW4rMl0pCisJCQkgICAgJiYgZGF0ZV9zdHJbbGVuKzNdID09ICdcMCcKKwkJCSAgICApCisJCQkpIHsKKwkJCQkvKiBEcmVhZGVkIE1NRERoaG1tW1tDQ11ZWV1bLnNzXSBmb3JtYXQhCisJCQkJICogSXQgZG9lcyBub3QgbWF0Y2ggLWQgb3IgLXMgZm9ybWF0LgorCQkJCSAqIFNvbWUgdXNlcnMgYWN0dWFsbHkgZG8gdXNlIGl0LgorCQkJCSAqLworCQkJCWxlbiAtPSA4OworCQkJCWlmIChsZW4gPCAwIHx8IGxlbiA+IDQgfHwgKGxlbiAmIDEpKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfaW52YWxpZF9kYXRlLCBkYXRlX3N0cik7CisJCQkJaWYgKGxlbiAhPSAwKSB7IC8qIG1vdmUgWVkgb3IgQ0NZWSB0byBmcm9udCAqLworCQkJCQljaGFyIGJ1Zls0XTsKKwkJCQkJbWVtY3B5KGJ1ZiwgZGF0ZV9zdHIgKyA4LCBsZW4pOworCQkJCQltZW1tb3ZlKGRhdGVfc3RyICsgbGVuLCBkYXRlX3N0ciwgOCk7CisJCQkJCW1lbWNweShkYXRlX3N0ciwgYnVmLCBsZW4pOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQkJYXJndisrOworCQl9CisJfQorCWlmICgqYXJndikKKwkJYmJfc2hvd191c2FnZSgpOworCisJLyogTm93IHdlIGhhdmUgcGFyc2VkIGFsbCB0aGUgaW5mb3JtYXRpb24gZXhjZXB0IHRoZSBkYXRlIGZvcm1hdAorCSAqIHdoaWNoIGRlcGVuZHMgb24gd2hldGhlciB0aGUgY2xvY2sgaXMgYmVpbmcgc2V0IG9yIHJlYWQgKi8KKworCWlmIChvcHQgJiBPUFRfUkVGRVJFTkNFKSB7CisJCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJCXhzdGF0KGZpbGVuYW1lLCAmc3RhdGJ1Zik7CisJCXRzLnR2X3NlYyA9IHN0YXRidWYuc3RfbXRpbWU7CisjaWYgRU5BQkxFX0ZFQVRVUkVfREFURV9OQU5PCisJCXRzLnR2X25zZWMgPSBzdGF0YnVmLnN0X210aW0udHZfbnNlYzsKKwkJLyogU29tZSB0b29sY2hhaW5zIHVzZSAuc3RfbXRpbWVuc2VjIGluc3RlYWQgb2Ygc3RfbXRpbS50dl9uc2VjLgorCQkgKiBJZiB5b3UgbmVlZCAjZGVmaW5lIF9TVklEX1NPVVJDRSAxIHRvIGVuYWJsZSBzdF9tdGltLnR2X25zZWMsCisJCSAqIGRyb3AgYSBtYWlsIHRvIHByb2plY3QgbWFpbGluZyBsaXN0IHBsZWFzZQorCQkgKi8KKyNlbmRpZgorCX0gZWxzZSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfREFURV9OQU5PCisJCS8qIGxpYmMgaGFzIGluY3JlZGlibHkgbWVzc3kgd2F5IG9mIGRvaW5nIHRoaXMsCisJCSAqIHR5cGljYWxseSByZXF1aXJpbmcgLWxydC4gV2UganVzdCBza2lwIGFsbCB0aGlzIG1lc3MgKi8KKwkJc3lzY2FsbChfX05SX2Nsb2NrX2dldHRpbWUsIENMT0NLX1JFQUxUSU1FLCAmdHMpOworI2Vsc2UKKwkJdGltZSgmdHMudHZfc2VjKTsKKyNlbmRpZgorCX0KKwlsb2NhbHRpbWVfcigmdHMudHZfc2VjLCAmdG1fdGltZSk7CisKKwkvKiBJZiBkYXRlIHN0cmluZyBpcyBnaXZlbiwgdXBkYXRlIHRtX3RpbWUsIGFuZCBtYXliZSBzZXQgZGF0ZSAqLworCWlmIChkYXRlX3N0ciAhPSBOVUxMKSB7CisJCS8qIFplcm8gb3V0IGZpZWxkcyAtIHRha2UgaGVyIGJhY2sgdG8gbWlkbmlnaHQhICovCisJCXRtX3RpbWUudG1fc2VjID0gMDsKKwkJdG1fdGltZS50bV9taW4gPSAwOworCQl0bV90aW1lLnRtX2hvdXIgPSAwOworCisJCS8qIFByb2Nlc3MgYW55IGRhdGUgaW5wdXQgdG8gVU5JWCB0aW1lIHNpbmNlIDEgSmFuIDE5NzAgKi8KKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0RBVEVfSVNPRk1UICYmIChvcHQgJiBPUFRfSElOVCkpIHsKKwkJCWlmIChzdHJwdGltZShkYXRlX3N0ciwgZm10X3N0cjJkdCwgJnRtX3RpbWUpID09IE5VTEwpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2ludmFsaWRfZGF0ZSwgZGF0ZV9zdHIpOworCQl9IGVsc2UgeworCQkJcGFyc2VfZGF0ZXN0cihkYXRlX3N0ciwgJnRtX3RpbWUpOworCQl9CisKKwkJLyogQ29ycmVjdCBhbnkgZGF5IG9mIHdlZWsgYW5kIGRheSBvZiB5ZWFyIGV0Yy4gZmllbGRzICovCisJCS8qIEJlIHN1cmUgdG8gcmVjaGVjayBkc3QgKGJ1dCBub3QgaWYgZGF0ZSBpcyB0aW1lX3QgZm9ybWF0KSAqLworCQlpZiAoZGF0ZV9zdHJbMF0gIT0gJ0AnKQorCQkJdG1fdGltZS50bV9pc2RzdCA9IC0xOworCQl0cy50dl9zZWMgPSB2YWxpZGF0ZV90bV90aW1lKGRhdGVfc3RyLCAmdG1fdGltZSk7CisKKwkJbWF5YmVfc2V0X3V0YyhvcHQpOworCisJCS8qIGlmIHNldHRpbmcgdGltZSwgc2V0IGl0ICovCisJCWlmICgob3B0ICYgT1BUX1NFVCkgJiYgc3RpbWUoJnRzLnR2X3NlYykgPCAwKSB7CisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBzZXQgZGF0ZSIpOworCQl9CisJfQorCisJLyogRGlzcGxheSBvdXRwdXQgKi8KKworCS8qIERlYWwgd2l0aCBmb3JtYXQgc3RyaW5nICovCisJaWYgKGZtdF9kdDJzdHIgPT0gTlVMTCkgeworCQlpbnQgaTsKKwkJZm10X2R0MnN0ciA9IGJ1Zl9mbXRfZHQyc3RyOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfREFURV9JU09GTVQgJiYgaWZtdCA+PSAwKSB7CisJCQkvKiAtSVtTUEVDXTogMDpkYXRlIDE6aG91cnMgMjptaW51dGVzIDM6c2Vjb25kcyAqLworCQkJc3RyY3B5KGZtdF9kdDJzdHIsICIlWS0lbS0lZFQlSDolTTolUyIpOworCQkJaSA9IDggKyAzICogaWZtdDsKKwkJCWlmIChpZm10ICE9IDApIHsKKwkJCQkvKiBUT0RPOiBpZiAoaWZtdD09NCkgaSArPSBzcHJpbnRmKCZmbXRfZHQyc3RyW2ldLCAiLCUwOXUiLCBuYW5vc2Vjb25kcyk7ICovCisgZm9ybWF0X3V0YzoKKwkJCQlmbXRfZHQyc3RyW2krK10gPSAnJSc7CisJCQkJZm10X2R0MnN0cltpKytdID0gKG9wdCAmIE9QVF9VVEMpID8gJ1onIDogJ3onOworCQkJfQorCQkJZm10X2R0MnN0cltpXSA9ICdcMCc7CisJCX0gZWxzZSBpZiAob3B0ICYgT1BUX1JGQzI4MjIpIHsKKwkJCS8qIC1SLiB1bmRvIGJ1c3lib3guYyBzZXRsb2NhbGUgKi8KKwkJCWlmIChFTkFCTEVfTE9DQUxFX1NVUFBPUlQpCisJCQkJc2V0bG9jYWxlKExDX1RJTUUsICJDIik7CisJCQlzdHJjcHkoZm10X2R0MnN0ciwgIiVhLCAlZCAlYiAlWSAlSDolTTolUyAiKTsKKwkJCWkgPSBzaXplb2YoIiVhLCAlZCAlYiAlWSAlSDolTTolUyAiKS0xOworCQkJZ290byBmb3JtYXRfdXRjOworCQl9IGVsc2UgeyAvKiBkZWZhdWx0IGNhc2UgKi8KKwkJCWZtdF9kdDJzdHIgPSAoY2hhciopIiVhICViICVlICVIOiVNOiVTICVaICVZIjsKKwkJfQorCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9EQVRFX05BTk8KKwllbHNlIHsKKwkJLyogVXNlci1zcGVjaWZpZWQgZm10X2R0MnN0ciAqLworCQkvKiBTZWFyY2ggZm9yIGFuZCBwcm9jZXNzICIlTiIgKi8KKwkJY2hhciAqcCA9IGZtdF9kdDJzdHI7CisJCXdoaWxlICgocCA9IHN0cmNocihwLCAnJScpKSAhPSBOVUxMKSB7CisJCQlpbnQgbiwgbTsKKwkJCXVuc2lnbmVkIHByZXMsIHNjYWxlOworCisJCQlwKys7CisJCQlpZiAoKnAgPT0gJyUnKSB7CisJCQkJcCsrOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbiA9IHN0cnNwbihwLCAiMDEyMzQ1Njc4OSIpOworCQkJaWYgKHBbbl0gIT0gJ04nKSB7CisJCQkJcCArPSBuOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogV2UgaGF2ZSAiJVtubm5dTiIgKi8KKwkJCXBbLTFdID0gJ1wwJzsKKwkJCXBbbl0gPSAnXDAnOworCQkJc2NhbGUgPSAxOworCQkJcHJlcyA9IDk7CisJCQlpZiAobikgeworCQkJCXByZXMgPSB4YXRvaV9wb3NpdGl2ZShwKTsKKwkJCQlpZiAocHJlcyA9PSAwKQorCQkJCQlwcmVzID0gOTsKKwkJCQltID0gOSAtIHByZXM7CisJCQkJd2hpbGUgKC0tbSA+PSAwKQorCQkJCQlzY2FsZSAqPSAxMDsKKwkJCX0KKworCQkJbSA9IHAgLSBmbXRfZHQyc3RyOworCQkJcCArPSBuICsgMTsKKwkJCWZtdF9kdDJzdHIgPSB4YXNwcmludGYoIiVzJTAqdSVzIiwgZm10X2R0MnN0ciwgcHJlcywgKHVuc2lnbmVkKXRzLnR2X25zZWMgLyBzY2FsZSwgcCk7CisJCQlwID0gZm10X2R0MnN0ciArIG07CisJCX0KKwl9CisjZW5kaWYKKworI2RlZmluZSBkYXRlX2J1ZiBiYl9jb21tb25fYnVmc2l6MQorCWlmICgqZm10X2R0MnN0ciA9PSAnXDAnKSB7CisJCS8qIFdpdGggbm8gZm9ybWF0IHN0cmluZywganVzdCBwcmludCBhIGJsYW5rIGxpbmUgKi8KKwkJZGF0ZV9idWZbMF0gPSAnXDAnOworCX0gZWxzZSB7CisJCS8qIEhhbmRsZSBzcGVjaWFsIGNvbnZlcnNpb25zICovCisJCWlmIChpc19wcmVmaXhlZF93aXRoKGZtdF9kdDJzdHIsICIlZiIpKSB7CisJCQlmbXRfZHQyc3RyID0gKGNoYXIqKSIlWS4lbS4lZC0lSDolTTolUyI7CisJCX0KKwkJLyogR2VuZXJhdGUgb3V0cHV0IHN0cmluZyAqLworCQlzdHJmdGltZShkYXRlX2J1Ziwgc2l6ZW9mKGRhdGVfYnVmKSwgZm10X2R0MnN0ciwgJnRtX3RpbWUpOworCX0KKwlwdXRzKGRhdGVfYnVmKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvZGQuYyBiL2NvcmV1dGlscy9kZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYTg0M2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvZGQuYwpAQCAtMCwwICsxLDU0MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBkZCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSAgTWF0dCBLcmFhaQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9jb25maWc6Y29uZmlnIERECisvL2NvbmZpZzoJYm9vbCAiZGQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgZGQgY29waWVzIGEgZmlsZSAoZnJvbSBzdGFuZGFyZCBpbnB1dCB0byBzdGFuZGFyZCBvdXRwdXQsCisvL2NvbmZpZzoJICBieSBkZWZhdWx0KSB1c2luZyBzcGVjaWZpYyBpbnB1dCBhbmQgb3V0cHV0IGJsb2Nrc2l6ZXMsCisvL2NvbmZpZzoJICB3aGlsZSBvcHRpb25hbGx5IHBlcmZvcm1pbmcgY29udmVyc2lvbnMgb24gaXQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0REX1NJR05BTF9IQU5ETElORworLy9jb25maWc6CWJvb2wgIkVuYWJsZSBzaWduYWwgaGFuZGxpbmcgZm9yIHN0YXR1cyByZXBvcnRpbmciCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBERAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFNlbmRpbmcgYSBTSUdVU1IxIHNpZ25hbCB0byBhIHJ1bm5pbmcgYGRkJyBwcm9jZXNzIG1ha2VzIGl0CisvL2NvbmZpZzoJICBwcmludCB0byBzdGFuZGFyZCBlcnJvciB0aGUgbnVtYmVyIG9mIHJlY29yZHMgcmVhZCBhbmQgd3JpdHRlbgorLy9jb25maWc6CSAgc28gZmFyLCB0aGVuIHRvIHJlc3VtZSBjb3B5aW5nLgorLy9jb25maWc6CisvL2NvbmZpZzoJICAkIGRkIGlmPS9kZXYvemVybyBvZj0vZGV2L251bGwgJgorLy9jb25maWc6CSAgJCBwaWQ9JCE7IGtpbGwgLVVTUjEgJHBpZDsgc2xlZXAgMTsga2lsbCAkcGlkCisvL2NvbmZpZzoJICAxMDg5OTIwNiswIHJlY29yZHMgaW4KKy8vY29uZmlnOgkgIDEwODk5MjA2KzAgcmVjb3JkcyBvdXQKKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfRERfVEhJUkRfU1RBVFVTX0xJTkUKKy8vY29uZmlnOglib29sICJFbmFibGUgdGhlIHRoaXJkIHN0YXR1cyBsaW5lIHVwb24gc2lnbmFsIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gREQgJiYgRkVBVFVSRV9ERF9TSUdOQUxfSEFORExJTkcKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBEaXNwbGF5cyBhIGNvcmV1dGlscy1saWtlIHRoaXJkIHN0YXR1cyBsaW5lIHdpdGggdHJhbnNmZXJyZWQgYnl0ZXMsCisvL2NvbmZpZzoJICBlbGFwc2VkIHRpbWUgYW5kIHNwZWVkLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9ERF9JQlNfT0JTCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIGlicywgb2JzIGFuZCBjb252IG9wdGlvbnMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBERAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZXMgc3VwcG9ydCBmb3Igd3JpdGluZyBhIGNlcnRhaW4gbnVtYmVyIG9mIGJ5dGVzIGluIGFuZCBvdXQsCisvL2NvbmZpZzoJICBhdCBhIHRpbWUsIGFuZCBwZXJmb3JtaW5nIGNvbnZlcnNpb25zIG9uIHRoZSBkYXRhIHN0cmVhbS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfRERfU1RBVFVTCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIHN0YXR1cyBkaXNwbGF5IG9wdGlvbnMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBERAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZXMgc3VwcG9ydCBmb3Igc3RhdHVzPW5veGZlci9ub25lIG9wdGlvbi4KKworLy91c2FnZTojZGVmaW5lIGRkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbaWY9RklMRV0gW29mPUZJTEVdICIgSUZfRkVBVFVSRV9ERF9JQlNfT0JTKCJbaWJzPU5dIFtvYnM9Tl0gIikgIlticz1OXSBbY291bnQ9Tl0gW3NraXA9Tl1cbiIKKy8vdXNhZ2U6ICAgICAgICIJW3NlZWs9Tl0iIElGX0ZFQVRVUkVfRERfSUJTX09CUygiIFtjb252PW5vdHJ1bmN8bm9lcnJvcnxzeW5jfGZzeW5jXSIpCisvL3VzYWdlOiNkZWZpbmUgZGRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb3B5IGEgZmlsZSB3aXRoIGNvbnZlcnRpbmcgYW5kIGZvcm1hdHRpbmdcbiIKKy8vdXNhZ2U6ICAgICAiXG4JaWY9RklMRQkJUmVhZCBmcm9tIEZJTEUgaW5zdGVhZCBvZiBzdGRpbiIKKy8vdXNhZ2U6ICAgICAiXG4Jb2Y9RklMRQkJV3JpdGUgdG8gRklMRSBpbnN0ZWFkIG9mIHN0ZG91dCIKKy8vdXNhZ2U6ICAgICAiXG4JYnM9TgkJUmVhZCBhbmQgd3JpdGUgTiBieXRlcyBhdCBhIHRpbWUiCisvL3VzYWdlOglJRl9GRUFUVVJFX0REX0lCU19PQlMoCisvL3VzYWdlOiAgICAgIlxuCWlicz1OCQlSZWFkIE4gYnl0ZXMgYXQgYSB0aW1lIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9ERF9JQlNfT0JTKAorLy91c2FnZTogICAgICJcbglvYnM9TgkJV3JpdGUgTiBieXRlcyBhdCBhIHRpbWUiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCWNvdW50PU4JCUNvcHkgb25seSBOIGlucHV0IGJsb2NrcyIKKy8vdXNhZ2U6ICAgICAiXG4Jc2tpcD1OCQlTa2lwIE4gaW5wdXQgYmxvY2tzIgorLy91c2FnZTogICAgICJcbglzZWVrPU4JCVNraXAgTiBvdXRwdXQgYmxvY2tzIgorLy91c2FnZToJSUZfRkVBVFVSRV9ERF9JQlNfT0JTKAorLy91c2FnZTogICAgICJcbgljb252PW5vdHJ1bmMJRG9uJ3QgdHJ1bmNhdGUgb3V0cHV0IGZpbGUiCisvL3VzYWdlOiAgICAgIlxuCWNvbnY9bm9lcnJvcglDb250aW51ZSBhZnRlciByZWFkIGVycm9ycyIKKy8vdXNhZ2U6ICAgICAiXG4JY29udj1zeW5jCVBhZCBibG9ja3Mgd2l0aCB6ZXJvcyIKKy8vdXNhZ2U6ICAgICAiXG4JY29udj1mc3luYwlQaHlzaWNhbGx5IHdyaXRlIGRhdGEgb3V0IGJlZm9yZSBmaW5pc2hpbmciCisvL3VzYWdlOiAgICAgIlxuCWNvbnY9c3dhYglTd2FwIGV2ZXJ5IHBhaXIgb2YgYnl0ZXMiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0REX1NUQVRVUygKKy8vdXNhZ2U6ICAgICAiXG4Jc3RhdHVzPW5veGZlcglTdXBwcmVzcyByYXRlIG91dHB1dCIKKy8vdXNhZ2U6ICAgICAiXG4Jc3RhdHVzPW5vbmUJU3VwcHJlc3MgYWxsIG91dHB1dCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuTiBtYXkgYmUgc3VmZml4ZWQgYnkgYyAoMSksIHcgKDIpLCBiICg1MTIpLCBrQiAoMTAwMCksIGsgKDEwMjQpLCBNQiwgTSwgR0IsIEciCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGRkX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGRkIGlmPS9kZXYvemVybyBvZj0vZGV2L3JhbTEgYnM9MU0gY291bnQ9NFxuIgorLy91c2FnZTogICAgICAgIjQrMCByZWNvcmRzIGluXG4iCisvL3VzYWdlOiAgICAgICAiNCswIHJlY29yZHMgb3V0XG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9FWEVDIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCisKK2VudW0geworCWlmZCA9IFNURElOX0ZJTEVOTywKKwlvZmQgPSBTVERPVVRfRklMRU5PLAorfTsKKworc3RydWN0IGdsb2JhbHMgeworCW9mZl90IG91dF9mdWxsLCBvdXRfcGFydCwgaW5fZnVsbCwgaW5fcGFydDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9ERF9USElSRF9TVEFUVVNfTElORQorCXVuc2lnbmVkIGxvbmcgbG9uZyB0b3RhbF9ieXRlczsKKwl1bnNpZ25lZCBsb25nIGxvbmcgYmVnaW5fdGltZV91czsKKyNlbmRpZgorCWludCBmbGFnczsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCS8qIHdlIGhhdmUgdG8gemVybyBpdCBvdXQgYmVjYXVzZSBvZiBOT0VYRUMgKi8gXAorCW1lbXNldCgmRywgMCwgc2l6ZW9mKEcpKTsgXAorfSB3aGlsZSAoMCkKKworZW51bSB7CisJLyogTXVzdCBiZSBpbiB0aGUgc2FtZSBvcmRlciBhcyBPUF9jb252X1hYWCEgKi8KKwkvKiAoc2VlICJmbGFncyB8PSAoMSA8PCB3aGF0KSIgYmVsb3cpICovCisJRkxBR19OT1RSVU5DID0gKDEgPDwgMCkgKiBFTkFCTEVfRkVBVFVSRV9ERF9JQlNfT0JTLAorCUZMQUdfU1lOQyAgICA9ICgxIDw8IDEpICogRU5BQkxFX0ZFQVRVUkVfRERfSUJTX09CUywKKwlGTEFHX05PRVJST1IgPSAoMSA8PCAyKSAqIEVOQUJMRV9GRUFUVVJFX0REX0lCU19PQlMsCisJRkxBR19GU1lOQyAgID0gKDEgPDwgMykgKiBFTkFCTEVfRkVBVFVSRV9ERF9JQlNfT0JTLAorCUZMQUdfU1dBQiAgICA9ICgxIDw8IDQpICogRU5BQkxFX0ZFQVRVUkVfRERfSUJTX09CUywKKwkvKiBlbmQgb2YgY29udiBmbGFncyAqLworCUZMQUdfVFdPQlVGUyA9ICgxIDw8IDUpICogRU5BQkxFX0ZFQVRVUkVfRERfSUJTX09CUywKKwlGTEFHX0NPVU5UICAgPSAxIDw8IDYsCisJRkxBR19TVEFUVVMgID0gMSA8PCA3LAorCUZMQUdfU1RBVFVTX05PTkUgPSAxIDw8IDcsCisJRkxBR19TVEFUVVNfTk9YRkVSID0gMSA8PCA4LAorfTsKKworc3RhdGljIHZvaWQgZGRfb3V0cHV0X3N0YXR1cyhpbnQgVU5VU0VEX1BBUkFNIGN1cl9zaWduYWwpCit7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRERfVEhJUkRfU1RBVFVTX0xJTkUKKwlkb3VibGUgc2Vjb25kczsKKwl1bnNpZ25lZCBsb25nIGxvbmcgYnl0ZXNfc2VjOworCXVuc2lnbmVkIGxvbmcgbG9uZyBub3dfdXMgPSBtb25vdG9uaWNfdXMoKTsgLyogYmVmb3JlIGZwcmludGYgKi8KKyNlbmRpZgorCisJLyogRGVsaWJlcmF0ZWx5IHVzaW5nICV1LCBub3QgJWQgKi8KKwlmcHJpbnRmKHN0ZGVyciwgIiUiT0ZGX0ZNVCJ1KyUiT0ZGX0ZNVCJ1IHJlY29yZHMgaW5cbiIKKwkJCSIlIk9GRl9GTVQidSslIk9GRl9GTVQidSByZWNvcmRzIG91dFxuIiwKKwkJCUcuaW5fZnVsbCwgRy5pbl9wYXJ0LAorCQkJRy5vdXRfZnVsbCwgRy5vdXRfcGFydCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9ERF9USElSRF9TVEFUVVNfTElORQorIyBpZiBFTkFCTEVfRkVBVFVSRV9ERF9TVEFUVVMKKwlpZiAoRy5mbGFncyAmIEZMQUdfU1RBVFVTX05PWEZFUikgLyogc3RhdHVzPW5veGZlciBhY3RpdmU/ICovCisJCXJldHVybjsKKwkvL1RPRE86IHNob3VsZCBzdGF0dXM9bm9uZSBtYWtlIGRkIHN0b3AgcmVhY3RpbmcgdG8gVVNSMSBlbnRpcmVseT8KKwkvL1NvIGZhciB3ZSByZWFjdCB0byBpdCAod2UgcHJpbnQgdGhlIHN0YXRzKSwKKwkvL3N0YXR1cz1ub25lIG9ubHkgc3VwcHJlc3NlcyBmaW5hbCwgbm9uLVVTUjEgZ2VuZXJhdGVkIHN0YXR1cyBtZXNzYWdlLgorIyBlbmRpZgorCWZwcmludGYoc3RkZXJyLCAiJWxsdSBieXRlcyAoJXNCKSBjb3BpZWQsICIsCisJCQlHLnRvdGFsX2J5dGVzLAorCQkJLyogc2hvdyBmcmFjdGlvbmFsIGRpZ2l0LCB1c2Ugc3VmZml4ZXMgKi8KKwkJCW1ha2VfaHVtYW5fcmVhZGFibGVfc3RyKEcudG90YWxfYnl0ZXMsIDEsIDApCisJKTsKKwkvKiBDb3JuZXIgY2FzZXM6CisJICogLi9idXN5Ym94IGRkIDwvZGV2L251bGwgPi9kZXYvbnVsbAorCSAqIC4vYnVzeWJveCBkZCBicz0xTSBjb3VudD0yMDAwIDwvZGV2L3plcm8gPi9kZXYvbnVsbAorCSAqIChlY2hvIERPTkUpIHwgLi9idXN5Ym94IGRkID4vZGV2L251bGwKKwkgKiAoc2xlZXAgMTsgZWNobyBET05FKSB8IC4vYnVzeWJveCBkZCA+L2Rldi9udWxsCisJICovCisJc2Vjb25kcyA9IChub3dfdXMgLSBHLmJlZ2luX3RpbWVfdXMpIC8gMTAwMDAwMC4wOworCWJ5dGVzX3NlYyA9IEcudG90YWxfYnl0ZXMgLyBzZWNvbmRzOworCWZwcmludGYoc3RkZXJyLCAiJWYgc2Vjb25kcywgJXNCL3NcbiIsCisJCQlzZWNvbmRzLAorCQkJLyogc2hvdyBmcmFjdGlvbmFsIGRpZ2l0LCB1c2Ugc3VmZml4ZXMgKi8KKwkJCW1ha2VfaHVtYW5fcmVhZGFibGVfc3RyKGJ5dGVzX3NlYywgMSwgMCkKKwkpOworI2VuZGlmCit9CisKK3N0YXRpYyBzc2l6ZV90IGZ1bGxfd3JpdGVfb3Jfd2Fybihjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4sCisJY29uc3QgY2hhciAqY29uc3QgZmlsZW5hbWUpCit7CisJc3NpemVfdCBuID0gZnVsbF93cml0ZShvZmQsIGJ1ZiwgbGVuKTsKKwlpZiAobiA8IDApCisJCWJiX3BlcnJvcl9tc2coIndyaXRpbmcgJyVzJyIsIGZpbGVuYW1lKTsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGJvb2wgd3JpdGVfYW5kX3N0YXRzKGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbiwgc2l6ZV90IG9icywKKwljb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlzc2l6ZV90IG4gPSBmdWxsX3dyaXRlX29yX3dhcm4oYnVmLCBsZW4sIGZpbGVuYW1lKTsKKwlpZiAobiA8IDApCisJCXJldHVybiAxOworCWlmICgoc2l6ZV90KW4gPT0gb2JzKQorCQlHLm91dF9mdWxsKys7CisJZWxzZSBpZiAobikgLyogPiAwICovCisJCUcub3V0X3BhcnQrKzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9ERF9USElSRF9TVEFUVVNfTElORQorCUcudG90YWxfYnl0ZXMgKz0gbjsKKyNlbmRpZgorCXJldHVybiAwOworfQorCisjaWYgRU5BQkxFX0xGUworIyBkZWZpbmUgWEFUT1VfU0ZYIHhhdG91bGxfc2Z4CisjZWxzZQorIyBkZWZpbmUgWEFUT1VfU0ZYIHhhdG91bF9zZngKKyNlbmRpZgorCitpbnQgZGRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGRkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBrZXl3b3Jkc1tdIEFMSUdOMSA9CisJCSJic1wwIiJjb3VudFwwIiJzZWVrXDAiInNraXBcMCIiaWZcMCIib2ZcMCJJRl9GRUFUVVJFX0REX1NUQVRVUygic3RhdHVzXDAiKQorI2lmIEVOQUJMRV9GRUFUVVJFX0REX0lCU19PQlMKKwkJImlic1wwIiJvYnNcMCIiY29udlwwIgorI2VuZGlmCisJCTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9ERF9JQlNfT0JTCisJc3RhdGljIGNvbnN0IGNoYXIgY29udl93b3Jkc1tdIEFMSUdOMSA9CisJCSJub3RydW5jXDAiInN5bmNcMCIibm9lcnJvclwwIiJmc3luY1wwIiJzd2FiXDAiOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRERfU1RBVFVTCisJc3RhdGljIGNvbnN0IGNoYXIgc3RhdHVzX3dvcmRzW10gQUxJR04xID0KKwkJIm5vbmVcMCIibm94ZmVyXDAiOworI2VuZGlmCisJZW51bSB7CisJCU9QX2JzID0gMCwKKwkJT1BfY291bnQsCisJCU9QX3NlZWssCisJCU9QX3NraXAsCisJCU9QX2lmLAorCQlPUF9vZiwKKwkJSUZfRkVBVFVSRV9ERF9TVEFUVVMoT1Bfc3RhdHVzLCkKKyNpZiBFTkFCTEVfRkVBVFVSRV9ERF9JQlNfT0JTCisJCU9QX2licywKKwkJT1Bfb2JzLAorCQlPUF9jb252LAorCQkvKiBNdXN0IGJlIGluIHRoZSBzYW1lIG9yZGVyIGFzIEZMQUdfWFhYISAqLworCQlPUF9jb252X25vdHJ1bmMgPSAwLAorCQlPUF9jb252X3N5bmMsCisJCU9QX2NvbnZfbm9lcnJvciwKKwkJT1BfY29udl9mc3luYywKKwkJT1BfY29udl9zd2FiLAorCS8qIFVuaW1wbGVtZW50ZWQgY29udj1YWFg6ICovCisJLy9ub2NyZWF0ICAgICAgIGRvIG5vdCBjcmVhdGUgdGhlIG91dHB1dCBmaWxlCisJLy9leGNsICAgICAgICAgIGZhaWwgaWYgdGhlIG91dHB1dCBmaWxlIGFscmVhZHkgZXhpc3RzCisJLy9mZGF0YXN5bmMgICAgIHBoeXNpY2FsbHkgd3JpdGUgb3V0cHV0IGZpbGUgZGF0YSBiZWZvcmUgZmluaXNoaW5nCisJLy9sY2FzZSAgICAgICAgIGNoYW5nZSB1cHBlciBjYXNlIHRvIGxvd2VyIGNhc2UKKwkvL3VjYXNlICAgICAgICAgY2hhbmdlIGxvd2VyIGNhc2UgdG8gdXBwZXIgY2FzZQorCS8vYmxvY2sgICAgICAgICBwYWQgbmV3bGluZS10ZXJtaW5hdGVkIHJlY29yZHMgd2l0aCBzcGFjZXMgdG8gY2JzLXNpemUKKwkvL3VuYmxvY2sgICAgICAgcmVwbGFjZSB0cmFpbGluZyBzcGFjZXMgaW4gY2JzLXNpemUgcmVjb3JkcyB3aXRoIG5ld2xpbmUKKwkvL2FzY2lpICAgICAgICAgZnJvbSBFQkNESUMgdG8gQVNDSUkKKwkvL2ViY2RpYyAgICAgICAgZnJvbSBBU0NJSSB0byBFQkNESUMKKwkvL2libSAgICAgICAgICAgZnJvbSBBU0NJSSB0byBhbHRlcm5hdGUgRUJDRElDCisJLyogUGFydGlhbGx5IGltcGxlbWVudGVkOiAqLworCS8vc3dhYiAgICAgICAgICBzd2FwIGV2ZXJ5IHBhaXIgb2YgaW5wdXQgYnl0ZXM6IHdpbGwgYWJvcnQgb24gbm9uLWV2ZW4gcmVhZHMKKyNlbmRpZgorCX07CisJc21hbGxpbnQgZXhpdGNvZGUgPSBFWElUX0ZBSUxVUkU7CisJaW50IGk7CisJc2l6ZV90IGlicyA9IDUxMjsKKwljaGFyICppYnVmOworI2lmIEVOQUJMRV9GRUFUVVJFX0REX0lCU19PQlMKKwlzaXplX3Qgb2JzID0gNTEyOworCWNoYXIgKm9idWY7CisjZWxzZQorIyBkZWZpbmUgb2JzICBpYnMKKyMgZGVmaW5lIG9idWYgaWJ1ZgorI2VuZGlmCisJLyogVGhlc2UgYXJlIGFsbCB6ZXJvZWQgYXQgb25jZSEgKi8KKwlzdHJ1Y3QgeworCQlzaXplX3Qgb2M7CisJCXNzaXplX3QgcHJldl9yZWFkX3NpemU7IC8qIGZvciBkZXRlY3Rpbmcgc3dhYiBmYWlsdXJlICovCisJCW9mZl90IGNvdW50OworCQlvZmZfdCBzZWVrLCBza2lwOworCQljb25zdCBjaGFyICppbmZpbGUsICpvdXRmaWxlOworCX0gWjsKKyNkZWZpbmUgb2MgICAgICAoWi5vYyAgICAgKQorI2RlZmluZSBwcmV2X3JlYWRfc2l6ZSAoWi5wcmV2X3JlYWRfc2l6ZSkKKyNkZWZpbmUgY291bnQgICAoWi5jb3VudCAgKQorI2RlZmluZSBzZWVrICAgIChaLnNlZWsgICApCisjZGVmaW5lIHNraXAgICAgKFouc2tpcCAgICkKKyNkZWZpbmUgaW5maWxlICAoWi5pbmZpbGUgKQorI2RlZmluZSBvdXRmaWxlIChaLm91dGZpbGUpCisKKwltZW1zZXQoJlosIDAsIHNpemVvZihaKSk7CisJSU5JVF9HKCk7CisJLy9mZmx1c2hfYWxsKCk7IC0gaXMgdGhpcyBuZWVkZWQgYmVjYXVzZSBvZiBOT0VYRUM/CisKKwlmb3IgKGkgPSAxOyBhcmd2W2ldOyBpKyspIHsKKwkJaW50IHdoYXQ7CisJCWNoYXIgKnZhbDsKKwkJY2hhciAqYXJnID0gYXJndltpXTsKKworI2lmIEVOQUJMRV9ERVNLVE9QCisJCS8qICJkZCAtLSIuIE5COiBjb3JldXRpbHMgNi45IHdpbGwgY29tcGxhaW4gaWYgdGhleSBzZWUKKwkJICogbW9yZSB0aGFuIG9uZSBvZiB0aGVtLiBXZSB3b3VsZG4ndC4gKi8KKwkJaWYgKGFyZ1swXSA9PSAnLScgJiYgYXJnWzFdID09ICctJyAmJiBhcmdbMl0gPT0gJ1wwJykKKwkJCWNvbnRpbnVlOworI2VuZGlmCisJCXZhbCA9IHN0cmNocihhcmcsICc9Jyk7CisJCWlmICh2YWwgPT0gTlVMTCkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJKnZhbCA9ICdcMCc7CisJCXdoYXQgPSBpbmRleF9pbl9zdHJpbmdzKGtleXdvcmRzLCBhcmcpOworCQlpZiAod2hhdCA8IDApCisJCQliYl9zaG93X3VzYWdlKCk7CisJCS8qICp2YWwgPSAnPSc7IC0gdG8gcHJlc2VydmUgcHMgbGlzdGluZz8gKi8KKwkJdmFsKys7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRERfSUJTX09CUworCQlpZiAod2hhdCA9PSBPUF9pYnMpIHsKKwkJCS8qIE11c3QgZml0IGludG8gcG9zaXRpdmUgc3NpemVfdCAqLworCQkJaWJzID0geGF0b3VsX3JhbmdlX3NmeCh2YWwsIDEsICgoc2l6ZV90KS0xTCkvMiwgY3dia01HX3N1ZmZpeGVzKTsKKwkJCS8qY29udGludWU7Ki8KKwkJfQorCQlpZiAod2hhdCA9PSBPUF9vYnMpIHsKKwkJCW9icyA9IHhhdG91bF9yYW5nZV9zZngodmFsLCAxLCAoKHNpemVfdCktMUwpLzIsIGN3YmtNR19zdWZmaXhlcyk7CisJCQkvKmNvbnRpbnVlOyovCisJCX0KKwkJaWYgKHdoYXQgPT0gT1BfY29udikgeworCQkJd2hpbGUgKDEpIHsKKwkJCQlpbnQgbjsKKwkJCQkvKiBmaW5kICcsJywgcmVwbGFjZSB0aGVtIHdpdGggTlVMIHNvIHdlIGNhbiB1c2UgdmFsIGZvcgorCQkJCSAqIGluZGV4X2luX3N0cmluZ3MoKSB3aXRob3V0IGNvcHlpbmcuCisJCQkJICogV2UgcmVseSBvbiB2YWwgYmVpbmcgbm9uLW51bGwsIGVsc2Ugc3RyY2hyIHdvdWxkIGZhdWx0LgorCQkJCSAqLworCQkJCWFyZyA9IHN0cmNocih2YWwsICcsJyk7CisJCQkJaWYgKGFyZykKKwkJCQkJKmFyZyA9ICdcMCc7CisJCQkJbiA9IGluZGV4X2luX3N0cmluZ3MoY29udl93b3JkcywgdmFsKTsKKwkJCQlpZiAobiA8IDApCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19pbnZhbGlkX2FyZywgdmFsLCAiY29udiIpOworCQkJCUcuZmxhZ3MgfD0gKDEgPDwgbik7CisJCQkJaWYgKCFhcmcpIC8qIG5vICcsJyBsZWZ0LCBzbyB0aGlzIHdhcyB0aGUgbGFzdCBzcGVjaWZpZXIgKi8KKwkJCQkJYnJlYWs7CisJCQkJLyogKmFyZyA9ICcsJzsgLSB0byBwcmVzZXJ2ZSBwcyBsaXN0aW5nPyAqLworCQkJCXZhbCA9IGFyZyArIDE7IC8qIHNraXAgdGhpcyBrZXl3b3JkIGFuZCAnLCcgKi8KKwkJCX0KKwkJCS8qY29udGludWU7Ki8KKwkJfQorI2VuZGlmCisJCWlmICh3aGF0ID09IE9QX2JzKSB7CisJCQlpYnMgPSB4YXRvdWxfcmFuZ2Vfc2Z4KHZhbCwgMSwgKChzaXplX3QpLTFMKS8yLCBjd2JrTUdfc3VmZml4ZXMpOworCQkJb2JzID0gaWJzOworCQkJLypjb250aW51ZTsqLworCQl9CisJCS8qIFRoZXNlIGNhbiBiZSBsYXJnZTogKi8KKwkJaWYgKHdoYXQgPT0gT1BfY291bnQpIHsKKwkJCUcuZmxhZ3MgfD0gRkxBR19DT1VOVDsKKwkJCWNvdW50ID0gWEFUT1VfU0ZYKHZhbCwgY3dia01HX3N1ZmZpeGVzKTsKKwkJCS8qY29udGludWU7Ki8KKwkJfQorCQlpZiAod2hhdCA9PSBPUF9zZWVrKSB7CisJCQlzZWVrID0gWEFUT1VfU0ZYKHZhbCwgY3dia01HX3N1ZmZpeGVzKTsKKwkJCS8qY29udGludWU7Ki8KKwkJfQorCQlpZiAod2hhdCA9PSBPUF9za2lwKSB7CisJCQlza2lwID0gWEFUT1VfU0ZYKHZhbCwgY3dia01HX3N1ZmZpeGVzKTsKKwkJCS8qY29udGludWU7Ki8KKwkJfQorCQlpZiAod2hhdCA9PSBPUF9pZikgeworCQkJaW5maWxlID0gdmFsOworCQkJLypjb250aW51ZTsqLworCQl9CisJCWlmICh3aGF0ID09IE9QX29mKSB7CisJCQlvdXRmaWxlID0gdmFsOworCQkJLypjb250aW51ZTsqLworCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfRERfU1RBVFVTCisJCWlmICh3aGF0ID09IE9QX3N0YXR1cykgeworCQkJaW50IG47CisJCQluID0gaW5kZXhfaW5fc3RyaW5ncyhzdGF0dXNfd29yZHMsIHZhbCk7CisJCQlpZiAobiA8IDApCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2ludmFsaWRfYXJnLCB2YWwsICJzdGF0dXMiKTsKKwkJCUcuZmxhZ3MgfD0gRkxBR19TVEFUVVMgPDwgbjsKKwkJCS8qY29udGludWU7Ki8KKwkJfQorI2VuZGlmCisJfSAvKiBlbmQgb2YgImZvciAoYXJndltpXSkiICovCisKKy8vWFhYOkZJWE1FIGZvciBodWdlIGlicyBvciBvYnMsIG1hbGxvYydpbmcgdGhlbSBpc24ndCB0aGUgYnJpZ2h0ZXN0IGlkZWEgZXZlcgorCWlidWYgPSB4bWFsbG9jKGlicyk7CisJb2J1ZiA9IGlidWY7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRERfSUJTX09CUworCWlmIChpYnMgIT0gb2JzKSB7CisJCUcuZmxhZ3MgfD0gRkxBR19UV09CVUZTOworCQlvYnVmID0geG1hbGxvYyhvYnMpOworCX0KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRERfU0lHTkFMX0hBTkRMSU5HCisJc2lnbmFsX1NBX1JFU1RBUlRfZW1wdHlfbWFzayhTSUdVU1IxLCBkZF9vdXRwdXRfc3RhdHVzKTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0REX1RISVJEX1NUQVRVU19MSU5FCisJRy5iZWdpbl90aW1lX3VzID0gbW9ub3RvbmljX3VzKCk7CisjZW5kaWYKKworCWlmIChpbmZpbGUpIHsKKwkJeG1vdmVfZmQoeG9wZW4oaW5maWxlLCBPX1JET05MWSksIGlmZCk7CisJfSBlbHNlIHsKKwkJaW5maWxlID0gYmJfbXNnX3N0YW5kYXJkX2lucHV0OworCX0KKwlpZiAob3V0ZmlsZSkgeworCQlpbnQgb2ZsYWcgPSBPX1dST05MWSB8IE9fQ1JFQVQ7CisKKwkJaWYgKCFzZWVrICYmICEoRy5mbGFncyAmIEZMQUdfTk9UUlVOQykpCisJCQlvZmxhZyB8PSBPX1RSVU5DOworCisJCXhtb3ZlX2ZkKHhvcGVuKG91dGZpbGUsIG9mbGFnKSwgb2ZkKTsKKworCQlpZiAoc2VlayAmJiAhKEcuZmxhZ3MgJiBGTEFHX05PVFJVTkMpKSB7CisJCQlpZiAoZnRydW5jYXRlKG9mZCwgc2VlayAqIG9icykgPCAwKSB7CisJCQkJc3RydWN0IHN0YXQgc3Q7CisKKwkJCQlpZiAoZnN0YXQob2ZkLCAmc3QpIDwgMAorCQkJCSB8fCBTX0lTUkVHKHN0LnN0X21vZGUpCisJCQkJIHx8IFNfSVNESVIoc3Quc3RfbW9kZSkKKwkJCQkpIHsKKwkJCQkJZ290byBkaWVfb3V0ZmlsZTsKKwkJCQl9CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlvdXRmaWxlID0gYmJfbXNnX3N0YW5kYXJkX291dHB1dDsKKwl9CisJaWYgKHNraXApIHsKKwkJaWYgKGxzZWVrKGlmZCwgc2tpcCAqIGlicywgU0VFS19DVVIpIDwgMCkgeworCQkJZG8geworCQkJCXNzaXplX3QgbiA9IHNhZmVfcmVhZChpZmQsIGlidWYsIGlicyk7CisJCQkJaWYgKG4gPCAwKQorCQkJCQlnb3RvIGRpZV9pbmZpbGU7CisJCQkJaWYgKG4gPT0gMCkKKwkJCQkJYnJlYWs7CisJCQl9IHdoaWxlICgtLXNraXAgIT0gMCk7CisJCX0KKwl9CisJaWYgKHNlZWspIHsKKwkJaWYgKGxzZWVrKG9mZCwgc2VlayAqIG9icywgU0VFS19DVVIpIDwgMCkKKwkJCWdvdG8gZGllX291dGZpbGU7CisJfQorCisJd2hpbGUgKCEoRy5mbGFncyAmIEZMQUdfQ09VTlQpIHx8IChHLmluX2Z1bGwgKyBHLmluX3BhcnQgIT0gY291bnQpKSB7CisJCXNzaXplX3QgbjsKKworCQluID0gc2FmZV9yZWFkKGlmZCwgaWJ1ZiwgaWJzKTsKKwkJaWYgKG4gPT0gMCkKKwkJCWJyZWFrOworCQlpZiAobiA8IDApIHsKKwkJCS8qICJCYWQgYmxvY2siICovCisJCQlpZiAoIShHLmZsYWdzICYgRkxBR19OT0VSUk9SKSkKKwkJCQlnb3RvIGRpZV9pbmZpbGU7CisJCQliYl9zaW1wbGVfcGVycm9yX21zZyhpbmZpbGUpOworCQkJLyogR05VIGRkIHdpdGggY29udj1ub2Vycm9yIHNraXBzIG92ZXIgYmFkIGJsb2NrcyAqLworCQkJeGxzZWVrKGlmZCwgaWJzLCBTRUVLX0NVUik7CisJCQkvKiBjb252PW5vZXJyb3Isc3luYyB3cml0ZXMgTlVMcywKKwkJCSAqIGNvbnY9bm9lcnJvciBqdXN0IGlnbm9yZXMgaW5wdXQgYmFkIGJsb2NrcyAqLworCQkJbiA9IDA7CisJCX0KKwkJaWYgKEcuZmxhZ3MgJiBGTEFHX1NXQUIpIHsKKwkJCXVpbnQxNl90ICpwMTY7CisJCQlzc2l6ZV90IG4yOworCisJCQkvKiBPdXIgY29kZSBhbGxvd3Mgb25seSBsYXN0IHJlYWQgdG8gYmUgb2RkLXNpemVkICovCisJCQlpZiAocHJldl9yZWFkX3NpemUgJiAxKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzd2FiICVsdSBieXRlIGJ1ZmZlciIsCisJCQkJCQkodW5zaWduZWQgbG9uZylwcmV2X3JlYWRfc2l6ZSk7CisJCQlwcmV2X3JlYWRfc2l6ZSA9IG47CisKKwkJCS8qIElmIG4gaXMgb2RkLCBsYXN0IGJ5dGUgaXMgbm90IHN3YXBwZWQ6CisJCQkgKiAgZWNobyAtbiAicXdlIiB8IGRkIGNvbnY9c3dhYgorCQkJICogcHJpbnRzICJ3cWUiLgorCQkJICovCisJCQlwMTYgPSAodm9pZCopIGlidWY7CisJCQluMiA9IChuID4+IDEpOworCQkJd2hpbGUgKC0tbjIgPj0gMCkgeworCQkJCSpwMTYgPSBic3dhcF8xNigqcDE2KTsKKwkJCQlwMTYrKzsKKwkJCX0KKwkJfQorCQlpZiAoKHNpemVfdCluID09IGlicykKKwkJCUcuaW5fZnVsbCsrOworCQllbHNlIHsKKwkJCUcuaW5fcGFydCsrOworCQkJaWYgKEcuZmxhZ3MgJiBGTEFHX1NZTkMpIHsKKwkJCQltZW1zZXQoaWJ1ZiArIG4sIDAsIGlicyAtIG4pOworCQkJCW4gPSBpYnM7CisJCQl9CisJCX0KKwkJaWYgKEcuZmxhZ3MgJiBGTEFHX1RXT0JVRlMpIHsKKwkJCWNoYXIgKnRtcCA9IGlidWY7CisJCQl3aGlsZSAobikgeworCQkJCXNpemVfdCBkID0gb2JzIC0gb2M7CisKKwkJCQlpZiAoZCA+IChzaXplX3QpbikKKwkJCQkJZCA9IG47CisJCQkJbWVtY3B5KG9idWYgKyBvYywgdG1wLCBkKTsKKwkJCQluIC09IGQ7CisJCQkJdG1wICs9IGQ7CisJCQkJb2MgKz0gZDsKKwkJCQlpZiAob2MgPT0gb2JzKSB7CisJCQkJCWlmICh3cml0ZV9hbmRfc3RhdHMob2J1Ziwgb2JzLCBvYnMsIG91dGZpbGUpKQorCQkJCQkJZ290byBvdXRfc3RhdHVzOworCQkJCQlvYyA9IDA7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHdyaXRlX2FuZF9zdGF0cyhpYnVmLCBuLCBvYnMsIG91dGZpbGUpKQorCQkJCWdvdG8gb3V0X3N0YXR1czsKKwkJfQorCisJCWlmIChHLmZsYWdzICYgRkxBR19GU1lOQykgeworCQkJaWYgKGZzeW5jKG9mZCkgPCAwKQorCQkJCWdvdG8gZGllX291dGZpbGU7CisJCX0KKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfRERfSUJTX09CUyAmJiBvYykgeworCQlpZiAod3JpdGVfYW5kX3N0YXRzKG9idWYsIG9jLCBvYnMsIG91dGZpbGUpKQorCQkJZ290byBvdXRfc3RhdHVzOworCX0KKwlpZiAoY2xvc2UoaWZkKSA8IDApIHsKKyBkaWVfaW5maWxlOgorCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKGluZmlsZSk7CisJfQorCisJaWYgKGNsb3NlKG9mZCkgPCAwKSB7CisgZGllX291dGZpbGU6CisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUob3V0ZmlsZSk7CisJfQorCisJZXhpdGNvZGUgPSBFWElUX1NVQ0NFU1M7Cisgb3V0X3N0YXR1czoKKwlpZiAoIUVOQUJMRV9GRUFUVVJFX0REX1NUQVRVUyB8fCAhKEcuZmxhZ3MgJiBGTEFHX1NUQVRVU19OT05FKSkKKwkJZGRfb3V0cHV0X3N0YXR1cygwKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlmcmVlKG9idWYpOworCQlpZiAoRy5mbGFncyAmIEZMQUdfVFdPQlVGUykKKwkJCWZyZWUoaWJ1Zik7CisJfQorCisJcmV0dXJuIGV4aXRjb2RlOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2RmLmMgYi9jb3JldXRpbHMvZGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzljMTFhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL2RmLmMKQEAgLTAsMCArMSwyNzUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgZGYgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBiYXNlZCBvbiBvcmlnaW5hbCBjb2RlIGJ5IChJIHRoaW5rKSBCcnVjZSBQZXJlbnMgPGJydWNlQHBpeGFyLmNvbT4uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBfTk9UXyBjb21wbGlhbnQgLS0gb3B0aW9uIC10IG1pc3NpbmcuICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2RmLmh0bWwgKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBTaXplIHJlZHVjdGlvbi4gIFJlbW92ZWQgZmxvYXRpbmcgcG9pbnQgZGVwZW5kZW5jeS4gIEFkZGVkIGVycm9yIGNoZWNraW5nCisgKiBvbiBvdXRwdXQuICBPdXRwdXQgc3RhdHMgb24gMC1zaXplZCBmaWxlc3lzdGVtcyBpZiBzcGVjaWZpY2FsbHkgbGlzdGVkIG9uCisgKiB0aGUgY29tbWFuZCBsaW5lLiAgUHJvcGVybHkgcm91bmQgKi1ibG9ja3MsIFVzZWQsIGFuZCBBdmFpbGFibGUgcXVhbnRpdGllcy4KKyAqCisgKiBBdWcgMjgsIDIwMDggICAgICBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBJbXBsZW1lbnQgLVAgYW5kIC1COyBiZXR0ZXIgY29yZXV0aWxzIGNvbXBhdDsgY2xlYW51cAorICovCisKKy8vdXNhZ2U6I2RlZmluZSBkZl90cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiWy1QayIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUoIm1oIikKKy8vdXNhZ2U6CSJUIgorLy91c2FnZToJSUZfRkVBVFVSRV9ERl9GQU5DWSgiYWldIFstQiBTSVpFIikKKy8vdXNhZ2U6CSJdIFtGSUxFU1lTVEVNXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBkZl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IGZpbGVzeXN0ZW0gdXNhZ2Ugc3RhdGlzdGljc1xuIgorLy91c2FnZTogICAgICJcbgktUAlQT1NJWCBvdXRwdXQgZm9ybWF0IgorLy91c2FnZTogICAgICJcbgktawkxMDI0LWJ5dGUgYmxvY2tzIChkZWZhdWx0KSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUoCisvL3VzYWdlOiAgICAgIlxuCS1tCTFNLWJ5dGUgYmxvY2tzIgorLy91c2FnZTogICAgICJcbgktaAlIdW1hbiByZWFkYWJsZSAoZS5nLiAxSyAyNDNNIDJHKSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLVQJUHJpbnQgZmlsZXN5c3RlbSB0eXBlIgorLy91c2FnZToJSUZfRkVBVFVSRV9ERl9GQU5DWSgKKy8vdXNhZ2U6ICAgICAiXG4JLWEJU2hvdyBhbGwgZmlsZXN5c3RlbXMiCisvL3VzYWdlOiAgICAgIlxuCS1pCUlub2RlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUIgU0laRQlCbG9ja3NpemUiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGRmX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGRmXG4iCisvL3VzYWdlOiAgICAgICAiRmlsZXN5c3RlbSAgICAgICAgICAgMUstYmxvY2tzICAgICAgVXNlZCBBdmFpbGFibGUgVXNlJSBNb3VudGVkIG9uXG4iCisvL3VzYWdlOiAgICAgICAiL2Rldi9zZGEzICAgICAgICAgICAgICA4NjkwODY0ICAgODU1MzU0MCAgICAxMzczMjQgIDk4JSAvXG4iCisvL3VzYWdlOiAgICAgICAiL2Rldi9zZGExICAgICAgICAgICAgICAgIDY0MjE2ICAgICAzNjM2NCAgICAgMjc4NTIgIDU3JSAvYm9vdFxuIgorLy91c2FnZTogICAgICAgIiQgZGYgL2Rldi9zZGEzXG4iCisvL3VzYWdlOiAgICAgICAiRmlsZXN5c3RlbSAgICAgICAgICAgMUstYmxvY2tzICAgICAgVXNlZCBBdmFpbGFibGUgVXNlJSBNb3VudGVkIG9uXG4iCisvL3VzYWdlOiAgICAgICAiL2Rldi9zZGEzICAgICAgICAgICAgICA4NjkwODY0ICAgODU1MzU0MCAgICAxMzczMjQgIDk4JSAvXG4iCisvL3VzYWdlOiAgICAgICAiJCBQT1NJWExZX0NPUlJFQ1Q9c3VyZSBkZiAvZGV2L3NkYTNcbiIKKy8vdXNhZ2U6ICAgICAgICJGaWxlc3lzdGVtICAgICAgICAgNTEyQi1ibG9ja3MgICAgICBVc2VkIEF2YWlsYWJsZSBVc2UlIE1vdW50ZWQgb25cbiIKKy8vdXNhZ2U6ICAgICAgICIvZGV2L3NkYTMgICAgICAgICAgICAgMTczODE3MjggIDE3MTA3MDgwICAgIDI3NDY0OCAgOTglIC9cbiIKKy8vdXNhZ2U6ICAgICAgICIkIFBPU0lYTFlfQ09SUkVDVD15ZXAgZGYgLVAgL2Rldi9zZGEzXG4iCisvL3VzYWdlOiAgICAgICAiRmlsZXN5c3RlbSAgICAgICAgICA1MTItYmxvY2tzICAgICAgVXNlZCBBdmFpbGFibGUgQ2FwYWNpdHkgTW91bnRlZCBvblxuIgorLy91c2FnZTogICAgICAgIi9kZXYvc2RhMyAgICAgICAgICAgICAxNzM4MTcyOCAgMTcxMDcwODAgICAgMjc0NjQ4ICAgICAgOTglIC9cbiIKKworI2luY2x1ZGUgPG1udGVudC5oPgorI2luY2x1ZGUgPHN5cy92ZnMuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInVuaWNvZGUuaCIKKworI2lmICFFTkFCTEVfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRQorc3RhdGljIHVuc2lnbmVkIGxvbmcga3NjYWxlKHVuc2lnbmVkIGxvbmcgYiwgdW5zaWduZWQgbG9uZyBicykKK3sKKwlyZXR1cm4gKGIgKiAodW5zaWduZWQgbG9uZyBsb25nKSBicyArIDEwMjQvMikgLyAxMDI0OworfQorI2VuZGlmCisKK2ludCBkZl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZGZfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGxvbmcgYmxvY2tzX3VzZWQ7CisJdW5zaWduZWQgYmxvY2tzX3BlcmNlbnRfdXNlZDsKKwl1bnNpZ25lZCBsb25nIGRmX2Rpc3BfaHIgPSAxMDI0OworCWludCBzdGF0dXMgPSBFWElUX1NVQ0NFU1M7CisJdW5zaWduZWQgb3B0OworCUZJTEUgKm1vdW50X3RhYmxlOworCXN0cnVjdCBtbnRlbnQgKm1vdW50X2VudHJ5OworCXN0cnVjdCBzdGF0ZnMgczsKKworCWVudW0geworCQlPUFRfS0lMTyAgPSAoMSA8PCAwKSwKKwkJT1BUX1BPU0lYID0gKDEgPDwgMSksCisJCU9QVF9GU1RZUEUgID0gKDEgPDwgMiksCisJCU9QVF9BTEwgICA9ICgxIDw8IDMpICogRU5BQkxFX0ZFQVRVUkVfREZfRkFOQ1ksCisJCU9QVF9JTk9ERSA9ICgxIDw8IDQpICogRU5BQkxFX0ZFQVRVUkVfREZfRkFOQ1ksCisJCU9QVF9CU0laRSA9ICgxIDw8IDUpICogRU5BQkxFX0ZFQVRVUkVfREZfRkFOQ1ksCisJCU9QVF9IVU1BTiA9ICgxIDw8ICgzICsgMypFTkFCTEVfRkVBVFVSRV9ERl9GQU5DWSkpICogRU5BQkxFX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUsCisJCU9QVF9NRUdBICA9ICgxIDw8ICg0ICsgMypFTkFCTEVfRkVBVFVSRV9ERl9GQU5DWSkpICogRU5BQkxFX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUsCisJfTsKKwljb25zdCBjaGFyICpkaXNwX3VuaXRzX2hkciA9IE5VTEw7CisJY2hhciAqY2hwOworCisJaW5pdF91bmljb2RlKCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRSAmJiBFTkFCTEVfRkVBVFVSRV9ERl9GQU5DWQorCW9wdF9jb21wbGVtZW50YXJ5ID0gImstbUI6bS1CazpCLWttIjsKKyNlbGlmIEVOQUJMRV9GRUFUVVJFX0hVTUFOX1JFQURBQkxFCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiay1tOm0tayI7CisjZW5kaWYKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAia1BUIgorCQkJSUZfRkVBVFVSRV9ERl9GQU5DWSgiYWlCOiIpCisJCQlJRl9GRUFUVVJFX0hVTUFOX1JFQURBQkxFKCJobSIpCisJCQlJRl9GRUFUVVJFX0RGX0ZBTkNZKCwgJmNocCkpOworCWlmIChvcHQgJiBPUFRfTUVHQSkKKwkJZGZfZGlzcF9ociA9IDEwMjQqMTAyNDsKKworCWlmIChvcHQgJiBPUFRfQlNJWkUpCisJCWRmX2Rpc3BfaHIgPSB4YXRvdWxfcmFuZ2UoY2hwLCAxLCBVTE9OR19NQVgpOyAvKiBkaXNhbGxvdyAwICovCisKKwkvKiBGcm9tIHRoZSBtYW5wYWdlIG9mIGRmIGZyb20gY29yZXV0aWxzLTYuMTA6CisJICogRGlzayBzcGFjZSBpcyBzaG93biBpbiAxSyBibG9ja3MgYnkgZGVmYXVsdCwgdW5sZXNzIHRoZSBlbnZpcm9ubWVudAorCSAqIHZhcmlhYmxlIFBPU0lYTFlfQ09SUkVDVCBpcyBzZXQsIGluIHdoaWNoIGNhc2UgNTEyLWJ5dGUgYmxvY2tzIGFyZSB1c2VkLgorCSAqLworCWlmIChnZXRlbnYoIlBPU0lYTFlfQ09SUkVDVCIpKSAvKiBUT0RPIC0gYSBuZXcgbGliYmIgZnVuY3Rpb24/ICovCisJCWRmX2Rpc3BfaHIgPSA1MTI7CisKKwlpZiAob3B0ICYgT1BUX0hVTUFOKSB7CisJCWRmX2Rpc3BfaHIgPSAwOworCQlkaXNwX3VuaXRzX2hkciA9ICIgICAgIFNpemUiOworCX0KKwlpZiAob3B0ICYgT1BUX0lOT0RFKQorCQlkaXNwX3VuaXRzX2hkciA9ICIgICBJbm9kZXMiOworCisJaWYgKGRpc3BfdW5pdHNfaGRyID09IE5VTEwpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRQorCQlkaXNwX3VuaXRzX2hkciA9IHhhc3ByaW50ZigiJXMtYmxvY2tzIiwKKwkJCS8qIHByaW50IGRmX2Rpc3BfaHIsIHNob3cgbm8gZnJhY3Rpb25hbHMsCisJCQkgKiB1c2Ugc3VmZml4ZXMgaWYgT1BUX1BPU0lYIGlzIHNldCBpbiBvcHQgKi8KKwkJCW1ha2VfaHVtYW5fcmVhZGFibGVfc3RyKGRmX2Rpc3BfaHIsIDAsICEhKG9wdCAmIE9QVF9QT1NJWCkpCisJCSk7CisjZWxzZQorCQlkaXNwX3VuaXRzX2hkciA9IHhhc3ByaW50ZigiJWx1LWJsb2NrcyIsIGRmX2Rpc3BfaHIpOworI2VuZGlmCisJfQorCisJcHJpbnRmKCJGaWxlc3lzdGVtICAgICAgICAgICAlcyUtMTVzVXNlZCBBdmFpbGFibGUgJXMgTW91bnRlZCBvblxuIiwKKwkJCShvcHQgJiBPUFRfRlNUWVBFKSA/ICJUeXBlICAgICAgICIgOiAiIiwKKwkJCWRpc3BfdW5pdHNfaGRyLAorCQkJKG9wdCAmIE9QVF9QT1NJWCkgPyAiQ2FwYWNpdHkiIDogIlVzZSUiKTsKKworCW1vdW50X3RhYmxlID0gTlVMTDsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoIWFyZ3ZbMF0pIHsKKwkJbW91bnRfdGFibGUgPSBzZXRtbnRlbnQoYmJfcGF0aF9tdGFiX2ZpbGUsICJyIik7CisJCWlmICghbW91bnRfdGFibGUpCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoYmJfcGF0aF9tdGFiX2ZpbGUpOworCX0KKworCXdoaWxlICgxKSB7CisJCWNvbnN0IGNoYXIgKmRldmljZTsKKwkJY29uc3QgY2hhciAqbW91bnRfcG9pbnQ7CisJCWNvbnN0IGNoYXIgKmZzX3R5cGU7CisKKwkJaWYgKG1vdW50X3RhYmxlKSB7CisJCQltb3VudF9lbnRyeSA9IGdldG1udGVudChtb3VudF90YWJsZSk7CisJCQlpZiAoIW1vdW50X2VudHJ5KSB7CisJCQkJZW5kbW50ZW50KG1vdW50X3RhYmxlKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCW1vdW50X3BvaW50ID0gKmFyZ3YrKzsKKwkJCWlmICghbW91bnRfcG9pbnQpCisJCQkJYnJlYWs7CisJCQltb3VudF9lbnRyeSA9IGZpbmRfbW91bnRfcG9pbnQobW91bnRfcG9pbnQsIDEpOworCQkJaWYgKCFtb3VudF9lbnRyeSkgeworCQkJCWJiX2Vycm9yX21zZygiJXM6IGNhbid0IGZpbmQgbW91bnQgcG9pbnQiLCBtb3VudF9wb2ludCk7Cisgc2V0X2Vycm9yOgorCQkJCXN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfQorCisJCWRldmljZSA9IG1vdW50X2VudHJ5LT5tbnRfZnNuYW1lOworCQltb3VudF9wb2ludCA9IG1vdW50X2VudHJ5LT5tbnRfZGlyOworCQlmc190eXBlID0gbW91bnRfZW50cnktPm1udF90eXBlOworCisJCWlmIChzdGF0ZnMobW91bnRfcG9pbnQsICZzKSAhPSAwKSB7CisJCQliYl9zaW1wbGVfcGVycm9yX21zZyhtb3VudF9wb2ludCk7CisJCQlnb3RvIHNldF9lcnJvcjsKKwkJfQorCisJCWlmICgocy5mX2Jsb2NrcyA+IDApIHx8ICFtb3VudF90YWJsZSB8fCAob3B0ICYgT1BUX0FMTCkpIHsKKwkJCWlmIChvcHQgJiBPUFRfSU5PREUpIHsKKwkJCQlzLmZfYmxvY2tzID0gcy5mX2ZpbGVzOworCQkJCXMuZl9iYXZhaWwgPSBzLmZfYmZyZWUgPSBzLmZfZmZyZWU7CisJCQkJcy5mX2JzaXplID0gMTsKKworCQkJCWlmIChkZl9kaXNwX2hyKQorCQkJCQlkZl9kaXNwX2hyID0gMTsKKwkJCX0KKwkJCWJsb2Nrc191c2VkID0gcy5mX2Jsb2NrcyAtIHMuZl9iZnJlZTsKKwkJCWJsb2Nrc19wZXJjZW50X3VzZWQgPSAwOworCQkJaWYgKGJsb2Nrc191c2VkICsgcy5mX2JhdmFpbCkgeworCQkJCWJsb2Nrc19wZXJjZW50X3VzZWQgPSAoYmxvY2tzX3VzZWQgKiAxMDBVTEwKKwkJCQkJCSsgKGJsb2Nrc191c2VkICsgcy5mX2JhdmFpbCkvMgorCQkJCQkJKSAvIChibG9ja3NfdXNlZCArIHMuZl9iYXZhaWwpOworCQkJfQorCisJCQkvKiBHTlUgY29yZXV0aWxzIDYuMTAgc2tpcHMgY2VydGFpbiBtb3VudHMsIHRyeSB0byBiZSBjb21wYXRpYmxlLiAgKi8KKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9TS0lQX1JPT1RGUyAmJiBzdHJjbXAoZGV2aWNlLCAicm9vdGZzIikgPT0gMCkKKwkJCQljb250aW51ZTsKKworI2lmZGVmIFdIWV9XRV9ET19JVF9GT1JfREVWX1JPT1RfT05MWQorCQkJaWYgKHN0cmNtcChkZXZpY2UsICIvZGV2L3Jvb3QiKSA9PSAwKSB7CisJCQkJLyogQWRqdXN0cyBkZXZpY2UgdG8gYmUgdGhlIHJlYWwgcm9vdCBkZXZpY2UsCisJCQkJICogb3IgbGVhdmVzIGRldmljZSBhbG9uZSBpZiBpdCBjYW4ndCBmaW5kIGl0ICovCisJCQkJZGV2aWNlID0gZmluZF9ibG9ja19kZXZpY2UoIi8iKTsKKwkJCQlpZiAoIWRldmljZSkgeworCQkJCQlnb3RvIHNldF9lcnJvcjsKKwkJCQl9CisJCQl9CisjZW5kaWYKKworI2lmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwkJCXsKKwkJCQl1bmlfc3RhdF90IHVuaV9zdGF0OworCQkJCWNoYXIgKnVuaV9kZXYgPSB1bmljb2RlX2NvbnZfdG9fcHJpbnRhYmxlKCZ1bmlfc3RhdCwgZGV2aWNlKTsKKwkJCQlpZiAodW5pX3N0YXQudW5pY29kZV93aWR0aCA+IDIwICYmICEob3B0ICYgT1BUX1BPU0lYKSkgeworCQkJCQlwcmludGYoIiVzXG4lMjBzIiwgdW5pX2RldiwgIiIpOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW50ZigiJXMlKnMiLCB1bmlfZGV2LCAyMCAtIChpbnQpdW5pX3N0YXQudW5pY29kZV93aWR0aCwgIiIpOworCQkJCX0KKwkJCQlmcmVlKHVuaV9kZXYpOworCQkJCWlmIChvcHQgJiBPUFRfRlNUWVBFKSB7CisJCQkJCWNoYXIgKnVuaV90eXBlID0gdW5pY29kZV9jb252X3RvX3ByaW50YWJsZSgmdW5pX3N0YXQsIGZzX3R5cGUpOworCQkJCQlpZiAodW5pX3N0YXQudW5pY29kZV93aWR0aCA+IDEwICYmICEob3B0ICYgT1BUX1BPU0lYKSkKKwkJCQkJCXByaW50ZigiICVzXG4lMzFzIiwgdW5pX3R5cGUsICIiKTsKKwkJCQkJZWxzZQorCQkJCQkJcHJpbnRmKCIgJXMlKnMiLCB1bmlfdHlwZSwgMTAgLSAoaW50KXVuaV9zdGF0LnVuaWNvZGVfd2lkdGgsICIiKTsKKwkJCQkJZnJlZSh1bmlfdHlwZSk7CisJCQkJfQorCQkJfQorI2Vsc2UKKwkJCWlmIChwcmludGYoIlxuJS0yMHMiICsgMSwgZGV2aWNlKSA+IDIwICYmICEob3B0ICYgT1BUX1BPU0lYKSkKKwkJCQlwcmludGYoIlxuJS0yMHMiLCAiIik7CisJCQlpZiAob3B0ICYgT1BUX0ZTVFlQRSkgeworCQkJCWlmIChwcmludGYoIiAlLTEwcyIsIGZzX3R5cGUpID4gMTEgJiYgIShvcHQgJiBPUFRfUE9TSVgpKQorCQkJCQlwcmludGYoIlxuJS0zMHMiLCAiIik7CisJCQl9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0hVTUFOX1JFQURBQkxFCisJCQlwcmludGYoIiAlOXMgIiwKKwkJCQkvKiBmX2Jsb2NrcyB4IGZfYnNpemUgLyBkZl9kaXNwX2hyLCBzaG93IG9uZSBmcmFjdGlvbmFsLAorCQkJCSAqIHVzZSBzdWZmaXhlcyBpZiBkZl9kaXNwX2hyID09IDAgKi8KKwkJCQltYWtlX2h1bWFuX3JlYWRhYmxlX3N0cihzLmZfYmxvY2tzLCBzLmZfYnNpemUsIGRmX2Rpc3BfaHIpKTsKKworCQkJcHJpbnRmKCIgJTlzICIgKyAxLAorCQkJCS8qIEVYUFIgeCBmX2JzaXplIC8gZGZfZGlzcF9ociwgc2hvdyBvbmUgZnJhY3Rpb25hbCwKKwkJCQkgKiB1c2Ugc3VmZml4ZXMgaWYgZGZfZGlzcF9ociA9PSAwICovCisJCQkJbWFrZV9odW1hbl9yZWFkYWJsZV9zdHIoKHMuZl9ibG9ja3MgLSBzLmZfYmZyZWUpLAorCQkJCQkJcy5mX2JzaXplLCBkZl9kaXNwX2hyKSk7CisKKwkJCXByaW50ZigiJTlzICUzdSUlICVzXG4iLAorCQkJCS8qIGZfYmF2YWlsIHggZl9ic2l6ZSAvIGRmX2Rpc3BfaHIsIHNob3cgb25lIGZyYWN0aW9uYWwsCisJCQkJICogdXNlIHN1ZmZpeGVzIGlmIGRmX2Rpc3BfaHIgPT0gMCAqLworCQkJCW1ha2VfaHVtYW5fcmVhZGFibGVfc3RyKHMuZl9iYXZhaWwsIHMuZl9ic2l6ZSwgZGZfZGlzcF9ociksCisJCQkJYmxvY2tzX3BlcmNlbnRfdXNlZCwgbW91bnRfcG9pbnQpOworI2Vsc2UKKwkJCXByaW50ZigiICU5bHUgJTlsdSAlOWx1ICUzdSUlICVzXG4iLAorCQkJCWtzY2FsZShzLmZfYmxvY2tzLCBzLmZfYnNpemUpLAorCQkJCWtzY2FsZShzLmZfYmxvY2tzIC0gcy5mX2JmcmVlLCBzLmZfYnNpemUpLAorCQkJCWtzY2FsZShzLmZfYmF2YWlsLCBzLmZfYnNpemUpLAorCQkJCWJsb2Nrc19wZXJjZW50X3VzZWQsIG1vdW50X3BvaW50KTsKKyNlbmRpZgorCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9kaXJuYW1lLmMgYi9jb3JldXRpbHMvZGlybmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMTA2N2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvZGlybmFtZS5jCkBAIC0wLDAgKzEsMzMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgZGlybmFtZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudCAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9kaXJuYW1lLmh0bWwgKi8KKworLy91c2FnZTojZGVmaW5lIGRpcm5hbWVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkZJTEVOQU1FIgorLy91c2FnZTojZGVmaW5lIGRpcm5hbWVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTdHJpcCBub24tZGlyZWN0b3J5IHN1ZmZpeCBmcm9tIEZJTEVOQU1FIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBkaXJuYW1lX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGRpcm5hbWUgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICIvdG1wXG4iCisvL3VzYWdlOiAgICAgICAiJCBkaXJuYW1lIC90bXAvZm9vL1xuIgorLy91c2FnZTogICAgICAgIi90bXBcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0ZPUksgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK2ludCBkaXJuYW1lX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBkaXJuYW1lX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlwdXRzKGRpcm5hbWUoc2luZ2xlX2FyZ3YoYXJndikpKTsKKwlyZXR1cm4gZmZsdXNoX2FsbCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2RvczJ1bml4LmMgYi9jb3JldXRpbHMvZG9zMnVuaXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzM5OGJkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL2RvczJ1bml4LmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGRvczJ1bml4IGZvciBCdXN5Qm94CisgKgorICogZG9zMnVuaXggJ1xuJyBjb252ZXJ0b3IgMC41LjAKKyAqIGJhc2VkIG9uIFVuaXgyRG9zIDAuOS4wIGJ5IFBldGVyIEhhbmVjYWsgKG1hZGUgMTkuMi4xOTk3KQorICogQ29weXJpZ2h0IDE5OTcsLi4gYnkgUGV0ZXIgSGFuZWNhayA8aGFuZWNha0BtZWdhbG9tYW4uc2s+LgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBkb3MydW5peCBmaWx0ZXJzIHJlYWRpbmcgaW5wdXQgZnJvbSBzdGRpbiBhbmQgd3JpdGluZyBvdXRwdXQgdG8gc3Rkb3V0LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisqLworCisvL3VzYWdlOiNkZWZpbmUgZG9zMnVuaXhfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstdWRdIFtGSUxFXSIKKy8vdXNhZ2U6I2RlZmluZSBkb3MydW5peF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbnZlcnQgRklMRSBpbi1wbGFjZSBmcm9tIERPUyB0byBVbml4IGZvcm1hdC5cbiIKKy8vdXNhZ2U6ICAgICAgICJXaGVuIG5vIGZpbGUgaXMgZ2l2ZW4sIHVzZSBzdGRpbi9zdGRvdXQuXG4iCisvL3VzYWdlOiAgICAgIlxuCS11CWRvczJ1bml4IgorLy91c2FnZTogICAgICJcbgktZAl1bml4MmRvcyIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdW5peDJkb3NfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstdWRdIFtGSUxFXSIKKy8vdXNhZ2U6I2RlZmluZSB1bml4MmRvc19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbnZlcnQgRklMRSBpbi1wbGFjZSBmcm9tIFVuaXggdG8gRE9TIGZvcm1hdC5cbiIKKy8vdXNhZ2U6ICAgICAgICJXaGVuIG5vIGZpbGUgaXMgZ2l2ZW4sIHVzZSBzdGRpbi9zdGRvdXQuXG4iCisvL3VzYWdlOiAgICAgIlxuCS11CWRvczJ1bml4IgorLy91c2FnZTogICAgICJcbgktZAl1bml4MmRvcyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK2VudW0geworCUNUX1VOSVgyRE9TID0gMSwKKwlDVF9ET1MyVU5JWAorfTsKKworLyogaWYgZm4gaXMgTlVMTCB0aGVuIGlucHV0IGlzIHN0ZGluIGFuZCBvdXRwdXQgaXMgc3Rkb3V0ICovCitzdGF0aWMgdm9pZCBjb252ZXJ0KGNoYXIgKmZuLCBpbnQgY29udl90eXBlKQoreworCUZJTEUgKmluLCAqb3V0OworCWludCBpOworCWNoYXIgKnRlbXBfZm4gPSB0ZW1wX2ZuOyAvKiBmb3IgY29tcGlsZXIgKi8KKwljaGFyICpyZXNvbHZlZF9mbiA9IHJlc29sdmVkX2ZuOworCisJaW4gPSBzdGRpbjsKKwlvdXQgPSBzdGRvdXQ7CisJaWYgKGZuICE9IE5VTEwpIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisKKwkJcmVzb2x2ZWRfZm4gPSB4bWFsbG9jX2ZvbGxvd19zeW1saW5rcyhmbik7CisJCWlmIChyZXNvbHZlZF9mbiA9PSBOVUxMKQorCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShmbik7CisJCWluID0geGZvcGVuX2Zvcl9yZWFkKHJlc29sdmVkX2ZuKTsKKwkJZnN0YXQoZmlsZW5vKGluKSwgJnN0KTsKKworCQl0ZW1wX2ZuID0geGFzcHJpbnRmKCIlc1hYWFhYWCIsIHJlc29sdmVkX2ZuKTsKKwkJaSA9IHhta3N0ZW1wKHRlbXBfZm4pOworCQlpZiAoZmNobW9kKGksIHN0LnN0X21vZGUpID09IC0xKQorCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZSh0ZW1wX2ZuKTsKKworCQlvdXQgPSB4ZmRvcGVuX2Zvcl93cml0ZShpKTsKKwl9CisKKwl3aGlsZSAoKGkgPSBmZ2V0YyhpbikpICE9IEVPRikgeworCQlpZiAoaSA9PSAnXHInKQorCQkJY29udGludWU7CisJCWlmIChpID09ICdcbicpCisJCQlpZiAoY29udl90eXBlID09IENUX1VOSVgyRE9TKQorCQkJCWZwdXRjKCdccicsIG91dCk7CisJCWZwdXRjKGksIG91dCk7CisJfQorCisJaWYgKGZuICE9IE5VTEwpIHsKKwkJaWYgKGZjbG9zZShpbikgPCAwIHx8IGZjbG9zZShvdXQpIDwgMCkgeworCQkJdW5saW5rKHRlbXBfZm4pOworCQkJYmJfcGVycm9yX25vbXNnX2FuZF9kaWUoKTsKKwkJfQorCQl4cmVuYW1lKHRlbXBfZm4sIHJlc29sdmVkX2ZuKTsKKwkJZnJlZSh0ZW1wX2ZuKTsKKwkJZnJlZShyZXNvbHZlZF9mbik7CisJfQorfQorCitpbnQgZG9zMnVuaXhfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGRvczJ1bml4X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgbywgY29udl90eXBlOworCisJLyogU2VlIGlmIHdlIGFyZSBzdXBwb3NlZCB0byBiZSBkb2luZyBkb3MydW5peCBvciB1bml4MmRvcyAqLworCWNvbnZfdHlwZSA9IENUX1VOSVgyRE9TOworCWlmIChhcHBsZXRfbmFtZVswXSA9PSAnZCcpIHsKKwkJY29udl90eXBlID0gQ1RfRE9TMlVOSVg7CisJfQorCisJLyogLXUgY29udmVydCB0byB1bml4LCAtZCBjb252ZXJ0IHRvIGRvcyAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gInUtLWQ6ZC0tdSI7IC8qIG11dHVhbGx5IGV4Y2x1c2l2ZSAqLworCW8gPSBnZXRvcHQzMihhcmd2LCAiZHUiKTsKKworCS8qIERvIHRoZSBjb252ZXJzaW9uIHJlcXVlc3RlZCBieSBhbiBhcmd1bWVudCBlbHNlIGRvIHRoZSBkZWZhdWx0CisJICogY29udmVyc2lvbiBkZXBlbmRpbmcgb24gb3VyIG5hbWUuICAqLworCWlmIChvKQorCQljb252X3R5cGUgPSBvOworCisJYXJndiArPSBvcHRpbmQ7CisJZG8geworCQkvKiBtaWdodCBiZSBjb252ZXJ0KE5VTEwpIGlmIHRoZXJlIGlzIG5vIGZpbGVuYW1lIGdpdmVuICovCisJCWNvbnZlcnQoKmFyZ3YsIGNvbnZfdHlwZSk7CisJfSB3aGlsZSAoKmFyZ3YgJiYgKisrYXJndik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9kdS5jIGIvY29yZXV0aWxzL2R1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM2ZmY4OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9kdS5jCkBAIC0wLDAgKzEsMjcyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGR1IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSBieSBMaW5lbywgaW5jLiBhbmQgSm9obiBCZXBwdQorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSBieSBKb2huIEJlcHB1IDxiZXBwdUBjb2RlcG9ldC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgIEVkd2FyZCBCZXR0cyA8ZWR3YXJkQGRlYmlhbi5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKHVubGVzcyBkZWZhdWx0IGJsb2Nrc2l6ZSBzZXQgdG8gMWspICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2R1Lmh0bWwgKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBNb3N0bHkgcmV3cml0dGVuIGZvciBTVVN2MyBjb21wbGlhbmNlIGFuZCB0byBmaXggYnVncy9kZWZlY3RzLgorICogMSkgQWRkZWQgc3VwcG9ydCBmb3IgU1VTdjMgLWEsIC1ILCAtTCwgZ251IC1jLCBhbmQgKGJ1c3lib3gpIC1kIG9wdGlvbnMuCisgKiAgICBUaGUgLWQgb3B0aW9uIGFsbG93cyBzZXR0aW5nIG9mIG1heCBkZXB0aCAoc2ltaWxhciB0byBnbnUgLS1tYXgtZGVwdGgpLgorICogMikgRml4ZWQgaW5jb3JyZWN0IHNpemUgY2FsY3VsYXRpb25zIGZvciBsaW5rcyBhbmQgZGlyZWN0b3JpZXMsIGVzcGVjaWFsbHkKKyAqICAgIHdoZW4gZXJyb3JzIG9jY3VycmVkLiAgQ2FsY3VsYXRlcyBzaXplcyBzaG91bGQgbm93IG1hdGNoIGdudSBkdSBvdXRwdXQuCisgKiAzKSBBZGRlZCBlcnJvciBjaGVja2luZyBvZiBvdXRwdXQuCisgKiA0KSBGaXhlZCBidXN5Ym94IGJ1ZyAjMTI4NCBpbnZvbHZpbmcgbG9uZyBvdmVyZmxvdyB3aXRoIGh1bWFuX3JlYWRhYmxlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBkdV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hSExkY2xzeCIgSUZfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRSgiaG0iKSAia10gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGR1X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU3VtbWFyaXplIGRpc2sgc3BhY2UgdXNlZCBmb3IgZWFjaCBGSUxFIGFuZC9vciBkaXJlY3RvcnlcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJU2hvdyBmaWxlIHNpemVzIHRvbyIKKy8vdXNhZ2U6ICAgICAiXG4JLUwJRm9sbG93IGFsbCBzeW1saW5rcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUgJRm9sbG93IHN5bWxpbmtzIG9uIGNvbW1hbmQgbGluZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWQgTglMaW1pdCBvdXRwdXQgdG8gZGlyZWN0b3JpZXMgKGFuZCBmaWxlcyB3aXRoIC1hKSBvZiBkZXB0aCA8IE4iCisvL3VzYWdlOiAgICAgIlxuCS1jCVNob3cgZ3JhbmQgdG90YWwiCisvL3VzYWdlOiAgICAgIlxuCS1sCUNvdW50IHNpemVzIG1hbnkgdGltZXMgaWYgaGFyZCBsaW5rZWQiCisvL3VzYWdlOiAgICAgIlxuCS1zCURpc3BsYXkgb25seSBhIHRvdGFsIGZvciBlYWNoIGFyZ3VtZW50IgorLy91c2FnZTogICAgICJcbgkteAlTa2lwIGRpcmVjdG9yaWVzIG9uIGRpZmZlcmVudCBmaWxlc3lzdGVtcyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUoCisvL3VzYWdlOiAgICAgIlxuCS1oCVNpemVzIGluIGh1bWFuIHJlYWRhYmxlIGZvcm1hdCAoZS5nLiwgMUsgMjQzTSAyRykiCisvL3VzYWdlOiAgICAgIlxuCS1tCVNpemVzIGluIG1lZ2FieXRlcyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLWsJU2l6ZXMgaW4ga2lsb2J5dGVzIiBJRl9GRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLKCIgKGRlZmF1bHQpIikKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLKAorLy91c2FnZTogICAgICJcbgkJRGVmYXVsdCB1bml0IGlzIDUxMiBieXRlcyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZHVfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgZHVcbiIKKy8vdXNhZ2U6ICAgICAgICIxNiAgICAgIC4vQ1ZTXG4iCisvL3VzYWdlOiAgICAgICAiMTIgICAgICAuL2tlcm5lbC1wYXRjaGVzL0NWU1xuIgorLy91c2FnZTogICAgICAgIjgwICAgICAgLi9rZXJuZWwtcGF0Y2hlc1xuIgorLy91c2FnZTogICAgICAgIjEyICAgICAgLi90ZXN0cy9DVlNcbiIKKy8vdXNhZ2U6ICAgICAgICIzNiAgICAgIC4vdGVzdHNcbiIKKy8vdXNhZ2U6ICAgICAgICIxMiAgICAgIC4vc2NyaXB0cy9DVlNcbiIKKy8vdXNhZ2U6ICAgICAgICIxNiAgICAgIC4vc2NyaXB0c1xuIgorLy91c2FnZTogICAgICAgIjEyICAgICAgLi9kb2NzL0NWU1xuIgorLy91c2FnZTogICAgICAgIjEwNCAgICAgLi9kb2NzXG4iCisvL3VzYWdlOiAgICAgICAiMjQxNyAgICAuXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitlbnVtIHsKKwlPUFRfYV9maWxlc190b28gICAgPSAoMSA8PCAwKSwKKwlPUFRfSF9mb2xsb3dfbGlua3MgPSAoMSA8PCAxKSwKKwlPUFRfa19rYnl0ZXMgICAgICAgPSAoMSA8PCAyKSwKKwlPUFRfTF9mb2xsb3dfbGlua3MgPSAoMSA8PCAzKSwKKwlPUFRfc190b3RhbF9ub3JlY3Vyc2UgPSAoMSA8PCA0KSwKKwlPUFRfeF9vbmVfRlMgICAgICAgPSAoMSA8PCA1KSwKKwlPUFRfZF9tYXhkZXB0aCAgICAgPSAoMSA8PCA2KSwKKwlPUFRfbF9oYXJkbGlua3MgICAgPSAoMSA8PCA3KSwKKwlPUFRfY190b3RhbCAgICAgICAgPSAoMSA8PCA4KSwKKwlPUFRfaF9mb3JfaHVtYW5zICAgPSAoMSA8PCA5KSwKKwlPUFRfbV9tYnl0ZXMgICAgICAgPSAoMSA8PCAxMCksCit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUKKwl1bnNpZ25lZCBsb25nIGRpc3BfaHI7CisjZWxzZQorCXVuc2lnbmVkIGRpc3BfazsKKyNlbmRpZgorCWludCBtYXhfcHJpbnRfZGVwdGg7CisJYm9vbCBzdGF0dXM7CisJaW50IHNsaW5rX2RlcHRoOworCWludCBkdV9kZXB0aDsKKwlkZXZfdCBkaXJfZGV2OworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyB9IHdoaWxlICgwKQorCisKKy8qIEZJWE1FPyBjb3JldXRpbHMnIGR1IHJvdW5kcyBzaXplcyB1cDoKKyAqIGZvciBleGFtcGxlLCAgMTAyNWsgZmlsZSBpcyBzaG93biBhcyAiMiIgYnkgZHUgLW0uCisgKiBXZSByb3VuZCB0byBuZWFyZXN0LgorICovCitzdGF0aWMgdm9pZCBwcmludCh1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZSwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJLyogVE9ETyAtIE1heSBub3Qgd2FudCB0byBkZWZlciBlcnJvciBjaGVja2luZyBoZXJlLiAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0hVTUFOX1JFQURBQkxFCisJcHJpbnRmKCIlc1x0JXNcbiIsCisJCQkvKiBzaXplIHggNTEyIC8gRy5kaXNwX2hyLCBzaG93IG9uZSBmcmFjdGlvbmFsLAorCQkJICogdXNlIHN1ZmZpeGVzIGlmIEcuZGlzcF9ociA9PSAwICovCisJCQltYWtlX2h1bWFuX3JlYWRhYmxlX3N0cihzaXplLCA1MTIsIEcuZGlzcF9ociksCisJCQlmaWxlbmFtZSk7CisjZWxzZQorCWlmIChHLmRpc3BfaykgeworCQlzaXplKys7CisJCXNpemUgPj49IDE7CisJfQorCXByaW50ZigiJWxsdVx0JXNcbiIsIHNpemUsIGZpbGVuYW1lKTsKKyNlbmRpZgorfQorCisvKiB0aW55IHJlY3Vyc2l2ZSBkdSAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBkdShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCXVuc2lnbmVkIGxvbmcgbG9uZyBzdW07CisKKwlpZiAobHN0YXQoZmlsZW5hbWUsICZzdGF0YnVmKSAhPSAwKSB7CisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZpbGVuYW1lKTsKKwkJRy5zdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCXJldHVybiAwOworCX0KKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX3hfb25lX0ZTKSB7CisJCWlmIChHLmR1X2RlcHRoID09IDApIHsKKwkJCUcuZGlyX2RldiA9IHN0YXRidWYuc3RfZGV2OworCQl9IGVsc2UgaWYgKEcuZGlyX2RldiAhPSBzdGF0YnVmLnN0X2RldikgeworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlzdW0gPSBzdGF0YnVmLnN0X2Jsb2NrczsKKworCWlmIChTX0lTTE5LKHN0YXRidWYuc3RfbW9kZSkpIHsKKwkJaWYgKEcuc2xpbmtfZGVwdGggPiBHLmR1X2RlcHRoKSB7IC8qIC1IIG9yIC1MICovCisJCQlpZiAoc3RhdChmaWxlbmFtZSwgJnN0YXRidWYpICE9IDApIHsKKwkJCQliYl9zaW1wbGVfcGVycm9yX21zZyhmaWxlbmFtZSk7CisJCQkJRy5zdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlzdW0gPSBzdGF0YnVmLnN0X2Jsb2NrczsKKwkJCWlmIChHLnNsaW5rX2RlcHRoID09IDEpIHsKKwkJCQkvKiBDb252ZXJ0IC1IIHRvIC1MICovCisJCQkJRy5zbGlua19kZXB0aCA9IElOVF9NQVg7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX2xfaGFyZGxpbmtzKQorCSAmJiBzdGF0YnVmLnN0X25saW5rID4gMQorCSkgeworCQkvKiBBZGQgZmlsZXMvZGlyZWN0b3JpZXMgd2l0aCBsaW5rcyBvbmx5IG9uY2UgKi8KKwkJaWYgKGlzX2luX2lub19kZXZfaGFzaHRhYmxlKCZzdGF0YnVmKSkgeworCQkJcmV0dXJuIDA7CisJCX0KKwkJYWRkX3RvX2lub19kZXZfaGFzaHRhYmxlKCZzdGF0YnVmLCBOVUxMKTsKKwl9CisKKwlpZiAoU19JU0RJUihzdGF0YnVmLnN0X21vZGUpKSB7CisJCURJUiAqZGlyOworCQlzdHJ1Y3QgZGlyZW50ICplbnRyeTsKKwkJY2hhciAqbmV3ZmlsZTsKKworCQlkaXIgPSB3YXJuX29wZW5kaXIoZmlsZW5hbWUpOworCQlpZiAoIWRpcikgeworCQkJRy5zdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCQlyZXR1cm4gc3VtOworCQl9CisKKwkJd2hpbGUgKChlbnRyeSA9IHJlYWRkaXIoZGlyKSkpIHsKKwkJCW5ld2ZpbGUgPSBjb25jYXRfc3VicGF0aF9maWxlKGZpbGVuYW1lLCBlbnRyeS0+ZF9uYW1lKTsKKwkJCWlmIChuZXdmaWxlID09IE5VTEwpCisJCQkJY29udGludWU7CisJCQkrK0cuZHVfZGVwdGg7CisJCQlzdW0gKz0gZHUobmV3ZmlsZSk7CisJCQktLUcuZHVfZGVwdGg7CisJCQlmcmVlKG5ld2ZpbGUpOworCQl9CisJCWNsb3NlZGlyKGRpcik7CisJfSBlbHNlIHsKKwkJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9hX2ZpbGVzX3RvbykgJiYgRy5kdV9kZXB0aCAhPSAwKQorCQkJcmV0dXJuIHN1bTsKKwl9CisJaWYgKEcuZHVfZGVwdGggPD0gRy5tYXhfcHJpbnRfZGVwdGgpIHsKKwkJcHJpbnQoc3VtLCBmaWxlbmFtZSk7CisJfQorCXJldHVybiBzdW07Cit9CisKK2ludCBkdV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZHVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB0b3RhbDsKKwlpbnQgc2xpbmtfZGVwdGhfc2F2ZTsKKwl1bnNpZ25lZCBvcHQ7CisKKwlJTklUX0coKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0hVTUFOX1JFQURBQkxFCisJSUZfRkVBVFVSRV9EVV9ERUZBVUxUX0JMT0NLU0laRV8xSyhHLmRpc3BfaHIgPSAxMDI0OykKKwlJRl9OT1RfRkVBVFVSRV9EVV9ERUZBVUxUX0JMT0NLU0laRV8xSyhHLmRpc3BfaHIgPSA1MTI7KQorCWlmIChnZXRlbnYoIlBPU0lYTFlfQ09SUkVDVCIpKSAgLyogVE9ETyAtIGEgbmV3IGxpYmJiIGZ1bmN0aW9uPyAqLworCQlHLmRpc3BfaHIgPSA1MTI7CisjZWxzZQorCUlGX0ZFQVRVUkVfRFVfREVGQVVMVF9CTE9DS1NJWkVfMUsoRy5kaXNwX2sgPSAxOykKKwkvKiBJRl9OT1RfRkVBVFVSRV9EVV9ERUZBVUxUX0JMT0NLU0laRV8xSyhHLmRpc3BfayA9IDA7KSAtIEcgaXMgcHJlLXplcm9lZCAqLworI2VuZGlmCisJRy5tYXhfcHJpbnRfZGVwdGggPSBJTlRfTUFYOworCisJLyogTm90ZTogU1VTdjMgc3BlY2lmaWVzIHRoYXQgLWEgYW5kIC1zIG9wdGlvbnMgY2Fubm90IGJlIHVzZWQgdG9nZXRoZXIKKwkgKiBpbiBzdHJpY3RseSBjb25mb3JtaW5nIGFwcGxpY2F0aW9ucy4gIEhvd2V2ZXIsIGl0IGFsc28gc2F5cyB0aGF0IHNvbWUKKwkgKiBkdSBpbXBsZW1lbnRhdGlvbnMgbWF5IHByb2R1Y2Ugb3V0cHV0IHdoZW4gLWEgYW5kIC1zIGFyZSB1c2VkIHRvZ2V0aGVyLgorCSAqIGdudSBkdSBleGl0cyB3aXRoIGFuIGVycm9yIGNvZGUgaW4gdGhpcyBjYXNlLiAgV2UgY2hvb3NlIHRvIHNpbXBseQorCSAqIGlnbm9yZSAtYS4gIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIC1zIGJlaW5nIGVxdWl2YWxlbnQgdG8gLWQgMC4KKwkgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9IVU1BTl9SRUFEQUJMRQorCW9wdF9jb21wbGVtZW50YXJ5ID0gImgta206ay1obTptLWhrOkgtTDpMLUg6cy1kOmQtczpkKyI7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImFIa0xzeCIgImQ6IiAibGMiICJobSIsICZHLm1heF9wcmludF9kZXB0aCk7CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKG9wdCAmIE9QVF9oX2Zvcl9odW1hbnMpIHsKKwkJRy5kaXNwX2hyID0gMDsKKwl9CisJaWYgKG9wdCAmIE9QVF9tX21ieXRlcykgeworCQlHLmRpc3BfaHIgPSAxMDI0KjEwMjQ7CisJfQorCWlmIChvcHQgJiBPUFRfa19rYnl0ZXMpIHsKKwkJRy5kaXNwX2hyID0gMTAyNDsKKwl9CisjZWxzZQorCW9wdF9jb21wbGVtZW50YXJ5ID0gIkgtTDpMLUg6cy1kOmQtczpkKyI7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImFIa0xzeCIgImQ6IiAibGMiLCAmRy5tYXhfcHJpbnRfZGVwdGgpOworCWFyZ3YgKz0gb3B0aW5kOworI2lmICFFTkFCTEVfRkVBVFVSRV9EVV9ERUZBVUxUX0JMT0NLU0laRV8xSworCWlmIChvcHQgJiBPUFRfa19rYnl0ZXMpIHsKKwkJRy5kaXNwX2sgPSAxOworCX0KKyNlbmRpZgorI2VuZGlmCisJaWYgKG9wdCAmIE9QVF9IX2ZvbGxvd19saW5rcykgeworCQlHLnNsaW5rX2RlcHRoID0gMTsKKwl9CisJaWYgKG9wdCAmIE9QVF9MX2ZvbGxvd19saW5rcykgeworCQlHLnNsaW5rX2RlcHRoID0gSU5UX01BWDsKKwl9CisJaWYgKG9wdCAmIE9QVF9zX3RvdGFsX25vcmVjdXJzZSkgeworCQlHLm1heF9wcmludF9kZXB0aCA9IDA7CisJfQorCisJLyogZ28gdGhyb3VnaCByZW1haW5pbmcgYXJncyAoaWYgYW55KSAqLworCWlmICghKmFyZ3YpIHsKKwkJKi0tYXJndiA9IChjaGFyKikiLiI7CisJCWlmIChHLnNsaW5rX2RlcHRoID09IDEpIHsKKwkJCUcuc2xpbmtfZGVwdGggPSAwOworCQl9CisJfQorCisJc2xpbmtfZGVwdGhfc2F2ZSA9IEcuc2xpbmtfZGVwdGg7CisJdG90YWwgPSAwOworCWRvIHsKKwkJdG90YWwgKz0gZHUoKmFyZ3YpOworCQkvKiBvdGhlcndpc2UgZHUgL2RpciAvZGlyIHdvbid0IHNob3cgL2RpciB0d2ljZTogKi8KKwkJcmVzZXRfaW5vX2Rldl9oYXNodGFibGUoKTsKKwkJRy5zbGlua19kZXB0aCA9IHNsaW5rX2RlcHRoX3NhdmU7CisJfSB3aGlsZSAoKisrYXJndik7CisKKwlpZiAob3B0ICYgT1BUX2NfdG90YWwpCisJCXByaW50KHRvdGFsLCAidG90YWwiKTsKKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRy5zdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2VjaG8uYyBiL2NvcmV1dGlscy9lY2hvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM0MTc0NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9lY2hvLmMKQEAgLTAsMCArMSwzMzIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGVjaG8gaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogT3JpZ2luYWwgY29weXJpZ2h0IG5vdGljZSBpcyByZXRhaW5lZCBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgLS0gdW5sZXNzIGNvbmZpZ3VyZWQgYXMgZmFuY3kgZWNoby4gKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvZWNoby5odG1sICovCisKKy8qIE1hciAxNiwgMjAwMyAgICAgIE1hbnVlbCBOb3ZvYSBJSUkgICAobWpuM0Bjb2RlcG9ldC5vcmcpCisgKgorICogQmVjYXVzZSBvZiBiZWhhdmlvcmFsIGRpZmZlcmVuY2VzLCBpbXBsZW1lbnRlZCBjb25maWd1cmFibGUgU1VTdjMKKyAqIG9yICdmYW5jeScgZ251LWlzaCBiZWhhdmlvcnMuICBBbHNvLCByZWR1Y2VkIHNpemUgYW5kIGZpeGVkIGJ1Z3MuCisgKiAxKSBJbiBoYW5kbGluZyAnXGMnIGVzY2FwZSwgdGhlIHByZXZpb3VzIHZlcnNpb24gb25seSBzdXBwcmVzc2VkIHRoZQorICogICAgIHRyYWlsaW5nIG5ld2xpbmUuICBTVVN2MyBzcGVjaWZpZXMgX25vXyBvdXRwdXQgYWZ0ZXIgJ1xjJy4KKyAqIDIpIFNVU3YzIHNwZWNpZmllcyB0aGF0IG9jdGFsIGVzY2FwZXMgYXJlIG9mIHRoZSBmb3JtIFwweyN7I3sjfX19LgorICogICAgVGhlIHByZXZpb3VzIHZlcnNpb24gZGlkIG5vdCBhbGxvdyA0LWRpZ2l0IG9jdGFscy4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZWNob190cml2aWFsX3VzYWdlCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZBTkNZX0VDSE8oIlstbmVFXSAiKSAiW0FSR10uLi4iCisvL3VzYWdlOiNkZWZpbmUgZWNob19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IHRoZSBzcGVjaWZpZWQgQVJHcyB0byBzdGRvdXQiCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZBTkNZX0VDSE8oICJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JU3VwcHJlc3MgdHJhaWxpbmcgbmV3bGluZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWUJSW50ZXJwcmV0IGJhY2tzbGFzaCBlc2NhcGVzIChpLmUuLCBcXHQ9dGFiKSIKKy8vdXNhZ2U6ICAgICAiXG4JLUUJRG9uJ3QgaW50ZXJwcmV0IGJhY2tzbGFzaCBlc2NhcGVzIChkZWZhdWx0KSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZWNob19leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBlY2hvIFwiRXJpayBpcyBjb29sXCJcbiIKKy8vdXNhZ2U6ICAgICAgICJFcmlrIGlzIGNvb2xcbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRkFOQ1lfRUNITygiJCBlY2hvIC1lIFwiRXJpa1xcbmlzXFxuY29vbFwiXG4iCisvL3VzYWdlOiAgICAgICAiRXJpa1xuIgorLy91c2FnZTogICAgICAgImlzXG4iCisvL3VzYWdlOiAgICAgICAiY29vbFxuIgorLy91c2FnZTogICAgICAgIiQgZWNobyBcIkVyaWtcXG5pc1xcbmNvb2xcIlxuIgorLy91c2FnZTogICAgICAgIkVyaWtcXG5pc1xcbmNvb2xcbiIpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCisvKiBOQjogY2FuIGJlIHVzZWQgYnkgc2hlbGwgZXZlbiBpZiBub3QgZW5hYmxlZCBhcyBhcHBsZXQgKi8KKworLyoKKyAqIE5CMjogd2UgZG9uJ3QgdXNlIHN0ZGlvLCB3ZSBuZWVkIGJldHRlciBlcnJvciBoYW5kaW5nLgorICogRXhhbXBsZXMgaW5jbHVkZSB3cml0aW5nIGludG8gbm9uLW9wZW5lZCBzdGRvdXQgYW5kIGVycm9yIG9uIHdyaXRlLgorICoKKyAqIFdpdGggc3RkaW8sIG91dHB1dCBnZXRzIHNob3ZlbGVkIGludG8gc3Rkb3V0IGJ1ZmZlciwgYW5kIGV2ZW4KKyAqIGZmbHVzaCBjYW5ub3QgY2xlYXIgaXQgb3V0LiBJdCBzZWVtcyB0aGF0IGV2ZW4gaWYgbGliYyByZWNlaXZlcworICogRUJBREYgb24gd3JpdGUgYXR0ZW1wdHMsIGl0IGZlZWxzIGRldGVybWluZWQgdG8gb3V0cHV0IGRhdGEgbm8gbWF0dGVyIHdoYXQuCisgKiBJZiBlY2hvIGlzIGNhbGxlZCBieSBzaGVsbCwgaXQgd2lsbCB0cnkgd3JpdGluZyBhZ2FpbiBsYXRlciwgYW5kIHBvc3NpYmx5CisgKiB3aWxsIGNsb2JiZXIgZnV0dXJlIG91dHB1dC4gTm90IGdvb2QuCisgKgorICogU29sYXJpcyBoYXMgZnB1cmdlIHdoaWNoIGRpc2NhcmRzIGJ1ZmZlcmVkIGlucHV0LiBnbGliYyBoYXMgX19mcHVyZ2UuCisgKiBCdXQgdGhpcyBmdW5jdGlvbiBpcyBub3Qgc3RhbmRhcmQuCisgKi8KKworaW50IGVjaG9fbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKipwcDsKKwljb25zdCBjaGFyICphcmc7CisJY2hhciAqb3V0OworCWNoYXIgKmJ1ZmZlcjsKKwl1bnNpZ25lZCBidWZsZW47CisjaWYgIUVOQUJMRV9GRUFUVVJFX0ZBTkNZX0VDSE8KKwllbnVtIHsKKwkJZWZsYWcgPSAwLCAgLyogMCAtLSBkaXNhYmxlIGVzY2FwZSBzZXF1ZW5jZXMgKi8KKwkJbmZsYWcgPSAxLCAgLyogMSAtLSBwcmludCAnXG4nICovCisJfTsKKworCWFyZ3YrKzsKKyNlbHNlCisJY2hhciBuZmxhZyA9IDE7CisJY2hhciBlZmxhZyA9IDA7CisKKwl3aGlsZSAoKGFyZyA9ICorK2FyZ3YpICE9IE5VTEwpIHsKKwkJY2hhciBuLCBlOworCisJCWlmIChhcmdbMF0gIT0gJy0nKQorCQkJYnJlYWs7IC8qIG5vdCBhbiBvcHRpb24gYXJnLCBlY2hvIGl0ICovCisKKwkJLyogSWYgaXQgYXBwZWFycyB0aGF0IHdlIGFyZSBoYW5kbGluZyBvcHRpb25zLCB0aGVuIG1ha2Ugc3VyZQorCQkgKiB0aGF0IGFsbCBvZiB0aGUgb3B0aW9ucyBzcGVjaWZpZWQgYXJlIGFjdHVhbGx5IHZhbGlkLgorCQkgKiBPdGhlcndpc2UsIHRoZSBzdHJpbmcgc2hvdWxkIGp1c3QgYmUgZWNob2VkLgorCQkgKi8KKwkJYXJnKys7CisJCW4gPSBuZmxhZzsKKwkJZSA9IGVmbGFnOworCQlkbyB7CisJCQlpZiAoKmFyZyA9PSAnbicpCisJCQkJbiA9IDA7CisJCQllbHNlIGlmICgqYXJnID09ICdlJykKKwkJCQllID0gJ1xcJzsKKwkJCWVsc2UgaWYgKCphcmcgIT0gJ0UnKSB7CisJCQkJLyogIi1jY2MiIGFyZyB3aXRoIG9uZSBvZiBjJ3MgaW52YWxpZCwgZWNobyBpdCAqLworCQkJCS8qIGFyZyBjb25zaXN0aW5nIGZyb20ganVzdCAiLSIgYWxzbyBoYW5kbGVkIGhlcmUgKi8KKwkJCQlnb3RvIGp1c3RfZWNobzsKKwkJCX0KKwkJfSB3aGlsZSAoKisrYXJnKTsKKwkJbmZsYWcgPSBuOworCQllZmxhZyA9IGU7CisJfQorIGp1c3RfZWNobzoKKyNlbmRpZgorCisJYnVmbGVuID0gMDsKKwlwcCA9IGFyZ3Y7CisJd2hpbGUgKChhcmcgPSAqcHApICE9IE5VTEwpIHsKKwkJYnVmbGVuICs9IHN0cmxlbihhcmcpICsgMTsKKwkJcHArKzsKKwl9CisJb3V0ID0gYnVmZmVyID0geG1hbGxvYyhidWZsZW4gKyAxKTsgLyogKzEgaXMgbmVlZGVkIGZvciAibm8gYXJncyIgY2FzZSAqLworCisJd2hpbGUgKChhcmcgPSAqYXJndikgIT0gTlVMTCkgeworCQlpbnQgYzsKKworCQlpZiAoIWVmbGFnKSB7CisJCQkvKiBvcHRpbWl6YXRpb24gZm9yIHZlcnkgY29tbW9uIGNhc2UgKi8KKwkJCW91dCA9IHN0cGNweShvdXQsIGFyZyk7CisJCX0gZWxzZQorCQl3aGlsZSAoKGMgPSAqYXJnKyspICE9ICdcMCcpIHsKKwkJCWlmIChjID09IGVmbGFnKSB7CisJCQkJLyogVGhpcyBpcyBhbiAiXHgiIHNlcXVlbmNlICovCisKKwkJCQlpZiAoKmFyZyA9PSAnYycpIHsKKwkJCQkJLyogIlxjIiBtZWFucyBjYW5jZWwgbmV3bGluZSBhbmQKKwkJCQkJICogaWdub3JlIGFsbCBzdWJzZXF1ZW50IGNoYXJzLiAqLworCQkJCQlnb3RvIGRvX3dyaXRlOworCQkJCX0KKwkJCQkvKiBTaW5jZSBTVVN2MyBtYW5kYXRlcyBhIGZpcnN0IGRpZ2l0IG9mIDAsIDQtZGlnaXQgb2N0YWxzCisJCQkJKiBvZiB0aGUgZm9ybSBcMCMjIyBhcmUgYWNjZXB0ZWQuICovCisJCQkJaWYgKCphcmcgPT0gJzAnKSB7CisJCQkJCWlmICgodW5zaWduZWQgY2hhcikoYXJnWzFdIC0gJzAnKSA8IDgpIHsKKwkJCQkJCS8qIDJuZCBjaGFyIGlzIDAuLjc6IHNraXAgbGVhZGluZyAnMCcgKi8KKwkJCQkJCWFyZysrOworCQkJCQl9CisJCQkJfQorCQkJCS8qIGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlIGhhbmRsZXMgTlVMIGNvcnJlY3RseQorCQkJCSAqICgiLi4uXCIgY2FzZSkuICovCisJCQkJeworCQkJCQkvKiBvcHRpbWl6YXRpb246IGRvbid0IGZvcmNlIGFyZyB0byBiZSBvbi1zdGFjaywKKwkJCQkJICogdXNlIGFub3RoZXIgdmFyaWFibGUgZm9yIHRoYXQuIH4zMCBieXRlcyB3aW4gKi8KKwkJCQkJY29uc3QgY2hhciAqeiA9IGFyZzsKKwkJCQkJYyA9IGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlKCZ6KTsKKwkJCQkJYXJnID0gejsKKwkJCQl9CisJCQl9CisJCQkqb3V0KysgPSBjOworCQl9CisKKwkJaWYgKCEqKythcmd2KQorCQkJYnJlYWs7CisJCSpvdXQrKyA9ICcgJzsKKwl9CisKKwlpZiAobmZsYWcpIHsKKwkJKm91dCsrID0gJ1xuJzsKKwl9CisKKyBkb193cml0ZToKKwkvKiBDYXJlZnVsIHRvIGVycm9yIG91dCBvbiBwYXJ0aWFsIHdyaXRlcyB0b28gKHRoaW5rIEVOT1NQQyEpICovCisJZXJybm8gPSAwOworCS8qciA9Ki8gZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBidWZmZXIsIG91dCAtIGJ1ZmZlcik7CisJZnJlZShidWZmZXIpOworCWlmICgvKldST05HOnIgPCAwKi8gZXJybm8pIHsKKwkJYmJfcGVycm9yX21zZyhiYl9tc2dfd3JpdGVfZXJyb3IpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5OTEsIDE5OTMKKyAqCVRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogMy4gPEJTRCBBZHZlcnRpc2luZyBDbGF1c2Ugb21pdHRlZCBwZXIgdGhlIEp1bHkgMjIsIDE5OTkgbGljZW5zaW5nIGNoYW5nZQorICoJCWZ0cDovL2Z0cC5jcy5iZXJrZWxleS5lZHUvcHViLzRic2QvUkVBRE1FLkltcHQuTGljZW5zZS5DaGFuZ2U+CisgKgorICoJQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqCUAoIyllY2hvLmMJOC4xIChCZXJrZWxleSkgNS8zMS85MworICovCisKKyNpZmRlZiBWRVJTSU9OX1dJVEhfV1JJVEVWCisvKiBXZSBjYW4ndCB1c2Ugc3RkaW8uCisgKiBUaGUgcmVhc29uIGZvciB0aGlzIGlzIGhpZ2hseSBub24tb2J2aW91cy4KKyAqIGVjaG9fbWFpbiBpcyB1c2VkIGZyb20gc2hlbGwuIFNoZWxsIG11c3QgY29ycmVjdGx5IGhhbmRsZSAiZWNobyBmb28iCisgKiBpZiBzdGRvdXQgaXMgY2xvc2VkLiBXaXRoIHN0ZGlvLCBvdXRwdXQgZ2V0cyBzaG92ZWxlZCBpbnRvCisgKiBzdGRvdXQgYnVmZmVyLCBhbmQgZXZlbiBmZmx1c2ggY2Fubm90IGNsZWFyIGl0IG91dC4gSXQgc2VlbXMgdGhhdAorICogZXZlbiBpZiBsaWJjIHJlY2VpdmVzIEVCQURGIG9uIHdyaXRlIGF0dGVtcHRzLCBpdCBmZWVscyBkZXRlcm1pbmVkCisgKiB0byBvdXRwdXQgZGF0YSBubyBtYXR0ZXIgd2hhdC4gU28gaXQgd2lsbCB0cnkgbGF0ZXIsCisgKiBhbmQgcG9zc2libHkgd2lsbCBjbG9iYmVyIGZ1dHVyZSBvdXRwdXQuIE5vdCBnb29kLgorICoKKyAqIFVzaW5nIHdyaXRldiBpbnN0ZWFkLCB3aXRoICdkaXJlY3QnIGNvbnZlcnNpb24gb2YgYXJndiB2ZWN0b3IuCisgKi8KKworaW50IGVjaG9fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGlvdmVjIGlvW2FyZ2NdOworCXN0cnVjdCBpb3ZlYyAqY3VyX2lvID0gaW87CisJY2hhciAqYXJnOworCWNoYXIgKnA7CisjaWYgIUVOQUJMRV9GRUFUVVJFX0ZBTkNZX0VDSE8KKwllbnVtIHsKKwkJZWZsYWcgPSAnXFwnLAorCQluZmxhZyA9IDEsICAvKiAxIC0tIHByaW50ICdcbicgKi8KKwl9OworCWFyZyA9ICorK2FyZ3Y7CisJaWYgKCFhcmcpCisJCWdvdG8gbmV3bGluZV9yZXQ7CisjZWxzZQorCWNoYXIgbmZsYWcgPSAxOworCWNoYXIgZWZsYWcgPSAwOworCisJd2hpbGUgKDEpIHsKKwkJYXJnID0gKisrYXJndjsKKwkJaWYgKCFhcmcpCisJCQlnb3RvIG5ld2xpbmVfcmV0OworCQlpZiAoKmFyZyAhPSAnLScpCisJCQlicmVhazsKKworCQkvKiBJZiBpdCBhcHBlYXJzIHRoYXQgd2UgYXJlIGhhbmRsaW5nIG9wdGlvbnMsIHRoZW4gbWFrZSBzdXJlCisJCSAqIHRoYXQgYWxsIG9mIHRoZSBvcHRpb25zIHNwZWNpZmllZCBhcmUgYWN0dWFsbHkgdmFsaWQuCisJCSAqIE90aGVyd2lzZSwgdGhlIHN0cmluZyBzaG91bGQganVzdCBiZSBlY2hvZWQuCisJCSAqLworCQlwID0gYXJnICsgMTsKKwkJaWYgKCEqcCkJLyogQSBzaW5nbGUgJy0nLCBzbyBlY2hvIGl0LiAqLworCQkJZ290byBqdXN0X2VjaG87CisKKwkJZG8geworCQkJaWYgKCFzdHJjaHIoIm5lRSIsICpwKSkKKwkJCQlnb3RvIGp1c3RfZWNobzsKKwkJfSB3aGlsZSAoKisrcCk7CisKKwkJLyogQWxsIG9mIHRoZSBvcHRpb25zIGluIHRoaXMgYXJnIGFyZSB2YWxpZCwgc28gaGFuZGxlIHRoZW0uICovCisJCXAgPSBhcmcgKyAxOworCQlkbyB7CisJCQlpZiAoKnAgPT0gJ24nKQorCQkJCW5mbGFnID0gMDsKKwkJCWlmICgqcCA9PSAnZScpCisJCQkJZWZsYWcgPSAnXFwnOworCQl9IHdoaWxlICgqKytwKTsKKwl9CisganVzdF9lY2hvOgorI2VuZGlmCisKKwl3aGlsZSAoMSkgeworCQkvKiBhcmcgaXMgYWxyZWFkeSA9PSAqYXJndiBhbmQgaXNuJ3QgTlVMTCAqLworCQlpbnQgYzsKKworCQljdXJfaW8tPmlvdl9iYXNlID0gcCA9IGFyZzsKKworCQlpZiAoIWVmbGFnKSB7CisJCQkvKiBvcHRpbWl6YXRpb24gZm9yIHZlcnkgY29tbW9uIGNhc2UgKi8KKwkJCXAgKz0gc3RybGVuKGFyZyk7CisJCX0gZWxzZSB3aGlsZSAoKGMgPSAqYXJnKyspKSB7CisJCQlpZiAoYyA9PSBlZmxhZykgeworCQkJCS8qIFRoaXMgaXMgYW4gIlx4IiBzZXF1ZW5jZSAqLworCisJCQkJaWYgKCphcmcgPT0gJ2MnKSB7CisJCQkJCS8qICJcYyIgbWVhbnMgY2FuY2VsIG5ld2xpbmUgYW5kCisJCQkJCSAqIGlnbm9yZSBhbGwgc3Vic2VxdWVudCBjaGFycy4gKi8KKwkJCQkJY3VyX2lvLT5pb3ZfbGVuID0gcCAtIChjaGFyKiljdXJfaW8tPmlvdl9iYXNlOworCQkJCQljdXJfaW8rKzsKKwkJCQkJZ290byByZXQ7CisJCQkJfQorCQkJCS8qIFNpbmNlIFNVU3YzIG1hbmRhdGVzIGEgZmlyc3QgZGlnaXQgb2YgMCwgNC1kaWdpdCBvY3RhbHMKKwkJCQkqIG9mIHRoZSBmb3JtIFwwIyMjIGFyZSBhY2NlcHRlZC4gKi8KKwkJCQlpZiAoKmFyZyA9PSAnMCcgJiYgKHVuc2lnbmVkIGNoYXIpKGFyZ1sxXSAtICcwJykgPCA4KSB7CisJCQkJCWFyZysrOworCQkJCX0KKwkJCQkvKiBiYl9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZSBjYW4gaGFuZGxlIG51bCBjb3JyZWN0bHkgKi8KKwkJCQljID0gYmJfcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UoICh2b2lkKikgJmFyZyk7CisJCQl9CisJCQkqcCsrID0gYzsKKwkJfQorCisJCWFyZyA9ICorK2FyZ3Y7CisJCWlmIChhcmcpCisJCQkqcCsrID0gJyAnOworCQljdXJfaW8tPmlvdl9sZW4gPSBwIC0gKGNoYXIqKWN1cl9pby0+aW92X2Jhc2U7CisJCWN1cl9pbysrOworCQlpZiAoIWFyZykKKwkJCWJyZWFrOworCX0KKworIG5ld2xpbmVfcmV0OgorCWlmIChuZmxhZykgeworCQljdXJfaW8tPmlvdl9iYXNlID0gKGNoYXIqKSJcbiI7CisJCWN1cl9pby0+aW92X2xlbiA9IDE7CisJCWN1cl9pbysrOworCX0KKyByZXQ6CisJLyogVE9ETzogaW1wbGVtZW50IGFuZCB1c2UgZnVsbF93cml0ZXY/ICovCisJcmV0dXJuIHdyaXRldigxLCBpbywgKGN1cl9pbyAtIGlvKSkgPj0gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2Vudi5jIGIvY29yZXV0aWxzL2Vudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwN2VmMTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvZW52LmMKQEAgLTAsMCArMSwxMzIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGVudiBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk5MywgMTk5NAorICogVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgbm90aWNlIGlzIHJldGFpbmVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorICoKKyAqIE1vZGlmaWVkIGZvciBCdXN5Qm94IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvZW52Lmh0bWwgKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBGaXhlZCBidWcgaW52b2x2aW5nIGV4aXQgcmV0dXJuIGNvZGVzIGlmIGV4ZWN2cCBmYWlscy4gIEFsc28gYWRkZWQKKyAqIG91dHB1dCBlcnJvciBjaGVja2luZy4KKyAqLworCisvKgorICogTW9kaWZpZWQgYnkgVmxhZGltaXIgT2xleW5payA8ZHpvQHNpbXRyZWFzLnJ1PiAoQykgMjAwMworICogLSBjb3JyZWN0ICItIiBvcHRpb24gdXNhZ2UKKyAqIC0gbXVsdGlwbGUgIi11IHVuc2V0ZW52IiBzdXBwb3J0CisgKiAtIEdOVSBsb25nIG9wdGlvbiBzdXBwb3J0CisgKiAtIHVzZSB4ZnVuY19lcnJvcl9yZXR2YWwKKyAqLworCisvKiBUaGlzIGlzIGEgTk9FWEVDIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCisvL3VzYWdlOiNkZWZpbmUgZW52X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWl1XSBbLV0gW25hbWU9dmFsdWVdLi4uIFtQUk9HIEFSR1NdIgorLy91c2FnZTojZGVmaW5lIGVudl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IHRoZSBjdXJyZW50IGVudmlyb25tZW50IG9yIHJ1biBQUk9HIGFmdGVyIHNldHRpbmcgdXBcbiIKKy8vdXNhZ2U6ICAgICAgICJ0aGUgc3BlY2lmaWVkIGVudmlyb25tZW50XG4iCisvL3VzYWdlOiAgICAgIlxuCS0sIC1pCVN0YXJ0IHdpdGggYW4gZW1wdHkgZW52aXJvbm1lbnQiCisvL3VzYWdlOiAgICAgIlxuCS11CVJlbW92ZSB2YXJpYWJsZSBmcm9tIHRoZSBlbnZpcm9ubWVudCIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9FTlZfTE9OR19PUFRJT05TCitzdGF0aWMgY29uc3QgY2hhciBlbnZfbG9uZ29wdHNbXSBBTElHTjEgPQorCSJpZ25vcmUtZW52aXJvbm1lbnRcMCIgTm9fYXJndW1lbnQgICAgICAgImkiCisJInVuc2V0XDAiICAgICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAidSIKKwk7CisjZW5kaWYKKworaW50IGVudl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZW52X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHRzOworCWxsaXN0X3QgKnVuc2V0X2VudiA9IE5VTEw7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJ1OjoiOworI2lmIEVOQUJMRV9GRUFUVVJFX0VOVl9MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gZW52X2xvbmdvcHRzOworI2VuZGlmCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICIraXU6IiwgJnVuc2V0X2Vudik7CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKGFyZ3ZbMF0gJiYgTE9ORV9EQVNIKGFyZ3ZbMF0pKSB7CisJCW9wdHMgfD0gMTsKKwkJKythcmd2OworCX0KKwlpZiAob3B0cyAmIDEpIHsKKwkJY2xlYXJlbnYoKTsKKwl9CisJd2hpbGUgKHVuc2V0X2VudikgeworCQljaGFyICp2YXIgPSBsbGlzdF9wb3AoJnVuc2V0X2Vudik7CisJCS8qIFRoaXMgZG9lcyBub3QgaGFuZGxlIC11VkFSPVZBTAorCQkgKiAoY29yZXV0aWxzIF9zZXRzXyB0aGUgdmFyaWFibGUgaW4gdGhhdCBjYXNlKTogKi8KKwkJLyp1bnNldGVudih2YXIpOyovCisJCS8qIFRoaXMgZG9lcywgYnV0IHVzZXMgc29tZXdoYW4gdW5kb2N1bWVudGVkIGZlYXR1cmUgdGhhdAorCQkgKiBwdXRlbnYoIm5hbWVfd2l0aG91dF9lcXVhbF9zaWduIikgdW5zZXRzIHRoZSB2YXJpYWJsZTogKi8KKwkJcHV0ZW52KHZhcik7CisJfQorCisJd2hpbGUgKCphcmd2ICYmIChzdHJjaHIoKmFyZ3YsICc9JykgIT0gTlVMTCkpIHsKKwkJaWYgKHB1dGVudigqYXJndikgPCAwKSB7CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInB1dGVudiIpOworCQl9CisJCSsrYXJndjsKKwl9CisKKwlpZiAoYXJndlswXSkgeworCQlCQl9FWEVDVlBfb3JfZGllKGFyZ3YpOworCX0KKworCWlmIChlbnZpcm9uKSB7IC8qIGNsZWFyZW52KCkgbWF5IHNldCBlbnZpcm9uID09IE5VTEwhICovCisJCWNoYXIgKiplcDsKKwkJZm9yIChlcCA9IGVudmlyb247ICplcDsgZXArKykgeworCQkJcHV0cygqZXApOworCQl9CisJfQorCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChFWElUX1NVQ0NFU1MpOworfQorCisvKgorICogQ29weXJpZ2h0IChjKSAxOTg4LCAxOTkzLCAxOTk0CisgKiAgICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEJTRCBBZHZlcnRpc2luZyBDbGF1c2Ugb21pdHRlZCBwZXIgdGhlIEp1bHkgMjIsIDE5OTkgbGljZW5zaW5nIGNoYW5nZQorICogICAgZnRwOi8vZnRwLmNzLmJlcmtlbGV5LmVkdS9wdWIvNGJzZC9SRUFETUUuSW1wdC5MaWNlbnNlLkNoYW5nZQorICoKKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9leHBhbmQuYyBiL2NvcmV1dGlscy9leHBhbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDM3NmZmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL2V4cGFuZC5jCkBAIC0wLDAgKzEsMjI2IEBACisvKiBleHBhbmQgLSBjb252ZXJ0IHRhYnMgdG8gc3BhY2VzCisgKiB1bmV4cGFuZCAtIGNvbnZlcnQgc3BhY2VzIHRvIHRhYnMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDg5LCA5MSwgMTk5NS0yMDA2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogRGF2aWQgTWFjS2VuemllIDxkam1AZ251LmFpLm1pdC5lZHU+CisgKgorICogT3B0aW9ucyBmb3IgZXhwYW5kOgorICogLXQgbnVtICAtLXRhYnM9TlVNICAgICAgQ29udmVydCB0YWJzIHRvIG51bSBzcGFjZXMgKGRlZmF1bHQgOCBzcGFjZXMpLgorICogLWkgICAgICAtLWluaXRpYWwgICAgICAgT25seSBjb252ZXJ0IGluaXRpYWwgdGFicyBvbiBlYWNoIGxpbmUgdG8gc3BhY2VzLgorICoKKyAqIE9wdGlvbnMgZm9yIHVuZXhwYW5kOgorICogLWEgICAgICAtLWFsbCAgICAgICAgICAgQ29udmVydCBhbGwgYmxhbmtzLCBpbnN0ZWFkIG9mIGp1c3QgaW5pdGlhbCBibGFua3MuCisgKiAtZiAgICAgIC0tZmlyc3Qtb25seSAgICBDb252ZXJ0IG9ubHkgbGVhZGluZyBzZXF1ZW5jZXMgb2YgYmxhbmtzIChkZWZhdWx0KS4KKyAqIC10IG51bSAgLS10YWJzPU5VTSAgICAgIEhhdmUgdGFicyBudW0gY2hhcmFjdGVycyBhcGFydCBpbnN0ZWFkIG9mIDguCisgKgorICogIEJ1c3lib3ggdmVyc2lvbiAoQykgMjAwNyBieSBUaXRvIFJhZ3VzYSA8ZmFybWF0aXRvQHRpc2NhbGkuaXQ+CisgKgorICogIENhdmVhdDogdGhpcyB2ZXJzaW9ucyBvZiBleHBhbmQgYW5kIHVuZXhwYW5kIGRvbid0IGFjY2VwdCB0YWIgbGlzdHMuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGV4cGFuZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1pXSBbLXQgTl0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGV4cGFuZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbnZlcnQgdGFicyB0byBzcGFjZXMsIHdyaXRpbmcgdG8gc3Rkb3V0XG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX0VYUEFORF9MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgIlxuCS1pLC0taW5pdGlhbAlEb24ndCBjb252ZXJ0IHRhYnMgYWZ0ZXIgbm9uIGJsYW5rcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXQsLS10YWJzPU4JVGFic3RvcHMgZXZlcnkgTiBjaGFycyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFX0VYUEFORF9MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgIlxuCS1pCURvbid0IGNvbnZlcnQgdGFicyBhZnRlciBub24gYmxhbmtzIgorLy91c2FnZTogICAgICJcbgktdAlUYWJzdG9wcyBldmVyeSBOIGNoYXJzIgorLy91c2FnZToJKQorCisvL3VzYWdlOiNkZWZpbmUgdW5leHBhbmRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZmFdWy10IE5dIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSB1bmV4cGFuZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbnZlcnQgc3BhY2VzIHRvIHRhYnMsIHdyaXRpbmcgdG8gc3Rkb3V0XG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX1VORVhQQU5EX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG4JLWEsLS1hbGwJQ29udmVydCBhbGwgYmxhbmtzIgorLy91c2FnZTogICAgICJcbgktZiwtLWZpcnN0LW9ubHkJQ29udmVydCBvbmx5IGxlYWRpbmcgYmxhbmtzIgorLy91c2FnZTogICAgICJcbgktdCwtLXRhYnM9TglUYWJzdG9wcyBldmVyeSBOIGNoYXJzIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfVU5FWFBBTkRfTE9OR19PUFRJT05TKAorLy91c2FnZTogICAgICJcbgktYQlDb252ZXJ0IGFsbCBibGFua3MiCisvL3VzYWdlOiAgICAgIlxuCS1mCUNvbnZlcnQgb25seSBsZWFkaW5nIGJsYW5rcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXQgTglUYWJzdG9wcyBldmVyeSBOIGNoYXJzIgorLy91c2FnZToJKQorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ1bmljb2RlLmgiCisKK2VudW0geworCU9QVF9JTklUSUFMICAgICA9IDEgPDwgMCwKKwlPUFRfVEFCUyAgICAgICAgPSAxIDw8IDEsCisJT1BUX0FMTCAgICAgICAgID0gMSA8PCAyLAorfTsKKworI2lmIEVOQUJMRV9FWFBBTkQKK3N0YXRpYyB2b2lkIGV4cGFuZChGSUxFICpmaWxlLCB1bnNpZ25lZCB0YWJfc2l6ZSwgdW5zaWduZWQgb3B0KQoreworCWNoYXIgKmxpbmU7CisKKwl3aGlsZSAoKGxpbmUgPSB4bWFsbG9jX2ZnZXRzKGZpbGUpKSAhPSBOVUxMKSB7CisJCXVuc2lnbmVkIGNoYXIgYzsKKwkJY2hhciAqcHRyOworCQljaGFyICpwdHJfc3RyYmVnOworCisJCXB0ciA9IHB0cl9zdHJiZWcgPSBsaW5lOworCQl3aGlsZSAoKGMgPSAqcHRyKSAhPSAnXDAnKSB7CisJCQlpZiAoKG9wdCAmIE9QVF9JTklUSUFMKSAmJiAhaXNibGFuayhjKSkgeworCQkJCS8qIG5vdCBzcGFjZSBvciB0YWIgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChjID09ICdcdCcpIHsKKwkJCQl1bnNpZ25lZCBsZW47CisJCQkJKnB0ciA9ICdcMCc7CisjIGlmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwkJCQlsZW4gPSB1bmljb2RlX3N0cndpZHRoKHB0cl9zdHJiZWcpOworIyBlbHNlCisJCQkJbGVuID0gcHRyIC0gcHRyX3N0cmJlZzsKKyMgZW5kaWYKKwkJCQlsZW4gPSB0YWJfc2l6ZSAtIChsZW4gJSB0YWJfc2l6ZSk7CisJCQkJLyp3aGlsZSAocHRyWzFdID09ICdcdCcpIHsgcHRyKys7IGxlbiArPSB0YWJfc2l6ZTsgfSAtIGNhbiBoYW5kbGUgbWFueSB0YWJzIGF0IG9uY2UgKi8KKwkJCQlwcmludGYoIiVzJSpzIiwgcHRyX3N0cmJlZywgbGVuLCAiIik7CisJCQkJcHRyX3N0cmJlZyA9IHB0ciArIDE7CisJCQl9CisJCQlwdHIrKzsKKwkJfQorCQlmcHV0cyhwdHJfc3RyYmVnLCBzdGRvdXQpOworCQlmcmVlKGxpbmUpOworCX0KK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX1VORVhQQU5ECitzdGF0aWMgdm9pZCB1bmV4cGFuZChGSUxFICpmaWxlLCB1bnNpZ25lZCB0YWJfc2l6ZSwgdW5zaWduZWQgb3B0KQoreworCWNoYXIgKmxpbmU7CisKKwl3aGlsZSAoKGxpbmUgPSB4bWFsbG9jX2ZnZXRzKGZpbGUpKSAhPSBOVUxMKSB7CisJCWNoYXIgKnB0ciA9IGxpbmU7CisJCXVuc2lnbmVkIGNvbHVtbiA9IDA7CisKKwkJd2hpbGUgKCpwdHIpIHsKKwkJCXVuc2lnbmVkIG47CisJCQl1bnNpZ25lZCBsZW4gPSAwOworCisJCQl3aGlsZSAoKnB0ciA9PSAnICcpIHsKKwkJCQlwdHIrKzsKKwkJCQlsZW4rKzsKKwkJCX0KKwkJCWNvbHVtbiArPSBsZW47CisJCQlpZiAoKnB0ciA9PSAnXHQnKSB7CisJCQkJY29sdW1uICs9IHRhYl9zaXplIC0gKGNvbHVtbiAlIHRhYl9zaXplKTsKKwkJCQlwdHIrKzsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJbiA9IGNvbHVtbiAvIHRhYl9zaXplOworCQkJaWYgKG4pIHsKKwkJCQlsZW4gPSBjb2x1bW4gPSBjb2x1bW4gJSB0YWJfc2l6ZTsKKwkJCQl3aGlsZSAobi0tKQorCQkJCQlwdXRjaGFyKCdcdCcpOworCQkJfQorCisJCQlpZiAoKG9wdCAmIE9QVF9JTklUSUFMKSAmJiBwdHIgIT0gbGluZSkgeworCQkJCXByaW50ZigiJSpzJXMiLCBsZW4sICIiLCBwdHIpOworCQkJCWJyZWFrOworCQkJfQorCQkJbiA9IHN0cmNzcG4ocHRyLCAiXHQgIik7CisJCQlwcmludGYoIiUqcyUuKnMiLCBsZW4sICIiLCBuLCBwdHIpOworIyBpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisJCQl7CisJCQkJY2hhciBjID0gcHRyW25dOworCQkJCXB0cltuXSA9ICdcMCc7CisJCQkJbGVuID0gdW5pY29kZV9zdHJ3aWR0aChwdHIpOworCQkJCXB0cltuXSA9IGM7CisJCQl9CisjIGVsc2UKKwkJCWxlbiA9IG47CisjIGVuZGlmCisJCQlwdHIgKz0gbjsKKwkJCWNvbHVtbiA9IChjb2x1bW4gKyBsZW4pICUgdGFiX3NpemU7CisJCX0KKwkJZnJlZShsaW5lKTsKKwl9Cit9CisjZW5kaWYKKworaW50IGV4cGFuZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZXhwYW5kX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwkvKiBEZWZhdWx0IDggc3BhY2VzIGZvciAxIHRhYiAqLworCWNvbnN0IGNoYXIgKm9wdF90ID0gIjgiOworCUZJTEUgKmZpbGU7CisJdW5zaWduZWQgdGFiX3NpemU7CisJdW5zaWduZWQgb3B0OworCWludCBleGl0X3N0YXR1cyA9IEVYSVRfU1VDQ0VTUzsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0VYUEFORF9MT05HX09QVElPTlMKKwlzdGF0aWMgY29uc3QgY2hhciBleHBhbmRfbG9uZ29wdHNbXSBBTElHTjEgPQorCQkvKiBuYW1lLCBoYXNfYXJnLCB2YWwgKi8KKwkJImluaXRpYWxcMCIgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImkiCisJCSJ0YWJzXDAiICAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ0IgorCTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1VORVhQQU5EX0xPTkdfT1BUSU9OUworCXN0YXRpYyBjb25zdCBjaGFyIHVuZXhwYW5kX2xvbmdvcHRzW10gQUxJR04xID0KKwkJLyogbmFtZSwgaGFzX2FyZywgdmFsICovCisJCSJmaXJzdC1vbmx5XDAiICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJpIgorCQkidGFic1wwIiAgICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAidCIKKwkJImFsbFwwIiAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImEiCisJOworI2VuZGlmCisJaW5pdF91bmljb2RlKCk7CisKKwlpZiAoRU5BQkxFX0VYUEFORCAmJiAoIUVOQUJMRV9VTkVYUEFORCB8fCBhcHBsZXRfbmFtZVswXSA9PSAnZScpKSB7CisJCUlGX0ZFQVRVUkVfRVhQQU5EX0xPTkdfT1BUSU9OUyhhcHBsZXRfbG9uZ19vcHRpb25zID0gZXhwYW5kX2xvbmdvcHRzKTsKKwkJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIml0OiIsICZvcHRfdCk7CisJfSBlbHNlIHsKKwkJSUZfRkVBVFVSRV9VTkVYUEFORF9MT05HX09QVElPTlMoYXBwbGV0X2xvbmdfb3B0aW9ucyA9IHVuZXhwYW5kX2xvbmdvcHRzKTsKKwkJLyogLXQgTlVNIHNldHMgYWxzbyAtYSAqLworCQlvcHRfY29tcGxlbWVudGFyeSA9ICJ0YSI7CisJCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJmdDphIiwgJm9wdF90KTsKKwkJLyogLWYgLS1maXJzdC1vbmx5IGlzIHRoZSBkZWZhdWx0ICovCisJCWlmICghKG9wdCAmIE9QVF9BTEwpKSBvcHQgfD0gT1BUX0lOSVRJQUw7CisJfQorCXRhYl9zaXplID0geGF0b3VfcmFuZ2Uob3B0X3QsIDEsIFVJTlRfTUFYKTsKKworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKCEqYXJndikgeworCQkqLS1hcmd2ID0gKGNoYXIqKWJiX21zZ19zdGFuZGFyZF9pbnB1dDsKKwl9CisJZG8geworCQlmaWxlID0gZm9wZW5fb3Jfd2Fybl9zdGRpbigqYXJndik7CisJCWlmICghZmlsZSkgeworCQkJZXhpdF9zdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChFTkFCTEVfRVhQQU5EICYmICghRU5BQkxFX1VORVhQQU5EIHx8IGFwcGxldF9uYW1lWzBdID09ICdlJykpCisJCQlJRl9FWFBBTkQoZXhwYW5kKGZpbGUsIHRhYl9zaXplLCBvcHQpKTsKKwkJZWxzZQorCQkJSUZfVU5FWFBBTkQodW5leHBhbmQoZmlsZSwgdGFiX3NpemUsIG9wdCkpOworCisJCS8qIENoZWNrIGFuZCBjbG9zZSB0aGUgZmlsZSAqLworCQlpZiAoZmNsb3NlX2lmX25vdF9zdGRpbihmaWxlKSkgeworCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coKmFyZ3YpOworCQkJZXhpdF9zdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCX0KKwkJLyogSWYgc3RkaW4gYWxzbyBjbGVhciBFT0YgKi8KKwkJaWYgKGZpbGUgPT0gc3RkaW4pCisJCQljbGVhcmVycihmaWxlKTsKKwl9IHdoaWxlICgqKythcmd2KTsKKworCS8qIE5vdyBjbG9zZSBzdGRpbiBhbHNvICovCisJLyogKGlmIHdlIGRpZG4ndCByZWFkIGZyb20gaXQsIGl0J3MgYSBuby1vcCkgKi8KKwlpZiAoZmNsb3NlKHN0ZGluKSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKGJiX21zZ19zdGFuZGFyZF9pbnB1dCk7CisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KGV4aXRfc3RhdHVzKTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9leHByLmMgYi9jb3JldXRpbHMvZXhwci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ODZmOTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvZXhwci5jCkBAIC0wLDAgKzEsNTM4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGV4cHIgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBiYXNlZCBvbiBHTlUgZXhwciBNaWtlIFBhcmtlci4KKyAqIENvcHlyaWdodCAoQykgODYsIDE5OTEtMTk5NywgMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAqCisgKiBCdXN5Ym94IG1vZGlmaWNhdGlvbnMKKyAqIENvcHlyaWdodCAoYykgMjAwMCAgRWR3YXJkIEJldHRzIDxlZHdhcmRAZGViaWFuLm9yZz4uCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSAgVmxhZGltaXIgT2xleW5payA8ZHpvQHNpbXRyZWFzLnJ1PgorICogIC0gcmVkdWNlZCA0NjQgYnl0ZXMuCisgKiAgLSA2NCBtYXRoIHN1cHBvcnQKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIFRoaXMgcHJvZ3JhbSBldmFsdWF0ZXMgZXhwcmVzc2lvbnMuICBFYWNoIHRva2VuIChvcGVyYXRvciwgb3BlcmFuZCwKKyAqIHBhcmVudGhlc2lzKSBvZiB0aGUgZXhwcmVzc2lvbiBtdXN0IGJlIGEgc2VwYXJhdGUgYXJndW1lbnQuICBUaGUKKyAqIHBhcnNlciB1c2VkIGlzIGEgcmVhc29uYWJseSBnZW5lcmFsIG9uZSwgdGhvdWdoIGFueSBpbmNhcm5hdGlvbiBvZgorICogaXQgaXMgbGFuZ3VhZ2Utc3BlY2lmaWMuICBJdCBpcyBlc3BlY2lhbGx5IG5pY2UgZm9yIGV4cHJlc3Npb25zLgorICoKKyAqIE5vIHBhcnNlIHRyZWUgaXMgbmVlZGVkOyBhIG5ldyBub2RlIGlzIGV2YWx1YXRlZCBpbW1lZGlhdGVseS4KKyAqIE9uZSBmdW5jdGlvbiBjYW4gaGFuZGxlIG11bHRpcGxlIG9wZXJhdG9ycyBhbGwgb2YgZXF1YWwgcHJlY2VkZW5jZSwKKyAqIHByb3ZpZGVkIHRoZXkgYWxsIGFzc29jaWF0ZSAoKHggb3AgeCkgb3AgeCkuICovCisKKy8qIG5vIGdldG9wdCBuZWVkZWQgKi8KKworLy91c2FnZTojZGVmaW5lIGV4cHJfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkVYUFJFU1NJT04iCisvL3VzYWdlOiNkZWZpbmUgZXhwcl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IHRoZSB2YWx1ZSBvZiBFWFBSRVNTSU9OIHRvIHN0ZG91dFxuIgorLy91c2FnZTogICAgIlxuIgorLy91c2FnZTogICAgICAgIkVYUFJFU1NJT04gbWF5IGJlOlxuIgorLy91c2FnZTogICAgICAgIglBUkcxIHwgQVJHMglBUkcxIGlmIGl0IGlzIG5laXRoZXIgbnVsbCBub3IgMCwgb3RoZXJ3aXNlIEFSRzJcbiIKKy8vdXNhZ2U6ICAgICAgICIJQVJHMSAmIEFSRzIJQVJHMSBpZiBuZWl0aGVyIGFyZ3VtZW50IGlzIG51bGwgb3IgMCwgb3RoZXJ3aXNlIDBcbiIKKy8vdXNhZ2U6ICAgICAgICIJQVJHMSA8IEFSRzIJMSBpZiBBUkcxIGlzIGxlc3MgdGhhbiBBUkcyLCBlbHNlIDAuIFNpbWlsYXJseTpcbiIKKy8vdXNhZ2U6ICAgICAgICIJQVJHMSA8PSBBUkcyXG4iCisvL3VzYWdlOiAgICAgICAiCUFSRzEgPSBBUkcyXG4iCisvL3VzYWdlOiAgICAgICAiCUFSRzEgIT0gQVJHMlxuIgorLy91c2FnZTogICAgICAgIglBUkcxID49IEFSRzJcbiIKKy8vdXNhZ2U6ICAgICAgICIJQVJHMSA+IEFSRzJcbiIKKy8vdXNhZ2U6ICAgICAgICIJQVJHMSArIEFSRzIJU3VtIG9mIEFSRzEgYW5kIEFSRzIuIFNpbWlsYXJseTpcbiIKKy8vdXNhZ2U6ICAgICAgICIJQVJHMSAtIEFSRzJcbiIKKy8vdXNhZ2U6ICAgICAgICIJQVJHMSAqIEFSRzJcbiIKKy8vdXNhZ2U6ICAgICAgICIJQVJHMSAvIEFSRzJcbiIKKy8vdXNhZ2U6ICAgICAgICIJQVJHMSAlIEFSRzJcbiIKKy8vdXNhZ2U6ICAgICAgICIJU1RSSU5HIDogUkVHRVhQCQlBbmNob3JlZCBwYXR0ZXJuIG1hdGNoIG9mIFJFR0VYUCBpbiBTVFJJTkdcbiIKKy8vdXNhZ2U6ICAgICAgICIJbWF0Y2ggU1RSSU5HIFJFR0VYUAlTYW1lIGFzIFNUUklORyA6IFJFR0VYUFxuIgorLy91c2FnZTogICAgICAgIglzdWJzdHIgU1RSSU5HIFBPUyBMRU5HVEggU3Vic3RyaW5nIG9mIFNUUklORywgUE9TIGNvdW50ZWQgZnJvbSAxXG4iCisvL3VzYWdlOiAgICAgICAiCWluZGV4IFNUUklORyBDSEFSUwlJbmRleCBpbiBTVFJJTkcgd2hlcmUgYW55IENIQVJTIGlzIGZvdW5kLCBvciAwXG4iCisvL3VzYWdlOiAgICAgICAiCWxlbmd0aCBTVFJJTkcJCUxlbmd0aCBvZiBTVFJJTkdcbiIKKy8vdXNhZ2U6ICAgICAgICIJcXVvdGUgVE9LRU4JCUludGVycHJldCBUT0tFTiBhcyBhIHN0cmluZywgZXZlbiBpZlxuIgorLy91c2FnZTogICAgICAgIgkJCQlpdCBpcyBhIGtleXdvcmQgbGlrZSAnbWF0Y2gnIG9yIGFuXG4iCisvL3VzYWdlOiAgICAgICAiCQkJCW9wZXJhdG9yIGxpa2UgJy8nXG4iCisvL3VzYWdlOiAgICAgICAiCShFWFBSRVNTSU9OKQkJVmFsdWUgb2YgRVhQUkVTU0lPTlxuIgorLy91c2FnZTogICAgICAgIlxuIgorLy91c2FnZTogICAgICAgIkJld2FyZSB0aGF0IG1hbnkgb3BlcmF0b3JzIG5lZWQgdG8gYmUgZXNjYXBlZCBvciBxdW90ZWQgZm9yIHNoZWxscy5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb21wYXJpc29ucyBhcmUgYXJpdGhtZXRpYyBpZiBib3RoIEFSR3MgYXJlIG51bWJlcnMsIGVsc2VcbiIKKy8vdXNhZ2U6ICAgICAgICJsZXhpY29ncmFwaGljYWwuIFBhdHRlcm4gbWF0Y2hlcyByZXR1cm4gdGhlIHN0cmluZyBtYXRjaGVkIGJldHdlZW5cbiIKKy8vdXNhZ2U6ICAgICAgICJcXCggYW5kIFxcKSBvciBudWxsOyBpZiBcXCggYW5kIFxcKSBhcmUgbm90IHVzZWQsIHRoZXkgcmV0dXJuIHRoZSBudW1iZXJcbiIKKy8vdXNhZ2U6ICAgICAgICJvZiBjaGFyYWN0ZXJzIG1hdGNoZWQgb3IgMC4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInhyZWdleC5oIgorCisjaWYgRU5BQkxFX0VYUFJfTUFUSF9TVVBQT1JUXzY0Cit0eXBlZGVmIGludDY0X3QgYXJpdGhfdDsKKworI2RlZmluZSBQRl9SRVogICAgICAibGwiCisjZGVmaW5lIFBGX1JFWl9UWVBFIChsb25nIGxvbmcpCisjZGVmaW5lIFNUUlRPTChzLCBlLCBiKSBzdHJ0b2xsKHMsIGUsIGIpCisjZWxzZQordHlwZWRlZiBsb25nIGFyaXRoX3Q7CisKKyNkZWZpbmUgUEZfUkVaICAgICAgImwiCisjZGVmaW5lIFBGX1JFWl9UWVBFIChsb25nKQorI2RlZmluZSBTVFJUT0wocywgZSwgYikgc3RydG9sKHMsIGUsIGIpCisjZW5kaWYKKworLyogVE9ETzogdXNlIGJiX3N0cnRvbFtsXT8gSXQncyBlYXNpZXIgdG8gY2hlY2sgZm9yIGVycm9ycy4uLiAqLworCisvKiBUaGUga2luZHMgb2YgdmFsdWUgd2UgY2FuIGhhdmUuICAqLworZW51bSB7CisJSU5URUdFUiwKKwlTVFJJTkcKK307CisKKy8qIEEgdmFsdWUgaXMuLi4uICovCitzdHJ1Y3QgdmFsaW5mbyB7CisJc21hbGxpbnQgdHlwZTsgICAgICAgICAgICAgICAgICAvKiBXaGljaCBraW5kLiAqLworCXVuaW9uIHsgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIHZhbHVlIGl0c2VsZi4gKi8KKwkJYXJpdGhfdCBpOworCQljaGFyICpzOworCX0gdTsKK307Cit0eXBlZGVmIHN0cnVjdCB2YWxpbmZvIFZBTFVFOworCisvKiBUaGUgYXJndW1lbnRzIGdpdmVuIHRvIHRoZSBwcm9ncmFtLCBtaW51cyB0aGUgcHJvZ3JhbSBuYW1lLiAgKi8KK3N0cnVjdCBnbG9iYWxzIHsKKwljaGFyICoqYXJnczsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgfSB3aGlsZSAoMCkKKworLyogZm9yd2FyZCBkZWNsYXJhdGlvbnMgKi8KK3N0YXRpYyBWQUxVRSAqZXZhbCh2b2lkKTsKKworCisvKiBSZXR1cm4gYSBWQUxVRSBmb3IgSS4gICovCisKK3N0YXRpYyBWQUxVRSAqaW50X3ZhbHVlKGFyaXRoX3QgaSkKK3sKKwlWQUxVRSAqdjsKKworCXYgPSB4emFsbG9jKHNpemVvZihWQUxVRSkpOworCWlmIChJTlRFR0VSKSAvKiBvdGhlcndpc2UgeHphYWxvYyBkaWQgaXQgYWxyZWFkeSAqLworCQl2LT50eXBlID0gSU5URUdFUjsKKwl2LT51LmkgPSBpOworCXJldHVybiB2OworfQorCisvKiBSZXR1cm4gYSBWQUxVRSBmb3IgUy4gICovCisKK3N0YXRpYyBWQUxVRSAqc3RyX3ZhbHVlKGNvbnN0IGNoYXIgKnMpCit7CisJVkFMVUUgKnY7CisKKwl2ID0geHphbGxvYyhzaXplb2YoVkFMVUUpKTsKKwlpZiAoU1RSSU5HKSAvKiBvdGhlcndpc2UgeHphYWxvYyBkaWQgaXQgYWxyZWFkeSAqLworCQl2LT50eXBlID0gU1RSSU5HOworCXYtPnUucyA9IHhzdHJkdXAocyk7CisJcmV0dXJuIHY7Cit9CisKKy8qIEZyZWUgVkFMVUUgViwgaW5jbHVkaW5nIHN0cnVjdHVyZSBjb21wb25lbnRzLiAgKi8KKworc3RhdGljIHZvaWQgZnJlZXYoVkFMVUUgKnYpCit7CisJaWYgKHYtPnR5cGUgPT0gU1RSSU5HKQorCQlmcmVlKHYtPnUucyk7CisJZnJlZSh2KTsKK30KKworLyogUmV0dXJuIG5vbnplcm8gaWYgViBpcyBhIG51bGwtc3RyaW5nIG9yIHplcm8tbnVtYmVyLiAgKi8KKworc3RhdGljIGludCBudWxsKFZBTFVFICp2KQoreworCWlmICh2LT50eXBlID09IElOVEVHRVIpCisJCXJldHVybiB2LT51LmkgPT0gMDsKKwkvKiBTVFJJTkc6ICovCisJcmV0dXJuIHYtPnUuc1swXSA9PSAnXDAnIHx8IExPTkVfQ0hBUih2LT51LnMsICcwJyk7Cit9CisKKy8qIENvZXJjZSBWIHRvIGEgU1RSSU5HIHZhbHVlIChjYW4ndCBmYWlsKS4gICovCisKK3N0YXRpYyB2b2lkIHRvc3RyaW5nKFZBTFVFICp2KQoreworCWlmICh2LT50eXBlID09IElOVEVHRVIpIHsKKwkJdi0+dS5zID0geGFzcHJpbnRmKCIlIiBQRl9SRVogImQiLCBQRl9SRVpfVFlQRSB2LT51LmkpOworCQl2LT50eXBlID0gU1RSSU5HOworCX0KK30KKworLyogQ29lcmNlIFYgdG8gYW4gSU5URUdFUiB2YWx1ZS4gIFJldHVybiAxIG9uIHN1Y2Nlc3MsIDAgb24gZmFpbHVyZS4gICovCisKK3N0YXRpYyBib29sIHRvYXJpdGgoVkFMVUUgKnYpCit7CisJaWYgKHYtPnR5cGUgPT0gU1RSSU5HKSB7CisJCWFyaXRoX3QgaTsKKwkJY2hhciAqZTsKKworCQkvKiBEb24ndCBpbnRlcnByZXQgdGhlIGVtcHR5IHN0cmluZyBhcyBhbiBpbnRlZ2VyLiAgKi8KKwkJLyogQ3VycmVudGx5IGRvZXMgbm90IHdvcnJ5IGFib3V0IG92ZXJmbG93IG9yIGludC9sb25nIGRpZmZlcmVuY2VzLiAqLworCQlpID0gU1RSVE9MKHYtPnUucywgJmUsIDEwKTsKKwkJaWYgKCh2LT51LnMgPT0gZSkgfHwgKmUpCisJCQlyZXR1cm4gMDsKKwkJZnJlZSh2LT51LnMpOworCQl2LT51LmkgPSBpOworCQl2LT50eXBlID0gSU5URUdFUjsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qIFJldHVybiBzdHJbMF0rc3RyWzFdIGlmIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgU1RSIGV4YWN0bHkuCisgICBTVFIgbXVzdCBub3QgYmUgTlVMTC4gICovCisKK3N0YXRpYyBpbnQgbmV4dGFyZyhjb25zdCBjaGFyICpzdHIpCit7CisJaWYgKCpHLmFyZ3MgPT0gTlVMTCB8fCBzdHJjbXAoKkcuYXJncywgc3RyKSAhPSAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKHVuc2lnbmVkIGNoYXIpc3RyWzBdICsgKHVuc2lnbmVkIGNoYXIpc3RyWzFdOworfQorCisvKiBUaGUgY29tcGFyaXNvbiBvcGVyYXRvciBoYW5kbGluZyBmdW5jdGlvbnMuICAqLworCitzdGF0aWMgaW50IGNtcF9jb21tb24oVkFMVUUgKmwsIFZBTFVFICpyLCBpbnQgb3ApCit7CisJYXJpdGhfdCBsbCwgcnI7CisKKwlsbCA9IGwtPnUuaTsKKwlyciA9IHItPnUuaTsKKwlpZiAobC0+dHlwZSA9PSBTVFJJTkcgfHwgci0+dHlwZSA9PSBTVFJJTkcpIHsKKwkJdG9zdHJpbmcobCk7CisJCXRvc3RyaW5nKHIpOworCQlsbCA9IHN0cmNtcChsLT51LnMsIHItPnUucyk7CisJCXJyID0gMDsKKwl9CisJLyogY2FsY3VsYXRpbmcgbGwgLSByciBhbmQgY2hlY2tpbmcgdGhlIHJlc3VsdCBpcyBwcm9uZSB0byBvdmVyZmxvd3MuCisJICogV2UnbGwgZG8gaXQgZGlmZmVyZW50bHk6ICovCisJaWYgKG9wID09ICc8JykKKwkJcmV0dXJuIGxsIDwgcnI7CisJaWYgKG9wID09ICgnPCcgKyAnPScpKQorCQlyZXR1cm4gbGwgPD0gcnI7CisJaWYgKG9wID09ICc9JyB8fCAob3AgPT0gJz0nICsgJz0nKSkKKwkJcmV0dXJuIGxsID09IHJyOworCWlmIChvcCA9PSAnIScgKyAnPScpCisJCXJldHVybiBsbCAhPSBycjsKKwlpZiAob3AgPT0gJz4nKQorCQlyZXR1cm4gbGwgPiBycjsKKwkvKiA+PSAqLworCXJldHVybiBsbCA+PSBycjsKK30KKworLyogVGhlIGFyaXRobWV0aWMgb3BlcmF0b3IgaGFuZGxpbmcgZnVuY3Rpb25zLiAgKi8KKworc3RhdGljIGFyaXRoX3QgYXJpdGhtZXRpY19jb21tb24oVkFMVUUgKmwsIFZBTFVFICpyLCBpbnQgb3ApCit7CisJYXJpdGhfdCBsaSwgcmk7CisKKwlpZiAoIXRvYXJpdGgobCkgfHwgIXRvYXJpdGgocikpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJub24tbnVtZXJpYyBhcmd1bWVudCIpOworCWxpID0gbC0+dS5pOworCXJpID0gci0+dS5pOworCWlmIChvcCA9PSAnKycpCisJCXJldHVybiBsaSArIHJpOworCWlmIChvcCA9PSAnLScpCisJCXJldHVybiBsaSAtIHJpOworCWlmIChvcCA9PSAnKicpCisJCXJldHVybiBsaSAqIHJpOworCWlmIChyaSA9PSAwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZGl2aXNpb24gYnkgemVybyIpOworCWlmIChvcCA9PSAnLycpCisJCXJldHVybiBsaSAvIHJpOworCXJldHVybiBsaSAlIHJpOworfQorCisvKiBEbyB0aGUgOiBvcGVyYXRvci4KKyAgIFNWIGlzIHRoZSBWQUxVRSBmb3IgdGhlIGxocyAodGhlIHN0cmluZyksCisgICBQViBpcyB0aGUgVkFMVUUgZm9yIHRoZSByaHMgKHRoZSBwYXR0ZXJuKS4gICovCisKK3N0YXRpYyBWQUxVRSAqZG9jb2xvbihWQUxVRSAqc3YsIFZBTFVFICpwdikKK3sKKwllbnVtIHsgTk1BVENIID0gMiB9OworCVZBTFVFICp2OworCXJlZ2V4X3QgcmVfYnVmZmVyOworCXJlZ21hdGNoX3QgcmVfcmVnc1tOTUFUQ0hdOworCisJdG9zdHJpbmcoc3YpOworCXRvc3RyaW5nKHB2KTsKKworCWlmIChwdi0+dS5zWzBdID09ICdeJykgeworCQliYl9lcnJvcl9tc2coCisid2FybmluZzogJyVzJzogdXNpbmcgJ14nIGFzIHRoZSBmaXJzdCBjaGFyYWN0ZXJcbiIKKyJvZiBhIGJhc2ljIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyBub3QgcG9ydGFibGU7IGl0IGlzIGlnbm9yZWQiLCBwdi0+dS5zKTsKKwl9CisKKwltZW1zZXQoJnJlX2J1ZmZlciwgMCwgc2l6ZW9mKHJlX2J1ZmZlcikpOworCW1lbXNldChyZV9yZWdzLCAwLCBzaXplb2YocmVfcmVncykpOworCXhyZWdjb21wKCZyZV9idWZmZXIsIHB2LT51LnMsIDApOworCisJLyogZXhwciB1c2VzIGFuIGFuY2hvcmVkIHBhdHRlcm4gbWF0Y2gsIHNvIGNoZWNrIHRoYXQgdGhlcmUgd2FzIGEKKwkgKiBtYXRjaCBhbmQgdGhhdCB0aGUgbWF0Y2ggc3RhcnRzIGF0IG9mZnNldCAwLiAqLworCWlmIChyZWdleGVjKCZyZV9idWZmZXIsIHN2LT51LnMsIE5NQVRDSCwgcmVfcmVncywgMCkgIT0gUkVHX05PTUFUQ0gKKwkgJiYgcmVfcmVnc1swXS5ybV9zbyA9PSAwCisJKSB7CisJCS8qIFdlcmUgXCguLi5cKSB1c2VkPyAqLworCQlpZiAocmVfYnVmZmVyLnJlX25zdWIgPiAwICYmIHJlX3JlZ3NbMV0ucm1fc28gPj0gMCkgeworCQkJc3YtPnUuc1tyZV9yZWdzWzFdLnJtX2VvXSA9ICdcMCc7CisJCQl2ID0gc3RyX3ZhbHVlKHN2LT51LnMgKyByZV9yZWdzWzFdLnJtX3NvKTsKKwkJfSBlbHNlIHsKKwkJCXYgPSBpbnRfdmFsdWUocmVfcmVnc1swXS5ybV9lbyk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBNYXRjaCBmYWlsZWQgLS0gcmV0dXJuIHRoZSByaWdodCBraW5kIG9mIG51bGwuICAqLworCQlpZiAocmVfYnVmZmVyLnJlX25zdWIgPiAwKQorCQkJdiA9IHN0cl92YWx1ZSgiIik7CisJCWVsc2UKKwkJCXYgPSBpbnRfdmFsdWUoMCk7CisJfQorCXJlZ2ZyZWUoJnJlX2J1ZmZlcik7CisJcmV0dXJuIHY7Cit9CisKKy8qIEhhbmRsZSBiYXJlIG9wZXJhbmRzIGFuZCAoIGV4cHIgKSBzeW50YXguICAqLworCitzdGF0aWMgVkFMVUUgKmV2YWw3KHZvaWQpCit7CisJVkFMVUUgKnY7CisKKwlpZiAoISpHLmFyZ3MpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzeW50YXggZXJyb3IiKTsKKworCWlmIChuZXh0YXJnKCIoIikpIHsKKwkJRy5hcmdzKys7CisJCXYgPSBldmFsKCk7CisJCWlmICghbmV4dGFyZygiKSIpKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN5bnRheCBlcnJvciIpOworCQlHLmFyZ3MrKzsKKwkJcmV0dXJuIHY7CisJfQorCisJaWYgKG5leHRhcmcoIikiKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN5bnRheCBlcnJvciIpOworCisJcmV0dXJuIHN0cl92YWx1ZSgqRy5hcmdzKyspOworfQorCisvKiBIYW5kbGUgbWF0Y2gsIHN1YnN0ciwgaW5kZXgsIGxlbmd0aCwgYW5kIHF1b3RlIGtleXdvcmRzLiAgKi8KKworc3RhdGljIFZBTFVFICpldmFsNih2b2lkKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGtleXdvcmRzW10gQUxJR04xID0KKwkJInF1b3RlXDAiImxlbmd0aFwwIiJtYXRjaFwwIiJpbmRleFwwIiJzdWJzdHJcMCI7CisKKwlWQUxVRSAqciwgKmkxLCAqaTI7CisJVkFMVUUgKmwgPSBsOyAvKiBzaWxlbmNlIGdjYyAqLworCVZBTFVFICp2ID0gdjsgLyogc2lsZW5jZSBnY2MgKi8KKwlpbnQga2V5ID0gKkcuYXJncyA/IGluZGV4X2luX3N0cmluZ3Moa2V5d29yZHMsICpHLmFyZ3MpICsgMSA6IDA7CisKKwlpZiAoa2V5ID09IDApIC8qIG5vdCBhIGtleXdvcmQgKi8KKwkJcmV0dXJuIGV2YWw3KCk7CisJRy5hcmdzKys7IC8qIFdlIGhhdmUgYSB2YWxpZCB0b2tlbiwgc28gZ2V0IHRoZSBuZXh0IGFyZ3VtZW50LiAgKi8KKwlpZiAoa2V5ID09IDEpIHsgLyogcXVvdGUgKi8KKwkJaWYgKCEqRy5hcmdzKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN5bnRheCBlcnJvciIpOworCQlyZXR1cm4gc3RyX3ZhbHVlKCpHLmFyZ3MrKyk7CisJfQorCWlmIChrZXkgPT0gMikgeyAvKiBsZW5ndGggKi8KKwkJciA9IGV2YWw2KCk7CisJCXRvc3RyaW5nKHIpOworCQl2ID0gaW50X3ZhbHVlKHN0cmxlbihyLT51LnMpKTsKKwkJZnJlZXYocik7CisJfSBlbHNlCisJCWwgPSBldmFsNigpOworCisJaWYgKGtleSA9PSAzKSB7IC8qIG1hdGNoICovCisJCXIgPSBldmFsNigpOworCQl2ID0gZG9jb2xvbihsLCByKTsKKwkJZnJlZXYobCk7CisJCWZyZWV2KHIpOworCX0KKwlpZiAoa2V5ID09IDQpIHsgLyogaW5kZXggKi8KKwkJciA9IGV2YWw2KCk7CisJCXRvc3RyaW5nKGwpOworCQl0b3N0cmluZyhyKTsKKwkJdiA9IGludF92YWx1ZShzdHJjc3BuKGwtPnUucywgci0+dS5zKSArIDEpOworCQlpZiAodi0+dS5pID09IChhcml0aF90KSBzdHJsZW4obC0+dS5zKSArIDEpCisJCQl2LT51LmkgPSAwOworCQlmcmVldihsKTsKKwkJZnJlZXYocik7CisJfQorCWlmIChrZXkgPT0gNSkgeyAvKiBzdWJzdHIgKi8KKwkJaTEgPSBldmFsNigpOworCQlpMiA9IGV2YWw2KCk7CisJCXRvc3RyaW5nKGwpOworCQlpZiAoIXRvYXJpdGgoaTEpIHx8ICF0b2FyaXRoKGkyKQorCQkgfHwgaTEtPnUuaSA+IChhcml0aF90KSBzdHJsZW4obC0+dS5zKQorCQkgfHwgaTEtPnUuaSA8PSAwIHx8IGkyLT51LmkgPD0gMCkKKwkJCXYgPSBzdHJfdmFsdWUoIiIpOworCQllbHNlIHsKKwkJCXYgPSB4bWFsbG9jKHNpemVvZihWQUxVRSkpOworCQkJdi0+dHlwZSA9IFNUUklORzsKKwkJCXYtPnUucyA9IHhzdHJuZHVwKGwtPnUucyArIGkxLT51LmkgLSAxLCBpMi0+dS5pKTsKKwkJfQorCQlmcmVldihsKTsKKwkJZnJlZXYoaTEpOworCQlmcmVldihpMik7CisJfQorCXJldHVybiB2OworfQorCisvKiBIYW5kbGUgOiBvcGVyYXRvciAocGF0dGVybiBtYXRjaGluZykuCisgICBDYWxscyBkb2NvbG9uIHRvIGRvIHRoZSByZWFsIHdvcmsuICAqLworCitzdGF0aWMgVkFMVUUgKmV2YWw1KHZvaWQpCit7CisJVkFMVUUgKmwsICpyLCAqdjsKKworCWwgPSBldmFsNigpOworCXdoaWxlIChuZXh0YXJnKCI6IikpIHsKKwkJRy5hcmdzKys7CisJCXIgPSBldmFsNigpOworCQl2ID0gZG9jb2xvbihsLCByKTsKKwkJZnJlZXYobCk7CisJCWZyZWV2KHIpOworCQlsID0gdjsKKwl9CisJcmV0dXJuIGw7Cit9CisKKy8qIEhhbmRsZSAqLCAvLCAlIG9wZXJhdG9ycy4gICovCisKK3N0YXRpYyBWQUxVRSAqZXZhbDQodm9pZCkKK3sKKwlWQUxVRSAqbCwgKnI7CisJaW50IG9wOworCWFyaXRoX3QgdmFsOworCisJbCA9IGV2YWw1KCk7CisJd2hpbGUgKDEpIHsKKwkJb3AgPSBuZXh0YXJnKCIqIik7CisJCWlmICghb3ApIHsgb3AgPSBuZXh0YXJnKCIvIik7CisJCSBpZiAoIW9wKSB7IG9wID0gbmV4dGFyZygiJSIpOworCQkgIGlmICghb3ApIHJldHVybiBsOworCQl9fQorCQlHLmFyZ3MrKzsKKwkJciA9IGV2YWw1KCk7CisJCXZhbCA9IGFyaXRobWV0aWNfY29tbW9uKGwsIHIsIG9wKTsKKwkJZnJlZXYobCk7CisJCWZyZWV2KHIpOworCQlsID0gaW50X3ZhbHVlKHZhbCk7CisJfQorfQorCisvKiBIYW5kbGUgKywgLSBvcGVyYXRvcnMuICAqLworCitzdGF0aWMgVkFMVUUgKmV2YWwzKHZvaWQpCit7CisJVkFMVUUgKmwsICpyOworCWludCBvcDsKKwlhcml0aF90IHZhbDsKKworCWwgPSBldmFsNCgpOworCXdoaWxlICgxKSB7CisJCW9wID0gbmV4dGFyZygiKyIpOworCQlpZiAoIW9wKSB7CisJCQlvcCA9IG5leHRhcmcoIi0iKTsKKwkJCWlmICghb3ApIHJldHVybiBsOworCQl9CisJCUcuYXJncysrOworCQlyID0gZXZhbDQoKTsKKwkJdmFsID0gYXJpdGhtZXRpY19jb21tb24obCwgciwgb3ApOworCQlmcmVldihsKTsKKwkJZnJlZXYocik7CisJCWwgPSBpbnRfdmFsdWUodmFsKTsKKwl9Cit9CisKKy8qIEhhbmRsZSBjb21wYXJpc29ucy4gICovCisKK3N0YXRpYyBWQUxVRSAqZXZhbDIodm9pZCkKK3sKKwlWQUxVRSAqbCwgKnI7CisJaW50IG9wOworCWFyaXRoX3QgdmFsOworCisJbCA9IGV2YWwzKCk7CisJd2hpbGUgKDEpIHsKKwkJb3AgPSBuZXh0YXJnKCI8Iik7CisJCWlmICghb3ApIHsgb3AgPSBuZXh0YXJnKCI8PSIpOworCQkgaWYgKCFvcCkgeyBvcCA9IG5leHRhcmcoIj0iKTsKKwkJICBpZiAoIW9wKSB7IG9wID0gbmV4dGFyZygiPT0iKTsKKwkJICAgaWYgKCFvcCkgeyBvcCA9IG5leHRhcmcoIiE9Iik7CisJCSAgICBpZiAoIW9wKSB7IG9wID0gbmV4dGFyZygiPj0iKTsKKwkJICAgICBpZiAoIW9wKSB7IG9wID0gbmV4dGFyZygiPiIpOworCQkgICAgICBpZiAoIW9wKSByZXR1cm4gbDsKKwkJfX19fX19CisJCUcuYXJncysrOworCQlyID0gZXZhbDMoKTsKKwkJdG9hcml0aChsKTsKKwkJdG9hcml0aChyKTsKKwkJdmFsID0gY21wX2NvbW1vbihsLCByLCBvcCk7CisJCWZyZWV2KGwpOworCQlmcmVldihyKTsKKwkJbCA9IGludF92YWx1ZSh2YWwpOworCX0KK30KKworLyogSGFuZGxlICYuICAqLworCitzdGF0aWMgVkFMVUUgKmV2YWwxKHZvaWQpCit7CisJVkFMVUUgKmwsICpyOworCisJbCA9IGV2YWwyKCk7CisJd2hpbGUgKG5leHRhcmcoIiYiKSkgeworCQlHLmFyZ3MrKzsKKwkJciA9IGV2YWwyKCk7CisJCWlmIChudWxsKGwpIHx8IG51bGwocikpIHsKKwkJCWZyZWV2KGwpOworCQkJZnJlZXYocik7CisJCQlsID0gaW50X3ZhbHVlKDApOworCQl9IGVsc2UKKwkJCWZyZWV2KHIpOworCX0KKwlyZXR1cm4gbDsKK30KKworLyogSGFuZGxlIHwuICAqLworCitzdGF0aWMgVkFMVUUgKmV2YWwodm9pZCkKK3sKKwlWQUxVRSAqbCwgKnI7CisKKwlsID0gZXZhbDEoKTsKKwl3aGlsZSAobmV4dGFyZygifCIpKSB7CisJCUcuYXJncysrOworCQlyID0gZXZhbDEoKTsKKwkJaWYgKG51bGwobCkpIHsKKwkJCWZyZWV2KGwpOworCQkJbCA9IHI7CisJCX0gZWxzZQorCQkJZnJlZXYocik7CisJfQorCXJldHVybiBsOworfQorCitpbnQgZXhwcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZXhwcl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJVkFMVUUgKnY7CisKKwlJTklUX0coKTsKKworCXhmdW5jX2Vycm9yX3JldHZhbCA9IDI7IC8qIGNvcmV1dGlscyBjb21wYXQgKi8KKwlHLmFyZ3MgPSBhcmd2ICsgMTsKKwlpZiAoKkcuYXJncyA9PSBOVUxMKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0b28gZmV3IGFyZ3VtZW50cyIpOworCX0KKwl2ID0gZXZhbCgpOworCWlmICgqRy5hcmdzKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic3ludGF4IGVycm9yIik7CisJaWYgKHYtPnR5cGUgPT0gSU5URUdFUikKKwkJcHJpbnRmKCIlIiBQRl9SRVogImRcbiIsIFBGX1JFWl9UWVBFIHYtPnUuaSk7CisJZWxzZQorCQlwdXRzKHYtPnUucyk7CisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChudWxsKHYpKTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9mYWxzZS5jIGIvY29yZXV0aWxzL2ZhbHNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU5MWE2YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9mYWxzZS5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgZmFsc2UgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwMDA5NTM5OS91dGlsaXRpZXMvZmFsc2UuaHRtbCAqLworCisvKiAiZmFsc2UgLS1oZWxwIiBpcyBzcGVjaWFsLWNhc2VkIHRvIGlnbm9yZSAtLWhlbHAgKi8KKy8vdXNhZ2U6I2RlZmluZSBmYWxzZV90cml2aWFsX3VzYWdlIE5PVVNBR0VfU1RSCisvL3VzYWdlOiNkZWZpbmUgZmFsc2VfZnVsbF91c2FnZSAiIgorLy91c2FnZTojZGVmaW5lIGZhbHNlX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGZhbHNlXG4iCisvL3VzYWdlOiAgICAgICAiJCBlY2hvICQ/XG4iCisvL3VzYWdlOiAgICAgICAiMVxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworaW50IGZhbHNlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBmYWxzZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXJldHVybiBFWElUX0ZBSUxVUkU7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvZm9sZC5jIGIvY29yZXV0aWxzL2ZvbGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTczMDYzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL2ZvbGQuYwpAQCAtMCwwICsxLDE3NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBmb2xkIC0tIHdyYXAgZWFjaCBpbnB1dCBsaW5lIHRvIGZpdCBpbiBzcGVjaWZpZWQgd2lkdGguCisKKyAgIFdyaXR0ZW4gYnkgRGF2aWQgTWFjS2VuemllLCBkam1AZ251LmFpLm1pdC5lZHUuCisgICBDb3B5cmlnaHQgKEMpIDkxLCAxOTk1LTIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIE1vZGlmaWVkIGZvciBidXN5Ym94IGJhc2VkIG9uIGNvcmV1dGlscyB2IDUuMAorICAgQ29weXJpZ2h0IChDKSAyMDAzIEdsZW5uIE1jR3JhdGgKKworICAgTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyovCisKKy8vdXNhZ2U6I2RlZmluZSBmb2xkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWJzXSBbLXcgV0lEVEhdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBmb2xkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiV3JhcCBpbnB1dCBsaW5lcyBpbiBlYWNoIEZJTEUgKG9yIHN0ZGluKSwgd3JpdGluZyB0byBzdGRvdXRcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWIJQ291bnQgYnl0ZXMgcmF0aGVyIHRoYW4gY29sdW1ucyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJQnJlYWsgYXQgc3BhY2VzIgorLy91c2FnZTogICAgICJcbgktdwlVc2UgV0lEVEggY29sdW1ucyBpbnN0ZWFkIG9mIDgwIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ1bmljb2RlLmgiCisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKKy8qIE11c3QgbWF0Y2ggZ2V0b3B0MzIgY2FsbCAqLworI2RlZmluZSBGTEFHX0NPVU5UX0JZVEVTICAgICAgICAxCisjZGVmaW5lIEZMQUdfQlJFQUtfU1BBQ0VTICAgICAgIDIKKyNkZWZpbmUgRkxBR19XSURUSCAgICAgICAgICAgICAgNAorCisvKiBBc3N1bWluZyB0aGUgY3VycmVudCBjb2x1bW4gaXMgQ09MVU1OLCByZXR1cm4gdGhlIGNvbHVtbiB0aGF0CisgICBwcmludGluZyBDIHdpbGwgbW92ZSB0aGUgY3Vyc29yIHRvLgorICAgVGhlIGZpcnN0IGNvbHVtbiBpcyAwLiAqLworc3RhdGljIGludCBhZGp1c3RfY29sdW1uKHVuc2lnbmVkIGNvbHVtbiwgY2hhciBjKQoreworCWlmIChvcHRpb25fbWFzazMyICYgRkxBR19DT1VOVF9CWVRFUykKKwkJcmV0dXJuICsrY29sdW1uOworCisJaWYgKGMgPT0gJ1x0JykKKwkJcmV0dXJuIGNvbHVtbiArIDggLSBjb2x1bW4gJSA4OworCisJaWYgKGMgPT0gJ1xiJykgeworCQlpZiAoKGludCktLWNvbHVtbiA8IDApCisJCQljb2x1bW4gPSAwOworCX0KKwllbHNlIGlmIChjID09ICdccicpCisJCWNvbHVtbiA9IDA7CisJZWxzZSB7IC8qIGp1c3QgYSBwcmludGFibGUgY2hhciAqLworCQlpZiAodW5pY29kZV9zdGF0dXMgIT0gVU5JQ09ERV9PTiAvKiBldmVyeSBieXRlIGlzIGEgbmV3IGNoYXIgKi8KKwkJIHx8IChjICYgMHhjMCkgIT0gMHg4MCAvKiBpdCBpc24ndCBhIDJuZCsgYnl0ZSBvZiBhIFVuaWNvZGUgY2hhciAqLworCQkpIHsKKwkJCWNvbHVtbisrOworCQl9CisJfQorCXJldHVybiBjb2x1bW47Cit9CisKKy8qIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGNhbiB3cml0ZSBOVUxzLCB1bmxpa2UgZnB1dHMgZXRjLiAqLworc3RhdGljIHZvaWQgd3JpdGUyc3Rkb3V0KGNvbnN0IHZvaWQgKmJ1ZiwgdW5zaWduZWQgc2l6ZSkKK3sKKwlmd3JpdGUoYnVmLCAxLCBzaXplLCBzdGRvdXQpOworfQorCitpbnQgZm9sZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZm9sZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqbGluZV9vdXQgPSBOVUxMOworCWNvbnN0IGNoYXIgKndfb3B0ID0gIjgwIjsKKwl1bnNpZ25lZCB3aWR0aDsKKwlzbWFsbGludCBleGl0Y29kZSA9IEVYSVRfU1VDQ0VTUzsKKworCWluaXRfdW5pY29kZSgpOworCisJaWYgKEVOQUJMRV9JTkNMVURFX1NVU3YyKSB7CisJCS8qIFR1cm4gYW55IG51bWVyaWMgb3B0aW9ucyBpbnRvIC13IG9wdGlvbnMuICAqLworCQlpbnQgaTsKKwkJZm9yIChpID0gMTsgYXJndltpXTsgaSsrKSB7CisJCQljb25zdCBjaGFyICphID0gYXJndltpXTsKKwkJCWlmICgqYSA9PSAnLScpIHsKKwkJCQlhKys7CisJCQkJaWYgKCphID09ICctJyAmJiAhYVsxXSkgLyogIi0tIiAqLworCQkJCQlicmVhazsKKwkJCQlpZiAoaXNkaWdpdCgqYSkpCisJCQkJCWFyZ3ZbaV0gPSB4YXNwcmludGYoIi13JXMiLCBhKTsKKwkJCX0KKwkJfQorCX0KKworCWdldG9wdDMyKGFyZ3YsICJic3c6IiwgJndfb3B0KTsKKwl3aWR0aCA9IHhhdG91X3JhbmdlKHdfb3B0LCAxLCAxMDAwMCk7CisKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoISphcmd2KQorCQkqLS1hcmd2ID0gKGNoYXIqKSItIjsKKworCWRvIHsKKwkJRklMRSAqaXN0cmVhbSA9IGZvcGVuX29yX3dhcm5fc3RkaW4oKmFyZ3YpOworCQlpbnQgYzsKKwkJdW5zaWduZWQgY29sdW1uID0gMDsgICAgIC8qIFNjcmVlbiBjb2x1bW4gd2hlcmUgbmV4dCBjaGFyIHdpbGwgZ28gKi8KKwkJdW5zaWduZWQgb2Zmc2V0X291dCA9IDA7IC8qIEluZGV4IGluICdsaW5lX291dCcgZm9yIG5leHQgY2hhciAqLworCisJCWlmIChpc3RyZWFtID09IE5VTEwpIHsKKwkJCWV4aXRjb2RlID0gRVhJVF9GQUlMVVJFOworCQkJY29udGludWU7CisJCX0KKworCQl3aGlsZSAoKGMgPSBnZXRjKGlzdHJlYW0pKSAhPSBFT0YpIHsKKwkJCS8qIFdlIGdyb3cgbGluZV9vdXQgaW4gY2h1bmtzIG9mIDB4MTAwMCBieXRlcyAqLworCQkJaWYgKChvZmZzZXRfb3V0ICYgMHhmZmYpID09IDApIHsKKwkJCQlsaW5lX291dCA9IHhyZWFsbG9jKGxpbmVfb3V0LCBvZmZzZXRfb3V0ICsgMHgxMDAwKTsKKwkJCX0KKyByZXNjYW46CisJCQlsaW5lX291dFtvZmZzZXRfb3V0XSA9IGM7CisJCQlpZiAoYyA9PSAnXG4nKSB7CisJCQkJd3JpdGUyc3Rkb3V0KGxpbmVfb3V0LCBvZmZzZXRfb3V0ICsgMSk7CisJCQkJY29sdW1uID0gb2Zmc2V0X291dCA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQljb2x1bW4gPSBhZGp1c3RfY29sdW1uKGNvbHVtbiwgYyk7CisJCQlpZiAoY29sdW1uIDw9IHdpZHRoIHx8IG9mZnNldF9vdXQgPT0gMCkgeworCQkJCS8qIG9mZnNldF9vdXQgPT0gMCBjYXNlIGhhcHBlbnMKKwkJCQkgKiB3aXRoIHNtYWxsIHdpZHRoIChzYXksIDEpIGFuZCB0YWJzLgorCQkJCSAqIFRoZSB2ZXJ5IGZpcnN0IHRhYiBhbHJlYWR5IGdvZXMgdG8gY29sdW1uIDgsCisJCQkJICogYnV0IHdlIG11c3Qgbm90IHdyYXAgaXQgKi8KKwkJCQlvZmZzZXRfb3V0Kys7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIFRoaXMgY2hhcmFjdGVyIHdvdWxkIG1ha2UgdGhlIGxpbmUgdG9vIGxvbmcuCisJCQkgKiBQcmludCB0aGUgbGluZSBwbHVzIGEgbmV3bGluZSwgYW5kIG1ha2UgdGhpcyBjaGFyYWN0ZXIKKwkJCSAqIHN0YXJ0IHRoZSBuZXh0IGxpbmUgKi8KKwkJCWlmIChvcHRpb25fbWFzazMyICYgRkxBR19CUkVBS19TUEFDRVMpIHsKKwkJCQl1bnNpZ25lZCBpOworCQkJCXVuc2lnbmVkIGxvZ2ljYWxfZW5kOworCisJCQkJLyogTG9vayBmb3IgdGhlIGxhc3QgYmxhbmsuICovCisJCQkJZm9yIChsb2dpY2FsX2VuZCA9IG9mZnNldF9vdXQgLSAxOyAoaW50KWxvZ2ljYWxfZW5kID49IDA7IGxvZ2ljYWxfZW5kLS0pIHsKKwkJCQkJaWYgKCFpc2JsYW5rKGxpbmVfb3V0W2xvZ2ljYWxfZW5kXSkpCisJCQkJCQljb250aW51ZTsKKworCQkJCQkvKiBGb3VuZCBhIHNwYWNlIG9yIHRhYi4KKwkJCQkJICogT3V0cHV0IHVwIHRvIGFuZCBpbmNsdWRpbmcgaXQsIGFuZCBzdGFydCBhIG5ldyBsaW5lICovCisJCQkJCWxvZ2ljYWxfZW5kKys7CisJCQkJCS8qbGluZV9vdXRbbG9naWNhbF9lbmRdID0gJ1xuJzsgLSBOTyEgdGhpcyBudWtlcyBvbmUgYnVmZmVyZWQgY2hhcmFjdGVyICovCisJCQkJCXdyaXRlMnN0ZG91dChsaW5lX291dCwgbG9naWNhbF9lbmQpOworCQkJCQlwdXRjaGFyKCdcbicpOworCQkJCQkvKiBNb3ZlIHRoZSByZW1haW5kZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBsaW5lLgorCQkJCQkgKiBUaGUgYXJlYXMgYmVpbmcgY29waWVkIGhlcmUgbWlnaHQgb3ZlcmxhcC4gKi8KKwkJCQkJbWVtbW92ZShsaW5lX291dCwgbGluZV9vdXQgKyBsb2dpY2FsX2VuZCwgb2Zmc2V0X291dCAtIGxvZ2ljYWxfZW5kKTsKKwkJCQkJb2Zmc2V0X291dCAtPSBsb2dpY2FsX2VuZDsKKwkJCQkJZm9yIChjb2x1bW4gPSBpID0gMDsgaSA8IG9mZnNldF9vdXQ7IGkrKykgeworCQkJCQkJY29sdW1uID0gYWRqdXN0X2NvbHVtbihjb2x1bW4sIGxpbmVfb3V0W2ldKTsKKwkJCQkJfQorCQkJCQlnb3RvIHJlc2NhbjsKKwkJCQl9CisJCQkJLyogTm8gYmxhbmsgZm91bmQsIHdyYXAgd2lsbCBzcGxpdCB0aGUgb3Zlcmxvbmcgd29yZCAqLworCQkJfQorCQkJLyogT3V0cHV0IHdoYXQgd2UgYWNjdW11bGF0ZWQgdXAgdG8gbm93LCBhbmQgc3RhcnQgYSBuZXcgbGluZSAqLworCQkJbGluZV9vdXRbb2Zmc2V0X291dF0gPSAnXG4nOworCQkJd3JpdGUyc3Rkb3V0KGxpbmVfb3V0LCBvZmZzZXRfb3V0ICsgMSk7CisJCQljb2x1bW4gPSBvZmZzZXRfb3V0ID0gMDsKKwkJCWdvdG8gcmVzY2FuOworCQl9IC8qIHdoaWxlIChub3QgRU9GKSAqLworCisJCWlmIChvZmZzZXRfb3V0KSB7CisJCQl3cml0ZTJzdGRvdXQobGluZV9vdXQsIG9mZnNldF9vdXQpOworCQl9CisKKwkJaWYgKGZjbG9zZV9pZl9ub3Rfc3RkaW4oaXN0cmVhbSkpIHsKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKCphcmd2KTsKKwkJCWV4aXRjb2RlID0gRVhJVF9GQUlMVVJFOworCQl9CisJfSB3aGlsZSAoKisrYXJndik7CisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KGV4aXRjb2RlKTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9mc3luYy5jIGIvY29yZXV0aWxzL2ZzeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUyYTQxYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9mc3luYy5jCkBAIC0wLDAgKzEsNTEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgZnN5bmMgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZnN5bmNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZF0gRklMRS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBmc3luY19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIldyaXRlIGZpbGVzJyBidWZmZXJlZCBibG9ja3MgdG8gZGlza1xuIgorLy91c2FnZTogICAgICJcbgktZAlBdm9pZCBzeW5jaW5nIG1ldGFkYXRhIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZm5kZWYgT19OT0FUSU1FCisjIGRlZmluZSBPX05PQVRJTUUgMAorI2VuZGlmCisKKy8qIFRoaXMgaXMgYSBOT0ZPUksgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK2ludCBmc3luY19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZnN5bmNfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBzdGF0dXM7CisJaW50IG9wdHM7CisKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgImQiKTsgLyogZmRhdGFzeW5jICovCisJYXJndiArPSBvcHRpbmQ7CisJaWYgKCEqYXJndikgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJc3RhdHVzID0gRVhJVF9TVUNDRVNTOworCWRvIHsKKwkJaW50IGZkID0gb3Blbl9vcl93YXJuKCphcmd2LCBPX05PQVRJTUUgfCBPX05PQ1RUWSB8IE9fUkRPTkxZKTsKKworCQlpZiAoZmQgPT0gLTEpIHsKKwkJCXN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgob3B0cyA/IGZkYXRhc3luYyhmZCkgOiBmc3luYyhmZCkpKSB7CisJCQkvL3N0YXR1cyA9IEVYSVRfRkFJTFVSRTsgLSBkbyB3ZSB3YW50IHRoaXM/CisJCQliYl9zaW1wbGVfcGVycm9yX21zZygqYXJndik7CisJCX0KKwkJY2xvc2UoZmQpOworCX0gd2hpbGUgKCorK2FyZ3YpOworCisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9oZWFkLmMgYi9jb3JldXRpbHMvaGVhZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzODhiMDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvaGVhZC5jCkBAIC0wLDAgKzEsMjU4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBoZWFkIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIEJCX0FVRElUIEdOVSBjb21wYXRpYmxlIC1jLCAtcSwgYW5kIC12IG9wdGlvbnMgaW4gJ2ZhbmN5JyBjb25maWd1cmF0aW9uLiAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9oZWFkLmh0bWwgKi8KKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0hFQUQpICs9IGhlYWQubworCisvL3VzYWdlOiNkZWZpbmUgaGVhZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBoZWFkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgZmlyc3QgMTAgbGluZXMgb2YgZWFjaCBGSUxFIChvciBzdGRpbikgdG8gc3Rkb3V0LlxuIgorLy91c2FnZTogICAgICAgIldpdGggbW9yZSB0aGFuIG9uZSBGSUxFLCBwcmVjZWRlIGVhY2ggd2l0aCBhIGZpbGVuYW1lIGhlYWRlci5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW4gTltrYm1dCVByaW50IGZpcnN0IE4gbGluZXMiCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZBTkNZX0hFQUQoCisvL3VzYWdlOiAgICAgIlxuCS1uIC1OW2tibV0JUHJpbnQgYWxsIGV4Y2VwdCBOIGxhc3QgbGluZXMiCisvL3VzYWdlOiAgICAgIlxuCS1jIFstXU5ba2JtXQlQcmludCBmaXJzdCBOIGJ5dGVzIgorLy91c2FnZTogICAgICJcbgktcQkJTmV2ZXIgcHJpbnQgaGVhZGVycyIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJCUFsd2F5cyBwcmludCBoZWFkZXJzIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG5OIG1heSBiZSBzdWZmaXhlZCBieSBrICh4MTAyNCksIGIgKHg1MTIpLCBvciBtICh4MTAyNF4yKS4iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGhlYWRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgaGVhZCAtbiAyIC9ldGMvcGFzc3dkXG4iCisvL3VzYWdlOiAgICAgICAicm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaFxuIgorLy91c2FnZTogICAgICAgImRhZW1vbjp4OjE6MTpkYWVtb246L3Vzci9zYmluOi9iaW4vc2hcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfSEVBRAorIyBkZWZpbmUgcHJpbnRfZmlyc3RfTihmcCxjb3VudCxieXRlcykgcHJpbnRfZmlyc3RfTihmcCxjb3VudCkKKyNlbmRpZgorc3RhdGljIHZvaWQKK3ByaW50X2ZpcnN0X04oRklMRSAqZnAsIHVuc2lnbmVkIGxvbmcgY291bnQsIGJvb2wgY291bnRfYnl0ZXMpCit7CisjaWYgIUVOQUJMRV9GRUFUVVJFX0ZBTkNZX0hFQUQKKwljb25zdCBpbnQgY291bnRfYnl0ZXMgPSAwOworI2VuZGlmCisJd2hpbGUgKGNvdW50KSB7CisJCWludCBjID0gZ2V0YyhmcCk7CisJCWlmIChjID09IEVPRikKKwkJCWJyZWFrOworCQlpZiAoY291bnRfYnl0ZXMgfHwgKGMgPT0gJ1xuJykpCisJCQktLWNvdW50OworCQlwdXRjaGFyKGMpOworCX0KK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZBTkNZX0hFQUQKK3N0YXRpYyB2b2lkCitwcmludF9leGNlcHRfTl9sYXN0X2J5dGVzKEZJTEUgKmZwLCB1bnNpZ25lZCBjb3VudCkKK3sKKwl1bnNpZ25lZCBjaGFyICpjaXJjbGUgPSB4bWFsbG9jKCsrY291bnQpOworCXVuc2lnbmVkIGhlYWQgPSAwOworCWZvcig7OykgeworCQlpbnQgYzsKKwkJYyA9IGdldGMoZnApOworCQlpZiAoYyA9PSBFT0YpCisJCQlnb3RvIHJldDsKKwkJY2lyY2xlW2hlYWQrK10gPSBjOworCQlpZiAoaGVhZCA9PSBjb3VudCkKKwkJCWJyZWFrOworCX0KKwlmb3IgKDs7KSB7CisJCWludCBjOworCQlpZiAoaGVhZCA9PSBjb3VudCkKKwkJCWhlYWQgPSAwOworCQlwdXRjaGFyKGNpcmNsZVtoZWFkXSk7CisJCWMgPSBnZXRjKGZwKTsKKwkJaWYgKGMgPT0gRU9GKQorCQkJZ290byByZXQ7CisJCWNpcmNsZVtoZWFkXSA9IGM7CisJCWhlYWQrKzsKKwl9CisgcmV0OgorCWZyZWUoY2lyY2xlKTsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X2V4Y2VwdF9OX2xhc3RfbGluZXMoRklMRSAqZnAsIHVuc2lnbmVkIGNvdW50KQoreworCWNoYXIgKipjaXJjbGUgPSB4emFsbG9jKCgrK2NvdW50KSAqIHNpemVvZihjaXJjbGVbMF0pKTsKKwl1bnNpZ25lZCBoZWFkID0gMDsKKwlmb3IoOzspIHsKKwkJY2hhciAqYzsKKwkJYyA9IHhtYWxsb2NfZmdldHMoZnApOworCQlpZiAoIWMpCisJCQlnb3RvIHJldDsKKwkJY2lyY2xlW2hlYWQrK10gPSBjOworCQlpZiAoaGVhZCA9PSBjb3VudCkKKwkJCWJyZWFrOworCX0KKwlmb3IgKDs7KSB7CisJCWNoYXIgKmM7CisJCWlmIChoZWFkID09IGNvdW50KQorCQkJaGVhZCA9IDA7CisJCWZwdXRzKGNpcmNsZVtoZWFkXSwgc3Rkb3V0KTsKKwkJYyA9IHhtYWxsb2NfZmdldHMoZnApOworCQlpZiAoIWMpCisJCQlnb3RvIHJldDsKKwkJZnJlZShjaXJjbGVbaGVhZF0pOworCQljaXJjbGVbaGVhZCsrXSA9IGM7CisJfQorIHJldDoKKwloZWFkID0gMDsKKwlmb3IoOzspIHsKKwkJZnJlZShjaXJjbGVbaGVhZCsrXSk7CisJCWlmIChoZWFkID09IGNvdW50KQorCQkJYnJlYWs7CisJfQorCWZyZWUoY2lyY2xlKTsKK30KKyNlbHNlCisvKiBNdXN0IG5ldmVyIGJlIGNhbGxlZCAqLwordm9pZCBwcmludF9leGNlcHRfTl9sYXN0X2J5dGVzKEZJTEUgKmZwLCB1bnNpZ25lZCBjb3VudCk7Cit2b2lkIHByaW50X2V4Y2VwdF9OX2xhc3RfbGluZXMoRklMRSAqZnAsIHVuc2lnbmVkIGNvdW50KTsKKyNlbmRpZgorCisjaWYgIUVOQUJMRV9GRUFUVVJFX0ZBTkNZX0hFQUQKKyMgZGVmaW5lIGVhdF9udW0obmVnYXRpdmVfTixwKSBlYXRfbnVtKHApCisjZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitlYXRfbnVtKGJvb2wgKm5lZ2F0aXZlX04sIGNvbnN0IGNoYXIgKnApCit7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfSEVBRAorCWlmICgqcCA9PSAnLScpIHsKKwkJKm5lZ2F0aXZlX04gPSAxOworCQlwKys7CisJfQorI2VuZGlmCisJcmV0dXJuIHhhdG91bF9zZngocCwgYmttX3N1ZmZpeGVzKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgaGVhZF9vcHRzW10gQUxJR04xID0KKwkibjoiCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfSEVBRAorCSJjOnF2IgorI2VuZGlmCisJOworCisjZGVmaW5lIGhlYWRlcl9mbXRfc3RyICJcbj09PiAlcyA8PT1cbiIKKworaW50IGhlYWRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGhlYWRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgbG9uZyBjb3VudCA9IDEwOworI2lmIEVOQUJMRV9GRUFUVVJFX0ZBTkNZX0hFQUQKKwlpbnQgaGVhZGVyX3RocmVzaGhvbGQgPSAxOworCWJvb2wgY291bnRfYnl0ZXMgPSAwOworCWJvb2wgbmVnYXRpdmVfTiA9IDA7CisjZWxzZQorIyBkZWZpbmUgaGVhZGVyX3RocmVzaGhvbGQgMQorIyBkZWZpbmUgY291bnRfYnl0ZXMgICAgICAgMAorIyBkZWZpbmUgbmVnYXRpdmVfTiAgICAgICAgMAorI2VuZGlmCisJRklMRSAqZnA7CisJY29uc3QgY2hhciAqZm10OworCWNoYXIgKnA7CisJaW50IG9wdDsKKwlpbnQgcmV0dmFsID0gRVhJVF9TVUNDRVNTOworCisjaWYgRU5BQkxFX0lOQ0xVREVfU1VTdjIgfHwgRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfSEVBRAorCS8qIEFsbG93IGxlZ2FjeSBzeW50YXggb2YgYW4gaW5pdGlhbCBudW1lcmljIG9wdGlvbiB3aXRob3V0IC1uLiAqLworCWlmIChhcmd2WzFdICYmIGFyZ3ZbMV1bMF0gPT0gJy0nCisJICYmIGlzZGlnaXQoYXJndlsxXVsxXSkKKwkpIHsKKwkJLS1hcmdjOworCQkrK2FyZ3Y7CisJCXAgPSBhcmd2WzBdICsgMTsKKwkJZ290byBHRVRfQ09VTlQ7CisJfQorI2VuZGlmCisKKwkvKiBObyBzaXplIGJlbmVmaXQgaW4gY29udmVydGluZyB0aGlzIHRvIGdldG9wdDMyICovCisJd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgaGVhZF9vcHRzKSkgPiAwKSB7CisJCXN3aXRjaCAob3B0KSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfSEVBRAorCQljYXNlICdxJzoKKwkJCWhlYWRlcl90aHJlc2hob2xkID0gSU5UX01BWDsKKwkJCWJyZWFrOworCQljYXNlICd2JzoKKwkJCWhlYWRlcl90aHJlc2hob2xkID0gLTE7CisJCQlicmVhazsKKwkJY2FzZSAnYyc6CisJCQljb3VudF9ieXRlcyA9IDE7CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKyNlbmRpZgorCQljYXNlICduJzoKKwkJCXAgPSBvcHRhcmc7CisjaWYgRU5BQkxFX0lOQ0xVREVfU1VTdjIgfHwgRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfSEVBRAorIEdFVF9DT1VOVDoKKyNlbmRpZgorCQkJY291bnQgPSBlYXRfbnVtKCZuZWdhdGl2ZV9OLCBwKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYmJfc2hvd191c2FnZSgpOworCQl9CisJfQorCisJYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKCEqYXJndikKKwkJKi0tYXJndiA9IChjaGFyKikiLSI7CisKKwlmbXQgPSBoZWFkZXJfZm10X3N0ciArIDE7CisJaWYgKGFyZ2MgPD0gaGVhZGVyX3RocmVzaGhvbGQpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9GQU5DWV9IRUFECisJCWhlYWRlcl90aHJlc2hob2xkID0gMDsKKyNlbHNlCisJCWZtdCArPSAxMTsgLyogIiIgKi8KKyNlbmRpZgorCX0KKwlpZiAobmVnYXRpdmVfTikgeworCQlpZiAoY291bnQgPj0gSU5UX01BWCAvIHNpemVvZihjaGFyKikpCisJCQliYl9lcnJvcl9tc2coImNvdW50IGlzIHRvbyBiaWc6ICVsdSIsIGNvdW50KTsKKwl9CisKKwlkbyB7CisJCWZwID0gZm9wZW5fb3Jfd2Fybl9zdGRpbigqYXJndik7CisJCWlmIChmcCkgeworCQkJaWYgKGZwID09IHN0ZGluKSB7CisJCQkJKmFyZ3YgPSAoY2hhciAqKSBiYl9tc2dfc3RhbmRhcmRfaW5wdXQ7CisJCQl9CisJCQlpZiAoaGVhZGVyX3RocmVzaGhvbGQpIHsKKwkJCQlwcmludGYoZm10LCAqYXJndik7CisJCQl9CisJCQlpZiAobmVnYXRpdmVfTikgeworCQkJCWlmIChjb3VudF9ieXRlcykgeworCQkJCQlwcmludF9leGNlcHRfTl9sYXN0X2J5dGVzKGZwLCBjb3VudCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHJpbnRfZXhjZXB0X05fbGFzdF9saW5lcyhmcCwgY291bnQpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRfZmlyc3RfTihmcCwgY291bnQsIGNvdW50X2J5dGVzKTsKKwkJCX0KKwkJCWRpZV9pZl9mZXJyb3Jfc3Rkb3V0KCk7CisJCQlpZiAoZmNsb3NlX2lmX25vdF9zdGRpbihmcCkpIHsKKwkJCQliYl9zaW1wbGVfcGVycm9yX21zZygqYXJndik7CisJCQkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCQkJfQorCQl9IGVsc2UgeworCQkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCQl9CisJCWZtdCA9IGhlYWRlcl9mbXRfc3RyOworCX0gd2hpbGUgKCorK2FyZ3YpOworCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChyZXR2YWwpOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2hvc3RpZC5jIGIvY29yZXV0aWxzL2hvc3RpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YjFmNTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvaG9zdGlkLmMKQEAgLTAsMCArMSw0MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBob3N0aWQgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgIEVkd2FyZCBCZXR0cyA8ZWR3YXJkQGRlYmlhbi5vcmc+LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgTi9BIC0tIE1hdGNoZXMgR05VIGJlaGF2aW9yLiAqLworCisvL2NvbmZpZzpjb25maWcgSE9TVElECisvL2NvbmZpZzoJYm9vbCAiaG9zdGlkIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIGhvc3RpZCBwcmludHMgdGhlIG51bWVyaWMgaWRlbnRpZmllciAoaW4gaGV4YWRlY2ltYWwpIGZvcgorLy9jb25maWc6CSAgdGhlIGN1cnJlbnQgaG9zdC4KKworLy9hcHBsZXQ6SUZfSE9TVElEKEFQUExFVF9OT0ZPUksoaG9zdGlkLCBob3N0aWQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGhvc3RpZCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19IT1NUSUQpICs9IGhvc3RpZC5vCisKKy8vdXNhZ2U6I2RlZmluZSBob3N0aWRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIiIKKy8vdXNhZ2U6I2RlZmluZSBob3N0aWRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCBvdXQgYSB1bmlxdWUgMzItYml0IGlkZW50aWZpZXIgZm9yIHRoZSBtYWNoaW5lIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworaW50IGhvc3RpZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaG9zdGlkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJaWYgKGFyZ3ZbMV0pIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCS8qIFBPU0lYIHNheXMgZ2V0aG9zdGlkIHJldHVybnMgYSAiMzItYml0IGlkZW50aWZpZXIiICovCisJcHJpbnRmKCIlMDh4XG4iLCAodW5zaWduZWQpKHVpbnQzMl90KWdldGhvc3RpZCgpKTsKKworCXJldHVybiBmZmx1c2hfYWxsKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvaWQuYyBiL2NvcmV1dGlscy9pZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmM2UxYzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvaWQuYwpAQCAtMCwwICsxLDI2NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBpZCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBieSBSYW5kb2xwaCBDaHVuZyA8dGF1c3FAZGViaWFuLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBUaXRvIFJhZ3VzYSA8ZmFybWF0aXRvQHRpc2NhbGkuaXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQuICovCisvKiBIYWNrZWQgYnkgVGl0byBSYWd1c2EgKEMpIDIwMDQgdG8gaGFuZGxlIHVzZXJuYW1lcyBvZiB3aGF0ZXZlcgorICogbGVuZ3RoIGFuZCB0byBiZSBtb3JlIHNpbWlsYXIgdG8gR05VIGlkLgorICogLVogb3B0aW9uIHN1cHBvcnQ6IGJ5IFl1aWNoaSBOYWthbXVyYSA8eW5ha2FtQGhpdGFjaGlzb2Z0LmpwPgorICogQWRkZWQgLUcgb3B0aW9uIFRpdG8gUmFndXNhIChDKSAyMDA4IGZvciBTVVN2My4KKyAqLworCisvL2NvbmZpZzpjb25maWcgSUQKKy8vY29uZmlnOglib29sICJpZCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBpZCBkaXNwbGF5cyB0aGUgY3VycmVudCB1c2VyIGFuZCBncm91cCBJRCBuYW1lcy4KKworLy9jb25maWc6Y29uZmlnIEdST1VQUworLy9jb25maWc6CWJvb2wgImdyb3VwcyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBQcmludCB0aGUgZ3JvdXAgbmFtZXMgYXNzb2NpYXRlZCB3aXRoIGN1cnJlbnQgdXNlciBpZC4KKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0dST1VQUykgKz0gaWQubworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0lEKSAgICAgKz0gaWQubworCisvL2FwcGxldDpJRl9HUk9VUFMoQVBQTEVUX05PRVhFQyhncm91cHMsIGlkLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBncm91cHMpKQorLy9hcHBsZXQ6SUZfSUQoICAgIEFQUExFVF9OT0VYRUMoaWQsICAgICBpZCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgaWQgICAgKSkKKworLy91c2FnZTojZGVmaW5lIGlkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gW1VTRVJdIgorLy91c2FnZTojZGVmaW5lIGlkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgVVNFUiBvciB0aGUgY3VycmVudCB1c2VyXG4iCisvL3VzYWdlOglJRl9TRUxJTlVYKAorLy91c2FnZTogICAgICJcbgktWglTZWN1cml0eSBjb250ZXh0IgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktdQlVc2VyIElEIgorLy91c2FnZTogICAgICJcbgktZwlHcm91cCBJRCIKKy8vdXNhZ2U6ICAgICAiXG4JLUcJU3VwcGxlbWVudGFyeSBncm91cCBJRHMiCisvL3VzYWdlOiAgICAgIlxuCS1uCVByaW50IG5hbWVzIGluc3RlYWQgb2YgbnVtYmVycyIKKy8vdXNhZ2U6ICAgICAiXG4JLXIJUHJpbnQgcmVhbCBJRCBpbnN0ZWFkIG9mIGVmZmVjdGl2ZSBJRCIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgaWRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgaWRcbiIKKy8vdXNhZ2U6ICAgICAgICJ1aWQ9MTAwMChhbmRlcnNlbikgZ2lkPTEwMDAoYW5kZXJzZW4pXG4iCisKKy8vdXNhZ2U6I2RlZmluZSBncm91cHNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltVU0VSXSIKKy8vdXNhZ2U6I2RlZmluZSBncm91cHNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCB0aGUgZ3JvdXAgbWVtYmVyc2hpcHMgb2YgVVNFUiBvciBmb3IgdGhlIGN1cnJlbnQgcHJvY2VzcyIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZ3JvdXBzX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGdyb3Vwc1xuIgorLy91c2FnZTogICAgICAgImFuZGVyc2VuIGxwIGRpYWxvdXQgY2Ryb20gZmxvcHB5XG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9FWEVDIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCisjaWYgIUVOQUJMRV9VU0VfQkJfUFdEX0dSUAorI2lmIGRlZmluZWQoX19VQ0xJQkNfXykgJiYgVUNMSUJDX1ZFUlNJT04gPCBLRVJORUxfVkVSU0lPTigwLCA5LCAzMCkKKyNlcnJvciAiU29ycnksIHlvdSBuZWVkIGF0IGxlYXN0IHVDbGliYyB2ZXJzaW9uIDAuOS4zMCBmb3IgaWQgYXBwbGV0IHRvIGJ1aWxkIgorI2VuZGlmCisjZW5kaWYKKworZW51bSB7CisJUFJJTlRfUkVBTCAgICAgID0gKDEgPDwgMCksCisJTkFNRV9OT1RfTlVNQkVSID0gKDEgPDwgMSksCisJSlVTVF9VU0VSICAgICAgID0gKDEgPDwgMiksCisJSlVTVF9HUk9VUCAgICAgID0gKDEgPDwgMyksCisJSlVTVF9BTExfR1JPVVBTID0gKDEgPDwgNCksCisjaWYgRU5BQkxFX1NFTElOVVgKKwlKVVNUX0NPTlRFWFQgICAgPSAoMSA8PCA1KSwKKyNlbmRpZgorfTsKKworc3RhdGljIGludCBwcmludF9jb21tb24odW5zaWduZWQgaWQsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpZiAocHJlZml4KSB7CisJCXByaW50ZigiJXMiLCBwcmVmaXgpOworCX0KKwlpZiAoIShvcHRpb25fbWFzazMyICYgTkFNRV9OT1RfTlVNQkVSKSB8fCAhbmFtZSkgeworCQlwcmludGYoIiV1IiwgaWQpOworCX0KKwlpZiAoIW9wdGlvbl9tYXNrMzIgfHwgKG9wdGlvbl9tYXNrMzIgJiBOQU1FX05PVF9OVU1CRVIpKSB7CisJCWlmIChuYW1lKSB7CisJCQlwcmludGYob3B0aW9uX21hc2szMiA/ICIlcyIgOiAiKCVzKSIsIG5hbWUpOworCQl9IGVsc2UgeworCQkJLyogRG9uJ3Qgc2V0IGVycm9yIHN0YXR1cyBmbGFnIGluIGRlZmF1bHQgbW9kZSAqLworCQkJaWYgKG9wdGlvbl9tYXNrMzIpIHsKKwkJCQlpZiAoRU5BQkxFX0RFU0tUT1ApCisJCQkJCWJiX2Vycm9yX21zZygidW5rbm93biBJRCAldSIsIGlkKTsKKwkJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQkJfQorCQl9CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgcHJpbnRfZ3JvdXAoZ2lkX3QgaWQsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlyZXR1cm4gcHJpbnRfY29tbW9uKGlkLCBnaWQyZ3JvdXAoaWQpLCBwcmVmaXgpOworfQorCitzdGF0aWMgaW50IHByaW50X3VzZXIodWlkX3QgaWQsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlyZXR1cm4gcHJpbnRfY29tbW9uKGlkLCB1aWQydW5hbWUoaWQpLCBwcmVmaXgpOworfQorCisvKiBPbiBlcnJvciBzZXQgKm4gPCAwIGFuZCByZXR1cm4gPj0gMAorICogSWYgKm4gaXMgdG9vIHNtYWxsLCB1cGRhdGUgaXQgYW5kIHJldHVybiA8IDAKKyAqIChvayB0byB0cmFzaCBncm91cHNbXSBpbiBib3RoIGNhc2VzKQorICogT3RoZXJ3aXNlIGZpbGwgaW4gZ3JvdXBzW10gYW5kIHJldHVybiA+PSAwCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2dyb3Vwcyhjb25zdCBjaGFyICp1c2VybmFtZSwgZ2lkX3QgcmdpZCwgZ2lkX3QgKmdyb3VwcywgaW50ICpuKQoreworCWludCBtOworCisJaWYgKHVzZXJuYW1lKSB7CisJCS8qIElmIHRoZSB1c2VyIGlzIGEgbWVtYmVyIG9mIG1vcmUgdGhhbgorCQkgKiAqbiBncm91cHMsIHRoZW4gLTEgaXMgcmV0dXJuZWQuIE90aGVyd2lzZSA+PSAwLgorCQkgKiAoYW5kIG5vIGRlZmluZWQgd2F5IG9mIGRldGVjdGluZyBlcnJvcnM/ISkgKi8KKwkJbSA9IGdldGdyb3VwbGlzdCh1c2VybmFtZSwgcmdpZCwgZ3JvdXBzLCBuKTsKKwkJLyogSSBndWVzcyAqbiA8IDAgbWlnaHQgaW5kaWNhdGUgZXJyb3IuIEFueXdheSwKKwkJICogbWFsbG9jJ2luZyAtMSBieXRlcyB3b24ndCBiZSBnb29kLCBzbzogKi8KKwkJaWYgKCpuIDwgMCkKKwkJCXJldHVybiAwOworCQlyZXR1cm4gbTsKKwl9CisKKwkqbiA9IGdldGdyb3VwcygqbiwgZ3JvdXBzKTsKKwlpZiAoKm4gPj0gMCkKKwkJcmV0dXJuICpuOworCS8qIEVycm9yICovCisJaWYgKGVycm5vID09IEVJTlZBTCkgLyogKm4gaXMgdG9vIHNtYWxsPyAqLworCQkqbiA9IGdldGdyb3VwcygwLCBncm91cHMpOyAvKiBnZXQgbmVlZGVkICpuICovCisJLyogaWYgKm4gPj0gMCwgcmV0dXJuIC0xIChnb3QgbmV3ICpuKSwgZWxzZSByZXR1cm4gMCAoZXJyb3IpOiAqLworCXJldHVybiAtKCpuID49IDApOworfQorCitpbnQgaWRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGlkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1aWRfdCBydWlkOworCWdpZF90IHJnaWQ7CisJdWlkX3QgZXVpZDsKKwlnaWRfdCBlZ2lkOworCXVuc2lnbmVkIG9wdDsKKwlpbnQgaTsKKwlpbnQgc3RhdHVzID0gRVhJVF9TVUNDRVNTOworCWNvbnN0IGNoYXIgKnByZWZpeDsKKwljb25zdCBjaGFyICp1c2VybmFtZTsKKyNpZiBFTkFCTEVfU0VMSU5VWAorCXNlY3VyaXR5X2NvbnRleHRfdCBzY29udGV4dCA9IE5VTEw7CisjZW5kaWYKKworCWlmIChFTkFCTEVfR1JPVVBTICYmICghRU5BQkxFX0lEIHx8IGFwcGxldF9uYW1lWzBdID09ICdnJykpIHsKKwkJLyogVE9ETzogY29yZXV0aWxzIGdyb3VwcyBwcmVwZW5kICJVU0VSIDogIiBwcmVmaXgsCisJCSAqIGFuZCBhY2NlcHQgbWFueSB1c2VybmFtZXMuIEV4YW1wbGU6CisJCSAqICMgZ3JvdXBzIHJvb3Qgcm9vdAorCQkgKiByb290IDogcm9vdAorCQkgKiByb290IDogcm9vdAorCQkgKi8KKwkJb3B0ID0gb3B0aW9uX21hc2szMiA9IGdldG9wdDMyKGFyZ3YsICIiKSB8IEpVU1RfQUxMX0dST1VQUyB8IE5BTUVfTk9UX05VTUJFUjsKKwl9IGVsc2UgeworCQkvKiBEb24ndCBhbGxvdyAtbiAtciAtbnIgLXVnIC1ydWcgLW51ZyAtcm51ZyAtdVogLWdaIC1HWiovCisJCS8qIERvbid0IGFsbG93IG1vcmUgdGhhbiBvbmUgdXNlcm5hbWUgKi8KKwkJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPzE6dS0tZzpnLS11OkctLXU6dS0tRzpnLS1HOkctLWc6cj91Z0c6bj91Z0ciCisJCQlJRl9TRUxJTlVYKCI6dS0tWjpaLS11OmctLVo6Wi0tZzpHLS1aOlotLUciKTsKKwkJb3B0ID0gZ2V0b3B0MzIoYXJndiwgInJudWdHIiBJRl9TRUxJTlVYKCJaIikpOworCX0KKworCXVzZXJuYW1lID0gYXJndltvcHRpbmRdOworCWlmICh1c2VybmFtZSkgeworCQlzdHJ1Y3QgcGFzc3dkICpwID0geGdldHB3bmFtKHVzZXJuYW1lKTsKKwkJZXVpZCA9IHJ1aWQgPSBwLT5wd191aWQ7CisJCWVnaWQgPSByZ2lkID0gcC0+cHdfZ2lkOworCX0gZWxzZSB7CisJCWVnaWQgPSBnZXRlZ2lkKCk7CisJCXJnaWQgPSBnZXRnaWQoKTsKKwkJZXVpZCA9IGdldGV1aWQoKTsKKwkJcnVpZCA9IGdldHVpZCgpOworCX0KKwkvKiBKVVNUX0FMTF9HUk9VUFMgaWdub3JlcyAtciBQUklOVF9SRUFMIGZsYWcgZXZlbiBpZiBtYW4gcGFnZSBmb3IgKi8KKwkvKiBpZCBzYXlzOiBwcmludCB0aGUgcmVhbCBJRCBpbnN0ZWFkIG9mIHRoZSBlZmZlY3RpdmUgSUQsIHdpdGggLXVnRyAqLworCS8qIGluIGZhY3QgaW4gdGhpcyBjYXNlIGVnaWQgaXMgYWx3YXlzIHByaW50ZWQgaWYgZWdpZCAhPSByZ2lkICovCisJaWYgKCFvcHQgfHwgKG9wdCAmIEpVU1RfQUxMX0dST1VQUykpIHsKKwkJZ2lkX3QgKmdyb3VwczsKKwkJaW50IG47CisKKwkJaWYgKCFvcHQpIHsKKwkJCS8qIERlZmF1bHQgTW9kZSAqLworCQkJc3RhdHVzIHw9IHByaW50X3VzZXIocnVpZCwgInVpZD0iKTsKKwkJCXN0YXR1cyB8PSBwcmludF9ncm91cChyZ2lkLCAiIGdpZD0iKTsKKwkJCWlmIChldWlkICE9IHJ1aWQpCisJCQkJc3RhdHVzIHw9IHByaW50X3VzZXIoZXVpZCwgIiBldWlkPSIpOworCQkJaWYgKGVnaWQgIT0gcmdpZCkKKwkJCQlzdGF0dXMgfD0gcHJpbnRfZ3JvdXAoZWdpZCwgIiBlZ2lkPSIpOworCQl9IGVsc2UgeworCQkJLyogSlVTVF9BTExfR1JPVVBTICovCisJCQlzdGF0dXMgfD0gcHJpbnRfZ3JvdXAocmdpZCwgTlVMTCk7CisJCQlpZiAoZWdpZCAhPSByZ2lkKQorCQkJCXN0YXR1cyB8PSBwcmludF9ncm91cChlZ2lkLCAiICIpOworCQl9CisJCS8qIFdlIGFyZSBzdXBwbHlpbmcgbGFyZ2lzaCBidWZmZXIsIHRyeWluZworCQkgKiB0byBub3QgcnVuIGdldF9ncm91cHMoKSB0d2ljZS4gVGhhdCBtaWdodCBiZSBzbG93CisJCSAqICgidXNlciBkYXRhYmFzZSBpbiByZW1vdGUgU1FMIHNlcnZlciIgY2FzZSkgKi8KKwkJZ3JvdXBzID0geG1hbGxvYyg2NCAqIHNpemVvZihncm91cHNbMF0pKTsKKwkJbiA9IDY0OworCQlpZiAoZ2V0X2dyb3Vwcyh1c2VybmFtZSwgcmdpZCwgZ3JvdXBzLCAmbikgPCAwKSB7CisJCQkvKiBOZWVkIGJpZ2dlciBidWZmZXIgYWZ0ZXIgYWxsICovCisJCQlncm91cHMgPSB4cmVhbGxvYyhncm91cHMsIG4gKiBzaXplb2YoZ3JvdXBzWzBdKSk7CisJCQlnZXRfZ3JvdXBzKHVzZXJuYW1lLCByZ2lkLCBncm91cHMsICZuKTsKKwkJfQorCQlpZiAobiA+IDApIHsKKwkJCS8qIFByaW50IHRoZSBsaXN0ICovCisJCQlwcmVmaXggPSAiIGdyb3Vwcz0iOworCQkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQkJCWlmIChvcHQgJiYgKGdyb3Vwc1tpXSA9PSByZ2lkIHx8IGdyb3Vwc1tpXSA9PSBlZ2lkKSkKKwkJCQkJY29udGludWU7CisJCQkJc3RhdHVzIHw9IHByaW50X2dyb3VwKGdyb3Vwc1tpXSwgb3B0ID8gIiAiIDogcHJlZml4KTsKKwkJCQlwcmVmaXggPSAiLCI7CisJCQl9CisJCX0gZWxzZSBpZiAobiA8IDApIHsgLyogZXJyb3IgaW4gZ2V0X2dyb3VwcygpICovCisJCQlpZiAoRU5BQkxFX0RFU0tUT1ApCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGdldCBncm91cHMiKTsKKwkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJCX0KKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZShncm91cHMpOworI2lmIEVOQUJMRV9TRUxJTlVYCisJCWlmIChpc19zZWxpbnV4X2VuYWJsZWQoKSkgeworCQkJaWYgKGdldGNvbigmc2NvbnRleHQpID09IDApCisJCQkJcHJpbnRmKCIgY29udGV4dD0lcyIsIHNjb250ZXh0KTsKKwkJfQorI2VuZGlmCisJfSBlbHNlIGlmIChvcHQgJiBQUklOVF9SRUFMKSB7CisJCWV1aWQgPSBydWlkOworCQllZ2lkID0gcmdpZDsKKwl9CisKKwlpZiAob3B0ICYgSlVTVF9VU0VSKQorCQlzdGF0dXMgfD0gcHJpbnRfdXNlcihldWlkLCBOVUxMKTsKKwllbHNlIGlmIChvcHQgJiBKVVNUX0dST1VQKQorCQlzdGF0dXMgfD0gcHJpbnRfZ3JvdXAoZWdpZCwgTlVMTCk7CisjaWYgRU5BQkxFX1NFTElOVVgKKwllbHNlIGlmIChvcHQgJiBKVVNUX0NPTlRFWFQpIHsKKwkJc2VsaW51eF9vcl9kaWUoKTsKKwkJaWYgKHVzZXJuYW1lIHx8IGdldGNvbigmc2NvbnRleHQpKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZ2V0IHByb2Nlc3MgY29udGV4dCVzIiwKKwkJCQl1c2VybmFtZSA/ICIgZm9yIGEgZGlmZmVyZW50IHVzZXIiIDogIiIpOworCQl9CisJCWZwdXRzKHNjb250ZXh0LCBzdGRvdXQpOworCX0KKwkvKiBmcmVlY29uKE5VTEwpIHNlZW1zIHRvIGJlIGhhcm1sZXNzICovCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmcmVlY29uKHNjb250ZXh0KTsKKyNlbmRpZgorCWJiX3B1dGNoYXIoJ1xuJyk7CisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChzdGF0dXMpOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2lkX3Rlc3Quc2ggYi9jb3JldXRpbHMvaWRfdGVzdC5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wZDY1ZjJhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL2lkX3Rlc3Quc2gKQEAgLTAsMCArMSwyNDQgQEAKKyMhL2Jpbi9iYXNoCisjIFRlc3Qgc2NyaXB0IGZvciBidXN5Ym94IGlkIHZzLiBjb3JldXRpbHMgaWQuCisjIE5lZWRzIHJvb3QgcHJpdmlsZWdlcyBmb3Igc29tZSB0ZXN0cy4KKworY3AgL3Vzci9iaW4vaWQgLgorQlVTWUJPWD0uL2J1c3lib3gKK0lEPS4vaWQKK0xJU1Q9YGF3ayAtRjogJ3sgcHJpbnRmICIlc1xuIiwgJDEgfScgL2V0Yy9wYXNzd2RgCitGTEFHX1VTRVJfRVhJU1RTPSJubyIKK1RFU1RfVVNFUj0iZjU4M2NhODg0YzFkOTM0NThmYjYxZWQxMzdmZjQ0ZjYiCisKK2VjaG8gInRlc3QgMTogaWQgW29wdGlvbnNdIG5vdXNlcm5hbWUiCitybSAtZiBmb28gYmFyCitmb3IgT1BUSU9OUyBpbiAiIiAiLXUiICItdW4iICItdW5yIiAiLWciICItZ24iICItZ25yIiAiLUciICItR24iICItR25yIgorZG8KKwkjZWNobyAiJE9QVElPTlMiCisJJEJVU1lCT1ggaWQgJE9QVElPTlMgPmZvbyAyPi9kZXYvbnVsbAorCVJFVDE9JD8KKwkkSUQgJE9QVElPTlMgPmJhciAyPi9kZXYvbnVsbAorCVJFVDI9JD8KKwlpZiB0ZXN0ICIkUkVUMSIgIT0gIiRSRVQyIjsgdGhlbgorCQllY2hvICJSZXR1cm4gVmFsdWVzIGRpZmZlciAoJFJFVDEgIT0gJFJFVDIpOiBvcHRpb25zICRPUFRJT05TIgorCWZpCisJZGlmZiBmb28gYmFyCitkb25lCisKK2VjaG8gInRlc3QgMjogaWQgW29wdGlvbnNdIHVzZXJuYW1lIgorcm0gLWYgZm9vIGJhcgorZm9yIE9QVElPTlMgaW4gIiIgIi11IiAiLXVuIiAiLXVuciIgIi1nIiAiLWduIiAiLWduciIgIi1HIiAiLUduIiAiLUduciIKK2RvCisJI2VjaG8gIiRPUFRJT05TIgorCWZvciBpIGluICRMSVNUIDsgZG8KKwkJaWYgdGVzdCAiJGkiID0gIiRURVNUX1VTRVIiOyB0aGVuCisJCQlGTEFHX1VTRVJfRVhJU1RTPSJ5ZXMiCisJCWZpCisJCSRCVVNZQk9YIGlkICRPUFRJT05TICRpID5mb28gMj4vZGV2L251bGwKKwkJUkVUMT0kPworCQkkSUQgJE9QVElPTlMgJGkgPmJhciAyPi9kZXYvbnVsbAorCQlSRVQyPSQ/CisJCWlmIHRlc3QgIiRSRVQxIiAhPSAiJFJFVDIiOyB0aGVuCisJCQllY2hvICJSZXR1cm4gVmFsdWVzIGRpZmZlciAoJFJFVDEgIT0gJFJFVDIpOiBvcHRpb25zICRPUFRJT05TIgorCQlmaQorCQlkaWZmIGZvbyBiYXIKKwlkb25lCitkb25lCisKK2lmIHRlc3QgJEZMQUdfVVNFUl9FWElTVFMgPSAieWVzIjsgdGhlbgorCWVjaG8gInRlc3QgMyw0LDUsNiw3LDgsOSwxMCwxMSwxMiBza2lwcGVkIGJlY2F1c2UgdGVzdCB1c2VyICRURVNUX1VTRVIgYWxyZWFkeSBleGlzdHMiCisJcm0gLWYgZm9vIGJhcgorCWV4aXQgMQorZmkKKworYWRkdXNlciAtcyAvYmluL3RydWUgLWcgIiIgLUggLUQgIiRURVNUX1VTRVIiIHx8IGV4aXQgMQorCitjaG93biAkVEVTVF9VU0VSLiRURVNUX1VTRVIgJEJVU1lCT1gKK2NobW9kIHUrcyAkQlVTWUJPWCAyPiYxIC9kZXYvbnVsbAorY2hvd24gJFRFU1RfVVNFUi4kVEVTVF9VU0VSICRJRAorY2htb2QgdStzICRJRCAyPiYxIC9kZXYvbnVsbAorCitlY2hvICJ0ZXN0IDMgc2V0dWlkLCBleGlzdGluZyB1c2VyOiBpZCBbb3B0aW9uc10gbm8gdXNlcm5hbWUiCitybSAtZiBmb28gYmFyCitmb3IgT1BUSU9OUyBpbiAiIiAiLXUiICItdW4iICItdW5yIiAiLWciICItZ24iICItZ25yIiAiLUciICItR24iICItR25yIgorZG8KKwkjZWNobyAiJE9QVElPTlMiCisJJEJVU1lCT1ggaWQgJE9QVElPTlMgPmZvbyAyPi9kZXYvbnVsbAorCVJFVDE9JD8KKwkkSUQgJE9QVElPTlMgPmJhciAyPi9kZXYvbnVsbAorCVJFVDI9JD8KKwlpZiB0ZXN0ICIkUkVUMSIgIT0gIiRSRVQyIjsgdGhlbgorCQllY2hvICJSZXR1cm4gVmFsdWVzIGRpZmZlciAoJFJFVDEgIT0gJFJFVDIpOiBvcHRpb25zICRPUFRJT05TIgorCWZpCisJZGlmZiBmb28gYmFyCisJI2RvbmUKK2RvbmUKKworZWNobyAidGVzdCA0IHNldHVpZCwgZXhpc3RpbmcgdXNlcjogaWQgW29wdGlvbnNdIHVzZXJuYW1lIgorcm0gLWYgZm9vIGJhcgorZm9yIE9QVElPTlMgaW4gIiIgIi11IiAiLXVuIiAiLXVuciIgIi1nIiAiLWduIiAiLWduciIgIi1HIiAiLUduIiAiLUduciIKK2RvCisJI2VjaG8gIiRPUFRJT05TIgorCWZvciBpIGluICRMSVNUIDsgZG8KKwkJJEJVU1lCT1ggaWQgJE9QVElPTlMgJGkgPmZvbyAyPi9kZXYvbnVsbAorCQlSRVQxPSQ/CisJCSRJRCAkT1BUSU9OUyAkaSA+YmFyIDI+L2Rldi9udWxsCisJCVJFVDI9JD8KKwkJaWYgdGVzdCAiJFJFVDEiICE9ICIkUkVUMiI7IHRoZW4KKwkJCWVjaG8gIlJldHVybiBWYWx1ZXMgZGlmZmVyICgkUkVUMSAhPSAkUkVUMik6IG9wdGlvbnMgJE9QVElPTlMiCisJCWZpCisJCWRpZmYgZm9vIGJhcgorCWRvbmUKK2RvbmUKKworY2hvd24gJFRFU1RfVVNFUi4kVEVTVF9VU0VSICRCVVNZQk9YCitjaG1vZCBnK3MgJEJVU1lCT1ggMj4mMSAvZGV2L251bGwKK2Nob3duICRURVNUX1VTRVIuJFRFU1RfVVNFUiAkSUQKK2NobW9kIGcrcyAkSUQgMj4mMSAvZGV2L251bGwKKworZWNobyAidGVzdCA1IHNldGdpZCwgZXhpc3RpbmcgdXNlcjogaWQgW29wdGlvbnNdIG5vIHVzZXJuYW1lIgorcm0gLWYgZm9vIGJhcgorZm9yIE9QVElPTlMgaW4gIiIgIi11IiAiLXVuIiAiLXVuciIgIi1nIiAiLWduIiAiLWduciIgIi1HIiAiLUduIiAiLUduciIKK2RvCisJI2VjaG8gIiRPUFRJT05TIgorCSRCVVNZQk9YIGlkICRPUFRJT05TID5mb28gMj4vZGV2L251bGwKKwlSRVQxPSQ/CisJJElEICRPUFRJT05TID5iYXIgMj4vZGV2L251bGwKKwlSRVQyPSQ/CisJaWYgdGVzdCAiJFJFVDEiICE9ICIkUkVUMiI7IHRoZW4KKwkJZWNobyAiUmV0dXJuIFZhbHVlcyBkaWZmZXIgKCRSRVQxICE9ICRSRVQyKTogb3B0aW9ucyAkT1BUSU9OUyIKKwlmaQorCWRpZmYgZm9vIGJhcgorCSNkb25lCitkb25lCisKK2VjaG8gInRlc3QgNiBzZXRnaWQsIGV4aXN0aW5nIHVzZXI6IGlkIFtvcHRpb25zXSB1c2VybmFtZSIKK3JtIC1mIGZvbyBiYXIKK2ZvciBPUFRJT05TIGluICIiICItdSIgIi11biIgIi11bnIiICItZyIgIi1nbiIgIi1nbnIiICItRyIgIi1HbiIgIi1HbnIiCitkbworCSNlY2hvICIkT1BUSU9OUyIKKwlmb3IgaSBpbiAkTElTVCA7IGRvCisJCSRCVVNZQk9YIGlkICRPUFRJT05TICRpID5mb28gMj4vZGV2L251bGwKKwkJUkVUMT0kPworCQkkSUQgJE9QVElPTlMgJGkgPmJhciAyPi9kZXYvbnVsbAorCQlSRVQyPSQ/CisJCWlmIHRlc3QgIiRSRVQxIiAhPSAiJFJFVDIiOyB0aGVuCisJCQllY2hvICJSZXR1cm4gVmFsdWVzIGRpZmZlciAoJFJFVDEgIT0gJFJFVDIpOiBvcHRpb25zICRPUFRJT05TIgorCQlmaQorCQlkaWZmIGZvbyBiYXIKKwlkb25lCitkb25lCisKK2Nob3duICRURVNUX1VTRVIuJFRFU1RfVVNFUiAkQlVTWUJPWAorY2htb2QgdStzLGcrcyAkQlVTWUJPWCAyPiYxIC9kZXYvbnVsbAorY2hvd24gJFRFU1RfVVNFUi4kVEVTVF9VU0VSICRJRAorY2htb2QgdStzLGcrcyAkSUQgMj4mMSAvZGV2L251bGwKKworZWNobyAidGVzdCA3IHNldHVpZCwgc2V0Z2lkLCBleGlzdGluZyB1c2VyOiBpZCBbb3B0aW9uc10gbm8gdXNlcm5hbWUiCitybSAtZiBmb28gYmFyCitmb3IgT1BUSU9OUyBpbiAiIiAiLXUiICItdW4iICItdW5yIiAiLWciICItZ24iICItZ25yIiAiLUciICItR24iICItR25yIgorZG8KKwkjZWNobyAiJE9QVElPTlMiCisJJEJVU1lCT1ggaWQgJE9QVElPTlMgPmZvbyAyPi9kZXYvbnVsbAorCVJFVDE9JD8KKwkkSUQgJE9QVElPTlMgPmJhciAyPi9kZXYvbnVsbAorCVJFVDI9JD8KKwlpZiB0ZXN0ICIkUkVUMSIgIT0gIiRSRVQyIjsgdGhlbgorCQllY2hvICJSZXR1cm4gVmFsdWVzIGRpZmZlciAoJFJFVDEgIT0gJFJFVDIpOiBvcHRpb25zICRPUFRJT05TIgorCWZpCisJZGlmZiBmb28gYmFyCisJI2RvbmUKK2RvbmUKKworZWNobyAidGVzdCA4IHNldHVpZCwgc2V0Z2lkLCBleGlzdGluZyB1c2VyOiBpZCBbb3B0aW9uc10gdXNlcm5hbWUiCitybSAtZiBmb28gYmFyCitmb3IgT1BUSU9OUyBpbiAiIiAiLXUiICItdW4iICItdW5yIiAiLWciICItZ24iICItZ25yIiAiLUciICItR24iICItR25yIgorZG8KKwkjZWNobyAiJE9QVElPTlMiCisJZm9yIGkgaW4gJExJU1QgOyBkbworCQkkQlVTWUJPWCBpZCAkT1BUSU9OUyAkaSA+Zm9vIDI+L2Rldi9udWxsCisJCVJFVDE9JD8KKwkJJElEICRPUFRJT05TICRpID5iYXIgMj4vZGV2L251bGwKKwkJUkVUMj0kPworCQlpZiB0ZXN0ICIkUkVUMSIgIT0gIiRSRVQyIjsgdGhlbgorCQkJZWNobyAiUmV0dXJuIFZhbHVlcyBkaWZmZXIgKCRSRVQxICE9ICRSRVQyKTogb3B0aW9ucyAkT1BUSU9OUyIKKwkJZmkKKwkJZGlmZiBmb28gYmFyCisJZG9uZQorZG9uZQorCitkZWx1c2VyICRURVNUX1VTRVIgfHwgZXhpdCAxCisKK2VjaG8gInRlc3QgOSBzZXR1aWQsIHNldGdpZCwgbm90IGV4aXN0aW5nIHVzZXI6IGlkIFtvcHRpb25zXSBubyB1c2VybmFtZSIKK3JtIC1mIGZvbyBiYXIKK2ZvciBPUFRJT05TIGluICIiICItdSIgIi11biIgIi11bnIiICItZyIgIi1nbiIgIi1nbnIiICItRyIgIi1HbiIgIi1HbnIiCitkbworCSNlY2hvICIkT1BUSU9OUyIKKwkkQlVTWUJPWCBpZCAkT1BUSU9OUyA+Zm9vIDI+L2Rldi9udWxsCisJUkVUMT0kPworCSRJRCAkT1BUSU9OUyA+YmFyIDI+L2Rldi9udWxsCisJUkVUMj0kPworCWlmIHRlc3QgIiRSRVQxIiAhPSAiJFJFVDIiOyB0aGVuCisJCWVjaG8gIlJldHVybiBWYWx1ZXMgZGlmZmVyICgkUkVUMSAhPSAkUkVUMik6IG9wdGlvbnMgJE9QVElPTlMiCisJZmkKKwlkaWZmIGZvbyBiYXIKK2RvbmUKKworZWNobyAidGVzdCAxMCBzZXR1aWQsIHNldGdpZCwgbm90IGV4aXN0aW5nIHVzZXI6IGlkIFtvcHRpb25zXSB1c2VybmFtZSIKK3JtIC1mIGZvbyBiYXIKK2ZvciBPUFRJT05TIGluICIiICItdSIgIi11biIgIi11bnIiICItZyIgIi1nbiIgIi1nbnIiICItRyIgIi1HbiIgIi1HbnIiCitkbworCSNlY2hvICIkT1BUSU9OUyIKKwlmb3IgaSBpbiAkTElTVCA7IGRvCisJCSRCVVNZQk9YIGlkICRPUFRJT05TICRpID5mb28gMj4vZGV2L251bGwKKwkJUkVUMT0kPworCQkkSUQgJE9QVElPTlMgJGkgPmJhciAyPi9kZXYvbnVsbAorCQlSRVQyPSQ/CisJCWlmIHRlc3QgIiRSRVQxIiAhPSAiJFJFVDIiOyB0aGVuCisJCQllY2hvICJSZXR1cm4gVmFsdWVzIGRpZmZlciAoJFJFVDEgIT0gJFJFVDIpOiBvcHRpb25zICRPUFRJT05TIgorCQlmaQorCQlkaWZmIGZvbyBiYXIKKwlkb25lCitkb25lCisKK2Nob3duIC5yb290ICRCVVNZQk9YIDI+JjEgL2Rldi9udWxsCitjaG93biAucm9vdCAkSUQgMj4mMSAvZGV2L251bGwKK2NobW9kIGcrcyAkQlVTWUJPWCAyPiYxIC9kZXYvbnVsbAorY2htb2QgZytzICRJRCAyPiYxIC9kZXYvbnVsbAorCitlY2hvICJ0ZXN0IDExIHNldGdpZCwgbm90IGV4aXN0aW5nIGdyb3VwOiBpZCBbb3B0aW9uc10gbm8gdXNlcm5hbWUiCitybSAtZiBmb28gYmFyCitmb3IgT1BUSU9OUyBpbiAiIiAiLXUiICItdW4iICItdW5yIiAiLWciICItZ24iICItZ25yIiAiLUciICItR24iICItR25yIgorZG8KKwkjZWNobyAiJE9QVElPTlMiCisJJEJVU1lCT1ggaWQgJE9QVElPTlMgPmZvbyAyPi9kZXYvbnVsbAorCVJFVDE9JD8KKwkkSUQgJE9QVElPTlMgPmJhciAyPi9kZXYvbnVsbAorCVJFVDI9JD8KKwlpZiB0ZXN0ICIkUkVUMSIgIT0gIiRSRVQyIjsgdGhlbgorCQllY2hvICJSZXR1cm4gVmFsdWVzIGRpZmZlciAoJFJFVDEgIT0gJFJFVDIpOiBvcHRpb25zICRPUFRJT05TIgorCWZpCisJZGlmZiBmb28gYmFyCisJI2RvbmUKK2RvbmUKKworZWNobyAidGVzdCAxMiBzZXRnaWQsIG5vdCBleGlzdGluZyBncm91cDogaWQgW29wdGlvbnNdIHVzZXJuYW1lIgorcm0gLWYgZm9vIGJhcgorZm9yIE9QVElPTlMgaW4gIiIgIi11IiAiLXVuIiAiLXVuciIgIi1nIiAiLWduIiAiLWduciIgIi1HIiAiLUduIiAiLUduciIKK2RvCisJI2VjaG8gIiRPUFRJT05TIgorCWZvciBpIGluICRMSVNUIDsgZG8KKwkJJEJVU1lCT1ggaWQgJE9QVElPTlMgJGkgPmZvbyAyPi9kZXYvbnVsbAorCQlSRVQxPSQ/CisJCSRJRCAkT1BUSU9OUyAkaSA+YmFyIDI+L2Rldi9udWxsCisJCVJFVDI9JD8KKwkJaWYgdGVzdCAiJFJFVDEiICE9ICIkUkVUMiI7IHRoZW4KKwkJCWVjaG8gIlJldHVybiBWYWx1ZXMgZGlmZmVyICgkUkVUMSAhPSAkUkVUMik6IG9wdGlvbnMgJE9QVElPTlMiCisJCWZpCisJCWRpZmYgZm9vIGJhcgorCWRvbmUKK2RvbmUKKworY2hvd24gcm9vdC5yb290ICRCVVNZQk9YIDI+JjEgL2Rldi9udWxsCitjaG93biByb290LnJvb3QgJElEIDI+JjEgL2Rldi9udWxsCitybSAtZiAkSUQKK3JtIC1mIGZvbyBiYXIKZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9pbnN0YWxsLmMgYi9jb3JldXRpbHMvaW5zdGFsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYTUxY2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvaW5zdGFsbC5jCkBAIC0wLDAgKzEsMjQ0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgYnkgR2xlbm4gTWNHcmF0aAorICogU0VMaW51eCBzdXBwb3J0OiBieSBZdWljaGkgTmFrYW11cmEgPHluYWthbUBoaXRhY2hpc29mdC5qcD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIC12LCAtYiwgLWMgYXJlIGlnbm9yZWQgKi8KKy8vdXNhZ2U6I2RlZmluZSBpbnN0YWxsX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSJbLWNkRHNwXSBbLW8gVVNFUl0gWy1nIEdSUF0gWy1tIE1PREVdIFstdCBESVJdIFtTT1VSQ0VdLi4uIERFU1QiCisvL3VzYWdlOiNkZWZpbmUgaW5zdGFsbF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvcHkgZmlsZXMgYW5kIHNldCBhdHRyaWJ1dGVzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCUp1c3QgY29weSAoZGVmYXVsdCkiCisvL3VzYWdlOiAgICAgIlxuCS1kCUNyZWF0ZSBkaXJlY3RvcmllcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUQJQ3JlYXRlIGxlYWRpbmcgdGFyZ2V0IGRpcmVjdG9yaWVzIgorLy91c2FnZTogICAgICJcbgktcwlTdHJpcCBzeW1ib2wgdGFibGUiCisvL3VzYWdlOiAgICAgIlxuCS1wCVByZXNlcnZlIGRhdGUiCisvL3VzYWdlOiAgICAgIlxuCS1vIFVTRVIJU2V0IG93bmVyc2hpcCIKKy8vdXNhZ2U6ICAgICAiXG4JLWcgR1JQCVNldCBncm91cCBvd25lcnNoaXAiCisvL3VzYWdlOiAgICAgIlxuCS1tIE1PREUJU2V0IHBlcm1pc3Npb25zIgorLy91c2FnZTogICAgICJcbgktdCBESVIJSW5zdGFsbCB0byBESVIiCisvL3VzYWdlOglJRl9TRUxJTlVYKAorLy91c2FnZTogICAgICJcbgktWglTZXQgc2VjdXJpdHkgY29udGV4dCIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibGliY29yZXV0aWxzL2NvcmV1dGlscy5oIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5TVEFMTF9MT05HX09QVElPTlMKK3N0YXRpYyBjb25zdCBjaGFyIGluc3RhbGxfbG9uZ29wdHNbXSBBTElHTjEgPQorCUlGX0ZFQVRVUkVfVkVSQk9TRSgKKwkidmVyYm9zZVwwIiAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAidiIKKwkpCisJImRpcmVjdG9yeVwwIiAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImQiCisJInByZXNlcnZlLXRpbWVzdGFtcHNcMCIgTm9fYXJndW1lbnQgICAgICAgInAiCisJInN0cmlwXDAiICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInMiCisJImdyb3VwXDAiICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgImciCisJIm1vZGVcMCIgICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIm0iCisJIm93bmVyXDAiICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIm8iCisJInRhcmdldC1kaXJlY3RvcnlcMCIJUmVxdWlyZWRfYXJndW1lbnQgInQiCisvKiBhdXRvZnMgYnVpbGQgaW5zaXN0cyBvZiB1c2luZyAtYiAtLXN1ZmZpeD0ub3JpZyAqLworLyogVE9ETz8gKHNob3J0IG9wdGlvbiBmb3IgLS1zdWZmaXggaXMgLVMpICovCisjaWYgRU5BQkxFX1NFTElOVVgKKwkiY29udGV4dFwwIiAgICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiWiIKKwkicHJlc2VydmVfY29udGV4dFwwIiAgICBOb19hcmd1bWVudCAgICAgICAiXHhmZiIKKwkicHJlc2VydmUtY29udGV4dFwwIiAgICBOb19hcmd1bWVudCAgICAgICAiXHhmZiIKKyNlbmRpZgorCTsKKyNlbmRpZgorCisKKyNpZiBFTkFCTEVfU0VMSU5VWAorc3RhdGljIHZvaWQgc2V0ZGVmYXVsdGZpbGVjb24oY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzOworCXNlY3VyaXR5X2NvbnRleHRfdCBzY29udGV4dCA9IE5VTEw7CisKKwlpZiAoIWlzX3NlbGludXhfZW5hYmxlZCgpKSB7CisJCXJldHVybjsKKwl9CisJaWYgKGxzdGF0KHBhdGgsICZzKSAhPSAwKSB7CisJCXJldHVybjsKKwl9CisKKwlpZiAobWF0Y2hwYXRoY29uKHBhdGgsIHMuc3RfbW9kZSwgJnNjb250ZXh0KSA8IDApIHsKKwkJZ290byBvdXQ7CisJfQorCWlmIChzdHJjbXAoc2NvbnRleHQsICI8PG5vbmU+PiIpID09IDApIHsKKwkJZ290byBvdXQ7CisJfQorCisJaWYgKGxzZXRmaWxlY29uKHBhdGgsIHNjb250ZXh0KSA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVOT1RTVVApIHsKKwkJCWJiX3BlcnJvcl9tc2coIndhcm5pbmc6IGNhbid0IGNoYW5nZSBjb250ZXh0IgorCQkJCQkiIG9mICVzIHRvICVzIiwgcGF0aCwgc2NvbnRleHQpOworCQl9CisJfQorCisgb3V0OgorCWZyZWVjb24oc2NvbnRleHQpOworfQorCisjZW5kaWYKKworaW50IGluc3RhbGxfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGluc3RhbGxfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwltb2RlX3QgbW9kZTsKKwl1aWRfdCB1aWQ7CisJZ2lkX3QgZ2lkOworCWNoYXIgKmFyZywgKmxhc3Q7CisJY29uc3QgY2hhciAqZ2lkX3N0cjsKKwljb25zdCBjaGFyICp1aWRfc3RyOworCWNvbnN0IGNoYXIgKm1vZGVfc3RyOworCWludCBta2Rpcl9mbGFncyA9IEZJTEVVVElMU19SRUNVUjsKKwlpbnQgY29weV9mbGFncyA9IEZJTEVVVElMU19ERVJFRkVSRU5DRSB8IEZJTEVVVElMU19GT1JDRTsKKwlpbnQgb3B0czsKKwlpbnQgcmV0ID0gRVhJVF9TVUNDRVNTOworCWludCBpc2RpcjsKKyNpZiBFTkFCTEVfU0VMSU5VWAorCXNlY3VyaXR5X2NvbnRleHRfdCBzY29udGV4dDsKKwlib29sIHVzZV9kZWZhdWx0X3NlbGludXhfY29udGV4dCA9IDE7CisjZW5kaWYKKwllbnVtIHsKKwkJT1BUX2MgICAgICAgICAgICAgPSAxIDw8IDAsCisJCU9QVF92ICAgICAgICAgICAgID0gMSA8PCAxLAorCQlPUFRfYiAgICAgICAgICAgICA9IDEgPDwgMiwKKwkJT1BUX01LRElSX0xFQURJTkcgPSAxIDw8IDMsCisJCU9QVF9ESVJFQ1RPUlkgICAgID0gMSA8PCA0LAorCQlPUFRfUFJFU0VSVkVfVElNRSA9IDEgPDwgNSwKKwkJT1BUX1NUUklQICAgICAgICAgPSAxIDw8IDYsCisJCU9QVF9HUk9VUCAgICAgICAgID0gMSA8PCA3LAorCQlPUFRfTU9ERSAgICAgICAgICA9IDEgPDwgOCwKKwkJT1BUX09XTkVSICAgICAgICAgPSAxIDw8IDksCisJCU9QVF9UQVJHRVQgICAgICAgID0gMSA8PCAxMCwKKyNpZiBFTkFCTEVfU0VMSU5VWAorCQlPUFRfU0VUX1NFQ1VSSVRZX0NPTlRFWFQgPSAxIDw8IDExLAorCQlPUFRfUFJFU0VSVkVfU0VDVVJJVFlfQ09OVEVYVCA9IDEgPDwgMTIsCisjZW5kaWYKKwl9OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5TVEFMTF9MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gaW5zdGFsbF9sb25nb3B0czsKKyNlbmRpZgorCW9wdF9jb21wbGVtZW50YXJ5ID0gInQtLWQ6ZC0tdDpzLS1kOmQtLXMiIElGX0ZFQVRVUkVfSU5TVEFMTF9MT05HX09QVElPTlMoSUZfU0VMSU5VWCgiOlotLVx4ZmY6XHhmZi0tWiIpKTsKKwkvKiAtYyBleGlzdHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBpdCdzIG5lZWRlZCAqLworCS8qIC1iIGlzIGlnbm9yZWQgKCJtYWtlIGEgYmFja3VwIG9mIGVhY2ggZXhpc3RpbmcgZGVzdGluYXRpb24gZmlsZSIpICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJjdmIiICJEZHBzZzptOm86dDoiIElGX1NFTElOVVgoIlo6IiksCisJCQkmZ2lkX3N0ciwgJm1vZGVfc3RyLCAmdWlkX3N0ciwgJmxhc3QKKwkJCUlGX1NFTElOVVgoLCAmc2NvbnRleHQpKTsKKwlhcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworI2lmIEVOQUJMRV9TRUxJTlVYCisJaWYgKG9wdHMgJiAoT1BUX1BSRVNFUlZFX1NFQ1VSSVRZX0NPTlRFWFR8T1BUX1NFVF9TRUNVUklUWV9DT05URVhUKSkgeworCQlzZWxpbnV4X29yX2RpZSgpOworCQl1c2VfZGVmYXVsdF9zZWxpbnV4X2NvbnRleHQgPSAwOworCQlpZiAob3B0cyAmIE9QVF9QUkVTRVJWRV9TRUNVUklUWV9DT05URVhUKSB7CisJCQljb3B5X2ZsYWdzIHw9IEZJTEVVVElMU19QUkVTRVJWRV9TRUNVUklUWV9DT05URVhUOworCQl9CisJCWlmIChvcHRzICYgT1BUX1NFVF9TRUNVUklUWV9DT05URVhUKSB7CisJCQlzZXRmc2NyZWF0ZWNvbl9vcl9kaWUoc2NvbnRleHQpOworCQkJY29weV9mbGFncyB8PSBGSUxFVVRJTFNfU0VUX1NFQ1VSSVRZX0NPTlRFWFQ7CisJCX0KKwl9CisjZW5kaWYKKworCWlmICgob3B0cyAmIE9QVF92KSAmJiBGSUxFVVRJTFNfVkVSQk9TRSkgeworCQlta2Rpcl9mbGFncyB8PSBGSUxFVVRJTFNfVkVSQk9TRTsKKwkJY29weV9mbGFncyB8PSBGSUxFVVRJTFNfVkVSQk9TRTsKKwl9CisKKwkvKiBwcmVzZXJ2ZSBhY2Nlc3MgYW5kIG1vZGlmaWNhdGlvbiB0aW1lLCB0aGlzIGlzIEdOVSBiZWhhdmlvdXIsCisJICogQlNEIG9ubHkgcHJlc2VydmVzIG1vZGlmaWNhdGlvbiB0aW1lICovCisJaWYgKG9wdHMgJiBPUFRfUFJFU0VSVkVfVElNRSkgeworCQljb3B5X2ZsYWdzIHw9IEZJTEVVVElMU19QUkVTRVJWRV9TVEFUVVM7CisJfQorCW1vZGUgPSAwNzU1OyAvKiBHTlUgY29yZXV0aWxzIDYuMTAgY29tcGF0ICovCisJaWYgKG9wdHMgJiBPUFRfTU9ERSkKKwkJbW9kZSA9IGJiX3BhcnNlX21vZGUobW9kZV9zdHIsIG1vZGUpOworCXVpZCA9IChvcHRzICYgT1BUX09XTkVSKSA/IGdldF91Z19pZCh1aWRfc3RyLCB4dW5hbWUydWlkKSA6IGdldHVpZCgpOworCWdpZCA9IChvcHRzICYgT1BUX0dST1VQKSA/IGdldF91Z19pZChnaWRfc3RyLCB4Z3JvdXAyZ2lkKSA6IGdldGdpZCgpOworCisJLyogSWYgLXQgRElSIGlzIGluIHVzZSwgdGhlbiBpc2Rpcj10cnVlLCBsYXN0PSJESVIiICovCisJaXNkaXIgPSAob3B0cyAmIE9QVF9UQVJHRVQpOworCWlmICghKG9wdHMgJiAoT1BUX1RBUkdFVHxPUFRfRElSRUNUT1JZKSkpIHsKKwkJLyogTmVpdGhlciAtdCBESVIgbm9yIC1kIGlzIGluIHVzZSAqLworCQlhcmdjLS07CisJCWxhc3QgPSBhcmd2W2FyZ2NdOworCQlhcmd2W2FyZ2NdID0gTlVMTDsKKwkJLyogY29yZXV0aWxzIGluc3RhbGwgcmVzb2x2ZXMgbGluayBpbiB0aGlzIGNhc2UsIGRvbid0IHVzZSBsc3RhdCAqLworCQlpc2RpciA9IHN0YXQobGFzdCwgJnN0YXRidWYpIDwgMCA/IDAgOiBTX0lTRElSKHN0YXRidWYuc3RfbW9kZSk7CisJfQorCisJaWYgKGFyZ2MgPCAxKQorCQliYl9zaG93X3VzYWdlKCk7CisKKwl3aGlsZSAoKGFyZyA9ICphcmd2KyspICE9IE5VTEwpIHsKKwkJY2hhciAqZGVzdDsKKworCQlpZiAob3B0cyAmIE9QVF9ESVJFQ1RPUlkpIHsKKwkJCWRlc3QgPSBhcmc7CisJCQkvKiBHTlUgY29yZXV0aWxzIDYuOSBkb2VzIG5vdCBzZXQgdWlkOmdpZAorCQkJICogb24gaW50ZXJtZWRpYXRlIGNyZWF0ZWQgZGlyZWN0b3JpZXMKKwkJCSAqIChvbmx5IG9uIGxhc3Qgb25lKSAqLworCQkJaWYgKGJiX21ha2VfZGlyZWN0b3J5KGRlc3QsIDA3NTUsIG1rZGlyX2ZsYWdzKSkgeworCQkJCXJldCA9IEVYSVRfRkFJTFVSRTsKKwkJCQlnb3RvIG5leHQ7CisJCQl9CisJCX0gZWxzZSB7CisJCQlkZXN0ID0gbGFzdDsKKwkJCWlmIChvcHRzICYgT1BUX01LRElSX0xFQURJTkcpIHsKKwkJCQljaGFyICpkZGlyID0geHN0cmR1cChkZXN0KTsKKwkJCQliYl9tYWtlX2RpcmVjdG9yeShkaXJuYW1lKGRkaXIpLCAwNzU1LCBta2Rpcl9mbGFncyk7CisJCQkJLyogZXJyb3JzIGFyZSBub3QgY2hlY2tlZC4gY29weV9maWxlCisJCQkJICogd2lsbCBmYWlsIGlmIGRpciBpcyBub3QgY3JlYXRlZC4gKi8KKwkJCQlmcmVlKGRkaXIpOworCQkJfQorCQkJaWYgKGlzZGlyKQorCQkJCWRlc3QgPSBjb25jYXRfcGF0aF9maWxlKGxhc3QsIGJiX2Jhc2VuYW1lKGFyZykpOworCQkJaWYgKGNvcHlfZmlsZShhcmcsIGRlc3QsIGNvcHlfZmxhZ3MpICE9IDApIHsKKwkJCQkvKiBjb3B5IGlzIG5vdCBtYWRlICovCisJCQkJcmV0ID0gRVhJVF9GQUlMVVJFOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJCWlmIChvcHRzICYgT1BUX1NUUklQKSB7CisJCQkJY2hhciAqYXJnc1s0XTsKKwkJCQlhcmdzWzBdID0gKGNoYXIqKSJzdHJpcCI7CisJCQkJYXJnc1sxXSA9IChjaGFyKikiLXAiOyAvKiAtcCAtLXByZXNlcnZlLWRhdGVzICovCisJCQkJYXJnc1syXSA9IGRlc3Q7CisJCQkJYXJnc1szXSA9IE5VTEw7CisJCQkJaWYgKHNwYXduX2FuZF93YWl0KGFyZ3MpKSB7CisJCQkJCWJiX3BlcnJvcl9tc2coInN0cmlwIik7CisJCQkJCXJldCA9IEVYSVRfRkFJTFVSRTsKKwkJCQl9CisJCQl9CisJCX0KKworCQkvKiBTZXQgdGhlIGZpbGUgbW9kZSAoYWx3YXlzLCBub3Qgb25seSB3aXRoIC1tKS4KKwkJICogR05VIGNvcmV1dGlscyA2LjEwIGlzIG5vdCBhZmZlY3RlZCBieSB1bWFzay4gKi8KKwkJaWYgKGNobW9kKGRlc3QsIG1vZGUpID09IC0xKSB7CisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjaGFuZ2UgJXMgb2YgJXMiLCAicGVybWlzc2lvbnMiLCBkZXN0KTsKKwkJCXJldCA9IEVYSVRfRkFJTFVSRTsKKwkJfQorI2lmIEVOQUJMRV9TRUxJTlVYCisJCWlmICh1c2VfZGVmYXVsdF9zZWxpbnV4X2NvbnRleHQpCisJCQlzZXRkZWZhdWx0ZmlsZWNvbihkZXN0KTsKKyNlbmRpZgorCQkvKiBTZXQgdGhlIHVzZXIgYW5kIGdyb3VwIGlkICovCisJCWlmICgob3B0cyAmIChPUFRfT1dORVJ8T1BUX0dST1VQKSkKKwkJICYmIGxjaG93bihkZXN0LCB1aWQsIGdpZCkgPT0gLTEKKwkJKSB7CisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjaGFuZ2UgJXMgb2YgJXMiLCAib3duZXJzaGlwIiwgZGVzdCk7CisJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCX0KKyBuZXh0OgorCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAgJiYgaXNkaXIpCisJCQlmcmVlKGRlc3QpOworCX0KKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvbGVuZ3RoLmMuZGlzYWJsZWQgYi9jb3JldXRpbHMvbGVuZ3RoLmMuZGlzYWJsZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlODk4ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9sZW5ndGguYy5kaXNhYmxlZApAQCAtMCwwICsxLDMxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIE4vQSAtLSBBcHBhcmVudGx5IGEgYnVzeWJveCAob2Jzb2xldGU/KSBleHRlbnNpb24uICovCisKKy8vdXNhZ2U6I2RlZmluZSBsZW5ndGhfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlNUUklORyIKKy8vdXNhZ2U6I2RlZmluZSBsZW5ndGhfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCBTVFJJTkcncyBsZW5ndGgiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGxlbmd0aF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBsZW5ndGggSGVsbG9cbiIKKy8vdXNhZ2U6ICAgICAgICI1XG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitpbnQgbGVuZ3RoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBsZW5ndGhfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKChhcmdjICE9IDIpIHx8ICgqKigrK2FyZ3YpID09ICctJykpIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCXByaW50ZigiJXVcbiIsICh1bnNpZ25lZClzdHJsZW4oKmFyZ3YpKTsKKworCXJldHVybiBmZmx1c2hfYWxsKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvbGliY29yZXV0aWxzL0tidWlsZC5zcmMgYi9jb3JldXRpbHMvbGliY29yZXV0aWxzL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA0MmQ1ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9saWJjb3JldXRpbHMvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDE0IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKK2xpYi0kKENPTkZJR19NS0ZJRk8pCSs9IGdldG9wdF9ta19maWZvX25vZC5vCitsaWItJChDT05GSUdfTUtOT0QpCSs9IGdldG9wdF9ta19maWZvX25vZC5vCitsaWItJChDT05GSUdfSU5TVEFMTCkJKz0gY3BfbXZfc3RhdC5vCitsaWItJChDT05GSUdfQ1ApCSs9IGNwX212X3N0YXQubworbGliLSQoQ09ORklHX01WKQkrPSBjcF9tdl9zdGF0Lm8KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9saWJjb3JldXRpbHMvY29yZXV0aWxzLmggYi9jb3JldXRpbHMvbGliY29yZXV0aWxzL2NvcmV1dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwN2QwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvbGliY29yZXV0aWxzL2NvcmV1dGlscy5oCkBAIC0wLDAgKzEsMjAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2lmbmRlZiBDT1JFVVRJTFNfSAorI2RlZmluZSBDT1JFVVRJTFNfSCAxCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCit0eXBlZGVmIGludCAoKnN0YXRfZnVuYykoY29uc3QgY2hhciAqZm4sIHN0cnVjdCBzdGF0ICpwcyk7CisKK2ludCBjcF9tdl9zdGF0Mihjb25zdCBjaGFyICpmbiwgc3RydWN0IHN0YXQgKmZuX3N0YXQsIHN0YXRfZnVuYyBzZikgRkFTVF9GVU5DOworaW50IGNwX212X3N0YXQoY29uc3QgY2hhciAqZm4sIHN0cnVjdCBzdGF0ICpmbl9zdGF0KSBGQVNUX0ZVTkM7CisKK21vZGVfdCBnZXRvcHRfbWtfZmlmb19ub2QoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JldXRpbHMvbGliY29yZXV0aWxzL2NwX212X3N0YXQuYyBiL2NvcmV1dGlscy9saWJjb3JldXRpbHMvY3BfbXZfc3RhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYTA3ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvbGliY29yZXV0aWxzL2NwX212X3N0YXQuYwpAQCAtMCwwICsxLDUwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBjb3JldXRpbHMgdXRpbGl0eSByb3V0aW5lCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJjb3JldXRpbHMuaCIKKworaW50IEZBU1RfRlVOQyBjcF9tdl9zdGF0Mihjb25zdCBjaGFyICpmbiwgc3RydWN0IHN0YXQgKmZuX3N0YXQsIHN0YXRfZnVuYyBzZikKK3sKKwlpZiAoc2YoZm4sIGZuX3N0YXQpIDwgMCkgeworCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVkVSQk9TRV9DUF9NRVNTQUdFCisJCQlpZiAoZXJybm8gPT0gRU5PVERJUikgeworCQkJCWJiX2Vycm9yX21zZygiY2FuJ3Qgc3RhdCAnJXMnOiBQYXRoIGhhcyBub24tZGlyZWN0b3J5IGNvbXBvbmVudCIsIGZuKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisjZW5kaWYKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IHN0YXQgJyVzJyIsIGZuKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJaWYgKFNfSVNESVIoZm5fc3RhdC0+c3RfbW9kZSkpIHsKKwkJcmV0dXJuIDM7CisJfQorCXJldHVybiAxOworfQorCitpbnQgRkFTVF9GVU5DIGNwX212X3N0YXQoY29uc3QgY2hhciAqZm4sIHN0cnVjdCBzdGF0ICpmbl9zdGF0KQoreworCXJldHVybiBjcF9tdl9zdGF0MihmbiwgZm5fc3RhdCwgc3RhdCk7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvbGliY29yZXV0aWxzL2dldG9wdF9ta19maWZvX25vZC5jIGIvY29yZXV0aWxzL2xpYmNvcmV1dGlscy9nZXRvcHRfbWtfZmlmb19ub2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzM3NWZmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL2xpYmNvcmV1dGlscy9nZXRvcHRfbWtfZmlmb19ub2QuYwpAQCAtMCwwICsxLDUwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBjb3JldXRpbHMgdXRpbGl0eSByb3V0aW5lCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICoKKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJjb3JldXRpbHMuaCIKKworbW9kZV90IEZBU1RfRlVOQyBnZXRvcHRfbWtfZmlmb19ub2QoY2hhciAqKmFyZ3YpCit7CisJbW9kZV90IG1vZGUgPSAwNjY2OworCWNoYXIgKnNtb2RlID0gTlVMTDsKKyNpZiBFTkFCTEVfU0VMSU5VWAorCXNlY3VyaXR5X2NvbnRleHRfdCBzY29udGV4dDsKKyNlbmRpZgorCWludCBvcHQ7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIm06IiBJRl9TRUxJTlVYKCJaOiIpLCAmc21vZGUgSUZfU0VMSU5VWCgsJnNjb250ZXh0KSk7CisJaWYgKG9wdCAmIDEpIHsKKwkJbW9kZSA9IGJiX3BhcnNlX21vZGUoc21vZGUsIG1vZGUpOworCQlpZiAobW9kZSAhPSAobW9kZV90KS0xKSAvKiBpZiBtb2RlIGlzIHZhbGlkICovCisJCQkvKiBtYWtlIGZ1dHVyZSBta25vZC9ta2ZpZm8gc2V0IG1vZGUgYml0cyBleGFjdGx5ICovCisJCQl1bWFzaygwKTsKKwl9CisKKyNpZiBFTkFCTEVfU0VMSU5VWAorCWlmIChvcHQgJiAyKSB7CisJCXNlbGludXhfb3JfZGllKCk7CisJCXNldGZzY3JlYXRlY29uX29yX2RpZShzY29udGV4dCk7CisJfQorI2VuZGlmCisKKwlyZXR1cm4gbW9kZTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9sbi5jIGIvY29yZXV0aWxzL2xuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY4ODE0OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9sbi5jCkBAIC0wLDAgKzEsMTQwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGxuIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50ICovCisvKiBCQl9BVURJVCBHTlUgb3B0aW9ucyBtaXNzaW5nOiAtZCwgLUYsIC1pLCBhbmQgLXYuICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2xuLmh0bWwgKi8KKworLy91c2FnZTojZGVmaW5lIGxuX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gVEFSR0VULi4uIExJTkt8RElSIgorLy91c2FnZTojZGVmaW5lIGxuX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ3JlYXRlIGEgbGluayBMSU5LIG9yIERJUi9UQVJHRVQgdG8gdGhlIHNwZWNpZmllZCBUQVJHRVQocylcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJTWFrZSBzeW1saW5rcyBpbnN0ZWFkIG9mIGhhcmRsaW5rcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJUmVtb3ZlIGV4aXN0aW5nIGRlc3RpbmF0aW9ucyIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JRG9uJ3QgZGVyZWZlcmVuY2Ugc3ltbGlua3MgLSB0cmVhdCBsaWtlIG5vcm1hbCBmaWxlIgorLy91c2FnZTogICAgICJcbgktYglNYWtlIGEgYmFja3VwIG9mIHRoZSB0YXJnZXQgKGlmIGV4aXN0cykgYmVmb3JlIGxpbmsgb3BlcmF0aW9uIgorLy91c2FnZTogICAgICJcbgktUyBzdWYJVXNlIHN1ZmZpeCBpbnN0ZWFkIG9mIH4gd2hlbiBtYWtpbmcgYmFja3VwIGZpbGVzIgorLy91c2FnZTogICAgICJcbgktVAkybmQgYXJnIG11c3QgYmUgYSBESVIiCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGxuX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGxuIC1zIEJ1c3lCb3ggL3RtcC9sc1xuIgorLy91c2FnZTogICAgICAgIiQgbHMgLWwgL3RtcC9sc1xuIgorLy91c2FnZTogICAgICAgImxyd3hyd3hyd3ggICAgMSByb290ICAgICByb290ICAgICAgICAgICAgNyBBcHIgMTIgMTg6MzkgbHMgLT4gQnVzeUJveCpcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKKworI2RlZmluZSBMTl9TWU1MSU5LICAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIExOX0ZPUkNFICAgICAgICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgTE5fTk9ERVJFRkVSRU5DRSAgICAoMSA8PCAyKQorI2RlZmluZSBMTl9CQUNLVVAgICAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIExOX1NVRkZJWCAgICAgICAgICAgKDEgPDwgNCkKKyNkZWZpbmUgTE5fVkVSQk9TRSAgICAgICAgICAoMSA8PCA1KQorI2RlZmluZSBMTl9MSU5LRklMRSAgICAgICAgICgxIDw8IDYpCisKK2ludCBsbl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbG5fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IHN0YXR1cyA9IEVYSVRfU1VDQ0VTUzsKKwlpbnQgb3B0czsKKwljaGFyICpsYXN0OworCWNoYXIgKnNyY19uYW1lOworCWNoYXIgKnNyYzsKKwljaGFyICpzdWZmaXggPSAoY2hhciopIn4iOworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJaW50ICgqbGlua19mdW5jKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMSI7IC8qIG1pbiBvbmUgYXJnICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJzZm5iUzp2VCIsICZzdWZmaXgpOworCisJbGFzdCA9IGFyZ3ZbYXJnYyAtIDFdOworCWFyZ3YgKz0gb3B0aW5kOworCWFyZ2MgLT0gb3B0aW5kOworCisJaWYgKChvcHRzICYgTE5fTElOS0ZJTEUpICYmIGFyZ2MgPiAyKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCItVCBhY2NlcHRzIDIgYXJncyBtYXgiKTsKKwl9CisKKwlpZiAoIWFyZ3ZbMV0pIHsKKwkJLyogImxuIFBBVEgvVE8vRklMRSIgLT4gImxuIFBBVEgvVE8vRklMRSBGSUxFIiAqLworCQkqLS1hcmd2ID0gbGFzdDsKKwkJLyogeHN0cmR1cCBpcyBuZWVkZWQ6ICJsbiAtcyBQQVRIL1RPL0ZJTEUvIiBpcyBlcXVpdmFsZW50IHRvCisJCSAqICJsbiAtcyBQQVRIL1RPL0ZJTEUvIEZJTEUiLCBub3QgImxuIC1zIFBBVEgvVE8vRklMRSBGSUxFIgorCQkgKi8KKwkJbGFzdCA9IGJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50X3N0cmlwKHhzdHJkdXAobGFzdCkpOworCX0KKworCWRvIHsKKwkJc3JjX25hbWUgPSBOVUxMOworCQlzcmMgPSBsYXN0OworCisJCWlmIChpc19kaXJlY3Rvcnkoc3JjLAorCQkgICAgICAgICAgICAgICAgKG9wdHMgJiBMTl9OT0RFUkVGRVJFTkNFKSBeIExOX05PREVSRUZFUkVOQ0UKKwkJICAgICAgICAgICAgICAgICkKKwkJKSB7CisJCQlpZiAob3B0cyAmIExOX0xJTktGSUxFKSB7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiclcycgaXMgYSBkaXJlY3RvcnkiLCBzcmMpOworCQkJfQorCQkJc3JjX25hbWUgPSB4c3RyZHVwKCphcmd2KTsKKwkJCXNyYyA9IGNvbmNhdF9wYXRoX2ZpbGUoc3JjLCBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9zdHJpcChzcmNfbmFtZSkpOworCQkJZnJlZShzcmNfbmFtZSk7CisJCQlzcmNfbmFtZSA9IHNyYzsKKwkJfQorCQlpZiAoIShvcHRzICYgTE5fU1lNTElOSykgJiYgc3RhdCgqYXJndiwgJnN0YXRidWYpKSB7CisJCQkvLyBjb3JldXRpbHM6ICJsbiBkYW5nbGluZ19zeW1saW5rIG5ld19oYXJkbGluayIgd29ya3MKKwkJCWlmIChsc3RhdCgqYXJndiwgJnN0YXRidWYpIHx8ICFTX0lTTE5LKHN0YXRidWYuc3RfbW9kZSkpIHsKKwkJCQliYl9zaW1wbGVfcGVycm9yX21zZygqYXJndik7CisJCQkJc3RhdHVzID0gRVhJVF9GQUlMVVJFOworCQkJCWZyZWUoc3JjX25hbWUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJaWYgKG9wdHMgJiBMTl9CQUNLVVApIHsKKwkJCWNoYXIgKmJhY2t1cDsKKwkJCWJhY2t1cCA9IHhhc3ByaW50ZigiJXMlcyIsIHNyYywgc3VmZml4KTsKKwkJCWlmIChyZW5hbWUoc3JjLCBiYWNrdXApIDwgMCAmJiBlcnJubyAhPSBFTk9FTlQpIHsKKwkJCQliYl9zaW1wbGVfcGVycm9yX21zZyhzcmMpOworCQkJCXN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJCQlmcmVlKGJhY2t1cCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlmcmVlKGJhY2t1cCk7CisJCQkvKgorCQkJICogV2hlbiB0aGUgc291cmNlIGFuZCBkZXN0IGFyZSBib3RoIGhhcmQgbGlua3MgdG8gdGhlIHNhbWUKKwkJCSAqIGlub2RlLCBhIHJlbmFtZSBtYXkgc3VjY2VlZCBldmVuIHRob3VnaCBub3RoaW5nIGhhcHBlbmVkLgorCQkJICogVGhlcmVmb3JlLCBhbHdheXMgdW5saW5rKCkuCisJCQkgKi8KKwkJCXVubGluayhzcmMpOworCQl9IGVsc2UgaWYgKG9wdHMgJiBMTl9GT1JDRSkgeworCQkJdW5saW5rKHNyYyk7CisJCX0KKworCQlsaW5rX2Z1bmMgPSBsaW5rOworCQlpZiAob3B0cyAmIExOX1NZTUxJTkspIHsKKwkJCWxpbmtfZnVuYyA9IHN5bWxpbms7CisJCX0KKworCQlpZiAob3B0cyAmIExOX1ZFUkJPU0UpIHsKKwkJCXByaW50ZigiJyVzJyAtPiAnJXMnXG4iLCBzcmMsICphcmd2KTsKKwkJfQorCisJCWlmIChsaW5rX2Z1bmMoKmFyZ3YsIHNyYykgIT0gMCkgeworCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coc3JjKTsKKwkJCXN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJfQorCisJCWZyZWUoc3JjX25hbWUpOworCX0gd2hpbGUgKCgrK2FyZ3YpWzFdKTsKKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvbG9nbmFtZS5jIGIvY29yZXV0aWxzL2xvZ25hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGI5NjE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL2xvZ25hbWUuYwpAQCAtMCwwICsxLDUyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGxvZ25hbWUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgIEVkd2FyZCBCZXR0cyA8ZWR3YXJkQGRlYmlhbi5vcmc+LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50ICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2xvZ25hbWUuaHRtbCAqLworCisvKiBNYXIgMTYsIDIwMDMgICAgICBNYW51ZWwgTm92b2EgSUlJICAgKG1qbjNAY29kZXBvZXQub3JnKQorICoKKyAqIFNVU3YzIHNwZWNpZmllcyB0aGUgc3RyaW5nIHVzZWQgaXMgdGhhdCByZXR1cm5lZCBmcm9tIGdldGxvZ2luKCkuCisgKiBUaGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24gdXNlZCBnZXRwd3VpZCgpIGZvciBnZXRldWlkKCksIHdoaWNoCisgKiBpcyBfbm90XyB0aGUgc2FtZS4gIEVyaWsgYXBwYXJlbnRseSBtYWRlIHRoaXMgY2hhbmdlIGFsbW9zdCAzIHllYXJzCisgKiBhZ28gdG8gYXZvaWQgZmFpbGluZyB3aGVuIG5vIHV0bXAgd2FzIGF2YWlsYWJsZS4gIEhvd2V2ZXIsIHRoZQorICogY29ycmVjdCBjb3Vyc2Ugb2YgYWN0aW9uIHdydCBTVVN2MyBmb3IgYSBmYWlsaW5nIGdldGxvZ2luKCkgaXMKKyAqIGEgZGlhZ25vc3RpYyBtZXNzYWdlIGFuZCBhbiBlcnJvciByZXR1cm4uCisgKi8KKworLy91c2FnZTojZGVmaW5lIGxvZ25hbWVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIiIKKy8vdXNhZ2U6I2RlZmluZSBsb2duYW1lX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgdXNlciIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbG9nbmFtZV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBsb2duYW1lXG4iCisvL3VzYWdlOiAgICAgICAicm9vdFxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworaW50IGxvZ25hbWVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGxvZ25hbWVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwljaGFyIGJ1Zls2NF07CisKKwlpZiAoYXJndlsxXSkgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJLyogVXNpbmcgX3IgZnVuY3Rpb24gLSBhdm9pZCBwdWxsaW5nIGluIHN0YXRpYyBidWZmZXIgZnJvbSBsaWJjICovCisJaWYgKGdldGxvZ2luX3IoYnVmLCBzaXplb2YoYnVmKSkgPT0gMCkgeworCQlwdXRzKGJ1Zik7CisJCXJldHVybiBmZmx1c2hfYWxsKCk7CisJfQorCisJYmJfcGVycm9yX21zZ19hbmRfZGllKCJnZXRsb2dpbiIpOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL2xzLmMgYi9jb3JldXRpbHMvbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGM4YmVhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL2xzLmMKQEAgLTAsMCArMSwxMjU4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDE5OTYgQnJpYW4gQ2FuZGxlciA8Qi5DYW5kbGVyQHBvYm94LmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIFtkYXRlIHVua25vd24uIFBlcmhhcHMgYmVmb3JlIHllYXIgMjAwMF0KKyAqIFRvIGFjaGlldmUgYSBzbWFsbCBtZW1vcnkgZm9vdHByaW50LCB0aGlzIHZlcnNpb24gb2YgJ2xzJyBkb2Vzbid0IGRvIGFueQorICogZmlsZSBzb3J0aW5nLCBhbmQgb25seSBoYXMgdGhlIG1vc3QgZXNzZW50aWFsIGNvbW1hbmQgbGluZSBzd2l0Y2hlcworICogKGkuZS4sIHRoZSBvbmVzIEkgY291bGRuJ3QgbGl2ZSB3aXRob3V0IDotKSBBbGwgZmVhdHVyZXMgd2hpY2ggaW52b2x2ZQorICogbGlua2luZyBpbiBzdWJzdGFudGlhbCBjaHVua3Mgb2YgbGliYyBjYW4gYmUgZGlzYWJsZWQuCisgKgorICogQWx0aG91Z2ggSSBkb24ndCByZWFsbHkgd2FudCB0byBhZGQgbmV3IGZlYXR1cmVzIHRvIHRoaXMgcHJvZ3JhbSB0bworICoga2VlcCBpdCBzbWFsbCwgSSAqYW0qIGludGVyZXN0ZWQgdG8gcmVjZWl2ZSBidWcgZml4ZXMgYW5kIHdheXMgdG8gbWFrZQorICogaXQgbW9yZSBwb3J0YWJsZS4KKyAqCisgKiBLTk9XTiBCVUdTOgorICogMS4gaGlkZGVuIGZpbGVzIGNhbiBtYWtlIGNvbHVtbiB3aWR0aCB0b28gbGFyZ2UKKyAqCisgKiBOT04tT1BUSU1BTCBCRUhBVklPVVI6CisgKiAxLiBhdXRvd2lkdGggcmVhZHMgZGlyZWN0b3JpZXMgdHdpY2UKKyAqIDIuIGlmIHlvdSBkbyBhIHNob3J0IGRpcmVjdG9yeSBsaXN0aW5nIHdpdGhvdXQgZmlsZXR5cGUgY2hhcmFjdGVycworICogICAgYXBwZW5kZWQsIHRoZXJlJ3Mgbm8gbmVlZCB0byBzdGF0IGVhY2ggb25lCisgKiBQT1JUQUJJTElUWToKKyAqIDEuIHJlcXVpcmVzIGxzdGF0IChCU0QpIC0gaG93IGRvIHlvdSBkbyBpdCB3aXRob3V0PworICoKKyAqIFsyMDA5LTAzXQorICogbHMgc29ydHMgbGlzdGluZyBub3csIGFuZCBzdXBwb3J0cyBhbG1vc3QgYWxsIG9wdGlvbnMuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGxzX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSJbLTFBYUN4ZCIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTFNfRk9MTE9XTElOS1MoIkxIIikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTFNfUkVDVVJTSVZFKCJSIikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTFNfRklMRVRZUEVTKCJGcCIpICJsaW5zIgorLy91c2FnZToJSUZfRkVBVFVSRV9MU19USU1FU1RBTVBTKCJlIikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUoImgiKQorLy91c2FnZToJSUZfRkVBVFVSRV9MU19TT1JURklMRVMoInJTWHYiKQorLy91c2FnZToJSUZfRkVBVFVSRV9MU19USU1FU1RBTVBTKCJjdHUiKQorLy91c2FnZToJSUZfU0VMSU5VWCgia0taIikgIl0iCisvL3VzYWdlOglJRl9GRUFUVVJFX0FVVE9XSURUSCgiIFstdyBXSURUSF0iKSAiIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBsc19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkxpc3QgZGlyZWN0b3J5IGNvbnRlbnRzXG4iCisvL3VzYWdlOiAgICAgIlxuCS0xCU9uZSBjb2x1bW4gb3V0cHV0IgorLy91c2FnZTogICAgICJcbgktYQlJbmNsdWRlIGVudHJpZXMgd2hpY2ggc3RhcnQgd2l0aCAuIgorLy91c2FnZTogICAgICJcbgktQQlMaWtlIC1hLCBidXQgZXhjbHVkZSAuIGFuZCAuLiIKKy8vdXNhZ2U6ICAgICAiXG4JLUMJTGlzdCBieSBjb2x1bW5zIgorLy91c2FnZTogICAgICJcbgkteAlMaXN0IGJ5IGxpbmVzIgorLy91c2FnZTogICAgICJcbgktZAlMaXN0IGRpcmVjdG9yeSBlbnRyaWVzIGluc3RlYWQgb2YgY29udGVudHMiCisvL3VzYWdlOglJRl9GRUFUVVJFX0xTX0ZPTExPV0xJTktTKAorLy91c2FnZTogICAgICJcbgktTAlGb2xsb3cgc3ltbGlua3MiCisvL3VzYWdlOiAgICAgIlxuCS1ICUZvbGxvdyBzeW1saW5rcyBvbiBjb21tYW5kIGxpbmUiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0xTX1JFQ1VSU0lWRSgKKy8vdXNhZ2U6ICAgICAiXG4JLVIJUmVjdXJzZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTFNfRklMRVRZUEVTKAorLy91c2FnZTogICAgICJcbgktcAlBcHBlbmQgLyB0byBkaXIgZW50cmllcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUYJQXBwZW5kIGluZGljYXRvciAob25lIG9mICovPUB8KSB0byBlbnRyaWVzIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktbAlMb25nIGxpc3RpbmcgZm9ybWF0IgorLy91c2FnZTogICAgICJcbgktaQlMaXN0IGlub2RlIG51bWJlcnMiCisvL3VzYWdlOiAgICAgIlxuCS1uCUxpc3QgbnVtZXJpYyBVSURzIGFuZCBHSURzIGluc3RlYWQgb2YgbmFtZXMiCisvL3VzYWdlOiAgICAgIlxuCS1zCUxpc3QgYWxsb2NhdGVkIGJsb2NrcyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTFNfVElNRVNUQU1QUygKKy8vdXNhZ2U6ICAgICAiXG4JLWUJTGlzdCBmdWxsIGRhdGUgYW5kIHRpbWUiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0hVTUFOX1JFQURBQkxFKAorLy91c2FnZTogICAgICJcbgktaAlMaXN0IHNpemVzIGluIGh1bWFuIHJlYWRhYmxlIGZvcm1hdCAoMUsgMjQzTSAyRykiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0xTX1NPUlRGSUxFUygKKy8vdXNhZ2U6ICAgICAiXG4JLXIJU29ydCBpbiByZXZlcnNlIG9yZGVyIgorLy91c2FnZTogICAgICJcbgktUwlTb3J0IGJ5IHNpemUiCisvL3VzYWdlOiAgICAgIlxuCS1YCVNvcnQgYnkgZXh0ZW5zaW9uIgorLy91c2FnZTogICAgICJcbgktdglTb3J0IGJ5IHZlcnNpb24iCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0xTX1RJTUVTVEFNUFMoCisvL3VzYWdlOiAgICAgIlxuCS1jCVdpdGggLWw6IHNvcnQgYnkgY3RpbWUiCisvL3VzYWdlOiAgICAgIlxuCS10CVdpdGggLWw6IHNvcnQgYnkgbXRpbWUiCisvL3VzYWdlOiAgICAgIlxuCS11CVdpdGggLWw6IHNvcnQgYnkgYXRpbWUiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9TRUxJTlVYKAorLy91c2FnZTogICAgICJcbgktawlMaXN0IHNlY3VyaXR5IGNvbnRleHQiCisvL3VzYWdlOiAgICAgIlxuCS1LCUxpc3Qgc2VjdXJpdHkgY29udGV4dCBpbiBsb25nIGZvcm1hdCIKKy8vdXNhZ2U6ICAgICAiXG4JLVoJTGlzdCBzZWN1cml0eSBjb250ZXh0IGFuZCBwZXJtaXNzaW9uIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9BVVRPV0lEVEgoCisvL3VzYWdlOiAgICAgIlxuCS13IE4JQXNzdW1lIHRoZSB0ZXJtaW5hbCBpcyBOIGNvbHVtbnMgd2lkZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTFNfQ09MT1IoCisvL3VzYWdlOiAgICAgIlxuCS0tY29sb3JbPXthbHdheXMsbmV2ZXIsYXV0b31dCUNvbnRyb2wgY29sb3JpbmciCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInVuaWNvZGUuaCIKKworCisvKiBUaGlzIGlzIGEgTk9FWEVDIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCisKKyNpZiBFTkFCTEVfRlRQRAorLyogZnRwZCB1c2VzIGxzLCBhbmQgd2l0aG91dCB0aW1lc3RhbXBzIE1vemlsbGEgd29uJ3QgdW5kZXJzdGFuZAorICogZnRwZCdzIExJU1Qgb3V0cHV0LgorICovCisjIHVuZGVmIENPTkZJR19GRUFUVVJFX0xTX1RJTUVTVEFNUFMKKyMgdW5kZWYgRU5BQkxFX0ZFQVRVUkVfTFNfVElNRVNUQU1QUworIyB1bmRlZiBJRl9GRUFUVVJFX0xTX1RJTUVTVEFNUFMKKyMgdW5kZWYgSUZfTk9UX0ZFQVRVUkVfTFNfVElNRVNUQU1QUworIyBkZWZpbmUgQ09ORklHX0ZFQVRVUkVfTFNfVElNRVNUQU1QUyAxCisjIGRlZmluZSBFTkFCTEVfRkVBVFVSRV9MU19USU1FU1RBTVBTIDEKKyMgZGVmaW5lIElGX0ZFQVRVUkVfTFNfVElNRVNUQU1QUyguLi4pIF9fVkFfQVJHU19fCisjIGRlZmluZSBJRl9OT1RfRkVBVFVSRV9MU19USU1FU1RBTVBTKC4uLikKKyNlbmRpZgorCisKK2VudW0geworVEVSTUlOQUxfV0lEVEggID0gODAsICAgICAgICAgICAvKiB1c2UgNzkgaWYgdGVybWluYWwgaGFzIGxpbmVmb2xkIGJ1ZyAqLworCitTUExJVF9GSUxFICAgICAgPSAwLAorU1BMSVRfRElSICAgICAgID0gMSwKK1NQTElUX1NVQkRJUiAgICA9IDIsCisKKy8qIEJpdHMgaW4gRy5hbGxfZm10OiAqLworCisvKiA1MTMwNiBscnd4cnd4cnd4ICAxIHJvb3QgICAgIHJvb3QgICAgICAgICAyIE1heSAxMSAwMTo0MyAvYmluL3ZpZXcgLT4gdmkqICovCisvKiB3aGF0IGZpbGUgaW5mb3JtYXRpb24gd2lsbCBiZSBsaXN0ZWQgKi8KK0xJU1RfSU5PICAgICAgICA9IDEgPDwgMCwKK0xJU1RfQkxPQ0tTICAgICA9IDEgPDwgMSwKK0xJU1RfTU9ERUJJVFMgICA9IDEgPDwgMiwKK0xJU1RfTkxJTktTICAgICA9IDEgPDwgMywKK0xJU1RfSURfTkFNRSAgICA9IDEgPDwgNCwKK0xJU1RfSURfTlVNRVJJQyA9IDEgPDwgNSwKK0xJU1RfQ09OVEVYVCAgICA9IDEgPDwgNiwKK0xJU1RfU0laRSAgICAgICA9IDEgPDwgNywKK0xJU1RfREFURV9USU1FICA9IDEgPDwgOCwKK0xJU1RfRlVMTFRJTUUgICA9IDEgPDwgOSwKK0xJU1RfU1lNTElOSyAgICA9IDEgPDwgMTAsCitMSVNUX0ZJTEVUWVBFICAgPSAxIDw8IDExLCAvKiBzaG93IC8gc3VmZml4IGZvciBkaXJzICovCitMSVNUX0NMQVNTSUZZICAgPSAxIDw8IDEyLCAvKiByZXF1aXJlcyBMSVNUX0ZJTEVUWVBFLCBhbHNvIHNob3cgKix8LEAsPSBzdWZmaXhlcyAqLworTElTVF9NQVNLICAgICAgID0gKExJU1RfQ0xBU1NJRlkgPDwgMSkgLSAxLAorCisvKiB3aGF0IGZpbGVzIHdpbGwgYmUgZGlzcGxheWVkICovCitESVNQX0RJUk5BTUUgICAgPSAxIDw8IDEzLCAgICAgIC8qIDIgb3IgbW9yZSBpdGVtcz8gbGFiZWwgZGlyZWN0b3JpZXMgKi8KK0RJU1BfSElEREVOICAgICA9IDEgPDwgMTQsICAgICAgLyogc2hvdyBmaWxlbmFtZXMgc3RhcnRpbmcgd2l0aCAuICovCitESVNQX0RPVCAgICAgICAgPSAxIDw8IDE1LCAgICAgIC8qIHNob3cgLiBhbmQgLi4gKi8KK0RJU1BfTk9MSVNUICAgICA9IDEgPDwgMTYsICAgICAgLyogc2hvdyBkaXJlY3RvcnkgYXMgaXRzZWxmLCBub3QgY29udGVudHMgKi8KK0RJU1BfUkVDVVJTSVZFICA9IDEgPDwgMTcsICAgICAgLyogc2hvdyBkaXJlY3RvcnkgYW5kIGV2ZXJ5dGhpbmcgYmVsb3cgaXQgKi8KK0RJU1BfUk9XUyAgICAgICA9IDEgPDwgMTgsICAgICAgLyogcHJpbnQgYWNyb3NzIHJvd3MgKi8KK0RJU1BfTUFTSyAgICAgICA9ICgoRElTUF9ST1dTIDw8IDEpIC0gMSkgJiB+KERJU1BfRElSTkFNRSAtIDEpLAorCisvKiB3aGF0IGlzIHRoZSBvdmVyYWxsIHN0eWxlIG9mIHRoZSBsaXN0aW5nICovCitTVFlMRV9DT0xVTU5BUiAgPSAxIDw8IDE5LCAgICAgIC8qIG1hbnkgcmVjb3JkcyBwZXIgbGluZSAqLworU1RZTEVfTE9ORyAgICAgID0gMiA8PCAxOSwgICAgICAvKiBvbmUgcmVjb3JkIHBlciBsaW5lLCBleHRlbmRlZCBpbmZvICovCitTVFlMRV9TSU5HTEUgICAgPSAzIDw8IDE5LCAgICAgIC8qIG9uZSByZWNvcmQgcGVyIGxpbmUgKi8KK1NUWUxFX01BU0sgICAgICA9IFNUWUxFX1NJTkdMRSwKKworLyogd2hpY2ggb2YgdGhlIHRocmVlIHRpbWVzIHdpbGwgYmUgdXNlZCAqLworVElNRV9DSEFOR0UgICAgID0gKDEgPDwgMjEpICogRU5BQkxFX0ZFQVRVUkVfTFNfVElNRVNUQU1QUywKK1RJTUVfQUNDRVNTICAgICA9ICgyIDw8IDIxKSAqIEVOQUJMRV9GRUFUVVJFX0xTX1RJTUVTVEFNUFMsCitUSU1FX01BU0sgICAgICAgPSAoMyA8PCAyMSkgKiBFTkFCTEVfRkVBVFVSRV9MU19USU1FU1RBTVBTLAorCisvKiBob3cgd2lsbCB0aGUgZmlsZXMgYmUgc29ydGVkIChDT05GSUdfRkVBVFVSRV9MU19TT1JURklMRVMpICovCitTT1JUX1JFVkVSU0UgICAgPSAxIDw8IDIzLAorCitTT1JUX05BTUUgICAgICAgPSAwLCAgICAgICAgICAgIC8qIHNvcnQgYnkgZmlsZSBuYW1lICovCitTT1JUX1NJWkUgICAgICAgPSAxIDw8IDI0LCAgICAgIC8qIHNvcnQgYnkgZmlsZSBzaXplICovCitTT1JUX0FUSU1FICAgICAgPSAyIDw8IDI0LCAgICAgIC8qIHNvcnQgYnkgbGFzdCBhY2Nlc3MgdGltZSAqLworU09SVF9DVElNRSAgICAgID0gMyA8PCAyNCwgICAgICAvKiBzb3J0IGJ5IGxhc3QgY2hhbmdlIHRpbWUgKi8KK1NPUlRfTVRJTUUgICAgICA9IDQgPDwgMjQsICAgICAgLyogc29ydCBieSBsYXN0IG1vZGlmaWNhdGlvbiB0aW1lICovCitTT1JUX1ZFUlNJT04gICAgPSA1IDw8IDI0LCAgICAgIC8qIHNvcnQgYnkgdmVyc2lvbiAqLworU09SVF9FWFQgICAgICAgID0gNiA8PCAyNCwgICAgICAvKiBzb3J0IGJ5IGZpbGUgbmFtZSBleHRlbnNpb24gKi8KK1NPUlRfRElSICAgICAgICA9IDcgPDwgMjQsICAgICAgLyogc29ydCBieSBmaWxlIG9yIGRpcmVjdG9yeSAqLworU09SVF9NQVNLICAgICAgID0gKDcgPDwgMjQpICogRU5BQkxFX0ZFQVRVUkVfTFNfU09SVEZJTEVTLAorCitMSVNUX0xPTkcgICAgICAgPSBMSVNUX01PREVCSVRTIHwgTElTVF9OTElOS1MgfCBMSVNUX0lEX05BTUUgfCBMSVNUX1NJWkUgfCBcCisgICAgICAgICAgICAgICAgICBMSVNUX0RBVEVfVElNRSB8IExJU1RfU1lNTElOSywKK307CisKKy8qIC1DYWRpbDEgIFN0ZCBvcHRpb25zLCBidXN5Ym94IGFsd2F5cyBzdXBwb3J0cyAqLworLyogLWduc3hBICAgU3RkIG9wdGlvbnMsIGJ1c3lib3ggYWx3YXlzIHN1cHBvcnRzICovCisvKiAtUSAgICAgICBHTlUgb3B0aW9uLCBidXN5Ym94IGFsd2F5cyBzdXBwb3J0cyAqLworLyogLWsgICAgICAgU0VMaW51eCBvcHRpb24sIGJ1c3lib3ggYWx3YXlzIHN1cHBvcnRzIChpZ25vcmVzIGlmICFTRUxpbnV4KSAqLworLyogICAgICAgICAgU3RkIGhhcyAtayB3aGljaCBtZWFucyAic2hvdyBzaXplcyBpbiBrYnl0ZXMiICovCisvKiAtTEhSY3R1ciBTdGQgb3B0aW9ucywgYnVzeWJveCBvcHRpb25hbGx5IHN1cHBvcnRzICovCisvKiAtRnAgICAgICBTdGQgb3B0aW9ucywgYnVzeWJveCBvcHRpb25hbGx5IHN1cHBvcnRzICovCisvKiAtU1h2aFR3ICBHTlUgb3B0aW9ucywgYnVzeWJveCBvcHRpb25hbGx5IHN1cHBvcnRzICovCisvKiAtVCBXSURUSCBJZ25vcmVkICh3ZSBkb24ndCB1c2UgdGFicyBvbiBvdXRwdXQpICovCisvKiAtS1ogICAgICBTRUxpbnV4IG1hbmRhdGVkIG9wdGlvbnMsIGJ1c3lib3ggb3B0aW9uYWxseSBzdXBwb3J0cyAqLworLyogICAgICAgICAgKGNvcmV1dGlscyA4LjQgaGFzIG5vIC1LLCByZW1vdmUgaXQ/KSAqLworLyogLWUgICAgICAgSSB0aGluayB3ZSBtYWRlIHRoaXMgb25lIHVwIChsb29rcyBzaW1pbGFyIHRvIEdOVSAtLWZ1bGwtdGltZSkgKi8KKy8qIFdlIGFscmVhZHkgdXNlZCB1cCBhbGwgMzIgYml0cywgaWYgd2UgbmVlZCB0byBhZGQgbW9yZSwgY2FuZGlkYXRlcyBmb3IgcmVtb3ZhbDogKi8KKy8qIC1LLCAtVCwgLWUgKGFkZCAtLWZ1bGwtdGltZSBpbnN0ZWFkKSAqLworc3RhdGljIGNvbnN0IGNoYXIgbHNfb3B0aW9uc1tdIEFMSUdOMSA9CisJIkNhZGlsMWduc3hRQWsiICAgICAgLyogMTMgb3B0cywgdG90YWwgMTMgKi8KKwlJRl9GRUFUVVJFX0xTX1RJTUVTVEFNUFMoImNldHUiKSAvKiA0LCAxNyAqLworCUlGX0ZFQVRVUkVfTFNfU09SVEZJTEVTKCJTWHJ2IikgIC8qIDQsIDIxICovCisJSUZfRkVBVFVSRV9MU19GSUxFVFlQRVMoIkZwIikgICAgLyogMiwgMjMgKi8KKwlJRl9GRUFUVVJFX0xTX1JFQ1VSU0lWRSgiUiIpICAgICAvKiAxLCAyNCAqLworCUlGX1NFTElOVVgoIktaIikgICAgICAgICAgICAgICAgIC8qIDIsIDI2ICovCisJSUZfRkVBVFVSRV9MU19GT0xMT1dMSU5LUygiTEgiKSAgLyogMiwgMjggKi8KKwlJRl9GRUFUVVJFX0hVTUFOX1JFQURBQkxFKCJoIikgICAvKiAxLCAyOSAqLworCUlGX0ZFQVRVUkVfQVVUT1dJRFRIKCJUOnc6IikgICAgIC8qIDIsIDMxICovCisJLyogd2l0aCAtLWNvbG9yLCB3ZSB1c2UgYWxsIDMyIGJpdHMgKi87CitlbnVtIHsKKwkvL09QVF9DID0gKDEgPDwgMCksCisJLy9PUFRfYSA9ICgxIDw8IDEpLAorCS8vT1BUX2QgPSAoMSA8PCAyKSwKKwkvL09QVF9pID0gKDEgPDwgMyksCisJLy9PUFRfbCA9ICgxIDw8IDQpLAorCS8vT1BUXzEgPSAoMSA8PCA1KSwKKwlPUFRfZyA9ICgxIDw8IDYpLAorCS8vT1BUX24gPSAoMSA8PCA3KSwKKwkvL09QVF9zID0gKDEgPDwgOCksCisJLy9PUFRfeCA9ICgxIDw8IDkpLAorCU9QVF9RID0gKDEgPDwgMTApLAorCS8vT1BUX0EgPSAoMSA8PCAxMSksCisJLy9PUFRfayA9ICgxIDw8IDEyKSwKKworCU9QVEJJVF9jID0gMTMsCisJT1BUQklUX2UsCisJT1BUQklUX3QsCisJT1BUQklUX3UsCisJT1BUQklUX1MgPSBPUFRCSVRfYyArIDQgKiBFTkFCTEVfRkVBVFVSRV9MU19USU1FU1RBTVBTLAorCU9QVEJJVF9YLCAvKiAxOCAqLworCU9QVEJJVF9yLAorCU9QVEJJVF92LAorCU9QVEJJVF9GID0gT1BUQklUX1MgKyA0ICogRU5BQkxFX0ZFQVRVUkVfTFNfU09SVEZJTEVTLAorCU9QVEJJVF9wLCAvKiAyMiAqLworCU9QVEJJVF9SID0gT1BUQklUX0YgKyAyICogRU5BQkxFX0ZFQVRVUkVfTFNfRklMRVRZUEVTLAorCU9QVEJJVF9LID0gT1BUQklUX1IgKyAxICogRU5BQkxFX0ZFQVRVUkVfTFNfUkVDVVJTSVZFLAorCU9QVEJJVF9aLCAvKiAyNSAqLworCU9QVEJJVF9MID0gT1BUQklUX0sgKyAyICogRU5BQkxFX1NFTElOVVgsCisJT1BUQklUX0gsIC8qIDI3ICovCisJT1BUQklUX2ggPSBPUFRCSVRfTCArIDIgKiBFTkFCTEVfRkVBVFVSRV9MU19GT0xMT1dMSU5LUywKKwlPUFRCSVRfVCA9IE9QVEJJVF9oICsgMSAqIEVOQUJMRV9GRUFUVVJFX0hVTUFOX1JFQURBQkxFLAorCU9QVEJJVF93LCAvKiAzMCAqLworCU9QVEJJVF9jb2xvciA9IE9QVEJJVF9UICsgMiAqIEVOQUJMRV9GRUFUVVJFX0FVVE9XSURUSCwKKworCU9QVF9jID0gKDEgPDwgT1BUQklUX2MpICogRU5BQkxFX0ZFQVRVUkVfTFNfVElNRVNUQU1QUywKKwlPUFRfZSA9ICgxIDw8IE9QVEJJVF9lKSAqIEVOQUJMRV9GRUFUVVJFX0xTX1RJTUVTVEFNUFMsCisJT1BUX3QgPSAoMSA8PCBPUFRCSVRfdCkgKiBFTkFCTEVfRkVBVFVSRV9MU19USU1FU1RBTVBTLAorCU9QVF91ID0gKDEgPDwgT1BUQklUX3UpICogRU5BQkxFX0ZFQVRVUkVfTFNfVElNRVNUQU1QUywKKwlPUFRfUyA9ICgxIDw8IE9QVEJJVF9TKSAqIEVOQUJMRV9GRUFUVVJFX0xTX1NPUlRGSUxFUywKKwlPUFRfWCA9ICgxIDw8IE9QVEJJVF9YKSAqIEVOQUJMRV9GRUFUVVJFX0xTX1NPUlRGSUxFUywKKwlPUFRfciA9ICgxIDw8IE9QVEJJVF9yKSAqIEVOQUJMRV9GRUFUVVJFX0xTX1NPUlRGSUxFUywKKwlPUFRfdiA9ICgxIDw8IE9QVEJJVF92KSAqIEVOQUJMRV9GRUFUVVJFX0xTX1NPUlRGSUxFUywKKwlPUFRfRiA9ICgxIDw8IE9QVEJJVF9GKSAqIEVOQUJMRV9GRUFUVVJFX0xTX0ZJTEVUWVBFUywKKwlPUFRfcCA9ICgxIDw8IE9QVEJJVF9wKSAqIEVOQUJMRV9GRUFUVVJFX0xTX0ZJTEVUWVBFUywKKwlPUFRfUiA9ICgxIDw8IE9QVEJJVF9SKSAqIEVOQUJMRV9GRUFUVVJFX0xTX1JFQ1VSU0lWRSwKKwlPUFRfSyA9ICgxIDw8IE9QVEJJVF9LKSAqIEVOQUJMRV9TRUxJTlVYLAorCU9QVF9aID0gKDEgPDwgT1BUQklUX1opICogRU5BQkxFX1NFTElOVVgsCisJT1BUX0wgPSAoMSA8PCBPUFRCSVRfTCkgKiBFTkFCTEVfRkVBVFVSRV9MU19GT0xMT1dMSU5LUywKKwlPUFRfSCA9ICgxIDw8IE9QVEJJVF9IKSAqIEVOQUJMRV9GRUFUVVJFX0xTX0ZPTExPV0xJTktTLAorCU9QVF9oID0gKDEgPDwgT1BUQklUX2gpICogRU5BQkxFX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUsCisJT1BUX1QgPSAoMSA8PCBPUFRCSVRfVCkgKiBFTkFCTEVfRkVBVFVSRV9BVVRPV0lEVEgsCisJT1BUX3cgPSAoMSA8PCBPUFRCSVRfdykgKiBFTkFCTEVfRkVBVFVSRV9BVVRPV0lEVEgsCisJT1BUX2NvbG9yID0gKDEgPDwgT1BUQklUX2NvbG9yKSAqIEVOQUJMRV9GRUFUVVJFX0xTX0NPTE9SLAorfTsKKworLyogVE9ETzogc2ltcGxlIHRvZ2dsZXMgbWF5IGJlIHN0b3JlZCBhcyBPUFRfeHh4IGJpdHMgaW5zdGVhZCAqLworc3RhdGljIGNvbnN0IHVpbnQzMl90IG9wdF9mbGFnc1tdID0geworCVNUWUxFX0NPTFVNTkFSLCAgICAgICAgICAgICAgLyogQyAqLworCURJU1BfSElEREVOIHwgRElTUF9ET1QsICAgICAgLyogYSAqLworCURJU1BfTk9MSVNULCAgICAgICAgICAgICAgICAgLyogZCAqLworCUxJU1RfSU5PLCAgICAgICAgICAgICAgICAgICAgLyogaSAqLworCUxJU1RfTE9ORyB8IFNUWUxFX0xPTkcsICAgICAgLyogbCAqLworCVNUWUxFX1NJTkdMRSwgICAgICAgICAgICAgICAgLyogMSAqLworCUxJU1RfTE9ORyB8IFNUWUxFX0xPTkcsICAgICAgLyogZyAoZG9uJ3Qgc2hvdyBvd25lcikgLSBoYW5kbGVkIHZpYSBPUFRfZy4gYXNzdW1lcyBsICovCisJTElTVF9JRF9OVU1FUklDIHwgTElTVF9MT05HIHwgU1RZTEVfTE9ORywgLyogbiAoYXNzdW1lcyBsKSAqLworCUxJU1RfQkxPQ0tTLCAgICAgICAgICAgICAgICAgLyogcyAqLworCURJU1BfUk9XUyB8IFNUWUxFX0NPTFVNTkFSLCAgLyogeCAqLworCTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUSAocXVvdGUgZmlsZW5hbWUpIC0gaGFuZGxlZCB2aWEgT1BUX1EgKi8KKwlESVNQX0hJRERFTiwgICAgICAgICAgICAgICAgIC8qIEEgKi8KKwlFTkFCTEVfU0VMSU5VWCAqIChMSVNUX0NPTlRFWFR8U1RZTEVfU0lOR0xFKSwgLyogayAoaWdub3JlZCBpZiAhU0VMSU5VWCkgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9MU19USU1FU1RBTVBTCisJVElNRV9DSEFOR0UgfCAoRU5BQkxFX0ZFQVRVUkVfTFNfU09SVEZJTEVTICogU09SVF9DVElNRSksIC8qIGMgKi8KKwlMSVNUX0ZVTExUSU1FLCAgICAgICAgICAgICAgIC8qIGUgKi8KKwlFTkFCTEVfRkVBVFVSRV9MU19TT1JURklMRVMgKiBTT1JUX01USU1FLCAvKiB0ICovCisJVElNRV9BQ0NFU1MgfCAoRU5BQkxFX0ZFQVRVUkVfTFNfU09SVEZJTEVTICogU09SVF9BVElNRSksIC8qIHUgKi8KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0xTX1NPUlRGSUxFUworCVNPUlRfU0laRSwgICAgICAgICAgICAgICAgICAgLyogUyAqLworCVNPUlRfRVhULCAgICAgICAgICAgICAgICAgICAgLyogWCAqLworCVNPUlRfUkVWRVJTRSwgICAgICAgICAgICAgICAgLyogciAqLworCVNPUlRfVkVSU0lPTiwgICAgICAgICAgICAgICAgLyogdiAqLworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfTFNfRklMRVRZUEVTCisJTElTVF9GSUxFVFlQRSB8IExJU1RfQ0xBU1NJRlksIC8qIEYgKi8KKwlMSVNUX0ZJTEVUWVBFLCAgICAgICAgICAgICAgIC8qIHAgKi8KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0xTX1JFQ1VSU0lWRQorCURJU1BfUkVDVVJTSVZFLCAgICAgICAgICAgICAgLyogUiAqLworI2VuZGlmCisjaWYgRU5BQkxFX1NFTElOVVgKKwlMSVNUX01PREVCSVRTfExJU1RfTkxJTktTfExJU1RfQ09OVEVYVHxMSVNUX1NJWkV8TElTVF9EQVRFX1RJTUV8U1RZTEVfU0lOR0xFLCAvKiBLICovCisJTElTVF9NT0RFQklUU3xMSVNUX0lEX05BTUV8TElTVF9DT05URVhUfFNUWUxFX1NJTkdMRSwgLyogWiAqLworI2VuZGlmCisJKDFVIDw8IDMxKQorCS8qIG9wdGlvbnMgYWZ0ZXIgWiBhcmUgbm90IHByb2Nlc3NlZCB0aHJvdWdoIG9wdF9mbGFncyAqLworfTsKKworCisvKgorICogYSBkaXJlY3RvcnkgZW50cnkgYW5kIGl0cyBzdGF0IGluZm8KKyAqLworc3RydWN0IGRub2RlIHsKKwljb25zdCBjaGFyICpuYW1lOyAgICAgICAvKiB1c3VhbGx5IGJhc2VuYW1lLCBidXQgdGhpbmsgImxzIC1sIGRpci9maWxlIiAqLworCWNvbnN0IGNoYXIgKmZ1bGxuYW1lOyAgIC8qIGZ1bGwgbmFtZSAodXNhYmxlIGZvciBzdGF0IGV0YykgKi8KKwlzdHJ1Y3QgZG5vZGUgKmRuX25leHQ7ICAvKiBmb3IgbGlua2VkIGxpc3QgKi8KKwlJRl9TRUxJTlVYKHNlY3VyaXR5X2NvbnRleHRfdCBzaWQ7KQorCXNtYWxsaW50IGZuYW1lX2FsbG9jYXRlZDsKKworCS8qIFVzZWQgdG8gYXZvaWQgcmUtZG9pbmcgW2xdc3RhdCBhdCBwcmludG91dCBzdGFnZQorCSAqIGlmIHdlIGFscmVhZHkgY29sbGVjdGVkIG5lZWRlZCBkYXRhIGluIHNjYW4gc3RhZ2U6CisJICovCisJbW9kZV90ICAgIGRuX21vZGVfbHN0YXQ7ICAgLyogb2J0YWluZWQgd2l0aCBsc3RhdCwgb3IgMCAqLworCW1vZGVfdCAgICBkbl9tb2RlX3N0YXQ7ICAgIC8qIG9idGFpbmVkIHdpdGggc3RhdCwgb3IgMCAqLworCisvLwlzdHJ1Y3Qgc3RhdCBkc3RhdDsKKy8vIHN0cnVjdCBzdGF0IGlzIGh1Z2UuIFdlIGRvbid0IG5lZWQgaXQgaW4gZnVsbC4KKy8vIEF0IGxlYXN0IHdlIGRvbid0IG5lZWQgc3RfZGV2IGFuZCBzdF9ibGtzaXplLAorLy8gYnV0IHRoZXJlIGFyZSBpbnZpc2libGUgZmllbGRzIGFzIHdlbGwKKy8vIChzdWNoIGFzIG5hbm9zZWNvbmQtcmVzb2x1dGlvbiB0aW1lc3BhbXBzKQorLy8gYW5kIHBhZGRpbmcsIHdoaWNoIHdlIGFsc28gZG9uJ3Qgd2FudCB0byBzdG9yZS4KKy8vIFdlIGFsc28gY2FuIHByZS1wYXJzZSBkZXZfdCBkbl9yZGV2IChpbiBnbGliYywgaXQncyBodWdlKS4KKy8vIE9uIDMyLWJpdCB1Y2xpYmM6IGRub2RlIHNpemUgd2VudCBmcm9tIDExMiB0byA4NCBieXRlcy4KKy8vCisJLyogU2FtZSBuYW1lcyBhcyBpbiBzdHJ1Y3Qgc3RhdCwgYnV0IHdpdGggZG5fIGluc3RlYWQgb2Ygc3RfIHBmeDogKi8KKwltb2RlX3QgICAgZG5fbW9kZTsgLyogb2J0YWluZWQgd2l0aCBsc3RhdCBPUiBzdGF0LCBkZXBlbmRpbmcgb24gLUwgZXRjICovCisJb2ZmX3QgICAgIGRuX3NpemU7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTFNfVElNRVNUQU1QUyB8fCBFTkFCTEVfRkVBVFVSRV9MU19TT1JURklMRVMKKwl0aW1lX3QgICAgZG5fYXRpbWU7CisJdGltZV90ICAgIGRuX210aW1lOworCXRpbWVfdCAgICBkbl9jdGltZTsKKyNlbmRpZgorCWlub190ICAgICBkbl9pbm87CisJYmxrY250X3QgIGRuX2Jsb2NrczsKKwlubGlua190ICAgZG5fbmxpbms7CisJdWlkX3QgICAgIGRuX3VpZDsKKwlnaWRfdCAgICAgZG5fZ2lkOworCWludCAgICAgICBkbl9yZGV2X21hajsKKwlpbnQgICAgICAgZG5fcmRldl9taW47CisvLwlkZXZfdCAgICAgZG5fZGV2OworLy8JYmxrc2l6ZV90IGRuX2Jsa3NpemU7Cit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTFNfQ09MT1IKKwlzbWFsbGludCBzaG93X2NvbG9yOworIyBkZWZpbmUgR19zaG93X2NvbG9yIChHLnNob3dfY29sb3IpCisjZWxzZQorIyBkZWZpbmUgR19zaG93X2NvbG9yIDAKKyNlbmRpZgorCXNtYWxsaW50IGV4aXRfY29kZTsKKwl1bnNpZ25lZCBhbGxfZm10OworI2lmIEVOQUJMRV9GRUFUVVJFX0FVVE9XSURUSAorCXVuc2lnbmVkIHRlcm1pbmFsX3dpZHRoOworIyBkZWZpbmUgR190ZXJtaW5hbF93aWR0aCAoRy50ZXJtaW5hbF93aWR0aCkKKyNlbHNlCisjIGRlZmluZSBHX3Rlcm1pbmFsX3dpZHRoIFRFUk1JTkFMX1dJRFRICisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9MU19USU1FU1RBTVBTCisJLyogRG8gdGltZSgpIGp1c3Qgb25jZS4gU2F2ZXMgb25lIHN5c2NhbGwgcGVyIGZpbGUgZm9yICJscyAtbCIgKi8KKwl0aW1lX3QgY3VycmVudF90aW1lX3Q7CisjZW5kaWYKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCS8qIHdlIGhhdmUgdG8gemVybyBpdCBvdXQgYmVjYXVzZSBvZiBOT0VYRUMgKi8gXAorCW1lbXNldCgmRywgMCwgc2l6ZW9mKEcpKTsgXAorCUlGX0ZFQVRVUkVfQVVUT1dJRFRIKEdfdGVybWluYWxfd2lkdGggPSBURVJNSU5BTF9XSURUSDspIFwKKwlJRl9GRUFUVVJFX0xTX1RJTUVTVEFNUFModGltZSgmRy5jdXJyZW50X3RpbWVfdCk7KSBcCit9IHdoaWxlICgwKQorCisKKy8qKiogT3V0cHV0IGNvZGUgKioqLworCisKKy8qIEZZSSB0eXBlIHZhbHVlczogMTpmaWZvIDI6Y2hhciA0OmRpciA2OmJsayA4OmZpbGUgMTA6bGluayAxMjpzb2NrZXQKKyAqICh2YXJpb3VzIHdhY2t5IE9TZXM6IDEzOlN1biBkb29yIDE0OkJTRCB3aGl0ZW91dCA1OlhFTklYIG5hbWVkIGZpbGUKKyAqICAzLzc6bXVsdGlwbGV4ZWQgY2hhci9ibG9jayBkZXZpY2UpCisgKiBhbmQgd2UgdXNlIDAgZm9yIHVua25vd24gYW5kIDE1IGZvciBleGVjdXRhYmxlcyAoc2VlIGJlbG93KSAqLworI2RlZmluZSBUWVBFSU5ERVgobW9kZSkgKCgobW9kZSkgPj4gMTIpICYgMHgwZikKKy8qICAgICAgICAgICAgICAgICAgICAgICB1biAgZmkgY2hyIC0gICBkaXIgLSAgYmxrICAtICBmaWxlIC0gIGxpbmsgLSBzb2NrIC0gICAtIGV4ZSAqLworI2RlZmluZSBBUFBDSEFSKG1vZGUpICAgKCJcMCIifCIiXDAiIlwwIiIvIiJcMCIiXDAiIlwwIiJcMCIiXDAiIkAiIlwwIiI9IiJcMCIiXDAiIlwwIiBbVFlQRUlOREVYKG1vZGUpXSkKKy8qIDAzNiBibGFjayBmb3JlZ3JvdW5kICAgICAgICAgICAgICAwNTAgYmxhY2sgYmFja2dyb3VuZAorICAgMDM3IHJlZCBmb3JlZ3JvdW5kICAgICAgICAgICAgICAgIDA1MSByZWQgYmFja2dyb3VuZAorICAgMDQwIGdyZWVuIGZvcmVncm91bmQgICAgICAgICAgICAgIDA1MiBncmVlbiBiYWNrZ3JvdW5kCisgICAwNDEgYnJvd24gZm9yZWdyb3VuZCAgICAgICAgICAgICAgMDUzIGJyb3duIGJhY2tncm91bmQKKyAgIDA0MiBibHVlIGZvcmVncm91bmQgICAgICAgICAgICAgICAwNTQgYmx1ZSBiYWNrZ3JvdW5kCisgICAwNDMgbWFnZW50YSAocHVycGxlKSBmb3JlZ3JvdW5kICAgMDU1IG1hZ2VudGEgYmFja2dyb3VuZAorICAgMDQ0IGN5YW4gKGxpZ2h0IGJsdWUpIGZvcmVncm91bmQgIDA1NiBjeWFuIGJhY2tncm91bmQKKyAgIDA0NSBncmF5IGZvcmVncm91bmQgICAgICAgICAgICAgICAwNTcgd2hpdGUgYmFja2dyb3VuZAorKi8KKyNkZWZpbmUgQ09MT1IobW9kZSkgKCBcCisJLyp1biAgZmkgIGNociAgLSAgZGlyICAtICBibGsgIC0gIGZpbGUgLSAgbGluayAtICBzb2NrIC0gICAtICBleGUgKi8gXAorCSJcMDM3XDA0M1wwNDNcMDQ1XDA0MlwwNDVcMDQzXDA0M1wwMDBcMDQ1XDA0NFwwNDVcMDQzXDA0NVwwNDVcMDQwIiBcCisJW1RZUEVJTkRFWChtb2RlKV0pCisvKiBTZWxlY3Qgbm9ybWFsICgwKSBbYWN0dWFsbHkgInJlc2V0IGFsbCJdIG9yIGJvbGQgKDEpCisgKiAob3RoZXIgYXR0cmlidXRlcyBhcmUgMjpkaW0gNDp1bmRlcmxpbmUgNTpibGluayA3OnJldmVyc2UsCisgKiAgbGV0J3MgdXNlIDcgZm9yICJpbXBvc3NpYmxlIiB0eXBlcywganVzdCBmb3IgZnVuKQorICogTm90ZTogY29yZXV0aWxzIDYuOSB1c2VzIGludmVydGVkIHJlZCBmb3Igc2V0dWlkIGJpbmFyaWVzLgorICovCisjZGVmaW5lIEFUVFIobW9kZSkgKCBcCisJLyp1biBmaSBjaHIgLSBkaXIgLSBibGsgLSBmaWxlLSBsaW5rLSBzb2NrLSAtICBleGUgKi8gXAorCSJcMDFcMDBcMDFcMDdcMDFcMDdcMDFcMDdcMDBcMDdcMDFcMDdcMDFcMDdcMDdcMDEiIFwKKwlbVFlQRUlOREVYKG1vZGUpXSkKKworI2lmIEVOQUJMRV9GRUFUVVJFX0xTX0NPTE9SCisvKiBtb2RlIG9mIHplcm8gaXMgaW50ZXJwcmV0ZWQgYXMgInVua25vd24iIChzdGF0IGZhaWxlZCkgKi8KK3N0YXRpYyBjaGFyIGZnY29sb3IobW9kZV90IG1vZGUpCit7CisJaWYgKFNfSVNSRUcobW9kZSkgJiYgKG1vZGUgJiAoU19JWFVTUiB8IFNfSVhHUlAgfCBTX0lYT1RIKSkpCisJCXJldHVybiBDT0xPUigweEYwMDApOwkvKiBGaWxlIGlzIGV4ZWN1dGFibGUgLi4uICovCisJcmV0dXJuIENPTE9SKG1vZGUpOworfQorc3RhdGljIGNoYXIgYm9sZChtb2RlX3QgbW9kZSkKK3sKKwlpZiAoU19JU1JFRyhtb2RlKSAmJiAobW9kZSAmIChTX0lYVVNSIHwgU19JWEdSUCB8IFNfSVhPVEgpKSkKKwkJcmV0dXJuIEFUVFIoMHhGMDAwKTsJLyogRmlsZSBpcyBleGVjdXRhYmxlIC4uLiAqLworCXJldHVybiBBVFRSKG1vZGUpOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9MU19GSUxFVFlQRVMKK3N0YXRpYyBjaGFyIGFwcGVuZF9jaGFyKG1vZGVfdCBtb2RlKQoreworCWlmICghKEcuYWxsX2ZtdCAmIExJU1RfRklMRVRZUEUpKQorCQlyZXR1cm4gJ1wwJzsKKwlpZiAoU19JU0RJUihtb2RlKSkKKwkJcmV0dXJuICcvJzsKKwlpZiAoIShHLmFsbF9mbXQgJiBMSVNUX0NMQVNTSUZZKSkKKwkJcmV0dXJuICdcMCc7CisJaWYgKFNfSVNSRUcobW9kZSkgJiYgKG1vZGUgJiAoU19JWFVTUiB8IFNfSVhHUlAgfCBTX0lYT1RIKSkpCisJCXJldHVybiAnKic7CisJcmV0dXJuIEFQUENIQVIobW9kZSk7Cit9CisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGNhbGNfbmFtZV9sZW4oY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBsZW47CisJdW5pX3N0YXRfdCB1bmlfc3RhdDsKKworCS8vIFRPRE86IHF1b3RlIHRhYiBhcyBcdCwgZXRjLCBpZiAtUQorCW5hbWUgPSBwcmludGFibGVfc3RyaW5nKCZ1bmlfc3RhdCwgbmFtZSk7CisKKwlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX1EpKSB7CisJCXJldHVybiB1bmlfc3RhdC51bmljb2RlX3dpZHRoOworCX0KKworCWxlbiA9IDIgKyB1bmlfc3RhdC51bmljb2RlX3dpZHRoOworCXdoaWxlICgqbmFtZSkgeworCQlpZiAoKm5hbWUgPT0gJyInIHx8ICpuYW1lID09ICdcXCcpIHsKKwkJCWxlbisrOworCQl9CisJCW5hbWUrKzsKKwl9CisJcmV0dXJuIGxlbjsKK30KKworLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgdXNlZCBjb2x1bW5zLgorICogTm90ZSB0aGF0IG9ubHkgU1RZTEVfQ09MVU1OQVIgdXNlcyByZXR1cm4gdmFsdWUuCisgKiBTVFlMRV9TSU5HTEUgYW5kIFNUWUxFX0xPTkcgZG9uJ3QgY2FyZS4KKyAqIGNvcmV1dGlscyA3LjIgYWxzbyBzdXBwb3J0czoKKyAqIGxzIC1iICgtLWVzY2FwZSkgPSBvY3RhbCBlc2NhcGVzIChhbHRob3VnaCBpdCBkb2Vzbid0IGxvb2sgbGlrZSB3b3JraW5nKQorICogbHMgLU4gKC0tbGl0ZXJhbCkgPSBub3QgZXNjYXBlIGF0IGFsbAorICovCitzdGF0aWMgdW5zaWduZWQgcHJpbnRfbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIGxlbjsKKwl1bmlfc3RhdF90IHVuaV9zdGF0OworCisJLy8gVE9ETzogcXVvdGUgdGFiIGFzIFx0LCBldGMsIGlmIC1RCisJbmFtZSA9IHByaW50YWJsZV9zdHJpbmcoJnVuaV9zdGF0LCBuYW1lKTsKKworCWlmICghKG9wdGlvbl9tYXNrMzIgJiBPUFRfUSkpIHsKKwkJZnB1dHMobmFtZSwgc3Rkb3V0KTsKKwkJcmV0dXJuIHVuaV9zdGF0LnVuaWNvZGVfd2lkdGg7CisJfQorCisJbGVuID0gMiArIHVuaV9zdGF0LnVuaWNvZGVfd2lkdGg7CisJcHV0Y2hhcignIicpOworCXdoaWxlICgqbmFtZSkgeworCQlpZiAoKm5hbWUgPT0gJyInIHx8ICpuYW1lID09ICdcXCcpIHsKKwkJCXB1dGNoYXIoJ1xcJyk7CisJCQlsZW4rKzsKKwkJfQorCQlwdXRjaGFyKCpuYW1lKTsKKwkJbmFtZSsrOworCX0KKwlwdXRjaGFyKCciJyk7CisJcmV0dXJuIGxlbjsKK30KKworLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgdXNlZCBjb2x1bW5zLgorICogTm90ZSB0aGF0IG9ubHkgU1RZTEVfQ09MVU1OQVIgdXNlcyByZXR1cm4gdmFsdWUsCisgKiBTVFlMRV9TSU5HTEUgYW5kIFNUWUxFX0xPTkcgZG9uJ3QgY2FyZS4KKyAqLworc3RhdGljIE5PSU5MSU5FIHVuc2lnbmVkIGRpc3BsYXlfc2luZ2xlKGNvbnN0IHN0cnVjdCBkbm9kZSAqZG4pCit7CisJdW5zaWduZWQgY29sdW1uID0gMDsKKwljaGFyICpscGF0aDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MU19GSUxFVFlQRVMgfHwgRU5BQkxFX0ZFQVRVUkVfTFNfQ09MT1IKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCWNoYXIgYXBwZW5kOworI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9MU19GSUxFVFlQRVMKKwlhcHBlbmQgPSBhcHBlbmRfY2hhcihkbi0+ZG5fbW9kZSk7CisjZW5kaWYKKworCS8qIERvIHJlYWRsaW5rIGVhcmx5LCBzbyB0aGF0IGlmIGl0IGZhaWxzLCBlcnJvciBtZXNzYWdlCisJICogZG9lcyBub3QgYXBwZWFyICppbnNpZGUqIHRoZSAibHMgLWwiIGxpbmUgKi8KKwlscGF0aCA9IE5VTEw7CisJaWYgKEcuYWxsX2ZtdCAmIExJU1RfU1lNTElOSykKKwkJaWYgKFNfSVNMTksoZG4tPmRuX21vZGUpKQorCQkJbHBhdGggPSB4bWFsbG9jX3JlYWRsaW5rX29yX3dhcm4oZG4tPmZ1bGxuYW1lKTsKKworCWlmIChHLmFsbF9mbXQgJiBMSVNUX0lOTykKKwkJY29sdW1uICs9IHByaW50ZigiJTdsbHUgIiwgKGxvbmcgbG9uZykgZG4tPmRuX2lubyk7CisvL1RPRE86IC1oIHNob3VsZCBhZmZlY3QgLXMgdG9vOgorCWlmIChHLmFsbF9mbXQgJiBMSVNUX0JMT0NLUykKKwkJY29sdW1uICs9IHByaW50ZigiJTYiT0ZGX0ZNVCJ1ICIsIChvZmZfdCkgKGRuLT5kbl9ibG9ja3MgPj4gMSkpOworCWlmIChHLmFsbF9mbXQgJiBMSVNUX01PREVCSVRTKQorCQljb2x1bW4gKz0gcHJpbnRmKCIlLTEwcyAiLCAoY2hhciAqKSBiYl9tb2RlX3N0cmluZyhkbi0+ZG5fbW9kZSkpOworCWlmIChHLmFsbF9mbXQgJiBMSVNUX05MSU5LUykKKwkJY29sdW1uICs9IHByaW50ZigiJTRsdSAiLCAobG9uZykgZG4tPmRuX25saW5rKTsKKwlpZiAoRy5hbGxfZm10ICYgTElTVF9JRF9OVU1FUklDKSB7CisJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX2cpCisJCQljb2x1bW4gKz0gcHJpbnRmKCIlLTh1ICIsIChpbnQpIGRuLT5kbl9naWQpOworCQllbHNlCisJCQljb2x1bW4gKz0gcHJpbnRmKCIlLTh1ICUtOHUgIiwKKwkJCQkJKGludCkgZG4tPmRuX3VpZCwKKwkJCQkJKGludCkgZG4tPmRuX2dpZCk7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0xTX1VTRVJOQU1FCisJZWxzZSBpZiAoRy5hbGxfZm10ICYgTElTVF9JRF9OQU1FKSB7CisJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX2cpIHsKKwkJCWNvbHVtbiArPSBwcmludGYoIiUtOC44cyAiLAorCQkJCWdldF9jYWNoZWRfZ3JvdXBuYW1lKGRuLT5kbl9naWQpKTsKKwkJfSBlbHNlIHsKKwkJCWNvbHVtbiArPSBwcmludGYoIiUtOC44cyAlLTguOHMgIiwKKwkJCQlnZXRfY2FjaGVkX3VzZXJuYW1lKGRuLT5kbl91aWQpLAorCQkJCWdldF9jYWNoZWRfZ3JvdXBuYW1lKGRuLT5kbl9naWQpKTsKKwkJfQorCX0KKyNlbmRpZgorCWlmIChHLmFsbF9mbXQgJiBMSVNUX1NJWkUpIHsKKwkJaWYgKFNfSVNCTEsoZG4tPmRuX21vZGUpIHx8IFNfSVNDSFIoZG4tPmRuX21vZGUpKSB7CisJCQljb2x1bW4gKz0gcHJpbnRmKCIlNHUsICUzdSAiLAorCQkJCQlkbi0+ZG5fcmRldl9tYWosCisJCQkJCWRuLT5kbl9yZGV2X21pbik7CisJCX0gZWxzZSB7CisJCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9oKSB7CisJCQkJY29sdW1uICs9IHByaW50ZigiJSJIVU1BTl9SRUFEQUJMRV9NQVhfV0lEVEhfU1RSInMgIiwKKwkJCQkJLyogcHJpbnQgc2l6ZSwgc2hvdyBvbmUgZnJhY3Rpb25hbCwgdXNlIHN1ZmZpeGVzICovCisJCQkJCW1ha2VfaHVtYW5fcmVhZGFibGVfc3RyKGRuLT5kbl9zaXplLCAxLCAwKQorCQkJCSk7CisJCQl9IGVsc2UgeworCQkJCWNvbHVtbiArPSBwcmludGYoIiU5Ik9GRl9GTVQidSAiLCBkbi0+ZG5fc2l6ZSk7CisJCQl9CisJCX0KKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfTFNfVElNRVNUQU1QUworCWlmIChHLmFsbF9mbXQgJiAoTElTVF9GVUxMVElNRXxMSVNUX0RBVEVfVElNRSkpIHsKKwkJY2hhciAqZmlsZXRpbWU7CisJCWNvbnN0IHRpbWVfdCAqdHRpbWUgPSAmZG4tPmRuX210aW1lOworCQlpZiAoRy5hbGxfZm10ICYgVElNRV9BQ0NFU1MpCisJCQl0dGltZSA9ICZkbi0+ZG5fYXRpbWU7CisJCWlmIChHLmFsbF9mbXQgJiBUSU1FX0NIQU5HRSkKKwkJCXR0aW1lID0gJmRuLT5kbl9jdGltZTsKKwkJZmlsZXRpbWUgPSBjdGltZSh0dGltZSk7CisJCS8qIGZpbGV0aW1lJ3MgZm9ybWF0OiAiV2VkIEp1biAzMCAyMTo0OTowOCAxOTkzXG4iICovCisJCWlmIChHLmFsbF9mbXQgJiBMSVNUX0ZVTExUSU1FKSB7IC8qIC1lICovCisJCQkvKiBOb3RlOiBjb3JldXRpbHMgOC40IGxzIC0tZnVsbC10aW1lIHByaW50czoKKwkJCSAqIDIwMDktMDctMTMgMTc6NDk6MjcuMDAwMDAwMDAwICswMjAwCisJCQkgKi8KKwkJCWNvbHVtbiArPSBwcmludGYoIiUuMjRzICIsIGZpbGV0aW1lKTsKKwkJfSBlbHNlIHsgLyogTElTVF9EQVRFX1RJTUUgKi8KKwkJCS8qIEcuY3VycmVudF90aW1lX3Qgfj09IHRpbWUoTlVMTCkgKi8KKwkJCXRpbWVfdCBhZ2UgPSBHLmN1cnJlbnRfdGltZV90IC0gKnR0aW1lOworCQkJaWYgKGFnZSA8IDM2MDBMICogMjQgKiAzNjUgLyAyICYmIGFnZSA+IC0xNSAqIDYwKSB7CisJCQkJLyogbGVzcyB0aGFuIDYgbW9udGhzIG9sZCAqLworCQkJCS8qICJtbW0gZGQgaGg6bW0gIiAqLworCQkJCXByaW50ZigiJS4xMnMgIiwgZmlsZXRpbWUgKyA0KTsKKwkJCX0gZWxzZSB7CisJCQkJLyogIm1tbSBkZCAgeXl5eSAiICovCisJCQkJLyogIm1tbSBkZCB5eXl5eSAiIGFmdGVyIHllYXIgOTk5OSA6KSAqLworCQkJCXN0cmNocihmaWxldGltZSArIDIwLCAnXG4nKVswXSA9ICcgJzsKKwkJCQlwcmludGYoIiUuN3MlNnMiLCBmaWxldGltZSArIDQsIGZpbGV0aW1lICsgMjApOworCQkJfQorCQkJY29sdW1uICs9IDEzOworCQl9CisJfQorI2VuZGlmCisjaWYgRU5BQkxFX1NFTElOVVgKKwlpZiAoRy5hbGxfZm10ICYgTElTVF9DT05URVhUKSB7CisJCWNvbHVtbiArPSBwcmludGYoIiUtMzJzICIsIGRuLT5zaWQgPyBkbi0+c2lkIDogInVua25vd24iKTsKKwkJZnJlZWNvbihkbi0+c2lkKTsKKwl9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0xTX0NPTE9SCisJaWYgKEdfc2hvd19jb2xvcikgeworCQltb2RlX3QgbW9kZSA9IGRuLT5kbl9tb2RlX2xzdGF0OworCQlpZiAoIW1vZGUpCisJCQlpZiAobHN0YXQoZG4tPmZ1bGxuYW1lLCAmc3RhdGJ1ZikgPT0gMCkKKwkJCQltb2RlID0gc3RhdGJ1Zi5zdF9tb2RlOworCQlwcmludGYoIlwwMzNbJXU7JXVtIiwgYm9sZChtb2RlKSwgZmdjb2xvcihtb2RlKSk7CisJfQorI2VuZGlmCisJY29sdW1uICs9IHByaW50X25hbWUoZG4tPm5hbWUpOworCWlmIChHX3Nob3dfY29sb3IpIHsKKwkJcHJpbnRmKCJcMDMzWzBtIik7CisJfQorCisJaWYgKGxwYXRoKSB7CisJCXByaW50ZigiIC0+ICIpOworI2lmIEVOQUJMRV9GRUFUVVJFX0xTX0ZJTEVUWVBFUyB8fCBFTkFCTEVfRkVBVFVSRV9MU19DT0xPUgorCQlpZiAoKEcuYWxsX2ZtdCAmIExJU1RfRklMRVRZUEUpIHx8IEdfc2hvd19jb2xvcikgeworCQkJbW9kZV90IG1vZGUgPSBkbi0+ZG5fbW9kZV9zdGF0OworCQkJaWYgKCFtb2RlKQorCQkJCWlmIChzdGF0KGRuLT5mdWxsbmFtZSwgJnN0YXRidWYpID09IDApCisJCQkJCW1vZGUgPSBzdGF0YnVmLnN0X21vZGU7CisjIGlmIEVOQUJMRV9GRUFUVVJFX0xTX0ZJTEVUWVBFUworCQkJYXBwZW5kID0gYXBwZW5kX2NoYXIobW9kZSk7CisjIGVuZGlmCisjIGlmIEVOQUJMRV9GRUFUVVJFX0xTX0NPTE9SCisJCQlpZiAoR19zaG93X2NvbG9yKSB7CisJCQkJcHJpbnRmKCJcMDMzWyV1OyV1bSIsIGJvbGQobW9kZSksIGZnY29sb3IobW9kZSkpOworCQkJfQorIyBlbmRpZgorCQl9CisjZW5kaWYKKwkJY29sdW1uICs9IHByaW50X25hbWUobHBhdGgpICsgNDsKKwkJZnJlZShscGF0aCk7CisJCWlmIChHX3Nob3dfY29sb3IpIHsKKwkJCXByaW50ZigiXDAzM1swbSIpOworCQl9CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0xTX0ZJTEVUWVBFUworCWlmIChHLmFsbF9mbXQgJiBMSVNUX0ZJTEVUWVBFKSB7CisJCWlmIChhcHBlbmQpIHsKKwkJCXB1dGNoYXIoYXBwZW5kKTsKKwkJCWNvbHVtbisrOworCQl9CisJfQorI2VuZGlmCisKKwlyZXR1cm4gY29sdW1uOworfQorCitzdGF0aWMgdm9pZCBkaXNwbGF5X2ZpbGVzKHN0cnVjdCBkbm9kZSAqKmRuLCB1bnNpZ25lZCBuZmlsZXMpCit7CisJdW5zaWduZWQgaSwgbmNvbHMsIG5yb3dzLCByb3csIG5jOworCXVuc2lnbmVkIGNvbHVtbjsKKwl1bnNpZ25lZCBuZXh0dGFiOworCXVuc2lnbmVkIGNvbHVtbl93aWR0aCA9IDA7IC8qIHVzZWQgb25seSBieSBTVFlMRV9DT0xVTU5BUiAqLworCisJaWYgKEcuYWxsX2ZtdCAmIFNUWUxFX0xPTkcpIHsgLyogU1RZTEVfTE9ORyBvciBTVFlMRV9TSU5HTEUgKi8KKwkJbmNvbHMgPSAxOworCX0gZWxzZSB7CisJCS8qIGZpbmQgdGhlIGxvbmdlc3QgZmlsZSBuYW1lLCB1c2UgdGhhdCBhcyB0aGUgY29sdW1uIHdpZHRoICovCisJCWZvciAoaSA9IDA7IGRuW2ldOyBpKyspIHsKKwkJCWludCBsZW4gPSBjYWxjX25hbWVfbGVuKGRuW2ldLT5uYW1lKTsKKwkJCWlmIChjb2x1bW5fd2lkdGggPCBsZW4pCisJCQkJY29sdW1uX3dpZHRoID0gbGVuOworCQl9CisJCWNvbHVtbl93aWR0aCArPSAxICsKKwkJCUlGX1NFTElOVVgoICgoRy5hbGxfZm10ICYgTElTVF9DT05URVhUKSA/IDMzIDogMCkgKyApCisJCQkJKChHLmFsbF9mbXQgJiBMSVNUX0lOTykgPyA4IDogMCkgKworCQkJCSgoRy5hbGxfZm10ICYgTElTVF9CTE9DS1MpID8gNSA6IDApOworCQluY29scyA9ICh1bnNpZ25lZClHX3Rlcm1pbmFsX3dpZHRoIC8gY29sdW1uX3dpZHRoOworCX0KKworCWlmIChuY29scyA+IDEpIHsKKwkJbnJvd3MgPSBuZmlsZXMgLyBuY29sczsKKwkJaWYgKG5yb3dzICogbmNvbHMgPCBuZmlsZXMpCisJCQlucm93cysrOyAgICAgICAgICAgICAgICAvKiByb3VuZCB1cCBmcmFjdGlvbmFscyAqLworCX0gZWxzZSB7CisJCW5yb3dzID0gbmZpbGVzOworCQluY29scyA9IDE7CisJfQorCisJY29sdW1uID0gMDsKKwluZXh0dGFiID0gMDsKKwlmb3IgKHJvdyA9IDA7IHJvdyA8IG5yb3dzOyByb3crKykgeworCQlmb3IgKG5jID0gMDsgbmMgPCBuY29sczsgbmMrKykgeworCQkJLyogcmVhY2ggaW50byB0aGUgYXJyYXkgYmFzZWQgb24gdGhlIGNvbHVtbiBhbmQgcm93ICovCisJCQlpZiAoRy5hbGxfZm10ICYgRElTUF9ST1dTKQorCQkJCWkgPSAocm93ICogbmNvbHMpICsgbmM7CS8qIGRpc3BsYXkgYWNyb3NzIHJvdyAqLworCQkJZWxzZQorCQkJCWkgPSAobmMgKiBucm93cykgKyByb3c7CS8qIGRpc3BsYXkgYnkgY29sdW1uICovCisJCQlpZiAoaSA8IG5maWxlcykgeworCQkJCWlmIChjb2x1bW4gPiAwKSB7CisJCQkJCW5leHR0YWIgLT0gY29sdW1uOworCQkJCQlwcmludGYoIiUqcyAiLCBuZXh0dGFiLCAiIik7CisJCQkJCWNvbHVtbiArPSBuZXh0dGFiICsgMTsKKwkJCQl9CisJCQkJbmV4dHRhYiA9IGNvbHVtbiArIGNvbHVtbl93aWR0aDsKKwkJCQljb2x1bW4gKz0gZGlzcGxheV9zaW5nbGUoZG5baV0pOworCQkJfQorCQl9CisJCXB1dGNoYXIoJ1xuJyk7CisJCWNvbHVtbiA9IDA7CisJfQorfQorCisKKy8qKiogRGlyIHNjYW5uaW5nIGNvZGUgKioqLworCitzdGF0aWMgc3RydWN0IGRub2RlICpteV9zdGF0KGNvbnN0IGNoYXIgKmZ1bGxuYW1lLCBjb25zdCBjaGFyICpuYW1lLCBpbnQgZm9yY2VfZm9sbG93KQoreworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJc3RydWN0IGRub2RlICpjdXI7CisKKwljdXIgPSB4emFsbG9jKHNpemVvZigqY3VyKSk7CisJY3VyLT5mdWxsbmFtZSA9IGZ1bGxuYW1lOworCWN1ci0+bmFtZSA9IG5hbWU7CisKKwlpZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfTCkgfHwgZm9yY2VfZm9sbG93KSB7CisjaWYgRU5BQkxFX1NFTElOVVgKKwkJaWYgKGlzX3NlbGludXhfZW5hYmxlZCgpKSAgeworCQkJZ2V0ZmlsZWNvbihmdWxsbmFtZSwgJmN1ci0+c2lkKTsKKwkJfQorI2VuZGlmCisJCWlmIChzdGF0KGZ1bGxuYW1lLCAmc3RhdGJ1ZikpIHsKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZ1bGxuYW1lKTsKKwkJCUcuZXhpdF9jb2RlID0gRVhJVF9GQUlMVVJFOworCQkJZnJlZShjdXIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJY3VyLT5kbl9tb2RlX3N0YXQgPSBzdGF0YnVmLnN0X21vZGU7CisJfSBlbHNlIHsKKyNpZiBFTkFCTEVfU0VMSU5VWAorCQlpZiAoaXNfc2VsaW51eF9lbmFibGVkKCkpIHsKKwkJCWxnZXRmaWxlY29uKGZ1bGxuYW1lLCAmY3VyLT5zaWQpOworCQl9CisjZW5kaWYKKwkJaWYgKGxzdGF0KGZ1bGxuYW1lLCAmc3RhdGJ1ZikpIHsKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZ1bGxuYW1lKTsKKwkJCUcuZXhpdF9jb2RlID0gRVhJVF9GQUlMVVJFOworCQkJZnJlZShjdXIpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJY3VyLT5kbl9tb2RlX2xzdGF0ID0gc3RhdGJ1Zi5zdF9tb2RlOworCX0KKworCS8qIGN1ci0+ZHN0YXQgPSBzdGF0YnVmOiAqLworCWN1ci0+ZG5fbW9kZSAgID0gc3RhdGJ1Zi5zdF9tb2RlICA7CisJY3VyLT5kbl9zaXplICAgPSBzdGF0YnVmLnN0X3NpemUgIDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MU19USU1FU1RBTVBTIHx8IEVOQUJMRV9GRUFUVVJFX0xTX1NPUlRGSUxFUworCWN1ci0+ZG5fYXRpbWUgID0gc3RhdGJ1Zi5zdF9hdGltZSA7CisJY3VyLT5kbl9tdGltZSAgPSBzdGF0YnVmLnN0X210aW1lIDsKKwljdXItPmRuX2N0aW1lICA9IHN0YXRidWYuc3RfY3RpbWUgOworI2VuZGlmCisJY3VyLT5kbl9pbm8gICAgPSBzdGF0YnVmLnN0X2lubyAgIDsKKwljdXItPmRuX2Jsb2NrcyA9IHN0YXRidWYuc3RfYmxvY2tzOworCWN1ci0+ZG5fbmxpbmsgID0gc3RhdGJ1Zi5zdF9ubGluayA7CisJY3VyLT5kbl91aWQgICAgPSBzdGF0YnVmLnN0X3VpZCAgIDsKKwljdXItPmRuX2dpZCAgICA9IHN0YXRidWYuc3RfZ2lkICAgOworCWN1ci0+ZG5fcmRldl9tYWogPSBtYWpvcihzdGF0YnVmLnN0X3JkZXYpOworCWN1ci0+ZG5fcmRldl9taW4gPSBtaW5vcihzdGF0YnVmLnN0X3JkZXYpOworCisJcmV0dXJuIGN1cjsKK30KKworc3RhdGljIHVuc2lnbmVkIGNvdW50X2RpcnMoc3RydWN0IGRub2RlICoqZG4sIGludCB3aGljaCkKK3sKKwl1bnNpZ25lZCBkaXJzLCBhbGw7CisKKwlpZiAoIWRuKQorCQlyZXR1cm4gMDsKKworCWRpcnMgPSBhbGwgPSAwOworCWZvciAoOyAqZG47IGRuKyspIHsKKwkJY29uc3QgY2hhciAqbmFtZTsKKworCQlhbGwrKzsKKwkJaWYgKCFTX0lTRElSKCgqZG4pLT5kbl9tb2RlKSkKKwkJCWNvbnRpbnVlOworCisJCW5hbWUgPSAoKmRuKS0+bmFtZTsKKwkJaWYgKHdoaWNoICE9IFNQTElUX1NVQkRJUiAvKiBpZiBub3QgcmVxdWVzdGVkIHRvIHNraXAgLiAvIC4uICovCisJCSAvKiBvciBpZiBpdCdzIG5vdCAuIG9yIC4uICovCisJCSB8fCBuYW1lWzBdICE9ICcuJworCQkgfHwgKG5hbWVbMV0gJiYgKG5hbWVbMV0gIT0gJy4nIHx8IG5hbWVbMl0pKQorCQkpIHsKKwkJCWRpcnMrKzsKKwkJfQorCX0KKwlyZXR1cm4gd2hpY2ggIT0gU1BMSVRfRklMRSA/IGRpcnMgOiBhbGwgLSBkaXJzOworfQorCisvKiBnZXQgbWVtb3J5IHRvIGhvbGQgYW4gYXJyYXkgb2YgcG9pbnRlcnMgKi8KK3N0YXRpYyBzdHJ1Y3QgZG5vZGUgKipkbmFsbG9jKHVuc2lnbmVkIG51bSkKK3sKKwlpZiAobnVtIDwgMSkKKwkJcmV0dXJuIE5VTEw7CisKKwludW0rKzsgLyogc28gdGhhdCB3ZSBoYXZlIHRlcm1pbmF0aW5nIE5VTEwgKi8KKwlyZXR1cm4geHphbGxvYyhudW0gKiBzaXplb2Yoc3RydWN0IGRub2RlICopKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0xTX1JFQ1VSU0lWRQorc3RhdGljIHZvaWQgZGZyZWUoc3RydWN0IGRub2RlICoqZG5wKQoreworCXVuc2lnbmVkIGk7CisKKwlpZiAoZG5wID09IE5VTEwpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGRucFtpXTsgaSsrKSB7CisJCXN0cnVjdCBkbm9kZSAqY3VyID0gZG5wW2ldOworCQlpZiAoY3VyLT5mbmFtZV9hbGxvY2F0ZWQpCisJCQlmcmVlKChjaGFyKiljdXItPmZ1bGxuYW1lKTsKKwkJZnJlZShjdXIpOworCX0KKwlmcmVlKGRucCk7Cit9CisjZWxzZQorI2RlZmluZSBkZnJlZSguLi4pICgodm9pZCkwKQorI2VuZGlmCisKKy8qIFJldHVybnMgTlVMTC10ZXJtaW5hdGVkIG1hbGxvY2VkIHZlY3RvciBvZiBwb2ludGVycyAob3IgTlVMTCkgKi8KK3N0YXRpYyBzdHJ1Y3QgZG5vZGUgKipzcGxpdGRuYXJyYXkoc3RydWN0IGRub2RlICoqZG4sIGludCB3aGljaCkKK3sKKwl1bnNpZ25lZCBkbmNudCwgZDsKKwlzdHJ1Y3QgZG5vZGUgKipkbnA7CisKKwlpZiAoZG4gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBjb3VudCBob3cgbWFueSBkaXJzIG9yIGZpbGVzIHRoZXJlIGFyZSAqLworCWRuY250ID0gY291bnRfZGlycyhkbiwgd2hpY2gpOworCisJLyogYWxsb2NhdGUgYSBmaWxlIGFycmF5IGFuZCBhIGRpciBhcnJheSAqLworCWRucCA9IGRuYWxsb2MoZG5jbnQpOworCisJLyogY29weSB0aGUgZW50cnlzIGludG8gdGhlIGZpbGUgb3IgZGlyIGFycmF5ICovCisJZm9yIChkID0gMDsgKmRuOyBkbisrKSB7CisJCWlmIChTX0lTRElSKCgqZG4pLT5kbl9tb2RlKSkgeworCQkJY29uc3QgY2hhciAqbmFtZTsKKworCQkJaWYgKHdoaWNoID09IFNQTElUX0ZJTEUpCisJCQkJY29udGludWU7CisKKwkJCW5hbWUgPSAoKmRuKS0+bmFtZTsKKwkJCWlmICgod2hpY2ggJiBTUExJVF9ESVIpIC8qIGFueSBkaXIuLi4gKi8KKwkJCS8qIC4uLiBvciBub3QgLiBvciAuLiAqLworCQkJIHx8IG5hbWVbMF0gIT0gJy4nCisJCQkgfHwgKG5hbWVbMV0gJiYgKG5hbWVbMV0gIT0gJy4nIHx8IG5hbWVbMl0pKQorCQkJKSB7CisJCQkJZG5wW2QrK10gPSAqZG47CisJCQl9CisJCX0gZWxzZQorCQlpZiAod2hpY2ggPT0gU1BMSVRfRklMRSkgeworCQkJZG5wW2QrK10gPSAqZG47CisJCX0KKwl9CisJcmV0dXJuIGRucDsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0xTX1NPUlRGSUxFUworc3RhdGljIGludCBzb3J0Y21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJc3RydWN0IGRub2RlICpkMSA9ICooc3RydWN0IGRub2RlICoqKWE7CisJc3RydWN0IGRub2RlICpkMiA9ICooc3RydWN0IGRub2RlICoqKWI7CisJdW5zaWduZWQgc29ydF9vcHRzID0gRy5hbGxfZm10ICYgU09SVF9NQVNLOworCW9mZl90IGRpZjsKKworCWRpZiA9IDA7IC8qIGFzc3VtZSBTT1JUX05BTUUgKi8KKwkvLyBUT0RPOiB1c2UgcHJlLWluaXRpYWxpemVkIGZ1bmN0aW9uIHBvaW50ZXIKKwkvLyBpbnN0ZWFkIG9mIGJyYW5jaCBmb3Jlc3QKKwlpZiAoc29ydF9vcHRzID09IFNPUlRfU0laRSkgeworCQlkaWYgPSAoZDItPmRuX3NpemUgLSBkMS0+ZG5fc2l6ZSk7CisJfSBlbHNlCisJaWYgKHNvcnRfb3B0cyA9PSBTT1JUX0FUSU1FKSB7CisJCWRpZiA9IChkMi0+ZG5fYXRpbWUgLSBkMS0+ZG5fYXRpbWUpOworCX0gZWxzZQorCWlmIChzb3J0X29wdHMgPT0gU09SVF9DVElNRSkgeworCQlkaWYgPSAoZDItPmRuX2N0aW1lIC0gZDEtPmRuX2N0aW1lKTsKKwl9IGVsc2UKKwlpZiAoc29ydF9vcHRzID09IFNPUlRfTVRJTUUpIHsKKwkJZGlmID0gKGQyLT5kbl9tdGltZSAtIGQxLT5kbl9tdGltZSk7CisJfSBlbHNlCisJaWYgKHNvcnRfb3B0cyA9PSBTT1JUX0RJUikgeworCQlkaWYgPSBTX0lTRElSKGQyLT5kbl9tb2RlKSAtIFNfSVNESVIoZDEtPmRuX21vZGUpOworCX0gZWxzZQorI2lmIGRlZmluZWQoSEFWRV9TVFJWRVJTQ01QKSAmJiBIQVZFX1NUUlZFUlNDTVAgPT0gMQorCWlmIChzb3J0X29wdHMgPT0gU09SVF9WRVJTSU9OKSB7CisJCWRpZiA9IHN0cnZlcnNjbXAoZDEtPm5hbWUsIGQyLT5uYW1lKTsKKwl9IGVsc2UKKyNlbmRpZgorCWlmIChzb3J0X29wdHMgPT0gU09SVF9FWFQpIHsKKwkJZGlmID0gc3RyY21wKHN0cmNocm51bChkMS0+bmFtZSwgJy4nKSwgc3RyY2hybnVsKGQyLT5uYW1lLCAnLicpKTsKKwl9CisJaWYgKGRpZiA9PSAwKSB7CisJCS8qIHNvcnQgYnkgbmFtZSwgdXNlIGFzIHRpZSBicmVha2VyIGZvciBvdGhlciBzb3J0cyAqLworCQlpZiAoRU5BQkxFX0xPQ0FMRV9TVVBQT1JUKQorCQkJZGlmID0gc3RyY29sbChkMS0+bmFtZSwgZDItPm5hbWUpOworCQllbHNlCisJCQlkaWYgPSBzdHJjbXAoZDEtPm5hbWUsIGQyLT5uYW1lKTsKKwl9CisKKwkvKiBNYWtlIGRpZiBmaXQgaW50byBhbiBpbnQgKi8KKwlpZiAoc2l6ZW9mKGRpZikgPiBzaXplb2YoaW50KSkgeworCQllbnVtIHsgQklUU19UT19TSElGVCA9IDggKiAoc2l6ZW9mKGRpZikgLSBzaXplb2YoaW50KSkgfTsKKwkJLyogc2hpZnQgbGVhdmluZyBvbmx5ICJpbnQiIHdvcnRoIG9mIGJpdHMgKi8KKwkJaWYgKGRpZiAhPSAwKSB7CisJCQlkaWYgPSAxIHwgKGludCkoKHVvZmZfdClkaWYgPj4gQklUU19UT19TSElGVCk7CisJCX0KKwl9CisKKwlyZXR1cm4gKEcuYWxsX2ZtdCAmIFNPUlRfUkVWRVJTRSkgPyAtKGludClkaWYgOiAoaW50KWRpZjsKK30KKworc3RhdGljIHZvaWQgZG5zb3J0KHN0cnVjdCBkbm9kZSAqKmRuLCBpbnQgc2l6ZSkKK3sKKwlxc29ydChkbiwgc2l6ZSwgc2l6ZW9mKCpkbiksIHNvcnRjbXApOworfQorCitzdGF0aWMgdm9pZCBzb3J0X2FuZF9kaXNwbGF5X2ZpbGVzKHN0cnVjdCBkbm9kZSAqKmRuLCB1bnNpZ25lZCBuZmlsZXMpCit7CisJZG5zb3J0KGRuLCBuZmlsZXMpOworCWRpc3BsYXlfZmlsZXMoZG4sIG5maWxlcyk7Cit9CisjZWxzZQorIyBkZWZpbmUgZG5zb3J0KGRuLCBzaXplKSAoKHZvaWQpMCkKKyMgZGVmaW5lIHNvcnRfYW5kX2Rpc3BsYXlfZmlsZXMoZG4sIG5maWxlcykgZGlzcGxheV9maWxlcyhkbiwgbmZpbGVzKQorI2VuZGlmCisKKy8qIFJldHVybnMgTlVMTC10ZXJtaW5hdGVkIG1hbGxvY2VkIHZlY3RvciBvZiBwb2ludGVycyAob3IgTlVMTCkgKi8KK3N0YXRpYyBzdHJ1Y3QgZG5vZGUgKipzY2FuX29uZV9kaXIoY29uc3QgY2hhciAqcGF0aCwgdW5zaWduZWQgKm5maWxlc19wKQoreworCXN0cnVjdCBkbm9kZSAqZG4sICpjdXIsICoqZG5wOworCXN0cnVjdCBkaXJlbnQgKmVudHJ5OworCURJUiAqZGlyOworCXVuc2lnbmVkIGksIG5maWxlczsKKworCSpuZmlsZXNfcCA9IDA7CisJZGlyID0gd2Fybl9vcGVuZGlyKHBhdGgpOworCWlmIChkaXIgPT0gTlVMTCkgeworCQlHLmV4aXRfY29kZSA9IEVYSVRfRkFJTFVSRTsKKwkJcmV0dXJuIE5VTEw7CS8qIGNvdWxkIG5vdCBvcGVuIHRoZSBkaXIgKi8KKwl9CisJZG4gPSBOVUxMOworCW5maWxlcyA9IDA7CisJd2hpbGUgKChlbnRyeSA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQljaGFyICpmdWxsbmFtZTsKKworCQkvKiBhcmUgd2UgZ29pbmcgdG8gbGlzdCB0aGUgZmlsZS0gaXQgbWF5IGJlIC4gb3IgLi4gb3IgYSBoaWRkZW4gZmlsZSAqLworCQlpZiAoZW50cnktPmRfbmFtZVswXSA9PSAnLicpIHsKKwkJCWlmICgoIWVudHJ5LT5kX25hbWVbMV0gfHwgKGVudHJ5LT5kX25hbWVbMV0gPT0gJy4nICYmICFlbnRyeS0+ZF9uYW1lWzJdKSkKKwkJCSAmJiAhKEcuYWxsX2ZtdCAmIERJU1BfRE9UKQorCQkJKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIShHLmFsbF9mbXQgJiBESVNQX0hJRERFTikpCisJCQkJY29udGludWU7CisJCX0KKwkJZnVsbG5hbWUgPSBjb25jYXRfcGF0aF9maWxlKHBhdGgsIGVudHJ5LT5kX25hbWUpOworCQljdXIgPSBteV9zdGF0KGZ1bGxuYW1lLCBiYl9iYXNlbmFtZShmdWxsbmFtZSksIDApOworCQlpZiAoIWN1cikgeworCQkJZnJlZShmdWxsbmFtZSk7CisJCQljb250aW51ZTsKKwkJfQorCQljdXItPmZuYW1lX2FsbG9jYXRlZCA9IDE7CisJCWN1ci0+ZG5fbmV4dCA9IGRuOworCQlkbiA9IGN1cjsKKwkJbmZpbGVzKys7CisJfQorCWNsb3NlZGlyKGRpcik7CisKKwlpZiAoZG4gPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBub3cgdGhhdCB3ZSBrbm93IGhvdyBtYW55IGZpbGVzIHRoZXJlIGFyZQorCSAqIGFsbG9jYXRlIG1lbW9yeSBmb3IgYW4gYXJyYXkgdG8gaG9sZCBkbm9kZSBwb2ludGVycworCSAqLworCSpuZmlsZXNfcCA9IG5maWxlczsKKwlkbnAgPSBkbmFsbG9jKG5maWxlcyk7CisJZm9yIChpID0gMDsgLyogaSA8IG5maWxlcyAtIGRldGVjdGVkIHZpYSAhZG4gYmVsb3cgKi87IGkrKykgeworCQlkbnBbaV0gPSBkbjsJLyogc2F2ZSBwb2ludGVyIHRvIG5vZGUgaW4gYXJyYXkgKi8KKwkJZG4gPSBkbi0+ZG5fbmV4dDsKKwkJaWYgKCFkbikKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBkbnA7Cit9CisKKyNpZiBFTkFCTEVfREVTS1RPUAorLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvbHMuaHRtbAorICogSWYgYW55IG9mIHRoZSAtbCwgLW4sIC1zIG9wdGlvbnMgaXMgc3BlY2lmaWVkLCBlYWNoIGxpc3QKKyAqIG9mIGZpbGVzIHdpdGhpbiB0aGUgZGlyZWN0b3J5IHNoYWxsIGJlIHByZWNlZGVkIGJ5IGEKKyAqIHN0YXR1cyBsaW5lIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiBmaWxlIHN5c3RlbSBibG9ja3MKKyAqIG9jY3VwaWVkIGJ5IGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgaW4gNTEyLWJ5dGUgdW5pdHMgaWYKKyAqIHRoZSAtayBvcHRpb24gaXMgbm90IHNwZWNpZmllZCwgb3IgMTAyNC1ieXRlIHVuaXRzIGlmIHRoZQorICogLWsgb3B0aW9uIGlzIHNwZWNpZmllZCwgcm91bmRlZCB1cCB0byB0aGUgbmV4dCBpbnRlZ3JhbAorICogbnVtYmVyIG9mIHVuaXRzLgorICovCisvKiBieSBKb3JnZW4gT3ZlcmdhYXJkIChqb3JnZW4gQVQgYW50aXN0YXRlbi5zZSkgKi8KK3N0YXRpYyBvZmZfdCBjYWxjdWxhdGVfYmxvY2tzKHN0cnVjdCBkbm9kZSAqKmRuKQoreworCXVvZmZfdCBibG9ja3MgPSAxOworCWlmIChkbikgeworCQl3aGlsZSAoKmRuKSB7CisJCQkvKiBzdF9ibG9ja3MgaXMgaW4gNTEyIGJ5dGUgYmxvY2tzICovCisJCQlibG9ja3MgKz0gKCpkbiktPmRuX2Jsb2NrczsKKwkJCWRuKys7CisJCX0KKwl9CisKKwkvKiBFdmVuIHRob3VnaCBzdGFuZGFyZCBzYXlzIHVzZSA1MTIgYnl0ZSBibG9ja3MsIGNvcmV1dGlscyB1c2UgMWsgKi8KKwkvKiBBY3R1YWxseSwgd2Ugcm91bmQgdXAgYnkgY2FsY3VsYXRpbmcgKGJsb2NrcyArIDEpIC8gMiwKKwkgKiAiKyAxIiB3YXMgZG9uZSB3aGVuIHdlIGluaXRpYWxpemVkIGJsb2NrcyB0byAxICovCisJcmV0dXJuIGJsb2NrcyA+PiAxOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNjYW5fYW5kX2Rpc3BsYXlfZGlyc19yZWN1cihzdHJ1Y3QgZG5vZGUgKipkbiwgaW50IGZpcnN0KQoreworCXVuc2lnbmVkIG5maWxlczsKKwlzdHJ1Y3QgZG5vZGUgKipzdWJkbnA7CisKKwlmb3IgKDsgKmRuOyBkbisrKSB7CisJCWlmIChHLmFsbF9mbXQgJiAoRElTUF9ESVJOQU1FIHwgRElTUF9SRUNVUlNJVkUpKSB7CisJCQlpZiAoIWZpcnN0KQorCQkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCQlmaXJzdCA9IDA7CisJCQlwcmludGYoIiVzOlxuIiwgKCpkbiktPmZ1bGxuYW1lKTsKKwkJfQorCQlzdWJkbnAgPSBzY2FuX29uZV9kaXIoKCpkbiktPmZ1bGxuYW1lLCAmbmZpbGVzKTsKKyNpZiBFTkFCTEVfREVTS1RPUAorCQlpZiAoKEcuYWxsX2ZtdCAmIFNUWUxFX01BU0spID09IFNUWUxFX0xPTkcgfHwgKEcuYWxsX2ZtdCAmIExJU1RfQkxPQ0tTKSkKKwkJCXByaW50ZigidG90YWwgJSJPRkZfRk1UInVcbiIsIGNhbGN1bGF0ZV9ibG9ja3Moc3ViZG5wKSk7CisjZW5kaWYKKwkJaWYgKG5maWxlcyA+IDApIHsKKwkJCS8qIGxpc3QgYWxsIGZpbGVzIGF0IHRoaXMgbGV2ZWwgKi8KKwkJCXNvcnRfYW5kX2Rpc3BsYXlfZmlsZXMoc3ViZG5wLCBuZmlsZXMpOworCisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfTFNfUkVDVVJTSVZFCisJCQkgJiYgKEcuYWxsX2ZtdCAmIERJU1BfUkVDVVJTSVZFKQorCQkJKSB7CisJCQkJc3RydWN0IGRub2RlICoqZG5kOworCQkJCXVuc2lnbmVkIGRuZGlyczsKKwkJCQkvKiByZWN1cnNpdmUgLSBsaXN0IHRoZSBzdWItZGlycyAqLworCQkJCWRuZCA9IHNwbGl0ZG5hcnJheShzdWJkbnAsIFNQTElUX1NVQkRJUik7CisJCQkJZG5kaXJzID0gY291bnRfZGlycyhzdWJkbnAsIFNQTElUX1NVQkRJUik7CisJCQkJaWYgKGRuZGlycyA+IDApIHsKKwkJCQkJZG5zb3J0KGRuZCwgZG5kaXJzKTsKKwkJCQkJc2Nhbl9hbmRfZGlzcGxheV9kaXJzX3JlY3VyKGRuZCwgMCk7CisJCQkJCS8qIGZyZWUgdGhlIGFycmF5IG9mIGRub2RlIHBvaW50ZXJzIHRvIHRoZSBkaXJzICovCisJCQkJCWZyZWUoZG5kKTsKKwkJCQl9CisJCQl9CisJCQkvKiBmcmVlIHRoZSBkbm9kZXMgYW5kIHRoZSBmdWxsbmFtZSBtZW0gKi8KKwkJCWRmcmVlKHN1YmRucCk7CisJCX0KKwl9Cit9CisKKworaW50IGxzX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgZG5vZGUgKipkbmQ7CisJc3RydWN0IGRub2RlICoqZG5mOworCXN0cnVjdCBkbm9kZSAqKmRucDsKKwlzdHJ1Y3QgZG5vZGUgKmRuOworCXN0cnVjdCBkbm9kZSAqY3VyOworCXVuc2lnbmVkIG9wdDsKKwl1bnNpZ25lZCBuZmlsZXM7CisJdW5zaWduZWQgZG5maWxlczsKKwl1bnNpZ25lZCBkbmRpcnM7CisJdW5zaWduZWQgaTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MU19DT0xPUgorCS8qIGNvbG9yZWQgTFMgc3VwcG9ydCBieSBKYVdpLCBqYW53aWxsZW0uamFuc3NlbkBseHRyZW1lLm5sICovCisJLyogY29yZXV0aWxzIDYuMTA6CisJICogIyBscyAtLWNvbG9yPUJPR1VTCisJICogbHM6IGludmFsaWQgYXJndW1lbnQgJ0JPR1VTJyBmb3IgJy0tY29sb3InCisJICogVmFsaWQgYXJndW1lbnRzIGFyZToKKwkgKiAnYWx3YXlzJywgJ3llcycsICdmb3JjZScKKwkgKiAnbmV2ZXInLCAnbm8nLCAnbm9uZScKKwkgKiAnYXV0bycsICd0dHknLCAnaWYtdHR5JworCSAqIChhbmQgc3Vic3RyaW5nczogIi0tY29sb3I9YWx3YSIgd29yayB0b28pCisJICovCisJc3RhdGljIGNvbnN0IGNoYXIgbHNfbG9uZ29wdHNbXSBBTElHTjEgPQorCQkiY29sb3JcMCIgT3B0aW9uYWxfYXJndW1lbnQgIlx4ZmYiOyAvKiBubyBzaG9ydCBlcXVpdmFsZW50ICovCisJc3RhdGljIGNvbnN0IGNoYXIgY29sb3Jfc3RyW10gQUxJR04xID0KKwkJImFsd2F5c1wwIiJ5ZXNcMCIiZm9yY2VcMCIKKwkJImF1dG9cMCIidHR5XDAiImlmLXR0eVwwIjsKKwkvKiBuZWVkIHRvIGluaXRpYWxpemUgc2luY2UgLS1jb2xvciBoYXMgX2FuIG9wdGlvbmFsXyBhcmd1bWVudCAqLworCWNvbnN0IGNoYXIgKmNvbG9yX29wdCA9IGNvbG9yX3N0cjsgLyogImFsd2F5cyIgKi8KKyNlbmRpZgorCisJSU5JVF9HKCk7CisKKwlpbml0X3VuaWNvZGUoKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9MU19TT1JURklMRVMpCisJCUcuYWxsX2ZtdCA9IFNPUlRfTkFNRTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0FVVE9XSURUSAorCS8qIG9idGFpbiB0aGUgdGVybWluYWwgd2lkdGggKi8KKwlnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KFNURElOX0ZJTEVOTywgJkdfdGVybWluYWxfd2lkdGgsIE5VTEwpOworCS8qIGdvIG9uZSBsZXNzLi4uICovCisJR190ZXJtaW5hbF93aWR0aC0tOworI2VuZGlmCisKKwkvKiBwcm9jZXNzIG9wdGlvbnMgKi8KKwlJRl9GRUFUVVJFX0xTX0NPTE9SKGFwcGxldF9sb25nX29wdGlvbnMgPSBsc19sb25nb3B0czspCisJb3B0X2NvbXBsZW1lbnRhcnkgPQorCQkvKiAtZSBpbXBsaWVzIC1sICovCisJCUlGX0ZFQVRVUkVfTFNfVElNRVNUQU1QUygiZWwiKQorCQkvKiBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvbHMuaHRtbDoKKwkJICogaW4gc29tZSBwYWlycyBvZiBvcHRzLCBvbmx5IGxhc3Qgb25lIHRha2VzIGVmZmVjdDoKKwkJICovCisJCUlGX0ZFQVRVUkVfTFNfVElNRVNUQU1QUyhJRl9GRUFUVVJFX0xTX1NPUlRGSUxFUygiOnQtUzpTLXQiKSkgLyogdGltZS9zaXplICovCisJCS8vICI6bS1sOmwtbSIgLSB3ZSBkb24ndCBoYXZlIC1tCisJCUlGX0ZFQVRVUkVfTFNfRk9MTE9XTElOS1MoIjpILUw6TC1IIikKKwkJIjpDLXhsOngtQ2w6bC14QyIgLyogYnljb2xzL2J5bGluZXMvbG9uZyAqLworCQkiOkMtMToxLUMiIC8qIGJ5Y29scy9vbmVsaW5lICovCisJCSI6eC0xOjEteCIgLyogYnlsaW5lcy9vbmVsaW5lIChub3QgaW4gU3VTLCBidXQgaW4gR05VIGNvcmV1dGlscyA4LjQpICovCisJCUlGX0ZFQVRVUkVfTFNfVElNRVNUQU1QUygiOmMtdTp1LWMiKSAvKiBtdGltZS9hdGltZSAqLworCQkvKiAtdyBOVU06ICovCisJCUlGX0ZFQVRVUkVfQVVUT1dJRFRIKCI6dysiKTsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCBsc19vcHRpb25zCisJCUlGX0ZFQVRVUkVfQVVUT1dJRFRIKCwgTlVMTCwgJkdfdGVybWluYWxfd2lkdGgpCisJCUlGX0ZFQVRVUkVfTFNfQ09MT1IoLCAmY29sb3Jfb3B0KQorCSk7CisJZm9yIChpID0gMDsgb3B0X2ZsYWdzW2ldICE9ICgxVSA8PCAzMSk7IGkrKykgeworCQlpZiAob3B0ICYgKDEgPDwgaSkpIHsKKwkJCXVpbnQzMl90IGZsYWdzID0gb3B0X2ZsYWdzW2ldOworCisJCQlpZiAoZmxhZ3MgJiBTVFlMRV9NQVNLKQorCQkJCUcuYWxsX2ZtdCAmPSB+U1RZTEVfTUFTSzsKKwkJCWlmIChmbGFncyAmIFNPUlRfTUFTSykKKwkJCQlHLmFsbF9mbXQgJj0gflNPUlRfTUFTSzsKKwkJCWlmIChmbGFncyAmIFRJTUVfTUFTSykKKwkJCQlHLmFsbF9mbXQgJj0gflRJTUVfTUFTSzsKKworCQkJRy5hbGxfZm10IHw9IGZsYWdzOworCQl9CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTFNfQ09MT1IKKwkvKiBzZXQgR19zaG93X2NvbG9yID0gMS8wICovCisJaWYgKEVOQUJMRV9GRUFUVVJFX0xTX0NPTE9SX0lTX0RFRkFVTFQgJiYgaXNhdHR5KFNURE9VVF9GSUxFTk8pKSB7CisJCWNoYXIgKnAgPSBnZXRlbnYoIkxTX0NPTE9SUyIpOworCQkvKiBMU19DT0xPUlMgaXMgdW5zZXQsIG9yIChub3QgZW1wdHkgJiYgbm90ICJub25lIikgPyAqLworCQlpZiAoIXAgfHwgKHBbMF0gJiYgc3RyY21wKHAsICJub25lIikgIT0gMCkpCisJCQlHX3Nob3dfY29sb3IgPSAxOworCX0KKwlpZiAob3B0ICYgT1BUX2NvbG9yKSB7CisJCWlmIChjb2xvcl9vcHRbMF0gPT0gJ24nKQorCQkJR19zaG93X2NvbG9yID0gMDsKKwkJZWxzZSBzd2l0Y2ggKGluZGV4X2luX3N1YnN0cmluZ3MoY29sb3Jfc3RyLCBjb2xvcl9vcHQpKSB7CisJCWNhc2UgMzoKKwkJY2FzZSA0OgorCQljYXNlIDU6CisJCQlpZiAoaXNhdHR5KFNURE9VVF9GSUxFTk8pKSB7CisJCWNhc2UgMDoKKwkJY2FzZSAxOgorCQljYXNlIDI6CisJCQkJR19zaG93X2NvbG9yID0gMTsKKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCisJLyogc29ydCBvdXQgd2hpY2ggY29tbWFuZCBsaW5lIG9wdGlvbnMgdGFrZSBwcmVjZWRlbmNlICovCisJaWYgKEVOQUJMRV9GRUFUVVJFX0xTX1JFQ1VSU0lWRSAmJiAoRy5hbGxfZm10ICYgRElTUF9OT0xJU1QpKQorCQlHLmFsbF9mbXQgJj0gfkRJU1BfUkVDVVJTSVZFOwkvKiBubyByZWN1cnNlIGlmIGxpc3Rpbmcgb25seSBkaXIgKi8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfTFNfVElNRVNUQU1QUyAmJiBFTkFCTEVfRkVBVFVSRV9MU19TT1JURklMRVMpIHsKKwkJaWYgKEcuYWxsX2ZtdCAmIFRJTUVfQ0hBTkdFKQorCQkJRy5hbGxfZm10ID0gKEcuYWxsX2ZtdCAmIH5TT1JUX01BU0spIHwgU09SVF9DVElNRTsKKwkJaWYgKEcuYWxsX2ZtdCAmIFRJTUVfQUNDRVNTKQorCQkJRy5hbGxfZm10ID0gKEcuYWxsX2ZtdCAmIH5TT1JUX01BU0spIHwgU09SVF9BVElNRTsKKwl9CisJaWYgKChHLmFsbF9mbXQgJiBTVFlMRV9NQVNLKSAhPSBTVFlMRV9MT05HKSAvKiBub3QgLWw/ICovCisJCUcuYWxsX2ZtdCAmPSB+KExJU1RfSURfTlVNRVJJQ3xMSVNUX0lEX05BTUV8TElTVF9GVUxMVElNRSk7CisKKwkvKiBjaG9vc2UgYSBkaXNwbGF5IGZvcm1hdCBpZiBvbmUgd2FzIG5vdCBhbHJlYWR5IHNwZWNpZmllZCBieSBhbiBvcHRpb24gKi8KKwlpZiAoIShHLmFsbF9mbXQgJiBTVFlMRV9NQVNLKSkKKwkJRy5hbGxfZm10IHw9IChpc2F0dHkoU1RET1VUX0ZJTEVOTykgPyBTVFlMRV9DT0xVTU5BUiA6IFNUWUxFX1NJTkdMRSk7CisKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoIWFyZ3ZbMF0pCisJCSotLWFyZ3YgPSAoY2hhciopIi4iOworCisJaWYgKGFyZ3ZbMV0pCisJCUcuYWxsX2ZtdCB8PSBESVNQX0RJUk5BTUU7IC8qIDIgb3IgbW9yZSBpdGVtcz8gbGFiZWwgZGlyZWN0b3JpZXMgKi8KKworCS8qIHN0dWZmIHRoZSBjb21tYW5kIGxpbmUgZmlsZSBuYW1lcyBpbnRvIGEgZG5vZGUgYXJyYXkgKi8KKwlkbiA9IE5VTEw7CisJbmZpbGVzID0gMDsKKwlkbyB7CisJCWN1ciA9IG15X3N0YXQoKmFyZ3YsICphcmd2LAorCQkJLyogZm9sbG93IGxpbmtzIG9uIGNvbW1hbmQgbGluZSB1bmxlc3MgLWwsIC1zIG9yIC1GOiAqLworCQkJISgoRy5hbGxfZm10ICYgU1RZTEVfTUFTSykgPT0gU1RZTEVfTE9ORworCQkJICB8fCAoRy5hbGxfZm10ICYgTElTVF9CTE9DS1MpCisJCQkgIHx8IChvcHRpb25fbWFzazMyICYgT1BUX0YpCisJCQkpCisJCQkvKiAuLi4gb3IgaWYgLUg6ICovCisJCQl8fCAob3B0aW9uX21hc2szMiAmIE9QVF9IKQorCQkJLyogLi4uIG9yIGlmIC1MLCBidXQgbXlfc3RhdCBhbHdheXMgZm9sbG93cyBsaW5rcyBpZiAtTCAqLworCQkpOworCQlhcmd2Kys7CisJCWlmICghY3VyKQorCQkJY29udGludWU7CisJCS8qY3VyLT5mbmFtZV9hbGxvY2F0ZWQgPSAwOyAtIGFscmVhZHkgaXMgKi8KKwkJY3VyLT5kbl9uZXh0ID0gZG47CisJCWRuID0gY3VyOworCQluZmlsZXMrKzsKKwl9IHdoaWxlICgqYXJndik7CisKKwkvKiBuZmlsZXMgX21heV8gYmUgMCBoZXJlIC0gdHJ5ICJscyBkb2VzbnRfZXhpc3QiICovCisJaWYgKG5maWxlcyA9PSAwKQorCQlyZXR1cm4gRy5leGl0X2NvZGU7CisKKwkvKiBub3cgdGhhdCB3ZSBrbm93IGhvdyBtYW55IGZpbGVzIHRoZXJlIGFyZQorCSAqIGFsbG9jYXRlIG1lbW9yeSBmb3IgYW4gYXJyYXkgdG8gaG9sZCBkbm9kZSBwb2ludGVycworCSAqLworCWRucCA9IGRuYWxsb2MobmZpbGVzKTsKKwlmb3IgKGkgPSAwOyAvKiBpIDwgbmZpbGVzIC0gZGV0ZWN0ZWQgdmlhICFkbiBiZWxvdyAqLzsgaSsrKSB7CisJCWRucFtpXSA9IGRuOwkvKiBzYXZlIHBvaW50ZXIgdG8gbm9kZSBpbiBhcnJheSAqLworCQlkbiA9IGRuLT5kbl9uZXh0OworCQlpZiAoIWRuKQorCQkJYnJlYWs7CisJfQorCisJaWYgKEcuYWxsX2ZtdCAmIERJU1BfTk9MSVNUKSB7CisJCXNvcnRfYW5kX2Rpc3BsYXlfZmlsZXMoZG5wLCBuZmlsZXMpOworCX0gZWxzZSB7CisJCWRuZCA9IHNwbGl0ZG5hcnJheShkbnAsIFNQTElUX0RJUik7CisJCWRuZiA9IHNwbGl0ZG5hcnJheShkbnAsIFNQTElUX0ZJTEUpOworCQlkbmRpcnMgPSBjb3VudF9kaXJzKGRucCwgU1BMSVRfRElSKTsKKwkJZG5maWxlcyA9IG5maWxlcyAtIGRuZGlyczsKKwkJaWYgKGRuZmlsZXMgPiAwKSB7CisJCQlzb3J0X2FuZF9kaXNwbGF5X2ZpbGVzKGRuZiwgZG5maWxlcyk7CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJZnJlZShkbmYpOworCQl9CisJCWlmIChkbmRpcnMgPiAwKSB7CisJCQlkbnNvcnQoZG5kLCBkbmRpcnMpOworCQkJc2Nhbl9hbmRfZGlzcGxheV9kaXJzX3JlY3VyKGRuZCwgZG5maWxlcyA9PSAwKTsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCQlmcmVlKGRuZCk7CisJCX0KKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWRmcmVlKGRucCk7CisJcmV0dXJuIEcuZXhpdF9jb2RlOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL21kNV9zaGExX3N1bS5jIGIvY29yZXV0aWxzL21kNV9zaGExX3N1bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNTM0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvbWQ1X3NoYTFfc3VtLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgR2xlbm4gTC4gTWNHcmF0aAorICogIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IEVyaWsgQW5kZXJzZW4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBtZDVzdW1fdHJpdmlhbF91c2FnZQorLy91c2FnZToJSUZfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0soIlstY1tzd11dICIpIltGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBtZDVzdW1fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCIgSUZfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0soIiBvciBjaGVjayIpICIgTUQ1IGNoZWNrc3VtcyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLKCAiXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCUNoZWNrIHN1bXMgYWdhaW5zdCBsaXN0IGluIEZJTEVzIgorLy91c2FnZTogICAgICJcbgktcwlEb24ndCBvdXRwdXQgYW55dGhpbmcsIHN0YXR1cyBjb2RlIHNob3dzIHN1Y2Nlc3MiCisvL3VzYWdlOiAgICAgIlxuCS13CVdhcm4gYWJvdXQgaW1wcm9wZXJseSBmb3JtYXR0ZWQgY2hlY2tzdW0gbGluZXMiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG1kNXN1bV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBtZDVzdW0gPCBidXN5Ym94XG4iCisvL3VzYWdlOiAgICAgICAiNmZkMTFlOThiOThhNThmNjRmZjMzOThkN2IzMjQwMDNcbiIKKy8vdXNhZ2U6ICAgICAgICIkIG1kNXN1bSBidXN5Ym94XG4iCisvL3VzYWdlOiAgICAgICAiNmZkMTFlOThiOThhNThmNjRmZjMzOThkN2IzMjQwMDMgIGJ1c3lib3hcbiIKKy8vdXNhZ2U6ICAgICAgICIkIG1kNXN1bSAtYyAtXG4iCisvL3VzYWdlOiAgICAgICAiNmZkMTFlOThiOThhNThmNjRmZjMzOThkN2IzMjQwMDMgIGJ1c3lib3hcbiIKKy8vdXNhZ2U6ICAgICAgICJidXN5Ym94OiBPS1xuIgorLy91c2FnZTogICAgICAgIl5EXG4iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHNoYTFzdW1fdHJpdmlhbF91c2FnZQorLy91c2FnZToJSUZfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0soIlstY1tzd11dICIpIltGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBzaGExc3VtX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQiIElGX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLKCIgb3IgY2hlY2siKSAiIFNIQTEgY2hlY2tzdW1zIgorLy91c2FnZToJSUZfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0soICJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJQ2hlY2sgc3VtcyBhZ2FpbnN0IGxpc3QgaW4gRklMRXMiCisvL3VzYWdlOiAgICAgIlxuCS1zCURvbid0IG91dHB1dCBhbnl0aGluZywgc3RhdHVzIGNvZGUgc2hvd3Mgc3VjY2VzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXcJV2FybiBhYm91dCBpbXByb3Blcmx5IGZvcm1hdHRlZCBjaGVja3N1bSBsaW5lcyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgc2hhMjU2c3VtX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLKCJbLWNbc3ddXSAiKSJbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgc2hhMjU2c3VtX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQiIElGX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLKCIgb3IgY2hlY2siKSAiIFNIQTI1NiBjaGVja3N1bXMiCisvL3VzYWdlOglJRl9GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSyggIlxuIgorLy91c2FnZTogICAgICJcbgktYwlDaGVjayBzdW1zIGFnYWluc3QgbGlzdCBpbiBGSUxFcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJRG9uJ3Qgb3V0cHV0IGFueXRoaW5nLCBzdGF0dXMgY29kZSBzaG93cyBzdWNjZXNzIgorLy91c2FnZTogICAgICJcbgktdwlXYXJuIGFib3V0IGltcHJvcGVybHkgZm9ybWF0dGVkIGNoZWNrc3VtIGxpbmVzIgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBzaGE1MTJzdW1fdHJpdmlhbF91c2FnZQorLy91c2FnZToJSUZfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0soIlstY1tzd11dICIpIltGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBzaGE1MTJzdW1fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCIgSUZfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0soIiBvciBjaGVjayIpICIgU0hBNTEyIGNoZWNrc3VtcyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLKCAiXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCUNoZWNrIHN1bXMgYWdhaW5zdCBsaXN0IGluIEZJTEVzIgorLy91c2FnZTogICAgICJcbgktcwlEb24ndCBvdXRwdXQgYW55dGhpbmcsIHN0YXR1cyBjb2RlIHNob3dzIHN1Y2Nlc3MiCisvL3VzYWdlOiAgICAgIlxuCS13CVdhcm4gYWJvdXQgaW1wcm9wZXJseSBmb3JtYXR0ZWQgY2hlY2tzdW0gbGluZXMiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHNoYTNzdW1fdHJpdmlhbF91c2FnZQorLy91c2FnZToJSUZfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0soIlstY1tzd11dICIpIltGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBzaGEzc3VtX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQiIElGX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLKCIgb3IgY2hlY2siKSAiIFNIQTMtNTEyIGNoZWNrc3VtcyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLKCAiXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCUNoZWNrIHN1bXMgYWdhaW5zdCBsaXN0IGluIEZJTEVzIgorLy91c2FnZTogICAgICJcbgktcwlEb24ndCBvdXRwdXQgYW55dGhpbmcsIHN0YXR1cyBjb2RlIHNob3dzIHN1Y2Nlc3MiCisvL3VzYWdlOiAgICAgIlxuCS13CVdhcm4gYWJvdXQgaW1wcm9wZXJseSBmb3JtYXR0ZWQgY2hlY2tzdW0gbGluZXMiCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9FWEVDIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitlbnVtIHsKKwkvKiA0dGggbGV0dGVyIG9mIGFwcGxldF9uYW1lIGlzLi4uICovCisJSEFTSF9NRDUgPSAncycsIC8qICJtZDU+czx1bSIgKi8KKwlIQVNIX1NIQTEgPSAnMScsCisJSEFTSF9TSEEyNTYgPSAnMicsCisJSEFTSF9TSEEzID0gJzMnLAorCUhBU0hfU0hBNTEyID0gJzUnLAorfTsKKworI2RlZmluZSBGTEFHX1NJTEVOVCAgMQorI2RlZmluZSBGTEFHX0NIRUNLICAgMgorI2RlZmluZSBGTEFHX1dBUk4gICAgNAorCisvKiBUaGlzIG1pZ2h0IGJlIHVzZWZ1bCBlbHNld2hlcmUgKi8KK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpoYXNoX2Jpbl90b19oZXgodW5zaWduZWQgY2hhciAqaGFzaF92YWx1ZSwKKwkJCQl1bnNpZ25lZCBoYXNoX2xlbmd0aCkKK3sKKwkvKiB4emFsbG9jIHplcm8tdGVybWluYXRlcyAqLworCWNoYXIgKmhleF92YWx1ZSA9IHh6YWxsb2MoKGhhc2hfbGVuZ3RoICogMikgKyAxKTsKKwliaW4yaGV4KGhleF92YWx1ZSwgKGNoYXIqKWhhc2hfdmFsdWUsIGhhc2hfbGVuZ3RoKTsKKwlyZXR1cm4gKHVuc2lnbmVkIGNoYXIgKiloZXhfdmFsdWU7Cit9CisKK3N0YXRpYyB1aW50OF90ICpoYXNoX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaW50IHNyY19mZCwgaGFzaF9sZW4sIGNvdW50OworCXVuaW9uIF9jdHhfIHsKKwkJc2hhM19jdHhfdCBzaGEzOworCQlzaGE1MTJfY3R4X3Qgc2hhNTEyOworCQlzaGEyNTZfY3R4X3Qgc2hhMjU2OworCQlzaGExX2N0eF90IHNoYTE7CisJCW1kNV9jdHhfdCBtZDU7CisJfSBjb250ZXh0OworCXVpbnQ4X3QgKmhhc2hfdmFsdWU7CisJdm9pZCBGQVNUX0ZVTkMgKCp1cGRhdGUpKHZvaWQqLCBjb25zdCB2b2lkKiwgc2l6ZV90KTsKKwl2b2lkIEZBU1RfRlVOQyAoKmZpbmFsKSh2b2lkKiwgdm9pZCopOworCWNoYXIgaGFzaF9hbGdvOworCisJc3JjX2ZkID0gb3Blbl9vcl93YXJuX3N0ZGluKGZpbGVuYW1lKTsKKwlpZiAoc3JjX2ZkIDwgMCkgeworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwloYXNoX2FsZ28gPSBhcHBsZXRfbmFtZVszXTsKKworCS8qIGZpZ3VyZSBzcGVjaWZpYyBoYXNoIGFsZ29yaXRobXMgKi8KKwlpZiAoRU5BQkxFX01ENVNVTSAmJiBoYXNoX2FsZ28gPT0gSEFTSF9NRDUpIHsKKwkJbWQ1X2JlZ2luKCZjb250ZXh0Lm1kNSk7CisJCXVwZGF0ZSA9ICh2b2lkKiltZDVfaGFzaDsKKwkJZmluYWwgPSAodm9pZCopbWQ1X2VuZDsKKwkJaGFzaF9sZW4gPSAxNjsKKwl9IGVsc2UgaWYgKEVOQUJMRV9TSEExU1VNICYmIGhhc2hfYWxnbyA9PSBIQVNIX1NIQTEpIHsKKwkJc2hhMV9iZWdpbigmY29udGV4dC5zaGExKTsKKwkJdXBkYXRlID0gKHZvaWQqKXNoYTFfaGFzaDsKKwkJZmluYWwgPSAodm9pZCopc2hhMV9lbmQ7CisJCWhhc2hfbGVuID0gMjA7CisJfSBlbHNlIGlmIChFTkFCTEVfU0hBMjU2U1VNICYmIGhhc2hfYWxnbyA9PSBIQVNIX1NIQTI1NikgeworCQlzaGEyNTZfYmVnaW4oJmNvbnRleHQuc2hhMjU2KTsKKwkJdXBkYXRlID0gKHZvaWQqKXNoYTI1Nl9oYXNoOworCQlmaW5hbCA9ICh2b2lkKilzaGEyNTZfZW5kOworCQloYXNoX2xlbiA9IDMyOworCX0gZWxzZSBpZiAoRU5BQkxFX1NIQTUxMlNVTSAmJiBoYXNoX2FsZ28gPT0gSEFTSF9TSEE1MTIpIHsKKwkJc2hhNTEyX2JlZ2luKCZjb250ZXh0LnNoYTUxMik7CisJCXVwZGF0ZSA9ICh2b2lkKilzaGE1MTJfaGFzaDsKKwkJZmluYWwgPSAodm9pZCopc2hhNTEyX2VuZDsKKwkJaGFzaF9sZW4gPSA2NDsKKwl9IGVsc2UgaWYgKEVOQUJMRV9TSEEzU1VNICYmIGhhc2hfYWxnbyA9PSBIQVNIX1NIQTMpIHsKKwkJc2hhM19iZWdpbigmY29udGV4dC5zaGEzKTsKKwkJdXBkYXRlID0gKHZvaWQqKXNoYTNfaGFzaDsKKwkJZmluYWwgPSAodm9pZCopc2hhM19lbmQ7CisJCWhhc2hfbGVuID0gNjQ7CisJfSBlbHNlIHsKKwkJeGZ1bmNfZGllKCk7IC8qIGNhbid0IHJlYWNoIHRoaXMgKi8KKwl9CisKKwl7CisJCVJFU0VSVkVfQ09ORklHX1VCVUZGRVIoaW5fYnVmLCA0MDk2KTsKKwkJd2hpbGUgKChjb3VudCA9IHNhZmVfcmVhZChzcmNfZmQsIGluX2J1ZiwgNDA5NikpID4gMCkgeworCQkJdXBkYXRlKCZjb250ZXh0LCBpbl9idWYsIGNvdW50KTsKKwkJfQorCQloYXNoX3ZhbHVlID0gTlVMTDsKKwkJaWYgKGNvdW50IDwgMCkKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IHJlYWQgJyVzJyIsIGZpbGVuYW1lKTsKKwkJZWxzZSAvKiBjb3VudCA9PSAwICovIHsKKwkJCWZpbmFsKCZjb250ZXh0LCBpbl9idWYpOworCQkJaGFzaF92YWx1ZSA9IGhhc2hfYmluX3RvX2hleChpbl9idWYsIGhhc2hfbGVuKTsKKwkJfQorCQlSRUxFQVNFX0NPTkZJR19CVUZGRVIoaW5fYnVmKTsKKwl9CisKKwlpZiAoc3JjX2ZkICE9IFNURElOX0ZJTEVOTykgeworCQljbG9zZShzcmNfZmQpOworCX0KKworCXJldHVybiBoYXNoX3ZhbHVlOworfQorCitpbnQgbWQ1X3NoYTFfc3VtX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBtZDVfc2hhMV9zdW1fbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCByZXR1cm5fdmFsdWUgPSBFWElUX1NVQ0NFU1M7CisJdW5zaWduZWQgZmxhZ3M7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLKSB7CisJCS8qIC1iICJiaW5hcnkiLCAtdCAidGV4dCIgYXJlIGlnbm9yZWQgKHNoYU5OTnN1bSBjb21wYXQpICovCisJCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgInNjd2J0Iik7CisJCWFyZ3YgKz0gb3B0aW5kOworCQkvL2FyZ2MgLT0gb3B0aW5kOworCX0gZWxzZSB7CisJCWFyZ3YgKz0gMTsKKwkJLy9hcmdjIC09IDE7CisJfQorCWlmICghKmFyZ3YpCisJCSotLWFyZ3YgPSAoY2hhciopIi0iOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX01ENV9TSEExX1NVTV9DSEVDSyAmJiAhKGZsYWdzICYgRkxBR19DSEVDSykpIHsKKwkJaWYgKGZsYWdzICYgRkxBR19TSUxFTlQpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCItJWMgaXMgbWVhbmluZ2Z1bCBvbmx5IHdpdGggLWMiLCAncycpOworCQl9CisJCWlmIChmbGFncyAmIEZMQUdfV0FSTikgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIi0lYyBpcyBtZWFuaW5nZnVsIG9ubHkgd2l0aCAtYyIsICd3Jyk7CisJCX0KKwl9CisKKwlkbyB7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9NRDVfU0hBMV9TVU1fQ0hFQ0sgJiYgKGZsYWdzICYgRkxBR19DSEVDSykpIHsKKwkJCUZJTEUgKnByZV9jb21wdXRlZF9zdHJlYW07CisJCQljaGFyICpsaW5lOworCQkJaW50IGNvdW50X3RvdGFsID0gMDsKKwkJCWludCBjb3VudF9mYWlsZWQgPSAwOworCisJCQlwcmVfY29tcHV0ZWRfc3RyZWFtID0geGZvcGVuX3N0ZGluKCphcmd2KTsKKworCQkJd2hpbGUgKChsaW5lID0geG1hbGxvY19mZ2V0bGluZShwcmVfY29tcHV0ZWRfc3RyZWFtKSkgIT0gTlVMTCkgeworCQkJCXVpbnQ4X3QgKmhhc2hfdmFsdWU7CisJCQkJY2hhciAqZmlsZW5hbWVfcHRyOworCisJCQkJY291bnRfdG90YWwrKzsKKwkJCQlmaWxlbmFtZV9wdHIgPSBzdHJzdHIobGluZSwgIiAgIik7CisJCQkJLyogaGFuZGxlIGZvcm1hdCBmb3IgYmluYXJ5IGNoZWNrc3VtcyAqLworCQkJCWlmIChmaWxlbmFtZV9wdHIgPT0gTlVMTCkgeworCQkJCQlmaWxlbmFtZV9wdHIgPSBzdHJzdHIobGluZSwgIiAqIik7CisJCQkJfQorCQkJCWlmIChmaWxlbmFtZV9wdHIgPT0gTlVMTCkgeworCQkJCQlpZiAoZmxhZ3MgJiBGTEFHX1dBUk4pIHsKKwkJCQkJCWJiX2Vycm9yX21zZygiaW52YWxpZCBmb3JtYXQiKTsKKwkJCQkJfQorCQkJCQljb3VudF9mYWlsZWQrKzsKKwkJCQkJcmV0dXJuX3ZhbHVlID0gRVhJVF9GQUlMVVJFOworCQkJCQlmcmVlKGxpbmUpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJKmZpbGVuYW1lX3B0ciA9ICdcMCc7CisJCQkJZmlsZW5hbWVfcHRyICs9IDI7CisKKwkJCQloYXNoX3ZhbHVlID0gaGFzaF9maWxlKGZpbGVuYW1lX3B0cik7CisKKwkJCQlpZiAoaGFzaF92YWx1ZSAmJiAoc3RyY21wKChjaGFyKiloYXNoX3ZhbHVlLCBsaW5lKSA9PSAwKSkgeworCQkJCQlpZiAoIShmbGFncyAmIEZMQUdfU0lMRU5UKSkKKwkJCQkJCXByaW50ZigiJXM6IE9LXG4iLCBmaWxlbmFtZV9wdHIpOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICghKGZsYWdzICYgRkxBR19TSUxFTlQpKQorCQkJCQkJcHJpbnRmKCIlczogRkFJTEVEXG4iLCBmaWxlbmFtZV9wdHIpOworCQkJCQljb3VudF9mYWlsZWQrKzsKKwkJCQkJcmV0dXJuX3ZhbHVlID0gRVhJVF9GQUlMVVJFOworCQkJCX0KKwkJCQkvKiBwb3NzaWJsZSBmcmVlKE5VTEwpICovCisJCQkJZnJlZShoYXNoX3ZhbHVlKTsKKwkJCQlmcmVlKGxpbmUpOworCQkJfQorCQkJaWYgKGNvdW50X2ZhaWxlZCAmJiAhKGZsYWdzICYgRkxBR19TSUxFTlQpKSB7CisJCQkJYmJfZXJyb3JfbXNnKCJXQVJOSU5HOiAlZCBvZiAlZCBjb21wdXRlZCBjaGVja3N1bXMgZGlkIE5PVCBtYXRjaCIsCisJCQkJCQljb3VudF9mYWlsZWQsIGNvdW50X3RvdGFsKTsKKwkJCX0KKwkJCWZjbG9zZV9pZl9ub3Rfc3RkaW4ocHJlX2NvbXB1dGVkX3N0cmVhbSk7CisJCX0gZWxzZSB7CisJCQl1aW50OF90ICpoYXNoX3ZhbHVlID0gaGFzaF9maWxlKCphcmd2KTsKKwkJCWlmIChoYXNoX3ZhbHVlID09IE5VTEwpIHsKKwkJCQlyZXR1cm5fdmFsdWUgPSBFWElUX0ZBSUxVUkU7CisJCQl9IGVsc2UgeworCQkJCXByaW50ZigiJXMgICVzXG4iLCBoYXNoX3ZhbHVlLCAqYXJndik7CisJCQkJZnJlZShoYXNoX3ZhbHVlKTsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKCorK2FyZ3YpOworCisJcmV0dXJuIHJldHVybl92YWx1ZTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9ta2Rpci5jIGIvY29yZXV0aWxzL21rZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY3YjAwNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9ta2Rpci5jCkBAIC0wLDAgKzEsMTAyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIG1rZGlyIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIE1hdHQgS3JhYWkgPGtyYWFpQGFsdW1uaS5jYXJuZWdpZW1lbGxvbi5lZHU+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvbWtkaXIuaHRtbCAqLworCisvKiBNYXIgMTYsIDIwMDMgICAgICBNYW51ZWwgTm92b2EgSUlJICAgKG1qbjNAY29kZXBvZXQub3JnKQorICoKKyAqIEZpeGVkIGJyb2tlbiBwZXJtaXNzaW9uIHNldHRpbmcgd2hlbiAtcCB3YXMgdXNlZDsgZXNwZWNpYWxseSBpbgorICogY29uanVuY3Rpb24gd2l0aCAtbS4KKyAqLworCisvKiBOb3YgMjgsIDIwMDYgICAgICBZb3NoaW5vcmkgU2F0byA8eXNhdG9AdXNlcnMuc291cmNlZm9yZ2UuanA+OiBBZGQgU0VMaW51eCBTdXBwb3J0LgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBta2Rpcl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIERJUkVDVE9SWS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBta2Rpcl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNyZWF0ZSBESVJFQ1RPUllcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW0gTU9ERQlNb2RlIgorLy91c2FnZTogICAgICJcbgktcAlObyBlcnJvciBpZiBleGlzdHM7IG1ha2UgcGFyZW50IGRpcmVjdG9yaWVzIGFzIG5lZWRlZCIKKy8vdXNhZ2U6CUlGX1NFTElOVVgoCisvL3VzYWdlOiAgICAgIlxuCS1aCVNldCBzZWN1cml0eSBjb250ZXh0IgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBta2Rpcl9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBta2RpciAvdG1wL2Zvb1xuIgorLy91c2FnZTogICAgICAgIiQgbWtkaXIgL3RtcC9mb29cbiIKKy8vdXNhZ2U6ICAgICAgICIvdG1wL2ZvbzogRmlsZSBleGlzdHNcbiIKKy8vdXNhZ2U6ICAgICAgICIkIG1rZGlyIC90bXAvZm9vL2Jhci9iYXpcbiIKKy8vdXNhZ2U6ICAgICAgICIvdG1wL2Zvby9iYXIvYmF6OiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XG4iCisvL3VzYWdlOiAgICAgICAiJCBta2RpciAtcCAvdG1wL2Zvby9iYXIvYmF6XG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfTUtESVJfTE9OR19PUFRJT05TCitzdGF0aWMgY29uc3QgY2hhciBta2Rpcl9sb25nb3B0c1tdIEFMSUdOMSA9CisJIm1vZGVcMCIgICAgUmVxdWlyZWRfYXJndW1lbnQgIm0iCisJInBhcmVudHNcMCIgTm9fYXJndW1lbnQgICAgICAgInAiCisjaWYgRU5BQkxFX1NFTElOVVgKKwkiY29udGV4dFwwIiBSZXF1aXJlZF9hcmd1bWVudCAiWiIKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZFUkJPU0UKKwkidmVyYm9zZVwwIiBOb19hcmd1bWVudCAgICAgICAidiIKKyNlbmRpZgorCTsKKyNlbmRpZgorCitpbnQgbWtkaXJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1rZGlyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlsb25nIG1vZGUgPSAtMTsKKwlpbnQgc3RhdHVzID0gRVhJVF9TVUNDRVNTOworCWludCBmbGFncyA9IDA7CisJdW5zaWduZWQgb3B0OworCWNoYXIgKnNtb2RlOworI2lmIEVOQUJMRV9TRUxJTlVYCisJc2VjdXJpdHlfY29udGV4dF90IHNjb250ZXh0OworI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NS0RJUl9MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gbWtkaXJfbG9uZ29wdHM7CisjZW5kaWYKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAibTpwdiIgSUZfU0VMSU5VWCgiWjoiKSwgJnNtb2RlIElGX1NFTElOVVgoLCZzY29udGV4dCkpOworCWlmIChvcHQgJiAxKSB7CisJCW1vZGVfdCBtbW9kZSA9IGJiX3BhcnNlX21vZGUoc21vZGUsIDA3NzcpOworCQlpZiAobW1vZGUgPT0gKG1vZGVfdCktMSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgbW9kZSAnJXMnIiwgc21vZGUpOworCQl9CisJCW1vZGUgPSBtbW9kZTsKKwl9CisJaWYgKG9wdCAmIDIpCisJCWZsYWdzIHw9IEZJTEVVVElMU19SRUNVUjsKKwlpZiAoKG9wdCAmIDQpICYmIEZJTEVVVElMU19WRVJCT1NFKQorCQlmbGFncyB8PSBGSUxFVVRJTFNfVkVSQk9TRTsKKyNpZiBFTkFCTEVfU0VMSU5VWAorCWlmIChvcHQgJiA4KSB7CisJCXNlbGludXhfb3JfZGllKCk7CisJCXNldGZzY3JlYXRlY29uX29yX2RpZShzY29udGV4dCk7CisJfQorI2VuZGlmCisKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoIWFyZ3ZbMF0pCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCWRvIHsKKwkJaWYgKGJiX21ha2VfZGlyZWN0b3J5KCphcmd2LCBtb2RlLCBmbGFncykpIHsKKwkJCXN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJfQorCX0gd2hpbGUgKCorK2FyZ3YpOworCisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9ta2ZpZm8uYyBiL2NvcmV1dGlscy9ta2ZpZm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjU4MzI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL21rZmlmby5jCkBAIC0wLDAgKzEsNDggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIG1rZmlmbyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50ICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL21rZmlmby5odG1sICovCisKKy8vdXNhZ2U6I2RlZmluZSBta2ZpZm9fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstbSBNT0RFXSAiIElGX1NFTElOVVgoIlstWl0gIikgIk5BTUUiCisvL3VzYWdlOiNkZWZpbmUgbWtmaWZvX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ3JlYXRlIG5hbWVkIHBpcGVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW0gTU9ERQlNb2RlIChkZWZhdWx0IGE9cncpIgorLy91c2FnZToJSUZfU0VMSU5VWCgKKy8vdXNhZ2U6ICAgICAiXG4JLVoJU2V0IHNlY3VyaXR5IGNvbnRleHQiCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImxpYmNvcmV1dGlscy9jb3JldXRpbHMuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworaW50IG1rZmlmb19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbWtmaWZvX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwltb2RlX3QgbW9kZTsKKwlpbnQgcmV0dmFsID0gRVhJVF9TVUNDRVNTOworCisJbW9kZSA9IGdldG9wdF9ta19maWZvX25vZChhcmd2KTsKKworCWFyZ3YgKz0gb3B0aW5kOworCWlmICghKmFyZ3YpIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWRvIHsKKwkJaWYgKG1rZmlmbygqYXJndiwgbW9kZSkgPCAwKSB7CisJCQliYl9zaW1wbGVfcGVycm9yX21zZygqYXJndik7ICAvKiBBdm9pZCBtdWx0aWJ5dGUgcHJvYmxlbXMuICovCisJCQlyZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJCX0KKwl9IHdoaWxlICgqKythcmd2KTsKKworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvbWtub2QuYyBiL2NvcmV1dGlscy9ta25vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMDQ1MDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvbWtub2QuYwpAQCAtMCwwICsxLDc2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBta25vZCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgTi9BIC0tIE1hdGNoZXMgR05VIGJlaGF2aW9yLiAqLworCisvL3VzYWdlOiNkZWZpbmUgbWtub2RfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstbSBNT0RFXSAiIElGX1NFTElOVVgoIlstWl0gIikgIk5BTUUgVFlQRSBNQUpPUiBNSU5PUiIKKy8vdXNhZ2U6I2RlZmluZSBta25vZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNyZWF0ZSBhIHNwZWNpYWwgZmlsZSAoYmxvY2ssIGNoYXJhY3Rlciwgb3IgcGlwZSlcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW0gTU9ERQlDcmVhdGlvbiBtb2RlIChkZWZhdWx0IGE9cncpIgorLy91c2FnZToJSUZfU0VMSU5VWCgKKy8vdXNhZ2U6ICAgICAiXG4JLVoJU2V0IHNlY3VyaXR5IGNvbnRleHQiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuVFlQRToiCisvL3VzYWdlOiAgICAgIlxuCWIJQmxvY2sgZGV2aWNlIgorLy91c2FnZTogICAgICJcbgljIG9yIHUJQ2hhcmFjdGVyIGRldmljZSIKKy8vdXNhZ2U6ICAgICAiXG4JcAlOYW1lZCBwaXBlIChNQUpPUiBhbmQgTUlOT1IgYXJlIGlnbm9yZWQpIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBta25vZF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBta25vZCAvZGV2L2ZkMCBiIDIgMFxuIgorLy91c2FnZTogICAgICAgIiQgbWtub2QgLW0gNjQ0IC90bXAvcGlwZSBwXG4iCisKKyNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+ICAvLyBGb3IgbWFrZWRldgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJsaWJjb3JldXRpbHMvY29yZXV0aWxzLmgiCisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK3N0YXRpYyBjb25zdCBjaGFyIG1vZGVzX2NoYXJzW10gQUxJR04xID0geyAncCcsICdjJywgJ3UnLCAnYicsIDAsIDEsIDEsIDIgfTsKK3N0YXRpYyBjb25zdCBtb2RlX3QgbW9kZXNfY3VicFtdID0geyBTX0lGSUZPLCBTX0lGQ0hSLCBTX0lGQkxLIH07CisKK2ludCBta25vZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbWtub2RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJbW9kZV90IG1vZGU7CisJZGV2X3QgZGV2OworCWNvbnN0IGNoYXIgKm5hbWU7CisKKwltb2RlID0gZ2V0b3B0X21rX2ZpZm9fbm9kKGFyZ3YpOworCWFyZ3YgKz0gb3B0aW5kOworCWFyZ2MgLT0gb3B0aW5kOworCisJaWYgKGFyZ2MgPj0gMikgeworCQluYW1lID0gc3RyY2hyKG1vZGVzX2NoYXJzLCBhcmd2WzFdWzBdKTsKKwkJaWYgKG5hbWUgIT0gTlVMTCkgeworCQkJbW9kZSB8PSBtb2Rlc19jdWJwWyhpbnQpKG5hbWVbNF0pXTsKKworCQkJZGV2ID0gMDsKKwkJCWlmICgqbmFtZSAhPSAncCcpIHsKKwkJCQlhcmdjIC09IDI7CisJCQkJaWYgKGFyZ2MgPT0gMikgeworCQkJCQkvKiBBdXRvZGV0ZWN0IHdoYXQgdGhlIHN5c3RlbSBzdXBwb3J0czsgdGhlc2UgbWFjcm9zIHNob3VsZAorCQkJCQkgKiBvcHRpbWl6ZSBvdXQgdG8gdHdvIGNvbnN0YW50cy4gKi8KKwkJCQkJZGV2ID0gbWFrZWRldih4YXRvdWxfcmFuZ2UoYXJndlsyXSwgMCwgbWFqb3IoVUlOVF9NQVgpKSwKKwkJCQkJCQl4YXRvdWxfcmFuZ2UoYXJndlszXSwgMCwgbWlub3IoVUlOVF9NQVgpKSk7CisJCQkJfQorCQkJfQorCisJCQlpZiAoYXJnYyA9PSAyKSB7CisJCQkJbmFtZSA9ICphcmd2OworCQkJCWlmIChta25vZChuYW1lLCBtb2RlLCBkZXYpID09IDApIHsKKwkJCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJCQl9CisJCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShuYW1lKTsKKwkJCX0KKwkJfQorCX0KKwliYl9zaG93X3VzYWdlKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvbXYuYyBiL2NvcmV1dGlscy9tdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNTcxNzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvbXYuYwpAQCAtMCwwICsxLDE2MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBtdiBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBieSBNYXR0IEtyYWFpIDxrcmFhaUBhbHVtbmkuY2FybmVnaWVtZWxsb24uZWR1PgorICogU0VMaW51eCBzdXBwb3J0IGJ5IFl1aWNoaSBOYWthbXVyYSA8eW5ha2FtQGhpdGFjaGlzb2Z0LmpwPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBTaXplIHJlZHVjdGlvbiBhbmQgaW1wcm92ZWQgZXJyb3IgY2hlY2tpbmcuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibGliY29yZXV0aWxzL2NvcmV1dGlscy5oIgorCisvL3VzYWdlOiNkZWZpbmUgbXZfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZmluXSBTT1VSQ0UgREVTVFxuIgorLy91c2FnZTogICAgICAgIm9yOiBtdiBbLWZpbl0gU09VUkNFLi4uIERJUkVDVE9SWSIKKy8vdXNhZ2U6I2RlZmluZSBtdl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJlbmFtZSBTT1VSQ0UgdG8gREVTVCwgb3IgbW92ZSBTT1VSQ0UocykgdG8gRElSRUNUT1JZXG4iCisvL3VzYWdlOiAgICAgIlxuCS1mCURvbid0IHByb21wdCBiZWZvcmUgb3ZlcndyaXRpbmciCisvL3VzYWdlOiAgICAgIlxuCS1pCUludGVyYWN0aXZlLCBwcm9tcHQgYmVmb3JlIG92ZXJ3cml0ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JRG9uJ3Qgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGZpbGUiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG12X2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIG12IC90bXAvZm9vIC9iaW4vYmFyXG4iCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NVl9MT05HX09QVElPTlMKK3N0YXRpYyBjb25zdCBjaGFyIG12X2xvbmdvcHRzW10gQUxJR04xID0KKwkiaW50ZXJhY3RpdmVcMCIgTm9fYXJndW1lbnQgImkiCisJImZvcmNlXDAiICAgICAgIE5vX2FyZ3VtZW50ICJmIgorCSJuby1jbG9iYmVyXDAiICBOb19hcmd1bWVudCAibiIKKwlJRl9GRUFUVVJFX1ZFUkJPU0UoCisJInZlcmJvc2VcMCIgICAgIE5vX2FyZ3VtZW50ICJ2IgorCSkKKwk7CisjZW5kaWYKKworI2RlZmluZSBPUFRfRk9SQ0UgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgT1BUX0lOVEVSQUNUSVZFICgxIDw8IDEpCisjZGVmaW5lIE9QVF9OT0NMT0JCRVIgICAoMSA8PCAyKQorI2RlZmluZSBPUFRfVkVSQk9TRSAgICAgKCgxIDw8IDMpICogRU5BQkxFX0ZFQVRVUkVfVkVSQk9TRSkKKworCitpbnQgbXZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG12X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBzdGF0IGRlc3Rfc3RhdDsKKwljb25zdCBjaGFyICpsYXN0OworCWNvbnN0IGNoYXIgKmRlc3Q7CisJdW5zaWduZWQgZmxhZ3M7CisJaW50IGRlc3RfZXhpc3RzOworCWludCBzdGF0dXMgPSAwOworCWludCBjb3B5X2ZsYWcgPSAwOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfTVZfTE9OR19PUFRJT05TCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IG12X2xvbmdvcHRzOworI2VuZGlmCisJLyogTmVlZCBhdCBsZWFzdCB0d28gYXJndW1lbnRzLgorCSAqIElmIG1vcmUgdGhhbiBvbmUgb2YgLWYsIC1pLCAtbiBpcyBzcGVjaWZpZWQgLCBvbmx5IHRoZSBmaW5hbCBvbmUKKwkgKiB0YWtlcyBlZmZlY3QgKGl0IHVuc2V0cyBwcmV2aW91cyBvcHRpb25zKS4KKwkgKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMjpmLWluOmktZm46bi1maSI7CisJZmxhZ3MgPSBnZXRvcHQzMihhcmd2LCAiZmludiIpOworCWFyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCWxhc3QgPSBhcmd2W2FyZ2MgLSAxXTsKKworCWlmIChhcmdjID09IDIpIHsKKwkJZGVzdF9leGlzdHMgPSBjcF9tdl9zdGF0KGxhc3QsICZkZXN0X3N0YXQpOworCQlpZiAoZGVzdF9leGlzdHMgPCAwKSB7CisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQl9CisKKwkJaWYgKCEoZGVzdF9leGlzdHMgJiAyKSkgeyAvKiBsYXN0IGlzIG5vdCBhIGRpcmVjdG9yeSAqLworCQkJZGVzdCA9IGxhc3Q7CisJCQlnb3RvIERPX01PVkU7CisJCX0KKwl9CisKKwlkbyB7CisJCWRlc3QgPSBjb25jYXRfcGF0aF9maWxlKGxhc3QsIGJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50X3N0cmlwKCphcmd2KSk7CisJCWRlc3RfZXhpc3RzID0gY3BfbXZfc3RhdChkZXN0LCAmZGVzdF9zdGF0KTsKKwkJaWYgKGRlc3RfZXhpc3RzIDwgMCkgeworCQkJZ290byBSRVRfMTsKKwkJfQorCisgRE9fTU9WRToKKwkJaWYgKGRlc3RfZXhpc3RzKSB7CisJCQlpZiAoZmxhZ3MgJiBPUFRfTk9DTE9CQkVSKQorCQkJCWdvdG8gUkVUXzA7CisJCQlpZiAoIShmbGFncyAmIE9QVF9GT1JDRSkKKwkJCSAmJiAoKGFjY2VzcyhkZXN0LCBXX09LKSA8IDAgJiYgaXNhdHR5KDApKQorCQkJICAgIHx8IChmbGFncyAmIE9QVF9JTlRFUkFDVElWRSkpCisJCQkpIHsKKwkJCQlpZiAoZnByaW50ZihzdGRlcnIsICJtdjogb3ZlcndyaXRlICclcyc/ICIsIGRlc3QpIDwgMCkgeworCQkJCQlnb3RvIFJFVF8xOyAgLyogT3VjaCEgZnByaW50ZiBmYWlsZWQhICovCisJCQkJfQorCQkJCWlmICghYmJfYXNrX2NvbmZpcm1hdGlvbigpKSB7CisJCQkJCWdvdG8gUkVUXzA7CisJCQkJfQorCQkJfQorCQl9CisKKwkJaWYgKHJlbmFtZSgqYXJndiwgZGVzdCkgPCAwKSB7CisJCQlzdHJ1Y3Qgc3RhdCBzb3VyY2Vfc3RhdDsKKwkJCWludCBzb3VyY2VfZXhpc3RzOworCisJCQlpZiAoZXJybm8gIT0gRVhERVYKKwkJCSB8fCAoc291cmNlX2V4aXN0cyA9IGNwX212X3N0YXQyKCphcmd2LCAmc291cmNlX3N0YXQsIGxzdGF0KSkgPCAxCisJCQkpIHsKKwkJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCByZW5hbWUgJyVzJyIsICphcmd2KTsKKwkJCX0gZWxzZSB7CisJCQkJc3RhdGljIGNvbnN0IGNoYXIgZm10W10gQUxJR04xID0KKwkJCQkJImNhbid0IG92ZXJ3cml0ZSAlc2RpcmVjdG9yeSB3aXRoICVzZGlyZWN0b3J5IjsKKworCQkJCWlmIChkZXN0X2V4aXN0cykgeworCQkJCQlpZiAoZGVzdF9leGlzdHMgPT0gMykgeworCQkJCQkJaWYgKHNvdXJjZV9leGlzdHMgIT0gMykgeworCQkJCQkJCWJiX2Vycm9yX21zZyhmbXQsICIiLCAibm9uLSIpOworCQkJCQkJCWdvdG8gUkVUXzE7CisJCQkJCQl9CisJCQkJCX0gZWxzZSB7CisJCQkJCQlpZiAoc291cmNlX2V4aXN0cyA9PSAzKSB7CisJCQkJCQkJYmJfZXJyb3JfbXNnKGZtdCwgIm5vbi0iLCAiIik7CisJCQkJCQkJZ290byBSRVRfMTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAodW5saW5rKGRlc3QpIDwgMCkgeworCQkJCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgcmVtb3ZlICclcyciLCBkZXN0KTsKKwkJCQkJCWdvdG8gUkVUXzE7CisJCQkJCX0KKwkJCQl9CisJCQkJLyogRklMRVVUSUxTX1JFQ1VSIGFsc28gcHJldmVudHMgbmFzdGllcyBsaWtlCisJCQkJICogInJlYWQgZnJvbSBkZXZpY2UgYW5kIHdyaXRlIGNvbnRlbnRzIHRvIGRzdCIKKwkJCQkgKiBpbnN0ZWFkIG9mICJjcmVhdGUgc2FtZSBkZXZpY2Ugbm9kZSIgKi8KKwkJCQljb3B5X2ZsYWcgPSBGSUxFVVRJTFNfUkVDVVIgfCBGSUxFVVRJTFNfUFJFU0VSVkVfU1RBVFVTOworI2lmIEVOQUJMRV9TRUxJTlVYCisJCQkJY29weV9mbGFnIHw9IEZJTEVVVElMU19QUkVTRVJWRV9TRUNVUklUWV9DT05URVhUOworI2VuZGlmCisJCQkJaWYgKChjb3B5X2ZpbGUoKmFyZ3YsIGRlc3QsIGNvcHlfZmxhZykgPj0gMCkKKwkJCQkgJiYgKHJlbW92ZV9maWxlKCphcmd2LCBGSUxFVVRJTFNfUkVDVVIgfCBGSUxFVVRJTFNfRk9SQ0UpID49IDApCisJCQkJKSB7CisJCQkJCWdvdG8gUkVUXzA7CisJCQkJfQorCQkJfQorIFJFVF8xOgorCQkJc3RhdHVzID0gMTsKKwkJfQorIFJFVF8wOgorCQlpZiAoZmxhZ3MgJiBPUFRfVkVSQk9TRSkgeworCQkJcHJpbnRmKCInJXMnIC0+ICclcydcbiIsICphcmd2LCBkZXN0KTsKKwkJfQorCQlpZiAoZGVzdCAhPSBsYXN0KSB7CisJCQlmcmVlKCh2b2lkICopIGRlc3QpOworCQl9CisJfSB3aGlsZSAoKisrYXJndiAhPSBsYXN0KTsKKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvbmljZS5jIGIvY29yZXV0aWxzL25pY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTc1OTkxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL25pY2UuYwpAQCAtMCwwICsxLDU3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBuaWNlIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1ICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbmljZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1uIEFESlVTVF0gW1BST0cgQVJHU10iCisvL3VzYWdlOiNkZWZpbmUgbmljZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoYW5nZSBzY2hlZHVsaW5nIHByaW9yaXR5LCBydW4gUFJPR1xuIgorLy91c2FnZTogICAgICJcbgktbiBBREpVU1QJQWRqdXN0IHByaW9yaXR5IGJ5IEFESlVTVCIKKworI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBuaWNlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBuaWNlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBvbGRfcHJpb3JpdHksIGFkanVzdG1lbnQ7CisKKwlvbGRfcHJpb3JpdHkgPSBnZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDApOworCisJaWYgKCEqKythcmd2KSB7IC8qIE5vIGFyZ3MsIHNvIChHTlUpIG91dHB1dCBjdXJyZW50IG5pY2UgdmFsdWUuICovCisJCXByaW50ZigiJWRcbiIsIG9sZF9wcmlvcml0eSk7CisJCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKKwl9CisKKwlhZGp1c3RtZW50ID0gMTA7ICAvKiBTZXQgZGVmYXVsdCBhZGp1c3RtZW50LiAqLworCisJaWYgKGFyZ3ZbMF1bMF0gPT0gJy0nKSB7CisJCWlmIChhcmd2WzBdWzFdID09ICduJykgeyAvKiAtbiAqLworCQkJaWYgKGFyZ3ZbMF1bMl0pIHsgLyogLW5OTk5OICh3L28gc3BhY2UpICovCisJCQkJYXJndlswXSArPSAyOyBhcmd2LS07IGFyZ2MrKzsKKwkJCX0KKwkJfSBlbHNlIHsgLyogLU5OTiAoTk5OIG1heSBiZSBuZWdhdGl2ZSkgPT0gLW4gTk5OICovCisJCQlhcmd2WzBdICs9IDE7IGFyZ3YtLTsgYXJnYysrOworCQl9CisJCWlmIChhcmdjIDwgNCkgeyAgLyogTWlzc2luZyBwcmlvcml0eSBhbmQvb3IgdXRpbGl0eSEgKi8KKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJfQorCQlhZGp1c3RtZW50ID0geGF0b2lfcmFuZ2UoYXJndlsxXSwgSU5UX01JTi8yLCBJTlRfTUFYLzIpOworCQlhcmd2ICs9IDI7CisJfQorCisJeyAgLyogU2V0IG91ciBwcmlvcml0eS4gKi8KKwkJaW50IHByaW8gPSBvbGRfcHJpb3JpdHkgKyBhZGp1c3RtZW50OworCisJCWlmIChzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIHByaW8pIDwgMCkgeworCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZXRwcmlvcml0eSglZCkiLCBwcmlvKTsKKwkJfQorCX0KKworCUJCX0VYRUNWUF9vcl9kaWUoYXJndik7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvbm9odXAuYyBiL2NvcmV1dGlscy9ub2h1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzODUzZmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvbm9odXAuYwpAQCAtMCwwICsxLDg4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIG5vaHVwIC0gaW52b2tlIGEgdXRpbGl0eSBpbW11bmUgdG8gaGFuZ3Vwcy4KKyAqCisgKiBCdXN5Ym94IHZlcnNpb24gYmFzZWQgb24gbm9odXAgc3BlY2lmaWNhdGlvbiBhdAorICogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9ub2h1cC5odG1sCisgKgorICogQ29weXJpZ2h0IDIwMDYgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqIENvcHlyaWdodCAyMDA2IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG5vaHVwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJQUk9HIEFSR1MiCisvL3VzYWdlOiNkZWZpbmUgbm9odXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSdW4gUFJPRyBpbW11bmUgdG8gaGFuZ3Vwcywgd2l0aCBvdXRwdXQgdG8gYSBub24tdHR5IgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBub2h1cF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBub2h1cCBtYWtlICYiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBDb21wYXQgaW5mbzogbm9odXAgKEdOVSBjb3JldXRpbHMgNi44KSBkb2VzIHRoaXM6CisjIG5vaHVwIHRydWUKK25vaHVwOiBpZ25vcmluZyBpbnB1dCBhbmQgYXBwZW5kaW5nIG91dHB1dCB0byBgbm9odXAub3V0JworIyBub2h1cCB0cnVlIDE+L2Rldi9udWxsCitub2h1cDogaWdub3JpbmcgaW5wdXQgYW5kIHJlZGlyZWN0aW5nIHN0ZGVyciB0byBzdGRvdXQKKyMgbm9odXAgdHJ1ZSAyPnp6CisjIGNhdCB6egorbm9odXA6IGlnbm9yaW5nIGlucHV0IGFuZCBhcHBlbmRpbmcgb3V0cHV0IHRvIGBub2h1cC5vdXQnCisjIG5vaHVwIHRydWUgMj56eiAxPi9kZXYvbnVsbAorIyBjYXQgenoKK25vaHVwOiBpZ25vcmluZyBpbnB1dAorIyBub2h1cCB0cnVlIDwvZGV2L251bGwgMT4vZGV2L251bGwKK25vaHVwOiByZWRpcmVjdGluZyBzdGRlcnIgdG8gc3Rkb3V0CisjIG5vaHVwIHRydWUgPC9kZXYvbnVsbCAyPnp6IDE+L2Rldi9udWxsCisjIGNhdCB6egorICAobm90aGluZykKKyMKKyovCisKK2ludCBub2h1cF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbm9odXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKm5vaHVwb3V0OworCWNoYXIgKmhvbWU7CisKKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSAxMjc7CisKKwlpZiAoIWFyZ3ZbMV0pIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCS8qIElmIHN0ZGluIGlzIGEgdHR5LCBkZXRhY2ggZnJvbSBpdC4gKi8KKwlpZiAoaXNhdHR5KFNURElOX0ZJTEVOTykpIHsKKwkJLyogYmJfZXJyb3JfbXNnKCJpZ25vcmluZyBpbnB1dCIpOyAqLworCQljbG9zZShTVERJTl9GSUxFTk8pOworCQl4b3BlbihiYl9kZXZfbnVsbCwgT19SRE9OTFkpOyAvKiB3aWxsIGJlIGZkIDAgKFNURElOX0ZJTEVOTykgKi8KKwl9CisKKwlub2h1cG91dCA9ICJub2h1cC5vdXQiOworCS8qIFJlZGlyZWN0IHN0ZG91dCB0byBub2h1cC5vdXQsIGVpdGhlciBpbiAiLiIgb3IgaW4gIiRIT01FIi4gKi8KKwlpZiAoaXNhdHR5KFNURE9VVF9GSUxFTk8pKSB7CisJCWNsb3NlKFNURE9VVF9GSUxFTk8pOworCQlpZiAob3Blbihub2h1cG91dCwgT19DUkVBVHxPX1dST05MWXxPX0FQUEVORCwgU19JUlVTUnxTX0lXVVNSKSA8IDApIHsKKwkJCWhvbWUgPSBnZXRlbnYoIkhPTUUiKTsKKwkJCWlmIChob21lKSB7CisJCQkJbm9odXBvdXQgPSBjb25jYXRfcGF0aF9maWxlKGhvbWUsIG5vaHVwb3V0KTsKKwkJCQl4b3BlbjMobm9odXBvdXQsIE9fQ1JFQVR8T19XUk9OTFl8T19BUFBFTkQsIFNfSVJVU1J8U19JV1VTUik7CisJCQl9IGVsc2UgeworCQkJCXhvcGVuKGJiX2Rldl9udWxsLCBPX1JET05MWSk7IC8qIHdpbGwgYmUgZmQgMSAqLworCQkJfQorCQl9CisJCWJiX2Vycm9yX21zZygiYXBwZW5kaW5nIG91dHB1dCB0byAlcyIsIG5vaHVwb3V0KTsKKwl9CisKKwkvKiBJZiB3ZSBoYXZlIGEgdHR5IG9uIHN0ZGVyciwgcmVkaXJlY3QgdG8gc3Rkb3V0LiAqLworCWlmIChpc2F0dHkoU1RERVJSX0ZJTEVOTykpIHsKKwkJLyogaWYgKHN0ZG91dF93YXNudF9hX3R0eSkKKwkJCWJiX2Vycm9yX21zZygicmVkaXJlY3Rpbmcgc3RkZXJyIHRvIHN0ZG91dCIpOyAqLworCQlkdXAyKFNURE9VVF9GSUxFTk8sIFNUREVSUl9GSUxFTk8pOworCX0KKworCXNpZ25hbChTSUdIVVAsIFNJR19JR04pOworCisJYXJndisrOworCUJCX0VYRUNWUF9vcl9kaWUoYXJndik7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvb2QuYyBiL2NvcmV1dGlscy9vZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMTFmY2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvb2QuYwpAQCAtMCwwICsxLDIyOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogb2QgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqIEJhc2VkIG9uIGNvZGUgZnJvbSB1dGlsLWxpbnV4IHYgMi4xMWwKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTAKKyAqIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogT3JpZ2luYWwgY29weXJpZ2h0IG5vdGljZSBpcyByZXRhaW5lZCBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KKyAqLworCisvL3VzYWdlOiNpZiAhRU5BQkxFX0RFU0tUT1AKKy8vdXNhZ2U6I2RlZmluZSBvZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hQmJjRGRlRmZIaElpTGxPb3ZYeF0gW0ZJTEVdIgorLy91c2FnZTojZGVmaW5lIG9kX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgRklMRSAob3Igc3RkaW4pIHVuYW1iaWd1b3VzbHksIGFzIG9jdGFsIGJ5dGVzIGJ5IGRlZmF1bHQiCisvL3VzYWdlOiNlbmRpZgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZiBFTkFCTEVfREVTS1RPUAorLyogVGhpcyBvbmUgcHJvdmlkZXMgLXQgKGJ1c3lib3gncyBvd24gYnVpbGQgc2NyaXB0IG5lZWRzIGl0KSAqLworI2luY2x1ZGUgIm9kX2Jsb2F0eS5jIgorI2Vsc2UKKworI2luY2x1ZGUgImR1bXAuaCIKKworc3RhdGljIHZvaWQKK29kb2Zmc2V0KGR1bXBlcl90ICpkdW1wZXIsIGludCBhcmdjLCBjaGFyICoqKmFyZ3ZwKQoreworCWNoYXIgKm51bSwgKnA7CisJaW50IGJhc2U7CisJY2hhciAqZW5kOworCisJLyoKKwkgKiBUaGUgb2Zmc2V0IHN5bnRheCBvZiBvZCgxKSB3YXMgZ2VudWluZWx5IGJpemFycmUuICBGaXJzdCwgaWYKKwkgKiBpdCBzdGFydGVkIHdpdGggYSBwbHVzIGl0IGhhZCB0byBiZSBhbiBvZmZzZXQuICBPdGhlcndpc2UsIGlmCisJICogdGhlcmUgd2VyZSBhdCBsZWFzdCB0d28gYXJndW1lbnRzLCBhIG51bWJlciBvciBsb3dlci1jYXNlICd4JworCSAqIGZvbGxvd2VkIGJ5IGEgbnVtYmVyIG1ha2VzIGl0IGFuIG9mZnNldC4gIEJ5IGRlZmF1bHQgaXQgd2FzCisJICogb2N0YWw7IGlmIGl0IHN0YXJ0ZWQgd2l0aCAneCcgb3IgJzB4JyBpdCB3YXMgaGV4LiAgSWYgaXQgZW5kZWQKKwkgKiBpbiBhICcuJywgaXQgd2FzIGRlY2ltYWwuICBJZiBhICdiJyBvciAnQicgd2FzIGFwcGVuZGVkLCBpdAorCSAqIG11bHRpcGxpZWQgdGhlIG51bWJlciBieSA1MTIgb3IgMTAyNCBieXRlIHVuaXRzLiAgVGhlcmUgd2FzCisJICogbm8gd2F5IHRvIGFzc2lnbiBhIGJsb2NrIGNvdW50IHRvIGEgaGV4IG9mZnNldC4KKwkgKgorCSAqIFdlIGFzc3VtZXMgaXQncyBhIGZpbGUgaWYgdGhlIG9mZnNldCBpcyBiYWQuCisJICovCisJcCA9ICoqYXJndnA7CisKKwlpZiAoIXApIHsKKwkJLyogaGV5IHNvbWVvbmUgaXMgcHJvYmFibHkgcGlwaW5nIHRvIHVzIC4uLiAqLworCQlyZXR1cm47CisJfQorCisJaWYgKCgqcCAhPSAnKycpCisJCSYmIChhcmdjIDwgMgorCQkJfHwgKCFpc2RpZ2l0KHBbMF0pCisJCQkJJiYgKChwWzBdICE9ICd4JykgfHwgIWlzeGRpZ2l0KHBbMV0pKSkpKQorCQlyZXR1cm47CisKKwliYXNlID0gMDsKKwkvKgorCSAqIHNraXAgb3ZlciBsZWFkaW5nICcrJywgJ3hbMC05YS1mQS1mXScgb3IgJzB4JywgYW5kCisJICogc2V0IGJhc2UuCisJICovCisJaWYgKHBbMF0gPT0gJysnKQorCQkrK3A7CisJaWYgKHBbMF0gPT0gJ3gnICYmIGlzeGRpZ2l0KHBbMV0pKSB7CisJCSsrcDsKKwkJYmFzZSA9IDE2OworCX0gZWxzZSBpZiAocFswXSA9PSAnMCcgJiYgcFsxXSA9PSAneCcpIHsKKwkJcCArPSAyOworCQliYXNlID0gMTY7CisJfQorCisJLyogc2tpcCBvdmVyIHRoZSBudW1iZXIgKi8KKwlpZiAoYmFzZSA9PSAxNikKKwkJZm9yIChudW0gPSBwOyBpc3hkaWdpdCgqcCk7ICsrcCkKKwkJCWNvbnRpbnVlOworCWVsc2UKKwkJZm9yIChudW0gPSBwOyBpc2RpZ2l0KCpwKTsgKytwKQorCQkJY29udGludWU7CisKKwkvKiBjaGVjayBmb3Igbm8gbnVtYmVyICovCisJaWYgKG51bSA9PSBwKQorCQlyZXR1cm47CisKKwkvKiBpZiB0ZXJtaW5hdGVzIHdpdGggYSAnLicsIGJhc2UgaXMgZGVjaW1hbCAqLworCWlmICgqcCA9PSAnLicpIHsKKwkJaWYgKGJhc2UpCisJCQlyZXR1cm47CisJCWJhc2UgPSAxMDsKKwl9CisKKwlkdW1wZXItPmR1bXBfc2tpcCA9IHN0cnRvbChudW0sICZlbmQsIGJhc2UgPyBiYXNlIDogOCk7CisKKwkvKiBpZiBlbmQgaXNuJ3QgdGhlIHNhbWUgYXMgcCwgd2UgZ290IGEgbm9uLW9jdGFsIGRpZ2l0ICovCisJaWYgKGVuZCAhPSBwKQorCQlkdW1wZXItPmR1bXBfc2tpcCA9IDA7CisJZWxzZSB7CisJCWlmICgqcCkgeworCQkJaWYgKCpwID09ICdiJykgeworCQkJCWR1bXBlci0+ZHVtcF9za2lwICo9IDUxMjsKKwkJCQkrK3A7CisJCQl9IGVsc2UgaWYgKCpwID09ICdCJykgeworCQkJCWR1bXBlci0+ZHVtcF9za2lwICo9IDEwMjQ7CisJCQkJKytwOworCQkJfQorCQl9CisJCWlmICgqcCkKKwkJCWR1bXBlci0+ZHVtcF9za2lwID0gMDsKKwkJZWxzZSB7CisJCQkrKyphcmd2cDsKKwkJCS8qCisJCQkgKiBJZiB0aGUgb2Zmc2V0IHVzZXMgYSBub24tb2N0YWwgYmFzZSwgdGhlIGJhc2Ugb2YKKwkJCSAqIHRoZSBvZmZzZXQgaXMgY2hhbmdlZCBhcyB3ZWxsLiAgVGhpcyBpc24ndCBwcmV0dHksCisJCQkgKiBidXQgaXQncyBlYXN5LgorCQkJICovCisjZGVmaW5lIFRZUEVfT0ZGU0VUIDcKKwkJCXsKKwkJCQljaGFyIHhfb3JfZDsKKwkJCQlpZiAoYmFzZSA9PSAxNikgeworCQkJCQl4X29yX2QgPSAneCc7CisJCQkJCWdvdG8gRE9fWF9PUl9EOworCQkJCX0KKwkJCQlpZiAoYmFzZSA9PSAxMCkgeworCQkJCQl4X29yX2QgPSAnZCc7CisgRE9fWF9PUl9EOgorCQkJCQlkdW1wZXItPmZzaGVhZC0+bmV4dGZ1LT5mbXRbVFlQRV9PRkZTRVRdCisJCQkJCQk9IGR1bXBlci0+ZnNoZWFkLT5uZXh0ZnMtPm5leHRmdS0+Zm10W1RZUEVfT0ZGU0VUXQorCQkJCQkJPSB4X29yX2Q7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYWRkX3N0cmluZ3NbXSA9IHsKKwkiMTYvMSBcIiUzX3UgXCIgXCJcXG5cIiIsICAgICAgICAgICAgICAvKiBhICovCisJIjgvMiBcIiAlMDZvIFwiIFwiXFxuXCIiLCAgICAgICAgICAgICAgLyogQiwgbyAqLworCSIxNi8xIFwiJTAzbyBcIiBcIlxcblwiIiwgICAgICAgICAgICAgIC8qIGIgKi8KKwkiMTYvMSBcIiUzX2MgXCIgXCJcXG5cIiIsICAgICAgICAgICAgICAvKiBjICovCisJIjgvMiBcIiAgJTA1dSBcIiBcIlxcblwiIiwgICAgICAgICAgICAgLyogZCAqLworCSI0LzQgXCIgICAgICUwMTB1IFwiIFwiXFxuXCIiLCAgICAgICAgIC8qIEQgKi8KKwkiMi84IFwiICAgICAgICAgICUyMS4xNGUgXCIgXCJcXG5cIiIsICAvKiBlICh1bmRvY3VtZW50ZWQgaW4gb2QpLCBGICovCisJIjQvNCBcIiAlMTQuN2UgXCIgXCJcXG5cIiIsICAgICAgICAgICAgLyogZiAqLworCSI0LzQgXCIgICAgICAgJTA4eCBcIiBcIlxcblwiIiwgICAgICAgIC8qIEgsIFggKi8KKwkiOC8yIFwiICAgJTA0eCBcIiBcIlxcblwiIiwgICAgICAgICAgICAvKiBoLCB4ICovCisJIjQvNCBcIiAgICAlMTFkIFwiIFwiXFxuXCIiLCAgICAgICAgICAgLyogSSwgTCwgbCAqLworCSI4LzIgXCIgJTZkIFwiIFwiXFxuXCIiLCAgICAgICAgICAgICAgIC8qIGkgKi8KKwkiNC80IFwiICAgICUwMTFvIFwiIFwiXFxuXCIiLCAgICAgICAgICAvKiBPICovCit9OworCitzdGF0aWMgY29uc3QgY2hhciBvZF9vcHRzW10gQUxJR04xID0gImFCYmNEZGVGZkhoSWlMbE9vWHh2IjsKKworc3RhdGljIGNvbnN0IGNoYXIgb2RfbzJzaVtdIEFMSUdOMSA9IHsKKwkwLCAxLCAyLCAzLCA1LAorCTQsIDYsIDYsIDcsIDgsCisJOSwgMHhhLCAweGIsIDB4YSwgMHhhLAorCTB4YiwgMSwgOCwgOSwKK307CisKK2ludCBvZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgb2RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGNoOworCWludCBmaXJzdCA9IDE7CisJY2hhciAqcDsKKwlkdW1wZXJfdCAqZHVtcGVyID0gYWxsb2NfZHVtcGVyKCk7CisKKwl3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIG9kX29wdHMpKSA+IDApIHsKKwkJaWYgKGNoID09ICd2JykgeworCQkJZHVtcGVyLT5kdW1wX3ZmbGFnID0gQUxMOworCQl9IGVsc2UgaWYgKCgocCA9IHN0cmNocihvZF9vcHRzLCBjaCkpICE9IE5VTEwpICYmICgqcCAhPSAnXDAnKSkgeworCQkJaWYgKGZpcnN0KSB7CisJCQkJZmlyc3QgPSAwOworCQkJCWJiX2R1bXBfYWRkKGR1bXBlciwgIlwiJTA3LjdfQW9cblwiIik7CisJCQkJYmJfZHVtcF9hZGQoZHVtcGVyLCAiXCIlMDcuN19hbyAgXCIiKTsKKwkJCX0gZWxzZSB7CisJCQkJYmJfZHVtcF9hZGQoZHVtcGVyLCAiXCIgICAgICAgICBcIiIpOworCQkJfQorCQkJYmJfZHVtcF9hZGQoZHVtcGVyLCBhZGRfc3RyaW5nc1soaW50KW9kX28yc2lbKHAgLSBvZF9vcHRzKV1dKTsKKwkJfSBlbHNlIHsgIC8qIFAsIHAsIHMsIHcsIG9yIG90aGVyIHVuaGFuZGxlZCAqLworCQkJYmJfc2hvd191c2FnZSgpOworCQl9CisJfQorCWlmICghZHVtcGVyLT5mc2hlYWQpIHsKKwkJYmJfZHVtcF9hZGQoZHVtcGVyLCAiXCIlMDcuN19Bb1xuXCIiKTsKKwkJYmJfZHVtcF9hZGQoZHVtcGVyLCAiXCIlMDcuN19hbyAgXCIgOC8yIFwiJTA2byBcIiBcIlxcblwiIik7CisJfQorCisJYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisKKwlvZG9mZnNldChkdW1wZXIsIGFyZ2MsICZhcmd2KTsKKworCXJldHVybiBiYl9kdW1wX2R1bXAoZHVtcGVyLCBhcmd2KTsKK30KKyNlbmRpZiAvKiBFTkFCTEVfREVTS1RPUCAqLworCisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MCBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9vZF9ibG9hdHkuYyBiL2NvcmV1dGlscy9vZF9ibG9hdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjdlYTk5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL29kX2Jsb2F0eS5jCkBAIC0wLDAgKzEsMTM3NiBAQAorLyogb2QgLS0gZHVtcCBmaWxlcyBpbiBvY3RhbCBhbmQgb3RoZXIgZm9ybWF0cworICAgQ29weXJpZ2h0IChDKSA5MiwgMTk5NS0yMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKy8qIFdyaXR0ZW4gYnkgSmltIE1leWVyaW5nLiAgKi8KKy8qIEJ1c3lib3hlZCBieSBEZW55cyBWbGFzZW5rbywgYmFzZWQgb24gb2QuYyBmcm9tIGNvcmV1dGlscy01LjIuMSAqLworCisKKy8qICNpbmNsdWRlICJsaWJiYi5oIiAtIGRvbmUgaW4gb2QuYyAqLworI2RlZmluZSBhc3NlcnQoYSkgKCh2b2lkKTApCisKKworLy91c2FnZTojaWYgRU5BQkxFX0RFU0tUT1AKKy8vdXNhZ2U6I2RlZmluZSBvZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hYmNkZmhpbG92eHNdIFstdCBUWVBFXSBbLUEgUkFESVhdIFstTiBTSVpFXSBbLWogU0tJUF0gWy1TIE1JTlNUUl0gWy13IFdJRFRIXSBbRklMRV0uLi4iCisvLyBXZSBkb24ndCBzdXBwb3J0OgorLy8gLi4uIFtGSUxFXSBbWytdT0ZGU0VUWy5dW2JdXQorLy8gU3VwcG9ydCBpcyBidWdneSBmb3I6CisvLyBvZCAtLXRyYWRpdGlvbmFsIFtPUFRJT05dLi4uIFtGSUxFXSBbWytdT0ZGU0VUWy5dW2JdIFsrXVtMQUJFTF1bLl1bYl1dCisKKy8vdXNhZ2U6I2RlZmluZSBvZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IEZJTEVzIChvciBzdGRpbikgdW5hbWJpZ3VvdXNseSwgYXMgb2N0YWwgYnl0ZXMgYnkgZGVmYXVsdCIKKy8vdXNhZ2U6I2VuZGlmCisKK2VudW0geworCU9QVF9BID0gMSA8PCAwLAorCU9QVF9OID0gMSA8PCAxLAorCU9QVF9hID0gMSA8PCAyLAorCU9QVF9iID0gMSA8PCAzLAorCU9QVF9jID0gMSA8PCA0LAorCU9QVF9kID0gMSA8PCA1LAorCU9QVF9mID0gMSA8PCA2LAorCU9QVF9oID0gMSA8PCA3LAorCU9QVF9pID0gMSA8PCA4LAorCU9QVF9qID0gMSA8PCA5LAorCU9QVF9sID0gMSA8PCAxMCwKKwlPUFRfbyA9IDEgPDwgMTEsCisJT1BUX3QgPSAxIDw8IDEyLAorCS8qIFdoZW4gemVybyBhbmQgdHdvIG9yIG1vcmUgY29uc2VjdXRpdmUgYmxvY2tzIGFyZSBlcXVhbCwgZm9ybWF0CisJICAgb25seSB0aGUgZmlyc3QgYmxvY2sgYW5kIG91dHB1dCBhbiBhc3RlcmlzayBhbG9uZSBvbiB0aGUgZm9sbG93aW5nCisJICAgbGluZSB0byBpbmRpY2F0ZSB0aGF0IGlkZW50aWNhbCBibG9ja3MgaGF2ZSBiZWVuIGVsaWRlZDogKi8KKwlPUFRfdiA9IDEgPDwgMTMsCisJT1BUX3ggPSAxIDw8IDE0LAorCU9QVF9zID0gMSA8PCAxNSwKKwlPUFRfUyA9IDEgPDwgMTYsCisJT1BUX3cgPSAxIDw8IDE3LAorCU9QVF90cmFkaXRpb25hbCA9ICgxIDw8IDE4KSAqIEVOQUJMRV9MT05HX09QVFMsCit9OworCisjZGVmaW5lIE9EX0dFVE9QVDMyKCkgZ2V0b3B0MzIoYXJndiwgXAorCSJBOk46YWJjZGZoaWo6bG90OnZ4c1M6dzo6IiwgXAorCS8qIC13IHdpdGggb3B0aW9uYWwgcGFyYW0gKi8gXAorCS8qIC1TIHdhcyAtcyBhbmQgYWxzbyBoYWQgb3B0aW9uYWwgcGFyYW1ldGVyICovIFwKKwkvKiBidXQgaW4gY29yZXV0aWxzIDYuMyBpdCB3YXMgcmVuYW1lZCBhbmQgbm93IGhhcyAqLyBcCisJLyogX21hbmRhdG9yeV8gcGFyYW1ldGVyICovIFwKKwkmc3RyX0EsICZzdHJfTiwgJnN0cl9qLCAmbHN0X3QsICZzdHJfUywgJmJ5dGVzX3Blcl9ibG9jaykKKworCisvKiBDaGVjayBmb3IgMHg3ZiBpcyBhIGNvcmV1dGlscyA2LjMgYWRkaXRpb24gKi8KKyNkZWZpbmUgSVNQUklOVChjKSAoKChjKSA+PSAnICcpICYmIChjKSA8IDB4N2YpCisKK3R5cGVkZWYgbG9uZyBkb3VibGUgbG9uZ2RvdWJsZV90OwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWxvbmdsb25nX3Q7Cit0eXBlZGVmIGxvbmcgbG9uZyBsbG9uZzsKKworI2lmIEVOQUJMRV9MRlMKKyMgZGVmaW5lIHhzdHJ0b29mZl9zZnggeHN0cnRvdWxsX3NmeAorI2Vsc2UKKyMgZGVmaW5lIHhzdHJ0b29mZl9zZnggeHN0cnRvdWxfc2Z4CisjZW5kaWYKKworLyogVGhlIGRlZmF1bHQgbnVtYmVyIG9mIGlucHV0IGJ5dGVzIHBlciBvdXRwdXQgbGluZS4gICovCisjZGVmaW5lIERFRkFVTFRfQllURVNfUEVSX0JMT0NLIDE2CisKKy8qIFRoZSBudW1iZXIgb2YgZGVjaW1hbCBkaWdpdHMgb2YgcHJlY2lzaW9uIGluIGEgZmxvYXQuICAqLworI2lmbmRlZiBGTFRfRElHCisjIGRlZmluZSBGTFRfRElHIDcKKyNlbmRpZgorCisvKiBUaGUgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIG9mIHByZWNpc2lvbiBpbiBhIGRvdWJsZS4gICovCisjaWZuZGVmIERCTF9ESUcKKyMgZGVmaW5lIERCTF9ESUcgMTUKKyNlbmRpZgorCisvKiBUaGUgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIG9mIHByZWNpc2lvbiBpbiBhIGxvbmcgZG91YmxlLiAgKi8KKyNpZm5kZWYgTERCTF9ESUcKKyMgZGVmaW5lIExEQkxfRElHIERCTF9ESUcKKyNlbmRpZgorCitlbnVtIHNpemVfc3BlYyB7CisJTk9fU0laRSwKKwlDSEFSLAorCVNIT1JULAorCUlOVCwKKwlMT05HLAorCUxPTkdfTE9ORywKKwlGTE9BVF9TSU5HTEUsCisJRkxPQVRfRE9VQkxFLAorCUZMT0FUX0xPTkdfRE9VQkxFLAorCU5fU0laRV9TUEVDUworfTsKKworZW51bSBvdXRwdXRfZm9ybWF0IHsKKwlTSUdORURfREVDSU1BTCwKKwlVTlNJR05FRF9ERUNJTUFMLAorCU9DVEFMLAorCUhFWEFERUNJTUFMLAorCUZMT0FUSU5HX1BPSU5ULAorCU5BTUVEX0NIQVJBQ1RFUiwKKwlDSEFSQUNURVIKK307CisKKy8qIEVhY2ggb3V0cHV0IGZvcm1hdCBzcGVjaWZpY2F0aW9uIChmcm9tICctdCBzcGVjJyBvciBmcm9tCisgICBvbGQtc3R5bGUgb3B0aW9ucykgaXMgcmVwcmVzZW50ZWQgYnkgb25lIG9mIHRoZXNlIHN0cnVjdHVyZXMuICAqLworc3RydWN0IHRzcGVjIHsKKwllbnVtIG91dHB1dF9mb3JtYXQgZm10OworCWVudW0gc2l6ZV9zcGVjIHNpemU7CisJdm9pZCAoKnByaW50X2Z1bmN0aW9uKSAoc2l6ZV90LCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisJY2hhciAqZm10X3N0cmluZzsKKwlpbnQgaGV4bF9tb2RlX3RyYWlsZXI7CisJaW50IGZpZWxkX3dpZHRoOworfTsKKworLyogQ29udmVydCB0aGUgbnVtYmVyIG9mIDgtYml0IGJ5dGVzIG9mIGEgYmluYXJ5IHJlcHJlc2VudGF0aW9uIHRvCisgICB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgKGRpZ2l0cyArIHNpZ24gaWYgdGhlIHR5cGUgaXMgc2lnbmVkKQorICAgcmVxdWlyZWQgdG8gcmVwcmVzZW50IHRoZSBzYW1lIHF1YW50aXR5IGluIHRoZSBzcGVjaWZpZWQgYmFzZS90eXBlLgorICAgRm9yIGV4YW1wbGUsIGEgMzItYml0ICg0LWJ5dGUpIHF1YW50aXR5IG1heSByZXF1aXJlIGEgZmllbGQgd2lkdGgKKyAgIGFzIHdpZGUgYXMgdGhlIGZvbGxvd2luZyBmb3IgdGhlc2UgdHlwZXM6CisgICAxMQl1bnNpZ25lZCBvY3RhbAorICAgMTEJc2lnbmVkIGRlY2ltYWwKKyAgIDEwCXVuc2lnbmVkIGRlY2ltYWwKKyAgIDgJdW5zaWduZWQgaGV4YWRlY2ltYWwgICovCisKK3N0YXRpYyBjb25zdCB1aW50OF90IGJ5dGVzX3RvX29jdF9kaWdpdHNbXSBBTElHTjEgPQorezAsIDMsIDYsIDgsIDExLCAxNCwgMTYsIDE5LCAyMiwgMjUsIDI3LCAzMCwgMzIsIDM1LCAzOCwgNDEsIDQzfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYnl0ZXNfdG9fc2lnbmVkX2RlY19kaWdpdHNbXSBBTElHTjEgPQorezEsIDQsIDYsIDgsIDExLCAxMywgMTYsIDE4LCAyMCwgMjMsIDI1LCAyOCwgMzAsIDMzLCAzNSwgMzcsIDQwfTsKKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgYnl0ZXNfdG9fdW5zaWduZWRfZGVjX2RpZ2l0c1tdIEFMSUdOMSA9Cit7MCwgMywgNSwgOCwgMTAsIDEzLCAxNSwgMTcsIDIwLCAyMiwgMjUsIDI3LCAyOSwgMzIsIDM0LCAzNywgMzl9OworCitzdGF0aWMgY29uc3QgdWludDhfdCBieXRlc190b19oZXhfZGlnaXRzW10gQUxJR04xID0KK3swLCAyLCA0LCA2LCA4LCAxMCwgMTIsIDE0LCAxNiwgMTgsIDIwLCAyMiwgMjQsIDI2LCAyOCwgMzAsIDMyfTsKKworLyogQ29udmVydCBlbnVtIHNpemVfc3BlYyB0byB0aGUgc2l6ZSBvZiB0aGUgbmFtZWQgdHlwZS4gICovCitzdGF0aWMgY29uc3Qgc2lnbmVkIGNoYXIgd2lkdGhfYnl0ZXNbXSBBTElHTjEgPSB7CisJLTEsCisJc2l6ZW9mKGNoYXIpLAorCXNpemVvZihzaG9ydCksCisJc2l6ZW9mKGludCksCisJc2l6ZW9mKGxvbmcpLAorCXNpemVvZih1bG9uZ2xvbmdfdCksCisJc2l6ZW9mKGZsb2F0KSwKKwlzaXplb2YoZG91YmxlKSwKKwlzaXplb2YobG9uZ2RvdWJsZV90KQorfTsKKy8qIEVuc3VyZSB0aGF0IGZvciBlYWNoIG1lbWJlciBvZiAnZW51bSBzaXplX3NwZWMnIHRoZXJlIGlzIGFuCisgICBpbml0aWFsaXplciBpbiB0aGUgd2lkdGhfYnl0ZXMgYXJyYXkuICAqLworc3RydWN0IEVSUl93aWR0aF9ieXRlc19oYXNfYmFkX3NpemUgeworCWNoYXIgRVJSX3dpZHRoX2J5dGVzX2hhc19iYWRfc2l6ZVtBUlJBWV9TSVpFKHdpZHRoX2J5dGVzKSA9PSBOX1NJWkVfU1BFQ1MgPyAxIDogLTFdOworfTsKKworc3RhdGljIHNtYWxsaW50IGV4aXRfY29kZTsKKworc3RhdGljIHVuc2lnbmVkIHN0cmluZ19taW47CisKKy8qIEFuIGFycmF5IG9mIHNwZWNzIGRlc2NyaWJpbmcgaG93IHRvIGZvcm1hdCBlYWNoIGlucHV0IGJsb2NrLiAgKi8KK3N0YXRpYyBzaXplX3Qgbl9zcGVjczsKK3N0YXRpYyBzdHJ1Y3QgdHNwZWMgKnNwZWM7CisKKy8qIEZ1bmN0aW9uIHRoYXQgYWNjZXB0cyBhbiBhZGRyZXNzIGFuZCBhbiBvcHRpb25hbCBmb2xsb3dpbmcgY2hhciwKKyAgIGFuZCBwcmludHMgdGhlIGFkZHJlc3MgYW5kIGNoYXIgdG8gc3Rkb3V0LiAgKi8KK3N0YXRpYyB2b2lkICgqZm9ybWF0X2FkZHJlc3MpKG9mZl90LCBjaGFyKTsKKy8qIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIG9sZC1zdHlsZSBwc2V1ZG8gc3RhcnRpbmcgYWRkcmVzcyBhbmQKKyAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gc2tpcC4gICovCisjaWYgRU5BQkxFX0xPTkdfT1BUUworc3RhdGljIG9mZl90IHBzZXVkb19vZmZzZXQ7CisjZWxzZQorZW51bSB7IHBzZXVkb19vZmZzZXQgPSAwIH07CisjZW5kaWYKKy8qIFdoZW4gemVybywgTUFYX0JZVEVTX1RPX0ZPUk1BVCBhbmQgRU5EX09GRlNFVCBhcmUgaWdub3JlZCwgYW5kIGFsbAorICAgaW5wdXQgaXMgZm9ybWF0dGVkLiAgKi8KKworLyogVGhlIG51bWJlciBvZiBpbnB1dCBieXRlcyBmb3JtYXR0ZWQgcGVyIG91dHB1dCBsaW5lLiAgSXQgbXVzdCBiZQorICAgYSBtdWx0aXBsZSBvZiB0aGUgbGVhc3QgY29tbW9uIG11bHRpcGxlIG9mIHRoZSBzaXplcyBhc3NvY2lhdGVkIHdpdGgKKyAgIHRoZSBzcGVjaWZpZWQgb3V0cHV0IHR5cGVzLiAgSXQgc2hvdWxkIGJlIGFzIGxhcmdlIGFzIHBvc3NpYmxlLCBidXQKKyAgIG5vIGxhcmdlciB0aGFuIDE2IC0tIHVubGVzcyBzcGVjaWZpZWQgd2l0aCB0aGUgLXcgb3B0aW9uLiAgKi8KK3N0YXRpYyB1bnNpZ25lZCBieXRlc19wZXJfYmxvY2sgPSAzMjsgLyogaGF2ZSB0byB1c2UgdW5zaWduZWQsIG5vdCBzaXplX3QgKi8KKworLyogQSBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiB0aGUgZmlsZS1hcmd1bWVudHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLiAgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCAqZmlsZV9saXN0OworCisvKiBUaGUgaW5wdXQgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBmaWxlLiAgKi8KK3N0YXRpYyBGSUxFICppbl9zdHJlYW07CisKKyNkZWZpbmUgTUFYX0lOVEVHUkFMX1RZUEVfU0laRSBzaXplb2YodWxvbmdsb25nX3QpCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBpbnRlZ3JhbF90eXBlX3NpemVbTUFYX0lOVEVHUkFMX1RZUEVfU0laRSArIDFdIEFMSUdOMSA9IHsKKwlbc2l6ZW9mKGNoYXIpXSA9IENIQVIsCisjaWYgVVNIUlRfTUFYICE9IFVDSEFSX01BWAorCVtzaXplb2Yoc2hvcnQpXSA9IFNIT1JULAorI2VuZGlmCisjaWYgVUlOVF9NQVggIT0gVVNIUlRfTUFYCisJW3NpemVvZihpbnQpXSA9IElOVCwKKyNlbmRpZgorI2lmIFVMT05HX01BWCAhPSBVSU5UX01BWAorCVtzaXplb2YobG9uZyldID0gTE9ORywKKyNlbmRpZgorI2lmIFVMTE9OR19NQVggIT0gVUxPTkdfTUFYCisJW3NpemVvZih1bG9uZ2xvbmdfdCldID0gTE9OR19MT05HLAorI2VuZGlmCit9OworCisjZGVmaW5lIE1BWF9GUF9UWVBFX1NJWkUgc2l6ZW9mKGxvbmdkb3VibGVfdCkKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGZwX3R5cGVfc2l6ZVtNQVhfRlBfVFlQRV9TSVpFICsgMV0gQUxJR04xID0geworCS8qIGdjYyBzZWVtcyB0byBhbGxvdyByZXBlYXRlZCBpbmRleGVzLiBMYXN0IG9uZSB3aW5zICovCisJW3NpemVvZihsb25nZG91YmxlX3QpXSA9IEZMT0FUX0xPTkdfRE9VQkxFLAorCVtzaXplb2YoZG91YmxlKV0gPSBGTE9BVF9ET1VCTEUsCisJW3NpemVvZihmbG9hdCldID0gRkxPQVRfU0lOR0xFCit9OworCisKK3N0YXRpYyB1bnNpZ25lZAorZ2NkKHVuc2lnbmVkIHUsIHVuc2lnbmVkIHYpCit7CisJdW5zaWduZWQgdDsKKwl3aGlsZSAodiAhPSAwKSB7CisJCXQgPSB1ICUgdjsKKwkJdSA9IHY7CisJCXYgPSB0OworCX0KKwlyZXR1cm4gdTsKK30KKworLyogQ29tcHV0ZSB0aGUgbGVhc3QgY29tbW9uIG11bHRpcGxlIG9mIFUgYW5kIFYuICAqLworc3RhdGljIHVuc2lnbmVkCitsY20odW5zaWduZWQgdSwgdW5zaWduZWQgdikgeworCXVuc2lnbmVkIHQgPSBnY2QodSwgdik7CisJaWYgKHQgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHUgKiB2IC8gdDsKK30KKworc3RhdGljIHZvaWQKK3ByaW50X3NfY2hhcihzaXplX3Qgbl9ieXRlcywgY29uc3QgY2hhciAqYmxvY2ssIGNvbnN0IGNoYXIgKmZtdF9zdHJpbmcpCit7CisJd2hpbGUgKG5fYnl0ZXMtLSkgeworCQlpbnQgdG1wID0gKihzaWduZWQgY2hhciAqKSBibG9jazsKKwkJcHJpbnRmKGZtdF9zdHJpbmcsIHRtcCk7CisJCWJsb2NrICs9IHNpemVvZih1bnNpZ25lZCBjaGFyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9jaGFyKHNpemVfdCBuX2J5dGVzLCBjb25zdCBjaGFyICpibG9jaywgY29uc3QgY2hhciAqZm10X3N0cmluZykKK3sKKwl3aGlsZSAobl9ieXRlcy0tKSB7CisJCXVuc2lnbmVkIHRtcCA9ICoodW5zaWduZWQgY2hhciAqKSBibG9jazsKKwkJcHJpbnRmKGZtdF9zdHJpbmcsIHRtcCk7CisJCWJsb2NrICs9IHNpemVvZih1bnNpZ25lZCBjaGFyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9zX3Nob3J0KHNpemVfdCBuX2J5dGVzLCBjb25zdCBjaGFyICpibG9jaywgY29uc3QgY2hhciAqZm10X3N0cmluZykKK3sKKwluX2J5dGVzIC89IHNpemVvZihzaWduZWQgc2hvcnQpOworCXdoaWxlIChuX2J5dGVzLS0pIHsKKwkJaW50IHRtcCA9ICooc2lnbmVkIHNob3J0ICopIGJsb2NrOworCQlwcmludGYoZm10X3N0cmluZywgdG1wKTsKKwkJYmxvY2sgKz0gc2l6ZW9mKHVuc2lnbmVkIHNob3J0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9zaG9ydChzaXplX3Qgbl9ieXRlcywgY29uc3QgY2hhciAqYmxvY2ssIGNvbnN0IGNoYXIgKmZtdF9zdHJpbmcpCit7CisJbl9ieXRlcyAvPSBzaXplb2YodW5zaWduZWQgc2hvcnQpOworCXdoaWxlIChuX2J5dGVzLS0pIHsKKwkJdW5zaWduZWQgdG1wID0gKih1bnNpZ25lZCBzaG9ydCAqKSBibG9jazsKKwkJcHJpbnRmKGZtdF9zdHJpbmcsIHRtcCk7CisJCWJsb2NrICs9IHNpemVvZih1bnNpZ25lZCBzaG9ydCk7CisJfQorfQorCitzdGF0aWMgdm9pZAorcHJpbnRfaW50KHNpemVfdCBuX2J5dGVzLCBjb25zdCBjaGFyICpibG9jaywgY29uc3QgY2hhciAqZm10X3N0cmluZykKK3sKKwluX2J5dGVzIC89IHNpemVvZih1bnNpZ25lZCk7CisJd2hpbGUgKG5fYnl0ZXMtLSkgeworCQl1bnNpZ25lZCB0bXAgPSAqKHVuc2lnbmVkICopIGJsb2NrOworCQlwcmludGYoZm10X3N0cmluZywgdG1wKTsKKwkJYmxvY2sgKz0gc2l6ZW9mKHVuc2lnbmVkKTsKKwl9Cit9CisKKyNpZiBVSU5UX01BWCA9PSBVTE9OR19NQVgKKyMgZGVmaW5lIHByaW50X2xvbmcgcHJpbnRfaW50CisjZWxzZQorc3RhdGljIHZvaWQKK3ByaW50X2xvbmcoc2l6ZV90IG5fYnl0ZXMsIGNvbnN0IGNoYXIgKmJsb2NrLCBjb25zdCBjaGFyICpmbXRfc3RyaW5nKQoreworCW5fYnl0ZXMgLz0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCXdoaWxlIChuX2J5dGVzLS0pIHsKKwkJdW5zaWduZWQgbG9uZyB0bXAgPSAqKHVuc2lnbmVkIGxvbmcgKikgYmxvY2s7CisJCXByaW50ZihmbXRfc3RyaW5nLCB0bXApOworCQlibG9jayArPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJfQorfQorI2VuZGlmCisKKyNpZiBVTE9OR19NQVggPT0gVUxMT05HX01BWAorIyBkZWZpbmUgcHJpbnRfbG9uZ19sb25nIHByaW50X2xvbmcKKyNlbHNlCitzdGF0aWMgdm9pZAorcHJpbnRfbG9uZ19sb25nKHNpemVfdCBuX2J5dGVzLCBjb25zdCBjaGFyICpibG9jaywgY29uc3QgY2hhciAqZm10X3N0cmluZykKK3sKKwluX2J5dGVzIC89IHNpemVvZih1bG9uZ2xvbmdfdCk7CisJd2hpbGUgKG5fYnl0ZXMtLSkgeworCQl1bG9uZ2xvbmdfdCB0bXAgPSAqKHVsb25nbG9uZ190ICopIGJsb2NrOworCQlwcmludGYoZm10X3N0cmluZywgdG1wKTsKKwkJYmxvY2sgKz0gc2l6ZW9mKHVsb25nbG9uZ190KTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK3ByaW50X2Zsb2F0KHNpemVfdCBuX2J5dGVzLCBjb25zdCBjaGFyICpibG9jaywgY29uc3QgY2hhciAqZm10X3N0cmluZykKK3sKKwluX2J5dGVzIC89IHNpemVvZihmbG9hdCk7CisJd2hpbGUgKG5fYnl0ZXMtLSkgeworCQlmbG9hdCB0bXAgPSAqKGZsb2F0ICopIGJsb2NrOworCQlwcmludGYoZm10X3N0cmluZywgdG1wKTsKKwkJYmxvY2sgKz0gc2l6ZW9mKGZsb2F0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9kb3VibGUoc2l6ZV90IG5fYnl0ZXMsIGNvbnN0IGNoYXIgKmJsb2NrLCBjb25zdCBjaGFyICpmbXRfc3RyaW5nKQoreworCW5fYnl0ZXMgLz0gc2l6ZW9mKGRvdWJsZSk7CisJd2hpbGUgKG5fYnl0ZXMtLSkgeworCQlkb3VibGUgdG1wID0gKihkb3VibGUgKikgYmxvY2s7CisJCXByaW50ZihmbXRfc3RyaW5nLCB0bXApOworCQlibG9jayArPSBzaXplb2YoZG91YmxlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9sb25nX2RvdWJsZShzaXplX3Qgbl9ieXRlcywgY29uc3QgY2hhciAqYmxvY2ssIGNvbnN0IGNoYXIgKmZtdF9zdHJpbmcpCit7CisJbl9ieXRlcyAvPSBzaXplb2YobG9uZ2RvdWJsZV90KTsKKwl3aGlsZSAobl9ieXRlcy0tKSB7CisJCWxvbmdkb3VibGVfdCB0bXAgPSAqKGxvbmdkb3VibGVfdCAqKSBibG9jazsKKwkJcHJpbnRmKGZtdF9zdHJpbmcsIHRtcCk7CisJCWJsb2NrICs9IHNpemVvZihsb25nZG91YmxlX3QpOworCX0KK30KKworLyogcHJpbnRfW25hbWVkXV9hc2NpaSBhcmUgb3B0aW1pemVkIGZvciBzcGVlZC4KKyAqIFJlbWVtYmVyLCBzb21lZGF5IHlvdSBtYXkgd2FudCB0byBwdW1wIGdpZ2FieXRlcyB0aHJvdWdoIHRoaXMgdGhpbmcuCisgKiBTYXZpbmcgYSBkb3plbiBvZiAudGV4dCBieXRlcyBoZXJlIGlzIGNvdW50ZXItcHJvZHVjdGl2ZSAqLworCitzdGF0aWMgdm9pZAorcHJpbnRfbmFtZWRfYXNjaWkoc2l6ZV90IG5fYnl0ZXMsIGNvbnN0IGNoYXIgKmJsb2NrLAorCQljb25zdCBjaGFyICp1bnVzZWRfZm10X3N0cmluZyBVTlVTRURfUEFSQU0pCit7CisJLyogTmFtZXMgZm9yIHNvbWUgbm9uLXByaW50aW5nIGNoYXJhY3RlcnMuICAqLworCXN0YXRpYyBjb25zdCBjaGFyIGNoYXJuYW1lWzMzXVszXSBBTElHTjEgPSB7CisJCSJudWwiLCAic29oIiwgInN0eCIsICJldHgiLCAiZW90IiwgImVucSIsICJhY2siLCAiYmVsIiwKKwkJIiBicyIsICIgaHQiLCAiIG5sIiwgIiB2dCIsICIgZmYiLCAiIGNyIiwgIiBzbyIsICIgc2kiLAorCQkiZGxlIiwgImRjMSIsICJkYzIiLCAiZGMzIiwgImRjNCIsICJuYWsiLCAic3luIiwgImV0YiIsCisJCSJjYW4iLCAiIGVtIiwgInN1YiIsICJlc2MiLCAiIGZzIiwgIiBncyIsICIgcnMiLCAiIHVzIiwKKwkJIiBzcCIKKwl9OworCS8vIGJ1ZltOXSBwb3M6ICAwMTIzNCA1Njc4OQorCWNoYXIgYnVmWzEyXSA9ICIgICB4XDAgeHh4XDAiOworCS8vIFsxMl0gYmVjYXVzZSB3ZSB0YWtlIHRocmVlIDMyYml0IHN0YWNrIHNsb3RzIGFueXdheSwgYW5kCisJLy8gZ2NjIGlzIHRvbyBkdW1iIHRvIGluaXRpYWxpemUgd2l0aCBjb25zdGFudCBzdG9yZXMsCisJLy8gaXQgY29waWVzIGluaXRpYWxpemVyIGZyb20gcm9kYXRhLiBPaCB3ZWxsLgorCS8vIGh0dHBzOi8vZ2NjLmdudS5vcmcvYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTY1NDEwCisKKwl3aGlsZSAobl9ieXRlcy0tKSB7CisJCXVuc2lnbmVkIG1hc2tlZF9jID0gKih1bnNpZ25lZCBjaGFyICopIGJsb2NrKys7CisKKwkJbWFza2VkX2MgJj0gMHg3ZjsKKwkJaWYgKG1hc2tlZF9jID09IDB4N2YpIHsKKwkJCWZwdXRzKCIgZGVsIiwgc3Rkb3V0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChtYXNrZWRfYyA+ICcgJykgeworCQkJYnVmWzNdID0gbWFza2VkX2M7CisJCQlmcHV0cyhidWYsIHN0ZG91dCk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBXaHk/IEJlY2F1c2UgcHJpbnRmKCIgJTMuM3MiKSBpcyBtdWNoIHNsb3dlci4uLiAqLworCQlidWZbNl0gPSBjaGFybmFtZVttYXNrZWRfY11bMF07CisJCWJ1Zls3XSA9IGNoYXJuYW1lW21hc2tlZF9jXVsxXTsKKwkJYnVmWzhdID0gY2hhcm5hbWVbbWFza2VkX2NdWzJdOworCQlmcHV0cyhidWYrNSwgc3Rkb3V0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9hc2NpaShzaXplX3Qgbl9ieXRlcywgY29uc3QgY2hhciAqYmxvY2ssCisJCWNvbnN0IGNoYXIgKnVudXNlZF9mbXRfc3RyaW5nIFVOVVNFRF9QQVJBTSkKK3sKKwkvLyBidWZbTl0gcG9zOiAgMDEyMzQgNTY3ODkKKwljaGFyIGJ1ZlsxMl0gPSAiICAgeFwwIHh4eFwwIjsKKworCXdoaWxlIChuX2J5dGVzLS0pIHsKKwkJY29uc3QgY2hhciAqczsKKwkJdW5zaWduZWQgYyA9ICoodW5zaWduZWQgY2hhciAqKSBibG9jaysrOworCisJCWlmIChJU1BSSU5UKGMpKSB7CisJCQlidWZbM10gPSBjOworCQkJZnB1dHMoYnVmLCBzdGRvdXQpOworCQkJY29udGludWU7CisJCX0KKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ1wwJzoKKwkJCXMgPSAiICBcXDAiOworCQkJYnJlYWs7CisJCWNhc2UgJ1wwMDcnOgorCQkJcyA9ICIgIFxcYSI7CisJCQlicmVhazsKKwkJY2FzZSAnXGInOgorCQkJcyA9ICIgIFxcYiI7CisJCQlicmVhazsKKwkJY2FzZSAnXGYnOgorCQkJcyA9ICIgIFxcZiI7CisJCQlicmVhazsKKwkJY2FzZSAnXG4nOgorCQkJcyA9ICIgIFxcbiI7CisJCQlicmVhazsKKwkJY2FzZSAnXHInOgorCQkJcyA9ICIgIFxcciI7CisJCQlicmVhazsKKwkJY2FzZSAnXHQnOgorCQkJcyA9ICIgIFxcdCI7CisJCQlicmVhazsKKwkJY2FzZSAnXHYnOgorCQkJcyA9ICIgIFxcdiI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJ1Zls2XSA9IChjID4+IDYgJiAzKSArICcwJzsKKwkJCWJ1Zls3XSA9IChjID4+IDMgJiA3KSArICcwJzsKKwkJCWJ1Zls4XSA9IChjICYgNykgKyAnMCc7CisJCQlzID0gYnVmICsgNTsKKwkJfQorCQlmcHV0cyhzLCBzdGRvdXQpOworCX0KK30KKworLyogR2l2ZW4gYSBsaXN0IG9mIG9uZSBvciBtb3JlIGlucHV0IGZpbGVuYW1lcyBGSUxFX0xJU1QsIHNldCB0aGUgZ2xvYmFsCisgICBmaWxlIHBvaW50ZXIgSU5fU1RSRUFNIGFuZCB0aGUgZ2xvYmFsIHN0cmluZyBJTlBVVF9GSUxFTkFNRSB0byB0aGUKKyAgIGZpcnN0IG9uZSB0aGF0IGNhbiBiZSBzdWNjZXNzZnVsbHkgb3BlbmVkLiBNb2RpZnkgRklMRV9MSVNUIHRvCisgICByZWZlcmVuY2UgdGhlIG5leHQgZmlsZW5hbWUgaW4gdGhlIGxpc3QuICBBIGZpbGUgbmFtZSBvZiAiLSIgaXMKKyAgIGludGVycHJldGVkIGFzIHN0YW5kYXJkIGlucHV0LiAgSWYgYW55IGZpbGUgb3BlbiBmYWlscywgZ2l2ZSBhbiBlcnJvcgorICAgbWVzc2FnZSBhbmQgcmV0dXJuIG5vbnplcm8uICAqLworCitzdGF0aWMgdm9pZAorb3Blbl9uZXh0X2ZpbGUodm9pZCkKK3sKKwl3aGlsZSAoMSkgeworCQlpZiAoISpmaWxlX2xpc3QpCisJCQlyZXR1cm47CisJCWluX3N0cmVhbSA9IGZvcGVuX29yX3dhcm5fc3RkaW4oKmZpbGVfbGlzdCsrKTsKKwkJaWYgKGluX3N0cmVhbSkgeworCQkJYnJlYWs7CisJCX0KKwkJZXhpdF9jb2RlID0gMTsKKwl9CisKKwlpZiAoKG9wdGlvbl9tYXNrMzIgJiAoT1BUX058T1BUX1MpKSA9PSBPUFRfTikKKwkJc2V0YnVmKGluX3N0cmVhbSwgTlVMTCk7Cit9CisKKy8qIFRlc3Qgd2hldGhlciB0aGVyZSBoYXZlIGJlZW4gZXJyb3JzIG9uIGluX3N0cmVhbSwgYW5kIGNsb3NlIGl0IGlmCisgICBpdCBpcyBub3Qgc3RhbmRhcmQgaW5wdXQuICBSZXR1cm4gbm9uemVybyBpZiB0aGVyZSBoYXMgYmVlbiBhbiBlcnJvcgorICAgb24gaW5fc3RyZWFtIG9yIHN0ZG91dDsgcmV0dXJuIHplcm8gb3RoZXJ3aXNlLiAgVGhpcyBmdW5jdGlvbiB3aWxsCisgICByZXBvcnQgbW9yZSB0aGFuIG9uZSBlcnJvciBvbmx5IGlmIGJvdGggYSByZWFkIGFuZCBhIHdyaXRlIGVycm9yCisgICBoYXZlIG9jY3VycmVkLiAgSU5fRVJSTk8sIGlmIG5vbnplcm8sIGlzIHRoZSBlcnJvciBudW1iZXIKKyAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG1vc3QgcmVjZW50IGFjdGlvbiBmb3IgSU5fU1RSRUFNLiAgKi8KKworc3RhdGljIHZvaWQKK2NoZWNrX2FuZF9jbG9zZSh2b2lkKQoreworCWlmIChpbl9zdHJlYW0pIHsKKwkJaWYgKGZlcnJvcihpbl9zdHJlYW0pKQl7CisJCQliYl9lcnJvcl9tc2coIiVzOiByZWFkIGVycm9yIiwgKGluX3N0cmVhbSA9PSBzdGRpbikKKwkJCQkJPyBiYl9tc2dfc3RhbmRhcmRfaW5wdXQKKwkJCQkJOiBmaWxlX2xpc3RbLTFdCisJCQkpOworCQkJZXhpdF9jb2RlID0gMTsKKwkJfQorCQlmY2xvc2VfaWZfbm90X3N0ZGluKGluX3N0cmVhbSk7CisJCWluX3N0cmVhbSA9IE5VTEw7CisJfQorCisJaWYgKGZlcnJvcihzdGRvdXQpKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ193cml0ZV9lcnJvcik7CisJfQorfQorCisvKiBJZiBTIHBvaW50cyB0byBhIHNpbmdsZSB2YWxpZCBtb2Rlcm4gb2QgZm9ybWF0IHN0cmluZywgcHV0CisgICBhIGRlc2NyaXB0aW9uIG9mIHRoYXQgZm9ybWF0IGluICpUU1BFQywgcmV0dXJuIHBvaW50ZXIgdG8KKyAgIGNoYXJhY3RlciBmb2xsb3dpbmcgdGhlIGp1c3QtZGVjb2RlZCBmb3JtYXQuCisgICBGb3IgZXhhbXBsZSwgaWYgUyB3ZXJlICJkNGFmTCIsIHdlIHdpbGwgcmV0dXJuIGEgcnRwIHRvICJhZkwiCisgICBhbmQgKlRTUEVDIHdvdWxkIGJlCisJeworCQlmbXQgPSBTSUdORURfREVDSU1BTDsKKwkJc2l6ZSA9IElOVCBvciBMT05HOyAod2hpY2hldmVyIGludGVncmFsX3R5cGVfc2l6ZVs0XSByZXNvbHZlcyB0bykKKwkJcHJpbnRfZnVuY3Rpb24gPSBwcmludF9pbnQ7IChhc3N1bWluZyBzaXplID09IElOVCkKKwkJZm10X3N0cmluZyA9ICIlMDExZCVjIjsKKwl9CisgICBTX09SSUcgaXMgc29sZWx5IGZvciByZXBvcnRpbmcgZXJyb3JzLiAgSXQgc2hvdWxkIGJlIHRoZSBmdWxsIGZvcm1hdAorICAgc3RyaW5nIGFyZ3VtZW50LiAqLworCitzdGF0aWMgTk9JTkxJTkUgY29uc3QgY2hhciAqCitkZWNvZGVfb25lX2Zvcm1hdChjb25zdCBjaGFyICpzX29yaWcsIGNvbnN0IGNoYXIgKnMsIHN0cnVjdCB0c3BlYyAqdHNwZWMpCit7CisJZW51bSBzaXplX3NwZWMgc2l6ZV9zcGVjOworCXVuc2lnbmVkIHNpemU7CisJZW51bSBvdXRwdXRfZm9ybWF0IGZtdDsKKwljb25zdCBjaGFyICpwOworCWNoYXIgKmVuZDsKKwljaGFyICpmbXRfc3RyaW5nID0gTlVMTDsKKwl2b2lkICgqcHJpbnRfZnVuY3Rpb24pIChzaXplX3QsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKwl1bnNpZ25lZCBjOworCXVuc2lnbmVkIGZpZWxkX3dpZHRoID0gMDsKKwlpbnQgcG9zOworCisJc3dpdGNoICgqcykgeworCWNhc2UgJ2QnOgorCWNhc2UgJ28nOgorCWNhc2UgJ3UnOgorCWNhc2UgJ3gnOiB7CisJCXN0YXRpYyBjb25zdCBjaGFyIENTSUxbXSBBTElHTjEgPSAiQ1NJTCI7CisKKwkJYyA9ICpzKys7CisJCXAgPSBzdHJjaHIoQ1NJTCwgKnMpOworCQkvKiBpZiAqcyA9PSBOVUwsIHAgIT0gTlVMTCEgVGVzdGNhc2U6ICJvZCAtdHgiICovCisJCWlmICghcCB8fCAqcCA9PSAnXDAnKSB7CisJCQlzaXplID0gc2l6ZW9mKGludCk7CisJCQlpZiAoaXNkaWdpdChzWzBdKSkgeworCQkJCXNpemUgPSBiYl9zdHJ0b3UocywgJmVuZCwgMCk7CisJCQkJaWYgKGVycm5vID09IEVSQU5HRQorCQkJCSB8fCBNQVhfSU5URUdSQUxfVFlQRV9TSVpFIDwgc2l6ZQorCQkJCSB8fCBpbnRlZ3JhbF90eXBlX3NpemVbc2l6ZV0gPT0gTk9fU0laRQorCQkJCSkgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCB0eXBlIHN0cmluZyAnJXMnOyAiCisJCQkJCQkiJXUtYnl0ZSAlcyB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQiLAorCQkJCQkJc19vcmlnLCBzaXplLCAiaW50ZWdyYWwiKTsKKwkJCQl9CisJCQkJcyA9IGVuZDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN0YXRpYyBjb25zdCB1aW50OF90IENTSUxfc2l6ZW9mWzRdID0geworCQkJCXNpemVvZihjaGFyKSwKKwkJCQlzaXplb2Yoc2hvcnQpLAorCQkJCXNpemVvZihpbnQpLAorCQkJCXNpemVvZihsb25nKSwKKwkJCX07CisJCQlzaXplID0gQ1NJTF9zaXplb2ZbcCAtIENTSUxdOworCQkJcysrOyAvKiBza2lwIEMvUy9JL0wgKi8KKwkJfQorCisjZGVmaW5lIElTUEVDX1RPX0ZPUk1BVChTcGVjLCBNaW5fZm9ybWF0LCBMb25nX2Zvcm1hdCwgTWF4X2Zvcm1hdCkgXAorCSgoU3BlYykgPT0gTE9OR19MT05HID8gKE1heF9mb3JtYXQpIFwKKwk6ICgoU3BlYykgPT0gTE9ORyA/IChMb25nX2Zvcm1hdCkgOiAoTWluX2Zvcm1hdCkpKQorCisjZGVmaW5lIEZNVF9CWVRFU19BTExPQ0FURUQgOQorCQlzaXplX3NwZWMgPSBpbnRlZ3JhbF90eXBlX3NpemVbc2l6ZV07CisKKwkJeworCQkJc3RhdGljIGNvbnN0IGNoYXIgZG91eFtdIEFMSUdOMSA9ICJkb3V4IjsKKwkJCXN0YXRpYyBjb25zdCBjaGFyIGRvdXhfZm10X2xldHRlcltdWzRdID0geworCQkJCSJsbGQiLCAibGxvIiwgImxsdSIsICJsbHgiCisJCQl9OworCQkJc3RhdGljIGNvbnN0IGVudW0gb3V0cHV0X2Zvcm1hdCBkb3V4X2ZtdFtdID0geworCQkJCVNJR05FRF9ERUNJTUFMLAorCQkJCU9DVEFMLAorCQkJCVVOU0lHTkVEX0RFQ0lNQUwsCisJCQkJSEVYQURFQ0lNQUwsCisJCQl9OworCQkJc3RhdGljIGNvbnN0IHVpbnQ4X3QgKmNvbnN0IGRvdXhfYnl0ZXNfdG9fWFhYW10gPSB7CisJCQkJYnl0ZXNfdG9fc2lnbmVkX2RlY19kaWdpdHMsCisJCQkJYnl0ZXNfdG9fb2N0X2RpZ2l0cywKKwkJCQlieXRlc190b191bnNpZ25lZF9kZWNfZGlnaXRzLAorCQkJCWJ5dGVzX3RvX2hleF9kaWdpdHMsCisJCQl9OworCQkJc3RhdGljIGNvbnN0IGNoYXIgZG91eF9mbXRzdHJpbmdbXVtzaXplb2YoIiAlJTAldSVzIildID0geworCQkJCSIgJSUldSVzIiwKKwkJCQkiICUlMCV1JXMiLAorCQkJCSIgJSUldSVzIiwKKwkJCQkiICUlMCV1JXMiLAorCQkJfTsKKworCQkJcG9zID0gc3RyY2hyKGRvdXgsIGMpIC0gZG91eDsKKwkJCWZtdCA9IGRvdXhfZm10W3Bvc107CisJCQlmaWVsZF93aWR0aCA9IGRvdXhfYnl0ZXNfdG9fWFhYW3Bvc11bc2l6ZV07CisJCQlwID0gZG91eF9mbXRfbGV0dGVyW3Bvc10gKyAyOworCQkJaWYgKHNpemVfc3BlYyA9PSBMT05HKSBwLS07CisJCQlpZiAoc2l6ZV9zcGVjID09IExPTkdfTE9ORykgcCAtPSAyOworCQkJZm10X3N0cmluZyA9IHhhc3ByaW50Zihkb3V4X2ZtdHN0cmluZ1twb3NdLCBmaWVsZF93aWR0aCwgcCk7CisJCX0KKworCQlzd2l0Y2ggKHNpemVfc3BlYykgeworCQljYXNlIENIQVI6CisJCQlwcmludF9mdW5jdGlvbiA9IChmbXQgPT0gU0lHTkVEX0RFQ0lNQUwKKwkJCQkgICAgPyBwcmludF9zX2NoYXIKKwkJCQkgICAgOiBwcmludF9jaGFyKTsKKwkJCWJyZWFrOworCQljYXNlIFNIT1JUOgorCQkJcHJpbnRfZnVuY3Rpb24gPSAoZm10ID09IFNJR05FRF9ERUNJTUFMCisJCQkJICAgID8gcHJpbnRfc19zaG9ydAorCQkJCSAgICA6IHByaW50X3Nob3J0KTsKKwkJCWJyZWFrOworCQljYXNlIElOVDoKKwkJCXByaW50X2Z1bmN0aW9uID0gcHJpbnRfaW50OworCQkJYnJlYWs7CisJCWNhc2UgTE9ORzoKKwkJCXByaW50X2Z1bmN0aW9uID0gcHJpbnRfbG9uZzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvKiBjYXNlIExPTkdfTE9ORzogKi8KKwkJCXByaW50X2Z1bmN0aW9uID0gcHJpbnRfbG9uZ19sb25nOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCisJY2FzZSAnZic6IHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgRkRMW10gQUxJR04xID0gIkZETCI7CisKKwkJZm10ID0gRkxPQVRJTkdfUE9JTlQ7CisJCSsrczsKKwkJcCA9IHN0cmNocihGREwsICpzKTsKKwkJaWYgKCFwKSB7CisJCQlzaXplID0gc2l6ZW9mKGRvdWJsZSk7CisJCQlpZiAoaXNkaWdpdChzWzBdKSkgeworCQkJCXNpemUgPSBiYl9zdHJ0b3UocywgJmVuZCwgMCk7CisJCQkJaWYgKGVycm5vID09IEVSQU5HRSB8fCBzaXplID4gTUFYX0ZQX1RZUEVfU0laRQorCQkJCSB8fCBmcF90eXBlX3NpemVbc2l6ZV0gPT0gTk9fU0laRQorCQkJCSkgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCB0eXBlIHN0cmluZyAnJXMnOyAiCisJCQkJCQkiJXUtYnl0ZSAlcyB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQiLAorCQkJCQkJc19vcmlnLCBzaXplLCAiZmxvYXRpbmcgcG9pbnQiKTsKKwkJCQl9CisJCQkJcyA9IGVuZDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXN0YXRpYyBjb25zdCB1aW50OF90IEZETF9zaXplb2ZbXSA9IHsKKwkJCQlzaXplb2YoZmxvYXQpLAorCQkJCXNpemVvZihkb3VibGUpLAorCQkJCXNpemVvZihsb25nZG91YmxlX3QpLAorCQkJfTsKKworCQkJc2l6ZSA9IEZETF9zaXplb2ZbcCAtIEZETF07CisJCX0KKworCQlzaXplX3NwZWMgPSBmcF90eXBlX3NpemVbc2l6ZV07CisKKwkJc3dpdGNoIChzaXplX3NwZWMpIHsKKwkJY2FzZSBGTE9BVF9TSU5HTEU6CisJCQlwcmludF9mdW5jdGlvbiA9IHByaW50X2Zsb2F0OworCQkJZmllbGRfd2lkdGggPSBGTFRfRElHICsgODsKKwkJCS8qIERvbid0IHVzZSAlI2U7IG5vdCBhbGwgc3lzdGVtcyBzdXBwb3J0IGl0LiAgKi8KKwkJCWZtdF9zdHJpbmcgPSB4YXNwcmludGYoIiAlJSVkLiVkZSIsIGZpZWxkX3dpZHRoLCBGTFRfRElHKTsKKwkJCWJyZWFrOworCQljYXNlIEZMT0FUX0RPVUJMRToKKwkJCXByaW50X2Z1bmN0aW9uID0gcHJpbnRfZG91YmxlOworCQkJZmllbGRfd2lkdGggPSBEQkxfRElHICsgODsKKwkJCWZtdF9zdHJpbmcgPSB4YXNwcmludGYoIiAlJSVkLiVkZSIsIGZpZWxkX3dpZHRoLCBEQkxfRElHKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvKiBjYXNlIEZMT0FUX0xPTkdfRE9VQkxFOiAqLworCQkJcHJpbnRfZnVuY3Rpb24gPSBwcmludF9sb25nX2RvdWJsZTsKKwkJCWZpZWxkX3dpZHRoID0gTERCTF9ESUcgKyA4OworCQkJZm10X3N0cmluZyA9IHhhc3ByaW50ZigiICUlJWQuJWRMZSIsIGZpZWxkX3dpZHRoLCBMREJMX0RJRyk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlICdhJzoKKwkJKytzOworCQlmbXQgPSBOQU1FRF9DSEFSQUNURVI7CisJCXNpemVfc3BlYyA9IENIQVI7CisJCXByaW50X2Z1bmN0aW9uID0gcHJpbnRfbmFtZWRfYXNjaWk7CisJCWZpZWxkX3dpZHRoID0gMzsKKwkJYnJlYWs7CisJY2FzZSAnYyc6CisJCSsrczsKKwkJZm10ID0gQ0hBUkFDVEVSOworCQlzaXplX3NwZWMgPSBDSEFSOworCQlwcmludF9mdW5jdGlvbiA9IHByaW50X2FzY2lpOworCQlmaWVsZF93aWR0aCA9IDM7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIGNoYXJhY3RlciAnJWMnICIKKwkJCQkiaW4gdHlwZSBzdHJpbmcgJyVzJyIsICpzLCBzX29yaWcpOworCX0KKworCXRzcGVjLT5zaXplID0gc2l6ZV9zcGVjOworCXRzcGVjLT5mbXQgPSBmbXQ7CisJdHNwZWMtPnByaW50X2Z1bmN0aW9uID0gcHJpbnRfZnVuY3Rpb247CisJdHNwZWMtPmZtdF9zdHJpbmcgPSBmbXRfc3RyaW5nOworCisJdHNwZWMtPmZpZWxkX3dpZHRoID0gZmllbGRfd2lkdGg7CisJdHNwZWMtPmhleGxfbW9kZV90cmFpbGVyID0gKCpzID09ICd6Jyk7CisJaWYgKHRzcGVjLT5oZXhsX21vZGVfdHJhaWxlcikKKwkJcysrOworCisJcmV0dXJuIHM7Cit9CisKKy8qIERlY29kZSB0aGUgbW9kZXJuIG9kIGZvcm1hdCBzdHJpbmcgUy4gIEFwcGVuZCB0aGUgZGVjb2RlZAorICAgcmVwcmVzZW50YXRpb24gdG8gdGhlIGdsb2JhbCBhcnJheSBTUEVDLCByZWFsbG9jYXRpbmcgU1BFQyBpZgorICAgbmVjZXNzYXJ5LiAgKi8KKworc3RhdGljIHZvaWQKK2RlY29kZV9mb3JtYXRfc3RyaW5nKGNvbnN0IGNoYXIgKnMpCit7CisJY29uc3QgY2hhciAqc19vcmlnID0gczsKKworCXdoaWxlICgqcyAhPSAnXDAnKSB7CisJCXN0cnVjdCB0c3BlYyB0c3BlYzsKKwkJY29uc3QgY2hhciAqbmV4dDsKKworCQluZXh0ID0gZGVjb2RlX29uZV9mb3JtYXQoc19vcmlnLCBzLCAmdHNwZWMpOworCisJCWFzc2VydChzICE9IG5leHQpOworCQlzID0gbmV4dDsKKwkJc3BlYyA9IHhyZWFsbG9jX3ZlY3RvcihzcGVjLCA0LCBuX3NwZWNzKTsKKwkJbWVtY3B5KCZzcGVjW25fc3BlY3NdLCAmdHNwZWMsIHNpemVvZihzcGVjWzBdKSk7CisJCW5fc3BlY3MrKzsKKwl9Cit9CisKKy8qIEdpdmVuIGEgbGlzdCBvZiBvbmUgb3IgbW9yZSBpbnB1dCBmaWxlbmFtZXMgRklMRV9MSVNULCBzZXQgdGhlIGdsb2JhbAorICAgZmlsZSBwb2ludGVyIElOX1NUUkVBTSB0byBwb3NpdGlvbiBOX1NLSVAgaW4gdGhlIGNvbmNhdGVuYXRpb24gb2YKKyAgIHRob3NlIGZpbGVzLiAgSWYgYW55IGZpbGUgb3BlcmF0aW9uIGZhaWxzIG9yIGlmIHRoZXJlIGFyZSBmZXdlciB0aGFuCisgICBOX1NLSVAgYnl0ZXMgaW4gdGhlIGNvbWJpbmVkIGlucHV0LCBnaXZlIGFuIGVycm9yIG1lc3NhZ2UgYW5kIHJldHVybgorICAgbm9uemVyby4gIFdoZW4gcG9zc2libGUsIHVzZSBzZWVrIHJhdGhlciB0aGFuIHJlYWQgb3BlcmF0aW9ucyB0bworICAgYWR2YW5jZSBJTl9TVFJFQU0uICAqLworCitzdGF0aWMgdm9pZAorc2tpcChvZmZfdCBuX3NraXApCit7CisJaWYgKG5fc2tpcCA9PSAwKQorCQlyZXR1cm47CisKKwl3aGlsZSAoaW5fc3RyZWFtKSB7IC8qICFFT0YgKi8KKwkJc3RydWN0IHN0YXQgZmlsZV9zdGF0czsKKworCQkvKiBGaXJzdCB0cnkgc2Vla2luZy4gIEZvciBsYXJnZSBvZmZzZXRzLCB0aGlzIGV4dHJhIHdvcmsgaXMKKwkJICAgd29ydGh3aGlsZS4gIElmIHRoZSBvZmZzZXQgaXMgYmVsb3cgc29tZSB0aHJlc2hvbGQgaXQgbWF5IGJlCisJCSAgIG1vcmUgZWZmaWNpZW50IHRvIG1vdmUgdGhlIHBvaW50ZXIgYnkgcmVhZGluZy4gIFRoZXJlIGFyZSB0d28KKwkJICAgaXNzdWVzIHdoZW4gdHJ5aW5nIHRvIHNlZWs6CisJCQktIHRoZSBmaWxlIG11c3QgYmUgc2Vla2FibGUuCisJCQktIGJlZm9yZSBzZWVraW5nIHRvIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24sIG1ha2Ugc3VyZQorCQkJICB0aGF0IHRoZSBuZXcgcG9zaXRpb24gaXMgaW4gdGhlIGN1cnJlbnQgZmlsZS4KKwkJCSAgVHJ5IHRvIGRvIHRoYXQgYnkgZ2V0dGluZyBmaWxlJ3Mgc2l6ZSB1c2luZyBmc3RhdC4KKwkJCSAgQnV0IHRoYXQgd2lsbCB3b3JrIG9ubHkgZm9yIHJlZ3VsYXIgZmlsZXMuICAqLworCisJCQkvKiBUaGUgc3Rfc2l6ZSBmaWVsZCBpcyB2YWxpZCBvbmx5IGZvciByZWd1bGFyIGZpbGVzCisJCQkgICAoYW5kIGZvciBzeW1ib2xpYyBsaW5rcywgd2hpY2ggY2Fubm90IG9jY3VyIGhlcmUpLgorCQkJICAgSWYgdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0IHRvIHNraXAgaXMgYXQgbGVhc3QKKwkJCSAgIGFzIGxhcmdlIGFzIHRoZSBzaXplIG9mIHRoZSBjdXJyZW50IGZpbGUsIHdlIGNhbgorCQkJICAgZGVjcmVtZW50IG5fc2tpcCBhbmQgZ28gb24gdG8gdGhlIG5leHQgZmlsZS4gICovCisJCWlmIChmc3RhdChmaWxlbm8oaW5fc3RyZWFtKSwgJmZpbGVfc3RhdHMpID09IDAKKwkJICYmIFNfSVNSRUcoZmlsZV9zdGF0cy5zdF9tb2RlKSAmJiBmaWxlX3N0YXRzLnN0X3NpemUgPiAwCisJCSkgeworCQkJaWYgKGZpbGVfc3RhdHMuc3Rfc2l6ZSA8IG5fc2tpcCkgeworCQkJCW5fc2tpcCAtPSBmaWxlX3N0YXRzLnN0X3NpemU7CisJCQkJLyogdGFrZSAiY2hlY2sgJiBjbG9zZSAvIG9wZW5fbmV4dCIgcm91dGUgKi8KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGZzZWVrbyhpbl9zdHJlYW0sIG5fc2tpcCwgU0VFS19DVVIpICE9IDApCisJCQkJCWV4aXRfY29kZSA9IDE7CisJCQkJcmV0dXJuOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogSWYgaXQncyBub3QgYSByZWd1bGFyIGZpbGUgd2l0aCBwb3NpdGl2ZSBzaXplLAorCQkJICAgcG9zaXRpb24gdGhlIGZpbGUgcG9pbnRlciBieSByZWFkaW5nLiAgKi8KKwkJCWNoYXIgYnVmWzEwMjRdOworCQkJc2l6ZV90IG5fYnl0ZXNfdG9fcmVhZCA9IDEwMjQ7CisJCQlzaXplX3Qgbl9ieXRlc19yZWFkOworCisJCQl3aGlsZSAobl9za2lwID4gMCkgeworCQkJCWlmIChuX3NraXAgPCBuX2J5dGVzX3RvX3JlYWQpCisJCQkJCW5fYnl0ZXNfdG9fcmVhZCA9IG5fc2tpcDsKKwkJCQluX2J5dGVzX3JlYWQgPSBmcmVhZChidWYsIDEsIG5fYnl0ZXNfdG9fcmVhZCwgaW5fc3RyZWFtKTsKKwkJCQluX3NraXAgLT0gbl9ieXRlc19yZWFkOworCQkJCWlmIChuX2J5dGVzX3JlYWQgIT0gbl9ieXRlc190b19yZWFkKQorCQkJCQlicmVhazsgLyogRU9GIG9uIHRoaXMgZmlsZSBvciBlcnJvciAqLworCQkJfQorCQl9CisJCWlmIChuX3NraXAgPT0gMCkKKwkJCXJldHVybjsKKworCQljaGVja19hbmRfY2xvc2UoKTsKKwkJb3Blbl9uZXh0X2ZpbGUoKTsKKwl9CisKKwlpZiAobl9za2lwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc2tpcCBwYXN0IGVuZCBvZiBjb21iaW5lZCBpbnB1dCIpOworfQorCisKK3R5cGVkZWYgdm9pZCBGTl9mb3JtYXRfYWRkcmVzcyhvZmZfdCBhZGRyZXNzLCBjaGFyIGMpOworCitzdGF0aWMgdm9pZAorZm9ybWF0X2FkZHJlc3Nfbm9uZShvZmZfdCBhZGRyZXNzIFVOVVNFRF9QQVJBTSwgY2hhciBjIFVOVVNFRF9QQVJBTSkKK3sKK30KKworc3RhdGljIGNoYXIgYWRkcmVzc19mbXRbXSBBTElHTjEgPSAiJTBuIk9GRl9GTVQieGMiOworLyogQ29ycmVzcG9uZHMgdG8gJ3gnIGFib3ZlICovCisjZGVmaW5lIGFkZHJlc3NfYmFzZV9jaGFyIGFkZHJlc3NfZm10W3NpemVvZihhZGRyZXNzX2ZtdCktM10KKy8qIENvcnJlc3BvbmRzIHRvICduJyBhYm92ZSAqLworI2RlZmluZSBhZGRyZXNzX3BhZF9sZW5fY2hhciBhZGRyZXNzX2ZtdFsyXQorCitzdGF0aWMgdm9pZAorZm9ybWF0X2FkZHJlc3Nfc3RkKG9mZl90IGFkZHJlc3MsIGNoYXIgYykKK3sKKwkvKiBDb3JyZXNwb25kcyB0byAnYycgKi8KKwlhZGRyZXNzX2ZtdFtzaXplb2YoYWRkcmVzc19mbXQpLTJdID0gYzsKKwlwcmludGYoYWRkcmVzc19mbXQsIGFkZHJlc3MpOworfQorCisjaWYgRU5BQkxFX0xPTkdfT1BUUworLyogb25seSB1c2VkIHdpdGggLS10cmFkaXRpb25hbCAqLworc3RhdGljIHZvaWQKK2Zvcm1hdF9hZGRyZXNzX3BhcmVuKG9mZl90IGFkZHJlc3MsIGNoYXIgYykKK3sKKwlwdXRjaGFyKCcoJyk7CisJZm9ybWF0X2FkZHJlc3Nfc3RkKGFkZHJlc3MsICcpJyk7CisJaWYgKGMpIHB1dGNoYXIoYyk7Cit9CisKK3N0YXRpYyB2b2lkCitmb3JtYXRfYWRkcmVzc19sYWJlbChvZmZfdCBhZGRyZXNzLCBjaGFyIGMpCit7CisJZm9ybWF0X2FkZHJlc3Nfc3RkKGFkZHJlc3MsICcgJyk7CisJZm9ybWF0X2FkZHJlc3NfcGFyZW4oYWRkcmVzcyArIHBzZXVkb19vZmZzZXQsIGMpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitkdW1wX2hleGxfbW9kZV90cmFpbGVyKHNpemVfdCBuX2J5dGVzLCBjb25zdCBjaGFyICpibG9jaykKK3sKKwlmcHV0cygiICA+Iiwgc3Rkb3V0KTsKKwl3aGlsZSAobl9ieXRlcy0tKSB7CisJCXVuc2lnbmVkIGMgPSAqKHVuc2lnbmVkIGNoYXIgKikgYmxvY2srKzsKKwkJYyA9IChJU1BSSU5UKGMpID8gYyA6ICcuJyk7CisJCXB1dGNoYXIoYyk7CisJfQorCXB1dGNoYXIoJzwnKTsKK30KKworLyogV3JpdGUgTl9CWVRFUyBieXRlcyBmcm9tIENVUlJfQkxPQ0sgdG8gc3RhbmRhcmQgb3V0cHV0IG9uY2UgZm9yIGVhY2gKKyAgIG9mIHRoZSBOX1NQRUMgZm9ybWF0IHNwZWNzLiAgQ1VSUkVOVF9PRkZTRVQgaXMgdGhlIGJ5dGUgYWRkcmVzcyBvZgorICAgQ1VSUl9CTE9DSyBpbiB0aGUgY29uY2F0ZW5hdGlvbiBvZiBpbnB1dCBmaWxlcywgYW5kIGl0IGlzIHByaW50ZWQKKyAgIChvcHRpb25hbGx5KSBvbmx5IGJlZm9yZSB0aGUgb3V0cHV0IGxpbmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaXJzdAorICAgZm9ybWF0IHNwZWMuICBXaGVuIGR1cGxpY2F0ZSBibG9ja3MgYXJlIGJlaW5nIGFiYnJldmlhdGVkLCB0aGUgb3V0cHV0CisgICBmb3IgYSBzZXF1ZW5jZSBvZiBpZGVudGljYWwgaW5wdXQgYmxvY2tzIGlzIHRoZSBvdXRwdXQgZm9yIHRoZSBmaXJzdAorICAgYmxvY2sgZm9sbG93ZWQgYnkgYW4gYXN0ZXJpc2sgYWxvbmUgb24gYSBsaW5lLiAgSXQgaXMgdmFsaWQgdG8gY29tcGFyZQorICAgdGhlIGJsb2NrcyBQUkVWX0JMT0NLIGFuZCBDVVJSX0JMT0NLIG9ubHkgd2hlbiBOX0JZVEVTID09IEJZVEVTX1BFUl9CTE9DSy4KKyAgIFRoYXQgY29uZGl0aW9uIG1heSBiZSBmYWxzZSBvbmx5IGZvciB0aGUgbGFzdCBpbnB1dCBibG9jayAtLSBhbmQgdGhlbgorICAgb25seSB3aGVuIGl0IGhhcyBub3QgYmVlbiBwYWRkZWQgdG8gbGVuZ3RoIEJZVEVTX1BFUl9CTE9DSy4gICovCisKK3N0YXRpYyB2b2lkCit3cml0ZV9ibG9jayhvZmZfdCBjdXJyZW50X29mZnNldCwgc2l6ZV90IG5fYnl0ZXMsCisJCWNvbnN0IGNoYXIgKnByZXZfYmxvY2ssIGNvbnN0IGNoYXIgKmN1cnJfYmxvY2spCit7CisJc3RhdGljIGNoYXIgZmlyc3QgPSAxOworCXN0YXRpYyBjaGFyIHByZXZfcGFpcl9lcXVhbCA9IDA7CisJc2l6ZV90IGk7CisKKwlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX3YpCisJICYmICFmaXJzdAorCSAmJiBuX2J5dGVzID09IGJ5dGVzX3Blcl9ibG9jaworCSAmJiBtZW1jbXAocHJldl9ibG9jaywgY3Vycl9ibG9jaywgYnl0ZXNfcGVyX2Jsb2NrKSA9PSAwCisJKSB7CisJCWlmIChwcmV2X3BhaXJfZXF1YWwpIHsKKwkJCS8qIFRoZSB0d28gcHJlY2VkaW5nIGJsb2NrcyB3ZXJlIGVxdWFsLCBhbmQgdGhlIGN1cnJlbnQKKwkJCSAgIGJsb2NrIGlzIHRoZSBzYW1lIGFzIHRoZSBsYXN0IG9uZSwgc28gcHJpbnQgbm90aGluZy4gICovCisJCX0gZWxzZSB7CisJCQlwdXRzKCIqIik7CisJCQlwcmV2X3BhaXJfZXF1YWwgPSAxOworCQl9CisJfSBlbHNlIHsKKwkJZmlyc3QgPSAwOworCQlwcmV2X3BhaXJfZXF1YWwgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgbl9zcGVjczsgaSsrKSB7CisJCQlpZiAoaSA9PSAwKQorCQkJCWZvcm1hdF9hZGRyZXNzKGN1cnJlbnRfb2Zmc2V0LCAnXDAnKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiUqcyIsIGFkZHJlc3NfcGFkX2xlbl9jaGFyIC0gJzAnLCAiIik7CisJCQkoKnNwZWNbaV0ucHJpbnRfZnVuY3Rpb24pIChuX2J5dGVzLCBjdXJyX2Jsb2NrLCBzcGVjW2ldLmZtdF9zdHJpbmcpOworCQkJaWYgKHNwZWNbaV0uaGV4bF9tb2RlX3RyYWlsZXIpIHsKKwkJCQkvKiBzcGFjZS1wYWQgb3V0IHRvIGZ1bGwgbGluZSB3aWR0aCwgdGhlbiBkdW1wIHRoZSB0cmFpbGVyICovCisJCQkJdW5zaWduZWQgZGF0dW1fd2lkdGggPSB3aWR0aF9ieXRlc1tzcGVjW2ldLnNpemVdOworCQkJCXVuc2lnbmVkIGJsYW5rX2ZpZWxkcyA9IChieXRlc19wZXJfYmxvY2sgLSBuX2J5dGVzKSAvIGRhdHVtX3dpZHRoOworCQkJCXVuc2lnbmVkIGZpZWxkX3dpZHRoID0gc3BlY1tpXS5maWVsZF93aWR0aCArIDE7CisJCQkJcHJpbnRmKCIlKnMiLCBibGFua19maWVsZHMgKiBmaWVsZF93aWR0aCwgIiIpOworCQkJCWR1bXBfaGV4bF9tb2RlX3RyYWlsZXIobl9ieXRlcywgY3Vycl9ibG9jayk7CisJCQl9CisJCQlwdXRjaGFyKCdcbicpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorcmVhZF9ibG9jayhzaXplX3QgbiwgY2hhciAqYmxvY2ssIHNpemVfdCAqbl9ieXRlc19pbl9idWZmZXIpCit7CisJYXNzZXJ0KDAgPCBuICYmIG4gPD0gYnl0ZXNfcGVyX2Jsb2NrKTsKKworCSpuX2J5dGVzX2luX2J1ZmZlciA9IDA7CisKKwlpZiAobiA9PSAwKQorCQlyZXR1cm47CisKKwl3aGlsZSAoaW5fc3RyZWFtICE9IE5VTEwpIHsgLyogRU9GLiAgKi8KKwkJc2l6ZV90IG5fbmVlZGVkOworCQlzaXplX3Qgbl9yZWFkOworCisJCW5fbmVlZGVkID0gbiAtICpuX2J5dGVzX2luX2J1ZmZlcjsKKwkJbl9yZWFkID0gZnJlYWQoYmxvY2sgKyAqbl9ieXRlc19pbl9idWZmZXIsIDEsIG5fbmVlZGVkLCBpbl9zdHJlYW0pOworCQkqbl9ieXRlc19pbl9idWZmZXIgKz0gbl9yZWFkOworCQlpZiAobl9yZWFkID09IG5fbmVlZGVkKQorCQkJYnJlYWs7CisJCS8qIGVycm9yIGNoZWNrIGlzIGRvbmUgaW4gY2hlY2tfYW5kX2Nsb3NlICovCisJCWNoZWNrX2FuZF9jbG9zZSgpOworCQlvcGVuX25leHRfZmlsZSgpOworCX0KK30KKworLyogUmV0dXJuIHRoZSBsZWFzdCBjb21tb24gbXVsdGlwbGUgb2YgdGhlIHNpemVzIGFzc29jaWF0ZWQKKyAgIHdpdGggdGhlIGZvcm1hdCBzcGVjcy4gICovCisKK3N0YXRpYyBpbnQKK2dldF9sY20odm9pZCkKK3sKKwlzaXplX3QgaTsKKwlpbnQgbF9jX20gPSAxOworCisJZm9yIChpID0gMDsgaSA8IG5fc3BlY3M7IGkrKykKKwkJbF9jX20gPSBsY20obF9jX20sIHdpZHRoX2J5dGVzWyhpbnQpIHNwZWNbaV0uc2l6ZV0pOworCXJldHVybiBsX2NfbTsKK30KKworLyogUmVhZCBhIGNodW5rIG9mIHNpemUgQllURVNfUEVSX0JMT0NLIGZyb20gdGhlIGlucHV0IGZpbGVzLCB3cml0ZSB0aGUKKyAgIGZvcm1hdHRlZCBibG9jayB0byBzdGFuZGFyZCBvdXRwdXQsIGFuZCByZXBlYXQgdW50aWwgdGhlIHNwZWNpZmllZAorICAgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgaGFzIGJlZW4gcmVhZCBvciB1bnRpbCBhbGwgaW5wdXQgaGFzIGJlZW4KKyAgIHByb2Nlc3NlZC4gIElmIHRoZSBsYXN0IGJsb2NrIHJlYWQgaXMgc21hbGxlciB0aGFuIEJZVEVTX1BFUl9CTE9DSworICAgYW5kIGl0cyBzaXplIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSBzaXplIGFzc29jaWF0ZWQgd2l0aCBhIGZvcm1hdAorICAgc3BlYywgZXh0ZW5kIHRoZSBpbnB1dCBibG9jayB3aXRoIHplcm8gYnl0ZXMgdW50aWwgaXRzIGxlbmd0aCBpcyBhCisgICBtdWx0aXBsZSBvZiBhbGwgZm9ybWF0IHNwZWMgc2l6ZXMuICBXcml0ZSB0aGUgZmluYWwgYmxvY2suICBGaW5hbGx5LAorICAgd3JpdGUgb24gYSBsaW5lIGJ5IGl0c2VsZiB0aGUgb2Zmc2V0IG9mIHRoZSBieXRlIGFmdGVyIHRoZSBsYXN0IGJ5dGUKKyAgIHJlYWQuICAqLworCitzdGF0aWMgdm9pZAorZHVtcChvZmZfdCBjdXJyZW50X29mZnNldCwgb2ZmX3QgZW5kX29mZnNldCkKK3sKKwljaGFyICpibG9ja1syXTsKKwlpbnQgaWR4OworCXNpemVfdCBuX2J5dGVzX3JlYWQ7CisKKwlibG9ja1swXSA9IHhtYWxsb2MoMiAqIGJ5dGVzX3Blcl9ibG9jayk7CisJYmxvY2tbMV0gPSBibG9ja1swXSArIGJ5dGVzX3Blcl9ibG9jazsKKworCWlkeCA9IDA7CisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfTikgeworCQl3aGlsZSAoMSkgeworCQkJc2l6ZV90IG5fbmVlZGVkOworCQkJaWYgKGN1cnJlbnRfb2Zmc2V0ID49IGVuZF9vZmZzZXQpIHsKKwkJCQluX2J5dGVzX3JlYWQgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJbl9uZWVkZWQgPSBNSU4oZW5kX29mZnNldCAtIGN1cnJlbnRfb2Zmc2V0LCAob2ZmX3QpIGJ5dGVzX3Blcl9ibG9jayk7CisJCQlyZWFkX2Jsb2NrKG5fbmVlZGVkLCBibG9ja1tpZHhdLCAmbl9ieXRlc19yZWFkKTsKKwkJCWlmIChuX2J5dGVzX3JlYWQgPCBieXRlc19wZXJfYmxvY2spCisJCQkJYnJlYWs7CisJCQlhc3NlcnQobl9ieXRlc19yZWFkID09IGJ5dGVzX3Blcl9ibG9jayk7CisJCQl3cml0ZV9ibG9jayhjdXJyZW50X29mZnNldCwgbl9ieXRlc19yZWFkLCBibG9ja1tpZHggXiAxXSwgYmxvY2tbaWR4XSk7CisJCQljdXJyZW50X29mZnNldCArPSBuX2J5dGVzX3JlYWQ7CisJCQlpZHggXj0gMTsKKwkJfQorCX0gZWxzZSB7CisJCXdoaWxlICgxKSB7CisJCQlyZWFkX2Jsb2NrKGJ5dGVzX3Blcl9ibG9jaywgYmxvY2tbaWR4XSwgJm5fYnl0ZXNfcmVhZCk7CisJCQlpZiAobl9ieXRlc19yZWFkIDwgYnl0ZXNfcGVyX2Jsb2NrKQorCQkJCWJyZWFrOworCQkJYXNzZXJ0KG5fYnl0ZXNfcmVhZCA9PSBieXRlc19wZXJfYmxvY2spOworCQkJd3JpdGVfYmxvY2soY3VycmVudF9vZmZzZXQsIG5fYnl0ZXNfcmVhZCwgYmxvY2tbaWR4IF4gMV0sIGJsb2NrW2lkeF0pOworCQkJY3VycmVudF9vZmZzZXQgKz0gbl9ieXRlc19yZWFkOworCQkJaWR4IF49IDE7CisJCX0KKwl9CisKKwlpZiAobl9ieXRlc19yZWFkID4gMCkgeworCQlpbnQgbF9jX207CisJCXNpemVfdCBieXRlc190b193cml0ZTsKKworCQlsX2NfbSA9IGdldF9sY20oKTsKKworCQkvKiBNYWtlIGJ5dGVzX3RvX3dyaXRlIHRoZSBzbWFsbGVzdCBtdWx0aXBsZSBvZiBsX2NfbSB0aGF0CisJCSAgIGlzIGF0IGxlYXN0IGFzIGxhcmdlIGFzIG5fYnl0ZXNfcmVhZC4gICovCisJCWJ5dGVzX3RvX3dyaXRlID0gbF9jX20gKiAoKG5fYnl0ZXNfcmVhZCArIGxfY19tIC0gMSkgLyBsX2NfbSk7CisKKwkJbWVtc2V0KGJsb2NrW2lkeF0gKyBuX2J5dGVzX3JlYWQsIDAsIGJ5dGVzX3RvX3dyaXRlIC0gbl9ieXRlc19yZWFkKTsKKwkJd3JpdGVfYmxvY2soY3VycmVudF9vZmZzZXQsIGJ5dGVzX3RvX3dyaXRlLAorCQkJCWJsb2NrW2lkeCBeIDFdLCBibG9ja1tpZHhdKTsKKwkJY3VycmVudF9vZmZzZXQgKz0gbl9ieXRlc19yZWFkOworCX0KKworCWZvcm1hdF9hZGRyZXNzKGN1cnJlbnRfb2Zmc2V0LCAnXG4nKTsKKworCWlmICgob3B0aW9uX21hc2szMiAmIE9QVF9OKSAmJiBjdXJyZW50X29mZnNldCA+PSBlbmRfb2Zmc2V0KQorCQljaGVja19hbmRfY2xvc2UoKTsKKworCWZyZWUoYmxvY2tbMF0pOworfQorCisvKiBSZWFkIE4gYnl0ZXMgaW50byBCTE9DSyBmcm9tIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBpbnB1dCBmaWxlcworICAgbmFtZWQgaW4gdGhlIGdsb2JhbCBhcnJheSBGSUxFX0xJU1QuICBPbiB0aGUgZmlyc3QgY2FsbCB0byB0aGlzCisgICBmdW5jdGlvbiwgdGhlIGdsb2JhbCB2YXJpYWJsZSBJTl9TVFJFQU0gaXMgZXhwZWN0ZWQgdG8gYmUgYW4gb3BlbgorICAgc3RyZWFtIGFzc29jaWF0ZWQgd2l0aCB0aGUgaW5wdXQgZmlsZSBJTlBVVF9GSUxFTkFNRS4gIElmIGFsbCBOCisgICBieXRlcyBjYW5ub3QgYmUgcmVhZCBmcm9tIElOX1NUUkVBTSwgY2xvc2UgSU5fU1RSRUFNIGFuZCB1cGRhdGUKKyAgIHRoZSBnbG9iYWwgdmFyaWFibGVzIElOX1NUUkVBTSBhbmQgSU5QVVRfRklMRU5BTUUuICBUaGVuIHRyeSB0bworICAgcmVhZCB0aGUgcmVtYWluaW5nIGJ5dGVzIGZyb20gdGhlIG5ld2x5IG9wZW5lZCBmaWxlLiAgUmVwZWF0IGlmCisgICBuZWNlc3NhcnkgdW50aWwgRU9GIGlzIHJlYWNoZWQgZm9yIHRoZSBsYXN0IGZpbGUgaW4gRklMRV9MSVNULgorICAgT24gc3Vic2VxdWVudCBjYWxscywgZG9uJ3QgbW9kaWZ5IEJMT0NLIGFuZCByZXR1cm4gemVyby4gIFNldAorICAgKk5fQllURVNfSU5fQlVGRkVSIHRvIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4gIElmIGFuIGVycm9yIG9jY3VycywKKyAgIGl0IHdpbGwgYmUgZGV0ZWN0ZWQgdGhyb3VnaCBmZXJyb3Igd2hlbiB0aGUgc3RyZWFtIGlzIGFib3V0IHRvIGJlCisgICBjbG9zZWQuICBJZiB0aGVyZSBpcyBhbiBlcnJvciwgZ2l2ZSBhIG1lc3NhZ2UgYnV0IGNvbnRpbnVlIHJlYWRpbmcKKyAgIGFzIHVzdWFsIGFuZCByZXR1cm4gbm9uemVyby4gIE90aGVyd2lzZSByZXR1cm4gemVyby4gICovCisKKy8qIFNUUklOR1MgbW9kZS4gIEZpbmQgZWFjaCAic3RyaW5nIGNvbnN0YW50IiBpbiB0aGUgaW5wdXQuCisgICBBIHN0cmluZyBjb25zdGFudCBpcyBhIHJ1biBvZiBhdCBsZWFzdCAnc3RyaW5nX21pbicgQVNDSUkKKyAgIGdyYXBoaWMgKG9yIGZvcm1hdHRpbmcpIGNoYXJhY3RlcnMgdGVybWluYXRlZCBieSBhIG51bGwuCisgICBCYXNlZCBvbiBhIGZ1bmN0aW9uIHdyaXR0ZW4gYnkgUmljaGFyZCBTdGFsbG1hbiBmb3IgYQorICAgdHJhZGl0aW9uYWwgdmVyc2lvbiBvZiBvZC4gICovCisKK3N0YXRpYyB2b2lkCitkdW1wX3N0cmluZ3Mob2ZmX3QgYWRkcmVzcywgb2ZmX3QgZW5kX29mZnNldCkKK3sKKwl1bnNpZ25lZCBidWZzaXplID0gTUFYKDEwMCwgc3RyaW5nX21pbik7CisJdW5zaWduZWQgY2hhciAqYnVmID0geG1hbGxvYyhidWZzaXplKTsKKworCXdoaWxlICgxKSB7CisJCXNpemVfdCBpOworCQlpbnQgYzsKKworCQkvKiBTZWUgaWYgdGhlIG5leHQgJ3N0cmluZ19taW4nIGNoYXJzIGFyZSBhbGwgcHJpbnRpbmcgY2hhcnMuICAqLworIHRyeWxpbmU6CisJCWlmICgob3B0aW9uX21hc2szMiAmIE9QVF9OKSAmJiAoZW5kX29mZnNldCAtIHN0cmluZ19taW4gPD0gYWRkcmVzcykpCisJCQlicmVhazsKKwkJaSA9IDA7CisJCXdoaWxlICghKG9wdGlvbl9tYXNrMzIgJiBPUFRfTikgfHwgYWRkcmVzcyA8IGVuZF9vZmZzZXQpIHsKKwkJCWlmIChpID09IGJ1ZnNpemUpIHsKKwkJCQlidWZzaXplICs9IGJ1ZnNpemUvODsKKwkJCQlidWYgPSB4cmVhbGxvYyhidWYsIGJ1ZnNpemUpOworCQkJfQorCisJCQl3aGlsZSAoaW5fc3RyZWFtKSB7IC8qICFFT0YgKi8KKwkJCQljID0gZmdldGMoaW5fc3RyZWFtKTsKKwkJCQlpZiAoYyAhPSBFT0YpCisJCQkJCWdvdG8gZ290X2NoYXI7CisJCQkJY2hlY2tfYW5kX2Nsb3NlKCk7CisJCQkJb3Blbl9uZXh0X2ZpbGUoKTsKKwkJCX0KKwkJCS8qIEVPRiAqLworCQkJZ290byByZXQ7CisgZ290X2NoYXI6CisJCQlhZGRyZXNzKys7CisJCQlpZiAoIWMpCisJCQkJYnJlYWs7CisJCQlpZiAoIUlTUFJJTlQoYykpCisJCQkJZ290byB0cnlsaW5lOwkvKiBJdCBpc24ndDsgZ2l2ZSB1cCBvbiB0aGlzIHN0cmluZy4gICovCisJCQlidWZbaSsrXSA9IGM7CQkvKiBTdHJpbmcgY29udGludWVzOyBzdG9yZSBpdCBhbGwuICAqLworCQl9CisKKwkJaWYgKGkgPCBzdHJpbmdfbWluKQkJLyogVG9vIHNob3J0ISAqLworCQkJZ290byB0cnlsaW5lOworCisJCS8qIElmIHdlIGdldCBoZXJlLCB0aGUgc3RyaW5nIGlzIGFsbCBwcmludGFibGUgYW5kIE5VTC10ZXJtaW5hdGVkICovCisJCWJ1ZltpXSA9IDA7CisJCWZvcm1hdF9hZGRyZXNzKGFkZHJlc3MgLSBpIC0gMSwgJyAnKTsKKworCQlmb3IgKGkgPSAwOyAoYyA9IGJ1ZltpXSk7IGkrKykgeworCQkJc3dpdGNoIChjKSB7CisJCQljYXNlICdcMDA3JzogZnB1dHMoIlxcYSIsIHN0ZG91dCk7IGJyZWFrOworCQkJY2FzZSAnXGInOiBmcHV0cygiXFxiIiwgc3Rkb3V0KTsgYnJlYWs7CisJCQljYXNlICdcZic6IGZwdXRzKCJcXGYiLCBzdGRvdXQpOyBicmVhazsKKwkJCWNhc2UgJ1xuJzogZnB1dHMoIlxcbiIsIHN0ZG91dCk7IGJyZWFrOworCQkJY2FzZSAnXHInOiBmcHV0cygiXFxyIiwgc3Rkb3V0KTsgYnJlYWs7CisJCQljYXNlICdcdCc6IGZwdXRzKCJcXHQiLCBzdGRvdXQpOyBicmVhazsKKwkJCWNhc2UgJ1x2JzogZnB1dHMoIlxcdiIsIHN0ZG91dCk7IGJyZWFrOworCQkJZGVmYXVsdDogcHV0Y2hhcihjKTsKKwkJCX0KKwkJfQorCQlwdXRjaGFyKCdcbicpOworCX0KKworCS8qIFdlIHJlYWNoIHRoaXMgcG9pbnQgb25seSBpZiB3ZSBzZWFyY2ggdGhyb3VnaAorCSAgIChtYXhfYnl0ZXNfdG9fZm9ybWF0IC0gc3RyaW5nX21pbikgYnl0ZXMgYmVmb3JlIHJlYWNoaW5nIEVPRi4gICovCisJY2hlY2tfYW5kX2Nsb3NlKCk7CisgcmV0OgorCWZyZWUoYnVmKTsKK30KKworI2lmIEVOQUJMRV9MT05HX09QVFMKKy8qIElmIFMgaXMgYSB2YWxpZCB0cmFkaXRpb25hbCBvZmZzZXQgc3BlY2lmaWNhdGlvbiB3aXRoIGFuIG9wdGlvbmFsCisgICBsZWFkaW5nICcrJyByZXR1cm4gbm9uemVybyBhbmQgc2V0ICpPRkZTRVQgdG8gdGhlIG9mZnNldCBpdCBkZW5vdGVzLiAgKi8KKworc3RhdGljIGludAorcGFyc2Vfb2xkX29mZnNldChjb25zdCBjaGFyICpzLCBvZmZfdCAqb2Zmc2V0KQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgQmJbXSA9IHsKKwkJeyAiQiIsIDEwMjQgfSwKKwkJeyAiYiIsIDUxMiB9LAorCQl7ICIiLCAwIH0KKwl9OworCWNoYXIgKnA7CisJaW50IHJhZGl4OworCisJLyogU2tpcCBvdmVyIGFueSBsZWFkaW5nICcrJy4gKi8KKwlpZiAoc1swXSA9PSAnKycpICsrczsKKwlpZiAoIWlzZGlnaXQoc1swXSkpIHJldHVybiAwOyAvKiBub3QgYSBudW1iZXIgKi8KKworCS8qIERldGVybWluZSB0aGUgcmFkaXggd2UnbGwgdXNlIHRvIGludGVycHJldCBTLiAgSWYgdGhlcmUgaXMgYSAnLicsCisJICogaXQncyBkZWNpbWFsLCBvdGhlcndpc2UsIGlmIHRoZSBzdHJpbmcgYmVnaW5zIHdpdGggJzBYJ29yICcweCcsCisJICogaXQncyBoZXhhZGVjaW1hbCwgZWxzZSBvY3RhbC4gICovCisJcCA9IHN0cmNocihzLCAnLicpOworCXJhZGl4ID0gODsKKwlpZiAocCkgeworCQlwWzBdID0gJ1wwJzsgLyogY2hlYXRpbmcgKi8KKwkJcmFkaXggPSAxMDsKKwl9IGVsc2UgaWYgKHNbMF0gPT0gJzAnICYmIChzWzFdID09ICd4JyB8fCBzWzFdID09ICdYJykpCisJCXJhZGl4ID0gMTY7CisKKwkqb2Zmc2V0ID0geHN0cnRvb2ZmX3NmeChzLCByYWRpeCwgQmIpOworCWlmIChwKSBwWzBdID0gJy4nOworCisJcmV0dXJuICgqb2Zmc2V0ID49IDApOworfQorI2VuZGlmCisKK2ludCBvZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgb2RfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworI2lmIEVOQUJMRV9MT05HX09QVFMKKwlzdGF0aWMgY29uc3QgY2hhciBvZF9sb25nb3B0c1tdIEFMSUdOMSA9CisJCSJza2lwLWJ5dGVzXDAiICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiaiIKKwkJImFkZHJlc3MtcmFkaXhcMCIgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJBIgorCQkicmVhZC1ieXRlc1wwIiAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIk4iCisJCSJmb3JtYXRcMCIgICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAidCIKKwkJIm91dHB1dC1kdXBsaWNhdGVzXDAiIE5vX2FyZ3VtZW50ICAgICAgICJ2IgorCQkvKiBZZXMsIGl0J3MgdHJ1ZTogLVMgTlVNLCBidXQgLS1zdHJpbmdzWz1OVU1dIQorCQkgKiB0aGF0IGlzLCBOVU0gaXMgbWFuZGF0b3J5IGZvciAtUyBidXQgb3B0aW9uYWwgZm9yIC0tc3RyaW5ncyEKKwkJICovCisJCSJzdHJpbmdzXDAiICAgICAgICAgICBPcHRpb25hbF9hcmd1bWVudCAiUyIKKwkJIndpZHRoXDAiICAgICAgICAgICAgIE9wdGlvbmFsX2FyZ3VtZW50ICJ3IgorCQkidHJhZGl0aW9uYWxcMCIgICAgICAgTm9fYXJndW1lbnQgICAgICAgIlx4ZmYiCisJCTsKKyNlbmRpZgorCWNvbnN0IGNoYXIgKnN0cl9BLCAqc3RyX04sICpzdHJfaiwgKnN0cl9TID0gIjMiOworCWxsaXN0X3QgKmxzdF90ID0gTlVMTDsKKwl1bnNpZ25lZCBvcHQ7CisJaW50IGxfY19tOworCS8qIFRoZSBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgdG8gc2tpcCBiZWZvcmUgZm9ybWF0dGluZyBhbmQgd3JpdGluZy4gICovCisJb2ZmX3Qgbl9ieXRlc190b19za2lwID0gMDsKKwkvKiBUaGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBieXRlIGFmdGVyIHRoZSBsYXN0IGJ5dGUgdG8gYmUgZm9ybWF0dGVkLiAgKi8KKwlvZmZfdCBlbmRfb2Zmc2V0ID0gMDsKKwkvKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3aWxsIGJlIGZvcm1hdHRlZC4gICovCisJb2ZmX3QgbWF4X2J5dGVzX3RvX2Zvcm1hdCA9IDA7CisKKwlzcGVjID0gTlVMTDsKKwlmb3JtYXRfYWRkcmVzcyA9IGZvcm1hdF9hZGRyZXNzX3N0ZDsKKwlhZGRyZXNzX2Jhc2VfY2hhciA9ICdvJzsKKwlhZGRyZXNzX3BhZF9sZW5fY2hhciA9ICc3JzsKKworCS8qIFBhcnNlIGNvbW1hbmQgbGluZSAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIncrOnQ6OiI7IC8qIC13IE4sIC10IGlzIGEgbGlzdCAqLworI2lmIEVOQUJMRV9MT05HX09QVFMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gb2RfbG9uZ29wdHM7CisjZW5kaWYKKwlvcHQgPSBPRF9HRVRPUFQzMigpOworCWFyZ3YgKz0gb3B0aW5kOworCWlmIChvcHQgJiBPUFRfQSkgeworCQlzdGF0aWMgY29uc3QgY2hhciBkb3huW10gQUxJR04xID0gImRveG4iOworCQlzdGF0aWMgY29uc3QgY2hhciBkb3huX2FkZHJlc3NfYmFzZV9jaGFyW10gQUxJR04xID0geworCQkJJ3UnLCAnbycsICd4JywgLyogJz8nIGZvdXJ0aCBvbmUgaXMgbm90IGltcG9ydGFudCAqLworCQl9OworCQlzdGF0aWMgY29uc3QgdWludDhfdCBkb3huX2FkZHJlc3NfcGFkX2xlbl9jaGFyW10gQUxJR04xID0geworCQkJJzcnLCAnNycsICc2JywgLyogJz8nICovCisJCX07CisJCWNoYXIgKnA7CisJCWludCBwb3M7CisJCXAgPSBzdHJjaHIoZG94biwgc3RyX0FbMF0pOworCQlpZiAoIXApCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIG91dHB1dCBhZGRyZXNzIHJhZGl4ICIKKwkJCQkiJyVjJyAobXVzdCBiZSBbZG94bl0pIiwgc3RyX0FbMF0pOworCQlwb3MgPSBwIC0gZG94bjsKKwkJaWYgKHBvcyA9PSAzKSBmb3JtYXRfYWRkcmVzcyA9IGZvcm1hdF9hZGRyZXNzX25vbmU7CisJCWFkZHJlc3NfYmFzZV9jaGFyID0gZG94bl9hZGRyZXNzX2Jhc2VfY2hhcltwb3NdOworCQlhZGRyZXNzX3BhZF9sZW5fY2hhciA9IGRveG5fYWRkcmVzc19wYWRfbGVuX2NoYXJbcG9zXTsKKwl9CisJaWYgKG9wdCAmIE9QVF9OKSB7CisJCW1heF9ieXRlc190b19mb3JtYXQgPSB4c3RydG9vZmZfc2Z4KHN0cl9OLCAwLCBia21fc3VmZml4ZXMpOworCX0KKwlpZiAob3B0ICYgT1BUX2EpIGRlY29kZV9mb3JtYXRfc3RyaW5nKCJhIik7CisJaWYgKG9wdCAmIE9QVF9iKSBkZWNvZGVfZm9ybWF0X3N0cmluZygib0MiKTsKKwlpZiAob3B0ICYgT1BUX2MpIGRlY29kZV9mb3JtYXRfc3RyaW5nKCJjIik7CisJaWYgKG9wdCAmIE9QVF9kKSBkZWNvZGVfZm9ybWF0X3N0cmluZygidTIiKTsKKwlpZiAob3B0ICYgT1BUX2YpIGRlY29kZV9mb3JtYXRfc3RyaW5nKCJmRiIpOworCWlmIChvcHQgJiBPUFRfaCkgZGVjb2RlX2Zvcm1hdF9zdHJpbmcoIngyIik7CisJaWYgKG9wdCAmIE9QVF9pKSBkZWNvZGVfZm9ybWF0X3N0cmluZygiZDIiKTsKKwlpZiAob3B0ICYgT1BUX2opIG5fYnl0ZXNfdG9fc2tpcCA9IHhzdHJ0b29mZl9zZngoc3RyX2osIDAsIGJrbV9zdWZmaXhlcyk7CisJaWYgKG9wdCAmIE9QVF9sKSBkZWNvZGVfZm9ybWF0X3N0cmluZygiZDQiKTsKKwlpZiAob3B0ICYgT1BUX28pIGRlY29kZV9mb3JtYXRfc3RyaW5nKCJvMiIpOworCXdoaWxlIChsc3RfdCkgeworCQlkZWNvZGVfZm9ybWF0X3N0cmluZyhsbGlzdF9wb3AoJmxzdF90KSk7CisJfQorCWlmIChvcHQgJiBPUFRfeCkgZGVjb2RlX2Zvcm1hdF9zdHJpbmcoIngyIik7CisJaWYgKG9wdCAmIE9QVF9zKSBkZWNvZGVfZm9ybWF0X3N0cmluZygiZDIiKTsKKwlpZiAob3B0ICYgT1BUX1MpIHsKKwkJc3RyaW5nX21pbiA9IHhzdHJ0b3Vfc2Z4KHN0cl9TLCAwLCBia21fc3VmZml4ZXMpOworCX0KKworCS8vIEJsb2F0OgorCS8vaWYgKChvcHRpb25fbWFzazMyICYgT1BUX1MpICYmIG5fc3BlY3MgPiAwKQorCS8vCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyB0eXBlIG1heSBiZSBzcGVjaWZpZWQgd2hlbiBkdW1waW5nIHN0cmluZ3MiKTsKKworCS8qIElmIHRoZSAtLXRyYWRpdGlvbmFsIG9wdGlvbiBpcyB1c2VkLCB0aGVyZSBtYXkgYmUgZnJvbQorCSAqIDAgdG8gMyByZW1haW5pbmcgY29tbWFuZCBsaW5lIGFyZ3VtZW50czsgIGhhbmRsZSBlYWNoIGNhc2UKKwkgKiBzZXBhcmF0ZWx5LgorCSAqIG9kIFtGSUxFXSBbWytdT0ZGU0VUWy5dW2JdIFtbK11MQUJFTFsuXVtiXV1dCisJICogVGhlIG9mZnNldCBhbmQgcHNldWRvX3N0YXJ0IGhhdmUgdGhlIHNhbWUgc3ludGF4LgorCSAqCisJICogRklYTUU6IFBPU0lYIDEwMDMuMS0yMDAxIHdpdGggWFNJIHJlcXVpcmVzIHN1cHBvcnQgZm9yIHRoZQorCSAqIHRyYWRpdGlvbmFsIHN5bnRheCBldmVuIGlmIC0tdHJhZGl0aW9uYWwgaXMgbm90IGdpdmVuLiAgKi8KKworI2lmIEVOQUJMRV9MT05HX09QVFMKKwlpZiAob3B0ICYgT1BUX3RyYWRpdGlvbmFsKSB7CisJCWlmIChhcmd2WzBdKSB7CisJCQlvZmZfdCBwc2V1ZG9fc3RhcnQgPSAtMTsKKwkJCW9mZl90IG8xLCBvMjsKKworCQkJaWYgKCFhcmd2WzFdKSB7IC8qIG9uZSBhcmcgKi8KKwkJCQlpZiAocGFyc2Vfb2xkX29mZnNldChhcmd2WzBdLCAmbzEpKSB7CisJCQkJCS8qIG9kIC0tdHJhZGl0aW9uYWwgT0ZGU0VUICovCisJCQkJCW5fYnl0ZXNfdG9fc2tpcCA9IG8xOworCQkJCQlhcmd2Kys7CisJCQkJfQorCQkJCS8qIG9kIC0tdHJhZGl0aW9uYWwgRklMRSAqLworCQkJfSBlbHNlIGlmICghYXJndlsyXSkgeyAvKiB0d28gYXJncyAqLworCQkJCWlmIChwYXJzZV9vbGRfb2Zmc2V0KGFyZ3ZbMF0sICZvMSkKKwkJCQkgJiYgcGFyc2Vfb2xkX29mZnNldChhcmd2WzFdLCAmbzIpCisJCQkJKSB7CisJCQkJCS8qIG9kIC0tdHJhZGl0aW9uYWwgT0ZGU0VUIExBQkVMICovCisJCQkJCW5fYnl0ZXNfdG9fc2tpcCA9IG8xOworCQkJCQlwc2V1ZG9fc3RhcnQgPSBvMjsKKwkJCQkJYXJndiArPSAyOworCQkJCX0gZWxzZSBpZiAocGFyc2Vfb2xkX29mZnNldChhcmd2WzFdLCAmbzIpKSB7CisJCQkJCS8qIG9kIC0tdHJhZGl0aW9uYWwgRklMRSBPRkZTRVQgKi8KKwkJCQkJbl9ieXRlc190b19za2lwID0gbzI7CisJCQkJCWFyZ3ZbMV0gPSBOVUxMOworCQkJCX0gZWxzZSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIHNlY29uZCBhcmd1bWVudCAnJXMnIiwgYXJndlsxXSk7CisJCQkJfQorCQkJfSBlbHNlIGlmICghYXJndlszXSkgeyAvKiB0aHJlZSBhcmdzICovCisJCQkJaWYgKHBhcnNlX29sZF9vZmZzZXQoYXJndlsxXSwgJm8xKQorCQkJCSAmJiBwYXJzZV9vbGRfb2Zmc2V0KGFyZ3ZbMl0sICZvMikKKwkJCQkpIHsKKwkJCQkJLyogb2QgLS10cmFkaXRpb25hbCBGSUxFIE9GRlNFVCBMQUJFTCAqLworCQkJCQluX2J5dGVzX3RvX3NraXAgPSBvMTsKKwkJCQkJcHNldWRvX3N0YXJ0ID0gbzI7CisJCQkJCWFyZ3ZbMV0gPSBOVUxMOworCQkJCX0gZWxzZSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0aGUgbGFzdCB0d28gYXJndW1lbnRzIG11c3QgYmUgb2Zmc2V0cyIpOworCQkJCX0KKwkJCX0gZWxzZSB7IC8qID4zIGFyZ3MgKi8KKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidG9vIG1hbnkgYXJndW1lbnRzIik7CisJCQl9CisKKwkJCWlmIChwc2V1ZG9fc3RhcnQgPj0gMCkgeworCQkJCWlmIChmb3JtYXRfYWRkcmVzcyA9PSBmb3JtYXRfYWRkcmVzc19ub25lKSB7CisJCQkJCWFkZHJlc3NfYmFzZV9jaGFyID0gJ28nOworCQkJCQlhZGRyZXNzX3BhZF9sZW5fY2hhciA9ICc3JzsKKwkJCQkJZm9ybWF0X2FkZHJlc3MgPSBmb3JtYXRfYWRkcmVzc19wYXJlbjsKKwkJCQl9IGVsc2UgeworCQkJCQlmb3JtYXRfYWRkcmVzcyA9IGZvcm1hdF9hZGRyZXNzX2xhYmVsOworCQkJCX0KKwkJCQlwc2V1ZG9fb2Zmc2V0ID0gcHNldWRvX3N0YXJ0IC0gbl9ieXRlc190b19za2lwOworCQkJfQorCQl9CisJCS8qIGVsc2U6IG9kIC0tdHJhZGl0aW9uYWwgKHdpdGhvdXQgYXJncykgKi8KKwl9CisjZW5kaWYKKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX04pIHsKKwkJZW5kX29mZnNldCA9IG5fYnl0ZXNfdG9fc2tpcCArIG1heF9ieXRlc190b19mb3JtYXQ7CisJCWlmIChlbmRfb2Zmc2V0IDwgbl9ieXRlc190b19za2lwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIlNLSVAgKyBTSVpFIGlzIHRvbyBsYXJnZSIpOworCX0KKworCWlmIChuX3NwZWNzID09IDApIHsKKwkJZGVjb2RlX2Zvcm1hdF9zdHJpbmcoIm8yIik7CisJCS8qbl9zcGVjcyA9IDE7IC0gZG9uZSBieSBkZWNvZGVfZm9ybWF0X3N0cmluZyAqLworCX0KKworCS8qIElmIG5vIGZpbGVzIHdlcmUgbGlzdGVkIG9uIHRoZSBjb21tYW5kIGxpbmUsCisJICAgc2V0IHRoZSBnbG9iYWwgcG9pbnRlciBGSUxFX0xJU1Qgc28gdGhhdCBpdAorCSAgIHJlZmVyZW5jZXMgdGhlIG51bGwtdGVybWluYXRlZCBsaXN0IG9mIG9uZSBuYW1lOiAiLSIuICAqLworCWZpbGVfbGlzdCA9IGJiX2FyZ3ZfZGFzaDsKKwlpZiAoYXJndlswXSkgeworCQkvKiBTZXQgdGhlIGdsb2JhbCBwb2ludGVyIEZJTEVfTElTVCBzbyB0aGF0IGl0CisJCSAgIHJlZmVyZW5jZXMgdGhlIGZpcnN0IGZpbGUtYXJndW1lbnQgb24gdGhlIGNvbW1hbmQtbGluZS4gICovCisJCWZpbGVfbGlzdCA9IChjaGFyIGNvbnN0ICpjb25zdCAqKSBhcmd2OworCX0KKworCS8qIE9wZW4gdGhlIGZpcnN0IGlucHV0IGZpbGUgKi8KKwlvcGVuX25leHRfZmlsZSgpOworCS8qIFNraXAgb3ZlciBhbnkgdW53YW50ZWQgaGVhZGVyIGJ5dGVzICovCisJc2tpcChuX2J5dGVzX3RvX3NraXApOworCWlmICghaW5fc3RyZWFtKQorCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCisJLyogQ29tcHV0ZSBvdXRwdXQgYmxvY2sgbGVuZ3RoICovCisJbF9jX20gPSBnZXRfbGNtKCk7CisKKwlpZiAob3B0ICYgT1BUX3cpIHsgLyogLXc6IHdpZHRoICovCisJCWlmICghYnl0ZXNfcGVyX2Jsb2NrIHx8IGJ5dGVzX3Blcl9ibG9jayAlIGxfY19tICE9IDApIHsKKwkJCWJiX2Vycm9yX21zZygid2FybmluZzogaW52YWxpZCB3aWR0aCAldTsgdXNpbmcgJWQgaW5zdGVhZCIsCisJCQkJCSh1bnNpZ25lZClieXRlc19wZXJfYmxvY2ssIGxfY19tKTsKKwkJCWJ5dGVzX3Blcl9ibG9jayA9IGxfY19tOworCQl9CisJfSBlbHNlIHsKKwkJYnl0ZXNfcGVyX2Jsb2NrID0gbF9jX207CisJCWlmIChsX2NfbSA8IERFRkFVTFRfQllURVNfUEVSX0JMT0NLKQorCQkJYnl0ZXNfcGVyX2Jsb2NrICo9IERFRkFVTFRfQllURVNfUEVSX0JMT0NLIC8gbF9jX207CisJfQorCisjaWZkZWYgREVCVUcKKwlmb3IgKGkgPSAwOyBpIDwgbl9zcGVjczsgaSsrKSB7CisJCXByaW50ZigiJWQ6IGZtdD1cIiVzXCIgd2lkdGg9JWRcbiIsCisJCQlpLCBzcGVjW2ldLmZtdF9zdHJpbmcsIHdpZHRoX2J5dGVzW3NwZWNbaV0uc2l6ZV0pOworCX0KKyNlbmRpZgorCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfUykKKwkJZHVtcF9zdHJpbmdzKG5fYnl0ZXNfdG9fc2tpcCwgZW5kX29mZnNldCk7CisJZWxzZQorCQlkdW1wKG5fYnl0ZXNfdG9fc2tpcCwgZW5kX29mZnNldCk7CisKKwlpZiAoZmNsb3NlKHN0ZGluKSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKGJiX21zZ19zdGFuZGFyZF9pbnB1dCk7CisKKwlyZXR1cm4gZXhpdF9jb2RlOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3ByaW50ZW52LmMgYi9jb3JldXRpbHMvcHJpbnRlbnYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDVkYjcwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL3ByaW50ZW52LmMKQEAgLTAsMCArMSw1MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcHJpbnRlbnYgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA1IGJ5IE1pa2UgRnJ5c2luZ2VyIDx2YXBpZXJAZ2VudG9vLm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBwcmludGVudl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW1ZBUklBQkxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBwcmludGVudl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IGVudmlyb25tZW50IFZBUklBQkxFcy5cbiIKKy8vdXNhZ2U6ICAgICAgICJJZiBubyBWQVJJQUJMRSBzcGVjaWZpZWQsIHByaW50IGFsbC4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitpbnQgcHJpbnRlbnZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHByaW50ZW52X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgZXhpdF9jb2RlID0gRVhJVF9TVUNDRVNTOworCisJLyogbm8gdmFyaWFibGVzIHNwZWNpZmllZCwgc2hvdyB3aG9sZSBlbnYgKi8KKwlpZiAoIWFyZ3ZbMV0pIHsKKwkJY2hhciAqKmUgPSBlbnZpcm9uOworCisJCS8qIGVudmlyb24gY2FuIGJlIE5VTEwhIChmb3IgZXhhbXBsZSwgYWZ0ZXIgY2xlYXJlbnYoKSkKKwkJICogQ2hlY2sgZm9yIHRoYXQ6CisJCSAqLworCQlpZiAoZSkKKwkJCXdoaWxlICgqZSkKKwkJCQlwdXRzKCplKyspOworCX0gZWxzZSB7CisJCS8qIHNlYXJjaCBmb3Igc3BlY2lmaWVkIHZhcmlhYmxlcyBhbmQgcHJpbnQgdGhlbSBvdXQgaWYgZm91bmQgKi8KKwkJY2hhciAqYXJnLCAqZW52OworCisJCXdoaWxlICgoYXJnID0gKisrYXJndikgIT0gTlVMTCkgeworCQkJZW52ID0gZ2V0ZW52KGFyZyk7CisJCQlpZiAoZW52KQorCQkJCXB1dHMoZW52KTsKKwkJCWVsc2UKKwkJCQlleGl0X2NvZGUgPSBFWElUX0ZBSUxVUkU7CisJCX0KKwl9CisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KGV4aXRfY29kZSk7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvcHJpbnRmLmMgYi9jb3JldXRpbHMvcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RkNDNhOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9wcmludGYuYwpAQCAtMCwwICsxLDQyOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBwcmludGYgLSBmb3JtYXQgYW5kIHByaW50IGRhdGEKKworICAgQ29weXJpZ2h0IDE5OTkgRGF2ZSBDaW5lZ2UKKyAgIFBvcnRpb25zIGNvcHlyaWdodCAoQykgMTk5MC0xOTk2IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorKi8KKworLyogVXNhZ2U6IHByaW50ZiBmb3JtYXQgW2FyZ3VtZW50Li4uXQorCisgICBBIGZyb250IGVuZCB0byB0aGUgcHJpbnRmIGZ1bmN0aW9uIHRoYXQgbGV0cyBpdCBiZSB1c2VkIGZyb20gdGhlIHNoZWxsLgorCisgICBCYWNrc2xhc2ggZXNjYXBlczoKKworICAgXCIgPSBkb3VibGUgcXVvdGUKKyAgIFxcID0gYmFja3NsYXNoCisgICBcYSA9IGFsZXJ0IChiZWxsKQorICAgXGIgPSBiYWNrc3BhY2UKKyAgIFxjID0gcHJvZHVjZSBubyBmdXJ0aGVyIG91dHB1dAorICAgXGYgPSBmb3JtIGZlZWQKKyAgIFxuID0gbmV3IGxpbmUKKyAgIFxyID0gY2FycmlhZ2UgcmV0dXJuCisgICBcdCA9IGhvcml6b250YWwgdGFiCisgICBcdiA9IHZlcnRpY2FsIHRhYgorICAgXDBvb28gPSBvY3RhbCBudW1iZXIgKG9vbyBpcyAwIHRvIDMgZGlnaXRzKQorICAgXHhoaGggPSBoZXhhZGVjaW1hbCBudW1iZXIgKGhoaCBpcyAxIHRvIDMgZGlnaXRzKQorCisgICBBZGRpdGlvbmFsIGRpcmVjdGl2ZToKKworICAgJWIgPSBwcmludCBhbiBhcmd1bWVudCBzdHJpbmcsIGludGVycHJldGluZyBiYWNrc2xhc2ggZXNjYXBlcworCisgICBUaGUgJ2Zvcm1hdCcgYXJndW1lbnQgaXMgcmUtdXNlZCBhcyBtYW55IHRpbWVzIGFzIG5lY2Vzc2FyeQorICAgdG8gY29udmVydCBhbGwgb2YgdGhlIGdpdmVuIGFyZ3VtZW50cy4KKworICAgRGF2aWQgTWFjS2VuemllIDxkam1AZ251LmFpLm1pdC5lZHU+CisqLworCisvKiAxOTk5MDUwOCBCdXN5IEJveGVkISBEYXZlIENpbmVnZSAqLworCisvL3VzYWdlOiNkZWZpbmUgcHJpbnRmX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJGT1JNQVQgW0FSR10uLi4iCisvL3VzYWdlOiNkZWZpbmUgcHJpbnRmX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRm9ybWF0IGFuZCBwcmludCBBUkcocykgYWNjb3JkaW5nIHRvIEZPUk1BVCAoYS1sYSBDIHByaW50ZikiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHByaW50Zl9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBwcmludGYgXCJWYWw9JWRcXG5cIiA1XG4iCisvL3VzYWdlOiAgICAgICAiVmFsPTVcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIEEgbm90ZSBvbiBiYWQgaW5wdXQ6IG5laXRoZXIgYmFzaCAzLjIgbm9yIGNvcmV1dGlscyA2LjEwIHN0b3Agb24gaXQuCisgKiBUaGV5IHJlcG9ydCBpdDoKKyAqICBiYXNoOiBwcmludGY6IFhYWDogaW52YWxpZCBudW1iZXIKKyAqICBwcmludGY6IFhYWDogZXhwZWN0ZWQgYSBudW1lcmljIHZhbHVlCisgKiAgYmFzaDogcHJpbnRmOiAxMjNYWFg6IGludmFsaWQgbnVtYmVyCisgKiAgcHJpbnRmOiAxMjNYWFg6IHZhbHVlIG5vdCBjb21wbGV0ZWx5IGNvbnZlcnRlZAorICogYnV0IHRoZW4gdGhleSB1c2UgMCAob3IgcGFydGlhbGx5IGNvbnZlcnRlZCBudW1lcmljIHByZWZpeCkgYXMgYSB2YWx1ZQorICogYW5kIGNvbnRpbnVlLiBUaGV5IGV4aXQgd2l0aCAxIGluIHRoaXMgY2FzZS4KKyAqIEJvdGggYWNjZXB0IGluc2FuZSBmaWVsZCB3aWR0aC9wcmVjaXNpb24gKGUuZy4gJTk5OTk5OTk5OTkuOTk5OTk5OTk5OWQpLgorICogQm90aCBwcmludCBlcnJvciBtZXNzYWdlIGFuZCBhc3N1bWUgMCBpZiAlKi4qZiB3aWR0aC9wcmVjaXNpb24gaXMgImJhZCIKKyAqICAoYnV0IG5lZ2F0aXZlIG51bWJlcnMgYXJlIG5vdCAiYmFkIikuCisgKiBCb3RoIGFjY2VwdCBuZWdhdGl2ZSBudW1iZXJzIGZvciAldSBzcGVjaWZpZXIuCisgKgorICogV2UgdHJ5IHRvIGJlIGNvbXBhdGlibGUuCisgKi8KKwordHlwZWRlZiB2b2lkIEZBU1RfRlVOQyAoKmNvbnZlcnRlcikoY29uc3QgY2hhciAqYXJnLCB2b2lkICpyZXN1bHQpOworCitzdGF0aWMgaW50IG11bHRpY29udmVydChjb25zdCBjaGFyICphcmcsIHZvaWQgKnJlc3VsdCwgY29udmVydGVyIGNvbnZlcnQpCit7CisJaWYgKCphcmcgPT0gJyInIHx8ICphcmcgPT0gJ1wnJykgeworCQlhcmcgPSB1dG9hKCh1bnNpZ25lZCBjaGFyKWFyZ1sxXSk7CisJfQorCWVycm5vID0gMDsKKwljb252ZXJ0KGFyZywgcmVzdWx0KTsKKwlpZiAoZXJybm8pIHsKKwkJYmJfZXJyb3JfbXNnKCJpbnZhbGlkIG51bWJlciAnJXMnIiwgYXJnKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY29udl9zdHJ0b3VsbChjb25zdCBjaGFyICphcmcsIHZvaWQgKnJlc3VsdCkKK3sKKwkqKHVuc2lnbmVkIGxvbmcgbG9uZyopcmVzdWx0ID0gYmJfc3RydG91bGwoYXJnLCBOVUxMLCAwKTsKKwkvKiBib3RoIGNvcmV1dGlscyA2LjEwIGFuZCBiYXNoIDMuMjoKKwkgKiAkIHByaW50ZiAnJXhcbicgLTIKKwkgKiBmZmZmZmZmZmZmZmZmZmZlCisJICogTWltaWMgdGhhdDoKKwkgKi8KKwlpZiAoZXJybm8pIHsKKwkJKih1bnNpZ25lZCBsb25nIGxvbmcqKXJlc3VsdCA9IGJiX3N0cnRvbGwoYXJnLCBOVUxMLCAwKTsKKwl9Cit9CitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY29udl9zdHJ0b2xsKGNvbnN0IGNoYXIgKmFyZywgdm9pZCAqcmVzdWx0KQoreworCSoobG9uZyBsb25nKilyZXN1bHQgPSBiYl9zdHJ0b2xsKGFyZywgTlVMTCwgMCk7Cit9CitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY29udl9zdHJ0b2QoY29uc3QgY2hhciAqYXJnLCB2b2lkICpyZXN1bHQpCit7CisJY2hhciAqZW5kOworCS8qIFdlbGwsIHRoaXMgb25lIGFsbG93cyBsZWFkaW5nIHdoaXRlc3BhY2UuLi4gc28gd2hhdD8gKi8KKwkvKiBXaGF0IEkgbGlrZSBtdWNoIGxlc3MgaXMgdGhhdCAiLSIgYWNjZXB0ZWQgdG9vISA6KCAqLworCSooZG91YmxlKilyZXN1bHQgPSBzdHJ0b2QoYXJnLCAmZW5kKTsKKwlpZiAoZW5kWzBdKSB7CisJCWVycm5vID0gRVJBTkdFOworCQkqKGRvdWJsZSopcmVzdWx0ID0gMDsKKwl9Cit9CisKKy8qIENhbGxlcnMgc2hvdWxkIGNoZWNrIGVycm5vIHRvIGRldGVjdCBlcnJvcnMgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgbXlfeHN0cnRvdWxsKGNvbnN0IGNoYXIgKmFyZykKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgcmVzdWx0OworCWlmIChtdWx0aWNvbnZlcnQoYXJnLCAmcmVzdWx0LCBjb252X3N0cnRvdWxsKSkKKwkJcmVzdWx0ID0gMDsKKwlyZXR1cm4gcmVzdWx0OworfQorc3RhdGljIGxvbmcgbG9uZyBteV94c3RydG9sbChjb25zdCBjaGFyICphcmcpCit7CisJbG9uZyBsb25nIHJlc3VsdDsKKwlpZiAobXVsdGljb252ZXJ0KGFyZywgJnJlc3VsdCwgY29udl9zdHJ0b2xsKSkKKwkJcmVzdWx0ID0gMDsKKwlyZXR1cm4gcmVzdWx0OworfQorc3RhdGljIGRvdWJsZSBteV94c3RydG9kKGNvbnN0IGNoYXIgKmFyZykKK3sKKwlkb3VibGUgcmVzdWx0OworCW11bHRpY29udmVydChhcmcsICZyZXN1bHQsIGNvbnZfc3RydG9kKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBIYW5kbGVzICViICovCitzdGF0aWMgdm9pZCBwcmludF9lc2Nfc3RyaW5nKGNvbnN0IGNoYXIgKnN0cikKK3sKKwljaGFyIGM7CisJd2hpbGUgKChjID0gKnN0cikgIT0gJ1wwJykgeworCQlzdHIrKzsKKwkJaWYgKGMgPT0gJ1xcJykgeworCQkJLyogJWIgYWxzbyBhY2NlcHRzIDQtZGlnaXQgb2N0YWxzIG9mIHRoZSBmb3JtIFwwIyMjICovCisJCQlpZiAoKnN0ciA9PSAnMCcpIHsKKwkJCQlpZiAoKHVuc2lnbmVkIGNoYXIpKHN0clsxXSAtICcwJykgPCA4KSB7CisJCQkJCS8qIDJuZCBjaGFyIGlzIDAuLjc6IHNraXAgbGVhZGluZyAnMCcgKi8KKwkJCQkJc3RyKys7CisJCQkJfQorCQkJfQorCQkJeworCQkJCS8qIG9wdGltaXphdGlvbjogZG9uJ3QgZm9yY2UgYXJnIHRvIGJlIG9uLXN0YWNrLAorCQkJCSAqIHVzZSBhbm90aGVyIHZhcmlhYmxlIGZvciB0aGF0LiAqLworCQkJCWNvbnN0IGNoYXIgKnogPSBzdHI7CisJCQkJYyA9IGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlKCZ6KTsKKwkJCQlzdHIgPSB6OworCQkJfQorCQl9CisJCXB1dGNoYXIoYyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcmludF9kaXJlYyhjaGFyICpmb3JtYXQsIHVuc2lnbmVkIGZtdF9sZW5ndGgsCisJCWludCBmaWVsZF93aWR0aCwgaW50IHByZWNpc2lvbiwKKwkJY29uc3QgY2hhciAqYXJndW1lbnQpCit7CisJbG9uZyBsb25nIGxsdjsKKwlkb3VibGUgZHY7CisJY2hhciBzYXZlZDsKKwljaGFyICpoYXZlX3ByZWMsICpoYXZlX3dpZHRoOworCisJc2F2ZWQgPSBmb3JtYXRbZm10X2xlbmd0aF07CisJZm9ybWF0W2ZtdF9sZW5ndGhdID0gJ1wwJzsKKworCWhhdmVfcHJlYyA9IHN0cnN0cihmb3JtYXQsICIuKiIpOworCWhhdmVfd2lkdGggPSBzdHJjaHIoZm9ybWF0LCAnKicpOworCWlmIChoYXZlX3dpZHRoIC0gMSA9PSBoYXZlX3ByZWMpCisJCWhhdmVfd2lkdGggPSBOVUxMOworCisJZXJybm8gPSAwOworCisJc3dpdGNoIChmb3JtYXRbZm10X2xlbmd0aCAtIDFdKSB7CisJY2FzZSAnYyc6CisJCXByaW50Zihmb3JtYXQsICphcmd1bWVudCk7CisJCWJyZWFrOworCWNhc2UgJ2QnOgorCWNhc2UgJ2knOgorCQlsbHYgPSBteV94c3RydG9sbChhcmd1bWVudCk7CisgcHJpbnRfbG9uZzoKKwkJaWYgKCFoYXZlX3dpZHRoKSB7CisJCQlpZiAoIWhhdmVfcHJlYykKKwkJCQlwcmludGYoZm9ybWF0LCBsbHYpOworCQkJZWxzZQorCQkJCXByaW50Zihmb3JtYXQsIHByZWNpc2lvbiwgbGx2KTsKKwkJfSBlbHNlIHsKKwkJCWlmICghaGF2ZV9wcmVjKQorCQkJCXByaW50Zihmb3JtYXQsIGZpZWxkX3dpZHRoLCBsbHYpOworCQkJZWxzZQorCQkJCXByaW50Zihmb3JtYXQsIGZpZWxkX3dpZHRoLCBwcmVjaXNpb24sIGxsdik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAnbyc6CisJY2FzZSAndSc6CisJY2FzZSAneCc6CisJY2FzZSAnWCc6CisJCWxsdiA9IG15X3hzdHJ0b3VsbChhcmd1bWVudCk7CisJCS8qIGNoZWF0OiB1bnNpZ25lZCBsb25nIGFuZCBsb25nIGhhdmUgc2FtZSB3aWR0aCwgc28uLi4gKi8KKwkJZ290byBwcmludF9sb25nOworCWNhc2UgJ3MnOgorCQkvKiBBcmUgY2hhciogYW5kIGxvbmcgbG9uZyB0aGUgc2FtZT8gKi8KKwkJaWYgKHNpemVvZihhcmd1bWVudCkgPT0gc2l6ZW9mKGxsdikpIHsKKwkJCWxsdiA9IChsb25nIGxvbmcpKHB0cmRpZmZfdClhcmd1bWVudDsKKwkJCWdvdG8gcHJpbnRfbG9uZzsKKwkJfSBlbHNlIHsKKwkJCS8qIEhvcGUgY29tcGlsZXIgd2lsbCBvcHRpbWl6ZSBpdCBvdXQgYnkgbW92aW5nIGNhbGwKKwkJCSAqIGluc3RydWN0aW9uIGFmdGVyIHRoZSBpZnMuLi4gKi8KKwkJCWlmICghaGF2ZV93aWR0aCkgeworCQkJCWlmICghaGF2ZV9wcmVjKQorCQkJCQlwcmludGYoZm9ybWF0LCBhcmd1bWVudCwgLyp1bnVzZWQ6Ki8gYXJndW1lbnQsIGFyZ3VtZW50KTsKKwkJCQllbHNlCisJCQkJCXByaW50Zihmb3JtYXQsIHByZWNpc2lvbiwgYXJndW1lbnQsIC8qdW51c2VkOiovIGFyZ3VtZW50KTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKCFoYXZlX3ByZWMpCisJCQkJCXByaW50Zihmb3JtYXQsIGZpZWxkX3dpZHRoLCBhcmd1bWVudCwgLyp1bnVzZWQ6Ki8gYXJndW1lbnQpOworCQkJCWVsc2UKKwkJCQkJcHJpbnRmKGZvcm1hdCwgZmllbGRfd2lkdGgsIHByZWNpc2lvbiwgYXJndW1lbnQpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwljYXNlICdmJzoKKwljYXNlICdlJzoKKwljYXNlICdFJzoKKwljYXNlICdnJzoKKwljYXNlICdHJzoKKwkJZHYgPSBteV94c3RydG9kKGFyZ3VtZW50KTsKKwkJaWYgKCFoYXZlX3dpZHRoKSB7CisJCQlpZiAoIWhhdmVfcHJlYykKKwkJCQlwcmludGYoZm9ybWF0LCBkdik7CisJCQllbHNlCisJCQkJcHJpbnRmKGZvcm1hdCwgcHJlY2lzaW9uLCBkdik7CisJCX0gZWxzZSB7CisJCQlpZiAoIWhhdmVfcHJlYykKKwkJCQlwcmludGYoZm9ybWF0LCBmaWVsZF93aWR0aCwgZHYpOworCQkJZWxzZQorCQkJCXByaW50Zihmb3JtYXQsIGZpZWxkX3dpZHRoLCBwcmVjaXNpb24sIGR2KTsKKwkJfQorCQlicmVhazsKKwl9IC8qIHN3aXRjaCAqLworCisJZm9ybWF0W2ZtdF9sZW5ndGhdID0gc2F2ZWQ7Cit9CisKKy8qIEhhbmRsZSBwYXJhbXMgZm9yICIlKi4qZiIuIE5lZ2F0aXZlIG51bWJlcnMgYXJlIG9rIChjb21wYXQpLiAqLworc3RhdGljIGludCBnZXRfd2lkdGhfcHJlYyhjb25zdCBjaGFyICpzdHIpCit7CisJaW50IHYgPSBiYl9zdHJ0b2koc3RyLCBOVUxMLCAxMCk7CisJaWYgKGVycm5vKSB7CisJCWJiX2Vycm9yX21zZygiaW52YWxpZCBudW1iZXIgJyVzJyIsIHN0cik7CisJCXYgPSAwOworCX0KKwlyZXR1cm4gdjsKK30KKworLyogUHJpbnQgdGhlIHRleHQgaW4gRk9STUFULCB1c2luZyBBUkdWIGZvciBhcmd1bWVudHMgdG8gYW55ICclJyBkaXJlY3RpdmVzLgorICAgUmV0dXJuIGFkdmFuY2VkIEFSR1YuICAqLworc3RhdGljIGNoYXIgKipwcmludF9mb3JtYXR0ZWQoY2hhciAqZiwgY2hhciAqKmFyZ3YsIGludCAqY29udl9lcnIpCit7CisJY2hhciAqZGlyZWNfc3RhcnQ7ICAgICAgLyogU3RhcnQgb2YgJSBkaXJlY3RpdmUuICAqLworCXVuc2lnbmVkIGRpcmVjX2xlbmd0aDsgIC8qIExlbmd0aCBvZiAlIGRpcmVjdGl2ZS4gICovCisJaW50IGZpZWxkX3dpZHRoOyAgICAgICAgLyogQXJnIHRvIGZpcnN0ICcqJyAqLworCWludCBwcmVjaXNpb247ICAgICAgICAgIC8qIEFyZyB0byBzZWNvbmQgJyonICovCisJY2hhciAqKnNhdmVkX2FyZ3YgPSBhcmd2OworCisJZm9yICg7ICpmOyArK2YpIHsKKwkJc3dpdGNoICgqZikgeworCQljYXNlICclJzoKKwkJCWRpcmVjX3N0YXJ0ID0gZisrOworCQkJZGlyZWNfbGVuZ3RoID0gMTsKKwkJCWZpZWxkX3dpZHRoID0gcHJlY2lzaW9uID0gMDsKKwkJCWlmICgqZiA9PSAnJScpIHsKKwkJCQliYl9wdXRjaGFyKCclJyk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoKmYgPT0gJ2InKSB7CisJCQkJaWYgKCphcmd2KSB7CisJCQkJCXByaW50X2VzY19zdHJpbmcoKmFyZ3YpOworCQkJCQkrK2FyZ3Y7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHN0cmNocigiLSsgIyIsICpmKSkgeworCQkJCSsrZjsKKwkJCQkrK2RpcmVjX2xlbmd0aDsKKwkJCX0KKwkJCWlmICgqZiA9PSAnKicpIHsKKwkJCQkrK2Y7CisJCQkJKytkaXJlY19sZW5ndGg7CisJCQkJaWYgKCphcmd2KQorCQkJCQlmaWVsZF93aWR0aCA9IGdldF93aWR0aF9wcmVjKCphcmd2KyspOworCQkJfSBlbHNlIHsKKwkJCQl3aGlsZSAoaXNkaWdpdCgqZikpIHsKKwkJCQkJKytmOworCQkJCQkrK2RpcmVjX2xlbmd0aDsKKwkJCQl9CisJCQl9CisJCQlpZiAoKmYgPT0gJy4nKSB7CisJCQkJKytmOworCQkJCSsrZGlyZWNfbGVuZ3RoOworCQkJCWlmICgqZiA9PSAnKicpIHsKKwkJCQkJKytmOworCQkJCQkrK2RpcmVjX2xlbmd0aDsKKwkJCQkJaWYgKCphcmd2KQorCQkJCQkJcHJlY2lzaW9uID0gZ2V0X3dpZHRoX3ByZWMoKmFyZ3YrKyk7CisJCQkJfSBlbHNlIHsKKwkJCQkJd2hpbGUgKGlzZGlnaXQoKmYpKSB7CisJCQkJCQkrK2Y7CisJCQkJCQkrK2RpcmVjX2xlbmd0aDsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKworCQkJLyogUmVtb3ZlICJsTGh6IiBzaXplIG1vZGlmaWVycywgcmVwZWF0ZWRseS4KKwkJCSAqIGJhc2ggZG9lcyBub3QgbGlrZSAiJWxsZCIsIGJ1dCBjb3JldXRpbHMKKwkJCSAqIGhhcHBpbHkgdGFrZXMgZXZlbiAiJUxsbGxoaHpoaHpkIiEKKwkJCSAqIFdlIGFyZSBwZXJtaXNzaXZlIGxpa2UgY29yZXV0aWxzICovCisJCQl3aGlsZSAoKCpmIHwgMHgyMCkgPT0gJ2wnIHx8ICpmID09ICdoJyB8fCAqZiA9PSAneicpIHsKKwkJCQlvdmVybGFwcGluZ19zdHJjcHkoZiwgZiArIDEpOworCQkJfQorCQkJLyogQWRkICJsbCIgaWYgaW50ZWdlciBtb2RpZmllciwgdGhlbiBwcmludCAqLworCQkJeworCQkJCXN0YXRpYyBjb25zdCBjaGFyIGZvcm1hdF9jaGFyc1tdIEFMSUdOMSA9ICJkaW91eFhmZUVnR2NzIjsKKwkJCQljaGFyICpwID0gc3RyY2hyKGZvcm1hdF9jaGFycywgKmYpOworCQkJCS8qIG5lZWRlZCAtIHRyeSAicHJpbnRmICUiIHdpdGhvdXQgaXQgKi8KKwkJCQlpZiAocCA9PSBOVUxMKSB7CisJCQkJCWJiX2Vycm9yX21zZygiJXM6IGludmFsaWQgZm9ybWF0IiwgZGlyZWNfc3RhcnQpOworCQkJCQkvKiBjYXVzZXMgbWFpbigpIHRvIGV4aXQgd2l0aCBlcnJvciAqLworCQkJCQlyZXR1cm4gc2F2ZWRfYXJndiAtIDE7CisJCQkJfQorCQkJCSsrZGlyZWNfbGVuZ3RoOworCQkJCWlmIChwIC0gZm9ybWF0X2NoYXJzIDw9IDUpIHsKKwkJCQkJLyogaXQgaXMgb25lIG9mICJkaW91eFgiICovCisJCQkJCXAgPSB4bWFsbG9jKGRpcmVjX2xlbmd0aCArIDMpOworCQkJCQltZW1jcHkocCwgZGlyZWNfc3RhcnQsIGRpcmVjX2xlbmd0aCk7CisJCQkJCXBbZGlyZWNfbGVuZ3RoICsgMV0gPSBwW2RpcmVjX2xlbmd0aCAtIDFdOworCQkJCQlwW2RpcmVjX2xlbmd0aCAtIDFdID0gJ2wnOworCQkJCQlwW2RpcmVjX2xlbmd0aF0gPSAnbCc7CisJCQkJCS8vYmJfZXJyb3JfbXNnKCI8JXM+IiwgcCk7CisJCQkJCWRpcmVjX2xlbmd0aCArPSAyOworCQkJCQlkaXJlY19zdGFydCA9IHA7CisJCQkJfSBlbHNlIHsKKwkJCQkJcCA9IE5VTEw7CisJCQkJfQorCQkJCWlmICgqYXJndikgeworCQkJCQlwcmludF9kaXJlYyhkaXJlY19zdGFydCwgZGlyZWNfbGVuZ3RoLCBmaWVsZF93aWR0aCwKKwkJCQkJCQkJcHJlY2lzaW9uLCAqYXJndisrKTsKKwkJCQl9IGVsc2UgeworCQkJCQlwcmludF9kaXJlYyhkaXJlY19zdGFydCwgZGlyZWNfbGVuZ3RoLCBmaWVsZF93aWR0aCwKKwkJCQkJCQkJcHJlY2lzaW9uLCAiIik7CisJCQkJfQorCQkJCSpjb252X2VyciB8PSBlcnJubzsKKwkJCQlmcmVlKHApOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ1xcJzoKKwkJCWlmICgqKytmID09ICdjJykgeworCQkJCXJldHVybiBzYXZlZF9hcmd2OyAvKiBjYXVzZXMgbWFpbigpIHRvIGV4aXQgKi8KKwkJCX0KKwkJCWJiX3B1dGNoYXIoYmJfcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UoKGNvbnN0IGNoYXIgKiopJmYpKTsKKwkJCWYtLTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcHV0Y2hhcigqZik7CisJCX0KKwl9CisKKwlyZXR1cm4gYXJndjsKK30KKworaW50IHByaW50Zl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGNvbnZfZXJyOworCWNoYXIgKmZvcm1hdDsKKwljaGFyICoqYXJndjI7CisKKwkvKiBXZSBtdXN0IGNoZWNrIHRoYXQgc3Rkb3V0IGlzIG5vdCBjbG9zZWQuCisJICogVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyBoaWdobHkgbm9uLW9idmlvdXMuCisJICogcHJpbnRmX21haW4gaXMgdXNlZCBmcm9tIHNoZWxsLgorCSAqIFNoZWxsIG11c3QgY29ycmVjdGx5IGhhbmRsZSAncHJpbnRmICIlcyIgZm9vJworCSAqIGlmIHN0ZG91dCBpcyBjbG9zZWQuIFdpdGggc3RkaW8sIG91dHB1dCBnZXRzIHNob3ZlbGVkIGludG8KKwkgKiBzdGRvdXQgYnVmZmVyLCBhbmQgZXZlbiBmZmx1c2ggY2Fubm90IGNsZWFyIGl0IG91dC4gSXQgc2VlbXMgdGhhdAorCSAqIGV2ZW4gaWYgbGliYyByZWNlaXZlcyBFQkFERiBvbiB3cml0ZSBhdHRlbXB0cywgaXQgZmVlbHMgZGV0ZXJtaW5lZAorCSAqIHRvIG91dHB1dCBkYXRhIG5vIG1hdHRlciB3aGF0LiBTbyBpdCB3aWxsIHRyeSBsYXRlciwKKwkgKiBhbmQgcG9zc2libHkgd2lsbCBjbG9iYmVyIGZ1dHVyZSBvdXRwdXQuIE5vdCBnb29kLiAqLworLy8gVE9ETzogY2hlY2sgZmNudGwoKSAmIE9fQUNDTU9ERSA9PSBPX1dST05MWSBvciBPX1JEV1I/CisJaWYgKGZjbnRsKDEsIEZfR0VURkwpID09IC0xKQorCQlyZXR1cm4gMTsgLyogbWF0Y2ggY29yZXV0aWxzIDYuMTAgKHNhbnMgZXJyb3IgbXNnIHRvIHN0ZGVycikgKi8KKwkvL2lmIChkdXAyKDEsIDEpICE9IDEpIC0gb2xkIHdheQorCS8vCXJldHVybiAxOworCisJLyogYmFzaCBidWlsdGluIGVycm9ycyBvdXQgb24gInByaW50ZiAnLSVzLVxuJyBmb28iLAorCSAqIGNvcmV1dGlscy02Ljkgd29ya3MuIEJvdGggd29yayB3aXRoICJwcmludGYgLS0gJy0lcy1cbicgZm9vIi4KKwkgKiBXZSB3aWxsIG1pbWljIGNvcmV1dGlscy4gKi8KKwlpZiAoYXJndlsxXSAmJiBhcmd2WzFdWzBdID09ICctJyAmJiBhcmd2WzFdWzFdID09ICctJyAmJiAhYXJndlsxXVsyXSkKKwkJYXJndisrOworCWlmICghYXJndlsxXSkgeworCQlpZiAoRU5BQkxFX0FTSF9CVUlMVElOX1BSSU5URgorCQkgJiYgYXBwbGV0X25hbWVbMF0gIT0gJ3AnCisJCSkgeworCQkJYmJfZXJyb3JfbXNnKCJ1c2FnZTogcHJpbnRmIEZPUk1BVCBbQVJHVU1FTlQuLi5dIik7CisJCQlyZXR1cm4gMjsgLyogYmFzaCBjb21wYXQgKi8KKwkJfQorCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJZm9ybWF0ID0gYXJndlsxXTsKKwlhcmd2MiA9IGFyZ3YgKyAyOworCisJY29udl9lcnIgPSAwOworCWRvIHsKKwkJYXJndiA9IGFyZ3YyOworCQlhcmd2MiA9IHByaW50X2Zvcm1hdHRlZChmb3JtYXQsIGFyZ3YsICZjb252X2Vycik7CisJfSB3aGlsZSAoYXJndjIgPiBhcmd2ICYmICphcmd2Mik7CisKKwkvKiBjb3JldXRpbHMgY29tcGF0IChiYXNoIGRvZXNuJ3QgZG8gdGhpcyk6CisJaWYgKCphcmd2KQorCQlmcHJpbnRmKHN0ZGVyciwgImV4Y2VzcyBhcmdzIGlnbm9yZWQiKTsKKwkqLworCisJcmV0dXJuIChhcmd2MiA8IGFyZ3YpIC8qIGlmIHRydWUsIHByaW50X2Zvcm1hdHRlZCBlcnJvcmVkIG91dCAqLworCQl8fCBjb252X2VycjsgLyogcHJpbnRfZm9ybWF0dGVkIHNhdyBpbnZhbGlkIG51bWJlciAqLworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3B3ZC5jIGIvY29yZXV0aWxzL3B3ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiM2FkMDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvcHdkLmMKQEAgLTAsMCArMSw4NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBwd2QgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgYnkgQnJ1Y2UgUGVyZW5zIDxicnVjZUBwaXhhci5jb20+LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHB3ZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIHB3ZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IHRoZSBmdWxsIGZpbGVuYW1lIG9mIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBwd2RfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgcHdkXG4iCisvL3VzYWdlOiAgICAgICAiL3Jvb3RcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0ZPUksgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK3N0YXRpYyBpbnQgbG9naWNhbF9nZXRjd2Qodm9pZCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDE7CisJc3RydWN0IHN0YXQgc3QyOworCWNoYXIgKndkOworCWNoYXIgKnA7CisKKwl3ZCA9IGdldGVudigiUFdEIik7CisJaWYgKCF3ZCB8fCB3ZFswXSAhPSAnLycpCisJCXJldHVybiAwOworCisJcCA9IHdkOworCXdoaWxlICgqcCkgeworCQkvKiBkb2luZyBzdHJzdHIocCwgIi8uIikgYnkgaGFuZCBpcyBzbWFsbGVyIGFuZCBmYXN0ZXIuLi4gKi8KKwkJaWYgKCpwKysgIT0gJy8nKQorCQkJY29udGludWU7CisJCWlmICgqcCAhPSAnLicpCisJCQljb250aW51ZTsKKwkJLyogd2UgZm91bmQgIi8uIiwgc2tpcCB0byBuZXh0IGNoYXIgKi8KKwkJcCsrOworCQlpZiAoKnAgPT0gJy4nKQorCQkJcCsrOyAvKiB3ZSBmb3VuZCAiLy4uIiAqLworCQlpZiAoKnAgPT0gJ1wwJyB8fCAqcCA9PSAnLycpCisJCQlyZXR1cm4gMDsgLyogIi8uLyIgb3IgIi8uLi8iIGNvbXBvbmVudDogYmFkICovCisJfQorCisJaWYgKHN0YXQod2QsICZzdDEpICE9IDApCisJCXJldHVybiAwOworCWlmIChzdGF0KCIuIiwgJnN0MikgIT0gMCkKKwkJcmV0dXJuIDA7CisJaWYgKHN0MS5zdF9pbm8gIT0gc3QyLnN0X2lubykKKwkJcmV0dXJuIDA7CisJaWYgKHN0MS5zdF9kZXYgIT0gc3QyLnN0X2RldikKKwkJcmV0dXJuIDA7CisKKwlwdXRzKHdkKTsKKwlyZXR1cm4gMTsKK30KKworaW50IHB3ZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcHdkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJY2hhciAqYnVmOworCisJaWYgKEVOQUJMRV9ERVNLVE9QKSB7CisJCS8qIFRPRE86IGFzc3VtZSAtTCBpZiAkUE9TSVhMWV9DT1JSRUNUPyAoY29yZXV0aWxzIGRvZXMgdGhhdCkKKwkJICogUmF0aW9uYWxlOgorCQkgKiBQT1NJWCByZXF1aXJlcyBhIGRlZmF1bHQgb2YgLUwsIGJ1dCBtb3N0IHNjcmlwdHMgZXhwZWN0IC1QCisJCSAqLworCQl1bnNpZ25lZCBvcHQgPSBnZXRvcHQzMihhcmd2LCAiTFAiKTsKKwkJaWYgKChvcHQgJiAxKSAmJiBsb2dpY2FsX2dldGN3ZCgpKQorCQkJcmV0dXJuIGZmbHVzaF9hbGwoKTsKKwl9CisKKwlidWYgPSB4cmVhbGxvY19nZXRjd2Rfb3Jfd2FybihOVUxMKTsKKworCWlmIChidWYpIHsKKwkJcHV0cyhidWYpOworCQlmcmVlKGJ1Zik7CisJCXJldHVybiBmZmx1c2hfYWxsKCk7CisJfQorCisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9yZWFkbGluay5jIGIvY29yZXV0aWxzL3JlYWRsaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDczZWY0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9yZWFkbGluay5jCkBAIC0wLDAgKzEsODUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgcmVhZGxpbmsgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSBNYXR0IEtyYWFpIDxrcmFhaUBhbHVtbmkuY2FybmVnaWVtZWxsb24uZWR1PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHJlYWRsaW5rX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfUkVBRExJTktfRk9MTE9XKCJbLWZudl0gIikgIkZJTEUiCisvL3VzYWdlOiNkZWZpbmUgcmVhZGxpbmtfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEaXNwbGF5IHRoZSB2YWx1ZSBvZiBhIHN5bWxpbmsiCisvL3VzYWdlOglJRl9GRUFUVVJFX1JFQURMSU5LX0ZPTExPVyggIlxuIgorLy91c2FnZTogICAgICJcbgktZglDYW5vbmljYWxpemUgYnkgZm9sbG93aW5nIGFsbCBzeW1saW5rcyIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JRG9uJ3QgYWRkIG5ld2xpbmUiCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKgorICogIyByZWFkbGluayAtLXZlcnNpb24KKyAqIHJlYWRsaW5rIChHTlUgY29yZXV0aWxzKSA2LjEwCisgKiAjIHJlYWRsaW5rIC0taGVscAorICogICAtZiwgLS1jYW5vbmljYWxpemUKKyAqICAgICAgY2Fub25pY2FsaXplIGJ5IGZvbGxvd2luZyBldmVyeSBzeW1saW5rIGluCisgKiAgICAgIGV2ZXJ5IGNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gbmFtZSByZWN1cnNpdmVseTsKKyAqICAgICAgYWxsIGJ1dCB0aGUgbGFzdCBjb21wb25lbnQgbXVzdCBleGlzdAorICogICAtZSwgLS1jYW5vbmljYWxpemUtZXhpc3RpbmcKKyAqICAgICAgY2Fub25pY2FsaXplIGJ5IGZvbGxvd2luZyBldmVyeSBzeW1saW5rIGluCisgKiAgICAgIGV2ZXJ5IGNvbXBvbmVudCBvZiB0aGUgZ2l2ZW4gbmFtZSByZWN1cnNpdmVseSwKKyAqICAgICAgYWxsIGNvbXBvbmVudHMgbXVzdCBleGlzdAorICogICAtbSwgLS1jYW5vbmljYWxpemUtbWlzc2luZworICogICAgICBjYW5vbmljYWxpemUgYnkgZm9sbG93aW5nIGV2ZXJ5IHN5bWxpbmsgaW4KKyAqICAgICAgZXZlcnkgY29tcG9uZW50IG9mIHRoZSBnaXZlbiBuYW1lIHJlY3Vyc2l2ZWx5LAorICogICAgICB3aXRob3V0IHJlcXVpcmVtZW50cyBvbiBjb21wb25lbnRzIGV4aXN0ZW5jZQorICogICAtbiwgLS1uby1uZXdsaW5lICAgICAgICAgICAgICBkbyBub3Qgb3V0cHV0IHRoZSB0cmFpbGluZyBuZXdsaW5lCisgKiAgIC1xLCAtLXF1aWV0LCAtcywgLS1zaWxlbnQgICAgIHN1cHByZXNzIG1vc3QgZXJyb3IgbWVzc2FnZXMKKyAqICAgLXYsIC0tdmVyYm9zZSAgICAgICAgICAgICAgICAgcmVwb3J0IGVycm9yIG1lc3NhZ2VzCisgKgorICogYmJveCBzdXBwb3J0czogLWYgKHBhcnRpYWxseSkgLW4gLXYgKGZ1bGx5KSwgLXEgLXMgKGFjY2VwdHMgYnV0IGlnbm9yZXMpCisgKiBOb3RlOiB3ZSBleHBvcnQgdGhlIC1mIGZsYWcsIGJ1dCBvdXIgLWYgYmVoYXZlcyBsaWtlIGNvcmV1dGlscycgLWUuCisgKiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpc24ndCBhIEMgbGliIGZ1bmN0aW9uIHdlIGNhbiBsZXZlcmFnZSB0byBnZXQgdGhpcworICogYmVoYXZpb3Igd2hpY2ggbWVhbnMgd2UnZCBoYXZlIHRvIGltcGxlbWVudCB0aGUgZnVsbCBzdGFjayBvdXJzZWx2ZXMgOiguCisgKi8KKworaW50IHJlYWRsaW5rX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCByZWFkbGlua19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqYnVmOworCWNoYXIgKmZuYW1lOworCisJSUZfRkVBVFVSRV9SRUFETElOS19GT0xMT1coCisJCXVuc2lnbmVkIG9wdDsKKwkJLyogV2UgbmVlZCBleGFjdGx5IG9uZSBub24tb3B0aW9uIGFyZ3VtZW50LiAgKi8KKwkJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTEiOworCQlvcHQgPSBnZXRvcHQzMihhcmd2LCAiZm52c3EiKTsKKwkJZm5hbWUgPSBhcmd2W29wdGluZF07CisJKQorCUlGX05PVF9GRUFUVVJFX1JFQURMSU5LX0ZPTExPVygKKwkJY29uc3QgdW5zaWduZWQgb3B0ID0gMDsKKwkJaWYgKGFyZ2MgIT0gMikgYmJfc2hvd191c2FnZSgpOworCQlmbmFtZSA9IGFyZ3ZbMV07CisJKQorCisJLyogY29tcGF0OiBjb3JldXRpbHMgcmVhZGxpbmsgcmVwb3J0cyBlcnJvcnMgc2lsZW50bHkgdmlhIGV4aXQgY29kZSAqLworCWlmICghKG9wdCAmIDQpKSAvKiBub3QgLXYgKi8KKwkJbG9nbW9kZSA9IExPR01PREVfTk9ORTsKKworCWlmIChvcHQgJiAxKSB7IC8qIC1mICovCisJCWJ1ZiA9IHhtYWxsb2NfcmVhbHBhdGgoZm5hbWUpOworCX0gZWxzZSB7CisJCWJ1ZiA9IHhtYWxsb2NfcmVhZGxpbmtfb3Jfd2FybihmbmFtZSk7CisJfQorCisJaWYgKCFidWYpCisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJcHJpbnRmKChvcHQgJiAyKSA/ICIlcyIgOiAiJXNcbiIsIGJ1Zik7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWZyZWUoYnVmKTsKKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9yZWFscGF0aC5jIGIvY29yZXV0aWxzL3JlYWxwYXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUxM2I1NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9yZWFscGF0aC5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworCisvKiBCQl9BVURJVCBTVVN2MyBOL0EgLS0gQXBwYXJlbnRseSBhIGJ1c3lib3ggZXh0ZW5zaW9uLiAqLworCisvKiBNYXIgMTYsIDIwMDMgICAgICBNYW51ZWwgTm92b2EgSUlJICAgKG1qbjNAY29kZXBvZXQub3JnKQorICoKKyAqIE5vdyBkb2VzIHByb3BlciBlcnJvciBjaGVja2luZyBvbiBvdXRwdXQgYW5kIHJldHVybnMgYSBmYWlsdXJlIGV4aXQgY29kZQorICogaWYgb25lIG9yIG1vcmUgcGF0aHMgY2Fubm90IGJlIHJlc29sdmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHJlYWxwYXRoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJGSUxFLi4uIgorLy91c2FnZTojZGVmaW5lIHJlYWxwYXRoX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRobmFtZXMgb2YgZ2l2ZW4gRklMRSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCByZWFscGF0aF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcmVhbHBhdGhfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCByZXR2YWwgPSBFWElUX1NVQ0NFU1M7CisKKwlpZiAoISorK2FyZ3YpIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWRvIHsKKwkJY2hhciAqcmVzb2x2ZWRfcGF0aCA9IHhtYWxsb2NfcmVhbHBhdGgoKmFyZ3YpOworCQlpZiAocmVzb2x2ZWRfcGF0aCAhPSBOVUxMKSB7CisJCQlwdXRzKHJlc29sdmVkX3BhdGgpOworCQkJZnJlZShyZXNvbHZlZF9wYXRoKTsKKwkJfSBlbHNlIHsKKwkJCXJldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKCphcmd2KTsKKwkJfQorCX0gd2hpbGUgKCorK2FyZ3YpOworCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChyZXR2YWwpOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3JtLmMgYi9jb3JldXRpbHMvcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGFkODFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL3JtLmMKQEAgLTAsMCArMSw2OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBybSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSBNYXR0IEtyYWFpIDxrcmFhaUBhbHVtbmkuY2FybmVnaWVtZWxsb24uZWR1PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50ICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL3JtLmh0bWwgKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBTaXplIHJlZHVjdGlvbi4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcm1fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstaXJmXSBGSUxFLi4uIgorLy91c2FnZTojZGVmaW5lIHJtX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVtb3ZlICh1bmxpbmspIEZJTEVzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1pCUFsd2F5cyBwcm9tcHQgYmVmb3JlIHJlbW92aW5nIgorLy91c2FnZTogICAgICJcbgktZglOZXZlciBwcm9tcHQiCisvL3VzYWdlOiAgICAgIlxuCS1SLC1yCVJlY3Vyc2UiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHJtX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHJtIC1yZiAvdG1wL2Zvb1xuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworaW50IHJtX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBybV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHN0YXR1cyA9IDA7CisJaW50IGZsYWdzID0gMDsKKwl1bnNpZ25lZCBvcHQ7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJmLWk6aS1mIjsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiZmlScnYiKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAob3B0ICYgMSkKKwkJZmxhZ3MgfD0gRklMRVVUSUxTX0ZPUkNFOworCWlmIChvcHQgJiAyKQorCQlmbGFncyB8PSBGSUxFVVRJTFNfSU5URVJBQ1RJVkU7CisJaWYgKG9wdCAmICg4fDQpKQorCQlmbGFncyB8PSBGSUxFVVRJTFNfUkVDVVI7CisJaWYgKChvcHQgJiAxNikgJiYgRklMRVVUSUxTX1ZFUkJPU0UpCisJCWZsYWdzIHw9IEZJTEVVVElMU19WRVJCT1NFOworCisJaWYgKCphcmd2ICE9IE5VTEwpIHsKKwkJZG8geworCQkJY29uc3QgY2hhciAqYmFzZSA9IGJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50X3N0cmlwKCphcmd2KTsKKworCQkJaWYgKERPVF9PUl9ET1RET1QoYmFzZSkpIHsKKwkJCQliYl9lcnJvcl9tc2coImNhbid0IHJlbW92ZSAnLicgb3IgJy4uJyIpOworCQkJfSBlbHNlIGlmIChyZW1vdmVfZmlsZSgqYXJndiwgZmxhZ3MpID49IDApIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXN0YXR1cyA9IDE7CisJCX0gd2hpbGUgKCorK2FyZ3YpOworCX0gZWxzZSBpZiAoIShmbGFncyAmIEZJTEVVVElMU19GT1JDRSkpIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvcm1kaXIuYyBiL2NvcmV1dGlscy9ybWRpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OTJhMWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvcm1kaXIuYwpAQCAtMCwwICsxLDkzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBybWRpciBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgY29tcGxpYW50ICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL3JtZGlyLmh0bWwgKi8KKworLy91c2FnZTojZGVmaW5lIHJtZGlyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gRElSRUNUT1JZLi4uIgorLy91c2FnZTojZGVmaW5lIHJtZGlyX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVtb3ZlIERJUkVDVE9SWSBpZiBpdCBpcyBlbXB0eVxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9STURJUl9MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgIlxuCS1wfC0tcGFyZW50cwlJbmNsdWRlIHBhcmVudHMiCisvL3VzYWdlOiAgICAgIlxuCS0taWdub3JlLWZhaWwtb24tbm9uLWVtcHR5IgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfUk1ESVJfTE9OR19PUFRJT05TKAorLy91c2FnZTogICAgICJcbgktcAlJbmNsdWRlIHBhcmVudHMiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHJtZGlyX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIjIHJtZGlyIC90bXAvZm9vXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCisKKyNkZWZpbmUgUEFSRU5UUyAgICAgICAgICAoMSA8PCAwKQorI2RlZmluZSBWRVJCT1NFICAgICAgICAgICgoMSA8PCAxKSAqIEVOQUJMRV9GRUFUVVJFX1ZFUkJPU0UpCisjZGVmaW5lIElHTk9SRV9OT05fRU1QVFkgKDEgPDwgMikKKworaW50IHJtZGlyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBybWRpcl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHN0YXR1cyA9IEVYSVRfU1VDQ0VTUzsKKwlpbnQgZmxhZ3M7CisJY2hhciAqcGF0aDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1JNRElSX0xPTkdfT1BUSU9OUworCXN0YXRpYyBjb25zdCBjaGFyIHJtZGlyX2xvbmdvcHRzW10gQUxJR04xID0KKwkJInBhcmVudHNcMCIgICAgICAgICAgICAgICAgICBOb19hcmd1bWVudCAicCIKKwkJLyogRGViaWFuIGV0Y2g6IG1hbnkgcGFja2FnZXMgZmFpbCB0byBiZSBwdXJnZWQgb3IgaW5zdGFsbGVkCisJCSAqIGJlY2F1c2UgdGhleSBkZXNwZXJhdGVseSB3YW50IHRoaXMgb3B0aW9uOiAqLworCQkiaWdub3JlLWZhaWwtb24tbm9uLWVtcHR5XDAiIE5vX2FyZ3VtZW50ICJceGZmIgorCQlJRl9GRUFUVVJFX1ZFUkJPU0UoCisJCSJ2ZXJib3NlXDAiICAgICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgInYiCisJCSkKKwkJOworCWFwcGxldF9sb25nX29wdGlvbnMgPSBybWRpcl9sb25nb3B0czsKKyNlbmRpZgorCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgInB2Iik7CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoISphcmd2KSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlkbyB7CisJCXBhdGggPSAqYXJndjsKKworCQl3aGlsZSAoMSkgeworCQkJaWYgKGZsYWdzICYgVkVSQk9TRSkgeworCQkJCXByaW50Zigicm1kaXI6IHJlbW92aW5nIGRpcmVjdG9yeSwgJyVzJ1xuIiwgcGF0aCk7CisJCQl9CisKKwkJCWlmIChybWRpcihwYXRoKSA8IDApIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9STURJUl9MT05HX09QVElPTlMKKwkJCQlpZiAoKGZsYWdzICYgSUdOT1JFX05PTl9FTVBUWSkgJiYgZXJybm8gPT0gRU5PVEVNUFRZKQorCQkJCQlicmVhazsKKyNlbmRpZgorCQkJCWJiX3BlcnJvcl9tc2coIiclcyciLCBwYXRoKTsgIC8qIE1hdGNoIGdudSBybWRpciBtc2cuICovCisJCQkJc3RhdHVzID0gRVhJVF9GQUlMVVJFOworCQkJfSBlbHNlIGlmIChmbGFncyAmIFBBUkVOVFMpIHsKKwkJCQkvKiBOb3RlOiBwYXRoIHdhcyBub3QgIiIgc2luY2Ugcm1kaXIgc3VjY2VlZGVkLiAqLworCQkJCXBhdGggPSBkaXJuYW1lKHBhdGgpOworCQkJCS8qIFBhdGggaXMgbm93IGp1c3QgdGhlIHBhcmVudCBjb21wb25lbnQuICBEaXJuYW1lCisJCQkJICogcmV0dXJucyAiLiIgaWYgdGhlcmUgYXJlIG5vIHBhcmVudHMuCisJCQkJICovCisJCQkJaWYgKE5PVF9MT05FX0NIQVIocGF0aCwgJy4nKSkgeworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKCorK2FyZ3YpOworCisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9zZXEuYyBiL2NvcmV1dGlscy9zZXEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTg2MTkyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL3NlcS5jCkBAIC0wLDAgKzEsMTA5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzZXEgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQsIEdsZW5uIE1jR3JhdGgKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzZXFfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstd10gWy1zIFNFUF0gW0ZJUlNUIFtJTkNdXSBMQVNUIgorLy91c2FnZTojZGVmaW5lIHNlcV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IG51bWJlcnMgZnJvbSBGSVJTVCB0byBMQVNULCBpbiBzdGVwcyBvZiBJTkMuXG4iCisvL3VzYWdlOiAgICAgICAiRklSU1QsIElOQyBkZWZhdWx0IHRvIDEuXG4iCisvL3VzYWdlOiAgICAgIlxuCS13CVBhZCB0byBsYXN0IHdpdGggbGVhZGluZyB6ZXJvcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgU0VQCVN0cmluZyBzZXBhcmF0b3IiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitpbnQgc2VxX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZXFfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJZW51bSB7CisJCU9QVF93ID0gKDEgPDwgMCksCisJCU9QVF9zID0gKDEgPDwgMSksCisJfTsKKwlkb3VibGUgZmlyc3QsIGxhc3QsIGluY3JlbWVudCwgdjsKKwl1bnNpZ25lZCBuOworCXVuc2lnbmVkIHdpZHRoOworCXVuc2lnbmVkIGZyYWNfcGFydDsKKwljb25zdCBjaGFyICpzZXAsICpvcHRfcyA9ICJcbiI7CisJdW5zaWduZWQgb3B0OworCisjaWYgRU5BQkxFX0xPQ0FMRV9TVVBQT1JUCisJLyogVW5kbyBidXN5Ym94LmM6IG9uIGlucHV0LCB3ZSB3YW50IHRvIHVzZSBkb3QKKwkgKiBhcyBmcmFjdGlvbmFsIHNlcGFyYXRvciwgcmVnYXJkbGVzcyBvZiBjdXJyZW50IGxvY2FsZSAqLworCXNldGxvY2FsZShMQ19OVU1FUklDLCAiQyIpOworI2VuZGlmCisKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiK3dzOiIsICZvcHRfcyk7CisJYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisJZmlyc3QgPSBpbmNyZW1lbnQgPSAxOworCWVycm5vID0gMDsKKwlzd2l0Y2ggKGFyZ2MpIHsKKwkJCWNoYXIgKnBwOworCQljYXNlIDM6CisJCQlpbmNyZW1lbnQgPSBzdHJ0b2QoYXJndlsxXSwgJnBwKTsKKwkJCWVycm5vIHw9ICpwcDsKKwkJY2FzZSAyOgorCQkJZmlyc3QgPSBzdHJ0b2QoYXJndlswXSwgJnBwKTsKKwkJCWVycm5vIHw9ICpwcDsKKwkJY2FzZSAxOgorCQkJbGFzdCA9IHN0cnRvZChhcmd2W2FyZ2MtMV0sICZwcCk7CisJCQlpZiAoIWVycm5vICYmICpwcCA9PSAnXDAnKQorCQkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYmJfc2hvd191c2FnZSgpOworCX0KKworI2lmIEVOQUJMRV9MT0NBTEVfU1VQUE9SVAorCXNldGxvY2FsZShMQ19OVU1FUklDLCAiIik7CisjZW5kaWYKKworCS8qIExhc3QgY2hlY2tlZCB0byBiZSBjb21wYXRpYmxlIHdpdGg6IGNvcmV1dGlscy02LjEwICovCisJd2lkdGggPSAwOworCWZyYWNfcGFydCA9IDA7CisJd2hpbGUgKDEpIHsKKwkJY2hhciAqZG90ID0gc3RyY2hybnVsKCphcmd2LCAnLicpOworCQlpbnQgdyA9IChkb3QgLSAqYXJndik7CisJCWludCBmID0gc3RybGVuKGRvdCk7CisJCWlmICh3aWR0aCA8IHcpCisJCQl3aWR0aCA9IHc7CisJCWFyZ3YrKzsKKwkJaWYgKCEqYXJndikKKwkJCWJyZWFrOworCQkvKiBXaHkgZG8gdGhlIGFib3ZlIF9iZWZvcmVfIGZyYWMgY2hlY2sgYmVsb3c/CisJCSAqIFRyeSAic2VxIDEgMi4wIiBhbmQgInNlcSAxLjAgMi4wIjoKKwkJICogY29yZXV0aWxzIG5ldmVyIHBheSBhdHRlbnRpb24gdG8gdGhlIG51bWJlcgorCQkgKiBvZiBmcmFjdGlvbmFsIGRpZ2l0cyBpbiBsYXN0IGFyZy4gKi8KKwkJaWYgKGZyYWNfcGFydCA8IGYpCisJCQlmcmFjX3BhcnQgPSBmOworCX0KKwlpZiAoZnJhY19wYXJ0KSB7CisJCWZyYWNfcGFydC0tOworCQlpZiAoZnJhY19wYXJ0KQorCQkJd2lkdGggKz0gZnJhY19wYXJ0ICsgMTsKKwl9CisJaWYgKCEob3B0ICYgT1BUX3cpKQorCQl3aWR0aCA9IDA7CisKKwlzZXAgPSAiIjsKKwl2ID0gZmlyc3Q7CisJbiA9IDA7CisJd2hpbGUgKGluY3JlbWVudCA+PSAwID8gdiA8PSBsYXN0IDogdiA+PSBsYXN0KSB7CisJCWlmIChwcmludGYoIiVzJTAqLipmIiwgc2VwLCB3aWR0aCwgZnJhY19wYXJ0LCB2KSA8IDApCisJCQlicmVhazsgLyogSS9PIGVycm9yLCBiYWlsIG91dCAoeWVzLCB0aGlzIHJlYWxseSBoYXBwZW5zKSAqLworCQlzZXAgPSBvcHRfczsKKwkJLyogdiArPSBpbmNyZW1lbnQ7IC0gd291bGQgYWNjdW11bGF0ZSBmbG9hdGluZyBwb2ludCBlcnJvcnMgKi8KKwkJbisrOworCQl2ID0gZmlyc3QgKyBuICogaW5jcmVtZW50OworCX0KKwlpZiAobikgLyogaWYgd2hpbGUgbG9vcCBleGVjdXRlZCBhdCBsZWFzdCBvbmNlICovCisJCWJiX3B1dGNoYXIoJ1xuJyk7CisKKwlyZXR1cm4gZmZsdXNoX2FsbCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3NodWYuYyBiL2NvcmV1dGlscy9zaHVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2MWYyZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9zaHVmLmMKQEAgLTAsMCArMSwxNTMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHNodWY6IFdyaXRlIGEgcmFuZG9tIHBlcm11dGF0aW9uIG9mIHRoZSBpbnB1dCBsaW5lcyB0byBzdGFuZGFyZCBvdXRwdXQuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IGJ5IEJhcnRvc3ogR29sYXN6ZXdza2kgPGJhcnRla2dvbGFAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9jb25maWc6Y29uZmlnIFNIVUYKKy8vY29uZmlnOglib29sICJzaHVmIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEdlbmVyYXRlIHJhbmRvbSBwZXJtdXRhdGlvbnMKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1NIVUYpICs9IHNodWYubworLy9hcHBsZXQ6SUZfU0hVRihBUFBMRVRfTk9FWEVDKHNodWYsIHNodWYsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHNodWYpKQorCisvL3VzYWdlOiNkZWZpbmUgc2h1Zl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1lfC1pIEwtSF0gWy1uIE5VTV0gWy1vIEZJTEVdIFstel0gW0ZJTEV8QVJHLi4uXSIKKy8vdXNhZ2U6I2RlZmluZSBzaHVmX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmFuZG9tbHkgcGVybXV0ZSBsaW5lc1xuIgorLy91c2FnZTogICAgICJcbgktZQlUcmVhdCBBUkdzIGFzIGxpbmVzIgorLy91c2FnZTogICAgICJcbgktaSBMLUgJVHJlYXQgbnVtYmVycyBMLUggYXMgbGluZXMiCisvL3VzYWdlOiAgICAgIlxuCS1uIE5VTQlPdXRwdXQgYXQgbW9zdCBOVU0gbGluZXMiCisvL3VzYWdlOiAgICAgIlxuCS1vIEZJTEUJV3JpdGUgdG8gRklMRSwgbm90IHN0YW5kYXJkIG91dHB1dCIKKy8vdXNhZ2U6ICAgICAiXG4JLXoJRW5kIGxpbmVzIHdpdGggemVybyBieXRlLCBub3QgbmV3bGluZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKKyNkZWZpbmUgT1BUX2UJCSgxIDw8IDApCisjZGVmaW5lIE9QVF9pCQkoMSA8PCAxKQorI2RlZmluZSBPUFRfbgkJKDEgPDwgMikKKyNkZWZpbmUgT1BUX28JCSgxIDw8IDMpCisjZGVmaW5lIE9QVF96CQkoMSA8PCA0KQorI2RlZmluZSBPUFRfU1RSCQkiZWk6bjpvOnoiCisKKy8qCisgKiBVc2UgdGhlIEZpc2hlci1ZYXRlcyBzaHVmZmxlIGFsZ29yaXRobSBvbiBhbiBhcnJheSBvZiBsaW5lcy4KKyAqLworc3RhdGljIHZvaWQgc2h1ZmZsZV9saW5lcyhjaGFyICoqbGluZXMsIHVuc2lnbmVkIG51bWxpbmVzKQoreworCXVuc2lnbmVkIGk7CisJdW5zaWduZWQgcjsKKwljaGFyICp0bXA7CisKKwlzcmFuZChtb25vdG9uaWNfdXMoKSk7CisKKwlmb3IgKGkgPSBudW1saW5lcy0xOyBpID4gMDsgaS0tKSB7CisJCXIgPSByYW5kKCk7CisJCS8qIFJBTkRfTUFYIGNhbiBiZSBhcyBzbWFsbCBhcyAzMjc2NyAqLworCQlpZiAoaSA+IFJBTkRfTUFYKQorCQkJciBePSByYW5kKCkgPDwgMTU7CisJCXIgJT0gaTsKKwkJdG1wID0gbGluZXNbaV07CisJCWxpbmVzW2ldID0gbGluZXNbcl07CisJCWxpbmVzW3JdID0gdG1wOworCX0KK30KKworaW50IHNodWZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNodWZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0czsKKwljaGFyICpvcHRfaV9zdHIsICpvcHRfbl9zdHIsICpvcHRfb19zdHI7CisJdW5zaWduZWQgaTsKKwljaGFyICoqbGluZXM7CisJdW5zaWduZWQgbnVtbGluZXM7CisJY2hhciBlb2w7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJlLS1pOmktLWUiOyAvKiBtdXR1YWxseSBleGNsdXNpdmUgKi8KKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgT1BUX1NUUiwgJm9wdF9pX3N0ciwgJm9wdF9uX3N0ciwgJm9wdF9vX3N0cik7CisKKwlhcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworCS8qIFByZXBhcmUgbGluZXMgZm9yIHNodWZmbGluZyAtIGVpdGhlcjogKi8KKwlpZiAob3B0cyAmIE9QVF9lKSB7CisJCS8qIG1ha2UgbGluZXMgZnJvbSBjb21tYW5kLWxpbmUgYXJndW1lbnRzICovCisJCW51bWxpbmVzID0gYXJnYzsKKwkJbGluZXMgPSBhcmd2OworCX0gZWxzZQorCWlmIChvcHRzICYgT1BUX2kpIHsKKwkJLyogY3JlYXRlIGEgcmFuZ2Ugb2YgbnVtYmVycyAqLworCQljaGFyICpkYXNoOworCQl1bnNpZ25lZCBsbywgaGk7CisKKwkJZGFzaCA9IHN0cmNocihvcHRfaV9zdHIsICctJyk7CisJCWlmICghZGFzaCkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCByYW5nZSAnJXMnIiwgb3B0X2lfc3RyKTsKKwkJfQorCQkqZGFzaCA9ICdcMCc7CisJCWxvID0geGF0b3Uob3B0X2lfc3RyKTsKKwkJaGkgPSB4YXRvdShkYXNoICsgMSk7CisJCSpkYXNoID0gJy0nOworCQlpZiAoaGkgPCBsbykgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCByYW5nZSAnJXMnIiwgb3B0X2lfc3RyKTsKKwkJfQorCisJCW51bWxpbmVzID0gKGhpKzEpIC0gbG87CisJCWxpbmVzID0geG1hbGxvYyhudW1saW5lcyAqIHNpemVvZihsaW5lc1swXSkpOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtbGluZXM7IGkrKykgeworCQkJbGluZXNbaV0gPSAoY2hhciopKHVpbnRwdHJfdClsbzsKKwkJCWxvKys7CisJCX0KKwl9IGVsc2UgeworCQkvKiBkZWZhdWx0IC0gcmVhZCBsaW5lcyBmcm9tIHN0ZGluIG9yIHRoZSBpbnB1dCBmaWxlICovCisJCUZJTEUgKmZwOworCisJCWlmIChhcmdjID4gMSkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKworCQlmcCA9IHhmb3Blbl9zdGRpbihhcmd2WzBdID8gYXJndlswXSA6ICItIik7CisJCWxpbmVzID0gTlVMTDsKKwkJbnVtbGluZXMgPSAwOworCQlmb3IgKDs7KSB7CisJCQljaGFyICpsaW5lID0geG1hbGxvY19mZ2V0bGluZShmcCk7CisJCQlpZiAoIWxpbmUpCisJCQkJYnJlYWs7CisJCQlsaW5lcyA9IHhyZWFsbG9jX3ZlY3RvcihsaW5lcywgNiwgbnVtbGluZXMpOworCQkJbGluZXNbbnVtbGluZXMrK10gPSBsaW5lOworCQl9CisJCWZjbG9zZV9pZl9ub3Rfc3RkaW4oZnApOworCX0KKworCWlmIChudW1saW5lcyAhPSAwKQorCQlzaHVmZmxlX2xpbmVzKGxpbmVzLCBudW1saW5lcyk7CisKKwlpZiAob3B0cyAmIE9QVF9vKQorCQl4bW92ZV9mZCh4b3BlbihvcHRfb19zdHIsIE9fV1JPTkxZfE9fQ1JFQVR8T19UUlVOQyksIFNURE9VVF9GSUxFTk8pOworCisJaWYgKG9wdHMgJiBPUFRfbikgeworCQl1bnNpZ25lZCBtYXhsaW5lczsKKwkJbWF4bGluZXMgPSB4YXRvdShvcHRfbl9zdHIpOworCQlpZiAobnVtbGluZXMgPiBtYXhsaW5lcykKKwkJCW51bWxpbmVzID0gbWF4bGluZXM7CisJfQorCisJZW9sID0gJ1xuJzsKKwlpZiAob3B0cyAmIE9QVF96KQorCQllb2wgPSAnXDAnOworCisJZm9yIChpID0gMDsgaSA8IG51bWxpbmVzOyBpKyspIHsKKwkJaWYgKG9wdHMgJiBPUFRfaSkKKwkJCXByaW50ZigiJXUlYyIsICh1bnNpZ25lZCkodWludHB0cl90KWxpbmVzW2ldLCBlb2wpOworCQllbHNlCisJCQlwcmludGYoIiVzJWMiLCBsaW5lc1tpXSwgZW9sKTsKKwl9CisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KEVYSVRfU1VDQ0VTUyk7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvc2xlZXAuYyBiL2NvcmV1dGlscy9zbGVlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZmJkMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvc2xlZXAuYwpAQCAtMCwwICsxLDEyNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogc2xlZXAgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudCAqLworLyogQkJfQVVESVQgR05VIGlzc3VlcyAtLSBmYW5jeSB2ZXJzaW9uIG1hdGNoZXMgZXhjZXB0IGFyZ3MgbXVzdCBiZSBpbnRzLiAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9zbGVlcC5odG1sICovCisKKy8qIE1hciAxNiwgMjAwMyAgICAgIE1hbnVlbCBOb3ZvYSBJSUkgICAobWpuM0Bjb2RlcG9ldC5vcmcpCisgKgorICogUmV3cml0dGVuIHRvIGRvIHByb3BlciBhcmcgYW5kIGVycm9yIGNoZWNraW5nLgorICogQWxzbywgYWRkZWQgYSAnZmFuY3knIGNvbmZpZ3VyYXRpb24gdG8gYWNjZXB0IG11bHRpcGxlIGFyZ3Mgd2l0aAorICogdGltZSBzdWZmaXhlcyBmb3Igc2Vjb25kcywgbWludXRlcywgaG91cnMsIGFuZCBkYXlzLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzbGVlcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZBTkNZX1NMRUVQKCJbIikgIk4iIElGX0ZFQVRVUkVfRkFOQ1lfU0xFRVAoIl0uLi4iKQorLy91c2FnZTojZGVmaW5lIHNsZWVwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOglJRl9OT1RfRkVBVFVSRV9GQU5DWV9TTEVFUCgiUGF1c2UgZm9yIE4gc2Vjb25kcyIpCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZBTkNZX1NMRUVQKAorLy91c2FnZTogICAgICAgIlBhdXNlIGZvciBhIHRpbWUgZXF1YWwgdG8gdGhlIHRvdGFsIG9mIHRoZSBhcmdzIGdpdmVuLCB3aGVyZSBlYWNoIGFyZyBjYW5cbiIKKy8vdXNhZ2U6ICAgICAgICJoYXZlIGFuIG9wdGlvbmFsIHN1ZmZpeCBvZiAocyllY29uZHMsIChtKWludXRlcywgKGgpb3Vycywgb3IgKGQpYXlzIikKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgc2xlZXBfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgc2xlZXAgMlxuIgorLy91c2FnZTogICAgICAgIlsyIHNlY29uZCBkZWxheSByZXN1bHRzXVxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9GQU5DWV9TTEVFUCgKKy8vdXNhZ2U6ICAgICAgICIkIHNsZWVwIDFkIDNoIDIybSA4c1xuIgorLy91c2FnZTogICAgICAgIls5ODUyOCBzZWNvbmQgZGVsYXkgcmVzdWx0c11cbiIpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBEbyBub3QgbWFrZSB0aGlzIGFwcGxldCBOT0ZPUksuIEl0IGJyZWFrcyBeQy1pbmcgb2YgcGF1c2VzIGluIHNoZWxscyAqLworCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GQU5DWV9TTEVFUCB8fCBFTkFCTEVfRkVBVFVSRV9GTE9BVF9TTEVFUAorc3RhdGljIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCBzZnhbXSA9IHsKKwl7ICJzIiwgMSB9LAorCXsgIm0iLCA2MCB9LAorCXsgImgiLCA2MCo2MCB9LAorCXsgImQiLCAyNCo2MCo2MCB9LAorCXsgIiIsIDAgfQorfTsKKyNlbmRpZgorCitpbnQgc2xlZXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNsZWVwX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKyNpZiBFTkFCTEVfRkVBVFVSRV9GTE9BVF9TTEVFUAorCWRvdWJsZSBkdXJhdGlvbjsKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisjZWxzZQorCXVuc2lnbmVkIGR1cmF0aW9uOworI2VuZGlmCisKKwkrK2FyZ3Y7CisJaWYgKCEqYXJndikKKwkJYmJfc2hvd191c2FnZSgpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkxPQVRfU0xFRVAKKworIyBpZiBFTkFCTEVfTE9DQUxFX1NVUFBPUlQKKwkvKiB1bmRvIGJ1c3lib3guYyBzZXRsb2NhbGUgKi8KKwlzZXRsb2NhbGUoTENfTlVNRVJJQywgIkMiKTsKKyMgZW5kaWYKKwlkdXJhdGlvbiA9IDA7CisJZG8geworCQljaGFyICphcmcgPSAqYXJndjsKKwkJaWYgKHN0cmNocihhcmcsICcuJykpIHsKKwkJCWRvdWJsZSBkOworCQkJY2hhciAqcHA7CisJCQlpbnQgbGVuID0gc3Ryc3BuKGFyZywgIjAxMjM0NTY3ODkuIik7CisJCQljaGFyIHN2ID0gYXJnW2xlbl07CisJCQlhcmdbbGVuXSA9ICdcMCc7CisJCQllcnJubyA9IDA7CisJCQlkID0gc3RydG9kKGFyZywgJnBwKTsKKwkJCWlmIChlcnJubyB8fCAqcHApCisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJYXJnICs9IGxlbjsKKwkJCSphcmctLSA9IHN2OworCQkJc3YgPSAqYXJnOworCQkJKmFyZyA9ICcxJzsKKwkJCWR1cmF0aW9uICs9IGQgKiB4YXRvdWxfc2Z4KGFyZywgc2Z4KTsKKwkJCSphcmcgPSBzdjsKKwkJfSBlbHNlIHsKKwkJCWR1cmF0aW9uICs9IHhhdG91bF9zZngoYXJnLCBzZngpOworCQl9CisJfSB3aGlsZSAoKisrYXJndik7CisKKwl0cy50dl9zZWMgPSBNQVhJTlQodHlwZW9mKHRzLnR2X3NlYykpOworCXRzLnR2X25zZWMgPSAwOworCWlmIChkdXJhdGlvbiA+PSAwICYmIGR1cmF0aW9uIDwgdHMudHZfc2VjKSB7CisJCXRzLnR2X3NlYyA9IGR1cmF0aW9uOworCQl0cy50dl9uc2VjID0gKGR1cmF0aW9uIC0gdHMudHZfc2VjKSAqIDEwMDAwMDAwMDA7CisJfQorCWRvIHsKKwkJZXJybm8gPSAwOworCQluYW5vc2xlZXAoJnRzLCAmdHMpOworCX0gd2hpbGUgKGVycm5vID09IEVJTlRSKTsKKworI2VsaWYgRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfU0xFRVAKKworCWR1cmF0aW9uID0gMDsKKwlkbyB7CisJCWR1cmF0aW9uICs9IHhhdG91X3JhbmdlX3NmeCgqYXJndiwgMCwgVUlOVF9NQVggLSBkdXJhdGlvbiwgc2Z4KTsKKwl9IHdoaWxlICgqKythcmd2KTsKKwlzbGVlcChkdXJhdGlvbik7CisKKyNlbHNlIC8qIHNpbXBsZSAqLworCisJZHVyYXRpb24gPSB4YXRvdSgqYXJndik7CisJc2xlZXAoZHVyYXRpb24pOworCS8vIE9mZi4gSWYgaXQncyByZWFsbHkgbmVlZGVkLCBwcm92aWRlIGV4YW1wbGUgd2h5CisJLy9pZiAoc2xlZXAoZHVyYXRpb24pKSB7CisJLy8JYmJfcGVycm9yX25vbXNnX2FuZF9kaWUoKTsKKwkvL30KKworI2VuZGlmCisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3NvcnQuYyBiL2NvcmV1dGlscy9zb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJlOGJiOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9zb3J0LmMKQEAgLTAsMCArMSw0ODcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFN1UzMgY29tcGxpYW50IHNvcnQgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBNQUlOVEFJTkVSOiBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogU2VlIFN1UzMgc29ydCBzdGFuZGFyZCBhdDoKKyAqIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvc29ydC5odG1sCisgKi8KKworLy91c2FnZTojZGVmaW5lIHNvcnRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstbnJ1IgorLy91c2FnZToJSUZfRkVBVFVSRV9TT1JUX0JJRygiZ01jc3piZGZpbVNUb2t0XSBbLW8gRklMRV0gWy1rIHN0YXJ0Wy5vZmZzZXRdW29wdHNdWyxlbmRbLm9mZnNldF1bb3B0c11dIFstdCBDSEFSIikKKy8vdXNhZ2U6ICAgICAgICJdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBzb3J0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU29ydCBsaW5lcyBvZiB0ZXh0XG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX1NPUlRfQklHKAorLy91c2FnZTogICAgICJcbgktYglJZ25vcmUgbGVhZGluZyBibGFua3MiCisvL3VzYWdlOiAgICAgIlxuCS1jCUNoZWNrIHdoZXRoZXIgaW5wdXQgaXMgc29ydGVkIgorLy91c2FnZTogICAgICJcbgktZAlEaWN0aW9uYXJ5IG9yZGVyIChibGFuayBvciBhbHBoYW51bWVyaWMgb25seSkiCisvL3VzYWdlOiAgICAgIlxuCS1mCUlnbm9yZSBjYXNlIgorLy91c2FnZTogICAgICJcbgktZwlHZW5lcmFsIG51bWVyaWNhbCBzb3J0IgorLy91c2FnZTogICAgICJcbgktaQlJZ25vcmUgdW5wcmludGFibGUgY2hhcmFjdGVycyIKKy8vdXNhZ2U6ICAgICAiXG4JLU0JU29ydCBtb250aCIKKy8vdXNhZ2U6CSkKKy8vLWgsIC0taHVtYW4tbnVtZXJpYy1zb3J0OiBjb21wYXJlIGh1bWFuIHJlYWRhYmxlIG51bWJlcnMgKGUuZy4sIDJLIDFHKQorLy91c2FnZTogICAgICJcbgktbglTb3J0IG51bWJlcnMiCisvL3VzYWdlOglJRl9GRUFUVVJFX1NPUlRfQklHKAorLy91c2FnZTogICAgICJcbgktbwlPdXRwdXQgdG8gZmlsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXQgQ0hBUglGaWVsZCBzZXBhcmF0b3IiCisvL3VzYWdlOiAgICAgIlxuCS1rIE5bLE1dIFNvcnQgYnkgTnRoIGZpZWxkIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktcglSZXZlcnNlIHNvcnQgb3JkZXIiCisvL3VzYWdlOglJRl9GRUFUVVJFX1NPUlRfQklHKAorLy91c2FnZTogICAgICJcbgktcwlTdGFibGUgKGRvbid0IHNvcnQgdGllcyBhbHBoYWJldGljYWxseSkiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS11CVN1cHByZXNzIGR1cGxpY2F0ZSBsaW5lcyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU09SVF9CSUcoCisvL3VzYWdlOiAgICAgIlxuCS16CUxpbmVzIGFyZSB0ZXJtaW5hdGVkIGJ5IE5VTCwgbm90IG5ld2xpbmUiCisvL3VzYWdlOiAgICAgIlxuCS1tU1QJSWdub3JlZCBmb3IgR05VIGNvbXBhdGliaWxpdHkiKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBzb3J0X2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGVjaG8gLWUgXCJlXFxuZlxcbmJcXG5kXFxuY1xcbmFcIiB8IHNvcnRcbiIKKy8vdXNhZ2U6ICAgICAgICJhXG4iCisvL3VzYWdlOiAgICAgICAiYlxuIgorLy91c2FnZTogICAgICAgImNcbiIKKy8vdXNhZ2U6ICAgICAgICJkXG4iCisvL3VzYWdlOiAgICAgICAiZVxuIgorLy91c2FnZTogICAgICAgImZcbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU09SVF9CSUcoCisvL3VzYWdlOgkJIiQgZWNobyAtZSBcImMgM1xcbmIgMlxcbmQgMlwiIHwgJFNPUlQgLWsgMiwybiAtayAxLDFyXG4iCisvL3VzYWdlOgkJImQgMlxuIgorLy91c2FnZToJCSJiIDJcbiIKKy8vdXNhZ2U6CQkiYyAzXG4iCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgICAiIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworCisvKgorCXNvcnQgWy1tXVstbyBvdXRwdXRdWy1iZGZpbnJ1XVstdCBjaGFyXVstayBrZXlkZWZdLi4uIFtmaWxlLi4uXQorCXNvcnQgLWMgWy1iZGZpbnJ1XVstdCBjaGFyXVstayBrZXlkZWZdW2ZpbGVdCisqLworCisvKiBUaGVzZSBhcmUgc29ydCB0eXBlcyAqLworc3RhdGljIGNvbnN0IGNoYXIgT1BUX1NUUltdIEFMSUdOMSA9ICJuZ011Y3N6YnJkZmltUzpUOm86azp0OiI7CitlbnVtIHsKKwlGTEFHX24gID0gMSwgICAgICAgICAgICAvKiBOdW1lcmljIHNvcnQgKi8KKwlGTEFHX2cgID0gMiwgICAgICAgICAgICAvKiBTb3J0IHVzaW5nIHN0cnRvZCgpICovCisJRkxBR19NICA9IDQsICAgICAgICAgICAgLyogU29ydCBkYXRlICovCisvKiB1Y3N6IGFwcGx5IHRvIHJvb3QgbGV2ZWwgb25seSwgbm90IGtleXMuICBiIGF0IHJvb3QgbGV2ZWwgaW1wbGllcyBiYiAqLworCUZMQUdfdSAgPSA4LCAgICAgICAgICAgIC8qIFVuaXF1ZSAqLworCUZMQUdfYyAgPSAweDEwLCAgICAgICAgIC8qIENoZWNrOiBubyBvdXRwdXQsIGV4aXQoIW9yZGVyZWQpICovCisJRkxBR19zICA9IDB4MjAsICAgICAgICAgLyogU3RhYmxlIHNvcnQsIG5vIGFzY2lpIGZhbGxiYWNrIGF0IGVuZCAqLworCUZMQUdfeiAgPSAweDQwLCAgICAgICAgIC8qIElucHV0IGFuZCBvdXRwdXQgaXMgTlVMIHRlcm1pbmF0ZWQsIG5vdCBcbiAqLworLyogVGhlc2UgY2FuIGJlIGFwcGxpZWQgdG8gc2VhcmNoIGtleXMsIHRoZSBwcmV2aW91cyBmb3VyIGNhbid0ICovCisJRkxBR19iICA9IDB4ODAsICAgICAgICAgLyogSWdub3JlIGxlYWRpbmcgYmxhbmtzICovCisJRkxBR19yICA9IDB4MTAwLCAgICAgICAgLyogUmV2ZXJzZSAqLworCUZMQUdfZCAgPSAweDIwMCwgICAgICAgIC8qIElnbm9yZSAhKGlzYWxudW0oKXxpc3NwYWNlKCkpICovCisJRkxBR19mICA9IDB4NDAwLCAgICAgICAgLyogRm9yY2UgdXBwZXJjYXNlICovCisJRkxBR19pICA9IDB4ODAwLCAgICAgICAgLyogSWdub3JlICFpc3ByaW50KCkgKi8KKwlGTEFHX20gID0gMHgxMDAwLCAgICAgICAvKiBpZ25vcmVkOiBtZXJnZSBhbHJlYWR5IHNvcnRlZCBmaWxlczsgZG8gbm90IHNvcnQgKi8KKwlGTEFHX1MgID0gMHgyMDAwLCAgICAgICAvKiBpZ25vcmVkOiAtUywgLS1idWZmZXItc2l6ZT1TSVpFICovCisJRkxBR19UICA9IDB4NDAwMCwgICAgICAgLyogaWdub3JlZDogLVQsIC0tdGVtcG9yYXJ5LWRpcmVjdG9yeT1ESVIgKi8KKwlGTEFHX28gID0gMHg4MDAwLAorCUZMQUdfayAgPSAweDEwMDAwLAorCUZMQUdfdCAgPSAweDIwMDAwLAorCUZMQUdfYmIgPSAweDgwMDAwMDAwLCAgIC8qIElnbm9yZSB0cmFpbGluZyBibGFua3MgICovCit9OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU09SVF9CSUcKK3N0YXRpYyBjaGFyIGtleV9zZXBhcmF0b3I7CisKK3N0YXRpYyBzdHJ1Y3Qgc29ydF9rZXkgeworCXN0cnVjdCBzb3J0X2tleSAqbmV4dF9rZXk7ICAvKiBsaW5rZWQgbGlzdCAqLworCXVuc2lnbmVkIHJhbmdlWzRdOyAgICAgICAgICAvKiBzdGFydCB3b3JkLCBzdGFydCBjaGFyLCBlbmQgd29yZCwgZW5kIGNoYXIgKi8KKwl1bnNpZ25lZCBmbGFnczsKK30gKmtleV9saXN0OworCitzdGF0aWMgY2hhciAqZ2V0X2tleShjaGFyICpzdHIsIHN0cnVjdCBzb3J0X2tleSAqa2V5LCBpbnQgZmxhZ3MpCit7CisJaW50IHN0YXJ0ID0gc3RhcnQ7IC8qIGZvciBjb21waWxlciAqLworCWludCBlbmQ7CisJaW50IGxlbiwgajsKKwl1bnNpZ25lZCBpOworCisJLyogU3BlY2lhbCBjYXNlIHdob2xlIHN0cmluZywgc28gd2UgZG9uJ3QgaGF2ZSB0byBtYWtlIGEgY29weSAqLworCWlmIChrZXktPnJhbmdlWzBdID09IDEgJiYgIWtleS0+cmFuZ2VbMV0gJiYgIWtleS0+cmFuZ2VbMl0gJiYgIWtleS0+cmFuZ2VbM10KKwkgJiYgIShmbGFncyAmIChGTEFHX2IgfCBGTEFHX2QgfCBGTEFHX2YgfCBGTEFHX2kgfCBGTEFHX2JiKSkKKwkpIHsKKwkJcmV0dXJuIHN0cjsKKwl9CisKKwkvKiBGaW5kIHN0YXJ0IG9mIGtleSBvbiBmaXJzdCBwYXNzLCBlbmQgb24gc2Vjb25kIHBhc3MgKi8KKwlsZW4gPSBzdHJsZW4oc3RyKTsKKwlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisJCWlmICgha2V5LT5yYW5nZVsyKmpdKQorCQkJZW5kID0gbGVuOworCQkvKiBMb29wIHRocm91Z2ggZmllbGRzICovCisJCWVsc2UgeworCQkJdW5zaWduZWQgY2hhciBjaCA9IDA7CisKKwkJCWVuZCA9IDA7CisJCQlmb3IgKGkgPSAxOyBpIDwga2V5LT5yYW5nZVsyKmpdICsgajsgaSsrKSB7CisJCQkJaWYgKGtleV9zZXBhcmF0b3IpIHsKKwkJCQkJLyogU2tpcCBib2R5IG9mIGtleSBhbmQgc2VwYXJhdG9yICovCisJCQkJCXdoaWxlICgoY2ggPSBzdHJbZW5kXSkgIT0gJ1wwJykgeworCQkJCQkJCWVuZCsrOworCQkJCQkJaWYgKGNoID09IGtleV9zZXBhcmF0b3IpCisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQkvKiBTa2lwIGxlYWRpbmcgYmxhbmtzICovCisJCQkJCXdoaWxlIChpc3NwYWNlKHN0cltlbmRdKSkKKwkJCQkJCWVuZCsrOworCQkJCQkvKiBTa2lwIGJvZHkgb2Yga2V5ICovCisJCQkJCXdoaWxlIChzdHJbZW5kXSAhPSAnXDAnKSB7CisJCQkJCQlpZiAoaXNzcGFjZShzdHJbZW5kXSkpCisJCQkJCQkJYnJlYWs7CisJCQkJCQllbmQrKzsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCS8qIFJlbW92ZSBsYXN0IGRlbGltOiAiYWJjOmRlZjoiID0+ICJhYmM6ZGVmIiAqLworCQkJaWYgKGogJiYgY2gpIHsKKwkJCQkvL2lmIChzdHJbZW5kLTFdICE9IGtleV9zZXBhcmF0b3IpCisJCQkJLy8gIGJiX2Vycm9yX21zZyhfYW5kX2RpZSgiQlVHISAiCisJCQkJLy8gICJzdHJbc3RhcnQ6JWQsZW5kOiVkXTonJS4qcyciLAorCQkJCS8vICBzdGFydCwgZW5kLCAoaW50KShlbmQtc3RhcnQpLCAmc3RyW3N0YXJ0XSk7CisJCQkJZW5kLS07CisJCQl9CisJCX0KKwkJaWYgKCFqKSBzdGFydCA9IGVuZDsKKwl9CisJLyogU3RyaXAgbGVhZGluZyB3aGl0ZXNwYWNlIGlmIG5lY2Vzc2FyeSAqLworLy9YWFg6IHNraXBfd2hpdGVzcGFjZSgpCisJaWYgKGZsYWdzICYgRkxBR19iKQorCQl3aGlsZSAoaXNzcGFjZShzdHJbc3RhcnRdKSkgc3RhcnQrKzsKKwkvKiBTdHJpcCB0cmFpbGluZyB3aGl0ZXNwYWNlIGlmIG5lY2Vzc2FyeSAqLworCWlmIChmbGFncyAmIEZMQUdfYmIpCisJCXdoaWxlIChlbmQgPiBzdGFydCAmJiBpc3NwYWNlKHN0cltlbmQtMV0pKSBlbmQtLTsKKwkvKiBIYW5kbGUgb2Zmc2V0cyBvbiBzdGFydCBhbmQgZW5kICovCisJaWYgKGtleS0+cmFuZ2VbM10pIHsKKwkJZW5kICs9IGtleS0+cmFuZ2VbM10gLSAxOworCQlpZiAoZW5kID4gbGVuKSBlbmQgPSBsZW47CisJfQorCWlmIChrZXktPnJhbmdlWzFdKSB7CisJCXN0YXJ0ICs9IGtleS0+cmFuZ2VbMV0gLSAxOworCQlpZiAoc3RhcnQgPiBsZW4pIHN0YXJ0ID0gbGVuOworCX0KKwkvKiBNYWtlIHRoZSBjb3B5ICovCisJaWYgKGVuZCA8IHN0YXJ0KQorCQllbmQgPSBzdGFydDsKKwlzdHIgPSB4c3RybmR1cChzdHIrc3RhcnQsIGVuZC1zdGFydCk7CisJLyogSGFuZGxlIC1kICovCisJaWYgKGZsYWdzICYgRkxBR19kKSB7CisJCWZvciAoc3RhcnQgPSBlbmQgPSAwOyBzdHJbZW5kXTsgZW5kKyspCisJCQlpZiAoaXNzcGFjZShzdHJbZW5kXSkgfHwgaXNhbG51bShzdHJbZW5kXSkpCisJCQkJc3RyW3N0YXJ0KytdID0gc3RyW2VuZF07CisJCXN0cltzdGFydF0gPSAnXDAnOworCX0KKwkvKiBIYW5kbGUgLWkgKi8KKwlpZiAoZmxhZ3MgJiBGTEFHX2kpIHsKKwkJZm9yIChzdGFydCA9IGVuZCA9IDA7IHN0cltlbmRdOyBlbmQrKykKKwkJCWlmIChpc3ByaW50X2FzY2lpb25seShzdHJbZW5kXSkpCisJCQkJc3RyW3N0YXJ0KytdID0gc3RyW2VuZF07CisJCXN0cltzdGFydF0gPSAnXDAnOworCX0KKwkvKiBIYW5kbGUgLWYgKi8KKwlpZiAoZmxhZ3MgJiBGTEFHX2YpCisJCWZvciAoaSA9IDA7IHN0cltpXTsgaSsrKQorCQkJc3RyW2ldID0gdG91cHBlcihzdHJbaV0pOworCisJcmV0dXJuIHN0cjsKK30KKworc3RhdGljIHN0cnVjdCBzb3J0X2tleSAqYWRkX2tleSh2b2lkKQoreworCXN0cnVjdCBzb3J0X2tleSAqKnBrZXkgPSAma2V5X2xpc3Q7CisJd2hpbGUgKCpwa2V5KQorCQlwa2V5ID0gJigoKnBrZXkpLT5uZXh0X2tleSk7CisJcmV0dXJuICpwa2V5ID0geHphbGxvYyhzaXplb2Yoc3RydWN0IHNvcnRfa2V5KSk7Cit9CisKKyNkZWZpbmUgR0VUX0xJTkUoZnApIFwKKwkoKG9wdGlvbl9tYXNrMzIgJiBGTEFHX3opIFwKKwk/IGJiX2dldF9jaHVua19mcm9tX2ZpbGUoZnAsIE5VTEwpIFwKKwk6IHhtYWxsb2NfZmdldGxpbmUoZnApKQorI2Vsc2UKKyNkZWZpbmUgR0VUX0xJTkUoZnApIHhtYWxsb2NfZmdldGxpbmUoZnApCisjZW5kaWYKKworLyogSXRlcmF0ZSB0aHJvdWdoIGtleXMgbGlzdCBhbmQgcGVyZm9ybSBjb21wYXJpc29ucyAqLworc3RhdGljIGludCBjb21wYXJlX2tleXMoY29uc3Qgdm9pZCAqeGFyZywgY29uc3Qgdm9pZCAqeWFyZykKK3sKKwlpbnQgZmxhZ3MgPSBvcHRpb25fbWFzazMyLCByZXR2YWwgPSAwOworCWNoYXIgKngsICp5OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU09SVF9CSUcKKwlzdHJ1Y3Qgc29ydF9rZXkgKmtleTsKKworCWZvciAoa2V5ID0ga2V5X2xpc3Q7ICFyZXR2YWwgJiYga2V5OyBrZXkgPSBrZXktPm5leHRfa2V5KSB7CisJCWZsYWdzID0ga2V5LT5mbGFncyA/IGtleS0+ZmxhZ3MgOiBvcHRpb25fbWFzazMyOworCQkvKiBDaG9wIG91dCBhbmQgbW9kaWZ5IGtleSBjaHVua3MsIGhhbmRsaW5nIC1kZmliICovCisJCXggPSBnZXRfa2V5KCooY2hhciAqKil4YXJnLCBrZXksIGZsYWdzKTsKKwkJeSA9IGdldF9rZXkoKihjaGFyICoqKXlhcmcsIGtleSwgZmxhZ3MpOworI2Vsc2UKKwkvKiBUaGlzIGN1cmx5IGJyYWNrZXQgc2VydmVzIG5vIHB1cnBvc2UgYnV0IHRvIG1hdGNoIHRoZSBuZXN0aW5nCisJICogbGV2ZWwgb2YgdGhlIGZvciAoKSBsb29wIHdlJ3JlIG5vdCB1c2luZyAqLworCXsKKwkJeCA9ICooY2hhciAqKil4YXJnOworCQl5ID0gKihjaGFyICoqKXlhcmc7CisjZW5kaWYKKwkJLyogUGVyZm9ybSBhY3R1YWwgY29tcGFyaXNvbiAqLworCQlzd2l0Y2ggKGZsYWdzICYgKEZMQUdfbiB8IEZMQUdfTSB8IEZMQUdfZykpIHsKKwkJZGVmYXVsdDoKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duIHNvcnQgdHlwZSIpOworCQkJYnJlYWs7CisJCS8qIEFzY2lpIHNvcnQgKi8KKwkJY2FzZSAwOgorI2lmIEVOQUJMRV9MT0NBTEVfU1VQUE9SVAorCQkJcmV0dmFsID0gc3RyY29sbCh4LCB5KTsKKyNlbHNlCisJCQlyZXR2YWwgPSBzdHJjbXAoeCwgeSk7CisjZW5kaWYKKwkJCWJyZWFrOworI2lmIEVOQUJMRV9GRUFUVVJFX1NPUlRfQklHCisJCWNhc2UgRkxBR19nOiB7CisJCQljaGFyICp4eCwgKnl5OworCQkJZG91YmxlIGR4ID0gc3RydG9kKHgsICZ4eCk7CisJCQlkb3VibGUgZHkgPSBzdHJ0b2QoeSwgJnl5KTsKKwkJCS8qIG5vdCBudW1iZXJzIDwgTmFOIDwgLWluZmluaXR5IDwgbnVtYmVycyA8ICtpbmZpbml0eSkgKi8KKwkJCWlmICh4ID09IHh4KQorCQkJCXJldHZhbCA9ICh5ID09IHl5ID8gMCA6IC0xKTsKKwkJCWVsc2UgaWYgKHkgPT0geXkpCisJCQkJcmV0dmFsID0gMTsKKwkJCS8qIENoZWNrIGZvciBpc25hbiAqLworCQkJZWxzZSBpZiAoZHggIT0gZHgpCisJCQkJcmV0dmFsID0gKGR5ICE9IGR5KSA/IDAgOiAtMTsKKwkJCWVsc2UgaWYgKGR5ICE9IGR5KQorCQkJCXJldHZhbCA9IDE7CisJCQkvKiBDaGVjayBmb3IgaW5maW5pdHkuICBDb3VsZCB1bmRlcmZsb3csIGJ1dCBpdCBhdm9pZHMgbGlibS4gKi8KKwkJCWVsc2UgaWYgKDEuMCAvIGR4ID09IDAuMCkgeworCQkJCWlmIChkeCA8IDApCisJCQkJCXJldHZhbCA9ICgxLjAgLyBkeSA9PSAwLjAgJiYgZHkgPCAwKSA/IDAgOiAtMTsKKwkJCQllbHNlCisJCQkJCXJldHZhbCA9ICgxLjAgLyBkeSA9PSAwLjAgJiYgZHkgPiAwKSA/IDAgOiAxOworCQkJfSBlbHNlIGlmICgxLjAgLyBkeSA9PSAwLjApCisJCQkJcmV0dmFsID0gKGR5IDwgMCkgPyAxIDogLTE7CisJCQllbHNlCisJCQkJcmV0dmFsID0gKGR4ID4gZHkpID8gMSA6ICgoZHggPCBkeSkgPyAtMSA6IDApOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBGTEFHX006IHsKKwkJCXN0cnVjdCB0bSB0aHltZTsKKwkJCWludCBkeDsKKwkJCWNoYXIgKnh4LCAqeXk7CisKKwkJCXh4ID0gc3RycHRpbWUoeCwgIiViIiwgJnRoeW1lKTsKKwkJCWR4ID0gdGh5bWUudG1fbW9uOworCQkJeXkgPSBzdHJwdGltZSh5LCAiJWIiLCAmdGh5bWUpOworCQkJaWYgKCF4eCkKKwkJCQlyZXR2YWwgPSAoIXl5KSA/IDAgOiAtMTsKKwkJCWVsc2UgaWYgKCF5eSkKKwkJCQlyZXR2YWwgPSAxOworCQkJZWxzZQorCQkJCXJldHZhbCA9IChkeCA9PSB0aHltZS50bV9tb24pID8gMCA6IGR4IC0gdGh5bWUudG1fbW9uOworCQkJYnJlYWs7CisJCX0KKwkJLyogRnVsbCBmbG9hdGluZyBwb2ludCB2ZXJzaW9uIG9mIC1uICovCisJCWNhc2UgRkxBR19uOiB7CisJCQlkb3VibGUgZHggPSBhdG9mKHgpOworCQkJZG91YmxlIGR5ID0gYXRvZih5KTsKKwkJCXJldHZhbCA9IChkeCA+IGR5KSA/IDEgOiAoKGR4IDwgZHkpID8gLTEgOiAwKTsKKwkJCWJyZWFrOworCQl9CisJCX0gLyogc3dpdGNoICovCisJCS8qIEZyZWUga2V5IGNvcGllcy4gKi8KKwkJaWYgKHggIT0gKihjaGFyICoqKXhhcmcpIGZyZWUoeCk7CisJCWlmICh5ICE9ICooY2hhciAqKil5YXJnKSBmcmVlKHkpOworCQkvKiBpZiAocmV0dmFsKSBicmVhazsgLSBkb25lIGJ5IGZvciAoKSBhbnl3YXkgKi8KKyNlbHNlCisJCS8qIEludGVnZXIgdmVyc2lvbiBvZiAtbiBmb3IgdGlueSBzeXN0ZW1zICovCisJCWNhc2UgRkxBR19uOgorCQkJcmV0dmFsID0gYXRvaSh4KSAtIGF0b2koeSk7CisJCQlicmVhazsKKwkJfSAvKiBzd2l0Y2ggKi8KKyNlbmRpZgorCX0gLyogZm9yICovCisKKwkvKiBQZXJmb3JtIGZhbGxiYWNrIHNvcnQgaWYgbmVjZXNzYXJ5ICovCisJaWYgKCFyZXR2YWwgJiYgIShvcHRpb25fbWFzazMyICYgRkxBR19zKSkgeworCQlyZXR2YWwgPSBzdHJjbXAoKihjaGFyICoqKXhhcmcsICooY2hhciAqKil5YXJnKTsKKwkJZmxhZ3MgPSBvcHRpb25fbWFzazMyOworCX0KKworCWlmIChmbGFncyAmIEZMQUdfcikKKwkJcmV0dXJuIC1yZXR2YWw7CisKKwlyZXR1cm4gcmV0dmFsOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU09SVF9CSUcKK3N0YXRpYyB1bnNpZ25lZCBzdHIydShjaGFyICoqc3RyKQoreworCXVuc2lnbmVkIGxvbmcgbHU7CisJaWYgKCFpc2RpZ2l0KCgqc3RyKVswXSkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgZmllbGQgc3BlY2lmaWNhdGlvbiIpOworCWx1ID0gc3RydG91bCgqc3RyLCBzdHIsIDEwKTsKKwlpZiAoKHNpemVvZihsb25nKSA+IHNpemVvZihpbnQpICYmIGx1ID4gSU5UX01BWCkgfHwgIWx1KQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIGZpZWxkIHNwZWNpZmljYXRpb24iKTsKKwlyZXR1cm4gbHU7Cit9CisjZW5kaWYKKworaW50IHNvcnRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNvcnRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKmxpbmUsICoqbGluZXM7CisJY2hhciAqc3RyX2lnbm9yZWQsICpzdHJfbywgKnN0cl90OworCWxsaXN0X3QgKmxzdF9rID0gTlVMTDsKKwlpbnQgaSwgZmxhZzsKKwlpbnQgbGluZWNvdW50OworCXVuc2lnbmVkIG9wdHM7CisKKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSAyOworCisJLyogUGFyc2UgY29tbWFuZCBsaW5lIG9wdGlvbnMgKi8KKwkvKiAtbyBhbmQgLXQgY2FuIGJlIGdpdmVuIGF0IG1vc3Qgb25jZSAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIm8tLW86dC0tdDoiIC8qIC10LCAtbzogYXQgbW9zdCBvbmUgb2YgZWFjaCAqLworCQkJIms6OiI7IC8qIC1rIHRha2VzIGxpc3QgKi8KKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgT1BUX1NUUiwgJnN0cl9pZ25vcmVkLCAmc3RyX2lnbm9yZWQsICZzdHJfbywgJmxzdF9rLCAmc3RyX3QpOworCS8qIGdsb2JhbCBiIHN0cmlwcyBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMgKi8KKwlpZiAob3B0cyAmIEZMQUdfYikKKwkJb3B0aW9uX21hc2szMiB8PSBGTEFHX2JiOworI2lmIEVOQUJMRV9GRUFUVVJFX1NPUlRfQklHCisJaWYgKG9wdHMgJiBGTEFHX3QpIHsKKwkJaWYgKCFzdHJfdFswXSB8fCBzdHJfdFsxXSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgLXQgcGFyYW1ldGVyIik7CisJCWtleV9zZXBhcmF0b3IgPSBzdHJfdFswXTsKKwl9CisJLyogbm90ZTogYmVsb3cgdGhpcyBwb2ludCB3ZSB1c2Ugb3B0aW9uX21hc2szMiwgbm90IG9wdHMsCisJICogc2luY2UgdGhhdCByZWR1Y2VzIHJlZ2lzdGVyIHByZXNzdXJlIGFuZCBtYWtlcyBjb2RlIHNtYWxsZXIgKi8KKworCS8qIHBhcnNlIHNvcnQga2V5ICovCisJd2hpbGUgKGxzdF9rKSB7CisJCWVudW0geworCQkJRkxBR19hbGxvd2VkX2Zvcl9rID0KKwkJCQlGTEFHX24gfCAvKiBOdW1lcmljIHNvcnQgKi8KKwkJCQlGTEFHX2cgfCAvKiBTb3J0IHVzaW5nIHN0cnRvZCgpICovCisJCQkJRkxBR19NIHwgLyogU29ydCBkYXRlICovCisJCQkJRkxBR19iIHwgLyogSWdub3JlIGxlYWRpbmcgYmxhbmtzICovCisJCQkJRkxBR19yIHwgLyogUmV2ZXJzZSAqLworCQkJCUZMQUdfZCB8IC8qIElnbm9yZSAhKGlzYWxudW0oKXxpc3NwYWNlKCkpICovCisJCQkJRkxBR19mIHwgLyogRm9yY2UgdXBwZXJjYXNlICovCisJCQkJRkxBR19pIHwgLyogSWdub3JlICFpc3ByaW50KCkgKi8KKwkJCTAKKwkJfTsKKwkJc3RydWN0IHNvcnRfa2V5ICprZXkgPSBhZGRfa2V5KCk7CisJCWNoYXIgKnN0cl9rID0gbGxpc3RfcG9wKCZsc3Rfayk7CisKKwkJaSA9IDA7IC8qIGk9PTAgYmVmb3JlIGNvbW1hLCAxIGFmdGVyICgtazMsNikgKi8KKwkJd2hpbGUgKCpzdHJfaykgeworCQkJLyogU3RhcnQgb2YgcmFuZ2UgKi8KKwkJCS8qIENhbm5vdCB1c2UgYmJfc3RydG91IC0gc3VmZml4IGNhbiBiZSBhIGxldHRlciAqLworCQkJa2V5LT5yYW5nZVsyKmldID0gc3RyMnUoJnN0cl9rKTsKKwkJCWlmICgqc3RyX2sgPT0gJy4nKSB7CisJCQkJc3RyX2srKzsKKwkJCQlrZXktPnJhbmdlWzIqaSsxXSA9IHN0cjJ1KCZzdHJfayk7CisJCQl9CisJCQl3aGlsZSAoKnN0cl9rKSB7CisJCQkJY29uc3QgY2hhciAqdGVtcDI7CisKKwkJCQlpZiAoKnN0cl9rID09ICcsJyAmJiAhaSsrKSB7CisJCQkJCXN0cl9rKys7CisJCQkJCWJyZWFrOworCQkJCX0gLyogbm8gZWxzZSBuZWVkZWQ6IGZhbGwgdGhyb3VnaCB0byBzeW50YXggZXJyb3IKKwkJCQkJYmVjYXVzZSBjb21tYSBpc24ndCBpbiBPUFRfU1RSICovCisJCQkJdGVtcDIgPSBzdHJjaHIoT1BUX1NUUiwgKnN0cl9rKTsKKwkJCQlpZiAoIXRlbXAyKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biBrZXkgb3B0aW9uIik7CisJCQkJZmxhZyA9IDEgPDwgKHRlbXAyIC0gT1BUX1NUUik7CisJCQkJaWYgKGZsYWcgJiB+RkxBR19hbGxvd2VkX2Zvcl9rKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biBzb3J0IHR5cGUiKTsKKwkJCQkvKiBiIGFmdGVyICcsJyBtZWFucyBzdHJpcCBfdHJhaWxpbmdfIHNwYWNlICovCisJCQkJaWYgKGkgJiYgZmxhZyA9PSBGTEFHX2IpCisJCQkJCWZsYWcgPSBGTEFHX2JiOworCQkJCWtleS0+ZmxhZ3MgfD0gZmxhZzsKKwkJCQlzdHJfaysrOworCQkJfQorCQl9CisJfQorI2VuZGlmCisKKwkvKiBPcGVuIGlucHV0IGZpbGVzIGFuZCByZWFkIGRhdGEgKi8KKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoISphcmd2KQorCQkqLS1hcmd2ID0gKGNoYXIqKSItIjsKKwlsaW5lY291bnQgPSAwOworCWxpbmVzID0gTlVMTDsKKwlkbyB7CisJCS8qIGNvcmV1dGlscyA2LjkgY29tcGF0OiBhYm9ydCBvbiBmaXJzdCBvcGVuIGVycm9yLAorCQkgKiBkbyBub3QgY29udGludWUgdG8gbmV4dCBmaWxlOiAqLworCQlGSUxFICpmcCA9IHhmb3Blbl9zdGRpbigqYXJndik7CisJCWZvciAoOzspIHsKKwkJCWxpbmUgPSBHRVRfTElORShmcCk7CisJCQlpZiAoIWxpbmUpCisJCQkJYnJlYWs7CisJCQlsaW5lcyA9IHhyZWFsbG9jX3ZlY3RvcihsaW5lcywgNiwgbGluZWNvdW50KTsKKwkJCWxpbmVzW2xpbmVjb3VudCsrXSA9IGxpbmU7CisJCX0KKwkJZmNsb3NlX2lmX25vdF9zdGRpbihmcCk7CisJfSB3aGlsZSAoKisrYXJndik7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TT1JUX0JJRworCS8qIGlmIG5vIGtleSwgcGVyZm9ybSBhbHBoYWJldGljIHNvcnQgKi8KKwlpZiAoIWtleV9saXN0KQorCQlhZGRfa2V5KCktPnJhbmdlWzBdID0gMTsKKwkvKiBoYW5kbGUgLWMgKi8KKwlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfYykgeworCQlpbnQgaiA9IChvcHRpb25fbWFzazMyICYgRkxBR191KSA/IC0xIDogMDsKKwkJZm9yIChpID0gMTsgaSA8IGxpbmVjb3VudDsgaSsrKSB7CisJCQlpZiAoY29tcGFyZV9rZXlzKCZsaW5lc1tpLTFdLCAmbGluZXNbaV0pID4gaikgeworCQkJCWZwcmludGYoc3RkZXJyLCAiQ2hlY2sgbGluZSAldVxuIiwgaSk7CisJCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKyNlbmRpZgorCS8qIFBlcmZvcm0gdGhlIGFjdHVhbCBzb3J0ICovCisJcXNvcnQobGluZXMsIGxpbmVjb3VudCwgc2l6ZW9mKGxpbmVzWzBdKSwgY29tcGFyZV9rZXlzKTsKKwkvKiBoYW5kbGUgLXUgKi8KKwlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfdSkgeworCQlmbGFnID0gMDsKKwkJLyogY29yZXV0aWxzIDYuMyBkcm9wIGxpbmVzIGZvciB3aGljaCBvbmx5IGtleSBpcyB0aGUgc2FtZSAqLworCQkvKiAtLSBkaXNhYmxpbmcgbGFzdC1yZXNvcnQgY29tcGFyZS4uLiAqLworCQlvcHRpb25fbWFzazMyIHw9IEZMQUdfczsKKwkJZm9yIChpID0gMTsgaSA8IGxpbmVjb3VudDsgaSsrKSB7CisJCQlpZiAoY29tcGFyZV9rZXlzKCZsaW5lc1tmbGFnXSwgJmxpbmVzW2ldKSA9PSAwKQorCQkJCWZyZWUobGluZXNbaV0pOworCQkJZWxzZQorCQkJCWxpbmVzWysrZmxhZ10gPSBsaW5lc1tpXTsKKwkJfQorCQlpZiAobGluZWNvdW50KQorCQkJbGluZWNvdW50ID0gZmxhZysxOworCX0KKworCS8qIFByaW50IGl0ICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfU09SVF9CSUcKKwkvKiBPcGVuIG91dHB1dCBmaWxlIF9hZnRlcl8gd2UgcmVhZCBhbGwgaW5wdXQgb25lcyAqLworCWlmIChvcHRpb25fbWFzazMyICYgRkxBR19vKQorCQl4bW92ZV9mZCh4b3BlbihzdHJfbywgT19XUk9OTFl8T19DUkVBVHxPX1RSVU5DKSwgU1RET1VUX0ZJTEVOTyk7CisjZW5kaWYKKwlmbGFnID0gKG9wdGlvbl9tYXNrMzIgJiBGTEFHX3opID8gJ1wwJyA6ICdcbic7CisJZm9yIChpID0gMDsgaSA8IGxpbmVjb3VudDsgaSsrKQorCQlwcmludGYoIiVzJWMiLCBsaW5lc1tpXSwgZmxhZyk7CisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KEVYSVRfU1VDQ0VTUyk7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvc3BsaXQuYyBiL2NvcmV1dGlscy9zcGxpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMTY3M2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvc3BsaXQuYwpAQCAtMCwwICsxLDE1NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogc3BsaXQgLSBzcGxpdCBhIGZpbGUgaW50byBwaWVjZXMKKyAqIENvcHlyaWdodCAoYykgMjAwNyBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisvKiBCQl9BVURJVDogU1VTdjMgY29tcGxpYW50CisgKiBTVVN2MyByZXF1aXJlbWVudHM6CisgKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDk2OTUzOTkvdXRpbGl0aWVzL3NwbGl0Lmh0bWwKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgc3BsaXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbSU5QVVQgW1BSRUZJWF1dIgorLy91c2FnZTojZGVmaW5lIHNwbGl0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1iIE5ba3xtXQlTcGxpdCBieSBOIChraWxvfG1lZ2EpYnl0ZXMiCisvL3VzYWdlOiAgICAgIlxuCS1sIE4JCVNwbGl0IGJ5IE4gbGluZXMiCisvL3VzYWdlOiAgICAgIlxuCS1hIE4JCVVzZSBOIGxldHRlcnMgYXMgc3VmZml4IgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBzcGxpdF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBzcGxpdCBUT0RPIGZvb1xuIgorLy91c2FnZTogICAgICAgIiQgY2F0IFRPRE8gfCBzcGxpdCAtYSAyIC1sIDIgVE9ET19cbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TUExJVF9GQU5DWQorc3RhdGljIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCBzcGxpdF9zdWZmaXhlc1tdID0geworCXsgImIiLCA1MTIgfSwKKwl7ICJrIiwgMTAyNCB9LAorCXsgIm0iLCAxMDI0KjEwMjQgfSwKKwl7ICJnIiwgMTAyNCoxMDI0KjEwMjQgfSwKKwl7ICIiLCAwIH0KK307CisjZW5kaWYKKworLyogSW5jcmVtZW50IHRoZSBzdWZmaXggcGFydCBvZiB0aGUgZmlsZW5hbWUuCisgKiBSZXR1cm5zIE5VTEwgaWYgd2UgYXJlIG91dCBvZiBmaWxlbmFtZXMuCisgKi8KK3N0YXRpYyBjaGFyICpuZXh0X2ZpbGUoY2hhciAqb2xkLCB1bnNpZ25lZCBzdWZmaXhfbGVuKQoreworCXNpemVfdCBlbmQgPSBzdHJsZW4ob2xkKTsKKwl1bnNpZ25lZCBpID0gMTsKKwljaGFyICpjdXJyOworCisJd2hpbGUgKDEpIHsKKwkJY3VyciA9IG9sZCArIGVuZCAtIGk7CisJCWlmICgqY3VyciA8ICd6JykgeworCQkJKmN1cnIgKz0gMTsKKwkJCWJyZWFrOworCQl9CisJCWkrKzsKKwkJaWYgKGkgPiBzdWZmaXhfbGVuKSB7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQkqY3VyciA9ICdhJzsKKwl9CisKKwlyZXR1cm4gb2xkOworfQorCisjZGVmaW5lIHJlYWRfYnVmZmVyIGJiX2NvbW1vbl9idWZzaXoxCitlbnVtIHsgUkVBRF9CVUZGRVJfU0laRSA9IENPTU1PTl9CVUZTSVpFIC0gMSB9OworCisjZGVmaW5lIFNQTElUX09QVF9sICgxPDwwKQorI2RlZmluZSBTUExJVF9PUFRfYiAoMTw8MSkKKyNkZWZpbmUgU1BMSVRfT1BUX2EgKDE8PDIpCisKK2ludCBzcGxpdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc3BsaXRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIHN1ZmZpeF9sZW4gPSAyOworCWNoYXIgKnBmeDsKKwljaGFyICpjb3VudF9wOworCWNvbnN0IGNoYXIgKnNmeDsKKwlvZmZfdCBjbnQgPSAxMDAwOworCW9mZl90IHJlbWFpbmluZyA9IDA7CisJdW5zaWduZWQgb3B0OworCXNzaXplX3QgYnl0ZXNfcmVhZCwgdG9fd3JpdGU7CisJY2hhciAqc3JjOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPzI6YSsiOyAvKiBtYXggMiBhcmdzOyAtYSBOICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImw6YjphOiIsICZjb3VudF9wLCAmY291bnRfcCwgJnN1ZmZpeF9sZW4pOworCisJaWYgKG9wdCAmIFNQTElUX09QVF9sKQorCQljbnQgPSBYQVRPT0ZGKGNvdW50X3ApOworCWlmIChvcHQgJiBTUExJVF9PUFRfYikgLy8gRklYTUU6IGFsc28gbmVlZHMgWEFUT09GRgorCQljbnQgPSB4YXRvdWxsX3NmeChjb3VudF9wLAorCQkJCUlGX0ZFQVRVUkVfU1BMSVRfRkFOQ1koc3BsaXRfc3VmZml4ZXMpCisJCQkJSUZfTk9UX0ZFQVRVUkVfU1BMSVRfRkFOQ1koa21fc3VmZml4ZXMpCisJCSk7CisJc2Z4ID0gIngiOworCisJYXJndiArPSBvcHRpbmQ7CisJaWYgKGFyZ3ZbMF0pIHsKKwkJaW50IGZkOworCQlpZiAoYXJndlsxXSkKKwkJCXNmeCA9IGFyZ3ZbMV07CisJCWZkID0geG9wZW5fc3RkaW4oYXJndlswXSk7CisJCXhtb3ZlX2ZkKGZkLCBTVERJTl9GSUxFTk8pOworCX0gZWxzZSB7CisJCWFyZ3ZbMF0gPSAoY2hhciAqKSBiYl9tc2dfc3RhbmRhcmRfaW5wdXQ7CisJfQorCisJaWYgKE5BTUVfTUFYIDwgc3RybGVuKHNmeCkgKyBzdWZmaXhfbGVuKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic3VmZml4IHRvbyBsb25nIik7CisKKwl7CisJCWNoYXIgKmNoYXJfcCA9IHh6YWxsb2Moc3VmZml4X2xlbiArIDEpOworCQltZW1zZXQoY2hhcl9wLCAnYScsIHN1ZmZpeF9sZW4pOworCQlwZnggPSB4YXNwcmludGYoIiVzJXMiLCBzZngsIGNoYXJfcCk7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZyZWUoY2hhcl9wKTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlieXRlc19yZWFkID0gc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgcmVhZF9idWZmZXIsIFJFQURfQlVGRkVSX1NJWkUpOworCQlpZiAoIWJ5dGVzX3JlYWQpCisJCQlicmVhazsKKwkJaWYgKGJ5dGVzX3JlYWQgPCAwKQorCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShhcmd2WzBdKTsKKwkJc3JjID0gcmVhZF9idWZmZXI7CisJCWRvIHsKKwkJCWlmICghcmVtYWluaW5nKSB7CisJCQkJaWYgKCFwZngpCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzdWZmaXhlcyBleGhhdXN0ZWQiKTsKKwkJCQl4bW92ZV9mZCh4b3BlbihwZngsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMpLCAxKTsKKwkJCQlwZnggPSBuZXh0X2ZpbGUocGZ4LCBzdWZmaXhfbGVuKTsKKwkJCQlyZW1haW5pbmcgPSBjbnQ7CisJCQl9CisKKwkJCWlmIChvcHQgJiBTUExJVF9PUFRfYikgeworCQkJCS8qIHNwbGl0IGJ5IGJ5dGVzICovCisJCQkJdG9fd3JpdGUgPSAoYnl0ZXNfcmVhZCA8IHJlbWFpbmluZykgPyBieXRlc19yZWFkIDogcmVtYWluaW5nOworCQkJCXJlbWFpbmluZyAtPSB0b193cml0ZTsKKwkJCX0gZWxzZSB7CisJCQkJLyogc3BsaXQgYnkgbGluZXMgKi8KKwkJCQkvKiBjYW4gYmUgc3BlZCB1cCBieSB1c2luZyBfbWVtcmNocl8KKwkJCQkgKiBhbmQgd3JpdGluZyBtYW55IGxpbmVzIGF0IG9uY2UuLi4gKi8KKwkJCQljaGFyICplbmQgPSBtZW1jaHIoc3JjLCAnXG4nLCBieXRlc19yZWFkKTsKKwkJCQlpZiAoZW5kKSB7CisJCQkJCS0tcmVtYWluaW5nOworCQkJCQl0b193cml0ZSA9IGVuZCAtIHNyYyArIDE7CisJCQkJfSBlbHNlIHsKKwkJCQkJdG9fd3JpdGUgPSBieXRlc19yZWFkOworCQkJCX0KKwkJCX0KKworCQkJeHdyaXRlKFNURE9VVF9GSUxFTk8sIHNyYywgdG9fd3JpdGUpOworCQkJYnl0ZXNfcmVhZCAtPSB0b193cml0ZTsKKwkJCXNyYyArPSB0b193cml0ZTsKKwkJfSB3aGlsZSAoYnl0ZXNfcmVhZCk7CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvc3RhdC5jIGIvY29yZXV0aWxzL3N0YXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2ZkMjI3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL3N0YXQuYwpAQCAtMCwwICsxLDc0MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogc3RhdCAtLSBkaXNwbGF5IGZpbGUgb3IgZmlsZSBzeXN0ZW0gc3RhdHVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqIENvcHlyaWdodCAoQykgMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgYnkgTWlrZSBGcnlzaW5nZXIgPHZhcGllckBnZW50b28ub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA2IGJ5IFlvc2hpbm9yaSBTYXRvIDx5c2F0b0B1c2Vycy5zb3VyY2Vmb3JnZS5qcD4KKyAqCisgKiBXcml0dGVuIGJ5IE1pY2hhZWwgTWVza2VzCisgKiBUYWtlbiBmcm9tIGNvcmV1dGlscyBhbmQgdHVybmVkIGludG8gYSBidXN5Ym94IGFwcGxldCBieSBNaWtlIEZyeXNpbmdlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHN0YXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBGSUxFLi4uIgorLy91c2FnZTojZGVmaW5lIHN0YXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEaXNwbGF5IGZpbGUgKGRlZmF1bHQpIG9yIGZpbGVzeXN0ZW0gc3RhdHVzXG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX1NUQVRfRk9STUFUKAorLy91c2FnZTogICAgICJcbgktYyBmbXQJVXNlIHRoZSBzcGVjaWZpZWQgZm9ybWF0IgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktZglEaXNwbGF5IGZpbGVzeXN0ZW0gc3RhdHVzIgorLy91c2FnZTogICAgICJcbgktTAlGb2xsb3cgbGlua3MiCisvL3VzYWdlOiAgICAgIlxuCS10CURpc3BsYXkgaW5mbyBpbiB0ZXJzZSBmb3JtIgorLy91c2FnZToJSUZfU0VMSU5VWCgKKy8vdXNhZ2U6ICAgICAiXG4JLVoJUHJpbnQgc2VjdXJpdHkgY29udGV4dCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU1RBVF9GT1JNQVQoCisvL3VzYWdlOiAgICAgICAiXG5cblZhbGlkIGZvcm1hdCBzZXF1ZW5jZXMgZm9yIGZpbGVzOlxuIgorLy91c2FnZTogICAgICAgIiAlYQlBY2Nlc3MgcmlnaHRzIGluIG9jdGFsXG4iCisvL3VzYWdlOiAgICAgICAiICVBCUFjY2VzcyByaWdodHMgaW4gaHVtYW4gcmVhZGFibGUgZm9ybVxuIgorLy91c2FnZTogICAgICAgIiAlYglOdW1iZXIgb2YgYmxvY2tzIGFsbG9jYXRlZCAoc2VlICVCKVxuIgorLy91c2FnZTogICAgICAgIiAlQglUaGUgc2l6ZSBpbiBieXRlcyBvZiBlYWNoIGJsb2NrIHJlcG9ydGVkIGJ5ICViXG4iCisvL3VzYWdlOiAgICAgICAiICVkCURldmljZSBudW1iZXIgaW4gZGVjaW1hbFxuIgorLy91c2FnZTogICAgICAgIiAlRAlEZXZpY2UgbnVtYmVyIGluIGhleFxuIgorLy91c2FnZTogICAgICAgIiAlZglSYXcgbW9kZSBpbiBoZXhcbiIKKy8vdXNhZ2U6ICAgICAgICIgJUYJRmlsZSB0eXBlXG4iCisvL3VzYWdlOiAgICAgICAiICVnCUdyb3VwIElEIG9mIG93bmVyXG4iCisvL3VzYWdlOiAgICAgICAiICVHCUdyb3VwIG5hbWUgb2Ygb3duZXJcbiIKKy8vdXNhZ2U6ICAgICAgICIgJWgJTnVtYmVyIG9mIGhhcmQgbGlua3NcbiIKKy8vdXNhZ2U6ICAgICAgICIgJWkJSW5vZGUgbnVtYmVyXG4iCisvL3VzYWdlOiAgICAgICAiICVuCUZpbGUgbmFtZVxuIgorLy91c2FnZTogICAgICAgIiAlTglGaWxlIG5hbWUsIHdpdGggLT4gVEFSR0VUIGlmIHN5bWxpbmtcbiIKKy8vdXNhZ2U6ICAgICAgICIgJW8JSS9PIGJsb2NrIHNpemVcbiIKKy8vdXNhZ2U6ICAgICAgICIgJXMJVG90YWwgc2l6ZSwgaW4gYnl0ZXNcbiIKKy8vdXNhZ2U6ICAgICAgICIgJXQJTWFqb3IgZGV2aWNlIHR5cGUgaW4gaGV4XG4iCisvL3VzYWdlOiAgICAgICAiICVUCU1pbm9yIGRldmljZSB0eXBlIGluIGhleFxuIgorLy91c2FnZTogICAgICAgIiAldQlVc2VyIElEIG9mIG93bmVyXG4iCisvL3VzYWdlOiAgICAgICAiICVVCVVzZXIgbmFtZSBvZiBvd25lclxuIgorLy91c2FnZTogICAgICAgIiAleAlUaW1lIG9mIGxhc3QgYWNjZXNzXG4iCisvL3VzYWdlOiAgICAgICAiICVYCVRpbWUgb2YgbGFzdCBhY2Nlc3MgYXMgc2Vjb25kcyBzaW5jZSBFcG9jaFxuIgorLy91c2FnZTogICAgICAgIiAleQlUaW1lIG9mIGxhc3QgbW9kaWZpY2F0aW9uXG4iCisvL3VzYWdlOiAgICAgICAiICVZCVRpbWUgb2YgbGFzdCBtb2RpZmljYXRpb24gYXMgc2Vjb25kcyBzaW5jZSBFcG9jaFxuIgorLy91c2FnZTogICAgICAgIiAleglUaW1lIG9mIGxhc3QgY2hhbmdlXG4iCisvL3VzYWdlOiAgICAgICAiICVaCVRpbWUgb2YgbGFzdCBjaGFuZ2UgYXMgc2Vjb25kcyBzaW5jZSBFcG9jaFxuIgorLy91c2FnZTogICAgICAgIlxuVmFsaWQgZm9ybWF0IHNlcXVlbmNlcyBmb3IgZmlsZSBzeXN0ZW1zOlxuIgorLy91c2FnZTogICAgICAgIiAlYQlGcmVlIGJsb2NrcyBhdmFpbGFibGUgdG8gbm9uLXN1cGVydXNlclxuIgorLy91c2FnZTogICAgICAgIiAlYglUb3RhbCBkYXRhIGJsb2NrcyBpbiBmaWxlIHN5c3RlbVxuIgorLy91c2FnZTogICAgICAgIiAlYwlUb3RhbCBmaWxlIG5vZGVzIGluIGZpbGUgc3lzdGVtXG4iCisvL3VzYWdlOiAgICAgICAiICVkCUZyZWUgZmlsZSBub2RlcyBpbiBmaWxlIHN5c3RlbVxuIgorLy91c2FnZTogICAgICAgIiAlZglGcmVlIGJsb2NrcyBpbiBmaWxlIHN5c3RlbVxuIgorLy91c2FnZToJSUZfU0VMSU5VWCgKKy8vdXNhZ2U6ICAgICAgICIgJUMJU2VjdXJpdHkgY29udGV4dCBpbiBzZWxpbnV4XG4iCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgICAiICVpCUZpbGUgU3lzdGVtIElEIGluIGhleFxuIgorLy91c2FnZTogICAgICAgIiAlbAlNYXhpbXVtIGxlbmd0aCBvZiBmaWxlbmFtZXNcbiIKKy8vdXNhZ2U6ICAgICAgICIgJW4JRmlsZSBuYW1lXG4iCisvL3VzYWdlOiAgICAgICAiICVzCUJsb2NrIHNpemUgKGZvciBmYXN0ZXIgdHJhbnNmZXIpXG4iCisvL3VzYWdlOiAgICAgICAiICVTCUZ1bmRhbWVudGFsIGJsb2NrIHNpemUgKGZvciBibG9jayBjb3VudHMpXG4iCisvL3VzYWdlOiAgICAgICAiICV0CVR5cGUgaW4gaGV4XG4iCisvL3VzYWdlOiAgICAgICAiICVUCVR5cGUgaW4gaHVtYW4gcmVhZGFibGUgZm9ybSIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgT1BUX0ZJTEVTWVMgICAgICgxIDw8IDApCisjZGVmaW5lIE9QVF9URVJTRSAgICAgICAoMSA8PCAxKQorI2RlZmluZSBPUFRfREVSRUZFUkVOQ0UgKDEgPDwgMikKKyNkZWZpbmUgT1BUX1NFTElOVVggICAgICgxIDw8IDMpCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TVEFUX0ZPUk1BVAordHlwZWRlZiBib29sICgqc3RhdGZ1bmNfcHRyKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisjZWxzZQordHlwZWRlZiBib29sICgqc3RhdGZ1bmNfcHRyKShjb25zdCBjaGFyICopOworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyICpmaWxlX3R5cGUoY29uc3Qgc3RydWN0IHN0YXQgKnN0KQoreworCS8qIFNlZSBQT1NJWCAxMDAzLjEtMjAwMSBYQ1UgVGFibGUgNC04IGxpbmVzIDE3MDkzLTE3MTA3CisJICogZm9yIHNvbWUgb2YgdGhlc2UgZm9ybWF0cy4KKwkgKiBUbyBrZWVwIGRpYWdub3N0aWNzIGdyYW1tYXRpY2FsIGluIEVuZ2xpc2gsIHRoZQorCSAqIHJldHVybmVkIHN0cmluZyBtdXN0IHN0YXJ0IHdpdGggYSBjb25zb25hbnQuCisJICovCisJaWYgKFNfSVNSRUcoc3QtPnN0X21vZGUpKSAgcmV0dXJuIHN0LT5zdF9zaXplID09IDAgPyAicmVndWxhciBlbXB0eSBmaWxlIiA6ICJyZWd1bGFyIGZpbGUiOworCWlmIChTX0lTRElSKHN0LT5zdF9tb2RlKSkgIHJldHVybiAiZGlyZWN0b3J5IjsKKwlpZiAoU19JU0JMSyhzdC0+c3RfbW9kZSkpICByZXR1cm4gImJsb2NrIHNwZWNpYWwgZmlsZSI7CisJaWYgKFNfSVNDSFIoc3QtPnN0X21vZGUpKSAgcmV0dXJuICJjaGFyYWN0ZXIgc3BlY2lhbCBmaWxlIjsKKwlpZiAoU19JU0ZJRk8oc3QtPnN0X21vZGUpKSByZXR1cm4gImZpZm8iOworCWlmIChTX0lTTE5LKHN0LT5zdF9tb2RlKSkgIHJldHVybiAic3ltYm9saWMgbGluayI7CisJaWYgKFNfSVNTT0NLKHN0LT5zdF9tb2RlKSkgcmV0dXJuICJzb2NrZXQiOworI2lmZGVmIFNfVFlQRUlTTVEKKwlpZiAoU19UWVBFSVNNUShzdCkpICAgICAgICByZXR1cm4gIm1lc3NhZ2UgcXVldWUiOworI2VuZGlmCisjaWZkZWYgU19UWVBFSVNTRU0KKwlpZiAoU19UWVBFSVNTRU0oc3QpKSAgICAgICByZXR1cm4gInNlbWFwaG9yZSI7CisjZW5kaWYKKyNpZmRlZiBTX1RZUEVJU1NITQorCWlmIChTX1RZUEVJU1NITShzdCkpICAgICAgIHJldHVybiAic2hhcmVkIG1lbW9yeSBvYmplY3QiOworI2VuZGlmCisjaWZkZWYgU19UWVBFSVNUTU8KKwlpZiAoU19UWVBFSVNUTU8oc3QpKSAgICAgICByZXR1cm4gInR5cGVkIG1lbW9yeSBvYmplY3QiOworI2VuZGlmCisJcmV0dXJuICJ3ZWlyZCBmaWxlIjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmh1bWFuX3RpbWUodGltZV90IHQpCit7CisJLyogT2xkCisJc3RhdGljIGNoYXIgKnN0cjsKKwlzdHIgPSBjdGltZSgmdCk7CisJc3RyW3N0cmxlbihzdHIpLTFdID0gJ1wwJzsKKwlyZXR1cm4gc3RyOworCSovCisJLyogY29yZXV0aWxzIDYuMyBjb21wYXQ6ICovCisKKwkvKnN0YXRpYyBjaGFyIGJ1ZltzaXplb2YoIllZWVktTU0tREQgSEg6TU06U1MuMDAwMDAwMDAwIildIEFMSUdOMTsqLworI2RlZmluZSBidWYgYmJfY29tbW9uX2J1ZnNpejEKKworCXN0cmNweShzdHJmdGltZV9ZWVlZTU1EREhITU1TUyhidWYsIHNpemVvZihidWYpLCAmdCksICIuMDAwMDAwMDAwIik7CisJcmV0dXJuIGJ1ZjsKKyN1bmRlZiBidWYKK30KKworLyogUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgZmlsZSBzeXN0ZW0uCisgKiBTb21lIHN5c3RlbXMgaGF2ZSBzdGF0ZnZzLmZfYmFzZXR5cGVbRlNUWVBTWl0uIChBSVgsIEhQLVVYLCBhbmQgU29sYXJpcykKKyAqIE90aGVycyBoYXZlIHN0YXRmcy5mX2ZzdHlwZW5hbWVbTUZTTkFNRUxFTl0uIChOZXRCU0QgMS41LjIpCisgKiBTdGlsbCBvdGhlcnMgaGF2ZSBuZWl0aGVyIGFuZCBoYXZlIHRvIGdldCBieSB3aXRoIGZfdHlwZSAoTGludXgpLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqaHVtYW5fZnN0eXBlKHVpbnQzMl90IGZfdHlwZSkKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHR5cGVzIHsKKwkJdWludDMyX3QgdHlwZTsKKwkJY29uc3QgY2hhciAqY29uc3QgZnM7CisJfSBodW1hbnR5cGVzW10gPSB7CisJCXsgMHhBREZGLCAgICAgImFmZnMiIH0sCisJCXsgMHgxQ2QxLCAgICAgImRldnB0cyIgfSwKKwkJeyAweDEzN0QsICAgICAiZXh0IiB9LAorCQl7IDB4RUY1MSwgICAgICJleHQyIiB9LAorCQl7IDB4RUY1MywgICAgICJleHQyL2V4dDMiIH0sCisJCXsgMHgzMTUzNDY0YSwgImpmcyIgfSwKKwkJeyAweDU4NDY1MzQyLCAieGZzIiB9LAorCQl7IDB4Rjk5NUU4NDksICJocGZzIiB9LAorCQl7IDB4OTY2MCwgICAgICJpc29mcyIgfSwKKwkJeyAweDQwMDAsICAgICAiaXNvZnMiIH0sCisJCXsgMHg0MDA0LCAgICAgImlzb2ZzIiB9LAorCQl7IDB4MTM3RiwgICAgICJtaW5peCIgfSwKKwkJeyAweDEzOEYsICAgICAibWluaXggKDMwIGNoYXIuKSIgfSwKKwkJeyAweDI0NjgsICAgICAibWluaXggdjIiIH0sCisJCXsgMHgyNDc4LCAgICAgIm1pbml4IHYyICgzMCBjaGFyLikiIH0sCisJCXsgMHg0ZDQ0LCAgICAgIm1zZG9zIiB9LAorCQl7IDB4NDAwNiwgICAgICJmYXQiIH0sCisJCXsgMHg1NjRjLCAgICAgIm5vdmVsbCIgfSwKKwkJeyAweDY5NjksICAgICAibmZzIiB9LAorCQl7IDB4OWZhMCwgICAgICJwcm9jIiB9LAorCQl7IDB4NTE3QiwgICAgICJzbWIiIH0sCisJCXsgMHgwMTJGRjdCNCwgInhlbml4IiB9LAorCQl7IDB4MDEyRkY3QjUsICJzeXN2NCIgfSwKKwkJeyAweDAxMkZGN0I2LCAic3lzdjIiIH0sCisJCXsgMHgwMTJGRjdCNywgImNvaCIgfSwKKwkJeyAweDAwMDExOTU0LCAidWZzIiB9LAorCQl7IDB4MDEyRkQxNkQsICJ4aWEiIH0sCisJCXsgMHg1MzQ2NTQ0ZSwgIm50ZnMiIH0sCisJCXsgMHgxMDIxOTk0LCAgInRtcGZzIiB9LAorCQl7IDB4NTI2NTQ5NzMsICJyZWlzZXJmcyIgfSwKKwkJeyAweDI4Y2QzZDQ1LCAiY3JhbWZzIiB9LAorCQl7IDB4NzI3NSwgICAgICJyb21mcyIgfSwKKwkJeyAweDg1ODQ1OGY2LCAicm9tZnMiIH0sCisJCXsgMHg3MzcxNzM2OCwgInNxdWFzaGZzIiB9LAorCQl7IDB4NjI2NTY1NzIsICJzeXNmcyIgfSwKKwkJeyAwLCAiVU5LTk9XTiIgfQorCX07CisKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGh1bWFudHlwZXNbaV0udHlwZTsgKytpKQorCQlpZiAoaHVtYW50eXBlc1tpXS50eXBlID09IGZfdHlwZSkKKwkJCWJyZWFrOworCXJldHVybiBodW1hbnR5cGVzW2ldLmZzOworfQorCisvKiAibWFuIHN0YXRmcyIgc2F5cyB0aGF0IHN0YXRmc2J1Zi0+Zl9mc2lkIGlzIGEgbWVzcyAqLworLyogY29yZXV0aWxzIHRyZWF0cyBpdCBhcyBhbiBhcnJheSBvZiBpbnRzLCBtb3N0IHNpZ25pZmljYW50IGZpcnN0ICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGdldF9mX2ZzaWQoY29uc3Qgc3RydWN0IHN0YXRmcyAqc3RhdGZzYnVmKQoreworCWNvbnN0IHVuc2lnbmVkICpwID0gKGNvbnN0IHZvaWQqKSAmc3RhdGZzYnVmLT5mX2ZzaWQ7CisJdW5zaWduZWQgc3ogPSBzaXplb2Yoc3RhdGZzYnVmLT5mX2ZzaWQpIC8gc2l6ZW9mKHVuc2lnbmVkKTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgciA9IDA7CisKKwlkbworCQlyID0gKHIgPDwgKHNpemVvZih1bnNpZ25lZCkqOCkpIHwgKnArKzsKKwl3aGlsZSAoLS1zeiA+IDApOworCXJldHVybiByOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1RBVF9GT1JNQVQKK3N0YXRpYyB2b2lkIHN0cmNhdGMoY2hhciAqc3RyLCBjaGFyIGMpCit7CisJaW50IGxlbiA9IHN0cmxlbihzdHIpOworCXN0cltsZW4rK10gPSBjOworCXN0cltsZW5dID0gJ1wwJzsKK30KKworc3RhdGljIHZvaWQgcHJpbnRmcyhjaGFyICpwZm9ybWF0LCBjb25zdCBjaGFyICptc2cpCit7CisJc3RyY2F0YyhwZm9ybWF0LCAncycpOworCXByaW50ZihwZm9ybWF0LCBtc2cpOworfQorCisvKiBwcmludCBzdGF0ZnMgaW5mbyAqLworc3RhdGljIHZvaWQgRkFTVF9GVU5DIHByaW50X3N0YXRmcyhjaGFyICpwZm9ybWF0LCBjb25zdCBjaGFyIG0sCisJCWNvbnN0IGNoYXIgKmNvbnN0IGZpbGVuYW1lLCBjb25zdCB2b2lkICpkYXRhCisJCUlGX1NFTElOVVgoLCBzZWN1cml0eV9jb250ZXh0X3Qgc2NvbnRleHQpKQoreworCWNvbnN0IHN0cnVjdCBzdGF0ZnMgKnN0YXRmc2J1ZiA9IGRhdGE7CisJaWYgKG0gPT0gJ24nKSB7CisJCXByaW50ZnMocGZvcm1hdCwgZmlsZW5hbWUpOworCX0gZWxzZSBpZiAobSA9PSAnaScpIHsKKwkJc3RyY2F0KHBmb3JtYXQsICJsbHgiKTsKKwkJcHJpbnRmKHBmb3JtYXQsIGdldF9mX2ZzaWQoc3RhdGZzYnVmKSk7CisJfSBlbHNlIGlmIChtID09ICdsJykgeworCQlzdHJjYXQocGZvcm1hdCwgImx1Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZykgc3RhdGZzYnVmLT5mX25hbWVsZW4pOworCX0gZWxzZSBpZiAobSA9PSAndCcpIHsKKwkJc3RyY2F0KHBmb3JtYXQsICJseCIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcpIHN0YXRmc2J1Zi0+Zl90eXBlKTsgLyogbm8gZXF1aXYgKi8KKwl9IGVsc2UgaWYgKG0gPT0gJ1QnKSB7CisJCXByaW50ZnMocGZvcm1hdCwgaHVtYW5fZnN0eXBlKHN0YXRmc2J1Zi0+Zl90eXBlKSk7CisJfSBlbHNlIGlmIChtID09ICdiJykgeworCQlzdHJjYXQocGZvcm1hdCwgImxsdSIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGZzYnVmLT5mX2Jsb2Nrcyk7CisJfSBlbHNlIGlmIChtID09ICdmJykgeworCQlzdHJjYXQocGZvcm1hdCwgImxsdSIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGZzYnVmLT5mX2JmcmVlKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ2EnKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibGx1Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0ZnNidWYtPmZfYmF2YWlsKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ3MnIHx8IG0gPT0gJ1MnKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibHUiKTsKKwkJcHJpbnRmKHBmb3JtYXQsICh1bnNpZ25lZCBsb25nKSBzdGF0ZnNidWYtPmZfYnNpemUpOworCX0gZWxzZSBpZiAobSA9PSAnYycpIHsKKwkJc3RyY2F0KHBmb3JtYXQsICJsbHUiKTsKKwkJcHJpbnRmKHBmb3JtYXQsICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRmc2J1Zi0+Zl9maWxlcyk7CisJfSBlbHNlIGlmIChtID09ICdkJykgeworCQlzdHJjYXQocGZvcm1hdCwgImxsdSIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGZzYnVmLT5mX2ZmcmVlKTsKKyMgaWYgRU5BQkxFX1NFTElOVVgKKwl9IGVsc2UgaWYgKG0gPT0gJ0MnICYmIChvcHRpb25fbWFzazMyICYgT1BUX1NFTElOVVgpKSB7CisJCXByaW50ZnMocGZvcm1hdCwgc2NvbnRleHQpOworIyBlbmRpZgorCX0gZWxzZSB7CisJCXN0cmNhdGMocGZvcm1hdCwgJ2MnKTsKKwkJcHJpbnRmKHBmb3JtYXQsIG0pOworCX0KK30KKworLyogcHJpbnQgc3RhdCBpbmZvICovCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgcHJpbnRfc3RhdChjaGFyICpwZm9ybWF0LCBjb25zdCBjaGFyIG0sCisJCWNvbnN0IGNoYXIgKmNvbnN0IGZpbGVuYW1lLCBjb25zdCB2b2lkICpkYXRhCisJCUlGX1NFTElOVVgoLCBzZWN1cml0eV9jb250ZXh0X3Qgc2NvbnRleHQpKQoreworI2RlZmluZSBUWVBFX1NJR05FRCh0KSAoISAoKHQpIDAgPCAodCkgLTEpKQorCXN0cnVjdCBzdGF0ICpzdGF0YnVmID0gKHN0cnVjdCBzdGF0ICopIGRhdGE7CisJc3RydWN0IHBhc3N3ZCAqcHdfZW50OworCXN0cnVjdCBncm91cCAqZ3dfZW50OworCisJaWYgKG0gPT0gJ24nKSB7CisJCXByaW50ZnMocGZvcm1hdCwgZmlsZW5hbWUpOworCX0gZWxzZSBpZiAobSA9PSAnTicpIHsKKwkJc3RyY2F0YyhwZm9ybWF0LCAncycpOworCQlpZiAoU19JU0xOSyhzdGF0YnVmLT5zdF9tb2RlKSkgeworCQkJY2hhciAqbGlua25hbWUgPSB4bWFsbG9jX3JlYWRsaW5rX29yX3dhcm4oZmlsZW5hbWUpOworCQkJaWYgKGxpbmtuYW1lID09IE5VTEwpCisJCQkJcmV0dXJuOworCQkJcHJpbnRmKCInJXMnIC0+ICclcyciLCBmaWxlbmFtZSwgbGlua25hbWUpOworCQkJZnJlZShsaW5rbmFtZSk7CisJCX0gZWxzZSB7CisJCQlwcmludGYocGZvcm1hdCwgZmlsZW5hbWUpOworCQl9CisJfSBlbHNlIGlmIChtID09ICdkJykgeworCQlzdHJjYXQocGZvcm1hdCwgImxsdSIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGJ1Zi0+c3RfZGV2KTsKKwl9IGVsc2UgaWYgKG0gPT0gJ0QnKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibGx4Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0YnVmLT5zdF9kZXYpOworCX0gZWxzZSBpZiAobSA9PSAnaScpIHsKKwkJc3RyY2F0KHBmb3JtYXQsICJsbHUiKTsKKwkJcHJpbnRmKHBmb3JtYXQsICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRidWYtPnN0X2lubyk7CisJfSBlbHNlIGlmIChtID09ICdhJykgeworCQlzdHJjYXQocGZvcm1hdCwgImxvIik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZykgKHN0YXRidWYtPnN0X21vZGUgJiAoU19JU1VJRHxTX0lTR0lEfFNfSVNWVFh8U19JUldYVXxTX0lSV1hHfFNfSVJXWE8pKSk7CisJfSBlbHNlIGlmIChtID09ICdBJykgeworCQlwcmludGZzKHBmb3JtYXQsIGJiX21vZGVfc3RyaW5nKHN0YXRidWYtPnN0X21vZGUpKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ2YnKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibHgiKTsKKwkJcHJpbnRmKHBmb3JtYXQsICh1bnNpZ25lZCBsb25nKSBzdGF0YnVmLT5zdF9tb2RlKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ0YnKSB7CisJCXByaW50ZnMocGZvcm1hdCwgZmlsZV90eXBlKHN0YXRidWYpKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ2gnKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibHUiKTsKKwkJcHJpbnRmKHBmb3JtYXQsICh1bnNpZ25lZCBsb25nKSBzdGF0YnVmLT5zdF9ubGluayk7CisJfSBlbHNlIGlmIChtID09ICd1JykgeworCQlzdHJjYXQocGZvcm1hdCwgImx1Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZykgc3RhdGJ1Zi0+c3RfdWlkKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ1UnKSB7CisJCXB3X2VudCA9IGdldHB3dWlkKHN0YXRidWYtPnN0X3VpZCk7CisJCXByaW50ZnMocGZvcm1hdCwgKHB3X2VudCAhPSBOVUxMKSA/IHB3X2VudC0+cHdfbmFtZSA6ICJVTktOT1dOIik7CisJfSBlbHNlIGlmIChtID09ICdnJykgeworCQlzdHJjYXQocGZvcm1hdCwgImx1Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZykgc3RhdGJ1Zi0+c3RfZ2lkKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ0cnKSB7CisJCWd3X2VudCA9IGdldGdyZ2lkKHN0YXRidWYtPnN0X2dpZCk7CisJCXByaW50ZnMocGZvcm1hdCwgKGd3X2VudCAhPSBOVUxMKSA/IGd3X2VudC0+Z3JfbmFtZSA6ICJVTktOT1dOIik7CisJfSBlbHNlIGlmIChtID09ICd0JykgeworCQlzdHJjYXQocGZvcm1hdCwgImx4Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZykgbWFqb3Ioc3RhdGJ1Zi0+c3RfcmRldikpOworCX0gZWxzZSBpZiAobSA9PSAnVCcpIHsKKwkJc3RyY2F0KHBmb3JtYXQsICJseCIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcpIG1pbm9yKHN0YXRidWYtPnN0X3JkZXYpKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ3MnKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibGx1Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0YnVmLT5zdF9zaXplKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ0InKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibHUiKTsKKwkJcHJpbnRmKHBmb3JtYXQsICh1bnNpZ25lZCBsb25nKSA1MTIpOyAvL1NUX05CTE9DS1NJWkUKKwl9IGVsc2UgaWYgKG0gPT0gJ2InKSB7CisJCXN0cmNhdChwZm9ybWF0LCAibGx1Iik7CisJCXByaW50ZihwZm9ybWF0LCAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0YnVmLT5zdF9ibG9ja3MpOworCX0gZWxzZSBpZiAobSA9PSAnbycpIHsKKwkJc3RyY2F0KHBmb3JtYXQsICJsdSIpOworCQlwcmludGYocGZvcm1hdCwgKHVuc2lnbmVkIGxvbmcpIHN0YXRidWYtPnN0X2Jsa3NpemUpOworCX0gZWxzZSBpZiAobSA9PSAneCcpIHsKKwkJcHJpbnRmcyhwZm9ybWF0LCBodW1hbl90aW1lKHN0YXRidWYtPnN0X2F0aW1lKSk7CisJfSBlbHNlIGlmIChtID09ICdYJykgeworCQlzdHJjYXQocGZvcm1hdCwgVFlQRV9TSUdORUQodGltZV90KSA/ICJsZCIgOiAibHUiKTsKKwkJLyogbm90ZTogKHVuc2lnbmVkIGxvbmcpIHdvdWxkIGJlIHdyb25nOgorCQkgKiBpbWFnaW5lICh1bnNpZ25lZCBsb25nNjQpaW50MzIgKi8KKwkJcHJpbnRmKHBmb3JtYXQsIChsb25nKSBzdGF0YnVmLT5zdF9hdGltZSk7CisJfSBlbHNlIGlmIChtID09ICd5JykgeworCQlwcmludGZzKHBmb3JtYXQsIGh1bWFuX3RpbWUoc3RhdGJ1Zi0+c3RfbXRpbWUpKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ1knKSB7CisJCXN0cmNhdChwZm9ybWF0LCBUWVBFX1NJR05FRCh0aW1lX3QpID8gImxkIiA6ICJsdSIpOworCQlwcmludGYocGZvcm1hdCwgKGxvbmcpIHN0YXRidWYtPnN0X210aW1lKTsKKwl9IGVsc2UgaWYgKG0gPT0gJ3onKSB7CisJCXByaW50ZnMocGZvcm1hdCwgaHVtYW5fdGltZShzdGF0YnVmLT5zdF9jdGltZSkpOworCX0gZWxzZSBpZiAobSA9PSAnWicpIHsKKwkJc3RyY2F0KHBmb3JtYXQsIFRZUEVfU0lHTkVEKHRpbWVfdCkgPyAibGQiIDogImx1Iik7CisJCXByaW50ZihwZm9ybWF0LCAobG9uZykgc3RhdGJ1Zi0+c3RfY3RpbWUpOworIyBpZiBFTkFCTEVfU0VMSU5VWAorCX0gZWxzZSBpZiAobSA9PSAnQycgJiYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfU0VMSU5VWCkpIHsKKwkJcHJpbnRmcyhwZm9ybWF0LCBzY29udGV4dCk7CisjIGVuZGlmCisJfSBlbHNlIHsKKwkJc3RyY2F0YyhwZm9ybWF0LCAnYycpOworCQlwcmludGYocGZvcm1hdCwgbSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcmludF9pdChjb25zdCBjaGFyICptYXN0ZXJmb3JtYXQsCisJCWNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQl2b2lkIEZBU1RfRlVOQyAoKnByaW50X2Z1bmMpKGNoYXIqLCBjaGFyLCBjb25zdCBjaGFyKiwgY29uc3Qgdm9pZCogSUZfU0VMSU5VWCgsIHNlY3VyaXR5X2NvbnRleHRfdCBzY29udGV4dCkpLAorCQljb25zdCB2b2lkICpkYXRhCisJCUlGX1NFTElOVVgoLCBzZWN1cml0eV9jb250ZXh0X3Qgc2NvbnRleHQpKQoreworCS8qIENyZWF0ZSBhIHdvcmtpbmcgY29weSBvZiB0aGUgZm9ybWF0IHN0cmluZyAqLworCWNoYXIgKmZvcm1hdCA9IHhzdHJkdXAobWFzdGVyZm9ybWF0KTsKKwkvKiBBZGQgMiB0byBhY2NvbW1vZGF0ZSBvdXIgY29udmVyc2lvbiBvZiB0aGUgc3RhdCAnJXMnIGZvcm1hdCBzdHJpbmcKKwkgKiB0byB0aGUgcHJpbnRmICclbGx1JyBvbmUuICAqLworCWNoYXIgKmRlc3QgPSB4bWFsbG9jKHN0cmxlbihmb3JtYXQpICsgMiArIDEpOworCWNoYXIgKmI7CisKKwliID0gZm9ybWF0OworCXdoaWxlIChiKSB7CisJCS8qIEVhY2ggaXRlcmF0aW9uIGZpbmRzIG5leHQgJXNwZWMsCisJCSAqIHByaW50cyBwcmVjZWRpbmcgc3RyaW5nIGFuZCBoYW5kbGVzIGZvdW5kICVzcGVjCisJCSAqLworCQlzaXplX3QgbGVuOworCQljaGFyICpwID0gc3RyY2hyKGIsICclJyk7CisJCWlmICghcCkgeworCQkJLyogY29yZXV0aWxzIDYuMyBhbHdheXMgcHJpbnRzIG5ld2xpbmUgYXQgdGhlIGVuZCAqLworCQkJLypmcHV0cyhiLCBzdGRvdXQpOyovCisJCQlwdXRzKGIpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBkZXN0ID0gIiU8bW9kaWZpZXJzPiIgKi8KKwkJbGVuID0gMSArIHN0cnNwbihwICsgMSwgIiMtKy5JIDAxMjM0NTY3ODkiKTsKKwkJbWVtY3B5KGRlc3QsIHAsIGxlbik7CisJCWRlc3RbbGVuXSA9ICdcMCc7CisKKwkJLyogcHJpbnQgcHJlY2VkaW5nIHN0cmluZyAqLworCQkqcCA9ICdcMCc7CisJCWZwdXRzKGIsIHN0ZG91dCk7CisKKwkJcCArPSBsZW47CisJCWIgPSBwICsgMTsKKwkJc3dpdGNoICgqcCkgeworCQljYXNlICdcMCc6CisJCQliID0gTlVMTDsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlICclJzoKKwkJCWJiX3B1dGNoYXIoJyUnKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJLyogQ29tcGxldGVzICIlPG1vZGlmaWVycz4iIHdpdGggc3BlY2lmaWVyIGFuZCBwcmludGZzICovCisJCQlwcmludF9mdW5jKGRlc3QsICpwLCBmaWxlbmFtZSwgZGF0YSBJRl9TRUxJTlVYKCxzY29udGV4dCkpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlmcmVlKGZvcm1hdCk7CisJZnJlZShkZXN0KTsKK30KKyNlbmRpZiAgLyogRkVBVFVSRV9TVEFUX0ZPUk1BVCAqLworCisvKiBTdGF0IHRoZSBmaWxlIHN5c3RlbSBhbmQgcHJpbnQgd2hhdCB3ZSBmaW5kLiAgKi8KKyNpZiAhRU5BQkxFX0ZFQVRVUkVfU1RBVF9GT1JNQVQKKyNkZWZpbmUgZG9fc3RhdGZzKGZpbGVuYW1lLCBmb3JtYXQpIGRvX3N0YXRmcyhmaWxlbmFtZSkKKyNlbmRpZgorc3RhdGljIGJvb2wgZG9fc3RhdGZzKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpmb3JtYXQpCit7CisJc3RydWN0IHN0YXRmcyBzdGF0ZnNidWY7CisjaWYgIUVOQUJMRV9GRUFUVVJFX1NUQVRfRk9STUFUCisJY29uc3QgY2hhciAqZm9ybWF0OworI2VuZGlmCisjaWYgRU5BQkxFX1NFTElOVVgKKwlzZWN1cml0eV9jb250ZXh0X3Qgc2NvbnRleHQgPSBOVUxMOworCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfU0VMSU5VWCkgeworCQlpZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfREVSRUZFUkVOQ0UKKwkJICAgICA/IGxnZXRmaWxlY29uKGZpbGVuYW1lLCAmc2NvbnRleHQpCisJCSAgICAgOiBnZXRmaWxlY29uKGZpbGVuYW1lLCAmc2NvbnRleHQpCisJCSAgICApIDwgMAorCQkpIHsKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZpbGVuYW1lKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorI2VuZGlmCisJaWYgKHN0YXRmcyhmaWxlbmFtZSwgJnN0YXRmc2J1ZikgIT0gMCkgeworCQliYl9wZXJyb3JfbXNnKCJjYW4ndCByZWFkIGZpbGUgc3lzdGVtIGluZm9ybWF0aW9uIGZvciAnJXMnIiwgZmlsZW5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TVEFUX0ZPUk1BVAorCWlmIChmb3JtYXQgPT0gTlVMTCkgeworIyBpZiAhRU5BQkxFX1NFTElOVVgKKwkJZm9ybWF0ID0gKG9wdGlvbl9tYXNrMzIgJiBPUFRfVEVSU0UKKwkJCT8gIiVuICVpICVsICV0ICVzICViICVmICVhICVjICVkXG4iCisJCQk6ICIgIEZpbGU6IFwiJW5cIlxuIgorCQkJICAiICAgIElEOiAlLThpIE5hbWVsZW46ICUtN2wgVHlwZTogJVRcbiIKKwkJCSAgIkJsb2NrIHNpemU6ICUtMTBzXG4iCisJCQkgICJCbG9ja3M6IFRvdGFsOiAlLTEwYiBGcmVlOiAlLTEwZiBBdmFpbGFibGU6ICVhXG4iCisJCQkgICJJbm9kZXM6IFRvdGFsOiAlLTEwYyBGcmVlOiAlZCIpOworIyBlbHNlCisJCWZvcm1hdCA9IChvcHRpb25fbWFzazMyICYgT1BUX1RFUlNFCisJCQk/IChvcHRpb25fbWFzazMyICYgT1BUX1NFTElOVVggPyAiJW4gJWkgJWwgJXQgJXMgJWIgJWYgJWEgJWMgJWQgJUNcbiI6CisJCQkiJW4gJWkgJWwgJXQgJXMgJWIgJWYgJWEgJWMgJWRcbiIpCisJCQk6IChvcHRpb25fbWFzazMyICYgT1BUX1NFTElOVVggPworCQkJIiAgRmlsZTogXCIlblwiXG4iCisJCQkiICAgIElEOiAlLThpIE5hbWVsZW46ICUtN2wgVHlwZTogJVRcbiIKKwkJCSJCbG9jayBzaXplOiAlLTEwc1xuIgorCQkJIkJsb2NrczogVG90YWw6ICUtMTBiIEZyZWU6ICUtMTBmIEF2YWlsYWJsZTogJWFcbiIKKwkJCSJJbm9kZXM6IFRvdGFsOiAlLTEwYyBGcmVlOiAlZCIKKwkJCSIgIFNfY29udGV4dDogJUNcbiI6CisJCQkiICBGaWxlOiBcIiVuXCJcbiIKKwkJCSIgICAgSUQ6ICUtOGkgTmFtZWxlbjogJS03bCBUeXBlOiAlVFxuIgorCQkJIkJsb2NrIHNpemU6ICUtMTBzXG4iCisJCQkiQmxvY2tzOiBUb3RhbDogJS0xMGIgRnJlZTogJS0xMGYgQXZhaWxhYmxlOiAlYVxuIgorCQkJIklub2RlczogVG90YWw6ICUtMTBjIEZyZWU6ICVkXG4iKQorCQkJKTsKKyMgZW5kaWYgLyogU0VMSU5VWCAqLworCX0KKwlwcmludF9pdChmb3JtYXQsIGZpbGVuYW1lLCBwcmludF9zdGF0ZnMsICZzdGF0ZnNidWYgSUZfU0VMSU5VWCgsIHNjb250ZXh0KSk7CisjZWxzZSAvKiBGRUFUVVJFX1NUQVRfRk9STUFUICovCisJZm9ybWF0ID0gKG9wdGlvbl9tYXNrMzIgJiBPUFRfVEVSU0UKKwkJPyAiJXMgJWxseCAlbHUgIgorCQk6ICIgIEZpbGU6IFwiJXNcIlxuIgorCQkgICIgICAgSUQ6ICUtOGxseCBOYW1lbGVuOiAlLTdsdSAiKTsKKwlwcmludGYoZm9ybWF0LAorCSAgICAgICBmaWxlbmFtZSwKKwkgICAgICAgZ2V0X2ZfZnNpZCgmc3RhdGZzYnVmKSwKKwkgICAgICAgc3RhdGZzYnVmLmZfbmFtZWxlbik7CisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9URVJTRSkKKwkJcHJpbnRmKCIlbHggIiwgKHVuc2lnbmVkIGxvbmcpIHN0YXRmc2J1Zi5mX3R5cGUpOworCWVsc2UKKwkJcHJpbnRmKCJUeXBlOiAlc1xuIiwgaHVtYW5fZnN0eXBlKHN0YXRmc2J1Zi5mX3R5cGUpKTsKKworIyBpZiAhRU5BQkxFX1NFTElOVVgKKwlmb3JtYXQgPSAob3B0aW9uX21hc2szMiAmIE9QVF9URVJTRQorCQk/ICIlbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1XG4iCisJCTogIkJsb2NrIHNpemU6ICUtMTBsdVxuIgorCQkgICJCbG9ja3M6IFRvdGFsOiAlLTEwbGx1IEZyZWU6ICUtMTBsbHUgQXZhaWxhYmxlOiAlbGx1XG4iCisJCSAgIklub2RlczogVG90YWw6ICUtMTBsbHUgRnJlZTogJWxsdVxuIik7CisJcHJpbnRmKGZvcm1hdCwKKwkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHN0YXRmc2J1Zi5mX2JzaXplLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0ZnNidWYuZl9ibG9ja3MsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRmc2J1Zi5mX2JmcmVlLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0ZnNidWYuZl9iYXZhaWwsCisJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRmc2J1Zi5mX2ZpbGVzLAorCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0ZnNidWYuZl9mZnJlZSk7CisjIGVsc2UKKwlmb3JtYXQgPSAob3B0aW9uX21hc2szMiAmIE9QVF9URVJTRQorCQk/IChvcHRpb25fbWFzazMyICYgT1BUX1NFTElOVVggPyAiJWx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlQ1xuIiA6ICIlbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1XG4iKQorCQk6IChvcHRpb25fbWFzazMyICYgT1BUX1NFTElOVVgKKwkJCT8JIkJsb2NrIHNpemU6ICUtMTBsdVxuIgorCQkJCSJCbG9ja3M6IFRvdGFsOiAlLTEwbGx1IEZyZWU6ICUtMTBsbHUgQXZhaWxhYmxlOiAlbGx1XG4iCisJCQkJIklub2RlczogVG90YWw6ICUtMTBsbHUgRnJlZTogJWxsdSIKKwkJCQkiU19jb250ZXh0OiAlQ1xuIgorCQkJOgkiQmxvY2sgc2l6ZTogJS0xMGx1XG4iCisJCQkJIkJsb2NrczogVG90YWw6ICUtMTBsbHUgRnJlZTogJS0xMGxsdSBBdmFpbGFibGU6ICVsbHVcbiIKKwkJCQkiSW5vZGVzOiBUb3RhbDogJS0xMGxsdSBGcmVlOiAlbGx1XG4iCisJCQkpCisJCSk7CisJcHJpbnRmKGZvcm1hdCwKKwkJKHVuc2lnbmVkIGxvbmcpIHN0YXRmc2J1Zi5mX2JzaXplLAorCQkodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0ZnNidWYuZl9ibG9ja3MsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRmc2J1Zi5mX2JmcmVlLAorCQkodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0ZnNidWYuZl9iYXZhaWwsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRmc2J1Zi5mX2ZpbGVzLAorCQkodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0ZnNidWYuZl9mZnJlZSwKKwkJc2NvbnRleHQpOworCisJaWYgKHNjb250ZXh0KQorCQlmcmVlY29uKHNjb250ZXh0KTsKKyMgZW5kaWYKKyNlbmRpZiAgLyogRkVBVFVSRV9TVEFUX0ZPUk1BVCAqLworCXJldHVybiAxOworfQorCisvKiBzdGF0IHRoZSBmaWxlIGFuZCBwcmludCB3aGF0IHdlIGZpbmQgKi8KKyNpZiAhRU5BQkxFX0ZFQVRVUkVfU1RBVF9GT1JNQVQKKyNkZWZpbmUgZG9fc3RhdChmaWxlbmFtZSwgZm9ybWF0KSBkb19zdGF0KGZpbGVuYW1lKQorI2VuZGlmCitzdGF0aWMgYm9vbCBkb19zdGF0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpmb3JtYXQpCit7CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKyNpZiBFTkFCTEVfU0VMSU5VWAorCXNlY3VyaXR5X2NvbnRleHRfdCBzY29udGV4dCA9IE5VTEw7CisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9TRUxJTlVYKSB7CisJCWlmICgob3B0aW9uX21hc2szMiAmIE9QVF9ERVJFRkVSRU5DRQorCQkgICAgID8gbGdldGZpbGVjb24oZmlsZW5hbWUsICZzY29udGV4dCkKKwkJICAgICA6IGdldGZpbGVjb24oZmlsZW5hbWUsICZzY29udGV4dCkKKwkJICAgICkgPCAwCisJCSkgeworCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coZmlsZW5hbWUpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisjZW5kaWYKKwlpZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfREVSRUZFUkVOQ0UgPyBzdGF0IDogbHN0YXQpIChmaWxlbmFtZSwgJnN0YXRidWYpICE9IDApIHsKKwkJYmJfcGVycm9yX21zZygiY2FuJ3Qgc3RhdCAnJXMnIiwgZmlsZW5hbWUpOworCQlyZXR1cm4gMDsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TVEFUX0ZPUk1BVAorCWlmIChmb3JtYXQgPT0gTlVMTCkgeworIyBpZiAhRU5BQkxFX1NFTElOVVgKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfVEVSU0UpIHsKKwkJCWZvcm1hdCA9ICIlbiAlcyAlYiAlZiAldSAlZyAlRCAlaSAlaCAldCAlVCAlWCAlWSAlWiAlbyI7CisJCX0gZWxzZSB7CisJCQlpZiAoU19JU0JMSyhzdGF0YnVmLnN0X21vZGUpIHx8IFNfSVNDSFIoc3RhdGJ1Zi5zdF9tb2RlKSkgeworCQkJCWZvcm1hdCA9CisJCQkJCSIgIEZpbGU6ICVOXG4iCisJCQkJCSIgIFNpemU6ICUtMTBzXHRCbG9ja3M6ICUtMTBiIElPIEJsb2NrOiAlLTZvICVGXG4iCisJCQkJCSJEZXZpY2U6ICVEaC8lZGRcdElub2RlOiAlLTEwaSAgTGlua3M6ICUtNWgiCisJCQkJCSIgRGV2aWNlIHR5cGU6ICV0LCVUXG4iCisJCQkJCSJBY2Nlc3M6ICglMDRhLyUxMC4xMEEpICBVaWQ6ICglNXUvJThVKSAgIEdpZDogKCU1Zy8lOEcpXG4iCisJCQkJCSJBY2Nlc3M6ICV4XG4iICJNb2RpZnk6ICV5XG4iICJDaGFuZ2U6ICV6XG4iOworCQkJfSBlbHNlIHsKKwkJCQlmb3JtYXQgPQorCQkJCQkiICBGaWxlOiAlTlxuIgorCQkJCQkiICBTaXplOiAlLTEwc1x0QmxvY2tzOiAlLTEwYiBJTyBCbG9jazogJS02byAlRlxuIgorCQkJCQkiRGV2aWNlOiAlRGgvJWRkXHRJbm9kZTogJS0xMGkgIExpbmtzOiAlaFxuIgorCQkJCQkiQWNjZXNzOiAoJTA0YS8lMTAuMTBBKSAgVWlkOiAoJTV1LyU4VSkgICBHaWQ6ICglNWcvJThHKVxuIgorCQkJCQkiQWNjZXNzOiAleFxuIiAiTW9kaWZ5OiAleVxuIiAiQ2hhbmdlOiAlelxuIjsKKwkJCX0KKwkJfQorIyBlbHNlCisJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX1RFUlNFKSB7CisJCQlmb3JtYXQgPSAob3B0aW9uX21hc2szMiAmIE9QVF9TRUxJTlVYID8KKwkJCQkiJW4gJXMgJWIgJWYgJXUgJWcgJUQgJWkgJWggJXQgJVQgJVggJVkgJVogJW8gJUNcbiIKKwkJCQk6CisJCQkJIiVuICVzICViICVmICV1ICVnICVEICVpICVoICV0ICVUICVYICVZICVaICVvXG4iCisJCQkJKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChTX0lTQkxLKHN0YXRidWYuc3RfbW9kZSkgfHwgU19JU0NIUihzdGF0YnVmLnN0X21vZGUpKSB7CisJCQkJZm9ybWF0ID0gKG9wdGlvbl9tYXNrMzIgJiBPUFRfU0VMSU5VWCA/CisJCQkJCSIgIEZpbGU6ICVOXG4iCisJCQkJCSIgIFNpemU6ICUtMTBzXHRCbG9ja3M6ICUtMTBiIElPIEJsb2NrOiAlLTZvICVGXG4iCisJCQkJCSJEZXZpY2U6ICVEaC8lZGRcdElub2RlOiAlLTEwaSAgTGlua3M6ICUtNWgiCisJCQkJCSIgRGV2aWNlIHR5cGU6ICV0LCVUXG4iCisJCQkJCSJBY2Nlc3M6ICglMDRhLyUxMC4xMEEpICBVaWQ6ICglNXUvJThVKSAgIEdpZDogKCU1Zy8lOEcpXG4iCisJCQkJCSIgICBTX0NvbnRleHQ6ICVDXG4iCisJCQkJCSJBY2Nlc3M6ICV4XG4iICJNb2RpZnk6ICV5XG4iICJDaGFuZ2U6ICV6XG4iCisJCQkJCToKKwkJCQkJIiAgRmlsZTogJU5cbiIKKwkJCQkJIiAgU2l6ZTogJS0xMHNcdEJsb2NrczogJS0xMGIgSU8gQmxvY2s6ICUtNm8gJUZcbiIKKwkJCQkJIkRldmljZTogJURoLyVkZFx0SW5vZGU6ICUtMTBpICBMaW5rczogJS01aCIKKwkJCQkJIiBEZXZpY2UgdHlwZTogJXQsJVRcbiIKKwkJCQkJIkFjY2VzczogKCUwNGEvJTEwLjEwQSkgIFVpZDogKCU1dS8lOFUpICAgR2lkOiAoJTVnLyU4RylcbiIKKwkJCQkJIkFjY2VzczogJXhcbiIgIk1vZGlmeTogJXlcbiIgIkNoYW5nZTogJXpcbiIKKwkJCQkJKTsKKwkJCX0gZWxzZSB7CisJCQkJZm9ybWF0ID0gKG9wdGlvbl9tYXNrMzIgJiBPUFRfU0VMSU5VWCA/CisJCQkJCSIgIEZpbGU6ICVOXG4iCisJCQkJCSIgIFNpemU6ICUtMTBzXHRCbG9ja3M6ICUtMTBiIElPIEJsb2NrOiAlLTZvICVGXG4iCisJCQkJCSJEZXZpY2U6ICVEaC8lZGRcdElub2RlOiAlLTEwaSAgTGlua3M6ICVoXG4iCisJCQkJCSJBY2Nlc3M6ICglMDRhLyUxMC4xMEEpICBVaWQ6ICglNXUvJThVKSAgIEdpZDogKCU1Zy8lOEcpXG4iCisJCQkJCSJTX0NvbnRleHQ6ICVDXG4iCisJCQkJCSJBY2Nlc3M6ICV4XG4iICJNb2RpZnk6ICV5XG4iICJDaGFuZ2U6ICV6XG4iCisJCQkJCToKKwkJCQkJIiAgRmlsZTogJU5cbiIKKwkJCQkJIiAgU2l6ZTogJS0xMHNcdEJsb2NrczogJS0xMGIgSU8gQmxvY2s6ICUtNm8gJUZcbiIKKwkJCQkJIkRldmljZTogJURoLyVkZFx0SW5vZGU6ICUtMTBpICBMaW5rczogJWhcbiIKKwkJCQkJIkFjY2VzczogKCUwNGEvJTEwLjEwQSkgIFVpZDogKCU1dS8lOFUpICAgR2lkOiAoJTVnLyU4RylcbiIKKwkJCQkJIkFjY2VzczogJXhcbiIgIk1vZGlmeTogJXlcbiIgIkNoYW5nZTogJXpcbiIKKwkJCQkJKTsKKwkJCX0KKwkJfQorIyBlbmRpZgorCX0KKwlwcmludF9pdChmb3JtYXQsIGZpbGVuYW1lLCBwcmludF9zdGF0LCAmc3RhdGJ1ZiBJRl9TRUxJTlVYKCwgc2NvbnRleHQpKTsKKyNlbHNlCS8qIEZFQVRVUkVfU1RBVF9GT1JNQVQgKi8KKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9URVJTRSkgeworCQlwcmludGYoIiVzICVsbHUgJWxsdSAlbHggJWx1ICVsdSAlbGx4ICVsbHUgJWx1ICVseCAlbHggJWx1ICVsdSAlbHUgJWx1IgorCQkgICAgICAgSUZfTk9UX1NFTElOVVgoIlxuIiksCisJCSAgICAgICBmaWxlbmFtZSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRidWYuc3Rfc2l6ZSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRidWYuc3RfYmxvY2tzLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHN0YXRidWYuc3RfbW9kZSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBzdGF0YnVmLnN0X3VpZCwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBzdGF0YnVmLnN0X2dpZCwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRidWYuc3RfZGV2LAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGJ1Zi5zdF9pbm8sCisJCSAgICAgICAodW5zaWduZWQgbG9uZykgc3RhdGJ1Zi5zdF9ubGluaywKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBtYWpvcihzdGF0YnVmLnN0X3JkZXYpLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIG1pbm9yKHN0YXRidWYuc3RfcmRldiksCisJCSAgICAgICAodW5zaWduZWQgbG9uZykgc3RhdGJ1Zi5zdF9hdGltZSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBzdGF0YnVmLnN0X210aW1lLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHN0YXRidWYuc3RfY3RpbWUsCisJCSAgICAgICAodW5zaWduZWQgbG9uZykgc3RhdGJ1Zi5zdF9ibGtzaXplCisJCSk7CisjIGlmIEVOQUJMRV9TRUxJTlVYCisJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX1NFTElOVVgpCisJCQlwcmludGYoIiAlc1xuIiwgc2NvbnRleHQpOworCQllbHNlCisJCQliYl9wdXRjaGFyKCdcbicpOworIyBlbmRpZgorCX0gZWxzZSB7CisJCWNoYXIgKmxpbmtuYW1lID0gTlVMTDsKKwkJc3RydWN0IHBhc3N3ZCAqcHdfZW50OworCQlzdHJ1Y3QgZ3JvdXAgKmd3X2VudDsKKworCQlnd19lbnQgPSBnZXRncmdpZChzdGF0YnVmLnN0X2dpZCk7CisJCXB3X2VudCA9IGdldHB3dWlkKHN0YXRidWYuc3RfdWlkKTsKKworCQlpZiAoU19JU0xOSyhzdGF0YnVmLnN0X21vZGUpKQorCQkJbGlua25hbWUgPSB4bWFsbG9jX3JlYWRsaW5rX29yX3dhcm4oZmlsZW5hbWUpOworCQlpZiAobGlua25hbWUpIHsKKwkJCXByaW50ZigiICBGaWxlOiAnJXMnIC0+ICclcydcbiIsIGZpbGVuYW1lLCBsaW5rbmFtZSk7CisJCQlmcmVlKGxpbmtuYW1lKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiICBGaWxlOiAnJXMnXG4iLCBmaWxlbmFtZSk7CisJCX0KKworCQlwcmludGYoIiAgU2l6ZTogJS0xMGxsdVx0QmxvY2tzOiAlLTEwbGx1IElPIEJsb2NrOiAlLTZsdSAlc1xuIgorCQkgICAgICAgIkRldmljZTogJWxseGgvJWxsdWRcdElub2RlOiAlLTEwbGx1ICBMaW5rczogJS01bHUiLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGJ1Zi5zdF9zaXplLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGJ1Zi5zdF9ibG9ja3MsCisJCSAgICAgICAodW5zaWduZWQgbG9uZykgc3RhdGJ1Zi5zdF9ibGtzaXplLAorCQkgICAgICAgZmlsZV90eXBlKCZzdGF0YnVmKSwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHN0YXRidWYuc3RfZGV2LAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc3RhdGJ1Zi5zdF9kZXYsCisJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzdGF0YnVmLnN0X2lubywKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBzdGF0YnVmLnN0X25saW5rKTsKKwkJaWYgKFNfSVNCTEsoc3RhdGJ1Zi5zdF9tb2RlKSB8fCBTX0lTQ0hSKHN0YXRidWYuc3RfbW9kZSkpCisJCQlwcmludGYoIiBEZXZpY2UgdHlwZTogJWx4LCVseFxuIiwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZykgbWFqb3Ioc3RhdGJ1Zi5zdF9yZGV2KSwKKwkJCSAgICAgICAodW5zaWduZWQgbG9uZykgbWlub3Ioc3RhdGJ1Zi5zdF9yZGV2KSk7CisJCWVsc2UKKwkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCXByaW50ZigiQWNjZXNzOiAoJTA0bG8vJTEwLjEwcykgIFVpZDogKCU1bHUvJThzKSAgIEdpZDogKCU1bHUvJThzKVxuIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSAoc3RhdGJ1Zi5zdF9tb2RlICYgKFNfSVNVSUR8U19JU0dJRHxTX0lTVlRYfFNfSVJXWFV8U19JUldYR3xTX0lSV1hPKSksCisJCSAgICAgICBiYl9tb2RlX3N0cmluZyhzdGF0YnVmLnN0X21vZGUpLAorCQkgICAgICAgKHVuc2lnbmVkIGxvbmcpIHN0YXRidWYuc3RfdWlkLAorCQkgICAgICAgKHB3X2VudCAhPSBOVUxMKSA/IHB3X2VudC0+cHdfbmFtZSA6ICJVTktOT1dOIiwKKwkJICAgICAgICh1bnNpZ25lZCBsb25nKSBzdGF0YnVmLnN0X2dpZCwKKwkJICAgICAgIChnd19lbnQgIT0gTlVMTCkgPyBnd19lbnQtPmdyX25hbWUgOiAiVU5LTk9XTiIpOworIyBpZiBFTkFCTEVfU0VMSU5VWAorCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9TRUxJTlVYKQorCQkJcHJpbnRmKCIgICBTX0NvbnRleHQ6ICVzXG4iLCBzY29udGV4dCk7CisjIGVuZGlmCisJCXByaW50ZigiQWNjZXNzOiAlc1xuIiwgaHVtYW5fdGltZShzdGF0YnVmLnN0X2F0aW1lKSk7CisJCXByaW50ZigiTW9kaWZ5OiAlc1xuIiwgaHVtYW5fdGltZShzdGF0YnVmLnN0X210aW1lKSk7CisJCXByaW50ZigiQ2hhbmdlOiAlc1xuIiwgaHVtYW5fdGltZShzdGF0YnVmLnN0X2N0aW1lKSk7CisJfQorI2VuZGlmICAvKiBGRUFUVVJFX1NUQVRfRk9STUFUICovCisJcmV0dXJuIDE7Cit9CisKK2ludCBzdGF0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzdGF0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlJRl9GRUFUVVJFX1NUQVRfRk9STUFUKGNoYXIgKmZvcm1hdCA9IE5VTEw7KQorCWludCBpOworCWludCBvazsKKwl1bnNpZ25lZCBvcHRzOworCXN0YXRmdW5jX3B0ciBzdGF0ZnVuYyA9IGRvX3N0YXQ7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMSI7IC8qIG1pbiBvbmUgYXJnICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJmdEwiCisJCUlGX1NFTElOVVgoIloiKQorCQlJRl9GRUFUVVJFX1NUQVRfRk9STUFUKCJjOiIsICZmb3JtYXQpCisJKTsKKwlpZiAob3B0cyAmIE9QVF9GSUxFU1lTKSAvKiAtZiAqLworCQlzdGF0ZnVuYyA9IGRvX3N0YXRmczsKKyNpZiBFTkFCTEVfU0VMSU5VWAorCWlmIChvcHRzICYgT1BUX1NFTElOVVgpIHsKKwkJc2VsaW51eF9vcl9kaWUoKTsKKwl9CisjZW5kaWYKKwlvayA9IDE7CisJYXJndiArPSBvcHRpbmQ7CisJZm9yIChpID0gMDsgYXJndltpXTsgKytpKQorCQlvayAmPSBzdGF0ZnVuYyhhcmd2W2ldIElGX0ZFQVRVUkVfU1RBVF9GT1JNQVQoLCBmb3JtYXQpKTsKKworCXJldHVybiAob2sgPyBFWElUX1NVQ0NFU1MgOiBFWElUX0ZBSUxVUkUpOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3N0dHkuYyBiL2NvcmV1dGlscy9zdHR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc4YTg0OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9zdHR5LmMKQEAgLTAsMCArMSwxNTM1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIHN0dHkgLS0gY2hhbmdlIGFuZCBwcmludCB0ZXJtaW5hbCBsaW5lIHNldHRpbmdzCisgICBDb3B5cmlnaHQgKEMpIDE5OTAtMTk5OSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyovCisvKiBVc2FnZTogc3R0eSBbLWFnXSBbLUYgZGV2aWNlXSBbc2V0dGluZy4uLl0KKworICAgT3B0aW9uczoKKyAgIC1hIFdyaXRlIGFsbCBjdXJyZW50IHNldHRpbmdzIHRvIHN0ZG91dCBpbiBodW1hbi1yZWFkYWJsZSBmb3JtLgorICAgLWcgV3JpdGUgYWxsIGN1cnJlbnQgc2V0dGluZ3MgdG8gc3Rkb3V0IGluIHN0dHktcmVhZGFibGUgZm9ybS4KKyAgIC1GIE9wZW4gYW5kIHVzZSB0aGUgc3BlY2lmaWVkIGRldmljZSBpbnN0ZWFkIG9mIHN0ZGluCisKKyAgIElmIG5vIGFyZ3MgYXJlIGdpdmVuLCB3cml0ZSB0byBzdGRvdXQgdGhlIGJhdWQgcmF0ZSBhbmQgc2V0dGluZ3MgdGhhdAorICAgaGF2ZSBiZWVuIGNoYW5nZWQgZnJvbSB0aGVpciBkZWZhdWx0cy4gIE1vZGUgcmVhZGluZyBhbmQgY2hhbmdlcworICAgYXJlIGRvbmUgb24gdGhlIHNwZWNpZmllZCBkZXZpY2UsIG9yIHN0ZGluIGlmIG5vbmUgd2FzIHNwZWNpZmllZC4KKworICAgRGF2aWQgTWFjS2VuemllIDxkam1AZ251LmFpLm1pdC5lZHU+CisKKyAgIFNwZWNpYWwgZm9yIGJ1c3lib3ggcG9ydGVkIGJ5IFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4gMjAwMQorCisgICAqLworCisvL3VzYWdlOiNkZWZpbmUgc3R0eV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hfGddIFstRiBERVZJQ0VdIFtTRVRUSU5HXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBzdHR5X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiV2l0aG91dCBhcmd1bWVudHMsIHByaW50cyBiYXVkIHJhdGUsIGxpbmUgZGlzY2lwbGluZSxcbiIKKy8vdXNhZ2U6ICAgICAgICJhbmQgZGV2aWF0aW9ucyBmcm9tIHN0dHkgc2FuZVxuIgorLy91c2FnZTogICAgICJcbgktRiBERVZJQ0UJT3BlbiBkZXZpY2UgaW5zdGVhZCBvZiBzdGRpbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJCVByaW50IGFsbCBjdXJyZW50IHNldHRpbmdzIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0iCisvL3VzYWdlOiAgICAgIlxuCS1nCQlQcmludCBpbiBzdHR5LXJlYWRhYmxlIGZvcm0iCisvL3VzYWdlOiAgICAgIlxuCVtTRVRUSU5HXQlTZWUgbWFucGFnZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZm5kZWYgX1BPU0lYX1ZESVNBQkxFCisjIGRlZmluZSBfUE9TSVhfVkRJU0FCTEUgKCh1bnNpZ25lZCBjaGFyKSAwKQorI2VuZGlmCisKKyNkZWZpbmUgQ29udHJvbChjKSAoKGMpICYgMHgxZikKKy8qIENhbm9uaWNhbCB2YWx1ZXMgZm9yIGNvbnRyb2wgY2hhcmFjdGVycyAqLworI2lmbmRlZiBDSU5UUgorIyBkZWZpbmUgQ0lOVFIgQ29udHJvbCgnYycpCisjZW5kaWYKKyNpZm5kZWYgQ1FVSVQKKyMgZGVmaW5lIENRVUlUIDI4CisjZW5kaWYKKyNpZm5kZWYgQ0VSQVNFCisjIGRlZmluZSBDRVJBU0UgMTI3CisjZW5kaWYKKyNpZm5kZWYgQ0tJTEwKKyMgZGVmaW5lIENLSUxMIENvbnRyb2woJ3UnKQorI2VuZGlmCisjaWZuZGVmIENFT0YKKyMgZGVmaW5lIENFT0YgQ29udHJvbCgnZCcpCisjZW5kaWYKKyNpZm5kZWYgQ0VPTAorIyBkZWZpbmUgQ0VPTCBfUE9TSVhfVkRJU0FCTEUKKyNlbmRpZgorI2lmbmRlZiBDU1RBUlQKKyMgZGVmaW5lIENTVEFSVCBDb250cm9sKCdxJykKKyNlbmRpZgorI2lmbmRlZiBDU1RPUAorIyBkZWZpbmUgQ1NUT1AgQ29udHJvbCgncycpCisjZW5kaWYKKyNpZm5kZWYgQ1NVU1AKKyMgZGVmaW5lIENTVVNQIENvbnRyb2woJ3onKQorI2VuZGlmCisjaWYgZGVmaW5lZChWRU9MMikgJiYgIWRlZmluZWQoQ0VPTDIpCisjIGRlZmluZSBDRU9MMiBfUE9TSVhfVkRJU0FCTEUKKyNlbmRpZgorLyogZ2xpYmMtMi4xMi4xIHVzZXMgb25seSBWU1dUQyBuYW1lICovCisjaWYgZGVmaW5lZChWU1dUQykgJiYgIWRlZmluZWQoVlNXVENIKQorIyBkZWZpbmUgVlNXVENIIFZTV1RDCisjZW5kaWYKKy8qIElTQyByZW5hbWVkIHN3dGNoIHRvIHN1c3AgZm9yIHRlcm1pb3MsIGJ1dCB3ZSdsbCBhY2NlcHQgZWl0aGVyIG5hbWUgKi8KKyNpZiBkZWZpbmVkKFZTVVNQKSAmJiAhZGVmaW5lZChWU1dUQ0gpCisjIGRlZmluZSBWU1dUQ0ggVlNVU1AKKyMgZGVmaW5lIENTV1RDSCBDU1VTUAorI2VuZGlmCisjaWYgZGVmaW5lZChWU1dUQ0gpICYmICFkZWZpbmVkKENTV1RDSCkKKyMgZGVmaW5lIENTV1RDSCBfUE9TSVhfVkRJU0FCTEUKKyNlbmRpZgorCisvKiBTdW5PUyA1LjMgbG9zZXMgKF5aIGRvZXNuJ3Qgd29yaykgaWYgJ3N3dGNoJyBpcyB0aGUgc2FtZSBhcyAnc3VzcCcuCisgICBTbyB0aGUgZGVmYXVsdCBpcyB0byBkaXNhYmxlICdzd3RjaC4nICAqLworI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fc3ZyNF9fKQorIyB1bmRlZiBDU1dUQ0gKKyMgZGVmaW5lIENTV1RDSCBfUE9TSVhfVkRJU0FCTEUKKyNlbmRpZgorCisjaWYgZGVmaW5lZChWV0VSU0UpICYmICFkZWZpbmVkKFZXRVJBU0UpICAgICAgIC8qIEFJWC0zLjIuNSAqLworIyBkZWZpbmUgVldFUkFTRSBWV0VSU0UKKyNlbmRpZgorI2lmIGRlZmluZWQoVkRTVVNQKSAmJiAhZGVmaW5lZChDRFNVU1ApCisjIGRlZmluZSBDRFNVU1AgQ29udHJvbCgneScpCisjZW5kaWYKKyNpZiAhZGVmaW5lZChWUkVQUklOVCkgJiYgZGVmaW5lZChWUlBSTlQpICAgICAgIC8qIElyaXggNC4wLjUgKi8KKyMgZGVmaW5lIFZSRVBSSU5UIFZSUFJOVAorI2VuZGlmCisjaWYgZGVmaW5lZChWUkVQUklOVCkgJiYgIWRlZmluZWQoQ1JQUk5UKQorIyBkZWZpbmUgQ1JQUk5UIENvbnRyb2woJ3InKQorI2VuZGlmCisjaWYgZGVmaW5lZChWV0VSQVNFKSAmJiAhZGVmaW5lZChDV0VSQVNFKQorIyBkZWZpbmUgQ1dFUkFTRSBDb250cm9sKCd3JykKKyNlbmRpZgorI2lmIGRlZmluZWQoVkxORVhUKSAmJiAhZGVmaW5lZChDTE5FWFQpCisjIGRlZmluZSBDTE5FWFQgQ29udHJvbCgndicpCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZESVNDQVJEKSAmJiAhZGVmaW5lZChWRkxVU0hPKQorIyBkZWZpbmUgVkZMVVNITyBWRElTQ0FSRAorI2VuZGlmCisjaWYgZGVmaW5lZChWRkxVU0gpICYmICFkZWZpbmVkKFZGTFVTSE8pICAgICAgICAvKiBVbHRyaXggNC4yICovCisjIGRlZmluZSBWRkxVU0hPIFZGTFVTSAorI2VuZGlmCisjaWYgZGVmaW5lZChDVExFQ0gpICYmICFkZWZpbmVkKEVDSE9DVEwpICAgICAgICAvKiBVbHRyaXggNC4zICovCisjIGRlZmluZSBFQ0hPQ1RMIENUTEVDSAorI2VuZGlmCisjaWYgZGVmaW5lZChUQ1RMRUNIKSAmJiAhZGVmaW5lZChFQ0hPQ1RMKSAgICAgICAvKiBVbHRyaXggNC4yICovCisjIGRlZmluZSBFQ0hPQ1RMIFRDVExFQ0gKKyNlbmRpZgorI2lmIGRlZmluZWQoQ1JUS0lMKSAmJiAhZGVmaW5lZChFQ0hPS0UpICAgICAgICAgLyogVWx0cml4IDQuMiBhbmQgNC4zICovCisjIGRlZmluZSBFQ0hPS0UgQ1JUS0lMCisjZW5kaWYKKyNpZiBkZWZpbmVkKFZGTFVTSE8pICYmICFkZWZpbmVkKENGTFVTSE8pCisjIGRlZmluZSBDRkxVU0hPIENvbnRyb2woJ28nKQorI2VuZGlmCisjaWYgZGVmaW5lZChWU1RBVFVTKSAmJiAhZGVmaW5lZChDU1RBVFVTKQorIyBkZWZpbmUgQ1NUQVRVUyBDb250cm9sKCd0JykKKyNlbmRpZgorCisvKiBTYXZlIHVzIGZyb20gI2lmZGVmIGZvcmVzdCBwbGFndWUgKi8KKyNpZm5kZWYgQlNETFkKKyMgZGVmaW5lIEJTRExZIDAKKyNlbmRpZgorI2lmbmRlZiBDSUJBVUQKKyMgZGVmaW5lIENJQkFVRCAwCisjZW5kaWYKKyNpZm5kZWYgQ1JETFkKKyMgZGVmaW5lIENSRExZIDAKKyNlbmRpZgorI2lmbmRlZiBDUlRTQ1RTCisjIGRlZmluZSBDUlRTQ1RTIDAKKyNlbmRpZgorI2lmbmRlZiBFQ0hPQ1RMCisjIGRlZmluZSBFQ0hPQ1RMIDAKKyNlbmRpZgorI2lmbmRlZiBFQ0hPS0UKKyMgZGVmaW5lIEVDSE9LRSAwCisjZW5kaWYKKyNpZm5kZWYgRUNIT1BSVAorIyBkZWZpbmUgRUNIT1BSVCAwCisjZW5kaWYKKyNpZm5kZWYgRkZETFkKKyMgZGVmaW5lIEZGRExZIDAKKyNlbmRpZgorI2lmbmRlZiBJRVhURU4KKyMgZGVmaW5lIElFWFRFTiAwCisjZW5kaWYKKyNpZm5kZWYgSU1BWEJFTAorIyBkZWZpbmUgSU1BWEJFTCAwCisjZW5kaWYKKyNpZm5kZWYgSVVDTEMKKyMgZGVmaW5lIElVQ0xDIDAKKyNlbmRpZgorI2lmbmRlZiBJWEFOWQorIyBkZWZpbmUgSVhBTlkgMAorI2VuZGlmCisjaWZuZGVmIE5MRExZCisjIGRlZmluZSBOTERMWSAwCisjZW5kaWYKKyNpZm5kZWYgT0NSTkwKKyMgZGVmaW5lIE9DUk5MIDAKKyNlbmRpZgorI2lmbmRlZiBPRkRFTAorIyBkZWZpbmUgT0ZERUwgMAorI2VuZGlmCisjaWZuZGVmIE9GSUxMCisjIGRlZmluZSBPRklMTCAwCisjZW5kaWYKKyNpZm5kZWYgT0xDVUMKKyMgZGVmaW5lIE9MQ1VDIDAKKyNlbmRpZgorI2lmbmRlZiBPTkxDUgorIyBkZWZpbmUgT05MQ1IgMAorI2VuZGlmCisjaWZuZGVmIE9OTFJFVAorIyBkZWZpbmUgT05MUkVUIDAKKyNlbmRpZgorI2lmbmRlZiBPTk9DUgorIyBkZWZpbmUgT05PQ1IgMAorI2VuZGlmCisjaWZuZGVmIE9YVEFCUworIyBkZWZpbmUgT1hUQUJTIDAKKyNlbmRpZgorI2lmbmRlZiBUQUJETFkKKyMgZGVmaW5lIFRBQkRMWSAwCisjZW5kaWYKKyNpZm5kZWYgVEFCMQorIyBkZWZpbmUgVEFCMSAwCisjZW5kaWYKKyNpZm5kZWYgVEFCMgorIyBkZWZpbmUgVEFCMiAwCisjZW5kaWYKKyNpZm5kZWYgVE9TVE9QCisjIGRlZmluZSBUT1NUT1AgMAorI2VuZGlmCisjaWZuZGVmIFZEU1VTUAorIyBkZWZpbmUgVkRTVVNQIDAKKyNlbmRpZgorI2lmbmRlZiBWRU9MMgorIyBkZWZpbmUgVkVPTDIgMAorI2VuZGlmCisjaWZuZGVmIFZGTFVTSE8KKyMgZGVmaW5lIFZGTFVTSE8gMAorI2VuZGlmCisjaWZuZGVmIFZMTkVYVAorIyBkZWZpbmUgVkxORVhUIDAKKyNlbmRpZgorI2lmbmRlZiBWUkVQUklOVAorIyBkZWZpbmUgVlJFUFJJTlQgMAorI2VuZGlmCisjaWZuZGVmIFZTVEFUVVMKKyMgZGVmaW5lIFZTVEFUVVMgMAorI2VuZGlmCisjaWZuZGVmIFZTV1RDSAorIyBkZWZpbmUgVlNXVENIIDAKKyNlbmRpZgorI2lmbmRlZiBWVERMWQorIyBkZWZpbmUgVlRETFkgMAorI2VuZGlmCisjaWZuZGVmIFZXRVJBU0UKKyMgZGVmaW5lIFZXRVJBU0UgMAorI2VuZGlmCisjaWZuZGVmIFhDQVNFCisjIGRlZmluZSBYQ0FTRSAwCisjZW5kaWYKKyNpZm5kZWYgSVVURjgKKyMgZGVmaW5lIElVVEY4IDAKKyNlbmRpZgorCisvKiBXaGljaCBzcGVlZHMgdG8gc2V0ICovCitlbnVtIHNwZWVkX3NldHRpbmcgeworCWlucHV0X3NwZWVkLCBvdXRwdXRfc3BlZWQsIGJvdGhfc3BlZWRzCit9OworCisvKiBXaGljaCBtZW1iZXIocykgb2YgJ3N0cnVjdCB0ZXJtaW9zJyBhIG1vZGUgdXNlcyAqLworZW51bSB7CisJY29udHJvbCwgaW5wdXQsIG91dHB1dCwgbG9jYWwsIGNvbWJpbmF0aW9uCit9Oworc3RhdGljIHRjZmxhZ190ICpnZXRfcHRyX3RvX3RjZmxhZyh1bnNpZ25lZCB0eXBlLCBjb25zdCBzdHJ1Y3QgdGVybWlvcyAqbW9kZSkKK3sKKwlzdGF0aWMgY29uc3QgdWludDhfdCB0Y2ZsYWdfb2Zmc2V0c1tdIEFMSUdOMSA9IHsKKwkJb2Zmc2V0b2Yoc3RydWN0IHRlcm1pb3MsIGNfY2ZsYWcpLCAvKiBjb250cm9sICovCisJCW9mZnNldG9mKHN0cnVjdCB0ZXJtaW9zLCBjX2lmbGFnKSwgLyogaW5wdXQgKi8KKwkJb2Zmc2V0b2Yoc3RydWN0IHRlcm1pb3MsIGNfb2ZsYWcpLCAvKiBvdXRwdXQgKi8KKwkJb2Zmc2V0b2Yoc3RydWN0IHRlcm1pb3MsIGNfbGZsYWcpICAvKiBsb2NhbCAqLworCX07CisJaWYgKHR5cGUgPD0gbG9jYWwpIHsKKwkJcmV0dXJuICh0Y2ZsYWdfdCopICgoKGNoYXIqKW1vZGUpICsgdGNmbGFnX29mZnNldHNbdHlwZV0pOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworLyogRmxhZ3MgZm9yICdzdHJ1Y3QgbW9kZV9pbmZvJyAqLworI2RlZmluZSBTQU5FX1NFVCAxICAgICAgICAgICAgICAvKiBTZXQgaW4gJ3NhbmUnIG1vZGUgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBTQU5FX1VOU0VUIDIgICAgICAgICAgICAvKiBVbnNldCBpbiAnc2FuZScgbW9kZSAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSRVYgNCAgICAgICAgICAgICAgICAgICAvKiBDYW4gYmUgdHVybmVkIG9mZiBieSBwcmVwZW5kaW5nICctJyAqLworI2RlZmluZSBPTUlUIDggICAgICAgICAgICAgICAgICAvKiBEb24ndCBkaXNwbGF5IHZhbHVlICAgICAgICAgICAgICAgICAqLworCisKKy8qIEVhY2ggbW9kZS4KKyAqIFRoaXMgc3RydWN0dXJlIHNob3VsZCBiZSBrZXB0IGFzIHNtYWxsIGFzIGh1bWFubHkgcG9zc2libGUuCisgKi8KK3N0cnVjdCBtb2RlX2luZm8geworCWNvbnN0IHVpbnQ4X3QgdHlwZTsgICAgICAgICAgIC8qIFdoaWNoIHN0cnVjdHVyZSBlbGVtZW50IHRvIGNoYW5nZSAgICAqLworCWNvbnN0IHVpbnQ4X3QgZmxhZ3M7ICAgICAgICAgIC8qIFNldHRpbmcgYW5kIGRpc3BsYXkgb3B0aW9ucyAgICAgICAgICAqLworCS8qIG9ubHkgdGhlc2UgdmFsdWVzIGFyZSBldmVyIHVzZWQsIHNvLi4uICovCisjaWYgICAoQ1NJWkUgfCBOTERMWSB8IENSRExZIHwgVEFCRExZIHwgQlNETFkgfCBWVERMWSB8IEZGRExZKSA8IDB4MTAwCisJY29uc3QgdWludDhfdCBtYXNrOworI2VsaWYgKENTSVpFIHwgTkxETFkgfCBDUkRMWSB8IFRBQkRMWSB8IEJTRExZIHwgVlRETFkgfCBGRkRMWSkgPCAweDEwMDAwCisJY29uc3QgdWludDE2X3QgbWFzazsKKyNlbHNlCisJY29uc3QgdGNmbGFnX3QgbWFzazsgICAgICAgICAgLyogT3RoZXIgYml0cyB0byB0dXJuIG9mZiBmb3IgdGhpcyBtb2RlICovCisjZW5kaWYKKwkvKiB3YXMgdXNpbmcgc2hvcnQgaGVyZSwgYnV0IHBwYzMyIHdhcyB1bmhhcHB5ICovCisJY29uc3QgdGNmbGFnX3QgYml0czsgICAgICAgICAgLyogQml0cyB0byBzZXQgZm9yIHRoaXMgbW9kZSAgICAgICAgICAgICovCit9OworCitlbnVtIHsKKwkvKiBNdXN0IG1hdGNoIG1vZGVfbmFtZVtdIGFuZCBtb2RlX2luZm9bXSBvcmRlciEgKi8KKwlJRFhfZXZlbnAgPSAwLAorCUlEWF9wYXJpdHksCisJSURYX29kZHAsCisJSURYX25sLAorCUlEWF9laywKKwlJRFhfc2FuZSwKKwlJRFhfY29va2VkLAorCUlEWF9yYXcsCisJSURYX3Bhc3M4LAorCUlEWF9saXRvdXQsCisJSURYX2NicmVhaywKKwlJRFhfY3J0LAorCUlEWF9kZWMsCisjaWYgSVhBTlkKKwlJRFhfZGVjY3RscSwKKyNlbmRpZgorI2lmIFRBQkRMWSB8fCBPWFRBQlMKKwlJRFhfdGFicywKKyNlbmRpZgorI2lmIFhDQVNFICYmIElVQ0xDICYmIE9MQ1VDCisJSURYX2xjYXNlLAorCUlEWF9MQ0FTRSwKKyNlbmRpZgorfTsKKworI2RlZmluZSBNSV9FTlRSWShOLFQsRixCLE0pIE4gIlwwIgorCisvKiBNb2RlIG5hbWVzIGdpdmVuIG9uIGNvbW1hbmQgbGluZSAqLworc3RhdGljIGNvbnN0IGNoYXIgbW9kZV9uYW1lW10gPQorCU1JX0VOVFJZKCJldmVucCIsICAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoInBhcml0eSIsICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgib2RkcCIsICAgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJubCIsICAgICAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoImVrIiwgICAgICAgY29tYmluYXRpb24sIE9NSVQsICAgICAgICAgICAgICAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgic2FuZSIsICAgICBjb21iaW5hdGlvbiwgT01JVCwgICAgICAgICAgICAgIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJjb29rZWQiLCAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoInJhdyIsICAgICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgicGFzczgiLCAgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJsaXRvdXQiLCAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoImNicmVhayIsICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgiY3J0IiwgICAgICBjb21iaW5hdGlvbiwgT01JVCwgICAgICAgICAgICAgIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJkZWMiLCAgICAgIGNvbWJpbmF0aW9uLCBPTUlULCAgICAgICAgICAgICAgMCwgICAgICAgICAgMCApCisjaWYgSVhBTlkKKwlNSV9FTlRSWSgiZGVjY3RscSIsICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorI2VuZGlmCisjaWYgVEFCRExZIHx8IE9YVEFCUworCU1JX0VOVFJZKCJ0YWJzIiwgICAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisjZW5kaWYKKyNpZiBYQ0FTRSAmJiBJVUNMQyAmJiBPTENVQworCU1JX0VOVFJZKCJsY2FzZSIsICAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoIkxDQVNFIiwgICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKyNlbmRpZgorCU1JX0VOVFJZKCJwYXJlbmIiLCAgIGNvbnRyb2wsICAgICBSRVYsICAgICAgICAgICAgICAgUEFSRU5CLCAgICAgMCApCisJTUlfRU5UUlkoInBhcm9kZCIsICAgY29udHJvbCwgICAgIFJFViwgICAgICAgICAgICAgICBQQVJPREQsICAgICAwICkKKwlNSV9FTlRSWSgiY3M1IiwgICAgICBjb250cm9sLCAgICAgMCwgICAgICAgICAgICAgICAgIENTNSwgICAgIENTSVpFKQorCU1JX0VOVFJZKCJjczYiLCAgICAgIGNvbnRyb2wsICAgICAwLCAgICAgICAgICAgICAgICAgQ1M2LCAgICAgQ1NJWkUpCisJTUlfRU5UUlkoImNzNyIsICAgICAgY29udHJvbCwgICAgIDAsICAgICAgICAgICAgICAgICBDUzcsICAgICBDU0laRSkKKwlNSV9FTlRSWSgiY3M4IiwgICAgICBjb250cm9sLCAgICAgMCwgICAgICAgICAgICAgICAgIENTOCwgICAgIENTSVpFKQorCU1JX0VOVFJZKCJodXBjbCIsICAgIGNvbnRyb2wsICAgICBSRVYsICAgICAgICAgICAgICAgSFVQQ0wsICAgICAgMCApCisJTUlfRU5UUlkoImh1cCIsICAgICAgY29udHJvbCwgICAgIFJFViAgICAgICAgfCBPTUlULCBIVVBDTCwgICAgICAwICkKKwlNSV9FTlRSWSgiY3N0b3BiIiwgICBjb250cm9sLCAgICAgUkVWLCAgICAgICAgICAgICAgIENTVE9QQiwgICAgIDAgKQorCU1JX0VOVFJZKCJjcmVhZCIsICAgIGNvbnRyb2wsICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgQ1JFQUQsICAgICAgMCApCisJTUlfRU5UUlkoImNsb2NhbCIsICAgY29udHJvbCwgICAgIFJFViwgICAgICAgICAgICAgICBDTE9DQUwsICAgICAwICkKKyNpZiBDUlRTQ1RTCisJTUlfRU5UUlkoImNydHNjdHMiLCAgY29udHJvbCwgICAgIFJFViwgICAgICAgICAgICAgICBDUlRTQ1RTLCAgICAwICkKKyNlbmRpZgorCU1JX0VOVFJZKCJpZ25icmsiLCAgIGlucHV0LCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgSUdOQlJLLCAgICAgMCApCisJTUlfRU5UUlkoImJya2ludCIsICAgaW5wdXQsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBCUktJTlQsICAgICAwICkKKwlNSV9FTlRSWSgiaWducGFyIiwgICBpbnB1dCwgICAgICAgUkVWLCAgICAgICAgICAgICAgIElHTlBBUiwgICAgIDAgKQorCU1JX0VOVFJZKCJwYXJtcmsiLCAgIGlucHV0LCAgICAgICBSRVYsICAgICAgICAgICAgICAgUEFSTVJLLCAgICAgMCApCisJTUlfRU5UUlkoImlucGNrIiwgICAgaW5wdXQsICAgICAgIFJFViwgICAgICAgICAgICAgICBJTlBDSywgICAgICAwICkKKwlNSV9FTlRSWSgiaXN0cmlwIiwgICBpbnB1dCwgICAgICAgUkVWLCAgICAgICAgICAgICAgIElTVFJJUCwgICAgIDAgKQorCU1JX0VOVFJZKCJpbmxjciIsICAgIGlucHV0LCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgSU5MQ1IsICAgICAgMCApCisJTUlfRU5UUlkoImlnbmNyIiwgICAgaW5wdXQsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBJR05DUiwgICAgICAwICkKKwlNSV9FTlRSWSgiaWNybmwiLCAgICBpbnB1dCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIElDUk5MLCAgICAgIDAgKQorCU1JX0VOVFJZKCJpeG9uIiwgICAgIGlucHV0LCAgICAgICBSRVYsICAgICAgICAgICAgICAgSVhPTiwgICAgICAgMCApCisJTUlfRU5UUlkoIml4b2ZmIiwgICAgaW5wdXQsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBJWE9GRiwgICAgICAwICkKKwlNSV9FTlRSWSgidGFuZGVtIiwgICBpbnB1dCwgICAgICAgT01JVCAgICAgICB8IFJFViwgIElYT0ZGLCAgICAgIDAgKQorI2lmIElVQ0xDCisJTUlfRU5UUlkoIml1Y2xjIiwgICAgaW5wdXQsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBJVUNMQywgICAgICAwICkKKyNlbmRpZgorI2lmIElYQU5ZCisJTUlfRU5UUlkoIml4YW55IiwgICAgaW5wdXQsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBJWEFOWSwgICAgICAwICkKKyNlbmRpZgorI2lmIElNQVhCRUwKKwlNSV9FTlRSWSgiaW1heGJlbCIsICBpbnB1dCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIElNQVhCRUwsICAgIDAgKQorI2VuZGlmCisjaWYgSVVURjgKKwlNSV9FTlRSWSgiaXV0ZjgiLCAgICBpbnB1dCwgICAgICAgU0FORV9VTlNFVCB8IFJFViwgIElVVEY4LCAgICAgIDAgKQorI2VuZGlmCisJTUlfRU5UUlkoIm9wb3N0IiwgICAgb3V0cHV0LCAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBPUE9TVCwgICAgICAwICkKKyNpZiBPTENVQworCU1JX0VOVFJZKCJvbGN1YyIsICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgT0xDVUMsICAgICAgMCApCisjZW5kaWYKKyNpZiBPQ1JOTAorCU1JX0VOVFJZKCJvY3JubCIsICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgT0NSTkwsICAgICAgMCApCisjZW5kaWYKKyNpZiBPTkxDUgorCU1JX0VOVFJZKCJvbmxjciIsICAgIG91dHB1dCwgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgT05MQ1IsICAgICAgMCApCisjZW5kaWYKKyNpZiBPTk9DUgorCU1JX0VOVFJZKCJvbm9jciIsICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgT05PQ1IsICAgICAgMCApCisjZW5kaWYKKyNpZiBPTkxSRVQKKwlNSV9FTlRSWSgib25scmV0IiwgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCB8IFJFViwgIE9OTFJFVCwgICAgIDAgKQorI2VuZGlmCisjaWYgT0ZJTEwKKwlNSV9FTlRSWSgib2ZpbGwiLCAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCB8IFJFViwgIE9GSUxMLCAgICAgIDAgKQorI2VuZGlmCisjaWYgT0ZERUwKKwlNSV9FTlRSWSgib2ZkZWwiLCAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCB8IFJFViwgIE9GREVMLCAgICAgIDAgKQorI2VuZGlmCisjaWYgTkxETFkKKwlNSV9FTlRSWSgibmwxIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIE5MMSwgICAgIE5MRExZKQorCU1JX0VOVFJZKCJubDAiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1NFVCwgICAgICAgICAgTkwwLCAgICAgTkxETFkpCisjZW5kaWYKKyNpZiBDUkRMWQorCU1JX0VOVFJZKCJjcjMiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VULCAgICAgICAgQ1IzLCAgICAgQ1JETFkpCisJTUlfRU5UUlkoImNyMiIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBDUjIsICAgICBDUkRMWSkKKwlNSV9FTlRSWSgiY3IxIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIENSMSwgICAgIENSRExZKQorCU1JX0VOVFJZKCJjcjAiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1NFVCwgICAgICAgICAgQ1IwLCAgICAgQ1JETFkpCisjZW5kaWYKKworI2lmIFRBQkRMWQorCU1JX0VOVFJZKCJ0YWIzIiwgICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VULCAgICAgICAgVEFCMywgICBUQUJETFkpCisjIGlmIFRBQjIKKwlNSV9FTlRSWSgidGFiMiIsICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIFRBQjIsICAgVEFCRExZKQorIyBlbmRpZgorIyBpZiBUQUIxCisJTUlfRU5UUlkoInRhYjEiLCAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBUQUIxLCAgIFRBQkRMWSkKKyMgZW5kaWYKKwlNSV9FTlRSWSgidGFiMCIsICAgICBvdXRwdXQsICAgICAgU0FORV9TRVQsICAgICAgICAgIFRBQjAsICAgVEFCRExZKQorI2Vsc2UKKyMgaWYgT1hUQUJTCisJTUlfRU5UUlkoInRhYjMiLCAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBPWFRBQlMsICAgICAwICkKKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgQlNETFkKKwlNSV9FTlRSWSgiYnMxIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIEJTMSwgICAgIEJTRExZKQorCU1JX0VOVFJZKCJiczAiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1NFVCwgICAgICAgICAgQlMwLCAgICAgQlNETFkpCisjZW5kaWYKKyNpZiBWVERMWQorCU1JX0VOVFJZKCJ2dDEiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VULCAgICAgICAgVlQxLCAgICAgVlRETFkpCisJTUlfRU5UUlkoInZ0MCIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfU0VULCAgICAgICAgICBWVDAsICAgICBWVERMWSkKKyNlbmRpZgorI2lmIEZGRExZCisJTUlfRU5UUlkoImZmMSIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBGRjEsICAgICBGRkRMWSkKKwlNSV9FTlRSWSgiZmYwIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9TRVQsICAgICAgICAgIEZGMCwgICAgIEZGRExZKQorI2VuZGlmCisJTUlfRU5UUlkoImlzaWciLCAgICAgbG9jYWwsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBJU0lHLCAgICAgICAwICkKKwlNSV9FTlRSWSgiaWNhbm9uIiwgICBsb2NhbCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIElDQU5PTiwgICAgIDAgKQorI2lmIElFWFRFTgorCU1JX0VOVFJZKCJpZXh0ZW4iLCAgIGxvY2FsLCAgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgSUVYVEVOLCAgICAgMCApCisjZW5kaWYKKwlNSV9FTlRSWSgiZWNobyIsICAgICBsb2NhbCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIEVDSE8sICAgICAgIDAgKQorCU1JX0VOVFJZKCJlY2hvZSIsICAgIGxvY2FsLCAgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgRUNIT0UsICAgICAgMCApCisJTUlfRU5UUlkoImNydGVyYXNlIiwgbG9jYWwsICAgICAgIE9NSVQgICAgICAgfCBSRVYsICBFQ0hPRSwgICAgICAwICkKKwlNSV9FTlRSWSgiZWNob2siLCAgICBsb2NhbCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIEVDSE9LLCAgICAgIDAgKQorCU1JX0VOVFJZKCJlY2hvbmwiLCAgIGxvY2FsLCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgRUNIT05MLCAgICAgMCApCisJTUlfRU5UUlkoIm5vZmxzaCIsICAgbG9jYWwsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBOT0ZMU0gsICAgICAwICkKKyNpZiBYQ0FTRQorCU1JX0VOVFJZKCJ4Y2FzZSIsICAgIGxvY2FsLCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgWENBU0UsICAgICAgMCApCisjZW5kaWYKKyNpZiBUT1NUT1AKKwlNSV9FTlRSWSgidG9zdG9wIiwgICBsb2NhbCwgICAgICAgU0FORV9VTlNFVCB8IFJFViwgIFRPU1RPUCwgICAgIDAgKQorI2VuZGlmCisjaWYgRUNIT1BSVAorCU1JX0VOVFJZKCJlY2hvcHJ0IiwgIGxvY2FsLCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgRUNIT1BSVCwgICAgMCApCisJTUlfRU5UUlkoInBydGVyYXNlIiwgbG9jYWwsICAgICAgIE9NSVQgICAgICAgfCBSRVYsICBFQ0hPUFJULCAgICAwICkKKyNlbmRpZgorI2lmIEVDSE9DVEwKKwlNSV9FTlRSWSgiZWNob2N0bCIsICBsb2NhbCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIEVDSE9DVEwsICAgIDAgKQorCU1JX0VOVFJZKCJjdGxlY2hvIiwgIGxvY2FsLCAgICAgICBPTUlUICAgICAgIHwgUkVWLCAgRUNIT0NUTCwgICAgMCApCisjZW5kaWYKKyNpZiBFQ0hPS0UKKwlNSV9FTlRSWSgiZWNob2tlIiwgICBsb2NhbCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIEVDSE9LRSwgICAgIDAgKQorCU1JX0VOVFJZKCJjcnRraWxsIiwgIGxvY2FsLCAgICAgICBPTUlUICAgICAgIHwgUkVWLCAgRUNIT0tFLCAgICAgMCApCisjZW5kaWYKKwk7CisKKyN1bmRlZiBNSV9FTlRSWQorI2RlZmluZSBNSV9FTlRSWShOLFQsRixCLE0pIHsgVCwgRiwgTSwgQiB9LAorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1vZGVfaW5mbyBtb2RlX2luZm9bXSA9IHsKKwkvKiBUaGlzIHNob3VsZCBiZSB2ZXJiYXRpbSBjdXQtbi1wYXN0ZSBjb3B5IG9mIHRoZSBhYm92ZSBNSV9FTlRSWXMgKi8KKwlNSV9FTlRSWSgiZXZlbnAiLCAgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJwYXJpdHkiLCAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoIm9kZHAiLCAgICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgibmwiLCAgICAgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJlayIsICAgICAgIGNvbWJpbmF0aW9uLCBPTUlULCAgICAgICAgICAgICAgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoInNhbmUiLCAgICAgY29tYmluYXRpb24sIE9NSVQsICAgICAgICAgICAgICAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgiY29va2VkIiwgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJyYXciLCAgICAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoInBhc3M4IiwgICAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgibGl0b3V0IiwgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJjYnJlYWsiLCAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisJTUlfRU5UUlkoImNydCIsICAgICAgY29tYmluYXRpb24sIE9NSVQsICAgICAgICAgICAgICAwLCAgICAgICAgICAwICkKKwlNSV9FTlRSWSgiZGVjIiwgICAgICBjb21iaW5hdGlvbiwgT01JVCwgICAgICAgICAgICAgIDAsICAgICAgICAgIDAgKQorI2lmIElYQU5ZCisJTUlfRU5UUlkoImRlY2N0bHEiLCAgY29tYmluYXRpb24sIFJFViAgICAgICAgfCBPTUlULCAwLCAgICAgICAgICAwICkKKyNlbmRpZgorI2lmIFRBQkRMWSB8fCBPWFRBQlMKKwlNSV9FTlRSWSgidGFicyIsICAgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorI2VuZGlmCisjaWYgWENBU0UgJiYgSVVDTEMgJiYgT0xDVUMKKwlNSV9FTlRSWSgibGNhc2UiLCAgICBjb21iaW5hdGlvbiwgUkVWICAgICAgICB8IE9NSVQsIDAsICAgICAgICAgIDAgKQorCU1JX0VOVFJZKCJMQ0FTRSIsICAgIGNvbWJpbmF0aW9uLCBSRVYgICAgICAgIHwgT01JVCwgMCwgICAgICAgICAgMCApCisjZW5kaWYKKwlNSV9FTlRSWSgicGFyZW5iIiwgICBjb250cm9sLCAgICAgUkVWLCAgICAgICAgICAgICAgIFBBUkVOQiwgICAgIDAgKQorCU1JX0VOVFJZKCJwYXJvZGQiLCAgIGNvbnRyb2wsICAgICBSRVYsICAgICAgICAgICAgICAgUEFST0RELCAgICAgMCApCisJTUlfRU5UUlkoImNzNSIsICAgICAgY29udHJvbCwgICAgIDAsICAgICAgICAgICAgICAgICBDUzUsICAgICBDU0laRSkKKwlNSV9FTlRSWSgiY3M2IiwgICAgICBjb250cm9sLCAgICAgMCwgICAgICAgICAgICAgICAgIENTNiwgICAgIENTSVpFKQorCU1JX0VOVFJZKCJjczciLCAgICAgIGNvbnRyb2wsICAgICAwLCAgICAgICAgICAgICAgICAgQ1M3LCAgICAgQ1NJWkUpCisJTUlfRU5UUlkoImNzOCIsICAgICAgY29udHJvbCwgICAgIDAsICAgICAgICAgICAgICAgICBDUzgsICAgICBDU0laRSkKKwlNSV9FTlRSWSgiaHVwY2wiLCAgICBjb250cm9sLCAgICAgUkVWLCAgICAgICAgICAgICAgIEhVUENMLCAgICAgIDAgKQorCU1JX0VOVFJZKCJodXAiLCAgICAgIGNvbnRyb2wsICAgICBSRVYgICAgICAgIHwgT01JVCwgSFVQQ0wsICAgICAgMCApCisJTUlfRU5UUlkoImNzdG9wYiIsICAgY29udHJvbCwgICAgIFJFViwgICAgICAgICAgICAgICBDU1RPUEIsICAgICAwICkKKwlNSV9FTlRSWSgiY3JlYWQiLCAgICBjb250cm9sLCAgICAgU0FORV9TRVQgICB8IFJFViwgIENSRUFELCAgICAgIDAgKQorCU1JX0VOVFJZKCJjbG9jYWwiLCAgIGNvbnRyb2wsICAgICBSRVYsICAgICAgICAgICAgICAgQ0xPQ0FMLCAgICAgMCApCisjaWYgQ1JUU0NUUworCU1JX0VOVFJZKCJjcnRzY3RzIiwgIGNvbnRyb2wsICAgICBSRVYsICAgICAgICAgICAgICAgQ1JUU0NUUywgICAgMCApCisjZW5kaWYKKwlNSV9FTlRSWSgiaWduYnJrIiwgICBpbnB1dCwgICAgICAgU0FORV9VTlNFVCB8IFJFViwgIElHTkJSSywgICAgIDAgKQorCU1JX0VOVFJZKCJicmtpbnQiLCAgIGlucHV0LCAgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgQlJLSU5ULCAgICAgMCApCisJTUlfRU5UUlkoImlnbnBhciIsICAgaW5wdXQsICAgICAgIFJFViwgICAgICAgICAgICAgICBJR05QQVIsICAgICAwICkKKwlNSV9FTlRSWSgicGFybXJrIiwgICBpbnB1dCwgICAgICAgUkVWLCAgICAgICAgICAgICAgIFBBUk1SSywgICAgIDAgKQorCU1JX0VOVFJZKCJpbnBjayIsICAgIGlucHV0LCAgICAgICBSRVYsICAgICAgICAgICAgICAgSU5QQ0ssICAgICAgMCApCisJTUlfRU5UUlkoImlzdHJpcCIsICAgaW5wdXQsICAgICAgIFJFViwgICAgICAgICAgICAgICBJU1RSSVAsICAgICAwICkKKwlNSV9FTlRSWSgiaW5sY3IiLCAgICBpbnB1dCwgICAgICAgU0FORV9VTlNFVCB8IFJFViwgIElOTENSLCAgICAgIDAgKQorCU1JX0VOVFJZKCJpZ25jciIsICAgIGlucHV0LCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgSUdOQ1IsICAgICAgMCApCisJTUlfRU5UUlkoImljcm5sIiwgICAgaW5wdXQsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBJQ1JOTCwgICAgICAwICkKKwlNSV9FTlRSWSgiaXhvbiIsICAgICBpbnB1dCwgICAgICAgUkVWLCAgICAgICAgICAgICAgIElYT04sICAgICAgIDAgKQorCU1JX0VOVFJZKCJpeG9mZiIsICAgIGlucHV0LCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgSVhPRkYsICAgICAgMCApCisJTUlfRU5UUlkoInRhbmRlbSIsICAgaW5wdXQsICAgICAgIE9NSVQgICAgICAgfCBSRVYsICBJWE9GRiwgICAgICAwICkKKyNpZiBJVUNMQworCU1JX0VOVFJZKCJpdWNsYyIsICAgIGlucHV0LCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgSVVDTEMsICAgICAgMCApCisjZW5kaWYKKyNpZiBJWEFOWQorCU1JX0VOVFJZKCJpeGFueSIsICAgIGlucHV0LCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgSVhBTlksICAgICAgMCApCisjZW5kaWYKKyNpZiBJTUFYQkVMCisJTUlfRU5UUlkoImltYXhiZWwiLCAgaW5wdXQsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBJTUFYQkVMLCAgICAwICkKKyNlbmRpZgorI2lmIElVVEY4CisJTUlfRU5UUlkoIml1dGY4IiwgICAgaW5wdXQsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBJVVRGOCwgICAgICAwICkKKyNlbmRpZgorCU1JX0VOVFJZKCJvcG9zdCIsICAgIG91dHB1dCwgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgT1BPU1QsICAgICAgMCApCisjaWYgT0xDVUMKKwlNSV9FTlRSWSgib2xjdWMiLCAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCB8IFJFViwgIE9MQ1VDLCAgICAgIDAgKQorI2VuZGlmCisjaWYgT0NSTkwKKwlNSV9FTlRSWSgib2NybmwiLCAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCB8IFJFViwgIE9DUk5MLCAgICAgIDAgKQorI2VuZGlmCisjaWYgT05MQ1IKKwlNSV9FTlRSWSgib25sY3IiLCAgICBvdXRwdXQsICAgICAgU0FORV9TRVQgICB8IFJFViwgIE9OTENSLCAgICAgIDAgKQorI2VuZGlmCisjaWYgT05PQ1IKKwlNSV9FTlRSWSgib25vY3IiLCAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCB8IFJFViwgIE9OT0NSLCAgICAgIDAgKQorI2VuZGlmCisjaWYgT05MUkVUCisJTUlfRU5UUlkoIm9ubHJldCIsICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBPTkxSRVQsICAgICAwICkKKyNlbmRpZgorI2lmIE9GSUxMCisJTUlfRU5UUlkoIm9maWxsIiwgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBPRklMTCwgICAgICAwICkKKyNlbmRpZgorI2lmIE9GREVMCisJTUlfRU5UUlkoIm9mZGVsIiwgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBPRkRFTCwgICAgICAwICkKKyNlbmRpZgorI2lmIE5MRExZCisJTUlfRU5UUlkoIm5sMSIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBOTDEsICAgICBOTERMWSkKKwlNSV9FTlRSWSgibmwwIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9TRVQsICAgICAgICAgIE5MMCwgICAgIE5MRExZKQorI2VuZGlmCisjaWYgQ1JETFkKKwlNSV9FTlRSWSgiY3IzIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIENSMywgICAgIENSRExZKQorCU1JX0VOVFJZKCJjcjIiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VULCAgICAgICAgQ1IyLCAgICAgQ1JETFkpCisJTUlfRU5UUlkoImNyMSIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBDUjEsICAgICBDUkRMWSkKKwlNSV9FTlRSWSgiY3IwIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9TRVQsICAgICAgICAgIENSMCwgICAgIENSRExZKQorI2VuZGlmCisKKyNpZiBUQUJETFkKKwlNSV9FTlRSWSgidGFiMyIsICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIFRBQjMsICAgVEFCRExZKQorIyBpZiBUQUIyCisJTUlfRU5UUlkoInRhYjIiLCAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBUQUIyLCAgIFRBQkRMWSkKKyMgZW5kaWYKKyMgaWYgVEFCMQorCU1JX0VOVFJZKCJ0YWIxIiwgICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VULCAgICAgICAgVEFCMSwgICBUQUJETFkpCisjIGVuZGlmCisJTUlfRU5UUlkoInRhYjAiLCAgICAgb3V0cHV0LCAgICAgIFNBTkVfU0VULCAgICAgICAgICBUQUIwLCAgIFRBQkRMWSkKKyNlbHNlCisjIGlmIE9YVEFCUworCU1JX0VOVFJZKCJ0YWIzIiwgICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VULCAgICAgICAgT1hUQUJTLCAgICAgMCApCisjIGVuZGlmCisjZW5kaWYKKworI2lmIEJTRExZCisJTUlfRU5UUlkoImJzMSIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfVU5TRVQsICAgICAgICBCUzEsICAgICBCU0RMWSkKKwlNSV9FTlRSWSgiYnMwIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9TRVQsICAgICAgICAgIEJTMCwgICAgIEJTRExZKQorI2VuZGlmCisjaWYgVlRETFkKKwlNSV9FTlRSWSgidnQxIiwgICAgICBvdXRwdXQsICAgICAgU0FORV9VTlNFVCwgICAgICAgIFZUMSwgICAgIFZURExZKQorCU1JX0VOVFJZKCJ2dDAiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1NFVCwgICAgICAgICAgVlQwLCAgICAgVlRETFkpCisjZW5kaWYKKyNpZiBGRkRMWQorCU1JX0VOVFJZKCJmZjEiLCAgICAgIG91dHB1dCwgICAgICBTQU5FX1VOU0VULCAgICAgICAgRkYxLCAgICAgRkZETFkpCisJTUlfRU5UUlkoImZmMCIsICAgICAgb3V0cHV0LCAgICAgIFNBTkVfU0VULCAgICAgICAgICBGRjAsICAgICBGRkRMWSkKKyNlbmRpZgorCU1JX0VOVFJZKCJpc2lnIiwgICAgIGxvY2FsLCAgICAgICBTQU5FX1NFVCAgIHwgUkVWLCAgSVNJRywgICAgICAgMCApCisJTUlfRU5UUlkoImljYW5vbiIsICAgbG9jYWwsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBJQ0FOT04sICAgICAwICkKKyNpZiBJRVhURU4KKwlNSV9FTlRSWSgiaWV4dGVuIiwgICBsb2NhbCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIElFWFRFTiwgICAgIDAgKQorI2VuZGlmCisJTUlfRU5UUlkoImVjaG8iLCAgICAgbG9jYWwsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBFQ0hPLCAgICAgICAwICkKKwlNSV9FTlRSWSgiZWNob2UiLCAgICBsb2NhbCwgICAgICAgU0FORV9TRVQgICB8IFJFViwgIEVDSE9FLCAgICAgIDAgKQorCU1JX0VOVFJZKCJjcnRlcmFzZSIsIGxvY2FsLCAgICAgICBPTUlUICAgICAgIHwgUkVWLCAgRUNIT0UsICAgICAgMCApCisJTUlfRU5UUlkoImVjaG9rIiwgICAgbG9jYWwsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBFQ0hPSywgICAgICAwICkKKwlNSV9FTlRSWSgiZWNob25sIiwgICBsb2NhbCwgICAgICAgU0FORV9VTlNFVCB8IFJFViwgIEVDSE9OTCwgICAgIDAgKQorCU1JX0VOVFJZKCJub2Zsc2giLCAgIGxvY2FsLCAgICAgICBTQU5FX1VOU0VUIHwgUkVWLCAgTk9GTFNILCAgICAgMCApCisjaWYgWENBU0UKKwlNSV9FTlRSWSgieGNhc2UiLCAgICBsb2NhbCwgICAgICAgU0FORV9VTlNFVCB8IFJFViwgIFhDQVNFLCAgICAgIDAgKQorI2VuZGlmCisjaWYgVE9TVE9QCisJTUlfRU5UUlkoInRvc3RvcCIsICAgbG9jYWwsICAgICAgIFNBTkVfVU5TRVQgfCBSRVYsICBUT1NUT1AsICAgICAwICkKKyNlbmRpZgorI2lmIEVDSE9QUlQKKwlNSV9FTlRSWSgiZWNob3BydCIsICBsb2NhbCwgICAgICAgU0FORV9VTlNFVCB8IFJFViwgIEVDSE9QUlQsICAgIDAgKQorCU1JX0VOVFJZKCJwcnRlcmFzZSIsIGxvY2FsLCAgICAgICBPTUlUICAgICAgIHwgUkVWLCAgRUNIT1BSVCwgICAgMCApCisjZW5kaWYKKyNpZiBFQ0hPQ1RMCisJTUlfRU5UUlkoImVjaG9jdGwiLCAgbG9jYWwsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBFQ0hPQ1RMLCAgICAwICkKKwlNSV9FTlRSWSgiY3RsZWNobyIsICBsb2NhbCwgICAgICAgT01JVCAgICAgICB8IFJFViwgIEVDSE9DVEwsICAgIDAgKQorI2VuZGlmCisjaWYgRUNIT0tFCisJTUlfRU5UUlkoImVjaG9rZSIsICAgbG9jYWwsICAgICAgIFNBTkVfU0VUICAgfCBSRVYsICBFQ0hPS0UsICAgICAwICkKKwlNSV9FTlRSWSgiY3J0a2lsbCIsICBsb2NhbCwgICAgICAgT01JVCAgICAgICB8IFJFViwgIEVDSE9LRSwgICAgIDAgKQorI2VuZGlmCit9OworCitlbnVtIHsKKwlOVU1fbW9kZV9pbmZvID0gQVJSQVlfU0laRShtb2RlX2luZm8pCit9OworCisKKy8qIENvbnRyb2wgY2hhcmFjdGVycyAqLworc3RydWN0IGNvbnRyb2xfaW5mbyB7CisJY29uc3QgdWludDhfdCBzYW5ldmFsOyAgLyogVmFsdWUgdG8gc2V0IGZvciAnc3R0eSBzYW5lJyAqLworCWNvbnN0IHVpbnQ4X3Qgb2Zmc2V0OyAgIC8qIE9mZnNldCBpbiBjX2NjICovCit9OworCitlbnVtIHsKKwkvKiBNdXN0IG1hdGNoIGNvbnRyb2xfbmFtZVtdIGFuZCBjb250cm9sX2luZm9bXSBvcmRlciEgKi8KKwlDSURYX2ludHIgPSAwLAorCUNJRFhfcXVpdCwKKwlDSURYX2VyYXNlLAorCUNJRFhfa2lsbCwKKwlDSURYX2VvZiwKKwlDSURYX2VvbCwKKyNpZiBWRU9MMgorCUNJRFhfZW9sMiwKKyNlbmRpZgorI2lmIFZTV1RDSAorCUNJRFhfc3d0Y2gsCisjZW5kaWYKKwlDSURYX3N0YXJ0LAorCUNJRFhfc3RvcCwKKwlDSURYX3N1c3AsCisjaWYgVkRTVVNQCisJQ0lEWF9kc3VzcCwKKyNlbmRpZgorI2lmIFZSRVBSSU5UCisJQ0lEWF9ycHJudCwKKyNlbmRpZgorI2lmIFZXRVJBU0UKKwlDSURYX3dlcmFzZSwKKyNlbmRpZgorI2lmIFZMTkVYVAorCUNJRFhfbG5leHQsCisjZW5kaWYKKyNpZiBWRkxVU0hPCisJQ0lEWF9mbHVzaCwKKyNlbmRpZgorI2lmIFZTVEFUVVMKKwlDSURYX3N0YXR1cywKKyNlbmRpZgorCUNJRFhfbWluLAorCUNJRFhfdGltZSwKK307CisKKyNkZWZpbmUgQ0lfRU5UUlkobixzLG8pIG4gIlwwIgorCisvKiBOYW1lIGdpdmVuIG9uIGNvbW1hbmQgbGluZSAqLworc3RhdGljIGNvbnN0IGNoYXIgY29udHJvbF9uYW1lW10gPQorCUNJX0VOVFJZKCJpbnRyIiwgICAgIENJTlRSLCAgIFZJTlRSICAgKQorCUNJX0VOVFJZKCJxdWl0IiwgICAgIENRVUlULCAgIFZRVUlUICAgKQorCUNJX0VOVFJZKCJlcmFzZSIsICAgIENFUkFTRSwgIFZFUkFTRSAgKQorCUNJX0VOVFJZKCJraWxsIiwgICAgIENLSUxMLCAgIFZLSUxMICAgKQorCUNJX0VOVFJZKCJlb2YiLCAgICAgIENFT0YsICAgIFZFT0YgICAgKQorCUNJX0VOVFJZKCJlb2wiLCAgICAgIENFT0wsICAgIFZFT0wgICAgKQorI2lmIFZFT0wyCisJQ0lfRU5UUlkoImVvbDIiLCAgICAgQ0VPTDIsICAgVkVPTDIgICApCisjZW5kaWYKKyNpZiBWU1dUQ0gKKwlDSV9FTlRSWSgic3d0Y2giLCAgICBDU1dUQ0gsICBWU1dUQ0ggICkKKyNlbmRpZgorCUNJX0VOVFJZKCJzdGFydCIsICAgIENTVEFSVCwgIFZTVEFSVCAgKQorCUNJX0VOVFJZKCJzdG9wIiwgICAgIENTVE9QLCAgIFZTVE9QICAgKQorCUNJX0VOVFJZKCJzdXNwIiwgICAgIENTVVNQLCAgIFZTVVNQICAgKQorI2lmIFZEU1VTUAorCUNJX0VOVFJZKCJkc3VzcCIsICAgIENEU1VTUCwgIFZEU1VTUCAgKQorI2VuZGlmCisjaWYgVlJFUFJJTlQKKwlDSV9FTlRSWSgicnBybnQiLCAgICBDUlBSTlQsICBWUkVQUklOVCkKKyNlbmRpZgorI2lmIFZXRVJBU0UKKwlDSV9FTlRSWSgid2VyYXNlIiwgICBDV0VSQVNFLCBWV0VSQVNFICkKKyNlbmRpZgorI2lmIFZMTkVYVAorCUNJX0VOVFJZKCJsbmV4dCIsICAgIENMTkVYVCwgIFZMTkVYVCAgKQorI2VuZGlmCisjaWYgVkZMVVNITworCUNJX0VOVFJZKCJmbHVzaCIsICAgIENGTFVTSE8sIFZGTFVTSE8gKQorI2VuZGlmCisjaWYgVlNUQVRVUworCUNJX0VOVFJZKCJzdGF0dXMiLCAgIENTVEFUVVMsIFZTVEFUVVMgKQorI2VuZGlmCisJLyogVGhlc2UgbXVzdCBiZSBsYXN0IGJlY2F1c2Ugb2YgdGhlIGRpc3BsYXkgcm91dGluZXMgKi8KKwlDSV9FTlRSWSgibWluIiwgICAgICAxLCAgICAgICBWTUlOICAgICkKKwlDSV9FTlRSWSgidGltZSIsICAgICAwLCAgICAgICBWVElNRSAgICkKKwk7CisKKyN1bmRlZiBDSV9FTlRSWQorI2RlZmluZSBDSV9FTlRSWShuLHMsbykgeyBzLCBvIH0sCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29udHJvbF9pbmZvIGNvbnRyb2xfaW5mb1tdID0geworCS8qIFRoaXMgc2hvdWxkIGJlIHZlcmJhdGltIGN1dC1uLXBhc3RlIGNvcHkgb2YgdGhlIGFib3ZlIENJX0VOVFJZcyAqLworCUNJX0VOVFJZKCJpbnRyIiwgICAgIENJTlRSLCAgIFZJTlRSICAgKQorCUNJX0VOVFJZKCJxdWl0IiwgICAgIENRVUlULCAgIFZRVUlUICAgKQorCUNJX0VOVFJZKCJlcmFzZSIsICAgIENFUkFTRSwgIFZFUkFTRSAgKQorCUNJX0VOVFJZKCJraWxsIiwgICAgIENLSUxMLCAgIFZLSUxMICAgKQorCUNJX0VOVFJZKCJlb2YiLCAgICAgIENFT0YsICAgIFZFT0YgICAgKQorCUNJX0VOVFJZKCJlb2wiLCAgICAgIENFT0wsICAgIFZFT0wgICAgKQorI2lmIFZFT0wyCisJQ0lfRU5UUlkoImVvbDIiLCAgICAgQ0VPTDIsICAgVkVPTDIgICApCisjZW5kaWYKKyNpZiBWU1dUQ0gKKwlDSV9FTlRSWSgic3d0Y2giLCAgICBDU1dUQ0gsICBWU1dUQ0ggICkKKyNlbmRpZgorCUNJX0VOVFJZKCJzdGFydCIsICAgIENTVEFSVCwgIFZTVEFSVCAgKQorCUNJX0VOVFJZKCJzdG9wIiwgICAgIENTVE9QLCAgIFZTVE9QICAgKQorCUNJX0VOVFJZKCJzdXNwIiwgICAgIENTVVNQLCAgIFZTVVNQICAgKQorI2lmIFZEU1VTUAorCUNJX0VOVFJZKCJkc3VzcCIsICAgIENEU1VTUCwgIFZEU1VTUCAgKQorI2VuZGlmCisjaWYgVlJFUFJJTlQKKwlDSV9FTlRSWSgicnBybnQiLCAgICBDUlBSTlQsICBWUkVQUklOVCkKKyNlbmRpZgorI2lmIFZXRVJBU0UKKwlDSV9FTlRSWSgid2VyYXNlIiwgICBDV0VSQVNFLCBWV0VSQVNFICkKKyNlbmRpZgorI2lmIFZMTkVYVAorCUNJX0VOVFJZKCJsbmV4dCIsICAgIENMTkVYVCwgIFZMTkVYVCAgKQorI2VuZGlmCisjaWYgVkZMVVNITworCUNJX0VOVFJZKCJmbHVzaCIsICAgIENGTFVTSE8sIFZGTFVTSE8gKQorI2VuZGlmCisjaWYgVlNUQVRVUworCUNJX0VOVFJZKCJzdGF0dXMiLCAgIENTVEFUVVMsIFZTVEFUVVMgKQorI2VuZGlmCisJLyogVGhlc2UgbXVzdCBiZSBsYXN0IGJlY2F1c2Ugb2YgdGhlIGRpc3BsYXkgcm91dGluZXMgKi8KKwlDSV9FTlRSWSgibWluIiwgICAgICAxLCAgICAgICBWTUlOICAgICkKKwlDSV9FTlRSWSgidGltZSIsICAgICAwLCAgICAgICBWVElNRSAgICkKK307CisKK2VudW0geworCU5VTV9jb250cm9sX2luZm8gPSBBUlJBWV9TSVpFKGNvbnRyb2xfaW5mbykKK307CisKKworc3RydWN0IGdsb2JhbHMgeworCWNvbnN0IGNoYXIgKmRldmljZV9uYW1lOworCS8qIFRoZSB3aWR0aCBvZiB0aGUgc2NyZWVuLCBmb3Igb3V0cHV0IHdyYXBwaW5nICovCisJdW5zaWduZWQgbWF4X2NvbDsKKwkvKiBDdXJyZW50IHBvc2l0aW9uLCB0byBrbm93IHdoZW4gdG8gd3JhcCAqLworCXVuc2lnbmVkIGN1cnJlbnRfY29sOworCWNoYXIgYnVmWzEwXTsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCUcuZGV2aWNlX25hbWUgPSBiYl9tc2dfc3RhbmRhcmRfaW5wdXQ7IFwKKwlHLm1heF9jb2wgPSA4MDsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgc2V0X3NwZWVkX29yX2RpZShlbnVtIHNwZWVkX3NldHRpbmcgdHlwZSwgY29uc3QgY2hhciAqYXJnLAorCQkJCQlzdHJ1Y3QgdGVybWlvcyAqbW9kZSkKK3sKKwlzcGVlZF90IGJhdWQ7CisKKwliYXVkID0gdHR5X3ZhbHVlX3RvX2JhdWQoeGF0b3UoYXJnKSk7CisKKwlpZiAodHlwZSAhPSBvdXRwdXRfc3BlZWQpIHsgICAgIC8qIGVpdGhlciBpbnB1dCBvciBib3RoICovCisJCWNmc2V0aXNwZWVkKG1vZGUsIGJhdWQpOworCX0KKwlpZiAodHlwZSAhPSBpbnB1dF9zcGVlZCkgeyAgICAgIC8qIGVpdGhlciBvdXRwdXQgb3IgYm90aCAqLworCQljZnNldG9zcGVlZChtb2RlLCBiYXVkKTsKKwl9Cit9CisKK3N0YXRpYyBOT1JFVFVSTiB2b2lkIHBlcnJvcl9vbl9kZXZpY2VfYW5kX2RpZShjb25zdCBjaGFyICpmbXQpCit7CisJYmJfcGVycm9yX21zZ19hbmRfZGllKGZtdCwgRy5kZXZpY2VfbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHBlcnJvcl9vbl9kZXZpY2UoY29uc3QgY2hhciAqZm10KQoreworCWJiX3BlcnJvcl9tc2coZm10LCBHLmRldmljZV9uYW1lKTsKK30KKworLyogUHJpbnQgZm9ybWF0IHN0cmluZyBNRVNTQUdFIGFuZCBvcHRpb25hbCBhcmdzLgorICAgV3JhcCB0byBuZXh0IGxpbmUgZmlyc3QgaWYgaXQgd29uJ3QgZml0LgorICAgUHJpbnQgYSBzcGFjZSBmaXJzdCB1bmxlc3MgTUVTU0FHRSB3aWxsIHN0YXJ0IGEgbmV3IGxpbmUgKi8KK3N0YXRpYyB2b2lkIHdyYXBmKGNvbnN0IGNoYXIgKm1lc3NhZ2UsIC4uLikKK3sKKwljaGFyIGJ1ZlsxMjhdOworCXZhX2xpc3QgYXJnczsKKwl1bnNpZ25lZCBidWZsZW47CisKKwl2YV9zdGFydChhcmdzLCBtZXNzYWdlKTsKKwlidWZsZW4gPSB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgbWVzc2FnZSwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCS8qIFdlIHNlZW0gdG8gYmUgY2FsbGVkIG9ubHkgd2l0aCBzdWl0YWJsZSBsZW5ndGhzLCBidXQgY2hlY2sgaWYKKwkgICBzb21lYm9keSBmYWlsZWQgdG8gYWRoZXJlIHRvIHRoaXMgYXNzdW1wdGlvbiBqdXN0IHRvIGJlIHN1cmUuICAqLworCWlmICghYnVmbGVuIHx8IGJ1ZmxlbiA+PSBzaXplb2YoYnVmKSkgcmV0dXJuOworCisJaWYgKEcuY3VycmVudF9jb2wgPiAwKSB7CisJCUcuY3VycmVudF9jb2wrKzsKKwkJaWYgKGJ1ZlswXSAhPSAnXG4nKSB7CisJCQlpZiAoRy5jdXJyZW50X2NvbCArIGJ1ZmxlbiA+PSBHLm1heF9jb2wpIHsKKwkJCQliYl9wdXRjaGFyKCdcbicpOworCQkJCUcuY3VycmVudF9jb2wgPSAwOworCQkJfSBlbHNlCisJCQkJYmJfcHV0Y2hhcignICcpOworCQl9CisJfQorCWZwdXRzKGJ1Ziwgc3Rkb3V0KTsKKwlHLmN1cnJlbnRfY29sICs9IGJ1ZmxlbjsKKwlpZiAoYnVmW2J1Zmxlbi0xXSA9PSAnXG4nKQorCQlHLmN1cnJlbnRfY29sID0gMDsKK30KKworc3RhdGljIHZvaWQgbmV3bGluZSh2b2lkKQoreworCWlmIChHLmN1cnJlbnRfY29sICE9IDApCisJCXdyYXBmKCJcbiIpOworfQorCisjaWZkZWYgVElPQ0dXSU5TWgorc3RhdGljIHZvaWQgc2V0X3dpbmRvd19zaXplKGludCByb3dzLCBpbnQgY29scykKK3sKKwlzdHJ1Y3Qgd2luc2l6ZSB3aW4gPSB7IDAsIDAsIDAsIDAgfTsKKworCWlmIChpb2N0bChTVERJTl9GSUxFTk8sIFRJT0NHV0lOU1osICZ3aW4pKSB7CisJCWlmIChlcnJubyAhPSBFSU5WQUwpIHsKKwkJCWdvdG8gYmFpbDsKKwkJfQorCQltZW1zZXQoJndpbiwgMCwgc2l6ZW9mKHdpbikpOworCX0KKworCWlmIChyb3dzID49IDApCisJCXdpbi53c19yb3cgPSByb3dzOworCWlmIChjb2xzID49IDApCisJCXdpbi53c19jb2wgPSBjb2xzOworCisJaWYgKGlvY3RsKFNURElOX0ZJTEVOTywgVElPQ1NXSU5TWiwgKGNoYXIgKikgJndpbikpCitiYWlsOgorCQlwZXJyb3Jfb25fZGV2aWNlKCIlcyIpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfd2luZG93X3NpemUoaW50IGZhbmN5KQoreworCWNvbnN0IGNoYXIgKmZtdF9zdHIgPSAiJXNcMCVzOiBubyBzaXplIGluZm9ybWF0aW9uIGZvciB0aGlzIGRldmljZSI7CisJdW5zaWduZWQgd2lkdGgsIGhlaWdodDsKKworCWlmIChnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KFNURElOX0ZJTEVOTywgJndpZHRoLCAmaGVpZ2h0KSkgeworCQlpZiAoKGVycm5vICE9IEVJTlZBTCkgfHwgKChmbXRfc3RyICs9IDIpLCAhZmFuY3kpKSB7CisJCQlwZXJyb3Jfb25fZGV2aWNlKGZtdF9zdHIpOworCQl9CisJfSBlbHNlIHsKKwkJd3JhcGYoZmFuY3kgPyAicm93cyAldTsgY29sdW1ucyAldTsiIDogIiV1ICV1XG4iLAorCQkJCWhlaWdodCwgd2lkdGgpOworCX0KK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCBzdHR5X3N1ZmZpeGVzW10gPSB7CisJeyAiYiIsICA1MTIgfSwKKwl7ICJrIiwgMTAyNCB9LAorCXsgIkIiLCAxMDI0IH0sCisJeyAiIiwgMCB9Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG1vZGVfaW5mbyAqZmluZF9tb2RlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGkgPSBpbmRleF9pbl9zdHJpbmdzKG1vZGVfbmFtZSwgbmFtZSk7CisJcmV0dXJuIGkgPj0gMCA/ICZtb2RlX2luZm9baV0gOiBOVUxMOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbnRyb2xfaW5mbyAqZmluZF9jb250cm9sKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IGkgPSBpbmRleF9pbl9zdHJpbmdzKGNvbnRyb2xfbmFtZSwgbmFtZSk7CisJcmV0dXJuIGkgPj0gMCA/ICZjb250cm9sX2luZm9baV0gOiBOVUxMOworfQorCitlbnVtIHsKKwlwYXJhbV9uZWVkX2FyZyA9IDB4ODAsCisJcGFyYW1fbGluZSAgICA9IDEgfCAweDgwLAorCXBhcmFtX3Jvd3MgICAgPSAyIHwgMHg4MCwKKwlwYXJhbV9jb2xzICAgID0gMyB8IDB4ODAsCisJcGFyYW1fY29sdW1ucyA9IDQgfCAweDgwLAorCXBhcmFtX3NpemUgICAgPSA1LAorCXBhcmFtX3NwZWVkICAgPSA2LAorCXBhcmFtX2lzcGVlZCAgPSA3IHwgMHg4MCwKKwlwYXJhbV9vc3BlZWQgID0gOCB8IDB4ODAsCit9OworCitzdGF0aWMgaW50IGZpbmRfcGFyYW0oY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBwYXJhbXNbXSBBTElHTjEgPQorCQkibGluZVwwIiAgICAvKiAxICovCisJCSJyb3dzXDAiICAgIC8qIDIgKi8KKwkJImNvbHNcMCIgICAgLyogMyAqLworCQkiY29sdW1uc1wwIiAvKiA0ICovCisJCSJzaXplXDAiICAgIC8qIDUgKi8KKwkJInNwZWVkXDAiICAgLyogNiAqLworCQkiaXNwZWVkXDAiCisJCSJvc3BlZWRcMCI7CisJaW50IGkgPSBpbmRleF9pbl9zdHJpbmdzKHBhcmFtcywgbmFtZSkgKyAxOworCWlmIChpID09IDApCisJCXJldHVybiAwOworCWlmIChpICE9IDUgJiYgaSAhPSA2KQorCQlpIHw9IDB4ODA7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgcmVjb3Zlcl9tb2RlKGNvbnN0IGNoYXIgKmFyZywgc3RydWN0IHRlcm1pb3MgKm1vZGUpCit7CisJaW50IGksIG47CisJdW5zaWduZWQgY2hyOworCXVuc2lnbmVkIGxvbmcgaWZsYWcsIG9mbGFnLCBjZmxhZywgbGZsYWc7CisKKwkvKiBTY2FuIGludG8gdGVtcG9yYXJpZXMgc2luY2UgaXQgaXMgdG9vIG11Y2ggdHJvdWJsZSB0byBmaWd1cmUgb3V0CisJICAgdGhlIHJpZ2h0IGZvcm1hdCBmb3IgJ3RjZmxhZ190JyAqLworCWlmIChzc2NhbmYoYXJnLCAiJWx4OiVseDolbHg6JWx4JW4iLAorCQkJICAgJmlmbGFnLCAmb2ZsYWcsICZjZmxhZywgJmxmbGFnLCAmbikgIT0gNCkKKwkJcmV0dXJuIDA7CisJbW9kZS0+Y19pZmxhZyA9IGlmbGFnOworCW1vZGUtPmNfb2ZsYWcgPSBvZmxhZzsKKwltb2RlLT5jX2NmbGFnID0gY2ZsYWc7CisJbW9kZS0+Y19sZmxhZyA9IGxmbGFnOworCWFyZyArPSBuOworCWZvciAoaSA9IDA7IGkgPCBOQ0NTOyArK2kpIHsKKwkJaWYgKHNzY2FuZihhcmcsICI6JXglbiIsICZjaHIsICZuKSAhPSAxKQorCQkJcmV0dXJuIDA7CisJCW1vZGUtPmNfY2NbaV0gPSBjaHI7CisJCWFyZyArPSBuOworCX0KKworCS8qIEZhaWwgaWYgdGhlcmUgYXJlIHRvbyBtYW55IGZpZWxkcyAqLworCWlmICgqYXJnICE9ICdcMCcpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfcmVjb3ZlcmFibGUoY29uc3Qgc3RydWN0IHRlcm1pb3MgKm1vZGUsCisJCQkJaW50IFVOVVNFRF9QQVJBTSBkdW1teSkKK3sKKwlpbnQgaTsKKwlwcmludGYoIiVseDolbHg6JWx4OiVseCIsCisJCSAgICh1bnNpZ25lZCBsb25nKSBtb2RlLT5jX2lmbGFnLCAodW5zaWduZWQgbG9uZykgbW9kZS0+Y19vZmxhZywKKwkJICAgKHVuc2lnbmVkIGxvbmcpIG1vZGUtPmNfY2ZsYWcsICh1bnNpZ25lZCBsb25nKSBtb2RlLT5jX2xmbGFnKTsKKwlmb3IgKGkgPSAwOyBpIDwgTkNDUzsgKytpKQorCQlwcmludGYoIjoleCIsICh1bnNpZ25lZCBpbnQpIG1vZGUtPmNfY2NbaV0pOworCWJiX3B1dGNoYXIoJ1xuJyk7Cit9CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfc3BlZWQoY29uc3Qgc3RydWN0IHRlcm1pb3MgKm1vZGUsIGludCBmYW5jeSkKK3sKKwkvL19fX19fX19fX19fX19fX19fX19fIDAxMjM0NTY3IDggOQorCWNvbnN0IGNoYXIgKmZtdF9zdHIgPSAiJWx1ICVsdVxuXDBpc3BlZWQgJWx1IGJhdWQ7IG9zcGVlZCAlbHUgYmF1ZDsiOworCXVuc2lnbmVkIGxvbmcgaXNwZWVkLCBvc3BlZWQ7CisKKwlpc3BlZWQgPSBjZmdldGlzcGVlZChtb2RlKTsKKwlvc3BlZWQgPSBjZmdldG9zcGVlZChtb2RlKTsKKwlpZiAoaXNwZWVkID09IDAgfHwgaXNwZWVkID09IG9zcGVlZCkgeworCQlpc3BlZWQgPSBvc3BlZWQ7ICAgICAgICAgICAgICAgIC8qIGluIGNhc2UgaXNwZWVkIHdhcyAwICovCisJCS8vX19fX19fX18gMDEyMyA0IDUgNiA3IDggOQorCQlmbXRfc3RyID0gIiVsdVxuXDBcMFwwXDBcMHNwZWVkICVsdSBiYXVkOyI7CisJfQorCWlmIChmYW5jeSkgZm10X3N0ciArPSA5OworCXdyYXBmKGZtdF9zdHIsIHR0eV9iYXVkX3RvX3ZhbHVlKGlzcGVlZCksIHR0eV9iYXVkX3RvX3ZhbHVlKG9zcGVlZCkpOworfQorCitzdGF0aWMgdm9pZCBkb19kaXNwbGF5KGNvbnN0IHN0cnVjdCB0ZXJtaW9zICptb2RlLCBpbnQgYWxsKQoreworCWludCBpOworCXRjZmxhZ190ICpiaXRzcDsKKwl1bnNpZ25lZCBsb25nIG1hc2s7CisJaW50IHByZXZfdHlwZSA9IGNvbnRyb2w7CisKKwlkaXNwbGF5X3NwZWVkKG1vZGUsIDEpOworCWlmIChhbGwpCisJCWRpc3BsYXlfd2luZG93X3NpemUoMSk7CisjaWZkZWYgX19saW51eF9fCisJd3JhcGYoImxpbmUgPSAldTtcbiIsIG1vZGUtPmNfbGluZSk7CisjZWxzZQorCW5ld2xpbmUoKTsKKyNlbmRpZgorCisJZm9yIChpID0gMDsgaSAhPSBDSURYX21pbjsgKytpKSB7CisJCWNoYXIgY2g7CisJCS8qIElmIHN3dGNoIGlzIHRoZSBzYW1lIGFzIHN1c3AsIGRvbid0IHByaW50IGJvdGggKi8KKyNpZiBWU1dUQ0ggPT0gVlNVU1AKKwkJaWYgKGkgPT0gQ0lEWF9zd3RjaCkKKwkJCWNvbnRpbnVlOworI2VuZGlmCisJCS8qIElmIGVvZiB1c2VzIHRoZSBzYW1lIHNsb3QgYXMgbWluLCBvbmx5IHByaW50IHdoaWNoZXZlciBhcHBsaWVzICovCisjaWYgVkVPRiA9PSBWTUlOCisJCWlmICghKG1vZGUtPmNfbGZsYWcgJiBJQ0FOT04pCisJCSAmJiAoaSA9PSBDSURYX2VvZiB8fCBpID09IENJRFhfZW9sKQorCQkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisjZW5kaWYKKwkJY2ggPSBtb2RlLT5jX2NjW2NvbnRyb2xfaW5mb1tpXS5vZmZzZXRdOworCQlpZiAoY2ggPT0gX1BPU0lYX1ZESVNBQkxFKQorCQkJc3RyY3B5KEcuYnVmLCAiPHVuZGVmPiIpOworCQllbHNlCisJCQl2aXNpYmxlKGNoLCBHLmJ1ZiwgMCk7CisJCXdyYXBmKCIlcyA9ICVzOyIsIG50aF9zdHJpbmcoY29udHJvbF9uYW1lLCBpKSwgRy5idWYpOworCX0KKyNpZiBWRU9GID09IFZNSU4KKwlpZiAoKG1vZGUtPmNfbGZsYWcgJiBJQ0FOT04pID09IDApCisjZW5kaWYKKwkJd3JhcGYoIm1pbiA9ICV1OyB0aW1lID0gJXU7IiwgbW9kZS0+Y19jY1tWTUlOXSwgbW9kZS0+Y19jY1tWVElNRV0pOworCW5ld2xpbmUoKTsKKworCWZvciAoaSA9IDA7IGkgPCBOVU1fbW9kZV9pbmZvOyArK2kpIHsKKwkJaWYgKG1vZGVfaW5mb1tpXS5mbGFncyAmIE9NSVQpCisJCQljb250aW51ZTsKKwkJaWYgKG1vZGVfaW5mb1tpXS50eXBlICE9IHByZXZfdHlwZSkgeworCQkJbmV3bGluZSgpOworCQkJcHJldl90eXBlID0gbW9kZV9pbmZvW2ldLnR5cGU7CisJCX0KKworCQliaXRzcCA9IGdldF9wdHJfdG9fdGNmbGFnKG1vZGVfaW5mb1tpXS50eXBlLCBtb2RlKTsKKwkJbWFzayA9IG1vZGVfaW5mb1tpXS5tYXNrID8gbW9kZV9pbmZvW2ldLm1hc2sgOiBtb2RlX2luZm9baV0uYml0czsKKwkJaWYgKCgqYml0c3AgJiBtYXNrKSA9PSBtb2RlX2luZm9baV0uYml0cykgeworCQkJaWYgKGFsbCB8fCAobW9kZV9pbmZvW2ldLmZsYWdzICYgU0FORV9VTlNFVCkpCisJCQkJd3JhcGYoIi0lcyIrMSwgbnRoX3N0cmluZyhtb2RlX25hbWUsIGkpKTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoYWxsICYmIG1vZGVfaW5mb1tpXS5mbGFncyAmIFJFVikKKwkJCSB8fCAoIWFsbCAmJiAobW9kZV9pbmZvW2ldLmZsYWdzICYgKFNBTkVfU0VUIHwgUkVWKSkgPT0gKFNBTkVfU0VUIHwgUkVWKSkKKwkJCSkgeworCQkJCXdyYXBmKCItJXMiLCBudGhfc3RyaW5nKG1vZGVfbmFtZSwgaSkpOworCQkJfQorCQl9CisJfQorCW5ld2xpbmUoKTsKK30KKworc3RhdGljIHZvaWQgc2FuZV9tb2RlKHN0cnVjdCB0ZXJtaW9zICptb2RlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5VTV9jb250cm9sX2luZm87ICsraSkgeworI2lmIFZNSU4gPT0gVkVPRgorCQlpZiAoaSA9PSBDSURYX21pbikKKwkJCWJyZWFrOworI2VuZGlmCisJCW1vZGUtPmNfY2NbY29udHJvbF9pbmZvW2ldLm9mZnNldF0gPSBjb250cm9sX2luZm9baV0uc2FuZXZhbDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX21vZGVfaW5mbzsgKytpKSB7CisJCXRjZmxhZ190IHZhbDsKKwkJdGNmbGFnX3QgKmJpdHNwID0gZ2V0X3B0cl90b190Y2ZsYWcobW9kZV9pbmZvW2ldLnR5cGUsIG1vZGUpOworCisJCWlmICghYml0c3ApCisJCQljb250aW51ZTsKKwkJdmFsID0gKmJpdHNwICYgfigodW5zaWduZWQgbG9uZyltb2RlX2luZm9baV0ubWFzayk7CisJCWlmIChtb2RlX2luZm9baV0uZmxhZ3MgJiBTQU5FX1NFVCkgeworCQkJKmJpdHNwID0gdmFsIHwgbW9kZV9pbmZvW2ldLmJpdHM7CisJCX0gZWxzZQorCQlpZiAobW9kZV9pbmZvW2ldLmZsYWdzICYgU0FORV9VTlNFVCkgeworCQkJKmJpdHNwID0gdmFsICYgfm1vZGVfaW5mb1tpXS5iaXRzOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBzZXRfbW9kZShjb25zdCBzdHJ1Y3QgbW9kZV9pbmZvICppbmZvLCBpbnQgcmV2ZXJzZWQsCisJCQkJCXN0cnVjdCB0ZXJtaW9zICptb2RlKQoreworCXRjZmxhZ190ICpiaXRzcDsKKworCWJpdHNwID0gZ2V0X3B0cl90b190Y2ZsYWcoaW5mby0+dHlwZSwgbW9kZSk7CisKKwlpZiAoYml0c3ApIHsKKwkJdGNmbGFnX3QgdmFsID0gKmJpdHNwICYgfmluZm8tPm1hc2s7CisJCWlmIChyZXZlcnNlZCkKKwkJCSpiaXRzcCA9IHZhbCAmIH5pbmZvLT5iaXRzOworCQllbHNlCisJCQkqYml0c3AgPSB2YWwgfCBpbmZvLT5iaXRzOworCQlyZXR1cm47CisJfQorCisJLyogIWJpdHNwIC0gaXQncyBhICJjb21iaW5hdGlvbiIgbW9kZSAqLworCWlmIChpbmZvID09ICZtb2RlX2luZm9bSURYX2V2ZW5wXSB8fCBpbmZvID09ICZtb2RlX2luZm9bSURYX3Bhcml0eV0pIHsKKwkJaWYgKHJldmVyc2VkKQorCQkJbW9kZS0+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+U1RUWV9ub2FyZ3M7CisJCQkrK2s7CisJCQljb250aW51ZTsKKwkJfQorCisJCXBhcmFtID0gZmluZF9wYXJhbShhcmcpOworCQlpZiAocGFyYW0gJiBwYXJhbV9uZWVkX2FyZykgeworCQkJaWYgKCFhcmduZXh0KQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZXF1aXJlc19hcmcsIGFyZyk7CisJCQkrK2s7CisJCX0KKworCQlzd2l0Y2ggKHBhcmFtKSB7CisjaWZkZWYgX19saW51eF9fCisJCWNhc2UgcGFyYW1fbGluZToKKyMgaWZuZGVmIFRJT0NHV0lOU1oKKwkJCXhhdG91bF9yYW5nZV9zZngoYXJnbmV4dCwgMSwgSU5UX01BWCwgc3R0eV9zdWZmaXhlcyk7CisJCQlicmVhazsKKyMgZW5kaWYgLyogZWxzZSBmYWxsLXRocm91Z2ggKi8KKyNlbmRpZgorI2lmZGVmIFRJT0NHV0lOU1oKKwkJY2FzZSBwYXJhbV9yb3dzOgorCQljYXNlIHBhcmFtX2NvbHM6CisJCWNhc2UgcGFyYW1fY29sdW1uczoKKwkJCXhhdG91bF9yYW5nZV9zZngoYXJnbmV4dCwgMSwgSU5UX01BWCwgc3R0eV9zdWZmaXhlcyk7CisJCQlicmVhazsKKwkJY2FzZSBwYXJhbV9zaXplOgorI2VuZGlmCisJCWNhc2UgcGFyYW1fc3BlZWQ6CisJCQlicmVhazsKKwkJY2FzZSBwYXJhbV9pc3BlZWQ6CisJCQkvKiBjYWxsZWQgZm9yIHRoZSBzaWRlIGVmZmVjdCBvZiB4ZnVuYyBkZWF0aCBvbmx5ICovCisJCQlzZXRfc3BlZWRfb3JfZGllKGlucHV0X3NwZWVkLCBhcmduZXh0LCAmbW9kZSk7CisJCQlicmVhazsKKwkJY2FzZSBwYXJhbV9vc3BlZWQ6CisJCQkvKiBjYWxsZWQgZm9yIHRoZSBzaWRlIGVmZmVjdCBvZiB4ZnVuYyBkZWF0aCBvbmx5ICovCisJCQlzZXRfc3BlZWRfb3JfZGllKG91dHB1dF9zcGVlZCwgYXJnbmV4dCwgJm1vZGUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAocmVjb3Zlcl9tb2RlKGFyZywgJm1vZGUpID09IDEpIGJyZWFrOworCQkJaWYgKHR0eV92YWx1ZV90b19iYXVkKHhhdG91KGFyZykpICE9IChzcGVlZF90KSAtMSkgYnJlYWs7CisgaW52YWxpZF9hcmd1bWVudDoKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIGFyZ3VtZW50ICclcyciLCBhcmcpOworCQl9CisJCXN0dHlfc3RhdGUgJj0gflNUVFlfbm9hcmdzOworCX0KKworCS8qIFNwZWNpZnlpbmcgYm90aCAtYSBhbmQgLWcgaXMgYW4gZXJyb3IgKi8KKwlpZiAoKHN0dHlfc3RhdGUgJiAoU1RUWV92ZXJib3NlX291dHB1dCB8IFNUVFlfcmVjb3ZlcmFibGVfb3V0cHV0KSkgPT0KKwkJKFNUVFlfdmVyYm9zZV9vdXRwdXQgfCBTVFRZX3JlY292ZXJhYmxlX291dHB1dCkKKwkpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIi1hIGFuZCAtZyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIik7CisJfQorCS8qIFNwZWNpZnlpbmcgLWEgb3IgLWcgd2l0aCBub24tb3B0aW9ucyBpcyBhbiBlcnJvciAqLworCWlmICgoc3R0eV9zdGF0ZSAmIChTVFRZX3ZlcmJvc2Vfb3V0cHV0IHwgU1RUWV9yZWNvdmVyYWJsZV9vdXRwdXQpKQorCSAmJiAhKHN0dHlfc3RhdGUgJiBTVFRZX25vYXJncykKKwkpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm1vZGVzIG1heSBub3QgYmUgc2V0IHdoZW4gLWEgb3IgLWcgaXMgdXNlZCIpOworCX0KKworCS8qIE5vdyBpdCBpcyBzYWZlIHRvIHN0YXJ0IGRvaW5nIHRoaW5ncyAqLworCWlmIChmaWxlX25hbWUpIHsKKwkJRy5kZXZpY2VfbmFtZSA9IGZpbGVfbmFtZTsKKwkJeG1vdmVfZmQoeG9wZW5fbm9uYmxvY2tpbmcoRy5kZXZpY2VfbmFtZSksIFNURElOX0ZJTEVOTyk7CisJCW5kZWxheV9vZmYoU1RESU5fRklMRU5PKTsKKwl9CisKKwkvKiBJbml0aWFsaXplIHRvIGFsbCB6ZXJvZXMgc28gdGhlcmUgaXMgbm8gcmlzayBtZW1jbXAgd2lsbCByZXBvcnQgYQorCSAgIHNwdXJpb3VzIGRpZmZlcmVuY2UgaW4gYW4gdW5pbml0aWFsaXplZCBwb3J0aW9uIG9mIHRoZSBzdHJ1Y3R1cmUgKi8KKwltZW1zZXQoJm1vZGUsIDAsIHNpemVvZihtb2RlKSk7CisJaWYgKHRjZ2V0YXR0cihTVERJTl9GSUxFTk8sICZtb2RlKSkKKwkJcGVycm9yX29uX2RldmljZV9hbmRfZGllKCIlcyIpOworCisJaWYgKHN0dHlfc3RhdGUgJiAoU1RUWV92ZXJib3NlX291dHB1dCB8IFNUVFlfcmVjb3ZlcmFibGVfb3V0cHV0IHwgU1RUWV9ub2FyZ3MpKSB7CisJCWdldF90ZXJtaW5hbF93aWR0aF9oZWlnaHQoU1RET1VUX0ZJTEVOTywgJkcubWF4X2NvbCwgTlVMTCk7CisJCW91dHB1dF9mdW5jKCZtb2RlLCBkaXNwbGF5X2FsbCk7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJLyogU2Vjb25kIHBhc3M6IHBlcmZvcm0gYWN0aW9ucyAqLworCWsgPSAwOworCXdoaWxlIChhcmd2Wysra10pIHsKKwkJY29uc3Qgc3RydWN0IG1vZGVfaW5mbyAqbXA7CisJCWNvbnN0IHN0cnVjdCBjb250cm9sX2luZm8gKmNwOworCQljb25zdCBjaGFyICphcmcgPSBhcmd2W2tdOworCQljb25zdCBjaGFyICphcmduZXh0ID0gYXJndltrKzFdOworCQlpbnQgcGFyYW07CisKKwkJaWYgKGFyZ1swXSA9PSAnLScpIHsKKwkJCW1wID0gZmluZF9tb2RlKGFyZysxKTsKKwkJCWlmIChtcCkgeworCQkJCXNldF9tb2RlKG1wLCAxIC8qIHJldmVyc2VkICovLCAmbW9kZSk7CisJCQkJc3R0eV9zdGF0ZSB8PSBTVFRZX3JlcXVpcmVfc2V0X2F0dHI7CisJCQl9CisJCQkvKiBJdCBpcyBhbiBvcHRpb24gLSBhbHJlYWR5IHBhcnNlZC4gU2tpcCBpdCAqLworCQkJY29udGludWU7CisJCX0KKworCQltcCA9IGZpbmRfbW9kZShhcmcpOworCQlpZiAobXApIHsKKwkJCXNldF9tb2RlKG1wLCAwIC8qIG5vbi1yZXZlcnNlZCAqLywgJm1vZGUpOworCQkJc3R0eV9zdGF0ZSB8PSBTVFRZX3JlcXVpcmVfc2V0X2F0dHI7CisJCQljb250aW51ZTsKKwkJfQorCisJCWNwID0gZmluZF9jb250cm9sKGFyZyk7CisJCWlmIChjcCkgeworCQkJKytrOworCQkJc2V0X2NvbnRyb2xfY2hhcl9vcl9kaWUoY3AsIGFyZ25leHQsICZtb2RlKTsKKwkJCXN0dHlfc3RhdGUgfD0gU1RUWV9yZXF1aXJlX3NldF9hdHRyOworCQkJY29udGludWU7CisJCX0KKworCQlwYXJhbSA9IGZpbmRfcGFyYW0oYXJnKTsKKwkJaWYgKHBhcmFtICYgcGFyYW1fbmVlZF9hcmcpIHsKKwkJCSsrazsKKwkJfQorCisJCXN3aXRjaCAocGFyYW0pIHsKKyNpZmRlZiBfX2xpbnV4X18KKwkJY2FzZSBwYXJhbV9saW5lOgorCQkJbW9kZS5jX2xpbmUgPSB4YXRvdWxfc2Z4KGFyZ25leHQsIHN0dHlfc3VmZml4ZXMpOworCQkJc3R0eV9zdGF0ZSB8PSBTVFRZX3JlcXVpcmVfc2V0X2F0dHI7CisJCQlicmVhazsKKyNlbmRpZgorI2lmZGVmIFRJT0NHV0lOU1oKKwkJY2FzZSBwYXJhbV9jb2xzOgorCQljYXNlIHBhcmFtX2NvbHVtbnM6CisJCQlzZXRfd2luZG93X3NpemUoLTEsIHhhdG91bF9zZngoYXJnbmV4dCwgc3R0eV9zdWZmaXhlcykpOworCQkJYnJlYWs7CisJCWNhc2UgcGFyYW1fc2l6ZToKKwkJCWRpc3BsYXlfd2luZG93X3NpemUoMCk7CisJCQlicmVhazsKKwkJY2FzZSBwYXJhbV9yb3dzOgorCQkJc2V0X3dpbmRvd19zaXplKHhhdG91bF9zZngoYXJnbmV4dCwgc3R0eV9zdWZmaXhlcyksIC0xKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgcGFyYW1fc3BlZWQ6CisJCQlkaXNwbGF5X3NwZWVkKCZtb2RlLCAwKTsKKwkJCWJyZWFrOworCQljYXNlIHBhcmFtX2lzcGVlZDoKKwkJCXNldF9zcGVlZF9vcl9kaWUoaW5wdXRfc3BlZWQsIGFyZ25leHQsICZtb2RlKTsKKwkJCXN0dHlfc3RhdGUgfD0gKFNUVFlfcmVxdWlyZV9zZXRfYXR0ciB8IFNUVFlfc3BlZWRfd2FzX3NldCk7CisJCQlicmVhazsKKwkJY2FzZSBwYXJhbV9vc3BlZWQ6CisJCQlzZXRfc3BlZWRfb3JfZGllKG91dHB1dF9zcGVlZCwgYXJnbmV4dCwgJm1vZGUpOworCQkJc3R0eV9zdGF0ZSB8PSAoU1RUWV9yZXF1aXJlX3NldF9hdHRyIHwgU1RUWV9zcGVlZF93YXNfc2V0KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKHJlY292ZXJfbW9kZShhcmcsICZtb2RlKSA9PSAxKQorCQkJCXN0dHlfc3RhdGUgfD0gU1RUWV9yZXF1aXJlX3NldF9hdHRyOworCQkJZWxzZSAvKiB0cnVlOiBpZiAodHR5X3ZhbHVlX3RvX2JhdWQoeGF0b3UoYXJnKSkgIT0gKHNwZWVkX3QpIC0xKSAqL3sKKwkJCQlzZXRfc3BlZWRfb3JfZGllKGJvdGhfc3BlZWRzLCBhcmcsICZtb2RlKTsKKwkJCQlzdHR5X3N0YXRlIHw9IChTVFRZX3JlcXVpcmVfc2V0X2F0dHIgfCBTVFRZX3NwZWVkX3dhc19zZXQpOworCQkJfSAvKiBlbHNlIC0gaW1wb3NzaWJsZSAoY2F1Z2h0IGluIHRoZSBmaXJzdCBwYXNzKToKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBhcmd1bWVudCAnJXMnIiwgYXJnKTsgKi8KKwkJfQorCX0KKworCWlmIChzdHR5X3N0YXRlICYgU1RUWV9yZXF1aXJlX3NldF9hdHRyKSB7CisJCXN0cnVjdCB0ZXJtaW9zIG5ld19tb2RlOworCisJCWlmICh0Y3NldGF0dHIoU1RESU5fRklMRU5PLCBUQ1NBRFJBSU4sICZtb2RlKSkKKwkJCXBlcnJvcl9vbl9kZXZpY2VfYW5kX2RpZSgiJXMiKTsKKworCQkvKiBQT1NJWCAoYWNjb3JkaW5nIHRvIFpsb3RuaWNrJ3MgYm9vaykgdGNzZXRhdHRyIHJldHVybnMgemVybyBpZgorCQkgICBpdCBwZXJmb3JtcyAqYW55KiBvZiB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbnMuICBUaGlzIG1lYW5zIGl0CisJCSAgIGNhbiByZXBvcnQgJ3N1Y2Nlc3MnIHdoZW4gaXQgaGFzIGFjdHVhbGx5IGZhaWxlZCB0byBwZXJmb3JtCisJCSAgIHNvbWUgcHJvcGVyIHN1YnNldCBvZiB0aGUgcmVxdWVzdGVkIG9wZXJhdGlvbnMuICBUbyBkZXRlY3QKKwkJICAgdGhpcyBwYXJ0aWFsIGZhaWx1cmUsIGdldCB0aGUgY3VycmVudCB0ZXJtaW5hbCBhdHRyaWJ1dGVzIGFuZAorCQkgICBjb21wYXJlIHRoZW0gdG8gdGhlIHJlcXVlc3RlZCBvbmVzICovCisKKwkJLyogSW5pdGlhbGl6ZSB0byBhbGwgemVyb2VzIHNvIHRoZXJlIGlzIG5vIHJpc2sgbWVtY21wIHdpbGwgcmVwb3J0IGEKKwkJICAgc3B1cmlvdXMgZGlmZmVyZW5jZSBpbiBhbiB1bmluaXRpYWxpemVkIHBvcnRpb24gb2YgdGhlIHN0cnVjdHVyZSAqLworCQltZW1zZXQoJm5ld19tb2RlLCAwLCBzaXplb2YobmV3X21vZGUpKTsKKwkJaWYgKHRjZ2V0YXR0cihTVERJTl9GSUxFTk8sICZuZXdfbW9kZSkpCisJCQlwZXJyb3Jfb25fZGV2aWNlX2FuZF9kaWUoIiVzIik7CisKKwkJaWYgKG1lbWNtcCgmbW9kZSwgJm5ld19tb2RlLCBzaXplb2YobW9kZSkpICE9IDApIHsKKy8qCisgKiBJIHRoaW5rIHRoZSBiZWxvdyBjaHVuayBpcyBub3QgbmVjZXNzYXJ5IG9uIExpbnV4LgorICogSWYgeW91IGFyZSBkZWxldGluZyBpdCwgYWxzbyBkZWxldGUgU1RUWV9zcGVlZF93YXNfc2V0IGJpdCAtCisgKiBpdCBpcyBvbmx5IGV2ZXIgY2hlY2tlZCBoZXJlLgorICovCisjaWYgMCAvKiB3YXMgImlmIENJQkFVRCIgKi8KKwkJCS8qIFN1bk9TIDQuMS4zIChhdCBsZWFzdCkgaGFzIHRoZSBwcm9ibGVtIHRoYXQgYWZ0ZXIgdGhpcyBzZXF1ZW5jZSwKKwkJCSAgIHRjZ2V0YXR0ciAoJm0xKTsgdGNzZXRhdHRyICgmbTEpOyB0Y2dldGF0dHIgKCZtMik7CisJCQkgICBzb21ldGltZXMgKG0xICE9IG0yKS4gIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgaW4gdGhlIGZvdXIgYml0cworCQkJICAgb2YgdGhlIGNfY2ZsYWcgZmllbGQgY29ycmVzcG9uZGluZyB0byB0aGUgYmF1ZCByYXRlLiAgVG8gc2F2ZQorCQkJICAgU3VuIHVzZXJzIGEgbGl0dGxlIGNvbmZ1c2lvbiwgZG9uJ3QgcmVwb3J0IGFuIGVycm9yIGlmIHRoaXMKKwkJCSAgIGhhcHBlbnMuICBCdXQgc3VwcHJlc3MgdGhlIGVycm9yIG9ubHkgaWYgd2UgaGF2ZW4ndCB0cmllZCB0bworCQkJICAgc2V0IHRoZSBiYXVkIHJhdGUgZXhwbGljaXRseSAtLSBvdGhlcndpc2Ugd2UnZCBuZXZlciBnaXZlIGFuCisJCQkgICBlcnJvciBmb3IgYSB0cnVlIGZhaWx1cmUgdG8gc2V0IHRoZSBiYXVkIHJhdGUgKi8KKworCQkJbmV3X21vZGUuY19jZmxhZyAmPSAofkNJQkFVRCk7CisJCQlpZiAoKHN0dHlfc3RhdGUgJiBTVFRZX3NwZWVkX3dhc19zZXQpCisJCQkgfHwgbWVtY21wKCZtb2RlLCAmbmV3X21vZGUsIHNpemVvZihtb2RlKSkgIT0gMCkKKyNlbmRpZgorCQkJCXBlcnJvcl9vbl9kZXZpY2VfYW5kX2RpZSgiJXM6IGNhbm5vdCBwZXJmb3JtIGFsbCByZXF1ZXN0ZWQgb3BlcmF0aW9ucyIpOworCQl9CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy9zdW0uYyBiL2NvcmV1dGlscy9zdW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWIwNjhlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL3N1bS5jCkBAIC0wLDAgKzEsMTA2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzdW0gLS0gY2hlY2tzdW0gYW5kIGNvdW50IHRoZSBibG9ja3MgaW4gYSBmaWxlCisgKiAgICAgTGlrZSBCU0Qgc3VtIG9yIFN5c1Ygc3VtIC1yLCBleGNlcHQgbGlrZSBTeXNWIHN1bSBpZiAtcyBvcHRpb24gaXMgZ2l2ZW4uCisgKgorICogQ29weXJpZ2h0IChDKSA4NiwgODksIDkxLCAxOTk1LTIwMDIsIDIwMDQgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA1IGJ5IE1pa2UgRnJ5c2luZ2VyIDx2YXBpZXJAZ2VudG9vLm9yZz4KKyAqCisgKiBXcml0dGVuIGJ5IEtheXZhbiBBZ2hhaWVwb3VyIGFuZCBEYXZpZCBNYWNLZW56aWUKKyAqIFRha2VuIGZyb20gY29yZXV0aWxzIGFuZCB0dXJuZWQgaW50byBhIGJ1c3lib3ggYXBwbGV0IGJ5IE1pa2UgRnJ5c2luZ2VyCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgc3VtX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXJzXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgc3VtX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ2hlY2tzdW0gYW5kIGNvdW50IHRoZSBibG9ja3MgaW4gYSBmaWxlXG4iCisvL3VzYWdlOiAgICAgIlxuCS1yCVVzZSBCU0Qgc3VtIGFsZ29yaXRobSAoMUsgYmxvY2tzKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJVXNlIFN5c3RlbSBWIHN1bSBhbGdvcml0aG0gKDUxMmJ5dGUgYmxvY2tzKSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2VudW0geyBTVU1fQlNELCBQUklOVF9OQU1FLCBTVU1fU1lTViB9OworCisvKiBCU0Q6IGNhbGN1bGF0ZSBhbmQgcHJpbnQgdGhlIHJvdGF0ZWQgY2hlY2tzdW0gYW5kIHRoZSBzaXplIGluIDFLIGJsb2NrcworICAgVGhlIGNoZWNrc3VtIHZhcmllcyBkZXBlbmRpbmcgb24gc2l6ZW9mIChpbnQpLiAqLworLyogU1lTVjogY2FsY3VsYXRlIGFuZCBwcmludCB0aGUgY2hlY2tzdW0gYW5kIHRoZSBzaXplIGluIDUxMi1ieXRlIGJsb2NrcyAqLworLyogUmV0dXJuIDEgaWYgc3VjY2Vzc2Z1bC4gICovCitzdGF0aWMgdW5zaWduZWQgc3VtX2ZpbGUoY29uc3QgY2hhciAqZmlsZSwgdW5zaWduZWQgdHlwZSkKK3sKKyNkZWZpbmUgYnVmIGJiX2NvbW1vbl9idWZzaXoxCisJdW5zaWduZWQgbG9uZyBsb25nIHRvdGFsX2J5dGVzID0gMDsKKwlpbnQgZmQsIHI7CisJLyogVGhlIHN1bSBvZiBhbGwgdGhlIGlucHV0IGJ5dGVzLCBtb2R1bG8gKFVJTlRfTUFYICsgMSkuICAqLworCXVuc2lnbmVkIHMgPSAwOworCisJZmQgPSBvcGVuX29yX3dhcm5fc3RkaW4oZmlsZSk7CisJaWYgKGZkID09IC0xKQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgxKSB7CisJCXNpemVfdCBieXRlc19yZWFkID0gc2FmZV9yZWFkKGZkLCBidWYsIEJVRlNJWik7CisKKwkJaWYgKChzc2l6ZV90KWJ5dGVzX3JlYWQgPD0gMCkgeworCQkJciA9IChmZCAmJiBjbG9zZShmZCkgIT0gMCk7CisJCQlpZiAoIWJ5dGVzX3JlYWQgJiYgIXIpCisJCQkJLyogbm8gZXJyb3IgKi8KKwkJCQlicmVhazsKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZpbGUpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQl0b3RhbF9ieXRlcyArPSBieXRlc19yZWFkOworCQlpZiAodHlwZSA+PSBTVU1fU1lTVikgeworCQkJZG8gcyArPSBidWZbLS1ieXRlc19yZWFkXTsgd2hpbGUgKGJ5dGVzX3JlYWQpOworCQl9IGVsc2UgeworCQkJciA9IDA7CisJCQlkbyB7CisJCQkJcyA9IChzID4+IDEpICsgKChzICYgMSkgPDwgMTUpOworCQkJCXMgKz0gYnVmW3IrK107CisJCQkJcyAmPSAweGZmZmY7IC8qIEtlZXAgaXQgd2l0aGluIGJvdW5kcy4gKi8KKwkJCX0gd2hpbGUgKC0tYnl0ZXNfcmVhZCk7CisJCX0KKwl9CisKKwlpZiAodHlwZSA8IFBSSU5UX05BTUUpCisJCWZpbGUgPSAiIjsKKwlpZiAodHlwZSA+PSBTVU1fU1lTVikgeworCQlyID0gKHMgJiAweGZmZmYpICsgKChzICYgMHhmZmZmZmZmZikgPj4gMTYpOworCQlzID0gKHIgJiAweGZmZmYpICsgKHIgPj4gMTYpOworCQlwcmludGYoIiV1ICVsbHUgJXNcbiIsIHMsICh0b3RhbF9ieXRlcyArIDUxMSkgLyA1MTIsIGZpbGUpOworCX0gZWxzZQorCQlwcmludGYoIiUwNXUgJTVsbHUgJXNcbiIsIHMsICh0b3RhbF9ieXRlcyArIDEwMjMpIC8gMTAyNCwgZmlsZSk7CisJcmV0dXJuIDE7CisjdW5kZWYgYnVmCit9CisKK2ludCBzdW1fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHN1bV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgbjsKKwl1bnNpZ25lZCB0eXBlID0gU1VNX0JTRDsKKworCW4gPSBnZXRvcHQzMihhcmd2LCAic3IiKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAobiAmIDEpIHR5cGUgPSBTVU1fU1lTVjsKKwkvKiBnaXZlIHRoZSBic2QgcHJpb3JpdHkgb3ZlciBzeXN2IGZ1bmMgKi8KKwlpZiAobiAmIDIpIHR5cGUgPSBTVU1fQlNEOworCisJaWYgKCFhcmd2WzBdKSB7CisJCS8qIERvIG5vdCBwcmludCB0aGUgbmFtZSAqLworCQluID0gc3VtX2ZpbGUoIi0iLCB0eXBlKTsKKwl9IGVsc2UgeworCQkvKiBOZWVkIHRvIHByaW50IHRoZSBuYW1lIGlmIGVpdGhlcgorCQkgKiAtIG1vcmUgdGhhbiBvbmUgZmlsZSBnaXZlbgorCQkgKiAtIGRvaW5nIHN5c3YgKi8KKwkJdHlwZSArPSAoYXJndlsxXSB8fCB0eXBlID09IFNVTV9TWVNWKTsKKwkJbiA9IDE7CisJCWRvIHsKKwkJCW4gJj0gc3VtX2ZpbGUoKmFyZ3YsIHR5cGUpOworCQl9IHdoaWxlICgqKythcmd2KTsKKwl9CisJcmV0dXJuICFuOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3N5bmMuYyBiL2NvcmV1dGlscy9zeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc0ZTkwNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy9zeW5jLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgc3luYyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBieSBCcnVjZSBQZXJlbnMgPGJydWNlQHBpeGFyLmNvbT4uCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgYnkgQXJpIFN1bmRob2xtIDxhcmlAdHV4ZXJhLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIE4vQSAtLSBNYXRjaGVzIEdOVSBiZWhhdmlvci4gKi8KKy8vY29uZmlnOmNvbmZpZyBTWU5DCisvL2NvbmZpZzoJYm9vbCAic3luYyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBzeW5jIGlzIHVzZWQgdG8gZmx1c2ggZmlsZXN5c3RlbSBidWZmZXJzLgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfU1lOQ19GQU5DWQorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAtZCBhbmQgLWYgZmxhZ3MgKHJlcXVyZXMgc3luY2ZzKDIpIGluIGxpYmMpIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gU1lOQworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIHN5bmMgLWQgRklMRS4uLiBleGVjdXRlcyBmZGF0YXN5bmMoKSBvbiBlYWNoIEZJTEUuCisvL2NvbmZpZzoJICBzeW5jIC1mIEZJTEUuLi4gZXhlY3V0ZXMgc3luY2ZzKCkgb24gZWFjaCBGSUxFLgorCisvL2tidWlsZDpsaWItJChDT05GSUdfU1lOQykgKz0gc3luYy5vCisvL2FwcGxldDpJRl9TWU5DKEFQUExFVF9OT0ZPUksoc3luYywgc3luYywgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBzeW5jKSkKKworLy91c2FnZTojZGVmaW5lIHN5bmNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIiJJRl9GRUFUVVJFX1NZTkNfRkFOQ1koIlstZGZdIFtGSUxFXS4uLiIpCisvL3VzYWdlOiNkZWZpbmUgc3luY19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgSUZfTk9UX0ZFQVRVUkVfU1lOQ19GQU5DWSgKKy8vdXNhZ2U6ICAgICAgICJXcml0ZSBhbGwgYnVmZmVyZWQgYmxvY2tzIHRvIGRpc2siCisvL3VzYWdlOiAgICApCisvL3VzYWdlOiAgICBJRl9GRUFUVVJFX1NZTkNfRkFOQ1koCisvL3VzYWdlOiAgICAgICAiV3JpdGUgYWxsIGJ1ZmZlcmVkIGJsb2NrcyAoaW4gRklMRXMpIHRvIGRpc2siCisvL3VzYWdlOiAgICAgIlxuCS1kCUF2b2lkIHN5bmNpbmcgbWV0YWRhdGEiCisvL3VzYWdlOiAgICAgIlxuCS1mCVN5bmMgZmlsZXN5c3RlbXMgdW5kZXJseWluZyBGSUxFcyIKKy8vdXNhZ2U6ICAgICkKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0ZPUksgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK2ludCBzeW5jX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzeW5jX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBJRl9OT1RfREVTS1RPUChVTlVTRURfUEFSQU0pKQoreworI2lmICFFTkFCTEVfRkVBVFVSRV9TWU5DX0ZBTkNZCisJLyogY29yZXV0aWxzLTYuOSBjb21wYXQgKi8KKwliYl93YXJuX2lnbm9yaW5nX2FyZ3MoYXJndlsxXSk7CisJc3luYygpOworCXJldHVybiBFWElUX1NVQ0NFU1M7CisjZWxzZQorCXVuc2lnbmVkIG9wdHM7CisJaW50IHJldCA9IEVYSVRfU1VDQ0VTUzsKKworCWVudW0geworCQlPUFRfREFUQVNZTkMgPSAoMSA8PCAwKSwKKwkJT1BUX1NZTkNGUyAgID0gKDEgPDwgMSksCisJfTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gImQtLWY6Zi0tZCI7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJkZiIpOworCWFyZ3YgKz0gb3B0aW5kOworCisJLyogSGFuZGxlIHRoZSBuby1hcmd1bWVudCBjYXNlLiAqLworCWlmICghYXJndlswXSkKKwkJc3luYygpOworCisJd2hpbGUgKCphcmd2KSB7CisJCWludCBmZCA9IG9wZW5fb3Jfd2FybigqYXJndiwgT19SRE9OTFkpOworCisJCWlmIChmZCA8IDApIHsKKwkJCXJldCA9IEVYSVRfRkFJTFVSRTsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCQlpZiAob3B0cyAmIE9QVF9EQVRBU1lOQykgeworCQkJaWYgKGZkYXRhc3luYyhmZCkpCisJCQkJZ290byBlcnI7CisJCQlnb3RvIGRvX2Nsb3NlOworCQl9CisJCWlmIChvcHRzICYgT1BUX1NZTkNGUykgeworCQkJLyoKKwkJCSAqIHN5bmNmcyBpcyBkb2N1bWVudGVkIHRvIG9ubHkgZmFpbCB3aXRoIEVCQURGLAorCQkJICogd2hpY2ggY2FuJ3QgaGFwcGVuIGhlcmUuIFNvLCBubyBlcnJvciBjaGVja3MuCisJCQkgKi8KKwkJCXN5bmNmcyhmZCk7CisJCQlnb3RvIGRvX2Nsb3NlOworCQl9CisJCWlmIChmc3luYyhmZCkpIHsKKyBlcnI6CisJCQliYl9zaW1wbGVfcGVycm9yX21zZygqYXJndik7CisJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCX0KKyBkb19jbG9zZToKKwkJY2xvc2UoZmQpOworIG5leHQ6CisJCSsrYXJndjsKKwl9CisKKwlyZXR1cm4gcmV0OworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvdGFjLmMgYi9jb3JldXRpbHMvdGFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRkNjY5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy90YWMuYwpAQCAtMCwwICsxLDExMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdGFjIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBZYW5nIFhpYW9wZW5nICA8eXhwIGF0IGhhbndhbmcuY29tLmNuPgorICogQ29weXJpZ2h0IChDKSAyMDA3ICBOYXRhbmFlbCBDb3BhICA8bmF0YW5hZWwuY29wYUBnbWFpbC5jb20+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgIFRpdG8gUmFndXNhICAgIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqLworCisvKiB0YWMgLSBjb25jYXRlbmF0ZSBhbmQgcHJpbnQgZmlsZXMgaW4gcmV2ZXJzZSAqLworCisvKiBCYXNlZCBvbiBZYW5nIFhpYW9wZW5nJ3MgKHl4cCBhdCBoYW53YW5nLmNvbS5jbikgcGF0Y2gKKyAqIGh0dHA6Ly93d3cudWNsaWJjLm9yZy9saXN0cy9idXN5Ym94LzIwMDMtSnVseS8wMDg4MTMuaHRtbAorICovCisKKy8vdXNhZ2U6I2RlZmluZSB0YWNfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIltGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSB0YWNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6CSJDb25jYXRlbmF0ZSBGSUxFcyBhbmQgcHJpbnQgdGhlbSBpbiByZXZlcnNlIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworc3RydWN0IGxzdHJpbmcgeworCWludCBzaXplOworCWNoYXIgYnVmWzFdOworfTsKKworaW50IHRhY19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdGFjX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICoqbmFtZTsKKwlGSUxFICpmOworCXN0cnVjdCBsc3RyaW5nICpsaW5lID0gTlVMTDsKKwlsbGlzdF90ICpsaXN0ID0gTlVMTDsKKwlpbnQgcmV0dmFsID0gRVhJVF9TVUNDRVNTOworCisjaWYgRU5BQkxFX0RFU0tUT1AKKy8qIHRhYyBmcm9tIGNvcmV1dGlscyA2Ljkgc3VwcG9ydHM6CisgICAgICAgLWIsIC0tYmVmb3JlCisgICAgICAgICAgICAgIGF0dGFjaCB0aGUgc2VwYXJhdG9yIGJlZm9yZSBpbnN0ZWFkIG9mIGFmdGVyCisgICAgICAgLXIsIC0tcmVnZXgKKyAgICAgICAgICAgICAgaW50ZXJwcmV0IHRoZSBzZXBhcmF0b3IgYXMgYSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgICAtcywgLS1zZXBhcmF0b3I9U1RSSU5HCisgICAgICAgICAgICAgIHVzZSBTVFJJTkcgYXMgdGhlIHNlcGFyYXRvciBpbnN0ZWFkIG9mIG5ld2xpbmUKK1dlIHN1cHBvcnQgbm9uZSwgYnV0IGF0IGxlYXN0IHdlIHdpbGwgY29tcGxhaW4gb3IgaGFuZGxlICItLSI6CisqLworCWdldG9wdDMyKGFyZ3YsICIiKTsKKwlhcmd2ICs9IG9wdGluZDsKKyNlbHNlCisJYXJndisrOworI2VuZGlmCisJaWYgKCEqYXJndikKKwkJKi0tYXJndiA9IChjaGFyICopIi0iOworCS8qIFdlIHdpbGwgcmVhZCBmcm9tIGxhc3QgZmlsZSB0byBmaXJzdCAqLworCW5hbWUgPSBhcmd2OworCXdoaWxlICgqbmFtZSkKKwkJbmFtZSsrOworCisJZG8geworCQlpbnQgY2gsIGk7CisKKwkJbmFtZS0tOworCQlmID0gZm9wZW5fb3Jfd2Fybl9zdGRpbigqbmFtZSk7CisJCWlmIChmID09IE5VTEwpIHsKKwkJCS8qIGVycm9yIG1lc3NhZ2UgaXMgcHJpbnRlZCBieSBmb3Blbl9vcl93YXJuX3N0ZGluICovCisJCQlyZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJCQljb250aW51ZTsKKwkJfQorCisJCWVycm5vID0gaSA9IDA7CisJCWRvIHsKKwkJCWNoID0gZmdldGMoZik7CisJCQlpZiAoY2ggIT0gRU9GKSB7CisJCQkJaWYgKCEoaSAmIDB4N2YpKQorCQkJCQkvKiBHcm93IG9uIGV2ZXJ5IDEyOHRoIGNoYXIgKi8KKwkJCQkJbGluZSA9IHhyZWFsbG9jKGxpbmUsIGkgKyAweDdmICsgc2l6ZW9mKGludCkgKyAxKTsKKwkJCQlsaW5lLT5idWZbaSsrXSA9IGNoOworCQkJfQorCQkJaWYgKGNoID09ICdcbicgfHwgKGNoID09IEVPRiAmJiBpICE9IDApKSB7CisJCQkJbGluZSA9IHhyZWFsbG9jKGxpbmUsIGkgKyBzaXplb2YoaW50KSk7CisJCQkJbGluZS0+c2l6ZSA9IGk7CisJCQkJbGxpc3RfYWRkX3RvKCZsaXN0LCBsaW5lKTsKKwkJCQlsaW5lID0gTlVMTDsKKwkJCQlpID0gMDsKKwkJCX0KKwkJfSB3aGlsZSAoY2ggIT0gRU9GKTsKKwkJLyogZmdldGMgc2V0cyBlcnJubyB0byBFTk9FTlQgb24gRU9GLCB3ZSBkb24ndCB3YW50CisJCSAqIHRvIHdhcm4gb24gdGhpcyBub24tZXJyb3IhICovCisJCWlmIChlcnJubyAmJiBlcnJubyAhPSBFTk9FTlQpIHsKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKCpuYW1lKTsKKwkJCXJldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwkJfQorCX0gd2hpbGUgKG5hbWUgIT0gYXJndik7CisKKwl3aGlsZSAobGlzdCkgeworCQlsaW5lID0gKHN0cnVjdCBsc3RyaW5nICopbGlzdC0+ZGF0YTsKKwkJeHdyaXRlKFNURE9VVF9GSUxFTk8sIGxpbmUtPmJ1ZiwgbGluZS0+c2l6ZSk7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQkJZnJlZShsbGlzdF9wb3AoJmxpc3QpKTsKKwkJfSBlbHNlIHsKKwkJCWxpc3QgPSBsaXN0LT5saW5rOworCQl9CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy90YWlsLmMgYi9jb3JldXRpbHMvdGFpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNTJhYjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvdGFpbC5jCkBAIC0wLDAgKzEsMzg0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHRhaWwgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgTWF0dCBLcmFhaSA8a3JhYWlAYWx1bW5pLmNhcm5lZ2llbWVsbG9uLmVkdT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudCAobmVlZCBmYW5jeSBmb3IgLWMpICovCisvKiBCQl9BVURJVCBHTlUgY29tcGF0aWJsZSAtYywgLXEsIGFuZCAtdiBvcHRpb25zIGluICdmYW5jeScgY29uZmlndXJhdGlvbi4gKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvdGFpbC5odG1sICovCisKKy8qIE1hciAxNiwgMjAwMyAgICAgIE1hbnVlbCBOb3ZvYSBJSUkgICAobWpuM0Bjb2RlcG9ldC5vcmcpCisgKgorICogUHJldHR5IG11Y2ggcmV3cml0dGVuIHRvIGZpeCBudW1lcm91cyBidWdzIGFuZCByZWR1Y2UgcmVhbGxvYygpIGNhbGxzLgorICogQnVncyBmaXhlZCAoYWx0aG91Z2ggSSBtYXkgaGF2ZSBmb3Jnb3R0ZW4gb25lIG9yIHR3by4uLiBpdCB3YXMgcHJldHR5IGJhZCkKKyAqIDEpIG1peGluZyBwcmludGYvd3JpdGUgd2l0aG91dCBmZmx1c2goKWluZyBzdGRvdXQKKyAqIDIpIG5vIGNoZWNrIHRoYXQgYW55IG9wZW4gZmlsZXMgYXJlIHByZXNlbnQKKyAqIDMpIG9wdHN0cmluZyBoYWQgLXEgdGFraW5nIGFuIGFyZworICogNCkgbm8gZXJyb3IgY2hlY2tpbmcgb24gd3JpdGUgaW4gc29tZSBjYXNlcywgYW5kIGEgd2FybmluZyBldmVuIHRoZW4KKyAqIDUpIHEgYW5kIHMgaW50ZXJhY3Rpb24gYnVnCisgKiA2KSBubyBjaGVjayBmb3IgbHNlZWsgZXJyb3IKKyAqIDcpIGxzZWVrIGF0dGVtcHRlZCB3aGVuIGNvdW50PT0wIGV2ZW4gaWYgYXJnIHdhcyArMCAoZnJvbSB0b3ApCisgKi8KKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1RBSUwpICs9IHRhaWwubworCisvL3VzYWdlOiNkZWZpbmUgdGFpbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSB0YWlsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgbGFzdCAxMCBsaW5lcyBvZiBlYWNoIEZJTEUgKG9yIHN0ZGluKSB0byBzdGRvdXQuXG4iCisvL3VzYWdlOiAgICAgICAiV2l0aCBtb3JlIHRoYW4gb25lIEZJTEUsIHByZWNlZGUgZWFjaCB3aXRoIGEgZmlsZW5hbWUgaGVhZGVyLlxuIgorLy91c2FnZTogICAgICJcbgktZgkJUHJpbnQgZGF0YSBhcyBmaWxlIGdyb3dzIgorLy91c2FnZTogICAgICJcbgktYyBbK11OW2tibV0JUHJpbnQgbGFzdCBOIGJ5dGVzIgorLy91c2FnZTogICAgICJcbgktbiBOW2tibV0JUHJpbnQgbGFzdCBOIGxpbmVzIgorLy91c2FnZTogICAgICJcbgktbiArTltrYm1dCVN0YXJ0IG9uIE50aCBsaW5lIGFuZCBwcmludCB0aGUgcmVzdCIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRkFOQ1lfVEFJTCgKKy8vdXNhZ2U6ICAgICAiXG4JLXEJCU5ldmVyIHByaW50IGhlYWRlcnMiCisvL3VzYWdlOiAgICAgIlxuCS1zIFNFQ09ORFMJV2FpdCBTRUNPTkRTIGJldHdlZW4gcmVhZHMgd2l0aCAtZiIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJCUFsd2F5cyBwcmludCBoZWFkZXJzIgorLy91c2FnZTogICAgICJcbgktRgkJU2FtZSBhcyAtZiwgYnV0IGtlZXAgcmV0cnlpbmciCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbk4gbWF5IGJlIHN1ZmZpeGVkIGJ5IGsgKHgxMDI0KSwgYiAoeDUxMiksIG9yIG0gKHgxMDI0XjIpLiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdGFpbF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCB0YWlsIC1uIDEgL2V0Yy9yZXNvbHYuY29uZlxuIgorLy91c2FnZTogICAgICAgIm5hbWVzZXJ2ZXIgMTAuMC4wLjFcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlib29sIGZyb21fdG9wOworCWJvb2wgZXhpdGNvZGU7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBJTklUX0coKSBkbyB7IH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIHRhaWxfeHByaW50X2hlYWRlcihjb25zdCBjaGFyICpmbXQsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWlmIChmZHByaW50ZihTVERPVVRfRklMRU5PLCBmbXQsIGZpbGVuYW1lKSA8IDApCisJCWJiX3BlcnJvcl9ub21zZ19hbmRfZGllKCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRhaWxfcmVhZChpbnQgZmQsIGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXNzaXplX3QgcjsKKworCXIgPSBmdWxsX3JlYWQoZmQsIGJ1ZiwgY291bnQpOworCWlmIChyIDwgMCkgeworCQliYl9wZXJyb3JfbXNnKGJiX21zZ19yZWFkX2Vycm9yKTsKKwkJRy5leGl0Y29kZSA9IEVYSVRfRkFJTFVSRTsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworI2RlZmluZSBoZWFkZXJfZm10X3N0ciAiXG49PT4gJXMgPD09XG4iCisKK3N0YXRpYyB1bnNpZ25lZCBlYXRfbnVtKGNvbnN0IGNoYXIgKnApCit7CisJaWYgKCpwID09ICctJykKKwkJcCsrOworCWVsc2UgaWYgKCpwID09ICcrJykgeworCQlwKys7CisJCUcuZnJvbV90b3AgPSAxOworCX0KKwlyZXR1cm4geGF0b3Vfc2Z4KHAsIGJrbV9zdWZmaXhlcyk7Cit9CisKK2ludCB0YWlsX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0YWlsX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGNvdW50ID0gMTA7CisJdW5zaWduZWQgc2xlZXBfcGVyaW9kID0gMTsKKwljb25zdCBjaGFyICpzdHJfYywgKnN0cl9uOworCisJY2hhciAqdGFpbGJ1ZjsKKwlzaXplX3QgdGFpbGJ1ZnNpemU7CisJdW5zaWduZWQgaGVhZGVyX3RocmVzaGhvbGQgPSAxOworCXVuc2lnbmVkIG5maWxlczsKKwlpbnQgaSwgb3B0OworCisJaW50ICpmZHM7CisJY29uc3QgY2hhciAqZm10OworCWludCBwcmV2X2ZkOworCisJSU5JVF9HKCk7CisKKyNpZiBFTkFCTEVfSU5DTFVERV9TVVN2MiB8fCBFTkFCTEVfRkVBVFVSRV9GQU5DWV9UQUlMCisJLyogQWxsb3cgbGVnYWN5IHN5bnRheCBvZiBhbiBpbml0aWFsIG51bWVyaWMgb3B0aW9uIHdpdGhvdXQgLW4uICovCisJaWYgKGFyZ3ZbMV0gJiYgKGFyZ3ZbMV1bMF0gPT0gJysnIHx8IGFyZ3ZbMV1bMF0gPT0gJy0nKQorCSAmJiBpc2RpZ2l0KGFyZ3ZbMV1bMV0pCisJKSB7CisJCWNvdW50ID0gZWF0X251bShhcmd2WzFdKTsKKwkJYXJndisrOworCQlhcmdjLS07CisJfQorI2VuZGlmCisKKwkvKiAtcyBOVU0sIC1GIGltbGllcyAtZiAqLworCUlGX0ZFQVRVUkVfRkFOQ1lfVEFJTChvcHRfY29tcGxlbWVudGFyeSA9ICJzKzpGZiI7KQorCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJmYzpuOiIgSUZfRkVBVFVSRV9GQU5DWV9UQUlMKCJxczp2RiIpLAorCQkJJnN0cl9jLCAmc3RyX24gSUZfRkVBVFVSRV9GQU5DWV9UQUlMKCwmc2xlZXBfcGVyaW9kKSk7CisjZGVmaW5lIEZPTExPVyAob3B0ICYgMHgxKQorI2RlZmluZSBDT1VOVF9CWVRFUyAob3B0ICYgMHgyKQorCS8vaWYgKG9wdCAmIDB4MSkgLy8gLWYKKwlpZiAob3B0ICYgMHgyKSBjb3VudCA9IGVhdF9udW0oc3RyX2MpOyAvLyAtYworCWlmIChvcHQgJiAweDQpIGNvdW50ID0gZWF0X251bShzdHJfbik7IC8vIC1uCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkFOQ1lfVEFJTAorCS8qIHE6IG1ha2UgaXQgaW1wb3NzaWJsZSBmb3IgbmZpbGVzIHRvIGJlID4gaGVhZGVyX3RocmVzaGhvbGQgKi8KKwlpZiAob3B0ICYgMHg4KSBoZWFkZXJfdGhyZXNoaG9sZCA9IFVJTlRfTUFYOyAvLyAtcQorCS8vaWYgKG9wdCAmIDB4MTApIC8vIC1zCisJaWYgKG9wdCAmIDB4MjApIGhlYWRlcl90aHJlc2hob2xkID0gMDsgLy8gLXYKKyMgZGVmaW5lIEZPTExPV19SRVRSWSAob3B0ICYgMHg0MCkKKyNlbHNlCisjIGRlZmluZSBGT0xMT1dfUkVUUlkgMAorI2VuZGlmCisJYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisKKwkvKiBvcGVuIGFsbCB0aGUgZmlsZXMgKi8KKwlmZHMgPSB4bWFsbG9jKHNpemVvZihmZHNbMF0pICogKGFyZ2MgKyAxKSk7CisJaWYgKCFhcmd2WzBdKSB7CisJCXN0cnVjdCBzdGF0IHN0YXRidWY7CisKKwkJaWYgKGZzdGF0KFNURElOX0ZJTEVOTywgJnN0YXRidWYpID09IDAKKwkJICYmIFNfSVNGSUZPKHN0YXRidWYuc3RfbW9kZSkKKwkJKSB7CisJCQlvcHQgJj0gfjE7IC8qIGNsZWFyIEZPTExPVyAqLworCQl9CisJCWFyZ3ZbMF0gPSAoY2hhciAqKSBiYl9tc2dfc3RhbmRhcmRfaW5wdXQ7CisJfQorCW5maWxlcyA9IGkgPSAwOworCWRvIHsKKwkJaW50IGZkID0gb3Blbl9vcl93YXJuX3N0ZGluKGFyZ3ZbaV0pOworCQlpZiAoZmQgPCAwICYmICFGT0xMT1dfUkVUUlkpIHsKKwkJCUcuZXhpdGNvZGUgPSBFWElUX0ZBSUxVUkU7CisJCQljb250aW51ZTsKKwkJfQorCQlmZHNbbmZpbGVzXSA9IGZkOworCQlhcmd2W25maWxlcysrXSA9IGFyZ3ZbaV07CisJfSB3aGlsZSAoKytpIDwgYXJnYyk7CisKKwlpZiAoIW5maWxlcykKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vIGZpbGVzIik7CisKKwkvKiBwcmVwYXJlIHRoZSBidWZmZXIgKi8KKwl0YWlsYnVmc2l6ZSA9IEJVRlNJWjsKKwlpZiAoIUcuZnJvbV90b3AgJiYgQ09VTlRfQllURVMpIHsKKwkJaWYgKHRhaWxidWZzaXplIDwgY291bnQgKyBCVUZTSVopIHsKKwkJCXRhaWxidWZzaXplID0gY291bnQgKyBCVUZTSVo7CisJCX0KKwl9CisJLyogdGFpbCAtYzEwMjRtIFJFR1VMQVJfRklMRSBkb2Vzbid0IHJlYWxseSBuZWVkIDFHIG1lbSBibG9jay4KKwkgKiAoSW4gZmFjdCwgaXQgZG9lc24ndCBuZWVkIEFOWSBtZW1vcnkpLiBTbyBkZWxheSBhbGxvY2F0aW9uLgorCSAqLworCXRhaWxidWYgPSBOVUxMOworCisJLyogdGFpbCB0aGUgZmlsZXMgKi8KKworCWZtdCA9IGhlYWRlcl9mbXRfc3RyICsgMTsgLyogc2tpcCBsZWFkaW5nIG5ld2xpbmUgaW4gdGhlIGhlYWRlciBvbiB0aGUgZmlyc3Qgb3V0cHV0ICovCisJaSA9IDA7CisJZG8geworCQljaGFyICpidWY7CisJCWludCB0YWlsbGVuOworCQlpbnQgbmV3bGluZXNfc2VlbjsKKwkJdW5zaWduZWQgc2VlbjsKKwkJaW50IG5yZWFkOworCQlpbnQgZmQgPSBmZHNbaV07CisKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0ZBTkNZX1RBSUwgJiYgZmQgPCAwKQorCQkJY29udGludWU7IC8qIG1heSBoYXBwZW4gd2l0aCAtRiAqLworCisJCWlmIChuZmlsZXMgPiBoZWFkZXJfdGhyZXNoaG9sZCkgeworCQkJdGFpbF94cHJpbnRfaGVhZGVyKGZtdCwgYXJndltpXSk7CisJCQlmbXQgPSBoZWFkZXJfZm10X3N0cjsKKwkJfQorCisJCWlmICghRy5mcm9tX3RvcCkgeworCQkJb2ZmX3QgY3VycmVudCA9IGxzZWVrKGZkLCAwLCBTRUVLX0VORCk7CisJCQlpZiAoY3VycmVudCA+IDApIHsKKwkJCQl1bnNpZ25lZCBvZmY7CisJCQkJaWYgKENPVU5UX0JZVEVTKSB7CisJCQkJLyogT3B0aW1pemluZyBjb3VudC1ieXRlcyBjYXNlIGlmIHRoZSBmaWxlIGlzIHNlZWthYmxlLgorCQkJCSAqIEJld2FyZSBvZiBiYWNraW5nIHVwIHRvbyBmYXIuCisJCQkJICogQWxzbyB3ZSBleGNsdWRlIGZpbGVzIHdpdGggc2l6ZSAwIChiZWNhdXNlIG9mIC9wcm9jL3h4eCkgKi8KKwkJCQkJaWYgKGNvdW50ID09IDApCisJCQkJCQljb250aW51ZTsgLyogc2hvd2luZyB6ZXJvIGJ5dGVzIGlzIGVhc3kgOikgKi8KKwkJCQkJY3VycmVudCAtPSBjb3VudDsKKwkJCQkJaWYgKGN1cnJlbnQgPCAwKQorCQkJCQkJY3VycmVudCA9IDA7CisJCQkJCXhsc2VlayhmZCwgY3VycmVudCwgU0VFS19TRVQpOworCQkJCQliYl9jb3B5ZmRfc2l6ZShmZCwgU1RET1VUX0ZJTEVOTywgY291bnQpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisjaWYgMSAvKiBUaGlzIGlzIHRlY2huaWNhbGx5IGluY29ycmVjdCBmb3IgKkxPTkcqIHN0cmluZ3MsIGJ1dCB2ZXJ5IHVzZWZ1bCAqLworCQkJCS8qIE9wdGltaXppbmcgY291bnQtbGluZXMgY2FzZSBpZiB0aGUgZmlsZSBpcyBzZWVrYWJsZS4KKwkJCQkgKiBXZSBhc3N1bWUgdGhlIGxpbmVzIGFyZSA8NjRrLgorCQkJCSAqIChVc2VycyBjb21wbGFpbiB0aGF0IHRhaWwgdGFrZXMgdG9vIGxvbmcKKwkJCQkgKiBvbiBtdWx0aS1naWdhYnl0ZSBmaWxlcykgKi8KKwkJCQlvZmYgPSAoY291bnQgfCAweGYpOyAvKiBmb3Igc21hbGwgY291bnRzLCBiZSBtb3JlIHBhcmFub2lkICovCisJCQkJaWYgKG9mZiA+IChJTlRfTUFYIC8gKDY0KjEwMjQpKSkKKwkJCQkJb2ZmID0gKElOVF9NQVggLyAoNjQqMTAyNCkpOworCQkJCWN1cnJlbnQgLT0gb2ZmICogKDY0KjEwMjQpOworCQkJCWlmIChjdXJyZW50IDwgMCkKKwkJCQkJY3VycmVudCA9IDA7CisJCQkJeGxzZWVrKGZkLCBjdXJyZW50LCBTRUVLX1NFVCk7CisjZW5kaWYKKwkJCX0KKwkJfQorCisJCWlmICghdGFpbGJ1ZikKKwkJCXRhaWxidWYgPSB4bWFsbG9jKHRhaWxidWZzaXplKTsKKworCQlidWYgPSB0YWlsYnVmOworCQl0YWlsbGVuID0gMDsKKwkJLyogIldlIHNhdyAxc3QgbGluZS9ieXRlIi4KKwkJICogVXNlZCBvbmx5IGJ5ICtOIGNvZGUgKCJzdGFydCBmcm9tIE50aCIsIDEtYmFzZWQpOiAqLworCQlzZWVuID0gMTsKKwkJbmV3bGluZXNfc2VlbiA9IDA7CisJCXdoaWxlICgobnJlYWQgPSB0YWlsX3JlYWQoZmQsIGJ1ZiwgdGFpbGJ1ZnNpemUgLSB0YWlsbGVuKSkgPiAwKSB7CisJCQlpZiAoRy5mcm9tX3RvcCkgeworCQkJCWludCBud3JpdGUgPSBucmVhZDsKKwkJCQlpZiAoc2VlbiA8IGNvdW50KSB7CisJCQkJCS8qIFdlIG5lZWQgdG8gc2tpcCBhIGZldyBtb3JlIGJ5dGVzL2xpbmVzICovCisJCQkJCWlmIChDT1VOVF9CWVRFUykgeworCQkJCQkJbndyaXRlIC09IChjb3VudCAtIHNlZW4pOworCQkJCQkJc2VlbiArPSBucmVhZDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNoYXIgKnMgPSBidWY7CisJCQkJCQlkbyB7CisJCQkJCQkJLS1ud3JpdGU7CisJCQkJCQkJaWYgKCpzKysgPT0gJ1xuJyAmJiArK3NlZW4gPT0gY291bnQpIHsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJfSB3aGlsZSAobndyaXRlKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlpZiAobndyaXRlID4gMCkKKwkJCQkJeHdyaXRlKFNURE9VVF9GSUxFTk8sIGJ1ZiArIG5yZWFkIC0gbndyaXRlLCBud3JpdGUpOworCQkJfSBlbHNlIGlmIChjb3VudCkgeworCQkJCWlmIChDT1VOVF9CWVRFUykgeworCQkJCQl0YWlsbGVuICs9IG5yZWFkOworCQkJCQlpZiAodGFpbGxlbiA+IChpbnQpY291bnQpIHsKKwkJCQkJCW1lbW1vdmUodGFpbGJ1ZiwgdGFpbGJ1ZiArIHRhaWxsZW4gLSBjb3VudCwgY291bnQpOworCQkJCQkJdGFpbGxlbiA9IGNvdW50OworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJaW50IGsgPSBucmVhZDsKKwkJCQkJaW50IG5ld2xpbmVzX2luX2J1ZiA9IDA7CisKKwkJCQkJZG8geyAvKiBjb3VudCAnXG4nIGluIGxhc3QgcmVhZCAqLworCQkJCQkJay0tOworCQkJCQkJaWYgKGJ1ZltrXSA9PSAnXG4nKSB7CisJCQkJCQkJbmV3bGluZXNfaW5fYnVmKys7CisJCQkJCQl9CisJCQkJCX0gd2hpbGUgKGspOworCisJCQkJCWlmIChuZXdsaW5lc19zZWVuICsgbmV3bGluZXNfaW5fYnVmIDwgKGludCljb3VudCkgeworCQkJCQkJbmV3bGluZXNfc2VlbiArPSBuZXdsaW5lc19pbl9idWY7CisJCQkJCQl0YWlsbGVuICs9IG5yZWFkOworCQkJCQl9IGVsc2UgeworCQkJCQkJaW50IGV4dHJhID0gKGJ1ZltucmVhZC0xXSAhPSAnXG4nKTsKKwkJCQkJCWNoYXIgKnM7CisKKwkJCQkJCWsgPSBuZXdsaW5lc19zZWVuICsgbmV3bGluZXNfaW5fYnVmICsgZXh0cmEgLSBjb3VudDsKKwkJCQkJCXMgPSB0YWlsYnVmOworCQkJCQkJd2hpbGUgKGspIHsKKwkJCQkJCQlpZiAoKnMgPT0gJ1xuJykgeworCQkJCQkJCQlrLS07CisJCQkJCQkJfQorCQkJCQkJCXMrKzsKKwkJCQkJCX0KKwkJCQkJCXRhaWxsZW4gKz0gbnJlYWQgLSAocyAtIHRhaWxidWYpOworCQkJCQkJbWVtbW92ZSh0YWlsYnVmLCBzLCB0YWlsbGVuKTsKKwkJCQkJCW5ld2xpbmVzX3NlZW4gPSBjb3VudCAtIGV4dHJhOworCQkJCQl9CisJCQkJCWlmICh0YWlsYnVmc2l6ZSA8IChzaXplX3QpdGFpbGxlbiArIEJVRlNJWikgeworCQkJCQkJdGFpbGJ1ZnNpemUgPSB0YWlsbGVuICsgQlVGU0laOworCQkJCQkJdGFpbGJ1ZiA9IHhyZWFsbG9jKHRhaWxidWYsIHRhaWxidWZzaXplKTsKKwkJCQkJfQorCQkJCX0KKwkJCQlidWYgPSB0YWlsYnVmICsgdGFpbGxlbjsKKwkJCX0KKwkJfSAvKiB3aGlsZSAodGFpbF9yZWFkKCkgPiAwKSAqLworCQlpZiAoIUcuZnJvbV90b3ApIHsKKwkJCXh3cml0ZShTVERPVVRfRklMRU5PLCB0YWlsYnVmLCB0YWlsbGVuKTsKKwkJfQorCX0gd2hpbGUgKCsraSA8IG5maWxlcyk7CisJcHJldl9mZCA9IGZkc1tpLTFdOworCisJdGFpbGJ1ZiA9IHhyZWFsbG9jKHRhaWxidWYsIEJVRlNJWik7CisKKwlmbXQgPSBOVUxMOworCisJaWYgKEZPTExPVykgd2hpbGUgKDEpIHsKKwkJc2xlZXAoc2xlZXBfcGVyaW9kKTsKKworCQlpID0gMDsKKwkJZG8geworCQkJaW50IG5yZWFkOworCQkJY29uc3QgY2hhciAqZmlsZW5hbWUgPSBhcmd2W2ldOworCQkJaW50IGZkID0gZmRzW2ldOworCisJCQlpZiAoRk9MTE9XX1JFVFJZKSB7CisJCQkJc3RydWN0IHN0YXQgc2J1ZiwgZnNidWY7CisKKwkJCQlpZiAoZmQgPCAwCisJCQkJIHx8IGZzdGF0KGZkLCAmZnNidWYpIDwgMAorCQkJCSB8fCBzdGF0KGZpbGVuYW1lLCAmc2J1ZikgPCAwCisJCQkJIHx8IGZzYnVmLnN0X2RldiAhPSBzYnVmLnN0X2RldgorCQkJCSB8fCBmc2J1Zi5zdF9pbm8gIT0gc2J1Zi5zdF9pbm8KKwkJCQkpIHsKKwkJCQkJaW50IG5ld19mZDsKKworCQkJCQlpZiAoZmQgPj0gMCkKKwkJCQkJCWNsb3NlKGZkKTsKKwkJCQkJbmV3X2ZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCQkJCQlpZiAobmV3X2ZkID49IDApIHsKKwkJCQkJCWJiX2Vycm9yX21zZygiJXMgaGFzICVzOyBmb2xsb3dpbmcgZW5kIG9mIG5ldyBmaWxlIiwKKwkJCQkJCQlmaWxlbmFtZSwgKGZkIDwgMCkgPyAiYXBwZWFyZWQiIDogImJlZW4gcmVwbGFjZWQiCisJCQkJCQkpOworCQkJCQl9IGVsc2UgaWYgKGZkID49IDApIHsKKwkJCQkJCWJiX3BlcnJvcl9tc2coIiVzIGhhcyBiZWNvbWUgaW5hY2Nlc3NpYmxlIiwgZmlsZW5hbWUpOworCQkJCQl9CisJCQkJCWZkc1tpXSA9IGZkID0gbmV3X2ZkOworCQkJCX0KKwkJCX0KKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9GQU5DWV9UQUlMICYmIGZkIDwgMCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChuZmlsZXMgPiBoZWFkZXJfdGhyZXNoaG9sZCkgeworCQkJCWZtdCA9IGhlYWRlcl9mbXRfc3RyOworCQkJfQorCQkJZm9yICg7OykgeworCQkJCS8qIHRhaWwgLWYga2VlcHMgZm9sbG93aW5nIGZpbGVzIGV2ZW4gaWYgdGhleSBhcmUgdHJ1bmNhdGVkICovCisJCQkJc3RydWN0IHN0YXQgc2J1ZjsKKwkJCQkvKiAvcHJvYyBmaWxlcyByZXBvcnQgemVybyBzdF9zaXplLCBkb24ndCBsc2VlayB0aGVtICovCisJCQkJaWYgKGZzdGF0KGZkLCAmc2J1ZikgPT0gMCAmJiBzYnVmLnN0X3NpemUgPiAwKSB7CisJCQkJCW9mZl90IGN1cnJlbnQgPSBsc2VlayhmZCwgMCwgU0VFS19DVVIpOworCQkJCQlpZiAoc2J1Zi5zdF9zaXplIDwgY3VycmVudCkKKwkJCQkJCXhsc2VlayhmZCwgMCwgU0VFS19TRVQpOworCQkJCX0KKworCQkJCW5yZWFkID0gdGFpbF9yZWFkKGZkLCB0YWlsYnVmLCBCVUZTSVopOworCQkJCWlmIChucmVhZCA8PSAwKQorCQkJCQlicmVhazsKKwkJCQlpZiAoZm10ICYmIChmZCAhPSBwcmV2X2ZkKSkgeworCQkJCQl0YWlsX3hwcmludF9oZWFkZXIoZm10LCBmaWxlbmFtZSk7CisJCQkJCWZtdCA9IE5VTEw7CisJCQkJCXByZXZfZmQgPSBmZDsKKwkJCQl9CisJCQkJeHdyaXRlKFNURE9VVF9GSUxFTk8sIHRhaWxidWYsIG5yZWFkKTsKKwkJCX0KKwkJfSB3aGlsZSAoKytpIDwgbmZpbGVzKTsKKwl9IC8qIHdoaWxlICgxKSAqLworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZyZWUoZmRzKTsKKwkJZnJlZSh0YWlsYnVmKTsKKwl9CisJcmV0dXJuIEcuZXhpdGNvZGU7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvdGVlLmMgYi9jb3JldXRpbHMvdGVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjYzA1MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy90ZWUuYwpAQCAtMCwwICsxLDExOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdGVlIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvdGVlLmh0bWwgKi8KKworLy91c2FnZTojZGVmaW5lIHRlZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1haV0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHRlZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvcHkgc3RkaW4gdG8gZWFjaCBGSUxFLCBhbmQgYWxzbyB0byBzdGRvdXRcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJQXBwZW5kIHRvIHRoZSBnaXZlbiBGSUxFcywgZG9uJ3Qgb3ZlcndyaXRlIgorLy91c2FnZTogICAgICJcbgktaQlJZ25vcmUgaW50ZXJydXB0IHNpZ25hbHMgKFNJR0lOVCkiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHRlZV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBlY2hvIFwiSGVsbG9cIiB8IHRlZSAvdG1wL2Zvb1xuIgorLy91c2FnZTogICAgICAgIiQgY2F0IC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiSGVsbG9cbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCB0ZWVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHRlZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICptb2RlID0gIndcMGEiOworCUZJTEUgKipmaWxlczsKKwlGSUxFICoqZnA7CisJY2hhciAqKm5hbWVzOworCWNoYXIgKipucDsKKwljaGFyIHJldHZhbDsKKy8vVE9ETzogbWFrZSB1bmNvbmRpdGlvbmFsCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVFX1VTRV9CTE9DS19JTworCXNzaXplX3QgYzsKKyMgZGVmaW5lIGJ1ZiBiYl9jb21tb25fYnVmc2l6MQorI2Vsc2UKKwlpbnQgYzsKKyNlbmRpZgorCXJldHZhbCA9IGdldG9wdDMyKGFyZ3YsICJpYSIpOwkvKiAnYScgbXVzdCBiZSAybmQgKi8KKwlhcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworCW1vZGUgKz0gKHJldHZhbCAmIDIpOwkvKiBTaW5jZSAnYScgaXMgdGhlIDJuZCBvcHRpb24uLi4gKi8KKworCWlmIChyZXR2YWwgJiAxKSB7CisJCXNpZ25hbChTSUdJTlQsIFNJR19JR04pOyAvKiBUT0RPIC0gc3dpdGNoIHRvIHNpZ2FjdGlvbi4gKHdoeT8pICovCisJfQorCXJldHZhbCA9IEVYSVRfU1VDQ0VTUzsKKwkvKiBnbnUgdGVlIGlnbm9yZXMgU0lHUElQRSBpbiBjYXNlIG9uZSBvZiB0aGUgb3V0cHV0IGZpbGVzIGlzIGEgcGlwZQorCSAqIHRoYXQgZG9lc24ndCBjb25zdW1lIGFsbCBpdHMgaW5wdXQuICBHb29kIGlkZWEuLi4gKi8KKwlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisKKwkvKiBBbGxvY2F0ZSBhbiBhcnJheSBvZiBGSUxFIConcywgd2l0aCBvbmUgZXh0cmEgZm9yIGEgc2VudGluZWwuICovCisJZnAgPSBmaWxlcyA9IHh6YWxsb2Moc2l6ZW9mKEZJTEUgKikgKiAoYXJnYyArIDIpKTsKKwlucCA9IG5hbWVzID0gYXJndiAtIDE7CisKKwlmaWxlc1swXSA9IHN0ZG91dDsKKwlnb3RvIEdPVF9ORVdfRklMRTsKKwlkbyB7CisJCSpmcCA9IHN0ZG91dDsKKwkJaWYgKE5PVF9MT05FX0RBU0goKmFyZ3YpKSB7CisJCQkqZnAgPSBmb3Blbl9vcl93YXJuKCphcmd2LCBtb2RlKTsKKwkJCWlmICgqZnAgPT0gTlVMTCkgeworCQkJCXJldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwkJCQlhcmd2Kys7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJKm5wID0gKmFyZ3YrKzsKKyBHT1RfTkVXX0ZJTEU6CisJCXNldGJ1ZigqZnAsIE5VTEwpOwkvKiB0ZWUgbXVzdCBub3QgYnVmZmVyIG91dHB1dC4gKi8KKwkJZnArKzsKKwkJbnArKzsKKwl9IHdoaWxlICgqYXJndik7CisJLyogbmFtZXNbMF0gd2lsbCBiZSBmaWxsZWQgbGF0ZXIgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX1RFRV9VU0VfQkxPQ0tfSU8KKwl3aGlsZSAoKGMgPSBzYWZlX3JlYWQoU1RESU5fRklMRU5PLCBidWYsIHNpemVvZihidWYpKSkgPiAwKSB7CisJCWZwID0gZmlsZXM7CisJCWRvCisJCQlmd3JpdGUoYnVmLCAxLCBjLCAqZnApOworCQl3aGlsZSAoKisrZnApOworCX0KKwlpZiAoYyA8IDApIHsJCS8qIE1ha2Ugc3VyZSByZWFkIGVycm9ycyBhcmUgc2lnbmFsZWQuICovCisJCXJldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwl9CisjZWxzZQorCXNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9OQkYsIDApOworCXdoaWxlICgoYyA9IGdldGNoYXIoKSkgIT0gRU9GKSB7CisJCWZwID0gZmlsZXM7CisJCWRvCisJCQlwdXRjKGMsICpmcCk7CisJCXdoaWxlICgqKytmcCk7CisJfQorI2VuZGlmCisKKwkvKiBOb3cgd2UgbmVlZCB0byBjaGVjayBmb3IgaS9vIGVycm9ycyBvbiBzdGRpbiBhbmQgdGhlIHZhcmlvdXMKKwkgKiBvdXRwdXQgZmlsZXMuICBTaW5jZSB3ZSBrbm93IHRoYXQgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBvdXRwdXQKKwkgKiBmaWxlIHRhYmxlIGlzIHN0ZG91dCwgd2UgY2FuIHNhdmUgb25lICJpZiBmZXJyb3IiIHRlc3QgYnkKKwkgKiBzZXR0aW5nIHRoZSBmaXJzdCBlbnRyeSB0byBzdGRpbiBhbmQgY2hlY2tpbmcgc3Rkb3V0IGVycm9yCisJICogc3RhdHVzIHdpdGggZmZsdXNoX3N0ZG91dF9hbmRfZXhpdCgpLi4uIGFsdGhvdWdoIGZmbHVzaCgpaW5nCisJICogaXMgdW5uZWNlc3NhcnkgaGVyZS4gKi8KKwlucCA9IG5hbWVzOworCWZwID0gZmlsZXM7CisJbmFtZXNbMF0gPSAoY2hhciAqKSBiYl9tc2dfc3RhbmRhcmRfaW5wdXQ7CisJZmlsZXNbMF0gPSBzdGRpbjsKKwlkbyB7CS8qIE5vdyBjaGVjayBmb3IgaW5wdXQgYW5kIG91dHB1dCBlcnJvcnMuICovCisJCS8qIENoZWNraW5nIGZlcnJvciBzaG91bGQgYmUgc3VmZmljaWVudCwgYnV0IHdlIG1heSB3YW50IHRvIGZjbG9zZS4KKwkJICogSWYgd2UgZG8sIHJlbWVtYmVyIG5vdCB0byBjbG9zZSBzdGRpbiEgKi8KKwkJZGllX2lmX2ZlcnJvcigqZnArKywgKm5wKyspOworCX0gd2hpbGUgKCpmcCk7CisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KHJldHZhbCk7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvdGVzdC5jIGIvY29yZXV0aWxzL3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjhiMTBjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL3Rlc3QuYwpAQCAtMCwwICsxLDkxMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdGVzdCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoYykgYnkgYSB3aG9sZSBwaWxlIG9mIGZvbGtzOgorICoKKyAqICAgICB0ZXN0KDEpOyB2ZXJzaW9uIDctbGlrZSAgLS0gIGF1dGhvciBFcmlrIEJhYWxiZXJnZW4KKyAqICAgICBtb2RpZmllZCBieSBFcmljIEdpc2luIHRvIGJlIHVzZWQgYXMgYnVpbHQtaW4uCisgKiAgICAgbW9kaWZpZWQgYnkgQXJub2xkIFJvYmJpbnMgdG8gYWRkIFNWUjMgY29tcGF0aWJpbGl0eQorICogICAgICgteCAtYyAtYiAtcCAtdSAtZyAtaykgcGx1cyBLb3JuJ3MgLUwgLW50IC1vdCAtZWYgYW5kIG5ldyAtUyAoc29ja2V0KS4KKyAqICAgICBtb2RpZmllZCBieSBKLlQuIENvbmtsaW4gZm9yIE5ldEJTRC4KKyAqICAgICBtb2RpZmllZCBieSBIZXJiZXJ0IFh1IHRvIGJlIHVzZWQgYXMgYnVpbHQtaW4gaW4gYXNoLgorICogICAgIG1vZGlmaWVkIGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4gdG8gYmUgdXNlZAorICogICAgIGluIGJ1c3lib3guCisgKiAgICAgbW9kaWZpZWQgYnkgQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyIHRvIGJlIHVzZWFibGUgKGkuZS4gYSBiaXQgbGVzcyBibG9hdHkpLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogT3JpZ2luYWwgY29weXJpZ2h0IG5vdGljZSBzdGF0ZXM6CisgKiAgICAgIlRoaXMgcHJvZ3JhbSBpcyBpbiB0aGUgUHVibGljIERvbWFpbi4iCisgKi8KKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1RFU1QpICAgICAgKz0gdGVzdC5vIHRlc3RfcHRyX2hhY2subworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0FTSCkgICAgICAgKz0gdGVzdC5vIHRlc3RfcHRyX2hhY2subworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0hVU0gpICAgICAgKz0gdGVzdC5vIHRlc3RfcHRyX2hhY2subworCisvL2NvbmZpZzpjb25maWcgVEVTVAorLy9jb25maWc6CWJvb2wgInRlc3QiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgdGVzdCBpcyB1c2VkIHRvIGNoZWNrIGZpbGUgdHlwZXMgYW5kIGNvbXBhcmUgdmFsdWVzLAorLy9jb25maWc6CSAgcmV0dXJuaW5nIGFuIGFwcHJvcHJpYXRlIGV4aXQgY29kZS4gVGhlIGJhc2ggc2hlbGwKKy8vY29uZmlnOgkgIGhhcyB0ZXN0IGJ1aWx0IGluLCBhc2ggY2FuIGJ1aWxkIGl0IGluIG9wdGlvbmFsbHkuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1RFU1RfNjQKKy8vY29uZmlnOglib29sICJFeHRlbmQgdGVzdCB0byA2NCBiaXQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBURVNUIHx8IEFTSF9CVUlMVElOX1RFU1QgfHwgSFVTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSA2NC1iaXQgc3VwcG9ydCBpbiB0ZXN0LgorCisvKiAidGVzdCAtLWhlbHAiIGlzIHNwZWNpYWwtY2FzZWQgdG8gaWdub3JlIC0taGVscCAqLworLy91c2FnZTojZGVmaW5lIHRlc3RfdHJpdmlhbF91c2FnZSBOT1VTQUdFX1NUUgorLy91c2FnZTojZGVmaW5lIHRlc3RfZnVsbF91c2FnZSAiIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB0ZXN0X2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHRlc3QgMSAtZXEgMlxuIgorLy91c2FnZTogICAgICAgIiQgZWNobyAkP1xuIgorLy91c2FnZTogICAgICAgIjFcbiIKKy8vdXNhZ2U6ICAgICAgICIkIHRlc3QgMSAtZXEgMVxuIgorLy91c2FnZTogICAgICAgIiQgZWNobyAkP1xuIgorLy91c2FnZTogICAgICAgIjBcbiIKKy8vdXNhZ2U6ICAgICAgICIkIFsgLWQgL2V0YyBdXG4iCisvL3VzYWdlOiAgICAgICAiJCBlY2hvICQ/XG4iCisvL3VzYWdlOiAgICAgICAiMFxuIgorLy91c2FnZTogICAgICAgIiQgWyAtZCAvanVuayBdXG4iCisvL3VzYWdlOiAgICAgICAiJCBlY2hvICQ/XG4iCisvL3VzYWdlOiAgICAgICAiMVxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworLyogdGVzdF9tYWluKCkgaXMgY2FsbGVkIGZyb20gc2hlbGxzLCBhbmQgd2UgbmVlZCB0byBiZSBleHRyYSBjYXJlZnVsIGhlcmUuCisgKiBUaGlzIGlzIHRydWUgcmVnYXJkbGVzcyBvZiBQUkVGRVJfQVBQTEVUUyBhbmQgU0hfU1RBTkRBTE9ORQorICogc3RhdGUuICovCisKKy8qIHRlc3QoMSkgYWNjZXB0cyB0aGUgZm9sbG93aW5nIGdyYW1tYXI6CisJb2V4cHIgICA6Oj0gYWV4cHIgfCBhZXhwciAiLW8iIG9leHByIDsKKwlhZXhwciAgIDo6PSBuZXhwciB8IG5leHByICItYSIgYWV4cHIgOworCW5leHByICAgOjo9IHByaW1hcnkgfCAiISIgcHJpbWFyeQorCXByaW1hcnkgOjo9IHVuYXJ5LW9wZXJhdG9yIG9wZXJhbmQKKwkJfCBvcGVyYW5kIGJpbmFyeS1vcGVyYXRvciBvcGVyYW5kCisJCXwgb3BlcmFuZAorCQl8ICIoIiBvZXhwciAiKSIKKwkJOworCXVuYXJ5LW9wZXJhdG9yIDo6PSAiLXIifCItdyJ8Ii14InwiLWYifCItZCJ8Ii1jInwiLWIifCItcCJ8CisJCSItdSJ8Ii1nInwiLWsifCItcyJ8Ii10InwiLXoifCItbiJ8Ii1vInwiLU8ifCItRyJ8Ii1MInwiLVMiOworCisJYmluYXJ5LW9wZXJhdG9yIDo6PSAiPSJ8Ij09InwiIT0ifCItZXEifCItbmUifCItZ2UifCItZ3QifCItbGUifCItbHQifAorCQkJIi1udCJ8Ii1vdCJ8Ii1lZiI7CisJb3BlcmFuZCA6Oj0gPGFueSBsZWdhbCBVTklYIGZpbGUgbmFtZT4KKyovCisKKy8qIFRPRE86IGhhbmRsZSBbWyBleHByIF1dIGJhc2hpc20gYmFzaC1jb21wYXRpYmx5LgorICogW1sgXV0gaXMgbWVhbnQgdG8gYmUgYSAiYmV0dGVyIFsgXSIsIHdpdGggbGVzcyB3ZWlyZCBzeW50YXgKKyAqIGFuZCB3aXRob3V0IHRoZSByaXNrIG9mIHZhcmlhYmxlcyBhbmQgcXVvdGVkIHN0cmluZ3MgbWlzaW50ZXJwcmV0ZWQKKyAqIGFzIG9wZXJhdG9ycy4KKyAqIFRoaXMgd2lsbCByZXF1aXJlIHN1cHBvcnQgZnJvbSBzaGVsbHMgLSB3ZSBuZWVkIHRvIGtub3cgcXVvdGUgc3RhdHVzCisgKiBvZiBlYWNoIHBhcmFtZXRlciAoc2VlIGJlbG93KS4KKyAqCisgKiBXb3JkIHNwbGl0dGluZyBhbmQgcGF0aG5hbWUgZXhwYW5zaW9uIHNob3VsZCBOT1QgYmUgcGVyZm9ybWVkOgorICogICAgICAjIGE9ImEgYiI7IFtbICRhID0gImEgYiIgXV0gJiYgZWNobyBZRVMKKyAqICAgICAgWUVTCisgKiAgICAgICMgW1sgL2Jpbi9tKiBdXSAmJiBlY2hvIFlFUworICogICAgICBZRVMKKyAqCisgKiA9fiBzaG91bGQgZG8gcmVnZXhwIG1hdGNoCisgKiA9IGFuZCA9PSBzaG91bGQgZG8gcGF0dGVybiBtYXRjaCBhZ2FpbnN0IHJpZ2h0IHNpZGU6CisgKiAgICAgICMgW1sgKmEqID09IGJhYiBdXSAmJiBlY2hvIFlFUworICogICAgICAjIFtbIGJhYiA9PSAqYSogXV0gJiYgZWNobyBZRVMKKyAqICAgICAgWUVTCisgKiAhPSBkb2VzIHRoZSBuZWdhdGVkID09IChpLmUuLCBhbHNvIHdpdGggcGF0dGVybiBtYXRjaGluZykuCisgKiBQYXR0ZXJuIG1hdGNoaW5nIGlzIHF1b3RhdGlvbi1zZW5zaXRpdmU6CisgKiAgICAgICMgW1sgYmFiID09ICJiImEqIF1dICYmIGVjaG8gWUVTCisgKiAgICAgIFlFUworICogICAgICAjIFtbIGJhYiA9PSBiImEqIiBdXSAmJiBlY2hvIFlFUworICoKKyAqIENvbmRpdGlvbmFsIG9wZXJhdG9ycyBzdWNoIGFzIC1mIG11c3QgYmUgdW5xdW90ZWQgbGl0ZXJhbHMgdG8gYmUgcmVjb2duaXplZDoKKyAqICAgICAgIyBbWyAtZSAvYmluIF1dICYmIGVjaG8gWUVTCisgKiAgICAgIFlFUworICogICAgICAjIFtbICctZScgL2JpbiBdXSAmJiBlY2hvIFlFUworICogICAgICBiYXNoOiBjb25kaXRpb25hbCBiaW5hcnkgb3BlcmF0b3IgZXhwZWN0ZWQuLi4KKyAqICAgICAgIyBBPSctZSc7IFtbICRBIC9iaW4gXV0gJiYgZWNobyBZRVMKKyAqICAgICAgYmFzaDogY29uZGl0aW9uYWwgYmluYXJ5IG9wZXJhdG9yIGV4cGVjdGVkLi4uCisgKgorICogfHwgYW5kICYmIHNob3VsZCB3b3JrIGFzIC1vIGFuZCAtYSB3b3JrIGluIFsgXQorICogLWEgYW5kIC1vIGFyZW4ndCByZWNvZ25pemVkICgmJiBhbmQgfHwgYXJlIHRvIGJlIHVzZWQgaW5zdGVhZCkKKyAqICggYW5kICkgZG8gbm90IG5lZWQgdG8gYmUgcXVvdGVkIHVubGlrZSBpbiBbIF06CisgKiAgICAgICMgW1sgKCBhYmMgKSAmJiAnJyBdXSAmJiBlY2hvIFlFUworICogICAgICAjIFtbICggYWJjICkgfHwgJycgXV0gJiYgZWNobyBZRVMKKyAqICAgICAgWUVTCisgKiAgICAgICMgW1sgKCBhYmMgKSAtbyAnJyBdXSAmJiBlY2hvIFlFUworICogICAgICBiYXNoOiBzeW50YXggZXJyb3IgaW4gY29uZGl0aW9uYWwgZXhwcmVzc2lvbi4uLgorICoKKyAqIEFwYXJ0IGZyb20gdGhlIGFib3ZlLCBbWyBleHByIF1dIHNob3VsZCB3b3JrIGFzIFsgZXhwciBdCisgKi8KKworI2RlZmluZSBURVNUX0RFQlVHIDAKKworZW51bSB0b2tlbiB7CisJRU9JLAorCisJRklMUkQsIC8qIGZpbGUgYWNjZXNzICovCisJRklMV1IsCisJRklMRVgsCisKKwlGSUxFWElTVCwKKworCUZJTFJFRywgLyogZmlsZSB0eXBlICovCisJRklMRElSLAorCUZJTENERVYsCisJRklMQkRFViwKKwlGSUxGSUZPLAorCUZJTFNPQ0ssCisKKwlGSUxTWU0sCisJRklMR1osCisJRklMVFQsCisKKwlGSUxTVUlELCAvKiBmaWxlIGJpdCAqLworCUZJTFNHSUQsCisJRklMU1RDSywKKworCUZJTE5ULCAvKiBmaWxlIG9wcyAqLworCUZJTE9ULAorCUZJTEVRLAorCisJRklMVUlELAorCUZJTEdJRCwKKworCVNUUkVaLCAvKiBzdHIgb3BzICovCisJU1RSTlosCisJU1RSRVEsCisJU1RSTkUsCisJU1RSTFQsCisJU1RSR1QsCisKKwlJTlRFUSwgLyogaW50IG9wcyAqLworCUlOVE5FLAorCUlOVEdFLAorCUlOVEdULAorCUlOVExFLAorCUlOVExULAorCisJVU5PVCwKKwlCQU5ELAorCUJPUiwKKwlMUEFSRU4sCisJUlBBUkVOLAorCU9QRVJBTkQKK307CisjZGVmaW5lIGlzX2ludF9vcChhKSAgICAgICgoKHVuc2lnbmVkIGNoYXIpKChhKSAtIElOVEVRKSkgPD0gNSkKKyNkZWZpbmUgaXNfc3RyX29wKGEpICAgICAgKCgodW5zaWduZWQgY2hhcikoKGEpIC0gU1RSRVopKSA8PSA1KQorI2RlZmluZSBpc19maWxlX29wKGEpICAgICAoKCh1bnNpZ25lZCBjaGFyKSgoYSkgLSBGSUxOVCkpIDw9IDIpCisjZGVmaW5lIGlzX2ZpbGVfYWNjZXNzKGEpICgoKHVuc2lnbmVkIGNoYXIpKChhKSAtIEZJTFJEKSkgPD0gMikKKyNkZWZpbmUgaXNfZmlsZV90eXBlKGEpICAgKCgodW5zaWduZWQgY2hhcikoKGEpIC0gRklMUkVHKSkgPD0gNSkKKyNkZWZpbmUgaXNfZmlsZV9iaXQoYSkgICAgKCgodW5zaWduZWQgY2hhcikoKGEpIC0gRklMU1VJRCkpIDw9IDIpCisKKyNpZiBURVNUX0RFQlVHCitpbnQgZGVwdGg7CisjZGVmaW5lIG5lc3RfbXNnKC4uLikgZG8geyBcCisJZGVwdGgrKzsgXAorCWZwcmludGYoc3RkZXJyLCAiJSpzIiwgZGVwdGgqMiwgIiIpOyBcCisJZnByaW50ZihzdGRlcnIsIF9fVkFfQVJHU19fKTsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgdW5uZXN0X21zZyguLi4pIGRvIHsgXAorCWZwcmludGYoc3RkZXJyLCAiJSpzIiwgZGVwdGgqMiwgIiIpOyBcCisJZnByaW50ZihzdGRlcnIsIF9fVkFfQVJHU19fKTsgXAorCWRlcHRoLS07IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIGRiZ19tc2coLi4uKSBkbyB7IFwKKwlmcHJpbnRmKHN0ZGVyciwgIiUqcyIsIGRlcHRoKjIsICIiKTsgXAorCWZwcmludGYoc3RkZXJyLCBfX1ZBX0FSR1NfXyk7IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIHVubmVzdF9tc2dfYW5kX3JldHVybihleHByLCAuLi4pIGRvIHsgXAorCW51bWJlcl90IF9fcmVzID0gKGV4cHIpOyBcCisJZnByaW50ZihzdGRlcnIsICIlKnMiLCBkZXB0aCoyLCAiIik7IFwKKwlmcHJpbnRmKHN0ZGVyciwgX19WQV9BUkdTX18sIHJlcyk7IFwKKwlkZXB0aC0tOyBcCisJcmV0dXJuIF9fcmVzOyBcCit9IHdoaWxlICgwKQorc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IFRPS1NUUltdID0geworCSJFT0kiLAorCSJGSUxSRCIsCisJIkZJTFdSIiwKKwkiRklMRVgiLAorCSJGSUxFWElTVCIsCisJIkZJTFJFRyIsCisJIkZJTERJUiIsCisJIkZJTENERVYiLAorCSJGSUxCREVWIiwKKwkiRklMRklGTyIsCisJIkZJTFNPQ0siLAorCSJGSUxTWU0iLAorCSJGSUxHWiIsCisJIkZJTFRUIiwKKwkiRklMU1VJRCIsCisJIkZJTFNHSUQiLAorCSJGSUxTVENLIiwKKwkiRklMTlQiLAorCSJGSUxPVCIsCisJIkZJTEVRIiwKKwkiRklMVUlEIiwKKwkiRklMR0lEIiwKKwkiU1RSRVoiLAorCSJTVFJOWiIsCisJIlNUUkVRIiwKKwkiU1RSTkUiLAorCSJTVFJMVCIsCisJIlNUUkdUIiwKKwkiSU5URVEiLAorCSJJTlRORSIsCisJIklOVEdFIiwKKwkiSU5UR1QiLAorCSJJTlRMRSIsCisJIklOVExUIiwKKwkiVU5PVCIsCisJIkJBTkQiLAorCSJCT1IiLAorCSJMUEFSRU4iLAorCSJSUEFSRU4iLAorCSJPUEVSQU5EIgorfTsKKyNlbHNlCisjZGVmaW5lIG5lc3RfbXNnKC4uLikgICAoKHZvaWQpMCkKKyNkZWZpbmUgdW5uZXN0X21zZyguLi4pICgodm9pZCkwKQorI2RlZmluZSBkYmdfbXNnKC4uLikgICAgKCh2b2lkKTApCisjZGVmaW5lIHVubmVzdF9tc2dfYW5kX3JldHVybihleHByLCAuLi4pIHJldHVybiBleHByCisjZW5kaWYKKworZW51bSB7CisJVU5PUCwKKwlCSU5PUCwKKwlCVU5PUCwKKwlCQklOT1AsCisJUEFSRU4KK307CisKK3N0cnVjdCBvcGVyYXRvcl90IHsKKwl1bnNpZ25lZCBjaGFyIG9wX251bSwgb3BfdHlwZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3BlcmF0b3JfdCBvcHNfdGFibGVbXSA9IHsKKwl7IC8qICItciIgKi8gRklMUkQgICAsIFVOT1AgICB9LAorCXsgLyogIi13IiAqLyBGSUxXUiAgICwgVU5PUCAgIH0sCisJeyAvKiAiLXgiICovIEZJTEVYICAgLCBVTk9QICAgfSwKKwl7IC8qICItZSIgKi8gRklMRVhJU1QsIFVOT1AgICB9LAorCXsgLyogIi1mIiAqLyBGSUxSRUcgICwgVU5PUCAgIH0sCisJeyAvKiAiLWQiICovIEZJTERJUiAgLCBVTk9QICAgfSwKKwl7IC8qICItYyIgKi8gRklMQ0RFViAsIFVOT1AgICB9LAorCXsgLyogIi1iIiAqLyBGSUxCREVWICwgVU5PUCAgIH0sCisJeyAvKiAiLXAiICovIEZJTEZJRk8gLCBVTk9QICAgfSwKKwl7IC8qICItdSIgKi8gRklMU1VJRCAsIFVOT1AgICB9LAorCXsgLyogIi1nIiAqLyBGSUxTR0lEICwgVU5PUCAgIH0sCisJeyAvKiAiLWsiICovIEZJTFNUQ0sgLCBVTk9QICAgfSwKKwl7IC8qICItcyIgKi8gRklMR1ogICAsIFVOT1AgICB9LAorCXsgLyogIi10IiAqLyBGSUxUVCAgICwgVU5PUCAgIH0sCisJeyAvKiAiLXoiICovIFNUUkVaICAgLCBVTk9QICAgfSwKKwl7IC8qICItbiIgKi8gU1RSTlogICAsIFVOT1AgICB9LAorCXsgLyogIi1oIiAqLyBGSUxTWU0gICwgVU5PUCAgIH0sICAgIC8qIGZvciBiYWNrd2FyZHMgY29tcGF0ICovCisKKwl7IC8qICItTyIgKi8gRklMVUlEICAsIFVOT1AgICB9LAorCXsgLyogIi1HIiAqLyBGSUxHSUQgICwgVU5PUCAgIH0sCisJeyAvKiAiLUwiICovIEZJTFNZTSAgLCBVTk9QICAgfSwKKwl7IC8qICItUyIgKi8gRklMU09DSyAsIFVOT1AgICB9LAorCXsgLyogIj0iICAqLyBTVFJFUSAgICwgQklOT1AgIH0sCisJeyAvKiAiPT0iICovIFNUUkVRICAgLCBCSU5PUCAgfSwKKwl7IC8qICIhPSIgKi8gU1RSTkUgICAsIEJJTk9QICB9LAorCXsgLyogIjwiICAqLyBTVFJMVCAgICwgQklOT1AgIH0sCisJeyAvKiAiPiIgICovIFNUUkdUICAgLCBCSU5PUCAgfSwKKwl7IC8qICItZXEiKi8gSU5URVEgICAsIEJJTk9QICB9LAorCXsgLyogIi1uZSIqLyBJTlRORSAgICwgQklOT1AgIH0sCisJeyAvKiAiLWdlIiovIElOVEdFICAgLCBCSU5PUCAgfSwKKwl7IC8qICItZ3QiKi8gSU5UR1QgICAsIEJJTk9QICB9LAorCXsgLyogIi1sZSIqLyBJTlRMRSAgICwgQklOT1AgIH0sCisJeyAvKiAiLWx0IiovIElOVExUICAgLCBCSU5PUCAgfSwKKwl7IC8qICItbnQiKi8gRklMTlQgICAsIEJJTk9QICB9LAorCXsgLyogIi1vdCIqLyBGSUxPVCAgICwgQklOT1AgIH0sCisJeyAvKiAiLWVmIiovIEZJTEVRICAgLCBCSU5PUCAgfSwKKwl7IC8qICIhIiAgKi8gVU5PVCAgICAsIEJVTk9QICB9LAorCXsgLyogIi1hIiAqLyBCQU5EICAgICwgQkJJTk9QIH0sCisJeyAvKiAiLW8iICovIEJPUiAgICAgLCBCQklOT1AgfSwKKwl7IC8qICIoIiAgKi8gTFBBUkVOICAsIFBBUkVOICB9LAorCXsgLyogIikiICAqLyBSUEFSRU4gICwgUEFSRU4gIH0sCit9OworLyogUGxlYXNlIGtlZXAgdGhlc2UgdHdvIHRhYmxlcyBpbiBzeW5jICovCitzdGF0aWMgY29uc3QgY2hhciBvcHNfdGV4dHNbXSBBTElHTjEgPQorCSItciIgICJcMCIKKwkiLXciICAiXDAiCisJIi14IiAgIlwwIgorCSItZSIgICJcMCIKKwkiLWYiICAiXDAiCisJIi1kIiAgIlwwIgorCSItYyIgICJcMCIKKwkiLWIiICAiXDAiCisJIi1wIiAgIlwwIgorCSItdSIgICJcMCIKKwkiLWciICAiXDAiCisJIi1rIiAgIlwwIgorCSItcyIgICJcMCIKKwkiLXQiICAiXDAiCisJIi16IiAgIlwwIgorCSItbiIgICJcMCIKKwkiLWgiICAiXDAiCisKKwkiLU8iICAiXDAiCisJIi1HIiAgIlwwIgorCSItTCIgICJcMCIKKwkiLVMiICAiXDAiCisJIj0iICAgIlwwIgorCSI9PSIgICJcMCIKKwkiIT0iICAiXDAiCisJIjwiICAgIlwwIgorCSI+IiAgICJcMCIKKwkiLWVxIiAiXDAiCisJIi1uZSIgIlwwIgorCSItZ2UiICJcMCIKKwkiLWd0IiAiXDAiCisJIi1sZSIgIlwwIgorCSItbHQiICJcMCIKKwkiLW50IiAiXDAiCisJIi1vdCIgIlwwIgorCSItZWYiICJcMCIKKwkiISIgICAiXDAiCisJIi1hIiAgIlwwIgorCSItbyIgICJcMCIKKwkiKCIgICAiXDAiCisJIikiICAgIlwwIgorOworCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9URVNUXzY0Cit0eXBlZGVmIGludDY0X3QgbnVtYmVyX3Q7CisjZWxzZQordHlwZWRlZiBpbnQgbnVtYmVyX3Q7CisjZW5kaWYKKworCisvKiBXZSB0cnkgdG8gbWluaW1pemUgYm90aCBzdGF0aWMgYW5kIHN0YWNrIHVzYWdlLiAqLworc3RydWN0IHRlc3Rfc3RhdGljcyB7CisJY2hhciAqKmFyZ3M7CisJLyogc2V0IG9ubHkgYnkgY2hlY2tfb3BlcmF0b3IoKSwgZWl0aGVyIHRvIGJvZ3VzIHN0cnVjdAorCSAqIG9yIHBvaW50cyB0byBtYXRjaGluZyBvcGVyYXRvcl90IHN0cnVjdC4gTmV2ZXIgTlVMTC4gKi8KKwljb25zdCBzdHJ1Y3Qgb3BlcmF0b3JfdCAqbGFzdF9vcGVyYXRvcjsKKwlnaWRfdCAqZ3JvdXBfYXJyYXk7CisJaW50IG5ncm91cHM7CisJam1wX2J1ZiBsZWF2aW5nOworfTsKKworLyogU2VlIHRlc3RfcHRyX2hhY2suYyAqLworZXh0ZXJuIHN0cnVjdCB0ZXN0X3N0YXRpY3MgKmNvbnN0IHRlc3RfcHRyX3RvX3N0YXRpY3M7CisKKyNkZWZpbmUgUyAoKnRlc3RfcHRyX3RvX3N0YXRpY3MpCisjZGVmaW5lIGFyZ3MgICAgICAgICAgICAoUy5hcmdzICAgICAgICAgKQorI2RlZmluZSBsYXN0X29wZXJhdG9yICAgKFMubGFzdF9vcGVyYXRvcikKKyNkZWZpbmUgZ3JvdXBfYXJyYXkgICAgIChTLmdyb3VwX2FycmF5ICApCisjZGVmaW5lIG5ncm91cHMgICAgICAgICAoUy5uZ3JvdXBzICAgICAgKQorI2RlZmluZSBsZWF2aW5nICAgICAgICAgKFMubGVhdmluZyAgICAgICkKKworI2RlZmluZSBJTklUX1MoKSBkbyB7IFwKKwkoKihzdHJ1Y3QgdGVzdF9zdGF0aWNzKiopJnRlc3RfcHRyX3RvX3N0YXRpY3MpID0geHphbGxvYyhzaXplb2YoUykpOyBcCisJYmFycmllcigpOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBERUlOSVRfUygpIGRvIHsgXAorCWZyZWUodGVzdF9wdHJfdG9fc3RhdGljcyk7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBudW1iZXJfdCBwcmltYXJ5KGVudW0gdG9rZW4gbik7CisKK3N0YXRpYyB2b2lkIHN5bnRheChjb25zdCBjaGFyICpvcCwgY29uc3QgY2hhciAqbXNnKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIHN5bnRheChjb25zdCBjaGFyICpvcCwgY29uc3QgY2hhciAqbXNnKQoreworCWlmIChvcCAmJiAqb3ApIHsKKwkJYmJfZXJyb3JfbXNnKCIlczogJXMiLCBvcCwgbXNnKTsKKwl9IGVsc2UgeworCQliYl9lcnJvcl9tc2coIiVzOiAlcyIrNCwgbXNnKTsKKwl9CisJbG9uZ2ptcChsZWF2aW5nLCAyKTsKK30KKworLyogYXRvaSB3aXRoIGVycm9yIGRldGVjdGlvbiAqLworLy9YWFg6IEZJWE1FOiBkdXBsaWNhdGUgb2YgZXhpc3RpbmcgbGliYmIgZnVuY3Rpb24/CitzdGF0aWMgbnVtYmVyX3QgZ2V0bihjb25zdCBjaGFyICpzKQoreworCWNoYXIgKnA7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVTVF82NAorCWxvbmcgbG9uZyByOworI2Vsc2UKKwlsb25nIHI7CisjZW5kaWYKKworCWVycm5vID0gMDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9URVNUXzY0CisJciA9IHN0cnRvbGwocywgJnAsIDEwKTsKKyNlbHNlCisJciA9IHN0cnRvbChzLCAmcCwgMTApOworI2VuZGlmCisKKwlpZiAoZXJybm8gIT0gMCkKKwkJc3ludGF4KHMsICJvdXQgb2YgcmFuZ2UiKTsKKworCWlmIChwID09IHMgfHwgKihza2lwX3doaXRlc3BhY2UocCkpICE9ICdcMCcpCisJCXN5bnRheChzLCAiYmFkIG51bWJlciIpOworCisJcmV0dXJuIHI7Cit9CisKKy8qIFVOVVNFRAorc3RhdGljIGludCBuZXdlcmYoY29uc3QgY2hhciAqZjEsIGNvbnN0IGNoYXIgKmYyKQoreworCXN0cnVjdCBzdGF0IGIxLCBiMjsKKworCXJldHVybiAoc3RhdChmMSwgJmIxKSA9PSAwICYmCisJCQlzdGF0KGYyLCAmYjIpID09IDAgJiYgYjEuc3RfbXRpbWUgPiBiMi5zdF9tdGltZSk7Cit9CisKK3N0YXRpYyBpbnQgb2xkZXJmKGNvbnN0IGNoYXIgKmYxLCBjb25zdCBjaGFyICpmMikKK3sKKwlzdHJ1Y3Qgc3RhdCBiMSwgYjI7CisKKwlyZXR1cm4gKHN0YXQoZjEsICZiMSkgPT0gMCAmJgorCQkJc3RhdChmMiwgJmIyKSA9PSAwICYmIGIxLnN0X210aW1lIDwgYjIuc3RfbXRpbWUpOworfQorCitzdGF0aWMgaW50IGVxdWFsZihjb25zdCBjaGFyICpmMSwgY29uc3QgY2hhciAqZjIpCit7CisJc3RydWN0IHN0YXQgYjEsIGIyOworCisJcmV0dXJuIChzdGF0KGYxLCAmYjEpID09IDAgJiYKKwkJCXN0YXQoZjIsICZiMikgPT0gMCAmJgorCQkJYjEuc3RfZGV2ID09IGIyLnN0X2RldiAmJiBiMS5zdF9pbm8gPT0gYjIuc3RfaW5vKTsKK30KKyovCisKKworc3RhdGljIGVudW0gdG9rZW4gY2hlY2tfb3BlcmF0b3IoY29uc3QgY2hhciAqcykKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IG9wZXJhdG9yX3Qgbm9fb3AgPSB7CisJCS5vcF9udW0gPSAtMSwKKwkJLm9wX3R5cGUgPSAtMQorCX07CisJaW50IG47CisKKwlsYXN0X29wZXJhdG9yID0gJm5vX29wOworCWlmIChzID09IE5VTEwpCisJCXJldHVybiBFT0k7CisJbiA9IGluZGV4X2luX3N0cmluZ3Mob3BzX3RleHRzLCBzKTsKKwlpZiAobiA8IDApCisJCXJldHVybiBPUEVSQU5EOworCWxhc3Rfb3BlcmF0b3IgPSAmb3BzX3RhYmxlW25dOworCXJldHVybiBvcHNfdGFibGVbbl0ub3BfbnVtOworfQorCisKK3N0YXRpYyBpbnQgYmlub3Aodm9pZCkKK3sKKwljb25zdCBjaGFyICpvcG5kMSwgKm9wbmQyOworCWNvbnN0IHN0cnVjdCBvcGVyYXRvcl90ICpvcDsKKwludW1iZXJfdCB2YWwxLCB2YWwyOworCisJb3BuZDEgPSAqYXJnczsKKwljaGVja19vcGVyYXRvcigqKythcmdzKTsKKwlvcCA9IGxhc3Rfb3BlcmF0b3I7CisKKwlvcG5kMiA9ICorK2FyZ3M7CisJaWYgKG9wbmQyID09IE5VTEwpCisJCXN5bnRheChhcmdzWy0xXSwgImFyZ3VtZW50IGV4cGVjdGVkIik7CisKKwlpZiAoaXNfaW50X29wKG9wLT5vcF9udW0pKSB7CisJCXZhbDEgPSBnZXRuKG9wbmQxKTsKKwkJdmFsMiA9IGdldG4ob3BuZDIpOworCQlpZiAob3AtPm9wX251bSA9PSBJTlRFUSkKKwkJCXJldHVybiB2YWwxID09IHZhbDI7CisJCWlmIChvcC0+b3BfbnVtID09IElOVE5FKQorCQkJcmV0dXJuIHZhbDEgIT0gdmFsMjsKKwkJaWYgKG9wLT5vcF9udW0gPT0gSU5UR0UpCisJCQlyZXR1cm4gdmFsMSA+PSB2YWwyOworCQlpZiAob3AtPm9wX251bSA9PSBJTlRHVCkKKwkJCXJldHVybiB2YWwxID4gIHZhbDI7CisJCWlmIChvcC0+b3BfbnVtID09IElOVExFKQorCQkJcmV0dXJuIHZhbDEgPD0gdmFsMjsKKwkJLyppZiAob3AtPm9wX251bSA9PSBJTlRMVCkqLworCQlyZXR1cm4gdmFsMSA8ICB2YWwyOworCX0KKwlpZiAoaXNfc3RyX29wKG9wLT5vcF9udW0pKSB7CisJCXZhbDEgPSBzdHJjbXAob3BuZDEsIG9wbmQyKTsKKwkJaWYgKG9wLT5vcF9udW0gPT0gU1RSRVEpCisJCQlyZXR1cm4gdmFsMSA9PSAwOworCQlpZiAob3AtPm9wX251bSA9PSBTVFJORSkKKwkJCXJldHVybiB2YWwxICE9IDA7CisJCWlmIChvcC0+b3BfbnVtID09IFNUUkxUKQorCQkJcmV0dXJuIHZhbDEgPCAwOworCQkvKmlmIChvcC0+b3BfbnVtID09IFNUUkdUKSovCisJCXJldHVybiB2YWwxID4gMDsKKwl9CisJLyogV2UgYXJlIHN1cmUgdGhhdCB0aGVzZSB0aHJlZSBhcmUgYnkgbm93IHRoZSBvbmx5IGJpbm9wcyB3ZSBkaWRuJ3QgY2hlY2sKKwkgKiB5ZXQsIHNvIHdlIGRvIG5vdCBjaGVjayBpZiB0aGUgY2xhc3MgaXMgY29ycmVjdDoKKwkgKi8KKy8qCWlmIChpc19maWxlX29wKG9wLT5vcF9udW0pKSAqLworCXsKKwkJc3RydWN0IHN0YXQgYjEsIGIyOworCisJCWlmIChzdGF0KG9wbmQxLCAmYjEpIHx8IHN0YXQob3BuZDIsICZiMikpCisJCQlyZXR1cm4gMDsgLyogZmFsc2UsIHNpbmNlIGF0IGxlYXN0IG9uZSBzdGF0IGZhaWxlZCAqLworCQlpZiAob3AtPm9wX251bSA9PSBGSUxOVCkKKwkJCXJldHVybiBiMS5zdF9tdGltZSA+IGIyLnN0X210aW1lOworCQlpZiAob3AtPm9wX251bSA9PSBGSUxPVCkKKwkJCXJldHVybiBiMS5zdF9tdGltZSA8IGIyLnN0X210aW1lOworCQkvKmlmIChvcC0+b3BfbnVtID09IEZJTEVRKSovCisJCXJldHVybiBiMS5zdF9kZXYgPT0gYjIuc3RfZGV2ICYmIGIxLnN0X2lubyA9PSBiMi5zdF9pbm87CisJfQorCS8qcmV0dXJuIDE7IC0gTk9UUkVBQ0hFRCAqLworfQorCisKK3N0YXRpYyB2b2lkIGluaXRpYWxpemVfZ3JvdXBfYXJyYXkodm9pZCkKK3sKKwlpbnQgbjsKKworCS8qIGdldGdyb3VwcyBtYXkgYmUgZXhwZW5zaXZlLCB0cnkgdG8gdXNlIGl0IG9ubHkgb25jZSAqLworCW5ncm91cHMgPSAzMjsKKwlkbyB7CisJCS8qIEZJWE1FOiBhc2ggdHJpZXMgc28gaGFyZCB0byBub3QgZGllIG9uIE9PTSwKKwkJICogYW5kIHdlIHNwb2lsIGl0IHdpdGgganVzdCBvbmUgeHJlYWxsb2MgaGVyZSAqLworCQkvKiBXZSByZWFsbG9jLCBiZWNhdXNlIHRlc3RfbWFpbiBjYW4gYmUgZW50ZXJlZCByZXBlYXRlZGx5IGJ5IHNoZWxsLgorCQkgKiBUZXN0Y2FzZSAoYXNoKTogJ3doaWxlIHRydWU7IGRvIHRlc3QgLXggc29tZV9maWxlOyBkb25lJworCQkgKiBhbmQgd2F0Y2ggdG9wLiAoc29tZV9maWxlIG11c3QgaGF2ZSBvd25lciAhPSB5b3UpICovCisJCW4gPSBuZ3JvdXBzOworCQlncm91cF9hcnJheSA9IHhyZWFsbG9jKGdyb3VwX2FycmF5LCBuICogc2l6ZW9mKGdpZF90KSk7CisJCW5ncm91cHMgPSBnZXRncm91cHMobiwgZ3JvdXBfYXJyYXkpOworCX0gd2hpbGUgKG5ncm91cHMgPiBuKTsKK30KKworCisvKiBSZXR1cm4gbm9uLXplcm8gaWYgR0lEIGlzIG9uZSB0aGF0IHdlIGhhdmUgaW4gb3VyIGdyb3VwcyBsaXN0LiAqLworLy9YWFg6IEZJWE1FOiBkdXBsaWNhdGUgb2YgZXhpc3RpbmcgbGliYmIgZnVuY3Rpb24/CisvLyBzZWUgdG9wbGV2ZWwgVE9ETyBmaWxlOgorLy8gcG9zc2libGUgY29kZSBkdXBsaWNhdGlvbiBpbmdyb3VwKCkgYW5kIGlzX2FfZ3JvdXBfbWVtYmVyKCkKK3N0YXRpYyBpbnQgaXNfYV9ncm91cF9tZW1iZXIoZ2lkX3QgZ2lkKQoreworCWludCBpOworCisJLyogU2hvcnQtY2lyY3VpdCBpZiBwb3NzaWJsZSwgbWF5YmUgc2F2aW5nIGEgY2FsbCB0byBnZXRncm91cHMoKS4gKi8KKwlpZiAoZ2lkID09IGdldGdpZCgpIHx8IGdpZCA9PSBnZXRlZ2lkKCkpCisJCXJldHVybiAxOworCisJaWYgKG5ncm91cHMgPT0gMCkKKwkJaW5pdGlhbGl6ZV9ncm91cF9hcnJheSgpOworCisJLyogU2VhcmNoIHRocm91Z2ggdGhlIGxpc3QgbG9va2luZyBmb3IgR0lELiAqLworCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyBpKyspCisJCWlmIChnaWQgPT0gZ3JvdXBfYXJyYXlbaV0pCisJCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCisKKy8qIERvIHRoZSBzYW1lIHRoaW5nIGFjY2VzcygyKSBkb2VzLCBidXQgdXNlIHRoZSBlZmZlY3RpdmUgdWlkIGFuZCBnaWQsCisgICBhbmQgZG9uJ3QgbWFrZSB0aGUgbWlzdGFrZSBvZiB0ZWxsaW5nIHJvb3QgdGhhdCBhbnkgZmlsZSBpcworICAgZXhlY3V0YWJsZS4gKi8KK3N0YXRpYyBpbnQgdGVzdF9lYWNjZXNzKGNoYXIgKnBhdGgsIGludCBtb2RlKQoreworCXN0cnVjdCBzdGF0IHN0OworCXVuc2lnbmVkIGludCBldWlkID0gZ2V0ZXVpZCgpOworCisJaWYgKHN0YXQocGF0aCwgJnN0KSA8IDApCisJCXJldHVybiAtMTsKKworCWlmIChldWlkID09IDApIHsKKwkJLyogUm9vdCBjYW4gcmVhZCBvciB3cml0ZSBhbnkgZmlsZS4gKi8KKwkJaWYgKG1vZGUgIT0gWF9PSykKKwkJCXJldHVybiAwOworCisJCS8qIFJvb3QgY2FuIGV4ZWN1dGUgYW55IGZpbGUgdGhhdCBoYXMgYW55IG9uZSBvZiB0aGUgZXhlY3V0ZQorCQkgKiBiaXRzIHNldC4gKi8KKwkJaWYgKHN0LnN0X21vZGUgJiAoU19JWFVTUiB8IFNfSVhHUlAgfCBTX0lYT1RIKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmIChzdC5zdF91aWQgPT0gZXVpZCkgIC8qIG93bmVyICovCisJCW1vZGUgPDw9IDY7CisJZWxzZSBpZiAoaXNfYV9ncm91cF9tZW1iZXIoc3Quc3RfZ2lkKSkKKwkJbW9kZSA8PD0gMzsKKworCWlmIChzdC5zdF9tb2RlICYgbW9kZSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gLTE7Cit9CisKKworc3RhdGljIGludCBmaWxzdGF0KGNoYXIgKm5tLCBlbnVtIHRva2VuIG1vZGUpCit7CisJc3RydWN0IHN0YXQgczsKKwl1bnNpZ25lZCBpID0gaTsgLyogZ2NjIDMueCB0aGlua3MgaXQgY2FuIGJlIHVzZWQgdW5pbml0aWFsaXplZCAqLworCisJaWYgKG1vZGUgPT0gRklMU1lNKSB7CisjaWZkZWYgU19JRkxOSworCQlpZiAobHN0YXQobm0sICZzKSA9PSAwKSB7CisJCQlpID0gU19JRkxOSzsKKwkJCWdvdG8gZmlsZXR5cGU7CisJCX0KKyNlbmRpZgorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoc3RhdChubSwgJnMpICE9IDApCisJCXJldHVybiAwOworCWlmIChtb2RlID09IEZJTEVYSVNUKQorCQlyZXR1cm4gMTsKKwlpZiAoaXNfZmlsZV9hY2Nlc3MobW9kZSkpIHsKKwkJaWYgKG1vZGUgPT0gRklMUkQpCisJCQlpID0gUl9PSzsKKwkJaWYgKG1vZGUgPT0gRklMV1IpCisJCQlpID0gV19PSzsKKwkJaWYgKG1vZGUgPT0gRklMRVgpCisJCQlpID0gWF9PSzsKKwkJcmV0dXJuIHRlc3RfZWFjY2VzcyhubSwgaSkgPT0gMDsKKwl9CisJaWYgKGlzX2ZpbGVfdHlwZShtb2RlKSkgeworCQlpZiAobW9kZSA9PSBGSUxSRUcpCisJCQlpID0gU19JRlJFRzsKKwkJaWYgKG1vZGUgPT0gRklMRElSKQorCQkJaSA9IFNfSUZESVI7CisJCWlmIChtb2RlID09IEZJTENERVYpCisJCQlpID0gU19JRkNIUjsKKwkJaWYgKG1vZGUgPT0gRklMQkRFVikKKwkJCWkgPSBTX0lGQkxLOworCQlpZiAobW9kZSA9PSBGSUxGSUZPKSB7CisjaWZkZWYgU19JRklGTworCQkJaSA9IFNfSUZJRk87CisjZWxzZQorCQkJcmV0dXJuIDA7CisjZW5kaWYKKwkJfQorCQlpZiAobW9kZSA9PSBGSUxTT0NLKSB7CisjaWZkZWYgU19JRlNPQ0sKKwkJCWkgPSBTX0lGU09DSzsKKyNlbHNlCisJCQlyZXR1cm4gMDsKKyNlbmRpZgorCQl9CisgZmlsZXR5cGU6CisJCXJldHVybiAoKHMuc3RfbW9kZSAmIFNfSUZNVCkgPT0gaSk7CisJfQorCWlmIChpc19maWxlX2JpdChtb2RlKSkgeworCQlpZiAobW9kZSA9PSBGSUxTVUlEKQorCQkJaSA9IFNfSVNVSUQ7CisJCWlmIChtb2RlID09IEZJTFNHSUQpCisJCQlpID0gU19JU0dJRDsKKwkJaWYgKG1vZGUgPT0gRklMU1RDSykKKwkJCWkgPSBTX0lTVlRYOworCQlyZXR1cm4gKChzLnN0X21vZGUgJiBpKSAhPSAwKTsKKwl9CisJaWYgKG1vZGUgPT0gRklMR1opCisJCXJldHVybiBzLnN0X3NpemUgPiAwTDsKKwlpZiAobW9kZSA9PSBGSUxVSUQpCisJCXJldHVybiBzLnN0X3VpZCA9PSBnZXRldWlkKCk7CisJaWYgKG1vZGUgPT0gRklMR0lEKQorCQlyZXR1cm4gcy5zdF9naWQgPT0gZ2V0ZWdpZCgpOworCXJldHVybiAxOyAvKiBOT1RSRUFDSEVEICovCit9CisKKworc3RhdGljIG51bWJlcl90IG5leHByKGVudW0gdG9rZW4gbikKK3sKKwludW1iZXJfdCByZXM7CisKKwluZXN0X21zZygiPm5leHByKCVzKVxuIiwgVE9LU1RSW25dKTsKKwlpZiAobiA9PSBVTk9UKSB7CisJCW4gPSBjaGVja19vcGVyYXRvcigqKythcmdzKTsKKwkJaWYgKG4gPT0gRU9JKSB7CisJCQkvKiBzcGVjaWFsIGNhc2U6IFsgISBdLCBbIGEgLWEgISBdIGFyZSB2YWxpZCAqLworCQkJLyogSU9XLCAiISBBUkciIG1heSBtaXNzIEFSRyAqLworCQkJYXJncy0tOworCQkJdW5uZXN0X21zZygiPG5leHByOjEgKCFFT0kpLCBhcmdzOiVzKCVwKVxuIiwgYXJnc1swXSwgJmFyZ3NbMF0pOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcmVzID0gIW5leHByKG4pOworCQl1bm5lc3RfbXNnKCI8bmV4cHI6JWxsZFxuIiwgcmVzKTsKKwkJcmV0dXJuIHJlczsKKwl9CisJcmVzID0gcHJpbWFyeShuKTsKKwl1bm5lc3RfbXNnKCI8bmV4cHI6JWxsZFxuIiwgcmVzKTsKKwlyZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBudW1iZXJfdCBhZXhwcihlbnVtIHRva2VuIG4pCit7CisJbnVtYmVyX3QgcmVzOworCisJbmVzdF9tc2coIj5hZXhwciglcylcbiIsIFRPS1NUUltuXSk7CisJcmVzID0gbmV4cHIobik7CisJZGJnX21zZygiYWV4cHI6IG5leHByOiVsbGQsIG5leHQgYXJnczolcyglcClcbiIsIHJlcywgYXJnc1sxXSwgJmFyZ3NbMV0pOworCWlmIChjaGVja19vcGVyYXRvcigqKythcmdzKSA9PSBCQU5EKSB7CisJCWRiZ19tc2coImFleHByOiBhcmcgaXMgQU5ELCBuZXh0IGFyZ3M6JXMoJXApXG4iLCBhcmdzWzFdLCAmYXJnc1sxXSk7CisJCXJlcyA9IGFleHByKGNoZWNrX29wZXJhdG9yKCorK2FyZ3MpKSAmJiByZXM7CisJCXVubmVzdF9tc2coIjxhZXhwcjolbGxkXG4iLCByZXMpOworCQlyZXR1cm4gcmVzOworCX0KKwlhcmdzLS07CisJdW5uZXN0X21zZygiPGFleHByOiVsbGQsIGFyZ3M6JXMoJXApXG4iLCByZXMsIGFyZ3NbMF0sICZhcmdzWzBdKTsKKwlyZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBudW1iZXJfdCBvZXhwcihlbnVtIHRva2VuIG4pCit7CisJbnVtYmVyX3QgcmVzOworCisJbmVzdF9tc2coIj5vZXhwciglcylcbiIsIFRPS1NUUltuXSk7CisJcmVzID0gYWV4cHIobik7CisJZGJnX21zZygib2V4cHI6IGFleHByOiVsbGQsIG5leHQgYXJnczolcyglcClcbiIsIHJlcywgYXJnc1sxXSwgJmFyZ3NbMV0pOworCWlmIChjaGVja19vcGVyYXRvcigqKythcmdzKSA9PSBCT1IpIHsKKwkJZGJnX21zZygib2V4cHI6IG5leHQgYXJnIGlzIE9SLCBuZXh0IGFyZ3M6JXMoJXApXG4iLCBhcmdzWzFdLCAmYXJnc1sxXSk7CisJCXJlcyA9IG9leHByKGNoZWNrX29wZXJhdG9yKCorK2FyZ3MpKSB8fCByZXM7CisJCXVubmVzdF9tc2coIjxvZXhwcjolbGxkXG4iLCByZXMpOworCQlyZXR1cm4gcmVzOworCX0KKwlhcmdzLS07CisJdW5uZXN0X21zZygiPG9leHByOiVsbGQsIGFyZ3M6JXMoJXApXG4iLCByZXMsIGFyZ3NbMF0sICZhcmdzWzBdKTsKKwlyZXR1cm4gcmVzOworfQorCisKK3N0YXRpYyBudW1iZXJfdCBwcmltYXJ5KGVudW0gdG9rZW4gbikKK3sKKyNpZiBURVNUX0RFQlVHCisJbnVtYmVyX3QgcmVzID0gcmVzOyAvKiBmb3IgY29tcGlsZXIgKi8KKyNlbHNlCisJbnVtYmVyX3QgcmVzOworI2VuZGlmCisJY29uc3Qgc3RydWN0IG9wZXJhdG9yX3QgKmFyZ3MwX29wOworCisJbmVzdF9tc2coIj5wcmltYXJ5KCVzKVxuIiwgVE9LU1RSW25dKTsKKwlpZiAobiA9PSBFT0kpIHsKKwkJc3ludGF4KE5VTEwsICJhcmd1bWVudCBleHBlY3RlZCIpOworCX0KKwlpZiAobiA9PSBMUEFSRU4pIHsKKwkJcmVzID0gb2V4cHIoY2hlY2tfb3BlcmF0b3IoKisrYXJncykpOworCQlpZiAoY2hlY2tfb3BlcmF0b3IoKisrYXJncykgIT0gUlBBUkVOKQorCQkJc3ludGF4KE5VTEwsICJjbG9zaW5nIHBhcmVuIGV4cGVjdGVkIik7CisJCXVubmVzdF9tc2coIjxwcmltYXJ5OiVsbGRcbiIsIHJlcyk7CisJCXJldHVybiByZXM7CisJfQorCisJLyogY29yZXV0aWxzIDYuOSBjaGVja3MgImlzIGFyZ3NbMV0gYmlub3AgYW5kIGFyZ3NbMl0gZXhpc3Q/IiBmaXJzdCwKKwkgKiBkbyB0aGUgc2FtZSAqLworCWFyZ3MwX29wID0gbGFzdF9vcGVyYXRvcjsKKwkvKiBsYXN0X29wZXJhdG9yID0gb3BlcmF0b3IgYXQgYXJnc1sxXSAqLworCWlmIChjaGVja19vcGVyYXRvcihhcmdzWzFdKSAhPSBFT0kpIHsgLyogaWYgYXJnc1sxXSAhPSBOVUxMICovCisJCWlmIChhcmdzWzJdKSB7CisJCQkvLyBjb3JldXRpbHMgYWxzbyBkb2VzIHRoaXM6CisJCQkvLyBpZiAoYXJnc1szXSAmJiBhcmdzWzBdPSItbCIgJiYgYXJnc1syXSBpcyBCSU5PUCkKKwkJCS8vCXJldHVybiBiaW5vcCgxIC8qIHByZXBlbmRlZCBieSAtbCAqLyk7CisJCQlpZiAobGFzdF9vcGVyYXRvci0+b3BfdHlwZSA9PSBCSU5PUCkKKwkJCQl1bm5lc3RfbXNnX2FuZF9yZXR1cm4oYmlub3AoKSwgIjxwcmltYXJ5OiBiaW5vcDolbGxkXG4iKTsKKwkJfQorCX0KKwkvKiBjaGVjayAiaXMgYXJnc1swXSB1bm9wPyIgc2Vjb25kICovCisJaWYgKGFyZ3MwX29wLT5vcF90eXBlID09IFVOT1ApIHsKKwkJLyogdW5hcnkgZXhwcmVzc2lvbiAqLworCQlpZiAoYXJnc1sxXSA9PSBOVUxMKQorLy8JCQlzeW50YXgoYXJnczBfb3AtPm9wX3RleHQsICJhcmd1bWVudCBleHBlY3RlZCIpOworCQkJZ290byBjaGVja19lbXB0aW5lc3M7CisJCWFyZ3MrKzsKKwkJaWYgKG4gPT0gU1RSRVopCisJCQl1bm5lc3RfbXNnX2FuZF9yZXR1cm4oYXJnc1swXVswXSA9PSAnXDAnLCAiPHByaW1hcnk6JWxsZFxuIik7CisJCWlmIChuID09IFNUUk5aKQorCQkJdW5uZXN0X21zZ19hbmRfcmV0dXJuKGFyZ3NbMF1bMF0gIT0gJ1wwJywgIjxwcmltYXJ5OiVsbGRcbiIpOworCQlpZiAobiA9PSBGSUxUVCkKKwkJCXVubmVzdF9tc2dfYW5kX3JldHVybihpc2F0dHkoZ2V0bigqYXJncykpLCAiPHByaW1hcnk6IGlzYXR0eSglcyklbGxkXG4iLCAqYXJncyk7CisJCXVubmVzdF9tc2dfYW5kX3JldHVybihmaWxzdGF0KCphcmdzLCBuKSwgIjxwcmltYXJ5OiBmaWxzdGF0KCVzKTolbGxkXG4iLCAqYXJncyk7CisJfQorCisJLypjaGVja19vcGVyYXRvcihhcmdzWzFdKTsgLSBhbHJlYWR5IGRvbmUgKi8KKwlpZiAobGFzdF9vcGVyYXRvci0+b3BfdHlwZSA9PSBCSU5PUCkgeworCQkvKiBhcmdzWzJdIGlzIGtub3duIHRvIGJlIE5VTEwsIGlzbid0IGl0IGJvdW5kIHRvIGZhaWw/ICovCisJCXVubmVzdF9tc2dfYW5kX3JldHVybihiaW5vcCgpLCAiPHByaW1hcnk6JWxsZFxuIik7CisJfQorIGNoZWNrX2VtcHRpbmVzczoKKwl1bm5lc3RfbXNnX2FuZF9yZXR1cm4oYXJnc1swXVswXSAhPSAnXDAnLCAiPHByaW1hcnk6JWxsZFxuIik7Cit9CisKKworaW50IHRlc3RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IHJlczsKKwljb25zdCBjaGFyICphcmcwOworCisJYXJnMCA9IGJiX2Jhc2VuYW1lKGFyZ3ZbMF0pOworCWlmIChhcmcwWzBdID09ICdbJykgeworCQktLWFyZ2M7CisJCWlmICghYXJnMFsxXSkgeyAvKiAiWyIgPyAqLworCQkJaWYgKE5PVF9MT05FX0NIQVIoYXJndlthcmdjXSwgJ10nKSkgeworCQkJCWJiX2Vycm9yX21zZygibWlzc2luZyBdIik7CisJCQkJcmV0dXJuIDI7CisJCQl9CisJCX0gZWxzZSB7IC8qIGFzc3VtaW5nICJbWyIgKi8KKwkJCWlmIChzdHJjbXAoYXJndlthcmdjXSwgIl1dIikgIT0gMCkgeworCQkJCWJiX2Vycm9yX21zZygibWlzc2luZyBdXSIpOworCQkJCXJldHVybiAyOworCQkJfQorCQl9CisJCWFyZ3ZbYXJnY10gPSBOVUxMOworCX0KKwkvKiBhcmdjIGlzIHVudXNlZCBhZnRlciB0aGlzIHBvaW50ICovCisKKwkvKiBXZSBtdXN0IGRvIERFSU5JVF9TKCkgcHJpb3IgdG8gcmV0dXJuaW5nICovCisJSU5JVF9TKCk7CisKKwlyZXMgPSBzZXRqbXAobGVhdmluZyk7CisJaWYgKHJlcykKKwkJZ290byByZXQ7CisKKwkvKiByZXNldHRpbmcgbmdyb3VwcyBpcyBwcm9iYWJseSB1bm5lY2Vzc2FyeS4gIGl0IHdpbGwKKwkgKiBmb3JjZSBhIG5ldyBjYWxsIHRvIGdldGdyb3VwcygpLCB3aGljaCBwcmV2ZW50cyB1c2luZworCSAqIGdyb3VwIGRhdGEgZmV0Y2hlZCBkdXJpbmcgYSBwcmV2aW91cyBjYWxsLiAgYnV0IHRoZQorCSAqIG9ubHkgd2F5IHRoZSBncm91cCBkYXRhIGNvdWxkIGJlIHN0YWxlIGlzIGlmIHRoZXJlJ3MKKwkgKiBiZWVuIGFuIGludGVydmVuaW5nIGNhbGwgdG8gc2V0Z3JvdXBzKCksIGFuZCB0aGlzCisJICogaXNuJ3QgbGlrZWx5IGluIHRoZSBjYXNlIG9mIGEgc2hlbGwuICBwYXJhbm9pYQorCSAqIHByZXZhaWxzLi4uCisJICovCisJLypuZ3JvdXBzID0gMDsgLSBkb25lIGJ5IElOSVRfUygpICovCisKKwlhcmd2Kys7CisJYXJncyA9IGFyZ3Y7CisKKwkvKiBJbXBsZW1lbnQgc3BlY2lhbCBjYXNlcyBmcm9tIFBPU0lYLjIsIHNlY3Rpb24gNC42Mi40LgorCSAqIFRlc3RjYXNlOiAidGVzdCAnKCcgPSAnKCciCisJICogVGhlIGdlbmVyYWwgcGFyc2VyIHdvdWxkIG1pc2ludGVycHJldCAnKCcgYXMgZ3JvdXAgc3RhcnQuCisJICovCisJaWYgKDEpIHsKKwkJaW50IG5lZ2F0ZSA9IDA7CisgYWdhaW46CisJCWlmICghYXJndlswXSkgeworCQkJLyogInRlc3QiICovCisJCQlyZXMgPSAxOworCQkJZ290byByZXRfc3BlY2lhbDsKKwkJfQorCQlpZiAoIWFyZ3ZbMV0pIHsKKwkJCS8qICJ0ZXN0IFshXSBhcmciICovCisJCQlyZXMgPSAoYXJndlswXVswXSA9PSAnXDAnKTsKKwkJCWdvdG8gcmV0X3NwZWNpYWw7CisJCX0KKwkJaWYgKGFyZ3ZbMl0gJiYgIWFyZ3ZbM10pIHsKKwkJCWNoZWNrX29wZXJhdG9yKGFyZ3ZbMV0pOworCQkJaWYgKGxhc3Rfb3BlcmF0b3ItPm9wX3R5cGUgPT0gQklOT1ApIHsKKwkJCQkvKiAidGVzdCBbIV0gYXJnMSA8YmluYXJ5X29wPiBhcmcyIiAqLworCQkJCWFyZ3MgPSBhcmd2OworCQkJCXJlcyA9IChiaW5vcCgpID09IDApOworIHJldF9zcGVjaWFsOgorCQkJCS8qIElmIHRoZXJlIHdhcyBsZWFkaW5nICIhIiBvcC4uLiAqLworCQkJCXJlcyBePSBuZWdhdGU7CisJCQkJZ290byByZXQ7CisJCQl9CisJCX0KKwkJaWYgKExPTkVfQ0hBUihhcmd2WzBdLCAnIScpKSB7CisJCQlhcmd2Kys7CisJCQluZWdhdGUgXj0gMTsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwl9CisKKwlyZXMgPSAhb2V4cHIoY2hlY2tfb3BlcmF0b3IoKmFyZ3MpKTsKKworCWlmICgqYXJncyAhPSBOVUxMICYmICorK2FyZ3MgIT0gTlVMTCkgeworCQkvKiBFeGFtcGxlczoKKwkJICogdGVzdCAzIC1sdCA1IDYKKwkJICogdGVzdCAtdCAxIDIKKwkJICovCisJCWJiX2Vycm9yX21zZygiJXM6IHVua25vd24gb3BlcmFuZCIsICphcmdzKTsKKwkJcmVzID0gMjsKKwl9CisgcmV0OgorCURFSU5JVF9TKCk7CisJcmV0dXJuIHJlczsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy90ZXN0X3B0cl9oYWNrLmMgYi9jb3JldXRpbHMvdGVzdF9wdHJfaGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYTlkY2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvdGVzdF9wdHJfaGFjay5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworc3RydWN0IHRlc3Rfc3RhdGljczsKKworI2lmbmRlZiBHQ0NfQ09NQklORQorCisvKiBXZSBjaGVhdCBoZXJlLiBJdCBpcyBkZWNsYXJlZCBhcyBjb25zdCBwdHIgaW4gbGliYmIuaCwKKyAqIGJ1dCBoZXJlIHdlIG1ha2UgaXQgbGl2ZSBpbiBSL1cgbWVtb3J5ICovCitzdHJ1Y3QgdGVzdF9zdGF0aWNzICp0ZXN0X3B0cl90b19zdGF0aWNzOworCisjZWxzZQorCisvKiBnY2MgLWNvbWJpbmUgd2lsbCBzZWUgdGhyb3VnaCBhbmQgY29tcGxhaW4gKi8KKy8qIFVzaW5nIGFsdGVybmF0aXZlIG1ldGhvZCB3aGljaCBpcyBtb3JlIGxpa2VseSB0byBicmVhaworICogb24gd2VpcmQgYXJjaGl0ZWN0dXJlcywgY29tcGlsZXJzLCBsaW5rZXJzIGFuZCBzbyBvbiAqLworc3RydWN0IHRlc3Rfc3RhdGljcyAqY29uc3QgdGVzdF9wdHJfdG9fc3RhdGljcyBfX2F0dHJpYnV0ZV9fICgoc2VjdGlvbiAoIi5kYXRhIikpKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9jb3JldXRpbHMvdG91Y2guYyBiL2NvcmV1dGlscy90b3VjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5M2E5NjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvdG91Y2guYwpAQCAtMCwwICsxLDE5NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSB0b3VjaCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIF9OT1RfIGNvbXBsaWFudCAtLSBvcHRpb25zIC1hLCAtbSBub3Qgc3VwcG9ydGVkLiAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy90b3VjaC5odG1sICovCisKKy8qIE1hciAxNiwgMjAwMyAgICAgIE1hbnVlbCBOb3ZvYSBJSUkgICAobWpuM0Bjb2RlcG9ldC5vcmcpCisgKgorICogUHJldmlvdXMgdmVyc2lvbiBjYWxsZWQgb3BlbigpIGFuZCB0aGVuIHV0aW1lKCkuICBXaGlsZSB0aGlzIHdpbGwgYmUKKyAqIGJlIG5lY2Vzc2FyeSB0byBpbXBsZW1lbnQgLXIgYW5kIC10LCBpdCBjdXJyZW50bHkgb25seSBtYWtlcyB0aGluZ3MgYmlnZ2VyLgorICogQWxzbywgZXhpdGluZyBvbiBhIGZhaWx1cmUgd2FzIGEgYnVnLiAgQWxsIGFyZ3Mgc2hvdWxkIGJlIHByb2Nlc3NlZC4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLy9jb25maWc6Y29uZmlnIFRPVUNICisvL2NvbmZpZzoJYm9vbCAidG91Y2giCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgdG91Y2ggaXMgdXNlZCB0byBjcmVhdGUgb3IgY2hhbmdlIHRoZSBhY2Nlc3MgYW5kL29yCisvL2NvbmZpZzoJICBtb2RpZmljYXRpb24gdGltZXN0YW1wIG9mIHNwZWNpZmllZCBmaWxlcy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVE9VQ0hfTk9ERVJFRgorLy9jb25maWc6CWJvb2wgIkFkZCBzdXBwb3J0IGZvciAtaCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFRPVUNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHRvdWNoIHRvIGhhdmUgdGhlIC1oIG9wdGlvbi4KKy8vY29uZmlnOgkgIFRoaXMgcmVxdWlyZXMgbGliYyBzdXBwb3J0IGZvciBsdXRpbWVzKCkgZnVuY3Rpb24uCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1RPVUNIX1NVU1YzCisvL2NvbmZpZzoJYm9vbCAiQWRkIHN1cHBvcnQgZm9yIFNVU1YzIGZlYXR1cmVzICgtZCAtdCAtcikiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBUT1VDSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSB0b3VjaCB0byB1c2UgYSByZWZlcmVuY2UgZmlsZSBvciBhIGdpdmVuIGRhdGUvdGltZSBhcmd1bWVudC4KKworLy9hcHBsZXQ6SUZfVE9VQ0goQVBQTEVUX05PRk9SSyh0b3VjaCwgdG91Y2gsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgdG91Y2gpKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfVE9VQ0gpICs9IHRvdWNoLm8KKworLy91c2FnZTojZGVmaW5lIHRvdWNoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWNdIiBJRl9GRUFUVVJFX1RPVUNIX1NVU1YzKCIgWy1kIERBVEVdIFstdCBEQVRFXSBbLXIgRklMRV0iKSAiIEZJTEUuLi4iCisvL3VzYWdlOiNkZWZpbmUgdG91Y2hfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJVcGRhdGUgdGhlIGxhc3QtbW9kaWZpZWQgZGF0ZSBvbiB0aGUgZ2l2ZW4gRklMRVtzXVxuIgorLy91c2FnZTogICAgICJcbgktYwlEb24ndCBjcmVhdGUgZmlsZXMiCisvL3VzYWdlOglJRl9GRUFUVVJFX1RPVUNIX05PREVSRUYoCisvL3VzYWdlOiAgICAgIlxuCS1oCURvbid0IGZvbGxvdyBsaW5rcyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVE9VQ0hfU1VTVjMoCisvL3VzYWdlOiAgICAgIlxuCS1kIERUCURhdGUvdGltZSB0byB1c2UiCisvL3VzYWdlOiAgICAgIlxuCS10IERUCURhdGUvdGltZSB0byB1c2UiCisvL3VzYWdlOiAgICAgIlxuCS1yIEZJTEUJVXNlIEZJTEUncyBkYXRlL3RpbWUiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHRvdWNoX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGxzIC1sIC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiL2Jpbi9sczogL3RtcC9mb286IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcbiIKKy8vdXNhZ2U6ICAgICAgICIkIHRvdWNoIC90bXAvZm9vXG4iCisvL3VzYWdlOiAgICAgICAiJCBscyAtbCAvdG1wL2Zvb1xuIgorLy91c2FnZTogICAgICAgIi1ydy1ydy1yLS0gICAgMSBhbmRlcnNlbiBhbmRlcnNlbiAgICAgICAgMCBBcHIgMTUgMDE6MTEgL3RtcC9mb29cbiIKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworLyogY29yZXV0aWxzIGltcGxlbWVudHM6CisgKiAtYSAgIGNoYW5nZSBvbmx5IHRoZSBhY2Nlc3MgdGltZQorICogLWMsIC0tbm8tY3JlYXRlCisgKiAgICAgIGRvIG5vdCBjcmVhdGUgYW55IGZpbGVzCisgKiAtZCwgLS1kYXRlPVNUUklORworICogICAgICBwYXJzZSBTVFJJTkcgYW5kIHVzZSBpdCBpbnN0ZWFkIG9mIGN1cnJlbnQgdGltZQorICogLWYgICAoaWdub3JlZCwgQlNEIGNvbXBhdCkKKyAqIC1tICAgY2hhbmdlIG9ubHkgdGhlIG1vZGlmaWNhdGlvbiB0aW1lCisgKiAtaCwgLS1uby1kZXJlZmVyZW5jZQorICogLXIsIC0tcmVmZXJlbmNlPUZJTEUKKyAqICAgICAgdXNlIHRoaXMgZmlsZSdzIHRpbWVzIGluc3RlYWQgb2YgY3VycmVudCB0aW1lCisgKiAtdCBTVEFNUAorICogICAgICB1c2UgW1tDQ11ZWV1NTUREaGhtbVsuc3NdIGluc3RlYWQgb2YgY3VycmVudCB0aW1lCisgKiAtLXRpbWU9V09SRAorICogICAgICBjaGFuZ2UgdGhlIHNwZWNpZmllZCB0aW1lOiBXT1JEIGlzIGFjY2VzcywgYXRpbWUsIG9yIHVzZQorICovCisKK2ludCB0b3VjaF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdG91Y2hfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBmZDsKKwlpbnQgc3RhdHVzID0gRVhJVF9TVUNDRVNTOworCWludCBvcHRzOworCWVudW0geworCQlPUFRfYyA9ICgxIDw8IDApLAorCQlPUFRfciA9ICgxIDw8IDEpICogRU5BQkxFX0ZFQVRVUkVfVE9VQ0hfU1VTVjMsCisJCU9QVF9kID0gKDEgPDwgMikgKiBFTkFCTEVfRkVBVFVSRV9UT1VDSF9TVVNWMywKKwkJT1BUX3QgPSAoMSA8PCAzKSAqIEVOQUJMRV9GRUFUVVJFX1RPVUNIX1NVU1YzLAorCQlPUFRfaCA9ICgxIDw8IDQpICogRU5BQkxFX0ZFQVRVUkVfVE9VQ0hfTk9ERVJFRiwKKwl9OworI2lmIEVOQUJMRV9GRUFUVVJFX1RPVUNIX1NVU1YzCisjIGlmIEVOQUJMRV9MT05HX09QVFMKKwlzdGF0aWMgY29uc3QgY2hhciB0b3VjaF9sb25nb3B0c1tdIEFMSUdOMSA9CisJCS8qIG5hbWUsIGhhc19hcmcsIHZhbCAqLworCQkibm8tY3JlYXRlXDAiICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImMiCisJCSJyZWZlcmVuY2VcMCIgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiciIKKwkJImRhdGVcMCIgICAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJkIgorCQlJRl9GRUFUVVJFX1RPVUNIX05PREVSRUYoIm5vLWRlcmVmZXJlbmNlXDAiIE5vX2FyZ3VtZW50ICJoIikKKwk7CisjIGVuZGlmCisJY2hhciAqcmVmZXJlbmNlX2ZpbGUgPSBOVUxMOworCWNoYXIgKmRhdGVfc3RyID0gTlVMTDsKKwlzdHJ1Y3QgdGltZXZhbCB0aW1lYnVmWzJdOworCXRpbWVidWZbMV0udHZfdXNlYyA9IHRpbWVidWZbMF0udHZfdXNlYyA9IDA7CisjZWxzZQorIyBkZWZpbmUgcmVmZXJlbmNlX2ZpbGUgTlVMTAorIyBkZWZpbmUgZGF0ZV9zdHIgICAgICAgTlVMTAorIyBkZWZpbmUgdGltZWJ1ZiAgICAgICAgKChzdHJ1Y3QgdGltZXZhbCopTlVMTCkKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9VQ0hfU1VTVjMgJiYgRU5BQkxFX0xPTkdfT1BUUworCWFwcGxldF9sb25nX29wdGlvbnMgPSB0b3VjaF9sb25nb3B0czsKKyNlbmRpZgorCS8qIC1kIGFuZCAtdCBib3RoIHNldCB0aW1lLiBJbiBjb3JldXRpbHMsCisJICogYWNjZXB0ZWQgZGF0YSBmb3JtYXQgZGlmZmVycyBhIGJpdCBiZXR3ZWVuIC1kIGFuZCAtdC4KKwkgKiBXZSBhY2NlcHQgdGhlIHNhbWUgZm9ybWF0cyBmb3IgYm90aCAqLworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiYyIgSUZfRkVBVFVSRV9UT1VDSF9TVVNWMygicjpkOnQ6IikKKwkJCQlJRl9GRUFUVVJFX1RPVUNIX05PREVSRUYoImgiKQorCQkJCS8qaWdub3JlZDoqLyAiZm1hIgorCQkJCUlGX0ZFQVRVUkVfVE9VQ0hfU1VTVjMoLCAmcmVmZXJlbmNlX2ZpbGUpCisJCQkJSUZfRkVBVFVSRV9UT1VDSF9TVVNWMygsICZkYXRlX3N0cikKKwkJCQlJRl9GRUFUVVJFX1RPVUNIX1NVU1YzKCwgJmRhdGVfc3RyKQorCSk7CisKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoISphcmd2KSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlpZiAocmVmZXJlbmNlX2ZpbGUpIHsKKwkJc3RydWN0IHN0YXQgc3RidWY7CisJCXhzdGF0KHJlZmVyZW5jZV9maWxlLCAmc3RidWYpOworCQl0aW1lYnVmWzFdLnR2X3NlYyA9IHRpbWVidWZbMF0udHZfc2VjID0gc3RidWYuc3RfbXRpbWU7CisJCS8qIENhbiB1c2UgLnN0X210aW0udHZfbnNlYworCQkgKiAob3IgaXMgaXQgLnN0X210aW1lbnNlYz8/IHNlZSBkYXRlLmMpCisJCSAqIHRvIHNldCBtaWNyb3NlY29uZHMgdG9vLgorCQkgKi8KKwl9CisKKwlpZiAoZGF0ZV9zdHIpIHsKKwkJc3RydWN0IHRtIHRtX3RpbWU7CisJCXRpbWVfdCB0OworCisJCS8vbWVtc2V0KCZ0bV90aW1lLCAwLCBzaXplb2YodG1fdGltZSkpOworCQkvKiBCZXR0ZXIgdGhhbiBtZW1zZXQ6IG1ha2VzICJISDpNTSIgZGF0ZXMgbWVhbmluZ2Z1bCAqLworCQl0aW1lKCZ0KTsKKwkJbG9jYWx0aW1lX3IoJnQsICZ0bV90aW1lKTsKKwkJcGFyc2VfZGF0ZXN0cihkYXRlX3N0ciwgJnRtX3RpbWUpOworCisJCS8qIENvcnJlY3QgYW55IGRheSBvZiB3ZWVrIGFuZCBkYXkgb2YgeWVhciBldGMuIGZpZWxkcyAqLworCQl0bV90aW1lLnRtX2lzZHN0ID0gLTE7ICAvKiBCZSBzdXJlIHRvIHJlY2hlY2sgZHN0ICovCisJCXQgPSB2YWxpZGF0ZV90bV90aW1lKGRhdGVfc3RyLCAmdG1fdGltZSk7CisKKwkJdGltZWJ1ZlsxXS50dl9zZWMgPSB0aW1lYnVmWzBdLnR2X3NlYyA9IHQ7CisJfQorCisJZG8geworCQlpbnQgcmVzdWx0OworCQlyZXN1bHQgPSAoCisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9VQ0hfTk9ERVJFRgorCQkJKG9wdHMgJiBPUFRfaCkgPyBsdXRpbWVzIDoKKyNlbmRpZgorCQkJdXRpbWVzKSgqYXJndiwgKHJlZmVyZW5jZV9maWxlIHx8IGRhdGVfc3RyKSA/IHRpbWVidWYgOiBOVUxMKTsKKwkJaWYgKHJlc3VsdCAhPSAwKSB7CisJCQlpZiAoZXJybm8gPT0gRU5PRU5UKSB7IC8qIG5vIHN1Y2ggZmlsZT8gKi8KKwkJCQlpZiAob3B0cyAmIE9QVF9jKSB7CisJCQkJCS8qIENyZWF0aW9uIGlzIGRpc2FibGVkLCBzbyBpZ25vcmUgKi8KKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8qIFRyeSB0byBjcmVhdGUgdGhlIGZpbGUgKi8KKwkJCQlmZCA9IG9wZW4oKmFyZ3YsIE9fUkRXUiB8IE9fQ1JFQVQsIDA2NjYpOworCQkJCWlmIChmZCA+PSAwKSB7CisJCQkJCXhjbG9zZShmZCk7CisJCQkJCWlmIChyZWZlcmVuY2VfZmlsZSB8fCBkYXRlX3N0cikKKwkJCQkJCXV0aW1lcygqYXJndiwgdGltZWJ1Zik7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCXN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKCphcmd2KTsKKwkJfQorCX0gd2hpbGUgKCorK2FyZ3YpOworCisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy90ci5jIGIvY29yZXV0aWxzL3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY3OTQ4YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy90ci5jCkBAIC0wLDAgKzEsMzQ2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHRyIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICoqIENvcHlyaWdodCAoYykgMTk4NywxOTk3LCBQcmVudGljZSBIYWxsICAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGUgbmFtZSBvZiBQcmVudGljZSBIYWxsIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUKKyAqIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3IKKyAqIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIE1pY2hpZWwgSHVpc2plcworICoKKyAqIFRoaXMgdmVyc2lvbiBvZiB0ciBpcyBhZGFwdGVkIGZyb20gTWluaXggdHIgYW5kIHdhcyBtb2RpZmllZAorICogYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPiB0byBiZSB1c2VkIGluIGJ1c3lib3guCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L3V0aWxpdGllcy90ci5odG1sCisgKiBUT0RPOiBncmFwaCwgcHJpbnQKKyAqLworCisvL2tidWlsZDpsaWItJChDT05GSUdfVFIpICs9IHRyLm8KKworLy9jb25maWc6Y29uZmlnIFRSCisvL2NvbmZpZzoJYm9vbCAidHIiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgdHIgaXMgdXNlZCB0byBzcXVlZXplLCBhbmQvb3IgZGVsZXRlIGNoYXJhY3RlcnMgZnJvbSBzdGFuZGFyZAorLy9jb25maWc6CSAgaW5wdXQsIHdyaXRpbmcgdG8gc3RhbmRhcmQgb3V0cHV0LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9UUl9DTEFTU0VTCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIGNoYXJhY3RlciBjbGFzc2VzIChzdWNoIGFzIFs6dXBwZXI6XSkiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBUUgorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBjaGFyYWN0ZXIgY2xhc3NlcywgZW5hYmxpbmcgY29tbWFuZHMgc3VjaCBhczoKKy8vY29uZmlnOgkgIHRyIFs6dXBwZXI6XSBbOmxvd2VyOl0gdG8gY29udmVydCBpbnB1dCBpbnRvIGxvd2VyY2FzZS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVFJfRVFVSVYKKy8vY29uZmlnOglib29sICJFbmFibGUgZXF1aXZhbGVuY2UgY2xhc3NlcyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFRSCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIGVxdWl2YWxlbmNlIGNsYXNzZXMsIHdoaWNoIGVzc2VudGlhbGx5IGFkZCB0aGUgZW5jbG9zZWQKKy8vY29uZmlnOgkgIGNoYXJhY3RlciB0byB0aGUgY3VycmVudCBzZXQuIEZvciBpbnN0YW5jZSwgdHIgWz1hPV0geHl6IHdvdWxkCisvL2NvbmZpZzoJICByZXBsYWNlIGFsbCBpbnN0YW5jZXMgb2YgJ2EnIHdpdGggJ3h5eicuIFRoaXMgb3B0aW9uIGlzIG1haW5seQorLy9jb25maWc6CSAgdXNlZnVsIGZvciBjYXNlcyB3aGVuIG5vIG90aGVyIHdheSBvZiBleHByZXNzaW5nIGEgY2hhcmFjdGVyCisvL2NvbmZpZzoJICBpcyBwb3NzaWJsZS4KKworLy91c2FnZTojZGVmaW5lIHRyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWNkc10gU1RSSU5HMSBbU1RSSU5HMl0iCisvL3VzYWdlOiNkZWZpbmUgdHJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJUcmFuc2xhdGUsIHNxdWVlemUsIG9yIGRlbGV0ZSBjaGFyYWN0ZXJzIGZyb20gc3RkaW4sIHdyaXRpbmcgdG8gc3Rkb3V0XG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCVRha2UgY29tcGxlbWVudCBvZiBTVFJJTkcxIgorLy91c2FnZTogICAgICJcbgktZAlEZWxldGUgaW5wdXQgY2hhcmFjdGVycyBjb2RlZCBTVFJJTkcxIgorLy91c2FnZTogICAgICJcbgktcwlTcXVlZXplIG11bHRpcGxlIG91dHB1dCBjaGFyYWN0ZXJzIG9mIFNUUklORzIgaW50byBvbmUgY2hhcmFjdGVyIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB0cl9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBlY2hvIFwiZ2Rra24gdm5xa2NcIiB8IHRyIFthLXldIFtiLXpdXG4iCisvL3VzYWdlOiAgICAgICAiaGVsbG8gd29ybGRcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2VudW0geworCUFTQ0lJID0gMjU2LAorCS8qIHN0cmluZyBidWZmZXIgbmVlZHMgdG8gYmUgYXQgbGVhc3QgYXMgYmlnIGFzIHRoZSB3aG9sZSAiYWxwaGFiZXQiLgorCSAqIEJVRlNJWiA9PSBBU0NJSSBpcyBvaywgYnV0IHdlIHdpbGwgcmVhbGxvYyBpbiBleHBhbmQKKwkgKiBldmVuIGZvciBzbWFsbGVzdCBwYXR0ZXJucywgbGV0J3MgYXZvaWQgdGhhdCBieSB1c2luZyAqMjoKKwkgKi8KKwlUUl9CVUZTSVogPSAoQlVGU0laID4gQVNDSUkqMikgPyBCVUZTSVogOiBBU0NJSSoyLAorfTsKKworc3RhdGljIHZvaWQgbWFwKGNoYXIgKnB2ZWN0b3IsCisJCWNoYXIgKnN0cmluZzEsIHVuc2lnbmVkIHN0cmluZzFfbGVuLAorCQljaGFyICpzdHJpbmcyLCB1bnNpZ25lZCBzdHJpbmcyX2xlbikKK3sKKwljaGFyIGxhc3QgPSAnMCc7CisJdW5zaWduZWQgaSwgajsKKworCWZvciAoaiA9IDAsIGkgPSAwOyBpIDwgc3RyaW5nMV9sZW47IGkrKykgeworCQlpZiAoc3RyaW5nMl9sZW4gPD0gaikKKwkJCXB2ZWN0b3JbKHVuc2lnbmVkIGNoYXIpKHN0cmluZzFbaV0pXSA9IGxhc3Q7CisJCWVsc2UKKwkJCXB2ZWN0b3JbKHVuc2lnbmVkIGNoYXIpKHN0cmluZzFbaV0pXSA9IGxhc3QgPSBzdHJpbmcyW2orK107CisJfQorfQorCisvKiBzdXBwb3J0ZWQgY29uc3RydWN0czoKKyAqICAgUmFuZ2VzLCAgZS5nLiwgIDAtOSAgID09PiAgMDEyMzQ1Njc4OQorICogICBFc2NhcGVzLCBlLmcuLCAgXGEgICAgPT0+ICBDb250cm9sLUcKKyAqICAgQ2hhcmFjdGVyIGNsYXNzZXMsIGUuZy4gWzp1cHBlcjpdID09PiBBLi4uWgorICogICBFcXVpdiBjbGFzc2VzcywgZS5nLiBbPUE9XSA9PT4gQSAgIChobW1tbW1tbT8pCisgKiBub3Qgc3VwcG9ydGVkOgorICogICBcb29vLVxvb28gLSBvY3RhbCByYW5nZXMKKyAqICAgW3gqTl0gLSByZXBlYXQgY2hhciB4IE4gdGltZXMKKyAqICAgW3gqXSAtIHJlcGVhdCBjaGFyIHggdW50aWwgaXQgZmlsbHMgU1RSSU5HMjoKKyAqICMgZWNobyBxd2UxMjMgfCAvdXNyL2Jpbi90ciAxMjM0NTY3ODkgJ1tkXScKKyAqIHF3ZVtkXQorICogIyBlY2hvIHF3ZTEyMyB8IC91c3IvYmluL3RyIDEyMzQ1Njc4OSAnW2QqXScKKyAqIHF3ZWRkZAorICovCitzdGF0aWMgdW5zaWduZWQgZXhwYW5kKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmJ1ZmZlcl9wKQoreworCWNoYXIgKmJ1ZmZlciA9ICpidWZmZXJfcDsKKwl1bnNpZ25lZCBwb3MgPSAwOworCXVuc2lnbmVkIHNpemUgPSBUUl9CVUZTSVo7CisJdW5zaWduZWQgaTsgLyogY2FuJ3QgYmUgdW5zaWduZWQgY2hhcjogbXVzdCBiZSBhYmxlIHRvIGhvbGQgMjU2ICovCisJdW5zaWduZWQgY2hhciBhYzsKKworCXdoaWxlICgqYXJnKSB7CisJCWlmIChwb3MgKyBBU0NJSSA+IHNpemUpIHsKKwkJCXNpemUgKz0gQVNDSUk7CisJCQkqYnVmZmVyX3AgPSBidWZmZXIgPSB4cmVhbGxvYyhidWZmZXIsIHNpemUpOworCQl9CisJCWlmICgqYXJnID09ICdcXCcpIHsKKwkJCWFyZysrOworCQkJYnVmZmVyW3BvcysrXSA9IGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlKCZhcmcpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGFyZ1sxXSA9PSAnLScpIHsgLyogIjAtOS4uLiIgKi8KKwkJCWFjID0gYXJnWzJdOworCQkJaWYgKGFjID09ICdcMCcpIHsgLyogIjAtIjogY29weSB2ZXJiYXRpbSAqLworCQkJCWJ1ZmZlcltwb3MrK10gPSAqYXJnKys7IC8qIGNvcHkgJzAnICovCisJCQkJY29udGludWU7IC8qIG5leHQgaXRlciB3aWxsIGNvcHkgJy0nIGFuZCBzdG9wICovCisJCQl9CisJCQlpID0gKHVuc2lnbmVkIGNoYXIpICphcmc7CisJCQl3aGlsZSAoaSA8PSBhYykgLyogb2s6IGkgaXMgdW5zaWduZWQgX2ludF8gKi8KKwkJCQlidWZmZXJbcG9zKytdID0gaSsrOworCQkJYXJnICs9IDM7IC8qIHNraXAgMC05ICovCisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKEVOQUJMRV9GRUFUVVJFX1RSX0NMQVNTRVMgfHwgRU5BQkxFX0ZFQVRVUkVfVFJfRVFVSVYpCisJCSAmJiAqYXJnID09ICdbJworCQkpIHsKKwkJCWFyZysrOworCQkJaSA9ICh1bnNpZ25lZCBjaGFyKSAqYXJnKys7CisJCQkvKiAiW3h5ei4uLiIuIGk9eCwgYXJnIHBvaW50cyB0byB5ICovCisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfVFJfQ0xBU1NFUyAmJiBpID09ICc6JykgeyAvKiBbOmNsYXNzOl0gKi8KKyNkZWZpbmUgQ0xPICI6XVwwIgorCQkJCXN0YXRpYyBjb25zdCBjaGFyIGNsYXNzZXNbXSBBTElHTjEgPQorCQkJCQkiYWxwaGEiQ0xPICJhbG51bSJDTE8gImRpZ2l0IkNMTworCQkJCQkibG93ZXIiQ0xPICJ1cHBlciJDTE8gInNwYWNlIkNMTworCQkJCQkiYmxhbmsiQ0xPICJwdW5jdCJDTE8gImNudHJsIkNMTworCQkJCQkieGRpZ2l0IkNMTzsKKwkJCQllbnVtIHsKKwkJCQkJQ0xBU1NfaW52YWxpZCA9IDAsIC8qIHdlIGluY3JlbWVudCB0aGUgcmV0dmFsICovCisJCQkJCUNMQVNTX2FscGhhID0gMSwKKwkJCQkJQ0xBU1NfYWxudW0gPSAyLAorCQkJCQlDTEFTU19kaWdpdCA9IDMsCisJCQkJCUNMQVNTX2xvd2VyID0gNCwKKwkJCQkJQ0xBU1NfdXBwZXIgPSA1LAorCQkJCQlDTEFTU19zcGFjZSA9IDYsCisJCQkJCUNMQVNTX2JsYW5rID0gNywKKwkJCQkJQ0xBU1NfcHVuY3QgPSA4LAorCQkJCQlDTEFTU19jbnRybCA9IDksCisJCQkJCUNMQVNTX3hkaWdpdCA9IDEwLAorCQkJCQkvL0NMQVNTX2dyYXBoID0gMTEsCisJCQkJCS8vQ0xBU1NfcHJpbnQgPSAxMiwKKwkJCQl9OworCQkJCXNtYWxsdWludCBqOworCQkJCWNoYXIgKnRtcDsKKworCQkJCS8qIHhkaWdpdCBuZWVkcyA4LCBub3QgNyAqLworCQkJCWkgPSA3ICsgKGFyZ1swXSA9PSAneCcpOworCQkJCXRtcCA9IHhzdHJuZHVwKGFyZywgaSk7CisJCQkJaiA9IGluZGV4X2luX3N0cmluZ3MoY2xhc3NlcywgdG1wKSArIDE7CisJCQkJZnJlZSh0bXApOworCisJCQkJaWYgKGogPT0gQ0xBU1NfaW52YWxpZCkKKwkJCQkJZ290byBza2lwX2JyYWNrZXQ7CisKKwkJCQlhcmcgKz0gaTsKKwkJCQlpZiAoaiA9PSBDTEFTU19hbG51bSB8fCBqID09IENMQVNTX2RpZ2l0IHx8IGogPT0gQ0xBU1NfeGRpZ2l0KSB7CisJCQkJCWZvciAoaSA9ICcwJzsgaSA8PSAnOSc7IGkrKykKKwkJCQkJCWJ1ZmZlcltwb3MrK10gPSBpOworCQkJCX0KKwkJCQlpZiAoaiA9PSBDTEFTU19hbHBoYSB8fCBqID09IENMQVNTX2FsbnVtIHx8IGogPT0gQ0xBU1NfdXBwZXIpIHsKKwkJCQkJZm9yIChpID0gJ0EnOyBpIDw9ICdaJzsgaSsrKQorCQkJCQkJYnVmZmVyW3BvcysrXSA9IGk7CisJCQkJfQorCQkJCWlmIChqID09IENMQVNTX2FscGhhIHx8IGogPT0gQ0xBU1NfYWxudW0gfHwgaiA9PSBDTEFTU19sb3dlcikgeworCQkJCQlmb3IgKGkgPSAnYSc7IGkgPD0gJ3onOyBpKyspCisJCQkJCQlidWZmZXJbcG9zKytdID0gaTsKKwkJCQl9CisJCQkJaWYgKGogPT0gQ0xBU1Nfc3BhY2UgfHwgaiA9PSBDTEFTU19ibGFuaykgeworCQkJCQlidWZmZXJbcG9zKytdID0gJ1x0JzsKKwkJCQkJaWYgKGogPT0gQ0xBU1Nfc3BhY2UpIHsKKwkJCQkJCWJ1ZmZlcltwb3MrK10gPSAnXG4nOworCQkJCQkJYnVmZmVyW3BvcysrXSA9ICdcdic7CisJCQkJCQlidWZmZXJbcG9zKytdID0gJ1xmJzsKKwkJCQkJCWJ1ZmZlcltwb3MrK10gPSAnXHInOworCQkJCQl9CisJCQkJCWJ1ZmZlcltwb3MrK10gPSAnICc7CisJCQkJfQorCQkJCWlmIChqID09IENMQVNTX3B1bmN0IHx8IGogPT0gQ0xBU1NfY250cmwpIHsKKwkJCQkJZm9yIChpID0gJ1wwJzsgaSA8IEFTQ0lJOyBpKyspIHsKKwkJCQkJCWlmICgoaiA9PSBDTEFTU19wdW5jdCAmJiBpc3ByaW50X2FzY2lpb25seShpKSAmJiAhaXNhbG51bShpKSAmJiAhaXNzcGFjZShpKSkKKwkJCQkJCSB8fCAoaiA9PSBDTEFTU19jbnRybCAmJiBpc2NudHJsKGkpKQorCQkJCQkJKSB7CisJCQkJCQkJYnVmZmVyW3BvcysrXSA9IGk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGogPT0gQ0xBU1NfeGRpZ2l0KSB7CisJCQkJCWZvciAoaSA9ICdBJzsgaSA8PSAnRic7IGkrKykgeworCQkJCQkJYnVmZmVyW3BvcyArIDZdID0gaSB8IDB4MjA7CisJCQkJCQlidWZmZXJbcG9zKytdID0gaTsKKwkJCQkJfQorCQkJCQlwb3MgKz0gNjsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiAiW3h5ei4uLiIsIGk9eCwgYXJnIHBvaW50cyB0byB5ICovCisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfVFJfRVFVSVYgJiYgaSA9PSAnPScpIHsgLyogWz1DSEFSPV0gKi8KKwkJCQlidWZmZXJbcG9zKytdID0gKmFyZzsgLyogY29weSBDSEFSICovCisJCQkJaWYgKCFhcmdbMF0gfHwgYXJnWzFdICE9ICc9JyB8fCBhcmdbMl0gIT0gJ10nKQorCQkJCQliYl9zaG93X3VzYWdlKCk7CisJCQkJYXJnICs9IDM7ICAvKiBza2lwIENIQVI9XSAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogVGhlIHJlc3Qgb2YgIlt4eXouLi4iIGNhc2VzIGlzIHRyZWF0ZWQgYXMgbm9ybWFsCisJCQkgKiBzdHJpbmcsICJbIiBoYXMgbm8gc3BlY2lhbCBtZWFuaW5nIGhlcmU6CisJCQkgKiB0ciAiW2Etel0iICJbQS1aXSIgY2FuIGJlIHdyaXR0ZW4gYXMgdHIgImEteiIgIkEtWiIsCisJCQkgKiBhbHNvIHRyeSB0ciAiW2Etel0iICJfQS1aKyIgYW5kIHlvdSdsbCBzZWUgdGhhdAorCQkJICogW10gaXMgbm90IHNwZWNpYWwgaGVyZS4KKwkJCSAqLworIHNraXBfYnJhY2tldDoKKwkJCWFyZyAtPSAyOyAvKiBwb2ludHMgdG8gIlsiIGluICJbeHl6Li4uIiAqLworCQl9CisJCWJ1ZmZlcltwb3MrK10gPSAqYXJnKys7CisJfQorCXJldHVybiBwb3M7Cit9CisKKy8qIE5COiBidWZmZXIgaXMgZ3VhcmFudGVlZCB0byBiZSBhdCBsZWFzdCBUUl9CVUZTSVpFCisgKiAod2hpY2ggaXMgPj0gQVNDSUkpIGJpZy4KKyAqLworc3RhdGljIGludCBjb21wbGVtZW50KGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZmZlcl9sZW4pCit7CisJaW50IGxlbjsKKwljaGFyIGNvbnZbQVNDSUldOworCXVuc2lnbmVkIGNoYXIgY2g7CisKKwlsZW4gPSAwOworCWNoID0gJ1wwJzsKKwl3aGlsZSAoMSkgeworCQlpZiAobWVtY2hyKGJ1ZmZlciwgY2gsIGJ1ZmZlcl9sZW4pID09IE5VTEwpCisJCQljb252W2xlbisrXSA9IGNoOworCQlpZiAoKytjaCA9PSAnXDAnKQorCQkJYnJlYWs7CisJfQorCW1lbWNweShidWZmZXIsIGNvbnYsIGxlbik7CisJcmV0dXJuIGxlbjsKK30KKworaW50IHRyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0cl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisJc21hbGx1aW50IG9wdHM7CisJc3NpemVfdCByZWFkX2NoYXJzOworCXNpemVfdCBpbl9pbmRleCwgb3V0X2luZGV4OworCXVuc2lnbmVkIGxhc3QgPSBVQ0hBUl9NQVggKyAxOyAvKiBub3QgZXF1YWwgdG8gYW55IGNoYXIgKi8KKwl1bnNpZ25lZCBjaGFyIGNvZGVkLCBjOworCWNoYXIgKnN0cjEgPSB4bWFsbG9jKFRSX0JVRlNJWik7CisJY2hhciAqc3RyMiA9IHhtYWxsb2MoVFJfQlVGU0laKTsKKwlpbnQgc3RyMl9sZW5ndGg7CisJaW50IHN0cjFfbGVuZ3RoOworCWNoYXIgKnZlY3RvciA9IHh6YWxsb2MoQVNDSUkgKiAzKTsKKwljaGFyICppbnZlYyAgPSB2ZWN0b3IgKyBBU0NJSTsKKwljaGFyICpvdXR2ZWMgPSB2ZWN0b3IgKyBBU0NJSSAqIDI7CisKKyNkZWZpbmUgVFJfT1BUX2NvbXBsZW1lbnQgICAoMyA8PCAwKQorI2RlZmluZSBUUl9PUFRfZGVsZXRlICAgICAgICgxIDw8IDIpCisjZGVmaW5lIFRSX09QVF9zcXVlZXplX3JlcHMgKDEgPDwgMykKKworCWZvciAoaSA9IDA7IGkgPCBBU0NJSTsgaSsrKSB7CisJCXZlY3RvcltpXSA9IGk7CisJCS8qaW52ZWNbaV0gPSBvdXR2ZWNbaV0gPSBGQUxTRTsgLSBkb25lIGJ5IHh6YWxsb2MgKi8KKwl9CisKKwkvKiAtQy8tYyBkaWZmZXJlbmNlIGlzIHRoYXQgLUMgY29tcGxlbWVudHMgImNoYXJhY3RlcnMiLAorCSAqIGFuZCAtYyBjb21wbGVtZW50cyAidmFsdWVzIiAoYmluYXJ5IGJ5dGVzIEkgZ3Vlc3MpLgorCSAqIEluIFBPU0lYIGxvY2FsZSwgdGhlc2UgYXJlIHRoZSBzYW1lLgorCSAqLworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiK0NjZHMiKTsgLyogJysnOiBzdG9wIGF0IGZpcnN0IG5vbi1vcHRpb24gKi8KKwlhcmd2ICs9IG9wdGluZDsKKworCXN0cjFfbGVuZ3RoID0gZXhwYW5kKCphcmd2KyssICZzdHIxKTsKKwlzdHIyX2xlbmd0aCA9IDA7CisJaWYgKG9wdHMgJiBUUl9PUFRfY29tcGxlbWVudCkKKwkJc3RyMV9sZW5ndGggPSBjb21wbGVtZW50KHN0cjEsIHN0cjFfbGVuZ3RoKTsKKwlpZiAoKmFyZ3YpIHsKKwkJaWYgKGFyZ3ZbMF1bMF0gPT0gJ1wwJykKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJTVFJJTkcyIGNhbm5vdCBiZSBlbXB0eSIpOworCQlzdHIyX2xlbmd0aCA9IGV4cGFuZCgqYXJndiwgJnN0cjIpOworCQltYXAodmVjdG9yLCBzdHIxLCBzdHIxX2xlbmd0aCwKKwkJCQlzdHIyLCBzdHIyX2xlbmd0aCk7CisJfQorCWZvciAoaSA9IDA7IGkgPCBzdHIxX2xlbmd0aDsgaSsrKQorCQlpbnZlY1sodW5zaWduZWQgY2hhcikoc3RyMVtpXSldID0gVFJVRTsKKwlmb3IgKGkgPSAwOyBpIDwgc3RyMl9sZW5ndGg7IGkrKykKKwkJb3V0dmVjWyh1bnNpZ25lZCBjaGFyKShzdHIyW2ldKV0gPSBUUlVFOworCisJZ290byBzdGFydF9mcm9tOworCisJLyogSW4gdGhpcyBsb29wLCBzdHIxIHNwYWNlIGlzIHJldXNlZCBhcyBpbnB1dCBidWZmZXIsCisJICogc3RyMiAtIGFzIG91dHB1dCBvbmUuICovCisJZm9yICg7OykgeworCQkvKiBJZiB3ZSdyZSBvdXQgb2YgaW5wdXQsIGZsdXNoIG91dHB1dCBhbmQgcmVhZCBtb3JlIGlucHV0LiAqLworCQlpZiAoKHNzaXplX3QpaW5faW5kZXggPT0gcmVhZF9jaGFycykgeworCQkJaWYgKG91dF9pbmRleCkgeworCQkJCXh3cml0ZShTVERPVVRfRklMRU5PLCBzdHIyLCBvdXRfaW5kZXgpOworIHN0YXJ0X2Zyb206CisJCQkJb3V0X2luZGV4ID0gMDsKKwkJCX0KKwkJCXJlYWRfY2hhcnMgPSBzYWZlX3JlYWQoU1RESU5fRklMRU5PLCBzdHIxLCBUUl9CVUZTSVopOworCQkJaWYgKHJlYWRfY2hhcnMgPD0gMCkgeworCQkJCWlmIChyZWFkX2NoYXJzIDwgMCkKKwkJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZWFkX2Vycm9yKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWluX2luZGV4ID0gMDsKKwkJfQorCQljID0gc3RyMVtpbl9pbmRleCsrXTsKKwkJaWYgKChvcHRzICYgVFJfT1BUX2RlbGV0ZSkgJiYgaW52ZWNbY10pCisJCQljb250aW51ZTsKKwkJY29kZWQgPSB2ZWN0b3JbY107CisJCWlmICgob3B0cyAmIFRSX09QVF9zcXVlZXplX3JlcHMpICYmIGxhc3QgPT0gY29kZWQKKwkJICYmIChpbnZlY1tjXSB8fCBvdXR2ZWNbY29kZWRdKQorCQkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN0cjJbb3V0X2luZGV4KytdID0gbGFzdCA9IGNvZGVkOworCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlmcmVlKHZlY3Rvcik7CisJCWZyZWUoc3RyMik7CisJCWZyZWUoc3RyMSk7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy90cnVlLmMgYi9jb3JldXRpbHMvdHJ1ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5Zjg5MjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvdHJ1ZS5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgdHJ1ZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudCAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy90cnVlLmh0bWwgKi8KKworLyogInRydWUgLS1oZWxwIiBpcyBzcGVjaWFsLWNhc2VkIHRvIGlnbm9yZSAtLWhlbHAgKi8KKy8vdXNhZ2U6I2RlZmluZSB0cnVlX3RyaXZpYWxfdXNhZ2UgTk9VU0FHRV9TVFIKKy8vdXNhZ2U6I2RlZmluZSB0cnVlX2Z1bGxfdXNhZ2UgIiIKKy8vdXNhZ2U6I2RlZmluZSB0cnVlX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHRydWVcbiIKKy8vdXNhZ2U6ICAgICAgICIkIGVjaG8gJD9cbiIKKy8vdXNhZ2U6ICAgICAgICIwXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitpbnQgdHJ1ZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdHJ1ZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvdHJ1bmNhdGUuYyBiL2NvcmV1dGlscy90cnVuY2F0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZmE2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvdHJ1bmNhdGUuYwpAQCAtMCwwICsxLDg3IEBACisvKgorICogTWluaSB0cnVuY2F0ZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBieSBBcmkgU3VuZGhvbG0gPGFyaUB0dXhlcmEuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9jb25maWc6Y29uZmlnIFRSVU5DQVRFCisvL2NvbmZpZzoJYm9vbCAidHJ1bmNhdGUiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgdHJ1bmNhdGUgdHJ1bmNhdGVzIGZpbGVzIHRvIGEgZ2l2ZW4gc2l6ZS4gSWYgYSBmaWxlIGRvZXMKKy8vY29uZmlnOgkgIG5vdCBleGlzdCwgaXQgaXMgY3JlYXRlZCB1bmxlc3MgdG9sZCBvdGhlcndpc2UuCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19UUlVOQ0FURSkgKz0gdHJ1bmNhdGUubworLy9hcHBsZXQ6SUZfVFJVTkNBVEUoQVBQTEVUX05PRk9SSyh0cnVuY2F0ZSwgdHJ1bmNhdGUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHRydW5jYXRlKSkKKworLy91c2FnZTojZGVmaW5lIHRydW5jYXRlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWNdIC1zIFNJWkUgRklMRS4uLiIKKy8vdXNhZ2U6I2RlZmluZSB0cnVuY2F0ZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZToJIlRydW5jYXRlIEZJTEVzIHRvIHRoZSBnaXZlbiBzaXplXG4iCisvL3VzYWdlOgkiXG4JLWMJRG8gbm90IGNyZWF0ZSBmaWxlcyIKKy8vdXNhZ2U6CSJcbgktcyBTSVpFCVRydW5jYXRlIHRvIFNJWkUiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHRydW5jYXRlX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6CSIkIHRydW5jYXRlIC1zIDFHIGZvbyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZiBFTkFCTEVfTEZTCisjIGRlZmluZSBYQVRPVV9TRlggeGF0b3VsbF9zZngKKyNlbHNlCisjIGRlZmluZSBYQVRPVV9TRlggeGF0b3VsX3NmeAorI2VuZGlmCisKKy8qIFRoaXMgaXMgYSBOT0ZPUksgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKK2ludCB0cnVuY2F0ZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdHJ1bmNhdGVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIG9wdHM7CisJaW50IGZsYWdzID0gT19SRFdSOworCWludCByZXQgPSBFWElUX1NVQ0NFU1M7CisJY2hhciAqc2l6ZV9zdHI7CisJb2ZmX3Qgc2l6ZTsKKworCWVudW0geworCQlPUFRfTk9DUkVBVEUgID0gKDEgPDwgMCksCisJCU9QVF9TSVpFID0gKDEgPDwgMSksCisJfTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gInM6LTEiOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiY3M6IiwgJnNpemVfc3RyKTsKKworCWlmICghKG9wdHMgJiBPUFRfTk9DUkVBVEUpKQorCQlmbGFncyB8PSBPX0NSRUFUOworCisJLy8gVE9ETzogY29yZXV0aWxzIDguMTcgYWxzbyBzdXBwb3J0ICJtIiAobG93ZXJjYXNlKSBzdWZmaXgKKwkvLyB3aXRoIHRydW5jYXRlLCBidXQgbm90IHdpdGggZGQhCisJLy8gV2Ugc2hhcmUga01HX3N1ZmZpeGVzW10sIHNvIHdlIGNhbid0IG1ha2UgYm90aCB0b29scworCS8vIGNvbXBhdGlibGUgYXQgb25jZS4uLgorCXNpemUgPSBYQVRPVV9TRlgoc2l6ZV9zdHIsIGtNR19zdWZmaXhlcyk7CisKKwlhcmd2ICs9IG9wdGluZDsKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJaW50IGZkID0gb3BlbigqYXJndiwgZmxhZ3MpOworCQlpZiAoZmQgPCAwKSB7CisJCQlpZiAoZXJybm8gIT0gRU5PRU5UIHx8ICEob3B0cyAmIE9QVF9OT0NSRUFURSkpIHsKKwkJCQliYl9wZXJyb3JfbXNnKCIlczogb3BlbiIsICphcmd2KTsKKwkJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQl9CisJCQkvKiBlbHNlOiBFTk9FTlQgJiYgT1BUX05PQ1JFQVRFOgorCQkJICogZG8gbm90IHJlcG9ydCBlcnJvciwgZXhpdGNvZGUgaXMgYWxzbyAwLgorCQkJICovCisJCX0gZWxzZSB7CisJCQlpZiAoZnRydW5jYXRlKGZkLCBzaXplKSA9PSAtMSkgeworCQkJCWJiX3BlcnJvcl9tc2coIiVzOiB0cnVuY2F0ZSIsICphcmd2KTsKKwkJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQl9CisJCQl4Y2xvc2UoZmQpOworCQl9CisJCSsrYXJndjsKKwl9CisKKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3R0eS5jIGIvY29yZXV0aWxzL3R0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MTc1MDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvdHR5LmMKQEAgLTAsMCArMSw1NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdHR5IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2NCBjb21wbGlhbnQgKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzk2OTk5MTk3OTkvdXRpbGl0aWVzL3R0eS5odG1sICovCisKKy8vdXNhZ2U6I2RlZmluZSB0dHlfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIiIKKy8vdXNhZ2U6I2RlZmluZSB0dHlfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCBmaWxlIG5hbWUgb2Ygc3RkaW4ncyB0ZXJtaW5hbCIKKy8vdXNhZ2U6CUlGX0lOQ0xVREVfU1VTdjIoICJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJUHJpbnQgbm90aGluZywgb25seSByZXR1cm4gZXhpdCBzdGF0dXMiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHR0eV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCB0dHlcbiIKKy8vdXNhZ2U6ICAgICAgICIvZGV2L3R0eTJcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCB0dHlfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHR0eV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqczsKKwlJRl9JTkNMVURFX1NVU3YyKGludCBzaWxlbnQ7KSAgLyogTm90ZTogTm8gbG9uZ2VyIHJlbGV2YW50IGluIFNVU3YzLiAqLworCWludCByZXR2YWw7CisKKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSAyOyAgLyogU1VTdjMgcmVxdWlyZXMgPiAxIGZvciBlcnJvci4gKi8KKworCUlGX0lOQ0xVREVfU1VTdjIoc2lsZW50ID0gZ2V0b3B0MzIoYXJndiwgInMiKTspCisJSUZfSU5DTFVERV9TVVN2Mihhcmd2ICs9IG9wdGluZDspCisJSUZfTk9UX0lOQ0xVREVfU1VTdjIoYXJndiArPSAxOykKKworCS8qIGdudSB0dHkgb3V0cHV0cyBhIHdhcm5pbmcgdGhhdCBpdCBpcyBpZ25vcmluZyBhbGwgYXJncy4gKi8KKwliYl93YXJuX2lnbm9yaW5nX2FyZ3MoYXJndlswXSk7CisKKwlyZXR2YWwgPSBFWElUX1NVQ0NFU1M7CisKKwlzID0geG1hbGxvY190dHluYW1lKFNURElOX0ZJTEVOTyk7CisJaWYgKHMgPT0gTlVMTCkgeworCS8qIEFjY29yZGluZyB0byBTVVN2MywgdHR5bmFtZSBjYW4gZmFpbCB3aXRoIEVCQURGIG9yIEVOT1RUWS4KKwkgKiBXZSBrbm93IHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgZ29vZCwgc28gZmFpbHVyZSBtZWFucyBub3QgYSB0dHkuICovCisJCXMgPSAibm90IGEgdHR5IjsKKwkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCX0KKwlJRl9JTkNMVURFX1NVU3YyKGlmICghc2lsZW50KSBwdXRzKHMpOykKKwlJRl9OT1RfSU5DTFVERV9TVVN2MihwdXRzKHMpOykKKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQocmV0dmFsKTsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy91bmFtZS5jIGIvY29yZXV0aWxzL3VuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2NzdkMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy91bmFtZS5jCkBAIC0wLDAgKzEsMTczIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIHVuYW1lIC0tIHByaW50IHN5c3RlbSBpbmZvcm1hdGlvbgorICogQ29weXJpZ2h0IChDKSAxOTg5LTE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvdW5hbWUuaHRtbCAqLworCisvKiBPcHRpb24JCUV4YW1wbGUKKyAqIC1zLCAtLXN5c25hbWUJU3VuT1MKKyAqIC1uLCAtLW5vZGVuYW1lCXJvY2t5OAorICogLXIsIC0tcmVsZWFzZQk0LjAKKyAqIC12LCAtLXZlcnNpb24KKyAqIC1tLCAtLW1hY2hpbmUJc3VuCisgKiAtYSwgLS1hbGwJCVN1bk9TIHJvY2t5OCA0LjAgIHN1bgorICoKKyAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIGVxdWl2YWxlbnQgdG8gJy1zJy4KKyAqCisgKiBEYXZpZCBNYWNLZW56aWUgPGRqbUBnbnUuYWkubWl0LmVkdT4KKyAqCisgKiBHTlUgY29yZXV0aWxzIDYuMTA6CisgKiBPcHRpb246ICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCAgIEV4YW1wbGUocyk6CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV0c25hbWUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6CisgKiAtcywgLS1rZXJuZWwtbmFtZSAgICAgICAgICAgIHN5c25hbWUgIExpbnV4CisgKiAtbiwgLS1ub2RlbmFtZSAgICAgICAgICAgICAgIG5vZGVuYW1lIGxvY2FsaG9zdC5sb2NhbGRvbWFpbgorICogLXIsIC0ta2VybmVsLXJlbGVhc2UgICAgICAgICByZWxlYXNlICAyLjYuMjkKKyAqIC12LCAtLWtlcm5lbC12ZXJzaW9uICAgICAgICAgdmVyc2lvbiAgIzEgU01QIFN1biBKYW4gMTEgMjA6NTI6MzcgRVNUIDIwMDkKKyAqIC1tLCAtLW1hY2hpbmUgICAgICAgICAgICAgICAgbWFjaGluZSAgeDg2XzY0ICAgaTY4NgorICogLXAsIC0tcHJvY2Vzc29yICAgICAgICAgICAgICAobm9uZSkgICB4ODZfNjQgICBpNjg2CisgKiAtaSwgLS1oYXJkd2FyZS1wbGF0Zm9ybSAgICAgIChub25lKSAgIHg4Nl82NCAgIGkzODYKKyAqICAgICAgTkI6IHZhbmlsbGEgY29yZXV0aWxzIHJlcG9ydHMgInVua25vd24iIC1wIGFuZCAtaSwKKyAqICAgICAgeDg2XzY0IGFuZCBpNjg2L2kzODYgc2hvd24gYWJvdmUgYXJlIEZlZG9yYSdzIGludmVudGlvbnMuCisgKiAtbywgLS1vcGVyYXRpbmctc3lzdGVtICAgICAgIChub25lKSAgIEdOVS9MaW51eAorICogLWEsIC0tYWxsOiBhbGwgb2YgdGhlIGFib3ZlLCBpbiB0aGUgb3JkZXIgc2hvd24uCisgKiAgICAgIElmIC1wIG9yIC1pIGlzIG5vdCBrbm93biwgZG9uJ3Qgc2hvdyB0aGVtCisgKi8KKworLyogQnVzeWJveGVkIGJ5IEVyaWsgQW5kZXJzZW4KKyAqCisgKiBCZWZvcmUgMjAwMzogR2xlbm4gTWNHcmF0aCBhbmQgTWFudWVsIE5vdm9hIElJSQorICogIEZ1cnRoZXIgc2l6ZSByZWR1Y3Rpb25zLgorICogTWFyIDE2LCAyMDAzOiBNYW51ZWwgTm92b2EgSUlJIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqICBOb3cgZG9lcyBwcm9wZXIgZXJyb3IgY2hlY2tpbmcgb24gaS9vLiAgUGx1cyBzb21lIGZ1cnRoZXIgc3BhY2Ugc2F2aW5ncy4KKyAqIEphbiAyMDA5OgorICogIEZpeCBoYW5kbGluZyBvZiAtYSB0byBub3QgcHJpbnQgInVua25vd24iLCBhZGQgLW8gYW5kIC1pIHN1cHBvcnQuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHVuYW1lX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWFtbnJzcHZpb10iCisvL3VzYWdlOiNkZWZpbmUgdW5hbWVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcmludCBzeXN0ZW0gaW5mb3JtYXRpb25cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJUHJpbnQgYWxsIgorLy91c2FnZTogICAgICJcbgktbQlUaGUgbWFjaGluZSAoaGFyZHdhcmUpIHR5cGUiCisvL3VzYWdlOiAgICAgIlxuCS1uCUhvc3RuYW1lIgorLy91c2FnZTogICAgICJcbgktcglLZXJuZWwgcmVsZWFzZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJS2VybmVsIG5hbWUgKGRlZmF1bHQpIgorLy91c2FnZTogICAgICJcbgktcAlQcm9jZXNzb3IgdHlwZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJS2VybmVsIHZlcnNpb24iCisvL3VzYWdlOiAgICAgIlxuCS1pCVRoZSBoYXJkd2FyZSBwbGF0Zm9ybSIKKy8vdXNhZ2U6ICAgICAiXG4JLW8JT1MgbmFtZSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdW5hbWVfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgdW5hbWUgLWFcbiIKKy8vdXNhZ2U6ICAgICAgICJMaW51eCBkZWJpYW4gMi40LjIzICMyIFR1ZSBEZWMgMjMgMTc6MDk6MTAgTVNUIDIwMDMgaTY4NiBHTlUvTGludXhcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisvKiBBZnRlciBsaWJiYi5oLCBzaW5jZSBpdCBuZWVkcyBzeXMvdHlwZXMuaCBvbiBzb21lIHN5c3RlbXMgKi8KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorCit0eXBlZGVmIHN0cnVjdCB7CisJc3RydWN0IHV0c25hbWUgbmFtZTsKKwljaGFyIHByb2Nlc3NvcltzaXplb2YoKChzdHJ1Y3QgdXRzbmFtZSopTlVMTCktPm1hY2hpbmUpXTsKKwljaGFyIHBsYXRmb3JtW3NpemVvZigoKHN0cnVjdCB1dHNuYW1lKilOVUxMKS0+bWFjaGluZSldOworCWNoYXIgb3Nbc2l6ZW9mKENPTkZJR19VTkFNRV9PU05BTUUpXTsKK30gdW5hbWVfaW5mb190OworCitzdGF0aWMgY29uc3QgY2hhciBvcHRpb25zW10gQUxJR04xID0gInNucnZtcGlvYSI7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgdXRzbmFtZV9vZmZzZXRbXSA9IHsKKwlvZmZzZXRvZih1bmFtZV9pbmZvX3QsIG5hbWUuc3lzbmFtZSksIC8qIC1zICovCisJb2Zmc2V0b2YodW5hbWVfaW5mb190LCBuYW1lLm5vZGVuYW1lKSwgLyogLW4gKi8KKwlvZmZzZXRvZih1bmFtZV9pbmZvX3QsIG5hbWUucmVsZWFzZSksIC8qIC1yICovCisJb2Zmc2V0b2YodW5hbWVfaW5mb190LCBuYW1lLnZlcnNpb24pLCAvKiAtdiAqLworCW9mZnNldG9mKHVuYW1lX2luZm9fdCwgbmFtZS5tYWNoaW5lKSwgLyogLW0gKi8KKwlvZmZzZXRvZih1bmFtZV9pbmZvX3QsIHByb2Nlc3NvciksIC8qIC1wICovCisJb2Zmc2V0b2YodW5hbWVfaW5mb190LCBwbGF0Zm9ybSksIC8qIC1pICovCisJb2Zmc2V0b2YodW5hbWVfaW5mb190LCBvcyksIC8qIC1vICovCit9OworCitpbnQgdW5hbWVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHVuYW1lX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKyNpZiBFTkFCTEVfTE9OR19PUFRTCisJc3RhdGljIGNvbnN0IGNoYXIgdW5hbWVfbG9uZ29wdHNbXSBBTElHTjEgPQorCQkvKiBuYW1lLCBoYXNfYXJnLCB2YWwgKi8KKwkJImFsbFwwIiAgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJhIgorCQkia2VybmVsLW5hbWVcMCIgICAgICAgTm9fYXJndW1lbnQgICAgICAgInMiCisJCSJub2RlbmFtZVwwIiAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAibiIKKwkJImtlcm5lbC1yZWxlYXNlXDAiICAgIE5vX2FyZ3VtZW50ICAgICAgICJyIgorCQkicmVsZWFzZVwwIiAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInIiCisJCSJrZXJuZWwtdmVyc2lvblwwIiAgICBOb19hcmd1bWVudCAgICAgICAidiIKKwkJIm1hY2hpbmVcMCIgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJtIgorCQkicHJvY2Vzc29yXDAiICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInAiCisJCSJoYXJkd2FyZS1wbGF0Zm9ybVwwIiBOb19hcmd1bWVudCAgICAgICAiaSIKKwkJIm9wZXJhdGluZy1zeXN0ZW1cMCIgIE5vX2FyZ3VtZW50ICAgICAgICJvIgorCTsKKyNlbmRpZgorCXVuYW1lX2luZm9fdCB1bmFtZV9pbmZvOworI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fbGludXhfXykKKwljaGFyICpmYWtlX3NwYXJjID0gZ2V0ZW52KCJGQUtFX1NQQVJDIik7CisjZW5kaWYKKwljb25zdCBjaGFyICp1bmtub3duX3N0ciA9ICJ1bmtub3duIjsKKwljb25zdCBjaGFyICpmbXQ7CisJY29uc3QgdW5zaWduZWQgc2hvcnQgKmRlbHRhOworCXVuc2lnbmVkIHRvcHJpbnQ7CisKKwlJRl9MT05HX09QVFMoYXBwbGV0X2xvbmdfb3B0aW9ucyA9IHVuYW1lX2xvbmdvcHRzKTsKKwl0b3ByaW50ID0gZ2V0b3B0MzIoYXJndiwgb3B0aW9ucyk7CisKKwlpZiAoYXJndltvcHRpbmRdKSB7IC8qIGNvcmV1dGlscy02LjkgY29tcGF0ICovCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlpZiAodG9wcmludCAmICgxIDw8IDgpKSB7IC8qIC1hID0+IGFsbCBvcHRzIG9uICovCisJCXRvcHJpbnQgPSAoMSA8PCA4KSAtIDE7CisJCXVua25vd25fc3RyID0gIiI7IC8qIC1hIGRvZXMgbm90IHByaW50IHVua25vd24gZmllbGRzICovCisJfQorCisJaWYgKHRvcHJpbnQgPT0gMCkgeyAvKiBubyBvcHRzID0+IC1zIChzeXNuYW1lKSAqLworCQl0b3ByaW50ID0gMTsKKwl9CisKKwl1bmFtZSgmdW5hbWVfaW5mby5uYW1lKTsgLyogbmV2ZXIgZmFpbHMgKi8KKworI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiBkZWZpbmVkKF9fbGludXhfXykKKwlpZiAoZmFrZV9zcGFyYyAmJiAoZmFrZV9zcGFyY1swXSB8IDB4MjApID09ICd5JykgeworCQlzdHJjcHkodW5hbWVfaW5mby5uYW1lLm1hY2hpbmUsICJzcGFyYyIpOworCX0KKyNlbmRpZgorCXN0cmNweSh1bmFtZV9pbmZvLnByb2Nlc3NvciwgdW5rbm93bl9zdHIpOworCXN0cmNweSh1bmFtZV9pbmZvLnBsYXRmb3JtLCB1bmtub3duX3N0cik7CisJc3RyY3B5KHVuYW1lX2luZm8ub3MsIENPTkZJR19VTkFNRV9PU05BTUUpOworI2lmIDAKKwkvKiBGZWRvcmEgZG9lcyBzb21ldGhpbmcgbGlrZSB0aGlzICovCisJc3RyY3B5KHVuYW1lX2luZm8ucHJvY2Vzc29yLCB1bmFtZV9pbmZvLm5hbWUubWFjaGluZSk7CisJc3RyY3B5KHVuYW1lX2luZm8ucGxhdGZvcm0sIHVuYW1lX2luZm8ubmFtZS5tYWNoaW5lKTsKKwlpZiAodW5hbWVfaW5mby5wbGF0Zm9ybVswXSA9PSAnaScKKwkgJiYgdW5hbWVfaW5mby5wbGF0Zm9ybVsxXQorCSAmJiB1bmFtZV9pbmZvLnBsYXRmb3JtWzJdID09ICc4JworCSAmJiB1bmFtZV9pbmZvLnBsYXRmb3JtWzNdID09ICc2JworCSkgeworCQl1bmFtZV9pbmZvLnBsYXRmb3JtWzFdID0gJzMnOworCX0KKyNlbmRpZgorCisJZGVsdGEgPSB1dHNuYW1lX29mZnNldDsKKwlmbXQgPSAiICVzIiArIDE7CisJZG8geworCQlpZiAodG9wcmludCAmIDEpIHsKKwkJCWNvbnN0IGNoYXIgKnAgPSAoY2hhciAqKSgmdW5hbWVfaW5mbykgKyAqZGVsdGE7CisJCQlpZiAocFswXSkgeworCQkJCXByaW50ZihmbXQsIHApOworCQkJCWZtdCA9ICIgJXMiOworCQkJfQorCQl9CisJCSsrZGVsdGE7CisJfSB3aGlsZSAodG9wcmludCA+Pj0gMSk7CisJYmJfcHV0Y2hhcignXG4nKTsKKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsgLyogY29yZXV0aWxzLTYuOSBjb21wYXQgKi8KK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy91bmlxLmMgYi9jb3JldXRpbHMvdW5pcS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwMTMzOTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvdW5pcS5jCkBAIC0wLDAgKzEsMTI0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB1bmlxIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1ICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBjb21wbGlhbnQgKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvdW5pcS5odG1sICovCisKKy8vdXNhZ2U6I2RlZmluZSB1bmlxX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWNkdV1bLWYscyx3IE5dIFtJTlBVVCBbT1VUUFVUXV0iCisvL3VzYWdlOiNkZWZpbmUgdW5pcV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRpc2NhcmQgZHVwbGljYXRlIGxpbmVzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCVByZWZpeCBsaW5lcyBieSB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIgorLy91c2FnZTogICAgICJcbgktZAlPbmx5IHByaW50IGR1cGxpY2F0ZSBsaW5lcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXUJT25seSBwcmludCB1bmlxdWUgbGluZXMiCisvL3VzYWdlOiAgICAgIlxuCS1mIE4JU2tpcCBmaXJzdCBOIGZpZWxkcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgTglTa2lwIGZpcnN0IE4gY2hhcnMgKGFmdGVyIGFueSBza2lwcGVkIGZpZWxkcykiCisvL3VzYWdlOiAgICAgIlxuCS13IE4JQ29tcGFyZSBOIGNoYXJhY3RlcnMgaW4gbGluZSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdW5pcV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBlY2hvIC1lIFwiYVxcbmFcXG5iXFxuY1xcbmNcXG5hXCIgfCBzb3J0IHwgdW5pcVxuIgorLy91c2FnZTogICAgICAgImFcbiIKKy8vdXNhZ2U6ICAgICAgICJiXG4iCisvL3VzYWdlOiAgICAgICAiY1xuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IHVuaXFfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHVuaXFfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKmlucHV0X2ZpbGVuYW1lOworCXVuc2lnbmVkIHNraXBfZmllbGRzLCBza2lwX2NoYXJzLCBtYXhfY2hhcnM7CisJdW5zaWduZWQgb3B0OworCWNoYXIgKmN1cl9saW5lOworCWNvbnN0IGNoYXIgKmN1cl9jb21wYXJlOworCisJZW51bSB7CisJCU9QVF9jID0gMHgxLAorCQlPUFRfZCA9IDB4MiwgLyogcHJpbnQgb25seSBkdXBzICovCisJCU9QVF91ID0gMHg0LCAvKiBwcmludCBvbmx5IHVuaXEgKi8KKwkJT1BUX2YgPSAweDgsCisJCU9QVF9zID0gMHgxMCwKKwkJT1BUX3cgPSAweDIwLAorCX07CisKKwlza2lwX2ZpZWxkcyA9IHNraXBfY2hhcnMgPSAwOworCW1heF9jaGFycyA9IElOVF9NQVg7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJmKzpzKzp3KyI7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImNkdWY6czp3OiIsICZza2lwX2ZpZWxkcywgJnNraXBfY2hhcnMsICZtYXhfY2hhcnMpOworCWFyZ3YgKz0gb3B0aW5kOworCisJaW5wdXRfZmlsZW5hbWUgPSBhcmd2WzBdOworCWlmIChpbnB1dF9maWxlbmFtZSkgeworCQljb25zdCBjaGFyICpvdXRwdXQ7CisKKwkJaWYgKGlucHV0X2ZpbGVuYW1lWzBdICE9ICctJyB8fCBpbnB1dF9maWxlbmFtZVsxXSkgeworCQkJY2xvc2UoU1RESU5fRklMRU5PKTsgLyogPT0gMCAqLworCQkJeG9wZW4oaW5wdXRfZmlsZW5hbWUsIE9fUkRPTkxZKTsgLyogZmQgd2lsbCBiZSAwICovCisJCX0KKwkJb3V0cHV0ID0gYXJndlsxXTsKKwkJaWYgKG91dHB1dCkgeworCQkJaWYgKGFyZ3ZbMl0pCisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJaWYgKG91dHB1dFswXSAhPSAnLScgfHwgb3V0cHV0WzFdKSB7CisJCQkJLy8gV29uJ3Qgd29yayB3aXRoICJ1bmlxIC0gRklMRSIgYW5kIGNsb3NlZCBzdGRpbjoKKwkJCQkvL2Nsb3NlKFNURE9VVF9GSUxFTk8pOworCQkJCS8veG9wZW4ob3V0cHV0LCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DKTsKKwkJCQl4bW92ZV9mZCh4b3BlbihvdXRwdXQsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMpLCBTVERPVVRfRklMRU5PKTsKKwkJCX0KKwkJfQorCX0KKworCWN1cl9jb21wYXJlID0gY3VyX2xpbmUgPSBOVUxMOyAvKiBwcmltZSB0aGUgcHVtcCAqLworCisJZG8geworCQl1bnNpZ25lZCBpOworCQl1bnNpZ25lZCBsb25nIGR1cHM7CisJCWNoYXIgKm9sZF9saW5lOworCQljb25zdCBjaGFyICpvbGRfY29tcGFyZTsKKworCQlvbGRfbGluZSA9IGN1cl9saW5lOworCQlvbGRfY29tcGFyZSA9IGN1cl9jb21wYXJlOworCQlkdXBzID0gMDsKKworCQkvKiBnbnUgdW5pcSBpZ25vcmVzIG5ld2xpbmVzICovCisJCXdoaWxlICgoY3VyX2xpbmUgPSB4bWFsbG9jX2ZnZXRsaW5lKHN0ZGluKSkgIT0gTlVMTCkgeworCQkJY3VyX2NvbXBhcmUgPSBjdXJfbGluZTsKKwkJCWZvciAoaSA9IHNraXBfZmllbGRzOyBpOyBpLS0pIHsKKwkJCQljdXJfY29tcGFyZSA9IHNraXBfd2hpdGVzcGFjZShjdXJfY29tcGFyZSk7CisJCQkJY3VyX2NvbXBhcmUgPSBza2lwX25vbl93aGl0ZXNwYWNlKGN1cl9jb21wYXJlKTsKKwkJCX0KKwkJCWZvciAoaSA9IHNraXBfY2hhcnM7ICpjdXJfY29tcGFyZSAmJiBpOyBpLS0pIHsKKwkJCQkrK2N1cl9jb21wYXJlOworCQkJfQorCisJCQlpZiAoIW9sZF9saW5lIHx8IHN0cm5jbXAob2xkX2NvbXBhcmUsIGN1cl9jb21wYXJlLCBtYXhfY2hhcnMpKSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWZyZWUoY3VyX2xpbmUpOworCQkJKytkdXBzOyAgLyogdGVzdGluZyBmb3Igb3ZlcmZsb3cgc2VlbXMgZXhjZXNzaXZlICovCisJCX0KKworCQlpZiAob2xkX2xpbmUpIHsKKwkJCWlmICghKG9wdCAmIChPUFRfZCA8PCAhIWR1cHMpKSkgeyAvKiAoaWYgZHVwcywgb3B0ICYgT1BUX3UpICovCisJCQkJaWYgKG9wdCAmIE9QVF9jKSB7CisJCQkJCS8qICU3bHUgbWF0Y2hlcyBHTlUgY29yZXV0aWxzIDYuOSAqLworCQkJCQlwcmludGYoIiU3bHUgIiwgZHVwcyArIDEpOworCQkJCX0KKwkJCQlwdXRzKG9sZF9saW5lKTsKKwkJCX0KKwkJCWZyZWUob2xkX2xpbmUpOworCQl9CisJfSB3aGlsZSAoY3VyX2xpbmUpOworCisJZGllX2lmX2ZlcnJvcihzdGRpbiwgaW5wdXRfZmlsZW5hbWUpOworCisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChFWElUX1NVQ0NFU1MpOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3VubGluay5jIGIvY29yZXV0aWxzL3VubGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiN2QwZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvdW5saW5rLmMKQEAgLTAsMCArMSwzNCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiB1bmxpbmsgZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgSXNhYWMgRHVuaGFtIDxpYmlkLmFnQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZQorICovCisKKy8vY29uZmlnOmNvbmZpZyBVTkxJTksKKy8vY29uZmlnOglib29sICJ1bmxpbmsiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgdW5saW5rIGRlbGV0ZXMgYSBmaWxlIGJ5IGNhbGxpbmcgdW5saW5rKCkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1VOTElOSykgKz0gdW5saW5rLm8KKworLy9hcHBsZXQ6SUZfVU5MSU5LKEFQUExFVCh1bmxpbmssIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL3VzYWdlOiNkZWZpbmUgdW5saW5rX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSJGSUxFIgorLy91c2FnZTojZGVmaW5lIHVubGlua19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZToJIkRlbGV0ZSBGSUxFIGJ5IGNhbGxpbmcgdW5saW5rKCkiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgdW5saW5rX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB1bmxpbmtfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0xIjsgLyogbXVzdCBoYXZlIGV4YWN0bHkgMSBwYXJhbSAqLworCWdldG9wdDMyKGFyZ3YsICIiKTsKKwlhcmd2ICs9IG9wdGluZDsKKwl4dW5saW5rKGFyZ3ZbMF0pOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3VzbGVlcC5jIGIvY29yZXV0aWxzL3VzbGVlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNGViNTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvdXNsZWVwLmMKQEAgLTAsMCArMSwzNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdXNsZWVwIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBOL0EgLS0gQXBwYXJlbnRseSBhIGJ1c3lib3ggZXh0ZW5zaW9uLiAqLworCisvL3VzYWdlOiNkZWZpbmUgdXNsZWVwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJOIgorLy91c2FnZTojZGVmaW5lIHVzbGVlcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlBhdXNlIGZvciBOIG1pY3Jvc2Vjb25kcyIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdXNsZWVwX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHVzbGVlcCAxMDAwMDAwXG4iCisvL3VzYWdlOiAgICAgICAiW3BhdXNlcyBmb3IgMSBzZWNvbmRdXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGlzIGEgTk9GT1JLIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCitpbnQgdXNsZWVwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB1c2xlZXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWlmICghYXJndlsxXSkgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJdXNsZWVwKHhhdG91KGFyZ3ZbMV0pKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvdXVkZWNvZGUuYyBiL2NvcmV1dGlscy91dWRlY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3YjI1NGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvdXVkZWNvZGUuYwpAQCAtMCwwICsxLDI1MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IDIwMDMsIEdsZW5uIE1jR3JhdGgKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIEJhc2VkIG9uIHNwZWNpZmljYXRpb24gZnJvbQorICogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy91dWVuY29kZS5odG1sCisgKgorICogQnVnczogdGhlIHNwZWMgZG9lc24ndCBtZW50aW9uIGFueXRoaW5nIGFib3V0ICJgXG5gXG4iIHByaW9yIHRvIHRoZQorICogImVuZCIgbGluZQorICovCisKKy8vdXNhZ2U6I2RlZmluZSB1dWRlY29kZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1vIE9VVEZJTEVdIFtJTkZJTEVdIgorLy91c2FnZTojZGVmaW5lIHV1ZGVjb2RlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVXVkZWNvZGUgYSBmaWxlXG4iCisvL3VzYWdlOiAgICAgICAiRmluZHMgT1VURklMRSBpbiB1dWVuY29kZWQgc291cmNlIHVubGVzcyAtbyBpcyBnaXZlbiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdXVkZWNvZGVfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgdXVkZWNvZGUgLW8gYnVzeWJveCBidXN5Ym94LnV1XG4iCisvL3VzYWdlOiAgICAgICAiJCBscyAtbCBidXN5Ym94XG4iCisvL3VzYWdlOiAgICAgICAiLXJ3eHIteHIteCAgIDEgYW1zICAgICAgYW1zICAgICAgICAyNDUyNjQgSnVuICA3IDIxOjM1IGJ1c3lib3hcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZiBFTkFCTEVfVVVERUNPREUKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyByZWFkX3N0ZHV1KEZJTEUgKnNyY19zdHJlYW0sIEZJTEUgKmRzdF9zdHJlYW0sIGludCBmbGFncyBVTlVTRURfUEFSQU0pCit7CisJY2hhciAqbGluZTsKKworCWZvciAoOzspIHsKKwkJaW50IGVuY29kZWRfbGVuLCBzdHJfbGVuOworCQljaGFyICpsaW5lX3B0ciwgKmRzdDsKKwkJc2l6ZV90IGxpbmVfbGVuOworCisJCWxpbmVfbGVuID0gNjQgKiAxMDI0OworCQlsaW5lID0geG1hbGxvY19mZ2V0c19zdHJfbGVuKHNyY19zdHJlYW0sICJcbiIsICZsaW5lX2xlbik7CisJCWlmICghbGluZSkKKwkJCWJyZWFrOworCQkvKiBIYW5kbGUgYm90aCBVbml4IGFuZCBNU0RPUyB0ZXh0LCBhbmQgc3RyYXkgdHJhaWxpbmcgc3BhY2VzICovCisJCXN0cl9sZW4gPSBsaW5lX2xlbjsKKwkJd2hpbGUgKC0tc3RyX2xlbiA+PSAwICYmIGlzc3BhY2UobGluZVtzdHJfbGVuXSkpCisJCQlsaW5lW3N0cl9sZW5dID0gJ1wwJzsKKworCQlpZiAoc3RyY21wKGxpbmUsICJlbmQiKSA9PSAwKSB7CisJCQlyZXR1cm47IC8qIHRoZSBvbmx5IG5vbi1lcnJvciBleGl0ICovCisJCX0KKworCQlsaW5lX3B0ciA9IGxpbmU7CisJCXdoaWxlICgqbGluZV9wdHIpIHsKKwkJCSpsaW5lX3B0ciA9ICgqbGluZV9wdHIgLSAweDIwKSAmIDB4M2Y7CisJCQlsaW5lX3B0cisrOworCQl9CisJCXN0cl9sZW4gPSBsaW5lX3B0ciAtIGxpbmU7CisKKwkJZW5jb2RlZF9sZW4gPSBsaW5lWzBdICogNCAvIDM7CisJCS8qIENoZWNrIHRoYXQgbGluZSBpcyBub3QgdG9vIHNob3J0LiAod2UgdG9sZXJhdGUKKwkJICogb3Zlcmx5IF9sb25nXyBsaW5lIHRvIGFjY29tbW9kYXRlIHBvc3NpYmxlIGV4dHJhICdgJykuCisJCSAqIEVtcHR5IGxpbmUgY2FzZSBpcyBhbHNvIGNhdWdodCBoZXJlLiAqLworCQlpZiAoc3RyX2xlbiA8PSBlbmNvZGVkX2xlbikgeworCQkJYnJlYWs7IC8qIGdvIHRvIGJiX2Vycm9yX21zZ19hbmRfZGllKCJzaG9ydCBmaWxlIik7ICovCisJCX0KKwkJaWYgKGVuY29kZWRfbGVuIDw9IDApIHsKKwkJCS8qIElnbm9yZSB0aGUgImBcbiIgbGluZSwgd2h5IGlzIGl0IGV2ZW4gaW4gdGhlIGVuY29kZSBmaWxlID8gKi8KKwkJCWZyZWUobGluZSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoZW5jb2RlZF9sZW4gPiA2MCkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImxpbmUgdG9vIGxvbmciKTsKKwkJfQorCisJCWRzdCA9IGxpbmU7CisJCWxpbmVfcHRyID0gbGluZSArIDE7CisJCWRvIHsKKwkJCS8qIE1lcmdlIGZvdXIgNiBiaXQgY2hhcnMgdG8gdGhyZWUgOCBiaXQgY2hhcnMgKi8KKwkJCSpkc3QrKyA9IGxpbmVfcHRyWzBdIDw8IDIgfCBsaW5lX3B0clsxXSA+PiA0OworCQkJZW5jb2RlZF9sZW4tLTsKKwkJCWlmIChlbmNvZGVkX2xlbiA9PSAwKSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCSpkc3QrKyA9IGxpbmVfcHRyWzFdIDw8IDQgfCBsaW5lX3B0clsyXSA+PiAyOworCQkJZW5jb2RlZF9sZW4tLTsKKwkJCWlmIChlbmNvZGVkX2xlbiA9PSAwKSB7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCSpkc3QrKyA9IGxpbmVfcHRyWzJdIDw8IDYgfCBsaW5lX3B0clszXTsKKwkJCWxpbmVfcHRyICs9IDQ7CisJCQllbmNvZGVkX2xlbiAtPSAyOworCQl9IHdoaWxlIChlbmNvZGVkX2xlbiA+IDApOworCQlmd3JpdGUobGluZSwgMSwgZHN0IC0gbGluZSwgZHN0X3N0cmVhbSk7CisJCWZyZWUobGluZSk7CisJfQorCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzaG9ydCBmaWxlIik7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9VVURFQ09ERQoraW50IHV1ZGVjb2RlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB1dWRlY29kZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJRklMRSAqc3JjX3N0cmVhbTsKKwljaGFyICpvdXRuYW1lID0gTlVMTDsKKwljaGFyICpsaW5lOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPzEiOyAvKiAxIGFyZ3VtZW50IG1heCAqLworCWdldG9wdDMyKGFyZ3YsICJvOiIsICZvdXRuYW1lKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmICghYXJndlswXSkKKwkJKi0tYXJndiA9IChjaGFyKikiLSI7CisJc3JjX3N0cmVhbSA9IHhmb3Blbl9zdGRpbihhcmd2WzBdKTsKKworCS8qIFNlYXJjaCBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBlbmNvZGluZyAqLworCXdoaWxlICgobGluZSA9IHhtYWxsb2NfZmdldGxpbmUoc3JjX3N0cmVhbSkpICE9IE5VTEwpIHsKKwkJdm9pZCBGQVNUX0ZVTkMgKCpkZWNvZGVfZm5fcHRyKShGSUxFICpzcmMsIEZJTEUgKmRzdCwgaW50IGZsYWdzKTsKKwkJY2hhciAqbGluZV9wdHI7CisJCUZJTEUgKmRzdF9zdHJlYW07CisJCWludCBtb2RlOworCisJCWlmIChpc19wcmVmaXhlZF93aXRoKGxpbmUsICJiZWdpbi1iYXNlNjQgIikpIHsKKwkJCWxpbmVfcHRyID0gbGluZSArIDEzOworCQkJZGVjb2RlX2ZuX3B0ciA9IHJlYWRfYmFzZTY0OworCQl9IGVsc2UgaWYgKGlzX3ByZWZpeGVkX3dpdGgobGluZSwgImJlZ2luICIpKSB7CisJCQlsaW5lX3B0ciA9IGxpbmUgKyA2OworCQkJZGVjb2RlX2ZuX3B0ciA9IHJlYWRfc3RkdXU7CisJCX0gZWxzZSB7CisJCQlmcmVlKGxpbmUpOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBiZWdpbiBsaW5lIGZvdW5kLiBkZWNvZGUgYW5kIGV4aXQgKi8KKwkJbW9kZSA9IGJiX3N0cnRvdShsaW5lX3B0ciwgTlVMTCwgOCk7CisJCWlmIChvdXRuYW1lID09IE5VTEwpIHsKKwkJCW91dG5hbWUgPSBzdHJjaHIobGluZV9wdHIsICcgJyk7CisJCQlpZiAoIW91dG5hbWUpCisJCQkJYnJlYWs7CisJCQlvdXRuYW1lKys7CisJCQl0cmltKG91dG5hbWUpOyAvKiByZW1vdmUgdHJhaWxpbmcgc3BhY2UgKGFuZCAnXHInIGZvciBET1MgdGV4dCkgKi8KKwkJCWlmICghb3V0bmFtZVswXSkKKwkJCQlicmVhazsKKwkJfQorCQlkc3Rfc3RyZWFtID0gc3Rkb3V0OworCQlpZiAoTk9UX0xPTkVfREFTSChvdXRuYW1lKSkgeworCQkJZHN0X3N0cmVhbSA9IHhmb3Blbl9mb3Jfd3JpdGUob3V0bmFtZSk7CisJCQlmY2htb2QoZmlsZW5vKGRzdF9zdHJlYW0pLCBtb2RlICYgKFNfSVJXWFUgfCBTX0lSV1hHIHwgU19JUldYTykpOworCQl9CisJCWZyZWUobGluZSk7CisJCWRlY29kZV9mbl9wdHIoc3JjX3N0cmVhbSwgZHN0X3N0cmVhbSwgLypmbGFnczoqLyBCQVNFNjRfRkxBR19VVV9TVE9QICsgQkFTRTY0X0ZMQUdfTk9fU1RPUF9DSEFSKTsKKwkJLyogZmNsb3NlX2lmX25vdF9zdGRpbihzcmNfc3RyZWFtKTsgLSByZWR1bmRhbnQgKi8KKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vICdiZWdpbicgbGluZSIpOworfQorI2VuZGlmCisKKy8vYXBwbGV0OklGX0JBU0U2NChBUFBMRVQoYmFzZTY0LCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfQkFTRTY0KSArPSB1dWRlY29kZS5vCisKKy8vY29uZmlnOmNvbmZpZyBCQVNFNjQKKy8vY29uZmlnOglib29sICJiYXNlNjQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQmFzZTY0IGVuY29kZSBhbmQgZGVjb2RlCisKKy8vdXNhZ2U6I2RlZmluZSBiYXNlNjRfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIlstZF0gW0ZJTEVdIgorLy91c2FnZTojZGVmaW5lIGJhc2U2NF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkJhc2U2NCBlbmNvZGUgb3IgZGVjb2RlIEZJTEUgdG8gc3RhbmRhcmQgb3V0cHV0IgorLy91c2FnZTogICAgICJcbgktZAlEZWNvZGUgZGF0YSIKKy8vLy91c2FnZTogICAgICJcbgktdyBDT0wJV3JhcCBsaW5lcyBhdCBDT0wgKGRlZmF1bHQgNzYsIDAgZGlzYWJsZXMpIgorLy8vL3VzYWdlOiAgICAgIlxuCS1pCVdoZW4gZGVjb2RpbmcsIGlnbm9yZSBub24tYWxwaGFiZXQgY2hhcmFjdGVycyIKKworI2lmIEVOQUJMRV9CQVNFNjQKK2ludCBiYXNlNjRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGJhc2U2NF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJRklMRSAqc3JjX3N0cmVhbTsKKwl1bnNpZ25lZCBvcHRzOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPzEiOyAvKiAxIGFyZ3VtZW50IG1heCAqLworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiZCIpOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKCFhcmd2WzBdKQorCQkqLS1hcmd2ID0gKGNoYXIqKSItIjsKKwlzcmNfc3RyZWFtID0geGZvcGVuX3N0ZGluKGFyZ3ZbMF0pOworCWlmIChvcHRzKSB7CisJCXJlYWRfYmFzZTY0KHNyY19zdHJlYW0sIHN0ZG91dCwgLypmbGFnczoqLyAoY2hhcilFT0YpOworCX0gZWxzZSB7CisJCWVudW0geworCQkJU1JDX0JVRl9TSVpFID0gNzYvNCozLCAgLyogVGhpcyAqTVVTVCogYmUgYSBtdWx0aXBsZSBvZiAzICovCisJCQlEU1RfQlVGX1NJWkUgPSA0ICogKChTUkNfQlVGX1NJWkUgKyAyKSAvIDMpLAorCQl9OworCQljaGFyIHNyY19idWZbU1JDX0JVRl9TSVpFXTsKKwkJY2hhciBkc3RfYnVmW0RTVF9CVUZfU0laRSArIDFdOworCQlpbnQgc3JjX2ZkID0gZmlsZW5vKHNyY19zdHJlYW0pOworCQl3aGlsZSAoMSkgeworCQkJc2l6ZV90IHNpemUgPSBmdWxsX3JlYWQoc3JjX2ZkLCBzcmNfYnVmLCBTUkNfQlVGX1NJWkUpOworCQkJaWYgKCFzaXplKQorCQkJCWJyZWFrOworCQkJaWYgKChzc2l6ZV90KXNpemUgPCAwKQorCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcmVhZF9lcnJvcik7CisJCQkvKiBFbmNvZGUgdGhlIGJ1ZmZlciB3ZSBqdXN0IHJlYWQgaW4gKi8KKwkJCWJiX3V1ZW5jb2RlKGRzdF9idWYsIHNyY19idWYsIHNpemUsIGJiX3V1ZW5jX3RibF9iYXNlNjQpOworCQkJeHdyaXRlKFNURE9VVF9GSUxFTk8sIGRzdF9idWYsIDQgKiAoKHNpemUgKyAyKSAvIDMpKTsKKwkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCQlmZmx1c2goc3Rkb3V0KTsKKwkJfQorCX0KKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKK30KKyNlbmRpZgorCisvKiBUZXN0IHNjcmlwdC4KK1B1dCB0aGlzIGludG8gYW4gZW1wdHkgZGlyIHdpdGggYnVzeWJveCBiaW5hcnksIGFuIHJ1bi4KKworIyEvYmluL3NoCit0ZXN0IC14IGJ1c3lib3ggfHwgeyBlY2hvICJObyAuL2J1c3lib3g/IjsgZXhpdDsgfQorbG4gLXNmIGJ1c3lib3ggdXVkZWNvZGUKK2xuIC1zZiBidXN5Ym94IHV1ZW5jb2RlCis+QV9udWxsCitlY2hvIC1uIEEgPkEKK2VjaG8gLW4gQUIgPkFCCitlY2hvIC1uIEFCQyA+QUJDCitlY2hvIC1uIEFCQ0QgPkFCQ0QKK2VjaG8gLW4gQUJDREUgPkFCQ0RFCitlY2hvIC1uIEFCQ0RFRiA+QUJDREVGCitjYXQgYnVzeWJveCA+QV9iYm94Citmb3IgZiBpbiBBKjsgZG8KKyAgICBlY2hvIHV1ZW5jb2RlICRmCisgICAgLi91dWVuY29kZSAgICAkZiA8JGYgPnVfJGYKKyAgICAuL3V1ZW5jb2RlIC1tICRmIDwkZiA+bV8kZgorZG9uZQorbWtkaXIgdW5wa191IHVucGtfbSAyPi9kZXYvbnVsbAorZm9yIGYgaW4gdV8qOyBkbworICAgIC4vdXVkZWNvZGUgPCRmIC1vIHVucGtfdS8ke2Y6Mn0KKyAgICBkaWZmIC1hICR7ZjoyfSB1bnBrX3UvJHtmOjJ9ID4vZGV2L251bGwgMj4mMQorICAgIGVjaG8gdXVkZWNvZGUgJGY6ICQ/Citkb25lCitmb3IgZiBpbiBtXyo7IGRvCisgICAgLi91dWRlY29kZSA8JGYgLW8gdW5wa19tLyR7ZjoyfQorICAgIGRpZmYgLWEgJHtmOjJ9IHVucGtfbS8ke2Y6Mn0gPi9kZXYvbnVsbCAyPiYxCisgICAgZWNobyB1dWRlY29kZSAkZjogJD8KK2RvbmUKKyovCmRpZmYgLS1naXQgYS9jb3JldXRpbHMvdXVlbmNvZGUuYyBiL2NvcmV1dGlscy91dWVuY29kZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3M2VmMzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvdXVlbmNvZGUuYwpAQCAtMCwwICsxLDc0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiAgQ29weXJpZ2h0IChDKSAyMDAwIGJ5IEdsZW5uIE1jR3JhdGgKKyAqCisgKiAgYmFzZWQgb24gdGhlIGZ1bmN0aW9uIGJhc2U2NF9lbmNvZGUgZnJvbSBodHRwLmMgaW4gd2dldCB2MS42CisgKiAgQ29weXJpZ2h0IChDKSAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAyMDAwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHV1ZW5jb2RlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLW1dIFtGSUxFXSBTVE9SRURfRklMRU5BTUUiCisvL3VzYWdlOiNkZWZpbmUgdXVlbmNvZGVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJVdWVuY29kZSBGSUxFIChvciBzdGRpbikgdG8gc3Rkb3V0XG4iCisvL3VzYWdlOiAgICAgIlxuCS1tCVVzZSBiYXNlNjQgZW5jb2RpbmcgcGVyIFJGQzE1MjEiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHV1ZW5jb2RlX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHV1ZW5jb2RlIGJ1c3lib3ggYnVzeWJveFxuIgorLy91c2FnZTogICAgICAgImJlZ2luIDc1NSBidXN5Ym94XG4iCisvL3VzYWdlOiAgICAgICAiPGVuY29kZWQgZmlsZSBzbmlwcGVkPlxuIgorLy91c2FnZTogICAgICAgIiQgdXVkZWNvZGUgYnVzeWJveCBidXN5Ym94ID4gYnVzeWJveC51dVxuIgorLy91c2FnZTogICAgICAgIiRcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2VudW0geworCVNSQ19CVUZfU0laRSA9IDE1KjMsICAvKiBUaGlzICpNVVNUKiBiZSBhIG11bHRpcGxlIG9mIDMgKi8KKwlEU1RfQlVGX1NJWkUgPSA0ICogKChTUkNfQlVGX1NJWkUgKyAyKSAvIDMpLAorfTsKKworaW50IHV1ZW5jb2RlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB1dWVuY29kZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHN0YXQgc3RhdF9idWY7CisJaW50IHNyY19mZCA9IFNURElOX0ZJTEVOTzsKKwljb25zdCBjaGFyICp0Ymw7CisJbW9kZV90IG1vZGU7CisJY2hhciBzcmNfYnVmW1NSQ19CVUZfU0laRV07CisJY2hhciBkc3RfYnVmW0RTVF9CVUZfU0laRSArIDFdOworCisJdGJsID0gYmJfdXVlbmNfdGJsX3N0ZDsKKwltb2RlID0gMDY2NiAmIH51bWFzaygwNjY2KTsKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMTo/MiI7IC8qIG11c3QgaGF2ZSAxIG9yIDIgYXJncyAqLworCWlmIChnZXRvcHQzMihhcmd2LCAibSIpKSB7CisJCXRibCA9IGJiX3V1ZW5jX3RibF9iYXNlNjQ7CisJfQorCWFyZ3YgKz0gb3B0aW5kOworCWlmIChhcmd2WzFdKSB7CisJCXNyY19mZCA9IHhvcGVuKGFyZ3ZbMF0sIE9fUkRPTkxZKTsKKwkJZnN0YXQoc3JjX2ZkLCAmc3RhdF9idWYpOworCQltb2RlID0gc3RhdF9idWYuc3RfbW9kZSAmIChTX0lSV1hVIHwgU19JUldYRyB8IFNfSVJXWE8pOworCQlhcmd2Kys7CisJfQorCisJcHJpbnRmKCJiZWdpbiVzICVvICVzIiwgdGJsID09IGJiX3V1ZW5jX3RibF9zdGQgPyAiIiA6ICItYmFzZTY0IiwgbW9kZSwgKmFyZ3YpOworCXdoaWxlICgxKSB7CisJCXNpemVfdCBzaXplID0gZnVsbF9yZWFkKHNyY19mZCwgc3JjX2J1ZiwgU1JDX0JVRl9TSVpFKTsKKwkJaWYgKCFzaXplKQorCQkJYnJlYWs7CisJCWlmICgoc3NpemVfdClzaXplIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcmVhZF9lcnJvcik7CisJCS8qIEVuY29kZSB0aGUgYnVmZmVyIHdlIGp1c3QgcmVhZCBpbiAqLworCQliYl91dWVuY29kZShkc3RfYnVmLCBzcmNfYnVmLCBzaXplLCB0YmwpOworCQliYl9wdXRjaGFyKCdcbicpOworCQlpZiAodGJsID09IGJiX3V1ZW5jX3RibF9zdGQpIHsKKwkJCWJiX3B1dGNoYXIodGJsW3NpemVdKTsKKwkJfQorCQlmZmx1c2goc3Rkb3V0KTsKKwkJeHdyaXRlKFNURE9VVF9GSUxFTk8sIGRzdF9idWYsIDQgKiAoKHNpemUgKyAyKSAvIDMpKTsKKwl9CisJcHJpbnRmKHRibCA9PSBiYl91dWVuY190Ymxfc3RkID8gIlxuYFxuZW5kXG4iIDogIlxuPT09PVxuIik7CisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KEVYSVRfU1VDQ0VTUyk7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvd2MuYyBiL2NvcmV1dGlscy93Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MTBlNDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMvd2MuYwpAQCAtMCwwICsxLDI0MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogd2MgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudC4gKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvd2MuaHRtbCAqLworCisvKiBNYXIgMTYsIDIwMDMgICAgICBNYW51ZWwgTm92b2EgSUlJICAgKG1qbjNAY29kZXBvZXQub3JnKQorICoKKyAqIFJld3JpdHRlbiB0byBmaXggYSBudW1iZXIgb2YgcHJvYmxlbXMgYW5kIGRvIHNvbWUgc2l6ZSBvcHRpbWl6YXRpb25zLgorICogUHJvYmxlbXMgaW4gdGhlIHByZXZpb3VzIGJ1c3lib3ggaW1wbGVtZW50YXRpb24gKGJlc2lkZXMgYmxvYXQpIGluY2x1ZGVkOgorICogIDEpIGJyb2tlbiAnd2MgLWMnIG9wdGltaXphdGlvbiAocmVhZCBub3RlIGJlbG93KQorICogIDIpIGJyb2tlbiBoYW5kbGluZyBvZiAnLScgYXJncworICogIDMpIG5vIGNoZWNraW5nIG9mIGZlcnJvciBvbiBFT0YgcmV0dXJucworICogIDQpIGlzcHJpbnQoKSB3YXNuJ3QgY29uc2lkZXJlZCB3aGVuIHdvcmQgY291bnRpbmcuCisgKgorICogTk9URVM6CisgKgorICogVGhlIHByZXZpb3VzIGJ1c3lib3ggd2MgYXR0ZW1wdGVkIGFuIG9wdGltaXphdGlvbiB1c2luZyBzdGF0IGZvciB0aGUKKyAqIGNhc2Ugb2YgY291bnRpbmcgY2hhcnMgb25seS4gIEkgb21pdHRlZCB0aGF0IGJlY2F1c2UgaXQgd2FzIGJyb2tlbi4KKyAqIEl0IGRpZG4ndCB0YWtlIGludG8gYWNjb3VudCB0aGUgcG9zc2liaWxpdHkgb2YgaW5wdXQgY29taW5nIGZyb20gYQorICogcGlwZSwgb3IgaW5wdXQgZnJvbSBhIGZpbGUgd2l0aCBmaWxlIHBvaW50ZXIgbm90IGF0IHRoZSBiZWdpbm5pbmcuCisgKgorICogVG8gaW1wbGVtZW50IHN1Y2ggYSBzcGVlZCBvcHRpbWl6YXRpb24gY29ycmVjdGx5LCBub3Qgb25seSBkbyB5b3UKKyAqIG5lZWQgdGhlIHNpemUsIGJ1dCBhbHNvIHRoZSBmaWxlIHBvc2l0aW9uLiAgTm90ZSBhbHNvIHRoYXQgdGhlCisgKiBmaWxlIHBvc2l0aW9uIG1heSBiZSBwYXN0IHRoZSBlbmQgb2YgZmlsZS4gIENvbnNpZGVyIHRoZSBleGFtcGxlCisgKiAoYWRhcHRlZCBmcm9tIGV4YW1wbGUgaW4gZ251IHdjLmMpCisgKgorICogICAgICBlY2hvIGhlbGxvID4gL3RtcC90ZXN0ZmlsZSAmJgorICogICAgICAoZGQgaWJzPTFrIHNraXA9MSBjb3VudD0wICY+IC9kZXYvbnVsbDsgd2MgLWMpIDwgL3RtcC90ZXN0ZmlsZQorICoKKyAqIGZvciB3aGljaCAnd2MgLWMnIHNob3VsZCBvdXRwdXQgJzAnLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ1bmljb2RlLmgiCisKKyNpZiAhRU5BQkxFX0xPQ0FMRV9TVVBQT1JUCisjIHVuZGVmIGlzcHJpbnQKKyMgdW5kZWYgaXNzcGFjZQorIyBkZWZpbmUgaXNwcmludChjKSAoKHVuc2lnbmVkKSgoYykgLSAweDIwKSA8PSAoMHg3ZSAtIDB4MjApKQorIyBkZWZpbmUgaXNzcGFjZShjKSAoKGMpID09ICcgJykKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfV0NfTEFSR0UKKyMgZGVmaW5lIENPVU5UX1QgdW5zaWduZWQgbG9uZyBsb25nCisjIGRlZmluZSBDT1VOVF9GTVQgImxsdSIKKyNlbHNlCisjIGRlZmluZSBDT1VOVF9UIHVuc2lnbmVkCisjIGRlZmluZSBDT1VOVF9GTVQgInUiCisjZW5kaWYKKworLyogV2Ugc3VwcG9ydCAtbSBldmVuIHdoZW4gVU5JQ09ERV9TVVBQT1JUIGlzIG9mZiwKKyAqIHdlIGp1c3QgZG9uJ3QgYWR2ZXJ0aXNlIGl0IGluIGhlbHAgdGV4dCwKKyAqIHNpbmNlIGl0IGlzIHRoZSBzYW1lIGFzIC1jIGluIHRoaXMgY2FzZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgd2NfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYyJJRl9VTklDT0RFX1NVUFBPUlQoIm0iKSJsd0xdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgd2NfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb3VudCBsaW5lcywgd29yZHMsIGFuZCBieXRlcyBmb3IgZWFjaCBGSUxFIChvciBzdGRpbilcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJQ291bnQgYnl0ZXMiCisvL3VzYWdlOglJRl9VTklDT0RFX1NVUFBPUlQoCisvL3VzYWdlOiAgICAgIlxuCS1tCUNvdW50IGNoYXJhY3RlcnMiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1sCUNvdW50IG5ld2xpbmVzIgorLy91c2FnZTogICAgICJcbgktdwlDb3VudCB3b3JkcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUwJUHJpbnQgbG9uZ2VzdCBsaW5lIGxlbmd0aCIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgd2NfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgd2MgL2V0Yy9wYXNzd2RcbiIKKy8vdXNhZ2U6ICAgICAgICIgICAgIDMxICAgICAgNDYgICAgMTM2NSAvZXRjL3Bhc3N3ZFxuIgorCisvKiBPcmRlciBpcyBpbXBvcnRhbnQgaWYgd2Ugd2FudCB0byBiZSBjb21wYXRpYmxlIHdpdGgKKyAqIGNvbHVtbiBvcmRlciBpbiAid2MgLWNtbHdMIiBvdXRwdXQ6CisgKi8KK2VudW0geworCVdDX0xJTkVTICAgID0gMCwgLyogLWwgKi8KKwlXQ19XT1JEUyAgICA9IDEsIC8qIC13ICovCisJV0NfVU5JQ0hBUlMgPSAyLCAvKiAtbSAqLworCVdDX0JZVEVTICAgID0gMywgLyogLWMgKi8KKwlXQ19MRU5HVEggICA9IDQsIC8qIC1MICovCisJTlVNX1dDUyAgICAgPSA1LAorfTsKKworaW50IHdjX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB3Y19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqYXJnOworCWNvbnN0IGNoYXIgKnN0YXJ0X2ZtdCA9ICIgJTkiQ09VTlRfRk1UICsgMTsKKwljb25zdCBjaGFyICpmbmFtZV9mbXQgPSAiICVzXG4iOworCUNPVU5UX1QgKnBjb3VudHM7CisJQ09VTlRfVCBjb3VudHNbTlVNX1dDU107CisJQ09VTlRfVCB0b3RhbHNbTlVNX1dDU107CisJaW50IG51bV9maWxlczsKKwlzbWFsbGludCBzdGF0dXMgPSBFWElUX1NVQ0NFU1M7CisJdW5zaWduZWQgcHJpbnRfdHlwZTsKKworCWluaXRfdW5pY29kZSgpOworCisJcHJpbnRfdHlwZSA9IGdldG9wdDMyKGFyZ3YsICJsd21jTCIpOworCisJaWYgKHByaW50X3R5cGUgPT0gMCkgeworCQlwcmludF90eXBlID0gKDEgPDwgV0NfTElORVMpIHwgKDEgPDwgV0NfV09SRFMpIHwgKDEgPDwgV0NfQllURVMpOworCX0KKworCWFyZ3YgKz0gb3B0aW5kOworCWlmICghYXJndlswXSkgeworCQkqLS1hcmd2ID0gKGNoYXIgKikgYmJfbXNnX3N0YW5kYXJkX2lucHV0OworCQlmbmFtZV9mbXQgPSAiXG4iOworCX0KKwlpZiAoIWFyZ3ZbMV0pIHsgLyogemVybyBvciBvbmUgZmlsZW5hbWU/ICovCisJCWlmICghKChwcmludF90eXBlLTEpICYgcHJpbnRfdHlwZSkpIC8qIGV4YWN0bHkgb25lIG9wdGlvbj8gKi8KKwkJCXN0YXJ0X2ZtdCA9ICIlIkNPVU5UX0ZNVDsKKwl9CisKKwltZW1zZXQodG90YWxzLCAwLCBzaXplb2YodG90YWxzKSk7CisKKwlwY291bnRzID0gY291bnRzOworCisJbnVtX2ZpbGVzID0gMDsKKwl3aGlsZSAoKGFyZyA9ICphcmd2KyspICE9IE5VTEwpIHsKKwkJRklMRSAqZnA7CisJCWNvbnN0IGNoYXIgKnM7CisJCXVuc2lnbmVkIHU7CisJCXVuc2lnbmVkIGxpbmVwb3M7CisJCXNtYWxsaW50IGluX3dvcmQ7CisKKwkJKytudW1fZmlsZXM7CisJCWZwID0gZm9wZW5fb3Jfd2Fybl9zdGRpbihhcmcpOworCQlpZiAoIWZwKSB7CisJCQlzdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJCQljb250aW51ZTsKKwkJfQorCisJCW1lbXNldChjb3VudHMsIDAsIHNpemVvZihjb3VudHMpKTsKKwkJbGluZXBvcyA9IDA7CisJCWluX3dvcmQgPSAwOworCisJCXdoaWxlICgxKSB7CisJCQlpbnQgYzsKKwkJCS8qIE91ciAtdyBkb2Vzbid0IG1hdGNoIEdOVSB3YyBleGFjdGx5Li4uIG9oIHdlbGwgKi8KKworCQkJYyA9IGdldGMoZnApOworCQkJaWYgKGMgPT0gRU9GKSB7CisJCQkJaWYgKGZlcnJvcihmcCkpIHsKKwkJCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coYXJnKTsKKwkJCQkJc3RhdHVzID0gRVhJVF9GQUlMVVJFOworCQkJCX0KKwkJCQlnb3RvIERPX0VPRjsgIC8qIFRyZWF0IGFuIEVPRiBhcyAnXHInLiAqLworCQkJfQorCisJCQkvKiBDYXRlciBmb3IgLWMgYW5kIC1tICovCisJCQkrK2NvdW50c1tXQ19CWVRFU107CisJCQlpZiAodW5pY29kZV9zdGF0dXMgIT0gVU5JQ09ERV9PTiAvKiBldmVyeSBieXRlIGlzIGEgbmV3IGNoYXIgKi8KKwkJCSB8fCAoYyAmIDB4YzApICE9IDB4ODAgLyogaXQgaXNuJ3QgYSAybmQrIGJ5dGUgb2YgYSBVbmljb2RlIGNoYXIgKi8KKwkJCSkgeworCQkJCSsrY291bnRzW1dDX1VOSUNIQVJTXTsKKwkJCX0KKworCQkJaWYgKGlzcHJpbnRfYXNjaWlvbmx5KGMpKSB7IC8qIEZJWE1FOiBub3QgdW5pY29kZS1hd2FyZSAqLworCQkJCSsrbGluZXBvczsKKwkJCQlpZiAoIWlzc3BhY2UoYykpIHsKKwkJCQkJaW5fd29yZCA9IDE7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoKHVuc2lnbmVkKShjIC0gOSkgPD0gNCkgeworCQkJCS8qIFx0ICA5CisJCQkJICogXG4gMTAKKwkJCQkgKiBcdiAxMQorCQkJCSAqIFxmIDEyCisJCQkJICogXHIgMTMKKwkJCQkgKi8KKwkJCQlpZiAoYyA9PSAnXHQnKSB7CisJCQkJCWxpbmVwb3MgPSAobGluZXBvcyB8IDcpICsgMTsKKwkJCQl9IGVsc2UgeyAgLyogJ1xuJywgJ1xyJywgJ1xmJywgb3IgJ1x2JyAqLworIERPX0VPRjoKKwkJCQkJaWYgKGxpbmVwb3MgPiBjb3VudHNbV0NfTEVOR1RIXSkgeworCQkJCQkJY291bnRzW1dDX0xFTkdUSF0gPSBsaW5lcG9zOworCQkJCQl9CisJCQkJCWlmIChjID09ICdcbicpIHsKKwkJCQkJCSsrY291bnRzW1dDX0xJTkVTXTsKKwkJCQkJfQorCQkJCQlpZiAoYyAhPSAnXHYnKSB7CisJCQkJCQlsaW5lcG9zID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCWNvdW50c1tXQ19XT1JEU10gKz0gaW5fd29yZDsKKwkJCWluX3dvcmQgPSAwOworCQkJaWYgKGMgPT0gRU9GKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlmY2xvc2VfaWZfbm90X3N0ZGluKGZwKTsKKworCQlpZiAodG90YWxzW1dDX0xFTkdUSF0gPCBjb3VudHNbV0NfTEVOR1RIXSkgeworCQkJdG90YWxzW1dDX0xFTkdUSF0gPSBjb3VudHNbV0NfTEVOR1RIXTsKKwkJfQorCQl0b3RhbHNbV0NfTEVOR1RIXSAtPSBjb3VudHNbV0NfTEVOR1RIXTsKKworIE9VVFBVVDoKKwkJLyogY29yZXV0aWxzIHdjIHRyaWVzIGhhcmQgdG8gcHJpbnQgcHJldHR5IGNvbHVtbnMKKwkJICogKHNhdmVzIHJlc3VsdHMgZm9yIGFsbCBmaWxlcywgZmluZHMgbWF4IGNvbCBsZW4gZXRjLi4uKQorCQkgKiB3ZSB3b24ndCB0cnkgdGhhdCBoYXJkLCBpdCB3aWxsIGJsb2F0IHVzIHRvbyBtdWNoICovCisJCXMgPSBzdGFydF9mbXQ7CisJCXUgPSAwOworCQlkbyB7CisJCQlpZiAocHJpbnRfdHlwZSAmICgxIDw8IHUpKSB7CisJCQkJcHJpbnRmKHMsIHBjb3VudHNbdV0pOworCQkJCXMgPSAiICU5IkNPVU5UX0ZNVDsgLyogT2suLi4gcmVzdG9yZSB0aGUgbGVhZGluZyBzcGFjZS4gKi8KKwkJCX0KKwkJCXRvdGFsc1t1XSArPSBwY291bnRzW3VdOworCQl9IHdoaWxlICgrK3UgPCBOVU1fV0NTKTsKKwkJcHJpbnRmKGZuYW1lX2ZtdCwgYXJnKTsKKwl9CisKKwkvKiBJZiBtb3JlIHRoYW4gb25lIGZpbGUgd2FzIHByb2Nlc3NlZCwgd2Ugd2FudCB0aGUgdG90YWxzLiAgVG8gc2F2ZSBzb21lCisJICogc3BhY2UsIHdlIHNldCB0aGUgcGNvdW50cyBwdHIgdG8gdGhlIHRvdGFscyBhcnJheS4gIFRoaXMgaGFzIHRoZSBzaWRlCisJICogZWZmZWN0IG9mIHRyYXNoaW5nIHRoZSB0b3RhbHMgYXJyYXkgYWZ0ZXIgb3V0cHV0dGluZyBpdCwgYnV0IHRoYXQncworCSAqIGlycmVsYXZlbnQgc2luY2Ugd2Ugbm8gbG9uZ2VyIG5lZWQgaXQuICovCisJaWYgKG51bV9maWxlcyA+IDEpIHsKKwkJbnVtX2ZpbGVzID0gMDsgIC8qIE1ha2Ugc3VyZSB3ZSBkb24ndCBnZXQgaGVyZSBhZ2Fpbi4gKi8KKwkJYXJnID0gInRvdGFsIjsKKwkJcGNvdW50cyA9IHRvdGFsczsKKwkJLS1hcmd2OworCQlnb3RvIE9VVFBVVDsKKwl9CisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9jb3JldXRpbHMvd2hvLmMgYi9jb3JldXRpbHMvd2hvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY5NGQwYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmV1dGlscy93aG8uYwpAQCAtMCwwICsxLDEzMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIE1pbmkgd2hvIGlzIHVzZWQgdG8gZGlzcGxheSB1c2VyIG5hbWUsIGxvZ2luIHRpbWUsCisgKiBpZGxlIHRpbWUgYW5kIGhvc3QgbmFtZS4KKyAqCisgKiBBdXRob3I6IERhIENoZW4gIDxkY2hlbkBheXJuZXR3b3Jrcy5jb20+CisgKgorICogVGhpcyBpcyBhIGZyZWUgZG9jdW1lbnQ7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOgorICogICAgaHR0cDovL3d3dy5nbnUub3JnL2NvcHlsZWZ0L2dwbC5odG1sCisgKgorICogQ29weXJpZ2h0IChjKSAyMDAyIEFZUiBOZXR3b3JrcywgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKi8KKy8qIEJCX0FVRElUIFNVU3YzIF9OT1RfIGNvbXBsaWFudCAtLSBtaXNzaW5nIG9wdGlvbnMgLWIsIC1kLCAtbCwgLW0sIC1wLCAtcSwgLXIsIC1zLCAtdCwgLVQsIC11OyBNaXNzaW5nIGFyZ3VtZW50ICdmaWxlJy4gICovCisKKy8vY29uZmlnOmNvbmZpZyBXSE8KKy8vY29uZmlnOiAgICAgIGJvb2wgIndobyIKKy8vY29uZmlnOiAgICAgIGRlZmF1bHQgeQorLy9jb25maWc6ICAgICAgZGVwZW5kcyBvbiBGRUFUVVJFX1VUTVAKKy8vY29uZmlnOiAgICAgIGhlbHAKKy8vY29uZmlnOiAgICAgICAgd2hvIGlzIHVzZWQgdG8gc2hvdyB3aG8gaXMgbG9nZ2VkIG9uLgorCisvL2NvbmZpZzpjb25maWcgVVNFUlMKKy8vY29uZmlnOiAgICAgIGJvb2wgInVzZXJzIgorLy9jb25maWc6ICAgICAgZGVmYXVsdCB5CisvL2NvbmZpZzogICAgICBkZXBlbmRzIG9uIEZFQVRVUkVfVVRNUAorLy9jb25maWc6ICAgICAgaGVscAorLy9jb25maWc6ICAgICAgICBQcmludCB1c2VycyBjdXJyZW50bHkgbG9nZ2VkIG9uLgorCisvL2FwcGxldDpJRl9VU0VSUyhBUFBMRVRfT0RETkFNRSh1c2Vycywgd2hvLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCB1c2VycykpCisvL2FwcGxldDpJRl9XSE8oICBBUFBMRVQoICB3aG8sIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfVVNFUlMpICs9IHdoby5vCisvL2tidWlsZDpsaWItJChDT05GSUdfV0hPKSArPSB3aG8ubworCisvL3VzYWdlOiNkZWZpbmUgdXNlcnNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIiIKKy8vdXNhZ2U6I2RlZmluZSB1c2Vyc19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IHRoZSB1c2VycyBjdXJyZW50bHkgbG9nZ2VkIG9uIgorCisvL3VzYWdlOiNkZWZpbmUgd2hvX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWFdIgorLy91c2FnZTojZGVmaW5lIHdob19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNob3cgd2hvIGlzIGxvZ2dlZCBvblxuIgorLy91c2FnZTogICAgICJcbgktYQlTaG93IGFsbCIKKy8vdXNhZ2U6ICAgICAiXG4JLUgJUHJpbnQgY29sdW1uIGhlYWRlcnMiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdGF0aWMgdm9pZCBpZGxlX3N0cmluZyhjaGFyICpzdHI2LCB0aW1lX3QgdCkKK3sKKwl0ID0gdGltZShOVUxMKSAtIHQ7CisKKwkvKmlmICh0IDwgNjApIHsKKwkJc3RyNlswXSA9ICcuJzsKKwkJc3RyNlsxXSA9ICdcMCc7CisJCXJldHVybjsKKwl9Ki8KKwlpZiAodCA+PSAwICYmIHQgPCAoMjQgKiA2MCAqIDYwKSkgeworCQlzcHJpbnRmKHN0cjYsICIlMDJkOiUwMmQiLAorCQkJCShpbnQpICh0IC8gKDYwICogNjApKSwKKwkJCQkoaW50KSAoKHQgJSAoNjAgKiA2MCkpIC8gNjApKTsKKwkJcmV0dXJuOworCX0KKwlzdHJjcHkoc3RyNiwgIm9sZCIpOworfQorCitpbnQgd2hvX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB3aG9fbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB1dG1weCAqdXQ7CisJdW5zaWduZWQgb3B0OworCWludCBkb191c2VycyA9IChFTkFCTEVfVVNFUlMgJiYgKCFFTkFCTEVfV0hPIHx8IGFwcGxldF9uYW1lWzBdID09ICd1JykpOworCWNvbnN0IGNoYXIgKmZtdCA9ICIlcyI7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MCI7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgZG9fdXNlcnMgPyAiIiA6ICJhSCIpOworCWlmIChvcHQgJiAyKSAvLyAtSAorCQlwdXRzKCJVU0VSXHRcdFRUWVx0XHRJRExFXHRUSU1FXHRcdCBIT1NUIik7CisKKwlzZXR1dHhlbnQoKTsKKwl3aGlsZSAoKHV0ID0gZ2V0dXR4ZW50KCkpICE9IE5VTEwpIHsKKwkJaWYgKHV0LT51dF91c2VyWzBdCisJCSAmJiAoKG9wdCAmIDEpIHx8IHV0LT51dF90eXBlID09IFVTRVJfUFJPQ0VTUykKKwkJKSB7CisJCQlpZiAoIWRvX3VzZXJzKSB7CisJCQkJY2hhciBzdHI2WzZdOworCQkJCWNoYXIgbmFtZVtzaXplb2YoIi9kZXYvIikgKyBzaXplb2YodXQtPnV0X2xpbmUpICsgMV07CisJCQkJc3RydWN0IHN0YXQgc3Q7CisJCQkJdGltZV90IHNlY29uZHM7CisKKwkJCQlzdHI2WzBdID0gJz8nOworCQkJCXN0cjZbMV0gPSAnXDAnOworCQkJCXN0cmNweShuYW1lLCAiL2Rldi8iKTsKKwkJCQlzYWZlX3N0cm5jcHkodXQtPnV0X2xpbmVbMF0gPT0gJy8nID8gbmFtZSA6IG5hbWUgKyBzaXplb2YoIi9kZXYvIiktMSwKKwkJCQkJdXQtPnV0X2xpbmUsCisJCQkJCXNpemVvZih1dC0+dXRfbGluZSkrMQorCQkJCSk7CisJCQkJaWYgKHN0YXQobmFtZSwgJnN0KSA9PSAwKQorCQkJCQlpZGxlX3N0cmluZyhzdHI2LCBzdC5zdF9hdGltZSk7CisJCQkJLyogbWFucGFnZXMgc2F5IHV0X3R2LnR2X3NlYyAqaXMqIHRpbWVfdCwKKwkJCQkgKiBidXQgc29tZSBzeXN0ZW1zIGhhdmUgaXQgd3JvbmcgKi8KKwkJCQlzZWNvbmRzID0gdXQtPnV0X3R2LnR2X3NlYzsKKwkJCQkvKiBIb3cgd2lkZSB0aW1lIGZpZWxkIGNhbiBiZT8KKwkJCQkgKiAiTm92IDEwIDE5OjMzOjIwIjogMTUgY2hhcnMKKwkJCQkgKiAiMjAxMC0xMS0xMCAxOTozMyI6IDE2IGNoYXJzCisJCQkJICovCisJCQkJcHJpbnRmKCIlLTE1LipzICUtMTUuKnMgJS03cyAlLTE2LjE2cyAlLipzXG4iLAorCQkJCQkJKGludClzaXplb2YodXQtPnV0X3VzZXIpLCB1dC0+dXRfdXNlciwKKwkJCQkJCShpbnQpc2l6ZW9mKHV0LT51dF9saW5lKSwgdXQtPnV0X2xpbmUsCisJCQkJCQlzdHI2LAorCQkJCQkJY3RpbWUoJnNlY29uZHMpICsgNCwKKwkJCQkJCShpbnQpc2l6ZW9mKHV0LT51dF9ob3N0KSwgdXQtPnV0X2hvc3QKKwkJCQkpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGYoZm10LCB1dC0+dXRfdXNlcik7CisJCQkJZm10ID0gIiAlcyI7CisJCQl9CisJCX0KKwl9CisJaWYgKGRvX3VzZXJzKQorCQliYl9wdXRjaGFyKCdcbicpOworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZW5kdXR4ZW50KCk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2NvcmV1dGlscy93aG9hbWkuYyBiL2NvcmV1dGlscy93aG9hbWkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGIxN2NhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZXV0aWxzL3dob2FtaS5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgd2hvYW1pIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwICBFZHdhcmQgQmV0dHMgPGVkd2FyZEBkZWJpYW4ub3JnPi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIE4vQSAtLSBNYXRjaGVzIEdOVSBiZWhhdmlvci4gKi8KKworLy91c2FnZTojZGVmaW5lIHdob2FtaV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIHdob2FtaV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IHRoZSB1c2VyIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IGVmZmVjdGl2ZSB1c2VyIGlkIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworaW50IHdob2FtaV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgd2hvYW1pX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJaWYgKGFyZ3ZbMV0pCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCS8qIFdpbGwgY29tcGxhaW4gYW5kIGRpZSBpZiB1c2VybmFtZSBub3QgZm91bmQgKi8KKwlwdXRzKHh1aWQydW5hbWUoZ2V0ZXVpZCgpKSk7CisKKwlyZXR1cm4gZmZsdXNoX2FsbCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZXV0aWxzL3llcy5jIGIvY29yZXV0aWxzL3llcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNzk5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JldXRpbHMveWVzLmMKQEAgLTAsMCArMSw0NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogeWVzIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBOL0EgLS0gTWF0Y2hlcyBHTlUgYmVoYXZpb3IuICovCisKKy8qIE1hciAxNiwgMjAwMyAgICAgIE1hbnVlbCBOb3ZvYSBJSUkgICAobWpuM0Bjb2RlcG9ldC5vcmcpCisgKgorICogU2l6ZSByZWR1Y3Rpb25zIGFuZCByZW1vdmVkIHJlZHVuZGFudCBhcHBsZXQgbmFtZSBwcmVmaXggZnJvbSBlcnJvciBtZXNzYWdlcy4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhpcyBpcyBhIE5PRk9SSyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworLy91c2FnZTojZGVmaW5lIHllc190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW1NUUklOR10iCisvL3VzYWdlOiNkZWZpbmUgeWVzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVwZWF0ZWRseSBvdXRwdXQgYSBsaW5lIHdpdGggU1RSSU5HLCBvciAneSciCisKK2ludCB5ZXNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHllc19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqKnBwOworCisJYXJndlswXSA9IChjaGFyKikieSI7CisJaWYgKGFyZ3ZbMV0pCisJCSsrYXJndjsKKworCWRvIHsKKwkJcHAgPSBhcmd2OworCQl3aGlsZSAoMSkgeworCQkJZnB1dHMoKnBwLCBzdGRvdXQpOworCQkJaWYgKCEqKytwcCkKKwkJCQlicmVhazsKKwkJCXB1dGNoYXIoJyAnKTsKKwkJfQorCX0gd2hpbGUgKHB1dGNoYXIoJ1xuJykgIT0gRU9GKTsKKworCWJiX3BlcnJvcl9ub21zZ19hbmRfZGllKCk7Cit9CmRpZmYgLS1naXQgYS9kZWJpYW51dGlscy9Db25maWcuc3JjIGIvZGViaWFudXRpbHMvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmMwOWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZGViaWFudXRpbHMvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDg1IEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJEZWJpYW4gVXRpbGl0aWVzIgorCitJTlNFUlQKKworY29uZmlnIE1LVEVNUAorCWJvb2wgIm1rdGVtcCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBta3RlbXAgaXMgdXNlZCB0byBjcmVhdGUgdW5pcXVlIHRlbXBvcmFyeSBmaWxlcworCitjb25maWcgUElQRV9QUk9HUkVTUworCWJvb2wgInBpcGVfcHJvZ3Jlc3MiCisJZGVmYXVsdCB5CisJaGVscAorCSAgRGlzcGxheSBhIGRvdCB0byBpbmRpY2F0ZSBwaXBlIGFjdGl2aXR5LgorCitjb25maWcgUlVOX1BBUlRTCisJYm9vbCAicnVuLXBhcnRzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIHJ1bi1wYXJ0cyBpcyBhIHV0aWxpdHkgZGVzaWduZWQgdG8gcnVuIGFsbCB0aGUgc2NyaXB0cyBpbiBhIGRpcmVjdG9yeS4KKworCSAgSXQgaXMgdXNlZnVsIHRvIHNldCB1cCBhIGRpcmVjdG9yeSBsaWtlIGNyb24uZGFpbHksIHdoZXJlIHlvdSBuZWVkIHRvCisJICBleGVjdXRlIGFsbCB0aGUgc2NyaXB0cyBpbiB0aGF0IGRpcmVjdG9yeS4KKworCSAgSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiBvZiBydW4tcGFydHMgc29tZSBmZWF0dXJlcyAoc3VjaCBhcyByZXBvcnQKKwkgIG1vZGUpIGFyZSBub3QgaW1wbGVtZW50ZWQuCisKKwkgIFVubGVzcyB5b3Uga25vdyB0aGF0IHJ1bi1wYXJ0cyBpcyB1c2VkIGluIHNvbWUgb2YgeW91ciBzY3JpcHRzCisJICB5b3UgY2FuIHNhZmVseSBzYXkgTiBoZXJlLgorCitjb25maWcgRkVBVFVSRV9SVU5fUEFSVFNfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFJVTl9QQVJUUyAmJiBMT05HX09QVFMKKwloZWxwCisJICBTdXBwb3J0IGxvbmcgb3B0aW9ucyBmb3IgdGhlIHJ1bi1wYXJ0cyBhcHBsZXQuCisKK2NvbmZpZyBGRUFUVVJFX1JVTl9QQVJUU19GQU5DWQorCWJvb2wgIlN1cHBvcnQgYWRkaXRpb25hbCBhcmd1bWVudHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBSVU5fUEFSVFMKKwloZWxwCisJICBTdXBwb3J0IGFkZGl0aW9uYWwgb3B0aW9uczoKKwkgIC1sIC0tbGlzdCBwcmludCB0aGUgbmFtZXMgb2YgdGhlIGFsbCBtYXRjaGluZyBmaWxlcyAobm90CisJICAgICAgICAgICAgbGltaXRlZCB0byBleGVjdXRhYmxlcyksIGJ1dCBkb24ndCBhY3R1YWxseSBydW4gdGhlbS4KKworY29uZmlnIFNUQVJUX1NUT1BfREFFTU9OCisJYm9vbCAic3RhcnQtc3RvcC1kYWVtb24iCisJZGVmYXVsdCB5CisJaGVscAorCSAgc3RhcnQtc3RvcC1kYWVtb24gaXMgdXNlZCB0byBjb250cm9sIHRoZSBjcmVhdGlvbiBhbmQKKwkgIHRlcm1pbmF0aW9uIG9mIHN5c3RlbS1sZXZlbCBwcm9jZXNzZXMsIHVzdWFsbHkgdGhlIG9uZXMKKwkgIHN0YXJ0ZWQgZHVyaW5nIHRoZSBzdGFydHVwIG9mIHRoZSBzeXN0ZW0uCisKK2NvbmZpZyBGRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZCisJYm9vbCAiU3VwcG9ydCBhZGRpdGlvbmFsIGFyZ3VtZW50cyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNUQVJUX1NUT1BfREFFTU9OCisJaGVscAorCSAgU3VwcG9ydCBhZGRpdGlvbmFsIGFyZ3VtZW50cy4KKwkgIC1vfC0tb2tub2RvIGlnbm9yZWQgc2luY2Ugd2UgZXhpdCB3aXRoIDAgYW55d2F5CisJICAtdnwtLXZlcmJvc2UKKwkgIC1OfC0tbmljZWxldmVsIE4KKworY29uZmlnIEZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNUQVJUX1NUT1BfREFFTU9OICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgc3RhcnQtc3RvcC1kYWVtb24gYXBwbGV0LgorCitjb25maWcgV0hJQ0gKKwlib29sICJ3aGljaCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB3aGljaCBpcyB1c2VkIHRvIGZpbmQgcHJvZ3JhbXMgaW4geW91ciBQQVRIIGFuZAorCSAgcHJpbnQgb3V0IHRoZWlyIHBhdGhuYW1lcy4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvZGViaWFudXRpbHMvS2J1aWxkLnNyYyBiL2RlYmlhbnV0aWxzL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxYjVjOAotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbnV0aWxzL0tidWlsZC5zcmMKQEAgLTAsMCArMSwxNCBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15Oj0KKworSU5TRVJUCitsaWItJChDT05GSUdfTUtURU1QKSAgICAgICAgICAgICs9IG1rdGVtcC5vCitsaWItJChDT05GSUdfUElQRV9QUk9HUkVTUykgICAgICs9IHBpcGVfcHJvZ3Jlc3MubworbGliLSQoQ09ORklHX1JVTl9QQVJUUykgICAgICAgICArPSBydW5fcGFydHMubworbGliLSQoQ09ORklHX1NUQVJUX1NUT1BfREFFTU9OKSArPSBzdGFydF9zdG9wX2RhZW1vbi5vCitsaWItJChDT05GSUdfV0hJQ0gpICAgICAgICAgICAgICs9IHdoaWNoLm8KZGlmZiAtLWdpdCBhL2RlYmlhbnV0aWxzL21rdGVtcC5jIGIvZGViaWFudXRpbHMvbWt0ZW1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTgzZDdhMgotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbnV0aWxzL21rdGVtcC5jCkBAIC0wLDAgKzEsMTEzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIG1rdGVtcCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgYnkgRGFuaWVsIEphY29ib3dpdHoKKyAqIFdyaXR0ZW4gYnkgRGFuaWVsIEphY29ib3dpdHogPGRhbkBkZWJpYW4ub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQ29yZXV0aWxzIDYuMTIgbWFuIHBhZ2Ugc2F5czoKKyAqICAgICAgICBta3RlbXAgW09QVElPTl0uLi4gW1RFTVBMQVRFXQorICogQ3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgb3IgZGlyZWN0b3J5LCBzYWZlbHksIGFuZCBwcmludCBpdHMgbmFtZS4gSWYKKyAqIFRFTVBMQVRFIGlzIG5vdCBzcGVjaWZpZWQsIHVzZSB0bXAuWFhYWFhYWFhYWC4KKyAqIC1kLCAtLWRpcmVjdG9yeQorICogICAgICAgIGNyZWF0ZSBhIGRpcmVjdG9yeSwgbm90IGEgZmlsZQorICogLXEsIC0tcXVpZXQKKyAqICAgICAgICBzdXBwcmVzcyBkaWFnbm9zdGljcyBhYm91dCBmaWxlL2Rpci1jcmVhdGlvbiBmYWlsdXJlCisgKiAtdSwgLS1kcnktcnVuCisgKiAgICAgICAgZG8gbm90IGNyZWF0ZSBhbnl0aGluZzsgbWVyZWx5IHByaW50IGEgbmFtZSAodW5zYWZlKQorICogLS10bXBkaXJbPURJUl0KKyAqICAgICAgICBpbnRlcnByZXQgVEVNUExBVEUgcmVsYXRpdmUgdG8gRElSLiBJZiBESVIgaXMgbm90IHNwZWNpZmllZCwKKyAqICAgICAgICB1c2UgICRUTVBESVIgaWYgc2V0LCBlbHNlIC90bXAuICBXaXRoIHRoaXMgb3B0aW9uLCBURU1QTEFURSBtdXN0CisgKiAgICAgICAgbm90IGJlIGFuIGFic29sdXRlIG5hbWUuIFVubGlrZSB3aXRoIC10LCBURU1QTEFURSBtYXkgY29udGFpbgorICogICAgICAgIHNsYXNoZXMsIGJ1dCBldmVuIGhlcmUsIG1rdGVtcCBzdGlsbCBjcmVhdGVzIG9ubHkgdGhlIGZpbmFsIGNvbS0KKyAqICAgICAgICBwb25lbnQuCisgKiAtcCBESVIgdXNlIERJUiBhcyBhIHByZWZpeDsgaW1wbGllcyAtdCBbZGVwcmVjYXRlZF0KKyAqIC10ICAgICBpbnRlcnByZXQgVEVNUExBVEUgYXMgYSBzaW5nbGUgZmlsZSBuYW1lIGNvbXBvbmVudCwgcmVsYXRpdmUgIHRvCisgKiAgICAgICAgYSAgZGlyZWN0b3J5OiAgJFRNUERJUiwgaWYgc2V0OyBlbHNlIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIHZpYQorICogICAgICAgIC1wOyBlbHNlIC90bXAgW2RlcHJlY2F0ZWRdCisgKi8KKworLy91c2FnZTojZGVmaW5lIG1rdGVtcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1kdF0gWy1wIERJUl0gW1RFTVBMQVRFXSIKKy8vdXNhZ2U6I2RlZmluZSBta3RlbXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDcmVhdGUgYSB0ZW1wb3JhcnkgZmlsZSB3aXRoIG5hbWUgYmFzZWQgb24gVEVNUExBVEUgYW5kIHByaW50IGl0cyBuYW1lLlxuIgorLy91c2FnZTogICAgICAgIlRFTVBMQVRFIG11c3QgZW5kIHdpdGggWFhYWFhYIChlLmcuIFsvZGlyL11uYW1lWFhYWFhYKS5cbiIKKy8vdXNhZ2U6ICAgICAgICJXaXRob3V0IFRFTVBMQVRFLCAtdCB0bXAuWFhYWFhYIGlzIGFzc3VtZWQuXG4iCisvL3VzYWdlOiAgICAgIlxuCS1kCU1ha2UgZGlyZWN0b3J5LCBub3QgZmlsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJRmFpbCBzaWxlbnRseSBvbiBlcnJvcnMiCisvL3VzYWdlOiAgICAgIlxuCS10CVByZXBlbmQgYmFzZSBkaXJlY3RvcnkgbmFtZSB0byBURU1QTEFURSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAgRElSCVVzZSBESVIgYXMgYSBiYXNlIGRpcmVjdG9yeSAoaW1wbGllcyAtdCkiCisvL3VzYWdlOiAgICAgIlxuCS11CURvIG5vdCBjcmVhdGUgYW55dGhpbmc7IHByaW50IGEgbmFtZSIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuQmFzZSBkaXJlY3RvcnkgaXM6IC1wIERJUiwgZWxzZSAkVE1QRElSLCBlbHNlIC90bXAiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG1rdGVtcF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBta3RlbXAgL3RtcC90ZW1wLlhYWFhYWFxuIgorLy91c2FnZTogICAgICAgIi90bXAvdGVtcC5tV2lMak1cbiIKKy8vdXNhZ2U6ICAgICAgICIkIGxzIC1sYSAvdG1wL3RlbXAubVdpTGpNXG4iCisvL3VzYWdlOiAgICAgICAiLXJ3LS0tLS0tLSAgICAxIGFuZGVyc2VuIGFuZGVyc2VuICAgICAgICAwIEFwciAyNSAxNzoxMCAvdG1wL3RlbXAubVdpTGpNXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgbWt0ZW1wX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBta3RlbXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKnBhdGg7CisJY2hhciAqY2hwOworCXVuc2lnbmVkIG9wdHM7CisJZW51bSB7CisJCU9QVF9kID0gMSA8PCAwLAorCQlPUFRfcSA9IDEgPDwgMSwKKwkJT1BUX3QgPSAxIDw8IDIsCisJCU9QVF9wID0gMSA8PCAzLAorCQlPUFRfdSA9IDEgPDwgNCwKKwl9OworCisJcGF0aCA9IGdldGVudigiVE1QRElSIik7CisJaWYgKCFwYXRoIHx8IHBhdGhbMF0gPT0gJ1wwJykKKwkJcGF0aCA9ICIvdG1wIjsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj8xIjsgLyogMSBhcmd1bWVudCBtYXggKi8KKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgImRxdHA6dSIsICZwYXRoKTsKKworCWNocCA9IGFyZ3Zbb3B0aW5kXTsKKwlpZiAoIWNocCkgeworCQkvKiBHTlUgY29yZXV0aWxzIDguNDoKKwkJICogYmFyZSAibWt0ZW1wIiAtPiAibWt0ZW1wIC10IHRtcC5YWFhYWFgiCisJCSAqLworCQljaHAgPSB4c3RyZHVwKCJ0bXAuWFhYWFhYIik7CisJCW9wdHMgfD0gT1BUX3Q7CisJfQorI2lmIDAKKwkvKiBEb24ndCBhbGxvdyBkaXJlY3Rvcnkgc2VwYXJhdG9yIGluIHRlbXBsYXRlICovCisJaWYgKChvcHRzICYgT1BUX3QpICYmIGJiX2Jhc2VuYW1lKGNocCkgIT0gY2hwKSB7CisJCWVycm5vID0gRUlOVkFMOworCQlnb3RvIGVycm9yOworCX0KKyNlbmRpZgorCWlmIChvcHRzICYgKE9QVF90fE9QVF9wKSkKKwkJY2hwID0gY29uY2F0X3BhdGhfZmlsZShwYXRoLCBjaHApOworCisJaWYgKG9wdHMgJiBPUFRfdSkgeworCQljaHAgPSBta3RlbXAoY2hwKTsKKwkJaWYgKGNocFswXSA9PSAnXDAnKQorCQkJZ290byBlcnJvcjsKKwl9IGVsc2UgaWYgKG9wdHMgJiBPUFRfZCkgeworCQlpZiAobWtkdGVtcChjaHApID09IE5VTEwpCisJCQlnb3RvIGVycm9yOworCX0gZWxzZSB7CisJCWlmIChta3N0ZW1wKGNocCkgPCAwKQorCQkJZ290byBlcnJvcjsKKwl9CisJcHV0cyhjaHApOworCXJldHVybiBFWElUX1NVQ0NFU1M7CisgZXJyb3I6CisJaWYgKG9wdHMgJiBPUFRfcSkKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkvKiBkb24ndCB1c2UgY2hwIGFzIGl0IGdldHMgbWFuZ2xlZCBpbiBjYXNlIG9mIGVycm9yICovCisJYmJfcGVycm9yX25vbXNnX2FuZF9kaWUoKTsKK30KZGlmZiAtLWdpdCBhL2RlYmlhbnV0aWxzL3BpcGVfcHJvZ3Jlc3MuYyBiL2RlYmlhbnV0aWxzL3BpcGVfcHJvZ3Jlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzc0NDRmCi0tLSAvZGV2L251bGwKKysrIGIvZGViaWFudXRpbHMvcGlwZV9wcm9ncmVzcy5jCkBAIC0wLDAgKzEsMzkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1vbml0b3IgYSBwaXBlIHdpdGggYSBzaW1wbGUgcHJvZ3Jlc3MgZGlzcGxheS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgYnkgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4sIEpvZXkgSGVzcworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHBpcGVfcHJvZ3Jlc3NfdHJpdmlhbF91c2FnZSBOT1VTQUdFX1NUUgorLy91c2FnZTojZGVmaW5lIHBpcGVfcHJvZ3Jlc3NfZnVsbF91c2FnZSAiIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2RlZmluZSBQSVBFX1BST0dSRVNTX1NJWkUgNDA5NgorCisvKiBSZWFkIGEgYmxvY2sgb2YgZGF0YSBmcm9tIHN0ZGluLCB3cml0ZSBpdCB0byBzdGRvdXQuCisgKiBBY3Rpdml0eSBpcyBpbmRpY2F0ZWQgYnkgYSAnLicgdG8gc3RkZXJyCisgKi8KK2ludCBwaXBlX3Byb2dyZXNzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwaXBlX3Byb2dyZXNzX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJY2hhciBidWZbUElQRV9QUk9HUkVTU19TSVpFXTsKKwl0aW1lX3QgdCA9IHRpbWUoTlVMTCk7CisJaW50IGxlbjsKKworCXdoaWxlICgobGVuID0gc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgYnVmLCBQSVBFX1BST0dSRVNTX1NJWkUpKSA+IDApIHsKKwkJdGltZV90IG5ld190aW1lID0gdGltZShOVUxMKTsKKwkJaWYgKG5ld190aW1lICE9IHQpIHsKKwkJCXQgPSBuZXdfdGltZTsKKwkJCWJiX3B1dGNoYXJfc3RkZXJyKCcuJyk7CisJCX0KKwkJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBidWYsIGxlbik7CisJfQorCisJYmJfcHV0Y2hhcl9zdGRlcnIoJ1xuJyk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2RlYmlhbnV0aWxzL3J1bl9wYXJ0cy5jIGIvZGViaWFudXRpbHMvcnVuX3BhcnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ2ZmU3ZAotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbnV0aWxzL3J1bl9wYXJ0cy5jCkBAIC0wLDAgKzEsMTk5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHJ1bi1wYXJ0cyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBCYXNlZCBvbiBhIG9sZGVyIHZlcnNpb24gdGhhdCB3YXMgaW4gYnVzeWJveCB3aGljaCB3YXMgMWsgYmlnLgorICogICBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgRW1hbnVlbGUgQWluYSA8ZW1hbnVlbGUuYWluYUB0aXNjYWxpLml0PgorICoKKyAqIEJhc2VkIG9uIHRoZSBEZWJpYW4gcnVuLXBhcnRzIHByb2dyYW0sIHZlcnNpb24gMS4xNQorICogICBDb3B5cmlnaHQgKEMpIDE5OTYgSmVmZiBOb3hvbiA8amVmZkByb3V0ZXIucGF0Y2gubmV0PiwKKyAqICAgQ29weXJpZ2h0IChDKSAxOTk2LTE5OTkgR3V5IE1hb3IgPG1hb3JAZGViaWFuLm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIFRoaXMgaXMgbXkgZmlyc3QgYXR0ZW1wdCB0byB3cml0ZSBhIHByb2dyYW0gaW4gQyAod2VsbCwgdGhpcyBpcyBteSBmaXJzdAorICogYXR0ZW1wdCB0byB3cml0ZSBhIHByb2dyYW0hIDotKSAuICovCisKKy8qIFRoaXMgcGllY2Ugb2YgY29kZSBpcyBoZWF2aWx5IGJhc2VkIG9uIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHJ1bi1wYXJ0cywKKyAqIHRha2VuIGZyb20gZGViaWFuLXV0aWxzLiBJJ3ZlIG9ubHkgcmVtb3ZlZCB0aGUgbG9uZyBvcHRpb25zIGFuZCB0aGUKKyAqIHJlcG9ydCBtb2RlLiBBcyB0aGUgb3JpZ2luYWwgcnVuLXBhcnRzIHN1cHBvcnQgb25seSBsb25nIG9wdGlvbnMsIEkndmUKKyAqIGJyb2tlbiBjb21wYXRpYmlsaXR5IGJlY2F1c2UgdGhlIEJ1c3lCb3ggcG9saWN5IGRvZXNuJ3QgYWxsb3cgdGhlbS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcnVuX3BhcnRzX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWEgQVJHXS4uLiBbLXUgVU1BU0tdICIKKy8vdXNhZ2U6ICAgICAgIElGX0ZFQVRVUkVfUlVOX1BBUlRTX0xPTkdfT1BUSU9OUygiWy0tcmV2ZXJzZV0gWy0tdGVzdF0gWy0tZXhpdC1vbi1lcnJvcl0gIklGX0ZFQVRVUkVfUlVOX1BBUlRTX0ZBTkNZKCJbLS1saXN0XSAiKSkKKy8vdXNhZ2U6ICAgICAgICJESVJFQ1RPUlkiCisvL3VzYWdlOiNkZWZpbmUgcnVuX3BhcnRzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUnVuIGEgYnVuY2ggb2Ygc2NyaXB0cyBpbiBESVJFQ1RPUllcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEgQVJHCQlQYXNzIEFSRyBhcyBhcmd1bWVudCB0byBzY3JpcHRzIgorLy91c2FnZTogICAgICJcbgktdSBVTUFTSwlTZXQgVU1BU0sgYmVmb3JlIHJ1bm5pbmcgc2NyaXB0cyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfUlVOX1BBUlRTX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG4JLS1yZXZlcnNlCVJldmVyc2UgZXhlY3V0aW9uIG9yZGVyIgorLy91c2FnZTogICAgICJcbgktLXRlc3QJCURyeSBydW4iCisvL3VzYWdlOiAgICAgIlxuCS0tZXhpdC1vbi1lcnJvcglFeGl0IGlmIGEgc2NyaXB0IGV4aXRzIHdpdGggbm9uLXplcm8iCisvL3VzYWdlOglJRl9GRUFUVVJFX1JVTl9QQVJUU19GQU5DWSgKKy8vdXNhZ2U6ICAgICAiXG4JLS1saXN0CQlQcmludCBuYW1lcyBvZiBtYXRjaGluZyBmaWxlcyBldmVuIGlmIHRoZXkgYXJlIG5vdCBleGVjdXRhYmxlIgorLy91c2FnZToJKQorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBydW5fcGFydHNfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgcnVuLXBhcnRzIC1hIHN0YXJ0IC9ldGMvaW5pdC5kXG4iCisvL3VzYWdlOiAgICAgICAiJCBydW4tcGFydHMgLWEgc3RvcD1ub3cgL2V0Yy9pbml0LmRcblxuIgorLy91c2FnZTogICAgICAgIkxldCdzIGFzc3VtZSB5b3UgaGF2ZSBhIHNjcmlwdCBmb28vZG9zb21ldGhpbmc6XG4iCisvL3VzYWdlOiAgICAgICAiIyEvYmluL3NoXG4iCisvL3VzYWdlOiAgICAgICAiZm9yIGkgaW4gJCo7IGRvIGV2YWwgJGk7IGRvbmU7IHVuc2V0IGlcbiIKKy8vdXNhZ2U6ICAgICAgICJjYXNlIFwiJDFcIiBpblxuIgorLy91c2FnZTogICAgICAgInN0YXJ0KikgZWNobyBzdGFydGluZyBzb21ldGhpbmc7O1xuIgorLy91c2FnZTogICAgICAgInN0b3AqKSBzZXQgLXg7IHNodXRkb3duIC1oICRzdG9wOztcbiIKKy8vdXNhZ2U6ICAgICAgICJlc2FjXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSdW5uaW5nIHRoaXMgeWllbGRzOlxuIgorLy91c2FnZTogICAgICAgIiRydW4tcGFydHMgLWEgc3RvcD0rNG0gZm9vL1xuIgorLy91c2FnZTogICAgICAgIisgc2h1dGRvd24gLWggKzRtIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RydWN0IGdsb2JhbHMgeworCWNoYXIgKipuYW1lczsKKwlpbnQgICAgY3VyOworCWNoYXIgICpjbWRbMiAvKiB1c2luZyAxIHByb3Zva2VzIGNvbXBpbGVyIHdhcm5pbmcgKi9dOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgbmFtZXMgKEcubmFtZXMpCisjZGVmaW5lIGN1ciAgIChHLmN1ciAgKQorI2RlZmluZSBjbWQgICAoRy5jbWQgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyB9IHdoaWxlICgwKQorCitlbnVtIHsgTlVNX0NNRCA9IChDT01NT05fQlVGU0laRSAtIHNpemVvZihHKSkgLyBzaXplb2YoY21kWzBdKSAtIDEgfTsKKworZW51bSB7CisJT1BUX2EgPSAoMSA8PCAwKSwKKwlPUFRfdSA9ICgxIDw8IDEpLAorCU9QVF9yID0gKDEgPDwgMikgKiBFTkFCTEVfRkVBVFVSRV9SVU5fUEFSVFNfTE9OR19PUFRJT05TLAorCU9QVF90ID0gKDEgPDwgMykgKiBFTkFCTEVfRkVBVFVSRV9SVU5fUEFSVFNfTE9OR19PUFRJT05TLAorCU9QVF9lID0gKDEgPDwgNCkgKiBFTkFCTEVfRkVBVFVSRV9SVU5fUEFSVFNfTE9OR19PUFRJT05TLAorCU9QVF9sID0gKDEgPDwgNSkgKiBFTkFCTEVfRkVBVFVSRV9SVU5fUEFSVFNfTE9OR19PUFRJT05TCisJCQkqIEVOQUJMRV9GRUFUVVJFX1JVTl9QQVJUU19GQU5DWSwKK307CisKKy8qIElzIHRoaXMgYSB2YWxpZCBmaWxlbmFtZSAodXBwZXIvbG93ZXIgYWxwaGEsIGRpZ2l0cywKKyAqIHVuZGVyc2NvcmVzLCBhbmQgaHlwaGVucyBvbmx5PykKKyAqLworc3RhdGljIGJvb2wgaW52YWxpZF9uYW1lKGNvbnN0IGNoYXIgKmMpCit7CisJYyA9IGJiX2Jhc2VuYW1lKGMpOworCisJd2hpbGUgKCpjICYmIChpc2FsbnVtKCpjKSB8fCAqYyA9PSAnXycgfHwgKmMgPT0gJy0nKSkKKwkJYysrOworCisJcmV0dXJuICpjOyAvKiBUUlVFICghMCkgaWYgdGVybWluYXRpbmcgTlVMIGlzIG5vdCByZWFjaGVkICovCit9CisKK3N0YXRpYyBpbnQgYmJfYWxwaGFzb3J0KGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKK3sKKwlpbnQgciA9IHN0cmNtcCgqKGNoYXIgKiopIHAxLCAqKGNoYXIgKiopIHAyKTsKKwlyZXR1cm4gKG9wdGlvbl9tYXNrMzIgJiBPUFRfcikgPyAtciA6IHI7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGFjdChjb25zdCBjaGFyICpmaWxlLCBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1Ziwgdm9pZCAqYXJncyBVTlVTRURfUEFSQU0sIGludCBkZXB0aCkKK3sKKwlpZiAoZGVwdGggPT0gMSkKKwkJcmV0dXJuIFRSVUU7CisKKwlpZiAoZGVwdGggPT0gMgorCSAmJiAoICAhKHN0YXRidWYtPnN0X21vZGUgJiAoU19JRlJFRyB8IFNfSUZMTkspKQorCSAgICB8fCBpbnZhbGlkX25hbWUoZmlsZSkKKwkgICAgfHwgKCEob3B0aW9uX21hc2szMiAmIE9QVF9sKSAmJiBhY2Nlc3MoZmlsZSwgWF9PSykgIT0gMCkpCisJKSB7CisJCXJldHVybiBTS0lQOworCX0KKworCW5hbWVzID0geHJlYWxsb2NfdmVjdG9yKG5hbWVzLCA0LCBjdXIpOworCW5hbWVzW2N1cisrXSA9IHhzdHJkdXAoZmlsZSk7CisJLypuYW1lc1tjdXJdID0gTlVMTDsgLSB4cmVhbGxvY192ZWN0b3IgZGlkIGl0ICovCisKKwlyZXR1cm4gVFJVRTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1JVTl9QQVJUU19MT05HX09QVElPTlMKK3N0YXRpYyBjb25zdCBjaGFyIHJ1bnBhcnRzX2xvbmdvcHRzW10gQUxJR04xID0KKwkiYXJnXDAiICAgICBSZXF1aXJlZF9hcmd1bWVudCAiYSIKKwkidW1hc2tcMCIgICBSZXF1aXJlZF9hcmd1bWVudCAidSIKKy8vVE9ETzogInZlcmJvc2VcMCIgTm9fYXJndW1lbnQgICAgICAgInYiCisJInJldmVyc2VcMCIgTm9fYXJndW1lbnQgICAgICAgIlx4ZjAiCisJInRlc3RcMCIgICAgTm9fYXJndW1lbnQgICAgICAgIlx4ZjEiCisJImV4aXQtb24tZXJyb3JcMCIgTm9fYXJndW1lbnQgIlx4ZjIiCisjaWYgRU5BQkxFX0ZFQVRVUkVfUlVOX1BBUlRTX0ZBTkNZCisJImxpc3RcMCIgICAgTm9fYXJndW1lbnQgICAgICAgIlx4ZjMiCisjZW5kaWYKKwk7CisjZW5kaWYKKworaW50IHJ1bl9wYXJ0c19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcnVuX3BhcnRzX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICp1bWFza19wID0gIjIyIjsKKwlsbGlzdF90ICphcmdfbGlzdCA9IE5VTEw7CisJdW5zaWduZWQgbjsKKwlpbnQgcmV0OworCisJSU5JVF9HKCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9SVU5fUEFSVFNfTE9OR19PUFRJT05TCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IHJ1bnBhcnRzX2xvbmdvcHRzOworI2VuZGlmCisJLyogV2UgcmVxdWlyZSBleGFjdGx5IG9uZSBhcmd1bWVudDogdGhlIGRpcmVjdG9yeSBuYW1lICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTE6YTo6IjsKKwlnZXRvcHQzMihhcmd2LCAiYTp1OiIsICZhcmdfbGlzdCwgJnVtYXNrX3ApOworCisJdW1hc2soeHN0cnRvdV9yYW5nZSh1bWFza19wLCA4LCAwLCAwNzc3NykpOworCisJbiA9IDE7CisJd2hpbGUgKGFyZ19saXN0ICYmIG4gPCBOVU1fQ01EKSB7CisJCWNtZFtuKytdID0gbGxpc3RfcG9wKCZhcmdfbGlzdCk7CisJfQorCS8qIGNtZFtuXSA9IE5VTEw7IC0gaXMgYWxyZWFkeSB6ZXJvZWQgb3V0ICovCisKKwkvKiBydW4tcGFydHMgaGFzIHRvIHNvcnQgZXhlY3V0YWJsZXMgYnkgbmFtZSBiZWZvcmUgcnVubmluZyB0aGVtICovCisKKwlyZWN1cnNpdmVfYWN0aW9uKGFyZ3Zbb3B0aW5kXSwKKwkJCUFDVElPTl9SRUNVUlNFfEFDVElPTl9GT0xMT1dMSU5LUywKKwkJCWFjdCwgICAgICAgICAgICAvKiBmaWxlIGFjdGlvbiAqLworCQkJYWN0LCAgICAgICAgICAgIC8qIGRpciBhY3Rpb24gKi8KKwkJCU5VTEwsICAgICAgICAgICAvKiB1c2VyIGRhdGEgKi8KKwkJCTEgICAgICAgICAgICAgICAvKiBkZXB0aCAqLworCQkpOworCisJaWYgKCFuYW1lcykKKwkJcmV0dXJuIDA7CisKKwlxc29ydChuYW1lcywgY3VyLCBzaXplb2YoY2hhciAqKSwgYmJfYWxwaGFzb3J0KTsKKworCW4gPSAwOworCXdoaWxlICgxKSB7CisJCWNoYXIgKm5hbWUgPSAqbmFtZXMrKzsKKwkJaWYgKCFuYW1lKQorCQkJYnJlYWs7CisJCWlmIChvcHRpb25fbWFzazMyICYgKE9QVF90IHwgT1BUX2wpKSB7CisJCQlwdXRzKG5hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJY21kWzBdID0gbmFtZTsKKwkJcmV0ID0gc3Bhd25fYW5kX3dhaXQoY21kKTsKKwkJaWYgKHJldCA9PSAwKQorCQkJY29udGludWU7CisJCW4gPSAxOworCQlpZiAocmV0IDwgMCkKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IGV4ZWN1dGUgJyVzJyIsIG5hbWUpOworCQllbHNlIC8qIHJldCA+IDAgKi8KKwkJCWJiX2Vycm9yX21zZygiJXM6IGV4aXQgc3RhdHVzICV1IiwgbmFtZSwgcmV0ICYgMHhmZik7CisKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfZSkKKwkJCXhmdW5jX2RpZSgpOworCX0KKworCXJldHVybiBuOworfQpkaWZmIC0tZ2l0IGEvZGViaWFudXRpbHMvc3RhcnRfc3RvcF9kYWVtb24uYyBiL2RlYmlhbnV0aWxzL3N0YXJ0X3N0b3BfZGFlbW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhZGMzYwotLS0gL2Rldi9udWxsCisrKyBiL2RlYmlhbnV0aWxzL3N0YXJ0X3N0b3BfZGFlbW9uLmMKQEAgLTAsMCArMSw1MzggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgc3RhcnQtc3RvcC1kYWVtb24gaW1wbGVtZW50YXRpb24ocykgZm9yIGJ1c3lib3gKKyAqCisgKiBXcml0dGVuIGJ5IE1hcmVrIE1pY2hhbGtpZXdpY3ogPG1hcmVrbUBpMTdsaW51eGIuaXN0cy5wd3Iud3JvYy5wbD4sCisgKiBBZGFwdGVkIGZvciBidXN5Ym94IERhdmlkIEtpbWRvbiA8ZHdoZWRvbkBnb3JkaWFuLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qCitUaGlzIGlzIGhvdyBpdCBpcyBzdXBwb3NlZCB0byB3b3JrOgorCitzdGFydC1zdG9wLWRhZW1vbiBbT1BUSU9OU10gWy0tc3RhcnR8LS1zdG9wXSBbWy0tXSBhcmd1bWVudHMuLi5dCisKK09uZSAob25seSkgb2YgdGhlc2UgbXVzdCBiZSBnaXZlbjoKKyAgICAgICAgLVMsLS1zdGFydCAgICAgICAgICAgICAgU3RhcnQKKyAgICAgICAgLUssLS1zdG9wICAgICAgICAgICAgICAgU3RvcAorCitTZWFyY2ggZm9yIG1hdGNoaW5nIHByb2Nlc3Nlcy4KK0lmIC0tc3RvcCBpcyBnaXZlbiwgc3RvcCBhbGwgbWF0Y2hpbmcgcHJvY2Vzc2VzIChieSBzZW5kaW5nIGEgc2lnbmFsKS4KK0lmIC0tc3RhcnQgaXMgZ2l2ZW4sIHN0YXJ0IGEgbmV3IHByb2Nlc3MgdW5sZXNzIGEgbWF0Y2hpbmcgcHJvY2VzcyB3YXMgZm91bmQuCisKK09wdGlvbnMgY29udHJvbGxpbmcgcHJvY2VzcyBtYXRjaGluZworKGlmIG11bHRpcGxlIGNvbmRpdGlvbnMgYXJlIHNwZWNpZmllZCwgYWxsIG11c3QgbWF0Y2gpOgorICAgICAgICAtdSwtLXVzZXIgVVNFUk5BTUV8VUlEICBPbmx5IGNvbnNpZGVyIHRoaXMgdXNlcidzIHByb2Nlc3NlcworICAgICAgICAtbiwtLW5hbWUgUFJPQ0VTU19OQU1FICBMb29rIGZvciBwcm9jZXNzZXMgYnkgbWF0Y2hpbmcgUFJPQ0VTU19OQU1FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggY29tbSBmaWVsZCBpbiAvcHJvYy8kUElEL3N0YXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9ubHkgYmFzZW5hbWUgaXMgY29tcGFyZWQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJudHBkIiA9PSAiLi9udHBkIiA9PSAiL3BhdGgvdG8vbnRwZCIuCitbVE9ETzogY2FuIFBST0NFU1NfTkFNRSBiZSBhIGZ1bGwgcGF0aG5hbWU/IFNob3VsZCB3ZSByZXF1aXJlIGZ1bGwgbWF0Y2ggdGhlbgord2l0aCAvcHJvYy8kUElEL2V4ZSBvciBhcmd2WzBdIChjb21tIGNhbid0IGJlIG1hdGNoZWQsIGl0IG5ldmVyIGNvbnRhaW5zIHBhdGgpXQorICAgICAgICAteCwtLWV4ZWMgRVhFQ1VUQUJMRSAgICBMb29rIGZvciBwcm9jZXNzZXMgdGhhdCB3ZXJlIHN0YXJ0ZWQgd2l0aCB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQgaW4gL3Byb2MvJFBJRC9leGUgYW5kIC9wcm9jLyRQSUQvY21kbGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoL3Byb2MvJFBJRC9jbWRsaW5lIGlzIGEgYmJveCBleHRlbnNpb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVubGlrZSAtbiwgd2UgbWF0Y2ggYWdhaW5zdCB0aGUgZnVsbCBwYXRoOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnRwZCIgIT0gIi4vbnRwZCIgIT0gIi9wYXRoL3RvL250cGQiCisgICAgICAgIC1wLC0tcGlkZmlsZSBQSURfRklMRSAgIExvb2sgZm9yIHByb2Nlc3NlcyB3aXRoIFBJRCBmcm9tIHRoaXMgZmlsZQorCitPcHRpb25zIHdoaWNoIGFyZSB2YWxpZCBmb3IgLS1zdGFydCBvbmx5OgorICAgICAgICAteCwtLWV4ZWMgRVhFQ1VUQUJMRSAgICBQcm9ncmFtIHRvIHJ1biAoMXN0IGFyZyBvZiBleGVjdnApLiBNYW5kYXRvcnkuCisgICAgICAgIC1hLC0tc3RhcnRhcyBOQU1FICAgICAgIGFyZ3ZbMF0gKGRlZmF1bHRzIHRvIEVYRUNVVEFCTEUpCisgICAgICAgIC1iLC0tYmFja2dyb3VuZCAgICAgICAgIFB1dCBwcm9jZXNzIGludG8gYmFja2dyb3VuZAorICAgICAgICAtTiwtLW5pY2VsZXZlbCBOICAgICAgICBBZGQgTiB0byBwcm9jZXNzJyBuaWNlIGxldmVsCisgICAgICAgIC1jLC0tY2h1aWQgVVNFUls6W0dSUF1dIENoYW5nZSB0byBzcGVjaWZpZWQgdXNlciBbYW5kIGdyb3VwXQorICAgICAgICAtbSwtLW1ha2UtcGlkZmlsZSAgICAgICBXcml0ZSBQSUQgdG8gdGhlIHBpZGZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJvdGggLW0gYW5kIC1wIG11c3QgYmUgZ2l2ZW4hKQorCitPcHRpb25zIHdoaWNoIGFyZSB2YWxpZCBmb3IgLS1zdG9wIG9ubHk6CisgICAgICAgIC1zLC0tc2lnbmFsIFNJRyAgICAgICAgIFNpZ25hbCB0byBzZW5kIChkZWZhdWx0OlRFUk0pCisgICAgICAgIC10LC0tdGVzdCAgICAgICAgICAgICAgIEV4aXQgd2l0aCBzdGF0dXMgMCBpZiBwcm9jZXNzIGlzIGZvdW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh3ZSBkb24ndCBhY3R1YWxseSBzdGFydCBvciBzdG9wIGRhZW1vbnMpCisKK01pc2Mgb3B0aW9uczoKKyAgICAgICAgLW8sLS1va25vZG8gICAgICAgICAgICAgRXhpdCB3aXRoIHN0YXR1cyAwIGlmIG5vdGhpbmcgaXMgZG9uZQorICAgICAgICAtcSwtLXF1aWV0ICAgICAgICAgICAgICBRdWlldAorICAgICAgICAtdiwtLXZlcmJvc2UgICAgICAgICAgICBWZXJib3NlCisqLworCisvL3VzYWdlOiNkZWZpbmUgc3RhcnRfc3RvcF9kYWVtb25fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbLVN8LUtdIC4uLiBbLS0gQVJHUy4uLl0iCisvL3VzYWdlOiNkZWZpbmUgc3RhcnRfc3RvcF9kYWVtb25fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZWFyY2ggZm9yIG1hdGNoaW5nIHByb2Nlc3NlcywgYW5kIHRoZW5cbiIKKy8vdXNhZ2U6ICAgICAgICItSzogc3RvcCBhbGwgbWF0Y2hpbmcgcHJvY2Vzc2VzLlxuIgorLy91c2FnZTogICAgICAgIi1TOiBzdGFydCBhIHByb2Nlc3MgdW5sZXNzIGEgbWF0Y2hpbmcgcHJvY2VzcyBpcyBmb3VuZC5cbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fTE9OR19PUFRJT05TKAorLy91c2FnZTogICAgICJcblByb2Nlc3MgbWF0Y2hpbmc6IgorLy91c2FnZTogICAgICJcbgktdSwtLXVzZXIgVVNFUk5BTUV8VUlECU1hdGNoIG9ubHkgdGhpcyB1c2VyJ3MgcHJvY2Vzc2VzIgorLy91c2FnZTogICAgICJcbgktbiwtLW5hbWUgTkFNRQkJTWF0Y2ggcHJvY2Vzc2VzIHdpdGggTkFNRSIKKy8vdXNhZ2U6ICAgICAiXG4JCQkJaW4gY29tbSBmaWVsZCBpbiAvcHJvYy9QSUQvc3RhdCIKKy8vdXNhZ2U6ICAgICAiXG4JLXgsLS1leGVjIEVYRUNVVEFCTEUJTWF0Y2ggcHJvY2Vzc2VzIHdpdGggdGhpcyBjb21tYW5kIgorLy91c2FnZTogICAgICJcbgkJCQlpbiAvcHJvYy9QSUQve2V4ZSxjbWRsaW5lfSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAsLS1waWRmaWxlIEZJTEUJTWF0Y2ggYSBwcm9jZXNzIHdpdGggUElEIGZyb20gdGhlIGZpbGUiCisvL3VzYWdlOiAgICAgIlxuCUFsbCBzcGVjaWZpZWQgY29uZGl0aW9ucyBtdXN0IG1hdGNoIgorLy91c2FnZTogICAgICJcbi1TIG9ubHk6IgorLy91c2FnZTogICAgICJcbgkteCwtLWV4ZWMgRVhFQ1VUQUJMRQlQcm9ncmFtIHRvIHJ1biIKKy8vdXNhZ2U6ICAgICAiXG4JLWEsLS1zdGFydGFzIE5BTUUJWmVyb3RoIGFyZ3VtZW50IgorLy91c2FnZTogICAgICJcbgktYiwtLWJhY2tncm91bmQJCUJhY2tncm91bmQiCisvL3VzYWdlOglJRl9GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZKAorLy91c2FnZTogICAgICJcbgktTiwtLW5pY2VsZXZlbCBOCUNoYW5nZSBuaWNlIGxldmVsIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktYywtLWNodWlkIFVTRVJbOltHUlBdXQlDaGFuZ2UgdG8gdXNlci9ncm91cCIKKy8vdXNhZ2U6ICAgICAiXG4JLW0sLS1tYWtlLXBpZGZpbGUJV3JpdGUgUElEIHRvIHRoZSBwaWRmaWxlIHNwZWNpZmllZCBieSAtcCIKKy8vdXNhZ2U6ICAgICAiXG4tSyBvbmx5OiIKKy8vdXNhZ2U6ICAgICAiXG4JLXMsLS1zaWduYWwgU0lHCQlTaWduYWwgdG8gc2VuZCIKKy8vdXNhZ2U6ICAgICAiXG4JLXQsLS10ZXN0CQlNYXRjaCBvbmx5LCBleGl0IHdpdGggMCBpZiBhIHByb2Nlc3MgaXMgZm91bmQiCisvL3VzYWdlOiAgICAgIlxuT3RoZXI6IgorLy91c2FnZToJSUZfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWSgKKy8vdXNhZ2U6ICAgICAiXG4JLW8sLS1va25vZG8JCUV4aXQgd2l0aCBzdGF0dXMgMCBpZiBub3RoaW5nIGlzIGRvbmUiCisvL3VzYWdlOiAgICAgIlxuCS12LC0tdmVyYm9zZQkJVmVyYm9zZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXEsLS1xdWlldAkJUXVpZXQiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9OT1RfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgIlxuUHJvY2VzcyBtYXRjaGluZzoiCisvL3VzYWdlOiAgICAgIlxuCS11IFVTRVJOQU1FfFVJRAlNYXRjaCBvbmx5IHRoaXMgdXNlcidzIHByb2Nlc3NlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLW4gTkFNRQkJTWF0Y2ggcHJvY2Vzc2VzIHdpdGggTkFNRSIKKy8vdXNhZ2U6ICAgICAiXG4JCQlpbiBjb21tIGZpZWxkIGluIC9wcm9jL1BJRC9zdGF0IgorLy91c2FnZTogICAgICJcbgkteCBFWEVDVVRBQkxFCU1hdGNoIHByb2Nlc3NlcyB3aXRoIHRoaXMgY29tbWFuZCIKKy8vdXNhZ2U6ICAgICAiXG4JCQljb21tYW5kIGluIC9wcm9jL1BJRC9jbWRsaW5lIgorLy91c2FnZTogICAgICJcbgktcCBGSUxFCQlNYXRjaCBhIHByb2Nlc3Mgd2l0aCBQSUQgZnJvbSB0aGUgZmlsZSIKKy8vdXNhZ2U6ICAgICAiXG4JQWxsIHNwZWNpZmllZCBjb25kaXRpb25zIG11c3QgbWF0Y2giCisvL3VzYWdlOiAgICAgIlxuLVMgb25seToiCisvL3VzYWdlOiAgICAgIlxuCS14IEVYRUNVVEFCTEUJUHJvZ3JhbSB0byBydW4iCisvL3VzYWdlOiAgICAgIlxuCS1hIE5BTUUJCVplcm90aCBhcmd1bWVudCIKKy8vdXNhZ2U6ICAgICAiXG4JLWIJCUJhY2tncm91bmQiCisvL3VzYWdlOglJRl9GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZKAorLy91c2FnZTogICAgICJcbgktTiBOCQlDaGFuZ2UgbmljZSBsZXZlbCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLWMgVVNFUls6W0dSUF1dCUNoYW5nZSB0byB1c2VyL2dyb3VwIgorLy91c2FnZTogICAgICJcbgktbQkJV3JpdGUgUElEIHRvIHRoZSBwaWRmaWxlIHNwZWNpZmllZCBieSAtcCIKKy8vdXNhZ2U6ICAgICAiXG4tSyBvbmx5OiIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgU0lHCQlTaWduYWwgdG8gc2VuZCIKKy8vdXNhZ2U6ICAgICAiXG4JLXQJCU1hdGNoIG9ubHksIGV4aXQgd2l0aCAwIGlmIGEgcHJvY2VzcyBpcyBmb3VuZCIKKy8vdXNhZ2U6ICAgICAiXG5PdGhlcjoiCisvL3VzYWdlOglJRl9GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZKAorLy91c2FnZTogICAgICJcbgktbwkJRXhpdCB3aXRoIHN0YXR1cyAwIGlmIG5vdGhpbmcgaXMgZG9uZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJCVZlcmJvc2UiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1xCQlRdWlldCIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorCisvKiBPdmVycmlkZSBFTkFCTEVfRkVBVFVSRV9QSURGSUxFICovCisjZGVmaW5lIFdBTlRfUElERklMRSAxCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RydWN0IHBpZF9saXN0IHsKKwlzdHJ1Y3QgcGlkX2xpc3QgKm5leHQ7CisJcGlkX3QgcGlkOworfTsKKworZW51bSB7CisJQ1RYX1NUT1AgICAgICAgPSAoMSA8PCAgMCksCisJQ1RYX1NUQVJUICAgICAgPSAoMSA8PCAgMSksCisJT1BUX0JBQ0tHUk9VTkQgPSAoMSA8PCAgMiksIC8vIC1iCisJT1BUX1FVSUVUICAgICAgPSAoMSA8PCAgMyksIC8vIC1xCisJT1BUX1RFU1QgICAgICAgPSAoMSA8PCAgNCksIC8vIC10CisJT1BUX01BS0VQSUQgICAgPSAoMSA8PCAgNSksIC8vIC1tCisJT1BUX2EgICAgICAgICAgPSAoMSA8PCAgNiksIC8vIC1hCisJT1BUX24gICAgICAgICAgPSAoMSA8PCAgNyksIC8vIC1uCisJT1BUX3MgICAgICAgICAgPSAoMSA8PCAgOCksIC8vIC1zCisJT1BUX3UgICAgICAgICAgPSAoMSA8PCAgOSksIC8vIC11CisJT1BUX2MgICAgICAgICAgPSAoMSA8PCAxMCksIC8vIC1jCisJT1BUX3ggICAgICAgICAgPSAoMSA8PCAxMSksIC8vIC14CisJT1BUX3AgICAgICAgICAgPSAoMSA8PCAxMiksIC8vIC1wCisJT1BUX09LTk9ETyAgICAgPSAoMSA8PCAxMykgKiBFTkFCTEVfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWSwgLy8gLW8KKwlPUFRfVkVSQk9TRSAgICA9ICgxIDw8IDE0KSAqIEVOQUJMRV9GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZLCAvLyAtdgorCU9QVF9OSUNFTEVWRUwgID0gKDEgPDwgMTUpICogRU5BQkxFX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fRkFOQ1ksIC8vIC1OCit9OworI2RlZmluZSBRVUlFVCAob3B0aW9uX21hc2szMiAmIE9QVF9RVUlFVCkKKyNkZWZpbmUgVEVTVCAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfVEVTVCkKKworc3RydWN0IGdsb2JhbHMgeworCXN0cnVjdCBwaWRfbGlzdCAqZm91bmRfcHJvY3M7CisJY2hhciAqdXNlcnNwZWM7CisJY2hhciAqY21kbmFtZTsKKwljaGFyICpleGVjbmFtZTsKKwljaGFyICpwaWRmaWxlOworCWNoYXIgKmV4ZWNuYW1lX2NtcGJ1ZjsKKwl1bnNpZ25lZCBleGVjbmFtZV9zaXplb2Y7CisJaW50IHVzZXJfaWQ7CisJc21hbGxpbnQgc2lnbmFsX25yOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgdXNlcnNwZWMgICAgICAgICAgKEcudXNlcnNwZWMgICAgICAgICAgICApCisjZGVmaW5lIGNtZG5hbWUgICAgICAgICAgIChHLmNtZG5hbWUgICAgICAgICAgICAgKQorI2RlZmluZSBleGVjbmFtZSAgICAgICAgICAoRy5leGVjbmFtZSAgICAgICAgICAgICkKKyNkZWZpbmUgcGlkZmlsZSAgICAgICAgICAgKEcucGlkZmlsZSAgICAgICAgICAgICApCisjZGVmaW5lIHVzZXJfaWQgICAgICAgICAgIChHLnVzZXJfaWQgICAgICAgICAgICAgKQorI2RlZmluZSBzaWduYWxfbnIgICAgICAgICAoRy5zaWduYWxfbnIgICAgICAgICAgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJdXNlcl9pZCA9IC0xOyBcCisJc2lnbmFsX25yID0gMTU7IFwKK30gd2hpbGUgKDApCisKKyNpZmRlZiBPTERFUl9WRVJTSU9OX09GX1gKKy8qIC14LC0tZXhlYyBFWEVDVVRBQkxFCisgKiBMb29rIGZvciBwcm9jZXNzZXMgd2l0aCBtYXRjaGluZyAvcHJvYy8kUElEL2V4ZS4KKyAqIE1hdGNoIGlzIHBlcmZvcm1lZCB1c2luZyBkZXZpY2UraW5vZGUuCisgKi8KK3N0YXRpYyBpbnQgcGlkX2lzX2V4ZWMocGlkX3QgcGlkKQoreworCXN0cnVjdCBzdGF0IHN0OworCWNoYXIgYnVmW3NpemVvZigiL3Byb2MvJXUvZXhlIikgKyBzaXplb2YoaW50KSozXTsKKworCXNwcmludGYoYnVmLCAiL3Byb2MvJXUvZXhlIiwgKHVuc2lnbmVkKXBpZCk7CisJaWYgKHN0YXQoYnVmLCAmc3QpIDwgMCkKKwkJcmV0dXJuIDA7CisJaWYgKHN0LnN0X2RldiA9PSBleGVjc3RhdC5zdF9kZXYKKwkgJiYgc3Quc3RfaW5vID09IGV4ZWNzdGF0LnN0X2lubykKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBwaWRfaXNfZXhlYyhwaWRfdCBwaWQpCit7CisJc3NpemVfdCBieXRlczsKKwljaGFyIGJ1ZltzaXplb2YoIi9wcm9jLyV1L2NtZGxpbmUiKSArIHNpemVvZihpbnQpKjNdOworCWNoYXIgKnByb2NuYW1lLCAqZXhlbGluazsKKwlpbnQgbWF0Y2g7CisKKwlwcm9jbmFtZSA9IGJ1ZiArIHNwcmludGYoYnVmLCAiL3Byb2MvJXUvZXhlIiwgKHVuc2lnbmVkKXBpZCkgLSAzOworCisJZXhlbGluayA9IHhtYWxsb2NfcmVhZGxpbmsoYnVmKTsKKwltYXRjaCA9IChleGVsaW5rICYmIHN0cmNtcChleGVjbmFtZSwgZXhlbGluaykgPT0gMCk7CisJZnJlZShleGVsaW5rKTsKKwlpZiAobWF0Y2gpCisJCXJldHVybiBtYXRjaDsKKworCXN0cmNweShwcm9jbmFtZSwgImNtZGxpbmUiKTsKKwlieXRlcyA9IG9wZW5fcmVhZF9jbG9zZShidWYsIEcuZXhlY25hbWVfY21wYnVmLCBHLmV4ZWNuYW1lX3NpemVvZik7CisJaWYgKGJ5dGVzID4gMCkgeworCQlHLmV4ZWNuYW1lX2NtcGJ1ZltieXRlc10gPSAnXDAnOworCQlyZXR1cm4gc3RyY21wKGV4ZWNuYW1lLCBHLmV4ZWNuYW1lX2NtcGJ1ZikgPT0gMDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGlkX2lzX25hbWUocGlkX3QgcGlkKQoreworCS8qIC9wcm9jL1BJRC9zdGF0IGlzICJQSUQgKGNvbW1fMTVfYnl0ZXNfbWF4KSAuLi4iICovCisJY2hhciBidWZbMzJdOyAvKiBzaG91bGQgYmUgZW5vdWdoICovCisJY2hhciAqcCwgKnBlOworCisJc3ByaW50ZihidWYsICIvcHJvYy8ldS9zdGF0IiwgKHVuc2lnbmVkKXBpZCk7CisJaWYgKG9wZW5fcmVhZF9jbG9zZShidWYsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKSA8IDApCisJCXJldHVybiAwOworCWJ1ZltzaXplb2YoYnVmKSAtIDFdID0gJ1wwJzsgLyogcGFyYW5vaWEgKi8KKwlwID0gc3RyY2hyKGJ1ZiwgJygnKTsKKwlpZiAoIXApCisJCXJldHVybiAwOworCXBlID0gc3RycmNocigrK3AsICcpJyk7CisJaWYgKCFwZSkKKwkJcmV0dXJuIDA7CisJKnBlID0gJ1wwJzsKKwkvKiB3ZSByZXF1aXJlIGNvbW0gdG8gbWF0Y2ggYW5kIHRvIG5vdCBiZSB0cnVuY2F0ZWQgKi8KKwkvKiBpbiBMaW51eCwgaWYgY29tbSBpcyAxNSBjaGFycywgaXQgbWF5IGJlIGEgdHJ1bmNhdGVkCisJICogbmFtZSwgc28gd2UgZG9uJ3QgYWxsb3cgdGhhdCB0byBtYXRjaCAqLworCWlmIChzdHJsZW4ocCkgPj0gQ09NTV9MRU4gLSAxKSAvKiBDT01NX0xFTiBpcyAxNiAqLworCQlyZXR1cm4gMDsKKwlyZXR1cm4gc3RyY21wKHAsIGNtZG5hbWUpID09IDA7Cit9CisKK3N0YXRpYyBpbnQgcGlkX2lzX3VzZXIoaW50IHBpZCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzYjsKKwljaGFyIGJ1ZltzaXplb2YoIi9wcm9jLyIpICsgc2l6ZW9mKGludCkqM107CisKKwlzcHJpbnRmKGJ1ZiwgIi9wcm9jLyV1IiwgKHVuc2lnbmVkKXBpZCk7CisJaWYgKHN0YXQoYnVmLCAmc2IpICE9IDApCisJCXJldHVybiAwOworCXJldHVybiAoc2Iuc3RfdWlkID09ICh1aWRfdCl1c2VyX2lkKTsKK30KKworc3RhdGljIHZvaWQgY2hlY2soaW50IHBpZCkKK3sKKwlzdHJ1Y3QgcGlkX2xpc3QgKnA7CisKKwlpZiAoZXhlY25hbWUgJiYgIXBpZF9pc19leGVjKHBpZCkpIHsKKwkJcmV0dXJuOworCX0KKwlpZiAoY21kbmFtZSAmJiAhcGlkX2lzX25hbWUocGlkKSkgeworCQlyZXR1cm47CisJfQorCWlmICh1c2Vyc3BlYyAmJiAhcGlkX2lzX3VzZXIocGlkKSkgeworCQlyZXR1cm47CisJfQorCXAgPSB4bWFsbG9jKHNpemVvZigqcCkpOworCXAtPm5leHQgPSBHLmZvdW5kX3Byb2NzOworCXAtPnBpZCA9IHBpZDsKKwlHLmZvdW5kX3Byb2NzID0gcDsKK30KKworc3RhdGljIHZvaWQgZG9fcGlkZmlsZSh2b2lkKQoreworCUZJTEUgKmY7CisJdW5zaWduZWQgcGlkOworCisJZiA9IGZvcGVuX2Zvcl9yZWFkKHBpZGZpbGUpOworCWlmIChmKSB7CisJCWlmIChmc2NhbmYoZiwgIiV1IiwgJnBpZCkgPT0gMSkKKwkJCWNoZWNrKHBpZCk7CisJCWZjbG9zZShmKTsKKwl9IGVsc2UgaWYgKGVycm5vICE9IEVOT0VOVCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJvcGVuIHBpZGZpbGUgJXMiLCBwaWRmaWxlKTsKK30KKworc3RhdGljIHZvaWQgZG9fcHJvY2luaXQodm9pZCkKK3sKKwlESVIgKnByb2NkaXI7CisJc3RydWN0IGRpcmVudCAqZW50cnk7CisJaW50IHBpZDsKKworCWlmIChwaWRmaWxlKSB7CisJCWRvX3BpZGZpbGUoKTsKKwkJcmV0dXJuOworCX0KKworCXByb2NkaXIgPSB4b3BlbmRpcigiL3Byb2MiKTsKKworCXBpZCA9IDA7CisJd2hpbGUgKDEpIHsKKwkJZXJybm8gPSAwOyAvKiBjbGVhciBhbnkgcHJldmlvdXMgZXJyb3IgKi8KKwkJZW50cnkgPSByZWFkZGlyKHByb2NkaXIpOworLy8gVE9ETzogdGhpcyBjaGVjayBpcyB0b28gZ2VuZXJpYywgaXQncyBiZXR0ZXIKKy8vIHRvIGNoZWNrIGZvciBleGFjdCBlcnJubyhzKSB3aGljaCBtZWFuIHRoYXQgd2UgZ290IHN0YWxlIGVudHJ5CisJCWlmIChlcnJubykgLyogU3RhbGUgZW50cnksIHByb2Nlc3MgaGFzIGRpZWQgYWZ0ZXIgb3BlbmRpciAqLworCQkJY29udGludWU7CisJCWlmICghZW50cnkpIC8qIEVPRiwgbm8gbW9yZSBlbnRyaWVzICovCisJCQlicmVhazsKKwkJcGlkID0gYmJfc3RydG91KGVudHJ5LT5kX25hbWUsIE5VTEwsIDEwKTsKKwkJaWYgKGVycm5vKSAvKiBOYU4gKi8KKwkJCWNvbnRpbnVlOworCQljaGVjayhwaWQpOworCX0KKwljbG9zZWRpcihwcm9jZGlyKTsKKwlpZiAoIXBpZCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vdGhpbmcgaW4gL3Byb2MgLSBub3QgbW91bnRlZD8iKTsKK30KKworc3RhdGljIGludCBkb19zdG9wKHZvaWQpCit7CisJY2hhciAqd2hhdDsKKwlzdHJ1Y3QgcGlkX2xpc3QgKnA7CisJaW50IGtpbGxlZCA9IDA7CisKKwlpZiAoY21kbmFtZSkgeworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHdoYXQgPSB4c3RyZHVwKGNtZG5hbWUpOworCQlpZiAoIUVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB3aGF0ID0gY21kbmFtZTsKKwl9IGVsc2UgaWYgKGV4ZWNuYW1lKSB7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgd2hhdCA9IHhzdHJkdXAoZXhlY25hbWUpOworCQlpZiAoIUVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB3aGF0ID0gZXhlY25hbWU7CisJfSBlbHNlIGlmIChwaWRmaWxlKSB7CisJCXdoYXQgPSB4YXNwcmludGYoInByb2Nlc3MgaW4gcGlkZmlsZSAnJXMnIiwgcGlkZmlsZSk7CisJfSBlbHNlIGlmICh1c2Vyc3BlYykgeworCQl3aGF0ID0geGFzcHJpbnRmKCJwcm9jZXNzKGVzKSBvd25lZCBieSAnJXMnIiwgdXNlcnNwZWMpOworCX0gZWxzZSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnRlcm5hbCBlcnJvciwgcGxlYXNlIHJlcG9ydCIpOworCX0KKworCWlmICghRy5mb3VuZF9wcm9jcykgeworCQlpZiAoIVFVSUVUKQorCQkJcHJpbnRmKCJubyAlcyBmb3VuZDsgbm9uZSBraWxsZWRcbiIsIHdoYXQpOworCQlraWxsZWQgPSAtMTsKKwkJZ290byByZXQ7CisJfQorCWZvciAocCA9IEcuZm91bmRfcHJvY3M7IHA7IHAgPSBwLT5uZXh0KSB7CisJCWlmIChraWxsKHAtPnBpZCwgVEVTVCA/IDAgOiBzaWduYWxfbnIpID09IDApIHsKKwkJCWtpbGxlZCsrOworCQl9IGVsc2UgeworCQkJYmJfcGVycm9yX21zZygid2FybmluZzoga2lsbGluZyBwcm9jZXNzICV1IiwgKHVuc2lnbmVkKXAtPnBpZCk7CisJCQlwLT5waWQgPSAwOworCQkJaWYgKFRFU1QpIHsKKwkJCQkvKiBFeGFtcGxlOiAtSyAtLXRlc3QgLS1waWRmaWxlIFBJREZJTEUgZGV0ZWN0ZWQKKwkJCQkgKiB0aGF0IFBJREZJTEUncyBwaWQgZG9lc24ndCBleGlzdCAqLworCQkJCWtpbGxlZCA9IC0xOworCQkJCWdvdG8gcmV0OworCQkJfQorCQl9CisJfQorCWlmICghUVVJRVQgJiYga2lsbGVkKSB7CisJCXByaW50Zigic3RvcHBlZCAlcyAocGlkIiwgd2hhdCk7CisJCWZvciAocCA9IEcuZm91bmRfcHJvY3M7IHA7IHAgPSBwLT5uZXh0KQorCQkJaWYgKHAtPnBpZCkKKwkJCQlwcmludGYoIiAldSIsICh1bnNpZ25lZClwLT5waWQpOworCQlwdXRzKCIpIik7CisJfQorIHJldDoKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWZyZWUod2hhdCk7CisJcmV0dXJuIGtpbGxlZDsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0xPTkdfT1BUSU9OUworc3RhdGljIGNvbnN0IGNoYXIgc3RhcnRfc3RvcF9kYWVtb25fbG9uZ29wdHNbXSBBTElHTjEgPQorCSJzdG9wXDAiICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIksiCisJInN0YXJ0XDAiICAgICAgICBOb19hcmd1bWVudCAgICAgICAiUyIKKwkiYmFja2dyb3VuZFwwIiAgIE5vX2FyZ3VtZW50ICAgICAgICJiIgorCSJxdWlldFwwIiAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInEiCisJInRlc3RcMCIgICAgICAgICBOb19hcmd1bWVudCAgICAgICAidCIKKwkibWFrZS1waWRmaWxlXDAiIE5vX2FyZ3VtZW50ICAgICAgICJtIgorI2lmIEVOQUJMRV9GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZCisJIm9rbm9kb1wwIiAgICAgICBOb19hcmd1bWVudCAgICAgICAibyIKKwkidmVyYm9zZVwwIiAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJ2IgorCSJuaWNlbGV2ZWxcMCIgICAgUmVxdWlyZWRfYXJndW1lbnQgIk4iCisjZW5kaWYKKwkic3RhcnRhc1wwIiAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJhIgorCSJuYW1lXDAiICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIm4iCisJInNpZ25hbFwwIiAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAicyIKKwkidXNlclwwIiAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ1IgorCSJjaHVpZFwwIiAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgImMiCisJImV4ZWNcMCIgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAieCIKKwkicGlkZmlsZVwwIiAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJwIgorI2lmIEVOQUJMRV9GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZCisJInJldHJ5XDAiICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiUiIKKyNlbmRpZgorCTsKKyNlbmRpZgorCitpbnQgc3RhcnRfc3RvcF9kYWVtb25fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHN0YXJ0X3N0b3BfZGFlbW9uX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHQ7CisJY2hhciAqc2lnbmFtZTsKKwljaGFyICpzdGFydGFzOworCWNoYXIgKmNodWlkOworI2lmZGVmIE9MREVSX1ZFUlNJT05fT0ZfWAorCXN0cnVjdCBzdGF0IGV4ZWNzdGF0OworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fRkFOQ1kKKy8vCWNoYXIgKnJldHJ5X2FyZyA9IE5VTEw7CisvLwlpbnQgcmV0cmllcyA9IC0xOworCWNoYXIgKm9wdF9OOworI2VuZGlmCisKKwlJTklUX0coKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0xPTkdfT1BUSU9OUworCWFwcGxldF9sb25nX29wdGlvbnMgPSBzdGFydF9zdG9wX2RhZW1vbl9sb25nb3B0czsKKyNlbmRpZgorCisJLyogLUsgb3IgLVMgaXMgcmVxdWlyZWQ7IHRoZXkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAqLworCS8qIC1wIGlzIHJlcXVpcmVkIGlmIC1tIGlzIGdpdmVuICovCisJLyogLXhwdW4gKGF0IGxlYXN0IG9uZSkgaXMgcmVxdWlyZWQgaWYgLUsgaXMgZ2l2ZW4gKi8KKwkvKiAteGEgKGF0IGxlYXN0IG9uZSkgaXMgcmVxdWlyZWQgaWYgLVMgaXMgZ2l2ZW4gKi8KKwkvKiAtcSB0dXJucyBvZmYgLXYgKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICJLOlM6Sy0tUzpTLS1LOm0/cDpLP3hwdW46Uz94YSIKKwkJSUZfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWSgicS12Iik7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIktTYnF0bWE6bjpzOnU6Yzp4OnA6IgorCQlJRl9GRUFUVVJFX1NUQVJUX1NUT1BfREFFTU9OX0ZBTkNZKCJvdk46UjoiKSwKKwkJJnN0YXJ0YXMsICZjbWRuYW1lLCAmc2lnbmFtZSwgJnVzZXJzcGVjLCAmY2h1aWQsICZleGVjbmFtZSwgJnBpZGZpbGUKKwkJSUZfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWSgsJm9wdF9OKQorCQkvKiBXZSBhY2NlcHQgYW5kIGlnbm9yZSAtUiA8cGFyYW0+IC8gLS1yZXRyeSA8cGFyYW0+ICovCisJCUlGX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fRkFOQ1koLE5VTEwpCisJKTsKKworCWlmIChvcHQgJiBPUFRfcykgeworCQlzaWduYWxfbnIgPSBnZXRfc2lnbnVtKHNpZ25hbWUpOworCQlpZiAoc2lnbmFsX25yIDwgMCkgYmJfc2hvd191c2FnZSgpOworCX0KKworCWlmICghKG9wdCAmIE9QVF9hKSkKKwkJc3RhcnRhcyA9IGV4ZWNuYW1lOworCWlmICghZXhlY25hbWUpIC8qIGluIGNhc2UgLWEgaXMgZ2l2ZW4gYW5kIC14IGlzIG5vdCAqLworCQlleGVjbmFtZSA9IHN0YXJ0YXM7CisJaWYgKGV4ZWNuYW1lKSB7CisJCUcuZXhlY25hbWVfc2l6ZW9mID0gc3RybGVuKGV4ZWNuYW1lKSArIDE7CisJCUcuZXhlY25hbWVfY21wYnVmID0geG1hbGxvYyhHLmV4ZWNuYW1lX3NpemVvZiArIDEpOworCX0KKworLy8JSUZfRkVBVFVSRV9TVEFSVF9TVE9QX0RBRU1PTl9GQU5DWSgKKy8vCQlpZiAocmV0cnlfYXJnKQorLy8JCQlyZXRyaWVzID0geGF0b2lfcG9zaXRpdmUocmV0cnlfYXJnKTsKKy8vCSkKKwkvL2FyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKHVzZXJzcGVjKSB7CisJCXVzZXJfaWQgPSBiYl9zdHJ0b3UodXNlcnNwZWMsIE5VTEwsIDEwKTsKKwkJaWYgKGVycm5vKQorCQkJdXNlcl9pZCA9IHh1bmFtZTJ1aWQodXNlcnNwZWMpOworCX0KKwkvKiBCb3RoIHN0YXJ0IGFuZCBzdG9wIG5lZWQgdG8ga25vdyBjdXJyZW50IHByb2Nlc3NlcyAqLworCWRvX3Byb2Npbml0KCk7CisKKwlpZiAob3B0ICYgQ1RYX1NUT1ApIHsKKwkJaW50IGkgPSBkb19zdG9wKCk7CisJCXJldHVybiAob3B0ICYgT1BUX09LTk9ETykgPyAwIDogKGkgPD0gMCk7CisJfQorCisJaWYgKEcuZm91bmRfcHJvY3MpIHsKKwkJaWYgKCFRVUlFVCkKKwkJCXByaW50ZigiJXMgaXMgYWxyZWFkeSBydW5uaW5nXG4ldVxuIiwgZXhlY25hbWUsICh1bnNpZ25lZClHLmZvdW5kX3Byb2NzLT5waWQpOworCQlyZXR1cm4gIShvcHQgJiBPUFRfT0tOT0RPKTsKKwl9CisKKyNpZmRlZiBPTERFUl9WRVJTSU9OX09GX1gKKwlpZiAoZXhlY25hbWUpCisJCXhzdGF0KGV4ZWNuYW1lLCAmZXhlY3N0YXQpOworI2VuZGlmCisKKwkqLS1hcmd2ID0gc3RhcnRhczsKKwlpZiAob3B0ICYgT1BUX0JBQ0tHUk9VTkQpIHsKKyNpZiBCQl9NTVUKKwkJYmJfZGFlbW9uaXplKERBRU1PTl9ERVZOVUxMX1NURElPICsgREFFTU9OX0NMT1NFX0VYVFJBX0ZEUyArIERBRU1PTl9ET1VCTEVfRk9SSyk7CisJCS8qIERBRU1PTl9ERVZOVUxMX1NURElPIGlzIHN1cGVyZmx1b3VzIC0KKwkJICogaXQncyBhbHdheXMgZG9uZSBieSBiYl9kYWVtb25pemUoKSAqLworI2Vsc2UKKwkJcGlkX3QgcGlkID0geHZmb3JrKCk7CisJCWlmIChwaWQgIT0gMCkgeworCQkJLyogcGFyZW50ICovCisJCQkvKiB3aHkgX2V4aXQ/IHRoZSBjaGlsZCBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBzdGFjaywKKwkJCSAqIHNvICJyZXR1cm4gMCIgbWF5IGRvIGJhZCB0aGluZ3MgKi8KKwkJCV9leGl0KEVYSVRfU1VDQ0VTUyk7CisJCX0KKwkJLyogQ2hpbGQgKi8KKwkJc2V0c2lkKCk7IC8qIGRldGFjaCBmcm9tIGNvbnRyb2xsaW5nIHR0eSAqLworCQkvKiBSZWRpcmVjdCBzdGRpbyB0byAvZGV2L251bGwsIGNsb3NlIGV4dHJhIEZEcy4KKwkJICogV2UgZG8gbm90IGFjdHVhbGx5IGRhZW1vbml6ZSBiZWNhdXNlIG9mIERBRU1PTl9PTkxZX1NBTklUSVpFICovCisJCWJiX2RhZW1vbml6ZV9vcl9yZXhlYyhEQUVNT05fREVWTlVMTF9TVERJTworCQkJKyBEQUVNT05fQ0xPU0VfRVhUUkFfRkRTCisJCQkrIERBRU1PTl9PTkxZX1NBTklUSVpFLAorCQkJTlVMTCAvKiBhcmd2LCB1bnVzZWQgKi8gKTsKKyNlbmRpZgorCX0KKwlpZiAob3B0ICYgT1BUX01BS0VQSUQpIHsKKwkJLyogVXNlciB3YW50cyBfdXNfIHRvIG1ha2UgdGhlIHBpZGZpbGUgKi8KKwkJd3JpdGVfcGlkZmlsZShwaWRmaWxlKTsKKwl9CisJaWYgKG9wdCAmIE9QVF9jKSB7CisJCXN0cnVjdCBiYl91aWRnaWRfdCB1Z2lkID0geyAtMSwgLTEgfTsKKwkJcGFyc2VfY2hvd25fdXNlcmdyb3VwX29yX2RpZSgmdWdpZCwgY2h1aWQpOworCQlpZiAodWdpZC51aWQgIT0gKHVpZF90KSAtMSkgeworCQkJc3RydWN0IHBhc3N3ZCAqcHcgPSB4Z2V0cHd1aWQodWdpZC51aWQpOworCQkJaWYgKHVnaWQuZ2lkICE9IChnaWRfdCkgLTEpCisJCQkJcHctPnB3X2dpZCA9IHVnaWQuZ2lkOworCQkJLyogaW5pdGdyb3Vwcywgc2V0Z2lkLCBzZXR1aWQ6ICovCisJCQljaGFuZ2VfaWRlbnRpdHkocHcpOworCQl9IGVsc2UgaWYgKHVnaWQuZ2lkICE9IChnaWRfdCkgLTEpIHsKKwkJCXhzZXRnaWQodWdpZC5naWQpOworCQkJc2V0Z3JvdXBzKDEsICZ1Z2lkLmdpZCk7CisJCX0KKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfU1RBUlRfU1RPUF9EQUVNT05fRkFOQ1kKKwlpZiAob3B0ICYgT1BUX05JQ0VMRVZFTCkgeworCQkvKiBTZXQgcHJvY2VzcyBwcmlvcml0eSAqLworCQlpbnQgcHJpbyA9IGdldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCkgKyB4YXRvaV9yYW5nZShvcHRfTiwgSU5UX01JTi8yLCBJTlRfTUFYLzIpOworCQlpZiAoc2V0cHJpb3JpdHkoUFJJT19QUk9DRVNTLCAwLCBwcmlvKSA8IDApIHsKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0cHJpb3JpdHkoJWQpIiwgcHJpbyk7CisJCX0KKwl9CisjZW5kaWYKKwlleGVjdnAoc3RhcnRhcywgYXJndik7CisJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBleGVjdXRlICclcyciLCBzdGFydGFzKTsKK30KZGlmZiAtLWdpdCBhL2RlYmlhbnV0aWxzL3doaWNoLmMgYi9kZWJpYW51dGlscy93aGljaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MGU3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9kZWJpYW51dGlscy93aGljaC5jCkBAIC0wLDAgKzEsNjIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBHYWJyaWVsIFNvbWxvIDxzb21sbyBhdCBjbXUuZWR1PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHdoaWNoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbQ09NTUFORF0uLi4iCisvL3VzYWdlOiNkZWZpbmUgd2hpY2hfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJMb2NhdGUgYSBDT01NQU5EIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB3aGljaF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCB3aGljaCBsb2dpblxuIgorLy91c2FnZTogICAgICAgIi9iaW4vbG9naW5cbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCB3aGljaF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgd2hpY2hfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKmVudl9wYXRoOworCWludCBzdGF0dXMgPSAwOworCisJZW52X3BhdGggPSBnZXRlbnYoIlBBVEgiKTsKKwlpZiAoIWVudl9wYXRoKQorCQllbnZfcGF0aCA9IGJiX2RlZmF1bHRfcm9vdF9wYXRoOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiOyAvKiBhdCBsZWFzdCBvbmUgYXJndW1lbnQgKi8KKwlnZXRvcHQzMihhcmd2LCAiYSIpOworCWFyZ3YgKz0gb3B0aW5kOworCisJZG8geworCQlpbnQgbWlzc2luZyA9IDE7CisKKwkJLyogSWYgZmlsZSBjb250YWlucyBhIHNsYXNoIGRvbid0IHVzZSBQQVRIICovCisJCWlmIChzdHJjaHIoKmFyZ3YsICcvJykpIHsKKwkJCWlmIChmaWxlX2lzX2V4ZWN1dGFibGUoKmFyZ3YpKSB7CisJCQkJbWlzc2luZyA9IDA7CisJCQkJcHV0cygqYXJndik7CisJCQl9CisJCX0gZWxzZSB7CisJCQljaGFyICpwYXRoOworCQkJY2hhciAqdG1wOworCQkJY2hhciAqcDsKKworCQkJcGF0aCA9IHRtcCA9IHhzdHJkdXAoZW52X3BhdGgpOworCQkJd2hpbGUgKChwID0gZmluZF9leGVjdXRhYmxlKCphcmd2LCAmdG1wKSkgIT0gTlVMTCkgeworCQkJCW1pc3NpbmcgPSAwOworCQkJCXB1dHMocCk7CisJCQkJZnJlZShwKTsKKwkJCQlpZiAoIW9wdGlvbl9tYXNrMzIpIC8qIC1hIG5vdCBzZXQgKi8KKwkJCQkJYnJlYWs7CisJCQl9CisJCQlmcmVlKHBhdGgpOworCQl9CisJCXN0YXR1cyB8PSBtaXNzaW5nOworCX0gd2hpbGUgKCorK2FyZ3YpOworCisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2RvY3MvU2VyaWFsLVByb2dyYW1taW5nLUhPV1RPLnR4dCBiL2RvY3MvU2VyaWFsLVByb2dyYW1taW5nLUhPV1RPLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTM5NTRiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9TZXJpYWwtUHJvZ3JhbW1pbmctSE9XVE8udHh0CkBAIC0wLDAgKzEsNDI0IEBACitEb3dubG9hZGVkIGZyb20gaHR0cDovL3d3dy5sYWZuLm9yZy9+ZGF2ZS9saW51eC9TZXJpYWwtUHJvZ3JhbW1pbmctSE9XVE8udHh0CitTZWVtcyB0byBiZSBzb21ld2hhdCBvbGQsIGJ1dCBjb250YWlucyB1c2VmdWwgYml0cyBmb3IgZ2V0dHkuYyBoYWNraW5nCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgVGhlIExpbnV4IFNlcmlhbCBQcm9ncmFtbWluZyBIT1dUTywgUGFydCAxIG9mIDIKKyAgQnkgVmVybm9uIEMuIEhveGllCisgIHYyLjAgMTAgU2VwdGVtYmVyIDE5OTkKKworICBUaGlzIGRvY3VtZW50IGRlc2NyaWJlcyBob3cgdG8gcHJvZ3JhbSBjb21tdW5pY2F0aW9ucyB3aXRoIGRldmljZXMKKyAgb3ZlciBhIHNlcmlhbCBwb3J0IG9uIGEgTGludXggYm94LgorICBfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCisKKyAgVGFibGUgb2YgQ29udGVudHMKKworICAxLiBDb3B5cmlnaHQKKworICAyLiBJbnRyb2R1Y3Rpb24KKworICAzLiBPcGVuaW5nCisKKyAgNC4gQ29tbWFuZHMKKworICA1LiBDaGFuZ2luZyBCYXVkIFJhdGVzCisKKyAgNi4gQWRkaXRpb25hbCBDb250cm9sIENhbGxzCisKKyAgICAgNi4xIFNlbmRpbmcgYSAiYnJlYWsiLgorICAgICA2LjIgSGFyZHdhcmUgZmxvdyBjb250cm9sLgorICAgICA2LjMgRmx1c2hpbmcgSS9PIGJ1ZmZlcnMuCisKKyAgNy4gTW9kZW0gY29udHJvbAorCisgIDguIFByb2Nlc3MgR3JvdXBzCisKKyAgICAgOC4xIFNlc3Npb25zCisgICAgIDguMiBQcm9jZXNzIEdyb3VwcworICAgICA4LjMgQ29udHJvbGxpbmcgVGVybWluYWwKKyAgICAgICAgOC4zLjEgR2V0IHRoZSBmb3JlZ3JvdW5kIGdyb3VwIHByb2Nlc3MgaWQuCisgICAgICAgIDguMy4yIFNldCB0aGUgZm9yZWdyb3VuZCBwcm9jZXNzIGdyb3VwIGlkIG9mIGEgdGVybWluYWwuCisgICAgICAgIDguMy4zIEdldCBwcm9jZXNzIGdyb3VwIGlkLgorCisgIDkuIExvY2tmaWxlcworCisgIDEwLiBBZGRpdGlvbmFsIEluZm9ybWF0aW9uCisKKyAgMTEuIEZlZWRiYWNrCisKKyAgX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworCisgIDEuICBDb3B5cmlnaHQKKworICBUaGUgTGludXggU2VyaWFsLVByb2dyYW1taW5nLUhPV1RPIGlzIGNvcHlyaWdodCAoQykgMTk5NyBieSBWZXJub24KKyAgSG94aWUuICBMaW51eCBIT1dUTyBkb2N1bWVudHMgbWF5IGJlIHJlcHJvZHVjZWQgYW5kIGRpc3RyaWJ1dGVkIGluCisgIHdob2xlIG9yIGluIHBhcnQsIGluIGFueSBtZWRpdW0gcGh5c2ljYWwgb3IgZWxlY3Ryb25pYywgYXMgbG9uZyBhcworICB0aGlzIGNvcHlyaWdodCBub3RpY2UgaXMgcmV0YWluZWQgb24gYWxsIGNvcGllcy4gQ29tbWVyY2lhbAorICByZWRpc3RyaWJ1dGlvbiBpcyBhbGxvd2VkIGFuZCBlbmNvdXJhZ2VkOyBob3dldmVyLCB0aGUgYXV0aG9yIHdvdWxkCisgIGxpa2UgdG8gYmUgbm90aWZpZWQgb2YgYW55IHN1Y2ggZGlzdHJpYnV0aW9ucy4KKworICBBbGwgdHJhbnNsYXRpb25zLCBkZXJpdmF0aXZlIHdvcmtzLCBvciBhZ2dyZWdhdGUgd29ya3MgaW5jb3Jwb3JhdGluZworICB0aGlzIExpbnV4IEhPV1RPIGRvY3VtZW50IG11c3QgYmUgY292ZXJlZCB1bmRlciB0aGlzIGNvcHlyaWdodCBub3RpY2UuCisgIFRoYXQgaXMsIHlvdSBtYXkgbm90IHByb2R1Y2UgYSBkZXJpdmF0aXZlIHdvcmsgZnJvbSB0aGlzIEhPV1RPIGFuZAorICBpbXBvc2UgYWRkaXRpb25hbCByZXN0cmljdGlvbnMgb24gaXRzIGRpc3RyaWJ1dGlvbi4KKworICBUaGlzIHZlcnNpb24gaXMgYSBjb21wbGV0ZSByZXdyaXRlIG9mIHRoZSBwcmV2aW91cyBTZXJpYWwtUHJvZ3JhbW1pbmctCisgIEhPV1RPICBieSBQZXRlciBILiBCYXVtYW5uLCAgPG1haWx0bzpQZXRlci5CYXVtYW5uQGRsci5kZT4KKworICAyLiAgSW50cm9kdWN0aW9uCisKKyAgVGhpcyBIT1dUTyB3aWxsIGF0dGVtcHQgdG8gZ2l2ZSBoaW50cyBhYm91dCBob3cgdG8gd3JpdGUgYSBwcm9ncmFtCisgIHdoaWNoIG5lZWRzIHRvIGFjY2VzcyBhIHNlcmlhbCBwb3J0LiAgSXRzIHByaW5jaXBhbCBmb2N1cyB3aWxsIGJlIG9uCisgIHRoZSBMaW51eCBpbXBsZW1lbnRhdGlvbiBhbmQgd2hhdCB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBsaWJyYXJ5CisgIGZ1bmN0aW9ucyBhdmFpbGFibGUuCisKKyAgU29tZW9uZSBhc2tlZCBhYm91dCB3aGljaCBvZiBzZXZlcmFsIHNlcXVlbmNlcyBvZiBvcGVyYXRpb25zIHdhcworICByaWdodC4gIFRoZXJlIGlzIG5vIGFic29sdXRlIHJpZ2h0IHdheSB0byBhY2NvbXBsaXNoIGFuIG91dGNvbWUuICBUaGUKKyAgb3B0aW9ucyBhdmFpbGFibGUgYXJlIHRvbyBudW1lcm91cy4gIElmIHlvdXIgc2VxdWVuY2VzIHByb2R1Y2VzIHRoZQorICBkZXNpcmVkIHJlc3VsdHMsIHRoZW4gdGhhdCBpcyB0aGUgcmlnaHQgd2F5IGZvciB5b3UuICBBbm90aGVyCisgIHByb2dyYW1tZXIgbWF5IHNlbGVjdCBhbm90aGVyIHNldCBvZiBvcHRpb25zIGFuZCBnZXQgdGhlIHNhbWUgcmVzdWx0cy4KKyAgSGlzIG1ldGhvZCBpcyByaWdodCBmb3IgaGltLgorCisgIE5laXRoZXIgb2YgdGhlc2UgbWV0aG9kcyBtYXkgb3BlcmF0ZSBwcm9wZXJseSB3aXRoIHNvbWUgb3RoZXIKKyAgaW1wbGVtZW50YXRpb24gb2YgVU5JWC4gIEl0IGlzIHN0cmFuZ2UgdGhhdCBtYW55IG9mIHRoZSBjb25jZXB0cyB3aGljaAorICB3ZXJlIGltcGxlbWVudGVkIGluIHRoZSBTWVNWIHZlcnNpb24gaGF2ZSBiZWVuIGR1bXBlZC4gIEJlY2F1c2UgVU5JWAorICB3YXMgZGV2ZWxvcGVkIGJ5IEFUJlQgYW5kIG11Y2ggY29kZSBoYXMgYmVlbiBnZW5lcmF0ZWQgb24gdGhvc2UKKyAgY29uY2VwdHMsIHRoZSBBVCZUIHZlcnNpb24gc2hvdWxkIGJlIHRoZSBzdGFuZGFyZCB0byB3aGljaCBvdGhlcnMKKyAgc2hvdWxkIGVtdWxhdGUuCisKKyAgTm93IHRoZSBzdGFuZGFyZCBpcyBQT1NJWC4KKworICBJdCB3YXMgb25jZSBzdGF0ZWQgdGhhdCB0aGUgcG9wdWxhcml0eSBvZiBVTklYIGFuZCBDIHdhcyB0aGF0IHRoZXkKKyAgd2VyZSBjcmVhdGVkIGJ5IHByb2dyYW1tZXJzIGZvciBwcm9ncmFtbWVycy4gIE5vdCBieSBzY2hvbGFycyB3aG8KKyAgaW5zaXN0IG9uIHB1cml0eSBvZiBzdHlsZSBpbiBkZWZlcmVuY2UgdG8gcmVzdWx0cyBhbmQgc2ltcGxpY2l0eSBvZgorICB1c2UuICBOb3QgYnkgY29tbWl0dGVlcyB3aXRoIHBlb3BsZSB3aG8gaGF2ZSBkaXZlcnNlIHBlcnNvbmFsIG9yCisgIHByb3ByaWV0YXJ5IGFnZW5kYS4gIE5vdyBBTlNJIGFuZCBQT1NJWCBoYXZlIHN0cmF5ZWQgZnJvbSB0aG9zZQorICBvcmlnaW5hbCBjbGVhciBhbmQgc2ltcGx5IGNvbmNlcHRzLgorCisgIDMuICBPcGVuaW5nCisKKyAgVGhlIHZhcmlvdXMgc2VyaWFsIGRldmljZXMgYXJlIG9wZW5lZCBqdXN0IGFzIGFueSBvdGhlciBmaWxlLgorICBBbHRob3VnaCwgdGhlIGZvcGVuKDMpIGNvbW1hbmQgbWF5IGJlIHVzZWQsIHRoZSBwbGFpbiBvcGVuKDIpIGlzCisgIHByZWZlcnJlZC4gIFRoaXMgY2FsbCByZXR1cm5zIHRoZSBmaWxlIGRlc2NyaXB0b3Igd2hpY2ggaXMgcmVxdWlyZWQKKyAgZm9yIHRoZSB2YXJpb3VzIGNvbW1hbmRzIHRoYXQgY29uZmlndXJlIHRoZSBpbnRlcmZhY2UuCisKKyAgT3BlbigyKSBoYXMgdGhlIGZvcm1hdDoKKworICAgICAgICNpbmNsdWRlIDxmY250bC5oPgorICAgICAgIGludCBvcGVuKGNoYXIgKnBhdGgsIGludCBmbGFncywgW2ludCBtb2RlXSk7CisKKyAgSW4gYWRkaXRpb24gdG8gdGhlIG9idmlvdXMgT19SRFdSLCBPX1dST05MWSBhbmQgT19SRE9OTFksIHR3bworICBhZGRpdGlvbmFsIGZsYWdzIGFyZSBhdmFpbGFibGUuICBUaGVzZSBhcmUgT19OT05CTE9DSyBhbmQgT19OT0NUVFkuCisgIE90aGVyIGZsYWdzIGxpc3RlZCBpbiB0aGUgb3BlbigyKSBtYW51YWwgcGFnZSBhcmUgbm90IGFwcGxpY2FibGUgdG8KKyAgc2VyaWFsIGRldmljZXMuCisKKyAgTm9ybWFsbHksIGEgc2VyaWFsIGRldmljZSBvcGVucyBpbiAiYmxvY2tpbmciIG1vZGUuICBUaGlzIG1lYW5zIHRoYXQKKyAgdGhlIG9wZW4oKSB3aWxsIG5vdCByZXR1cm4gdW50aWwgdGhlIENhcnJpZXIgRGV0ZWN0IGxpbmUgZnJvbSB0aGUgcG9ydAorICBpcyBhY3RpdmUsIGUuZy4gbW9kZW0sIGlzIGFjdGl2ZS4gIFdoZW4gb3BlbmVkIHdpdGggdGhlIE9fTk9OQkxPQ0sKKyAgZmxhZyBzZXQsIHRoZSBvcGVuKCkgd2lsbCByZXR1cm4gaW1tZWRpYXRlbHkgcmVnYXJkbGVzcyBvZiB0aGUgc3RhdHVzCisgIG9mIHRoZSBEQ0QgbGluZS4gIFRoZSAiYmxvY2tpbmciIG1vZGUgYWxzbyBhZmZlY3RzIHRoZSByZWFkKCkgY2FsbC4KKworICBUaGUgZmNudGwoMikgY29tbWFuZCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIE9fTk9OQkxPQ0sgZmxhZyBhbnl0aW1lCisgIGFmdGVyIHRoZSBkZXZpY2UgaGFzIGJlZW4gb3BlbmVkLgorCisgIFRoZSBkZXZpY2UgZHJpdmVyIGFuZCB0aGUgZGF0YSBwYXNzaW5nIHRocm91Z2ggaXQgYXJlIGNvbnRyb2xsZWQKKyAgYWNjb3JkaW5nIHRvIHNldHRpbmdzIGluIHRoZSBzdHJ1Y3QgdGVybWlvcy4gIFRoaXMgc3RydWN0dXJlIGlzCisgIGRlZmluZWQgaW4gIi91c3IvaW5jbHVkZS90ZXJtaW9zLmgiLiAgSW4gdGhlIExpbnV4IHRyZWUsIGZ1cnRoZXIKKyAgcmVmZXJlbmNlIGlzIG1hZGUgdG8gIi91c3IvaW5jbHVkZS9hc20vdGVybWJpdHMuaCIuCisgIEluIGJsb2NraW5nIG1vZGUsIGEgcmVhZCgyKSB3aWxsIGJsb2NrIHVudGlsIGRhdGEgaXMgYXZhaWxhYmxlIG9yIGEKKyAgc2lnbmFsIGlzIHJlY2VpdmVkLiAgSXQgaXMgc3RpbGwgc3ViamVjdCB0byBzdGF0ZSBvZiB0aGUgSUNBTk9OIGZsYWcuCisKKyAgV2hlbiB0aGUgdGVybWlvcy5jX2xmbGFnIElDQU5PTiBiaXQgaXMgc2V0LCBpbnB1dCBkYXRhIGlzIGNvbGxlY3RlZAorICBpbnRvIHN0cmluZ3MgdW50aWwgYSBOTCwgRU9GIG9yIEVPTCBjaGFyYWN0ZXIgaXMgcmVjZWl2ZWQuICBZb3UgY2FuCisgIGRlZmluZSB0aGVzZSBpbiB0aGUgdGVybWlvcy5jX2NjW10gYXJyYXkuICBBbHNvLCBFUkFTRSBhbmQgS0lMTAorICBjaGFyYWN0ZXJzIHdpbGwgb3BlcmF0ZSBvbiB0aGUgaW5jb21pbmcgZGF0YSBiZWZvcmUgaXQgaXMgZGVsaXZlcmVkIHRvCisgIHRoZSB1c2VyLgorCisgIEluIG5vbi1jYW5vbmljYWwgbW9kZSwgaW5jb21pbmcgZGF0YSBpcyBxdWFudGlmaWVkIGJ5IHVzZSBvZiB0aGUKKyAgY19jY1tWTUlOIGFuZCBjX2NjW1ZUSU1FXSB2YWx1ZXMgaW4gdGVybWlvcy5jX2NjW10uCisKKyAgU29tZSBwcm9ncmFtbWVycyB1c2UgdGhlIHNlbGVjdCgpIGNhbGwgdG8gZGV0ZWN0IHRoZSBjb21wbGV0aW9uIG9mIGEKKyAgcmVhZCgpLiAgVGhpcyBpcyBub3QgdGhlIGJlc3Qgd2F5IG9mIGNoZWNraW5nIGZvciBpbmNvbWluZyBkYXRhLgorICBTZWxlY3QoKSBpcyBwYXJ0IG9mIHRoZSBTT0NLRVRTIHNjaGVtZSBhbmQgdG9vIGNvbXBsZXggZm9yIG1vc3QKKyAgYXBwbGljYXRpb25zLgorCisgIEEgZnVsbCBleHBsYW5hdGlvbiBvZiB0aGUgZmllbGRzIG9mIHRoZSB0ZXJtaW9zIHN0cnVjdHVyZSBpcyBjb250YWluZWQKKyAgaW4gdGVybWlvcyg3KSBvZiB0aGUgVXNlcnMgTWFudWFsLiAgQSB2ZXJzaW9uIGlzIGluY2x1ZGVkIGluIFBhcnQgMiBvZgorICB0aGlzIEhPV1RPIGRvY3VtZW50LgorCisgIDQuICBDb21tYW5kcworCisgIENoYW5nZXMgdG8gdGhlIHN0cnVjdCB0ZXJtaW9zIGFyZSBtYWRlIGJ5IHJldHJpZXZpbmcgdGhlIGN1cnJlbnQKKyAgc2V0dGluZ3MsIG1ha2luZyB0aGUgZGVzaXJlZCBjaGFuZ2VzIGFuZCB0cmFuc21pdHRpbmcgdGhlIG1vZGlmaWVkCisgIHN0cnVjdHVyZSBiYWNrIHRvIHRoZSBrZXJuZWwuCisKKyAgVGhlIGhpc3RvcmljIG1lYW5zIG9mIGNvbW11bmljYXRpbmcgd2l0aCB0aGUga2VybmVsIHdhcyBieSB1c2Ugb2YgdGhlCisgIGlvY3RsKGZkLCBDT01NQU5ELCBhcmcpIHN5c3RlbSBjYWxsLiAgVGhlbiB0aGUgcHVyaXN0cyBpbiB0aGUKKyAgY29tcHV0ZXIgaW5kdXN0cnkgZGVjaWRlZCB0aGF0IHRoaXMgd2FzIG5vdCBnZW5ldGljYWxseSBjb25zaXN0ZW50LgorICBUaGVpciBhcmd1bWVudCB3YXMgdGhhdCB0aGUgYXJndW1lbnQgY2hhbmdlZCBpdHMgc3RyaXBlcy4gIFNvbWV0aW1lcworICBpdCB3YXMgYW4gaW50LCBzb21ldGltZXMgaXQgd2FzIGEgcG9pbnRlciB0byBpbnQgYW5kIG90aGVyIHRpbWVzIGl0CisgIHdhcyBhIHBvaW50ZXIgdG8gc3RydWN0IHRlcm1pb3MuICBUaGVuIHRoZXJlIHdlcmUgdGhvc2UgdGltZXMgaXQgd2FzCisgIGVtcHR5IG9yIE5VTEwuICBUaGVzZSB2YXJpYXRpb25zIGFyZSBkZXBlbmRlbnQgdXBvbiB0aGUgQ09NTUFORC4KKworICBBcyBhIGFsdGVybmF0aXZlLCB0aGUgdGMqIHNlcmllcyBvZiBmdW5jdGlvbnMgd2VyZSBjb25jb2N0ZWQuCisKKyAgVGhlc2UgYXJlOgorCisgICAgICAgaW50IHRjZ2V0YXR0cihpbnQgZmlsZWRlcywgc3RydWN0IHRlcm1pb3MgKnRlcm1pb3NfcCk7CisgICAgICAgaW50IHRjc2V0YXR0cihpbnQgZmlsZWRlcywgaW50IG9wdGlvbmFsX2FjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGVybWlvcyAqdGVybWlvc19wKTsKKworICBpbnN0ZWFkIG9mOgorCisgICAgICAgaW50IGlvY3RsKGludCBmaWxlZGVzLCBpbnQgY29tbWFuZCwKKyAgICAgICAgICAgICAgICAgc3RydWN0IHRlcm1pb3MgKnRlcm1pb3NfcCk7CisKKyAgd2hlcmUgY29tbWFuZCBpcyBUQ0dFVFMgb3Igb25lIG9mIFRDU0VUUywgVENTRVRTVyBvciBUQ1NFVFNGLgorCisgIFRoZSBUQ1NFVFMgY29tbWFuZCBpcyBjb21wYXJhYmxlIHRvIHRoZSBUQ1NBTk9XIG9wdGlvbmFsX2FjdGlvbiBmb3IKKyAgdGhlIHRjKiB2ZXJzaW9uLiAgVGhlc2UgZGlyZWN0IHRoZSBrZXJuZWwgdG8gYWRvcHQgdGhlIGNoYW5nZXMKKyAgaW1tZWRpYXRlbHkuICBPdGhlciBwYWlycyBhcmU6CisKKyAgICBjb21tYW5kICAgb3B0aW9uYWxfYWN0aW9uICAgTWVhbmluZworICAgIFRDU0VUU1cgICBUQ1NBRFJBSU4gICAgICAgICBDaGFuZ2UgYWZ0ZXIgYWxsIG91dHB1dCBoYXMgZHJhaW5lZC4KKyAgICBUQ1NFVFNGICAgVENTQUZMVVNIICAgICAgICAgQ2hhbmdlIGFmdGVyIGFsbCBvdXRwdXQgaGFzIGRyYWluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBkaXNjYXJkIGFueSBpbnB1dCBjaGFyYWN0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCByZWFkLgorCisgIFNpbmNlIHRoZSByZXR1cm4gY29kZSBmcm9tIGVpdGhlciB0aGUgaW9jdGwoMikgb3IgdGhlIHRjc2V0YXR0cigyKQorICBjb21tYW5kcyBvbmx5IGluZGljYXRlIHRoYXQgdGhlIGNvbW1hbmQgd2FzIHByb2Nlc3NlZCBieSB0aGUga2VybmVsLgorICBUaGVzZSBkbyBub3QgaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhlIGNoYW5nZXMgd2VyZSBhY3R1YWxseQorICBhY2NvbXBsaXNoZWQuICBFaXRoZXIgb2YgdGhlc2UgY29tbWFuZHMgc2hvdWxkIGJlIGZvbGxvd2VkIGJ5IGEgY2FsbAorICB0bzoKKworICAgICAgIGlvY3RsKGZkLCBUQ0dFVFMsICZuZXdfdGVybWlvcyk7CisKKyAgb3I6CisKKyAgICAgICB0Y2dldGF0dHIoZmQsICZuZXdfdGVybWlvcyk7CisKKyAgQSB1c2VyIGZ1bmN0aW9uIHdoaWNoIG1ha2VzIGNoYW5nZXMgdG8gdGhlIHRlcm1pb3Mgc3RydWN0dXJlIHNob3VsZAorICBkZWZpbmUgdHdvIHN0cnVjdCB0ZXJtaW9zIHZhcmlhYmxlcy4gIE9uZSBvZiB0aGVzZSB2YXJpYWJsZXMgc2hvdWxkCisgIGNvbnRhaW4gdGhlIGRlc2lyZWQgY29uZmlndXJhdGlvbi4gIFRoZSBvdGhlciBzaG91bGQgY29udGFpbiBhIGNvcHkgb2YKKyAgdGhlIGtlcm5lbHMgdmVyc2lvbi4gIFRoZW4gYWZ0ZXIgdGhlIGRlc2lyZWQgY29uZmlndXJhdGlvbiBoYXMgYmVlbgorICBzZW50IHRvIHRoZSBrZXJuZWwsIGFub3RoZXIgY2FsbCBzaG91bGQgYmUgbWFkZSB0byByZXRyaWV2ZSB0aGUKKyAga2VybmVscyB2ZXJzaW9uLiAgVGhlbiB0aGUgdHdvIGNvbXBhcmVkLgorCisgIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gYWRkIFJUUy9DVFMgZmxvdyBjb250cm9sOgorCisgICAgICAgc3RydWN0IHRlcm1pb3MgbXlfdGVybWlvczsKKyAgICAgICBzdHJ1Y3QgdGVybWlvcyBuZXdfdGVybWlvczsKKworICAgICAgIHRjZ2V0YXR0cihmZCwgJm15X3Rlcm1pb3MpOworICAgICAgIG15X3Rlcm1pb3MuY19mbGFnIHw9IENSVFNDVFM7CisgICAgICAgdGNzZXRhdHRyKGZkLCBUQ1NBTk9XLCAmbXlfdGVybWlvcyk7CisgICAgICAgdGNnZXRhdHRyKGZkLCAmbmV3X3Rlcm1pb3MpOworICAgICAgIGlmIChtZW1jbXAobXlfdGVybWlvcywgbmV3X3Rlcm1pb3MsCisgICAgICAgICAgICBzaXplb2YobXlfdGVybWlvcykpICE9IDApIHsKKyAgICAgICAgICAgLyogZG8gc29tZSBlcnJvciBoYW5kbGluZyAqLworICAgICAgIH0KKworICA1LiAgQ2hhbmdpbmcgQmF1ZCBSYXRlcworCisgIFdpdGggTGludXgsIHRoZSBiYXVkIHJhdGUgY2FuIGJlIGNoYW5nZWQgdXNpbmcgYSB0ZWNobmlxdWUgc2ltaWxhciB0bworICBhZGQvZGVsZXRlIFJUUy9DVFMuCisKKyAgc3RydWN0IHRlcm1pb3MgbXlfdGVybWlvczsKKyAgc3RydWN0IHRlcm1pb3MgbmV3X3Rlcm1pb3M7CisKKyAgdGNnZXRhdHRyKGZkLCAmbXlfdGVybWlvcyk7CisgIG15X3Rlcm1pb3MuY19mbGFnICY9IH5DQkFVRDsKKyAgbXlfdGVybWlvcy5jX2ZsYWcgfD0gQjE5MjAwOworICB0Y3NldGF0dHIoZmQsIFRDU0FOT1csICZteV90ZXJtaW9zKTsKKyAgdGNnZXRhdHRyKGZkLCAmbmV3X3Rlcm1pb3MpOworICBpZiAobWVtY21wKG15X3Rlcm1pb3MsIG5ld190ZXJtaW9zLAorICAgICAgIHNpemVvZihteV90ZXJtaW9zKSkgIT0gMCkgeworICAgICAgLyogZG8gc29tZSBlcnJvciBoYW5kbGluZyAqLworICB9CisKKyAgUE9TSVggYWRkcyBhbm90aGVyIG1ldGhvZC4gIFRoZXkgZGVmaW5lOgorCisgICAgICAgc3BlZWRfdCBjZmdldGlzcGVlZChjb25zdCBzdHJ1Y3QgdGVybWlvcyAqdGVybWlvc19wKTsKKyAgICAgICBzcGVlZF90IGNmZ2V0b3NwZWVkKGNvbnN0IHN0cnVjdCB0ZXJtaW9zICp0ZXJtaW9zX3ApOworCisgIGxpYnJhcnkgY2FsbHMgdG8gZXh0cmFjdCB0aGUgY3VycmVudCBpbnB1dCBvciBvdXRwdXQgc3BlZWQgZnJvbSB0aGUKKyAgc3RydWN0IHRlcm1pb3MgcG9pbnRlZCB0byB3aXRoICp0ZXJtaW9fcC4gIFRoaXMgaXMgYSB2YXJpYWJsZSBkZWZpbmVkCisgIGluIHRoZSBjYWxsaW5nIHByb2Nlc3MuICBJbiBwcmFjdGljZSwgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoaXMKKyAgdGVybWlvcywgc2hvdWxkIGJlIG9idGFpbmVkIGJ5IHRoZSB0Y2dldGF0dHIoKSBjYWxsIG9yIGFuIGlvY3RsKCkgY2FsbAorICB1c2luZyB0aGUgVENHRVRTIGNvbW1hbmQuCisKKyAgVGhlIGNvbXBhbmlvbiBsaWJyYXJ5IGNhbGxzIGFyZToKKworICAgICAgIGludCBjZnNldGlzcGVlZChzdHJ1Y3QgdGVybWlvcyAqdGVybWlvc19wLCBzcGVlZF90IHNwZWVkKTsKKyAgICAgICBpbnQgY2ZzZXRvc3BlZWQoc3RydWN0IHRlcm1pb3MgKnRlcm1pb3NfcCwgc3BlZWRfdCBzcGVlZCk7CisKKyAgd2hpY2ggYXJlIHVzZWQgdG8gY2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgYmF1ZCByYXRlIGluIHRoZSBsb2NhbGx5CisgIGRlZmluZWQgKnRlcm1pb3NfcC4gIEZvbGxvd2luZyBlaXRoZXIgb2YgdGhlc2UgY2FsbHMsIGVpdGhlciBhIGNhbGwgdG8KKyAgdGNzZXRhdHRyKCkgb3IgaW9jdGwoKSB3aXRoIG9uZSBvZiBUQ1NFVFMsIFRDU0VUU1cgb3IgVENTRVRTRiBhcyB0aGUKKyAgY29tbWFuZCB0byB0cmFuc21pdCB0aGUgY2hhbmdlIHRvIHRoZSBrZXJuZWwuCisKKyAgVGhlIGNmKiBjb21tYW5kcyBhcmUgcHJlZmVycmVkIGZvciBwb3J0YWJpbGl0eS4gIFNvbWUgd2VpcmQgVW5pY2VzIHVzZQorICBhIGNvbnNpZGVyYWJseSBkaWZmZXJlbnQgZm9ybWF0IG9mIHRlcm1pb3MuCisKKyAgTW9zdCBpbXBsZW1lbnRhdGlvbnMgb2YgTGludXggdXNlIG9ubHkgdGhlIGlucHV0IHNwZWVkIGZvciBib3RoIGlucHV0CisgIGFuZCBvdXRwdXQuICBUaGVzZSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgaW4gdGhlIGFwcGxpY2F0aW9uIHByb2dyYW0gYnkKKyAgcmVmZXJlbmNlIHRvIDx0ZXJtaW9zLmg+LiAgSW4gcmVhbGl0eSwgdGhleSBhcmUgaW4KKyAgL3Vzci9pbmNsdWRlL2FzbS90ZXJtYml0cy5oLgorCisgIDYuICBBZGRpdGlvbmFsIENvbnRyb2wgQ2FsbHMKKworICA2LjEuICBTZW5kaW5nIGEgImJyZWFrIi4KKworICAgICAgIGludCBpb2N0bChmZCwgVENTQlJLLCBpbnQgYXJnKTsKKyAgICAgICBpbnQgdGNzZW5kYnJlYWsoZmQsIGludCBhcmcpOworCisgIFNlbmQgYSBicmVhazogIEhlcmUgdGhlIGFjdGlvbiBkaWZmZXJzIGJldHdlZW4gdGhlIGNvbnZlbnRpb25hbAorICBpb2N0bCgpIGNhbGwgYW5kIHRoZSBQT1NJWCBjYWxsLiAgRm9yIHRoZSBjb252ZW50aW9uYWwgY2FsbCwgYW4gYXJnIG9mCisgICcwJyBzZXRzIHRoZSBicmVhayBjb250cm9sIGxpbmUgb2YgdGhlIFVBUlQgZm9yIDAuMjUgc2Vjb25kcy4gIEZvciB0aGUKKyAgUE9TSVggY29tbWFuZCwgdGhlIGJyZWFrIGxpbmUgaXMgc2V0IGZvciBhcmcgdGltZXMgMC4xIHNlY29uZHMuCisKKyAgNi4yLiAgSGFyZHdhcmUgZmxvdyBjb250cm9sLgorCisgICAgICAgaW50IGlvY3RsKGZkLCBUQ1hPTkMsIGludCBhY3Rpb24pOworICAgICAgIGludCB0Y2Zsb3coZmQsIGludCBhY3Rpb24pOworCisgIFRoZSBhY3Rpb24gZmxhZ3MgYXJlOgorCisgIG8gIFRDT09GRiAgMCAgc3VzcGVuZCBvdXRwdXQKKworICBvICBUQ09PTiAgIDEgIHJlc3RhcnQgb3V0cHV0CisKKyAgbyAgVENJT0ZGICAyICB0cmFuc21pdCBTVE9QIGNoYXJhY3RlciB0byBzdXNwZW5kIGlucHV0CisKKyAgbyAgVENJT04gICAzICB0cmFuc21pdCBTVEFSVCBjaGFyYWN0ZXIgdG8gcmVzdGFydCBpbnB1dAorCisgIDYuMy4gIEZsdXNoaW5nIEkvTyBidWZmZXJzLgorCisgICAgICAgaW50IGlvY3RsKGZkLCBUQ0ZMU0gsIHF1ZXVlX3NlbGVjdG9yKTsKKyAgICAgICBpbnQgdGNmbHVzaChmZCwgcXVldWVfc2VsZWN0b3IpOworCisgIFRoZSBxdWV1ZV9zZWxlY3RvciBmbGFncyBhcmU6CisKKyAgbyAgVENJRkxVU0ggIDAgIGZsdXNoIGFueSBkYXRhIG5vdCB5ZXQgcmVhZCBmcm9tIHRoZSBpbnB1dCBidWZmZXIKKworICBvICBUQ09GTFVTSCAgMSAgZmx1c2ggYW55IGRhdGEgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGJ1ZmZlciBidXQgbm90CisgICAgIHlldCB0cmFuc21pdHRlZAorCisgIG8gIFRDSU9GTFVTSCAyICBmbHVzaCBib3RoIGJ1ZmZlcnMKKworICA3LiAgTW9kZW0gY29udHJvbAorCisgIFRoZSBoYXJkd2FyZSBtb2RlbSBjb250cm9sIGxpbmVzIGNhbiBiZSBtb25pdG9yZWQgb3IgbW9kaWZpZWQgYnkgdGhlCisgIGlvY3RsKDIpIHN5c3RlbSBjYWxsLiAgQSBzZXQgb2YgY29tcGFyYWJsZSB0YyogY2FsbHMgYXBwYXJlbnRseSBkbyBub3QKKyAgZXhpc3QuICBUaGUgZm9ybSBvZiB0aGlzIGNhbGwgaXM6CisKKyAgICAgICBpbnQgaW9jdGwoZmQsIENPTU1BTkQsIChpbnQgKilmbGFncyk7CisKKyAgVGhlIENPTU1BTkRTIGFuZCB0aGVpciBhY3Rpb24gYXJlOgorCisgIG8gIFRJT0NNQklTICB0dXJuIG9uIGNvbnRyb2wgbGluZXMgZGVwZW5kaW5nIHVwb24gd2hpY2ggYml0cyBhcmUgc2V0CisgICAgIGluIGZsYWdzLgorCisgIG8gIFRJT0NNQklDICB0dXJuIG9mZiBjb250cm9sIGxpbmVzIGRlcGVuZGluZyB1cG9uIHdoaWNoIGJpdHMgYXJlCisgICAgIHVuc2V0IGluIGZsYWdzLgorICBvICBUSU9DTUdFVCAgdGhlIGFwcHJvcHJpYXRlIGJpdHMgYXJlIHNldCBpbiBmbGFncyBhY2NvcmRpbmcgdG8gdGhlCisgICAgIGN1cnJlbnQgc3RhdHVzCisKKyAgbyAgVElPQ01TRVQgIHRoZSBzdGF0ZSBvZiB0aGUgVUFSVCBpcyBjaGFuZ2VkIGFjY29yZGluZyB0byB3aGljaCBiaXRzCisgICAgIGFyZSBzZXQvdW5zZXQgaW4gJ2ZsYWdzJworCisgICAgIFRoZSBiaXQgcGF0dGVybiBvZiBmbGFncyByZWZlciB0byB0aGUgZm9sbG93aW5nIGNvbnRyb2wgbGluZXM6CisKKyAgbyAgVElPQ01fTEUgICAgICBMaW5lIGVuYWJsZQorCisgIG8gIFRJT0NNX0RUUiAgICAgRGF0YSBUZXJtaW5hbCBSZWFkeQorCisgIG8gIFRJT0NNX1JUUyAgICAgUmVxdWVzdCB0byBzZW5kCisKKyAgbyAgVElPQ01fU1QgICAgICBTZWNvbmRhcnkgdHJhbnNtaXQKKworICBvICBUSU9DTV9TUiAgICAgIFNlY29uZGFyeSByZWNlaXZlCisKKyAgbyAgVElPQ01fQ1RTICAgICBDbGVhciB0byBzZW5kCisKKyAgbyAgVElPQ01fQ0FSICAgICBDYXJyaWVyIGRldGVjdAorCisgIG8gIFRJT0NNX1JORyAgICAgUmluZworCisgIG8gIFRJT0NNX0RTUiAgICAgRGF0YSBzZXQgcmVhZHkKKworICBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCBzb21lIG9mIHRoZXNlIGJpdHMgYXJlIGNvbnRyb2xsZWQgYnkgdGhlIG1vZGVtCisgIGFuZCB0aGUgVUFSVCBjYW5ub3QgY2hhbmdlIHRoZW0gYnV0IHRoZWlyIHN0YXR1cyBjYW4gYmUgc2Vuc2VkIGJ5CisgIFRJT0NNR0VULiAgQWxzbywgbW9zdCBQZXJzb25hbCBDb21wdXRlcnMgZG8gbm90IHByb3ZpZGUgaGFyZHdhcmUgZm9yCisgIHNlY29uZGFyeSB0cmFuc21pdCBhbmQgcmVjZWl2ZS4KKworICBUaGVyZSBhcmUgYWxzbyBhIHBhaXIgb2YgaW9jdGwoKSB0byBtb25pdG9yIHRoZXNlIGxpbmVzLiAgVGhleSBhcmUKKyAgdW5kb2N1bWVudGVkIGFzIGZhciBhcyBJIGhhdmUgbGVhcm5lZC4gIFRoZSBjb21tYW5kcyBhcmUgVElPQ01JV0FJVAorICBhbmQgVENJT0dJQ09VTlQuICBUaGV5IGFsc28gZGlmZmVyIGJldHdlZW4gdmVyc2lvbnMgb2YgdGhlIExpbnV4CisgIGtlcm5lbC4KKworICBTZWUgdGhlIGxpbmVzLmMgZmlsZSBpbiBteSAic2VyaWFsX3N1aXRlIiBmb3IgYW4gZXhhbXBsZSBvZiBob3cgdGhlc2UKKyAgY2FuIGJlIHVzZWQgc2VlICA8ZnRwOi8vc2NpY29tLmFscGhhY2QuY29tL3B1Yi9saW51eC9zZXJpYWxfc3VpdGU+CisKKyAgOC4gIFByb2Nlc3MgR3JvdXBzCisKKyAgOC4xLiAgU2Vzc2lvbnMKKworICA4LjIuICBQcm9jZXNzIEdyb3VwcworCisgIEFueSBuZXdseSBjcmVhdGVkIHByb2Nlc3MgaW5oZXJpdHMgdGhlIFByb2Nlc3MgR3JvdXAgb2YgaXRzIGNyZWF0b3IuCisgIFRoZSBQcm9jZXNzIEdyb3VwIGxlYWRlciBoYXMgdGhlIHNhbWUgUElEIGFzIFBHSUQuCisKKyAgOC4zLiAgQ29udHJvbGxpbmcgVGVybWluYWwKKworICBUaGVyZSBhcmUgYSBzZXJpZXMgb2YgaW9jdGwoMikgYW5kIHRjKigyKSBjYWxscyB3aGljaCBjYW4gYmUgdXNlZCB0bworICBtb25pdG9yIG9yIHRvIGNoYW5nZSB0aGUgcHJvY2VzcyBncm91cCB0byB3aGljaCB0aGUgZGV2aWNlIGlzCisgIGF0dGFjaGVkLgorCisgIDguMy4xLiAgR2V0IHRoZSBmb3JlZ3JvdW5kIGdyb3VwIHByb2Nlc3MgaWQuCisKKyAgSWYgdGhlcmUgaXMgbm8gZm9yZWdyb3VuZCBncm91cCwgYSBudW1iZXIgbm90IHJlcHJlc2VudGluZyBhbiBleGlzdGluZworICBwcm9jZXNzIGdyb3VwIGlzIHJldHVybmVkLiAgT24gZXJyb3IsIGEgLTEgaXMgcmV0dXJuZWQgYW5kIGVycm5vIGlzCisgIHNldC4KKworICAgICAgIGludCBpb2N0bChmZCwgVElPQ0dQR1JQLCAocGlkX3QgKilwaWQpOworICAgICAgIGludCB0Y2dldHBncnAoZmQsIChwaWRfdCAqKXBpZCk7CisKKyAgOC4zLjIuICBTZXQgdGhlIGZvcmVncm91bmQgcHJvY2VzcyBncm91cCBpZCBvZiBhIHRlcm1pbmFsLgorCisgIFRoZSBmZCBtdXN0IGJlIHRoZSBjb250cm9sbGluZyB0ZXJtaW5hbCBhbmQgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZQorICBzZXNzaW9uIG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MuCisKKyAgICAgICBpbnQgaW9jdGwoZmQsIFRJT0NTUEdSUCwgKHBpZF90ICopcGlkKTsKKyAgICAgICBpbnQgdGNzZXRwZ3JwKGZkLCAocGlkX3QgKilwaWQpOworCisgIDguMy4zLiAgR2V0IHByb2Nlc3MgZ3JvdXAgaWQuCisKKyAgICAgICBpbnQgaW9jdGwoZmQsIFRJT0NHUEdSUCwgJihwaWRfdClwaWQpOworICAgICAgIGludCB0Y2dldHBncnAoZmQsICYocGlkX3QpcGlkKTsKKworICA5LiAgTG9ja2ZpbGVzCisKKyAgQW55IHByb2Nlc3Mgd2hpY2ggYWNjZXNzZXMgYSBzZXJpYWwgZGV2aWNlIHNob3VsZCBmaXJzdCBjaGVjayBmb3IgdGhlCisgIGV4aXN0ZW5jZSBvZiBsb2NrIGZpbGUgZm9yIHRoZSBkZXNpcmVkIGRldmljZS4gIElmIHN1Y2ggYSBsb2NrIGxvY2sKKyAgZmlsZSBleGlzdHMsIHRoaXMgbWVhbnMgdGhhdCB0aGUgZGV2aWNlIG1heSBiZSBpbiB1c2UgYnkgYW5vdGhlcgorICBwcm9jZXNzLgorCisgIENoZWNrIG15ICJsaWJkZXZsb2Nrcy14LngudGd6IiBhdAorICA8ZnRwOi8vc2NpY29tLmFscGhhY2RjLmNvbS9wdWIvbGludXg+IGZvciBhbiBleGFtcGxlIG9mIGhvdyB0aGVzZSBsb2NrCisgIGZpbGVzIHNob3VsZCBiZSB1dGlsaXplZC4KKworICAxMC4gIEFkZGl0aW9uYWwgSW5mb3JtYXRpb24KKworICBDaGVjayBvdXQgbXkgInNlcmlhbF9zdWl0ZS50Z3oiIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHByb2dyYW1taW5nCisgIHRoZSBzZXJpYWwgcG9ydHMgYXQgICA8bWFpbHRvOnZlcm5AemVicmEuYWxwaGFjZGMuY29tPi4gIFRoZXJlIHNvbWUKKyAgZXhhbXBsZXMgYW5kIHNvbWUgYmx1cmJzIGFib3V0IHNldHRpbmcgdXAgbW9kZW1zIGFuZCBjb21tZW50cyBhYm91dAorICBzb21lIGdlbmVyYWwgY29uc2lkZXJhdGlvbnMuCisKKyAgMTEuICBGZWVkYmFjaworCisgIFBsZWFzZSBzZW5kIG1lIGFueSBjb3JyZWN0aW9ucywgcXVlc3Rpb25zLCBjb21tZW50cywgc3VnZ2VzdGlvbnMsIG9yCisgIGFkZGl0aW9uYWwgbWF0ZXJpYWwuIEkgd291bGQgbGlrZSB0byBpbXByb3ZlIHRoaXMgSE9XVE8hICBUZWxsIG1lCisgIGV4YWN0bHkgd2hhdCB5b3UgZG9uJ3QgdW5kZXJzdGFuZCwgb3Igd2hhdCBjb3VsZCBiZSBjbGVhcmVyLiAgWW91IGNhbgorICByZWFjaCBtZSBhdCAgPG1haWx0bzp2ZXJuQHplYnJhLmFscGhhY2RjLmNvbT4gdmlhIGVtYWlsLiAgUGxlYXNlCisgIGluY2x1ZGUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBTZXJpYWwtUHJvZ3JhbW1pbmctSE9XVE8gd2hlbgorICB3cml0aW5nLgpkaWZmIC0tZ2l0IGEvZG9jcy9idXN5Ym94X2Zvb3Rlci5wb2QgYi9kb2NzL2J1c3lib3hfZm9vdGVyLnBvZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzQ2YzczCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9idXN5Ym94X2Zvb3Rlci5wb2QKQEAgLTAsMCArMSwyODUgQEAKKz1iYWNrCisKKz1oZWFkMSBMSUJDIE5TUworCitHTlUgTGliYyAoZ2xpYmMpIHVzZXMgdGhlIE5hbWUgU2VydmljZSBTd2l0Y2ggKE5TUykgdG8gY29uZmlndXJlIHRoZSBiZWhhdmlvcgorb2YgdGhlIEMgbGlicmFyeSBmb3IgdGhlIGxvY2FsIGVudmlyb25tZW50LCBhbmQgdG8gY29uZmlndXJlIGhvdyBpdCByZWFkcworc3lzdGVtIGRhdGEsIHN1Y2ggYXMgcGFzc3dvcmRzIGFuZCBncm91cCBpbmZvcm1hdGlvbi4gIFRoaXMgaXMgaW1wbGVtZW50ZWQKK3VzaW5nIGFuIC9ldGMvbnNzd2l0Y2guY29uZiBjb25maWd1cmF0aW9uIGZpbGUsIGFuZCB1c2luZyBvbmUgb3IgbW9yZSBvZiB0aGUKKy9saWIvbGlibnNzXyogbGlicmFyaWVzLiAgQnVzeUJveCB0cmllcyB0byBhdm9pZCB1c2luZyBhbnkgbGliYyBjYWxscyB0aGF0IG1ha2UKK3VzZSBvZiBOU1MuICBTb21lIGFwcGxldHMgaG93ZXZlciwgc3VjaCBhcyBsb2dpbiBhbmQgc3UsIHdpbGwgdXNlIGxpYmMgZnVuY3Rpb25zCit0aGF0IHJlcXVpcmUgTlNTLgorCitJZiB5b3UgZW5hYmxlIENPTkZJR19VU0VfQkJfUFdEX0dSUCwgQnVzeUJveCB3aWxsIHVzZSBpbnRlcm5hbCBmdW5jdGlvbnMgdG8KK2RpcmVjdGx5IGFjY2VzcyB0aGUgL2V0Yy9wYXNzd2QsIC9ldGMvZ3JvdXAsIGFuZCAvZXRjL3NoYWRvdyBmaWxlcyB3aXRob3V0Cit1c2luZyBOU1MuICBUaGlzIG1heSBhbGxvdyB5b3UgdG8gcnVuIHlvdXIgc3lzdGVtIHdpdGhvdXQgdGhlIG5lZWQgZm9yCitpbnN0YWxsaW5nIGFueSBvZiB0aGUgTlNTIGNvbmZpZ3VyYXRpb24gZmlsZXMgYW5kIGxpYnJhcmllcy4KKworV2hlbiB1c2VkIHdpdGggZ2xpYmMsIHRoZSBCdXN5Qm94ICduZXR3b3JraW5nJyBhcHBsZXRzIHdpbGwgc2ltaWxhcmx5IHJlcXVpcmUKK3RoYXQgeW91IGluc3RhbGwgYXQgbGVhc3Qgc29tZSBvZiB0aGUgZ2xpYmMgTlNTIHN0dWZmIChpbiBwYXJ0aWN1bGFyLAorL2V0Yy9uc3N3aXRjaC5jb25mLCAvbGliL2xpYm5zc19kbnMqLCAvbGliL2xpYm5zc19maWxlcyosIGFuZCAvbGliL2xpYnJlc29sdiopLgorCitTaGFtZWxlc3MgUGx1ZzogQXMgYW4gYWx0ZXJuYXRpdmUsIG9uZSBjb3VsZCB1c2UgYSBDIGxpYnJhcnkgc3VjaCBhcyB1Q2xpYmMuICBJbgorYWRkaXRpb24gdG8gbWFraW5nIHlvdXIgc3lzdGVtIHNpZ25pZmljYW50bHkgc21hbGxlciwgdUNsaWJjIGRvZXMgbm90IHJlcXVpcmUgdGhlCit1c2Ugb2YgYW55IE5TUyBzdXBwb3J0IGZpbGVzIG9yIGxpYnJhcmllcy4KKworPWhlYWQxIE1BSU5UQUlORVIKKworRGVuaXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKworPWhlYWQxIEFVVEhPUlMKKworVGhlIGZvbGxvd2luZyBwZW9wbGUgaGF2ZSBjb250cmlidXRlZCBjb2RlIHRvIEJ1c3lCb3ggd2hldGhlciB0aGV5IGtub3cgaXQgb3IKK25vdC4gIElmIHlvdSBoYXZlIHdyaXR0ZW4gY29kZSBpbmNsdWRlZCBpbiBCdXN5Qm94LCB5b3Ugc2hvdWxkIHByb2JhYmx5IGJlCitsaXN0ZWQgaGVyZSBzbyB5b3UgY2FuIG9idGFpbiB5b3VyIGJpdCBvZiBldGVybmFsIGdsb3J5LiAgSWYgeW91IHNob3VsZCBiZQorbGlzdGVkIGhlcmUsIG9yIHRoZSBkZXNjcmlwdGlvbiBvZiB3aGF0IHlvdSBoYXZlIGRvbmUgbmVlZHMgbW9yZSBkZXRhaWwsIG9yIGlzCitpbmNvcnJlY3QsIHBsZWFzZSBzZW5kIGluIGFuIHVwZGF0ZS4KKworCis9Zm9yIGh0bWwgPGJyPgorCitFbWFudWVsZSBBaW5hIDxlbWFudWVsZS5haW5hQHRpc2NhbGkuaXQ+CisgICAgcnVuLXBhcnRzCisKKz1mb3IgaHRtbCA8YnI+CisKK0VyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKworICAgIFRvbnMgb2YgbmV3IHN0dWZmLCBtYWpvciByZXdyaXRlIG9mIG1vc3Qgb2YgdGhlCisgICAgY29yZSBhcHBzLCB0b25zIG9mIG5ldyBhcHBzIGFzIG5vdGVkIGluIGhlYWRlciBmaWxlcy4KKyAgICBMb3RzIG9mIHRlZGlvdXMgZWZmb3J0IHdyaXRpbmcgdGhlc2UgYm9yaW5nIGRvY3MgdGhhdAorICAgIG5vYm9keSBpcyBnb2luZyB0byBhY3R1YWxseSByZWFkLgorCis9Zm9yIGh0bWwgPGJyPgorCitMYXVyZW5jZSBBbmRlcnNvbiA8bC5kLmFuZGVyc29uQHdhcndpY2suYWMudWs+CisKKyAgICBycG0yY3BpbywgdW56aXAsIGdldF9oZWFkZXJfY3BpbywgcmVhZF9neiBpbnRlcmZhY2UsIHJwbQorCis9Zm9yIGh0bWwgPGJyPgorCitKZWZmIEFuZ2llbHNraSA8amVmZkB0aGVwdHJncm91cC5jb20+CisKKyAgICBmdHBwdXQsIGZ0cGdldAorCis9Zm9yIGh0bWwgPGJyPgorCitFZHdhcmQgQmV0dHMgPGVkd2FyZEBkZWJpYW4ub3JnPgorCisgICAgZXhwciwgaG9zdGlkLCBsb2duYW1lLCB3aG9hbWkKKworPWZvciBodG1sIDxicj4KKworSm9obiBCZXBwdSA8YmVwcHVAY29kZXBvZXQub3JnPgorCisgICAgZHUsIG5zbG9va3VwLCBzb3J0CisKKz1mb3IgaHRtbCA8YnI+CisKK0JyaWFuIENhbmRsZXIgPEIuQ2FuZGxlckBwb2JveC5jb20+CisKKyAgICB0aW55LWxzKGxzKQorCis9Zm9yIGh0bWwgPGJyPgorCitSYW5kb2xwaCBDaHVuZyA8dGF1c3FAZGViaWFuLm9yZz4KKworICAgIGZic2V0LCBwaW5nLCBob3N0bmFtZQorCis9Zm9yIGh0bWwgPGJyPgorCitEYXZlIENpbmVnZSA8ZGNpbmVnZUBwc3ljaG9zaXMuY29tPgorCisgICAgbW9yZSh2MiksIG1ha2VkZXZzLCBkdXRtcCwgbW9kdWxhcml6YXRpb24sIGF1dG8gbGlua3MgZmlsZSwKKyAgICB2YXJpb3VzIGZpeGVzLCBMaW51eCBSb3V0ZXIgUHJvamVjdCBtYWludGVuYW5jZQorCis9Zm9yIGh0bWwgPGJyPgorCitKb3JkYW4gQ3JvdXNlIDxqb3JkYW5AY29zbWljcGVuZ3Vpbi5uZXQ+CisKKyAgICBpcGNhbGMKKworPWZvciBodG1sIDxicj4KKworTWFnbnVzIERhbW0gPGRhbW1Ab3BlbnNvdXJjZS5zZT4KKworICAgIHRmdHAgY2xpZW50IGluc21vZCBwb3dlcnBjIHN1cHBvcnQKKworPWZvciBodG1sIDxicj4KKworTGFycnkgRG9vbGl0dGxlIDxsZG9vbGl0dEByZWN5Y2xlLmxibC5nb3Y+CisKKyAgICBwcmlzdGluZSBzb3VyY2UgZGlyZWN0b3J5IGNvbXBpbGF0aW9uLCBsb3RzIG9mIHBhdGNoZXMgYW5kIGZpeGVzLgorCis9Zm9yIGh0bWwgPGJyPgorCitHbGVubiBFbmdlbCA8Z2xlbm5lQGVuZ2VsLm9yZz4KKworICAgIGh0dHBkCisKKz1mb3IgaHRtbCA8YnI+CisKK0dlbm5hZHkgRmVsZG1hbiA8Z2ZlbGRtYW5AZ2VuYTAxLmNvbT4KKworICAgIFN5c2tsb2dkIChzaW5nbGUgdGhyZWFkZWQgc3lzbG9nZCwgSVBDIENpcmN1bGFyIGJ1ZmZlciBzdXBwb3J0LAorICAgIGxvZ3JlYWQpLCB2YXJpb3VzIGZpeGVzLgorCis9Zm9yIGh0bWwgPGJyPgorCitLYXJsIE0uIEhlZ2Jsb29tIDxrYXJsaGVnQGRlYmlhbi5vcmc+CisKKyAgICBjcF9tdi5jLCB0aGUgdGVzdCBzdWl0ZSwgdmFyaW91cyBmaXhlcyB0byB1dGlsaXR5LmMsICZjLgorCis9Zm9yIGh0bWwgPGJyPgorCitEYW5pZWwgSmFjb2Jvd2l0eiA8ZGFuQGRlYmlhbi5vcmc+CisKKyAgICBta3RlbXAuYworCis9Zm9yIGh0bWwgPGJyPgorCitNYXR0IEtyYWFpIDxrcmFhaUBhbHVtbmkuY211LmVkdT4KKworICAgIGRvY3VtZW50YXRpb24sIGJ1Z2ZpeGVzLCB0ZXN0IHN1aXRlCisKKz1mb3IgaHRtbCA8YnI+CisKK1N0ZXBoYW4gTGlueiA8bGluekBsaS1wcm8ubmV0PgorCisgICAgaXBjYWxjLCBSZWQgSGF0IGVxdWl2YWxlbmNlCisKKz1mb3IgaHRtbCA8YnI+CisKK0pvaG4gTG9tYmFyZG8gPGpvaG5AZGVsdGFuZXQuY29tPgorCisgICAgdHIKKworPWZvciBodG1sIDxicj4KKworR2xlbm4gTWNHcmF0aCA8YnVnMUBpaW5ldC5uZXQuYXU+CisKKyAgICBDb21tb24gdW5hcmNoaXZpbmcgY29kZSBhbmQgdW5hcmNoaXZpbmcgYXBwbGV0cywgaWZ1cGRvd24sIGZ0cGdldHB1dCwKKyAgICBuYW1laWYsIHNlZCwgcGF0Y2gsIGZvbGQsIGluc3RhbGwsIHV1ZGVjb2RlLgorICAgIFZhcmlvdXMgYnVnZml4ZXMsIHJldmlldyBhbmQgYXBwbHkgbnVtZXJvdXMgcGF0Y2hlcy4KKworPWZvciBodG1sIDxicj4KKworTWFudWVsIE5vdm9hIElJSSA8bWpuM0Bjb2RlcG9ldC5vcmc+CisKKyAgICBjYXQsIGhlYWQsIG1rZmlmbywgbWtub2QsIHJtZGlyLCBzbGVlcCwgdGVlLCB0dHksIHVuaXEsIHVzbGVlcCwgd2MsIHllcywKKyAgICBtZXNnLCB2Y29uZmlnLCBtYWtlX2RpcmVjdG9yeSwgcGFyc2VfbW9kZSwgZGlybmFtZSwgbW9kZV9zdHJpbmcsCisgICAgZ2V0X2xhc3RfcGF0aF9jb21wb25lbnQsIHNpbXBsaWZ5X3BhdGgsIGFuZCBhIG51bWJlciB0cml2aWFsIGxpYmJiIHJvdXRpbmVzCisKKyAgICBhbHNvIGJ1ZyBmaXhlcywgcGFydGlhbCByZXdyaXRlcywgYW5kIHNpemUgb3B0aW1pemF0aW9ucyBpbgorICAgIGFzaCwgYmFzZW5hbWUsIGNhbCwgY21wLCBjcCwgZGYsIGR1LCBlY2hvLCBlbnYsIGxuLCBsb2duYW1lLCBtZDVzdW0sIG1rZGlyLAorICAgIG12LCByZWFscGF0aCwgcm0sIHNvcnQsIHRhaWwsIHRvdWNoLCB1bmFtZSwgd2F0Y2gsIGFyaXRoLCBodW1hbl9yZWFkYWJsZSwKKyAgICBpbnRlcmZhY2UsIGR1dG1wLCBpZmNvbmZpZywgcm91dGUKKworPWZvciBodG1sIDxicj4KKworVmxhZGltaXIgT2xleW5payA8ZHpvQHNpbXRyZWFzLnJ1PgorCisgICAgY21kZWRpdDsgeGFyZ3MoY3VycmVudCksIGh0dHBkKGN1cnJlbnQpOworICAgIHBvcnRzOiBhc2gsIGNyb25kLCBmZGlzaywgaW5ldGQsIHN0dHksIHRyYWNlcm91dGUsIHRvcDsKKyAgICBsb2NhbGUsIHZhcmlvdXMgZml4ZXMKKyAgICBhbmQgaXJyZWNvbmNpbGFibGUgY3JpdGljIG9mIGV2ZXJ5dGhpbmcgbm90IHBlcmZlY3QuCisKKz1mb3IgaHRtbCA8YnI+CisKK0JydWNlIFBlcmVucyA8YnJ1Y2VAcGl4YXIuY29tPgorCisgICAgT3JpZ2luYWwgYXV0aG9yIG9mIEJ1c3lCb3ggaW4gMTk5NSwgMTk5Ni4gU29tZSBvZiBoaXMgY29kZSBjYW4KKyAgICBzdGlsbCBiZSBmb3VuZCBoaWRpbmcgaGVyZSBhbmQgdGhlcmUuLi4KKworPWZvciBodG1sIDxicj4KKworVGltIFJpa2VyIDxUaW1AUmlrZXJzLm9yZz4KKworICAgIGJ1ZyBmaXhlcywgbWVtYmVyIG9mIGZhbiBjbHViCisKKz1mb3IgaHRtbCA8YnI+CisKK0tlbnQgUm9ib3R0aSA8cm9ib3R0aUBtZXRjb25uZWN0LmNvbT4KKworICAgIHJlc2V0LCB0b25zIGFuZCB0b25zIG9mIGJ1ZyByZXBvcnRzIGFuZCBwYXRjaGVzLgorCis9Zm9yIGh0bWwgPGJyPgorCitDaGlwIFJvc2VudGhhbCA8Y2hpcEB1bmljb20uY29tPiwgPGNyb3NlbnRoQGNvdmFkLmNvbT4KKworICAgIHdnZXQgLSBDb250cmlidXRlZCBieSBwZXJtaXNzaW9uIG9mIENvdmFkIENvbW11bmljYXRpb25zCisKKz1mb3IgaHRtbCA8YnI+CisKK1BhdmVsIFJvc2tpbiA8cHJvc2tpQGdudS5vcmc+CisKKyAgICBMb3RzIG9mIGJ1Z3MgZml4ZXMgYW5kIHBhdGNoZXMuCisKKz1mb3IgaHRtbCA8YnI+CisKK0d5ZXBpIFNhbSA8Z3llcGlAcHJheGlzLXN3LmNvbT4KKworICAgIFJlbW90ZSBsb2dnaW5nIGZlYXR1cmUgZm9yIHN5c2xvZ2QKKworPWZvciBodG1sIDxicj4KKworTGludXMgVG9ydmFsZHMgPHRvcnZhbGRzQHRyYW5zbWV0YS5jb20+CisKKyAgICBta3N3YXAsIGZzY2subWluaXgsIG1rZnMubWluaXgKKworPWZvciBodG1sIDxicj4KKworTWFyayBXaGl0bGV5IDxtYXJrd0Bjb2RlcG9ldC5vcmc+CisKKyAgICBncmVwLCBzZWQsIGN1dCwgeGFyZ3MocHJldmlvdXMpLAorICAgIHN0eWxlLWd1aWRlLCBuZXctYXBwbGV0LUhPV1RPLCBidWcgZml4ZXMsIGV0Yy4KKworPWZvciBodG1sIDxicj4KKworQ2hhcmxlcyBQLiBXcmlnaHQgPGNwd3JpZ2h0QHZpbGxhZ2VuZXQuY29tPgorCisgICAgZ3ppcCwgbWluaS1uZXRjYXQobmMpCisKKz1mb3IgaHRtbCA8YnI+CisKK0VucmlxdWUgWmFuYXJkaSA8ZXphbmFyZGlAdWxsLmVzPgorCisgICAgdGFyY2F0IChzaW5jZSByZW1vdmVkKSwgbG9hZGttYXAsIHZhcmlvdXMgZml4ZXMsIERlYmlhbiBtYWludGVuYW5jZQorCis9Zm9yIGh0bWwgPGJyPgorCitUaXRvIFJhZ3VzYSA8ZmFybWF0aXRvQHRpc2NhbGkuaXQ+CisKKyAgICBkZXZmc2QgYW5kIHNpemUgb3B0aW1pemF0aW9ucyBpbiBzdHJpbmdzLCBvcGVudnQgYW5kIGRlYWxsb2N2dC4KKworPWZvciBodG1sIDxicj4KKworUGF1bCBGb3ggPHBnZkBmb3hoYXJwLmJvc3Rvbi5tYS51cz4KKworICAgIHZpIGVkaXRpbmcgbW9kZSBmb3IgYXNoLCB2YXJpb3VzIG90aGVyIHBhdGNoZXMvZml4ZXMKKworPWZvciBodG1sIDxicj4KKworUm9iZXJ0byBBLiBGb2dsaWV0dGEgPG1lQHJvYmVydG8uZm9nbGlldHRhLm5hbWU+CisKKyAgICBwb3J0OiBkbnNkCisKKz1mb3IgaHRtbCA8YnI+CisKK0Jlcm5oYXJkIFJldXRuZXItRmlzY2hlciA8cmVwLmRvdC5ub3BAZ21haWwuY29tPgorCisgICAgbWlzYworCis9Zm9yIGh0bWwgPGJyPgorCitNaWtlIEZyeXNpbmdlciA8dmFwaWVyQGdlbnRvby5vcmc+CisKKyAgICBpbml0aWFsIGUyZnNwcm9ncywgcHJpbnRlbnYsIHNldGFyY2gsIHN1bSwgbWlzYworCis9Zm9yIGh0bWwgPGJyPgorCitKaWUgWmhhbmcgPGppZS56aGFuZ0BhbmFsb2cuY29tPgorCisgICAgZml4ZWQgdHdvIGJ1Z3MgaW4gbXNoIGFuZCBodXNoIChleGl0Y29kZSBvZiBraWxsZWQgcHJvY2Vzc2VzKQorCis9Y3V0CmRpZmYgLS1naXQgYS9kb2NzL2J1c3lib3hfaGVhZGVyLnBvZCBiL2RvY3MvYnVzeWJveF9oZWFkZXIucG9kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YTE3M2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2J1c3lib3hfaGVhZGVyLnBvZApAQCAtMCwwICsxLDgyIEBACisjIHZpOiBzZXQgc3c9NCB0cz00OgorCis9aGVhZDEgTkFNRQorCitCdXN5Qm94IC0gVGhlIFN3aXNzIEFybXkgS25pZmUgb2YgRW1iZWRkZWQgTGludXgKKworPWhlYWQxIFNZTlRBWAorCisgYnVzeWJveCA8YXBwbGV0PiBbYXJndW1lbnRzLi4uXSAgIyBvcgorCisgPGFwcGxldD4gW2FyZ3VtZW50cy4uLl0JICAjIGlmIHN5bWxpbmtlZAorCis9aGVhZDEgREVTQ1JJUFRJT04KKworQnVzeUJveCBjb21iaW5lcyB0aW55IHZlcnNpb25zIG9mIG1hbnkgY29tbW9uIFVOSVggdXRpbGl0aWVzIGludG8gYSBzaW5nbGUKK3NtYWxsIGV4ZWN1dGFibGUuIEl0IHByb3ZpZGVzIG1pbmltYWxpc3QgcmVwbGFjZW1lbnRzIGZvciBtb3N0IG9mIHRoZSB1dGlsaXRpZXMKK3lvdSB1c3VhbGx5IGZpbmQgaW4gR05VIGNvcmV1dGlscywgdXRpbC1saW51eCwgZXRjLiBUaGUgdXRpbGl0aWVzIGluIEJ1c3lCb3gKK2dlbmVyYWxseSBoYXZlIGZld2VyIG9wdGlvbnMgdGhhbiB0aGVpciBmdWxsLWZlYXR1cmVkIEdOVSBjb3VzaW5zOyBob3dldmVyLCB0aGUKK29wdGlvbnMgdGhhdCBhcmUgaW5jbHVkZWQgcHJvdmlkZSB0aGUgZXhwZWN0ZWQgZnVuY3Rpb25hbGl0eSBhbmQgYmVoYXZlIHZlcnkKK211Y2ggbGlrZSB0aGVpciBHTlUgY291bnRlcnBhcnRzLgorCitCdXN5Qm94IGhhcyBiZWVuIHdyaXR0ZW4gd2l0aCBzaXplLW9wdGltaXphdGlvbiBhbmQgbGltaXRlZCByZXNvdXJjZXMgaW4gbWluZC4KK0l0IGlzIGFsc28gZXh0cmVtZWx5IG1vZHVsYXIgc28geW91IGNhbiBlYXNpbHkgaW5jbHVkZSBvciBleGNsdWRlIGNvbW1hbmRzIChvcgorZmVhdHVyZXMpIGF0IGNvbXBpbGUgdGltZS4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIGN1c3RvbWl6ZSB5b3VyIGVtYmVkZGVkCitzeXN0ZW1zLiBUbyBjcmVhdGUgYSB3b3JraW5nIHN5c3RlbSwganVzdCBhZGQgL2RldiwgL2V0YywgYW5kIGEgTGludXgga2VybmVsLgorQnVzeUJveCBwcm92aWRlcyBhIGZhaXJseSBjb21wbGV0ZSBQT1NJWCBlbnZpcm9ubWVudCBmb3IgYW55IHNtYWxsIG9yIGVtYmVkZGVkCitzeXN0ZW0uCisKK0J1c3lCb3ggaXMgZXh0cmVtZWx5IGNvbmZpZ3VyYWJsZS4gIFRoaXMgYWxsb3dzIHlvdSB0byBpbmNsdWRlIG9ubHkgdGhlCitjb21wb25lbnRzIHlvdSBuZWVkLCB0aGVyZWJ5IHJlZHVjaW5nIGJpbmFyeSBzaXplLiBSdW4gJ21ha2UgY29uZmlnJyBvciAnbWFrZQorbWVudWNvbmZpZycgdG8gc2VsZWN0IHRoZSBmdW5jdGlvbmFsaXR5IHRoYXQgeW91IHdpc2ggdG8gZW5hYmxlLiAgVGhlbiBydW4KKydtYWtlJyB0byBjb21waWxlIEJ1c3lCb3ggdXNpbmcgeW91ciBjb25maWd1cmF0aW9uLgorCitBZnRlciB0aGUgY29tcGlsZSBoYXMgZmluaXNoZWQsIHlvdSBzaG91bGQgdXNlICdtYWtlIGluc3RhbGwnIHRvIGluc3RhbGwKK0J1c3lCb3guIFRoaXMgd2lsbCBpbnN0YWxsIHRoZSAnYmluL2J1c3lib3gnIGJpbmFyeSwgaW4gdGhlIHRhcmdldCBkaXJlY3RvcnkKK3NwZWNpZmllZCBieSBDT05GSUdfUFJFRklYLiBDT05GSUdfUFJFRklYIGNhbiBiZSBzZXQgd2hlbiBjb25maWd1cmluZyBCdXN5Qm94LAorb3IgeW91IGNhbiBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlIGxvY2F0aW9uIGF0IGluc3RhbGwgdGltZSAoaS5lLiwgd2l0aCBhCitjb21tYW5kIGxpbmUgbGlrZSAnbWFrZSBDT05GSUdfUFJFRklYPS90bXAvZm9vIGluc3RhbGwnKS4gSWYgeW91IGVuYWJsZWQKK2FueSBhcHBsZXQgaW5zdGFsbGF0aW9uIHNjaGVtZSAoZWl0aGVyIGFzIHN5bWxpbmtzIG9yIGhhcmRsaW5rcyksIHRoZXNlIHdpbGwKK2Fsc28gYmUgaW5zdGFsbGVkIGluIHRoZSBsb2NhdGlvbiBwb2ludGVkIHRvIGJ5IENPTkZJR19QUkVGSVguCisKKz1oZWFkMSBVU0FHRQorCitCdXN5Qm94IGlzIGEgbXVsdGktY2FsbCBiaW5hcnkuICBBIG11bHRpLWNhbGwgYmluYXJ5IGlzIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbQordGhhdCBwZXJmb3JtcyB0aGUgc2FtZSBqb2IgYXMgbW9yZSB0aGFuIG9uZSB1dGlsaXR5IHByb2dyYW0uICBUaGF0IG1lYW5zIHRoZXJlCitpcyBqdXN0IGEgc2luZ2xlIEJ1c3lCb3ggYmluYXJ5LCBidXQgdGhhdCBzaW5nbGUgYmluYXJ5IGFjdHMgbGlrZSBhIGxhcmdlCitudW1iZXIgb2YgdXRpbGl0aWVzLiAgVGhpcyBhbGxvd3MgQnVzeUJveCB0byBiZSBzbWFsbGVyIHNpbmNlIGFsbCB0aGUgYnVpbHQtaW4KK3V0aWxpdHkgcHJvZ3JhbXMgKHdlIGNhbGwgdGhlbSBhcHBsZXRzKSBjYW4gc2hhcmUgY29kZSBmb3IgbWFueSBjb21tb24KK29wZXJhdGlvbnMuCisKK1lvdSBjYW4gYWxzbyBpbnZva2UgQnVzeUJveCBieSBpc3N1aW5nIGEgY29tbWFuZCBhcyBhbiBhcmd1bWVudCBvbiB0aGUKK2NvbW1hbmQgbGluZS4gIEZvciBleGFtcGxlLCBlbnRlcmluZworCisJL2Jpbi9idXN5Ym94IGxzCisKK3dpbGwgYWxzbyBjYXVzZSBCdXN5Qm94IHRvIGJlaGF2ZSBhcyAnbHMnLgorCitPZiBjb3Vyc2UsIGFkZGluZyAnL2Jpbi9idXN5Ym94JyBpbnRvIGV2ZXJ5IGNvbW1hbmQgd291bGQgYmUgcGFpbmZ1bC4gIFNvIG1vc3QKK3Blb3BsZSB3aWxsIGludm9rZSBCdXN5Qm94IHVzaW5nIGxpbmtzIHRvIHRoZSBCdXN5Qm94IGJpbmFyeS4KKworRm9yIGV4YW1wbGUsIGVudGVyaW5nCisKKwlsbiAtcyAvYmluL2J1c3lib3ggbHMKKwkuL2xzCisKK3dpbGwgY2F1c2UgQnVzeUJveCB0byBiZWhhdmUgYXMgJ2xzJyAoaWYgdGhlICdscycgY29tbWFuZCBoYXMgYmVlbiBjb21waWxlZAoraW50byBCdXN5Qm94KS4gIEdlbmVyYWxseSBzcGVha2luZywgeW91IHNob3VsZCBuZXZlciBuZWVkIHRvIG1ha2UgYWxsIHRoZXNlCitsaW5rcyB5b3Vyc2VsZiwgYXMgdGhlIEJ1c3lCb3ggYnVpbGQgc3lzdGVtIHdpbGwgZG8gdGhpcyBmb3IgeW91IHdoZW4geW91IHJ1bgordGhlICdtYWtlIGluc3RhbGwnIGNvbW1hbmQuCisKK0lmIHlvdSBpbnZva2UgQnVzeUJveCB3aXRoIG5vIGFyZ3VtZW50cywgaXQgd2lsbCBwcm92aWRlIHlvdSB3aXRoIGEgbGlzdCBvZiB0aGUKK2FwcGxldHMgdGhhdCBoYXZlIGJlZW4gY29tcGlsZWQgaW50byB5b3VyIEJ1c3lCb3ggYmluYXJ5LgorCis9aGVhZDEgQ09NTU9OIE9QVElPTlMKKworTW9zdCBCdXN5Qm94IGFwcGxldHMgc3VwcG9ydCB0aGUgQjwtLWhlbHA+IGFyZ3VtZW50IHRvIHByb3ZpZGUgYSB0ZXJzZSBydW50aW1lCitkZXNjcmlwdGlvbiBvZiB0aGVpciBiZWhhdmlvci4gIElmIHRoZSBDT05GSUdfRkVBVFVSRV9WRVJCT1NFX1VTQUdFIG9wdGlvbiBoYXMKK2JlZW4gZW5hYmxlZCwgbW9yZSBkZXRhaWxlZCB1c2FnZSBpbmZvcm1hdGlvbiB3aWxsIGFsc28gYmUgYXZhaWxhYmxlLgorCis9aGVhZDEgQ09NTUFORFMKKworQ3VycmVudGx5IGF2YWlsYWJsZSBhcHBsZXRzIGluY2x1ZGU6CmRpZmYgLS1naXQgYS9kb2NzL2NnaS9jbC5odG1sIGIvZG9jcy9jZ2kvY2wuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjhmYWFlCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9jZ2kvY2wuaHRtbApAQCAtMCwwICsxLDQ2IEBACis8aHRtbD48aGVhZD48dGl0bGU+Q0dJIENvbW1hbmQgbGluZSBvcHRpb25zPC90aXRsZT48L2hlYWQ+PGJvZHk+PGgxPjxpbWcgYWx0PSIiIHNyYz0iY2xfZmlsZXMvQ0dJbG9nby5naWYiPiBDR0kgQ29tbWFuZCBsaW5lIG9wdGlvbnM8L2gxPgorPGhyPiA8cD4KKworPC9wPjxoMj5TcGVjaWZpY2F0aW9uPC9oMj4KKworVGhlIGNvbW1hbmQgbGluZSBpcyBvbmx5IHVzZWQgaW4gdGhlIGNhc2Ugb2YgYW4gSVNJTkRFWCBxdWVyeS4gSXQgaXMKK25vdCB1c2VkIGluIHRoZSBjYXNlIG9mIGFuIEhUTUwgZm9ybSBvciBhbnkgYXMgeWV0IHVuZGVmaW5lZCBxdWVyeQordHlwZS4gVGhlIHNlcnZlciBzaG91bGQgc2VhcmNoIHRoZSBxdWVyeSBpbmZvcm1hdGlvbiAodGhlIDxjb2RlPlFVRVJZX1NUUklORzwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFibGUpIGZvciBhIG5vbi1lbmNvZGVkCis9IGNoYXJhY3RlciB0byBkZXRlcm1pbmUgaWYgdGhlIGNvbW1hbmQgbGluZSBpcyB0byBiZSB1c2VkLCBpZiBpdAorZmluZHMgb25lLCB0aGUgY29tbWFuZCBsaW5lIGlzIG5vdCB0byBiZSB1c2VkLiBUaGlzIHRydXN0cyB0aGUgY2xpZW50cwordG8gZW5jb2RlIHRoZSA9IHNpZ24gaW4gSVNJTkRFWCBxdWVyaWVzLCBhIHByYWN0aWNlIHdoaWNoIHdhcworY29uc2lkZXJlZCBzYWZlIGF0IHRoZSB0aW1lIG9mIHRoZSBkZXNpZ24gb2YgdGhpcyBzcGVjaWZpY2F0aW9uLiA8cD4KKworRm9yIGV4YW1wbGUsIHVzZSB0aGUgPGEgaHJlZj0iaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS1iaW4vZmluZ2VyIj5maW5nZXIgc2NyaXB0PC9hPiBhbmQgdGhlIElTSU5ERVggaW50ZXJmYWNlIHRvIGxvb2sgdXAgImh0dHBkIi4gIFlvdSB3aWxsIHNlZSB0aGF0IHRoZSBzY3JpcHQgd2lsbCBjYWxsIGl0c2VsZiB3aXRoIDxjb2RlPi9jZ2ktYmluL2Zpbmdlcj9odHRwZDwvY29kZT4gYW5kIHdpbGwgYWN0dWFsbHkgZXhlY3V0ZSAiZmluZ2VyIGh0dHBkIiBvbiB0aGUgY29tbWFuZCBsaW5lIGFuZCBvdXRwdXQgdGhlIHJlc3VsdHMgdG8geW91LgorPC9wPjxwPgorSWYgdGhlIHNlcnZlciBkb2VzIGZpbmQgYSAiPSIgaW4gdGhlIDxjb2RlPlFVRVJZX1NUUklORzwvY29kZT4sCit0aGVuIHRoZSBjb21tYW5kIGxpbmUgd2lsbCBub3QgYmUgdXNlZCwgYW5kIG5vIGRlY29kaW5nIHdpbGwgYmUKK3BlcmZvcm1lZC4gVGhlIHF1ZXJ5IHRoZW4gcmVtYWlucyBpbnRhY3QgZm9yIHByb2Nlc3NpbmcgYnkgYW4KK2FwcHJvcHJpYXRlIEZPUk0gc3VibWlzc2lvbiBkZWNvZGVyLgorQWdhaW4sIGFzIGFuIGV4YW1wbGUsIHVzZSA8YSBocmVmPSJodHRwOi8vaG9vaG9vLm5jc2EudWl1Yy5lZHUvY2dpLWJpbi9maW5nZXI/aHR0cGQ9bmFtZSI+dGhpcyBoeXBlcmxpbms8L2E+IHRvIHN1Ym1pdCA8Y29kZT4iaHR0cGQ9bmFtZSI8L2NvZGU+IHRvIHRoZSBmaW5nZXIgc2NyaXB0LiAgU2luY2UgdGhpcyA8Y29kZT5RVUVSWV9TVFJJTkc8L2NvZGU+Citjb250YWluZWQgYW4gdW5lbmNvZGVkICI9Iiwgbm90aGluZyB3YXMgZGVjb2RlZCwgdGhlIHNjcmlwdCBkaWRuJ3Qga25vdworaXQgd2FzIGJlaW5nIHN1Ym1pdHRlZCBhIHZhbGlkIHF1ZXJ5LCBhbmQganVzdCBnYXZlIHlvdSB0aGUgZGVmYXVsdAorZmluZ2VyIGZvcm0uCis8L3A+PHA+CitJZiB0aGUgc2VydmVyIGZpbmRzIHRoYXQgaXQgY2Fubm90IHNlbmQgdGhlIHN0cmluZyBkdWUgdG8gaW50ZXJuYWwKK2xpbWl0YXRpb25zIChzdWNoIGFzIGV4ZWMoKSBvciAvYmluL3NoIGNvbW1hbmQgbGluZSByZXN0cmljdGlvbnMpIHRoZQorc2VydmVyIHNob3VsZCBpbmNsdWRlIE5PIGNvbW1hbmQgbGluZSBpbmZvcm1hdGlvbiBhbmQgcHJvdmlkZSB0aGUKK25vbi1kZWNvZGVkIHF1ZXJ5IGluZm9ybWF0aW9uIGluIHRoZSBlbnZpcm9ubWVudAordmFyaWFibGUgPGEgaHJlZj0iaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS9lbnYuaHRtbCNxdWVyeSI+PGNvZGU+UVVFUllfU1RSSU5HPC9jb2RlPjwvYT4uIDwvcD48cD4KKzwvcD48aHI+Cis8aDI+RXhhbXBsZXM8L2gyPgorCitFeGFtcGxlcyBvZiB0aGUgY29tbWFuZCBsaW5lIHVzYWdlIGFyZSBtdWNoIGJldHRlciA8YSBocmVmPSJodHRwOi8vaG9vaG9vLm5jc2EudWl1Yy5lZHUvY2dpL2V4YW1wbGVzLmh0bWwiPmRlbW9uc3RyYXRlZDwvYT4gdGhhbiBleHBsYWluZWQuIEZvciB0aGVzZQorZXhhbXBsZXMsIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIHNjcmlwdCBvdXRwdXQgd2hpY2ggc2F5cyB3aGF0CithcmdjIGFuZCBhcmd2IGFyZS4gPHA+CisKKzwvcD48aHI+CisKKzxhIGhyZWY9Imh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvaW50ZXJmYWNlLmh0bWwiPjxpbWcgYWx0PSJbQmFja10iIHNyYz0iY2xfZmlsZXMvYmFjay5naWYiPlJldHVybiB0byB0aGUKK2ludGVyZmFjZSBzcGVjaWZpY2F0aW9uPC9hPiA8cD4KKworQ0dJIC0gQ29tbW9uIEdhdGV3YXkgSW50ZXJmYWNlCis8L3A+PGFkZHJlc3M+PGEgaHJlZj0iaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS9tYWlsdG9jZ2kuaHRtbCI+Y2dpQG5jc2EudWl1Yy5lZHU8L2E+PC9hZGRyZXNzPgorCisKKzwvYm9keT48L2h0bWw+CmRpZmYgLS1naXQgYS9kb2NzL2NnaS9lbnYuaHRtbCBiL2RvY3MvY2dpL2Vudi5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YTU0OGIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL2NnaS9lbnYuaHRtbApAQCAtMCwwICsxLDE0OSBAQAorPGh0bWw+PGhlYWQ+PHRpdGxlPkNHSSBFbnZpcm9ubWVudCBWYXJpYWJsZXM8L3RpdGxlPjwvaGVhZD48Ym9keT48aDE+PGltZyBhbHQ9IiIgc3JjPSJlbnZfZmlsZXMvQ0dJbG9nby5naWYiPiBDR0kgRW52aXJvbm1lbnQgVmFyaWFibGVzPC9oMT4KKzxocj4KKworPHA+CisKK0luIG9yZGVyIHRvIHBhc3MgZGF0YSBhYm91dCB0aGUgaW5mb3JtYXRpb24gcmVxdWVzdCBmcm9tIHRoZSBzZXJ2ZXIgdG8KK3RoZSBzY3JpcHQsIHRoZSBzZXJ2ZXIgdXNlcyBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGFzIHdlbGwgYXMKK2Vudmlyb25tZW50IHZhcmlhYmxlcy4gVGhlc2UgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzZXQgd2hlbiB0aGUKK3NlcnZlciBleGVjdXRlcyB0aGUgZ2F0ZXdheSBwcm9ncmFtLiA8L3A+PHA+CisKKzwvcD48aHI+Cis8aDI+U3BlY2lmaWNhdGlvbjwvaDI+CisKKyA8cD4KK1RoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBub3QgcmVxdWVzdC1zcGVjaWZpYyBhbmQgYXJlCitzZXQgZm9yIGFsbCByZXF1ZXN0czogPC9wPjxwPgorCis8L3A+PHVsPgorPGxpPiA8Y29kZT5TRVJWRVJfU09GVFdBUkU8L2NvZGU+IDxwPgorCisgICAgVGhlIG5hbWUgYW5kIHZlcnNpb24gb2YgdGhlIGluZm9ybWF0aW9uIHNlcnZlciBzb2Z0d2FyZSBhbnN3ZXJpbmcKKyAgICB0aGUgcmVxdWVzdCAoYW5kIHJ1bm5pbmcgdGhlIGdhdGV3YXkpLiBGb3JtYXQ6IG5hbWUvdmVyc2lvbiA8L3A+PHA+CisKKzwvcD48L2xpPjxsaT4gPGNvZGU+U0VSVkVSX05BTUU8L2NvZGU+IDxwPgorICAgIFRoZSBzZXJ2ZXIncyBob3N0bmFtZSwgRE5TIGFsaWFzLCBvciBJUCBhZGRyZXNzIGFzIGl0IHdvdWxkIGFwcGVhcgorICAgIGluIHNlbGYtcmVmZXJlbmNpbmcgVVJMcy4gPC9wPjxwPgorCis8L3A+PC9saT48bGk+IDxjb2RlPkdBVEVXQVlfSU5URVJGQUNFPC9jb2RlPiA8cD4KKyAgICBUaGUgcmV2aXNpb24gb2YgdGhlIENHSSBzcGVjaWZpY2F0aW9uIHRvIHdoaWNoIHRoaXMgc2VydmVyCisgICAgY29tcGxpZXMuIEZvcm1hdDogQ0dJL3JldmlzaW9uPC9wPjxwPgorCis8L3A+PC9saT48L3VsPgorCis8aHI+CisKK1RoZSBmb2xsb3dpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBzcGVjaWZpYyB0byB0aGUgcmVxdWVzdCBiZWluZworZnVsZmlsbGVkIGJ5IHRoZSBnYXRld2F5IHByb2dyYW06IDxwPgorCis8L3A+PHVsPgorPGxpPiA8YSBuYW1lPSJwcm90b2NvbCI+PGNvZGU+U0VSVkVSX1BST1RPQ09MPC9jb2RlPjwvYT4gPHA+CisgICAgVGhlIG5hbWUgYW5kIHJldmlzaW9uIG9mIHRoZSBpbmZvcm1hdGlvbiBwcm90b2NvbCB0aGlzIHJlcXVlc3QgY2FtZQorICAgIGluIHdpdGguIEZvcm1hdDogcHJvdG9jb2wvcmV2aXNpb24gPC9wPjxwPgorCis8L3A+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+fn4KKworRXZlbiBpZiB5b3UgaGF2ZSBwdXNoIGFjY2VzcywgeW91IHNob3VsZCBwcm9iYWJseSBzdGlsbCBwb3N0IGEgcGF0Y2ggdG8gdGhlCittYWlsaW5nIGxpc3QgaWY6CisKKyAtIFlvdXIgY2hhbmdlcyBhcmUgYnJvYWQgYW5kIHRvdWNoIG1hbnkgZGlmZmVyZW50IGZpbGVzCisgLSBZb3UgYXJlIGFkZGluZyBhIGZlYXR1cmUKKyAtIFlvdXIgY2hhbmdlcyBhcmUgc3BlY3VsYXRpdmUgb3IgZXhwZXJpbWVudGFsIChpLmUuLCB0cnlpbmcgYSBuZXcgYWxnb3JpdGhtKQorIC0gWW91IGFyZSBub3QgdGhlIG1haW50YWluZXIgYW5kIHlvdXIgY2hhbmdlcyBtYWtlIHRoZSBtYWludGFpbmVyIGNyaW5nZQorCitUaGUgbW9yZSBvZiB0aGUgYWJvdmUgYXJlIHRydWUsIHRoZSBiZXR0ZXIgaXQgaXMgdG8gcG9zdCBhIHBhdGNoIHRvIHRoZQorbWFpbGluZyBsaXN0IGluc3RlYWQgb2YgcHVzaGluZy4KKworCisKK0ZpbmFsIFdvcmRzCistLS0tLS0tLS0tLQorCitJZiBhbGwgb2YgdGhpcyBzZWVtcyBjb21wbGljYXRlZCwgZG9uJ3QgcGFuaWMsIGl0J3MgcmVhbGx5IG5vdCB0aGF0IHRvdWdoLiBJZgoreW91J3JlIGhhdmluZyBkaWZmaWN1bHR5IGZvbGxvd2luZyBzb21lIG9mIHRoZSBzdGVwcyBvdXRsaW5lZCBpbiB0aGlzCitkb2N1bWVudCBkb24ndCB3b3JyeSwgdGhlIGZvbGtzIG9uIHRoZSBCdXN5Ym94IG1haWxpbmcgbGlzdCBhcmUgYSBmYWlybHkKK2dvb2QtbmF0dXJlZCBidW5jaCBhbmQgd2lsbCB3b3JrIHdpdGggeW91IHRvIGhlbHAgZ2V0IHlvdXIgcGF0Y2hlcyBpbnRvIHNoYXBlCitvciBoZWxwIHlvdSBtYWtlIGNvbnRyaWJ1dGlvbnMuCmRpZmYgLS1naXQgYS9kb2NzL2N0dHkuaHRtIGIvZG9jcy9jdHR5Lmh0bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2IyZGQyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9jdHR5Lmh0bQpAQCAtMCwwICsxLDQ3OSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDMuMiBGaW5hbC8vRU4iPgorPGh0bWw+PGhlYWQ+CisgPCEtLSBzYXZlZCBmcm9tIGh0dHA6Ly93d3cud2luLnR1ZS5ubC9+YWViL2xpbnV4L2xrL2xrLTEwLmh0bWwgLS0+CisgPG1ldGEgbmFtZT0iR0VORVJBVE9SIiBjb250ZW50PSJTR01MLVRvb2xzIDEuMC45Ij48dGl0bGU+VGhlIExpbnV4IGtlcm5lbDogUHJvY2Vzc2VzPC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorPGhyPgorPGgyPjxhIG5hbWU9InMxMCI+MTAuIFByb2Nlc3NlczwvYT48L2gyPgorCis8cD5CZWZvcmUgbG9va2luZyBhdCB0aGUgTGludXggaW1wbGVtZW50YXRpb24sIGZpcnN0IGEgZ2VuZXJhbCBVbml4CitkZXNjcmlwdGlvbiBvZiB0aHJlYWRzLCBwcm9jZXNzZXMsIHByb2Nlc3MgZ3JvdXBzIGFuZCBzZXNzaW9ucy4KKzwvcD48cD4KKyhTZWUgYWxzbyA8YSBocmVmPSJodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS9iYXNlZGVmcy9WMV9jaGFwMTEuaHRtbCI+R2VuZXJhbCBUZXJtaW5hbCBJbnRlcmZhY2U8L2E+KQorPC9wPjxwPkEgc2Vzc2lvbiBjb250YWlucyBhIG51bWJlciBvZiBwcm9jZXNzIGdyb3VwcywgYW5kIGEgcHJvY2VzcyBncm91cAorY29udGFpbnMgYSBudW1iZXIgb2YgcHJvY2Vzc2VzLCBhbmQgYSBwcm9jZXNzIGNvbnRhaW5zIGEgbnVtYmVyCitvZiB0aHJlYWRzLgorPC9wPjxwPkEgc2Vzc2lvbiBjYW4gaGF2ZSBhIGNvbnRyb2xsaW5nIHR0eS4KK0F0IG1vc3Qgb25lIHByb2Nlc3MgZ3JvdXAgaW4gYSBzZXNzaW9uIGNhbiBiZSBhIGZvcmVncm91bmQgcHJvY2VzcyBncm91cC4KK0FuIGludGVycnVwdCBjaGFyYWN0ZXIgdHlwZWQgb24gYSB0dHkgKCJUZWxldHlwZSIsIGkuZS4sIHRlcm1pbmFsKQorY2F1c2VzIGEgc2lnbmFsIHRvIGJlIHNlbnQgdG8gYWxsIG1lbWJlcnMgb2YgdGhlIGZvcmVncm91bmQgcHJvY2VzcyBncm91cAoraW4gdGhlIHNlc3Npb24gKGlmIGFueSkgdGhhdCBoYXMgdGhhdCB0dHkgYXMgY29udHJvbGxpbmcgdHR5LgorPC9wPjxwPkFsbCB0aGVzZSBvYmplY3RzIGhhdmUgbnVtYmVycywgYW5kIHdlIGhhdmUgdGhyZWFkIElEcywgcHJvY2VzcyBJRHMsCitwcm9jZXNzIGdyb3VwIElEcyBhbmQgc2Vzc2lvbiBJRHMuCis8L3A+PHA+Cis8L3A+PGgyPjxhIG5hbWU9InNzMTAuMSI+MTAuMSBQcm9jZXNzZXM8L2E+Cis8L2gyPgorCis8cD4KKzwvcD48aDM+Q3JlYXRpb248L2gzPgorCis8cD5BIG5ldyBwcm9jZXNzIGlzIHRyYWRpdGlvbmFsbHkgc3RhcnRlZCB1c2luZyB0aGUgPGNvZGU+Zm9yaygpPC9jb2RlPgorc3lzdGVtIGNhbGw6Cis8L3A+PGJsb2NrcXVvdGU+Cis8cHJlPnBpZF90IHA7CisKK3AgPSBmb3JrKCk7CitpZiAocCA9PSAocGlkX3QpIC0xKQorICAgICAgICAvKiBFUlJPUiAqLworZWxzZSBpZiAocCA9PSAwKQorICAgICAgICAvKiBDSElMRCAqLworZWxzZQorICAgICAgICAvKiBQQVJFTlQgKi8KKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorPHA+VGhpcyBjcmVhdGVzIGEgY2hpbGQgYXMgYSBkdXBsaWNhdGUgb2YgaXRzIHBhcmVudC4KK1BhcmVudCBhbmQgY2hpbGQgYXJlIGlkZW50aWNhbCBpbiBhbG1vc3QgYWxsIHJlc3BlY3RzLgorSW4gdGhlIGNvZGUgdGhleSBhcmUgZGlzdGluZ3Vpc2hlZCBieSB0aGUgZmFjdCB0aGF0IHRoZSBwYXJlbnQKK2xlYXJucyB0aGUgcHJvY2VzcyBJRCBvZiBpdHMgY2hpbGQsIHdoaWxlIDxjb2RlPmZvcmsoKTwvY29kZT4KK3JldHVybnMgMCBpbiB0aGUgY2hpbGQuIChJdCBjYW4gZmluZCB0aGUgcHJvY2VzcyBJRCBvZiBpdHMKK3BhcmVudCB1c2luZyB0aGUgPGNvZGU+Z2V0cHBpZCgpPC9jb2RlPiBzeXN0ZW0gY2FsbC4pCis8L3A+PHA+Cis8L3A+PGgzPlRlcm1pbmF0aW9uPC9oMz4KKworPHA+Tm9ybWFsIHRlcm1pbmF0aW9uIGlzIHdoZW4gdGhlIHByb2Nlc3MgZG9lcworPC9wPjxibG9ja3F1b3RlPgorPHByZT5leGl0KG4pOworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK29yCis8YmxvY2txdW90ZT4KKzxwcmU+cmV0dXJuIG47Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworZnJvbSBpdHMgPGNvZGU+bWFpbigpPC9jb2RlPiBwcm9jZWR1cmUuIEl0IHJldHVybnMgdGhlIHNpbmdsZSBieXRlIDxjb2RlPm48L2NvZGU+Cit0byBpdHMgcGFyZW50LgorPHA+QWJub3JtYWwgdGVybWluYXRpb24gaXMgdXN1YWxseSBjYXVzZWQgYnkgYSBzaWduYWwuCis8L3A+PHA+Cis8L3A+PGgzPkNvbGxlY3RpbmcgdGhlIGV4aXQgY29kZS4gWm9tYmllczwvaDM+CisKKzxwPlRoZSBwYXJlbnQgZG9lcworPC9wPjxibG9ja3F1b3RlPgorPHByZT5waWRfdCBwOworaW50IHN0YXR1czsKKworcCA9IHdhaXQoJmFtcDtzdGF0dXMpOworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK2FuZCBjb2xsZWN0cyB0d28gYnl0ZXM6Cis8cD4KKzxmaWd1cmU+Cis8ZXBzIGZpbGU9ImFic2VudCI+Cis8aW1nIHNyYz0iY3R0eV9maWxlcy9leGl0X3N0YXR1cy5wbmciPgorPC9lcHM+Cis8L2ZpZ3VyZT48L3A+PHA+QSBwcm9jZXNzIHRoYXQgaGFzIHRlcm1pbmF0ZWQgYnV0IGhhcyBub3QgeWV0IGJlZW4gd2FpdGVkIGZvcgoraXMgYSA8aT56b21iaWU8L2k+LiBJdCBuZWVkIG9ubHkgc3RvcmUgdGhlc2UgdHdvIGJ5dGVzOgorZXhpdCBjb2RlIGFuZCByZWFzb24gZm9yIHRlcm1pbmF0aW9uLgorPC9wPjxwPk9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUgcGFyZW50IGRpZXMgZmlyc3QsIDxjb2RlPmluaXQ8L2NvZGU+IChwcm9jZXNzIDEpCitpbmhlcml0cyB0aGUgY2hpbGQgYW5kIGJlY29tZXMgaXRzIHBhcmVudC4KKzwvcD48cD4KKzwvcD48aDM+U2lnbmFsczwvaDM+CisKKzxwPgorPC9wPjxoMz5TdG9wcGluZzwvaDM+CisKKzxwPlNvbWUgc2lnbmFscyBjYXVzZSBhIHByb2Nlc3MgdG8gc3RvcDoKKzxjb2RlPlNJR1NUT1A8L2NvZGU+IChzdG9wISksCis8Y29kZT5TSUdUU1RQPC9jb2RlPiAoc3RvcCBmcm9tIHR0eTogcHJvYmFibHkgXlogd2FzIHR5cGVkKSwKKzxjb2RlPlNJR1RUSU48L2NvZGU+ICh0dHkgaW5wdXQgYXNrZWQgYnkgYmFja2dyb3VuZCBwcm9jZXNzKSwKKzxjb2RlPlNJR1RUT1U8L2NvZGU+ICh0dHkgb3V0cHV0IHNlbnQgYnkgYmFja2dyb3VuZCBwcm9jZXNzLCBhbmQgdGhpcyB3YXMKK2Rpc2FsbG93ZWQgYnkgPGNvZGU+c3R0eSB0b3N0b3A8L2NvZGU+KS4KKzwvcD48cD5BcGFydCBmcm9tIF5aIHRoZXJlIGFsc28gaXMgXlkuIFRoZSBmb3JtZXIgc3RvcHMgdGhlIHByb2Nlc3MKK3doZW4gaXQgaXMgdHlwZWQsIHRoZSBsYXR0ZXIgc3RvcHMgaXQgd2hlbiBpdCBpcyByZWFkLgorPC9wPjxwPlNpZ25hbHMgZ2VuZXJhdGVkIGJ5IHR5cGluZyB0aGUgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXIgb24gc29tZSB0dHkKK2FyZSBzZW50IHRvIGFsbCBwcm9jZXNzZXMgdGhhdCBhcmUgaW4gdGhlIGZvcmVncm91bmQgcHJvY2VzcyBncm91cAorb2YgdGhlIHNlc3Npb24gdGhhdCBoYXMgdGhhdCB0dHkgYXMgY29udHJvbGxpbmcgdHR5LiAoRGV0YWlscyBiZWxvdy4pCis8L3A+PHA+SWYgYSBwcm9jZXNzIGlzIGJlaW5nIHRyYWNlZCwgZXZlcnkgc2lnbmFsIHdpbGwgc3RvcCBpdC4KKzwvcD48cD4KKzwvcD48aDM+Q29udGludWluZzwvaDM+CisKKzxwPjxjb2RlPlNJR0NPTlQ8L2NvZGU+OiBjb250aW51ZSBhIHN0b3BwZWQgcHJvY2Vzcy4KKzwvcD48cD4KKzwvcD48aDM+VGVybWluYXRpbmc8L2gzPgorCis8cD48Y29kZT5TSUdLSUxMPC9jb2RlPiAoZGllISBub3chKSwKKzxjb2RlPlNJR1RFUk08L2NvZGU+IChwbGVhc2UsIGdvIGF3YXkpLAorPGNvZGU+U0lHSFVQPC9jb2RlPiAobW9kZW0gaGFuZ3VwKSwKKzxjb2RlPlNJR0lOVDwvY29kZT4gKF5DKSwKKzxjb2RlPlNJR1FVSVQ8L2NvZGU+ICheXCksIGV0Yy4KK01hbnkgc2lnbmFscyBoYXZlIGFzIGRlZmF1bHQgYWN0aW9uIHRvIGtpbGwgdGhlIHRhcmdldC4KKyhTb21ldGltZXMgd2l0aCBhbiBhZGRpdGlvbmFsIGNvcmUgZHVtcCwgd2hlbiBzdWNoIGlzCithbGxvd2VkIGJ5IHJsaW1pdC4pCitUaGUgc2lnbmFscyA8Y29kZT5TSUdDSExEPC9jb2RlPiBhbmQgPGNvZGU+U0lHV0lOQ0g8L2NvZGU+CithcmUgaWdub3JlZCBieSBkZWZhdWx0LgorQWxsIGV4Y2VwdCA8Y29kZT5TSUdLSUxMPC9jb2RlPiBhbmQgPGNvZGU+U0lHU1RPUDwvY29kZT4gY2FuIGJlCitjYXVnaHQgb3IgaWdub3JlZCBvciBibG9ja2VkLgorRm9yIGRldGFpbHMsIHNlZSA8Y29kZT5zaWduYWwoNyk8L2NvZGU+LgorPC9wPjxwPgorPC9wPjxoMj48YSBuYW1lPSJzczEwLjIiPjEwLjIgUHJvY2VzcyBncm91cHM8L2E+Cis8L2gyPgorCis8cD5FdmVyeSBwcm9jZXNzIGlzIG1lbWJlciBvZiBhIHVuaXF1ZSA8aT5wcm9jZXNzIGdyb3VwPC9pPiwKK2lkZW50aWZpZWQgYnkgaXRzIDxpPnByb2Nlc3MgZ3JvdXAgSUQ8L2k+LgorKFdoZW4gdGhlIHByb2Nlc3MgaXMgY3JlYXRlZCwgaXQgYmVjb21lcyBhIG1lbWJlciBvZiB0aGUgcHJvY2VzcyBncm91cAorb2YgaXRzIHBhcmVudC4pCitCeSBjb252ZW50aW9uLCB0aGUgcHJvY2VzcyBncm91cCBJRCBvZiBhIHByb2Nlc3MgZ3JvdXAKK2VxdWFscyB0aGUgcHJvY2VzcyBJRCBvZiB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZSBwcm9jZXNzIGdyb3VwLAorY2FsbGVkIHRoZSA8aT5wcm9jZXNzIGdyb3VwIGxlYWRlcjwvaT4uCitBIHByb2Nlc3MgZmluZHMgdGhlIElEIG9mIGl0cyBwcm9jZXNzIGdyb3VwIHVzaW5nIHRoZSBzeXN0ZW0gY2FsbAorPGNvZGU+Z2V0cGdycCgpPC9jb2RlPiwgb3IsIGVxdWl2YWxlbnRseSwgPGNvZGU+Z2V0cGdpZCgwKTwvY29kZT4uCitPbmUgZmluZHMgdGhlIHByb2Nlc3MgZ3JvdXAgSUQgb2YgcHJvY2VzcyA8Y29kZT5wPC9jb2RlPiB1c2luZworPGNvZGU+Z2V0cGdpZChwKTwvY29kZT4uCis8L3A+PHA+T25lIG1heSB1c2UgdGhlIGNvbW1hbmQgPGNvZGU+cHMgajwvY29kZT4gdG8gc2VlIFBQSUQgKHBhcmVudCBwcm9jZXNzIElEKSwKK1BJRCAocHJvY2VzcyBJRCksIFBHSUQgKHByb2Nlc3MgZ3JvdXAgSUQpIGFuZCBTSUQgKHNlc3Npb24gSUQpCitvZiBwcm9jZXNzZXMuIFdpdGggYSBzaGVsbCB0aGF0IGRvZXMgbm90IGtub3cgYWJvdXQgam9iIGNvbnRyb2wsCitsaWtlIDxjb2RlPmFzaDwvY29kZT4sIGVhY2ggb2YgaXRzIGNoaWxkcmVuIHdpbGwgYmUgaW4gdGhlIHNhbWUgc2Vzc2lvbgorYW5kIGhhdmUgdGhlIHNhbWUgcHJvY2VzcyBncm91cCBhcyB0aGUgc2hlbGwuIFdpdGggYSBzaGVsbCB0aGF0IGtub3dzCithYm91dCBqb2IgY29udHJvbCwgbGlrZSA8Y29kZT5iYXNoPC9jb2RlPiwgdGhlIHByb2Nlc3NlcyBvZiBvbmUgcGlwZWxpbmUsIGxpa2UKKzwvcD48YmxvY2txdW90ZT4KKzxwcmU+JSBjYXQgcGFwZXIgfCBpZGVhbCB8IHBpYyB8IHRibCB8IGVxbiB8IGRpdHJvZmYgJmd0OyBvdXQKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitmb3JtIGEgc2luZ2xlIHByb2Nlc3MgZ3JvdXAuCis8cD4KKzwvcD48aDM+Q3JlYXRpb248L2gzPgorCis8cD5BIHByb2Nlc3MgPGNvZGU+cGlkPC9jb2RlPiBpcyBwdXQgaW50byB0aGUgcHJvY2VzcyBncm91cCA8Y29kZT5wZ2lkPC9jb2RlPiBieQorPC9wPjxibG9ja3F1b3RlPgorPHByZT5zZXRwZ2lkKHBpZCwgcGdpZCk7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworSWYgPGNvZGU+cGdpZCA9PSBwaWQ8L2NvZGU+IG9yIDxjb2RlPnBnaWQgPT0gMDwvY29kZT4gdGhlbiB0aGlzIGNyZWF0ZXMKK2EgbmV3IHByb2Nlc3MgZ3JvdXAgd2l0aCBwcm9jZXNzIGdyb3VwIGxlYWRlciA8Y29kZT5waWQ8L2NvZGU+LgorT3RoZXJ3aXNlLCB0aGlzIHB1dHMgPGNvZGU+cGlkPC9jb2RlPiBpbnRvIHRoZSBhbHJlYWR5IGV4aXN0aW5nCitwcm9jZXNzIGdyb3VwIDxjb2RlPnBnaWQ8L2NvZGU+LgorQSB6ZXJvIDxjb2RlPnBpZDwvY29kZT4gcmVmZXJzIHRvIHRoZSBjdXJyZW50IHByb2Nlc3MuCitUaGUgY2FsbCA8Y29kZT5zZXRwZ3JwKCk8L2NvZGU+IGlzIGVxdWl2YWxlbnQgdG8gPGNvZGU+c2V0cGdpZCgwLDApPC9jb2RlPi4KKzxwPgorPC9wPjxoMz5SZXN0cmljdGlvbnMgb24gc2V0cGdpZCgpPC9oMz4KKworPHA+VGhlIGNhbGxpbmcgcHJvY2VzcyBtdXN0IGJlIDxjb2RlPnBpZDwvY29kZT4gaXRzZWxmLCBvciBpdHMgcGFyZW50LAorYW5kIHRoZSBwYXJlbnQgY2FuIG9ubHkgZG8gdGhpcyBiZWZvcmUgPGNvZGU+cGlkPC9jb2RlPiBoYXMgZG9uZQorPGNvZGU+ZXhlYygpPC9jb2RlPiwgYW5kIG9ubHkgd2hlbiBib3RoIGJlbG9uZyB0byB0aGUgc2FtZSBzZXNzaW9uLgorSXQgaXMgYW4gZXJyb3IgaWYgcHJvY2VzcyA8Y29kZT5waWQ8L2NvZGU+IGlzIGEgc2Vzc2lvbiBsZWFkZXIKKyhhbmQgdGhpcyBjYWxsIHdvdWxkIGNoYW5nZSBpdHMgPGNvZGU+cGdpZDwvY29kZT4pLgorPC9wPjxwPgorPC9wPjxoMz5UeXBpY2FsIHNlcXVlbmNlPC9oMz4KKworPHA+Cis8L3A+PGJsb2NrcXVvdGU+Cis8cHJlPnAgPSBmb3JrKCk7CitpZiAocCA9PSAocGlkX3QpIC0xKSB7CisgICAgICAgIC8qIEVSUk9SICovCit9IGVsc2UgaWYgKHAgPT0gMCkgeyAgICAvKiBDSElMRCAqLworICAgICAgICBzZXRwZ2lkKDAsIHBnaWQpOworICAgICAgICAuLi4KK30gZWxzZSB7ICAgICAgICAgICAgICAgIC8qIFBBUkVOVCAqLworICAgICAgICBzZXRwZ2lkKHAsIHBnaWQpOworICAgICAgICAuLi4KK30KKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCitUaGlzIGVuc3VyZXMgdGhhdCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgcGFyZW50IG9yIGNoaWxkIGlzIHNjaGVkdWxlZAorZmlyc3QsIHRoZSBwcm9jZXNzIGdyb3VwIHNldHRpbmcgaXMgYXMgZXhwZWN0ZWQgYnkgYm90aC4KKzxwPgorPC9wPjxoMz5TaWduYWxsaW5nIGFuZCB3YWl0aW5nPC9oMz4KKworPHA+T25lIGNhbiBzaWduYWwgYWxsIG1lbWJlcnMgb2YgYSBwcm9jZXNzIGdyb3VwOgorPC9wPjxibG9ja3F1b3RlPgorPHByZT5raWxscGcocGdycCwgc2lnKTsKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorPHA+T25lIGNhbiB3YWl0IGZvciBjaGlsZHJlbiBpbiBvbmVzIG93biBwcm9jZXNzIGdyb3VwOgorPC9wPjxibG9ja3F1b3RlPgorPHByZT53YWl0cGlkKDAsICZhbXA7c3RhdHVzLCAuLi4pOworPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK29yIGluIGEgc3BlY2lmaWVkIHByb2Nlc3MgZ3JvdXA6Cis8YmxvY2txdW90ZT4KKzxwcmU+d2FpdHBpZCgtcGdycCwgJmFtcDtzdGF0dXMsIC4uLik7Cis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKzxwPgorPC9wPjxoMz5Gb3JlZ3JvdW5kIHByb2Nlc3MgZ3JvdXA8L2gzPgorCis8cD5BbW9uZyB0aGUgcHJvY2VzcyBncm91cHMgaW4gYSBzZXNzaW9uIGF0IG1vc3Qgb25lIGNhbiBiZQordGhlIDxpPmZvcmVncm91bmQgcHJvY2VzcyBncm91cDwvaT4gb2YgdGhhdCBzZXNzaW9uLgorVGhlIHR0eSBpbnB1dCBhbmQgdHR5IHNpZ25hbHMgKHNpZ25hbHMgZ2VuZXJhdGVkIGJ5IF5DLCBeWiwgZXRjLikKK2dvIHRvIHByb2Nlc3NlcyBpbiB0aGlzIGZvcmVncm91bmQgcHJvY2VzcyBncm91cC4KKzwvcD48cD5BIHByb2Nlc3MgY2FuIGRldGVybWluZSB0aGUgZm9yZWdyb3VuZCBwcm9jZXNzIGdyb3VwIGluIGl0cyBzZXNzaW9uCit1c2luZyA8Y29kZT50Y2dldHBncnAoZmQpPC9jb2RlPiwgd2hlcmUgPGNvZGU+ZmQ8L2NvZGU+IHJlZmVycyB0byBpdHMKK2NvbnRyb2xsaW5nIHR0eS4gSWYgdGhlcmUgaXMgbm9uZSwgdGhpcyByZXR1cm5zIGEgcmFuZG9tIHZhbHVlCitsYXJnZXIgdGhhbiAxIHRoYXQgaXMgbm90IGEgcHJvY2VzcyBncm91cCBJRC4KKzwvcD48cD5BIHByb2Nlc3MgY2FuIHNldCB0aGUgZm9yZWdyb3VuZCBwcm9jZXNzIGdyb3VwIGluIGl0cyBzZXNzaW9uCit1c2luZyA8Y29kZT50Y3NldHBncnAoZmQscGdycCk8L2NvZGU+LCB3aGVyZSA8Y29kZT5mZDwvY29kZT4gcmVmZXJzIHRvIGl0cworY29udHJvbGxpbmcgdHR5LCBhbmQgPGNvZGU+cGdycDwvY29kZT4gaXMgYSBwcm9jZXNzIGdyb3VwIGluCitpdHMgc2Vzc2lvbiwgYW5kIHRoaXMgc2Vzc2lvbiBzdGlsbCBpcyBhc3NvY2lhdGVkIHRvIHRoZSBjb250cm9sbGluZwordHR5IG9mIHRoZSBjYWxsaW5nIHByb2Nlc3MuCis8L3A+PHA+SG93IGRvZXMgb25lIGdldCA8Y29kZT5mZDwvY29kZT4/IEJ5IGRlZmluaXRpb24sIDxjb2RlPi9kZXYvdHR5PC9jb2RlPgorcmVmZXJzIHRvIHRoZSBjb250cm9sbGluZyB0dHksIGVudGlyZWx5IGluZGVwZW5kZW50IG9mIHJlZGlyZWN0cworb2Ygc3RhbmRhcmQgaW5wdXQgYW5kIG91dHB1dC4gKFRoZXJlIGlzIGFsc28gdGhlIGZ1bmN0aW9uCis8Y29kZT5jdGVybWlkKCk8L2NvZGU+IHRvIGdldCB0aGUgbmFtZSBvZiB0aGUgY29udHJvbGxpbmcgdGVybWluYWwuCitPbiBhIFBPU0lYIHN0YW5kYXJkIHN5c3RlbSBpdCB3aWxsIHJldHVybiA8Y29kZT4vZGV2L3R0eTwvY29kZT4uKQorT3BlbmluZyB0aGUgbmFtZSBvZiB0aGUKK2NvbnRyb2xsaW5nIHR0eSBnaXZlcyBhIGZpbGUgZGVzY3JpcHRvciA8Y29kZT5mZDwvY29kZT4uCis8L3A+PHA+Cis8L3A+PGgzPkJhY2tncm91bmQgcHJvY2VzcyBncm91cHM8L2gzPgorCis8cD5BbGwgcHJvY2VzcyBncm91cHMgaW4gYSBzZXNzaW9uIHRoYXQgYXJlIG5vdCBmb3JlZ3JvdW5kCitwcm9jZXNzIGdyb3VwIGFyZSA8aT5iYWNrZ3JvdW5kIHByb2Nlc3MgZ3JvdXBzPC9pPi4KK1NpbmNlIHRoZSB1c2VyIGF0IHRoZSBrZXlib2FyZCBpcyBpbnRlcmFjdGluZyB3aXRoIGZvcmVncm91bmQKK3Byb2Nlc3NlcywgYmFja2dyb3VuZCBwcm9jZXNzZXMgc2hvdWxkIHN0YXkgYXdheSBmcm9tIGl0LgorV2hlbiBhIGJhY2tncm91bmQgcHJvY2VzcyByZWFkcyBmcm9tIHRoZSB0ZXJtaW5hbCBpdCBnZXRzCithIFNJR1RUSU4gc2lnbmFsLiBOb3JtYWxseSwgdGhhdCB3aWxsIHN0b3AgaXQsIHRoZSBqb2IgY29udHJvbCBzaGVsbAorbm90aWNlcyBhbmQgdGVsbHMgdGhlIHVzZXIsIHdobyBjYW4gc2F5IDxjb2RlPmZnPC9jb2RlPiB0byBjb250aW51ZQordGhpcyBiYWNrZ3JvdW5kIHByb2Nlc3MgYXMgYSBmb3JlZ3JvdW5kIHByb2Nlc3MsIGFuZCB0aGVuIHRoaXMKK3Byb2Nlc3MgY2FuIHJlYWQgZnJvbSB0aGUgdGVybWluYWwuIEJ1dCBpZiB0aGUgYmFja2dyb3VuZCBwcm9jZXNzCitpZ25vcmVzIG9yIGJsb2NrcyB0aGUgU0lHVFRJTiBzaWduYWwsIG9yIGlmIGl0cyBwcm9jZXNzIGdyb3VwCitpcyBvcnBoYW5lZCAoc2VlIGJlbG93KSwgdGhlbiB0aGUgcmVhZCgpIHJldHVybnMgYW4gRUlPIGVycm9yLAorYW5kIG5vIHNpZ25hbCBpcyBzZW50LiAoSW5kZWVkLCB0aGUgaWRlYSBpcyB0byB0ZWxsIHRoZSBwcm9jZXNzCit0aGF0IHJlYWRpbmcgZnJvbSB0aGUgdGVybWluYWwgaXMgbm90IGFsbG93ZWQgcmlnaHQgbm93LgorSWYgaXQgd291bGRuJ3Qgc2VlIHRoZSBzaWduYWwsIHRoZW4gaXQgd2lsbCBzZWUgdGhlIGVycm9yIHJldHVybi4pCis8L3A+PHA+V2hlbiBhIGJhY2tncm91bmQgcHJvY2VzcyB3cml0ZXMgdG8gdGhlIHRlcm1pbmFsLCBpdCBtYXkgZ2V0CithIFNJR1RUT1Ugc2lnbmFsLiBNYXk6IG5hbWVseSwgd2hlbiB0aGUgZmxhZyB0aGF0IHRoaXMgbXVzdCBoYXBwZW4KK2lzIHNldCAoaXQgaXMgb2ZmIGJ5IGRlZmF1bHQpLiBPbmUgY2FuIHNldCB0aGUgZmxhZyBieQorPC9wPjxibG9ja3F1b3RlPgorPHByZT4lIHN0dHkgdG9zdG9wCis8L3ByZT4KKzwvYmxvY2txdW90ZT4KKworYW5kIGNsZWFyIGl0IGFnYWluIGJ5Cis8YmxvY2txdW90ZT4KKzxwcmU+JSBzdHR5IC10b3N0b3AKKzwvcHJlPgorPC9ibG9ja3F1b3RlPgorCithbmQgaW5zcGVjdCBpdCBieQorPGJsb2NrcXVvdGU+Cis8cHJlPiUgc3R0eSAtYQorPC9wcmU+Cis8L2Jsb2NrcXVvdGU+CisKK0FnYWluLCBpZiBUT1NUT1AgaXMgc2V0IGJ1dCB0aGUgYmFja2dyb3VuZCBwcm9jZXNzIGlnbm9yZXMgb3IgYmxvY2tzCit0aGUgU0lHVFRPVSBzaWduYWwsIG9yIGlmIGl0cyBwcm9jZXNzIGdyb3VwIGlzIG9ycGhhbmVkIChzZWUgYmVsb3cpLAordGhlbiB0aGUgd3JpdGUoKSByZXR1cm5zIGFuIEVJTyBlcnJvciwgYW5kIG5vIHNpZ25hbCBpcyBzZW50LgorW3ZkYTogY29ycmVjdGlvbi4gU1VTIHNheXMgdGhhdCBpZiBTSUdUVE9VIGlzIGJsb2NrZWQvaWdub3JlZCwgd3JpdGUgc3VjY2VlZHMuIF0KKzxwPgorPC9wPjxoMz5PcnBoYW5lZCBwcm9jZXNzIGdyb3VwczwvaDM+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+CmRpZmYgLS1naXQgYS9kb2NzL2lmdXBkb3duX2Rlc2lnbi50eHQgYi9kb2NzL2lmdXBkb3duX2Rlc2lnbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllMjhhOQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvaWZ1cGRvd25fZGVzaWduLnR4dApAQCAtMCwwICsxLDQ0IEBACitUaGlzIGRvY3VtZW50IGlzIG1lYW50IHRvIGNvbnZpbmNlIHlvdSB0byBub3QgdXNlIGlmdXAvaWZkb3duLgorCisKK1RoZSBnZW5lcmFsIHByb2JsZW0gd2l0aCBpZnVwZG93biBpcyB0aGF0IGl0IGlzICJjb3B1bGF0ZWQgaW4gdmVydGljYWwKK2Zhc2hpb24iIGJ5IGRlc2lnbi4gSXQgdHJpZXMgdG8gZG8gdGhlIGpvYiBvZiBzaGVsbCBzY3JpcHQgaW4gQywKK2FuZCB0aGlzIGlzIGludmFyaWFibHkgZG9vbWVkIHRvIGZhaWwuIFlvdSBuZWVkIGlmdXAvaWZkb3duCit0byBiZSBhZGFwdGFibGUgYnkgbG9jYWwgYWRtaW5zLCBhbmQgQyBpcyBhbiBleHRyZW1lbHkgcG9vciBjaG9pY2UKK2ZvciB0aGF0LgorCitXZSBhcmUgZG9vbWVkIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCBpZnVwL2lmZG93bi4gSnVzdCBsb29rIGFzIHRoaXMgY29kZToKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkaGNwX2NsaWVudF90IGV4dF9kaGNwX2NsaWVudHNbXSA9IHsKKwl7ICJkaGNwY2QiLCAiPHVwIGNtZD4iLCAiPGRvd24gY21kPiIgfSwKKwl7ICJkaGNsaWVudCIsIC4uLi4uLi4uIH0sCisJeyAicHVtcCIsIC4uLi4uLi4uIH0sCisJeyAidWRoY3BjIiwgLi4uLi4uLi4gfSwKK307CisKK3N0YXRpYyBpbnQgZGhjcF9kb3duKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQsIGV4ZWNmbiAqZXhlYykKK3sKKyNpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9FWFRFUk5BTF9ESENQCisJaW50IGkgOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGV4dF9kaGNwX2NsaWVudHMpOyBpKyspIHsKKwkJaWYgKGV4ZWN1dGFibGVfZXhpc3RzKGV4dF9kaGNwX2NsaWVudHNbaV0ubmFtZSkpCisJCQlyZXR1cm4gZXhlY3V0ZShleHRfZGhjcF9jbGllbnRzW2ldLnN0b3BjbWQsIGlmZCwgZXhlYyk7CisJfQorCWJiX2Vycm9yX21zZygibm8gZGhjcCBjbGllbnRzIGZvdW5kLCB1c2luZyBzdGF0aWMgaW50ZXJmYWNlIHNodXRkb3duIik7CisJcmV0dXJuIHN0YXRpY19kb3duKGlmZCwgZXhlYyk7CisjZWxpZiBFTkFCTEVfVURIQ1BDCisJcmV0dXJuIGV4ZWN1dGUoImtpbGwgIgorCQkJImBjYXQgL3Zhci9ydW4vdWRoY3BjLiVpZmFjZSUucGlkYCAyPi9kZXYvbnVsbCIsIGlmZCwgZXhlYyk7CisjZWxzZQorCXJldHVybiAwOyAvKiBubyBkaGNwIHN1cHBvcnQgKi8KKyNlbmRpZgorfQorCitIb3cgdGhlIGhlbGwgaXQgaXMgc3VwcG9zZWQgdG8gd29yayByZWxpYWJseSB0aGlzIHdheT8gSnVzdCBpbWFnaW5lIHRoYXQKK2FkbWluIGlzIHVzaW5nIHB1bXAgYW5kIGlmdXAvaWZkb3duLiBJdCB3b3Jrcy4gVGhlbiwgZm9yIHdoYXRldmVyIHJlYXNvbiwKK2FkbWluIGluc3RhbGxzIGRoY2xpZW50LCBidXQgZG9lcyBOT1QgdXNlIGl0LiBpZmRvd24gd2lsbCBTVE9QIFdPUktJTkcsCitqdXN0IGJlY2F1c2UgaXQgd2lsbCBzZWUgaW5zdGFsbGVkIGRoY2xpZW50IGJpbmFyeSBpbiBlLmcuIC91c3IvYmluL2RoY2xpZW50IQorVGhpcyBpcyBzdHVwaWQuCisKK0kgc2VyaW91c2x5IHVyZ2UgcGVvcGxlIHRvIG5vdCB1c2UgaWZ1cC9pZmRvd24uCitVc2Ugc29tZXRoaW5nIGxlc3MgYnJhaW4gZGFtYWdlZC4KZGlmZiAtLWdpdCBhL2RvY3Mva2VlcF9kYXRhX3NtYWxsLnR4dCBiL2RvY3Mva2VlcF9kYXRhX3NtYWxsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2VkMWE2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9rZWVwX2RhdGFfc21hbGwudHh0CkBAIC0wLDAgKzEsMjY1IEBACisJCUtlZXBpbmcgZGF0YSBzbWFsbAorCitXaGVuIG1hbnkgYXBwbGV0cyBhcmUgY29tcGlsZWQgaW50byBidXN5Ym94LCBhbGwgcncgZGF0YSBhbmQKK2JzcyBmb3IgZWFjaCBhcHBsZXQgYXJlIGNvbmNhdGVuYXRlZC4gSW5jbHVkaW5nIHRob3NlIGZyb20gbGliYywKK2lmIHN0YXRpYyBidXN5Ym94IGlzIGJ1aWx0LiBXaGVuIGJ1c3lib3ggaXMgc3RhcnRlZCwgX2FsbF8gdGhpcyBkYXRhCitpcyBhbGxvY2F0ZWQsIG5vdCBqdXN0IHRoYXQgb25lIHBhcnQgZm9yIHNlbGVjdGVkIGFwcGxldC4KKworV2hhdCAiYWxsb2NhdGVkIiBleGFjdGx5IG1lYW5zLCBkZXBlbmRzIG9uIGFyY2guCitPbiBOT01NVSBpdCdzIHByb2JhYmx5IGJpdGVzIHRoZSBtb3N0LCBhY3R1YWxseSB1c2luZyByZWFsCitSQU0gZm9yIHJ3ZGF0YSBhbmQgYnNzLiBPbiBpMzg2LCBic3MgaXMgbGF6aWx5IGFsbG9jYXRlZAorYnkgQ09XZWQgemVybyBwYWdlcy4gTm90IHN1cmUgYWJvdXQgcndkYXRhIC0gYWxzbyBDT1c/CisKK0luIG9yZGVyIHRvIGtlZXAgYnVzeWJveCBOT01NVSBhbmQgc21hbGwtbWVtIHN5c3RlbXMgZnJpZW5kbHkKK3dlIHNob3VsZCBhdm9pZCBsYXJnZSBnbG9iYWwgZGF0YSBpbiBvdXIgYXBwbGV0cywgYW5kIHNob3VsZAorbWluaW1pemUgdXNhZ2Ugb2YgbGliYyBmdW5jdGlvbnMgd2hpY2ggaW1wbGljaXRseSB1c2UKK3N1Y2ggc3RydWN0dXJlcy4KKworU21hbGwgZXhwZXJpbWVudCB0byBtZWFzdXJlICJwYXJhc2l0aWMiIGJib3ggbWVtb3J5IGNvbnN1bXB0aW9uOgoraGVyZSB3ZSBzdGFydCAxMDAwICJidXN5Ym94IHNsZWVwIDEwIiBpbiBwYXJhbGxlbC4KK2J1c3lib3ggYmluYXJ5IGlzIHByYWN0aWNhbGx5IGFsbHllc2NvbmZpZyBzdGF0aWMgb25lLAorYnVpbHQgYWdhaW5zdCB1Y2xpYmMuIFJ1biBvbiB4ODYtNjQgbWFjaGluZSB3aXRoIDY0LWJpdCBrZXJuZWw6CisKK2Jhc2gtMy4yIyBubWV0ZXIgJyV0ICVjICVtICVwICVbcG5dJworMjM6MTc6MjggLi4uLi4uLi4uLiAxNjhNICAgIDAgIDE0NworMjM6MTc6MjkgLi4uLi4uLi4uLiAxNjhNICAgIDAgIDE0NworMjM6MTc6MzAgVS4uLi4uLi4uLiAxNjhNICAgIDEgIDE0NworMjM6MTc6MzEgU1UuLi4uLi4uLiAxODFNICAyNDQgIDM5MQorMjM6MTc6MzIgU1NTU1VVVS4uLiAyMjNNICA3NTcgMTE0NworMjM6MTc6MzMgVVVVLi4uLi4uLiAyMjNNICAgIDAgMTE0NworMjM6MTc6MzQgVS4uLi4uLi4uLiAyMjNNICAgIDEgMTE0NworMjM6MTc6MzUgLi4uLi4uLi4uLiAyMjNNICAgIDAgMTE0NworMjM6MTc6MzYgLi4uLi4uLi4uLiAyMjNNICAgIDAgMTE0NworMjM6MTc6MzcgUy4uLi4uLi4uLiAyMjNNICAgIDAgMTE0NworMjM6MTc6MzggLi4uLi4uLi4uLiAyMjNNICAgIDEgMTE0NworMjM6MTc6MzkgLi4uLi4uLi4uLiAyMjNNICAgIDAgMTE0NworMjM6MTc6NDAgLi4uLi4uLi4uLiAyMjNNICAgIDAgMTE0NworMjM6MTc6NDEgLi4uLi4uLi4uLiAyMTBNICAgIDAgIDkwNgorMjM6MTc6NDIgLi4uLi4uLi4uLiAxNjhNICAgIDEgIDE0NworMjM6MTc6NDMgLi4uLi4uLi4uLiAxNjhNICAgIDAgIDE0NworCitUaGlzIHJlcXVpcmVzIDU1TSBvZiBtZW1vcnkuIFRodXMgMSB0cml2aWFsIGJ1c3lib3ggYXBwbGV0Cit0YWtlcyA1NWsgb2YgbWVtb3J5IG9uIDY0LWJpdCB4ODYga2VybmVsLgorCitPbiAzMi1iaXQga2VybmVsIHdlIG5lZWQgfjI2ayBwZXIgYXBwbGV0LgorCitTY3JpcHQ6CisKK2k9MTAwMDsgd2hpbGUgdGVzdCAkaSAhPSAwOyBkbworICAgICAgICBlY2hvIC1uIC4KKyAgICAgICAgYnVzeWJveCBzbGVlcCAzMCAmCisgICAgICAgIGk9JCgoaSAtIDEpKQorZG9uZQorZWNobword2FpdAorCisoRGF0YSBmcm9tIE5PTU1VIGFyY2hlcyBhcmUgc291Z2h0LiBQcm92aWRlICdzaXplIGJ1c3lib3gnIG91dHB1dCB0b28pCisKKworCQlFeGFtcGxlIDEKKworT25lIGV4YW1wbGUgaG93IHRvIHJlZHVjZSBnbG9iYWwgZGF0YSB1c2FnZSBpcyBpbgorYXJjaGl2YWwvbGliYXJjaGl2ZS9kZWNvbXByZXNzX3VuemlwLmM6CisKKy8qIFRoaXMgaXMgc29tZXdoYXQgY29tcGxleC1sb29raW5nIGFycmFuZ2VtZW50LCBidXQgaXQgYWxsb3dzCisgKiB0byBwbGFjZSBkZWNvbXByZXNzb3Igc3RhdGUgZWl0aGVyIGluIGJzcyBvciBpbgorICogbWFsbG9jJ2VkIHNwYWNlIHNpbXBseSBieSBjaGFuZ2luZyAjZGVmaW5lcyBiZWxvdy4KKyAqIFNpemVzIG9uIGkzODY6CisgKiB0ZXh0ICAgIGRhdGEgICAgIGJzcyAgICAgZGVjICAgICBoZXgKKyAqIDUyNTYgICAgICAgMCAgICAgMTA4ICAgIDUzNjQgICAgMTRmNCAtIGJzcworICogNDkxNSAgICAgICAwICAgICAgIDAgICAgNDkxNSAgICAxMzMzIC0gbWFsbG9jCisgKi8KKyNkZWZpbmUgU1RBVEVfSU5fQlNTIDAKKyNkZWZpbmUgU1RBVEVfSU5fTUFMTE9DIDEKKworKHNlZSB0aGUgcmVzdCBvZiB0aGUgZmlsZSB0byBnZXQgdGhlIGlkZWEpCisKK1RoaXMgZXhhbXBsZSBjb21wbGV0ZWx5IGVsaW1pbmF0ZXMgZ2xvYmFscyBpbiB0aGF0IG1vZHVsZS4KK1JlcXVpcmVkIG1lbW9yeSBpcyBhbGxvY2F0ZWQgaW4gdW5wYWNrX2d6X3N0cmVhbSgpIFtpdHMgbWFpbiBtb2R1bGVdCithbmQgdGhlbiBwYXNzZWQgZG93biB0byBhbGwgc3Vicm91dGluZXMgd2hpY2ggbmVlZCB0byBhY2Nlc3MgJ2dsb2JhbHMnCithcyBhIHBhcmFtZXRlci4KKworCisJCUV4YW1wbGUgMgorCitJbiBjYXNlIHlvdSBkb24ndCB3YW50IHRvIHBhc3MgdGhpcyBhZGRpdGlvbmFsIHBhcmFtZXRlciBldmVyeXdoZXJlLAordGFrZSBhIGxvb2sgYXQgYXJjaGl2YWwvZ3ppcC5jLiBIZXJlIGFsbCBnbG9iYWwgZGF0YSBpcyByZXBsYWNlZCBieQorc2luZ2xlIGdsb2JhbCBwb2ludGVyIChwdHJfdG9fZ2xvYmFscykgdG8gYWxsb2NhdGVkIHN0b3JhZ2UuCisKK0luIG9yZGVyIHRvIG5vdCBkdXBsaWNhdGUgcHRyX3RvX2dsb2JhbHMgaW4gZXZlcnkgYXBwbGV0LCB5b3UgY2FuCityZXVzZSBzaW5nbGUgY29tbW9uIG9uZS4gSXQgaXMgZGVmaW5lZCBpbiBsaWJiYi9tZXNzYWdlcy5jCithcyBzdHJ1Y3QgZ2xvYmFscyAqY29uc3QgcHRyX3RvX2dsb2JhbHMsIGJ1dCB0aGUgc3RydWN0IGdsb2JhbHMgaXMKK05PVCBkZWZpbmVkIGluIGxpYmJiLmguIFlvdSBmaXJzdCBkZWZpbmUgeW91ciBvd24gc3RydWN0OgorCitzdHJ1Y3QgZ2xvYmFscyB7IGludCBhOyBjaGFyIGJ1ZlsxMDAwXTsgfTsKKworYW5kIHRoZW4gZGVjbGFyZSB0aGF0IHB0cl90b19nbG9iYWxzIGlzIGEgcG9pbnRlciB0byBpdDoKKworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisKK3B0cl90b19nbG9iYWxzIGlzIGRlY2xhcmVkIGFzIGNvbnN0YW50IHBvaW50ZXIuCitUaGlzIGhlbHBzIGdjYyB1bmRlcnN0YW5kIHRoYXQgaXQgd29uJ3QgY2hhbmdlLCByZXN1bHRpbmcgaW4gbm90aWNlYWJseQorc21hbGxlciBjb2RlLiBJbiBvcmRlciB0byBhc3NpZ24gaXQsIHVzZSBTRVRfUFRSX1RPX0dMT0JBTFMgbWFjcm86CisKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsKKworVHlwaWNhbGx5IGl0IGlzIGRvbmUgaW4gPGFwcGxldD5fbWFpbigpLiBBbm90aGVyIHZhcmlhdGlvbiBpcwordG8gdXNlIHN0YWNrOgorCitpbnQgPGFwcGxldD5fbWFpbiguLi4pCit7CisjdW5kZWYgRworCXN0cnVjdCBnbG9iYWxzIEc7CisJbWVtc2V0KCZHLCAwLCBzaXplb2YoRykpOworCVNFVF9QVFJfVE9fR0xPQkFMUygmRyk7CisKK05vdyB5b3UgY2FuIHJlZmVyZW5jZSAiZ2xvYmFscyIgYnkgRy5hLCBHLmJ1ZiBhbmQgc28gb24sIGluIGFueSBmdW5jdGlvbi4KKworCisJCWJiX2NvbW1vbl9idWZzaXoxCisKK1RoZXJlIGlzIG9uZSBiaWcgY29tbW9uIGJ1ZmZlciBpbiBic3MgLSBiYl9jb21tb25fYnVmc2l6MS4gSXQgaXMgYSBtdWNoCitlYXJsaWVyIG1lY2hhbmlzbSB0byByZWR1Y2UgYnNzIHVzYWdlLiBFYWNoIGFwcGxldCBjYW4gdXNlIGl0IGZvcgoraXRzIG5lZWRzLiBMaWJyYXJ5IGZ1bmN0aW9ucyBhcmUgcHJvaGliaXRlZCBmcm9tIHVzaW5nIGl0LgorCisnRy4nIHRyaWNrIGNhbiBiZSBkb25lIHVzaW5nIGJiX2NvbW1vbl9idWZzaXoxIGluc3RlYWQgb2YgbWFsbG9jZWQgYnVmZmVyOgorCisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKworQmUgY2FyZWZ1bCwgdGhvdWdoLCBhbmQgdXNlIGl0IG9ubHkgaWYgZ2xvYmFscyBmaXQgaW50byBiYl9jb21tb25fYnVmc2l6MS4KK1NpbmNlIGJiX2NvbW1vbl9idWZzaXoxIGlzIEJVRlNJWiArIDEgYnl0ZXMgbG9uZyBhbmQgQlVGU0laIGNhbiBjaGFuZ2UKK2Zyb20gb25lIGxpYmMgdG8gYW5vdGhlciwgeW91IGhhdmUgdG8gYWRkIGNvbXBpbGUtdGltZSBjaGVjayBmb3IgaXQ6CisKK2lmIChzaXplb2Yoc3RydWN0IGdsb2JhbHMpID4gc2l6ZW9mKGJiX2NvbW1vbl9idWZzaXoxKSkKKwlCVUdfPGFwcGxldD5fZ2xvYmFsc190b29fYmlnKCk7CisKKworCQlEcmF3YmFja3MKKworWW91IGhhdmUgdG8gaW5pdGlhbGl6ZSBpdCBieSBoYW5kLiB4emFsbG9jKCkgY2FuIGJlIGhlbHBmdWwgaW4gY2xlYXJpbmcKK2FsbG9jYXRlZCBzdG9yYWdlIHRvIDAsIGJ1dCBhbnl0aGluZyBtb3JlIG11c3QgYmUgZG9uZSBieSBoYW5kLgorCitBbGwgZ2xvYmFsIHZhcmlhYmxlcyBhcmUgcHJlZml4ZWQgYnkgJ0cuJyBub3cuIElmIHRoaXMgbWFrZXMgY29kZQorbGVzcyByZWFkYWJsZSwgdXNlICNkZWZpbmVzOgorCisjZGVmaW5lIGRldl9mZCAoRy5kZXZfZmQpCisjZGVmaW5lIHNlY3RvciAoRy5zZWN0b3IpCisKKworCQlGaW5kaW5nIG5vbi1zaGFyZWQgZHVwbGljYXRlZCBzdHJpbmdzCisKK3N0cmluZ3MgYnVzeWJveCB8IHNvcnQgfCB1bmlxIC1jIHwgc29ydCAtbnIKKworCisJCWdjYydzIGRhdGEgYWxpZ25tZW50IHByb2JsZW0KKworVGhlIGZvbGxvd2luZyBhdHRyaWJ1dGUgYWRkZWQgaW4gdmkuYzoKKworc3RhdGljIGludCB0YWJzdG9wOworc3RhdGljIHN0cnVjdCB0ZXJtaW9zIHRlcm1fb3JpZyBfX2F0dHJpYnV0ZV9fICgoYWxpZ25lZCAoNCkpKTsKK3N0YXRpYyBzdHJ1Y3QgdGVybWlvcyB0ZXJtX3ZpIF9fYXR0cmlidXRlX18gKChhbGlnbmVkICg0KSkpOworCityZWR1Y2VzIGJzcyBzaXplIGJ5IDMyIGJ5dGVzLCBiZWNhdXNlIGdjYyBzb21ldGltZXMgYWxpZ25zIHN0cnVjdHVyZXMgdG8KK3JpZGljdWxvdXNseSBsYXJnZSB2YWx1ZXMuIGFzbSBvdXRwdXQgZGlmZiBmb3IgYWJvdmUgZXhhbXBsZToKKworIHRhYnN0b3A6CisgICAgICAgIC56ZXJvICAgNAorICAgICAgICAuc2VjdGlvbiAgICAgICAgLmJzcy50ZXJtX29yaWcsImF3IixAbm9iaXRzCistICAgICAgIC5hbGlnbiAzMgorKyAgICAgICAuYWxpZ24gNAorICAgICAgICAudHlwZSAgIHRlcm1fb3JpZywgQG9iamVjdAorICAgICAgICAuc2l6ZSAgIHRlcm1fb3JpZywgNjAKKyB0ZXJtX29yaWc6CisgICAgICAgIC56ZXJvICAgNjAKKyAgICAgICAgLnNlY3Rpb24gICAgICAgIC5ic3MudGVybV92aSwiYXciLEBub2JpdHMKKy0gICAgICAgLmFsaWduIDMyCisrICAgICAgIC5hbGlnbiA0CisgICAgICAgIC50eXBlICAgdGVybV92aSwgQG9iamVjdAorICAgICAgICAuc2l6ZSAgIHRlcm1fdmksIDYwCisKK2djYyBkb2Vzbid0IHNlZW0gdG8gaGF2ZSBvcHRpb25zIGZvciBhbHRlcmluZyB0aGlzIGJlaGF2aW91ci4KKworZ2NjIDMuNC4zIGFuZCA0LjEuMSB0ZXN0ZWQ6CitjaGFyIGMgPSAxOworLy8gZ2NjIGFsaWducyB0byAzMiBieXRlcyBpZiBzaXplb2Yoc3RydWN0KSA+PSAzMgorc3RydWN0IHsKKyAgICBpbnQgYSxiLGMsZDsKKyAgICBpbnQgaTEsaTIsaTM7Cit9IHMyOCA9IHsgMSB9OyAgICAvLyBzdHJ1Y3Qgd2lsbCBiZSBhbGlnbmVkIHRvIDQgYnl0ZXMKK3N0cnVjdCB7CisgICAgaW50IGEsYixjLGQ7CisgICAgaW50IGkxLGkyLGkzLGk0OworfSBzMzIgPSB7IDEgfTsgICAgLy8gc3RydWN0IHdpbGwgYmUgYWxpZ25lZCB0byAzMiBieXRlcworLy8gc2FtZSBmb3IgYXJyYXlzCitjaGFyIHZjMzFbMzFdID0geyAxIH07IC8vIHVuYWxpZ25lZAorY2hhciB2YzMyWzMyXSA9IHsgMSB9OyAvLyBhbGlnbmVkIHRvIDMyIGJ5dGVzCisKKy1mcGFjay1zdHJ1Y3Q9MSByZWR1Y2VzIGFsaWdubWVudCBvZiBzMjggdG8gMSAoYnV0IHByb2JhYmx5Cit3aWxsIGJyZWFrIGxheW91dCBvZiBtYW55IGxpYmMgc3RydWN0cykgYnV0IHMzMiBhbmQgdmMzMgorYXJlIHN0aWxsIGFsaWduZWQgdG8gMzIgYnl0ZXMuCisKK0kgd2lsbCB0cnkgdG8gY29vayB1cCBhIHBhdGNoIHRvIGFkZCBhIGdjYyBvcHRpb24gZm9yIGRpc2FibGluZyBpdC4KK01lYW53aGlsZSwgdGhpcyBpcyB3aGVyZSBpdCBjYW4gYmUgZGlzYWJsZWQgaW4gZ2NjIHNvdXJjZToKKworZ2NjL2NvbmZpZy9pMzg2L2kzODYuYworaW50CitpeDg2X2RhdGFfYWxpZ25tZW50ICh0cmVlIHR5cGUsIGludCBhbGlnbikKK3sKKyNpZiAwCisgIGlmIChBR0dSRUdBVEVfVFlQRV9QICh0eXBlKQorICAgICAgICYmIFRZUEVfU0laRSAodHlwZSkKKyAgICAgICAmJiBUUkVFX0NPREUgKFRZUEVfU0laRSAodHlwZSkpID09IElOVEVHRVJfQ1NUCisgICAgICAgJiYgKFRSRUVfSU5UX0NTVF9MT1cgKFRZUEVfU0laRSAodHlwZSkpID49IDI1NgorICAgICAgICAgICB8fCBUUkVFX0lOVF9DU1RfSElHSCAoVFlQRV9TSVpFICh0eXBlKSkpICYmIGFsaWduIDwgMjU2KQorICAgIHJldHVybiAyNTY7CisjZW5kaWYKKworUmVzdWx0IChub24tc3RhdGljIGJ1c3lib3ggYnVpbHQgYWdhaW5zdCBnbGliYyk6CisKKyMgc2l6ZSAvdXNyL3NyY2RldmVsL2Jib3gvZml4L2J1c3lib3gudDAvYnVzeWJveCBidXN5Ym94CisgICB0ZXh0ICAgIGRhdGEgICAgIGJzcyAgICAgZGVjICAgICBoZXggZmlsZW5hbWUKKyA2MzQ0MTYgICAgMjczNiAgIDIzODU2ICA2NjEwMDggICBhMTYxMCBidXN5Ym94CisgNjMyNTgwICAgIDI2NzIgICAyMjk0NCAgNjU4MTk2ICAgYTBiMTQgYnVzeWJveF9ub2FsaWduCisKKworCisJCUtlZXBpbmcgY29kZSBzbWFsbAorCitVc2Ugc2NyaXB0cy9ibG9hdC1vLW1ldGVyIHRvIGNoZWNrIHdoZXRoZXIgaW50cm9kdWNlZCBjaGFuZ2VzCitkaWRuJ3QgZ2VuZXJhdGUgdW5uZWNlc3NhcnkgYmxvYXQuIFRoaXMgc2NyaXB0IG5lZWRzIHVuc3RyaXBwZWQgYmluYXJpZXMKK3RvIGdlbmVyYXRlIGEgZGV0YWlsZWQgcmVwb3J0LiBUbyBhdXRvbWF0ZSB0aGlzLCBqdXN0IHVzZQorIm1ha2UgYmxvYXRjaGVjayIuIEl0IHJlcXVpcmVzIGJ1c3lib3hfb2xkIGJpbmFyeSB0byBiZSBwcmVzZW50LAordXNlICJtYWtlIGJhc2VsaW5lIiB0byBnZW5lcmF0ZSBpdCBmcm9tIHVubW9kaWZpZWQgc291cmNlLCBvcgorY29weSBidXN5Ym94X3Vuc3RyaXBwZWQgdG8gYnVzeWJveF9vbGQgYmVmb3JlIG1vZGlmeWluZyBzb3VyY2VzCithbmQgcmVidWlsZGluZy4KKworU2V0IENPTkZJR19FWFRSQV9DRkxBR1M9Ii1mbm8taW5saW5lLWZ1bmN0aW9ucy1jYWxsZWQtb25jZSIsCitwcm9kdWNlICJtYWtlIGJsb2F0Y2hlY2siLCBzZWUgdGhlIGJpZ2dlc3QgYXV0by1pbmxpbmVkIGZ1bmN0aW9ucy4KK05vdywgc2V0IENPTkZJR19FWFRSQV9DRkxBR1MgYmFjayB0byAiIiwgYnV0IGFkZCBOT0lOTElORQordG8gc29tZSBvZiB0aGVzZSBmdW5jdGlvbnMuIEluIDEuMTYueCB0aW1lZnJhbWUsIHRoZSByZXN1bHRzIHdlcmUKKyhhbm5vdGF0ZWQgIm1ha2UgYmxvYXRjaGVjayIgb3V0cHV0KToKKworZnVuY3Rpb24gICAgICAgICAgICAgb2xkICAgICBuZXcgICBkZWx0YQorZXhwYW5kX3ZhcnNfdG9fbGlzdCAgICAtICAgIDE3MTIgICArMTcxMiB3aW4KK2x6bzF4X29wdGltaXplICAgICAgICAgLSAgICAxNDI5ICAgKzE0Mjkgd2luCithcml0aF9hcHBseSAgICAgICAgICAgIC0gICAgMTMyNiAgICsxMzI2IHdpbgorcmVhZF9pbnRlcmZhY2VzICAgICAgICAtICAgIDExNjMgICArMTE2MyBsb3NzLCBsZWF2ZSB3L28gTk9JTkxJTkUKK2xvZ2Rpcl9vcGVuICAgICAgICAgICAgLSAgICAxMTQ4ICAgKzExNDggd2luCitjaGVja19kZXBzICAgICAgICAgICAgIC0gICAgMTE0OCAgICsxMTQ4IGxvc3MKK3Jld3JpdGUgICAgICAgICAgICAgICAgLSAgICAxMDM5ICAgKzEwMzkgd2luCitydW5fcGlwZSAgICAgICAgICAgICAzNTggICAgMTM5NiAgICsxMDM4IHdpbgord3JpdGVfc3RhdHVzX2ZpbGUgICAgICAtICAgIDEwMjkgICArMTAyOSBhbG1vc3QgdGhlIHNhbWUsIGxlYXZlIHcvbyBOT0lOTElORQorZHVtcF9pZGVudGl0eSAgICAgICAgICAtICAgICA5ODcgICAgKzk4NyB3aW4KK21haW5RU29ydDMgICAgICAgICAgICAgLSAgICAgOTIxICAgICs5MjEgd2luCitwYXJzZV9vbmVfbGluZSAgICAgICAgIC0gICAgIDkxNiAgICArOTE2IGxvc3MKK3N1bW1hcml6ZSAgICAgICAgICAgICAgLSAgICAgODk3ICAgICs4OTcgYWxtb3N0IHRoZSBzYW1lCitkb19zaG0gICAgICAgICAgICAgICAgIC0gICAgIDg4NCAgICArODg0IHdpbgorY3Bpb19vICAgICAgICAgICAgICAgICAtICAgICA4NjMgICAgKzg2MyB3aW4KK3N1YkNvbW1hbmQgICAgICAgICAgICAgLSAgICAgODQxICAgICs4NDEgbG9zcworcmVjZWl2ZSAgICAgICAgICAgICAgICAtICAgICA4MzQgICAgKzgzNCBsb3NzCisKKzg1NSBieXRlcyBzYXZlZCBpbiB0b3RhbC4KKworc2NyaXB0cy9ta2RpZmZfb2JqX2Jsb2F0IG1heSBiZSB1c2VmdWwgdG8gYXV0b21hdGUgdGhpcyBwcm9jZXNzOiBydW4KKyJzY3JpcHRzL21rZGlmZl9vYmpfYmxvYXQgTk9STUFMTFlfQlVJTFRfVFJFRSBGT1JDRURfTk9JTkxJTkVfVFJFRSIKK2FuZCBzZWxlY3QgbW9kdWxlcyB3aGljaCBzaHJhbmsuCmRpZmYgLS1naXQgYS9kb2NzL2xvZ2dpbmdfYW5kX2JhY2tncm91bmRpbmcudHh0IGIvZG9jcy9sb2dnaW5nX2FuZF9iYWNrZ3JvdW5kaW5nLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzZjZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9sb2dnaW5nX2FuZF9iYWNrZ3JvdW5kaW5nLnR4dApAQCAtMCwwICsxLDk4IEBACisJTG9nZ2luZyBhbmQgYmFja2dyb3VuZGluZworCitCeSBkZWZhdWx0LCBiYl9bcF1lcnJvcl9tc2dbX2FuZF9kaWVdIG1lc3NhZ2VzIGdvIHRvIHN0ZGVyciwKK2FuZCBvZiBjb3Vyc2UsIHVzdWFsbHkgYXBwbGV0cyBkbyBub3QgYXV0by1iYWNrZ3JvdW5kLiA6KQorCitIaXN0b3JpY2FsbHksIGRhZW1vbnMgYW5kIGluZXRkIHNlcnZpY2VzIGFyZSBkaWZmZXJlbnQuCisKK0J1c3lib3ggaXMgdHJ5aW5nIHRvIHByb3ZpZGUgY29tcGF0aWJsZSBiZWhhdmlvciwgdGh1cyBpZiBhbiBhcHBsZXQKK2lzIGVtdWxhdGluZyBhbiBleGlzdGluZyB1dGlsaXR5LCBpdCBzaG91bGQgbWltaWMgaXQuIElmIHV0aWxpdHkKK2F1dG8tYmFja2dyb3VuZHMgaXRzZWxmLCBidXN5Ym94IGFwcGxldCBzaG91bGQgZG8gdGhlIHNhbWUuCitJZiB1dGlsaXR5IG5vcm1hbGx5IGxvZ3MgdG8gc3lzbG9nLCBidXN5Ym94IGFwcGxldCBzaG91bGQgZG8KK3RoZSBzYW1lIHRvby4KKworSG93ZXZlciwgYnVzeWJveCBzaG91bGQgbm90IG5lZWRsZXNzbHkgcmVzdHJpY3QgdGhlIGZyZWVkb20KK29mIHRoZSB1c2Vycy4gQW5kIHVzZXJzIGhhdmUgZGlmZmVyZW50IG5lZWRzIGFuZCBkaWZmZXJlbnQgcHJlZmVyZW5jZXMuCitTb21lIG1pZ2h0IGxpa2UgbG9nZ2luZyBldmVyeXRoaW5nIGZyb20gZGFlbW9ucyB0byBzeXNsb2cuCitPdGhlcnMgcHJlZmVyIHJ1bm5pbmcgc3R1ZmYgdW5kZXIgcnVuc3Yvc3Zsb2dkIGFuZCB0aHVzIHdvdWxkIGxpa2UKK2xvZ2dpbmcgdG8gc3RkZXJyIGFuZCBubyBkYWVtb25pemF0aW9uLgorCitUbyBoZWxwIHdpdGggdGhhdCwgYnVzeWJveCBhcHBsZXRzIHNob3VsZCBoYXZlIG9wdGlvbnMgdG8gb3ZlcnJpZGUKK2RlZmF1bHQgYmVoYXZpb3IsIHdoYXRldmVyIHRoYXQgaXMgZm9yIGEgZ2l2ZW4gYXBwbGV0LgorCisKK0N1cnJlbnQgc2l0dWF0aW9uIGlzIGEgYml0IG9mIGEgbWVzczoKKworYWNwaWQgLSBhdXRvLWJhY2tncm91bmRzIHVubGVzcyAtZAorY3JvbmQgLSBhdXRvLWJhY2tncm91bmRzIHVubGVzcyAtZiwgbG9ncyB0byBzeXNsb2cgdW5sZXNzIC1kIG9yIC1MLgorICAgIG9wdGlvbiAtZCBsb2dzIHRvIHN0ZGVyciwgLUwgRklMRSBsb2dzIHRvIEZJTEUKK2RldmZzZCAtIChvYnNvbGV0ZSkKK2Ruc2QgLSBvcHRpb24gLWQgbWFrZXMgaXQgYmFja2dyb3VuZCBhbmQgbG9nIHRvIHN5c2xvZworZmFrZWlkZW50ZCAtIGluZXRkIHNlcnZpY2UuIEF1dG8tYmFja2dyb3VuZHMgYW5kIGxvZ3MgdG8gc3lzbG9nCisgICAgaWYgbm8gLWYgYW5kIG5vIC1pIGFuZCBubyAtdyAoLWkgaXMgImluZXRkIHNlcnZpY2UiIGZsYWcsCisgICAgLXcgaXMgImluZXRkLXdhaXQgc2VydmljZSIgZmxhZykKK2Z0cGQgLSBpbmV0ZCBzZXJ2aWNlLiBMb2dzIHRvIHN5c2xvZyB3aXRoIC1TLCB3aXRoIC12IGxvZ3MgdG8gc3RyZXJyIHRvbworaHR0cGQgLSBhdXRvLWJhY2tncm91bmRzIHVubGVzcyAtZiBvciAtaSAoLWkgaXMgImluZXRkIHNlcnZpY2UiIGZsYWcpCitpbmV0ZCAtIGF1dG8tYmFja2dyb3VuZHMgdW5sZXNzIC1mLCBsb2dzIHRvIHN5c2xvZyB1bmxlc3MgLWUKK2tsb2dkIC0gYXV0by1iYWNrZ3JvdW5kcyB1bmxlc3MgLW4KK3N5c2xvZ2QgLSBhdXRvLWJhY2tncm91bmRzIHVubGVzcyAtbgordGVsbmV0ZCAtIGF1dG8tYmFja2dyb3VuZHMgdW5sZXNzIC1mIG9yIC1pICgtaSBpcyAiaW5ldGQgc2VydmljZSIgZmxhZykKK3VkaGNwYyAtIGF1dG8tYmFja2dyb3VuZHMgdW5sZXNzIC1mIGFmdGVyIGxlYXNlIGlzIG9idGFpbmVkLAorICAgIG9wdGlvbiAtYiBtYWtlcyBpdCBiYWNrZ3JvdW5kIHNvb25lciAod2hlbiBsZWFzZSBhdHRlbXB0CisgICAgZmFpbHMgYW5kIHJldHJpZXMgc3RhcnQpLAorICAgIGFmdGVyIGJhY2tncm91bmRpbmcgaXQgc3RvcHMgbG9nZ2luZyB0byBzdGRlcnI7CisgICAgbG9ncyB0byBzdGRlcnIsIGJ1dCBvcHRpb24gLVMgbWFrZXMgaXQgbG9nICphbHNvKiB0byBzeXNsb2cKK3VkaGNwZCAtIGF1dG8tYmFja2dyb3VuZHMgYW5kIGRvIG5vdCBsb2cgdG8gc3RkZXJyIHVubGVzcyAtZiwKKyAgICBvdGhlcndpc2UgbG9ncyB0byBzdGRlcnIsIGJ1dCBvcHRpb24gLVMgbWFrZXMgaXQgbG9nICphbHNvKiB0byBzeXNsb2cKK3pjaXAgLSBhdXRvLWJhY2tncm91bmRzIGFuZCBsb2dzICphbHNvKiB0byBzeXNsb2cgdW5sZXNzIC1mCisgICAgYmVoYXZpb3VyIGNhbiBiZSBvdmVycmlkZGVuIHdpdGggZXhwZXJpbWVudGFsIExPR0dJTkcgZW52LnZhcgorICAgIChjYW4gYmUgc2V0IHRvIGVpdGhlciAibm9uZSIgb3IgInN5c2xvZyIpCisKK1RvdGFsOiAxMyBhcHBsZXRzICgrMSBvYnNvbGV0ZSksCisgNCBsb2cgdG8gc3lzbG9nIGJ5IGRlZmF1bHQgKGNyb25kIGZha2VpZGVudGQgaW5ldGQgemNpcCksCisgNSBuZXZlciBsb2cgdG8gc3lzbG9nIChhY3BpZCBodHRwZCB0ZWxuZXRkIGtsb2dkIHN5c2xvZ2QsIGxhc3QgdHdvCisgLSBmb3Igb2J2aW91c2x5IGNvcnJlY3QgcmVhc29ucyksCisgdGhlcmUgYXJlIG5vIGRhZW1vbnMgd2hpY2ggYWx3YXlzIGxvZyB0byBzeXNsb2csCisgMTIgYXV0by1iYWNrZ3JvdW5kIGlmIG5vdCBydW4gYXMgaW5ldGQgc2VydmljZXMgKGFsbCBleGNlcHQgZG5zZC4KKyBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gInN0YW5kYXJkIiBkbnNkIEFGQUlLUykuIEJ1dCBzZWUgYmVsb3cKKyBmb3IgZGFlbW9ucyAodGNwc3ZkIGV0Yykgd2hpY2ggZG9uJ3QgYXV0by1iYWNrZ3JvdW5kLgorCittaXNjdXRpbHMvY3JvbmQuYzogICAgICAgICAgICBsb2dtb2RlID0gTE9HTU9ERV9TWVNMT0c7CituZXR3b3JraW5nL2Ruc2QuYzogICAgICAgICAgICBsb2dtb2RlID0gTE9HTU9ERV9TWVNMT0c7CituZXR3b3JraW5nL2Z0cGQuYzogICAgICAgICAgICBsb2dtb2RlID0gTE9HTU9ERV9OT05FOworbmV0d29ya2luZy9mdHBkLmM6ICAgICAgICAgICAgbG9nbW9kZSB8PSBMT0dNT0RFX1NZU0xPRzsKK25ldHdvcmtpbmcvaW5ldGQuYzogICAgICAgICAgIGxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsKK25ldHdvcmtpbmcvaXNydl9pZGVudGQuYzogICAgIGxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsKK25ldHdvcmtpbmcvdGVsbmV0ZC5jOiAgICAgICAgIGxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsKK25ldHdvcmtpbmcvdWRoY3AvZGhjcGMuYzogICAgIGxvZ21vZGUgPSBMT0dNT0RFX05PTkU7CituZXR3b3JraW5nL3VkaGNwL2RoY3BjLmM6ICAgICBsb2dtb2RlIHw9IExPR01PREVfU1lTTE9HOworbmV0d29ya2luZy91ZGhjcC9kaGNwYy5jOiAgICAgbG9nbW9kZSAmPSB+TE9HTU9ERV9TVERJTzsKK25ldHdvcmtpbmcvdWRoY3AvZGhjcGQuYzogICAgIGxvZ21vZGUgPSBMT0dNT0RFX05PTkU7CituZXR3b3JraW5nL3VkaGNwL2RoY3BkLmM6ICAgICBsb2dtb2RlIHw9IExPR01PREVfU1lTTE9HOworbmV0d29ya2luZy96Y2lwLmM6ICAgICAgICAgICAgbG9nbW9kZSB8PSBMT0dNT0RFX1NZU0xPRzsKKworCitUaGVzZSBkYWVtb25zIG5ldmVyIGF1dG8tYmFja2dyb3VuZCBhbmQgbmV2ZXIgbG9nIHRvIHN5c2xvZzoKKworbHBkIC0gaW5ldGQgc2VydmljZS4gSGFzIG5vdGhpbmcgdG8gbG9nIHNvIGZhciwgdGhvdWdoCitkaGNwcmVsYXkgLSBzdGFuZGFyZCBiZWhhdmlvcgoraW5vdGlmeWQgLSBzdGFuZGFyZCBiZWhhdmlvcgorcnVuc3YgLSBzdGFuZGFyZCBiZWhhdmlvcgorcnVuc3ZkaXIgLSBzdGFuZGFyZCBiZWhhdmlvcgorc3Zsb2dkIC0gc3RhbmRhcmQgYmVoYXZpb3IKK3RjcHN2ZCwgdWRwc3ZkIC0gc3RhbmRhcmQgYmVoYXZpb3IKK3RmdHBkIC0gc3RhbmRhcmQgYmVoYXZpb3IKKworCitOb24tZGFlbW9ucyAoc2VlbXMgdG8gYmUgdXNlIHN5c2xvZyBmb3IgYSBnb29kIHJlYXNvbik6CisKK25ldHdvcmtpbmcvbmFtZWlmLmM6ICAgICAgICAgIGxvZ21vZGUgfD0gTE9HTU9ERV9TWVNMT0c7Citsb2dpbnV0aWxzL2NocGFzc3dkLmM6ICAgICAgICBsb2dtb2RlID0gTE9HTU9ERV9CT1RIOworbG9naW51dGlscy9jaHBhc3N3ZC5jOiAgICAgICAgbG9nbW9kZSA9IExPR01PREVfU1RESU87Citsb2dpbnV0aWxzL2dldHR5LmM6ICAgICAgICAgICBsb2dtb2RlID0gTE9HTU9ERV9CT1RIOworbG9naW51dGlscy9nZXR0eS5jOiAgICAgICAgICAgbG9nbW9kZSA9IExPR01PREVfTk9ORTsKK2xvZ2ludXRpbHMvcGFzc3dkLmM6ICAgICAgICAgIGxvZ21vZGUgPSBMT0dNT0RFX1NURElPOworbG9naW51dGlscy9wYXNzd2QuYzogICAgICAgICAgbG9nbW9kZSA9IExPR01PREVfQk9USDsKK2xvZ2ludXRpbHMvc3Vsb2dpbi5jOiAgICAgICAgIGxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsgKHVzZWQgaWYgc3RkaW8gaXNuJ3QgYSB0dHkpCitsb2dpbnV0aWxzL3N1bG9naW4uYzogICAgICAgICBsb2dtb2RlID0gTE9HTU9ERV9CT1RIOwordXRpbC1saW51eC9tb3VudC5jOiAgICAgICAgICAgbG9nbW9kZSA9IExPR01PREVfU1lTTE9HOyAodXNlZCBpbiBhIGJhY2tncm91bmRlZCBORlMgbW91bnQgaGVscGVyKQpkaWZmIC0tZ2l0IGEvZG9jcy9tZGV2LnR4dCBiL2RvY3MvbWRldi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI0MDI1ZgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3MvbWRldi50eHQKQEAgLTAsMCArMSwxNTEgQEAKKy0tLS0tLS0tLS0tLS0KKyBNREVWIFByaW1lcgorLS0tLS0tLS0tLS0tLQorCitGb3IgdGhvc2Ugb2YgdXMgd2hvIGtub3cgaG93IHRvIHVzZSBtZGV2LCBhIHByaW1lciBtaWdodCBzZWVtIGxhbWUuICBGb3IKK2V2ZXJ5b25lIGVsc2UsIG1kZXYgaXMgYSB3ZWlyZCBibGFjayBib3ggdGhhdCB0aGV5IGhlYXIgaXMgYXdlc29tZSwgYnV0IGNhbid0CitzZWVtIHRvIGdldCB0aGVpciBoZWFkIGFyb3VuZCBob3cgaXQgd29ya3MuICBUaHVzLCBhIHByaW1lci4KKworLS0tLS0tLS0tLS0KKyBCYXNpYyBVc2UKKy0tLS0tLS0tLS0tCisKK01kZXYgaGFzIHR3byBwcmltYXJ5IHVzZXM6IGluaXRpYWwgcG9wdWxhdGlvbiBhbmQgZHluYW1pYyB1cGRhdGVzLiAgQm90aAorcmVxdWlyZSBzeXNmcyBzdXBwb3J0IGluIHRoZSBrZXJuZWwgYW5kIGhhdmUgaXQgbW91bnRlZCBhdCAvc3lzLiAgRm9yIGR5bmFtaWMKK3VwZGF0ZXMsIHlvdSBhbHNvIG5lZWQgdG8gaGF2ZSBob3RwbHVnZ2luZyBlbmFibGVkIGluIHlvdXIga2VybmVsLgorCitIZXJlJ3MgYSB0eXBpY2FsIGNvZGUgc25pcHBldCBmcm9tIHRoZSBpbml0IHNjcmlwdDoKK1swXSBtb3VudCAtdCBwcm9jIHByb2MgL3Byb2MKK1sxXSBtb3VudCAtdCBzeXNmcyBzeXNmcyAvc3lzCitbMl0gZWNobyAvc2Jpbi9tZGV2ID4gL3Byb2Mvc3lzL2tlcm5lbC9ob3RwbHVnCitbM10gbWRldiAtcworCitBbHRlcm5hdGl2ZWx5LCB3aXRob3V0IHByb2NmcyB0aGUgYWJvdmUgYmVjb21lczoKK1sxXSBtb3VudCAtdCBzeXNmcyBzeXNmcyAvc3lzCitbMl0gc3lzY3RsIC13IGtlcm5lbC5ob3RwbHVnPS9zYmluL21kZXYKK1szXSBtZGV2IC1zCisKKworT2YgY291cnNlLCBhIG1vcmUgImZ1bGwiIHNldHVwIHdvdWxkIGVudGFpbCBleGVjdXRpbmcgdGhpcyBiZWZvcmUgdGhlIHByZXZpb3VzCitjb2RlIHNuaXBwZXQ6CitbNF0gbW91bnQgLXQgdG1wZnMgLW8gc2l6ZT02NGssbW9kZT0wNzU1IHRtcGZzIC9kZXYKK1s1XSBta2RpciAvZGV2L3B0cworWzZdIG1vdW50IC10IGRldnB0cyBkZXZwdHMgL2Rldi9wdHMKKworVGhlIHNpbXBsZSBleHBsYW5hdGlvbiBoZXJlIGlzIHRoYXQgWzFdIHlvdSBuZWVkIHRvIGhhdmUgL3N5cyBtb3VudGVkIGJlZm9yZQorZXhlY3V0aW5nIG1kZXYuICBUaGVuIHlvdSBbMl0gaW5zdHJ1Y3QgdGhlIGtlcm5lbCB0byBleGVjdXRlIC9zYmluL21kZXYgd2hlbmV2ZXIKK2EgZGV2aWNlIGlzIGFkZGVkIG9yIHJlbW92ZWQgc28gdGhhdCB0aGUgZGV2aWNlIG5vZGUgY2FuIGJlIGNyZWF0ZWQgb3IKK2Rlc3Ryb3llZC4gIFRoZW4geW91IFszXSBzZWVkIC9kZXYgd2l0aCBhbGwgdGhlIGRldmljZSBub2RlcyB0aGF0IHdlcmUgY3JlYXRlZAord2hpbGUgdGhlIHN5c3RlbSB3YXMgYm9vdGluZy4KKworRm9yIHRoZSAiZnVsbCIgc2V0dXAsIHlvdSB3YW50IHRvIFs0XSBtYWtlIHN1cmUgL2RldiBpcyBhIHRtcGZzIGZpbGVzeXN0ZW0KKyhhc3N1bWluZyB5b3UncmUgcnVubmluZyBvdXQgb2YgZmxhc2gpLiAgVGhlbiB5b3Ugd2FudCB0byBbNV0gY3JlYXRlIHRoZQorL2Rldi9wdHMgbW91bnQgcG9pbnQgYW5kIGZpbmFsbHkgWzZdIG1vdW50IHRoZSBkZXZwdHMgZmlsZXN5c3RlbSBvbiBpdC4KKworLS0tLS0tLS0tLS0tLQorIE1ERVYgQ29uZmlnICAgKC9ldGMvbWRldi5jb25mKQorLS0tLS0tLS0tLS0tLQorCitNZGV2IGhhcyBhbiBvcHRpb25hbCBjb25maWcgZmlsZSBmb3IgY29udHJvbGxpbmcgb3duZXJzaGlwL3Blcm1pc3Npb25zIG9mCitkZXZpY2Ugbm9kZXMgaWYgeW91ciBzeXN0ZW0gbmVlZHMgc29tZXRoaW5nIG1vcmUgdGhhbiB0aGUgZGVmYXVsdCByb290L3Jvb3QKKzY2MCBwZXJtaXNzaW9ucy4KKworVGhlIGZpbGUgaGFzIHRoZSBmb3JtYXQ6CisJWy1dW2Vudm1hdGNoXTxkZXZpY2UgcmVnZXg+CTx1aWQ+OjxnaWQ+IDxwZXJtaXNzaW9ucz4KK29yCisJW2Vudm1hdGNoXUA8bWFqWyxtaW4xWy1taW4yXV0+CTx1aWQ+OjxnaWQ+IDxwZXJtaXNzaW9ucz4KK29yCisJJGVudnZhcj08cmVnZXg+CQk8dWlkPjo8Z2lkPiA8cGVybWlzc2lvbnM+CisKK0ZvciBleGFtcGxlOgorCWhkW2Etel1bMC05XSogMDozIDY2MAorCitUaGUgY29uZmlnIGZpbGUgcGFyc2luZyBzdG9wcyBhdCB0aGUgZmlyc3QgbWF0Y2hpbmcgbGluZS4gIElmIG5vIGxpbmUgaXMKK21hdGNoZWQsIHRoZW4gdGhlIGRlZmF1bHQgb2YgMDowIDY2MCBpcyB1c2VkLiAgVG8gc2V0IHlvdXIgb3duIGRlZmF1bHQsIHNpbXBseQorY3JlYXRlIHlvdXIgb3duIHRvdGFsIG1hdGNoIGxpa2Ugc286CisKKwkuKiAxOjEgNzc3CisKK1lvdSBjYW4gcmVuYW1lL21vdmUgZGV2aWNlIG5vZGVzIGJ5IHVzaW5nIHRoZSBuZXh0IG9wdGlvbmFsIGZpZWxkLgorCisJPGRldmljZSByZWdleD4gPHVpZD46PGdpZD4gPHBlcm1pc3Npb25zPiBbPXBhdGhdCisKK1NvIGlmIHlvdSB3YW50IHRvIHBsYWNlIHRoZSBkZXZpY2Ugbm9kZSBpbnRvIGEgc3ViZGlyZWN0b3J5LCBtYWtlIHN1cmUgdGhlIHBhdGgKK2hhcyBhIHRyYWlsaW5nIC8uICBJZiB5b3Ugd2FudCB0byByZW5hbWUgdGhlIGRldmljZSBub2RlLCBqdXN0IHBsYWNlIHRoZSBuYW1lLgorCWhkYSAwOjMgNjYwID1kcml2ZXMvCitUaGlzIHdpbGwgbW92ZSAiaGRhIiBpbnRvIHRoZSBkcml2ZXMvIHN1YmRpcmVjdG9yeS4KKwloZGIgMDozIDY2MCA9Y2Ryb20KK1RoaXMgd2lsbCByZW5hbWUgImhkYiIgdG8gImNkcm9tIi4KKworU2ltaWxhcmx5LCAiPnBhdGgiIHJlbmFtZXMvbW92ZXMgdGhlIGRldmljZSBidXQgaXQgYWxzbyBjcmVhdGVzCithIGRpcmVjdCBzeW1saW5rIC9kZXYvREVWTkFNRSB0byB0aGUgcmVuYW1lZC9tb3ZlZCBkZXZpY2UuCisKK1lvdSBjYW4gYWxzbyBwcmV2ZW50IGNyZWF0aW9uIG9mIGRldmljZSBub2RlcyB3aXRoIHRoZSA0dGggZmllbGQgYXMgIiEiOgorCXR0eVthLXpdLiAwOjAgNjYwICEKKwlwdHlbYS16XS4gMDowIDY2MCAhCisKK0lmIHlvdSBhbHNvIGVuYWJsZSBzdXBwb3J0IGZvciBleGVjdXRpbmcgeW91ciBvd24gY29tbWFuZHMsIHRoZW4gdGhlIGZpbGUgaGFzCit0aGUgZm9ybWF0OgorCTxkZXZpY2UgcmVnZXg+IDx1aWQ+OjxnaWQ+IDxwZXJtaXNzaW9ucz4gWz1wYXRoXSBbQHwkfCo8Y29tbWFuZD5dCisgICAgb3IKKwk8ZGV2aWNlIHJlZ2V4PiA8dWlkPjo8Z2lkPiA8cGVybWlzc2lvbnM+IFs+cGF0aF0gW0B8JHwqPGNvbW1hbmQ+XQorICAgIG9yCisJPGRldmljZSByZWdleD4gPHVpZD46PGdpZD4gPHBlcm1pc3Npb25zPiBbIV0gW0B8JHwqPGNvbW1hbmQ+XQorCitGb3IgZXhhbXBsZToKKy0tLTg8LS0tCisjIGJsb2NrIGRldmljZXMKKyhbaHNdZFthLXpdKQkJcm9vdDpkaXNrCTY2MAk+ZGlzay8lMS8wCisoW2hzXWRbYS16XSkoWzAtOV0rKQlyb290OmRpc2sJNjYwCT5kaXNrLyUxLyUyCittbWNibGsoWzAtOV0rKQkJcm9vdDpkaXNrCTY2MAk+ZGlzay9tbWMvJTEvMAorbW1jYmxrKFswLTldKylwKFswLTldKykJcm9vdDpkaXNrCTY2MAk+ZGlzay9tbWMvJTEvJTIKKyMgbmV0d29yayBkZXZpY2VzCisodHVufHRhcCkJCXJvb3Q6bmV0d29yawk2NjAJPm5ldC8lMQorLS0tODwtLS0KKworVGhlIHNwZWNpYWwgY2hhcmFjdGVycyBoYXZlIHRoZSBtZWFuaW5nOgorCUAgUnVuIGFmdGVyIGNyZWF0aW5nIHRoZSBkZXZpY2UuCisJJCBSdW4gYmVmb3JlIHJlbW92aW5nIHRoZSBkZXZpY2UuCisJKiBSdW4gYm90aCBhZnRlciBjcmVhdGluZyBhbmQgYmVmb3JlIHJlbW92aW5nIHRoZSBkZXZpY2UuCisKK1RoZSBjb21tYW5kIGlzIGV4ZWN1dGVkIHZpYSB0aGUgc3lzdGVtKCkgZnVuY3Rpb24gKHdoaWNoIG1lYW5zIHlvdSdyZSBnaXZpbmcgYQorY29tbWFuZCB0byB0aGUgc2hlbGwpLCBzbyBtYWtlIHN1cmUgeW91IGhhdmUgYSBzaGVsbCBpbnN0YWxsZWQgYXQgL2Jpbi9zaC4gIFlvdQorc2hvdWxkIGFsc28ga2VlcCBpbiBtaW5kIHRoYXQgdGhlIGtlcm5lbCBleGVjdXRlcyBob3RwbHVnIGhlbHBlcnMgd2l0aCBzdGRpbiwKK3N0ZG91dCwgYW5kIHN0ZGVyciBjb25uZWN0ZWQgdG8gL2Rldi9udWxsLgorCitGb3IgeW91ciBjb252ZW5pZW5jZSwgdGhlIHNoZWxsIGVudiB2YXIgJE1ERVYgaXMgc2V0IHRvIHRoZSBkZXZpY2UgbmFtZS4gIFNvIGlmCit0aGUgZGV2aWNlICJoZGMiIHdhcyBtYXRjaGVkLCBNREVWIHdvdWxkIGJlIHNldCB0byAiaGRjIi4KKworLS0tLS0tLS0tLQorIEZJUk1XQVJFCistLS0tLS0tLS0tCisKK1NvbWUga2VybmVsIGRldmljZSBkcml2ZXJzIG5lZWQgdG8gcmVxdWVzdCBmaXJtd2FyZSBhdCBydW50aW1lIGluIG9yZGVyIHRvCitwcm9wZXJseSBpbml0aWFsaXplIGEgZGV2aWNlLiAgUGxhY2UgYWxsIHN1Y2ggZmlybXdhcmUgZmlsZXMgaW50byB0aGUKKy9saWIvZmlybXdhcmUvIGRpcmVjdG9yeS4gIEF0IHJ1bnRpbWUsIHRoZSBrZXJuZWwgd2lsbCBpbnZva2UgbWRldiB3aXRoIHRoZQorZmlsZW5hbWUgb2YgdGhlIGZpcm13YXJlIHdoaWNoIG1kZXYgd2lsbCBsb2FkIG91dCBvZiAvbGliL2Zpcm13YXJlLyBhbmQgaW50bwordGhlIGtlcm5lbCB2aWEgdGhlIHN5c2ZzIGludGVyZmFjZS4gIFRoZSBleGFjdCBmaWxlbmFtZSBpcyBoYXJkY29kZWQgaW4gdGhlCitrZXJuZWwsIHNvIGxvb2sgdGhlcmUgaWYgeW91IG5lZWQgdG8ga25vdyBob3cgdG8gbmFtZSB0aGUgZmlsZSBpbiB1c2Vyc3BhY2UuCisKKy0tLS0tLS0tLS0tLQorIFNFUVVFTkNJTkcKKy0tLS0tLS0tLS0tLQorCitLZXJuZWwgZG9lcyBub3Qgc2VyaWFsaXplIGhvdHBsdWcgZXZlbnRzLiBJdCBpbmNyZW1lbnRzIFNFUU5VTSBlbnZpcm9ubWVudGFsCit2YXJpYWJsZSBmb3IgZWFjaCBzdWNjZXNzaXZlIGhvdHBsdWcgaW52b2NhdGlvbi4gTm9ybWFsbHksIG1kZXYgZG9lc24ndCBjYXJlLgorVGhpcyBtYXkgcmVvcmRlciBob3RwbHVnIGFuZCBob3QtdW5wbHVnIGV2ZW50cywgd2l0aCB0eXBpY2FsIHN5bXB0b21zIG9mCitkZXZpY2Ugbm9kZXMgc29tZXRpbWVzIG5vdCBjcmVhdGVkIGFzIGV4cGVjdGVkLgorCitIb3dldmVyLCBpZiAvZGV2L21kZXYuc2VxIGZpbGUgaXMgZm91bmQsIG1kZXYgd2lsbCBjb21wYXJlIGl0cworY29udGVudHMgd2l0aCBTRVFOVU0uIEl0IHdpbGwgcmV0cnkgdXAgdG8gdHdvIHNlY29uZHMsIHdhaXRpbmcgZm9yIHRoZW0KK3RvIG1hdGNoLiBJZiB0aGV5IG1hdGNoIGV4YWN0bHkgKG5vdCBldmVuIHRyYWlsaW5nICdcbicgaXMgYWxsb3dlZCksCitvciBpZiB0d28gc2Vjb25kcyBwYXNzLCBtZGV2IHJ1bnMgYXMgdXN1YWwsIHRoZW4gaXQgcmV3cml0ZXMgL2Rldi9tZGV2LnNlcQord2l0aCBTRVFOVU0rMS4KKworSU9XOiB0aGlzIHdpbGwgc2VyaWFsaXplIGNvbmN1cnJlbnQgbWRldiBpbnZvY2F0aW9ucy4KKworSWYgeW91IHdhbnQgdG8gYWN0aXZhdGUgdGhpcyBmZWF0dXJlLCBleGVjdXRlICJlY2hvID4vZGV2L21kZXYuc2VxIiBwcmlvciB0bworc2V0dGluZyBtZGV2IHRvIGJlIHRoZSBob3RwbHVnIGhhbmRsZXIuIFRoaXMgd3JpdGVzIHNpbmdsZSAnXG4nIHRvIHRoZSBmaWxlLgorTkI6IG1kZXYgcmVjb2duaXplcyAvZGV2L21kZXYuc2VxIGNvbnNpc3Rpbmcgb2Ygc2luZ2xlICdcbicgY2hhcmFjdGVyCithcyBhIHNwZWNpYWwgY2FzZS4gSU9XOiB0aGlzIHdpbGwgbm90IG1ha2UgeW91ciBmaXJzdCBob3RwbHVnIGV2ZW50Cit0byBzdGFsbCBmb3IgdHdvIHNlY29uZHMuCmRpZmYgLS1naXQgYS9kb2NzL25ldy1hcHBsZXQtSE9XVE8udHh0IGIvZG9jcy9uZXctYXBwbGV0LUhPV1RPLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzhlNzdiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9uZXctYXBwbGV0LUhPV1RPLnR4dApAQCAtMCwwICsxLDIwNiBAQAorSG93IHRvIEFkZCBhIE5ldyBBcHBsZXQgdG8gQnVzeUJveAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGRvY3VtZW50IGRldGFpbHMgdGhlIHN0ZXBzIHlvdSBtdXN0IHRha2UgdG8gYWRkIGEgbmV3IGFwcGxldCB0byBCdXN5Qm94LgorCitDcmVkaXRzOgorTWF0dCBLcmFhaSAtIGluaXRpYWwgd3JpdGV1cAorTWFyayBXaGl0bGV5IC0gdGhlIHJlbWl4CitUaG9tYXMgTHVuZHF1aXN0IC0gdHJ5aW5nIHRvIGtlZXAgaXQgdXBkYXRlZAorCitXaGVuIGRvaW5nIHRoaXMgeW91IHNob3VsZCBjb25zaWRlciB1c2luZyB0aGUgbGF0ZXN0IGdpdCBIRUFELgorVGhpcyBpcyBhIGdvb2QgdGhpbmcgaWYgeW91IHBsYW4gdG8gZ2V0dGluZyBpdCBjb21taXR0ZWQgaW50byBtYWlubGluZS4KKworSW5pdGlhbCBXcml0ZQorLS0tLS0tLS0tLS0tLQorCitGaXJzdCwgd3JpdGUgeW91ciBhcHBsZXQuICBCZSBzdXJlIHRvIGluY2x1ZGUgY29weXJpZ2h0IGluZm9ybWF0aW9uIGF0IHRoZSB0b3AsCitzdWNoIGFzIHdobyB5b3Ugc3RvbGUgdGhlIGNvZGUgZnJvbSBhbmQgc28gZm9ydGguIEFsc28gaW5jbHVkZSB0aGUgbWluaS1HUEwKK2JvaWxlcnBsYXRlIGFuZCBDb25maWcuaW4vS2J1aWxkL3VzYWdlL2FwcGxldC5oIHNuaXBwZXRzIChtb3JlIG9uIHRoYXQgYmVsb3cKK2luIHRoaXMgZG9jdW1lbnQpLiBCZSBzdXJlIHRvIG5hbWUgdGhlIG1haW4gZnVuY3Rpb24gPGFwcGxldD5fbWFpbiBpbnN0ZWFkCitvZiBtYWluLiBBbmQgYmUgc3VyZSB0byBwdXQgaXQgaW4gPGFwcGxldD4uYy4gTWFrZSBzdXJlIHRvICNpbmNsdWRlICJsaWJiYi5oIgorYXMgdGhlIGZpcnN0IGluY2x1ZGUgZmlsZSBpbiB5b3VyIGFwcGxldC4KKworRm9yIGEgbmV3IGFwcGxldCBtdSwgaGVyZSBpcyB0aGUgY29kZSB0aGF0IHdvdWxkIGdvIGluIG11LmM6CisKKyhsaWJiYi5oIGFscmVhZHkgaW5jbHVkZXMgbW9zdCB1c3VhbCBoZWFkZXIgZmlsZXMuIFlvdSBkbyBub3QgbmVlZAorI2luY2x1ZGUgPHN0ZGlvLmg+IGV0Yy4uLikKKworCistLS0tYmVnaW4gZXhhbXBsZSBjb2RlLS0tLS0tCisKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgbXUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIFtZRUFSXSBieSBbWU9VUiBOQU1FXSA8WU9VUiBFTUFJTD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgIm90aGVyLmgiCisKKy8vY29uZmlnOmNvbmZpZyBNVQorLy9jb25maWc6CWJvb2wgIk1VIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFJldHVybnMgYW4gaW5kZXRlcm1pbmF0ZSB2YWx1ZS4KKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX01VKSArPSBtdS5vCisvL2FwcGxldDpJRl9NVShBUFBMRVQobXUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL3VzYWdlOiNkZWZpbmUgbXVfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIlstYWJjZGVdIEZJTEUuLi4iCisvL3VzYWdlOiNkZWZpbmUgbXVfZnVsbF91c2FnZQorLy91c2FnZToJIlJldHVybnMgYW4gaW5kZXRlcm1pbmF0ZSB2YWx1ZVxuIgorLy91c2FnZTogICAgICJcbgktYQlGaXJzdCBmdW5jdGlvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWIJU2Vjb25kIGZ1bmN0aW9uIgorCitpbnQgbXVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG11X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBmZDsKKwlzc2l6ZV90IG47CisJY2hhciBtdTsKKworCWZkID0geG9wZW4oIi9kZXYvcmFuZG9tIiwgT19SRE9OTFkpOworCisJaWYgKChuID0gc2FmZV9yZWFkKGZkLCAmbXUsIDEpKSA8IDEpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiL2Rldi9yYW5kb20iKTsKKworCXJldHVybiBtdTsKK30KKworLS0tLWVuZCBleGFtcGxlIGNvZGUtLS0tLS0KKworCitDb2RpbmcgU3R5bGUKKy0tLS0tLS0tLS0tLQorCitCZWZvcmUgeW91IHN1Ym1pdCB5b3VyIGFwcGxldCBmb3IgaW5jbHVzaW9uIGluIEJ1c3lCb3gsIChvciBiZXR0ZXIgeWV0LCBiZWZvcmUKK3lvdSBfd3JpdGVfIHlvdXIgYXBwbGV0KSBwbGVhc2UgcmVhZCB0aHJvdWdoIHRoZSBzdHlsZSBndWlkZSBpbiB0aGUgZG9jcworZGlyZWN0b3J5IGFuZCBtYWtlIHlvdXIgcHJvZ3JhbSBjb21wbGlhbnQuCisKKworU29tZSBXb3JkcyBvbiBsaWJiYgorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBcyB5b3UgYXJlIHdyaXRpbmcgeW91ciBhcHBsZXQsIHBsZWFzZSBiZSBhd2FyZSBvZiB0aGUgYm9keSBvZiBwcmUtZXhpc3RpbmcKK3VzZWZ1bCBmdW5jdGlvbnMgaW4gbGliYmIuIFVzZSB0aGVzZSBpbnN0ZWFkIG9mIHJlaW52ZW50aW5nIHRoZSB3aGVlbC4KKworQWRkaXRpb25hbGx5LCBpZiB5b3UgaGF2ZSBhbnkgdXNlZnVsLCBnZW5lcmFsLXB1cnBvc2UgZnVuY3Rpb25zIGluIHlvdXIKK2FwcGxldCB0aGF0IGNvdWxkIGJlIHVzZWZ1bCBpbiBvdGhlciBhcHBsZXRzLCBjb25zaWRlciBwdXR0aW5nIHRoZW0gaW4gbGliYmIuCisKK0FuZCBpdCBtYXkgYmUgcG9zc2libGUgdGhhdCBzb21lIG9mIHRoZSBvdGhlciBhcHBsZXRzIHVzZXMgZnVuY3Rpb25zIHlvdQorY291bGQgdXNlLiBJZiBzbywgeW91IGhhdmUgdG8gcmlwIHRoZSBmdW5jdGlvbiBvdXQgb2YgdGhlIGFwcGxldCBhbmQgbWFrZQorYSBsaWJiYiBmdW5jdGlvbiBvdXQgb2YgaXQuCisKK0FkZGluZyBhIGxpYmJiIGZ1bmN0aW9uOgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK01ha2UgYSBuZXcgZmlsZSBuYW1lZCA8ZnVuY3Rpb25fbmFtZT4uYworCistLS0tc3RhcnQgZXhhbXBsZSBjb2RlLS0tLS0tCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgIm90aGVyLmgiCisKKy8va2J1aWxkOmxpYi15ICs9IGZ1bmN0aW9uLm8KKworaW50IGZ1bmN0aW9uKGNoYXIgKmEpCit7CisJcmV0dXJuICphOworfQorCistLS0tZW5kIGV4YW1wbGUgY29kZS0tLS0tLQorCitSZW1lbWJlciBhYm91dCB0aGUga2J1aWxkIHNuaXBwZXQuCisKK1lvdSBzaG91bGQgYWxzbyB0cnkgdG8gZmluZCBhIHN1aXRhYmxlIHBsYWNlIGluIGluY2x1ZGUvbGliYmIuaCBmb3IKK3RoZSBmdW5jdGlvbiBkZWNsYXJhdGlvbi4gSWYgbm90LCBhZGQgaXQgc29tZXdoZXJlIGFueXdheSwgd2l0aCBvciB3aXRob3V0CitpZmRlZnMgdG8gaW5jbHVkZSBvciBub3QuCisKK1lvdSBjYW4gbG9vayBhdCBsaWJiYi9Db25maWcuc3JjIGFuZCB0cnkgdG8gZmluZCBvdXQgaWYgdGhlIGZ1bmN0aW9uIGlzCit0dW5hYmxlIGFuZCBhZGQgaXQgdGhlcmUgaWYgaXQgaXMuCisKKworS2J1aWxkL0NvbmZpZy5pbi91c2FnZS9hcHBsZXRzLmggc25pcHBldHMgaW4gLmMgZmlsZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBvbGQgd2F5IG9mIGFkZGluZyBuZXcgYXBwbGV0cyB3YXMgdG8gcHV0IGFsbCB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIGJ5IHRoZQorY29uZmlndXJhdGlvbiBhbmQgYnVpbGQgc3lzdGVtIGludG8gYXBwcm9wcmlhdGUgZmlsZXMgKG5hbWVseTogS2J1aWxkLnNyYyBhbmQKK0NvbmZpZy5zcmMgaW4gbmV3IGFwcGxldCdzIGRpcmVjdG9yeSkgYW5kIHRvIGFkZCB0aGUgYXBwbGV0IGRlY2xhcmF0aW9uIGFuZAordXNhZ2UgaW5mbyB0ZXh0IHRvIGluY2x1ZGUvYXBwbGV0cy5zcmMuaCBhbmQgaW5jbHVkZS91c2FnZS5zcmMuaCByZXNwZWN0aXZlbHkuCisKK1NpbmNlIHRoZSBzY3JpcHRzL2dlbl9idWlsZF9maWxlcy5zaCBzY3JpcHQgaGFkIGJlZW4gaW50cm9kdWNlZCwgdGhlIHByZWZlcnJlZAord2F5IGlzIHRvIGhhdmUgYWxsIHRoZXNlIGRlY2xhcmF0aW9ucyBjb250YWluZWQgd2l0aGluIHRoZSBhcHBsZXQgLmMgZmlsZXMuCisKK0V2ZXJ5IGxpbmUgaW50ZW5kZWQgdG8gYmUgcHJvY2Vzc2VkIGJ5IGdlbl9idWlsZF9maWxlcy5zaCBzaG91bGQgc3RhcnQgYXMgYQorY29tbWVudCB3aXRob3V0IGFueSBwcmVjZWRpbmcgd2hpdGVzcGFjZXMgYW5kIGJlIGZvbGxvd2VkIGJ5IGFuIGFwcHJvcHJpYXRlCitrZXl3b3JkIC0ga2J1aWxkLCBjb25maWcsIHVzYWdlIG9yIGFwcGxldCAtIGFuZCBhIGNvbG9uLCBqdXN0IGxpa2Ugc2hvd24gaW4gdGhlCitmaXJzdCBleGFtcGxlIGFib3ZlLgorCisKK1BsYWNlbWVudCAvIERpcmVjdG9yeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0ZpbmQgdGhlIGFwcHJvcHJpYXRlIGRpcmVjdG9yeSBmb3IgeW91ciBuZXcgYXBwbGV0LgorCitBZGQgdGhlIGtidWlsZCBzbmlwcGV0IHRvIHRoZSAuYyBmaWxlOgorCisvL2tidWlsZDpsaWItJChDT05GSUdfTVUpICs9IG11Lm8KKworQWRkIHRoZSBjb25maWcgc25pcHBldCB0byB0aGUgLmMgZmlsZToKKworLy9jb25maWc6Y29uZmlnIE1VCisvL2NvbmZpZzoJYm9vbCAiTVUiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgUmV0dXJucyBhbiBpbmRldGVybWluYXRlIHZhbHVlLgorCisKK1VzYWdlIFN0cmluZyhzKQorLS0tLS0tLS0tLS0tLS0tCisKK05leHQsIGFkZCB1c2FnZSBpbmZvcm1hdGlvbiBmb3IgeW91ciBhcHBsZXQgdG8gdGhlIC5jIGZpbGUuCitUaGlzIHNob3VsZCBsb29rIGxpa2UgdGhlIGZvbGxvd2luZzoKKworLy91c2FnZTojZGVmaW5lIG11X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSJbLWFiY2RlXSBGSUxFLi4uIgorLy91c2FnZTojZGVmaW5lIG11X2Z1bGxfdXNhZ2UKKy8vdXNhZ2U6CSJSZXR1cm5zIGFuIGluZGV0ZXJtaW5hdGUgdmFsdWVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJRmlyc3QgZnVuY3Rpb24iCisvL3VzYWdlOiAgICAgIlxuCS1iCVNlY29uZCBmdW5jdGlvbiIKKy8vdXNhZ2U6CS4uLgorCitJZiB5b3VyIHByb2dyYW0gc3VwcG9ydHMgZmxhZ3MsIHRoZSBmbGFncyBzaG91bGQgYmUgbWVudGlvbmVkIG9uIHRoZSBmaXJzdAorbGluZSAoWy1hYmNkZV0pIGFuZCBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGVhY2ggZmxhZyBzaG91bGQgZ28gaW4gdGhlCittdV9mdWxsX3VzYWdlIHNlY3Rpb24sIG9uZSBmbGFnIHBlciBsaW5lLgorCisKK0hlYWRlciBGaWxlcworLS0tLS0tLS0tLS0tCisKK0ZpbmFsbHkgYWRkIHRoZSBhcHBsZXQgZGVjbGFyYXRpb24gc25pcHBldC4gQmUgc3VyZSB0byByZWFkIHRoZSB0b3Agb2YKK2FwcGxldHMuc3JjLmggYmVmb3JlIGFkZGluZyB5b3VyIGFwcGxldCAtIGl0IGNvbnRhaW5zIGltcG9ydGFudCBpbmZvCitvbiBhcHBsZXQgbWFjcm9zIGFuZCBjb252ZW50aW9ucy4KKworLy9hcHBsZXQ6SUZfTVUoQVBQTEVUKG11LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworCitUaGUgR3JhbmQgQW5ub3VuY2VtZW50CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZW4gY3JlYXRlIGEgZGlmZiBieSBhZGRpbmcgdGhlIG5ldyBmaWxlcyB0byBnaXQgKHJlbWVtYmVyIHlvdXIgbGliYmIgZmlsZXMpCisJZ2l0IGFkZCA8d2hlcmUgeW91IHB1dCBpdD4vbXUuYworZXZlbnR1YWxseSBhbHNvOgorCWdpdCBhZGQgbGliYmIvZnVuY3Rpb24uYwordGhlbgorCWdpdCBjb21taXQKKwlnaXQgZm9ybWF0LXBhdGNoIEhFQUReCithbmQgc2VuZCBpdCB0byB0aGUgbWFpbGluZyBsaXN0OgorCWJ1c3lib3hAYnVzeWJveC5uZXQKKwlodHRwOi8vYnVzeWJveC5uZXQvbWFpbG1hbi9saXN0aW5mby9idXN5Ym94CisKK1NlbmRpbmcgcGF0Y2hlcyBhcyBhdHRhY2htZW50cyBpcyBwcmVmZXJyZWQsIGJ1dCBub3QgcmVxdWlyZWQuCmRpZmYgLS1naXQgYS9kb2NzL25vZm9ya19ub2V4ZWMudHh0IGIvZG9jcy9ub2Zvcmtfbm9leGVjLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNThmNWE4Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9ub2Zvcmtfbm9leGVjLnR4dApAQCAtMCwwICsxLDk4IEBACisJTk9FWEVDIGFuZCBOT0ZPUksgYXBwbGV0cy4KKworVW5peCBzaGVsbHMgdHJhZGl0aW9uYWxseSBleGVjdXRlIHNvbWUgY29tbWFuZHMgaW50ZXJuYWxseSBpbiB0aGUgYXR0ZW1wdAordG8gZHJhbWF0aWNhbGx5IHNwZWVkIHVwIGV4ZWN1dGlvbi4gSXQgd2lsbCBiZSBzbG93IGFzIGhlbGwgaWYgZm9yIGV2ZXJ5CisiZWNobyBibGFoIiBzaGVsbCB3aWxsIGZvcmsgYW5kIGV4ZWMgL2Jpbi9lY2hvLiBUbyB0aGlzIGVuZCwgc2hlbGxzCitoYXZlIHRvIF9yZWltcGxlbWVudF8gdGhlc2UgY29tbWFuZHMgaW50ZXJuYWxseS4KKworQnVzeWJveCBpcyB1bmlxdWUgaW4gdGhpcyByZWdhcmQgYmVjYXVzZSBpdCBhbHJlYWR5IGlzIGEgY29sbGVjdGlvbgorb2YgcmVpbXBsZW1lbnRlZCBVbml4IGNvbW1hbmRzLCBhbmQgd2UgY2FuIGRvIHRoZSBzYW1lIHRyaWNrCitmb3Igc3BlZWRpbmcgdXAgYnVzeWJveCBzaGVsbHMsIGFuZCBtb3JlLiBOT0VYRUMgYW5kIE5PRk9SSyBhcHBsZXRzCithcmUgZXhhY3RseSB0aG9zZSBhcHBsZXRzIHdoaWNoIGFyZSBlbGlnaWJsZSBmb3IgdGhlc2UgdHJpY2tzLgorCitBcHBsZXQgd2lsbCBiZSBzdWJqZWN0IHRvIE5PRk9SSy9OT0VYRUMgdHJpY2tzIGlmIGl0IGlzIG1hcmtlZCBhcyBzdWNoCitpbiBhcHBsZXRzLmguIEZFQVRVUkVfUFJFRkVSX0FQUExFVFMgaXMgYSBjb25maWcgb3B0aW9uIHdoaWNoCitnbG9iYWxseSBlbmFibGVzIHVzYWdlIG9mIE5PRk9SSy9OT0VYRUMgdHJpY2tzLgorSWYgaXQgaXMgZW5hYmxlZCwgRkVBVFVSRV9TSF9TVEFOREFMT05FIGNhbiBiZSBlbmFibGVkIHRvbywKK2FuZCB0aGVuIHNoZWxscyB3aWxsIHVzZSBOT0ZPUksvTk9FWEVDIHRyaWNrcyBmb3Igb3JkaW5hcnkgY29tbWFuZHMuCitOQjogc2hlbGwgYnVpbHRpbnMgdXNlIHRoZXNlIHRyaWNrcyByZWdhcmRsZXNzIG9mIEZFQVRVUkVfU0hfU1RBTkRBTE9ORQorb3IgRkVBVFVSRV9QUkVGRVJfQVBQTEVUUy4KKworSW4gQywgaWYgeW91IHdhbnQgdG8gY2FsbCBhIHByb2dyYW0gYW5kIHdhaXQgZm9yIGl0LCB1c2UKK3NwYXduX2FuZF93YWl0KGFyZ3YpLCBCQl9FWEVDVlAocHJvZyxhcmd2KSBvciBCQl9FWEVDTFAocHJvZyxhcmd2MCwuLi4pLgorVGhleSBjaGVjayB3aGV0aGVyIHByb2dyYW0gbmFtZSBpcyBhbiBhcHBsZXQgbmFtZSBhbmQgb3B0aW9uYWxseQorZG8gTk9GT1JLL05PRVhFQyB0aGluZyBkZXBlbmRpbmcgb24gY29uZmlndXJhdGlvbi4KKworCisJTk9FWEVDCisKK05PRVhFQyBhcHBsZXQgc2hvdWxkIHdvcmsgY29ycmVjdGx5IGlmIGFub3RoZXIgYXBwbGV0IGZvcmtzIGFuZCB0aGVuCitleGVjdXRlcyBleGl0KDxhcHBsZXQ+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+IGZpZWxkIHNoYWxsIGJlCitjb25zaWRlcmVkIGRhdGEgZm9yIHRoZSBmaWVsZC4gTm9uZSBvZiB0aGUgbGVuZ3RoIGxpbWl0YXRpb25zIG9mCit0aGUgdXN0YXIgaGVhZGVyIGJsb2NrIGZpZWxkcyBpbiB1c3RhciBIZWFkZXIgQmxvY2sgc2hhbGwgYXBwbHkgdG8KK3RoZSBleHRlbmRlZCBoZWFkZXIgcmVjb3Jkcy4KKworcGF4IEV4dGVuZGVkIEhlYWRlciBGaWxlIFRpbWVzCisKK1RpbWUgcmVjb3JkcyBzaGFsbCBiZSBmb3JtYXR0ZWQgYXMgYSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZQordGltZSBpbiBzZWNvbmRzIHNpbmNlIHRoZSBFcG9jaC4gSWYgYSBwZXJpb2QgKCAnLicgKSBkZWNpbWFsIHBvaW50CitjaGFyYWN0ZXIgaXMgcHJlc2VudCwgdGhlIGRpZ2l0cyB0byB0aGUgcmlnaHQgb2YgdGhlIHBvaW50IHNoYWxsCityZXByZXNlbnQgdGhlIHVuaXRzIG9mIGEgc3Vic2Vjb25kIHRpbWluZyBncmFudWxhcml0eS4gSW4gcmVhZCBvcgorY29weSBtb2RlLCB0aGUgcGF4IHV0aWxpdHkgc2hhbGwgdHJ1bmNhdGUgdGhlIHRpbWUgb2YgYSBmaWxlIHRvCit0aGUgZ3JlYXRlc3QgdmFsdWUgdGhhdCBpcyBub3QgZ3JlYXRlciB0aGFuIHRoZSBpbnB1dCBoZWFkZXIKK2ZpbGUgdGltZS4gSW4gd3JpdGUgb3IgY29weSBtb2RlLCB0aGUgcGF4IHV0aWxpdHkgc2hhbGwgb3V0cHV0IGEKK3RpbWUgZXhhY3RseSBpZiBpdCBjYW4gYmUgcmVwcmVzZW50ZWQgZXhhY3RseSBhcyBhIGRlY2ltYWwgbnVtYmVyLAorYW5kIG90aGVyd2lzZSBzaGFsbCBnZW5lcmF0ZSBvbmx5IGVub3VnaCBkaWdpdHMgc28gdGhhdCB0aGUgc2FtZQordGltZSBzaGFsbCBiZSByZWNvdmVyZWQgaWYgdGhlIGZpbGUgaXMgZXh0cmFjdGVkIG9uIGEgc3lzdGVtIHdob3NlCit1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHRoZSBzYW1lIHRpbWUgZ3JhbnVsYXJpdHkuCisKK0V4YW1wbGUgZnJvbSBMaW51eCBrZXJuZWwgYXJjaGl2ZSB0YXJiYWxsOgorCiswMDAwMDAwMCAgNzAgNjEgNzggNWYgNjcgNmMgNmYgNjIgIDYxIDZjIDVmIDY4IDY1IDYxIDY0IDY1ICB8cGF4X2dsb2JhbF9oZWFkZXwKKzAwMDAwMDEwICA3MiAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHxyLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAwMjAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDAzMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwMDAwMDQwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAwNTAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDA2MCAgMDAgMDAgMDAgMDAgMzAgMzAgMzAgMzAgIDM2IDM2IDM2IDAwIDMwIDMwIDMwIDMwICB8Li4uLjAwMDA2NjYuMDAwMHwKKzAwMDAwMDcwICAzMCAzMCAzMCAwMCAzMCAzMCAzMCAzMCAgMzAgMzAgMzAgMDAgMzAgMzAgMzAgMzAgIHwwMDAuMDAwMDAwMC4wMDAwfAorMDAwMDAwODAgIDMwIDMwIDMwIDMwIDMwIDM2IDM0IDAwICAzMCAzMCAzMCAzMCAzMCAzMCAzMCAzMCAgfDAwMDAwNjQuMDAwMDAwMDB8CiswMDAwMDA5MCAgMzAgMzAgMzAgMDAgMzAgMzAgMzEgMzQgIDMwIDM1IDMzIDAwIDY3IDAwIDAwIDAwICB8MDAwLjAwMTQwNTMuZy4uLnwKKzAwMDAwMGEwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAwYjAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDBjMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwMDAwMGQwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAwZTAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDBmMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwMDAwMTAwICAwMCA3NSA3MyA3NCA2MSA3MiAwMCAzMCAgMzAgNjcgNjkgNzQgMDAgMDAgMDAgMDAgIHwudXN0YXIuMDBnaXQuLi4ufAorMDAwMDAxMTAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDEyMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDY3IDY5IDc0IDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uZ2l0Li4uLnwKKzAwMDAwMTMwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAxNDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAzMCAzMCAzMCAzMCAzMCAzMCAzMCAgfC4uLi4uLi4uLjAwMDAwMDB8CiswMDAwMDE1MCAgMDAgMzAgMzAgMzAgMzAgMzAgMzAgMzAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8LjAwMDAwMDAuLi4uLi4uLnwKKzAwMDAwMTYwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAxNzAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDE4MCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwMDAwMTkwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAxYTAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDFiMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwMDAwMWMwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAxZDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfC4uLi4uLi4uLi4uLi4uLi58CiswMDAwMDFlMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwMDAwMWYwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIHwuLi4uLi4uLi4uLi4uLi4ufAorMDAwMDAyMDAgIDM1IDMyIDIwIDYzIDZmIDZkIDZkIDY1ICA2ZSA3NCAzZCA2MiAzMSAzMCAzNSAzMCAgfDUyIGNvbW1lbnQ9YjEwNTB8CiswMDAwMDIxMCAgMzIgNjIgMzIgMzIgNjEgMzEgMzIgMzAgIDM5IDY0IDM2IDYyIDM0IDM3IDM2IDMzICB8MmIyMmExMjA5ZDZiNDc2M3wKKzAwMDAwMjIwICAzOSA2NCAzOCAzOCA2MiAzOCAzMSAzMiAgNjIgMzIgMzEgNjYgNjIgMzUgMzkgMzQgIHw5ZDg4YjgxMmIyMWZiNTk0fAorMDAwMDAyMzAgIDM5IDY1IDM0IDBhIDAwIDAwIDAwIDAwICAwMCAwMCAwMCAwMCAwMCAwMCAwMCAwMCAgfDllNC4uLi4uLi4uLi4uLi58CiswMDAwMDI0MCAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKy4uLgpkaWZmIC0tZ2l0IGEvZG9jcy90Y3AudHh0IGIvZG9jcy90Y3AudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMDBmMzEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3RjcC50eHQKQEAgLTAsMCArMSw5MyBAQAorCVNvbWUgbGVzcy13aWRlbHkga25vd24gZGV0YWlscyBvZiBUQ1AgY29ubmVjdGlvbnMuCisKKwlQcm9wZXJseSBjbG9zaW5nIHRoZSBjb25uZWN0aW9uLgorCitBZnRlciB0aGlzIGNvZGUgc2VxdWVuY2U6CisKKyAgICBzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKyAgICBjb25uZWN0KHNvY2ssICZyZW1vdGUsIHNpemVvZihyZW1vdGUpKTsKKyAgICB3cml0ZShzb2NrLCBidWZmZXIsIDEwMDAwMDApOworCithIGxhcmdlIGJsb2NrIG9mIGRhdGEgaXMgb25seSBidWZmZXJlZCBieSBrZXJuZWwsIGl0IGNhbid0IGJlIHNlbnQgYWxsIGF0IG9uY2UuCitXaGF0IHdpbGwgaGFwcGVuIGlmIHdlIGNsb3NlIHRoZSBzb2NrZXQ/CisKKyJBIGhvc3QgTUFZIGltcGxlbWVudCBhICdoYWxmLWR1cGxleCcgVENQIGNsb3NlIHNlcXVlbmNlLCBzbyB0aGF0CisgYW4gYXBwbGljYXRpb24gdGhhdCBoYXMgY2FsbGVkIGNsb3NlKCkgY2Fubm90IGNvbnRpbnVlIHRvIHJlYWQKKyBkYXRhIGZyb20gdGhlIGNvbm5lY3Rpb24uIElmIHN1Y2ggYSBob3N0IGlzc3VlcyBhIGNsb3NlKCkgY2FsbAorIHdoaWxlIHJlY2VpdmVkIGRhdGEgaXMgc3RpbGwgcGVuZGluZyBpbiBUQ1AsIG9yIGlmIG5ldyBkYXRhIGlzCisgcmVjZWl2ZWQgYWZ0ZXIgY2xvc2UoKSBpcyBjYWxsZWQsIGl0cyBUQ1AgU0hPVUxEIHNlbmQgYSBSU1QKKyB0byBzaG93IHRoYXQgZGF0YSB3YXMgbG9zdC4iCisKK0lPVzogaWYgd2UganVzdCBjbG9zZShzb2NrKSBub3csIGtlcm5lbCBjYW4gcmVzZXQgdGhlIFRDUCBjb25uZWN0aW9uCisoc2VuZCBSU1QgcGFja2V0KS4KKworVGhpcyBpcyBwcm9ibGVtYXRpYyBmb3IgdHdvIHJlYXNvbnM6IGl0IGRpc2NhcmRzIHNvbWUgbm90LXlldCBzZW50CitkYXRhLCBhbmQgaXQgbWF5IGJlIHJlcG9ydGVkIGFzIGVycm9yLCBub3QgRU9GLCBvbiBwZWVyJ3Mgc2lkZS4KKworV2hhdCBjYW4gYmUgZG9uZSBhYm91dCBpdD8KKworU29sdXRpb24gIzE6IGJsb2NrIHVudGlsIHNlbmRpbmcgaXMgZG9uZToKKworICAgIC8qIFdoZW4gZW5hYmxlZCwgYSBjbG9zZSgyKSBvciBzaHV0ZG93bigyKSB3aWxsIG5vdCByZXR1cm4gdW50aWwKKyAgICAgKiBhbGwgcXVldWVkIG1lc3NhZ2VzIGZvciB0aGUgc29ja2V0IGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgc2VudAorICAgICAqIG9yIHRoZSBsaW5nZXIgdGltZW91dCBoYXMgYmVlbiByZWFjaGVkLgorICAgICAqLworICAgIHN0cnVjdCBsaW5nZXIgeworCWludCBsX29ub2ZmOyAgICAvKiBsaW5nZXIgYWN0aXZlICovCisJaW50IGxfbGluZ2VyOyAgIC8qIGhvdyBtYW55IHNlY29uZHMgdG8gbGluZ2VyIGZvciAqLworICAgIH0gbGluZ2VyOworICAgIGxpbmdlci5sX29ub2ZmID0gMTsKKyAgICBsaW5nZXIubF9saW5nZXIgPSBTT01FX05VTTsKKyAgICBzZXRzb2Nrb3B0KHNvY2ssIFNPTF9TT0NLRVQsIFNPX0xJTkdFUiwgJmxpbmdlciwgc2l6ZW9mKGxpbmdlcikpOworICAgIGNsb3NlKHNvY2spOworCitTb2x1dGlvbiAjMjogdGVsbCBrZXJuZWwgdGhhdCB5b3UgYXJlIGRvbmUgc2VuZGluZy4KK1RoaXMgbWFrZXMga2VybmVsIHNlbmQgRklOIGFmdGVyIGFsbCBkYXRhIGlzIHdyaXR0ZW46CisKKyAgICBzaHV0ZG93bihzb2NrLCBTSFVUX1dSKTsKKyAgICBjbG9zZShzb2NrKTsKKworSG93ZXZlciwgZXhwZXJpbWVudHMgb24gTGludXggMy45LjQgc2hvdyB0aGF0IGtlcm5lbCBjYW4gcmV0dXJuIGZyb20KK3NodXRkb3duKCkgYW5kIGZyb20gY2xvc2UoKSBiZWZvcmUgYWxsIGRhdGEgaXMgc2VudCwKK2FuZCBpZiBwZWVyIHNlbmRzIGFueSBkYXRhIHRvIHVzIGFmdGVyIHRoaXMsIGtlcm5lbCBzdGlsbCByZXNwb25kcyB3aXRoCitSU1QgYmVmb3JlIGFsbCBvdXIgZGF0YSBpcyBzZW50LgorCitJbiBwcmFjdGljZSB0aGUgcHJvdG9jb2wgaW4gdXNlIG9mdGVuIGRvZXMgbm90IGFsbG93IHBlZXIgdG8gc2VuZAorc3VjaCBkYXRhIHRvIHVzLCBpbiB3aGljaCBjYXNlIHRoaXMgc29sdXRpb24gaXMgYWNjZXB0YWJsZS4KKworU29sdXRpb24gIzM6IGlmIHlvdSBrbm93IHRoYXQgcGVlciBpcyBnb2luZyB0byBjbG9zZSBpdHMgZW5kIGFmdGVyIGl0IHNlZXMKK291ciBGSU4gKGFzIEVPRiksIGl0IG1pZ2h0IGJlIGEgZ29vZCBpZGVhIHRvIHBlcmZvcm0gYSByZWFkIGFmdGVyIHNodXRkb3duKCkuCitXaGVuIHJlYWQgZmluaXNoZXMgd2l0aCAwLXNpemVkIHJlc3VsdCwgd2UgY29uY2x1ZGUgdGhhdCBwZWVyIHJlY2VpdmVkIGFsbAordGhlIGRhdGEsIHNhdyBFT0YsIGFuZCBjbG9zZWQgaXRzIGVuZC4KKworSG93ZXZlciwgdGhpcyBpbmN1cnMgc21hbGwgcGVyZm9ybWFuY2UgcGVuYWx0eSAod2UgcnVuIGZvciBhIGxvbmdlciB0aW1lKQorYW5kIHJlcXVpcmVzIHNhZmVndWFyZHMgKG5vbmJsb2NraW5nIHJlYWRzLCB0aW1lb3V0cyBldGMpIGFnYWluc3QKK21hbGljaW91cyBwZWVycyB3aGljaCBkb24ndCBjbG9zZSB0aGUgY29ubmVjdGlvbi4KKworU29sdXRpb25zICMxIGFuZCAjMiBjYW4gYmUgY29tYmluZWQ6CisKKyAgICAvKiAuLi5zZXQgdXAgc3RydWN0IGxpbmdlci4uLiB0aGVuOiAqLworICAgIHNldHNvY2tvcHQoc29jaywgU09MX1NPQ0tFVCwgU09fTElOR0VSLCAmbGluZ2VyLCBzaXplb2YobGluZ2VyKSk7CisgICAgc2h1dGRvd24oc29jaywgU0hVVF9XUik7CisgICAgLyogQXQgdGhpcyBwb2ludCwga2VybmVsIHNlbnQgRklOIHBhY2tldCwgbm90IFJTVCwgdG8gdGhlIHBlZXIsICovCisgICAgLyogZXZlbiBpZiB0aGVyZSBpcyBidWZmZXJlZCByZWFkIGRhdGEgZnJvbSB0aGUgcGVlci4gKi8KKyAgICBjbG9zZShzb2NrKTsKKworCURlZmVhdGluZyBOYWdsZS4KKworTWV0aG9kICMxOiBtYW51YWxseSBjb250cm9sIHdoZXRoZXIgcGFydGlhbCBzZW5kcyBhcmUgYWxsb3dlZDoKKworVGhpcyBwcmV2ZW50cyBwYXJ0aWFsbHkgZmlsbGVkIHBhY2tldHMgYmVpbmcgc2VudDoKKworICAgIGludCBzdGF0ZSA9IDE7CisgICAgc2V0c29ja29wdChmZCwgSVBQUk9UT19UQ1AsIFRDUF9DT1JLLCAmc3RhdGUsIHNpemVvZihzdGF0ZSkpOworCithbmQgdGhpcyBmb3JjZXMgbGFzdCwgcGFydGlhbGx5IGZpbGxlZCBwYWNrZXQgKGlmIGFueSkgdG8gYmUgc2VudDoKKworICAgIGludCBzdGF0ZSA9IDA7CisgICAgc2V0c29ja29wdChmZCwgSVBQUk9UT19UQ1AsIFRDUF9DT1JLLCAmc3RhdGUsIHNpemVvZihzdGF0ZSkpOworCitNZXRob2QgIzI6IG1ha2UgYW55IHdyaXRlIHRvIGltbWVkaWF0ZWx5IHNlbmQgZGF0YSwgZXZlbiBpZiBpdCdzIHBhcnRpYWw6CisKKyAgICBpbnQgc3RhdGUgPSAxOworICAgIHNldHNvY2tvcHQoZmQsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgJnN0YXRlLCBzaXplb2Yoc3RhdGUpKTsKZGlmZiAtLWdpdCBhL2RvY3MvdW5pY29kZS50eHQgYi9kb2NzL3VuaWNvZGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMTU5Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3VuaWNvZGUudHh0CkBAIC0wLDAgKzEsNzEgQEAKKwlVbmljb2RlIHN1cHBvcnQgaW4gYnVzeWJveAorCitUaGVyZSBhcmUgc2V2ZXJhbCBzY2VuYXJpb3Mgd2hlcmUgd2UgbmVlZCB0byBoYW5kbGUgdW5pY29kZQorY29ycmVjdGx5LgorCisJU2hlbGwgaW5wdXQKKworV2Ugd2FudCB0byBjb3JyZWN0bHkgaGFuZGxlIGlucHV0IG9mIHVuaWNvZGUgY2hhcmFjdGVycy4KK1RoZXJlIGFyZSBzZXZlcmFsIHByb2JsZW1zIHdpdGggaXQuIEp1c3QgaGFuZGxpbmcgaW5wdXQKK2FzIHNlcXVlbmNlIG9mIGJ5dGVzIHdvdWxkIGJyZWFrIGFueSBlZGl0aW5nLiBUaGlzIHdhcyBmaXhlZAorYW5kIG5vdyBsaW5lZWRpdCBvcGVyYXRlcyBvbiB0aGUgYXJyYXkgb2Ygd2NoYXJfdCdzLgorQnV0IHdlIGFsc28gbmVlZCB0byBoYW5kbGUgdGhlIGZvbGxvd2luZyBwcm9ibGVtYXRpYyBtb21lbnRzOgorCisqIEl0IGlzIHVucmVhc29uYWJsZSB0byBleHBlY3QgdGhhdCBvdXRwdXQgZGV2aWNlIHN1cHBvcnRzCisgIF9hbnlfIHVuaWNvZGUgY2hhcnMuIFBlcmhhcHMgd2UgbmVlZCB0byBhdm9pZCBwcmludGluZworICB0aG9zZSBjaGFycyB3aGljaCBhcmUgbm90IHN1cHBvcnRlZCBieSBvdXRwdXQgZGV2aWNlLgorICBFeGFtcGxlczogY2hhcnMgd2hpY2ggYXJlIG5vdCBwcmVzZW50IGluIHRoZSBmb250LAorICBjaGFycyB3aGljaCBhcmUgbm90IGFzc2lnbmVkIGluIHVuaWNvZGUsCisgIGNvbWJpbmluZyBjaGFycyAoZXNwZWNpYWxseSB0cnlpbmcgdG8gY29tYmluZSBiYWQgcGFpcnM6CisgIGFfY2hpbmVzZV9zeW1ib2wgKyAiY29tYmluaW5nIGdyYXZlIGFjY2VudCIgPSA/PyEpCisKKyogV2UgbmVlZCB0byBhY2NvdW50IGZvciB0aGUgZmFjdCB0aGF0IHVuaWNvZGUgY2hhcnMgaGF2ZQorICBkaWZmZXJlbnQgd2lkdGhzOiAwIGZvciBjb21iaW5pbmcgY2hhcnMsIDEgZm9yIHVzdWFsLAorICAyIGZvciBpZGVvZ3JhbXMgKGFyZSB0aGVyZSAzKyB3aWRlIGNoYXJzPykuCisKKyogQmlkaXJlY3Rpb25hbCBoYW5kbGluZy4gSWYgdXNlciB3YW50cyB0byBlY2hvIGEgcGhyYXNlCisgIGluIEhlYnJldywgaGUgdHlwZXM6IGVjaG8gInNyZXR0ZWwgd2VyYmVIIgorCisJRWRpdG9ycyAodmksIGVkKQorCitUaGlzIGNhc2UgaXMgYSBiaXQgc2ltaWxhciB0byAic2hlbGwgaW5wdXQiLCBidXQgdW5saWtlIHNoZWxsLAorZWRpdG9ycyBtYXkgZW5jb3VudGVyIG1hbnkgbW9yZSB1bmV4cGVjdGVkIHVuaWNvZGUgc2VxdWVuY2VzCisodHJ5IHRvIGxvYWQgYSByYW5kb20gYmluYXJ5IGZpbGUuLi4pLCBhbmQgdGhleSBuZWVkIHRvIHByZXNlcnZlCit0aGVtLCB1bmxpa2Ugc2hlbGwgd2hpY2ggY2FuIGFmZm9yZCB0byBkcm9wIGJvZ3VzIGlucHV0LgorCisJbW9yZSwgbGVzcworCitOZWVkIHRvIGNvcnJlY3RseSBkaXNwbGF5IGFueSBpbnB1dCBmaWxlLiBJZGVhbGx5LCB3aXRoCitBU0NJSS91bmljb2RlL2ZpbHRlcmVkX3VuaWNvZGUgb3B0aW9uIG9yIGtleWJvYXJkIHN3aXRjaC4KK05vdGU6IG5lZWQgdG8gaGFuZGxlIHRhYnMgYW5kIGJhY2tzcGFjZXMgc3BlY2lhbGx5CisoYmtzcCBpcyBmb3IgbWFucGFnZSBjb21wYXQpLgorCisJY3V0LCBmb2xkLCB3YXRjaAorCitNYXkgbmVlZCBhYmlsaXR5IHRvIGN1dCB1bmljb2RlIHN0cmluZyB0byBzcGVjaWZpZWQgbnVtYmVyIG9mIHdjaGFycworYW5kL29yIHRvIHNwZWNpZmllZCBzY3JlZW4gd2lkdGguIE5lZWQgdG8gaGFuZGxlIHRhYnMgc3BlY2lhbGx5LgorCisJc2VkLCBhd2ssIGdyZXAKKworSGFuZGxlIHVuaWNvZGUtYXdhcmUgcmVnZXhwIG1hdGNoCisKKwlscyAobXVsdGktY29sdW1uIGRpc3BsYXkpCisKK2xzIHdpbGwgZmFpbCB0byBsaW5lIHVwIGNvbHVtbmFyIG91dHB1dCBpZiBpdCB3aWxsIG5vdCBhY2NvdW50Citmb3IgY2hhcmFjdGVyIHdpZHRocyAoYW5kIG1heWJlIGZpbHRlciBvdXQgc29tZSBvZiB0aGVtLCBzZWUKK2Fib3ZlKS4gT1RPSCwgbm9uLWNvbHVtbmFyIHZpZXdzIChscyAtMSwgbHMgLWwsIGxzIHwgY2FyKQorc2hvdWxkIE5PVCBmaWx0ZXIgb3V0IGJhZCB1bmljb2RlIChidXQgbmVlZCB0byBmaWx0ZXIgb3V0Citjb250cm9sIGNoYXJzIChjb3JldXRpbHMgZG9lcyB0aGF0KS4gTm90ZSB0aGF0IHVubGlrZSBtb3JlL2xlc3MsCit0YWJzIGFuZCBiYWNrc3BhY2VzIG5lZWQgbm90IHNwZWNpYWwgaGFuZGxpbmcuCisKKwl0b3AsIHBzCisKK05lZWQgdG8gcGVyZm9ybSBmaWx0ZXJpbmcgc2ltaWxhciB0byBscy4KKworCUZpbGVuYW1lIGRpc3BsYXkgKGluIGVycm9yIG1lc3NhZ2VzIGFuZCBlbHNld2hlcmUpCisKK05lZWQgdG8gcGVyZm9ybSBmaWx0ZXJpbmcgc2ltaWxhciB0byBscy4KKworCitUT0RPOiB3cml0ZSBhbiBlbWFpbCB0byBBc211cyBGcmV5dGFnIChhc211c0B1bmljb2RlLm9yZyksCithdXRob3Igb2YgaHR0cDovL3VuaWNvZGUub3JnL3JlcG9ydHMvdHIxMS8KZGlmZiAtLWdpdCBhL2RvY3MvdW5pY29kZV9VVEYtOC10ZXN0LnR4dCBiL2RvY3MvdW5pY29kZV9VVEYtOC10ZXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmQxNmY3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy91bmljb2RlX1VURi04LXRlc3QudHh0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3MvdW5pY29kZV9mdWxsLWJtcC50eHQgYi9kb2NzL3VuaWNvZGVfZnVsbC1ibXAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZWFhMWUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3VuaWNvZGVfZnVsbC1ibXAudHh0CkBAIC0wLDAgKzEsMjA3OSBAQAorCitGdWxsIEJNUCBUZXN0IEZpbGUKKy0tLS0tLS0tLS0tLS0tLS0tLQorCitNYXJrdXMgS3VobiA8aHR0cDovL3d3dy5jbC5jYW0uYWMudWsvfm1nazI1Lz4gLS0gMjAwMy0wNC0yMgorCitUaGlzIGZpbGUgY29udGFpbnMgdGhlIFVURi04IHNlcXVlbmNlcyBvZiBhbGwgY29kZSBwb3NpdGlvbnMgaW4gdGhlCitJU08gMTA2NDYtMSBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUsIGV4Y2VwdCBmb3IgdGhlIEMwIGFuZCBDMSBjb250cm9sCitjaGFyYWN0ZXIgYXJlYXMuIFRoaXMgY29ycmVzcG9uZHMgdG8gYWxsIGNvZGVzIGluIHRoZSByYW5nZSBVKzAwMjAgLQorVSswMDdFIGFuZCBVKzAwQTAgLSBVK0ZGRkYuIFt1bmlzZXQgKzAwMDAuLmZmZmYgdXRmOC1saXN0XQorCisKK0Jhc2ljIExhdGluIChVKzAwMDAtVSswMDdGKToKKworICEiIyQlJicoKSorLC0uLzAxMjM0NTY3ODk6Ozw9Pj9AQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVpbXF1eXworYGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6e3x9fgorCitMYXRpbi0xIFN1cHBsZW1lbnQgKFUrMDA4MC1VKzAwRkYpOgorCivCoMKhwqLCo8KkwqXCpsKnwqjCqcKqwqvCrMKtwq7Cr8KwwrHCssKzwrTCtcK2wrfCuMK5wrrCu8K8wr3CvsK/w4DDgcOCw4PDhMOFw4bDh8OIw4nDisOLw4zDjcOOw4/DkMORw5LDk8OUw5XDlsOXw5jDmcOaw5vDnMOdw57Dnworw6DDocOiw6PDpMOlw6bDp8Oow6nDqsOrw6zDrcOuw6/DsMOxw7LDs8O0w7XDtsO3w7jDucO6w7vDvMO9w77DvworCitMYXRpbiBFeHRlbmRlZC1BIChVKzAxMDAtVSswMTdGKToKKworxIDEgcSCxIPEhMSFxIbEh8SIxInEisSLxIzEjcSOxI/EkMSRxJLEk8SUxJXElsSXxJjEmcSaxJvEnMSdxJ7En8SgxKHEosSjxKTEpcSmxKfEqMSpxKrEq8SsxK3ErsSvxLDEscSyxLPEtMS1xLbEt8S4xLnEusS7xLzEvcS+xL8KK8WAxYHFgsWDxYTFhcWGxYfFiMWJxYrFi8WMxY3FjsWPxZDFkcWSxZPFlMWVxZbFl8WYxZnFmsWbxZzFncWexZ/FoMWhxaLFo8WkxaXFpsWnxajFqcWqxavFrMWtxa7Fr8WwxbHFssWzxbTFtcW2xbfFuMW5xbrFu8W8xb3FvsW/CisKK0xhdGluIEV4dGVuZGVkLUIgKFUrMDE4MC1VKzAyNEYpOgorCivGgMaBxoLGg8aExoXGhsaHxojGicaKxovGjMaNxo7Gj8aQxpHGksaTxpTGlcaWxpfGmMaZxprGm8acxp3GnsafxqDGocaixqPGpMalxqbGp8aoxqnGqsarxqzGrcauxq/GsMaxxrLGs8a0xrXGtsa3xrjGuca6xrvGvMa9xr7Gvworx4DHgceCx4PHhMeFx4bHh8eIx4nHiseLx4zHjceOx4/HkMeRx5LHk8eUx5XHlseXx5jHmceax5vHnMedx57Hn8egx6HHosejx6THpcemx6fHqMepx6rHq8esx63Hrsevx7DHsceyx7PHtMe1x7bHt8e4x7nHuse7x7zHvce+x78KK8iAyIHIgsiDyITIhciGyIfIiMiJyIrIi8iMyI3IjsiPyJDIkciSyJPIlMiVyJbIl8iYyJnImsibyJzIncieyJ/IoMihyKLIo8ikyKXIpsinyKjIqciqyKvIrMityK7Ir8iwyLHIssizyLTItci2yLfIuMi5yLrIu8i8yL3Ivsi/CivJgMmByYLJg8mEyYXJhsmHyYjJicmKyYvJjMmNyY7JjworCitJUEEgRXh0ZW5zaW9ucyAoVSswMjUwLVUrMDJBRik6CisKK8mQyZHJksmTyZTJlcmWyZfJmMmZyZrJm8mcyZ3JnsmfyaDJocmiyaPJpMmlyabJp8moyanJqsmryazJrcmuya/JsMmxybLJs8m0ybXJtsm3ybjJucm6ybvJvMm9yb7Jv8qAyoHKgsqDyoTKhcqGyofKiMqJyorKi8qMyo3KjsqPCivKkMqRypLKk8qUypXKlsqXypjKmcqaypvKnMqdyp7Kn8qgyqHKosqjyqTKpcqmyqfKqMqpyqrKq8qsyq3KrsqvCisKK1NwYWNpbmcgTW9kaWZpZXIgTGV0dGVycyAoVSswMkIwLVUrMDJGRik6CisKK8qwyrHKssqzyrTKtcq2yrfKuMq5yrrKu8q8yr3Kvsq/y4DLgcuCy4PLhMuFy4bLh8uIy4nLisuLy4zLjcuOy4/LkMuRy5LLk8uUy5XLlsuXy5jLmcuay5vLnMudy57Ln8ugy6HLosujy6TLpcumy6fLqMupy6rLq8usy63LrsuvCivLsMuxy7LLs8u0y7XLtsu3y7jLucu6y7vLvMu9y77LvworCitDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MgKFUrMDMwMC1VKzAzNkYpOgorCivil4zMgOKXjMyB4peMzILil4zMg+KXjMyE4peMzIXil4zMhuKXjMyH4peMzIjil4zMieKXjMyK4peMzIvil4zMjOKXjMyN4peMzI7il4zMj+KXjMyQ4peMzJHil4zMkuKXjMyT4peMzJTil4zMleKXjMyW4peMzJfil4zMmOKXjMyZ4peMzJril4zMm+KXjMyc4peMzJ3il4zMnuKXjMyf4peMzKDil4zMoeKXjMyi4peMzKPil4zMpOKXjMyl4peMzKbil4zMp+KXjMyo4peMzKnil4zMquKXjMyr4peMzKzil4zMreKXjMyu4peMzK/il4zMsOKXjMyx4peMzLLil4zMs+KXjMy04peMzLXil4zMtuKXjMy34peMzLjil4zMueKXjMy64peMzLvil4zMvOKXjMy94peMzL7il4zMvwor4peMzYDil4zNgeKXjM2C4peMzYPil4zNhOKXjM2F4peMzYbil4zNh+KXjM2I4peMzYnil4zNiuKXjM2L4peMzYzil4zNjeKXjM2O4peMzY/NkM2RzZLNk82UzZXNls2XzZjNmc2azZvNnM2dzZ7Nn+KXjM2g4peMzaHil4zNouKXjM2j4peMzaTil4zNpeKXjM2m4peMzafil4zNqOKXjM2p4peMzaril4zNq+KXjM2s4peMza3il4zNruKXjM2vCisKK0dyZWVrIGFuZCBDb3B0aWMgKFUrMDM3MC1VKzAzRkYpOgorCivNsM2xzbLNs820zbXNts23zbjNuc26zbvNvM29zb7Nv86AzoHOgs6DzoTOhc6GzofOiM6JzorOi86Mzo3Ojs6PzpDOkc6SzpPOlM6VzpbOl86YzpnOms6bzpzOnc6ezp/OoM6hzqLOo86kzqXOps6nzqjOqc6qzqvOrM6tzq7OrworzrDOsc6yzrPOtM61zrbOt864zrnOus67zrzOvc6+zr/PgM+Bz4LPg8+Ez4XPhs+Hz4jPic+Kz4vPjM+Nz47Pj8+Qz5HPks+Tz5TPlc+Wz5fPmM+Zz5rPm8+cz53Pns+fz6DPoc+iz6PPpM+lz6bPp8+oz6nPqs+rz6zPrc+uz68KK8+wz7HPss+zz7TPtc+2z7fPuM+5z7rPu8+8z73Pvs+/CisKK0N5cmlsbGljIChVKzA0MDAtVSswNEZGKToKKwor0IDQgdCC0IPQhNCF0IbQh9CI0InQitCL0IzQjdCO0I/QkNCR0JLQk9CU0JXQltCX0JjQmdCa0JvQnNCd0J7Qn9Cg0KHQotCj0KTQpdCm0KfQqNCp0KrQq9Cs0K3QrtCv0LDQsdCy0LPQtNC10LbQt9C40LnQutC70LzQvdC+0L8KK9GA0YHRgtGD0YTRhdGG0YfRiNGJ0YrRi9GM0Y3RjtGP0ZDRkdGS0ZPRlNGV0ZbRl9GY0ZnRmtGb0ZzRndGe0Z/RoNGh0aLRo9Gk0aXRptGn0ajRqdGq0avRrNGt0a7Rr9Gw0bHRstGz0bTRtdG20bfRuNG50brRu9G80b3RvtG/CivSgNKB0oLil4zSg+KXjNKE4peM0oXil4zShtKHINKIINKJ0orSi9KM0o3SjtKP0pDSkdKS0pPSlNKV0pbSl9KY0pnSmtKb0pzSndKe0p/SoNKh0qLSo9Kk0qXSptKn0qjSqdKq0qvSrNKt0q7Sr9Kw0rHSstKz0rTStdK20rfSuNK50rrSu9K80r3SvtK/CivTgNOB04LTg9OE04XThtOH04jTidOK04vTjNON047Tj9OQ05HTktOT05TTldOW05fTmNOZ05rTm9Oc053TntOf06DTodOi06PTpNOl06bTp9Oo06nTqtOr06zTrdOu06/TsNOx07LTs9O007XTttO307jTudO607vTvNO9077TvworCitDeXJpbGxpYyBTdXBwbGVtZW50YXJ5IChVKzA1MDAtVSswNTJGKToKKwor1IDUgdSC1IPUhNSF1IbUh9SI1InUitSL1IzUjdSO1I/UkNSR1JLUk9SU1JXUltSX1JjUmdSa1JvUnNSd1J7Un9Sg1KHUotSj1KTUpdSm1KfUqNSp1KrUq9Ss1K3UrtSvCisKK0FybWVuaWFuIChVKzA1MzAtVSswNThGKToKKwor1LDUsdSy1LPUtNS11LbUt9S41LnUutS71LzUvdS+1L/VgNWB1YLVg9WE1YXVhtWH1YjVidWK1YvVjNWN1Y7Vj9WQ1ZHVktWT1ZTVldWW1ZfVmNWZ1ZrVm9Wc1Z3VntWf1aDVodWi1aPVpNWl1abVp9Wo1anVqtWr1azVrdWu1a8KK9Ww1bHVstWz1bTVtdW21bfVuNW51brVu9W81b3VvtW/1oDWgdaC1oPWhNaF1obWh9aI1onWitaL1ozWjdaO1o8KKworSGVicmV3IChVKzA1OTAtVSswNUZGKToKKwor1pDil4zWkeKXjNaS4peM1pPil4zWlOKXjNaV4peM1pbil4zWl+KXjNaY4peM1pnil4zWmuKXjNab4peM1pzil4zWneKXjNae4peM1p/il4zWoOKXjNah1qLil4zWo+KXjNak4peM1qXil4zWpuKXjNan4peM1qjil4zWqeKXjNaq4peM1qvil4zWrOKXjNat4peM1q7il4zWr+KXjNaw4peM1rHil4zWsuKXjNaz4peM1rTil4zWteKXjNa24peM1rfil4zWuOKXjNa51rril4zWu+KXjNa84peM1r3WvuKXjNa/14Dil4zXgeKXjNeC14Pil4zXhNeF14bXh9eI14nXiteL14zXjdeO148KK9eQ15HXkteT15TXldeW15fXmNeZ15rXm9ec153Xntef16DXodei16PXpNel16bXp9eo16nXqter16zXrdeu16/XsNex17LXs9e017XXtte317jXude617vXvNe9177XvworCitBcmFiaWMgKFUrMDYwMC1VKzA2RkYpOgorCivYgNiB2ILYg9iE2IXYhtiH2IjYidiK2IvYjNiN2I7Yj9iQ2JHYktiT2JTYldiW2JfYmNiZ2JrYm9ic2J3Yntif2KDYodii2KPYpNil2KbYp9io2KnYqtir2KzYrdiu2K/YsNix2LLYs9i02LXYtti32LjYudi62LvYvNi92L7Yvwor2YDZgdmC2YPZhNmF2YbZh9mI2YnZiuKXjNmL4peM2Yzil4zZjeKXjNmO4peM2Y/il4zZkOKXjNmR4peM2ZLil4zZk+KXjNmU4peM2ZXZltmX2ZjZmdma2ZvZnNmd2Z7Zn9mg2aHZotmj2aTZpdmm2afZqNmp2arZq9ms2a3Zrtmv4peM2bDZsdmy2bPZtNm12bbZt9m42bnZutm72bzZvdm+2b8KK9qA2oHagtqD2oTahdqG2ofaiNqJ2orai9qM2o3ajtqP2pDakdqS2pPalNqV2pbal9qY2pnamtqb2pzandqe2p/aoNqh2qLao9qk2qXaptqn2qjaqdqq2qvarNqt2q7ar9qw2rHastqz2rTatdq22rfauNq52rrau9q82r3avtq/CivbgNuB24Lbg9uE24XbhtuH24jbiduK24vbjNuN247bj9uQ25HbktuT25TbleKXjNuW4peM25fil4zbmOKXjNuZ4peM25ril4zbm+KXjNuc250g257il4zbn+KXjNug4peM26Hil4zbouKXjNuj4peM26Tbpdum4peM26fil4zbqNup4peM26ril4zbq+KXjNus4peM263brtuv27Dbsduy27PbtNu127bbt9u427nbutu727zbvdu+278KKworU3lyaWFjIChVKzA3MDAtVSswNzRGKToKKwor3IDcgdyC3IPchNyF3Ibch9yI3IncityL3IzcjdyO3I/ckOKXjNyR3JLck9yU3JXcltyX3Jjcmdya3JvcnNyd3J7cn9yg3KHcotyj3KTcpdym3KfcqNyp3Krcq9ys3K3crtyv4peM3LDil4zcseKXjNyy4peM3LPil4zctOKXjNy14peM3Lbil4zct+KXjNy44peM3Lnil4zcuuKXjNy74peM3Lzil4zcveKXjNy+4peM3L8KK+KXjN2A4peM3YHil4zdguKXjN2D4peM3YTil4zdheKXjN2G4peM3Yfil4zdiOKXjN2J4peM3Yrdi92M3Y3djt2PCisKK0ZyZWUgYmxvY2sgKFUrMDc1MC1VKzA3N0YpOgorCivdkN2R3ZLdk92U3ZXdlt2X3Zjdmd2a3ZvdnN2d3Z7dn92g3aHdot2j3aTdpd2m3afdqN2p3ardq92s3a3drt2v3bDdsd2y3bPdtN213bbdt9243bndut273bzdvd2+3b8KKworVGhhYW5hIChVKzA3ODAtVSswN0JGKToKKwor3oDegd6C3oPehN6F3obeh96I3oneit6L3ozejd6O3o/ekN6R3pLek96U3pXelt6X3pjemd6a3pvenN6d3p7en96g3qHeot6j3qTepeKXjN6m4peM3qfil4zeqOKXjN6p4peM3qril4zeq+KXjN6s4peM3q3il4zeruKXjN6v4peM3rDesd6y3rPetN613rbet9643rneut673rzevd6+3r8KKworRnJlZSBibG9jayAoVSswN0MwLVUrMDhGRik6CisKK9+A34Hfgt+D34Tfhd+G34ffiN+J34rfi9+M343fjt+P35Dfkd+S35PflN+V35bfl9+Y35nfmt+b35zfnd+e35/foN+h36Lfo9+k36Xfpt+n36jfqd+q36vfrN+t367fr9+w37Hfst+z37Tftd+237ffuN+537rfu9+8373fvt+/CivgoIDgoIHgoILgoIPgoITgoIXgoIbgoIfgoIjgoIngoIrgoIvgoIzgoI3goI7goI/goJDgoJHgoJLgoJPgoJTgoJXgoJbgoJfgoJjgoJngoJrgoJvgoJzgoJ3goJ7goJ/goKDgoKHgoKLgoKPgoKTgoKXgoKbgoKfgoKjgoKngoKrgoKvgoKzgoK3goK7goK/goLDgoLHgoLLgoLPgoLTgoLXgoLbgoLfgoLjgoLngoLrgoLvgoLzgoL3goL7goL8KK+ChgOChgeChguChg+ChhOChheChhuChh+ChiOChieChiuChi+ChjOChjeChjuChj+ChkOChkeChkuChk+ChlOChleChluChl+ChmOChmeChmuChm+ChnOChneChnuChn+ChoOChoeChouCho+ChpOChpeChpuChp+ChqOChqeChquChq+ChrOChreChruChr+ChsOChseChsuChs+ChtOChteChtuCht+ChuOChueChuuChu+ChvOChveChvuChvwor4KKA4KKB4KKC4KKD4KKE4KKF4KKG4KKH4KKI4KKJ4KKK4KKL4KKM4KKN4KKO4KKP4KKQ4KKR4KKS4KKT4KKU4KKV4KKW4KKX4KKY4KKZ4KKa4KKb4KKc4KKd4KKe4KKf4KKg4KKh4KKi4KKj4KKk4KKl4KKm4KKn4KKo4KKp4KKq4KKr4KKs4KKt4KKu4KKv4KKw4KKx4KKy4KKz4KK04KK14KK24KK34KK44KK54KK64KK74KK84KK94KK+4KK/Civgo4Dgo4Hgo4Lgo4Pgo4Tgo4Xgo4bgo4fgo4jgo4ngo4rgo4vgo4zgo43go47go4/go5Dgo5Hgo5Lgo5Pgo5Tgo5Xgo5bgo5fgo5jgo5ngo5rgo5vgo5zgo53go57go5/go6Dgo6Hgo6Lgo6Pgo6Tgo6Xgo6bgo6fgo6jgo6ngo6rgo6vgo6zgo63go67go6/go7Dgo7Hgo7Lgo7Pgo7Tgo7Xgo7bgo7fgo7jgo7ngo7rgo7vgo7zgo73go77go78KKworRGV2YW5hZ2FyaSAoVSswOTAwLVUrMDk3Rik6CisKK+CkgOKXjOCkgeKXjOCkguCkg+CkhOCkheCkhuCkh+CkiOCkieCkiuCki+CkjOCkjeCkjuCkj+CkkOCkkeCkkuCkk+CklOCkleCkluCkl+CkmOCkmeCkmuCkm+CknOCkneCknuCkn+CkoOCkoeCkouCko+CkpOCkpeCkpuCkp+CkqOCkqeCkquCkq+CkrOCkreCkruCkr+CksOCkseCksuCks+CktOCkteCktuCkt+CkuOCkueCkuuCku+KXjOCkvOCkveCkvuCkvwor4KWA4peM4KWB4peM4KWC4peM4KWD4peM4KWE4peM4KWF4peM4KWG4peM4KWH4peM4KWI4KWJ4KWK4KWL4KWM4peM4KWN4KWO4KWP4KWQ4peM4KWR4peM4KWS4peM4KWT4peM4KWU4KWV4KWW4KWX4KWY4KWZ4KWa4KWb4KWc4KWd4KWe4KWf4KWg4KWh4peM4KWi4peM4KWj4KWk4KWl4KWm4KWn4KWo4KWp4KWq4KWr4KWs4KWt4KWu4KWv4KWw4KWx4KWy4KWz4KW04KW14KW24KW34KW44KW54KW64KW74KW84KW94KW+4KW/CisKK0JlbmdhbGkgKFUrMDk4MC1VKzA5RkYpOgorCivgpoDil4zgpoHgpoLgpoPgpoTgpoXgpobgpofgpojgpongporgpovgpozgpo3gpo7gpo/gppDgppHgppLgppPgppTgppXgppbgppfgppjgppngpprgppvgppzgpp3gpp7gpp/gpqDgpqHgpqLgpqPgpqTgpqXgpqbgpqfgpqjgpqngpqrgpqvgpqzgpq3gpq7gpq/gprDgprHgprLgprPgprTgprXgprbgprfgprjgprngprrgprvil4zgprzgpr3gpr7gpr8KK+CngOKXjOCngeKXjOCnguKXjOCng+KXjOCnhOCnheCnhuCnh+CniOCnieCniuCni+CnjOKXjOCnjeCnjuCnj+CnkOCnkeCnkuCnk+CnlOCnleCnluCnl+CnmOCnmeCnmuCnm+CnnOCnneCnnuCnn+CnoOCnoeKXjOCnouKXjOCno+CnpOCnpeCnpuCnp+CnqOCnqeCnquCnq+CnrOCnreCnruCnr+CnsOCnseCnsuCns+CntOCnteCntuCnt+CnuOCnueCnuuCnu+CnvOCnveCnvuCnvworCitHdXJtdWtoaSAoVSswQTAwLVUrMEE3Rik6CisKK+CogOCogeKXjOCoguCog+CohOCoheCohuCoh+CoiOCoieCoiuCoi+CojOCojeCojuCoj+CokOCokeCokuCok+ColOColeColuCol+ComOComeComuCom+ConOConeConuCon+CooOCooeCoouCoo+CopOCopeCopuCop+CoqOCoqeCoquCoq+CorOCoreCoruCor+CosOCoseCosuCos+CotOCoteCotuCot+CouOCoueCouuCou+KXjOCovOCoveCovuCovwor4KmA4peM4KmB4peM4KmC4KmD4KmE4KmF4KmG4peM4KmH4peM4KmI4KmJ4KmK4peM4KmL4peM4KmM4peM4KmN4KmO4KmP4KmQ4KmR4KmS4KmT4KmU4KmV4KmW4KmX4KmY4KmZ4Kma4Kmb4Kmc4Kmd4Kme4Kmf4Kmg4Kmh4Kmi4Kmj4Kmk4Kml4Kmm4Kmn4Kmo4Kmp4Kmq4Kmr4Kms4Kmt4Kmu4Kmv4peM4Kmw4peM4Kmx4Kmy4Kmz4Km04Km14Km24Km34Km44Km54Km64Km74Km84Km94Km+4Km/CisKK0d1amFyYXRpIChVKzBBODAtVSswQUZGKToKKwor4KqA4peM4KqB4peM4KqC4KqD4KqE4KqF4KqG4KqH4KqI4KqJ4KqK4KqL4KqM4KqN4KqO4KqP4KqQ4KqR4KqS4KqT4KqU4KqV4KqW4KqX4KqY4KqZ4Kqa4Kqb4Kqc4Kqd4Kqe4Kqf4Kqg4Kqh4Kqi4Kqj4Kqk4Kql4Kqm4Kqn4Kqo4Kqp4Kqq4Kqr4Kqs4Kqt4Kqu4Kqv4Kqw4Kqx4Kqy4Kqz4Kq04Kq14Kq24Kq34Kq44Kq54Kq64Kq74peM4Kq84Kq94Kq+4Kq/Civgq4Dil4zgq4Hil4zgq4Lil4zgq4Pil4zgq4Til4zgq4Xgq4bil4zgq4fil4zgq4jgq4ngq4rgq4vgq4zil4zgq43gq47gq4/gq5Dgq5Hgq5Lgq5Pgq5Tgq5Xgq5bgq5fgq5jgq5ngq5rgq5vgq5zgq53gq57gq5/gq6Dgq6Hgq6Lgq6Pgq6Tgq6Xgq6bgq6fgq6jgq6ngq6rgq6vgq6zgq63gq67gq6/gq7Dgq7Hgq7Lgq7Pgq7Tgq7Xgq7bgq7fgq7jgq7ngq7rgq7vgq7zgq73gq77gq78KKworT3JpeWEgKFUrMEIwMC1VKzBCN0YpOgorCivgrIDil4zgrIHgrILgrIPgrITgrIXgrIbgrIfgrIjgrIngrIrgrIvgrIzgrI3grI7grI/grJDgrJHgrJLgrJPgrJTgrJXgrJbgrJfgrJjgrJngrJrgrJvgrJzgrJ3grJ7grJ/grKDgrKHgrKLgrKPgrKTgrKXgrKbgrKfgrKjgrKngrKrgrKvgrKzgrK3grK7grK/grLDgrLHgrLLgrLPgrLTgrLXgrLbgrLfgrLjgrLngrLrgrLvil4zgrLzgrL3grL7il4zgrL8KK+CtgOKXjOCtgeKXjOCtguKXjOCtg+CthOCtheCthuCth+CtiOCtieCtiuCti+CtjOKXjOCtjeCtjuCtj+CtkOCtkeCtkuCtk+CtlOCtleKXjOCtluCtl+CtmOCtmeCtmuCtm+CtnOCtneCtnuCtn+CtoOCtoeCtouCto+CtpOCtpeCtpuCtp+CtqOCtqeCtquCtq+CtrOCtreCtruCtr+CtsOCtseCtsuCts+CttOCtteCttuCtt+CtuOCtueCtuuCtu+CtvOCtveCtvuCtvworCitUYW1pbCAoVSswQjgwLVUrMEJGRik6CisKK+CugOCugeKXjOCuguCug+CuhOCuheCuhuCuh+CuiOCuieCuiuCui+CujOCujeCujuCuj+CukOCukeCukuCuk+CulOCuleCuluCul+CumOCumeCumuCum+CunOCuneCunuCun+CuoOCuoeCuouCuo+CupOCupeCupuCup+CuqOCuqeCuquCuq+CurOCureCuruCur+CusOCuseCusuCus+CutOCuteCutuCut+CuuOCuueCuuuCuu+CuvOCuveCuvuCuvwor4peM4K+A4K+B4K+C4K+D4K+E4K+F4K+G4K+H4K+I4K+J4K+K4K+L4K+M4peM4K+N4K+O4K+P4K+Q4K+R4K+S4K+T4K+U4K+V4K+W4K+X4K+Y4K+Z4K+a4K+b4K+c4K+d4K+e4K+f4K+g4K+h4K+i4K+j4K+k4K+l4K+m4K+n4K+o4K+p4K+q4K+r4K+s4K+t4K+u4K+v4K+w4K+x4K+y4K+z4K+04K+14K+24K+34K+44K+54K+64K+74K+84K+94K++4K+/CisKK1RlbHVndSAoVSswQzAwLVUrMEM3Rik6CisKK+CwgOCwgeCwguCwg+CwhOCwheCwhuCwh+CwiOCwieCwiuCwi+CwjOCwjeCwjuCwj+CwkOCwkeCwkuCwk+CwlOCwleCwluCwl+CwmOCwmeCwmuCwm+CwnOCwneCwnuCwn+CwoOCwoeCwouCwo+CwpOCwpeCwpuCwp+CwqOCwqeCwquCwq+CwrOCwreCwruCwr+CwsOCwseCwsuCws+CwtOCwteCwtuCwt+CwuOCwueCwuuCwu+CwvOCwveKXjOCwvuKXjOCwvwor4peM4LGA4LGB4LGC4LGD4LGE4LGF4peM4LGG4peM4LGH4peM4LGI4LGJ4peM4LGK4peM4LGL4peM4LGM4peM4LGN4LGO4LGP4LGQ4LGR4LGS4LGT4LGU4peM4LGV4peM4LGW4LGX4LGY4LGZ4LGa4LGb4LGc4LGd4LGe4LGf4LGg4LGh4LGi4LGj4LGk4LGl4LGm4LGn4LGo4LGp4LGq4LGr4LGs4LGt4LGu4LGv4LGw4LGx4LGy4LGz4LG04LG14LG24LG34LG44LG54LG64LG74LG84LG94LG+4LG/CisKK0thbm5hZGEgKFUrMEM4MC1VKzBDRkYpOgorCivgsoDgsoHgsoLgsoPgsoTgsoXgsobgsofgsojgsongsorgsovgsozgso3gso7gso/gspDgspHgspLgspPgspTgspXgspbgspfgspjgspngsprgspvgspzgsp3gsp7gsp/gsqDgsqHgsqLgsqPgsqTgsqXgsqbgsqfgsqjgsqngsqrgsqvgsqzgsq3gsq7gsq/gsrDgsrHgsrLgsrPgsrTgsrXgsrbgsrfgsrjgsrngsrrgsrvgsrzgsr3gsr7il4zgsr8KK+CzgOCzgeCzguCzg+CzhOCzheKXjOCzhuCzh+CziOCzieCziuCzi+KXjOCzjOKXjOCzjeCzjuCzj+CzkOCzkeCzkuCzk+CzlOCzleCzluCzl+CzmOCzmeCzmuCzm+CznOCzneCznuCzn+CzoOCzoeCzouCzo+CzpOCzpeCzpuCzp+CzqOCzqeCzquCzq+CzrOCzreCzruCzr+CzsOCzseCzsuCzs+CztOCzteCztuCzt+CzuOCzueCzuuCzu+CzvOCzveCzvuCzvworCitNYWxheWFsYW0gKFUrMEQwMC1VKzBEN0YpOgorCivgtIDgtIHgtILgtIPgtITgtIXgtIbgtIfgtIjgtIngtIrgtIvgtIzgtI3gtI7gtI/gtJDgtJHgtJLgtJPgtJTgtJXgtJbgtJfgtJjgtJngtJrgtJvgtJzgtJ3gtJ7gtJ/gtKDgtKHgtKLgtKPgtKTgtKXgtKbgtKfgtKjgtKngtKrgtKvgtKzgtK3gtK7gtK/gtLDgtLHgtLLgtLPgtLTgtLXgtLbgtLfgtLjgtLngtLrgtLvgtLzgtL3gtL7gtL8KK+C1gOKXjOC1geKXjOC1guKXjOC1g+C1hOC1heC1huC1h+C1iOC1ieC1iuC1i+C1jOKXjOC1jeC1juC1j+C1kOC1keC1kuC1k+C1lOC1leC1luC1l+C1mOC1meC1muC1m+C1nOC1neC1nuC1n+C1oOC1oeC1ouC1o+C1pOC1peC1puC1p+C1qOC1qeC1quC1q+C1rOC1reC1ruC1r+C1sOC1seC1suC1s+C1tOC1teC1tuC1t+C1uOC1ueC1uuC1u+C1vOC1veC1vuC1vworCitTaW5oYWxhIChVKzBEODAtVSswREZGKToKKwor4LaA4LaB4LaC4LaD4LaE4LaF4LaG4LaH4LaI4LaJ4LaK4LaL4LaM4LaN4LaO4LaP4LaQ4LaR4LaS4LaT4LaU4LaV4LaW4LaX4LaY4LaZ4Laa4Lab4Lac4Lad4Lae4Laf4Lag4Lah4Lai4Laj4Lak4Lal4Lam4Lan4Lao4Lap4Laq4Lar4Las4Lat4Lau4Lav4Law4Lax4Lay4Laz4La04La14La24La34La44La54La64La74La84La94La+4La/Civgt4Dgt4Hgt4Lgt4Pgt4Tgt4Xgt4bgt4fgt4jgt4nil4zgt4rgt4vgt4zgt43gt47gt4/gt5Dgt5Hil4zgt5Lil4zgt5Pil4zgt5Tgt5Xil4zgt5bgt5fgt5jgt5ngt5rgt5vgt5zgt53gt57gt5/gt6Dgt6Hgt6Lgt6Pgt6Tgt6Xgt6bgt6fgt6jgt6ngt6rgt6vgt6zgt63gt67gt6/gt7Dgt7Hgt7Lgt7Pgt7Tgt7Xgt7bgt7fgt7jgt7ngt7rgt7vgt7zgt73gt77gt78KKworVGhhaSAoVSswRTAwLVUrMEU3Rik6CisKK+C4gOC4geC4guC4g+C4hOC4heC4huC4h+C4iOC4ieC4iuC4i+C4jOC4jeC4juC4j+C4kOC4keC4kuC4k+C4lOC4leC4luC4l+C4mOC4meC4muC4m+C4nOC4neC4nuC4n+C4oOC4oeC4ouC4o+C4pOC4peC4puC4p+C4qOC4qeC4quC4q+C4rOC4reC4ruC4r+C4sOKXjOC4seC4suC4s+KXjOC4tOKXjOC4teKXjOC4tuKXjOC4t+KXjOC4uOKXjOC4ueKXjOC4uuC4u+C4vOC4veC4vuC4vwor4LmA4LmB4LmC4LmD4LmE4LmF4LmG4peM4LmH4peM4LmI4peM4LmJ4peM4LmK4peM4LmL4peM4LmM4peM4LmN4peM4LmO4LmP4LmQ4LmR4LmS4LmT4LmU4LmV4LmW4LmX4LmY4LmZ4Lma4Lmb4Lmc4Lmd4Lme4Lmf4Lmg4Lmh4Lmi4Lmj4Lmk4Lml4Lmm4Lmn4Lmo4Lmp4Lmq4Lmr4Lms4Lmt4Lmu4Lmv4Lmw4Lmx4Lmy4Lmz4Lm04Lm14Lm24Lm34Lm44Lm54Lm64Lm74Lm84Lm94Lm+4Lm/CisKK0xhbyAoVSswRTgwLVUrMEVGRik6CisKK+C6gOC6geC6guC6g+C6hOC6heC6huC6h+C6iOC6ieC6iuC6i+C6jOC6jeC6juC6j+C6kOC6keC6kuC6k+C6lOC6leC6luC6l+C6mOC6meC6muC6m+C6nOC6neC6nuC6n+C6oOC6oeC6ouC6o+C6pOC6peC6puC6p+C6qOC6qeC6quC6q+C6rOC6reC6ruC6r+C6sOKXjOC6seC6suC6s+KXjOC6tOKXjOC6teKXjOC6tuKXjOC6t+KXjOC6uOKXjOC6ueC6uuKXjOC6u+KXjOC6vOC6veC6vuC6vwor4LuA4LuB4LuC4LuD4LuE4LuF4LuG4LuH4peM4LuI4peM4LuJ4peM4LuK4peM4LuL4peM4LuM4peM4LuN4LuO4LuP4LuQ4LuR4LuS4LuT4LuU4LuV4LuW4LuX4LuY4LuZ4Lua4Lub4Luc4Lud4Lue4Luf4Lug4Luh4Lui4Luj4Luk4Lul4Lum4Lun4Luo4Lup4Luq4Lur4Lus4Lut4Luu4Luv4Luw4Lux4Luy4Luz4Lu04Lu14Lu24Lu34Lu44Lu54Lu64Lu74Lu84Lu94Lu+4Lu/CisKK1RpYmV0YW4gKFUrMEYwMC1VKzBGRkYpOgorCivgvIDgvIHgvILgvIPgvITgvIXgvIbgvIfgvIjgvIngvIrgvIvgvIzgvI3gvI7gvI/gvJDgvJHgvJLgvJPgvJTgvJXgvJbgvJfil4zgvJjil4zgvJngvJrgvJvgvJzgvJ3gvJ7gvJ/gvKDgvKHgvKLgvKPgvKTgvKXgvKbgvKfgvKjgvKngvKrgvKvgvKzgvK3gvK7gvK/gvLDgvLHgvLLgvLPgvLTil4zgvLXgvLbil4zgvLfgvLjil4zgvLngvLrgvLvgvLzgvL3gvL7gvL8KK+C9gOC9geC9guC9g+C9hOC9heC9huC9h+C9iOC9ieC9iuC9i+C9jOC9jeC9juC9j+C9kOC9keC9kuC9k+C9lOC9leC9luC9l+C9mOC9meC9muC9m+C9nOC9neC9nuC9n+C9oOC9oeC9ouC9o+C9pOC9peC9puC9p+C9qOC9qeC9quC9q+C9rOC9reC9ruC9r+C9sOKXjOC9seKXjOC9suKXjOC9s+KXjOC9tOKXjOC9teKXjOC9tuKXjOC9t+KXjOC9uOKXjOC9ueKXjOC9uuKXjOC9u+KXjOC9vOKXjOC9veKXjOC9vuC9vwor4peM4L6A4peM4L6B4peM4L6C4peM4L6D4peM4L6E4L6F4peM4L6G4peM4L6H4L6I4L6J4L6K4L6L4L6M4L6N4L6O4L6P4peM4L6Q4peM4L6R4peM4L6S4peM4L6T4peM4L6U4peM4L6V4peM4L6W4peM4L6X4L6Y4peM4L6Z4peM4L6a4peM4L6b4peM4L6c4peM4L6d4peM4L6e4peM4L6f4peM4L6g4peM4L6h4peM4L6i4peM4L6j4peM4L6k4peM4L6l4peM4L6m4peM4L6n4peM4L6o4peM4L6p4peM4L6q4peM4L6r4peM4L6s4peM4L6t4peM4L6u4peM4L6v4peM4L6w4peM4L6x4peM4L6y4peM4L6z4peM4L604peM4L614peM4L624peM4L634peM4L644peM4L654peM4L664peM4L674peM4L684L694L6+4L6/Civgv4Dgv4Hgv4Lgv4Pgv4Tgv4Xil4zgv4bgv4fgv4jgv4ngv4rgv4vgv4zgv43gv47gv4/gv5Dgv5Hgv5Lgv5Pgv5Tgv5Xgv5bgv5fgv5jgv5ngv5rgv5vgv5zgv53gv57gv5/gv6Dgv6Hgv6Lgv6Pgv6Tgv6Xgv6bgv6fgv6jgv6ngv6rgv6vgv6zgv63gv67gv6/gv7Dgv7Hgv7Lgv7Pgv7Tgv7Xgv7bgv7fgv7jgv7ngv7rgv7vgv7zgv73gv77gv78KKworTXlhbm1hciAoVSsxMDAwLVUrMTA5Rik6CisKK+GAgOGAgeGAguGAg+GAhOGAheGAhuGAh+GAiOGAieGAiuGAi+GAjOGAjeGAjuGAj+GAkOGAkeGAkuGAk+GAlOGAleGAluGAl+GAmOGAmeGAmuGAm+GAnOGAneGAnuGAn+GAoOGAoeGAouGAo+GApOGApeGApuGAp+GAqOGAqeGAquGAq+GArOKXjOGAreKXjOGAruKXjOGAr+KXjOGAsOGAseKXjOGAsuGAs+GAtOGAteKXjOGAtuKXjOGAt+GAuOKXjOGAueGAuuGAu+GAvOGAveGAvuGAvwor4YGA4YGB4YGC4YGD4YGE4YGF4YGG4YGH4YGI4YGJ4YGK4YGL4YGM4YGN4YGO4YGP4YGQ4YGR4YGS4YGT4YGU4YGV4YGW4YGX4peM4YGY4peM4YGZ4YGa4YGb4YGc4YGd4YGe4YGf4YGg4YGh4YGi4YGj4YGk4YGl4YGm4YGn4YGo4YGp4YGq4YGr4YGs4YGt4YGu4YGv4YGw4YGx4YGy4YGz4YG04YG14YG24YG34YG44YG54YG64YG74YG84YG94YG+4YG/CivhgoDhgoHhgoLhgoPhgoThgoXhgobhgofhgojhgonhgorhgovhgozhgo3hgo7hgo/hgpDhgpHhgpLhgpPhgpThgpXhgpbhgpfhgpjhgpnhgprhgpvhgpzhgp3hgp7hgp8KKworR2VvcmdpYW4gKFUrMTBBMC1VKzEwRkYpOgorCivhgqDhgqHhgqLhgqPhgqThgqXhgqbhgqfhgqjhgqnhgqrhgqvhgqzhgq3hgq7hgq/hgrDhgrHhgrLhgrPhgrThgrXhgrbhgrfhgrjhgrnhgrrhgrvhgrzhgr3hgr7hgr/hg4Dhg4Hhg4Lhg4Phg4Thg4Xhg4bhg4fhg4jhg4nhg4rhg4vhg4zhg43hg47hg4/hg5Dhg5Hhg5Lhg5Phg5Thg5Xhg5bhg5fhg5jhg5nhg5rhg5vhg5zhg53hg57hg58KK+GDoOGDoeGDouGDo+GDpOGDpeGDpuGDp+GDqOGDqeGDquGDq+GDrOGDreGDruGDr+GDsOGDseGDsuGDs+GDtOGDteGDtuGDt+GDuOGDueGDuuGDu+GDvOGDveGDvuGDvworCitIYW5ndWwgSmFtbyAoVSsxMTAwLVUrMTFGRik6CisKK+GEgOGEgeGEguGEg+GEhOGEheGEhuGEh+GEiOGEieGEiuGEi+GEjOGEjeGEjuGEj+GEkOGEkeGEkuGEk+GElOGEleGEluGEl+GEmOGEmeGEmuGEm+GEnOGEneGEnuGEnwor4YSg4YSh4YSi4YSj4YSk4YSl4YSm4YSn4YSo4YSp4YSq4YSr4YSs4YSt4YSu4YSv4YSw4YSx4YSy4YSz4YS04YS14YS24YS34YS44YS54YS64YS74YS84YS94YS+4YS/CivhhYDhhYHhhYLhhYPhhYThhYXhhYbhhYfhhYjhhYnhhYrhhYvhhYzhhY3hhY7hhY/hhZDhhZHhhZLhhZPhhZThhZXhhZbhhZfhhZjhhZnhhZrhhZvhhZzhhZ3hhZ7hhZ8KK+GFoOGFoeGFouGFo+GFpOGFpeGFpuGFp+GFqOGFqeGFquGFq+GFrOGFreGFruGFr+GFsOGFseGFsuGFs+GFtOGFteGFtuGFt+GFuOGFueGFuuGFu+GFvOGFveGFvuGFv+GGgOGGgeGGguGGg+GGhOGGheGGhuGGh+GGiOGGieGGiuGGi+GGjOGGjeGGjuGGj+GGkOGGkeGGkuGGk+GGlOGGleGGluGGl+GGmOGGmeGGmuGGm+GGnOGGneGGnuGGnwor4Yag4Yah4Yai4Yaj4Yak4Yal4Yam4Yan4Yao4Yap4Yaq4Yar4Yas4Yat4Yau4Yav4Yaw4Yax4Yay4Yaz4Ya04Ya14Ya24Ya34Ya44Ya54Ya64Ya74Ya84Ya94Ya+4Ya/4YeA4YeB4YeC4YeD4YeE4YeF4YeG4YeH4YeI4YeJ4YeK4YeL4YeM4YeN4YeO4YeP4YeQ4YeR4YeS4YeT4YeU4YeV4YeW4YeX4YeY4YeZ4Yea4Yeb4Yec4Yed4Yee4YefCivhh6Dhh6Hhh6Lhh6Phh6Thh6Xhh6bhh6fhh6jhh6nhh6rhh6vhh6zhh63hh67hh6/hh7Dhh7Hhh7Lhh7Phh7Thh7Xhh7bhh7fhh7jhh7nhh7rhh7vhh7zhh73hh77hh78KKworRXRoaW9waWMgKFUrMTIwMC1VKzEzN0YpOgorCivhiIDhiIHhiILhiIPhiIThiIXhiIbhiIfhiIjhiInhiIrhiIvhiIzhiI3hiI7hiI/hiJDhiJHhiJLhiJPhiJThiJXhiJbhiJfhiJjhiJnhiJrhiJvhiJzhiJ3hiJ7hiJ/hiKDhiKHhiKLhiKPhiKThiKXhiKbhiKfhiKjhiKnhiKrhiKvhiKzhiK3hiK7hiK/hiLDhiLHhiLLhiLPhiLThiLXhiLbhiLfhiLjhiLnhiLrhiLvhiLzhiL3hiL7hiL8KK+GJgOGJgeGJguGJg+GJhOGJheGJhuGJh+GJiOGJieGJiuGJi+GJjOGJjeGJjuGJj+GJkOGJkeGJkuGJk+GJlOGJleGJluGJl+GJmOGJmeGJmuGJm+GJnOGJneGJnuGJn+GJoOGJoeGJouGJo+GJpOGJpeGJpuGJp+GJqOGJqeGJquGJq+GJrOGJreGJruGJr+GJsOGJseGJsuGJs+GJtOGJteGJtuGJt+GJuOGJueGJuuGJu+GJvOGJveGJvuGJvwor4YqA4YqB4YqC4YqD4YqE4YqF4YqG4YqH4YqI4YqJ4YqK4YqL4YqM4YqN4YqO4YqP4YqQ4YqR4YqS4YqT4YqU4YqV4YqW4YqX4YqY4YqZ4Yqa4Yqb4Yqc4Yqd4Yqe4Yqf4Yqg4Yqh4Yqi4Yqj4Yqk4Yql4Yqm4Yqn4Yqo4Yqp4Yqq4Yqr4Yqs4Yqt4Yqu4Yqv4Yqw4Yqx4Yqy4Yqz4Yq04Yq14Yq24Yq34Yq44Yq54Yq64Yq74Yq84Yq94Yq+4Yq/Civhi4Dhi4Hhi4Lhi4Phi4Thi4Xhi4bhi4fhi4jhi4nhi4rhi4vhi4zhi43hi47hi4/hi5Dhi5Hhi5Lhi5Phi5Thi5Xhi5bhi5fhi5jhi5nhi5rhi5vhi5zhi53hi57hi5/hi6Dhi6Hhi6Lhi6Phi6Thi6Xhi6bhi6fhi6jhi6nhi6rhi6vhi6zhi63hi67hi6/hi7Dhi7Hhi7Lhi7Phi7Thi7Xhi7bhi7fhi7jhi7nhi7rhi7vhi7zhi73hi77hi78KK+GMgOGMgeGMguGMg+GMhOGMheGMhuGMh+GMiOGMieGMiuGMi+GMjOGMjeGMjuGMj+GMkOGMkeGMkuGMk+GMlOGMleGMluGMl+GMmOGMmeGMmuGMm+GMnOGMneGMnuGMn+GMoOGMoeGMouGMo+GMpOGMpeGMpuGMp+GMqOGMqeGMquGMq+GMrOGMreGMruGMr+GMsOGMseGMsuGMs+GMtOGMteGMtuGMt+GMuOGMueGMuuGMu+GMvOGMveGMvuGMvwor4Y2A4Y2B4Y2C4Y2D4Y2E4Y2F4Y2G4Y2H4Y2I4Y2J4Y2K4Y2L4Y2M4Y2N4Y2O4Y2P4Y2Q4Y2R4Y2S4Y2T4Y2U4Y2V4Y2W4Y2X4Y2Y4Y2Z4Y2a4Y2b4Y2c4Y2d4Y2e4Y2f4Y2g4Y2h4Y2i4Y2j4Y2k4Y2l4Y2m4Y2n4Y2o4Y2p4Y2q4Y2r4Y2s4Y2t4Y2u4Y2v4Y2w4Y2x4Y2y4Y2z4Y204Y214Y224Y234Y244Y254Y264Y274Y284Y294Y2+4Y2/CisKK0ZyZWUgYmxvY2sgKFUrMTM4MC1VKzEzOUYpOgorCivhjoDhjoHhjoLhjoPhjoThjoXhjobhjofhjojhjonhjorhjovhjozhjo3hjo7hjo/hjpDhjpHhjpLhjpPhjpThjpXhjpbhjpfhjpjhjpnhjprhjpvhjpzhjp3hjp7hjp8KKworQ2hlcm9rZWUgKFUrMTNBMC1VKzEzRkYpOgorCivhjqDhjqHhjqLhjqPhjqThjqXhjqbhjqfhjqjhjqnhjqrhjqvhjqzhjq3hjq7hjq/hjrDhjrHhjrLhjrPhjrThjrXhjrbhjrfhjrjhjrnhjrrhjrvhjrzhjr3hjr7hjr/hj4Dhj4Hhj4Lhj4Phj4Thj4Xhj4bhj4fhj4jhj4nhj4rhj4vhj4zhj43hj47hj4/hj5Dhj5Hhj5Lhj5Phj5Thj5Xhj5bhj5fhj5jhj5nhj5rhj5vhj5zhj53hj57hj58KK+GPoOGPoeGPouGPo+GPpOGPpeGPpuGPp+GPqOGPqeGPquGPq+GPrOGPreGPruGPr+GPsOGPseGPsuGPs+GPtOGPteGPtuGPt+GPuOGPueGPuuGPu+GPvOGPveGPvuGPvworCitVbmlmaWVkIENhbmFkaWFuIEFib3JpZ2luYWwgU3lsbGFiaWNzIChVKzE0MDAtVSsxNjdGKToKKwor4ZCA4ZCB4ZCC4ZCD4ZCE4ZCF4ZCG4ZCH4ZCI4ZCJ4ZCK4ZCL4ZCM4ZCN4ZCO4ZCP4ZCQ4ZCR4ZCS4ZCT4ZCU4ZCV4ZCW4ZCX4ZCY4ZCZ4ZCa4ZCb4ZCc4ZCd4ZCe4ZCf4ZCg4ZCh4ZCi4ZCj4ZCk4ZCl4ZCm4ZCn4ZCo4ZCp4ZCq4ZCr4ZCs4ZCt4ZCu4ZCv4ZCw4ZCx4ZCy4ZCz4ZC04ZC14ZC24ZC34ZC44ZC54ZC64ZC74ZC84ZC94ZC+4ZC/CivhkYDhkYHhkYLhkYPhkYThkYXhkYbhkYfhkYjhkYnhkYrhkYvhkYzhkY3hkY7hkY/hkZDhkZHhkZLhkZPhkZThkZXhkZbhkZfhkZjhkZnhkZrhkZvhkZzhkZ3hkZ7hkZ/hkaDhkaHhkaLhkaPhkaThkaXhkabhkafhkajhkanhkarhkavhkazhka3hka7hka/hkbDhkbHhkbLhkbPhkbThkbXhkbbhkbfhkbjhkbnhkbrhkbvhkbzhkb3hkb7hkb8KK+GSgOGSgeGSguGSg+GShOGSheGShuGSh+GSiOGSieGSiuGSi+GSjOGSjeGSjuGSj+GSkOGSkeGSkuGSk+GSlOGSleGSluGSl+GSmOGSmeGSmuGSm+GSnOGSneGSnuGSn+GSoOGSoeGSouGSo+GSpOGSpeGSpuGSp+GSqOGSqeGSquGSq+GSrOGSreGSruGSr+GSsOGSseGSsuGSs+GStOGSteGStuGSt+GSuOGSueGSuuGSu+GSvOGSveGSvuGSvwor4ZOA4ZOB4ZOC4ZOD4ZOE4ZOF4ZOG4ZOH4ZOI4ZOJ4ZOK4ZOL4ZOM4ZON4ZOO4ZOP4ZOQ4ZOR4ZOS4ZOT4ZOU4ZOV4ZOW4ZOX4ZOY4ZOZ4ZOa4ZOb4ZOc4ZOd4ZOe4ZOf4ZOg4ZOh4ZOi4ZOj4ZOk4ZOl4ZOm4ZOn4ZOo4ZOp4ZOq4ZOr4ZOs4ZOt4ZOu4ZOv4ZOw4ZOx4ZOy4ZOz4ZO04ZO14ZO24ZO34ZO44ZO54ZO64ZO74ZO84ZO94ZO+4ZO/CivhlIDhlIHhlILhlIPhlIThlIXhlIbhlIfhlIjhlInhlIrhlIvhlIzhlI3hlI7hlI/hlJDhlJHhlJLhlJPhlJThlJXhlJbhlJfhlJjhlJnhlJrhlJvhlJzhlJ3hlJ7hlJ/hlKDhlKHhlKLhlKPhlKThlKXhlKbhlKfhlKjhlKnhlKrhlKvhlKzhlK3hlK7hlK/hlLDhlLHhlLLhlLPhlLThlLXhlLbhlLfhlLjhlLnhlLrhlLvhlLzhlL3hlL7hlL8KK+GVgOGVgeGVguGVg+GVhOGVheGVhuGVh+GViOGVieGViuGVi+GVjOGVjeGVjuGVj+GVkOGVkeGVkuGVk+GVlOGVleGVluGVl+GVmOGVmeGVmuGVm+GVnOGVneGVnuGVn+GVoOGVoeGVouGVo+GVpOGVpeGVpuGVp+GVqOGVqeGVquGVq+GVrOGVreGVruGVr+GVsOGVseGVsuGVs+GVtOGVteGVtuGVt+GVuOGVueGVuuGVu+GVvOGVveGVvuGVvwor4ZaA4ZaB4ZaC4ZaD4ZaE4ZaF4ZaG4ZaH4ZaI4ZaJ4ZaK4ZaL4ZaM4ZaN4ZaO4ZaP4ZaQ4ZaR4ZaS4ZaT4ZaU4ZaV4ZaW4ZaX4ZaY4ZaZ4Zaa4Zab4Zac4Zad4Zae4Zaf4Zag4Zah4Zai4Zaj4Zak4Zal4Zam4Zan4Zao4Zap4Zaq4Zar4Zas4Zat4Zau4Zav4Zaw4Zax4Zay4Zaz4Za04Za14Za24Za34Za44Za54Za64Za74Za84Za94Za+4Za/Civhl4Dhl4Hhl4Lhl4Phl4Thl4Xhl4bhl4fhl4jhl4nhl4rhl4vhl4zhl43hl47hl4/hl5Dhl5Hhl5Lhl5Phl5Thl5Xhl5bhl5fhl5jhl5nhl5rhl5vhl5zhl53hl57hl5/hl6Dhl6Hhl6Lhl6Phl6Thl6Xhl6bhl6fhl6jhl6nhl6rhl6vhl6zhl63hl67hl6/hl7Dhl7Hhl7Lhl7Phl7Thl7Xhl7bhl7fhl7jhl7nhl7rhl7vhl7zhl73hl77hl78KK+GYgOGYgeGYguGYg+GYhOGYheGYhuGYh+GYiOGYieGYiuGYi+GYjOGYjeGYjuGYj+GYkOGYkeGYkuGYk+GYlOGYleGYluGYl+GYmOGYmeGYmuGYm+GYnOGYneGYnuGYn+GYoOGYoeGYouGYo+GYpOGYpeGYpuGYp+GYqOGYqeGYquGYq+GYrOGYreGYruGYr+GYsOGYseGYsuGYs+GYtOGYteGYtuGYt+GYuOGYueGYuuGYu+GYvOGYveGYvuGYvwor4ZmA4ZmB4ZmC4ZmD4ZmE4ZmF4ZmG4ZmH4ZmI4ZmJ4ZmK4ZmL4ZmM4ZmN4ZmO4ZmP4ZmQ4ZmR4ZmS4ZmT4ZmU4ZmV4ZmW4ZmX4ZmY4ZmZ4Zma4Zmb4Zmc4Zmd4Zme4Zmf4Zmg4Zmh4Zmi4Zmj4Zmk4Zml4Zmm4Zmn4Zmo4Zmp4Zmq4Zmr4Zms4Zmt4Zmu4Zmv4Zmw4Zmx4Zmy4Zmz4Zm04Zm14Zm24Zm34Zm44Zm54Zm64Zm74Zm84Zm94Zm+4Zm/CisKK09naGFtIChVKzE2ODAtVSsxNjlGKToKKwor4ZqA4ZqB4ZqC4ZqD4ZqE4ZqF4ZqG4ZqH4ZqI4ZqJ4ZqK4ZqL4ZqM4ZqN4ZqO4ZqP4ZqQ4ZqR4ZqS4ZqT4ZqU4ZqV4ZqW4ZqX4ZqY4ZqZ4Zqa4Zqb4Zqc4Zqd4Zqe4ZqfCisKK1J1bmljIChVKzE2QTAtVSsxNkZGKToKKwor4Zqg4Zqh4Zqi4Zqj4Zqk4Zql4Zqm4Zqn4Zqo4Zqp4Zqq4Zqr4Zqs4Zqt4Zqu4Zqv4Zqw4Zqx4Zqy4Zqz4Zq04Zq14Zq24Zq34Zq44Zq54Zq64Zq74Zq84Zq94Zq+4Zq/4ZuA4ZuB4ZuC4ZuD4ZuE4ZuF4ZuG4ZuH4ZuI4ZuJ4ZuK4ZuL4ZuM4ZuN4ZuO4ZuP4ZuQ4ZuR4ZuS4ZuT4ZuU4ZuV4ZuW4ZuX4ZuY4ZuZ4Zua4Zub4Zuc4Zud4Zue4ZufCivhm6Dhm6Hhm6Lhm6Phm6Thm6Xhm6bhm6fhm6jhm6nhm6rhm6vhm6zhm63hm67hm6/hm7Dhm7Hhm7Lhm7Phm7Thm7Xhm7bhm7fhm7jhm7nhm7rhm7vhm7zhm73hm77hm78KKworVGFnYWxvZyAoVSsxNzAwLVUrMTcxRik6CisKK+GcgOGcgeGcguGcg+GchOGcheGchuGch+GciOGcieGciuGci+GcjOGcjeGcjuGcj+GckOGckeKXjOGckuKXjOGck+KXjOGclOGcleGcluGcl+GcmOGcmeGcmuGcm+GcnOGcneGcnuGcnworCitIYW51bm9vIChVKzE3MjAtVSsxNzNGKToKKwor4Zyg4Zyh4Zyi4Zyj4Zyk4Zyl4Zym4Zyn4Zyo4Zyp4Zyq4Zyr4Zys4Zyt4Zyu4Zyv4Zyw4Zyx4peM4Zyy4peM4Zyz4peM4Zy04Zy14Zy24Zy34Zy44Zy54Zy64Zy74Zy84Zy94Zy+4Zy/CisKK0J1aGlkIChVKzE3NDAtVSsxNzVGKToKKwor4Z2A4Z2B4Z2C4Z2D4Z2E4Z2F4Z2G4Z2H4Z2I4Z2J4Z2K4Z2L4Z2M4Z2N4Z2O4Z2P4Z2Q4Z2R4peM4Z2S4peM4Z2T4Z2U4Z2V4Z2W4Z2X4Z2Y4Z2Z4Z2a4Z2b4Z2c4Z2d4Z2e4Z2fCisKK1RhZ2JhbndhIChVKzE3NjAtVSsxNzdGKToKKwor4Z2g4Z2h4Z2i4Z2j4Z2k4Z2l4Z2m4Z2n4Z2o4Z2p4Z2q4Z2r4Z2s4Z2t4Z2u4Z2v4Z2w4Z2x4peM4Z2y4peM4Z2z4Z204Z214Z224Z234Z244Z254Z264Z274Z284Z294Z2+4Z2/CisKK0tobWVyIChVKzE3ODAtVSsxN0ZGKToKKwor4Z6A4Z6B4Z6C4Z6D4Z6E4Z6F4Z6G4Z6H4Z6I4Z6J4Z6K4Z6L4Z6M4Z6N4Z6O4Z6P4Z6Q4Z6R4Z6S4Z6T4Z6U4Z6V4Z6W4Z6X4Z6Y4Z6Z4Z6a4Z6b4Z6c4Z6d4Z6e4Z6f4Z6g4Z6h4Z6i4Z6j4Z6k4Z6l4Z6m4Z6n4Z6o4Z6p4Z6q4Z6r4Z6s4Z6t4Z6u4Z6v4Z6w4Z6x4Z6y4Z6z4Z604Z614Z624peM4Z634peM4Z644peM4Z654peM4Z664peM4Z674peM4Z684peM4Z694Z6+4Z6/Civhn4Dhn4Hhn4Lhn4Phn4Thn4Xil4zhn4bhn4fhn4jil4zhn4nil4zhn4ril4zhn4vil4zhn4zil4zhn43il4zhn47il4zhn4/il4zhn5Dil4zhn5Hil4zhn5Lil4zhn5Phn5Thn5Xhn5bhn5fhn5jhn5nhn5rhn5vhn5zhn53hn57hn5/hn6Dhn6Hhn6Lhn6Phn6Thn6Xhn6bhn6fhn6jhn6nhn6rhn6vhn6zhn63hn67hn6/hn7Dhn7Hhn7Lhn7Phn7Thn7Xhn7bhn7fhn7jhn7nhn7rhn7vhn7zhn73hn77hn78KKworTW9uZ29saWFuIChVKzE4MDAtVSsxOEFGKToKKwor4aCA4aCB4aCC4aCD4aCE4aCF4aCG4aCH4aCI4aCJ4aCK4peM4aCL4peM4aCM4peM4aCN4aCO4aCP4aCQ4aCR4aCS4aCT4aCU4aCV4aCW4aCX4aCY4aCZ4aCa4aCb4aCc4aCd4aCe4aCf4aCg4aCh4aCi4aCj4aCk4aCl4aCm4aCn4aCo4aCp4aCq4aCr4aCs4aCt4aCu4aCv4aCw4aCx4aCy4aCz4aC04aC14aC24aC34aC44aC54aC64aC74aC84aC94aC+4aC/CivhoYDhoYHhoYLhoYPhoYThoYXhoYbhoYfhoYjhoYnhoYrhoYvhoYzhoY3hoY7hoY/hoZDhoZHhoZLhoZPhoZThoZXhoZbhoZfhoZjhoZnhoZrhoZvhoZzhoZ3hoZ7hoZ/hoaDhoaHhoaLhoaPhoaThoaXhoabhoafhoajhoanhoarhoavhoazhoa3hoa7hoa/hobDhobHhobLhobPhobThobXhobbhobfhobjhobnhobrhobvhobzhob3hob7hob8KK+GigOGigeGiguGig+GihOGiheGihuGih+GiiOGiieGiiuGii+GijOGijeGijuGij+GikOGikeGikuGik+GilOGileGiluGil+GimOGimeGimuGim+GinOGineGinuGin+GioOGioeGiouGio+GipOGipeGipuGip+GiqOKXjOGiqeGiquGiq+GirOGireGiruGirworCitGcmVlIGJsb2NrIChVKzE4QjAtVSsxOEZGKToKKwor4aKw4aKx4aKy4aKz4aK04aK14aK24aK34aK44aK54aK64aK74aK84aK94aK+4aK/4aOA4aOB4aOC4aOD4aOE4aOF4aOG4aOH4aOI4aOJ4aOK4aOL4aOM4aON4aOO4aOP4aOQ4aOR4aOS4aOT4aOU4aOV4aOW4aOX4aOY4aOZ4aOa4aOb4aOc4aOd4aOe4aOf4aOg4aOh4aOi4aOj4aOk4aOl4aOm4aOn4aOo4aOp4aOq4aOr4aOs4aOt4aOu4aOvCivho7Dho7Hho7Lho7Pho7Tho7Xho7bho7fho7jho7nho7rho7vho7zho73ho77ho78KKworTGltYnUgKFUrMTkwMC1VKzE5NEYpOgorCivhpIDhpIHhpILhpIPhpIThpIXhpIbhpIfhpIjhpInhpIrhpIvhpIzhpI3hpI7hpI/hpJDhpJHhpJLhpJPhpJThpJXhpJbhpJfhpJjhpJnhpJrhpJvhpJzhpJ3hpJ7hpJ/hpKDhpKHhpKLhpKPhpKThpKXhpKbhpKfhpKjhpKnhpKrhpKvhpKzhpK3hpK7hpK/hpLDhpLHhpLLhpLPhpLThpLXhpLbhpLfhpLjhpLnhpLrhpLvhpLzhpL3hpL7hpL8KK+GlgOGlgeGlguGlg+GlhOGlheGlhuGlh+GliOGlieGliuGli+GljOGljeGljuGljworCitUYWkgTGUgKFUrMTk1MC1VKzE5N0YpOgorCivhpZDhpZHhpZLhpZPhpZThpZXhpZbhpZfhpZjhpZnhpZrhpZvhpZzhpZ3hpZ7hpZ/hpaDhpaHhpaLhpaPhpaThpaXhpabhpafhpajhpanhparhpavhpazhpa3hpa7hpa/hpbDhpbHhpbLhpbPhpbThpbXhpbbhpbfhpbjhpbnhpbrhpbvhpbzhpb3hpb7hpb8KKworRnJlZSBibG9jayAoVSsxOTgwLVUrMTlERik6CisKK+GmgOGmgeGmguGmg+GmhOGmheGmhuGmh+GmiOGmieGmiuGmi+GmjOGmjeGmjuGmj+GmkOGmkeGmkuGmk+GmlOGmleGmluGml+GmmOGmmeGmmuGmm+GmnOGmneGmnuGmn+GmoOGmoeGmouGmo+GmpOGmpeGmpuGmp+GmqOGmqeGmquGmq+GmrOGmreGmruGmr+GmsOGmseGmsuGms+GmtOGmteGmtuGmt+GmuOGmueGmuuGmu+GmvOGmveGmvuGmvwor4aeA4aeB4aeC4aeD4aeE4aeF4aeG4aeH4aeI4aeJ4aeK4aeL4aeM4aeN4aeO4aeP4aeQ4aeR4aeS4aeT4aeU4aeV4aeW4aeX4aeY4aeZ4aea4aeb4aec4aed4aee4aefCisKK0tobWVyIFN5bWJvbHMgKFUrMTlFMC1VKzE5RkYpOgorCivhp6Dhp6Hhp6Lhp6Php6Thp6Xhp6bhp6fhp6jhp6nhp6rhp6vhp6zhp63hp67hp6/hp7Dhp7Hhp7Lhp7Php7Thp7Xhp7bhp7fhp7jhp7nhp7rhp7vhp7zhp73hp77hp78KKworRnJlZSBibG9jayAoVSsxQTAwLVUrMUNGRik6CisKK+GogOGogeGoguGog+GohOGoheGohuGoh+GoiOGoieGoiuGoi+GojOGojeGojuGoj+GokOGokeGokuGok+GolOGoleGoluGol+GomOGomeGomuGom+GonOGoneGonuGon+GooOGooeGoouGoo+GopOGopeGopuGop+GoqOGoqeGoquGoq+GorOGoreGoruGor+GosOGoseGosuGos+GotOGoteGotuGot+GouOGoueGouuGou+GovOGoveGovuGovwor4amA4amB4amC4amD4amE4amF4amG4amH4amI4amJ4amK4amL4amM4amN4amO4amP4amQ4amR4amS4amT4amU4amV4amW4amX4amY4amZ4ama4amb4amc4amd4ame4amf4amg4amh4ami4amj4amk4aml4amm4amn4amo4amp4amq4amr4ams4amt4amu4amv4amw4amx4amy4amz4am04am14am24am34am44am54am64am74am84am94am+4am/CivhqoDhqoHhqoLhqoPhqoThqoXhqobhqofhqojhqonhqorhqovhqozhqo3hqo7hqo/hqpDhqpHhqpLhqpPhqpThqpXhqpbhqpfhqpjhqpnhqprhqpvhqpzhqp3hqp7hqp/hqqDhqqHhqqLhqqPhqqThqqXhqqbhqqfhqqjhqqnhqqrhqqvhqqzhqq3hqq7hqq/hqrDhqrHhqrLhqrPhqrThqrXhqrbhqrfhqrjhqrnhqrrhqrvhqrzhqr3hqr7hqr8KK+GrgOGrgeGrguGrg+GrhOGrheGrhuGrh+GriOGrieGriuGri+GrjOGrjeGrjuGrj+GrkOGrkeGrkuGrk+GrlOGrleGrluGrl+GrmOGrmeGrmuGrm+GrnOGrneGrnuGrn+GroOGroeGrouGro+GrpOGrpeGrpuGrp+GrqOGrqeGrquGrq+GrrOGrreGrruGrr+GrsOGrseGrsuGrs+GrtOGrteGrtuGrt+GruOGrueGruuGru+GrvOGrveGrvuGrvwor4ayA4ayB4ayC4ayD4ayE4ayF4ayG4ayH4ayI4ayJ4ayK4ayL4ayM4ayN4ayO4ayP4ayQ4ayR4ayS4ayT4ayU4ayV4ayW4ayX4ayY4ayZ4aya4ayb4ayc4ayd4aye4ayf4ayg4ayh4ayi4ayj4ayk4ayl4aym4ayn4ayo4ayp4ayq4ayr4ays4ayt4ayu4ayv4ayw4ayx4ayy4ayz4ay04ay14ay24ay34ay44ay54ay64ay74ay84ay94ay+4ay/CivhrYDhrYHhrYLhrYPhrYThrYXhrYbhrYfhrYjhrYnhrYrhrYvhrYzhrY3hrY7hrY/hrZDhrZHhrZLhrZPhrZThrZXhrZbhrZfhrZjhrZnhrZrhrZvhrZzhrZ3hrZ7hrZ/hraDhraHhraLhraPhraThraXhrabhrafhrajhranhrarhravhrazhra3hra7hra/hrbDhrbHhrbLhrbPhrbThrbXhrbbhrbfhrbjhrbnhrbrhrbvhrbzhrb3hrb7hrb8KK+GugOGugeGuguGug+GuhOGuheGuhuGuh+GuiOGuieGuiuGui+GujOGujeGujuGuj+GukOGukeGukuGuk+GulOGuleGuluGul+GumOGumeGumuGum+GunOGuneGunuGun+GuoOGuoeGuouGuo+GupOGupeGupuGup+GuqOGuqeGuquGuq+GurOGureGuruGur+GusOGuseGusuGus+GutOGuteGutuGut+GuuOGuueGuuuGuu+GuvOGuveGuvuGuvwor4a+A4a+B4a+C4a+D4a+E4a+F4a+G4a+H4a+I4a+J4a+K4a+L4a+M4a+N4a+O4a+P4a+Q4a+R4a+S4a+T4a+U4a+V4a+W4a+X4a+Y4a+Z4a+a4a+b4a+c4a+d4a+e4a+f4a+g4a+h4a+i4a+j4a+k4a+l4a+m4a+n4a+o4a+p4a+q4a+r4a+s4a+t4a+u4a+v4a+w4a+x4a+y4a+z4a+04a+14a+24a+34a+44a+54a+64a+74a+84a+94a++4a+/CivhsIDhsIHhsILhsIPhsIThsIXhsIbhsIfhsIjhsInhsIrhsIvhsIzhsI3hsI7hsI/hsJDhsJHhsJLhsJPhsJThsJXhsJbhsJfhsJjhsJnhsJrhsJvhsJzhsJ3hsJ7hsJ/hsKDhsKHhsKLhsKPhsKThsKXhsKbhsKfhsKjhsKnhsKrhsKvhsKzhsK3hsK7hsK/hsLDhsLHhsLLhsLPhsLThsLXhsLbhsLfhsLjhsLnhsLrhsLvhsLzhsL3hsL7hsL8KK+GxgOGxgeGxguGxg+GxhOGxheGxhuGxh+GxiOGxieGxiuGxi+GxjOGxjeGxjuGxj+GxkOGxkeGxkuGxk+GxlOGxleGxluGxl+GxmOGxmeGxmuGxm+GxnOGxneGxnuGxn+GxoOGxoeGxouGxo+GxpOGxpeGxpuGxp+GxqOGxqeGxquGxq+GxrOGxreGxruGxr+GxsOGxseGxsuGxs+GxtOGxteGxtuGxt+GxuOGxueGxuuGxu+GxvOGxveGxvuGxvwor4bKA4bKB4bKC4bKD4bKE4bKF4bKG4bKH4bKI4bKJ4bKK4bKL4bKM4bKN4bKO4bKP4bKQ4bKR4bKS4bKT4bKU4bKV4bKW4bKX4bKY4bKZ4bKa4bKb4bKc4bKd4bKe4bKf4bKg4bKh4bKi4bKj4bKk4bKl4bKm4bKn4bKo4bKp4bKq4bKr4bKs4bKt4bKu4bKv4bKw4bKx4bKy4bKz4bK04bK14bK24bK34bK44bK54bK64bK74bK84bK94bK+4bK/Civhs4Dhs4Hhs4Lhs4Phs4Ths4Xhs4bhs4fhs4jhs4nhs4rhs4vhs4zhs43hs47hs4/hs5Dhs5Hhs5Lhs5Phs5Ths5Xhs5bhs5fhs5jhs5nhs5rhs5vhs5zhs53hs57hs5/hs6Dhs6Hhs6Lhs6Phs6Ths6Xhs6bhs6fhs6jhs6nhs6rhs6vhs6zhs63hs67hs6/hs7Dhs7Hhs7Lhs7Phs7Ths7Xhs7bhs7fhs7jhs7nhs7rhs7vhs7zhs73hs77hs78KKworUGhvbmV0aWMgRXh0ZW5zaW9ucyAoVSsxRDAwLVUrMUQ3Rik6CisKK+G0gOG0geG0guG0g+G0hOG0heG0huG0h+G0iOG0ieG0iuG0i+G0jOG0jeG0juG0j+G0kOG0keG0kuG0k+G0lOG0leG0luG0l+G0mOG0meG0muG0m+G0nOG0neG0nuG0n+G0oOG0oeG0ouG0o+G0pOG0peG0puG0p+G0qOG0qeG0quG0q+G0rOG0reG0ruG0r+G0sOG0seG0suG0s+G0tOG0teG0tuG0t+G0uOG0ueG0uuG0u+G0vOG0veG0vuG0vwor4bWA4bWB4bWC4bWD4bWE4bWF4bWG4bWH4bWI4bWJ4bWK4bWL4bWM4bWN4bWO4bWP4bWQ4bWR4bWS4bWT4bWU4bWV4bWW4bWX4bWY4bWZ4bWa4bWb4bWc4bWd4bWe4bWf4bWg4bWh4bWi4bWj4bWk4bWl4bWm4bWn4bWo4bWp4bWq4bWr4bWs4bWt4bWu4bWv4bWw4bWx4bWy4bWz4bW04bW14bW24bW34bW44bW54bW64bW74bW84bW94bW+4bW/CisKK0ZyZWUgYmxvY2sgKFUrMUQ4MC1VKzFERkYpOgorCivhtoDhtoHhtoLhtoPhtoThtoXhtobhtofhtojhtonhtorhtovhtozhto3hto7hto/htpDhtpHhtpLhtpPhtpThtpXhtpbhtpfhtpjhtpnhtprhtpvhtpzhtp3htp7htp/htqDhtqHhtqLhtqPhtqThtqXhtqbhtqfhtqjhtqnhtqrhtqvhtqzhtq3htq7htq/htrDhtrHhtrLhtrPhtrThtrXhtrbhtrfhtrjhtrnhtrrhtrvhtrzhtr3htr7htr8KK+G3gOG3geG3guG3g+G3hOG3heG3huG3h+G3iOG3ieG3iuG3i+G3jOG3jeG3juG3j+G3kOG3keG3kuG3k+G3lOG3leG3luG3l+G3mOG3meG3muG3m+G3nOG3neG3nuG3n+G3oOG3oeG3ouG3o+G3pOG3peG3puG3p+G3qOG3qeG3quG3q+G3rOG3reG3ruG3r+G3sOG3seG3suG3s+G3tOG3teG3tuG3t+G3uOG3ueG3uuG3u+G3vOG3veG3vuG3vworCitMYXRpbiBFeHRlbmRlZCBBZGRpdGlvbmFsIChVKzFFMDAtVSsxRUZGKToKKwor4biA4biB4biC4biD4biE4biF4biG4biH4biI4biJ4biK4biL4biM4biN4biO4biP4biQ4biR4biS4biT4biU4biV4biW4biX4biY4biZ4bia4bib4bic4bid4bie4bif4big4bih4bii4bij4bik4bil4bim4bin4bio4bip4biq4bir4bis4bit4biu4biv4biw4bix4biy4biz4bi04bi14bi24bi34bi44bi54bi64bi74bi84bi94bi+4bi/CivhuYDhuYHhuYLhuYPhuYThuYXhuYbhuYfhuYjhuYnhuYrhuYvhuYzhuY3huY7huY/huZDhuZHhuZLhuZPhuZThuZXhuZbhuZfhuZjhuZnhuZrhuZvhuZzhuZ3huZ7huZ/huaDhuaHhuaLhuaPhuaThuaXhuabhuafhuajhuanhuarhuavhuazhua3hua7hua/hubDhubHhubLhubPhubThubXhubbhubfhubjhubnhubrhubvhubzhub3hub7hub8KK+G6gOG6geG6guG6g+G6hOG6heG6huG6h+G6iOG6ieG6iuG6i+G6jOG6jeG6juG6j+G6kOG6keG6kuG6k+G6lOG6leG6luG6l+G6mOG6meG6muG6m+G6nOG6neG6nuG6n+G6oOG6oeG6ouG6o+G6pOG6peG6puG6p+G6qOG6qeG6quG6q+G6rOG6reG6ruG6r+G6sOG6seG6suG6s+G6tOG6teG6tuG6t+G6uOG6ueG6uuG6u+G6vOG6veG6vuG6vwor4buA4buB4buC4buD4buE4buF4buG4buH4buI4buJ4buK4buL4buM4buN4buO4buP4buQ4buR4buS4buT4buU4buV4buW4buX4buY4buZ4bua4bub4buc4bud4bue4buf4bug4buh4bui4buj4buk4bul4bum4bun4buo4bup4buq4bur4bus4but4buu4buv4buw4bux4buy4buz4bu04bu14bu24bu34bu44bu54bu64bu74bu84bu94bu+4bu/CisKK0dyZWVrIEV4dGVuZGVkIChVKzFGMDAtVSsxRkZGKToKKwor4byA4byB4byC4byD4byE4byF4byG4byH4byI4byJ4byK4byL4byM4byN4byO4byP4byQ4byR4byS4byT4byU4byV4byW4byX4byY4byZ4bya4byb4byc4byd4bye4byf4byg4byh4byi4byj4byk4byl4bym4byn4byo4byp4byq4byr4bys4byt4byu4byv4byw4byx4byy4byz4by04by14by24by34by44by54by64by74by84by94by+4by/CivhvYDhvYHhvYLhvYPhvYThvYXhvYbhvYfhvYjhvYnhvYrhvYvhvYzhvY3hvY7hvY/hvZDhvZHhvZLhvZPhvZThvZXhvZbhvZfhvZjhvZnhvZrhvZvhvZzhvZ3hvZ7hvZ/hvaDhvaHhvaLhvaPhvaThvaXhvabhvafhvajhvanhvarhvavhvazhva3hva7hva/hvbDhvbHhvbLhvbPhvbThvbXhvbbhvbfhvbjhvbnhvbrhvbvhvbzhvb3hvb7hvb8KK+G+gOG+geG+guG+g+G+hOG+heG+huG+h+G+iOG+ieG+iuG+i+G+jOG+jeG+juG+j+G+kOG+keG+kuG+k+G+lOG+leG+luG+l+G+mOG+meG+muG+m+G+nOG+neG+nuG+n+G+oOG+oeG+ouG+o+G+pOG+peG+puG+p+G+qOG+qeG+quG+q+G+rOG+reG+ruG+r+G+sOG+seG+suG+s+G+tOG+teG+tuG+t+G+uOG+ueG+uuG+u+G+vOG+veG+vuG+vwor4b+A4b+B4b+C4b+D4b+E4b+F4b+G4b+H4b+I4b+J4b+K4b+L4b+M4b+N4b+O4b+P4b+Q4b+R4b+S4b+T4b+U4b+V4b+W4b+X4b+Y4b+Z4b+a4b+b4b+c4b+d4b+e4b+f4b+g4b+h4b+i4b+j4b+k4b+l4b+m4b+n4b+o4b+p4b+q4b+r4b+s4b+t4b+u4b+v4b+w4b+x4b+y4b+z4b+04b+14b+24b+34b+44b+54b+64b+74b+84b+94b++4b+/CisKK0dlbmVyYWwgUHVuY3R1YXRpb24gKFUrMjAwMC1VKzIwNkYpOgorCivigIDigIHigILigIPigITigIXigIbigIfigIjigInigIrigIvigIzigI3igI7igI/igJDigJHigJLigJPigJTigJXigJbigJfigJjigJnigJrigJvigJzigJ3igJ7igJ/igKDigKHigKLigKPigKTigKXigKbigKfigKjigKnigKrigKvigKzigK3igK7igK/igLDigLHigLLigLPigLTigLXigLbigLfigLjigLnigLrigLvigLzigL3igL7igL8KK+KBgOKBgeKBguKBg+KBhOKBheKBhuKBh+KBiOKBieKBiuKBi+KBjOKBjeKBjuKBj+KBkOKBkeKBkuKBk+KBlOKBleKBluKBl+KBmOKBmeKBmuKBm+KBnOKBneKBnuKBn+KBoOKBoeKBouKBo+KBpOKBpeKBpuKBp+KBqOKBqeKBquKBq+KBrOKBreKBruKBrworCitTdXBlcnNjcmlwdHMgYW5kIFN1YnNjcmlwdHMgKFUrMjA3MC1VKzIwOUYpOgorCivigbDigbHigbLigbPigbTigbXigbbigbfigbjigbnigbrigbvigbzigb3igb7igb/igoDigoHigoLigoPigoTigoXigobigofigojigonigorigovigozigo3igo7igo/igpDigpHigpLigpPigpTigpXigpbigpfigpjigpnigprigpvigpzigp3igp7igp8KKworQ3VycmVuY3kgU3ltYm9scyAoVSsyMEEwLVUrMjBDRik6CisKK+KCoOKCoeKCouKCo+KCpOKCpeKCpuKCp+KCqOKCqeKCquKCq+KCrOKCreKCruKCr+KCsOKCseKCsuKCs+KCtOKCteKCtuKCt+KCuOKCueKCuuKCu+KCvOKCveKCvuKCv+KDgOKDgeKDguKDg+KDhOKDheKDhuKDh+KDiOKDieKDiuKDi+KDjOKDjeKDjuKDjworCitDb21iaW5pbmcgRGlhY3JpdGljYWwgTWFya3MgZm9yIFN5bWJvbHMgKFUrMjBEMC1VKzIwRkYpOgorCivil4zig5Dil4zig5Hil4zig5Lil4zig5Pil4zig5Til4zig5Xil4zig5bil4zig5fil4zig5jil4zig5nil4zig5ril4zig5vil4zig5wg4oOdIOKDniDig58g4oOg4peM4oOhIOKDoiDig6Mg4oOk4peM4oOl4peM4oOm4peM4oOn4peM4oOo4peM4oOp4peM4oOq4oOr4oOs4oOt4oOu4oOv4oOw4oOx4oOy4oOz4oO04oO14oO24oO34oO44oO54oO64oO74oO84oO94oO+4oO/CisKK0xldHRlcmxpa2UgU3ltYm9scyAoVSsyMTAwLVUrMjE0Rik6CisKK+KEgOKEgeKEguKEg+KEhOKEheKEhuKEh+KEiOKEieKEiuKEi+KEjOKEjeKEjuKEj+KEkOKEkeKEkuKEk+KElOKEleKEluKEl+KEmOKEmeKEmuKEm+KEnOKEneKEnuKEn+KEoOKEoeKEouKEo+KEpOKEpeKEpuKEp+KEqOKEqeKEquKEq+KErOKEreKEruKEr+KEsOKEseKEsuKEs+KEtOKEteKEtuKEt+KEuOKEueKEuuKEu+KEvOKEveKEvuKEvwor4oWA4oWB4oWC4oWD4oWE4oWF4oWG4oWH4oWI4oWJ4oWK4oWL4oWM4oWN4oWO4oWPCisKK051bWJlciBGb3JtcyAoVSsyMTUwLVUrMjE4Rik6CisKK+KFkOKFkeKFkuKFk+KFlOKFleKFluKFl+KFmOKFmeKFmuKFm+KFnOKFneKFnuKFn+KFoOKFoeKFouKFo+KFpOKFpeKFpuKFp+KFqOKFqeKFquKFq+KFrOKFreKFruKFr+KFsOKFseKFsuKFs+KFtOKFteKFtuKFt+KFuOKFueKFuuKFu+KFvOKFveKFvuKFv+KGgOKGgeKGguKGg+KGhOKGheKGhuKGh+KGiOKGieKGiuKGi+KGjOKGjeKGjuKGjworCitBcnJvd3MgKFUrMjE5MC1VKzIxRkYpOgorCivihpDihpHihpLihpPihpTihpXihpbihpfihpjihpnihprihpvihpzihp3ihp7ihp/ihqDihqHihqLihqPihqTihqXihqbihqfihqjihqnihqrihqvihqzihq3ihq7ihq/ihrDihrHihrLihrPihrTihrXihrbihrfihrjihrnihrrihrvihrzihr3ihr7ihr/ih4Dih4Hih4Lih4Pih4Tih4Xih4bih4fih4jih4nih4rih4vih4zih43ih47ih48KK+KHkOKHkeKHkuKHk+KHlOKHleKHluKHl+KHmOKHmeKHmuKHm+KHnOKHneKHnuKHn+KHoOKHoeKHouKHo+KHpOKHpeKHpuKHp+KHqOKHqeKHquKHq+KHrOKHreKHruKHr+KHsOKHseKHsuKHs+KHtOKHteKHtuKHt+KHuOKHueKHuuKHu+KHvOKHveKHvuKHvworCitNYXRoZW1hdGljYWwgT3BlcmF0b3JzIChVKzIyMDAtVSsyMkZGKToKKwor4oiA4oiB4oiC4oiD4oiE4oiF4oiG4oiH4oiI4oiJ4oiK4oiL4oiM4oiN4oiO4oiP4oiQ4oiR4oiS4oiT4oiU4oiV4oiW4oiX4oiY4oiZ4oia4oib4oic4oid4oie4oif4oig4oih4oii4oij4oik4oil4oim4oin4oio4oip4oiq4oir4ois4oit4oiu4oiv4oiw4oix4oiy4oiz4oi04oi14oi24oi34oi44oi54oi64oi74oi84oi94oi+4oi/CiviiYDiiYHiiYLiiYPiiYTiiYXiiYbiiYfiiYjiiYniiYriiYviiYziiY3iiY7iiY/iiZDiiZHiiZLiiZPiiZTiiZXiiZbiiZfiiZjiiZniiZriiZviiZziiZ3iiZ7iiZ/iiaDiiaHiiaLiiaPiiaTiiaXiiabiiafiiajiianiiariiaviiaziia3iia7iia/iibDiibHiibLiibPiibTiibXiibbiibfiibjiibniibriibviibziib3iib7iib8KK+KKgOKKgeKKguKKg+KKhOKKheKKhuKKh+KKiOKKieKKiuKKi+KKjOKKjeKKjuKKj+KKkOKKkeKKkuKKk+KKlOKKleKKluKKl+KKmOKKmeKKmuKKm+KKnOKKneKKnuKKn+KKoOKKoeKKouKKo+KKpOKKpeKKpuKKp+KKqOKKqeKKquKKq+KKrOKKreKKruKKr+KKsOKKseKKsuKKs+KKtOKKteKKtuKKt+KKuOKKueKKuuKKu+KKvOKKveKKvuKKvwor4ouA4ouB4ouC4ouD4ouE4ouF4ouG4ouH4ouI4ouJ4ouK4ouL4ouM4ouN4ouO4ouP4ouQ4ouR4ouS4ouT4ouU4ouV4ouW4ouX4ouY4ouZ4oua4oub4ouc4oud4oue4ouf4oug4ouh4oui4ouj4ouk4oul4oum4oun4ouo4oup4ouq4our4ous4out4ouu4ouv4ouw4oux4ouy4ouz4ou04ou14ou24ou34ou44ou54ou64ou74ou84ou94ou+4ou/CisKK01pc2NlbGxhbmVvdXMgVGVjaG5pY2FsIChVKzIzMDAtVSsyM0ZGKToKKwor4oyA4oyB4oyC4oyD4oyE4oyF4oyG4oyH4oyI4oyJ4oyK4oyL4oyM4oyN4oyO4oyP4oyQ4oyR4oyS4oyT4oyU4oyV4oyW4oyX4oyY4oyZ4oya4oyb4oyc4oyd4oye4oyf4oyg4oyh4oyi4oyj4oyk4oyl4oym4oyn4oyo4oyp4oyq4oyr4oys4oyt4oyu4oyv4oyw4oyx4oyy4oyz4oy04oy14oy24oy34oy44oy54oy64oy74oy84oy9CivijL7ijL/ijYDijYHijYLijYPijYTijYXijYbijYfijYjijYnijYrijYvijYzijY3ijY7ijY/ijZDijZHijZLijZPijZTijZXijZbijZfijZjijZnijZrijZvijZzijZ3ijZ7ijZ/ijaDijaHijaLijaPijaTijaXijabijafijajijanijarijavijazija3ija7ija/ijbDijbHijbLijbPijbTijbXijbbijbfijbjijbnijbrijbvijbzijb0KK+KNvuKNv+KOgOKOgeKOguKOg+KOhOKOheKOhuKOh+KOiOKOieKOiuKOi+KOjOKOjeKOjuKOj+KOkOKOkeKOkuKOk+KOlOKOleKOluKOl+KOmOKOmeKOmuKOm+KOnOKOneKOnuKOn+KOoOKOoeKOouKOo+KOpOKOpeKOpuKOp+KOqOKOqeKOquKOq+KOrOKOreKOruKOr+KOsOKOseKOsuKOs+KOtOKOteKOtuKOt+KOuOKOueKOuuKOu+KOvOKOvQor4o6+4o6/4o+A4o+B4o+C4o+D4o+E4o+F4o+G4o+H4o+I4o+J4o+K4o+L4o+M4o+N4o+O4o+P4o+Q4o+R4o+S4o+T4o+U4o+V4o+W4o+X4o+Y4o+Z4o+a4o+b4o+c4o+d4o+e4o+f4o+g4o+h4o+i4o+j4o+k4o+l4o+m4o+n4o+o4o+p4o+q4o+r4o+s4o+t4o+u4o+v4o+w4o+x4o+y4o+z4o+04o+14o+24o+34o+44o+54o+64o+74o+84o+9Civij77ij78KKworQ29udHJvbCBQaWN0dXJlcyAoVSsyNDAwLVUrMjQzRik6CisKK+KQgOKQgeKQguKQg+KQhOKQheKQhuKQh+KQiOKQieKQiuKQi+KQjOKQjeKQjuKQj+KQkOKQkeKQkuKQk+KQlOKQleKQluKQl+KQmOKQmeKQmuKQm+KQnOKQneKQnuKQn+KQoOKQoeKQouKQo+KQpOKQpeKQpuKQp+KQqOKQqeKQquKQq+KQrOKQreKQruKQr+KQsOKQseKQsuKQs+KQtOKQteKQtuKQt+KQuOKQueKQuuKQu+KQvOKQveKQvuKQvworCitPcHRpY2FsIENoYXJhY3RlciBSZWNvZ25pdGlvbiAoVSsyNDQwLVUrMjQ1Rik6CisKK+KRgOKRgeKRguKRg+KRhOKRheKRhuKRh+KRiOKRieKRiuKRi+KRjOKRjeKRjuKRj+KRkOKRkeKRkuKRk+KRlOKRleKRluKRl+KRmOKRmeKRmuKRm+KRnOKRneKRnuKRnworCitFbmNsb3NlZCBBbHBoYW51bWVyaWNzIChVKzI0NjAtVSsyNEZGKToKKwor4pGg4pGh4pGi4pGj4pGk4pGl4pGm4pGn4pGo4pGp4pGq4pGr4pGs4pGt4pGu4pGv4pGw4pGx4pGy4pGz4pG04pG14pG24pG34pG44pG54pG64pG74pG84pG94pG+4pG/4pKA4pKB4pKC4pKD4pKE4pKF4pKG4pKH4pKI4pKJ4pKK4pKL4pKM4pKN4pKO4pKP4pKQ4pKR4pKS4pKT4pKU4pKV4pKW4pKX4pKY4pKZ4pKa4pKb4pKc4pKd4pKe4pKfCivikqDikqHikqLikqPikqTikqXikqbikqfikqjikqnikqrikqvikqzikq3ikq7ikq/ikrDikrHikrLikrPikrTikrXikrbikrfikrjikrnikrrikrvikrzikr3ikr7ikr/ik4Dik4Hik4Lik4Pik4Tik4Xik4bik4fik4jik4nik4rik4vik4zik43ik47ik4/ik5Dik5Hik5Lik5Pik5Tik5Xik5bik5fik5jik5nik5rik5vik5zik53ik57ik58KK+KToOKToeKTouKTo+KTpOKTpeKTpuKTp+KTqOKTqeKTquKTq+KTrOKTreKTruKTr+KTsOKTseKTsuKTs+KTtOKTteKTtuKTt+KTuOKTueKTuuKTu+KTvOKTveKTvuKTvworCitCb3ggRHJhd2luZyAoVSsyNTAwLVUrMjU3Rik6CisKK+KUgOKUgeKUguKUg+KUhOKUheKUhuKUh+KUiOKUieKUiuKUi+KUjOKUjeKUjuKUj+KUkOKUkeKUkuKUk+KUlOKUleKUluKUl+KUmOKUmeKUmuKUm+KUnOKUneKUnuKUn+KUoOKUoeKUouKUo+KUpOKUpeKUpuKUp+KUqOKUqeKUquKUq+KUrOKUreKUruKUr+KUsOKUseKUsuKUs+KUtOKUteKUtuKUt+KUuOKUueKUuuKUu+KUvOKUveKUvuKUvwor4pWA4pWB4pWC4pWD4pWE4pWF4pWG4pWH4pWI4pWJ4pWK4pWL4pWM4pWN4pWO4pWP4pWQ4pWR4pWS4pWT4pWU4pWV4pWW4pWX4pWY4pWZ4pWa4pWb4pWc4pWd4pWe4pWf4pWg4pWh4pWi4pWj4pWk4pWl4pWm4pWn4pWo4pWp4pWq4pWr4pWs4pWt4pWu4pWv4pWw4pWx4pWy4pWz4pW04pW14pW24pW34pW44pW54pW64pW74pW84pW94pW+4pW/CisKK0Jsb2NrIEVsZW1lbnRzIChVKzI1ODAtVSsyNTlGKToKKwor4paA4paB4paC4paD4paE4paF4paG4paH4paI4paJ4paK4paL4paM4paN4paO4paP4paQ4paR4paS4paT4paU4paV4paW4paX4paY4paZ4paa4pab4pac4pad4pae4pafCisKK0dlb21ldHJpYyBTaGFwZXMgKFUrMjVBMC1VKzI1RkYpOgorCivilqDilqHilqLilqPilqTilqXilqbilqfilqjilqnilqrilqvilqzilq3ilq7ilq/ilrDilrHilrLilrPilrTilrXilrbilrfilrjilrnilrrilrvilrzilr3ilr7ilr/il4Dil4Hil4Lil4Pil4Til4Xil4bil4fil4jil4nil4ril4vil4zil43il47il4/il5Dil5Hil5Lil5Pil5Til5Xil5bil5fil5jil5nil5ril5vil5zil53il57il58KK+KXoOKXoeKXouKXo+KXpOKXpeKXpuKXp+KXqOKXqeKXquKXq+KXrOKXreKXruKXr+KXsOKXseKXsuKXs+KXtOKXteKXtuKXt+KXuOKXueKXuuKXu+KXvOKXveKXvuKXvworCitNaXNjZWxsYW5lb3VzIFN5bWJvbHMgKFUrMjYwMC1VKzI2RkYpOgorCivimIDimIHimILimIPimITimIXimIbimIfimIjimInimIrimIvimIzimI3imI7imI/imJDimJHimJLimJPimJTimJXimJbimJfimJjimJnimJrimJvimJzimJ3imJ7imJ/imKDimKHimKLimKPimKTimKXimKbimKfimKjimKnimKrimKvimKzimK3imK7imK/imLDimLHimLLimLPimLTimLXimLbimLfimLjimLnimLrimLvimLzimL3imL7imL8KK+KZgOKZgeKZguKZg+KZhOKZheKZhuKZh+KZiOKZieKZiuKZi+KZjOKZjeKZjuKZj+KZkOKZkeKZkuKZk+KZlOKZleKZluKZl+KZmOKZmeKZmuKZm+KZnOKZneKZnuKZn+KZoOKZoeKZouKZo+KZpOKZpeKZpuKZp+KZqOKZqeKZquKZq+KZrOKZreKZruKZr+KZsOKZseKZsuKZs+KZtOKZteKZtuKZt+KZuOKZueKZuuKZu+KZvOKZveKZvuKZvwor4pqA4pqB4pqC4pqD4pqE4pqF4pqG4pqH4pqI4pqJ4pqK4pqL4pqM4pqN4pqO4pqP4pqQ4pqR4pqS4pqT4pqU4pqV4pqW4pqX4pqY4pqZ4pqa4pqb4pqc4pqd4pqe4pqf4pqg4pqh4pqi4pqj4pqk4pql4pqm4pqn4pqo4pqp4pqq4pqr4pqs4pqt4pqu4pqv4pqw4pqx4pqy4pqz4pq04pq14pq24pq34pq44pq54pq64pq74pq84pq94pq+4pq/Civim4Dim4Him4Lim4Pim4Tim4Xim4bim4fim4jim4nim4rim4vim4zim43im47im4/im5Dim5Him5Lim5Pim5Tim5Xim5bim5fim5jim5nim5rim5vim5zim53im57im5/im6Dim6Him6Lim6Pim6Tim6Xim6bim6fim6jim6nim6rim6vim6zim63im67im6/im7Dim7Him7Lim7Pim7Tim7Xim7bim7fim7jim7nim7rim7vim7zim73im77im78KKworRGluZ2JhdHMgKFUrMjcwMC1VKzI3QkYpOgorCivinIDinIHinILinIPinITinIXinIbinIfinIjinIninIrinIvinIzinI3inI7inI/inJDinJHinJLinJPinJTinJXinJbinJfinJjinJninJrinJvinJzinJ3inJ7inJ/inKDinKHinKLinKPinKTinKXinKbinKfinKjinKninKrinKvinKzinK3inK7inK/inLDinLHinLLinLPinLTinLXinLbinLfinLjinLninLrinLvinLzinL3inL7inL8KK+KdgOKdgeKdguKdg+KdhOKdheKdhuKdh+KdiOKdieKdiuKdi+KdjOKdjeKdjuKdj+KdkOKdkeKdkuKdk+KdlOKdleKdluKdl+KdmOKdmeKdmuKdm+KdnOKdneKdnuKdn+KdoOKdoeKdouKdo+KdpOKdpeKdpuKdp+KdqOKdqeKdquKdq+KdrOKdreKdruKdr+KdsOKdseKdsuKds+KdtOKdteKdtuKdt+KduOKdueKduuKdu+KdvOKdveKdvuKdvwor4p6A4p6B4p6C4p6D4p6E4p6F4p6G4p6H4p6I4p6J4p6K4p6L4p6M4p6N4p6O4p6P4p6Q4p6R4p6S4p6T4p6U4p6V4p6W4p6X4p6Y4p6Z4p6a4p6b4p6c4p6d4p6e4p6f4p6g4p6h4p6i4p6j4p6k4p6l4p6m4p6n4p6o4p6p4p6q4p6r4p6s4p6t4p6u4p6v4p6w4p6x4p6y4p6z4p604p614p624p634p644p654p664p674p684p694p6+4p6/CisKK01pc2NlbGxhbmVvdXMgTWF0aGVtYXRpY2FsIFN5bWJvbHMtQSAoVSsyN0MwLVUrMjdFRik6CisKK+KfgOKfgeKfguKfg+KfhOKfheKfhuKfh+KfiOKfieKfiuKfi+KfjOKfjeKfjuKfj+KfkOKfkeKfkuKfk+KflOKfleKfluKfl+KfmOKfmeKfmuKfm+KfnOKfneKfnuKfn+KfoOKfoeKfouKfo+KfpOKfpeKfpuKfp+KfqOKfqeKfquKfq+KfrOKfreKfruKfrworCitTdXBwbGVtZW50YWwgQXJyb3dzLUEgKFUrMjdGMC1VKzI3RkYpOgorCivin7Din7Hin7Lin7Pin7Tin7Xin7bin7fin7jin7nin7rin7vin7zin73in77in78KKworQnJhaWxsZSBQYXR0ZXJucyAoVSsyODAwLVUrMjhGRik6CisKK+KggOKggeKgguKgg+KghOKgheKghuKgh+KgiOKgieKgiuKgi+KgjOKgjeKgjuKgj+KgkOKgkeKgkuKgk+KglOKgleKgluKgl+KgmOKgmeKgmuKgm+KgnOKgneKgnuKgn+KgoOKgoeKgouKgo+KgpOKgpeKgpuKgp+KgqOKgqeKgquKgq+KgrOKgreKgruKgr+KgsOKgseKgsuKgs+KgtOKgteKgtuKgt+KguOKgueKguuKgu+KgvOKgveKgvuKgvwor4qGA4qGB4qGC4qGD4qGE4qGF4qGG4qGH4qGI4qGJ4qGK4qGL4qGM4qGN4qGO4qGP4qGQ4qGR4qGS4qGT4qGU4qGV4qGW4qGX4qGY4qGZ4qGa4qGb4qGc4qGd4qGe4qGf4qGg4qGh4qGi4qGj4qGk4qGl4qGm4qGn4qGo4qGp4qGq4qGr4qGs4qGt4qGu4qGv4qGw4qGx4qGy4qGz4qG04qG14qG24qG34qG44qG54qG64qG74qG84qG94qG+4qG/CiviooDiooHiooLiooPiooTiooXioobioofioojioonioorioovioozioo3ioo7ioo/iopDiopHiopLiopPiopTiopXiopbiopfiopjiopniopriopviopziop3iop7iop/ioqDioqHioqLioqPioqTioqXioqbioqfioqjioqnioqrioqvioqzioq3ioq7ioq/iorDiorHiorLiorPiorTiorXiorbiorfiorjiorniorriorviorzior3ior7ior8KK+KjgOKjgeKjguKjg+KjhOKjheKjhuKjh+KjiOKjieKjiuKji+KjjOKjjeKjjuKjj+KjkOKjkeKjkuKjk+KjlOKjleKjluKjl+KjmOKjmeKjmuKjm+KjnOKjneKjnuKjn+KjoOKjoeKjouKjo+KjpOKjpeKjpuKjp+KjqOKjqeKjquKjq+KjrOKjreKjruKjr+KjsOKjseKjsuKjs+KjtOKjteKjtuKjt+KjuOKjueKjuuKju+KjvOKjveKjvuKjvworCitTdXBwbGVtZW50YWwgQXJyb3dzLUIgKFUrMjkwMC1VKzI5N0YpOgorCivipIDipIHipILipIPipITipIXipIbipIfipIjipInipIripIvipIzipI3ipI7ipI/ipJDipJHipJLipJPipJTipJXipJbipJfipJjipJnipJripJvipJzipJ3ipJ7ipJ/ipKDipKHipKLipKPipKTipKXipKbipKfipKjipKnipKripKvipKzipK3ipK7ipK/ipLDipLHipLLipLPipLTipLXipLbipLfipLjipLnipLripLvipLzipL3ipL7ipL8KK+KlgOKlgeKlguKlg+KlhOKlheKlhuKlh+KliOKlieKliuKli+KljOKljeKljuKlj+KlkOKlkeKlkuKlk+KllOKlleKlluKll+KlmOKlmeKlmuKlm+KlnOKlneKlnuKln+KloOKloeKlouKlo+KlpOKlpeKlpuKlp+KlqOKlqeKlquKlq+KlrOKlreKlruKlr+KlsOKlseKlsuKls+KltOKlteKltuKlt+KluOKlueKluuKlu+KlvOKlveKlvuKlvworCitNaXNjZWxsYW5lb3VzIE1hdGhlbWF0aWNhbCBTeW1ib2xzLUIgKFUrMjk4MC1VKzI5RkYpOgorCivipoDipoHipoLipoPipoTipoXipobipofipojiponiporipovipozipo3ipo7ipo/ippDippHippLippPippTippXippbippfippjippnipprippvippzipp3ipp7ipp/ipqDipqHipqLipqPipqTipqXipqbipqfipqjipqnipqripqvipqzipq3ipq7ipq/iprDiprHiprLiprPiprTiprXiprbiprfiprjiprniprriprviprzipr3ipr7ipr8KK+KngOKngeKnguKng+KnhOKnheKnhuKnh+KniOKnieKniuKni+KnjOKnjeKnjuKnj+KnkOKnkeKnkuKnk+KnlOKnleKnluKnl+KnmOKnmeKnmuKnm+KnnOKnneKnnuKnn+KnoOKnoeKnouKno+KnpOKnpeKnpuKnp+KnqOKnqeKnquKnq+KnrOKnreKnruKnr+KnsOKnseKnsuKns+KntOKnteKntuKnt+KnuOKnueKnuuKnu+KnvOKnveKnvuKnvworCitTdXBwbGVtZW50YWwgTWF0aGVtYXRpY2FsIE9wZXJhdG9ycyAoVSsyQTAwLVUrMkFGRik6CisKK+KogOKogeKoguKog+KohOKoheKohuKoh+KoiOKoieKoiuKoi+KojOKojeKojuKoj+KokOKokeKokuKok+KolOKoleKoluKol+KomOKomeKomuKom+KonOKoneKonuKon+KooOKooeKoouKoo+KopOKopeKopuKop+KoqOKoqeKoquKoq+KorOKoreKoruKor+KosOKoseKosuKos+KotOKoteKotuKot+KouOKoueKouuKou+KovOKoveKovuKovwor4qmA4qmB4qmC4qmD4qmE4qmF4qmG4qmH4qmI4qmJ4qmK4qmL4qmM4qmN4qmO4qmP4qmQ4qmR4qmS4qmT4qmU4qmV4qmW4qmX4qmY4qmZ4qma4qmb4qmc4qmd4qme4qmf4qmg4qmh4qmi4qmj4qmk4qml4qmm4qmn4qmo4qmp4qmq4qmr4qms4qmt4qmu4qmv4qmw4qmx4qmy4qmz4qm04qm14qm24qm34qm44qm54qm64qm74qm84qm94qm+4qm/CiviqoDiqoHiqoLiqoPiqoTiqoXiqobiqofiqojiqoniqoriqoviqoziqo3iqo7iqo/iqpDiqpHiqpLiqpPiqpTiqpXiqpbiqpfiqpjiqpniqpriqpviqpziqp3iqp7iqp/iqqDiqqHiqqLiqqPiqqTiqqXiqqbiqqfiqqjiqqniqqriqqviqqziqq3iqq7iqq/iqrDiqrHiqrLiqrPiqrTiqrXiqrbiqrfiqrjiqrniqrriqrviqrziqr3iqr7iqr8KK+KrgOKrgeKrguKrg+KrhOKrheKrhuKrh+KriOKrieKriuKri+KrjOKrjeKrjuKrj+KrkOKrkeKrkuKrk+KrlOKrleKrluKrl+KrmOKrmeKrmuKrm+KrnOKrneKrnuKrn+KroOKroeKrouKro+KrpOKrpeKrpuKrp+KrqOKrqeKrquKrq+KrrOKrreKrruKrr+KrsOKrseKrsuKrs+KrtOKrteKrtuKrt+KruOKrueKruuKru+KrvOKrveKrvuKrvworCitNaXNjZWxsYW5lb3VzIFN5bWJvbHMgYW5kIEFycm93cyAoVSsyQjAwLVUrMkJGRik6CisKK+KsgOKsgeKsguKsg+KshOKsheKshuKsh+KsiOKsieKsiuKsi+KsjOKsjeKsjuKsj+KskOKskeKskuKsk+KslOKsleKsluKsl+KsmOKsmeKsmuKsm+KsnOKsneKsnuKsn+KsoOKsoeKsouKso+KspOKspeKspuKsp+KsqOKsqeKsquKsq+KsrOKsreKsruKsr+KssOKsseKssuKss+KstOKsteKstuKst+KsuOKsueKsuuKsu+KsvOKsveKsvuKsvwor4q2A4q2B4q2C4q2D4q2E4q2F4q2G4q2H4q2I4q2J4q2K4q2L4q2M4q2N4q2O4q2P4q2Q4q2R4q2S4q2T4q2U4q2V4q2W4q2X4q2Y4q2Z4q2a4q2b4q2c4q2d4q2e4q2f4q2g4q2h4q2i4q2j4q2k4q2l4q2m4q2n4q2o4q2p4q2q4q2r4q2s4q2t4q2u4q2v4q2w4q2x4q2y4q2z4q204q214q224q234q244q254q264q274q284q294q2+4q2/CiviroDiroHiroLiroPiroTiroXirobirofirojironiroriroviroziro3iro7iro/irpDirpHirpLirpPirpTirpXirpbirpfirpjirpnirprirpvirpzirp3irp7irp/irqDirqHirqLirqPirqTirqXirqbirqfirqjirqnirqrirqvirqzirq3irq7irq/irrDirrHirrLirrPirrTirrXirrbirrfirrjirrnirrrirrvirrzirr3irr7irr8KK+KvgOKvgeKvguKvg+KvhOKvheKvhuKvh+KviOKvieKviuKvi+KvjOKvjeKvjuKvj+KvkOKvkeKvkuKvk+KvlOKvleKvluKvl+KvmOKvmeKvmuKvm+KvnOKvneKvnuKvn+KvoOKvoeKvouKvo+KvpOKvpeKvpuKvp+KvqOKvqeKvquKvq+KvrOKvreKvruKvr+KvsOKvseKvsuKvs+KvtOKvteKvtuKvt+KvuOKvueKvuuKvu+KvvOKvveKvvuKvvworCitGcmVlIGJsb2NrIChVKzJDMDAtVSsyRTdGKToKKwor4rCA4rCB4rCC4rCD4rCE4rCF4rCG4rCH4rCI4rCJ4rCK4rCL4rCM4rCN4rCO4rCP4rCQ4rCR4rCS4rCT4rCU4rCV4rCW4rCX4rCY4rCZ4rCa4rCb4rCc4rCd4rCe4rCf4rCg4rCh4rCi4rCj4rCk4rCl4rCm4rCn4rCo4rCp4rCq4rCr4rCs4rCt4rCu4rCv4rCw4rCx4rCy4rCz4rC04rC14rC24rC34rC44rC54rC64rC74rC84rC94rC+4rC/CivisYDisYHisYLisYPisYTisYXisYbisYfisYjisYnisYrisYvisYzisY3isY7isY/isZDisZHisZLisZPisZTisZXisZbisZfisZjisZnisZrisZvisZzisZ3isZ7isZ/isaDisaHisaLisaPisaTisaXisabisafisajisanisarisavisazisa3isa7isa/isbDisbHisbLisbPisbTisbXisbbisbfisbjisbnisbrisbvisbzisb3isb7isb8KK+KygOKygeKyguKyg+KyhOKyheKyhuKyh+KyiOKyieKyiuKyi+KyjOKyjeKyjuKyj+KykOKykeKykuKyk+KylOKyleKyluKyl+KymOKymeKymuKym+KynOKyneKynuKyn+KyoOKyoeKyouKyo+KypOKypeKypuKyp+KyqOKyqeKyquKyq+KyrOKyreKyruKyr+KysOKyseKysuKys+KytOKyteKytuKyt+KyuOKyueKyuuKyu+KyvOKyveKyvuKyvwor4rOA4rOB4rOC4rOD4rOE4rOF4rOG4rOH4rOI4rOJ4rOK4rOL4rOM4rON4rOO4rOP4rOQ4rOR4rOS4rOT4rOU4rOV4rOW4rOX4rOY4rOZ4rOa4rOb4rOc4rOd4rOe4rOf4rOg4rOh4rOi4rOj4rOk4rOl4rOm4rOn4rOo4rOp4rOq4rOr4rOs4rOt4rOu4rOv4rOw4rOx4rOy4rOz4rO04rO14rO24rO34rO44rO54rO64rO74rO84rO94rO+4rO/CivitIDitIHitILitIPitITitIXitIbitIfitIjitInitIritIvitIzitI3itI7itI/itJDitJHitJLitJPitJTitJXitJbitJfitJjitJnitJritJvitJzitJ3itJ7itJ/itKDitKHitKLitKPitKTitKXitKbitKfitKjitKnitKritKvitKzitK3itK7itK/itLDitLHitLLitLPitLTitLXitLbitLfitLjitLnitLritLvitLzitL3itL7itL8KK+K1gOK1geK1guK1g+K1hOK1heK1huK1h+K1iOK1ieK1iuK1i+K1jOK1jeK1juK1j+K1kOK1keK1kuK1k+K1lOK1leK1luK1l+K1mOK1meK1muK1m+K1nOK1neK1nuK1n+K1oOK1oeK1ouK1o+K1pOK1peK1puK1p+K1qOK1qeK1quK1q+K1rOK1reK1ruK1r+K1sOK1seK1suK1s+K1tOK1teK1tuK1t+K1uOK1ueK1uuK1u+K1vOK1veK1vuK1vwor4raA4raB4raC4raD4raE4raF4raG4raH4raI4raJ4raK4raL4raM4raN4raO4raP4raQ4raR4raS4raT4raU4raV4raW4raX4raY4raZ4raa4rab4rac4rad4rae4raf4rag4rah4rai4raj4rak4ral4ram4ran4rao4rap4raq4rar4ras4rat4rau4rav4raw4rax4ray4raz4ra04ra14ra24ra34ra44ra54ra64ra74ra84ra94ra+4ra/Civit4Dit4Hit4Lit4Pit4Tit4Xit4bit4fit4jit4nit4rit4vit4zit43it47it4/it5Dit5Hit5Lit5Pit5Tit5Xit5bit5fit5jit5nit5rit5vit5zit53it57it5/it6Dit6Hit6Lit6Pit6Tit6Xit6bit6fit6jit6nit6rit6vit6zit63it67it6/it7Dit7Hit7Lit7Pit7Tit7Xit7bit7fit7jit7nit7rit7vit7zit73it77it78KK+K4gOK4geK4guK4g+K4hOK4heK4huK4h+K4iOK4ieK4iuK4i+K4jOK4jeK4juK4j+K4kOK4keK4kuK4k+K4lOK4leK4luK4l+K4mOK4meK4muK4m+K4nOK4neK4nuK4n+K4oOK4oeK4ouK4o+K4pOK4peK4puK4p+K4qOK4qeK4quK4q+K4rOK4reK4ruK4r+K4sOK4seK4suK4s+K4tOK4teK4tuK4t+K4uOK4ueK4uuK4u+K4vOK4veK4vuK4vwor4rmA4rmB4rmC4rmD4rmE4rmF4rmG4rmH4rmI4rmJ4rmK4rmL4rmM4rmN4rmO4rmP4rmQ4rmR4rmS4rmT4rmU4rmV4rmW4rmX4rmY4rmZ4rma4rmb4rmc4rmd4rme4rmf4rmg4rmh4rmi4rmj4rmk4rml4rmm4rmn4rmo4rmp4rmq4rmr4rms4rmt4rmu4rmv4rmw4rmx4rmy4rmz4rm04rm14rm24rm34rm44rm54rm64rm74rm84rm94rm+4rm/CisKK0NKSyBSYWRpY2FscyBTdXBwbGVtZW50IChVKzJFODAtVSsyRUZGKToKKwor4rqA4rqB4rqC4rqD4rqE4rqF4rqG4rqH4rqI4rqJ4rqK4rqL4rqM4rqN4rqO4rqP4rqQ4rqR4rqS4rqT4rqU4rqV4rqW4rqX4rqY4rqZ4rqa4rqb4rqc4rqd4rqe4rqfCiviuqDiuqHiuqLiuqPiuqTiuqXiuqbiuqfiuqjiuqniuqriuqviuqziuq3iuq7iuq/iurDiurHiurLiurPiurTiurXiurbiurfiurjiurniurriurviurziur3iur7iur8KK+K7gOK7geK7guK7g+K7hOK7heK7huK7h+K7iOK7ieK7iuK7i+K7jOK7jeK7juK7j+K7kOK7keK7kuK7k+K7lOK7leK7luK7l+K7mOK7meK7muK7m+K7nOK7neK7nuK7nwor4rug4ruh4rui4ruj4ruk4rul4rum4run4ruo4rup4ruq4rur4rus4rut4ruu4ruv4ruw4rux4ruy4ruz4ru04ru14ru24ru34ru44ru54ru64ru74ru84ru94ru+4ru/CisKK0thbmd4aSBSYWRpY2FscyAoVSsyRjAwLVUrMkZERik6CisKK+K8gOK8geK8guK8g+K8hOK8heK8huK8h+K8iOK8ieK8iuK8i+K8jOK8jeK8juK8j+K8kOK8keK8kuK8k+K8lOK8leK8luK8l+K8mOK8meK8muK8m+K8nOK8neK8nuK8nwor4ryg4ryh4ryi4ryj4ryk4ryl4rym4ryn4ryo4ryp4ryq4ryr4rys4ryt4ryu4ryv4ryw4ryx4ryy4ryz4ry04ry14ry24ry34ry44ry54ry64ry74ry84ry94ry+4ry/CivivYDivYHivYLivYPivYTivYXivYbivYfivYjivYnivYrivYvivYzivY3ivY7ivY/ivZDivZHivZLivZPivZTivZXivZbivZfivZjivZnivZrivZvivZzivZ3ivZ7ivZ8KK+K9oOK9oeK9ouK9o+K9pOK9peK9puK9p+K9qOK9qeK9quK9q+K9rOK9reK9ruK9r+K9sOK9seK9suK9s+K9tOK9teK9tuK9t+K9uOK9ueK9uuK9u+K9vOK9veK9vuK9vwor4r6A4r6B4r6C4r6D4r6E4r6F4r6G4r6H4r6I4r6J4r6K4r6L4r6M4r6N4r6O4r6P4r6Q4r6R4r6S4r6T4r6U4r6V4r6W4r6X4r6Y4r6Z4r6a4r6b4r6c4r6d4r6e4r6fCivivqDivqHivqLivqPivqTivqXivqbivqfivqjivqnivqrivqvivqzivq3ivq7ivq/ivrDivrHivrLivrPivrTivrXivrbivrfivrjivrnivrrivrvivrzivr3ivr7ivr8KK+K/gOK/geK/guK/g+K/hOK/heK/huK/h+K/iOK/ieK/iuK/i+K/jOK/jeK/juK/j+K/kOK/keK/kuK/k+K/lOK/leK/luK/l+K/mOK/meK/muK/m+K/nOK/neK/nuK/nworCitGcmVlIGJsb2NrIChVKzJGRTAtVSsyRkVGKToKKwor4r+g4r+h4r+i4r+j4r+k4r+l4r+m4r+n4r+o4r+p4r+q4r+r4r+s4r+t4r+u4r+vCisKK0lkZW9ncmFwaGljIERlc2NyaXB0aW9uIENoYXJhY3RlcnMgKFUrMkZGMC1VKzJGRkYpOgorCiviv7Div7Hiv7Liv7Piv7Tiv7Xiv7biv7fiv7jiv7niv7riv7viv7ziv73iv77iv78KKworQ0pLIFN5bWJvbHMgYW5kIFB1bmN0dWF0aW9uIChVKzMwMDAtVSszMDNGKToKKwor44CA44CB44CC44CD44CE44CF44CG44CH44CI44CJ44CK44CL44CM44CN44CO44CP44CQ44CR44CS44CT44CU44CV44CW44CX44CY44CZ44Ca44Cb44Cc44Cd44Ce44CfCivjgKDjgKHjgKLjgKPjgKTjgKXjgKbjgKfjgKjjgKnil4zjgKril4zjgKvil4zjgKzil4zjgK3il4zjgK7il4zjgK/jgLDjgLHjgLLjgLPjgLTjgLXjgLbjgLfjgLjjgLnjgLrjgLvjgLzjgL3jgL7jgL8KKworSGlyYWdhbmEgKFUrMzA0MC1VKzMwOUYpOgorCivjgYDjgYHjgYLjgYPjgYTjgYXjgYbjgYfjgYjjgYnjgYrjgYvjgYzjgY3jgY7jgY/jgZDjgZHjgZLjgZPjgZTjgZXjgZbjgZfjgZjjgZnjgZrjgZvjgZzjgZ3jgZ7jgZ8KK+OBoOOBoeOBouOBo+OBpOOBpeOBpuOBp+OBqOOBqeOBquOBq+OBrOOBreOBruOBr+OBsOOBseOBsuOBs+OBtOOBteOBtuOBt+OBuOOBueOBuuOBu+OBvOOBveOBvuOBvwor44KA44KB44KC44KD44KE44KF44KG44KH44KI44KJ44KK44KL44KM44KN44KO44KP44KQ44KR44KS44KT44KU44KV44KW44KX44KY4peM44KZ4peM44Ka44Kb44Kc44Kd44Ke44KfCisKK0thdGFrYW5hIChVKzMwQTAtVSszMEZGKToKKwor44Kg44Kh44Ki44Kj44Kk44Kl44Km44Kn44Ko44Kp44Kq44Kr44Ks44Kt44Ku44Kv44Kw44Kx44Ky44Kz44K044K144K244K344K444K544K644K744K844K944K+44K/Civjg4Djg4Hjg4Ljg4Pjg4Tjg4Xjg4bjg4fjg4jjg4njg4rjg4vjg4zjg43jg47jg4/jg5Djg5Hjg5Ljg5Pjg5Tjg5Xjg5bjg5fjg5jjg5njg5rjg5vjg5zjg53jg57jg58KK+ODoOODoeODouODo+ODpOODpeODpuODp+ODqOODqeODquODq+ODrOODreODruODr+ODsOODseODsuODs+ODtOODteODtuODt+ODuOODueODuuODu+ODvOODveODvuODvworCitCb3BvbW9mbyAoVSszMTAwLVUrMzEyRik6CisKK+OEgOOEgeOEguOEg+OEhOOEheOEhuOEh+OEiOOEieOEiuOEi+OEjOOEjeOEjuOEj+OEkOOEkeOEkuOEk+OElOOEleOEluOEl+OEmOOEmeOEmuOEm+OEnOOEneOEnuOEnwor44Sg44Sh44Si44Sj44Sk44Sl44Sm44Sn44So44Sp44Sq44Sr44Ss44St44Su44SvCisKK0hhbmd1bCBDb21wYXRpYmlsaXR5IEphbW8gKFUrMzEzMC1VKzMxOEYpOgorCivjhLDjhLHjhLLjhLPjhLTjhLXjhLbjhLfjhLjjhLnjhLrjhLvjhLzjhL3jhL7jhL/jhYDjhYHjhYLjhYPjhYTjhYXjhYbjhYfjhYjjhYnjhYrjhYvjhYzjhY3jhY7jhY8KK+OFkOOFkeOFkuOFk+OFlOOFleOFluOFl+OFmOOFmeOFmuOFm+OFnOOFneOFnuOFn+OFoOOFoeOFouOFo+OFpOOFpeOFpuOFp+OFqOOFqeOFquOFq+OFrOOFreOFruOFrwor44Ww44Wx44Wy44Wz44W044W144W244W344W444W544W644W744W844W944W+44W/44aA44aB44aC44aD44aE44aF44aG44aH44aI44aJ44aK44aL44aM44aN44aO44aPCisKK0thbmJ1biAoVSszMTkwLVUrMzE5Rik6CisKK+OGkOOGkeOGkuOGk+OGlOOGleOGluOGl+OGmOOGmeOGmuOGm+OGnOOGneOGnuOGnworCitCb3BvbW9mbyBFeHRlbmRlZCAoVSszMUEwLVUrMzFCRik6CisKK+OGoOOGoeOGouOGo+OGpOOGpeOGpuOGp+OGqOOGqeOGquOGq+OGrOOGreOGruOGr+OGsOOGseOGsuOGs+OGtOOGteOGtuOGt+OGuOOGueOGuuOGu+OGvOOGveOGvuOGvworCitGcmVlIGJsb2NrIChVKzMxQzAtVSszMUVGKToKKwor44eA44eB44eC44eD44eE44eF44eG44eH44eI44eJ44eK44eL44eM44eN44eO44eP44eQ44eR44eS44eT44eU44eV44eW44eX44eY44eZ44ea44eb44ec44ed44ee44efCivjh6Djh6Hjh6Ljh6Pjh6Tjh6Xjh6bjh6fjh6jjh6njh6rjh6vjh6zjh63jh67jh68KKworS2F0YWthbmEgUGhvbmV0aWMgRXh0ZW5zaW9ucyAoVSszMUYwLVUrMzFGRik6CisKK+OHsOOHseOHsuOHs+OHtOOHteOHtuOHt+OHuOOHueOHuuOHu+OHvOOHveOHvuOHvworCitFbmNsb3NlZCBDSksgTGV0dGVycyBhbmQgTW9udGhzIChVKzMyMDAtVSszMkZGKToKKwor44iA44iB44iC44iD44iE44iF44iG44iH44iI44iJ44iK44iL44iM44iN44iO44iP44iQ44iR44iS44iT44iU44iV44iW44iX44iY44iZ44ia44ib44ic44id44ie44ifCivjiKDjiKHjiKLjiKPjiKTjiKXjiKbjiKfjiKjjiKnjiKrjiKvjiKzjiK3jiK7jiK/jiLDjiLHjiLLjiLPjiLTjiLXjiLbjiLfjiLjjiLnjiLrjiLvjiLzjiL3jiL7jiL8KK+OJgOOJgeOJguOJg+OJhOOJheOJhuOJh+OJiOOJieOJiuOJi+OJjOOJjeOJjuOJj+OJkOOJkeOJkuOJk+OJlOOJleOJluOJl+OJmOOJmeOJmuOJm+OJnOOJneOJnuOJnwor44mg44mh44mi44mj44mk44ml44mm44mn44mo44mp44mq44mr44ms44mt44mu44mv44mw44mx44my44mz44m044m144m244m344m444m544m644m744m844m944m+44m/CivjioDjioHjioLjioPjioTjioXjiobjiofjiojjionjiorjiovjiozjio3jio7jio/jipDjipHjipLjipPjipTjipXjipbjipfjipjjipnjiprjipvjipzjip3jip7jip8KK+OKoOOKoeOKouOKo+OKpOOKpeOKpuOKp+OKqOOKqeOKquOKq+OKrOOKreOKruOKr+OKsOOKseOKsuOKs+OKtOOKteOKtuOKt+OKuOOKueOKuuOKu+OKvOOKveOKvuOKvwor44uA44uB44uC44uD44uE44uF44uG44uH44uI44uJ44uK44uL44uM44uN44uO44uP44uQ44uR44uS44uT44uU44uV44uW44uX44uY44uZ44ua44ub44uc44ud44ue44ufCivji6Dji6Hji6Lji6Pji6Tji6Xji6bji6fji6jji6nji6rji6vji6zji63ji67ji6/ji7Dji7Hji7Lji7Pji7Tji7Xji7bji7fji7jji7nji7rji7vji7zji73ji77ji78KKworQ0pLIENvbXBhdGliaWxpdHkgKFUrMzMwMC1VKzMzRkYpOgorCivjjIDjjIHjjILjjIPjjITjjIXjjIbjjIfjjIjjjInjjIrjjIvjjIzjjI3jjI7jjI/jjJDjjJHjjJLjjJPjjJTjjJXjjJbjjJfjjJjjjJnjjJrjjJvjjJzjjJ3jjJ7jjJ8KK+OMoOOMoeOMouOMo+OMpOOMpeOMpuOMp+OMqOOMqeOMquOMq+OMrOOMreOMruOMr+OMsOOMseOMsuOMs+OMtOOMteOMtuOMt+OMuOOMueOMuuOMu+OMvOOMveOMvuOMvwor442A442B442C442D442E442F442G442H442I442J442K442L442M442N442O442P442Q442R442S442T442U442V442W442X442Y442Z442a442b442c442d442e442fCivjjaDjjaHjjaLjjaPjjaTjjaXjjabjjafjjajjjanjjarjjavjjazjja3jja7jja/jjbDjjbHjjbLjjbPjjbTjjbXjjbbjjbfjjbjjjbnjjbrjjbvjjbzjjb3jjb7jjb8KK+OOgOOOgeOOguOOg+OOhOOOheOOhuOOh+OOiOOOieOOiuOOi+OOjOOOjeOOjuOOj+OOkOOOkeOOkuOOk+OOlOOOleOOluOOl+OOmOOOmeOOmuOOm+OOnOOOneOOnuOOnwor446g446h446i446j446k446l446m446n446o446p446q446r446s446t446u446v446w446x446y446z4460446144624463446444654466446744684469446+446/Civjj4Djj4Hjj4Ljj4Pjj4Tjj4Xjj4bjj4fjj4jjj4njj4rjj4vjj4zjj43jj47jj4/jj5Djj5Hjj5Ljj5Pjj5Tjj5Xjj5bjj5fjj5jjj5njj5rjj5vjj5zjj53jj57jj58KK+OPoOOPoeOPouOPo+OPpOOPpeOPpuOPp+OPqOOPqeOPquOPq+OPrOOPreOPruOPr+OPsOOPseOPsuOPs+OPtOOPteOPtuOPt+OPuOOPueOPuuOPu+OPvOOPveOPvuOPvworCitDSksgVW5pZmllZCBJZGVvZ3JhcGhzIEV4dGVuc2lvbiBBIChVKzM0MDAtVSs0REJGKToKKwor45CA45CB45CC45CD45CE45CF45CG45CH45CI45CJ45CK45CL45CM45CN45CO45CP45CQ45CR45CS45CT45CU45CV45CW45CX45CY45CZ45Ca45Cb45Cc45Cd45Ce45CfCivjkKDjkKHjkKLjkKPjkKTjkKXjkKbjkKfjkKjjkKnjkKrjkKvjkKzjkK3jkK7jkK/jkLDjkLHjkLLjkLPjkLTjkLXjkLbjkLfjkLjjkLnjkLrjkLvjkLzjkL3jkL7jkL8KK+ORgOORgeORguORg+ORhOORheORhuORh+ORiOORieORiuORi+ORjOORjeORjuORj+ORkOORkeORkuORk+ORlOORleORluORl+ORmOORmeORmuORm+ORnOORneORnuORnwor45Gg45Gh45Gi45Gj45Gk45Gl45Gm45Gn45Go45Gp45Gq45Gr45Gs45Gt45Gu45Gv45Gw45Gx45Gy45Gz45G045G145G245G345G445G545G645G745G845G945G+45G/CivjkoDjkoHjkoLjkoPjkoTjkoXjkobjkofjkojjkonjkorjkovjkozjko3jko7jko/jkpDjkpHjkpLjkpPjkpTjkpXjkpbjkpfjkpjjkpnjkprjkpvjkpzjkp3jkp7jkp8KK+OSoOOSoeOSouOSo+OSpOOSpeOSpuOSp+OSqOOSqeOSquOSq+OSrOOSreOSruOSr+OSsOOSseOSsuOSs+OStOOSteOStuOSt+OSuOOSueOSuuOSu+OSvOOSveOSvuOSvwor45OA45OB45OC45OD45OE45OF45OG45OH45OI45OJ45OK45OL45OM45ON45OO45OP45OQ45OR45OS45OT45OU45OV45OW45OX45OY45OZ45Oa45Ob45Oc45Od45Oe45OfCivjk6Djk6Hjk6Ljk6Pjk6Tjk6Xjk6bjk6fjk6jjk6njk6rjk6vjk6zjk63jk67jk6/jk7Djk7Hjk7Ljk7Pjk7Tjk7Xjk7bjk7fjk7jjk7njk7rjk7vjk7zjk73jk77jk78KK+OUgOOUgeOUguOUg+OUhOOUheOUhuOUh+OUiOOUieOUiuOUi+OUjOOUjeOUjuOUj+OUkOOUkeOUkuOUk+OUlOOUleOUluOUl+OUmOOUmeOUmuOUm+OUnOOUneOUnuOUnwor45Sg45Sh45Si45Sj45Sk45Sl45Sm45Sn45So45Sp45Sq45Sr45Ss45St45Su45Sv45Sw45Sx45Sy45Sz45S045S145S245S345S445S545S645S745S845S945S+45S/CivjlYDjlYHjlYLjlYPjlYTjlYXjlYbjlYfjlYjjlYnjlYrjlYvjlYzjlY3jlY7jlY/jlZDjlZHjlZLjlZPjlZTjlZXjlZbjlZfjlZjjlZnjlZrjlZvjlZzjlZ3jlZ7jlZ8KK+OVoOOVoeOVouOVo+OVpOOVpeOVpuOVp+OVqOOVqeOVquOVq+OVrOOVreOVruOVr+OVsOOVseOVsuOVs+OVtOOVteOVtuOVt+OVuOOVueOVuuOVu+OVvOOVveOVvuOVvwor45aA45aB45aC45aD45aE45aF45aG45aH45aI45aJ45aK45aL45aM45aN45aO45aP45aQ45aR45aS45aT45aU45aV45aW45aX45aY45aZ45aa45ab45ac45ad45ae45afCivjlqDjlqHjlqLjlqPjlqTjlqXjlqbjlqfjlqjjlqnjlqrjlqvjlqzjlq3jlq7jlq/jlrDjlrHjlrLjlrPjlrTjlrXjlrbjlrfjlrjjlrnjlrrjlrvjlrzjlr3jlr7jlr8KK+OXgOOXgeOXguOXg+OXhOOXheOXhuOXh+OXiOOXieOXiuOXi+OXjOOXjeOXjuOXj+OXkOOXkeOXkuOXk+OXlOOXleOXluOXl+OXmOOXmeOXmuOXm+OXnOOXneOXnuOXnwor45eg45eh45ei45ej45ek45el45em45en45eo45ep45eq45er45es45et45eu45ev45ew45ex45ey45ez45e045e145e245e345e445e545e645e745e845e945e+45e/CivjmIDjmIHjmILjmIPjmITjmIXjmIbjmIfjmIjjmInjmIrjmIvjmIzjmI3jmI7jmI/jmJDjmJHjmJLjmJPjmJTjmJXjmJbjmJfjmJjjmJnjmJrjmJvjmJzjmJ3jmJ7jmJ8KK+OYoOOYoeOYouOYo+OYpOOYpeOYpuOYp+OYqOOYqeOYquOYq+OYrOOYreOYruOYr+OYsOOYseOYsuOYs+OYtOOYteOYtuOYt+OYuOOYueOYuuOYu+OYvOOYveOYvuOYvwor45mA45mB45mC45mD45mE45mF45mG45mH45mI45mJ45mK45mL45mM45mN45mO45mP45mQ45mR45mS45mT45mU45mV45mW45mX45mY45mZ45ma45mb45mc45md45me45mfCivjmaDjmaHjmaLjmaPjmaTjmaXjmabjmafjmajjmanjmarjmavjmazjma3jma7jma/jmbDjmbHjmbLjmbPjmbTjmbXjmbbjmbfjmbjjmbnjmbrjmbvjmbzjmb3jmb7jmb8KK+OagOOageOaguOag+OahOOaheOahuOah+OaiOOaieOaiuOai+OajOOajeOajuOaj+OakOOakeOakuOak+OalOOaleOaluOal+OamOOameOamuOam+OanOOaneOanuOanwor45qg45qh45qi45qj45qk45ql45qm45qn45qo45qp45qq45qr45qs45qt45qu45qv45qw45qx45qy45qz45q045q145q245q345q445q545q645q745q845q945q+45q/Civjm4Djm4Hjm4Ljm4Pjm4Tjm4Xjm4bjm4fjm4jjm4njm4rjm4vjm4zjm43jm47jm4/jm5Djm5Hjm5Ljm5Pjm5Tjm5Xjm5bjm5fjm5jjm5njm5rjm5vjm5zjm53jm57jm58KK+OboOOboeObouObo+ObpOObpeObpuObp+ObqOObqeObquObq+ObrOObreObruObr+ObsOObseObsuObs+ObtOObteObtuObt+ObuOObueObuuObu+ObvOObveObvuObvwor45yA45yB45yC45yD45yE45yF45yG45yH45yI45yJ45yK45yL45yM45yN45yO45yP45yQ45yR45yS45yT45yU45yV45yW45yX45yY45yZ45ya45yb45yc45yd45ye45yfCivjnKDjnKHjnKLjnKPjnKTjnKXjnKbjnKfjnKjjnKnjnKrjnKvjnKzjnK3jnK7jnK/jnLDjnLHjnLLjnLPjnLTjnLXjnLbjnLfjnLjjnLnjnLrjnLvjnLzjnL3jnL7jnL8KK+OdgOOdgeOdguOdg+OdhOOdheOdhuOdh+OdiOOdieOdiuOdi+OdjOOdjeOdjuOdj+OdkOOdkeOdkuOdk+OdlOOdleOdluOdl+OdmOOdmeOdmuOdm+OdnOOdneOdnuOdnwor452g452h452i452j452k452l452m452n452o452p452q452r452s452t452u452v452w452x452y452z4520452145224523452445254526452745284529452+452/CivjnoDjnoHjnoLjnoPjnoTjnoXjnobjnofjnojjnonjnorjnovjnozjno3jno7jno/jnpDjnpHjnpLjnpPjnpTjnpXjnpbjnpfjnpjjnpnjnprjnpvjnpzjnp3jnp7jnp8KK+OeoOOeoeOeouOeo+OepOOepeOepuOep+OeqOOeqeOequOeq+OerOOereOeruOer+OesOOeseOesuOes+OetOOeteOetuOet+OeuOOeueOeuuOeu+OevOOeveOevuOevwor45+A45+B45+C45+D45+E45+F45+G45+H45+I45+J45+K45+L45+M45+N45+O45+P45+Q45+R45+S45+T45+U45+V45+W45+X45+Y45+Z45+a45+b45+c45+d45+e45+fCivjn6Djn6Hjn6Ljn6Pjn6Tjn6Xjn6bjn6fjn6jjn6njn6rjn6vjn6zjn63jn67jn6/jn7Djn7Hjn7Ljn7Pjn7Tjn7Xjn7bjn7fjn7jjn7njn7rjn7vjn7zjn73jn77jn78KK+OggOOggeOgguOgg+OghOOgheOghuOgh+OgiOOgieOgiuOgi+OgjOOgjeOgjuOgj+OgkOOgkeOgkuOgk+OglOOgleOgluOgl+OgmOOgmeOgmuOgm+OgnOOgneOgnuOgnwor46Cg46Ch46Ci46Cj46Ck46Cl46Cm46Cn46Co46Cp46Cq46Cr46Cs46Ct46Cu46Cv46Cw46Cx46Cy46Cz46C046C146C246C346C446C546C646C746C846C946C+46C/CivjoYDjoYHjoYLjoYPjoYTjoYXjoYbjoYfjoYjjoYnjoYrjoYvjoYzjoY3joY7joY/joZDjoZHjoZLjoZPjoZTjoZXjoZbjoZfjoZjjoZnjoZrjoZvjoZzjoZ3joZ7joZ8KK+OhoOOhoeOhouOho+OhpOOhpeOhpuOhp+OhqOOhqeOhquOhq+OhrOOhreOhruOhr+OhsOOhseOhsuOhs+OhtOOhteOhtuOht+OhuOOhueOhuuOhu+OhvOOhveOhvuOhvwor46KA46KB46KC46KD46KE46KF46KG46KH46KI46KJ46KK46KL46KM46KN46KO46KP46KQ46KR46KS46KT46KU46KV46KW46KX46KY46KZ46Ka46Kb46Kc46Kd46Ke46KfCivjoqDjoqHjoqLjoqPjoqTjoqXjoqbjoqfjoqjjoqnjoqrjoqvjoqzjoq3joq7joq/jorDjorHjorLjorPjorTjorXjorbjorfjorjjornjorrjorvjorzjor3jor7jor8KK+OjgOOjgeOjguOjg+OjhOOjheOjhuOjh+OjiOOjieOjiuOji+OjjOOjjeOjjuOjj+OjkOOjkeOjkuOjk+OjlOOjleOjluOjl+OjmOOjmeOjmuOjm+OjnOOjneOjnuOjnwor46Og46Oh46Oi46Oj46Ok46Ol46Om46On46Oo46Op46Oq46Or46Os46Ot46Ou46Ov46Ow46Ox46Oy46Oz46O046O146O246O346O446O546O646O746O846O946O+46O/CivjpIDjpIHjpILjpIPjpITjpIXjpIbjpIfjpIjjpInjpIrjpIvjpIzjpI3jpI7jpI/jpJDjpJHjpJLjpJPjpJTjpJXjpJbjpJfjpJjjpJnjpJrjpJvjpJzjpJ3jpJ7jpJ8KK+OkoOOkoeOkouOko+OkpOOkpeOkpuOkp+OkqOOkqeOkquOkq+OkrOOkreOkruOkr+OksOOkseOksuOks+OktOOkteOktuOkt+OkuOOkueOkuuOku+OkvOOkveOkvuOkvwor46WA46WB46WC46WD46WE46WF46WG46WH46WI46WJ46WK46WL46WM46WN46WO46WP46WQ46WR46WS46WT46WU46WV46WW46WX46WY46WZ46Wa46Wb46Wc46Wd46We46WfCivjpaDjpaHjpaLjpaPjpaTjpaXjpabjpafjpajjpanjparjpavjpazjpa3jpa7jpa/jpbDjpbHjpbLjpbPjpbTjpbXjpbbjpbfjpbjjpbnjpbrjpbvjpbzjpb3jpb7jpb8KK+OmgOOmgeOmguOmg+OmhOOmheOmhuOmh+OmiOOmieOmiuOmi+OmjOOmjeOmjuOmj+OmkOOmkeOmkuOmk+OmlOOmleOmluOml+OmmOOmmeOmmuOmm+OmnOOmneOmnuOmnwor46ag46ah46ai46aj46ak46al46am46an46ao46ap46aq46ar46as46at46au46av46aw46ax46ay46az46a046a146a246a346a446a546a646a746a846a946a+46a/Civjp4Djp4Hjp4Ljp4Pjp4Tjp4Xjp4bjp4fjp4jjp4njp4rjp4vjp4zjp43jp47jp4/jp5Djp5Hjp5Ljp5Pjp5Tjp5Xjp5bjp5fjp5jjp5njp5rjp5vjp5zjp53jp57jp58KK+OnoOOnoeOnouOno+OnpOOnpeOnpuOnp+OnqOOnqeOnquOnq+OnrOOnreOnruOnr+OnsOOnseOnsuOns+OntOOnteOntuOnt+OnuOOnueOnuuOnu+OnvOOnveOnvuOnvwor46iA46iB46iC46iD46iE46iF46iG46iH46iI46iJ46iK46iL46iM46iN46iO46iP46iQ46iR46iS46iT46iU46iV46iW46iX46iY46iZ46ia46ib46ic46id46ie46ifCivjqKDjqKHjqKLjqKPjqKTjqKXjqKbjqKfjqKjjqKnjqKrjqKvjqKzjqK3jqK7jqK/jqLDjqLHjqLLjqLPjqLTjqLXjqLbjqLfjqLjjqLnjqLrjqLvjqLzjqL3jqL7jqL8KK+OpgOOpgeOpguOpg+OphOOpheOphuOph+OpiOOpieOpiuOpi+OpjOOpjeOpjuOpj+OpkOOpkeOpkuOpk+OplOOpleOpluOpl+OpmOOpmeOpmuOpm+OpnOOpneOpnuOpnwor46mg46mh46mi46mj46mk46ml46mm46mn46mo46mp46mq46mr46ms46mt46mu46mv46mw46mx46my46mz46m046m146m246m346m446m546m646m746m846m946m+46m/CivjqoDjqoHjqoLjqoPjqoTjqoXjqobjqofjqojjqonjqorjqovjqozjqo3jqo7jqo/jqpDjqpHjqpLjqpPjqpTjqpXjqpbjqpfjqpjjqpnjqprjqpvjqpzjqp3jqp7jqp8KK+OqoOOqoeOqouOqo+OqpOOqpeOqpuOqp+OqqOOqqeOqquOqq+OqrOOqreOqruOqr+OqsOOqseOqsuOqs+OqtOOqteOqtuOqt+OquOOqueOquuOqu+OqvOOqveOqvuOqvwor46uA46uB46uC46uD46uE46uF46uG46uH46uI46uJ46uK46uL46uM46uN46uO46uP46uQ46uR46uS46uT46uU46uV46uW46uX46uY46uZ46ua46ub46uc46ud46ue46ufCivjq6Djq6Hjq6Ljq6Pjq6Tjq6Xjq6bjq6fjq6jjq6njq6rjq6vjq6zjq63jq67jq6/jq7Djq7Hjq7Ljq7Pjq7Tjq7Xjq7bjq7fjq7jjq7njq7rjq7vjq7zjq73jq77jq78KK+OsgOOsgeOsguOsg+OshOOsheOshuOsh+OsiOOsieOsiuOsi+OsjOOsjeOsjuOsj+OskOOskeOskuOsk+OslOOsleOsluOsl+OsmOOsmeOsmuOsm+OsnOOsneOsnuOsnwor46yg46yh46yi46yj46yk46yl46ym46yn46yo46yp46yq46yr46ys46yt46yu46yv46yw46yx46yy46yz46y046y146y246y346y446y546y646y746y846y946y+46y/CivjrYDjrYHjrYLjrYPjrYTjrYXjrYbjrYfjrYjjrYnjrYrjrYvjrYzjrY3jrY7jrY/jrZDjrZHjrZLjrZPjrZTjrZXjrZbjrZfjrZjjrZnjrZrjrZvjrZzjrZ3jrZ7jrZ8KK+OtoOOtoeOtouOto+OtpOOtpeOtpuOtp+OtqOOtqeOtquOtq+OtrOOtreOtruOtr+OtsOOtseOtsuOts+OttOOtteOttuOtt+OtuOOtueOtuuOtu+OtvOOtveOtvuOtvwor466A466B466C466D466E466F466G466H466I466J466K466L466M466N466O466P466Q466R466S466T466U466V466W466X466Y466Z466a466b466c466d466e466fCivjrqDjrqHjrqLjrqPjrqTjrqXjrqbjrqfjrqjjrqnjrqrjrqvjrqzjrq3jrq7jrq/jrrDjrrHjrrLjrrPjrrTjrrXjrrbjrrfjrrjjrrnjrrrjrrvjrrzjrr3jrr7jrr8KK+OvgOOvgeOvguOvg+OvhOOvheOvhuOvh+OviOOvieOviuOvi+OvjOOvjeOvjuOvj+OvkOOvkeOvkuOvk+OvlOOvleOvluOvl+OvmOOvmeOvmuOvm+OvnOOvneOvnuOvnwor46+g46+h46+i46+j46+k46+l46+m46+n46+o46+p46+q46+r46+s46+t46+u46+v46+w46+x46+y46+z46+046+146+246+346+446+546+646+746+846+946++46+/CivjsIDjsIHjsILjsIPjsITjsIXjsIbjsIfjsIjjsInjsIrjsIvjsIzjsI3jsI7jsI/jsJDjsJHjsJLjsJPjsJTjsJXjsJbjsJfjsJjjsJnjsJrjsJvjsJzjsJ3jsJ7jsJ8KK+OwoOOwoeOwouOwo+OwpOOwpeOwpuOwp+OwqOOwqeOwquOwq+OwrOOwreOwruOwr+OwsOOwseOwsuOws+OwtOOwteOwtuOwt+OwuOOwueOwuuOwu+OwvOOwveOwvuOwvwor47GA47GB47GC47GD47GE47GF47GG47GH47GI47GJ47GK47GL47GM47GN47GO47GP47GQ47GR47GS47GT47GU47GV47GW47GX47GY47GZ47Ga47Gb47Gc47Gd47Ge47GfCivjsaDjsaHjsaLjsaPjsaTjsaXjsabjsafjsajjsanjsarjsavjsazjsa3jsa7jsa/jsbDjsbHjsbLjsbPjsbTjsbXjsbbjsbfjsbjjsbnjsbrjsbvjsbzjsb3jsb7jsb8KK+OygOOygeOyguOyg+OyhOOyheOyhuOyh+OyiOOyieOyiuOyi+OyjOOyjeOyjuOyj+OykOOykeOykuOyk+OylOOyleOyluOyl+OymOOymeOymuOym+OynOOyneOynuOynwor47Kg47Kh47Ki47Kj47Kk47Kl47Km47Kn47Ko47Kp47Kq47Kr47Ks47Kt47Ku47Kv47Kw47Kx47Ky47Kz47K047K147K247K347K447K547K647K747K847K947K+47K/Civjs4Djs4Hjs4Ljs4Pjs4Tjs4Xjs4bjs4fjs4jjs4njs4rjs4vjs4zjs43js47js4/js5Djs5Hjs5Ljs5Pjs5Tjs5Xjs5bjs5fjs5jjs5njs5rjs5vjs5zjs53js57js58KK+OzoOOzoeOzouOzo+OzpOOzpeOzpuOzp+OzqOOzqeOzquOzq+OzrOOzreOzruOzr+OzsOOzseOzsuOzs+OztOOzteOztuOzt+OzuOOzueOzuuOzu+OzvOOzveOzvuOzvwor47SA47SB47SC47SD47SE47SF47SG47SH47SI47SJ47SK47SL47SM47SN47SO47SP47SQ47SR47SS47ST47SU47SV47SW47SX47SY47SZ47Sa47Sb47Sc47Sd47Se47SfCivjtKDjtKHjtKLjtKPjtKTjtKXjtKbjtKfjtKjjtKnjtKrjtKvjtKzjtK3jtK7jtK/jtLDjtLHjtLLjtLPjtLTjtLXjtLbjtLfjtLjjtLnjtLrjtLvjtLzjtL3jtL7jtL8KK+O1gOO1geO1guO1g+O1hOO1heO1huO1h+O1iOO1ieO1iuO1i+O1jOO1jeO1juO1j+O1kOO1keO1kuO1k+O1lOO1leO1luO1l+O1mOO1meO1muO1m+O1nOO1neO1nuO1nwor47Wg47Wh47Wi47Wj47Wk47Wl47Wm47Wn47Wo47Wp47Wq47Wr47Ws47Wt47Wu47Wv47Ww47Wx47Wy47Wz47W047W147W247W347W447W547W647W747W847W947W+47W/CivjtoDjtoHjtoLjtoPjtoTjtoXjtobjtofjtojjtonjtorjtovjtozjto3jto7jto/jtpDjtpHjtpLjtpPjtpTjtpXjtpbjtpfjtpjjtpnjtprjtpvjtpzjtp3jtp7jtp8KK+O2oOO2oeO2ouO2o+O2pOO2peO2puO2p+O2qOO2qeO2quO2q+O2rOO2reO2ruO2r+O2sOO2seO2suO2s+O2tOO2teO2tuO2t+O2uOO2ueO2uuO2u+O2vOO2veO2vuO2vwor47eA47eB47eC47eD47eE47eF47eG47eH47eI47eJ47eK47eL47eM47eN47eO47eP47eQ47eR47eS47eT47eU47eV47eW47eX47eY47eZ47ea47eb47ec47ed47ee47efCivjt6Djt6Hjt6Ljt6Pjt6Tjt6Xjt6bjt6fjt6jjt6njt6rjt6vjt6zjt63jt67jt6/jt7Djt7Hjt7Ljt7Pjt7Tjt7Xjt7bjt7fjt7jjt7njt7rjt7vjt7zjt73jt77jt78KK+O4gOO4geO4guO4g+O4hOO4heO4huO4h+O4iOO4ieO4iuO4i+O4jOO4jeO4juO4j+O4kOO4keO4kuO4k+O4lOO4leO4luO4l+O4mOO4meO4muO4m+O4nOO4neO4nuO4nwor47ig47ih47ii47ij47ik47il47im47in47io47ip47iq47ir47is47it47iu47iv47iw47ix47iy47iz47i047i147i247i347i447i547i647i747i847i947i+47i/CivjuYDjuYHjuYLjuYPjuYTjuYXjuYbjuYfjuYjjuYnjuYrjuYvjuYzjuY3juY7juY/juZDjuZHjuZLjuZPjuZTjuZXjuZbjuZfjuZjjuZnjuZrjuZvjuZzjuZ3juZ7juZ8KK+O5oOO5oeO5ouO5o+O5pOO5peO5puO5p+O5qOO5qeO5quO5q+O5rOO5reO5ruO5r+O5sOO5seO5suO5s+O5tOO5teO5tuO5t+O5uOO5ueO5uuO5u+O5vOO5veO5vuO5vwor47qA47qB47qC47qD47qE47qF47qG47qH47qI47qJ47qK47qL47qM47qN47qO47qP47qQ47qR47qS47qT47qU47qV47qW47qX47qY47qZ47qa47qb47qc47qd47qe47qfCivjuqDjuqHjuqLjuqPjuqTjuqXjuqbjuqfjuqjjuqnjuqrjuqvjuqzjuq3juq7juq/jurDjurHjurLjurPjurTjurXjurbjurfjurjjurnjurrjurvjurzjur3jur7jur8KK+O7gOO7geO7guO7g+O7hOO7heO7huO7h+O7iOO7ieO7iuO7i+O7jOO7jeO7juO7j+O7kOO7keO7kuO7k+O7lOO7leO7luO7l+O7mOO7meO7muO7m+O7nOO7neO7nuO7nwor47ug47uh47ui47uj47uk47ul47um47un47uo47up47uq47ur47us47ut47uu47uv47uw47ux47uy47uz47u047u147u247u347u447u547u647u747u847u947u+47u/CivjvIDjvIHjvILjvIPjvITjvIXjvIbjvIfjvIjjvInjvIrjvIvjvIzjvI3jvI7jvI/jvJDjvJHjvJLjvJPjvJTjvJXjvJbjvJfjvJjjvJnjvJrjvJvjvJzjvJ3jvJ7jvJ8KK+O8oOO8oeO8ouO8o+O8pOO8peO8puO8p+O8qOO8qeO8quO8q+O8rOO8reO8ruO8r+O8sOO8seO8suO8s+O8tOO8teO8tuO8t+O8uOO8ueO8uuO8u+O8vOO8veO8vuO8vwor472A472B472C472D472E472F472G472H472I472J472K472L472M472N472O472P472Q472R472S472T472U472V472W472X472Y472Z472a472b472c472d472e472fCivjvaDjvaHjvaLjvaPjvaTjvaXjvabjvafjvajjvanjvarjvavjvazjva3jva7jva/jvbDjvbHjvbLjvbPjvbTjvbXjvbbjvbfjvbjjvbnjvbrjvbvjvbzjvb3jvb7jvb8KK+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+nwor476g476h476i476j476k476l476m476n476o476p476q476r476s476t476u476v476w476x476y476z4760476147624763476447654766476747684769476+476/Civjv4Djv4Hjv4Ljv4Pjv4Tjv4Xjv4bjv4fjv4jjv4njv4rjv4vjv4zjv43jv47jv4/jv5Djv5Hjv5Ljv5Pjv5Tjv5Xjv5bjv5fjv5jjv5njv5rjv5vjv5zjv53jv57jv58KK+O/oOO/oeO/ouO/o+O/pOO/peO/puO/p+O/qOO/qeO/quO/q+O/rOO/reO/ruO/r+O/sOO/seO/suO/s+O/tOO/teO/tuO/t+O/uOO/ueO/uuO/u+O/vOO/veO/vuO/vwor5ICA5ICB5ICC5ICD5ICE5ICF5ICG5ICH5ICI5ICJ5ICK5ICL5ICM5ICN5ICO5ICP5ICQ5ICR5ICS5ICT5ICU5ICV5ICW5ICX5ICY5ICZ5ICa5ICb5ICc5ICd5ICe5ICfCivkgKDkgKHkgKLkgKPkgKTkgKXkgKbkgKfkgKjkgKnkgKrkgKvkgKzkgK3kgK7kgK/kgLDkgLHkgLLkgLPkgLTkgLXkgLbkgLfkgLjkgLnkgLrkgLvkgLzkgL3kgL7kgL8KK+SBgOSBgeSBguSBg+SBhOSBheSBhuSBh+SBiOSBieSBiuSBi+SBjOSBjeSBjuSBj+SBkOSBkeSBkuSBk+SBlOSBleSBluSBl+SBmOSBmeSBmuSBm+SBnOSBneSBnuSBnwor5IGg5IGh5IGi5IGj5IGk5IGl5IGm5IGn5IGo5IGp5IGq5IGr5IGs5IGt5IGu5IGv5IGw5IGx5IGy5IGz5IG05IG15IG25IG35IG45IG55IG65IG75IG85IG95IG+5IG/CivkgoDkgoHkgoLkgoPkgoTkgoXkgobkgofkgojkgonkgorkgovkgozkgo3kgo7kgo/kgpDkgpHkgpLkgpPkgpTkgpXkgpbkgpfkgpjkgpnkgprkgpvkgpzkgp3kgp7kgp8KK+SCoOSCoeSCouSCo+SCpOSCpeSCpuSCp+SCqOSCqeSCquSCq+SCrOSCreSCruSCr+SCsOSCseSCsuSCs+SCtOSCteSCtuSCt+SCuOSCueSCuuSCu+SCvOSCveSCvuSCvwor5IOA5IOB5IOC5IOD5IOE5IOF5IOG5IOH5IOI5IOJ5IOK5IOL5IOM5ION5IOO5IOP5IOQ5IOR5IOS5IOT5IOU5IOV5IOW5IOX5IOY5IOZ5IOa5IOb5IOc5IOd5IOe5IOfCivkg6Dkg6Hkg6Lkg6Pkg6Tkg6Xkg6bkg6fkg6jkg6nkg6rkg6vkg6zkg63kg67kg6/kg7Dkg7Hkg7Lkg7Pkg7Tkg7Xkg7bkg7fkg7jkg7nkg7rkg7vkg7zkg73kg77kg78KK+SEgOSEgeSEguSEg+SEhOSEheSEhuSEh+SEiOSEieSEiuSEi+SEjOSEjeSEjuSEj+SEkOSEkeSEkuSEk+SElOSEleSEluSEl+SEmOSEmeSEmuSEm+SEnOSEneSEnuSEnwor5ISg5ISh5ISi5ISj5ISk5ISl5ISm5ISn5ISo5ISp5ISq5ISr5ISs5ISt5ISu5ISv5ISw5ISx5ISy5ISz5IS05IS15IS25IS35IS45IS55IS65IS75IS85IS95IS+5IS/CivkhYDkhYHkhYLkhYPkhYTkhYXkhYbkhYfkhYjkhYnkhYrkhYvkhYzkhY3khY7khY/khZDkhZHkhZLkhZPkhZTkhZXkhZbkhZfkhZjkhZnkhZrkhZvkhZzkhZ3khZ7khZ8KK+SFoOSFoeSFouSFo+SFpOSFpeSFpuSFp+SFqOSFqeSFquSFq+SFrOSFreSFruSFr+SFsOSFseSFsuSFs+SFtOSFteSFtuSFt+SFuOSFueSFuuSFu+SFvOSFveSFvuSFvwor5IaA5IaB5IaC5IaD5IaE5IaF5IaG5IaH5IaI5IaJ5IaK5IaL5IaM5IaN5IaO5IaP5IaQ5IaR5IaS5IaT5IaU5IaV5IaW5IaX5IaY5IaZ5Iaa5Iab5Iac5Iad5Iae5IafCivkhqDkhqHkhqLkhqPkhqTkhqXkhqbkhqfkhqjkhqnkhqrkhqvkhqzkhq3khq7khq/khrDkhrHkhrLkhrPkhrTkhrXkhrbkhrfkhrjkhrnkhrrkhrvkhrzkhr3khr7khr8KK+SHgOSHgeSHguSHg+SHhOSHheSHhuSHh+SHiOSHieSHiuSHi+SHjOSHjeSHjuSHj+SHkOSHkeSHkuSHk+SHlOSHleSHluSHl+SHmOSHmeSHmuSHm+SHnOSHneSHnuSHnwor5Ieg5Ieh5Iei5Iej5Iek5Iel5Iem5Ien5Ieo5Iep5Ieq5Ier5Ies5Iet5Ieu5Iev5Iew5Iex5Iey5Iez5Ie05Ie15Ie25Ie35Ie45Ie55Ie65Ie75Ie85Ie95Ie+5Ie/CivkiIDkiIHkiILkiIPkiITkiIXkiIbkiIfkiIjkiInkiIrkiIvkiIzkiI3kiI7kiI/kiJDkiJHkiJLkiJPkiJTkiJXkiJbkiJfkiJjkiJnkiJrkiJvkiJzkiJ3kiJ7kiJ8KK+SIoOSIoeSIouSIo+SIpOSIpeSIpuSIp+SIqOSIqeSIquSIq+SIrOSIreSIruSIr+SIsOSIseSIsuSIs+SItOSIteSItuSIt+SIuOSIueSIuuSIu+SIvOSIveSIvuSIvwor5ImA5ImB5ImC5ImD5ImE5ImF5ImG5ImH5ImI5ImJ5ImK5ImL5ImM5ImN5ImO5ImP5ImQ5ImR5ImS5ImT5ImU5ImV5ImW5ImX5ImY5ImZ5Ima5Imb5Imc5Imd5Ime5ImfCivkiaDkiaHkiaLkiaPkiaTkiaXkiabkiafkiajkiankiarkiavkiazkia3kia7kia/kibDkibHkibLkibPkibTkibXkibbkibfkibjkibnkibrkibvkibzkib3kib7kib8KK+SKgOSKgeSKguSKg+SKhOSKheSKhuSKh+SKiOSKieSKiuSKi+SKjOSKjeSKjuSKj+SKkOSKkeSKkuSKk+SKlOSKleSKluSKl+SKmOSKmeSKmuSKm+SKnOSKneSKnuSKnwor5Iqg5Iqh5Iqi5Iqj5Iqk5Iql5Iqm5Iqn5Iqo5Iqp5Iqq5Iqr5Iqs5Iqt5Iqu5Iqv5Iqw5Iqx5Iqy5Iqz5Iq05Iq15Iq25Iq35Iq45Iq55Iq65Iq75Iq85Iq95Iq+5Iq/Civki4Dki4Hki4Lki4Pki4Tki4Xki4bki4fki4jki4nki4rki4vki4zki43ki47ki4/ki5Dki5Hki5Lki5Pki5Tki5Xki5bki5fki5jki5nki5rki5vki5zki53ki57ki58KK+SLoOSLoeSLouSLo+SLpOSLpeSLpuSLp+SLqOSLqeSLquSLq+SLrOSLreSLruSLr+SLsOSLseSLsuSLs+SLtOSLteSLtuSLt+SLuOSLueSLuuSLu+SLvOSLveSLvuSLvwor5IyA5IyB5IyC5IyD5IyE5IyF5IyG5IyH5IyI5IyJ5IyK5IyL5IyM5IyN5IyO5IyP5IyQ5IyR5IyS5IyT5IyU5IyV5IyW5IyX5IyY5IyZ5Iya5Iyb5Iyc5Iyd5Iye5IyfCivkjKDkjKHkjKLkjKPkjKTkjKXkjKbkjKfkjKjkjKnkjKrkjKvkjKzkjK3kjK7kjK/kjLDkjLHkjLLkjLPkjLTkjLXkjLbkjLfkjLjkjLnkjLrkjLvkjLzkjL3kjL7kjL8KK+SNgOSNgeSNguSNg+SNhOSNheSNhuSNh+SNiOSNieSNiuSNi+SNjOSNjeSNjuSNj+SNkOSNkeSNkuSNk+SNlOSNleSNluSNl+SNmOSNmeSNmuSNm+SNnOSNneSNnuSNnwor5I2g5I2h5I2i5I2j5I2k5I2l5I2m5I2n5I2o5I2p5I2q5I2r5I2s5I2t5I2u5I2v5I2w5I2x5I2y5I2z5I205I215I225I235I245I255I265I275I285I295I2+5I2/CivkjoDkjoHkjoLkjoPkjoTkjoXkjobkjofkjojkjonkjorkjovkjozkjo3kjo7kjo/kjpDkjpHkjpLkjpPkjpTkjpXkjpbkjpfkjpjkjpnkjprkjpvkjpzkjp3kjp7kjp8KK+SOoOSOoeSOouSOo+SOpOSOpeSOpuSOp+SOqOSOqeSOquSOq+SOrOSOreSOruSOr+SOsOSOseSOsuSOs+SOtOSOteSOtuSOt+SOuOSOueSOuuSOu+SOvOSOveSOvuSOvwor5I+A5I+B5I+C5I+D5I+E5I+F5I+G5I+H5I+I5I+J5I+K5I+L5I+M5I+N5I+O5I+P5I+Q5I+R5I+S5I+T5I+U5I+V5I+W5I+X5I+Y5I+Z5I+a5I+b5I+c5I+d5I+e5I+fCivkj6Dkj6Hkj6Lkj6Pkj6Tkj6Xkj6bkj6fkj6jkj6nkj6rkj6vkj6zkj63kj67kj6/kj7Dkj7Hkj7Lkj7Pkj7Tkj7Xkj7bkj7fkj7jkj7nkj7rkj7vkj7zkj73kj77kj78KK+SQgOSQgeSQguSQg+SQhOSQheSQhuSQh+SQiOSQieSQiuSQi+SQjOSQjeSQjuSQj+SQkOSQkeSQkuSQk+SQlOSQleSQluSQl+SQmOSQmeSQmuSQm+SQnOSQneSQnuSQnwor5JCg5JCh5JCi5JCj5JCk5JCl5JCm5JCn5JCo5JCp5JCq5JCr5JCs5JCt5JCu5JCv5JCw5JCx5JCy5JCz5JC05JC15JC25JC35JC45JC55JC65JC75JC85JC95JC+5JC/CivkkYDkkYHkkYLkkYPkkYTkkYXkkYbkkYfkkYjkkYnkkYrkkYvkkYzkkY3kkY7kkY/kkZDkkZHkkZLkkZPkkZTkkZXkkZbkkZfkkZjkkZnkkZrkkZvkkZzkkZ3kkZ7kkZ8KK+SRoOSRoeSRouSRo+SRpOSRpeSRpuSRp+SRqOSRqeSRquSRq+SRrOSRreSRruSRr+SRsOSRseSRsuSRs+SRtOSRteSRtuSRt+SRuOSRueSRuuSRu+SRvOSRveSRvuSRvwor5JKA5JKB5JKC5JKD5JKE5JKF5JKG5JKH5JKI5JKJ5JKK5JKL5JKM5JKN5JKO5JKP5JKQ5JKR5JKS5JKT5JKU5JKV5JKW5JKX5JKY5JKZ5JKa5JKb5JKc5JKd5JKe5JKfCivkkqDkkqHkkqLkkqPkkqTkkqXkkqbkkqfkkqjkkqnkkqrkkqvkkqzkkq3kkq7kkq/kkrDkkrHkkrLkkrPkkrTkkrXkkrbkkrfkkrjkkrnkkrrkkrvkkrzkkr3kkr7kkr8KK+STgOSTgeSTguSTg+SThOSTheSThuSTh+STiOSTieSTiuSTi+STjOSTjeSTjuSTj+STkOSTkeSTkuSTk+STlOSTleSTluSTl+STmOSTmeSTmuSTm+STnOSTneSTnuSTnwor5JOg5JOh5JOi5JOj5JOk5JOl5JOm5JOn5JOo5JOp5JOq5JOr5JOs5JOt5JOu5JOv5JOw5JOx5JOy5JOz5JO05JO15JO25JO35JO45JO55JO65JO75JO85JO95JO+5JO/CivklIDklIHklILklIPklITklIXklIbklIfklIjklInklIrklIvklIzklI3klI7klI/klJDklJHklJLklJPklJTklJXklJbklJfklJjklJnklJrklJvklJzklJ3klJ7klJ8KK+SUoOSUoeSUouSUo+SUpOSUpeSUpuSUp+SUqOSUqeSUquSUq+SUrOSUreSUruSUr+SUsOSUseSUsuSUs+SUtOSUteSUtuSUt+SUuOSUueSUuuSUu+SUvOSUveSUvuSUvwor5JWA5JWB5JWC5JWD5JWE5JWF5JWG5JWH5JWI5JWJ5JWK5JWL5JWM5JWN5JWO5JWP5JWQ5JWR5JWS5JWT5JWU5JWV5JWW5JWX5JWY5JWZ5JWa5JWb5JWc5JWd5JWe5JWfCivklaDklaHklaLklaPklaTklaXklabklafklajklanklarklavklazkla3kla7kla/klbDklbHklbLklbPklbTklbXklbbklbfklbjklbnklbrklbvklbzklb3klb7klb8KK+SWgOSWgeSWguSWg+SWhOSWheSWhuSWh+SWiOSWieSWiuSWi+SWjOSWjeSWjuSWj+SWkOSWkeSWkuSWk+SWlOSWleSWluSWl+SWmOSWmeSWmuSWm+SWnOSWneSWnuSWnwor5Jag5Jah5Jai5Jaj5Jak5Jal5Jam5Jan5Jao5Jap5Jaq5Jar5Jas5Jat5Jau5Jav5Jaw5Jax5Jay5Jaz5Ja05Ja15Ja25Ja35Ja45Ja55Ja65Ja75Ja85Ja95Ja+5Ja/Civkl4Dkl4Hkl4Lkl4Pkl4Tkl4Xkl4bkl4fkl4jkl4nkl4rkl4vkl4zkl43kl47kl4/kl5Dkl5Hkl5Lkl5Pkl5Tkl5Xkl5bkl5fkl5jkl5nkl5rkl5vkl5zkl53kl57kl58KK+SXoOSXoeSXouSXo+SXpOSXpeSXpuSXp+SXqOSXqeSXquSXq+SXrOSXreSXruSXr+SXsOSXseSXsuSXs+SXtOSXteSXtuSXt+SXuOSXueSXuuSXu+SXvOSXveSXvuSXvwor5JiA5JiB5JiC5JiD5JiE5JiF5JiG5JiH5JiI5JiJ5JiK5JiL5JiM5JiN5JiO5JiP5JiQ5JiR5JiS5JiT5JiU5JiV5JiW5JiX5JiY5JiZ5Jia5Jib5Jic5Jid5Jie5JifCivkmKDkmKHkmKLkmKPkmKTkmKXkmKbkmKfkmKjkmKnkmKrkmKvkmKzkmK3kmK7kmK/kmLDkmLHkmLLkmLPkmLTkmLXkmLbkmLfkmLjkmLnkmLrkmLvkmLzkmL3kmL7kmL8KK+SZgOSZgeSZguSZg+SZhOSZheSZhuSZh+SZiOSZieSZiuSZi+SZjOSZjeSZjuSZj+SZkOSZkeSZkuSZk+SZlOSZleSZluSZl+SZmOSZmeSZmuSZm+SZnOSZneSZnuSZnwor5Jmg5Jmh5Jmi5Jmj5Jmk5Jml5Jmm5Jmn5Jmo5Jmp5Jmq5Jmr5Jms5Jmt5Jmu5Jmv5Jmw5Jmx5Jmy5Jmz5Jm05Jm15Jm25Jm35Jm45Jm55Jm65Jm75Jm85Jm95Jm+5Jm/CivkmoDkmoHkmoLkmoPkmoTkmoXkmobkmofkmojkmonkmorkmovkmozkmo3kmo7kmo/kmpDkmpHkmpLkmpPkmpTkmpXkmpbkmpfkmpjkmpnkmprkmpvkmpzkmp3kmp7kmp8KK+SaoOSaoeSaouSao+SapOSapeSapuSap+SaqOSaqeSaquSaq+SarOSareSaruSar+SasOSaseSasuSas+SatOSateSatuSat+SauOSaueSauuSau+SavOSaveSavuSavwor5JuA5JuB5JuC5JuD5JuE5JuF5JuG5JuH5JuI5JuJ5JuK5JuL5JuM5JuN5JuO5JuP5JuQ5JuR5JuS5JuT5JuU5JuV5JuW5JuX5JuY5JuZ5Jua5Jub5Juc5Jud5Jue5JufCivkm6Dkm6Hkm6Lkm6Pkm6Tkm6Xkm6bkm6fkm6jkm6nkm6rkm6vkm6zkm63km67km6/km7Dkm7Hkm7Lkm7Pkm7Tkm7Xkm7bkm7fkm7jkm7nkm7rkm7vkm7zkm73km77km78KK+ScgOScgeScguScg+SchOScheSchuSch+SciOScieSciuSci+ScjOScjeScjuScj+SckOSckeSckuSck+SclOScleScluScl+ScmOScmeScmuScm+ScnOScneScnuScnwor5Jyg5Jyh5Jyi5Jyj5Jyk5Jyl5Jym5Jyn5Jyo5Jyp5Jyq5Jyr5Jys5Jyt5Jyu5Jyv5Jyw5Jyx5Jyy5Jyz5Jy05Jy15Jy25Jy35Jy45Jy55Jy65Jy75Jy85Jy95Jy+5Jy/CivknYDknYHknYLknYPknYTknYXknYbknYfknYjknYnknYrknYvknYzknY3knY7knY/knZDknZHknZLknZPknZTknZXknZbknZfknZjknZnknZrknZvknZzknZ3knZ7knZ8KK+SdoOSdoeSdouSdo+SdpOSdpeSdpuSdp+SdqOSdqeSdquSdq+SdrOSdreSdruSdr+SdsOSdseSdsuSds+SdtOSdteSdtuSdt+SduOSdueSduuSdu+SdvOSdveSdvuSdvwor5J6A5J6B5J6C5J6D5J6E5J6F5J6G5J6H5J6I5J6J5J6K5J6L5J6M5J6N5J6O5J6P5J6Q5J6R5J6S5J6T5J6U5J6V5J6W5J6X5J6Y5J6Z5J6a5J6b5J6c5J6d5J6e5J6fCivknqDknqHknqLknqPknqTknqXknqbknqfknqjknqnknqrknqvknqzknq3knq7knq/knrDknrHknrLknrPknrTknrXknrbknrfknrjknrnknrrknrvknrzknr3knr7knr8KK+SfgOSfgeSfguSfg+SfhOSfheSfhuSfh+SfiOSfieSfiuSfi+SfjOSfjeSfjuSfj+SfkOSfkeSfkuSfk+SflOSfleSfluSfl+SfmOSfmeSfmuSfm+SfnOSfneSfnuSfnwor5J+g5J+h5J+i5J+j5J+k5J+l5J+m5J+n5J+o5J+p5J+q5J+r5J+s5J+t5J+u5J+v5J+w5J+x5J+y5J+z5J+05J+15J+25J+35J+45J+55J+65J+75J+85J+95J++5J+/CivkoIDkoIHkoILkoIPkoITkoIXkoIbkoIfkoIjkoInkoIrkoIvkoIzkoI3koI7koI/koJDkoJHkoJLkoJPkoJTkoJXkoJbkoJfkoJjkoJnkoJrkoJvkoJzkoJ3koJ7koJ8KK+SgoOSgoeSgouSgo+SgpOSgpeSgpuSgp+SgqOSgqeSgquSgq+SgrOSgreSgruSgr+SgsOSgseSgsuSgs+SgtOSgteSgtuSgt+SguOSgueSguuSgu+SgvOSgveSgvuSgvwor5KGA5KGB5KGC5KGD5KGE5KGF5KGG5KGH5KGI5KGJ5KGK5KGL5KGM5KGN5KGO5KGP5KGQ5KGR5KGS5KGT5KGU5KGV5KGW5KGX5KGY5KGZ5KGa5KGb5KGc5KGd5KGe5KGfCivkoaDkoaHkoaLkoaPkoaTkoaXkoabkoafkoajkoankoarkoavkoazkoa3koa7koa/kobDkobHkobLkobPkobTkobXkobbkobfkobjkobnkobrkobvkobzkob3kob7kob8KK+SigOSigeSiguSig+SihOSiheSihuSih+SiiOSiieSiiuSii+SijOSijeSijuSij+SikOSikeSikuSik+SilOSileSiluSil+SimOSimeSimuSim+SinOSineSinuSinwor5KKg5KKh5KKi5KKj5KKk5KKl5KKm5KKn5KKo5KKp5KKq5KKr5KKs5KKt5KKu5KKv5KKw5KKx5KKy5KKz5KK05KK15KK25KK35KK45KK55KK65KK75KK85KK95KK+5KK/Civko4Dko4Hko4Lko4Pko4Tko4Xko4bko4fko4jko4nko4rko4vko4zko43ko47ko4/ko5Dko5Hko5Lko5Pko5Tko5Xko5bko5fko5jko5nko5rko5vko5zko53ko57ko58KK+SjoOSjoeSjouSjo+SjpOSjpeSjpuSjp+SjqOSjqeSjquSjq+SjrOSjreSjruSjr+SjsOSjseSjsuSjs+SjtOSjteSjtuSjt+SjuOSjueSjuuSju+SjvOSjveSjvuSjvwor5KSA5KSB5KSC5KSD5KSE5KSF5KSG5KSH5KSI5KSJ5KSK5KSL5KSM5KSN5KSO5KSP5KSQ5KSR5KSS5KST5KSU5KSV5KSW5KSX5KSY5KSZ5KSa5KSb5KSc5KSd5KSe5KSfCivkpKDkpKHkpKLkpKPkpKTkpKXkpKbkpKfkpKjkpKnkpKrkpKvkpKzkpK3kpK7kpK/kpLDkpLHkpLLkpLPkpLTkpLXkpLbkpLfkpLjkpLnkpLrkpLvkpLzkpL3kpL7kpL8KK+SlgOSlgeSlguSlg+SlhOSlheSlhuSlh+SliOSlieSliuSli+SljOSljeSljuSlj+SlkOSlkeSlkuSlk+SllOSlleSlluSll+SlmOSlmeSlmuSlm+SlnOSlneSlnuSlnwor5KWg5KWh5KWi5KWj5KWk5KWl5KWm5KWn5KWo5KWp5KWq5KWr5KWs5KWt5KWu5KWv5KWw5KWx5KWy5KWz5KW05KW15KW25KW35KW45KW55KW65KW75KW85KW95KW+5KW/CivkpoDkpoHkpoLkpoPkpoTkpoXkpobkpofkpojkponkporkpovkpozkpo3kpo7kpo/kppDkppHkppLkppPkppTkppXkppbkppfkppjkppnkpprkppvkppzkpp3kpp7kpp8KK+SmoOSmoeSmouSmo+SmpOSmpeSmpuSmp+SmqOSmqeSmquSmq+SmrOSmreSmruSmr+SmsOSmseSmsuSms+SmtOSmteSmtuSmt+SmuOSmueSmuuSmu+SmvOSmveSmvuSmvwor5KeA5KeB5KeC5KeD5KeE5KeF5KeG5KeH5KeI5KeJ5KeK5KeL5KeM5KeN5KeO5KeP5KeQ5KeR5KeS5KeT5KeU5KeV5KeW5KeX5KeY5KeZ5Kea5Keb5Kec5Ked5Kee5KefCivkp6Dkp6Hkp6Lkp6Pkp6Tkp6Xkp6bkp6fkp6jkp6nkp6rkp6vkp6zkp63kp67kp6/kp7Dkp7Hkp7Lkp7Pkp7Tkp7Xkp7bkp7fkp7jkp7nkp7rkp7vkp7zkp73kp77kp78KK+SogOSogeSoguSog+SohOSoheSohuSoh+SoiOSoieSoiuSoi+SojOSojeSojuSoj+SokOSokeSokuSok+SolOSoleSoluSol+SomOSomeSomuSom+SonOSoneSonuSonwor5Kig5Kih5Kii5Kij5Kik5Kil5Kim5Kin5Kio5Kip5Kiq5Kir5Kis5Kit5Kiu5Kiv5Kiw5Kix5Kiy5Kiz5Ki05Ki15Ki25Ki35Ki45Ki55Ki65Ki75Ki85Ki95Ki+5Ki/CivkqYDkqYHkqYLkqYPkqYTkqYXkqYbkqYfkqYjkqYnkqYrkqYvkqYzkqY3kqY7kqY/kqZDkqZHkqZLkqZPkqZTkqZXkqZbkqZfkqZjkqZnkqZrkqZvkqZzkqZ3kqZ7kqZ8KK+SpoOSpoeSpouSpo+SppOSppeSppuSpp+SpqOSpqeSpquSpq+SprOSpreSpruSpr+SpsOSpseSpsuSps+SptOSpteSptuSpt+SpuOSpueSpuuSpu+SpvOSpveSpvuSpvwor5KqA5KqB5KqC5KqD5KqE5KqF5KqG5KqH5KqI5KqJ5KqK5KqL5KqM5KqN5KqO5KqP5KqQ5KqR5KqS5KqT5KqU5KqV5KqW5KqX5KqY5KqZ5Kqa5Kqb5Kqc5Kqd5Kqe5KqfCivkqqDkqqHkqqLkqqPkqqTkqqXkqqbkqqfkqqjkqqnkqqrkqqvkqqzkqq3kqq7kqq/kqrDkqrHkqrLkqrPkqrTkqrXkqrbkqrfkqrjkqrnkqrrkqrvkqrzkqr3kqr7kqr8KK+SrgOSrgeSrguSrg+SrhOSrheSrhuSrh+SriOSrieSriuSri+SrjOSrjeSrjuSrj+SrkOSrkeSrkuSrk+SrlOSrleSrluSrl+SrmOSrmeSrmuSrm+SrnOSrneSrnuSrnwor5Kug5Kuh5Kui5Kuj5Kuk5Kul5Kum5Kun5Kuo5Kup5Kuq5Kur5Kus5Kut5Kuu5Kuv5Kuw5Kux5Kuy5Kuz5Ku05Ku15Ku25Ku35Ku45Ku55Ku65Ku75Ku85Ku95Ku+5Ku/CivkrIDkrIHkrILkrIPkrITkrIXkrIbkrIfkrIjkrInkrIrkrIvkrIzkrI3krI7krI/krJDkrJHkrJLkrJPkrJTkrJXkrJbkrJfkrJjkrJnkrJrkrJvkrJzkrJ3krJ7krJ8KK+SsoOSsoeSsouSso+SspOSspeSspuSsp+SsqOSsqeSsquSsq+SsrOSsreSsruSsr+SssOSsseSssuSss+SstOSsteSstuSst+SsuOSsueSsuuSsu+SsvOSsveSsvuSsvwor5K2A5K2B5K2C5K2D5K2E5K2F5K2G5K2H5K2I5K2J5K2K5K2L5K2M5K2N5K2O5K2P5K2Q5K2R5K2S5K2T5K2U5K2V5K2W5K2X5K2Y5K2Z5K2a5K2b5K2c5K2d5K2e5K2fCivkraDkraHkraLkraPkraTkraXkrabkrafkrajkrankrarkravkrazkra3kra7kra/krbDkrbHkrbLkrbPkrbTkrbXkrbbkrbfkrbjkrbnkrbrkrbvkrbzkrb3krb7krb8KK+SugOSugeSuguSug+SuhOSuheSuhuSuh+SuiOSuieSuiuSui+SujOSujeSujuSuj+SukOSukeSukuSuk+SulOSuleSuluSul+SumOSumeSumuSum+SunOSuneSunuSunwor5K6g5K6h5K6i5K6j5K6k5K6l5K6m5K6n5K6o5K6p5K6q5K6r5K6s5K6t5K6u5K6v5K6w5K6x5K6y5K6z5K605K615K625K635K645K655K665K675K685K695K6+5K6/Civkr4Dkr4Hkr4Lkr4Pkr4Tkr4Xkr4bkr4fkr4jkr4nkr4rkr4vkr4zkr43kr47kr4/kr5Dkr5Hkr5Lkr5Pkr5Tkr5Xkr5bkr5fkr5jkr5nkr5rkr5vkr5zkr53kr57kr58KK+SvoOSvoeSvouSvo+SvpOSvpeSvpuSvp+SvqOSvqeSvquSvq+SvrOSvreSvruSvr+SvsOSvseSvsuSvs+SvtOSvteSvtuSvt+SvuOSvueSvuuSvu+SvvOSvveSvvuSvvwor5LCA5LCB5LCC5LCD5LCE5LCF5LCG5LCH5LCI5LCJ5LCK5LCL5LCM5LCN5LCO5LCP5LCQ5LCR5LCS5LCT5LCU5LCV5LCW5LCX5LCY5LCZ5LCa5LCb5LCc5LCd5LCe5LCfCivksKDksKHksKLksKPksKTksKXksKbksKfksKjksKnksKrksKvksKzksK3ksK7ksK/ksLDksLHksLLksLPksLTksLXksLbksLfksLjksLnksLrksLvksLzksL3ksL7ksL8KK+SxgOSxgeSxguSxg+SxhOSxheSxhuSxh+SxiOSxieSxiuSxi+SxjOSxjeSxjuSxj+SxkOSxkeSxkuSxk+SxlOSxleSxluSxl+SxmOSxmeSxmuSxm+SxnOSxneSxnuSxnwor5LGg5LGh5LGi5LGj5LGk5LGl5LGm5LGn5LGo5LGp5LGq5LGr5LGs5LGt5LGu5LGv5LGw5LGx5LGy5LGz5LG05LG15LG25LG35LG45LG55LG65LG75LG85LG95LG+5LG/CivksoDksoHksoLksoPksoTksoXksobksofksojksonksorksovksozkso3kso7kso/kspDkspHkspLkspPkspTkspXkspbkspfkspjkspnksprkspvkspzksp3ksp7ksp8KK+SyoOSyoeSyouSyo+SypOSypeSypuSyp+SyqOSyqeSyquSyq+SyrOSyreSyruSyr+SysOSyseSysuSys+SytOSyteSytuSyt+SyuOSyueSyuuSyu+SyvOSyveSyvuSyvwor5LOA5LOB5LOC5LOD5LOE5LOF5LOG5LOH5LOI5LOJ5LOK5LOL5LOM5LON5LOO5LOP5LOQ5LOR5LOS5LOT5LOU5LOV5LOW5LOX5LOY5LOZ5LOa5LOb5LOc5LOd5LOe5LOfCivks6Dks6Hks6Lks6Pks6Tks6Xks6bks6fks6jks6nks6rks6vks6zks63ks67ks6/ks7Dks7Hks7Lks7Pks7Tks7Xks7bks7fks7jks7nks7rks7vks7zks73ks77ks78KK+S0gOS0geS0guS0g+S0hOS0heS0huS0h+S0iOS0ieS0iuS0i+S0jOS0jeS0juS0j+S0kOS0keS0kuS0k+S0lOS0leS0luS0l+S0mOS0meS0muS0m+S0nOS0neS0nuS0nwor5LSg5LSh5LSi5LSj5LSk5LSl5LSm5LSn5LSo5LSp5LSq5LSr5LSs5LSt5LSu5LSv5LSw5LSx5LSy5LSz5LS05LS15LS25LS35LS45LS55LS65LS75LS85LS95LS+5LS/CivktYDktYHktYLktYPktYTktYXktYbktYfktYjktYnktYrktYvktYzktY3ktY7ktY/ktZDktZHktZLktZPktZTktZXktZbktZfktZjktZnktZrktZvktZzktZ3ktZ7ktZ8KK+S1oOS1oeS1ouS1o+S1pOS1peS1puS1p+S1qOS1qeS1quS1q+S1rOS1reS1ruS1r+S1sOS1seS1suS1s+S1tOS1teS1tuS1t+S1uOS1ueS1uuS1u+S1vOS1veS1vuS1vwor5LaA5LaB5LaC5LaD5LaE5LaF5LaG5LaH5LaI5LaJ5LaK5LaL5LaM5LaN5LaO5LaP5LaQ5LaR5LaS5LaT5LaU5LaV5LaW5LaX5LaY5LaZ5Laa5Lab5Lac5Lad5Lae5LafCivktqDktqHktqLktqPktqTktqXktqbktqfktqjktqnktqrktqvktqzktq3ktq7ktq/ktrDktrHktrLktrPktrTktrXktrbktrfktrjktrnktrrktrvktrzktr3ktr7ktr8KKworWWlqaW5nIEhleGFncmFtIFN5bWJvbHMgKFUrNERDMC1VKzRERkYpOgorCivkt4Dkt4Hkt4Lkt4Pkt4Tkt4Xkt4bkt4fkt4jkt4nkt4rkt4vkt4zkt43kt47kt4/kt5Dkt5Hkt5Lkt5Pkt5Tkt5Xkt5bkt5fkt5jkt5nkt5rkt5vkt5zkt53kt57kt58KK+S3oOS3oeS3ouS3o+S3pOS3peS3puS3p+S3qOS3qeS3quS3q+S3rOS3reS3ruS3r+S3sOS3seS3suS3s+S3tOS3teS3tuS3t+S3uOS3ueS3uuS3u+S3vOS3veS3vuS3vworCitDSksgVW5pZmllZCBJZGVvZ3JhcGhzIChVKzRFMDAtVSs5RkZGKToKKwor5LiA5LiB5LiC5LiD5LiE5LiF5LiG5LiH5LiI5LiJ5LiK5LiL5LiM5LiN5LiO5LiP5LiQ5LiR5LiS5LiT5LiU5LiV5LiW5LiX5LiY5LiZ5Lia5Lib5Lic5Lid5Lie5LifCivkuKDkuKHkuKLkuKPkuKTkuKXkuKbkuKfkuKjkuKnkuKrkuKvkuKzkuK3kuK7kuK/kuLDkuLHkuLLkuLPkuLTkuLXkuLbkuLfkuLjkuLnkuLrkuLvkuLzkuL3kuL7kuL8KK+S5gOS5geS5guS5g+S5hOS5heS5huS5h+S5iOS5ieS5iuS5i+S5jOS5jeS5juS5j+S5kOS5keS5kuS5k+S5lOS5leS5luS5l+S5mOS5meS5muS5m+S5nOS5neS5nuS5nwor5Lmg5Lmh5Lmi5Lmj5Lmk5Lml5Lmm5Lmn5Lmo5Lmp5Lmq5Lmr5Lms5Lmt5Lmu5Lmv5Lmw5Lmx5Lmy5Lmz5Lm05Lm15Lm25Lm35Lm45Lm55Lm65Lm75Lm85Lm95Lm+5Lm/CivkuoDkuoHkuoLkuoPkuoTkuoXkuobkuofkuojkuonkuorkuovkuozkuo3kuo7kuo/kupDkupHkupLkupPkupTkupXkupbkupfkupjkupnkuprkupvkupzkup3kup7kup8KK+S6oOS6oeS6ouS6o+S6pOS6peS6puS6p+S6qOS6qeS6quS6q+S6rOS6reS6ruS6r+S6sOS6seS6suS6s+S6tOS6teS6tuS6t+S6uOS6ueS6uuS6u+S6vOS6veS6vuS6vwor5LuA5LuB5LuC5LuD5LuE5LuF5LuG5LuH5LuI5LuJ5LuK5LuL5LuM5LuN5LuO5LuP5LuQ5LuR5LuS5LuT5LuU5LuV5LuW5LuX5LuY5LuZ5Lua5Lub5Luc5Lud5Lue5LufCivku6Dku6Hku6Lku6Pku6Tku6Xku6bku6fku6jku6nku6rku6vku6zku63ku67ku6/ku7Dku7Hku7Lku7Pku7Tku7Xku7bku7fku7jku7nku7rku7vku7zku73ku77ku78KK+S8gOS8geS8guS8g+S8hOS8heS8huS8h+S8iOS8ieS8iuS8i+S8jOS8jeS8juS8j+S8kOS8keS8kuS8k+S8lOS8leS8luS8l+S8mOS8meS8muS8m+S8nOS8neS8nuS8nwor5Lyg5Lyh5Lyi5Lyj5Lyk5Lyl5Lym5Lyn5Lyo5Lyp5Lyq5Lyr5Lys5Lyt5Lyu5Lyv5Lyw5Lyx5Lyy5Lyz5Ly05Ly15Ly25Ly35Ly45Ly55Ly65Ly75Ly85Ly95Ly+5Ly/CivkvYDkvYHkvYLkvYPkvYTkvYXkvYbkvYfkvYjkvYnkvYrkvYvkvYzkvY3kvY7kvY/kvZDkvZHkvZLkvZPkvZTkvZXkvZbkvZfkvZjkvZnkvZrkvZvkvZzkvZ3kvZ7kvZ8KK+S9oOS9oeS9ouS9o+S9pOS9peS9puS9p+S9qOS9qeS9quS9q+S9rOS9reS9ruS9r+S9sOS9seS9suS9s+S9tOS9teS9tuS9t+S9uOS9ueS9uuS9u+S9vOS9veS9vuS9vwor5L6A5L6B5L6C5L6D5L6E5L6F5L6G5L6H5L6I5L6J5L6K5L6L5L6M5L6N5L6O5L6P5L6Q5L6R5L6S5L6T5L6U5L6V5L6W5L6X5L6Y5L6Z5L6a5L6b5L6c5L6d5L6e5L6fCivkvqDkvqHkvqLkvqPkvqTkvqXkvqbkvqfkvqjkvqnkvqrkvqvkvqzkvq3kvq7kvq/kvrDkvrHkvrLkvrPkvrTkvrXkvrbkvrfkvrjkvrnkvrrkvrvkvrzkvr3kvr7kvr8KK+S/gOS/geS/guS/g+S/hOS/heS/huS/h+S/iOS/ieS/iuS/i+S/jOS/jeS/juS/j+S/kOS/keS/kuS/k+S/lOS/leS/luS/l+S/mOS/meS/muS/m+S/nOS/neS/nuS/nwor5L+g5L+h5L+i5L+j5L+k5L+l5L+m5L+n5L+o5L+p5L+q5L+r5L+s5L+t5L+u5L+v5L+w5L+x5L+y5L+z5L+05L+15L+25L+35L+45L+55L+65L+75L+85L+95L++5L+/CivlgIDlgIHlgILlgIPlgITlgIXlgIblgIflgIjlgInlgIrlgIvlgIzlgI3lgI7lgI/lgJDlgJHlgJLlgJPlgJTlgJXlgJblgJflgJjlgJnlgJrlgJvlgJzlgJ3lgJ7lgJ8KK+WAoOWAoeWAouWAo+WApOWApeWApuWAp+WAqOWAqeWAquWAq+WArOWAreWAruWAr+WAsOWAseWAsuWAs+WAtOWAteWAtuWAt+WAuOWAueWAuuWAu+WAvOWAveWAvuWAvwor5YGA5YGB5YGC5YGD5YGE5YGF5YGG5YGH5YGI5YGJ5YGK5YGL5YGM5YGN5YGO5YGP5YGQ5YGR5YGS5YGT5YGU5YGV5YGW5YGX5YGY5YGZ5YGa5YGb5YGc5YGd5YGe5YGfCivlgaDlgaHlgaLlgaPlgaTlgaXlgablgaflgajlganlgarlgavlgazlga3lga7lga/lgbDlgbHlgbLlgbPlgbTlgbXlgbblgbflgbjlgbnlgbrlgbvlgbzlgb3lgb7lgb8KK+WCgOWCgeWCguWCg+WChOWCheWChuWCh+WCiOWCieWCiuWCi+WCjOWCjeWCjuWCj+WCkOWCkeWCkuWCk+WClOWCleWCluWCl+WCmOWCmeWCmuWCm+WCnOWCneWCnuWCnwor5YKg5YKh5YKi5YKj5YKk5YKl5YKm5YKn5YKo5YKp5YKq5YKr5YKs5YKt5YKu5YKv5YKw5YKx5YKy5YKz5YK05YK15YK25YK35YK45YK55YK65YK75YK85YK95YK+5YK/Civlg4Dlg4Hlg4Llg4Plg4Tlg4Xlg4blg4flg4jlg4nlg4rlg4vlg4zlg43lg47lg4/lg5Dlg5Hlg5Llg5Plg5Tlg5Xlg5blg5flg5jlg5nlg5rlg5vlg5zlg53lg57lg58KK+WDoOWDoeWDouWDo+WDpOWDpeWDpuWDp+WDqOWDqeWDquWDq+WDrOWDreWDruWDr+WDsOWDseWDsuWDs+WDtOWDteWDtuWDt+WDuOWDueWDuuWDu+WDvOWDveWDvuWDvwor5YSA5YSB5YSC5YSD5YSE5YSF5YSG5YSH5YSI5YSJ5YSK5YSL5YSM5YSN5YSO5YSP5YSQ5YSR5YSS5YST5YSU5YSV5YSW5YSX5YSY5YSZ5YSa5YSb5YSc5YSd5YSe5YSfCivlhKDlhKHlhKLlhKPlhKTlhKXlhKblhKflhKjlhKnlhKrlhKvlhKzlhK3lhK7lhK/lhLDlhLHlhLLlhLPlhLTlhLXlhLblhLflhLjlhLnlhLrlhLvlhLzlhL3lhL7lhL8KK+WFgOWFgeWFguWFg+WFhOWFheWFhuWFh+WFiOWFieWFiuWFi+WFjOWFjeWFjuWFj+WFkOWFkeWFkuWFk+WFlOWFleWFluWFl+WFmOWFmeWFmuWFm+WFnOWFneWFnuWFnwor5YWg5YWh5YWi5YWj5YWk5YWl5YWm5YWn5YWo5YWp5YWq5YWr5YWs5YWt5YWu5YWv5YWw5YWx5YWy5YWz5YW05YW15YW25YW35YW45YW55YW65YW75YW85YW95YW+5YW/CivlhoDlhoHlhoLlhoPlhoTlhoXlhoblhoflhojlhonlhorlhovlhozlho3lho7lho/lhpDlhpHlhpLlhpPlhpTlhpXlhpblhpflhpjlhpnlhprlhpvlhpzlhp3lhp7lhp8KK+WGoOWGoeWGouWGo+WGpOWGpeWGpuWGp+WGqOWGqeWGquWGq+WGrOWGreWGruWGr+WGsOWGseWGsuWGs+WGtOWGteWGtuWGt+WGuOWGueWGuuWGu+WGvOWGveWGvuWGvwor5YeA5YeB5YeC5YeD5YeE5YeF5YeG5YeH5YeI5YeJ5YeK5YeL5YeM5YeN5YeO5YeP5YeQ5YeR5YeS5YeT5YeU5YeV5YeW5YeX5YeY5YeZ5Yea5Yeb5Yec5Yed5Yee5YefCivlh6Dlh6Hlh6Llh6Plh6Tlh6Xlh6blh6flh6jlh6nlh6rlh6vlh6zlh63lh67lh6/lh7Dlh7Hlh7Llh7Plh7Tlh7Xlh7blh7flh7jlh7nlh7rlh7vlh7zlh73lh77lh78KK+WIgOWIgeWIguWIg+WIhOWIheWIhuWIh+WIiOWIieWIiuWIi+WIjOWIjeWIjuWIj+WIkOWIkeWIkuWIk+WIlOWIleWIluWIl+WImOWImeWImuWIm+WInOWIneWInuWInwor5Yig5Yih5Yii5Yij5Yik5Yil5Yim5Yin5Yio5Yip5Yiq5Yir5Yis5Yit5Yiu5Yiv5Yiw5Yix5Yiy5Yiz5Yi05Yi15Yi25Yi35Yi45Yi55Yi65Yi75Yi85Yi95Yi+5Yi/CivliYDliYHliYLliYPliYTliYXliYbliYfliYjliYnliYrliYvliYzliY3liY7liY/liZDliZHliZLliZPliZTliZXliZbliZfliZjliZnliZrliZvliZzliZ3liZ7liZ8KK+WJoOWJoeWJouWJo+WJpOWJpeWJpuWJp+WJqOWJqeWJquWJq+WJrOWJreWJruWJr+WJsOWJseWJsuWJs+WJtOWJteWJtuWJt+WJuOWJueWJuuWJu+WJvOWJveWJvuWJvwor5YqA5YqB5YqC5YqD5YqE5YqF5YqG5YqH5YqI5YqJ5YqK5YqL5YqM5YqN5YqO5YqP5YqQ5YqR5YqS5YqT5YqU5YqV5YqW5YqX5YqY5YqZ5Yqa5Yqb5Yqc5Yqd5Yqe5YqfCivliqDliqHliqLliqPliqTliqXliqbliqfliqjliqnliqrliqvliqzliq3liq7liq/lirDlirHlirLlirPlirTlirXlirblirflirjlirnlirrlirvlirzlir3lir7lir8KK+WLgOWLgeWLguWLg+WLhOWLheWLhuWLh+WLiOWLieWLiuWLi+WLjOWLjeWLjuWLj+WLkOWLkeWLkuWLk+WLlOWLleWLluWLl+WLmOWLmeWLmuWLm+WLnOWLneWLnuWLnwor5Yug5Yuh5Yui5Yuj5Yuk5Yul5Yum5Yun5Yuo5Yup5Yuq5Yur5Yus5Yut5Yuu5Yuv5Yuw5Yux5Yuy5Yuz5Yu05Yu15Yu25Yu35Yu45Yu55Yu65Yu75Yu85Yu95Yu+5Yu/CivljIDljIHljILljIPljITljIXljIbljIfljIjljInljIrljIvljIzljI3ljI7ljI/ljJDljJHljJLljJPljJTljJXljJbljJfljJjljJnljJrljJvljJzljJ3ljJ7ljJ8KK+WMoOWMoeWMouWMo+WMpOWMpeWMpuWMp+WMqOWMqeWMquWMq+WMrOWMreWMruWMr+WMsOWMseWMsuWMs+WMtOWMteWMtuWMt+WMuOWMueWMuuWMu+WMvOWMveWMvuWMvwor5Y2A5Y2B5Y2C5Y2D5Y2E5Y2F5Y2G5Y2H5Y2I5Y2J5Y2K5Y2L5Y2M5Y2N5Y2O5Y2P5Y2Q5Y2R5Y2S5Y2T5Y2U5Y2V5Y2W5Y2X5Y2Y5Y2Z5Y2a5Y2b5Y2c5Y2d5Y2e5Y2fCivljaDljaHljaLljaPljaTljaXljabljafljajljanljarljavljazlja3lja7lja/ljbDljbHljbLljbPljbTljbXljbbljbfljbjljbnljbrljbvljbzljb3ljb7ljb8KK+WOgOWOgeWOguWOg+WOhOWOheWOhuWOh+WOiOWOieWOiuWOi+WOjOWOjeWOjuWOj+WOkOWOkeWOkuWOk+WOlOWOleWOluWOl+WOmOWOmeWOmuWOm+WOnOWOneWOnuWOnwor5Y6g5Y6h5Y6i5Y6j5Y6k5Y6l5Y6m5Y6n5Y6o5Y6p5Y6q5Y6r5Y6s5Y6t5Y6u5Y6v5Y6w5Y6x5Y6y5Y6z5Y605Y615Y625Y635Y645Y655Y665Y675Y685Y695Y6+5Y6/Civlj4Dlj4Hlj4Llj4Plj4Tlj4Xlj4blj4flj4jlj4nlj4rlj4vlj4zlj43lj47lj4/lj5Dlj5Hlj5Llj5Plj5Tlj5Xlj5blj5flj5jlj5nlj5rlj5vlj5zlj53lj57lj58KK+WPoOWPoeWPouWPo+WPpOWPpeWPpuWPp+WPqOWPqeWPquWPq+WPrOWPreWPruWPr+WPsOWPseWPsuWPs+WPtOWPteWPtuWPt+WPuOWPueWPuuWPu+WPvOWPveWPvuWPvwor5ZCA5ZCB5ZCC5ZCD5ZCE5ZCF5ZCG5ZCH5ZCI5ZCJ5ZCK5ZCL5ZCM5ZCN5ZCO5ZCP5ZCQ5ZCR5ZCS5ZCT5ZCU5ZCV5ZCW5ZCX5ZCY5ZCZ5ZCa5ZCb5ZCc5ZCd5ZCe5ZCfCivlkKDlkKHlkKLlkKPlkKTlkKXlkKblkKflkKjlkKnlkKrlkKvlkKzlkK3lkK7lkK/lkLDlkLHlkLLlkLPlkLTlkLXlkLblkLflkLjlkLnlkLrlkLvlkLzlkL3lkL7lkL8KK+WRgOWRgeWRguWRg+WRhOWRheWRhuWRh+WRiOWRieWRiuWRi+WRjOWRjeWRjuWRj+WRkOWRkeWRkuWRk+WRlOWRleWRluWRl+WRmOWRmeWRmuWRm+WRnOWRneWRnuWRnwor5ZGg5ZGh5ZGi5ZGj5ZGk5ZGl5ZGm5ZGn5ZGo5ZGp5ZGq5ZGr5ZGs5ZGt5ZGu5ZGv5ZGw5ZGx5ZGy5ZGz5ZG05ZG15ZG25ZG35ZG45ZG55ZG65ZG75ZG85ZG95ZG+5ZG/CivlkoDlkoHlkoLlkoPlkoTlkoXlkoblkoflkojlkonlkorlkovlkozlko3lko7lko/lkpDlkpHlkpLlkpPlkpTlkpXlkpblkpflkpjlkpnlkprlkpvlkpzlkp3lkp7lkp8KK+WSoOWSoeWSouWSo+WSpOWSpeWSpuWSp+WSqOWSqeWSquWSq+WSrOWSreWSruWSr+WSsOWSseWSsuWSs+WStOWSteWStuWSt+WSuOWSueWSuuWSu+WSvOWSveWSvuWSvwor5ZOA5ZOB5ZOC5ZOD5ZOE5ZOF5ZOG5ZOH5ZOI5ZOJ5ZOK5ZOL5ZOM5ZON5ZOO5ZOP5ZOQ5ZOR5ZOS5ZOT5ZOU5ZOV5ZOW5ZOX5ZOY5ZOZ5ZOa5ZOb5ZOc5ZOd5ZOe5ZOfCivlk6Dlk6Hlk6Llk6Plk6Tlk6Xlk6blk6flk6jlk6nlk6rlk6vlk6zlk63lk67lk6/lk7Dlk7Hlk7Llk7Plk7Tlk7Xlk7blk7flk7jlk7nlk7rlk7vlk7zlk73lk77lk78KK+WUgOWUgeWUguWUg+WUhOWUheWUhuWUh+WUiOWUieWUiuWUi+WUjOWUjeWUjuWUj+WUkOWUkeWUkuWUk+WUlOWUleWUluWUl+WUmOWUmeWUmuWUm+WUnOWUneWUnuWUnwor5ZSg5ZSh5ZSi5ZSj5ZSk5ZSl5ZSm5ZSn5ZSo5ZSp5ZSq5ZSr5ZSs5ZSt5ZSu5ZSv5ZSw5ZSx5ZSy5ZSz5ZS05ZS15ZS25ZS35ZS45ZS55ZS65ZS75ZS85ZS95ZS+5ZS/CivllYDllYHllYLllYPllYTllYXllYbllYfllYjllYnllYrllYvllYzllY3llY7llY/llZDllZHllZLllZPllZTllZXllZbllZfllZjllZnllZrllZvllZzllZ3llZ7llZ8KK+WVoOWVoeWVouWVo+WVpOWVpeWVpuWVp+WVqOWVqeWVquWVq+WVrOWVreWVruWVr+WVsOWVseWVsuWVs+WVtOWVteWVtuWVt+WVuOWVueWVuuWVu+WVvOWVveWVvuWVvwor5ZaA5ZaB5ZaC5ZaD5ZaE5ZaF5ZaG5ZaH5ZaI5ZaJ5ZaK5ZaL5ZaM5ZaN5ZaO5ZaP5ZaQ5ZaR5ZaS5ZaT5ZaU5ZaV5ZaW5ZaX5ZaY5ZaZ5Zaa5Zab5Zac5Zad5Zae5ZafCivllqDllqHllqLllqPllqTllqXllqbllqfllqjllqnllqrllqvllqzllq3llq7llq/llrDllrHllrLllrPllrTllrXllrbllrfllrjllrnllrrllrvllrzllr3llr7llr8KK+WXgOWXgeWXguWXg+WXhOWXheWXhuWXh+WXiOWXieWXiuWXi+WXjOWXjeWXjuWXj+WXkOWXkeWXkuWXk+WXlOWXleWXluWXl+WXmOWXmeWXmuWXm+WXnOWXneWXnuWXnwor5Zeg5Zeh5Zei5Zej5Zek5Zel5Zem5Zen5Zeo5Zep5Zeq5Zer5Zes5Zet5Zeu5Zev5Zew5Zex5Zey5Zez5Ze05Ze15Ze25Ze35Ze45Ze55Ze65Ze75Ze85Ze95Ze+5Ze/CivlmIDlmIHlmILlmIPlmITlmIXlmIblmIflmIjlmInlmIrlmIvlmIzlmI3lmI7lmI/lmJDlmJHlmJLlmJPlmJTlmJXlmJblmJflmJjlmJnlmJrlmJvlmJzlmJ3lmJ7lmJ8KK+WYoOWYoeWYouWYo+WYpOWYpeWYpuWYp+WYqOWYqeWYquWYq+WYrOWYreWYruWYr+WYsOWYseWYsuWYs+WYtOWYteWYtuWYt+WYuOWYueWYuuWYu+WYvOWYveWYvuWYvwor5ZmA5ZmB5ZmC5ZmD5ZmE5ZmF5ZmG5ZmH5ZmI5ZmJ5ZmK5ZmL5ZmM5ZmN5ZmO5ZmP5ZmQ5ZmR5ZmS5ZmT5ZmU5ZmV5ZmW5ZmX5ZmY5ZmZ5Zma5Zmb5Zmc5Zmd5Zme5ZmfCivlmaDlmaHlmaLlmaPlmaTlmaXlmablmaflmajlmanlmarlmavlmazlma3lma7lma/lmbDlmbHlmbLlmbPlmbTlmbXlmbblmbflmbjlmbnlmbrlmbvlmbzlmb3lmb7lmb8KK+WagOWageWaguWag+WahOWaheWahuWah+WaiOWaieWaiuWai+WajOWajeWajuWaj+WakOWakeWakuWak+WalOWaleWaluWal+WamOWameWamuWam+WanOWaneWanuWanwor5Zqg5Zqh5Zqi5Zqj5Zqk5Zql5Zqm5Zqn5Zqo5Zqp5Zqq5Zqr5Zqs5Zqt5Zqu5Zqv5Zqw5Zqx5Zqy5Zqz5Zq05Zq15Zq25Zq35Zq45Zq55Zq65Zq75Zq85Zq95Zq+5Zq/Civlm4Dlm4Hlm4Llm4Plm4Tlm4Xlm4blm4flm4jlm4nlm4rlm4vlm4zlm43lm47lm4/lm5Dlm5Hlm5Llm5Plm5Tlm5Xlm5blm5flm5jlm5nlm5rlm5vlm5zlm53lm57lm58KK+WboOWboeWbouWbo+WbpOWbpeWbpuWbp+WbqOWbqeWbquWbq+WbrOWbreWbruWbr+WbsOWbseWbsuWbs+WbtOWbteWbtuWbt+WbuOWbueWbuuWbu+WbvOWbveWbvuWbvwor5ZyA5ZyB5ZyC5ZyD5ZyE5ZyF5ZyG5ZyH5ZyI5ZyJ5ZyK5ZyL5ZyM5ZyN5ZyO5ZyP5ZyQ5ZyR5ZyS5ZyT5ZyU5ZyV5ZyW5ZyX5ZyY5ZyZ5Zya5Zyb5Zyc5Zyd5Zye5ZyfCivlnKDlnKHlnKLlnKPlnKTlnKXlnKblnKflnKjlnKnlnKrlnKvlnKzlnK3lnK7lnK/lnLDlnLHlnLLlnLPlnLTlnLXlnLblnLflnLjlnLnlnLrlnLvlnLzlnL3lnL7lnL8KK+WdgOWdgeWdguWdg+WdhOWdheWdhuWdh+WdiOWdieWdiuWdi+WdjOWdjeWdjuWdj+WdkOWdkeWdkuWdk+WdlOWdleWdluWdl+WdmOWdmeWdmuWdm+WdnOWdneWdnuWdnwor5Z2g5Z2h5Z2i5Z2j5Z2k5Z2l5Z2m5Z2n5Z2o5Z2p5Z2q5Z2r5Z2s5Z2t5Z2u5Z2v5Z2w5Z2x5Z2y5Z2z5Z205Z215Z225Z235Z245Z255Z265Z275Z285Z295Z2+5Z2/CivlnoDlnoHlnoLlnoPlnoTlnoXlnoblnoflnojlnonlnorlnovlnozlno3lno7lno/lnpDlnpHlnpLlnpPlnpTlnpXlnpblnpflnpjlnpnlnprlnpvlnpzlnp3lnp7lnp8KK+WeoOWeoeWeouWeo+WepOWepeWepuWep+WeqOWeqeWequWeq+WerOWereWeruWer+WesOWeseWesuWes+WetOWeteWetuWet+WeuOWeueWeuuWeu+WevOWeveWevuWevwor5Z+A5Z+B5Z+C5Z+D5Z+E5Z+F5Z+G5Z+H5Z+I5Z+J5Z+K5Z+L5Z+M5Z+N5Z+O5Z+P5Z+Q5Z+R5Z+S5Z+T5Z+U5Z+V5Z+W5Z+X5Z+Y5Z+Z5Z+a5Z+b5Z+c5Z+d5Z+e5Z+fCivln6Dln6Hln6Lln6Pln6Tln6Xln6bln6fln6jln6nln6rln6vln6zln63ln67ln6/ln7Dln7Hln7Lln7Pln7Tln7Xln7bln7fln7jln7nln7rln7vln7zln73ln77ln78KK+WggOWggeWgguWgg+WghOWgheWghuWgh+WgiOWgieWgiuWgi+WgjOWgjeWgjuWgj+WgkOWgkeWgkuWgk+WglOWgleWgluWgl+WgmOWgmeWgmuWgm+WgnOWgneWgnuWgnwor5aCg5aCh5aCi5aCj5aCk5aCl5aCm5aCn5aCo5aCp5aCq5aCr5aCs5aCt5aCu5aCv5aCw5aCx5aCy5aCz5aC05aC15aC25aC35aC45aC55aC65aC75aC85aC95aC+5aC/CivloYDloYHloYLloYPloYTloYXloYbloYfloYjloYnloYrloYvloYzloY3loY7loY/loZDloZHloZLloZPloZTloZXloZbloZfloZjloZnloZrloZvloZzloZ3loZ7loZ8KK+WhoOWhoeWhouWho+WhpOWhpeWhpuWhp+WhqOWhqeWhquWhq+WhrOWhreWhruWhr+WhsOWhseWhsuWhs+WhtOWhteWhtuWht+WhuOWhueWhuuWhu+WhvOWhveWhvuWhvwor5aKA5aKB5aKC5aKD5aKE5aKF5aKG5aKH5aKI5aKJ5aKK5aKL5aKM5aKN5aKO5aKP5aKQ5aKR5aKS5aKT5aKU5aKV5aKW5aKX5aKY5aKZ5aKa5aKb5aKc5aKd5aKe5aKfCivloqDloqHloqLloqPloqTloqXloqbloqfloqjloqnloqrloqvloqzloq3loq7loq/lorDlorHlorLlorPlorTlorXlorblorflorjlornlorrlorvlorzlor3lor7lor8KK+WjgOWjgeWjguWjg+WjhOWjheWjhuWjh+WjiOWjieWjiuWji+WjjOWjjeWjjuWjj+WjkOWjkeWjkuWjk+WjlOWjleWjluWjl+WjmOWjmeWjmuWjm+WjnOWjneWjnuWjnwor5aOg5aOh5aOi5aOj5aOk5aOl5aOm5aOn5aOo5aOp5aOq5aOr5aOs5aOt5aOu5aOv5aOw5aOx5aOy5aOz5aO05aO15aO25aO35aO45aO55aO65aO75aO85aO95aO+5aO/CivlpIDlpIHlpILlpIPlpITlpIXlpIblpIflpIjlpInlpIrlpIvlpIzlpI3lpI7lpI/lpJDlpJHlpJLlpJPlpJTlpJXlpJblpJflpJjlpJnlpJrlpJvlpJzlpJ3lpJ7lpJ8KK+WkoOWkoeWkouWko+WkpOWkpeWkpuWkp+WkqOWkqeWkquWkq+WkrOWkreWkruWkr+WksOWkseWksuWks+WktOWkteWktuWkt+WkuOWkueWkuuWku+WkvOWkveWkvuWkvwor5aWA5aWB5aWC5aWD5aWE5aWF5aWG5aWH5aWI5aWJ5aWK5aWL5aWM5aWN5aWO5aWP5aWQ5aWR5aWS5aWT5aWU5aWV5aWW5aWX5aWY5aWZ5aWa5aWb5aWc5aWd5aWe5aWfCivlpaDlpaHlpaLlpaPlpaTlpaXlpablpaflpajlpanlparlpavlpazlpa3lpa7lpa/lpbDlpbHlpbLlpbPlpbTlpbXlpbblpbflpbjlpbnlpbrlpbvlpbzlpb3lpb7lpb8KK+WmgOWmgeWmguWmg+WmhOWmheWmhuWmh+WmiOWmieWmiuWmi+WmjOWmjeWmjuWmj+WmkOWmkeWmkuWmk+WmlOWmleWmluWml+WmmOWmmeWmmuWmm+WmnOWmneWmnuWmnwor5aag5aah5aai5aaj5aak5aal5aam5aan5aao5aap5aaq5aar5aas5aat5aau5aav5aaw5aax5aay5aaz5aa05aa15aa25aa35aa45aa55aa65aa75aa85aa95aa+5aa/Civlp4Dlp4Hlp4Llp4Plp4Tlp4Xlp4blp4flp4jlp4nlp4rlp4vlp4zlp43lp47lp4/lp5Dlp5Hlp5Llp5Plp5Tlp5Xlp5blp5flp5jlp5nlp5rlp5vlp5zlp53lp57lp58KK+WnoOWnoeWnouWno+WnpOWnpeWnpuWnp+WnqOWnqeWnquWnq+WnrOWnreWnruWnr+WnsOWnseWnsuWns+WntOWnteWntuWnt+WnuOWnueWnuuWnu+WnvOWnveWnvuWnvwor5aiA5aiB5aiC5aiD5aiE5aiF5aiG5aiH5aiI5aiJ5aiK5aiL5aiM5aiN5aiO5aiP5aiQ5aiR5aiS5aiT5aiU5aiV5aiW5aiX5aiY5aiZ5aia5aib5aic5aid5aie5aifCivlqKDlqKHlqKLlqKPlqKTlqKXlqKblqKflqKjlqKnlqKrlqKvlqKzlqK3lqK7lqK/lqLDlqLHlqLLlqLPlqLTlqLXlqLblqLflqLjlqLnlqLrlqLvlqLzlqL3lqL7lqL8KK+WpgOWpgeWpguWpg+WphOWpheWphuWph+WpiOWpieWpiuWpi+WpjOWpjeWpjuWpj+WpkOWpkeWpkuWpk+WplOWpleWpluWpl+WpmOWpmeWpmuWpm+WpnOWpneWpnuWpnwor5amg5amh5ami5amj5amk5aml5amm5amn5amo5amp5amq5amr5ams5amt5amu5amv5amw5amx5amy5amz5am05am15am25am35am45am55am65am75am85am95am+5am/CivlqoDlqoHlqoLlqoPlqoTlqoXlqoblqoflqojlqonlqorlqovlqozlqo3lqo7lqo/lqpDlqpHlqpLlqpPlqpTlqpXlqpblqpflqpjlqpnlqprlqpvlqpzlqp3lqp7lqp8KK+WqoOWqoeWqouWqo+WqpOWqpeWqpuWqp+WqqOWqqeWqquWqq+WqrOWqreWqruWqr+WqsOWqseWqsuWqs+WqtOWqteWqtuWqt+WquOWqueWquuWqu+WqvOWqveWqvuWqvwor5auA5auB5auC5auD5auE5auF5auG5auH5auI5auJ5auK5auL5auM5auN5auO5auP5auQ5auR5auS5auT5auU5auV5auW5auX5auY5auZ5aua5aub5auc5aud5aue5aufCivlq6Dlq6Hlq6Llq6Plq6Tlq6Xlq6blq6flq6jlq6nlq6rlq6vlq6zlq63lq67lq6/lq7Dlq7Hlq7Llq7Plq7Tlq7Xlq7blq7flq7jlq7nlq7rlq7vlq7zlq73lq77lq78KK+WsgOWsgeWsguWsg+WshOWsheWshuWsh+WsiOWsieWsiuWsi+WsjOWsjeWsjuWsj+WskOWskeWskuWsk+WslOWsleWsluWsl+WsmOWsmeWsmuWsm+WsnOWsneWsnuWsnwor5ayg5ayh5ayi5ayj5ayk5ayl5aym5ayn5ayo5ayp5ayq5ayr5ays5ayt5ayu5ayv5ayw5ayx5ayy5ayz5ay05ay15ay25ay35ay45ay55ay65ay75ay85ay95ay+5ay/CivlrYDlrYHlrYLlrYPlrYTlrYXlrYblrYflrYjlrYnlrYrlrYvlrYzlrY3lrY7lrY/lrZDlrZHlrZLlrZPlrZTlrZXlrZblrZflrZjlrZnlrZrlrZvlrZzlrZ3lrZ7lrZ8KK+WtoOWtoeWtouWto+WtpOWtpeWtpuWtp+WtqOWtqeWtquWtq+WtrOWtreWtruWtr+WtsOWtseWtsuWts+WttOWtteWttuWtt+WtuOWtueWtuuWtu+WtvOWtveWtvuWtvwor5a6A5a6B5a6C5a6D5a6E5a6F5a6G5a6H5a6I5a6J5a6K5a6L5a6M5a6N5a6O5a6P5a6Q5a6R5a6S5a6T5a6U5a6V5a6W5a6X5a6Y5a6Z5a6a5a6b5a6c5a6d5a6e5a6fCivlrqDlrqHlrqLlrqPlrqTlrqXlrqblrqflrqjlrqnlrqrlrqvlrqzlrq3lrq7lrq/lrrDlrrHlrrLlrrPlrrTlrrXlrrblrrflrrjlrrnlrrrlrrvlrrzlrr3lrr7lrr8KK+WvgOWvgeWvguWvg+WvhOWvheWvhuWvh+WviOWvieWviuWvi+WvjOWvjeWvjuWvj+WvkOWvkeWvkuWvk+WvlOWvleWvluWvl+WvmOWvmeWvmuWvm+WvnOWvneWvnuWvnwor5a+g5a+h5a+i5a+j5a+k5a+l5a+m5a+n5a+o5a+p5a+q5a+r5a+s5a+t5a+u5a+v5a+w5a+x5a+y5a+z5a+05a+15a+25a+35a+45a+55a+65a+75a+85a+95a++5a+/CivlsIDlsIHlsILlsIPlsITlsIXlsIblsIflsIjlsInlsIrlsIvlsIzlsI3lsI7lsI/lsJDlsJHlsJLlsJPlsJTlsJXlsJblsJflsJjlsJnlsJrlsJvlsJzlsJ3lsJ7lsJ8KK+WwoOWwoeWwouWwo+WwpOWwpeWwpuWwp+WwqOWwqeWwquWwq+WwrOWwreWwruWwr+WwsOWwseWwsuWws+WwtOWwteWwtuWwt+WwuOWwueWwuuWwu+WwvOWwveWwvuWwvwor5bGA5bGB5bGC5bGD5bGE5bGF5bGG5bGH5bGI5bGJ5bGK5bGL5bGM5bGN5bGO5bGP5bGQ5bGR5bGS5bGT5bGU5bGV5bGW5bGX5bGY5bGZ5bGa5bGb5bGc5bGd5bGe5bGfCivlsaDlsaHlsaLlsaPlsaTlsaXlsablsaflsajlsanlsarlsavlsazlsa3lsa7lsa/lsbDlsbHlsbLlsbPlsbTlsbXlsbblsbflsbjlsbnlsbrlsbvlsbzlsb3lsb7lsb8KK+WygOWygeWyguWyg+WyhOWyheWyhuWyh+WyiOWyieWyiuWyi+WyjOWyjeWyjuWyj+WykOWykeWykuWyk+WylOWyleWyluWyl+WymOWymeWymuWym+WynOWyneWynuWynwor5bKg5bKh5bKi5bKj5bKk5bKl5bKm5bKn5bKo5bKp5bKq5bKr5bKs5bKt5bKu5bKv5bKw5bKx5bKy5bKz5bK05bK15bK25bK35bK45bK55bK65bK75bK85bK95bK+5bK/Civls4Dls4Hls4Lls4Pls4Tls4Xls4bls4fls4jls4nls4rls4vls4zls43ls47ls4/ls5Dls5Hls5Lls5Pls5Tls5Xls5bls5fls5jls5nls5rls5vls5zls53ls57ls58KK+WzoOWzoeWzouWzo+WzpOWzpeWzpuWzp+WzqOWzqeWzquWzq+WzrOWzreWzruWzr+WzsOWzseWzsuWzs+WztOWzteWztuWzt+WzuOWzueWzuuWzu+WzvOWzveWzvuWzvwor5bSA5bSB5bSC5bSD5bSE5bSF5bSG5bSH5bSI5bSJ5bSK5bSL5bSM5bSN5bSO5bSP5bSQ5bSR5bSS5bST5bSU5bSV5bSW5bSX5bSY5bSZ5bSa5bSb5bSc5bSd5bSe5bSfCivltKDltKHltKLltKPltKTltKXltKbltKfltKjltKnltKrltKvltKzltK3ltK7ltK/ltLDltLHltLLltLPltLTltLXltLbltLfltLjltLnltLrltLvltLzltL3ltL7ltL8KK+W1gOW1geW1guW1g+W1hOW1heW1huW1h+W1iOW1ieW1iuW1i+W1jOW1jeW1juW1j+W1kOW1keW1kuW1k+W1lOW1leW1luW1l+W1mOW1meW1muW1m+W1nOW1neW1nuW1nwor5bWg5bWh5bWi5bWj5bWk5bWl5bWm5bWn5bWo5bWp5bWq5bWr5bWs5bWt5bWu5bWv5bWw5bWx5bWy5bWz5bW05bW15bW25bW35bW45bW55bW65bW75bW85bW95bW+5bW/CivltoDltoHltoLltoPltoTltoXltobltofltojltonltorltovltozlto3lto7lto/ltpDltpHltpLltpPltpTltpXltpbltpfltpjltpnltprltpvltpzltp3ltp7ltp8KK+W2oOW2oeW2ouW2o+W2pOW2peW2puW2p+W2qOW2qeW2quW2q+W2rOW2reW2ruW2r+W2sOW2seW2suW2s+W2tOW2teW2tuW2t+W2uOW2ueW2uuW2u+W2vOW2veW2vuW2vwor5beA5beB5beC5beD5beE5beF5beG5beH5beI5beJ5beK5beL5beM5beN5beO5beP5beQ5beR5beS5beT5beU5beV5beW5beX5beY5beZ5bea5beb5bec5bed5bee5befCivlt6Dlt6Hlt6Llt6Plt6Tlt6Xlt6blt6flt6jlt6nlt6rlt6vlt6zlt63lt67lt6/lt7Dlt7Hlt7Llt7Plt7Tlt7Xlt7blt7flt7jlt7nlt7rlt7vlt7zlt73lt77lt78KK+W4gOW4geW4guW4g+W4hOW4heW4huW4h+W4iOW4ieW4iuW4i+W4jOW4jeW4juW4j+W4kOW4keW4kuW4k+W4lOW4leW4luW4l+W4mOW4meW4muW4m+W4nOW4neW4nuW4nwor5big5bih5bii5bij5bik5bil5bim5bin5bio5bip5biq5bir5bis5bit5biu5biv5biw5bix5biy5biz5bi05bi15bi25bi35bi45bi55bi65bi75bi85bi95bi+5bi/CivluYDluYHluYLluYPluYTluYXluYbluYfluYjluYnluYrluYvluYzluY3luY7luY/luZDluZHluZLluZPluZTluZXluZbluZfluZjluZnluZrluZvluZzluZ3luZ7luZ8KK+W5oOW5oeW5ouW5o+W5pOW5peW5puW5p+W5qOW5qeW5quW5q+W5rOW5reW5ruW5r+W5sOW5seW5suW5s+W5tOW5teW5tuW5t+W5uOW5ueW5uuW5u+W5vOW5veW5vuW5vwor5bqA5bqB5bqC5bqD5bqE5bqF5bqG5bqH5bqI5bqJ5bqK5bqL5bqM5bqN5bqO5bqP5bqQ5bqR5bqS5bqT5bqU5bqV5bqW5bqX5bqY5bqZ5bqa5bqb5bqc5bqd5bqe5bqfCivluqDluqHluqLluqPluqTluqXluqbluqfluqjluqnluqrluqvluqzluq3luq7luq/lurDlurHlurLlurPlurTlurXlurblurflurjlurnlurrlurvlurzlur3lur7lur8KK+W7gOW7geW7guW7g+W7hOW7heW7huW7h+W7iOW7ieW7iuW7i+W7jOW7jeW7juW7j+W7kOW7keW7kuW7k+W7lOW7leW7luW7l+W7mOW7meW7muW7m+W7nOW7neW7nuW7nwor5bug5buh5bui5buj5buk5bul5bum5bun5buo5bup5buq5bur5bus5but5buu5buv5buw5bux5buy5buz5bu05bu15bu25bu35bu45bu55bu65bu75bu85bu95bu+5bu/CivlvIDlvIHlvILlvIPlvITlvIXlvIblvIflvIjlvInlvIrlvIvlvIzlvI3lvI7lvI/lvJDlvJHlvJLlvJPlvJTlvJXlvJblvJflvJjlvJnlvJrlvJvlvJzlvJ3lvJ7lvJ8KK+W8oOW8oeW8ouW8o+W8pOW8peW8puW8p+W8qOW8qeW8quW8q+W8rOW8reW8ruW8r+W8sOW8seW8suW8s+W8tOW8teW8tuW8t+W8uOW8ueW8uuW8u+W8vOW8veW8vuW8vwor5b2A5b2B5b2C5b2D5b2E5b2F5b2G5b2H5b2I5b2J5b2K5b2L5b2M5b2N5b2O5b2P5b2Q5b2R5b2S5b2T5b2U5b2V5b2W5b2X5b2Y5b2Z5b2a5b2b5b2c5b2d5b2e5b2fCivlvaDlvaHlvaLlvaPlvaTlvaXlvablvaflvajlvanlvarlvavlvazlva3lva7lva/lvbDlvbHlvbLlvbPlvbTlvbXlvbblvbflvbjlvbnlvbrlvbvlvbzlvb3lvb7lvb8KK+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+nwor5b6g5b6h5b6i5b6j5b6k5b6l5b6m5b6n5b6o5b6p5b6q5b6r5b6s5b6t5b6u5b6v5b6w5b6x5b6y5b6z5b605b615b625b635b645b655b665b675b685b695b6+5b6/Civlv4Dlv4Hlv4Llv4Plv4Tlv4Xlv4blv4flv4jlv4nlv4rlv4vlv4zlv43lv47lv4/lv5Dlv5Hlv5Llv5Plv5Tlv5Xlv5blv5flv5jlv5nlv5rlv5vlv5zlv53lv57lv58KK+W/oOW/oeW/ouW/o+W/pOW/peW/puW/p+W/qOW/qeW/quW/q+W/rOW/reW/ruW/r+W/sOW/seW/suW/s+W/tOW/teW/tuW/t+W/uOW/ueW/uuW/u+W/vOW/veW/vuW/vwor5oCA5oCB5oCC5oCD5oCE5oCF5oCG5oCH5oCI5oCJ5oCK5oCL5oCM5oCN5oCO5oCP5oCQ5oCR5oCS5oCT5oCU5oCV5oCW5oCX5oCY5oCZ5oCa5oCb5oCc5oCd5oCe5oCfCivmgKDmgKHmgKLmgKPmgKTmgKXmgKbmgKfmgKjmgKnmgKrmgKvmgKzmgK3mgK7mgK/mgLDmgLHmgLLmgLPmgLTmgLXmgLbmgLfmgLjmgLnmgLrmgLvmgLzmgL3mgL7mgL8KK+aBgOaBgeaBguaBg+aBhOaBheaBhuaBh+aBiOaBieaBiuaBi+aBjOaBjeaBjuaBj+aBkOaBkeaBkuaBk+aBlOaBleaBluaBl+aBmOaBmeaBmuaBm+aBnOaBneaBnuaBnwor5oGg5oGh5oGi5oGj5oGk5oGl5oGm5oGn5oGo5oGp5oGq5oGr5oGs5oGt5oGu5oGv5oGw5oGx5oGy5oGz5oG05oG15oG25oG35oG45oG55oG65oG75oG85oG95oG+5oG/CivmgoDmgoHmgoLmgoPmgoTmgoXmgobmgofmgojmgonmgormgovmgozmgo3mgo7mgo/mgpDmgpHmgpLmgpPmgpTmgpXmgpbmgpfmgpjmgpnmgprmgpvmgpzmgp3mgp7mgp8KK+aCoOaCoeaCouaCo+aCpOaCpeaCpuaCp+aCqOaCqeaCquaCq+aCrOaCreaCruaCr+aCsOaCseaCsuaCs+aCtOaCteaCtuaCt+aCuOaCueaCuuaCu+aCvOaCveaCvuaCvwor5oOA5oOB5oOC5oOD5oOE5oOF5oOG5oOH5oOI5oOJ5oOK5oOL5oOM5oON5oOO5oOP5oOQ5oOR5oOS5oOT5oOU5oOV5oOW5oOX5oOY5oOZ5oOa5oOb5oOc5oOd5oOe5oOfCivmg6Dmg6Hmg6Lmg6Pmg6Tmg6Xmg6bmg6fmg6jmg6nmg6rmg6vmg6zmg63mg67mg6/mg7Dmg7Hmg7Lmg7Pmg7Tmg7Xmg7bmg7fmg7jmg7nmg7rmg7vmg7zmg73mg77mg78KK+aEgOaEgeaEguaEg+aEhOaEheaEhuaEh+aEiOaEieaEiuaEi+aEjOaEjeaEjuaEj+aEkOaEkeaEkuaEk+aElOaEleaEluaEl+aEmOaEmeaEmuaEm+aEnOaEneaEnuaEnwor5oSg5oSh5oSi5oSj5oSk5oSl5oSm5oSn5oSo5oSp5oSq5oSr5oSs5oSt5oSu5oSv5oSw5oSx5oSy5oSz5oS05oS15oS25oS35oS45oS55oS65oS75oS85oS95oS+5oS/CivmhYDmhYHmhYLmhYPmhYTmhYXmhYbmhYfmhYjmhYnmhYrmhYvmhYzmhY3mhY7mhY/mhZDmhZHmhZLmhZPmhZTmhZXmhZbmhZfmhZjmhZnmhZrmhZvmhZzmhZ3mhZ7mhZ8KK+aFoOaFoeaFouaFo+aFpOaFpeaFpuaFp+aFqOaFqeaFquaFq+aFrOaFreaFruaFr+aFsOaFseaFsuaFs+aFtOaFteaFtuaFt+aFuOaFueaFuuaFu+aFvOaFveaFvuaFvwor5oaA5oaB5oaC5oaD5oaE5oaF5oaG5oaH5oaI5oaJ5oaK5oaL5oaM5oaN5oaO5oaP5oaQ5oaR5oaS5oaT5oaU5oaV5oaW5oaX5oaY5oaZ5oaa5oab5oac5oad5oae5oafCivmhqDmhqHmhqLmhqPmhqTmhqXmhqbmhqfmhqjmhqnmhqrmhqvmhqzmhq3mhq7mhq/mhrDmhrHmhrLmhrPmhrTmhrXmhrbmhrfmhrjmhrnmhrrmhrvmhrzmhr3mhr7mhr8KK+aHgOaHgeaHguaHg+aHhOaHheaHhuaHh+aHiOaHieaHiuaHi+aHjOaHjeaHjuaHj+aHkOaHkeaHkuaHk+aHlOaHleaHluaHl+aHmOaHmeaHmuaHm+aHnOaHneaHnuaHnwor5oeg5oeh5oei5oej5oek5oel5oem5oen5oeo5oep5oeq5oer5oes5oet5oeu5oev5oew5oex5oey5oez5oe05oe15oe25oe35oe45oe55oe65oe75oe85oe95oe+5oe/CivmiIDmiIHmiILmiIPmiITmiIXmiIbmiIfmiIjmiInmiIrmiIvmiIzmiI3miI7miI/miJDmiJHmiJLmiJPmiJTmiJXmiJbmiJfmiJjmiJnmiJrmiJvmiJzmiJ3miJ7miJ8KK+aIoOaIoeaIouaIo+aIpOaIpeaIpuaIp+aIqOaIqeaIquaIq+aIrOaIreaIruaIr+aIsOaIseaIsuaIs+aItOaIteaItuaIt+aIuOaIueaIuuaIu+aIvOaIveaIvuaIvwor5omA5omB5omC5omD5omE5omF5omG5omH5omI5omJ5omK5omL5omM5omN5omO5omP5omQ5omR5omS5omT5omU5omV5omW5omX5omY5omZ5oma5omb5omc5omd5ome5omfCivmiaDmiaHmiaLmiaPmiaTmiaXmiabmiafmiajmianmiarmiavmiazmia3mia7mia/mibDmibHmibLmibPmibTmibXmibbmibfmibjmibnmibrmibvmibzmib3mib7mib8KK+aKgOaKgeaKguaKg+aKhOaKheaKhuaKh+aKiOaKieaKiuaKi+aKjOaKjeaKjuaKj+aKkOaKkeaKkuaKk+aKlOaKleaKluaKl+aKmOaKmeaKmuaKm+aKnOaKneaKnuaKnwor5oqg5oqh5oqi5oqj5oqk5oql5oqm5oqn5oqo5oqp5oqq5oqr5oqs5oqt5oqu5oqv5oqw5oqx5oqy5oqz5oq05oq15oq25oq35oq45oq55oq65oq75oq85oq95oq+5oq/Civmi4Dmi4Hmi4Lmi4Pmi4Tmi4Xmi4bmi4fmi4jmi4nmi4rmi4vmi4zmi43mi47mi4/mi5Dmi5Hmi5Lmi5Pmi5Tmi5Xmi5bmi5fmi5jmi5nmi5rmi5vmi5zmi53mi57mi58KK+aLoOaLoeaLouaLo+aLpOaLpeaLpuaLp+aLqOaLqeaLquaLq+aLrOaLreaLruaLr+aLsOaLseaLsuaLs+aLtOaLteaLtuaLt+aLuOaLueaLuuaLu+aLvOaLveaLvuaLvwor5oyA5oyB5oyC5oyD5oyE5oyF5oyG5oyH5oyI5oyJ5oyK5oyL5oyM5oyN5oyO5oyP5oyQ5oyR5oyS5oyT5oyU5oyV5oyW5oyX5oyY5oyZ5oya5oyb5oyc5oyd5oye5oyfCivmjKDmjKHmjKLmjKPmjKTmjKXmjKbmjKfmjKjmjKnmjKrmjKvmjKzmjK3mjK7mjK/mjLDmjLHmjLLmjLPmjLTmjLXmjLbmjLfmjLjmjLnmjLrmjLvmjLzmjL3mjL7mjL8KK+aNgOaNgeaNguaNg+aNhOaNheaNhuaNh+aNiOaNieaNiuaNi+aNjOaNjeaNjuaNj+aNkOaNkeaNkuaNk+aNlOaNleaNluaNl+aNmOaNmeaNmuaNm+aNnOaNneaNnuaNnwor5o2g5o2h5o2i5o2j5o2k5o2l5o2m5o2n5o2o5o2p5o2q5o2r5o2s5o2t5o2u5o2v5o2w5o2x5o2y5o2z5o205o215o225o235o245o255o265o275o285o295o2+5o2/CivmjoDmjoHmjoLmjoPmjoTmjoXmjobmjofmjojmjonmjormjovmjozmjo3mjo7mjo/mjpDmjpHmjpLmjpPmjpTmjpXmjpbmjpfmjpjmjpnmjprmjpvmjpzmjp3mjp7mjp8KK+aOoOaOoeaOouaOo+aOpOaOpeaOpuaOp+aOqOaOqeaOquaOq+aOrOaOreaOruaOr+aOsOaOseaOsuaOs+aOtOaOteaOtuaOt+aOuOaOueaOuuaOu+aOvOaOveaOvuaOvwor5o+A5o+B5o+C5o+D5o+E5o+F5o+G5o+H5o+I5o+J5o+K5o+L5o+M5o+N5o+O5o+P5o+Q5o+R5o+S5o+T5o+U5o+V5o+W5o+X5o+Y5o+Z5o+a5o+b5o+c5o+d5o+e5o+fCivmj6Dmj6Hmj6Lmj6Pmj6Tmj6Xmj6bmj6fmj6jmj6nmj6rmj6vmj6zmj63mj67mj6/mj7Dmj7Hmj7Lmj7Pmj7Tmj7Xmj7bmj7fmj7jmj7nmj7rmj7vmj7zmj73mj77mj78KK+aQgOaQgeaQguaQg+aQhOaQheaQhuaQh+aQiOaQieaQiuaQi+aQjOaQjeaQjuaQj+aQkOaQkeaQkuaQk+aQlOaQleaQluaQl+aQmOaQmeaQmuaQm+aQnOaQneaQnuaQnwor5pCg5pCh5pCi5pCj5pCk5pCl5pCm5pCn5pCo5pCp5pCq5pCr5pCs5pCt5pCu5pCv5pCw5pCx5pCy5pCz5pC05pC15pC25pC35pC45pC55pC65pC75pC85pC95pC+5pC/CivmkYDmkYHmkYLmkYPmkYTmkYXmkYbmkYfmkYjmkYnmkYrmkYvmkYzmkY3mkY7mkY/mkZDmkZHmkZLmkZPmkZTmkZXmkZbmkZfmkZjmkZnmkZrmkZvmkZzmkZ3mkZ7mkZ8KK+aRoOaRoeaRouaRo+aRpOaRpeaRpuaRp+aRqOaRqeaRquaRq+aRrOaRreaRruaRr+aRsOaRseaRsuaRs+aRtOaRteaRtuaRt+aRuOaRueaRuuaRu+aRvOaRveaRvuaRvwor5pKA5pKB5pKC5pKD5pKE5pKF5pKG5pKH5pKI5pKJ5pKK5pKL5pKM5pKN5pKO5pKP5pKQ5pKR5pKS5pKT5pKU5pKV5pKW5pKX5pKY5pKZ5pKa5pKb5pKc5pKd5pKe5pKfCivmkqDmkqHmkqLmkqPmkqTmkqXmkqbmkqfmkqjmkqnmkqrmkqvmkqzmkq3mkq7mkq/mkrDmkrHmkrLmkrPmkrTmkrXmkrbmkrfmkrjmkrnmkrrmkrvmkrzmkr3mkr7mkr8KK+aTgOaTgeaTguaTg+aThOaTheaThuaTh+aTiOaTieaTiuaTi+aTjOaTjeaTjuaTj+aTkOaTkeaTkuaTk+aTlOaTleaTluaTl+aTmOaTmeaTmuaTm+aTnOaTneaTnuaTnwor5pOg5pOh5pOi5pOj5pOk5pOl5pOm5pOn5pOo5pOp5pOq5pOr5pOs5pOt5pOu5pOv5pOw5pOx5pOy5pOz5pO05pO15pO25pO35pO45pO55pO65pO75pO85pO95pO+5pO/CivmlIDmlIHmlILmlIPmlITmlIXmlIbmlIfmlIjmlInmlIrmlIvmlIzmlI3mlI7mlI/mlJDmlJHmlJLmlJPmlJTmlJXmlJbmlJfmlJjmlJnmlJrmlJvmlJzmlJ3mlJ7mlJ8KK+aUoOaUoeaUouaUo+aUpOaUpeaUpuaUp+aUqOaUqeaUquaUq+aUrOaUreaUruaUr+aUsOaUseaUsuaUs+aUtOaUteaUtuaUt+aUuOaUueaUuuaUu+aUvOaUveaUvuaUvwor5pWA5pWB5pWC5pWD5pWE5pWF5pWG5pWH5pWI5pWJ5pWK5pWL5pWM5pWN5pWO5pWP5pWQ5pWR5pWS5pWT5pWU5pWV5pWW5pWX5pWY5pWZ5pWa5pWb5pWc5pWd5pWe5pWfCivmlaDmlaHmlaLmlaPmlaTmlaXmlabmlafmlajmlanmlarmlavmlazmla3mla7mla/mlbDmlbHmlbLmlbPmlbTmlbXmlbbmlbfmlbjmlbnmlbrmlbvmlbzmlb3mlb7mlb8KK+aWgOaWgeaWguaWg+aWhOaWheaWhuaWh+aWiOaWieaWiuaWi+aWjOaWjeaWjuaWj+aWkOaWkeaWkuaWk+aWlOaWleaWluaWl+aWmOaWmeaWmuaWm+aWnOaWneaWnuaWnwor5pag5pah5pai5paj5pak5pal5pam5pan5pao5pap5paq5par5pas5pat5pau5pav5paw5pax5pay5paz5pa05pa15pa25pa35pa45pa55pa65pa75pa85pa95pa+5pa/Civml4Dml4Hml4Lml4Pml4Tml4Xml4bml4fml4jml4nml4rml4vml4zml43ml47ml4/ml5Dml5Hml5Lml5Pml5Tml5Xml5bml5fml5jml5nml5rml5vml5zml53ml57ml58KK+aXoOaXoeaXouaXo+aXpOaXpeaXpuaXp+aXqOaXqeaXquaXq+aXrOaXreaXruaXr+aXsOaXseaXsuaXs+aXtOaXteaXtuaXt+aXuOaXueaXuuaXu+aXvOaXveaXvuaXvwor5piA5piB5piC5piD5piE5piF5piG5piH5piI5piJ5piK5piL5piM5piN5piO5piP5piQ5piR5piS5piT5piU5piV5piW5piX5piY5piZ5pia5pib5pic5pid5pie5pifCivmmKDmmKHmmKLmmKPmmKTmmKXmmKbmmKfmmKjmmKnmmKrmmKvmmKzmmK3mmK7mmK/mmLDmmLHmmLLmmLPmmLTmmLXmmLbmmLfmmLjmmLnmmLrmmLvmmLzmmL3mmL7mmL8KK+aZgOaZgeaZguaZg+aZhOaZheaZhuaZh+aZiOaZieaZiuaZi+aZjOaZjeaZjuaZj+aZkOaZkeaZkuaZk+aZlOaZleaZluaZl+aZmOaZmeaZmuaZm+aZnOaZneaZnuaZnwor5pmg5pmh5pmi5pmj5pmk5pml5pmm5pmn5pmo5pmp5pmq5pmr5pms5pmt5pmu5pmv5pmw5pmx5pmy5pmz5pm05pm15pm25pm35pm45pm55pm65pm75pm85pm95pm+5pm/CivmmoDmmoHmmoLmmoPmmoTmmoXmmobmmofmmojmmonmmormmovmmozmmo3mmo7mmo/mmpDmmpHmmpLmmpPmmpTmmpXmmpbmmpfmmpjmmpnmmprmmpvmmpzmmp3mmp7mmp8KK+aaoOaaoeaaouaao+aapOaapeaapuaap+aaqOaaqeaaquaaq+aarOaareaaruaar+aasOaaseaasuaas+aatOaateaatuaat+aauOaaueaauuaau+aavOaaveaavuaavwor5puA5puB5puC5puD5puE5puF5puG5puH5puI5puJ5puK5puL5puM5puN5puO5puP5puQ5puR5puS5puT5puU5puV5puW5puX5puY5puZ5pua5pub5puc5pud5pue5pufCivmm6Dmm6Hmm6Lmm6Pmm6Tmm6Xmm6bmm6fmm6jmm6nmm6rmm6vmm6zmm63mm67mm6/mm7Dmm7Hmm7Lmm7Pmm7Tmm7Xmm7bmm7fmm7jmm7nmm7rmm7vmm7zmm73mm77mm78KK+acgOacgeacguacg+achOacheachuach+aciOacieaciuaci+acjOacjeacjuacj+ackOackeackuack+aclOacleacluacl+acmOacmeacmuacm+acnOacneacnuacnwor5pyg5pyh5pyi5pyj5pyk5pyl5pym5pyn5pyo5pyp5pyq5pyr5pys5pyt5pyu5pyv5pyw5pyx5pyy5pyz5py05py15py25py35py45py55py65py75py85py95py+5py/CivmnYDmnYHmnYLmnYPmnYTmnYXmnYbmnYfmnYjmnYnmnYrmnYvmnYzmnY3mnY7mnY/mnZDmnZHmnZLmnZPmnZTmnZXmnZbmnZfmnZjmnZnmnZrmnZvmnZzmnZ3mnZ7mnZ8KK+adoOadoeadouado+adpOadpeadpuadp+adqOadqeadquadq+adrOadreadruadr+adsOadseadsuads+adtOadteadtuadt+aduOadueaduuadu+advOadveadvuadvwor5p6A5p6B5p6C5p6D5p6E5p6F5p6G5p6H5p6I5p6J5p6K5p6L5p6M5p6N5p6O5p6P5p6Q5p6R5p6S5p6T5p6U5p6V5p6W5p6X5p6Y5p6Z5p6a5p6b5p6c5p6d5p6e5p6fCivmnqDmnqHmnqLmnqPmnqTmnqXmnqbmnqfmnqjmnqnmnqrmnqvmnqzmnq3mnq7mnq/mnrDmnrHmnrLmnrPmnrTmnrXmnrbmnrfmnrjmnrnmnrrmnrvmnrzmnr3mnr7mnr8KK+afgOafgeafguafg+afhOafheafhuafh+afiOafieafiuafi+afjOafjeafjuafj+afkOafkeafkuafk+aflOafleafluafl+afmOafmeafmuafm+afnOafneafnuafnwor5p+g5p+h5p+i5p+j5p+k5p+l5p+m5p+n5p+o5p+p5p+q5p+r5p+s5p+t5p+u5p+v5p+w5p+x5p+y5p+z5p+05p+15p+25p+35p+45p+55p+65p+75p+85p+95p++5p+/CivmoIDmoIHmoILmoIPmoITmoIXmoIbmoIfmoIjmoInmoIrmoIvmoIzmoI3moI7moI/moJDmoJHmoJLmoJPmoJTmoJXmoJbmoJfmoJjmoJnmoJrmoJvmoJzmoJ3moJ7moJ8KK+agoOagoeagouago+agpOagpeagpuagp+agqOagqeagquagq+agrOagreagruagr+agsOagseagsuags+agtOagteagtuagt+aguOagueaguuagu+agvOagveagvuagvwor5qGA5qGB5qGC5qGD5qGE5qGF5qGG5qGH5qGI5qGJ5qGK5qGL5qGM5qGN5qGO5qGP5qGQ5qGR5qGS5qGT5qGU5qGV5qGW5qGX5qGY5qGZ5qGa5qGb5qGc5qGd5qGe5qGfCivmoaDmoaHmoaLmoaPmoaTmoaXmoabmoafmoajmoanmoarmoavmoazmoa3moa7moa/mobDmobHmobLmobPmobTmobXmobbmobfmobjmobnmobrmobvmobzmob3mob7mob8KK+aigOaigeaiguaig+aihOaiheaihuaih+aiiOaiieaiiuaii+aijOaijeaijuaij+aikOaikeaikuaik+ailOaileailuail+aimOaimeaimuaim+ainOaineainuainwor5qKg5qKh5qKi5qKj5qKk5qKl5qKm5qKn5qKo5qKp5qKq5qKr5qKs5qKt5qKu5qKv5qKw5qKx5qKy5qKz5qK05qK15qK25qK35qK45qK55qK65qK75qK85qK95qK+5qK/Civmo4Dmo4Hmo4Lmo4Pmo4Tmo4Xmo4bmo4fmo4jmo4nmo4rmo4vmo4zmo43mo47mo4/mo5Dmo5Hmo5Lmo5Pmo5Tmo5Xmo5bmo5fmo5jmo5nmo5rmo5vmo5zmo53mo57mo58KK+ajoOajoeajouajo+ajpOajpeajpuajp+ajqOajqeajquajq+ajrOajreajruajr+ajsOajseajsuajs+ajtOajteajtuajt+ajuOajueajuuaju+ajvOajveajvuajvwor5qSA5qSB5qSC5qSD5qSE5qSF5qSG5qSH5qSI5qSJ5qSK5qSL5qSM5qSN5qSO5qSP5qSQ5qSR5qSS5qST5qSU5qSV5qSW5qSX5qSY5qSZ5qSa5qSb5qSc5qSd5qSe5qSfCivmpKDmpKHmpKLmpKPmpKTmpKXmpKbmpKfmpKjmpKnmpKrmpKvmpKzmpK3mpK7mpK/mpLDmpLHmpLLmpLPmpLTmpLXmpLbmpLfmpLjmpLnmpLrmpLvmpLzmpL3mpL7mpL8KK+algOalgealgualg+alhOalhealhualh+aliOaliealiuali+aljOaljealjualj+alkOalkealkualk+allOallealluall+almOalmealmualm+alnOalnealnualnwor5qWg5qWh5qWi5qWj5qWk5qWl5qWm5qWn5qWo5qWp5qWq5qWr5qWs5qWt5qWu5qWv5qWw5qWx5qWy5qWz5qW05qW15qW25qW35qW45qW55qW65qW75qW85qW95qW+5qW/CivmpoDmpoHmpoLmpoPmpoTmpoXmpobmpofmpojmponmpormpovmpozmpo3mpo7mpo/mppDmppHmppLmppPmppTmppXmppbmppfmppjmppnmpprmppvmppzmpp3mpp7mpp8KK+amoOamoeamouamo+ampOampeampuamp+amqOamqeamquamq+amrOamreamruamr+amsOamseamsuams+amtOamteamtuamt+amuOamueamuuamu+amvOamveamvuamvwor5qeA5qeB5qeC5qeD5qeE5qeF5qeG5qeH5qeI5qeJ5qeK5qeL5qeM5qeN5qeO5qeP5qeQ5qeR5qeS5qeT5qeU5qeV5qeW5qeX5qeY5qeZ5qea5qeb5qec5qed5qee5qefCivmp6Dmp6Hmp6Lmp6Pmp6Tmp6Xmp6bmp6fmp6jmp6nmp6rmp6vmp6zmp63mp67mp6/mp7Dmp7Hmp7Lmp7Pmp7Tmp7Xmp7bmp7fmp7jmp7nmp7rmp7vmp7zmp73mp77mp78KK+aogOaogeaoguaog+aohOaoheaohuaoh+aoiOaoieaoiuaoi+aojOaojeaojuaoj+aokOaokeaokuaok+aolOaoleaoluaol+aomOaomeaomuaom+aonOaoneaonuaonwor5qig5qih5qii5qij5qik5qil5qim5qin5qio5qip5qiq5qir5qis5qit5qiu5qiv5qiw5qix5qiy5qiz5qi05qi15qi25qi35qi45qi55qi65qi75qi85qi95qi+5qi/CivmqYDmqYHmqYLmqYPmqYTmqYXmqYbmqYfmqYjmqYnmqYrmqYvmqYzmqY3mqY7mqY/mqZDmqZHmqZLmqZPmqZTmqZXmqZbmqZfmqZjmqZnmqZrmqZvmqZzmqZ3mqZ7mqZ8KK+apoOapoeapouapo+appOappeappuapp+apqOapqeapquapq+aprOapreapruapr+apsOapseapsuaps+aptOapteaptuapt+apuOapueapuuapu+apvOapveapvuapvwor5qqA5qqB5qqC5qqD5qqE5qqF5qqG5qqH5qqI5qqJ5qqK5qqL5qqM5qqN5qqO5qqP5qqQ5qqR5qqS5qqT5qqU5qqV5qqW5qqX5qqY5qqZ5qqa5qqb5qqc5qqd5qqe5qqfCivmqqDmqqHmqqLmqqPmqqTmqqXmqqbmqqfmqqjmqqnmqqrmqqvmqqzmqq3mqq7mqq/mqrDmqrHmqrLmqrPmqrTmqrXmqrbmqrfmqrjmqrnmqrrmqrvmqrzmqr3mqr7mqr8KK+argOargearguarg+arhOarhearhuarh+ariOarieariuari+arjOarjearjuarj+arkOarkearkuark+arlOarlearluarl+armOarmearmuarm+arnOarnearnuarnwor5qug5quh5qui5quj5quk5qul5qum5qun5quo5qup5quq5qur5qus5qut5quu5quv5quw5qux5quy5quz5qu05qu15qu25qu35qu45qu55qu65qu75qu85qu95qu+5qu/CivmrIDmrIHmrILmrIPmrITmrIXmrIbmrIfmrIjmrInmrIrmrIvmrIzmrI3mrI7mrI/mrJDmrJHmrJLmrJPmrJTmrJXmrJbmrJfmrJjmrJnmrJrmrJvmrJzmrJ3mrJ7mrJ8KK+asoOasoeasouaso+aspOaspeaspuasp+asqOasqeasquasq+asrOasreasruasr+assOasseassuass+astOasteastuast+asuOasueasuuasu+asvOasveasvuasvwor5q2A5q2B5q2C5q2D5q2E5q2F5q2G5q2H5q2I5q2J5q2K5q2L5q2M5q2N5q2O5q2P5q2Q5q2R5q2S5q2T5q2U5q2V5q2W5q2X5q2Y5q2Z5q2a5q2b5q2c5q2d5q2e5q2fCivmraDmraHmraLmraPmraTmraXmrabmrafmrajmranmrarmravmrazmra3mra7mra/mrbDmrbHmrbLmrbPmrbTmrbXmrbbmrbfmrbjmrbnmrbrmrbvmrbzmrb3mrb7mrb8KK+augOaugeauguaug+auhOauheauhuauh+auiOauieauiuaui+aujOaujeaujuauj+aukOaukeaukuauk+aulOauleauluaul+aumOaumeaumuaum+aunOauneaunuaunwor5q6g5q6h5q6i5q6j5q6k5q6l5q6m5q6n5q6o5q6p5q6q5q6r5q6s5q6t5q6u5q6v5q6w5q6x5q6y5q6z5q605q615q625q635q645q655q665q675q685q695q6+5q6/Civmr4Dmr4Hmr4Lmr4Pmr4Tmr4Xmr4bmr4fmr4jmr4nmr4rmr4vmr4zmr43mr47mr4/mr5Dmr5Hmr5Lmr5Pmr5Tmr5Xmr5bmr5fmr5jmr5nmr5rmr5vmr5zmr53mr57mr58KK+avoOavoeavouavo+avpOavpeavpuavp+avqOavqeavquavq+avrOavreavruavr+avsOavseavsuavs+avtOavteavtuavt+avuOavueavuuavu+avvOavveavvuavvwor5rCA5rCB5rCC5rCD5rCE5rCF5rCG5rCH5rCI5rCJ5rCK5rCL5rCM5rCN5rCO5rCP5rCQ5rCR5rCS5rCT5rCU5rCV5rCW5rCX5rCY5rCZ5rCa5rCb5rCc5rCd5rCe5rCfCivmsKDmsKHmsKLmsKPmsKTmsKXmsKbmsKfmsKjmsKnmsKrmsKvmsKzmsK3msK7msK/msLDmsLHmsLLmsLPmsLTmsLXmsLbmsLfmsLjmsLnmsLrmsLvmsLzmsL3msL7msL8KK+axgOaxgeaxguaxg+axhOaxheaxhuaxh+axiOaxieaxiuaxi+axjOaxjeaxjuaxj+axkOaxkeaxkuaxk+axlOaxleaxluaxl+axmOaxmeaxmuaxm+axnOaxneaxnuaxnwor5rGg5rGh5rGi5rGj5rGk5rGl5rGm5rGn5rGo5rGp5rGq5rGr5rGs5rGt5rGu5rGv5rGw5rGx5rGy5rGz5rG05rG15rG25rG35rG45rG55rG65rG75rG85rG95rG+5rG/CivmsoDmsoHmsoLmsoPmsoTmsoXmsobmsofmsojmsonmsormsovmsozmso3mso7mso/mspDmspHmspLmspPmspTmspXmspbmspfmspjmspnmsprmspvmspzmsp3msp7msp8KK+ayoOayoeayouayo+aypOaypeaypuayp+ayqOayqeayquayq+ayrOayreayruayr+aysOayseaysuays+aytOayteaytuayt+ayuOayueayuuayu+ayvOayveayvuayvwor5rOA5rOB5rOC5rOD5rOE5rOF5rOG5rOH5rOI5rOJ5rOK5rOL5rOM5rON5rOO5rOP5rOQ5rOR5rOS5rOT5rOU5rOV5rOW5rOX5rOY5rOZ5rOa5rOb5rOc5rOd5rOe5rOfCivms6Dms6Hms6Lms6Pms6Tms6Xms6bms6fms6jms6nms6rms6vms6zms63ms67ms6/ms7Dms7Hms7Lms7Pms7Tms7Xms7bms7fms7jms7nms7rms7vms7zms73ms77ms78KK+a0gOa0gea0gua0g+a0hOa0hea0hua0h+a0iOa0iea0iua0i+a0jOa0jea0jua0j+a0kOa0kea0kua0k+a0lOa0lea0lua0l+a0mOa0mea0mua0m+a0nOa0nea0nua0nwor5rSg5rSh5rSi5rSj5rSk5rSl5rSm5rSn5rSo5rSp5rSq5rSr5rSs5rSt5rSu5rSv5rSw5rSx5rSy5rSz5rS05rS15rS25rS35rS45rS55rS65rS75rS85rS95rS+5rS/CivmtYDmtYHmtYLmtYPmtYTmtYXmtYbmtYfmtYjmtYnmtYrmtYvmtYzmtY3mtY7mtY/mtZDmtZHmtZLmtZPmtZTmtZXmtZbmtZfmtZjmtZnmtZrmtZvmtZzmtZ3mtZ7mtZ8KK+a1oOa1oea1oua1o+a1pOa1pea1pua1p+a1qOa1qea1qua1q+a1rOa1rea1rua1r+a1sOa1sea1sua1s+a1tOa1tea1tua1t+a1uOa1uea1uua1u+a1vOa1vea1vua1vwor5raA5raB5raC5raD5raE5raF5raG5raH5raI5raJ5raK5raL5raM5raN5raO5raP5raQ5raR5raS5raT5raU5raV5raW5raX5raY5raZ5raa5rab5rac5rad5rae5rafCivmtqDmtqHmtqLmtqPmtqTmtqXmtqbmtqfmtqjmtqnmtqrmtqvmtqzmtq3mtq7mtq/mtrDmtrHmtrLmtrPmtrTmtrXmtrbmtrfmtrjmtrnmtrrmtrvmtrzmtr3mtr7mtr8KK+a3gOa3gea3gua3g+a3hOa3hea3hua3h+a3iOa3iea3iua3i+a3jOa3jea3jua3j+a3kOa3kea3kua3k+a3lOa3lea3lua3l+a3mOa3mea3mua3m+a3nOa3nea3nua3nwor5reg5reh5rei5rej5rek5rel5rem5ren5reo5rep5req5rer5res5ret5reu5rev5rew5rex5rey5rez5re05re15re25re35re45re55re65re75re85re95re+5re/CivmuIDmuIHmuILmuIPmuITmuIXmuIbmuIfmuIjmuInmuIrmuIvmuIzmuI3muI7muI/muJDmuJHmuJLmuJPmuJTmuJXmuJbmuJfmuJjmuJnmuJrmuJvmuJzmuJ3muJ7muJ8KK+a4oOa4oea4oua4o+a4pOa4pea4pua4p+a4qOa4qea4qua4q+a4rOa4rea4rua4r+a4sOa4sea4sua4s+a4tOa4tea4tua4t+a4uOa4uea4uua4u+a4vOa4vea4vua4vwor5rmA5rmB5rmC5rmD5rmE5rmF5rmG5rmH5rmI5rmJ5rmK5rmL5rmM5rmN5rmO5rmP5rmQ5rmR5rmS5rmT5rmU5rmV5rmW5rmX5rmY5rmZ5rma5rmb5rmc5rmd5rme5rmfCivmuaDmuaHmuaLmuaPmuaTmuaXmuabmuafmuajmuanmuarmuavmuazmua3mua7mua/mubDmubHmubLmubPmubTmubXmubbmubfmubjmubnmubrmubvmubzmub3mub7mub8KK+a6gOa6gea6gua6g+a6hOa6hea6hua6h+a6iOa6iea6iua6i+a6jOa6jea6jua6j+a6kOa6kea6kua6k+a6lOa6lea6lua6l+a6mOa6mea6mua6m+a6nOa6nea6nua6nwor5rqg5rqh5rqi5rqj5rqk5rql5rqm5rqn5rqo5rqp5rqq5rqr5rqs5rqt5rqu5rqv5rqw5rqx5rqy5rqz5rq05rq15rq25rq35rq45rq55rq65rq75rq85rq95rq+5rq/Civmu4Dmu4Hmu4Lmu4Pmu4Tmu4Xmu4bmu4fmu4jmu4nmu4rmu4vmu4zmu43mu47mu4/mu5Dmu5Hmu5Lmu5Pmu5Tmu5Xmu5bmu5fmu5jmu5nmu5rmu5vmu5zmu53mu57mu58KK+a7oOa7oea7oua7o+a7pOa7pea7pua7p+a7qOa7qea7qua7q+a7rOa7rea7rua7r+a7sOa7sea7sua7s+a7tOa7tea7tua7t+a7uOa7uea7uua7u+a7vOa7vea7vua7vwor5ryA5ryB5ryC5ryD5ryE5ryF5ryG5ryH5ryI5ryJ5ryK5ryL5ryM5ryN5ryO5ryP5ryQ5ryR5ryS5ryT5ryU5ryV5ryW5ryX5ryY5ryZ5rya5ryb5ryc5ryd5rye5ryfCivmvKDmvKHmvKLmvKPmvKTmvKXmvKbmvKfmvKjmvKnmvKrmvKvmvKzmvK3mvK7mvK/mvLDmvLHmvLLmvLPmvLTmvLXmvLbmvLfmvLjmvLnmvLrmvLvmvLzmvL3mvL7mvL8KK+a9gOa9gea9gua9g+a9hOa9hea9hua9h+a9iOa9iea9iua9i+a9jOa9jea9jua9j+a9kOa9kea9kua9k+a9lOa9lea9lua9l+a9mOa9mea9mua9m+a9nOa9nea9nua9nwor5r2g5r2h5r2i5r2j5r2k5r2l5r2m5r2n5r2o5r2p5r2q5r2r5r2s5r2t5r2u5r2v5r2w5r2x5r2y5r2z5r205r215r225r235r245r255r265r275r285r295r2+5r2/CivmvoDmvoHmvoLmvoPmvoTmvoXmvobmvofmvojmvonmvormvovmvozmvo3mvo7mvo/mvpDmvpHmvpLmvpPmvpTmvpXmvpbmvpfmvpjmvpnmvprmvpvmvpzmvp3mvp7mvp8KK+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+vwor5r+A5r+B5r+C5r+D5r+E5r+F5r+G5r+H5r+I5r+J5r+K5r+L5r+M5r+N5r+O5r+P5r+Q5r+R5r+S5r+T5r+U5r+V5r+W5r+X5r+Y5r+Z5r+a5r+b5r+c5r+d5r+e5r+fCivmv6Dmv6Hmv6Lmv6Pmv6Tmv6Xmv6bmv6fmv6jmv6nmv6rmv6vmv6zmv63mv67mv6/mv7Dmv7Hmv7Lmv7Pmv7Tmv7Xmv7bmv7fmv7jmv7nmv7rmv7vmv7zmv73mv77mv78KK+eAgOeAgeeAgueAg+eAhOeAheeAhueAh+eAiOeAieeAiueAi+eAjOeAjeeAjueAj+eAkOeAkeeAkueAk+eAlOeAleeAlueAl+eAmOeAmeeAmueAm+eAnOeAneeAnueAnwor54Cg54Ch54Ci54Cj54Ck54Cl54Cm54Cn54Co54Cp54Cq54Cr54Cs54Ct54Cu54Cv54Cw54Cx54Cy54Cz54C054C154C254C354C454C554C654C754C854C954C+54C/CivngYDngYHngYLngYPngYTngYXngYbngYfngYjngYnngYrngYvngYzngY3ngY7ngY/ngZDngZHngZLngZPngZTngZXngZbngZfngZjngZnngZrngZvngZzngZ3ngZ7ngZ8KK+eBoOeBoeeBoueBo+eBpOeBpeeBpueBp+eBqOeBqeeBqueBq+eBrOeBreeBrueBr+eBsOeBseeBsueBs+eBtOeBteeBtueBt+eBuOeBueeBuueBu+eBvOeBveeBvueBvwor54KA54KB54KC54KD54KE54KF54KG54KH54KI54KJ54KK54KL54KM54KN54KO54KP54KQ54KR54KS54KT54KU54KV54KW54KX54KY54KZ54Ka54Kb54Kc54Kd54Ke54KfCivngqDngqHngqLngqPngqTngqXngqbngqfngqjngqnngqrngqvngqzngq3ngq7ngq/ngrDngrHngrLngrPngrTngrXngrbngrfngrjngrnngrrngrvngrzngr3ngr7ngr8KK+eDgOeDgeeDgueDg+eDhOeDheeDhueDh+eDiOeDieeDiueDi+eDjOeDjeeDjueDj+eDkOeDkeeDkueDk+eDlOeDleeDlueDl+eDmOeDmeeDmueDm+eDnOeDneeDnueDnwor54Og54Oh54Oi54Oj54Ok54Ol54Om54On54Oo54Op54Oq54Or54Os54Ot54Ou54Ov54Ow54Ox54Oy54Oz54O054O154O254O354O454O554O654O754O854O954O+54O/CivnhIDnhIHnhILnhIPnhITnhIXnhIbnhIfnhIjnhInnhIrnhIvnhIznhI3nhI7nhI/nhJDnhJHnhJLnhJPnhJTnhJXnhJbnhJfnhJjnhJnnhJrnhJvnhJznhJ3nhJ7nhJ8KK+eEoOeEoeeEoueEo+eEpOeEpeeEpueEp+eEqOeEqeeEqueEq+eErOeEreeErueEr+eEsOeEseeEsueEs+eEtOeEteeEtueEt+eEuOeEueeEuueEu+eEvOeEveeEvueEvwor54WA54WB54WC54WD54WE54WF54WG54WH54WI54WJ54WK54WL54WM54WN54WO54WP54WQ54WR54WS54WT54WU54WV54WW54WX54WY54WZ54Wa54Wb54Wc54Wd54We54WfCivnhaDnhaHnhaLnhaPnhaTnhaXnhabnhafnhajnhannharnhavnhaznha3nha7nha/nhbDnhbHnhbLnhbPnhbTnhbXnhbbnhbfnhbjnhbnnhbrnhbvnhbznhb3nhb7nhb8KK+eGgOeGgeeGgueGg+eGhOeGheeGhueGh+eGiOeGieeGiueGi+eGjOeGjeeGjueGj+eGkOeGkeeGkueGk+eGlOeGleeGlueGl+eGmOeGmeeGmueGm+eGnOeGneeGnueGnwor54ag54ah54ai54aj54ak54al54am54an54ao54ap54aq54ar54as54at54au54av54aw54ax54ay54az54a054a154a254a354a454a554a654a754a854a954a+54a/Civnh4Dnh4Hnh4Lnh4Pnh4Tnh4Xnh4bnh4fnh4jnh4nnh4rnh4vnh4znh43nh47nh4/nh5Dnh5Hnh5Lnh5Pnh5Tnh5Xnh5bnh5fnh5jnh5nnh5rnh5vnh5znh53nh57nh58KK+eHoOeHoeeHoueHo+eHpOeHpeeHpueHp+eHqOeHqeeHqueHq+eHrOeHreeHrueHr+eHsOeHseeHsueHs+eHtOeHteeHtueHt+eHuOeHueeHuueHu+eHvOeHveeHvueHvwor54iA54iB54iC54iD54iE54iF54iG54iH54iI54iJ54iK54iL54iM54iN54iO54iP54iQ54iR54iS54iT54iU54iV54iW54iX54iY54iZ54ia54ib54ic54id54ie54ifCivniKDniKHniKLniKPniKTniKXniKbniKfniKjniKnniKrniKvniKzniK3niK7niK/niLDniLHniLLniLPniLTniLXniLbniLfniLjniLnniLrniLvniLzniL3niL7niL8KK+eJgOeJgeeJgueJg+eJhOeJheeJhueJh+eJiOeJieeJiueJi+eJjOeJjeeJjueJj+eJkOeJkeeJkueJk+eJlOeJleeJlueJl+eJmOeJmeeJmueJm+eJnOeJneeJnueJnwor54mg54mh54mi54mj54mk54ml54mm54mn54mo54mp54mq54mr54ms54mt54mu54mv54mw54mx54my54mz54m054m154m254m354m454m554m654m754m854m954m+54m/CivnioDnioHnioLnioPnioTnioXniobniofniojnionniorniovnioznio3nio7nio/nipDnipHnipLnipPnipTnipXnipbnipfnipjnipnniprnipvnipznip3nip7nip8KK+eKoOeKoeeKoueKo+eKpOeKpeeKpueKp+eKqOeKqeeKqueKq+eKrOeKreeKrueKr+eKsOeKseeKsueKs+eKtOeKteeKtueKt+eKuOeKueeKuueKu+eKvOeKveeKvueKvwor54uA54uB54uC54uD54uE54uF54uG54uH54uI54uJ54uK54uL54uM54uN54uO54uP54uQ54uR54uS54uT54uU54uV54uW54uX54uY54uZ54ua54ub54uc54ud54ue54ufCivni6Dni6Hni6Lni6Pni6Tni6Xni6bni6fni6jni6nni6rni6vni6zni63ni67ni6/ni7Dni7Hni7Lni7Pni7Tni7Xni7bni7fni7jni7nni7rni7vni7zni73ni77ni78KK+eMgOeMgeeMgueMg+eMhOeMheeMhueMh+eMiOeMieeMiueMi+eMjOeMjeeMjueMj+eMkOeMkeeMkueMk+eMlOeMleeMlueMl+eMmOeMmeeMmueMm+eMnOeMneeMnueMnwor54yg54yh54yi54yj54yk54yl54ym54yn54yo54yp54yq54yr54ys54yt54yu54yv54yw54yx54yy54yz54y054y154y254y354y454y554y654y754y854y954y+54y/CivnjYDnjYHnjYLnjYPnjYTnjYXnjYbnjYfnjYjnjYnnjYrnjYvnjYznjY3njY7njY/njZDnjZHnjZLnjZPnjZTnjZXnjZbnjZfnjZjnjZnnjZrnjZvnjZznjZ3njZ7njZ8KK+eNoOeNoeeNoueNo+eNpOeNpeeNpueNp+eNqOeNqeeNqueNq+eNrOeNreeNrueNr+eNsOeNseeNsueNs+eNtOeNteeNtueNt+eNuOeNueeNuueNu+eNvOeNveeNvueNvwor546A546B546C546D546E546F546G546H546I546J546K546L546M546N546O546P546Q546R546S546T546U546V546W546X546Y546Z546a546b546c546d546e546fCivnjqDnjqHnjqLnjqPnjqTnjqXnjqbnjqfnjqjnjqnnjqrnjqvnjqznjq3njq7njq/njrDnjrHnjrLnjrPnjrTnjrXnjrbnjrfnjrjnjrnnjrrnjrvnjrznjr3njr7njr8KK+ePgOePgeePguePg+ePhOePheePhuePh+ePiOePieePiuePi+ePjOePjeePjuePj+ePkOePkeePkuePk+ePlOePleePluePl+ePmOePmeePmuePm+ePnOePneePnuePnwor54+g54+h54+i54+j54+k54+l54+m54+n54+o54+p54+q54+r54+s54+t54+u54+v54+w54+x54+y54+z54+054+154+254+354+454+554+654+754+854+954++54+/CivnkIDnkIHnkILnkIPnkITnkIXnkIbnkIfnkIjnkInnkIrnkIvnkIznkI3nkI7nkI/nkJDnkJHnkJLnkJPnkJTnkJXnkJbnkJfnkJjnkJnnkJrnkJvnkJznkJ3nkJ7nkJ8KK+eQoOeQoeeQoueQo+eQpOeQpeeQpueQp+eQqOeQqeeQqueQq+eQrOeQreeQrueQr+eQsOeQseeQsueQs+eQtOeQteeQtueQt+eQuOeQueeQuueQu+eQvOeQveeQvueQvwor55GA55GB55GC55GD55GE55GF55GG55GH55GI55GJ55GK55GL55GM55GN55GO55GP55GQ55GR55GS55GT55GU55GV55GW55GX55GY55GZ55Ga55Gb55Gc55Gd55Ge55GfCivnkaDnkaHnkaLnkaPnkaTnkaXnkabnkafnkajnkannkarnkavnkaznka3nka7nka/nkbDnkbHnkbLnkbPnkbTnkbXnkbbnkbfnkbjnkbnnkbrnkbvnkbznkb3nkb7nkb8KK+eSgOeSgeeSgueSg+eShOeSheeShueSh+eSiOeSieeSiueSi+eSjOeSjeeSjueSj+eSkOeSkeeSkueSk+eSlOeSleeSlueSl+eSmOeSmeeSmueSm+eSnOeSneeSnueSnwor55Kg55Kh55Ki55Kj55Kk55Kl55Km55Kn55Ko55Kp55Kq55Kr55Ks55Kt55Ku55Kv55Kw55Kx55Ky55Kz55K055K155K255K355K455K555K655K755K855K955K+55K/Civnk4Dnk4Hnk4Lnk4Pnk4Tnk4Xnk4bnk4fnk4jnk4nnk4rnk4vnk4znk43nk47nk4/nk5Dnk5Hnk5Lnk5Pnk5Tnk5Xnk5bnk5fnk5jnk5nnk5rnk5vnk5znk53nk57nk58KK+eToOeToeeToueTo+eTpOeTpeeTpueTp+eTqOeTqeeTqueTq+eTrOeTreeTrueTr+eTsOeTseeTsueTs+eTtOeTteeTtueTt+eTuOeTueeTuueTu+eTvOeTveeTvueTvwor55SA55SB55SC55SD55SE55SF55SG55SH55SI55SJ55SK55SL55SM55SN55SO55SP55SQ55SR55SS55ST55SU55SV55SW55SX55SY55SZ55Sa55Sb55Sc55Sd55Se55SfCivnlKDnlKHnlKLnlKPnlKTnlKXnlKbnlKfnlKjnlKnnlKrnlKvnlKznlK3nlK7nlK/nlLDnlLHnlLLnlLPnlLTnlLXnlLbnlLfnlLjnlLnnlLrnlLvnlLznlL3nlL7nlL8KK+eVgOeVgeeVgueVg+eVhOeVheeVhueVh+eViOeVieeViueVi+eVjOeVjeeVjueVj+eVkOeVkeeVkueVk+eVlOeVleeVlueVl+eVmOeVmeeVmueVm+eVnOeVneeVnueVnwor55Wg55Wh55Wi55Wj55Wk55Wl55Wm55Wn55Wo55Wp55Wq55Wr55Ws55Wt55Wu55Wv55Ww55Wx55Wy55Wz55W055W155W255W355W455W555W655W755W855W955W+55W/CivnloDnloHnloLnloPnloTnloXnlobnlofnlojnlonnlornlovnloznlo3nlo7nlo/nlpDnlpHnlpLnlpPnlpTnlpXnlpbnlpfnlpjnlpnnlprnlpvnlpznlp3nlp7nlp8KK+eWoOeWoeeWoueWo+eWpOeWpeeWpueWp+eWqOeWqeeWqueWq+eWrOeWreeWrueWr+eWsOeWseeWsueWs+eWtOeWteeWtueWt+eWuOeWueeWuueWu+eWvOeWveeWvueWvwor55eA55eB55eC55eD55eE55eF55eG55eH55eI55eJ55eK55eL55eM55eN55eO55eP55eQ55eR55eS55eT55eU55eV55eW55eX55eY55eZ55ea55eb55ec55ed55ee55efCivnl6Dnl6Hnl6Lnl6Pnl6Tnl6Xnl6bnl6fnl6jnl6nnl6rnl6vnl6znl63nl67nl6/nl7Dnl7Hnl7Lnl7Pnl7Tnl7Xnl7bnl7fnl7jnl7nnl7rnl7vnl7znl73nl77nl78KK+eYgOeYgeeYgueYg+eYhOeYheeYhueYh+eYiOeYieeYiueYi+eYjOeYjeeYjueYj+eYkOeYkeeYkueYk+eYlOeYleeYlueYl+eYmOeYmeeYmueYm+eYnOeYneeYnueYnwor55ig55ih55ii55ij55ik55il55im55in55io55ip55iq55ir55is55it55iu55iv55iw55ix55iy55iz55i055i155i255i355i455i555i655i755i855i955i+55i/CivnmYDnmYHnmYLnmYPnmYTnmYXnmYbnmYfnmYjnmYnnmYrnmYvnmYznmY3nmY7nmY/nmZDnmZHnmZLnmZPnmZTnmZXnmZbnmZfnmZjnmZnnmZrnmZvnmZznmZ3nmZ7nmZ8KK+eZoOeZoeeZoueZo+eZpOeZpeeZpueZp+eZqOeZqeeZqueZq+eZrOeZreeZrueZr+eZsOeZseeZsueZs+eZtOeZteeZtueZt+eZuOeZueeZuueZu+eZvOeZveeZvueZvwor55qA55qB55qC55qD55qE55qF55qG55qH55qI55qJ55qK55qL55qM55qN55qO55qP55qQ55qR55qS55qT55qU55qV55qW55qX55qY55qZ55qa55qb55qc55qd55qe55qfCivnmqDnmqHnmqLnmqPnmqTnmqXnmqbnmqfnmqjnmqnnmqrnmqvnmqznmq3nmq7nmq/nmrDnmrHnmrLnmrPnmrTnmrXnmrbnmrfnmrjnmrnnmrrnmrvnmrznmr3nmr7nmr8KK+ebgOebgeebguebg+ebhOebheebhuebh+ebiOebieebiuebi+ebjOebjeebjuebj+ebkOebkeebkuebk+eblOebleebluebl+ebmOebmeebmuebm+ebnOebneebnuebnwor55ug55uh55ui55uj55uk55ul55um55un55uo55up55uq55ur55us55ut55uu55uv55uw55ux55uy55uz55u055u155u255u355u455u555u655u755u855u955u+55u/CivnnIDnnIHnnILnnIPnnITnnIXnnIbnnIfnnIjnnInnnIrnnIvnnIznnI3nnI7nnI/nnJDnnJHnnJLnnJPnnJTnnJXnnJbnnJfnnJjnnJnnnJrnnJvnnJznnJ3nnJ7nnJ8KK+ecoOecoeecoueco+ecpOecpeecpuecp+ecqOecqeecquecq+ecrOecreecruecr+ecsOecseecsuecs+ectOecteectuect+ecuOecueecuuecu+ecvOecveecvuecvwor552A552B552C552D552E552F552G552H552I552J552K552L552M552N552O552P552Q552R552S552T552U552V552W552X552Y552Z552a552b552c552d552e552fCivnnaDnnaHnnaLnnaPnnaTnnaXnnabnnafnnajnnannnarnnavnnaznna3nna7nna/nnbDnnbHnnbLnnbPnnbTnnbXnnbbnnbfnnbjnnbnnnbrnnbvnnbznnb3nnb7nnb8KK+eegOeegeeegueeg+eehOeeheeehueeh+eeiOeeieeeiueei+eejOeejeeejueej+eekOeekeeekueek+eelOeeleeelueel+eemOeemeeemueem+eenOeeneeenueenwor556g556h556i556j556k556l556m556n556o556p556q556r556s556t556u556v556w556x556y556z5560556155625563556455655566556755685569556+556/Civnn4Dnn4Hnn4Lnn4Pnn4Tnn4Xnn4bnn4fnn4jnn4nnn4rnn4vnn4znn43nn47nn4/nn5Dnn5Hnn5Lnn5Pnn5Tnn5Xnn5bnn5fnn5jnn5nnn5rnn5vnn5znn53nn57nn58KK+efoOefoeefouefo+efpOefpeefpuefp+efqOefqeefquefq+efrOefreefruefr+efsOefseefsuefs+eftOefteeftueft+efuOefueefuuefu+efvOefveefvuefvwor56CA56CB56CC56CD56CE56CF56CG56CH56CI56CJ56CK56CL56CM56CN56CO56CP56CQ56CR56CS56CT56CU56CV56CW56CX56CY56CZ56Ca56Cb56Cc56Cd56Ce56CfCivnoKDnoKHnoKLnoKPnoKTnoKXnoKbnoKfnoKjnoKnnoKrnoKvnoKznoK3noK7noK/noLDnoLHnoLLnoLPnoLTnoLXnoLbnoLfnoLjnoLnnoLrnoLvnoLznoL3noL7noL8KK+ehgOehgeehguehg+ehhOehheehhuehh+ehiOehieehiuehi+ehjOehjeehjuehj+ehkOehkeehkuehk+ehlOehleehluehl+ehmOehmeehmuehm+ehnOehneehnuehnwor56Gg56Gh56Gi56Gj56Gk56Gl56Gm56Gn56Go56Gp56Gq56Gr56Gs56Gt56Gu56Gv56Gw56Gx56Gy56Gz56G056G156G256G356G456G556G656G756G856G956G+56G/CivnooDnooHnooLnooPnooTnooXnoobnoofnoojnoonnoornoovnooznoo3noo7noo/nopDnopHnopLnopPnopTnopXnopbnopfnopjnopnnoprnopvnopznop3nop7nop8KK+eioOeioeeioueio+eipOeipeeipueip+eiqOeiqeeiqueiq+eirOeireeirueir+eisOeiseeisueis+eitOeiteeitueit+eiuOeiueeiuueiu+eivOeiveeivueivwor56OA56OB56OC56OD56OE56OF56OG56OH56OI56OJ56OK56OL56OM56ON56OO56OP56OQ56OR56OS56OT56OU56OV56OW56OX56OY56OZ56Oa56Ob56Oc56Od56Oe56OfCivno6Dno6Hno6Lno6Pno6Tno6Xno6bno6fno6jno6nno6rno6vno6zno63no67no6/no7Dno7Hno7Lno7Pno7Tno7Xno7bno7fno7jno7nno7rno7vno7zno73no77no78KK+ekgOekgeekguekg+ekhOekheekhuekh+ekiOekieekiueki+ekjOekjeekjuekj+ekkOekkeekkuekk+eklOekleekluekl+ekmOekmeekmuekm+eknOekneeknueknwor56Sg56Sh56Si56Sj56Sk56Sl56Sm56Sn56So56Sp56Sq56Sr56Ss56St56Su56Sv56Sw56Sx56Sy56Sz56S056S156S256S356S456S556S656S756S856S956S+56S/CivnpYDnpYHnpYLnpYPnpYTnpYXnpYbnpYfnpYjnpYnnpYrnpYvnpYznpY3npY7npY/npZDnpZHnpZLnpZPnpZTnpZXnpZbnpZfnpZjnpZnnpZrnpZvnpZznpZ3npZ7npZ8KK+eloOeloeelouelo+elpOelpeelpuelp+elqOelqeelquelq+elrOelreelruelr+elsOelseelsuels+eltOelteeltuelt+eluOelueeluuelu+elvOelveelvuelvwor56aA56aB56aC56aD56aE56aF56aG56aH56aI56aJ56aK56aL56aM56aN56aO56aP56aQ56aR56aS56aT56aU56aV56aW56aX56aY56aZ56aa56ab56ac56ad56ae56afCivnpqDnpqHnpqLnpqPnpqTnpqXnpqbnpqfnpqjnpqnnpqrnpqvnpqznpq3npq7npq/nprDnprHnprLnprPnprTnprXnprbnprfnprjnprnnprrnprvnprznpr3npr7npr8KK+engOengeengueng+enhOenheenhuenh+eniOenieeniueni+enjOenjeenjuenj+enkOenkeenkuenk+enlOenleenluenl+enmOenmeenmuenm+ennOenneennuennwor56eg56eh56ei56ej56ek56el56em56en56eo56ep56eq56er56es56et56eu56ev56ew56ex56ey56ez56e056e156e256e356e456e556e656e756e856e956e+56e/CivnqIDnqIHnqILnqIPnqITnqIXnqIbnqIfnqIjnqInnqIrnqIvnqIznqI3nqI7nqI/nqJDnqJHnqJLnqJPnqJTnqJXnqJbnqJfnqJjnqJnnqJrnqJvnqJznqJ3nqJ7nqJ8KK+eooOeooeeooueoo+eopOeopeeopueop+eoqOeoqeeoqueoq+eorOeoreeorueor+eosOeoseeosueos+eotOeoteeotueot+eouOeoueeouueou+eovOeoveeovueovwor56mA56mB56mC56mD56mE56mF56mG56mH56mI56mJ56mK56mL56mM56mN56mO56mP56mQ56mR56mS56mT56mU56mV56mW56mX56mY56mZ56ma56mb56mc56md56me56mfCivnqaDnqaHnqaLnqaPnqaTnqaXnqabnqafnqajnqannqarnqavnqaznqa3nqa7nqa/nqbDnqbHnqbLnqbPnqbTnqbXnqbbnqbfnqbjnqbnnqbrnqbvnqbznqb3nqb7nqb8KK+eqgOeqgeeqgueqg+eqhOeqheeqhueqh+eqiOeqieeqiueqi+eqjOeqjeeqjueqj+eqkOeqkeeqkueqk+eqlOeqleeqlueql+eqmOeqmeeqmueqm+eqnOeqneeqnueqnwor56qg56qh56qi56qj56qk56ql56qm56qn56qo56qp56qq56qr56qs56qt56qu56qv56qw56qx56qy56qz56q056q156q256q356q456q556q656q756q856q956q+56q/Civnq4Dnq4Hnq4Lnq4Pnq4Tnq4Xnq4bnq4fnq4jnq4nnq4rnq4vnq4znq43nq47nq4/nq5Dnq5Hnq5Lnq5Pnq5Tnq5Xnq5bnq5fnq5jnq5nnq5rnq5vnq5znq53nq57nq58KK+eroOeroeerouero+erpOerpeerpuerp+erqOerqeerquerq+errOerreerruerr+ersOerseersuers+ertOerteertuert+eruOerueeruueru+ervOerveervuervwor56yA56yB56yC56yD56yE56yF56yG56yH56yI56yJ56yK56yL56yM56yN56yO56yP56yQ56yR56yS56yT56yU56yV56yW56yX56yY56yZ56ya56yb56yc56yd56ye56yfCivnrKDnrKHnrKLnrKPnrKTnrKXnrKbnrKfnrKjnrKnnrKrnrKvnrKznrK3nrK7nrK/nrLDnrLHnrLLnrLPnrLTnrLXnrLbnrLfnrLjnrLnnrLrnrLvnrLznrL3nrL7nrL8KK+etgOetgeetguetg+ethOetheethueth+etiOetieetiueti+etjOetjeetjuetj+etkOetkeetkuetk+etlOetleetluetl+etmOetmeetmuetm+etnOetneetnuetnwor562g562h562i562j562k562l562m562n562o562p562q562r562s562t562u562v562w562x562y562z5620562156225623562456255626562756285629562+562/CivnroDnroHnroLnroPnroTnroXnrobnrofnrojnronnrornrovnroznro3nro7nro/nrpDnrpHnrpLnrpPnrpTnrpXnrpbnrpfnrpjnrpnnrprnrpvnrpznrp3nrp7nrp8KK+euoOeuoeeuoueuo+eupOeupeeupueup+euqOeuqeeuqueuq+eurOeureeurueur+eusOeuseeusueus+eutOeuteeutueut+euuOeuueeuuueuu+euvOeuveeuvueuvwor56+A56+B56+C56+D56+E56+F56+G56+H56+I56+J56+K56+L56+M56+N56+O56+P56+Q56+R56+S56+T56+U56+V56+W56+X56+Y56+Z56+a56+b56+c56+d56+e56+fCivnr6Dnr6Hnr6Lnr6Pnr6Tnr6Xnr6bnr6fnr6jnr6nnr6rnr6vnr6znr63nr67nr6/nr7Dnr7Hnr7Lnr7Pnr7Tnr7Xnr7bnr7fnr7jnr7nnr7rnr7vnr7znr73nr77nr78KK+ewgOewgeewguewg+ewhOewheewhuewh+ewiOewieewiuewi+ewjOewjeewjuewj+ewkOewkeewkuewk+ewlOewleewluewl+ewmOewmeewmuewm+ewnOewneewnuewnwor57Cg57Ch57Ci57Cj57Ck57Cl57Cm57Cn57Co57Cp57Cq57Cr57Cs57Ct57Cu57Cv57Cw57Cx57Cy57Cz57C057C157C257C357C457C557C657C757C857C957C+57C/CivnsYDnsYHnsYLnsYPnsYTnsYXnsYbnsYfnsYjnsYnnsYrnsYvnsYznsY3nsY7nsY/nsZDnsZHnsZLnsZPnsZTnsZXnsZbnsZfnsZjnsZnnsZrnsZvnsZznsZ3nsZ7nsZ8KK+exoOexoeexouexo+expOexpeexpuexp+exqOexqeexquexq+exrOexreexruexr+exsOexseexsuexs+extOexteextuext+exuOexueexuuexu+exvOexveexvuexvwor57KA57KB57KC57KD57KE57KF57KG57KH57KI57KJ57KK57KL57KM57KN57KO57KP57KQ57KR57KS57KT57KU57KV57KW57KX57KY57KZ57Ka57Kb57Kc57Kd57Ke57KfCivnsqDnsqHnsqLnsqPnsqTnsqXnsqbnsqfnsqjnsqnnsqrnsqvnsqznsq3nsq7nsq/nsrDnsrHnsrLnsrPnsrTnsrXnsrbnsrfnsrjnsrnnsrrnsrvnsrznsr3nsr7nsr8KK+ezgOezgeezguezg+ezhOezheezhuezh+eziOezieeziuezi+ezjOezjeezjuezj+ezkOezkeezkuezk+ezlOezleezluezl+ezmOezmeezmuezm+eznOezneeznueznwor57Og57Oh57Oi57Oj57Ok57Ol57Om57On57Oo57Op57Oq57Or57Os57Ot57Ou57Ov57Ow57Ox57Oy57Oz57O057O157O257O357O457O557O657O757O857O957O+57O/CivntIDntIHntILntIPntITntIXntIbntIfntIjntInntIrntIvntIzntI3ntI7ntI/ntJDntJHntJLntJPntJTntJXntJbntJfntJjntJnntJrntJvntJzntJ3ntJ7ntJ8KK+e0oOe0oee0oue0o+e0pOe0pee0pue0p+e0qOe0qee0que0q+e0rOe0ree0rue0r+e0sOe0see0sue0s+e0tOe0tee0tue0t+e0uOe0uee0uue0u+e0vOe0vee0vue0vwor57WA57WB57WC57WD57WE57WF57WG57WH57WI57WJ57WK57WL57WM57WN57WO57WP57WQ57WR57WS57WT57WU57WV57WW57WX57WY57WZ57Wa57Wb57Wc57Wd57We57WfCivntaDntaHntaLntaPntaTntaXntabntafntajntanntarntavntaznta3nta7nta/ntbDntbHntbLntbPntbTntbXntbbntbfntbjntbnntbrntbvntbzntb3ntb7ntb8KK+e2gOe2gee2gue2g+e2hOe2hee2hue2h+e2iOe2iee2iue2i+e2jOe2jee2jue2j+e2kOe2kee2kue2k+e2lOe2lee2lue2l+e2mOe2mee2mue2m+e2nOe2nee2nue2nwor57ag57ah57ai57aj57ak57al57am57an57ao57ap57aq57ar57as57at57au57av57aw57ax57ay57az57a057a157a257a357a457a557a657a757a857a957a+57a/Civnt4Dnt4Hnt4Lnt4Pnt4Tnt4Xnt4bnt4fnt4jnt4nnt4rnt4vnt4znt43nt47nt4/nt5Dnt5Hnt5Lnt5Pnt5Tnt5Xnt5bnt5fnt5jnt5nnt5rnt5vnt5znt53nt57nt58KK+e3oOe3oee3oue3o+e3pOe3pee3pue3p+e3qOe3qee3que3q+e3rOe3ree3rue3r+e3sOe3see3sue3s+e3tOe3tee3tue3t+e3uOe3uee3uue3u+e3vOe3vee3vue3vwor57iA57iB57iC57iD57iE57iF57iG57iH57iI57iJ57iK57iL57iM57iN57iO57iP57iQ57iR57iS57iT57iU57iV57iW57iX57iY57iZ57ia57ib57ic57id57ie57ifCivnuKDnuKHnuKLnuKPnuKTnuKXnuKbnuKfnuKjnuKnnuKrnuKvnuKznuK3nuK7nuK/nuLDnuLHnuLLnuLPnuLTnuLXnuLbnuLfnuLjnuLnnuLrnuLvnuLznuL3nuL7nuL8KK+e5gOe5gee5gue5g+e5hOe5hee5hue5h+e5iOe5iee5iue5i+e5jOe5jee5jue5j+e5kOe5kee5kue5k+e5lOe5lee5lue5l+e5mOe5mee5mue5m+e5nOe5nee5nue5nwor57mg57mh57mi57mj57mk57ml57mm57mn57mo57mp57mq57mr57ms57mt57mu57mv57mw57mx57my57mz57m057m157m257m357m457m557m657m757m857m957m+57m/CivnuoDnuoHnuoLnuoPnuoTnuoXnuobnuofnuojnuonnuornuovnuoznuo3nuo7nuo/nupDnupHnupLnupPnupTnupXnupbnupfnupjnupnnuprnupvnupznup3nup7nup8KK+e6oOe6oee6oue6o+e6pOe6pee6pue6p+e6qOe6qee6que6q+e6rOe6ree6rue6r+e6sOe6see6sue6s+e6tOe6tee6tue6t+e6uOe6uee6uue6u+e6vOe6vee6vue6vwor57uA57uB57uC57uD57uE57uF57uG57uH57uI57uJ57uK57uL57uM57uN57uO57uP57uQ57uR57uS57uT57uU57uV57uW57uX57uY57uZ57ua57ub57uc57ud57ue57ufCivnu6Dnu6Hnu6Lnu6Pnu6Tnu6Xnu6bnu6fnu6jnu6nnu6rnu6vnu6znu63nu67nu6/nu7Dnu7Hnu7Lnu7Pnu7Tnu7Xnu7bnu7fnu7jnu7nnu7rnu7vnu7znu73nu77nu78KK+e8gOe8gee8gue8g+e8hOe8hee8hue8h+e8iOe8iee8iue8i+e8jOe8jee8jue8j+e8kOe8kee8kue8k+e8lOe8lee8lue8l+e8mOe8mee8mue8m+e8nOe8nee8nue8nwor57yg57yh57yi57yj57yk57yl57ym57yn57yo57yp57yq57yr57ys57yt57yu57yv57yw57yx57yy57yz57y057y157y257y357y457y557y657y757y857y957y+57y/CivnvYDnvYHnvYLnvYPnvYTnvYXnvYbnvYfnvYjnvYnnvYrnvYvnvYznvY3nvY7nvY/nvZDnvZHnvZLnvZPnvZTnvZXnvZbnvZfnvZjnvZnnvZrnvZvnvZznvZ3nvZ7nvZ8KK+e9oOe9oee9oue9o+e9pOe9pee9pue9p+e9qOe9qee9que9q+e9rOe9ree9rue9r+e9sOe9see9sue9s+e9tOe9tee9tue9t+e9uOe9uee9uue9u+e9vOe9vee9vue9vwor576A576B576C576D576E576F576G576H576I576J576K576L576M576N576O576P576Q576R576S576T576U576V576W576X576Y576Z576a576b576c576d576e576fCivnvqDnvqHnvqLnvqPnvqTnvqXnvqbnvqfnvqjnvqnnvqrnvqvnvqznvq3nvq7nvq/nvrDnvrHnvrLnvrPnvrTnvrXnvrbnvrfnvrjnvrnnvrrnvrvnvrznvr3nvr7nvr8KK+e/gOe/gee/gue/g+e/hOe/hee/hue/h+e/iOe/iee/iue/i+e/jOe/jee/jue/j+e/kOe/kee/kue/k+e/lOe/lee/lue/l+e/mOe/mee/mue/m+e/nOe/nee/nue/nwor57+g57+h57+i57+j57+k57+l57+m57+n57+o57+p57+q57+r57+s57+t57+u57+v57+w57+x57+y57+z57+057+157+257+357+457+557+657+757+857+957++57+/CivogIDogIHogILogIPogITogIXogIbogIfogIjogInogIrogIvogIzogI3ogI7ogI/ogJDogJHogJLogJPogJTogJXogJbogJfogJjogJnogJrogJvogJzogJ3ogJ7ogJ8KK+iAoOiAoeiAouiAo+iApOiApeiApuiAp+iAqOiAqeiAquiAq+iArOiAreiAruiAr+iAsOiAseiAsuiAs+iAtOiAteiAtuiAt+iAuOiAueiAuuiAu+iAvOiAveiAvuiAvwor6IGA6IGB6IGC6IGD6IGE6IGF6IGG6IGH6IGI6IGJ6IGK6IGL6IGM6IGN6IGO6IGP6IGQ6IGR6IGS6IGT6IGU6IGV6IGW6IGX6IGY6IGZ6IGa6IGb6IGc6IGd6IGe6IGfCivogaDogaHogaLogaPogaTogaXogabogafogajoganogarogavogazoga3oga7oga/ogbDogbHogbLogbPogbTogbXogbbogbfogbjogbnogbrogbvogbzogb3ogb7ogb8KK+iCgOiCgeiCguiCg+iChOiCheiChuiCh+iCiOiCieiCiuiCi+iCjOiCjeiCjuiCj+iCkOiCkeiCkuiCk+iClOiCleiCluiCl+iCmOiCmeiCmuiCm+iCnOiCneiCnuiCnwor6IKg6IKh6IKi6IKj6IKk6IKl6IKm6IKn6IKo6IKp6IKq6IKr6IKs6IKt6IKu6IKv6IKw6IKx6IKy6IKz6IK06IK16IK26IK36IK46IK56IK66IK76IK86IK96IK+6IK/Civog4Dog4Hog4Log4Pog4Tog4Xog4bog4fog4jog4nog4rog4vog4zog43og47og4/og5Dog5Hog5Log5Pog5Tog5Xog5bog5fog5jog5nog5rog5vog5zog53og57og58KK+iDoOiDoeiDouiDo+iDpOiDpeiDpuiDp+iDqOiDqeiDquiDq+iDrOiDreiDruiDr+iDsOiDseiDsuiDs+iDtOiDteiDtuiDt+iDuOiDueiDuuiDu+iDvOiDveiDvuiDvwor6ISA6ISB6ISC6ISD6ISE6ISF6ISG6ISH6ISI6ISJ6ISK6ISL6ISM6ISN6ISO6ISP6ISQ6ISR6ISS6IST6ISU6ISV6ISW6ISX6ISY6ISZ6ISa6ISb6ISc6ISd6ISe6ISfCivohKDohKHohKLohKPohKTohKXohKbohKfohKjohKnohKrohKvohKzohK3ohK7ohK/ohLDohLHohLLohLPohLTohLXohLbohLfohLjohLnohLrohLvohLzohL3ohL7ohL8KK+iFgOiFgeiFguiFg+iFhOiFheiFhuiFh+iFiOiFieiFiuiFi+iFjOiFjeiFjuiFj+iFkOiFkeiFkuiFk+iFlOiFleiFluiFl+iFmOiFmeiFmuiFm+iFnOiFneiFnuiFnwor6IWg6IWh6IWi6IWj6IWk6IWl6IWm6IWn6IWo6IWp6IWq6IWr6IWs6IWt6IWu6IWv6IWw6IWx6IWy6IWz6IW06IW16IW26IW36IW46IW56IW66IW76IW86IW96IW+6IW/CivohoDohoHohoLohoPohoTohoXohobohofohojohonohorohovohozoho3oho7oho/ohpDohpHohpLohpPohpTohpXohpbohpfohpjohpnohprohpvohpzohp3ohp7ohp8KK+iGoOiGoeiGouiGo+iGpOiGpeiGpuiGp+iGqOiGqeiGquiGq+iGrOiGreiGruiGr+iGsOiGseiGsuiGs+iGtOiGteiGtuiGt+iGuOiGueiGuuiGu+iGvOiGveiGvuiGvwor6IeA6IeB6IeC6IeD6IeE6IeF6IeG6IeH6IeI6IeJ6IeK6IeL6IeM6IeN6IeO6IeP6IeQ6IeR6IeS6IeT6IeU6IeV6IeW6IeX6IeY6IeZ6Iea6Ieb6Iec6Ied6Iee6IefCivoh6Doh6Hoh6Loh6Poh6Toh6Xoh6boh6foh6joh6noh6roh6voh6zoh63oh67oh6/oh7Doh7Hoh7Loh7Poh7Toh7Xoh7boh7foh7joh7noh7roh7voh7zoh73oh77oh78KK+iIgOiIgeiIguiIg+iIhOiIheiIhuiIh+iIiOiIieiIiuiIi+iIjOiIjeiIjuiIj+iIkOiIkeiIkuiIk+iIlOiIleiIluiIl+iImOiImeiImuiIm+iInOiIneiInuiInwor6Iig6Iih6Iii6Iij6Iik6Iil6Iim6Iin6Iio6Iip6Iiq6Iir6Iis6Iit6Iiu6Iiv6Iiw6Iix6Iiy6Iiz6Ii06Ii16Ii26Ii36Ii46Ii56Ii66Ii76Ii86Ii96Ii+6Ii/CivoiYDoiYHoiYLoiYPoiYToiYXoiYboiYfoiYjoiYnoiYroiYvoiYzoiY3oiY7oiY/oiZDoiZHoiZLoiZPoiZToiZXoiZboiZfoiZjoiZnoiZroiZvoiZzoiZ3oiZ7oiZ8KK+iJoOiJoeiJouiJo+iJpOiJpeiJpuiJp+iJqOiJqeiJquiJq+iJrOiJreiJruiJr+iJsOiJseiJsuiJs+iJtOiJteiJtuiJt+iJuOiJueiJuuiJu+iJvOiJveiJvuiJvwor6IqA6IqB6IqC6IqD6IqE6IqF6IqG6IqH6IqI6IqJ6IqK6IqL6IqM6IqN6IqO6IqP6IqQ6IqR6IqS6IqT6IqU6IqV6IqW6IqX6IqY6IqZ6Iqa6Iqb6Iqc6Iqd6Iqe6IqfCivoiqDoiqHoiqLoiqPoiqToiqXoiqboiqfoiqjoiqnoiqroiqvoiqzoiq3oiq7oiq/oirDoirHoirLoirPoirToirXoirboirfoirjoirnoirroirvoirzoir3oir7oir8KK+iLgOiLgeiLguiLg+iLhOiLheiLhuiLh+iLiOiLieiLiuiLi+iLjOiLjeiLjuiLj+iLkOiLkeiLkuiLk+iLlOiLleiLluiLl+iLmOiLmeiLmuiLm+iLnOiLneiLnuiLnwor6Iug6Iuh6Iui6Iuj6Iuk6Iul6Ium6Iun6Iuo6Iup6Iuq6Iur6Ius6Iut6Iuu6Iuv6Iuw6Iux6Iuy6Iuz6Iu06Iu16Iu26Iu36Iu46Iu56Iu66Iu76Iu86Iu96Iu+6Iu/CivojIDojIHojILojIPojITojIXojIbojIfojIjojInojIrojIvojIzojI3ojI7ojI/ojJDojJHojJLojJPojJTojJXojJbojJfojJjojJnojJrojJvojJzojJ3ojJ7ojJ8KK+iMoOiMoeiMouiMo+iMpOiMpeiMpuiMp+iMqOiMqeiMquiMq+iMrOiMreiMruiMr+iMsOiMseiMsuiMs+iMtOiMteiMtuiMt+iMuOiMueiMuuiMu+iMvOiMveiMvuiMvwor6I2A6I2B6I2C6I2D6I2E6I2F6I2G6I2H6I2I6I2J6I2K6I2L6I2M6I2N6I2O6I2P6I2Q6I2R6I2S6I2T6I2U6I2V6I2W6I2X6I2Y6I2Z6I2a6I2b6I2c6I2d6I2e6I2fCivojaDojaHojaLojaPojaTojaXojabojafojajojanojarojavojazoja3oja7oja/ojbDojbHojbLojbPojbTojbXojbbojbfojbjojbnojbrojbvojbzojb3ojb7ojb8KK+iOgOiOgeiOguiOg+iOhOiOheiOhuiOh+iOiOiOieiOiuiOi+iOjOiOjeiOjuiOj+iOkOiOkeiOkuiOk+iOlOiOleiOluiOl+iOmOiOmeiOmuiOm+iOnOiOneiOnuiOnwor6I6g6I6h6I6i6I6j6I6k6I6l6I6m6I6n6I6o6I6p6I6q6I6r6I6s6I6t6I6u6I6v6I6w6I6x6I6y6I6z6I606I616I626I636I646I656I666I676I686I696I6+6I6/Civoj4Doj4Hoj4Loj4Poj4Toj4Xoj4boj4foj4joj4noj4roj4voj4zoj43oj47oj4/oj5Doj5Hoj5Loj5Poj5Toj5Xoj5boj5foj5joj5noj5roj5voj5zoj53oj57oj58KK+iPoOiPoeiPouiPo+iPpOiPpeiPpuiPp+iPqOiPqeiPquiPq+iPrOiPreiPruiPr+iPsOiPseiPsuiPs+iPtOiPteiPtuiPt+iPuOiPueiPuuiPu+iPvOiPveiPvuiPvwor6JCA6JCB6JCC6JCD6JCE6JCF6JCG6JCH6JCI6JCJ6JCK6JCL6JCM6JCN6JCO6JCP6JCQ6JCR6JCS6JCT6JCU6JCV6JCW6JCX6JCY6JCZ6JCa6JCb6JCc6JCd6JCe6JCfCivokKDokKHokKLokKPokKTokKXokKbokKfokKjokKnokKrokKvokKzokK3okK7okK/okLDokLHokLLokLPokLTokLXokLbokLfokLjokLnokLrokLvokLzokL3okL7okL8KK+iRgOiRgeiRguiRg+iRhOiRheiRhuiRh+iRiOiRieiRiuiRi+iRjOiRjeiRjuiRj+iRkOiRkeiRkuiRk+iRlOiRleiRluiRl+iRmOiRmeiRmuiRm+iRnOiRneiRnuiRnwor6JGg6JGh6JGi6JGj6JGk6JGl6JGm6JGn6JGo6JGp6JGq6JGr6JGs6JGt6JGu6JGv6JGw6JGx6JGy6JGz6JG06JG16JG26JG36JG46JG56JG66JG76JG86JG96JG+6JG/CivokoDokoHokoLokoPokoTokoXokobokofokojokonokorokovokozoko3oko7oko/okpDokpHokpLokpPokpTokpXokpbokpfokpjokpnokprokpvokpzokp3okp7okp8KK+iSoOiSoeiSouiSo+iSpOiSpeiSpuiSp+iSqOiSqeiSquiSq+iSrOiSreiSruiSr+iSsOiSseiSsuiSs+iStOiSteiStuiSt+iSuOiSueiSuuiSu+iSvOiSveiSvuiSvwor6JOA6JOB6JOC6JOD6JOE6JOF6JOG6JOH6JOI6JOJ6JOK6JOL6JOM6JON6JOO6JOP6JOQ6JOR6JOS6JOT6JOU6JOV6JOW6JOX6JOY6JOZ6JOa6JOb6JOc6JOd6JOe6JOfCivok6Dok6Hok6Lok6Pok6Tok6Xok6bok6fok6jok6nok6rok6vok6zok63ok67ok6/ok7Dok7Hok7Lok7Pok7Tok7Xok7bok7fok7jok7nok7rok7vok7zok73ok77ok78KK+iUgOiUgeiUguiUg+iUhOiUheiUhuiUh+iUiOiUieiUiuiUi+iUjOiUjeiUjuiUj+iUkOiUkeiUkuiUk+iUlOiUleiUluiUl+iUmOiUmeiUmuiUm+iUnOiUneiUnuiUnwor6JSg6JSh6JSi6JSj6JSk6JSl6JSm6JSn6JSo6JSp6JSq6JSr6JSs6JSt6JSu6JSv6JSw6JSx6JSy6JSz6JS06JS16JS26JS36JS46JS56JS66JS76JS86JS96JS+6JS/CivolYDolYHolYLolYPolYTolYXolYbolYfolYjolYnolYrolYvolYzolY3olY7olY/olZDolZHolZLolZPolZTolZXolZbolZfolZjolZnolZrolZvolZzolZ3olZ7olZ8KK+iVoOiVoeiVouiVo+iVpOiVpeiVpuiVp+iVqOiVqeiVquiVq+iVrOiVreiVruiVr+iVsOiVseiVsuiVs+iVtOiVteiVtuiVt+iVuOiVueiVuuiVu+iVvOiVveiVvuiVvwor6JaA6JaB6JaC6JaD6JaE6JaF6JaG6JaH6JaI6JaJ6JaK6JaL6JaM6JaN6JaO6JaP6JaQ6JaR6JaS6JaT6JaU6JaV6JaW6JaX6JaY6JaZ6Jaa6Jab6Jac6Jad6Jae6JafCivolqDolqHolqLolqPolqTolqXolqbolqfolqjolqnolqrolqvolqzolq3olq7olq/olrDolrHolrLolrPolrTolrXolrbolrfolrjolrnolrrolrvolrzolr3olr7olr8KK+iXgOiXgeiXguiXg+iXhOiXheiXhuiXh+iXiOiXieiXiuiXi+iXjOiXjeiXjuiXj+iXkOiXkeiXkuiXk+iXlOiXleiXluiXl+iXmOiXmeiXmuiXm+iXnOiXneiXnuiXnwor6Jeg6Jeh6Jei6Jej6Jek6Jel6Jem6Jen6Jeo6Jep6Jeq6Jer6Jes6Jet6Jeu6Jev6Jew6Jex6Jey6Jez6Je06Je16Je26Je36Je46Je56Je66Je76Je86Je96Je+6Je/CivomIDomIHomILomIPomITomIXomIbomIfomIjomInomIromIvomIzomI3omI7omI/omJDomJHomJLomJPomJTomJXomJbomJfomJjomJnomJromJvomJzomJ3omJ7omJ8KK+iYoOiYoeiYouiYo+iYpOiYpeiYpuiYp+iYqOiYqeiYquiYq+iYrOiYreiYruiYr+iYsOiYseiYsuiYs+iYtOiYteiYtuiYt+iYuOiYueiYuuiYu+iYvOiYveiYvuiYvwor6JmA6JmB6JmC6JmD6JmE6JmF6JmG6JmH6JmI6JmJ6JmK6JmL6JmM6JmN6JmO6JmP6JmQ6JmR6JmS6JmT6JmU6JmV6JmW6JmX6JmY6JmZ6Jma6Jmb6Jmc6Jmd6Jme6JmfCivomaDomaHomaLomaPomaTomaXomabomafomajomanomaromavomazoma3oma7oma/ombDombHombLombPombTombXombbombfombjombnombrombvombzomb3omb7omb8KK+iagOiageiaguiag+iahOiaheiahuiah+iaiOiaieiaiuiai+iajOiajeiajuiaj+iakOiakeiakuiak+ialOialeialuial+iamOiameiamuiam+ianOianeianuianwor6Jqg6Jqh6Jqi6Jqj6Jqk6Jql6Jqm6Jqn6Jqo6Jqp6Jqq6Jqr6Jqs6Jqt6Jqu6Jqv6Jqw6Jqx6Jqy6Jqz6Jq06Jq16Jq26Jq36Jq46Jq56Jq66Jq76Jq86Jq96Jq+6Jq/Civom4Dom4Hom4Lom4Pom4Tom4Xom4bom4fom4jom4nom4rom4vom4zom43om47om4/om5Dom5Hom5Lom5Pom5Tom5Xom5bom5fom5jom5nom5rom5vom5zom53om57om58KK+iboOiboeibouibo+ibpOibpeibpuibp+ibqOibqeibquibq+ibrOibreibruibr+ibsOibseibsuibs+ibtOibteibtuibt+ibuOibueibuuibu+ibvOibveibvuibvwor6JyA6JyB6JyC6JyD6JyE6JyF6JyG6JyH6JyI6JyJ6JyK6JyL6JyM6JyN6JyO6JyP6JyQ6JyR6JyS6JyT6JyU6JyV6JyW6JyX6JyY6JyZ6Jya6Jyb6Jyc6Jyd6Jye6JyfCivonKDonKHonKLonKPonKTonKXonKbonKfonKjonKnonKronKvonKzonK3onK7onK/onLDonLHonLLonLPonLTonLXonLbonLfonLjonLnonLronLvonLzonL3onL7onL8KK+idgOidgeidguidg+idhOidheidhuidh+idiOidieidiuidi+idjOidjeidjuidj+idkOidkeidkuidk+idlOidleidluidl+idmOidmeidmuidm+idnOidneidnuidnwor6J2g6J2h6J2i6J2j6J2k6J2l6J2m6J2n6J2o6J2p6J2q6J2r6J2s6J2t6J2u6J2v6J2w6J2x6J2y6J2z6J206J216J226J236J246J256J266J276J286J296J2+6J2/CivonoDonoHonoLonoPonoTonoXonobonofonojonononoronovonozono3ono7ono/onpDonpHonpLonpPonpTonpXonpbonpfonpjonpnonpronpvonpzonp3onp7onp8KK+ieoOieoeieouieo+iepOiepeiepuiep+ieqOieqeiequieq+ierOiereieruier+iesOieseiesuies+ietOieteietuiet+ieuOieueieuuieu+ievOieveievuievwor6J+A6J+B6J+C6J+D6J+E6J+F6J+G6J+H6J+I6J+J6J+K6J+L6J+M6J+N6J+O6J+P6J+Q6J+R6J+S6J+T6J+U6J+V6J+W6J+X6J+Y6J+Z6J+a6J+b6J+c6J+d6J+e6J+fCivon6Don6Hon6Lon6Pon6Ton6Xon6bon6fon6jon6non6ron6von6zon63on67on6/on7Don7Hon7Lon7Pon7Ton7Xon7bon7fon7jon7non7ron7von7zon73on77on78KK+iggOiggeigguigg+ighOigheighuigh+igiOigieigiuigi+igjOigjeigjuigj+igkOigkeigkuigk+iglOigleigluigl+igmOigmeigmuigm+ignOigneignuignwor6KCg6KCh6KCi6KCj6KCk6KCl6KCm6KCn6KCo6KCp6KCq6KCr6KCs6KCt6KCu6KCv6KCw6KCx6KCy6KCz6KC06KC16KC26KC36KC46KC56KC66KC76KC86KC96KC+6KC/CivooYDooYHooYLooYPooYTooYXooYbooYfooYjooYnooYrooYvooYzooY3ooY7ooY/ooZDooZHooZLooZPooZTooZXooZbooZfooZjooZnooZrooZvooZzooZ3ooZ7ooZ8KK+ihoOihoeihouiho+ihpOihpeihpuihp+ihqOihqeihquihq+ihrOihreihruihr+ihsOihseihsuihs+ihtOihteihtuiht+ihuOihueihuuihu+ihvOihveihvuihvwor6KKA6KKB6KKC6KKD6KKE6KKF6KKG6KKH6KKI6KKJ6KKK6KKL6KKM6KKN6KKO6KKP6KKQ6KKR6KKS6KKT6KKU6KKV6KKW6KKX6KKY6KKZ6KKa6KKb6KKc6KKd6KKe6KKfCivooqDooqHooqLooqPooqTooqXooqbooqfooqjooqnooqrooqvooqzooq3ooq7ooq/oorDoorHoorLoorPoorToorXoorboorfoorjoornoorroorvoorzoor3oor7oor8KK+ijgOijgeijguijg+ijhOijheijhuijh+ijiOijieijiuiji+ijjOijjeijjuijj+ijkOijkeijkuijk+ijlOijleijluijl+ijmOijmeijmuijm+ijnOijneijnuijnwor6KOg6KOh6KOi6KOj6KOk6KOl6KOm6KOn6KOo6KOp6KOq6KOr6KOs6KOt6KOu6KOv6KOw6KOx6KOy6KOz6KO06KO16KO26KO36KO46KO56KO66KO76KO86KO96KO+6KO/CivopIDopIHopILopIPopITopIXopIbopIfopIjopInopIropIvopIzopI3opI7opI/opJDopJHopJLopJPopJTopJXopJbopJfopJjopJnopJropJvopJzopJ3opJ7opJ8KK+ikoOikoeikouiko+ikpOikpeikpuikp+ikqOikqeikquikq+ikrOikreikruikr+iksOikseiksuiks+iktOikteiktuikt+ikuOikueikuuiku+ikvOikveikvuikvwor6KWA6KWB6KWC6KWD6KWE6KWF6KWG6KWH6KWI6KWJ6KWK6KWL6KWM6KWN6KWO6KWP6KWQ6KWR6KWS6KWT6KWU6KWV6KWW6KWX6KWY6KWZ6KWa6KWb6KWc6KWd6KWe6KWfCivopaDopaHopaLopaPopaTopaXopabopafopajopanoparopavopazopa3opa7opa/opbDopbHopbLopbPopbTopbXopbbopbfopbjopbnopbropbvopbzopb3opb7opb8KK+imgOimgeimguimg+imhOimheimhuimh+imiOimieimiuimi+imjOimjeimjuimj+imkOimkeimkuimk+imlOimleimluiml+immOimmeimmuimm+imnOimneimnuimnwor6Kag6Kah6Kai6Kaj6Kak6Kal6Kam6Kan6Kao6Kap6Kaq6Kar6Kas6Kat6Kau6Kav6Kaw6Kax6Kay6Kaz6Ka06Ka16Ka26Ka36Ka46Ka56Ka66Ka76Ka86Ka96Ka+6Ka/Civop4Dop4Hop4Lop4Pop4Top4Xop4bop4fop4jop4nop4rop4vop4zop43op47op4/op5Dop5Hop5Lop5Pop5Top5Xop5bop5fop5jop5nop5rop5vop5zop53op57op58KK+inoOinoeinouino+inpOinpeinpuinp+inqOinqeinquinq+inrOinreinruinr+insOinseinsuins+intOinteintuint+inuOinueinuuinu+invOinveinvuinvwor6KiA6KiB6KiC6KiD6KiE6KiF6KiG6KiH6KiI6KiJ6KiK6KiL6KiM6KiN6KiO6KiP6KiQ6KiR6KiS6KiT6KiU6KiV6KiW6KiX6KiY6KiZ6Kia6Kib6Kic6Kid6Kie6KifCivoqKDoqKHoqKLoqKPoqKToqKXoqKboqKfoqKjoqKnoqKroqKvoqKzoqK3oqK7oqK/oqLDoqLHoqLLoqLPoqLToqLXoqLboqLfoqLjoqLnoqLroqLvoqLzoqL3oqL7oqL8KK+ipgOipgeipguipg+iphOipheiphuiph+ipiOipieipiuipi+ipjOipjeipjuipj+ipkOipkeipkuipk+iplOipleipluipl+ipmOipmeipmuipm+ipnOipneipnuipnwor6Kmg6Kmh6Kmi6Kmj6Kmk6Kml6Kmm6Kmn6Kmo6Kmp6Kmq6Kmr6Kms6Kmt6Kmu6Kmv6Kmw6Kmx6Kmy6Kmz6Km06Km16Km26Km36Km46Km56Km66Km76Km86Km96Km+6Km/CivoqoDoqoHoqoLoqoPoqoToqoXoqoboqofoqojoqonoqoroqovoqozoqo3oqo7oqo/oqpDoqpHoqpLoqpPoqpToqpXoqpboqpfoqpjoqpnoqproqpvoqpzoqp3oqp7oqp8KK+iqoOiqoeiqouiqo+iqpOiqpeiqpuiqp+iqqOiqqeiqquiqq+iqrOiqreiqruiqr+iqsOiqseiqsuiqs+iqtOiqteiqtuiqt+iquOiqueiquuiqu+iqvOiqveiqvuiqvwor6KuA6KuB6KuC6KuD6KuE6KuF6KuG6KuH6KuI6KuJ6KuK6KuL6KuM6KuN6KuO6KuP6KuQ6KuR6KuS6KuT6KuU6KuV6KuW6KuX6KuY6KuZ6Kua6Kub6Kuc6Kud6Kue6KufCivoq6Doq6Hoq6Loq6Poq6Toq6Xoq6boq6foq6joq6noq6roq6voq6zoq63oq67oq6/oq7Doq7Hoq7Loq7Poq7Toq7Xoq7boq7foq7joq7noq7roq7voq7zoq73oq77oq78KK+isgOisgeisguisg+ishOisheishuish+isiOisieisiuisi+isjOisjeisjuisj+iskOiskeiskuisk+islOisleisluisl+ismOismeismuism+isnOisneisnuisnwor6Kyg6Kyh6Kyi6Kyj6Kyk6Kyl6Kym6Kyn6Kyo6Kyp6Kyq6Kyr6Kys6Kyt6Kyu6Kyv6Kyw6Kyx6Kyy6Kyz6Ky06Ky16Ky26Ky36Ky46Ky56Ky66Ky76Ky86Ky96Ky+6Ky/CivorYDorYHorYLorYPorYTorYXorYborYforYjorYnorYrorYvorYzorY3orY7orY/orZDorZHorZLorZPorZTorZXorZborZforZjorZnorZrorZvorZzorZ3orZ7orZ8KK+itoOitoeitouito+itpOitpeitpuitp+itqOitqeitquitq+itrOitreitruitr+itsOitseitsuits+ittOitteittuitt+ituOitueituuitu+itvOitveitvuitvwor6K6A6K6B6K6C6K6D6K6E6K6F6K6G6K6H6K6I6K6J6K6K6K6L6K6M6K6N6K6O6K6P6K6Q6K6R6K6S6K6T6K6U6K6V6K6W6K6X6K6Y6K6Z6K6a6K6b6K6c6K6d6K6e6K6fCivorqDorqHorqLorqPorqTorqXorqborqforqjorqnorqrorqvorqzorq3orq7orq/orrDorrHorrLorrPorrTorrXorrborrforrjorrnorrrorrvorrzorr3orr7orr8KK+ivgOivgeivguivg+ivhOivheivhuivh+iviOivieiviuivi+ivjOivjeivjuivj+ivkOivkeivkuivk+ivlOivleivluivl+ivmOivmeivmuivm+ivnOivneivnuivnwor6K+g6K+h6K+i6K+j6K+k6K+l6K+m6K+n6K+o6K+p6K+q6K+r6K+s6K+t6K+u6K+v6K+w6K+x6K+y6K+z6K+06K+16K+26K+36K+46K+56K+66K+76K+86K+96K++6K+/CivosIDosIHosILosIPosITosIXosIbosIfosIjosInosIrosIvosIzosI3osI7osI/osJDosJHosJLosJPosJTosJXosJbosJfosJjosJnosJrosJvosJzosJ3osJ7osJ8KK+iwoOiwoeiwouiwo+iwpOiwpeiwpuiwp+iwqOiwqeiwquiwq+iwrOiwreiwruiwr+iwsOiwseiwsuiws+iwtOiwteiwtuiwt+iwuOiwueiwuuiwu+iwvOiwveiwvuiwvwor6LGA6LGB6LGC6LGD6LGE6LGF6LGG6LGH6LGI6LGJ6LGK6LGL6LGM6LGN6LGO6LGP6LGQ6LGR6LGS6LGT6LGU6LGV6LGW6LGX6LGY6LGZ6LGa6LGb6LGc6LGd6LGe6LGfCivosaDosaHosaLosaPosaTosaXosabosafosajosanosarosavosazosa3osa7osa/osbDosbHosbLosbPosbTosbXosbbosbfosbjosbnosbrosbvosbzosb3osb7osb8KK+iygOiygeiyguiyg+iyhOiyheiyhuiyh+iyiOiyieiyiuiyi+iyjOiyjeiyjuiyj+iykOiykeiykuiyk+iylOiyleiyluiyl+iymOiymeiymuiym+iynOiyneiynuiynwor6LKg6LKh6LKi6LKj6LKk6LKl6LKm6LKn6LKo6LKp6LKq6LKr6LKs6LKt6LKu6LKv6LKw6LKx6LKy6LKz6LK06LK16LK26LK36LK46LK56LK66LK76LK86LK96LK+6LK/Civos4Dos4Hos4Los4Pos4Tos4Xos4bos4fos4jos4nos4ros4vos4zos43os47os4/os5Dos5Hos5Los5Pos5Tos5Xos5bos5fos5jos5nos5ros5vos5zos53os57os58KK+izoOizoeizouizo+izpOizpeizpuizp+izqOizqeizquizq+izrOizreizruizr+izsOizseizsuizs+iztOizteiztuizt+izuOizueizuuizu+izvOizveizvuizvwor6LSA6LSB6LSC6LSD6LSE6LSF6LSG6LSH6LSI6LSJ6LSK6LSL6LSM6LSN6LSO6LSP6LSQ6LSR6LSS6LST6LSU6LSV6LSW6LSX6LSY6LSZ6LSa6LSb6LSc6LSd6LSe6LSfCivotKDotKHotKLotKPotKTotKXotKbotKfotKjotKnotKrotKvotKzotK3otK7otK/otLDotLHotLLotLPotLTotLXotLbotLfotLjotLnotLrotLvotLzotL3otL7otL8KK+i1gOi1gei1gui1g+i1hOi1hei1hui1h+i1iOi1iei1iui1i+i1jOi1jei1jui1j+i1kOi1kei1kui1k+i1lOi1lei1lui1l+i1mOi1mei1mui1m+i1nOi1nei1nui1nwor6LWg6LWh6LWi6LWj6LWk6LWl6LWm6LWn6LWo6LWp6LWq6LWr6LWs6LWt6LWu6LWv6LWw6LWx6LWy6LWz6LW06LW16LW26LW36LW46LW56LW66LW76LW86LW96LW+6LW/CivotoDotoHotoLotoPotoTotoXotobotofotojotonotorotovotozoto3oto7oto/otpDotpHotpLotpPotpTotpXotpbotpfotpjotpnotprotpvotpzotp3otp7otp8KK+i2oOi2oei2oui2o+i2pOi2pei2pui2p+i2qOi2qei2qui2q+i2rOi2rei2rui2r+i2sOi2sei2sui2s+i2tOi2tei2tui2t+i2uOi2uei2uui2u+i2vOi2vei2vui2vwor6LeA6LeB6LeC6LeD6LeE6LeF6LeG6LeH6LeI6LeJ6LeK6LeL6LeM6LeN6LeO6LeP6LeQ6LeR6LeS6LeT6LeU6LeV6LeW6LeX6LeY6LeZ6Lea6Leb6Lec6Led6Lee6LefCivot6Dot6Hot6Lot6Pot6Tot6Xot6bot6fot6jot6not6rot6vot6zot63ot67ot6/ot7Dot7Hot7Lot7Pot7Tot7Xot7bot7fot7jot7not7rot7vot7zot73ot77ot78KK+i4gOi4gei4gui4g+i4hOi4hei4hui4h+i4iOi4iei4iui4i+i4jOi4jei4jui4j+i4kOi4kei4kui4k+i4lOi4lei4lui4l+i4mOi4mei4mui4m+i4nOi4nei4nui4nwor6Lig6Lih6Lii6Lij6Lik6Lil6Lim6Lin6Lio6Lip6Liq6Lir6Lis6Lit6Liu6Liv6Liw6Lix6Liy6Liz6Li06Li16Li26Li36Li46Li56Li66Li76Li86Li96Li+6Li/CivouYDouYHouYLouYPouYTouYXouYbouYfouYjouYnouYrouYvouYzouY3ouY7ouY/ouZDouZHouZLouZPouZTouZXouZbouZfouZjouZnouZrouZvouZzouZ3ouZ7ouZ8KK+i5oOi5oei5oui5o+i5pOi5pei5pui5p+i5qOi5qei5qui5q+i5rOi5rei5rui5r+i5sOi5sei5sui5s+i5tOi5tei5tui5t+i5uOi5uei5uui5u+i5vOi5vei5vui5vwor6LqA6LqB6LqC6LqD6LqE6LqF6LqG6LqH6LqI6LqJ6LqK6LqL6LqM6LqN6LqO6LqP6LqQ6LqR6LqS6LqT6LqU6LqV6LqW6LqX6LqY6LqZ6Lqa6Lqb6Lqc6Lqd6Lqe6LqfCivouqDouqHouqLouqPouqTouqXouqbouqfouqjouqnouqrouqvouqzouq3ouq7ouq/ourDourHourLourPourTourXourbourfourjournourrourvourzour3our7our8KK+i7gOi7gei7gui7g+i7hOi7hei7hui7h+i7iOi7iei7iui7i+i7jOi7jei7jui7j+i7kOi7kei7kui7k+i7lOi7lei7lui7l+i7mOi7mei7mui7m+i7nOi7nei7nui7nwor6Lug6Luh6Lui6Luj6Luk6Lul6Lum6Lun6Luo6Lup6Luq6Lur6Lus6Lut6Luu6Luv6Luw6Lux6Luy6Luz6Lu06Lu16Lu26Lu36Lu46Lu56Lu66Lu76Lu86Lu96Lu+6Lu/CivovIDovIHovILovIPovITovIXovIbovIfovIjovInovIrovIvovIzovI3ovI7ovI/ovJDovJHovJLovJPovJTovJXovJbovJfovJjovJnovJrovJvovJzovJ3ovJ7ovJ8KK+i8oOi8oei8oui8o+i8pOi8pei8pui8p+i8qOi8qei8qui8q+i8rOi8rei8rui8r+i8sOi8sei8sui8s+i8tOi8tei8tui8t+i8uOi8uei8uui8u+i8vOi8vei8vui8vwor6L2A6L2B6L2C6L2D6L2E6L2F6L2G6L2H6L2I6L2J6L2K6L2L6L2M6L2N6L2O6L2P6L2Q6L2R6L2S6L2T6L2U6L2V6L2W6L2X6L2Y6L2Z6L2a6L2b6L2c6L2d6L2e6L2fCivovaDovaHovaLovaPovaTovaXovabovafovajovanovarovavovazova3ova7ova/ovbDovbHovbLovbPovbTovbXovbbovbfovbjovbnovbrovbvovbzovb3ovb7ovb8KK+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+nwor6L6g6L6h6L6i6L6j6L6k6L6l6L6m6L6n6L6o6L6p6L6q6L6r6L6s6L6t6L6u6L6v6L6w6L6x6L6y6L6z6L606L616L626L636L646L656L666L676L686L696L6+6L6/Civov4Dov4Hov4Lov4Pov4Tov4Xov4bov4fov4jov4nov4rov4vov4zov43ov47ov4/ov5Dov5Hov5Lov5Pov5Tov5Xov5bov5fov5jov5nov5rov5vov5zov53ov57ov58KK+i/oOi/oei/oui/o+i/pOi/pei/pui/p+i/qOi/qei/qui/q+i/rOi/rei/rui/r+i/sOi/sei/sui/s+i/tOi/tei/tui/t+i/uOi/uei/uui/u+i/vOi/vei/vui/vwor6YCA6YCB6YCC6YCD6YCE6YCF6YCG6YCH6YCI6YCJ6YCK6YCL6YCM6YCN6YCO6YCP6YCQ6YCR6YCS6YCT6YCU6YCV6YCW6YCX6YCY6YCZ6YCa6YCb6YCc6YCd6YCe6YCfCivpgKDpgKHpgKLpgKPpgKTpgKXpgKbpgKfpgKjpgKnpgKrpgKvpgKzpgK3pgK7pgK/pgLDpgLHpgLLpgLPpgLTpgLXpgLbpgLfpgLjpgLnpgLrpgLvpgLzpgL3pgL7pgL8KK+mBgOmBgemBgumBg+mBhOmBhemBhumBh+mBiOmBiemBiumBi+mBjOmBjemBjumBj+mBkOmBkemBkumBk+mBlOmBlemBlumBl+mBmOmBmemBmumBm+mBnOmBnemBnumBnwor6YGg6YGh6YGi6YGj6YGk6YGl6YGm6YGn6YGo6YGp6YGq6YGr6YGs6YGt6YGu6YGv6YGw6YGx6YGy6YGz6YG06YG16YG26YG36YG46YG56YG66YG76YG86YG96YG+6YG/CivpgoDpgoHpgoLpgoPpgoTpgoXpgobpgofpgojpgonpgorpgovpgozpgo3pgo7pgo/pgpDpgpHpgpLpgpPpgpTpgpXpgpbpgpfpgpjpgpnpgprpgpvpgpzpgp3pgp7pgp8KK+mCoOmCoemCoumCo+mCpOmCpemCpumCp+mCqOmCqemCqumCq+mCrOmCremCrumCr+mCsOmCsemCsumCs+mCtOmCtemCtumCt+mCuOmCuemCuumCu+mCvOmCvemCvumCvwor6YOA6YOB6YOC6YOD6YOE6YOF6YOG6YOH6YOI6YOJ6YOK6YOL6YOM6YON6YOO6YOP6YOQ6YOR6YOS6YOT6YOU6YOV6YOW6YOX6YOY6YOZ6YOa6YOb6YOc6YOd6YOe6YOfCivpg6Dpg6Hpg6Lpg6Ppg6Tpg6Xpg6bpg6fpg6jpg6npg6rpg6vpg6zpg63pg67pg6/pg7Dpg7Hpg7Lpg7Ppg7Tpg7Xpg7bpg7fpg7jpg7npg7rpg7vpg7zpg73pg77pg78KK+mEgOmEgemEgumEg+mEhOmEhemEhumEh+mEiOmEiemEiumEi+mEjOmEjemEjumEj+mEkOmEkemEkumEk+mElOmElemElumEl+mEmOmEmemEmumEm+mEnOmEnemEnumEnwor6YSg6YSh6YSi6YSj6YSk6YSl6YSm6YSn6YSo6YSp6YSq6YSr6YSs6YSt6YSu6YSv6YSw6YSx6YSy6YSz6YS06YS16YS26YS36YS46YS56YS66YS76YS86YS96YS+6YS/CivphYDphYHphYLphYPphYTphYXphYbphYfphYjphYnphYrphYvphYzphY3phY7phY/phZDphZHphZLphZPphZTphZXphZbphZfphZjphZnphZrphZvphZzphZ3phZ7phZ8KK+mFoOmFoemFoumFo+mFpOmFpemFpumFp+mFqOmFqemFqumFq+mFrOmFremFrumFr+mFsOmFsemFsumFs+mFtOmFtemFtumFt+mFuOmFuemFuumFu+mFvOmFvemFvumFvwor6YaA6YaB6YaC6YaD6YaE6YaF6YaG6YaH6YaI6YaJ6YaK6YaL6YaM6YaN6YaO6YaP6YaQ6YaR6YaS6YaT6YaU6YaV6YaW6YaX6YaY6YaZ6Yaa6Yab6Yac6Yad6Yae6YafCivphqDphqHphqLphqPphqTphqXphqbphqfphqjphqnphqrphqvphqzphq3phq7phq/phrDphrHphrLphrPphrTphrXphrbphrfphrjphrnphrrphrvphrzphr3phr7phr8KK+mHgOmHgemHgumHg+mHhOmHhemHhumHh+mHiOmHiemHiumHi+mHjOmHjemHjumHj+mHkOmHkemHkumHk+mHlOmHlemHlumHl+mHmOmHmemHmumHm+mHnOmHnemHnumHnwor6Yeg6Yeh6Yei6Yej6Yek6Yel6Yem6Yen6Yeo6Yep6Yeq6Yer6Yes6Yet6Yeu6Yev6Yew6Yex6Yey6Yez6Ye06Ye16Ye26Ye36Ye46Ye56Ye66Ye76Ye86Ye96Ye+6Ye/CivpiIDpiIHpiILpiIPpiITpiIXpiIbpiIfpiIjpiInpiIrpiIvpiIzpiI3piI7piI/piJDpiJHpiJLpiJPpiJTpiJXpiJbpiJfpiJjpiJnpiJrpiJvpiJzpiJ3piJ7piJ8KK+mIoOmIoemIoumIo+mIpOmIpemIpumIp+mIqOmIqemIqumIq+mIrOmIremIrumIr+mIsOmIsemIsumIs+mItOmItemItumIt+mIuOmIuemIuumIu+mIvOmIvemIvumIvwor6YmA6YmB6YmC6YmD6YmE6YmF6YmG6YmH6YmI6YmJ6YmK6YmL6YmM6YmN6YmO6YmP6YmQ6YmR6YmS6YmT6YmU6YmV6YmW6YmX6YmY6YmZ6Yma6Ymb6Ymc6Ymd6Yme6YmfCivpiaDpiaHpiaLpiaPpiaTpiaXpiabpiafpiajpianpiarpiavpiazpia3pia7pia/pibDpibHpibLpibPpibTpibXpibbpibfpibjpibnpibrpibvpibzpib3pib7pib8KK+mKgOmKgemKgumKg+mKhOmKhemKhumKh+mKiOmKiemKiumKi+mKjOmKjemKjumKj+mKkOmKkemKkumKk+mKlOmKlemKlumKl+mKmOmKmemKmumKm+mKnOmKnemKnumKnwor6Yqg6Yqh6Yqi6Yqj6Yqk6Yql6Yqm6Yqn6Yqo6Yqp6Yqq6Yqr6Yqs6Yqt6Yqu6Yqv6Yqw6Yqx6Yqy6Yqz6Yq06Yq16Yq26Yq36Yq46Yq56Yq66Yq76Yq86Yq96Yq+6Yq/Civpi4Dpi4Hpi4Lpi4Ppi4Tpi4Xpi4bpi4fpi4jpi4npi4rpi4vpi4zpi43pi47pi4/pi5Dpi5Hpi5Lpi5Ppi5Tpi5Xpi5bpi5fpi5jpi5npi5rpi5vpi5zpi53pi57pi58KK+mLoOmLoemLoumLo+mLpOmLpemLpumLp+mLqOmLqemLqumLq+mLrOmLremLrumLr+mLsOmLsemLsumLs+mLtOmLtemLtumLt+mLuOmLuemLuumLu+mLvOmLvemLvumLvwor6YyA6YyB6YyC6YyD6YyE6YyF6YyG6YyH6YyI6YyJ6YyK6YyL6YyM6YyN6YyO6YyP6YyQ6YyR6YyS6YyT6YyU6YyV6YyW6YyX6YyY6YyZ6Yya6Yyb6Yyc6Yyd6Yye6YyfCivpjKDpjKHpjKLpjKPpjKTpjKXpjKbpjKfpjKjpjKnpjKrpjKvpjKzpjK3pjK7pjK/pjLDpjLHpjLLpjLPpjLTpjLXpjLbpjLfpjLjpjLnpjLrpjLvpjLzpjL3pjL7pjL8KK+mNgOmNgemNgumNg+mNhOmNhemNhumNh+mNiOmNiemNiumNi+mNjOmNjemNjumNj+mNkOmNkemNkumNk+mNlOmNlemNlumNl+mNmOmNmemNmumNm+mNnOmNnemNnumNnwor6Y2g6Y2h6Y2i6Y2j6Y2k6Y2l6Y2m6Y2n6Y2o6Y2p6Y2q6Y2r6Y2s6Y2t6Y2u6Y2v6Y2w6Y2x6Y2y6Y2z6Y206Y216Y226Y236Y246Y256Y266Y276Y286Y296Y2+6Y2/CivpjoDpjoHpjoLpjoPpjoTpjoXpjobpjofpjojpjonpjorpjovpjozpjo3pjo7pjo/pjpDpjpHpjpLpjpPpjpTpjpXpjpbpjpfpjpjpjpnpjprpjpvpjpzpjp3pjp7pjp8KK+mOoOmOoemOoumOo+mOpOmOpemOpumOp+mOqOmOqemOqumOq+mOrOmOremOrumOr+mOsOmOsemOsumOs+mOtOmOtemOtumOt+mOuOmOuemOuumOu+mOvOmOvemOvumOvwor6Y+A6Y+B6Y+C6Y+D6Y+E6Y+F6Y+G6Y+H6Y+I6Y+J6Y+K6Y+L6Y+M6Y+N6Y+O6Y+P6Y+Q6Y+R6Y+S6Y+T6Y+U6Y+V6Y+W6Y+X6Y+Y6Y+Z6Y+a6Y+b6Y+c6Y+d6Y+e6Y+fCivpj6Dpj6Hpj6Lpj6Ppj6Tpj6Xpj6bpj6fpj6jpj6npj6rpj6vpj6zpj63pj67pj6/pj7Dpj7Hpj7Lpj7Ppj7Tpj7Xpj7bpj7fpj7jpj7npj7rpj7vpj7zpj73pj77pj78KK+mQgOmQgemQgumQg+mQhOmQhemQhumQh+mQiOmQiemQiumQi+mQjOmQjemQjumQj+mQkOmQkemQkumQk+mQlOmQlemQlumQl+mQmOmQmemQmumQm+mQnOmQnemQnumQnwor6ZCg6ZCh6ZCi6ZCj6ZCk6ZCl6ZCm6ZCn6ZCo6ZCp6ZCq6ZCr6ZCs6ZCt6ZCu6ZCv6ZCw6ZCx6ZCy6ZCz6ZC06ZC16ZC26ZC36ZC46ZC56ZC66ZC76ZC86ZC96ZC+6ZC/CivpkYDpkYHpkYLpkYPpkYTpkYXpkYbpkYfpkYjpkYnpkYrpkYvpkYzpkY3pkY7pkY/pkZDpkZHpkZLpkZPpkZTpkZXpkZbpkZfpkZjpkZnpkZrpkZvpkZzpkZ3pkZ7pkZ8KK+mRoOmRoemRoumRo+mRpOmRpemRpumRp+mRqOmRqemRqumRq+mRrOmRremRrumRr+mRsOmRsemRsumRs+mRtOmRtemRtumRt+mRuOmRuemRuumRu+mRvOmRvemRvumRvwor6ZKA6ZKB6ZKC6ZKD6ZKE6ZKF6ZKG6ZKH6ZKI6ZKJ6ZKK6ZKL6ZKM6ZKN6ZKO6ZKP6ZKQ6ZKR6ZKS6ZKT6ZKU6ZKV6ZKW6ZKX6ZKY6ZKZ6ZKa6ZKb6ZKc6ZKd6ZKe6ZKfCivpkqDpkqHpkqLpkqPpkqTpkqXpkqbpkqfpkqjpkqnpkqrpkqvpkqzpkq3pkq7pkq/pkrDpkrHpkrLpkrPpkrTpkrXpkrbpkrfpkrjpkrnpkrrpkrvpkrzpkr3pkr7pkr8KK+mTgOmTgemTgumTg+mThOmThemThumTh+mTiOmTiemTiumTi+mTjOmTjemTjumTj+mTkOmTkemTkumTk+mTlOmTlemTlumTl+mTmOmTmemTmumTm+mTnOmTnemTnumTnwor6ZOg6ZOh6ZOi6ZOj6ZOk6ZOl6ZOm6ZOn6ZOo6ZOp6ZOq6ZOr6ZOs6ZOt6ZOu6ZOv6ZOw6ZOx6ZOy6ZOz6ZO06ZO16ZO26ZO36ZO46ZO56ZO66ZO76ZO86ZO96ZO+6ZO/CivplIDplIHplILplIPplITplIXplIbplIfplIjplInplIrplIvplIzplI3plI7plI/plJDplJHplJLplJPplJTplJXplJbplJfplJjplJnplJrplJvplJzplJ3plJ7plJ8KK+mUoOmUoemUoumUo+mUpOmUpemUpumUp+mUqOmUqemUqumUq+mUrOmUremUrumUr+mUsOmUsemUsumUs+mUtOmUtemUtumUt+mUuOmUuemUuumUu+mUvOmUvemUvumUvwor6ZWA6ZWB6ZWC6ZWD6ZWE6ZWF6ZWG6ZWH6ZWI6ZWJ6ZWK6ZWL6ZWM6ZWN6ZWO6ZWP6ZWQ6ZWR6ZWS6ZWT6ZWU6ZWV6ZWW6ZWX6ZWY6ZWZ6ZWa6ZWb6ZWc6ZWd6ZWe6ZWfCivplaDplaHplaLplaPplaTplaXplabplafplajplanplarplavplazpla3pla7pla/plbDplbHplbLplbPplbTplbXplbbplbfplbjplbnplbrplbvplbzplb3plb7plb8KK+mWgOmWgemWgumWg+mWhOmWhemWhumWh+mWiOmWiemWiumWi+mWjOmWjemWjumWj+mWkOmWkemWkumWk+mWlOmWlemWlumWl+mWmOmWmemWmumWm+mWnOmWnemWnumWnwor6Zag6Zah6Zai6Zaj6Zak6Zal6Zam6Zan6Zao6Zap6Zaq6Zar6Zas6Zat6Zau6Zav6Zaw6Zax6Zay6Zaz6Za06Za16Za26Za36Za46Za56Za66Za76Za86Za96Za+6Za/Civpl4Dpl4Hpl4Lpl4Ppl4Tpl4Xpl4bpl4fpl4jpl4npl4rpl4vpl4zpl43pl47pl4/pl5Dpl5Hpl5Lpl5Ppl5Tpl5Xpl5bpl5fpl5jpl5npl5rpl5vpl5zpl53pl57pl58KK+mXoOmXoemXoumXo+mXpOmXpemXpumXp+mXqOmXqemXqumXq+mXrOmXremXrumXr+mXsOmXsemXsumXs+mXtOmXtemXtumXt+mXuOmXuemXuumXu+mXvOmXvemXvumXvwor6ZiA6ZiB6ZiC6ZiD6ZiE6ZiF6ZiG6ZiH6ZiI6ZiJ6ZiK6ZiL6ZiM6ZiN6ZiO6ZiP6ZiQ6ZiR6ZiS6ZiT6ZiU6ZiV6ZiW6ZiX6ZiY6ZiZ6Zia6Zib6Zic6Zid6Zie6ZifCivpmKDpmKHpmKLpmKPpmKTpmKXpmKbpmKfpmKjpmKnpmKrpmKvpmKzpmK3pmK7pmK/pmLDpmLHpmLLpmLPpmLTpmLXpmLbpmLfpmLjpmLnpmLrpmLvpmLzpmL3pmL7pmL8KK+mZgOmZgemZgumZg+mZhOmZhemZhumZh+mZiOmZiemZiumZi+mZjOmZjemZjumZj+mZkOmZkemZkumZk+mZlOmZlemZlumZl+mZmOmZmemZmumZm+mZnOmZnemZnumZnwor6Zmg6Zmh6Zmi6Zmj6Zmk6Zml6Zmm6Zmn6Zmo6Zmp6Zmq6Zmr6Zms6Zmt6Zmu6Zmv6Zmw6Zmx6Zmy6Zmz6Zm06Zm16Zm26Zm36Zm46Zm56Zm66Zm76Zm86Zm96Zm+6Zm/CivpmoDpmoHpmoLpmoPpmoTpmoXpmobpmofpmojpmonpmorpmovpmozpmo3pmo7pmo/pmpDpmpHpmpLpmpPpmpTpmpXpmpbpmpfpmpjpmpnpmprpmpvpmpzpmp3pmp7pmp8KK+maoOmaoemaoumao+mapOmapemapumap+maqOmaqemaqumaq+marOmaremarumar+masOmasemasumas+matOmatematumat+mauOmauemauumau+mavOmavemavumavwor6ZuA6ZuB6ZuC6ZuD6ZuE6ZuF6ZuG6ZuH6ZuI6ZuJ6ZuK6ZuL6ZuM6ZuN6ZuO6ZuP6ZuQ6ZuR6ZuS6ZuT6ZuU6ZuV6ZuW6ZuX6ZuY6ZuZ6Zua6Zub6Zuc6Zud6Zue6ZufCivpm6Dpm6Hpm6Lpm6Ppm6Tpm6Xpm6bpm6fpm6jpm6npm6rpm6vpm6zpm63pm67pm6/pm7Dpm7Hpm7Lpm7Ppm7Tpm7Xpm7bpm7fpm7jpm7npm7rpm7vpm7zpm73pm77pm78KK+mcgOmcgemcgumcg+mchOmchemchumch+mciOmciemciumci+mcjOmcjemcjumcj+mckOmckemckumck+mclOmclemclumcl+mcmOmcmemcmumcm+mcnOmcnemcnumcnwor6Zyg6Zyh6Zyi6Zyj6Zyk6Zyl6Zym6Zyn6Zyo6Zyp6Zyq6Zyr6Zys6Zyt6Zyu6Zyv6Zyw6Zyx6Zyy6Zyz6Zy06Zy16Zy26Zy36Zy46Zy56Zy66Zy76Zy86Zy96Zy+6Zy/CivpnYDpnYHpnYLpnYPpnYTpnYXpnYbpnYfpnYjpnYnpnYrpnYvpnYzpnY3pnY7pnY/pnZDpnZHpnZLpnZPpnZTpnZXpnZbpnZfpnZjpnZnpnZrpnZvpnZzpnZ3pnZ7pnZ8KK+mdoOmdoemdoumdo+mdpOmdpemdpumdp+mdqOmdqemdqumdq+mdrOmdremdrumdr+mdsOmdsemdsumds+mdtOmdtemdtumdt+mduOmduemduumdu+mdvOmdvemdvumdvwor6Z6A6Z6B6Z6C6Z6D6Z6E6Z6F6Z6G6Z6H6Z6I6Z6J6Z6K6Z6L6Z6M6Z6N6Z6O6Z6P6Z6Q6Z6R6Z6S6Z6T6Z6U6Z6V6Z6W6Z6X6Z6Y6Z6Z6Z6a6Z6b6Z6c6Z6d6Z6e6Z6fCivpnqDpnqHpnqLpnqPpnqTpnqXpnqbpnqfpnqjpnqnpnqrpnqvpnqzpnq3pnq7pnq/pnrDpnrHpnrLpnrPpnrTpnrXpnrbpnrfpnrjpnrnpnrrpnrvpnrzpnr3pnr7pnr8KK+mfgOmfgemfgumfg+mfhOmfhemfhumfh+mfiOmfiemfiumfi+mfjOmfjemfjumfj+mfkOmfkemfkumfk+mflOmflemflumfl+mfmOmfmemfmumfm+mfnOmfnemfnumfnwor6Z+g6Z+h6Z+i6Z+j6Z+k6Z+l6Z+m6Z+n6Z+o6Z+p6Z+q6Z+r6Z+s6Z+t6Z+u6Z+v6Z+w6Z+x6Z+y6Z+z6Z+06Z+16Z+26Z+36Z+46Z+56Z+66Z+76Z+86Z+96Z++6Z+/CivpoIDpoIHpoILpoIPpoITpoIXpoIbpoIfpoIjpoInpoIrpoIvpoIzpoI3poI7poI/poJDpoJHpoJLpoJPpoJTpoJXpoJbpoJfpoJjpoJnpoJrpoJvpoJzpoJ3poJ7poJ8KK+mgoOmgoemgoumgo+mgpOmgpemgpumgp+mgqOmgqemgqumgq+mgrOmgremgrumgr+mgsOmgsemgsumgs+mgtOmgtemgtumgt+mguOmguemguumgu+mgvOmgvemgvumgvwor6aGA6aGB6aGC6aGD6aGE6aGF6aGG6aGH6aGI6aGJ6aGK6aGL6aGM6aGN6aGO6aGP6aGQ6aGR6aGS6aGT6aGU6aGV6aGW6aGX6aGY6aGZ6aGa6aGb6aGc6aGd6aGe6aGfCivpoaDpoaHpoaLpoaPpoaTpoaXpoabpoafpoajpoanpoarpoavpoazpoa3poa7poa/pobDpobHpobLpobPpobTpobXpobbpobfpobjpobnpobrpobvpobzpob3pob7pob8KK+migOmigemigumig+mihOmihemihumih+miiOmiiemiiumii+mijOmijemijumij+mikOmikemikumik+milOmilemilumil+mimOmimemimumim+minOmineminuminwor6aKg6aKh6aKi6aKj6aKk6aKl6aKm6aKn6aKo6aKp6aKq6aKr6aKs6aKt6aKu6aKv6aKw6aKx6aKy6aKz6aK06aK16aK26aK36aK46aK56aK66aK76aK86aK96aK+6aK/Civpo4Dpo4Hpo4Lpo4Ppo4Tpo4Xpo4bpo4fpo4jpo4npo4rpo4vpo4zpo43po47po4/po5Dpo5Hpo5Lpo5Ppo5Tpo5Xpo5bpo5fpo5jpo5npo5rpo5vpo5zpo53po57po58KK+mjoOmjoemjoumjo+mjpOmjpemjpumjp+mjqOmjqemjqumjq+mjrOmjremjrumjr+mjsOmjsemjsumjs+mjtOmjtemjtumjt+mjuOmjuemjuumju+mjvOmjvemjvumjvwor6aSA6aSB6aSC6aSD6aSE6aSF6aSG6aSH6aSI6aSJ6aSK6aSL6aSM6aSN6aSO6aSP6aSQ6aSR6aSS6aST6aSU6aSV6aSW6aSX6aSY6aSZ6aSa6aSb6aSc6aSd6aSe6aSfCivppKDppKHppKLppKPppKTppKXppKbppKfppKjppKnppKrppKvppKzppK3ppK7ppK/ppLDppLHppLLppLPppLTppLXppLbppLfppLjppLnppLrppLvppLzppL3ppL7ppL8KK+mlgOmlgemlgumlg+mlhOmlhemlhumlh+mliOmliemliumli+mljOmljemljumlj+mlkOmlkemlkumlk+mllOmllemllumll+mlmOmlmemlmumlm+mlnOmlnemlnumlnwor6aWg6aWh6aWi6aWj6aWk6aWl6aWm6aWn6aWo6aWp6aWq6aWr6aWs6aWt6aWu6aWv6aWw6aWx6aWy6aWz6aW06aW16aW26aW36aW46aW56aW66aW76aW86aW96aW+6aW/CivppoDppoHppoLppoPppoTppoXppobppofppojpponpporppovppozppo3ppo7ppo/pppDpppHpppLpppPpppTpppXpppbpppfpppjpppnppprpppvpppzppp3ppp7ppp8KK+mmoOmmoemmoummo+mmpOmmpemmpummp+mmqOmmqemmqummq+mmrOmmremmrummr+mmsOmmsemmsumms+mmtOmmtemmtummt+mmuOmmuemmuummu+mmvOmmvemmvummvwor6aeA6aeB6aeC6aeD6aeE6aeF6aeG6aeH6aeI6aeJ6aeK6aeL6aeM6aeN6aeO6aeP6aeQ6aeR6aeS6aeT6aeU6aeV6aeW6aeX6aeY6aeZ6aea6aeb6aec6aed6aee6aefCivpp6Dpp6Hpp6Lpp6Ppp6Tpp6Xpp6bpp6fpp6jpp6npp6rpp6vpp6zpp63pp67pp6/pp7Dpp7Hpp7Lpp7Ppp7Tpp7Xpp7bpp7fpp7jpp7npp7rpp7vpp7zpp73pp77pp78KK+mogOmogemogumog+mohOmohemohumoh+moiOmoiemoiumoi+mojOmojemojumoj+mokOmokemokumok+molOmolemolumol+momOmomemomumom+monOmonemonumonwor6aig6aih6aii6aij6aik6ail6aim6ain6aio6aip6aiq6air6ais6ait6aiu6aiv6aiw6aix6aiy6aiz6ai06ai16ai26ai36ai46ai56ai66ai76ai86ai96ai+6ai/CivpqYDpqYHpqYLpqYPpqYTpqYXpqYbpqYfpqYjpqYnpqYrpqYvpqYzpqY3pqY7pqY/pqZDpqZHpqZLpqZPpqZTpqZXpqZbpqZfpqZjpqZnpqZrpqZvpqZzpqZ3pqZ7pqZ8KK+mpoOmpoempoumpo+mppOmppemppumpp+mpqOmpqempqumpq+mprOmpremprumpr+mpsOmpsempsumps+mptOmptemptumpt+mpuOmpuempuumpu+mpvOmpvempvumpvwor6aqA6aqB6aqC6aqD6aqE6aqF6aqG6aqH6aqI6aqJ6aqK6aqL6aqM6aqN6aqO6aqP6aqQ6aqR6aqS6aqT6aqU6aqV6aqW6aqX6aqY6aqZ6aqa6aqb6aqc6aqd6aqe6aqfCivpqqDpqqHpqqLpqqPpqqTpqqXpqqbpqqfpqqjpqqnpqqrpqqvpqqzpqq3pqq7pqq/pqrDpqrHpqrLpqrPpqrTpqrXpqrbpqrfpqrjpqrnpqrrpqrvpqrzpqr3pqr7pqr8KK+mrgOmrgemrgumrg+mrhOmrhemrhumrh+mriOmriemriumri+mrjOmrjemrjumrj+mrkOmrkemrkumrk+mrlOmrlemrlumrl+mrmOmrmemrmumrm+mrnOmrnemrnumrnwor6aug6auh6aui6auj6auk6aul6aum6aun6auo6aup6auq6aur6aus6aut6auu6auv6auw6aux6auy6auz6au06au16au26au36au46au56au66au76au86au96au+6au/CivprIDprIHprILprIPprITprIXprIbprIfprIjprInprIrprIvprIzprI3prI7prI/prJDprJHprJLprJPprJTprJXprJbprJfprJjprJnprJrprJvprJzprJ3prJ7prJ8KK+msoOmsoemsoumso+mspOmspemspumsp+msqOmsqemsqumsq+msrOmsremsrumsr+mssOmssemssumss+mstOmstemstumst+msuOmsuemsuumsu+msvOmsvemsvumsvwor6a2A6a2B6a2C6a2D6a2E6a2F6a2G6a2H6a2I6a2J6a2K6a2L6a2M6a2N6a2O6a2P6a2Q6a2R6a2S6a2T6a2U6a2V6a2W6a2X6a2Y6a2Z6a2a6a2b6a2c6a2d6a2e6a2fCivpraDpraHpraLpraPpraTpraXprabprafprajpranprarpravprazpra3pra7pra/prbDprbHprbLprbPprbTprbXprbbprbfprbjprbnprbrprbvprbzprb3prb7prb8KK+mugOmugemugumug+muhOmuhemuhumuh+muiOmuiemuiumui+mujOmujemujumuj+mukOmukemukumuk+mulOmulemulumul+mumOmumemumumum+munOmunemunumunwor6a6g6a6h6a6i6a6j6a6k6a6l6a6m6a6n6a6o6a6p6a6q6a6r6a6s6a6t6a6u6a6v6a6w6a6x6a6y6a6z6a606a616a626a636a646a656a666a676a686a696a6+6a6/Civpr4Dpr4Hpr4Lpr4Ppr4Tpr4Xpr4bpr4fpr4jpr4npr4rpr4vpr4zpr43pr47pr4/pr5Dpr5Hpr5Lpr5Ppr5Tpr5Xpr5bpr5fpr5jpr5npr5rpr5vpr5zpr53pr57pr58KK+mvoOmvoemvoumvo+mvpOmvpemvpumvp+mvqOmvqemvqumvq+mvrOmvremvrumvr+mvsOmvsemvsumvs+mvtOmvtemvtumvt+mvuOmvuemvuumvu+mvvOmvvemvvumvvwor6bCA6bCB6bCC6bCD6bCE6bCF6bCG6bCH6bCI6bCJ6bCK6bCL6bCM6bCN6bCO6bCP6bCQ6bCR6bCS6bCT6bCU6bCV6bCW6bCX6bCY6bCZ6bCa6bCb6bCc6bCd6bCe6bCfCivpsKDpsKHpsKLpsKPpsKTpsKXpsKbpsKfpsKjpsKnpsKrpsKvpsKzpsK3psK7psK/psLDpsLHpsLLpsLPpsLTpsLXpsLbpsLfpsLjpsLnpsLrpsLvpsLzpsL3psL7psL8KK+mxgOmxgemxgumxg+mxhOmxhemxhumxh+mxiOmxiemxiumxi+mxjOmxjemxjumxj+mxkOmxkemxkumxk+mxlOmxlemxlumxl+mxmOmxmemxmumxm+mxnOmxnemxnumxnwor6bGg6bGh6bGi6bGj6bGk6bGl6bGm6bGn6bGo6bGp6bGq6bGr6bGs6bGt6bGu6bGv6bGw6bGx6bGy6bGz6bG06bG16bG26bG36bG46bG56bG66bG76bG86bG96bG+6bG/CivpsoDpsoHpsoLpsoPpsoTpsoXpsobpsofpsojpsonpsorpsovpsozpso3pso7pso/pspDpspHpspLpspPpspTpspXpspbpspfpspjpspnpsprpspvpspzpsp3psp7psp8KK+myoOmyoemyoumyo+mypOmypemypumyp+myqOmyqemyqumyq+myrOmyremyrumyr+mysOmysemysumys+mytOmytemytumyt+myuOmyuemyuumyu+myvOmyvemyvumyvwor6bOA6bOB6bOC6bOD6bOE6bOF6bOG6bOH6bOI6bOJ6bOK6bOL6bOM6bON6bOO6bOP6bOQ6bOR6bOS6bOT6bOU6bOV6bOW6bOX6bOY6bOZ6bOa6bOb6bOc6bOd6bOe6bOfCivps6Dps6Hps6Lps6Pps6Tps6Xps6bps6fps6jps6nps6rps6vps6zps63ps67ps6/ps7Dps7Hps7Lps7Pps7Tps7Xps7bps7fps7jps7nps7rps7vps7zps73ps77ps78KK+m0gOm0gem0gum0g+m0hOm0hem0hum0h+m0iOm0iem0ium0i+m0jOm0jem0jum0j+m0kOm0kem0kum0k+m0lOm0lem0lum0l+m0mOm0mem0mum0m+m0nOm0nem0num0nwor6bSg6bSh6bSi6bSj6bSk6bSl6bSm6bSn6bSo6bSp6bSq6bSr6bSs6bSt6bSu6bSv6bSw6bSx6bSy6bSz6bS06bS16bS26bS36bS46bS56bS66bS76bS86bS96bS+6bS/CivptYDptYHptYLptYPptYTptYXptYbptYfptYjptYnptYrptYvptYzptY3ptY7ptY/ptZDptZHptZLptZPptZTptZXptZbptZfptZjptZnptZrptZvptZzptZ3ptZ7ptZ8KK+m1oOm1oem1oum1o+m1pOm1pem1pum1p+m1qOm1qem1qum1q+m1rOm1rem1rum1r+m1sOm1sem1sum1s+m1tOm1tem1tum1t+m1uOm1uem1uum1u+m1vOm1vem1vum1vwor6baA6baB6baC6baD6baE6baF6baG6baH6baI6baJ6baK6baL6baM6baN6baO6baP6baQ6baR6baS6baT6baU6baV6baW6baX6baY6baZ6baa6bab6bac6bad6bae6bafCivptqDptqHptqLptqPptqTptqXptqbptqfptqjptqnptqrptqvptqzptq3ptq7ptq/ptrDptrHptrLptrPptrTptrXptrbptrfptrjptrnptrrptrvptrzptr3ptr7ptr8KK+m3gOm3gem3gum3g+m3hOm3hem3hum3h+m3iOm3iem3ium3i+m3jOm3jem3jum3j+m3kOm3kem3kum3k+m3lOm3lem3lum3l+m3mOm3mem3mum3m+m3nOm3nem3num3nwor6beg6beh6bei6bej6bek6bel6bem6ben6beo6bep6beq6ber6bes6bet6beu6bev6bew6bex6bey6bez6be06be16be26be36be46be56be66be76be86be96be+6be/CivpuIDpuIHpuILpuIPpuITpuIXpuIbpuIfpuIjpuInpuIrpuIvpuIzpuI3puI7puI/puJDpuJHpuJLpuJPpuJTpuJXpuJbpuJfpuJjpuJnpuJrpuJvpuJzpuJ3puJ7puJ8KK+m4oOm4oem4oum4o+m4pOm4pem4pum4p+m4qOm4qem4qum4q+m4rOm4rem4rum4r+m4sOm4sem4sum4s+m4tOm4tem4tum4t+m4uOm4uem4uum4u+m4vOm4vem4vum4vwor6bmA6bmB6bmC6bmD6bmE6bmF6bmG6bmH6bmI6bmJ6bmK6bmL6bmM6bmN6bmO6bmP6bmQ6bmR6bmS6bmT6bmU6bmV6bmW6bmX6bmY6bmZ6bma6bmb6bmc6bmd6bme6bmfCivpuaDpuaHpuaLpuaPpuaTpuaXpuabpuafpuajpuanpuarpuavpuazpua3pua7pua/pubDpubHpubLpubPpubTpubXpubbpubfpubjpubnpubrpubvpubzpub3pub7pub8KK+m6gOm6gem6gum6g+m6hOm6hem6hum6h+m6iOm6iem6ium6i+m6jOm6jem6jum6j+m6kOm6kem6kum6k+m6lOm6lem6lum6l+m6mOm6mem6mum6m+m6nOm6nem6num6nwor6bqg6bqh6bqi6bqj6bqk6bql6bqm6bqn6bqo6bqp6bqq6bqr6bqs6bqt6bqu6bqv6bqw6bqx6bqy6bqz6bq06bq16bq26bq36bq46bq56bq66bq76bq86bq96bq+6bq/Civpu4Dpu4Hpu4Lpu4Ppu4Tpu4Xpu4bpu4fpu4jpu4npu4rpu4vpu4zpu43pu47pu4/pu5Dpu5Hpu5Lpu5Ppu5Tpu5Xpu5bpu5fpu5jpu5npu5rpu5vpu5zpu53pu57pu58KK+m7oOm7oem7oum7o+m7pOm7pem7pum7p+m7qOm7qem7qum7q+m7rOm7rem7rum7r+m7sOm7sem7sum7s+m7tOm7tem7tum7t+m7uOm7uem7uum7u+m7vOm7vem7vum7vwor6byA6byB6byC6byD6byE6byF6byG6byH6byI6byJ6byK6byL6byM6byN6byO6byP6byQ6byR6byS6byT6byU6byV6byW6byX6byY6byZ6bya6byb6byc6byd6bye6byfCivpvKDpvKHpvKLpvKPpvKTpvKXpvKbpvKfpvKjpvKnpvKrpvKvpvKzpvK3pvK7pvK/pvLDpvLHpvLLpvLPpvLTpvLXpvLbpvLfpvLjpvLnpvLrpvLvpvLzpvL3pvL7pvL8KK+m9gOm9gem9gum9g+m9hOm9hem9hum9h+m9iOm9iem9ium9i+m9jOm9jem9jum9j+m9kOm9kem9kum9k+m9lOm9lem9lum9l+m9mOm9mem9mum9m+m9nOm9nem9num9nwor6b2g6b2h6b2i6b2j6b2k6b2l6b2m6b2n6b2o6b2p6b2q6b2r6b2s6b2t6b2u6b2v6b2w6b2x6b2y6b2z6b206b216b226b236b246b256b266b276b286b296b2+6b2/CivpvoDpvoHpvoLpvoPpvoTpvoXpvobpvofpvojpvonpvorpvovpvozpvo3pvo7pvo/pvpDpvpHpvpLpvpPpvpTpvpXpvpbpvpfpvpjpvpnpvprpvpvpvpzpvp3pvp7pvp8KK+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+vwor6b+A6b+B6b+C6b+D6b+E6b+F6b+G6b+H6b+I6b+J6b+K6b+L6b+M6b+N6b+O6b+P6b+Q6b+R6b+S6b+T6b+U6b+V6b+W6b+X6b+Y6b+Z6b+a6b+b6b+c6b+d6b+e6b+fCivpv6Dpv6Hpv6Lpv6Ppv6Tpv6Xpv6bpv6fpv6jpv6npv6rpv6vpv6zpv63pv67pv6/pv7Dpv7Hpv7Lpv7Ppv7Tpv7Xpv7bpv7fpv7jpv7npv7rpv7vpv7zpv73pv77pv78KKworWWkgU3lsbGFibGVzIChVK0EwMDAtVStBNDhGKToKKwor6oCA6oCB6oCC6oCD6oCE6oCF6oCG6oCH6oCI6oCJ6oCK6oCL6oCM6oCN6oCO6oCP6oCQ6oCR6oCS6oCT6oCU6oCV6oCW6oCX6oCY6oCZ6oCa6oCb6oCc6oCd6oCe6oCfCivqgKDqgKHqgKLqgKPqgKTqgKXqgKbqgKfqgKjqgKnqgKrqgKvqgKzqgK3qgK7qgK/qgLDqgLHqgLLqgLPqgLTqgLXqgLbqgLfqgLjqgLnqgLrqgLvqgLzqgL3qgL7qgL8KK+qBgOqBgeqBguqBg+qBhOqBheqBhuqBh+qBiOqBieqBiuqBi+qBjOqBjeqBjuqBj+qBkOqBkeqBkuqBk+qBlOqBleqBluqBl+qBmOqBmeqBmuqBm+qBnOqBneqBnuqBnwor6oGg6oGh6oGi6oGj6oGk6oGl6oGm6oGn6oGo6oGp6oGq6oGr6oGs6oGt6oGu6oGv6oGw6oGx6oGy6oGz6oG06oG16oG26oG36oG46oG56oG66oG76oG86oG96oG+6oG/CivqgoDqgoHqgoLqgoPqgoTqgoXqgobqgofqgojqgonqgorqgovqgozqgo3qgo7qgo/qgpDqgpHqgpLqgpPqgpTqgpXqgpbqgpfqgpjqgpnqgprqgpvqgpzqgp3qgp7qgp8KK+qCoOqCoeqCouqCo+qCpOqCpeqCpuqCp+qCqOqCqeqCquqCq+qCrOqCreqCruqCr+qCsOqCseqCsuqCs+qCtOqCteqCtuqCt+qCuOqCueqCuuqCu+qCvOqCveqCvuqCvwor6oOA6oOB6oOC6oOD6oOE6oOF6oOG6oOH6oOI6oOJ6oOK6oOL6oOM6oON6oOO6oOP6oOQ6oOR6oOS6oOT6oOU6oOV6oOW6oOX6oOY6oOZ6oOa6oOb6oOc6oOd6oOe6oOfCivqg6Dqg6Hqg6Lqg6Pqg6Tqg6Xqg6bqg6fqg6jqg6nqg6rqg6vqg6zqg63qg67qg6/qg7Dqg7Hqg7Lqg7Pqg7Tqg7Xqg7bqg7fqg7jqg7nqg7rqg7vqg7zqg73qg77qg78KK+qEgOqEgeqEguqEg+qEhOqEheqEhuqEh+qEiOqEieqEiuqEi+qEjOqEjeqEjuqEj+qEkOqEkeqEkuqEk+qElOqEleqEluqEl+qEmOqEmeqEmuqEm+qEnOqEneqEnuqEnwor6oSg6oSh6oSi6oSj6oSk6oSl6oSm6oSn6oSo6oSp6oSq6oSr6oSs6oSt6oSu6oSv6oSw6oSx6oSy6oSz6oS06oS16oS26oS36oS46oS56oS66oS76oS86oS96oS+6oS/CivqhYDqhYHqhYLqhYPqhYTqhYXqhYbqhYfqhYjqhYnqhYrqhYvqhYzqhY3qhY7qhY/qhZDqhZHqhZLqhZPqhZTqhZXqhZbqhZfqhZjqhZnqhZrqhZvqhZzqhZ3qhZ7qhZ8KK+qFoOqFoeqFouqFo+qFpOqFpeqFpuqFp+qFqOqFqeqFquqFq+qFrOqFreqFruqFr+qFsOqFseqFsuqFs+qFtOqFteqFtuqFt+qFuOqFueqFuuqFu+qFvOqFveqFvuqFvwor6oaA6oaB6oaC6oaD6oaE6oaF6oaG6oaH6oaI6oaJ6oaK6oaL6oaM6oaN6oaO6oaP6oaQ6oaR6oaS6oaT6oaU6oaV6oaW6oaX6oaY6oaZ6oaa6oab6oac6oad6oae6oafCivqhqDqhqHqhqLqhqPqhqTqhqXqhqbqhqfqhqjqhqnqhqrqhqvqhqzqhq3qhq7qhq/qhrDqhrHqhrLqhrPqhrTqhrXqhrbqhrfqhrjqhrnqhrrqhrvqhrzqhr3qhr7qhr8KK+qHgOqHgeqHguqHg+qHhOqHheqHhuqHh+qHiOqHieqHiuqHi+qHjOqHjeqHjuqHj+qHkOqHkeqHkuqHk+qHlOqHleqHluqHl+qHmOqHmeqHmuqHm+qHnOqHneqHnuqHnwor6oeg6oeh6oei6oej6oek6oel6oem6oen6oeo6oep6oeq6oer6oes6oet6oeu6oev6oew6oex6oey6oez6oe06oe16oe26oe36oe46oe56oe66oe76oe86oe96oe+6oe/CivqiIDqiIHqiILqiIPqiITqiIXqiIbqiIfqiIjqiInqiIrqiIvqiIzqiI3qiI7qiI/qiJDqiJHqiJLqiJPqiJTqiJXqiJbqiJfqiJjqiJnqiJrqiJvqiJzqiJ3qiJ7qiJ8KK+qIoOqIoeqIouqIo+qIpOqIpeqIpuqIp+qIqOqIqeqIquqIq+qIrOqIreqIruqIr+qIsOqIseqIsuqIs+qItOqIteqItuqIt+qIuOqIueqIuuqIu+qIvOqIveqIvuqIvwor6omA6omB6omC6omD6omE6omF6omG6omH6omI6omJ6omK6omL6omM6omN6omO6omP6omQ6omR6omS6omT6omU6omV6omW6omX6omY6omZ6oma6omb6omc6omd6ome6omfCivqiaDqiaHqiaLqiaPqiaTqiaXqiabqiafqiajqianqiarqiavqiazqia3qia7qia/qibDqibHqibLqibPqibTqibXqibbqibfqibjqibnqibrqibvqibzqib3qib7qib8KK+qKgOqKgeqKguqKg+qKhOqKheqKhuqKh+qKiOqKieqKiuqKi+qKjOqKjeqKjuqKj+qKkOqKkeqKkuqKk+qKlOqKleqKluqKl+qKmOqKmeqKmuqKm+qKnOqKneqKnuqKnwor6oqg6oqh6oqi6oqj6oqk6oql6oqm6oqn6oqo6oqp6oqq6oqr6oqs6oqt6oqu6oqv6oqw6oqx6oqy6oqz6oq06oq16oq26oq36oq46oq56oq66oq76oq86oq96oq+6oq/Civqi4Dqi4Hqi4Lqi4Pqi4Tqi4Xqi4bqi4fqi4jqi4nqi4rqi4vqi4zqi43qi47qi4/qi5Dqi5Hqi5Lqi5Pqi5Tqi5Xqi5bqi5fqi5jqi5nqi5rqi5vqi5zqi53qi57qi58KK+qLoOqLoeqLouqLo+qLpOqLpeqLpuqLp+qLqOqLqeqLquqLq+qLrOqLreqLruqLr+qLsOqLseqLsuqLs+qLtOqLteqLtuqLt+qLuOqLueqLuuqLu+qLvOqLveqLvuqLvwor6oyA6oyB6oyC6oyD6oyE6oyF6oyG6oyH6oyI6oyJ6oyK6oyL6oyM6oyN6oyO6oyP6oyQ6oyR6oyS6oyT6oyU6oyV6oyW6oyX6oyY6oyZ6oya6oyb6oyc6oyd6oye6oyfCivqjKDqjKHqjKLqjKPqjKTqjKXqjKbqjKfqjKjqjKnqjKrqjKvqjKzqjK3qjK7qjK/qjLDqjLHqjLLqjLPqjLTqjLXqjLbqjLfqjLjqjLnqjLrqjLvqjLzqjL3qjL7qjL8KK+qNgOqNgeqNguqNg+qNhOqNheqNhuqNh+qNiOqNieqNiuqNi+qNjOqNjeqNjuqNj+qNkOqNkeqNkuqNk+qNlOqNleqNluqNl+qNmOqNmeqNmuqNm+qNnOqNneqNnuqNnwor6o2g6o2h6o2i6o2j6o2k6o2l6o2m6o2n6o2o6o2p6o2q6o2r6o2s6o2t6o2u6o2v6o2w6o2x6o2y6o2z6o206o216o226o236o246o256o266o276o286o296o2+6o2/CivqjoDqjoHqjoLqjoPqjoTqjoXqjobqjofqjojqjonqjorqjovqjozqjo3qjo7qjo/qjpDqjpHqjpLqjpPqjpTqjpXqjpbqjpfqjpjqjpnqjprqjpvqjpzqjp3qjp7qjp8KK+qOoOqOoeqOouqOo+qOpOqOpeqOpuqOp+qOqOqOqeqOquqOq+qOrOqOreqOruqOr+qOsOqOseqOsuqOs+qOtOqOteqOtuqOt+qOuOqOueqOuuqOu+qOvOqOveqOvuqOvwor6o+A6o+B6o+C6o+D6o+E6o+F6o+G6o+H6o+I6o+J6o+K6o+L6o+M6o+N6o+O6o+P6o+Q6o+R6o+S6o+T6o+U6o+V6o+W6o+X6o+Y6o+Z6o+a6o+b6o+c6o+d6o+e6o+fCivqj6Dqj6Hqj6Lqj6Pqj6Tqj6Xqj6bqj6fqj6jqj6nqj6rqj6vqj6zqj63qj67qj6/qj7Dqj7Hqj7Lqj7Pqj7Tqj7Xqj7bqj7fqj7jqj7nqj7rqj7vqj7zqj73qj77qj78KK+qQgOqQgeqQguqQg+qQhOqQheqQhuqQh+qQiOqQieqQiuqQi+qQjOqQjeqQjuqQj+qQkOqQkeqQkuqQk+qQlOqQleqQluqQl+qQmOqQmeqQmuqQm+qQnOqQneqQnuqQnwor6pCg6pCh6pCi6pCj6pCk6pCl6pCm6pCn6pCo6pCp6pCq6pCr6pCs6pCt6pCu6pCv6pCw6pCx6pCy6pCz6pC06pC16pC26pC36pC46pC56pC66pC76pC86pC96pC+6pC/CivqkYDqkYHqkYLqkYPqkYTqkYXqkYbqkYfqkYjqkYnqkYrqkYvqkYzqkY3qkY7qkY/qkZDqkZHqkZLqkZPqkZTqkZXqkZbqkZfqkZjqkZnqkZrqkZvqkZzqkZ3qkZ7qkZ8KK+qRoOqRoeqRouqRo+qRpOqRpeqRpuqRp+qRqOqRqeqRquqRq+qRrOqRreqRruqRr+qRsOqRseqRsuqRs+qRtOqRteqRtuqRt+qRuOqRueqRuuqRu+qRvOqRveqRvuqRvwor6pKA6pKB6pKC6pKD6pKE6pKF6pKG6pKH6pKI6pKJ6pKK6pKL6pKM6pKN6pKO6pKPCisKK1lpIFJhZGljYWxzIChVK0E0OTAtVStBNENGKToKKwor6pKQ6pKR6pKS6pKT6pKU6pKV6pKW6pKX6pKY6pKZ6pKa6pKb6pKc6pKd6pKe6pKf6pKg6pKh6pKi6pKj6pKk6pKl6pKm6pKn6pKo6pKp6pKq6pKr6pKs6pKt6pKu6pKvCivqkrDqkrHqkrLqkrPqkrTqkrXqkrbqkrfqkrjqkrnqkrrqkrvqkrzqkr3qkr7qkr/qk4Dqk4Hqk4Lqk4Pqk4Tqk4Xqk4bqk4fqk4jqk4nqk4rqk4vqk4zqk43qk47qk48KKworRnJlZSBibG9jayAoVStBNEQwLVUrQUJGRik6CisKK+qTkOqTkeqTkuqTk+qTlOqTleqTluqTl+qTmOqTmeqTmuqTm+qTnOqTneqTnuqTn+qToOqToeqTouqTo+qTpOqTpeqTpuqTp+qTqOqTqeqTquqTq+qTrOqTreqTruqTr+qTsOqTseqTsuqTs+qTtOqTteqTtuqTt+qTuOqTueqTuuqTu+qTvOqTveqTvuqTv+qUgOqUgeqUguqUg+qUhOqUheqUhuqUh+qUiOqUieqUiuqUi+qUjOqUjeqUjuqUjwor6pSQ6pSR6pSS6pST6pSU6pSV6pSW6pSX6pSY6pSZ6pSa6pSb6pSc6pSd6pSe6pSf6pSg6pSh6pSi6pSj6pSk6pSl6pSm6pSn6pSo6pSp6pSq6pSr6pSs6pSt6pSu6pSv6pSw6pSx6pSy6pSz6pS06pS16pS26pS36pS46pS56pS66pS76pS86pS96pS+6pS/6pWA6pWB6pWC6pWD6pWE6pWF6pWG6pWH6pWI6pWJ6pWK6pWL6pWM6pWN6pWO6pWPCivqlZDqlZHqlZLqlZPqlZTqlZXqlZbqlZfqlZjqlZnqlZrqlZvqlZzqlZ3qlZ7qlZ/qlaDqlaHqlaLqlaPqlaTqlaXqlabqlafqlajqlanqlarqlavqlazqla3qla7qla/qlbDqlbHqlbLqlbPqlbTqlbXqlbbqlbfqlbjqlbnqlbrqlbvqlbzqlb3qlb7qlb/qloDqloHqloLqloPqloTqloXqlobqlofqlojqlonqlorqlovqlozqlo3qlo7qlo8KK+qWkOqWkeqWkuqWk+qWlOqWleqWluqWl+qWmOqWmeqWmuqWm+qWnOqWneqWnuqWn+qWoOqWoeqWouqWo+qWpOqWpeqWpuqWp+qWqOqWqeqWquqWq+qWrOqWreqWruqWr+qWsOqWseqWsuqWs+qWtOqWteqWtuqWt+qWuOqWueqWuuqWu+qWvOqWveqWvuqWv+qXgOqXgeqXguqXg+qXhOqXheqXhuqXh+qXiOqXieqXiuqXi+qXjOqXjeqXjuqXjwor6peQ6peR6peS6peT6peU6peV6peW6peX6peY6peZ6pea6peb6pec6ped6pee6pef6peg6peh6pei6pej6pek6pel6pem6pen6peo6pep6peq6per6pes6pet6peu6pev6pew6pex6pey6pez6pe06pe16pe26pe36pe46pe56pe66pe76pe86pe96pe+6pe/6piA6piB6piC6piD6piE6piF6piG6piH6piI6piJ6piK6piL6piM6piN6piO6piPCivqmJDqmJHqmJLqmJPqmJTqmJXqmJbqmJfqmJjqmJnqmJrqmJvqmJzqmJ3qmJ7qmJ/qmKDqmKHqmKLqmKPqmKTqmKXqmKbqmKfqmKjqmKnqmKrqmKvqmKzqmK3qmK7qmK/qmLDqmLHqmLLqmLPqmLTqmLXqmLbqmLfqmLjqmLnqmLrqmLvqmLzqmL3qmL7qmL/qmYDqmYHqmYLqmYPqmYTqmYXqmYbqmYfqmYjqmYnqmYrqmYvqmYzqmY3qmY7qmY8KK+qZkOqZkeqZkuqZk+qZlOqZleqZluqZl+qZmOqZmeqZmuqZm+qZnOqZneqZnuqZn+qZoOqZoeqZouqZo+qZpOqZpeqZpuqZp+qZqOqZqeqZquqZq+qZrOqZreqZruqZr+qZsOqZseqZsuqZs+qZtOqZteqZtuqZt+qZuOqZueqZuuqZu+qZvOqZveqZvuqZv+qagOqageqaguqag+qahOqaheqahuqah+qaiOqaieqaiuqai+qajOqajeqajuqajwor6pqQ6pqR6pqS6pqT6pqU6pqV6pqW6pqX6pqY6pqZ6pqa6pqb6pqc6pqd6pqe6pqf6pqg6pqh6pqi6pqj6pqk6pql6pqm6pqn6pqo6pqp6pqq6pqr6pqs6pqt6pqu6pqv6pqw6pqx6pqy6pqz6pq06pq16pq26pq36pq46pq56pq66pq76pq86pq96pq+6pq/6puA6puB6puC6puD6puE6puF6puG6puH6puI6puJ6puK6puL6puM6puN6puO6puPCivqm5Dqm5Hqm5Lqm5Pqm5Tqm5Xqm5bqm5fqm5jqm5nqm5rqm5vqm5zqm53qm57qm5/qm6Dqm6Hqm6Lqm6Pqm6Tqm6Xqm6bqm6fqm6jqm6nqm6rqm6vqm6zqm63qm67qm6/qm7Dqm7Hqm7Lqm7Pqm7Tqm7Xqm7bqm7fqm7jqm7nqm7rqm7vqm7zqm73qm77qm7/qnIDqnIHqnILqnIPqnITqnIXqnIbqnIfqnIjqnInqnIrqnIvqnIzqnI3qnI7qnI8KK+qckOqckeqckuqck+qclOqcleqcluqcl+qcmOqcmeqcmuqcm+qcnOqcneqcnuqcn+qcoOqcoeqcouqco+qcpOqcpeqcpuqcp+qcqOqcqeqcquqcq+qcrOqcreqcruqcr+qcsOqcseqcsuqcs+qctOqcteqctuqct+qcuOqcueqcuuqcu+qcvOqcveqcvuqcv+qdgOqdgeqdguqdg+qdhOqdheqdhuqdh+qdiOqdieqdiuqdi+qdjOqdjeqdjuqdjwor6p2Q6p2R6p2S6p2T6p2U6p2V6p2W6p2X6p2Y6p2Z6p2a6p2b6p2c6p2d6p2e6p2f6p2g6p2h6p2i6p2j6p2k6p2l6p2m6p2n6p2o6p2p6p2q6p2r6p2s6p2t6p2u6p2v6p2w6p2x6p2y6p2z6p206p216p226p236p246p256p266p276p286p296p2+6p2/6p6A6p6B6p6C6p6D6p6E6p6F6p6G6p6H6p6I6p6J6p6K6p6L6p6M6p6N6p6O6p6PCivqnpDqnpHqnpLqnpPqnpTqnpXqnpbqnpfqnpjqnpnqnprqnpvqnpzqnp3qnp7qnp/qnqDqnqHqnqLqnqPqnqTqnqXqnqbqnqfqnqjqnqnqnqrqnqvqnqzqnq3qnq7qnq/qnrDqnrHqnrLqnrPqnrTqnrXqnrbqnrfqnrjqnrnqnrrqnrvqnrzqnr3qnr7qnr/qn4Dqn4Hqn4Lqn4Pqn4Tqn4Xqn4bqn4fqn4jqn4nqn4rqn4vqn4zqn43qn47qn48KK+qfkOqfkeqfkuqfk+qflOqfleqfluqfl+qfmOqfmeqfmuqfm+qfnOqfneqfnuqfn+qfoOqfoeqfouqfo+qfpOqfpeqfpuqfp+qfqOqfqeqfquqfq+qfrOqfreqfruqfr+qfsOqfseqfsuqfs+qftOqfteqftuqft+qfuOqfueqfuuqfu+qfvOqfveqfvuqfv+qggOqggeqgguqgg+qghOqgheqghuqgh+qgiOqgieqgiuqgi+qgjOqgjeqgjuqgjwor6qCQ6qCR6qCS6qCT6qCU6qCV6qCW6qCX6qCY6qCZ6qCa6qCb6qCc6qCd6qCe6qCf6qCg6qCh6qCi6qCj6qCk6qCl6qCm6qCn6qCo6qCp6qCq6qCr6qCs6qCt6qCu6qCv6qCw6qCx6qCy6qCz6qC06qC16qC26qC36qC46qC56qC66qC76qC86qC96qC+6qC/6qGA6qGB6qGC6qGD6qGE6qGF6qGG6qGH6qGI6qGJ6qGK6qGL6qGM6qGN6qGO6qGPCivqoZDqoZHqoZLqoZPqoZTqoZXqoZbqoZfqoZjqoZnqoZrqoZvqoZzqoZ3qoZ7qoZ/qoaDqoaHqoaLqoaPqoaTqoaXqoabqoafqoajqoanqoarqoavqoazqoa3qoa7qoa/qobDqobHqobLqobPqobTqobXqobbqobfqobjqobnqobrqobvqobzqob3qob7qob/qooDqooHqooLqooPqooTqooXqoobqoofqoojqoonqoorqoovqoozqoo3qoo7qoo8KK+qikOqikeqikuqik+qilOqileqiluqil+qimOqimeqimuqim+qinOqineqinuqin+qioOqioeqiouqio+qipOqipeqipuqip+qiqOqiqeqiquqiq+qirOqireqiruqir+qisOqiseqisuqis+qitOqiteqituqit+qiuOqiueqiuuqiu+qivOqiveqivuqiv+qjgOqjgeqjguqjg+qjhOqjheqjhuqjh+qjiOqjieqjiuqji+qjjOqjjeqjjuqjjwor6qOQ6qOR6qOS6qOT6qOU6qOV6qOW6qOX6qOY6qOZ6qOa6qOb6qOc6qOd6qOe6qOf6qOg6qOh6qOi6qOj6qOk6qOl6qOm6qOn6qOo6qOp6qOq6qOr6qOs6qOt6qOu6qOv6qOw6qOx6qOy6qOz6qO06qO16qO26qO36qO46qO56qO66qO76qO86qO96qO+6qO/6qSA6qSB6qSC6qSD6qSE6qSF6qSG6qSH6qSI6qSJ6qSK6qSL6qSM6qSN6qSO6qSPCivqpJDqpJHqpJLqpJPqpJTqpJXqpJbqpJfqpJjqpJnqpJrqpJvqpJzqpJ3qpJ7qpJ/qpKDqpKHqpKLqpKPqpKTqpKXqpKbqpKfqpKjqpKnqpKrqpKvqpKzqpK3qpK7qpK/qpLDqpLHqpLLqpLPqpLTqpLXqpLbqpLfqpLjqpLnqpLrqpLvqpLzqpL3qpL7qpL/qpYDqpYHqpYLqpYPqpYTqpYXqpYbqpYfqpYjqpYnqpYrqpYvqpYzqpY3qpY7qpY8KK+qlkOqlkeqlkuqlk+qllOqlleqlluqll+qlmOqlmeqlmuqlm+qlnOqlneqlnuqln+qloOqloeqlouqlo+qlpOqlpeqlpuqlp+qlqOqlqeqlquqlq+qlrOqlreqlruqlr+qlsOqlseqlsuqls+qltOqlteqltuqlt+qluOqlueqluuqlu+qlvOqlveqlvuqlv+qmgOqmgeqmguqmg+qmhOqmheqmhuqmh+qmiOqmieqmiuqmi+qmjOqmjeqmjuqmjwor6qaQ6qaR6qaS6qaT6qaU6qaV6qaW6qaX6qaY6qaZ6qaa6qab6qac6qad6qae6qaf6qag6qah6qai6qaj6qak6qal6qam6qan6qao6qap6qaq6qar6qas6qat6qau6qav6qaw6qax6qay6qaz6qa06qa16qa26qa36qa46qa56qa66qa76qa86qa96qa+6qa/6qeA6qeB6qeC6qeD6qeE6qeF6qeG6qeH6qeI6qeJ6qeK6qeL6qeM6qeN6qeO6qePCivqp5Dqp5Hqp5Lqp5Pqp5Tqp5Xqp5bqp5fqp5jqp5nqp5rqp5vqp5zqp53qp57qp5/qp6Dqp6Hqp6Lqp6Pqp6Tqp6Xqp6bqp6fqp6jqp6nqp6rqp6vqp6zqp63qp67qp6/qp7Dqp7Hqp7Lqp7Pqp7Tqp7Xqp7bqp7fqp7jqp7nqp7rqp7vqp7zqp73qp77qp7/qqIDqqIHqqILqqIPqqITqqIXqqIbqqIfqqIjqqInqqIrqqIvqqIzqqI3qqI7qqI8KK+qokOqokeqokuqok+qolOqoleqoluqol+qomOqomeqomuqom+qonOqoneqonuqon+qooOqooeqoouqoo+qopOqopeqopuqop+qoqOqoqeqoquqoq+qorOqoreqoruqor+qosOqoseqosuqos+qotOqoteqotuqot+qouOqoueqouuqou+qovOqoveqovuqov+qpgOqpgeqpguqpg+qphOqpheqphuqph+qpiOqpieqpiuqpi+qpjOqpjeqpjuqpjwor6qmQ6qmR6qmS6qmT6qmU6qmV6qmW6qmX6qmY6qmZ6qma6qmb6qmc6qmd6qme6qmf6qmg6qmh6qmi6qmj6qmk6qml6qmm6qmn6qmo6qmp6qmq6qmr6qms6qmt6qmu6qmv6qmw6qmx6qmy6qmz6qm06qm16qm26qm36qm46qm56qm66qm76qm86qm96qm+6qm/6qqA6qqB6qqC6qqD6qqE6qqF6qqG6qqH6qqI6qqJ6qqK6qqL6qqM6qqN6qqO6qqPCivqqpDqqpHqqpLqqpPqqpTqqpXqqpbqqpfqqpjqqpnqqprqqpvqqpzqqp3qqp7qqp/qqqDqqqHqqqLqqqPqqqTqqqXqqqbqqqfqqqjqqqnqqqrqqqvqqqzqqq3qqq7qqq/qqrDqqrHqqrLqqrPqqrTqqrXqqrbqqrfqqrjqqrnqqrrqqrvqqrzqqr3qqr7qqr/qq4Dqq4Hqq4Lqq4Pqq4Tqq4Xqq4bqq4fqq4jqq4nqq4rqq4vqq4zqq43qq47qq48KK+qrkOqrkeqrkuqrk+qrlOqrleqrluqrl+qrmOqrmeqrmuqrm+qrnOqrneqrnuqrn+qroOqroeqrouqro+qrpOqrpeqrpuqrp+qrqOqrqeqrquqrq+qrrOqrreqrruqrr+qrsOqrseqrsuqrs+qrtOqrteqrtuqrt+qruOqrueqruuqru+qrvOqrveqrvuqrv+qsgOqsgeqsguqsg+qshOqsheqshuqsh+qsiOqsieqsiuqsi+qsjOqsjeqsjuqsjwor6qyQ6qyR6qyS6qyT6qyU6qyV6qyW6qyX6qyY6qyZ6qya6qyb6qyc6qyd6qye6qyf6qyg6qyh6qyi6qyj6qyk6qyl6qym6qyn6qyo6qyp6qyq6qyr6qys6qyt6qyu6qyv6qyw6qyx6qyy6qyz6qy06qy16qy26qy36qy46qy56qy66qy76qy86qy96qy+6qy/6q2A6q2B6q2C6q2D6q2E6q2F6q2G6q2H6q2I6q2J6q2K6q2L6q2M6q2N6q2O6q2PCivqrZDqrZHqrZLqrZPqrZTqrZXqrZbqrZfqrZjqrZnqrZrqrZvqrZzqrZ3qrZ7qrZ/qraDqraHqraLqraPqraTqraXqrabqrafqrajqranqrarqravqrazqra3qra7qra/qrbDqrbHqrbLqrbPqrbTqrbXqrbbqrbfqrbjqrbnqrbrqrbvqrbzqrb3qrb7qrb/qroDqroHqroLqroPqroTqroXqrobqrofqrojqronqrorqrovqrozqro3qro7qro8KK+qukOqukequkuquk+qulOqulequluqul+qumOqumequmuqum+qunOqunequnuqun+quoOquoequouquo+qupOqupequpuqup+quqOquqequququq+qurOqurequruqur+qusOqusequsuqus+qutOqutequtuqut+quuOquuequuuquu+quvOquvequvuquv+qvgOqvgeqvguqvg+qvhOqvheqvhuqvh+qviOqvieqviuqvi+qvjOqvjeqvjuqvjwor6q+Q6q+R6q+S6q+T6q+U6q+V6q+W6q+X6q+Y6q+Z6q+a6q+b6q+c6q+d6q+e6q+f6q+g6q+h6q+i6q+j6q+k6q+l6q+m6q+n6q+o6q+p6q+q6q+r6q+s6q+t6q+u6q+v6q+w6q+x6q+y6q+z6q+06q+16q+26q+36q+46q+56q+66q+76q+86q+96q++6q+/CisKK0hhbmd1bCBTeWxsYWJsZXMgKFUrQUMwMC1VK0Q3QUYpOgorCivqsIDqsIHqsILqsIPqsITqsIXqsIbqsIfqsIjqsInqsIrqsIvqsIzqsI3qsI7qsI/qsJDqsJHqsJLqsJPqsJTqsJXqsJbqsJfqsJjqsJnqsJrqsJvqsJzqsJ3qsJ7qsJ8KK+qwoOqwoeqwouqwo+qwpOqwpeqwpuqwp+qwqOqwqeqwquqwq+qwrOqwreqwruqwr+qwsOqwseqwsuqws+qwtOqwteqwtuqwt+qwuOqwueqwuuqwu+qwvOqwveqwvuqwvwor6rGA6rGB6rGC6rGD6rGE6rGF6rGG6rGH6rGI6rGJ6rGK6rGL6rGM6rGN6rGO6rGP6rGQ6rGR6rGS6rGT6rGU6rGV6rGW6rGX6rGY6rGZ6rGa6rGb6rGc6rGd6rGe6rGfCivqsaDqsaHqsaLqsaPqsaTqsaXqsabqsafqsajqsanqsarqsavqsazqsa3qsa7qsa/qsbDqsbHqsbLqsbPqsbTqsbXqsbbqsbfqsbjqsbnqsbrqsbvqsbzqsb3qsb7qsb8KK+qygOqygeqyguqyg+qyhOqyheqyhuqyh+qyiOqyieqyiuqyi+qyjOqyjeqyjuqyj+qykOqykeqykuqyk+qylOqyleqyluqyl+qymOqymeqymuqym+qynOqyneqynuqynwor6rKg6rKh6rKi6rKj6rKk6rKl6rKm6rKn6rKo6rKp6rKq6rKr6rKs6rKt6rKu6rKv6rKw6rKx6rKy6rKz6rK06rK16rK26rK36rK46rK56rK66rK76rK86rK96rK+6rK/Civqs4Dqs4Hqs4Lqs4Pqs4Tqs4Xqs4bqs4fqs4jqs4nqs4rqs4vqs4zqs43qs47qs4/qs5Dqs5Hqs5Lqs5Pqs5Tqs5Xqs5bqs5fqs5jqs5nqs5rqs5vqs5zqs53qs57qs58KK+qzoOqzoeqzouqzo+qzpOqzpeqzpuqzp+qzqOqzqeqzquqzq+qzrOqzreqzruqzr+qzsOqzseqzsuqzs+qztOqzteqztuqzt+qzuOqzueqzuuqzu+qzvOqzveqzvuqzvwor6rSA6rSB6rSC6rSD6rSE6rSF6rSG6rSH6rSI6rSJ6rSK6rSL6rSM6rSN6rSO6rSP6rSQ6rSR6rSS6rST6rSU6rSV6rSW6rSX6rSY6rSZ6rSa6rSb6rSc6rSd6rSe6rSfCivqtKDqtKHqtKLqtKPqtKTqtKXqtKbqtKfqtKjqtKnqtKrqtKvqtKzqtK3qtK7qtK/qtLDqtLHqtLLqtLPqtLTqtLXqtLbqtLfqtLjqtLnqtLrqtLvqtLzqtL3qtL7qtL8KK+q1gOq1geq1guq1g+q1hOq1heq1huq1h+q1iOq1ieq1iuq1i+q1jOq1jeq1juq1j+q1kOq1keq1kuq1k+q1lOq1leq1luq1l+q1mOq1meq1muq1m+q1nOq1neq1nuq1nwor6rWg6rWh6rWi6rWj6rWk6rWl6rWm6rWn6rWo6rWp6rWq6rWr6rWs6rWt6rWu6rWv6rWw6rWx6rWy6rWz6rW06rW16rW26rW36rW46rW56rW66rW76rW86rW96rW+6rW/CivqtoDqtoHqtoLqtoPqtoTqtoXqtobqtofqtojqtonqtorqtovqtozqto3qto7qto/qtpDqtpHqtpLqtpPqtpTqtpXqtpbqtpfqtpjqtpnqtprqtpvqtpzqtp3qtp7qtp8KK+q2oOq2oeq2ouq2o+q2pOq2peq2puq2p+q2qOq2qeq2quq2q+q2rOq2req2ruq2r+q2sOq2seq2suq2s+q2tOq2teq2tuq2t+q2uOq2ueq2uuq2u+q2vOq2veq2vuq2vwor6reA6reB6reC6reD6reE6reF6reG6reH6reI6reJ6reK6reL6reM6reN6reO6reP6reQ6reR6reS6reT6reU6reV6reW6reX6reY6reZ6rea6reb6rec6red6ree6refCivqt6Dqt6Hqt6Lqt6Pqt6Tqt6Xqt6bqt6fqt6jqt6nqt6rqt6vqt6zqt63qt67qt6/qt7Dqt7Hqt7Lqt7Pqt7Tqt7Xqt7bqt7fqt7jqt7nqt7rqt7vqt7zqt73qt77qt78KK+q4gOq4geq4guq4g+q4hOq4heq4huq4h+q4iOq4ieq4iuq4i+q4jOq4jeq4juq4j+q4kOq4keq4kuq4k+q4lOq4leq4luq4l+q4mOq4meq4muq4m+q4nOq4neq4nuq4nwor6rig6rih6rii6rij6rik6ril6rim6rin6rio6rip6riq6rir6ris6rit6riu6riv6riw6rix6riy6riz6ri06ri16ri26ri36ri46ri56ri66ri76ri86ri96ri+6ri/CivquYDquYHquYLquYPquYTquYXquYbquYfquYjquYnquYrquYvquYzquY3quY7quY/quZDquZHquZLquZPquZTquZXquZbquZfquZjquZnquZrquZvquZzquZ3quZ7quZ8KK+q5oOq5oeq5ouq5o+q5pOq5peq5puq5p+q5qOq5qeq5quq5q+q5rOq5req5ruq5r+q5sOq5seq5suq5s+q5tOq5teq5tuq5t+q5uOq5ueq5uuq5u+q5vOq5veq5vuq5vwor6rqA6rqB6rqC6rqD6rqE6rqF6rqG6rqH6rqI6rqJ6rqK6rqL6rqM6rqN6rqO6rqP6rqQ6rqR6rqS6rqT6rqU6rqV6rqW6rqX6rqY6rqZ6rqa6rqb6rqc6rqd6rqe6rqfCivquqDquqHquqLquqPquqTquqXquqbquqfquqjquqnquqrquqvquqzquq3quq7quq/qurDqurHqurLqurPqurTqurXqurbqurfqurjqurnqurrqurvqurzqur3qur7qur8KK+q7gOq7geq7guq7g+q7hOq7heq7huq7h+q7iOq7ieq7iuq7i+q7jOq7jeq7juq7j+q7kOq7keq7kuq7k+q7lOq7leq7luq7l+q7mOq7meq7muq7m+q7nOq7neq7nuq7nwor6rug6ruh6rui6ruj6ruk6rul6rum6run6ruo6rup6ruq6rur6rus6rut6ruu6ruv6ruw6rux6ruy6ruz6ru06ru16ru26ru36ru46ru56ru66ru76ru86ru96ru+6ru/CivqvIDqvIHqvILqvIPqvITqvIXqvIbqvIfqvIjqvInqvIrqvIvqvIzqvI3qvI7qvI/qvJDqvJHqvJLqvJPqvJTqvJXqvJbqvJfqvJjqvJnqvJrqvJvqvJzqvJ3qvJ7qvJ8KK+q8oOq8oeq8ouq8o+q8pOq8peq8puq8p+q8qOq8qeq8quq8q+q8rOq8req8ruq8r+q8sOq8seq8suq8s+q8tOq8teq8tuq8t+q8uOq8ueq8uuq8u+q8vOq8veq8vuq8vwor6r2A6r2B6r2C6r2D6r2E6r2F6r2G6r2H6r2I6r2J6r2K6r2L6r2M6r2N6r2O6r2P6r2Q6r2R6r2S6r2T6r2U6r2V6r2W6r2X6r2Y6r2Z6r2a6r2b6r2c6r2d6r2e6r2fCivqvaDqvaHqvaLqvaPqvaTqvaXqvabqvafqvajqvanqvarqvavqvazqva3qva7qva/qvbDqvbHqvbLqvbPqvbTqvbXqvbbqvbfqvbjqvbnqvbrqvbvqvbzqvb3qvb7qvb8KK+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+nwor6r6g6r6h6r6i6r6j6r6k6r6l6r6m6r6n6r6o6r6p6r6q6r6r6r6s6r6t6r6u6r6v6r6w6r6x6r6y6r6z6r606r616r626r636r646r656r666r676r686r696r6+6r6/Civqv4Dqv4Hqv4Lqv4Pqv4Tqv4Xqv4bqv4fqv4jqv4nqv4rqv4vqv4zqv43qv47qv4/qv5Dqv5Hqv5Lqv5Pqv5Tqv5Xqv5bqv5fqv5jqv5nqv5rqv5vqv5zqv53qv57qv58KK+q/oOq/oeq/ouq/o+q/pOq/peq/puq/p+q/qOq/qeq/quq/q+q/rOq/req/ruq/r+q/sOq/seq/suq/s+q/tOq/teq/tuq/t+q/uOq/ueq/uuq/u+q/vOq/veq/vuq/vwor64CA64CB64CC64CD64CE64CF64CG64CH64CI64CJ64CK64CL64CM64CN64CO64CP64CQ64CR64CS64CT64CU64CV64CW64CX64CY64CZ64Ca64Cb64Cc64Cd64Ce64CfCivrgKDrgKHrgKLrgKPrgKTrgKXrgKbrgKfrgKjrgKnrgKrrgKvrgKzrgK3rgK7rgK/rgLDrgLHrgLLrgLPrgLTrgLXrgLbrgLfrgLjrgLnrgLrrgLvrgLzrgL3rgL7rgL8KK+uBgOuBgeuBguuBg+uBhOuBheuBhuuBh+uBiOuBieuBiuuBi+uBjOuBjeuBjuuBj+uBkOuBkeuBkuuBk+uBlOuBleuBluuBl+uBmOuBmeuBmuuBm+uBnOuBneuBnuuBnwor64Gg64Gh64Gi64Gj64Gk64Gl64Gm64Gn64Go64Gp64Gq64Gr64Gs64Gt64Gu64Gv64Gw64Gx64Gy64Gz64G064G164G264G364G464G564G664G764G864G964G+64G/CivrgoDrgoHrgoLrgoPrgoTrgoXrgobrgofrgojrgonrgorrgovrgozrgo3rgo7rgo/rgpDrgpHrgpLrgpPrgpTrgpXrgpbrgpfrgpjrgpnrgprrgpvrgpzrgp3rgp7rgp8KK+uCoOuCoeuCouuCo+uCpOuCpeuCpuuCp+uCqOuCqeuCquuCq+uCrOuCreuCruuCr+uCsOuCseuCsuuCs+uCtOuCteuCtuuCt+uCuOuCueuCuuuCu+uCvOuCveuCvuuCvwor64OA64OB64OC64OD64OE64OF64OG64OH64OI64OJ64OK64OL64OM64ON64OO64OP64OQ64OR64OS64OT64OU64OV64OW64OX64OY64OZ64Oa64Ob64Oc64Od64Oe64OfCivrg6Drg6Hrg6Lrg6Prg6Trg6Xrg6brg6frg6jrg6nrg6rrg6vrg6zrg63rg67rg6/rg7Drg7Hrg7Lrg7Prg7Trg7Xrg7brg7frg7jrg7nrg7rrg7vrg7zrg73rg77rg78KK+uEgOuEgeuEguuEg+uEhOuEheuEhuuEh+uEiOuEieuEiuuEi+uEjOuEjeuEjuuEj+uEkOuEkeuEkuuEk+uElOuEleuEluuEl+uEmOuEmeuEmuuEm+uEnOuEneuEnuuEnwor64Sg64Sh64Si64Sj64Sk64Sl64Sm64Sn64So64Sp64Sq64Sr64Ss64St64Su64Sv64Sw64Sx64Sy64Sz64S064S164S264S364S464S564S664S764S864S964S+64S/CivrhYDrhYHrhYLrhYPrhYTrhYXrhYbrhYfrhYjrhYnrhYrrhYvrhYzrhY3rhY7rhY/rhZDrhZHrhZLrhZPrhZTrhZXrhZbrhZfrhZjrhZnrhZrrhZvrhZzrhZ3rhZ7rhZ8KK+uFoOuFoeuFouuFo+uFpOuFpeuFpuuFp+uFqOuFqeuFquuFq+uFrOuFreuFruuFr+uFsOuFseuFsuuFs+uFtOuFteuFtuuFt+uFuOuFueuFuuuFu+uFvOuFveuFvuuFvwor64aA64aB64aC64aD64aE64aF64aG64aH64aI64aJ64aK64aL64aM64aN64aO64aP64aQ64aR64aS64aT64aU64aV64aW64aX64aY64aZ64aa64ab64ac64ad64ae64afCivrhqDrhqHrhqLrhqPrhqTrhqXrhqbrhqfrhqjrhqnrhqrrhqvrhqzrhq3rhq7rhq/rhrDrhrHrhrLrhrPrhrTrhrXrhrbrhrfrhrjrhrnrhrrrhrvrhrzrhr3rhr7rhr8KK+uHgOuHgeuHguuHg+uHhOuHheuHhuuHh+uHiOuHieuHiuuHi+uHjOuHjeuHjuuHj+uHkOuHkeuHkuuHk+uHlOuHleuHluuHl+uHmOuHmeuHmuuHm+uHnOuHneuHnuuHnwor64eg64eh64ei64ej64ek64el64em64en64eo64ep64eq64er64es64et64eu64ev64ew64ex64ey64ez64e064e164e264e364e464e564e664e764e864e964e+64e/CivriIDriIHriILriIPriITriIXriIbriIfriIjriInriIrriIvriIzriI3riI7riI/riJDriJHriJLriJPriJTriJXriJbriJfriJjriJnriJrriJvriJzriJ3riJ7riJ8KK+uIoOuIoeuIouuIo+uIpOuIpeuIpuuIp+uIqOuIqeuIquuIq+uIrOuIreuIruuIr+uIsOuIseuIsuuIs+uItOuIteuItuuIt+uIuOuIueuIuuuIu+uIvOuIveuIvuuIvwor64mA64mB64mC64mD64mE64mF64mG64mH64mI64mJ64mK64mL64mM64mN64mO64mP64mQ64mR64mS64mT64mU64mV64mW64mX64mY64mZ64ma64mb64mc64md64me64mfCivriaDriaHriaLriaPriaTriaXriabriafriajrianriarriavriazria3ria7ria/ribDribHribLribPribTribXribbribfribjribnribrribvribzrib3rib7rib8KK+uKgOuKgeuKguuKg+uKhOuKheuKhuuKh+uKiOuKieuKiuuKi+uKjOuKjeuKjuuKj+uKkOuKkeuKkuuKk+uKlOuKleuKluuKl+uKmOuKmeuKmuuKm+uKnOuKneuKnuuKnwor64qg64qh64qi64qj64qk64ql64qm64qn64qo64qp64qq64qr64qs64qt64qu64qv64qw64qx64qy64qz64q064q164q264q364q464q564q664q764q864q964q+64q/Civri4Dri4Hri4Lri4Pri4Tri4Xri4bri4fri4jri4nri4rri4vri4zri43ri47ri4/ri5Dri5Hri5Lri5Pri5Tri5Xri5bri5fri5jri5nri5rri5vri5zri53ri57ri58KK+uLoOuLoeuLouuLo+uLpOuLpeuLpuuLp+uLqOuLqeuLquuLq+uLrOuLreuLruuLr+uLsOuLseuLsuuLs+uLtOuLteuLtuuLt+uLuOuLueuLuuuLu+uLvOuLveuLvuuLvwor64yA64yB64yC64yD64yE64yF64yG64yH64yI64yJ64yK64yL64yM64yN64yO64yP64yQ64yR64yS64yT64yU64yV64yW64yX64yY64yZ64ya64yb64yc64yd64ye64yfCivrjKDrjKHrjKLrjKPrjKTrjKXrjKbrjKfrjKjrjKnrjKrrjKvrjKzrjK3rjK7rjK/rjLDrjLHrjLLrjLPrjLTrjLXrjLbrjLfrjLjrjLnrjLrrjLvrjLzrjL3rjL7rjL8KK+uNgOuNgeuNguuNg+uNhOuNheuNhuuNh+uNiOuNieuNiuuNi+uNjOuNjeuNjuuNj+uNkOuNkeuNkuuNk+uNlOuNleuNluuNl+uNmOuNmeuNmuuNm+uNnOuNneuNnuuNnwor642g642h642i642j642k642l642m642n642o642p642q642r642s642t642u642v642w642x642y642z6420642164226423642464256426642764286429642+642/CivrjoDrjoHrjoLrjoPrjoTrjoXrjobrjofrjojrjonrjorrjovrjozrjo3rjo7rjo/rjpDrjpHrjpLrjpPrjpTrjpXrjpbrjpfrjpjrjpnrjprrjpvrjpzrjp3rjp7rjp8KK+uOoOuOoeuOouuOo+uOpOuOpeuOpuuOp+uOqOuOqeuOquuOq+uOrOuOreuOruuOr+uOsOuOseuOsuuOs+uOtOuOteuOtuuOt+uOuOuOueuOuuuOu+uOvOuOveuOvuuOvwor64+A64+B64+C64+D64+E64+F64+G64+H64+I64+J64+K64+L64+M64+N64+O64+P64+Q64+R64+S64+T64+U64+V64+W64+X64+Y64+Z64+a64+b64+c64+d64+e64+fCivrj6Drj6Hrj6Lrj6Prj6Trj6Xrj6brj6frj6jrj6nrj6rrj6vrj6zrj63rj67rj6/rj7Drj7Hrj7Lrj7Prj7Trj7Xrj7brj7frj7jrj7nrj7rrj7vrj7zrj73rj77rj78KK+uQgOuQgeuQguuQg+uQhOuQheuQhuuQh+uQiOuQieuQiuuQi+uQjOuQjeuQjuuQj+uQkOuQkeuQkuuQk+uQlOuQleuQluuQl+uQmOuQmeuQmuuQm+uQnOuQneuQnuuQnwor65Cg65Ch65Ci65Cj65Ck65Cl65Cm65Cn65Co65Cp65Cq65Cr65Cs65Ct65Cu65Cv65Cw65Cx65Cy65Cz65C065C165C265C365C465C565C665C765C865C965C+65C/CivrkYDrkYHrkYLrkYPrkYTrkYXrkYbrkYfrkYjrkYnrkYrrkYvrkYzrkY3rkY7rkY/rkZDrkZHrkZLrkZPrkZTrkZXrkZbrkZfrkZjrkZnrkZrrkZvrkZzrkZ3rkZ7rkZ8KK+uRoOuRoeuRouuRo+uRpOuRpeuRpuuRp+uRqOuRqeuRquuRq+uRrOuRreuRruuRr+uRsOuRseuRsuuRs+uRtOuRteuRtuuRt+uRuOuRueuRuuuRu+uRvOuRveuRvuuRvwor65KA65KB65KC65KD65KE65KF65KG65KH65KI65KJ65KK65KL65KM65KN65KO65KP65KQ65KR65KS65KT65KU65KV65KW65KX65KY65KZ65Ka65Kb65Kc65Kd65Ke65KfCivrkqDrkqHrkqLrkqPrkqTrkqXrkqbrkqfrkqjrkqnrkqrrkqvrkqzrkq3rkq7rkq/rkrDrkrHrkrLrkrPrkrTrkrXrkrbrkrfrkrjrkrnrkrrrkrvrkrzrkr3rkr7rkr8KK+uTgOuTgeuTguuTg+uThOuTheuThuuTh+uTiOuTieuTiuuTi+uTjOuTjeuTjuuTj+uTkOuTkeuTkuuTk+uTlOuTleuTluuTl+uTmOuTmeuTmuuTm+uTnOuTneuTnuuTnwor65Og65Oh65Oi65Oj65Ok65Ol65Om65On65Oo65Op65Oq65Or65Os65Ot65Ou65Ov65Ow65Ox65Oy65Oz65O065O165O265O365O465O565O665O765O865O965O+65O/CivrlIDrlIHrlILrlIPrlITrlIXrlIbrlIfrlIjrlInrlIrrlIvrlIzrlI3rlI7rlI/rlJDrlJHrlJLrlJPrlJTrlJXrlJbrlJfrlJjrlJnrlJrrlJvrlJzrlJ3rlJ7rlJ8KK+uUoOuUoeuUouuUo+uUpOuUpeuUpuuUp+uUqOuUqeuUquuUq+uUrOuUreuUruuUr+uUsOuUseuUsuuUs+uUtOuUteuUtuuUt+uUuOuUueuUuuuUu+uUvOuUveuUvuuUvwor65WA65WB65WC65WD65WE65WF65WG65WH65WI65WJ65WK65WL65WM65WN65WO65WP65WQ65WR65WS65WT65WU65WV65WW65WX65WY65WZ65Wa65Wb65Wc65Wd65We65WfCivrlaDrlaHrlaLrlaPrlaTrlaXrlabrlafrlajrlanrlarrlavrlazrla3rla7rla/rlbDrlbHrlbLrlbPrlbTrlbXrlbbrlbfrlbjrlbnrlbrrlbvrlbzrlb3rlb7rlb8KK+uWgOuWgeuWguuWg+uWhOuWheuWhuuWh+uWiOuWieuWiuuWi+uWjOuWjeuWjuuWj+uWkOuWkeuWkuuWk+uWlOuWleuWluuWl+uWmOuWmeuWmuuWm+uWnOuWneuWnuuWnwor65ag65ah65ai65aj65ak65al65am65an65ao65ap65aq65ar65as65at65au65av65aw65ax65ay65az65a065a165a265a365a465a565a665a765a865a965a+65a/Civrl4Drl4Hrl4Lrl4Prl4Trl4Xrl4brl4frl4jrl4nrl4rrl4vrl4zrl43rl47rl4/rl5Drl5Hrl5Lrl5Prl5Trl5Xrl5brl5frl5jrl5nrl5rrl5vrl5zrl53rl57rl58KK+uXoOuXoeuXouuXo+uXpOuXpeuXpuuXp+uXqOuXqeuXquuXq+uXrOuXreuXruuXr+uXsOuXseuXsuuXs+uXtOuXteuXtuuXt+uXuOuXueuXuuuXu+uXvOuXveuXvuuXvwor65iA65iB65iC65iD65iE65iF65iG65iH65iI65iJ65iK65iL65iM65iN65iO65iP65iQ65iR65iS65iT65iU65iV65iW65iX65iY65iZ65ia65ib65ic65id65ie65ifCivrmKDrmKHrmKLrmKPrmKTrmKXrmKbrmKfrmKjrmKnrmKrrmKvrmKzrmK3rmK7rmK/rmLDrmLHrmLLrmLPrmLTrmLXrmLbrmLfrmLjrmLnrmLrrmLvrmLzrmL3rmL7rmL8KK+uZgOuZgeuZguuZg+uZhOuZheuZhuuZh+uZiOuZieuZiuuZi+uZjOuZjeuZjuuZj+uZkOuZkeuZkuuZk+uZlOuZleuZluuZl+uZmOuZmeuZmuuZm+uZnOuZneuZnuuZnwor65mg65mh65mi65mj65mk65ml65mm65mn65mo65mp65mq65mr65ms65mt65mu65mv65mw65mx65my65mz65m065m165m265m365m465m565m665m765m865m965m+65m/CivrmoDrmoHrmoLrmoPrmoTrmoXrmobrmofrmojrmonrmorrmovrmozrmo3rmo7rmo/rmpDrmpHrmpLrmpPrmpTrmpXrmpbrmpfrmpjrmpnrmprrmpvrmpzrmp3rmp7rmp8KK+uaoOuaoeuaouuao+uapOuapeuapuuap+uaqOuaqeuaquuaq+uarOuareuaruuar+uasOuaseuasuuas+uatOuateuatuuat+uauOuaueuauuuau+uavOuaveuavuuavwor65uA65uB65uC65uD65uE65uF65uG65uH65uI65uJ65uK65uL65uM65uN65uO65uP65uQ65uR65uS65uT65uU65uV65uW65uX65uY65uZ65ua65ub65uc65ud65ue65ufCivrm6Drm6Hrm6Lrm6Prm6Trm6Xrm6brm6frm6jrm6nrm6rrm6vrm6zrm63rm67rm6/rm7Drm7Hrm7Lrm7Prm7Trm7Xrm7brm7frm7jrm7nrm7rrm7vrm7zrm73rm77rm78KK+ucgOucgeucguucg+uchOucheuchuuch+uciOucieuciuuci+ucjOucjeucjuucj+uckOuckeuckuuck+uclOucleucluucl+ucmOucmeucmuucm+ucnOucneucnuucnwor65yg65yh65yi65yj65yk65yl65ym65yn65yo65yp65yq65yr65ys65yt65yu65yv65yw65yx65yy65yz65y065y165y265y365y465y565y665y765y865y965y+65y/CivrnYDrnYHrnYLrnYPrnYTrnYXrnYbrnYfrnYjrnYnrnYrrnYvrnYzrnY3rnY7rnY/rnZDrnZHrnZLrnZPrnZTrnZXrnZbrnZfrnZjrnZnrnZrrnZvrnZzrnZ3rnZ7rnZ8KK+udoOudoeudouudo+udpOudpeudpuudp+udqOudqeudquudq+udrOudreudruudr+udsOudseudsuuds+udtOudteudtuudt+uduOudueuduuudu+udvOudveudvuudvwor656A656B656C656D656E656F656G656H656I656J656K656L656M656N656O656P656Q656R656S656T656U656V656W656X656Y656Z656a656b656c656d656e656fCivrnqDrnqHrnqLrnqPrnqTrnqXrnqbrnqfrnqjrnqnrnqrrnqvrnqzrnq3rnq7rnq/rnrDrnrHrnrLrnrPrnrTrnrXrnrbrnrfrnrjrnrnrnrrrnrvrnrzrnr3rnr7rnr8KK+ufgOufgeufguufg+ufhOufheufhuufh+ufiOufieufiuufi+ufjOufjeufjuufj+ufkOufkeufkuufk+uflOufleufluufl+ufmOufmeufmuufm+ufnOufneufnuufnwor65+g65+h65+i65+j65+k65+l65+m65+n65+o65+p65+q65+r65+s65+t65+u65+v65+w65+x65+y65+z65+065+165+265+365+465+565+665+765+865+965++65+/CivroIDroIHroILroIProITroIXroIbroIfroIjroInroIrroIvroIzroI3roI7roI/roJDroJHroJLroJProJTroJXroJbroJfroJjroJnroJrroJvroJzroJ3roJ7roJ8KK+ugoOugoeugouugo+ugpOugpeugpuugp+ugqOugqeugquugq+ugrOugreugruugr+ugsOugseugsuugs+ugtOugteugtuugt+uguOugueuguuugu+ugvOugveugvuugvwor66GA66GB66GC66GD66GE66GF66GG66GH66GI66GJ66GK66GL66GM66GN66GO66GP66GQ66GR66GS66GT66GU66GV66GW66GX66GY66GZ66Ga66Gb66Gc66Gd66Ge66GfCivroaDroaHroaLroaProaTroaXroabroafroajroanroarroavroazroa3roa7roa/robDrobHrobLrobProbTrobXrobbrobfrobjrobnrobrrobvrobzrob3rob7rob8KK+uigOuigeuiguuig+uihOuiheuihuuih+uiiOuiieuiiuuii+uijOuijeuijuuij+uikOuikeuikuuik+uilOuileuiluuil+uimOuimeuimuuim+uinOuineuinuuinwor66Kg66Kh66Ki66Kj66Kk66Kl66Km66Kn66Ko66Kp66Kq66Kr66Ks66Kt66Ku66Kv66Kw66Kx66Ky66Kz66K066K166K266K366K466K566K666K766K866K966K+66K/Civro4Dro4Hro4Lro4Pro4Tro4Xro4bro4fro4jro4nro4rro4vro4zro43ro47ro4/ro5Dro5Hro5Lro5Pro5Tro5Xro5bro5fro5jro5nro5rro5vro5zro53ro57ro58KK+ujoOujoeujouujo+ujpOujpeujpuujp+ujqOujqeujquujq+ujrOujreujruujr+ujsOujseujsuujs+ujtOujteujtuujt+ujuOujueujuuuju+ujvOujveujvuujvwor66SA66SB66SC66SD66SE66SF66SG66SH66SI66SJ66SK66SL66SM66SN66SO66SP66SQ66SR66SS66ST66SU66SV66SW66SX66SY66SZ66Sa66Sb66Sc66Sd66Se66SfCivrpKDrpKHrpKLrpKPrpKTrpKXrpKbrpKfrpKjrpKnrpKrrpKvrpKzrpK3rpK7rpK/rpLDrpLHrpLLrpLPrpLTrpLXrpLbrpLfrpLjrpLnrpLrrpLvrpLzrpL3rpL7rpL8KK+ulgOulgeulguulg+ulhOulheulhuulh+uliOulieuliuuli+uljOuljeuljuulj+ulkOulkeulkuulk+ullOulleulluull+ulmOulmeulmuulm+ulnOulneulnuulnwor66Wg66Wh66Wi66Wj66Wk66Wl66Wm66Wn66Wo66Wp66Wq66Wr66Ws66Wt66Wu66Wv66Ww66Wx66Wy66Wz66W066W166W266W366W466W566W666W766W866W966W+66W/CivrpoDrpoHrpoLrpoPrpoTrpoXrpobrpofrpojrponrporrpovrpozrpo3rpo7rpo/rppDrppHrppLrppPrppTrppXrppbrppfrppjrppnrpprrppvrppzrpp3rpp7rpp8KK+umoOumoeumouumo+umpOumpeumpuump+umqOumqeumquumq+umrOumreumruumr+umsOumseumsuums+umtOumteumtuumt+umuOumueumuuumu+umvOumveumvuumvwor66eA66eB66eC66eD66eE66eF66eG66eH66eI66eJ66eK66eL66eM66eN66eO66eP66eQ66eR66eS66eT66eU66eV66eW66eX66eY66eZ66ea66eb66ec66ed66ee66efCivrp6Drp6Hrp6Lrp6Prp6Trp6Xrp6brp6frp6jrp6nrp6rrp6vrp6zrp63rp67rp6/rp7Drp7Hrp7Lrp7Prp7Trp7Xrp7brp7frp7jrp7nrp7rrp7vrp7zrp73rp77rp78KK+uogOuogeuoguuog+uohOuoheuohuuoh+uoiOuoieuoiuuoi+uojOuojeuojuuoj+uokOuokeuokuuok+uolOuoleuoluuol+uomOuomeuomuuom+uonOuoneuonuuonwor66ig66ih66ii66ij66ik66il66im66in66io66ip66iq66ir66is66it66iu66iv66iw66ix66iy66iz66i066i166i266i366i466i566i666i766i866i966i+66i/CivrqYDrqYHrqYLrqYPrqYTrqYXrqYbrqYfrqYjrqYnrqYrrqYvrqYzrqY3rqY7rqY/rqZDrqZHrqZLrqZPrqZTrqZXrqZbrqZfrqZjrqZnrqZrrqZvrqZzrqZ3rqZ7rqZ8KK+upoOupoeupouupo+uppOuppeuppuupp+upqOupqeupquupq+uprOupreupruupr+upsOupseupsuups+uptOupteuptuupt+upuOupueupuuupu+upvOupveupvuupvwor66qA66qB66qC66qD66qE66qF66qG66qH66qI66qJ66qK66qL66qM66qN66qO66qP66qQ66qR66qS66qT66qU66qV66qW66qX66qY66qZ66qa66qb66qc66qd66qe66qfCivrqqDrqqHrqqLrqqPrqqTrqqXrqqbrqqfrqqjrqqnrqqrrqqvrqqzrqq3rqq7rqq/rqrDrqrHrqrLrqrPrqrTrqrXrqrbrqrfrqrjrqrnrqrrrqrvrqrzrqr3rqr7rqr8KK+urgOurgeurguurg+urhOurheurhuurh+uriOurieuriuuri+urjOurjeurjuurj+urkOurkeurkuurk+urlOurleurluurl+urmOurmeurmuurm+urnOurneurnuurnwor66ug66uh66ui66uj66uk66ul66um66un66uo66up66uq66ur66us66ut66uu66uv66uw66ux66uy66uz66u066u166u266u366u466u566u666u766u866u966u+66u/CivrrIDrrIHrrILrrIPrrITrrIXrrIbrrIfrrIjrrInrrIrrrIvrrIzrrI3rrI7rrI/rrJDrrJHrrJLrrJPrrJTrrJXrrJbrrJfrrJjrrJnrrJrrrJvrrJzrrJ3rrJ7rrJ8KK+usoOusoeusouuso+uspOuspeuspuusp+usqOusqeusquusq+usrOusreusruusr+ussOusseussuuss+ustOusteustuust+usuOusueusuuusu+usvOusveusvuusvwor662A662B662C662D662E662F662G662H662I662J662K662L662M662N662O662P662Q662R662S662T662U662V662W662X662Y662Z662a662b662c662d662e662fCivrraDrraHrraLrraPrraTrraXrrabrrafrrajrranrrarrravrrazrra3rra7rra/rrbDrrbHrrbLrrbPrrbTrrbXrrbbrrbfrrbjrrbnrrbrrrbvrrbzrrb3rrb7rrb8KK+uugOuugeuuguuug+uuhOuuheuuhuuuh+uuiOuuieuuiuuui+uujOuujeuujuuuj+uukOuukeuukuuuk+uulOuuleuuluuul+uumOuumeuumuuum+uunOuuneuunuuunwor666g666h666i666j666k666l666m666n666o666p666q666r666s666t666u666v666w666x666y666z6660666166626663666466656666666766686669666+666/Civrr4Drr4Hrr4Lrr4Prr4Trr4Xrr4brr4frr4jrr4nrr4rrr4vrr4zrr43rr47rr4/rr5Drr5Hrr5Lrr5Prr5Trr5Xrr5brr5frr5jrr5nrr5rrr5vrr5zrr53rr57rr58KK+uvoOuvoeuvouuvo+uvpOuvpeuvpuuvp+uvqOuvqeuvquuvq+uvrOuvreuvruuvr+uvsOuvseuvsuuvs+uvtOuvteuvtuuvt+uvuOuvueuvuuuvu+uvvOuvveuvvuuvvwor67CA67CB67CC67CD67CE67CF67CG67CH67CI67CJ67CK67CL67CM67CN67CO67CP67CQ67CR67CS67CT67CU67CV67CW67CX67CY67CZ67Ca67Cb67Cc67Cd67Ce67CfCivrsKDrsKHrsKLrsKPrsKTrsKXrsKbrsKfrsKjrsKnrsKrrsKvrsKzrsK3rsK7rsK/rsLDrsLHrsLLrsLPrsLTrsLXrsLbrsLfrsLjrsLnrsLrrsLvrsLzrsL3rsL7rsL8KK+uxgOuxgeuxguuxg+uxhOuxheuxhuuxh+uxiOuxieuxiuuxi+uxjOuxjeuxjuuxj+uxkOuxkeuxkuuxk+uxlOuxleuxluuxl+uxmOuxmeuxmuuxm+uxnOuxneuxnuuxnwor67Gg67Gh67Gi67Gj67Gk67Gl67Gm67Gn67Go67Gp67Gq67Gr67Gs67Gt67Gu67Gv67Gw67Gx67Gy67Gz67G067G167G267G367G467G567G667G767G867G967G+67G/CivrsoDrsoHrsoLrsoPrsoTrsoXrsobrsofrsojrsonrsorrsovrsozrso3rso7rso/rspDrspHrspLrspPrspTrspXrspbrspfrspjrspnrsprrspvrspzrsp3rsp7rsp8KK+uyoOuyoeuyouuyo+uypOuypeuypuuyp+uyqOuyqeuyquuyq+uyrOuyreuyruuyr+uysOuyseuysuuys+uytOuyteuytuuyt+uyuOuyueuyuuuyu+uyvOuyveuyvuuyvwor67OA67OB67OC67OD67OE67OF67OG67OH67OI67OJ67OK67OL67OM67ON67OO67OP67OQ67OR67OS67OT67OU67OV67OW67OX67OY67OZ67Oa67Ob67Oc67Od67Oe67OfCivrs6Drs6Hrs6Lrs6Prs6Trs6Xrs6brs6frs6jrs6nrs6rrs6vrs6zrs63rs67rs6/rs7Drs7Hrs7Lrs7Prs7Trs7Xrs7brs7frs7jrs7nrs7rrs7vrs7zrs73rs77rs78KK+u0gOu0geu0guu0g+u0hOu0heu0huu0h+u0iOu0ieu0iuu0i+u0jOu0jeu0juu0j+u0kOu0keu0kuu0k+u0lOu0leu0luu0l+u0mOu0meu0muu0m+u0nOu0neu0nuu0nwor67Sg67Sh67Si67Sj67Sk67Sl67Sm67Sn67So67Sp67Sq67Sr67Ss67St67Su67Sv67Sw67Sx67Sy67Sz67S067S167S267S367S467S567S667S767S867S967S+67S/CivrtYDrtYHrtYLrtYPrtYTrtYXrtYbrtYfrtYjrtYnrtYrrtYvrtYzrtY3rtY7rtY/rtZDrtZHrtZLrtZPrtZTrtZXrtZbrtZfrtZjrtZnrtZrrtZvrtZzrtZ3rtZ7rtZ8KK+u1oOu1oeu1ouu1o+u1pOu1peu1puu1p+u1qOu1qeu1quu1q+u1rOu1reu1ruu1r+u1sOu1seu1suu1s+u1tOu1teu1tuu1t+u1uOu1ueu1uuu1u+u1vOu1veu1vuu1vwor67aA67aB67aC67aD67aE67aF67aG67aH67aI67aJ67aK67aL67aM67aN67aO67aP67aQ67aR67aS67aT67aU67aV67aW67aX67aY67aZ67aa67ab67ac67ad67ae67afCivrtqDrtqHrtqLrtqPrtqTrtqXrtqbrtqfrtqjrtqnrtqrrtqvrtqzrtq3rtq7rtq/rtrDrtrHrtrLrtrPrtrTrtrXrtrbrtrfrtrjrtrnrtrrrtrvrtrzrtr3rtr7rtr8KK+u3gOu3geu3guu3g+u3hOu3heu3huu3h+u3iOu3ieu3iuu3i+u3jOu3jeu3juu3j+u3kOu3keu3kuu3k+u3lOu3leu3luu3l+u3mOu3meu3muu3m+u3nOu3neu3nuu3nwor67eg67eh67ei67ej67ek67el67em67en67eo67ep67eq67er67es67et67eu67ev67ew67ex67ey67ez67e067e167e267e367e467e567e667e767e867e967e+67e/CivruIDruIHruILruIPruITruIXruIbruIfruIjruInruIrruIvruIzruI3ruI7ruI/ruJDruJHruJLruJPruJTruJXruJbruJfruJjruJnruJrruJvruJzruJ3ruJ7ruJ8KK+u4oOu4oeu4ouu4o+u4pOu4peu4puu4p+u4qOu4qeu4quu4q+u4rOu4reu4ruu4r+u4sOu4seu4suu4s+u4tOu4teu4tuu4t+u4uOu4ueu4uuu4u+u4vOu4veu4vuu4vwor67mA67mB67mC67mD67mE67mF67mG67mH67mI67mJ67mK67mL67mM67mN67mO67mP67mQ67mR67mS67mT67mU67mV67mW67mX67mY67mZ67ma67mb67mc67md67me67mfCivruaDruaHruaLruaPruaTruaXruabruafruajruanruarruavruazrua3rua7rua/rubDrubHrubLrubPrubTrubXrubbrubfrubjrubnrubrrubvrubzrub3rub7rub8KK+u6gOu6geu6guu6g+u6hOu6heu6huu6h+u6iOu6ieu6iuu6i+u6jOu6jeu6juu6j+u6kOu6keu6kuu6k+u6lOu6leu6luu6l+u6mOu6meu6muu6m+u6nOu6neu6nuu6nwor67qg67qh67qi67qj67qk67ql67qm67qn67qo67qp67qq67qr67qs67qt67qu67qv67qw67qx67qy67qz67q067q167q267q367q467q567q667q767q867q967q+67q/Civru4Dru4Hru4Lru4Pru4Tru4Xru4bru4fru4jru4nru4rru4vru4zru43ru47ru4/ru5Dru5Hru5Lru5Pru5Tru5Xru5bru5fru5jru5nru5rru5vru5zru53ru57ru58KK+u7oOu7oeu7ouu7o+u7pOu7peu7puu7p+u7qOu7qeu7quu7q+u7rOu7reu7ruu7r+u7sOu7seu7suu7s+u7tOu7teu7tuu7t+u7uOu7ueu7uuu7u+u7vOu7veu7vuu7vwor67yA67yB67yC67yD67yE67yF67yG67yH67yI67yJ67yK67yL67yM67yN67yO67yP67yQ67yR67yS67yT67yU67yV67yW67yX67yY67yZ67ya67yb67yc67yd67ye67yfCivrvKDrvKHrvKLrvKPrvKTrvKXrvKbrvKfrvKjrvKnrvKrrvKvrvKzrvK3rvK7rvK/rvLDrvLHrvLLrvLPrvLTrvLXrvLbrvLfrvLjrvLnrvLrrvLvrvLzrvL3rvL7rvL8KK+u9gOu9geu9guu9g+u9hOu9heu9huu9h+u9iOu9ieu9iuu9i+u9jOu9jeu9juu9j+u9kOu9keu9kuu9k+u9lOu9leu9luu9l+u9mOu9meu9muu9m+u9nOu9neu9nuu9nwor672g672h672i672j672k672l672m672n672o672p672q672r672s672t672u672v672w672x672y672z6720672167226723672467256726672767286729672+672/CivrvoDrvoHrvoLrvoPrvoTrvoXrvobrvofrvojrvonrvorrvovrvozrvo3rvo7rvo/rvpDrvpHrvpLrvpPrvpTrvpXrvpbrvpfrvpjrvpnrvprrvpvrvpzrvp3rvp7rvp8KK+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+vwor67+A67+B67+C67+D67+E67+F67+G67+H67+I67+J67+K67+L67+M67+N67+O67+P67+Q67+R67+S67+T67+U67+V67+W67+X67+Y67+Z67+a67+b67+c67+d67+e67+fCivrv6Drv6Hrv6Lrv6Prv6Trv6Xrv6brv6frv6jrv6nrv6rrv6vrv6zrv63rv67rv6/rv7Drv7Hrv7Lrv7Prv7Trv7Xrv7brv7frv7jrv7nrv7rrv7vrv7zrv73rv77rv78KK+yAgOyAgeyAguyAg+yAhOyAheyAhuyAh+yAiOyAieyAiuyAi+yAjOyAjeyAjuyAj+yAkOyAkeyAkuyAk+yAlOyAleyAluyAl+yAmOyAmeyAmuyAm+yAnOyAneyAnuyAnwor7ICg7ICh7ICi7ICj7ICk7ICl7ICm7ICn7ICo7ICp7ICq7ICr7ICs7ICt7ICu7ICv7ICw7ICx7ICy7ICz7IC07IC17IC27IC37IC47IC57IC67IC77IC87IC97IC+7IC/CivsgYDsgYHsgYLsgYPsgYTsgYXsgYbsgYfsgYjsgYnsgYrsgYvsgYzsgY3sgY7sgY/sgZDsgZHsgZLsgZPsgZTsgZXsgZbsgZfsgZjsgZnsgZrsgZvsgZzsgZ3sgZ7sgZ8KK+yBoOyBoeyBouyBo+yBpOyBpeyBpuyBp+yBqOyBqeyBquyBq+yBrOyBreyBruyBr+yBsOyBseyBsuyBs+yBtOyBteyBtuyBt+yBuOyBueyBuuyBu+yBvOyBveyBvuyBvwor7IKA7IKB7IKC7IKD7IKE7IKF7IKG7IKH7IKI7IKJ7IKK7IKL7IKM7IKN7IKO7IKP7IKQ7IKR7IKS7IKT7IKU7IKV7IKW7IKX7IKY7IKZ7IKa7IKb7IKc7IKd7IKe7IKfCivsgqDsgqHsgqLsgqPsgqTsgqXsgqbsgqfsgqjsgqnsgqrsgqvsgqzsgq3sgq7sgq/sgrDsgrHsgrLsgrPsgrTsgrXsgrbsgrfsgrjsgrnsgrrsgrvsgrzsgr3sgr7sgr8KK+yDgOyDgeyDguyDg+yDhOyDheyDhuyDh+yDiOyDieyDiuyDi+yDjOyDjeyDjuyDj+yDkOyDkeyDkuyDk+yDlOyDleyDluyDl+yDmOyDmeyDmuyDm+yDnOyDneyDnuyDnwor7IOg7IOh7IOi7IOj7IOk7IOl7IOm7IOn7IOo7IOp7IOq7IOr7IOs7IOt7IOu7IOv7IOw7IOx7IOy7IOz7IO07IO17IO27IO37IO47IO57IO67IO77IO87IO97IO+7IO/CivshIDshIHshILshIPshITshIXshIbshIfshIjshInshIrshIvshIzshI3shI7shI/shJDshJHshJLshJPshJTshJXshJbshJfshJjshJnshJrshJvshJzshJ3shJ7shJ8KK+yEoOyEoeyEouyEo+yEpOyEpeyEpuyEp+yEqOyEqeyEquyEq+yErOyEreyEruyEr+yEsOyEseyEsuyEs+yEtOyEteyEtuyEt+yEuOyEueyEuuyEu+yEvOyEveyEvuyEvwor7IWA7IWB7IWC7IWD7IWE7IWF7IWG7IWH7IWI7IWJ7IWK7IWL7IWM7IWN7IWO7IWP7IWQ7IWR7IWS7IWT7IWU7IWV7IWW7IWX7IWY7IWZ7IWa7IWb7IWc7IWd7IWe7IWfCivshaDshaHshaLshaPshaTshaXshabshafshajshansharshavshazsha3sha7sha/shbDshbHshbLshbPshbTshbXshbbshbfshbjshbnshbrshbvshbzshb3shb7shb8KK+yGgOyGgeyGguyGg+yGhOyGheyGhuyGh+yGiOyGieyGiuyGi+yGjOyGjeyGjuyGj+yGkOyGkeyGkuyGk+yGlOyGleyGluyGl+yGmOyGmeyGmuyGm+yGnOyGneyGnuyGnwor7Iag7Iah7Iai7Iaj7Iak7Ial7Iam7Ian7Iao7Iap7Iaq7Iar7Ias7Iat7Iau7Iav7Iaw7Iax7Iay7Iaz7Ia07Ia17Ia27Ia37Ia47Ia57Ia67Ia77Ia87Ia97Ia+7Ia/Civsh4Dsh4Hsh4Lsh4Psh4Tsh4Xsh4bsh4fsh4jsh4nsh4rsh4vsh4zsh43sh47sh4/sh5Dsh5Hsh5Lsh5Psh5Tsh5Xsh5bsh5fsh5jsh5nsh5rsh5vsh5zsh53sh57sh58KK+yHoOyHoeyHouyHo+yHpOyHpeyHpuyHp+yHqOyHqeyHquyHq+yHrOyHreyHruyHr+yHsOyHseyHsuyHs+yHtOyHteyHtuyHt+yHuOyHueyHuuyHu+yHvOyHveyHvuyHvwor7IiA7IiB7IiC7IiD7IiE7IiF7IiG7IiH7IiI7IiJ7IiK7IiL7IiM7IiN7IiO7IiP7IiQ7IiR7IiS7IiT7IiU7IiV7IiW7IiX7IiY7IiZ7Iia7Iib7Iic7Iid7Iie7IifCivsiKDsiKHsiKLsiKPsiKTsiKXsiKbsiKfsiKjsiKnsiKrsiKvsiKzsiK3siK7siK/siLDsiLHsiLLsiLPsiLTsiLXsiLbsiLfsiLjsiLnsiLrsiLvsiLzsiL3siL7siL8KK+yJgOyJgeyJguyJg+yJhOyJheyJhuyJh+yJiOyJieyJiuyJi+yJjOyJjeyJjuyJj+yJkOyJkeyJkuyJk+yJlOyJleyJluyJl+yJmOyJmeyJmuyJm+yJnOyJneyJnuyJnwor7Img7Imh7Imi7Imj7Imk7Iml7Imm7Imn7Imo7Imp7Imq7Imr7Ims7Imt7Imu7Imv7Imw7Imx7Imy7Imz7Im07Im17Im27Im37Im47Im57Im67Im77Im87Im97Im+7Im/CivsioDsioHsioLsioPsioTsioXsiobsiofsiojsionsiorsiovsiozsio3sio7sio/sipDsipHsipLsipPsipTsipXsipbsipfsipjsipnsiprsipvsipzsip3sip7sip8KK+yKoOyKoeyKouyKo+yKpOyKpeyKpuyKp+yKqOyKqeyKquyKq+yKrOyKreyKruyKr+yKsOyKseyKsuyKs+yKtOyKteyKtuyKt+yKuOyKueyKuuyKu+yKvOyKveyKvuyKvwor7IuA7IuB7IuC7IuD7IuE7IuF7IuG7IuH7IuI7IuJ7IuK7IuL7IuM7IuN7IuO7IuP7IuQ7IuR7IuS7IuT7IuU7IuV7IuW7IuX7IuY7IuZ7Iua7Iub7Iuc7Iud7Iue7IufCivsi6Dsi6Hsi6Lsi6Psi6Tsi6Xsi6bsi6fsi6jsi6nsi6rsi6vsi6zsi63si67si6/si7Dsi7Hsi7Lsi7Psi7Tsi7Xsi7bsi7fsi7jsi7nsi7rsi7vsi7zsi73si77si78KK+yMgOyMgeyMguyMg+yMhOyMheyMhuyMh+yMiOyMieyMiuyMi+yMjOyMjeyMjuyMj+yMkOyMkeyMkuyMk+yMlOyMleyMluyMl+yMmOyMmeyMmuyMm+yMnOyMneyMnuyMnwor7Iyg7Iyh7Iyi7Iyj7Iyk7Iyl7Iym7Iyn7Iyo7Iyp7Iyq7Iyr7Iys7Iyt7Iyu7Iyv7Iyw7Iyx7Iyy7Iyz7Iy07Iy17Iy27Iy37Iy47Iy57Iy67Iy77Iy87Iy97Iy+7Iy/CivsjYDsjYHsjYLsjYPsjYTsjYXsjYbsjYfsjYjsjYnsjYrsjYvsjYzsjY3sjY7sjY/sjZDsjZHsjZLsjZPsjZTsjZXsjZbsjZfsjZjsjZnsjZrsjZvsjZzsjZ3sjZ7sjZ8KK+yNoOyNoeyNouyNo+yNpOyNpeyNpuyNp+yNqOyNqeyNquyNq+yNrOyNreyNruyNr+yNsOyNseyNsuyNs+yNtOyNteyNtuyNt+yNuOyNueyNuuyNu+yNvOyNveyNvuyNvwor7I6A7I6B7I6C7I6D7I6E7I6F7I6G7I6H7I6I7I6J7I6K7I6L7I6M7I6N7I6O7I6P7I6Q7I6R7I6S7I6T7I6U7I6V7I6W7I6X7I6Y7I6Z7I6a7I6b7I6c7I6d7I6e7I6fCivsjqDsjqHsjqLsjqPsjqTsjqXsjqbsjqfsjqjsjqnsjqrsjqvsjqzsjq3sjq7sjq/sjrDsjrHsjrLsjrPsjrTsjrXsjrbsjrfsjrjsjrnsjrrsjrvsjrzsjr3sjr7sjr8KK+yPgOyPgeyPguyPg+yPhOyPheyPhuyPh+yPiOyPieyPiuyPi+yPjOyPjeyPjuyPj+yPkOyPkeyPkuyPk+yPlOyPleyPluyPl+yPmOyPmeyPmuyPm+yPnOyPneyPnuyPnwor7I+g7I+h7I+i7I+j7I+k7I+l7I+m7I+n7I+o7I+p7I+q7I+r7I+s7I+t7I+u7I+v7I+w7I+x7I+y7I+z7I+07I+17I+27I+37I+47I+57I+67I+77I+87I+97I++7I+/CivskIDskIHskILskIPskITskIXskIbskIfskIjskInskIrskIvskIzskI3skI7skI/skJDskJHskJLskJPskJTskJXskJbskJfskJjskJnskJrskJvskJzskJ3skJ7skJ8KK+yQoOyQoeyQouyQo+yQpOyQpeyQpuyQp+yQqOyQqeyQquyQq+yQrOyQreyQruyQr+yQsOyQseyQsuyQs+yQtOyQteyQtuyQt+yQuOyQueyQuuyQu+yQvOyQveyQvuyQvwor7JGA7JGB7JGC7JGD7JGE7JGF7JGG7JGH7JGI7JGJ7JGK7JGL7JGM7JGN7JGO7JGP7JGQ7JGR7JGS7JGT7JGU7JGV7JGW7JGX7JGY7JGZ7JGa7JGb7JGc7JGd7JGe7JGfCivskaDskaHskaLskaPskaTskaXskabskafskajskanskarskavskazska3ska7ska/skbDskbHskbLskbPskbTskbXskbbskbfskbjskbnskbrskbvskbzskb3skb7skb8KK+ySgOySgeySguySg+yShOySheyShuySh+ySiOySieySiuySi+ySjOySjeySjuySj+ySkOySkeySkuySk+ySlOySleySluySl+ySmOySmeySmuySm+ySnOySneySnuySnwor7JKg7JKh7JKi7JKj7JKk7JKl7JKm7JKn7JKo7JKp7JKq7JKr7JKs7JKt7JKu7JKv7JKw7JKx7JKy7JKz7JK07JK17JK27JK37JK47JK57JK67JK77JK87JK97JK+7JK/Civsk4Dsk4Hsk4Lsk4Psk4Tsk4Xsk4bsk4fsk4jsk4nsk4rsk4vsk4zsk43sk47sk4/sk5Dsk5Hsk5Lsk5Psk5Tsk5Xsk5bsk5fsk5jsk5nsk5rsk5vsk5zsk53sk57sk58KK+yToOyToeyTouyTo+yTpOyTpeyTpuyTp+yTqOyTqeyTquyTq+yTrOyTreyTruyTr+yTsOyTseyTsuyTs+yTtOyTteyTtuyTt+yTuOyTueyTuuyTu+yTvOyTveyTvuyTvwor7JSA7JSB7JSC7JSD7JSE7JSF7JSG7JSH7JSI7JSJ7JSK7JSL7JSM7JSN7JSO7JSP7JSQ7JSR7JSS7JST7JSU7JSV7JSW7JSX7JSY7JSZ7JSa7JSb7JSc7JSd7JSe7JSfCivslKDslKHslKLslKPslKTslKXslKbslKfslKjslKnslKrslKvslKzslK3slK7slK/slLDslLHslLLslLPslLTslLXslLbslLfslLjslLnslLrslLvslLzslL3slL7slL8KK+yVgOyVgeyVguyVg+yVhOyVheyVhuyVh+yViOyVieyViuyVi+yVjOyVjeyVjuyVj+yVkOyVkeyVkuyVk+yVlOyVleyVluyVl+yVmOyVmeyVmuyVm+yVnOyVneyVnuyVnwor7JWg7JWh7JWi7JWj7JWk7JWl7JWm7JWn7JWo7JWp7JWq7JWr7JWs7JWt7JWu7JWv7JWw7JWx7JWy7JWz7JW07JW17JW27JW37JW47JW57JW67JW77JW87JW97JW+7JW/CivsloDsloHsloLsloPsloTsloXslobslofslojslonslorslovslozslo3slo7slo/slpDslpHslpLslpPslpTslpXslpbslpfslpjslpnslprslpvslpzslp3slp7slp8KK+yWoOyWoeyWouyWo+yWpOyWpeyWpuyWp+yWqOyWqeyWquyWq+yWrOyWreyWruyWr+yWsOyWseyWsuyWs+yWtOyWteyWtuyWt+yWuOyWueyWuuyWu+yWvOyWveyWvuyWvwor7JeA7JeB7JeC7JeD7JeE7JeF7JeG7JeH7JeI7JeJ7JeK7JeL7JeM7JeN7JeO7JeP7JeQ7JeR7JeS7JeT7JeU7JeV7JeW7JeX7JeY7JeZ7Jea7Jeb7Jec7Jed7Jee7JefCivsl6Dsl6Hsl6Lsl6Psl6Tsl6Xsl6bsl6fsl6jsl6nsl6rsl6vsl6zsl63sl67sl6/sl7Dsl7Hsl7Lsl7Psl7Tsl7Xsl7bsl7fsl7jsl7nsl7rsl7vsl7zsl73sl77sl78KK+yYgOyYgeyYguyYg+yYhOyYheyYhuyYh+yYiOyYieyYiuyYi+yYjOyYjeyYjuyYj+yYkOyYkeyYkuyYk+yYlOyYleyYluyYl+yYmOyYmeyYmuyYm+yYnOyYneyYnuyYnwor7Jig7Jih7Jii7Jij7Jik7Jil7Jim7Jin7Jio7Jip7Jiq7Jir7Jis7Jit7Jiu7Jiv7Jiw7Jix7Jiy7Jiz7Ji07Ji17Ji27Ji37Ji47Ji57Ji67Ji77Ji87Ji97Ji+7Ji/CivsmYDsmYHsmYLsmYPsmYTsmYXsmYbsmYfsmYjsmYnsmYrsmYvsmYzsmY3smY7smY/smZDsmZHsmZLsmZPsmZTsmZXsmZbsmZfsmZjsmZnsmZrsmZvsmZzsmZ3smZ7smZ8KK+yZoOyZoeyZouyZo+yZpOyZpeyZpuyZp+yZqOyZqeyZquyZq+yZrOyZreyZruyZr+yZsOyZseyZsuyZs+yZtOyZteyZtuyZt+yZuOyZueyZuuyZu+yZvOyZveyZvuyZvwor7JqA7JqB7JqC7JqD7JqE7JqF7JqG7JqH7JqI7JqJ7JqK7JqL7JqM7JqN7JqO7JqP7JqQ7JqR7JqS7JqT7JqU7JqV7JqW7JqX7JqY7JqZ7Jqa7Jqb7Jqc7Jqd7Jqe7JqfCivsmqDsmqHsmqLsmqPsmqTsmqXsmqbsmqfsmqjsmqnsmqrsmqvsmqzsmq3smq7smq/smrDsmrHsmrLsmrPsmrTsmrXsmrbsmrfsmrjsmrnsmrrsmrvsmrzsmr3smr7smr8KK+ybgOybgeybguybg+ybhOybheybhuybh+ybiOybieybiuybi+ybjOybjeybjuybj+ybkOybkeybkuybk+yblOybleybluybl+ybmOybmeybmuybm+ybnOybneybnuybnwor7Jug7Juh7Jui7Juj7Juk7Jul7Jum7Jun7Juo7Jup7Juq7Jur7Jus7Jut7Juu7Juv7Juw7Jux7Juy7Juz7Ju07Ju17Ju27Ju37Ju47Ju57Ju67Ju77Ju87Ju97Ju+7Ju/CivsnIDsnIHsnILsnIPsnITsnIXsnIbsnIfsnIjsnInsnIrsnIvsnIzsnI3snI7snI/snJDsnJHsnJLsnJPsnJTsnJXsnJbsnJfsnJjsnJnsnJrsnJvsnJzsnJ3snJ7snJ8KK+ycoOycoeycouyco+ycpOycpeycpuycp+ycqOycqeycquycq+ycrOycreycruycr+ycsOycseycsuycs+yctOycteyctuyct+ycuOycueycuuycu+ycvOycveycvuycvwor7J2A7J2B7J2C7J2D7J2E7J2F7J2G7J2H7J2I7J2J7J2K7J2L7J2M7J2N7J2O7J2P7J2Q7J2R7J2S7J2T7J2U7J2V7J2W7J2X7J2Y7J2Z7J2a7J2b7J2c7J2d7J2e7J2fCivsnaDsnaHsnaLsnaPsnaTsnaXsnabsnafsnajsnansnarsnavsnazsna3sna7sna/snbDsnbHsnbLsnbPsnbTsnbXsnbbsnbfsnbjsnbnsnbrsnbvsnbzsnb3snb7snb8KK+yegOyegeyeguyeg+yehOyeheyehuyeh+yeiOyeieyeiuyei+yejOyejeyejuyej+yekOyekeyekuyek+yelOyeleyeluyel+yemOyemeyemuyem+yenOyeneyenuyenwor7J6g7J6h7J6i7J6j7J6k7J6l7J6m7J6n7J6o7J6p7J6q7J6r7J6s7J6t7J6u7J6v7J6w7J6x7J6y7J6z7J607J617J627J637J647J657J667J677J687J697J6+7J6/Civsn4Dsn4Hsn4Lsn4Psn4Tsn4Xsn4bsn4fsn4jsn4nsn4rsn4vsn4zsn43sn47sn4/sn5Dsn5Hsn5Lsn5Psn5Tsn5Xsn5bsn5fsn5jsn5nsn5rsn5vsn5zsn53sn57sn58KK+yfoOyfoeyfouyfo+yfpOyfpeyfpuyfp+yfqOyfqeyfquyfq+yfrOyfreyfruyfr+yfsOyfseyfsuyfs+yftOyfteyftuyft+yfuOyfueyfuuyfu+yfvOyfveyfvuyfvwor7KCA7KCB7KCC7KCD7KCE7KCF7KCG7KCH7KCI7KCJ7KCK7KCL7KCM7KCN7KCO7KCP7KCQ7KCR7KCS7KCT7KCU7KCV7KCW7KCX7KCY7KCZ7KCa7KCb7KCc7KCd7KCe7KCfCivsoKDsoKHsoKLsoKPsoKTsoKXsoKbsoKfsoKjsoKnsoKrsoKvsoKzsoK3soK7soK/soLDsoLHsoLLsoLPsoLTsoLXsoLbsoLfsoLjsoLnsoLrsoLvsoLzsoL3soL7soL8KK+yhgOyhgeyhguyhg+yhhOyhheyhhuyhh+yhiOyhieyhiuyhi+yhjOyhjeyhjuyhj+yhkOyhkeyhkuyhk+yhlOyhleyhluyhl+yhmOyhmeyhmuyhm+yhnOyhneyhnuyhnwor7KGg7KGh7KGi7KGj7KGk7KGl7KGm7KGn7KGo7KGp7KGq7KGr7KGs7KGt7KGu7KGv7KGw7KGx7KGy7KGz7KG07KG17KG27KG37KG47KG57KG67KG77KG87KG97KG+7KG/CivsooDsooHsooLsooPsooTsooXsoobsoofsoojsoonsoorsoovsoozsoo3soo7soo/sopDsopHsopLsopPsopTsopXsopbsopfsopjsopnsoprsopvsopzsop3sop7sop8KK+yioOyioeyiouyio+yipOyipeyipuyip+yiqOyiqeyiquyiq+yirOyireyiruyir+yisOyiseyisuyis+yitOyiteyituyit+yiuOyiueyiuuyiu+yivOyiveyivuyivwor7KOA7KOB7KOC7KOD7KOE7KOF7KOG7KOH7KOI7KOJ7KOK7KOL7KOM7KON7KOO7KOP7KOQ7KOR7KOS7KOT7KOU7KOV7KOW7KOX7KOY7KOZ7KOa7KOb7KOc7KOd7KOe7KOfCivso6Dso6Hso6Lso6Pso6Tso6Xso6bso6fso6jso6nso6rso6vso6zso63so67so6/so7Dso7Hso7Lso7Pso7Tso7Xso7bso7fso7jso7nso7rso7vso7zso73so77so78KK+ykgOykgeykguykg+ykhOykheykhuykh+ykiOykieykiuyki+ykjOykjeykjuykj+ykkOykkeykkuykk+yklOykleykluykl+ykmOykmeykmuykm+yknOykneyknuyknwor7KSg7KSh7KSi7KSj7KSk7KSl7KSm7KSn7KSo7KSp7KSq7KSr7KSs7KSt7KSu7KSv7KSw7KSx7KSy7KSz7KS07KS17KS27KS37KS47KS57KS67KS77KS87KS97KS+7KS/CivspYDspYHspYLspYPspYTspYXspYbspYfspYjspYnspYrspYvspYzspY3spY7spY/spZDspZHspZLspZPspZTspZXspZbspZfspZjspZnspZrspZvspZzspZ3spZ7spZ8KK+yloOyloeylouylo+ylpOylpeylpuylp+ylqOylqeylquylq+ylrOylreylruylr+ylsOylseylsuyls+yltOylteyltuylt+yluOylueyluuylu+ylvOylveylvuylvwor7KaA7KaB7KaC7KaD7KaE7KaF7KaG7KaH7KaI7KaJ7KaK7KaL7KaM7KaN7KaO7KaP7KaQ7KaR7KaS7KaT7KaU7KaV7KaW7KaX7KaY7KaZ7Kaa7Kab7Kac7Kad7Kae7KafCivspqDspqHspqLspqPspqTspqXspqbspqfspqjspqnspqrspqvspqzspq3spq7spq/sprDsprHsprLsprPsprTsprXsprbsprfsprjsprnsprrsprvsprzspr3spr7spr8KK+yngOyngeynguyng+ynhOynheynhuynh+yniOynieyniuyni+ynjOynjeynjuynj+ynkOynkeynkuynk+ynlOynleynluynl+ynmOynmeynmuynm+ynnOynneynnuynnwor7Keg7Keh7Kei7Kej7Kek7Kel7Kem7Ken7Keo7Kep7Keq7Ker7Kes7Ket7Keu7Kev7Kew7Kex7Key7Kez7Ke07Ke17Ke27Ke37Ke47Ke57Ke67Ke77Ke87Ke97Ke+7Ke/CivsqIDsqIHsqILsqIPsqITsqIXsqIbsqIfsqIjsqInsqIrsqIvsqIzsqI3sqI7sqI/sqJDsqJHsqJLsqJPsqJTsqJXsqJbsqJfsqJjsqJnsqJrsqJvsqJzsqJ3sqJ7sqJ8KK+yooOyooeyoouyoo+yopOyopeyopuyop+yoqOyoqeyoquyoq+yorOyoreyoruyor+yosOyoseyosuyos+yotOyoteyotuyot+youOyoueyouuyou+yovOyoveyovuyovwor7KmA7KmB7KmC7KmD7KmE7KmF7KmG7KmH7KmI7KmJ7KmK7KmL7KmM7KmN7KmO7KmP7KmQ7KmR7KmS7KmT7KmU7KmV7KmW7KmX7KmY7KmZ7Kma7Kmb7Kmc7Kmd7Kme7KmfCivsqaDsqaHsqaLsqaPsqaTsqaXsqabsqafsqajsqansqarsqavsqazsqa3sqa7sqa/sqbDsqbHsqbLsqbPsqbTsqbXsqbbsqbfsqbjsqbnsqbrsqbvsqbzsqb3sqb7sqb8KK+yqgOyqgeyqguyqg+yqhOyqheyqhuyqh+yqiOyqieyqiuyqi+yqjOyqjeyqjuyqj+yqkOyqkeyqkuyqk+yqlOyqleyqluyql+yqmOyqmeyqmuyqm+yqnOyqneyqnuyqnwor7Kqg7Kqh7Kqi7Kqj7Kqk7Kql7Kqm7Kqn7Kqo7Kqp7Kqq7Kqr7Kqs7Kqt7Kqu7Kqv7Kqw7Kqx7Kqy7Kqz7Kq07Kq17Kq27Kq37Kq47Kq57Kq67Kq77Kq87Kq97Kq+7Kq/Civsq4Dsq4Hsq4Lsq4Psq4Tsq4Xsq4bsq4fsq4jsq4nsq4rsq4vsq4zsq43sq47sq4/sq5Dsq5Hsq5Lsq5Psq5Tsq5Xsq5bsq5fsq5jsq5nsq5rsq5vsq5zsq53sq57sq58KK+yroOyroeyrouyro+yrpOyrpeyrpuyrp+yrqOyrqeyrquyrq+yrrOyrreyrruyrr+yrsOyrseyrsuyrs+yrtOyrteyrtuyrt+yruOyrueyruuyru+yrvOyrveyrvuyrvwor7KyA7KyB7KyC7KyD7KyE7KyF7KyG7KyH7KyI7KyJ7KyK7KyL7KyM7KyN7KyO7KyP7KyQ7KyR7KyS7KyT7KyU7KyV7KyW7KyX7KyY7KyZ7Kya7Kyb7Kyc7Kyd7Kye7KyfCivsrKDsrKHsrKLsrKPsrKTsrKXsrKbsrKfsrKjsrKnsrKrsrKvsrKzsrK3srK7srK/srLDsrLHsrLLsrLPsrLTsrLXsrLbsrLfsrLjsrLnsrLrsrLvsrLzsrL3srL7srL8KK+ytgOytgeytguytg+ythOytheythuyth+ytiOytieytiuyti+ytjOytjeytjuytj+ytkOytkeytkuytk+ytlOytleytluytl+ytmOytmeytmuytm+ytnOytneytnuytnwor7K2g7K2h7K2i7K2j7K2k7K2l7K2m7K2n7K2o7K2p7K2q7K2r7K2s7K2t7K2u7K2v7K2w7K2x7K2y7K2z7K207K217K227K237K247K257K267K277K287K297K2+7K2/CivsroDsroHsroLsroPsroTsroXsrobsrofsrojsronsrorsrovsrozsro3sro7sro/srpDsrpHsrpLsrpPsrpTsrpXsrpbsrpfsrpjsrpnsrprsrpvsrpzsrp3srp7srp8KK+yuoOyuoeyuouyuo+yupOyupeyupuyup+yuqOyuqeyuquyuq+yurOyureyuruyur+yusOyuseyusuyus+yutOyuteyutuyut+yuuOyuueyuuuyuu+yuvOyuveyuvuyuvwor7K+A7K+B7K+C7K+D7K+E7K+F7K+G7K+H7K+I7K+J7K+K7K+L7K+M7K+N7K+O7K+P7K+Q7K+R7K+S7K+T7K+U7K+V7K+W7K+X7K+Y7K+Z7K+a7K+b7K+c7K+d7K+e7K+fCivsr6Dsr6Hsr6Lsr6Psr6Tsr6Xsr6bsr6fsr6jsr6nsr6rsr6vsr6zsr63sr67sr6/sr7Dsr7Hsr7Lsr7Psr7Tsr7Xsr7bsr7fsr7jsr7nsr7rsr7vsr7zsr73sr77sr78KK+ywgOywgeywguywg+ywhOywheywhuywh+ywiOywieywiuywi+ywjOywjeywjuywj+ywkOywkeywkuywk+ywlOywleywluywl+ywmOywmeywmuywm+ywnOywneywnuywnwor7LCg7LCh7LCi7LCj7LCk7LCl7LCm7LCn7LCo7LCp7LCq7LCr7LCs7LCt7LCu7LCv7LCw7LCx7LCy7LCz7LC07LC17LC27LC37LC47LC57LC67LC77LC87LC97LC+7LC/CivssYDssYHssYLssYPssYTssYXssYbssYfssYjssYnssYrssYvssYzssY3ssY7ssY/ssZDssZHssZLssZPssZTssZXssZbssZfssZjssZnssZrssZvssZzssZ3ssZ7ssZ8KK+yxoOyxoeyxouyxo+yxpOyxpeyxpuyxp+yxqOyxqeyxquyxq+yxrOyxreyxruyxr+yxsOyxseyxsuyxs+yxtOyxteyxtuyxt+yxuOyxueyxuuyxu+yxvOyxveyxvuyxvwor7LKA7LKB7LKC7LKD7LKE7LKF7LKG7LKH7LKI7LKJ7LKK7LKL7LKM7LKN7LKO7LKP7LKQ7LKR7LKS7LKT7LKU7LKV7LKW7LKX7LKY7LKZ7LKa7LKb7LKc7LKd7LKe7LKfCivssqDssqHssqLssqPssqTssqXssqbssqfssqjssqnssqrssqvssqzssq3ssq7ssq/ssrDssrHssrLssrPssrTssrXssrbssrfssrjssrnssrrssrvssrzssr3ssr7ssr8KK+yzgOyzgeyzguyzg+yzhOyzheyzhuyzh+yziOyzieyziuyzi+yzjOyzjeyzjuyzj+yzkOyzkeyzkuyzk+yzlOyzleyzluyzl+yzmOyzmeyzmuyzm+yznOyzneyznuyznwor7LOg7LOh7LOi7LOj7LOk7LOl7LOm7LOn7LOo7LOp7LOq7LOr7LOs7LOt7LOu7LOv7LOw7LOx7LOy7LOz7LO07LO17LO27LO37LO47LO57LO67LO77LO87LO97LO+7LO/CivstIDstIHstILstIPstITstIXstIbstIfstIjstInstIrstIvstIzstI3stI7stI/stJDstJHstJLstJPstJTstJXstJbstJfstJjstJnstJrstJvstJzstJ3stJ7stJ8KK+y0oOy0oey0ouy0o+y0pOy0pey0puy0p+y0qOy0qey0quy0q+y0rOy0rey0ruy0r+y0sOy0sey0suy0s+y0tOy0tey0tuy0t+y0uOy0uey0uuy0u+y0vOy0vey0vuy0vwor7LWA7LWB7LWC7LWD7LWE7LWF7LWG7LWH7LWI7LWJ7LWK7LWL7LWM7LWN7LWO7LWP7LWQ7LWR7LWS7LWT7LWU7LWV7LWW7LWX7LWY7LWZ7LWa7LWb7LWc7LWd7LWe7LWfCivstaDstaHstaLstaPstaTstaXstabstafstajstanstarstavstazsta3sta7sta/stbDstbHstbLstbPstbTstbXstbbstbfstbjstbnstbrstbvstbzstb3stb7stb8KK+y2gOy2gey2guy2g+y2hOy2hey2huy2h+y2iOy2iey2iuy2i+y2jOy2jey2juy2j+y2kOy2key2kuy2k+y2lOy2ley2luy2l+y2mOy2mey2muy2m+y2nOy2ney2nuy2nwor7Lag7Lah7Lai7Laj7Lak7Lal7Lam7Lan7Lao7Lap7Laq7Lar7Las7Lat7Lau7Lav7Law7Lax7Lay7Laz7La07La17La27La37La47La57La67La77La87La97La+7La/Civst4Dst4Hst4Lst4Pst4Tst4Xst4bst4fst4jst4nst4rst4vst4zst43st47st4/st5Dst5Hst5Lst5Pst5Tst5Xst5bst5fst5jst5nst5rst5vst5zst53st57st58KK+y3oOy3oey3ouy3o+y3pOy3pey3puy3p+y3qOy3qey3quy3q+y3rOy3rey3ruy3r+y3sOy3sey3suy3s+y3tOy3tey3tuy3t+y3uOy3uey3uuy3u+y3vOy3vey3vuy3vwor7LiA7LiB7LiC7LiD7LiE7LiF7LiG7LiH7LiI7LiJ7LiK7LiL7LiM7LiN7LiO7LiP7LiQ7LiR7LiS7LiT7LiU7LiV7LiW7LiX7LiY7LiZ7Lia7Lib7Lic7Lid7Lie7LifCivsuKDsuKHsuKLsuKPsuKTsuKXsuKbsuKfsuKjsuKnsuKrsuKvsuKzsuK3suK7suK/suLDsuLHsuLLsuLPsuLTsuLXsuLbsuLfsuLjsuLnsuLrsuLvsuLzsuL3suL7suL8KK+y5gOy5gey5guy5g+y5hOy5hey5huy5h+y5iOy5iey5iuy5i+y5jOy5jey5juy5j+y5kOy5key5kuy5k+y5lOy5ley5luy5l+y5mOy5mey5muy5m+y5nOy5ney5nuy5nwor7Lmg7Lmh7Lmi7Lmj7Lmk7Lml7Lmm7Lmn7Lmo7Lmp7Lmq7Lmr7Lms7Lmt7Lmu7Lmv7Lmw7Lmx7Lmy7Lmz7Lm07Lm17Lm27Lm37Lm47Lm57Lm67Lm77Lm87Lm97Lm+7Lm/CivsuoDsuoHsuoLsuoPsuoTsuoXsuobsuofsuojsuonsuorsuovsuozsuo3suo7suo/supDsupHsupLsupPsupTsupXsupbsupfsupjsupnsuprsupvsupzsup3sup7sup8KK+y6oOy6oey6ouy6o+y6pOy6pey6puy6p+y6qOy6qey6quy6q+y6rOy6rey6ruy6r+y6sOy6sey6suy6s+y6tOy6tey6tuy6t+y6uOy6uey6uuy6u+y6vOy6vey6vuy6vwor7LuA7LuB7LuC7LuD7LuE7LuF7LuG7LuH7LuI7LuJ7LuK7LuL7LuM7LuN7LuO7LuP7LuQ7LuR7LuS7LuT7LuU7LuV7LuW7LuX7LuY7LuZ7Lua7Lub7Luc7Lud7Lue7LufCivsu6Dsu6Hsu6Lsu6Psu6Tsu6Xsu6bsu6fsu6jsu6nsu6rsu6vsu6zsu63su67su6/su7Dsu7Hsu7Lsu7Psu7Tsu7Xsu7bsu7fsu7jsu7nsu7rsu7vsu7zsu73su77su78KK+y8gOy8gey8guy8g+y8hOy8hey8huy8h+y8iOy8iey8iuy8i+y8jOy8jey8juy8j+y8kOy8key8kuy8k+y8lOy8ley8luy8l+y8mOy8mey8muy8m+y8nOy8ney8nuy8nwor7Lyg7Lyh7Lyi7Lyj7Lyk7Lyl7Lym7Lyn7Lyo7Lyp7Lyq7Lyr7Lys7Lyt7Lyu7Lyv7Lyw7Lyx7Lyy7Lyz7Ly07Ly17Ly27Ly37Ly47Ly57Ly67Ly77Ly87Ly97Ly+7Ly/CivsvYDsvYHsvYLsvYPsvYTsvYXsvYbsvYfsvYjsvYnsvYrsvYvsvYzsvY3svY7svY/svZDsvZHsvZLsvZPsvZTsvZXsvZbsvZfsvZjsvZnsvZrsvZvsvZzsvZ3svZ7svZ8KK+y9oOy9oey9ouy9o+y9pOy9pey9puy9p+y9qOy9qey9quy9q+y9rOy9rey9ruy9r+y9sOy9sey9suy9s+y9tOy9tey9tuy9t+y9uOy9uey9uuy9u+y9vOy9vey9vuy9vwor7L6A7L6B7L6C7L6D7L6E7L6F7L6G7L6H7L6I7L6J7L6K7L6L7L6M7L6N7L6O7L6P7L6Q7L6R7L6S7L6T7L6U7L6V7L6W7L6X7L6Y7L6Z7L6a7L6b7L6c7L6d7L6e7L6fCivsvqDsvqHsvqLsvqPsvqTsvqXsvqbsvqfsvqjsvqnsvqrsvqvsvqzsvq3svq7svq/svrDsvrHsvrLsvrPsvrTsvrXsvrbsvrfsvrjsvrnsvrrsvrvsvrzsvr3svr7svr8KK+y/gOy/gey/guy/g+y/hOy/hey/huy/h+y/iOy/iey/iuy/i+y/jOy/jey/juy/j+y/kOy/key/kuy/k+y/lOy/ley/luy/l+y/mOy/mey/muy/m+y/nOy/ney/nuy/nwor7L+g7L+h7L+i7L+j7L+k7L+l7L+m7L+n7L+o7L+p7L+q7L+r7L+s7L+t7L+u7L+v7L+w7L+x7L+y7L+z7L+07L+17L+27L+37L+47L+57L+67L+77L+87L+97L++7L+/CivtgIDtgIHtgILtgIPtgITtgIXtgIbtgIftgIjtgIntgIrtgIvtgIztgI3tgI7tgI/tgJDtgJHtgJLtgJPtgJTtgJXtgJbtgJftgJjtgJntgJrtgJvtgJztgJ3tgJ7tgJ8KK+2AoO2Aoe2Aou2Ao+2ApO2Ape2Apu2Ap+2AqO2Aqe2Aqu2Aq+2ArO2Are2Aru2Ar+2AsO2Ase2Asu2As+2AtO2Ate2Atu2At+2AuO2Aue2Auu2Au+2AvO2Ave2Avu2Avwor7YGA7YGB7YGC7YGD7YGE7YGF7YGG7YGH7YGI7YGJ7YGK7YGL7YGM7YGN7YGO7YGP7YGQ7YGR7YGS7YGT7YGU7YGV7YGW7YGX7YGY7YGZ7YGa7YGb7YGc7YGd7YGe7YGfCivtgaDtgaHtgaLtgaPtgaTtgaXtgabtgaftgajtgantgartgavtgaztga3tga7tga/tgbDtgbHtgbLtgbPtgbTtgbXtgbbtgbftgbjtgbntgbrtgbvtgbztgb3tgb7tgb8KK+2CgO2Cge2Cgu2Cg+2ChO2Che2Chu2Ch+2CiO2Cie2Ciu2Ci+2CjO2Cje2Cju2Cj+2CkO2Cke2Cku2Ck+2ClO2Cle2Clu2Cl+2CmO2Cme2Cmu2Cm+2CnO2Cne2Cnu2Cnwor7YKg7YKh7YKi7YKj7YKk7YKl7YKm7YKn7YKo7YKp7YKq7YKr7YKs7YKt7YKu7YKv7YKw7YKx7YKy7YKz7YK07YK17YK27YK37YK47YK57YK67YK77YK87YK97YK+7YK/Civtg4Dtg4Htg4Ltg4Ptg4Ttg4Xtg4btg4ftg4jtg4ntg4rtg4vtg4ztg43tg47tg4/tg5Dtg5Htg5Ltg5Ptg5Ttg5Xtg5btg5ftg5jtg5ntg5rtg5vtg5ztg53tg57tg58KK+2DoO2Doe2Dou2Do+2DpO2Dpe2Dpu2Dp+2DqO2Dqe2Dqu2Dq+2DrO2Dre2Dru2Dr+2DsO2Dse2Dsu2Ds+2DtO2Dte2Dtu2Dt+2DuO2Due2Duu2Du+2DvO2Dve2Dvu2Dvwor7YSA7YSB7YSC7YSD7YSE7YSF7YSG7YSH7YSI7YSJ7YSK7YSL7YSM7YSN7YSO7YSP7YSQ7YSR7YSS7YST7YSU7YSV7YSW7YSX7YSY7YSZ7YSa7YSb7YSc7YSd7YSe7YSfCivthKDthKHthKLthKPthKTthKXthKbthKfthKjthKnthKrthKvthKzthK3thK7thK/thLDthLHthLLthLPthLTthLXthLbthLfthLjthLnthLrthLvthLzthL3thL7thL8KK+2FgO2Fge2Fgu2Fg+2FhO2Fhe2Fhu2Fh+2FiO2Fie2Fiu2Fi+2FjO2Fje2Fju2Fj+2FkO2Fke2Fku2Fk+2FlO2Fle2Flu2Fl+2FmO2Fme2Fmu2Fm+2FnO2Fne2Fnu2Fnwor7YWg7YWh7YWi7YWj7YWk7YWl7YWm7YWn7YWo7YWp7YWq7YWr7YWs7YWt7YWu7YWv7YWw7YWx7YWy7YWz7YW07YW17YW27YW37YW47YW57YW67YW77YW87YW97YW+7YW/CivthoDthoHthoLthoPthoTthoXthobthofthojthonthorthovthoztho3tho7tho/thpDthpHthpLthpPthpTthpXthpbthpfthpjthpnthprthpvthpzthp3thp7thp8KK+2GoO2Goe2Gou2Go+2GpO2Gpe2Gpu2Gp+2GqO2Gqe2Gqu2Gq+2GrO2Gre2Gru2Gr+2GsO2Gse2Gsu2Gs+2GtO2Gte2Gtu2Gt+2GuO2Gue2Guu2Gu+2GvO2Gve2Gvu2Gvwor7YeA7YeB7YeC7YeD7YeE7YeF7YeG7YeH7YeI7YeJ7YeK7YeL7YeM7YeN7YeO7YeP7YeQ7YeR7YeS7YeT7YeU7YeV7YeW7YeX7YeY7YeZ7Yea7Yeb7Yec7Yed7Yee7YefCivth6Dth6Hth6Lth6Pth6Tth6Xth6bth6fth6jth6nth6rth6vth6zth63th67th6/th7Dth7Hth7Lth7Pth7Tth7Xth7bth7fth7jth7nth7rth7vth7zth73th77th78KK+2IgO2Ige2Igu2Ig+2IhO2Ihe2Ihu2Ih+2IiO2Iie2Iiu2Ii+2IjO2Ije2Iju2Ij+2IkO2Ike2Iku2Ik+2IlO2Ile2Ilu2Il+2ImO2Ime2Imu2Im+2InO2Ine2Inu2Inwor7Yig7Yih7Yii7Yij7Yik7Yil7Yim7Yin7Yio7Yip7Yiq7Yir7Yis7Yit7Yiu7Yiv7Yiw7Yix7Yiy7Yiz7Yi07Yi17Yi27Yi37Yi47Yi57Yi67Yi77Yi87Yi97Yi+7Yi/CivtiYDtiYHtiYLtiYPtiYTtiYXtiYbtiYftiYjtiYntiYrtiYvtiYztiY3tiY7tiY/tiZDtiZHtiZLtiZPtiZTtiZXtiZbtiZftiZjtiZntiZrtiZvtiZztiZ3tiZ7tiZ8KK+2JoO2Joe2Jou2Jo+2JpO2Jpe2Jpu2Jp+2JqO2Jqe2Jqu2Jq+2JrO2Jre2Jru2Jr+2JsO2Jse2Jsu2Js+2JtO2Jte2Jtu2Jt+2JuO2Jue2Juu2Ju+2JvO2Jve2Jvu2Jvwor7YqA7YqB7YqC7YqD7YqE7YqF7YqG7YqH7YqI7YqJ7YqK7YqL7YqM7YqN7YqO7YqP7YqQ7YqR7YqS7YqT7YqU7YqV7YqW7YqX7YqY7YqZ7Yqa7Yqb7Yqc7Yqd7Yqe7YqfCivtiqDtiqHtiqLtiqPtiqTtiqXtiqbtiqftiqjtiqntiqrtiqvtiqztiq3tiq7tiq/tirDtirHtirLtirPtirTtirXtirbtirftirjtirntirrtirvtirztir3tir7tir8KK+2LgO2Lge2Lgu2Lg+2LhO2Lhe2Lhu2Lh+2LiO2Lie2Liu2Li+2LjO2Lje2Lju2Lj+2LkO2Lke2Lku2Lk+2LlO2Lle2Llu2Ll+2LmO2Lme2Lmu2Lm+2LnO2Lne2Lnu2Lnwor7Yug7Yuh7Yui7Yuj7Yuk7Yul7Yum7Yun7Yuo7Yup7Yuq7Yur7Yus7Yut7Yuu7Yuv7Yuw7Yux7Yuy7Yuz7Yu07Yu17Yu27Yu37Yu47Yu57Yu67Yu77Yu87Yu97Yu+7Yu/CivtjIDtjIHtjILtjIPtjITtjIXtjIbtjIftjIjtjIntjIrtjIvtjIztjI3tjI7tjI/tjJDtjJHtjJLtjJPtjJTtjJXtjJbtjJftjJjtjJntjJrtjJvtjJztjJ3tjJ7tjJ8KK+2MoO2Moe2Mou2Mo+2MpO2Mpe2Mpu2Mp+2MqO2Mqe2Mqu2Mq+2MrO2Mre2Mru2Mr+2MsO2Mse2Msu2Ms+2MtO2Mte2Mtu2Mt+2MuO2Mue2Muu2Mu+2MvO2Mve2Mvu2Mvwor7Y2A7Y2B7Y2C7Y2D7Y2E7Y2F7Y2G7Y2H7Y2I7Y2J7Y2K7Y2L7Y2M7Y2N7Y2O7Y2P7Y2Q7Y2R7Y2S7Y2T7Y2U7Y2V7Y2W7Y2X7Y2Y7Y2Z7Y2a7Y2b7Y2c7Y2d7Y2e7Y2fCivtjaDtjaHtjaLtjaPtjaTtjaXtjabtjaftjajtjantjartjavtjaztja3tja7tja/tjbDtjbHtjbLtjbPtjbTtjbXtjbbtjbftjbjtjbntjbrtjbvtjbztjb3tjb7tjb8KK+2OgO2Oge2Ogu2Og+2OhO2Ohe2Ohu2Oh+2OiO2Oie2Oiu2Oi+2OjO2Oje2Oju2Oj+2OkO2Oke2Oku2Ok+2OlO2Ole2Olu2Ol+2OmO2Ome2Omu2Om+2OnO2One2Onu2Onwor7Y6g7Y6h7Y6i7Y6j7Y6k7Y6l7Y6m7Y6n7Y6o7Y6p7Y6q7Y6r7Y6s7Y6t7Y6u7Y6v7Y6w7Y6x7Y6y7Y6z7Y607Y617Y627Y637Y647Y657Y667Y677Y687Y697Y6+7Y6/Civtj4Dtj4Htj4Ltj4Ptj4Ttj4Xtj4btj4ftj4jtj4ntj4rtj4vtj4ztj43tj47tj4/tj5Dtj5Htj5Ltj5Ptj5Ttj5Xtj5btj5ftj5jtj5ntj5rtj5vtj5ztj53tj57tj58KK+2PoO2Poe2Pou2Po+2PpO2Ppe2Ppu2Pp+2PqO2Pqe2Pqu2Pq+2PrO2Pre2Pru2Pr+2PsO2Pse2Psu2Ps+2PtO2Pte2Ptu2Pt+2PuO2Pue2Puu2Pu+2PvO2Pve2Pvu2Pvwor7ZCA7ZCB7ZCC7ZCD7ZCE7ZCF7ZCG7ZCH7ZCI7ZCJ7ZCK7ZCL7ZCM7ZCN7ZCO7ZCP7ZCQ7ZCR7ZCS7ZCT7ZCU7ZCV7ZCW7ZCX7ZCY7ZCZ7ZCa7ZCb7ZCc7ZCd7ZCe7ZCfCivtkKDtkKHtkKLtkKPtkKTtkKXtkKbtkKftkKjtkKntkKrtkKvtkKztkK3tkK7tkK/tkLDtkLHtkLLtkLPtkLTtkLXtkLbtkLftkLjtkLntkLrtkLvtkLztkL3tkL7tkL8KK+2RgO2Rge2Rgu2Rg+2RhO2Rhe2Rhu2Rh+2RiO2Rie2Riu2Ri+2RjO2Rje2Rju2Rj+2RkO2Rke2Rku2Rk+2RlO2Rle2Rlu2Rl+2RmO2Rme2Rmu2Rm+2RnO2Rne2Rnu2Rnwor7ZGg7ZGh7ZGi7ZGj7ZGk7ZGl7ZGm7ZGn7ZGo7ZGp7ZGq7ZGr7ZGs7ZGt7ZGu7ZGv7ZGw7ZGx7ZGy7ZGz7ZG07ZG17ZG27ZG37ZG47ZG57ZG67ZG77ZG87ZG97ZG+7ZG/CivtkoDtkoHtkoLtkoPtkoTtkoXtkobtkoftkojtkontkortkovtkoztko3tko7tko/tkpDtkpHtkpLtkpPtkpTtkpXtkpbtkpftkpjtkpntkprtkpvtkpztkp3tkp7tkp8KK+2SoO2Soe2Sou2So+2SpO2Spe2Spu2Sp+2SqO2Sqe2Squ2Sq+2SrO2Sre2Sru2Sr+2SsO2Sse2Ssu2Ss+2StO2Ste2Stu2St+2SuO2Sue2Suu2Su+2SvO2Sve2Svu2Svwor7ZOA7ZOB7ZOC7ZOD7ZOE7ZOF7ZOG7ZOH7ZOI7ZOJ7ZOK7ZOL7ZOM7ZON7ZOO7ZOP7ZOQ7ZOR7ZOS7ZOT7ZOU7ZOV7ZOW7ZOX7ZOY7ZOZ7ZOa7ZOb7ZOc7ZOd7ZOe7ZOfCivtk6Dtk6Htk6Ltk6Ptk6Ttk6Xtk6btk6ftk6jtk6ntk6rtk6vtk6ztk63tk67tk6/tk7Dtk7Htk7Ltk7Ptk7Ttk7Xtk7btk7ftk7jtk7ntk7rtk7vtk7ztk73tk77tk78KK+2UgO2Uge2Ugu2Ug+2UhO2Uhe2Uhu2Uh+2UiO2Uie2Uiu2Ui+2UjO2Uje2Uju2Uj+2UkO2Uke2Uku2Uk+2UlO2Ule2Ulu2Ul+2UmO2Ume2Umu2Um+2UnO2Une2Unu2Unwor7ZSg7ZSh7ZSi7ZSj7ZSk7ZSl7ZSm7ZSn7ZSo7ZSp7ZSq7ZSr7ZSs7ZSt7ZSu7ZSv7ZSw7ZSx7ZSy7ZSz7ZS07ZS17ZS27ZS37ZS47ZS57ZS67ZS77ZS87ZS97ZS+7ZS/CivtlYDtlYHtlYLtlYPtlYTtlYXtlYbtlYftlYjtlYntlYrtlYvtlYztlY3tlY7tlY/tlZDtlZHtlZLtlZPtlZTtlZXtlZbtlZftlZjtlZntlZrtlZvtlZztlZ3tlZ7tlZ8KK+2VoO2Voe2Vou2Vo+2VpO2Vpe2Vpu2Vp+2VqO2Vqe2Vqu2Vq+2VrO2Vre2Vru2Vr+2VsO2Vse2Vsu2Vs+2VtO2Vte2Vtu2Vt+2VuO2Vue2Vuu2Vu+2VvO2Vve2Vvu2Vvwor7ZaA7ZaB7ZaC7ZaD7ZaE7ZaF7ZaG7ZaH7ZaI7ZaJ7ZaK7ZaL7ZaM7ZaN7ZaO7ZaP7ZaQ7ZaR7ZaS7ZaT7ZaU7ZaV7ZaW7ZaX7ZaY7ZaZ7Zaa7Zab7Zac7Zad7Zae7ZafCivtlqDtlqHtlqLtlqPtlqTtlqXtlqbtlqftlqjtlqntlqrtlqvtlqztlq3tlq7tlq/tlrDtlrHtlrLtlrPtlrTtlrXtlrbtlrftlrjtlrntlrrtlrvtlrztlr3tlr7tlr8KK+2XgO2Xge2Xgu2Xg+2XhO2Xhe2Xhu2Xh+2XiO2Xie2Xiu2Xi+2XjO2Xje2Xju2Xj+2XkO2Xke2Xku2Xk+2XlO2Xle2Xlu2Xl+2XmO2Xme2Xmu2Xm+2XnO2Xne2Xnu2Xnwor7Zeg7Zeh7Zei7Zej7Zek7Zel7Zem7Zen7Zeo7Zep7Zeq7Zer7Zes7Zet7Zeu7Zev7Zew7Zex7Zey7Zez7Ze07Ze17Ze27Ze37Ze47Ze57Ze67Ze77Ze87Ze97Ze+7Ze/CivtmIDtmIHtmILtmIPtmITtmIXtmIbtmIftmIjtmIntmIrtmIvtmIztmI3tmI7tmI/tmJDtmJHtmJLtmJPtmJTtmJXtmJbtmJftmJjtmJntmJrtmJvtmJztmJ3tmJ7tmJ8KK+2YoO2Yoe2You2Yo+2YpO2Ype2Ypu2Yp+2YqO2Yqe2Yqu2Yq+2YrO2Yre2Yru2Yr+2YsO2Yse2Ysu2Ys+2YtO2Yte2Ytu2Yt+2YuO2Yue2Yuu2Yu+2YvO2Yve2Yvu2Yvwor7ZmA7ZmB7ZmC7ZmD7ZmE7ZmF7ZmG7ZmH7ZmI7ZmJ7ZmK7ZmL7ZmM7ZmN7ZmO7ZmP7ZmQ7ZmR7ZmS7ZmT7ZmU7ZmV7ZmW7ZmX7ZmY7ZmZ7Zma7Zmb7Zmc7Zmd7Zme7ZmfCivtmaDtmaHtmaLtmaPtmaTtmaXtmabtmaftmajtmantmartmavtmaztma3tma7tma/tmbDtmbHtmbLtmbPtmbTtmbXtmbbtmbftmbjtmbntmbrtmbvtmbztmb3tmb7tmb8KK+2agO2age2agu2ag+2ahO2ahe2ahu2ah+2aiO2aie2aiu2ai+2ajO2aje2aju2aj+2akO2ake2aku2ak+2alO2ale2alu2al+2amO2ame2amu2am+2anO2ane2anu2anwor7Zqg7Zqh7Zqi7Zqj7Zqk7Zql7Zqm7Zqn7Zqo7Zqp7Zqq7Zqr7Zqs7Zqt7Zqu7Zqv7Zqw7Zqx7Zqy7Zqz7Zq07Zq17Zq27Zq37Zq47Zq57Zq67Zq77Zq87Zq97Zq+7Zq/Civtm4Dtm4Htm4Ltm4Ptm4Ttm4Xtm4btm4ftm4jtm4ntm4rtm4vtm4ztm43tm47tm4/tm5Dtm5Htm5Ltm5Ptm5Ttm5Xtm5btm5ftm5jtm5ntm5rtm5vtm5ztm53tm57tm58KK+2boO2boe2bou2bo+2bpO2bpe2bpu2bp+2bqO2bqe2bqu2bq+2brO2bre2bru2br+2bsO2bse2bsu2bs+2btO2bte2btu2bt+2buO2bue2buu2bu+2bvO2bve2bvu2bvwor7ZyA7ZyB7ZyC7ZyD7ZyE7ZyF7ZyG7ZyH7ZyI7ZyJ7ZyK7ZyL7ZyM7ZyN7ZyO7ZyP7ZyQ7ZyR7ZyS7ZyT7ZyU7ZyV7ZyW7ZyX7ZyY7ZyZ7Zya7Zyb7Zyc7Zyd7Zye7ZyfCivtnKDtnKHtnKLtnKPtnKTtnKXtnKbtnKftnKjtnKntnKrtnKvtnKztnK3tnK7tnK/tnLDtnLHtnLLtnLPtnLTtnLXtnLbtnLftnLjtnLntnLrtnLvtnLztnL3tnL7tnL8KK+2dgO2dge2dgu2dg+2dhO2dhe2dhu2dh+2diO2die2diu2di+2djO2dje2dju2dj+2dkO2dke2dku2dk+2dlO2dle2dlu2dl+2dmO2dme2dmu2dm+2dnO2dne2dnu2dnwor7Z2g7Z2h7Z2i7Z2j7Z2k7Z2l7Z2m7Z2n7Z2o7Z2p7Z2q7Z2r7Z2s7Z2t7Z2u7Z2v7Z2w7Z2x7Z2y7Z2z7Z207Z217Z227Z237Z247Z257Z267Z277Z287Z297Z2+7Z2/CivtnoDtnoHtnoLtnoPtnoTtnoXtnobtnoftnojtnontnortnovtnoztno3tno7tno/tnpDtnpHtnpLtnpPtnpTtnpXtnpbtnpftnpjtnpntnprtnpvtnpztnp3tnp7tnp8KK+2eoO2eoe2eou2eo+2epO2epe2epu2ep+2eqO2eqe2equ2eq+2erO2ere2eru2erworCitGcmVlIGJsb2NrIChVK0Q3QjAtVStEN0ZGKToKKwor7Z6w7Z6x7Z6y7Z6z7Z607Z617Z627Z637Z647Z657Z667Z677Z687Z697Z6+7Z6/7Z+A7Z+B7Z+C7Z+D7Z+E7Z+F7Z+G7Z+H7Z+I7Z+J7Z+K7Z+L7Z+M7Z+N7Z+O7Z+P7Z+Q7Z+R7Z+S7Z+T7Z+U7Z+V7Z+W7Z+X7Z+Y7Z+Z7Z+a7Z+b7Z+c7Z+d7Z+e7Z+f7Z+g7Z+h7Z+i7Z+j7Z+k7Z+l7Z+m7Z+n7Z+o7Z+p7Z+q7Z+r7Z+s7Z+t7Z+u7Z+vCivtn7Dtn7Htn7Ltn7Ptn7Ttn7Xtn7btn7ftn7jtn7ntn7rtn7vtn7ztn73tn77tn78KKworSGlnaCBTdXJyb2dhdGVzIChVK0Q4MDAtVStEQjdGKToKKwor7aCA7aCB7aCC7aCD7aCE7aCF7aCG7aCH7aCI7aCJ7aCK7aCL7aCM7aCN7aCO7aCP7aCQ7aCR7aCS7aCT7aCU7aCV7aCW7aCX7aCY7aCZ7aCa7aCb7aCc7aCd7aCe7aCf7aCg7aCh7aCi7aCj7aCk7aCl7aCm7aCn7aCo7aCp7aCq7aCr7aCs7aCt7aCu7aCv7aCw7aCx7aCy7aCz7aC07aC17aC27aC37aC47aC57aC67aC77aC87aC97aC+7aC/CivtoYDtoYHtoYLtoYPtoYTtoYXtoYbtoYftoYjtoYntoYrtoYvtoYztoY3toY7toY/toZDtoZHtoZLtoZPtoZTtoZXtoZbtoZftoZjtoZntoZrtoZvtoZztoZ3toZ7toZ/toaDtoaHtoaLtoaPtoaTtoaXtoabtoaftoajtoantoartoavtoaztoa3toa7toa/tobDtobHtobLtobPtobTtobXtobbtobftobjtobntobrtobvtobztob3tob7tob8KK+2igO2ige2igu2ig+2ihO2ihe2ihu2ih+2iiO2iie2iiu2ii+2ijO2ije2iju2ij+2ikO2ike2iku2ik+2ilO2ile2ilu2il+2imO2ime2imu2im+2inO2ine2inu2in+2ioO2ioe2iou2io+2ipO2ipe2ipu2ip+2iqO2iqe2iqu2iq+2irO2ire2iru2ir+2isO2ise2isu2is+2itO2ite2itu2it+2iuO2iue2iuu2iu+2ivO2ive2ivu2ivwor7aOA7aOB7aOC7aOD7aOE7aOF7aOG7aOH7aOI7aOJ7aOK7aOL7aOM7aON7aOO7aOP7aOQ7aOR7aOS7aOT7aOU7aOV7aOW7aOX7aOY7aOZ7aOa7aOb7aOc7aOd7aOe7aOf7aOg7aOh7aOi7aOj7aOk7aOl7aOm7aOn7aOo7aOp7aOq7aOr7aOs7aOt7aOu7aOv7aOw7aOx7aOy7aOz7aO07aO17aO27aO37aO47aO57aO67aO77aO87aO97aO+7aO/CivtpIDtpIHtpILtpIPtpITtpIXtpIbtpIftpIjtpIntpIrtpIvtpIztpI3tpI7tpI/tpJDtpJHtpJLtpJPtpJTtpJXtpJbtpJftpJjtpJntpJrtpJvtpJztpJ3tpJ7tpJ/tpKDtpKHtpKLtpKPtpKTtpKXtpKbtpKftpKjtpKntpKrtpKvtpKztpK3tpK7tpK/tpLDtpLHtpLLtpLPtpLTtpLXtpLbtpLftpLjtpLntpLrtpLvtpLztpL3tpL7tpL8KK+2lgO2lge2lgu2lg+2lhO2lhe2lhu2lh+2liO2lie2liu2li+2ljO2lje2lju2lj+2lkO2lke2lku2lk+2llO2lle2llu2ll+2lmO2lme2lmu2lm+2lnO2lne2lnu2ln+2loO2loe2lou2lo+2lpO2lpe2lpu2lp+2lqO2lqe2lqu2lq+2lrO2lre2lru2lr+2lsO2lse2lsu2ls+2ltO2lte2ltu2lt+2luO2lue2luu2lu+2lvO2lve2lvu2lvwor7aaA7aaB7aaC7aaD7aaE7aaF7aaG7aaH7aaI7aaJ7aaK7aaL7aaM7aaN7aaO7aaP7aaQ7aaR7aaS7aaT7aaU7aaV7aaW7aaX7aaY7aaZ7aaa7aab7aac7aad7aae7aaf7aag7aah7aai7aaj7aak7aal7aam7aan7aao7aap7aaq7aar7aas7aat7aau7aav7aaw7aax7aay7aaz7aa07aa17aa27aa37aa47aa57aa67aa77aa87aa97aa+7aa/Civtp4Dtp4Htp4Ltp4Ptp4Ttp4Xtp4btp4ftp4jtp4ntp4rtp4vtp4ztp43tp47tp4/tp5Dtp5Htp5Ltp5Ptp5Ttp5Xtp5btp5ftp5jtp5ntp5rtp5vtp5ztp53tp57tp5/tp6Dtp6Htp6Ltp6Ptp6Ttp6Xtp6btp6ftp6jtp6ntp6rtp6vtp6ztp63tp67tp6/tp7Dtp7Htp7Ltp7Ptp7Ttp7Xtp7btp7ftp7jtp7ntp7rtp7vtp7ztp73tp77tp78KK+2ogO2oge2ogu2og+2ohO2ohe2ohu2oh+2oiO2oie2oiu2oi+2ojO2oje2oju2oj+2okO2oke2oku2ok+2olO2ole2olu2ol+2omO2ome2omu2om+2onO2one2onu2on+2ooO2ooe2oou2oo+2opO2ope2opu2op+2oqO2oqe2oqu2oq+2orO2ore2oru2or+2osO2ose2osu2os+2otO2ote2otu2ot+2ouO2oue2ouu2ou+2ovO2ove2ovu2ovwor7amA7amB7amC7amD7amE7amF7amG7amH7amI7amJ7amK7amL7amM7amN7amO7amP7amQ7amR7amS7amT7amU7amV7amW7amX7amY7amZ7ama7amb7amc7amd7ame7amf7amg7amh7ami7amj7amk7aml7amm7amn7amo7amp7amq7amr7ams7amt7amu7amv7amw7amx7amy7amz7am07am17am27am37am47am57am67am77am87am97am+7am/CivtqoDtqoHtqoLtqoPtqoTtqoXtqobtqoftqojtqontqortqovtqoztqo3tqo7tqo/tqpDtqpHtqpLtqpPtqpTtqpXtqpbtqpftqpjtqpntqprtqpvtqpztqp3tqp7tqp/tqqDtqqHtqqLtqqPtqqTtqqXtqqbtqqftqqjtqqntqqrtqqvtqqztqq3tqq7tqq/tqrDtqrHtqrLtqrPtqrTtqrXtqrbtqrftqrjtqrntqrrtqrvtqrztqr3tqr7tqr8KK+2rgO2rge2rgu2rg+2rhO2rhe2rhu2rh+2riO2rie2riu2ri+2rjO2rje2rju2rj+2rkO2rke2rku2rk+2rlO2rle2rlu2rl+2rmO2rme2rmu2rm+2rnO2rne2rnu2rn+2roO2roe2rou2ro+2rpO2rpe2rpu2rp+2rqO2rqe2rqu2rq+2rrO2rre2rru2rr+2rsO2rse2rsu2rs+2rtO2rte2rtu2rt+2ruO2rue2ruu2ru+2rvO2rve2rvu2rvwor7ayA7ayB7ayC7ayD7ayE7ayF7ayG7ayH7ayI7ayJ7ayK7ayL7ayM7ayN7ayO7ayP7ayQ7ayR7ayS7ayT7ayU7ayV7ayW7ayX7ayY7ayZ7aya7ayb7ayc7ayd7aye7ayf7ayg7ayh7ayi7ayj7ayk7ayl7aym7ayn7ayo7ayp7ayq7ayr7ays7ayt7ayu7ayv7ayw7ayx7ayy7ayz7ay07ay17ay27ay37ay47ay57ay67ay77ay87ay97ay+7ay/CivtrYDtrYHtrYLtrYPtrYTtrYXtrYbtrYftrYjtrYntrYrtrYvtrYztrY3trY7trY/trZDtrZHtrZLtrZPtrZTtrZXtrZbtrZftrZjtrZntrZrtrZvtrZztrZ3trZ7trZ/traDtraHtraLtraPtraTtraXtrabtraftrajtrantrartravtraztra3tra7tra/trbDtrbHtrbLtrbPtrbTtrbXtrbbtrbftrbjtrbntrbrtrbvtrbztrb3trb7trb8KKworSGlnaCBQcml2YXRlIFVzZSBTdXJyb2dhdGVzIChVK0RCODAtVStEQkZGKToKKwor7a6A7a6B7a6C7a6D7a6E7a6F7a6G7a6H7a6I7a6J7a6K7a6L7a6M7a6N7a6O7a6P7a6Q7a6R7a6S7a6T7a6U7a6V7a6W7a6X7a6Y7a6Z7a6a7a6b7a6c7a6d7a6e7a6f7a6g7a6h7a6i7a6j7a6k7a6l7a6m7a6n7a6o7a6p7a6q7a6r7a6s7a6t7a6u7a6v7a6w7a6x7a6y7a6z7a607a617a627a637a647a657a667a677a687a697a6+7a6/Civtr4Dtr4Htr4Ltr4Ptr4Ttr4Xtr4btr4ftr4jtr4ntr4rtr4vtr4ztr43tr47tr4/tr5Dtr5Htr5Ltr5Ptr5Ttr5Xtr5btr5ftr5jtr5ntr5rtr5vtr5ztr53tr57tr5/tr6Dtr6Htr6Ltr6Ptr6Ttr6Xtr6btr6ftr6jtr6ntr6rtr6vtr6ztr63tr67tr6/tr7Dtr7Htr7Ltr7Ptr7Ttr7Xtr7btr7ftr7jtr7ntr7rtr7vtr7ztr73tr77tr78KKworTG93IFN1cnJvZ2F0ZXMgKFUrREMwMC1VK0RGRkYpOgorCivtsIDtsIHtsILtsIPtsITtsIXtsIbtsIftsIjtsIntsIrtsIvtsIztsI3tsI7tsI/tsJDtsJHtsJLtsJPtsJTtsJXtsJbtsJftsJjtsJntsJrtsJvtsJztsJ3tsJ7tsJ/tsKDtsKHtsKLtsKPtsKTtsKXtsKbtsKftsKjtsKntsKrtsKvtsKztsK3tsK7tsK/tsLDtsLHtsLLtsLPtsLTtsLXtsLbtsLftsLjtsLntsLrtsLvtsLztsL3tsL7tsL8KK+2xgO2xge2xgu2xg+2xhO2xhe2xhu2xh+2xiO2xie2xiu2xi+2xjO2xje2xju2xj+2xkO2xke2xku2xk+2xlO2xle2xlu2xl+2xmO2xme2xmu2xm+2xnO2xne2xnu2xn+2xoO2xoe2xou2xo+2xpO2xpe2xpu2xp+2xqO2xqe2xqu2xq+2xrO2xre2xru2xr+2xsO2xse2xsu2xs+2xtO2xte2xtu2xt+2xuO2xue2xuu2xu+2xvO2xve2xvu2xvwor7bKA7bKB7bKC7bKD7bKE7bKF7bKG7bKH7bKI7bKJ7bKK7bKL7bKM7bKN7bKO7bKP7bKQ7bKR7bKS7bKT7bKU7bKV7bKW7bKX7bKY7bKZ7bKa7bKb7bKc7bKd7bKe7bKf7bKg7bKh7bKi7bKj7bKk7bKl7bKm7bKn7bKo7bKp7bKq7bKr7bKs7bKt7bKu7bKv7bKw7bKx7bKy7bKz7bK07bK17bK27bK37bK47bK57bK67bK77bK87bK97bK+7bK/Civts4Dts4Hts4Lts4Pts4Tts4Xts4bts4fts4jts4nts4rts4vts4zts43ts47ts4/ts5Dts5Hts5Lts5Pts5Tts5Xts5bts5fts5jts5nts5rts5vts5zts53ts57ts5/ts6Dts6Hts6Lts6Pts6Tts6Xts6bts6fts6jts6nts6rts6vts6zts63ts67ts6/ts7Dts7Hts7Lts7Pts7Tts7Xts7bts7fts7jts7nts7rts7vts7zts73ts77ts78KK+20gO20ge20gu20g+20hO20he20hu20h+20iO20ie20iu20i+20jO20je20ju20j+20kO20ke20ku20k+20lO20le20lu20l+20mO20me20mu20m+20nO20ne20nu20n+20oO20oe20ou20o+20pO20pe20pu20p+20qO20qe20qu20q+20rO20re20ru20r+20sO20se20su20s+20tO20te20tu20t+20uO20ue20uu20u+20vO20ve20vu20vwor7bWA7bWB7bWC7bWD7bWE7bWF7bWG7bWH7bWI7bWJ7bWK7bWL7bWM7bWN7bWO7bWP7bWQ7bWR7bWS7bWT7bWU7bWV7bWW7bWX7bWY7bWZ7bWa7bWb7bWc7bWd7bWe7bWf7bWg7bWh7bWi7bWj7bWk7bWl7bWm7bWn7bWo7bWp7bWq7bWr7bWs7bWt7bWu7bWv7bWw7bWx7bWy7bWz7bW07bW17bW27bW37bW47bW57bW67bW77bW87bW97bW+7bW/CivttoDttoHttoLttoPttoTttoXttobttofttojttonttorttovttoztto3tto7tto/ttpDttpHttpLttpPttpTttpXttpbttpfttpjttpnttprttpvttpzttp3ttp7ttp/ttqDttqHttqLttqPttqTttqXttqbttqfttqjttqnttqrttqvttqzttq3ttq7ttq/ttrDttrHttrLttrPttrTttrXttrbttrfttrjttrnttrrttrvttrzttr3ttr7ttr8KK+23gO23ge23gu23g+23hO23he23hu23h+23iO23ie23iu23i+23jO23je23ju23j+23kO23ke23ku23k+23lO23le23lu23l+23mO23me23mu23m+23nO23ne23nu23n+23oO23oe23ou23o+23pO23pe23pu23p+23qO23qe23qu23q+23rO23re23ru23r+23sO23se23su23s+23tO23te23tu23t+23uO23ue23uu23u+23vO23ve23vu23vwor7biA7biB7biC7biD7biE7biF7biG7biH7biI7biJ7biK7biL7biM7biN7biO7biP7biQ7biR7biS7biT7biU7biV7biW7biX7biY7biZ7bia7bib7bic7bid7bie7bif7big7bih7bii7bij7bik7bil7bim7bin7bio7bip7biq7bir7bis7bit7biu7biv7biw7bix7biy7biz7bi07bi17bi27bi37bi47bi57bi67bi77bi87bi97bi+7bi/CivtuYDtuYHtuYLtuYPtuYTtuYXtuYbtuYftuYjtuYntuYrtuYvtuYztuY3tuY7tuY/tuZDtuZHtuZLtuZPtuZTtuZXtuZbtuZftuZjtuZntuZrtuZvtuZztuZ3tuZ7tuZ/tuaDtuaHtuaLtuaPtuaTtuaXtuabtuaftuajtuantuartuavtuaztua3tua7tua/tubDtubHtubLtubPtubTtubXtubbtubftubjtubntubrtubvtubztub3tub7tub8KK+26gO26ge26gu26g+26hO26he26hu26h+26iO26ie26iu26i+26jO26je26ju26j+26kO26ke26ku26k+26lO26le26lu26l+26mO26me26mu26m+26nO26ne26nu26n+26oO26oe26ou26o+26pO26pe26pu26p+26qO26qe26qu26q+26rO26re26ru26r+26sO26se26su26s+26tO26te26tu26t+26uO26ue26uu26u+26vO26ve26vu26vwor7buA7buB7buC7buD7buE7buF7buG7buH7buI7buJ7buK7buL7buM7buN7buO7buP7buQ7buR7buS7buT7buU7buV7buW7buX7buY7buZ7bua7bub7buc7bud7bue7buf7bug7buh7bui7buj7buk7bul7bum7bun7buo7bup7buq7bur7bus7but7buu7buv7buw7bux7buy7buz7bu07bu17bu27bu37bu47bu57bu67bu77bu87bu97bu+7bu/CivtvIDtvIHtvILtvIPtvITtvIXtvIbtvIftvIjtvIntvIrtvIvtvIztvI3tvI7tvI/tvJDtvJHtvJLtvJPtvJTtvJXtvJbtvJftvJjtvJntvJrtvJvtvJztvJ3tvJ7tvJ/tvKDtvKHtvKLtvKPtvKTtvKXtvKbtvKftvKjtvKntvKrtvKvtvKztvK3tvK7tvK/tvLDtvLHtvLLtvLPtvLTtvLXtvLbtvLftvLjtvLntvLrtvLvtvLztvL3tvL7tvL8KK+29gO29ge29gu29g+29hO29he29hu29h+29iO29ie29iu29i+29jO29je29ju29j+29kO29ke29ku29k+29lO29le29lu29l+29mO29me29mu29m+29nO29ne29nu29n+29oO29oe29ou29o+29pO29pe29pu29p+29qO29qe29qu29q+29rO29re29ru29r+29sO29se29su29s+29tO29te29tu29t+29uO29ue29uu29u+29vO29ve29vu29vwor7b6A7b6B7b6C7b6D7b6E7b6F7b6G7b6H7b6I7b6J7b6K7b6L7b6M7b6N7b6O7b6P7b6Q7b6R7b6S7b6T7b6U7b6V7b6W7b6X7b6Y7b6Z7b6a7b6b7b6c7b6d7b6e7b6f7b6g7b6h7b6i7b6j7b6k7b6l7b6m7b6n7b6o7b6p7b6q7b6r7b6s7b6t7b6u7b6v7b6w7b6x7b6y7b6z7b607b617b627b637b647b657b667b677b687b697b6+7b6/Civtv4Dtv4Htv4Ltv4Ptv4Ttv4Xtv4btv4ftv4jtv4ntv4rtv4vtv4ztv43tv47tv4/tv5Dtv5Htv5Ltv5Ptv5Ttv5Xtv5btv5ftv5jtv5ntv5rtv5vtv5ztv53tv57tv5/tv6Dtv6Htv6Ltv6Ptv6Ttv6Xtv6btv6ftv6jtv6ntv6rtv6vtv6ztv63tv67tv6/tv7Dtv7Htv7Ltv7Ptv7Ttv7Xtv7btv7ftv7jtv7ntv7rtv7vtv7ztv73tv77tv78KKworUHJpdmF0ZSBVc2UgQXJlYSAoVStFMDAwLVUrRjhGRik6CisKK+6AgO6Age6Agu6Ag+6AhO6Ahe6Ahu6Ah+6AiO6Aie6Aiu6Ai+6AjO6Aje6Aju6Aj+6AkO6Ake6Aku6Ak+6AlO6Ale6Alu6Al+6AmO6Ame6Amu6Am+6AnO6Ane6Anu6An+6AoO6Aoe6Aou6Ao+6ApO6Ape6Apu6Ap+6AqO6Aqe6Aqu6Aq+6ArO6Are6Aru6Ar+6AsO6Ase6Asu6As+6AtO6Ate6Atu6At+6AuO6Aue6Auu6Au+6AvO6Ave6Avu6Avwor7oGA7oGB7oGC7oGD7oGE7oGF7oGG7oGH7oGI7oGJ7oGK7oGL7oGM7oGN7oGO7oGP7oGQ7oGR7oGS7oGT7oGU7oGV7oGW7oGX7oGY7oGZ7oGa7oGb7oGc7oGd7oGe7oGf7oGg7oGh7oGi7oGj7oGk7oGl7oGm7oGn7oGo7oGp7oGq7oGr7oGs7oGt7oGu7oGv7oGw7oGx7oGy7oGz7oG07oG17oG27oG37oG47oG57oG67oG77oG87oG97oG+7oG/CivugoDugoHugoLugoPugoTugoXugobugofugojugonugorugovugozugo3ugo7ugo/ugpDugpHugpLugpPugpTugpXugpbugpfugpjugpnugprugpvugpzugp3ugp7ugp/ugqDugqHugqLugqPugqTugqXugqbugqfugqjugqnugqrugqvugqzugq3ugq7ugq/ugrDugrHugrLugrPugrTugrXugrbugrfugrjugrnugrrugrvugrzugr3ugr7ugr8KK+6DgO6Dge6Dgu6Dg+6DhO6Dhe6Dhu6Dh+6DiO6Die6Diu6Di+6DjO6Dje6Dju6Dj+6DkO6Dke6Dku6Dk+6DlO6Dle6Dlu6Dl+6DmO6Dme6Dmu6Dm+6DnO6Dne6Dnu6Dn+6DoO6Doe6Dou6Do+6DpO6Dpe6Dpu6Dp+6DqO6Dqe6Dqu6Dq+6DrO6Dre6Dru6Dr+6DsO6Dse6Dsu6Ds+6DtO6Dte6Dtu6Dt+6DuO6Due6Duu6Du+6DvO6Dve6Dvu6Dvwor7oSA7oSB7oSC7oSD7oSE7oSF7oSG7oSH7oSI7oSJ7oSK7oSL7oSM7oSN7oSO7oSP7oSQ7oSR7oSS7oST7oSU7oSV7oSW7oSX7oSY7oSZ7oSa7oSb7oSc7oSd7oSe7oSf7oSg7oSh7oSi7oSj7oSk7oSl7oSm7oSn7oSo7oSp7oSq7oSr7oSs7oSt7oSu7oSv7oSw7oSx7oSy7oSz7oS07oS17oS27oS37oS47oS57oS67oS77oS87oS97oS+7oS/CivuhYDuhYHuhYLuhYPuhYTuhYXuhYbuhYfuhYjuhYnuhYruhYvuhYzuhY3uhY7uhY/uhZDuhZHuhZLuhZPuhZTuhZXuhZbuhZfuhZjuhZnuhZruhZvuhZzuhZ3uhZ7uhZ/uhaDuhaHuhaLuhaPuhaTuhaXuhabuhafuhajuhanuharuhavuhazuha3uha7uha/uhbDuhbHuhbLuhbPuhbTuhbXuhbbuhbfuhbjuhbnuhbruhbvuhbzuhb3uhb7uhb8KK+6GgO6Gge6Ggu6Gg+6GhO6Ghe6Ghu6Gh+6GiO6Gie6Giu6Gi+6GjO6Gje6Gju6Gj+6GkO6Gke6Gku6Gk+6GlO6Gle6Glu6Gl+6GmO6Gme6Gmu6Gm+6GnO6Gne6Gnu6Gn+6GoO6Goe6Gou6Go+6GpO6Gpe6Gpu6Gp+6GqO6Gqe6Gqu6Gq+6GrO6Gre6Gru6Gr+6GsO6Gse6Gsu6Gs+6GtO6Gte6Gtu6Gt+6GuO6Gue6Guu6Gu+6GvO6Gve6Gvu6Gvwor7oeA7oeB7oeC7oeD7oeE7oeF7oeG7oeH7oeI7oeJ7oeK7oeL7oeM7oeN7oeO7oeP7oeQ7oeR7oeS7oeT7oeU7oeV7oeW7oeX7oeY7oeZ7oea7oeb7oec7oed7oee7oef7oeg7oeh7oei7oej7oek7oel7oem7oen7oeo7oep7oeq7oer7oes7oet7oeu7oev7oew7oex7oey7oez7oe07oe17oe27oe37oe47oe57oe67oe77oe87oe97oe+7oe/CivuiIDuiIHuiILuiIPuiITuiIXuiIbuiIfuiIjuiInuiIruiIvuiIzuiI3uiI7uiI/uiJDuiJHuiJLuiJPuiJTuiJXuiJbuiJfuiJjuiJnuiJruiJvuiJzuiJ3uiJ7uiJ/uiKDuiKHuiKLuiKPuiKTuiKXuiKbuiKfuiKjuiKnuiKruiKvuiKzuiK3uiK7uiK/uiLDuiLHuiLLuiLPuiLTuiLXuiLbuiLfuiLjuiLnuiLruiLvuiLzuiL3uiL7uiL8KK+6JgO6Jge6Jgu6Jg+6JhO6Jhe6Jhu6Jh+6JiO6Jie6Jiu6Ji+6JjO6Jje6Jju6Jj+6JkO6Jke6Jku6Jk+6JlO6Jle6Jlu6Jl+6JmO6Jme6Jmu6Jm+6JnO6Jne6Jnu6Jn+6JoO6Joe6Jou6Jo+6JpO6Jpe6Jpu6Jp+6JqO6Jqe6Jqu6Jq+6JrO6Jre6Jru6Jr+6JsO6Jse6Jsu6Js+6JtO6Jte6Jtu6Jt+6JuO6Jue6Juu6Ju+6JvO6Jve6Jvu6Jvwor7oqA7oqB7oqC7oqD7oqE7oqF7oqG7oqH7oqI7oqJ7oqK7oqL7oqM7oqN7oqO7oqP7oqQ7oqR7oqS7oqT7oqU7oqV7oqW7oqX7oqY7oqZ7oqa7oqb7oqc7oqd7oqe7oqf7oqg7oqh7oqi7oqj7oqk7oql7oqm7oqn7oqo7oqp7oqq7oqr7oqs7oqt7oqu7oqv7oqw7oqx7oqy7oqz7oq07oq17oq27oq37oq47oq57oq67oq77oq87oq97oq+7oq/Civui4Dui4Hui4Lui4Pui4Tui4Xui4bui4fui4jui4nui4rui4vui4zui43ui47ui4/ui5Dui5Hui5Lui5Pui5Tui5Xui5bui5fui5jui5nui5rui5vui5zui53ui57ui5/ui6Dui6Hui6Lui6Pui6Tui6Xui6bui6fui6jui6nui6rui6vui6zui63ui67ui6/ui7Dui7Hui7Lui7Pui7Tui7Xui7bui7fui7jui7nui7rui7vui7zui73ui77ui78KK+6MgO6Mge6Mgu6Mg+6MhO6Mhe6Mhu6Mh+6MiO6Mie6Miu6Mi+6MjO6Mje6Mju6Mj+6MkO6Mke6Mku6Mk+6MlO6Mle6Mlu6Ml+6MmO6Mme6Mmu6Mm+6MnO6Mne6Mnu6Mn+6MoO6Moe6Mou6Mo+6MpO6Mpe6Mpu6Mp+6MqO6Mqe6Mqu6Mq+6MrO6Mre6Mru6Mr+6MsO6Mse6Msu6Ms+6MtO6Mte6Mtu6Mt+6MuO6Mue6Muu6Mu+6MvO6Mve6Mvu6Mvwor7o2A7o2B7o2C7o2D7o2E7o2F7o2G7o2H7o2I7o2J7o2K7o2L7o2M7o2N7o2O7o2P7o2Q7o2R7o2S7o2T7o2U7o2V7o2W7o2X7o2Y7o2Z7o2a7o2b7o2c7o2d7o2e7o2f7o2g7o2h7o2i7o2j7o2k7o2l7o2m7o2n7o2o7o2p7o2q7o2r7o2s7o2t7o2u7o2v7o2w7o2x7o2y7o2z7o207o217o227o237o247o257o267o277o287o297o2+7o2/CivujoDujoHujoLujoPujoTujoXujobujofujojujonujorujovujozujo3ujo7ujo/ujpDujpHujpLujpPujpTujpXujpbujpfujpjujpnujprujpvujpzujp3ujp7ujp/ujqDujqHujqLujqPujqTujqXujqbujqfujqjujqnujqrujqvujqzujq3ujq7ujq/ujrDujrHujrLujrPujrTujrXujrbujrfujrjujrnujrrujrvujrzujr3ujr7ujr8KK+6PgO6Pge6Pgu6Pg+6PhO6Phe6Phu6Ph+6PiO6Pie6Piu6Pi+6PjO6Pje6Pju6Pj+6PkO6Pke6Pku6Pk+6PlO6Ple6Plu6Pl+6PmO6Pme6Pmu6Pm+6PnO6Pne6Pnu6Pn+6PoO6Poe6Pou6Po+6PpO6Ppe6Ppu6Pp+6PqO6Pqe6Pqu6Pq+6PrO6Pre6Pru6Pr+6PsO6Pse6Psu6Ps+6PtO6Pte6Ptu6Pt+6PuO6Pue6Puu6Pu+6PvO6Pve6Pvu6Pvwor7pCA7pCB7pCC7pCD7pCE7pCF7pCG7pCH7pCI7pCJ7pCK7pCL7pCM7pCN7pCO7pCP7pCQ7pCR7pCS7pCT7pCU7pCV7pCW7pCX7pCY7pCZ7pCa7pCb7pCc7pCd7pCe7pCf7pCg7pCh7pCi7pCj7pCk7pCl7pCm7pCn7pCo7pCp7pCq7pCr7pCs7pCt7pCu7pCv7pCw7pCx7pCy7pCz7pC07pC17pC27pC37pC47pC57pC67pC77pC87pC97pC+7pC/CivukYDukYHukYLukYPukYTukYXukYbukYfukYjukYnukYrukYvukYzukY3ukY7ukY/ukZDukZHukZLukZPukZTukZXukZbukZfukZjukZnukZrukZvukZzukZ3ukZ7ukZ/ukaDukaHukaLukaPukaTukaXukabukafukajukanukarukavukazuka3uka7uka/ukbDukbHukbLukbPukbTukbXukbbukbfukbjukbnukbrukbvukbzukb3ukb7ukb8KK+6SgO6Sge6Sgu6Sg+6ShO6She6Shu6Sh+6SiO6Sie6Siu6Si+6SjO6Sje6Sju6Sj+6SkO6Ske6Sku6Sk+6SlO6Sle6Slu6Sl+6SmO6Sme6Smu6Sm+6SnO6Sne6Snu6Sn+6SoO6Soe6Sou6So+6SpO6Spe6Spu6Sp+6SqO6Sqe6Squ6Sq+6SrO6Sre6Sru6Sr+6SsO6Sse6Ssu6Ss+6StO6Ste6Stu6St+6SuO6Sue6Suu6Su+6SvO6Sve6Svu6Svwor7pOA7pOB7pOC7pOD7pOE7pOF7pOG7pOH7pOI7pOJ7pOK7pOL7pOM7pON7pOO7pOP7pOQ7pOR7pOS7pOT7pOU7pOV7pOW7pOX7pOY7pOZ7pOa7pOb7pOc7pOd7pOe7pOf7pOg7pOh7pOi7pOj7pOk7pOl7pOm7pOn7pOo7pOp7pOq7pOr7pOs7pOt7pOu7pOv7pOw7pOx7pOy7pOz7pO07pO17pO27pO37pO47pO57pO67pO77pO87pO97pO+7pO/CivulIDulIHulILulIPulITulIXulIbulIfulIjulInulIrulIvulIzulI3ulI7ulI/ulJDulJHulJLulJPulJTulJXulJbulJfulJjulJnulJrulJvulJzulJ3ulJ7ulJ/ulKDulKHulKLulKPulKTulKXulKbulKfulKjulKnulKrulKvulKzulK3ulK7ulK/ulLDulLHulLLulLPulLTulLXulLbulLfulLjulLnulLrulLvulLzulL3ulL7ulL8KK+6VgO6Vge6Vgu6Vg+6VhO6Vhe6Vhu6Vh+6ViO6Vie6Viu6Vi+6VjO6Vje6Vju6Vj+6VkO6Vke6Vku6Vk+6VlO6Vle6Vlu6Vl+6VmO6Vme6Vmu6Vm+6VnO6Vne6Vnu6Vn+6VoO6Voe6Vou6Vo+6VpO6Vpe6Vpu6Vp+6VqO6Vqe6Vqu6Vq+6VrO6Vre6Vru6Vr+6VsO6Vse6Vsu6Vs+6VtO6Vte6Vtu6Vt+6VuO6Vue6Vuu6Vu+6VvO6Vve6Vvu6Vvwor7paA7paB7paC7paD7paE7paF7paG7paH7paI7paJ7paK7paL7paM7paN7paO7paP7paQ7paR7paS7paT7paU7paV7paW7paX7paY7paZ7paa7pab7pac7pad7pae7paf7pag7pah7pai7paj7pak7pal7pam7pan7pao7pap7paq7par7pas7pat7pau7pav7paw7pax7pay7paz7pa07pa17pa27pa37pa47pa57pa67pa77pa87pa97pa+7pa/Civul4Dul4Hul4Lul4Pul4Tul4Xul4bul4ful4jul4nul4rul4vul4zul43ul47ul4/ul5Dul5Hul5Lul5Pul5Tul5Xul5bul5ful5jul5nul5rul5vul5zul53ul57ul5/ul6Dul6Hul6Lul6Pul6Tul6Xul6bul6ful6jul6nul6rul6vul6zul63ul67ul6/ul7Dul7Hul7Lul7Pul7Tul7Xul7bul7ful7jul7nul7rul7vul7zul73ul77ul78KK+6YgO6Yge6Ygu6Yg+6YhO6Yhe6Yhu6Yh+6YiO6Yie6Yiu6Yi+6YjO6Yje6Yju6Yj+6YkO6Yke6Yku6Yk+6YlO6Yle6Ylu6Yl+6YmO6Yme6Ymu6Ym+6YnO6Yne6Ynu6Yn+6YoO6Yoe6You6Yo+6YpO6Ype6Ypu6Yp+6YqO6Yqe6Yqu6Yq+6YrO6Yre6Yru6Yr+6YsO6Yse6Ysu6Ys+6YtO6Yte6Ytu6Yt+6YuO6Yue6Yuu6Yu+6YvO6Yve6Yvu6Yvwor7pmA7pmB7pmC7pmD7pmE7pmF7pmG7pmH7pmI7pmJ7pmK7pmL7pmM7pmN7pmO7pmP7pmQ7pmR7pmS7pmT7pmU7pmV7pmW7pmX7pmY7pmZ7pma7pmb7pmc7pmd7pme7pmf7pmg7pmh7pmi7pmj7pmk7pml7pmm7pmn7pmo7pmp7pmq7pmr7pms7pmt7pmu7pmv7pmw7pmx7pmy7pmz7pm07pm17pm27pm37pm47pm57pm67pm77pm87pm97pm+7pm/CivumoDumoHumoLumoPumoTumoXumobumofumojumonumorumovumozumo3umo7umo/umpDumpHumpLumpPumpTumpXumpbumpfumpjumpnumprumpvumpzump3ump7ump/umqDumqHumqLumqPumqTumqXumqbumqfumqjumqnumqrumqvumqzumq3umq7umq/umrDumrHumrLumrPumrTumrXumrbumrfumrjumrnumrrumrvumrzumr3umr7umr8KK+6bgO6bge6bgu6bg+6bhO6bhe6bhu6bh+6biO6bie6biu6bi+6bjO6bje6bju6bj+6bkO6bke6bku6bk+6blO6ble6blu6bl+6bmO6bme6bmu6bm+6bnO6bne6bnu6bn+6boO6boe6bou6bo+6bpO6bpe6bpu6bp+6bqO6bqe6bqu6bq+6brO6bre6bru6br+6bsO6bse6bsu6bs+6btO6bte6btu6bt+6buO6bue6buu6bu+6bvO6bve6bvu6bvwor7pyA7pyB7pyC7pyD7pyE7pyF7pyG7pyH7pyI7pyJ7pyK7pyL7pyM7pyN7pyO7pyP7pyQ7pyR7pyS7pyT7pyU7pyV7pyW7pyX7pyY7pyZ7pya7pyb7pyc7pyd7pye7pyf7pyg7pyh7pyi7pyj7pyk7pyl7pym7pyn7pyo7pyp7pyq7pyr7pys7pyt7pyu7pyv7pyw7pyx7pyy7pyz7py07py17py27py37py47py57py67py77py87py97py+7py/CivunYDunYHunYLunYPunYTunYXunYbunYfunYjunYnunYrunYvunYzunY3unY7unY/unZDunZHunZLunZPunZTunZXunZbunZfunZjunZnunZrunZvunZzunZ3unZ7unZ/unaDunaHunaLunaPunaTunaXunabunafunajunanunarunavunazuna3una7una/unbDunbHunbLunbPunbTunbXunbbunbfunbjunbnunbrunbvunbzunb3unb7unb8KK+6egO6ege6egu6eg+6ehO6ehe6ehu6eh+6eiO6eie6eiu6ei+6ejO6eje6eju6ej+6ekO6eke6eku6ek+6elO6ele6elu6el+6emO6eme6emu6em+6enO6ene6enu6en+6eoO6eoe6eou6eo+6epO6epe6epu6ep+6eqO6eqe6equ6eq+6erO6ere6eru6er+6esO6ese6esu6es+6etO6ete6etu6et+6euO6eue6euu6eu+6evO6eve6evu6evwor7p+A7p+B7p+C7p+D7p+E7p+F7p+G7p+H7p+I7p+J7p+K7p+L7p+M7p+N7p+O7p+P7p+Q7p+R7p+S7p+T7p+U7p+V7p+W7p+X7p+Y7p+Z7p+a7p+b7p+c7p+d7p+e7p+f7p+g7p+h7p+i7p+j7p+k7p+l7p+m7p+n7p+o7p+p7p+q7p+r7p+s7p+t7p+u7p+v7p+w7p+x7p+y7p+z7p+07p+17p+27p+37p+47p+57p+67p+77p+87p+97p++7p+/CivuoIDuoIHuoILuoIPuoITuoIXuoIbuoIfuoIjuoInuoIruoIvuoIzuoI3uoI7uoI/uoJDuoJHuoJLuoJPuoJTuoJXuoJbuoJfuoJjuoJnuoJruoJvuoJzuoJ3uoJ7uoJ/uoKDuoKHuoKLuoKPuoKTuoKXuoKbuoKfuoKjuoKnuoKruoKvuoKzuoK3uoK7uoK/uoLDuoLHuoLLuoLPuoLTuoLXuoLbuoLfuoLjuoLnuoLruoLvuoLzuoL3uoL7uoL8KK+6hgO6hge6hgu6hg+6hhO6hhe6hhu6hh+6hiO6hie6hiu6hi+6hjO6hje6hju6hj+6hkO6hke6hku6hk+6hlO6hle6hlu6hl+6hmO6hme6hmu6hm+6hnO6hne6hnu6hn+6hoO6hoe6hou6ho+6hpO6hpe6hpu6hp+6hqO6hqe6hqu6hq+6hrO6hre6hru6hr+6hsO6hse6hsu6hs+6htO6hte6htu6ht+6huO6hue6huu6hu+6hvO6hve6hvu6hvwor7qKA7qKB7qKC7qKD7qKE7qKF7qKG7qKH7qKI7qKJ7qKK7qKL7qKM7qKN7qKO7qKP7qKQ7qKR7qKS7qKT7qKU7qKV7qKW7qKX7qKY7qKZ7qKa7qKb7qKc7qKd7qKe7qKf7qKg7qKh7qKi7qKj7qKk7qKl7qKm7qKn7qKo7qKp7qKq7qKr7qKs7qKt7qKu7qKv7qKw7qKx7qKy7qKz7qK07qK17qK27qK37qK47qK57qK67qK77qK87qK97qK+7qK/Civuo4Duo4Huo4Luo4Puo4Tuo4Xuo4buo4fuo4juo4nuo4ruo4vuo4zuo43uo47uo4/uo5Duo5Huo5Luo5Puo5Tuo5Xuo5buo5fuo5juo5nuo5ruo5vuo5zuo53uo57uo5/uo6Duo6Huo6Luo6Puo6Tuo6Xuo6buo6fuo6juo6nuo6ruo6vuo6zuo63uo67uo6/uo7Duo7Huo7Luo7Puo7Tuo7Xuo7buo7fuo7juo7nuo7ruo7vuo7zuo73uo77uo78KK+6kgO6kge6kgu6kg+6khO6khe6khu6kh+6kiO6kie6kiu6ki+6kjO6kje6kju6kj+6kkO6kke6kku6kk+6klO6kle6klu6kl+6kmO6kme6kmu6km+6knO6kne6knu6kn+6koO6koe6kou6ko+6kpO6kpe6kpu6kp+6kqO6kqe6kqu6kq+6krO6kre6kru6kr+6ksO6kse6ksu6ks+6ktO6kte6ktu6kt+6kuO6kue6kuu6ku+6kvO6kve6kvu6kvwor7qWA7qWB7qWC7qWD7qWE7qWF7qWG7qWH7qWI7qWJ7qWK7qWL7qWM7qWN7qWO7qWP7qWQ7qWR7qWS7qWT7qWU7qWV7qWW7qWX7qWY7qWZ7qWa7qWb7qWc7qWd7qWe7qWf7qWg7qWh7qWi7qWj7qWk7qWl7qWm7qWn7qWo7qWp7qWq7qWr7qWs7qWt7qWu7qWv7qWw7qWx7qWy7qWz7qW07qW17qW27qW37qW47qW57qW67qW77qW87qW97qW+7qW/CivupoDupoHupoLupoPupoTupoXupobupofupojuponuporupovupozupo3upo7upo/uppDuppHuppLuppPuppTuppXuppbuppfuppjuppnuppruppvuppzupp3upp7upp/upqDupqHupqLupqPupqTupqXupqbupqfupqjupqnupqrupqvupqzupq3upq7upq/uprDuprHuprLuprPuprTuprXuprbuprfuprjuprnuprruprvuprzupr3upr7upr8KK+6ngO6nge6ngu6ng+6nhO6nhe6nhu6nh+6niO6nie6niu6ni+6njO6nje6nju6nj+6nkO6nke6nku6nk+6nlO6nle6nlu6nl+6nmO6nme6nmu6nm+6nnO6nne6nnu6nn+6noO6noe6nou6no+6npO6npe6npu6np+6nqO6nqe6nqu6nq+6nrO6nre6nru6nr+6nsO6nse6nsu6ns+6ntO6nte6ntu6nt+6nuO6nue6nuu6nu+6nvO6nve6nvu6nvwor7qiA7qiB7qiC7qiD7qiE7qiF7qiG7qiH7qiI7qiJ7qiK7qiL7qiM7qiN7qiO7qiP7qiQ7qiR7qiS7qiT7qiU7qiV7qiW7qiX7qiY7qiZ7qia7qib7qic7qid7qie7qif7qig7qih7qii7qij7qik7qil7qim7qin7qio7qip7qiq7qir7qis7qit7qiu7qiv7qiw7qix7qiy7qiz7qi07qi17qi27qi37qi47qi57qi67qi77qi87qi97qi+7qi/CivuqYDuqYHuqYLuqYPuqYTuqYXuqYbuqYfuqYjuqYnuqYruqYvuqYzuqY3uqY7uqY/uqZDuqZHuqZLuqZPuqZTuqZXuqZbuqZfuqZjuqZnuqZruqZvuqZzuqZ3uqZ7uqZ/uqaDuqaHuqaLuqaPuqaTuqaXuqabuqafuqajuqanuqaruqavuqazuqa3uqa7uqa/uqbDuqbHuqbLuqbPuqbTuqbXuqbbuqbfuqbjuqbnuqbruqbvuqbzuqb3uqb7uqb8KK+6qgO6qge6qgu6qg+6qhO6qhe6qhu6qh+6qiO6qie6qiu6qi+6qjO6qje6qju6qj+6qkO6qke6qku6qk+6qlO6qle6qlu6ql+6qmO6qme6qmu6qm+6qnO6qne6qnu6qn+6qoO6qoe6qou6qo+6qpO6qpe6qpu6qp+6qqO6qqe6qqu6qq+6qrO6qre6qru6qr+6qsO6qse6qsu6qs+6qtO6qte6qtu6qt+6quO6que6quu6qu+6qvO6qve6qvu6qvwor7quA7quB7quC7quD7quE7quF7quG7quH7quI7quJ7quK7quL7quM7quN7quO7quP7quQ7quR7quS7quT7quU7quV7quW7quX7quY7quZ7qua7qub7quc7qud7que7quf7qug7quh7qui7quj7quk7qul7qum7qun7quo7qup7quq7qur7qus7qut7quu7quv7quw7qux7quy7quz7qu07qu17qu27qu37qu47qu57qu67qu77qu87qu97qu+7qu/CivurIDurIHurILurIPurITurIXurIburIfurIjurInurIrurIvurIzurI3urI7urI/urJDurJHurJLurJPurJTurJXurJburJfurJjurJnurJrurJvurJzurJ3urJ7urJ/urKDurKHurKLurKPurKTurKXurKburKfurKjurKnurKrurKvurKzurK3urK7urK/urLDurLHurLLurLPurLTurLXurLburLfurLjurLnurLrurLvurLzurL3urL7urL8KK+6tgO6tge6tgu6tg+6thO6the6thu6th+6tiO6tie6tiu6ti+6tjO6tje6tju6tj+6tkO6tke6tku6tk+6tlO6tle6tlu6tl+6tmO6tme6tmu6tm+6tnO6tne6tnu6tn+6toO6toe6tou6to+6tpO6tpe6tpu6tp+6tqO6tqe6tqu6tq+6trO6tre6tru6tr+6tsO6tse6tsu6ts+6ttO6tte6ttu6tt+6tuO6tue6tuu6tu+6tvO6tve6tvu6tvwor7q6A7q6B7q6C7q6D7q6E7q6F7q6G7q6H7q6I7q6J7q6K7q6L7q6M7q6N7q6O7q6P7q6Q7q6R7q6S7q6T7q6U7q6V7q6W7q6X7q6Y7q6Z7q6a7q6b7q6c7q6d7q6e7q6f7q6g7q6h7q6i7q6j7q6k7q6l7q6m7q6n7q6o7q6p7q6q7q6r7q6s7q6t7q6u7q6v7q6w7q6x7q6y7q6z7q607q617q627q637q647q657q667q677q687q697q6+7q6/Civur4Dur4Hur4Lur4Pur4Tur4Xur4bur4fur4jur4nur4rur4vur4zur43ur47ur4/ur5Dur5Hur5Lur5Pur5Tur5Xur5bur5fur5jur5nur5rur5vur5zur53ur57ur5/ur6Dur6Hur6Lur6Pur6Tur6Xur6bur6fur6jur6nur6rur6vur6zur63ur67ur6/ur7Dur7Hur7Lur7Pur7Tur7Xur7bur7fur7jur7nur7rur7vur7zur73ur77ur78KK+6wgO6wge6wgu6wg+6whO6whe6whu6wh+6wiO6wie6wiu6wi+6wjO6wje6wju6wj+6wkO6wke6wku6wk+6wlO6wle6wlu6wl+6wmO6wme6wmu6wm+6wnO6wne6wnu6wn+6woO6woe6wou6wo+6wpO6wpe6wpu6wp+6wqO6wqe6wqu6wq+6wrO6wre6wru6wr+6wsO6wse6wsu6ws+6wtO6wte6wtu6wt+6wuO6wue6wuu6wu+6wvO6wve6wvu6wvwor7rGA7rGB7rGC7rGD7rGE7rGF7rGG7rGH7rGI7rGJ7rGK7rGL7rGM7rGN7rGO7rGP7rGQ7rGR7rGS7rGT7rGU7rGV7rGW7rGX7rGY7rGZ7rGa7rGb7rGc7rGd7rGe7rGf7rGg7rGh7rGi7rGj7rGk7rGl7rGm7rGn7rGo7rGp7rGq7rGr7rGs7rGt7rGu7rGv7rGw7rGx7rGy7rGz7rG07rG17rG27rG37rG47rG57rG67rG77rG87rG97rG+7rG/CivusoDusoHusoLusoPusoTusoXusobusofusojusonusorusovusozuso3uso7uso/uspDuspHuspLuspPuspTuspXuspbuspfuspjuspnuspruspvuspzusp3usp7usp/usqDusqHusqLusqPusqTusqXusqbusqfusqjusqnusqrusqvusqzusq3usq7usq/usrDusrHusrLusrPusrTusrXusrbusrfusrjusrnusrrusrvusrzusr3usr7usr8KK+6zgO6zge6zgu6zg+6zhO6zhe6zhu6zh+6ziO6zie6ziu6zi+6zjO6zje6zju6zj+6zkO6zke6zku6zk+6zlO6zle6zlu6zl+6zmO6zme6zmu6zm+6znO6zne6znu6zn+6zoO6zoe6zou6zo+6zpO6zpe6zpu6zp+6zqO6zqe6zqu6zq+6zrO6zre6zru6zr+6zsO6zse6zsu6zs+6ztO6zte6ztu6zt+6zuO6zue6zuu6zu+6zvO6zve6zvu6zvwor7rSA7rSB7rSC7rSD7rSE7rSF7rSG7rSH7rSI7rSJ7rSK7rSL7rSM7rSN7rSO7rSP7rSQ7rSR7rSS7rST7rSU7rSV7rSW7rSX7rSY7rSZ7rSa7rSb7rSc7rSd7rSe7rSf7rSg7rSh7rSi7rSj7rSk7rSl7rSm7rSn7rSo7rSp7rSq7rSr7rSs7rSt7rSu7rSv7rSw7rSx7rSy7rSz7rS07rS17rS27rS37rS47rS57rS67rS77rS87rS97rS+7rS/CivutYDutYHutYLutYPutYTutYXutYbutYfutYjutYnutYrutYvutYzutY3utY7utY/utZDutZHutZLutZPutZTutZXutZbutZfutZjutZnutZrutZvutZzutZ3utZ7utZ/utaDutaHutaLutaPutaTutaXutabutafutajutanutarutavutazuta3uta7uta/utbDutbHutbLutbPutbTutbXutbbutbfutbjutbnutbrutbvutbzutb3utb7utb8KK+62gO62ge62gu62g+62hO62he62hu62h+62iO62ie62iu62i+62jO62je62ju62j+62kO62ke62ku62k+62lO62le62lu62l+62mO62me62mu62m+62nO62ne62nu62n+62oO62oe62ou62o+62pO62pe62pu62p+62qO62qe62qu62q+62rO62re62ru62r+62sO62se62su62s+62tO62te62tu62t+62uO62ue62uu62u+62vO62ve62vu62vwor7reA7reB7reC7reD7reE7reF7reG7reH7reI7reJ7reK7reL7reM7reN7reO7reP7reQ7reR7reS7reT7reU7reV7reW7reX7reY7reZ7rea7reb7rec7red7ree7ref7reg7reh7rei7rej7rek7rel7rem7ren7reo7rep7req7rer7res7ret7reu7rev7rew7rex7rey7rez7re07re17re27re37re47re57re67re77re87re97re+7re/CivuuIDuuIHuuILuuIPuuITuuIXuuIbuuIfuuIjuuInuuIruuIvuuIzuuI3uuI7uuI/uuJDuuJHuuJLuuJPuuJTuuJXuuJbuuJfuuJjuuJnuuJruuJvuuJzuuJ3uuJ7uuJ/uuKDuuKHuuKLuuKPuuKTuuKXuuKbuuKfuuKjuuKnuuKruuKvuuKzuuK3uuK7uuK/uuLDuuLHuuLLuuLPuuLTuuLXuuLbuuLfuuLjuuLnuuLruuLvuuLzuuL3uuL7uuL8KK+65gO65ge65gu65g+65hO65he65hu65h+65iO65ie65iu65i+65jO65je65ju65j+65kO65ke65ku65k+65lO65le65lu65l+65mO65me65mu65m+65nO65ne65nu65n+65oO65oe65ou65o+65pO65pe65pu65p+65qO65qe65qu65q+65rO65re65ru65r+65sO65se65su65s+65tO65te65tu65t+65uO65ue65uu65u+65vO65ve65vu65vwor7rqA7rqB7rqC7rqD7rqE7rqF7rqG7rqH7rqI7rqJ7rqK7rqL7rqM7rqN7rqO7rqP7rqQ7rqR7rqS7rqT7rqU7rqV7rqW7rqX7rqY7rqZ7rqa7rqb7rqc7rqd7rqe7rqf7rqg7rqh7rqi7rqj7rqk7rql7rqm7rqn7rqo7rqp7rqq7rqr7rqs7rqt7rqu7rqv7rqw7rqx7rqy7rqz7rq07rq17rq27rq37rq47rq57rq67rq77rq87rq97rq+7rq/Civuu4Duu4Huu4Luu4Puu4Tuu4Xuu4buu4fuu4juu4nuu4ruu4vuu4zuu43uu47uu4/uu5Duu5Huu5Luu5Puu5Tuu5Xuu5buu5fuu5juu5nuu5ruu5vuu5zuu53uu57uu5/uu6Duu6Huu6Luu6Puu6Tuu6Xuu6buu6fuu6juu6nuu6ruu6vuu6zuu63uu67uu6/uu7Duu7Huu7Luu7Puu7Tuu7Xuu7buu7fuu7juu7nuu7ruu7vuu7zuu73uu77uu78KK+68gO68ge68gu68g+68hO68he68hu68h+68iO68ie68iu68i+68jO68je68ju68j+68kO68ke68ku68k+68lO68le68lu68l+68mO68me68mu68m+68nO68ne68nu68n+68oO68oe68ou68o+68pO68pe68pu68p+68qO68qe68qu68q+68rO68re68ru68r+68sO68se68su68s+68tO68te68tu68t+68uO68ue68uu68u+68vO68ve68vu68vwor7r2A7r2B7r2C7r2D7r2E7r2F7r2G7r2H7r2I7r2J7r2K7r2L7r2M7r2N7r2O7r2P7r2Q7r2R7r2S7r2T7r2U7r2V7r2W7r2X7r2Y7r2Z7r2a7r2b7r2c7r2d7r2e7r2f7r2g7r2h7r2i7r2j7r2k7r2l7r2m7r2n7r2o7r2p7r2q7r2r7r2s7r2t7r2u7r2v7r2w7r2x7r2y7r2z7r207r217r227r237r247r257r267r277r287r297r2+7r2/CivuvoDuvoHuvoLuvoPuvoTuvoXuvobuvofuvojuvonuvoruvovuvozuvo3uvo7uvo/uvpDuvpHuvpLuvpPuvpTuvpXuvpbuvpfuvpjuvpnuvpruvpvuvpzuvp3uvp7uvp/uvqDuvqHuvqLuvqPuvqTuvqXuvqbuvqfuvqjuvqnuvqruvqvuvqzuvq3uvq7uvq/uvrDuvrHuvrLuvrPuvrTuvrXuvrbuvrfuvrjuvrnuvrruvrvuvrzuvr3uvr7uvr8KK+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/vwor74CA74CB74CC74CD74CE74CF74CG74CH74CI74CJ74CK74CL74CM74CN74CO74CP74CQ74CR74CS74CT74CU74CV74CW74CX74CY74CZ74Ca74Cb74Cc74Cd74Ce74Cf74Cg74Ch74Ci74Cj74Ck74Cl74Cm74Cn74Co74Cp74Cq74Cr74Cs74Ct74Cu74Cv74Cw74Cx74Cy74Cz74C074C174C274C374C474C574C674C774C874C974C+74C/CivvgYDvgYHvgYLvgYPvgYTvgYXvgYbvgYfvgYjvgYnvgYrvgYvvgYzvgY3vgY7vgY/vgZDvgZHvgZLvgZPvgZTvgZXvgZbvgZfvgZjvgZnvgZrvgZvvgZzvgZ3vgZ7vgZ/vgaDvgaHvgaLvgaPvgaTvgaXvgabvgafvgajvganvgarvgavvgazvga3vga7vga/vgbDvgbHvgbLvgbPvgbTvgbXvgbbvgbfvgbjvgbnvgbrvgbvvgbzvgb3vgb7vgb8KK++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+Cvwor74OA74OB74OC74OD74OE74OF74OG74OH74OI74OJ74OK74OL74OM74ON74OO74OP74OQ74OR74OS74OT74OU74OV74OW74OX74OY74OZ74Oa74Ob74Oc74Od74Oe74Of74Og74Oh74Oi74Oj74Ok74Ol74Om74On74Oo74Op74Oq74Or74Os74Ot74Ou74Ov74Ow74Ox74Oy74Oz74O074O174O274O374O474O574O674O774O874O974O+74O/CivvhIDvhIHvhILvhIPvhITvhIXvhIbvhIfvhIjvhInvhIrvhIvvhIzvhI3vhI7vhI/vhJDvhJHvhJLvhJPvhJTvhJXvhJbvhJfvhJjvhJnvhJrvhJvvhJzvhJ3vhJ7vhJ/vhKDvhKHvhKLvhKPvhKTvhKXvhKbvhKfvhKjvhKnvhKrvhKvvhKzvhK3vhK7vhK/vhLDvhLHvhLLvhLPvhLTvhLXvhLbvhLfvhLjvhLnvhLrvhLvvhLzvhL3vhL7vhL8KK++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+Fvwor74aA74aB74aC74aD74aE74aF74aG74aH74aI74aJ74aK74aL74aM74aN74aO74aP74aQ74aR74aS74aT74aU74aV74aW74aX74aY74aZ74aa74ab74ac74ad74ae74af74ag74ah74ai74aj74ak74al74am74an74ao74ap74aq74ar74as74at74au74av74aw74ax74ay74az74a074a174a274a374a474a574a674a774a874a974a+74a/Civvh4Dvh4Hvh4Lvh4Pvh4Tvh4Xvh4bvh4fvh4jvh4nvh4rvh4vvh4zvh43vh47vh4/vh5Dvh5Hvh5Lvh5Pvh5Tvh5Xvh5bvh5fvh5jvh5nvh5rvh5vvh5zvh53vh57vh5/vh6Dvh6Hvh6Lvh6Pvh6Tvh6Xvh6bvh6fvh6jvh6nvh6rvh6vvh6zvh63vh67vh6/vh7Dvh7Hvh7Lvh7Pvh7Tvh7Xvh7bvh7fvh7jvh7nvh7rvh7vvh7zvh73vh77vh78KK++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+Ivwor74mA74mB74mC74mD74mE74mF74mG74mH74mI74mJ74mK74mL74mM74mN74mO74mP74mQ74mR74mS74mT74mU74mV74mW74mX74mY74mZ74ma74mb74mc74md74me74mf74mg74mh74mi74mj74mk74ml74mm74mn74mo74mp74mq74mr74ms74mt74mu74mv74mw74mx74my74mz74m074m174m274m374m474m574m674m774m874m974m+74m/CivvioDvioHvioLvioPvioTvioXviobviofviojvionviorviovviozvio3vio7vio/vipDvipHvipLvipPvipTvipXvipbvipfvipjvipnviprvipvvipzvip3vip7vip/viqDviqHviqLviqPviqTviqXviqbviqfviqjviqnviqrviqvviqzviq3viq7viq/virDvirHvirLvirPvirTvirXvirbvirfvirjvirnvirrvirvvirzvir3vir7vir8KK++LgO+Lge+Lgu+Lg++LhO+Lhe+Lhu+Lh++LiO+Lie+Liu+Li++LjO+Lje+Lju+Lj++LkO+Lke+Lku+Lk++LlO+Lle+Llu+Ll++LmO+Lme+Lmu+Lm++LnO+Lne+Lnu+Ln++LoO+Loe+Lou+Lo++LpO+Lpe+Lpu+Lp++LqO+Lqe+Lqu+Lq++LrO+Lre+Lru+Lr++LsO+Lse+Lsu+Ls++LtO+Lte+Ltu+Lt++LuO+Lue+Luu+Lu++LvO+Lve+Lvu+Lvwor74yA74yB74yC74yD74yE74yF74yG74yH74yI74yJ74yK74yL74yM74yN74yO74yP74yQ74yR74yS74yT74yU74yV74yW74yX74yY74yZ74ya74yb74yc74yd74ye74yf74yg74yh74yi74yj74yk74yl74ym74yn74yo74yp74yq74yr74ys74yt74yu74yv74yw74yx74yy74yz74y074y174y274y374y474y574y674y774y874y974y+74y/CivvjYDvjYHvjYLvjYPvjYTvjYXvjYbvjYfvjYjvjYnvjYrvjYvvjYzvjY3vjY7vjY/vjZDvjZHvjZLvjZPvjZTvjZXvjZbvjZfvjZjvjZnvjZrvjZvvjZzvjZ3vjZ7vjZ/vjaDvjaHvjaLvjaPvjaTvjaXvjabvjafvjajvjanvjarvjavvjazvja3vja7vja/vjbDvjbHvjbLvjbPvjbTvjbXvjbbvjbfvjbjvjbnvjbrvjbvvjbzvjb3vjb7vjb8KK++OgO+Oge+Ogu+Og++OhO+Ohe+Ohu+Oh++OiO+Oie+Oiu+Oi++OjO+Oje+Oju+Oj++OkO+Oke+Oku+Ok++OlO+Ole+Olu+Ol++OmO+Ome+Omu+Om++OnO+One+Onu+On++OoO+Ooe+Oou+Oo++OpO+Ope+Opu+Op++OqO+Oqe+Oqu+Oq++OrO+Ore+Oru+Or++OsO+Ose+Osu+Os++OtO+Ote+Otu+Ot++OuO+Oue+Ouu+Ou++OvO+Ove+Ovu+Ovwor74+A74+B74+C74+D74+E74+F74+G74+H74+I74+J74+K74+L74+M74+N74+O74+P74+Q74+R74+S74+T74+U74+V74+W74+X74+Y74+Z74+a74+b74+c74+d74+e74+f74+g74+h74+i74+j74+k74+l74+m74+n74+o74+p74+q74+r74+s74+t74+u74+v74+w74+x74+y74+z74+074+174+274+374+474+574+674+774+874+974++74+/CivvkIDvkIHvkILvkIPvkITvkIXvkIbvkIfvkIjvkInvkIrvkIvvkIzvkI3vkI7vkI/vkJDvkJHvkJLvkJPvkJTvkJXvkJbvkJfvkJjvkJnvkJrvkJvvkJzvkJ3vkJ7vkJ/vkKDvkKHvkKLvkKPvkKTvkKXvkKbvkKfvkKjvkKnvkKrvkKvvkKzvkK3vkK7vkK/vkLDvkLHvkLLvkLPvkLTvkLXvkLbvkLfvkLjvkLnvkLrvkLvvkLzvkL3vkL7vkL8KK++RgO+Rge+Rgu+Rg++RhO+Rhe+Rhu+Rh++RiO+Rie+Riu+Ri++RjO+Rje+Rju+Rj++RkO+Rke+Rku+Rk++RlO+Rle+Rlu+Rl++RmO+Rme+Rmu+Rm++RnO+Rne+Rnu+Rn++RoO+Roe+Rou+Ro++RpO+Rpe+Rpu+Rp++RqO+Rqe+Rqu+Rq++RrO+Rre+Rru+Rr++RsO+Rse+Rsu+Rs++RtO+Rte+Rtu+Rt++RuO+Rue+Ruu+Ru++RvO+Rve+Rvu+Rvwor75KA75KB75KC75KD75KE75KF75KG75KH75KI75KJ75KK75KL75KM75KN75KO75KP75KQ75KR75KS75KT75KU75KV75KW75KX75KY75KZ75Ka75Kb75Kc75Kd75Ke75Kf75Kg75Kh75Ki75Kj75Kk75Kl75Km75Kn75Ko75Kp75Kq75Kr75Ks75Kt75Ku75Kv75Kw75Kx75Ky75Kz75K075K175K275K375K475K575K675K775K875K975K+75K/Civvk4Dvk4Hvk4Lvk4Pvk4Tvk4Xvk4bvk4fvk4jvk4nvk4rvk4vvk4zvk43vk47vk4/vk5Dvk5Hvk5Lvk5Pvk5Tvk5Xvk5bvk5fvk5jvk5nvk5rvk5vvk5zvk53vk57vk5/vk6Dvk6Hvk6Lvk6Pvk6Tvk6Xvk6bvk6fvk6jvk6nvk6rvk6vvk6zvk63vk67vk6/vk7Dvk7Hvk7Lvk7Pvk7Tvk7Xvk7bvk7fvk7jvk7nvk7rvk7vvk7zvk73vk77vk78KK++UgO+Uge+Ugu+Ug++UhO+Uhe+Uhu+Uh++UiO+Uie+Uiu+Ui++UjO+Uje+Uju+Uj++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+Uvwor75WA75WB75WC75WD75WE75WF75WG75WH75WI75WJ75WK75WL75WM75WN75WO75WP75WQ75WR75WS75WT75WU75WV75WW75WX75WY75WZ75Wa75Wb75Wc75Wd75We75Wf75Wg75Wh75Wi75Wj75Wk75Wl75Wm75Wn75Wo75Wp75Wq75Wr75Ws75Wt75Wu75Wv75Ww75Wx75Wy75Wz75W075W175W275W375W475W575W675W775W875W975W+75W/CivvloDvloHvloLvloPvloTvloXvlobvlofvlojvlonvlorvlovvlozvlo3vlo7vlo/vlpDvlpHvlpLvlpPvlpTvlpXvlpbvlpfvlpjvlpnvlprvlpvvlpzvlp3vlp7vlp/vlqDvlqHvlqLvlqPvlqTvlqXvlqbvlqfvlqjvlqnvlqrvlqvvlqzvlq3vlq7vlq/vlrDvlrHvlrLvlrPvlrTvlrXvlrbvlrfvlrjvlrnvlrrvlrvvlrzvlr3vlr7vlr8KK++XgO+Xge+Xgu+Xg++XhO+Xhe+Xhu+Xh++XiO+Xie+Xiu+Xi++XjO+Xje+Xju+Xj++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+Xvwor75iA75iB75iC75iD75iE75iF75iG75iH75iI75iJ75iK75iL75iM75iN75iO75iP75iQ75iR75iS75iT75iU75iV75iW75iX75iY75iZ75ia75ib75ic75id75ie75if75ig75ih75ii75ij75ik75il75im75in75io75ip75iq75ir75is75it75iu75iv75iw75ix75iy75iz75i075i175i275i375i475i575i675i775i875i975i+75i/CivvmYDvmYHvmYLvmYPvmYTvmYXvmYbvmYfvmYjvmYnvmYrvmYvvmYzvmY3vmY7vmY/vmZDvmZHvmZLvmZPvmZTvmZXvmZbvmZfvmZjvmZnvmZrvmZvvmZzvmZ3vmZ7vmZ/vmaDvmaHvmaLvmaPvmaTvmaXvmabvmafvmajvmanvmarvmavvmazvma3vma7vma/vmbDvmbHvmbLvmbPvmbTvmbXvmbbvmbfvmbjvmbnvmbrvmbvvmbzvmb3vmb7vmb8KK++agO+age+agu+ag++ahO+ahe+ahu+ah++aiO+aie+aiu+ai++ajO+aje+aju+aj++akO+ake+aku+ak++alO+ale+alu+al++amO+ame+amu+am++anO+ane+anu+an++aoO+aoe+aou+ao++apO+ape+apu+ap++aqO+aqe+aqu+aq++arO+are+aru+ar++asO+ase+asu+as++atO+ate+atu+at++auO+aue+auu+au++avO+ave+avu+avwor75uA75uB75uC75uD75uE75uF75uG75uH75uI75uJ75uK75uL75uM75uN75uO75uP75uQ75uR75uS75uT75uU75uV75uW75uX75uY75uZ75ua75ub75uc75ud75ue75uf75ug75uh75ui75uj75uk75ul75um75un75uo75up75uq75ur75us75ut75uu75uv75uw75ux75uy75uz75u075u175u275u375u475u575u675u775u875u975u+75u/CivvnIDvnIHvnILvnIPvnITvnIXvnIbvnIfvnIjvnInvnIrvnIvvnIzvnI3vnI7vnI/vnJDvnJHvnJLvnJPvnJTvnJXvnJbvnJfvnJjvnJnvnJrvnJvvnJzvnJ3vnJ7vnJ/vnKDvnKHvnKLvnKPvnKTvnKXvnKbvnKfvnKjvnKnvnKrvnKvvnKzvnK3vnK7vnK/vnLDvnLHvnLLvnLPvnLTvnLXvnLbvnLfvnLjvnLnvnLrvnLvvnLzvnL3vnL7vnL8KK++dgO+dge+dgu+dg++dhO+dhe+dhu+dh++diO+die+diu+di++djO+dje+dju+dj++dkO+dke+dku+dk++dlO+dle+dlu+dl++dmO+dme+dmu+dm++dnO+dne+dnu+dn++doO+doe+dou+do++dpO+dpe+dpu+dp++dqO+dqe+dqu+dq++drO+dre+dru+dr++dsO+dse+dsu+ds++dtO+dte+dtu+dt++duO+due+duu+du++dvO+dve+dvu+dvwor756A756B756C756D756E756F756G756H756I756J756K756L756M756N756O756P756Q756R756S756T756U756V756W756X756Y756Z756a756b756c756d756e756f756g756h756i756j756k756l756m756n756o756p756q756r756s756t756u756v756w756x756y756z7560756175627563756475657566756775687569756+756/Civvn4Dvn4Hvn4Lvn4Pvn4Tvn4Xvn4bvn4fvn4jvn4nvn4rvn4vvn4zvn43vn47vn4/vn5Dvn5Hvn5Lvn5Pvn5Tvn5Xvn5bvn5fvn5jvn5nvn5rvn5vvn5zvn53vn57vn5/vn6Dvn6Hvn6Lvn6Pvn6Tvn6Xvn6bvn6fvn6jvn6nvn6rvn6vvn6zvn63vn67vn6/vn7Dvn7Hvn7Lvn7Pvn7Tvn7Xvn7bvn7fvn7jvn7nvn7rvn7vvn7zvn73vn77vn78KK++ggO+gge+ggu+gg++ghO+ghe+ghu+gh++giO+gie+giu+gi++gjO+gje+gju+gj++gkO+gke+gku+gk++glO+gle+glu+gl++gmO+gme+gmu+gm++gnO+gne+gnu+gn++goO+goe+gou+go++gpO+gpe+gpu+gp++gqO+gqe+gqu+gq++grO+gre+gru+gr++gsO+gse+gsu+gs++gtO+gte+gtu+gt++guO+gue+guu+gu++gvO+gve+gvu+gvwor76GA76GB76GC76GD76GE76GF76GG76GH76GI76GJ76GK76GL76GM76GN76GO76GP76GQ76GR76GS76GT76GU76GV76GW76GX76GY76GZ76Ga76Gb76Gc76Gd76Ge76Gf76Gg76Gh76Gi76Gj76Gk76Gl76Gm76Gn76Go76Gp76Gq76Gr76Gs76Gt76Gu76Gv76Gw76Gx76Gy76Gz76G076G176G276G376G476G576G676G776G876G976G+76G/CivvooDvooHvooLvooPvooTvooXvoobvoofvoojvoonvoorvoovvoozvoo3voo7voo/vopDvopHvopLvopPvopTvopXvopbvopfvopjvopnvoprvopvvopzvop3vop7vop/voqDvoqHvoqLvoqPvoqTvoqXvoqbvoqfvoqjvoqnvoqrvoqvvoqzvoq3voq7voq/vorDvorHvorLvorPvorTvorXvorbvorfvorjvornvorrvorvvorzvor3vor7vor8KK++jgO+jge+jgu+jg++jhO+jhe+jhu+jh++jiO+jie+jiu+ji++jjO+jje+jju+jj++jkO+jke+jku+jk++jlO+jle+jlu+jl++jmO+jme+jmu+jm++jnO+jne+jnu+jn++joO+joe+jou+jo++jpO+jpe+jpu+jp++jqO+jqe+jqu+jq++jrO+jre+jru+jr++jsO+jse+jsu+js++jtO+jte+jtu+jt++juO+jue+juu+ju++jvO+jve+jvu+jvworCitDSksgQ29tcGF0aWJpbGl0eSBJZGVvZ3JhcGhzIChVK0Y5MDAtVStGQUZGKToKKwor76SA76SB76SC76SD76SE76SF76SG76SH76SI76SJ76SK76SL76SM76SN76SO76SP76SQ76SR76SS76ST76SU76SV76SW76SX76SY76SZ76Sa76Sb76Sc76Sd76Se76SfCivvpKDvpKHvpKLvpKPvpKTvpKXvpKbvpKfvpKjvpKnvpKrvpKvvpKzvpK3vpK7vpK/vpLDvpLHvpLLvpLPvpLTvpLXvpLbvpLfvpLjvpLnvpLrvpLvvpLzvpL3vpL7vpL8KK++lgO+lge+lgu+lg++lhO+lhe+lhu+lh++liO+lie+liu+li++ljO+lje+lju+lj++lkO+lke+lku+lk++llO+lle+llu+ll++lmO+lme+lmu+lm++lnO+lne+lnu+lnwor76Wg76Wh76Wi76Wj76Wk76Wl76Wm76Wn76Wo76Wp76Wq76Wr76Ws76Wt76Wu76Wv76Ww76Wx76Wy76Wz76W076W176W276W376W476W576W676W776W876W976W+76W/CivvpoDvpoHvpoLvpoPvpoTvpoXvpobvpofvpojvponvporvpovvpozvpo3vpo7vpo/vppDvppHvppLvppPvppTvppXvppbvppfvppjvppnvpprvppvvppzvpp3vpp7vpp8KK++moO+moe+mou+mo++mpO+mpe+mpu+mp++mqO+mqe+mqu+mq++mrO+mre+mru+mr++msO+mse+msu+ms++mtO+mte+mtu+mt++muO+mue+muu+mu++mvO+mve+mvu+mvwor76eA76eB76eC76eD76eE76eF76eG76eH76eI76eJ76eK76eL76eM76eN76eO76eP76eQ76eR76eS76eT76eU76eV76eW76eX76eY76eZ76ea76eb76ec76ed76ee76efCivvp6Dvp6Hvp6Lvp6Pvp6Tvp6Xvp6bvp6fvp6jvp6nvp6rvp6vvp6zvp63vp67vp6/vp7Dvp7Hvp7Lvp7Pvp7Tvp7Xvp7bvp7fvp7jvp7nvp7rvp7vvp7zvp73vp77vp78KK++ogO+oge+ogu+og++ohO+ohe+ohu+oh++oiO+oie+oiu+oi++ojO+oje+oju+oj++okO+oke+oku+ok++olO+ole+olu+ol++omO+ome+omu+om++onO+one+onu+onwor76ig76ih76ii76ij76ik76il76im76in76io76ip76iq76ir76is76it76iu76iv76iw76ix76iy76iz76i076i176i276i376i476i576i676i776i876i976i+76i/CivvqYDvqYHvqYLvqYPvqYTvqYXvqYbvqYfvqYjvqYnvqYrvqYvvqYzvqY3vqY7vqY/vqZDvqZHvqZLvqZPvqZTvqZXvqZbvqZfvqZjvqZnvqZrvqZvvqZzvqZ3vqZ7vqZ8KK++poO+poe+pou+po++ppO+ppe+ppu+pp++pqO+pqe+pqu+pq++prO+pre+pru+pr++psO+pse+psu+ps++ptO+pte+ptu+pt++puO+pue+puu+pu++pvO+pve+pvu+pvwor76qA76qB76qC76qD76qE76qF76qG76qH76qI76qJ76qK76qL76qM76qN76qO76qP76qQ76qR76qS76qT76qU76qV76qW76qX76qY76qZ76qa76qb76qc76qd76qe76qfCivvqqDvqqHvqqLvqqPvqqTvqqXvqqbvqqfvqqjvqqnvqqrvqqvvqqzvqq3vqq7vqq/vqrDvqrHvqrLvqrPvqrTvqrXvqrbvqrfvqrjvqrnvqrrvqrvvqrzvqr3vqr7vqr8KK++rgO+rge+rgu+rg++rhO+rhe+rhu+rh++riO+rie+riu+ri++rjO+rje+rju+rj++rkO+rke+rku+rk++rlO+rle+rlu+rl++rmO+rme+rmu+rm++rnO+rne+rnu+rnwor76ug76uh76ui76uj76uk76ul76um76un76uo76up76uq76ur76us76ut76uu76uv76uw76ux76uy76uz76u076u176u276u376u476u576u676u776u876u976u+76u/CisKK0FscGhhYmV0aWMgUHJlc2VudGF0aW9uIEZvcm1zIChVK0ZCMDAtVStGQjRGKToKKwor76yA76yB76yC76yD76yE76yF76yG76yH76yI76yJ76yK76yL76yM76yN76yO76yP76yQ76yR76yS76yT76yU76yV76yW76yX76yY76yZ76ya76yb76yc76yd4peM76ye76yf76yg76yh76yi76yj76yk76yl76ym76yn76yo76yp76yq76yr76ys76yt76yu76yv76yw76yx76yy76yz76y076y176y276y376y476y576y676y776y876y976y+76y/CivvrYDvrYHvrYLvrYPvrYTvrYXvrYbvrYfvrYjvrYnvrYrvrYvvrYzvrY3vrY7vrY8KKworQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1BIChVK0ZCNTAtVStGREZGKToKKwor762Q762R762S762T762U762V762W762X762Y762Z762a762b762c762d762e762f762g762h762i762j762k762l762m762n762o762p762q762r762s762t762u762v762w762x762y762z7620762176227623762476257626762776287629762+762/766A766B766C766D766E766F766G766H766I766J766K766L766M766N766O766PCivvrpDvrpHvrpLvrpPvrpTvrpXvrpbvrpfvrpjvrpnvrprvrpvvrpzvrp3vrp7vrp/vrqDvrqHvrqLvrqPvrqTvrqXvrqbvrqfvrqjvrqnvrqrvrqvvrqzvrq3vrq7vrq/vrrDvrrHvrrLvrrPvrrTvrrXvrrbvrrfvrrjvrrnvrrrvrrvvrrzvrr3vrr7vrr/vr4Dvr4Hvr4Lvr4Pvr4Tvr4Xvr4bvr4fvr4jvr4nvr4rvr4vvr4zvr43vr47vr48KK++vkO+vke+vku+vk++vlO+vle+vlu+vl++vmO+vme+vmu+vm++vnO+vne+vnu+vn++voO+voe+vou+vo++vpO+vpe+vpu+vp++vqO+vqe+vqu+vq++vrO+vre+vru+vr++vsO+vse+vsu+vs++vtO+vte+vtu+vt++vuO+vue+vuu+vu++vvO+vve+vvu+vv++wgO+wge+wgu+wg++whO+whe+whu+wh++wiO+wie+wiu+wi++wjO+wje+wju+wjwor77CQ77CR77CS77CT77CU77CV77CW77CX77CY77CZ77Ca77Cb77Cc77Cd77Ce77Cf77Cg77Ch77Ci77Cj77Ck77Cl77Cm77Cn77Co77Cp77Cq77Cr77Cs77Ct77Cu77Cv77Cw77Cx77Cy77Cz77C077C177C277C377C477C577C677C777C877C977C+77C/77GA77GB77GC77GD77GE77GF77GG77GH77GI77GJ77GK77GL77GM77GN77GO77GPCivvsZDvsZHvsZLvsZPvsZTvsZXvsZbvsZfvsZjvsZnvsZrvsZvvsZzvsZ3vsZ7vsZ/vsaDvsaHvsaLvsaPvsaTvsaXvsabvsafvsajvsanvsarvsavvsazvsa3vsa7vsa/vsbDvsbHvsbLvsbPvsbTvsbXvsbbvsbfvsbjvsbnvsbrvsbvvsbzvsb3vsb7vsb/vsoDvsoHvsoLvsoPvsoTvsoXvsobvsofvsojvsonvsorvsovvsozvso3vso7vso8KK++ykO+yke+yku+yk++ylO+yle+ylu+yl++ymO+yme+ymu+ym++ynO+yne+ynu+yn++yoO+yoe+you+yo++ypO+ype+ypu+yp++yqO+yqe+yqu+yq++yrO+yre+yru+yr++ysO+yse+ysu+ys++ytO+yte+ytu+yt++yuO+yue+yuu+yu++yvO+yve+yvu+yv++zgO+zge+zgu+zg++zhO+zhe+zhu+zh++ziO+zie+ziu+zi++zjO+zje+zju+zjwor77OQ77OR77OS77OT77OU77OV77OW77OX77OY77OZ77Oa77Ob77Oc77Od77Oe77Of77Og77Oh77Oi77Oj77Ok77Ol77Om77On77Oo77Op77Oq77Or77Os77Ot77Ou77Ov77Ow77Ox77Oy77Oz77O077O177O277O377O477O577O677O777O877O977O+77O/77SA77SB77SC77SD77SE77SF77SG77SH77SI77SJ77SK77SL77SM77SN77SO77SPCivvtJDvtJHvtJLvtJPvtJTvtJXvtJbvtJfvtJjvtJnvtJrvtJvvtJzvtJ3vtJ7vtJ/vtKDvtKHvtKLvtKPvtKTvtKXvtKbvtKfvtKjvtKnvtKrvtKvvtKzvtK3vtK7vtK/vtLDvtLHvtLLvtLPvtLTvtLXvtLbvtLfvtLjvtLnvtLrvtLvvtLzvtL3vtL7vtL/vtYDvtYHvtYLvtYPvtYTvtYXvtYbvtYfvtYjvtYnvtYrvtYvvtYzvtY3vtY7vtY8KK++1kO+1ke+1ku+1k++1lO+1le+1lu+1l++1mO+1me+1mu+1m++1nO+1ne+1nu+1n++1oO+1oe+1ou+1o++1pO+1pe+1pu+1p++1qO+1qe+1qu+1q++1rO+1re+1ru+1r++1sO+1se+1su+1s++1tO+1te+1tu+1t++1uO+1ue+1uu+1u++1vO+1ve+1vu+1v++2gO+2ge+2gu+2g++2hO+2he+2hu+2h++2iO+2ie+2iu+2i++2jO+2je+2ju+2jwor77aQ77aR77aS77aT77aU77aV77aW77aX77aY77aZ77aa77ab77ac77ad77ae77af77ag77ah77ai77aj77ak77al77am77an77ao77ap77aq77ar77as77at77au77av77aw77ax77ay77az77a077a177a277a377a477a577a677a777a877a977a+77a/77eA77eB77eC77eD77eE77eF77eG77eH77eI77eJ77eK77eL77eM77eN77eO77ePCivvt5Dvt5Hvt5Lvt5Pvt5Tvt5Xvt5bvt5fvt5jvt5nvt5rvt5vvt5zvt53vt57vt5/vt6Dvt6Hvt6Lvt6Pvt6Tvt6Xvt6bvt6fvt6jvt6nvt6rvt6vvt6zvt63vt67vt6/vt7Dvt7Hvt7Lvt7Pvt7Tvt7Xvt7bvt7fvt7jvt7nvt7rvt7vvt7zvt73vt77vt78KKworVmFyaWF0aW9uIFNlbGVjdG9ycyAoVStGRTAwLVUrRkUwRik6CisKK+KXjO+4gOKXjO+4geKXjO+4guKXjO+4g+KXjO+4hOKXjO+4heKXjO+4huKXjO+4h+KXjO+4iOKXjO+4ieKXjO+4iuKXjO+4i+KXjO+4jOKXjO+4jeKXjO+4juKXjO+4jworCitGcmVlIGJsb2NrIChVK0ZFMTAtVStGRTFGKToKKwor77iQ77iR77iS77iT77iU77iV77iW77iX77iY77iZ77ia77ib77ic77id77ie77ifCisKK0NvbWJpbmluZyBIYWxmIE1hcmtzIChVK0ZFMjAtVStGRTJGKToKKwor4peM77ig4peM77ih4peM77ii4peM77ij77ik77il77im77in77io77ip77iq77ir77is77it77iu77ivCisKK0NKSyBDb21wYXRpYmlsaXR5IEZvcm1zIChVK0ZFMzAtVStGRTRGKToKKwor77iw77ix77iy77iz77i077i177i277i377i477i577i677i777i877i977i+77i/77mA77mB77mC77mD77mE77mF77mG77mH77mI77mJ77mK77mL77mM77mN77mO77mPCisKK1NtYWxsIEZvcm0gVmFyaWFudHMgKFUrRkU1MC1VK0ZFNkYpOgorCivvuZDvuZHvuZLvuZPvuZTvuZXvuZbvuZfvuZjvuZnvuZrvuZvvuZzvuZ3vuZ7vuZ/vuaDvuaHvuaLvuaPvuaTvuaXvuabvuafvuajvuanvuarvuavvuazvua3vua7vua8KKworQXJhYmljIFByZXNlbnRhdGlvbiBGb3Jtcy1CIChVK0ZFNzAtVStGRUZGKToKKwor77mw77mx77my77mz77m077m177m277m377m477m577m677m777m877m977m+77m/77qA77qB77qC77qD77qE77qF77qG77qH77qI77qJ77qK77qL77qM77qN77qO77qP77qQ77qR77qS77qT77qU77qV77qW77qX77qY77qZ77qa77qb77qc77qd77qe77qf77qg77qh77qi77qj77qk77ql77qm77qn77qo77qp77qq77qr77qs77qt77qu77qvCivvurDvurHvurLvurPvurTvurXvurbvurfvurjvurnvurrvurvvurzvur3vur7vur/vu4Dvu4Hvu4Lvu4Pvu4Tvu4Xvu4bvu4fvu4jvu4nvu4rvu4vvu4zvu43vu47vu4/vu5Dvu5Hvu5Lvu5Pvu5Tvu5Xvu5bvu5fvu5jvu5nvu5rvu5vvu5zvu53vu57vu5/vu6Dvu6Hvu6Lvu6Pvu6Tvu6Xvu6bvu6fvu6jvu6nvu6rvu6vvu6zvu63vu67vu68KK++7sO+7se+7su+7s++7tO+7te+7tu+7t++7uO+7ue+7uu+7u++7vO+7ve+7vu+7vworCitIYWxmd2lkdGggYW5kIEZ1bGx3aWR0aCBGb3JtcyAoVStGRjAwLVUrRkZFRik6CisKK++8gO+8ge+8gu+8g++8hO+8he+8hu+8h++8iO+8ie+8iu+8i++8jO+8je+8ju+8j++8kO+8ke+8ku+8k++8lO+8le+8lu+8l++8mO+8me+8mu+8m++8nO+8ne+8nu+8nwor77yg77yh77yi77yj77yk77yl77ym77yn77yo77yp77yq77yr77ys77yt77yu77yv77yw77yx77yy77yz77y077y177y277y377y477y577y677y777y877y977y+77y/CivvvYDvvYHvvYLvvYPvvYTvvYXvvYbvvYfvvYjvvYnvvYrvvYvvvYzvvY3vvY7vvY/vvZDvvZHvvZLvvZPvvZTvvZXvvZbvvZfvvZjvvZnvvZrvvZvvvZzvvZ3vvZ7vvZ8KK++9oO+9oe+9ou+9o++9pO+9pe+9pu+9p++9qO+9qe+9qu+9q++9rO+9re+9ru+9r++9sO+9se+9su+9s++9tO+9te+9tu+9t++9uO+9ue+9uu+9u++9vO+9ve+9vu+9v+++gO++ge++gu++g+++hO++he++hu++h+++iO++ie++iu++i+++jO++je++ju++j+++kO++ke++ku++k+++lO++le++lu++l+++mO++me++mu++m+++nO++ne++ngor776f776g776h776i776j776k776l776m776n776o776p776q776r776s776t776u776v776w776x776y776z7760776177627763776477657766776777687769776+776/77+A77+B77+C77+D77+E77+F77+G77+H77+I77+J77+K77+L77+M77+N77+O77+P77+Q77+R77+S77+T77+U77+V77+W77+X77+Y77+Z77+a77+b77+c77+d77+eCivvv5/vv6Dvv6Hvv6Lvv6Pvv6Tvv6Xvv6bvv6fvv6jvv6nvv6rvv6vvv6zvv63vv67vv68KKworU3BlY2lhbHMgKFUrRkZGMC1VK0ZGRkYpOgorCivvv7Dvv7Hvv7Lvv7Pvv7Tvv7Xvv7bvv7fvv7jvv7nvv7rvv7vvv7zvv73vv77vv78KZGlmZiAtLWdpdCBhL2RvY3MvdW5pdC10ZXN0cy50eHQgYi9kb2NzL3VuaXQtdGVzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYjUyMjAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3VuaXQtdGVzdHMudHh0CkBAIC0wLDAgKzEsNTAgQEAKK0J1c3lib3ggdW5pdCB0ZXN0IGZyYW1ld29yaworPT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHdoYXQgeW91IG5lZWQgdG8gZG8gdG8gd3JpdGUgdGVzdCBjYXNlcyB1c2luZyB0aGUKK0J1c3lib3ggdW5pdCB0ZXN0IGZyYW1ld29yay4KKworCitCdWlsZGluZyB1bml0IHRlc3RzCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBmcmFtZXdvcmsgYW5kIGFsbCB0ZXN0cyBhcmUgYnVpbHQgYXMgYSByZWd1bGFyIEJ1c3lib3ggYXBwbGV0IGlmIG9wdGlvbgorQ09ORklHX1VOSVRfVEVTVCAoZm91bmQgaW4gR2VuZXJhbCBDb25maWd1cmF0aW9uIC0+IERlYnVnZ2luZyBPcHRpb25zKSBpcyBzZXQuCisKKworV3JpdGluZyB0ZXN0IGNhc2VzCistLS0tLS0tLS0tLS0tLS0tLS0KKworVW5pdCB0ZXN0aW5nIGludGVyZmFjZSBjYW4gYmUgZm91bmQgaW4gaW5jbHVkZS9iYnVuaXQuaC4KKworVGVzdHMgY2FuIGJlIHBsYWNlZCBpbiBhbnkgLmMgZmlsZSBpbiBCdXN5Ym94IHRyZWUgLSBwcmVmZXJhYmx5IHJpZ2h0IG5leHQgdG8KK3RoZSBmdW5jdGlvbnMgdGhleSB0ZXN0LiBUZXN0IGNhc2VzIHNob3VsZCBiZSBlbmNsb3NlZCB3aXRoaW4gYW4gI2lmLCBhbmQKK3Nob3VsZCBzdGFydCB3aXRoIEJCVU5JVF9ERUZJTkVfVEVTVCBtYWNybyBhbmQgZW5kIHdpdGggQkJVTklUX0VORFRFU1Qgd2l0aGluCit0aGUgdGVzdCBjdXJseSBicmFja2V0cy4gSWYgYW4gYXNzZXJ0aW9uIGZhaWxzIHRoZSB0ZXN0IGVuZHMgaW1tZWRpYXRlbHksIGllLgordGhlIGZvbGxvd2luZyBhc3NlcnRpb25zIHdpbGwgbm90IGJlIHJlYWNoZWQuIEFueSBjb2RlIHBsYWNlZCBhZnRlcgorQkJVTklUX0VORFRFU1QgaXMgZXhlY3V0ZWQgcmVnYXJkbGVzcyBvZiB0aGUgdGVzdCByZXN1bHQuIEhlcmUncyBhbiBleGFtcGxlOgorCisjaWYgRU5BQkxFX1VOSVRfVEVTVAorCitCQlVOSVRfREVGSU5FX1RFU1QodGVzdF9uYW1lKQoreworCWludCAqaTsKKworCWkgPSBtYWxsb2Moc2l6ZW9mKGludCkpOworCUJCVU5JVF9BU1NFUlRfTk9UTlVMTChpKTsKKwkqaSA9IDI7CisJQkJVTklUX0FTU0VSVF9FUSgoKmkpKigqaSksIDQpOworCisJQkJVTklUX0VORFRFU1Q7CisKKwlmcmVlKGkpOworfQorCisjZW5kaWYgLyogRU5BQkxFX1VOSVRfVEVTVCAqLworCisKK1J1bm5pbmcgdGhlIHVuaXQgdGVzdCBzdWl0ZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIHJ1biB0aGUgdGVzdHMgeW91IGNhbiBlaXRoZXIgZGlyZWN0bHkgcnVuICdidXN5Ym94IHVuaXQnIG9yIHVzZSAnbWFrZSB0ZXN0JwordG8gcnVuIGJvdGggdGhlIHVuaXQgdGVzdHMgKGlmIGNvbXBpbGVkKSBhbmQgcmVndWxhciB0ZXN0IHN1aXRlLgpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL0NvbmZpZy5zcmMgYi9lMmZzcHJvZ3MvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDNlMWUxCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL0NvbmZpZy5zcmMKQEAgLTAsMCArMSw3MSBAQAorIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiTGludXggRXh0MiBGUyBQcm9ncyIKKworSU5TRVJUCisKK2NvbmZpZyBDSEFUVFIKKwlib29sICJjaGF0dHIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgY2hhdHRyIGNoYW5nZXMgdGhlIGZpbGUgYXR0cmlidXRlcyBvbiBhIHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbS4KKworIyMjIGNvbmZpZyBFMkZTQ0sKKyMjIwlib29sICJlMmZzY2siCisjIyMJZGVmYXVsdCB5CisjIyMJaGVscAorIyMjCSAgZTJmc2NrIGlzIHVzZWQgdG8gY2hlY2sgTGludXggc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtcyAoZXh0MmZzKS4KKyMjIwkgIGUyZnNjayBhbHNvIHN1cHBvcnRzIGV4dDIgZmlsZXN5c3RlbXMgY291bnRhaW5pbmcgYSBqb3VybmFsIChleHQzKS4KKyMjIwkgIFRoZSBub3JtYWwgY29tcGF0IHN5bWxpbmtzICdmc2NrLmV4dDInIGFuZCAnZnNjay5leHQzJyBhcmUgYWxzbworIyMjCSAgcHJvdmlkZWQuCisKK2NvbmZpZyBGU0NLCisJYm9vbCAiZnNjayIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBmc2NrIGlzIHVzZWQgdG8gY2hlY2sgYW5kIG9wdGlvbmFsbHkgcmVwYWlyIG9uZSBvciBtb3JlIGZpbGVzeXN0ZW1zLgorCSAgSW4gYWN0dWFsaXR5LCBmc2NrIGlzIHNpbXBseSBhIGZyb250LWVuZCBmb3IgdGhlIHZhcmlvdXMgZmlsZSBzeXN0ZW0KKwkgIGNoZWNrZXJzIChmc2NrLmZzdHlwZSkgYXZhaWxhYmxlIHVuZGVyIExpbnV4LgorCitjb25maWcgTFNBVFRSCisJYm9vbCAibHNhdHRyIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIGxzYXR0ciBsaXN0cyB0aGUgZmlsZSBhdHRyaWJ1dGVzIG9uIGEgc2Vjb25kIGV4dGVuZGVkIGZpbGUgc3lzdGVtLgorCisjIyMgY29uZmlnIE1LRTJGUworIyMjCWJvb2wgIm1rZTJmcyIKKyMjIwlkZWZhdWx0IHkKKyMjIwloZWxwCisjIyMJICBta2UyZnMgaXMgdXNlZCB0byBjcmVhdGUgYW4gZXh0Mi9leHQzIGZpbGVzeXN0ZW0uIFRoZSBub3JtYWwgY29tcGF0CisjIyMJICBzeW1saW5rcyAnbWtmcy5leHQyJyBhbmQgJ21rZnMuZXh0MycgYXJlIGFsc28gcHJvdmlkZWQuCisKK2NvbmZpZyBUVU5FMkZTCisJYm9vbCAidHVuZTJmcyIKKwlkZWZhdWx0IG4gICMgb2ZmOiBpdCBpcyB0b28gbGltaXRlZCBjb21wYXJlZCB0byB1cHN0cmVhbSB2ZXJzaW9uCisJaGVscAorCSAgdHVuZTJmcyBhbGxvd3MgdGhlIHN5c3RlbSBhZG1pbmlzdHJhdG9yIHRvIGFkanVzdCB2YXJpb3VzIHR1bmFibGUKKwkgIGZpbGVzeXN0ZW0gcGFyYW1ldGVycyBvbiBMaW51eCBleHQyL2V4dDMgZmlsZXN5c3RlbXMuCisKKyMjIyBjb25maWcgRTJMQUJFTAorIyMjCWJvb2wgImUybGFiZWwiCisjIyMJZGVmYXVsdCB5CisjIyMJZGVwZW5kcyBvbiBUVU5FMkZTCisjIyMJaGVscAorIyMjCSAgZTJsYWJlbCB3aWxsIGRpc3BsYXkgb3IgY2hhbmdlIHRoZSBmaWxlc3lzdGVtIGxhYmVsIG9uIHRoZSBleHQyCisjIyMJICBmaWxlc3lzdGVtIGxvY2F0ZWQgb24gZGV2aWNlLgorCisjIyMgTkI6IHRoaXMgb25lIGlzIG5vdyBwcm92aWRlZCBieSB1dGlsLWxpbnV4L3ZvbHVtZV9pZC8qCisjIyMgY29uZmlnIEZJTkRGUworIyMjCWJvb2wgImZpbmRmcyIKKyMjIwlkZWZhdWx0IHkKKyMjIwlkZXBlbmRzIG9uIFRVTkUyRlMKKyMjIwloZWxwCisjIyMJICBmaW5kZnMgd2lsbCBzZWFyY2ggdGhlIGRpc2tzIGluIHRoZSBzeXN0ZW0gbG9va2luZyBmb3IgYSBmaWxlc3lzdGVtCisjIyMJICB3aGljaCBoYXMgYSBsYWJlbCBtYXRjaGluZyBsYWJlbCBvciBhIFVVSUQgZXF1YWwgdG8gdXVpZC4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL0tidWlsZC5zcmMgYi9lMmZzcHJvZ3MvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2ExNGMzCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL0tidWlsZC5zcmMKQEAgLTAsMCArMSwxNSBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15Oj0KKworSU5TRVJUCisKK2xpYi0kKENPTkZJR19DSEFUVFIpICs9IGNoYXR0ci5vIGUyZnNfbGliLm8KK2xpYi0kKENPTkZJR19MU0FUVFIpICs9IGxzYXR0ci5vIGUyZnNfbGliLm8KKworbGliLSQoQ09ORklHX0ZTQ0spICAgICs9IGZzY2subworbGliLSQoQ09ORklHX1RVTkUyRlMpICs9IHR1bmUyZnMubwpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL1JFQURNRSBiL2UyZnNwcm9ncy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIxNThlNQotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9SRUFETUUKQEAgLTAsMCArMSwxMiBAQAorQXV0aG9ycyBhbmQgY29udHJpYnV0b3JzIG9mIG9yaWdpbmFsIGUyZnNwcm9nczoKKworUmVteSBDYXJkIDxjYXJkQG1hc2kuaWJwLmZyPgorVGhlb2RvcmUgVHMnbyA8dHl0c29AbWl0LmVkdT4KK1N0ZXBoZW4gQy4gVHdlZWRpZSA8c2N0QHJlZGhhdC5jb20+CitBbmRyZWFzIEdydWVuYmFjaGVyLCA8YS5ncnVlbmJhY2hlckBjb21wdXRlci5vcmc+CitLYXogS3lsaGVrdSA8a2F6QGFzaGkuZm9vdHByaW50cy5uZXQ+CitGLlcuIHRlbiBXb2xkZSA8ZnJhbmt5QGR1dGVjYS5ldC50dWRlbGZ0Lm5sPgorSmVyZW15IEZpdHpoYXJkaW5nZSA8amVyZW15QHppcC5jb20uYXU+CitNLkouRS4gTW9sIDxtYXJjZWxAZHV0ZWNhLmV0LnR1ZGVsZnQubmw+CitNaXF1ZWwgdmFuIFNtb29yZW5idXJnIDxtaXF1ZWxzQGRyaW5rZWwub3cub3JnPgorVXdlIE9oc2UgPHV3ZUB0aXJrYS5ndW4uZGU+CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MvY2hhdHRyLmMgYi9lMmZzcHJvZ3MvY2hhdHRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFjYzgzOAotLS0gL2Rldi9udWxsCisrKyBiL2UyZnNwcm9ncy9jaGF0dHIuYwpAQCAtMCwwICsxLDE5NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogY2hhdHRyLmMJCS0gQ2hhbmdlIGZpbGUgYXR0cmlidXRlcyBvbiBhbiBleHQyIGZpbGUgc3lzdGVtCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0ICBSZW15IENhcmQgPGNhcmRAbWFzaS5pYnAuZnI+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIExhYm9yYXRvaXJlIE1BU0ksIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqIFRoaXMgZmlsZSBjYW4gYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZQorICovCisKKy8qCisgKiBIaXN0b3J5OgorICogOTMvMTAvMzAJLSBDcmVhdGlvbgorICogOTMvMTEvMTMJLSBSZXBsYWNlIHN0YXQoKSBjYWxscyBieSBsc3RhdCgpIHRvIGF2b2lkIGxvb3BzCisgKiA5NC8wMi8yNwktIEludGVncmF0ZWQgaW4gVGVkJ3MgZGlzdHJpYnV0aW9uCisgKiA5OC8xMi8yOQktIElnbm9yZSBzeW1saW5rcyB3aGVuIHdvcmtpbmcgcmVjdXJzaXZlbHkgKEcgTSBTaXBlKQorICogOTgvMTIvMjkJLSBEaXNwbGF5IHZlcnNpb24gaW5mbyBvbmx5IHdoZW4gLVYgc3BlY2lmaWVkIChHIE0gU2lwZSkKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgY2hhdHRyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLVJdIFstKz1BYWNEZGlqc1N0VHVdIFstdiBWRVJTSU9OXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgY2hhdHRyX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ2hhbmdlIGZpbGUgYXR0cmlidXRlcyBvbiBhbiBleHQyIGZzXG4iCisvL3VzYWdlOiAgICAgIlxuTW9kaWZpZXJzOiIKKy8vdXNhZ2U6ICAgICAiXG4JLQlSZW1vdmUgYXR0cmlidXRlcyIKKy8vdXNhZ2U6ICAgICAiXG4JKwlBZGQgYXR0cmlidXRlcyIKKy8vdXNhZ2U6ICAgICAiXG4JPQlTZXQgYXR0cmlidXRlcyIKKy8vdXNhZ2U6ICAgICAiXG5BdHRyaWJ1dGVzOiIKKy8vdXNhZ2U6ICAgICAiXG4JQQlEb24ndCB0cmFjayBhdGltZSIKKy8vdXNhZ2U6ICAgICAiXG4JYQlBcHBlbmQgbW9kZSBvbmx5IgorLy91c2FnZTogICAgICJcbgljCUVuYWJsZSBjb21wcmVzcyIKKy8vdXNhZ2U6ICAgICAiXG4JRAlXcml0ZSBkaXIgY29udGVudHMgc3luY2hyb25vdXNseSIKKy8vdXNhZ2U6ICAgICAiXG4JZAlEb24ndCBiYWNrdXAgd2l0aCBkdW1wIgorLy91c2FnZTogICAgICJcbglpCUNhbm5vdCBiZSBtb2RpZmllZCAoaW1tdXRhYmxlKSIKKy8vdXNhZ2U6ICAgICAiXG4JaglXcml0ZSBhbGwgZGF0YSB0byBqb3VybmFsIGZpcnN0IgorLy91c2FnZTogICAgICJcbglzCVplcm8gZGlzayBzdG9yYWdlIHdoZW4gZGVsZXRlZCIKKy8vdXNhZ2U6ICAgICAiXG4JUwlXcml0ZSBmaWxlIGNvbnRlbnRzIHN5bmNocm9ub3VzbHkiCisvL3VzYWdlOiAgICAgIlxuCXQJRGlzYWJsZSB0YWlsLW1lcmdpbmcgb2YgcGFydGlhbCBibG9ja3Mgd2l0aCBvdGhlciBmaWxlcyIKKy8vdXNhZ2U6ICAgICAiXG4JdQlBbGxvdyBmaWxlIHRvIGJlIHVuZGVsZXRlZCIKKy8vdXNhZ2U6ICAgICAiXG4JLVIJUmVjdXJzZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJU2V0IHRoZSBmaWxlJ3MgdmVyc2lvbi9nZW5lcmF0aW9uIG51bWJlciIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiZTJmc19saWIuaCIKKworI2RlZmluZSBPUFRfQUREIDEKKyNkZWZpbmUgT1BUX1JFTSAyCisjZGVmaW5lIE9QVF9TRVQgNAorI2RlZmluZSBPUFRfU0VUX1ZFUiA4CisKK3N0cnVjdCBnbG9iYWxzIHsKKwl1bnNpZ25lZCBsb25nIHZlcnNpb247CisJdW5zaWduZWQgbG9uZyBhZjsKKwl1bnNpZ25lZCBsb25nIHJmOworCXNtYWxsaW50IGZsYWdzOworCXNtYWxsaW50IHJlY3Vyc2l2ZTsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9mbGFnKGNoYXIgYykKK3sKKwljb25zdCBjaGFyICpmcCA9IHN0cmNocihlMmF0dHJfZmxhZ3Nfc25hbWVfY2hhdHRyLCBjKTsKKwlpZiAoZnApCisJCXJldHVybiBlMmF0dHJfZmxhZ3NfdmFsdWVfY2hhdHRyW2ZwIC0gZTJhdHRyX2ZsYWdzX3NuYW1lX2NoYXR0cl07CisJYmJfc2hvd191c2FnZSgpOworfQorCitzdGF0aWMgaW50IGRlY29kZV9hcmcoY29uc3QgY2hhciAqYXJnLCBzdHJ1Y3QgZ2xvYmFscyAqZ3ApCit7CisJdW5zaWduZWQgbG9uZyAqZmw7CisJY2hhciBvcHQgPSAqYXJnKys7CisKKwlmbCA9ICZncC0+YWY7CisJaWYgKG9wdCA9PSAnLScpIHsKKwkJZ3AtPmZsYWdzIHw9IE9QVF9SRU07CisJCWZsID0gJmdwLT5yZjsKKwl9IGVsc2UgaWYgKG9wdCA9PSAnKycpIHsKKwkJZ3AtPmZsYWdzIHw9IE9QVF9BREQ7CisJfSBlbHNlIGlmIChvcHQgPT0gJz0nKSB7CisJCWdwLT5mbGFncyB8PSBPUFRfU0VUOworCX0gZWxzZQorCQlyZXR1cm4gMDsKKworCXdoaWxlICgqYXJnKQorCQkqZmwgfD0gZ2V0X2ZsYWcoKmFyZysrKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBjaGFuZ2VfYXR0cmlidXRlcyhjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZ2xvYmFscyAqZ3ApOworCitzdGF0aWMgaW50IEZBU1RfRlVOQyBjaGF0dHJfZGlyX3Byb2MoY29uc3QgY2hhciAqZGlyX25hbWUsIHN0cnVjdCBkaXJlbnQgKmRlLCB2b2lkICpncCkKK3sKKwljaGFyICpwYXRoID0gY29uY2F0X3N1YnBhdGhfZmlsZShkaXJfbmFtZSwgZGUtPmRfbmFtZSk7CisJLyogcGF0aCBpcyBOVUxMIGlmIGRlLT5kX25hbWUgaXMgIi4iIG9yICIuLiIsIGVsc2UuLi4gKi8KKwlpZiAocGF0aCkgeworCQljaGFuZ2VfYXR0cmlidXRlcyhwYXRoLCBncCk7CisJCWZyZWUocGF0aCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjaGFuZ2VfYXR0cmlidXRlcyhjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgZ2xvYmFscyAqZ3ApCit7CisJdW5zaWduZWQgbG9uZyBmc2ZsYWdzOworCXN0cnVjdCBzdGF0IHN0OworCisJaWYgKGxzdGF0KG5hbWUsICZzdCkgIT0gMCkgeworCQliYl9wZXJyb3JfbXNnKCJzdGF0ICVzIiwgbmFtZSk7CisJCXJldHVybjsKKwl9CisJaWYgKFNfSVNMTksoc3Quc3RfbW9kZSkgJiYgZ3AtPnJlY3Vyc2l2ZSkKKwkJcmV0dXJuOworCisJLyogRG9uJ3QgdHJ5IHRvIG9wZW4gZGV2aWNlIGZpbGVzLCBmaWZvcyBldGMuICBXZSBwcm9iYWJseQorCSAqIG91Z2h0IHRvIGRpc3BsYXkgYW4gZXJyb3IgaWYgdGhlIGZpbGUgd2FzIGV4cGxpY2l0bHkgZ2l2ZW4KKwkgKiBvbiB0aGUgY29tbWFuZCBsaW5lICh3aGV0aGVyIG9yIG5vdCByZWN1cnNpdmUgd2FzCisJICogcmVxdWVzdGVkKS4gICovCisJaWYgKCFTX0lTUkVHKHN0LnN0X21vZGUpICYmICFTX0lTTE5LKHN0LnN0X21vZGUpICYmICFTX0lTRElSKHN0LnN0X21vZGUpKQorCQlyZXR1cm47CisKKwlpZiAoZ3AtPmZsYWdzICYgT1BUX1NFVF9WRVIpCisJCWlmIChmc2V0dmVyc2lvbihuYW1lLCBncC0+dmVyc2lvbikgIT0gMCkKKwkJCWJiX3BlcnJvcl9tc2coInNldHRpbmcgdmVyc2lvbiBvbiAlcyIsIG5hbWUpOworCisJaWYgKGdwLT5mbGFncyAmIE9QVF9TRVQpIHsKKwkJZnNmbGFncyA9IGdwLT5hZjsKKwl9IGVsc2UgeworCQlpZiAoZmdldGZsYWdzKG5hbWUsICZmc2ZsYWdzKSAhPSAwKSB7CisJCQliYl9wZXJyb3JfbXNnKCJyZWFkaW5nIGZsYWdzIG9uICVzIiwgbmFtZSk7CisJCQlnb3RvIHNraXBfc2V0ZmxhZ3M7CisJCX0KKwkJLyppZiAoZ3AtPmZsYWdzICYgT1BUX1JFTSkgLSBub3QgbmVlZGVkLCByZiBpcyB6ZXJvIG90aGVyd2lzZSAqLworCQkJZnNmbGFncyAmPSB+Z3AtPnJmOworCQkvKmlmIChncC0+ZmxhZ3MgJiBPUFRfQUREKSAtIG5vdCBuZWVkZWQsIGFmIGlzIHplcm8gb3RoZXJ3aXNlICovCisJCQlmc2ZsYWdzIHw9IGdwLT5hZjsKKwkJLyogV2hhdCBpcyB0aGlzPyBBbmQgd2h5IGl0J3Mgbm90IGRvbmUgZm9yIFNFVCBjYXNlPyAqLworCQlpZiAoIVNfSVNESVIoc3Quc3RfbW9kZSkpCisJCQlmc2ZsYWdzICY9IH5FWFQyX0RJUlNZTkNfRkw7CisJfQorCWlmIChmc2V0ZmxhZ3MobmFtZSwgZnNmbGFncykgIT0gMCkKKwkJYmJfcGVycm9yX21zZygic2V0dGluZyBmbGFncyBvbiAlcyIsIG5hbWUpOworCisgc2tpcF9zZXRmbGFnczoKKwlpZiAoZ3AtPnJlY3Vyc2l2ZSAmJiBTX0lTRElSKHN0LnN0X21vZGUpKQorCQlpdGVyYXRlX29uX2RpcihuYW1lLCBjaGF0dHJfZGlyX3Byb2MsIGdwKTsKK30KKworaW50IGNoYXR0cl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY2hhdHRyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgZ2xvYmFscyBnOworCWNoYXIgKmFyZzsKKworCW1lbXNldCgmZywgMCwgc2l6ZW9mKGcpKTsKKworCS8qIHBhcnNlIHRoZSBhcmdzICovCisJd2hpbGUgKChhcmcgPSAqKythcmd2KSkgeworCQkvKiB0YWtlIGNhcmUgb2YgLVIgYW5kIC12IDx2ZXJzaW9uPiAqLworCQlpZiAoYXJnWzBdID09ICctJworCQkgJiYgKGFyZ1sxXSA9PSAnUicgfHwgYXJnWzFdID09ICd2JykKKwkJICYmICFhcmdbMl0KKwkJKSB7CisJCQlpZiAoYXJnWzFdID09ICdSJykgeworCQkJCWcucmVjdXJzaXZlID0gMTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIGFyZ1sxXSA9PSAndicgKi8KKwkJCWlmICghKisrYXJndikKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCQlnLnZlcnNpb24gPSB4YXRvdWwoKmFyZ3YpOworCQkJZy5mbGFncyB8PSBPUFRfU0VUX1ZFUjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFkZWNvZGVfYXJnKGFyZywgJmcpKQorCQkJYnJlYWs7CisJfQorCisJLyogcnVuIHNhbml0eSBjaGVja3Mgb24gYWxsIHRoZSBhcmd1bWVudHMgZ2l2ZW4gdXMgKi8KKwlpZiAoISphcmd2KQorCQliYl9zaG93X3VzYWdlKCk7CisJaWYgKChnLmZsYWdzICYgT1BUX1NFVCkgJiYgKGcuZmxhZ3MgJiAoT1BUX0FERHxPUFRfUkVNKSkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCI9IGlzIGluY29tcGF0aWJsZSB3aXRoIC0gYW5kICsiKTsKKwlpZiAoZy5yZiAmIGcuYWYpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzZXQgYW5kIHVuc2V0IGEgZmxhZyIpOworCWlmICghZy5mbGFncykKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm11c3QgdXNlICctdicsID0sIC0gb3IgKyIpOworCisJLyogbm93IHJ1biBjaGF0dHIgb24gYWxsIHRoZSBmaWxlcyBwYXNzZWQgdG8gdXMgKi8KKwlkbyBjaGFuZ2VfYXR0cmlidXRlcygqYXJndiwgJmcpOyB3aGlsZSAoKisrYXJndik7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvZTJmc3Byb2dzL2UyZnNfbGliLmMgYi9lMmZzcHJvZ3MvZTJmc19saWIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmFlYzk0Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL2UyZnNfbGliLmMKQEAgLTAsMCArMSwyMTMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFNlZSBSRUFETUUgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImUyZnNfbGliLmgiCisKKyNkZWZpbmUgSEFWRV9FWFQyX0lPQ1RMUyAxCisKKyNpZiBJTlRfTUFYID09IExPTkdfTUFYCisjZGVmaW5lIElGX0xPTkdfSVNfU0FNRSguLi4pIF9fVkFfQVJHU19fCisjZGVmaW5lIElGX0xPTkdfSVNfV0lERVIoLi4uKQorI2Vsc2UKKyNkZWZpbmUgSUZfTE9OR19JU19TQU1FKC4uLikKKyNkZWZpbmUgSUZfTE9OR19JU19XSURFUiguLi4pIF9fVkFfQVJHU19fCisjZW5kaWYKKworc3RhdGljIHZvaWQgY2xvc2Vfc2lsZW50bHkoaW50IGZkKQoreworCWludCBlID0gZXJybm87CisJY2xvc2UoZmQpOworCWVycm5vID0gZTsKK30KKworCisvKiBJdGVyYXRlIGEgZnVuY3Rpb24gb24gZWFjaCBlbnRyeSBvZiBhIGRpcmVjdG9yeSAqLworaW50IGl0ZXJhdGVfb25fZGlyKGNvbnN0IGNoYXIgKmRpcl9uYW1lLAorCQlpbnQgRkFTVF9GVU5DICgqZnVuYykoY29uc3QgY2hhciAqLCBzdHJ1Y3QgZGlyZW50ICosIHZvaWQgKiksCisJCXZvaWQgKnByaXZhdGUpCit7CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqZGU7CisKKwlkaXIgPSBvcGVuZGlyKGRpcl9uYW1lKTsKKwlpZiAoZGlyID09IE5VTEwpIHsKKwkJcmV0dXJuIC0xOworCX0KKwl3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCWZ1bmMoZGlyX25hbWUsIGRlLCBwcml2YXRlKTsKKwl9CisJY2xvc2VkaXIoZGlyKTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBHZXQvc2V0IGEgZmlsZSB2ZXJzaW9uIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0gKi8KK2ludCBmZ2V0c2V0dmVyc2lvbihjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nICpnZXRfdmVyc2lvbiwgdW5zaWduZWQgbG9uZyBzZXRfdmVyc2lvbikKK3sKKyNpZiBIQVZFX0VYVDJfSU9DVExTCisJaW50IGZkLCByOworCUlGX0xPTkdfSVNfV0lERVIoaW50IHZlcjspCisKKwlmZCA9IG9wZW4obmFtZSwgT19SRE9OTFkgfCBPX05PTkJMT0NLKTsKKwlpZiAoZmQgPT0gLTEpCisJCXJldHVybiAtMTsKKwlpZiAoIWdldF92ZXJzaW9uKSB7CisJCUlGX0xPTkdfSVNfV0lERVIoCisJCQl2ZXIgPSAoaW50KSBzZXRfdmVyc2lvbjsKKwkJCXIgPSBpb2N0bChmZCwgRVhUMl9JT0NfU0VUVkVSU0lPTiwgJnZlcik7CisJCSkKKwkJSUZfTE9OR19JU19TQU1FKAorCQkJciA9IGlvY3RsKGZkLCBFWFQyX0lPQ19TRVRWRVJTSU9OLCAodm9pZCopJnNldF92ZXJzaW9uKTsKKwkJKQorCX0gZWxzZSB7CisJCUlGX0xPTkdfSVNfV0lERVIoCisJCQlyID0gaW9jdGwoZmQsIEVYVDJfSU9DX0dFVFZFUlNJT04sICZ2ZXIpOworCQkJKmdldF92ZXJzaW9uID0gdmVyOworCQkpCisJCUlGX0xPTkdfSVNfU0FNRSgKKwkJCXIgPSBpb2N0bChmZCwgRVhUMl9JT0NfR0VUVkVSU0lPTiwgKHZvaWQqKWdldF92ZXJzaW9uKTsKKwkJKQorCX0KKwljbG9zZV9zaWxlbnRseShmZCk7CisJcmV0dXJuIHI7CisjZWxzZSAvKiAhIEhBVkVfRVhUMl9JT0NUTFMgKi8KKwllcnJubyA9IEVPUE5PVFNVUFA7CisJcmV0dXJuIC0xOworI2VuZGlmIC8qICEgSEFWRV9FWFQyX0lPQ1RMUyAqLworfQorCisKKy8qIEdldC9zZXQgYSBmaWxlIGZsYWdzIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0gKi8KK2ludCBmZ2V0c2V0ZmxhZ3MoY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyAqZ2V0X2ZsYWdzLCB1bnNpZ25lZCBsb25nIHNldF9mbGFncykKK3sKKyNpZiBIQVZFX0VYVDJfSU9DVExTCisJc3RydWN0IHN0YXQgYnVmOworCWludCBmZCwgcjsKKwlJRl9MT05HX0lTX1dJREVSKGludCBmOykKKworCWlmIChzdGF0KG5hbWUsICZidWYpID09IDAgLyogc3RhdCBpcyBvayAqLworCSAmJiAhU19JU1JFRyhidWYuc3RfbW9kZSkgJiYgIVNfSVNESVIoYnVmLnN0X21vZGUpCisJKSB7CisJCWdvdG8gbm90c3VwcDsKKwl9CisJZmQgPSBvcGVuKG5hbWUsIE9fUkRPTkxZIHwgT19OT05CTE9DSyk7IC8qIG5laXRoZXIgcmVhZCBub3Igd3JpdGUgYXNrZWQgZm9yICovCisJaWYgKGZkID09IC0xKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIWdldF9mbGFncykgeworCQlJRl9MT05HX0lTX1dJREVSKAorCQkJZiA9IChpbnQpIHNldF9mbGFnczsKKwkJCXIgPSBpb2N0bChmZCwgRVhUMl9JT0NfU0VURkxBR1MsICZmKTsKKwkJKQorCQlJRl9MT05HX0lTX1NBTUUoCisJCQlyID0gaW9jdGwoZmQsIEVYVDJfSU9DX1NFVEZMQUdTLCAodm9pZCopJnNldF9mbGFncyk7CisJCSkKKwl9IGVsc2UgeworCQlJRl9MT05HX0lTX1dJREVSKAorCQkJciA9IGlvY3RsKGZkLCBFWFQyX0lPQ19HRVRGTEFHUywgJmYpOworCQkJKmdldF9mbGFncyA9IGY7CisJCSkKKwkJSUZfTE9OR19JU19TQU1FKAorCQkJciA9IGlvY3RsKGZkLCBFWFQyX0lPQ19HRVRGTEFHUywgKHZvaWQqKWdldF9mbGFncyk7CisJCSkKKwl9CisKKwljbG9zZV9zaWxlbnRseShmZCk7CisJcmV0dXJuIHI7Cisgbm90c3VwcDoKKyNlbmRpZiAvKiBIQVZFX0VYVDJfSU9DVExTICovCisJZXJybm8gPSBFT1BOT1RTVVBQOworCXJldHVybiAtMTsKK30KKworCisvKiBQcmludCBmaWxlIGF0dHJpYnV0ZXMgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLworY29uc3QgdWludDMyX3QgZTJhdHRyX2ZsYWdzX3ZhbHVlW10gPSB7CisjaWZkZWYgRU5BQkxFX0NPTVBSRVNTSU9OCisJRVhUMl9DT01QUkJMS19GTCwKKwlFWFQyX0RJUlRZX0ZMLAorCUVYVDJfTk9DT01QUl9GTCwKKwlFWFQyX0VDT01QUl9GTCwKKyNlbmRpZgorCUVYVDJfSU5ERVhfRkwsCisJRVhUMl9TRUNSTV9GTCwKKwlFWFQyX1VOUk1fRkwsCisJRVhUMl9TWU5DX0ZMLAorCUVYVDJfRElSU1lOQ19GTCwKKwlFWFQyX0lNTVVUQUJMRV9GTCwKKwlFWFQyX0FQUEVORF9GTCwKKwlFWFQyX05PRFVNUF9GTCwKKwlFWFQyX05PQVRJTUVfRkwsCisJRVhUMl9DT01QUl9GTCwKKwlFWFQzX0pPVVJOQUxfREFUQV9GTCwKKwlFWFQyX05PVEFJTF9GTCwKKwlFWFQyX1RPUERJUl9GTAorfTsKKworY29uc3QgY2hhciBlMmF0dHJfZmxhZ3Nfc25hbWVbXSA9CisjaWZkZWYgRU5BQkxFX0NPTVBSRVNTSU9OCisJIkJaWEUiCisjZW5kaWYKKwkiSSIKKwkic3VTRGlhZEFjanRUIjsKKworc3RhdGljIGNvbnN0IGNoYXIgZTJhdHRyX2ZsYWdzX2xuYW1lW10gPQorI2lmZGVmIEVOQUJMRV9DT01QUkVTU0lPTgorCSJDb21wcmVzc2VkX0ZpbGUiICJcMCIKKwkiQ29tcHJlc3NlZF9EaXJ0eV9GaWxlIiAiXDAiCisJIkNvbXByZXNzaW9uX1Jhd19BY2Nlc3MiICJcMCIKKwkiQ29tcHJlc3Npb25fRXJyb3IiICJcMCIKKyNlbmRpZgorCSJJbmRleGVkX2RpcmVjdG9yeSIgIlwwIgorCSJTZWN1cmVfRGVsZXRpb24iICJcMCIKKwkiVW5kZWxldGUiICJcMCIKKwkiU3luY2hyb25vdXNfVXBkYXRlcyIgIlwwIgorCSJTeW5jaHJvbm91c19EaXJlY3RvcnlfVXBkYXRlcyIgIlwwIgorCSJJbW11dGFibGUiICJcMCIKKwkiQXBwZW5kX09ubHkiICJcMCIKKwkiTm9fRHVtcCIgIlwwIgorCSJOb19BdGltZSIgIlwwIgorCSJDb21wcmVzc2lvbl9SZXF1ZXN0ZWQiICJcMCIKKwkiSm91cm5hbGVkX0RhdGEiICJcMCIKKwkiTm9fVGFpbG1lcmdpbmciICJcMCIKKwkiVG9wX29mX0RpcmVjdG9yeV9IaWVyYXJjaGllcyIgIlwwIgorCS8qIEFub3RoZXIgdHJhaWxpbmcgTlVMIGlzIGFkZGVkIGJ5IGNvbXBpbGVyICovOworCit2b2lkIHByaW50X2UyZmxhZ3MoRklMRSAqZiwgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgb3B0aW9ucykKK3sKKwljb25zdCB1aW50MzJfdCAqZnY7CisJY29uc3QgY2hhciAqZm47CisKKwlmdiA9IGUyYXR0cl9mbGFnc192YWx1ZTsKKwlpZiAob3B0aW9ucyAmIFBGT1BUX0xPTkcpIHsKKwkJaW50IGZpcnN0ID0gMTsKKwkJZm4gPSBlMmF0dHJfZmxhZ3NfbG5hbWU7CisJCWRvIHsKKwkJCWlmIChmbGFncyAmICpmdikgeworCQkJCWlmICghZmlyc3QpCisJCQkJCWZwdXRzKCIsICIsIGYpOworCQkJCWZwdXRzKGZuLCBmKTsKKwkJCQlmaXJzdCA9IDA7CisJCQl9CisJCQlmdisrOworCQkJZm4gKz0gc3RybGVuKGZuKSArIDE7CisJCX0gd2hpbGUgKCpmbik7CisJCWlmIChmaXJzdCkKKwkJCWZwdXRzKCItLS0iLCBmKTsKKwl9IGVsc2UgeworCQlmbiA9IGUyYXR0cl9mbGFnc19zbmFtZTsKKwkJZG8gIHsKKwkJCWNoYXIgYyA9ICctJzsKKwkJCWlmIChmbGFncyAmICpmdikKKwkJCQljID0gKmZuOworCQkJZnB1dGMoYywgZik7CisJCQlmdisrOworCQkJZm4rKzsKKwkJfSB3aGlsZSAoKmZuKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MvZTJmc19saWIuaCBiL2UyZnNwcm9ncy9lMmZzX2xpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYWU1NmYKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MvZTJmc19saWIuaApAQCAtMCwwICsxLDQ3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBTZWUgUkVBRE1FIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCisgKgorICogVGhpcyBmaWxlIGNhbiBiZSByZWRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UKKyAqLworCisvKiBDb25zdGFudHMgYW5kIHN0cnVjdHVyZXMgKi8KKyNpbmNsdWRlICJiYl9lMmZzX2RlZnMuaCIKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKKy8qIEl0ZXJhdGUgYSBmdW5jdGlvbiBvbiBlYWNoIGVudHJ5IG9mIGEgZGlyZWN0b3J5ICovCitpbnQgaXRlcmF0ZV9vbl9kaXIoY29uc3QgY2hhciAqZGlyX25hbWUsCisJCWludCBGQVNUX0ZVTkMgKCpmdW5jKShjb25zdCBjaGFyICosIHN0cnVjdCBkaXJlbnQgKiwgdm9pZCAqKSwKKwkJdm9pZCAqcHJpdmF0ZSk7CisKKy8qIEdldC9zZXQgYSBmaWxlIHZlcnNpb24gb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLworaW50IGZnZXRzZXR2ZXJzaW9uKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxvbmcgKmdldF92ZXJzaW9uLCB1bnNpZ25lZCBsb25nIHNldF92ZXJzaW9uKTsKKyNkZWZpbmUgZmdldHZlcnNpb24obmFtZSwgdmVyc2lvbikgZmdldHNldHZlcnNpb24obmFtZSwgdmVyc2lvbiwgMCkKKyNkZWZpbmUgZnNldHZlcnNpb24obmFtZSwgdmVyc2lvbikgZmdldHNldHZlcnNpb24obmFtZSwgTlVMTCwgdmVyc2lvbikKKworLyogR2V0L3NldCBhIGZpbGUgZmxhZ3Mgb24gYW4gZXh0MiBmaWxlIHN5c3RlbSAqLworaW50IGZnZXRzZXRmbGFncyhjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBsb25nICpnZXRfZmxhZ3MsIHVuc2lnbmVkIGxvbmcgc2V0X2ZsYWdzKTsKKyNkZWZpbmUgZmdldGZsYWdzKG5hbWUsIGZsYWdzKSBmZ2V0c2V0ZmxhZ3MobmFtZSwgZmxhZ3MsIDApCisjZGVmaW5lIGZzZXRmbGFncyhuYW1lLCBmbGFncykgZmdldHNldGZsYWdzKG5hbWUsIE5VTEwsIGZsYWdzKQorCisvKiBNdXN0IGJlIDEgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBgaW50IGxvbmdfZm9ybWF0Jy4gKi8KKyNkZWZpbmUgUEZPUFRfTE9ORyAgMQorLyogUHJpbnQgZmlsZSBhdHRyaWJ1dGVzIG9uIGFuIGV4dDIgZmlsZSBzeXN0ZW0gKi8KK3ZvaWQgcHJpbnRfZTJmbGFncyhGSUxFICpmLCB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBvcHRpb25zKTsKKworZXh0ZXJuIGNvbnN0IHVpbnQzMl90IGUyYXR0cl9mbGFnc192YWx1ZVtdOworZXh0ZXJuIGNvbnN0IGNoYXIgZTJhdHRyX2ZsYWdzX3NuYW1lW107CisKKy8qIElmIHlvdSBwbGFuIHRvIEVOQUJMRV9DT01QUkVTU0lPTiwgc2VlIGUyZnNfbGliLmMgYW5kIGNoYXR0ci5jIC0gKi8KKy8qIG1ha2Ugc3VyZSB0aGF0IGNoYXR0ciBkb2Vzbid0IGFjY2VwdCBiYWQgb3B0aW9ucyEgKi8KKyNpZmRlZiBFTkFCTEVfQ09NUFJFU1NJT04KKyNkZWZpbmUgZTJhdHRyX2ZsYWdzX3ZhbHVlX2NoYXR0ciAoJmUyYXR0cl9mbGFnc192YWx1ZVs1XSkKKyNkZWZpbmUgZTJhdHRyX2ZsYWdzX3NuYW1lX2NoYXR0ciAoJmUyYXR0cl9mbGFnc19zbmFtZVs1XSkKKyNlbHNlCisjZGVmaW5lIGUyYXR0cl9mbGFnc192YWx1ZV9jaGF0dHIgKCZlMmF0dHJfZmxhZ3NfdmFsdWVbMV0pCisjZGVmaW5lIGUyYXR0cl9mbGFnc19zbmFtZV9jaGF0dHIgKCZlMmF0dHJfZmxhZ3Nfc25hbWVbMV0pCisjZW5kaWYKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9mc2NrLmMgYi9lMmZzcHJvZ3MvZnNjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZDMxMmUKLS0tIC9kZXYvbnVsbAorKysgYi9lMmZzcHJvZ3MvZnNjay5jCkBAIC0wLDAgKzEsMTA5NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZnNjayAtLS0gQSBnZW5lcmljLCBwYXJhbGxlbGl6aW5nIGZyb250LWVuZCBmb3IgdGhlIGZzY2sgcHJvZ3JhbS4KKyAqIEl0IHdpbGwgYXV0b21hdGljYWxseSB0cnkgdG8gcnVuIGZzY2sgcHJvZ3JhbXMgaW4gcGFyYWxsZWwgaWYgdGhlCisgKiBkZXZpY2VzIGFyZSBvbiBzZXBhcmF0ZSBzcGluZGxlcy4gIEl0IGlzIGJhc2VkIG9uIHRoZSBzYW1lIGlkZWFzIGFzCisgKiB0aGUgZ2VuZXJpYyBmcm9udCBlbmQgZm9yIGZzY2sgYnkgRGF2aWQgRW5nZWwgYW5kIEZyZWQgdmFuIEtlbXBlbiwKKyAqIGJ1dCBpdCBoYXMgYmVlbiBjb21wbGV0ZWx5IHJld3JpdHRlbiBmcm9tIHNjcmF0Y2ggdG8gc3VwcG9ydAorICogcGFyYWxsZWwgZXhlY3V0aW9uLgorICoKKyAqIFdyaXR0ZW4gYnkgVGhlb2RvcmUgVHMnbywgPHR5dHNvQG1pdC5lZHU+CisgKgorICogTWlxdWVsIHZhbiBTbW9vcmVuYnVyZyAobWlxdWVsc0Bkcmlua2VsLm93Lm9yZykgMjAtT2N0LTE5OTQ6CisgKiAgIG8gQ2hhbmdlZCAtdCBmc3R5cGUgdG8gYmVoYXZlIGxpa2Ugd2l0aCBtb3VudCB3aGVuIC1BIChhbGwgZmlsZQorICogICAgIHN5c3RlbXMpIG9yIC1NIChsaWtlIG1vdW50KSBpcyBzcGVjaWZpZWQuCisgKiAgIG8gZnNjayBsb29rcyBpZiBpdCBjYW4gZmluZCB0aGUgZnNjay50eXBlIHByb2dyYW0gdG8gZGVjaWRlCisgKiAgICAgaWYgaXQgc2hvdWxkIGlnbm9yZSB0aGUgZnMgdHlwZS4gVGhpcyB3YXkgbW9yZSBmc2NrIHByb2dyYW1zCisgKiAgICAgY2FuIGJlIGFkZGVkIHdpdGhvdXQgY2hhbmdpbmcgdGhpcyBmcm9udC1lbmQuCisgKiAgIG8gLVIgZmxhZyBza2lwIHJvb3QgZmlsZSBzeXN0ZW0uCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0LCAxOTk1LCAxOTk2LCAxOTk3LCAxOTk4LCAxOTk5LCAyMDAwLAorICogICAgICAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0LCAyMDA1IGJ5ICBUaGVvZG9yZSBUcydvLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQWxsIGZpbGVzeXN0ZW0gc3BlY2lmaWMgaG9va3MgaGF2ZSBiZWVuIHJlbW92ZWQuCisgKiBJZiBmaWxlc3lzdGVtIGNhbm5vdCBiZSBkZXRlcm1pbmVkLCB3ZSB3aWxsIGV4ZWN1dGUKKyAqICJmc2NrLmF1dG8iLiBDdXJyZW50bHkgdGhpcyBhbHNvIGhhcHBlbnMgaWYgeW91IHNwZWNpZnkKKyAqIFVVSUQ9eHh4IG9yIExBQkVMPXh4eCBhcyBhbiBvYmplY3QgdG8gY2hlY2suCisgKiBEZXRlY3Rpb24gY29kZSBmb3IgdGhhdCBpcyBhbHNvIHByb2JhYmx5IGhhcyB0byBiZSBpbiBmc2NrLmF1dG8uCisgKgorICogSW4gb3RoZXIgd29yZHMsIHRoaXMgaXMgX3JlYWxseV8gaXMganVzdCBhIGRyaXZlciBwcm9ncmFtIHdoaWNoCisgKiBzcGF3bnMgYWN0dWFsIGZzY2suc29tZXRoaW5nIGZvciBlYWNoIGZpbGVzeXN0ZW0gdG8gY2hlY2suCisgKiBJdCBkb2Vzbid0IGd1ZXNzIGZpbGVzeXN0ZW0gdHlwZXMgZnJvbSBvbi1kaXNrIGZvcm1hdC4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZnNja190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1BTlBSVFZdIFstQyBGRF0gWy10IEZTVFlQRV0gW0ZTX09QVFNdIFtCTE9DS0RFVl0uLi4iCisvL3VzYWdlOiNkZWZpbmUgZnNja19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoZWNrIGFuZCByZXBhaXIgZmlsZXN5c3RlbXNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLUEJV2FsayAvZXRjL2ZzdGFiIGFuZCBjaGVjayBhbGwgZmlsZXN5c3RlbXMiCisvL3VzYWdlOiAgICAgIlxuCS1OCURvbid0IGV4ZWN1dGUsIGp1c3Qgc2hvdyB3aGF0IHdvdWxkIGJlIGRvbmUiCisvL3VzYWdlOiAgICAgIlxuCS1QCVdpdGggLUEsIGNoZWNrIGZpbGVzeXN0ZW1zIGluIHBhcmFsbGVsIgorLy91c2FnZTogICAgICJcbgktUglXaXRoIC1BLCBza2lwIHRoZSByb290IGZpbGVzeXN0ZW0iCisvL3VzYWdlOiAgICAgIlxuCS1UCURvbid0IHNob3cgdGl0bGUgb24gc3RhcnR1cCIKKy8vdXNhZ2U6ICAgICAiXG4JLVYJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLUMgbglXcml0ZSBzdGF0dXMgaW5mb3JtYXRpb24gdG8gc3BlY2lmaWVkIGZpbGVkZXNjcmlwdG9yIgorLy91c2FnZTogICAgICJcbgktdCBUWVBFCUxpc3Qgb2YgZmlsZXN5c3RlbSB0eXBlcyB0byBjaGVjayIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qICJwcm9ncmVzcyBpbmRpY2F0b3IiIGNvZGUgaXMgc29tZXdoYXQgYnVnZ3kgYW5kIGV4dFsyM10gc3BlY2lmaWMuCisgKiBXZSBzaG91bGQgYmUgZmlsZXN5c3RlbSBhZ25vc3RpYy4gSU9XOiB0aGVyZSBzaG91bGQgYmUgYSB3ZWxsLWRlZmluZWQKKyAqIEFQSSBmb3IgZnNjay5zb21ldGhpbmcsIE5PVCBhZC1ob2MgaGFja3MgaW4gZ2VuZXJpYyBmc2NrLiAqLworI2RlZmluZSBET19QUk9HUkVTU19JTkRJQ0FUT1IgMAorCisvKiBmc2NrIDEuNDEuNCAoMjctSmFuLTIwMDkpIG1hbnBhZ2Ugc2F5czoKKyAqIDAgICAtIE5vIGVycm9ycworICogMSAgIC0gRmlsZSBzeXN0ZW0gZXJyb3JzIGNvcnJlY3RlZAorICogMiAgIC0gU3lzdGVtIHNob3VsZCBiZSByZWJvb3RlZAorICogNCAgIC0gRmlsZSBzeXN0ZW0gZXJyb3JzIGxlZnQgdW5jb3JyZWN0ZWQKKyAqIDggICAtIE9wZXJhdGlvbmFsIGVycm9yCisgKiAxNiAgLSBVc2FnZSBvciBzeW50YXggZXJyb3IKKyAqIDMyICAtIEZzY2sgY2FuY2VsZWQgYnkgdXNlciByZXF1ZXN0CisgKiAxMjggLSBTaGFyZWQgbGlicmFyeSBlcnJvcgorICovCisjZGVmaW5lIEVYSVRfT0sgICAgICAgICAgMAorI2RlZmluZSBFWElUX05PTkRFU1RSVUNUIDEKKyNkZWZpbmUgRVhJVF9ERVNUUlVDVCAgICAyCisjZGVmaW5lIEVYSVRfVU5DT1JSRUNURUQgNAorI2RlZmluZSBFWElUX0VSUk9SICAgICAgIDgKKyNkZWZpbmUgRVhJVF9VU0FHRSAgICAgICAxNgorI2RlZmluZSBGU0NLX0NBTkNFTEVEICAgIDMyICAgICAvKiBBYm9ydGVkIHdpdGggYSBzaWduYWwgb3IgXkMgKi8KKworLyoKKyAqIEludGVybmFsIHN0cnVjdHVyZSBmb3IgbW91bnQgdGFibGUgZW50cmllcy4KKyAqLworc3RydWN0IGZzX2luZm8geworCXN0cnVjdCBmc19pbmZvICpuZXh0OworCWNoYXIJKmRldmljZTsKKwljaGFyCSptb3VudHB0OworCWNoYXIJKnR5cGU7CisJY2hhcgkqb3B0czsKKwlpbnQJcGFzc25vOworCWludAlmbGFnczsKK307CisKKyNkZWZpbmUgRkxBR19ET05FIDEKKyNkZWZpbmUgRkxBR19QUk9HUkVTUyAyCisvKgorICogU3RydWN0dXJlIHRvIGFsbG93IGV4aXQgY29kZXMgdG8gYmUgc3RvcmVkCisgKi8KK3N0cnVjdCBmc2NrX2luc3RhbmNlIHsKKwlzdHJ1Y3QgZnNja19pbnN0YW5jZSAqbmV4dDsKKwlpbnQJcGlkOworCWludAlmbGFnczsKKyNpZiBET19QUk9HUkVTU19JTkRJQ0FUT1IKKwl0aW1lX3QJc3RhcnRfdGltZTsKKyNlbmRpZgorCWNoYXIJKnByb2c7CisJY2hhcgkqZGV2aWNlOworCWNoYXIJKmJhc2VfZGV2aWNlOyAvKiAvZGV2L2hkYSBmb3IgL2Rldi9oZGFOIGV0YyAqLworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgaWdub3JlZF90eXBlc1tdIEFMSUdOMSA9CisJImlnbm9yZVwwIgorCSJpc285NjYwXDAiCisJIm5mc1wwIgorCSJwcm9jXDAiCisJInN3XDAiCisJInN3YXBcMCIKKwkidG1wZnNcMCIKKwkiZGV2cHRzXDAiOworCisjaWYgMAorc3RhdGljIGNvbnN0IGNoYXIgcmVhbGx5X3dhbnRlZFtdIEFMSUdOMSA9CisJIm1pbml4XDAiCisJImV4dDJcMCIKKwkiZXh0M1wwIgorCSJqZnNcMCIKKwkicmVpc2VyZnNcMCIKKwkieGlhZnNcMCIKKwkieGZzXDAiOworI2VuZGlmCisKKyNkZWZpbmUgQkFTRV9NRCAiL2Rldi9tZCIKKworc3RhdGljIGNoYXIgKiphcmdzOworc3RhdGljIGludCBudW1fYXJnczsKK3N0YXRpYyBpbnQgdmVyYm9zZTsKKworI2RlZmluZSBGU19UWVBFX0ZMQUdfTk9STUFMIDAKKyNkZWZpbmUgRlNfVFlQRV9GTEFHX09QVCAgICAxCisjZGVmaW5lIEZTX1RZUEVfRkxBR19ORUdPUFQgMgorc3RhdGljIGNoYXIgKipmc190eXBlX2xpc3Q7CitzdGF0aWMgdWludDhfdCAqZnNfdHlwZV9mbGFnOworc3RhdGljIHNtYWxsaW50IGZzX3R5cGVfbmVnYXRlZDsKKworc3RhdGljIHNtYWxsaW50IG5vZXhlY3V0ZTsKK3N0YXRpYyBzbWFsbGludCBzZXJpYWxpemU7CitzdGF0aWMgc21hbGxpbnQgc2tpcF9yb290OworLyogc3RhdGljIHNtYWxsaW50IGxpa2VfbW91bnQ7ICovCitzdGF0aWMgc21hbGxpbnQgcGFyYWxsZWxfcm9vdDsKK3N0YXRpYyBzbWFsbGludCBmb3JjZV9hbGxfcGFyYWxsZWw7CisKKyNpZiBET19QUk9HUkVTU19JTkRJQ0FUT1IKK3N0YXRpYyBzbWFsbGludCBwcm9ncmVzczsKK3N0YXRpYyBpbnQgcHJvZ3Jlc3NfZmQ7CisjZW5kaWYKKworc3RhdGljIGludCBudW1fcnVubmluZzsKK3N0YXRpYyBpbnQgbWF4X3J1bm5pbmc7CitzdGF0aWMgY2hhciAqZnN0eXBlOworc3RhdGljIHN0cnVjdCBmc19pbmZvICpmaWxlc3lzX2luZm87CitzdGF0aWMgc3RydWN0IGZzX2luZm8gKmZpbGVzeXNfbGFzdDsKK3N0YXRpYyBzdHJ1Y3QgZnNja19pbnN0YW5jZSAqaW5zdGFuY2VfbGlzdDsKKworLyoKKyAqIFJldHVybiB0aGUgImJhc2UgZGV2aWNlIiBnaXZlbiBhIHBhcnRpY3VsYXIgZGV2aWNlOyB0aGlzIGlzIHVzZWQgdG8KKyAqIGFzc3VyZSB0aGF0IHdlIG9ubHkgZnNjayBvbmUgcGFydGl0aW9uIG9uIGEgcGFydGljdWxhciBkcml2ZSBhdCBhbnkKKyAqIG9uZSB0aW1lLiAgT3RoZXJ3aXNlLCB0aGUgZGlzayBoZWFkcyB3aWxsIGJlIHNlZWtpbmcgYWxsIG92ZXIgdGhlCisgKiBwbGFjZS4gIElmIHRoZSBiYXNlIGRldmljZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZCwgcmV0dXJuIE5VTEwuCisgKgorICogVGhlIGJhc2VfZGV2aWNlKCkgZnVuY3Rpb24gcmV0dXJucyBhbiBhbGxvY2F0ZWQgc3RyaW5nIHdoaWNoIG11c3QKKyAqIGJlIGZyZWVkLgorICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfREVWRlMKKy8qCisgKiBSZXF1aXJlZCBmb3IgdGhlIHViZXItc2lsbHkgZGV2ZnMgL2Rldi9pZGUvaG9zdDEvYnVzMi90YXJnZXQzL2x1bjMKKyAqIHBhdGhhbWVzLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZGV2ZnNfaGllcltdID0geworCSJob3N0IiwgImJ1cyIsICJ0YXJnZXQiLCAibHVuIiwgTlVMTAorfTsKKyNlbmRpZgorCitzdGF0aWMgY2hhciAqYmFzZV9kZXZpY2UoY29uc3QgY2hhciAqZGV2aWNlKQoreworCWNoYXIgKnN0ciwgKmNwOworI2lmIEVOQUJMRV9GRUFUVVJFX0RFVkZTCisJY29uc3QgY2hhciAqY29uc3QgKmhpZXI7CisJY29uc3QgY2hhciAqZGlzazsKKwlpbnQgbGVuOworI2VuZGlmCisJc3RyID0geHN0cmR1cChkZXZpY2UpOworCisJLyogU2tpcCBvdmVyICIvZGV2LyI7IGlmIGl0J3Mgbm90IHByZXNlbnQsIGdpdmUgdXAgKi8KKwljcCA9IHNraXBfZGV2X3BmeChzdHIpOworCWlmIChjcCA9PSBzdHIpCisJCWdvdG8gZXJyb3V0OworCisJLyoKKwkgKiBGb3IgbWQgZGV2aWNlcywgd2UgdHJlYXQgdGhlbSBhbGwgYXMgaWYgdGhleSB3ZXJlIGFsbAorCSAqIG9uIG9uZSBkaXNrLCBzaW5jZSB3ZSBkb24ndCBrbm93IGhvdyB0byBwYXJhbGxlbGl6ZSB0aGVtLgorCSAqLworCWlmIChjcFswXSA9PSAnbScgJiYgY3BbMV0gPT0gJ2QnKSB7CisJCWNwWzJdID0gMDsKKwkJcmV0dXJuIHN0cjsKKwl9CisKKwkvKiBIYW5kbGUgREFDIDk2MCBkZXZpY2VzICovCisJaWYgKGlzX3ByZWZpeGVkX3dpdGgoY3AsICJyZC8iKSkgeworCQljcCArPSAzOworCQlpZiAoY3BbMF0gIT0gJ2MnIHx8ICFpc2RpZ2l0KGNwWzFdKQorCQkgfHwgY3BbMl0gIT0gJ2QnIHx8ICFpc2RpZ2l0KGNwWzNdKSkKKwkJCWdvdG8gZXJyb3V0OworCQljcFs0XSA9IDA7CisJCXJldHVybiBzdHI7CisJfQorCisJLyogTm93IGxldCdzIGhhbmRsZSAvZGV2L2hkKiBhbmQgL2Rldi9zZCogZGV2aWNlcy4uLi4gKi8KKwlpZiAoKGNwWzBdID09ICdoJyB8fCBjcFswXSA9PSAncycpICYmIGNwWzFdID09ICdkJykgeworCQljcCArPSAyOworCQkvKiBJZiB0aGVyZSdzIGEgc2luZ2xlIG51bWJlciBhZnRlciAvZGV2L2hkLCBza2lwIGl0ICovCisJCWlmIChpc2RpZ2l0KCpjcCkpCisJCQljcCsrOworCQkvKiBXaGF0IGZvbGxvd3MgbXVzdCBiZSBhbiBhbHBoYSBjaGFyLCBvciBnaXZlIHVwICovCisJCWlmICghaXNhbHBoYSgqY3ApKQorCQkJZ290byBlcnJvdXQ7CisJCWNwWzFdID0gMDsKKwkJcmV0dXJuIHN0cjsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9ERVZGUworCS8qIE5vdyBsZXQncyBoYW5kbGUgZGV2ZnMgKHVnaCkgbmFtZXMgKi8KKwlsZW4gPSAwOworCWlmIChpc19wcmVmaXhlZF93aXRoKGNwLCAiaWRlLyIpKQorCQlsZW4gPSA0OworCWlmIChpc19wcmVmaXhlZF93aXRoKGNwLCAic2NzaS8iKSkKKwkJbGVuID0gNTsKKwlpZiAobGVuKSB7CisJCWNwICs9IGxlbjsKKwkJLyoKKwkJICogTm93IHdlIHByb2NlZWQgZG93biB0aGUgZXhwZWN0ZWQgZGV2ZnMgaGllcmFyY2h5LgorCQkgKiBpLmUuLCAuLi4vaG9zdDEvYnVzMi90YXJnZXQzL2x1bjQvLi4uCisJCSAqIElmIHdlIGRvbid0IGZpbmQgdGhlIGV4cGVjdGVkIHRva2VuLCBmb2xsb3dlZCBieQorCQkgKiBzb21lIG51bWJlciBvZiBkaWdpdHMgYXQgZWFjaCBsZXZlbCwgYWJvcnQuCisJCSAqLworCQlmb3IgKGhpZXIgPSBkZXZmc19oaWVyOyAqaGllcjsgaGllcisrKSB7CisJCQljcCA9IGlzX3ByZWZpeGVkX3dpdGgoY3AsICpoaWVyKTsKKwkJCWlmICghY3ApCisJCQkJZ290byBlcnJvdXQ7CisJCQl3aGlsZSAoKmNwICE9ICcvJyAmJiAqY3AgIT0gJ1wwJykgeworCQkJCWlmICghaXNkaWdpdCgqY3ApKQorCQkJCQlnb3RvIGVycm91dDsKKwkJCQljcCsrOworCQkJfQorLy9GSVhNRTogd2hhdCBpZiAqY3AgPSAnXDAnIG5vdz8gY3ArKyBtb3ZlcyBwYXN0IGl0ISEhCisJCQljcCsrOworCQl9CisJCWNwWy0xXSA9ICdcMCc7CisJCXJldHVybiBzdHI7CisJfQorCisJLyogTm93IGhhbmRsZSBkZXZmcyAvZGV2L2Rpc2Mgb3IgL2Rldi9kaXNrIG5hbWVzICovCisJZGlzayA9IE5VTEw7CisJaWYgKGlzX3ByZWZpeGVkX3dpdGgoY3AsICJkaXNjcy8iKSkKKwkJZGlzayA9ICJkaXNjIjsKKwllbHNlIGlmIChpc19wcmVmaXhlZF93aXRoKGNwLCAiZGlza3MvIikpCisJCWRpc2sgPSAiZGlzayI7CisJaWYgKGRpc2spIHsKKwkJY3AgKz0gNjsKKwkJY3AgPSBpc19wcmVmaXhlZF93aXRoKGNwLCBkaXNrKTsKKwkJaWYgKCFjcCkKKwkJCWdvdG8gZXJyb3V0OworCQl3aGlsZSAoKmNwICE9ICcvJyAmJiAqY3AgIT0gJ1wwJykgeworCQkJaWYgKCFpc2RpZ2l0KCpjcCkpCisJCQkJZ290byBlcnJvdXQ7CisJCQljcCsrOworCQl9CisJCSpjcCA9ICdcMCc7CisJCXJldHVybiBzdHI7CisJfQorI2VuZGlmCisgZXJyb3V0OgorCWZyZWUoc3RyKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZnJlZV9pbnN0YW5jZShzdHJ1Y3QgZnNja19pbnN0YW5jZSAqcCkKK3sKKwlmcmVlKHAtPnByb2cpOworCWZyZWUocC0+ZGV2aWNlKTsKKwlmcmVlKHAtPmJhc2VfZGV2aWNlKTsKKwlmcmVlKHApOworfQorCitzdGF0aWMgc3RydWN0IGZzX2luZm8gKmNyZWF0ZV9mc19kZXZpY2UoY29uc3QgY2hhciAqZGV2aWNlLCBjb25zdCBjaGFyICptbnRwbnQsCisJCQkJCWNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IGNoYXIgKm9wdHMsCisJCQkJCWludCBwYXNzbm8pCit7CisJc3RydWN0IGZzX2luZm8gKmZzOworCisJZnMgPSB4emFsbG9jKHNpemVvZigqZnMpKTsKKwlmcy0+ZGV2aWNlID0geHN0cmR1cChkZXZpY2UpOworCWZzLT5tb3VudHB0ID0geHN0cmR1cChtbnRwbnQpOworCWlmIChzdHJjaHIodHlwZSwgJywnKSkKKwkJdHlwZSA9IChjaGFyICopImF1dG8iOworCWZzLT50eXBlID0geHN0cmR1cCh0eXBlKTsKKwlmcy0+b3B0cyA9IHhzdHJkdXAob3B0cyA/IG9wdHMgOiAiIik7CisJZnMtPnBhc3NubyA9IHBhc3NubyA8IDAgPyAxIDogcGFzc25vOworCS8qZnMtPmZsYWdzID0gMDsgKi8KKwkvKmZzLT5uZXh0ID0gTlVMTDsgKi8KKworCWlmICghZmlsZXN5c19pbmZvKQorCQlmaWxlc3lzX2luZm8gPSBmczsKKwllbHNlCisJCWZpbGVzeXNfbGFzdC0+bmV4dCA9IGZzOworCWZpbGVzeXNfbGFzdCA9IGZzOworCisJcmV0dXJuIGZzOworfQorCisvKiBMb2FkIHRoZSBmaWxlc3lzdGVtIGRhdGFiYXNlIGZyb20gL2V0Yy9mc3RhYiAqLworc3RhdGljIHZvaWQgbG9hZF9mc19pbmZvKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCUZJTEUgKmZzdGFiOworCXN0cnVjdCBtbnRlbnQgbXRlOworCisJZnN0YWIgPSBzZXRtbnRlbnQoZmlsZW5hbWUsICJyIik7CisJaWYgKCFmc3RhYikgeworCQliYl9wZXJyb3JfbXNnKCJjYW4ndCByZWFkICclcyciLCBmaWxlbmFtZSk7CisJCXJldHVybjsKKwl9CisKKwkvLyBMb29wIHRocm91Z2ggZW50cmllcworCXdoaWxlIChnZXRtbnRlbnRfcihmc3RhYiwgJm10ZSwgYmJfY29tbW9uX2J1ZnNpejEsIENPTU1PTl9CVUZTSVpFKSkgeworCQkvL2JiX2luZm9fbXNnKCJDUkVBVEVbJXNdWyVzXVslc11bJXNdWyVkXSIsIG10ZS5tbnRfZnNuYW1lLCBtdGUubW50X2RpciwKKwkJLy8JbXRlLm1udF90eXBlLCBtdGUubW50X29wdHMsCisJCS8vCW10ZS5tbnRfcGFzc25vKTsKKwkJY3JlYXRlX2ZzX2RldmljZShtdGUubW50X2ZzbmFtZSwgbXRlLm1udF9kaXIsCisJCQltdGUubW50X3R5cGUsIG10ZS5tbnRfb3B0cywKKwkJCW10ZS5tbnRfcGFzc25vKTsKKwl9CisJZW5kbW50ZW50KGZzdGFiKTsKK30KKworLyogTG9va3VwIGZpbGVzeXMgaW4gL2V0Yy9mc3RhYiBhbmQgcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGVudHJ5LiAqLworc3RhdGljIHN0cnVjdCBmc19pbmZvICpsb29rdXAoY2hhciAqZmlsZXN5cykKK3sKKwlzdHJ1Y3QgZnNfaW5mbyAqZnM7CisKKwlmb3IgKGZzID0gZmlsZXN5c19pbmZvOyBmczsgZnMgPSBmcy0+bmV4dCkgeworCQlpZiAoc3RyY21wKGZpbGVzeXMsIGZzLT5kZXZpY2UpID09IDAKKwkJIHx8IChmcy0+bW91bnRwdCAmJiBzdHJjbXAoZmlsZXN5cywgZnMtPm1vdW50cHQpID09IDApCisJCSkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBmczsKK30KKworI2lmIERPX1BST0dSRVNTX0lORElDQVRPUgorc3RhdGljIGludCBwcm9ncmVzc19hY3RpdmUodm9pZCkKK3sKKwlzdHJ1Y3QgZnNja19pbnN0YW5jZSAqaW5zdDsKKworCWZvciAoaW5zdCA9IGluc3RhbmNlX2xpc3Q7IGluc3Q7IGluc3QgPSBpbnN0LT5uZXh0KSB7CisJCWlmIChpbnN0LT5mbGFncyAmIEZMQUdfRE9ORSkKKwkJCWNvbnRpbnVlOworCQlpZiAoaW5zdC0+ZmxhZ3MgJiBGTEFHX1BST0dSRVNTKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorI2VuZGlmCisKKworLyoKKyAqIFNlbmQgYSBzaWduYWwgdG8gYWxsIG91dHN0YW5kaW5nIGZzY2sgY2hpbGQgcHJvY2Vzc2VzCisgKi8KK3N0YXRpYyB2b2lkIGtpbGxfYWxsX2lmX2dvdF9zaWduYWwodm9pZCkKK3sKKwlzdGF0aWMgc21hbGxpbnQga2lsbF9zZW50OworCisJc3RydWN0IGZzY2tfaW5zdGFuY2UgKmluc3Q7CisKKwlpZiAoIWJiX2dvdF9zaWduYWwgfHwga2lsbF9zZW50KQorCQlyZXR1cm47CisKKwlmb3IgKGluc3QgPSBpbnN0YW5jZV9saXN0OyBpbnN0OyBpbnN0ID0gaW5zdC0+bmV4dCkgeworCQlpZiAoaW5zdC0+ZmxhZ3MgJiBGTEFHX0RPTkUpCisJCQljb250aW51ZTsKKwkJa2lsbChpbnN0LT5waWQsIFNJR1RFUk0pOworCX0KKwlraWxsX3NlbnQgPSAxOworfQorCisvKgorICogV2FpdCBmb3Igb25lIGNoaWxkIHByb2Nlc3MgdG8gZXhpdDsgd2hlbiBpdCBkb2VzLCB1bmxpbmsgaXQgZnJvbQorICogdGhlIGxpc3Qgb2YgZXhlY3V0aW5nIGNoaWxkIHByb2Nlc3NlcywgZnJlZSwgYW5kIHJldHVybiBpdHMgZXhpdCBzdGF0dXMuCisgKiBJZiB0aGVyZSBpcyBubyBleGl0ZWQgY2hpbGQsIHJldHVybiAtMS4KKyAqLworc3RhdGljIGludCB3YWl0X29uZShpbnQgZmxhZ3MpCit7CisJaW50IHN0YXR1czsKKwlpbnQgc2lnOworCXN0cnVjdCBmc2NrX2luc3RhbmNlICppbnN0LCAqcHJldjsKKwlwaWRfdCBwaWQ7CisKKwlpZiAoIWluc3RhbmNlX2xpc3QpCisJCXJldHVybiAtMTsKKwkvKiBpZiAobm9leGVjdXRlKSB7IGFscmVhZHkgcmV0dXJuZWQgLTE7IH0gKi8KKworCXdoaWxlICgxKSB7CisJCXBpZCA9IHdhaXRwaWQoLTEsICZzdGF0dXMsIGZsYWdzKTsKKwkJa2lsbF9hbGxfaWZfZ290X3NpZ25hbCgpOworCQlpZiAocGlkID09IDApIC8qIGZsYWdzID09IFdOT0hBTkcgYW5kIG5vIGNoaWxkcmVuIGV4aXRlZCAqLworCQkJcmV0dXJuIC0xOworCQlpZiAocGlkIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGVycm5vID09IEVDSElMRCkgeyAvKiBwYXJhbm9pYSAqLworCQkJCWJiX2Vycm9yX21zZygid2FpdDogbm8gbW9yZSBjaGlsZHJlbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWJiX3BlcnJvcl9tc2coIndhaXQiKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXByZXYgPSBOVUxMOworCQlpbnN0ID0gaW5zdGFuY2VfbGlzdDsKKwkJZG8geworCQkJaWYgKGluc3QtPnBpZCA9PSBwaWQpCisJCQkJZ290byBjaGlsZF9kaWVkOworCQkJcHJldiA9IGluc3Q7CisJCQlpbnN0ID0gaW5zdC0+bmV4dDsKKwkJfSB3aGlsZSAoaW5zdCk7CisJfQorIGNoaWxkX2RpZWQ6CisKKwlpZiAoV0lGRVhJVEVEKHN0YXR1cykpCisJCXN0YXR1cyA9IFdFWElUU1RBVFVTKHN0YXR1cyk7CisJZWxzZSBpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkgeworCQlzaWcgPSBXVEVSTVNJRyhzdGF0dXMpOworCQlzdGF0dXMgPSBFWElUX1VOQ09SUkVDVEVEOworCQlpZiAoc2lnICE9IFNJR0lOVCkgeworCQkJcHJpbnRmKCJXYXJuaW5nOiAlcyAlcyB0ZXJtaW5hdGVkICIKKwkJCQkiYnkgc2lnbmFsICVkXG4iLAorCQkJCWluc3QtPnByb2csIGluc3QtPmRldmljZSwgc2lnKTsKKwkJCXN0YXR1cyA9IEVYSVRfRVJST1I7CisJCX0KKwl9IGVsc2UgeworCQlwcmludGYoIiVzICVzOiBzdGF0dXMgaXMgJXgsIHNob3VsZCBuZXZlciBoYXBwZW5cbiIsCisJCQlpbnN0LT5wcm9nLCBpbnN0LT5kZXZpY2UsIHN0YXR1cyk7CisJCXN0YXR1cyA9IEVYSVRfRVJST1I7CisJfQorCisjaWYgRE9fUFJPR1JFU1NfSU5ESUNBVE9SCisJaWYgKHByb2dyZXNzICYmIChpbnN0LT5mbGFncyAmIEZMQUdfUFJPR1JFU1MpICYmICFwcm9ncmVzc19hY3RpdmUoKSkgeworCQlzdHJ1Y3QgZnNja19pbnN0YW5jZSAqaW5zdDI7CisJCWZvciAoaW5zdDIgPSBpbnN0YW5jZV9saXN0OyBpbnN0MjsgaW5zdDIgPSBpbnN0Mi0+bmV4dCkgeworCQkJaWYgKGluc3QyLT5mbGFncyAmIEZMQUdfRE9ORSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChzdHJjbXAoaW5zdDItPnR5cGUsICJleHQyIikgIT0gMAorCQkJICYmIHN0cmNtcChpbnN0Mi0+dHlwZSwgImV4dDMiKSAhPSAwCisJCQkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIGV4dFsyM10sIHdlIHdpbGwgc2VuZCBVU1IxCisJCQkgKiAocmVxdWVzdCB0byBzdGFydCBkaXNwbGF5aW5nIHByb2dyZXNzIGJhcikKKwkJCSAqCisJCQkgKiBJZiB3ZSd2ZSBqdXN0IHN0YXJ0ZWQgdGhlIGZzY2ssIHdhaXQgYSB0aW55CisJCQkgKiBiaXQgYmVmb3JlIHNlbmRpbmcgdGhlIGtpbGwsIHRvIGdpdmUgaXQKKwkJCSAqIHRpbWUgdG8gc2V0IHVwIHRoZSBzaWduYWwgaGFuZGxlcgorCQkJICovCisJCQlpZiAoaW5zdDItPnN0YXJ0X3RpbWUgPj0gdGltZShOVUxMKSAtIDEpCisJCQkJc2xlZXAoMSk7CisJCQlraWxsKGluc3QyLT5waWQsIFNJR1VTUjEpOworCQkJaW5zdDItPmZsYWdzIHw9IEZMQUdfUFJPR1JFU1M7CisJCQlicmVhazsKKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKHByZXYpCisJCXByZXYtPm5leHQgPSBpbnN0LT5uZXh0OworCWVsc2UKKwkJaW5zdGFuY2VfbGlzdCA9IGluc3QtPm5leHQ7CisJaWYgKHZlcmJvc2UgPiAxKQorCQlwcmludGYoIkZpbmlzaGVkIHdpdGggJXMgKGV4aXQgc3RhdHVzICVkKVxuIiwKKwkJCWluc3QtPmRldmljZSwgc3RhdHVzKTsKKwludW1fcnVubmluZy0tOworCWZyZWVfaW5zdGFuY2UoaW5zdCk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogV2FpdCB1bnRpbCBhbGwgZXhlY3V0aW5nIGNoaWxkIHByb2Nlc3NlcyBoYXZlIGV4aXRlZDsgcmV0dXJuIHRoZQorICogbG9naWNhbCBPUiBvZiBhbGwgb2YgdGhlaXIgZXhpdCBjb2RlIHZhbHVlcy4KKyAqLworI2RlZmluZSBGTEFHX1dBSVRfQUxMICAgICAgICAgICAwCisjZGVmaW5lIEZMQUdfV0FJVF9BVExFQVNUX09ORSAgIFdOT0hBTkcKK3N0YXRpYyBpbnQgd2FpdF9tYW55KGludCBmbGFncykKK3sKKwlpbnQgZXhpdF9zdGF0dXM7CisJaW50IGdsb2JhbF9zdGF0dXMgPSAwOworCWludCB3YWl0X2ZsYWdzID0gMDsKKworCXdoaWxlICgoZXhpdF9zdGF0dXMgPSB3YWl0X29uZSh3YWl0X2ZsYWdzKSkgIT0gLTEpIHsKKwkJZ2xvYmFsX3N0YXR1cyB8PSBleGl0X3N0YXR1czsKKwkJd2FpdF9mbGFncyB8PSBmbGFnczsKKwl9CisJcmV0dXJuIGdsb2JhbF9zdGF0dXM7Cit9CisKKy8qCisgKiBFeGVjdXRlIGEgcGFydGljdWxhciBmc2NrIHByb2dyYW0sIGFuZCBsaW5rIGl0IGludG8gdGhlIGxpc3Qgb2YKKyAqIGNoaWxkIHByb2Nlc3NlcyB3ZSBhcmUgd2FpdGluZyBmb3IuCisgKi8KK3N0YXRpYyB2b2lkIGV4ZWN1dGUoY29uc3QgY2hhciAqdHlwZSwgY29uc3QgY2hhciAqZGV2aWNlLAorCQljb25zdCBjaGFyICptbnRwdCAvKiwgaW50IGludGVyYWN0aXZlICovKQoreworCWludCBpOworCXN0cnVjdCBmc2NrX2luc3RhbmNlICppbnN0OworCXBpZF90IHBpZDsKKworCWFyZ3NbMF0gPSB4YXNwcmludGYoImZzY2suJXMiLCB0eXBlKTsKKworI2lmIERPX1BST0dSRVNTX0lORElDQVRPUgorCWlmIChwcm9ncmVzcyAmJiAhcHJvZ3Jlc3NfYWN0aXZlKCkpIHsKKwkJaWYgKHN0cmNtcCh0eXBlLCAiZXh0MiIpID09IDAKKwkJIHx8IHN0cmNtcCh0eXBlLCAiZXh0MyIpID09IDAKKwkJKSB7CisJCQlhcmdzW1hYWF0gPSB4YXNwcmludGYoIi1DJWQiLCBwcm9ncmVzc19mZCk7IC8qIDEgKi8KKwkJCWluc3QtPmZsYWdzIHw9IEZMQUdfUFJPR1JFU1M7CisJCX0KKwl9CisjZW5kaWYKKworCWFyZ3NbbnVtX2FyZ3MgLSAyXSA9IChjaGFyKilkZXZpY2U7CisJLyogYXJnc1tudW1fYXJncyAtIDFdID0gTlVMTDsgLSBhbHJlYWR5IGlzICovCisKKwlpZiAodmVyYm9zZSB8fCBub2V4ZWN1dGUpIHsKKwkJcHJpbnRmKCJbJXMgKCVkKSAtLSAlc10iLCBhcmdzWzBdLCBudW1fcnVubmluZywKKwkJCQkJbW50cHQgPyBtbnRwdCA6IGRldmljZSk7CisJCWZvciAoaSA9IDA7IGFyZ3NbaV07IGkrKykKKwkJCXByaW50ZigiICVzIiwgYXJnc1tpXSk7CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfQorCisJLyogRm9yayBhbmQgZXhlY3V0ZSB0aGUgY29ycmVjdCBwcm9ncmFtLiAqLworCXBpZCA9IC0xOworCWlmICghbm9leGVjdXRlKSB7CisJCXBpZCA9IHNwYXduKGFyZ3MpOworCQlpZiAocGlkIDwgMCkKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGFyZ3NbMF0pOworCX0KKworI2lmIERPX1BST0dSRVNTX0lORElDQVRPUgorCWZyZWUoYXJnc1tYWFhdKTsKKyNlbmRpZgorCisJLyogTm8gY2hpbGQsIHNvIGRvbid0IHJlY29yZCBhbiBpbnN0YW5jZSAqLworCWlmIChwaWQgPD0gMCkgeworCQlmcmVlKGFyZ3NbMF0pOworCQlyZXR1cm47CisJfQorCisJaW5zdCA9IHh6YWxsb2Moc2l6ZW9mKCppbnN0KSk7CisJaW5zdC0+cGlkID0gcGlkOworCWluc3QtPnByb2cgPSBhcmdzWzBdOworCWluc3QtPmRldmljZSA9IHhzdHJkdXAoZGV2aWNlKTsKKwlpbnN0LT5iYXNlX2RldmljZSA9IGJhc2VfZGV2aWNlKGRldmljZSk7CisjaWYgRE9fUFJPR1JFU1NfSU5ESUNBVE9SCisJaW5zdC0+c3RhcnRfdGltZSA9IHRpbWUoTlVMTCk7CisjZW5kaWYKKworCS8qIEFkZCB0byB0aGUgbGlzdCBvZiBydW5uaW5nIGZzY2sncy4KKwkgKiAod2FzIGFkZGluZyB0byB0aGUgZW5kLCBidXQgYWRkaW5nIHRvIHRoZSBmcm9udCBpcyBzaW1wbGVyLi4uKSAqLworCWluc3QtPm5leHQgPSBpbnN0YW5jZV9saXN0OworCWluc3RhbmNlX2xpc3QgPSBpbnN0OworfQorCisvKgorICogUnVuIHRoZSBmc2NrIHByb2dyYW0gb24gYSBwYXJ0aWN1bGFyIGRldmljZQorICoKKyAqIElmIHRoZSB0eXBlIGlzIHNwZWNpZmllZCB1c2luZyAtdCwgYW5kIGl0IGlzbid0IHByZWZpeGVkIHdpdGggIm5vIgorICogKGFzIGluICJub2V4dDIiKSBhbmQgb25seSBvbmUgZmlsZXN5c3RlbSB0eXBlIGlzIHNwZWNpZmllZCwgdGhlbgorICogdXNlIHRoYXQgdHlwZSByZWdhcmRsZXNzIG9mIHdoYXQgaXMgc3BlY2lmaWVkIGluIC9ldGMvZnN0YWIuCisgKgorICogSWYgdGhlIHR5cGUgaXNuJ3Qgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLCB0aGVuIHVzZSBlaXRoZXIgdGhlIHR5cGUKKyAqIHNwZWNpZmllZCBpbiAvZXRjL2ZzdGFiLCBvciAiYXV0byIuCisgKi8KK3N0YXRpYyB2b2lkIGZzY2tfZGV2aWNlKHN0cnVjdCBmc19pbmZvICpmcyAvKiwgaW50IGludGVyYWN0aXZlICovKQoreworCWNvbnN0IGNoYXIgKnR5cGU7CisKKwlpZiAoc3RyY21wKGZzLT50eXBlLCAiYXV0byIpICE9IDApIHsKKwkJdHlwZSA9IGZzLT50eXBlOworCQlpZiAodmVyYm9zZSA+IDIpCisJCQliYl9pbmZvX21zZygidXNpbmcgZmlsZXN5c3RlbSB0eXBlICclcycgJXMiLAorCQkJCQl0eXBlLCAiZnJvbSBmc3RhYiIpOworCX0gZWxzZSBpZiAoZnN0eXBlCisJICYmIChmc3R5cGVbMF0gIT0gJ24nIHx8IGZzdHlwZVsxXSAhPSAnbycpIC8qICE9ICJubyIgKi8KKwkgJiYgIWlzX3ByZWZpeGVkX3dpdGgoZnN0eXBlLCAib3B0cz0iKQorCSAmJiAhaXNfcHJlZml4ZWRfd2l0aChmc3R5cGUsICJsb29wIikKKwkgJiYgIXN0cmNocihmc3R5cGUsICcsJykKKwkpIHsKKwkJdHlwZSA9IGZzdHlwZTsKKwkJaWYgKHZlcmJvc2UgPiAyKQorCQkJYmJfaW5mb19tc2coInVzaW5nIGZpbGVzeXN0ZW0gdHlwZSAnJXMnICVzIiwKKwkJCQkJdHlwZSwgImZyb20gLXQiKTsKKwl9IGVsc2UgeworCQl0eXBlID0gImF1dG8iOworCQlpZiAodmVyYm9zZSA+IDIpCisJCQliYl9pbmZvX21zZygidXNpbmcgZmlsZXN5c3RlbSB0eXBlICclcycgJXMiLAorCQkJCQl0eXBlLCAiKGRlZmF1bHQpIik7CisJfQorCisJbnVtX3J1bm5pbmcrKzsKKwlleGVjdXRlKHR5cGUsIGZzLT5kZXZpY2UsIGZzLT5tb3VudHB0IC8qLCBpbnRlcmFjdGl2ZSAqLyk7Cit9CisKKy8qCisgKiBSZXR1cm5zIFRSVUUgaWYgYSBwYXJ0aXRpb24gb24gdGhlIHNhbWUgZGlzayBpcyBhbHJlYWR5IGJlaW5nCisgKiBjaGVja2VkLgorICovCitzdGF0aWMgaW50IGRldmljZV9hbHJlYWR5X2FjdGl2ZShjaGFyICpkZXZpY2UpCit7CisJc3RydWN0IGZzY2tfaW5zdGFuY2UgKmluc3Q7CisJY2hhciAqYmFzZTsKKworCWlmIChmb3JjZV9hbGxfcGFyYWxsZWwpCisJCXJldHVybiAwOworCisjaWZkZWYgQkFTRV9NRAorCS8qIERvbid0IGNoZWNrIGEgc29mdCByYWlkIGRpc2sgd2l0aCBhbnkgb3RoZXIgZGlzayAqLworCWlmIChpbnN0YW5jZV9saXN0CisJICYmIChpc19wcmVmaXhlZF93aXRoKGluc3RhbmNlX2xpc3QtPmRldmljZSwgQkFTRV9NRCkKKwkgICAgIHx8IGlzX3ByZWZpeGVkX3dpdGgoZGV2aWNlLCBCQVNFX01EKSkKKwkpIHsKKwkJcmV0dXJuIDE7CisJfQorI2VuZGlmCisKKwliYXNlID0gYmFzZV9kZXZpY2UoZGV2aWNlKTsKKwkvKgorCSAqIElmIHdlIGRvbid0IGtub3cgdGhlIGJhc2UgZGV2aWNlLCBhc3N1bWUgdGhhdCB0aGUgZGV2aWNlIGlzCisJICogYWxyZWFkeSBhY3RpdmUgaWYgdGhlcmUgYXJlIGFueSBmc2NrIGluc3RhbmNlcyBydW5uaW5nLgorCSAqLworCWlmICghYmFzZSkKKwkJcmV0dXJuIChpbnN0YW5jZV9saXN0ICE9IE5VTEwpOworCisJZm9yIChpbnN0ID0gaW5zdGFuY2VfbGlzdDsgaW5zdDsgaW5zdCA9IGluc3QtPm5leHQpIHsKKwkJaWYgKCFpbnN0LT5iYXNlX2RldmljZSB8fCAhc3RyY21wKGJhc2UsIGluc3QtPmJhc2VfZGV2aWNlKSkgeworCQkJZnJlZShiYXNlKTsKKwkJCXJldHVybiAxOworCQl9CisJfQorCisJZnJlZShiYXNlKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIGEgcGFydGljdWxhciBvcHRpb24gYXBwZWFycyBpbiBhCisgKiBjb21tYS1kZWxpbWl0ZWQgb3B0aW9ucyBsaXN0CisgKi8KK3N0YXRpYyBpbnQgb3B0X2luX2xpc3QoY2hhciAqb3B0LCBjaGFyICpvcHRsaXN0KQoreworCWNoYXIgKnM7CisJaW50IGxlbjsKKworCWlmICghb3B0bGlzdCkKKwkJcmV0dXJuIDA7CisKKwlsZW4gPSBzdHJsZW4ob3B0KTsKKwlzID0gb3B0bGlzdCAtIDE7CisJd2hpbGUgKDEpIHsKKwkJcyA9IHN0cnN0cihzICsgMSwgb3B0KTsKKwkJaWYgKCFzKQorCQkJcmV0dXJuIDA7CisJCS8qIG5laXRoZXIgIm9wdC4uIiBub3IgInh4eCxvcHQuLiI/ICovCisJCWlmIChzICE9IG9wdGxpc3QgJiYgc1stMV0gIT0gJywnKQorCQkJY29udGludWU7CisJCS8qIG5laXRoZXIgIi4ub3B0IiBub3IgIi4ub3B0LHh4eCI/ICovCisJCWlmIChzW2xlbl0gIT0gJ1wwJyAmJiBzW2xlbl0gIT0gJywnKQorCQkJY29udGludWU7CisJCXJldHVybiAxOworCX0KK30KKworLyogU2VlIGlmIHRoZSBmaWxlc3lzdGVtIG1hdGNoZXMgdGhlIGNyaXRlcmlhIGdpdmVuIGJ5IHRoZSAtdCBvcHRpb24gKi8KK3N0YXRpYyBpbnQgZnNfbWF0Y2goc3RydWN0IGZzX2luZm8gKmZzKQoreworCWludCBuLCByZXQsIGNoZWNrZWRfdHlwZTsKKwljaGFyICpjcDsKKworCWlmICghZnNfdHlwZV9saXN0KQorCQlyZXR1cm4gMTsKKworCXJldCA9IDA7CisJY2hlY2tlZF90eXBlID0gMDsKKwluID0gMDsKKwl3aGlsZSAoMSkgeworCQljcCA9IGZzX3R5cGVfbGlzdFtuXTsKKwkJaWYgKCFjcCkKKwkJCWJyZWFrOworCQlzd2l0Y2ggKGZzX3R5cGVfZmxhZ1tuXSkgeworCQljYXNlIEZTX1RZUEVfRkxBR19OT1JNQUw6CisJCQljaGVja2VkX3R5cGUrKzsKKwkJCWlmIChzdHJjbXAoY3AsIGZzLT50eXBlKSA9PSAwKQorCQkJCXJldCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSBGU19UWVBFX0ZMQUdfTkVHT1BUOgorCQkJaWYgKG9wdF9pbl9saXN0KGNwLCBmcy0+b3B0cykpCisJCQkJcmV0dXJuIDA7CisJCQlicmVhazsKKwkJY2FzZSBGU19UWVBFX0ZMQUdfT1BUOgorCQkJaWYgKCFvcHRfaW5fbGlzdChjcCwgZnMtPm9wdHMpKQorCQkJCXJldHVybiAwOworCQkJYnJlYWs7CisJCX0KKwkJbisrOworCX0KKwlpZiAoY2hlY2tlZF90eXBlID09IDApCisJCXJldHVybiAxOworCisJcmV0dXJuIChmc190eXBlX25lZ2F0ZWQgPyAhcmV0IDogcmV0KTsKK30KKworLyogQ2hlY2sgaWYgd2Ugc2hvdWxkIGlnbm9yZSB0aGlzIGZpbGVzeXN0ZW0uICovCitzdGF0aWMgaW50IGlnbm9yZShzdHJ1Y3QgZnNfaW5mbyAqZnMpCit7CisJLyoKKwkgKiBJZiB0aGUgcGFzcyBudW1iZXIgaXMgMCwgaWdub3JlIGl0LgorCSAqLworCWlmIChmcy0+cGFzc25vID09IDApCisJCXJldHVybiAxOworCisJLyoKKwkgKiBJZiBhIHNwZWNpZmljIGZzdHlwZSBpcyBzcGVjaWZpZWQsIGFuZCBpdCBkb2Vzbid0IG1hdGNoLAorCSAqIGlnbm9yZSBpdC4KKwkgKi8KKwlpZiAoIWZzX21hdGNoKGZzKSkKKwkJcmV0dXJuIDE7CisKKwkvKiBBcmUgd2UgaWdub3JpbmcgdGhpcyB0eXBlPyAqLworCWlmIChpbmRleF9pbl9zdHJpbmdzKGlnbm9yZWRfdHlwZXMsIGZzLT50eXBlKSA+PSAwKQorCQlyZXR1cm4gMTsKKworCS8qIFdlIGNhbiBhbmQgd2FudCB0byBjaGVjayB0aGlzIGZpbGUgc3lzdGVtIHR5cGUuICovCisJcmV0dXJuIDA7Cit9CisKKy8qIENoZWNrIGFsbCBmaWxlIHN5c3RlbXMsIHVzaW5nIHRoZSAvZXRjL2ZzdGFiIHRhYmxlLiAqLworc3RhdGljIGludCBjaGVja19hbGwodm9pZCkKK3sKKwlzdHJ1Y3QgZnNfaW5mbyAqZnM7CisJaW50IHN0YXR1cyA9IEVYSVRfT0s7CisJc21hbGxpbnQgbm90X2RvbmVfeWV0OworCXNtYWxsaW50IHBhc3NfZG9uZTsKKwlpbnQgcGFzc25vOworCisJaWYgKHZlcmJvc2UpCisJCXB1dHMoIkNoZWNraW5nIGFsbCBmaWxlc3lzdGVtcyIpOworCisJLyoKKwkgKiBEbyBhbiBpbml0aWFsIHNjYW4gb3ZlciB0aGUgZmlsZXN5c3RlbTsgbWFyayBmaWxlc3lzdGVtcworCSAqIHdoaWNoIHNob3VsZCBiZSBpZ25vcmVkIGFzIGRvbmUsIGFuZCByZXNvbHZlIGFueSAiYXV0byIKKwkgKiBmaWxlc3lzdGVtIHR5cGVzIChkb25lIGFzIGEgc2lkZS1lZmZlY3Qgb2YgY2FsbGluZyBpZ25vcmUoKSkuCisJICovCisJZm9yIChmcyA9IGZpbGVzeXNfaW5mbzsgZnM7IGZzID0gZnMtPm5leHQpCisJCWlmIChpZ25vcmUoZnMpKQorCQkJZnMtPmZsYWdzIHw9IEZMQUdfRE9ORTsKKworCS8qCisJICogRmluZCBhbmQgY2hlY2sgdGhlIHJvb3QgZmlsZXN5c3RlbS4KKwkgKi8KKwlpZiAoIXBhcmFsbGVsX3Jvb3QpIHsKKwkJZm9yIChmcyA9IGZpbGVzeXNfaW5mbzsgZnM7IGZzID0gZnMtPm5leHQpIHsKKwkJCWlmIChMT05FX0NIQVIoZnMtPm1vdW50cHQsICcvJykpIHsKKwkJCQlpZiAoIXNraXBfcm9vdCAmJiAhaWdub3JlKGZzKSkgeworCQkJCQlmc2NrX2RldmljZShmcyAvKiwgMSovKTsKKwkJCQkJc3RhdHVzIHw9IHdhaXRfbWFueShGTEFHX1dBSVRfQUxMKTsKKwkJCQkJaWYgKHN0YXR1cyA+IEVYSVRfTk9OREVTVFJVQ1QpCisJCQkJCQlyZXR1cm4gc3RhdHVzOworCQkJCX0KKwkJCQlmcy0+ZmxhZ3MgfD0gRkxBR19ET05FOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCS8qCisJICogVGhpcyBpcyBmb3IgdGhlIGJvbmUtaGVhZGVkIHVzZXIgd2hvIGhhcyByb290CisJICogZmlsZXN5c3RlbSBsaXN0ZWQgdHdpY2UuCisJICogIlNraXAgcm9vdCIgd2lsbCBza2lwIF9hbGxfIHJvb3QgZW50cmllcy4KKwkgKi8KKwlpZiAoc2tpcF9yb290KQorCQlmb3IgKGZzID0gZmlsZXN5c19pbmZvOyBmczsgZnMgPSBmcy0+bmV4dCkKKwkJCWlmIChMT05FX0NIQVIoZnMtPm1vdW50cHQsICcvJykpCisJCQkJZnMtPmZsYWdzIHw9IEZMQUdfRE9ORTsKKworCW5vdF9kb25lX3lldCA9IDE7CisJcGFzc25vID0gMTsKKwl3aGlsZSAobm90X2RvbmVfeWV0KSB7CisJCW5vdF9kb25lX3lldCA9IDA7CisJCXBhc3NfZG9uZSA9IDE7CisKKwkJZm9yIChmcyA9IGZpbGVzeXNfaW5mbzsgZnM7IGZzID0gZnMtPm5leHQpIHsKKwkJCWlmIChiYl9nb3Rfc2lnbmFsKQorCQkJCWJyZWFrOworCQkJaWYgKGZzLT5mbGFncyAmIEZMQUdfRE9ORSkKKwkJCQljb250aW51ZTsKKwkJCS8qCisJCQkgKiBJZiB0aGUgZmlsZXN5c3RlbSdzIHBhc3MgbnVtYmVyIGlzIGhpZ2hlcgorCQkJICogdGhhbiB0aGUgY3VycmVudCBwYXNzIG51bWJlciwgdGhlbiB3ZSBkaWRuJ3QKKwkJCSAqIGRvIGl0IHlldC4KKwkJCSAqLworCQkJaWYgKGZzLT5wYXNzbm8gPiBwYXNzbm8pIHsKKwkJCQlub3RfZG9uZV95ZXQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyoKKwkJCSAqIElmIGEgZmlsZXN5c3RlbSBvbiBhIHBhcnRpY3VsYXIgZGV2aWNlIGhhcworCQkJICogYWxyZWFkeSBiZWVuIHNwYXduZWQsIHRoZW4gd2UgbmVlZCB0byBkZWZlcgorCQkJICogdGhpcyB0byBhbm90aGVyIHBhc3MuCisJCQkgKi8KKwkJCWlmIChkZXZpY2VfYWxyZWFkeV9hY3RpdmUoZnMtPmRldmljZSkpIHsKKwkJCQlwYXNzX2RvbmUgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyoKKwkJCSAqIFNwYXduIG9mZiB0aGUgZnNjayBwcm9jZXNzCisJCQkgKi8KKwkJCWZzY2tfZGV2aWNlKGZzIC8qLCBzZXJpYWxpemUqLyk7CisJCQlmcy0+ZmxhZ3MgfD0gRkxBR19ET05FOworCisJCQkvKgorCQkJICogT25seSBkbyBvbmUgZmlsZXN5c3RlbSBhdCBhIHRpbWUsIG9yIGlmIHdlCisJCQkgKiBoYXZlIGEgbGltaXQgb24gdGhlIG51bWJlciBvZiBmc2NrJ3MgZXh0YW50CisJCQkgKiBhdCBvbmUgdGltZSwgYXBwbHkgdGhhdCBsaW1pdC4KKwkJCSAqLworCQkJaWYgKHNlcmlhbGl6ZQorCQkJIHx8IChtYXhfcnVubmluZyAmJiAobnVtX3J1bm5pbmcgPj0gbWF4X3J1bm5pbmcpKQorCQkJKSB7CisJCQkJcGFzc19kb25lID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoYmJfZ290X3NpZ25hbCkKKwkJCWJyZWFrOworCQlpZiAodmVyYm9zZSA+IDEpCisJCQlwcmludGYoIi0td2FpdGluZy0tIChwYXNzICVkKVxuIiwgcGFzc25vKTsKKwkJc3RhdHVzIHw9IHdhaXRfbWFueShwYXNzX2RvbmUgPyBGTEFHX1dBSVRfQUxMIDoKKwkJCQlGTEFHX1dBSVRfQVRMRUFTVF9PTkUpOworCQlpZiAocGFzc19kb25lKSB7CisJCQlpZiAodmVyYm9zZSA+IDEpCisJCQkJcHV0cygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCQkJcGFzc25vKys7CisJCX0gZWxzZQorCQkJbm90X2RvbmVfeWV0ID0gMTsKKwl9CisJa2lsbF9hbGxfaWZfZ290X3NpZ25hbCgpOworCXN0YXR1cyB8PSB3YWl0X21hbnkoRkxBR19XQUlUX0FUTEVBU1RfT05FKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKgorICogRGVhbCB3aXRoIHRoZSBmc2NrIC10IGFyZ3VtZW50LgorICogSHVoLCBmb3IgbW91bnQgIi10IG5vdmZhdCxuZnMiIG1lYW5zICJuZWl0aGVyIHZmYXQgbm9yIG5mcyIhCisgKiBXaHkgaGVyZSB3ZSByZXF1aXJlICItdCBub3ZmYXQsbm9uZnMiID8/CisgKi8KK3N0YXRpYyB2b2lkIGNvbXBpbGVfZnNfdHlwZShjaGFyICpmc190eXBlKQoreworCWNoYXIgKnM7CisJaW50IG51bSA9IDI7CisJc21hbGxpbnQgbmVnYXRlOworCisJcyA9IGZzX3R5cGU7CisJd2hpbGUgKChzID0gc3RyY2hyKHMsICcsJykpKSB7CisJCW51bSsrOworCQlzKys7CisJfQorCisJZnNfdHlwZV9saXN0ID0geHphbGxvYyhudW0gKiBzaXplb2YoZnNfdHlwZV9saXN0WzBdKSk7CisJZnNfdHlwZV9mbGFnID0geHphbGxvYyhudW0gKiBzaXplb2YoZnNfdHlwZV9mbGFnWzBdKSk7CisJZnNfdHlwZV9uZWdhdGVkID0gLTE7IC8qIG5vdCB5ZXQga25vd24gaXMgaXQgbmVnYXRlZCBvciBub3QgKi8KKworCW51bSA9IDA7CisJcyA9IGZzX3R5cGU7CisJd2hpbGUgKDEpIHsKKwkJY2hhciAqY29tbWE7CisKKwkJbmVnYXRlID0gMDsKKwkJaWYgKHNbMF0gPT0gJ24nICYmIHNbMV0gPT0gJ28nKSB7IC8qICJuby4uIiAqLworCQkJcyArPSAyOworCQkJbmVnYXRlID0gMTsKKwkJfSBlbHNlIGlmIChzWzBdID09ICchJykgeworCQkJcysrOworCQkJbmVnYXRlID0gMTsKKwkJfQorCisJCWlmIChzdHJjbXAocywgImxvb3AiKSA9PSAwKQorCQkJLyogbG9vcCBpcyByZWFsbHkgc2hvcnQtaGFuZCBmb3Igb3B0cz1sb29wICovCisJCQlnb3RvIGxvb3Bfc3BlY2lhbF9jYXNlOworCQlpZiAoaXNfcHJlZml4ZWRfd2l0aChzLCAib3B0cz0iKSkgeworCQkJcyArPSA1OworIGxvb3Bfc3BlY2lhbF9jYXNlOgorCQkJZnNfdHlwZV9mbGFnW251bV0gPSBuZWdhdGUgPyBGU19UWVBFX0ZMQUdfTkVHT1BUIDogRlNfVFlQRV9GTEFHX09QVDsKKwkJfSBlbHNlIHsKKwkJCWlmIChmc190eXBlX25lZ2F0ZWQgPT0gLTEpCisJCQkJZnNfdHlwZV9uZWdhdGVkID0gbmVnYXRlOworCQkJaWYgKGZzX3R5cGVfbmVnYXRlZCAhPSBuZWdhdGUpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoCisiZWl0aGVyIGFsbCBvciBub25lIG9mIHRoZSBmaWxlc3lzdGVtIHR5cGVzIHBhc3NlZCB0byAtdCBtdXN0IGJlIHByZWZpeGVkICIKKyJ3aXRoICdubycgb3IgJyEnIik7CisJCX0KKwkJY29tbWEgPSBzdHJjaHIocywgJywnKTsKKwkJZnNfdHlwZV9saXN0W251bSsrXSA9IGNvbW1hID8geHN0cm5kdXAocywgY29tbWEtcykgOiB4c3RyZHVwKHMpOworCQlpZiAoIWNvbW1hKQorCQkJYnJlYWs7CisJCXMgPSBjb21tYSArIDE7CisJfQorfQorCitzdGF0aWMgY2hhciAqKm5ld19hcmdzKHZvaWQpCit7CisJYXJncyA9IHhyZWFsbG9jX3ZlY3RvcihhcmdzLCAyLCBudW1fYXJncyk7CisJcmV0dXJuICZhcmdzW251bV9hcmdzKytdOworfQorCitpbnQgZnNja19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZnNja19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGksIHN0YXR1czsKKwkvKmludCBpbnRlcmFjdGl2ZTsqLworCXN0cnVjdCBmc19pbmZvICpmczsKKwljb25zdCBjaGFyICpmc3RhYjsKKwljaGFyICp0bXA7CisJY2hhciAqKmRldmljZXM7CisJaW50IG51bV9kZXZpY2VzOworCXNtYWxsaW50IG9wdHNfZm9yX2ZzY2s7CisJc21hbGxpbnQgZG9hbGw7CisJc21hbGxpbnQgbm90aXRsZTsKKworCS8qIHdlIHdhbnQgd2FpdCgpIHRvIGJlIGludGVycnVwdGlibGUgKi8KKwlzaWduYWxfbm9fU0FfUkVTVEFSVF9lbXB0eV9tYXNrKFNJR0lOVCwgcmVjb3JkX3NpZ25vKTsKKwlzaWduYWxfbm9fU0FfUkVTVEFSVF9lbXB0eV9tYXNrKFNJR1RFUk0sIHJlY29yZF9zaWdubyk7CisKKwlzZXRidWYoc3Rkb3V0LCBOVUxMKTsKKworCW9wdHNfZm9yX2ZzY2sgPSBkb2FsbCA9IG5vdGl0bGUgPSAwOworCWRldmljZXMgPSBOVUxMOworCW51bV9kZXZpY2VzID0gMDsKKwluZXdfYXJncygpOyAvKiBhcmdzWzBdID0gTlVMTCwgd2lsbCBiZSByZXBsYWNlZCBieSBmc2NrLjx0eXBlPiAqLworCS8qIGluc3RhbmNlX2xpc3QgPSBOVUxMOyAtIGluIGJzcywgc28gYWxyZWFkeSB6ZXJvZWQgKi8KKworCXdoaWxlICgqKythcmd2KSB7CisJCWludCBqOworCQlpbnQgb3B0cG9zOworCQljaGFyICpvcHRpb25zOworCQljaGFyICphcmcgPSAqYXJndjsKKworCQkvKiAiL2Rldi9ibGsiIG9yICIvcGF0aCIgb3IgIlVVSUQ9eHh4IiBvciAiTEFCRUw9eHh4IiAqLworCQlpZiAoKGFyZ1swXSA9PSAnLycgJiYgIW9wdHNfZm9yX2ZzY2spIHx8IHN0cmNocihhcmcsICc9JykpIHsKKy8vIEZJWE1FOiBtdXN0IGNoZWNrIHRoYXQgYXJnIGlzIGEgYmxrZGV2LCBvciByZXNvbHZlCisvLyAiL3BhdGgiLCAiVVVJRD14eHgiIG9yICJMQUJFTD14eHgiIGludG8gYmxvY2sgZGV2aWNlIG5hbWUKKy8vICgiVVVJRD14eHgiLyJMQUJFTD14eHgiIGNhbiBwcm9iYWJseSBzaGlmdGVkIHRvIGZzY2suYXV0byBkdXRpZXMpCisJCQlkZXZpY2VzID0geHJlYWxsb2NfdmVjdG9yKGRldmljZXMsIDIsIG51bV9kZXZpY2VzKTsKKwkJCWRldmljZXNbbnVtX2RldmljZXMrK10gPSBhcmc7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChhcmdbMF0gIT0gJy0nIHx8IG9wdHNfZm9yX2ZzY2spIHsKKwkJCSpuZXdfYXJncygpID0gYXJnOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoTE9ORV9DSEFSKGFyZyArIDEsICctJykpIHsgLyogIi0tIiA/ICovCisJCQlvcHRzX2Zvcl9mc2NrID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJb3B0cG9zID0gMDsKKwkJb3B0aW9ucyA9IE5VTEw7CisJCWZvciAoaiA9IDE7IGFyZ1tqXTsgaisrKSB7CisJCQlzd2l0Y2ggKGFyZ1tqXSkgeworCQkJY2FzZSAnQSc6CisJCQkJZG9hbGwgPSAxOworCQkJCWJyZWFrOworI2lmIERPX1BST0dSRVNTX0lORElDQVRPUgorCQkJY2FzZSAnQyc6CisJCQkJcHJvZ3Jlc3MgPSAxOworCQkJCWlmIChhcmdbKytqXSkgeyAvKiAtQ24gKi8KKwkJCQkJcHJvZ3Jlc3NfZmQgPSB4YXRvaV9wb3NpdGl2ZSgmYXJnW2pdKTsKKwkJCQkJZ290byBuZXh0X2FyZzsKKwkJCQl9CisJCQkJLyogLUMgbiAqLworCQkJCWlmICghKisrYXJndikKKwkJCQkJYmJfc2hvd191c2FnZSgpOworCQkJCXByb2dyZXNzX2ZkID0geGF0b2lfcG9zaXRpdmUoKmFyZ3YpOworCQkJCWdvdG8gbmV4dF9hcmc7CisjZW5kaWYKKwkJCWNhc2UgJ1YnOgorCQkJCXZlcmJvc2UrKzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ04nOgorCQkJCW5vZXhlY3V0ZSA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdSJzoKKwkJCQlza2lwX3Jvb3QgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAnVCc6CisJCQkJbm90aXRsZSA9IDE7CisJCQkJYnJlYWs7CisvKgkJCWNhc2UgJ00nOgorCQkJCWxpa2VfbW91bnQgPSAxOworCQkJCWJyZWFrOyAqLworCQkJY2FzZSAnUCc6CisJCQkJcGFyYWxsZWxfcm9vdCA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdzJzoKKwkJCQlzZXJpYWxpemUgPSAxOworCQkJCWJyZWFrOworCQkJY2FzZSAndCc6CisJCQkJaWYgKGZzdHlwZSkKKwkJCQkJYmJfc2hvd191c2FnZSgpOworCQkJCWlmIChhcmdbKytqXSkKKwkJCQkJdG1wID0gJmFyZ1tqXTsKKwkJCQllbHNlIGlmICgqKythcmd2KQorCQkJCQl0bXAgPSAqYXJndjsKKwkJCQllbHNlCisJCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCQlmc3R5cGUgPSB4c3RyZHVwKHRtcCk7CisJCQkJY29tcGlsZV9mc190eXBlKGZzdHlwZSk7CisJCQkJZ290byBuZXh0X2FyZzsKKwkJCWNhc2UgJz8nOgorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJb3B0cG9zKys7CisJCQkJLyogb25lIGV4dHJhIGZvciAnXDAnICovCisJCQkJb3B0aW9ucyA9IHhyZWFsbG9jKG9wdGlvbnMsIG9wdHBvcyArIDIpOworCQkJCW9wdGlvbnNbb3B0cG9zXSA9IGFyZ1tqXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorIG5leHRfYXJnOgorCQlpZiAob3B0cG9zKSB7CisJCQlvcHRpb25zWzBdID0gJy0nOworCQkJb3B0aW9uc1tvcHRwb3MgKyAxXSA9ICdcMCc7CisJCQkqbmV3X2FyZ3MoKSA9IG9wdGlvbnM7CisJCX0KKwl9CisJaWYgKGdldGVudigiRlNDS19GT1JDRV9BTExfUEFSQUxMRUwiKSkKKwkJZm9yY2VfYWxsX3BhcmFsbGVsID0gMTsKKwl0bXAgPSBnZXRlbnYoIkZTQ0tfTUFYX0lOU1QiKTsKKwlpZiAodG1wKQorCQltYXhfcnVubmluZyA9IHhhdG9pKHRtcCk7CisJbmV3X2FyZ3MoKTsgLyogYXJnc1tudW1fYXJncyAtIDJdIHdpbGwgYmUgcmVwbGFjZWQgYnkgPGRldmljZT4gKi8KKwluZXdfYXJncygpOyAvKiBhcmdzW251bV9hcmdzIC0gMV0gaXMgdGhlIGxhc3QsIE5VTEwgZWxlbWVudCAqLworCisJaWYgKCFub3RpdGxlKQorCQlwdXRzKCJmc2NrIChidXN5Ym94ICJCQl9WRVIiLCAiQkJfQlQiKSIpOworCisJLyogRXZlbiBwbGFpbiAiZnNjayAvZGV2L2hkYTEiIG5lZWRzIGZzdGFiIHRvIGdldCBmcyB0eXBlLAorCSAqIHNvIHdlIGFyZSBzY2FubmluZyBpdCBhbnl3YXkgKi8KKwlmc3RhYiA9IGdldGVudigiRlNUQUJfRklMRSIpOworCWlmICghZnN0YWIpCisJCWZzdGFiID0gIi9ldGMvZnN0YWIiOworCWxvYWRfZnNfaW5mbyhmc3RhYik7CisKKwkvKmludGVyYWN0aXZlID0gKG51bV9kZXZpY2VzID09IDEpIHwgc2VyaWFsaXplOyovCisKKwlpZiAobnVtX2RldmljZXMgPT0gMCkKKwkJLyppbnRlcmFjdGl2ZSA9Ki8gc2VyaWFsaXplID0gZG9hbGwgPSAxOworCWlmIChkb2FsbCkKKwkJcmV0dXJuIGNoZWNrX2FsbCgpOworCisJc3RhdHVzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2RldmljZXM7IGkrKykgeworCQlpZiAoYmJfZ290X3NpZ25hbCkgeworCQkJa2lsbF9hbGxfaWZfZ290X3NpZ25hbCgpOworCQkJYnJlYWs7CisJCX0KKworCQlmcyA9IGxvb2t1cChkZXZpY2VzW2ldKTsKKwkJaWYgKCFmcykKKwkJCWZzID0gY3JlYXRlX2ZzX2RldmljZShkZXZpY2VzW2ldLCAiIiwgImF1dG8iLCBOVUxMLCAtMSk7CisJCWZzY2tfZGV2aWNlKGZzIC8qLCBpbnRlcmFjdGl2ZSAqLyk7CisKKwkJaWYgKHNlcmlhbGl6ZQorCQkgfHwgKG1heF9ydW5uaW5nICYmIChudW1fcnVubmluZyA+PSBtYXhfcnVubmluZykpCisJCSkgeworCQkJaW50IGV4aXRfc3RhdHVzID0gd2FpdF9vbmUoMCk7CisJCQlpZiAoZXhpdF9zdGF0dXMgPj0gMCkKKwkJCQlzdGF0dXMgfD0gZXhpdF9zdGF0dXM7CisJCQlpZiAodmVyYm9zZSA+IDEpCisJCQkJcHV0cygiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworCQl9CisJfQorCXN0YXR1cyB8PSB3YWl0X21hbnkoRkxBR19XQUlUX0FMTCk7CisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2UyZnNwcm9ncy9sc2F0dHIuYyBiL2UyZnNwcm9ncy9sc2F0dHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzEyZmU3Ci0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL2xzYXR0ci5jCkBAIC0wLDAgKzEsMTIwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBsc2F0dHIuYwkJLSBMaXN0IGZpbGUgYXR0cmlidXRlcyBvbiBhbiBleHQyIGZpbGUgc3lzdGVtCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkzLCAxOTk0ICBSZW15IENhcmQgPGNhcmRAbWFzaS5pYnAuZnI+CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIExhYm9yYXRvaXJlIE1BU0ksIEluc3RpdHV0IEJsYWlzZSBQYXNjYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqIFRoaXMgZmlsZSBjYW4gYmUgcmVkaXN0cmlidXRlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsCisgKiBQdWJsaWMgTGljZW5zZQorICovCisKKy8qCisgKiBIaXN0b3J5OgorICogOTMvMTAvMzAJLSBDcmVhdGlvbgorICogOTMvMTEvMTMJLSBSZXBsYWNlIHN0YXQoKSBjYWxscyBieSBsc3RhdCgpIHRvIGF2b2lkIGxvb3BzCisgKiA5NC8wMi8yNwktIEludGVncmF0ZWQgaW4gVGVkJ3MgZGlzdHJpYnV0aW9uCisgKiA5OC8xMi8yOQktIERpc3BsYXkgdmVyc2lvbiBpbmZvIG9ubHkgd2hlbiAtViBzcGVjaWZpZWQgKEcgTSBTaXBlKQorICovCisKKy8vdXNhZ2U6I2RlZmluZSBsc2F0dHJfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstUmFkbHZdIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBsc2F0dHJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJMaXN0IGZpbGUgYXR0cmlidXRlcyBvbiBhbiBleHQyIGZzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1SCVJlY3Vyc2UiCisvL3VzYWdlOiAgICAgIlxuCS1hCURvbid0IGhpZGUgZW50cmllcyBzdGFydGluZyB3aXRoIC4iCisvL3VzYWdlOiAgICAgIlxuCS1kCUxpc3QgZGlyZWN0b3J5IGVudHJpZXMgaW5zdGVhZCBvZiBjb250ZW50cyIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGlzdCBsb25nIGZsYWcgbmFtZXMiCisvL3VzYWdlOiAgICAgIlxuCS12CUxpc3QgdGhlIGZpbGUncyB2ZXJzaW9uL2dlbmVyYXRpb24gbnVtYmVyIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJlMmZzX2xpYi5oIgorCitlbnVtIHsKKwlPUFRfUkVDVVIgICAgICA9IDB4MSwKKwlPUFRfQUxMICAgICAgICA9IDB4MiwKKwlPUFRfRElSU19PUFQgICA9IDB4NCwKKwlPUFRfUEZfTE9ORyAgICA9IDB4OCwKKwlPUFRfR0VORVJBVElPTiA9IDB4MTAsCit9OworCitzdGF0aWMgdm9pZCBsaXN0X2F0dHJpYnV0ZXMoY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBsb25nIGZzZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBnZW5lcmF0aW9uOworCisJaWYgKGZnZXRmbGFncyhuYW1lLCAmZnNmbGFncykgIT0gMCkKKwkJZ290byByZWFkX2VycjsKKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX0dFTkVSQVRJT04pIHsKKwkJaWYgKGZnZXR2ZXJzaW9uKG5hbWUsICZnZW5lcmF0aW9uKSAhPSAwKQorCQkJZ290byByZWFkX2VycjsKKwkJcHJpbnRmKCIlNWx1ICIsIGdlbmVyYXRpb24pOworCX0KKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX1BGX0xPTkcpIHsKKwkJcHJpbnRmKCIlLTI4cyAiLCBuYW1lKTsKKwkJcHJpbnRfZTJmbGFncyhzdGRvdXQsIGZzZmxhZ3MsIFBGT1BUX0xPTkcpOworCQliYl9wdXRjaGFyKCdcbicpOworCX0gZWxzZSB7CisJCXByaW50X2UyZmxhZ3Moc3Rkb3V0LCBmc2ZsYWdzLCAwKTsKKwkJcHJpbnRmKCIgJXNcbiIsIG5hbWUpOworCX0KKworCXJldHVybjsKKyByZWFkX2VycjoKKwliYl9wZXJyb3JfbXNnKCJyZWFkaW5nICVzIiwgbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGxzYXR0cl9kaXJfcHJvYyhjb25zdCBjaGFyICpkaXJfbmFtZSwKKwkJc3RydWN0IGRpcmVudCAqZGUsCisJCXZvaWQgKnByaXZhdGUgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCBzdGF0IHN0OworCWNoYXIgKnBhdGg7CisKKwlwYXRoID0gY29uY2F0X3BhdGhfZmlsZShkaXJfbmFtZSwgZGUtPmRfbmFtZSk7CisKKwlpZiAobHN0YXQocGF0aCwgJnN0KSAhPSAwKQorCQliYl9wZXJyb3JfbXNnKCJzdGF0ICVzIiwgcGF0aCk7CisJZWxzZSBpZiAoZGUtPmRfbmFtZVswXSAhPSAnLicgfHwgKG9wdGlvbl9tYXNrMzIgJiBPUFRfQUxMKSkgeworCQlsaXN0X2F0dHJpYnV0ZXMocGF0aCk7CisJCWlmIChTX0lTRElSKHN0LnN0X21vZGUpICYmIChvcHRpb25fbWFzazMyICYgT1BUX1JFQ1VSKQorCQkgJiYgIURPVF9PUl9ET1RET1QoZGUtPmRfbmFtZSkKKwkJKSB7CisJCQlwcmludGYoIlxuJXM6XG4iLCBwYXRoKTsKKwkJCWl0ZXJhdGVfb25fZGlyKHBhdGgsIGxzYXR0cl9kaXJfcHJvYywgTlVMTCk7CisJCQliYl9wdXRjaGFyKCdcbicpOworCQl9CisJfQorCisJZnJlZShwYXRoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbHNhdHRyX2FyZ3MoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChsc3RhdChuYW1lLCAmc3QpID09IC0xKSB7CisJCWJiX3BlcnJvcl9tc2coInN0YXQgJXMiLCBuYW1lKTsKKwl9IGVsc2UgaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkgJiYgIShvcHRpb25fbWFzazMyICYgT1BUX0RJUlNfT1BUKSkgeworCQlpdGVyYXRlX29uX2RpcihuYW1lLCBsc2F0dHJfZGlyX3Byb2MsIE5VTEwpOworCX0gZWxzZSB7CisJCWxpc3RfYXR0cmlidXRlcyhuYW1lKTsKKwl9Cit9CisKK2ludCBsc2F0dHJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGxzYXR0cl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJZ2V0b3B0MzIoYXJndiwgIlJhZGx2Iik7CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoISphcmd2KQorCQkqLS1hcmd2ID0gKGNoYXIqKSIuIjsKKwlkbyBsc2F0dHJfYXJncygqYXJndisrKTsgd2hpbGUgKCphcmd2KTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9lMmZzcHJvZ3MvdHVuZTJmcy5jIGIvZTJmc3Byb2dzL3R1bmUyZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmE3NDVlCi0tLSAvZGV2L251bGwKKysrIGIvZTJmc3Byb2dzL3R1bmUyZnMuYwpAQCAtMCwwICsxLDEwNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdHVuZTJmczogdXRpbGl0eSB0byBtb2RpZnkgRVhUMiBmaWxlc3lzdGVtCisgKgorICogQnVzeWJveCdlZCAoMjAwOSkgYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSAiYmJfZTJmc19kZWZzLmgiCisKKy8vIHN0b3JhZ2UgaGVscGVycworY2hhciBCVUdfd3JvbmdfZmllbGRfc2l6ZSh2b2lkKTsKKyNkZWZpbmUgU1RPUkVfTEUoZmllbGQsIHZhbHVlKSBcCitkbyB7IFwKKwlpZiAoc2l6ZW9mKGZpZWxkKSA9PSA0KSBcCisJCWZpZWxkID0gU1dBUF9MRTMyKHZhbHVlKTsgXAorCWVsc2UgaWYgKHNpemVvZihmaWVsZCkgPT0gMikgXAorCQlmaWVsZCA9IFNXQVBfTEUxNih2YWx1ZSk7IFwKKwllbHNlIGlmIChzaXplb2YoZmllbGQpID09IDEpIFwKKwkJZmllbGQgPSAodmFsdWUpOyBcCisJZWxzZSBcCisJCUJVR193cm9uZ19maWVsZF9zaXplKCk7IFwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgRkVUQ0hfTEUzMihmaWVsZCkgXAorCShzaXplb2YoZmllbGQpID09IDQgPyBTV0FQX0xFMzIoZmllbGQpIDogQlVHX3dyb25nX2ZpZWxkX3NpemUoKSkKKworLy91c2FnZTojZGVmaW5lIHR1bmUyZnNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYyBNQVhfTU9VTlRfQ09VTlRdICIKKy8vLy91c2FnZTogICAgICJbLWUgZXJyb3JzLWJlaGF2aW9yXSBbLWcgZ3JvdXBdICIKKy8vdXNhZ2U6ICAgICAgICJbLWkgREFZU10gIgorLy8vL3VzYWdlOiAgICAgIlstal0gWy1KIGpvdXJuYWwtb3B0aW9uc10gWy1sXSBbLXMgc3BhcnNlLWZsYWddICIKKy8vLy91c2FnZTogICAgICJbLW0gcmVzZXJ2ZWQtYmxvY2tzLXBlcmNlbnRdIFstbyBbXl1tb3VudC1vcHRpb25zWywuLi5dXSAiCisvLy8vdXNhZ2U6ICAgICAiWy1yIHJlc2VydmVkLWJsb2Nrcy1jb3VudF0gWy11IHVzZXJdICIKKy8vdXNhZ2U6ICAgICAgICJbLUMgTU9VTlRfQ09VTlRdICIKKy8vdXNhZ2U6ICAgICAgICJbLUwgTEFCRUxdICIKKy8vLy91c2FnZTogICAgICJbLU0gbGFzdC1tb3VudGVkLWRpcl0gWy1PIFteXWZlYXR1cmVbLC4uLl1dICIKKy8vLy91c2FnZTogICAgICJbLVQgbGFzdC1jaGVjay10aW1lXSBbLVUgVVVJRF0gIgorLy91c2FnZTogICAgICAgIkJMT0NLREVWIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB0dW5lMmZzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQWRqdXN0IGZpbGVzeXN0ZW0gb3B0aW9ucyBvbiBleHRbMjNdIGZpbGVzeXN0ZW1zIgorCitlbnVtIHsKKwlPUFRfTCA9IDEgPDwgMCwgLy8gbGFiZWwKKwlPUFRfYyA9IDEgPDwgMSwgLy8gbWF4IG1vdW50IGNvdW50CisJT1BUX2kgPSAxIDw8IDIsIC8vIGNoZWNrIGludGVydmFsCisJT1BUX0MgPSAxIDw8IDMsIC8vIGN1cnJlbnQgbW91bnQgY291bnQKK307CisKK2ludCB0dW5lMmZzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0dW5lMmZzX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHRzOworCWNvbnN0IGNoYXIgKmxhYmVsLCAqc3RyX2MsICpzdHJfaSwgKnN0cl9DOworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpzYjsKKwlpbnQgZmQ7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MSI7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJMOmM6aTpDOiIsICZsYWJlbCwgJnN0cl9jLCAmc3RyX2ksICZzdHJfQyk7CisJaWYgKCFvcHRzKQorCQliYl9zaG93X3VzYWdlKCk7CisJYXJndiArPSBvcHRpbmQ7IC8vIGFyZ3ZbMF0gLS0gZGV2aWNlCisKKwkvLyByZWFkIHN1cGVyYmxvY2sKKwlmZCA9IHhvcGVuKGFyZ3ZbMF0sIE9fUkRXUik7CisJeGxzZWVrKGZkLCAxMDI0LCBTRUVLX1NFVCk7CisJc2IgPSB4emFsbG9jKDEwMjQpOworCXhyZWFkKGZkLCBzYiwgMTAyNCk7CisKKwkvLyBtYW5nbGUgc3VwZXJibG9jaworCS8vU1RPUkVfTEUoc2ItPnNfd3RpbWUsIHRpbWUoTlVMTCkpOyAtIHdoeSBib3RoZXI/CisKKwlpZiAob3B0cyAmIE9QVF9DKSB7CisJCWludCBuID0geGF0b2lfcmFuZ2Uoc3RyX0MsIDEsIDB4ZmZmZSk7CisJCVNUT1JFX0xFKHNiLT5zX21udF9jb3VudCwgKHVuc2lnbmVkKW4pOworCX0KKworCS8vIHNldCB0aGUgbGFiZWwKKwlpZiAob3B0cyAmIE9QVF9MKQorCQlzYWZlX3N0cm5jcHkoKGNoYXIgKilzYi0+c192b2x1bWVfbmFtZSwgbGFiZWwsIHNpemVvZihzYi0+c192b2x1bWVfbmFtZSkpOworCisJaWYgKG9wdHMgJiBPUFRfYykgeworCQlpbnQgbiA9IHhhdG9pX3JhbmdlKHN0cl9jLCAtMSwgMHhmZmZlKTsKKwkJaWYgKG4gPT0gMCkKKwkJCW4gPSAtMTsKKwkJU1RPUkVfTEUoc2ItPnNfbWF4X21udF9jb3VudCwgKHVuc2lnbmVkKW4pOworCX0KKworCWlmIChvcHRzICYgT1BUX2kpIHsKKwkJdW5zaWduZWQgbiA9IHhhdG91X3JhbmdlKHN0cl9pLCAwLCAodW5zaWduZWQpMHhmZmZmZmZmZiAvICgyNCo2MCo2MCkpICogMjQqNjAqNjA7CisJCVNUT1JFX0xFKHNiLT5zX2NoZWNraW50ZXJ2YWwsIG4pOworCX0KKworCS8vIHdyaXRlIHN1cGVyYmxvY2sKKwl4bHNlZWsoZmQsIDEwMjQsIFNFRUtfU0VUKTsKKwl4d3JpdGUoZmQsIHNiLCAxMDI0KTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlmcmVlKHNiKTsKKwl9CisKKwl4Y2xvc2UoZmQpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9lZGl0b3JzL0NvbmZpZy5zcmMgYi9lZGl0b3JzL0NvbmZpZy5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlOWQ5MgotLS0gL2Rldi9udWxsCisrKyBiL2VkaXRvcnMvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDE4IEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJFZGl0b3JzIgorCitJTlNFUlQKKworY29uZmlnIEZFQVRVUkVfQUxMT1dfRVhFQworCWJvb2wgIkFsbG93IHZpIGFuZCBhd2sgdG8gZXhlY3V0ZSBzaGVsbCBjb21tYW5kcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFZJIHx8IEFXSworCWhlbHAKKwkgIEVuYWJsZXMgdmkgYW5kIGF3ayBmZWF0dXJlcyB3aGljaCBhbGxvd3MgdXNlciB0byBleGVjdXRlCisJICBzaGVsbCBjb21tYW5kcyAodXNpbmcgc3lzdGVtKCkgQyBjYWxsKS4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvZWRpdG9ycy9LYnVpbGQuc3JjIGIvZWRpdG9ycy9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNGZiNzQKLS0tIC9kZXYvbnVsbAorKysgYi9lZGl0b3JzL0tidWlsZC5zcmMKQEAgLTAsMCArMSw5IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKZGlmZiAtLWdpdCBhL2VkaXRvcnMvYXdrLmMgYi9lZGl0b3JzL2F3ay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ODE2NDYKLS0tIC9kZXYvbnVsbAorKysgYi9lZGl0b3JzL2F3ay5jCkBAIC0wLDAgKzEsMzI5MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYXdrIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIGJ5IERtaXRyeSBaYWtoYXJvdiA8ZG1pdEBjcnAuYmFuay5nb3YudWE+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2NvbmZpZzpjb25maWcgQVdLCisvL2NvbmZpZzoJYm9vbCAiYXdrIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEF3ayBpcyB1c2VkIGFzIGEgcGF0dGVybiBzY2FubmluZyBhbmQgcHJvY2Vzc2luZyBsYW5ndWFnZS4gVGhpcyBpcworLy9jb25maWc6CSAgdGhlIEJ1c3lCb3ggaW1wbGVtZW50YXRpb24gb2YgdGhhdCBwcm9ncmFtbWluZyBsYW5ndWFnZS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfQVdLX0xJQk0KKy8vY29uZmlnOglib29sICJFbmFibGUgbWF0aCBmdW5jdGlvbnMgKHJlcXVpcmVzIGxpYm0pIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gQVdLCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIG1hdGggZnVuY3Rpb25zIG9mIHRoZSBBd2sgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuCisvL2NvbmZpZzoJICBOT1RFOiBUaGlzIHdpbGwgcmVxdWlyZSBsaWJtIHRvIGJlIHByZXNlbnQgZm9yIGxpbmtpbmcuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0FXS19HTlVfRVhURU5TSU9OUworLy9jb25maWc6CWJvb2wgIkVuYWJsZSBhIGZldyBHTlUgZXh0ZW5zaW9ucyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEFXSworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBhIGZldyBmZWF0dXJlcyBmcm9tIGdhd2s6CisvL2NvbmZpZzoJICAqIGNvbW1hbmQgbGluZSBvcHRpb24gLWUgQVdLX1BST0dSQU0KKy8vY29uZmlnOgkgICogc2ltdWx0YW5lb3VzIHVzZSBvZiAtZiBhbmQgLWUgb24gdGhlIGNvbW1hbmQgbGluZS4KKy8vY29uZmlnOgkgICAgVGhpcyBlbmFibGVzIHRoZSB1c2Ugb2YgYXdrIGxpYnJhcnkgZmlsZXMuCisvL2NvbmZpZzoJICAgIEV4OiBhd2sgLWYgbXlsaWIuYXdrIC1lICd7cHJpbnQgbXlmdW5jdGlvbigkMSk7fScgLi4uCisKKy8vYXBwbGV0OklGX0FXSyhBUFBMRVRfTk9FWEVDKGF3aywgYXdrLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBhd2spKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfQVdLKSArPSBhd2subworCisvL3VzYWdlOiNkZWZpbmUgYXdrX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gW0FXS19QUk9HUkFNXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgYXdrX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS12IFZBUj1WQUwJU2V0IHZhcmlhYmxlIgorLy91c2FnZTogICAgICJcbgktRiBTRVAJCVVzZSBTRVAgYXMgZmllbGQgc2VwYXJhdG9yIgorLy91c2FnZTogICAgICJcbgktZiBGSUxFCQlSZWFkIHByb2dyYW0gZnJvbSBGSUxFIgorLy91c2FnZToJSUZfRkVBVFVSRV9BV0tfR05VX0VYVEVOU0lPTlMoCisvL3VzYWdlOiAgICAgIlxuCS1lIEFXS19QUk9HUkFNIgorLy91c2FnZToJKQorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ4cmVnZXguaCIKKyNpbmNsdWRlIDxtYXRoLmg+CisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKKworLyogSWYgeW91IGNvbW1lbnQgb3V0IG9uZSBvZiB0aGVzZSBiZWxvdywgaXQgd2lsbCBiZSAjZGVmaW5lZCBsYXRlcgorICogdG8gcGVyZm9ybSBkZWJ1ZyBwcmludGZzIHRvIHN0ZGVycjogKi8KKyNkZWZpbmUgZGVidWdfcHJpbnRmX3dhbGtlciguLi4pICBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgZGVidWdfcHJpbnRmX2V2YWwoLi4uKSAgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGRlYnVnX3ByaW50Zl9wYXJzZSguLi4pICBkbyB7fSB3aGlsZSAoMCkKKworI2lmbmRlZiBkZWJ1Z19wcmludGZfd2Fsa2VyCisjIGRlZmluZSBkZWJ1Z19wcmludGZfd2Fsa2VyKC4uLikgKGZwcmludGYoc3RkZXJyLCBfX1ZBX0FSR1NfXykpCisjZW5kaWYKKyNpZm5kZWYgZGVidWdfcHJpbnRmX2V2YWwKKyMgZGVmaW5lIGRlYnVnX3ByaW50Zl9ldmFsKC4uLikgKGZwcmludGYoc3RkZXJyLCBfX1ZBX0FSR1NfXykpCisjZW5kaWYKKyNpZm5kZWYgZGVidWdfcHJpbnRmX3BhcnNlCisjIGRlZmluZSBkZWJ1Z19wcmludGZfcGFyc2UoLi4uKSAoZnByaW50ZihzdGRlcnIsIF9fVkFfQVJHU19fKSkKKyNlbmRpZgorCisKKyNkZWZpbmUgT1BUU1RSX0FXSyBcCisJIkY6djpmOiIgXAorCUlGX0ZFQVRVUkVfQVdLX0dOVV9FWFRFTlNJT05TKCJlOiIpIFwKKwkiVzoiCisjZGVmaW5lIE9QVENPTVBMU1RSX0FXSyBcCisJInY6OmY6OiIgXAorCUlGX0ZFQVRVUkVfQVdLX0dOVV9FWFRFTlNJT05TKCJlOjoiKQorZW51bSB7CisJT1BUQklUX0YsCS8qIGRlZmluZSBmaWVsZCBzZXBhcmF0b3IgKi8KKwlPUFRCSVRfdiwJLyogZGVmaW5lIHZhcmlhYmxlICovCisJT1BUQklUX2YsCS8qIHB1bGwgaW4gYXdrIHByb2dyYW0gZnJvbSBmaWxlICovCisJSUZfRkVBVFVSRV9BV0tfR05VX0VYVEVOU0lPTlMoT1BUQklUX2UsKSAvKiAtZSBBV0tfUFJPR1JBTSAqLworCU9QVEJJVF9XLAkvKiAtVyBpZ25vcmVkICovCisJT1BUX0YgPSAxIDw8IE9QVEJJVF9GLAorCU9QVF92ID0gMSA8PCBPUFRCSVRfdiwKKwlPUFRfZiA9IDEgPDwgT1BUQklUX2YsCisJT1BUX2UgPSBJRl9GRUFUVVJFX0FXS19HTlVfRVhURU5TSU9OUygoMSA8PCBPUFRCSVRfZSkpICsgMCwKKwlPUFRfVyA9IDEgPDwgT1BUQklUX1cKK307CisKKyNkZWZpbmUJTUFYVkFSRk1UICAgICAgIDI0MAorI2RlZmluZQlNSU5OVkJMT0NLICAgICAgNjQKKworLyogdmFyaWFibGUgZmxhZ3MgKi8KKyNkZWZpbmUJVkZfTlVNQkVSICAgICAgIDB4MDAwMQkvKiAxID0gcHJpbWFyeSB0eXBlIGlzIG51bWJlciAqLworI2RlZmluZQlWRl9BUlJBWSAgICAgICAgMHgwMDAyCS8qIDEgPSBpdCdzIGFuIGFycmF5ICovCisKKyNkZWZpbmUJVkZfQ0FDSEVEICAgICAgIDB4MDEwMAkvKiAxID0gbnVtL3N0ciB2YWx1ZSBoYXMgY2FjaGVkIHN0ci9udW0gZXEgKi8KKyNkZWZpbmUJVkZfVVNFUiAgICAgICAgIDB4MDIwMAkvKiAxID0gdXNlciBpbnB1dCAobWF5IGJlIG51bWVyaWMgc3RyaW5nKSAqLworI2RlZmluZQlWRl9TUEVDSUFMICAgICAgMHgwNDAwCS8qIDEgPSByZXF1aXJlcyBleHRyYSBoYW5kbGluZyB3aGVuIGNoYW5nZWQgKi8KKyNkZWZpbmUJVkZfV0FMSyAgICAgICAgIDB4MDgwMAkvKiAxID0gdmFyaWFibGUgaGFzIGFsbG9jJ2QgeC53YWxrZXIgbGlzdCAqLworI2RlZmluZQlWRl9GU1RSICAgICAgICAgMHgxMDAwCS8qIDEgPSB2YXI6OnN0cmluZyBwb2ludHMgdG8gZnN0cmluZyBidWZmZXIgKi8KKyNkZWZpbmUJVkZfQ0hJTEQgICAgICAgIDB4MjAwMAkvKiAxID0gZnVuY3Rpb24gYXJnOyB4LnBhcmVudCBwb2ludHMgdG8gc291cmNlICovCisjZGVmaW5lCVZGX0RJUlRZICAgICAgICAweDQwMDAJLyogMSA9IHZhcmlhYmxlIHdhcyBzZXQgZXhwbGljaXRseSAqLworCisvKiB0aGVzZSBmbGFncyBhcmUgc3RhdGljLCBkb24ndCBjaGFuZ2UgdGhlbSB3aGVuIHZhbHVlIGlzIGNoYW5nZWQgKi8KKyNkZWZpbmUJVkZfRE9OVFRPVUNIICAgIChWRl9BUlJBWSB8IFZGX1NQRUNJQUwgfCBWRl9XQUxLIHwgVkZfQ0hJTEQgfCBWRl9ESVJUWSkKKwordHlwZWRlZiBzdHJ1Y3Qgd2Fsa2VyX2xpc3QgeworCWNoYXIgKmVuZDsKKwljaGFyICpjdXI7CisJc3RydWN0IHdhbGtlcl9saXN0ICpwcmV2OworCWNoYXIgd2J1ZlsxXTsKK30gd2Fsa2VyX2xpc3Q7CisKKy8qIFZhcmlhYmxlICovCit0eXBlZGVmIHN0cnVjdCB2YXJfcyB7CisJdW5zaWduZWQgdHlwZTsgICAgICAgICAgICAvKiBmbGFncyAqLworCWRvdWJsZSBudW1iZXI7CisJY2hhciAqc3RyaW5nOworCXVuaW9uIHsKKwkJaW50IGFpZHg7ICAgICAgICAgICAgICAgLyogZnVuYyBhcmcgaWR4IChmb3IgY29tcGlsYXRpb24gc3RhZ2UpICovCisJCXN0cnVjdCB4aGFzaF9zICphcnJheTsgIC8qIGFycmF5IHB0ciAqLworCQlzdHJ1Y3QgdmFyX3MgKnBhcmVudDsgICAvKiBmb3IgZnVuYyBhcmdzLCBwdHIgdG8gYWN0dWFsIHBhcmFtZXRlciAqLworCQl3YWxrZXJfbGlzdCAqd2Fsa2VyOyAgICAvKiBsaXN0IG9mIGFycmF5IGVsZW1lbnRzIChmb3IuLmluKSAqLworCX0geDsKK30gdmFyOworCisvKiBOb2RlIGNoYWluIChwYXR0ZXJuLWFjdGlvbiBjaGFpbiwgQkVHSU4sIEVORCwgZnVuY3Rpb24gYm9kaWVzKSAqLwordHlwZWRlZiBzdHJ1Y3QgY2hhaW5fcyB7CisJc3RydWN0IG5vZGVfcyAqZmlyc3Q7CisJc3RydWN0IG5vZGVfcyAqbGFzdDsKKwljb25zdCBjaGFyICpwcm9ncmFtbmFtZTsKK30gY2hhaW47CisKKy8qIEZ1bmN0aW9uICovCit0eXBlZGVmIHN0cnVjdCBmdW5jX3MgeworCXVuc2lnbmVkIG5hcmdzOworCXN0cnVjdCBjaGFpbl9zIGJvZHk7Cit9IGZ1bmM7CisKKy8qIEkvTyBzdHJlYW0gKi8KK3R5cGVkZWYgc3RydWN0IHJzdHJlYW1fcyB7CisJRklMRSAqRjsKKwljaGFyICpidWZmZXI7CisJaW50IGFkdjsKKwlpbnQgc2l6ZTsKKwlpbnQgcG9zOworCXNtYWxsaW50IGlzX3BpcGU7Cit9IHJzdHJlYW07CisKK3R5cGVkZWYgc3RydWN0IGhhc2hfaXRlbV9zIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB2YXJfcyB2OyAgICAgICAgIC8qIHZhcmlhYmxlL2FycmF5IGhhc2ggKi8KKwkJc3RydWN0IHJzdHJlYW1fcyByczsgICAgLyogcmVkaXJlY3Qgc3RyZWFtcyBoYXNoICovCisJCXN0cnVjdCBmdW5jX3MgZjsgICAgICAgIC8qIGZ1bmN0aW9ucyBoYXNoICovCisJfSBkYXRhOworCXN0cnVjdCBoYXNoX2l0ZW1fcyAqbmV4dDsgICAgICAgLyogbmV4dCBpbiBjaGFpbiAqLworCWNoYXIgbmFtZVsxXTsgICAgICAgICAgICAgICAgICAgLyogcmVhbGx5IGl0J3MgbG9uZ2VyICovCit9IGhhc2hfaXRlbTsKKwordHlwZWRlZiBzdHJ1Y3QgeGhhc2hfcyB7CisJdW5zaWduZWQgbmVsOyAgICAgICAgICAgLyogbnVtIG9mIGVsZW1lbnRzICovCisJdW5zaWduZWQgY3NpemU7ICAgICAgICAgLyogY3VycmVudCBoYXNoIHNpemUgKi8KKwl1bnNpZ25lZCBucHJpbWU7ICAgICAgICAvKiBuZXh0IGhhc2ggc2l6ZSBpbiBQUklNRVNbXSAqLworCXVuc2lnbmVkIGdsZW47ICAgICAgICAgIC8qIHN1bW1hcnkgbGVuZ3RoIG9mIGl0ZW0gbmFtZXMgKi8KKwlzdHJ1Y3QgaGFzaF9pdGVtX3MgKippdGVtczsKK30geGhhc2g7CisKKy8qIFRyZWUgbm9kZSAqLwordHlwZWRlZiBzdHJ1Y3Qgbm9kZV9zIHsKKwl1aW50MzJfdCBpbmZvOworCXVuc2lnbmVkIGxpbmVubzsKKwl1bmlvbiB7CisJCXN0cnVjdCBub2RlX3MgKm47CisJCXZhciAqdjsKKwkJaW50IGFpZHg7CisJCWNoYXIgKm5ld19wcm9nbmFtZTsKKwkJcmVnZXhfdCAqcmU7CisJfSBsOworCXVuaW9uIHsKKwkJc3RydWN0IG5vZGVfcyAqbjsKKwkJcmVnZXhfdCAqaXJlOworCQlmdW5jICpmOworCX0gcjsKKwl1bmlvbiB7CisJCXN0cnVjdCBub2RlX3MgKm47CisJfSBhOworfSBub2RlOworCisvKiBCbG9jayBvZiB0ZW1wb3JhcnkgdmFyaWFibGVzICovCit0eXBlZGVmIHN0cnVjdCBudmJsb2NrX3MgeworCWludCBzaXplOworCXZhciAqcG9zOworCXN0cnVjdCBudmJsb2NrX3MgKnByZXY7CisJc3RydWN0IG52YmxvY2tfcyAqbmV4dDsKKwl2YXIgbnZbXTsKK30gbnZibG9jazsKKwordHlwZWRlZiBzdHJ1Y3QgdHNwbGl0dGVyX3MgeworCW5vZGUgbjsKKwlyZWdleF90IHJlWzJdOworfSB0c3BsaXR0ZXI7CisKKy8qIHNpbXBsZSB0b2tlbiBjbGFzc2VzICovCisvKiBPcmRlciBhbmQgaGV4IHZhbHVlcyBhcmUgdmVyeSBpbXBvcnRhbnQhISEgIFNlZSBuZXh0X3Rva2VuKCkgKi8KKyNkZWZpbmUJVENfU0VRU1RBUlQJKDEgPDwgMCkJCS8qICggKi8KKyNkZWZpbmUJVENfU0VRVEVSTQkoMSA8PCAxKQkJLyogKSAqLworI2RlZmluZQlUQ19SRUdFWFAJKDEgPDwgMikJCS8qIC8uLi4vICovCisjZGVmaW5lCVRDX09VVFJEUgkoMSA8PCAzKQkJLyogfCA+ID4+ICovCisjZGVmaW5lCVRDX1VPUFBPU1QJKDEgPDwgNCkJCS8qIHVuYXJ5IHBvc3RmaXggb3BlcmF0b3IgKi8KKyNkZWZpbmUJVENfVU9QUFJFMQkoMSA8PCA1KQkJLyogdW5hcnkgcHJlZml4IG9wZXJhdG9yICovCisjZGVmaW5lCVRDX0JJTk9QWAkoMSA8PCA2KQkJLyogdHdvLW9wbmQgb3BlcmF0b3IgKi8KKyNkZWZpbmUJVENfSU4JCSgxIDw8IDcpCisjZGVmaW5lCVRDX0NPTU1BCSgxIDw8IDgpCisjZGVmaW5lCVRDX1BJUEUJCSgxIDw8IDkpCQkvKiBpbnB1dCByZWRpcmVjdGlvbiBwaXBlICovCisjZGVmaW5lCVRDX1VPUFBSRTIJKDEgPDwgMTApCQkvKiB1bmFyeSBwcmVmaXggb3BlcmF0b3IgKi8KKyNkZWZpbmUJVENfQVJSVEVSTQkoMSA8PCAxMSkJCS8qIF0gKi8KKyNkZWZpbmUJVENfR1JQU1RBUlQJKDEgPDwgMTIpCQkvKiB7ICovCisjZGVmaW5lCVRDX0dSUFRFUk0JKDEgPDwgMTMpCQkvKiB9ICovCisjZGVmaW5lCVRDX1NFTUlDT0wJKDEgPDwgMTQpCisjZGVmaW5lCVRDX05FV0xJTkUJKDEgPDwgMTUpCisjZGVmaW5lCVRDX1NUQVRYCSgxIDw8IDE2KQkJLyogY3RsIHN0YXRlbWVudCAoZm9yLCBuZXh0Li4uKSAqLworI2RlZmluZQlUQ19XSElMRQkoMSA8PCAxNykKKyNkZWZpbmUJVENfRUxTRQkJKDEgPDwgMTgpCisjZGVmaW5lCVRDX0JVSUxUSU4JKDEgPDwgMTkpCisvKiBUaGlzIGNvc3RzIH41MCBieXRlcyBvZiBjb2RlLgorICogQSBzZXBhcmF0ZSBjbGFzcyB0byBzdXBwb3J0IGRlcHJlY2F0ZWQgImxlbmd0aCIgZm9ybS4gSWYgd2UgZG9uJ3QgbmVlZCB0aGF0CisgKiAoaS5lLiBpZiB3ZSBkZW1hbmQgdGhhdCBvbmx5ICJsZW5ndGgoKSIgd2l0aCAoKSBpcyB2YWxpZCksIHRoZW4gVENfTEVOR1RICisgKiBjYW4gYmUgbWVyZ2VkIHdpdGggVENfQlVJTFRJTjoKKyAqLworI2RlZmluZQlUQ19MRU5HVEgJKDEgPDwgMjApCisjZGVmaW5lCVRDX0dFVExJTkUJKDEgPDwgMjEpCisjZGVmaW5lCVRDX0ZVTkNERUNMCSgxIDw8IDIyKQkJLyogYGZ1bmN0aW9uJyBgZnVuYycgKi8KKyNkZWZpbmUJVENfQkVHSU4JKDEgPDwgMjMpCisjZGVmaW5lCVRDX0VORAkJKDEgPDwgMjQpCisjZGVmaW5lCVRDX0VPRgkJKDEgPDwgMjUpCisjZGVmaW5lCVRDX1ZBUklBQkxFCSgxIDw8IDI2KQorI2RlZmluZQlUQ19BUlJBWQkoMSA8PCAyNykKKyNkZWZpbmUJVENfRlVOQ1RJT04JKDEgPDwgMjgpCisjZGVmaW5lCVRDX1NUUklORwkoMSA8PCAyOSkKKyNkZWZpbmUJVENfTlVNQkVSCSgxIDw8IDMwKQorCisjZGVmaW5lCVRDX1VPUFBSRSAgKFRDX1VPUFBSRTEgfCBUQ19VT1BQUkUyKQorCisvKiBjb21iaW5lZCB0b2tlbiBjbGFzc2VzICovCisjZGVmaW5lCVRDX0JJTk9QICAgKFRDX0JJTk9QWCB8IFRDX0NPTU1BIHwgVENfUElQRSB8IFRDX0lOKQorLy8jZGVmaW5lCVRDX1VOQVJZT1AgKFRDX1VPUFBSRSB8IFRDX1VPUFBPU1QpCisjZGVmaW5lCVRDX09QRVJBTkQgKFRDX1ZBUklBQkxFIHwgVENfQVJSQVkgfCBUQ19GVU5DVElPTiBcCisgICAgICAgICAgICAgICAgICAgfCBUQ19CVUlMVElOIHwgVENfTEVOR1RIIHwgVENfR0VUTElORSBcCisgICAgICAgICAgICAgICAgICAgfCBUQ19TRVFTVEFSVCB8IFRDX1NUUklORyB8IFRDX05VTUJFUikKKworI2RlZmluZQlUQ19TVEFURU1OVCAoVENfU1RBVFggfCBUQ19XSElMRSkKKyNkZWZpbmUJVENfT1BURVJNICAoVENfU0VNSUNPTCB8IFRDX05FV0xJTkUpCisKKy8qIHdvcmQgdG9rZW5zLCBjYW5ub3QgbWVhbiBzb21ldGhpbmcgZWxzZSBpZiBub3QgZXhwZWN0ZWQgKi8KKyNkZWZpbmUJVENfV09SRCAgICAoVENfSU4gfCBUQ19TVEFURU1OVCB8IFRDX0VMU0UgXAorICAgICAgICAgICAgICAgICAgIHwgVENfQlVJTFRJTiB8IFRDX0xFTkdUSCB8IFRDX0dFVExJTkUgXAorICAgICAgICAgICAgICAgICAgIHwgVENfRlVOQ0RFQ0wgfCBUQ19CRUdJTiB8IFRDX0VORCkKKworLyogZGlzY2FyZCBuZXdsaW5lcyBhZnRlciB0aGVzZSAqLworI2RlZmluZQlUQ19OT1RFUk0gIChUQ19DT01NQSB8IFRDX0dSUFNUQVJUIHwgVENfR1JQVEVSTSBcCisgICAgICAgICAgICAgICAgICAgfCBUQ19CSU5PUCB8IFRDX09QVEVSTSkKKworLyogd2hhdCBjYW4gZXhwcmVzc2lvbiBiZWdpbiB3aXRoICovCisjZGVmaW5lCVRDX09QU0VRICAgKFRDX09QRVJBTkQgfCBUQ19VT1BQUkUgfCBUQ19SRUdFWFApCisvKiB3aGF0IGNhbiBncm91cCBiZWdpbiB3aXRoICovCisjZGVmaW5lCVRDX0dSUFNFUSAgKFRDX09QU0VRIHwgVENfT1BURVJNIHwgVENfU1RBVEVNTlQgfCBUQ19HUlBTVEFSVCkKKworLyogaWYgcHJldmlvdXMgdG9rZW4gY2xhc3MgaXMgQ09OQ0FUMSBhbmQgbmV4dCBpcyBDT05DQVQyLCBjb25jYXRlbmF0aW9uICovCisvKiBvcGVyYXRvciBpcyBpbnNlcnRlZCBiZXR3ZWVuIHRoZW0gKi8KKyNkZWZpbmUJVENfQ09OQ0FUMSAoVENfVkFSSUFCTEUgfCBUQ19BUlJURVJNIHwgVENfU0VRVEVSTSBcCisgICAgICAgICAgICAgICAgICAgfCBUQ19TVFJJTkcgfCBUQ19OVU1CRVIgfCBUQ19VT1BQT1NUKQorI2RlZmluZQlUQ19DT05DQVQyIChUQ19PUEVSQU5EIHwgVENfVU9QUFJFKQorCisjZGVmaW5lCU9GX1JFUzEgICAgMHgwMTAwMDAKKyNkZWZpbmUJT0ZfUkVTMiAgICAweDAyMDAwMAorI2RlZmluZQlPRl9TVFIxICAgIDB4MDQwMDAwCisjZGVmaW5lCU9GX1NUUjIgICAgMHgwODAwMDAKKyNkZWZpbmUJT0ZfTlVNMSAgICAweDEwMDAwMAorI2RlZmluZQlPRl9DSEVDS0VEIDB4MjAwMDAwCisKKy8qIGNvbWJpbmVkIG9wZXJhdG9yIGZsYWdzICovCisjZGVmaW5lCXh4CTAKKyNkZWZpbmUJeFYJT0ZfUkVTMgorI2RlZmluZQl4UwkoT0ZfUkVTMiB8IE9GX1NUUjIpCisjZGVmaW5lCVZ4CU9GX1JFUzEKKyNkZWZpbmUJVlYJKE9GX1JFUzEgfCBPRl9SRVMyKQorI2RlZmluZQlOeAkoT0ZfUkVTMSB8IE9GX05VTTEpCisjZGVmaW5lCU5WCShPRl9SRVMxIHwgT0ZfTlVNMSB8IE9GX1JFUzIpCisjZGVmaW5lCVN4CShPRl9SRVMxIHwgT0ZfU1RSMSkKKyNkZWZpbmUJU1YJKE9GX1JFUzEgfCBPRl9TVFIxIHwgT0ZfUkVTMikKKyNkZWZpbmUJU1MJKE9GX1JFUzEgfCBPRl9TVFIxIHwgT0ZfUkVTMiB8IE9GX1NUUjIpCisKKyNkZWZpbmUJT1BDTFNNQVNLIDB4RkYwMAorI2RlZmluZQlPUE5NQVNLICAgMHgwMDdGCisKKy8qIG9wZXJhdG9yIHByaW9yaXR5IGlzIGEgaGlnaGVzdCBieXRlIChldmVuOiByLT5sLCBvZGQ6IGwtPnIgZ3JvdXBpbmcpCisgKiBGb3IgYnVpbHRpbnMgaXQgaGFzIGRpZmZlcmVudCBtZWFuaW5nOiBuIG4gczMgczIgczEgdjMgdjIgdjEsCisgKiBuIC0gbWluLiBudW1iZXIgb2YgYXJncywgdk4gLSByZXNvbHZlIE50aCBhcmcgdG8gdmFyLCBzTiAtIHJlc29sdmUgdG8gc3RyaW5nCisgKi8KKyN1bmRlZiBQCisjdW5kZWYgUFJJTUFTSworI3VuZGVmIFBSSU1BU0syCisjZGVmaW5lIFAoeCkgICAgICAoeCA8PCAyNCkKKyNkZWZpbmUgUFJJTUFTSyAgIDB4N0YwMDAwMDAKKyNkZWZpbmUgUFJJTUFTSzIgIDB4N0UwMDAwMDAKKworLyogT3BlcmF0aW9uIGNsYXNzZXMgKi8KKworI2RlZmluZQlTSElGVF9USUxfVEhJUwkweDA2MDAKKyNkZWZpbmUJUkVDVVJfRlJPTV9USElTCTB4MTAwMAorCitlbnVtIHsKKwlPQ19ERUxFVEUgPSAweDAxMDAsICAgICBPQ19FWEVDID0gMHgwMjAwLCAgICAgICBPQ19ORVdTT1VSQ0UgPSAweDAzMDAsCisJT0NfUFJJTlQgPSAweDA0MDAsICAgICAgT0NfUFJJTlRGID0gMHgwNTAwLCAgICAgT0NfV0FMS0lOSVQgPSAweDA2MDAsCisKKwlPQ19CUiA9IDB4MDcwMCwgICAgICAgICBPQ19CUkVBSyA9IDB4MDgwMCwgICAgICBPQ19DT05USU5VRSA9IDB4MDkwMCwKKwlPQ19FWElUID0gMHgwYTAwLCAgICAgICBPQ19ORVhUID0gMHgwYjAwLCAgICAgICBPQ19ORVhURklMRSA9IDB4MGMwMCwKKwlPQ19URVNUID0gMHgwZDAwLCAgICAgICBPQ19XQUxLTkVYVCA9IDB4MGUwMCwKKworCU9DX0JJTkFSWSA9IDB4MTAwMCwgICAgIE9DX0JVSUxUSU4gPSAweDExMDAsICAgIE9DX0NPTE9OID0gMHgxMjAwLAorCU9DX0NPTU1BID0gMHgxMzAwLCAgICAgIE9DX0NPTVBBUkUgPSAweDE0MDAsICAgIE9DX0NPTkNBVCA9IDB4MTUwMCwKKwlPQ19GQkxUSU4gPSAweDE2MDAsICAgICBPQ19GSUVMRCA9IDB4MTcwMCwgICAgICBPQ19GTkFSRyA9IDB4MTgwMCwKKwlPQ19GVU5DID0gMHgxOTAwLCAgICAgICBPQ19HRVRMSU5FID0gMHgxYTAwLCAgICBPQ19JTiA9IDB4MWIwMCwKKwlPQ19MQU5EID0gMHgxYzAwLCAgICAgICBPQ19MT1IgPSAweDFkMDAsICAgICAgICBPQ19NQVRDSCA9IDB4MWUwMCwKKwlPQ19NT1ZFID0gMHgxZjAwLCAgICAgICBPQ19QR0VUTElORSA9IDB4MjAwMCwgICBPQ19SRUdFWFAgPSAweDIxMDAsCisJT0NfUkVQTEFDRSA9IDB4MjIwMCwgICAgT0NfUkVUVVJOID0gMHgyMzAwLCAgICAgT0NfU1BSSU5URiA9IDB4MjQwMCwKKwlPQ19URVJOQVJZID0gMHgyNTAwLCAgICBPQ19VTkFSWSA9IDB4MjYwMCwgICAgICBPQ19WQVIgPSAweDI3MDAsCisJT0NfRE9ORSA9IDB4MjgwMCwKKworCVNUX0lGID0gMHgzMDAwLCAgICAgICAgIFNUX0RPID0gMHgzMTAwLCAgICAgICAgIFNUX0ZPUiA9IDB4MzIwMCwKKwlTVF9XSElMRSA9IDB4MzMwMAorfTsKKworLyogc2ltcGxlIGJ1aWx0aW5zICovCitlbnVtIHsKKwlGX2luLAlGX3JuLAlGX2NvLAlGX2V4LAlGX2xnLAlGX3NpLAlGX3NxLAlGX3NyLAorCUZfdGksCUZfbGUsCUZfc3ksCUZfZmYsCUZfY2wKK307CisKKy8qIGJ1aWx0aW5zICovCitlbnVtIHsKKwlCX2EyLAlCX2l4LAlCX21hLAlCX3NwLAlCX3NzLAlCX3RpLCAgIEJfbXQsCUJfbG8sCUJfdXAsCisJQl9nZSwJQl9ncywJQl9zdSwKKwlCX2FuLAlCX2NvLAlCX2xzLAlCX29yLAlCX3JzLAlCX3hvLAorfTsKKworLyogdG9rZW5zIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIGluZm8gdmFsdWVzICovCisKKyNkZWZpbmUgTlRDICAgICAiXDM3NyIgIC8qIHN3aXRjaCB0byBuZXh0IHRva2VuIGNsYXNzICh0Yzw8MSkgKi8KKyNkZWZpbmUgTlRDQyAgICAnXDM3NycKKworc3RhdGljIGNvbnN0IGNoYXIgdG9rZW5saXN0W10gQUxJR04xID0KKwkiXDEoIiAgICAgICAgIE5UQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVENfU0VRU1RBUlQgKi8KKwkiXDEpIiAgICAgICAgIE5UQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVENfU0VRVEVSTSAqLworCSJcMS8iICAgICAgICAgTlRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUQ19SRUdFWFAgKi8KKwkiXDI+PiIgICAgICAgICJcMT4iICAgICAgICAgIlwxfCIgICAgICAgTlRDICAgICAgICAgLyogVENfT1VUUkRSICovCisJIlwyKysiICAgICAgICAiXDItLSIgICAgICAgIE5UQyAgICAgICAgICAgICAgICAgICAgIC8qIFRDX1VPUFBPU1QgKi8KKwkiXDIrKyIgICAgICAgICJcMi0tIiAgICAgICAgIlwxJCIgICAgICAgTlRDICAgICAgICAgLyogVENfVU9QUFJFMSAqLworCSJcMj09IiAgICAgICAgIlwxPSIgICAgICAgICAiXDIrPSIgICAgICAiXDItPSIgICAgICAvKiBUQ19CSU5PUFggKi8KKwkiXDIqPSIgICAgICAgICJcMi89IiAgICAgICAgIlwyJT0iICAgICAgIlwyXj0iCisJIlwxKyIgICAgICAgICAiXDEtIiAgICAgICAgICJcMyoqPSIgICAgICJcMioqIgorCSJcMS8iICAgICAgICAgIlwxJSIgICAgICAgICAiXDFeIiAgICAgICAiXDEqIgorCSJcMiE9IiAgICAgICAgIlwyPj0iICAgICAgICAiXDI8PSIgICAgICAiXDE+IgorCSJcMTwiICAgICAgICAgIlwyIX4iICAgICAgICAiXDF+IiAgICAgICAiXDImJiIKKwkiXDJ8fCIgICAgICAgICJcMT8iICAgICAgICAgIlwxOiIgICAgICAgTlRDCisJIlwyaW4iICAgICAgICBOVEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRDX0lOICovCisJIlwxLCIgICAgICAgICBOVEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRDX0NPTU1BICovCisJIlwxfCIgICAgICAgICBOVEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRDX1BJUEUgKi8KKwkiXDErIiAgICAgICAgICJcMS0iICAgICAgICAgIlwxISIgICAgICAgTlRDICAgICAgICAgLyogVENfVU9QUFJFMiAqLworCSJcMV0iICAgICAgICAgTlRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUQ19BUlJURVJNICovCisJIlwxeyIgICAgICAgICBOVEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRDX0dSUFNUQVJUICovCisJIlwxfSIgICAgICAgICBOVEMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRDX0dSUFRFUk0gKi8KKwkiXDE7IiAgICAgICAgIE5UQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVENfU0VNSUNPTCAqLworCSJcMVxuIiAgICAgICAgTlRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUQ19ORVdMSU5FICovCisJIlwyaWYiICAgICAgICAiXDJkbyIgICAgICAgICJcM2ZvciIgICAgICJcNWJyZWFrIiAgIC8qIFRDX1NUQVRYICovCisJIlwxMGNvbnRpbnVlIiAiXDZkZWxldGUiICAgICJcNXByaW50IgorCSJcNnByaW50ZiIgICAgIlw0bmV4dCIgICAgICAiXDEwbmV4dGZpbGUiCisJIlw2cmV0dXJuIiAgICAiXDRleGl0IiAgICAgIE5UQworCSJcNXdoaWxlIiAgICAgTlRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUQ19XSElMRSAqLworCSJcNGVsc2UiICAgICAgTlRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUQ19FTFNFICovCisJIlwzYW5kIiAgICAgICAiXDVjb21wbCIgICAgICJcNmxzaGlmdCIgICJcMm9yIiAgICAgIC8qIFRDX0JVSUxUSU4gKi8KKwkiXDZyc2hpZnQiICAgICJcM3hvciIKKwkiXDVjbG9zZSIgICAgICJcNnN5c3RlbSIgICAgIlw2ZmZsdXNoIiAgIlw1YXRhbjIiCisJIlwzY29zIiAgICAgICAiXDNleHAiICAgICAgICJcM2ludCIgICAgICJcM2xvZyIKKwkiXDRyYW5kIiAgICAgICJcM3NpbiIgICAgICAgIlw0c3FydCIgICAgIlw1c3JhbmQiCisJIlw2Z2Vuc3ViIiAgICAiXDRnc3ViIiAgICAgICJcNWluZGV4IgkvKiAiXDZsZW5ndGgiIHdhcyBoZXJlICovCisJIlw1bWF0Y2giICAgICAiXDVzcGxpdCIgICAgICJcN3NwcmludGYiICJcM3N1YiIKKwkiXDZzdWJzdHIiICAgICJcN3N5c3RpbWUiICAgIlwxMHN0cmZ0aW1lIiAiXDZta3RpbWUiCisJIlw3dG9sb3dlciIgICAiXDd0b3VwcGVyIiAgIE5UQworCSJcNmxlbmd0aCIgICAgTlRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUQ19MRU5HVEggKi8KKwkiXDdnZXRsaW5lIiAgIE5UQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVENfR0VUTElORSAqLworCSJcNGZ1bmMiICAgICAgIlwxMGZ1bmN0aW9uIiBOVEMgICAgICAgICAgICAgICAgICAgICAvKiBUQ19GVU5DREVDTCAqLworCSJcNUJFR0lOIiAgICAgTlRDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUQ19CRUdJTiAqLworCSJcM0VORCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUQ19FTkQgKi8KKwkvKiBjb21waWxlciBhZGRzIHRyYWlsaW5nICJcMCIgKi8KKwk7CisKKyNkZWZpbmUgT0NfQiAgT0NfQlVJTFRJTgorCitzdGF0aWMgY29uc3QgdWludDMyX3QgdG9rZW5pbmZvW10gPSB7CisJMCwKKwkwLAorCU9DX1JFR0VYUCwKKwl4U3wnYScsICAgICAgICAgICAgICAgICAgeFN8J3cnLCAgICAgICAgICAgICAgICAgIHhTfCd8JywKKwlPQ19VTkFSWXx4VnxQKDkpfCdwJywgICAgT0NfVU5BUll8eFZ8UCg5KXwnbScsCisJT0NfVU5BUll8eFZ8UCg5KXwnUCcsICAgIE9DX1VOQVJZfHhWfFAoOSl8J00nLCAgICBPQ19GSUVMRHx4VnxQKDUpLAorCU9DX0NPTVBBUkV8VlZ8UCgzOSl8NSwgICBPQ19NT1ZFfFZWfFAoNzQpLCAgICAgICAgT0NfUkVQTEFDRXxOVnxQKDc0KXwnKycsIE9DX1JFUExBQ0V8TlZ8UCg3NCl8Jy0nLAorCU9DX1JFUExBQ0V8TlZ8UCg3NCl8JyonLCBPQ19SRVBMQUNFfE5WfFAoNzQpfCcvJywgT0NfUkVQTEFDRXxOVnxQKDc0KXwnJScsIE9DX1JFUExBQ0V8TlZ8UCg3NCl8JyYnLAorCU9DX0JJTkFSWXxOVnxQKDI5KXwnKycsICBPQ19CSU5BUll8TlZ8UCgyOSl8Jy0nLCAgT0NfUkVQTEFDRXxOVnxQKDc0KXwnJicsIE9DX0JJTkFSWXxOVnxQKDE1KXwnJicsCisJT0NfQklOQVJZfE5WfFAoMjUpfCcvJywgIE9DX0JJTkFSWXxOVnxQKDI1KXwnJScsICBPQ19CSU5BUll8TlZ8UCgxNSl8JyYnLCAgT0NfQklOQVJZfE5WfFAoMjUpfCcqJywKKwlPQ19DT01QQVJFfFZWfFAoMzkpfDQsICAgT0NfQ09NUEFSRXxWVnxQKDM5KXwzLCAgIE9DX0NPTVBBUkV8VlZ8UCgzOSl8MCwgICBPQ19DT01QQVJFfFZWfFAoMzkpfDEsCisJT0NfQ09NUEFSRXxWVnxQKDM5KXwyLCAgIE9DX01BVENIfFN4fFAoNDUpfCchJywgICBPQ19NQVRDSHxTeHxQKDQ1KXwnficsICAgT0NfTEFORHxWeHxQKDU1KSwKKwlPQ19MT1J8Vnh8UCg1OSksICAgICAgICAgT0NfVEVSTkFSWXxWeHxQKDY0KXwnPycsIE9DX0NPTE9OfHh4fFAoNjcpfCc6JywKKwlPQ19JTnxTVnxQKDQ5KSwgLyogVENfSU4gKi8KKwlPQ19DT01NQXxTU3xQKDgwKSwKKwlPQ19QR0VUTElORXxTVnxQKDM3KSwKKwlPQ19VTkFSWXx4VnxQKDE5KXwnKycsICAgT0NfVU5BUll8eFZ8UCgxOSl8Jy0nLCAgIE9DX1VOQVJZfHhWfFAoMTkpfCchJywKKwkwLCAvKiBdICovCisJMCwKKwkwLAorCTAsCisJMCwgLyogXG4gKi8KKwlTVF9JRiwgICAgICAgIFNUX0RPLCAgICAgICAgU1RfRk9SLCAgICAgIE9DX0JSRUFLLAorCU9DX0NPTlRJTlVFLCAgT0NfREVMRVRFfFZ4LCBPQ19QUklOVCwKKwlPQ19QUklOVEYsICAgIE9DX05FWFQsICAgICAgT0NfTkVYVEZJTEUsCisJT0NfUkVUVVJOfFZ4LCBPQ19FWElUfE54LAorCVNUX1dISUxFLAorCTAsIC8qIGVsc2UgKi8KKwlPQ19CfEJfYW58UCgweDgzKSwgT0NfQnxCX2NvfFAoMHg0MSksIE9DX0J8Ql9sc3xQKDB4ODMpLCBPQ19CfEJfb3J8UCgweDgzKSwKKwlPQ19CfEJfcnN8UCgweDgzKSwgT0NfQnxCX3hvfFAoMHg4MyksCisJT0NfRkJMVElOfFN4fEZfY2wsIE9DX0ZCTFRJTnxTeHxGX3N5LCBPQ19GQkxUSU58U3h8Rl9mZiwgT0NfQnxCX2EyfFAoMHg4MyksCisJT0NfRkJMVElOfE54fEZfY28sIE9DX0ZCTFRJTnxOeHxGX2V4LCBPQ19GQkxUSU58Tnh8Rl9pbiwgT0NfRkJMVElOfE54fEZfbGcsCisJT0NfRkJMVElOfEZfcm4sICAgIE9DX0ZCTFRJTnxOeHxGX3NpLCBPQ19GQkxUSU58Tnh8Rl9zcSwgT0NfRkJMVElOfE54fEZfc3IsCisJT0NfQnxCX2dlfFAoMHhkNiksIE9DX0J8Ql9nc3xQKDB4YjYpLCBPQ19CfEJfaXh8UCgweDliKSwgLyogT0NfRkJMVElOfFN4fEZfbGUsIHdhcyBoZXJlICovCisJT0NfQnxCX21hfFAoMHg4OSksIE9DX0J8Ql9zcHxQKDB4OGIpLCBPQ19TUFJJTlRGLCAgICAgICAgT0NfQnxCX3N1fFAoMHhiNiksCisJT0NfQnxCX3NzfFAoMHg4ZiksIE9DX0ZCTFRJTnxGX3RpLCAgICBPQ19CfEJfdGl8UCgweDBiKSwgT0NfQnxCX210fFAoMHgwYiksCisJT0NfQnxCX2xvfFAoMHg0OSksIE9DX0J8Ql91cHxQKDB4NDkpLAorCU9DX0ZCTFRJTnxTeHxGX2xlLCAvKiBUQ19MRU5HVEggKi8KKwlPQ19HRVRMSU5FfFNWfFAoMCksCisJMCwgICAgICAgICAgICAgICAgIDAsCisJMCwKKwkwIC8qIFRDX0VORCAqLworfTsKKworLyogaW50ZXJuYWwgdmFyaWFibGUgbmFtZXMgYW5kIHRoZWlyIGluaXRpYWwgdmFsdWVzICAgICAgICovCisvKiBhc3RlcmlzayBtYXJrcyBTUEVDSUFMIHZhcnM7ICQgaXMganVzdCBuby1uYW1lZCBGaWVsZDAgKi8KK2VudW0geworCUNPTlZGTVQsICAgIE9GTVQsICAgICAgIEZTLCAgICAgICAgIE9GUywKKwlPUlMsICAgICAgICBSUywgICAgICAgICBSVCwgICAgICAgICBGSUxFTkFNRSwKKwlTVUJTRVAsICAgICBGMCwgICAgICAgICBBUkdJTkQsICAgICBBUkdDLAorCUFSR1YsICAgICAgIEVSUk5PLCAgICAgIEZOUiwgICAgICAgIE5SLAorCU5GLCAgICAgICAgIElHTk9SRUNBU0UsIEVOVklST04sICAgIE5VTV9JTlRFUk5BTF9WQVJTCit9OworCitzdGF0aWMgY29uc3QgY2hhciB2TmFtZXNbXSBBTElHTjEgPQorCSJDT05WRk1UXDAiICJPRk1UXDAiICAgICJGU1wwKiIgICAgICJPRlNcMCIKKwkiT1JTXDAiICAgICAiUlNcMCoiICAgICAiUlRcMCIgICAgICAiRklMRU5BTUVcMCIKKwkiU1VCU0VQXDAiICAiJFwwKiIgICAgICAiQVJHSU5EXDAiICAiQVJHQ1wwIgorCSJBUkdWXDAiICAgICJFUlJOT1wwIiAgICJGTlJcMCIgICAgICJOUlwwIgorCSJORlwwKiIgICAgICJJR05PUkVDQVNFXDAqIiAiRU5WSVJPTlwwIiAiXDAiOworCitzdGF0aWMgY29uc3QgY2hhciB2VmFsdWVzW10gQUxJR04xID0KKwkiJS42Z1wwIiAgICAiJS42Z1wwIiAgICAiIFwwIiAgICAgICAiIFwwIgorCSJcblwwIiAgICAgICJcblwwIiAgICAgICJcMCIgICAgICAgICJcMCIKKwkiXDAzNFwwIiAgICAiXDAiICAgICAgICAiXDM3NyI7CisKKy8qIGhhc2ggc2l6ZSBtYXkgZ3JvdyB0byB0aGVzZSB2YWx1ZXMgKi8KKyNkZWZpbmUgRklSU1RfUFJJTUUgNjEKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBQUklNRVNbXSBBTElHTjIgPSB7IDI1MSwgMTAyMSwgNDA5MywgMTYzODEsIDY1NTIxIH07CisKKworLyogR2xvYmFscy4gU3BsaXQgaW4gdHdvIHBhcnRzIHNvIHRoYXQgZmlyc3Qgb25lIGlzIGFkZHJlc3NlZAorICogd2l0aCAobW9zdGx5IHNob3J0KSBuZWdhdGl2ZSBvZmZzZXRzLgorICogTkI6IGl0J3MgdW5zYWZlIHRvIHB1dCBtZW1iZXJzIG9mIHR5cGUgImRvdWJsZSIKKyAqIGludG8gZ2xvYmFsczIgKGdjYyBtYXkgZmFpbCB0byBhbGlnbiB0aGVtKS4KKyAqLworc3RydWN0IGdsb2JhbHMgeworCWRvdWJsZSB0X2RvdWJsZTsKKwljaGFpbiBiZWdpbnNlcSwgbWFpbnNlcSwgZW5kc2VxOworCWNoYWluICpzZXE7CisJbm9kZSAqYnJlYWtfcHRyLCAqY29udGludWVfcHRyOworCXJzdHJlYW0gKmlGOworCXhoYXNoICp2aGFzaCwgKmFoYXNoLCAqZmRoYXNoLCAqZm5oYXNoOworCWNvbnN0IGNoYXIgKmdfcHJvZ25hbWU7CisJaW50IGdfbGluZW5vOworCWludCBuZmllbGRzOworCWludCBtYXhmaWVsZHM7IC8qIHVzZWQgaW4gZnNyZWFsbG9jKCkgb25seSAqLworCXZhciAqRmllbGRzOworCW52YmxvY2sgKmdfY2I7CisJY2hhciAqZ19wb3M7CisJY2hhciAqZ19idWY7CisJc21hbGxpbnQgaWNhc2U7CisJc21hbGxpbnQgZXhpdGluZzsKKwlzbWFsbGludCBuZXh0cmVjOworCXNtYWxsaW50IG5leHRmaWxlOworCXNtYWxsaW50IGlzX2YwX3NwbGl0OworCXNtYWxsaW50IHRfcm9sbGJhY2s7Cit9Oworc3RydWN0IGdsb2JhbHMyIHsKKwl1aW50MzJfdCB0X2luZm87IC8qIG9mdGVuIHVzZWQgKi8KKwl1aW50MzJfdCB0X3RjbGFzczsKKwljaGFyICp0X3N0cmluZzsKKwlpbnQgdF9saW5lbm87CisKKwl2YXIgKmludHZhcltOVU1fSU5URVJOQUxfVkFSU107IC8qIG9mdGVuIHVzZWQgKi8KKworCS8qIGZvcm1lciBzdGF0aWNzIGZyb20gdmFyaW91cyBmdW5jdGlvbnMgKi8KKwljaGFyICpzcGxpdF9mMF9fZnN0cmluZ3M7CisKKwl1aW50MzJfdCBuZXh0X3Rva2VuX19zYXZlX3RjbGFzczsKKwl1aW50MzJfdCBuZXh0X3Rva2VuX19zYXZlX2luZm87CisJdWludDMyX3QgbmV4dF90b2tlbl9fbHRjbGFzczsKKwlzbWFsbGludCBuZXh0X3Rva2VuX19jb25jYXRfaW5zZXJ0ZWQ7CisKKwlzbWFsbGludCBuZXh0X2lucHV0X2ZpbGVfX2ZpbGVzX2hhcHBlbjsKKwlyc3RyZWFtIG5leHRfaW5wdXRfZmlsZV9fcnNtOworCisJdmFyICpldmFsdWF0ZV9fZm5hcmdzOworCXVuc2lnbmVkIGV2YWx1YXRlX19zZWVkOworCXJlZ2V4X3QgZXZhbHVhdGVfX3NyZWc7CisKKwl2YXIgcHRlc3RfX3Y7CisKKwl0c3BsaXR0ZXIgZXhlY19idWlsdGluX190c3BsOworCisJLyogYmlnZ2VzdCBhbmQgbGVhc3QgdXNlZCBtZW1iZXJzIGdvIGxhc3QgKi8KKwl0c3BsaXR0ZXIgZnNwbGl0dGVyLCByc3BsaXR0ZXI7Cit9OworI2RlZmluZSBHMSAocHRyX3RvX2dsb2JhbHNbLTFdKQorI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzMiAqKXB0cl90b19nbG9iYWxzKQorLyogRm9yIGRlYnVnLiBubSAtLXNpemUtc29ydCBhd2subyB8IGdyZXAgLXZpICcgW3RyXSAnICovCisvKmNoYXIgRzFzaXplW3NpemVvZihHMSldOyAtIDB4NzQgKi8KKy8qY2hhciBHc2l6ZVtzaXplb2YoRyldOyAtIDB4MWM0ICovCisvKiBUcnlpbmcgdG8ga2VlcCBtb3N0IG9mIG1lbWJlcnMgYWNjZXNzaWJsZSB3aXRoIHNob3J0IG9mZnNldHM6ICovCisvKmNoYXIgR29mc19zZWVkW29mZnNldG9mKHN0cnVjdCBnbG9iYWxzMiwgZXZhbHVhdGVfX3NlZWQpXTsgLSAweDkwICovCisjZGVmaW5lIHRfZG91YmxlICAgICAoRzEudF9kb3VibGUgICAgKQorI2RlZmluZSBiZWdpbnNlcSAgICAgKEcxLmJlZ2luc2VxICAgICkKKyNkZWZpbmUgbWFpbnNlcSAgICAgIChHMS5tYWluc2VxICAgICApCisjZGVmaW5lIGVuZHNlcSAgICAgICAoRzEuZW5kc2VxICAgICAgKQorI2RlZmluZSBzZXEgICAgICAgICAgKEcxLnNlcSAgICAgICAgICkKKyNkZWZpbmUgYnJlYWtfcHRyICAgIChHMS5icmVha19wdHIgICApCisjZGVmaW5lIGNvbnRpbnVlX3B0ciAoRzEuY29udGludWVfcHRyKQorI2RlZmluZSBpRiAgICAgICAgICAgKEcxLmlGICAgICAgICAgICkKKyNkZWZpbmUgdmhhc2ggICAgICAgIChHMS52aGFzaCAgICAgICApCisjZGVmaW5lIGFoYXNoICAgICAgICAoRzEuYWhhc2ggICAgICAgKQorI2RlZmluZSBmZGhhc2ggICAgICAgKEcxLmZkaGFzaCAgICAgICkKKyNkZWZpbmUgZm5oYXNoICAgICAgIChHMS5mbmhhc2ggICAgICApCisjZGVmaW5lIGdfcHJvZ25hbWUgICAoRzEuZ19wcm9nbmFtZSAgKQorI2RlZmluZSBnX2xpbmVubyAgICAgKEcxLmdfbGluZW5vICAgICkKKyNkZWZpbmUgbmZpZWxkcyAgICAgIChHMS5uZmllbGRzICAgICApCisjZGVmaW5lIG1heGZpZWxkcyAgICAoRzEubWF4ZmllbGRzICAgKQorI2RlZmluZSBGaWVsZHMgICAgICAgKEcxLkZpZWxkcyAgICAgICkKKyNkZWZpbmUgZ19jYiAgICAgICAgIChHMS5nX2NiICAgICAgICApCisjZGVmaW5lIGdfcG9zICAgICAgICAoRzEuZ19wb3MgICAgICAgKQorI2RlZmluZSBnX2J1ZiAgICAgICAgKEcxLmdfYnVmICAgICAgICkKKyNkZWZpbmUgaWNhc2UgICAgICAgIChHMS5pY2FzZSAgICAgICApCisjZGVmaW5lIGV4aXRpbmcgICAgICAoRzEuZXhpdGluZyAgICAgKQorI2RlZmluZSBuZXh0cmVjICAgICAgKEcxLm5leHRyZWMgICAgICkKKyNkZWZpbmUgbmV4dGZpbGUgICAgIChHMS5uZXh0ZmlsZSAgICApCisjZGVmaW5lIGlzX2YwX3NwbGl0ICAoRzEuaXNfZjBfc3BsaXQgKQorI2RlZmluZSB0X3JvbGxiYWNrICAgKEcxLnRfcm9sbGJhY2sgICkKKyNkZWZpbmUgdF9pbmZvICAgICAgIChHLnRfaW5mbyAgICAgICkKKyNkZWZpbmUgdF90Y2xhc3MgICAgIChHLnRfdGNsYXNzICAgICkKKyNkZWZpbmUgdF9zdHJpbmcgICAgIChHLnRfc3RyaW5nICAgICkKKyNkZWZpbmUgdF9saW5lbm8gICAgIChHLnRfbGluZW5vICAgICkKKyNkZWZpbmUgaW50dmFyICAgICAgIChHLmludHZhciAgICAgICkKKyNkZWZpbmUgZnNwbGl0dGVyICAgIChHLmZzcGxpdHRlciAgICkKKyNkZWZpbmUgcnNwbGl0dGVyICAgIChHLnJzcGxpdHRlciAgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKChjaGFyKil4emFsbG9jKHNpemVvZihHMSkrc2l6ZW9mKEcpKSArIHNpemVvZihHMSkpOyBcCisJRy5uZXh0X3Rva2VuX19sdGNsYXNzID0gVENfT1BURVJNOyBcCisJRy5ldmFsdWF0ZV9fc2VlZCA9IDE7IFwKK30gd2hpbGUgKDApCisKKworLyogZnVuY3Rpb24gcHJvdG90eXBlcyAqLworc3RhdGljIHZvaWQgaGFuZGxlX3NwZWNpYWwodmFyICopOworc3RhdGljIG5vZGUgKnBhcnNlX2V4cHIodWludDMyX3QpOworc3RhdGljIHZvaWQgY2hhaW5fZ3JvdXAodm9pZCk7CitzdGF0aWMgdmFyICpldmFsdWF0ZShub2RlICosIHZhciAqKTsKK3N0YXRpYyByc3RyZWFtICpuZXh0X2lucHV0X2ZpbGUodm9pZCk7CitzdGF0aWMgaW50IGZtdF9udW0oY2hhciAqLCBpbnQsIGNvbnN0IGNoYXIgKiwgZG91YmxlLCBpbnQpOworc3RhdGljIGludCBhd2tfZXhpdChpbnQpIE5PUkVUVVJOOworCisvKiAtLS0tIGVycm9yIGhhbmRsaW5nIC0tLS0gKi8KKworc3RhdGljIGNvbnN0IGNoYXIgRU1TR19JTlRFUk5BTF9FUlJPUltdIEFMSUdOMSA9ICJJbnRlcm5hbCBlcnJvciI7CitzdGF0aWMgY29uc3QgY2hhciBFTVNHX1VORVhQX0VPU1tdIEFMSUdOMSA9ICJVbmV4cGVjdGVkIGVuZCBvZiBzdHJpbmciOworc3RhdGljIGNvbnN0IGNoYXIgRU1TR19VTkVYUF9UT0tFTltdIEFMSUdOMSA9ICJVbmV4cGVjdGVkIHRva2VuIjsKK3N0YXRpYyBjb25zdCBjaGFyIEVNU0dfRElWX0JZX1pFUk9bXSBBTElHTjEgPSAiRGl2aXNpb24gYnkgemVybyI7CitzdGF0aWMgY29uc3QgY2hhciBFTVNHX0lOVl9GTVRbXSBBTElHTjEgPSAiSW52YWxpZCBmb3JtYXQgc3BlY2lmaWVyIjsKK3N0YXRpYyBjb25zdCBjaGFyIEVNU0dfVE9PX0ZFV19BUkdTW10gQUxJR04xID0gIlRvbyBmZXcgYXJndW1lbnRzIGZvciBidWlsdGluIjsKK3N0YXRpYyBjb25zdCBjaGFyIEVNU0dfTk9UX0FSUkFZW10gQUxJR04xID0gIk5vdCBhbiBhcnJheSI7CitzdGF0aWMgY29uc3QgY2hhciBFTVNHX1BPU1NJQkxFX0VSUk9SW10gQUxJR04xID0gIlBvc3NpYmxlIHN5bnRheCBlcnJvciI7CitzdGF0aWMgY29uc3QgY2hhciBFTVNHX1VOREVGX0ZVTkNbXSBBTElHTjEgPSAiQ2FsbCB0byB1bmRlZmluZWQgZnVuY3Rpb24iOworc3RhdGljIGNvbnN0IGNoYXIgRU1TR19OT19NQVRIW10gQUxJR04xID0gIk1hdGggc3VwcG9ydCBpcyBub3QgY29tcGlsZWQgaW4iOworCitzdGF0aWMgdm9pZCB6ZXJvX291dF92YXIodmFyICp2cCkKK3sKKwltZW1zZXQodnAsIDAsIHNpemVvZigqdnApKTsKK30KKworc3RhdGljIHZvaWQgc3ludGF4X2Vycm9yKGNvbnN0IGNoYXIgKm1lc3NhZ2UpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgc3ludGF4X2Vycm9yKGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiVpOiAlcyIsIGdfcHJvZ25hbWUsIGdfbGluZW5vLCBtZXNzYWdlKTsKK30KKworLyogLS0tLSBoYXNoIHN0dWZmIC0tLS0gKi8KKworc3RhdGljIHVuc2lnbmVkIGhhc2hpZHgoY29uc3QgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBpZHggPSAwOworCisJd2hpbGUgKCpuYW1lKQorCQlpZHggPSAqbmFtZSsrICsgKGlkeCA8PCA2KSAtIGlkeDsKKwlyZXR1cm4gaWR4OworfQorCisvKiBjcmVhdGUgbmV3IGhhc2ggKi8KK3N0YXRpYyB4aGFzaCAqaGFzaF9pbml0KHZvaWQpCit7CisJeGhhc2ggKm5ld2hhc2g7CisKKwluZXdoYXNoID0geHphbGxvYyhzaXplb2YoKm5ld2hhc2gpKTsKKwluZXdoYXNoLT5jc2l6ZSA9IEZJUlNUX1BSSU1FOworCW5ld2hhc2gtPml0ZW1zID0geHphbGxvYyhGSVJTVF9QUklNRSAqIHNpemVvZihuZXdoYXNoLT5pdGVtc1swXSkpOworCisJcmV0dXJuIG5ld2hhc2g7Cit9CisKKy8qIGZpbmQgaXRlbSBpbiBoYXNoLCByZXR1cm4gcHRyIHRvIGRhdGEsIE5VTEwgaWYgbm90IGZvdW5kICovCitzdGF0aWMgdm9pZCAqaGFzaF9zZWFyY2goeGhhc2ggKmhhc2gsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaGFzaF9pdGVtICpoaTsKKworCWhpID0gaGFzaC0+aXRlbXNbaGFzaGlkeChuYW1lKSAlIGhhc2gtPmNzaXplXTsKKwl3aGlsZSAoaGkpIHsKKwkJaWYgKHN0cmNtcChoaS0+bmFtZSwgbmFtZSkgPT0gMCkKKwkJCXJldHVybiAmaGktPmRhdGE7CisJCWhpID0gaGktPm5leHQ7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBncm93IGhhc2ggaWYgaXQgYmVjb21lcyB0b28gYmlnICovCitzdGF0aWMgdm9pZCBoYXNoX3JlYnVpbGQoeGhhc2ggKmhhc2gpCit7CisJdW5zaWduZWQgbmV3c2l6ZSwgaSwgaWR4OworCWhhc2hfaXRlbSAqKm5ld2l0ZW1zLCAqaGksICp0aGk7CisKKwlpZiAoaGFzaC0+bnByaW1lID09IEFSUkFZX1NJWkUoUFJJTUVTKSkKKwkJcmV0dXJuOworCisJbmV3c2l6ZSA9IFBSSU1FU1toYXNoLT5ucHJpbWUrK107CisJbmV3aXRlbXMgPSB4emFsbG9jKG5ld3NpemUgKiBzaXplb2YobmV3aXRlbXNbMF0pKTsKKworCWZvciAoaSA9IDA7IGkgPCBoYXNoLT5jc2l6ZTsgaSsrKSB7CisJCWhpID0gaGFzaC0+aXRlbXNbaV07CisJCXdoaWxlIChoaSkgeworCQkJdGhpID0gaGk7CisJCQloaSA9IHRoaS0+bmV4dDsKKwkJCWlkeCA9IGhhc2hpZHgodGhpLT5uYW1lKSAlIG5ld3NpemU7CisJCQl0aGktPm5leHQgPSBuZXdpdGVtc1tpZHhdOworCQkJbmV3aXRlbXNbaWR4XSA9IHRoaTsKKwkJfQorCX0KKworCWZyZWUoaGFzaC0+aXRlbXMpOworCWhhc2gtPmNzaXplID0gbmV3c2l6ZTsKKwloYXNoLT5pdGVtcyA9IG5ld2l0ZW1zOworfQorCisvKiBmaW5kIGl0ZW0gaW4gaGFzaCwgYWRkIGl0IGlmIG5lY2Vzc2FyeS4gUmV0dXJuIHB0ciB0byBkYXRhICovCitzdGF0aWMgdm9pZCAqaGFzaF9maW5kKHhoYXNoICpoYXNoLCBjb25zdCBjaGFyICpuYW1lKQoreworCWhhc2hfaXRlbSAqaGk7CisJdW5zaWduZWQgaWR4OworCWludCBsOworCisJaGkgPSBoYXNoX3NlYXJjaChoYXNoLCBuYW1lKTsKKwlpZiAoIWhpKSB7CisJCWlmICgrK2hhc2gtPm5lbCAvIGhhc2gtPmNzaXplID4gMTApCisJCQloYXNoX3JlYnVpbGQoaGFzaCk7CisKKwkJbCA9IHN0cmxlbihuYW1lKSArIDE7CisJCWhpID0geHphbGxvYyhzaXplb2YoKmhpKSArIGwpOworCQlzdHJjcHkoaGktPm5hbWUsIG5hbWUpOworCisJCWlkeCA9IGhhc2hpZHgobmFtZSkgJSBoYXNoLT5jc2l6ZTsKKwkJaGktPm5leHQgPSBoYXNoLT5pdGVtc1tpZHhdOworCQloYXNoLT5pdGVtc1tpZHhdID0gaGk7CisJCWhhc2gtPmdsZW4gKz0gbDsKKwl9CisJcmV0dXJuICZoaS0+ZGF0YTsKK30KKworI2RlZmluZSBmaW5kdmFyKGhhc2gsIG5hbWUpICgodmFyKikgICAgaGFzaF9maW5kKChoYXNoKSwgKG5hbWUpKSkKKyNkZWZpbmUgbmV3dmFyKG5hbWUpICAgICAgICAoKHZhciopICAgIGhhc2hfZmluZCh2aGFzaCwgKG5hbWUpKSkKKyNkZWZpbmUgbmV3ZmlsZShuYW1lKSAgICAgICAoKHJzdHJlYW0qKWhhc2hfZmluZChmZGhhc2gsIChuYW1lKSkpCisjZGVmaW5lIG5ld2Z1bmMobmFtZSkgICAgICAgKChmdW5jKikgICBoYXNoX2ZpbmQoZm5oYXNoLCAobmFtZSkpKQorCitzdGF0aWMgdm9pZCBoYXNoX3JlbW92ZSh4aGFzaCAqaGFzaCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwloYXNoX2l0ZW0gKmhpLCAqKnBoaTsKKworCXBoaSA9ICZoYXNoLT5pdGVtc1toYXNoaWR4KG5hbWUpICUgaGFzaC0+Y3NpemVdOworCXdoaWxlICgqcGhpKSB7CisJCWhpID0gKnBoaTsKKwkJaWYgKHN0cmNtcChoaS0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJaGFzaC0+Z2xlbiAtPSAoc3RybGVuKG5hbWUpICsgMSk7CisJCQloYXNoLT5uZWwtLTsKKwkJCSpwaGkgPSBoaS0+bmV4dDsKKwkJCWZyZWUoaGkpOworCQkJYnJlYWs7CisJCX0KKwkJcGhpID0gJmhpLT5uZXh0OworCX0KK30KKworLyogLS0tLS0tIHNvbWUgdXNlZnVsIGZ1bmN0aW9ucyAtLS0tLS0gKi8KKworc3RhdGljIGNoYXIgKnNraXBfc3BhY2VzKGNoYXIgKnApCit7CisJd2hpbGUgKDEpIHsKKwkJaWYgKCpwID09ICdcXCcgJiYgcFsxXSA9PSAnXG4nKSB7CisJCQlwKys7CisJCQl0X2xpbmVubysrOworCQl9IGVsc2UgaWYgKCpwICE9ICcgJyAmJiAqcCAhPSAnXHQnKSB7CisJCQlicmVhazsKKwkJfQorCQlwKys7CisJfQorCXJldHVybiBwOworfQorCisvKiByZXR1cm5zIG9sZCAqcywgYWR2YW5jZXMgKnMgcGFzdCB3b3JkIGFuZCB0ZXJtaW5hdGluZyBOVUwgKi8KK3N0YXRpYyBjaGFyICpuZXh0d29yZChjaGFyICoqcykKK3sKKwljaGFyICpwID0gKnM7CisJd2hpbGUgKCooKnMpKysgIT0gJ1wwJykKKwkJY29udGludWU7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyIG5leHRjaGFyKGNoYXIgKipzKQoreworCWNoYXIgYywgKnBwczsKKworCWMgPSAqKCpzKSsrOworCXBwcyA9ICpzOworCWlmIChjID09ICdcXCcpCisJCWMgPSBiYl9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZSgoY29uc3QgY2hhcioqKXMpOworCS8qIEV4YW1wbGUgYXdrIHN0YXRlbWVudDoKKwkgKiBzID0gImFiY1wiZGVmIgorCSAqIHdlIG11c3QgdHJlYXQgXCIgYXMgIgorCSAqLworCWlmIChjID09ICdcXCcgJiYgKnMgPT0gcHBzKSB7IC8qIHVucmVjb2duaXplZCBcej8gKi8KKwkJYyA9ICooKnMpOyAvKiB5ZXMsIGZldGNoIHogKi8KKwkJaWYgKGMpCisJCQkoKnMpKys7IC8qIGFkdmFuY2UgdW5sZXNzIHogPSBOVUwgKi8KKwl9CisJcmV0dXJuIGM7Cit9CisKKy8qIFRPRE86IG1lcmdlIHdpdGggc3RyY3B5X2FuZF9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZXMoKT8KKyAqLworc3RhdGljIHZvaWQgdW5lc2NhcGVfc3RyaW5nX2luX3BsYWNlKGNoYXIgKnMxKQoreworCWNoYXIgKnMgPSBzMTsKKwl3aGlsZSAoKCpzMSA9IG5leHRjaGFyKCZzKSkgIT0gJ1wwJykKKwkJczErKzsKK30KKworc3RhdGljIEFMV0FZU19JTkxJTkUgaW50IGlzYWxudW1fKGludCBjKQoreworCXJldHVybiAoaXNhbG51bShjKSB8fCBjID09ICdfJyk7Cit9CisKK3N0YXRpYyBkb3VibGUgbXlfc3RydG9kKGNoYXIgKipwcCkKK3sKKwljaGFyICpjcCA9ICpwcDsKKwlpZiAoRU5BQkxFX0RFU0tUT1AgJiYgY3BbMF0gPT0gJzAnKSB7CisJCS8qIE1pZ2h0IGJlIGhleCBvciBvY3RhbCBpbnRlZ2VyOiAweDEyM2FiYyBvciAwNzc3NyAqLworCQljaGFyIGMgPSAoY3BbMV0gfCAweDIwKTsKKwkJaWYgKGMgPT0gJ3gnIHx8IGlzZGlnaXQoY3BbMV0pKSB7CisJCQl1bnNpZ25lZCBsb25nIGxvbmcgdWxsID0gc3RydG91bGwoY3AsIHBwLCAwKTsKKwkJCWlmIChjID09ICd4JykKKwkJCQlyZXR1cm4gdWxsOworCQkJYyA9ICoqcHA7CisJCQlpZiAoIWlzZGlnaXQoYykgJiYgYyAhPSAnLicpCisJCQkJcmV0dXJuIHVsbDsKKwkJCS8qIGVsc2U6IGl0IG1heSBiZSBhIGZsb2F0aW5nIG51bWJlci4gRXhhbXBsZXM6CisJCQkgKiAwMDkuMTIzICgqcHAgcG9pbnRzIHRvICc5JykKKwkJCSAqIDAwMC4xMjMgKCpwcCBwb2ludHMgdG8gJy4nKQorCQkJICogZmFsbCB0aHJvdWdoIHRvIHN0cnRvZC4KKwkJCSAqLworCQl9CisJfQorCXJldHVybiBzdHJ0b2QoY3AsIHBwKTsKK30KKworLyogLS0tLS0tLS0gd29ya2luZyB3aXRoIHZhcmlhYmxlcyAoc2V0L2dldC9jb3B5L2V0YykgLS0tLS0tLS0gKi8KKworc3RhdGljIHhoYXNoICppYW1hcnJheSh2YXIgKnYpCit7CisJdmFyICphID0gdjsKKworCXdoaWxlIChhLT50eXBlICYgVkZfQ0hJTEQpCisJCWEgPSBhLT54LnBhcmVudDsKKworCWlmICghKGEtPnR5cGUgJiBWRl9BUlJBWSkpIHsKKwkJYS0+dHlwZSB8PSBWRl9BUlJBWTsKKwkJYS0+eC5hcnJheSA9IGhhc2hfaW5pdCgpOworCX0KKwlyZXR1cm4gYS0+eC5hcnJheTsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfYXJyYXkoeGhhc2ggKmFycmF5KQoreworCXVuc2lnbmVkIGk7CisJaGFzaF9pdGVtICpoaSwgKnRoaTsKKworCWZvciAoaSA9IDA7IGkgPCBhcnJheS0+Y3NpemU7IGkrKykgeworCQloaSA9IGFycmF5LT5pdGVtc1tpXTsKKwkJd2hpbGUgKGhpKSB7CisJCQl0aGkgPSBoaTsKKwkJCWhpID0gaGktPm5leHQ7CisJCQlmcmVlKHRoaS0+ZGF0YS52LnN0cmluZyk7CisJCQlmcmVlKHRoaSk7CisJCX0KKwkJYXJyYXktPml0ZW1zW2ldID0gTlVMTDsKKwl9CisJYXJyYXktPmdsZW4gPSBhcnJheS0+bmVsID0gMDsKK30KKworLyogY2xlYXIgYSB2YXJpYWJsZSAqLworc3RhdGljIHZhciAqY2xydmFyKHZhciAqdikKK3sKKwlpZiAoISh2LT50eXBlICYgVkZfRlNUUikpCisJCWZyZWUodi0+c3RyaW5nKTsKKworCXYtPnR5cGUgJj0gVkZfRE9OVFRPVUNIOworCXYtPnR5cGUgfD0gVkZfRElSVFk7CisJdi0+c3RyaW5nID0gTlVMTDsKKwlyZXR1cm4gdjsKK30KKworLyogYXNzaWduIHN0cmluZyB2YWx1ZSB0byB2YXJpYWJsZSAqLworc3RhdGljIHZhciAqc2V0dmFyX3AodmFyICp2LCBjaGFyICp2YWx1ZSkKK3sKKwljbHJ2YXIodik7CisJdi0+c3RyaW5nID0gdmFsdWU7CisJaGFuZGxlX3NwZWNpYWwodik7CisJcmV0dXJuIHY7Cit9CisKKy8qIHNhbWUgYXMgc2V0dmFyX3AgYnV0IG1ha2UgYSBjb3B5IG9mIHN0cmluZyAqLworc3RhdGljIHZhciAqc2V0dmFyX3ModmFyICp2LCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlyZXR1cm4gc2V0dmFyX3AodiwgKHZhbHVlICYmICp2YWx1ZSkgPyB4c3RyZHVwKHZhbHVlKSA6IE5VTEwpOworfQorCisvKiBzYW1lIGFzIHNldHZhcl9zIGJ1dCBzZXRzIFVTRVIgZmxhZyAqLworc3RhdGljIHZhciAqc2V0dmFyX3UodmFyICp2LCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwl2ID0gc2V0dmFyX3ModiwgdmFsdWUpOworCXYtPnR5cGUgfD0gVkZfVVNFUjsKKwlyZXR1cm4gdjsKK30KKworLyogc2V0IGFycmF5IGVsZW1lbnQgdG8gdXNlciBzdHJpbmcgKi8KK3N0YXRpYyB2b2lkIHNldGFyaV91KHZhciAqYSwgaW50IGlkeCwgY29uc3QgY2hhciAqcykKK3sKKwl2YXIgKnY7CisKKwl2ID0gZmluZHZhcihpYW1hcnJheShhKSwgaXRvYShpZHgpKTsKKwlzZXR2YXJfdSh2LCBzKTsKK30KKworLyogYXNzaWduIG51bWVyaWMgdmFsdWUgdG8gdmFyaWFibGUgKi8KK3N0YXRpYyB2YXIgKnNldHZhcl9pKHZhciAqdiwgZG91YmxlIHZhbHVlKQoreworCWNscnZhcih2KTsKKwl2LT50eXBlIHw9IFZGX05VTUJFUjsKKwl2LT5udW1iZXIgPSB2YWx1ZTsKKwloYW5kbGVfc3BlY2lhbCh2KTsKKwlyZXR1cm4gdjsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmdldHZhcl9zKHZhciAqdikKK3sKKwkvKiBpZiB2IGlzIG51bWVyaWMgYW5kIGhhcyBubyBjYWNoZWQgc3RyaW5nLCBjb252ZXJ0IGl0IHRvIHN0cmluZyAqLworCWlmICgodi0+dHlwZSAmIChWRl9OVU1CRVIgfCBWRl9DQUNIRUQpKSA9PSBWRl9OVU1CRVIpIHsKKwkJZm10X251bShnX2J1ZiwgTUFYVkFSRk1ULCBnZXR2YXJfcyhpbnR2YXJbQ09OVkZNVF0pLCB2LT5udW1iZXIsIFRSVUUpOworCQl2LT5zdHJpbmcgPSB4c3RyZHVwKGdfYnVmKTsKKwkJdi0+dHlwZSB8PSBWRl9DQUNIRUQ7CisJfQorCXJldHVybiAodi0+c3RyaW5nID09IE5VTEwpID8gIiIgOiB2LT5zdHJpbmc7Cit9CisKK3N0YXRpYyBkb3VibGUgZ2V0dmFyX2kodmFyICp2KQoreworCWNoYXIgKnM7CisKKwlpZiAoKHYtPnR5cGUgJiAoVkZfTlVNQkVSIHwgVkZfQ0FDSEVEKSkgPT0gMCkgeworCQl2LT5udW1iZXIgPSAwOworCQlzID0gdi0+c3RyaW5nOworCQlpZiAocyAmJiAqcykgeworCQkJZGVidWdfcHJpbnRmX2V2YWwoImdldHZhcl9pOiAnJXMnLT4iLCBzKTsKKwkJCXYtPm51bWJlciA9IG15X3N0cnRvZCgmcyk7CisJCQlkZWJ1Z19wcmludGZfZXZhbCgiJWYgKHM6JyVzJylcbiIsIHYtPm51bWJlciwgcyk7CisJCQlpZiAodi0+dHlwZSAmIFZGX1VTRVIpIHsKKwkJCQlzID0gc2tpcF9zcGFjZXMocyk7CisJCQkJaWYgKCpzICE9ICdcMCcpCisJCQkJCXYtPnR5cGUgJj0gflZGX1VTRVI7CisJCQl9CisJCX0gZWxzZSB7CisJCQlkZWJ1Z19wcmludGZfZXZhbCgiZ2V0dmFyX2k6ICclcyctPnplcm9cbiIsIHMpOworCQkJdi0+dHlwZSAmPSB+VkZfVVNFUjsKKwkJfQorCQl2LT50eXBlIHw9IFZGX0NBQ0hFRDsKKwl9CisJZGVidWdfcHJpbnRmX2V2YWwoImdldHZhcl9pOiAlZlxuIiwgdi0+bnVtYmVyKTsKKwlyZXR1cm4gdi0+bnVtYmVyOworfQorCisvKiBVc2VkIGZvciBvcGVyYW5kcyBvZiBiaXR3aXNlIG9wcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ2V0dmFyX2lfaW50KHZhciAqdikKK3sKKwlkb3VibGUgZCA9IGdldHZhcl9pKHYpOworCisJLyogQ2FzdGluZyBkb3VibGVzIHRvIGxvbmdzIGlzIHVuZGVmaW5lZCBmb3IgdmFsdWVzIG91dHNpZGUKKwkgKiBvZiB0YXJnZXQgdHlwZSByYW5nZS4gVHJ5IHRvIHdpZGVuIGl0IGFzIG11Y2ggYXMgcG9zc2libGUgKi8KKwlpZiAoZCA+PSAwKQorCQlyZXR1cm4gKHVuc2lnbmVkIGxvbmcpZDsKKwkvKiBXaHk/IFRoaW5rIGFib3V0IGQgPT0gLTQyOTQ5NjcyOTUuMCAoYXNzdW1pbmcgMzJiaXQgbG9uZ3MpICovCisJcmV0dXJuIC0gKGxvbmcpICh1bnNpZ25lZCBsb25nKSAoLWQpOworfQorCitzdGF0aWMgdmFyICpjb3B5dmFyKHZhciAqZGVzdCwgY29uc3QgdmFyICpzcmMpCit7CisJaWYgKGRlc3QgIT0gc3JjKSB7CisJCWNscnZhcihkZXN0KTsKKwkJZGVzdC0+dHlwZSB8PSAoc3JjLT50eXBlICYgfihWRl9ET05UVE9VQ0ggfCBWRl9GU1RSKSk7CisJCWRlYnVnX3ByaW50Zl9ldmFsKCJjb3B5dmFyOiBudW1iZXI6JWYgc3RyaW5nOiclcydcbiIsIHNyYy0+bnVtYmVyLCBzcmMtPnN0cmluZyk7CisJCWRlc3QtPm51bWJlciA9IHNyYy0+bnVtYmVyOworCQlpZiAoc3JjLT5zdHJpbmcpCisJCQlkZXN0LT5zdHJpbmcgPSB4c3RyZHVwKHNyYy0+c3RyaW5nKTsKKwl9CisJaGFuZGxlX3NwZWNpYWwoZGVzdCk7CisJcmV0dXJuIGRlc3Q7Cit9CisKK3N0YXRpYyB2YXIgKmluY3Zhcih2YXIgKnYpCit7CisJcmV0dXJuIHNldHZhcl9pKHYsIGdldHZhcl9pKHYpICsgMS4wKTsKK30KKworLyogcmV0dXJuIHRydWUgaWYgdiBpcyBudW1iZXIgb3IgbnVtZXJpYyBzdHJpbmcgKi8KK3N0YXRpYyBpbnQgaXNfbnVtZXJpYyh2YXIgKnYpCit7CisJZ2V0dmFyX2kodik7CisJcmV0dXJuICgodi0+dHlwZSBeIFZGX0RJUlRZKSAmIChWRl9OVU1CRVIgfCBWRl9VU0VSIHwgVkZfRElSVFkpKTsKK30KKworLyogcmV0dXJuIDEgd2hlbiB2YWx1ZSBvZiB2IGNvcnJlc3BvbmRzIHRvIHRydWUsIDAgb3RoZXJ3aXNlICovCitzdGF0aWMgaW50IGlzdHJ1ZSh2YXIgKnYpCit7CisJaWYgKGlzX251bWVyaWModikpCisJCXJldHVybiAodi0+bnVtYmVyICE9IDApOworCXJldHVybiAodi0+c3RyaW5nICYmIHYtPnN0cmluZ1swXSk7Cit9CisKKy8qIHRlbXBvcmFyeSB2YXJpYWJsZXMgYWxsb2NhdG9yLiBMYXN0IGFsbG9jYXRlZCBzaG91bGQgYmUgZmlyc3QgZnJlZWQgKi8KK3N0YXRpYyB2YXIgKm52YWxsb2MoaW50IG4pCit7CisJbnZibG9jayAqcGIgPSBOVUxMOworCXZhciAqdiwgKnI7CisJaW50IHNpemU7CisKKwl3aGlsZSAoZ19jYikgeworCQlwYiA9IGdfY2I7CisJCWlmICgoZ19jYi0+cG9zIC0gZ19jYi0+bnYpICsgbiA8PSBnX2NiLT5zaXplKQorCQkJYnJlYWs7CisJCWdfY2IgPSBnX2NiLT5uZXh0OworCX0KKworCWlmICghZ19jYikgeworCQlzaXplID0gKG4gPD0gTUlOTlZCTE9DSykgPyBNSU5OVkJMT0NLIDogbjsKKwkJZ19jYiA9IHh6YWxsb2Moc2l6ZW9mKG52YmxvY2spICsgc2l6ZSAqIHNpemVvZih2YXIpKTsKKwkJZ19jYi0+c2l6ZSA9IHNpemU7CisJCWdfY2ItPnBvcyA9IGdfY2ItPm52OworCQlnX2NiLT5wcmV2ID0gcGI7CisJCS8qZ19jYi0+bmV4dCA9IE5VTEw7IC0geHphbGxvYyBkaWQgaXQgKi8KKwkJaWYgKHBiKQorCQkJcGItPm5leHQgPSBnX2NiOworCX0KKworCXYgPSByID0gZ19jYi0+cG9zOworCWdfY2ItPnBvcyArPSBuOworCisJd2hpbGUgKHYgPCBnX2NiLT5wb3MpIHsKKwkJdi0+dHlwZSA9IDA7CisJCXYtPnN0cmluZyA9IE5VTEw7CisJCXYrKzsKKwl9CisKKwlyZXR1cm4gcjsKK30KKworc3RhdGljIHZvaWQgbnZmcmVlKHZhciAqdikKK3sKKwl2YXIgKnA7CisKKwlpZiAodiA8IGdfY2ItPm52IHx8IHYgPj0gZ19jYi0+cG9zKQorCQlzeW50YXhfZXJyb3IoRU1TR19JTlRFUk5BTF9FUlJPUik7CisKKwlmb3IgKHAgPSB2OyBwIDwgZ19jYi0+cG9zOyBwKyspIHsKKwkJaWYgKChwLT50eXBlICYgKFZGX0FSUkFZIHwgVkZfQ0hJTEQpKSA9PSBWRl9BUlJBWSkgeworCQkJY2xlYXJfYXJyYXkoaWFtYXJyYXkocCkpOworCQkJZnJlZShwLT54LmFycmF5LT5pdGVtcyk7CisJCQlmcmVlKHAtPnguYXJyYXkpOworCQl9CisJCWlmIChwLT50eXBlICYgVkZfV0FMSykgeworCQkJd2Fsa2VyX2xpc3QgKm47CisJCQl3YWxrZXJfbGlzdCAqdyA9IHAtPngud2Fsa2VyOworCQkJZGVidWdfcHJpbnRmX3dhbGtlcigibnZmcmVlOiBmcmVlaW5nIHdhbGtlciBAJXBcbiIsICZwLT54LndhbGtlcik7CisJCQlwLT54LndhbGtlciA9IE5VTEw7CisJCQl3aGlsZSAodykgeworCQkJCW4gPSB3LT5wcmV2OworCQkJCWRlYnVnX3ByaW50Zl93YWxrZXIoIiBmcmVlKCVwKVxuIiwgdyk7CisJCQkJZnJlZSh3KTsKKwkJCQl3ID0gbjsKKwkJCX0KKwkJfQorCQljbHJ2YXIocCk7CisJfQorCisJZ19jYi0+cG9zID0gdjsKKwl3aGlsZSAoZ19jYi0+cHJldiAmJiBnX2NiLT5wb3MgPT0gZ19jYi0+bnYpIHsKKwkJZ19jYiA9IGdfY2ItPnByZXY7CisJfQorfQorCisvKiAtLS0tLS0tIGF3ayBwcm9ncmFtIHRleHQgcGFyc2luZyAtLS0tLS0tICovCisKKy8qIFBhcnNlIG5leHQgdG9rZW4gcG9pbnRlZCBieSBnbG9iYWwgcG9zLCBwbGFjZSByZXN1bHRzIGludG8gZ2xvYmFsIHR0dC4KKyAqIElmIHRva2VuIGlzbid0IGV4cGVjdGVkLCBnaXZlIGF3YXkuIFJldHVybiB0b2tlbiBjbGFzcworICovCitzdGF0aWMgdWludDMyX3QgbmV4dF90b2tlbih1aW50MzJfdCBleHBlY3RlZCkKK3sKKyNkZWZpbmUgY29uY2F0X2luc2VydGVkIChHLm5leHRfdG9rZW5fX2NvbmNhdF9pbnNlcnRlZCkKKyNkZWZpbmUgc2F2ZV90Y2xhc3MgICAgIChHLm5leHRfdG9rZW5fX3NhdmVfdGNsYXNzKQorI2RlZmluZSBzYXZlX2luZm8gICAgICAgKEcubmV4dF90b2tlbl9fc2F2ZV9pbmZvKQorLyogSW5pdGlhbGl6ZWQgdG8gVENfT1BURVJNOiAqLworI2RlZmluZSBsdGNsYXNzICAgICAgICAgKEcubmV4dF90b2tlbl9fbHRjbGFzcykKKworCWNoYXIgKnAsICpzOworCWNvbnN0IGNoYXIgKnRsOworCXVpbnQzMl90IHRjOworCWNvbnN0IHVpbnQzMl90ICp0aTsKKworCWlmICh0X3JvbGxiYWNrKSB7CisJCXRfcm9sbGJhY2sgPSBGQUxTRTsKKwl9IGVsc2UgaWYgKGNvbmNhdF9pbnNlcnRlZCkgeworCQljb25jYXRfaW5zZXJ0ZWQgPSBGQUxTRTsKKwkJdF90Y2xhc3MgPSBzYXZlX3RjbGFzczsKKwkJdF9pbmZvID0gc2F2ZV9pbmZvOworCX0gZWxzZSB7CisJCXAgPSBnX3BvczsKKyByZWFkbmV4dDoKKwkJcCA9IHNraXBfc3BhY2VzKHApOworCQlnX2xpbmVubyA9IHRfbGluZW5vOworCQlpZiAoKnAgPT0gJyMnKQorCQkJd2hpbGUgKCpwICE9ICdcbicgJiYgKnAgIT0gJ1wwJykKKwkJCQlwKys7CisKKwkJaWYgKCpwID09ICdcbicpCisJCQl0X2xpbmVubysrOworCisJCWlmICgqcCA9PSAnXDAnKSB7CisJCQl0YyA9IFRDX0VPRjsKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiJXM6IHRva2VuIGZvdW5kOiBUQ19FT0ZcbiIsIF9fZnVuY19fKTsKKwkJfSBlbHNlIGlmICgqcCA9PSAnXCInKSB7CisJCQkvKiBpdCdzIGEgc3RyaW5nICovCisJCQl0X3N0cmluZyA9IHMgPSArK3A7CisJCQl3aGlsZSAoKnAgIT0gJ1wiJykgeworCQkJCWNoYXIgKnBwOworCQkJCWlmICgqcCA9PSAnXDAnIHx8ICpwID09ICdcbicpCisJCQkJCXN5bnRheF9lcnJvcihFTVNHX1VORVhQX0VPUyk7CisJCQkJcHAgPSBwOworCQkJCSpzKysgPSBuZXh0Y2hhcigmcHApOworCQkJCXAgPSBwcDsKKwkJCX0KKwkJCXArKzsKKwkJCSpzID0gJ1wwJzsKKwkJCXRjID0gVENfU1RSSU5HOworCQkJZGVidWdfcHJpbnRmX3BhcnNlKCIlczogdG9rZW4gZm91bmQ6JyVzJyBUQ19TVFJJTkdcbiIsIF9fZnVuY19fLCB0X3N0cmluZyk7CisJCX0gZWxzZSBpZiAoKGV4cGVjdGVkICYgVENfUkVHRVhQKSAmJiAqcCA9PSAnLycpIHsKKwkJCS8qIGl0J3MgcmVnZXhwICovCisJCQl0X3N0cmluZyA9IHMgPSArK3A7CisJCQl3aGlsZSAoKnAgIT0gJy8nKSB7CisJCQkJaWYgKCpwID09ICdcMCcgfHwgKnAgPT0gJ1xuJykKKwkJCQkJc3ludGF4X2Vycm9yKEVNU0dfVU5FWFBfRU9TKTsKKwkJCQkqcyA9ICpwKys7CisJCQkJaWYgKCpzKysgPT0gJ1xcJykgeworCQkJCQljaGFyICpwcCA9IHA7CisJCQkJCXNbLTFdID0gYmJfcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UoKGNvbnN0IGNoYXIgKiopJnBwKTsKKwkJCQkJaWYgKCpwID09ICdcXCcpCisJCQkJCQkqcysrID0gJ1xcJzsKKwkJCQkJaWYgKHBwID09IHApCisJCQkJCQkqcysrID0gKnArKzsKKwkJCQkJZWxzZQorCQkJCQkJcCA9IHBwOworCQkJCX0KKwkJCX0KKwkJCXArKzsKKwkJCSpzID0gJ1wwJzsKKwkJCXRjID0gVENfUkVHRVhQOworCQkJZGVidWdfcHJpbnRmX3BhcnNlKCIlczogdG9rZW4gZm91bmQ6JyVzJyBUQ19SRUdFWFBcbiIsIF9fZnVuY19fLCB0X3N0cmluZyk7CisKKwkJfSBlbHNlIGlmICgqcCA9PSAnLicgfHwgaXNkaWdpdCgqcCkpIHsKKwkJCS8qIGl0J3MgYSBudW1iZXIgKi8KKwkJCWNoYXIgKnBwID0gcDsKKwkJCXRfZG91YmxlID0gbXlfc3RydG9kKCZwcCk7CisJCQlwID0gcHA7CisJCQlpZiAoKnAgPT0gJy4nKQorCQkJCXN5bnRheF9lcnJvcihFTVNHX1VORVhQX1RPS0VOKTsKKwkJCXRjID0gVENfTlVNQkVSOworCQkJZGVidWdfcHJpbnRmX3BhcnNlKCIlczogdG9rZW4gZm91bmQ6JWYgVENfTlVNQkVSXG4iLCBfX2Z1bmNfXywgdF9kb3VibGUpOworCQl9IGVsc2UgeworCQkJLyogc2VhcmNoIGZvciBzb21ldGhpbmcga25vd24gKi8KKwkJCXRsID0gdG9rZW5saXN0OworCQkJdGMgPSAweDAwMDAwMDAxOworCQkJdGkgPSB0b2tlbmluZm87CisJCQl3aGlsZSAoKnRsKSB7CisJCQkJaW50IGwgPSAodW5zaWduZWQgY2hhcikgKnRsKys7CisJCQkJaWYgKGwgPT0gKHVuc2lnbmVkIGNoYXIpIE5UQ0MpIHsKKwkJCQkJdGMgPDw9IDE7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvKiBpZiB0b2tlbiBjbGFzcyBpcyBleHBlY3RlZCwKKwkJCQkgKiB0b2tlbiBtYXRjaGVzLAorCQkJCSAqIGFuZCBpdCdzIG5vdCBhIGxvbmdlciB3b3JkLAorCQkJCSAqLworCQkJCWlmICgodGMgJiAoZXhwZWN0ZWQgfCBUQ19XT1JEIHwgVENfTkVXTElORSkpCisJCQkJICYmIHN0cm5jbXAocCwgdGwsIGwpID09IDAKKwkJCQkgJiYgISgodGMgJiBUQ19XT1JEKSAmJiBpc2FsbnVtXyhwW2xdKSkKKwkJCQkpIHsKKwkJCQkJLyogdGhlbiB0aGlzIGlzIHdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yICovCisJCQkJCXRfaW5mbyA9ICp0aTsKKwkJCQkJZGVidWdfcHJpbnRmX3BhcnNlKCIlczogdG9rZW4gZm91bmQ6JyUuKnMnIHRfaW5mbzoleFxuIiwgX19mdW5jX18sIGwsIHAsIHRfaW5mbyk7CisJCQkJCXAgKz0gbDsKKwkJCQkJZ290byB0b2tlbl9mb3VuZDsKKwkJCQl9CisJCQkJdGkrKzsKKwkJCQl0bCArPSBsOworCQkJfQorCQkJLyogbm90IGEga25vd24gdG9rZW4gKi8KKworCQkJLyogaXMgaXQgYSBuYW1lPyAodmFyL2FycmF5L2Z1bmN0aW9uKSAqLworCQkJaWYgKCFpc2FsbnVtXygqcCkpCisJCQkJc3ludGF4X2Vycm9yKEVNU0dfVU5FWFBfVE9LRU4pOyAvKiBubyAqLworCQkJLyogeWVzICovCisJCQl0X3N0cmluZyA9IC0tcDsKKwkJCXdoaWxlIChpc2FsbnVtXygqKytwKSkgeworCQkJCXBbLTFdID0gKnA7CisJCQl9CisJCQlwWy0xXSA9ICdcMCc7CisJCQl0YyA9IFRDX1ZBUklBQkxFOworCQkJLyogYWxzbyBjb25zdW1lIHdoaXRlc3BhY2UgYmV0d2VlbiBmdW5jdGlvbm5hbWUgYW5kIGJyYWNrZXQgKi8KKwkJCWlmICghKGV4cGVjdGVkICYgVENfVkFSSUFCTEUpIHx8IChleHBlY3RlZCAmIFRDX0FSUkFZKSkKKwkJCQlwID0gc2tpcF9zcGFjZXMocCk7CisJCQlpZiAoKnAgPT0gJygnKSB7CisJCQkJdGMgPSBUQ19GVU5DVElPTjsKKwkJCQlkZWJ1Z19wcmludGZfcGFyc2UoIiVzOiB0b2tlbiBmb3VuZDonJXMnIFRDX0ZVTkNUSU9OXG4iLCBfX2Z1bmNfXywgdF9zdHJpbmcpOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoKnAgPT0gJ1snKSB7CisJCQkJCXArKzsKKwkJCQkJdGMgPSBUQ19BUlJBWTsKKwkJCQkJZGVidWdfcHJpbnRmX3BhcnNlKCIlczogdG9rZW4gZm91bmQ6JyVzJyBUQ19BUlJBWVxuIiwgX19mdW5jX18sIHRfc3RyaW5nKTsKKwkJCQl9IGVsc2UKKwkJCQkJZGVidWdfcHJpbnRmX3BhcnNlKCIlczogdG9rZW4gZm91bmQ6JyVzJyBUQ19WQVJJQUJMRVxuIiwgX19mdW5jX18sIHRfc3RyaW5nKTsKKwkJCX0KKwkJfQorIHRva2VuX2ZvdW5kOgorCQlnX3BvcyA9IHA7CisKKwkJLyogc2tpcHBpbmcgbmV3bGluZXMgaW4gc29tZSBjYXNlcyAqLworCQlpZiAoKGx0Y2xhc3MgJiBUQ19OT1RFUk0pICYmICh0YyAmIFRDX05FV0xJTkUpKQorCQkJZ290byByZWFkbmV4dDsKKworCQkvKiBpbnNlcnQgY29uY2F0ZW5hdGlvbiBvcGVyYXRvciB3aGVuIG5lZWRlZCAqLworCQlpZiAoKGx0Y2xhc3MgJiBUQ19DT05DQVQxKSAmJiAodGMgJiBUQ19DT05DQVQyKSAmJiAoZXhwZWN0ZWQgJiBUQ19CSU5PUCkpIHsKKwkJCWNvbmNhdF9pbnNlcnRlZCA9IFRSVUU7CisJCQlzYXZlX3RjbGFzcyA9IHRjOworCQkJc2F2ZV9pbmZvID0gdF9pbmZvOworCQkJdGMgPSBUQ19CSU5PUDsKKwkJCXRfaW5mbyA9IE9DX0NPTkNBVCB8IFNTIHwgUCgzNSk7CisJCX0KKworCQl0X3RjbGFzcyA9IHRjOworCX0KKwlsdGNsYXNzID0gdF90Y2xhc3M7CisKKwkvKiBBcmUgd2UgcmVhZHkgZm9yIHRoaXM/ICovCisJaWYgKCEobHRjbGFzcyAmIGV4cGVjdGVkKSkgeworCQlzeW50YXhfZXJyb3IoKGx0Y2xhc3MgJiAoVENfTkVXTElORSB8IFRDX0VPRikpID8KKwkJCQlFTVNHX1VORVhQX0VPUyA6IEVNU0dfVU5FWFBfVE9LRU4pOworCX0KKworCXJldHVybiBsdGNsYXNzOworI3VuZGVmIGNvbmNhdF9pbnNlcnRlZAorI3VuZGVmIHNhdmVfdGNsYXNzCisjdW5kZWYgc2F2ZV9pbmZvCisjdW5kZWYgbHRjbGFzcworfQorCitzdGF0aWMgdm9pZCByb2xsYmFja190b2tlbih2b2lkKQoreworCXRfcm9sbGJhY2sgPSBUUlVFOworfQorCitzdGF0aWMgbm9kZSAqbmV3X25vZGUodWludDMyX3QgaW5mbykKK3sKKwlub2RlICpuOworCisJbiA9IHh6YWxsb2Moc2l6ZW9mKG5vZGUpKTsKKwluLT5pbmZvID0gaW5mbzsKKwluLT5saW5lbm8gPSBnX2xpbmVubzsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHZvaWQgbWtfcmVfbm9kZShjb25zdCBjaGFyICpzLCBub2RlICpuLCByZWdleF90ICpyZSkKK3sKKwluLT5pbmZvID0gT0NfUkVHRVhQOworCW4tPmwucmUgPSByZTsKKwluLT5yLmlyZSA9IHJlICsgMTsKKwl4cmVnY29tcChyZSwgcywgUkVHX0VYVEVOREVEKTsKKwl4cmVnY29tcChyZSArIDEsIHMsIFJFR19FWFRFTkRFRCB8IFJFR19JQ0FTRSk7Cit9CisKK3N0YXRpYyBub2RlICpjb25kaXRpb24odm9pZCkKK3sKKwluZXh0X3Rva2VuKFRDX1NFUVNUQVJUKTsKKwlyZXR1cm4gcGFyc2VfZXhwcihUQ19TRVFURVJNKTsKK30KKworLyogcGFyc2UgZXhwcmVzc2lvbiB0ZXJtaW5hdGVkIGJ5IGdpdmVuIGFyZ3VtZW50LCByZXR1cm4gcHRyCisgKiB0byBidWlsdCBzdWJ0cmVlLiBUZXJtaW5hdG9yIGlzIGVhdGVuIGJ5IHBhcnNlX2V4cHIgKi8KK3N0YXRpYyBub2RlICpwYXJzZV9leHByKHVpbnQzMl90IGlleHApCit7CisJbm9kZSBzbjsKKwlub2RlICpjbiA9ICZzbjsKKwlub2RlICp2biwgKmdscHRyOworCXVpbnQzMl90IHRjLCB4dGM7CisJdmFyICp2OworCisJZGVidWdfcHJpbnRmX3BhcnNlKCIlcygleClcbiIsIF9fZnVuY19fLCBpZXhwKTsKKworCXNuLmluZm8gPSBQUklNQVNLOworCXNuLnIubiA9IGdscHRyID0gTlVMTDsKKwl4dGMgPSBUQ19PUEVSQU5EIHwgVENfVU9QUFJFIHwgVENfUkVHRVhQIHwgaWV4cDsKKworCXdoaWxlICghKCh0YyA9IG5leHRfdG9rZW4oeHRjKSkgJiBpZXhwKSkgeworCisJCWlmIChnbHB0ciAmJiAodF9pbmZvID09IChPQ19DT01QQVJFIHwgVlYgfCBQKDM5KSB8IDIpKSkgeworCQkJLyogaW5wdXQgcmVkaXJlY3Rpb24gKDwpIGF0dGFjaGVkIHRvIGdscHRyIG5vZGUgKi8KKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiJXM6IGlucHV0IHJlZGlyXG4iLCBfX2Z1bmNfXyk7CisJCQljbiA9IGdscHRyLT5sLm4gPSBuZXdfbm9kZShPQ19DT05DQVQgfCBTUyB8IFAoMzcpKTsKKwkJCWNuLT5hLm4gPSBnbHB0cjsKKwkJCXh0YyA9IFRDX09QRVJBTkQgfCBUQ19VT1BQUkU7CisJCQlnbHB0ciA9IE5VTEw7CisKKwkJfSBlbHNlIGlmICh0YyAmIChUQ19CSU5PUCB8IFRDX1VPUFBPU1QpKSB7CisJCQlkZWJ1Z19wcmludGZfcGFyc2UoIiVzOiBUQ19CSU5PUCB8IFRDX1VPUFBPU1RcbiIsIF9fZnVuY19fKTsKKwkJCS8qIGZvciBiaW5hcnkgYW5kIHBvc3RmaXgtdW5hcnkgb3BlcmF0b3JzLCBqdW1wIGJhY2sgb3ZlcgorCQkJICogcHJldmlvdXMgb3BlcmF0b3JzIHdpdGggaGlnaGVyIHByaW9yaXR5ICovCisJCQl2biA9IGNuOworCQkJd2hpbGUgKCgodF9pbmZvICYgUFJJTUFTSykgPiAodm4tPmEubi0+aW5mbyAmIFBSSU1BU0syKSkKKwkJCSAgICB8fCAoKHRfaW5mbyA9PSB2bi0+aW5mbykgJiYgKCh0X2luZm8gJiBPUENMU01BU0spID09IE9DX0NPTE9OKSkKKwkJCSkgeworCQkJCXZuID0gdm4tPmEubjsKKwkJCX0KKwkJCWlmICgodF9pbmZvICYgT1BDTFNNQVNLKSA9PSBPQ19URVJOQVJZKQorCQkJCXRfaW5mbyArPSBQKDYpOworCQkJY24gPSB2bi0+YS5uLT5yLm4gPSBuZXdfbm9kZSh0X2luZm8pOworCQkJY24tPmEubiA9IHZuLT5hLm47CisJCQlpZiAodGMgJiBUQ19CSU5PUCkgeworCQkJCWNuLT5sLm4gPSB2bjsKKwkJCQl4dGMgPSBUQ19PUEVSQU5EIHwgVENfVU9QUFJFIHwgVENfUkVHRVhQOworCQkJCWlmICgodF9pbmZvICYgT1BDTFNNQVNLKSA9PSBPQ19QR0VUTElORSkgeworCQkJCQkvKiBpdCdzIGEgcGlwZSAqLworCQkJCQluZXh0X3Rva2VuKFRDX0dFVExJTkUpOworCQkJCQkvKiBnaXZlIG1heGltdW0gcHJpb3JpdHkgdG8gdGhpcyBwaXBlICovCisJCQkJCWNuLT5pbmZvICY9IH5QUklNQVNLOworCQkJCQl4dGMgPSBUQ19PUEVSQU5EIHwgVENfVU9QUFJFIHwgVENfQklOT1AgfCBpZXhwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJY24tPnIubiA9IHZuOworCQkJCXh0YyA9IFRDX09QRVJBTkQgfCBUQ19VT1BQUkUgfCBUQ19CSU5PUCB8IGlleHA7CisJCQl9CisJCQl2bi0+YS5uID0gY247CisKKwkJfSBlbHNlIHsKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiJXM6IG90aGVyXG4iLCBfX2Z1bmNfXyk7CisJCQkvKiBmb3Igb3BlcmFuZHMgYW5kIHByZWZpeC11bmFyeSBvcGVyYXRvcnMsIGF0dGFjaCB0aGVtCisJCQkgKiB0byBsYXN0IG5vZGUgKi8KKwkJCXZuID0gY247CisJCQljbiA9IHZuLT5yLm4gPSBuZXdfbm9kZSh0X2luZm8pOworCQkJY24tPmEubiA9IHZuOworCQkJeHRjID0gVENfT1BFUkFORCB8IFRDX1VPUFBSRSB8IFRDX1JFR0VYUDsKKwkJCWlmICh0YyAmIChUQ19PUEVSQU5EIHwgVENfUkVHRVhQKSkgeworCQkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiJXM6IFRDX09QRVJBTkQgfCBUQ19SRUdFWFBcbiIsIF9fZnVuY19fKTsKKwkJCQl4dGMgPSBUQ19VT1BQUkUgfCBUQ19VT1BQT1NUIHwgVENfQklOT1AgfCBUQ19PUEVSQU5EIHwgaWV4cDsKKwkJCQkvKiBvbmUgc2hvdWxkIGJlIHZlcnkgY2FyZWZ1bCB3aXRoIHN3aXRjaCBvbiB0Y2xhc3MgLQorCQkJCSAqIG9ubHkgc2ltcGxlIHRjbGFzc2VzIHNob3VsZCBiZSB1c2VkISAqLworCQkJCXN3aXRjaCAodGMpIHsKKwkJCQljYXNlIFRDX1ZBUklBQkxFOgorCQkJCWNhc2UgVENfQVJSQVk6CisJCQkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiJXM6IFRDX1ZBUklBQkxFIHwgVENfQVJSQVlcbiIsIF9fZnVuY19fKTsKKwkJCQkJY24tPmluZm8gPSBPQ19WQVI7CisJCQkJCXYgPSBoYXNoX3NlYXJjaChhaGFzaCwgdF9zdHJpbmcpOworCQkJCQlpZiAodiAhPSBOVUxMKSB7CisJCQkJCQljbi0+aW5mbyA9IE9DX0ZOQVJHOworCQkJCQkJY24tPmwuYWlkeCA9IHYtPnguYWlkeDsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWNuLT5sLnYgPSBuZXd2YXIodF9zdHJpbmcpOworCQkJCQl9CisJCQkJCWlmICh0YyAmIFRDX0FSUkFZKSB7CisJCQkJCQljbi0+aW5mbyB8PSB4UzsKKwkJCQkJCWNuLT5yLm4gPSBwYXJzZV9leHByKFRDX0FSUlRFUk0pOworCQkJCQl9CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBUQ19OVU1CRVI6CisJCQkJY2FzZSBUQ19TVFJJTkc6CisJCQkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiJXM6IFRDX05VTUJFUiB8IFRDX1NUUklOR1xuIiwgX19mdW5jX18pOworCQkJCQljbi0+aW5mbyA9IE9DX1ZBUjsKKwkJCQkJdiA9IGNuLT5sLnYgPSB4emFsbG9jKHNpemVvZih2YXIpKTsKKwkJCQkJaWYgKHRjICYgVENfTlVNQkVSKQorCQkJCQkJc2V0dmFyX2kodiwgdF9kb3VibGUpOworCQkJCQllbHNlCisJCQkJCQlzZXR2YXJfcyh2LCB0X3N0cmluZyk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBUQ19SRUdFWFA6CisJCQkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiJXM6IFRDX1JFR0VYUFxuIiwgX19mdW5jX18pOworCQkJCQlta19yZV9ub2RlKHRfc3RyaW5nLCBjbiwgeHphbGxvYyhzaXplb2YocmVnZXhfdCkqMikpOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgVENfRlVOQ1RJT046CisJCQkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiJXM6IFRDX0ZVTkNUSU9OXG4iLCBfX2Z1bmNfXyk7CisJCQkJCWNuLT5pbmZvID0gT0NfRlVOQzsKKwkJCQkJY24tPnIuZiA9IG5ld2Z1bmModF9zdHJpbmcpOworCQkJCQljbi0+bC5uID0gY29uZGl0aW9uKCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBUQ19TRVFTVEFSVDoKKwkJCQkJZGVidWdfcHJpbnRmX3BhcnNlKCIlczogVENfU0VRU1RBUlRcbiIsIF9fZnVuY19fKTsKKwkJCQkJY24gPSB2bi0+ci5uID0gcGFyc2VfZXhwcihUQ19TRVFURVJNKTsKKwkJCQkJaWYgKCFjbikKKwkJCQkJCXN5bnRheF9lcnJvcigiRW1wdHkgc2VxdWVuY2UiKTsKKwkJCQkJY24tPmEubiA9IHZuOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgVENfR0VUTElORToKKwkJCQkJZGVidWdfcHJpbnRmX3BhcnNlKCIlczogVENfR0VUTElORVxuIiwgX19mdW5jX18pOworCQkJCQlnbHB0ciA9IGNuOworCQkJCQl4dGMgPSBUQ19PUEVSQU5EIHwgVENfVU9QUFJFIHwgVENfQklOT1AgfCBpZXhwOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgVENfQlVJTFRJTjoKKwkJCQkJZGVidWdfcHJpbnRmX3BhcnNlKCIlczogVENfQlVJTFRJTlxuIiwgX19mdW5jX18pOworCQkJCQljbi0+bC5uID0gY29uZGl0aW9uKCk7CisJCQkJCWJyZWFrOworCisJCQkJY2FzZSBUQ19MRU5HVEg6CisJCQkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiJXM6IFRDX0xFTkdUSFxuIiwgX19mdW5jX18pOworCQkJCQluZXh0X3Rva2VuKFRDX1NFUVNUQVJUIHwgVENfT1BURVJNIHwgVENfR1JQVEVSTSk7CisJCQkJCXJvbGxiYWNrX3Rva2VuKCk7CisJCQkJCWlmICh0X3RjbGFzcyAmIFRDX1NFUVNUQVJUKSB7CisJCQkJCQkvKiBJdCB3YXMgYSAiKCIgdG9rZW4uIEhhbmRsZSBqdXN0IGxpa2UgVENfQlVJTFRJTiAqLworCQkJCQkJY24tPmwubiA9IGNvbmRpdGlvbigpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWRlYnVnX3ByaW50Zl9wYXJzZSgiJXMoKSByZXR1cm5zICVwXG4iLCBfX2Z1bmNfXywgc24uci5uKTsKKwlyZXR1cm4gc24uci5uOworfQorCisvKiBhZGQgbm9kZSB0byBjaGFpbi4gUmV0dXJuIHB0ciB0byBhbGxvYydkIG5vZGUgKi8KK3N0YXRpYyBub2RlICpjaGFpbl9ub2RlKHVpbnQzMl90IGluZm8pCit7CisJbm9kZSAqbjsKKworCWlmICghc2VxLT5maXJzdCkKKwkJc2VxLT5maXJzdCA9IHNlcS0+bGFzdCA9IG5ld19ub2RlKDApOworCisJaWYgKHNlcS0+cHJvZ3JhbW5hbWUgIT0gZ19wcm9nbmFtZSkgeworCQlzZXEtPnByb2dyYW1uYW1lID0gZ19wcm9nbmFtZTsKKwkJbiA9IGNoYWluX25vZGUoT0NfTkVXU09VUkNFKTsKKwkJbi0+bC5uZXdfcHJvZ25hbWUgPSB4c3RyZHVwKGdfcHJvZ25hbWUpOworCX0KKworCW4gPSBzZXEtPmxhc3Q7CisJbi0+aW5mbyA9IGluZm87CisJc2VxLT5sYXN0ID0gbi0+YS5uID0gbmV3X25vZGUoT0NfRE9ORSk7CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHZvaWQgY2hhaW5fZXhwcih1aW50MzJfdCBpbmZvKQoreworCW5vZGUgKm47CisKKwluID0gY2hhaW5fbm9kZShpbmZvKTsKKwluLT5sLm4gPSBwYXJzZV9leHByKFRDX09QVEVSTSB8IFRDX0dSUFRFUk0pOworCWlmICh0X3RjbGFzcyAmIFRDX0dSUFRFUk0pCisJCXJvbGxiYWNrX3Rva2VuKCk7Cit9CisKK3N0YXRpYyBub2RlICpjaGFpbl9sb29wKG5vZGUgKm5uKQoreworCW5vZGUgKm4sICpuMiwgKnNhdmVfYnJrLCAqc2F2ZV9jb250OworCisJc2F2ZV9icmsgPSBicmVha19wdHI7CisJc2F2ZV9jb250ID0gY29udGludWVfcHRyOworCisJbiA9IGNoYWluX25vZGUoT0NfQlIgfCBWeCk7CisJY29udGludWVfcHRyID0gbmV3X25vZGUoT0NfRVhFQyk7CisJYnJlYWtfcHRyID0gbmV3X25vZGUoT0NfRVhFQyk7CisJY2hhaW5fZ3JvdXAoKTsKKwluMiA9IGNoYWluX25vZGUoT0NfRVhFQyB8IFZ4KTsKKwluMi0+bC5uID0gbm47CisJbjItPmEubiA9IG47CisJY29udGludWVfcHRyLT5hLm4gPSBuMjsKKwlicmVha19wdHItPmEubiA9IG4tPnIubiA9IHNlcS0+bGFzdDsKKworCWNvbnRpbnVlX3B0ciA9IHNhdmVfY29udDsKKwlicmVha19wdHIgPSBzYXZlX2JyazsKKworCXJldHVybiBuOworfQorCisvKiBwYXJzZSBncm91cCBhbmQgYXR0YWNoIGl0IHRvIGNoYWluICovCitzdGF0aWMgdm9pZCBjaGFpbl9ncm91cCh2b2lkKQoreworCXVpbnQzMl90IGM7CisJbm9kZSAqbiwgKm4yLCAqbjM7CisKKwlkbyB7CisJCWMgPSBuZXh0X3Rva2VuKFRDX0dSUFNFUSk7CisJfSB3aGlsZSAoYyAmIFRDX05FV0xJTkUpOworCisJaWYgKGMgJiBUQ19HUlBTVEFSVCkgeworCQlkZWJ1Z19wcmludGZfcGFyc2UoIiVzOiBUQ19HUlBTVEFSVFxuIiwgX19mdW5jX18pOworCQl3aGlsZSAobmV4dF90b2tlbihUQ19HUlBTRVEgfCBUQ19HUlBURVJNKSAhPSBUQ19HUlBURVJNKSB7CisJCQlkZWJ1Z19wcmludGZfcGFyc2UoIiVzOiAhVENfR1JQVEVSTVxuIiwgX19mdW5jX18pOworCQkJaWYgKHRfdGNsYXNzICYgVENfTkVXTElORSkKKwkJCQljb250aW51ZTsKKwkJCXJvbGxiYWNrX3Rva2VuKCk7CisJCQljaGFpbl9ncm91cCgpOworCQl9CisJCWRlYnVnX3ByaW50Zl9wYXJzZSgiJXM6IFRDX0dSUFRFUk1cbiIsIF9fZnVuY19fKTsKKwl9IGVsc2UgaWYgKGMgJiAoVENfT1BTRVEgfCBUQ19PUFRFUk0pKSB7CisJCWRlYnVnX3ByaW50Zl9wYXJzZSgiJXM6IFRDX09QU0VRIHwgVENfT1BURVJNXG4iLCBfX2Z1bmNfXyk7CisJCXJvbGxiYWNrX3Rva2VuKCk7CisJCWNoYWluX2V4cHIoT0NfRVhFQyB8IFZ4KTsKKwl9IGVsc2UgeworCQkvKiBUQ19TVEFURU1OVCAqLworCQlkZWJ1Z19wcmludGZfcGFyc2UoIiVzOiBUQ19TVEFURU1OVCg/KVxuIiwgX19mdW5jX18pOworCQlzd2l0Y2ggKHRfaW5mbyAmIE9QQ0xTTUFTSykgeworCQljYXNlIFNUX0lGOgorCQkJZGVidWdfcHJpbnRmX3BhcnNlKCIlczogU1RfSUZcbiIsIF9fZnVuY19fKTsKKwkJCW4gPSBjaGFpbl9ub2RlKE9DX0JSIHwgVngpOworCQkJbi0+bC5uID0gY29uZGl0aW9uKCk7CisJCQljaGFpbl9ncm91cCgpOworCQkJbjIgPSBjaGFpbl9ub2RlKE9DX0VYRUMpOworCQkJbi0+ci5uID0gc2VxLT5sYXN0OworCQkJaWYgKG5leHRfdG9rZW4oVENfR1JQU0VRIHwgVENfR1JQVEVSTSB8IFRDX0VMU0UpID09IFRDX0VMU0UpIHsKKwkJCQljaGFpbl9ncm91cCgpOworCQkJCW4yLT5hLm4gPSBzZXEtPmxhc3Q7CisJCQl9IGVsc2UgeworCQkJCXJvbGxiYWNrX3Rva2VuKCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFNUX1dISUxFOgorCQkJZGVidWdfcHJpbnRmX3BhcnNlKCIlczogU1RfV0hJTEVcbiIsIF9fZnVuY19fKTsKKwkJCW4yID0gY29uZGl0aW9uKCk7CisJCQluID0gY2hhaW5fbG9vcChOVUxMKTsKKwkJCW4tPmwubiA9IG4yOworCQkJYnJlYWs7CisKKwkJY2FzZSBTVF9ETzoKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiJXM6IFNUX0RPXG4iLCBfX2Z1bmNfXyk7CisJCQluMiA9IGNoYWluX25vZGUoT0NfRVhFQyk7CisJCQluID0gY2hhaW5fbG9vcChOVUxMKTsKKwkJCW4yLT5hLm4gPSBuLT5hLm47CisJCQluZXh0X3Rva2VuKFRDX1dISUxFKTsKKwkJCW4tPmwubiA9IGNvbmRpdGlvbigpOworCQkJYnJlYWs7CisKKwkJY2FzZSBTVF9GT1I6CisJCQlkZWJ1Z19wcmludGZfcGFyc2UoIiVzOiBTVF9GT1JcbiIsIF9fZnVuY19fKTsKKwkJCW5leHRfdG9rZW4oVENfU0VRU1RBUlQpOworCQkJbjIgPSBwYXJzZV9leHByKFRDX1NFTUlDT0wgfCBUQ19TRVFURVJNKTsKKwkJCWlmICh0X3RjbGFzcyAmIFRDX1NFUVRFUk0pIHsJLyogZm9yLWluICovCisJCQkJaWYgKChuMi0+aW5mbyAmIE9QQ0xTTUFTSykgIT0gT0NfSU4pCisJCQkJCXN5bnRheF9lcnJvcihFTVNHX1VORVhQX1RPS0VOKTsKKwkJCQluID0gY2hhaW5fbm9kZShPQ19XQUxLSU5JVCB8IFZWKTsKKwkJCQluLT5sLm4gPSBuMi0+bC5uOworCQkJCW4tPnIubiA9IG4yLT5yLm47CisJCQkJbiA9IGNoYWluX2xvb3AoTlVMTCk7CisJCQkJbi0+aW5mbyA9IE9DX1dBTEtORVhUIHwgVng7CisJCQkJbi0+bC5uID0gbjItPmwubjsKKwkJCX0gZWxzZSB7CQkJLyogZm9yICg7OykgKi8KKwkJCQluID0gY2hhaW5fbm9kZShPQ19FWEVDIHwgVngpOworCQkJCW4tPmwubiA9IG4yOworCQkJCW4yID0gcGFyc2VfZXhwcihUQ19TRU1JQ09MKTsKKwkJCQluMyA9IHBhcnNlX2V4cHIoVENfU0VRVEVSTSk7CisJCQkJbiA9IGNoYWluX2xvb3AobjMpOworCQkJCW4tPmwubiA9IG4yOworCQkJCWlmICghbjIpCisJCQkJCW4tPmluZm8gPSBPQ19FWEVDOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBPQ19QUklOVDoKKwkJY2FzZSBPQ19QUklOVEY6CisJCQlkZWJ1Z19wcmludGZfcGFyc2UoIiVzOiBPQ19QUklOVFtGXVxuIiwgX19mdW5jX18pOworCQkJbiA9IGNoYWluX25vZGUodF9pbmZvKTsKKwkJCW4tPmwubiA9IHBhcnNlX2V4cHIoVENfT1BURVJNIHwgVENfT1VUUkRSIHwgVENfR1JQVEVSTSk7CisJCQlpZiAodF90Y2xhc3MgJiBUQ19PVVRSRFIpIHsKKwkJCQluLT5pbmZvIHw9IHRfaW5mbzsKKwkJCQluLT5yLm4gPSBwYXJzZV9leHByKFRDX09QVEVSTSB8IFRDX0dSUFRFUk0pOworCQkJfQorCQkJaWYgKHRfdGNsYXNzICYgVENfR1JQVEVSTSkKKwkJCQlyb2xsYmFja190b2tlbigpOworCQkJYnJlYWs7CisKKwkJY2FzZSBPQ19CUkVBSzoKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiJXM6IE9DX0JSRUFLXG4iLCBfX2Z1bmNfXyk7CisJCQluID0gY2hhaW5fbm9kZShPQ19FWEVDKTsKKwkJCW4tPmEubiA9IGJyZWFrX3B0cjsKKwkJCWNoYWluX2V4cHIodF9pbmZvKTsKKwkJCWJyZWFrOworCisJCWNhc2UgT0NfQ09OVElOVUU6CisJCQlkZWJ1Z19wcmludGZfcGFyc2UoIiVzOiBPQ19DT05USU5VRVxuIiwgX19mdW5jX18pOworCQkJbiA9IGNoYWluX25vZGUoT0NfRVhFQyk7CisJCQluLT5hLm4gPSBjb250aW51ZV9wdHI7CisJCQljaGFpbl9leHByKHRfaW5mbyk7CisJCQlicmVhazsKKworCQkvKiBkZWxldGUsIG5leHQsIG5leHRmaWxlLCByZXR1cm4sIGV4aXQgKi8KKwkJZGVmYXVsdDoKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiJXM6IGRlZmF1bHRcbiIsIF9fZnVuY19fKTsKKwkJCWNoYWluX2V4cHIodF9pbmZvKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcGFyc2VfcHJvZ3JhbShjaGFyICpwKQoreworCXVpbnQzMl90IHRjbGFzczsKKwlub2RlICpjbjsKKwlmdW5jICpmOworCXZhciAqdjsKKworCWdfcG9zID0gcDsKKwl0X2xpbmVubyA9IDE7CisJd2hpbGUgKCh0Y2xhc3MgPSBuZXh0X3Rva2VuKFRDX0VPRiB8IFRDX09QU0VRIHwgVENfR1JQU1RBUlQgfAorCQkJVENfT1BURVJNIHwgVENfQkVHSU4gfCBUQ19FTkQgfCBUQ19GVU5DREVDTCkpICE9IFRDX0VPRikgeworCisJCWlmICh0Y2xhc3MgJiBUQ19PUFRFUk0pIHsKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiJXM6IFRDX09QVEVSTVxuIiwgX19mdW5jX18pOworCQkJY29udGludWU7CisJCX0KKworCQlzZXEgPSAmbWFpbnNlcTsKKwkJaWYgKHRjbGFzcyAmIFRDX0JFR0lOKSB7CisJCQlkZWJ1Z19wcmludGZfcGFyc2UoIiVzOiBUQ19CRUdJTlxuIiwgX19mdW5jX18pOworCQkJc2VxID0gJmJlZ2luc2VxOworCQkJY2hhaW5fZ3JvdXAoKTsKKwkJfSBlbHNlIGlmICh0Y2xhc3MgJiBUQ19FTkQpIHsKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiJXM6IFRDX0VORFxuIiwgX19mdW5jX18pOworCQkJc2VxID0gJmVuZHNlcTsKKwkJCWNoYWluX2dyb3VwKCk7CisJCX0gZWxzZSBpZiAodGNsYXNzICYgVENfRlVOQ0RFQ0wpIHsKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiJXM6IFRDX0ZVTkNERUNMXG4iLCBfX2Z1bmNfXyk7CisJCQluZXh0X3Rva2VuKFRDX0ZVTkNUSU9OKTsKKwkJCWdfcG9zKys7CisJCQlmID0gbmV3ZnVuYyh0X3N0cmluZyk7CisJCQlmLT5ib2R5LmZpcnN0ID0gTlVMTDsKKwkJCWYtPm5hcmdzID0gMDsKKwkJCXdoaWxlIChuZXh0X3Rva2VuKFRDX1ZBUklBQkxFIHwgVENfU0VRVEVSTSkgJiBUQ19WQVJJQUJMRSkgeworCQkJCXYgPSBmaW5kdmFyKGFoYXNoLCB0X3N0cmluZyk7CisJCQkJdi0+eC5haWR4ID0gZi0+bmFyZ3MrKzsKKworCQkJCWlmIChuZXh0X3Rva2VuKFRDX0NPTU1BIHwgVENfU0VRVEVSTSkgJiBUQ19TRVFURVJNKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXNlcSA9ICZmLT5ib2R5OworCQkJY2hhaW5fZ3JvdXAoKTsKKwkJCWNsZWFyX2FycmF5KGFoYXNoKTsKKwkJfSBlbHNlIGlmICh0Y2xhc3MgJiBUQ19PUFNFUSkgeworCQkJZGVidWdfcHJpbnRmX3BhcnNlKCIlczogVENfT1BTRVFcbiIsIF9fZnVuY19fKTsKKwkJCXJvbGxiYWNrX3Rva2VuKCk7CisJCQljbiA9IGNoYWluX25vZGUoT0NfVEVTVCk7CisJCQljbi0+bC5uID0gcGFyc2VfZXhwcihUQ19PUFRFUk0gfCBUQ19FT0YgfCBUQ19HUlBTVEFSVCk7CisJCQlpZiAodF90Y2xhc3MgJiBUQ19HUlBTVEFSVCkgeworCQkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiJXM6IFRDX0dSUFNUQVJUXG4iLCBfX2Z1bmNfXyk7CisJCQkJcm9sbGJhY2tfdG9rZW4oKTsKKwkJCQljaGFpbl9ncm91cCgpOworCQkJfSBlbHNlIHsKKwkJCQlkZWJ1Z19wcmludGZfcGFyc2UoIiVzOiAhVENfR1JQU1RBUlRcbiIsIF9fZnVuY19fKTsKKwkJCQljaGFpbl9ub2RlKE9DX1BSSU5UKTsKKwkJCX0KKwkJCWNuLT5yLm4gPSBtYWluc2VxLmxhc3Q7CisJCX0gZWxzZSAvKiBpZiAodGNsYXNzICYgVENfR1JQU1RBUlQpICovIHsKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiJXM6IFRDX0dSUFNUQVJUKD8pXG4iLCBfX2Z1bmNfXyk7CisJCQlyb2xsYmFja190b2tlbigpOworCQkJY2hhaW5fZ3JvdXAoKTsKKwkJfQorCX0KKwlkZWJ1Z19wcmludGZfcGFyc2UoIiVzOiBUQ19FT0ZcbiIsIF9fZnVuY19fKTsKK30KKworCisvKiAtLS0tLS0tLSBwcm9ncmFtIGV4ZWN1dGlvbiBwYXJ0IC0tLS0tLS0tICovCisKK3N0YXRpYyBub2RlICpta19zcGxpdHRlcihjb25zdCBjaGFyICpzLCB0c3BsaXR0ZXIgKnNwbCkKK3sKKwlyZWdleF90ICpyZSwgKmlyZTsKKwlub2RlICpuOworCisJcmUgPSAmc3BsLT5yZVswXTsKKwlpcmUgPSAmc3BsLT5yZVsxXTsKKwluID0gJnNwbC0+bjsKKwlpZiAoKG4tPmluZm8gJiBPUENMU01BU0spID09IE9DX1JFR0VYUCkgeworCQlyZWdmcmVlKHJlKTsKKwkJcmVnZnJlZShpcmUpOyAvLyBUT0RPOiBudWtlIGlyZSwgdXNlIHJlKzE/CisJfQorCWlmIChzWzBdICYmIHNbMV0pIHsgLyogc3RybGVuKHMpID4gMSAqLworCQlta19yZV9ub2RlKHMsIG4sIHJlKTsKKwl9IGVsc2UgeworCQluLT5pbmZvID0gKHVpbnQzMl90KSBzWzBdOworCX0KKworCXJldHVybiBuOworfQorCisvKiB1c2Ugbm9kZSBhcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbi4gU3VwcGxpZWQgd2l0aCBub2RlIHB0ciBhbmQgcmVnZXhfdAorICogc3RvcmFnZSBzcGFjZS4gUmV0dXJuIHB0ciB0byByZWdleCAoaWYgcmVzdWx0IHBvaW50cyB0byBwcmVnLCBpdCBzaG91bGQKKyAqIGJlIGxhdGVyIHJlZ2ZyZWUnZCBtYW51YWxseQorICovCitzdGF0aWMgcmVnZXhfdCAqYXNfcmVnZXgobm9kZSAqb3AsIHJlZ2V4X3QgKnByZWcpCit7CisJaW50IGNmbGFnczsKKwl2YXIgKnY7CisJY29uc3QgY2hhciAqczsKKworCWlmICgob3AtPmluZm8gJiBPUENMU01BU0spID09IE9DX1JFR0VYUCkgeworCQlyZXR1cm4gaWNhc2UgPyBvcC0+ci5pcmUgOiBvcC0+bC5yZTsKKwl9CisJdiA9IG52YWxsb2MoMSk7CisJcyA9IGdldHZhcl9zKGV2YWx1YXRlKG9wLCB2KSk7CisKKwljZmxhZ3MgPSBpY2FzZSA/IFJFR19FWFRFTkRFRCB8IFJFR19JQ0FTRSA6IFJFR19FWFRFTkRFRDsKKwkvKiBUZXN0Y2FzZSB3aGVyZSBSRUdfRVhURU5ERUQgZmFpbHMgKHVucGFpcmVkICd7Jyk6CisJICogZWNobyBIaSB8IGF3ayAnZ3N1YigiQChzYW1wfGNvZGV8ZmlsZSlceyIsIiIpOycKKwkgKiBnYXdrIDMuMS41IGVhdHMgdGhpcy4gV2UgcmV2ZXJ0IHRvIH5SRUdfRVhURU5ERUQKKwkgKiAobWF5YmUgZ3N1YiBpcyBub3Qgc3VwcG9zZWQgdG8gdXNlIFJFR19FWFRFTkRFRD8pLgorCSAqLworCWlmIChyZWdjb21wKHByZWcsIHMsIGNmbGFncykpIHsKKwkJY2ZsYWdzICY9IH5SRUdfRVhURU5ERUQ7CisJCXhyZWdjb21wKHByZWcsIHMsIGNmbGFncyk7CisJfQorCW52ZnJlZSh2KTsKKwlyZXR1cm4gcHJlZzsKK30KKworLyogZ3JhZHVhbGx5IGluY3JlYXNpbmcgYnVmZmVyLgorICogbm90ZSB0aGF0IHdlIHJlYWxsb2NhdGUgZXZlbiBpZiBuID09IG9sZF9zaXplLAorICogYW5kIHRodXMgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGV4dHJhIGFsbG9jYXRlZCBieXRlLgorICovCitzdGF0aWMgY2hhciogcXJlYWxsb2MoY2hhciAqYiwgaW50IG4sIGludCAqc2l6ZSkKK3sKKwlpZiAoIWIgfHwgbiA+PSAqc2l6ZSkgeworCQkqc2l6ZSA9IG4gKyAobj4+MSkgKyA4MDsKKwkJYiA9IHhyZWFsbG9jKGIsICpzaXplKTsKKwl9CisJcmV0dXJuIGI7Cit9CisKKy8qIHJlc2l6ZSBmaWVsZCBzdG9yYWdlIHNwYWNlICovCitzdGF0aWMgdm9pZCBmc3JlYWxsb2MoaW50IHNpemUpCit7CisJaW50IGk7CisKKwlpZiAoc2l6ZSA+PSBtYXhmaWVsZHMpIHsKKwkJaSA9IG1heGZpZWxkczsKKwkJbWF4ZmllbGRzID0gc2l6ZSArIDE2OworCQlGaWVsZHMgPSB4cmVhbGxvYyhGaWVsZHMsIG1heGZpZWxkcyAqIHNpemVvZihGaWVsZHNbMF0pKTsKKwkJZm9yICg7IGkgPCBtYXhmaWVsZHM7IGkrKykgeworCQkJRmllbGRzW2ldLnR5cGUgPSBWRl9TUEVDSUFMOworCQkJRmllbGRzW2ldLnN0cmluZyA9IE5VTEw7CisJCX0KKwl9CisJLyogaWYgc2l6ZSA8IG5maWVsZHMsIGNsZWFyIGV4dHJhIGZpZWxkIHZhcmlhYmxlcyAqLworCWZvciAoaSA9IHNpemU7IGkgPCBuZmllbGRzOyBpKyspIHsKKwkJY2xydmFyKEZpZWxkcyArIGkpOworCX0KKwluZmllbGRzID0gc2l6ZTsKK30KKworc3RhdGljIGludCBhd2tfc3BsaXQoY29uc3QgY2hhciAqcywgbm9kZSAqc3BsLCBjaGFyICoqc2xpc3QpCit7CisJaW50IGwsIG47CisJY2hhciBjWzRdOworCWNoYXIgKnMxOworCXJlZ21hdGNoX3QgcG1hdGNoWzJdOyAvLyBUT0RPOiB3aHkgWzJdPyBbMV0gaXMgZW5vdWdoLi4uCisKKwkvKiBpbiB3b3JzdCBjYXNlLCBlYWNoIGNoYXIgd291bGQgYmUgYSBzZXBhcmF0ZSBmaWVsZCAqLworCSpzbGlzdCA9IHMxID0geHphbGxvYyhzdHJsZW4ocykgKiAyICsgMyk7CisJc3RyY3B5KHMxLCBzKTsKKworCWNbMF0gPSBjWzFdID0gKGNoYXIpc3BsLT5pbmZvOworCWNbMl0gPSBjWzNdID0gJ1wwJzsKKwlpZiAoKmdldHZhcl9zKGludHZhcltSU10pID09ICdcMCcpCisJCWNbMl0gPSAnXG4nOworCisJbiA9IDA7CisJaWYgKChzcGwtPmluZm8gJiBPUENMU01BU0spID09IE9DX1JFR0VYUCkgeyAgLyogcmVnZXggc3BsaXQgKi8KKwkJaWYgKCEqcykKKwkJCXJldHVybiBuOyAvKiAiIjogemVybyBmaWVsZHMgKi8KKwkJbisrOyAvKiBhdCBsZWFzdCBvbmUgZmllbGQgd2lsbCBiZSB0aGVyZSAqLworCQlkbyB7CisJCQlsID0gc3RyY3NwbihzLCBjKzIpOyAvKiBsZW4gdGlsbCBuZXh0IE5VTCBvciBcbiAqLworCQkJaWYgKHJlZ2V4ZWMoaWNhc2UgPyBzcGwtPnIuaXJlIDogc3BsLT5sLnJlLCBzLCAxLCBwbWF0Y2gsIDApID09IDAKKwkJCSAmJiBwbWF0Y2hbMF0ucm1fc28gPD0gbAorCQkJKSB7CisJCQkJbCA9IHBtYXRjaFswXS5ybV9zbzsKKwkJCQlpZiAocG1hdGNoWzBdLnJtX2VvID09IDApIHsKKwkJCQkJbCsrOworCQkJCQlwbWF0Y2hbMF0ucm1fZW8rKzsKKwkJCQl9CisJCQkJbisrOyAvKiB3ZSBzYXcgeWV0IGFub3RoZXIgZGVsaW1pdGVyICovCisJCQl9IGVsc2UgeworCQkJCXBtYXRjaFswXS5ybV9lbyA9IGw7CisJCQkJaWYgKHNbbF0pCisJCQkJCXBtYXRjaFswXS5ybV9lbysrOworCQkJfQorCQkJbWVtY3B5KHMxLCBzLCBsKTsKKwkJCS8qIG1ha2Ugc3VyZSB3ZSByZW1vdmUgKmFsbCogb2YgdGhlIHNlcGFyYXRvciBjaGFycyAqLworCQkJZG8geworCQkJCXMxW2xdID0gJ1wwJzsKKwkJCX0gd2hpbGUgKCsrbCA8IHBtYXRjaFswXS5ybV9lbyk7CisJCQluZXh0d29yZCgmczEpOworCQkJcyArPSBwbWF0Y2hbMF0ucm1fZW87CisJCX0gd2hpbGUgKCpzKTsKKwkJcmV0dXJuIG47CisJfQorCWlmIChjWzBdID09ICdcMCcpIHsgIC8qIG51bGwgc3BsaXQgKi8KKwkJd2hpbGUgKCpzKSB7CisJCQkqczErKyA9ICpzKys7CisJCQkqczErKyA9ICdcMCc7CisJCQluKys7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCWlmIChjWzBdICE9ICcgJykgeyAgLyogc2luZ2xlLWNoYXJhY3RlciBzcGxpdCAqLworCQlpZiAoaWNhc2UpIHsKKwkJCWNbMF0gPSB0b3VwcGVyKGNbMF0pOworCQkJY1sxXSA9IHRvbG93ZXIoY1sxXSk7CisJCX0KKwkJaWYgKCpzMSkKKwkJCW4rKzsKKwkJd2hpbGUgKChzMSA9IHN0cnBicmsoczEsIGMpKSAhPSBOVUxMKSB7CisJCQkqczErKyA9ICdcMCc7CisJCQluKys7CisJCX0KKwkJcmV0dXJuIG47CisJfQorCS8qIHNwYWNlIHNwbGl0ICovCisJd2hpbGUgKCpzKSB7CisJCXMgPSBza2lwX3doaXRlc3BhY2Uocyk7CisJCWlmICghKnMpCisJCQlicmVhazsKKwkJbisrOworCQl3aGlsZSAoKnMgJiYgIWlzc3BhY2UoKnMpKQorCQkJKnMxKysgPSAqcysrOworCQkqczErKyA9ICdcMCc7CisJfQorCXJldHVybiBuOworfQorCitzdGF0aWMgdm9pZCBzcGxpdF9mMCh2b2lkKQoreworLyogc3RhdGljIGNoYXIgKmZzdHJpbmdzOyAqLworI2RlZmluZSBmc3RyaW5ncyAoRy5zcGxpdF9mMF9fZnN0cmluZ3MpCisKKwlpbnQgaSwgbjsKKwljaGFyICpzOworCisJaWYgKGlzX2YwX3NwbGl0KQorCQlyZXR1cm47CisKKwlpc19mMF9zcGxpdCA9IFRSVUU7CisJZnJlZShmc3RyaW5ncyk7CisJZnNyZWFsbG9jKDApOworCW4gPSBhd2tfc3BsaXQoZ2V0dmFyX3MoaW50dmFyW0YwXSksICZmc3BsaXR0ZXIubiwgJmZzdHJpbmdzKTsKKwlmc3JlYWxsb2Mobik7CisJcyA9IGZzdHJpbmdzOworCWZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKKwkJRmllbGRzW2ldLnN0cmluZyA9IG5leHR3b3JkKCZzKTsKKwkJRmllbGRzW2ldLnR5cGUgfD0gKFZGX0ZTVFIgfCBWRl9VU0VSIHwgVkZfRElSVFkpOworCX0KKworCS8qIHNldCBORiBtYW51YWxseSB0byBhdm9pZCBzaWRlIGVmZmVjdHMgKi8KKwljbHJ2YXIoaW50dmFyW05GXSk7CisJaW50dmFyW05GXS0+dHlwZSA9IFZGX05VTUJFUiB8IFZGX1NQRUNJQUw7CisJaW50dmFyW05GXS0+bnVtYmVyID0gbmZpZWxkczsKKyN1bmRlZiBmc3RyaW5ncworfQorCisvKiBwZXJmb3JtIGFkZGl0aW9uYWwgYWN0aW9ucyB3aGVuIHNvbWUgaW50ZXJuYWwgdmFyaWFibGVzIGNoYW5nZWQgKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9zcGVjaWFsKHZhciAqdikKK3sKKwlpbnQgbjsKKwljaGFyICpiOworCWNvbnN0IGNoYXIgKnNlcCwgKnM7CisJaW50IHNsLCBsLCBsZW4sIGksIGJzaXplOworCisJaWYgKCEodi0+dHlwZSAmIFZGX1NQRUNJQUwpKQorCQlyZXR1cm47CisKKwlpZiAodiA9PSBpbnR2YXJbTkZdKSB7CisJCW4gPSAoaW50KWdldHZhcl9pKHYpOworCQlmc3JlYWxsb2Mobik7CisKKwkJLyogcmVjYWxjdWxhdGUgJDAgKi8KKwkJc2VwID0gZ2V0dmFyX3MoaW50dmFyW09GU10pOworCQlzbCA9IHN0cmxlbihzZXApOworCQliID0gTlVMTDsKKwkJbGVuID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IG47IGkrKykgeworCQkJcyA9IGdldHZhcl9zKCZGaWVsZHNbaV0pOworCQkJbCA9IHN0cmxlbihzKTsKKwkJCWlmIChiKSB7CisJCQkJbWVtY3B5KGIrbGVuLCBzZXAsIHNsKTsKKwkJCQlsZW4gKz0gc2w7CisJCQl9CisJCQliID0gcXJlYWxsb2MoYiwgbGVuK2wrc2wsICZic2l6ZSk7CisJCQltZW1jcHkoYitsZW4sIHMsIGwpOworCQkJbGVuICs9IGw7CisJCX0KKwkJaWYgKGIpCisJCQliW2xlbl0gPSAnXDAnOworCQlzZXR2YXJfcChpbnR2YXJbRjBdLCBiKTsKKwkJaXNfZjBfc3BsaXQgPSBUUlVFOworCisJfSBlbHNlIGlmICh2ID09IGludHZhcltGMF0pIHsKKwkJaXNfZjBfc3BsaXQgPSBGQUxTRTsKKworCX0gZWxzZSBpZiAodiA9PSBpbnR2YXJbRlNdKSB7CisJCS8qCisJCSAqIFRoZSBQT1NJWC0yMDA4IHN0YW5kYXJkIHNheXMgdGhhdCBjaGFuZ2luZyBGUyBzaG91bGQgaGF2ZSBubyBlZmZlY3Qgb24gdGhlCisJCSAqIGN1cnJlbnQgaW5wdXQgbGluZSwgYnV0IG9ubHkgb24gdGhlIG5leHQgb25lLiBUaGUgbGFuZ3VhZ2UgaXM6CisJCSAqCisJCSAqID4gQmVmb3JlIHRoZSBmaXJzdCByZWZlcmVuY2UgdG8gYSBmaWVsZCBpbiB0aGUgcmVjb3JkIGlzIGV2YWx1YXRlZCwgdGhlIHJlY29yZAorCQkgKiA+IHNoYWxsIGJlIHNwbGl0IGludG8gZmllbGRzLCBhY2NvcmRpbmcgdG8gdGhlIHJ1bGVzIGluIFJlZ3VsYXIgRXhwcmVzc2lvbnMsCisJCSAqID4gdXNpbmcgdGhlIHZhbHVlIG9mIEZTIHRoYXQgd2FzIGN1cnJlbnQgYXQgdGhlIHRpbWUgdGhlIHJlY29yZCB3YXMgcmVhZC4KKwkJICoKKwkJICogU28sIHNwbGl0IHVwIGN1cnJlbnQgbGluZSBiZWZvcmUgYXNzaWdubWVudCB0byBGUzoKKwkJICovCisJCXNwbGl0X2YwKCk7CisKKwkJbWtfc3BsaXR0ZXIoZ2V0dmFyX3ModiksICZmc3BsaXR0ZXIpOworCX0gZWxzZSBpZiAodiA9PSBpbnR2YXJbUlNdKSB7CisJCW1rX3NwbGl0dGVyKGdldHZhcl9zKHYpLCAmcnNwbGl0dGVyKTsKKwl9IGVsc2UgaWYgKHYgPT0gaW50dmFyW0lHTk9SRUNBU0VdKSB7CisJCWljYXNlID0gaXN0cnVlKHYpOworCX0gZWxzZSB7CQkJCS8qICRuICovCisJCW4gPSBnZXR2YXJfaShpbnR2YXJbTkZdKTsKKwkJc2V0dmFyX2koaW50dmFyW05GXSwgbiA+IHYtRmllbGRzID8gbiA6IHYtRmllbGRzKzEpOworCQkvKiByaWdodCBoZXJlIHYgaXMgaW52YWxpZC4gSnVzdCB0byBub3RlLi4uICovCisJfQorfQorCisvKiBzdGVwIHRocm91Z2ggZnVuYy9idWlsdGluL2V0YyBhcmd1bWVudHMgKi8KK3N0YXRpYyBub2RlICpuZXh0YXJnKG5vZGUgKipwbikKK3sKKwlub2RlICpuOworCisJbiA9ICpwbjsKKwlpZiAobiAmJiAobi0+aW5mbyAmIE9QQ0xTTUFTSykgPT0gT0NfQ09NTUEpIHsKKwkJKnBuID0gbi0+ci5uOworCQluID0gbi0+bC5uOworCX0gZWxzZSB7CisJCSpwbiA9IE5VTEw7CisJfQorCXJldHVybiBuOworfQorCitzdGF0aWMgdm9pZCBoYXNod2Fsa19pbml0KHZhciAqdiwgeGhhc2ggKmFycmF5KQoreworCWhhc2hfaXRlbSAqaGk7CisJdW5zaWduZWQgaTsKKwl3YWxrZXJfbGlzdCAqdzsKKwl3YWxrZXJfbGlzdCAqcHJldl93YWxrZXI7CisKKwlpZiAodi0+dHlwZSAmIFZGX1dBTEspIHsKKwkJcHJldl93YWxrZXIgPSB2LT54LndhbGtlcjsKKwl9IGVsc2UgeworCQl2LT50eXBlIHw9IFZGX1dBTEs7CisJCXByZXZfd2Fsa2VyID0gTlVMTDsKKwl9CisJZGVidWdfcHJpbnRmX3dhbGtlcigiaGFzaHdhbGtfaW5pdDogcHJldl93YWxrZXI6JXBcbiIsIHByZXZfd2Fsa2VyKTsKKworCXcgPSB2LT54LndhbGtlciA9IHh6YWxsb2Moc2l6ZW9mKCp3KSArIGFycmF5LT5nbGVuICsgMSk7IC8qIHdoeSArIDE/ICovCisJZGVidWdfcHJpbnRmX3dhbGtlcigiIHdhbGtlckAlcD0lcFxuIiwgJnYtPngud2Fsa2VyLCB3KTsKKwl3LT5jdXIgPSB3LT5lbmQgPSB3LT53YnVmOworCXctPnByZXYgPSBwcmV2X3dhbGtlcjsKKwlmb3IgKGkgPSAwOyBpIDwgYXJyYXktPmNzaXplOyBpKyspIHsKKwkJaGkgPSBhcnJheS0+aXRlbXNbaV07CisJCXdoaWxlIChoaSkgeworCQkJc3RyY3B5KHctPmVuZCwgaGktPm5hbWUpOworCQkJbmV4dHdvcmQoJnctPmVuZCk7CisJCQloaSA9IGhpLT5uZXh0OworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGhhc2h3YWxrX25leHQodmFyICp2KQoreworCXdhbGtlcl9saXN0ICp3ID0gdi0+eC53YWxrZXI7CisKKwlpZiAody0+Y3VyID49IHctPmVuZCkgeworCQl3YWxrZXJfbGlzdCAqcHJldl93YWxrZXIgPSB3LT5wcmV2OworCisJCWRlYnVnX3ByaW50Zl93YWxrZXIoImVuZCBvZiBpdGVyYXRpb24sIGZyZWUod2Fsa2VyQCVwOiVwKSwgcHJldl93YWxrZXI6JXBcbiIsICZ2LT54LndhbGtlciwgdywgcHJldl93YWxrZXIpOworCQlmcmVlKHcpOworCQl2LT54LndhbGtlciA9IHByZXZfd2Fsa2VyOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJc2V0dmFyX3ModiwgbmV4dHdvcmQoJnctPmN1cikpOworCXJldHVybiBUUlVFOworfQorCisvKiBldmFsdWF0ZSBub2RlLCByZXR1cm4gMSB3aGVuIHJlc3VsdCBpcyB0cnVlLCAwIG90aGVyd2lzZSAqLworc3RhdGljIGludCBwdGVzdChub2RlICpwYXR0ZXJuKQoreworCS8qIHB0ZXN0X192IGlzICJzdGF0aWMiOiB0byBzYXZlIHN0YWNrIHNwYWNlPyAqLworCXJldHVybiBpc3RydWUoZXZhbHVhdGUocGF0dGVybiwgJkcucHRlc3RfX3YpKTsKK30KKworLyogcmVhZCBuZXh0IHJlY29yZCBmcm9tIHN0cmVhbSByc20gaW50byBhIHZhcmlhYmxlIHYgKi8KK3N0YXRpYyBpbnQgYXdrX2dldGxpbmUocnN0cmVhbSAqcnNtLCB2YXIgKnYpCit7CisJY2hhciAqYjsKKwlyZWdtYXRjaF90IHBtYXRjaFsyXTsKKwlpbnQgc2l6ZSwgYSwgcCwgcHAgPSAwOworCWludCBmZCwgc28sIGVvLCByLCBycDsKKwljaGFyIGMsICptLCAqczsKKworCWRlYnVnX3ByaW50Zl9ldmFsKCJlbnRlcmVkICVzKClcbiIsIF9fZnVuY19fKTsKKworCS8qIHdlJ3JlIHVzaW5nIG91ciBvd24gYnVmZmVyIHNpbmNlIHdlIG5lZWQgYWNjZXNzIHRvIGFjY3VtdWxhdGluZworCSAqIGNoYXJhY3RlcnMKKwkgKi8KKwlmZCA9IGZpbGVubyhyc20tPkYpOworCW0gPSByc20tPmJ1ZmZlcjsKKwlhID0gcnNtLT5hZHY7CisJcCA9IHJzbS0+cG9zOworCXNpemUgPSByc20tPnNpemU7CisJYyA9IChjaGFyKSByc3BsaXR0ZXIubi5pbmZvOworCXJwID0gMDsKKworCWlmICghbSkKKwkJbSA9IHFyZWFsbG9jKG0sIDI1NiwgJnNpemUpOworCisJZG8geworCQliID0gbSArIGE7CisJCXNvID0gZW8gPSBwOworCQlyID0gMTsKKwkJaWYgKHAgPiAwKSB7CisJCQlpZiAoKHJzcGxpdHRlci5uLmluZm8gJiBPUENMU01BU0spID09IE9DX1JFR0VYUCkgeworCQkJCWlmIChyZWdleGVjKGljYXNlID8gcnNwbGl0dGVyLm4uci5pcmUgOiByc3BsaXR0ZXIubi5sLnJlLAorCQkJCQkJCWIsIDEsIHBtYXRjaCwgMCkgPT0gMCkgeworCQkJCQlzbyA9IHBtYXRjaFswXS5ybV9zbzsKKwkJCQkJZW8gPSBwbWF0Y2hbMF0ucm1fZW87CisJCQkJCWlmIChiW2VvXSAhPSAnXDAnKQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJfSBlbHNlIGlmIChjICE9ICdcMCcpIHsKKwkJCQlzID0gc3RyY2hyKGIrcHAsIGMpOworCQkJCWlmICghcykKKwkJCQkJcyA9IG1lbWNocihiK3BwLCAnXDAnLCBwIC0gcHApOworCQkJCWlmIChzKSB7CisJCQkJCXNvID0gZW8gPSBzLWI7CisJCQkJCWVvKys7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJd2hpbGUgKGJbcnBdID09ICdcbicpCisJCQkJCXJwKys7CisJCQkJcyA9IHN0cnN0cihiK3JwLCAiXG5cbiIpOworCQkJCWlmIChzKSB7CisJCQkJCXNvID0gZW8gPSBzLWI7CisJCQkJCXdoaWxlIChiW2VvXSA9PSAnXG4nKQorCQkJCQkJZW8rKzsKKwkJCQkJaWYgKGJbZW9dICE9ICdcMCcpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoYSA+IDApIHsKKwkJCW1lbW1vdmUobSwgbSthLCBwKzEpOworCQkJYiA9IG07CisJCQlhID0gMDsKKwkJfQorCisJCW0gPSBxcmVhbGxvYyhtLCBhK3ArMTI4LCAmc2l6ZSk7CisJCWIgPSBtICsgYTsKKwkJcHAgPSBwOworCQlwICs9IHNhZmVfcmVhZChmZCwgYitwLCBzaXplLXAtMSk7CisJCWlmIChwIDwgcHApIHsKKwkJCXAgPSAwOworCQkJciA9IDA7CisJCQlzZXR2YXJfaShpbnR2YXJbRVJSTk9dLCBlcnJubyk7CisJCX0KKwkJYltwXSA9ICdcMCc7CisKKwl9IHdoaWxlIChwID4gcHApOworCisJaWYgKHAgPT0gMCkgeworCQlyLS07CisJfSBlbHNlIHsKKwkJYyA9IGJbc29dOyBiW3NvXSA9ICdcMCc7CisJCXNldHZhcl9zKHYsIGIrcnApOworCQl2LT50eXBlIHw9IFZGX1VTRVI7CisJCWJbc29dID0gYzsKKwkJYyA9IGJbZW9dOyBiW2VvXSA9ICdcMCc7CisJCXNldHZhcl9zKGludHZhcltSVF0sIGIrc28pOworCQliW2VvXSA9IGM7CisJfQorCisJcnNtLT5idWZmZXIgPSBtOworCXJzbS0+YWR2ID0gYSArIGVvOworCXJzbS0+cG9zID0gcCAtIGVvOworCXJzbS0+c2l6ZSA9IHNpemU7CisKKwlkZWJ1Z19wcmludGZfZXZhbCgicmV0dXJuaW5nIGZyb20gJXMoKTogJWRcbiIsIF9fZnVuY19fLCByKTsKKworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IGZtdF9udW0oY2hhciAqYiwgaW50IHNpemUsIGNvbnN0IGNoYXIgKmZvcm1hdCwgZG91YmxlIG4sIGludCBpbnRfYXNfaW50KQoreworCWludCByID0gMDsKKwljaGFyIGM7CisJY29uc3QgY2hhciAqcyA9IGZvcm1hdDsKKworCWlmIChpbnRfYXNfaW50ICYmIG4gPT0gKGxvbmcgbG9uZyluKSB7CisJCXIgPSBzbnByaW50ZihiLCBzaXplLCAiJWxsZCIsIChsb25nIGxvbmcpbik7CisJfSBlbHNlIHsKKwkJZG8geyBjID0gKnM7IH0gd2hpbGUgKGMgJiYgKisrcyk7CisJCWlmIChzdHJjaHIoImRpb3V4WCIsIGMpKSB7CisJCQlyID0gc25wcmludGYoYiwgc2l6ZSwgZm9ybWF0LCAoaW50KW4pOworCQl9IGVsc2UgaWYgKHN0cmNocigiZUVmZ0ciLCBjKSkgeworCQkJciA9IHNucHJpbnRmKGIsIHNpemUsIGZvcm1hdCwgbik7CisJCX0gZWxzZSB7CisJCQlzeW50YXhfZXJyb3IoRU1TR19JTlZfRk1UKTsKKwkJfQorCX0KKwlyZXR1cm4gcjsKK30KKworLyogZm9ybWF0dGVkIG91dHB1dCBpbnRvIGFuIGFsbG9jYXRlZCBidWZmZXIsIHJldHVybiBwdHIgdG8gYnVmZmVyICovCitzdGF0aWMgY2hhciAqYXdrX3ByaW50Zihub2RlICpuKQoreworCWNoYXIgKmIgPSBOVUxMOworCWNoYXIgKmZtdCwgKnMsICpmOworCWNvbnN0IGNoYXIgKnMxOworCWludCBpLCBqLCBpbmNyLCBic2l6ZTsKKwljaGFyIGMsIGMxOworCXZhciAqdiwgKmFyZzsKKworCXYgPSBudmFsbG9jKDEpOworCWZtdCA9IGYgPSB4c3RyZHVwKGdldHZhcl9zKGV2YWx1YXRlKG5leHRhcmcoJm4pLCB2KSkpOworCisJaSA9IDA7CisJd2hpbGUgKCpmKSB7CisJCXMgPSBmOworCQl3aGlsZSAoKmYgJiYgKCpmICE9ICclJyB8fCAqKytmID09ICclJykpCisJCQlmKys7CisJCXdoaWxlICgqZiAmJiAhaXNhbHBoYSgqZikpIHsKKwkJCWlmICgqZiA9PSAnKicpCisJCQkJc3ludGF4X2Vycm9yKCIlKnggZm9ybWF0cyBhcmUgbm90IHN1cHBvcnRlZCIpOworCQkJZisrOworCQl9CisKKwkJaW5jciA9IChmIC0gcykgKyBNQVhWQVJGTVQ7CisJCWIgPSBxcmVhbGxvYyhiLCBpbmNyICsgaSwgJmJzaXplKTsKKwkJYyA9ICpmOworCQlpZiAoYyAhPSAnXDAnKQorCQkJZisrOworCQljMSA9ICpmOworCQkqZiA9ICdcMCc7CisJCWFyZyA9IGV2YWx1YXRlKG5leHRhcmcoJm4pLCB2KTsKKworCQlqID0gaTsKKwkJaWYgKGMgPT0gJ2MnIHx8ICFjKSB7CisJCQlpICs9IHNwcmludGYoYitpLCBzLCBpc19udW1lcmljKGFyZykgPworCQkJCQkoY2hhcilnZXR2YXJfaShhcmcpIDogKmdldHZhcl9zKGFyZykpOworCQl9IGVsc2UgaWYgKGMgPT0gJ3MnKSB7CisJCQlzMSA9IGdldHZhcl9zKGFyZyk7CisJCQliID0gcXJlYWxsb2MoYiwgaW5jcitpK3N0cmxlbihzMSksICZic2l6ZSk7CisJCQlpICs9IHNwcmludGYoYitpLCBzLCBzMSk7CisJCX0gZWxzZSB7CisJCQlpICs9IGZtdF9udW0oYitpLCBpbmNyLCBzLCBnZXR2YXJfaShhcmcpLCBGQUxTRSk7CisJCX0KKwkJKmYgPSBjMTsKKworCQkvKiBpZiB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgc3ByaW50ZiwgcmV0dXJuIHZhbHVlIGlzIG5lZ2F0aXZlICovCisJCWlmIChpIDwgaikKKwkJCWkgPSBqOworCX0KKworCWZyZWUoZm10KTsKKwludmZyZWUodik7CisJYiA9IHhyZWFsbG9jKGIsIGkgKyAxKTsKKwliW2ldID0gJ1wwJzsKKwlyZXR1cm4gYjsKK30KKworLyogQ29tbW9uIHN1YnN0aXR1dGlvbiByb3V0aW5lLgorICogUmVwbGFjZSAobm0pJ3RoIHN1YnN0cmluZyBvZiAoc3JjKSB0aGF0IG1hdGNoZXMgKHJuKSB3aXRoIChyZXBsKSwKKyAqIHN0b3JlIHJlc3VsdCBpbnRvIChkZXN0KSwgcmV0dXJuIG51bWJlciBvZiBzdWJzdGl0dXRpb25zLgorICogSWYgbm0gPSAwLCByZXBsYWNlIGFsbCBtYXRjaGVzLgorICogSWYgc3JjIG9yIGRzdCBpcyBOVUxMLCB1c2UgJDAuCisgKiBJZiBzdWJleHAgIT0gMCwgZW5hYmxlIHN1YmV4cHJlc3Npb24gbWF0Y2hpbmcgKFwxLVw5KS4KKyAqLworc3RhdGljIGludCBhd2tfc3ViKG5vZGUgKnJuLCBjb25zdCBjaGFyICpyZXBsLCBpbnQgbm0sIHZhciAqc3JjLCB2YXIgKmRlc3QsIGludCBzdWJleHApCit7CisJY2hhciAqcmVzYnVmOworCWNvbnN0IGNoYXIgKnNwOworCWludCBtYXRjaF9ubywgcmVzaWR4LCByZXBsZW4sIHJlc2J1ZnNpemU7CisJaW50IHJlZ2V4ZWNfZmxhZ3M7CisJcmVnbWF0Y2hfdCBwbWF0Y2hbMTBdOworCXJlZ2V4X3Qgc3JlZywgKnJlZ2V4OworCisJcmVzYnVmID0gTlVMTDsKKwlyZXNpZHggPSAwOworCW1hdGNoX25vID0gMDsKKwlyZWdleGVjX2ZsYWdzID0gMDsKKwlyZWdleCA9IGFzX3JlZ2V4KHJuLCAmc3JlZyk7CisJc3AgPSBnZXR2YXJfcyhzcmMgPyBzcmMgOiBpbnR2YXJbRjBdKTsKKwlyZXBsZW4gPSBzdHJsZW4ocmVwbCk7CisJd2hpbGUgKHJlZ2V4ZWMocmVnZXgsIHNwLCAxMCwgcG1hdGNoLCByZWdleGVjX2ZsYWdzKSA9PSAwKSB7CisJCWludCBzbyA9IHBtYXRjaFswXS5ybV9zbzsKKwkJaW50IGVvID0gcG1hdGNoWzBdLnJtX2VvOworCisJCS8vYmJfZXJyb3JfbXNnKCJtYXRjaCAldTogWyV1LCV1XSAnJXMnJXAiLCBtYXRjaF9ubysxLCBzbywgZW8sIHNwLHNwKTsKKwkJcmVzYnVmID0gcXJlYWxsb2MocmVzYnVmLCByZXNpZHggKyBlbyArIHJlcGxlbiwgJnJlc2J1ZnNpemUpOworCQltZW1jcHkocmVzYnVmICsgcmVzaWR4LCBzcCwgZW8pOworCQlyZXNpZHggKz0gZW87CisJCWlmICgrK21hdGNoX25vID49IG5tKSB7CisJCQljb25zdCBjaGFyICpzOworCQkJaW50IG5iczsKKworCQkJLyogcmVwbGFjZSAqLworCQkJcmVzaWR4IC09IChlbyAtIHNvKTsKKwkJCW5icyA9IDA7CisJCQlmb3IgKHMgPSByZXBsOyAqczsgcysrKSB7CisJCQkJY2hhciBjID0gcmVzYnVmW3Jlc2lkeCsrXSA9ICpzOworCQkJCWlmIChjID09ICdcXCcpIHsKKwkJCQkJbmJzKys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAoYyA9PSAnJicgfHwgKHN1YmV4cCAmJiBjID49ICcwJyAmJiBjIDw9ICc5JykpIHsKKwkJCQkJaW50IGo7CisJCQkJCXJlc2lkeCAtPSAoKG5icyArIDMpID4+IDEpOworCQkJCQlqID0gMDsKKwkJCQkJaWYgKGMgIT0gJyYnKSB7CisJCQkJCQlqID0gYyAtICcwJzsKKwkJCQkJCW5icysrOworCQkJCQl9CisJCQkJCWlmIChuYnMgJSAyKSB7CisJCQkJCQlyZXNidWZbcmVzaWR4KytdID0gYzsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCWludCBuID0gcG1hdGNoW2pdLnJtX2VvIC0gcG1hdGNoW2pdLnJtX3NvOworCQkJCQkJcmVzYnVmID0gcXJlYWxsb2MocmVzYnVmLCByZXNpZHggKyByZXBsZW4gKyBuLCAmcmVzYnVmc2l6ZSk7CisJCQkJCQltZW1jcHkocmVzYnVmICsgcmVzaWR4LCBzcCArIHBtYXRjaFtqXS5ybV9zbywgbik7CisJCQkJCQlyZXNpZHggKz0gbjsKKwkJCQkJfQorCQkJCX0KKwkJCQluYnMgPSAwOworCQkJfQorCQl9CisKKwkJcmVnZXhlY19mbGFncyA9IFJFR19OT1RCT0w7CisJCXNwICs9IGVvOworCQlpZiAobWF0Y2hfbm8gPT0gbm0pCisJCQlicmVhazsKKwkJaWYgKGVvID09IHNvKSB7CisJCQkvKiBFbXB0eSBtYXRjaCAoZS5nLiAiYioiIHdpbGwgbWF0Y2ggYW55d2hlcmUpLgorCQkJICogQWR2YW5jZSBieSBvbmUgY2hhci4gKi8KKy8vQlVHIChidWcgMTMzMyk6CisvL2dzdWIoL1w8YiovLCIiKSBvbiAiYWJjIiB3aWxsIHJlYWNoIHRoaXMgcG9pbnQsIGFkdmFuY2UgdG8gImJjIgorLy8uLi4gYW5kIHdpbGwgZXJyb25lb3VzbHkgbWF0Y2ggImIiIGV2ZW4gdGhvdWdoIGl0IGlzIE5PVCBhdCB0aGUgd29yZCBzdGFydC4KKy8vd2UgbmVlZCBSRUdfTk9UQk9XIGJ1dCBpdCBkb2VzIG5vdCBleGlzdC4uLgorLy9UT0RPOiBpZiBFWFRSQV9DT01QQVQ9eSwgdXNlIEdOVSBtYXRjaGluZyBhbmQgcmVfc2VhcmNoLAorLy9pdCBzaG91bGQgYmUgYWJsZSB0byBkbyBpdCBjb3JyZWN0bHkuCisJCQkvKiBTdWJ0bGU6IHRoaXMgaXMgc2FmZSBvbmx5IGJlY2F1c2UKKwkJCSAqIHFyZWFsbG9jIGFsbG9jYXRlZCBhdCBsZWFzdCBvbmUgZXh0cmEgYnl0ZSAqLworCQkJcmVzYnVmW3Jlc2lkeF0gPSAqc3A7CisJCQlpZiAoKnNwID09ICdcMCcpCisJCQkJZ290byByZXQ7CisJCQlzcCsrOworCQkJcmVzaWR4Kys7CisJCX0KKwl9CisKKwlyZXNidWYgPSBxcmVhbGxvYyhyZXNidWYsIHJlc2lkeCArIHN0cmxlbihzcCksICZyZXNidWZzaXplKTsKKwlzdHJjcHkocmVzYnVmICsgcmVzaWR4LCBzcCk7CisgcmV0OgorCS8vYmJfZXJyb3JfbXNnKCJlbmQgc3A6JyVzJyVwIiwgc3Asc3ApOworCXNldHZhcl9wKGRlc3QgPyBkZXN0IDogaW50dmFyW0YwXSwgcmVzYnVmKTsKKwlpZiAocmVnZXggPT0gJnNyZWcpCisJCXJlZ2ZyZWUocmVnZXgpOworCXJldHVybiBtYXRjaF9ubzsKK30KKworc3RhdGljIE5PSU5MSU5FIGludCBkb19ta3RpbWUoY29uc3QgY2hhciAqZHMpCit7CisJc3RydWN0IHRtIHRoZW47CisJaW50IGNvdW50OworCisJLyptZW1zZXQoJnRoZW4sIDAsIHNpemVvZih0aGVuKSk7IC0gbm90IG5lZWRlZCAqLworCXRoZW4udG1faXNkc3QgPSAtMTsgLyogZGVmYXVsdCBpcyB1bmtub3duICovCisKKwkvKiBtYW5wYWdlIG9mIG1rdGltZSBzYXlzIHRoZXNlIGZpZWxkcyBhcmUgaW50cywKKwkgKiBzbyB3ZSBjYW4gc3NjYW5mIHN0dWZmIGRpcmVjdGx5IGludG8gdGhlbSAqLworCWNvdW50ID0gc3NjYW5mKGRzLCAiJXUgJXUgJXUgJXUgJXUgJXUgJWQiLAorCQkmdGhlbi50bV95ZWFyLCAmdGhlbi50bV9tb24sICZ0aGVuLnRtX21kYXksCisJCSZ0aGVuLnRtX2hvdXIsICZ0aGVuLnRtX21pbiwgJnRoZW4udG1fc2VjLAorCQkmdGhlbi50bV9pc2RzdCk7CisKKwlpZiAoY291bnQgPCA2CisJIHx8ICh1bnNpZ25lZCl0aGVuLnRtX21vbiA8IDEKKwkgfHwgKHVuc2lnbmVkKXRoZW4udG1feWVhciA8IDE5MDAKKwkpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCXRoZW4udG1fbW9uIC09IDE7CisJdGhlbi50bV95ZWFyIC09IDE5MDA7CisKKwlyZXR1cm4gbWt0aW1lKCZ0aGVuKTsKK30KKworc3RhdGljIE5PSU5MSU5FIHZhciAqZXhlY19idWlsdGluKG5vZGUgKm9wLCB2YXIgKnJlcykKK3sKKyNkZWZpbmUgdHNwbCAoRy5leGVjX2J1aWx0aW5fX3RzcGwpCisKKwl2YXIgKnR2OworCW5vZGUgKmFuWzRdOworCXZhciAqYXZbNF07CisJY29uc3QgY2hhciAqYXNbNF07CisJcmVnbWF0Y2hfdCBwbWF0Y2hbMl07CisJcmVnZXhfdCBzcmVnLCAqcmU7CisJbm9kZSAqc3BsOworCXVpbnQzMl90IGlzciwgaW5mbzsKKwlpbnQgbmFyZ3M7CisJdGltZV90IHR0OworCWludCBpLCBsLCBsbCwgbjsKKworCXR2ID0gbnZhbGxvYyg0KTsKKwlpc3IgPSBpbmZvID0gb3AtPmluZm87CisJb3AgPSBvcC0+bC5uOworCisJYXZbMl0gPSBhdlszXSA9IE5VTEw7CisJZm9yIChpID0gMDsgaSA8IDQgJiYgb3A7IGkrKykgeworCQlhbltpXSA9IG5leHRhcmcoJm9wKTsKKwkJaWYgKGlzciAmIDB4MDkwMDAwMDApCisJCQlhdltpXSA9IGV2YWx1YXRlKGFuW2ldLCAmdHZbaV0pOworCQlpZiAoaXNyICYgMHgwODAwMDAwMCkKKwkJCWFzW2ldID0gZ2V0dmFyX3MoYXZbaV0pOworCQlpc3IgPj49IDE7CisJfQorCisJbmFyZ3MgPSBpOworCWlmICgodWludDMyX3QpbmFyZ3MgPCAoaW5mbyA+PiAzMCkpCisJCXN5bnRheF9lcnJvcihFTVNHX1RPT19GRVdfQVJHUyk7CisKKwlpbmZvICY9IE9QTk1BU0s7CisJc3dpdGNoIChpbmZvKSB7CisKKwljYXNlIEJfYTI6CisJCWlmIChFTkFCTEVfRkVBVFVSRV9BV0tfTElCTSkKKwkJCXNldHZhcl9pKHJlcywgYXRhbjIoZ2V0dmFyX2koYXZbMF0pLCBnZXR2YXJfaShhdlsxXSkpKTsKKwkJZWxzZQorCQkJc3ludGF4X2Vycm9yKEVNU0dfTk9fTUFUSCk7CisJCWJyZWFrOworCisJY2FzZSBCX3NwOiB7CisJCWNoYXIgKnMsICpzMTsKKworCQlpZiAobmFyZ3MgPiAyKSB7CisJCQlzcGwgPSAoYW5bMl0tPmluZm8gJiBPUENMU01BU0spID09IE9DX1JFR0VYUCA/CisJCQkJYW5bMl0gOiBta19zcGxpdHRlcihnZXR2YXJfcyhldmFsdWF0ZShhblsyXSwgJnR2WzJdKSksICZ0c3BsKTsKKwkJfSBlbHNlIHsKKwkJCXNwbCA9ICZmc3BsaXR0ZXIubjsKKwkJfQorCisJCW4gPSBhd2tfc3BsaXQoYXNbMF0sIHNwbCwgJnMpOworCQlzMSA9IHM7CisJCWNsZWFyX2FycmF5KGlhbWFycmF5KGF2WzFdKSk7CisJCWZvciAoaSA9IDE7IGkgPD0gbjsgaSsrKQorCQkJc2V0YXJpX3UoYXZbMV0sIGksIG5leHR3b3JkKCZzKSk7CisJCWZyZWUoczEpOworCQlzZXR2YXJfaShyZXMsIG4pOworCQlicmVhazsKKwl9CisKKwljYXNlIEJfc3M6IHsKKwkJY2hhciAqczsKKworCQlsID0gc3RybGVuKGFzWzBdKTsKKwkJaSA9IGdldHZhcl9pKGF2WzFdKSAtIDE7CisJCWlmIChpID4gbCkKKwkJCWkgPSBsOworCQlpZiAoaSA8IDApCisJCQlpID0gMDsKKwkJbiA9IChuYXJncyA+IDIpID8gZ2V0dmFyX2koYXZbMl0pIDogbC1pOworCQlpZiAobiA8IDApCisJCQluID0gMDsKKwkJcyA9IHhzdHJuZHVwKGFzWzBdK2ksIG4pOworCQlzZXR2YXJfcChyZXMsIHMpOworCQlicmVhazsKKwl9CisKKwkvKiBCaXR3aXNlIG9wcyBtdXN0IGFzc3VtZSB0aGF0IG9wZXJhbmRzIGFyZSB1bnNpZ25lZC4gR05VIEF3ayAzLjEuNToKKwkgKiBhd2sgJ3sgcHJpbnQgb3IoLTEsMSkgfScgZ2l2ZXMgIjQuMjk0OTdlKzA5Iiwgbm90ICItMi54eHhlKzA5IiAqLworCWNhc2UgQl9hbjoKKwkJc2V0dmFyX2kocmVzLCBnZXR2YXJfaV9pbnQoYXZbMF0pICYgZ2V0dmFyX2lfaW50KGF2WzFdKSk7CisJCWJyZWFrOworCisJY2FzZSBCX2NvOgorCQlzZXR2YXJfaShyZXMsIH5nZXR2YXJfaV9pbnQoYXZbMF0pKTsKKwkJYnJlYWs7CisKKwljYXNlIEJfbHM6CisJCXNldHZhcl9pKHJlcywgZ2V0dmFyX2lfaW50KGF2WzBdKSA8PCBnZXR2YXJfaV9pbnQoYXZbMV0pKTsKKwkJYnJlYWs7CisKKwljYXNlIEJfb3I6CisJCXNldHZhcl9pKHJlcywgZ2V0dmFyX2lfaW50KGF2WzBdKSB8IGdldHZhcl9pX2ludChhdlsxXSkpOworCQlicmVhazsKKworCWNhc2UgQl9yczoKKwkJc2V0dmFyX2kocmVzLCBnZXR2YXJfaV9pbnQoYXZbMF0pID4+IGdldHZhcl9pX2ludChhdlsxXSkpOworCQlicmVhazsKKworCWNhc2UgQl94bzoKKwkJc2V0dmFyX2kocmVzLCBnZXR2YXJfaV9pbnQoYXZbMF0pIF4gZ2V0dmFyX2lfaW50KGF2WzFdKSk7CisJCWJyZWFrOworCisJY2FzZSBCX2xvOgorCWNhc2UgQl91cDogeworCQljaGFyICpzLCAqczE7CisJCXMxID0gcyA9IHhzdHJkdXAoYXNbMF0pOworCQl3aGlsZSAoKnMxKSB7CisJCQkvLypzMSA9IChpbmZvID09IEJfdXApID8gdG91cHBlcigqczEpIDogdG9sb3dlcigqczEpOworCQkJaWYgKCh1bnNpZ25lZCBjaGFyKSgoKnMxIHwgMHgyMCkgLSAnYScpIDw9ICgneicgLSAnYScpKQorCQkJCSpzMSA9IChpbmZvID09IEJfdXApID8gKCpzMSAmIDB4ZGYpIDogKCpzMSB8IDB4MjApOworCQkJczErKzsKKwkJfQorCQlzZXR2YXJfcChyZXMsIHMpOworCQlicmVhazsKKwl9CisKKwljYXNlIEJfaXg6CisJCW4gPSAwOworCQlsbCA9IHN0cmxlbihhc1sxXSk7CisJCWwgPSBzdHJsZW4oYXNbMF0pIC0gbGw7CisJCWlmIChsbCA+IDAgJiYgbCA+PSAwKSB7CisJCQlpZiAoIWljYXNlKSB7CisJCQkJY2hhciAqcyA9IHN0cnN0cihhc1swXSwgYXNbMV0pOworCQkJCWlmIChzKQorCQkJCQluID0gKHMgLSBhc1swXSkgKyAxOworCQkJfSBlbHNlIHsKKwkJCQkvKiB0aGlzIHBpZWNlIG9mIGNvZGUgaXMgdGVycmlibHkgc2xvdyBhbmQKKwkJCQkgKiByZWFsbHkgc2hvdWxkIGJlIHJld3JpdHRlbgorCQkJCSAqLworCQkJCWZvciAoaSA9IDA7IGkgPD0gbDsgaSsrKSB7CisJCQkJCWlmIChzdHJuY2FzZWNtcChhc1swXStpLCBhc1sxXSwgbGwpID09IDApIHsKKwkJCQkJCW4gPSBpKzE7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCQlzZXR2YXJfaShyZXMsIG4pOworCQlicmVhazsKKworCWNhc2UgQl90aToKKwkJaWYgKG5hcmdzID4gMSkKKwkJCXR0ID0gZ2V0dmFyX2koYXZbMV0pOworCQllbHNlCisJCQl0aW1lKCZ0dCk7CisJCS8vcyA9IChuYXJncyA+IDApID8gYXNbMF0gOiAiJWEgJWIgJWQgJUg6JU06JVMgJVogJVkiOworCQlpID0gc3RyZnRpbWUoZ19idWYsIE1BWFZBUkZNVCwKKwkJCSgobmFyZ3MgPiAwKSA/IGFzWzBdIDogIiVhICViICVkICVIOiVNOiVTICVaICVZIiksCisJCQlsb2NhbHRpbWUoJnR0KSk7CisJCWdfYnVmW2ldID0gJ1wwJzsKKwkJc2V0dmFyX3MocmVzLCBnX2J1Zik7CisJCWJyZWFrOworCisJY2FzZSBCX210OgorCQlzZXR2YXJfaShyZXMsIGRvX21rdGltZShhc1swXSkpOworCQlicmVhazsKKworCWNhc2UgQl9tYToKKwkJcmUgPSBhc19yZWdleChhblsxXSwgJnNyZWcpOworCQluID0gcmVnZXhlYyhyZSwgYXNbMF0sIDEsIHBtYXRjaCwgMCk7CisJCWlmIChuID09IDApIHsKKwkJCXBtYXRjaFswXS5ybV9zbysrOworCQkJcG1hdGNoWzBdLnJtX2VvKys7CisJCX0gZWxzZSB7CisJCQlwbWF0Y2hbMF0ucm1fc28gPSAwOworCQkJcG1hdGNoWzBdLnJtX2VvID0gLTE7CisJCX0KKwkJc2V0dmFyX2kobmV3dmFyKCJSU1RBUlQiKSwgcG1hdGNoWzBdLnJtX3NvKTsKKwkJc2V0dmFyX2kobmV3dmFyKCJSTEVOR1RIIiksIHBtYXRjaFswXS5ybV9lbyAtIHBtYXRjaFswXS5ybV9zbyk7CisJCXNldHZhcl9pKHJlcywgcG1hdGNoWzBdLnJtX3NvKTsKKwkJaWYgKHJlID09ICZzcmVnKQorCQkJcmVnZnJlZShyZSk7CisJCWJyZWFrOworCisJY2FzZSBCX2dlOgorCQlhd2tfc3ViKGFuWzBdLCBhc1sxXSwgZ2V0dmFyX2koYXZbMl0pLCBhdlszXSwgcmVzLCBUUlVFKTsKKwkJYnJlYWs7CisKKwljYXNlIEJfZ3M6CisJCXNldHZhcl9pKHJlcywgYXdrX3N1YihhblswXSwgYXNbMV0sIDAsIGF2WzJdLCBhdlsyXSwgRkFMU0UpKTsKKwkJYnJlYWs7CisKKwljYXNlIEJfc3U6CisJCXNldHZhcl9pKHJlcywgYXdrX3N1YihhblswXSwgYXNbMV0sIDEsIGF2WzJdLCBhdlsyXSwgRkFMU0UpKTsKKwkJYnJlYWs7CisJfQorCisJbnZmcmVlKHR2KTsKKwlyZXR1cm4gcmVzOworI3VuZGVmIHRzcGwKK30KKworLyoKKyAqIEV2YWx1YXRlIG5vZGUgLSB0aGUgaGVhcnQgb2YgdGhlIHByb2dyYW0uIFN1cHBsaWVkIHdpdGggc3VidHJlZQorICogYW5kIHBsYWNlIHdoZXJlIHRvIHN0b3JlIHJlc3VsdC4gcmV0dXJucyBwdHIgdG8gcmVzdWx0LgorICovCisjZGVmaW5lIFhDKG4pICgobikgPj4gOCkKKworc3RhdGljIHZhciAqZXZhbHVhdGUobm9kZSAqb3AsIHZhciAqcmVzKQoreworLyogVGhpcyBwcm9jZWR1cmUgaXMgcmVjdXJzaXZlIHNvIHdlIHNob3VsZCBjb3VudCBldmVyeSBieXRlICovCisjZGVmaW5lIGZuYXJncyAoRy5ldmFsdWF0ZV9fZm5hcmdzKQorLyogc2VlZCBpcyBpbml0aWFsaXplZCB0byAxICovCisjZGVmaW5lIHNlZWQgICAoRy5ldmFsdWF0ZV9fc2VlZCkKKyNkZWZpbmUgc3JlZyAgIChHLmV2YWx1YXRlX19zcmVnKQorCisJdmFyICp2MTsKKworCWlmICghb3ApCisJCXJldHVybiBzZXR2YXJfcyhyZXMsIE5VTEwpOworCisJZGVidWdfcHJpbnRmX2V2YWwoImVudGVyZWQgJXMoKVxuIiwgX19mdW5jX18pOworCisJdjEgPSBudmFsbG9jKDIpOworCisJd2hpbGUgKG9wKSB7CisJCXN0cnVjdCB7CisJCQl2YXIgKnY7CisJCQljb25zdCBjaGFyICpzOworCQl9IEwgPSBMOyAvKiBmb3IgY29tcGlsZXIgKi8KKwkJc3RydWN0IHsKKwkJCXZhciAqdjsKKwkJCWNvbnN0IGNoYXIgKnM7CisJCX0gUiA9IFI7CisJCWRvdWJsZSBMX2QgPSBMX2Q7CisJCXVpbnQzMl90IG9waW5mbzsKKwkJaW50IG9wbjsKKwkJbm9kZSAqb3AxOworCisJCW9waW5mbyA9IG9wLT5pbmZvOworCQlvcG4gPSAob3BpbmZvICYgT1BOTUFTSyk7CisJCWdfbGluZW5vID0gb3AtPmxpbmVubzsKKwkJb3AxID0gb3AtPmwubjsKKwkJZGVidWdfcHJpbnRmX2V2YWwoIm9waW5mbzolMDh4IG9wbjolMDh4XG4iLCBvcGluZm8sIG9wbik7CisKKwkJLyogZXhlY3V0ZSBpbmV2aXRhYmxlIHRoaW5ncyAqLworCQlpZiAob3BpbmZvICYgT0ZfUkVTMSkKKwkJCUwudiA9IGV2YWx1YXRlKG9wMSwgdjEpOworCQlpZiAob3BpbmZvICYgT0ZfUkVTMikKKwkJCVIudiA9IGV2YWx1YXRlKG9wLT5yLm4sIHYxKzEpOworCQlpZiAob3BpbmZvICYgT0ZfU1RSMSkgeworCQkJTC5zID0gZ2V0dmFyX3MoTC52KTsKKwkJCWRlYnVnX3ByaW50Zl9ldmFsKCJMLnM6JyVzJ1xuIiwgTC5zKTsKKwkJfQorCQlpZiAob3BpbmZvICYgT0ZfU1RSMikgeworCQkJUi5zID0gZ2V0dmFyX3MoUi52KTsKKwkJCWRlYnVnX3ByaW50Zl9ldmFsKCJSLnM6JyVzJ1xuIiwgUi5zKTsKKwkJfQorCQlpZiAob3BpbmZvICYgT0ZfTlVNMSkgeworCQkJTF9kID0gZ2V0dmFyX2koTC52KTsKKwkJCWRlYnVnX3ByaW50Zl9ldmFsKCJMX2Q6JWZcbiIsIExfZCk7CisJCX0KKworCQlkZWJ1Z19wcmludGZfZXZhbCgic3dpdGNoKDB4JXgpXG4iLCBYQyhvcGluZm8gJiBPUENMU01BU0spKTsKKwkJc3dpdGNoIChYQyhvcGluZm8gJiBPUENMU01BU0spKSB7CisKKwkJLyogLS0gaXRlcmF0aXZlIG5vZGUgdHlwZSAtLSAqLworCisJCS8qIHRlc3QgcGF0dGVybiAqLworCQljYXNlIFhDKCBPQ19URVNUICk6CisJCQlpZiAoKG9wMS0+aW5mbyAmIE9QQ0xTTUFTSykgPT0gT0NfQ09NTUEpIHsKKwkJCQkvKiBpdCdzIHJhbmdlIHBhdHRlcm4gKi8KKwkJCQlpZiAoKG9waW5mbyAmIE9GX0NIRUNLRUQpIHx8IHB0ZXN0KG9wMS0+bC5uKSkgeworCQkJCQlvcC0+aW5mbyB8PSBPRl9DSEVDS0VEOworCQkJCQlpZiAocHRlc3Qob3AxLT5yLm4pKQorCQkJCQkJb3AtPmluZm8gJj0gfk9GX0NIRUNLRUQ7CisJCQkJCW9wID0gb3AtPmEubjsKKwkJCQl9IGVsc2UgeworCQkJCQlvcCA9IG9wLT5yLm47CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlvcCA9IHB0ZXN0KG9wMSkgPyBvcC0+YS5uIDogb3AtPnIubjsKKwkJCX0KKwkJCWJyZWFrOworCisJCS8qIGp1c3QgZXZhbHVhdGUgYW4gZXhwcmVzc2lvbiwgYWxzbyB1c2VkIGFzIHVuY29uZGl0aW9uYWwganVtcCAqLworCQljYXNlIFhDKCBPQ19FWEVDICk6CisJCQlicmVhazsKKworCQkvKiBicmFuY2gsIHVzZWQgaW4gaWYtZWxzZSBhbmQgdmFyaW91cyBsb29wcyAqLworCQljYXNlIFhDKCBPQ19CUiApOgorCQkJb3AgPSBpc3RydWUoTC52KSA/IG9wLT5hLm4gOiBvcC0+ci5uOworCQkJYnJlYWs7CisKKwkJLyogaW5pdGlhbGl6ZSBmb3ItaW4gbG9vcCAqLworCQljYXNlIFhDKCBPQ19XQUxLSU5JVCApOgorCQkJaGFzaHdhbGtfaW5pdChMLnYsIGlhbWFycmF5KFIudikpOworCQkJYnJlYWs7CisKKwkJLyogZ2V0IG5leHQgYXJyYXkgaXRlbSAqLworCQljYXNlIFhDKCBPQ19XQUxLTkVYVCApOgorCQkJb3AgPSBoYXNod2Fsa19uZXh0KEwudikgPyBvcC0+YS5uIDogb3AtPnIubjsKKwkJCWJyZWFrOworCisJCWNhc2UgWEMoIE9DX1BSSU5UICk6CisJCWNhc2UgWEMoIE9DX1BSSU5URiApOiB7CisJCQlGSUxFICpGID0gc3Rkb3V0OworCisJCQlpZiAob3AtPnIubikgeworCQkJCXJzdHJlYW0gKnJzbSA9IG5ld2ZpbGUoUi5zKTsKKwkJCQlpZiAoIXJzbS0+RikgeworCQkJCQlpZiAob3BuID09ICd8JykgeworCQkJCQkJcnNtLT5GID0gcG9wZW4oUi5zLCAidyIpOworCQkJCQkJaWYgKHJzbS0+RiA9PSBOVUxMKQorCQkJCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgicG9wZW4iKTsKKwkJCQkJCXJzbS0+aXNfcGlwZSA9IDE7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlyc20tPkYgPSB4Zm9wZW4oUi5zLCBvcG49PSd3JyA/ICJ3IiA6ICJhIik7CisJCQkJCX0KKwkJCQl9CisJCQkJRiA9IHJzbS0+RjsKKwkJCX0KKworCQkJaWYgKChvcGluZm8gJiBPUENMU01BU0spID09IE9DX1BSSU5UKSB7CisJCQkJaWYgKCFvcDEpIHsKKwkJCQkJZnB1dHMoZ2V0dmFyX3MoaW50dmFyW0YwXSksIEYpOworCQkJCX0gZWxzZSB7CisJCQkJCXdoaWxlIChvcDEpIHsKKwkJCQkJCXZhciAqdiA9IGV2YWx1YXRlKG5leHRhcmcoJm9wMSksIHYxKTsKKwkJCQkJCWlmICh2LT50eXBlICYgVkZfTlVNQkVSKSB7CisJCQkJCQkJZm10X251bShnX2J1ZiwgTUFYVkFSRk1ULCBnZXR2YXJfcyhpbnR2YXJbT0ZNVF0pLAorCQkJCQkJCQkJZ2V0dmFyX2kodiksIFRSVUUpOworCQkJCQkJCWZwdXRzKGdfYnVmLCBGKTsKKwkJCQkJCX0gZWxzZSB7CisJCQkJCQkJZnB1dHMoZ2V0dmFyX3ModiksIEYpOworCQkJCQkJfQorCisJCQkJCQlpZiAob3AxKQorCQkJCQkJCWZwdXRzKGdldHZhcl9zKGludHZhcltPRlNdKSwgRik7CisJCQkJCX0KKwkJCQl9CisJCQkJZnB1dHMoZ2V0dmFyX3MoaW50dmFyW09SU10pLCBGKTsKKworCQkJfSBlbHNlIHsJLyogT0NfUFJJTlRGICovCisJCQkJY2hhciAqcyA9IGF3a19wcmludGYob3AxKTsKKwkJCQlmcHV0cyhzLCBGKTsKKwkJCQlmcmVlKHMpOworCQkJfQorCQkJZmZsdXNoKEYpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFhDKCBPQ19ERUxFVEUgKTogeworCQkJdWludDMyX3QgaW5mbyA9IG9wMS0+aW5mbyAmIE9QQ0xTTUFTSzsKKwkJCXZhciAqdjsKKworCQkJaWYgKGluZm8gPT0gT0NfVkFSKSB7CisJCQkJdiA9IG9wMS0+bC52OworCQkJfSBlbHNlIGlmIChpbmZvID09IE9DX0ZOQVJHKSB7CisJCQkJdiA9ICZmbmFyZ3Nbb3AxLT5sLmFpZHhdOworCQkJfSBlbHNlIHsKKwkJCQlzeW50YXhfZXJyb3IoRU1TR19OT1RfQVJSQVkpOworCQkJfQorCisJCQlpZiAob3AxLT5yLm4pIHsKKwkJCQljb25zdCBjaGFyICpzOworCQkJCWNscnZhcihMLnYpOworCQkJCXMgPSBnZXR2YXJfcyhldmFsdWF0ZShvcDEtPnIubiwgdjEpKTsKKwkJCQloYXNoX3JlbW92ZShpYW1hcnJheSh2KSwgcyk7CisJCQl9IGVsc2UgeworCQkJCWNsZWFyX2FycmF5KGlhbWFycmF5KHYpKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBYQyggT0NfTkVXU09VUkNFICk6CisJCQlnX3Byb2duYW1lID0gb3AtPmwubmV3X3Byb2duYW1lOworCQkJYnJlYWs7CisKKwkJY2FzZSBYQyggT0NfUkVUVVJOICk6CisJCQljb3B5dmFyKHJlcywgTC52KTsKKwkJCWJyZWFrOworCisJCWNhc2UgWEMoIE9DX05FWFRGSUxFICk6CisJCQluZXh0ZmlsZSA9IFRSVUU7CisJCWNhc2UgWEMoIE9DX05FWFQgKToKKwkJCW5leHRyZWMgPSBUUlVFOworCQljYXNlIFhDKCBPQ19ET05FICk6CisJCQljbHJ2YXIocmVzKTsKKwkJCWJyZWFrOworCisJCWNhc2UgWEMoIE9DX0VYSVQgKToKKwkJCWF3a19leGl0KExfZCk7CisKKwkJLyogLS0gcmVjdXJzaXZlIG5vZGUgdHlwZSAtLSAqLworCisJCWNhc2UgWEMoIE9DX1ZBUiApOgorCQkJTC52ID0gb3AtPmwudjsKKwkJCWlmIChMLnYgPT0gaW50dmFyW05GXSkKKwkJCQlzcGxpdF9mMCgpOworCQkJZ290byB2X2NvbnQ7CisKKwkJY2FzZSBYQyggT0NfRk5BUkcgKToKKwkJCUwudiA9ICZmbmFyZ3Nbb3AtPmwuYWlkeF07Cisgdl9jb250OgorCQkJcmVzID0gb3AtPnIubiA/IGZpbmR2YXIoaWFtYXJyYXkoTC52KSwgUi5zKSA6IEwudjsKKwkJCWJyZWFrOworCisJCWNhc2UgWEMoIE9DX0lOICk6CisJCQlzZXR2YXJfaShyZXMsIGhhc2hfc2VhcmNoKGlhbWFycmF5KFIudiksIEwucykgPyAxIDogMCk7CisJCQlicmVhazsKKworCQljYXNlIFhDKCBPQ19SRUdFWFAgKToKKwkJCW9wMSA9IG9wOworCQkJTC5zID0gZ2V0dmFyX3MoaW50dmFyW0YwXSk7CisJCQlnb3RvIHJlX2NvbnQ7CisKKwkJY2FzZSBYQyggT0NfTUFUQ0ggKToKKwkJCW9wMSA9IG9wLT5yLm47CisgcmVfY29udDoKKwkJCXsKKwkJCQlyZWdleF90ICpyZSA9IGFzX3JlZ2V4KG9wMSwgJnNyZWcpOworCQkJCWludCBpID0gcmVnZXhlYyhyZSwgTC5zLCAwLCBOVUxMLCAwKTsKKwkJCQlpZiAocmUgPT0gJnNyZWcpCisJCQkJCXJlZ2ZyZWUocmUpOworCQkJCXNldHZhcl9pKHJlcywgKGkgPT0gMCkgXiAob3BuID09ICchJykpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBYQyggT0NfTU9WRSApOgorCQkJZGVidWdfcHJpbnRmX2V2YWwoIk1PVkVcbiIpOworCQkJLyogaWYgc291cmNlIGlzIGEgdGVtcG9yYXJ5IHN0cmluZywganVzayByZWxpbmsgaXQgdG8gZGVzdCAqLworLy9EaXNhYmxlZDogaWYgUi52IGlzIG51bWVyaWMgYnV0IGhhcHBlbnMgdG8gaGF2ZSBjYWNoZWQgUi52LT5zdHJpbmcsCisvL3RoZW4gTC52IGVuZHMgdXAgYmVpbmcgYSBzdHJpbmcsIHdoaWNoIGlzIHdyb25nCisvLwkJCWlmIChSLnYgPT0gdjErMSAmJiBSLnYtPnN0cmluZykgeworLy8JCQkJcmVzID0gc2V0dmFyX3AoTC52LCBSLnYtPnN0cmluZyk7CisvLwkJCQlSLnYtPnN0cmluZyA9IE5VTEw7CisvLwkJCX0gZWxzZSB7CisJCQkJcmVzID0gY29weXZhcihMLnYsIFIudik7CisvLwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgWEMoIE9DX1RFUk5BUlkgKToKKwkJCWlmICgob3AtPnIubi0+aW5mbyAmIE9QQ0xTTUFTSykgIT0gT0NfQ09MT04pCisJCQkJc3ludGF4X2Vycm9yKEVNU0dfUE9TU0lCTEVfRVJST1IpOworCQkJcmVzID0gZXZhbHVhdGUoaXN0cnVlKEwudikgPyBvcC0+ci5uLT5sLm4gOiBvcC0+ci5uLT5yLm4sIHJlcyk7CisJCQlicmVhazsKKworCQljYXNlIFhDKCBPQ19GVU5DICk6IHsKKwkJCXZhciAqdmJlZywgKnY7CisJCQljb25zdCBjaGFyICpzdl9wcm9nbmFtZTsKKworCQkJLyogVGhlIGJvZHkgbWlnaHQgYmUgZW1wdHksIHN0aWxsIGhhcyB0byBldmFsIHRoZSBhcmdzICovCisJCQlpZiAoIW9wLT5yLm4tPmluZm8gJiYgIW9wLT5yLmYtPmJvZHkuZmlyc3QpCisJCQkJc3ludGF4X2Vycm9yKEVNU0dfVU5ERUZfRlVOQyk7CisKKwkJCXZiZWcgPSB2ID0gbnZhbGxvYyhvcC0+ci5mLT5uYXJncyArIDEpOworCQkJd2hpbGUgKG9wMSkgeworCQkJCXZhciAqYXJnID0gZXZhbHVhdGUobmV4dGFyZygmb3AxKSwgdjEpOworCQkJCWNvcHl2YXIodiwgYXJnKTsKKwkJCQl2LT50eXBlIHw9IFZGX0NISUxEOworCQkJCXYtPngucGFyZW50ID0gYXJnOworCQkJCWlmICgrK3YgLSB2YmVnID49IG9wLT5yLmYtPm5hcmdzKQorCQkJCQlicmVhazsKKwkJCX0KKworCQkJdiA9IGZuYXJnczsKKwkJCWZuYXJncyA9IHZiZWc7CisJCQlzdl9wcm9nbmFtZSA9IGdfcHJvZ25hbWU7CisKKwkJCXJlcyA9IGV2YWx1YXRlKG9wLT5yLmYtPmJvZHkuZmlyc3QsIHJlcyk7CisKKwkJCWdfcHJvZ25hbWUgPSBzdl9wcm9nbmFtZTsKKwkJCW52ZnJlZShmbmFyZ3MpOworCQkJZm5hcmdzID0gdjsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFhDKCBPQ19HRVRMSU5FICk6CisJCWNhc2UgWEMoIE9DX1BHRVRMSU5FICk6IHsKKwkJCXJzdHJlYW0gKnJzbTsKKwkJCWludCBpOworCisJCQlpZiAob3AxKSB7CisJCQkJcnNtID0gbmV3ZmlsZShMLnMpOworCQkJCWlmICghcnNtLT5GKSB7CisJCQkJCWlmICgob3BpbmZvICYgT1BDTFNNQVNLKSA9PSBPQ19QR0VUTElORSkgeworCQkJCQkJcnNtLT5GID0gcG9wZW4oTC5zLCAiciIpOworCQkJCQkJcnNtLT5pc19waXBlID0gVFJVRTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXJzbS0+RiA9IGZvcGVuX2Zvcl9yZWFkKEwucyk7ICAvKiBub3QgeGZvcGVuISAqLworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoIWlGKQorCQkJCQlpRiA9IG5leHRfaW5wdXRfZmlsZSgpOworCQkJCXJzbSA9IGlGOworCQkJfQorCisJCQlpZiAoIXJzbSB8fCAhcnNtLT5GKSB7CisJCQkJc2V0dmFyX2koaW50dmFyW0VSUk5PXSwgZXJybm8pOworCQkJCXNldHZhcl9pKHJlcywgLTEpOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZiAoIW9wLT5yLm4pCisJCQkJUi52ID0gaW50dmFyW0YwXTsKKworCQkJaSA9IGF3a19nZXRsaW5lKHJzbSwgUi52KTsKKwkJCWlmIChpID4gMCAmJiAhb3AxKSB7CisJCQkJaW5jdmFyKGludHZhcltGTlJdKTsKKwkJCQlpbmN2YXIoaW50dmFyW05SXSk7CisJCQl9CisJCQlzZXR2YXJfaShyZXMsIGkpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBzaW1wbGUgYnVpbHRpbnMgKi8KKwkJY2FzZSBYQyggT0NfRkJMVElOICk6IHsKKwkJCWRvdWJsZSBSX2QgPSBSX2Q7IC8qIGZvciBjb21waWxlciAqLworCisJCQlzd2l0Y2ggKG9wbikgeworCQkJY2FzZSBGX2luOgorCQkJCVJfZCA9IChsb25nIGxvbmcpTF9kOworCQkJCWJyZWFrOworCisJCQljYXNlIEZfcm46CisJCQkJUl9kID0gKGRvdWJsZSlyYW5kKCkgLyAoZG91YmxlKVJBTkRfTUFYOworCQkJCWJyZWFrOworCisJCQljYXNlIEZfY286CisJCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0FXS19MSUJNKSB7CisJCQkJCVJfZCA9IGNvcyhMX2QpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2UgRl9leDoKKwkJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQVdLX0xJQk0pIHsKKwkJCQkJUl9kID0gZXhwKExfZCk7CisJCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBGX2xnOgorCQkJCWlmIChFTkFCTEVfRkVBVFVSRV9BV0tfTElCTSkgeworCQkJCQlSX2QgPSBsb2coTF9kKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQljYXNlIEZfc2k6CisJCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0FXS19MSUJNKSB7CisJCQkJCVJfZCA9IHNpbihMX2QpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2UgRl9zcToKKwkJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQVdLX0xJQk0pIHsKKwkJCQkJUl9kID0gc3FydChMX2QpOworCQkJCQlicmVhazsKKwkJCQl9CisKKwkJCQlzeW50YXhfZXJyb3IoRU1TR19OT19NQVRIKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBGX3NyOgorCQkJCVJfZCA9IChkb3VibGUpc2VlZDsKKwkJCQlzZWVkID0gb3AxID8gKHVuc2lnbmVkKUxfZCA6ICh1bnNpZ25lZCl0aW1lKE5VTEwpOworCQkJCXNyYW5kKHNlZWQpOworCQkJCWJyZWFrOworCisJCQljYXNlIEZfdGk6CisJCQkJUl9kID0gdGltZShOVUxMKTsKKwkJCQlicmVhazsKKworCQkJY2FzZSBGX2xlOgorCQkJCWRlYnVnX3ByaW50Zl9ldmFsKCJsZW5ndGg6IEwuczonJXMnXG4iLCBMLnMpOworCQkJCWlmICghb3AxKSB7CisJCQkJCUwucyA9IGdldHZhcl9zKGludHZhcltGMF0pOworCQkJCQlkZWJ1Z19wcmludGZfZXZhbCgibGVuZ3RoOiBMLnM9JyVzJ1xuIiwgTC5zKTsKKwkJCQl9CisJCQkJZWxzZSBpZiAoTC52LT50eXBlICYgVkZfQVJSQVkpIHsKKwkJCQkJUl9kID0gTC52LT54LmFycmF5LT5uZWw7CisJCQkJCWRlYnVnX3ByaW50Zl9ldmFsKCJsZW5ndGg6IGFycmF5X2xlbjolZFxuIiwgTC52LT54LmFycmF5LT5uZWwpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJUl9kID0gc3RybGVuKEwucyk7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRl9zeToKKwkJCQlmZmx1c2hfYWxsKCk7CisJCQkJUl9kID0gKEVOQUJMRV9GRUFUVVJFX0FMTE9XX0VYRUMgJiYgTC5zICYmICpMLnMpCisJCQkJCQk/IChzeXN0ZW0oTC5zKSA+PiA4KSA6IDA7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgRl9mZjoKKwkJCQlpZiAoIW9wMSkgeworCQkJCQlmZmx1c2goc3Rkb3V0KTsKKwkJCQl9IGVsc2UgaWYgKEwucyAmJiAqTC5zKSB7CisJCQkJCXJzdHJlYW0gKnJzbSA9IG5ld2ZpbGUoTC5zKTsKKwkJCQkJZmZsdXNoKHJzbS0+Rik7CisJCQkJfSBlbHNlIHsKKwkJCQkJZmZsdXNoX2FsbCgpOworCQkJCX0KKwkJCQlicmVhazsKKworCQkJY2FzZSBGX2NsOiB7CisJCQkJcnN0cmVhbSAqcnNtOworCQkJCWludCBlcnIgPSAwOworCQkJCXJzbSA9IChyc3RyZWFtICopaGFzaF9zZWFyY2goZmRoYXNoLCBMLnMpOworCQkJCWRlYnVnX3ByaW50Zl9ldmFsKCJPQ19GQkxUSU4gRl9jbCByc206JXBcbiIsIHJzbSk7CisJCQkJaWYgKHJzbSkgeworCQkJCQlkZWJ1Z19wcmludGZfZXZhbCgiT0NfRkJMVElOIEZfY2wgIgorCQkJCQkJInJzbS0+aXNfcGlwZTolZCwgLT5GOiVwXG4iLAorCQkJCQkJcnNtLT5pc19waXBlLCByc20tPkYpOworCQkJCQkvKiBDYW4gYmUgTlVMTCBpZiBvcGVuIGZhaWxlZC4gRXhhbXBsZToKKwkJCQkJICogZ2V0bGluZSBsaW5lIDwiZG9lc250X2V4aXN0IjsKKwkJCQkJICogY2xvc2UoImRvZXNudF9leGlzdCIpOyA8LS0tIGhlcmUgcnNtLT5GIGlzIE5VTEwKKwkJCQkJICovCisJCQkJCWlmIChyc20tPkYpCisJCQkJCQllcnIgPSByc20tPmlzX3BpcGUgPyBwY2xvc2UocnNtLT5GKSA6IGZjbG9zZShyc20tPkYpOworCQkJCQlmcmVlKHJzbS0+YnVmZmVyKTsKKwkJCQkJaGFzaF9yZW1vdmUoZmRoYXNoLCBMLnMpOworCQkJCX0KKwkJCQlpZiAoZXJyKQorCQkJCQlzZXR2YXJfaShpbnR2YXJbRVJSTk9dLCBlcnJubyk7CisJCQkJUl9kID0gKGRvdWJsZSllcnI7CisJCQkJYnJlYWs7CisJCQl9CisJCQl9IC8qIHN3aXRjaCAqLworCQkJc2V0dmFyX2kocmVzLCBSX2QpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFhDKCBPQ19CVUlMVElOICk6CisJCQlyZXMgPSBleGVjX2J1aWx0aW4ob3AsIHJlcyk7CisJCQlicmVhazsKKworCQljYXNlIFhDKCBPQ19TUFJJTlRGICk6CisJCQlzZXR2YXJfcChyZXMsIGF3a19wcmludGYob3AxKSk7CisJCQlicmVhazsKKworCQljYXNlIFhDKCBPQ19VTkFSWSApOiB7CisJCQlkb3VibGUgTGQsIFJfZDsKKworCQkJTGQgPSBSX2QgPSBnZXR2YXJfaShSLnYpOworCQkJc3dpdGNoIChvcG4pIHsKKwkJCWNhc2UgJ1AnOgorCQkJCUxkID0gKytSX2Q7CisJCQkJZ290byByX29wX2NoYW5nZTsKKwkJCWNhc2UgJ3AnOgorCQkJCVJfZCsrOworCQkJCWdvdG8gcl9vcF9jaGFuZ2U7CisJCQljYXNlICdNJzoKKwkJCQlMZCA9IC0tUl9kOworCQkJCWdvdG8gcl9vcF9jaGFuZ2U7CisJCQljYXNlICdtJzoKKwkJCQlSX2QtLTsKKyByX29wX2NoYW5nZToKKwkJCQlzZXR2YXJfaShSLnYsIFJfZCk7CisJCQkJYnJlYWs7CisJCQljYXNlICchJzoKKwkJCQlMZCA9ICFpc3RydWUoUi52KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJy0nOgorCQkJCUxkID0gLVJfZDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXNldHZhcl9pKHJlcywgTGQpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFhDKCBPQ19GSUVMRCApOiB7CisJCQlpbnQgaSA9IChpbnQpZ2V0dmFyX2koUi52KTsKKwkJCWlmIChpID09IDApIHsKKwkJCQlyZXMgPSBpbnR2YXJbRjBdOworCQkJfSBlbHNlIHsKKwkJCQlzcGxpdF9mMCgpOworCQkJCWlmIChpID4gbmZpZWxkcykKKwkJCQkJZnNyZWFsbG9jKGkpOworCQkJCXJlcyA9ICZGaWVsZHNbaSAtIDFdOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQkvKiBjb25jYXRlbmF0aW9uICgiICIpIGFuZCBpbmRleCBqb2luaW5nICgiLCIpICovCisJCWNhc2UgWEMoIE9DX0NPTkNBVCApOgorCQljYXNlIFhDKCBPQ19DT01NQSApOiB7CisJCQljb25zdCBjaGFyICpzZXAgPSAiIjsKKwkJCWlmICgob3BpbmZvICYgT1BDTFNNQVNLKSA9PSBPQ19DT01NQSkKKwkJCQlzZXAgPSBnZXR2YXJfcyhpbnR2YXJbU1VCU0VQXSk7CisJCQlzZXR2YXJfcChyZXMsIHhhc3ByaW50ZigiJXMlcyVzIiwgTC5zLCBzZXAsIFIucykpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFhDKCBPQ19MQU5EICk6CisJCQlzZXR2YXJfaShyZXMsIGlzdHJ1ZShMLnYpID8gcHRlc3Qob3AtPnIubikgOiAwKTsKKwkJCWJyZWFrOworCisJCWNhc2UgWEMoIE9DX0xPUiApOgorCQkJc2V0dmFyX2kocmVzLCBpc3RydWUoTC52KSA/IDEgOiBwdGVzdChvcC0+ci5uKSk7CisJCQlicmVhazsKKworCQljYXNlIFhDKCBPQ19CSU5BUlkgKToKKwkJY2FzZSBYQyggT0NfUkVQTEFDRSApOiB7CisJCQlkb3VibGUgUl9kID0gZ2V0dmFyX2koUi52KTsKKwkJCWRlYnVnX3ByaW50Zl9ldmFsKCJCSU5BUlkvUkVQTEFDRTogUl9kOiVmIG9wbjolY1xuIiwgUl9kLCBvcG4pOworCQkJc3dpdGNoIChvcG4pIHsKKwkJCWNhc2UgJysnOgorCQkJCUxfZCArPSBSX2Q7CisJCQkJYnJlYWs7CisJCQljYXNlICctJzoKKwkJCQlMX2QgLT0gUl9kOworCQkJCWJyZWFrOworCQkJY2FzZSAnKic6CisJCQkJTF9kICo9IFJfZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJy8nOgorCQkJCWlmIChSX2QgPT0gMCkKKwkJCQkJc3ludGF4X2Vycm9yKEVNU0dfRElWX0JZX1pFUk8pOworCQkJCUxfZCAvPSBSX2Q7CisJCQkJYnJlYWs7CisJCQljYXNlICcmJzoKKwkJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQVdLX0xJQk0pCisJCQkJCUxfZCA9IHBvdyhMX2QsIFJfZCk7CisJCQkJZWxzZQorCQkJCQlzeW50YXhfZXJyb3IoRU1TR19OT19NQVRIKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJyUnOgorCQkJCWlmIChSX2QgPT0gMCkKKwkJCQkJc3ludGF4X2Vycm9yKEVNU0dfRElWX0JZX1pFUk8pOworCQkJCUxfZCAtPSAobG9uZyBsb25nKShMX2QgLyBSX2QpICogUl9kOworCQkJCWJyZWFrOworCQkJfQorCQkJZGVidWdfcHJpbnRmX2V2YWwoIkJJTkFSWS9SRVBMQUNFIHJlc3VsdDolZlxuIiwgTF9kKTsKKwkJCXJlcyA9IHNldHZhcl9pKCgob3BpbmZvICYgT1BDTFNNQVNLKSA9PSBPQ19CSU5BUlkpID8gcmVzIDogTC52LCBMX2QpOworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFhDKCBPQ19DT01QQVJFICk6IHsKKwkJCWludCBpID0gaTsgLyogZm9yIGNvbXBpbGVyICovCisJCQlkb3VibGUgTGQ7CisKKwkJCWlmIChpc19udW1lcmljKEwudikgJiYgaXNfbnVtZXJpYyhSLnYpKSB7CisJCQkJTGQgPSBnZXR2YXJfaShMLnYpIC0gZ2V0dmFyX2koUi52KTsKKwkJCX0gZWxzZSB7CisJCQkJY29uc3QgY2hhciAqbCA9IGdldHZhcl9zKEwudik7CisJCQkJY29uc3QgY2hhciAqciA9IGdldHZhcl9zKFIudik7CisJCQkJTGQgPSBpY2FzZSA/IHN0cmNhc2VjbXAobCwgcikgOiBzdHJjbXAobCwgcik7CisJCQl9CisJCQlzd2l0Y2ggKG9wbiAmIDB4ZmUpIHsKKwkJCWNhc2UgMDoKKwkJCQlpID0gKExkID4gMCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6CisJCQkJaSA9IChMZCA+PSAwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDoKKwkJCQlpID0gKExkID09IDApOworCQkJCWJyZWFrOworCQkJfQorCQkJc2V0dmFyX2kocmVzLCAoaSA9PSAwKSBeIChvcG4gJiAxKSk7CisJCQlicmVhazsKKwkJfQorCisJCWRlZmF1bHQ6CisJCQlzeW50YXhfZXJyb3IoRU1TR19QT1NTSUJMRV9FUlJPUik7CisJCX0KKwkJaWYgKChvcGluZm8gJiBPUENMU01BU0spIDw9IFNISUZUX1RJTF9USElTKQorCQkJb3AgPSBvcC0+YS5uOworCQlpZiAoKG9waW5mbyAmIE9QQ0xTTUFTSykgPj0gUkVDVVJfRlJPTV9USElTKQorCQkJYnJlYWs7CisJCWlmIChuZXh0cmVjKQorCQkJYnJlYWs7CisJfSAvKiB3aGlsZSAob3ApICovCisKKwludmZyZWUodjEpOworCWRlYnVnX3ByaW50Zl9ldmFsKCJyZXR1cm5pbmcgZnJvbSAlcygpOiAlcFxuIiwgX19mdW5jX18sIHJlcyk7CisJcmV0dXJuIHJlczsKKyN1bmRlZiBmbmFyZ3MKKyN1bmRlZiBzZWVkCisjdW5kZWYgc3JlZworfQorCisKKy8qIC0tLS0tLS0tIG1haW4gJiBjby4gLS0tLS0tLS0gKi8KKworc3RhdGljIGludCBhd2tfZXhpdChpbnQgcikKK3sKKwl2YXIgdHY7CisJdW5zaWduZWQgaTsKKwloYXNoX2l0ZW0gKmhpOworCisJemVyb19vdXRfdmFyKCZ0dik7CisKKwlpZiAoIWV4aXRpbmcpIHsKKwkJZXhpdGluZyA9IFRSVUU7CisJCW5leHRyZWMgPSBGQUxTRTsKKwkJZXZhbHVhdGUoZW5kc2VxLmZpcnN0LCAmdHYpOworCX0KKworCS8qIHdhaXRpbmcgZm9yIGNoaWxkcmVuICovCisJZm9yIChpID0gMDsgaSA8IGZkaGFzaC0+Y3NpemU7IGkrKykgeworCQloaSA9IGZkaGFzaC0+aXRlbXNbaV07CisJCXdoaWxlIChoaSkgeworCQkJaWYgKGhpLT5kYXRhLnJzLkYgJiYgaGktPmRhdGEucnMuaXNfcGlwZSkKKwkJCQlwY2xvc2UoaGktPmRhdGEucnMuRik7CisJCQloaSA9IGhpLT5uZXh0OworCQl9CisJfQorCisJZXhpdChyKTsKK30KKworLyogaWYgZXhwciBsb29rcyBsaWtlICJ2YXI9dmFsdWUiLCBwZXJmb3JtIGFzc2lnbm1lbnQgYW5kIHJldHVybiAxLAorICogb3RoZXJ3aXNlIHJldHVybiAwICovCitzdGF0aWMgaW50IGlzX2Fzc2lnbm1lbnQoY29uc3QgY2hhciAqZXhwcikKK3sKKwljaGFyICpleHByYywgKnZhbDsKKworCWlmICghaXNhbG51bV8oKmV4cHIpIHx8ICh2YWwgPSBzdHJjaHIoZXhwciwgJz0nKSkgPT0gTlVMTCkgeworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJZXhwcmMgPSB4c3RyZHVwKGV4cHIpOworCXZhbCA9IGV4cHJjICsgKHZhbCAtIGV4cHIpOworCSp2YWwrKyA9ICdcMCc7CisKKwl1bmVzY2FwZV9zdHJpbmdfaW5fcGxhY2UodmFsKTsKKwlzZXR2YXJfdShuZXd2YXIoZXhwcmMpLCB2YWwpOworCWZyZWUoZXhwcmMpOworCXJldHVybiBUUlVFOworfQorCisvKiBzd2l0Y2ggdG8gbmV4dCBpbnB1dCBmaWxlICovCitzdGF0aWMgcnN0cmVhbSAqbmV4dF9pbnB1dF9maWxlKHZvaWQpCit7CisjZGVmaW5lIHJzbSAgICAgICAgICAoRy5uZXh0X2lucHV0X2ZpbGVfX3JzbSkKKyNkZWZpbmUgZmlsZXNfaGFwcGVuIChHLm5leHRfaW5wdXRfZmlsZV9fZmlsZXNfaGFwcGVuKQorCisJRklMRSAqRjsKKwljb25zdCBjaGFyICpmbmFtZSwgKmluZDsKKworCWlmIChyc20uRikKKwkJZmNsb3NlKHJzbS5GKTsKKwlyc20uRiA9IE5VTEw7CisJcnNtLnBvcyA9IHJzbS5hZHYgPSAwOworCisJZm9yICg7OykgeworCQlpZiAoZ2V0dmFyX2koaW50dmFyW0FSR0lORF0pKzEgPj0gZ2V0dmFyX2koaW50dmFyW0FSR0NdKSkgeworCQkJaWYgKGZpbGVzX2hhcHBlbikKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCWZuYW1lID0gIi0iOworCQkJRiA9IHN0ZGluOworCQkJYnJlYWs7CisJCX0KKwkJaW5kID0gZ2V0dmFyX3MoaW5jdmFyKGludHZhcltBUkdJTkRdKSk7CisJCWZuYW1lID0gZ2V0dmFyX3MoZmluZHZhcihpYW1hcnJheShpbnR2YXJbQVJHVl0pLCBpbmQpKTsKKwkJaWYgKGZuYW1lICYmICpmbmFtZSAmJiAhaXNfYXNzaWdubWVudChmbmFtZSkpIHsKKwkJCUYgPSB4Zm9wZW5fc3RkaW4oZm5hbWUpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlmaWxlc19oYXBwZW4gPSBUUlVFOworCXNldHZhcl9zKGludHZhcltGSUxFTkFNRV0sIGZuYW1lKTsKKwlyc20uRiA9IEY7CisJcmV0dXJuICZyc207CisjdW5kZWYgcnNtCisjdW5kZWYgZmlsZXNfaGFwcGVuCit9CisKK2ludCBhd2tfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGF3a19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHQ7CisJY2hhciAqb3B0X0Y7CisJbGxpc3RfdCAqbGlzdF92ID0gTlVMTDsKKwlsbGlzdF90ICpsaXN0X2YgPSBOVUxMOworI2lmIEVOQUJMRV9GRUFUVVJFX0FXS19HTlVfRVhURU5TSU9OUworCWxsaXN0X3QgKmxpc3RfZSA9IE5VTEw7CisjZW5kaWYKKwlpbnQgaSwgajsKKwl2YXIgKnY7CisJdmFyIHR2OworCWNoYXIgKiplbnZwOworCWNoYXIgKnZuYW1lcyA9IChjaGFyICopdk5hbWVzOyAvKiBjaGVhdCAqLworCWNoYXIgKnZ2YWx1ZXMgPSAoY2hhciAqKXZWYWx1ZXM7CisKKwlJTklUX0coKTsKKworCS8qIFVuZG8gYnVzeWJveC5jLCBvciBlbHNlIHN0cnRvZCBtYXkgZWF0ICcsJyEgVGhpcyBicmVha3MgcGFyc2luZzoKKwkgKiAkMSwkMiA9PSAnJDEsJyAnJDInLCBOT1QgJyQxJyAnLCcgJyQyJyAqLworCWlmIChFTkFCTEVfTE9DQUxFX1NVUFBPUlQpCisJCXNldGxvY2FsZShMQ19OVU1FUklDLCAiQyIpOworCisJemVyb19vdXRfdmFyKCZ0dik7CisKKwkvKiBhbGxvY2F0ZSBnbG9iYWwgYnVmZmVyICovCisJZ19idWYgPSB4bWFsbG9jKE1BWFZBUkZNVCArIDEpOworCisJdmhhc2ggPSBoYXNoX2luaXQoKTsKKwlhaGFzaCA9IGhhc2hfaW5pdCgpOworCWZkaGFzaCA9IGhhc2hfaW5pdCgpOworCWZuaGFzaCA9IGhhc2hfaW5pdCgpOworCisJLyogaW5pdGlhbGl6ZSB2YXJpYWJsZXMgKi8KKwlmb3IgKGkgPSAwOyAqdm5hbWVzOyBpKyspIHsKKwkJaW50dmFyW2ldID0gdiA9IG5ld3ZhcihuZXh0d29yZCgmdm5hbWVzKSk7CisJCWlmICgqdnZhbHVlcyAhPSAnXDM3NycpCisJCQlzZXR2YXJfcyh2LCBuZXh0d29yZCgmdnZhbHVlcykpOworCQllbHNlCisJCQlzZXR2YXJfaSh2LCAwKTsKKworCQlpZiAoKnZuYW1lcyA9PSAnKicpIHsKKwkJCXYtPnR5cGUgfD0gVkZfU1BFQ0lBTDsKKwkJCXZuYW1lcysrOworCQl9CisJfQorCisJaGFuZGxlX3NwZWNpYWwoaW50dmFyW0ZTXSk7CisJaGFuZGxlX3NwZWNpYWwoaW50dmFyW1JTXSk7CisKKwluZXdmaWxlKCIvZGV2L3N0ZGluIiktPkYgPSBzdGRpbjsKKwluZXdmaWxlKCIvZGV2L3N0ZG91dCIpLT5GID0gc3Rkb3V0OworCW5ld2ZpbGUoIi9kZXYvc3RkZXJyIiktPkYgPSBzdGRlcnI7CisKKwkvKiBIdWgsIHBlb3BsZSByZXBvcnQgdGhhdCBzb21ldGltZXMgZW52aXJvbiBpcyBOVUxMLiBPaCB3ZWxsLiAqLworCWlmIChlbnZpcm9uKSBmb3IgKGVudnAgPSBlbnZpcm9uOyAqZW52cDsgZW52cCsrKSB7CisJCS8qIGVudmlyb24gaXMgd3JpdGFibGUsIHRodXMgd2UgZG9uJ3Qgc3RyZHVwIGl0IG5lZWRsZXNzbHkgKi8KKwkJY2hhciAqcyA9ICplbnZwOworCQljaGFyICpzMSA9IHN0cmNocihzLCAnPScpOworCQlpZiAoczEpIHsKKwkJCSpzMSA9ICdcMCc7CisJCQkvKiBCb3RoIGZpbmR2YXIgYW5kIHNldHZhcl91IHRha2UgY29uc3QgY2hhcioKKwkJCSAqIGFzIDJuZCBhcmcgLT4gZW52aXJvbm1lbnQgaXMgbm90IHRyYXNoZWQgKi8KKwkJCXNldHZhcl91KGZpbmR2YXIoaWFtYXJyYXkoaW50dmFyW0VOVklST05dKSwgcyksIHMxICsgMSk7CisJCQkqczEgPSAnPSc7CisJCX0KKwl9CisJb3B0X2NvbXBsZW1lbnRhcnkgPSBPUFRDT01QTFNUUl9BV0s7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgT1BUU1RSX0FXSywgJm9wdF9GLCAmbGlzdF92LCAmbGlzdF9mLCBJRl9GRUFUVVJFX0FXS19HTlVfRVhURU5TSU9OUygmbGlzdF9lLCkgTlVMTCk7CisJYXJndiArPSBvcHRpbmQ7CisJYXJnYyAtPSBvcHRpbmQ7CisJaWYgKG9wdCAmIE9QVF9XKQorCQliYl9lcnJvcl9tc2coIndhcm5pbmc6IG9wdGlvbiAtVyBpcyBpZ25vcmVkIik7CisJaWYgKG9wdCAmIE9QVF9GKSB7CisJCXVuZXNjYXBlX3N0cmluZ19pbl9wbGFjZShvcHRfRik7CisJCXNldHZhcl9zKGludHZhcltGU10sIG9wdF9GKTsKKwl9CisJd2hpbGUgKGxpc3RfdikgeworCQlpZiAoIWlzX2Fzc2lnbm1lbnQobGxpc3RfcG9wKCZsaXN0X3YpKSkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisJd2hpbGUgKGxpc3RfZikgeworCQljaGFyICpzID0gTlVMTDsKKwkJRklMRSAqZnJvbV9maWxlOworCisJCWdfcHJvZ25hbWUgPSBsbGlzdF9wb3AoJmxpc3RfZik7CisJCWZyb21fZmlsZSA9IHhmb3Blbl9zdGRpbihnX3Byb2duYW1lKTsKKwkJLyogb25lIGJ5dGUgaXMgcmVzZXJ2ZWQgZm9yIHNvbWUgdHJpY2sgaW4gbmV4dF90b2tlbiAqLworCQlmb3IgKGkgPSBqID0gMTsgaiA+IDA7IGkgKz0gaikgeworCQkJcyA9IHhyZWFsbG9jKHMsIGkgKyA0MDk2KTsKKwkJCWogPSBmcmVhZChzICsgaSwgMSwgNDA5NCwgZnJvbV9maWxlKTsKKwkJfQorCQlzW2ldID0gJ1wwJzsKKwkJZmNsb3NlKGZyb21fZmlsZSk7CisJCXBhcnNlX3Byb2dyYW0ocyArIDEpOworCQlmcmVlKHMpOworCX0KKwlnX3Byb2duYW1lID0gImNtZC4gbGluZSI7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQVdLX0dOVV9FWFRFTlNJT05TCisJd2hpbGUgKGxpc3RfZSkgeworCQlwYXJzZV9wcm9ncmFtKGxsaXN0X3BvcCgmbGlzdF9lKSk7CisJfQorI2VuZGlmCisJaWYgKCEob3B0ICYgKE9QVF9mIHwgT1BUX2UpKSkgeworCQlpZiAoISphcmd2KQorCQkJYmJfc2hvd191c2FnZSgpOworCQlwYXJzZV9wcm9ncmFtKCphcmd2KyspOworCQlhcmdjLS07CisJfQorCisJLyogZmlsbCBpbiBBUkdWIGFycmF5ICovCisJc2V0dmFyX2koaW50dmFyW0FSR0NdLCBhcmdjICsgMSk7CisJc2V0YXJpX3UoaW50dmFyW0FSR1ZdLCAwLCAiYXdrIik7CisJaSA9IDA7CisJd2hpbGUgKCphcmd2KQorCQlzZXRhcmlfdShpbnR2YXJbQVJHVl0sICsraSwgKmFyZ3YrKyk7CisKKwlldmFsdWF0ZShiZWdpbnNlcS5maXJzdCwgJnR2KTsKKwlpZiAoIW1haW5zZXEuZmlyc3QgJiYgIWVuZHNlcS5maXJzdCkKKwkJYXdrX2V4aXQoRVhJVF9TVUNDRVNTKTsKKworCS8qIGlucHV0IGZpbGUgY291bGQgYWxyZWFkeSBiZSBvcGVuZWQgaW4gQkVHSU4gYmxvY2sgKi8KKwlpZiAoIWlGKQorCQlpRiA9IG5leHRfaW5wdXRfZmlsZSgpOworCisJLyogcGFzc2luZyB0aHJvdWdoIGlucHV0IGZpbGVzICovCisJd2hpbGUgKGlGKSB7CisJCW5leHRmaWxlID0gRkFMU0U7CisJCXNldHZhcl9pKGludHZhcltGTlJdLCAwKTsKKworCQl3aGlsZSAoKGkgPSBhd2tfZ2V0bGluZShpRiwgaW50dmFyW0YwXSkpID4gMCkgeworCQkJbmV4dHJlYyA9IEZBTFNFOworCQkJaW5jdmFyKGludHZhcltOUl0pOworCQkJaW5jdmFyKGludHZhcltGTlJdKTsKKwkJCWV2YWx1YXRlKG1haW5zZXEuZmlyc3QsICZ0dik7CisKKwkJCWlmIChuZXh0ZmlsZSkKKwkJCQlicmVhazsKKwkJfQorCisJCWlmIChpIDwgMCkKKwkJCXN5bnRheF9lcnJvcihzdHJlcnJvcihlcnJubykpOworCisJCWlGID0gbmV4dF9pbnB1dF9maWxlKCk7CisJfQorCisJYXdrX2V4aXQoRVhJVF9TVUNDRVNTKTsKKwkvKnJldHVybiAwOyovCit9CmRpZmYgLS1naXQgYS9lZGl0b3JzL2NtcC5jIGIvZWRpdG9ycy9jbXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGFmNmY0Ci0tLSAvZGV2L251bGwKKysrIGIvZWRpdG9ycy9jbXAuYwpAQCAtMCwwICsxLDE0MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBjbXAgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSBieSBNYXR0IEtyYWFpIDxrcmFhaUBhbHVtbmkuY2FybmVnaWVtZWxsb24uZWR1PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgKHZpcnR1YWxseSkgY29tcGxpYW50IC0tIHVzZXMgbmljZXIgR05VIGZvcm1hdCBmb3IgLWwuICovCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2NtcC5odG1sICovCisKKy8vY29uZmlnOmNvbmZpZyBDTVAKKy8vY29uZmlnOglib29sICJjbXAiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgY21wIGlzIHVzZWQgdG8gY29tcGFyZSB0d28gZmlsZXMgYW5kIHJldHVybnMgdGhlIHJlc3VsdAorLy9jb25maWc6CSAgdG8gc3RhbmRhcmQgb3V0cHV0LgorCisvL2tidWlsZDpsaWItJChDT05GSUdfQ01QKSArPSBjbXAubworCisvL2FwcGxldDpJRl9DTVAoQVBQTEVUKGNtcCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisKKy8vdXNhZ2U6I2RlZmluZSBjbXBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstbF0gWy1zXSBGSUxFMSBbRklMRTIiIElGX0RFU0tUT1AoIiBbU0tJUDEgW1NLSVAyXV0iKSAiXSIKKy8vdXNhZ2U6I2RlZmluZSBjbXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb21wYXJlIEZJTEUxIHdpdGggRklMRTIgKG9yIHN0ZGluKVxuIgorLy91c2FnZTogICAgICJcbgktbAlXcml0ZSB0aGUgYnl0ZSBudW1iZXJzIChkZWNpbWFsKSBhbmQgdmFsdWVzIChvY3RhbCkiCisvL3VzYWdlOiAgICAgIlxuCQlmb3IgYWxsIGRpZmZlcmluZyBieXRlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJUXVpZXQiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdGF0aWMgY29uc3QgY2hhciBmbXRfZW9mW10gQUxJR04xID0gImNtcDogRU9GIG9uICVzXG4iOworc3RhdGljIGNvbnN0IGNoYXIgZm10X2RpZmZlcltdIEFMSUdOMSA9ICIlcyAlcyBkaWZmZXI6IGNoYXIgJSJPRkZfRk1UInUsIGxpbmUgJXVcbiI7CisvLyBUaGlzIGZtdF9sX29wdCB1c2VzIGdudS1pc21zLiAgU1VTdjMgd291bGQgYmUgIiUuMHMlLjBzJSJPRkZfRk1UInUgJW8gJW9cbiIKK3N0YXRpYyBjb25zdCBjaGFyIGZtdF9sX29wdFtdIEFMSUdOMSA9ICIlLjBzJS4wcyUiT0ZGX0ZNVCJ1ICUzbyAlM29cbiI7CisKK3N0YXRpYyBjb25zdCBjaGFyIG9wdF9jaGFyc1tdIEFMSUdOMSA9ICJzbCI7CisjZGVmaW5lIENNUF9PUFRfcyAoMTw8MCkKKyNkZWZpbmUgQ01QX09QVF9sICgxPDwxKQorCitpbnQgY21wX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjbXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCUZJTEUgKmZwMSwgKmZwMiwgKm91dGZpbGUgPSBzdGRvdXQ7CisJY29uc3QgY2hhciAqZmlsZW5hbWUxLCAqZmlsZW5hbWUyID0gIi0iOworCW9mZl90IHNraXAxID0gMCwgc2tpcDIgPSAwLCBjaGFyX3BvcyA9IDA7CisJaW50IGxpbmVfcG9zID0gMTsgLyogSG9wZWZ1bGx5IHdvbid0IG92ZXJmbG93Li4uICovCisJY29uc3QgY2hhciAqZm10OworCWludCBjMSwgYzI7CisJdW5zaWduZWQgb3B0OworCWludCByZXR2YWwgPSAwOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiCisJCQlJRl9ERVNLVE9QKCI6PzQiKQorCQkJSUZfTk9UX0RFU0tUT1AoIjo/MiIpCisJCQkiOmwtLXM6cy0tbCI7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgb3B0X2NoYXJzKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWZpbGVuYW1lMSA9ICphcmd2OworCWlmICgqKythcmd2KSB7CisJCWZpbGVuYW1lMiA9ICphcmd2OworCQlpZiAoRU5BQkxFX0RFU0tUT1AgJiYgKisrYXJndikgeworCQkJc2tpcDEgPSBYQVRPT0ZGKCphcmd2KTsKKwkJCWlmICgqKythcmd2KSB7CisJCQkJc2tpcDIgPSBYQVRPT0ZGKCphcmd2KTsKKwkJCX0KKwkJfQorCX0KKworCXhmdW5jX2Vycm9yX3JldHZhbCA9IDI7ICAvKiBtaXNzaW5nIGZpbGUgcmVzdWx0cyBpbiBleGl0Y29kZSAyICovCisJaWYgKG9wdCAmIENNUF9PUFRfcykKKwkJbG9nbW9kZSA9IDA7ICAvKiAtcyBzdXBwcmVzc2VzIG9wZW4gZXJyb3IgbWVzc2FnZXMgKi8KKwlmcDEgPSB4Zm9wZW5fc3RkaW4oZmlsZW5hbWUxKTsKKwlmcDIgPSB4Zm9wZW5fc3RkaW4oZmlsZW5hbWUyKTsKKwlpZiAoZnAxID09IGZwMikgewkJLyogUGFyYW5vaWEgY2hlY2suLi4gc3RkaW4gPT0gc3RkaW4/ICovCisJCS8qIE5vdGUgdGhhdCB3ZSBkb24ndCBib3RoZXIgcmVhZGluZyBzdGRpbi4gIE5laXRoZXIgZG9lcyBnbnUgd2MuCisJCSAqIEJ1dCBwZXJoYXBzIHdlIHNob3VsZCwgc28gdGhhdCBvdGhlciBhcHBzIGRvd24gdGhlIGNoYWluIGRvbid0CisJCSAqIGdldCB0aGUgaW5wdXQuICBDb25zaWRlciAnZWNobyBoZWxsbyB8IChjbXAgLSAtICYmIGNhdCAtKScuCisJCSAqLworCQlyZXR1cm4gMDsKKwl9CisJbG9nbW9kZSA9IExPR01PREVfU1RESU87CisKKwlpZiAob3B0ICYgQ01QX09QVF9sKQorCQlmbXQgPSBmbXRfbF9vcHQ7CisJZWxzZQorCQlmbXQgPSBmbXRfZGlmZmVyOworCisJaWYgKEVOQUJMRV9ERVNLVE9QKSB7CisJCXdoaWxlIChza2lwMSkgeyBnZXRjKGZwMSk7IHNraXAxLS07IH0KKwkJd2hpbGUgKHNraXAyKSB7IGdldGMoZnAyKTsgc2tpcDItLTsgfQorCX0KKwlkbyB7CisJCWMxID0gZ2V0YyhmcDEpOworCQljMiA9IGdldGMoZnAyKTsKKwkJKytjaGFyX3BvczsKKwkJaWYgKGMxICE9IGMyKSB7CQkJLyogUmVtZW1iZXI6IGEgcmVhZCBlcnJvciBtYXkgaGF2ZSBvY2N1cnJlZC4gKi8KKwkJCXJldHZhbCA9IDE7CQkvKiBCdXQgYXNzdW1lIHRoZSBmaWxlcyBhcmUgZGlmZmVyZW50IGZvciBub3cuICovCisJCQlpZiAoYzIgPT0gRU9GKSB7CisJCQkJLyogV2Uga25vdyB0aGF0IGZwMSBpc24ndCBhdCBFT0Ygb3IgaW4gYW4gZXJyb3Igc3RhdGUuICBCdXQgdG8KKwkJCQkgKiBzYXZlIHNwYWNlIGJlbG93LCB0aGluZ3MgYXJlIHNldHVwIHRvIGV4cGVjdCBhbiBFT0YgaW4gZnAxCisJCQkJICogaWYgYW4gRU9GIG9jY3VycmVkLiAgU28sIHN3YXAgdGhpbmdzIGFyb3VuZC4KKwkJCQkgKi8KKwkJCQlmcDEgPSBmcDI7CisJCQkJZmlsZW5hbWUxID0gZmlsZW5hbWUyOworCQkJCWMxID0gYzI7CisJCQl9CisJCQlpZiAoYzEgPT0gRU9GKSB7CisJCQkJZGllX2lmX2ZlcnJvcihmcDEsIGZpbGVuYW1lMSk7CisJCQkJZm10ID0gZm10X2VvZjsJLyogV2VsbCwgbm8gZXJyb3IsIHNvIGl0IG11c3QgcmVhbGx5IGJlIEVPRi4gKi8KKwkJCQlvdXRmaWxlID0gc3RkZXJyOworCQkJCS8qIFRoZXJlIG1heSBoYXZlIGJlZW4gb3V0cHV0IHRvIHN0ZG91dCAob3B0aW9uIC1sKSwgc28KKwkJCQkgKiBtYWtlIHN1cmUgd2UgZmZsdXNoIGJlZm9yZSB3cml0aW5nIHRvIHN0ZGVyci4gKi8KKwkJCQlmZmx1c2hfYWxsKCk7CisJCQl9CisJCQlpZiAoIShvcHQgJiBDTVBfT1BUX3MpKSB7CisJCQkJaWYgKG9wdCAmIENNUF9PUFRfbCkgeworCQkJCQlsaW5lX3BvcyA9IGMxOwkvKiBsaW5lX3BvcyBpcyB1bnVzZWQgaW4gdGhlIC1sIGNhc2UuICovCisJCQkJfQorCQkJCWZwcmludGYob3V0ZmlsZSwgZm10LCBmaWxlbmFtZTEsIGZpbGVuYW1lMiwgY2hhcl9wb3MsIGxpbmVfcG9zLCBjMik7CisJCQkJaWYgKG9wdCkgewkvKiBUaGlzIG11c3QgYmUgLWwgc2luY2Ugbm90IC1zLiAqLworCQkJCQkvKiBJZiB3ZSBlbmNvdW50ZXJlZCBhbiBFT0YsCisJCQkJCSAqIHRoZSB3aGlsZSBjaGVjayB3aWxsIGNhdGNoIGl0LiAqLworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlpZiAoYzEgPT0gJ1xuJykgeworCQkJKytsaW5lX3BvczsKKwkJfQorCX0gd2hpbGUgKGMxICE9IEVPRik7CisKKwlkaWVfaWZfZmVycm9yKGZwMSwgZmlsZW5hbWUxKTsKKwlkaWVfaWZfZmVycm9yKGZwMiwgZmlsZW5hbWUyKTsKKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQocmV0dmFsKTsKK30KZGlmZiAtLWdpdCBhL2VkaXRvcnMvZGlmZi5jIGIvZWRpdG9ycy9kaWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5MmNmZAotLS0gL2Rldi9udWxsCisrKyBiL2VkaXRvcnMvZGlmZi5jCkBAIC0wLDAgKzEsMTA1MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBkaWZmIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94LCBhZGFwdGVkIGZyb20gT3BlbkJTRCBkaWZmLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBieSBNYXRoZXVzIEl6dmVrb3YgPG1penZla292QGdtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBieSBSb2JlcnQgU3VsbGl2YW4gPGNvZ2l0by5lcmdvLmNvZ2l0b0Bob3RtYWlsLmNvbT4KKyAqIENvcHlyaWdodCAoYykgMjAwMyBUb2RkIEMuIE1pbGxlciA8VG9kZC5NaWxsZXJAY291cnRlc2FuLmNvbT4KKyAqCisgKiBTcG9uc29yZWQgaW4gcGFydCBieSB0aGUgRGVmZW5zZSBBZHZhbmNlZCBSZXNlYXJjaCBQcm9qZWN0cworICogQWdlbmN5IChEQVJQQSkgYW5kIEFpciBGb3JjZSBSZXNlYXJjaCBMYWJvcmF0b3J5LCBBaXIgRm9yY2UKKyAqIE1hdGVyaWVsIENvbW1hbmQsIFVTQUYsIHVuZGVyIGFncmVlbWVudCBudW1iZXIgRjM5NTAyLTk5LTEtMDUxMi4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qCisgKiBUaGUgZm9sbG93aW5nIGNvZGUgdXNlcyBhbiBhbGdvcml0aG0gZHVlIHRvIEhhcm9sZCBTdG9uZSwKKyAqIHdoaWNoIGZpbmRzIGEgcGFpciBvZiBsb25nZXN0IGlkZW50aWNhbCBzdWJzZXF1ZW5jZXMgaW4KKyAqIHRoZSB0d28gZmlsZXMuCisgKgorICogVGhlIG1ham9yIGdvYWwgaXMgdG8gZ2VuZXJhdGUgdGhlIG1hdGNoIHZlY3RvciBKLgorICogSltpXSBpcyB0aGUgaW5kZXggb2YgdGhlIGxpbmUgaW4gZmlsZTEgY29ycmVzcG9uZGluZworICogdG8gbGluZSBpIGluIGZpbGUwLiBKW2ldID0gMCBpZiB0aGVyZSBpcyBubworICogc3VjaCBsaW5lIGluIGZpbGUxLgorICoKKyAqIExpbmVzIGFyZSBoYXNoZWQgc28gYXMgdG8gd29yayBpbiBjb3JlLiBBbGwgcG90ZW50aWFsCisgKiBtYXRjaGVzIGFyZSBsb2NhdGVkIGJ5IHNvcnRpbmcgdGhlIGxpbmVzIG9mIGVhY2ggZmlsZQorICogb24gdGhlIGhhc2ggKGNhbGxlZCAidmFsdWUiKS4gSW4gcGFydGljdWxhciwgdGhpcworICogY29sbGVjdHMgdGhlIGVxdWl2YWxlbmNlIGNsYXNzZXMgaW4gZmlsZTEgdG9nZXRoZXIuCisgKiBTdWJyb3V0aW5lIGVxdWl2IHJlcGxhY2VzIHRoZSB2YWx1ZSBvZiBlYWNoIGxpbmUgaW4KKyAqIGZpbGUwIGJ5IHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgZWxlbWVudCBvZiBpdHMKKyAqIG1hdGNoaW5nIGVxdWl2YWxlbmNlIGluICh0aGUgcmVvcmRlcmVkKSBmaWxlMS4KKyAqIFRvIHNhdmUgc3BhY2UgZXF1aXYgc3F1ZWV6ZXMgZmlsZTEgaW50byBhIHNpbmdsZQorICogYXJyYXkgbWVtYmVyIGluIHdoaWNoIHRoZSBlcXVpdmFsZW5jZSBjbGFzc2VzCisgKiBhcmUgc2ltcGx5IGNvbmNhdGVuYXRlZCwgZXhjZXB0IHRoYXQgdGhlaXIgZmlyc3QKKyAqIG1lbWJlcnMgYXJlIGZsYWdnZWQgYnkgY2hhbmdpbmcgc2lnbi4KKyAqCisgKiBOZXh0IHRoZSBpbmRpY2VzIHRoYXQgcG9pbnQgaW50byBtZW1iZXIgYXJlIHVuc29ydGVkIGludG8KKyAqIGFycmF5IGNsYXNzIGFjY29yZGluZyB0byB0aGUgb3JpZ2luYWwgb3JkZXIgb2YgZmlsZTAuCisgKgorICogVGhlIGNsZXZlcm5lc3MgbGllcyBpbiByb3V0aW5lIHN0b25lLiBUaGlzIG1hcmNoZXMKKyAqIHRocm91Z2ggdGhlIGxpbmVzIG9mIGZpbGUwLCBkZXZlbG9waW5nIGEgdmVjdG9yIGtsaXN0CisgKiBvZiAiay1jYW5kaWRhdGVzIi4gQXQgc3RlcCBpIGEgay1jYW5kaWRhdGUgaXMgYSBtYXRjaGVkCisgKiBwYWlyIG9mIGxpbmVzIHgseSAoeCBpbiBmaWxlMCwgeSBpbiBmaWxlMSkgc3VjaCB0aGF0CisgKiB0aGVyZSBpcyBhIGNvbW1vbiBzdWJzZXF1ZW5jZSBvZiBsZW5ndGggaworICogYmV0d2VlbiB0aGUgZmlyc3QgaSBsaW5lcyBvZiBmaWxlMCBhbmQgdGhlIGZpcnN0IHkKKyAqIGxpbmVzIG9mIGZpbGUxLCBidXQgdGhlcmUgaXMgbm8gc3VjaCBzdWJzZXF1ZW5jZSBmb3IKKyAqIGFueSBzbWFsbGVyIHkuIHggaXMgdGhlIGVhcmxpZXN0IHBvc3NpYmxlIG1hdGUgdG8geQorICogdGhhdCBvY2N1cnMgaW4gc3VjaCBhIHN1YnNlcXVlbmNlLgorICoKKyAqIFdoZW5ldmVyIGFueSBvZiB0aGUgbWVtYmVycyBvZiB0aGUgZXF1aXZhbGVuY2UgY2xhc3Mgb2YKKyAqIGxpbmVzIGluIGZpbGUxIG1hdGFibGUgdG8gYSBsaW5lIGluIGZpbGUwIGhhcyBzZXJpYWwgbnVtYmVyCisgKiBsZXNzIHRoYW4gdGhlIHkgb2Ygc29tZSBrLWNhbmRpZGF0ZSwgdGhhdCBrLWNhbmRpZGF0ZQorICogd2l0aCB0aGUgc21hbGxlc3Qgc3VjaCB5IGlzIHJlcGxhY2VkLiBUaGUgbmV3CisgKiBrLWNhbmRpZGF0ZSBpcyBjaGFpbmVkICh2aWEgcHJlZCkgdG8gdGhlIGN1cnJlbnQKKyAqIGstMSBjYW5kaWRhdGUgc28gdGhhdCB0aGUgYWN0dWFsIHN1YnNlcXVlbmNlIGNhbgorICogYmUgcmVjb3ZlcmVkLiBXaGVuIGEgbWVtYmVyIGhhcyBzZXJpYWwgbnVtYmVyIGdyZWF0ZXIKKyAqIHRoYXQgdGhlIHkgb2YgYWxsIGstY2FuZGlkYXRlcywgdGhlIGtsaXN0IGlzIGV4dGVuZGVkLgorICogQXQgdGhlIGVuZCwgdGhlIGxvbmdlc3Qgc3Vic2VxdWVuY2UgaXMgcHVsbGVkIG91dAorICogYW5kIHBsYWNlZCBpbiB0aGUgYXJyYXkgSiBieSB1bnJhdmVsCisgKgorICogV2l0aCBKIGluIGhhbmQsIHRoZSBtYXRjaGVzIHRoZXJlIHJlY29yZGVkIGFyZQorICogY2hlY2tlZCBhZ2FpbnN0IHJlYWxpdHkgdG8gYXNzdXJlIHRoYXQgbm8gc3B1cmlvdXMKKyAqIG1hdGNoZXMgaGF2ZSBjcmVwdCBpbiBkdWUgdG8gaGFzaGluZy4gSWYgdGhleSBoYXZlLAorICogdGhleSBhcmUgYnJva2VuLCBhbmQgImphY2twb3QiIGlzIHJlY29yZGVkLS1hIGhhcm1sZXNzCisgKiBtYXR0ZXIgZXhjZXB0IHRoYXQgYSB0cnVlIG1hdGNoIGZvciBhIHNwdXJpb3VzbHkKKyAqIG1hdGVkIGxpbmUgbWF5IG5vdyBiZSB1bm5lY2Vzc2FyaWx5IHJlcG9ydGVkIGFzIGEgY2hhbmdlLgorICoKKyAqIE11Y2ggb2YgdGhlIGNvbXBsZXhpdHkgb2YgdGhlIHByb2dyYW0gY29tZXMgc2ltcGx5CisgKiBmcm9tIHRyeWluZyB0byBtaW5pbWl6ZSBjb3JlIHV0aWxpemF0aW9uIGFuZAorICogbWF4aW1pemUgdGhlIHJhbmdlIG9mIGRvYWJsZSBwcm9ibGVtcyBieSBkeW5hbWljYWxseQorICogYWxsb2NhdGluZyB3aGF0IGlzIG5lZWRlZCBhbmQgcmV1c2luZyB3aGF0IGlzIG5vdC4KKyAqIFRoZSBjb3JlIHJlcXVpcmVtZW50cyBmb3IgcHJvYmxlbXMgbGFyZ2VyIHRoYW4gc29tZXdoYXQKKyAqIGFyZSAoaW4gd29yZHMpIDIqbGVuZ3RoKGZpbGUwKSArIGxlbmd0aChmaWxlMSkgKworICogMyoobnVtYmVyIG9mIGstY2FuZGlkYXRlcyBpbnN0YWxsZWQpLCB0eXBpY2FsbHkgYWJvdXQKKyAqIDZuIHdvcmRzIGZvciBmaWxlcyBvZiBsZW5ndGggbi4KKyAqLworCisvL2NvbmZpZzpjb25maWcgRElGRgorLy9jb25maWc6CWJvb2wgImRpZmYiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgZGlmZiBjb21wYXJlcyB0d28gZmlsZXMgb3IgZGlyZWN0b3JpZXMgYW5kIG91dHB1dHMgdGhlCisvL2NvbmZpZzoJICBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZW0gaW4gYSBmb3JtIHRoYXQgY2FuIGJlIGdpdmVuIHRvCisvL2NvbmZpZzoJICB0aGUgcGF0Y2ggY29tbWFuZC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfRElGRl9MT05HX09QVElPTlMKKy8vY29uZmlnOglib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRElGRiAmJiBMT05HX09QVFMKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgdXNlIG9mIGxvbmcgb3B0aW9ucy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfRElGRl9ESVIKKy8vY29uZmlnOglib29sICJFbmFibGUgZGlyZWN0b3J5IHN1cHBvcnQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBESUZGCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVGhpcyBvcHRpb24gZW5hYmxlcyBzdXBwb3J0IGZvciBkaXJlY3RvcnkgYW5kIHN1YmRpcmVjdG9yeQorLy9jb25maWc6CSAgY29tcGFyaXNvbi4KKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0RJRkYpICs9IGRpZmYubworCisvL2FwcGxldDpJRl9ESUZGKEFQUExFVChkaWZmLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy91c2FnZTojZGVmaW5lIGRpZmZfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYWJCZGlOcXJUc3R3XSBbLUwgTEFCRUxdIFstUyBGSUxFXSBbLVUgTElORVNdIEZJTEUxIEZJTEUyIgorLy91c2FnZTojZGVmaW5lIGRpZmZfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb21wYXJlIGZpbGVzIGxpbmUgYnkgbGluZSBhbmQgb3V0cHV0IHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZW0uXG4iCisvL3VzYWdlOiAgICAgICAiVGhpcyBpbXBsZW1lbnRhdGlvbiBzdXBwb3J0cyB1bmlmaWVkIGRpZmZzIG9ubHkuXG4iCisvL3VzYWdlOiAgICAgIlxuCS1hCVRyZWF0IGFsbCBmaWxlcyBhcyB0ZXh0IgorLy91c2FnZTogICAgICJcbgktYglJZ25vcmUgY2hhbmdlcyBpbiB0aGUgYW1vdW50IG9mIHdoaXRlc3BhY2UiCisvL3VzYWdlOiAgICAgIlxuCS1CCUlnbm9yZSBjaGFuZ2VzIHdob3NlIGxpbmVzIGFyZSBhbGwgYmxhbmsiCisvL3VzYWdlOiAgICAgIlxuCS1kCVRyeSBoYXJkIHRvIGZpbmQgYSBzbWFsbGVyIHNldCBvZiBjaGFuZ2VzIgorLy91c2FnZTogICAgICJcbgktaQlJZ25vcmUgY2FzZSBkaWZmZXJlbmNlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUwJVXNlIExBQkVMIGluc3RlYWQgb2YgdGhlIGZpbGVuYW1lIGluIHRoZSB1bmlmaWVkIGhlYWRlciIKKy8vdXNhZ2U6ICAgICAiXG4JLU4JVHJlYXQgYWJzZW50IGZpbGVzIGFzIGVtcHR5IgorLy91c2FnZTogICAgICJcbgktcQlPdXRwdXQgb25seSB3aGV0aGVyIGZpbGVzIGRpZmZlciIKKy8vdXNhZ2U6ICAgICAiXG4JLXIJUmVjdXJzZSIKKy8vdXNhZ2U6ICAgICAiXG4JLVMJU3RhcnQgd2l0aCBGSUxFIHdoZW4gY29tcGFyaW5nIGRpcmVjdG9yaWVzIgorLy91c2FnZTogICAgICJcbgktVAlNYWtlIHRhYnMgbGluZSB1cCBieSBwcmVmaXhpbmcgYSB0YWIgd2hlbiBuZWNlc3NhcnkiCisvL3VzYWdlOiAgICAgIlxuCS1zCVJlcG9ydCB3aGVuIHR3byBmaWxlcyBhcmUgdGhlIHNhbWUiCisvL3VzYWdlOiAgICAgIlxuCS10CUV4cGFuZCB0YWJzIHRvIHNwYWNlcyBpbiBvdXRwdXQiCisvL3VzYWdlOiAgICAgIlxuCS1VCU91dHB1dCBMSU5FUyBsaW5lcyBvZiBjb250ZXh0IgorLy91c2FnZTogICAgICJcbgktdwlJZ25vcmUgYWxsIHdoaXRlc3BhY2UiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWYgMAorIyBkZWZpbmUgZGJnX2Vycm9yX21zZyguLi4pIGJiX2Vycm9yX21zZyhfX1ZBX0FSR1NfXykKKyNlbHNlCisjIGRlZmluZSBkYmdfZXJyb3JfbXNnKC4uLikgKCh2b2lkKTApCisjZW5kaWYKKworZW51bSB7ICAgICAgICAgICAgICAgICAgLyogcHJpbnRfc3RhdHVzKCkgYW5kIGRpZmZyZWcoKSByZXR1cm4gdmFsdWVzICovCisJU1RBVFVTX1NBTUUsICAgIC8qIGZpbGVzIGFyZSB0aGUgc2FtZSAqLworCVNUQVRVU19ESUZGRVIsICAvKiBmaWxlcyBkaWZmZXIgKi8KKwlTVEFUVVNfQklOQVJZLCAgLyogYmluYXJ5IGZpbGVzIGRpZmZlciAqLworfTsKKworZW51bSB7ICAgICAgICAgICAgICAgICAgLyogQ29tbWFuZGxpbmUgZmxhZ3MgKi8KKwlGTEFHX2EsCisJRkxBR19iLAorCUZMQUdfZCwKKwlGTEFHX2ksCisJRkxBR19MLCAgICAgICAgIC8qIG5ldmVyIHVzZWQsIGhhbmRsZWQgYnkgZ2V0b3B0MzIgKi8KKwlGTEFHX04sCisJRkxBR19xLAorCUZMQUdfciwKKwlGTEFHX3MsCisJRkxBR19TLCAgICAgICAgIC8qIG5ldmVyIHVzZWQsIGhhbmRsZWQgYnkgZ2V0b3B0MzIgKi8KKwlGTEFHX3QsCisJRkxBR19ULAorCUZMQUdfVSwgICAgICAgICAvKiBuZXZlciB1c2VkLCBoYW5kbGVkIGJ5IGdldG9wdDMyICovCisJRkxBR193LAorCUZMQUdfdSwgICAgICAgICAvKiBpZ25vcmVkLCB0aGlzIGlzIHRoZSBkZWZhdWx0ICovCisJRkxBR19wLCAgICAgICAgIC8qIG5vdCBpbXBsZW1lbnRlZCAqLworCUZMQUdfQiwKKwlGTEFHX0UsICAgICAgICAgLyogbm90IGltcGxlbWVudGVkICovCit9OworI2RlZmluZSBGTEFHKHgpICgxIDw8IEZMQUdfIyN4KQorCisvKiBXZSBjYWNoZSBmaWxlIHBvc2l0aW9uIHRvIGF2b2lkIGV4Y2Vzc2l2ZSBzZWVraW5nICovCit0eXBlZGVmIHN0cnVjdCBGSUxFX2FuZF9wb3NfdCB7CisJRklMRSAqZnRfZnA7CisJb2ZmX3QgZnRfcG9zOworfSBGSUxFX2FuZF9wb3NfdDsKKworc3RydWN0IGdsb2JhbHMgeworCXNtYWxsaW50IGV4aXRfc3RhdHVzOworCWludCBvcHRfVV9jb250ZXh0OworCWNvbnN0IGNoYXIgKm90aGVyX2RpcjsKKwljaGFyICpsYWJlbFsyXTsKKwlzdHJ1Y3Qgc3RhdCBzdGJbMl07Cit9OworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIGV4aXRfc3RhdHVzICAgICAgICAoRy5leGl0X3N0YXR1cyAgICAgICApCisjZGVmaW5lIG9wdF9VX2NvbnRleHQgICAgICAoRy5vcHRfVV9jb250ZXh0ICAgICApCisjZGVmaW5lIGxhYmVsICAgICAgICAgICAgICAoRy5sYWJlbCAgICAgICAgICAgICApCisjZGVmaW5lIHN0YiAgICAgICAgICAgICAgICAoRy5zdGIgICAgICAgICAgICAgICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCisJb3B0X1VfY29udGV4dCA9IDM7IFwKK30gd2hpbGUgKDApCisKK3R5cGVkZWYgaW50IHRva2VuX3Q7CisKK2VudW0geworCS8qIFB1YmxpYyAqLworCVRPS19FTVBUWSA9IDEgPDwgOSwgIC8qIExpbmUgZnVsbHkgcHJvY2Vzc2VkLCB5b3UgY2FuIHByb2NlZWQgdG8gdGhlIG5leHQgKi8KKwlUT0tfRU9GICAgPSAxIDw8IDEwLCAvKiBGaWxlIGVuZGVkICovCisJLyogUHJpdmF0ZSAoT25seSB0byBiZSB1c2VkIGJ5IHJlYWRfdG9rZW4oKSAqLworCVRPS19FT0wgICA9IDEgPDwgMTEsIC8qIHdlIHNhdyBFT0wgKHN0aWNreSkgKi8KKwlUT0tfU1BBQ0UgPSAxIDw8IDEyLCAvKiB1c2VkIC1iIGNvZGUsIG1lYW5zIHdlIGFyZSBza2lwcGluZyBzcGFjZXMgKi8KKwlTSElGVF9FT0YgPSAoc2l6ZW9mKHRva2VuX3QpKjggLSA4KSAtIDEsCisJQ0hBUl9NQVNLID0gMHgxZmYsICAgLyogOHRoIGJpdCBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIEVPRiBmcm9tIDB4ZmYgKi8KK307CisKKy8qIFJlc3RvcmVzIGZ1bGwgRU9GIGZyb20gb25lIDh0aCBiaXQ6ICovCisvLyNkZWZpbmUgVE9LMkNIQVIodCkgKCgodCkgPDwgU0hJRlRfRU9GKSA+PiBTSElGVF9FT0YpCisvKiBXZSBkb24ndCByZWFsbHkgbmVlZCB0aGUgYWJvdmUsIHdlIG9ubHkgbmVlZCB0byBoYXZlIEVPRiAhPSBhbnlfcmVhbF9jaGFyOiAqLworI2RlZmluZSBUT0syQ0hBUih0KSAoKHQpICYgQ0hBUl9NQVNLKQorCitzdGF0aWMgdm9pZCBzZWVrX2Z0KEZJTEVfYW5kX3Bvc190ICpmdCwgb2ZmX3QgcG9zKQoreworCWlmIChmdC0+ZnRfcG9zICE9IHBvcykgeworCQlmdC0+ZnRfcG9zID0gcG9zOworCQlmc2Vla28oZnQtPmZ0X2ZwLCBwb3MsIFNFRUtfU0VUKTsKKwl9Cit9CisKKy8qIFJlYWRzIHRva2VucyBmcm9tIGdpdmVuIGZwLCBoYW5kbGluZyAtYiBhbmQgLXcgZmxhZ3MKKyAqIFRoZSB1c2VyIG11c3QgcmVzZXQgdG9rIGV2ZXJ5IGxpbmUgc3RhcnQKKyAqLworc3RhdGljIGludCByZWFkX3Rva2VuKEZJTEVfYW5kX3Bvc190ICpmdCwgdG9rZW5fdCB0b2spCit7CisJdG9rIHw9IFRPS19FTVBUWTsKKwl3aGlsZSAoISh0b2sgJiBUT0tfRU9MKSkgeworCQlib29sIGlzX3NwYWNlOworCQlpbnQgdDsKKworCQl0ID0gZmdldGMoZnQtPmZ0X2ZwKTsKKwkJaWYgKHQgIT0gRU9GKQorCQkJZnQtPmZ0X3BvcysrOworCQlpc19zcGFjZSA9ICh0ID09IEVPRiB8fCBpc3NwYWNlKHQpKTsKKworCQkvKiBJZiB0ID09IEVPRiAoLTEpLCBzZXQgYm90aCBUT0tfRU9GIGFuZCBUT0tfRU9MICovCisJCXRvayB8PSAodCAmIChUT0tfRU9GICsgVE9LX0VPTCkpOworCQkvKiBPbmx5IEVPTD8gKi8KKwkJaWYgKHQgPT0gJ1xuJykKKwkJCXRvayB8PSBUT0tfRU9MOworCisJCWlmIChvcHRpb25fbWFzazMyICYgRkxBRyhpKSkgLyogSGFuZGNvZGVkIHRvbG93ZXIoKSAqLworCQkJdCA9ICh0ID49ICdBJyAmJiB0IDw9ICdaJykgPyB0IC0gKCdBJyAtICdhJykgOiB0OworCisJCWlmICgob3B0aW9uX21hc2szMiAmIEZMQUcodykpICYmIGlzX3NwYWNlKQorCQkJY29udGludWU7CisKKwkJLyogVHJpbSBjaGFyIHZhbHVlIHRvIGxvdyA5IGJpdHMgKi8KKwkJdCAmPSBDSEFSX01BU0s7CisKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHKGIpKSB7CisJCQkvKiBXYXMgcHJldiBjaGFyIHdoaXRlc3BhY2U/ICovCisJCQlpZiAodG9rICYgVE9LX1NQQUNFKSB7IC8qIHllcyAqLworCQkJCWlmIChpc19zcGFjZSkgLyogdGhpcyBvbmUgdG9vLCBpZ25vcmUgaXQgKi8KKwkJCQkJY29udGludWU7CisJCQkJdG9rICY9IH5UT0tfU1BBQ0U7CisJCQl9IGVsc2UgaWYgKGlzX3NwYWNlKSB7CisJCQkJLyogMXN0IHdoaXRlc3BhY2UgY2hhci4KKwkJCQkgKiBTZXQgVE9LX1NQQUNFIGFuZCByZXBsYWNlIGNoYXIgYnkgJyAnICovCisJCQkJdCA9IFRPS19TUEFDRSArICcgJzsKKwkJCX0KKwkJfQorCQkvKiBDbGVhciBFTVBUWSAqLworCQl0b2sgJj0gfihUT0tfRU1QVFkgKyBDSEFSX01BU0spOworCQkvKiBBc3NpZ24gY2hhciB2YWx1ZSAobG93IDkgYml0cykgYW5kIG1heWJlIHNldCBUT0tfU1BBQ0UgKi8KKwkJdG9rIHw9IHQ7CisJCWJyZWFrOworCX0KKyNpZiAwCisJYmJfZXJyb3JfbXNnKCJmcDolcCB0b2s6JXggJyVjJyVzJXMlcyVzIiwgZnAsIHRvaywgdG9rICYgMHhmZgorCQksIHRvayAmIFRPS19FT0YgPyAiIEVPRiIgOiAiIgorCQksIHRvayAmIFRPS19FT0wgPyAiIEVPTCIgOiAiIgorCQksIHRvayAmIFRPS19FTVBUWSA/ICIgRU1QVFkiIDogIiIKKwkJLCB0b2sgJiBUT0tfU1BBQ0UgPyAiIFNQQUNFIiA6ICIiCisJKTsKKyNlbmRpZgorCXJldHVybiB0b2s7Cit9CisKK3N0cnVjdCBjYW5kIHsKKwlpbnQgeDsKKwlpbnQgeTsKKwlpbnQgcHJlZDsKK307CisKK3N0YXRpYyBpbnQgc2VhcmNoKGNvbnN0IGludCAqYywgaW50IGssIGludCB5LCBjb25zdCBzdHJ1Y3QgY2FuZCAqbGlzdCkKK3sKKwlpbnQgaSwgajsKKworCWlmIChsaXN0W2Nba11dLnkgPCB5KSAgLyogcXVpY2sgbG9vayBmb3IgdHlwaWNhbCBjYXNlICovCisJCXJldHVybiBrICsgMTsKKworCWZvciAoaSA9IDAsIGogPSBrICsgMTs7KSB7CisJCWNvbnN0IGludCBsID0gKGkgKyBqKSA+PiAxOworCQlpZiAobCA+IGkpIHsKKwkJCWNvbnN0IGludCB0ID0gbGlzdFtjW2xdXS55OworCQkJaWYgKHQgPiB5KQorCQkJCWogPSBsOworCQkJZWxzZSBpZiAodCA8IHkpCisJCQkJaSA9IGw7CisJCQllbHNlCisJCQkJcmV0dXJuIGw7CisJCX0gZWxzZQorCQkJcmV0dXJuIGwgKyAxOworCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGlzcXJ0KHVuc2lnbmVkIG4pCit7CisJdW5zaWduZWQgeCA9IDE7CisJd2hpbGUgKDEpIHsKKwkJY29uc3QgdW5zaWduZWQgeSA9IHg7CisJCXggPSAoKG4gLyB4KSArIHgpID4+IDE7CisJCWlmICh4IDw9ICh5ICsgMSkgJiYgeCA+PSAoeSAtIDEpKQorCQkJcmV0dXJuIHg7CisJfQorfQorCitzdGF0aWMgdm9pZCBzdG9uZShjb25zdCBpbnQgKmEsIGludCBuLCBjb25zdCBpbnQgKmIsIGludCAqSiwgaW50IHByZWYpCit7CisJY29uc3QgdW5zaWduZWQgaXNxID0gaXNxcnQobik7CisJY29uc3QgdW5zaWduZWQgYm91bmQgPQorCQkob3B0aW9uX21hc2szMiAmIEZMQUcoZCkpID8gVUlOVF9NQVggOiBNQVgoMjU2LCBpc3EpOworCWludCBjbGVuID0gMTsKKwlpbnQgY2xpc3RsZW4gPSAxMDA7CisJaW50IGsgPSAwOworCXN0cnVjdCBjYW5kICpjbGlzdCA9IHh6YWxsb2MoY2xpc3RsZW4gKiBzaXplb2YoY2xpc3RbMF0pKTsKKwlzdHJ1Y3QgY2FuZCBjYW5kOworCXN0cnVjdCBjYW5kICpxOworCWludCAqa2xpc3QgPSB4emFsbG9jKChuICsgMikgKiBzaXplb2Yoa2xpc3RbMF0pKTsKKwkvKmNsaXN0WzBdID0gKHN0cnVjdCBjYW5kKXswfTsgLSB4emFsbG9jIGRpZCBpdCAqLworCS8qa2xpc3RbMF0gPSAwOyAqLworCisJZm9yIChjYW5kLnggPSAxOyBjYW5kLnggPD0gbjsgY2FuZC54KyspIHsKKwkJaW50IGogPSBhW2NhbmQueF0sIG9sZGwgPSAwOworCQl1bnNpZ25lZCBudW10cmllcyA9IDA7CisJCWlmIChqID09IDApCisJCQljb250aW51ZTsKKwkJY2FuZC55ID0gLWJbal07CisJCWNhbmQucHJlZCA9IGtsaXN0WzBdOworCQlkbyB7CisJCQlpbnQgbCwgdGM7CisJCQlpZiAoY2FuZC55IDw9IGNsaXN0W2NhbmQucHJlZF0ueSkKKwkJCQljb250aW51ZTsKKwkJCWwgPSBzZWFyY2goa2xpc3QsIGssIGNhbmQueSwgY2xpc3QpOworCQkJaWYgKGwgIT0gb2xkbCArIDEpCisJCQkJY2FuZC5wcmVkID0ga2xpc3RbbCAtIDFdOworCQkJaWYgKGwgPD0gayAmJiBjbGlzdFtrbGlzdFtsXV0ueSA8PSBjYW5kLnkpCisJCQkJY29udGludWU7CisJCQlpZiAoY2xlbiA9PSBjbGlzdGxlbikgeworCQkJCWNsaXN0bGVuID0gY2xpc3RsZW4gKiAxMSAvIDEwOworCQkJCWNsaXN0ID0geHJlYWxsb2MoY2xpc3QsIGNsaXN0bGVuICogc2l6ZW9mKGNsaXN0WzBdKSk7CisJCQl9CisJCQljbGlzdFtjbGVuXSA9IGNhbmQ7CisJCQl0YyA9IGtsaXN0W2xdOworCQkJa2xpc3RbbF0gPSBjbGVuKys7CisJCQlpZiAobCA8PSBrKSB7CisJCQkJY2FuZC5wcmVkID0gdGM7CisJCQkJb2xkbCA9IGw7CisJCQkJbnVtdHJpZXMrKzsKKwkJCX0gZWxzZSB7CisJCQkJaysrOworCQkJCWJyZWFrOworCQkJfQorCQl9IHdoaWxlICgoY2FuZC55ID0gYlsrK2pdKSA+IDAgJiYgbnVtdHJpZXMgPCBib3VuZCk7CisJfQorCS8qIFVucmF2ZWwgKi8KKwlmb3IgKHEgPSBjbGlzdCArIGtsaXN0W2tdOyBxLT55OyBxID0gY2xpc3QgKyBxLT5wcmVkKQorCQlKW3EtPnggKyBwcmVmXSA9IHEtPnkgKyBwcmVmOworCWZyZWUoa2xpc3QpOworCWZyZWUoY2xpc3QpOworfQorCitzdHJ1Y3QgbGluZSB7CisJLyogJ3NlcmlhbCcgaXMgbm90IHVzZWQgaW4gdGhlIGJlZ2lubmluZywgc28gd2UgcmV1c2UgaXQKKwkgKiB0byBzdG9yZSBsaW5lIG9mZnNldHMsIHRodXMgcmVkdWNpbmcgbWVtb3J5IHByZXNzdXJlCisJICovCisJdW5pb24geworCQl1bnNpZ25lZCBzZXJpYWw7CisJCW9mZl90IG9mZnNldDsKKwl9OworCXVuc2lnbmVkIHZhbHVlOworfTsKKworc3RhdGljIHZvaWQgZXF1aXYoc3RydWN0IGxpbmUgKmEsIGludCBuLCBzdHJ1Y3QgbGluZSAqYiwgaW50IG0sIGludCAqYykKK3sKKwlpbnQgaSA9IDEsIGogPSAxOworCisJd2hpbGUgKGkgPD0gbiAmJiBqIDw9IG0pIHsKKwkJaWYgKGFbaV0udmFsdWUgPCBiW2pdLnZhbHVlKQorCQkJYVtpKytdLnZhbHVlID0gMDsKKwkJZWxzZSBpZiAoYVtpXS52YWx1ZSA9PSBiW2pdLnZhbHVlKQorCQkJYVtpKytdLnZhbHVlID0gajsKKwkJZWxzZQorCQkJaisrOworCX0KKwl3aGlsZSAoaSA8PSBuKQorCQlhW2krK10udmFsdWUgPSAwOworCWJbbSArIDFdLnZhbHVlID0gMDsKKwlqID0gMDsKKwl3aGlsZSAoKytqIDw9IG0pIHsKKwkJY1tqXSA9IC1iW2pdLnNlcmlhbDsKKwkJd2hpbGUgKGJbaiArIDFdLnZhbHVlID09IGJbal0udmFsdWUpIHsKKwkJCWorKzsKKwkJCWNbal0gPSBiW2pdLnNlcmlhbDsKKwkJfQorCX0KKwljW2pdID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkIHVuc29ydChjb25zdCBzdHJ1Y3QgbGluZSAqZiwgaW50IGwsIGludCAqYikKK3sKKwlpbnQgaTsKKwlpbnQgKmEgPSB4bWFsbG9jKChsICsgMSkgKiBzaXplb2YoYVswXSkpOworCWZvciAoaSA9IDE7IGkgPD0gbDsgaSsrKQorCQlhW2ZbaV0uc2VyaWFsXSA9IGZbaV0udmFsdWU7CisJZm9yIChpID0gMTsgaSA8PSBsOyBpKyspCisJCWJbaV0gPSBhW2ldOworCWZyZWUoYSk7Cit9CisKK3N0YXRpYyBpbnQgbGluZV9jb21wYXIoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyNkZWZpbmUgbDAgKChjb25zdCBzdHJ1Y3QgbGluZSopYSkKKyNkZWZpbmUgbDEgKChjb25zdCBzdHJ1Y3QgbGluZSopYikKKwlpbnQgciA9IGwwLT52YWx1ZSAtIGwxLT52YWx1ZTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJcmV0dXJuIGwwLT5zZXJpYWwgLSBsMS0+c2VyaWFsOworI3VuZGVmIGwwCisjdW5kZWYgbDEKK30KKworc3RhdGljIHZvaWQgZmV0Y2goRklMRV9hbmRfcG9zX3QgKmZ0LCBjb25zdCBvZmZfdCAqaXgsIGludCBhLCBpbnQgYiwgaW50IGNoKQoreworCWludCBpLCBqLCBjb2w7CisJZm9yIChpID0gYTsgaSA8PSBiOyBpKyspIHsKKwkJc2Vla19mdChmdCwgaXhbaSAtIDFdKTsKKwkJcHV0Y2hhcihjaCk7CisJCWlmIChvcHRpb25fbWFzazMyICYgRkxBRyhUKSkKKwkJCXB1dGNoYXIoJ1x0Jyk7CisJCWZvciAoaiA9IDAsIGNvbCA9IDA7IGogPCBpeFtpXSAtIGl4W2kgLSAxXTsgaisrKSB7CisJCQlpbnQgYyA9IGZnZXRjKGZ0LT5mdF9mcCk7CisJCQlpZiAoYyA9PSBFT0YpIHsKKwkJCQlwdXRzKCJcblxcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUiKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlmdC0+ZnRfcG9zKys7CisJCQlpZiAoYyA9PSAnXHQnICYmIChvcHRpb25fbWFzazMyICYgRkxBRyh0KSkpCisJCQkJZG8gcHV0Y2hhcignICcpOyB3aGlsZSAoKytjb2wgJiA3KTsKKwkJCWVsc2UgeworCQkJCXB1dGNoYXIoYyk7CisJCQkJY29sKys7CisJCQl9CisJCX0KKwl9Cit9CisKKy8qIENyZWF0ZXMgdGhlIG1hdGNoIHZlY3RvciBKLCB3aGVyZSBKW2ldIGlzIHRoZSBpbmRleAorICogb2YgdGhlIGxpbmUgaW4gdGhlIG5ldyBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxpbmUgaQorICogaW4gdGhlIG9sZCBmaWxlLiBMaW5lcyBzdGFydCBhdCAxIGluc3RlYWQgb2YgMCwgdGhhdCB2YWx1ZQorICogYmVpbmcgdXNlZCBpbnN0ZWFkIHRvIGRlbm90ZSBubyBjb3JyZXNwb25kaW5nIGxpbmUuCisgKiBUaGlzIHZlY3RvciBpcyBkeW5hbWljYWxseSBhbGxvY2F0ZWQgYW5kIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KKyAqCisgKiAqIGZwIGlzIGFuIGlucHV0IHBhcmFtZXRlciwgd2hlcmUgZnBbMF0gYW5kIGZwWzFdIGFyZSB0aGUgb3BlbgorICogICBvbGQgZmlsZSBhbmQgbmV3IGZpbGUgcmVzcGVjdGl2ZWx5LgorICogKiBubGVuIGlzIGFuIG91dHB1dCB2YXJpYWJsZSwgd2hlcmUgbmxlblswXSBhbmQgbmxlblsxXQorICogICBnZXRzIHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIG9sZCBhbmQgbmV3IGZpbGUgcmVzcGVjdGl2ZWx5LgorICogKiBpeCBpcyBhbiBvdXRwdXQgdmFyaWFibGUsIHdoZXJlIGl4WzBdIGFuZCBpeFsxXSBnZXRzCisgKiAgIGFzc2lnbmVkIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCB2ZWN0b3JzIG9mIHRoZSBvZmZzZXRzIG9mIHRoZSBsaW5lcworICogICBvZiB0aGUgb2xkIGFuZCBuZXcgZmlsZSByZXNwZWN0aXZlbHkuIFRoZXNlIG11c3QgYmUgZnJlZWQgYnkgdGhlIGNhbGxlci4KKyAqLworc3RhdGljIE5PSU5MSU5FIGludCAqY3JlYXRlX0ooRklMRV9hbmRfcG9zX3QgZnRbMl0sIGludCBubGVuWzJdLCBvZmZfdCAqaXhbMl0pCit7CisJaW50ICpKLCBzbGVuWzJdLCAqY2xhc3MsICptZW1iZXI7CisJc3RydWN0IGxpbmUgKm5maWxlWzJdLCAqc2ZpbGVbMl07CisJaW50IHByZWYgPSAwLCBzdWZmID0gMCwgaSwgaiwgZGVsdGE7CisKKwkvKiBMaW5lcyBvZiBib3RoIGZpbGVzIGFyZSBoYXNoZWQsIGFuZCBpbiB0aGUgcHJvY2VzcworCSAqIHRoZWlyIG9mZnNldHMgYXJlIHN0b3JlZCBpbiB0aGUgYXJyYXkgaXhbZmlsZW5vXQorCSAqIHdoZXJlIGZpbGVubyA9PSAwIHBvaW50cyB0byB0aGUgb2xkIGZpbGUsIGFuZAorCSAqIGZpbGVubyA9PSAxIHBvaW50cyB0byB0aGUgbmV3IG9uZS4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCXVuc2lnbmVkIGhhc2g7CisJCXRva2VuX3QgdG9rOworCQlzaXplX3Qgc3ogPSAxMDA7CisJCW5maWxlW2ldID0geG1hbGxvYygoc3ogKyAzKSAqIHNpemVvZihuZmlsZVtpXVswXSkpOworCQkvKiBmdCBnZXRzIGhlcmUgd2l0aG91dCB0aGUgY29ycmVjdCBwb3NpdGlvbiwgY2FudCB1c2Ugc2Vla19mdCAqLworCQlmdFtpXS5mdF9wb3MgPSAwOworCQlmc2Vla28oZnRbaV0uZnRfZnAsIDAsIFNFRUtfU0VUKTsKKworCQlubGVuW2ldID0gMDsKKwkJLyogV2UgY291bGQgemFsbG9jIG5maWxlLCBidXQgdGhlbiB6YWxsb2Mgc3RhcnRzIHNob3dpbmcgaW4gZ3Byb2YgYXQgfjElICovCisJCW5maWxlW2ldWzBdLm9mZnNldCA9IDA7CisJCWdvdG8gc3RhcnQ7IC8qIHNhdmVzIGNvZGUgKi8KKwkJd2hpbGUgKDEpIHsKKwkJCXRvayA9IHJlYWRfdG9rZW4oJmZ0W2ldLCB0b2spOworCQkJaWYgKCEodG9rICYgVE9LX0VNUFRZKSkgeworCQkJCS8qIEhhc2ggYWxnb3JpdGhtIHRha2VuIGZyb20gUm9iZXJ0IFNlZGdld2ljaywgQWxnb3JpdGhtcyBpbiBDLCAzZCBlZC4sIHAgNTc4LiAqLworCQkJCS8qaGFzaCA9IGhhc2ggKiAxMjggLSBoYXNoICsgVE9LMkNIQVIodG9rKTsKKwkJCQkgKiBnY2MgaW5zaXN0cyBvbiBvcHRpbWl6aW5nIGFib3ZlIHRvICJoYXNoICogMTI3ICsgLi4uIiwgdGh1cy4uLiAqLworCQkJCXVuc2lnbmVkIG8gPSBoYXNoIC0gVE9LMkNIQVIodG9rKTsKKwkJCQloYXNoID0gaGFzaCAqIDEyOCAtIG87IC8qIHdlIHdhbnQgU1BFRUQgaGVyZSAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKG5sZW5baV0rKyA9PSBzeikgeworCQkJCXN6ID0gc3ogKiAzIC8gMjsKKwkJCQluZmlsZVtpXSA9IHhyZWFsbG9jKG5maWxlW2ldLCAoc3ogKyAzKSAqIHNpemVvZihuZmlsZVtpXVswXSkpOworCQkJfQorCQkJLyogbGluZV9jb21wYXIgbmVlZHMgaGFzaGVzIGZpdCBpbnRvIHBvc2l0aXZlIGludCAqLworCQkJbmZpbGVbaV1bbmxlbltpXV0udmFsdWUgPSBoYXNoICYgSU5UX01BWDsKKwkJCS8qIGxpa2UgZnRlbGxvKGZ0W2ldLmZ0X2ZwKSBidXQgZmFzdGVyIChhdm9pZHMgbHNlZWsgc3lzY2FsbCkgKi8KKwkJCW5maWxlW2ldW25sZW5baV1dLm9mZnNldCA9IGZ0W2ldLmZ0X3BvczsKKwkJCWlmICh0b2sgJiBUT0tfRU9GKSB7CisJCQkJLyogRU9GIGNvdW50cyBhcyBhIHRva2VuLCBzbyB3ZSBoYXZlIHRvIGFkanVzdCBpdCBoZXJlICovCisJCQkJbmZpbGVbaV1bbmxlbltpXV0ub2Zmc2V0Kys7CisJCQkJYnJlYWs7CisJCQl9CitzdGFydDoKKwkJCWhhc2ggPSB0b2sgPSAwOworCQl9CisJCS8qIEV4Y2x1ZGUgbG9uZSBFT0YgbGluZSBmcm9tIHRoZSBlbmQgb2YgdGhlIGZpbGUsIHRvIG1ha2UgZmV0Y2goKSdzIGpvYiBlYXNpZXIgKi8KKwkJaWYgKG5maWxlW2ldW25sZW5baV1dLm9mZnNldCAtIG5maWxlW2ldW25sZW5baV0gLSAxXS5vZmZzZXQgPT0gMSkKKwkJCW5sZW5baV0tLTsKKwkJLyogTm93IHdlIGNvcHkgdGhlIGxpbmUgb2Zmc2V0cyBpbnRvIGl4ICovCisJCWl4W2ldID0geG1hbGxvYygobmxlbltpXSArIDIpICogc2l6ZW9mKGl4W2ldWzBdKSk7CisJCWZvciAoaiA9IDA7IGogPCBubGVuW2ldICsgMTsgaisrKQorCQkJaXhbaV1bal0gPSBuZmlsZVtpXVtqXS5vZmZzZXQ7CisJfQorCisJLyogbGVuZ3RoIG9mIHByZWZpeCBhbmQgc3VmZml4IGlzIGNhbGN1bGF0ZWQgKi8KKwlmb3IgKDsgcHJlZiA8IG5sZW5bMF0gJiYgcHJlZiA8IG5sZW5bMV0gJiYKKwkgICAgICAgbmZpbGVbMF1bcHJlZiArIDFdLnZhbHVlID09IG5maWxlWzFdW3ByZWYgKyAxXS52YWx1ZTsKKwkgICAgICAgcHJlZisrKTsKKwlmb3IgKDsgc3VmZiA8IG5sZW5bMF0gLSBwcmVmICYmIHN1ZmYgPCBubGVuWzFdIC0gcHJlZiAmJgorCSAgICAgICBuZmlsZVswXVtubGVuWzBdIC0gc3VmZl0udmFsdWUgPT0gbmZpbGVbMV1bbmxlblsxXSAtIHN1ZmZdLnZhbHVlOworCSAgICAgICBzdWZmKyspOworCS8qIEFycmF5cyBhcmUgcHJ1bmVkIGJ5IHRoZSBzdWZmaXggYW5kIHByZWZpeCBsZW5ndGgsCisJICogdGhlIHJlc3VsdCBiZWluZyBzb3J0ZWQgYW5kIHN0b3JlZCBpbiBzZmlsZVtmaWxlbm9dLAorCSAqIGFuZCB0aGVpciBzaXplcyBhcmUgc3RvcmVkIGluIHNsZW5bZmlsZW5vXQorCSAqLworCWZvciAoaiA9IDA7IGogPCAyOyBqKyspIHsKKwkJc2ZpbGVbal0gPSBuZmlsZVtqXSArIHByZWY7CisJCXNsZW5bal0gPSBubGVuW2pdIC0gcHJlZiAtIHN1ZmY7CisJCWZvciAoaSA9IDA7IGkgPD0gc2xlbltqXTsgaSsrKQorCQkJc2ZpbGVbal1baV0uc2VyaWFsID0gaTsKKwkJcXNvcnQoc2ZpbGVbal0gKyAxLCBzbGVuW2pdLCBzaXplb2YoKnNmaWxlW2pdKSwgbGluZV9jb21wYXIpOworCX0KKwkvKiBuZmlsZSBhcnJheXMgYXJlIHJldXNlZCB0byByZWR1Y2UgbWVtb3J5IHByZXNzdXJlCisJICogVGhlICNpZiB6ZXJvZWQgb3V0IHNlY3Rpb24gcGVyZm9ybXMgdGhlIHNhbWUgdGFzayBhcyB0aGUKKwkgKiBvbmUgaW4gdGhlICNlbHNlIHNlY3Rpb24uCisJICogUGVhayBtZW1vcnkgdXNhZ2UgaXMgaGlnaGVyLCBidXQgb25lIGFycmF5IGNvcHkgaXMgYXZvaWRlZAorCSAqIGJ5IG5vdCB1c2luZyB1bnNvcnQoKQorCSAqLworI2lmIDAKKwltZW1iZXIgPSB4bWFsbG9jKChzbGVuWzFdICsgMikgKiBzaXplb2YobWVtYmVyWzBdKSk7CisJZXF1aXYoc2ZpbGVbMF0sIHNsZW5bMF0sIHNmaWxlWzFdLCBzbGVuWzFdLCBtZW1iZXIpOworCWZyZWUobmZpbGVbMV0pOworCisJY2xhc3MgPSB4bWFsbG9jKChzbGVuWzBdICsgMSkgKiBzaXplb2YoY2xhc3NbMF0pKTsKKwlmb3IgKGkgPSAxOyBpIDw9IHNsZW5bMF07IGkrKykgLyogVW5zb3J0aW5nICovCisJCWNsYXNzW3NmaWxlWzBdW2ldLnNlcmlhbF0gPSBzZmlsZVswXVtpXS52YWx1ZTsKKwlmcmVlKG5maWxlWzBdKTsKKyNlbHNlCisJbWVtYmVyID0gKGludCAqKW5maWxlWzFdOworCWVxdWl2KHNmaWxlWzBdLCBzbGVuWzBdLCBzZmlsZVsxXSwgc2xlblsxXSwgbWVtYmVyKTsKKwltZW1iZXIgPSB4cmVhbGxvYyhtZW1iZXIsIChzbGVuWzFdICsgMikgKiBzaXplb2YobWVtYmVyWzBdKSk7CisKKwljbGFzcyA9IChpbnQgKiluZmlsZVswXTsKKwl1bnNvcnQoc2ZpbGVbMF0sIHNsZW5bMF0sIChpbnQgKiluZmlsZVswXSk7CisJY2xhc3MgPSB4cmVhbGxvYyhjbGFzcywgKHNsZW5bMF0gKyAyKSAqIHNpemVvZihjbGFzc1swXSkpOworI2VuZGlmCisJSiA9IHhtYWxsb2MoKG5sZW5bMF0gKyAyKSAqIHNpemVvZihKWzBdKSk7CisJLyogVGhlIGVsZW1lbnRzIG9mIEogd2hpY2ggZmFsbCBpbnNpZGUgdGhlIHByZWZpeCBhbmQgc3VmZml4IHJlZ2lvbnMKKwkgKiBhcmUgbWFya2VkIGFzIHVuY2hhbmdlZCwgd2hpbGUgdGhlIG9uZXMgd2hpY2ggZmFsbCBvdXRzaWRlCisJICogYXJlIGluaXRpYWxpemVkIHdpdGggMCAobm8gbWF0Y2hlcyksIHNvIHRoYXQgZnVuY3Rpb24gc3RvbmUgY2FuCisJICogdGhlbiBhc3NpZ24gdGhlbSB0aGVpciByaWdodCB2YWx1ZXMKKwkgKi8KKwlmb3IgKGkgPSAwLCBkZWx0YSA9IG5sZW5bMV0gLSBubGVuWzBdOyBpIDw9IG5sZW5bMF07IGkrKykKKwkJSltpXSA9IGkgPD0gcHJlZiAgICAgICAgICAgID8gIGkgOgorCQkgICAgICAgaSA+IChubGVuWzBdIC0gc3VmZikgPyAoaSArIGRlbHRhKSA6IDA7CisJLyogSGVyZSB0aGUgbWFnaWMgaXMgcGVyZm9ybWVkICovCisJc3RvbmUoY2xhc3MsIHNsZW5bMF0sIG1lbWJlciwgSiwgcHJlZik7CisJSltubGVuWzBdICsgMV0gPSBubGVuWzFdICsgMTsKKworCWZyZWUoY2xhc3MpOworCWZyZWUobWVtYmVyKTsKKworCS8qIEJvdGggZmlsZXMgYXJlIHJlc2Nhbm5lZCwgaW4gYW4gZWZmb3J0IHRvIGZpbmQgYW55IGxpbmVzCisJICogd2hpY2gsIGR1ZSB0byBsaW1pdGF0aW9ucyBpbnRyaW5zaWMgdG8gYW55IGhhc2hpbmcgYWxnb3JpdGhtLAorCSAqIGFyZSBkaWZmZXJlbnQgYnV0IGVuZGVkIHVwIGNvbmZvdW5kZWQgYXMgdGhlIHNhbWUKKwkgKi8KKwlmb3IgKGkgPSAxOyBpIDw9IG5sZW5bMF07IGkrKykgeworCQlpZiAoIUpbaV0pCisJCQljb250aW51ZTsKKworCQlzZWVrX2Z0KCZmdFswXSwgaXhbMF1baSAtIDFdKTsKKwkJc2Vla19mdCgmZnRbMV0sIGl4WzFdW0pbaV0gLSAxXSk7CisKKwkJZm9yIChqID0gSltpXTsgaSA8PSBubGVuWzBdICYmIEpbaV0gPT0gajsgaSsrLCBqKyspIHsKKwkJCXRva2VuX3QgdG9rMCA9IDAsIHRvazEgPSAwOworCQkJZG8geworCQkJCXRvazAgPSByZWFkX3Rva2VuKCZmdFswXSwgdG9rMCk7CisJCQkJdG9rMSA9IHJlYWRfdG9rZW4oJmZ0WzFdLCB0b2sxKTsKKworCQkJCWlmICgoKHRvazAgXiB0b2sxKSAmIFRPS19FTVBUWSkgIT0gMCAvKiBvbmUgaXMgZW1wdHkgKG5vdCBib3RoKSAqLworCQkJCSB8fCAoISh0b2swICYgVE9LX0VNUFRZKSAmJiBUT0syQ0hBUih0b2swKSAhPSBUT0syQ0hBUih0b2sxKSkKKwkJCQkpIHsKKwkJCQkJSltpXSA9IDA7IC8qIEJyZWFrIHRoZSBjb3JyZXNwb25kZW5jZSAqLworCQkJCX0KKwkJCX0gd2hpbGUgKCEodG9rMCAmIHRvazEgJiBUT0tfRU1QVFkpKTsKKwkJfQorCX0KKworCXJldHVybiBKOworfQorCitzdGF0aWMgYm9vbCBkaWZmKEZJTEUqIGZwWzJdLCBjaGFyICpmaWxlWzJdKQoreworCWludCBubGVuWzJdOworCW9mZl90ICppeFsyXTsKKwlGSUxFX2FuZF9wb3NfdCBmdFsyXTsKKwl0eXBlZGVmIHN0cnVjdCB7IGludCBhLCBiOyB9IHZlY190WzJdOworCXZlY190ICp2ZWMgPSBOVUxMOworCWludCBpID0gMSwgaiwgaywgaWR4ID0gLTE7CisJYm9vbCBhbnljaGFuZ2UgPSBmYWxzZTsKKwlpbnQgKko7CisKKwlmdFswXS5mdF9mcCA9IGZwWzBdOworCWZ0WzFdLmZ0X2ZwID0gZnBbMV07CisJLyogbm90ZSB0aGF0IGZ0W2ldLmZ0X3BvcyBpcyB1bmludGl0YWxpemVkLCBjcmVhdGVfSigpCisJICogbXVzdCBub3QgYXNzdW1lIG90aGVyd2lzZSAqLworCUogPSBjcmVhdGVfSihmdCwgbmxlbiwgaXgpOworCisJZG8geworCQlib29sIG5vbmVtcHR5ID0gZmFsc2U7CisKKwkJd2hpbGUgKDEpIHsKKwkJCXZlY190IHY7CisKKwkJCWZvciAodlswXS5hID0gaTsgdlswXS5hIDw9IG5sZW5bMF0gJiYgSlt2WzBdLmFdID09IEpbdlswXS5hIC0gMV0gKyAxOyB2WzBdLmErKykKKwkJCQljb250aW51ZTsKKwkJCXZbMV0uYSA9IEpbdlswXS5hIC0gMV0gKyAxOworCisJCQlmb3IgKHZbMF0uYiA9IHZbMF0uYSAtIDE7IHZbMF0uYiA8IG5sZW5bMF0gJiYgIUpbdlswXS5iICsgMV07IHZbMF0uYisrKQorCQkJCWNvbnRpbnVlOworCQkJdlsxXS5iID0gSlt2WzBdLmIgKyAxXSAtIDE7CisJCQkvKgorCQkJICogSW5kaWNhdGUgdGhhdCB0aGVyZSBpcyBhIGRpZmZlcmVuY2UgYmV0d2VlbiBsaW5lcyBhIGFuZCBiIG9mIHRoZSAnZnJvbScgZmlsZQorCQkJICogdG8gZ2V0IHRvIGxpbmVzIGMgdG8gZCBvZiB0aGUgJ3RvJyBmaWxlLiBJZiBhIGlzIGdyZWF0ZXIgdGhhbiBiIHRoZW4gdGhlcmUKKwkJCSAqIGFyZSBubyBsaW5lcyBpbiB0aGUgJ2Zyb20nIGZpbGUgaW52b2x2ZWQgYW5kIHRoaXMgbWVhbnMgdGhhdCB0aGVyZSB3ZXJlCisJCQkgKiBsaW5lcyBhcHBlbmRlZCAoYmVnaW5uaW5nIGF0IGIpLiAgSWYgYyBpcyBncmVhdGVyIHRoYW4gZCB0aGVuIHRoZXJlIGFyZQorCQkJICogbGluZXMgbWlzc2luZyBmcm9tIHRoZSAndG8nIGZpbGUuCisJCQkgKi8KKwkJCWlmICh2WzBdLmEgPD0gdlswXS5iIHx8IHZbMV0uYSA8PSB2WzFdLmIpIHsKKwkJCQkvKgorCQkJCSAqIElmIHRoaXMgY2hhbmdlIGlzIG1vcmUgdGhhbiAnY29udGV4dCcgbGluZXMgZnJvbSB0aGUKKwkJCQkgKiBwcmV2aW91cyBjaGFuZ2UsIGR1bXAgdGhlIHJlY29yZCBhbmQgcmVzZXQgaXQuCisJCQkJICovCisJCQkJaW50IGN0ID0gKDIgKiBvcHRfVV9jb250ZXh0KSArIDE7CisJCQkJaWYgKGlkeCA+PSAwCisJCQkJICYmIHZbMF0uYSA+IHZlY1tpZHhdWzBdLmIgKyBjdAorCQkJCSAmJiB2WzFdLmEgPiB2ZWNbaWR4XVsxXS5iICsgY3QKKwkJCQkpIHsKKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJZm9yIChqID0gMDsgaiA8IDI7IGorKykKKwkJCQkJZm9yIChrID0gdltqXS5hOyBrIDw9IHZbal0uYjsgaysrKQorCQkJCQkJbm9uZW1wdHkgfD0gKGl4W2pdW2tdIC0gaXhbal1bayAtIDFdICE9IDEpOworCisJCQkJdmVjID0geHJlYWxsb2NfdmVjdG9yKHZlYywgNiwgKytpZHgpOworCQkJCW1lbWNweSh2ZWNbaWR4XSwgdiwgc2l6ZW9mKHYpKTsKKwkJCX0KKworCQkJaSA9IHZbMF0uYiArIDE7CisJCQlpZiAoaSA+IG5sZW5bMF0pCisJCQkJYnJlYWs7CisJCQlKW3ZbMF0uYl0gPSB2WzFdLmI7CisJCX0KKwkJaWYgKGlkeCA8IDAgfHwgKChvcHRpb25fbWFzazMyICYgRkxBRyhCKSkgJiYgIW5vbmVtcHR5KSkKKwkJCWdvdG8gY29udDsKKwkJaWYgKCEob3B0aW9uX21hc2szMiAmIEZMQUcocSkpKSB7CisJCQlpbnQgbG93YTsKKwkJCXZlY190IHNwYW4sICpjdnAgPSB2ZWM7CisKKwkJCWlmICghYW55Y2hhbmdlKSB7CisJCQkJLyogUHJpbnQgdGhlIGNvbnRleHQvdW5pZGlmZiBoZWFkZXIgZmlyc3QgdGltZSB0aHJvdWdoICovCisJCQkJcHJpbnRmKCItLS0gJXNcbiIsIGxhYmVsWzBdID8gbGFiZWxbMF0gOiBmaWxlWzBdKTsKKwkJCQlwcmludGYoIisrKyAlc1xuIiwgbGFiZWxbMV0gPyBsYWJlbFsxXSA6IGZpbGVbMV0pOworCQkJfQorCisJCQlwcmludGYoIkBAIik7CisJCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKSB7CisJCQkJaW50IGEgPSBzcGFuW2pdLmEgPSBNQVgoMSwgKCpjdnApW2pdLmEgLSBvcHRfVV9jb250ZXh0KTsKKwkJCQlpbnQgYiA9IHNwYW5bal0uYiA9IE1JTihubGVuW2pdLCB2ZWNbaWR4XVtqXS5iICsgb3B0X1VfY29udGV4dCk7CisKKwkJCQlwcmludGYoIiAlYyVkIiwgaiA/ICcrJyA6ICctJywgTUlOKGEsIGIpKTsKKwkJCQlpZiAoYSA9PSBiKQorCQkJCQljb250aW51ZTsKKwkJCQlwcmludGYoIiwlZCIsIChhIDwgYikgPyBiIC0gYSArIDEgOiAwKTsKKwkJCX0KKwkJCXB1dHMoIiBAQCIpOworCQkJLyoKKwkJCSAqIE91dHB1dCBjaGFuZ2VzIGluICJ1bmlmaWVkIiBkaWZmIGZvcm1hdC0tdGhlIG9sZCBhbmQgbmV3IGxpbmVzCisJCQkgKiBhcmUgcHJpbnRlZCB0b2dldGhlci4KKwkJCSAqLworCQkJZm9yIChsb3dhID0gc3BhblswXS5hOyA7IGxvd2EgPSAoKmN2cCsrKVswXS5iICsgMSkgeworCQkJCWJvb2wgZW5kID0gY3ZwID4gJnZlY1tpZHhdOworCQkJCWZldGNoKCZmdFswXSwgaXhbMF0sIGxvd2EsIGVuZCA/IHNwYW5bMF0uYiA6ICgqY3ZwKVswXS5hIC0gMSwgJyAnKTsKKwkJCQlpZiAoZW5kKQorCQkJCQlicmVhazsKKwkJCQlmb3IgKGogPSAwOyBqIDwgMjsgaisrKQorCQkJCQlmZXRjaCgmZnRbal0sIGl4W2pdLCAoKmN2cClbal0uYSwgKCpjdnApW2pdLmIsIGogPyAnKycgOiAnLScpOworCQkJfQorCQl9CisJCWFueWNoYW5nZSA9IHRydWU7CisgY29udDoKKwkJaWR4ID0gLTE7CisJfSB3aGlsZSAoaSA8PSBubGVuWzBdKTsKKworCWZyZWUodmVjKTsKKwlmcmVlKGl4WzBdKTsKKwlmcmVlKGl4WzFdKTsKKwlmcmVlKEopOworCXJldHVybiBhbnljaGFuZ2U7Cit9CisKK3N0YXRpYyBpbnQgZGlmZnJlZyhjaGFyICpmaWxlWzJdKQoreworCUZJTEUgKmZwWzJdOworCWJvb2wgYmluYXJ5ID0gZmFsc2UsIGRpZmZlciA9IGZhbHNlOworCWludCBzdGF0dXMgPSBTVEFUVVNfU0FNRSwgaTsKKworCWZwWzBdID0gc3RkaW47CisJZnBbMV0gPSBzdGRpbjsKKwlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7CisJCWludCBmZCA9IG9wZW5fb3Jfd2Fybl9zdGRpbihmaWxlW2ldKTsKKwkJaWYgKGZkID09IC0xKQorCQkJZ290byBvdXQ7CisJCS8qIE91ciBkaWZmIGltcGxlbWVudGF0aW9uIGlzIHVzaW5nIHNlZWsuCisJCSAqIFdoZW4gd2UgbWVldCBub24tc2Vla2FibGUgZmlsZSwgd2UgbXVzdCBtYWtlIGEgdGVtcCBjb3B5LgorCQkgKi8KKwkJaWYgKGxzZWVrKGZkLCAwLCBTRUVLX1NFVCkgPT0gLTEgJiYgZXJybm8gPT0gRVNQSVBFKSB7CisJCQljaGFyIG5hbWVbXSA9ICIvdG1wL2RpZlhYWFhYWCI7CisJCQlpbnQgZmRfdG1wID0geG1rc3RlbXAobmFtZSk7CisKKwkJCXVubGluayhuYW1lKTsKKwkJCWlmIChiYl9jb3B5ZmRfZW9mKGZkLCBmZF90bXApIDwgMCkKKwkJCQl4ZnVuY19kaWUoKTsKKwkJCWlmIChmZCAhPSBTVERJTl9GSUxFTk8pCisJCQkJY2xvc2UoZmQpOworCQkJZmQgPSBmZF90bXA7CisJCQl4bHNlZWsoZmQsIDAsIFNFRUtfU0VUKTsKKwkJfQorCQlmcFtpXSA9IGZkb3BlbihmZCwgInIiKTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQljb25zdCBzaXplX3Qgc3ogPSBDT01NT05fQlVGU0laRSAvIDI7CisJCWNoYXIgKmNvbnN0IGJ1ZjAgPSBiYl9jb21tb25fYnVmc2l6MTsKKwkJY2hhciAqY29uc3QgYnVmMSA9IGJ1ZjAgKyBzejsKKwkJaW50IGosIGs7CisJCWkgPSBmcmVhZChidWYwLCAxLCBzeiwgZnBbMF0pOworCQlqID0gZnJlYWQoYnVmMSwgMSwgc3osIGZwWzFdKTsKKwkJaWYgKGkgIT0gaikgeworCQkJZGlmZmVyID0gdHJ1ZTsKKwkJCWkgPSBNSU4oaSwgaik7CisJCX0KKwkJaWYgKGkgPT0gMCkKKwkJCWJyZWFrOworCQlmb3IgKGsgPSAwOyBrIDwgaTsgaysrKSB7CisJCQlpZiAoIWJ1ZjBba10gfHwgIWJ1ZjFba10pCisJCQkJYmluYXJ5ID0gdHJ1ZTsKKwkJCWlmIChidWYwW2tdICE9IGJ1ZjFba10pCisJCQkJZGlmZmVyID0gdHJ1ZTsKKwkJfQorCX0KKwlpZiAoZGlmZmVyKSB7CisJCWlmIChiaW5hcnkgJiYgIShvcHRpb25fbWFzazMyICYgRkxBRyhhKSkpCisJCQlzdGF0dXMgPSBTVEFUVVNfQklOQVJZOworCQllbHNlIGlmIChkaWZmKGZwLCBmaWxlKSkKKwkJCXN0YXR1cyA9IFNUQVRVU19ESUZGRVI7CisJfQorCWlmIChzdGF0dXMgIT0gU1RBVFVTX1NBTUUpCisJCWV4aXRfc3RhdHVzIHw9IDE7CitvdXQ6CisJZmNsb3NlX2lmX25vdF9zdGRpbihmcFswXSk7CisJZmNsb3NlX2lmX25vdF9zdGRpbihmcFsxXSk7CisKKwlyZXR1cm4gc3RhdHVzOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zdGF0dXMoaW50IHN0YXR1cywgY2hhciAqcGF0aFsyXSkKK3sKKwlzd2l0Y2ggKHN0YXR1cykgeworCWNhc2UgU1RBVFVTX0JJTkFSWToKKwljYXNlIFNUQVRVU19ESUZGRVI6CisJCWlmICgob3B0aW9uX21hc2szMiAmIEZMQUcocSkpIHx8IHN0YXR1cyA9PSBTVEFUVVNfQklOQVJZKQorCQkJcHJpbnRmKCJGaWxlcyAlcyBhbmQgJXMgZGlmZmVyXG4iLCBwYXRoWzBdLCBwYXRoWzFdKTsKKwkJYnJlYWs7CisJY2FzZSBTVEFUVVNfU0FNRToKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHKHMpKQorCQkJcHJpbnRmKCJGaWxlcyAlcyBhbmQgJXMgYXJlIGlkZW50aWNhbFxuIiwgcGF0aFswXSwgcGF0aFsxXSk7CisJCWJyZWFrOworCX0KK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0RJRkZfRElSCitzdHJ1Y3QgZGxpc3QgeworCXNpemVfdCBsZW47CisJaW50IHMsIGU7CisJY2hhciAqKmRsOworfTsKKworLyogVGhpcyBmdW5jdGlvbiBhZGRzIGEgZmlsZW5hbWUgdG8gZGwsIHRoZSBkaXJlY3RvcnkgbGlzdGluZy4gKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGFkZF90b19kaXJsaXN0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQlzdHJ1Y3Qgc3RhdCAqc2IgVU5VU0VEX1BBUkFNLAorCQl2b2lkICp1c2VyZGF0YSwgaW50IGRlcHRoIFVOVVNFRF9QQVJBTSkKK3sKKwlzdHJ1Y3QgZGxpc3QgKmNvbnN0IGwgPSB1c2VyZGF0YTsKKwljb25zdCBjaGFyICpmaWxlID0gZmlsZW5hbWUgKyBsLT5sZW47CisJd2hpbGUgKCpmaWxlID09ICcvJykKKwkJZmlsZSsrOworCWwtPmRsID0geHJlYWxsb2NfdmVjdG9yKGwtPmRsLCA2LCBsLT5lKTsKKwlsLT5kbFtsLT5lXSA9IHhzdHJkdXAoZmlsZSk7CisJbC0+ZSsrOworCXJldHVybiBUUlVFOworfQorCisvKiBJZiByZWN1cnNpb24gaXMgbm90IHNldCwgdGhpcyBmdW5jdGlvbiBhZGRzIHRoZSBkaXJlY3RvcnkKKyAqIHRvIHRoZSBsaXN0IGFuZCBwcmV2ZW50cyByZWN1cnNpdmVfYWN0aW9uIGZyb20gcmVjdXJzaW5nIGludG8gaXQuCisgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHNraXBfZGlyKGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQlzdHJ1Y3Qgc3RhdCAqc2IsIHZvaWQgKnVzZXJkYXRhLAorCQlpbnQgZGVwdGgpCit7CisJaWYgKCEob3B0aW9uX21hc2szMiAmIEZMQUcocikpICYmIGRlcHRoKSB7CisJCWFkZF90b19kaXJsaXN0KGZpbGVuYW1lLCBzYiwgdXNlcmRhdGEsIGRlcHRoKTsKKwkJcmV0dXJuIFNLSVA7CisJfQorCWlmICghKG9wdGlvbl9tYXNrMzIgJiBGTEFHKE4pKSkgeworCQkvKiAtciB3aXRob3V0IC1OOiBubyBuZWVkIHRvIHJlY3Vyc2UgaW50byBkaXJzCisJCSAqIHdoaWNoIGRvIG5vdCBleGlzdCBvbiB0aGUgIm90aGVyIHNpZGUiLgorCQkgKiBUZXN0Y2FzZTogZGlmZiAtciAvdG1wIC8KKwkJICogKGl0IHdvdWxkIHJlY3Vyc2UgZGVlcCBpbnRvIC9wcm9jIHdpdGhvdXQgdGhpcyBjb2RlKSAqLworCQlzdHJ1Y3QgZGxpc3QgKmNvbnN0IGwgPSB1c2VyZGF0YTsKKwkJZmlsZW5hbWUgKz0gbC0+bGVuOworCQlpZiAoZmlsZW5hbWVbMF0pIHsKKwkJCXN0cnVjdCBzdGF0IG9zYjsKKwkJCWNoYXIgKm90aGVybmFtZSA9IGNvbmNhdF9wYXRoX2ZpbGUoRy5vdGhlcl9kaXIsIGZpbGVuYW1lKTsKKwkJCWludCByID0gc3RhdChvdGhlcm5hbWUsICZvc2IpOworCQkJZnJlZShvdGhlcm5hbWUpOworCQkJaWYgKHIgIT0gMCB8fCAhU19JU0RJUihvc2Iuc3RfbW9kZSkpIHsKKwkJCQkvKiBvdGhlciBkaXIgZG9lc24ndCBoYXZlIHNpbWlsYXJseSBuYW1lZAorCQkJCSAqIGRpcmVjdG9yeSwgZG9uJ3QgcmVjdXJzZTsgcmV0dXJuIDEgdXBvbgorCQkJCSAqIGV4aXQsIGp1c3QgbGlrZSBkaWZmdXRpbHMnIGRpZmYgKi8KKwkJCQlleGl0X3N0YXR1cyB8PSAxOworCQkJCXJldHVybiBTS0lQOworCQkJfQorCQl9CisJfQorCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZCBkaWZmZGlyKGNoYXIgKnBbMl0sIGNvbnN0IGNoYXIgKnNfc3RhcnQpCit7CisJc3RydWN0IGRsaXN0IGxpc3RbMl07CisJaW50IGk7CisKKwltZW1zZXQoJmxpc3QsIDAsIHNpemVvZihsaXN0KSk7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQkvKmxpc3RbaV0ucyA9IGxpc3RbaV0uZSA9IDA7IC0gbWVtc2V0IGRpZCBpdCAqLworCQkvKmxpc3RbaV0uZGwgPSBOVUxMOyAqLworCisJCUcub3RoZXJfZGlyID0gcFsxIC0gaV07CisJCS8qIFdlIG5lZWQgdG8gdHJpbSByb290IGRpcmVjdG9yeSBwcmVmaXguCisJCSAqIFVzaW5nIGxpc3QubGVuIHRvIHNwZWNpZnkgaXRzIGxlbmd0aCwKKwkJICogYWRkX3RvX2Rpcmxpc3Qgd2lsbCByZW1vdmUgaXQuICovCisJCWxpc3RbaV0ubGVuID0gc3RybGVuKHBbaV0pOworCQlyZWN1cnNpdmVfYWN0aW9uKHBbaV0sIEFDVElPTl9SRUNVUlNFIHwgQUNUSU9OX0ZPTExPV0xJTktTLAorCQkJCWFkZF90b19kaXJsaXN0LCBza2lwX2RpciwgJmxpc3RbaV0sIDApOworCQkvKiBTb3J0IGRsIGFscGhhYmV0aWNhbGx5LgorCQkgKiBHTlUgZGlmZiBkb2VzIHRoaXMgaWdub3JpbmcgYW55IG51bWJlciBvZiB0cmFpbGluZyBkb3RzLgorCQkgKiBXZSBkb24ndCwgc28gZm9yIHVzIGRvdHRlZCBmaWxlcyBhbG1vc3QgYWx3YXlzIGFyZQorCQkgKiBmaXJzdCBvbiB0aGUgbGlzdC4KKwkJICovCisJCXFzb3J0X3N0cmluZ192ZWN0b3IobGlzdFtpXS5kbCwgbGlzdFtpXS5lKTsKKwkJLyogSWYgLVMgd2FzIHNldCwgZmluZCB0aGUgc3RhcnRpbmcgcG9pbnQuICovCisJCWlmICghc19zdGFydCkKKwkJCWNvbnRpbnVlOworCQl3aGlsZSAobGlzdFtpXS5zIDwgbGlzdFtpXS5lICYmIHN0cmNtcChsaXN0W2ldLmRsW2xpc3RbaV0uc10sIHNfc3RhcnQpIDwgMCkKKwkJCWxpc3RbaV0ucysrOworCX0KKwkvKiBOb3cgdGhhdCBib3RoIGRpcmxpc3QxIGFuZCBkaXJsaXN0MiBjb250YWluIHNvcnRlZCBkaXJlY3RvcnkKKwkgKiBsaXN0aW5ncywgd2UgY2FuIHN0YXJ0IHRvIGdvIHRocm91Z2ggZGlybGlzdDEuIElmIGJvdGggbGlzdGluZ3MKKwkgKiBjb250YWluIHRoZSBzYW1lIGZpbGUsIHRoZW4gZG8gYSBub3JtYWwgZGlmZi4gT3RoZXJ3aXNlLCBiZWhhdmlvdXIKKwkgKiBpcyBkZXRlcm1pbmVkIGJ5IHdoZXRoZXIgdGhlIC1OIGZsYWcgaXMgc2V0LiAqLworCXdoaWxlICgxKSB7CisJCWNoYXIgKmRwWzJdOworCQlpbnQgcG9zOworCQlpbnQgazsKKworCQlkcFswXSA9IGxpc3RbMF0ucyA8IGxpc3RbMF0uZSA/IGxpc3RbMF0uZGxbbGlzdFswXS5zXSA6IE5VTEw7CisJCWRwWzFdID0gbGlzdFsxXS5zIDwgbGlzdFsxXS5lID8gbGlzdFsxXS5kbFtsaXN0WzFdLnNdIDogTlVMTDsKKwkJaWYgKCFkcFswXSAmJiAhZHBbMV0pCisJCQlicmVhazsKKwkJcG9zID0gIWRwWzBdID8gMSA6ICghZHBbMV0gPyAtMSA6IHN0cmNtcChkcFswXSwgZHBbMV0pKTsKKwkJayA9IHBvcyA+IDA7CisJCWlmIChwb3MgJiYgIShvcHRpb25fbWFzazMyICYgRkxBRyhOKSkpIHsKKwkJCXByaW50ZigiT25seSBpbiAlczogJXNcbiIsIHBba10sIGRwW2tdKTsKKwkJCWV4aXRfc3RhdHVzIHw9IDE7CisJCX0gZWxzZSB7CisJCQljaGFyICpmdWxscGF0aFsyXSwgKnBhdGhbMl07IC8qIGlmIC1OICovCisKKwkJCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJCQlpZiAocG9zID09IDAgfHwgaSA9PSBrKSB7CisJCQkJCXBhdGhbaV0gPSBmdWxscGF0aFtpXSA9IGNvbmNhdF9wYXRoX2ZpbGUocFtpXSwgZHBbaV0pOworCQkJCQlzdGF0KGZ1bGxwYXRoW2ldLCAmc3RiW2ldKTsKKwkJCQl9IGVsc2UgeworCQkJCQlmdWxscGF0aFtpXSA9IGNvbmNhdF9wYXRoX2ZpbGUocFtpXSwgZHBbMSAtIGldKTsKKwkJCQkJcGF0aFtpXSA9IChjaGFyICopYmJfZGV2X251bGw7CisJCQkJfQorCQkJfQorCQkJaWYgKHBvcykKKwkJCQlzdGF0KGZ1bGxwYXRoW2tdLCAmc3RiWzEgLSBrXSk7CisKKwkJCWlmIChTX0lTRElSKHN0YlswXS5zdF9tb2RlKSAmJiBTX0lTRElSKHN0YlsxXS5zdF9tb2RlKSkKKwkJCQlwcmludGYoIkNvbW1vbiBzdWJkaXJlY3RvcmllczogJXMgYW5kICVzXG4iLCBmdWxscGF0aFswXSwgZnVsbHBhdGhbMV0pOworCQkJZWxzZSBpZiAoIVNfSVNSRUcoc3RiWzBdLnN0X21vZGUpICYmICFTX0lTRElSKHN0YlswXS5zdF9tb2RlKSkKKwkJCQlwcmludGYoIkZpbGUgJXMgaXMgbm90IGEgcmVndWxhciBmaWxlIG9yIGRpcmVjdG9yeSBhbmQgd2FzIHNraXBwZWRcbiIsIGZ1bGxwYXRoWzBdKTsKKwkJCWVsc2UgaWYgKCFTX0lTUkVHKHN0YlsxXS5zdF9tb2RlKSAmJiAhU19JU0RJUihzdGJbMV0uc3RfbW9kZSkpCisJCQkJcHJpbnRmKCJGaWxlICVzIGlzIG5vdCBhIHJlZ3VsYXIgZmlsZSBvciBkaXJlY3RvcnkgYW5kIHdhcyBza2lwcGVkXG4iLCBmdWxscGF0aFsxXSk7CisJCQllbHNlIGlmIChTX0lTRElSKHN0YlswXS5zdF9tb2RlKSAhPSBTX0lTRElSKHN0YlsxXS5zdF9tb2RlKSkgeworCQkJCWlmIChTX0lTRElSKHN0YlswXS5zdF9tb2RlKSkKKwkJCQkJcHJpbnRmKCJGaWxlICVzIGlzIGEgJXMgd2hpbGUgZmlsZSAlcyBpcyBhICVzXG4iLCBmdWxscGF0aFswXSwgImRpcmVjdG9yeSIsIGZ1bGxwYXRoWzFdLCAicmVndWxhciBmaWxlIik7CisJCQkJZWxzZQorCQkJCQlwcmludGYoIkZpbGUgJXMgaXMgYSAlcyB3aGlsZSBmaWxlICVzIGlzIGEgJXNcbiIsIGZ1bGxwYXRoWzBdLCAicmVndWxhciBmaWxlIiwgZnVsbHBhdGhbMV0sICJkaXJlY3RvcnkiKTsKKwkJCX0gZWxzZQorCQkJCXByaW50X3N0YXR1cyhkaWZmcmVnKHBhdGgpLCBmdWxscGF0aCk7CisKKwkJCWZyZWUoZnVsbHBhdGhbMF0pOworCQkJZnJlZShmdWxscGF0aFsxXSk7CisJCX0KKwkJZnJlZShkcFtrXSk7CisJCWxpc3Rba10ucysrOworCQlpZiAocG9zID09IDApIHsKKwkJCWZyZWUoZHBbMSAtIGtdKTsKKwkJCWxpc3RbMSAtIGtdLnMrKzsKKwkJfQorCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZnJlZShsaXN0WzBdLmRsKTsKKwkJZnJlZShsaXN0WzFdLmRsKTsKKwl9Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0RJRkZfTE9OR19PUFRJT05TCitzdGF0aWMgY29uc3QgY2hhciBkaWZmX2xvbmdvcHRzW10gQUxJR04xID0KKwkiaWdub3JlLWNhc2VcMCIgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJpIgorCSJpZ25vcmUtdGFiLWV4cGFuc2lvblwwIiAgICAgTm9fYXJndW1lbnQgICAgICAgIkUiCisJImlnbm9yZS1zcGFjZS1jaGFuZ2VcMCIgICAgICBOb19hcmd1bWVudCAgICAgICAiYiIKKwkiaWdub3JlLWFsbC1zcGFjZVwwIiAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJ3IgorCSJpZ25vcmUtYmxhbmstbGluZXNcMCIgICAgICAgTm9fYXJndW1lbnQgICAgICAgIkIiCisJInRleHRcMCIgICAgICAgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiYSIKKwkidW5pZmllZFwwIiAgICAgICAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJVIgorCSJsYWJlbFwwIiAgICAgICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIkwiCisJInNob3ctYy1mdW5jdGlvblwwIiAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAicCIKKwkiYnJpZWZcMCIgICAgICAgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJxIgorCSJleHBhbmQtdGFic1wwIiAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInQiCisJImluaXRpYWwtdGFiXDAiICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiVCIKKwkicmVjdXJzaXZlXDAiICAgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJyIgorCSJuZXctZmlsZVwwIiAgICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIk4iCisJInJlcG9ydC1pZGVudGljYWwtZmlsZXNcMCIgICBOb19hcmd1bWVudCAgICAgICAicyIKKwkic3RhcnRpbmctZmlsZVwwIiAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJTIgorCSJtaW5pbWFsXDAiICAgICAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImQiCisJOworI2VuZGlmCisKK2ludCBkaWZmX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBkaWZmX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgZ290c3RkaW4gPSAwLCBpOworCWNoYXIgKmZpbGVbMl0sICpzX3N0YXJ0ID0gTlVMTDsKKwlsbGlzdF90ICpMX2FyZyA9IE5VTEw7CisKKwlJTklUX0coKTsKKworCS8qIGV4YWN0bHkgMiBwYXJhbXM7IGNvbGxlY3QgbXVsdGlwbGUgLUwgPGxhYmVsPjsgLVUgTiAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0yOkw6OlUrIjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9ESUZGX0xPTkdfT1BUSU9OUworCWFwcGxldF9sb25nX29wdGlvbnMgPSBkaWZmX2xvbmdvcHRzOworI2VuZGlmCisJZ2V0b3B0MzIoYXJndiwgImFiZGlMOk5xcnNTOnRUVTp3dXBCRSIsCisJCQkmTF9hcmcsICZzX3N0YXJ0LCAmb3B0X1VfY29udGV4dCk7CisJYXJndiArPSBvcHRpbmQ7CisJd2hpbGUgKExfYXJnKQorCQlsYWJlbFshIWxhYmVsWzBdXSA9IGxsaXN0X3BvcCgmTF9hcmcpOworCXhmdW5jX2Vycm9yX3JldHZhbCA9IDI7CisJZm9yIChpID0gMDsgaSA8IDI7IGkrKykgeworCQlmaWxlW2ldID0gYXJndltpXTsKKwkJLyogQ29tcGF0OiAiZGlmZiBmaWxlIG5hbWVfd2hpY2hfZG9lc250X2V4aXN0IiBleGl0cyB3aXRoIDIgKi8KKwkJaWYgKExPTkVfREFTSChmaWxlW2ldKSkgeworCQkJZnN0YXQoU1RESU5fRklMRU5PLCAmc3RiW2ldKTsKKwkJCWdvdHN0ZGluKys7CisJCX0gZWxzZQorCQkJeHN0YXQoZmlsZVtpXSwgJnN0YltpXSk7CisJfQorCXhmdW5jX2Vycm9yX3JldHZhbCA9IDE7CisJaWYgKGdvdHN0ZGluICYmIChTX0lTRElSKHN0YlswXS5zdF9tb2RlKSB8fCBTX0lTRElSKHN0YlsxXS5zdF9tb2RlKSkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBjb21wYXJlIHN0ZGluIHRvIGEgZGlyZWN0b3J5Iik7CisKKwkvKiBDb21wYXJlIG1ldGFkYXRhIHRvIGNoZWNrIGlmIHRoZSBmaWxlcyBhcmUgdGhlIHNhbWUgcGh5c2ljYWwgZmlsZS4KKwkgKgorCSAqIENvbW1lbnQgZnJvbSBkaWZmdXRpbHMgc291cmNlIHNheXM6CisJICogUE9TSVggc2F5cyB0aGF0IHR3byBmaWxlcyBhcmUgaWRlbnRpY2FsIGlmIHN0X2lubyBhbmQgc3RfZGV2IGFyZQorCSAqIHRoZSBzYW1lLCBidXQgbWFueSBmaWxlIHN5c3RlbXMgaW5jb3JyZWN0bHkgYXNzaWduIHRoZSBzYW1lIChkZXZpY2UsCisJICogaW5vZGUpIHBhaXIgdG8gdHdvIGRpc3RpbmN0IGZpbGVzLCBpbmNsdWRpbmc6CisJICogR05VL0xpbnV4IE5GUyBzZXJ2ZXJzIHRoYXQgZXhwb3J0IGFsbCBsb2NhbCBmaWxlIHN5c3RlbXMgYXMgYQorCSAqIHNpbmdsZSBORlMgZmlsZSBzeXN0ZW0sIGlmIGEgbG9jYWwgZGV2aWNlIG51bWJlciAoc3RfZGV2KSBleGNlZWRzCisJICogMjU1LCBvciBpZiBhIGxvY2FsIGlub2RlIG51bWJlciAoc3RfaW5vKSBleGNlZWRzIDE2Nzc3MjE1LgorCSAqLworCWlmIChFTkFCTEVfREVTS1RPUAorCSAmJiBzdGJbMF0uc3RfaW5vID09IHN0YlsxXS5zdF9pbm8KKwkgJiYgc3RiWzBdLnN0X2RldiA9PSBzdGJbMV0uc3RfZGV2CisJICYmIHN0YlswXS5zdF9zaXplID09IHN0YlsxXS5zdF9zaXplCisJICYmIHN0YlswXS5zdF9tdGltZSA9PSBzdGJbMV0uc3RfbXRpbWUKKwkgJiYgc3RiWzBdLnN0X2N0aW1lID09IHN0YlsxXS5zdF9jdGltZQorCSAmJiBzdGJbMF0uc3RfbW9kZSA9PSBzdGJbMV0uc3RfbW9kZQorCSAmJiBzdGJbMF0uc3RfbmxpbmsgPT0gc3RiWzFdLnN0X25saW5rCisJICYmIHN0YlswXS5zdF91aWQgPT0gc3RiWzFdLnN0X3VpZAorCSAmJiBzdGJbMF0uc3RfZ2lkID09IHN0YlsxXS5zdF9naWQKKwkpIHsKKwkJLyogZmlsZXMgYXJlIHBoeXNpY2FsbHkgdGhlIHNhbWU7IG5vIG5lZWQgdG8gY29tcGFyZSB0aGVtICovCisJCXJldHVybiBTVEFUVVNfU0FNRTsKKwl9CisKKwlpZiAoU19JU0RJUihzdGJbMF0uc3RfbW9kZSkgJiYgU19JU0RJUihzdGJbMV0uc3RfbW9kZSkpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9ESUZGX0RJUgorCQlkaWZmZGlyKGZpbGUsIHNfc3RhcnQpOworI2Vsc2UKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vIHN1cHBvcnQgZm9yIGRpcmVjdG9yeSBjb21wYXJpc29uIik7CisjZW5kaWYKKwl9IGVsc2UgeworCQlib29sIGRpcmZpbGUgPSBTX0lTRElSKHN0YlswXS5zdF9tb2RlKSB8fCBTX0lTRElSKHN0YlsxXS5zdF9tb2RlKTsKKwkJYm9vbCBkaXIgPSBTX0lTRElSKHN0YlsxXS5zdF9tb2RlKTsKKwkJaWYgKGRpcmZpbGUpIHsKKwkJCWNvbnN0IGNoYXIgKnNsYXNoID0gc3RycmNocihmaWxlWyFkaXJdLCAnLycpOworCQkJZmlsZVtkaXJdID0gY29uY2F0X3BhdGhfZmlsZShmaWxlW2Rpcl0sIHNsYXNoID8gc2xhc2ggKyAxIDogZmlsZVshZGlyXSk7CisJCQl4c3RhdChmaWxlW2Rpcl0sICZzdGJbZGlyXSk7CisJCX0KKwkJLyogZGlmZnJlZyBjYW4gZ2V0IG5vbi1yZWd1bGFyIGZpbGVzIGhlcmUgKi8KKwkJcHJpbnRfc3RhdHVzKGdvdHN0ZGluID4gMSA/IFNUQVRVU19TQU1FIDogZGlmZnJlZyhmaWxlKSwgZmlsZSk7CisKKwkJaWYgKGRpcmZpbGUpCisJCQlmcmVlKGZpbGVbZGlyXSk7CisJfQorCisJcmV0dXJuIGV4aXRfc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvZWRpdG9ycy9lZC5jIGIvZWRpdG9ycy9lZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YzQxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9lZGl0b3JzL2VkLmMKQEAgLTAsMCArMSwxMDUwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgYnkgRGF2aWQgSS4gQmVsbAorICogUGVybWlzc2lvbiBpcyBncmFudGVkIHRvIHVzZSwgZGlzdHJpYnV0ZSwgb3IgbW9kaWZ5IHRoaXMgc291cmNlLAorICogcHJvdmlkZWQgdGhhdCB0aGlzIGNvcHlyaWdodCBub3RpY2UgcmVtYWlucyBpbnRhY3QuCisgKgorICogVGhlICJlZCIgYnVpbHQtaW4gY29tbWFuZCAobXVjaCBzaW1wbGlmaWVkKQorICovCisKKy8vY29uZmlnOmNvbmZpZyBFRAorLy9jb25maWc6CWJvb2wgImVkIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRoZSBvcmlnaW5hbCAxOTcwJ3MgVW5peCB0ZXh0IGVkaXRvciwgZnJvbSB0aGUgZGF5cyBvZiB0ZWxldHlwZXMuCisvL2NvbmZpZzoJICBTbWFsbCwgc2ltcGxlLCBldmlsLiBQYXJ0IG9mIFNVU3YzLiBJZiB5b3UncmUgbm90IGFscmVhZHkgdXNpbmcKKy8vY29uZmlnOgkgIHRoaXMsIHlvdSBkb24ndCBuZWVkIGl0LgorCisvL2tidWlsZDpsaWItJChDT05GSUdfRUQpICs9IGVkLm8KKworLy9hcHBsZXQ6SUZfRUQoQVBQTEVUKGVkLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL3VzYWdlOiNkZWZpbmUgZWRfdHJpdmlhbF91c2FnZSAiIgorLy91c2FnZTojZGVmaW5lIGVkX2Z1bGxfdXNhZ2UgIiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3R5cGVkZWYgc3RydWN0IExJTkUgeworCXN0cnVjdCBMSU5FICpuZXh0OworCXN0cnVjdCBMSU5FICpwcmV2OworCWludCBsZW47CisJY2hhciBkYXRhWzFdOworfSBMSU5FOworCisKKyNkZWZpbmUgc2VhcmNoU3RyaW5nIGJiX2NvbW1vbl9idWZzaXoxCisKK2VudW0geworCVVTRVJTSVpFID0gc2l6ZW9mKHNlYXJjaFN0cmluZykgPiAxMDI0ID8gMTAyNAorCSAgICAgICAgIDogc2l6ZW9mKHNlYXJjaFN0cmluZykgLSAxLCAvKiBtYXggbGluZSBsZW5ndGggdHlwZWQgaW4gYnkgdXNlciAqLworCUlOSVRCVUZfU0laRSA9IDEwMjQsIC8qIGluaXRpYWwgYnVmZmVyIHNpemUgKi8KK307CisKK3N0cnVjdCBnbG9iYWxzIHsKKwlpbnQgY3VyTnVtOworCWludCBsYXN0TnVtOworCWludCBidWZVc2VkOworCWludCBidWZTaXplOworCUxJTkUgKmN1ckxpbmU7CisJY2hhciAqYnVmQmFzZTsKKwljaGFyICpidWZQdHI7CisJY2hhciAqZmlsZU5hbWU7CisJTElORSBsaW5lczsKKwlzbWFsbGludCBkaXJ0eTsKKwlpbnQgbWFya3NbMjZdOworfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBjdXJMaW5lICAgICAgICAgICAgKEcuY3VyTGluZSAgICAgICAgICAgKQorI2RlZmluZSBidWZCYXNlICAgICAgICAgICAgKEcuYnVmQmFzZSAgICAgICAgICAgKQorI2RlZmluZSBidWZQdHIgICAgICAgICAgICAgKEcuYnVmUHRyICAgICAgICAgICAgKQorI2RlZmluZSBmaWxlTmFtZSAgICAgICAgICAgKEcuZmlsZU5hbWUgICAgICAgICAgKQorI2RlZmluZSBjdXJOdW0gICAgICAgICAgICAgKEcuY3VyTnVtICAgICAgICAgICAgKQorI2RlZmluZSBsYXN0TnVtICAgICAgICAgICAgKEcubGFzdE51bSAgICAgICAgICAgKQorI2RlZmluZSBidWZVc2VkICAgICAgICAgICAgKEcuYnVmVXNlZCAgICAgICAgICAgKQorI2RlZmluZSBidWZTaXplICAgICAgICAgICAgKEcuYnVmU2l6ZSAgICAgICAgICAgKQorI2RlZmluZSBkaXJ0eSAgICAgICAgICAgICAgKEcuZGlydHkgICAgICAgICAgICAgKQorI2RlZmluZSBsaW5lcyAgICAgICAgICAgICAgKEcubGluZXMgICAgICAgICAgICAgKQorI2RlZmluZSBtYXJrcyAgICAgICAgICAgICAgKEcubWFya3MgICAgICAgICAgICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorfSB3aGlsZSAoMCkKKworCitzdGF0aWMgdm9pZCBkb0NvbW1hbmRzKHZvaWQpOworc3RhdGljIHZvaWQgc3ViQ29tbWFuZChjb25zdCBjaGFyICpjbWQsIGludCBudW0xLCBpbnQgbnVtMik7CitzdGF0aWMgaW50IGdldE51bShjb25zdCBjaGFyICoqcmV0Y3AsIHNtYWxsaW50ICpyZXRIYXZlTnVtLCBpbnQgKnJldE51bSk7CitzdGF0aWMgaW50IHNldEN1ck51bShpbnQgbnVtKTsKK3N0YXRpYyB2b2lkIGFkZExpbmVzKGludCBudW0pOworc3RhdGljIGludCBpbnNlcnRMaW5lKGludCBudW0sIGNvbnN0IGNoYXIgKmRhdGEsIGludCBsZW4pOworc3RhdGljIHZvaWQgZGVsZXRlTGluZXMoaW50IG51bTEsIGludCBudW0yKTsKK3N0YXRpYyBpbnQgcHJpbnRMaW5lcyhpbnQgbnVtMSwgaW50IG51bTIsIGludCBleHBhbmRGbGFnKTsKK3N0YXRpYyBpbnQgd3JpdGVMaW5lcyhjb25zdCBjaGFyICpmaWxlLCBpbnQgbnVtMSwgaW50IG51bTIpOworc3RhdGljIGludCByZWFkTGluZXMoY29uc3QgY2hhciAqZmlsZSwgaW50IG51bSk7CitzdGF0aWMgaW50IHNlYXJjaExpbmVzKGNvbnN0IGNoYXIgKnN0ciwgaW50IG51bTEsIGludCBudW0yKTsKK3N0YXRpYyBMSU5FICpmaW5kTGluZShpbnQgbnVtKTsKK3N0YXRpYyBpbnQgZmluZFN0cmluZyhjb25zdCBMSU5FICpscCwgY29uc3QgY2hhciAqIHN0ciwgaW50IGxlbiwgaW50IG9mZnNldCk7CisKKworc3RhdGljIGludCBiYWRfbnVtcyhpbnQgbnVtMSwgaW50IG51bTIsIGNvbnN0IGNoYXIgKmZvcl93aGF0KQoreworCWlmICgobnVtMSA8IDEpIHx8IChudW0yID4gbGFzdE51bSkgfHwgKG51bTEgPiBudW0yKSkgeworCQliYl9lcnJvcl9tc2coImJhZCBsaW5lIHJhbmdlIGZvciAlcyIsIGZvcl93aGF0KTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisKK3N0YXRpYyBjaGFyICpza2lwX2JsYW5rKGNvbnN0IGNoYXIgKmNwKQoreworCXdoaWxlIChpc2JsYW5rKCpjcCkpCisJCWNwKys7CisJcmV0dXJuIChjaGFyICopY3A7Cit9CisKKworaW50IGVkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBlZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJSU5JVF9HKCk7CisKKwlidWZTaXplID0gSU5JVEJVRl9TSVpFOworCWJ1ZkJhc2UgPSB4bWFsbG9jKGJ1ZlNpemUpOworCWJ1ZlB0ciA9IGJ1ZkJhc2U7CisJbGluZXMubmV4dCA9ICZsaW5lczsKKwlsaW5lcy5wcmV2ID0gJmxpbmVzOworCisJaWYgKGFyZ3ZbMV0pIHsKKwkJZmlsZU5hbWUgPSB4c3RyZHVwKGFyZ3ZbMV0pOworCQlpZiAoIXJlYWRMaW5lcyhmaWxlTmFtZSwgMSkpIHsKKwkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCX0KKwkJaWYgKGxhc3ROdW0pCisJCQlzZXRDdXJOdW0oMSk7CisJCWRpcnR5ID0gRkFMU0U7CisJfQorCisJZG9Db21tYW5kcygpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKKy8qCisgKiBSZWFkIGNvbW1hbmRzIHVudGlsIHdlIGFyZSB0b2xkIHRvIHN0b3AuCisgKi8KK3N0YXRpYyB2b2lkIGRvQ29tbWFuZHModm9pZCkKK3sKKwljb25zdCBjaGFyICpjcDsKKwljaGFyICplbmRidWYsIGJ1ZltVU0VSU0laRV07CisJaW50IGxlbiwgbnVtMSwgbnVtMjsKKwlzbWFsbGludCBoYXZlMSwgaGF2ZTI7CisKKwl3aGlsZSAoVFJVRSkgeworCQkvKiBSZXR1cm5zOgorCQkgKiAtMSBvbiByZWFkIGVycm9ycyBvciBFT0YsIG9yIG9uIGJhcmUgQ3RybC1ELgorCQkgKiAwICBvbiBjdHJsLUMsCisJCSAqID4wIGxlbmd0aCBvZiBpbnB1dCBzdHJpbmcsIGluY2x1ZGluZyB0ZXJtaW5hdGluZyAnXG4nCisJCSAqLworCQlsZW4gPSByZWFkX2xpbmVfaW5wdXQoTlVMTCwgIjogIiwgYnVmLCBzaXplb2YoYnVmKSwgLyp0aW1lb3V0Ki8gLTEpOworCQlpZiAobGVuIDw9IDApCisJCQlyZXR1cm47CisJCWVuZGJ1ZiA9ICZidWZbbGVuIC0gMV07CisJCXdoaWxlICgoZW5kYnVmID4gYnVmKSAmJiBpc2JsYW5rKGVuZGJ1ZlstMV0pKQorCQkJZW5kYnVmLS07CisJCSplbmRidWYgPSAnXDAnOworCisJCWNwID0gc2tpcF9ibGFuayhidWYpOworCQloYXZlMSA9IEZBTFNFOworCQloYXZlMiA9IEZBTFNFOworCisJCWlmICgoY3VyTnVtID09IDApICYmIChsYXN0TnVtID4gMCkpIHsKKwkJCWN1ck51bSA9IDE7CisJCQljdXJMaW5lID0gbGluZXMubmV4dDsKKwkJfQorCisJCWlmICghZ2V0TnVtKCZjcCwgJmhhdmUxLCAmbnVtMSkpCisJCQljb250aW51ZTsKKworCQljcCA9IHNraXBfYmxhbmsoY3ApOworCisJCWlmICgqY3AgPT0gJywnKSB7CisJCQljcCsrOworCQkJaWYgKCFnZXROdW0oJmNwLCAmaGF2ZTIsICZudW0yKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghaGF2ZTEpCisJCQkJbnVtMSA9IDE7CisJCQlpZiAoIWhhdmUyKQorCQkJCW51bTIgPSBsYXN0TnVtOworCQkJaGF2ZTEgPSBUUlVFOworCQkJaGF2ZTIgPSBUUlVFOworCQl9CisJCWlmICghaGF2ZTEpCisJCQludW0xID0gY3VyTnVtOworCQlpZiAoIWhhdmUyKQorCQkJbnVtMiA9IG51bTE7CisKKwkJc3dpdGNoICgqY3ArKykgeworCQljYXNlICdhJzoKKwkJCWFkZExpbmVzKG51bTEgKyAxKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ2MnOgorCQkJZGVsZXRlTGluZXMobnVtMSwgbnVtMik7CisJCQlhZGRMaW5lcyhudW0xKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ2QnOgorCQkJZGVsZXRlTGluZXMobnVtMSwgbnVtMik7CisJCQlicmVhazsKKworCQljYXNlICdmJzoKKwkJCWlmICgqY3AgJiYgIWlzYmxhbmsoKmNwKSkgeworCQkJCWJiX2Vycm9yX21zZygiYmFkIGZpbGUgY29tbWFuZCIpOworCQkJCWJyZWFrOworCQkJfQorCQkJY3AgPSBza2lwX2JsYW5rKGNwKTsKKwkJCWlmICgqY3AgPT0gJ1wwJykgeworCQkJCWlmIChmaWxlTmFtZSkKKwkJCQkJcHJpbnRmKCJcIiVzXCJcbiIsIGZpbGVOYW1lKTsKKwkJCQllbHNlCisJCQkJCXB1dHMoIk5vIGZpbGUgbmFtZSIpOworCQkJCWJyZWFrOworCQkJfQorCQkJZnJlZShmaWxlTmFtZSk7CisJCQlmaWxlTmFtZSA9IHhzdHJkdXAoY3ApOworCQkJYnJlYWs7CisKKwkJY2FzZSAnaSc6CisJCQlhZGRMaW5lcyhudW0xKTsKKwkJCWJyZWFrOworCisJCWNhc2UgJ2snOgorCQkJY3AgPSBza2lwX2JsYW5rKGNwKTsKKwkJCWlmICgoKmNwIDwgJ2EnKSB8fCAoKmNwID4gJ3onKSB8fCBjcFsxXSkgeworCQkJCWJiX2Vycm9yX21zZygiYmFkIG1hcmsgbmFtZSIpOworCQkJCWJyZWFrOworCQkJfQorCQkJbWFya3NbKmNwIC0gJ2EnXSA9IG51bTI7CisJCQlicmVhazsKKworCQljYXNlICdsJzoKKwkJCXByaW50TGluZXMobnVtMSwgbnVtMiwgVFJVRSk7CisJCQlicmVhazsKKworCQljYXNlICdwJzoKKwkJCXByaW50TGluZXMobnVtMSwgbnVtMiwgRkFMU0UpOworCQkJYnJlYWs7CisKKwkJY2FzZSAncSc6CisJCQljcCA9IHNraXBfYmxhbmsoY3ApOworCQkJaWYgKGhhdmUxIHx8ICpjcCkgeworCQkJCWJiX2Vycm9yX21zZygiYmFkIHF1aXQgY29tbWFuZCIpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFkaXJ0eSkKKwkJCQlyZXR1cm47CisJCQlsZW4gPSByZWFkX2xpbmVfaW5wdXQoTlVMTCwgIlJlYWxseSBxdWl0PyAiLCBidWYsIDE2LCAvKnRpbWVvdXQqLyAtMSk7CisJCQkvKiByZWFkIGVycm9yL0VPRiAtIG5vIHdheSB0byBjb250aW51ZSAqLworCQkJaWYgKGxlbiA8IDApCisJCQkJcmV0dXJuOworCQkJY3AgPSBza2lwX2JsYW5rKGJ1Zik7CisJCQlpZiAoKCpjcCB8IDB4MjApID09ICd5JykgLyogWSBvciB5ICovCisJCQkJcmV0dXJuOworCQkJYnJlYWs7CisKKwkJY2FzZSAncic6CisJCQlpZiAoKmNwICYmICFpc2JsYW5rKCpjcCkpIHsKKwkJCQliYl9lcnJvcl9tc2coImJhZCByZWFkIGNvbW1hbmQiKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNwID0gc2tpcF9ibGFuayhjcCk7CisJCQlpZiAoKmNwID09ICdcMCcpIHsKKwkJCQliYl9lcnJvcl9tc2coIm5vIGZpbGUgbmFtZSIpOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCFoYXZlMSkKKwkJCQludW0xID0gbGFzdE51bTsKKwkJCWlmIChyZWFkTGluZXMoY3AsIG51bTEgKyAxKSkKKwkJCQlicmVhazsKKwkJCWlmIChmaWxlTmFtZSA9PSBOVUxMKQorCQkJCWZpbGVOYW1lID0geHN0cmR1cChjcCk7CisJCQlicmVhazsKKworCQljYXNlICdzJzoKKwkJCXN1YkNvbW1hbmQoY3AsIG51bTEsIG51bTIpOworCQkJYnJlYWs7CisKKwkJY2FzZSAndyc6CisJCQlpZiAoKmNwICYmICFpc2JsYW5rKCpjcCkpIHsKKwkJCQliYl9lcnJvcl9tc2coImJhZCB3cml0ZSBjb21tYW5kIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQljcCA9IHNraXBfYmxhbmsoY3ApOworCQkJaWYgKCFoYXZlMSkgeworCQkJCW51bTEgPSAxOworCQkJCW51bTIgPSBsYXN0TnVtOworCQkJfQorCQkJaWYgKCpjcCA9PSAnXDAnKQorCQkJCWNwID0gZmlsZU5hbWU7CisJCQlpZiAoY3AgPT0gTlVMTCkgeworCQkJCWJiX2Vycm9yX21zZygibm8gZmlsZSBuYW1lIHNwZWNpZmllZCIpOworCQkJCWJyZWFrOworCQkJfQorCQkJd3JpdGVMaW5lcyhjcCwgbnVtMSwgbnVtMik7CisJCQlicmVhazsKKworCQljYXNlICd6JzoKKwkJCXN3aXRjaCAoKmNwKSB7CisJCQljYXNlICctJzoKKwkJCQlwcmludExpbmVzKGN1ck51bSAtIDIxLCBjdXJOdW0sIEZBTFNFKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJy4nOgorCQkJCXByaW50TGluZXMoY3VyTnVtIC0gMTEsIGN1ck51bSArIDEwLCBGQUxTRSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXByaW50TGluZXMoY3VyTnVtLCBjdXJOdW0gKyAyMSwgRkFMU0UpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSAnLic6CisJCQlpZiAoaGF2ZTEpIHsKKwkJCQliYl9lcnJvcl9tc2coIm5vIGFyZ3VtZW50cyBhbGxvd2VkIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQlwcmludExpbmVzKGN1ck51bSwgY3VyTnVtLCBGQUxTRSk7CisJCQlicmVhazsKKworCQljYXNlICctJzoKKwkJCWlmIChzZXRDdXJOdW0oY3VyTnVtIC0gMSkpCisJCQkJcHJpbnRMaW5lcyhjdXJOdW0sIGN1ck51bSwgRkFMU0UpOworCQkJYnJlYWs7CisKKwkJY2FzZSAnPSc6CisJCQlwcmludGYoIiVkXG4iLCBudW0xKTsKKwkJCWJyZWFrOworCQljYXNlICdcMCc6CisJCQlpZiAoaGF2ZTEpIHsKKwkJCQlwcmludExpbmVzKG51bTIsIG51bTIsIEZBTFNFKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzZXRDdXJOdW0oY3VyTnVtICsgMSkpCisJCQkJcHJpbnRMaW5lcyhjdXJOdW0sIGN1ck51bSwgRkFMU0UpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWJiX2Vycm9yX21zZygidW5pbXBsZW1lbnRlZCBjb21tYW5kIik7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworCisvKgorICogRG8gdGhlIHN1YnN0aXR1dGUgY29tbWFuZC4KKyAqIFRoZSBjdXJyZW50IGxpbmUgaXMgc2V0IHRvIHRoZSBsYXN0IHN1YnN0aXR1dGlvbiBkb25lLgorICovCitzdGF0aWMgdm9pZCBzdWJDb21tYW5kKGNvbnN0IGNoYXIgKmNtZCwgaW50IG51bTEsIGludCBudW0yKQoreworCWNoYXIgKmNwLCAqb2xkU3RyLCAqbmV3U3RyLCBidWZbVVNFUlNJWkVdOworCWludCBkZWxpbSwgb2xkTGVuLCBuZXdMZW4sIGRlbHRhTGVuLCBvZmZzZXQ7CisJTElORSAqbHAsICpubHA7CisJaW50IGdsb2JhbEZsYWcsIHByaW50RmxhZywgZGlkU3ViLCBuZWVkUHJpbnQ7CisKKwlpZiAoYmFkX251bXMobnVtMSwgbnVtMiwgInN1YnN0aXR1dGUiKSkKKwkJcmV0dXJuOworCisJZ2xvYmFsRmxhZyA9IEZBTFNFOworCXByaW50RmxhZyA9IEZBTFNFOworCWRpZFN1YiA9IEZBTFNFOworCW5lZWRQcmludCA9IEZBTFNFOworCisJLyoKKwkgKiBDb3B5IHRoZSBjb21tYW5kIHNvIHdlIGNhbiBtb2RpZnkgaXQuCisJICovCisJc3RyY3B5KGJ1ZiwgY21kKTsKKwljcCA9IGJ1ZjsKKworCWlmIChpc2JsYW5rKCpjcCkgfHwgKCpjcCA9PSAnXDAnKSkgeworCQliYl9lcnJvcl9tc2coImJhZCBkZWxpbWl0ZXIgZm9yIHN1YnN0aXR1dGUiKTsKKwkJcmV0dXJuOworCX0KKworCWRlbGltID0gKmNwKys7CisJb2xkU3RyID0gY3A7CisKKwljcCA9IHN0cmNocihjcCwgZGVsaW0pOworCWlmIChjcCA9PSBOVUxMKSB7CisJCWJiX2Vycm9yX21zZygibWlzc2luZyAybmQgZGVsaW1pdGVyIGZvciBzdWJzdGl0dXRlIik7CisJCXJldHVybjsKKwl9CisKKwkqY3ArKyA9ICdcMCc7CisKKwluZXdTdHIgPSBjcDsKKwljcCA9IHN0cmNocihjcCwgZGVsaW0pOworCisJaWYgKGNwKQorCQkqY3ArKyA9ICdcMCc7CisJZWxzZQorCQljcCA9IChjaGFyKikiIjsKKworCXdoaWxlICgqY3ApIHN3aXRjaCAoKmNwKyspIHsKKwkJY2FzZSAnZyc6CisJCQlnbG9iYWxGbGFnID0gVFJVRTsKKwkJCWJyZWFrOworCQljYXNlICdwJzoKKwkJCXByaW50RmxhZyA9IFRSVUU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJiX2Vycm9yX21zZygidW5rbm93biBvcHRpb24gZm9yIHN1YnN0aXR1dGUiKTsKKwkJCXJldHVybjsKKwl9CisKKwlpZiAoKm9sZFN0ciA9PSAnXDAnKSB7CisJCWlmIChzZWFyY2hTdHJpbmdbMF0gPT0gJ1wwJykgeworCQkJYmJfZXJyb3JfbXNnKCJubyBwcmV2aW91cyBzZWFyY2ggc3RyaW5nIik7CisJCQlyZXR1cm47CisJCX0KKwkJb2xkU3RyID0gc2VhcmNoU3RyaW5nOworCX0KKworCWlmIChvbGRTdHIgIT0gc2VhcmNoU3RyaW5nKQorCQlzdHJjcHkoc2VhcmNoU3RyaW5nLCBvbGRTdHIpOworCisJbHAgPSBmaW5kTGluZShudW0xKTsKKwlpZiAobHAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJb2xkTGVuID0gc3RybGVuKG9sZFN0cik7CisJbmV3TGVuID0gc3RybGVuKG5ld1N0cik7CisJZGVsdGFMZW4gPSBuZXdMZW4gLSBvbGRMZW47CisJb2Zmc2V0ID0gMDsKKwlubHAgPSBOVUxMOworCisJd2hpbGUgKG51bTEgPD0gbnVtMikgeworCQlvZmZzZXQgPSBmaW5kU3RyaW5nKGxwLCBvbGRTdHIsIG9sZExlbiwgb2Zmc2V0KTsKKworCQlpZiAob2Zmc2V0IDwgMCkgeworCQkJaWYgKG5lZWRQcmludCkgeworCQkJCXByaW50TGluZXMobnVtMSwgbnVtMSwgRkFMU0UpOworCQkJCW5lZWRQcmludCA9IEZBTFNFOworCQkJfQorCQkJb2Zmc2V0ID0gMDsKKwkJCWxwID0gbHAtPm5leHQ7CisJCQludW0xKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCW5lZWRQcmludCA9IHByaW50RmxhZzsKKwkJZGlkU3ViID0gVFJVRTsKKwkJZGlydHkgPSBUUlVFOworCisJCS8qCisJCSAqIElmIHRoZSByZXBsYWNlbWVudCBzdHJpbmcgaXMgdGhlIHNhbWUgc2l6ZSBvciBzaG9ydGVyCisJCSAqIHRoYW4gdGhlIG9sZCBzdHJpbmcsIHRoZW4gdGhlIHN1YnN0aXR1dGlvbiBpcyBlYXN5LgorCQkgKi8KKwkJaWYgKGRlbHRhTGVuIDw9IDApIHsKKwkJCW1lbWNweSgmbHAtPmRhdGFbb2Zmc2V0XSwgbmV3U3RyLCBuZXdMZW4pOworCQkJaWYgKGRlbHRhTGVuKSB7CisJCQkJbWVtY3B5KCZscC0+ZGF0YVtvZmZzZXQgKyBuZXdMZW5dLAorCQkJCQkmbHAtPmRhdGFbb2Zmc2V0ICsgb2xkTGVuXSwKKwkJCQkJbHAtPmxlbiAtIG9mZnNldCAtIG9sZExlbik7CisKKwkJCQlscC0+bGVuICs9IGRlbHRhTGVuOworCQkJfQorCQkJb2Zmc2V0ICs9IG5ld0xlbjsKKwkJCWlmIChnbG9iYWxGbGFnKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKG5lZWRQcmludCkgeworCQkJCXByaW50TGluZXMobnVtMSwgbnVtMSwgRkFMU0UpOworCQkJCW5lZWRQcmludCA9IEZBTFNFOworCQkJfQorCQkJbHAgPSBscC0+bmV4dDsKKwkJCW51bTErKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogVGhlIG5ldyBzdHJpbmcgaXMgbGFyZ2VyLCBzbyBhbGxvY2F0ZSBhIG5ldyBsaW5lCisJCSAqIHN0cnVjdHVyZSBhbmQgdXNlIHRoYXQuICBMaW5rIGl0IGluIHBsYWNlIG9mCisJCSAqIHRoZSBvbGQgbGluZSBzdHJ1Y3R1cmUuCisJCSAqLworCQlubHAgPSB4bWFsbG9jKHNpemVvZihMSU5FKSArIGxwLT5sZW4gKyBkZWx0YUxlbik7CisKKwkJbmxwLT5sZW4gPSBscC0+bGVuICsgZGVsdGFMZW47CisKKwkJbWVtY3B5KG5scC0+ZGF0YSwgbHAtPmRhdGEsIG9mZnNldCk7CisJCW1lbWNweSgmbmxwLT5kYXRhW29mZnNldF0sIG5ld1N0ciwgbmV3TGVuKTsKKwkJbWVtY3B5KCZubHAtPmRhdGFbb2Zmc2V0ICsgbmV3TGVuXSwKKwkJCSZscC0+ZGF0YVtvZmZzZXQgKyBvbGRMZW5dLAorCQkJbHAtPmxlbiAtIG9mZnNldCAtIG9sZExlbik7CisKKwkJbmxwLT5uZXh0ID0gbHAtPm5leHQ7CisJCW5scC0+cHJldiA9IGxwLT5wcmV2OworCQlubHAtPnByZXYtPm5leHQgPSBubHA7CisJCW5scC0+bmV4dC0+cHJldiA9IG5scDsKKworCQlpZiAoY3VyTGluZSA9PSBscCkKKwkJCWN1ckxpbmUgPSBubHA7CisKKwkJZnJlZShscCk7CisJCWxwID0gbmxwOworCisJCW9mZnNldCArPSBuZXdMZW47CisKKwkJaWYgKGdsb2JhbEZsYWcpCisJCQljb250aW51ZTsKKworCQlpZiAobmVlZFByaW50KSB7CisJCQlwcmludExpbmVzKG51bTEsIG51bTEsIEZBTFNFKTsKKwkJCW5lZWRQcmludCA9IEZBTFNFOworCQl9CisKKwkJbHAgPSBscC0+bmV4dDsKKwkJbnVtMSsrOworCX0KKworCWlmICghZGlkU3ViKQorCQliYl9lcnJvcl9tc2coIm5vIHN1YnN0aXR1dGlvbnMgZm91bmQgZm9yIFwiJXNcIiIsIG9sZFN0cik7Cit9CisKKworLyoKKyAqIFNlYXJjaCBhIGxpbmUgZm9yIHRoZSBzcGVjaWZpZWQgc3RyaW5nIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQKKyAqIG9mZnNldCBpbiB0aGUgbGluZS4gIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgZm91bmQgc3RyaW5nLCBvciAtMS4KKyAqLworc3RhdGljIGludCBmaW5kU3RyaW5nKGNvbnN0IExJTkUgKmxwLCBjb25zdCBjaGFyICpzdHIsIGludCBsZW4sIGludCBvZmZzZXQpCit7CisJaW50IGxlZnQ7CisJY29uc3QgY2hhciAqY3AsICpuY3A7CisKKwljcCA9ICZscC0+ZGF0YVtvZmZzZXRdOworCWxlZnQgPSBscC0+bGVuIC0gb2Zmc2V0OworCisJd2hpbGUgKGxlZnQgPj0gbGVuKSB7CisJCW5jcCA9IG1lbWNocihjcCwgKnN0ciwgbGVmdCk7CisJCWlmIChuY3AgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKwkJbGVmdCAtPSAobmNwIC0gY3ApOworCQlpZiAobGVmdCA8IGxlbikKKwkJCXJldHVybiAtMTsKKwkJY3AgPSBuY3A7CisJCWlmIChtZW1jbXAoY3AsIHN0ciwgbGVuKSA9PSAwKQorCQkJcmV0dXJuIChjcCAtIGxwLT5kYXRhKTsKKwkJY3ArKzsKKwkJbGVmdC0tOworCX0KKworCXJldHVybiAtMTsKK30KKworCisvKgorICogQWRkIGxpbmVzIHdoaWNoIGFyZSB0eXBlZCBpbiBieSB0aGUgdXNlci4KKyAqIFRoZSBsaW5lcyBhcmUgaW5zZXJ0ZWQganVzdCBiZWZvcmUgdGhlIHNwZWNpZmllZCBsaW5lIG51bWJlci4KKyAqIFRoZSBsaW5lcyBhcmUgdGVybWluYXRlZCBieSBhIGxpbmUgY29udGFpbmluZyBhIHNpbmdsZSBkb3QgKHVnbHkhKSwKKyAqIG9yIGJ5IGFuIGVuZCBvZiBmaWxlLgorICovCitzdGF0aWMgdm9pZCBhZGRMaW5lcyhpbnQgbnVtKQoreworCWludCBsZW47CisJY2hhciBidWZbVVNFUlNJWkUgKyAxXTsKKworCXdoaWxlICgxKSB7CisJCS8qIFJldHVybnM6CisJCSAqIC0xIG9uIHJlYWQgZXJyb3JzIG9yIEVPRiwgb3Igb24gYmFyZSBDdHJsLUQuCisJCSAqIDAgIG9uIGN0cmwtQywKKwkJICogPjAgbGVuZ3RoIG9mIGlucHV0IHN0cmluZywgaW5jbHVkaW5nIHRlcm1pbmF0aW5nICdcbicKKwkJICovCisJCWxlbiA9IHJlYWRfbGluZV9pbnB1dChOVUxMLCAiIiwgYnVmLCBzaXplb2YoYnVmKSwgLyp0aW1lb3V0Ki8gLTEpOworCQlpZiAobGVuIDw9IDApIHsKKwkJCS8qIFByZXZpb3VzbHksIGN0cmwtQyB3YXMgZXhpdGluZyB0byBzaGVsbC4KKwkJCSAqIE5vdyB3ZSBleGl0IHRvIGVkIHByb21wdC4gSXMgaW4gaW1wb3J0YW50PyAqLworCQkJcmV0dXJuOworCQl9CisJCWlmICgoYnVmWzBdID09ICcuJykgJiYgKGJ1ZlsxXSA9PSAnXG4nKSAmJiAoYnVmWzJdID09ICdcMCcpKQorCQkJcmV0dXJuOworCQlpZiAoIWluc2VydExpbmUobnVtKyssIGJ1ZiwgbGVuKSkKKwkJCXJldHVybjsKKwl9Cit9CisKKworLyoKKyAqIFBhcnNlIGEgbGluZSBudW1iZXIgYXJndW1lbnQgaWYgaXQgaXMgcHJlc2VudC4gIFRoaXMgaXMgYSBzdW0KKyAqIG9yIGRpZmZlcmVuY2Ugb2YgbnVtYmVycywgJy4nLCAnJCcsICd4LCBvciBhIHNlYXJjaCBzdHJpbmcuCisgKiBSZXR1cm5zIFRSVUUgaWYgc3VjY2Vzc2Z1bCAod2hldGhlciBvciBub3QgdGhlcmUgd2FzIGEgbnVtYmVyKS4KKyAqIFJldHVybnMgRkFMU0UgaWYgdGhlcmUgd2FzIGEgcGFyc2luZyBlcnJvciwgd2l0aCBhIG1lc3NhZ2Ugb3V0cHV0LgorICogV2hldGhlciB0aGVyZSB3YXMgYSBudW1iZXIgaXMgcmV0dXJuZWQgaW5kaXJlY3RseSwgYXMgaXMgdGhlIG51bWJlci4KKyAqIFRoZSBjaGFyYWN0ZXIgcG9pbnRlciB3aGljaCBzdG9wcGVkIHRoZSBzY2FuIGlzIGFsc28gcmV0dXJuZWQuCisgKi8KK3N0YXRpYyBpbnQgZ2V0TnVtKGNvbnN0IGNoYXIgKipyZXRjcCwgc21hbGxpbnQgKnJldEhhdmVOdW0sIGludCAqcmV0TnVtKQoreworCWNvbnN0IGNoYXIgKmNwOworCWNoYXIgKmVuZFN0ciwgc3RyW1VTRVJTSVpFXTsKKwlpbnQgdmFsdWUsIG51bTsKKwlzbWFsbGludCBoYXZlTnVtLCBtaW51czsKKworCWNwID0gKnJldGNwOworCXZhbHVlID0gMDsKKwloYXZlTnVtID0gRkFMU0U7CisJbWludXMgPSAwOworCisJd2hpbGUgKFRSVUUpIHsKKwkJY3AgPSBza2lwX2JsYW5rKGNwKTsKKworCQlzd2l0Y2ggKCpjcCkgeworCQkJY2FzZSAnLic6CisJCQkJaGF2ZU51bSA9IFRSVUU7CisJCQkJbnVtID0gY3VyTnVtOworCQkJCWNwKys7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgJyQnOgorCQkJCWhhdmVOdW0gPSBUUlVFOworCQkJCW51bSA9IGxhc3ROdW07CisJCQkJY3ArKzsKKwkJCQlicmVhazsKKworCQkJY2FzZSAnXCcnOgorCQkJCWNwKys7CisJCQkJaWYgKCgqY3AgPCAnYScpIHx8ICgqY3AgPiAneicpKSB7CisJCQkJCWJiX2Vycm9yX21zZygiYmFkIG1hcmsgbmFtZSIpOworCQkJCQlyZXR1cm4gRkFMU0U7CisJCQkJfQorCQkJCWhhdmVOdW0gPSBUUlVFOworCQkJCW51bSA9IG1hcmtzWypjcCsrIC0gJ2EnXTsKKwkJCQlicmVhazsKKworCQkJY2FzZSAnLyc6CisJCQkJc3RyY3B5KHN0ciwgKytjcCk7CisJCQkJZW5kU3RyID0gc3RyY2hyKHN0ciwgJy8nKTsKKwkJCQlpZiAoZW5kU3RyKSB7CisJCQkJCSplbmRTdHIrKyA9ICdcMCc7CisJCQkJCWNwICs9IChlbmRTdHIgLSBzdHIpOworCQkJCX0gZWxzZQorCQkJCQljcCA9ICIiOworCQkJCW51bSA9IHNlYXJjaExpbmVzKHN0ciwgY3VyTnVtLCBsYXN0TnVtKTsKKwkJCQlpZiAobnVtID09IDApCisJCQkJCXJldHVybiBGQUxTRTsKKwkJCQloYXZlTnVtID0gVFJVRTsKKwkJCQlicmVhazsKKworCQkJZGVmYXVsdDoKKwkJCQlpZiAoIWlzZGlnaXQoKmNwKSkgeworCQkJCQkqcmV0Y3AgPSBjcDsKKwkJCQkJKnJldEhhdmVOdW0gPSBoYXZlTnVtOworCQkJCQkqcmV0TnVtID0gdmFsdWU7CisJCQkJCXJldHVybiBUUlVFOworCQkJCX0KKwkJCQludW0gPSAwOworCQkJCXdoaWxlIChpc2RpZ2l0KCpjcCkpCisJCQkJCW51bSA9IG51bSAqIDEwICsgKmNwKysgLSAnMCc7CisJCQkJaGF2ZU51bSA9IFRSVUU7CisJCQkJYnJlYWs7CisJCX0KKworCQl2YWx1ZSArPSAobWludXMgPyAtbnVtIDogbnVtKTsKKworCQljcCA9IHNraXBfYmxhbmsoY3ApOworCisJCXN3aXRjaCAoKmNwKSB7CisJCQljYXNlICctJzoKKwkJCQltaW51cyA9IDE7CisJCQkJY3ArKzsKKwkJCQlicmVhazsKKworCQkJY2FzZSAnKyc6CisJCQkJbWludXMgPSAwOworCQkJCWNwKys7CisJCQkJYnJlYWs7CisKKwkJCWRlZmF1bHQ6CisJCQkJKnJldGNwID0gY3A7CisJCQkJKnJldEhhdmVOdW0gPSBoYXZlTnVtOworCQkJCSpyZXROdW0gPSB2YWx1ZTsKKwkJCQlyZXR1cm4gVFJVRTsKKwkJfQorCX0KK30KKworCisvKgorICogUmVhZCBsaW5lcyBmcm9tIGEgZmlsZSBhdCB0aGUgc3BlY2lmaWVkIGxpbmUgbnVtYmVyLgorICogUmV0dXJucyBUUlVFIGlmIHRoZSBmaWxlIHdhcyBzdWNjZXNzZnVsbHkgcmVhZC4KKyAqLworc3RhdGljIGludCByZWFkTGluZXMoY29uc3QgY2hhciAqZmlsZSwgaW50IG51bSkKK3sKKwlpbnQgZmQsIGNjOworCWludCBsZW4sIGxpbmVDb3VudCwgY2hhckNvdW50OworCWNoYXIgKmNwOworCisJaWYgKChudW0gPCAxKSB8fCAobnVtID4gbGFzdE51bSArIDEpKSB7CisJCWJiX2Vycm9yX21zZygiYmFkIGxpbmUgZm9yIHJlYWQiKTsKKwkJcmV0dXJuIEZBTFNFOworCX0KKworCWZkID0gb3BlbihmaWxlLCAwKTsKKwlpZiAoZmQgPCAwKSB7CisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZpbGUpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJYnVmUHRyID0gYnVmQmFzZTsKKwlidWZVc2VkID0gMDsKKwlsaW5lQ291bnQgPSAwOworCWNoYXJDb3VudCA9IDA7CisJY2MgPSAwOworCisJcHJpbnRmKCJcIiVzXCIsICIsIGZpbGUpOworCWZmbHVzaF9hbGwoKTsKKworCWRvIHsKKwkJY3AgPSBtZW1jaHIoYnVmUHRyLCAnXG4nLCBidWZVc2VkKTsKKworCQlpZiAoY3ApIHsKKwkJCWxlbiA9IChjcCAtIGJ1ZlB0cikgKyAxOworCQkJaWYgKCFpbnNlcnRMaW5lKG51bSwgYnVmUHRyLCBsZW4pKSB7CisJCQkJY2xvc2UoZmQpOworCQkJCXJldHVybiBGQUxTRTsKKwkJCX0KKwkJCWJ1ZlB0ciArPSBsZW47CisJCQlidWZVc2VkIC09IGxlbjsKKwkJCWNoYXJDb3VudCArPSBsZW47CisJCQlsaW5lQ291bnQrKzsKKwkJCW51bSsrOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoYnVmUHRyICE9IGJ1ZkJhc2UpIHsKKwkJCW1lbWNweShidWZCYXNlLCBidWZQdHIsIGJ1ZlVzZWQpOworCQkJYnVmUHRyID0gYnVmQmFzZSArIGJ1ZlVzZWQ7CisJCX0KKworCQlpZiAoYnVmVXNlZCA+PSBidWZTaXplKSB7CisJCQlsZW4gPSAoYnVmU2l6ZSAqIDMpIC8gMjsKKwkJCWNwID0geHJlYWxsb2MoYnVmQmFzZSwgbGVuKTsKKwkJCWJ1ZkJhc2UgPSBjcDsKKwkJCWJ1ZlB0ciA9IGJ1ZkJhc2UgKyBidWZVc2VkOworCQkJYnVmU2l6ZSA9IGxlbjsKKwkJfQorCisJCWNjID0gc2FmZV9yZWFkKGZkLCBidWZQdHIsIGJ1ZlNpemUgLSBidWZVc2VkKTsKKwkJYnVmVXNlZCArPSBjYzsKKwkJYnVmUHRyID0gYnVmQmFzZTsKKwl9IHdoaWxlIChjYyA+IDApOworCisJaWYgKGNjIDwgMCkgeworCQliYl9zaW1wbGVfcGVycm9yX21zZyhmaWxlKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJaWYgKGJ1ZlVzZWQpIHsKKwkJaWYgKCFpbnNlcnRMaW5lKG51bSwgYnVmUHRyLCBidWZVc2VkKSkgeworCQkJY2xvc2UoZmQpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWxpbmVDb3VudCsrOworCQljaGFyQ291bnQgKz0gYnVmVXNlZDsKKwl9CisKKwljbG9zZShmZCk7CisKKwlwcmludGYoIiVkIGxpbmVzJXMsICVkIGNoYXJzXG4iLCBsaW5lQ291bnQsCisJCShidWZVc2VkID8gIiAoaW5jb21wbGV0ZSkiIDogIiIpLCBjaGFyQ291bnQpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKworLyoKKyAqIFdyaXRlIHRoZSBzcGVjaWZpZWQgbGluZXMgb3V0IHRvIHRoZSBzcGVjaWZpZWQgZmlsZS4KKyAqIFJldHVybnMgVFJVRSBpZiBzdWNjZXNzZnVsLCBvciBGQUxTRSBvbiBhbiBlcnJvciB3aXRoIGEgbWVzc2FnZSBvdXRwdXQuCisgKi8KK3N0YXRpYyBpbnQgd3JpdGVMaW5lcyhjb25zdCBjaGFyICpmaWxlLCBpbnQgbnVtMSwgaW50IG51bTIpCit7CisJTElORSAqbHA7CisJaW50IGZkLCBsaW5lQ291bnQsIGNoYXJDb3VudDsKKworCWlmIChiYWRfbnVtcyhudW0xLCBudW0yLCAid3JpdGUiKSkKKwkJcmV0dXJuIEZBTFNFOworCisJbGluZUNvdW50ID0gMDsKKwljaGFyQ291bnQgPSAwOworCisJZmQgPSBjcmVhdChmaWxlLCAwNjY2KTsKKwlpZiAoZmQgPCAwKSB7CisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZpbGUpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcHJpbnRmKCJcIiVzXCIsICIsIGZpbGUpOworCWZmbHVzaF9hbGwoKTsKKworCWxwID0gZmluZExpbmUobnVtMSk7CisJaWYgKGxwID09IE5VTEwpIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJd2hpbGUgKG51bTErKyA8PSBudW0yKSB7CisJCWlmIChmdWxsX3dyaXRlKGZkLCBscC0+ZGF0YSwgbHAtPmxlbikgIT0gbHAtPmxlbikgeworCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coZmlsZSk7CisJCQljbG9zZShmZCk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwkJY2hhckNvdW50ICs9IGxwLT5sZW47CisJCWxpbmVDb3VudCsrOworCQlscCA9IGxwLT5uZXh0OworCX0KKworCWlmIChjbG9zZShmZCkgPCAwKSB7CisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZpbGUpOworCQlyZXR1cm4gRkFMU0U7CisJfQorCisJcHJpbnRmKCIlZCBsaW5lcywgJWQgY2hhcnNcbiIsIGxpbmVDb3VudCwgY2hhckNvdW50KTsKKwlyZXR1cm4gVFJVRTsKK30KKworCisvKgorICogUHJpbnQgbGluZXMgaW4gYSBzcGVjaWZpZWQgcmFuZ2UuCisgKiBUaGUgbGFzdCBsaW5lIHByaW50ZWQgYmVjb21lcyB0aGUgY3VycmVudCBsaW5lLgorICogSWYgZXhwYW5kRmxhZyBpcyBUUlVFLCB0aGVuIHRoZSBsaW5lIGlzIHByaW50ZWQgc3BlY2lhbGx5IHRvCisgKiBzaG93IG1hZ2ljIGNoYXJhY3RlcnMuCisgKi8KK3N0YXRpYyBpbnQgcHJpbnRMaW5lcyhpbnQgbnVtMSwgaW50IG51bTIsIGludCBleHBhbmRGbGFnKQoreworCWNvbnN0IExJTkUgKmxwOworCWNvbnN0IGNoYXIgKmNwOworCWludCBjaCwgY291bnQ7CisKKwlpZiAoYmFkX251bXMobnVtMSwgbnVtMiwgInByaW50IikpCisJCXJldHVybiBGQUxTRTsKKworCWxwID0gZmluZExpbmUobnVtMSk7CisJaWYgKGxwID09IE5VTEwpCisJCXJldHVybiBGQUxTRTsKKworCXdoaWxlIChudW0xIDw9IG51bTIpIHsKKwkJaWYgKCFleHBhbmRGbGFnKSB7CisJCQl3cml0ZShTVERPVVRfRklMRU5PLCBscC0+ZGF0YSwgbHAtPmxlbik7CisJCQlzZXRDdXJOdW0obnVtMSsrKTsKKwkJCWxwID0gbHAtPm5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qCisJCSAqIFNob3cgY29udHJvbCBjaGFyYWN0ZXJzIGFuZCBjaGFyYWN0ZXJzIHdpdGggdGhlCisJCSAqIGhpZ2ggYml0IHNldCBzcGVjaWFsbHkuCisJCSAqLworCQljcCA9IGxwLT5kYXRhOworCQljb3VudCA9IGxwLT5sZW47CisKKwkJaWYgKChjb3VudCA+IDApICYmIChjcFtjb3VudCAtIDFdID09ICdcbicpKQorCQkJY291bnQtLTsKKworCQl3aGlsZSAoY291bnQtLSA+IDApIHsKKwkJCWNoID0gKHVuc2lnbmVkIGNoYXIpICpjcCsrOworCQkJZnB1dGNfcHJpbnRhYmxlKGNoIHwgUFJJTlRBQkxFX01FVEEsIHN0ZG91dCk7CisJCX0KKworCQlmcHV0cygiJFxuIiwgc3Rkb3V0KTsKKworCQlzZXRDdXJOdW0obnVtMSsrKTsKKwkJbHAgPSBscC0+bmV4dDsKKwl9CisKKwlyZXR1cm4gVFJVRTsKK30KKworCisvKgorICogSW5zZXJ0IGEgbmV3IGxpbmUgd2l0aCB0aGUgc3BlY2lmaWVkIHRleHQuCisgKiBUaGUgbGluZSBpcyBpbnNlcnRlZCBzbyBhcyB0byBiZWNvbWUgdGhlIHNwZWNpZmllZCBsaW5lLAorICogdGh1cyBwdXNoaW5nIGFueSBleGlzdGluZyBhbmQgZnVydGhlciBsaW5lcyBkb3duIG9uZS4KKyAqIFRoZSBpbnNlcnRlZCBsaW5lIGlzIGFsc28gc2V0IHRvIGJlY29tZSB0aGUgY3VycmVudCBsaW5lLgorICogUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwuCisgKi8KK3N0YXRpYyBpbnQgaW5zZXJ0TGluZShpbnQgbnVtLCBjb25zdCBjaGFyICpkYXRhLCBpbnQgbGVuKQoreworCUxJTkUgKm5ld0xwLCAqbHA7CisKKwlpZiAoKG51bSA8IDEpIHx8IChudW0gPiBsYXN0TnVtICsgMSkpIHsKKwkJYmJfZXJyb3JfbXNnKCJpbnNlcnRpbmcgYXQgYmFkIGxpbmUgbnVtYmVyIik7CisJCXJldHVybiBGQUxTRTsKKwl9CisKKwluZXdMcCA9IHhtYWxsb2Moc2l6ZW9mKExJTkUpICsgbGVuIC0gMSk7CisKKwltZW1jcHkobmV3THAtPmRhdGEsIGRhdGEsIGxlbik7CisJbmV3THAtPmxlbiA9IGxlbjsKKworCWlmIChudW0gPiBsYXN0TnVtKQorCQlscCA9ICZsaW5lczsKKwllbHNlIHsKKwkJbHAgPSBmaW5kTGluZShudW0pOworCQlpZiAobHAgPT0gTlVMTCkgeworCQkJZnJlZSgoY2hhciAqKSBuZXdMcCk7CisJCQlyZXR1cm4gRkFMU0U7CisJCX0KKwl9CisKKwluZXdMcC0+bmV4dCA9IGxwOworCW5ld0xwLT5wcmV2ID0gbHAtPnByZXY7CisJbHAtPnByZXYtPm5leHQgPSBuZXdMcDsKKwlscC0+cHJldiA9IG5ld0xwOworCisJbGFzdE51bSsrOworCWRpcnR5ID0gVFJVRTsKKwlyZXR1cm4gc2V0Q3VyTnVtKG51bSk7Cit9CisKKworLyoKKyAqIERlbGV0ZSBsaW5lcyBmcm9tIHRoZSBnaXZlbiByYW5nZS4KKyAqLworc3RhdGljIHZvaWQgZGVsZXRlTGluZXMoaW50IG51bTEsIGludCBudW0yKQoreworCUxJTkUgKmxwLCAqbmxwLCAqcGxwOworCWludCBjb3VudDsKKworCWlmIChiYWRfbnVtcyhudW0xLCBudW0yLCAiZGVsZXRlIikpCisJCXJldHVybjsKKworCWxwID0gZmluZExpbmUobnVtMSk7CisJaWYgKGxwID09IE5VTEwpCisJCXJldHVybjsKKworCWlmICgoY3VyTnVtID49IG51bTEpICYmIChjdXJOdW0gPD0gbnVtMikpIHsKKwkJaWYgKG51bTIgPCBsYXN0TnVtKQorCQkJc2V0Q3VyTnVtKG51bTIgKyAxKTsKKwkJZWxzZSBpZiAobnVtMSA+IDEpCisJCQlzZXRDdXJOdW0obnVtMSAtIDEpOworCQllbHNlCisJCQljdXJOdW0gPSAwOworCX0KKworCWNvdW50ID0gbnVtMiAtIG51bTEgKyAxOworCWlmIChjdXJOdW0gPiBudW0yKQorCQljdXJOdW0gLT0gY291bnQ7CisJbGFzdE51bSAtPSBjb3VudDsKKworCXdoaWxlIChjb3VudC0tID4gMCkgeworCQlubHAgPSBscC0+bmV4dDsKKwkJcGxwID0gbHAtPnByZXY7CisJCXBscC0+bmV4dCA9IG5scDsKKwkJbmxwLT5wcmV2ID0gcGxwOworCQlmcmVlKGxwKTsKKwkJbHAgPSBubHA7CisJfQorCisJZGlydHkgPSBUUlVFOworfQorCisKKy8qCisgKiBTZWFyY2ggZm9yIGEgbGluZSB3aGljaCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHN0cmluZy4KKyAqIElmIHRoZSBzdHJpbmcgaXMgIiIsIHRoZW4gdGhlIHByZXZpb3VzbHkgc2VhcmNoZWQgZm9yIHN0cmluZworICogaXMgdXNlZC4gIFRoZSBjdXJyZW50bHkgc2VhcmNoZWQgZm9yIHN0cmluZyBpcyBzYXZlZCBmb3IgZnV0dXJlIHVzZS4KKyAqIFJldHVybnMgdGhlIGxpbmUgbnVtYmVyIHdoaWNoIG1hdGNoZXMsIG9yIDAgaWYgdGhlcmUgd2FzIG5vIG1hdGNoCisgKiB3aXRoIGFuIGVycm9yIHByaW50ZWQuCisgKi8KK3N0YXRpYyBOT0lOTElORSBpbnQgc2VhcmNoTGluZXMoY29uc3QgY2hhciAqc3RyLCBpbnQgbnVtMSwgaW50IG51bTIpCit7CisJY29uc3QgTElORSAqbHA7CisJaW50IGxlbjsKKworCWlmIChiYWRfbnVtcyhudW0xLCBudW0yLCAic2VhcmNoIikpCisJCXJldHVybiAwOworCisJaWYgKCpzdHIgPT0gJ1wwJykgeworCQlpZiAoc2VhcmNoU3RyaW5nWzBdID09ICdcMCcpIHsKKwkJCWJiX2Vycm9yX21zZygibm8gcHJldmlvdXMgc2VhcmNoIHN0cmluZyIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJc3RyID0gc2VhcmNoU3RyaW5nOworCX0KKworCWlmIChzdHIgIT0gc2VhcmNoU3RyaW5nKQorCQlzdHJjcHkoc2VhcmNoU3RyaW5nLCBzdHIpOworCisJbGVuID0gc3RybGVuKHN0cik7CisKKwlscCA9IGZpbmRMaW5lKG51bTEpOworCWlmIChscCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCXdoaWxlIChudW0xIDw9IG51bTIpIHsKKwkJaWYgKGZpbmRTdHJpbmcobHAsIHN0ciwgbGVuLCAwKSA+PSAwKQorCQkJcmV0dXJuIG51bTE7CisJCW51bTErKzsKKwkJbHAgPSBscC0+bmV4dDsKKwl9CisKKwliYl9lcnJvcl9tc2coImNhbid0IGZpbmQgc3RyaW5nIFwiJXNcIiIsIHN0cik7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHNwZWNpZmllZCBsaW5lIG51bWJlci4KKyAqLworc3RhdGljIExJTkUgKmZpbmRMaW5lKGludCBudW0pCit7CisJTElORSAqbHA7CisJaW50IGxudW07CisKKwlpZiAoKG51bSA8IDEpIHx8IChudW0gPiBsYXN0TnVtKSkgeworCQliYl9lcnJvcl9tc2coImxpbmUgbnVtYmVyICVkIGRvZXMgbm90IGV4aXN0IiwgbnVtKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKGN1ck51bSA8PSAwKSB7CisJCWN1ck51bSA9IDE7CisJCWN1ckxpbmUgPSBsaW5lcy5uZXh0OworCX0KKworCWlmIChudW0gPT0gY3VyTnVtKQorCQlyZXR1cm4gY3VyTGluZTsKKworCWxwID0gY3VyTGluZTsKKwlsbnVtID0gY3VyTnVtOworCWlmIChudW0gPCAoY3VyTnVtIC8gMikpIHsKKwkJbHAgPSBsaW5lcy5uZXh0OworCQlsbnVtID0gMTsKKwl9IGVsc2UgaWYgKG51bSA+ICgoY3VyTnVtICsgbGFzdE51bSkgLyAyKSkgeworCQlscCA9IGxpbmVzLnByZXY7CisJCWxudW0gPSBsYXN0TnVtOworCX0KKworCXdoaWxlIChsbnVtIDwgbnVtKSB7CisJCWxwID0gbHAtPm5leHQ7CisJCWxudW0rKzsKKwl9CisKKwl3aGlsZSAobG51bSA+IG51bSkgeworCQlscCA9IGxwLT5wcmV2OworCQlsbnVtLS07CisJfQorCXJldHVybiBscDsKK30KKworCisvKgorICogU2V0IHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyLgorICogUmV0dXJucyBUUlVFIGlmIHN1Y2Nlc3NmdWwuCisgKi8KK3N0YXRpYyBpbnQgc2V0Q3VyTnVtKGludCBudW0pCit7CisJTElORSAqbHA7CisKKwlscCA9IGZpbmRMaW5lKG51bSk7CisJaWYgKGxwID09IE5VTEwpCisJCXJldHVybiBGQUxTRTsKKwljdXJOdW0gPSBudW07CisJY3VyTGluZSA9IGxwOworCXJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvZWRpdG9ycy9wYXRjaC5jIGIvZWRpdG9ycy9wYXRjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMjVlNDEKLS0tIC9kZXYvbnVsbAorKysgYi9lZGl0b3JzL3BhdGNoLmMKQEAgLTAsMCArMSw1NjIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OgorICoKKyAqIEFwcGx5IGEgInVuaXZlcnNhbCIgZGlmZi4KKyAqIEFkYXB0ZWQgZnJvbSB0b3lib3gncyBwYXRjaCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIHNlZSBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDk2OTUzOTkvdXRpbGl0aWVzL3BhdGNoLmh0bWwKKyAqIChCdXQgb25seSBkb2VzIC11LCBiZWNhdXNlIHdobyBzdGlsbCBjYXJlcyBhYm91dCAiZWQiPykKKyAqCisgKiBUT0RPOgorICogLWIgYmFja3VwCisgKiAtbCB0cmVhdCBhbGwgd2hpdGVzcGFjZSBhcyBhIHNpbmdsZSBzcGFjZQorICogLWQgY2hkaXIgZmlyc3QKKyAqIC1EIGRlZmluZSB3cmFwICNpZmRlZiBhbmQgI2lmbmRlZiBhcm91bmQgY2hhbmdlcworICogLW8gb3V0ZmlsZSBvdXRwdXQgaGVyZSBpbnN0ZWFkIG9mIGluIHBsYWNlCisgKiAtciByZWplY3RmaWxlIHdyaXRlIHJlamVjdGVkIGh1bmtzIHRvIHRoaXMgZmlsZQorICogLS1kcnktcnVuIChyZWdyZXNzaW9uISkKKyAqCisgKiAtZiBmb3JjZSAobm8gcXVlc3Rpb25zIGFza2VkKQorICogLUYgZnV6eiAobnVtYmVyLCBkZWZhdWx0IDIpCisgKiBbZmlsZV0gd2hpY2ggZmlsZSB0byBwYXRjaAorICovCisKKy8vY29uZmlnOmNvbmZpZyBQQVRDSAorLy9jb25maWc6CWJvb2wgInBhdGNoIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEFwcGx5IGEgdW5pZmllZCBkaWZmIGZvcm1hdHRlZCBwYXRjaC4KKworLy9hcHBsZXQ6SUZfUEFUQ0goQVBQTEVUKHBhdGNoLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1BBVENIKSArPSBwYXRjaC5vCisKKy8vdXNhZ2U6I2RlZmluZSBwYXRjaF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFtPUklHRklMRSBbUEFUQ0hGSUxFXV0iCisvL3VzYWdlOiNkZWZpbmUgcGF0Y2hfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6CUlGX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAgICIJLXAsLS1zdHJpcCBOCQlTdHJpcCBOIGxlYWRpbmcgY29tcG9uZW50cyBmcm9tIGZpbGUgbmFtZXMiCisvL3VzYWdlOiAgICAgIlxuCS1pLC0taW5wdXQgRElGRgkJUmVhZCBESUZGIGluc3RlYWQgb2Ygc3RkaW4iCisvL3VzYWdlOiAgICAgIlxuCS1SLC0tcmV2ZXJzZQkJUmV2ZXJzZSBwYXRjaCIKKy8vdXNhZ2U6ICAgICAiXG4JLU4sLS1mb3J3YXJkCQlJZ25vcmUgYWxyZWFkeSBhcHBsaWVkIHBhdGNoZXMiCisvKnVzYWdlOiAgICAgIlxuCS0tZHJ5LXJ1bgkJRG9uJ3QgYWN0dWFsbHkgY2hhbmdlIGZpbGVzIiAtIFRPRE8gKi8KKy8vdXNhZ2U6ICAgICAiXG4JLUUsLS1yZW1vdmUtZW1wdHktZmlsZXMJUmVtb3ZlIG91dHB1dCBmaWxlcyBpZiB0aGV5IGJlY29tZSBlbXB0eSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgICAiCS1wIE4JU3RyaXAgTiBsZWFkaW5nIGNvbXBvbmVudHMgZnJvbSBmaWxlIG5hbWVzIgorLy91c2FnZTogICAgICJcbgktaSBESUZGCVJlYWQgRElGRiBpbnN0ZWFkIG9mIHN0ZGluIgorLy91c2FnZTogICAgICJcbgktUglSZXZlcnNlIHBhdGNoIgorLy91c2FnZTogICAgICJcbgktTglJZ25vcmUgYWxyZWFkeSBhcHBsaWVkIHBhdGNoZXMiCisvL3VzYWdlOiAgICAgIlxuCS1FCVJlbW92ZSBvdXRwdXQgZmlsZXMgaWYgdGhleSBiZWNvbWUgZW1wdHkiCisvL3VzYWdlOgkpCisvKiAtdSAiaW50ZXJwcmV0IGFzIHVuaWZpZWQgZGlmZiIgaXMgc3VwcG9ydGVkIGJ1dCBub3QgZG9jdW1lbnRlZDogdGhpcyBpbmZvIGlzIG5vdCB1c2VmdWwgZm9yIC0taGVscCAqLworLyogLXggImRlYnVnIiBpcyBzdXBwb3J0ZWQgYnV0IGRvZXMgbm90aGluZyAqLworLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBwYXRjaF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBwYXRjaCAtcDEgPCBleGFtcGxlLmRpZmZcbiIKKy8vdXNhZ2U6ICAgICAgICIkIHBhdGNoIC1wMCAtaSBleGFtcGxlLmRpZmYiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisKKy8vIGxpYmJiIGNhbmRpZGF0ZT8KKworc3RydWN0IGRvdWJsZV9saXN0IHsKKwlzdHJ1Y3QgZG91YmxlX2xpc3QgKm5leHQ7CisJc3RydWN0IGRvdWJsZV9saXN0ICpwcmV2OworCWNoYXIgKmRhdGE7Cit9OworCisvLyBGcmVlIGFsbCB0aGUgZWxlbWVudHMgb2YgYSBsaW5rZWQgbGlzdAorLy8gQ2FsbCBmcmVlaXQoKSBvbiBlYWNoIGVsZW1lbnQgYmVmb3JlIGZyZWVpbmcgaXQuCitzdGF0aWMgdm9pZCBkbGlzdF9mcmVlKHN0cnVjdCBkb3VibGVfbGlzdCAqbGlzdCwgdm9pZCAoKmZyZWVpdCkodm9pZCAqZGF0YSkpCit7CisJd2hpbGUgKGxpc3QpIHsKKwkJdm9pZCAqcG9wID0gbGlzdDsKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CisJCWZyZWVpdChwb3ApOworCQkvLyBCYWlsIG91dCBhbHNvIGlmIGxpc3QgaXMgY2lyY3VsYXIuCisJCWlmIChsaXN0ID09IHBvcCkgYnJlYWs7CisJfQorfQorCisvLyBBZGQgYW4gZW50cnkgYmVmb3JlICJsaXN0IiBlbGVtZW50IGluIChjaXJjdWxhcikgZG91Ymx5IGxpbmtlZCBsaXN0CitzdGF0aWMgc3RydWN0IGRvdWJsZV9saXN0ICpkbGlzdF9hZGQoc3RydWN0IGRvdWJsZV9saXN0ICoqbGlzdCwgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3QgZG91YmxlX2xpc3QgKmxsaXN0OworCXN0cnVjdCBkb3VibGVfbGlzdCAqbGluZSA9IHhtYWxsb2Moc2l6ZW9mKCpsaW5lKSk7CisKKwlsaW5lLT5kYXRhID0gZGF0YTsKKwlsbGlzdCA9ICpsaXN0OworCWlmIChsbGlzdCkgeworCQlzdHJ1Y3QgZG91YmxlX2xpc3QgKnA7CisJCWxpbmUtPm5leHQgPSBsbGlzdDsKKwkJcCA9IGxpbmUtPnByZXYgPSBsbGlzdC0+cHJldjsKKwkJLy8gKGxpc3QgaXMgY2lyY3VsYXIsIHdlIGFzc3VtZSBwIGlzIG5ldmVyIE5VTEwpCisJCXAtPm5leHQgPSBsaW5lOworCQlsbGlzdC0+cHJldiA9IGxpbmU7CisJfSBlbHNlCisJCSpsaXN0ID0gbGluZS0+bmV4dCA9IGxpbmUtPnByZXYgPSBsaW5lOworCisJcmV0dXJuIGxpbmU7Cit9CisKKworc3RydWN0IGdsb2JhbHMgeworCWNoYXIgKmluZmlsZTsKKwlsb25nIHByZWZpeDsKKworCXN0cnVjdCBkb3VibGVfbGlzdCAqY3VycmVudF9odW5rOworCisJbG9uZyBvbGRsaW5lLCBvbGRsZW4sIG5ld2xpbmUsIG5ld2xlbjsKKwlsb25nIGxpbmVudW07CisJaW50IGNvbnRleHQsIHN0YXRlLCBodW5rbnVtOworCWludCBmaWxlaW4sIGZpbGVvdXQ7CisJY2hhciAqdGVtcG5hbWU7CisKKwlpbnQgZXhpdHZhbDsKK307CisjZGVmaW5lIFRUICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIElOSVRfVFQoKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoVFQpKSk7IFwKK30gd2hpbGUgKDApCisKKworI2RlZmluZSBGTEFHX1NUUiAiUnVwOmk6TkV4IgorLyogRkxBR19SRVZFUlNFIG11c3QgYmUgPT0gMSEgQ29kZSB1c2VzIHRoaXMgZmFjdC4gKi8KKyNkZWZpbmUgRkxBR19SRVZFUlNFICgxIDw8IDApCisjZGVmaW5lIEZMQUdfdSAgICAgICAoMSA8PCAxKQorI2RlZmluZSBGTEFHX1BBVEhMRU4gKDEgPDwgMikKKyNkZWZpbmUgRkxBR19JTlBVVCAgICgxIDw8IDMpCisjZGVmaW5lIEZMQUdfSUdOT1JFICAoMSA8PCA0KQorI2RlZmluZSBGTEFHX1JNRU1QVFkgKDEgPDwgNSkKKy8qIEVuYWJsZSB0aGlzIGJpdCBhbmQgdXNlIC14IGZvciBkZWJ1ZyBvdXRwdXQ6ICovCisjZGVmaW5lIEZMQUdfREVCVUcgICAoMCA8PCA2KQorCisvLyBEaXNwb3NlIG9mIGEgbGluZSBvZiBpbnB1dCwgZWl0aGVyIGJ5IHdyaXRpbmcgaXQgb3V0IG9yIGRpc2NhcmRpbmcgaXQuCisKKy8vIHN0YXRlIDwgMjoganVzdCBmcmVlCisvLyBzdGF0ZSA9IDI6IHdyaXRlIHdob2xlIGxpbmUgdG8gc3RkZXJyCisvLyBzdGF0ZSA9IDM6IHdyaXRlIHdob2xlIGxpbmUgdG8gZmlsZW91dAorLy8gc3RhdGUgPiAzOiB3cml0ZSBsaW5lKzEgdG8gZmlsZW91dCB3aGVuICpsaW5lICE9IHN0YXRlCisKKyNkZWZpbmUgUEFUQ0hfREVCVUcgKG9wdGlvbl9tYXNrMzIgJiBGTEFHX0RFQlVHKQorCitzdGF0aWMgdm9pZCBkb19saW5lKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGRvdWJsZV9saXN0ICpkbGlzdCA9IGRhdGE7CisKKwlpZiAoVFQuc3RhdGU+MSAmJiAqZGxpc3QtPmRhdGEgIT0gVFQuc3RhdGUpCisJCWZkcHJpbnRmKFRULnN0YXRlID09IDIgPyAyIDogVFQuZmlsZW91dCwKKwkJCSIlc1xuIiwgZGxpc3QtPmRhdGErKFRULnN0YXRlPjMgPyAxIDogMCkpOworCisJaWYgKFBBVENIX0RFQlVHKSBmZHByaW50ZigyLCAiRE8gJWQ6ICVzXG4iLCBUVC5zdGF0ZSwgZGxpc3QtPmRhdGEpOworCisJZnJlZShkbGlzdC0+ZGF0YSk7CisJZnJlZShkbGlzdCk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbmlzaF9vbGRmaWxlKHZvaWQpCit7CisJaWYgKFRULnRlbXBuYW1lKSB7CisJCS8vIENvcHkgdGhlIHJlc3Qgb2YgdGhlIGRhdGEgYW5kIHJlcGxhY2UgdGhlIG9yaWdpbmFsIHdpdGggdGhlIGNvcHkuCisJCWNoYXIgKnRlbXA7CisKKwkJaWYgKFRULmZpbGVpbiAhPSAtMSkgeworCQkJYmJfY29weWZkX2VvZihUVC5maWxlaW4sIFRULmZpbGVvdXQpOworCQkJeGNsb3NlKFRULmZpbGVpbik7CisJCX0KKwkJeGNsb3NlKFRULmZpbGVvdXQpOworCisJCXRlbXAgPSB4c3RyZHVwKFRULnRlbXBuYW1lKTsKKwkJdGVtcFtzdHJsZW4odGVtcCkgLSA2XSA9ICdcMCc7CisJCXJlbmFtZShUVC50ZW1wbmFtZSwgdGVtcCk7CisJCWZyZWUodGVtcCk7CisKKwkJZnJlZShUVC50ZW1wbmFtZSk7CisJCVRULnRlbXBuYW1lID0gTlVMTDsKKwl9CisJVFQuZmlsZW91dCA9IFRULmZpbGVpbiA9IC0xOworfQorCitzdGF0aWMgdm9pZCBmYWlsX2h1bmsodm9pZCkKK3sKKwlpZiAoIVRULmN1cnJlbnRfaHVuaykgcmV0dXJuOworCisJZmRwcmludGYoMiwgIkh1bmsgJWQgRkFJTEVEICVsZC8lbGQuXG4iLCBUVC5odW5rbnVtLCBUVC5vbGRsaW5lLCBUVC5uZXdsaW5lKTsKKwlUVC5leGl0dmFsID0gMTsKKworCS8vIElmIHdlIGdvdCB0byB0aGlzIHBvaW50LCB3ZSd2ZSBzZWVrZWQgdG8gdGhlIGVuZC4gIERpc2NhcmQgY2hhbmdlcyB0bworCS8vIHRoaXMgZmlsZSBhbmQgYWR2YW5jZSB0byBuZXh0IGZpbGUuCisKKwlUVC5zdGF0ZSA9IDI7CisJVFQuY3VycmVudF9odW5rLT5wcmV2LT5uZXh0ID0gTlVMTDsKKwlkbGlzdF9mcmVlKFRULmN1cnJlbnRfaHVuaywgZG9fbGluZSk7CisJVFQuY3VycmVudF9odW5rID0gTlVMTDsKKworCS8vIEFib3J0IHRoZSBjb3B5IGFuZCBkZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlLgorCWNsb3NlKFRULmZpbGVpbik7CisJY2xvc2UoVFQuZmlsZW91dCk7CisJdW5saW5rKFRULnRlbXBuYW1lKTsKKwlmcmVlKFRULnRlbXBuYW1lKTsKKwlUVC50ZW1wbmFtZSA9IE5VTEw7CisKKwlUVC5zdGF0ZSA9IDA7Cit9CisKKy8vIEdpdmVuIGEgaHVuayBvZiBhIHVuaWZpZWQgZGlmZiwgbWFrZSB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlIHRvIHRoZSBmaWxlLgorLy8gVGhpcyBkb2VzIG5vdCB1c2UgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uLCBidXQgaW5zdGVhZCB0cmVhdHMgYSBodW5rCisvLyBhcyBhIHNvcnQgb2YgcmVnZXguICBDb3BpZXMgZGF0YSBmcm9tIGlucHV0IHRvIG91dHB1dCB1bnRpbCBpdCBmaW5kcworLy8gdGhlIGNoYW5nZSB0byBiZSBtYWRlLCB0aGVuIG91dHB1dHMgdGhlIGNoYW5nZWQgZGF0YSBhbmQgcmV0dXJucy4KKy8vIChGaW5kaW5nIEVPRiBmaXJzdCBpcyBhbiBlcnJvci4pICBUaGlzIGlzIGEgc2luZ2xlIHBhc3Mgb3BlcmF0aW9uLCBzbworLy8gbXVsdGlwbGUgaHVua3MgbXVzdCBvY2N1ciBpbiBvcmRlciBpbiB0aGUgZmlsZS4KKworc3RhdGljIGludCBhcHBseV9vbmVfaHVuayh2b2lkKQoreworCXN0cnVjdCBkb3VibGVfbGlzdCAqcGxpc3QsICpidWYgPSBOVUxMLCAqY2hlY2s7CisJaW50IG1hdGNoZW9mID0gMCwgcmV2ZXJzZSA9IG9wdGlvbl9tYXNrMzIgJiBGTEFHX1JFVkVSU0UsIGJhY2t3YXJuID0gMDsKKwkvKiBEbyB3ZSB0cnkgImR1bW15IiByZXZlcnQgdG8gY2hlY2sgd2hldGhlcgorCSAqIHRvIHNpbGVudGx5IHNraXAgdGhpcyBodW5rPyBVc2VkIHRvIGltcGxlbWVudCAtTi4KKwkgKi8KKwlpbnQgZHVtbXlfcmV2ZXJ0ID0gMDsKKworCS8vIEJyZWFrIGRvdWJseSBsaW5rZWQgbGlzdCBzbyB3ZSBjYW4gdXNlIHNpbmdseSBsaW5rZWQgdHJhdmVyc2FsIGZ1bmN0aW9uLgorCVRULmN1cnJlbnRfaHVuay0+cHJldi0+bmV4dCA9IE5VTEw7CisKKwkvLyBNYXRjaCBFT0YgaWYgdGhlcmUgYXJlbid0IGFzIG1hbnkgZW5kaW5nIGNvbnRleHQgbGluZXMgYXMgYmVnaW5uaW5nCisJZm9yIChwbGlzdCA9IFRULmN1cnJlbnRfaHVuazsgcGxpc3Q7IHBsaXN0ID0gcGxpc3QtPm5leHQpIHsKKwkJaWYgKHBsaXN0LT5kYXRhWzBdPT0nICcpIG1hdGNoZW9mKys7CisJCWVsc2UgbWF0Y2hlb2YgPSAwOworCQlpZiAoUEFUQ0hfREVCVUcpIGZkcHJpbnRmKDIsICJIVU5LOiVzXG4iLCBwbGlzdC0+ZGF0YSk7CisJfQorCW1hdGNoZW9mID0gIW1hdGNoZW9mIHx8IG1hdGNoZW9mIDwgVFQuY29udGV4dDsKKworCWlmIChQQVRDSF9ERUJVRykgZmRwcmludGYoMiwiTUFUQ0hFT0Y9JWNcbiIsIG1hdGNoZW9mID8gJ1knIDogJ04nKTsKKworCS8vIExvb3AgdGhyb3VnaCBpbnB1dCBkYXRhIHNlYXJjaGluZyBmb3IgdGhpcyBodW5rLiAgTWF0Y2ggYWxsIGNvbnRleHQKKwkvLyBsaW5lcyBhbmQgYWxsIGxpbmVzIHRvIGJlIHJlbW92ZWQgdW50aWwgd2UndmUgZm91bmQgdGhlIGVuZCBvZiBhCisJLy8gY29tcGxldGUgaHVuay4KKwlwbGlzdCA9IFRULmN1cnJlbnRfaHVuazsKKwlidWYgPSBOVUxMOworCWlmIChyZXZlcnNlID8gVFQub2xkbGVuIDogVFQubmV3bGVuKSBmb3IgKDs7KSB7CisJCWNoYXIgKmRhdGEgPSB4bWFsbG9jX3JlYWRzKFRULmZpbGVpbiwgTlVMTCk7CisKKwkJVFQubGluZW51bSsrOworCisJCS8vIEZpZ3VyZSBvdXQgd2hpY2ggbGluZSBvZiBodW5rIHRvIGNvbXBhcmUgd2l0aCBuZXh0LiAgKFNraXAgbGluZXMKKwkJLy8gb2YgdGhlIGh1bmsgd2UnZCBiZSBhZGRpbmcuKQorCQl3aGlsZSAocGxpc3QgJiYgKnBsaXN0LT5kYXRhID09ICIrLSJbcmV2ZXJzZV0pIHsKKwkJCWlmIChkYXRhICYmICFzdHJjbXAoZGF0YSwgcGxpc3QtPmRhdGErMSkpIHsKKwkJCQlpZiAoIWJhY2t3YXJuKSB7CisJCQkJCWJhY2t3YXJuID0gVFQubGluZW51bTsKKwkJCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHX0lHTk9SRSkgeworCQkJCQkJZHVtbXlfcmV2ZXJ0ID0gMTsKKwkJCQkJCXJldmVyc2UgXj0gMTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKKwkJfQorCisJCS8vIElzIHRoaXMgRU9GPworCQlpZiAoIWRhdGEpIHsKKwkJCWlmIChQQVRDSF9ERUJVRykgZmRwcmludGYoMiwgIklORU9GXG4iKTsKKworCQkJLy8gRG9lcyB0aGlzIGh1bmsgbmVlZCB0byBtYXRjaCBFT0Y/CisJCQlpZiAoIXBsaXN0ICYmIG1hdGNoZW9mKSBicmVhazsKKworCQkJaWYgKGJhY2t3YXJuKQorCQkJCWZkcHJpbnRmKDIsIlBvc3NpYmx5IHJldmVyc2VkIGh1bmsgJWQgYXQgJWxkXG4iLAorCQkJCQlUVC5odW5rbnVtLCBUVC5saW5lbnVtKTsKKworCQkJLy8gRmlsZSBlbmRlZCBiZWZvcmUgd2UgZm91bmQgYSBwbGFjZSBmb3IgdGhpcyBodW5rLgorCQkJZmFpbF9odW5rKCk7CisJCQlnb3RvIGRvbmU7CisJCX0KKworCQlpZiAoUEFUQ0hfREVCVUcpIGZkcHJpbnRmKDIsICJJTjogJXNcbiIsIGRhdGEpOworCQljaGVjayA9IGRsaXN0X2FkZCgmYnVmLCBkYXRhKTsKKworCQkvLyBDb21wYXJlIHRoaXMgbGluZSB3aXRoIG5leHQgZXhwZWN0ZWQgbGluZSBvZiBodW5rLgorCQkvLyB0b2RvOiB0ZWFjaCB0aGUgc3RyY21wKCkgdG8gaWdub3JlIHdoaXRlc3BhY2UuCisKKwkJLy8gQSBtYXRjaCBjYW4gZmFpbCBiZWNhdXNlIHRoZSBuZXh0IGxpbmUgZG9lc24ndCBtYXRjaCwgb3IgYmVjYXVzZQorCQkvLyB3ZSBoaXQgdGhlIGVuZCBvZiBhIGh1bmsgdGhhdCBuZWVkZWQgRU9GLCBhbmQgdGhpcyBpc24ndCBFT0YuCisKKwkJLy8gSWYgbWF0Y2ggZmFpbGVkLCBmbHVzaCBmaXJzdCBsaW5lIG9mIGJ1ZmZlcmVkIGRhdGEgYW5kCisJCS8vIHJlY2hlY2sgYnVmZmVyZWQgZGF0YSBmb3IgYSBuZXcgbWF0Y2ggdW50aWwgd2UgZmluZCBvbmUgb3IgcnVuCisJCS8vIG91dCBvZiBidWZmZXIuCisKKwkJZm9yICg7OykgeworCQkJaWYgKCFwbGlzdCB8fCBzdHJjbXAoY2hlY2stPmRhdGEsIHBsaXN0LT5kYXRhKzEpKSB7CisJCQkJLy8gTWF0Y2ggZmFpbGVkLiAgV3JpdGUgb3V0IGZpcnN0IGxpbmUgb2YgYnVmZmVyZWQgZGF0YSBhbmQKKwkJCQkvLyByZWNoZWNrIHJlbWFpbmluZyBidWZmZXJlZCBkYXRhIGZvciBhIG5ldyBtYXRjaC4KKworCQkJCWlmIChQQVRDSF9ERUJVRykKKwkJCQkJZmRwcmludGYoMiwgIk5PVDogJXNcbiIsIHBsaXN0LT5kYXRhKTsKKworCQkJCVRULnN0YXRlID0gMzsKKwkJCQljaGVjayA9IGJ1ZjsKKwkJCQlidWYgPSBidWYtPm5leHQ7CisJCQkJY2hlY2stPnByZXYtPm5leHQgPSBidWY7CisJCQkJYnVmLT5wcmV2ID0gY2hlY2stPnByZXY7CisJCQkJZG9fbGluZShjaGVjayk7CisJCQkJcGxpc3QgPSBUVC5jdXJyZW50X2h1bms7CisKKwkJCQkvLyBJZiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3aXRob3V0IGNvbmZpcm1pbmcgYQorCQkJCS8vIG1hdGNoLCByZWFkIG1vcmUgbGluZXMuCisJCQkJaWYgKGNoZWNrID09IGJ1ZikgeworCQkJCQlidWYgPSBOVUxMOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJY2hlY2sgPSBidWY7CisJCQl9IGVsc2UgeworCQkJCWlmIChQQVRDSF9ERUJVRykKKwkJCQkJZmRwcmludGYoMiwgIk1BWUJFOiAlc1xuIiwgcGxpc3QtPmRhdGEpOworCQkJCS8vIFRoaXMgbGluZSBtYXRjaGVzLiAgQWR2YW5jZSBwbGlzdCwgZGV0ZWN0IHN1Y2Nlc3NmdWwgbWF0Y2guCisJCQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKKwkJCQlpZiAoIXBsaXN0ICYmICFtYXRjaGVvZikgZ290byBvdXQ7CisJCQkJY2hlY2sgPSBjaGVjay0+bmV4dDsKKwkJCQlpZiAoY2hlY2sgPT0gYnVmKSBicmVhazsKKwkJCX0KKwkJfQorCX0KK291dDoKKwkvLyBXZSBoYXZlIGEgbWF0Y2guICBFbWl0IGNoYW5nZWQgZGF0YS4KKwlUVC5zdGF0ZSA9ICItKyJbcmV2ZXJzZSBeIGR1bW15X3JldmVydF07CisJZGxpc3RfZnJlZShUVC5jdXJyZW50X2h1bmssIGRvX2xpbmUpOworCVRULmN1cnJlbnRfaHVuayA9IE5VTEw7CisJVFQuc3RhdGUgPSAxOworZG9uZToKKwlpZiAoYnVmKSB7CisJCWJ1Zi0+cHJldi0+bmV4dCA9IE5VTEw7CisJCWRsaXN0X2ZyZWUoYnVmLCBkb19saW5lKTsKKwl9CisKKwlyZXR1cm4gVFQuc3RhdGU7Cit9CisKKy8vIFJlYWQgYSBwYXRjaCBmaWxlIGFuZCBmaW5kIGh1bmtzLCBvcGVuaW5nL2NyZWF0aW5nL2RlbGV0aW5nIGZpbGVzLgorLy8gQ2FsbCBhcHBseV9vbmVfaHVuaygpIG9uIGVhY2ggaHVuay4KKworLy8gc3RhdGUgMDogTm90IGluIGEgaHVuaywgbG9vayBmb3IgKysrLgorLy8gc3RhdGUgMTogRm91bmQgKysrIGZpbGUgaW5kaWNhdG9yLCBsb29rIGZvciBAQAorLy8gc3RhdGUgMjogSW4gaHVuazogY291bnRpbmcgaW5pdGlhbCBjb250ZXh0IGxpbmVzCisvLyBzdGF0ZSAzOiBJbiBodW5rOiBnZXR0aW5nIGJvZHkKKy8vIExpa2UgR05VIHBhdGNoLCB3ZSBkb24ndCByZXF1aXJlIGEgLS0tIGxpbmUgYmVmb3JlIHRoZSArKyssIGFuZAorLy8gYWxzbyBhbGxvdyB0aGUgLS0tIGFmdGVyIHRoZSArKysgbGluZS4KKworaW50IHBhdGNoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwYXRjaF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IG9wdHM7CisJaW50IHJldmVyc2UsIHN0YXRlID0gMDsKKwljaGFyICpvbGRuYW1lID0gTlVMTCwgKm5ld25hbWUgPSBOVUxMOworCWNoYXIgKm9wdF9wLCAqb3B0X2k7CisJbG9uZyBvbGRsZW4gPSBvbGRsZW47IC8qIGZvciBjb21waWxlciAqLworCWxvbmcgbmV3bGVuID0gbmV3bGVuOyAvKiBmb3IgY29tcGlsZXIgKi8KKworCUlOSVRfVFQoKTsKKworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCBGTEFHX1NUUiwgJm9wdF9wLCAmb3B0X2kpOworCWFyZ3YgKz0gb3B0aW5kOworCXJldmVyc2UgPSBvcHRzICYgRkxBR19SRVZFUlNFOworCVRULnByZWZpeCA9IChvcHRzICYgRkxBR19QQVRITEVOKSA/IHhhdG9pKG9wdF9wKSA6IDA7IC8vIGNhbiBiZSBuZWdhdGl2ZSEKKwlUVC5maWxlaW4gPSBUVC5maWxlb3V0ID0gLTE7CisJaWYgKG9wdHMgJiBGTEFHX0lOUFVUKSB7CisJCXhtb3ZlX2ZkKHhvcGVuX3N0ZGluKG9wdF9pKSwgU1RESU5fRklMRU5PKTsKKwl9IGVsc2UgeworCQlpZiAoYXJndlswXSAmJiBhcmd2WzFdKSB7CisJCQl4bW92ZV9mZCh4b3Blbl9zdGRpbihhcmd2WzFdKSwgU1RESU5fRklMRU5PKTsKKwkJfQorCX0KKwlpZiAoYXJndlswXSkgeworCQlvbGRuYW1lID0geHN0cmR1cChhcmd2WzBdKTsKKwkJbmV3bmFtZSA9IHhzdHJkdXAoYXJndlswXSk7CisJfQorCisJLy8gTG9vcCB0aHJvdWdoIHRoZSBsaW5lcyBpbiB0aGUgcGF0Y2gKKwlmb3IoOzspIHsKKwkJY2hhciAqcGF0Y2hsaW5lOworCisJCXBhdGNobGluZSA9IHhtYWxsb2NfZmdldGxpbmUoc3RkaW4pOworCQlpZiAoIXBhdGNobGluZSkgYnJlYWs7CisKKwkJLy8gT3RoZXIgdmVyc2lvbnMgb2YgcGF0Y2ggYWNjZXB0IGRhbWFnZWQgcGF0Y2hlcywKKwkJLy8gc28gd2UgbmVlZCB0byBhbHNvLgorCQlpZiAoISpwYXRjaGxpbmUpIHsKKwkJCWZyZWUocGF0Y2hsaW5lKTsKKwkJCXBhdGNobGluZSA9IHhzdHJkdXAoIiAiKTsKKwkJfQorCisJCS8vIEFyZSB3ZSBhc3NlbWJsaW5nIGEgaHVuaz8KKwkJaWYgKHN0YXRlID49IDIpIHsKKwkJCWlmICgqcGF0Y2hsaW5lPT0nICcgfHwgKnBhdGNobGluZT09JysnIHx8ICpwYXRjaGxpbmU9PSctJykgeworCQkJCWRsaXN0X2FkZCgmVFQuY3VycmVudF9odW5rLCBwYXRjaGxpbmUpOworCisJCQkJaWYgKCpwYXRjaGxpbmUgIT0gJysnKSBvbGRsZW4tLTsKKwkJCQlpZiAoKnBhdGNobGluZSAhPSAnLScpIG5ld2xlbi0tOworCisJCQkJLy8gQ29udGV4dCBsaW5lPworCQkJCWlmICgqcGF0Y2hsaW5lPT0nICcgJiYgc3RhdGU9PTIpIFRULmNvbnRleHQrKzsKKwkJCQllbHNlIHN0YXRlPTM7CisKKwkJCQkvLyBJZiB3ZSd2ZSBjb25zdW1lZCBhbGwgZXhwZWN0ZWQgaHVuayBsaW5lcywgYXBwbHkgdGhlIGh1bmsuCisKKwkJCQlpZiAoIW9sZGxlbiAmJiAhbmV3bGVuKSBzdGF0ZSA9IGFwcGx5X29uZV9odW5rKCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlmYWlsX2h1bmsoKTsKKwkJCXN0YXRlID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLy8gT3BlbiBhIG5ldyBmaWxlPworCQlpZiAoaXNfcHJlZml4ZWRfd2l0aChwYXRjaGxpbmUsICItLS0gIikgfHwgaXNfcHJlZml4ZWRfd2l0aChwYXRjaGxpbmUsICIrKysgIikpIHsKKwkJCWNoYXIgKnMsICoqbmFtZSA9IHJldmVyc2UgPyAmbmV3bmFtZSA6ICZvbGRuYW1lOworCQkJaW50IGk7CisKKwkJCWlmICgqcGF0Y2hsaW5lID09ICcrJykgeworCQkJCW5hbWUgPSByZXZlcnNlID8gJm9sZG5hbWUgOiAmbmV3bmFtZTsKKwkJCQlzdGF0ZSA9IDE7CisJCQl9CisKKwkJCWZpbmlzaF9vbGRmaWxlKCk7CisKKwkJCWlmICghYXJndlswXSkgeworCQkJCWZyZWUoKm5hbWUpOworCQkJCS8vIFRyaW0gZGF0ZSBmcm9tIGVuZCBvZiBmaWxlbmFtZSAoaWYgYW55KS4gIFdlIGRvbid0IGNhcmUuCisJCQkJZm9yIChzID0gcGF0Y2hsaW5lKzQ7ICpzICYmICpzIT0nXHQnOyBzKyspCisJCQkJCWlmICgqcz09J1xcJyAmJiBzWzFdKSBzKys7CisJCQkJaSA9IGF0b2kocyk7CisJCQkJaWYgKGk+MTkwMCAmJiBpPD0xOTcwKQorCQkJCQkqbmFtZSA9IHhzdHJkdXAoIi9kZXYvbnVsbCIpOworCQkJCWVsc2UgeworCQkJCQkqcyA9IDA7CisJCQkJCSpuYW1lID0geHN0cmR1cChwYXRjaGxpbmUrNCk7CisJCQkJfQorCQkJfQorCisJCQkvLyBXZSBkZWZlciBhY3R1YWxseSBvcGVuaW5nIHRoZSBmaWxlIGJlY2F1c2Ugc3ZuIHByb2R1Y2VzIGJyb2tlbgorCQkJLy8gcGF0Y2hlcyB0aGF0IGRvbid0IHNpZ25hbCB0aGV5IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGZpbGUgdGhlCisJCQkvLyB3YXkgdGhlIHBhdGNoIG1hbiBwYWdlIHNheXMsIHNvIHlvdSBoYXZlIHRvIHJlYWQgdGhlIGZpcnN0IGh1bmsKKwkJCS8vIGFuZCBfZ3Vlc3NfLgorCisJCS8vIFN0YXJ0IGEgbmV3IGh1bms/ICBVc3VhbGx5IEBAIC1vbGRsaW5lLG9sZGxlbiArbmV3bGluZSxuZXdsZW4gQEAKKwkJLy8gYnV0IGEgbWlzc2luZyAsdmFsdWUgbWVhbnMgdGhlIHZhbHVlIGlzIDEuCisJCX0gZWxzZSBpZiAoc3RhdGUgPT0gMSAmJiBpc19wcmVmaXhlZF93aXRoKHBhdGNobGluZSwgIkBAIC0iKSkgeworCQkJaW50IGk7CisJCQljaGFyICpzID0gcGF0Y2hsaW5lKzQ7CisKKwkJCS8vIFJlYWQgb2xkbGluZVssb2xkbGVuXSArbmV3bGluZVssbmV3bGVuXQorCisJCQlUVC5vbGRsZW4gPSBvbGRsZW4gPSBUVC5uZXdsZW4gPSBuZXdsZW4gPSAxOworCQkJVFQub2xkbGluZSA9IHN0cnRvbChzLCAmcywgMTApOworCQkJaWYgKCpzID09ICcsJykgVFQub2xkbGVuID0gb2xkbGVuID0gc3RydG9sKHMrMSwgJnMsIDEwKTsKKwkJCVRULm5ld2xpbmUgPSBzdHJ0b2wocysyLCAmcywgMTApOworCQkJaWYgKCpzID09ICcsJykgVFQubmV3bGVuID0gbmV3bGVuID0gc3RydG9sKHMrMSwgJnMsIDEwKTsKKworCQkJaWYgKG9sZGxlbiA8IDEgJiYgbmV3bGVuIDwgMSkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiUmVhbGx5PyAlcyIsIHBhdGNobGluZSk7CisKKwkJCVRULmNvbnRleHQgPSAwOworCQkJc3RhdGUgPSAyOworCisJCQkvLyBJZiB0aGUgLS0tIGxpbmUgaXMgbWlzc2luZyBvciBtYWxmb3JtZWQsIGVpdGhlciBvbGRuYW1lCisJCQkvLyBvciAoZm9yIC1SKSBuZXduYW1lIGNvdWxkIGJlIE5VTEwgLS0gYnV0IG5vdCBib3RoLiAgTGlrZQorCQkJLy8gR05VIHBhdGNoLCBwcm9jZWVkIGJhc2VkIG9uIHRoZSArKysgbGluZSwgYW5kIGF2b2lkIFNFR1ZzLgorCQkJaWYgKCFvbGRuYW1lKQorCQkJCW9sZG5hbWUgPSB4c3RyZHVwKCJNSVNTSU5HX0ZJTEVOQU1FIik7CisJCQlpZiAoIW5ld25hbWUpCisJCQkJbmV3bmFtZSA9IHhzdHJkdXAoIk1JU1NJTkdfRklMRU5BTUUiKTsKKworCQkJLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgaHVuaywgb3BlbiB0aGUgZmlsZS4KKwkJCWlmIChUVC5maWxlaW4gPT0gLTEpIHsKKwkJCQlpbnQgb2xkc3VtLCBuZXdzdW0sIGVtcHR5ID0gMDsKKwkJCQljaGFyICpuYW1lOworCisJCQkJb2xkc3VtID0gVFQub2xkbGluZSArIG9sZGxlbjsKKwkJCQluZXdzdW0gPSBUVC5uZXdsaW5lICsgbmV3bGVuOworCisJCQkJbmFtZSA9IHJldmVyc2UgPyBvbGRuYW1lIDogbmV3bmFtZTsKKworCQkJCS8vIFdlJ3JlIGRlbGV0aW5nIG9sZG5hbWUgaWYgbmV3IGZpbGUgaXMgL2Rldi9udWxsIChiZWZvcmUgLXApCisJCQkJLy8gb3IgaWYgbmV3IGh1bmsgaXMgZW1wdHkgKHplcm8gY29udGV4dCkgYWZ0ZXIgcGF0Y2hpbmcKKwkJCQlpZiAoIXN0cmNtcChuYW1lLCAiL2Rldi9udWxsIikgfHwgIShyZXZlcnNlID8gb2xkc3VtIDogbmV3c3VtKSkgeworCQkJCQluYW1lID0gcmV2ZXJzZSA/IG5ld25hbWUgOiBvbGRuYW1lOworCQkJCQllbXB0eSsrOworCQkJCX0KKworCQkJCS8vIGhhbmRsZSAtcCBwYXRoIHRydW5jYXRpb24uCisJCQkJZm9yIChpID0gMCwgcyA9IG5hbWU7ICpzOykgeworCQkJCQlpZiAoKG9wdGlvbl9tYXNrMzIgJiBGTEFHX1BBVEhMRU4pICYmIFRULnByZWZpeCA9PSBpKQorCQkJCQkJYnJlYWs7CisJCQkJCWlmICgqcysrICE9ICcvJykKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl3aGlsZSAoKnMgPT0gJy8nKQorCQkJCQkJcysrOworCQkJCQlpKys7CisJCQkJCW5hbWUgPSBzOworCQkJCX0KKworCQkJCWlmIChlbXB0eSkgeworCQkJCQkvLyBGaWxlIGlzIGVtcHR5IGFmdGVyIHRoZSBwYXRjaGVzIGhhdmUgYmVlbiBhcHBsaWVkCisJCQkJCXN0YXRlID0gMDsKKwkJCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiBGTEFHX1JNRU1QVFkpIHsKKwkJCQkJCS8vIElmIGZsYWcgLUUgb3IgLS1yZW1vdmUtZW1wdHktZmlsZXMgaXMgc2V0CisJCQkJCQlwcmludGYoInJlbW92aW5nICVzXG4iLCBuYW1lKTsKKwkJCQkJCXh1bmxpbmsobmFtZSk7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmludGYoInBhdGNoaW5nIGZpbGUgJXNcbiIsIG5hbWUpOworCQkJCQkJeGNsb3NlKHhvcGVuKG5hbWUsIE9fV1JPTkxZIHwgT19UUlVOQykpOworCQkJCQl9CisJCQkJLy8gSWYgd2UndmUgZ290IGEgZmlsZSB0byBvcGVuLCBkbyBzby4KKwkJCQl9IGVsc2UgaWYgKCEob3B0aW9uX21hc2szMiAmIEZMQUdfUEFUSExFTikgfHwgaSA8PSBUVC5wcmVmaXgpIHsKKwkJCQkJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKworCQkJCQkvLyBJZiB0aGUgb2xkIGZpbGUgd2FzIG51bGwsIHdlJ3JlIGNyZWF0aW5nIGEgbmV3IG9uZS4KKwkJCQkJaWYgKCFzdHJjbXAob2xkbmFtZSwgIi9kZXYvbnVsbCIpIHx8ICFvbGRzdW0pIHsKKwkJCQkJCXByaW50ZigiY3JlYXRpbmcgJXNcbiIsIG5hbWUpOworCQkJCQkJcyA9IHN0cnJjaHIobmFtZSwgJy8nKTsKKwkJCQkJCWlmIChzKSB7CisJCQkJCQkJKnMgPSAwOworCQkJCQkJCWJiX21ha2VfZGlyZWN0b3J5KG5hbWUsIC0xLCBGSUxFVVRJTFNfUkVDVVIpOworCQkJCQkJCSpzID0gJy8nOworCQkJCQkJfQorCQkJCQkJVFQuZmlsZWluID0geG9wZW4obmFtZSwgT19DUkVBVHxPX0VYQ0x8T19SRFdSKTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXByaW50ZigicGF0Y2hpbmcgZmlsZSAlc1xuIiwgbmFtZSk7CisJCQkJCQlUVC5maWxlaW4gPSB4b3BlbihuYW1lLCBPX1JET05MWSk7CisJCQkJCX0KKworCQkJCQlUVC50ZW1wbmFtZSA9IHhhc3ByaW50ZigiJXNYWFhYWFgiLCBuYW1lKTsKKwkJCQkJVFQuZmlsZW91dCA9IHhta3N0ZW1wKFRULnRlbXBuYW1lKTsKKwkJCQkJLy8gU2V0IHBlcm1pc3Npb25zIG9mIG91dHB1dCBmaWxlCisJCQkJCWZzdGF0KFRULmZpbGVpbiwgJnN0YXRidWYpOworCQkJCQlmY2htb2QoVFQuZmlsZW91dCwgc3RhdGJ1Zi5zdF9tb2RlKTsKKworCQkJCQlUVC5saW5lbnVtID0gMDsKKwkJCQkJVFQuaHVua251bSA9IDA7CisJCQkJfQorCQkJfQorCisJCQlUVC5odW5rbnVtKys7CisKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLy8gSWYgd2UgZGlkbid0IGNvbnRpbnVlIGFib3ZlLCBkaXNjYXJkIHRoaXMgbGluZS4KKwkJZnJlZShwYXRjaGxpbmUpOworCX0KKworCWZpbmlzaF9vbGRmaWxlKCk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZnJlZShvbGRuYW1lKTsKKwkJZnJlZShuZXduYW1lKTsKKwl9CisKKwlyZXR1cm4gVFQuZXhpdHZhbDsKK30KZGlmZiAtLWdpdCBhL2VkaXRvcnMvcGF0Y2hfYmJveC5jIGIvZWRpdG9ycy9wYXRjaF9iYm94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFlN2I3OQotLS0gL2Rldi9udWxsCisrKyBiL2VkaXRvcnMvcGF0Y2hfYmJveC5jCkBAIC0wLDAgKzEsMzA2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBidXN5Ym94IHBhdGNoIGFwcGxldCB0byBoYW5kbGUgdGhlIHVuaWZpZWQgZGlmZiBmb3JtYXQuCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgR2xlbm4gTWNHcmF0aAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogVGhpcyBhcHBsZXQgaXMgd3JpdHRlbiB0byB3b3JrIHdpdGggcGF0Y2hlcyBnZW5lcmF0ZWQgYnkgR05VIGRpZmYsCisgKiB3aGVyZSB0aGVyZSBpcyBlcXVpdmFsZW50IGZ1bmN0aW9uYWxpdHkgYnVzeWJveCBwYXRjaCBzaGFsbCBiZWhhdmUKKyAqIGFzIHBlciBHTlUgcGF0Y2guCisgKgorICogVGhlcmUgaXMgYSBTVVN2MyBzcGVjaWZpY2F0aW9uIGZvciBwYXRjaCwgaG93ZXZlciBpdCBsb29rcyB0byBiZQorICogaW5jb21wbGV0ZSwgaXQgZG9lc250IGV2ZW4gbWVudGlvbiB1bmlmaWVkIGRpZmYgZm9ybWF0LgorICogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9wYXRjaC5odG1sCisgKgorICogSXNzdWVzCisgKiAtIE5vbi1pbnRlcmFjdGl2ZQorICogLSBQYXRjaGVzIG11c3QgYXBwbHkgY2xlYW5seSBvciBwYXRjaCAobm90IGp1c3Qgb25lIGh1bmspIHdpbGwgZmFpbC4KKyAqIC0gUmVqZWN0IGZpbGUgaXNudCBzYXZlZAorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdGF0aWMgdW5zaWduZWQgY29weV9saW5lcyhGSUxFICpzcmNfc3RyZWFtLCBGSUxFICpkc3Rfc3RyZWFtLCB1bnNpZ25lZCBsaW5lc19jb3VudCkKK3sKKwl3aGlsZSAoc3JjX3N0cmVhbSAmJiBsaW5lc19jb3VudCkgeworCQljaGFyICpsaW5lOworCQlsaW5lID0geG1hbGxvY19mZ2V0cyhzcmNfc3RyZWFtKTsKKwkJaWYgKGxpbmUgPT0gTlVMTCkgeworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGZwdXRzKGxpbmUsIGRzdF9zdHJlYW0pID09IEVPRikgeworCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJlcnJvciB3cml0aW5nIHRvIG5ldyBmaWxlIik7CisJCX0KKwkJZnJlZShsaW5lKTsKKwkJbGluZXNfY291bnQtLTsKKwl9CisJcmV0dXJuIGxpbmVzX2NvdW50OworfQorCisvKiBJZiBwYXRjaF9sZXZlbCBpcyAtMSBpdCB3aWxsIHJlbW92ZSBhbGwgZGlyZWN0b3J5IG5hbWVzCisgKiBjaGFyICpsaW5lIG11c3QgYmUgZ3JlYXRlciB0aGFuIDQgY2hhcnMKKyAqIHJldHVybnMgTlVMTCBpZiB0aGUgZmlsZSBkb2VzbnQgZXhpc3Qgb3IgZXJyb3IKKyAqIHJldHVybnMgbWFsbG9jJ2VkIGZpbGVuYW1lCisgKiBOQjogZnJlZXMgMXN0IGFyZ3VtZW50IQorICovCitzdGF0aWMgY2hhciAqZXh0cmFjdF9maWxlbmFtZShjaGFyICpsaW5lLCBpbnQgcGF0Y2hfbGV2ZWwsIGNvbnN0IGNoYXIgKnBhdCkKK3sKKwljaGFyICp0ZW1wID0gTlVMTCwgKmZpbGVuYW1lX3N0YXJ0X3B0ciA9IGxpbmUgKyA0OworCisJaWYgKHN0cm5jbXAobGluZSwgcGF0LCA0KSA9PSAwKSB7CisJCS8qIFRlcm1pbmF0ZSBzdHJpbmcgYXQgZW5kIG9mIHNvdXJjZSBmaWxlbmFtZSAqLworCQlsaW5lW3N0cmNzcG4obGluZSwgIlx0XG5cciIpXSA9ICdcMCc7CisKKwkJLyogU2tpcCBvdmVyIChwYXRjaF9sZXZlbCkgbnVtYmVyIG9mIGxlYWRpbmcgZGlyZWN0b3JpZXMgKi8KKwkJd2hpbGUgKHBhdGNoX2xldmVsLS0pIHsKKwkJCXRlbXAgPSBzdHJjaHIoZmlsZW5hbWVfc3RhcnRfcHRyLCAnLycpOworCQkJaWYgKCF0ZW1wKQorCQkJCWJyZWFrOworCQkJZmlsZW5hbWVfc3RhcnRfcHRyID0gdGVtcCArIDE7CisJCX0KKwkJdGVtcCA9IHhzdHJkdXAoZmlsZW5hbWVfc3RhcnRfcHRyKTsKKwl9CisJZnJlZShsaW5lKTsKKwlyZXR1cm4gdGVtcDsKK30KKworaW50IHBhdGNoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwYXRjaF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHN0YXQgc2F2ZWRfc3RhdDsKKwljaGFyICpwYXRjaF9saW5lOworCUZJTEUgKnBhdGNoX2ZpbGU7CisJaW50IHBhdGNoX2xldmVsOworCWludCByZXQgPSAwOworCWNoYXIgcGx1cyA9ICcrJzsKKwl1bnNpZ25lZCBvcHQ7CisJZW51bSB7CisJCU9QVF9SID0gKDEgPDwgMiksCisJCU9QVF9OID0gKDEgPDwgMyksCisJCS8qT1BUX2YgPSAoMSA8PCA0KSwgaWdub3JlZCAqLworCQkvKk9QVF9FID0gKDEgPDwgNSksIGlnbm9yZWQsIHRoaXMgaXMgdGhlIGRlZmF1bHQgKi8KKwkJLypPUFRfZyA9ICgxIDw8IDYpLCBpZ25vcmVkICovCisJCU9QVF9kcnlfcnVuID0gKDEgPDwgNykgKiBFTkFCTEVfTE9OR19PUFRTLAorCX07CisKKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSAyOworCXsKKwkJY29uc3QgY2hhciAqcCA9ICItMSI7CisJCWNvbnN0IGNoYXIgKmkgPSAiLSI7IC8qIGNvbXBhdCAqLworI2lmIEVOQUJMRV9MT05HX09QVFMKKwkJc3RhdGljIGNvbnN0IGNoYXIgcGF0Y2hfbG9uZ29wdHNbXSBBTElHTjEgPQorCQkJInN0cmlwXDAiICAgICAgICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAicCIKKwkJCSJpbnB1dFwwIiAgICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgImkiCisJCQkicmV2ZXJzZVwwIiAgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJSIgorCQkJImZvcndhcmRcMCIgICAgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiTiIKKwkJLyogIkFzc3VtZSB1c2VyIGtub3dzIHdoYXQgW3NdaGUgaXMgZG9pbmcsIGRvIG5vdCBhc2sgYW55IHF1ZXN0aW9ucyI6ICovCisJCQkiZm9yY2VcMCIgICAgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJmIiAvKmlnbm9yZWQqLworIyBpZiBFTkFCTEVfREVTS1RPUAorCQkJInJlbW92ZS1lbXB0eS1maWxlc1wwIiAgICBOb19hcmd1bWVudCAgICAgICAiRSIgLyppZ25vcmVkKi8KKwkJLyogIkNvbnRyb2xzIGFjdGlvbnMgd2hlbiBhIGZpbGUgaXMgdW5kZXIgUkNTIG9yIFNDQ1MgY29udHJvbCwKKwkJICogYW5kIGRvZXMgbm90IGV4aXN0IG9yIGlzIHJlYWQtb25seSBhbmQgbWF0Y2hlcyB0aGUgZGVmYXVsdCB2ZXJzaW9uLAorCQkgKiBvciB3aGVuIGEgZmlsZSBpcyB1bmRlciBDbGVhckNhc2UgY29udHJvbCBhbmQgZG9lcyBub3QgZXhpc3QuLi4iCisJCSAqIElPVzogcmF0aGVyIG9ic2N1cmUgb3B0aW9uLgorCQkgKiBCdXQgR2VudG9vJ3MgcG9ydGFnZSBkb2VzIHVzZSAtZzAgKi8KKwkJCSJnZXRcMCIgICAgICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgImciIC8qaWdub3JlZCovCisjIGVuZGlmCisJCQkiZHJ5LXJ1blwwIiAgICAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJceGZkIgorIyBpZiBFTkFCTEVfREVTS1RPUAorCQkJImJhY2t1cC1pZi1taXNtYXRjaFwwIiAgICBOb19hcmd1bWVudCAgICAgICAiXHhmZSIgLyppZ25vcmVkKi8KKwkJCSJuby1iYWNrdXAtaWYtbWlzbWF0Y2hcMCIgTm9fYXJndW1lbnQgICAgICAgIlx4ZmYiIC8qaWdub3JlZCovCisjIGVuZGlmCisJCQk7CisJCWFwcGxldF9sb25nX29wdGlvbnMgPSBwYXRjaF9sb25nb3B0czsKKyNlbmRpZgorCQkvKiAtZiwtRSwtZyBhcmUgaWdub3JlZCAqLworCQlvcHQgPSBnZXRvcHQzMihhcmd2LCAicDppOlJOIiJmRWc6IiwgJnAsICZpLCBOVUxMKTsKKwkJaWYgKG9wdCAmIE9QVF9SKQorCQkJcGx1cyA9ICctJzsKKwkJcGF0Y2hfbGV2ZWwgPSB4YXRvaShwKTsgLyogY2FuIGJlIG5lZ2F0aXZlISAqLworCQlwYXRjaF9maWxlID0geGZvcGVuX3N0ZGluKGkpOworCX0KKworCXBhdGNoX2xpbmUgPSB4bWFsbG9jX2ZnZXRsaW5lKHBhdGNoX2ZpbGUpOworCXdoaWxlIChwYXRjaF9saW5lKSB7CisJCUZJTEUgKnNyY19zdHJlYW07CisJCUZJTEUgKmRzdF9zdHJlYW07CisJCS8vY2hhciAqb2xkX2ZpbGVuYW1lOworCQljaGFyICpuZXdfZmlsZW5hbWU7CisJCWNoYXIgKmJhY2t1cF9maWxlbmFtZSA9IE5VTEw7CisJCXVuc2lnbmVkIHNyY19jdXJfbGluZSA9IDE7CisJCXVuc2lnbmVkIGRzdF9jdXJfbGluZSA9IDA7CisJCXVuc2lnbmVkIGRzdF9iZWdfbGluZTsKKwkJdW5zaWduZWQgYmFkX2h1bmtfY291bnQgPSAwOworCQl1bnNpZ25lZCBodW5rX2NvdW50ID0gMDsKKwkJc21hbGxpbnQgY29weV90cmFpbGluZ19saW5lc19mbGFnID0gMDsKKworCQkvKiBTa2lwIGV2ZXJ5dGhpbmcgdXB0byB0aGUgIi0tLSIgbWFya2VyCisJCSAqIE5vIG5lZWQgdG8gcGFyc2UgdGhlIGxpbmVzICJPbmx5IGluIDxkaXI+IiwgYW5kICJkaWZmIDxhcmdzPiIKKwkJICovCisJCWRvIHsKKwkJCS8qIEV4dHJhY3QgdGhlIGZpbGVuYW1lIHVzZWQgYmVmb3JlIHRoZSBwYXRjaCB3YXMgZ2VuZXJhdGVkICovCisJCQluZXdfZmlsZW5hbWUgPSBleHRyYWN0X2ZpbGVuYW1lKHBhdGNoX2xpbmUsIHBhdGNoX2xldmVsLCAiLS0tICIpOworCQkJLy8gd2FzIG9sZF9maWxlbmFtZSBhYm92ZQorCQkJcGF0Y2hfbGluZSA9IHhtYWxsb2NfZmdldGxpbmUocGF0Y2hfZmlsZSk7CisJCQlpZiAoIXBhdGNoX2xpbmUpIGdvdG8gcXVpdDsKKwkJfSB3aGlsZSAoIW5ld19maWxlbmFtZSk7CisJCWZyZWUobmV3X2ZpbGVuYW1lKTsgLy8gInNvdXJjZSIgZmlsZW5hbWUgaXMgaXJyZWxldmFudAorCisJCW5ld19maWxlbmFtZSA9IGV4dHJhY3RfZmlsZW5hbWUocGF0Y2hfbGluZSwgcGF0Y2hfbGV2ZWwsICIrKysgIik7CisJCWlmICghbmV3X2ZpbGVuYW1lKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBwYXRjaCIpOworCQl9CisKKwkJLyogR2V0IGFjY2VzcyByaWdodHMgZnJvbSB0aGUgZmlsZSB0byBiZSBwYXRjaGVkICovCisJCWlmIChzdGF0KG5ld19maWxlbmFtZSwgJnNhdmVkX3N0YXQpICE9IDApIHsKKwkJCWNoYXIgKnNsYXNoID0gc3RycmNocihuZXdfZmlsZW5hbWUsICcvJyk7CisJCQlpZiAoc2xhc2gpIHsKKwkJCQkvKiBDcmVhdGUgbGVhZGluZyBkaXJlY3RvcmllcyAqLworCQkJCSpzbGFzaCA9ICdcMCc7CisJCQkJYmJfbWFrZV9kaXJlY3RvcnkobmV3X2ZpbGVuYW1lLCAtMSwgRklMRVVUSUxTX1JFQ1VSKTsKKwkJCQkqc2xhc2ggPSAnLyc7CisJCQl9CisJCQlzcmNfc3RyZWFtID0gTlVMTDsKKwkJCXNhdmVkX3N0YXQuc3RfbW9kZSA9IDA2NDQ7CisJCX0gZWxzZSBpZiAoIShvcHQgJiBPUFRfZHJ5X3J1bikpIHsKKwkJCWJhY2t1cF9maWxlbmFtZSA9IHhhc3ByaW50ZigiJXMub3JpZyIsIG5ld19maWxlbmFtZSk7CisJCQl4cmVuYW1lKG5ld19maWxlbmFtZSwgYmFja3VwX2ZpbGVuYW1lKTsKKwkJCXNyY19zdHJlYW0gPSB4Zm9wZW5fZm9yX3JlYWQoYmFja3VwX2ZpbGVuYW1lKTsKKwkJfSBlbHNlCisJCQlzcmNfc3RyZWFtID0geGZvcGVuX2Zvcl9yZWFkKG5ld19maWxlbmFtZSk7CisKKwkJaWYgKG9wdCAmIE9QVF9kcnlfcnVuKSB7CisJCQlkc3Rfc3RyZWFtID0geGZvcGVuX2Zvcl93cml0ZSgiL2Rldi9udWxsIik7CisJCX0gZWxzZSB7CisJCQlkc3Rfc3RyZWFtID0geGZvcGVuX2Zvcl93cml0ZShuZXdfZmlsZW5hbWUpOworCQkJZmNobW9kKGZpbGVubyhkc3Rfc3RyZWFtKSwgc2F2ZWRfc3RhdC5zdF9tb2RlKTsKKwkJfQorCisJCXByaW50ZigicGF0Y2hpbmcgZmlsZSAlc1xuIiwgbmV3X2ZpbGVuYW1lKTsKKworCQkvKiBIYW5kbGUgYWxsIGh1bmtzIGZvciB0aGlzIGZpbGUgKi8KKwkJcGF0Y2hfbGluZSA9IHhtYWxsb2NfZmdldHMocGF0Y2hfZmlsZSk7CisJCXdoaWxlIChwYXRjaF9saW5lKSB7CisJCQl1bnNpZ25lZCBjb3VudDsKKwkJCXVuc2lnbmVkIHNyY19iZWdfbGluZTsKKwkJCXVuc2lnbmVkIGh1bmtfb2Zmc2V0X3N0YXJ0OworCQkJdW5zaWduZWQgc3JjX2xhc3RfbGluZSA9IDE7CisJCQl1bnNpZ25lZCBkc3RfbGFzdF9saW5lID0gMTsKKworCQkJaWYgKChzc2NhbmYocGF0Y2hfbGluZSwgIkBAIC0ldSwldSArJXUsJXUiLCAmc3JjX2JlZ19saW5lLCAmc3JjX2xhc3RfbGluZSwgJmRzdF9iZWdfbGluZSwgJmRzdF9sYXN0X2xpbmUpIDwgMykKKwkJCSAmJiAoc3NjYW5mKHBhdGNoX2xpbmUsICJAQCAtJXUgKyV1LCV1IiwgJnNyY19iZWdfbGluZSwgJmRzdF9iZWdfbGluZSwgJmRzdF9sYXN0X2xpbmUpIDwgMikKKwkJCSkgeworCQkJCS8qIE5vIG1vcmUgaHVua3MgZm9yIHRoaXMgZmlsZSAqLworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHBsdXMgIT0gJysnKSB7CisJCQkJLyogcmV2ZXJzZSBwYXRjaCAqLworCQkJCXVuc2lnbmVkIHRtcCA9IHNyY19sYXN0X2xpbmU7CisJCQkJc3JjX2xhc3RfbGluZSA9IGRzdF9sYXN0X2xpbmU7CisJCQkJZHN0X2xhc3RfbGluZSA9IHRtcDsKKwkJCQl0bXAgPSBzcmNfYmVnX2xpbmU7CisJCQkJc3JjX2JlZ19saW5lID0gZHN0X2JlZ19saW5lOworCQkJCWRzdF9iZWdfbGluZSA9IHRtcDsKKwkJCX0KKwkJCWh1bmtfY291bnQrKzsKKworCQkJaWYgKHNyY19iZWdfbGluZSAmJiBkc3RfYmVnX2xpbmUpIHsKKwkJCQkvKiBDb3B5IHVubW9kaWZpZWQgbGluZXMgdXB0byBzdGFydCBvZiBodW5rICovCisJCQkJLyogc3JjX2JlZ19saW5lIHdpbGwgYmUgMCBpZiBpdCdzIGEgbmV3IGZpbGUgKi8KKwkJCQljb3VudCA9IHNyY19iZWdfbGluZSAtIHNyY19jdXJfbGluZTsKKwkJCQlpZiAoY29weV9saW5lcyhzcmNfc3RyZWFtLCBkc3Rfc3RyZWFtLCBjb3VudCkpIHsKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBzcmMgZmlsZSIpOworCQkJCX0KKwkJCQlzcmNfY3VyX2xpbmUgKz0gY291bnQ7CisJCQkJZHN0X2N1cl9saW5lICs9IGNvdW50OworCQkJCWNvcHlfdHJhaWxpbmdfbGluZXNfZmxhZyA9IDE7CisJCQl9CisJCQlzcmNfbGFzdF9saW5lICs9IGh1bmtfb2Zmc2V0X3N0YXJ0ID0gc3JjX2N1cl9saW5lOworCQkJZHN0X2xhc3RfbGluZSArPSBkc3RfY3VyX2xpbmU7CisKKwkJCXdoaWxlICgxKSB7CisJCQkJZnJlZShwYXRjaF9saW5lKTsKKwkJCQlwYXRjaF9saW5lID0geG1hbGxvY19mZ2V0cyhwYXRjaF9maWxlKTsKKwkJCQlpZiAocGF0Y2hfbGluZSA9PSBOVUxMKQorCQkJCQlicmVhazsgLyogRU9GICovCisJCQkJaWYgKCEqcGF0Y2hfbGluZSkgeworCQkJCQkvKiB3aGl0ZXNwYWNlLWRhbWFnZWQgcGF0Y2ggd2l0aCAiIiBsaW5lcyAqLworCQkJCQlmcmVlKHBhdGNoX2xpbmUpOworCQkJCQlwYXRjaF9saW5lID0geHN0cmR1cCgiICIpOworCQkJCX0KKwkJCQlpZiAoKCpwYXRjaF9saW5lICE9ICctJykgJiYgKCpwYXRjaF9saW5lICE9ICcrJykKKwkJCQkgJiYgKCpwYXRjaF9saW5lICE9ICcgJykKKwkJCQkpIHsKKwkJCQkJYnJlYWs7IC8qIEVuZCBvZiBodW5rICovCisJCQkJfQorCQkJCWlmICgqcGF0Y2hfbGluZSAhPSBwbHVzKSB7IC8qICctJyBvciAnICcgKi8KKwkJCQkJY2hhciAqc3JjX2xpbmUgPSBOVUxMOworCQkJCQlpZiAoc3JjX2N1cl9saW5lID09IHNyY19sYXN0X2xpbmUpCisJCQkJCQlicmVhazsKKwkJCQkJaWYgKHNyY19zdHJlYW0pIHsKKwkJCQkJCXNyY19saW5lID0geG1hbGxvY19mZ2V0cyhzcmNfc3RyZWFtKTsKKwkJCQkJCWlmIChzcmNfbGluZSkgeworCQkJCQkJCWludCBkaWZmID0gc3RyY21wKHNyY19saW5lLCBwYXRjaF9saW5lICsgMSk7CisJCQkJCQkJc3JjX2N1cl9saW5lKys7CisJCQkJCQkJZnJlZShzcmNfbGluZSk7CisJCQkJCQkJaWYgKGRpZmYpCisJCQkJCQkJCXNyY19saW5lID0gTlVMTDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQkvKiBEbyBub3QgcGF0Y2ggYW4gYWxyZWFkeSBwYXRjaGVkIGh1bmsgd2l0aCAtTiAqLworCQkJCQlpZiAoc3JjX2xpbmUgPT0gMCAmJiAob3B0ICYgT1BUX04pKSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlpZiAoIXNyY19saW5lKSB7CisJCQkJCQliYl9lcnJvcl9tc2coImh1bmsgIyV1IEZBSUxFRCBhdCAldSIsIGh1bmtfY291bnQsIGh1bmtfb2Zmc2V0X3N0YXJ0KTsKKwkJCQkJCWJhZF9odW5rX2NvdW50Kys7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQlpZiAoKnBhdGNoX2xpbmUgIT0gJyAnKSB7IC8qICctJyAqLworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKGRzdF9jdXJfbGluZSA9PSBkc3RfbGFzdF9saW5lKQorCQkJCQlicmVhazsKKwkJCQlmcHV0cyhwYXRjaF9saW5lICsgMSwgZHN0X3N0cmVhbSk7CisJCQkJZHN0X2N1cl9saW5lKys7CisJCQl9IC8qIGVuZCBvZiB3aGlsZSBsb29wIGhhbmRsaW5nIG9uZSBodW5rICovCisJCX0gLyogZW5kIG9mIHdoaWxlIGxvb3AgaGFuZGxpbmcgb25lIGZpbGUgKi8KKworCQkvKiBDbGVhbnVwIGxhc3QgcGF0Y2hlZCBmaWxlICovCisJCWlmIChjb3B5X3RyYWlsaW5nX2xpbmVzX2ZsYWcpIHsKKwkJCWNvcHlfbGluZXMoc3JjX3N0cmVhbSwgZHN0X3N0cmVhbSwgKHVuc2lnbmVkKSgtMSkpOworCQl9CisJCWlmIChzcmNfc3RyZWFtKSB7CisJCQlmY2xvc2Uoc3JjX3N0cmVhbSk7CisJCX0KKwkJZmNsb3NlKGRzdF9zdHJlYW0pOworCQlpZiAoYmFkX2h1bmtfY291bnQpIHsKKwkJCXJldCA9IDE7CisJCQliYl9lcnJvcl9tc2coIiV1IG91dCBvZiAldSBodW5rIEZBSUxFRCIsIGJhZF9odW5rX2NvdW50LCBodW5rX2NvdW50KTsKKwkJfSBlbHNlIHsKKwkJCS8qIEl0IHdvcmtlZCwgd2UgY2FuIHJlbW92ZSB0aGUgYmFja3VwICovCisJCQlpZiAoYmFja3VwX2ZpbGVuYW1lKSB7CisJCQkJdW5saW5rKGJhY2t1cF9maWxlbmFtZSk7CisJCQl9CisJCQlpZiAoIShvcHQgJiBPUFRfZHJ5X3J1bikKKwkJCSAmJiAoKGRzdF9jdXJfbGluZSA9PSAwKSB8fCAoZHN0X2JlZ19saW5lID09IDApKQorCQkJKSB7CisJCQkJLyogVGhlIG5ldyBwYXRjaGVkIGZpbGUgaXMgZW1wdHksIHJlbW92ZSBpdCAqLworCQkJCXh1bmxpbmsobmV3X2ZpbGVuYW1lKTsKKwkJCQkvLyAvKiBvbGRfZmlsZW5hbWUgYW5kIG5ld19maWxlbmFtZSBtYXkgYmUgdGhlIHNhbWUgZmlsZSAqLworCQkJCS8vIHVubGluayhvbGRfZmlsZW5hbWUpOworCQkJfQorCQl9CisJCWZyZWUoYmFja3VwX2ZpbGVuYW1lKTsKKwkJLy9mcmVlKG9sZF9maWxlbmFtZSk7CisJCWZyZWUobmV3X2ZpbGVuYW1lKTsKKwl9IC8qIGVuZCBvZiAid2hpbGUgdGhlcmUgYXJlIHBhdGNoIGxpbmVzIiAqLworIHF1aXQ6CisJLyogMCA9IFNVQ0NFU1MKKwkgKiAxID0gU29tZSBodW5rcyBmYWlsZWQKKwkgKiAyID0gTW9yZSBzZXJpb3VzIHByb2JsZW1zIChleGl0ZWQgZWFybGllcikKKwkgKi8KKwlyZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvZWRpdG9ycy9wYXRjaF90b3lib3guYyBiL2VkaXRvcnMvcGF0Y2hfdG95Ym94LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwYmYwNwotLS0gL2Rldi9udWxsCisrKyBiL2VkaXRvcnMvcGF0Y2hfdG95Ym94LmMKQEAgLTAsMCArMSw1OTEgQEAKKy8qIEFkYXB0ZWQgZnJvbSB0b3lib3gncyBwYXRjaC4gKi8KKworLyogdmk6IHNldCBzdz00IHRzPTQ6CisgKgorICogcGF0Y2guYyAtIEFwcGx5IGEgInVuaXZlcnNhbCIgZGlmZi4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNyBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIHNlZSBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDk2OTUzOTkvdXRpbGl0aWVzL3BhdGNoLmh0bWwKKyAqIChCdXQgb25seSBkb2VzIC11LCBiZWNhdXNlIHdobyBzdGlsbCBjYXJlcyBhYm91dCAiZWQiPykKKyAqCisgKiBUT0RPOgorICogLWIgYmFja3VwCisgKiAtbCB0cmVhdCBhbGwgd2hpdGVzcGFjZSBhcyBhIHNpbmdsZSBzcGFjZQorICogLU4gaWdub3JlIGFscmVhZHkgYXBwbGllZAorICogLWQgY2hkaXIgZmlyc3QKKyAqIC1EIGRlZmluZSB3cmFwICNpZmRlZiBhbmQgI2lmbmRlZiBhcm91bmQgY2hhbmdlcworICogLW8gb3V0ZmlsZSBvdXRwdXQgaGVyZSBpbnN0ZWFkIG9mIGluIHBsYWNlCisgKiAtciByZWplY3RmaWxlIHdyaXRlIHJlamVjdGVkIGh1bmtzIHRvIHRoaXMgZmlsZQorICoKKyAqIC1FIHJlbW92ZSBlbXB0eSBmaWxlcyAtLXJlbW92ZS1lbXB0eS1maWxlcworICogLWYgZm9yY2UgKG5vIHF1ZXN0aW9ucyBhc2tlZCkKKyAqIC1GIGZ1enogKG51bWJlciwgZGVmYXVsdCAyKQorICogW2ZpbGVdIHdoaWNoIGZpbGUgdG8gcGF0Y2gKKworVVNFX1BBVENIKE5FV1RPWShwYXRjaCwgVVNFX1RPWUJPWF9ERUJVRygieCIpInVwI2k6UiIsIFRPWUZMQUdfVVNSfFRPWUZMQUdfQklOKSkKKworY29uZmlnIFBBVENICisJYm9vbCAicGF0Y2giCisJZGVmYXVsdCB5CisJaGVscAorCSAgdXNhZ2U6IHBhdGNoIFstaSBmaWxlXSBbLXAgZGVwdGhdIFstUnVdCisKKwkgIEFwcGx5IGEgdW5pZmllZCBkaWZmIHRvIG9uZSBvciBtb3JlIGZpbGVzLgorCisJICAtaQlJbnB1dCBmaWxlIChkZWZhdWx0cz1zdGRpbikKKwkgIC1wCW51bWJlciBvZiAnLycgdG8gc3RyaXAgZnJvbSBzdGFydCBvZiBmaWxlIHBhdGhzIChkZWZhdWx0PWFsbCkKKwkgIC1SCVJldmVyc2UgcGF0Y2guCisJICAtdQlJZ25vcmVkIChvbmx5IGhhbmRsZXMgInVuaWZpZWQiIGRpZmZzKQorCisJICBUaGlzIHZlcnNpb24gb2YgcGF0Y2ggb25seSBoYW5kbGVzIHVuaWZpZWQgZGlmZnMsIGFuZCBvbmx5IG1vZGlmaWVzCisJICBhIGZpbGUgd2hlbiBhbGwgYWxsIGh1bmtzIHRvIHRoYXQgZmlsZSBhcHBseS4gIFBhdGNoIHByaW50cyBmYWlsZWQKKwkgIGh1bmtzIHRvIHN0ZGVyciwgYW5kIGV4aXRzIHdpdGggbm9uemVybyBzdGF0dXMgaWYgYW55IGh1bmtzIGZhaWwuCisKKwkgIEEgZmlsZSBjb21wYXJlZCBhZ2FpbnN0IC9kZXYvbnVsbCAob3Igd2l0aCBhIGRhdGUgPD0gdGhlIGVwb2NoKSBpcworCSAgY3JlYXRlZC9kZWxldGVkIGFzIGFwcHJvcHJpYXRlLgorKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdHJ1Y3QgZG91YmxlX2xpc3QgeworCXN0cnVjdCBkb3VibGVfbGlzdCAqbmV4dDsKKwlzdHJ1Y3QgZG91YmxlX2xpc3QgKnByZXY7CisJY2hhciAqZGF0YTsKK307CisKKy8vIFJldHVybiB0aGUgZmlyc3QgaXRlbSBmcm9tIHRoZSBsaXN0LCBhZHZhbmNpbmcgdGhlIGxpc3QgKHdoaWNoIG11c3QgYmUgY2FsbGVkCisvLyBhcyAmbGlzdCkKK3N0YXRpYwordm9pZCAqVE9ZX2xsaXN0X3BvcCh2b2lkICpsaXN0KQoreworCS8vIEknZCB1c2UgYSB2b2lkICoqIGZvciB0aGUgYXJndW1lbnQsIGFuZCBldmVuIGFjY2VwdCB0aGUgdHlwZWNhc3QgaW4gYWxsCisJLy8gY2FsbGVycyBhcyBkb2N1bWVudGF0aW9uIHlvdSBuZWVkIHRoZSAmLCBleGNlcHQgdGhlIHN0dXBpZCBjb21waWxlcgorCS8vIHdvdWxkIHRoZW4gc2NyZWFtIGFib3V0IHR5cGUtcHVubmVkIHBvaW50ZXJzLiAgU2NyZXcgaXQuCisJdm9pZCAqKmxsaXN0ID0gKHZvaWQgKiopbGlzdDsKKwl2b2lkICoqbmV4dCA9ICh2b2lkICoqKSpsbGlzdDsKKwkqbGxpc3QgPSAqbmV4dDsKKworCXJldHVybiAodm9pZCAqKW5leHQ7Cit9CisKKy8vIEZyZWUgYWxsIHRoZSBlbGVtZW50cyBvZiBhIGxpbmtlZCBsaXN0CisvLyBpZiBmcmVlaXQhPU5VTEwgY2FsbCBmcmVlaXQoKSBvbiBlYWNoIGVsZW1lbnQgYmVmb3JlIGZyZWVpbmcgaXQuCitzdGF0aWMKK3ZvaWQgVE9ZX2xsaXN0X2ZyZWUodm9pZCAqbGlzdCwgdm9pZCAoKmZyZWVpdCkodm9pZCAqZGF0YSkpCit7CisJd2hpbGUgKGxpc3QpIHsKKwkJdm9pZCAqcG9wID0gVE9ZX2xsaXN0X3BvcCgmbGlzdCk7CisJCWlmIChmcmVlaXQpIGZyZWVpdChwb3ApOworCQllbHNlIGZyZWUocG9wKTsKKworCQkvLyBFbmQgZG91Ymx5IGxpbmtlZCBsaXN0IHRvby4KKwkJaWYgKGxpc3Q9PXBvcCkgYnJlYWs7CisJfQorfQorCisvLyBBZGQgYW4gZW50cnkgdG8gdGhlIGVuZCBvZmYgYSBkb3VibHkgbGlua2VkIGxpc3QKK3N0YXRpYworc3RydWN0IGRvdWJsZV9saXN0ICpkbGlzdF9hZGQoc3RydWN0IGRvdWJsZV9saXN0ICoqbGlzdCwgY2hhciAqZGF0YSkKK3sKKwlzdHJ1Y3QgZG91YmxlX2xpc3QgKmxpbmUgPSB4bWFsbG9jKHNpemVvZihzdHJ1Y3QgZG91YmxlX2xpc3QpKTsKKworCWxpbmUtPmRhdGEgPSBkYXRhOworCWlmICgqbGlzdCkgeworCQlsaW5lLT5uZXh0ID0gKmxpc3Q7CisJCWxpbmUtPnByZXYgPSAoKmxpc3QpLT5wcmV2OworCQkoKmxpc3QpLT5wcmV2LT5uZXh0ID0gbGluZTsKKwkJKCpsaXN0KS0+cHJldiA9IGxpbmU7CisJfSBlbHNlICpsaXN0ID0gbGluZS0+bmV4dCA9IGxpbmUtPnByZXYgPSBsaW5lOworCisJcmV0dXJuIGxpbmU7Cit9CisKKy8vIEVuc3VyZSBlbnRpcmUgcGF0aCBleGlzdHMuCisvLyBJZiBtb2RlICE9IC0xIHNldCBwZXJtaXNzaW9ucyBvbiBuZXdseSBjcmVhdGVkIGRpcnMuCisvLyBSZXF1aXJlcyB0aGF0IHBhdGggc3RyaW5nIGJlIHdyaXRhYmxlIChmb3IgdGVtcG9yYXJ5IG51bGwgdGVybWluYXRvcnMpLgorc3RhdGljCit2b2lkIHhta3BhdGgoY2hhciAqcGF0aCwgaW50IG1vZGUpCit7CisJY2hhciAqcCwgb2xkOworCW1vZGVfdCBtYXNrOworCWludCByYzsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWZvciAocCA9IHBhdGg7IDsgcCsrKSB7CisJCWlmICghKnAgfHwgKnAgPT0gJy8nKSB7CisJCQlvbGQgPSAqcDsKKwkJCSpwID0gcmMgPSAwOworCQkJaWYgKHN0YXQocGF0aCwgJnN0KSB8fCAhU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJCWlmIChtb2RlICE9IC0xKSB7CisJCQkJCW1hc2sgPSB1bWFzaygwKTsKKwkJCQkJcmMgPSBta2RpcihwYXRoLCBtb2RlKTsKKwkJCQkJdW1hc2sobWFzayk7CisJCQkJfSBlbHNlIHJjID0gbWtkaXIocGF0aCwgMDc3Nyk7CisJCQl9CisJCQkqcCA9IG9sZDsKKwkJCWlmKHJjKSBiYl9wZXJyb3JfbXNnX2FuZF9kaWUoIm1rcGF0aCAnJXMnIiwgcGF0aCk7CisJCX0KKwkJaWYgKCEqcCkgYnJlYWs7CisJfQorfQorCisvLyBTbG93LCBidXQgc21hbGwuCitzdGF0aWMKK2NoYXIgKmdldF9yYXdsaW5lKGludCBmZCwgbG9uZyAqcGxlbiwgY2hhciBlbmQpCit7CisJY2hhciBjLCAqYnVmID0gTlVMTDsKKwlsb25nIGxlbiA9IDA7CisKKwlmb3IgKDs7KSB7CisJCWlmICgxPnJlYWQoZmQsICZjLCAxKSkgYnJlYWs7CisJCWlmICghKGxlbiAmIDYzKSkgYnVmPXhyZWFsbG9jKGJ1ZiwgbGVuKzY1KTsKKwkJaWYgKChidWZbbGVuKytdPWMpID09IGVuZCkgYnJlYWs7CisJfQorCWlmIChidWYpIGJ1ZltsZW5dPTA7CisJaWYgKHBsZW4pICpwbGVuID0gbGVuOworCisJcmV0dXJuIGJ1ZjsKK30KKworc3RhdGljCitjaGFyICpnZXRfbGluZShpbnQgZmQpCit7CisJbG9uZyBsZW47CisJY2hhciAqYnVmID0gZ2V0X3Jhd2xpbmUoZmQsICZsZW4sICdcbicpOworCisJaWYgKGJ1ZiAmJiBidWZbLS1sZW5dPT0nXG4nKSBidWZbbGVuXT0wOworCisJcmV0dXJuIGJ1ZjsKK30KKworLy8gQ29weSB0aGUgcmVzdCBvZiBpbiB0byBvdXQgYW5kIGNsb3NlIGJvdGggZmlsZXMuCitzdGF0aWMKK3ZvaWQgeHNlbmRmaWxlKGludCBpbiwgaW50IG91dCkKK3sKKwlsb25nIGxlbjsKKwljaGFyIGJ1Zls0MDk2XTsKKworCWlmIChpbjwwKSByZXR1cm47CisJZm9yICg7OykgeworCQlsZW4gPSBzYWZlX3JlYWQoaW4sIGJ1ZiwgNDA5Nik7CisJCWlmIChsZW48MSkgYnJlYWs7CisJCXh3cml0ZShvdXQsIGJ1ZiwgbGVuKTsKKwl9Cit9CisKKy8vIENvcHkgdGhlIHJlc3Qgb2YgdGhlIGRhdGEgYW5kIHJlcGxhY2UgdGhlIG9yaWdpbmFsIHdpdGggdGhlIGNvcHkuCitzdGF0aWMKK3ZvaWQgcmVwbGFjZV90ZW1wZmlsZShpbnQgZmRpbiwgaW50IGZkb3V0LCBjaGFyICoqdGVtcG5hbWUpCit7CisJY2hhciAqdGVtcCA9IHhzdHJkdXAoKnRlbXBuYW1lKTsKKworCXRlbXBbc3RybGVuKHRlbXApLTZdPTA7CisJaWYgKGZkaW4gIT0gLTEpIHsKKwkJeHNlbmRmaWxlKGZkaW4sIGZkb3V0KTsKKwkJeGNsb3NlKGZkaW4pOworCX0KKwl4Y2xvc2UoZmRvdXQpOworCXJlbmFtZSgqdGVtcG5hbWUsIHRlbXApOworCWZyZWUoKnRlbXBuYW1lKTsKKwlmcmVlKHRlbXApOworCSp0ZW1wbmFtZSA9IE5VTEw7Cit9CisKKy8vIE9wZW4gYSB0ZW1wb3JhcnkgZmlsZSB0byBjb3B5IGFuIGV4aXN0aW5nIGZpbGUgaW50by4KK3N0YXRpYworaW50IGNvcHlfdGVtcGZpbGUoaW50IGZkaW4sIGNoYXIgKm5hbWUsIGNoYXIgKip0ZW1wbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCWludCBmZDsKKworCSp0ZW1wbmFtZSA9IHhhc3ByaW50ZigiJXNYWFhYWFgiLCBuYW1lKTsKKwlmZCA9IG1rc3RlbXAoKnRlbXBuYW1lKTsKKwlpZigtMSA9PSBmZCkgYmJfcGVycm9yX21zZ19hbmRfZGllKCJubyB0ZW1wIGZpbGUiKTsKKworCS8vIFNldCBwZXJtaXNzaW9ucyBvZiBvdXRwdXQgZmlsZQorCWZzdGF0KGZkaW4sICZzdGF0YnVmKTsKKwlmY2htb2QoZmQsIHN0YXRidWYuc3RfbW9kZSk7CisKKwlyZXR1cm4gZmQ7Cit9CisKKy8vIEFib3J0IHRoZSBjb3B5IGFuZCBkZWxldGUgdGhlIHRlbXBvcmFyeSBmaWxlLgorc3RhdGljCit2b2lkIGRlbGV0ZV90ZW1wZmlsZShpbnQgZmRpbiwgaW50IGZkb3V0LCBjaGFyICoqdGVtcG5hbWUpCit7CisJY2xvc2UoZmRpbik7CisJY2xvc2UoZmRvdXQpOworCXVubGluaygqdGVtcG5hbWUpOworCWZyZWUoKnRlbXBuYW1lKTsKKwkqdGVtcG5hbWUgPSBOVUxMOworfQorCisKKworc3RydWN0IGdsb2JhbHMgeworCWNoYXIgKmluZmlsZTsKKwlsb25nIHByZWZpeDsKKworCXN0cnVjdCBkb3VibGVfbGlzdCAqY3VycmVudF9odW5rOworCWxvbmcgb2xkbGluZSwgb2xkbGVuLCBuZXdsaW5lLCBuZXdsZW4sIGxpbmVudW07CisJaW50IGNvbnRleHQsIHN0YXRlLCBmaWxlaW4sIGZpbGVvdXQsIGZpbGVwYXRjaCwgaHVua251bTsKKwljaGFyICp0ZW1wbmFtZTsKKworCS8vIHdhcyB0b3lzLmZvbzoKKwlpbnQgZXhpdHZhbDsKK307CisjZGVmaW5lIFRUICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIElOSVRfVFQoKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoVFQpKSk7IFwKK30gd2hpbGUgKDApCisKKworLy9iYm94IGhhZDogInA6aTpSTiIKKyNkZWZpbmUgRkxBR19TVFIgIlJ1cDppOngiCisvKiBGTEFHX1JFVkVSU0UgbXVzdCBiZSA9PSAxISBDb2RlIHVzZXMgdGhpcyBmYWN0LiAqLworI2RlZmluZSBGTEFHX1JFVkVSU0UgKDEgPDwgMCkKKyNkZWZpbmUgRkxBR191ICAgICAgICgxIDw8IDEpCisjZGVmaW5lIEZMQUdfUEFUSExFTiAoMSA8PCAyKQorI2RlZmluZSBGTEFHX0lOUFVUICAgKDEgPDwgMykKKy8vbm9uLXN0YW5kYXJkOgorI2RlZmluZSBGTEFHX0RFQlVHICAgKDEgPDwgNCkKKworLy8gRGlzcG9zZSBvZiBhIGxpbmUgb2YgaW5wdXQsIGVpdGhlciBieSB3cml0aW5nIGl0IG91dCBvciBkaXNjYXJkaW5nIGl0LgorCisvLyBzdGF0ZSA8IDI6IGp1c3QgZnJlZQorLy8gc3RhdGUgPSAyOiB3cml0ZSB3aG9sZSBsaW5lIHRvIHN0ZGVycgorLy8gc3RhdGUgPSAzOiB3cml0ZSB3aG9sZSBsaW5lIHRvIGZpbGVvdXQKKy8vIHN0YXRlID4gMzogd3JpdGUgbGluZSsxIHRvIGZpbGVvdXQgd2hlbiAqbGluZSAhPSBzdGF0ZQorCisjZGVmaW5lIFBBVENIX0RFQlVHIChvcHRpb25fbWFzazMyICYgRkxBR19ERUJVRykKKworc3RhdGljIHZvaWQgZG9fbGluZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBkb3VibGVfbGlzdCAqZGxpc3QgPSAoc3RydWN0IGRvdWJsZV9saXN0ICopZGF0YTsKKworCWlmIChUVC5zdGF0ZT4xICYmICpkbGlzdC0+ZGF0YSAhPSBUVC5zdGF0ZSkKKwkJZmRwcmludGYoVFQuc3RhdGUgPT0gMiA/IDIgOiBUVC5maWxlb3V0LAorCQkJIiVzXG4iLCBkbGlzdC0+ZGF0YSsoVFQuc3RhdGU+MyA/IDEgOiAwKSk7CisKKwlpZiAoUEFUQ0hfREVCVUcpIGZkcHJpbnRmKDIsICJETyAlZDogJXNcbiIsIFRULnN0YXRlLCBkbGlzdC0+ZGF0YSk7CisKKwlmcmVlKGRsaXN0LT5kYXRhKTsKKwlmcmVlKGRhdGEpOworfQorCitzdGF0aWMgdm9pZCBmaW5pc2hfb2xkZmlsZSh2b2lkKQoreworCWlmIChUVC50ZW1wbmFtZSkgcmVwbGFjZV90ZW1wZmlsZShUVC5maWxlaW4sIFRULmZpbGVvdXQsICZUVC50ZW1wbmFtZSk7CisJVFQuZmlsZW91dCA9IFRULmZpbGVpbiA9IC0xOworfQorCitzdGF0aWMgdm9pZCBmYWlsX2h1bmsodm9pZCkKK3sKKwlpZiAoIVRULmN1cnJlbnRfaHVuaykgcmV0dXJuOworCVRULmN1cnJlbnRfaHVuay0+cHJldi0+bmV4dCA9IDA7CisKKwlmZHByaW50ZigyLCAiSHVuayAlZCBGQUlMRUQgJWxkLyVsZC5cbiIsIFRULmh1bmtudW0sIFRULm9sZGxpbmUsIFRULm5ld2xpbmUpOworCVRULmV4aXR2YWwgPSAxOworCisJLy8gSWYgd2UgZ290IHRvIHRoaXMgcG9pbnQsIHdlJ3ZlIHNlZWtlZCB0byB0aGUgZW5kLiAgRGlzY2FyZCBjaGFuZ2VzIHRvCisJLy8gdGhpcyBmaWxlIGFuZCBhZHZhbmNlIHRvIG5leHQgZmlsZS4KKworCVRULnN0YXRlID0gMjsKKwlUT1lfbGxpc3RfZnJlZShUVC5jdXJyZW50X2h1bmssIGRvX2xpbmUpOworCVRULmN1cnJlbnRfaHVuayA9IE5VTEw7CisJZGVsZXRlX3RlbXBmaWxlKFRULmZpbGVpbiwgVFQuZmlsZW91dCwgJlRULnRlbXBuYW1lKTsKKwlUVC5zdGF0ZSA9IDA7Cit9CisKKy8vIEdpdmVuIGEgaHVuayBvZiBhIHVuaWZpZWQgZGlmZiwgbWFrZSB0aGUgYXBwcm9wcmlhdGUgY2hhbmdlIHRvIHRoZSBmaWxlLgorLy8gVGhpcyBkb2VzIG5vdCB1c2UgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uLCBidXQgaW5zdGVhZCB0cmVhdHMgYSBodW5rCisvLyBhcyBhIHNvcnQgb2YgcmVnZXguICBDb3BpZXMgZGF0YSBmcm9tIGlucHV0IHRvIG91dHB1dCB1bnRpbCBpdCBmaW5kcworLy8gdGhlIGNoYW5nZSB0byBiZSBtYWRlLCB0aGVuIG91dHB1dHMgdGhlIGNoYW5nZWQgZGF0YSBhbmQgcmV0dXJucy4KKy8vIChGaW5kaW5nIEVPRiBmaXJzdCBpcyBhbiBlcnJvci4pICBUaGlzIGlzIGEgc2luZ2xlIHBhc3Mgb3BlcmF0aW9uLCBzbworLy8gbXVsdGlwbGUgaHVua3MgbXVzdCBvY2N1ciBpbiBvcmRlciBpbiB0aGUgZmlsZS4KKworc3RhdGljIGludCBhcHBseV9vbmVfaHVuayh2b2lkKQoreworCXN0cnVjdCBkb3VibGVfbGlzdCAqcGxpc3QsICpidWYgPSBOVUxMLCAqY2hlY2s7CisJaW50IG1hdGNoZW9mID0gMCwgcmV2ZXJzZSA9IG9wdGlvbl9tYXNrMzIgJiBGTEFHX1JFVkVSU0UsIGJhY2t3YXJuID0gMDsKKworCS8vIEJyZWFrIGRvdWJseSBsaW5rZWQgbGlzdCBzbyB3ZSBjYW4gdXNlIHNpbmdseSBsaW5rZWQgdHJhdmVyc2FsIGZ1bmN0aW9uLgorCVRULmN1cnJlbnRfaHVuay0+cHJldi0+bmV4dCA9IE5VTEw7CisKKwkvLyBNYXRjaCBFT0YgaWYgdGhlcmUgYXJlbid0IGFzIG1hbnkgZW5kaW5nIGNvbnRleHQgbGluZXMgYXMgYmVnaW5uaW5nCisJZm9yIChwbGlzdCA9IFRULmN1cnJlbnRfaHVuazsgcGxpc3Q7IHBsaXN0ID0gcGxpc3QtPm5leHQpIHsKKwkJaWYgKHBsaXN0LT5kYXRhWzBdPT0nICcpIG1hdGNoZW9mKys7CisJCWVsc2UgbWF0Y2hlb2YgPSAwOworCQlpZiAoUEFUQ0hfREVCVUcpIGZkcHJpbnRmKDIsICJIVU5LOiVzXG4iLCBwbGlzdC0+ZGF0YSk7CisJfQorCW1hdGNoZW9mID0gbWF0Y2hlb2YgPCBUVC5jb250ZXh0OworCisJaWYgKFBBVENIX0RFQlVHKSBmZHByaW50ZigyLCJNQVRDSEVPRj0lY1xuIiwgbWF0Y2hlb2YgPyAnWScgOiAnTicpOworCisJLy8gTG9vcCB0aHJvdWdoIGlucHV0IGRhdGEgc2VhcmNoaW5nIGZvciB0aGlzIGh1bmsuICBNYXRjaCBhbGwgY29udGV4dAorCS8vIGxpbmVzIGFuZCBhbGwgbGluZXMgdG8gYmUgcmVtb3ZlZCB1bnRpbCB3ZSd2ZSBmb3VuZCB0aGUgZW5kIG9mIGEKKwkvLyBjb21wbGV0ZSBodW5rLgorCXBsaXN0ID0gVFQuY3VycmVudF9odW5rOworCWJ1ZiA9IE5VTEw7CisJaWYgKFRULmNvbnRleHQpIGZvciAoOzspIHsKKwkJY2hhciAqZGF0YSA9IGdldF9saW5lKFRULmZpbGVpbik7CisKKwkJVFQubGluZW51bSsrOworCisJCS8vIEZpZ3VyZSBvdXQgd2hpY2ggbGluZSBvZiBodW5rIHRvIGNvbXBhcmUgd2l0aCBuZXh0LiAgKFNraXAgbGluZXMKKwkJLy8gb2YgdGhlIGh1bmsgd2UnZCBiZSBhZGRpbmcuKQorCQl3aGlsZSAocGxpc3QgJiYgKnBsaXN0LT5kYXRhID09ICIrLSJbcmV2ZXJzZV0pIHsKKwkJCWlmIChkYXRhICYmICFzdHJjbXAoZGF0YSwgcGxpc3QtPmRhdGErMSkpIHsKKwkJCQlpZiAoIWJhY2t3YXJuKSB7CisJCQkJCWZkcHJpbnRmKDIsIlBvc3NpYmx5IHJldmVyc2VkIGh1bmsgJWQgYXQgJWxkXG4iLAorCQkJCQkJVFQuaHVua251bSwgVFQubGluZW51bSk7CisJCQkJCWJhY2t3YXJuKys7CisJCQkJfQorCQkJfQorCQkJcGxpc3QgPSBwbGlzdC0+bmV4dDsKKwkJfQorCisJCS8vIElzIHRoaXMgRU9GPworCQlpZiAoIWRhdGEpIHsKKwkJCWlmIChQQVRDSF9ERUJVRykgZmRwcmludGYoMiwgIklORU9GXG4iKTsKKworCQkJLy8gRG9lcyB0aGlzIGh1bmsgbmVlZCB0byBtYXRjaCBFT0Y/CisJCQlpZiAoIXBsaXN0ICYmIG1hdGNoZW9mKSBicmVhazsKKworCQkJLy8gRmlsZSBlbmRlZCBiZWZvcmUgd2UgZm91bmQgYSBwbGFjZSBmb3IgdGhpcyBodW5rLgorCQkJZmFpbF9odW5rKCk7CisJCQlnb3RvIGRvbmU7CisJCX0gZWxzZSBpZiAoUEFUQ0hfREVCVUcpIGZkcHJpbnRmKDIsICJJTjogJXNcbiIsIGRhdGEpOworCQljaGVjayA9IGRsaXN0X2FkZCgmYnVmLCBkYXRhKTsKKworCQkvLyBDb21wYXJlIHRoaXMgbGluZSB3aXRoIG5leHQgZXhwZWN0ZWQgbGluZSBvZiBodW5rLgorCQkvLyB0b2RvOiB0ZWFjaCB0aGUgc3RyY21wKCkgdG8gaWdub3JlIHdoaXRlc3BhY2UuCisKKwkJLy8gQSBtYXRjaCBjYW4gZmFpbCBiZWNhdXNlIHRoZSBuZXh0IGxpbmUgZG9lc24ndCBtYXRjaCwgb3IgYmVjYXVzZQorCQkvLyB3ZSBoaXQgdGhlIGVuZCBvZiBhIGh1bmsgdGhhdCBuZWVkZWQgRU9GLCBhbmQgdGhpcyBpc24ndCBFT0YuCisKKwkJLy8gSWYgbWF0Y2ggZmFpbGVkLCBmbHVzaCBmaXJzdCBsaW5lIG9mIGJ1ZmZlcmVkIGRhdGEgYW5kCisJCS8vIHJlY2hlY2sgYnVmZmVyZWQgZGF0YSBmb3IgYSBuZXcgbWF0Y2ggdW50aWwgd2UgZmluZCBvbmUgb3IgcnVuCisJCS8vIG91dCBvZiBidWZmZXIuCisKKwkJZm9yICg7OykgeworCQkJaWYgKCFwbGlzdCB8fCBzdHJjbXAoY2hlY2stPmRhdGEsIHBsaXN0LT5kYXRhKzEpKSB7CisJCQkJLy8gTWF0Y2ggZmFpbGVkLiAgV3JpdGUgb3V0IGZpcnN0IGxpbmUgb2YgYnVmZmVyZWQgZGF0YSBhbmQKKwkJCQkvLyByZWNoZWNrIHJlbWFpbmluZyBidWZmZXJlZCBkYXRhIGZvciBhIG5ldyBtYXRjaC4KKworCQkJCWlmIChQQVRDSF9ERUJVRykKKwkJCQkJZmRwcmludGYoMiwgIk5PVDogJXNcbiIsIHBsaXN0LT5kYXRhKTsKKworCQkJCVRULnN0YXRlID0gMzsKKwkJCQljaGVjayA9IFRPWV9sbGlzdF9wb3AoJmJ1Zik7CisJCQkJY2hlY2stPnByZXYtPm5leHQgPSBidWY7CisJCQkJYnVmLT5wcmV2ID0gY2hlY2stPnByZXY7CisJCQkJZG9fbGluZShjaGVjayk7CisJCQkJcGxpc3QgPSBUVC5jdXJyZW50X2h1bms7CisKKwkJCQkvLyBJZiB3ZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3aXRob3V0IGNvbmZpcm1pbmcgYQorCQkJCS8vIG1hdGNoLCByZWFkIG1vcmUgbGluZXMuCisJCQkJaWYgKGNoZWNrPT1idWYpIHsKKwkJCQkJYnVmID0gMDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNoZWNrID0gYnVmOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoUEFUQ0hfREVCVUcpCisJCQkJCWZkcHJpbnRmKDIsICJNQVlCRTogJXNcbiIsIHBsaXN0LT5kYXRhKTsKKwkJCQkvLyBUaGlzIGxpbmUgbWF0Y2hlcy4gIEFkdmFuY2UgcGxpc3QsIGRldGVjdCBzdWNjZXNzZnVsIG1hdGNoLgorCQkJCXBsaXN0ID0gcGxpc3QtPm5leHQ7CisJCQkJaWYgKCFwbGlzdCAmJiAhbWF0Y2hlb2YpIGdvdG8gb3V0OworCQkJCWNoZWNrID0gY2hlY2stPm5leHQ7CisJCQkJaWYgKGNoZWNrID09IGJ1ZikgYnJlYWs7CisJCQl9CisJCX0KKwl9CitvdXQ6CisJLy8gV2UgaGF2ZSBhIG1hdGNoLiAgRW1pdCBjaGFuZ2VkIGRhdGEuCisJVFQuc3RhdGUgPSAiLSsiW3JldmVyc2VdOworCVRPWV9sbGlzdF9mcmVlKFRULmN1cnJlbnRfaHVuaywgZG9fbGluZSk7CisJVFQuY3VycmVudF9odW5rID0gTlVMTDsKKwlUVC5zdGF0ZSA9IDE7Citkb25lOgorCWlmIChidWYpIHsKKwkJYnVmLT5wcmV2LT5uZXh0ID0gTlVMTDsKKwkJVE9ZX2xsaXN0X2ZyZWUoYnVmLCBkb19saW5lKTsKKwl9CisKKwlyZXR1cm4gVFQuc3RhdGU7Cit9CisKKy8vIFJlYWQgYSBwYXRjaCBmaWxlIGFuZCBmaW5kIGh1bmtzLCBvcGVuaW5nL2NyZWF0aW5nL2RlbGV0aW5nIGZpbGVzLgorLy8gQ2FsbCBhcHBseV9vbmVfaHVuaygpIG9uIGVhY2ggaHVuay4KKworLy8gc3RhdGUgMDogTm90IGluIGEgaHVuaywgbG9vayBmb3IgKysrLgorLy8gc3RhdGUgMTogRm91bmQgKysrIGZpbGUgaW5kaWNhdG9yLCBsb29rIGZvciBAQAorLy8gc3RhdGUgMjogSW4gaHVuazogY291bnRpbmcgaW5pdGlhbCBjb250ZXh0IGxpbmVzCisvLyBzdGF0ZSAzOiBJbiBodW5rOiBnZXR0aW5nIGJvZHkKKworaW50IHBhdGNoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwYXRjaF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IG9wdHM7CisJaW50IHJldmVyc2UsIHN0YXRlID0gMDsKKwljaGFyICpvbGRuYW1lID0gTlVMTCwgKm5ld25hbWUgPSBOVUxMOworCWNoYXIgKm9wdF9wLCAqb3B0X2k7CisKKwlJTklUX1RUKCk7CisKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgRkxBR19TVFIsICZvcHRfcCwgJm9wdF9pKTsKKwlyZXZlcnNlID0gb3B0cyAmIEZMQUdfUkVWRVJTRTsKKwlUVC5wcmVmaXggPSAob3B0cyAmIEZMQUdfUEFUSExFTikgPyB4YXRvaShvcHRfcCkgOiAwOyAvLyBjYW4gYmUgbmVnYXRpdmUhCisJaWYgKG9wdHMgJiBGTEFHX0lOUFVUKSBUVC5maWxlcGF0Y2ggPSB4b3BlbihvcHRfaSwgT19SRE9OTFkpOworCVRULmZpbGVpbiA9IFRULmZpbGVvdXQgPSAtMTsKKworCS8vIExvb3AgdGhyb3VnaCB0aGUgbGluZXMgaW4gdGhlIHBhdGNoCisJZm9yKDs7KSB7CisJCWNoYXIgKnBhdGNobGluZTsKKworCQlwYXRjaGxpbmUgPSBnZXRfbGluZShUVC5maWxlcGF0Y2gpOworCQlpZiAoIXBhdGNobGluZSkgYnJlYWs7CisKKwkJLy8gT3RoZXIgdmVyc2lvbnMgb2YgcGF0Y2ggYWNjZXB0IGRhbWFnZWQgcGF0Y2hlcywKKwkJLy8gc28gd2UgbmVlZCB0byBhbHNvLgorCQlpZiAoISpwYXRjaGxpbmUpIHsKKwkJCWZyZWUocGF0Y2hsaW5lKTsKKwkJCXBhdGNobGluZSA9IHhzdHJkdXAoIiAiKTsKKwkJfQorCisJCS8vIEFyZSB3ZSBhc3NlbWJsaW5nIGEgaHVuaz8KKwkJaWYgKHN0YXRlID49IDIpIHsKKwkJCWlmICgqcGF0Y2hsaW5lPT0nICcgfHwgKnBhdGNobGluZT09JysnIHx8ICpwYXRjaGxpbmU9PSctJykgeworCQkJCWRsaXN0X2FkZCgmVFQuY3VycmVudF9odW5rLCBwYXRjaGxpbmUpOworCisJCQkJaWYgKCpwYXRjaGxpbmUgIT0gJysnKSBUVC5vbGRsZW4tLTsKKwkJCQlpZiAoKnBhdGNobGluZSAhPSAnLScpIFRULm5ld2xlbi0tOworCisJCQkJLy8gQ29udGV4dCBsaW5lPworCQkJCWlmICgqcGF0Y2hsaW5lPT0nICcgJiYgc3RhdGU9PTIpIFRULmNvbnRleHQrKzsKKwkJCQllbHNlIHN0YXRlPTM7CisKKwkJCQkvLyBJZiB3ZSd2ZSBjb25zdW1lZCBhbGwgZXhwZWN0ZWQgaHVuayBsaW5lcywgYXBwbHkgdGhlIGh1bmsuCisKKwkJCQlpZiAoIVRULm9sZGxlbiAmJiAhVFQubmV3bGVuKSBzdGF0ZSA9IGFwcGx5X29uZV9odW5rKCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlmYWlsX2h1bmsoKTsKKwkJCXN0YXRlID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLy8gT3BlbiBhIG5ldyBmaWxlPworCQlpZiAoIXN0cm5jbXAoIi0tLSAiLCBwYXRjaGxpbmUsIDQpIHx8ICFzdHJuY21wKCIrKysgIiwgcGF0Y2hsaW5lLCA0KSkgeworCQkJY2hhciAqcywgKipuYW1lID0gcmV2ZXJzZSA/ICZuZXduYW1lIDogJm9sZG5hbWU7CisJCQlpbnQgaTsKKworCQkJaWYgKCpwYXRjaGxpbmUgPT0gJysnKSB7CisJCQkJbmFtZSA9IHJldmVyc2UgPyAmb2xkbmFtZSA6ICZuZXduYW1lOworCQkJCXN0YXRlID0gMTsKKwkJCX0KKworCQkJZnJlZSgqbmFtZSk7CisJCQlmaW5pc2hfb2xkZmlsZSgpOworCisJCQkvLyBUcmltIGRhdGUgZnJvbSBlbmQgb2YgZmlsZW5hbWUgKGlmIGFueSkuICBXZSBkb24ndCBjYXJlLgorCQkJZm9yIChzID0gcGF0Y2hsaW5lKzQ7ICpzICYmICpzIT0nXHQnOyBzKyspCisJCQkJaWYgKCpzPT0nXFwnICYmIHNbMV0pIHMrKzsKKwkJCWkgPSBhdG9pKHMpOworCQkJaWYgKGk+MTkwMCAmJiBpPD0xOTcwKQorCQkJCSpuYW1lID0geHN0cmR1cCgiL2Rldi9udWxsIik7CisJCQllbHNlIHsKKwkJCQkqcyA9IDA7CisJCQkJKm5hbWUgPSB4c3RyZHVwKHBhdGNobGluZSs0KTsKKwkJCX0KKworCQkJLy8gV2UgZGVmZXIgYWN0dWFsbHkgb3BlbmluZyB0aGUgZmlsZSBiZWNhdXNlIHN2biBwcm9kdWNlcyBicm9rZW4KKwkJCS8vIHBhdGNoZXMgdGhhdCBkb24ndCBzaWduYWwgdGhleSB3YW50IHRvIGNyZWF0ZSBhIG5ldyBmaWxlIHRoZQorCQkJLy8gd2F5IHRoZSBwYXRjaCBtYW4gcGFnZSBzYXlzLCBzbyB5b3UgaGF2ZSB0byByZWFkIHRoZSBmaXJzdCBodW5rCisJCQkvLyBhbmQgX2d1ZXNzXy4KKworCQkvLyBTdGFydCBhIG5ldyBodW5rPworCQl9IGVsc2UgaWYgKHN0YXRlID09IDEgJiYgIXN0cm5jbXAoIkBAIC0iLCBwYXRjaGxpbmUsIDQpKSB7CisJCQlpbnQgaTsKKworCQkJaSA9IHNzY2FuZihwYXRjaGxpbmUrNCwgIiVsZCwlbGQgKyVsZCwlbGQiLCAmVFQub2xkbGluZSwKKwkJCQkJCSZUVC5vbGRsZW4sICZUVC5uZXdsaW5lLCAmVFQubmV3bGVuKTsKKwkJCWlmIChpICE9IDQpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNvcnJ1cHQgaHVuayAlZCBhdCAlbGQiLCBUVC5odW5rbnVtLCBUVC5saW5lbnVtKTsKKworCQkJVFQuY29udGV4dCA9IDA7CisJCQlzdGF0ZSA9IDI7CisKKwkJCS8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IGh1bmssIG9wZW4gdGhlIGZpbGUuCisJCQlpZiAoVFQuZmlsZWluID09IC0xKSB7CisJCQkJaW50IG9sZHN1bSwgbmV3c3VtLCBkZWwgPSAwOworCQkJCWNoYXIgKnMsICpuYW1lOworCisJCQkJb2xkc3VtID0gVFQub2xkbGluZSArIFRULm9sZGxlbjsKKwkJCQluZXdzdW0gPSBUVC5uZXdsaW5lICsgVFQubmV3bGVuOworCisJCQkJbmFtZSA9IHJldmVyc2UgPyBvbGRuYW1lIDogbmV3bmFtZTsKKworCQkJCS8vIFdlJ3JlIGRlbGV0aW5nIG9sZG5hbWUgaWYgbmV3IGZpbGUgaXMgL2Rldi9udWxsIChiZWZvcmUgLXApCisJCQkJLy8gb3IgaWYgbmV3IGh1bmsgaXMgZW1wdHkgKHplcm8gY29udGV4dCkgYWZ0ZXIgcGF0Y2hpbmcKKwkJCQlpZiAoIXN0cmNtcChuYW1lLCAiL2Rldi9udWxsIikgfHwgIShyZXZlcnNlID8gb2xkc3VtIDogbmV3c3VtKSkKKwkJCQl7CisJCQkJCW5hbWUgPSByZXZlcnNlID8gbmV3bmFtZSA6IG9sZG5hbWU7CisJCQkJCWRlbCsrOworCQkJCX0KKworCQkJCS8vIGhhbmRsZSAtcCBwYXRoIHRydW5jYXRpb24uCisJCQkJZm9yIChpPTAsIHMgPSBuYW1lOyAqczspIHsKKwkJCQkJaWYgKChvcHRpb25fbWFzazMyICYgRkxBR19QQVRITEVOKSAmJiBUVC5wcmVmaXggPT0gaSkgYnJlYWs7CisJCQkJCWlmICgqKHMrKyk9PScvJykgeworCQkJCQkJbmFtZSA9IHM7CisJCQkJCQlpKys7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlpZiAoZGVsKSB7CisJCQkJCXByaW50ZigicmVtb3ZpbmcgJXNcbiIsIG5hbWUpOworCQkJCQl4dW5saW5rKG5hbWUpOworCQkJCQlzdGF0ZSA9IDA7CisJCQkJLy8gSWYgd2UndmUgZ290IGEgZmlsZSB0byBvcGVuLCBkbyBzby4KKwkJCQl9IGVsc2UgaWYgKCEob3B0aW9uX21hc2szMiAmIEZMQUdfUEFUSExFTikgfHwgaSA8PSBUVC5wcmVmaXgpIHsKKwkJCQkJLy8gSWYgdGhlIG9sZCBmaWxlIHdhcyBudWxsLCB3ZSdyZSBjcmVhdGluZyBhIG5ldyBvbmUuCisJCQkJCWlmICghc3RyY21wKG9sZG5hbWUsICIvZGV2L251bGwiKSB8fCAhb2xkc3VtKSB7CisJCQkJCQlwcmludGYoImNyZWF0aW5nICVzXG4iLCBuYW1lKTsKKwkJCQkJCXMgPSBzdHJyY2hyKG5hbWUsICcvJyk7CisJCQkJCQlpZiAocykgeworCQkJCQkJCSpzID0gMDsKKwkJCQkJCQl4bWtwYXRoKG5hbWUsIC0xKTsKKwkJCQkJCQkqcyA9ICcvJzsKKwkJCQkJCX0KKwkJCQkJCVRULmZpbGVpbiA9IHhvcGVuKG5hbWUsIE9fQ1JFQVR8T19FWENMfE9fUkRXUik7CisJCQkJCX0gZWxzZSB7CisJCQkJCQlwcmludGYoInBhdGNoaW5nIGZpbGUgJXNcbiIsIG5hbWUpOworCQkJCQkJVFQuZmlsZWluID0geG9wZW4obmFtZSwgT19SRFdSKTsKKwkJCQkJfQorCQkJCQlUVC5maWxlb3V0ID0gY29weV90ZW1wZmlsZShUVC5maWxlaW4sIG5hbWUsICZUVC50ZW1wbmFtZSk7CisJCQkJCVRULmxpbmVudW0gPSAwOworCQkJCQlUVC5odW5rbnVtID0gMDsKKwkJCQl9CisJCQl9CisKKwkJCVRULmh1bmtudW0rKzsKKworCQkJY29udGludWU7CisJCX0KKworCQkvLyBJZiB3ZSBkaWRuJ3QgY29udGludWUgYWJvdmUsIGRpc2NhcmQgdGhpcyBsaW5lLgorCQlmcmVlKHBhdGNobGluZSk7CisJfQorCisJZmluaXNoX29sZGZpbGUoKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQljbG9zZShUVC5maWxlcGF0Y2gpOworCQlmcmVlKG9sZG5hbWUpOworCQlmcmVlKG5ld25hbWUpOworCX0KKworCXJldHVybiBUVC5leGl0dmFsOworfQpkaWZmIC0tZ2l0IGEvZWRpdG9ycy9zZWQuYyBiL2VkaXRvcnMvc2VkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JiZjgyMAotLS0gL2Rldi9udWxsCisrKyBiL2VkaXRvcnMvc2VkLmMKQEAgLTAsMCArMSwxNjAwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzZWQuYyAtIHZlcnkgbWluaW1hbGlzdCB2ZXJzaW9uIG9mIHNlZAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwLDIwMDEgYnkgTGluZW8sIGluYy4gYW5kIE1hcmsgV2hpdGxleQorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSBieSBNYXJrIFdoaXRsZXkgPG1hcmt3QGNvZGVwb2V0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMiAgTWF0dCBLcmFhaQorICogQ29weXJpZ2h0IChDKSAyMDAzIGJ5IEdsZW5uIE1jR3JhdGgKKyAqIENvcHlyaWdodCAoQykgMjAwMywyMDA0IGJ5IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogTUFJTlRBSU5FUjogUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIENvZGUgb3ZlcnZpZXcuCisgKgorICogRmlsZXMgYXJlIGxhaWQgb3V0IHRvIGF2b2lkIHVubmVjZXNzYXJ5IGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4gIFNvIGZvcgorICogZXhhbXBsZSwgZXZlcnkgZnVuY3Rpb24gYWRkX2NtZCBjYWxscyBvY2N1cnMgYmVmb3JlIGFkZF9jbWQgaW4gdGhpcyBmaWxlLgorICoKKyAqIGFkZF9jbWQoKSBpcyBjYWxsZWQgb24gZWFjaCBsaW5lIG9mIHNlZCBjb21tYW5kIHRleHQgKGZyb20gYSBmaWxlIG9yIGZyb20KKyAqIHRoZSBjb21tYW5kIGxpbmUpLiAgSXQgY2FsbHMgZ2V0X2FkZHJlc3MoKSBhbmQgcGFyc2VfY21kX2FyZ3MoKS4gIFRoZQorICogcmVzdWx0aW5nIHNlZF9jbWRfdCBzdHJ1Y3R1cmVzIGFyZSBhcHBlbmRlZCB0byBhIGxpbmtlZCBsaXN0CisgKiAoRy5zZWRfY21kX2hlYWQvRy5zZWRfY21kX3RhaWwpLgorICoKKyAqIHByb2Nlc3NfZmlsZXMoKSBkb2VzIGFjdHVhbCBzZWRkaW5nLCByZWFkaW5nIGRhdGEgbGluZXMgZnJvbSBlYWNoIGlucHV0IEZJTEUqCisgKiAod2hpY2ggY291bGQgYmUgc3RkaW4pIGFuZCBhcHBseWluZyB0aGUgc2VkIGNvbW1hbmQgbGlzdCAoc2VkX2NtZF9oZWFkKSB0bworICogZWFjaCBvZiB0aGUgcmVzdWx0aW5nIGxpbmVzLgorICoKKyAqIHNlZF9tYWluKCkgaXMgd2hlcmUgZXh0ZXJuYWwgY29kZSBjYWxscyBpbnRvIHRoaXMsIHdpdGggYSBjb21tYW5kIGxpbmUuCisgKi8KKworLyogU3VwcG9ydGVkIGZlYXR1cmVzIGFuZCBjb21tYW5kcyBpbiB0aGlzIHZlcnNpb24gb2Ygc2VkOgorICoKKyAqIC0gY29tbWVudHMgKCcjJykKKyAqIC0gYWRkcmVzcyBtYXRjaGluZzogbnVtfC9tYXRjaHN0ci9bLG51bXwvbWF0Y2hzdHIvfCRdY29tbWFuZAorICogLSBjb21tYW5kczogKHApcmludCwgKGQpZWxldGUsIChzKXVic3RpdHVlICh3aXRoIGcgJiBJIGZsYWdzKQorICogLSBlZGl0IGNvbW1hbmRzOiAoYSlwcGVuZCwgKGkpbnNlcnQsIChjKWhhbmdlCisgKiAtIGZpbGUgY29tbWFuZHM6IChyKWVhZAorICogLSBiYWNrcmVmZXJlbmNlcyBpbiBzdWJzdGl0dXRpb24gZXhwcmVzc2lvbnMgKFwwLCBcMSwgXDIuLi5cOSkKKyAqIC0gZ3JvdXBlZCBjb21tYW5kczoge2NtZDE7Y21kMn0KKyAqIC0gdHJhbnNsaXRlcmF0aW9uICh5L3NvdXJjZS1jaGFycy9kZXN0LWNoYXJzLykKKyAqIC0gcGF0dGVybiBzcGFjZSBob2xkIHNwYWNlIHN0b3JpbmcgLyBzd2FwcGluZyAoZywgaCwgeCkKKyAqIC0gbGFiZWxzIC8gYnJhbmNoaW5nICg6IGxhYmVsLCBiLCB0LCBUKQorICoKKyAqIChOb3RlOiBTcGVjaWZ5aW5nIGFuIGFkZHJlc3MgKHJhbmdlKSB0byBtYXRjaCBpcyAqb3B0aW9uYWwqOyBjb21tYW5kcworICogZGVmYXVsdCB0byB0aGUgd2hvbGUgcGF0dGVybiBzcGFjZSBpZiBubyBzcGVjaWZpYyBhZGRyZXNzIG1hdGNoIHdhcworICogcmVxdWVzdGVkLikKKyAqCisgKiBUb2RvOgorICogLSBDcmVhdGUgYSB3cmFwcGVyIGFyb3VuZCByZWdleCB0byBtYWtlIGxpYmMncyByZWdleCBjb25mb3JtIHdpdGggc2VkCisgKgorICogUmVmZXJlbmNlCisgKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL3NlZC5odG1sCisgKiBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvc2VkLmh0bWwKKyAqIGh0dHA6Ly9zZWQuc291cmNlZm9yZ2UubmV0L3NlZGZhcTMuaHRtbAorICovCisKKy8vY29uZmlnOmNvbmZpZyBTRUQKKy8vY29uZmlnOglib29sICJzZWQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgc2VkIGlzIHVzZWQgdG8gcGVyZm9ybSB0ZXh0IHRyYW5zZm9ybWF0aW9ucyBvbiBhIGZpbGUKKy8vY29uZmlnOgkgIG9yIGlucHV0IGZyb20gYSBwaXBlbGluZS4KKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1NFRCkgKz0gc2VkLm8KKworLy9hcHBsZXQ6SUZfU0VEKEFQUExFVChzZWQsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCisKKy8vdXNhZ2U6I2RlZmluZSBzZWRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstaW5yRV0gWy1mIEZJTEVdLi4uIFstZSBDTURdLi4uIFtGSUxFXS4uLlxuIgorLy91c2FnZTogICAgICAgIm9yOiBzZWQgWy1pbnJFXSBDTUQgW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHNlZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgktZSBDTUQJQWRkIENNRCB0byBzZWQgY29tbWFuZHMgdG8gYmUgZXhlY3V0ZWQiCisvL3VzYWdlOiAgICAgIlxuCS1mIEZJTEUJQWRkIEZJTEUgY29udGVudHMgdG8gc2VkIGNvbW1hbmRzIHRvIGJlIGV4ZWN1dGVkIgorLy91c2FnZTogICAgICJcbgktaVtTRlhdCUVkaXQgZmlsZXMgaW4tcGxhY2UgKG90aGVyd2lzZSBzZW5kcyB0byBzdGRvdXQpIgorLy91c2FnZTogICAgICJcbgkJT3B0aW9uYWxseSBiYWNrIGZpbGVzIHVwLCBhcHBlbmRpbmcgU0ZYIgorLy91c2FnZTogICAgICJcbgktbglTdXBwcmVzcyBhdXRvbWF0aWMgcHJpbnRpbmcgb2YgcGF0dGVybiBzcGFjZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXIsLUUJVXNlIGV4dGVuZGVkIHJlZ2V4IHN5bnRheCIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuSWYgbm8gLWUgb3IgLWYsIHRoZSBmaXJzdCBub24tb3B0aW9uIGFyZ3VtZW50IGlzIHRoZSBzZWQgY29tbWFuZCBzdHJpbmcuIgorLy91c2FnZTogICAgICJcblJlbWFpbmluZyBhcmd1bWVudHMgYXJlIGlucHV0IGZpbGVzIChzdGRpbiBpZiBub25lKS4iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHNlZF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBlY2hvIFwiZm9vXCIgfCBzZWQgLWUgJ3MvZlthLXpBLVpdby9iYXIvZydcbiIKKy8vdXNhZ2U6ICAgICAgICJiYXJcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAieHJlZ2V4LmgiCisKKyNpZiAwCisjIGRlZmluZSBkYmcoLi4uKSBiYl9lcnJvcl9tc2coX19WQV9BUkdTX18pCisjZWxzZQorIyBkZWZpbmUgZGJnKC4uLikgKCh2b2lkKTApCisjZW5kaWYKKworCitlbnVtIHsKKwlPUFRfaW5fcGxhY2UgPSAxIDw8IDAsCit9OworCisvKiBFYWNoIHNlZCBjb21tYW5kIHR1cm5zIGludG8gb25lIG9mIHRoZXNlIHN0cnVjdHVyZXMuICovCit0eXBlZGVmIHN0cnVjdCBzZWRfY21kX3MgeworCS8qIE9yZGVyZWQgYnkgYWxpZ25tZW50IHJlcXVpcmVtZW50czogY3VycmVudGx5IDM2IGJ5dGVzIG9uIHg4NiAqLworCXN0cnVjdCBzZWRfY21kX3MgKm5leHQ7IC8qIE5leHQgY29tbWFuZCAobGlua2VkIGxpc3QsIE5VTEwgdGVybWluYXRlZCkgKi8KKworCS8qIGFkZHJlc3Mgc3RvcmFnZSAqLworCXJlZ2V4X3QgKmJlZ19tYXRjaDsgICAgIC8qIHNlZCAtZSAnL21hdGNoL2NtZCcgKi8KKwlyZWdleF90ICplbmRfbWF0Y2g7ICAgICAvKiBzZWQgLWUgJy9tYXRjaC8sL2VuZF9tYXRjaC9jbWQnICovCisJcmVnZXhfdCAqc3ViX21hdGNoOyAgICAgLyogRm9yICdzL3N1Yl9tYXRjaC9zdHJpbmcvJyAqLworCWludCBiZWdfbGluZTsgICAgICAgICAgIC8qICdzZWQgMXAnICAgMCA9PSBhcHBseSBjb21tYW5kcyB0byBhbGwgbGluZXMgKi8KKwlpbnQgYmVnX2xpbmVfb3JpZzsgICAgICAvKiBjb3B5IG9mIHRoZSBhYm92ZSwgbmVlZGVkIGZvciAtaSAqLworCWludCBlbmRfbGluZTsgICAgICAgICAgIC8qICdzZWQgMSwzcCcgMCA9PSBvbmUgbGluZSBvbmx5LiAtMSA9IGxhc3QgbGluZSAoJCkuIC0yLU4gPSArTiAqLworCWludCBlbmRfbGluZV9vcmlnOworCisJRklMRSAqc3dfZmlsZTsgICAgICAgICAgLyogRmlsZSAoc3cpIGNvbW1hbmQgd3JpdGVzIHRvLCAtMSBmb3Igbm9uZS4gKi8KKwljaGFyICpzdHJpbmc7ICAgICAgICAgICAvKiBEYXRhIHN0cmluZyBmb3IgKHNhaWN5dGIpIGNvbW1hbmRzLiAqLworCisJdW5zaWduZWQgd2hpY2hfbWF0Y2g7ICAgLyogKHMpIFdoaWNoIG1hdGNoIHRvIHJlcGxhY2UgKDAgZm9yIGFsbCkgKi8KKworCS8qIEJpdGZpZWxkcyAoZ2NjIHdvbid0IGdyb3VwIHRoZW0gaWYgd2UgZG9uJ3QpICovCisJdW5zaWduZWQgaW52ZXJ0OjE7ICAgICAgLyogdGhlICchJyBhZnRlciB0aGUgYWRkcmVzcyAqLworCXVuc2lnbmVkIGluX21hdGNoOjE7ICAgIC8qIE5leHQgbGluZSBhbHNvIGluY2x1ZGVkIGluIG1hdGNoPyAqLworCXVuc2lnbmVkIHN1Yl9wOjE7ICAgICAgIC8qIChzKSBwcmludCBvcHRpb24gKi8KKworCWNoYXIgc3dfbGFzdF9jaGFyOyAgICAgIC8qIExhc3QgbGluZSB3cml0dGVuIGJ5IChzdykgaGFkIG5vICdcbicgKi8KKworCS8qIEdFTkVSQUwgRklFTERTICovCisJY2hhciBjbWQ7ICAgICAgICAgICAgICAgLyogVGhlIGNvbW1hbmQgY2hhcjogYWJjZERnR2hIaWxuTnBQcXJzdHd4eTo9e30gKi8KK30gc2VkX2NtZF90OworCitzdGF0aWMgY29uc3QgY2hhciBzZW1pY29sb25fd2hpdGVzcGFjZVtdIEFMSUdOMSA9ICI7IFxuXHJcdFx2IjsKKworc3RydWN0IGdsb2JhbHMgeworCS8qIG9wdGlvbnMgKi8KKwlpbnQgYmVfcXVpZXQsIHJlZ2V4X3R5cGU7CisKKwlGSUxFICpub25zdGRvdXQ7CisJY2hhciAqb3V0bmFtZSwgKmhvbGRfc3BhY2U7CisJc21hbGxpbnQgZXhpdGNvZGU7CisKKwkvKiBsaXN0IG9mIGlucHV0IGZpbGVzICovCisJaW50IGN1cnJlbnRfaW5wdXRfZmlsZSwgbGFzdF9pbnB1dF9maWxlOworCWNoYXIgKippbnB1dF9maWxlX2xpc3Q7CisJRklMRSAqY3VycmVudF9mcDsKKworCXJlZ21hdGNoX3QgcmVnbWF0Y2hbMTBdOworCXJlZ2V4X3QgKnByZXZpb3VzX3JlZ2V4X3B0cjsKKworCS8qIGxpbmtlZCBsaXN0IG9mIHNlZCBjb21tYW5kcyAqLworCXNlZF9jbWRfdCAqc2VkX2NtZF9oZWFkLCAqKnNlZF9jbWRfdGFpbDsKKworCS8qIGxpbmtlZCBsaXN0IG9mIGFwcGVuZCBsaW5lcyAqLworCWxsaXN0X3QgKmFwcGVuZF9oZWFkOworCisJY2hhciAqYWRkX2NtZF9saW5lOworCisJc3RydWN0IHBpcGVsaW5lIHsKKwkJY2hhciAqYnVmOyAgLyogU3BhY2UgdG8gaG9sZCBzdHJpbmcgKi8KKwkJaW50IGlkeDsgICAgLyogU3BhY2UgdXNlZCAqLworCQlpbnQgbGVuOyAgICAvKiBTcGFjZSBhbGxvY2F0ZWQgKi8KKwl9IHBpcGVsaW5lOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKK3N0cnVjdCBCVUdfR190b29fYmlnIHsKKwljaGFyIEJVR19HX3Rvb19iaWdbc2l6ZW9mKEcpIDw9IENPTU1PTl9CVUZTSVpFID8gMSA6IC0xXTsKK307CisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCUcuc2VkX2NtZF90YWlsID0gJkcuc2VkX2NtZF9oZWFkOyBcCit9IHdoaWxlICgwKQorCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUAorc3RhdGljIHZvaWQgc2VkX2ZyZWVfYW5kX2Nsb3NlX3N0dWZmKHZvaWQpCit7CisJc2VkX2NtZF90ICpzZWRfY21kID0gRy5zZWRfY21kX2hlYWQ7CisKKwlsbGlzdF9mcmVlKEcuYXBwZW5kX2hlYWQsIGZyZWUpOworCisJd2hpbGUgKHNlZF9jbWQpIHsKKwkJc2VkX2NtZF90ICpzZWRfY21kX25leHQgPSBzZWRfY21kLT5uZXh0OworCisJCWlmIChzZWRfY21kLT5zd19maWxlKQorCQkJeHByaW50X2FuZF9jbG9zZV9maWxlKHNlZF9jbWQtPnN3X2ZpbGUpOworCisJCWlmIChzZWRfY21kLT5iZWdfbWF0Y2gpIHsKKwkJCXJlZ2ZyZWUoc2VkX2NtZC0+YmVnX21hdGNoKTsKKwkJCWZyZWUoc2VkX2NtZC0+YmVnX21hdGNoKTsKKwkJfQorCQlpZiAoc2VkX2NtZC0+ZW5kX21hdGNoKSB7CisJCQlyZWdmcmVlKHNlZF9jbWQtPmVuZF9tYXRjaCk7CisJCQlmcmVlKHNlZF9jbWQtPmVuZF9tYXRjaCk7CisJCX0KKwkJaWYgKHNlZF9jbWQtPnN1Yl9tYXRjaCkgeworCQkJcmVnZnJlZShzZWRfY21kLT5zdWJfbWF0Y2gpOworCQkJZnJlZShzZWRfY21kLT5zdWJfbWF0Y2gpOworCQl9CisJCWZyZWUoc2VkX2NtZC0+c3RyaW5nKTsKKwkJZnJlZShzZWRfY21kKTsKKwkJc2VkX2NtZCA9IHNlZF9jbWRfbmV4dDsKKwl9CisKKwlmcmVlKEcuaG9sZF9zcGFjZSk7CisKKwlpZiAoRy5jdXJyZW50X2ZwKQorCQlmY2xvc2UoRy5jdXJyZW50X2ZwKTsKK30KKyNlbHNlCit2b2lkIHNlZF9mcmVlX2FuZF9jbG9zZV9zdHVmZih2b2lkKTsKKyNlbmRpZgorCisvKiBJZiBzb21ldGhpbmcgYmFkIGhhcHBlbnMgZHVyaW5nIC1pIG9wZXJhdGlvbiwgZGVsZXRlIHRlbXAgZmlsZSAqLworCitzdGF0aWMgdm9pZCBjbGVhbnVwX291dG5hbWUodm9pZCkKK3sKKwlpZiAoRy5vdXRuYW1lKSB1bmxpbmsoRy5vdXRuYW1lKTsKK30KKworLyogc3RyY3B5LCByZXBsYWNpbmcgIlxmcm9tIiB3aXRoICd0bycuIElmIHRvIGlzIE5VTCwgcmVwbGFjaW5nICJcYW55IiB3aXRoICdhbnknICovCisKK3N0YXRpYyB2b2lkIHBhcnNlX2VzY2FwZXMoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgbGVuLCBjaGFyIGZyb20sIGNoYXIgdG8pCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKGkgPCBsZW4pIHsKKwkJaWYgKHN0cmluZ1tpXSA9PSAnXFwnKSB7CisJCQlpZiAoIXRvIHx8IHN0cmluZ1tpKzFdID09IGZyb20pIHsKKwkJCQkqZGVzdCsrID0gdG8gPyB0byA6IHN0cmluZ1tpKzFdOworCQkJCWkgKz0gMjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCSpkZXN0KysgPSBzdHJpbmdbaSsrXTsKKwkJfQorCQkvKiBUT0RPOiBpcyBpdCBzYWZlIHdydCBhIHN0cmluZyB3aXRoIHRyYWlsaW5nICdcXCcgPyAqLworCQkqZGVzdCsrID0gc3RyaW5nW2krK107CisJfQorCSpkZXN0ID0gJ1wwJzsKK30KKworc3RhdGljIGNoYXIgKmNvcHlfcGFyc2luZ19lc2NhcGVzKGNvbnN0IGNoYXIgKnN0cmluZywgaW50IGxlbikKK3sKKwljb25zdCBjaGFyICpzOworCWNoYXIgKmRlc3QgPSB4bWFsbG9jKGxlbiArIDEpOworCisJLyogc2VkIHJlY29nbml6ZXMgXG4gKi8KKwkvKiBHTlUgc2VkIGFsc28gcmVjb2duaXplcyBcdCBhbmQgXHIgKi8KKwlmb3IgKHMgPSAiXG5uXHR0XHJyIjsgKnM7IHMgKz0gMikgeworCQlwYXJzZV9lc2NhcGVzKGRlc3QsIHN0cmluZywgbGVuLCBzWzFdLCBzWzBdKTsKKwkJc3RyaW5nID0gZGVzdDsKKwkJbGVuID0gc3RybGVuKGRlc3QpOworCX0KKwlyZXR1cm4gZGVzdDsKK30KKworCisvKgorICogaW5kZXhfb2ZfbmV4dF91bmVzY2FwZWRfcmVnZXhwX2RlbGltIC0gd2Fsa3MgbGVmdCB0byByaWdodCB0aHJvdWdoIGEgc3RyaW5nCisgKiBiZWdpbm5pbmcgYXQgYSBzcGVjaWZpZWQgaW5kZXggYW5kIHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IHJlZ3VsYXIKKyAqIGV4cHJlc3Npb24gZGVsaW1pdGVyICh0eXBpY2FsbHkgYSBmb3J3YXJkIHNsYXNoICgnLycpKSBub3QgcHJlY2VkZWQgYnkKKyAqIGEgYmFja3NsYXNoICgnXCcpLiAgQSBuZWdhdGl2ZSBkZWxpbWl0ZXIgZGlzYWJsZXMgc3F1YXJlIGJyYWNrZXQgY2hlY2tpbmcuCisgKi8KK3N0YXRpYyBpbnQgaW5kZXhfb2ZfbmV4dF91bmVzY2FwZWRfcmVnZXhwX2RlbGltKGludCBkZWxpbWl0ZXIsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgYnJhY2tldCA9IC0xOworCWludCBlc2NhcGVkID0gMDsKKwlpbnQgaWR4ID0gMDsKKwljaGFyIGNoOworCisJaWYgKGRlbGltaXRlciA8IDApIHsKKwkJYnJhY2tldC0tOworCQlkZWxpbWl0ZXIgPSAtZGVsaW1pdGVyOworCX0KKworCWZvciAoOyAoY2ggPSBzdHJbaWR4XSkgIT0gJ1wwJzsgaWR4KyspIHsKKwkJaWYgKGJyYWNrZXQgPj0gMCkgeworCQkJaWYgKGNoID09ICddJworCQkJICYmICEoYnJhY2tldCA9PSBpZHggLSAxIHx8IChicmFja2V0ID09IGlkeCAtIDIgJiYgc3RyW2lkeCAtIDFdID09ICdeJykpCisJCQkpIHsKKwkJCQlicmFja2V0ID0gLTE7CisJCQl9CisJCX0gZWxzZSBpZiAoZXNjYXBlZCkKKwkJCWVzY2FwZWQgPSAwOworCQllbHNlIGlmIChjaCA9PSAnXFwnKQorCQkJZXNjYXBlZCA9IDE7CisJCWVsc2UgaWYgKGJyYWNrZXQgPT0gLTEgJiYgY2ggPT0gJ1snKQorCQkJYnJhY2tldCA9IGlkeDsKKwkJZWxzZSBpZiAoY2ggPT0gZGVsaW1pdGVyKQorCQkJcmV0dXJuIGlkeDsKKwl9CisKKwkvKiBpZiB3ZSBtYWtlIGl0IHRvIGhlcmUsIHdlJ3ZlIGhpdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgKi8KKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5tYXRjaGVkICclYyciLCBkZWxpbWl0ZXIpOworfQorCisvKgorICogIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSB0aGlyZCBkZWxpbWl0ZXIKKyAqLworc3RhdGljIGludCBwYXJzZV9yZWdleF9kZWxpbShjb25zdCBjaGFyICpjbWRzdHIsIGNoYXIgKiptYXRjaCwgY2hhciAqKnJlcGxhY2UpCit7CisJY29uc3QgY2hhciAqY21kc3RyX3B0ciA9IGNtZHN0cjsKKwl1bnNpZ25lZCBjaGFyIGRlbGltaXRlcjsKKwlpbnQgaWR4ID0gMDsKKworCS8qIHZlcmlmeSB0aGF0IHRoZSAncycgb3IgJ3knIGlzIGZvbGxvd2VkIGJ5IHNvbWV0aGluZy4gIFRoYXQgc29tZXRoaW5nCisJICogKHR5cGljYWxseSBhICdzbGFzaCcpIGlzIG5vdyBvdXIgcmVnZXhwIGRlbGltaXRlci4uLiAqLworCWlmICgqY21kc3RyID09ICdcMCcpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgZm9ybWF0IGluIHN1YnN0aXR1dGlvbiBleHByZXNzaW9uIik7CisJZGVsaW1pdGVyID0gKmNtZHN0cl9wdHIrKzsKKworCS8qIHNhdmUgdGhlIG1hdGNoIHN0cmluZyAqLworCWlkeCA9IGluZGV4X29mX25leHRfdW5lc2NhcGVkX3JlZ2V4cF9kZWxpbShkZWxpbWl0ZXIsIGNtZHN0cl9wdHIpOworCSptYXRjaCA9IGNvcHlfcGFyc2luZ19lc2NhcGVzKGNtZHN0cl9wdHIsIGlkeCk7CisKKwkvKiBzYXZlIHRoZSByZXBsYWNlbWVudCBzdHJpbmcgKi8KKwljbWRzdHJfcHRyICs9IGlkeCArIDE7CisJaWR4ID0gaW5kZXhfb2ZfbmV4dF91bmVzY2FwZWRfcmVnZXhwX2RlbGltKC0gKGludClkZWxpbWl0ZXIsIGNtZHN0cl9wdHIpOworCSpyZXBsYWNlID0gY29weV9wYXJzaW5nX2VzY2FwZXMoY21kc3RyX3B0ciwgaWR4KTsKKworCXJldHVybiAoKGNtZHN0cl9wdHIgLSBjbWRzdHIpICsgaWR4KTsKK30KKworLyoKKyAqIHJldHVybnMgdGhlIGluZGV4IGluIHRoZSBzdHJpbmcganVzdCBwYXN0IHdoZXJlIHRoZSBhZGRyZXNzIGVuZHMuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2FkZHJlc3MoY29uc3QgY2hhciAqbXlfc3RyLCBpbnQgKmxpbmVudW0sIHJlZ2V4X3QgKiogcmVnZXgpCit7CisJY29uc3QgY2hhciAqcG9zID0gbXlfc3RyOworCisJaWYgKGlzZGlnaXQoKm15X3N0cikpIHsKKwkJKmxpbmVudW0gPSBzdHJ0b2wobXlfc3RyLCAoY2hhcioqKSZwb3MsIDEwKTsKKwkJLyogZW5kc3RyIHNob3VsZG50IGV2ZXIgZXF1YWwgTlVMTCAqLworCX0gZWxzZSBpZiAoKm15X3N0ciA9PSAnJCcpIHsKKwkJKmxpbmVudW0gPSAtMTsKKwkJcG9zKys7CisJfSBlbHNlIGlmICgqbXlfc3RyID09ICcvJyB8fCAqbXlfc3RyID09ICdcXCcpIHsKKwkJaW50IG5leHQ7CisJCWNoYXIgZGVsaW1pdGVyOworCQljaGFyICp0ZW1wOworCisJCWRlbGltaXRlciA9ICcvJzsKKwkJaWYgKCpteV9zdHIgPT0gJ1xcJykKKwkJCWRlbGltaXRlciA9ICorK3BvczsKKwkJbmV4dCA9IGluZGV4X29mX25leHRfdW5lc2NhcGVkX3JlZ2V4cF9kZWxpbShkZWxpbWl0ZXIsICsrcG9zKTsKKwkJdGVtcCA9IGNvcHlfcGFyc2luZ19lc2NhcGVzKHBvcywgbmV4dCk7CisJCSpyZWdleCA9IHh6YWxsb2Moc2l6ZW9mKHJlZ2V4X3QpKTsKKwkJeHJlZ2NvbXAoKnJlZ2V4LCB0ZW1wLCBHLnJlZ2V4X3R5cGUpOworCQlmcmVlKHRlbXApOworCQkvKiBNb3ZlIHBvc2l0aW9uIHRvIG5leHQgY2hhcmFjdGVyIGFmdGVyIGxhc3QgZGVsaW1pdGVyICovCisJCXBvcyArPSAobmV4dCsxKTsKKwl9CisJcmV0dXJuIHBvcyAtIG15X3N0cjsKK30KKworLyogR3JhYiBhIGZpbGVuYW1lLiAgV2hpdGVzcGFjZSBhdCBzdGFydCBpcyBza2lwcGVkLCB0aGVuIGdvZXMgdG8gRU9MLiAqLworc3RhdGljIGludCBwYXJzZV9maWxlX2NtZCgvKnNlZF9jbWRfdCAqc2VkX2NtZCwqLyBjb25zdCBjaGFyICpmaWxlY21kc3RyLCBjaGFyICoqcmV0dmFsKQoreworCWludCBzdGFydCA9IDAsIGlkeCwgaGFjayA9IDA7CisKKwkvKiBTa2lwIHdoaXRlc3BhY2UsIHRoZW4gZ3JhYiBmaWxlbmFtZSB0byBlbmQgb2YgbGluZSAqLworCXdoaWxlIChpc3NwYWNlKGZpbGVjbWRzdHJbc3RhcnRdKSkKKwkJc3RhcnQrKzsKKwlpZHggPSBzdGFydDsKKwl3aGlsZSAoZmlsZWNtZHN0cltpZHhdICYmIGZpbGVjbWRzdHJbaWR4XSAhPSAnXG4nKQorCQlpZHgrKzsKKworCS8qIElmIGxpbmVzIGdsdWVkIHRvZ2V0aGVyLCBwdXQgYmFja3NsYXNoIGJhY2suICovCisJaWYgKGZpbGVjbWRzdHJbaWR4XSA9PSAnXG4nKQorCQloYWNrID0gMTsKKwlpZiAoaWR4ID09IHN0YXJ0KQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZW1wdHkgZmlsZW5hbWUiKTsKKwkqcmV0dmFsID0geHN0cm5kdXAoZmlsZWNtZHN0citzdGFydCwgaWR4LXN0YXJ0K2hhY2srMSk7CisJaWYgKGhhY2spCisJCSgqcmV0dmFsKVtpZHhdID0gJ1xcJzsKKworCXJldHVybiBpZHg7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfc3Vic3RfY21kKHNlZF9jbWRfdCAqc2VkX2NtZCwgY29uc3QgY2hhciAqc3Vic3RyKQoreworCWludCBjZmxhZ3MgPSBHLnJlZ2V4X3R5cGU7CisJY2hhciAqbWF0Y2g7CisJaW50IGlkeDsKKworCS8qCisJICogQSBzdWJzdGl0dXRpb24gY29tbWFuZCBzaG91bGQgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgorCSAqICAgIHMvbWF0Y2gvcmVwbGFjZS8gI2dpSXB3CisJICogICAgfHwgICAgIHwgICAgICAgIHx8fAorCSAqICAgIG1hbmRhdG9yeSAgICAgICBvcHRpb25hbAorCSAqLworCWlkeCA9IHBhcnNlX3JlZ2V4X2RlbGltKHN1YnN0ciwgJm1hdGNoLCAmc2VkX2NtZC0+c3RyaW5nKTsKKworCS8qIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGJhY2sgcmVmZXJlbmNlcyBpbiB0aGUgbWF0Y2ggc3RyaW5nICovCisJLyogTm90ZTogd2UgY29tcHV0ZSB0aGlzIGhlcmUgcmF0aGVyIHRoYW4gaW4gdGhlIGRvX3N1YnN0X2NvbW1hbmQoKQorCSAqIGZ1bmN0aW9uIHRvIHNhdmUgcHJvY2Vzc29yIHRpbWUsIGF0IHRoZSBleHBlbnNlIG9mIGEgbGl0dGxlIG1vcmUgbWVtb3J5CisJICogKDQgYml0cykgcGVyIHNlZF9jbWQgKi8KKworCS8qIHByb2Nlc3MgdGhlIGZsYWdzICovCisKKwlzZWRfY21kLT53aGljaF9tYXRjaCA9IDE7CisJZGJnKCJzIGZsYWdzOiclcyciLCBzdWJzdHIgKyBpZHggKyAxKTsKKwl3aGlsZSAoc3Vic3RyWysraWR4XSkgeworCQlkYmcoInMgZmxhZzonJWMnIiwgc3Vic3RyW2lkeF0pOworCQkvKiBQYXJzZSBtYXRjaCBudW1iZXIgKi8KKwkJaWYgKGlzZGlnaXQoc3Vic3RyW2lkeF0pKSB7CisJCQlpZiAobWF0Y2hbMF0gIT0gJ14nKSB7CisJCQkJLyogTWF0Y2ggMCB0cmVhdGVkIGFzIGFsbCwgbXVsdGlwbGUgbWF0Y2hlcyB3ZSB0YWtlIHRoZSBsYXN0IG9uZS4gKi8KKwkJCQljb25zdCBjaGFyICpwb3MgPSBzdWJzdHIgKyBpZHg7CisvKiBGSVhNRTogZXJyb3IgY2hlY2s/ICovCisJCQkJc2VkX2NtZC0+d2hpY2hfbWF0Y2ggPSAodW5zaWduZWQpc3RydG9sKHN1YnN0citpZHgsIChjaGFyKiopICZwb3MsIDEwKTsKKwkJCQlpZHggPSBwb3MgLSBzdWJzdHIgLSAxOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJLyogU2tpcCBzcGFjZXMgKi8KKwkJaWYgKGlzc3BhY2Uoc3Vic3RyW2lkeF0pKQorCQkJY29udGludWU7CisKKwkJc3dpdGNoIChzdWJzdHJbaWR4XSkgeworCQkvKiBSZXBsYWNlIGFsbCBvY2N1cnJlbmNlcyAqLworCQljYXNlICdnJzoKKwkJCWlmIChtYXRjaFswXSAhPSAnXicpCisJCQkJc2VkX2NtZC0+d2hpY2hfbWF0Y2ggPSAwOworCQkJYnJlYWs7CisJCS8qIFByaW50IHBhdHRlcm4gc3BhY2UgKi8KKwkJY2FzZSAncCc6CisJCQlzZWRfY21kLT5zdWJfcCA9IDE7CisJCQlicmVhazsKKwkJLyogV3JpdGUgdG8gZmlsZSAqLworCQljYXNlICd3JzoKKwkJeworCQkJY2hhciAqdGVtcDsKKwkJCWlkeCArPSBwYXJzZV9maWxlX2NtZCgvKnNlZF9jbWQsKi8gc3Vic3RyK2lkeCwgJnRlbXApOworCQkJYnJlYWs7CisJCX0KKwkJLyogSWdub3JlIGNhc2UgKGdudSBleGVuc2lvbikgKi8KKwkJY2FzZSAnaSc6CisJCWNhc2UgJ0knOgorCQkJY2ZsYWdzIHw9IFJFR19JQ0FTRTsKKwkJCWJyZWFrOworCQkvKiBDb21tZW50ICovCisJCWNhc2UgJyMnOgorCQkJLy8gd2hpbGUgKHN1YnN0clsrK2lkeF0pIGNvbnRpbnVlOworCQkJaWR4ICs9IHN0cmxlbihzdWJzdHIgKyBpZHgpOyAvLyBzYW1lCisJCQkvKiBGYWxsIHRocm91Z2ggKi8KKwkJLyogRW5kIG9mIGNvbW1hbmQgKi8KKwkJY2FzZSAnOyc6CisJCWNhc2UgJ30nOgorCQkJZ290byBvdXQ7CisJCWRlZmF1bHQ6CisJCQlkYmcoInMgYmFkIGZsYWdzOiclcyciLCBzdWJzdHIgKyBpZHgpOworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBvcHRpb24gaW4gc3Vic3RpdHV0aW9uIGV4cHJlc3Npb24iKTsKKwkJfQorCX0KKyBvdXQ6CisJLyogY29tcGlsZSB0aGUgbWF0Y2ggc3RyaW5nIGludG8gYSByZWdleCAqLworCWlmICgqbWF0Y2ggIT0gJ1wwJykgeworCQkvKiBJZiBtYXRjaCBpcyBlbXB0eSwgd2UgdXNlIGxhc3QgcmVnZXggdXNlZCBhdCBydW50aW1lICovCisJCXNlZF9jbWQtPnN1Yl9tYXRjaCA9IHh6YWxsb2Moc2l6ZW9mKHJlZ2V4X3QpKTsKKwkJZGJnKCJ4cmVnY29tcCgnJXMnLCV4KSIsIG1hdGNoLCBjZmxhZ3MpOworCQl4cmVnY29tcChzZWRfY21kLT5zdWJfbWF0Y2gsIG1hdGNoLCBjZmxhZ3MpOworCQlkYmcoInJlZ2NvbXAgb2siKTsKKwl9CisJZnJlZShtYXRjaCk7CisKKwlyZXR1cm4gaWR4OworfQorCisvKgorICogIFByb2Nlc3MgdGhlIGNvbW1hbmRzIGFyZ3VtZW50cworICovCitzdGF0aWMgY29uc3QgY2hhciAqcGFyc2VfY21kX2FyZ3Moc2VkX2NtZF90ICpzZWRfY21kLCBjb25zdCBjaGFyICpjbWRzdHIpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgY21kX2xldHRlcnNbXSA9ICJzYWljcnc6YnRUeWREZ0doSGxuTnBQcXg9e30iOworCWVudW0geworCQlJRFhfcyA9IDAsCisJCUlEWF9hLAorCQlJRFhfaSwKKwkJSURYX2MsCisJCUlEWF9yLAorCQlJRFhfdywKKwkJSURYX2NvbG9uLAorCQlJRFhfYiwKKwkJSURYX3QsCisJCUlEWF9ULAorCQlJRFhfeSwKKwkJSURYX2QsCisJCUlEWF9ELAorCQlJRFhfZywKKwkJSURYX0csCisJCUlEWF9oLAorCQlJRFhfSCwKKwkJSURYX2wsCisJCUlEWF9uLAorCQlJRFhfTiwKKwkJSURYX3AsCisJCUlEWF9QLAorCQlJRFhfcSwKKwkJSURYX3gsCisJCUlEWF9lcXVhbCwKKwkJSURYX2xicmFjZSwKKwkJSURYX3JicmFjZSwKKwkJSURYX251bAorCX07CisJc3RydWN0IGNoayB7IGNoYXIgY2hrW3NpemVvZihjbWRfbGV0dGVycyktMSA9PSBJRFhfbnVsID8gMSA6IC0xXTsgfTsKKworCXVuc2lnbmVkIGlkeCA9IHN0cmNocm51bChjbWRfbGV0dGVycywgc2VkX2NtZC0+Y21kKSAtIGNtZF9sZXR0ZXJzOworCisJLyogaGFuZGxlIChzKXVic3RpdHV0aW9uIGNvbW1hbmQgKi8KKwlpZiAoaWR4ID09IElEWF9zKSB7CisJCWNtZHN0ciArPSBwYXJzZV9zdWJzdF9jbWQoc2VkX2NtZCwgY21kc3RyKTsKKwl9CisJLyogaGFuZGxlIGVkaXQgY21kczogKGEpcHBlbmQsIChpKW5zZXJ0LCBhbmQgKGMpaGFuZ2UgKi8KKwllbHNlIGlmIChpZHggPD0gSURYX2MpIHsgLyogYSxpLGMgKi8KKwkJaWYgKGlkeCA8IElEWF9jKSB7IC8qIGEsaSAqLworCQkJaWYgKHNlZF9jbWQtPmVuZF9saW5lIHx8IHNlZF9jbWQtPmVuZF9tYXRjaCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY29tbWFuZCAnJWMnIHVzZXMgb25seSBvbmUgYWRkcmVzcyIsIHNlZF9jbWQtPmNtZCk7CisJCX0KKwkJZm9yICg7OykgeworCQkJaWYgKCpjbWRzdHIgPT0gJ1xuJyB8fCAqY21kc3RyID09ICdcXCcpIHsKKwkJCQljbWRzdHIrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghaXNzcGFjZSgqY21kc3RyKSkKKwkJCQlicmVhazsKKwkJCWNtZHN0cisrOworCQl9CisJCXNlZF9jbWQtPnN0cmluZyA9IHhzdHJkdXAoY21kc3RyKTsKKwkJLyogIlxhbnljaGFyIiAtPiAiYW55Y2hhciIgKi8KKwkJcGFyc2VfZXNjYXBlcyhzZWRfY21kLT5zdHJpbmcsIHNlZF9jbWQtPnN0cmluZywgc3RybGVuKGNtZHN0ciksICdcMCcsICdcMCcpOworCQljbWRzdHIgKz0gc3RybGVuKGNtZHN0cik7CisJfQorCS8qIGhhbmRsZSBmaWxlIGNtZHM6IChyKWVhZCAqLworCWVsc2UgaWYgKGlkeCA8PSBJRFhfdykgeyAvKiByLHcgKi8KKwkJaWYgKGlkeCA8IElEWF93KSB7IC8qIHIgKi8KKwkJCWlmIChzZWRfY21kLT5lbmRfbGluZSB8fCBzZWRfY21kLT5lbmRfbWF0Y2gpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNvbW1hbmQgJyVjJyB1c2VzIG9ubHkgb25lIGFkZHJlc3MiLCBzZWRfY21kLT5jbWQpOworCQl9CisJCWNtZHN0ciArPSBwYXJzZV9maWxlX2NtZCgvKnNlZF9jbWQsKi8gY21kc3RyLCAmc2VkX2NtZC0+c3RyaW5nKTsKKwkJaWYgKHNlZF9jbWQtPmNtZCA9PSAndycpIHsKKwkJCXNlZF9jbWQtPnN3X2ZpbGUgPSB4Zm9wZW5fZm9yX3dyaXRlKHNlZF9jbWQtPnN0cmluZyk7CisJCQlzZWRfY21kLT5zd19sYXN0X2NoYXIgPSAnXG4nOworCQl9CisJfQorCS8qIGhhbmRsZSBicmFuY2ggY29tbWFuZHMgKi8KKwllbHNlIGlmIChpZHggPD0gSURYX1QpIHsgLyogOixiLHQsVCAqLworCQlpbnQgbGVuZ3RoOworCisJCWNtZHN0ciA9IHNraXBfd2hpdGVzcGFjZShjbWRzdHIpOworCQlsZW5ndGggPSBzdHJjc3BuKGNtZHN0ciwgc2VtaWNvbG9uX3doaXRlc3BhY2UpOworCQlpZiAobGVuZ3RoKSB7CisJCQlzZWRfY21kLT5zdHJpbmcgPSB4c3RybmR1cChjbWRzdHIsIGxlbmd0aCk7CisJCQljbWRzdHIgKz0gbGVuZ3RoOworCQl9CisJfQorCS8qIHRyYW5zbGF0aW9uIGNvbW1hbmQgKi8KKwllbHNlIGlmIChpZHggPT0gSURYX3kpIHsKKwkJY2hhciAqbWF0Y2gsICpyZXBsYWNlOworCQlpbnQgaSA9IGNtZHN0clswXTsKKworCQljbWRzdHIgKz0gcGFyc2VfcmVnZXhfZGVsaW0oY21kc3RyLCAmbWF0Y2gsICZyZXBsYWNlKSsxOworCQkvKiBcbiBhbHJlYWR5IHBhcnNlZCwgYnV0IFxkZWxpbWl0ZXIgbmVlZHMgdW5lc2NhcGluZy4gKi8KKwkJcGFyc2VfZXNjYXBlcyhtYXRjaCwgbWF0Y2gsIHN0cmxlbihtYXRjaCksIGksIGkpOworCQlwYXJzZV9lc2NhcGVzKHJlcGxhY2UsIHJlcGxhY2UsIHN0cmxlbihyZXBsYWNlKSwgaSwgaSk7CisKKwkJc2VkX2NtZC0+c3RyaW5nID0geHphbGxvYygoc3RybGVuKG1hdGNoKSArIDEpICogMik7CisJCWZvciAoaSA9IDA7IG1hdGNoW2ldICYmIHJlcGxhY2VbaV07IGkrKykgeworCQkJc2VkX2NtZC0+c3RyaW5nW2kqMl0gPSBtYXRjaFtpXTsKKwkJCXNlZF9jbWQtPnN0cmluZ1tpKjIrMV0gPSByZXBsYWNlW2ldOworCQl9CisJCWZyZWUobWF0Y2gpOworCQlmcmVlKHJlcGxhY2UpOworCX0KKwkvKiBpZiBpdCB3YXNudCBhIHNpbmdsZS1sZXR0ZXIgY29tbWFuZCB0aGF0IHRha2VzIG5vIGFyZ3VtZW50cworCSAqIHRoZW4gaXQgbXVzdCBiZSBhbiBpbnZhbGlkIGNvbW1hbmQuCisJICovCisJZWxzZSBpZiAoaWR4ID49IElEWF9udWwpIHsgLyogbm90IGQsRCxnLEcsaCxILGwsbixOLHAsUCxxLHgsPSx7LH0gKi8KKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVuc3VwcG9ydGVkIGNvbW1hbmQgJWMiLCBzZWRfY21kLT5jbWQpOworCX0KKworCS8qIGdpdmUgYmFjayB3aGF0ZXZlcidzIGxlZnQgb3ZlciAqLworCXJldHVybiBjbWRzdHI7Cit9CisKKworLyogUGFyc2UgYWRkcmVzcytjb21tYW5kIHNldHMsIHNraXBwaW5nIGNvbW1lbnQgbGluZXMuICovCisKK3N0YXRpYyB2b2lkIGFkZF9jbWQoY29uc3QgY2hhciAqY21kc3RyKQoreworCXNlZF9jbWRfdCAqc2VkX2NtZDsKKwl1bnNpZ25lZCBsZW4sIG47CisKKwkvKiBBcHBlbmQgdGhpcyBsaW5lIHRvIGFueSB1bmZpbmlzaGVkIGxpbmUgZnJvbSBsYXN0IHRpbWUuICovCisJaWYgKEcuYWRkX2NtZF9saW5lKSB7CisJCWNoYXIgKnRwID0geGFzcHJpbnRmKCIlc1xuJXMiLCBHLmFkZF9jbWRfbGluZSwgY21kc3RyKTsKKwkJZnJlZShHLmFkZF9jbWRfbGluZSk7CisJCWNtZHN0ciA9IEcuYWRkX2NtZF9saW5lID0gdHA7CisJfQorCisJLyogSWYgdGhpcyBsaW5lIGVuZHMgd2l0aCB1bmVzY2FwZWQgYmFja3NsYXNoLCByZXF1ZXN0IG5leHQgbGluZS4gKi8KKwluID0gbGVuID0gc3RybGVuKGNtZHN0cik7CisJd2hpbGUgKG4gJiYgY21kc3RyW24tMV0gPT0gJ1xcJykKKwkJbi0tOworCWlmICgobGVuIC0gbikgJiAxKSB7IC8qIGlmIG9kZCBudW1iZXIgb2YgdHJhaWxpbmcgYmFja3NsYXNoZXMgKi8KKwkJaWYgKCFHLmFkZF9jbWRfbGluZSkKKwkJCUcuYWRkX2NtZF9saW5lID0geHN0cmR1cChjbWRzdHIpOworCQlHLmFkZF9jbWRfbGluZVtsZW4tMV0gPSAnXDAnOworCQlyZXR1cm47CisJfQorCisJLyogTG9vcCBwYXJzaW5nIGFsbCBjb21tYW5kcyBpbiB0aGlzIGxpbmUuICovCisJd2hpbGUgKCpjbWRzdHIpIHsKKwkJLyogU2tpcCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIHNlbWljb2xvbnMgKi8KKwkJY21kc3RyICs9IHN0cnNwbihjbWRzdHIsIHNlbWljb2xvbl93aGl0ZXNwYWNlKTsKKworCQkvKiBJZiBubyBtb3JlIGNvbW1hbmRzLCBleGl0LiAqLworCQlpZiAoISpjbWRzdHIpIGJyZWFrOworCisJCS8qIGlmIHRoaXMgaXMgYSBjb21tZW50LCBqdW1wIHBhc3QgaXQgYW5kIGtlZXAgZ29pbmcgKi8KKwkJaWYgKCpjbWRzdHIgPT0gJyMnKSB7CisJCQkvKiAiI24iIGlzIHRoZSBzYW1lIGFzIHVzaW5nIC1uIG9uIHRoZSBjb21tYW5kIGxpbmUgKi8KKwkJCWlmIChjbWRzdHJbMV0gPT0gJ24nKQorCQkJCUcuYmVfcXVpZXQrKzsKKwkJCWNtZHN0ciA9IHN0cnBicmsoY21kc3RyLCAiXG5cciIpOworCQkJaWYgKCFjbWRzdHIpIGJyZWFrOworCQkJY29udGludWU7CisJCX0KKworCQkvKiBwYXJzZSB0aGUgY29tbWFuZAorCQkgKiBmb3JtYXQgaXM6IFthZGRyXVssYWRkcl1bIV1jbWQKKwkJICogICAgICAgICAgICB8LS0tLXx8LS0tLS18fC18CisJCSAqICAgICAgICAgICAgcGFydDEgcGFydDIgIHBhcnQzCisJCSAqLworCisJCXNlZF9jbWQgPSB4emFsbG9jKHNpemVvZihzZWRfY21kX3QpKTsKKworCQkvKiBmaXJzdCBwYXJ0IChpZiBwcmVzZW50KSBpcyBhbiBhZGRyZXNzOiBlaXRoZXIgYSAnJCcsIGEgbnVtYmVyIG9yIGEgL3JlZ2V4LyAqLworCQljbWRzdHIgKz0gZ2V0X2FkZHJlc3MoY21kc3RyLCAmc2VkX2NtZC0+YmVnX2xpbmUsICZzZWRfY21kLT5iZWdfbWF0Y2gpOworCQlzZWRfY21kLT5iZWdfbGluZV9vcmlnID0gc2VkX2NtZC0+YmVnX2xpbmU7CisKKwkJLyogc2Vjb25kIHBhcnQgKGlmIHByZXNlbnQpIHdpbGwgYmVnaW4gd2l0aCBhIGNvbW1hICovCisJCWlmICgqY21kc3RyID09ICcsJykgeworCQkJaW50IGlkeDsKKworCQkJY21kc3RyKys7CisJCQlpZiAoKmNtZHN0ciA9PSAnKycgJiYgaXNkaWdpdChjbWRzdHJbMV0pKSB7CisJCQkJLyogaHR0cDovL3NlZC5zb3VyY2Vmb3JnZS5uZXQvc2VkZmFxMy5odG1sI3MzLjMKKwkJCQkgKiBVbmRlciBHTlUgc2VkIDMuMDIrLCBzc2VkLCBhbmQgc2VkMTUrLCA8YWRkcmVzczI+CisJCQkJICogbWF5IGFsc28gYmUgYSBub3RhdGlvbiBvZiB0aGUgZm9ybSArbnVtLAorCQkJCSAqIGluZGljYXRpbmcgdGhlIG5leHQgbnVtIGxpbmVzIGFmdGVyIDxhZGRyZXNzMT4gaXMKKwkJCQkgKiBtYXRjaGVkLgorCQkJCSAqIEdOVSBzZWQgNC4yLjEgYWNjZXB0cyBldmVuICIrIiAobWVhbmluZyAiKzAiKS4KKwkJCQkgKiBXZSBkb24ndCAod2UgY2hlY2sgZm9yIGlzZGlnaXQsIHNlZSBhYm92ZSksIHRoaW5rCisJCQkJICogYWJvdXQgdGhlICIrLTMiIGNhc2UuCisJCQkJICovCisJCQkJY2hhciAqZW5kOworCQkJCS8qIGNvZGUgaXMgc21hbGxlciBjb21wYXJlZCB0byB1c2luZyAmY21kc3RyIGhlcmU6ICovCisJCQkJaWR4ID0gc3RydG9sKGNtZHN0cisxLCAmZW5kLCAxMCk7CisJCQkJc2VkX2NtZC0+ZW5kX2xpbmUgPSAtMiAtIGlkeDsKKwkJCQljbWRzdHIgPSBlbmQ7CisJCQl9IGVsc2UgeworCQkJCWlkeCA9IGdldF9hZGRyZXNzKGNtZHN0ciwgJnNlZF9jbWQtPmVuZF9saW5lLCAmc2VkX2NtZC0+ZW5kX21hdGNoKTsKKwkJCQljbWRzdHIgKz0gaWR4OworCQkJCWlkeC0tOyAvKiBpZiAwLCB0cmlnZ2VyIGVycm9yIGNoZWNrIGJlbG93ICovCisJCQl9CisJCQlpZiAoaWR4IDwgMCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm8gYWRkcmVzcyBhZnRlciBjb21tYSIpOworCQkJc2VkX2NtZC0+ZW5kX2xpbmVfb3JpZyA9IHNlZF9jbWQtPmVuZF9saW5lOworCQl9CisKKwkJLyogc2tpcCB3aGl0ZXNwYWNlIGJlZm9yZSB0aGUgY29tbWFuZCAqLworCQljbWRzdHIgPSBza2lwX3doaXRlc3BhY2UoY21kc3RyKTsKKworCQkvKiBDaGVjayBmb3IgaW52ZXJzaW9uIGZsYWcgKi8KKwkJaWYgKCpjbWRzdHIgPT0gJyEnKSB7CisJCQlzZWRfY21kLT5pbnZlcnQgPSAxOworCQkJY21kc3RyKys7CisKKwkJCS8qIHNraXAgd2hpdGVzcGFjZSBiZWZvcmUgdGhlIGNvbW1hbmQgKi8KKwkJCWNtZHN0ciA9IHNraXBfd2hpdGVzcGFjZShjbWRzdHIpOworCQl9CisKKwkJLyogbGFzdCBwYXJ0IChtYW5kYXRvcnkpIHdpbGwgYmUgYSBjb21tYW5kICovCisJCWlmICghKmNtZHN0cikKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtaXNzaW5nIGNvbW1hbmQiKTsKKwkJc2VkX2NtZC0+Y21kID0gKmNtZHN0cisrOworCQljbWRzdHIgPSBwYXJzZV9jbWRfYXJncyhzZWRfY21kLCBjbWRzdHIpOworCisJCS8qIGNtZHN0ciBub3cgcG9pbnRzIHBhc3QgYXJncy4KKwkJICogR05VIHNlZCByZXF1aXJlcyBhIHNlcGFyYXRvciwgaWYgdGhlcmUgYXJlIG1vcmUgY29tbWFuZHMsCisJCSAqIGVsc2UgaXQgY29tcGxhaW5zICJjaGFyIE46IGV4dHJhIGNoYXJhY3RlcnMgYWZ0ZXIgY29tbWFuZCIuCisJCSAqIEV4YW1wbGU6ICJzZWQgJ3A7ZCciLiBXZSBhbHNvIGFsbG93ICJzZWQgJ3BkJyIuCisJCSAqLworCisJCS8qIEFkZCB0aGUgY29tbWFuZCB0byB0aGUgY29tbWFuZCBhcnJheSAqLworCQkqRy5zZWRfY21kX3RhaWwgPSBzZWRfY21kOworCQlHLnNlZF9jbWRfdGFpbCA9ICZzZWRfY21kLT5uZXh0OworCX0KKworCS8qIElmIHdlIGdsdWVkIG11bHRpcGxlIGxpbmVzIHRvZ2V0aGVyLCBmcmVlIHRoZSBtZW1vcnkuICovCisJZnJlZShHLmFkZF9jbWRfbGluZSk7CisJRy5hZGRfY21kX2xpbmUgPSBOVUxMOworfQorCisvKiBBcHBlbmQgdG8gYSBzdHJpbmcsIHJlYWxsb2NhdGluZyBtZW1vcnkgYXMgbmVjZXNzYXJ5LiAqLworCisjZGVmaW5lIFBJUEVfR1JPVyA2NAorCitzdGF0aWMgdm9pZCBwaXBlX3B1dGMoY2hhciBjKQoreworCWlmIChHLnBpcGVsaW5lLmlkeCA9PSBHLnBpcGVsaW5lLmxlbikgeworCQlHLnBpcGVsaW5lLmJ1ZiA9IHhyZWFsbG9jKEcucGlwZWxpbmUuYnVmLAorCQkJCUcucGlwZWxpbmUubGVuICsgUElQRV9HUk9XKTsKKwkJRy5waXBlbGluZS5sZW4gKz0gUElQRV9HUk9XOworCX0KKwlHLnBpcGVsaW5lLmJ1ZltHLnBpcGVsaW5lLmlkeCsrXSA9IGM7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3N1YnN0X3dfYmFja3JlZnMoY2hhciAqbGluZSwgY2hhciAqcmVwbGFjZSkKK3sKKwlpbnQgaSwgajsKKworCS8qIGdvIHRocm91Z2ggdGhlIHJlcGxhY2VtZW50IHN0cmluZyAqLworCWZvciAoaSA9IDA7IHJlcGxhY2VbaV07IGkrKykgeworCQkvKiBpZiB3ZSBmaW5kIGEgYmFja3JlZmVyZW5jZSAoXDEsIFwyLCBldGMuKSBwcmludCB0aGUgYmFja3JlZidlZCB0ZXh0ICovCisJCWlmIChyZXBsYWNlW2ldID09ICdcXCcpIHsKKwkJCXVuc2lnbmVkIGJhY2tyZWYgPSByZXBsYWNlWysraV0gLSAnMCc7CisJCQlpZiAoYmFja3JlZiA8PSA5KSB7CisJCQkJLyogcHJpbnQgb3V0IHRoZSB0ZXh0IGhlbGQgaW4gRy5yZWdtYXRjaFtiYWNrcmVmXSAqLworCQkJCWlmIChHLnJlZ21hdGNoW2JhY2tyZWZdLnJtX3NvICE9IC0xKSB7CisJCQkJCWogPSBHLnJlZ21hdGNoW2JhY2tyZWZdLnJtX3NvOworCQkJCQl3aGlsZSAoaiA8IEcucmVnbWF0Y2hbYmFja3JlZl0ucm1fZW8pCisJCQkJCQlwaXBlX3B1dGMobGluZVtqKytdKTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBJIF90aGlua18gaXQgaXMgaW1wb3NzaWJsZSB0byBnZXQgJ1wnIHRvIGJlCisJCQkgKiB0aGUgbGFzdCBjaGFyIGluIHJlcGxhY2Ugc3RyaW5nLiBUaHVzIHdlIGRvbnQgY2hlY2sKKwkJCSAqIGZvciByZXBsYWNlW2ldID09IE5VTC4gKGNvdW50ZXJleGFtcGxlIGFueW9uZT8pICovCisJCQkvKiBpZiB3ZSBmaW5kIGEgYmFja3NsYXNoIGVzY2FwZWQgY2hhcmFjdGVyLCBwcmludCB0aGUgY2hhcmFjdGVyICovCisJCQlwaXBlX3B1dGMocmVwbGFjZVtpXSk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBpZiB3ZSBmaW5kIGFuIHVuZXNjYXBlZCAnJicgcHJpbnQgb3V0IHRoZSB3aG9sZSBtYXRjaGVkIHRleHQuICovCisJCWlmIChyZXBsYWNlW2ldID09ICcmJykgeworCQkJaiA9IEcucmVnbWF0Y2hbMF0ucm1fc287CisJCQl3aGlsZSAoaiA8IEcucmVnbWF0Y2hbMF0ucm1fZW8pCisJCQkJcGlwZV9wdXRjKGxpbmVbaisrXSk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBPdGhlcndpc2UganVzdCBvdXRwdXQgdGhlIGNoYXJhY3Rlci4gKi8KKwkJcGlwZV9wdXRjKHJlcGxhY2VbaV0pOworCX0KK30KKworc3RhdGljIGludCBkb19zdWJzdF9jb21tYW5kKHNlZF9jbWRfdCAqc2VkX2NtZCwgY2hhciAqKmxpbmVfcCkKK3sKKwljaGFyICpsaW5lID0gKmxpbmVfcDsKKwl1bnNpZ25lZCBtYXRjaF9jb3VudCA9IDA7CisJYm9vbCBhbHRlcmVkID0gMDsKKwlib29sIHByZXZfbWF0Y2hfZW1wdHkgPSAxOworCWJvb2wgdHJpZWRfYXRfZW9sID0gMDsKKwlyZWdleF90ICpjdXJyZW50X3JlZ2V4OworCisJY3VycmVudF9yZWdleCA9IHNlZF9jbWQtPnN1Yl9tYXRjaDsKKwkvKiBIYW5kbGUgZW1wdHkgcmVnZXguICovCisJaWYgKCFjdXJyZW50X3JlZ2V4KSB7CisJCWN1cnJlbnRfcmVnZXggPSBHLnByZXZpb3VzX3JlZ2V4X3B0cjsKKwkJaWYgKCFjdXJyZW50X3JlZ2V4KQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vIHByZXZpb3VzIHJlZ2V4cCIpOworCX0KKwlHLnByZXZpb3VzX3JlZ2V4X3B0ciA9IGN1cnJlbnRfcmVnZXg7CisKKwkvKiBGaW5kIHRoZSBmaXJzdCBtYXRjaCAqLworCWRiZygibWF0Y2hpbmcgJyVzJyIsIGxpbmUpOworCWlmIChSRUdfTk9NQVRDSCA9PSByZWdleGVjKGN1cnJlbnRfcmVnZXgsIGxpbmUsIDEwLCBHLnJlZ21hdGNoLCAwKSkgeworCQlkYmcoIm5vIG1hdGNoIik7CisJCXJldHVybiAwOworCX0KKwlkYmcoIm1hdGNoIik7CisKKwkvKiBJbml0aWFsaXplIHRlbXBvcmFyeSBvdXRwdXQgYnVmZmVyLiAqLworCUcucGlwZWxpbmUuYnVmID0geG1hbGxvYyhQSVBFX0dST1cpOworCUcucGlwZWxpbmUubGVuID0gUElQRV9HUk9XOworCUcucGlwZWxpbmUuaWR4ID0gMDsKKworCS8qIE5vdyBsb29wIHRocm91Z2gsIHN1YnN0aXR1dGluZyBmb3IgbWF0Y2hlcyAqLworCWRvIHsKKwkJaW50IHN0YXJ0ID0gRy5yZWdtYXRjaFswXS5ybV9zbzsKKwkJaW50IGVuZCA9IEcucmVnbWF0Y2hbMF0ucm1fZW87CisJCWludCBpOworCisJCW1hdGNoX2NvdW50Kys7CisKKwkJLyogSWYgd2UgYXJlbid0IGludGVyZXN0ZWQgaW4gdGhpcyBtYXRjaCwgb3V0cHV0IG9sZCBsaW5lIHRvCisJCSAqIGVuZCBvZiBtYXRjaCBhbmQgY29udGludWUgKi8KKwkJaWYgKHNlZF9jbWQtPndoaWNoX21hdGNoCisJCSAmJiAoc2VkX2NtZC0+d2hpY2hfbWF0Y2ggIT0gbWF0Y2hfY291bnQpCisJCSkgeworCQkJZm9yIChpID0gMDsgaSA8IGVuZDsgaSsrKQorCQkJCXBpcGVfcHV0YygqbGluZSsrKTsKKwkJCS8qIE51bGwgbWF0Y2g/IFByaW50IG9uZSBtb3JlIGNoYXIgKi8KKwkJCWlmIChzdGFydCA9PSBlbmQgJiYgKmxpbmUpCisJCQkJcGlwZV9wdXRjKCpsaW5lKyspOworCQkJZ290byBuZXh0OworCQl9CisKKwkJLyogUHJpbnQgZXZlcnl0aGluZyBiZWZvcmUgdGhlIG1hdGNoICovCisJCWZvciAoaSA9IDA7IGkgPCBzdGFydDsgaSsrKQorCQkJcGlwZV9wdXRjKGxpbmVbaV0pOworCisJCS8qIFRoZW4gcHJpbnQgdGhlIHN1YnN0aXR1dGlvbiBzdHJpbmcsCisJCSAqIHVubGVzcyB3ZSBqdXN0IG1hdGNoZWQgZW1wdHkgc3RyaW5nIGFmdGVyIG5vbi1lbXB0eSBvbmUuCisJCSAqIEV4YW1wbGU6IHN0cmluZyAiY2NjZCIsIHBhdHRlcm4gImMqIiwgcmVwbCAiUiI6CisJCSAqIHJlc3VsdCBpcyAiUmRSIiwgbm90ICJSUmRSIjogZmlyc3QgbWF0Y2ggImNjYyIsCisJCSAqIHNlY29uZCBpcyAiIiBiZWZvcmUgImQiLCB0aGlyZCBpcyAiIiBhZnRlciAiZCIuCisJCSAqIFNlY29uZCBtYXRjaCBpcyBOT1QgcmVwbGFjZWQhCisJCSAqLworCQlpZiAocHJldl9tYXRjaF9lbXB0eSB8fCBzdGFydCAhPSAwIHx8IHN0YXJ0ICE9IGVuZCkgeworCQkJLy9kYmcoIiVkICVkICVkIiwgcHJldl9tYXRjaF9lbXB0eSwgc3RhcnQsIGVuZCk7CisJCQlkYmcoImluc2VydGluZyByZXBsYWNlbWVudCBhdCAlZCBpbiAnJXMnIiwgc3RhcnQsIGxpbmUpOworCQkJZG9fc3Vic3Rfd19iYWNrcmVmcyhsaW5lLCBzZWRfY21kLT5zdHJpbmcpOworCQkJLyogRmxhZyB0aGF0IHNvbWV0aGluZyBoYXMgY2hhbmdlZCAqLworCQkJYWx0ZXJlZCA9IDE7CisJCX0gZWxzZSB7CisJCQlkYmcoIk5PVCBpbnNlcnRpbmcgcmVwbGFjZW1lbnQgYXQgJWQgaW4gJyVzJyIsIHN0YXJ0LCBsaW5lKTsKKwkJfQorCisJCS8qIElmIG1hdGNoZWQgc3RyaW5nIGlzIGVtcHR5IChmLmUuICJjKiIgcGF0dGVybiksCisJCSAqIGNvcHkgdmVyYmF0aW0gb25lIGNoYXIgYWZ0ZXIgaXQgYmVmb3JlIGF0dGVtcHRpbmcgbW9yZSBtYXRjaGVzCisJCSAqLworCQlwcmV2X21hdGNoX2VtcHR5ID0gKHN0YXJ0ID09IGVuZCk7CisJCWlmIChwcmV2X21hdGNoX2VtcHR5KSB7CisJCQlpZiAoIWxpbmVbZW5kXSkgeworCQkJCXRyaWVkX2F0X2VvbCA9IDE7CisJCQl9IGVsc2UgeworCQkJCXBpcGVfcHV0YyhsaW5lW2VuZF0pOworCQkJCWVuZCsrOworCQkJfQorCQl9CisKKwkJLyogQWR2YW5jZSBwYXN0IHRoZSBtYXRjaCAqLworCQlkYmcoImxpbmUgKz0gJWQiLCBlbmQpOworCQlsaW5lICs9IGVuZDsKKworCQkvKiBpZiB3ZSdyZSBub3QgZG9pbmcgdGhpcyBnbG9iYWxseSwgZ2V0IG91dCBub3cgKi8KKwkJaWYgKHNlZF9jbWQtPndoaWNoX21hdGNoICE9IDApCisJCQlicmVhazsKKyBuZXh0OgorCQkvKiBFeGl0IGlmIHdlIGFyZSBhdCBFT0wgYW5kIGFscmVhZHkgdHJpZWQgbWF0Y2hpbmcgYXQgaXQgKi8KKwkJaWYgKCpsaW5lID09ICdcMCcpIHsKKwkJCWlmICh0cmllZF9hdF9lb2wpCisJCQkJYnJlYWs7CisJCQl0cmllZF9hdF9lb2wgPSAxOworCQl9CisKKy8vbWF5YmUgKGVuZCA/IFJFR19OT1RCT0wgOiAwKSBpbnN0ZWFkIG9mIHVuY29uZGl0aW9uYWwgUkVHX05PVEJPTD8KKwl9IHdoaWxlIChyZWdleGVjKGN1cnJlbnRfcmVnZXgsIGxpbmUsIDEwLCBHLnJlZ21hdGNoLCBSRUdfTk9UQk9MKSAhPSBSRUdfTk9NQVRDSCk7CisKKwkvKiBDb3B5IHJlc3Qgb2Ygc3RyaW5nIGludG8gb3V0cHV0IHBpcGVsaW5lICovCisJd2hpbGUgKDEpIHsKKwkJY2hhciBjID0gKmxpbmUrKzsKKwkJcGlwZV9wdXRjKGMpOworCQlpZiAoYyA9PSAnXDAnKQorCQkJYnJlYWs7CisJfQorCisJZnJlZSgqbGluZV9wKTsKKwkqbGluZV9wID0gRy5waXBlbGluZS5idWY7CisJcmV0dXJuIGFsdGVyZWQ7Cit9CisKKy8qIFNldCBjb21tYW5kIHBvaW50ZXIgdG8gcG9pbnQgdG8gdGhpcyBsYWJlbC4gIChEb2VzIG5vdCBoYW5kbGUgbnVsbCBsYWJlbC4pICovCitzdGF0aWMgc2VkX2NtZF90ICpicmFuY2hfdG8oY2hhciAqbGFiZWwpCit7CisJc2VkX2NtZF90ICpzZWRfY21kOworCisJZm9yIChzZWRfY21kID0gRy5zZWRfY21kX2hlYWQ7IHNlZF9jbWQ7IHNlZF9jbWQgPSBzZWRfY21kLT5uZXh0KSB7CisJCWlmIChzZWRfY21kLT5jbWQgPT0gJzonICYmIHNlZF9jbWQtPnN0cmluZyAmJiAhc3RyY21wKHNlZF9jbWQtPnN0cmluZywgbGFiZWwpKSB7CisJCQlyZXR1cm4gc2VkX2NtZDsKKwkJfQorCX0KKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZmluZCBsYWJlbCBmb3IganVtcCB0byAnJXMnIiwgbGFiZWwpOworfQorCitzdGF0aWMgdm9pZCBhcHBlbmQoY2hhciAqcykKK3sKKwlsbGlzdF9hZGRfdG9fZW5kKCZHLmFwcGVuZF9oZWFkLCBzKTsKK30KKworLyogT3V0cHV0IGxpbmUgb2YgdGV4dC4gKi8KKy8qIE5vdGU6CisgKiBUaGUgdHJpY2tzIHdpdGggTk9fRU9MX0NIQVIgYW5kIGxhc3RfcHV0c19jaGFyIGFyZSB0aGVyZSB0byBlbXVsYXRlIGdudSBzZWQuCisgKiBXaXRob3V0IHRoZW0sIHdlIGhhZCB0aGlzOgorICogZWNobyAtbiB0aGluZ3kgPnoxCisgKiBlY2hvIC1uIGFnYWluID56MgorICogPnpudWxsCisgKiBzZWQgInMvaS96LyIgejEgejIgem51bGwgfCBoZXhkdW1wIC12QworICogb3V0cHV0OgorICogZ251IHNlZCA0LjEuNToKKyAqIDAwMDAwMDAwICA3NCA2OCA3YSA2ZSA2NyA3OSAwYSA2MSAgNjcgNjEgN2EgNmUgICAgICAgICAgICAgIHx0aHpuZ3kuYWdhem58CisgKiBiYm94OgorICogMDAwMDAwMDAgIDc0IDY4IDdhIDZlIDY3IDc5IDYxIDY3ICA2MSA3YSA2ZSAgICAgICAgICAgICAgICAgfHRoem5neWFnYXpufAorICovCitlbnVtIHsKKwlOT19FT0xfQ0hBUiA9IDEsCisJTEFTVF9JU19OVUwgPSAyLAorfTsKK3N0YXRpYyB2b2lkIHB1dHNfbWF5YmVfbmV3bGluZShjaGFyICpzLCBGSUxFICpmaWxlLCBjaGFyICpsYXN0X3B1dHNfY2hhciwgY2hhciBsYXN0X2dldHNfY2hhcikKK3sKKwljaGFyIGxwYyA9ICpsYXN0X3B1dHNfY2hhcjsKKworCS8qIE5lZWQgdG8gaW5zZXJ0IGEgJ1xuJyBiZXR3ZWVuIHR3byBmaWxlcyBiZWNhdXNlIGZpcnN0IGZpbGUncworCSAqIGxhc3QgbGluZSB3YXNuJ3QgdGVybWluYXRlZD8gKi8KKwlpZiAobHBjICE9ICdcbicgJiYgbHBjICE9ICdcMCcpIHsKKwkJZnB1dGMoJ1xuJywgZmlsZSk7CisJCWxwYyA9ICdcbic7CisJfQorCWZwdXRzKHMsIGZpbGUpOworCisJLyogJ3gnIC0ganVzdCBzb21ldGhpbmcgd2hpY2ggaXMgbm90ICdcbicsICdcMCcgb3IgTk9fRU9MX0NIQVIgKi8KKwlpZiAoc1swXSkKKwkJbHBjID0gJ3gnOworCisJLyogaGFkIHRyYWlsaW5nICdcMCcgYW5kIGl0IHdhcyBsYXN0IGNoYXIgb2YgZmlsZT8gKi8KKwlpZiAobGFzdF9nZXRzX2NoYXIgPT0gTEFTVF9JU19OVUwpIHsKKwkJZnB1dGMoJ1wwJywgZmlsZSk7CisJCWxwYyA9ICd4JzsgLyogKi8KKwl9IGVsc2UKKwkvKiBoYWQgdHJhaWxpbmcgJ1xuJyBvciAnXDAnPyAqLworCWlmIChsYXN0X2dldHNfY2hhciAhPSBOT19FT0xfQ0hBUikgeworCQlmcHV0YyhsYXN0X2dldHNfY2hhciwgZmlsZSk7CisJCWxwYyA9IGxhc3RfZ2V0c19jaGFyOworCX0KKworCWlmIChmZXJyb3IoZmlsZSkpIHsKKwkJeGZ1bmNfZXJyb3JfcmV0dmFsID0gNDsgIC8qIEl0J3Mgd2hhdCBnbnUgc2VkIGV4aXRzIHdpdGguLi4gKi8KKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3dyaXRlX2Vycm9yKTsKKwl9CisJKmxhc3RfcHV0c19jaGFyID0gbHBjOworfQorCitzdGF0aWMgdm9pZCBmbHVzaF9hcHBlbmQoY2hhciAqbGFzdF9wdXRzX2NoYXIsIGNoYXIgbGFzdF9nZXRzX2NoYXIpCit7CisJY2hhciAqZGF0YTsKKworCS8qIE91dHB1dCBhcHBlbmRlZCBsaW5lcy4gKi8KKwl3aGlsZSAoKGRhdGEgPSAoY2hhciAqKWxsaXN0X3BvcCgmRy5hcHBlbmRfaGVhZCkpKSB7CisJCXB1dHNfbWF5YmVfbmV3bGluZShkYXRhLCBHLm5vbnN0ZG91dCwgbGFzdF9wdXRzX2NoYXIsIGxhc3RfZ2V0c19jaGFyKTsKKwkJZnJlZShkYXRhKTsKKwl9Cit9CisKKy8qIEdldCBuZXh0IGxpbmUgb2YgaW5wdXQgZnJvbSBHLmlucHV0X2ZpbGVfbGlzdCwgZmx1c2hpbmcgYXBwZW5kIGJ1ZmZlciBhbmQKKyAqIG5vdGluZyBpZiB3ZSByYW4gb3V0IG9mIGZpbGVzIHdpdGhvdXQgYSBuZXdsaW5lIG9uIHRoZSBsYXN0IGxpbmUgd2UgcmVhZC4KKyAqLworc3RhdGljIGNoYXIgKmdldF9uZXh0X2xpbmUoY2hhciAqZ2V0c19jaGFyLCBjaGFyICpsYXN0X3B1dHNfY2hhciwgY2hhciBsYXN0X2dldHNfY2hhcikKK3sKKwljaGFyICp0ZW1wID0gTlVMTDsKKwlpbnQgbGVuOworCWNoYXIgZ2M7CisKKwlmbHVzaF9hcHBlbmQobGFzdF9wdXRzX2NoYXIsIGxhc3RfZ2V0c19jaGFyKTsKKworCS8qIHdpbGwgYmUgcmV0dXJuZWQgaWYgbGFzdCBsaW5lIGluIHRoZSBmaWxlCisJICogZG9lc24ndCBlbmQgd2l0aCBlaXRoZXIgJ1xuJyBvciAnXDAnICovCisJZ2MgPSBOT19FT0xfQ0hBUjsKKwlmb3IgKDsgRy5jdXJyZW50X2lucHV0X2ZpbGUgPD0gRy5sYXN0X2lucHV0X2ZpbGU7IEcuY3VycmVudF9pbnB1dF9maWxlKyspIHsKKwkJRklMRSAqZnAgPSBHLmN1cnJlbnRfZnA7CisJCWlmICghZnApIHsKKwkJCWNvbnN0IGNoYXIgKnBhdGggPSBHLmlucHV0X2ZpbGVfbGlzdFtHLmN1cnJlbnRfaW5wdXRfZmlsZV07CisJCQlmcCA9IHN0ZGluOworCQkJaWYgKHBhdGggIT0gYmJfbXNnX3N0YW5kYXJkX2lucHV0KSB7CisJCQkJZnAgPSBmb3Blbl9vcl93YXJuKHBhdGgsICJyIik7CisJCQkJaWYgKCFmcCkgeworCQkJCQlHLmV4aXRjb2RlID0gRVhJVF9GQUlMVVJFOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQlHLmN1cnJlbnRfZnAgPSBmcDsKKwkJfQorCQkvKiBSZWFkIGxpbmUgdXAgdG8gYSBuZXdsaW5lIG9yIE5VTCBieXRlLCBpbmNsdXNpdmUsCisJCSAqIHJldHVybiBtYWxsb2MnZWQgY2hhcltdLiBsZW5ndGggb2YgdGhlIGNodW5rIHJlYWQKKwkJICogaXMgc3RvcmVkIGluIGxlbi4gTlVMTCBpZiBFT0YvZXJyb3IgKi8KKwkJdGVtcCA9IGJiX2dldF9jaHVua19mcm9tX2ZpbGUoZnAsICZsZW4pOworCQlpZiAodGVtcCkgeworCQkJLyogbGVuID4gMCBoZXJlLCBpdCdzIG9rIHRvIGRvIHRlbXBbbGVuLTFdICovCisJCQljaGFyIGMgPSB0ZW1wW2xlbi0xXTsKKwkJCWlmIChjID09ICdcbicgfHwgYyA9PSAnXDAnKSB7CisJCQkJdGVtcFtsZW4tMV0gPSAnXDAnOworCQkJCWdjID0gYzsKKwkJCQlpZiAoYyA9PSAnXDAnKSB7CisJCQkJCWludCBjaCA9IGZnZXRjKGZwKTsKKwkJCQkJaWYgKGNoICE9IEVPRikKKwkJCQkJCXVuZ2V0YyhjaCwgZnApOworCQkJCQllbHNlCisJCQkJCQlnYyA9IExBU1RfSVNfTlVMOworCQkJCX0KKwkJCX0KKwkJCS8qIGVsc2Ugd2UgcHV0IE5PX0VPTF9DSEFSIGludG8gKmdldHNfY2hhciAqLworCQkJYnJlYWs7CisKKwkJLyogTkI6IEkgaGFkIHRoZSBpZGVhIG9mIHBlZWtpbmcgbmV4dCBmaWxlKHMpIGFuZCByZXR1cm5pbmcKKwkJICogTk9fRU9MX0NIQVIgb25seSBpZiBpdCBpcyB0aGUgKmxhc3QqIG5vbi1lbXB0eQorCQkgKiBpbnB1dCBmaWxlLiBCdXQgdGhlcmUgaXMgYSBjYXNlIHdoZXJlIHRoaXMgd29uJ3Qgd29yazoKKwkJICogZmlsZTE6ICJhIHdvb1xuYiB3b28iCisJCSAqIGZpbGUyOiAiYyBub1xuZCBubyIKKwkJICogc2VkIC1uZSAncy93b28vYmFuZy9wJyBpbnB1dDEgaW5wdXQyID0+ICJhIGJhbmdcbmIgYmFuZyIKKwkJICogKG5vdGU6ICpubyogbmV3bGluZSBhZnRlciAiYiBiYW5nIiEpICovCisJCX0KKwkJLyogQ2xvc2UgdGhpcyBmaWxlIGFuZCBhZHZhbmNlIHRvIG5leHQgb25lICovCisJCWZjbG9zZV9pZl9ub3Rfc3RkaW4oZnApOworCQlHLmN1cnJlbnRfZnAgPSBOVUxMOworCX0KKwkqZ2V0c19jaGFyID0gZ2M7CisJcmV0dXJuIHRlbXA7Cit9CisKKyNkZWZpbmUgc2VkX3B1dHMocywgbikgKHB1dHNfbWF5YmVfbmV3bGluZShzLCBHLm5vbnN0ZG91dCwgJmxhc3RfcHV0c19jaGFyLCBuKSkKKworc3RhdGljIGludCBiZWdfbWF0Y2goc2VkX2NtZF90ICpzZWRfY21kLCBjb25zdCBjaGFyICpwYXR0ZXJuX3NwYWNlKQoreworCWludCByZXR2YWwgPSBzZWRfY21kLT5iZWdfbWF0Y2ggJiYgIXJlZ2V4ZWMoc2VkX2NtZC0+YmVnX21hdGNoLCBwYXR0ZXJuX3NwYWNlLCAwLCBOVUxMLCAwKTsKKwlpZiAocmV0dmFsKQorCQlHLnByZXZpb3VzX3JlZ2V4X3B0ciA9IHNlZF9jbWQtPmJlZ19tYXRjaDsKKwlyZXR1cm4gcmV0dmFsOworfQorCisvKiBQcm9jZXNzIGFsbCB0aGUgbGluZXMgaW4gYWxsIHRoZSBmaWxlcyAqLworCitzdGF0aWMgdm9pZCBwcm9jZXNzX2ZpbGVzKHZvaWQpCit7CisJY2hhciAqcGF0dGVybl9zcGFjZSwgKm5leHRfbGluZTsKKwlpbnQgbGluZW51bSA9IDA7CisJY2hhciBsYXN0X3B1dHNfY2hhciA9ICdcbic7CisJY2hhciBsYXN0X2dldHNfY2hhciwgbmV4dF9nZXRzX2NoYXI7CisJc2VkX2NtZF90ICpzZWRfY21kOworCWludCBzdWJzdGl0dXRlZDsKKworCS8qIFByaW1lIHRoZSBwdW1wICovCisJbmV4dF9saW5lID0gZ2V0X25leHRfbGluZSgmbmV4dF9nZXRzX2NoYXIsICZsYXN0X3B1dHNfY2hhciwgJ1xuJyAvKmxhc3RfZ2V0c19jaGFyKi8pOworCisJLyogR28gdGhyb3VnaCBldmVyeSBsaW5lIGluIGVhY2ggZmlsZSAqLworIGFnYWluOgorCXN1YnN0aXR1dGVkID0gMDsKKworCS8qIEFkdmFuY2UgdG8gbmV4dCBsaW5lLiAgU3RvcCBpZiBvdXQgb2YgbGluZXMuICovCisJcGF0dGVybl9zcGFjZSA9IG5leHRfbGluZTsKKwlpZiAoIXBhdHRlcm5fc3BhY2UpCisJCXJldHVybjsKKwlsYXN0X2dldHNfY2hhciA9IG5leHRfZ2V0c19jaGFyOworCisJLyogUmVhZCBvbmUgbGluZSBpbiBhZHZhbmNlIHNvIHdlIGNhbiBhY3Qgb24gdGhlIGxhc3QgbGluZSwKKwkgKiB0aGUgJyQnIGFkZHJlc3MgKi8KKwluZXh0X2xpbmUgPSBnZXRfbmV4dF9saW5lKCZuZXh0X2dldHNfY2hhciwgJmxhc3RfcHV0c19jaGFyLCBsYXN0X2dldHNfY2hhcik7CisJbGluZW51bSsrOworCisJLyogRm9yIGV2ZXJ5IGxpbmUsIGdvIHRocm91Z2ggYWxsIHRoZSBjb21tYW5kcyAqLworIHJlc3RhcnQ6CisJZm9yIChzZWRfY21kID0gRy5zZWRfY21kX2hlYWQ7IHNlZF9jbWQ7IHNlZF9jbWQgPSBzZWRfY21kLT5uZXh0KSB7CisJCWludCBvbGRfbWF0Y2hlZCwgbWF0Y2hlZDsKKworCQlvbGRfbWF0Y2hlZCA9IHNlZF9jbWQtPmluX21hdGNoOworCisJCS8qIERldGVybWluZSBpZiB0aGlzIGNvbW1hbmQgbWF0Y2hlcyB0aGlzIGxpbmU6ICovCisKKwkJZGJnKCJtYXRjaDE6JWQiLCBzZWRfY21kLT5pbl9tYXRjaCk7CisJCWRiZygibWF0Y2gyOiVkIiwgKCFzZWRfY21kLT5iZWdfbGluZSAmJiAhc2VkX2NtZC0+ZW5kX2xpbmUKKwkJCQkmJiAhc2VkX2NtZC0+YmVnX21hdGNoICYmICFzZWRfY21kLT5lbmRfbWF0Y2gpKTsKKwkJZGJnKCJtYXRjaDM6JWQiLCAoc2VkX2NtZC0+YmVnX2xpbmUgPiAwCisJCQkmJiAoc2VkX2NtZC0+ZW5kX2xpbmUgfHwgc2VkX2NtZC0+ZW5kX21hdGNoCisJCQkgICAgPyAoc2VkX2NtZC0+YmVnX2xpbmUgPD0gbGluZW51bSkKKwkJCSAgICA6IChzZWRfY21kLT5iZWdfbGluZSA9PSBsaW5lbnVtKQorCQkJICAgICkKKwkJCSkpOworCQlkYmcoIm1hdGNoNDolZCIsIChiZWdfbWF0Y2goc2VkX2NtZCwgcGF0dGVybl9zcGFjZSkpKTsKKwkJZGJnKCJtYXRjaDU6JWQiLCAoc2VkX2NtZC0+YmVnX2xpbmUgPT0gLTEgJiYgbmV4dF9saW5lID09IE5VTEwpKTsKKworCQkvKiBBcmUgd2UgY29udGludWluZyBhIHByZXZpb3VzIG11bHRpLWxpbmUgbWF0Y2g/ICovCisJCXNlZF9jbWQtPmluX21hdGNoID0gc2VkX2NtZC0+aW5fbWF0Y2gKKwkJCS8qIE9yIGlzIG5vIHJhbmdlIG5lY2Vzc2FyeT8gKi8KKwkJCXx8ICghc2VkX2NtZC0+YmVnX2xpbmUgJiYgIXNlZF9jbWQtPmVuZF9saW5lCisJCQkJJiYgIXNlZF9jbWQtPmJlZ19tYXRjaCAmJiAhc2VkX2NtZC0+ZW5kX21hdGNoKQorCQkJLyogT3IgZGlkIHdlIG1hdGNoIHRoZSBzdGFydCBvZiBhIG51bWVyaWNhbCByYW5nZT8gKi8KKwkJCXx8IChzZWRfY21kLT5iZWdfbGluZSA+IDAKKwkJCSAgICAmJiAoc2VkX2NtZC0+ZW5kX2xpbmUgfHwgc2VkX2NtZC0+ZW5kX21hdGNoCisJCQkJICAvKiBub3RlOiBldmVuIGlmIGVuZCBpcyBudW1lcmljIGFuZCBpcyA8IGxpbmVudW0gdG9vLAorCQkJCSAgICogR05VIHNlZCBtYXRjaGVzISBXZSBtYXRjaCB0b28sIHRoZXJlZm9yZSB3ZSBkb24ndAorCQkJCSAgICogY2hlY2sgaGVyZSB0aGF0IGxpbmVudW0gPD0gZW5kLgorCQkJCSAgICogRXhhbXBsZToKKwkJCQkgICAqIHByaW50ZiAnMVxuMlxuM1xuNFxuJyB8IHNlZCAtbiAnMXtOO047ZH07MXA7MiwzcDszcDs0cCcKKwkJCQkgICAqIGZpcnN0IHRocmVlIGlucHV0IGxpbmVzIGFyZSBkZWxldGVkOworCQkJCSAgICogNHRoIGxpbmUgaXMgbWF0Y2hlZCBhbmQgcHJpbnRlZAorCQkJCSAgICogYnkgIjIsMyIgKCEpIGFuZCBieSAiNCIgcmFuZ2VzCisJCQkJICAgKi8KKwkJCQk/IChzZWRfY21kLT5iZWdfbGluZSA8PSBsaW5lbnVtKSAgICAvKiBOLGVuZCAqLworCQkJCTogKHNlZF9jbWQtPmJlZ19saW5lID09IGxpbmVudW0pICAgIC8qIE4gKi8KKwkJCQkpCisJCQkgICAgKQorCQkJLyogT3IgZG9lcyB0aGlzIGxpbmUgbWF0Y2ggb3VyIGJlZ2luIGFkZHJlc3MgcmVnZXg/ICovCisJCQl8fCAoYmVnX21hdGNoKHNlZF9jbWQsIHBhdHRlcm5fc3BhY2UpKQorCQkJLyogT3IgZGlkIHdlIG1hdGNoIGxhc3QgbGluZSBvZiBpbnB1dD8gKi8KKwkJCXx8IChzZWRfY21kLT5iZWdfbGluZSA9PSAtMSAmJiBuZXh0X2xpbmUgPT0gTlVMTCk7CisKKwkJLyogU25hcHNob3QgdGhlIHZhbHVlICovCisJCW1hdGNoZWQgPSBzZWRfY21kLT5pbl9tYXRjaDsKKworCQlkYmcoImNtZDonJWMnIG1hdGNoZWQ6JWQgYmVnX2xpbmU6JWQgZW5kX2xpbmU6JWQgbGluZW51bTolZCIsCisJCQlzZWRfY21kLT5jbWQsIG1hdGNoZWQsIHNlZF9jbWQtPmJlZ19saW5lLCBzZWRfY21kLT5lbmRfbGluZSwgbGluZW51bSk7CisKKwkJLyogSXMgdGhpcyBsaW5lIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbWF0Y2g/ICovCisKKwkJaWYgKG1hdGNoZWQpIHsKKwkJCWlmIChzZWRfY21kLT5lbmRfbGluZSA8PSAtMikgeworCQkJCS8qIGFkZHJlc3MyIGlzICtOLCBpLmUuIE4gbGluZXMgZnJvbSBiZWdfbGluZSAqLworCQkJCXNlZF9jbWQtPmVuZF9saW5lID0gbGluZW51bSArICgtc2VkX2NtZC0+ZW5kX2xpbmUgLSAyKTsKKwkJCX0KKwkJCS8qIG9uY2UgbWF0Y2hlZCwgIm4seHh4IiByYW5nZSBpcyBkZWFkLCBkaXNhYmxpbmcgaXQgKi8KKwkJCWlmIChzZWRfY21kLT5iZWdfbGluZSA+IDApIHsKKwkJCQlzZWRfY21kLT5iZWdfbGluZSA9IC0yOworCQkJfQorCQkJZGJnKCJlbmQxOiVkIiwgc2VkX2NtZC0+ZW5kX2xpbmUgPyBzZWRfY21kLT5lbmRfbGluZSA9PSAtMQorCQkJCQkJPyAhbmV4dF9saW5lIDogKHNlZF9jbWQtPmVuZF9saW5lIDw9IGxpbmVudW0pCisJCQkJCTogIXNlZF9jbWQtPmVuZF9tYXRjaCk7CisJCQlkYmcoImVuZDI6JWQiLCBzZWRfY21kLT5lbmRfbWF0Y2ggJiYgb2xkX21hdGNoZWQKKwkJCQkJJiYgIXJlZ2V4ZWMoc2VkX2NtZC0+ZW5kX21hdGNoLHBhdHRlcm5fc3BhY2UsIDAsIE5VTEwsIDApKTsKKwkJCXNlZF9jbWQtPmluX21hdGNoID0gISgKKwkJCQkvKiBoYXMgdGhlIGVuZGluZyBsaW5lIGNvbWUsIG9yIGlzIHRoaXMgYSBzaW5nbGUgYWRkcmVzcyBjb21tYW5kPyAqLworCQkJCShzZWRfY21kLT5lbmRfbGluZQorCQkJCQk/IHNlZF9jbWQtPmVuZF9saW5lID09IC0xCisJCQkJCQk/ICFuZXh0X2xpbmUKKwkJCQkJCTogKHNlZF9jbWQtPmVuZF9saW5lIDw9IGxpbmVudW0pCisJCQkJCTogIXNlZF9jbWQtPmVuZF9tYXRjaAorCQkJCSkKKwkJCQkvKiBvciBkb2VzIHRoaXMgbGluZSBtYXRjaGVzIG91ciBsYXN0IGFkZHJlc3MgcmVnZXggKi8KKwkJCQl8fCAoc2VkX2NtZC0+ZW5kX21hdGNoICYmIG9sZF9tYXRjaGVkCisJCQkJICAgICAmJiAocmVnZXhlYyhzZWRfY21kLT5lbmRfbWF0Y2gsCisJCQkJCQlwYXR0ZXJuX3NwYWNlLCAwLCBOVUxMLCAwKSA9PSAwKQorCQkJCSkKKwkJCSk7CisJCX0KKworCQkvKiBTa2lwIGJsb2NrcyBvZiBjb21tYW5kcyB3ZSBkaWRuJ3QgbWF0Y2ggKi8KKwkJaWYgKHNlZF9jbWQtPmNtZCA9PSAneycpIHsKKwkJCWlmIChzZWRfY21kLT5pbnZlcnQgPyBtYXRjaGVkIDogIW1hdGNoZWQpIHsKKwkJCQl1bnNpZ25lZCBuZXN0X2NudCA9IDA7CisJCQkJd2hpbGUgKDEpIHsKKwkJCQkJaWYgKHNlZF9jbWQtPmNtZCA9PSAneycpCisJCQkJCQluZXN0X2NudCsrOworCQkJCQlpZiAoc2VkX2NtZC0+Y21kID09ICd9JykgeworCQkJCQkJbmVzdF9jbnQtLTsKKwkJCQkJCWlmIChuZXN0X2NudCA9PSAwKQorCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCXNlZF9jbWQgPSBzZWRfY21kLT5uZXh0OworCQkJCQlpZiAoIXNlZF9jbWQpCisJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW50ZXJtaW5hdGVkIHsiKTsKKwkJCQl9CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIE9rYXksIHNvIGRpZCB0aGlzIGxpbmUgbWF0Y2g/ICovCisJCWlmIChzZWRfY21kLT5pbnZlcnQgPyBtYXRjaGVkIDogIW1hdGNoZWQpCisJCQljb250aW51ZTsgLyogbm8gKi8KKworCQkvKiBVcGRhdGUgbGFzdCB1c2VkIHJlZ2V4IGluIGNhc2UgYSBibGFuayBzdWJzdGl0dXRlIEJSRSBpcyBmb3VuZCAqLworCQlpZiAoc2VkX2NtZC0+YmVnX21hdGNoKSB7CisJCQlHLnByZXZpb3VzX3JlZ2V4X3B0ciA9IHNlZF9jbWQtPmJlZ19tYXRjaDsKKwkJfQorCisJCS8qIGFjdHVhbCBzZWRkaW5nICovCisJCWRiZygicGF0dGVybl9zcGFjZTonJXMnIG5leHRfbGluZTonJXMnIGNtZDolYyIsCisJCQkJcGF0dGVybl9zcGFjZSwgbmV4dF9saW5lLCBzZWRfY21kLT5jbWQpOworCQlzd2l0Y2ggKHNlZF9jbWQtPmNtZCkgeworCisJCS8qIFByaW50IGxpbmUgbnVtYmVyICovCisJCWNhc2UgJz0nOgorCQkJZnByaW50ZihHLm5vbnN0ZG91dCwgIiVkXG4iLCBsaW5lbnVtKTsKKwkJCWJyZWFrOworCisJCS8qIFdyaXRlIHRoZSBjdXJyZW50IHBhdHRlcm4gc3BhY2UgdXAgdG8gdGhlIGZpcnN0IG5ld2xpbmUgKi8KKwkJY2FzZSAnUCc6CisJCXsKKwkJCWNoYXIgKnRtcCA9IHN0cmNocihwYXR0ZXJuX3NwYWNlLCAnXG4nKTsKKwkJCWlmICh0bXApIHsKKwkJCQkqdG1wID0gJ1wwJzsKKwkJCQkvKiBUT0RPOiBleHBsYWluIHdoeSAnXG4nIGJlbG93ICovCisJCQkJc2VkX3B1dHMocGF0dGVybl9zcGFjZSwgJ1xuJyk7CisJCQkJKnRtcCA9ICdcbic7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBGYWxsIFRocm91Z2ggKi8KKwkJfQorCisJCS8qIFdyaXRlIHRoZSBjdXJyZW50IHBhdHRlcm4gc3BhY2UgdG8gb3V0cHV0ICovCisJCWNhc2UgJ3AnOgorCQkJLyogTkI6IHdlIHByaW50IHRoaXMgX2JlZm9yZV8gdGhlIGxhc3QgbGluZQorCQkJICogKG9mIGN1cnJlbnQgZmlsZSkgaXMgcHJpbnRlZC4gRXZlbiBpZgorCQkJICogdGhhdCBsaW5lIGlzIG5vbnRlcm1pbmF0ZWQsIHdlIHByaW50CisJCQkgKiAnXG4nIGhlcmUgKGdudSBzZWQgZG9lcyB0aGUgc2FtZSkgKi8KKwkJCXNlZF9wdXRzKHBhdHRlcm5fc3BhY2UsICdcbicpOworCQkJYnJlYWs7CisJCS8qIERlbGV0ZSB1cCB0aHJvdWdoIGZpcnN0IG5ld2xpbmUgKi8KKwkJY2FzZSAnRCc6CisJCXsKKwkJCWNoYXIgKnRtcCA9IHN0cmNocihwYXR0ZXJuX3NwYWNlLCAnXG4nKTsKKwkJCWlmICh0bXApIHsKKwkJCQlvdmVybGFwcGluZ19zdHJjcHkocGF0dGVybl9zcGFjZSwgdG1wICsgMSk7CisJCQkJZ290byByZXN0YXJ0OworCQkJfQorCQl9CisJCS8qIGRpc2NhcmQgdGhpcyBsaW5lLiAqLworCQljYXNlICdkJzoKKwkJCWdvdG8gZGlzY2FyZF9saW5lOworCisJCS8qIFN1YnN0aXR1dGUgd2l0aCByZWdleCAqLworCQljYXNlICdzJzoKKwkJCWlmICghZG9fc3Vic3RfY29tbWFuZChzZWRfY21kLCAmcGF0dGVybl9zcGFjZSkpCisJCQkJYnJlYWs7CisJCQlkYmcoImRvX3N1YnN0X2NvbW1hbmQgc3VjY2VlZGVkOiclcyciLCBwYXR0ZXJuX3NwYWNlKTsKKwkJCXN1YnN0aXR1dGVkIHw9IDE7CisKKwkJCS8qIGhhbmRsZSBwIG9wdGlvbiAqLworCQkJaWYgKHNlZF9jbWQtPnN1Yl9wKQorCQkJCXNlZF9wdXRzKHBhdHRlcm5fc3BhY2UsIGxhc3RfZ2V0c19jaGFyKTsKKwkJCS8qIGhhbmRsZSB3IG9wdGlvbiAqLworCQkJaWYgKHNlZF9jbWQtPnN3X2ZpbGUpCisJCQkJcHV0c19tYXliZV9uZXdsaW5lKAorCQkJCQlwYXR0ZXJuX3NwYWNlLCBzZWRfY21kLT5zd19maWxlLAorCQkJCQkmc2VkX2NtZC0+c3dfbGFzdF9jaGFyLCBsYXN0X2dldHNfY2hhcik7CisJCQlicmVhazsKKworCQkvKiBBcHBlbmQgbGluZSB0byBsaW5rZWQgbGlzdCB0byBiZSBwcmludGVkIGxhdGVyICovCisJCWNhc2UgJ2EnOgorCQkJYXBwZW5kKHhzdHJkdXAoc2VkX2NtZC0+c3RyaW5nKSk7CisJCQlicmVhazsKKworCQkvKiBJbnNlcnQgdGV4dCBiZWZvcmUgdGhpcyBsaW5lICovCisJCWNhc2UgJ2knOgorCQkJc2VkX3B1dHMoc2VkX2NtZC0+c3RyaW5nLCAnXG4nKTsKKwkJCWJyZWFrOworCisJCS8qIEN1dCBhbmQgcGFzdGUgdGV4dCAocmVwbGFjZSkgKi8KKwkJY2FzZSAnYyc6CisJCQkvKiBPbmx5IHRyaWdnZXJzIG9uIGxhc3QgbGluZSBvZiBhIG1hdGNoaW5nIHJhbmdlLiAqLworCQkJaWYgKCFzZWRfY21kLT5pbl9tYXRjaCkKKwkJCQlzZWRfcHV0cyhzZWRfY21kLT5zdHJpbmcsICdcbicpOworCQkJZ290byBkaXNjYXJkX2xpbmU7CisKKwkJLyogUmVhZCBmaWxlLCBhcHBlbmQgY29udGVudHMgdG8gb3V0cHV0ICovCisJCWNhc2UgJ3InOgorCQl7CisJCQlGSUxFICpyZmlsZTsKKwkJCXJmaWxlID0gZm9wZW5fZm9yX3JlYWQoc2VkX2NtZC0+c3RyaW5nKTsKKwkJCWlmIChyZmlsZSkgeworCQkJCWNoYXIgKmxpbmU7CisJCQkJd2hpbGUgKChsaW5lID0geG1hbGxvY19mZ2V0bGluZShyZmlsZSkpCisJCQkJCQkhPSBOVUxMKQorCQkJCQlhcHBlbmQobGluZSk7CisJCQkJZmNsb3NlKHJmaWxlKTsKKwkJCX0KKworCQkJYnJlYWs7CisJCX0KKworCQkvKiBXcml0ZSBwYXR0ZXJuIHNwYWNlIHRvIGZpbGUuICovCisJCWNhc2UgJ3cnOgorCQkJcHV0c19tYXliZV9uZXdsaW5lKAorCQkJCXBhdHRlcm5fc3BhY2UsIHNlZF9jbWQtPnN3X2ZpbGUsCisJCQkJJnNlZF9jbWQtPnN3X2xhc3RfY2hhciwgbGFzdF9nZXRzX2NoYXIpOworCQkJYnJlYWs7CisKKwkJLyogUmVhZCBuZXh0IGxpbmUgZnJvbSBpbnB1dCAqLworCQljYXNlICduJzoKKwkJCWlmICghRy5iZV9xdWlldCkKKwkJCQlzZWRfcHV0cyhwYXR0ZXJuX3NwYWNlLCBsYXN0X2dldHNfY2hhcik7CisJCQlpZiAobmV4dF9saW5lKSB7CisJCQkJZnJlZShwYXR0ZXJuX3NwYWNlKTsKKwkJCQlwYXR0ZXJuX3NwYWNlID0gbmV4dF9saW5lOworCQkJCWxhc3RfZ2V0c19jaGFyID0gbmV4dF9nZXRzX2NoYXI7CisJCQkJbmV4dF9saW5lID0gZ2V0X25leHRfbGluZSgmbmV4dF9nZXRzX2NoYXIsICZsYXN0X3B1dHNfY2hhciwgbGFzdF9nZXRzX2NoYXIpOworCQkJCXN1YnN0aXR1dGVkID0gMDsKKwkJCQlsaW5lbnVtKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKworCQkvKiBRdWl0LiAgRW5kIG9mIHNjcmlwdCwgZW5kIG9mIGlucHV0LiAqLworCQljYXNlICdxJzoKKwkJCS8qIEV4aXQgdGhlIG91dGVyIHdoaWxlIGxvb3AgKi8KKwkJCWZyZWUobmV4dF9saW5lKTsKKwkJCW5leHRfbGluZSA9IE5VTEw7CisJCQlnb3RvIGRpc2NhcmRfY29tbWFuZHM7CisKKwkJLyogQXBwZW5kIHRoZSBuZXh0IGxpbmUgdG8gdGhlIGN1cnJlbnQgbGluZSAqLworCQljYXNlICdOJzoKKwkJeworCQkJaW50IGxlbjsKKwkJCS8qIElmIG5vIG5leHQgbGluZSwganVtcCB0byBlbmQgb2Ygc2NyaXB0IGFuZCBleGl0LiAqLworCQkJLyogaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL3NlZC9tYW51YWwvc2VkLmh0bWw6CisJCQkgKiAiTW9zdCB2ZXJzaW9ucyBvZiBzZWQgZXhpdCB3aXRob3V0IHByaW50aW5nIGFueXRoaW5nCisJCQkgKiB3aGVuIHRoZSBOIGNvbW1hbmQgaXMgaXNzdWVkIG9uIHRoZSBsYXN0IGxpbmUgb2YKKwkJCSAqIGEgZmlsZS4gR05VIHNlZCBwcmludHMgcGF0dGVybiBzcGFjZSBiZWZvcmUgZXhpdGluZworCQkJICogdW5sZXNzIG9mIGNvdXJzZSB0aGUgLW4gY29tbWFuZCBzd2l0Y2ggaGFzIGJlZW4KKwkJCSAqIHNwZWNpZmllZC4gVGhpcyBjaG9pY2UgaXMgYnkgZGVzaWduLiIKKwkJCSAqLworCQkJaWYgKG5leHRfbGluZSA9PSBOVUxMKSB7CisJCQkJLy9nb3RvIGRpc2NhcmRfbGluZTsKKwkJCQlnb3RvIGRpc2NhcmRfY29tbWFuZHM7IC8qIEdOVSBiZWhhdmlvciAqLworCQkJfQorCQkJLyogQXBwZW5kIG5leHRfbGluZSwgcmVhZCBuZXcgbmV4dF9saW5lLiAqLworCQkJbGVuID0gc3RybGVuKHBhdHRlcm5fc3BhY2UpOworCQkJcGF0dGVybl9zcGFjZSA9IHhyZWFsbG9jKHBhdHRlcm5fc3BhY2UsIGxlbiArIHN0cmxlbihuZXh0X2xpbmUpICsgMik7CisJCQlwYXR0ZXJuX3NwYWNlW2xlbl0gPSAnXG4nOworCQkJc3RyY3B5KHBhdHRlcm5fc3BhY2UgKyBsZW4rMSwgbmV4dF9saW5lKTsKKwkJCWxhc3RfZ2V0c19jaGFyID0gbmV4dF9nZXRzX2NoYXI7CisJCQluZXh0X2xpbmUgPSBnZXRfbmV4dF9saW5lKCZuZXh0X2dldHNfY2hhciwgJmxhc3RfcHV0c19jaGFyLCBsYXN0X2dldHNfY2hhcik7CisJCQlsaW5lbnVtKys7CisJCQlicmVhazsKKwkJfQorCisJCS8qIFRlc3QvYnJhbmNoIGlmIHN1YnN0aXR1dGlvbiBvY2N1cnJlZCAqLworCQljYXNlICd0JzoKKwkJCWlmICghc3Vic3RpdHV0ZWQpIGJyZWFrOworCQkJc3Vic3RpdHV0ZWQgPSAwOworCQkJLyogRmFsbCB0aHJvdWdoICovCisJCS8qIFRlc3QvYnJhbmNoIGlmIHN1YnN0aXR1dGlvbiBkaWRuJ3Qgb2NjdXIgKi8KKwkJY2FzZSAnVCc6CisJCQlpZiAoc3Vic3RpdHV0ZWQpIGJyZWFrOworCQkJLyogRmFsbCB0aHJvdWdoICovCisJCS8qIEJyYW5jaCB0byBsYWJlbCAqLworCQljYXNlICdiJzoKKwkJCWlmICghc2VkX2NtZC0+c3RyaW5nKSBnb3RvIGRpc2NhcmRfY29tbWFuZHM7CisJCQllbHNlIHNlZF9jbWQgPSBicmFuY2hfdG8oc2VkX2NtZC0+c3RyaW5nKTsKKwkJCWJyZWFrOworCQkvKiBUcmFuc2xpdGVyYXRlIGNoYXJhY3RlcnMgKi8KKwkJY2FzZSAneSc6CisJCXsKKwkJCWludCBpLCBqOworCQkJZm9yIChpID0gMDsgcGF0dGVybl9zcGFjZVtpXTsgaSsrKSB7CisJCQkJZm9yIChqID0gMDsgc2VkX2NtZC0+c3RyaW5nW2pdOyBqICs9IDIpIHsKKwkJCQkJaWYgKHBhdHRlcm5fc3BhY2VbaV0gPT0gc2VkX2NtZC0+c3RyaW5nW2pdKSB7CisJCQkJCQlwYXR0ZXJuX3NwYWNlW2ldID0gc2VkX2NtZC0+c3RyaW5nW2ogKyAxXTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlicmVhazsKKwkJfQorCQljYXNlICdnJzoJLyogUmVwbGFjZSBwYXR0ZXJuIHNwYWNlIHdpdGggaG9sZCBzcGFjZSAqLworCQkJZnJlZShwYXR0ZXJuX3NwYWNlKTsKKwkJCXBhdHRlcm5fc3BhY2UgPSB4c3RyZHVwKEcuaG9sZF9zcGFjZSA/IEcuaG9sZF9zcGFjZSA6ICIiKTsKKwkJCWJyZWFrOworCQljYXNlICdHJzoJLyogQXBwZW5kIG5ld2xpbmUgYW5kIGhvbGQgc3BhY2UgdG8gcGF0dGVybiBzcGFjZSAqLworCQl7CisJCQlpbnQgcGF0dGVybl9zcGFjZV9zaXplID0gMjsKKwkJCWludCBob2xkX3NwYWNlX3NpemUgPSAwOworCisJCQlpZiAocGF0dGVybl9zcGFjZSkKKwkJCQlwYXR0ZXJuX3NwYWNlX3NpemUgKz0gc3RybGVuKHBhdHRlcm5fc3BhY2UpOworCQkJaWYgKEcuaG9sZF9zcGFjZSkKKwkJCQlob2xkX3NwYWNlX3NpemUgPSBzdHJsZW4oRy5ob2xkX3NwYWNlKTsKKwkJCXBhdHRlcm5fc3BhY2UgPSB4cmVhbGxvYyhwYXR0ZXJuX3NwYWNlLAorCQkJCQlwYXR0ZXJuX3NwYWNlX3NpemUgKyBob2xkX3NwYWNlX3NpemUpOworCQkJaWYgKHBhdHRlcm5fc3BhY2Vfc2l6ZSA9PSAyKQorCQkJCXBhdHRlcm5fc3BhY2VbMF0gPSAwOworCQkJc3RyY2F0KHBhdHRlcm5fc3BhY2UsICJcbiIpOworCQkJaWYgKEcuaG9sZF9zcGFjZSkKKwkJCQlzdHJjYXQocGF0dGVybl9zcGFjZSwgRy5ob2xkX3NwYWNlKTsKKwkJCWxhc3RfZ2V0c19jaGFyID0gJ1xuJzsKKworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAnaCc6CS8qIFJlcGxhY2UgaG9sZCBzcGFjZSB3aXRoIHBhdHRlcm4gc3BhY2UgKi8KKwkJCWZyZWUoRy5ob2xkX3NwYWNlKTsKKwkJCUcuaG9sZF9zcGFjZSA9IHhzdHJkdXAocGF0dGVybl9zcGFjZSk7CisJCQlicmVhazsKKwkJY2FzZSAnSCc6CS8qIEFwcGVuZCBuZXdsaW5lIGFuZCBwYXR0ZXJuIHNwYWNlIHRvIGhvbGQgc3BhY2UgKi8KKwkJeworCQkJaW50IGhvbGRfc3BhY2Vfc2l6ZSA9IDI7CisJCQlpbnQgcGF0dGVybl9zcGFjZV9zaXplID0gMDsKKworCQkJaWYgKEcuaG9sZF9zcGFjZSkKKwkJCQlob2xkX3NwYWNlX3NpemUgKz0gc3RybGVuKEcuaG9sZF9zcGFjZSk7CisJCQlpZiAocGF0dGVybl9zcGFjZSkKKwkJCQlwYXR0ZXJuX3NwYWNlX3NpemUgPSBzdHJsZW4ocGF0dGVybl9zcGFjZSk7CisJCQlHLmhvbGRfc3BhY2UgPSB4cmVhbGxvYyhHLmhvbGRfc3BhY2UsCisJCQkJCWhvbGRfc3BhY2Vfc2l6ZSArIHBhdHRlcm5fc3BhY2Vfc2l6ZSk7CisKKwkJCWlmIChob2xkX3NwYWNlX3NpemUgPT0gMikKKwkJCQkqRy5ob2xkX3NwYWNlID0gMDsKKwkJCXN0cmNhdChHLmhvbGRfc3BhY2UsICJcbiIpOworCQkJaWYgKHBhdHRlcm5fc3BhY2UpCisJCQkJc3RyY2F0KEcuaG9sZF9zcGFjZSwgcGF0dGVybl9zcGFjZSk7CisKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgJ3gnOiAvKiBFeGNoYW5nZSBob2xkIGFuZCBwYXR0ZXJuIHNwYWNlICovCisJCXsKKwkJCWNoYXIgKnRtcCA9IHBhdHRlcm5fc3BhY2U7CisJCQlwYXR0ZXJuX3NwYWNlID0gRy5ob2xkX3NwYWNlID8gRy5ob2xkX3NwYWNlIDogeHphbGxvYygxKTsKKwkJCWxhc3RfZ2V0c19jaGFyID0gJ1xuJzsKKwkJCUcuaG9sZF9zcGFjZSA9IHRtcDsKKwkJCWJyZWFrOworCQl9CisJCX0gLyogc3dpdGNoICovCisJfSAvKiBmb3IgZWFjaCBjbWQgKi8KKworCS8qCisJICogRXhpdCBwb2ludCBmcm9tIHNlZGRpbmcuLi4KKwkgKi8KKyBkaXNjYXJkX2NvbW1hbmRzOgorCS8qIHdlIHdpbGwgcHJpbnQgdGhlIGxpbmUgdW5sZXNzIHdlIHdlcmUgdG9sZCB0byBiZSBxdWlldCAoJy1uJykKKwkgICBvciBpZiB0aGUgbGluZSB3YXMgc3VwcHJlc3NlZCAoYWxhICdkJ2VsZXRlKSAqLworCWlmICghRy5iZV9xdWlldCkKKwkJc2VkX3B1dHMocGF0dGVybl9zcGFjZSwgbGFzdF9nZXRzX2NoYXIpOworCisJLyogRGVsZXRlIGFuZCBzdWNoIGp1bXAgaGVyZS4gKi8KKyBkaXNjYXJkX2xpbmU6CisJZmx1c2hfYXBwZW5kKCZsYXN0X3B1dHNfY2hhciwgbGFzdF9nZXRzX2NoYXIpOworCWZyZWUocGF0dGVybl9zcGFjZSk7CisKKwlnb3RvIGFnYWluOworfQorCisvKiBJdCBpcyBwb3NzaWJsZSB0byBoYXZlIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHdpdGggZW1iZWRkZWQKKyAqIG5ld2xpbmVzLiAgVGhpcyBjb3VudHMgYXMgbXVsdGlwbGUgY29tbWFuZCBsaW5lcy4KKyAqIEhvd2V2ZXIsIG5ld2xpbmUgY2FuIGJlIGVzY2FwZWQ6ICdzL2Uvelw8bmV3bGluZT56LycKKyAqIGFkZF9jbWQoKSBoYW5kbGVzIHRoaXMuCisgKi8KKworc3RhdGljIHZvaWQgYWRkX2NtZF9ibG9jayhjaGFyICpjbWRzdHIpCit7CisJY2hhciAqc3YsICplb2w7CisKKwljbWRzdHIgPSBzdiA9IHhzdHJkdXAoY21kc3RyKTsKKwlkbyB7CisJCWVvbCA9IHN0cmNocihjbWRzdHIsICdcbicpOworCQlpZiAoZW9sKQorCQkJKmVvbCA9ICdcMCc7CisJCWFkZF9jbWQoY21kc3RyKTsKKwkJY21kc3RyID0gZW9sICsgMTsKKwl9IHdoaWxlIChlb2wpOworCWZyZWUoc3YpOworfQorCitpbnQgc2VkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZWRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIG9wdDsKKwlsbGlzdF90ICpvcHRfZSwgKm9wdF9mOworCWNoYXIgKm9wdF9pOworCisjaWYgRU5BQkxFX0xPTkdfT1BUUworCXN0YXRpYyBjb25zdCBjaGFyIHNlZF9sb25nb3B0c1tdIEFMSUdOMSA9CisJCS8qIG5hbWUgICAgICAgICAgICAgaGFzX2FyZyAgICAgICAgICAgICBzaG9ydCAqLworCQkiaW4tcGxhY2VcMCIgICAgICAgIE9wdGlvbmFsX2FyZ3VtZW50ICAgImkiCisJCSJyZWdleHAtZXh0ZW5kZWRcMCIgTm9fYXJndW1lbnQgICAgICAgICAiciIKKwkJInF1aWV0XDAiICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAgICJuIgorCQkic2lsZW50XDAiICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICAgIm4iCisJCSJleHByZXNzaW9uXDAiICAgICAgUmVxdWlyZWRfYXJndW1lbnQgICAiZSIKKwkJImZpbGVcMCIgICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAgICJmIjsKKyNlbmRpZgorCisJSU5JVF9HKCk7CisKKwkvKiBkZXN0cm95IGNvbW1hbmQgc3RyaW5ncyBvbiBleGl0ICovCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBhdGV4aXQoc2VkX2ZyZWVfYW5kX2Nsb3NlX3N0dWZmKTsKKworCS8qIExpZSB0byBhdXRvY29uZiB3aGVuIGl0IHN0YXJ0cyBhc2tpbmcgc3R1cGlkIHF1ZXN0aW9ucy4gKi8KKwlpZiAoYXJndlsxXSAmJiBzdHJjbXAoYXJndlsxXSwgIi0tdmVyc2lvbiIpID09IDApIHsKKwkJcHV0cygiVGhpcyBpcyBub3QgR05VIHNlZCB2ZXJzaW9uIDQuMCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBkbyBub3JtYWwgb3B0aW9uIHBhcnNpbmcgKi8KKwlvcHRfZSA9IG9wdF9mID0gTlVMTDsKKwlvcHRfaSA9IE5VTEw7CisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiZTo6Zjo6IiAvKiBjYW4gb2NjdXIgbXVsdGlwbGUgdGltZXMgKi8KKwkgICAgICAgICAgICAgICAgICAgICJubiI7IC8qIGNvdW50IC1uICovCisKKwlJRl9MT05HX09QVFMoYXBwbGV0X2xvbmdfb3B0aW9ucyA9IHNlZF9sb25nb3B0cyk7CisKKwkvKiAtaSBtdXN0IGJlIGZpcnN0LCB0byBtYXRjaCBPUFRfaW5fcGxhY2UgZGVmaW5pdGlvbiAqLworCS8qIC1FIGlzIGEgc3lub255bSBvZiAtcjoKKwkgKiBHTlUgc2VkIDQuMi4xIG1lbnRpb25zIGl0IGluIG5laXRoZXIgLS1oZWxwCisJICogbm9yIG1hbnBhZ2UsIGJ1dCBkb2VzIHJlY29nbml6ZSBpdC4KKwkgKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiaTo6ckVuZTpmOiIsICZvcHRfaSwgJm9wdF9lLCAmb3B0X2YsCisJCQkgICAgJkcuYmVfcXVpZXQpOyAvKiBjb3VudGVyIGZvciAtbiAqLworCS8vYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKG9wdCAmIE9QVF9pbl9wbGFjZSkgeyAvLyAtaQorCQlhdGV4aXQoY2xlYW51cF9vdXRuYW1lKTsKKwl9CisJaWYgKG9wdCAmICgyfDQpKQorCQlHLnJlZ2V4X3R5cGUgfD0gUkVHX0VYVEVOREVEOyAvLyAtciBvciAtRQorCS8vaWYgKG9wdCAmIDgpCisJLy8JRy5iZV9xdWlldCsrOyAvLyAtbiAoaW1wbGVtZW50ZWQgd2l0aCBhIGNvdW50ZXIgaW5zdGVhZCkKKwl3aGlsZSAob3B0X2UpIHsgLy8gLWUKKwkJYWRkX2NtZF9ibG9jayhsbGlzdF9wb3AoJm9wdF9lKSk7CisJfQorCXdoaWxlIChvcHRfZikgeyAvLyAtZgorCQljaGFyICpsaW5lOworCQlGSUxFICpjbWRmaWxlOworCQljbWRmaWxlID0geGZvcGVuX2Zvcl9yZWFkKGxsaXN0X3BvcCgmb3B0X2YpKTsKKwkJd2hpbGUgKChsaW5lID0geG1hbGxvY19mZ2V0bGluZShjbWRmaWxlKSkgIT0gTlVMTCkgeworCQkJYWRkX2NtZChsaW5lKTsKKwkJCWZyZWUobGluZSk7CisJCX0KKwkJZmNsb3NlKGNtZGZpbGUpOworCX0KKwkvKiBpZiB3ZSBkaWRuJ3QgZ2V0IGEgcGF0dGVybiBmcm9tIC1lIG9yIC1mLCB1c2UgYXJndlswXSAqLworCWlmICghKG9wdCAmIDB4MzApKSB7CisJCWlmICghKmFyZ3YpCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWFkZF9jbWRfYmxvY2soKmFyZ3YrKyk7CisJfQorCS8qIEZsdXNoIGFueSB1bmZpbmlzaGVkIGNvbW1hbmRzLiAqLworCWFkZF9jbWQoIiIpOworCisJLyogQnkgZGVmYXVsdCwgd2Ugd3JpdGUgdG8gc3Rkb3V0ICovCisJRy5ub25zdGRvdXQgPSBzdGRvdXQ7CisKKwkvKiBhcmd2WzAuLihhcmdjLTEpXSBzaG91bGQgYmUgbmFtZXMgb2YgZmlsZSB0byBwcm9jZXNzLiBJZiBubworCSAqIGZpbGVzIHdlcmUgc3BlY2lmaWVkIG9yICctJyB3YXMgc3BlY2lmaWVkLCB0YWtlIGlucHV0IGZyb20gc3RkaW4uCisJICogT3RoZXJ3aXNlLCB3ZSBwcm9jZXNzIGFsbCB0aGUgZmlsZXMgc3BlY2lmaWVkLiAqLworCUcuaW5wdXRfZmlsZV9saXN0ID0gYXJndjsKKwlpZiAoIWFyZ3ZbMF0pIHsKKwkJaWYgKG9wdCAmIE9QVF9pbl9wbGFjZSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZXF1aXJlc19hcmcsICItaSIpOworCQlhcmd2WzBdID0gKGNoYXIqKWJiX21zZ19zdGFuZGFyZF9pbnB1dDsKKwkJLyogRy5sYXN0X2lucHV0X2ZpbGUgPSAwOyAtIGFscmVhZHkgaXMgKi8KKwl9IGVsc2UgeworCQlnb3RvIHN0YXJ0OworCisJCWZvciAoOyAqYXJndjsgYXJndisrKSB7CisJCQlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCQkJaW50IG5vbnN0ZG91dGZkOworCQkJc2VkX2NtZF90ICpzZWRfY21kOworCisJCQlHLmxhc3RfaW5wdXRfZmlsZSsrOworIHN0YXJ0OgorCQkJaWYgKCEob3B0ICYgT1BUX2luX3BsYWNlKSkgeworCQkJCWlmIChMT05FX0RBU0goKmFyZ3YpKSB7CisJCQkJCSphcmd2ID0gKGNoYXIqKWJiX21zZ19zdGFuZGFyZF9pbnB1dDsKKwkJCQkJcHJvY2Vzc19maWxlcygpOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLyogLWk6IHByb2Nlc3MgZWFjaCBGSUxFIHNlcGFyYXRlbHk6ICovCisKKwkJCWlmIChzdGF0KCphcmd2LCAmc3RhdGJ1ZikgIT0gMCkgeworCQkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKCphcmd2KTsKKwkJCQlHLmV4aXRjb2RlID0gRVhJVF9GQUlMVVJFOworCQkJCUcuY3VycmVudF9pbnB1dF9maWxlKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlHLm91dG5hbWUgPSB4YXNwcmludGYoIiVzWFhYWFhYIiwgKmFyZ3YpOworCQkJbm9uc3Rkb3V0ZmQgPSB4bWtzdGVtcChHLm91dG5hbWUpOworCQkJRy5ub25zdGRvdXQgPSB4ZmRvcGVuX2Zvcl93cml0ZShub25zdGRvdXRmZCk7CisJCQkvKiBTZXQgcGVybWlzc2lvbnMvb3duZXIgb2Ygb3V0cHV0IGZpbGUgKi8KKwkJCS8qIGNobW9kJ2luZyBBRlRFUiBjaG93biB3b3VsZCBwcmVzZXJ2ZSBzdWlkL3NnaWQgYml0cywKKwkJCSAqIGJ1dCBHTlUgc2VkIDQuMi4xIGRvZXMgbm90IHByZXNlcnZlIHRoZW0gZWl0aGVyICovCisJCQlmY2htb2Qobm9uc3Rkb3V0ZmQsIHN0YXRidWYuc3RfbW9kZSk7CisJCQlmY2hvd24obm9uc3Rkb3V0ZmQsIHN0YXRidWYuc3RfdWlkLCBzdGF0YnVmLnN0X2dpZCk7CisKKwkJCXByb2Nlc3NfZmlsZXMoKTsKKwkJCWZjbG9zZShHLm5vbnN0ZG91dCk7CisJCQlHLm5vbnN0ZG91dCA9IHN0ZG91dDsKKworCQkJaWYgKG9wdF9pKSB7CisJCQkJY2hhciAqYmFja3VwbmFtZSA9IHhhc3ByaW50ZigiJXMlcyIsICphcmd2LCBvcHRfaSk7CisJCQkJeHJlbmFtZSgqYXJndiwgYmFja3VwbmFtZSk7CisJCQkJZnJlZShiYWNrdXBuYW1lKTsKKwkJCX0KKwkJCS8qIGVsc2UgdW5saW5rKCphcmd2KTsgLSByZW5hbWUgYmVsb3cgZG9lcyB0aGlzICovCisJCQl4cmVuYW1lKEcub3V0bmFtZSwgKmFyZ3YpOyAvL1RPRE86IHJvbGxiYWNrIGJhY2t1cCBvbiBlcnJvcj8KKwkJCWZyZWUoRy5vdXRuYW1lKTsKKwkJCUcub3V0bmFtZSA9IE5VTEw7CisKKwkJCS8qIEZpeCBkaXNhYmxlZCByYW5nZSBtYXRjaGVzIGFuZCBtYW5nbGVkICIsK04iIHJhbmdlcyAqLworCQkJZm9yIChzZWRfY21kID0gRy5zZWRfY21kX2hlYWQ7IHNlZF9jbWQ7IHNlZF9jbWQgPSBzZWRfY21kLT5uZXh0KSB7CisJCQkJc2VkX2NtZC0+YmVnX2xpbmUgPSBzZWRfY21kLT5iZWdfbGluZV9vcmlnOworCQkJCXNlZF9jbWQtPmVuZF9saW5lID0gc2VkX2NtZC0+ZW5kX2xpbmVfb3JpZzsKKwkJCX0KKwkJfQorCQkvKiBIZXJlLCB0byBoYW5kbGUgInNlZCAnY21kcycgbm9uZXhpc3RlbnRfZmlsZSIgY2FzZSB3ZSBkaWQ6CisJCSAqIGlmIChHLmN1cnJlbnRfaW5wdXRfZmlsZVtHLmN1cnJlbnRfaW5wdXRfZmlsZV0gPT0gTlVMTCkKKwkJICoJcmV0dXJuIEcuZXhpdGNvZGU7CisJCSAqIGJ1dCBpdCdzIG5vdCBuZWVkZWQgc2luY2UgcHJvY2Vzc19maWxlcygpIHdvcmtzIGNvcnJlY3RseQorCQkgKiBpbiB0aGlzIGNhc2UgdG9vLiAqLworCX0KKworCXByb2Nlc3NfZmlsZXMoKTsKKworCXJldHVybiBHLmV4aXRjb2RlOworfQpkaWZmIC0tZ2l0IGEvZWRpdG9ycy9zZWQxbGluZS50eHQgYi9lZGl0b3JzL3NlZDFsaW5lLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWEyZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZWRpdG9ycy9zZWQxbGluZS50eHQKQEAgLTAsMCArMSw0MjUgQEAKK2h0dHA6Ly93d3cuc3R1ZGVudC5ub3J0aHBhcmsuZWR1L3BlbWVudGUvc2VkL3NlZDFsaW5lLnR4dAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorSEFORFkgT05FLUxJTkVSUyBGT1IgU0VEIChVbml4IHN0cmVhbSBlZGl0b3IpICAgICAgICAgICAgICAgQXByLiAyNiwgMjAwNAorY29tcGlsZWQgYnkgRXJpYyBQZW1lbnQgLSBwZW1lbnRlW2F0XW5vcnRocGFya1tkb3RdZWR1ICAgICAgICB2ZXJzaW9uIDUuNAorTGF0ZXN0IHZlcnNpb24gb2YgdGhpcyBmaWxlIGlzIHVzdWFsbHkgYXQ6CisgICBodHRwOi8vc2VkLnNvdXJjZWZvcmdlLm5ldC9zZWQxbGluZS50eHQKKyAgIGh0dHA6Ly93d3cuc3R1ZGVudC5ub3J0aHBhcmsuZWR1L3BlbWVudGUvc2VkL3NlZDFsaW5lLnR4dAorVGhpcyBmaWxlIGlzIGFsc28gYXZhaWxhYmxlIGluIFBvcnR1Z3Vlc2UgYXQ6CisgICBodHRwOi8vd3d3Lmxydi51ZnNjLmJyL3dtYWtlci9zZWRfcHRCUi5odG1sCisKK0ZJTEUgU1BBQ0lORzoKKworICMgZG91YmxlIHNwYWNlIGEgZmlsZQorIHNlZCBHCisKKyAjIGRvdWJsZSBzcGFjZSBhIGZpbGUgd2hpY2ggYWxyZWFkeSBoYXMgYmxhbmsgbGluZXMgaW4gaXQuIE91dHB1dCBmaWxlCisgIyBzaG91bGQgY29udGFpbiBubyBtb3JlIHRoYW4gb25lIGJsYW5rIGxpbmUgYmV0d2VlbiBsaW5lcyBvZiB0ZXh0LgorIHNlZCAnL14kL2Q7RycKKworICMgdHJpcGxlIHNwYWNlIGEgZmlsZQorIHNlZCAnRztHJworCisgIyB1bmRvIGRvdWJsZS1zcGFjaW5nIChhc3N1bWVzIGV2ZW4tbnVtYmVyZWQgbGluZXMgYXJlIGFsd2F5cyBibGFuaykKKyBzZWQgJ247ZCcKKworICMgaW5zZXJ0IGEgYmxhbmsgbGluZSBhYm92ZSBldmVyeSBsaW5lIHdoaWNoIG1hdGNoZXMgInJlZ2V4IgorIHNlZCAnL3JlZ2V4L3t4O3A7eDt9JworCisgIyBpbnNlcnQgYSBibGFuayBsaW5lIGJlbG93IGV2ZXJ5IGxpbmUgd2hpY2ggbWF0Y2hlcyAicmVnZXgiCisgc2VkICcvcmVnZXgvRycKKworICMgaW5zZXJ0IGEgYmxhbmsgbGluZSBhYm92ZSBhbmQgYmVsb3cgZXZlcnkgbGluZSB3aGljaCBtYXRjaGVzICJyZWdleCIKKyBzZWQgJy9yZWdleC97eDtwO3g7Rzt9JworCitOVU1CRVJJTkc6CisKKyAjIG51bWJlciBlYWNoIGxpbmUgb2YgYSBmaWxlIChzaW1wbGUgbGVmdCBhbGlnbm1lbnQpLiBVc2luZyBhIHRhYiAoc2VlCisgIyBub3RlIG9uICdcdCcgYXQgZW5kIG9mIGZpbGUpIGluc3RlYWQgb2Ygc3BhY2Ugd2lsbCBwcmVzZXJ2ZSBtYXJnaW5zLgorIHNlZCA9IGZpbGVuYW1lIHwgc2VkICdOO3MvXG4vXHQvJworCisgIyBudW1iZXIgZWFjaCBsaW5lIG9mIGEgZmlsZSAobnVtYmVyIG9uIGxlZnQsIHJpZ2h0LWFsaWduZWQpCisgc2VkID0gZmlsZW5hbWUgfCBzZWQgJ047IHMvXi8gICAgIC87IHMvICpcKC5cezYsXH1cKVxuL1wxICAvJworCisgIyBudW1iZXIgZWFjaCBsaW5lIG9mIGZpbGUsIGJ1dCBvbmx5IHByaW50IG51bWJlcnMgaWYgbGluZSBpcyBub3QgYmxhbmsKKyBzZWQgJy8uLz0nIGZpbGVuYW1lIHwgc2VkICcvLi9OOyBzL1xuLyAvJworCisgIyBjb3VudCBsaW5lcyAoZW11bGF0ZXMgIndjIC1sIikKKyBzZWQgLW4gJyQ9JworCitURVhUIENPTlZFUlNJT04gQU5EIFNVQlNUSVRVVElPTjoKKworICMgSU4gVU5JWCBFTlZJUk9OTUVOVDogY29udmVydCBET1MgbmV3bGluZXMgKENSL0xGKSB0byBVbml4IGZvcm1hdAorIHNlZCAncy8uJC8vJyAgICAgICAgICAgICAgICMgYXNzdW1lcyB0aGF0IGFsbCBsaW5lcyBlbmQgd2l0aCBDUi9MRgorIHNlZCAncy9eTSQvLycgICAgICAgICAgICAgICMgaW4gYmFzaC90Y3NoLCBwcmVzcyBDdHJsLVYgdGhlbiBDdHJsLU0KKyBzZWQgJ3MvXHgwRCQvLycgICAgICAgICAgICAjIGdzZWQgMy4wMi44MCwgYnV0IHRvcCBzY3JpcHQgaXMgZWFzaWVyCisKKyAjIElOIFVOSVggRU5WSVJPTk1FTlQ6IGNvbnZlcnQgVW5peCBuZXdsaW5lcyAoTEYpIHRvIERPUyBmb3JtYXQKKyBzZWQgInMvJC9gZWNobyAtZSBcXFxyYC8iICAgICAgICAgICAgIyBjb21tYW5kIGxpbmUgdW5kZXIga3NoCisgc2VkICdzLyQnIi9gZWNobyBcXFxyYC8iICAgICAgICAgICAgICMgY29tbWFuZCBsaW5lIHVuZGVyIGJhc2gKKyBzZWQgInMvJC9gZWNobyBcXFxyYC8iICAgICAgICAgICAgICAgIyBjb21tYW5kIGxpbmUgdW5kZXIgenNoCisgc2VkICdzLyQvXHIvJyAgICAgICAgICAgICAgICAgICAgICAgICMgZ3NlZCAzLjAyLjgwCisKKyAjIElOIERPUyBFTlZJUk9OTUVOVDogY29udmVydCBVbml4IG5ld2xpbmVzIChMRikgdG8gRE9TIGZvcm1hdAorIHNlZCAicy8kLy8iICAgICAgICAgICAgICAgICAgICAgICAgICAjIG1ldGhvZCAxCisgc2VkIC1uIHAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWV0aG9kIDIKKworICMgSU4gRE9TIEVOVklST05NRU5UOiBjb252ZXJ0IERPUyBuZXdsaW5lcyAoQ1IvTEYpIHRvIFVuaXggZm9ybWF0CisgIyBDYW4gb25seSBiZSBkb25lIHdpdGggVW54VXRpbHMgc2VkLCB2ZXJzaW9uIDQuMC43IG9yIGhpZ2hlci4KKyAjIENhbm5vdCBiZSBkb25lIHdpdGggb3RoZXIgRE9TIHZlcnNpb25zIG9mIHNlZC4gVXNlICJ0ciIgaW5zdGVhZC4KKyBzZWQgInMvXHIvLyIgaW5maWxlID5vdXRmaWxlICAgICAgICAgIyBVbnhVdGlscyBzZWQgdjQuMC43IG9yIGhpZ2hlcgorIHRyIC1kIFxyIDxpbmZpbGUgPm91dGZpbGUgICAgICAgICAgICAjIEdOVSB0ciB2ZXJzaW9uIDEuMjIgb3IgaGlnaGVyCisKKyAjIGRlbGV0ZSBsZWFkaW5nIHdoaXRlc3BhY2UgKHNwYWNlcywgdGFicykgZnJvbSBmcm9udCBvZiBlYWNoIGxpbmUKKyAjIGFsaWducyBhbGwgdGV4dCBmbHVzaCBsZWZ0Cisgc2VkICdzL15bIFx0XSovLycgICAgICAgICAgICAgICAgICAgICMgc2VlIG5vdGUgb24gJ1x0JyBhdCBlbmQgb2YgZmlsZQorCisgIyBkZWxldGUgdHJhaWxpbmcgd2hpdGVzcGFjZSAoc3BhY2VzLCB0YWJzKSBmcm9tIGVuZCBvZiBlYWNoIGxpbmUKKyBzZWQgJ3MvWyBcdF0qJC8vJyAgICAgICAgICAgICAgICAgICAgIyBzZWUgbm90ZSBvbiAnXHQnIGF0IGVuZCBvZiBmaWxlCisKKyAjIGRlbGV0ZSBCT1RIIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgZnJvbSBlYWNoIGxpbmUKKyBzZWQgJ3MvXlsgXHRdKi8vO3MvWyBcdF0qJC8vJworCisgIyBpbnNlcnQgNSBibGFuayBzcGFjZXMgYXQgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSAobWFrZSBwYWdlIG9mZnNldCkKKyBzZWQgJ3MvXi8gICAgIC8nCisKKyAjIGFsaWduIGFsbCB0ZXh0IGZsdXNoIHJpZ2h0IG9uIGEgNzktY29sdW1uIHdpZHRoCisgc2VkIC1lIDphIC1lICdzL14uXHsxLDc4XH0kLyAmLzt0YScgICMgc2V0IGF0IDc4IHBsdXMgMSBzcGFjZQorCisgIyBjZW50ZXIgYWxsIHRleHQgaW4gdGhlIG1pZGRsZSBvZiA3OS1jb2x1bW4gd2lkdGguIEluIG1ldGhvZCAxLAorICMgc3BhY2VzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgYXJlIHNpZ25pZmljYW50LCBhbmQgdHJhaWxpbmcKKyAjIHNwYWNlcyBhcmUgYXBwZW5kZWQgYXQgdGhlIGVuZCBvZiB0aGUgbGluZS4gSW4gbWV0aG9kIDIsIHNwYWNlcyBhdAorICMgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBhcmUgZGlzY2FyZGVkIGluIGNlbnRlcmluZyB0aGUgbGluZSwgYW5kCisgIyBubyB0cmFpbGluZyBzcGFjZXMgYXBwZWFyIGF0IHRoZSBlbmQgb2YgbGluZXMuCisgc2VkICAtZSA6YSAtZSAncy9eLlx7MSw3N1x9JC8gJiAvO3RhJyAgICAgICAgICAgICAgICAgICAgICMgbWV0aG9kIDEKKyBzZWQgIC1lIDphIC1lICdzL14uXHsxLDc3XH0kLyAmLzt0YScgLWUgJ3MvXCggKlwpXDEvXDEvJyAgIyBtZXRob2QgMgorCisgIyBzdWJzdGl0dXRlIChmaW5kIGFuZCByZXBsYWNlKSAiZm9vIiB3aXRoICJiYXIiIG9uIGVhY2ggbGluZQorIHNlZCAncy9mb28vYmFyLycgICAgICAgICAgICAgIyByZXBsYWNlcyBvbmx5IDFzdCBpbnN0YW5jZSBpbiBhIGxpbmUKKyBzZWQgJ3MvZm9vL2Jhci80JyAgICAgICAgICAgICMgcmVwbGFjZXMgb25seSA0dGggaW5zdGFuY2UgaW4gYSBsaW5lCisgc2VkICdzL2Zvby9iYXIvZycgICAgICAgICAgICAjIHJlcGxhY2VzIEFMTCBpbnN0YW5jZXMgaW4gYSBsaW5lCisgc2VkICdzL1woLipcKWZvb1woLipmb29cKS9cMWJhclwyLycgIyByZXBsYWNlIHRoZSBuZXh0LXRvLWxhc3QgY2FzZQorIHNlZCAncy9cKC4qXClmb28vXDFiYXIvJyAgICAgICAgICAgICMgcmVwbGFjZSBvbmx5IHRoZSBsYXN0IGNhc2UKKworICMgc3Vic3RpdHV0ZSAiZm9vIiB3aXRoICJiYXIiIE9OTFkgZm9yIGxpbmVzIHdoaWNoIGNvbnRhaW4gImJheiIKKyBzZWQgJy9iYXovcy9mb28vYmFyL2cnCisKKyAjIHN1YnN0aXR1dGUgImZvbyIgd2l0aCAiYmFyIiBFWENFUFQgZm9yIGxpbmVzIHdoaWNoIGNvbnRhaW4gImJheiIKKyBzZWQgJy9iYXovIXMvZm9vL2Jhci9nJworCisgIyBjaGFuZ2UgInNjYXJsZXQiIG9yICJydWJ5IiBvciAicHVjZSIgdG8gInJlZCIKKyBzZWQgJ3Mvc2NhcmxldC9yZWQvZztzL3J1YnkvcmVkL2c7cy9wdWNlL3JlZC9nJyAgICMgbW9zdCBzZWRzCisgZ3NlZCAncy9zY2FybGV0XHxydWJ5XHxwdWNlL3JlZC9nJyAgICAgICAgICAgICAgICAjIEdOVSBzZWQgb25seQorCisgIyByZXZlcnNlIG9yZGVyIG9mIGxpbmVzIChlbXVsYXRlcyAidGFjIikKKyAjIGJ1Zy9mZWF0dXJlIGluIEhIc2VkIHYxLjUgY2F1c2VzIGJsYW5rIGxpbmVzIHRvIGJlIGRlbGV0ZWQKKyBzZWQgJzEhRztoOyQhZCcgICAgICAgICAgICAgICAjIG1ldGhvZCAxCisgc2VkIC1uICcxIUc7aDskcCcgICAgICAgICAgICAgIyBtZXRob2QgMgorCisgIyByZXZlcnNlIGVhY2ggY2hhcmFjdGVyIG9uIHRoZSBsaW5lIChlbXVsYXRlcyAicmV2IikKKyBzZWQgJy9cbi8hRztzL1woLlwpXCguKlxuXCkvJlwyXDEvOy8vRDtzLy4vLycKKworICMgam9pbiBwYWlycyBvZiBsaW5lcyBzaWRlLWJ5LXNpZGUgKGxpa2UgInBhc3RlIikKKyBzZWQgJyQhTjtzL1xuLyAvJworCisgIyBpZiBhIGxpbmUgZW5kcyB3aXRoIGEgYmFja3NsYXNoLCBhcHBlbmQgdGhlIG5leHQgbGluZSB0byBpdAorIHNlZCAtZSA6YSAtZSAnL1xcJC9OOyBzL1xcXG4vLzsgdGEnCisKKyAjIGlmIGEgbGluZSBiZWdpbnMgd2l0aCBhbiBlcXVhbCBzaWduLCBhcHBlbmQgaXQgdG8gdGhlIHByZXZpb3VzIGxpbmUKKyAjIGFuZCByZXBsYWNlIHRoZSAiPSIgd2l0aCBhIHNpbmdsZSBzcGFjZQorIHNlZCAtZSA6YSAtZSAnJCFOO3MvXG49LyAvO3RhJyAtZSAnUDtEJworCisgIyBhZGQgY29tbWFzIHRvIG51bWVyaWMgc3RyaW5ncywgY2hhbmdpbmcgIjEyMzQ1NjciIHRvICIxLDIzNCw1NjciCisgZ3NlZCAnOmE7cy9cQlswLTldXHszXH1cPi8sJi87dGEnICAgICAgICAgICAgICAgICAgICAgIyBHTlUgc2VkCisgc2VkIC1lIDphIC1lICdzL1woLipbMC05XVwpXChbMC05XVx7M1x9XCkvXDEsXDIvO3RhJyAgIyBvdGhlciBzZWRzCisKKyAjIGFkZCBjb21tYXMgdG8gbnVtYmVycyB3aXRoIGRlY2ltYWwgcG9pbnRzIGFuZCBtaW51cyBzaWducyAoR05VIHNlZCkKKyBnc2VkICc6YTtzL1woXlx8W14wLTkuXVwpXChbMC05XVwrXClcKFswLTldXHszXH1cKS9cMVwyLFwzL2c7dGEnCisKKyAjIGFkZCBhIGJsYW5rIGxpbmUgZXZlcnkgNSBsaW5lcyAoYWZ0ZXIgbGluZXMgNSwgMTAsIDE1LCAyMCwgZXRjLikKKyBnc2VkICcwfjVHJyAgICAgICAgICAgICAgICAgICMgR05VIHNlZCBvbmx5Cisgc2VkICduO247bjtuO0c7JyAgICAgICAgICAgICAjIG90aGVyIHNlZHMKKworU0VMRUNUSVZFIFBSSU5USU5HIE9GIENFUlRBSU4gTElORVM6CisKKyAjIHByaW50IGZpcnN0IDEwIGxpbmVzIG9mIGZpbGUgKGVtdWxhdGVzIGJlaGF2aW9yIG9mICJoZWFkIikKKyBzZWQgMTBxCisKKyAjIHByaW50IGZpcnN0IGxpbmUgb2YgZmlsZSAoZW11bGF0ZXMgImhlYWQgLTEiKQorIHNlZCBxCisKKyAjIHByaW50IHRoZSBsYXN0IDEwIGxpbmVzIG9mIGEgZmlsZSAoZW11bGF0ZXMgInRhaWwiKQorIHNlZCAtZSA6YSAtZSAnJHE7TjsxMSwkRDtiYScKKworICMgcHJpbnQgdGhlIGxhc3QgMiBsaW5lcyBvZiBhIGZpbGUgKGVtdWxhdGVzICJ0YWlsIC0yIikKKyBzZWQgJyQhTjskIUQnCisKKyAjIHByaW50IHRoZSBsYXN0IGxpbmUgb2YgYSBmaWxlIChlbXVsYXRlcyAidGFpbCAtMSIpCisgc2VkICckIWQnICAgICAgICAgICAgICAgICAgICAjIG1ldGhvZCAxCisgc2VkIC1uICckcCcgICAgICAgICAgICAgICAgICAjIG1ldGhvZCAyCisKKyAjIHByaW50IG9ubHkgbGluZXMgd2hpY2ggbWF0Y2ggcmVndWxhciBleHByZXNzaW9uIChlbXVsYXRlcyAiZ3JlcCIpCisgc2VkIC1uICcvcmVnZXhwL3AnICAgICAgICAgICAjIG1ldGhvZCAxCisgc2VkICcvcmVnZXhwLyFkJyAgICAgICAgICAgICAjIG1ldGhvZCAyCisKKyAjIHByaW50IG9ubHkgbGluZXMgd2hpY2ggZG8gTk9UIG1hdGNoIHJlZ2V4cCAoZW11bGF0ZXMgImdyZXAgLXYiKQorIHNlZCAtbiAnL3JlZ2V4cC8hcCcgICAgICAgICAgIyBtZXRob2QgMSwgY29ycmVzcG9uZHMgdG8gYWJvdmUKKyBzZWQgJy9yZWdleHAvZCcgICAgICAgICAgICAgICMgbWV0aG9kIDIsIHNpbXBsZXIgc3ludGF4CisKKyAjIHByaW50IHRoZSBsaW5lIGltbWVkaWF0ZWx5IGJlZm9yZSBhIHJlZ2V4cCwgYnV0IG5vdCB0aGUgbGluZQorICMgY29udGFpbmluZyB0aGUgcmVnZXhwCisgc2VkIC1uICcvcmVnZXhwL3tnOzEhcDt9O2gnCisKKyAjIHByaW50IHRoZSBsaW5lIGltbWVkaWF0ZWx5IGFmdGVyIGEgcmVnZXhwLCBidXQgbm90IHRoZSBsaW5lCisgIyBjb250YWluaW5nIHRoZSByZWdleHAKKyBzZWQgLW4gJy9yZWdleHAve247cDt9JworCisgIyBwcmludCAxIGxpbmUgb2YgY29udGV4dCBiZWZvcmUgYW5kIGFmdGVyIHJlZ2V4cCwgd2l0aCBsaW5lIG51bWJlcgorICMgaW5kaWNhdGluZyB3aGVyZSB0aGUgcmVnZXhwIG9jY3VycmVkIChzaW1pbGFyIHRvICJncmVwIC1BMSAtQjEiKQorIHNlZCAtbiAtZSAnL3JlZ2V4cC97PTt4OzEhcDtnOyQhTjtwO0Q7fScgLWUgaAorCisgIyBncmVwIGZvciBBQUEgYW5kIEJCQiBhbmQgQ0NDIChpbiBhbnkgb3JkZXIpCisgc2VkICcvQUFBLyFkOyAvQkJCLyFkOyAvQ0NDLyFkJworCisgIyBncmVwIGZvciBBQUEgYW5kIEJCQiBhbmQgQ0NDIChpbiB0aGF0IG9yZGVyKQorIHNlZCAnL0FBQS4qQkJCLipDQ0MvIWQnCisKKyAjIGdyZXAgZm9yIEFBQSBvciBCQkIgb3IgQ0NDIChlbXVsYXRlcyAiZWdyZXAiKQorIHNlZCAtZSAnL0FBQS9iJyAtZSAnL0JCQi9iJyAtZSAnL0NDQy9iJyAtZSBkICAgICMgbW9zdCBzZWRzCisgZ3NlZCAnL0FBQVx8QkJCXHxDQ0MvIWQnICAgICAgICAgICAgICAgICAgICAgICAgIyBHTlUgc2VkIG9ubHkKKworICMgcHJpbnQgcGFyYWdyYXBoIGlmIGl0IGNvbnRhaW5zIEFBQSAoYmxhbmsgbGluZXMgc2VwYXJhdGUgcGFyYWdyYXBocykKKyAjIEhIc2VkIHYxLjUgbXVzdCBpbnNlcnQgYSAnRzsnIGFmdGVyICd4OycgaW4gdGhlIG5leHQgMyBzY3JpcHRzIGJlbG93Cisgc2VkIC1lICcvLi97SDskIWQ7fScgLWUgJ3g7L0FBQS8hZDsnCisKKyAjIHByaW50IHBhcmFncmFwaCBpZiBpdCBjb250YWlucyBBQUEgYW5kIEJCQiBhbmQgQ0NDIChpbiBhbnkgb3JkZXIpCisgc2VkIC1lICcvLi97SDskIWQ7fScgLWUgJ3g7L0FBQS8hZDsvQkJCLyFkOy9DQ0MvIWQnCisKKyAjIHByaW50IHBhcmFncmFwaCBpZiBpdCBjb250YWlucyBBQUEgb3IgQkJCIG9yIENDQworIHNlZCAtZSAnLy4ve0g7JCFkO30nIC1lICd4Oy9BQUEvYicgLWUgJy9CQkIvYicgLWUgJy9DQ0MvYicgLWUgZAorIGdzZWQgJy8uL3tIOyQhZDt9O3g7L0FBQVx8QkJCXHxDQ0MvYjtkJyAgICAgICAgICMgR05VIHNlZCBvbmx5CisKKyAjIHByaW50IG9ubHkgbGluZXMgb2YgNjUgY2hhcmFjdGVycyBvciBsb25nZXIKKyBzZWQgLW4gJy9eLlx7NjVcfS9wJworCisgIyBwcmludCBvbmx5IGxpbmVzIG9mIGxlc3MgdGhhbiA2NSBjaGFyYWN0ZXJzCisgc2VkIC1uICcvXi5cezY1XH0vIXAnICAgICAgICAjIG1ldGhvZCAxLCBjb3JyZXNwb25kcyB0byBhYm92ZQorIHNlZCAnL14uXHs2NVx9L2QnICAgICAgICAgICAgIyBtZXRob2QgMiwgc2ltcGxlciBzeW50YXgKKworICMgcHJpbnQgc2VjdGlvbiBvZiBmaWxlIGZyb20gcmVndWxhciBleHByZXNzaW9uIHRvIGVuZCBvZiBmaWxlCisgc2VkIC1uICcvcmVnZXhwLywkcCcKKworICMgcHJpbnQgc2VjdGlvbiBvZiBmaWxlIGJhc2VkIG9uIGxpbmUgbnVtYmVycyAobGluZXMgOC0xMiwgaW5jbHVzaXZlKQorIHNlZCAtbiAnOCwxMnAnICAgICAgICAgICAgICAgIyBtZXRob2QgMQorIHNlZCAnOCwxMiFkJyAgICAgICAgICAgICAgICAgIyBtZXRob2QgMgorCisgIyBwcmludCBsaW5lIG51bWJlciA1MgorIHNlZCAtbiAnNTJwJyAgICAgICAgICAgICAgICAgIyBtZXRob2QgMQorIHNlZCAnNTIhZCcgICAgICAgICAgICAgICAgICAgIyBtZXRob2QgMgorIHNlZCAnNTJxO2QnICAgICAgICAgICAgICAgICAgIyBtZXRob2QgMywgZWZmaWNpZW50IG9uIGxhcmdlIGZpbGVzCisKKyAjIGJlZ2lubmluZyBhdCBsaW5lIDMsIHByaW50IGV2ZXJ5IDd0aCBsaW5lCisgZ3NlZCAtbiAnM343cCcgICAgICAgICAgICAgICAjIEdOVSBzZWQgb25seQorIHNlZCAtbiAnMywke3A7bjtuO247bjtuO247fScgIyBvdGhlciBzZWRzCisKKyAjIHByaW50IHNlY3Rpb24gb2YgZmlsZSBiZXR3ZWVuIHR3byByZWd1bGFyIGV4cHJlc3Npb25zIChpbmNsdXNpdmUpCisgc2VkIC1uICcvSW93YS8sL01vbnRhbmEvcCcgICAgICAgICAgICAgIyBjYXNlIHNlbnNpdGl2ZQorCitTRUxFQ1RJVkUgREVMRVRJT04gT0YgQ0VSVEFJTiBMSU5FUzoKKworICMgcHJpbnQgYWxsIG9mIGZpbGUgRVhDRVBUIHNlY3Rpb24gYmV0d2VlbiAyIHJlZ3VsYXIgZXhwcmVzc2lvbnMKKyBzZWQgJy9Jb3dhLywvTW9udGFuYS9kJworCisgIyBkZWxldGUgZHVwbGljYXRlLCBjb25zZWN1dGl2ZSBsaW5lcyBmcm9tIGEgZmlsZSAoZW11bGF0ZXMgInVuaXEiKS4KKyAjIEZpcnN0IGxpbmUgaW4gYSBzZXQgb2YgZHVwbGljYXRlIGxpbmVzIGlzIGtlcHQsIHJlc3QgYXJlIGRlbGV0ZWQuCisgc2VkICckIU47IC9eXCguKlwpXG5cMSQvIVA7IEQnCisKKyAjIGRlbGV0ZSBkdXBsaWNhdGUsIG5vbmNvbnNlY3V0aXZlIGxpbmVzIGZyb20gYSBmaWxlLiBCZXdhcmUgbm90IHRvCisgIyBvdmVyZmxvdyB0aGUgYnVmZmVyIHNpemUgb2YgdGhlIGhvbGQgc3BhY2UsIG9yIGVsc2UgdXNlIEdOVSBzZWQuCisgc2VkIC1uICdHOyBzL1xuLyYmLzsgL15cKFsgLX5dKlxuXCkuKlxuXDEvZDsgcy9cbi8vOyBoOyBQJworCisgIyBkZWxldGUgYWxsIGxpbmVzIGV4Y2VwdCBkdXBsaWNhdGUgbGluZXMgKGVtdWxhdGVzICJ1bmlxIC1kIikuCisgc2VkICckIU47IHMvXlwoLipcKVxuXDEkL1wxLzsgdDsgRCcKKworICMgZGVsZXRlIHRoZSBmaXJzdCAxMCBsaW5lcyBvZiBhIGZpbGUKKyBzZWQgJzEsMTBkJworCisgIyBkZWxldGUgdGhlIGxhc3QgbGluZSBvZiBhIGZpbGUKKyBzZWQgJyRkJworCisgIyBkZWxldGUgdGhlIGxhc3QgMiBsaW5lcyBvZiBhIGZpbGUKKyBzZWQgJ047JCFQOyQhRDskZCcKKworICMgZGVsZXRlIHRoZSBsYXN0IDEwIGxpbmVzIG9mIGEgZmlsZQorIHNlZCAtZSA6YSAtZSAnJGQ7TjsyLDEwYmEnIC1lICdQO0QnICAgIyBtZXRob2QgMQorIHNlZCAtbiAtZSA6YSAtZSAnMSwxMCF7UDtOO0Q7fTtOO2JhJyAgIyBtZXRob2QgMgorCisgIyBkZWxldGUgZXZlcnkgOHRoIGxpbmUKKyBnc2VkICcwfjhkJyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgR05VIHNlZCBvbmx5Cisgc2VkICduO247bjtuO247bjtuO2Q7JyAgICAgICAgICAgICAgICAjIG90aGVyIHNlZHMKKworICMgZGVsZXRlIEFMTCBibGFuayBsaW5lcyBmcm9tIGEgZmlsZSAoc2FtZSBhcyAiZ3JlcCAnLicgIikKKyBzZWQgJy9eJC9kJyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWV0aG9kIDEKKyBzZWQgJy8uLyFkJyAgICAgICAgICAgICAgICAgICAgICAgICAgICMgbWV0aG9kIDIKKworICMgZGVsZXRlIGFsbCBDT05TRUNVVElWRSBibGFuayBsaW5lcyBmcm9tIGZpbGUgZXhjZXB0IHRoZSBmaXJzdDsgYWxzbworICMgZGVsZXRlcyBhbGwgYmxhbmsgbGluZXMgZnJvbSB0b3AgYW5kIGVuZCBvZiBmaWxlIChlbXVsYXRlcyAiY2F0IC1zIikKKyBzZWQgJy8uLywvXiQvIWQnICAgICAgICAgICMgbWV0aG9kIDEsIGFsbG93cyAwIGJsYW5rcyBhdCB0b3AsIDEgYXQgRU9GCisgc2VkICcvXiQvTjsvXG4kL0QnICAgICAgICAjIG1ldGhvZCAyLCBhbGxvd3MgMSBibGFuayBhdCB0b3AsIDAgYXQgRU9GCisKKyAjIGRlbGV0ZSBhbGwgQ09OU0VDVVRJVkUgYmxhbmsgbGluZXMgZnJvbSBmaWxlIGV4Y2VwdCB0aGUgZmlyc3QgMjoKKyBzZWQgJy9eJC9OOy9cbiQvTjsvL0QnCisKKyAjIGRlbGV0ZSBhbGwgbGVhZGluZyBibGFuayBsaW5lcyBhdCB0b3Agb2YgZmlsZQorIHNlZCAnLy4vLCQhZCcKKworICMgZGVsZXRlIGFsbCB0cmFpbGluZyBibGFuayBsaW5lcyBhdCBlbmQgb2YgZmlsZQorIHNlZCAtZSA6YSAtZSAnL15cbiokL3skZDtOO2JhJyAtZSAnfScgICMgd29ya3Mgb24gYWxsIHNlZHMKKyBzZWQgLWUgOmEgLWUgJy9eXG4qJC9OOy9cbiQvYmEnICAgICAgICAjIGRpdHRvLCBleGNlcHQgZm9yIGdzZWQgMy4wMioKKworICMgZGVsZXRlIHRoZSBsYXN0IGxpbmUgb2YgZWFjaCBwYXJhZ3JhcGgKKyBzZWQgLW4gJy9eJC97cDtoO307Ly4ve3g7Ly4vcDt9JworCitTUEVDSUFMIEFQUExJQ0FUSU9OUzoKKworICMgcmVtb3ZlIG5yb2ZmIG92ZXJzdHJpa2VzIChjaGFyLCBiYWNrc3BhY2UpIGZyb20gbWFuIHBhZ2VzLiBUaGUgJ2VjaG8nCisgIyBjb21tYW5kIG1heSBuZWVkIGFuIC1lIHN3aXRjaCBpZiB5b3UgdXNlIFVuaXggU3lzdGVtIFYgb3IgYmFzaCBzaGVsbC4KKyBzZWQgInMvLmBlY2hvIFxcXGJgLy9nIiAgICAjIGRvdWJsZSBxdW90ZXMgcmVxdWlyZWQgZm9yIFVuaXggZW52aXJvbm1lbnQKKyBzZWQgJ3MvLl5ILy9nJyAgICAgICAgICAgICAjIGluIGJhc2gvdGNzaCwgcHJlc3MgQ3RybC1WIGFuZCB0aGVuIEN0cmwtSAorIHNlZCAncy8uXHgwOC8vZycgICAgICAgICAgICMgaGV4IGV4cHJlc3Npb24gZm9yIHNlZCB2MS41CisKKyAjIGdldCBVc2VuZXQvZS1tYWlsIG1lc3NhZ2UgaGVhZGVyCisgc2VkICcvXiQvcScgICAgICAgICAgICAgICAgIyBkZWxldGVzIGV2ZXJ5dGhpbmcgYWZ0ZXIgZmlyc3QgYmxhbmsgbGluZQorCisgIyBnZXQgVXNlbmV0L2UtbWFpbCBtZXNzYWdlIGJvZHkKKyBzZWQgJzEsL14kL2QnICAgICAgICAgICAgICAjIGRlbGV0ZXMgZXZlcnl0aGluZyB1cCB0byBmaXJzdCBibGFuayBsaW5lCisKKyAjIGdldCBTdWJqZWN0IGhlYWRlciwgYnV0IHJlbW92ZSBpbml0aWFsICJTdWJqZWN0OiAiIHBvcnRpb24KKyBzZWQgJy9eU3ViamVjdDogKi8hZDsgcy8vLztxJworCisgIyBnZXQgcmV0dXJuIGFkZHJlc3MgaGVhZGVyCisgc2VkICcvXlJlcGx5LVRvOi9xOyAvXkZyb206L2g7IC8uL2Q7ZztxJworCisgIyBwYXJzZSBvdXQgdGhlIGFkZHJlc3MgcHJvcGVyLiBQdWxscyBvdXQgdGhlIGUtbWFpbCBhZGRyZXNzIGJ5IGl0c2VsZgorICMgZnJvbSB0aGUgMS1saW5lIHJldHVybiBhZGRyZXNzIGhlYWRlciAoc2VlIHByZWNlZGluZyBzY3JpcHQpCisgc2VkICdzLyAqKC4qKS8vOyBzLz4uKi8vOyBzLy4qWzo8XSAqLy8nCisKKyAjIGFkZCBhIGxlYWRpbmcgYW5nbGUgYnJhY2tldCBhbmQgc3BhY2UgdG8gZWFjaCBsaW5lIChxdW90ZSBhIG1lc3NhZ2UpCisgc2VkICdzL14vPiAvJworCisgIyBkZWxldGUgbGVhZGluZyBhbmdsZSBicmFja2V0ICYgc3BhY2UgZnJvbSBlYWNoIGxpbmUgKHVucXVvdGUgYSBtZXNzYWdlKQorIHNlZCAncy9ePiAvLycKKworICMgcmVtb3ZlIG1vc3QgSFRNTCB0YWdzIChhY2NvbW1vZGF0ZXMgbXVsdGlwbGUtbGluZSB0YWdzKQorIHNlZCAtZSA6YSAtZSAncy88W14+XSo+Ly9nOy88L047Ly9iYScKKworICMgZXh0cmFjdCBtdWx0aS1wYXJ0IHV1ZW5jb2RlZCBiaW5hcmllcywgcmVtb3ZpbmcgZXh0cmFuZW91cyBoZWFkZXIKKyAjIGluZm8sIHNvIHRoYXQgb25seSB0aGUgdXVlbmNvZGVkIHBvcnRpb24gcmVtYWlucy4gRmlsZXMgcGFzc2VkIHRvCisgIyBzZWQgbXVzdCBiZSBwYXNzZWQgaW4gdGhlIHByb3BlciBvcmRlci4gVmVyc2lvbiAxIGNhbiBiZSBlbnRlcmVkCisgIyBmcm9tIHRoZSBjb21tYW5kIGxpbmU7IHZlcnNpb24gMiBjYW4gYmUgbWFkZSBpbnRvIGFuIGV4ZWN1dGFibGUKKyAjIFVuaXggc2hlbGwgc2NyaXB0LiAoTW9kaWZpZWQgZnJvbSBhIHNjcmlwdCBieSBSYWh1bCBEaGVzaS4pCisgc2VkICcvXmVuZC8sL15iZWdpbi9kJyBmaWxlMSBmaWxlMiAuLi4gZmlsZVggfCB1dWRlY29kZSAgICMgdmVycy4gMQorIHNlZCAnL15lbmQvLC9eYmVnaW4vZCcgIiRAIiB8IHV1ZGVjb2RlICAgICAgICAgICAgICAgICAgICAjIHZlcnMuIDIKKworICMgemlwIHVwIGVhY2ggLlRYVCBmaWxlIGluZGl2aWR1YWxseSwgZGVsZXRpbmcgdGhlIHNvdXJjZSBmaWxlIGFuZAorICMgc2V0dGluZyB0aGUgbmFtZSBvZiBlYWNoIC5aSVAgZmlsZSB0byB0aGUgYmFzZW5hbWUgb2YgdGhlIC5UWFQgZmlsZQorICMgKHVuZGVyIERPUzogdGhlICJkaXIgL2IiIHN3aXRjaCByZXR1cm5zIGJhcmUgZmlsZW5hbWVzIGluIGFsbCBjYXBzKS4KKyBlY2hvIEBlY2hvIG9mZiA+emlwdXAuYmF0CisgZGlyIC9iICoudHh0IHwgc2VkICJzL15cKC4qXClcLlRYVC9wa3ppcCAtbW8gXDEgXDEuVFhULyIgPj56aXB1cC5iYXQKKworVFlQSUNBTCBVU0U6IFNlZCB0YWtlcyBvbmUgb3IgbW9yZSBlZGl0aW5nIGNvbW1hbmRzIGFuZCBhcHBsaWVzIGFsbCBvZgordGhlbSwgaW4gc2VxdWVuY2UsIHRvIGVhY2ggbGluZSBvZiBpbnB1dC4gQWZ0ZXIgYWxsIHRoZSBjb21tYW5kcyBoYXZlCitiZWVuIGFwcGxpZWQgdG8gdGhlIGZpcnN0IGlucHV0IGxpbmUsIHRoYXQgbGluZSBpcyBvdXRwdXQgYW5kIGEgc2Vjb25kCitpbnB1dCBsaW5lIGlzIHRha2VuIGZvciBwcm9jZXNzaW5nLCBhbmQgdGhlIGN5Y2xlIHJlcGVhdHMuIFRoZQorcHJlY2VkaW5nIGV4YW1wbGVzIGFzc3VtZSB0aGF0IGlucHV0IGNvbWVzIGZyb20gdGhlIHN0YW5kYXJkIGlucHV0CitkZXZpY2UgKGkuZSwgdGhlIGNvbnNvbGUsIG5vcm1hbGx5IHRoaXMgd2lsbCBiZSBwaXBlZCBpbnB1dCkuIE9uZSBvcgorbW9yZSBmaWxlbmFtZXMgY2FuIGJlIGFwcGVuZGVkIHRvIHRoZSBjb21tYW5kIGxpbmUgaWYgdGhlIGlucHV0IGRvZXMKK25vdCBjb21lIGZyb20gc3RkaW4uIE91dHB1dCBpcyBzZW50IHRvIHN0ZG91dCAodGhlIHNjcmVlbikuIFRodXM6CisKKyBjYXQgZmlsZW5hbWUgfCBzZWQgJzEwcScgICAgICAgICMgdXNlcyBwaXBlZCBpbnB1dAorIHNlZCAnMTBxJyBmaWxlbmFtZSAgICAgICAgICAgICAgIyBzYW1lIGVmZmVjdCwgYXZvaWRzIGEgdXNlbGVzcyAiY2F0IgorIHNlZCAnMTBxJyBmaWxlbmFtZSA+IG5ld2ZpbGUgICAgIyByZWRpcmVjdHMgb3V0cHV0IHRvIGRpc2sKKworRm9yIGFkZGl0aW9uYWwgc3ludGF4IGluc3RydWN0aW9ucywgaW5jbHVkaW5nIHRoZSB3YXkgdG8gYXBwbHkgZWRpdGluZworY29tbWFuZHMgZnJvbSBhIGRpc2sgZmlsZSBpbnN0ZWFkIG9mIHRoZSBjb21tYW5kIGxpbmUsIGNvbnN1bHQgInNlZCAmCithd2ssIDJuZCBFZGl0aW9uLCIgYnkgRGFsZSBEb3VnaGVydHkgYW5kIEFybm9sZCBSb2JiaW5zIChPJ1JlaWxseSwKKzE5OTc7IGh0dHA6Ly93d3cub3JhLmNvbSksICJVTklYIFRleHQgUHJvY2Vzc2luZywiIGJ5IERhbGUgRG91Z2hlcnR5CithbmQgVGltIE8nUmVpbGx5IChIYXlkZW4gQm9va3MsIDE5ODcpIG9yIHRoZSB0dXRvcmlhbHMgYnkgTWlrZSBBcnN0CitkaXN0cmlidXRlZCBpbiBVLVNFRElUMi5aSVAgKG1hbnkgc2l0ZXMpLiBUbyBmdWxseSBleHBsb2l0IHRoZSBwb3dlcgorb2Ygc2VkLCBvbmUgbXVzdCB1bmRlcnN0YW5kICJyZWd1bGFyIGV4cHJlc3Npb25zLiIgRm9yIHRoaXMsIHNlZQorIk1hc3RlcmluZyBSZWd1bGFyIEV4cHJlc3Npb25zIiBieSBKZWZmcmV5IEZyaWVkbCAoTydSZWlsbHksIDE5OTcpLgorVGhlIG1hbnVhbCAoIm1hbiIpIHBhZ2VzIG9uIFVuaXggc3lzdGVtcyBtYXkgYmUgaGVscGZ1bCAodHJ5ICJtYW4KK3NlZCIsICJtYW4gcmVnZXhwIiwgb3IgdGhlIHN1YnNlY3Rpb24gb24gcmVndWxhciBleHByZXNzaW9ucyBpbiAibWFuCitlZCIpLCBidXQgbWFuIHBhZ2VzIGFyZSBub3RvcmlvdXNseSBkaWZmaWN1bHQuIFRoZXkgYXJlIG5vdCB3cml0dGVuIHRvCit0ZWFjaCBzZWQgdXNlIG9yIHJlZ2V4cHMgdG8gZmlyc3QtdGltZSB1c2VycywgYnV0IGFzIGEgcmVmZXJlbmNlIHRleHQKK2ZvciB0aG9zZSBhbHJlYWR5IGFjcXVhaW50ZWQgd2l0aCB0aGVzZSB0b29scy4KKworUVVPVElORyBTWU5UQVg6IFRoZSBwcmVjZWRpbmcgZXhhbXBsZXMgdXNlIHNpbmdsZSBxdW90ZXMgKCcuLi4nKQoraW5zdGVhZCBvZiBkb3VibGUgcXVvdGVzICgiLi4uIikgdG8gZW5jbG9zZSBlZGl0aW5nIGNvbW1hbmRzLCBzaW5jZQorc2VkIGlzIHR5cGljYWxseSB1c2VkIG9uIGEgVW5peCBwbGF0Zm9ybS4gU2luZ2xlIHF1b3RlcyBwcmV2ZW50IHRoZQorVW5peCBzaGVsbCBmcm9tIGludHJlcHJldGluZyB0aGUgZG9sbGFyIHNpZ24gKCQpIGFuZCBiYWNrcXVvdGVzCisoYC4uLmApLCB3aGljaCBhcmUgZXhwYW5kZWQgYnkgdGhlIHNoZWxsIGlmIHRoZXkgYXJlIGVuY2xvc2VkIGluCitkb3VibGUgcXVvdGVzLiBVc2VycyBvZiB0aGUgImNzaCIgc2hlbGwgYW5kIGRlcml2YXRpdmVzIHdpbGwgYWxzbyBuZWVkCit0byBxdW90ZSB0aGUgZXhjbGFtYXRpb24gbWFyayAoISkgd2l0aCB0aGUgYmFja3NsYXNoIChpLmUuLCBcISkgdG8KK3Byb3Blcmx5IHJ1biB0aGUgZXhhbXBsZXMgbGlzdGVkIGFib3ZlLCBldmVuIHdpdGhpbiBzaW5nbGUgcXVvdGVzLgorVmVyc2lvbnMgb2Ygc2VkIHdyaXR0ZW4gZm9yIERPUyBpbnZhcmlhYmx5IHJlcXVpcmUgZG91YmxlIHF1b3RlcworKCIuLi4iKSBpbnN0ZWFkIG9mIHNpbmdsZSBxdW90ZXMgdG8gZW5jbG9zZSBlZGl0aW5nIGNvbW1hbmRzLgorCitVU0UgT0YgJ1x0JyBJTiBTRUQgU0NSSVBUUzogRm9yIGNsYXJpdHkgaW4gZG9jdW1lbnRhdGlvbiwgd2UgaGF2ZSB1c2VkCit0aGUgZXhwcmVzc2lvbiAnXHQnIHRvIGluZGljYXRlIGEgdGFiIGNoYXJhY3RlciAoMHgwOSkgaW4gdGhlIHNjcmlwdHMuCitIb3dldmVyLCBtb3N0IHZlcnNpb25zIG9mIHNlZCBkbyBub3QgcmVjb2duaXplIHRoZSAnXHQnIGFiYnJldmlhdGlvbiwKK3NvIHdoZW4gdHlwaW5nIHRoZXNlIHNjcmlwdHMgZnJvbSB0aGUgY29tbWFuZCBsaW5lLCB5b3Ugc2hvdWxkIHByZXNzCit0aGUgVEFCIGtleSBpbnN0ZWFkLiAnXHQnIGlzIHN1cHBvcnRlZCBhcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorbWV0YWNoYXJhY3RlciBpbiBhd2ssIHBlcmwsIGFuZCBISHNlZCwgc2VkbW9kLCBhbmQgR05VIHNlZCB2My4wMi44MC4KKworVkVSU0lPTlMgT0YgU0VEOiBWZXJzaW9ucyBvZiBzZWQgZG8gZGlmZmVyLCBhbmQgc29tZSBzbGlnaHQgc3ludGF4Cit2YXJpYXRpb24gaXMgdG8gYmUgZXhwZWN0ZWQuIEluIHBhcnRpY3VsYXIsIG1vc3QgZG8gbm90IHN1cHBvcnQgdGhlCit1c2Ugb2YgbGFiZWxzICg6bmFtZSkgb3IgYnJhbmNoIGluc3RydWN0aW9ucyAoYix0KSB3aXRoaW4gZWRpdGluZworY29tbWFuZHMsIGV4Y2VwdCBhdCB0aGUgZW5kIG9mIHRob3NlIGNvbW1hbmRzLiBXZSBoYXZlIHVzZWQgdGhlIHN5bnRheAord2hpY2ggd2lsbCBiZSBwb3J0YWJsZSB0byBtb3N0IHVzZXJzIG9mIHNlZCwgZXZlbiB0aG91Z2ggdGhlIHBvcHVsYXIKK0dOVSB2ZXJzaW9ucyBvZiBzZWQgYWxsb3cgYSBtb3JlIHN1Y2NpbmN0IHN5bnRheC4gV2hlbiB0aGUgcmVhZGVyIHNlZXMKK2EgZmFpcmx5IGxvbmcgY29tbWFuZCBzdWNoIGFzIHRoaXM6CisKKyAgIHNlZCAtZSAnL0FBQS9iJyAtZSAnL0JCQi9iJyAtZSAnL0NDQy9iJyAtZSBkCisKK2l0IGlzIGhlYXJ0ZW5pbmcgdG8ga25vdyB0aGF0IEdOVSBzZWQgd2lsbCBsZXQgeW91IHJlZHVjZSBpdCB0bzoKKworICAgc2VkICcvQUFBL2I7L0JCQi9iOy9DQ0MvYjtkJyAgICAgICMgb3IgZXZlbgorICAgc2VkICcvQUFBXHxCQkJcfENDQy9iO2QnCisKK0luIGFkZGl0aW9uLCByZW1lbWJlciB0aGF0IHdoaWxlIG1hbnkgdmVyc2lvbnMgb2Ygc2VkIGFjY2VwdCBhIGNvbW1hbmQKK2xpa2UgIi9vbmUvIHMvUkUxL1JFMi8iLCBzb21lIGRvIE5PVCBhbGxvdyAiL29uZS8hIHMvUkUxL1JFMi8iLCB3aGljaAorY29udGFpbnMgc3BhY2UgYmVmb3JlIHRoZSAncycuIE9taXQgdGhlIHNwYWNlIHdoZW4gdHlwaW5nIHRoZSBjb21tYW5kLgorCitPUFRJTUlaSU5HIEZPUiBTUEVFRDogSWYgZXhlY3V0aW9uIHNwZWVkIG5lZWRzIHRvIGJlIGluY3JlYXNlZCAoZHVlIHRvCitsYXJnZSBpbnB1dCBmaWxlcyBvciBzbG93IHByb2Nlc3NvcnMgb3IgaGFyZCBkaXNrcyksIHN1YnN0aXR1dGlvbiB3aWxsCitiZSBleGVjdXRlZCBtb3JlIHF1aWNrbHkgaWYgdGhlICJmaW5kIiBleHByZXNzaW9uIGlzIHNwZWNpZmllZCBiZWZvcmUKK2dpdmluZyB0aGUgInMvLi4uLy4uLi8iIGluc3RydWN0aW9uLiBUaHVzOgorCisgICBzZWQgJ3MvZm9vL2Jhci9nJyBmaWxlbmFtZSAgICAgICAgICMgc3RhbmRhcmQgcmVwbGFjZSBjb21tYW5kCisgICBzZWQgJy9mb28vIHMvZm9vL2Jhci9nJyBmaWxlbmFtZSAgICMgZXhlY3V0ZXMgbW9yZSBxdWlja2x5CisgICBzZWQgJy9mb28vIHMvL2Jhci9nJyBmaWxlbmFtZSAgICAgICMgc2hvcnRoYW5kIHNlZCBzeW50YXgKKworT24gbGluZSBzZWxlY3Rpb24gb3IgZGVsZXRpb24gaW4gd2hpY2ggeW91IG9ubHkgbmVlZCB0byBvdXRwdXQgbGluZXMKK2Zyb20gdGhlIGZpcnN0IHBhcnQgb2YgdGhlIGZpbGUsIGEgInF1aXQiIGNvbW1hbmQgKHEpIGluIHRoZSBzY3JpcHQKK3dpbGwgZHJhc3RpY2FsbHkgcmVkdWNlIHByb2Nlc3NpbmcgdGltZSBmb3IgbGFyZ2UgZmlsZXMuIFRodXM6CisKKyAgIHNlZCAtbiAnNDUsNTBwJyBmaWxlbmFtZSAgICAgICAgICAgIyBwcmludCBsaW5lIG5vcy4gNDUtNTAgb2YgYSBmaWxlCisgICBzZWQgLW4gJzUxcTs0NSw1MHAnIGZpbGVuYW1lICAgICAgICMgc2FtZSwgYnV0IGV4ZWN1dGVzIG11Y2ggZmFzdGVyCisKK0lmIHlvdSBoYXZlIGFueSBhZGRpdGlvbmFsIHNjcmlwdHMgdG8gY29udHJpYnV0ZSBvciBpZiB5b3UgZmluZCBlcnJvcnMKK2luIHRoaXMgZG9jdW1lbnQsIHBsZWFzZSBzZW5kIGUtbWFpbCB0byB0aGUgY29tcGlsZXIuIEluZGljYXRlIHRoZQordmVyc2lvbiBvZiBzZWQgeW91IHVzZWQsIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGl0IHdhcyBjb21waWxlZCBmb3IsIGFuZAordGhlIG5hdHVyZSBvZiB0aGUgcHJvYmxlbS4gVmFyaW91cyBzY3JpcHRzIGluIHRoaXMgZmlsZSB3ZXJlIHdyaXR0ZW4KK29yIGNvbnRyaWJ1dGVkIGJ5OgorCisgQWwgQWFiIDxhZjEzN0BmcmVlbmV0LnRvcm9udG8ub24uY2E+ICAgIyAic2VkZXJzIiBsaXN0IG1vZGVyYXRvcgorIEVkZ2FyIEFsbGVuIDxlcmFAc2t5Lm5ldD4gICAgICAgICAgICAgICMgdmFyaW91cworIFlpb3Jnb3MgQWRhbW9wb3Vsb3MgPGFkYW1vQHNvZnRsYWIuZWNlLm50dWEuZ3I+CisgRGFsZSBEb3VnaGVydHkgPGRhbGVAc29uZ2xpbmUuY29tPiAgICAgIyBhdXRob3Igb2YgInNlZCAmIGF3ayIKKyBDYXJsb3MgRHVhcnRlIDxjZHVhQGFsZ29zLmluZXNjLnB0PiAgICAjIGF1dGhvciBvZiAiZG8gaXQgd2l0aCBzZWQiCisgRXJpYyBQZW1lbnQgPHBlbWVudGVAbm9ydGhwYXJrLmVkdT4gICAgIyBhdXRob3Igb2YgdGhpcyBkb2N1bWVudAorIEtlbiBQaXp6aW5pIDxrZW5AaGFsY3lvbi5jb20+ICAgICAgICAgICMgYXV0aG9yIG9mIEdOVSBzZWQgdjMuMDIKKyBTLkcuIFJhdmVuaGFsbCA8c3Rldy5yYXZlbmhhbGxAdG90YWxpc2UuY28udWs+ICMgZ3JlYXQgZGUtaHRtbCBzY3JpcHQKKyBHcmVnIFViYmVuIDxnc3VAcm9tdWx1cy5uY3NjLm1pbD4gICAgICAjIG1hbnkgY29udHJpYnV0aW9ucyAmIG11Y2ggaGVscAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvZWRpdG9ycy9zZWRfc3VtbWFyeS5odG0gYi9lZGl0b3JzL3NlZF9zdW1tYXJ5Lmh0bQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGU3MmIwCi0tLSAvZGV2L251bGwKKysrIGIvZWRpdG9ycy9zZWRfc3VtbWFyeS5odG0KQEAgLTAsMCArMSwyMjMgQEAKKzxodG1sPgorCis8aGVhZD48dGl0bGU+Q29tbWFuZCBTdW1tYXJ5IGZvciBzZWQgKHNlZCAmIGF3aywgU2Vjb25kIEVkaXRpb24pPC90aXRsZT4KKzwvaGVhZD4KKworPGJvZHk+CisKKzxoMj5Db21tYW5kIFN1bW1hcnkgZm9yIHNlZDwvaDI+CisKKzxkbD4KKworPGR0PjxiPjogPC9iPiA8Yj4gOjwvYj48ZW0+bGFiZWw8L2VtPjwvZHQ+Cis8ZGQ+TGFiZWwgYSBsaW5lIGluIHRoZSBzY3JpcHQgZm9yIHRoZSB0cmFuc2ZlciBvZiBjb250cm9sIGJ5Cis8Yj5iPC9iPiBvciA8Yj50PC9iPi4KKzxlbT5sYWJlbDwvZW0+IG1heSBjb250YWluIHVwIHRvIHNldmVuIGNoYXJhY3RlcnMuCisoVGhlIFBPU0lYIHN0YW5kYXJkIHNheXMgdGhhdCBhbiBpbXBsZW1lbnRhdGlvbiBjYW4gYWxsb3cgbG9uZ2VyCitsYWJlbHMgaWYgaXQgd2lzaGVzIHRvLiBHTlUgc2VkIGFsbG93cyBsYWJlbHMgdG8gYmUgb2YgYW55IGxlbmd0aC4pCis8L3A+PC9kZD4KKworCis8ZHQ+PGI+PTwvYj4gWzxlbT5hZGRyZXNzPC9lbT5dPGI+PTwvYj48L2R0PgorPGRkPldyaXRlIHRvIHN0YW5kYXJkIG91dHB1dCB0aGUgbGluZSBudW1iZXIgb2YgYWRkcmVzc2VkIGxpbmUuPC9wPjwvZGQ+CisKKworPGR0PjxiPmE8L2I+IFs8ZW0+YWRkcmVzczwvZW0+XTxiPmFcPC9iPjwvZHQ+Cis8ZGQ+PGVtPnRleHQ8L2VtPjwvcD4KKworPHA+QXBwZW5kIDxlbT50ZXh0PC9lbT4KK2ZvbGxvd2luZyBlYWNoIGxpbmUgbWF0Y2hlZCBieSA8ZW0+YWRkcmVzczwvZW0+LiAgSWYKKzxlbT50ZXh0PC9lbT4gZ29lcyBvdmVyIG1vcmUgdGhhbiBvbmUgbGluZSwgbmV3bGluZXMKK211c3QgYmUgImhpZGRlbiIgYnkgcHJlY2VkaW5nIHRoZW0gd2l0aCBhIGJhY2tzbGFzaC4gIFRoZQorPGVtPnRleHQ8L2VtPiB3aWxsIGJlIHRlcm1pbmF0ZWQgYnkgdGhlIGZpcnN0CituZXdsaW5lIHRoYXQgaXMgbm90IGhpZGRlbiBpbiB0aGlzIHdheS4gIFRoZQorPGVtPnRleHQ8L2VtPiBpcyBub3QgYXZhaWxhYmxlIGluIHRoZSBwYXR0ZXJuIHNwYWNlCithbmQgc3Vic2VxdWVudCBjb21tYW5kcyBjYW5ub3QgYmUgYXBwbGllZCB0byBpdC4gIFRoZSByZXN1bHRzIG9mIHRoaXMKK2NvbW1hbmQgYXJlIHNlbnQgdG8gc3RhbmRhcmQgb3V0cHV0IHdoZW4gdGhlIGxpc3Qgb2YgZWRpdGluZyBjb21tYW5kcworaXMgZmluaXNoZWQsIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBoYXBwZW5zIHRvIHRoZSBjdXJyZW50IGxpbmUgaW4gdGhlCitwYXR0ZXJuIHNwYWNlLjwvcD48L2RkPgorCisKKzxkdD48Yj5iPC9iPiBbPGVtPmFkZHJlc3MxPC9lbT5bLDxlbT5hZGRyZXNzMjwvZW0+XV08Yj5iPC9iPls8ZW0+bGFiZWw8L2VtPl08L2R0PgorPGRkPlRyYW5zZmVyIGNvbnRyb2wgdW5jb25kaXRpb25hbGx5IChicmFuY2gpIHRvCis8Yj46PC9iPjxlbT5sYWJlbDwvZW0+IGVsc2V3aGVyZSBpbgorc2NyaXB0LiAgVGhhdCBpcywgdGhlIGNvbW1hbmQgZm9sbG93aW5nIHRoZQorPGVtPmxhYmVsPC9lbT4gaXMgdGhlIG5leHQgY29tbWFuZCBhcHBsaWVkIHRvIHRoZQorY3VycmVudCBsaW5lLiAgSWYgbm8gPGVtPmxhYmVsPC9lbT4gaXMgc3BlY2lmaWVkLAorY29udHJvbCBmYWxscyB0aHJvdWdoIHRvIHRoZSBlbmQgb2YgdGhlIHNjcmlwdCwgc28gbm8gbW9yZSBjb21tYW5kcworYXJlIGFwcGxpZWQgdG8gdGhlIGN1cnJlbnQgbGluZS48L3A+PC9kZD4KKworCis8ZHQ+PGI+YzwvYj4gWzxlbT5hZGRyZXNzMTwvZW0+Wyw8ZW0+YWRkcmVzczI8L2VtPl1dPGI+Y1w8L2I+PC9kdD4KKzxkZD48ZW0+dGV4dDwvZW0+PC9wPgorCis8cD5SZXBsYWNlIChjaGFuZ2UpIHRoZSBsaW5lcyBzZWxlY3RlZCBieSB0aGUgYWRkcmVzcyB3aXRoCis8ZW0+dGV4dDwvZW0+LiAgV2hlbiBhIHJhbmdlIG9mIGxpbmVzIGlzIHNwZWNpZmllZCwKK2FsbCBsaW5lcyBhcyBhIGdyb3VwIGFyZSByZXBsYWNlZCBieSBhIHNpbmdsZSBjb3B5IG9mCis8ZW0+dGV4dDwvZW0+LiAgVGhlIG5ld2xpbmUgZm9sbG93aW5nIGVhY2ggbGluZSBvZgorPGVtPnRleHQ8L2VtPiBtdXN0IGJlIGVzY2FwZWQgYnkgYSBiYWNrc2xhc2gsIGV4Y2VwdAordGhlIGxhc3QgbGluZS4gIFRoZSBjb250ZW50cyBvZiB0aGUgcGF0dGVybiBzcGFjZSBhcmUsIGluIGVmZmVjdCwKK2RlbGV0ZWQgYW5kIG5vIHN1YnNlcXVlbnQgZWRpdGluZyBjb21tYW5kcyBjYW4gYmUgYXBwbGllZCB0byBpdCAob3IgdG8KKzxlbT50ZXh0PC9lbT4pLjwvcD48L2RkPgorCisKKzxkdD48Yj5kPC9iPiBbPGVtPmFkZHJlc3MxPC9lbT5bLDxlbT5hZGRyZXNzMjwvZW0+XV08Yj5kPC9iPjwvZHQ+Cis8ZGQ+RGVsZXRlIGxpbmUocykgZnJvbSBwYXR0ZXJuIHNwYWNlLiAgVGh1cywgdGhlIGxpbmUgaXMgbm90IHBhc3NlZCB0byBzdGFuZGFyZAorb3V0cHV0LiBBIG5ldyBsaW5lIG9mIGlucHV0IGlzIHJlYWQgYW5kIGVkaXRpbmcgcmVzdW1lcyB3aXRoIGZpcnN0Citjb21tYW5kIGluIHNjcmlwdC48L3A+PC9kZD4KKworCis8ZHQ+PGI+RDwvYj4gWzxlbT5hZGRyZXNzMTwvZW0+Wyw8ZW0+YWRkcmVzczI8L2VtPl1dPGI+RDwvYj48L2R0PgorPGRkPkRlbGV0ZSBmaXJzdCBwYXJ0ICh1cCB0byBlbWJlZGRlZCBuZXdsaW5lKSBvZiBtdWx0aWxpbmUgcGF0dGVybiBzcGFjZSBjcmVhdGVkCitieSA8Yj5OPC9iPiBjb21tYW5kIGFuZCByZXN1bWUgZWRpdGluZyB3aXRoIGZpcnN0IGNvbW1hbmQgaW4KK3NjcmlwdC4gIElmIHRoaXMgY29tbWFuZCBlbXB0aWVzIHRoZSBwYXR0ZXJuIHNwYWNlLCB0aGVuIGEgbmV3IGxpbmUKK29mIGlucHV0IGlzIHJlYWQsIGFzIGlmIHRoZSA8Yj5kPC9iPiBjb21tYW5kIGhhZCBiZWVuIGV4ZWN1dGVkLjwvcD48L2RkPgorCisKKzxkdD48Yj5nPC9iPiBbPGVtPmFkZHJlc3MxPC9lbT5bLDxlbT5hZGRyZXNzMjwvZW0+XV08Yj5nPC9iPjwvZHQ+Cis8ZGQ+Q29weSAoZ2V0KSBjb250ZW50cyBvZiBob2xkIHNwYWNlIChzZWUgPGI+aDwvYj4gb3IKKzxiPkg8L2I+IGNvbW1hbmQpIGludG8gdGhlIHBhdHRlcm4gc3BhY2UsIHdpcGluZyBvdXQKK3ByZXZpb3VzIGNvbnRlbnRzLjwvcD48L2RkPgorCisKKzxkdD48Yj5HPC9iPiBbPGVtPmFkZHJlc3MxPC9lbT5bLDxlbT5hZGRyZXNzMjwvZW0+XV08Yj5HPC9iPjwvZHQ+Cis8ZGQ+QXBwZW5kIG5ld2xpbmUgZm9sbG93ZWQgYnkgY29udGVudHMgb2YgaG9sZCBzcGFjZSAoc2VlCis8Yj5oPC9iPiBvciA8Yj5IPC9iPiBjb21tYW5kKSB0byBjb250ZW50cyBvZgordGhlIHBhdHRlcm4gc3BhY2UuICBJZiBob2xkIHNwYWNlIGlzIGVtcHR5LCBhIG5ld2xpbmUgaXMgc3RpbGwKK2FwcGVuZGVkIHRvIHRoZSBwYXR0ZXJuIHNwYWNlLjwvcD48L2RkPgorCisKKzxkdD48Yj5oPC9iPiBbPGVtPmFkZHJlc3MxPC9lbT5bLDxlbT5hZGRyZXNzMjwvZW0+XV08Yj5oPC9iPjwvZHQ+Cis8ZGQ+Q29weSBwYXR0ZXJuIHNwYWNlIGludG8gaG9sZCBzcGFjZSwgYSBzcGVjaWFsIHRlbXBvcmFyeSBidWZmZXIuCitQcmV2aW91cyBjb250ZW50cyBvZiBob2xkIHNwYWNlIGFyZSB3aXBlZCBvdXQuPC9wPjwvZGQ+CisKKworPGR0PjxiPkg8L2I+IFs8ZW0+YWRkcmVzczE8L2VtPlssPGVtPmFkZHJlc3MyPC9lbT5dXTxiPkg8L2I+PC9kdD4KKzxkZD5BcHBlbmQgbmV3bGluZSBhbmQgY29udGVudHMgb2YgcGF0dGVybiBzcGFjZSB0byBjb250ZW50cyBvZiB0aGUgaG9sZAorc3BhY2UuICBFdmVuIGlmIGhvbGQgc3BhY2UgaXMgZW1wdHksIHRoaXMgY29tbWFuZCBzdGlsbCBhcHBlbmRzIHRoZQorbmV3bGluZSBmaXJzdC48L3A+PC9kZD4KKworCis8ZHQ+PGI+aTwvYj4gWzxlbT5hZGRyZXNzMTwvZW0+XTxiPmlcPC9iPjwvZHQ+Cis8ZGQ+PGVtPnRleHQ8L2VtPjwvcD4KKworPHA+SW5zZXJ0IDxlbT50ZXh0PC9lbT4gYmVmb3JlIGVhY2ggbGluZSBtYXRjaGVkIGJ5Cis8ZW0+YWRkcmVzczwvZW0+LiAoU2VlIDxiPmE8L2I+IGZvcgorZGV0YWlscyBvbiA8ZW0+dGV4dDwvZW0+Lik8L3A+PC9kZD4KKworCis8ZHQ+PGI+bDwvYj4gWzxlbT5hZGRyZXNzMTwvZW0+Wyw8ZW0+YWRkcmVzczI8L2VtPl1dPGI+bDwvYj48L2R0PgorPGRkPkxpc3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBwYXR0ZXJuIHNwYWNlLCBzaG93aW5nIG5vbnByaW50aW5nIGNoYXJhY3RlcnMKK2FzIEFTQ0lJIGNvZGVzLiAgTG9uZyBsaW5lcyBhcmUgd3JhcHBlZC48L3A+PC9kZD4KKworCis8ZHQ+PGI+bjwvYj4gWzxlbT5hZGRyZXNzMTwvZW0+Wyw8ZW0+YWRkcmVzczI8L2VtPl1dPGI+bjwvYj48L2R0PgorPGRkPlJlYWQgbmV4dCBsaW5lIG9mIGlucHV0IGludG8gcGF0dGVybiBzcGFjZS4gIEN1cnJlbnQgbGluZSBpcyBzZW50IHRvCitzdGFuZGFyZCBvdXRwdXQuICBOZXcgbGluZSBiZWNvbWVzIGN1cnJlbnQgbGluZSBhbmQgaW5jcmVtZW50cyBsaW5lCitjb3VudGVyLiAgQ29udHJvbCBwYXNzZXMgdG8gY29tbWFuZCBmb2xsb3dpbmcgPGI+bjwvYj4KK2luc3RlYWQgb2YgcmVzdW1pbmcgYXQgdGhlIHRvcCBvZiB0aGUgc2NyaXB0LjwvcD48L2RkPgorCisKKzxkdD48Yj5OPC9iPiBbPGVtPmFkZHJlc3MxPC9lbT5bLDxlbT5hZGRyZXNzMjwvZW0+XV08Yj5OPC9iPjwvZHQ+Cis8ZGQ+QXBwZW5kIG5leHQgaW5wdXQgbGluZSB0byBjb250ZW50cyBvZiBwYXR0ZXJuIHNwYWNlOyB0aGUgbmV3IGxpbmUgaXMKK3NlcGFyYXRlZCBmcm9tIHRoZSBwcmV2aW91cyBjb250ZW50cyBvZiB0aGUgcGF0dGVybiBzcGFjZSBieSBhIG5ld2xpbmUuCisoVGhpcyBjb21tYW5kIGlzIGRlc2lnbmVkIHRvIGFsbG93IHBhdHRlcm4gbWF0Y2hlcyBhY3Jvc3MgdHdvCitsaW5lcy4gIFVzaW5nIFxuIHRvIG1hdGNoIHRoZSBlbWJlZGRlZCBuZXdsaW5lLCB5b3UgY2FuIG1hdGNoCitwYXR0ZXJucyBhY3Jvc3MgbXVsdGlwbGUgbGluZXMuKTwvcD48L2RkPgorCisKKzxkdD48Yj5wPC9iPiBbPGVtPmFkZHJlc3MxPC9lbT5bLDxlbT5hZGRyZXNzMjwvZW0+XV08Yj5wPC9iPjwvZHQ+Cis8ZGQ+UHJpbnQgdGhlIGFkZHJlc3NlZCBsaW5lKHMpLiAgTm90ZSB0aGF0IHRoaXMgY2FuIHJlc3VsdCBpbiBkdXBsaWNhdGUKK291dHB1dCB1bmxlc3MgZGVmYXVsdCBvdXRwdXQgaXMgc3VwcHJlc3NlZCBieSB1c2luZyAiI24iIG9yCit0aGUgPHNwYW4gY2xhc3M9Im9wdGlvbiI+LW48L3NwYW4+CisKK2NvbW1hbmQtbGluZSBvcHRpb24uICBUeXBpY2FsbHkgdXNlZCBiZWZvcmUgY29tbWFuZHMgdGhhdCBjaGFuZ2UgZmxvdworY29udHJvbCAoPGI+ZDwvYj4sIDxiPm48L2I+LAorPGI+YjwvYj4pIGFuZCBtaWdodCBwcmV2ZW50IHRoZSBjdXJyZW50IGxpbmUgZnJvbSBiZWluZworb3V0cHV0LjwvcD48L2RkPgorCisKKzxkdD48Yj5QPC9iPiBbPGVtPmFkZHJlc3MxPC9lbT5bLDxlbT5hZGRyZXNzMjwvZW0+XV08Yj5QPC9iPjwvZHQ+Cis8ZGQ+UHJpbnQgZmlyc3QgcGFydCAodXAgdG8gZW1iZWRkZWQgbmV3bGluZSkgb2YgbXVsdGlsaW5lIHBhdHRlcm4gc3BhY2UKK2NyZWF0ZWQgYnkgPGI+TjwvYj4gY29tbWFuZC4gIFNhbWUgYXMgPGI+cDwvYj4KK2lmIDxiPk48L2I+IGhhcyBub3QgYmVlbiBhcHBsaWVkIHRvIGEgbGluZS48L3A+PC9kZD4KKworCis8ZHQ+PGI+cTwvYj4gWzxlbT5hZGRyZXNzPC9lbT5dPGI+cTwvYj48L2R0PgorPGRkPlF1aXQgd2hlbiA8ZW0+YWRkcmVzczwvZW0+IGlzIGVuY291bnRlcmVkLiAgVGhlCithZGRyZXNzZWQgbGluZSBpcyBmaXJzdCB3cml0dGVuIHRvIG91dHB1dCAoaWYgZGVmYXVsdCBvdXRwdXQgaXMgbm90CitzdXBwcmVzc2VkKSwgYWxvbmcgd2l0aCBhbnkgdGV4dCBhcHBlbmRlZCB0byBpdCBieSBwcmV2aW91cworPGI+YTwvYj4gb3IgPGI+cjwvYj4gY29tbWFuZHMuPC9wPjwvZGQ+CisKKworPGR0PjxiPnI8L2I+IFs8ZW0+YWRkcmVzczwvZW0+XTxiPnI8L2I+IDxlbT5maWxlPC9lbT48L2R0PgorPGRkPlJlYWQgY29udGVudHMgb2YgPGVtPmZpbGU8L2VtPiBhbmQgYXBwZW5kIGFmdGVyIHRoZQorY29udGVudHMgb2YgdGhlIHBhdHRlcm4gc3BhY2UuICBFeGFjdGx5IG9uZSBzcGFjZSBtdXN0IGJlIHB1dCBiZXR3ZWVuCis8Yj5yPC9iPiBhbmQgdGhlIGZpbGVuYW1lLjwvcD48L2RkPgorCisKKzxkdD48Yj5zPC9iPiBbPGVtPmFkZHJlc3MxPC9lbT5bLDxlbT5hZGRyZXNzMjwvZW0+XV08Yj5zPC9iPi88ZW0+cGF0dGVybjwvZW0+LzxlbT5yZXBsYWNlbWVudDwvZW0+L1s8ZW0+ZmxhZ3M8L2VtPl08L2R0PgorPGRkPlN1YnN0aXR1dGUgPGVtPnJlcGxhY2VtZW50PC9lbT4gZm9yCis8ZW0+cGF0dGVybjwvZW0+IG9uIGVhY2ggYWRkcmVzc2VkIGxpbmUuICBJZiBwYXR0ZXJuCithZGRyZXNzZXMgYXJlIHVzZWQsIHRoZSBwYXR0ZXJuIDxiPi8vPC9iPiByZXByZXNlbnRzIHRoZQorbGFzdCBwYXR0ZXJuIGFkZHJlc3Mgc3BlY2lmaWVkLiAgVGhlIGZvbGxvd2luZyBmbGFncyBjYW4gYmUgc3BlY2lmaWVkOjwvcD4KKworCTxkbD4KKworCTxkdD48Yj5uPC9iPjwvZHQ+CisJPGRkPlJlcGxhY2UgPGVtPm48L2VtPnRoIGluc3RhbmNlIG9mCisJLzxlbT5wYXR0ZXJuPC9lbT4vIG9uIGVhY2ggYWRkcmVzc2VkIGxpbmUuCisJPGVtPm48L2VtPiBpcyBhbnkgbnVtYmVyIGluIHRoZSByYW5nZSAxIHRvIDUxMiwgYW5kCisJdGhlIGRlZmF1bHQgaXMgMS48L3A+PC9kZD4KKworCTxkdD48Yj5nPC9iPjwvZHQ+CisJPGRkPlJlcGxhY2UgYWxsIGluc3RhbmNlcyBvZiAvPGVtPnBhdHRlcm48L2VtPi8gb24gZWFjaAorCWFkZHJlc3NlZCBsaW5lLCBub3QganVzdCB0aGUgZmlyc3QgaW5zdGFuY2UuPC9wPjwvZGQ+CisKKwk8ZHQ+PGI+STwvYj48L2R0PgorCTxkZD5NYXRjaGluZyBpcyBjYXNlLWluc2Vuc2l0aXZlLjxwPjwvcD48L2RkPgorCisJPGR0PjxiPnA8L2I+PC9kdD4KKwk8ZGQ+UHJpbnQgdGhlIGxpbmUgaWYgYSBzdWNjZXNzZnVsIHN1YnN0aXR1dGlvbiBpcyBkb25lLiAgSWYgc2V2ZXJhbAorCXN1Y2Nlc3NmdWwgc3Vic3RpdHV0aW9ucyBhcmUgZG9uZSwgbXVsdGlwbGUgY29waWVzIG9mIHRoZSBsaW5lIHdpbGwgYmUKKwlwcmludGVkLjwvcD48L2RkPgorCisJPGR0PjxiPnc8L2I+IDxlbT5maWxlPC9lbT48L2R0PgorCTxkZD5Xcml0ZSB0aGUgbGluZSB0byA8ZW0+ZmlsZTwvZW0+IGlmIGEgcmVwbGFjZW1lbnQKKwl3YXMgZG9uZS4gIEEgbWF4aW11bSBvZiAxMCBkaWZmZXJlbnQgPGVtPmZpbGVzPC9lbT4gY2FuIGJlIG9wZW5lZC48L3A+PC9kZD4KKworCTwvZGw+CisKKzwvZGQ+CisKKworPGR0PjxiPnQ8L2I+IFs8ZW0+YWRkcmVzczE8L2VtPlssPGVtPmFkZHJlc3MyPC9lbT5dXTxiPnQgPC9iPls8ZW0+bGFiZWw8L2VtPl08L2R0PgorPGRkPlRlc3QgaWYgc3VjY2Vzc2Z1bCBzdWJzdGl0dXRpb25zIGhhdmUgYmVlbiBtYWRlIG9uIGFkZHJlc3NlZCBsaW5lcywKK2FuZCBpZiBzbywgYnJhbmNoIHRvIGxpbmUgbWFya2VkIGJ5IDo8ZW0+bGFiZWw8L2VtPi4KKyhTZWUgPGI+YjwvYj4gYW5kIDxiPjo8L2I+LikgIElmIGxhYmVsIGlzIG5vdAorc3BlY2lmaWVkLCBjb250cm9sIGZhbGxzIHRocm91Z2ggdG8gYm90dG9tIG9mIHNjcmlwdC48L3A+PC9kZD4KKworCis8ZHQ+PGI+dzwvYj4gWzxlbT5hZGRyZXNzMTwvZW0+Wyw8ZW0+YWRkcmVzczI8L2VtPl1dPGI+dzwvYj4gPGVtPmZpbGU8L2VtPjwvZHQ+Cis8ZGQ+QXBwZW5kIGNvbnRlbnRzIG9mIHBhdHRlcm4gc3BhY2UgdG8gPGVtPmZpbGU8L2VtPi4KK1RoaXMgYWN0aW9uIG9jY3VycyB3aGVuIHRoZSBjb21tYW5kIGlzIGVuY291bnRlcmVkIHJhdGhlciB0aGFuIHdoZW4KK3RoZSBwYXR0ZXJuIHNwYWNlIGlzIG91dHB1dC4gIEV4YWN0bHkgb25lIHNwYWNlIG11c3Qgc2VwYXJhdGUgdGhlCis8Yj53PC9iPiBhbmQgdGhlIGZpbGVuYW1lLiAgQSBtYXhpbXVtIG9mIDEwIGRpZmZlcmVudAorZmlsZXMgY2FuIGJlIG9wZW5lZCBpbiBhIHNjcmlwdC4gIFRoaXMgY29tbWFuZCB3aWxsIGNyZWF0ZSB0aGUgZmlsZSBpZgoraXQgZG9lcyBub3QgZXhpc3Q7IGlmIHRoZSBmaWxlIGV4aXN0cywgaXRzIGNvbnRlbnRzIHdpbGwgYmUKK292ZXJ3cml0dGVuIGVhY2ggdGltZSB0aGUgc2NyaXB0IGlzIGV4ZWN1dGVkLiAgTXVsdGlwbGUgd3JpdGUgY29tbWFuZHMKK3RoYXQgZGlyZWN0IG91dHB1dCB0byB0aGUgc2FtZSBmaWxlIGFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLjwvcD48L2RkPgorCisKKzxkdD48Yj54PC9iPiBbPGVtPmFkZHJlc3MxPC9lbT5bLDxlbT5hZGRyZXNzMjwvZW0+XV08Yj54PC9iPjwvZHQ+Cis8ZGQ+RXhjaGFuZ2UgY29udGVudHMgb2YgdGhlIHBhdHRlcm4gc3BhY2Ugd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIGhvbGQKK3NwYWNlLjwvcD48L2RkPgorCisKKzxkdD48Yj55PC9iPiBbPGVtPmFkZHJlc3MxPC9lbT5bLDxlbT5hZGRyZXNzMjwvZW0+XV08Yj55PC9iPi88ZW0+YWJjPC9lbT4vPGVtPnh5ejwvZW0+LzwvZHQ+Cis8ZGQ+VHJhbnNmb3JtIGVhY2ggY2hhcmFjdGVyIGJ5IHBvc2l0aW9uIGluIHN0cmluZworPGVtPmFiYzwvZW0+IHRvIGl0cyBlcXVpdmFsZW50IGluIHN0cmluZworPGVtPnh5ejwvZW0+LjwvcD48L2RkPgorCisKKzwvZGw+CmRpZmYgLS1naXQgYS9lZGl0b3JzL3ZpLmMgYi9lZGl0b3JzL3ZpLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM1NTcxMgotLS0gL2Rldi9udWxsCisrKyBiL2VkaXRvcnMvdmkuYwpAQCAtMCwwICsxLDQ1MDMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHRpbnkgdmkuYzogQSBzbWFsbCAndmknIGNsb25lCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsIDIwMDEgU3RlcmxpbmcgSHV4bGV5IDxzdGVybGluZ0BldXJvcGEuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKKyAqIFRoaW5ncyBUbyBEbzoKKyAqCUVYSU5JVAorICoJJEhPTUUvLmV4cmMgIGFuZCAgLi8uZXhyYworICoJYWRkIG1hZ2ljIHRvIHNlYXJjaAkvZm9vLipiYXIKKyAqCWFkZCA6aGVscCBjb21tYW5kCisgKgk6bWFwIG1hY3JvcworICoJaWYgbWFya1tdIHZhbHVlcyB3ZXJlIGxpbmUgbnVtYmVycyByYXRoZXIgdGhhbiBwb2ludGVycworICogICAgICBpdCB3b3VsZCBiZSBlYXNpZXIgdG8gY2hhbmdlIHRoZSBtYXJrIHdoZW4gYWRkL2RlbGV0ZSBsaW5lcworICoJTW9yZSBpbnRlbGxpZ2VuY2UgaW4gcmVmcmVzaCgpCisgKgkiOnIgIWNtZCIgIGFuZCAgIiFjbWQiICB0byBmaWx0ZXIgdGV4dCB0aHJvdWdoIGFuIGV4dGVybmFsIGNvbW1hbmQKKyAqCUFuICJleCIgbGluZSBvcmllbnRlZCBtb2RlLSBtYXliZSB1c2luZyAiY21kZWRpdCIKKyAqLworCisvL2NvbmZpZzpjb25maWcgVkkKKy8vY29uZmlnOglib29sICJ2aSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICAndmknIGlzIGEgdGV4dCBlZGl0b3IuIE1vcmUgc3BlY2lmaWNhbGx5LCBpdCBpcyB0aGUgT25lIFRydWUKKy8vY29uZmlnOgkgIHRleHQgZWRpdG9yIDxncmluPi4gSXQgZG9lcywgaG93ZXZlciwgaGF2ZSBhIHJhdGhlciBzdGVlcAorLy9jb25maWc6CSAgbGVhcm5pbmcgY3VydmUuIElmIHlvdSBhcmUgbm90IGFscmVhZHkgY29tZm9ydGFibGUgd2l0aCAndmknCisvL2NvbmZpZzoJICB5b3UgbWF5IHdpc2ggdG8gdXNlIHNvbWV0aGluZyBlbHNlLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WSV9NQVhfTEVOCisvL2NvbmZpZzoJaW50ICJNYXhpbXVtIHNjcmVlbiB3aWR0aCBpbiB2aSIKKy8vY29uZmlnOglyYW5nZSAyNTYgMTYzODQKKy8vY29uZmlnOglkZWZhdWx0IDQwOTYKKy8vY29uZmlnOglkZXBlbmRzIG9uIFZJCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQ29udHJhcnkgdG8gd2hhdCB5b3UgbWF5IHRoaW5rLCB0aGlzIGlzIG5vdCBlYXRpbmcgbXVjaC4KKy8vY29uZmlnOgkgIE1ha2UgaXQgc21hbGxlciB0aGFuIDRrIG9ubHkgaWYgeW91IGFyZSB2ZXJ5IGxpbWl0ZWQgb24gbWVtb3J5LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WSV84QklUCisvL2NvbmZpZzoJYm9vbCAiQWxsb3cgdmkgdG8gZGlzcGxheSA4LWJpdCBjaGFycyAob3RoZXJ3aXNlIHNob3dzIGRvdHMpIgorLy9jb25maWc6CWRlZmF1bHQgbgorLy9jb25maWc6CWRlcGVuZHMgb24gVkkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBJZiB5b3VyIHRlcm1pbmFsIGNhbiBkaXNwbGF5IGNoYXJhY3RlcnMgd2l0aCBoaWdoIGJpdCBzZXQsCisvL2NvbmZpZzoJICB5b3UgbWF5IHdhbnQgdG8gZW5hYmxlIHRoaXMuIE5vdGU6IHZpIGlzIG5vdCBVbmljb2RlLWNhcGFibGUuCisvL2NvbmZpZzoJICBJZiB5b3VyIHRlcm1pbmFsIGNvbWJpbmVzIHNldmVyYWwgOC1iaXQgYnl0ZXMgaW50byBvbmUgY2hhcmFjdGVyCisvL2NvbmZpZzoJICAoYXMgaW4gVW5pY29kZSBtb2RlKSwgdGhpcyB3aWxsIG5vdCB3b3JrIHByb3Blcmx5LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WSV9DT0xPTgorLy9jb25maWc6CWJvb2wgIkVuYWJsZSBcIjpcIiBjb2xvbiBjb21tYW5kcyAobm8gXCJleFwiIG1vZGUpIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVkkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgYSBsaW1pdGVkIHNldCBvZiBjb2xvbiBjb21tYW5kcyBmb3IgdmkuIFRoaXMgZG9lcyBub3QKKy8vY29uZmlnOgkgIHByb3ZpZGUgYW4gImV4IiBtb2RlLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WSV9ZQU5LTUFSSworLy9jb25maWc6CWJvb2wgIkVuYWJsZSB5YW5rL3B1dCBjb21tYW5kcyBhbmQgbWFyayBjbWRzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVkkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGlzIHdpbGwgZW5hYmxlIHlvdSB0byB1c2UgeWFuayBhbmQgcHV0LCBhcyB3ZWxsIGFzIG1hcmsgaW4KKy8vY29uZmlnOgkgIGJ1c3lib3ggdmkuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1ZJX1NFQVJDSAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSBzZWFyY2ggYW5kIHJlcGxhY2UgY21kcyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFZJCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU2VsZWN0IHRoaXMgaWYgeW91IHdpc2ggdG8gYmUgYWJsZSB0byBkbyBzZWFyY2ggYW5kIHJlcGxhY2UgaW4KKy8vY29uZmlnOgkgIGJ1c3lib3ggdmkuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1ZJX1JFR0VYX1NFQVJDSAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSByZWdleCBpbiBzZWFyY2ggYW5kIHJlcGxhY2UiCisvL2NvbmZpZzoJZGVmYXVsdCBuICAgIyBVc2VzIEdOVSByZWdleCwgd2hpY2ggbWF5IGJlIHVuYXZhaWxhYmxlLiBGSVhNRQorLy9jb25maWc6CWRlcGVuZHMgb24gRkVBVFVSRV9WSV9TRUFSQ0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBVc2UgZXh0ZW5kZWQgcmVnZXggc2VhcmNoLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WSV9VU0VfU0lHTkFMUworLy9jb25maWc6CWJvb2wgIkNhdGNoIHNpZ25hbHMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBWSQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFNlbGVjdGluZyB0aGlzIG9wdGlvbiB3aWxsIG1ha2UgYnVzeWJveCB2aSBzaWduYWwgYXdhcmUuIFRoaXMgd2lsbAorLy9jb25maWc6CSAgbWFrZSBidXN5Ym94IHZpIHN1cHBvcnQgU0lHV0lOQ0ggdG8gZGVhbCB3aXRoIFdpbmRvdyBDaGFuZ2VzLCBjYXRjaAorLy9jb25maWc6CSAgQ3RybC1aIGFuZCBDdHJsLUMgYW5kIGFsYXJtcy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVklfRE9UX0NNRAorLy9jb25maWc6CWJvb2wgIlJlbWVtYmVyIHByZXZpb3VzIGNtZCBhbmQgXCIuXCIgY21kIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVkkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBNYWtlIGJ1c3lib3ggdmkgcmVtZW1iZXIgdGhlIGxhc3QgY29tbWFuZCBhbmQgYmUgYWJsZSB0byByZXBlYXQgaXQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1ZJX1JFQURPTkxZCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1SIG9wdGlvbiBhbmQgXCJ2aWV3XCIgbW9kZSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFZJCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHRoZSByZWFkLW9ubHkgY29tbWFuZCBsaW5lIG9wdGlvbiwgd2hpY2ggYWxsb3dzIHRoZSB1c2VyIHRvCisvL2NvbmZpZzoJICBvcGVuIGEgZmlsZSBpbiByZWFkLW9ubHkgbW9kZS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVklfU0VUT1BUUworLy9jb25maWc6CWJvb2wgIkVuYWJsZSBzZXQtYWJsZSBvcHRpb25zLCBhaSBpYyBzaG93bWF0Y2giCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBWSQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSB0aGUgZWRpdG9yIHRvIHNldCBzb21lIChhaSwgaWMsIHNob3dtYXRjaCkgb3B0aW9ucy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVklfU0VUCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCBmb3IgOnNldCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFZJCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU3VwcG9ydCBmb3IgIjpzZXQiLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WSV9XSU5fUkVTSVpFCisvL2NvbmZpZzoJYm9vbCAiSGFuZGxlIHdpbmRvdyByZXNpemUiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBWSQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIE1ha2UgYnVzeWJveCB2aSBiZWhhdmUgbmljZWx5IHdpdGggdGVybWluYWxzIHRoYXQgZ2V0IHJlc2l6ZWQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1ZJX0FTS19URVJNSU5BTAorLy9jb25maWc6CWJvb2wgIlVzZSAndGVsbCBtZSBjdXJzb3IgcG9zaXRpb24nIEVTQyBzZXF1ZW5jZSB0byBtZWFzdXJlIHdpbmRvdyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFZJCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgSWYgdGVybWluYWwgc2l6ZSBjYW4ndCBiZSByZXRyaWV2ZWQgYW5kICRMSU5FUy8kQ09MVU1OUyBhcmUgbm90IHNldCwKKy8vY29uZmlnOgkgIHRoaXMgb3B0aW9uIG1ha2VzIHZpIHBlcmZvcm0gYSBsYXN0LWRpdGNoIGVmZm9ydCB0byBmaW5kIGl0OgorLy9jb25maWc6CSAgcG9zaXRpb24gY3Vyc29yIHRvIDk5OSw5OTkgYW5kIGFzayB0ZXJtaW5hbCB0byByZXBvcnQgcmVhbAorLy9jb25maWc6CSAgY3Vyc29yIHBvc2l0aW9uIHVzaW5nICJFU0MgWyA2IG4iIGVzY2FwZSBzZXF1ZW5jZSwgdGhlbiByZWFkIHN0ZGluLgorLy9jb25maWc6CisvL2NvbmZpZzoJICBUaGlzIGlzIG5vdCBjbGVhbiBidXQgaGVscHMgYSBsb3Qgb24gc2VyaWFsIGxpbmVzIGFuZCBzdWNoLgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVklfVU5ETworLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgdW5kbyBjb21tYW5kICd1JyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFZJCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU3VwcG9ydCB0aGUgJ3UnIGNvbW1hbmQgdG8gdW5kbyBpbnNlcnRpb24sIGRlbGV0aW9uLCBhbmQgcmVwbGFjZW1lbnQKKy8vY29uZmlnOgkgIG9mIHRleHQuCisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WSV9VTkRPX1FVRVVFCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIHVuZG8gb3BlcmF0aW9uIHF1ZXVpbmciCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGRUFUVVJFX1ZJX1VORE8KKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGUgdmkgdW5kbyBmdW5jdGlvbnMgY2FuIHVzZSBhbiBpbnRlcm1lZGlhdGUgcXVldWUgdG8gZ3JlYXRseSBsb3dlcgorLy9jb25maWc6CSAgbWFsbG9jKCkgY2FsbHMgYW5kIG92ZXJoZWFkLiBXaGVuIHRoZSBtYXhpbXVtIHNpemUgb2YgdGhpcyBxdWV1ZSBpcworLy9jb25maWc6CSAgcmVhY2hlZCwgdGhlIGNvbnRlbnRzIG9mIHRoZSBxdWV1ZSBhcmUgY29tbWl0dGVkIHRvIHRoZSB1bmRvIHN0YWNrLgorLy9jb25maWc6CSAgVGhpcyBpbmNyZWFzZXMgdGhlIHNpemUgb2YgdGhlIHVuZG8gY29kZSBhbmQgYWxsb3dzIHNvbWUgdW5kbworLy9jb25maWc6CSAgb3BlcmF0aW9ucyAoZXNwZWNpYWxseSB1bi10eXBpbmcvYmFja3NwYWNpbmcpIHRvIGJlIGZhciBtb3JlIHVzZWZ1bC4KKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1ZJX1VORE9fUVVFVUVfTUFYCisvL2NvbmZpZzoJaW50ICJNYXhpbXVtIHVuZG8gY2hhcmFjdGVyIHF1ZXVlIHNpemUiCisvL2NvbmZpZzoJZGVmYXVsdCAyNTYKKy8vY29uZmlnOglyYW5nZSAzMiA2NTUzNgorLy9jb25maWc6CWRlcGVuZHMgb24gRkVBVFVSRV9WSV9VTkRPX1FVRVVFCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVGhpcyBvcHRpb24gc2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgYXQgcnVudGltZSBmb3IgdGhlIHF1ZXVlLgorLy9jb25maWc6CSAgU21hbGxlciB2YWx1ZXMgd2lsbCBjcmVhdGUgbW9yZSB1bmRvIG9iamVjdHMgYW5kIHJlZHVjZSB0aGUgYW1vdW50CisvL2NvbmZpZzoJICBvZiB0eXBlZCBvciBiYWNrc3BhY2VkIGNoYXJhY3RlcnMgdGhhdCBhcmUgZ3JvdXBlZCBpbnRvIG9uZSB1bmRvCisvL2NvbmZpZzoJICBvcGVyYXRpb247IGxhcmdlciB2YWx1ZXMgaW5jcmVhc2UgdGhlIHBvdGVudGlhbCBzaXplIG9mIGVhY2ggdW5kbworLy9jb25maWc6CSAgYW5kIHdpbGwgZ2VuZXJhbGx5IG1hbGxvYygpIGxhcmdlciBvYmplY3RzIGFuZCBsZXNzIGZyZXF1ZW50bHkuCisvL2NvbmZpZzoJICBVbmxlc3MgeW91IHdhbnQgbW9yZSAob3IgbGVzcykgZnJlcXVlbnQgInVuZG8gcG9pbnRzIiB3aGlsZSB0eXBpbmcsCisvL2NvbmZpZzoJICB5b3Ugc2hvdWxkIHByb2JhYmx5IGxlYXZlIHRoaXMgdW5jaGFuZ2VkLgorCisvL2FwcGxldDpJRl9WSShBUFBMRVQodmksIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19WSSkgKz0gdmkubworCisvL3VzYWdlOiNkZWZpbmUgdmlfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgdmlfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJFZGl0IEZJTEVcbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVklfQ09MT04oCisvL3VzYWdlOiAgICAgIlxuCS1jIENNRAlJbml0aWFsIGNvbW1hbmQgdG8gcnVuICgkRVhJTklUIGFsc28gYXZhaWxhYmxlKSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVklfUkVBRE9OTFkoCisvL3VzYWdlOiAgICAgIlxuCS1SCVJlYWQtb25seSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLUgJTGlzdCBhdmFpbGFibGUgZmVhdHVyZXMiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorLyogU2hvdWxkIGJlIGFmdGVyIGxpYmJiLmg6IG9uIHNvbWUgc3lzdGVtcyByZWdleC5oIG5lZWRzIHN5cy90eXBlcy5oOiAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1JFR0VYX1NFQVJDSAorIyBpbmNsdWRlIDxyZWdleC5oPgorI2VuZGlmCisKKy8qIHRoZSBDUkFTSE1FIGNvZGUgaXMgdW5tYWludGFpbmVkLCBhbmQgZG9lc24ndCBjdXJyZW50bHkgYnVpbGQgKi8KKyNkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfVklfQ1JBU0hNRSAwCisKKworI2lmIEVOQUJMRV9MT0NBTEVfU1VQUE9SVAorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfOEJJVAorLy9GSVhNRTogdGhpcyBkb2VzIG5vdCB3b3JrIHByb3Blcmx5IGZvciBVbmljb2RlIGFueXdheQorIyBkZWZpbmUgSXNwcmludChjKSAoaXNwcmludCkoYykKKyNlbHNlCisjIGRlZmluZSBJc3ByaW50KGMpIGlzcHJpbnRfYXNjaWlvbmx5KGMpCisjZW5kaWYKKworI2Vsc2UKKworLyogMHg5YiBpcyBNZXRhLUVTQyAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJXzhCSVQKKyMgZGVmaW5lIElzcHJpbnQoYykgKCh1bnNpZ25lZCBjaGFyKShjKSA+PSAnICcgJiYgKGMpICE9IDB4N2YgJiYgKHVuc2lnbmVkIGNoYXIpKGMpICE9IDB4OWIpCisjZWxzZQorIyBkZWZpbmUgSXNwcmludChjKSAoKHVuc2lnbmVkIGNoYXIpKGMpID49ICcgJyAmJiAodW5zaWduZWQgY2hhcikoYykgPCAweDdmKQorI2VuZGlmCisKKyNlbmRpZgorCisKK2VudW0geworCU1BWF9UQUJTVE9QID0gMzIsIC8vIHNhbml0eSBsaW1pdAorCS8vIFVzZXIgaW5wdXQgbGVuLiBOZWVkIG5vdCBiZSBleHRyYSBiaWcuCisJLy8gTGluZXMgaW4gZmlsZSBiZWluZyBlZGl0ZWQgKmNhbiogYmUgYmlnZ2VyIHRoYW4gdGhpcy4KKwlNQVhfSU5QVVRfTEVOID0gMTI4LAorCS8vIFNhbml0eSBsaW1pdHMuIFdlIGhhdmUgb25seSBvbmUgYnVmZmVyIG9mIHRoaXMgc2l6ZS4KKwlNQVhfU0NSX0NPTFMgPSBDT05GSUdfRkVBVFVSRV9WSV9NQVhfTEVOLAorCU1BWF9TQ1JfUk9XUyA9IENPTkZJR19GRUFUVVJFX1ZJX01BWF9MRU4sCit9OworCisvKiBWVDEwMiBFU0Mgc2VxdWVuY2VzLgorICogU2VlICJYdGVybSBDb250cm9sIFNlcXVlbmNlcyIKKyAqIGh0dHA6Ly9pbnZpc2libGUtaXNsYW5kLm5ldC94dGVybS9jdGxzZXFzL2N0bHNlcXMuaHRtbAorICovCisvKiBJbnZlcnNlL05vcm1hbCB0ZXh0ICovCisjZGVmaW5lIEVTQ19CT0xEX1RFWFQgIlwwMzNbN20iCisjZGVmaW5lIEVTQ19OT1JNX1RFWFQgIlwwMzNbMG0iCisvKiBCZWxsICovCisjZGVmaW5lIEVTQ19CRUxMICJcMDA3IgorLyogQ2xlYXItdG8tZW5kLW9mLWxpbmUgKi8KKyNkZWZpbmUgRVNDX0NMRUFSMkVPTCAiXDAzM1tLIgorLyogQ2xlYXItdG8tZW5kLW9mLXNjcmVlbi4KKyAqIChXZSB1c2UgZGVmYXVsdCBwYXJhbSBoZXJlLgorICogRnVsbCBzZXF1ZW5jZSBpcyAiRVNDIFsgPG51bT4gSiIsCisgKiA8bnVtPiBpcyAwLzEvMiA9ICJlcmFzZSBiZWxvdy9hYm92ZS9hbGwiLikKKyAqLworI2RlZmluZSBFU0NfQ0xFQVIyRU9TICJcMDMzW0oiCisvKiBDdXJzb3IgdG8gZ2l2ZW4gY29vcmRpbmF0ZSAoMSwxOiB0b3AgbGVmdCkgKi8KKyNkZWZpbmUgRVNDX1NFVF9DVVJTT1JfUE9TICJcMDMzWyV1OyV1SCIKKy8vVU5VU0VECisvLy8qIEN1cnNvciB1cCBhbmQgZG93biAqLworLy8jZGVmaW5lIEVTQ19DVVJTT1JfVVAgIlwwMzNbQSIKKy8vI2RlZmluZSBFU0NfQ1VSU09SX0RPV04gIlxuIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfRE9UX0NNRCB8fCBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSworLy8gY21kcyBtb2RpZnlpbmcgdGV4dFtdCisvLyB2ZGE6IHJlbW92ZWQgImFBaUlzIiBhcyB0aGV5IHN3aXRjaCB1cyBpbnRvIGluc2VydCBtb2RlCisvLyBhbmQgcmVtZW1iZXJpbmcgaW5wdXQgZm9yIHJlcGxheSBhZnRlciB0aGVtIG1ha2VzIG5vIHNlbnNlCitzdGF0aWMgY29uc3QgY2hhciBtb2RpZnlpbmdfY21kc1tdID0gImNDZERKb09wUHJSeFg8Pn4iOworI2VuZGlmCisKK2VudW0geworCVlBTktPTkxZID0gRkFMU0UsCisJWUFOS0RFTCA9IFRSVUUsCisJRk9SV0FSRCA9IDEsCS8vIGNvZGUgZGVwZW5kcyBvbiAiMSIgIGZvciBhcnJheSBpbmRleAorCUJBQ0sgPSAtMSwJLy8gY29kZSBkZXBlbmRzIG9uICItMSIgZm9yIGFycmF5IGluZGV4CisJTElNSVRFRCA9IDAsCS8vIGhvdyBtdWNoIG9mIHRleHRbXSBpbiBjaGFyX3NlYXJjaAorCUZVTEwgPSAxLAkvLyBob3cgbXVjaCBvZiB0ZXh0W10gaW4gY2hhcl9zZWFyY2gKKworCVNfQkVGT1JFX1dTID0gMSwJLy8gdXNlZCBpbiBza2lwX3RoaW5nKCkgZm9yIG1vdmluZyAiZG90IgorCVNfVE9fV1MgPSAyLAkJLy8gdXNlZCBpbiBza2lwX3RoaW5nKCkgZm9yIG1vdmluZyAiZG90IgorCVNfT1ZFUl9XUyA9IDMsCQkvLyB1c2VkIGluIHNraXBfdGhpbmcoKSBmb3IgbW92aW5nICJkb3QiCisJU19FTkRfUFVOQ1QgPSA0LAkvLyB1c2VkIGluIHNraXBfdGhpbmcoKSBmb3IgbW92aW5nICJkb3QiCisJU19FTkRfQUxOVU0gPSA1LAkvLyB1c2VkIGluIHNraXBfdGhpbmcoKSBmb3IgbW92aW5nICJkb3QiCit9OworCisKKy8qIHZpLmMgZXhwZWN0cyBjaGFycyB0byBiZSB1bnNpZ25lZC4gKi8KKy8qIGJ1c3lib3ggYnVpbGQgc3lzdGVtIHByb3ZpZGVzIHRoYXQsIGJ1dCBpdCdzIGJldHRlciAqLworLyogdG8gYXVkaXQgYW5kIGZpeCB0aGUgc291cmNlICovCisKK3N0cnVjdCBnbG9iYWxzIHsKKwkvKiBtYW55IHJlZmVyZW5jZXMgLSBrZWVwIG5lYXIgdGhlIHRvcCBvZiBnbG9iYWxzICovCisJY2hhciAqdGV4dCwgKmVuZDsgICAgICAgLy8gcG9pbnRlcnMgdG8gdGhlIHVzZXIgZGF0YSBpbiBtZW1vcnkKKwljaGFyICpkb3Q7ICAgICAgICAgICAgICAvLyB3aGVyZSBhbGwgdGhlIGFjdGlvbiB0YWtlcyBwbGFjZQorCWludCB0ZXh0X3NpemU7CQkvLyBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyCisKKwkvKiB0aGUgcmVzdCAqLworCXNtYWxsaW50IHZpX3NldG9wczsKKyNkZWZpbmUgVklfQVVUT0lOREVOVCAxCisjZGVmaW5lIFZJX1NIT1dNQVRDSCAgMgorI2RlZmluZSBWSV9JR05PUkVDQVNFIDQKKyNkZWZpbmUgVklfRVJSX01FVEhPRCA4CisjZGVmaW5lIGF1dG9pbmRlbnQgKHZpX3NldG9wcyAmIFZJX0FVVE9JTkRFTlQpCisjZGVmaW5lIHNob3dtYXRjaCAgKHZpX3NldG9wcyAmIFZJX1NIT1dNQVRDSCApCisjZGVmaW5lIGlnbm9yZWNhc2UgKHZpX3NldG9wcyAmIFZJX0lHTk9SRUNBU0UpCisvKiBpbmRpY2F0ZSBlcnJvciB3aXRoIGJlZXAgb3IgZmxhc2ggKi8KKyNkZWZpbmUgZXJyX21ldGhvZCAodmlfc2V0b3BzICYgVklfRVJSX01FVEhPRCkKKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1JFQURPTkxZCisJc21hbGxpbnQgcmVhZG9ubHlfbW9kZTsKKyNkZWZpbmUgU0VUX1JFQURPTkxZX0ZJTEUoZmxhZ3MpICAgICAgICAoKGZsYWdzKSB8PSAweDAxKQorI2RlZmluZSBTRVRfUkVBRE9OTFlfTU9ERShmbGFncykgICAgICAgICgoZmxhZ3MpIHw9IDB4MDIpCisjZGVmaW5lIFVOU0VUX1JFQURPTkxZX0ZJTEUoZmxhZ3MpICAgICAgKChmbGFncykgJj0gMHhmZSkKKyNlbHNlCisjZGVmaW5lIFNFVF9SRUFET05MWV9GSUxFKGZsYWdzKSAgICAgICAgKCh2b2lkKTApCisjZGVmaW5lIFNFVF9SRUFET05MWV9NT0RFKGZsYWdzKSAgICAgICAgKCh2b2lkKTApCisjZGVmaW5lIFVOU0VUX1JFQURPTkxZX0ZJTEUoZmxhZ3MpICAgICAgKCh2b2lkKTApCisjZW5kaWYKKworCXNtYWxsaW50IGVkaXRpbmc7ICAgICAgICAvLyA+MCB3aGlsZSB3ZSBhcmUgZWRpdGluZyBhIGZpbGUKKwkgICAgICAgICAgICAgICAgICAgICAgICAgLy8gW2NvZGUgYXVkaXQgc2F5cyAiY2FuIGJlIDAsIDEgb3IgMiBvbmx5Il0KKwlzbWFsbGludCBjbWRfbW9kZTsgICAgICAgLy8gMD1jb21tYW5kICAxPWluc2VydCAyPXJlcGxhY2UKKwlpbnQgbW9kaWZpZWRfY291bnQ7ICAgICAgLy8gYnVmZmVyIGNvbnRlbnRzIGNoYW5nZWQgaWYgITAKKwlpbnQgbGFzdF9tb2RpZmllZF9jb3VudDsgLy8gPSAtMTsKKwlpbnQgc2F2ZV9hcmdjOyAgICAgICAgICAgLy8gaG93IG1hbnkgZmlsZSBuYW1lcyBvbiBjbWQgbGluZQorCWludCBjbWRjbnQ7ICAgICAgICAgICAgICAvLyByZXBldGl0aW9uIGNvdW50CisJdW5zaWduZWQgcm93cywgY29sdW1uczsJIC8vIHRoZSB0ZXJtaW5hbCBzY3JlZW4gaXMgdGhpcyBzaXplCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfQVNLX1RFUk1JTkFMCisJaW50IGdldF9yb3djb2xfZXJyb3I7CisjZW5kaWYKKwlpbnQgY3JvdywgY2NvbDsgICAgICAgICAgLy8gY3Vyc29yIGlzIG9uIENyb3cgeCBDY29sCisJaW50IG9mZnNldDsgICAgICAgICAgICAgIC8vIGNoYXJzIHNjcm9sbGVkIG9mZiB0aGUgc2NyZWVuIHRvIHRoZSBsZWZ0CisJaW50IGhhdmVfc3RhdHVzX21zZzsgICAgIC8vIGlzIGRlZmF1bHQgZWRpdCBzdGF0dXMgbmVlZGVkPworCSAgICAgICAgICAgICAgICAgICAgICAgICAvLyBbZG9uJ3QgbWFrZSBzbWFsbGludCFdCisJaW50IGxhc3Rfc3RhdHVzX2Nrc3VtOyAgIC8vIGhhc2ggb2YgY3VycmVudCBzdGF0dXMgbGluZQorCWNoYXIgKmN1cnJlbnRfZmlsZW5hbWU7CisJY2hhciAqc2NyZWVuYmVnaW47ICAgICAgIC8vIGluZGV4IGludG8gdGV4dFtdLCBvZiB0b3AgbGluZSBvbiB0aGUgc2NyZWVuCisJY2hhciAqc2NyZWVuOyAgICAgICAgICAgIC8vIHBvaW50ZXIgdG8gdGhlIHZpcnR1YWwgc2NyZWVuIGJ1ZmZlcgorCWludCBzY3JlZW5zaXplOyAgICAgICAgICAvLyAgICAgICAgICAgIGFuZCBpdHMgc2l6ZQorCWludCB0YWJzdG9wOworCWludCBsYXN0X2ZvcndhcmRfY2hhcjsgICAvLyBsYXN0IGNoYXIgc2VhcmNoZWQgZm9yIHdpdGggJ2YnIChpbnQgYmVjYXVzZSBvZiBVbmljb2RlKQorCWNoYXIgZXJhc2VfY2hhcjsgICAgICAgICAvLyB0aGUgdXNlcnMgZXJhc2UgY2hhcmFjdGVyCisJY2hhciBsYXN0X2lucHV0X2NoYXI7ICAgIC8vIGxhc3QgY2hhciByZWFkIGZyb20gdXNlcgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfRE9UX0NNRAorCXNtYWxsaW50IGFkZGluZzJxOwkgLy8gYXJlIHdlIGN1cnJlbnRseSBhZGRpbmcgdXNlciBpbnB1dCB0byBxCisJaW50IGxtY19sZW47ICAgICAgICAgICAgIC8vIGxlbmd0aCBvZiBsYXN0X21vZGlmeWluZ19jbWQKKwljaGFyICppb3EsICppb3Ffc3RhcnQ7ICAgLy8gcG9pbnRlciB0byBzdHJpbmcgZm9yIGdldF9vbmVfY2hhciB0byAicmVhZCIKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1VTRV9TSUdOQUxTIHx8IEVOQUJMRV9GRUFUVVJFX1ZJX0NSQVNITUUKKwlpbnQgbXlfcGlkOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VBUkNICisJY2hhciAqbGFzdF9zZWFyY2hfcGF0dGVybjsgLy8gbGFzdCBwYXR0ZXJuIGZyb20gYSAnLycgb3IgJz8nIHNlYXJjaAorI2VuZGlmCisKKwkvKiBmb3JtZXIgc3RhdGljcyAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCisJY2hhciAqZWRpdF9maWxlX19jdXJfbGluZTsKKyNlbmRpZgorCWludCByZWZyZXNoX19vbGRfb2Zmc2V0OworCWludCBmb3JtYXRfZWRpdF9zdGF0dXNfX3RvdDsKKworCS8qIGEgZmV3IHJlZmVyZW5jZXMgb25seSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCisJaW50IFlEcmVnLCBVcmVnOyAgICAgICAgLy8gZGVmYXVsdCBkZWxldGUgcmVnaXN0ZXIgYW5kIG9yaWcgbGluZSBmb3IgIlUiCisJY2hhciAqcmVnWzI4XTsgICAgICAgICAgLy8gbmFtZWQgcmVnaXN0ZXIgYS16LCAiRCIsIGFuZCAiVSIgMC0yNSwyNiwyNworCWNoYXIgKm1hcmtbMjhdOyAgICAgICAgIC8vIHVzZXIgbWFya3MgcG9pbnRzIHNvbWV3aGVyZSBpbiB0ZXh0W10tICBhLXogYW5kIHByZXZpb3VzIGNvbnRleHQgJycKKwljaGFyICpjb250ZXh0X3N0YXJ0LCAqY29udGV4dF9lbmQ7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9VU0VfU0lHTkFMUworCXNpZ2ptcF9idWYgcmVzdGFydDsgICAgIC8vIGNhdGNoX3NpZygpCisjZW5kaWYKKwlzdHJ1Y3QgdGVybWlvcyB0ZXJtX29yaWcsIHRlcm1fdmk7IC8vIHJlbWVtYmVyIHdoYXQgdGhlIGNvb2tlZCBtb2RlIHdhcworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0NPTE9OCisJY2hhciAqaW5pdGlhbF9jbWRzWzNdOyAgLy8gY3VycmVudGx5IDIgZW50cmllcywgTlVMTCB0ZXJtaW5hdGVkCisjZW5kaWYKKwkvLyBTaG91bGQgYmUganVzdCBlbm91Z2ggdG8gaG9sZCBhIGtleSBzZXF1ZW5jZSwKKwkvLyBidXQgQ1JBU0hNRSBtb2RlIHVzZXMgaXQgYXMgZ2VuZXJhdGVkIGNvbW1hbmQgYnVmZmVyIHRvbworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0NSQVNITUUKKwljaGFyIHJlYWRidWZmZXJbMTI4XTsKKyNlbHNlCisJY2hhciByZWFkYnVmZmVyW0tFWUNPREVfQlVGRkVSX1NJWkVdOworI2VuZGlmCisjZGVmaW5lIFNUQVRVU19CVUZGRVJfTEVOICAyMDAKKwljaGFyIHN0YXR1c19idWZmZXJbU1RBVFVTX0JVRkZFUl9MRU5dOyAvLyBtZXNzYWdlcyB0byB0aGUgdXNlcgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0RPVF9DTUQKKwljaGFyIGxhc3RfbW9kaWZ5aW5nX2NtZFtNQVhfSU5QVVRfTEVOXTsJLy8gbGFzdCBtb2RpZnlpbmcgY21kIGZvciAiLiIKKyNlbmRpZgorCWNoYXIgZ2V0X2lucHV0X2xpbmVfX2J1ZltNQVhfSU5QVVRfTEVOXTsgLyogZm9ybWVyIHN0YXRpYyAqLworCisJY2hhciBzY3Jfb3V0X2J1ZltNQVhfU0NSX0NPTFMgKyBNQVhfVEFCU1RPUCAqIDJdOworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1VORE8KKy8vIHVuZG9fcHVzaCgpIG9wZXJhdGlvbnMKKyNkZWZpbmUgVU5ET19JTlMgICAgICAgICAwCisjZGVmaW5lIFVORE9fREVMICAgICAgICAgMQorI2RlZmluZSBVTkRPX0lOU19DSEFJTiAgIDIKKyNkZWZpbmUgVU5ET19ERUxfQ0hBSU4gICAzCisvLyBVTkRPXypfUVVFVUVEIG11c3QgYmUgZXF1YWwgdG8gVU5ET194eHggT1JlZCB3aXRoIFVORE9fUVVFVUVEX0ZMQUcKKyNkZWZpbmUgVU5ET19RVUVVRURfRkxBRyA0CisjZGVmaW5lIFVORE9fSU5TX1FVRVVFRCAgNAorI2RlZmluZSBVTkRPX0RFTF9RVUVVRUQgIDUKKyNkZWZpbmUgVU5ET19VU0VfU1BPUyAgIDMyCisjZGVmaW5lIFVORE9fRU1QVFkgICAgICA2NAorLy8gUGFzcy10aHJvdWdoIGZsYWdzIGZvciBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgdW5kb25lCisjZGVmaW5lIE5PX1VORE8gICAgICAgICAgMAorI2RlZmluZSBBTExPV19VTkRPICAgICAgIDEKKyNkZWZpbmUgQUxMT1dfVU5ET19DSEFJTiAyCisjIGlmIEVOQUJMRV9GRUFUVVJFX1ZJX1VORE9fUVVFVUUKKyNkZWZpbmUgQUxMT1dfVU5ET19RVUVVRUQgMworCWNoYXIgdW5kb19xdWV1ZV9zdGF0ZTsKKwlpbnQgdW5kb19xOworCWNoYXIgKnVuZG9fcXVldWVfc3BvczsJLy8gU3RhcnQgcG9zaXRpb24gb2YgcXVldWVkIG9wZXJhdGlvbgorCWNoYXIgdW5kb19xdWV1ZVtDT05GSUdfRkVBVFVSRV9WSV9VTkRPX1FVRVVFX01BWF07CisjIGVsc2UKKy8vIElmIHVuZG8gcXVldWluZyBkaXNhYmxlZCwgZG9uJ3QgaW52b2tlIHRoZSBtaXNzaW5nIHF1ZXVlIGxvZ2ljCisjZGVmaW5lIEFMTE9XX1VORE9fUVVFVUVEIDEKKyMgZW5kaWYKKworCXN0cnVjdCB1bmRvX29iamVjdCB7CisJCXN0cnVjdCB1bmRvX29iamVjdCAqcHJldjsJLy8gTGlua2luZyBiYWNrIGF2b2lkcyBsaXN0IHRyYXZlcnNhbCAoTElGTykKKwkJaW50IHN0YXJ0OwkJLy8gT2Zmc2V0IHdoZXJlIHRoZSBkYXRhIHNob3VsZCBiZSByZXN0b3JlZC9kZWxldGVkCisJCWludCBsZW5ndGg7CQkvLyB0b3RhbCBkYXRhIHNpemUKKwkJdWludDhfdCB1X3R5cGU7CQkvLyAwPWRlbGV0ZWQsIDE9aW5zZXJ0ZWQsIDI9c3dhcHBlZAorCQljaGFyIHVuZG9fdGV4dFsxXTsJLy8gdGV4dCB0aGF0IHdhcyBkZWxldGVkIChpZiBkZWxldGlvbikKKwl9ICp1bmRvX3N0YWNrX3RhaWw7CisjZW5kaWYgLyogRU5BQkxFX0ZFQVRVUkVfVklfVU5ETyAqLworfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSB0ZXh0ICAgICAgICAgICAoRy50ZXh0ICAgICAgICAgICkKKyNkZWZpbmUgdGV4dF9zaXplICAgICAgKEcudGV4dF9zaXplICAgICApCisjZGVmaW5lIGVuZCAgICAgICAgICAgIChHLmVuZCAgICAgICAgICAgKQorI2RlZmluZSBkb3QgICAgICAgICAgICAoRy5kb3QgICAgICAgICAgICkKKyNkZWZpbmUgcmVnICAgICAgICAgICAgKEcucmVnICAgICAgICAgICApCisKKyNkZWZpbmUgdmlfc2V0b3BzICAgICAgICAgICAgICAgKEcudmlfc2V0b3BzICAgICAgICAgICkKKyNkZWZpbmUgZWRpdGluZyAgICAgICAgICAgICAgICAgKEcuZWRpdGluZyAgICAgICAgICAgICkKKyNkZWZpbmUgY21kX21vZGUgICAgICAgICAgICAgICAgKEcuY21kX21vZGUgICAgICAgICAgICkKKyNkZWZpbmUgbW9kaWZpZWRfY291bnQgICAgICAgICAgKEcubW9kaWZpZWRfY291bnQgICAgICkKKyNkZWZpbmUgbGFzdF9tb2RpZmllZF9jb3VudCAgICAgKEcubGFzdF9tb2RpZmllZF9jb3VudCkKKyNkZWZpbmUgc2F2ZV9hcmdjICAgICAgICAgICAgICAgKEcuc2F2ZV9hcmdjICAgICAgICAgICkKKyNkZWZpbmUgY21kY250ICAgICAgICAgICAgICAgICAgKEcuY21kY250ICAgICAgICAgICAgICkKKyNkZWZpbmUgcm93cyAgICAgICAgICAgICAgICAgICAgKEcucm93cyAgICAgICAgICAgICAgICkKKyNkZWZpbmUgY29sdW1ucyAgICAgICAgICAgICAgICAgKEcuY29sdW1ucyAgICAgICAgICAgICkKKyNkZWZpbmUgY3JvdyAgICAgICAgICAgICAgICAgICAgKEcuY3JvdyAgICAgICAgICAgICAgICkKKyNkZWZpbmUgY2NvbCAgICAgICAgICAgICAgICAgICAgKEcuY2NvbCAgICAgICAgICAgICAgICkKKyNkZWZpbmUgb2Zmc2V0ICAgICAgICAgICAgICAgICAgKEcub2Zmc2V0ICAgICAgICAgICAgICkKKyNkZWZpbmUgc3RhdHVzX2J1ZmZlciAgICAgICAgICAgKEcuc3RhdHVzX2J1ZmZlciAgICAgICkKKyNkZWZpbmUgaGF2ZV9zdGF0dXNfbXNnICAgICAgICAgKEcuaGF2ZV9zdGF0dXNfbXNnICAgICkKKyNkZWZpbmUgbGFzdF9zdGF0dXNfY2tzdW0gICAgICAgKEcubGFzdF9zdGF0dXNfY2tzdW0gICkKKyNkZWZpbmUgY3VycmVudF9maWxlbmFtZSAgICAgICAgKEcuY3VycmVudF9maWxlbmFtZSAgICkKKyNkZWZpbmUgc2NyZWVuICAgICAgICAgICAgICAgICAgKEcuc2NyZWVuICAgICAgICAgICAgICkKKyNkZWZpbmUgc2NyZWVuc2l6ZSAgICAgICAgICAgICAgKEcuc2NyZWVuc2l6ZSAgICAgICAgICkKKyNkZWZpbmUgc2NyZWVuYmVnaW4gICAgICAgICAgICAgKEcuc2NyZWVuYmVnaW4gICAgICAgICkKKyNkZWZpbmUgdGFic3RvcCAgICAgICAgICAgICAgICAgKEcudGFic3RvcCAgICAgICAgICAgICkKKyNkZWZpbmUgbGFzdF9mb3J3YXJkX2NoYXIgICAgICAgKEcubGFzdF9mb3J3YXJkX2NoYXIgICkKKyNkZWZpbmUgZXJhc2VfY2hhciAgICAgICAgICAgICAgKEcuZXJhc2VfY2hhciAgICAgICAgICkKKyNkZWZpbmUgbGFzdF9pbnB1dF9jaGFyICAgICAgICAgKEcubGFzdF9pbnB1dF9jaGFyICAgICkKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9SRUFET05MWQorI2RlZmluZSByZWFkb25seV9tb2RlICAgICAgICAgICAoRy5yZWFkb25seV9tb2RlICAgICAgKQorI2Vsc2UKKyNkZWZpbmUgcmVhZG9ubHlfbW9kZSAgICAgICAgICAgMAorI2VuZGlmCisjZGVmaW5lIGFkZGluZzJxICAgICAgICAgICAgICAgIChHLmFkZGluZzJxICAgICAgICAgICApCisjZGVmaW5lIGxtY19sZW4gICAgICAgICAgICAgICAgIChHLmxtY19sZW4gICAgICAgICAgICApCisjZGVmaW5lIGlvcSAgICAgICAgICAgICAgICAgICAgIChHLmlvcSAgICAgICAgICAgICAgICApCisjZGVmaW5lIGlvcV9zdGFydCAgICAgICAgICAgICAgIChHLmlvcV9zdGFydCAgICAgICAgICApCisjZGVmaW5lIG15X3BpZCAgICAgICAgICAgICAgICAgIChHLm15X3BpZCAgICAgICAgICAgICApCisjZGVmaW5lIGxhc3Rfc2VhcmNoX3BhdHRlcm4gICAgIChHLmxhc3Rfc2VhcmNoX3BhdHRlcm4pCisKKyNkZWZpbmUgZWRpdF9maWxlX19jdXJfbGluZSAgICAgKEcuZWRpdF9maWxlX19jdXJfbGluZSkKKyNkZWZpbmUgcmVmcmVzaF9fb2xkX29mZnNldCAgICAgKEcucmVmcmVzaF9fb2xkX29mZnNldCkKKyNkZWZpbmUgZm9ybWF0X2VkaXRfc3RhdHVzX190b3QgKEcuZm9ybWF0X2VkaXRfc3RhdHVzX190b3QpCisKKyNkZWZpbmUgWURyZWcgICAgICAgICAgKEcuWURyZWcgICAgICAgICApCisjZGVmaW5lIFVyZWcgICAgICAgICAgIChHLlVyZWcgICAgICAgICAgKQorI2RlZmluZSBtYXJrICAgICAgICAgICAoRy5tYXJrICAgICAgICAgICkKKyNkZWZpbmUgY29udGV4dF9zdGFydCAgKEcuY29udGV4dF9zdGFydCApCisjZGVmaW5lIGNvbnRleHRfZW5kICAgIChHLmNvbnRleHRfZW5kICAgKQorI2RlZmluZSByZXN0YXJ0ICAgICAgICAoRy5yZXN0YXJ0ICAgICAgICkKKyNkZWZpbmUgdGVybV9vcmlnICAgICAgKEcudGVybV9vcmlnICAgICApCisjZGVmaW5lIHRlcm1fdmkgICAgICAgIChHLnRlcm1fdmkgICAgICAgKQorI2RlZmluZSBpbml0aWFsX2NtZHMgICAoRy5pbml0aWFsX2NtZHMgICkKKyNkZWZpbmUgcmVhZGJ1ZmZlciAgICAgKEcucmVhZGJ1ZmZlciAgICApCisjZGVmaW5lIHNjcl9vdXRfYnVmICAgIChHLnNjcl9vdXRfYnVmICAgKQorI2RlZmluZSBsYXN0X21vZGlmeWluZ19jbWQgIChHLmxhc3RfbW9kaWZ5aW5nX2NtZCApCisjZGVmaW5lIGdldF9pbnB1dF9saW5lX19idWYgKEcuZ2V0X2lucHV0X2xpbmVfX2J1ZikKKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1VORE8KKyNkZWZpbmUgdW5kb19zdGFja190YWlsICAoRy51bmRvX3N0YWNrX3RhaWwgKQorIyBpZiBFTkFCTEVfRkVBVFVSRV9WSV9VTkRPX1FVRVVFCisjZGVmaW5lIHVuZG9fcXVldWVfc3RhdGUgKEcudW5kb19xdWV1ZV9zdGF0ZSkKKyNkZWZpbmUgdW5kb19xICAgICAgICAgICAoRy51bmRvX3EgICAgICAgICAgKQorI2RlZmluZSB1bmRvX3F1ZXVlICAgICAgIChHLnVuZG9fcXVldWUgICAgICApCisjZGVmaW5lIHVuZG9fcXVldWVfc3BvcyAgKEcudW5kb19xdWV1ZV9zcG9zICkKKyMgZW5kaWYKKyNlbmRpZgorCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCisJbGFzdF9tb2RpZmllZF9jb3VudCA9IC0xOyBcCisJLyogIiIgYnV0IGhhcyBzcGFjZSBmb3IgMiBjaGFyczogKi8gXAorCUlGX0ZFQVRVUkVfVklfU0VBUkNIKGxhc3Rfc2VhcmNoX3BhdHRlcm4gPSB4emFsbG9jKDIpOykgXAorfSB3aGlsZSAoMCkKKworCitzdGF0aWMgdm9pZCBlZGl0X2ZpbGUoY2hhciAqKTsJLy8gZWRpdCBvbmUgZmlsZQorc3RhdGljIHZvaWQgZG9fY21kKGludCk7CS8vIGV4ZWN1dGUgYSBjb21tYW5kCitzdGF0aWMgaW50IG5leHRfdGFic3RvcChpbnQpOworc3RhdGljIHZvaWQgc3luY19jdXJzb3IoY2hhciAqLCBpbnQgKiwgaW50ICopOwkvLyBzeW5jaHJvbml6ZSB0aGUgc2NyZWVuIGN1cnNvciB0byBkb3QKK3N0YXRpYyBjaGFyICpiZWdpbl9saW5lKGNoYXIgKik7CS8vIHJldHVybiBwb2ludGVyIHRvIGN1ciBsaW5lIEItby1sCitzdGF0aWMgY2hhciAqZW5kX2xpbmUoY2hhciAqKTsJLy8gcmV0dXJuIHBvaW50ZXIgdG8gY3VyIGxpbmUgRS1vLWwKK3N0YXRpYyBjaGFyICpwcmV2X2xpbmUoY2hhciAqKTsJLy8gcmV0dXJuIHBvaW50ZXIgdG8gcHJldiBsaW5lIEItby1sCitzdGF0aWMgY2hhciAqbmV4dF9saW5lKGNoYXIgKik7CS8vIHJldHVybiBwb2ludGVyIHRvIG5leHQgbGluZSBCLW8tbAorc3RhdGljIGNoYXIgKmVuZF9zY3JlZW4odm9pZCk7CS8vIGdldCBwb2ludGVyIHRvIGxhc3QgY2hhciBvbiBzY3JlZW4KK3N0YXRpYyBpbnQgY291bnRfbGluZXMoY2hhciAqLCBjaGFyICopOwkvLyBjb3VudCBsaW5lIGZyb20gc3RhcnQgdG8gc3RvcAorc3RhdGljIGNoYXIgKmZpbmRfbGluZShpbnQpOwkvLyBmaW5kIGJlZ2lubmluZyBvZiBsaW5lICNsaQorc3RhdGljIGNoYXIgKm1vdmVfdG9fY29sKGNoYXIgKiwgaW50KTsJLy8gbW92ZSAicCIgdG8gY29sdW1uIGwKK3N0YXRpYyB2b2lkIGRvdF9sZWZ0KHZvaWQpOwkvLyBtb3ZlIGRvdCBsZWZ0LSBkb250IGxlYXZlIGxpbmUKK3N0YXRpYyB2b2lkIGRvdF9yaWdodCh2b2lkKTsJLy8gbW92ZSBkb3QgcmlnaHQtIGRvbnQgbGVhdmUgbGluZQorc3RhdGljIHZvaWQgZG90X2JlZ2luKHZvaWQpOwkvLyBtb3ZlIGRvdCB0byBCLW8tbAorc3RhdGljIHZvaWQgZG90X2VuZCh2b2lkKTsJLy8gbW92ZSBkb3QgdG8gRS1vLWwKK3N0YXRpYyB2b2lkIGRvdF9uZXh0KHZvaWQpOwkvLyBtb3ZlIGRvdCB0byBuZXh0IGxpbmUgQi1vLWwKK3N0YXRpYyB2b2lkIGRvdF9wcmV2KHZvaWQpOwkvLyBtb3ZlIGRvdCB0byBwcmV2IGxpbmUgQi1vLWwKK3N0YXRpYyB2b2lkIGRvdF9zY3JvbGwoaW50LCBpbnQpOwkvLyBtb3ZlIHRoZSBzY3JlZW4gdXAgb3IgZG93bgorc3RhdGljIHZvaWQgZG90X3NraXBfb3Zlcl93cyh2b2lkKTsJLy8gbW92ZSBkb3QgcGF0IFdTCitzdGF0aWMgY2hhciAqYm91bmRfZG90KGNoYXIgKik7CS8vIG1ha2Ugc3VyZSAgdGV4dFswXSA8PSBQIDwgImVuZCIKK3N0YXRpYyBjaGFyICpuZXdfc2NyZWVuKGludCwgaW50KTsJLy8gbWFsbG9jIHZpcnR1YWwgc2NyZWVuIG1lbW9yeQorI2lmICFFTkFCTEVfRkVBVFVSRV9WSV9VTkRPCisjZGVmaW5lIGNoYXJfaW5zZXJ0KGEsYixjKSBjaGFyX2luc2VydChhLGIpCisjZW5kaWYKK3N0YXRpYyBjaGFyICpjaGFyX2luc2VydChjaGFyICosIGNoYXIsIGludCk7CS8vIGluc2VydCB0aGUgY2hhciBjIGF0ICdwJworLy8gbWlnaHQgcmVhbGxvY2F0ZSB0ZXh0W10hIHVzZSBwICs9IHN0dXBpZF9pbnNlcnQocCwgLi4uKSwKKy8vIGFuZCBiZSBjYXJlZnVsIHRvIG5vdCB1c2UgcG9pbnRlcnMgaW50byBwb3RlbnRpYWxseSBmcmVlZCB0ZXh0W10hCitzdGF0aWMgdWludHB0cl90IHN0dXBpZF9pbnNlcnQoY2hhciAqLCBjaGFyKTsJLy8gc3R1cGlkbHkgaW5zZXJ0IHRoZSBjaGFyIGMgYXQgJ3AnCitzdGF0aWMgaW50IGZpbmRfcmFuZ2UoY2hhciAqKiwgY2hhciAqKiwgY2hhcik7CS8vIHJldHVybiBwb2ludGVycyBmb3IgYW4gb2JqZWN0CitzdGF0aWMgaW50IHN0X3Rlc3QoY2hhciAqLCBpbnQsIGludCwgY2hhciAqKTsJLy8gaGVscGVyIGZvciBza2lwX3RoaW5nKCkKK3N0YXRpYyBjaGFyICpza2lwX3RoaW5nKGNoYXIgKiwgaW50LCBpbnQsIGludCk7CS8vIHNraXAgc29tZSBvYmplY3QKK3N0YXRpYyBjaGFyICpmaW5kX3BhaXIoY2hhciAqLCBjaGFyKTsJLy8gZmluZCBtYXRjaGluZyBwYWlyICgpICBbXSAge30KKyNpZiAhRU5BQkxFX0ZFQVRVUkVfVklfVU5ETworI2RlZmluZSB0ZXh0X2hvbGVfZGVsZXRlKGEsYixjKSB0ZXh0X2hvbGVfZGVsZXRlKGEsYikKKyNlbmRpZgorc3RhdGljIGNoYXIgKnRleHRfaG9sZV9kZWxldGUoY2hhciAqLCBjaGFyICosIGludCk7CS8vIGF0ICJwIiwgZGVsZXRlIGEgJ3NpemUnIGJ5dGUgaG9sZQorLy8gbWlnaHQgcmVhbGxvY2F0ZSB0ZXh0W10hIHVzZSBwICs9IHRleHRfaG9sZV9tYWtlKHAsIC4uLiksCisvLyBhbmQgYmUgY2FyZWZ1bCB0byBub3QgdXNlIHBvaW50ZXJzIGludG8gcG90ZW50aWFsbHkgZnJlZWQgdGV4dFtdIQorc3RhdGljIHVpbnRwdHJfdCB0ZXh0X2hvbGVfbWFrZShjaGFyICosIGludCk7CS8vIGF0ICJwIiwgbWFrZSBhICdzaXplJyBieXRlIGhvbGUKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfVklfVU5ETworI2RlZmluZSB5YW5rX2RlbGV0ZShhLGIsYyxkLGUpIHlhbmtfZGVsZXRlKGEsYixjLGQpCisjZW5kaWYKK3N0YXRpYyBjaGFyICp5YW5rX2RlbGV0ZShjaGFyICosIGNoYXIgKiwgaW50LCBpbnQsIGludCk7CS8vIHlhbmsgdGV4dFtdIGludG8gcmVnaXN0ZXIgdGhlbiBkZWxldGUKK3N0YXRpYyB2b2lkIHNob3dfaGVscCh2b2lkKTsJLy8gZGlzcGxheSBzb21lIGhlbHAgaW5mbworc3RhdGljIHZvaWQgcmF3bW9kZSh2b2lkKTsJLy8gc2V0ICJyYXciIG1vZGUgb24gdHR5CitzdGF0aWMgdm9pZCBjb29rbW9kZSh2b2lkKTsJLy8gcmV0dXJuIHRvICJjb29rZWQiIG1vZGUgb24gdHR5CisvLyBzbGVlcCBmb3IgJ2gnIDEvMTAwIHNlY29uZHMsIHJldHVybiAxLzAgaWYgc3RkaW4gaXMgKHJlYWR5IGZvciByZWFkKS8obm90IHJlYWR5KQorc3RhdGljIGludCBteXNsZWVwKGludCk7CitzdGF0aWMgaW50IHJlYWRpdCh2b2lkKTsJLy8gcmVhZCAobWF5YmUgY3Vyc29yKSBrZXkgZnJvbSBzdGRpbgorc3RhdGljIGludCBnZXRfb25lX2NoYXIodm9pZCk7CS8vIHJlYWQgMSBjaGFyIGZyb20gc3RkaW4KKy8vIGZpbGVfaW5zZXJ0IG1pZ2h0IHJlYWxsb2NhdGUgdGV4dFtdIQorc3RhdGljIGludCBmaWxlX2luc2VydChjb25zdCBjaGFyICosIGNoYXIgKiwgaW50KTsKK3N0YXRpYyBpbnQgZmlsZV93cml0ZShjaGFyICosIGNoYXIgKiwgY2hhciAqKTsKK3N0YXRpYyB2b2lkIHBsYWNlX2N1cnNvcihpbnQsIGludCk7CitzdGF0aWMgdm9pZCBzY3JlZW5fZXJhc2Uodm9pZCk7CitzdGF0aWMgdm9pZCBjbGVhcl90b19lb2wodm9pZCk7CitzdGF0aWMgdm9pZCBjbGVhcl90b19lb3Modm9pZCk7CitzdGF0aWMgdm9pZCBnb19ib3R0b21fYW5kX2NsZWFyX3RvX2VvbCh2b2lkKTsKK3N0YXRpYyB2b2lkIHN0YW5kb3V0X3N0YXJ0KHZvaWQpOwkvLyBzZW5kICJzdGFydCByZXZlcnNlIHZpZGVvIiBzZXF1ZW5jZQorc3RhdGljIHZvaWQgc3RhbmRvdXRfZW5kKHZvaWQpOwkvLyBzZW5kICJlbmQgcmV2ZXJzZSB2aWRlbyIgc2VxdWVuY2UKK3N0YXRpYyB2b2lkIGZsYXNoKGludCk7CQkvLyBmbGFzaCB0aGUgdGVybWluYWwgc2NyZWVuCitzdGF0aWMgdm9pZCBzaG93X3N0YXR1c19saW5lKHZvaWQpOwkvLyBwdXQgYSBtZXNzYWdlIG9uIHRoZSBib3R0b20gbGluZQorc3RhdGljIHZvaWQgc3RhdHVzX2xpbmUoY29uc3QgY2hhciAqLCAuLi4pOyAgICAgLy8gcHJpbnQgdG8gc3RhdHVzIGJ1Zgorc3RhdGljIHZvaWQgc3RhdHVzX2xpbmVfYm9sZChjb25zdCBjaGFyICosIC4uLik7CitzdGF0aWMgdm9pZCBzdGF0dXNfbGluZV9ib2xkX2Vycm5vKGNvbnN0IGNoYXIgKmZuKTsKK3N0YXRpYyB2b2lkIG5vdF9pbXBsZW1lbnRlZChjb25zdCBjaGFyICopOyAvLyBkaXNwbGF5ICJOb3QgaW1wbGVtZW50ZWQiIG1lc3NhZ2UKK3N0YXRpYyBpbnQgZm9ybWF0X2VkaXRfc3RhdHVzKHZvaWQpOwkvLyBmb3JtYXQgZmlsZSBzdGF0dXMgb24gc3RhdHVzIGxpbmUKK3N0YXRpYyB2b2lkIHJlZHJhdyhpbnQpOwkvLyBmb3JjZSBhIGZ1bGwgc2NyZWVuIHJlZnJlc2gKK3N0YXRpYyBjaGFyKiBmb3JtYXRfbGluZShjaGFyKiAvKiwgaW50Ki8pOworc3RhdGljIHZvaWQgcmVmcmVzaChpbnQpOwkvLyB1cGRhdGUgdGhlIHRlcm1pbmFsIGZyb20gc2NyZWVuW10KKworc3RhdGljIHZvaWQgaW5kaWNhdGVfZXJyb3Iodm9pZCk7ICAgICAgIC8vIHVzZSBmbGFzaCBvciBiZWVwIHRvIGluZGljYXRlIGVycm9yCitzdGF0aWMgdm9pZCBIaXRfUmV0dXJuKHZvaWQpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VBUkNICitzdGF0aWMgY2hhciAqY2hhcl9zZWFyY2goY2hhciAqLCBjb25zdCBjaGFyICosIGludCwgaW50KTsJLy8gc2VhcmNoIGZvciBwYXR0ZXJuIHN0YXJ0aW5nIGF0IHAKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0NPTE9OCitzdGF0aWMgY2hhciAqZ2V0X29uZV9hZGRyZXNzKGNoYXIgKiwgaW50ICopOwkvLyBnZXQgY29sb24gYWRkciwgaWYgcHJlc2VudAorc3RhdGljIGNoYXIgKmdldF9hZGRyZXNzKGNoYXIgKiwgaW50ICosIGludCAqKTsJLy8gZ2V0IHR3byBjb2xvbiBhZGRycywgaWYgcHJlc2VudAorI2VuZGlmCitzdGF0aWMgdm9pZCBjb2xvbihjaGFyICopOwkvLyBleGVjdXRlIHRoZSAiY29sb24iIG1vZGUgY21kcworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1VTRV9TSUdOQUxTCitzdGF0aWMgdm9pZCB3aW5jaF9zaWcoaW50KTsJLy8gY2F0Y2ggd2luZG93IHNpemUgY2hhbmdlcworc3RhdGljIHZvaWQgc3VzcGVuZF9zaWcoaW50KTsJLy8gY2F0Y2ggY3RybC1aCitzdGF0aWMgdm9pZCBjYXRjaF9zaWcoaW50KTsgICAgIC8vIGNhdGNoIGN0cmwtQyBhbmQgYWxhcm0gdGltZS1vdXRzCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ET1RfQ01ECitzdGF0aWMgdm9pZCBzdGFydF9uZXdfY21kX3EoY2hhcik7CS8vIG5ldyBxdWV1ZSBmb3IgY29tbWFuZAorc3RhdGljIHZvaWQgZW5kX2NtZF9xKHZvaWQpOwkvLyBzdG9wIHNhdmluZyBpbnB1dCBjaGFycworI2Vsc2UKKyNkZWZpbmUgZW5kX2NtZF9xKCkgKCh2b2lkKTApCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRVRPUFRTCitzdGF0aWMgdm9pZCBzaG93bWF0Y2hpbmcoY2hhciAqKTsJLy8gc2hvdyB0aGUgbWF0Y2hpbmcgcGFpciAoKSAgW10gIHt9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSyB8fCAoRU5BQkxFX0ZFQVRVUkVfVklfQ09MT04gJiYgRU5BQkxFX0ZFQVRVUkVfVklfU0VBUkNIKSB8fCBFTkFCTEVfRkVBVFVSRV9WSV9DUkFTSE1FCisvLyBtaWdodCByZWFsbG9jYXRlIHRleHRbXSEgdXNlIHAgKz0gc3RyaW5nX2luc2VydChwLCAuLi4pLAorLy8gYW5kIGJlIGNhcmVmdWwgdG8gbm90IHVzZSBwb2ludGVycyBpbnRvIHBvdGVudGlhbGx5IGZyZWVkIHRleHRbXSEKKyMgaWYgIUVOQUJMRV9GRUFUVVJFX1ZJX1VORE8KKyNkZWZpbmUgc3RyaW5nX2luc2VydChhLGIsYykgc3RyaW5nX2luc2VydChhLGIpCisjIGVuZGlmCitzdGF0aWMgdWludHB0cl90IHN0cmluZ19pbnNlcnQoY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CS8vIGluc2VydCB0aGUgc3RyaW5nIGF0ICdwJworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKK3N0YXRpYyBjaGFyICp0ZXh0X3lhbmsoY2hhciAqLCBjaGFyICosIGludCk7CS8vIHNhdmUgY29weSBvZiAicCIgaW50byBhIHJlZ2lzdGVyCitzdGF0aWMgY2hhciB3aGF0X3JlZyh2b2lkKTsJCS8vIHdoYXQgaXMgbGV0dGVyIG9mIGN1cnJlbnQgWURyZWcKK3N0YXRpYyB2b2lkIGNoZWNrX2NvbnRleHQoY2hhcik7CS8vIHJlbWVtYmVyIGNvbnRleHQgZm9yICcnIGNvbW1hbmQKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1VORE8KK3N0YXRpYyB2b2lkIGZsdXNoX3VuZG9fZGF0YSh2b2lkKTsKK3N0YXRpYyB2b2lkIHVuZG9fcHVzaChjaGFyICosIHVuc2lnbmVkIGludCwgdW5zaWduZWQgY2hhcik7CS8vIFB1c2ggYW4gb3BlcmF0aW9uIG9uIHRoZSB1bmRvIHN0YWNrCitzdGF0aWMgdm9pZCB1bmRvX3BvcCh2b2lkKTsJLy8gVW5kbyB0aGUgbGFzdCBvcGVyYXRpb24KKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVklfVU5ET19RVUVVRQorc3RhdGljIHZvaWQgdW5kb19xdWV1ZV9jb21taXQodm9pZCk7CS8vIEZsdXNoIGFueSBxdWV1ZWQgb2JqZWN0cyB0byB0aGUgdW5kbyBzdGFjaworIyBlbHNlCisjIGRlZmluZSB1bmRvX3F1ZXVlX2NvbW1pdCgpICgodm9pZCkwKQorIyBlbmRpZgorI2Vsc2UKKyNkZWZpbmUgZmx1c2hfdW5kb19kYXRhKCkgICAoKHZvaWQpMCkKKyNkZWZpbmUgdW5kb19xdWV1ZV9jb21taXQoKSAoKHZvaWQpMCkKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfQ1JBU0hNRQorc3RhdGljIHZvaWQgY3Jhc2hfZHVtbXkoKTsKK3N0YXRpYyB2b2lkIGNyYXNoX3Rlc3QoKTsKK3N0YXRpYyBpbnQgY3Jhc2htZSA9IDA7CisjZW5kaWYKKworc3RhdGljIHZvaWQgd3JpdGUxKGNvbnN0IGNoYXIgKm91dCkKK3sKKwlmcHV0cyhvdXQsIHN0ZG91dCk7Cit9CisKK2ludCB2aV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdmlfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGM7CisKKwlJTklUX0coKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1VORE8KKwkvKiB1bmRvX3N0YWNrX3RhaWwgPSBOVUxMOyAtIGFscmVhZHkgaXMgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9VTkRPX1FVRVVFCisJdW5kb19xdWV1ZV9zdGF0ZSA9IFVORE9fRU1QVFk7CisJLyogdW5kb19xID0gMDsgLSBhbHJlYWR5IGlzICAqLworI2VuZGlmCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1VTRV9TSUdOQUxTIHx8IEVOQUJMRV9GRUFUVVJFX1ZJX0NSQVNITUUKKwlteV9waWQgPSBnZXRwaWQoKTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0NSQVNITUUKKwlzcmFuZCgobG9uZykgbXlfcGlkKTsKKyNlbmRpZgorI2lmZGVmIE5PX1NVQ0hfQVBQTEVUX1lFVAorCS8qIElmIHdlIGFyZW4ndCAidmkiLCB3ZSBhcmUgInZpZXciICovCisJaWYgKEVOQUJMRV9GRUFUVVJFX1ZJX1JFQURPTkxZICYmIGFwcGxldF9uYW1lWzJdKSB7CisJCVNFVF9SRUFET05MWV9NT0RFKHJlYWRvbmx5X21vZGUpOworCX0KKyNlbmRpZgorCisJLy8gYXV0b2luZGVudCBpcyBub3QgZGVmYXVsdCBpbiB2aW0gNy4zCisJdmlfc2V0b3BzID0gLypWSV9BVVRPSU5ERU5UIHwqLyBWSV9TSE9XTUFUQ0ggfCBWSV9JR05PUkVDQVNFOworCS8vICAxLSAgcHJvY2VzcyAkSE9NRS8uZXhyYyBmaWxlIChub3QgaW5wbGVtZW50ZWQgeWV0KQorCS8vICAyLSAgcHJvY2VzcyBFWElOSVQgdmFyaWFibGUgZnJvbSBlbnZpcm9ubWVudAorCS8vICAzLSAgcHJvY2VzcyBjb21tYW5kIGxpbmUgYXJncworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0NPTE9OCisJeworCQljaGFyICpwID0gZ2V0ZW52KCJFWElOSVQiKTsKKwkJaWYgKHAgJiYgKnApCisJCQlpbml0aWFsX2NtZHNbMF0gPSB4c3RybmR1cChwLCBNQVhfSU5QVVRfTEVOKTsKKwl9CisjZW5kaWYKKwl3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgImhDUkgiIElGX0ZFQVRVUkVfVklfQ09MT04oImM6IikpKSAhPSAtMSkgeworCQlzd2l0Y2ggKGMpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9DUkFTSE1FCisJCWNhc2UgJ0MnOgorCQkJY3Jhc2htZSA9IDE7CisJCQlicmVhazsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1JFQURPTkxZCisJCWNhc2UgJ1InOgkJLy8gUmVhZC1vbmx5IGZsYWcKKwkJCVNFVF9SRUFET05MWV9NT0RFKHJlYWRvbmx5X21vZGUpOworCQkJYnJlYWs7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9DT0xPTgorCQljYXNlICdjJzoJCS8vIGNtZCBsaW5lIHZpIGNvbW1hbmQKKwkJCWlmICgqb3B0YXJnKQorCQkJCWluaXRpYWxfY21kc1tpbml0aWFsX2NtZHNbMF0gIT0gTlVMTF0gPSB4c3RybmR1cChvcHRhcmcsIE1BWF9JTlBVVF9MRU4pOworCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSAnSCc6CisJCQlzaG93X2hlbHAoKTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQlkZWZhdWx0OgorCQkJYmJfc2hvd191c2FnZSgpOworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwkvLyBUaGUgYXJndiBhcnJheSBjYW4gYmUgdXNlZCBieSB0aGUgIjpuZXh0IiAgYW5kICI6cmV3aW5kIiBjb21tYW5kcworCWFyZ3YgKz0gb3B0aW5kOworCWFyZ2MgLT0gb3B0aW5kOworCisJLy8tLS0tLSBUaGlzIGlzIHRoZSBtYWluIGZpbGUgaGFuZGxpbmcgbG9vcCAtLS0tLS0tLS0tLS0tLQorCXNhdmVfYXJnYyA9IGFyZ2M7CisJb3B0aW5kID0gMDsKKwkvLyAiU2F2ZSBjdXJzb3IsIHVzZSBhbHRlcm5hdGUgc2NyZWVuIGJ1ZmZlciwgY2xlYXIgc2NyZWVuIgorCXdyaXRlMSgiXDAzM1s/MTA0OWgiKTsKKwl3aGlsZSAoMSkgeworCQllZGl0X2ZpbGUoYXJndltvcHRpbmRdKTsgLyogcGFyYW0gbWlnaHQgYmUgTlVMTCAqLworCQlpZiAoKytvcHRpbmQgPj0gYXJnYykKKwkJCWJyZWFrOworCX0KKwkvLyAiVXNlIG5vcm1hbCBzY3JlZW4gYnVmZmVyLCByZXN0b3JlIGN1cnNvciIKKwl3cml0ZTEoIlwwMzNbPzEwNDlsIik7CisJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHJlYWQgdGV4dCBmcm9tIGZpbGUgb3IgY3JlYXRlIGFuIGVtcHR5IGJ1ZiAqLworLyogd2lsbCBhbHNvIHVwZGF0ZSBjdXJyZW50X2ZpbGVuYW1lICovCitzdGF0aWMgaW50IGluaXRfdGV4dF9idWZmZXIoY2hhciAqZm4pCit7CisJaW50IHJjOworCisJZmx1c2hfdW5kb19kYXRhKCk7CisJbW9kaWZpZWRfY291bnQgPSAwOworCWxhc3RfbW9kaWZpZWRfY291bnQgPSAtMTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSworCS8qIGluaXQgdGhlIG1hcmtzICovCisJbWVtc2V0KG1hcmssIDAsIHNpemVvZihtYXJrKSk7CisjZW5kaWYKKworCS8qIGFsbG9jYXRlL3JlYWxsb2NhdGUgdGV4dCBidWZmZXIgKi8KKwlmcmVlKHRleHQpOworCXRleHRfc2l6ZSA9IDEwMjQwOworCXNjcmVlbmJlZ2luID0gZG90ID0gZW5kID0gdGV4dCA9IHh6YWxsb2ModGV4dF9zaXplKTsKKworCWlmIChmbiAhPSBjdXJyZW50X2ZpbGVuYW1lKSB7CisJCWZyZWUoY3VycmVudF9maWxlbmFtZSk7CisJCWN1cnJlbnRfZmlsZW5hbWUgPSB4c3RyZHVwKGZuKTsKKwl9CisJcmMgPSBmaWxlX2luc2VydChmbiwgdGV4dCwgMSk7CisJaWYgKHJjIDwgMCkgeworCQkvLyBmaWxlIGRvZXNudCBleGlzdC4gU3RhcnQgZW1wdHkgYnVmIHdpdGggZHVtbXkgbGluZQorCQljaGFyX2luc2VydCh0ZXh0LCAnXG4nLCBOT19VTkRPKTsKKwl9CisJcmV0dXJuIHJjOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfV0lOX1JFU0laRQorc3RhdGljIGludCBxdWVyeV9zY3JlZW5fZGltZW5zaW9ucyh2b2lkKQoreworCWludCBlcnIgPSBnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KFNURElOX0ZJTEVOTywgJmNvbHVtbnMsICZyb3dzKTsKKwlpZiAocm93cyA+IE1BWF9TQ1JfUk9XUykKKwkJcm93cyA9IE1BWF9TQ1JfUk9XUzsKKwlpZiAoY29sdW1ucyA+IE1BWF9TQ1JfQ09MUykKKwkJY29sdW1ucyA9IE1BWF9TQ1JfQ09MUzsKKwlyZXR1cm4gZXJyOworfQorI2Vsc2UKKyMgZGVmaW5lIHF1ZXJ5X3NjcmVlbl9kaW1lbnNpb25zKCkgKDApCisjZW5kaWYKKworc3RhdGljIHZvaWQgZWRpdF9maWxlKGNoYXIgKmZuKQoreworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCisjZGVmaW5lIGN1cl9saW5lIGVkaXRfZmlsZV9fY3VyX2xpbmUKKyNlbmRpZgorCWludCBjOworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1VTRV9TSUdOQUxTCisJaW50IHNpZzsKKyNlbmRpZgorCisJZWRpdGluZyA9IDE7CS8vIDAgPSBleGl0LCAxID0gb25lIGZpbGUsIDIgPSBtdWx0aXBsZSBmaWxlcworCXJhd21vZGUoKTsKKwlyb3dzID0gMjQ7CisJY29sdW1ucyA9IDgwOworCUlGX0ZFQVRVUkVfVklfQVNLX1RFUk1JTkFMKEcuZ2V0X3Jvd2NvbF9lcnJvciA9KSBxdWVyeV9zY3JlZW5fZGltZW5zaW9ucygpOworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0FTS19URVJNSU5BTAorCWlmIChHLmdldF9yb3djb2xfZXJyb3IgLyogVE9ETz8gJiYgbm8gaW5wdXQgb24gc3RkaW4gKi8pIHsKKwkJdWludDY0X3QgazsKKwkJd3JpdGUxKCJcMDMzWzk5OTs5OTlIIiAiXDAzM1s2biIpOworCQlmZmx1c2hfYWxsKCk7CisJCWsgPSByZWFkX2tleShTVERJTl9GSUxFTk8sIHJlYWRidWZmZXIsIC8qdGltZW91dF9tczoqLyAxMDApOworCQlpZiAoKGludDMyX3QpayA9PSBLRVlDT0RFX0NVUlNPUl9QT1MpIHsKKwkJCXVpbnQzMl90IHJjID0gKGsgPj4gMzIpOworCQkJY29sdW1ucyA9IChyYyAmIDB4N2ZmZik7CisJCQlpZiAoY29sdW1ucyA+IE1BWF9TQ1JfQ09MUykKKwkJCQljb2x1bW5zID0gTUFYX1NDUl9DT0xTOworCQkJcm93cyA9ICgocmMgPj4gMTYpICYgMHg3ZmZmKTsKKwkJCWlmIChyb3dzID4gTUFYX1NDUl9ST1dTKQorCQkJCXJvd3MgPSBNQVhfU0NSX1JPV1M7CisJCX0KKwl9CisjZW5kaWYKKwluZXdfc2NyZWVuKHJvd3MsIGNvbHVtbnMpOwkvLyBnZXQgbWVtb3J5IGZvciB2aXJ0dWFsIHNjcmVlbgorCWluaXRfdGV4dF9idWZmZXIoZm4pOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKKwlZRHJlZyA9IDI2OwkJCS8vIGRlZmF1bHQgWWFuay9EZWxldGUgcmVnCisJVXJlZyA9IDI3OwkJCS8vIGhvbGQgb3JpZyBsaW5lIGZvciAiVSIgY21kCisJbWFya1syNl0gPSBtYXJrWzI3XSA9IHRleHQ7CS8vIGluaXQgInByZXZpb3VzIGNvbnRleHQiCisjZW5kaWYKKworCWxhc3RfZm9yd2FyZF9jaGFyID0gbGFzdF9pbnB1dF9jaGFyID0gJ1wwJzsKKwljcm93ID0gMDsKKwljY29sID0gMDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1VTRV9TSUdOQUxTCisJc2lnbmFsKFNJR0lOVCwgY2F0Y2hfc2lnKTsKKwlzaWduYWwoU0lHV0lOQ0gsIHdpbmNoX3NpZyk7CisJc2lnbmFsKFNJR1RTVFAsIHN1c3BlbmRfc2lnKTsKKwlzaWcgPSBzaWdzZXRqbXAocmVzdGFydCwgMSk7CisJaWYgKHNpZyAhPSAwKSB7CisJCXNjcmVlbmJlZ2luID0gZG90ID0gdGV4dDsKKwl9CisjZW5kaWYKKworCWNtZF9tb2RlID0gMDsJCS8vIDA9Y29tbWFuZCAgMT1pbnNlcnQgIDI9J1InZXBsYWNlCisJY21kY250ID0gMDsKKwl0YWJzdG9wID0gODsKKwlvZmZzZXQgPSAwOwkJCS8vIG5vIGhvcml6b250YWwgb2Zmc2V0CisJYyA9ICdcMCc7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfRE9UX0NNRAorCWZyZWUoaW9xX3N0YXJ0KTsKKwlpb3EgPSBpb3Ffc3RhcnQgPSBOVUxMOworCWxtY19sZW4gPSAwOworCWFkZGluZzJxID0gMDsKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfQ09MT04KKwl7CisJCWNoYXIgKnAsICpxOworCQlpbnQgbiA9IDA7CisKKwkJd2hpbGUgKChwID0gaW5pdGlhbF9jbWRzW25dKSAhPSBOVUxMKSB7CisJCQlkbyB7CisJCQkJcSA9IHA7CisJCQkJcCA9IHN0cmNocihxLCAnXG4nKTsKKwkJCQlpZiAocCkKKwkJCQkJd2hpbGUgKCpwID09ICdcbicpCisJCQkJCQkqcCsrID0gJ1wwJzsKKwkJCQlpZiAoKnEpCisJCQkJCWNvbG9uKHEpOworCQkJfSB3aGlsZSAocCk7CisJCQlmcmVlKGluaXRpYWxfY21kc1tuXSk7CisJCQlpbml0aWFsX2NtZHNbbl0gPSBOVUxMOworCQkJbisrOworCQl9CisJfQorI2VuZGlmCisJcmVkcmF3KEZBTFNFKTsJCQkvLyBkb250IGZvcmNlIGV2ZXJ5IGNvbCByZS1kcmF3CisJLy8tLS0tLS1UaGlzIGlzIHRoZSBtYWluIFZpIGNtZCBoYW5kbGluZyBsb29wIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJd2hpbGUgKGVkaXRpbmcgPiAwKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfQ1JBU0hNRQorCQlpZiAoY3Jhc2htZSA+IDApIHsKKwkJCWlmICgoZW5kIC0gdGV4dCkgPiAxKSB7CisJCQkJY3Jhc2hfZHVtbXkoKTsJLy8gZ2VuZXJhdGUgYSByYW5kb20gY29tbWFuZAorCQkJfSBlbHNlIHsKKwkJCQljcmFzaG1lID0gMDsKKwkJCQlzdHJpbmdfaW5zZXJ0KHRleHQsICJcblxuIyMjIyMgIFJhbiBvdXQgb2YgdGV4dCB0byB3b3JrIG9uLiAgIyMjIyNcblxuIiwgTk9fVU5ETyk7IC8vIGluc2VydCB0aGUgc3RyaW5nCisJCQkJZG90ID0gdGV4dDsKKwkJCQlyZWZyZXNoKEZBTFNFKTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCWxhc3RfaW5wdXRfY2hhciA9IGMgPSBnZXRfb25lX2NoYXIoKTsJLy8gZ2V0IGEgY21kIGZyb20gdXNlcgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCisJCS8vIHNhdmUgYSBjb3B5IG9mIHRoZSBjdXJyZW50IGxpbmUtIGZvciB0aGUgJ1UiIGNvbW1hbmQKKwkJaWYgKGJlZ2luX2xpbmUoZG90KSAhPSBjdXJfbGluZSkgeworCQkJY3VyX2xpbmUgPSBiZWdpbl9saW5lKGRvdCk7CisJCQl0ZXh0X3lhbmsoYmVnaW5fbGluZShkb3QpLCBlbmRfbGluZShkb3QpLCBVcmVnKTsKKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfRE9UX0NNRAorCQkvLyBUaGVzZSBhcmUgY29tbWFuZHMgdGhhdCBjaGFuZ2UgdGV4dFtdLgorCQkvLyBSZW1lbWJlciB0aGUgaW5wdXQgZm9yIHRoZSAiLiIgY29tbWFuZAorCQlpZiAoIWFkZGluZzJxICYmIGlvcV9zdGFydCA9PSBOVUxMCisJCSAmJiBjbWRfbW9kZSA9PSAwIC8vIGNvbW1hbmQgbW9kZQorCQkgJiYgYyA+ICdcMCcgLy8gZXhjbHVkZSBOVUwgYW5kIG5vbi1BU0NJSSBjaGFycworCQkgJiYgYyA8IDB4N2YgLy8gKFVuaWNvZGUgYW5kIHN1Y2gpCisJCSAmJiBzdHJjaHIobW9kaWZ5aW5nX2NtZHMsIGMpCisJCSkgeworCQkJc3RhcnRfbmV3X2NtZF9xKGMpOworCQl9CisjZW5kaWYKKwkJZG9fY21kKGMpOwkJLy8gZXhlY3V0ZSB0aGUgdXNlciBjb21tYW5kCisKKwkJLy8gcG9sbCB0byBzZWUgaWYgdGhlcmUgaXMgaW5wdXQgYWxyZWFkeSB3YWl0aW5nLiBpZiB3ZSBhcmUKKwkJLy8gbm90IGFibGUgdG8gZGlzcGxheSBvdXRwdXQgZmFzdCBlbm91Z2ggdG8ga2VlcCB1cCwgc2tpcAorCQkvLyB0aGUgZGlzcGxheSB1cGRhdGUgdW50aWwgd2UgY2F0Y2ggdXAgd2l0aCBpbnB1dC4KKwkJaWYgKCFyZWFkYnVmZmVyWzBdICYmIG15c2xlZXAoMCkgPT0gMCkgeworCQkJLy8gbm8gaW5wdXQgcGVuZGluZyAtIHNvIHVwZGF0ZSBvdXRwdXQKKwkJCXJlZnJlc2goRkFMU0UpOworCQkJc2hvd19zdGF0dXNfbGluZSgpOworCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfQ1JBU0hNRQorCQlpZiAoY3Jhc2htZSA+IDApCisJCQljcmFzaF90ZXN0KCk7CS8vIHRlc3QgZWRpdG9yIHZhcmlhYmxlcworI2VuZGlmCisJfQorCS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisJZ29fYm90dG9tX2FuZF9jbGVhcl90b19lb2woKTsKKwljb29rbW9kZSgpOworI3VuZGVmIGN1cl9saW5lCit9CisKKy8vLS0tLS0gVGhlIENvbG9uIGNvbW1hbmRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9DT0xPTgorc3RhdGljIGNoYXIgKmdldF9vbmVfYWRkcmVzcyhjaGFyICpwLCBpbnQgKmFkZHIpCS8vIGdldCBjb2xvbiBhZGRyLCBpZiBwcmVzZW50Cit7CisJaW50IHN0OworCWNoYXIgKnE7CisJSUZfRkVBVFVSRV9WSV9ZQU5LTUFSSyhjaGFyIGM7KQorCUlGX0ZFQVRVUkVfVklfU0VBUkNIKGNoYXIgKnBhdDspCisKKwkqYWRkciA9IC0xOwkJCS8vIGFzc3VtZSBubyBhZGRyCisJaWYgKCpwID09ICcuJykgewkvLyB0aGUgY3VycmVudCBsaW5lCisJCXArKzsKKwkJcSA9IGJlZ2luX2xpbmUoZG90KTsKKwkJKmFkZHIgPSBjb3VudF9saW5lcyh0ZXh0LCBxKTsKKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKKwllbHNlIGlmICgqcCA9PSAnXCcnKSB7CS8vIGlzIHRoaXMgYSBtYXJrIGFkZHIKKwkJcCsrOworCQljID0gdG9sb3dlcigqcCk7CisJCXArKzsKKwkJaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKSB7CisJCQkvLyB3ZSBoYXZlIGEgbWFyaworCQkJYyA9IGMgLSAnYSc7CisJCQlxID0gbWFya1sodW5zaWduZWQgY2hhcikgY107CisJCQlpZiAocSAhPSBOVUxMKSB7CS8vIGlzIG1hcmsgdmFsaWQKKwkJCQkqYWRkciA9IGNvdW50X2xpbmVzKHRleHQsIHEpOworCQkJfQorCQl9CisJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VBUkNICisJZWxzZSBpZiAoKnAgPT0gJy8nKSB7CS8vIGEgc2VhcmNoIHBhdHRlcm4KKwkJcSA9IHN0cmNocm51bCgrK3AsICcvJyk7CisJCXBhdCA9IHhzdHJuZHVwKHAsIHEgLSBwKTsgLy8gc2F2ZSBjb3B5IG9mIHBhdHRlcm4KKwkJcCA9IHE7CisJCWlmICgqcCA9PSAnLycpCisJCQlwKys7CisJCXEgPSBjaGFyX3NlYXJjaChkb3QsIHBhdCwgRk9SV0FSRCwgRlVMTCk7CisJCWlmIChxICE9IE5VTEwpIHsKKwkJCSphZGRyID0gY291bnRfbGluZXModGV4dCwgcSk7CisJCX0KKwkJZnJlZShwYXQpOworCX0KKyNlbmRpZgorCWVsc2UgaWYgKCpwID09ICckJykgewkvLyB0aGUgbGFzdCBsaW5lIGluIGZpbGUKKwkJcCsrOworCQlxID0gYmVnaW5fbGluZShlbmQgLSAxKTsKKwkJKmFkZHIgPSBjb3VudF9saW5lcyh0ZXh0LCBxKTsKKwl9IGVsc2UgaWYgKGlzZGlnaXQoKnApKSB7CS8vIHNwZWNpZmljIGxpbmUgbnVtYmVyCisJCXNzY2FuZihwLCAiJWQlbiIsIGFkZHIsICZzdCk7CisJCXAgKz0gc3Q7CisJfSBlbHNlIHsKKwkJLy8gdW5yZWNvZ25pemVkIGFkZHJlc3MgLSBhc3N1bWUgLTEKKwkJKmFkZHIgPSAtMTsKKwl9CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICpnZXRfYWRkcmVzcyhjaGFyICpwLCBpbnQgKmIsIGludCAqZSkJLy8gZ2V0IHR3byBjb2xvbiBhZGRycywgaWYgcHJlc2VudAoreworCS8vLS0tLS0gZ2V0IHRoZSBhZGRyZXNzJyBpLmUuLCAxLDMgICAnYSwnYiAgLS0tLS0KKwkvLyBnZXQgRklSU1QgYWRkciwgaWYgcHJlc2VudAorCXdoaWxlIChpc2JsYW5rKCpwKSkKKwkJcCsrOwkJCQkvLyBza2lwIG92ZXIgbGVhZGluZyBzcGFjZXMKKwlpZiAoKnAgPT0gJyUnKSB7CQkJLy8gYWxpYXMgZm9yIDEsJAorCQlwKys7CisJCSpiID0gMTsKKwkJKmUgPSBjb3VudF9saW5lcyh0ZXh0LCBlbmQtMSk7CisJCWdvdG8gZ2EwOworCX0KKwlwID0gZ2V0X29uZV9hZGRyZXNzKHAsIGIpOworCXdoaWxlIChpc2JsYW5rKCpwKSkKKwkJcCsrOworCWlmICgqcCA9PSAnLCcpIHsJCQkvLyBpcyB0aGVyZSBhIGFkZHJlc3Mgc2VwYXJhdG9yCisJCXArKzsKKwkJd2hpbGUgKGlzYmxhbmsoKnApKQorCQkJcCsrOworCQkvLyBnZXQgU0VDT05EIGFkZHIsIGlmIHByZXNlbnQKKwkJcCA9IGdldF9vbmVfYWRkcmVzcyhwLCBlKTsKKwl9CisgZ2EwOgorCXdoaWxlIChpc2JsYW5rKCpwKSkKKwkJcCsrOwkJCQkvLyBza2lwIG92ZXIgdHJhaWxpbmcgc3BhY2VzCisJcmV0dXJuIHA7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRVQgJiYgRU5BQkxFX0ZFQVRVUkVfVklfU0VUT1BUUworc3RhdGljIHZvaWQgc2V0b3BzKGNvbnN0IGNoYXIgKmFyZ3MsIGNvbnN0IGNoYXIgKm9wbmFtZSwgaW50IGZsZ19ubywKKwkJCWNvbnN0IGNoYXIgKnNob3J0X29wbmFtZSwgaW50IG9wdCkKK3sKKwljb25zdCBjaGFyICphID0gYXJncyArIGZsZ19ubzsKKwlpbnQgbCA9IHN0cmxlbihvcG5hbWUpIC0gMTsgLyogb3BuYW1lIGhhdmUgKyAnICcgKi8KKworCS8vIG1heWJlIHN0cm5jbXA/IHdlIGhhZCB0b25zIG9mIGVycm9uZW91cyBzdHJuY2FzZWNtcCdzLi4uCisJaWYgKHN0cm5jYXNlY21wKGEsIG9wbmFtZSwgbCkgPT0gMAorCSB8fCBzdHJuY2FzZWNtcChhLCBzaG9ydF9vcG5hbWUsIDIpID09IDAKKwkpIHsKKwkJaWYgKGZsZ19ubykKKwkJCXZpX3NldG9wcyAmPSB+b3B0OworCQllbHNlCisJCQl2aV9zZXRvcHMgfD0gb3B0OworCX0KK30KKyNlbmRpZgorCisjZW5kaWYgLyogRkVBVFVSRV9WSV9DT0xPTiAqLworCisvLyBidWYgbXVzdCBiZSBubyBsb25nZXIgdGhhbiBNQVhfSU5QVVRfTEVOIQorc3RhdGljIHZvaWQgY29sb24oY2hhciAqYnVmKQoreworI2lmICFFTkFCTEVfRkVBVFVSRV9WSV9DT0xPTgorCS8qIFNpbXBsZSAiOmNtZCIgaGFuZGxlciB3aXRoIG1pbmltYWwgc2V0IG9mIGNvbW1hbmRzICovCisJY2hhciAqcCA9IGJ1ZjsKKwlpbnQgY250OworCisJaWYgKCpwID09ICc6JykKKwkJcCsrOworCWNudCA9IHN0cmxlbihwKTsKKwlpZiAoY250ID09IDApCisJCXJldHVybjsKKwlpZiAoc3RybmNtcChwLCAicXVpdCIsIGNudCkgPT0gMAorCSB8fCBzdHJuY21wKHAsICJxISIsIGNudCkgPT0gMAorCSkgeworCQlpZiAobW9kaWZpZWRfY291bnQgJiYgcFsxXSAhPSAnIScpIHsKKwkJCXN0YXR1c19saW5lX2JvbGQoIk5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlICg6JXMhIG92ZXJyaWRlcykiLCBwKTsKKwkJfSBlbHNlIHsKKwkJCWVkaXRpbmcgPSAwOworCQl9CisJCXJldHVybjsKKwl9CisJaWYgKHN0cm5jbXAocCwgIndyaXRlIiwgY250KSA9PSAwCisJIHx8IHN0cm5jbXAocCwgIndxIiwgY250KSA9PSAwCisJIHx8IHN0cm5jbXAocCwgInduIiwgY250KSA9PSAwCisJIHx8IChwWzBdID09ICd4JyAmJiAhcFsxXSkKKwkpIHsKKwkJY250ID0gZmlsZV93cml0ZShjdXJyZW50X2ZpbGVuYW1lLCB0ZXh0LCBlbmQgLSAxKTsKKwkJaWYgKGNudCA8IDApIHsKKwkJCWlmIChjbnQgPT0gLTEpCisJCQkJc3RhdHVzX2xpbmVfYm9sZCgiV3JpdGUgZXJyb3I6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfSBlbHNlIHsKKwkJCW1vZGlmaWVkX2NvdW50ID0gMDsKKwkJCWxhc3RfbW9kaWZpZWRfY291bnQgPSAtMTsKKwkJCXN0YXR1c19saW5lKCInJXMnICVkTCwgJWRDIiwKKwkJCQljdXJyZW50X2ZpbGVuYW1lLAorCQkJCWNvdW50X2xpbmVzKHRleHQsIGVuZCAtIDEpLCBjbnQKKwkJCSk7CisJCQlpZiAocFswXSA9PSAneCcgfHwgcFsxXSA9PSAncScgfHwgcFsxXSA9PSAnbicKKwkJCSB8fCBwWzBdID09ICdYJyB8fCBwWzFdID09ICdRJyB8fCBwWzFdID09ICdOJworCQkJKSB7CisJCQkJZWRpdGluZyA9IDA7CisJCQl9CisJCX0KKwkJcmV0dXJuOworCX0KKwlpZiAoc3RybmNtcChwLCAiZmlsZSIsIGNudCkgPT0gMCkgeworCQlsYXN0X3N0YXR1c19ja3N1bSA9IDA7CS8vIGZvcmNlIHN0YXR1cyB1cGRhdGUKKwkJcmV0dXJuOworCX0KKwlpZiAoc3NjYW5mKHAsICIlZCIsICZjbnQpID4gMCkgeworCQlkb3QgPSBmaW5kX2xpbmUoY250KTsKKwkJZG90X3NraXBfb3Zlcl93cygpOworCQlyZXR1cm47CisJfQorCW5vdF9pbXBsZW1lbnRlZChwKTsKKyNlbHNlCisKKwljaGFyIGMsICpvcmlnX2J1ZiwgKmJ1ZjEsICpxLCAqcjsKKwljaGFyICpmbiwgY21kW01BWF9JTlBVVF9MRU5dLCBhcmdzW01BWF9JTlBVVF9MRU5dOworCWludCBpLCBsLCBsaSwgYiwgZTsKKwlpbnQgdXNlZm9yY2U7CisKKwkvLyA6MzE1NAkvLyBpZiAoLWUgbGluZSAzMTU0KSBnb3RvIGl0ICBlbHNlIHN0YXkgcHV0CisJLy8gOjQsMzN3ISBmb28JLy8gd3JpdGUgYSBwb3J0aW9uIG9mIGJ1ZmZlciB0byBmaWxlICJmb28iCisJLy8gOncJCS8vIHdyaXRlIGFsbCBvZiBidWZmZXIgdG8gY3VycmVudCBmaWxlCisJLy8gOnEJCS8vIHF1aXQKKwkvLyA6cSEJCS8vIHF1aXQtIGRvbnQgY2FyZSBhYm91dCBtb2RpZmllZCBmaWxlCisJLy8gOidhLCd6IXNvcnQgLXUgICAvLyBmaWx0ZXIgYmxvY2sgdGhyb3VnaCBzb3J0CisJLy8gOidmCQkvLyBnb3RvIG1hcmsgImYiCisJLy8gOidmbAkJLy8gbGlzdCBsaXRlcmFsIHRoZSBtYXJrICJmIiBsaW5lCisJLy8gOi5yIGJhcgkvLyByZWFkIGZpbGUgImJhciIgaW50byBidWZmZXIgYmVmb3JlIGRvdAorCS8vIDovMTIzLywvYWJjL2QgICAgLy8gZGVsZXRlIGxpbmVzIGZyb20gIjEyMyIgbGluZSB0byAiYWJjIiBsaW5lCisJLy8gOi94eXovCS8vIGdvdG8gdGhlICJ4eXoiIGxpbmUKKwkvLyA6cy9maW5kL3JlcGxhY2UvIC8vIHN1YnN0aXR1dGUgcGF0dGVybiAiZmluZCIgd2l0aCAicmVwbGFjZSIKKwkvLyA6ITxjbWQ+CS8vIHJ1biA8Y21kPiB0aGVuIHJldHVybgorCS8vCisKKwlpZiAoIWJ1ZlswXSkKKwkJZ290byByZXQ7CisJaWYgKCpidWYgPT0gJzonKQorCQlidWYrKzsJCQkvLyBtb3ZlIHBhc3QgdGhlICc6JworCisJbGkgPSBpID0gMDsKKwliID0gZSA9IC0xOworCXEgPSB0ZXh0OwkJCS8vIGFzc3VtZSAxLCQgZm9yIHRoZSByYW5nZQorCXIgPSBlbmQgLSAxOworCWxpID0gY291bnRfbGluZXModGV4dCwgZW5kIC0gMSk7CisJZm4gPSBjdXJyZW50X2ZpbGVuYW1lOworCisJLy8gbG9vayBmb3Igb3B0aW9uYWwgYWRkcmVzcyhlcykgIDouICA6MSAgOjEsOSAgIDoncSwnYSAgIDolCisJYnVmID0gZ2V0X2FkZHJlc3MoYnVmLCAmYiwgJmUpOworCisJLy8gcmVtZW1iZXIgb3JpZyBjb21tYW5kIGxpbmUKKwlvcmlnX2J1ZiA9IGJ1ZjsKKworCS8vIGdldCB0aGUgQ09NTUFORCBpbnRvIGNtZFtdCisJYnVmMSA9IGNtZDsKKwl3aGlsZSAoKmJ1ZiAhPSAnXDAnKSB7CisJCWlmIChpc3NwYWNlKCpidWYpKQorCQkJYnJlYWs7CisJCSpidWYxKysgPSAqYnVmKys7CisJfQorCSpidWYxID0gJ1wwJzsKKwkvLyBnZXQgYW55IEFSR3VtZW50cworCXdoaWxlIChpc2JsYW5rKCpidWYpKQorCQlidWYrKzsKKwlzdHJjcHkoYXJncywgYnVmKTsKKwl1c2Vmb3JjZSA9IEZBTFNFOworCWJ1ZjEgPSBsYXN0X2NoYXJfaXMoY21kLCAnIScpOworCWlmIChidWYxKSB7CisJCXVzZWZvcmNlID0gVFJVRTsKKwkJKmJ1ZjEgPSAnXDAnOyAgIC8vIGdldCByaWQgb2YgIQorCX0KKwlpZiAoYiA+PSAwKSB7CisJCS8vIGlmIHRoZXJlIGlzIG9ubHkgb25lIGFkZHIsIHRoZW4gdGhlIGFkZHIKKwkJLy8gaXMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBzaW5nbGUgbGluZSB0aGUKKwkJLy8gdXNlciB3YW50cy4gU28sIHJlc2V0IHRoZSBlbmQKKwkJLy8gcG9pbnRlciB0byBwb2ludCBhdCBlbmQgb2YgdGhlICJiIiBsaW5lCisJCXEgPSBmaW5kX2xpbmUoYik7CS8vIHdoYXQgbGluZSBpcyAjYgorCQlyID0gZW5kX2xpbmUocSk7CisJCWxpID0gMTsKKwl9CisJaWYgKGUgPj0gMCkgeworCQkvLyB3ZSB3ZXJlIGdpdmVuIHR3byBhZGRycy4gIGNoYW5nZSB0aGUKKwkJLy8gZW5kIHBvaW50ZXIgdG8gdGhlIGFkZHIgZ2l2ZW4gYnkgdXNlci4KKwkJciA9IGZpbmRfbGluZShlKTsJLy8gd2hhdCBsaW5lIGlzICNlCisJCXIgPSBlbmRfbGluZShyKTsKKwkJbGkgPSBlIC0gYiArIDE7CisJfQorCS8vIC0tLS0tLS0tLS0tLSBub3cgbG9vayBmb3IgdGhlIGNvbW1hbmQgLS0tLS0tLS0tLS0tCisJaSA9IHN0cmxlbihjbWQpOworCWlmIChpID09IDApIHsJCS8vIDoxMjNDUiBnb3RvIGxpbmUgIzEyMworCQlpZiAoYiA+PSAwKSB7CisJCQlkb3QgPSBmaW5kX2xpbmUoYik7CS8vIHdoYXQgbGluZSBpcyAjYgorCQkJZG90X3NraXBfb3Zlcl93cygpOworCQl9CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0FMTE9XX0VYRUMKKwllbHNlIGlmIChjbWRbMF0gPT0gJyEnKSB7CS8vIHJ1biBhIGNtZAorCQlpbnQgcmV0Y29kZTsKKwkJLy8gOiFscyAgIHJ1biB0aGUgPGNtZD4KKwkJZ29fYm90dG9tX2FuZF9jbGVhcl90b19lb2woKTsKKwkJY29va21vZGUoKTsKKwkJcmV0Y29kZSA9IHN5c3RlbShvcmlnX2J1ZiArIDEpOwkvLyBydW4gdGhlIGNtZAorCQlpZiAocmV0Y29kZSkKKwkJCXByaW50ZigiXG5zaGVsbCByZXR1cm5lZCAlaVxuXG4iLCByZXRjb2RlKTsKKwkJcmF3bW9kZSgpOworCQlIaXRfUmV0dXJuKCk7CQkJLy8gbGV0IHVzZXIgc2VlIHJlc3VsdHMKKwl9CisjZW5kaWYKKwllbHNlIGlmIChjbWRbMF0gPT0gJz0nICYmICFjbWRbMV0pIHsJLy8gd2hlcmUgaXMgdGhlIGFkZHJlc3MKKwkJaWYgKGIgPCAwKSB7CS8vIG5vIGFkZHIgZ2l2ZW4tIHVzZSBkZWZhdWx0cworCQkJYiA9IGUgPSBjb3VudF9saW5lcyh0ZXh0LCBkb3QpOworCQl9CisJCXN0YXR1c19saW5lKCIlZCIsIGIpOworCX0gZWxzZSBpZiAoc3RybmNtcChjbWQsICJkZWxldGUiLCBpKSA9PSAwKSB7CS8vIGRlbGV0ZSBsaW5lcworCQlpZiAoYiA8IDApIHsJLy8gbm8gYWRkciBnaXZlbi0gdXNlIGRlZmF1bHRzCisJCQlxID0gYmVnaW5fbGluZShkb3QpOwkvLyBhc3N1bWUgLiwuIGZvciB0aGUgcmFuZ2UKKwkJCXIgPSBlbmRfbGluZShkb3QpOworCQl9CisJCWRvdCA9IHlhbmtfZGVsZXRlKHEsIHIsIDEsIFlBTktERUwsIEFMTE9XX1VORE8pOwkvLyBzYXZlLCB0aGVuIGRlbGV0ZSBsaW5lcworCQlkb3Rfc2tpcF9vdmVyX3dzKCk7CisJfSBlbHNlIGlmIChzdHJuY21wKGNtZCwgImVkaXQiLCBpKSA9PSAwKSB7CS8vIEVkaXQgYSBmaWxlCisJCWludCBzaXplOworCisJCS8vIGRvbid0IGVkaXQsIGlmIHRoZSBjdXJyZW50IGZpbGUgaGFzIGJlZW4gbW9kaWZpZWQKKwkJaWYgKG1vZGlmaWVkX2NvdW50ICYmICF1c2Vmb3JjZSkgeworCQkJc3RhdHVzX2xpbmVfYm9sZCgiTm8gd3JpdGUgc2luY2UgbGFzdCBjaGFuZ2UgKDolcyEgb3ZlcnJpZGVzKSIsIGNtZCk7CisJCQlnb3RvIHJldDsKKwkJfQorCQlpZiAoYXJnc1swXSkgeworCQkJLy8gdGhlIHVzZXIgc3VwcGxpZWQgYSBmaWxlIG5hbWUKKwkJCWZuID0gYXJnczsKKwkJfSBlbHNlIGlmIChjdXJyZW50X2ZpbGVuYW1lICYmIGN1cnJlbnRfZmlsZW5hbWVbMF0pIHsKKwkJCS8vIG5vIHVzZXIgc3VwcGxpZWQgbmFtZS0gdXNlIHRoZSBjdXJyZW50IGZpbGVuYW1lCisJCQkvLyBmbiA9IGN1cnJlbnRfZmlsZW5hbWU7ICB3YXMgc2V0IGJ5IGRlZmF1bHQKKwkJfSBlbHNlIHsKKwkJCS8vIG5vIHVzZXIgZmlsZSBuYW1lLCBubyBjdXJyZW50IG5hbWUtIHB1bnQKKwkJCXN0YXR1c19saW5lX2JvbGQoIk5vIGN1cnJlbnQgZmlsZW5hbWUiKTsKKwkJCWdvdG8gcmV0OworCQl9CisKKwkJc2l6ZSA9IGluaXRfdGV4dF9idWZmZXIoZm4pOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKKwkJaWYgKFVyZWcgPj0gMCAmJiBVcmVnIDwgMjgpIHsKKwkJCWZyZWUocmVnW1VyZWddKTsJLy8gICBmcmVlIG9yaWcgbGluZSByZWctIGZvciAnVScKKwkJCXJlZ1tVcmVnXSA9IE5VTEw7CisJCX0KKwkJaWYgKFlEcmVnID49IDAgJiYgWURyZWcgPCAyOCkgeworCQkJZnJlZShyZWdbWURyZWddKTsJLy8gICBmcmVlIGRlZmF1bHQgeWFuay9kZWxldGUgcmVnaXN0ZXIKKwkJCXJlZ1tZRHJlZ10gPSBOVUxMOworCQl9CisjZW5kaWYKKwkJLy8gaG93IG1hbnkgbGluZXMgaW4gdGV4dFtdPworCQlsaSA9IGNvdW50X2xpbmVzKHRleHQsIGVuZCAtIDEpOworCQlzdGF0dXNfbGluZSgiJyVzJyVzIgorCQkJSUZfRkVBVFVSRV9WSV9SRUFET05MWSgiJXMiKQorCQkJIiAlZEwsICVkQyIsCisJCQljdXJyZW50X2ZpbGVuYW1lLAorCQkJKHNpemUgPCAwID8gIiBbTmV3IGZpbGVdIiA6ICIiKSwKKwkJCUlGX0ZFQVRVUkVfVklfUkVBRE9OTFkoCisJCQkJKChyZWFkb25seV9tb2RlKSA/ICIgW1JlYWRvbmx5XSIgOiAiIiksCisJCQkpCisJCQlsaSwgKGludCkoZW5kIC0gdGV4dCkKKwkJKTsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoY21kLCAiZmlsZSIsIGkpID09IDApIHsJLy8gd2hhdCBGaWxlIGlzIHRoaXMKKwkJaWYgKGIgIT0gLTEgfHwgZSAhPSAtMSkgeworCQkJc3RhdHVzX2xpbmVfYm9sZCgiTm8gYWRkcmVzcyBhbGxvd2VkIG9uIHRoaXMgY29tbWFuZCIpOworCQkJZ290byByZXQ7CisJCX0KKwkJaWYgKGFyZ3NbMF0pIHsKKwkJCS8vIHVzZXIgd2FudHMgYSBuZXcgZmlsZW5hbWUKKwkJCWZyZWUoY3VycmVudF9maWxlbmFtZSk7CisJCQljdXJyZW50X2ZpbGVuYW1lID0geHN0cmR1cChhcmdzKTsKKwkJfSBlbHNlIHsKKwkJCS8vIHVzZXIgd2FudHMgZmlsZSBzdGF0dXMgaW5mbworCQkJbGFzdF9zdGF0dXNfY2tzdW0gPSAwOwkvLyBmb3JjZSBzdGF0dXMgdXBkYXRlCisJCX0KKwl9IGVsc2UgaWYgKHN0cm5jbXAoY21kLCAiZmVhdHVyZXMiLCBpKSA9PSAwKSB7CS8vIHdoYXQgZmVhdHVyZXMgYXJlIGF2YWlsYWJsZQorCQkvLyBwcmludCBvdXQgdmFsdWVzIG9mIGFsbCBmZWF0dXJlcworCQlnb19ib3R0b21fYW5kX2NsZWFyX3RvX2VvbCgpOworCQljb29rbW9kZSgpOworCQlzaG93X2hlbHAoKTsKKwkJcmF3bW9kZSgpOworCQlIaXRfUmV0dXJuKCk7CisJfSBlbHNlIGlmIChzdHJuY21wKGNtZCwgImxpc3QiLCBpKSA9PSAwKSB7CS8vIGxpdGVyYWwgcHJpbnQgbGluZQorCQlpZiAoYiA8IDApIHsJLy8gbm8gYWRkciBnaXZlbi0gdXNlIGRlZmF1bHRzCisJCQlxID0gYmVnaW5fbGluZShkb3QpOwkvLyBhc3N1bWUgLiwuIGZvciB0aGUgcmFuZ2UKKwkJCXIgPSBlbmRfbGluZShkb3QpOworCQl9CisJCWdvX2JvdHRvbV9hbmRfY2xlYXJfdG9fZW9sKCk7CisJCXB1dHMoIlxyIik7CisJCWZvciAoOyBxIDw9IHI7IHErKykgeworCQkJaW50IGNfaXNfbm9fcHJpbnQ7CisKKwkJCWMgPSAqcTsKKwkJCWNfaXNfbm9fcHJpbnQgPSAoYyAmIDB4ODApICYmICFJc3ByaW50KGMpOworCQkJaWYgKGNfaXNfbm9fcHJpbnQpIHsKKwkJCQljID0gJy4nOworCQkJCXN0YW5kb3V0X3N0YXJ0KCk7CisJCQl9CisJCQlpZiAoYyA9PSAnXG4nKSB7CisJCQkJd3JpdGUxKCIkXHIiKTsKKwkJCX0gZWxzZSBpZiAoYyA8ICcgJyB8fCBjID09IDEyNykgeworCQkJCWJiX3B1dGNoYXIoJ14nKTsKKwkJCQlpZiAoYyA9PSAxMjcpCisJCQkJCWMgPSAnPyc7CisJCQkJZWxzZQorCQkJCQljICs9ICdAJzsKKwkJCX0KKwkJCWJiX3B1dGNoYXIoYyk7CisJCQlpZiAoY19pc19ub19wcmludCkKKwkJCQlzdGFuZG91dF9lbmQoKTsKKwkJfQorCQlIaXRfUmV0dXJuKCk7CisJfSBlbHNlIGlmIChzdHJuY21wKGNtZCwgInF1aXQiLCBpKSA9PSAwIC8vIHF1aXQKKwkgICAgICAgIHx8IHN0cm5jbXAoY21kLCAibmV4dCIsIGkpID09IDAgLy8gZWRpdCBuZXh0IGZpbGUKKwkgICAgICAgIHx8IHN0cm5jbXAoY21kLCAicHJldiIsIGkpID09IDAgLy8gZWRpdCBwcmV2aW91cyBmaWxlCisJKSB7CisJCWludCBuOworCQlpZiAodXNlZm9yY2UpIHsKKwkJCWlmICgqY21kID09ICdxJykgeworCQkJCS8vIGZvcmNlIGVuZCBvZiBhcmd2IGxpc3QKKwkJCQlvcHRpbmQgPSBzYXZlX2FyZ2M7CisJCQl9CisJCQllZGl0aW5nID0gMDsKKwkJCWdvdG8gcmV0OworCQl9CisJCS8vIGRvbid0IGV4aXQgaWYgdGhlIGZpbGUgYmVlbiBtb2RpZmllZAorCQlpZiAobW9kaWZpZWRfY291bnQpIHsKKwkJCXN0YXR1c19saW5lX2JvbGQoIk5vIHdyaXRlIHNpbmNlIGxhc3QgY2hhbmdlICg6JXMhIG92ZXJyaWRlcykiLCBjbWQpOworCQkJZ290byByZXQ7CisJCX0KKwkJLy8gYXJlIHRoZXJlIG90aGVyIGZpbGUgdG8gZWRpdAorCQluID0gc2F2ZV9hcmdjIC0gb3B0aW5kIC0gMTsKKwkJaWYgKCpjbWQgPT0gJ3EnICYmIG4gPiAwKSB7CisJCQlzdGF0dXNfbGluZV9ib2xkKCIlZCBtb3JlIGZpbGUocykgdG8gZWRpdCIsIG4pOworCQkJZ290byByZXQ7CisJCX0KKwkJaWYgKCpjbWQgPT0gJ24nICYmIG4gPD0gMCkgeworCQkJc3RhdHVzX2xpbmVfYm9sZCgiTm8gbW9yZSBmaWxlcyB0byBlZGl0Iik7CisJCQlnb3RvIHJldDsKKwkJfQorCQlpZiAoKmNtZCA9PSAncCcpIHsKKwkJCS8vIGFyZSB0aGVyZSBwcmV2aW91cyBmaWxlcyB0byBlZGl0CisJCQlpZiAob3B0aW5kIDwgMSkgeworCQkJCXN0YXR1c19saW5lX2JvbGQoIk5vIHByZXZpb3VzIGZpbGVzIHRvIGVkaXQiKTsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKwkJCW9wdGluZCAtPSAyOworCQl9CisJCWVkaXRpbmcgPSAwOworCX0gZWxzZSBpZiAoc3RybmNtcChjbWQsICJyZWFkIiwgaSkgPT0gMCkgewkvLyByZWFkIGZpbGUgaW50byB0ZXh0W10KKwkJaW50IHNpemU7CisKKwkJZm4gPSBhcmdzOworCQlpZiAoIWZuWzBdKSB7CisJCQlzdGF0dXNfbGluZV9ib2xkKCJObyBmaWxlbmFtZSBnaXZlbiIpOworCQkJZ290byByZXQ7CisJCX0KKwkJaWYgKGIgPCAwKSB7CS8vIG5vIGFkZHIgZ2l2ZW4tIHVzZSBkZWZhdWx0cworCQkJcSA9IGJlZ2luX2xpbmUoZG90KTsJLy8gYXNzdW1lICJkb3QiCisJCX0KKwkJLy8gcmVhZCBhZnRlciBjdXJyZW50IGxpbmUtIHVubGVzcyB1c2VyIHNhaWQgIjowciBmb28iCisJCWlmIChiICE9IDApIHsKKwkJCXEgPSBuZXh0X2xpbmUocSk7CisJCQkvLyByZWFkIGFmdGVyIGxhc3QgbGluZQorCQkJaWYgKHEgPT0gZW5kLTEpCisJCQkJKytxOworCQl9CisJCXsgLy8gZGFuY2UgYXJvdW5kIHBvdGVudGlhbGx5LXJlYWxsb2NhdGVkIHRleHRbXQorCQkJdWludHB0cl90IG9mcyA9IHEgLSB0ZXh0OworCQkJc2l6ZSA9IGZpbGVfaW5zZXJ0KGZuLCBxLCAwKTsKKwkJCXEgPSB0ZXh0ICsgb2ZzOworCQl9CisJCWlmIChzaXplIDwgMCkKKwkJCWdvdG8gcmV0OwkvLyBub3RoaW5nIHdhcyBpbnNlcnRlZAorCQkvLyBob3cgbWFueSBsaW5lcyBpbiB0ZXh0W10/CisJCWxpID0gY291bnRfbGluZXMocSwgcSArIHNpemUgLSAxKTsKKwkJc3RhdHVzX2xpbmUoIiclcyciCisJCQlJRl9GRUFUVVJFX1ZJX1JFQURPTkxZKCIlcyIpCisJCQkiICVkTCwgJWRDIiwKKwkJCWZuLAorCQkJSUZfRkVBVFVSRV9WSV9SRUFET05MWSgocmVhZG9ubHlfbW9kZSA/ICIgW1JlYWRvbmx5XSIgOiAiIiksKQorCQkJbGksIHNpemUKKwkJKTsKKwkJaWYgKHNpemUgPiAwKSB7CisJCQkvLyBpZiB0aGUgaW5zZXJ0IGlzIGJlZm9yZSAiZG90IiB0aGVuIHdlIG5lZWQgdG8gdXBkYXRlCisJCQlpZiAocSA8PSBkb3QpCisJCQkJZG90ICs9IHNpemU7CisJCX0KKwl9IGVsc2UgaWYgKHN0cm5jbXAoY21kLCAicmV3aW5kIiwgaSkgPT0gMCkgewkvLyByZXdpbmQgY21kIGxpbmUgYXJncworCQlpZiAobW9kaWZpZWRfY291bnQgJiYgIXVzZWZvcmNlKSB7CisJCQlzdGF0dXNfbGluZV9ib2xkKCJObyB3cml0ZSBzaW5jZSBsYXN0IGNoYW5nZSAoOiVzISBvdmVycmlkZXMpIiwgY21kKTsKKwkJfSBlbHNlIHsKKwkJCS8vIHJlc2V0IHRoZSBmaWxlbmFtZXMgdG8gZWRpdAorCQkJb3B0aW5kID0gLTE7IC8qIHN0YXJ0IGZyb20gMHRoIGZpbGUgKi8KKwkJCWVkaXRpbmcgPSAwOworCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VUCisJfSBlbHNlIGlmIChzdHJuY21wKGNtZCwgInNldCIsIGkpID09IDApIHsJLy8gc2V0IG9yIGNsZWFyIGZlYXR1cmVzCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VUT1BUUworCQljaGFyICphcmdwOworI2VuZGlmCisJCWkgPSAwOwkJCS8vIG9mZnNldCBpbnRvIGFyZ3MKKwkJLy8gb25seSBibGFuayBpcyByZWdhcmRlZCBhcyBhcmdzIGRlbGltaXRlci4gV2hhdCBhYm91dCB0YWIgJ1x0Jz8KKwkJaWYgKCFhcmdzWzBdIHx8IHN0cmNhc2VjbXAoYXJncywgImFsbCIpID09IDApIHsKKwkJCS8vIHByaW50IG91dCB2YWx1ZXMgb2YgYWxsIG9wdGlvbnMKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRVRPUFRTCisJCQlzdGF0dXNfbGluZV9ib2xkKAorCQkJCSIlc2F1dG9pbmRlbnQgIgorCQkJCSIlc2ZsYXNoICIKKwkJCQkiJXNpZ25vcmVjYXNlICIKKwkJCQkiJXNzaG93bWF0Y2ggIgorCQkJCSJ0YWJzdG9wPSV1IiwKKwkJCQlhdXRvaW5kZW50ID8gIiIgOiAibm8iLAorCQkJCWVycl9tZXRob2QgPyAiIiA6ICJubyIsCisJCQkJaWdub3JlY2FzZSA/ICIiIDogIm5vIiwKKwkJCQlzaG93bWF0Y2ggPyAiIiA6ICJubyIsCisJCQkJdGFic3RvcAorCQkJKTsKKyNlbmRpZgorCQkJZ290byByZXQ7CisJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRVRPUFRTCisJCWFyZ3AgPSBhcmdzOworCQl3aGlsZSAoKmFyZ3ApIHsKKwkJCWlmIChzdHJuY21wKGFyZ3AsICJubyIsIDIpID09IDApCisJCQkJaSA9IDI7CQkvLyAiOnNldCBub2F1dG9pbmRlbnQiCisJCQlzZXRvcHMoYXJncCwgImF1dG9pbmRlbnQgIiwgaSwgImFpIiwgVklfQVVUT0lOREVOVCk7CisJCQlzZXRvcHMoYXJncCwgImZsYXNoICIgICAgICwgaSwgImZsIiwgVklfRVJSX01FVEhPRCk7CisJCQlzZXRvcHMoYXJncCwgImlnbm9yZWNhc2UgIiwgaSwgImljIiwgVklfSUdOT1JFQ0FTRSk7CisJCQlzZXRvcHMoYXJncCwgInNob3dtYXRjaCAiICwgaSwgInNtIiwgVklfU0hPV01BVENIICk7CisJCQlpZiAoc3RybmNtcChhcmdwICsgaSwgInRhYnN0b3A9IiwgOCkgPT0gMCkgeworCQkJCWludCB0ID0gMDsKKwkJCQlzc2NhbmYoYXJncCArIGkrOCwgIiV1IiwgJnQpOworCQkJCWlmICh0ID4gMCAmJiB0IDw9IE1BWF9UQUJTVE9QKQorCQkJCQl0YWJzdG9wID0gdDsKKwkJCX0KKwkJCWFyZ3AgPSBza2lwX25vbl93aGl0ZXNwYWNlKGFyZ3ApOworCQkJYXJncCA9IHNraXBfd2hpdGVzcGFjZShhcmdwKTsKKwkJfQorI2VuZGlmIC8qIEZFQVRVUkVfVklfU0VUT1BUUyAqLworI2VuZGlmIC8qIEZFQVRVUkVfVklfU0VUICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VBUkNICisJfSBlbHNlIGlmIChjbWRbMF0gPT0gJ3MnKSB7CS8vIHN1YnN0aXR1dGUgYSBwYXR0ZXJuIHdpdGggYSByZXBsYWNlbWVudCBwYXR0ZXJuCisJCWNoYXIgKkYsICpSLCAqZmxhZ3M7CisJCXNpemVfdCBsZW5fRiwgbGVuX1I7CisJCWludCBnZmxhZzsJCS8vIGdsb2JhbCByZXBsYWNlIGZsYWcKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9VTkRPCisJCWludCBkb250X2NoYWluX2ZpcnN0X2l0ZW0gPSBBTExPV19VTkRPOworI2VuZGlmCisKKwkJLy8gRiBwb2ludHMgdG8gdGhlICJmaW5kIiBwYXR0ZXJuCisJCS8vIFIgcG9pbnRzIHRvIHRoZSAicmVwbGFjZSIgcGF0dGVybgorCQkvLyByZXBsYWNlIHRoZSBjbWQgbGluZSBkZWxpbWl0ZXJzICIvIiB3aXRoIE5VTHMKKwkJYyA9IG9yaWdfYnVmWzFdOwkvLyB3aGF0IGlzIHRoZSBkZWxpbWl0ZXIKKwkJRiA9IG9yaWdfYnVmICsgMjsJLy8gc3RhcnQgb2YgImZpbmQiCisJCVIgPSBzdHJjaHIoRiwgYyk7CS8vIG1pZGRsZSBkZWxpbWl0ZXIKKwkJaWYgKCFSKQorCQkJZ290byBjb2xvbl9zX2ZhaWw7CisJCWxlbl9GID0gUiAtIEY7CisJCSpSKysgPSAnXDAnOwkvLyB0ZXJtaW5hdGUgImZpbmQiCisJCWZsYWdzID0gc3RyY2hyKFIsIGMpOworCQlpZiAoIWZsYWdzKQorCQkJZ290byBjb2xvbl9zX2ZhaWw7CisJCWxlbl9SID0gZmxhZ3MgLSBSOworCQkqZmxhZ3MrKyA9ICdcMCc7CS8vIHRlcm1pbmF0ZSAicmVwbGFjZSIKKwkJZ2ZsYWcgPSAqZmxhZ3M7CisKKwkJcSA9IGJlZ2luX2xpbmUocSk7CisJCWlmIChiIDwgMCkgewkvLyBtYXliZSA6cy9mb28vYmFyLworCQkJcSA9IGJlZ2luX2xpbmUoZG90KTsgICAgICAvLyBzdGFydCB3aXRoIGN1ciBsaW5lCisJCQliID0gY291bnRfbGluZXModGV4dCwgcSk7IC8vIGN1ciBsaW5lIG51bWJlcgorCQl9CisJCWlmIChlIDwgMCkKKwkJCWUgPSBiOwkJLy8gbWF5YmUgOi5zL2Zvby9iYXIvCisKKwkJZm9yIChpID0gYjsgaSA8PSBlOyBpKyspIHsJLy8gc28sIDoyMCwyMyBzIFwwIGZpbmQgXDAgcmVwbGFjZSBcMAorCQkJY2hhciAqbHMgPSBxOwkJLy8gb3JpZyBsaW5lIHN0YXJ0CisJCQljaGFyICpmb3VuZDsKKyB2YzQ6CisJCQlmb3VuZCA9IGNoYXJfc2VhcmNoKHEsIEYsIEZPUldBUkQsIExJTUlURUQpOwkvLyBzZWFyY2ggY3VyIGxpbmUgb25seSBmb3IgImZpbmQiCisJCQlpZiAoZm91bmQpIHsKKwkJCQl1aW50cHRyX3QgYmlhczsKKwkJCQkvLyB3ZSBmb3VuZCB0aGUgImZpbmQiIHBhdHRlcm4gLSBkZWxldGUgaXQKKwkJCQkvLyBGb3IgdW5kbyBzdXBwb3J0LCB0aGUgZmlyc3QgaXRlbSBzaG91bGQgbm90IGJlIGNoYWluZWQKKwkJCQl0ZXh0X2hvbGVfZGVsZXRlKGZvdW5kLCBmb3VuZCArIGxlbl9GIC0gMSwgZG9udF9jaGFpbl9maXJzdF9pdGVtKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9VTkRPCisJCQkJZG9udF9jaGFpbl9maXJzdF9pdGVtID0gQUxMT1dfVU5ET19DSEFJTjsKKyNlbmRpZgorCQkJCS8vIGluc2VydCB0aGUgInJlcGxhY2UiIHBhdGVybgorCQkJCWJpYXMgPSBzdHJpbmdfaW5zZXJ0KGZvdW5kLCBSLCBBTExPV19VTkRPX0NIQUlOKTsKKwkJCQlmb3VuZCArPSBiaWFzOworCQkJCWxzICs9IGJpYXM7CisJCQkJLypxICs9IGJpYXM7IC0gcmVjYWxjdWxhdGVkIGFueXdheSAqLworCQkJCS8vIGNoZWNrIGZvciAiZ2xvYmFsIiAgOnMvZm9vL2Jhci9nCisJCQkJaWYgKGdmbGFnID09ICdnJykgeworCQkJCQlpZiAoKGZvdW5kICsgbGVuX1IpIDwgZW5kX2xpbmUobHMpKSB7CisJCQkJCQlxID0gZm91bmQgKyBsZW5fUjsKKwkJCQkJCWdvdG8gdmM0OwkvLyBkb24ndCBsZXQgcSBtb3ZlIHBhc3QgY3VyIGxpbmUKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCXEgPSBuZXh0X2xpbmUobHMpOworCQl9CisjZW5kaWYgLyogRkVBVFVSRV9WSV9TRUFSQ0ggKi8KKwl9IGVsc2UgaWYgKHN0cm5jbXAoY21kLCAidmVyc2lvbiIsIGkpID09IDApIHsgIC8vIHNob3cgc29mdHdhcmUgdmVyc2lvbgorCQlzdGF0dXNfbGluZShCQl9WRVIgIiAiIEJCX0JUKTsKKwl9IGVsc2UgaWYgKHN0cm5jbXAoY21kLCAid3JpdGUiLCBpKSA9PSAwICAvLyB3cml0ZSB0ZXh0IHRvIGZpbGUKKwkgICAgICAgIHx8IHN0cm5jbXAoY21kLCAid3EiLCBpKSA9PSAwCisJICAgICAgICB8fCBzdHJuY21wKGNtZCwgInduIiwgaSkgPT0gMAorCSAgICAgICAgfHwgKGNtZFswXSA9PSAneCcgJiYgIWNtZFsxXSkKKwkpIHsKKwkJaW50IHNpemU7CisJCS8vaW50IGZvcmNlZCA9IEZBTFNFOworCisJCS8vIGlzIHRoZXJlIGEgZmlsZSBuYW1lIHRvIHdyaXRlIHRvPworCQlpZiAoYXJnc1swXSkgeworCQkJZm4gPSBhcmdzOworCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfUkVBRE9OTFkKKwkJaWYgKHJlYWRvbmx5X21vZGUgJiYgIXVzZWZvcmNlKSB7CisJCQlzdGF0dXNfbGluZV9ib2xkKCInJXMnIGlzIHJlYWQgb25seSIsIGZuKTsKKwkJCWdvdG8gcmV0OworCQl9CisjZW5kaWYKKwkJLy8gaG93IG1hbnkgbGluZXMgaW4gdGV4dFtdPworCQlsaSA9IGNvdW50X2xpbmVzKHEsIHIpOworCQlzaXplID0gciAtIHEgKyAxOworCQkvL2lmICh1c2Vmb3JjZSkgeworCQkJLy8gaWYgImZuIiBpcyBub3Qgd3JpdGUtYWJsZSwgY2htb2QgdSt3CisJCQkvLyBzcHJpbnRmKHN5c2NtZCwgImNobW9kIHUrdyAlcyIsIGZuKTsKKwkJCS8vIHN5c3RlbShzeXNjbWQpOworCQkJLy8gZm9yY2VkID0gVFJVRTsKKwkJLy99CisJCWwgPSBmaWxlX3dyaXRlKGZuLCBxLCByKTsKKwkJLy9pZiAodXNlZm9yY2UgJiYgZm9yY2VkKSB7CisJCQkvLyBjaG1vZCB1LXcKKwkJCS8vIHNwcmludGYoc3lzY21kLCAiY2htb2QgdS13ICVzIiwgZm4pOworCQkJLy8gc3lzdGVtKHN5c2NtZCk7CisJCQkvLyBmb3JjZWQgPSBGQUxTRTsKKwkJLy99CisJCWlmIChsIDwgMCkgeworCQkJaWYgKGwgPT0gLTEpCisJCQkJc3RhdHVzX2xpbmVfYm9sZF9lcnJubyhmbik7CisJCX0gZWxzZSB7CisJCQlzdGF0dXNfbGluZSgiJyVzJyAlZEwsICVkQyIsIGZuLCBsaSwgbCk7CisJCQlpZiAocSA9PSB0ZXh0ICYmIHIgPT0gZW5kIC0gMSAmJiBsID09IHNpemUpIHsKKwkJCQltb2RpZmllZF9jb3VudCA9IDA7CisJCQkJbGFzdF9tb2RpZmllZF9jb3VudCA9IC0xOworCQkJfQorCQkJaWYgKChjbWRbMF0gPT0gJ3gnIHx8IGNtZFsxXSA9PSAncScgfHwgY21kWzFdID09ICduJworCQkJICAgIHx8IGNtZFswXSA9PSAnWCcgfHwgY21kWzFdID09ICdRJyB8fCBjbWRbMV0gPT0gJ04nCisJCQkgICAgKQorCQkJICYmIGwgPT0gc2l6ZQorCQkJKSB7CisJCQkJZWRpdGluZyA9IDA7CisJCQl9CisJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSworCX0gZWxzZSBpZiAoc3RybmNtcChjbWQsICJ5YW5rIiwgaSkgPT0gMCkgewkvLyB5YW5rIGxpbmVzCisJCWlmIChiIDwgMCkgewkvLyBubyBhZGRyIGdpdmVuLSB1c2UgZGVmYXVsdHMKKwkJCXEgPSBiZWdpbl9saW5lKGRvdCk7CS8vIGFzc3VtZSAuLC4gZm9yIHRoZSByYW5nZQorCQkJciA9IGVuZF9saW5lKGRvdCk7CisJCX0KKwkJdGV4dF95YW5rKHEsIHIsIFlEcmVnKTsKKwkJbGkgPSBjb3VudF9saW5lcyhxLCByKTsKKwkJc3RhdHVzX2xpbmUoIllhbmsgJWQgbGluZXMgKCVkIGNoYXJzKSBpbnRvIFslY10iLAorCQkJCWxpLCBzdHJsZW4ocmVnW1lEcmVnXSksIHdoYXRfcmVnKCkpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJLy8gY21kIHVua25vd24KKwkJbm90X2ltcGxlbWVudGVkKGNtZCk7CisJfQorIHJldDoKKwlkb3QgPSBib3VuZF9kb3QoZG90KTsJLy8gbWFrZSBzdXJlICJkb3QiIGlzIHZhbGlkCisJcmV0dXJuOworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1NFQVJDSAorIGNvbG9uX3NfZmFpbDoKKwlzdGF0dXNfbGluZSgiOnMgZXhwcmVzc2lvbiBtaXNzaW5nIGRlbGltaXRlcnMiKTsKKyNlbmRpZgorI2VuZGlmIC8qIEZFQVRVUkVfVklfQ09MT04gKi8KK30KKworc3RhdGljIHZvaWQgSGl0X1JldHVybih2b2lkKQoreworCWludCBjOworCisJc3RhbmRvdXRfc3RhcnQoKTsKKwl3cml0ZTEoIltIaXQgcmV0dXJuIHRvIGNvbnRpbnVlXSIpOworCXN0YW5kb3V0X2VuZCgpOworCXdoaWxlICgoYyA9IGdldF9vbmVfY2hhcigpKSAhPSAnXG4nICYmIGMgIT0gJ1xyJykKKwkJY29udGludWU7CisJcmVkcmF3KFRSVUUpOwkJLy8gZm9yY2UgcmVkcmF3IGFsbAorfQorCitzdGF0aWMgaW50IG5leHRfdGFic3RvcChpbnQgY29sKQoreworCXJldHVybiBjb2wgKyAoKHRhYnN0b3AgLSAxKSAtIChjb2wgJSB0YWJzdG9wKSk7Cit9CisKKy8vLS0tLS0gU3luY2hyb25pemUgdGhlIGN1cnNvciB0byBEb3QgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyBOT0lOTElORSB2b2lkIHN5bmNfY3Vyc29yKGNoYXIgKmQsIGludCAqcm93LCBpbnQgKmNvbCkKK3sKKwljaGFyICpiZWdfY3VyOwkvLyBiZWdpbiBhbmQgZW5kIG9mICJkIiBsaW5lCisJY2hhciAqdHA7CisJaW50IGNudCwgcm8sIGNvOworCisJYmVnX2N1ciA9IGJlZ2luX2xpbmUoZCk7CS8vIGZpcnN0IGNoYXIgb2YgY3VyIGxpbmUKKworCWlmIChiZWdfY3VyIDwgc2NyZWVuYmVnaW4pIHsKKwkJLy8gImQiIGlzIGJlZm9yZSB0b3AgbGluZSBvbiBzY3JlZW4KKwkJLy8gaG93IG1hbnkgbGluZXMgZG8gd2UgaGF2ZSB0byBtb3ZlCisJCWNudCA9IGNvdW50X2xpbmVzKGJlZ19jdXIsIHNjcmVlbmJlZ2luKTsKKyBzYzE6CisJCXNjcmVlbmJlZ2luID0gYmVnX2N1cjsKKwkJaWYgKGNudCA+IChyb3dzIC0gMSkgLyAyKSB7CisJCQkvLyB3ZSBtb3ZlZCB0b28gbWFueSBsaW5lcy4gcHV0ICJkb3QiIGluIG1pZGRsZSBvZiBzY3JlZW4KKwkJCWZvciAoY250ID0gMDsgY250IDwgKHJvd3MgLSAxKSAvIDI7IGNudCsrKSB7CisJCQkJc2NyZWVuYmVnaW4gPSBwcmV2X2xpbmUoc2NyZWVuYmVnaW4pOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJY2hhciAqZW5kX3NjcjsJLy8gYmVnaW4gYW5kIGVuZCBvZiBzY3JlZW4KKwkJZW5kX3NjciA9IGVuZF9zY3JlZW4oKTsJLy8gbGFzdCBjaGFyIG9mIHNjcmVlbgorCQlpZiAoYmVnX2N1ciA+IGVuZF9zY3IpIHsKKwkJCS8vICJkIiBpcyBhZnRlciBib3R0b20gbGluZSBvbiBzY3JlZW4KKwkJCS8vIGhvdyBtYW55IGxpbmVzIGRvIHdlIGhhdmUgdG8gbW92ZQorCQkJY250ID0gY291bnRfbGluZXMoZW5kX3NjciwgYmVnX2N1cik7CisJCQlpZiAoY250ID4gKHJvd3MgLSAxKSAvIDIpCisJCQkJZ290byBzYzE7CS8vIHRvbyBtYW55IGxpbmVzCisJCQlmb3IgKHJvID0gMDsgcm8gPCBjbnQgLSAxOyBybysrKSB7CisJCQkJLy8gbW92ZSBzY3JlZW4gYmVnaW4gdGhlIHNhbWUgYW1vdW50CisJCQkJc2NyZWVuYmVnaW4gPSBuZXh0X2xpbmUoc2NyZWVuYmVnaW4pOworCQkJCS8vIG5vdywgbW92ZSB0aGUgZW5kIG9mIHNjcmVlbgorCQkJCWVuZF9zY3IgPSBuZXh0X2xpbmUoZW5kX3Njcik7CisJCQkJZW5kX3NjciA9IGVuZF9saW5lKGVuZF9zY3IpOworCQkJfQorCQl9CisJfQorCS8vICJkIiBpcyBvbiBzY3JlZW4tIGZpbmQgb3V0IHdoaWNoIHJvdworCXRwID0gc2NyZWVuYmVnaW47CisJZm9yIChybyA9IDA7IHJvIDwgcm93cyAtIDE7IHJvKyspIHsJLy8gZHJpdmUgInJvIiB0byBjb3JyZWN0IHJvdworCQlpZiAodHAgPT0gYmVnX2N1cikKKwkJCWJyZWFrOworCQl0cCA9IG5leHRfbGluZSh0cCk7CisJfQorCisJLy8gZmluZCBvdXQgd2hhdCBjb2wgImQiIGlzIG9uCisJY28gPSAwOworCXdoaWxlICh0cCA8IGQpIHsgLy8gZHJpdmUgImNvIiB0byBjb3JyZWN0IGNvbHVtbgorCQlpZiAoKnRwID09ICdcbicpIC8vdmRhIHx8ICp0cCA9PSAnXDAnKQorCQkJYnJlYWs7CisJCWlmICgqdHAgPT0gJ1x0JykgeworCQkJLy8gaGFuZGxlIHRhYnMgbGlrZSByZWFsIHZpCisJCQlpZiAoZCA9PSB0cCAmJiBjbWRfbW9kZSkgeworCQkJCWJyZWFrOworCQkJfQorCQkJY28gPSBuZXh0X3RhYnN0b3AoY28pOworCQl9IGVsc2UgaWYgKCh1bnNpZ25lZCBjaGFyKSp0cCA8ICcgJyB8fCAqdHAgPT0gMHg3ZikgeworCQkJY28rKzsgLy8gZGlzcGxheSBhcyBeWCwgdXNlIDIgY29sdW1ucworCQl9CisJCWNvKys7CisJCXRwKys7CisJfQorCisJLy8gImNvIiBpcyB0aGUgY29sdW1uIHdoZXJlICJkb3QiIGlzLgorCS8vIFRoZSBzY3JlZW4gaGFzICJjb2x1bW5zIiBjb2x1bW5zLgorCS8vIFRoZSBjdXJyZW50bHkgZGlzcGxheWVkIGNvbHVtbnMgYXJlICAwK29mZnNldCAtLSBjb2x1bW5zK29mc2V0CisJLy8gfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CisJLy8gICAgICAgICAgICAgICBeIF4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKwkvLyAgICAgICAgb2Zmc2V0IHwgfC0tLS0tLS0gY29sdW1ucyAtLS0tLS0tLS0tLS0tLS0tfAorCS8vCisJLy8gSWYgImNvIiBpcyBhbHJlYWR5IGluIHRoaXMgcmFuZ2UgdGhlbiB3ZSBkbyBub3QgaGF2ZSB0byBhZGp1c3Qgb2Zmc2V0CisJLy8gICAgICBidXQsIHdlIGRvIGhhdmUgdG8gc3VidHJhY3QgdGhlICJvZmZzZXQiIGJpYXMgZnJvbSAiY28iLgorCS8vIElmICJjbyIgaXMgb3V0c2lkZSB0aGlzIHJhbmdlIHRoZW4gd2UgaGF2ZSB0byBjaGFuZ2UgIm9mZnNldCIuCisJLy8gSWYgdGhlIGZpcnN0IGNoYXIgb2YgYSBsaW5lIGlzIGEgdGFiIHRoZSBjdXJzb3Igd2lsbCB0cnkgdG8gc3RheQorCS8vICBpbiBjb2x1bW4gNywgYnV0IHdlIGhhdmUgdG8gc2V0IG9mZnNldCB0byAwLgorCisJaWYgKGNvIDwgMCArIG9mZnNldCkgeworCQlvZmZzZXQgPSBjbzsKKwl9CisJaWYgKGNvID49IGNvbHVtbnMgKyBvZmZzZXQpIHsKKwkJb2Zmc2V0ID0gY28gLSBjb2x1bW5zICsgMTsKKwl9CisJLy8gaWYgdGhlIGZpcnN0IGNoYXIgb2YgdGhlIGxpbmUgaXMgYSB0YWIsIGFuZCAiZG90IiBpcyBzaXR0aW5nIG9uIGl0CisJLy8gIGZvcmNlIG9mZnNldCB0byAwLgorCWlmIChkID09IGJlZ19jdXIgJiYgKmQgPT0gJ1x0JykgeworCQlvZmZzZXQgPSAwOworCX0KKwljbyAtPSBvZmZzZXQ7CisKKwkqcm93ID0gcm87CisJKmNvbCA9IGNvOworfQorCisvLy0tLS0tIFRleHQgTW92ZW1lbnQgUm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgY2hhciAqYmVnaW5fbGluZShjaGFyICpwKSAvLyByZXR1cm4gcG9pbnRlciB0byBmaXJzdCBjaGFyIGN1ciBsaW5lCit7CisJaWYgKHAgPiB0ZXh0KSB7CisJCXAgPSBtZW1yY2hyKHRleHQsICdcbicsIHAgLSB0ZXh0KTsKKwkJaWYgKCFwKQorCQkJcmV0dXJuIHRleHQ7CisJCXJldHVybiBwICsgMTsKKwl9CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyICplbmRfbGluZShjaGFyICpwKSAvLyByZXR1cm4gcG9pbnRlciB0byBOTCBvZiBjdXIgbGluZQoreworCWlmIChwIDwgZW5kIC0gMSkgeworCQlwID0gbWVtY2hyKHAsICdcbicsIGVuZCAtIHAgLSAxKTsKKwkJaWYgKCFwKQorCQkJcmV0dXJuIGVuZCAtIDE7CisJfQorCXJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqZG9sbGFyX2xpbmUoY2hhciAqcCkgLy8gcmV0dXJuIHBvaW50ZXIgdG8ganVzdCBiZWZvcmUgTkwgbGluZQoreworCXAgPSBlbmRfbGluZShwKTsKKwkvLyBUcnkgdG8gc3RheSBvZmYgb2YgdGhlIE5ld2xpbmUKKwlpZiAoKnAgPT0gJ1xuJyAmJiAocCAtIGJlZ2luX2xpbmUocCkpID4gMCkKKwkJcC0tOworCXJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqcHJldl9saW5lKGNoYXIgKnApIC8vIHJldHVybiBwb2ludGVyIGZpcnN0IGNoYXIgcHJldiBsaW5lCit7CisJcCA9IGJlZ2luX2xpbmUocCk7CS8vIGdvdG8gYmVnaW5uaW5nIG9mIGN1ciBsaW5lCisJaWYgKHAgPiB0ZXh0ICYmIHBbLTFdID09ICdcbicpCisJCXAtLTsJCQkvLyBzdGVwIHRvIHByZXYgbGluZQorCXAgPSBiZWdpbl9saW5lKHApOwkvLyBnb3RvIGJlZ2lubmluZyBvZiBwcmV2IGxpbmUKKwlyZXR1cm4gcDsKK30KKworc3RhdGljIGNoYXIgKm5leHRfbGluZShjaGFyICpwKSAvLyByZXR1cm4gcG9pbnRlciBmaXJzdCBjaGFyIG5leHQgbGluZQoreworCXAgPSBlbmRfbGluZShwKTsKKwlpZiAocCA8IGVuZCAtIDEgJiYgKnAgPT0gJ1xuJykKKwkJcCsrOwkJCS8vIHN0ZXAgdG8gbmV4dCBsaW5lCisJcmV0dXJuIHA7Cit9CisKKy8vLS0tLS0gVGV4dCBJbmZvcm1hdGlvbiBSb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyBjaGFyICplbmRfc2NyZWVuKHZvaWQpCit7CisJY2hhciAqcTsKKwlpbnQgY250OworCisJLy8gZmluZCBuZXcgYm90dG9tIGxpbmUKKwlxID0gc2NyZWVuYmVnaW47CisJZm9yIChjbnQgPSAwOyBjbnQgPCByb3dzIC0gMjsgY250KyspCisJCXEgPSBuZXh0X2xpbmUocSk7CisJcSA9IGVuZF9saW5lKHEpOworCXJldHVybiBxOworfQorCisvLyBjb3VudCBsaW5lIGZyb20gc3RhcnQgdG8gc3RvcAorc3RhdGljIGludCBjb3VudF9saW5lcyhjaGFyICpzdGFydCwgY2hhciAqc3RvcCkKK3sKKwljaGFyICpxOworCWludCBjbnQ7CisKKwlpZiAoc3RvcCA8IHN0YXJ0KSB7IC8vIHN0YXJ0IGFuZCBzdG9wIGFyZSBiYWNrd2FyZHMtIHJldmVyc2UgdGhlbQorCQlxID0gc3RhcnQ7CisJCXN0YXJ0ID0gc3RvcDsKKwkJc3RvcCA9IHE7CisJfQorCWNudCA9IDA7CisJc3RvcCA9IGVuZF9saW5lKHN0b3ApOworCXdoaWxlIChzdGFydCA8PSBzdG9wICYmIHN0YXJ0IDw9IGVuZCAtIDEpIHsKKwkJc3RhcnQgPSBlbmRfbGluZShzdGFydCk7CisJCWlmICgqc3RhcnQgPT0gJ1xuJykKKwkJCWNudCsrOworCQlzdGFydCsrOworCX0KKwlyZXR1cm4gY250OworfQorCitzdGF0aWMgY2hhciAqZmluZF9saW5lKGludCBsaSkJLy8gZmluZCBiZWdpbm5pbmcgb2YgbGluZSAjbGkKK3sKKwljaGFyICpxOworCisJZm9yIChxID0gdGV4dDsgbGkgPiAxOyBsaS0tKSB7CisJCXEgPSBuZXh0X2xpbmUocSk7CisJfQorCXJldHVybiBxOworfQorCisvLy0tLS0tIERvdCBNb3ZlbWVudCBSb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCBkb3RfbGVmdCh2b2lkKQoreworCXVuZG9fcXVldWVfY29tbWl0KCk7CisJaWYgKGRvdCA+IHRleHQgJiYgZG90Wy0xXSAhPSAnXG4nKQorCQlkb3QtLTsKK30KKworc3RhdGljIHZvaWQgZG90X3JpZ2h0KHZvaWQpCit7CisJdW5kb19xdWV1ZV9jb21taXQoKTsKKwlpZiAoZG90IDwgZW5kIC0gMSAmJiAqZG90ICE9ICdcbicpCisJCWRvdCsrOworfQorCitzdGF0aWMgdm9pZCBkb3RfYmVnaW4odm9pZCkKK3sKKwl1bmRvX3F1ZXVlX2NvbW1pdCgpOworCWRvdCA9IGJlZ2luX2xpbmUoZG90KTsJLy8gcmV0dXJuIHBvaW50ZXIgdG8gZmlyc3QgY2hhciBjdXIgbGluZQorfQorCitzdGF0aWMgdm9pZCBkb3RfZW5kKHZvaWQpCit7CisJdW5kb19xdWV1ZV9jb21taXQoKTsKKwlkb3QgPSBlbmRfbGluZShkb3QpOwkvLyByZXR1cm4gcG9pbnRlciB0byBsYXN0IGNoYXIgY3VyIGxpbmUKK30KKworc3RhdGljIGNoYXIgKm1vdmVfdG9fY29sKGNoYXIgKnAsIGludCBsKQoreworCWludCBjbzsKKworCXAgPSBiZWdpbl9saW5lKHApOworCWNvID0gMDsKKwl3aGlsZSAoY28gPCBsICYmIHAgPCBlbmQpIHsKKwkJaWYgKCpwID09ICdcbicpIC8vdmRhIHx8ICpwID09ICdcMCcpCisJCQlicmVhazsKKwkJaWYgKCpwID09ICdcdCcpIHsKKwkJCWNvID0gbmV4dF90YWJzdG9wKGNvKTsKKwkJfSBlbHNlIGlmICgqcCA8ICcgJyB8fCAqcCA9PSAxMjcpIHsKKwkJCWNvKys7IC8vIGRpc3BsYXkgYXMgXlgsIHVzZSAyIGNvbHVtbnMKKwkJfQorCQljbysrOworCQlwKys7CisJfQorCXJldHVybiBwOworfQorCitzdGF0aWMgdm9pZCBkb3RfbmV4dCh2b2lkKQoreworCXVuZG9fcXVldWVfY29tbWl0KCk7CisJZG90ID0gbmV4dF9saW5lKGRvdCk7Cit9CisKK3N0YXRpYyB2b2lkIGRvdF9wcmV2KHZvaWQpCit7CisJdW5kb19xdWV1ZV9jb21taXQoKTsKKwlkb3QgPSBwcmV2X2xpbmUoZG90KTsKK30KKworc3RhdGljIHZvaWQgZG90X3Njcm9sbChpbnQgY250LCBpbnQgZGlyKQoreworCWNoYXIgKnE7CisKKwl1bmRvX3F1ZXVlX2NvbW1pdCgpOworCWZvciAoOyBjbnQgPiAwOyBjbnQtLSkgeworCQlpZiAoZGlyIDwgMCkgeworCQkJLy8gc2Nyb2xsIEJhY2t3YXJkcworCQkJLy8gY3RybC1ZIHNjcm9sbCB1cCBvbmUgbGluZQorCQkJc2NyZWVuYmVnaW4gPSBwcmV2X2xpbmUoc2NyZWVuYmVnaW4pOworCQl9IGVsc2UgeworCQkJLy8gc2Nyb2xsIEZvcndhcmRzCisJCQkvLyBjdHJsLUUgc2Nyb2xsIGRvd24gb25lIGxpbmUKKwkJCXNjcmVlbmJlZ2luID0gbmV4dF9saW5lKHNjcmVlbmJlZ2luKTsKKwkJfQorCX0KKwkvLyBtYWtlIHN1cmUgImRvdCIgc3RheXMgb24gdGhlIHNjcmVlbiBzbyB3ZSBkb250IHNjcm9sbCBvZmYKKwlpZiAoZG90IDwgc2NyZWVuYmVnaW4pCisJCWRvdCA9IHNjcmVlbmJlZ2luOworCXEgPSBlbmRfc2NyZWVuKCk7CS8vIGZpbmQgbmV3IGJvdHRvbSBsaW5lCisJaWYgKGRvdCA+IHEpCisJCWRvdCA9IGJlZ2luX2xpbmUocSk7CS8vIGlzIGRvdCBpcyBiZWxvdyBib3R0b20gbGluZT8KKwlkb3Rfc2tpcF9vdmVyX3dzKCk7Cit9CisKK3N0YXRpYyB2b2lkIGRvdF9za2lwX292ZXJfd3Modm9pZCkKK3sKKwkvLyBza2lwIFdTCisJd2hpbGUgKGlzc3BhY2UoKmRvdCkgJiYgKmRvdCAhPSAnXG4nICYmIGRvdCA8IGVuZCAtIDEpCisJCWRvdCsrOworfQorCitzdGF0aWMgY2hhciAqYm91bmRfZG90KGNoYXIgKnApIC8vIG1ha2Ugc3VyZSAgdGV4dFswXSA8PSBQIDwgImVuZCIKK3sKKwlpZiAocCA+PSBlbmQgJiYgZW5kID4gdGV4dCkgeworCQlwID0gZW5kIC0gMTsKKwkJaW5kaWNhdGVfZXJyb3IoKTsKKwl9CisJaWYgKHAgPCB0ZXh0KSB7CisJCXAgPSB0ZXh0OworCQlpbmRpY2F0ZV9lcnJvcigpOworCX0KKwlyZXR1cm4gcDsKK30KKworLy8tLS0tLSBIZWxwZXIgVXRpbGl0eSBSb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLS0tLS0gQ2hhciBSb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLyogQ2hhcnMgdGhhdCBhcmUgcGFydCBvZiBhIHdvcmQtCisgKiAgICAwMTIzNDU2Nzg5X0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoKKyAqIENoYXJzIHRoYXQgYXJlIE5vdCBwYXJ0IG9mIGEgd29yZCAoc3RvcHBlcnMpCisgKiAgICAhIiMkJSYnKCkqKywtLi86Ozw9Pj9AW1xdXmB7fH1+CisgKiBDaGFycyB0aGF0IGFyZSBXaGl0ZVNwYWNlCisgKiAgICBUQUIgTkVXTElORSBWVCBGRiBSRVRVUk4gU1BBQ0UKKyAqIERPIE5PVCBDT1VOVCBORVdMSU5FIEFTIFdISVRFU1BBQ0UKKyAqLworCitzdGF0aWMgY2hhciAqbmV3X3NjcmVlbihpbnQgcm8sIGludCBjbykKK3sKKwlpbnQgbGk7CisKKwlmcmVlKHNjcmVlbik7CisJc2NyZWVuc2l6ZSA9IHJvICogY28gKyA4OworCXNjcmVlbiA9IHhtYWxsb2Moc2NyZWVuc2l6ZSk7CisJLy8gaW5pdGlhbGl6ZSB0aGUgbmV3IHNjcmVlbi4gYXNzdW1lIHRoaXMgd2lsbCBiZSBhIGVtcHR5IGZpbGUuCisJc2NyZWVuX2VyYXNlKCk7CisJLy8gICBub24tZXhpc3RlbnQgdGV4dFtdIGxpbmVzIHN0YXJ0IHdpdGggYSB0aWxkZSAofikuCisJZm9yIChsaSA9IDE7IGxpIDwgcm8gLSAxOyBsaSsrKSB7CisJCXNjcmVlblsobGkgKiBjbykgKyAwXSA9ICd+JzsKKwl9CisJcmV0dXJuIHNjcmVlbjsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1NFQVJDSAorCisjIGlmIEVOQUJMRV9GRUFUVVJFX1ZJX1JFR0VYX1NFQVJDSAorCisvLyBzZWFyY2ggZm9yIHBhdHRlcm4gc3RhcnRpbmcgYXQgcAorc3RhdGljIGNoYXIgKmNoYXJfc2VhcmNoKGNoYXIgKnAsIGNvbnN0IGNoYXIgKnBhdCwgaW50IGRpciwgaW50IHJhbmdlKQoreworCXN0cnVjdCByZV9wYXR0ZXJuX2J1ZmZlciBwcmVnOworCWNvbnN0IGNoYXIgKmVycjsKKwljaGFyICpxOworCWludCBpOworCWludCBzaXplOworCisJcmVfc3ludGF4X29wdGlvbnMgPSBSRV9TWU5UQVhfUE9TSVhfRVhURU5ERUQ7CisJaWYgKGlnbm9yZWNhc2UpCisJCXJlX3N5bnRheF9vcHRpb25zID0gUkVfU1lOVEFYX1BPU0lYX0VYVEVOREVEIHwgUkVfSUNBU0U7CisKKwltZW1zZXQoJnByZWcsIDAsIHNpemVvZihwcmVnKSk7CisJZXJyID0gcmVfY29tcGlsZV9wYXR0ZXJuKHBhdCwgc3RybGVuKHBhdCksICZwcmVnKTsKKwlpZiAoZXJyICE9IE5VTEwpIHsKKwkJc3RhdHVzX2xpbmVfYm9sZCgiYmFkIHNlYXJjaCBwYXR0ZXJuICclcyc6ICVzIiwgcGF0LCBlcnIpOworCQlyZXR1cm4gcDsKKwl9CisKKwkvLyBhc3N1bWUgYSBMSU1JVEVEIGZvcndhcmQgc2VhcmNoCisJcSA9IGVuZCAtIDE7CisJaWYgKGRpciA9PSBCQUNLKQorCQlxID0gdGV4dDsKKwkvLyBSQU5HRSBjb3VsZCBiZSBuZWdhdGl2ZSBpZiB3ZSBhcmUgc2VhcmNoaW5nIGJhY2t3YXJkcworCXJhbmdlID0gcSAtIHA7CisJcSA9IHA7CisJc2l6ZSA9IHJhbmdlOworCWlmIChyYW5nZSA8IDApIHsKKwkJc2l6ZSA9IC1zaXplOworCQlxID0gcCAtIHNpemU7CisJCWlmIChxIDwgdGV4dCkKKwkJCXEgPSB0ZXh0OworCX0KKwkvLyBzZWFyY2ggZm9yIHRoZSBjb21waWxlZCBwYXR0ZXJuLCBwcmVnLCBpbiBwW10KKwkvLyByYW5nZSA8IDA6IHNlYXJjaCBiYWNrd2FyZAorCS8vIHJhbmdlID4gMDogc2VhcmNoIGZvcndhcmQKKwkvLyAwIDwgc3RhcnQgPCBzaXplCisJLy8gcmVfc2VhcmNoKCkgPCAwOiBub3QgZm91bmQgb3IgZXJyb3IKKwkvLyByZV9zZWFyY2goKSA+PSAwOiBpbmRleCBvZiBmb3VuZCBwYXR0ZXJuCisJLy8gICAgICAgICAgIHN0cnVjdCBwYXR0ZXJuICAgY2hhciAgICAgaW50ICAgaW50ICAgIGludCAgICBzdHJ1Y3QgcmVnCisJLy8gcmVfc2VhcmNoKCpwYXR0ZXJuX2J1ZmZlciwgKnN0cmluZywgc2l6ZSwgc3RhcnQsIHJhbmdlLCAqcmVncykKKwlpID0gcmVfc2VhcmNoKCZwcmVnLCBxLCBzaXplLCAvKnN0YXJ0OiovIDAsIHJhbmdlLCAvKnN0cnVjdCByZV9yZWdpc3RlcnMqOiovIE5VTEwpOworCXJlZ2ZyZWUoJnByZWcpOworCWlmIChpIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGRpciA9PSBGT1JXQVJEKQorCQlwID0gcCArIGk7CisJZWxzZQorCQlwID0gcCAtIGk7CisJcmV0dXJuIHA7Cit9CisKKyMgZWxzZQorCisjICBpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRVRPUFRTCitzdGF0aWMgaW50IG15Y21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgaW50IGxlbikKK3sKKwlpZiAoaWdub3JlY2FzZSkgeworCQlyZXR1cm4gc3RybmNhc2VjbXAoczEsIHMyLCBsZW4pOworCX0KKwlyZXR1cm4gc3RybmNtcChzMSwgczIsIGxlbik7Cit9CisjICBlbHNlCisjICAgZGVmaW5lIG15Y21wIHN0cm5jbXAKKyMgIGVuZGlmCisKK3N0YXRpYyBjaGFyICpjaGFyX3NlYXJjaChjaGFyICpwLCBjb25zdCBjaGFyICpwYXQsIGludCBkaXIsIGludCByYW5nZSkKK3sKKwljaGFyICpzdGFydCwgKnN0b3A7CisJaW50IGxlbjsKKworCWxlbiA9IHN0cmxlbihwYXQpOworCWlmIChkaXIgPT0gRk9SV0FSRCkgeworCQlzdG9wID0gZW5kIC0gMTsJLy8gYXNzdW1lIHJhbmdlIGlzIHAuLmVuZC0xCisJCWlmIChyYW5nZSA9PSBMSU1JVEVEKQorCQkJc3RvcCA9IG5leHRfbGluZShwKTsJLy8gcmFuZ2UgaXMgdG8gbmV4dCBsaW5lCisJCWZvciAoc3RhcnQgPSBwOyBzdGFydCA8IHN0b3A7IHN0YXJ0KyspIHsKKwkJCWlmIChteWNtcChzdGFydCwgcGF0LCBsZW4pID09IDApIHsKKwkJCQlyZXR1cm4gc3RhcnQ7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKGRpciA9PSBCQUNLKSB7CisJCXN0b3AgPSB0ZXh0OwkvLyBhc3N1bWUgcmFuZ2UgaXMgdGV4dC4ucAorCQlpZiAocmFuZ2UgPT0gTElNSVRFRCkKKwkJCXN0b3AgPSBwcmV2X2xpbmUocCk7CS8vIHJhbmdlIGlzIHRvIHByZXYgbGluZQorCQlmb3IgKHN0YXJ0ID0gcCAtIGxlbjsgc3RhcnQgPj0gc3RvcDsgc3RhcnQtLSkgeworCQkJaWYgKG15Y21wKHN0YXJ0LCBwYXQsIGxlbikgPT0gMCkgeworCQkJCXJldHVybiBzdGFydDsKKwkJCX0KKwkJfQorCX0KKwkvLyBwYXR0ZXJuIG5vdCBmb3VuZAorCXJldHVybiBOVUxMOworfQorCisjIGVuZGlmCisKKyNlbmRpZiAvKiBGRUFUVVJFX1ZJX1NFQVJDSCAqLworCitzdGF0aWMgY2hhciAqY2hhcl9pbnNlcnQoY2hhciAqcCwgY2hhciBjLCBpbnQgdW5kbykgLy8gaW5zZXJ0IHRoZSBjaGFyIGMgYXQgJ3AnCit7CisJaWYgKGMgPT0gMjIpIHsJCS8vIElzIHRoaXMgYW4gY3RybC1WPworCQlwICs9IHN0dXBpZF9pbnNlcnQocCwgJ14nKTsJLy8gdXNlIF4gdG8gaW5kaWNhdGUgbGl0ZXJhbCBuZXh0CisJCXJlZnJlc2goRkFMU0UpOwkvLyBzaG93IHRoZSBeCisJCWMgPSBnZXRfb25lX2NoYXIoKTsKKwkJKnAgPSBjOworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1VORE8KKwkJc3dpdGNoICh1bmRvKSB7CisJCQljYXNlIEFMTE9XX1VORE86CisJCQkJdW5kb19wdXNoKHAsIDEsIFVORE9fSU5TKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUxMT1dfVU5ET19DSEFJTjoKKwkJCQl1bmRvX3B1c2gocCwgMSwgVU5ET19JTlNfQ0hBSU4pOworCQkJCWJyZWFrOworIyBpZiBFTkFCTEVfRkVBVFVSRV9WSV9VTkRPX1FVRVVFCisJCQljYXNlIEFMTE9XX1VORE9fUVVFVUVEOgorCQkJCXVuZG9fcHVzaChwLCAxLCBVTkRPX0lOU19RVUVVRUQpOworCQkJCWJyZWFrOworIyBlbmRpZgorCQl9CisjZWxzZQorCQltb2RpZmllZF9jb3VudCsrOworI2VuZGlmIC8qIEVOQUJMRV9GRUFUVVJFX1ZJX1VORE8gKi8KKwkJcCsrOworCX0gZWxzZSBpZiAoYyA9PSAyNykgewkvLyBJcyB0aGlzIGFuIEVTQz8KKwkJY21kX21vZGUgPSAwOworCQl1bmRvX3F1ZXVlX2NvbW1pdCgpOworCQljbWRjbnQgPSAwOworCQllbmRfY21kX3EoKTsJLy8gc3RvcCBhZGRpbmcgdG8gcQorCQlsYXN0X3N0YXR1c19ja3N1bSA9IDA7CS8vIGZvcmNlIHN0YXR1cyB1cGRhdGUKKwkJaWYgKChwWy0xXSAhPSAnXG4nKSAmJiAoZG90ID4gdGV4dCkpIHsKKwkJCXAtLTsKKwkJfQorCX0gZWxzZSBpZiAoYyA9PSBlcmFzZV9jaGFyIHx8IGMgPT0gOCB8fCBjID09IDEyNykgeyAvLyBJcyB0aGlzIGEgQlMKKwkJaWYgKHAgPiB0ZXh0KSB7CisJCQlwLS07CisJCQlwID0gdGV4dF9ob2xlX2RlbGV0ZShwLCBwLCBBTExPV19VTkRPX1FVRVVFRCk7CS8vIHNocmluayBidWZmZXIgMSBjaGFyCisJCX0KKwl9IGVsc2UgeworCQkvLyBpbnNlcnQgYSBjaGFyIGludG8gdGV4dFtdCisJCWlmIChjID09IDEzKQorCQkJYyA9ICdcbic7CS8vIHRyYW5zbGF0ZSBcciB0byBcbgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1VORE8KKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVklfVU5ET19RVUVVRQorCQlpZiAoYyA9PSAnXG4nKQorCQkJdW5kb19xdWV1ZV9jb21taXQoKTsKKyMgZW5kaWYKKwkJc3dpdGNoICh1bmRvKSB7CisJCQljYXNlIEFMTE9XX1VORE86CisJCQkJdW5kb19wdXNoKHAsIDEsIFVORE9fSU5TKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUxMT1dfVU5ET19DSEFJTjoKKwkJCQl1bmRvX3B1c2gocCwgMSwgVU5ET19JTlNfQ0hBSU4pOworCQkJCWJyZWFrOworIyBpZiBFTkFCTEVfRkVBVFVSRV9WSV9VTkRPX1FVRVVFCisJCQljYXNlIEFMTE9XX1VORE9fUVVFVUVEOgorCQkJCXVuZG9fcHVzaChwLCAxLCBVTkRPX0lOU19RVUVVRUQpOworCQkJCWJyZWFrOworIyBlbmRpZgorCQl9CisjZWxzZQorCQltb2RpZmllZF9jb3VudCsrOworI2VuZGlmIC8qIEVOQUJMRV9GRUFUVVJFX1ZJX1VORE8gKi8KKwkJcCArPSAxICsgc3R1cGlkX2luc2VydChwLCBjKTsJLy8gaW5zZXJ0IHRoZSBjaGFyCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VUT1BUUworCQlpZiAoc2hvd21hdGNoICYmIHN0cmNocigiKV19IiwgYykgIT0gTlVMTCkgeworCQkJc2hvd21hdGNoaW5nKHAgLSAxKTsKKwkJfQorCQlpZiAoYXV0b2luZGVudCAmJiBjID09ICdcbicpIHsJLy8gYXV0byBpbmRlbnQgdGhlIG5ldyBsaW5lCisJCQljaGFyICpxOworCQkJc2l6ZV90IGxlbjsKKwkJCXEgPSBwcmV2X2xpbmUocCk7CS8vIHVzZSBwcmV2IGxpbmUgYXMgdGVtcGxhdGUKKwkJCWxlbiA9IHN0cnNwbihxLCAiIFx0Iik7IC8vIHNwYWNlIG9yIHRhYgorCQkJaWYgKGxlbikgeworCQkJCXVpbnRwdHJfdCBiaWFzOworCQkJCWJpYXMgPSB0ZXh0X2hvbGVfbWFrZShwLCBsZW4pOworCQkJCXAgKz0gYmlhczsKKwkJCQlxICs9IGJpYXM7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfVU5ETworCQkJCXVuZG9fcHVzaChwLCBsZW4sIFVORE9fSU5TKTsKKyNlbmRpZgorCQkJCW1lbWNweShwLCBxLCBsZW4pOworCQkJCXAgKz0gbGVuOworCQkJfQorCQl9CisjZW5kaWYKKwl9CisJcmV0dXJuIHA7Cit9CisKKy8vIG1pZ2h0IHJlYWxsb2NhdGUgdGV4dFtdISB1c2UgcCArPSBzdHVwaWRfaW5zZXJ0KHAsIC4uLiksCisvLyBhbmQgYmUgY2FyZWZ1bCB0byBub3QgdXNlIHBvaW50ZXJzIGludG8gcG90ZW50aWFsbHkgZnJlZWQgdGV4dFtdIQorc3RhdGljIHVpbnRwdHJfdCBzdHVwaWRfaW5zZXJ0KGNoYXIgKnAsIGNoYXIgYykgLy8gc3R1cGlkbHkgaW5zZXJ0IHRoZSBjaGFyIGMgYXQgJ3AnCit7CisJdWludHB0cl90IGJpYXM7CisJYmlhcyA9IHRleHRfaG9sZV9tYWtlKHAsIDEpOworCXAgKz0gYmlhczsKKwkqcCA9IGM7CisJcmV0dXJuIGJpYXM7Cit9CisKK3N0YXRpYyBpbnQgZmluZF9yYW5nZShjaGFyICoqc3RhcnQsIGNoYXIgKipzdG9wLCBjaGFyIGMpCit7CisJY2hhciAqc2F2ZV9kb3QsICpwLCAqcSwgKnQ7CisJaW50IGNudCwgbXVsdGlsaW5lID0gMDsKKworCXNhdmVfZG90ID0gZG90OworCXAgPSBxID0gZG90OworCisJaWYgKHN0cmNocigiY2R5PjwiLCBjKSkgeworCQkvLyB0aGVzZSBjbWRzIG9wZXJhdGUgb24gd2hvbGUgbGluZXMKKwkJcCA9IHEgPSBiZWdpbl9saW5lKHApOworCQlmb3IgKGNudCA9IDE7IGNudCA8IGNtZGNudDsgY250KyspIHsKKwkJCXEgPSBuZXh0X2xpbmUocSk7CisJCX0KKwkJcSA9IGVuZF9saW5lKHEpOworCX0gZWxzZSBpZiAoc3RyY2hyKCJeJSQwYkJlRWZ0aFxiXDE3NyIsIGMpKSB7CisJCS8vIFRoZXNlIGNtZHMgb3BlcmF0ZSBvbiBjaGFyIHBvc2l0aW9ucworCQlkb19jbWQoYyk7CQkvLyBleGVjdXRlIG1vdmVtZW50IGNtZAorCQlxID0gZG90OworCX0gZWxzZSBpZiAoc3RyY2hyKCJ3VyIsIGMpKSB7CisJCWRvX2NtZChjKTsJCS8vIGV4ZWN1dGUgbW92ZW1lbnQgY21kCisJCS8vIGlmIHdlIGFyZSBhdCB0aGUgbmV4dCB3b3JkJ3MgZmlyc3QgY2hhcgorCQkvLyBzdGVwIGJhY2sgb25lIGNoYXIKKwkJLy8gYnV0IGNoZWNrIHRoZSBwb3NzaWJpbGl0aWVzIHdoZW4gaXQgaXMgdHJ1ZQorCQlpZiAoZG90ID4gdGV4dCAmJiAoKGlzc3BhY2UoZG90Wy0xXSkgJiYgIWlzc3BhY2UoZG90WzBdKSkKKwkJCQl8fCAoaXNwdW5jdChkb3RbLTFdKSAmJiAhaXNwdW5jdChkb3RbMF0pKQorCQkJCXx8IChpc2FsbnVtKGRvdFstMV0pICYmICFpc2FsbnVtKGRvdFswXSkpKSkKKwkJCWRvdC0tOwkJLy8gbW92ZSBiYWNrIG9mZiBvZiBuZXh0IHdvcmQKKwkJaWYgKGRvdCA+IHRleHQgJiYgKmRvdCA9PSAnXG4nKQorCQkJZG90LS07CQkvLyBzdGF5IG9mZiBOTAorCQlxID0gZG90OworCX0gZWxzZSBpZiAoc3RyY2hyKCJILWt7IiwgYykpIHsKKwkJLy8gdGhlc2Ugb3BlcmF0ZSBvbiBtdWx0aS1saW5lcyBiYWNrd2FyZHMKKwkJcSA9IGVuZF9saW5lKGRvdCk7CS8vIGZpbmQgTkwKKwkJZG9fY21kKGMpOwkJLy8gZXhlY3V0ZSBtb3ZlbWVudCBjbWQKKwkJZG90X2JlZ2luKCk7CisJCXAgPSBkb3Q7CisJfSBlbHNlIGlmIChzdHJjaHIoIkwran1cclxuIiwgYykpIHsKKwkJLy8gdGhlc2Ugb3BlcmF0ZSBvbiBtdWx0aS1saW5lcyBmb3J3YXJkcworCQlwID0gYmVnaW5fbGluZShkb3QpOworCQlkb19jbWQoYyk7CQkvLyBleGVjdXRlIG1vdmVtZW50IGNtZAorCQlkb3RfZW5kKCk7CQkvLyBmaW5kIE5MCisJCXEgPSBkb3Q7CisJfSBlbHNlIHsKKwkJLy8gbm90aGluZyAtLSB0aGlzIGNhdXNlcyBhbnkgb3RoZXIgdmFsdWVzIG9mIGMgdG8KKwkJLy8gcmVwcmVzZW50IHRoZSBvbmUtY2hhcmFjdGVyIHJhbmdlIHVuZGVyIHRoZQorCQkvLyBjdXJzb3IuICB0aGlzIGlzIGNvcnJlY3QgZm9yICcgJyBhbmQgJ2wnLCBidXQKKwkJLy8gcGVyaGFwcyBubyBvdGhlcnMuCisJCS8vCisJfQorCWlmIChxIDwgcCkgeworCQl0ID0gcTsKKwkJcSA9IHA7CisJCXAgPSB0OworCX0KKworCS8vIGJhY2t3YXJkIGNoYXIgbW92ZW1lbnRzIGRvbid0IGluY2x1ZGUgc3RhcnQgcG9zaXRpb24KKwlpZiAocSA+IHAgJiYgc3RyY2hyKCJeMGJCaFxiXDE3NyIsIGMpKSBxLS07CisKKwltdWx0aWxpbmUgPSAwOworCWZvciAodCA9IHA7IHQgPD0gcTsgdCsrKSB7CisJCWlmICgqdCA9PSAnXG4nKSB7CisJCQltdWx0aWxpbmUgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkqc3RhcnQgPSBwOworCSpzdG9wID0gcTsKKwlkb3QgPSBzYXZlX2RvdDsKKwlyZXR1cm4gbXVsdGlsaW5lOworfQorCitzdGF0aWMgaW50IHN0X3Rlc3QoY2hhciAqcCwgaW50IHR5cGUsIGludCBkaXIsIGNoYXIgKnRlc3RlZCkKK3sKKwljaGFyIGMsIGMwLCBjaTsKKwlpbnQgdGVzdCwgaW5jOworCisJaW5jID0gZGlyOworCWMgPSBjMCA9IHBbMF07CisJY2kgPSBwW2luY107CisJdGVzdCA9IDA7CisKKwlpZiAodHlwZSA9PSBTX0JFRk9SRV9XUykgeworCQljID0gY2k7CisJCXRlc3QgPSAoIWlzc3BhY2UoYykgfHwgYyA9PSAnXG4nKTsKKwl9CisJaWYgKHR5cGUgPT0gU19UT19XUykgeworCQljID0gYzA7CisJCXRlc3QgPSAoIWlzc3BhY2UoYykgfHwgYyA9PSAnXG4nKTsKKwl9CisJaWYgKHR5cGUgPT0gU19PVkVSX1dTKSB7CisJCWMgPSBjMDsKKwkJdGVzdCA9IGlzc3BhY2UoYyk7CisJfQorCWlmICh0eXBlID09IFNfRU5EX1BVTkNUKSB7CisJCWMgPSBjaTsKKwkJdGVzdCA9IGlzcHVuY3QoYyk7CisJfQorCWlmICh0eXBlID09IFNfRU5EX0FMTlVNKSB7CisJCWMgPSBjaTsKKwkJdGVzdCA9IChpc2FsbnVtKGMpIHx8IGMgPT0gJ18nKTsKKwl9CisJKnRlc3RlZCA9IGM7CisJcmV0dXJuIHRlc3Q7Cit9CisKK3N0YXRpYyBjaGFyICpza2lwX3RoaW5nKGNoYXIgKnAsIGludCBsaW5lY250LCBpbnQgZGlyLCBpbnQgdHlwZSkKK3sKKwljaGFyIGM7CisKKwl3aGlsZSAoc3RfdGVzdChwLCB0eXBlLCBkaXIsICZjKSkgeworCQkvLyBtYWtlIHN1cmUgd2UgbGltaXQgc2VhcmNoIHRvIGNvcnJlY3QgbnVtYmVyIG9mIGxpbmVzCisJCWlmIChjID09ICdcbicgJiYgLS1saW5lY250IDwgMSkKKwkJCWJyZWFrOworCQlpZiAoZGlyID49IDAgJiYgcCA+PSBlbmQgLSAxKQorCQkJYnJlYWs7CisJCWlmIChkaXIgPCAwICYmIHAgPD0gdGV4dCkKKwkJCWJyZWFrOworCQlwICs9IGRpcjsJCS8vIG1vdmUgdG8gbmV4dCBjaGFyCisJfQorCXJldHVybiBwOworfQorCisvLyBmaW5kIG1hdGNoaW5nIGNoYXIgb2YgcGFpciAgKCkgIFtdICB7fQorLy8gd2lsbCBjcmFzaCBpZiBjIGlzIG5vdCBvbmUgb2YgdGhlc2UKK3N0YXRpYyBjaGFyICpmaW5kX3BhaXIoY2hhciAqcCwgY29uc3QgY2hhciBjKQoreworCWNvbnN0IGNoYXIgKmJyYWNlcyA9ICIoKVtde30iOworCWNoYXIgbWF0Y2g7CisJaW50IGRpciwgbGV2ZWw7CisKKwlkaXIgPSBzdHJjaHIoYnJhY2VzLCBjKSAtIGJyYWNlczsKKwlkaXIgXj0gMTsKKwltYXRjaCA9IGJyYWNlc1tkaXJdOworCWRpciA9ICgoZGlyICYgMSkgPDwgMSkgLSAxOyAvKiAxIGZvciAoW3ssIC0xIGZvciApXH0gKi8KKworCS8vIGxvb2sgZm9yIG1hdGNoLCBjb3VudCBsZXZlbHMgb2YgcGFpcnMgICgoICkpCisJbGV2ZWwgPSAxOworCWZvciAoOzspIHsKKwkJcCArPSBkaXI7CisJCWlmIChwIDwgdGV4dCB8fCBwID49IGVuZCkKKwkJCXJldHVybiBOVUxMOworCQlpZiAoKnAgPT0gYykKKwkJCWxldmVsKys7CS8vIGluY3JlYXNlIHBhaXIgbGV2ZWxzCisJCWlmICgqcCA9PSBtYXRjaCkgeworCQkJbGV2ZWwtLTsJLy8gcmVkdWNlIHBhaXIgbGV2ZWwKKwkJCWlmIChsZXZlbCA9PSAwKQorCQkJCXJldHVybiBwOyAvLyBmb3VuZCBtYXRjaGluZyBwYWlyCisJCX0KKwl9Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRVRPUFRTCisvLyBzaG93IHRoZSBtYXRjaGluZyBjaGFyIG9mIGEgcGFpciwgICgpICBbXSAge30KK3N0YXRpYyB2b2lkIHNob3dtYXRjaGluZyhjaGFyICpwKQoreworCWNoYXIgKnEsICpzYXZlX2RvdDsKKworCS8vIHdlIGZvdW5kIGhhbGYgb2YgYSBwYWlyCisJcSA9IGZpbmRfcGFpcihwLCAqcCk7CS8vIGdldCBsb2Mgb2YgbWF0Y2hpbmcgY2hhcgorCWlmIChxID09IE5VTEwpIHsKKwkJaW5kaWNhdGVfZXJyb3IoKTsJLy8gbm8gbWF0Y2hpbmcgY2hhcgorCX0gZWxzZSB7CisJCS8vICJxIiBub3cgcG9pbnRzIHRvIG1hdGNoaW5nIHBhaXIKKwkJc2F2ZV9kb3QgPSBkb3Q7CS8vIHJlbWVtYmVyIHdoZXJlIHdlIGFyZQorCQlkb3QgPSBxOwkJLy8gZ28gdG8gbmV3IGxvYworCQlyZWZyZXNoKEZBTFNFKTsJLy8gbGV0IHRoZSB1c2VyIHNlZSBpdAorCQlteXNsZWVwKDQwKTsJLy8gZ2l2ZSB1c2VyIHNvbWUgdGltZQorCQlkb3QgPSBzYXZlX2RvdDsJLy8gZ28gYmFjayB0byBvbGQgbG9jCisJCXJlZnJlc2goRkFMU0UpOworCX0KK30KKyNlbmRpZiAvKiBGRUFUVVJFX1ZJX1NFVE9QVFMgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1VORE8KK3N0YXRpYyB2b2lkIGZsdXNoX3VuZG9fZGF0YSh2b2lkKQoreworCXN0cnVjdCB1bmRvX29iamVjdCAqdW5kb19lbnRyeTsKKworCXdoaWxlICh1bmRvX3N0YWNrX3RhaWwpIHsKKwkJdW5kb19lbnRyeSA9IHVuZG9fc3RhY2tfdGFpbDsKKwkJdW5kb19zdGFja190YWlsID0gdW5kb19lbnRyeS0+cHJldjsKKwkJZnJlZSh1bmRvX2VudHJ5KTsKKwl9Cit9CisKKy8vIFVuZG8gZnVuY3Rpb25zIGFuZCBob29rcyBhZGRlZCBieSBKb2R5IEJydWNob24gKGpvZHlAam9keWJydWNob24uY29tKQorc3RhdGljIHZvaWQgdW5kb19wdXNoKGNoYXIgKnNyYywgdW5zaWduZWQgaW50IGxlbmd0aCwgdWludDhfdCB1X3R5cGUpCS8vIEFkZCB0byB0aGUgdW5kbyBzdGFjaworeworCXN0cnVjdCB1bmRvX29iamVjdCAqdW5kb19lbnRyeTsKKworCS8vICJ1X3R5cGUiIHZhbHVlcworCS8vIFVORE9fSU5TOiBpbnNlcnRpb24sIHVuZG8gd2lsbCByZW1vdmUgZnJvbSBidWZmZXIKKwkvLyBVTkRPX0RFTDogZGVsZXRlZCB0ZXh0LCB1bmRvIHdpbGwgcmVzdG9yZSB0byBidWZmZXIKKwkvLyBVTkRPX3tJTlMsREVMfV9DSEFJTjogU2FtZSBhcyBhYm92ZSBidXQgYWxzbyBjYWxscyB1bmRvX3BvcCgpIHdoZW4gY29tcGxldGUKKwkvLyBUaGUgQ0hBSU4gb3BlcmF0aW9ucyBhcmUgZm9yIGhhbmRsaW5nIG11bHRpcGxlIG9wZXJhdGlvbnMgdGhhdCB0aGUgdXNlcgorCS8vIHBlcmZvcm1zIHdpdGggYSBzaW5nbGUgYWN0aW9uLCBpLmUuIFJFUExBQ0UgbW9kZSBvciBmaW5kLWFuZC1yZXBsYWNlIGNvbW1hbmRzCisJLy8gVU5ET197SU5TLERFTH1fUVVFVUVEOiBJZiBxdWV1aW5nIGZlYXR1cmUgaXMgZW5hYmxlZCwgYWxsb3cgdXNlIG9mIHRoZSBxdWV1ZQorCS8vIGZvciB0aGUgSU5TL0RFTCBvcGVyYXRpb24uIFRoZSByYXcgdmFsdWVzIHNob3VsZCBiZSBlcXVhbCB0byB0aGUgdmFsdWVzIG9mCisJLy8gVU5ET197SU5TLERFTH0gT1JlZCB3aXRoIFVORE9fUVVFVUVEX0ZMQUcKKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1VORE9fUVVFVUUKKwkvLyBUaGlzIHVuZG8gcXVldWluZyBmdW5jdGlvbmFsaXR5IGdyb3VwcyBtdWx0aXBsZSBjaGFyYWN0ZXIgdHlwaW5nIG9yIGJhY2tzcGFjZXMKKwkvLyBpbnRvIGEgc2luZ2xlIGxhcmdlIHVuZG8gb2JqZWN0LiBUaGlzIGdyZWF0bHkgcmVkdWNlcyBjYWxscyB0byBtYWxsb2MoKSBmb3IKKwkvLyBzaW5nbGUtY2hhcmFjdGVyIG9wZXJhdGlvbnMgd2hpbGUgdHlwaW5nIGFuZCBoYXMgdGhlIHNpZGUgYmVuZWZpdCBvZiBsZXR0aW5nCisJLy8gYW4gdW5kbyBvcGVyYXRpb24gcmVtb3ZlIGNodW5rcyBvZiB0ZXh0IHJhdGhlciB0aGFuIGEgc2luZ2xlIGNoYXJhY3Rlci4KKwlzd2l0Y2ggKHVfdHlwZSkgeworCWNhc2UgVU5ET19FTVBUWToJLy8gSnVzdCBpbiBjYXNlIHRoaXMgZXZlciBoYXBwZW5zLi4uCisJCXJldHVybjsKKwljYXNlIFVORE9fREVMX1FVRVVFRDoKKwkJaWYgKGxlbmd0aCAhPSAxKQorCQkJcmV0dXJuOwkvLyBPbmx5IHF1ZXVlIHNpbmdsZSBjaGFyYWN0ZXJzCisJCXN3aXRjaCAodW5kb19xdWV1ZV9zdGF0ZSkgeworCQljYXNlIFVORE9fRU1QVFk6CisJCQl1bmRvX3F1ZXVlX3N0YXRlID0gVU5ET19ERUw7CisJCWNhc2UgVU5ET19ERUw6CisJCQl1bmRvX3F1ZXVlX3Nwb3MgPSBzcmM7CisJCQl1bmRvX3ErKzsKKwkJCXVuZG9fcXVldWVbQ09ORklHX0ZFQVRVUkVfVklfVU5ET19RVUVVRV9NQVggLSB1bmRvX3FdID0gKnNyYzsKKwkJCS8vIElmIHF1ZXVlIGlzIGZ1bGwsIGR1bXAgaXQgaW50byBhbiBvYmplY3QKKwkJCWlmICh1bmRvX3EgPT0gQ09ORklHX0ZFQVRVUkVfVklfVU5ET19RVUVVRV9NQVgpCisJCQkJdW5kb19xdWV1ZV9jb21taXQoKTsKKwkJCXJldHVybjsKKwkJY2FzZSBVTkRPX0lOUzoKKwkJCS8vIFN3aXRjaCBmcm9tIHN0b3JpbmcgaW5zZXJ0ZWQgdGV4dCB0byBkZWxldGVkIHRleHQKKwkJCXVuZG9fcXVldWVfY29tbWl0KCk7CisJCQl1bmRvX3B1c2goc3JjLCBsZW5ndGgsIFVORE9fREVMX1FVRVVFRCk7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJY2FzZSBVTkRPX0lOU19RVUVVRUQ6CisJCWlmIChsZW5ndGggIT0gMSkKKwkJCXJldHVybjsKKwkJc3dpdGNoICh1bmRvX3F1ZXVlX3N0YXRlKSB7CisJCWNhc2UgVU5ET19FTVBUWToKKwkJCXVuZG9fcXVldWVfc3RhdGUgPSBVTkRPX0lOUzsKKwkJCXVuZG9fcXVldWVfc3BvcyA9IHNyYzsKKwkJY2FzZSBVTkRPX0lOUzoKKwkJCXVuZG9fcSsrOwkvLyBEb24ndCBuZWVkIHRvIHNhdmUgYW55IGRhdGEgZm9yIGluc2VydGlvbnMKKwkJCWlmICh1bmRvX3EgPT0gQ09ORklHX0ZFQVRVUkVfVklfVU5ET19RVUVVRV9NQVgpCisJCQkJdW5kb19xdWV1ZV9jb21taXQoKTsKKwkJCXJldHVybjsKKwkJY2FzZSBVTkRPX0RFTDoKKwkJCS8vIFN3aXRjaCBmcm9tIHN0b3JpbmcgZGVsZXRlZCB0ZXh0IHRvIGluc2VydGVkIHRleHQKKwkJCXVuZG9fcXVldWVfY29tbWl0KCk7CisJCQl1bmRvX3B1c2goc3JjLCBsZW5ndGgsIFVORE9fSU5TX1FVRVVFRCk7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJfQorI2Vsc2UKKwkvLyBJZiB1bmRvIHF1ZXVpbmcgaXMgZGlzYWJsZWQsIGlnbm9yZSB0aGUgcXVldWluZyBmbGFnIGVudGlyZWx5CisJdV90eXBlID0gdV90eXBlICYgflVORE9fUVVFVUVEX0ZMQUc7CisjZW5kaWYKKworCS8vIEFsbG9jYXRlIGEgbmV3IHVuZG8gb2JqZWN0CisJaWYgKHVfdHlwZSA9PSBVTkRPX0RFTCB8fCB1X3R5cGUgPT0gVU5ET19ERUxfQ0hBSU4pIHsKKwkJLy8gRm9yIFVORE9fREVMIG9iamVjdHMsIHNhdmUgZGVsZXRlZCB0ZXh0CisJCWlmICgoc3JjICsgbGVuZ3RoKSA9PSBlbmQpCisJCQlsZW5ndGgtLTsKKwkJLy8gSWYgdGhpcyBkZWxldGlvbiBlbXB0aWVzIHRleHRbXSwgc3RyaXAgdGhlIG5ld2xpbmUuIFdoZW4gdGhlIGJ1ZmZlciBiZWNvbWVzCisJCS8vIHplcm8tbGVuZ3RoLCBhIG5ld2xpbmUgaXMgYWRkZWQgYmFjaywgd2hpY2ggcmVxdWlyZXMgdGhpcyB0byBjb21wZW5zYXRlLgorCQl1bmRvX2VudHJ5ID0geHphbGxvYyhvZmZzZXRvZihzdHJ1Y3QgdW5kb19vYmplY3QsIHVuZG9fdGV4dCkgKyBsZW5ndGgpOworCQltZW1jcHkodW5kb19lbnRyeS0+dW5kb190ZXh0LCBzcmMsIGxlbmd0aCk7CisJfSBlbHNlIHsKKwkJdW5kb19lbnRyeSA9IHh6YWxsb2Moc2l6ZW9mKCp1bmRvX2VudHJ5KSk7CisJfQorCXVuZG9fZW50cnktPmxlbmd0aCA9IGxlbmd0aDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9VTkRPX1FVRVVFCisJaWYgKCh1X3R5cGUgJiBVTkRPX1VTRV9TUE9TKSAhPSAwKSB7CisJCXVuZG9fZW50cnktPnN0YXJ0ID0gdW5kb19xdWV1ZV9zcG9zIC0gdGV4dDsJLy8gdXNlIHN0YXJ0IHBvc2l0aW9uIGZyb20gcXVldWUKKwl9IGVsc2UgeworCQl1bmRvX2VudHJ5LT5zdGFydCA9IHNyYyAtIHRleHQ7CS8vIHVzZSBvZmZzZXQgZnJvbSBzdGFydCBvZiB0ZXh0IGJ1ZmZlcgorCX0KKwl1X3R5cGUgPSAodV90eXBlICYgflVORE9fVVNFX1NQT1MpOworI2Vsc2UKKwl1bmRvX2VudHJ5LT5zdGFydCA9IHNyYyAtIHRleHQ7CisjZW5kaWYKKwl1bmRvX2VudHJ5LT51X3R5cGUgPSB1X3R5cGU7CisKKwkvLyBQdXNoIGl0IG9uIHVuZG8gc3RhY2sKKwl1bmRvX2VudHJ5LT5wcmV2ID0gdW5kb19zdGFja190YWlsOworCXVuZG9fc3RhY2tfdGFpbCA9IHVuZG9fZW50cnk7CisJbW9kaWZpZWRfY291bnQrKzsKK30KKworc3RhdGljIHZvaWQgdW5kb19wb3Aodm9pZCkJLy8gVW5kbyB0aGUgbGFzdCBvcGVyYXRpb24KK3sKKwlpbnQgcmVwZWF0OworCWNoYXIgKnVfc3RhcnQsICp1X2VuZDsKKwlzdHJ1Y3QgdW5kb19vYmplY3QgKnVuZG9fZW50cnk7CisKKwkvLyBDb21taXQgcGVuZGluZyB1bmRvIHF1ZXVlIGJlZm9yZSBwb3BwaW5nIChzaG91bGQgYmUgdW5uZWNlc3NhcnkpCisJdW5kb19xdWV1ZV9jb21taXQoKTsKKworCXVuZG9fZW50cnkgPSB1bmRvX3N0YWNrX3RhaWw7CisJLy8gQ2hlY2sgZm9yIGFuIGVtcHR5IHVuZG8gc3RhY2sKKwlpZiAoIXVuZG9fZW50cnkpIHsKKwkJc3RhdHVzX2xpbmUoIkFscmVhZHkgYXQgb2xkZXN0IGNoYW5nZSIpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoICh1bmRvX2VudHJ5LT51X3R5cGUpIHsKKwljYXNlIFVORE9fREVMOgorCWNhc2UgVU5ET19ERUxfQ0hBSU46CisJCS8vIG1ha2UgaG9sZSBhbmQgcHV0IGluIHRleHQgdGhhdCB3YXMgZGVsZXRlZDsgZGVhbGxvY2F0ZSB0ZXh0CisJCXVfc3RhcnQgPSB0ZXh0ICsgdW5kb19lbnRyeS0+c3RhcnQ7CisJCXRleHRfaG9sZV9tYWtlKHVfc3RhcnQsIHVuZG9fZW50cnktPmxlbmd0aCk7CisJCW1lbWNweSh1X3N0YXJ0LCB1bmRvX2VudHJ5LT51bmRvX3RleHQsIHVuZG9fZW50cnktPmxlbmd0aCk7CisJCXN0YXR1c19saW5lKCJVbmRvIFslZF0gJXMgJWQgY2hhcnMgYXQgcG9zaXRpb24gJWQiLAorCQkJbW9kaWZpZWRfY291bnQsICJyZXN0b3JlZCIsCisJCQl1bmRvX2VudHJ5LT5sZW5ndGgsIHVuZG9fZW50cnktPnN0YXJ0CisJCSk7CisJCWJyZWFrOworCWNhc2UgVU5ET19JTlM6CisJY2FzZSBVTkRPX0lOU19DSEFJTjoKKwkJLy8gZGVsZXRlIHdoYXQgd2FzIGluc2VydGVkCisJCXVfc3RhcnQgPSB1bmRvX2VudHJ5LT5zdGFydCArIHRleHQ7CisJCXVfZW5kID0gdV9zdGFydCAtIDEgKyB1bmRvX2VudHJ5LT5sZW5ndGg7CisJCXRleHRfaG9sZV9kZWxldGUodV9zdGFydCwgdV9lbmQsIE5PX1VORE8pOworCQlzdGF0dXNfbGluZSgiVW5kbyBbJWRdICVzICVkIGNoYXJzIGF0IHBvc2l0aW9uICVkIiwKKwkJCW1vZGlmaWVkX2NvdW50LCAiZGVsZXRlZCIsCisJCQl1bmRvX2VudHJ5LT5sZW5ndGgsIHVuZG9fZW50cnktPnN0YXJ0CisJCSk7CisJCWJyZWFrOworCX0KKwlyZXBlYXQgPSAwOworCXN3aXRjaCAodW5kb19lbnRyeS0+dV90eXBlKSB7CisJLy8gSWYgdGhpcyBpcyB0aGUgZW5kIG9mIGEgY2hhaW4sIGxvd2VyIG1vZGlmaWNhdGlvbiBjb3VudCBhbmQgcmVmcmVzaCBkaXNwbGF5CisJY2FzZSBVTkRPX0RFTDoKKwljYXNlIFVORE9fSU5TOgorCQlkb3QgPSAodGV4dCArIHVuZG9fZW50cnktPnN0YXJ0KTsKKwkJcmVmcmVzaChGQUxTRSk7CisJCWJyZWFrOworCWNhc2UgVU5ET19ERUxfQ0hBSU46CisJY2FzZSBVTkRPX0lOU19DSEFJTjoKKwkJcmVwZWF0ID0gMTsKKwkJYnJlYWs7CisJfQorCS8vIERlYWxsb2NhdGUgdGhlIHVuZG8gb2JqZWN0IHdlIGp1c3QgcHJvY2Vzc2VkCisJdW5kb19zdGFja190YWlsID0gdW5kb19lbnRyeS0+cHJldjsKKwlmcmVlKHVuZG9fZW50cnkpOworCW1vZGlmaWVkX2NvdW50LS07CisJLy8gRm9yIGNoYWluZWQgb3BlcmF0aW9ucywgY29udGludWUgcG9wcGluZyBhbGwgdGhlIHdheSBkb3duIHRoZSBjaGFpbi4KKwlpZiAocmVwZWF0KSB7CisJCXVuZG9fcG9wKCk7CS8vIEZvbGxvdyB0aGUgdW5kbyBjaGFpbiBpZiBvbmUgZXhpc3RzCisJfQorfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfVU5ET19RVUVVRQorc3RhdGljIHZvaWQgdW5kb19xdWV1ZV9jb21taXQodm9pZCkJLy8gRmx1c2ggYW55IHF1ZXVlZCBvYmplY3RzIHRvIHRoZSB1bmRvIHN0YWNrCit7CisJLy8gUHVzaGVzIHRoZSBxdWV1ZSBvYmplY3Qgb250byB0aGUgdW5kbyBzdGFjaworCWlmICh1bmRvX3EgPiAwKSB7CisJCS8vIERlbGV0ZWQgY2hhcmFjdGVyIHVuZG8gZXZlbnRzIGdyb3cgZnJvbSB0aGUgZW5kCisJCXVuZG9fcHVzaCh1bmRvX3F1ZXVlICsgQ09ORklHX0ZFQVRVUkVfVklfVU5ET19RVUVVRV9NQVggLSB1bmRvX3EsCisJCQl1bmRvX3EsCisJCQkodW5kb19xdWV1ZV9zdGF0ZSB8IFVORE9fVVNFX1NQT1MpCisJCSk7CisJCXVuZG9fcXVldWVfc3RhdGUgPSBVTkRPX0VNUFRZOworCQl1bmRvX3EgPSAwOworCX0KK30KKyNlbmRpZgorCisjZW5kaWYgLyogRU5BQkxFX0ZFQVRVUkVfVklfVU5ETyAqLworCisvLyBvcGVuIGEgaG9sZSBpbiB0ZXh0W10KKy8vIG1pZ2h0IHJlYWxsb2NhdGUgdGV4dFtdISB1c2UgcCArPSB0ZXh0X2hvbGVfbWFrZShwLCAuLi4pLAorLy8gYW5kIGJlIGNhcmVmdWwgdG8gbm90IHVzZSBwb2ludGVycyBpbnRvIHBvdGVudGlhbGx5IGZyZWVkIHRleHRbXSEKK3N0YXRpYyB1aW50cHRyX3QgdGV4dF9ob2xlX21ha2UoY2hhciAqcCwgaW50IHNpemUpCS8vIGF0ICJwIiwgbWFrZSBhICdzaXplJyBieXRlIGhvbGUKK3sKKwl1aW50cHRyX3QgYmlhcyA9IDA7CisKKwlpZiAoc2l6ZSA8PSAwKQorCQlyZXR1cm4gYmlhczsKKwllbmQgKz0gc2l6ZTsJCS8vIGFkanVzdCB0aGUgbmV3IEVORAorCWlmIChlbmQgPj0gKHRleHQgKyB0ZXh0X3NpemUpKSB7CisJCWNoYXIgKm5ld190ZXh0OworCQl0ZXh0X3NpemUgKz0gZW5kIC0gKHRleHQgKyB0ZXh0X3NpemUpICsgMTAyNDA7CisJCW5ld190ZXh0ID0geHJlYWxsb2ModGV4dCwgdGV4dF9zaXplKTsKKwkJYmlhcyA9IChuZXdfdGV4dCAtIHRleHQpOworCQlzY3JlZW5iZWdpbiArPSBiaWFzOworCQlkb3QgICAgICAgICArPSBiaWFzOworCQllbmQgICAgICAgICArPSBiaWFzOworCQlwICAgICAgICAgICArPSBiaWFzOworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCisJCXsKKwkJCWludCBpOworCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWFyayk7IGkrKykKKwkJCQlpZiAobWFya1tpXSkKKwkJCQkJbWFya1tpXSArPSBiaWFzOworCQl9CisjZW5kaWYKKwkJdGV4dCA9IG5ld190ZXh0OworCX0KKwltZW1tb3ZlKHAgKyBzaXplLCBwLCBlbmQgLSBzaXplIC0gcCk7CisJbWVtc2V0KHAsICcgJywgc2l6ZSk7CS8vIGNsZWFyIG5ldyBob2xlCisJcmV0dXJuIGJpYXM7Cit9CisKKy8vICBjbG9zZSBhIGhvbGUgaW4gdGV4dFtdCisvLyAgInVuZG8iIHZhbHVlIGluZGljYXRlcyBpZiB0aGlzIG9wZXJhdGlvbiBzaG91bGQgYmUgdW5kby1hYmxlCitzdGF0aWMgY2hhciAqdGV4dF9ob2xlX2RlbGV0ZShjaGFyICpwLCBjaGFyICpxLCBpbnQgdW5kbykgLy8gZGVsZXRlICJwIiB0aHJvdWdoICJxIiwgaW5jbHVzaXZlCit7CisJY2hhciAqc3JjLCAqZGVzdDsKKwlpbnQgY250LCBob2xlX3NpemU7CisKKwkvLyBtb3ZlIGZvcndhcmRzLCBmcm9tIGJlZ2lubmluZworCS8vIGFzc3VtZSBwIDw9IHEKKwlzcmMgPSBxICsgMTsKKwlkZXN0ID0gcDsKKwlpZiAocSA8IHApIHsJCS8vIHRoZXkgYXJlIGJhY2t3YXJkLSBzd2FwIHRoZW0KKwkJc3JjID0gcCArIDE7CisJCWRlc3QgPSBxOworCX0KKwlob2xlX3NpemUgPSBxIC0gcCArIDE7CisJY250ID0gZW5kIC0gc3JjOworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1VORE8KKwlzd2l0Y2ggKHVuZG8pIHsKKwkJY2FzZSBOT19VTkRPOgorCQkJYnJlYWs7CisJCWNhc2UgQUxMT1dfVU5ETzoKKwkJCXVuZG9fcHVzaChwLCBob2xlX3NpemUsIFVORE9fREVMKTsKKwkJCWJyZWFrOworCQljYXNlIEFMTE9XX1VORE9fQ0hBSU46CisJCQl1bmRvX3B1c2gocCwgaG9sZV9zaXplLCBVTkRPX0RFTF9DSEFJTik7CisJCQlicmVhazsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVklfVU5ET19RVUVVRQorCQljYXNlIEFMTE9XX1VORE9fUVVFVUVEOgorCQkJdW5kb19wdXNoKHAsIGhvbGVfc2l6ZSwgVU5ET19ERUxfUVVFVUVEKTsKKwkJCWJyZWFrOworIyBlbmRpZgorCX0KKwltb2RpZmllZF9jb3VudC0tOworI2VuZGlmCisJaWYgKHNyYyA8IHRleHQgfHwgc3JjID4gZW5kKQorCQlnb3RvIHRoZDA7CisJaWYgKGRlc3QgPCB0ZXh0IHx8IGRlc3QgPj0gZW5kKQorCQlnb3RvIHRoZDA7CisJbW9kaWZpZWRfY291bnQrKzsKKwlpZiAoc3JjID49IGVuZCkKKwkJZ290byB0aGRfYXRlbmQ7CS8vIGp1c3QgZGVsZXRlIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgorCW1lbW1vdmUoZGVzdCwgc3JjLCBjbnQpOworIHRoZF9hdGVuZDoKKwllbmQgPSBlbmQgLSBob2xlX3NpemU7CS8vIGFkanVzdCB0aGUgbmV3IEVORAorCWlmIChkZXN0ID49IGVuZCkKKwkJZGVzdCA9IGVuZCAtIDE7CS8vIG1ha2Ugc3VyZSBkZXN0IGluIGJlbG93IGVuZC0xCisJaWYgKGVuZCA8PSB0ZXh0KQorCQlkZXN0ID0gZW5kID0gdGV4dDsJLy8ga2VlcCBwb2ludGVycyB2YWxpZAorIHRoZDA6CisJcmV0dXJuIGRlc3Q7Cit9CisKKy8vIGNvcHkgdGV4dCBpbnRvIHJlZ2lzdGVyLCB0aGVuIGRlbGV0ZSB0ZXh0LgorLy8gaWYgZGlzdCA8PSAwLCBkbyBub3QgaW5jbHVkZSwgb3IgZ28gcGFzdCwgYSBOZXdMaW5lCisvLworc3RhdGljIGNoYXIgKnlhbmtfZGVsZXRlKGNoYXIgKnN0YXJ0LCBjaGFyICpzdG9wLCBpbnQgZGlzdCwgaW50IHlmLCBpbnQgdW5kbykKK3sKKwljaGFyICpwOworCisJLy8gbWFrZSBzdXJlIHN0YXJ0IDw9IHN0b3AKKwlpZiAoc3RhcnQgPiBzdG9wKSB7CisJCS8vIHRoZXkgYXJlIGJhY2t3YXJkcywgcmV2ZXJzZSB0aGVtCisJCXAgPSBzdGFydDsKKwkJc3RhcnQgPSBzdG9wOworCQlzdG9wID0gcDsKKwl9CisJaWYgKGRpc3QgPD0gMCkgeworCQkvLyB3ZSBjYW5ub3QgY3Jvc3MgTkwgYm91bmRhcmllcworCQlwID0gc3RhcnQ7CisJCWlmICgqcCA9PSAnXG4nKQorCQkJcmV0dXJuIHA7CisJCS8vIGRvbnQgZ28gcGFzdCBhIE5ld0xpbmUKKwkJZm9yICg7IHAgKyAxIDw9IHN0b3A7IHArKykgeworCQkJaWYgKHBbMV0gPT0gJ1xuJykgeworCQkJCXN0b3AgPSBwOwkvLyAic3RvcCIganVzdCBiZWZvcmUgTmV3TGluZQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXAgPSBzdGFydDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSworCXRleHRfeWFuayhzdGFydCwgc3RvcCwgWURyZWcpOworI2VuZGlmCisJaWYgKHlmID09IFlBTktERUwpIHsKKwkJcCA9IHRleHRfaG9sZV9kZWxldGUoc3RhcnQsIHN0b3AsIHVuZG8pOworCX0JCQkJCS8vIGRlbGV0ZSBsaW5lcworCXJldHVybiBwOworfQorCitzdGF0aWMgdm9pZCBzaG93X2hlbHAodm9pZCkKK3sKKwlwdXRzKCJUaGVzZSBmZWF0dXJlcyBhcmUgYXZhaWxhYmxlOiIKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRUFSQ0gKKwkiXG5cdFBhdHRlcm4gc2VhcmNoZXMgd2l0aCAvIGFuZCA/IgorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfRE9UX0NNRAorCSJcblx0TGFzdCBjb21tYW5kIHJlcGVhdCB3aXRoIC4iCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSworCSJcblx0TGluZSBtYXJraW5nIHdpdGggJ3giCisJIlxuXHROYW1lZCBidWZmZXJzIHdpdGggXCJ4IgorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfUkVBRE9OTFkKKwkvL25vdCBpbXBsZW1lbnRlZDogIlxuXHRSZWFkb25seSBpZiB2aSBpcyBjYWxsZWQgYXMgXCJ2aWV3XCIiCisJLy9yZWR1bmRhbnQ6IHVzYWdlIHRleHQgc2F5cyB0aGlzIHRvbzogIlxuXHRSZWFkb25seSB3aXRoIC1SIGNvbW1hbmQgbGluZSBhcmciCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRVQKKwkiXG5cdFNvbWUgY29sb24gbW9kZSBjb21tYW5kcyB3aXRoIDoiCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9TRVRPUFRTCisJIlxuXHRTZXR0YWJsZSBvcHRpb25zIHdpdGggXCI6c2V0XCIiCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9VU0VfU0lHTkFMUworCSJcblx0U2lnbmFsIGNhdGNoaW5nLSBeQyIKKwkiXG5cdEpvYiBzdXNwZW5kIGFuZCByZXN1bWUgd2l0aCBeWiIKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1dJTl9SRVNJWkUKKwkiXG5cdEFkYXB0IHRvIHdpbmRvdyByZS1zaXplcyIKKyNlbmRpZgorCSk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ET1RfQ01ECitzdGF0aWMgdm9pZCBzdGFydF9uZXdfY21kX3EoY2hhciBjKQoreworCS8vIGdldCBidWZmZXIgZm9yIG5ldyBjbWQKKwkvLyBpZiB0aGVyZSBpcyBhIGN1cnJlbnQgY21kIGNvdW50IHB1dCBpdCBpbiB0aGUgYnVmZmVyIGZpcnN0CisJaWYgKGNtZGNudCA+IDApIHsKKwkJbG1jX2xlbiA9IHNwcmludGYobGFzdF9tb2RpZnlpbmdfY21kLCAiJWQlYyIsIGNtZGNudCwgYyk7CisJfSBlbHNlIHsgLy8ganVzdCBzYXZlIGNoYXIgYyBvbnRvIHF1ZXVlCisJCWxhc3RfbW9kaWZ5aW5nX2NtZFswXSA9IGM7CisJCWxtY19sZW4gPSAxOworCX0KKwlhZGRpbmcycSA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGVuZF9jbWRfcSh2b2lkKQoreworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCisJWURyZWcgPSAyNjsJCQkvLyBnbyBiYWNrIHRvIGRlZmF1bHQgWWFuay9EZWxldGUgcmVnCisjZW5kaWYKKwlhZGRpbmcycSA9IDA7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9WSV9ET1RfQ01EICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSyBcCisgfHwgKEVOQUJMRV9GRUFUVVJFX1ZJX0NPTE9OICYmIEVOQUJMRV9GRUFUVVJFX1ZJX1NFQVJDSCkgXAorIHx8IEVOQUJMRV9GRUFUVVJFX1ZJX0NSQVNITUUKKy8vIG1pZ2h0IHJlYWxsb2NhdGUgdGV4dFtdISB1c2UgcCArPSBzdHJpbmdfaW5zZXJ0KHAsIC4uLiksCisvLyBhbmQgYmUgY2FyZWZ1bCB0byBub3QgdXNlIHBvaW50ZXJzIGludG8gcG90ZW50aWFsbHkgZnJlZWQgdGV4dFtdIQorc3RhdGljIHVpbnRwdHJfdCBzdHJpbmdfaW5zZXJ0KGNoYXIgKnAsIGNvbnN0IGNoYXIgKnMsIGludCB1bmRvKSAvLyBpbnNlcnQgdGhlIHN0cmluZyBhdCAncCcKK3sKKwl1aW50cHRyX3QgYmlhczsKKwlpbnQgaTsKKworCWkgPSBzdHJsZW4ocyk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfVU5ETworCXN3aXRjaCAodW5kbykgeworCQljYXNlIEFMTE9XX1VORE86CisJCQl1bmRvX3B1c2gocCwgaSwgVU5ET19JTlMpOworCQkJYnJlYWs7CisJCWNhc2UgQUxMT1dfVU5ET19DSEFJTjoKKwkJCXVuZG9fcHVzaChwLCBpLCBVTkRPX0lOU19DSEFJTik7CisJCQlicmVhazsKKwl9CisjZW5kaWYKKwliaWFzID0gdGV4dF9ob2xlX21ha2UocCwgaSk7CisJcCArPSBiaWFzOworCW1lbWNweShwLCBzLCBpKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSworCXsKKwkJaW50IGNudDsKKwkJZm9yIChjbnQgPSAwOyAqcyAhPSAnXDAnOyBzKyspIHsKKwkJCWlmICgqcyA9PSAnXG4nKQorCQkJCWNudCsrOworCQl9CisJCXN0YXR1c19saW5lKCJQdXQgJWQgbGluZXMgKCVkIGNoYXJzKSBmcm9tIFslY10iLCBjbnQsIGksIHdoYXRfcmVnKCkpOworCX0KKyNlbmRpZgorCXJldHVybiBiaWFzOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSworc3RhdGljIGNoYXIgKnRleHRfeWFuayhjaGFyICpwLCBjaGFyICpxLCBpbnQgZGVzdCkJLy8gY29weSB0ZXh0IGludG8gYSByZWdpc3RlcgoreworCWludCBjbnQgPSBxIC0gcDsKKwlpZiAoY250IDwgMCkgewkJLy8gdGhleSBhcmUgYmFja3dhcmRzLSByZXZlcnNlIHRoZW0KKwkJcCA9IHE7CisJCWNudCA9IC1jbnQ7CisJfQorCWZyZWUocmVnW2Rlc3RdKTsJLy8gIGlmIGFscmVhZHkgYSB5YW5rIHJlZ2lzdGVyLCBmcmVlIGl0CisJcmVnW2Rlc3RdID0geHN0cm5kdXAocCwgY250ICsgMSk7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyBjaGFyIHdoYXRfcmVnKHZvaWQpCit7CisJY2hhciBjOworCisJYyA9ICdEJzsJCQkvLyBkZWZhdWx0IHRvIEQtcmVnCisJaWYgKDAgPD0gWURyZWcgJiYgWURyZWcgPD0gMjUpCisJCWMgPSAnYScgKyAoY2hhcikgWURyZWc7CisJaWYgKFlEcmVnID09IDI2KQorCQljID0gJ0QnOworCWlmIChZRHJlZyA9PSAyNykKKwkJYyA9ICdVJzsKKwlyZXR1cm4gYzsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfY29udGV4dChjaGFyIGNtZCkKK3sKKwkvLyBBIGNvbnRleHQgaXMgZGVmaW5lZCB0byBiZSAibW9kaWZ5aW5nIHRleHQiCisJLy8gQW55IG1vZGlmeWluZyBjb21tYW5kIGVzdGFibGlzaGVzIGEgbmV3IGNvbnRleHQuCisKKwlpZiAoZG90IDwgY29udGV4dF9zdGFydCB8fCBkb3QgPiBjb250ZXh0X2VuZCkgeworCQlpZiAoc3RyY2hyKG1vZGlmeWluZ19jbWRzLCBjbWQpICE9IE5VTEwpIHsKKwkJCS8vIHdlIGFyZSB0cnlpbmcgdG8gbW9kaWZ5IHRleHRbXS0gbWFrZSB0aGlzIHRoZSBjdXJyZW50IGNvbnRleHQKKwkJCW1hcmtbMjddID0gbWFya1syNl07CS8vIG1vdmUgY3VyIHRvIHByZXYKKwkJCW1hcmtbMjZdID0gZG90OwkvLyBtb3ZlIGxvY2FsIHRvIGN1cgorCQkJY29udGV4dF9zdGFydCA9IHByZXZfbGluZShwcmV2X2xpbmUoZG90KSk7CisJCQljb250ZXh0X2VuZCA9IG5leHRfbGluZShuZXh0X2xpbmUoZG90KSk7CisJCQkvL2xvaXRlcj0gc3RhcnRfbG9pdGVyPSBub3c7CisJCX0KKwl9Cit9CisKK3N0YXRpYyBjaGFyICpzd2FwX2NvbnRleHQoY2hhciAqcCkgLy8gZ290byBuZXcgY29udGV4dCBmb3IgJycgY29tbWFuZCBtYWtlIHRoaXMgdGhlIGN1cnJlbnQgY29udGV4dAoreworCWNoYXIgKnRtcDsKKworCS8vIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgaW4gbWFya1syNl0KKwkvLyB0aGUgcHJldmlvdXMgY29udGV4dCBpcyBpbiBtYXJrWzI3XQorCS8vIG9ubHkgc3dhcCBjb250ZXh0IGlmIG90aGVyIGNvbnRleHQgaXMgdmFsaWQKKwlpZiAodGV4dCA8PSBtYXJrWzI3XSAmJiBtYXJrWzI3XSA8PSBlbmQgLSAxKSB7CisJCXRtcCA9IG1hcmtbMjddOworCQltYXJrWzI3XSA9IG1hcmtbMjZdOworCQltYXJrWzI2XSA9IHRtcDsKKwkJcCA9IG1hcmtbMjZdOwkvLyB3aGVyZSB3ZSBhcmUgZ29pbmctIHByZXZpb3VzIGNvbnRleHQKKwkJY29udGV4dF9zdGFydCA9IHByZXZfbGluZShwcmV2X2xpbmUocHJldl9saW5lKHApKSk7CisJCWNvbnRleHRfZW5kID0gbmV4dF9saW5lKG5leHRfbGluZShuZXh0X2xpbmUocCkpKTsKKwl9CisJcmV0dXJuIHA7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9WSV9ZQU5LTUFSSyAqLworCisvLy0tLS0tIFNldCB0ZXJtaW5hbCBhdHRyaWJ1dGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCByYXdtb2RlKHZvaWQpCit7CisJdGNnZXRhdHRyKDAsICZ0ZXJtX29yaWcpOworCXRlcm1fdmkgPSB0ZXJtX29yaWc7CisJdGVybV92aS5jX2xmbGFnICY9ICh+SUNBTk9OICYgfkVDSE8pOwkvLyBsZWF2ZSBJU0lHIG9uIC0gYWxsb3cgaW50cidzCisJdGVybV92aS5jX2lmbGFnICY9ICh+SVhPTiAmIH5JQ1JOTCk7CisJdGVybV92aS5jX29mbGFnICY9ICh+T05MQ1IpOworCXRlcm1fdmkuY19jY1tWTUlOXSA9IDE7CisJdGVybV92aS5jX2NjW1ZUSU1FXSA9IDA7CisJZXJhc2VfY2hhciA9IHRlcm1fdmkuY19jY1tWRVJBU0VdOworCXRjc2V0YXR0cl9zdGRpbl9UQ1NBTk9XKCZ0ZXJtX3ZpKTsKK30KKworc3RhdGljIHZvaWQgY29va21vZGUodm9pZCkKK3sKKwlmZmx1c2hfYWxsKCk7CisJdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coJnRlcm1fb3JpZyk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9VU0VfU0lHTkFMUworLy8tLS0tLSBDb21lIGhlcmUgd2hlbiB3ZSBnZXQgYSB3aW5kb3cgcmVzaXplIHNpZ25hbCAtLS0tLS0tLS0KK3N0YXRpYyB2b2lkIHdpbmNoX3NpZyhpbnQgc2lnIFVOVVNFRF9QQVJBTSkKK3sKKwlpbnQgc2F2ZV9lcnJubyA9IGVycm5vOworCS8vIEZJWE1FOiBkbyBpdCBpbiBtYWluIGxvb3AhISEKKwlzaWduYWwoU0lHV0lOQ0gsIHdpbmNoX3NpZyk7CisJcXVlcnlfc2NyZWVuX2RpbWVuc2lvbnMoKTsKKwluZXdfc2NyZWVuKHJvd3MsIGNvbHVtbnMpOwkvLyBnZXQgbWVtb3J5IGZvciB2aXJ0dWFsIHNjcmVlbgorCXJlZHJhdyhUUlVFKTsJCS8vIHJlLWRyYXcgdGhlIHNjcmVlbgorCWVycm5vID0gc2F2ZV9lcnJubzsKK30KKworLy8tLS0tLSBDb21lIGhlcmUgd2hlbiB3ZSBnZXQgYSBjb250aW51ZSBzaWduYWwgLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgY29udF9zaWcoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJaW50IHNhdmVfZXJybm8gPSBlcnJubzsKKwlyYXdtb2RlKCk7IC8vIHRlcm1pbmFsIHRvICJyYXciCisJbGFzdF9zdGF0dXNfY2tzdW0gPSAwOyAvLyBmb3JjZSBzdGF0dXMgdXBkYXRlCisJcmVkcmF3KFRSVUUpOyAvLyByZS1kcmF3IHRoZSBzY3JlZW4KKworCXNpZ25hbChTSUdUU1RQLCBzdXNwZW5kX3NpZyk7CisJc2lnbmFsKFNJR0NPTlQsIFNJR19ERkwpOworCS8va2lsbChteV9waWQsIFNJR0NPTlQpOyAvLyBodWg/IHdoeT8gd2UgYXJlIGFscmVhZHkgImNvbnRpbnVlZCIuLi4KKwllcnJubyA9IHNhdmVfZXJybm87Cit9CisKKy8vLS0tLS0gQ29tZSBoZXJlIHdoZW4gd2UgZ2V0IGEgU3VzcGVuZCBzaWduYWwgLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgc3VzcGVuZF9zaWcoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJaW50IHNhdmVfZXJybm8gPSBlcnJubzsKKwlnb19ib3R0b21fYW5kX2NsZWFyX3RvX2VvbCgpOworCWNvb2ttb2RlKCk7IC8vIHRlcm1pbmFsIHRvICJjb29rZWQiCisKKwlzaWduYWwoU0lHQ09OVCwgY29udF9zaWcpOworCXNpZ25hbChTSUdUU1RQLCBTSUdfREZMKTsKKwlraWxsKG15X3BpZCwgU0lHVFNUUCk7CisJZXJybm8gPSBzYXZlX2Vycm5vOworfQorCisvLy0tLS0tIENvbWUgaGVyZSB3aGVuIHdlIGdldCBhIHNpZ25hbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB2b2lkIGNhdGNoX3NpZyhpbnQgc2lnKQoreworCXNpZ25hbChTSUdJTlQsIGNhdGNoX3NpZyk7CisJc2lnbG9uZ2ptcChyZXN0YXJ0LCBzaWcpOworfQorI2VuZGlmIC8qIEZFQVRVUkVfVklfVVNFX1NJR05BTFMgKi8KKworc3RhdGljIGludCBteXNsZWVwKGludCBodW5kKQkvLyBzbGVlcCBmb3IgJ2h1bmQnIDEvMTAwIHNlY29uZHMgb3Igc3RkaW4gcmVhZHkKK3sKKwlzdHJ1Y3QgcG9sbGZkIHBmZFsxXTsKKworCWlmIChodW5kICE9IDApCisJCWZmbHVzaF9hbGwoKTsKKworCXBmZFswXS5mZCA9IFNURElOX0ZJTEVOTzsKKwlwZmRbMF0uZXZlbnRzID0gUE9MTElOOworCXJldHVybiBzYWZlX3BvbGwocGZkLCAxLCBodW5kKjEwKSA+IDA7Cit9CisKKy8vLS0tLS0gSU8gUm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyBpbnQgcmVhZGl0KHZvaWQpIC8vIHJlYWQgKG1heWJlIGN1cnNvcikga2V5IGZyb20gc3RkaW4KK3sKKwlpbnQgYzsKKworCWZmbHVzaF9hbGwoKTsKKwljID0gcmVhZF9rZXkoU1RESU5fRklMRU5PLCByZWFkYnVmZmVyLCAvKnRpbWVvdXQgb2ZmOiovIC0yKTsKKwlpZiAoYyA9PSAtMSkgeyAvLyBFT0YvZXJyb3IKKwkJZ29fYm90dG9tX2FuZF9jbGVhcl90b19lb2woKTsKKwkJY29va21vZGUoKTsgLy8gdGVybWluYWwgdG8gImNvb2tlZCIKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJlYWQgdXNlciBpbnB1dCIpOworCX0KKwlyZXR1cm4gYzsKK30KKworLy8tLS0tLSBJTyBSb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIGludCBnZXRfb25lX2NoYXIodm9pZCkKK3sKKwlpbnQgYzsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0RPVF9DTUQKKwlpZiAoIWFkZGluZzJxKSB7CisJCS8vIHdlIGFyZSBub3QgYWRkaW5nIHRvIHRoZSBxLgorCQkvLyBidXQsIHdlIG1heSBiZSByZWFkaW5nIGZyb20gYSBxCisJCWlmIChpb3EgPT0gMCkgeworCQkJLy8gdGhlcmUgaXMgbm8gY3VycmVudCBxLCByZWFkIGZyb20gU1RESU4KKwkJCWMgPSByZWFkaXQoKTsJLy8gZ2V0IHRoZSB1c2VycyBpbnB1dAorCQl9IGVsc2UgeworCQkJLy8gdGhlcmUgaXMgYSBxdWV1ZSB0byBnZXQgY2hhcnMgZnJvbSBmaXJzdAorCQkJLy8gY2FyZWZ1bCB3aXRoIGNvcnJlY3Qgc2lnbiBleHBhbnNpb24hCisJCQljID0gKHVuc2lnbmVkIGNoYXIpKmlvcSsrOworCQkJaWYgKGMgPT0gJ1wwJykgeworCQkJCS8vIHRoZSBlbmQgb2YgdGhlIHEsIHJlYWQgZnJvbSBTVERJTgorCQkJCWZyZWUoaW9xX3N0YXJ0KTsKKwkJCQlpb3Ffc3RhcnQgPSBpb3EgPSAwOworCQkJCWMgPSByZWFkaXQoKTsJLy8gZ2V0IHRoZSB1c2VycyBpbnB1dAorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJLy8gYWRkaW5nIFNURElOIGNoYXJzIHRvIHEKKwkJYyA9IHJlYWRpdCgpOwkvLyBnZXQgdGhlIHVzZXJzIGlucHV0CisJCWlmIChsbWNfbGVuID49IE1BWF9JTlBVVF9MRU4gLSAxKSB7CisJCQlzdGF0dXNfbGluZV9ib2xkKCJsYXN0X21vZGlmeWluZ19jbWQgb3ZlcnJ1biIpOworCQl9IGVsc2UgeworCQkJLy8gYWRkIG5ldyBjaGFyIHRvIHEKKwkJCWxhc3RfbW9kaWZ5aW5nX2NtZFtsbWNfbGVuKytdID0gYzsKKwkJfQorCX0KKyNlbHNlCisJYyA9IHJlYWRpdCgpOwkJLy8gZ2V0IHRoZSB1c2VycyBpbnB1dAorI2VuZGlmIC8qIEZFQVRVUkVfVklfRE9UX0NNRCAqLworCXJldHVybiBjOworfQorCisvLyBHZXQgaW5wdXQgbGluZSAodXNlcyAic3RhdHVzIGxpbmUiIGFyZWEpCitzdGF0aWMgY2hhciAqZ2V0X2lucHV0X2xpbmUoY29uc3QgY2hhciAqcHJvbXB0KQoreworCS8vIGNoYXIgW01BWF9JTlBVVF9MRU5dCisjZGVmaW5lIGJ1ZiBnZXRfaW5wdXRfbGluZV9fYnVmCisKKwlpbnQgYzsKKwlpbnQgaTsKKworCXN0cmNweShidWYsIHByb21wdCk7CisJbGFzdF9zdGF0dXNfY2tzdW0gPSAwOwkvLyBmb3JjZSBzdGF0dXMgdXBkYXRlCisJZ29fYm90dG9tX2FuZF9jbGVhcl90b19lb2woKTsKKwl3cml0ZTEocHJvbXB0KTsgICAgICAvLyB3cml0ZSBvdXQgdGhlIDosIC8sIG9yID8gcHJvbXB0CisKKwlpID0gc3RybGVuKGJ1Zik7CisJd2hpbGUgKGkgPCBNQVhfSU5QVVRfTEVOKSB7CisJCWMgPSBnZXRfb25lX2NoYXIoKTsKKwkJaWYgKGMgPT0gJ1xuJyB8fCBjID09ICdccicgfHwgYyA9PSAyNykKKwkJCWJyZWFrOwkJLy8gdGhpcyBpcyBlbmQgb2YgaW5wdXQKKwkJaWYgKGMgPT0gZXJhc2VfY2hhciB8fCBjID09IDggfHwgYyA9PSAxMjcpIHsKKwkJCS8vIHVzZXIgd2FudHMgdG8gZXJhc2UgcHJldiBjaGFyCisJCQlidWZbLS1pXSA9ICdcMCc7CisJCQl3cml0ZTEoIlxiIFxiIik7IC8vIGVyYXNlIGNoYXIgb24gc2NyZWVuCisJCQlpZiAoaSA8PSAwKSAvLyB1c2VyIGJhY2tzIHVwIGJlZm9yZSBiLW8tbCwgZXhpdAorCQkJCWJyZWFrOworCQl9IGVsc2UgaWYgKGMgPiAwICYmIGMgPCAyNTYpIHsgLy8gZXhjbHVkZSBVbmljb2RlCisJCQkvLyAoVE9ETzogbmVlZCB0byBoYW5kbGUgVW5pY29kZSkKKwkJCWJ1ZltpXSA9IGM7CisJCQlidWZbKytpXSA9ICdcMCc7CisJCQliYl9wdXRjaGFyKGMpOworCQl9CisJfQorCXJlZnJlc2goRkFMU0UpOworCXJldHVybiBidWY7CisjdW5kZWYgYnVmCit9CisKKy8vIG1pZ2h0IHJlYWxsb2NhdGUgdGV4dFtdIQorc3RhdGljIGludCBmaWxlX2luc2VydChjb25zdCBjaGFyICpmbiwgY2hhciAqcCwgaW50IGluaXRpYWwpCit7CisJaW50IGNudCA9IC0xOworCWludCBmZCwgc2l6ZTsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCisJaWYgKHAgPCB0ZXh0KQorCQlwID0gdGV4dDsKKwlpZiAocCA+IGVuZCkKKwkJcCA9IGVuZDsKKworCWZkID0gb3BlbihmbiwgT19SRE9OTFkpOworCWlmIChmZCA8IDApIHsKKwkJaWYgKCFpbml0aWFsKQorCQkJc3RhdHVzX2xpbmVfYm9sZF9lcnJubyhmbik7CisJCXJldHVybiBjbnQ7CisJfQorCisJLyogVmFsaWRhdGUgZmlsZSAqLworCWlmIChmc3RhdChmZCwgJnN0YXRidWYpIDwgMCkgeworCQlzdGF0dXNfbGluZV9ib2xkX2Vycm5vKGZuKTsKKwkJZ290byBmaTsKKwl9CisJaWYgKCFTX0lTUkVHKHN0YXRidWYuc3RfbW9kZSkpIHsKKwkJc3RhdHVzX2xpbmVfYm9sZCgiJyVzJyBpcyBub3QgYSByZWd1bGFyIGZpbGUiLCBmbik7CisJCWdvdG8gZmk7CisJfQorCXNpemUgPSAoc3RhdGJ1Zi5zdF9zaXplIDwgSU5UX01BWCA/IChpbnQpc3RhdGJ1Zi5zdF9zaXplIDogSU5UX01BWCk7CisJcCArPSB0ZXh0X2hvbGVfbWFrZShwLCBzaXplKTsKKwljbnQgPSBmdWxsX3JlYWQoZmQsIHAsIHNpemUpOworCWlmIChjbnQgPCAwKSB7CisJCXN0YXR1c19saW5lX2JvbGRfZXJybm8oZm4pOworCQlwID0gdGV4dF9ob2xlX2RlbGV0ZShwLCBwICsgc2l6ZSAtIDEsIE5PX1VORE8pOwkvLyB1bi1kbyBidWZmZXIgaW5zZXJ0CisJfSBlbHNlIGlmIChjbnQgPCBzaXplKSB7CisJCS8vIFRoZXJlIHdhcyBhIHBhcnRpYWwgcmVhZCwgc2hyaW5rIHVudXNlZCBzcGFjZQorCQlwID0gdGV4dF9ob2xlX2RlbGV0ZShwICsgY250LCBwICsgc2l6ZSAtIDEsIE5PX1VORE8pOworCQlzdGF0dXNfbGluZV9ib2xkKCJjYW4ndCByZWFkICclcyciLCBmbik7CisJfQorIGZpOgorCWNsb3NlKGZkKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1JFQURPTkxZCisJaWYgKGluaXRpYWwKKwkgJiYgKChhY2Nlc3MoZm4sIFdfT0spIDwgMCkgfHwKKwkJLyogcm9vdCB3aWxsIGFsd2F5cyBoYXZlIGFjY2VzcygpCisJCSAqIHNvIHdlIGNoZWNrIGZpbGVwZXJtcyB0b28gKi8KKwkJIShzdGF0YnVmLnN0X21vZGUgJiAoU19JV1VTUiB8IFNfSVdHUlAgfCBTX0lXT1RIKSkKKwkgICAgKQorCSkgeworCQlTRVRfUkVBRE9OTFlfRklMRShyZWFkb25seV9tb2RlKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gY250OworfQorCitzdGF0aWMgaW50IGZpbGVfd3JpdGUoY2hhciAqZm4sIGNoYXIgKmZpcnN0LCBjaGFyICpsYXN0KQoreworCWludCBmZCwgY250LCBjaGFyY250OworCisJaWYgKGZuID09IDApIHsKKwkJc3RhdHVzX2xpbmVfYm9sZCgiTm8gY3VycmVudCBmaWxlbmFtZSIpOworCQlyZXR1cm4gLTI7CisJfQorCS8qIEJ5IHBvcHVsYXIgcmVxdWVzdCB3ZSBkbyBub3Qgb3BlbiBmaWxlIHdpdGggT19UUlVOQywKKwkgKiBidXQgaW5zdGVhZCBmdHJ1bmNhdGUoKSBpdCBfYWZ0ZXJfIHN1Y2Nlc3NmdWwgd3JpdGUuCisJICogTWlnaHQgcmVkdWNlIGFtb3VudCBvZiBkYXRhIGxvc3Qgb24gcG93ZXIgZmFpbCBldGMuCisJICovCisJZmQgPSBvcGVuKGZuLCAoT19XUk9OTFkgfCBPX0NSRUFUKSwgMDY2Nik7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCWNudCA9IGxhc3QgLSBmaXJzdCArIDE7CisJY2hhcmNudCA9IGZ1bGxfd3JpdGUoZmQsIGZpcnN0LCBjbnQpOworCWZ0cnVuY2F0ZShmZCwgY2hhcmNudCk7CisJaWYgKGNoYXJjbnQgPT0gY250KSB7CisJCS8vIGdvb2Qgd3JpdGUKKwkJLy9tb2RpZmllZF9jb3VudCA9IEZBTFNFOworCX0gZWxzZSB7CisJCWNoYXJjbnQgPSAwOworCX0KKwljbG9zZShmZCk7CisJcmV0dXJuIGNoYXJjbnQ7Cit9CisKKy8vLS0tLS0gVGVybWluYWwgRHJhd2luZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRoZSB0ZXJtaW5hbCBpcyBtYWRlIHVwIG9mICdyb3dzJyBsaW5lIG9mICdjb2x1bW5zJyBjb2x1bW5zLgorLy8gY2xhc3NpY2FsbHkgdGhpcyB3b3VsZCBiZSAyNCB4IDgwLgorLy8gIHNjcmVlbiBjb29yZGluYXRlcworLy8gIDAsMCAgICAgLi4uICAgICAwLDc5CisvLyAgMSwwICAgICAuLi4gICAgIDEsNzkKKy8vICAuICAgICAgIC4uLiAgICAgLgorLy8gIC4gICAgICAgLi4uICAgICAuCisvLyAgMjIsMCAgICAuLi4gICAgIDIyLDc5CisvLyAgMjMsMCAgICAuLi4gICAgIDIzLDc5ICAgPC0gc3RhdHVzIGxpbmUKKworLy8tLS0tLSBNb3ZlIHRoZSBjdXJzb3IgdG8gcm93IHggY29sIChjb3VudCBmcm9tIDAsIG5vdCAxKSAtLS0tLS0tCitzdGF0aWMgdm9pZCBwbGFjZV9jdXJzb3IoaW50IHJvdywgaW50IGNvbCkKK3sKKwljaGFyIGNtMVtzaXplb2YoRVNDX1NFVF9DVVJTT1JfUE9TKSArIHNpemVvZihpbnQpKjMgKiAyXTsKKworCWlmIChyb3cgPCAwKSByb3cgPSAwOworCWlmIChyb3cgPj0gcm93cykgcm93ID0gcm93cyAtIDE7CisJaWYgKGNvbCA8IDApIGNvbCA9IDA7CisJaWYgKGNvbCA+PSBjb2x1bW5zKSBjb2wgPSBjb2x1bW5zIC0gMTsKKworCXNwcmludGYoY20xLCBFU0NfU0VUX0NVUlNPUl9QT1MsIHJvdyArIDEsIGNvbCArIDEpOworCXdyaXRlMShjbTEpOworfQorCisvLy0tLS0tIEVyYXNlIGZyb20gY3Vyc29yIHRvIGVuZCBvZiBsaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCBjbGVhcl90b19lb2wodm9pZCkKK3sKKwl3cml0ZTEoRVNDX0NMRUFSMkVPTCk7Cit9CisKK3N0YXRpYyB2b2lkIGdvX2JvdHRvbV9hbmRfY2xlYXJfdG9fZW9sKHZvaWQpCit7CisJcGxhY2VfY3Vyc29yKHJvd3MgLSAxLCAwKTsKKwljbGVhcl90b19lb2woKTsKK30KKworLy8tLS0tLSBFcmFzZSBmcm9tIGN1cnNvciB0byBlbmQgb2Ygc2NyZWVuIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCBjbGVhcl90b19lb3Modm9pZCkKK3sKKwl3cml0ZTEoRVNDX0NMRUFSMkVPUyk7Cit9CisKKy8vLS0tLS0gU3RhcnQgc3RhbmRvdXQgbW9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB2b2lkIHN0YW5kb3V0X3N0YXJ0KHZvaWQpCit7CisJd3JpdGUxKEVTQ19CT0xEX1RFWFQpOworfQorCisvLy0tLS0tIEVuZCBzdGFuZG91dCBtb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCBzdGFuZG91dF9lbmQodm9pZCkKK3sKKwl3cml0ZTEoRVNDX05PUk1fVEVYVCk7Cit9CisKKy8vLS0tLS0gRmxhc2ggdGhlIHNjcmVlbiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB2b2lkIGZsYXNoKGludCBoKQoreworCXN0YW5kb3V0X3N0YXJ0KCk7CisJcmVkcmF3KFRSVUUpOworCW15c2xlZXAoaCk7CisJc3RhbmRvdXRfZW5kKCk7CisJcmVkcmF3KFRSVUUpOworfQorCitzdGF0aWMgdm9pZCBpbmRpY2F0ZV9lcnJvcih2b2lkKQoreworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0NSQVNITUUKKwlpZiAoY3Jhc2htZSA+IDApCisJCXJldHVybjsJCQkvLyBnZW5lcmF0ZSBhIHJhbmRvbSBjb21tYW5kCisjZW5kaWYKKwlpZiAoIWVycl9tZXRob2QpIHsKKwkJd3JpdGUxKEVTQ19CRUxMKTsKKwl9IGVsc2UgeworCQlmbGFzaCgxMCk7CisJfQorfQorCisvLy0tLS0tIFNjcmVlbltdIFJvdXRpbmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy0tLS0tIEVyYXNlIHRoZSBTY3JlZW5bXSBtZW1vcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZCBzY3JlZW5fZXJhc2Uodm9pZCkKK3sKKwltZW1zZXQoc2NyZWVuLCAnICcsIHNjcmVlbnNpemUpOwkvLyBjbGVhciBuZXcgc2NyZWVuCit9CisKK3N0YXRpYyBpbnQgYnVmc3VtKGNoYXIgKmJ1ZiwgaW50IGNvdW50KQoreworCWludCBzdW0gPSAwOworCWNoYXIgKmUgPSBidWYgKyBjb3VudDsKKworCXdoaWxlIChidWYgPCBlKQorCQlzdW0gKz0gKHVuc2lnbmVkIGNoYXIpICpidWYrKzsKKwlyZXR1cm4gc3VtOworfQorCisvLy0tLS0tIERyYXcgdGhlIHN0YXR1cyBsaW5lIGF0IGJvdHRvbSBvZiB0aGUgc2NyZWVuIC0tLS0tLS0tLS0tLS0KK3N0YXRpYyB2b2lkIHNob3dfc3RhdHVzX2xpbmUodm9pZCkKK3sKKwlpbnQgY250ID0gMCwgY2tzdW0gPSAwOworCisJLy8gZWl0aGVyIHdlIGFscmVhZHkgaGF2ZSBhbiBlcnJvciBvciBzdGF0dXMgbWVzc2FnZSwgb3Igd2UKKwkvLyBjcmVhdGUgb25lLgorCWlmICghaGF2ZV9zdGF0dXNfbXNnKSB7CisJCWNudCA9IGZvcm1hdF9lZGl0X3N0YXR1cygpOworCQlja3N1bSA9IGJ1ZnN1bShzdGF0dXNfYnVmZmVyLCBjbnQpOworCX0KKwlpZiAoaGF2ZV9zdGF0dXNfbXNnIHx8ICgoY250ID4gMCAmJiBsYXN0X3N0YXR1c19ja3N1bSAhPSBja3N1bSkpKSB7CisJCWxhc3Rfc3RhdHVzX2Nrc3VtID0gY2tzdW07CQkvLyByZW1lbWJlciBpZiB3ZSBoYXZlIHNlZW4gdGhpcyBsaW5lCisJCWdvX2JvdHRvbV9hbmRfY2xlYXJfdG9fZW9sKCk7CisJCXdyaXRlMShzdGF0dXNfYnVmZmVyKTsKKwkJaWYgKGhhdmVfc3RhdHVzX21zZykgeworCQkJaWYgKCgoaW50KXN0cmxlbihzdGF0dXNfYnVmZmVyKSAtIChoYXZlX3N0YXR1c19tc2cgLSAxKSkgPgorCQkJCQkoY29sdW1ucyAtIDEpICkgeworCQkJCWhhdmVfc3RhdHVzX21zZyA9IDA7CisJCQkJSGl0X1JldHVybigpOworCQkJfQorCQkJaGF2ZV9zdGF0dXNfbXNnID0gMDsKKwkJfQorCQlwbGFjZV9jdXJzb3IoY3JvdywgY2NvbCk7ICAvLyBwdXQgY3Vyc29yIGJhY2sgaW4gY29ycmVjdCBwbGFjZQorCX0KKwlmZmx1c2hfYWxsKCk7Cit9CisKKy8vLS0tLS0gZm9ybWF0IHRoZSBzdGF0dXMgYnVmZmVyLCB0aGUgYm90dG9tIGxpbmUgb2Ygc2NyZWVuIC0tLS0tLQorLy8gZm9ybWF0IHN0YXR1cyBidWZmZXIsIHdpdGggU1RBTkRPVVQgbW9kZQorc3RhdGljIHZvaWQgc3RhdHVzX2xpbmVfYm9sZChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisKKwl2YV9zdGFydChhcmdzLCBmb3JtYXQpOworCXN0cmNweShzdGF0dXNfYnVmZmVyLCBFU0NfQk9MRF9URVhUKTsKKwl2c3ByaW50ZihzdGF0dXNfYnVmZmVyICsgc2l6ZW9mKEVTQ19CT0xEX1RFWFQpLTEsIGZvcm1hdCwgYXJncyk7CisJc3RyY2F0KHN0YXR1c19idWZmZXIsIEVTQ19OT1JNX1RFWFQpOworCXZhX2VuZChhcmdzKTsKKworCWhhdmVfc3RhdHVzX21zZyA9IDEgKyBzaXplb2YoRVNDX0JPTERfVEVYVCkgKyBzaXplb2YoRVNDX05PUk1fVEVYVCkgLSAyOworfQorCitzdGF0aWMgdm9pZCBzdGF0dXNfbGluZV9ib2xkX2Vycm5vKGNvbnN0IGNoYXIgKmZuKQoreworCXN0YXR1c19saW5lX2JvbGQoIiclcycgJXMiLCBmbiwgc3RyZXJyb3IoZXJybm8pKTsKK30KKworLy8gZm9ybWF0IHN0YXR1cyBidWZmZXIKK3N0YXRpYyB2b2lkIHN0YXR1c19saW5lKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKworCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJdnNwcmludGYoc3RhdHVzX2J1ZmZlciwgZm9ybWF0LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisKKwloYXZlX3N0YXR1c19tc2cgPSAxOworfQorCisvLyBjb3B5IHMgdG8gYnVmLCBjb252ZXJ0IHVucHJpbnRhYmxlCitzdGF0aWMgdm9pZCBwcmludF9saXRlcmFsKGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqcykKK3sKKwljaGFyICpkOworCXVuc2lnbmVkIGNoYXIgYzsKKworCWJ1ZlswXSA9ICdcMCc7CisJaWYgKCFzWzBdKQorCQlzID0gIihOVUxMKSI7CisKKwlkID0gYnVmOworCWZvciAoOyAqczsgcysrKSB7CisJCWludCBjX2lzX25vX3ByaW50OworCisJCWMgPSAqczsKKwkJY19pc19ub19wcmludCA9IChjICYgMHg4MCkgJiYgIUlzcHJpbnQoYyk7CisJCWlmIChjX2lzX25vX3ByaW50KSB7CisJCQlzdHJjcHkoZCwgRVNDX05PUk1fVEVYVCk7CisJCQlkICs9IHNpemVvZihFU0NfTk9STV9URVhUKS0xOworCQkJYyA9ICcuJzsKKwkJfQorCQlpZiAoYyA8ICcgJyB8fCBjID09IDB4N2YpIHsKKwkJCSpkKysgPSAnXic7CisJCQljIHw9ICdAJzsgLyogMHg0MCAqLworCQkJaWYgKGMgPT0gMHg3ZikKKwkJCQljID0gJz8nOworCQl9CisJCSpkKysgPSBjOworCQkqZCA9ICdcMCc7CisJCWlmIChjX2lzX25vX3ByaW50KSB7CisJCQlzdHJjcHkoZCwgRVNDX0JPTERfVEVYVCk7CisJCQlkICs9IHNpemVvZihFU0NfQk9MRF9URVhUKS0xOworCQl9CisJCWlmICgqcyA9PSAnXG4nKSB7CisJCQkqZCsrID0gJyQnOworCQkJKmQgPSAnXDAnOworCQl9CisJCWlmIChkIC0gYnVmID4gTUFYX0lOUFVUX0xFTiAtIDEwKSAvLyBwYXJhbm9pYQorCQkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBub3RfaW1wbGVtZW50ZWQoY29uc3QgY2hhciAqcykKK3sKKwljaGFyIGJ1ZltNQVhfSU5QVVRfTEVOXTsKKworCXByaW50X2xpdGVyYWwoYnVmLCBzKTsKKwlzdGF0dXNfbGluZV9ib2xkKCJcJyVzXCcgaXMgbm90IGltcGxlbWVudGVkIiwgYnVmKTsKK30KKworLy8gc2hvdyBmaWxlIHN0YXR1cyBvbiBzdGF0dXMgbGluZQorc3RhdGljIGludCBmb3JtYXRfZWRpdF9zdGF0dXModm9pZCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBjbWRfbW9kZV9pbmRpY2F0b3JbXSBBTElHTjEgPSAiLUlSLSI7CisKKyNkZWZpbmUgdG90IGZvcm1hdF9lZGl0X3N0YXR1c19fdG90CisKKwlpbnQgY3VyLCBwZXJjZW50LCByZXQsIHRydW5jX2F0OworCisJLy8gbW9kaWZpZWRfY291bnQgaXMgbm93IGEgY291bnRlciByYXRoZXIgdGhhbiBhIGZsYWcuICB0aGlzCisJLy8gaGVscHMgcmVkdWNlIHRoZSBhbW91bnQgb2YgbGluZSBjb3VudGluZyB3ZSBuZWVkIHRvIGRvLgorCS8vICh0aGlzIHdpbGwgY2F1c2UgYSBtaXMtcmVwb3J0aW5nIG9mIG1vZGlmaWVkIHN0YXR1cworCS8vIG9uY2UgZXZlcnkgTUFYSU5UIGVkaXRpbmcgb3BlcmF0aW9ucy4pCisKKwkvLyBpdCB3b3VsZCBiZSBuaWNlIHRvIGRvIGEgc2ltaWxhciBvcHRpbWl6YXRpb24gaGVyZSAtLSBpZgorCS8vIHdlIGhhdmVuJ3QgZG9uZSBhIG1vdGlvbiB0aGF0IGNvdWxkIGhhdmUgY2hhbmdlZCB3aGljaCBsaW5lCisJLy8gd2UncmUgb24sIHRoZW4gd2Ugc2hvdWxkbid0IGhhdmUgdG8gZG8gdGhpcyBjb3VudF9saW5lcygpCisJY3VyID0gY291bnRfbGluZXModGV4dCwgZG90KTsKKworCS8vIGNvdW50X2xpbmVzKCkgaXMgZXhwZW5zaXZlLgorCS8vIENhbGwgaXQgb25seSBpZiBzb21ldGhpbmcgd2FzIGNoYW5nZWQgc2luY2UgbGFzdCB0aW1lCisJLy8gd2Ugd2VyZSBoZXJlOgorCWlmIChtb2RpZmllZF9jb3VudCAhPSBsYXN0X21vZGlmaWVkX2NvdW50KSB7CisJCXRvdCA9IGN1ciArIGNvdW50X2xpbmVzKGRvdCwgZW5kIC0gMSkgLSAxOworCQlsYXN0X21vZGlmaWVkX2NvdW50ID0gbW9kaWZpZWRfY291bnQ7CisJfQorCisJLy8gICAgY3VycmVudCBsaW5lICAgICAgICAgcGVyY2VudAorCS8vICAgLS0tLS0tLS0tLS0tLSAgICB+fiAtLS0tLS0tLS0tCisJLy8gICAgdG90YWwgbGluZXMgICAgICAgICAgICAxMDAKKwlpZiAodG90ID4gMCkgeworCQlwZXJjZW50ID0gKDEwMCAqIGN1cikgLyB0b3Q7CisJfSBlbHNlIHsKKwkJY3VyID0gdG90ID0gMDsKKwkJcGVyY2VudCA9IDEwMDsKKwl9CisKKwl0cnVuY19hdCA9IGNvbHVtbnMgPCBTVEFUVVNfQlVGRkVSX0xFTi0xID8KKwkJY29sdW1ucyA6IFNUQVRVU19CVUZGRVJfTEVOLTE7CisKKwlyZXQgPSBzbnByaW50ZihzdGF0dXNfYnVmZmVyLCB0cnVuY19hdCsxLAorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1JFQURPTkxZCisJCSIlYyAlcyVzJXMgJWQvJWQgJWQlJSIsCisjZWxzZQorCQkiJWMgJXMlcyAlZC8lZCAlZCUlIiwKKyNlbmRpZgorCQljbWRfbW9kZV9pbmRpY2F0b3JbY21kX21vZGUgJiAzXSwKKwkJKGN1cnJlbnRfZmlsZW5hbWUgIT0gTlVMTCA/IGN1cnJlbnRfZmlsZW5hbWUgOiAiTm8gZmlsZSIpLAorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1JFQURPTkxZCisJCShyZWFkb25seV9tb2RlID8gIiBbUmVhZG9ubHldIiA6ICIiKSwKKyNlbmRpZgorCQkobW9kaWZpZWRfY291bnQgPyAiIFtNb2RpZmllZF0iIDogIiIpLAorCQljdXIsIHRvdCwgcGVyY2VudCk7CisKKwlpZiAocmV0ID49IDAgJiYgcmV0IDwgdHJ1bmNfYXQpCisJCXJldHVybiByZXQ7ICAvKiBpdCBhbGwgZml0ICovCisKKwlyZXR1cm4gdHJ1bmNfYXQ7ICAvKiBoYWQgdG8gdHJ1bmNhdGUgKi8KKyN1bmRlZiB0b3QKK30KKworLy8tLS0tLSBGb3JjZSByZWZyZXNoIG9mIGFsbCBMaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgcmVkcmF3KGludCBmdWxsX3NjcmVlbikKK3sKKwlwbGFjZV9jdXJzb3IoMCwgMCk7CisJY2xlYXJfdG9fZW9zKCk7CisJc2NyZWVuX2VyYXNlKCk7CQkvLyBlcmFzZSB0aGUgaW50ZXJuYWwgc2NyZWVuIGJ1ZmZlcgorCWxhc3Rfc3RhdHVzX2Nrc3VtID0gMDsJLy8gZm9yY2Ugc3RhdHVzIHVwZGF0ZQorCXJlZnJlc2goZnVsbF9zY3JlZW4pOwkvLyB0aGlzIHdpbGwgcmVkcmF3IHRoZSBlbnRpcmUgZGlzcGxheQorCXNob3dfc3RhdHVzX2xpbmUoKTsKK30KKworLy8tLS0tLSBGb3JtYXQgYSB0ZXh0W10gbGluZSBpbnRvIGEgYnVmZmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIGNoYXIqIGZvcm1hdF9saW5lKGNoYXIgKnNyYyAvKiwgaW50IGxpKi8pCit7CisJdW5zaWduZWQgY2hhciBjOworCWludCBjbzsKKwlpbnQgb2ZzID0gb2Zmc2V0OworCWNoYXIgKmRlc3QgPSBzY3Jfb3V0X2J1ZjsgLy8gW01BWF9TQ1JfQ09MUyArIE1BWF9UQUJTVE9QICogMl0KKworCWMgPSAnfic7IC8vIGNoYXIgaW4gY29sIDAgaW4gbm9uLWV4aXN0ZW50IGxpbmVzIGlzICd+JworCWNvID0gMDsKKwl3aGlsZSAoY28gPCBjb2x1bW5zICsgdGFic3RvcCkgeworCQkvLyBoYXZlIHdlIGdvbmUgcGFzdCB0aGUgZW5kPworCQlpZiAoc3JjIDwgZW5kKSB7CisJCQljID0gKnNyYysrOworCQkJaWYgKGMgPT0gJ1xuJykKKwkJCQlicmVhazsKKwkJCWlmICgoYyAmIDB4ODApICYmICFJc3ByaW50KGMpKSB7CisJCQkJYyA9ICcuJzsKKwkJCX0KKwkJCWlmIChjIDwgJyAnIHx8IGMgPT0gMHg3ZikgeworCQkJCWlmIChjID09ICdcdCcpIHsKKwkJCQkJYyA9ICcgJzsKKwkJCQkJLy8gICAgICBjbyAlICAgIDggICAgICE9ICAgICA3CisJCQkJCXdoaWxlICgoY28gJSB0YWJzdG9wKSAhPSAodGFic3RvcCAtIDEpKSB7CisJCQkJCQlkZXN0W2NvKytdID0gYzsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCWRlc3RbY28rK10gPSAnXic7CisJCQkJCWlmIChjID09IDB4N2YpCisJCQkJCQljID0gJz8nOworCQkJCQllbHNlCisJCQkJCQljICs9ICdAJzsgLy8gQ3RybC1YIC0+ICdYJworCQkJCX0KKwkJCX0KKwkJfQorCQlkZXN0W2NvKytdID0gYzsKKwkJLy8gZGlzY2FyZCBzY3JvbGxlZC1vZmYtdG8tdGhlLWxlZnQgcG9ydGlvbiwKKwkJLy8gaW4gdGFic3RvcC1zaXplZCBwaWVjZXMKKwkJaWYgKG9mcyA+PSB0YWJzdG9wICYmIGNvID49IHRhYnN0b3ApIHsKKwkJCW1lbW1vdmUoZGVzdCwgZGVzdCArIHRhYnN0b3AsIGNvKTsKKwkJCWNvIC09IHRhYnN0b3A7CisJCQlvZnMgLT0gdGFic3RvcDsKKwkJfQorCQlpZiAoc3JjID49IGVuZCkKKwkJCWJyZWFrOworCX0KKwkvLyBjaGVjayAic2hvcnQgbGluZSwgZ2lnYW50aWMgb2Zmc2V0IiBjYXNlCisJaWYgKGNvIDwgb2ZzKQorCQlvZnMgPSBjbzsKKwkvLyBkaXNjYXJkIGxhc3Qgc2Nyb2xsZWQgb2ZmIHBhcnQKKwljbyAtPSBvZnM7CisJZGVzdCArPSBvZnM7CisJLy8gZmlsbCB0aGUgcmVzdCB3aXRoIHNwYWNlcworCWlmIChjbyA8IGNvbHVtbnMpCisJCW1lbXNldCgmZGVzdFtjb10sICcgJywgY29sdW1ucyAtIGNvKTsKKwlyZXR1cm4gZGVzdDsKK30KKworLy8tLS0tLSBSZWZyZXNoIHRoZSBjaGFuZ2VkIHNjcmVlbiBsaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29weSB0aGUgc291cmNlIGxpbmUgZnJvbSB0ZXh0W10gaW50byB0aGUgYnVmZmVyIGFuZCBub3RlCisvLyBpZiB0aGUgY3VycmVudCBzY3JlZW5saW5lIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBuZXcgYnVmZmVyLgorLy8gSWYgdGhleSBkaWZmZXIgdGhlbiB0aGF0IGxpbmUgbmVlZHMgcmVkcmF3aW5nIG9uIHRoZSB0ZXJtaW5hbC4KKy8vCitzdGF0aWMgdm9pZCByZWZyZXNoKGludCBmdWxsX3NjcmVlbikKK3sKKyNkZWZpbmUgb2xkX29mZnNldCByZWZyZXNoX19vbGRfb2Zmc2V0CisKKwlpbnQgbGksIGNoYW5nZWQ7CisJY2hhciAqdHAsICpzcDsJCS8vIHBvaW50ZXIgaW50byB0ZXh0W10gYW5kIHNjcmVlbltdCisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfVklfV0lOX1JFU0laRSBJRl9GRUFUVVJFX1ZJX0FTS19URVJNSU5BTCgmJiAhRy5nZXRfcm93Y29sX2Vycm9yKSApIHsKKwkJdW5zaWduZWQgYyA9IGNvbHVtbnMsIHIgPSByb3dzOworCQlxdWVyeV9zY3JlZW5fZGltZW5zaW9ucygpOworCQlmdWxsX3NjcmVlbiB8PSAoYyAtIGNvbHVtbnMpIHwgKHIgLSByb3dzKTsKKwl9CisJc3luY19jdXJzb3IoZG90LCAmY3JvdywgJmNjb2wpOwkvLyB3aGVyZSBjdXJzb3Igd2lsbCBiZSAob24gImRvdCIpCisJdHAgPSBzY3JlZW5iZWdpbjsJLy8gaW5kZXggaW50byB0ZXh0W10gb2YgdG9wIGxpbmUKKworCS8vIGNvbXBhcmUgdGV4dFtdIHRvIHNjcmVlbltdIGFuZCBtYXJrIHNjcmVlbltdIGxpbmVzIHRoYXQgbmVlZCB1cGRhdGluZworCWZvciAobGkgPSAwOyBsaSA8IHJvd3MgLSAxOyBsaSsrKSB7CisJCWludCBjcywgY2U7CQkJCS8vIGNvbHVtbiBzdGFydCAmIGVuZAorCQljaGFyICpvdXRfYnVmOworCQkvLyBmb3JtYXQgY3VycmVudCB0ZXh0IGxpbmUKKwkJb3V0X2J1ZiA9IGZvcm1hdF9saW5lKHRwIC8qLCBsaSovKTsKKworCQkvLyBza2lwIHRvIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgdGV4dFtdIGxpbmUKKwkJaWYgKHRwIDwgZW5kKSB7CisJCQljaGFyICp0ID0gbWVtY2hyKHRwLCAnXG4nLCBlbmQgLSB0cCk7CisJCQlpZiAoIXQpIHQgPSBlbmQgLSAxOworCQkJdHAgPSB0ICsgMTsKKwkJfQorCisJCS8vIHNlZSBpZiB0aGVyZSBhcmUgYW55IGNoYW5nZXMgYmV0d2VlbiB2aXJ0dWFsIHNjcmVlbiBhbmQgb3V0X2J1ZgorCQljaGFuZ2VkID0gRkFMU0U7CS8vIGFzc3VtZSBubyBjaGFuZ2UKKwkJY3MgPSAwOworCQljZSA9IGNvbHVtbnMgLSAxOworCQlzcCA9ICZzY3JlZW5bbGkgKiBjb2x1bW5zXTsJLy8gc3RhcnQgb2Ygc2NyZWVuIGxpbmUKKwkJaWYgKGZ1bGxfc2NyZWVuKSB7CisJCQkvLyBmb3JjZSByZS1kcmF3IG9mIGV2ZXJ5IHNpbmdsZSBjb2x1bW4gZnJvbSAwIC0gY29sdW1ucy0xCisJCQlnb3RvIHJlMDsKKwkJfQorCQkvLyBjb21wYXJlIG5ld2x5IGZvcm1hdHRlZCBidWZmZXIgd2l0aCB2aXJ0dWFsIHNjcmVlbgorCQkvLyBsb29rIGZvcndhcmQgZm9yIGZpcnN0IGRpZmZlcmVuY2UgYmV0d2VlbiBidWYgYW5kIHNjcmVlbgorCQlmb3IgKDsgY3MgPD0gY2U7IGNzKyspIHsKKwkJCWlmIChvdXRfYnVmW2NzXSAhPSBzcFtjc10pIHsKKwkJCQljaGFuZ2VkID0gVFJVRTsJLy8gbWFyayBmb3IgcmVkcmF3CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvLyBsb29rIGJhY2t3YXJkIGZvciBsYXN0IGRpZmZlcmVuY2UgYmV0d2VlbiBvdXRfYnVmIGFuZCBzY3JlZW4KKwkJZm9yICg7IGNlID49IGNzOyBjZS0tKSB7CisJCQlpZiAob3V0X2J1ZltjZV0gIT0gc3BbY2VdKSB7CisJCQkJY2hhbmdlZCA9IFRSVUU7CS8vIG1hcmsgZm9yIHJlZHJhdworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8vIG5vdywgY3MgaXMgaW5kZXggb2YgZmlyc3QgZGlmZiwgYW5kIGNlIGlzIGluZGV4IG9mIGxhc3QgZGlmZgorCisJCS8vIGlmIGhvcnogb2Zmc2V0IGhhcyBjaGFuZ2VkLCBmb3JjZSBhIHJlZHJhdworCQlpZiAob2Zmc2V0ICE9IG9sZF9vZmZzZXQpIHsKKyByZTA6CisJCQljaGFuZ2VkID0gVFJVRTsKKwkJfQorCisJCS8vIG1ha2UgYSBzYW5pdHkgY2hlY2sgb2YgY29sdW1ucyBpbmRleGVzCisJCWlmIChjcyA8IDApIGNzID0gMDsKKwkJaWYgKGNlID4gY29sdW1ucyAtIDEpIGNlID0gY29sdW1ucyAtIDE7CisJCWlmIChjcyA+IGNlKSB7IGNzID0gMDsgY2UgPSBjb2x1bW5zIC0gMTsgfQorCQkvLyBpcyB0aGVyZSBhIGNoYW5nZSBiZXR3ZWVuIHZpcnR1YWwgc2NyZWVuIGFuZCBvdXRfYnVmCisJCWlmIChjaGFuZ2VkKSB7CisJCQkvLyBjb3B5IGNoYW5nZWQgcGFydCBvZiBidWZmZXIgdG8gdmlydHVhbCBzY3JlZW4KKwkJCW1lbWNweShzcCtjcywgb3V0X2J1ZitjcywgY2UtY3MrMSk7CisJCQlwbGFjZV9jdXJzb3IobGksIGNzKTsKKwkJCS8vIHdyaXRlIGxpbmUgb3V0IHRvIHRlcm1pbmFsCisJCQlmd3JpdGUoJnNwW2NzXSwgY2UgLSBjcyArIDEsIDEsIHN0ZG91dCk7CisJCX0KKwl9CisKKwlwbGFjZV9jdXJzb3IoY3JvdywgY2NvbCk7CisKKwlvbGRfb2Zmc2V0ID0gb2Zmc2V0OworI3VuZGVmIG9sZF9vZmZzZXQKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLS0tLS0gdGhlIEFzY2lpIENoYXJ0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gIDAwIG51bCAgIDAxIHNvaCAgIDAyIHN0eCAgIDAzIGV0eCAgIDA0IGVvdCAgIDA1IGVucSAgIDA2IGFjayAgIDA3IGJlbAorLy8gIDA4IGJzICAgIDA5IGh0ICAgIDBhIG5sICAgIDBiIHZ0ICAgIDBjIG5wICAgIDBkIGNyICAgIDBlIHNvICAgIDBmIHNpCisvLyAgMTAgZGxlICAgMTEgZGMxICAgMTIgZGMyICAgMTMgZGMzICAgMTQgZGM0ICAgMTUgbmFrICAgMTYgc3luICAgMTcgZXRiCisvLyAgMTggY2FuICAgMTkgZW0gICAgMWEgc3ViICAgMWIgZXNjICAgMWMgZnMgICAgMWQgZ3MgICAgMWUgcnMgICAgMWYgdXMKKy8vICAyMCBzcCAgICAyMSAhICAgICAyMiAiICAgICAyMyAjICAgICAyNCAkICAgICAyNSAlICAgICAyNiAmICAgICAyNyAnCisvLyAgMjggKCAgICAgMjkgKSAgICAgMmEgKiAgICAgMmIgKyAgICAgMmMgLCAgICAgMmQgLSAgICAgMmUgLiAgICAgMmYgLworLy8gIDMwIDAgICAgIDMxIDEgICAgIDMyIDIgICAgIDMzIDMgICAgIDM0IDQgICAgIDM1IDUgICAgIDM2IDYgICAgIDM3IDcKKy8vICAzOCA4ICAgICAzOSA5ICAgICAzYSA6ICAgICAzYiA7ICAgICAzYyA8ICAgICAzZCA9ICAgICAzZSA+ICAgICAzZiA/CisvLyAgNDAgQCAgICAgNDEgQSAgICAgNDIgQiAgICAgNDMgQyAgICAgNDQgRCAgICAgNDUgRSAgICAgNDYgRiAgICAgNDcgRworLy8gIDQ4IEggICAgIDQ5IEkgICAgIDRhIEogICAgIDRiIEsgICAgIDRjIEwgICAgIDRkIE0gICAgIDRlIE4gICAgIDRmIE8KKy8vICA1MCBQICAgICA1MSBRICAgICA1MiBSICAgICA1MyBTICAgICA1NCBUICAgICA1NSBVICAgICA1NiBWICAgICA1NyBXCisvLyAgNTggWCAgICAgNTkgWSAgICAgNWEgWiAgICAgNWIgWyAgICAgNWMgXCAgICAgNWQgXSAgICAgNWUgXiAgICAgNWYgXworLy8gIDYwIGAgICAgIDYxIGEgICAgIDYyIGIgICAgIDYzIGMgICAgIDY0IGQgICAgIDY1IGUgICAgIDY2IGYgICAgIDY3IGcKKy8vICA2OCBoICAgICA2OSBpICAgICA2YSBqICAgICA2YiBrICAgICA2YyBsICAgICA2ZCBtICAgICA2ZSBuICAgICA2ZiBvCisvLyAgNzAgcCAgICAgNzEgcSAgICAgNzIgciAgICAgNzMgcyAgICAgNzQgdCAgICAgNzUgdSAgICAgNzYgdiAgICAgNzcgdworLy8gIDc4IHggICAgIDc5IHkgICAgIDdhIHogICAgIDdiIHsgICAgIDdjIHwgICAgIDdkIH0gICAgIDdlIH4gICAgIDdmIGRlbAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8tLS0tLSBFeGVjdXRlIGEgVmkgQ29tbWFuZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIHZvaWQgZG9fY21kKGludCBjKQoreworCWNoYXIgKnAsICpxLCAqc2F2ZV9kb3Q7CisJY2hhciBidWZbMTJdOworCWludCBkaXI7CisJaW50IGNudCwgaSwgajsKKwlpbnQgYzE7CisKKy8vCWMxID0gYzsgLy8gcXVpZXQgdGhlIGNvbXBpbGVyCisvLwljbnQgPSB5ZiA9IDA7IC8vIHF1aWV0IHRoZSBjb21waWxlcgorLy8JcCA9IHEgPSBzYXZlX2RvdCA9IGJ1ZjsgLy8gcXVpZXQgdGhlIGNvbXBpbGVyCisJbWVtc2V0KGJ1ZiwgJ1wwJywgc2l6ZW9mKGJ1ZikpOworCisJc2hvd19zdGF0dXNfbGluZSgpOworCisJLyogaWYgdGhpcyBpcyBhIGN1cnNvciBrZXksIHNraXAgdGhlc2UgY2hlY2tzICovCisJc3dpdGNoIChjKSB7CisJCWNhc2UgS0VZQ09ERV9VUDoKKwkJY2FzZSBLRVlDT0RFX0RPV046CisJCWNhc2UgS0VZQ09ERV9MRUZUOgorCQljYXNlIEtFWUNPREVfUklHSFQ6CisJCWNhc2UgS0VZQ09ERV9IT01FOgorCQljYXNlIEtFWUNPREVfRU5EOgorCQljYXNlIEtFWUNPREVfUEFHRVVQOgorCQljYXNlIEtFWUNPREVfUEFHRURPV046CisJCWNhc2UgS0VZQ09ERV9ERUxFVEU6CisJCQlnb3RvIGtleV9jbWRfbW9kZTsKKwl9CisKKwlpZiAoY21kX21vZGUgPT0gMikgeworCQkvLyAgZmxpcC1mbG9wIEluc2VydC9SZXBsYWNlIG1vZGUKKwkJaWYgKGMgPT0gS0VZQ09ERV9JTlNFUlQpCisJCQlnb3RvIGRjX2k7CisJCS8vIHdlIGFyZSAnUidlcGxhY2luZyB0aGUgY3VycmVudCAqZG90IHdpdGggbmV3IGNoYXIKKwkJaWYgKCpkb3QgPT0gJ1xuJykgeworCQkJLy8gZG9uJ3QgUmVwbGFjZSBwYXN0IEUtby1sCisJCQljbWRfbW9kZSA9IDE7CS8vIGNvbnZlcnQgdG8gaW5zZXJ0CisJCQl1bmRvX3F1ZXVlX2NvbW1pdCgpOworCQl9IGVsc2UgeworCQkJaWYgKDEgPD0gYyB8fCBJc3ByaW50KGMpKSB7CisJCQkJaWYgKGMgIT0gMjcpCisJCQkJCWRvdCA9IHlhbmtfZGVsZXRlKGRvdCwgZG90LCAwLCBZQU5LREVMLCBBTExPV19VTkRPKTsJLy8gZGVsZXRlIGNoYXIKKwkJCQlkb3QgPSBjaGFyX2luc2VydChkb3QsIGMsIEFMTE9XX1VORE9fQ0hBSU4pOwkvLyBpbnNlcnQgbmV3IGNoYXIKKwkJCX0KKwkJCWdvdG8gZGMxOworCQl9CisJfQorCWlmIChjbWRfbW9kZSA9PSAxKSB7CisJCS8vICBoaXR0aW5nICJJbnNlcnQiIHR3aWNlIG1lYW5zICJSIiByZXBsYWNlIG1vZGUKKwkJaWYgKGMgPT0gS0VZQ09ERV9JTlNFUlQpIGdvdG8gZGM1OworCQkvLyBpbnNlcnQgdGhlIGNoYXIgYyBhdCAiZG90IgorCQlpZiAoMSA8PSBjIHx8IElzcHJpbnQoYykpIHsKKwkJCWRvdCA9IGNoYXJfaW5zZXJ0KGRvdCwgYywgQUxMT1dfVU5ET19RVUVVRUQpOworCQl9CisJCWdvdG8gZGMxOworCX0KKworIGtleV9jbWRfbW9kZToKKwlzd2l0Y2ggKGMpIHsKKwkJLy9jYXNlIDB4MDE6CS8vIHNvaAorCQkvL2Nhc2UgMHgwOToJLy8gaHQKKwkJLy9jYXNlIDB4MGI6CS8vIHZ0CisJCS8vY2FzZSAweDBlOgkvLyBzbworCQkvL2Nhc2UgMHgwZjoJLy8gc2kKKwkJLy9jYXNlIDB4MTA6CS8vIGRsZQorCQkvL2Nhc2UgMHgxMToJLy8gZGMxCisJCS8vY2FzZSAweDEzOgkvLyBkYzMKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9DUkFTSE1FCisJY2FzZSAweDE0OgkJCS8vIGRjNCAgY3RybC1UCisJCWNyYXNobWUgPSAoY3Jhc2htZSA9PSAwKSA/IDEgOiAwOworCQlicmVhazsKKyNlbmRpZgorCQkvL2Nhc2UgMHgxNjoJLy8gc3luCisJCS8vY2FzZSAweDE3OgkvLyBldGIKKwkJLy9jYXNlIDB4MTg6CS8vIGNhbgorCQkvL2Nhc2UgMHgxYzoJLy8gZnMKKwkJLy9jYXNlIDB4MWQ6CS8vIGdzCisJCS8vY2FzZSAweDFlOgkvLyBycworCQkvL2Nhc2UgMHgxZjoJLy8gdXMKKwkJLy9jYXNlICchJzoJLy8gIS0KKwkJLy9jYXNlICcjJzoJLy8gIy0KKwkJLy9jYXNlICcmJzoJLy8gJi0KKwkJLy9jYXNlICcoJzoJLy8gKC0KKwkJLy9jYXNlICcpJzoJLy8gKS0KKwkJLy9jYXNlICcqJzoJLy8gKi0KKwkJLy9jYXNlICc9JzoJLy8gPS0KKwkJLy9jYXNlICdAJzoJLy8gQC0KKwkJLy9jYXNlICdGJzoJLy8gRi0KKwkJLy9jYXNlICdLJzoJLy8gSy0KKwkJLy9jYXNlICdRJzoJLy8gUS0KKwkJLy9jYXNlICdTJzoJLy8gUy0KKwkJLy9jYXNlICdUJzoJLy8gVC0KKwkJLy9jYXNlICdWJzoJLy8gVi0KKwkJLy9jYXNlICdbJzoJLy8gWy0KKwkJLy9jYXNlICdcXCc6CS8vIFwtCisJCS8vY2FzZSAnXSc6CS8vIF0tCisJCS8vY2FzZSAnXyc6CS8vIF8tCisJCS8vY2FzZSAnYCc6CS8vIGAtCisJCS8vY2FzZSAndic6CS8vIHYtCisJZGVmYXVsdDoJCQkvLyB1bnJlY29nbml6ZWQgY29tbWFuZAorCQlidWZbMF0gPSBjOworCQlidWZbMV0gPSAnXDAnOworCQlub3RfaW1wbGVtZW50ZWQoYnVmKTsKKwkJZW5kX2NtZF9xKCk7CS8vIHN0b3AgYWRkaW5nIHRvIHEKKwljYXNlIDB4MDA6CQkJLy8gbnVsLSBpZ25vcmUKKwkJYnJlYWs7CisJY2FzZSAyOgkJCS8vIGN0cmwtQiAgc2Nyb2xsIHVwICAgZnVsbCBzY3JlZW4KKwljYXNlIEtFWUNPREVfUEFHRVVQOgkvLyBDdXJzb3IgS2V5IFBhZ2UgVXAKKwkJZG90X3Njcm9sbChyb3dzIC0gMiwgLTEpOworCQlicmVhazsKKwljYXNlIDQ6CQkJLy8gY3RybC1EICBzY3JvbGwgZG93biBoYWxmIHNjcmVlbgorCQlkb3Rfc2Nyb2xsKChyb3dzIC0gMikgLyAyLCAxKTsKKwkJYnJlYWs7CisJY2FzZSA1OgkJCS8vIGN0cmwtRSAgc2Nyb2xsIGRvd24gb25lIGxpbmUKKwkJZG90X3Njcm9sbCgxLCAxKTsKKwkJYnJlYWs7CisJY2FzZSA2OgkJCS8vIGN0cmwtRiAgc2Nyb2xsIGRvd24gZnVsbCBzY3JlZW4KKwljYXNlIEtFWUNPREVfUEFHRURPV046CS8vIEN1cnNvciBLZXkgUGFnZSBEb3duCisJCWRvdF9zY3JvbGwocm93cyAtIDIsIDEpOworCQlicmVhazsKKwljYXNlIDc6CQkJLy8gY3RybC1HICBzaG93IGN1cnJlbnQgc3RhdHVzCisJCWxhc3Rfc3RhdHVzX2Nrc3VtID0gMDsJLy8gZm9yY2Ugc3RhdHVzIHVwZGF0ZQorCQlicmVhazsKKwljYXNlICdoJzoJCQkvLyBoLSBtb3ZlIGxlZnQKKwljYXNlIEtFWUNPREVfTEVGVDoJLy8gY3Vyc29yIGtleSBMZWZ0CisJY2FzZSA4OgkJLy8gY3RybC1ILSBtb3ZlIGxlZnQgICAgKFRoaXMgbWF5IGJlIEVSQVNFIGNoYXIpCisJY2FzZSAweDdmOgkvLyBERUwtIG1vdmUgbGVmdCAgIChUaGlzIG1heSBiZSBFUkFTRSBjaGFyKQorCQlkbyB7CisJCQlkb3RfbGVmdCgpOworCQl9IHdoaWxlICgtLWNtZGNudCA+IDApOworCQlicmVhazsKKwljYXNlIDEwOgkJCS8vIE5ld2xpbmUgXkoKKwljYXNlICdqJzoJCQkvLyBqLSBnb3RvIG5leHQgbGluZSwgc2FtZSBjb2wKKwljYXNlIEtFWUNPREVfRE9XTjoJLy8gY3Vyc29yIGtleSBEb3duCisJCWRvIHsKKwkJCWRvdF9uZXh0KCk7CQkvLyBnbyB0byBuZXh0IEItby1sCisJCQkvLyB0cnkgc3RheSBpbiBzYW1lIGNvbAorCQkJZG90ID0gbW92ZV90b19jb2woZG90LCBjY29sICsgb2Zmc2V0KTsKKwkJfSB3aGlsZSAoLS1jbWRjbnQgPiAwKTsKKwkJYnJlYWs7CisJY2FzZSAxMjoJCQkvLyBjdHJsLUwgIGZvcmNlIHJlZHJhdyB3aG9sZSBzY3JlZW4KKwljYXNlIDE4OgkJCS8vIGN0cmwtUiAgZm9yY2UgcmVkcmF3CisJCXBsYWNlX2N1cnNvcigwLCAwKTsKKwkJY2xlYXJfdG9fZW9zKCk7CisJCS8vbXlzbGVlcCgxMCk7IC8vIHdoeT8/PworCQlzY3JlZW5fZXJhc2UoKTsJLy8gZXJhc2UgdGhlIGludGVybmFsIHNjcmVlbiBidWZmZXIKKwkJbGFzdF9zdGF0dXNfY2tzdW0gPSAwOwkvLyBmb3JjZSBzdGF0dXMgdXBkYXRlCisJCXJlZnJlc2goVFJVRSk7CS8vIHRoaXMgd2lsbCByZWRyYXcgdGhlIGVudGlyZSBkaXNwbGF5CisJCWJyZWFrOworCWNhc2UgMTM6CQkJLy8gQ2FycmlhZ2UgUmV0dXJuIF5NCisJY2FzZSAnKyc6CQkJLy8gKy0gZ290byBuZXh0IGxpbmUKKwkJZG8geworCQkJZG90X25leHQoKTsKKwkJCWRvdF9za2lwX292ZXJfd3MoKTsKKwkJfSB3aGlsZSAoLS1jbWRjbnQgPiAwKTsKKwkJYnJlYWs7CisJY2FzZSAyMToJCQkvLyBjdHJsLVUgIHNjcm9sbCB1cCAgIGhhbGYgc2NyZWVuCisJCWRvdF9zY3JvbGwoKHJvd3MgLSAyKSAvIDIsIC0xKTsKKwkJYnJlYWs7CisJY2FzZSAyNToJCQkvLyBjdHJsLVkgIHNjcm9sbCB1cCBvbmUgbGluZQorCQlkb3Rfc2Nyb2xsKDEsIC0xKTsKKwkJYnJlYWs7CisJY2FzZSAyNzoJCQkvLyBlc2MKKwkJaWYgKGNtZF9tb2RlID09IDApCisJCQlpbmRpY2F0ZV9lcnJvcigpOworCQljbWRfbW9kZSA9IDA7CS8vIHN0b3AgaW5zcnRpbmcKKwkJdW5kb19xdWV1ZV9jb21taXQoKTsKKwkJZW5kX2NtZF9xKCk7CisJCWxhc3Rfc3RhdHVzX2Nrc3VtID0gMDsJLy8gZm9yY2Ugc3RhdHVzIHVwZGF0ZQorCQlicmVhazsKKwljYXNlICcgJzoJCQkvLyBtb3ZlIHJpZ2h0CisJY2FzZSAnbCc6CQkJLy8gbW92ZSByaWdodAorCWNhc2UgS0VZQ09ERV9SSUdIVDoJLy8gQ3Vyc29yIEtleSBSaWdodAorCQlkbyB7CisJCQlkb3RfcmlnaHQoKTsKKwkJfSB3aGlsZSAoLS1jbWRjbnQgPiAwKTsKKwkJYnJlYWs7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKKwljYXNlICciJzoJCQkvLyAiLSBuYW1lIGEgcmVnaXN0ZXIgdG8gdXNlIGZvciBEZWxldGUvWWFuaworCQljMSA9IChnZXRfb25lX2NoYXIoKSB8IDB4MjApIC0gJ2EnOyAvLyB8IDB4MjAgaXMgdG9sb3dlcigpCisJCWlmICgodW5zaWduZWQpYzEgPD0gMjUpIHsgLy8gYS16PworCQkJWURyZWcgPSBjMTsKKwkJfSBlbHNlIHsKKwkJCWluZGljYXRlX2Vycm9yKCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAnXCcnOgkJCS8vICctIGdvdG8gYSBzcGVjaWZpYyBtYXJrCisJCWMxID0gKGdldF9vbmVfY2hhcigpIHwgMHgyMCkgLSAnYSc7CisJCWlmICgodW5zaWduZWQpYzEgPD0gMjUpIHsgLy8gYS16PworCQkJLy8gZ2V0IHRoZSBiLW8tbAorCQkJcSA9IG1hcmtbYzFdOworCQkJaWYgKHRleHQgPD0gcSAmJiBxIDwgZW5kKSB7CisJCQkJZG90ID0gcTsKKwkJCQlkb3RfYmVnaW4oKTsJLy8gZ28gdG8gQi1vLWwKKwkJCQlkb3Rfc2tpcF9vdmVyX3dzKCk7CisJCQl9CisJCX0gZWxzZSBpZiAoYzEgPT0gJ1wnJykgewkvLyBnb3RvIHByZXZpb3VzIGNvbnRleHQKKwkJCWRvdCA9IHN3YXBfY29udGV4dChkb3QpOwkvLyBzd2FwIGN1cnJlbnQgYW5kIHByZXZpb3VzIGNvbnRleHQKKwkJCWRvdF9iZWdpbigpOwkvLyBnbyB0byBCLW8tbAorCQkJZG90X3NraXBfb3Zlcl93cygpOworCQl9IGVsc2UgeworCQkJaW5kaWNhdGVfZXJyb3IoKTsKKwkJfQorCQlicmVhazsKKwljYXNlICdtJzoJCQkvLyBtLSBNYXJrIGEgbGluZQorCQkvLyB0aGlzIGlzIHJlYWxseSBzdHVwaWQuICBJZiB0aGVyZSBhcmUgYW55IGluc2VydHMgb3IgZGVsZXRlcworCQkvLyBiZXR3ZWVuIHRleHRbMF0gYW5kIGRvdCB0aGVuIHRoaXMgbWFyayB3aWxsIG5vdCBwb2ludCB0byB0aGUKKwkJLy8gY29ycmVjdCBsb2NhdGlvbiEgSXQgY291bGQgYmUgb2ZmIGJ5IG1hbnkgbGluZXMhCisJCS8vIFdlbGwuLi4sIGF0IGxlYXN0IGl0cyBxdWljayBhbmQgZGlydHkuCisJCWMxID0gKGdldF9vbmVfY2hhcigpIHwgMHgyMCkgLSAnYSc7CisJCWlmICgodW5zaWduZWQpYzEgPD0gMjUpIHsgLy8gYS16PworCQkJLy8gcmVtZW1iZXIgdGhlIGxpbmUKKwkJCW1hcmtbYzFdID0gZG90OworCQl9IGVsc2UgeworCQkJaW5kaWNhdGVfZXJyb3IoKTsKKwkJfQorCQlicmVhazsKKwljYXNlICdQJzoJCQkvLyBQLSBQdXQgcmVnaXN0ZXIgYmVmb3JlCisJY2FzZSAncCc6CQkJLy8gcC0gcHV0IHJlZ2lzdGVyIGFmdGVyCisJCXAgPSByZWdbWURyZWddOworCQlpZiAocCA9PSBOVUxMKSB7CisJCQlzdGF0dXNfbGluZV9ib2xkKCJOb3RoaW5nIGluIHJlZ2lzdGVyICVjIiwgd2hhdF9yZWcoKSk7CisJCQlicmVhazsKKwkJfQorCQkvLyBhcmUgd2UgcHV0dGluZyB3aG9sZSBsaW5lcyBvciBzdHJpbmdzCisJCWlmIChzdHJjaHIocCwgJ1xuJykgIT0gTlVMTCkgeworCQkJaWYgKGMgPT0gJ1AnKSB7CisJCQkJZG90X2JlZ2luKCk7CS8vIHB1dHRpbmcgbGluZXMtIFB1dCBhYm92ZQorCQkJfQorCQkJaWYgKGMgPT0gJ3AnKSB7CisJCQkJLy8gYXJlIHdlIHB1dHRpbmcgYWZ0ZXIgdmVyeSBsYXN0IGxpbmU/CisJCQkJaWYgKGVuZF9saW5lKGRvdCkgPT0gKGVuZCAtIDEpKSB7CisJCQkJCWRvdCA9IGVuZDsJLy8gZm9yY2UgZG90IHRvIGVuZCBvZiB0ZXh0W10KKwkJCQl9IGVsc2UgeworCQkJCQlkb3RfbmV4dCgpOwkvLyBuZXh0IGxpbmUsIHRoZW4gcHV0IGJlZm9yZQorCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChjID09ICdwJykKKwkJCQlkb3RfcmlnaHQoKTsJLy8gbW92ZSB0byByaWdodCwgY2FuIG1vdmUgdG8gTkwKKwkJfQorCQlzdHJpbmdfaW5zZXJ0KGRvdCwgcCwgQUxMT1dfVU5ETyk7CS8vIGluc2VydCB0aGUgc3RyaW5nCisJCWVuZF9jbWRfcSgpOwkvLyBzdG9wIGFkZGluZyB0byBxCisJCWJyZWFrOworCWNhc2UgJ1UnOgkJCS8vIFUtIFVuZG87IHJlcGxhY2UgY3VycmVudCBsaW5lIHdpdGggb3JpZ2luYWwgdmVyc2lvbgorCQlpZiAocmVnW1VyZWddICE9IE5VTEwpIHsKKwkJCXAgPSBiZWdpbl9saW5lKGRvdCk7CisJCQlxID0gZW5kX2xpbmUoZG90KTsKKwkJCXAgPSB0ZXh0X2hvbGVfZGVsZXRlKHAsIHEsIEFMTE9XX1VORE8pOwkvLyBkZWxldGUgY3VyIGxpbmUKKwkJCXAgKz0gc3RyaW5nX2luc2VydChwLCByZWdbVXJlZ10sIEFMTE9XX1VORE9fQ0hBSU4pOwkvLyBpbnNlcnQgb3JpZyBsaW5lCisJCQlkb3QgPSBwOworCQkJZG90X3NraXBfb3Zlcl93cygpOworCQl9CisJCWJyZWFrOworI2VuZGlmIC8qIEZFQVRVUkVfVklfWUFOS01BUksgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9VTkRPCisJY2FzZSAndSc6CS8vIHUtIHVuZG8gbGFzdCBvcGVyYXRpb24KKwkJdW5kb19wb3AoKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlICckJzoJCQkvLyAkLSBnb3RvIGVuZCBvZiBsaW5lCisJY2FzZSBLRVlDT0RFX0VORDoJCS8vIEN1cnNvciBLZXkgRW5kCisJCWZvciAoOzspIHsKKwkJCWRvdCA9IGVuZF9saW5lKGRvdCk7CisJCQlpZiAoLS1jbWRjbnQgPD0gMCkKKwkJCQlicmVhazsKKwkJCWRvdF9uZXh0KCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAnJSc6CQkJLy8gJS0gZmluZCBtYXRjaGluZyBjaGFyIG9mIHBhaXIgKCkgW10ge30KKwkJZm9yIChxID0gZG90OyBxIDwgZW5kICYmICpxICE9ICdcbic7IHErKykgeworCQkJaWYgKHN0cmNocigiKClbXXt9IiwgKnEpICE9IE5VTEwpIHsKKwkJCQkvLyB3ZSBmb3VuZCBoYWxmIG9mIGEgcGFpcgorCQkJCXAgPSBmaW5kX3BhaXIocSwgKnEpOworCQkJCWlmIChwID09IE5VTEwpIHsKKwkJCQkJaW5kaWNhdGVfZXJyb3IoKTsKKwkJCQl9IGVsc2UgeworCQkJCQlkb3QgPSBwOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoKnEgPT0gJ1xuJykKKwkJCWluZGljYXRlX2Vycm9yKCk7CisJCWJyZWFrOworCWNhc2UgJ2YnOgkJCS8vIGYtIGZvcndhcmQgdG8gYSB1c2VyIHNwZWNpZmllZCBjaGFyCisJCWxhc3RfZm9yd2FyZF9jaGFyID0gZ2V0X29uZV9jaGFyKCk7CS8vIGdldCB0aGUgc2VhcmNoIGNoYXIKKwkJLy8KKwkJLy8gZG9udCBzZXBhcmF0ZSB0aGVzZSB0d28gY29tbWFuZHMuICdmJyBkZXBlbmRzIG9uICc7JworCQkvLworCQkvLyoqKiogZmFsbCB0aHJvdWdoIHRvIC4uLiAnOycKKwljYXNlICc7JzoJCQkvLyA7LSBsb29rIGF0IHJlc3Qgb2YgbGluZSBmb3IgbGFzdCBmb3J3YXJkIGNoYXIKKwkJZG8geworCQkJaWYgKGxhc3RfZm9yd2FyZF9jaGFyID09IDApCisJCQkJYnJlYWs7CisJCQlxID0gZG90ICsgMTsKKwkJCXdoaWxlIChxIDwgZW5kIC0gMSAmJiAqcSAhPSAnXG4nICYmICpxICE9IGxhc3RfZm9yd2FyZF9jaGFyKSB7CisJCQkJcSsrOworCQkJfQorCQkJaWYgKCpxID09IGxhc3RfZm9yd2FyZF9jaGFyKQorCQkJCWRvdCA9IHE7CisJCX0gd2hpbGUgKC0tY21kY250ID4gMCk7CisJCWJyZWFrOworCWNhc2UgJywnOiAgICAgICAgICAgLy8gcmVwZWF0IGxhdGVzdCAnZicgaW4gb3Bwb3NpdGUgZGlyZWN0aW9uCisJCWlmIChsYXN0X2ZvcndhcmRfY2hhciA9PSAwKQorCQkJYnJlYWs7CisJCWRvIHsKKwkJCXEgPSBkb3QgLSAxOworCQkJd2hpbGUgKHEgPj0gdGV4dCAmJiAqcSAhPSAnXG4nICYmICpxICE9IGxhc3RfZm9yd2FyZF9jaGFyKSB7CisJCQkJcS0tOworCQkJfQorCQkJaWYgKHEgPj0gdGV4dCAmJiAqcSA9PSBsYXN0X2ZvcndhcmRfY2hhcikKKwkJCQlkb3QgPSBxOworCQl9IHdoaWxlICgtLWNtZGNudCA+IDApOworCQlicmVhazsKKworCWNhc2UgJy0nOgkJCS8vIC0tIGdvdG8gcHJldiBsaW5lCisJCWRvIHsKKwkJCWRvdF9wcmV2KCk7CisJCQlkb3Rfc2tpcF9vdmVyX3dzKCk7CisJCX0gd2hpbGUgKC0tY21kY250ID4gMCk7CisJCWJyZWFrOworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0RPVF9DTUQKKwljYXNlICcuJzoJCQkvLyAuLSByZXBlYXQgdGhlIGxhc3QgbW9kaWZ5aW5nIGNvbW1hbmQKKwkJLy8gU3R1ZmYgdGhlIGxhc3RfbW9kaWZ5aW5nX2NtZCBiYWNrIGludG8gc3RkaW4KKwkJLy8gYW5kIGxldCBpdCBiZSByZS1leGVjdXRlZC4KKwkJaWYgKGxtY19sZW4gPiAwKSB7CisJCQlsYXN0X21vZGlmeWluZ19jbWRbbG1jX2xlbl0gPSAwOworCQkJaW9xID0gaW9xX3N0YXJ0ID0geHN0cmR1cChsYXN0X21vZGlmeWluZ19jbWQpOworCQl9CisJCWJyZWFrOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfU0VBUkNICisJY2FzZSAnPyc6CQkJLy8gLy0gc2VhcmNoIGZvciBhIHBhdHRlcm4KKwljYXNlICcvJzoJCQkvLyAvLSBzZWFyY2ggZm9yIGEgcGF0dGVybgorCQlidWZbMF0gPSBjOworCQlidWZbMV0gPSAnXDAnOworCQlxID0gZ2V0X2lucHV0X2xpbmUoYnVmKTsJLy8gZ2V0IGlucHV0IGxpbmUtIHVzZSAic3RhdHVzIGxpbmUiCisJCWlmIChxWzBdICYmICFxWzFdKSB7CisJCQlpZiAobGFzdF9zZWFyY2hfcGF0dGVyblswXSkKKwkJCQlsYXN0X3NlYXJjaF9wYXR0ZXJuWzBdID0gYzsKKwkJCWdvdG8gZGMzOyAvLyBpZiBubyBwYXQgcmUtdXNlIG9sZCBwYXQKKwkJfQorCQlpZiAocVswXSkgeyAgICAgICAvLyBzdHJsZW4ocSkgPiAxOiBuZXcgcGF0LSBzYXZlIGl0IGFuZCBmaW5kCisJCQkvLyB0aGVyZSBpcyBhIG5ldyBwYXQKKwkJCWZyZWUobGFzdF9zZWFyY2hfcGF0dGVybik7CisJCQlsYXN0X3NlYXJjaF9wYXR0ZXJuID0geHN0cmR1cChxKTsKKwkJCWdvdG8gZGMzOwkvLyBub3cgZmluZCB0aGUgcGF0dGVybgorCQl9CisJCS8vIHVzZXIgY2hhbmdlZCBtaW5kIGFuZCBlcmFzZWQgdGhlICIvIi0gIGRvIG5vdGhpbmcKKwkJYnJlYWs7CisJY2FzZSAnTic6CQkJLy8gTi0gYmFja3dhcmQgc2VhcmNoIGZvciBsYXN0IHBhdHRlcm4KKwkJZGlyID0gQkFDSzsJCS8vIGFzc3VtZSBCQUNLV0FSRCBzZWFyY2gKKwkJcCA9IGRvdCAtIDE7CisJCWlmIChsYXN0X3NlYXJjaF9wYXR0ZXJuWzBdID09ICc/JykgeworCQkJZGlyID0gRk9SV0FSRDsKKwkJCXAgPSBkb3QgKyAxOworCQl9CisJCWdvdG8gZGM0OwkJLy8gbm93IHNlYXJjaCBmb3IgcGF0dGVybgorCQlicmVhazsKKwljYXNlICduJzoJCQkvLyBuLSByZXBlYXQgc2VhcmNoIGZvciBsYXN0IHBhdHRlcm4KKwkJLy8gc2VhcmNoIHJlc3Qgb2YgdGV4dFtdIHN0YXJ0aW5nIGF0IG5leHQgY2hhcgorCQkvLyBpZiBzZWFyY2ggZmFpbHMgcmV0dXJuIG9yaWduYWwgInAiIG5vdCB0aGUgInArMSIgYWRkcmVzcworCQlkbyB7CisJCQljb25zdCBjaGFyICptc2c7CisgZGMzOgorCQkJZGlyID0gRk9SV0FSRDsJLy8gYXNzdW1lIEZPUldBUkQgc2VhcmNoCisJCQlwID0gZG90ICsgMTsKKwkJCWlmIChsYXN0X3NlYXJjaF9wYXR0ZXJuWzBdID09ICc/JykgeworCQkJCWRpciA9IEJBQ0s7CisJCQkJcCA9IGRvdCAtIDE7CisJCQl9CisgZGM0OgorCQkJcSA9IGNoYXJfc2VhcmNoKHAsIGxhc3Rfc2VhcmNoX3BhdHRlcm4gKyAxLCBkaXIsIEZVTEwpOworCQkJaWYgKHEgIT0gTlVMTCkgeworCQkJCWRvdCA9IHE7CS8vIGdvb2Qgc2VhcmNoLCB1cGRhdGUgImRvdCIKKwkJCQltc2cgPSBOVUxMOworCQkJCWdvdG8gZGMyOworCQkJfQorCQkJLy8gbm8gcGF0dGVybiBmb3VuZCBiZXR3ZWVuICJkb3QiIGFuZCAiZW5kIi0gY29udGludWUgYXQgdG9wCisJCQlwID0gdGV4dDsKKwkJCWlmIChkaXIgPT0gQkFDSykgeworCQkJCXAgPSBlbmQgLSAxOworCQkJfQorCQkJcSA9IGNoYXJfc2VhcmNoKHAsIGxhc3Rfc2VhcmNoX3BhdHRlcm4gKyAxLCBkaXIsIEZVTEwpOworCQkJaWYgKHEgIT0gTlVMTCkgewkvLyBmb3VuZCBzb21ldGhpbmcKKwkJCQlkb3QgPSBxOwkvLyBmb3VuZCBuZXcgcGF0dGVybi0gZ290byBpdAorCQkJCW1zZyA9ICJzZWFyY2ggaGl0IEJPVFRPTSwgY29udGludWluZyBhdCBUT1AiOworCQkJCWlmIChkaXIgPT0gQkFDSykgeworCQkJCQltc2cgPSAic2VhcmNoIGhpdCBUT1AsIGNvbnRpbnVpbmcgYXQgQk9UVE9NIjsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCW1zZyA9ICJQYXR0ZXJuIG5vdCBmb3VuZCI7CisJCQl9CisgZGMyOgorCQkJaWYgKG1zZykKKwkJCQlzdGF0dXNfbGluZV9ib2xkKCIlcyIsIG1zZyk7CisJCX0gd2hpbGUgKC0tY21kY250ID4gMCk7CisJCWJyZWFrOworCWNhc2UgJ3snOgkJCS8vIHstIG1vdmUgYmFja3dhcmQgcGFyYWdyYXBoCisJCXEgPSBjaGFyX3NlYXJjaChkb3QsICJcblxuIiwgQkFDSywgRlVMTCk7CisJCWlmIChxICE9IE5VTEwpIHsJLy8gZm91bmQgYmxhbmsgbGluZQorCQkJZG90ID0gbmV4dF9saW5lKHEpOwkvLyBtb3ZlIHRvIG5leHQgYmxhbmsgbGluZQorCQl9CisJCWJyZWFrOworCWNhc2UgJ30nOgkJCS8vIH0tIG1vdmUgZm9yd2FyZCBwYXJhZ3JhcGgKKwkJcSA9IGNoYXJfc2VhcmNoKGRvdCwgIlxuXG4iLCBGT1JXQVJELCBGVUxMKTsKKwkJaWYgKHEgIT0gTlVMTCkgewkvLyBmb3VuZCBibGFuayBsaW5lCisJCQlkb3QgPSBuZXh0X2xpbmUocSk7CS8vIG1vdmUgdG8gbmV4dCBibGFuayBsaW5lCisJCX0KKwkJYnJlYWs7CisjZW5kaWYgLyogRkVBVFVSRV9WSV9TRUFSQ0ggKi8KKwljYXNlICcwJzoJCQkvLyAwLSBnb3RvIGJlZ2lubmluZyBvZiBsaW5lCisJY2FzZSAnMSc6CQkJLy8gMS0KKwljYXNlICcyJzoJCQkvLyAyLQorCWNhc2UgJzMnOgkJCS8vIDMtCisJY2FzZSAnNCc6CQkJLy8gNC0KKwljYXNlICc1JzoJCQkvLyA1LQorCWNhc2UgJzYnOgkJCS8vIDYtCisJY2FzZSAnNyc6CQkJLy8gNy0KKwljYXNlICc4JzoJCQkvLyA4LQorCWNhc2UgJzknOgkJCS8vIDktCisJCWlmIChjID09ICcwJyAmJiBjbWRjbnQgPCAxKSB7CisJCQlkb3RfYmVnaW4oKTsJLy8gdGhpcyB3YXMgYSBzdGFuZGFsb25lIHplcm8KKwkJfSBlbHNlIHsKKwkJCWNtZGNudCA9IGNtZGNudCAqIDEwICsgKGMgLSAnMCcpOwkvLyB0aGlzIDAgaXMgcGFydCBvZiBhIG51bWJlcgorCQl9CisJCWJyZWFrOworCWNhc2UgJzonOgkJCS8vIDotIHRoZSBjb2xvbiBtb2RlIGNvbW1hbmRzCisJCXAgPSBnZXRfaW5wdXRfbGluZSgiOiIpOwkvLyBnZXQgaW5wdXQgbGluZS0gdXNlICJzdGF0dXMgbGluZSIKKwkJY29sb24ocCk7CQkvLyBleGVjdXRlIHRoZSBjb21tYW5kCisJCWJyZWFrOworCWNhc2UgJzwnOgkJCS8vIDwtIExlZnQgIHNoaWZ0IHNvbWV0aGluZworCWNhc2UgJz4nOgkJCS8vID4tIFJpZ2h0IHNoaWZ0IHNvbWV0aGluZworCQljbnQgPSBjb3VudF9saW5lcyh0ZXh0LCBkb3QpOwkvLyByZW1lbWJlciB3aGF0IGxpbmUgd2UgYXJlIG9uCisJCWMxID0gZ2V0X29uZV9jaGFyKCk7CS8vIGdldCB0aGUgdHlwZSBvZiB0aGluZyB0byBkZWxldGUKKwkJZmluZF9yYW5nZSgmcCwgJnEsIGMxKTsKKwkJeWFua19kZWxldGUocCwgcSwgMSwgWUFOS09OTFksIE5PX1VORE8pOwkvLyBzYXZlIGNvcHkgYmVmb3JlIGNoYW5nZQorCQlwID0gYmVnaW5fbGluZShwKTsKKwkJcSA9IGVuZF9saW5lKHEpOworCQlpID0gY291bnRfbGluZXMocCwgcSk7CS8vICMgb2YgbGluZXMgd2UgYXJlIHNoaWZ0aW5nCisJCWZvciAoIDsgaSA+IDA7IGktLSwgcCA9IG5leHRfbGluZShwKSkgeworCQkJaWYgKGMgPT0gJzwnKSB7CisJCQkJLy8gc2hpZnQgbGVmdC0gcmVtb3ZlIHRhYiBvciA4IHNwYWNlcworCQkJCWlmICgqcCA9PSAnXHQnKSB7CisJCQkJCS8vIHNocmluayBidWZmZXIgMSBjaGFyCisJCQkJCXRleHRfaG9sZV9kZWxldGUocCwgcCwgTk9fVU5ETyk7CisJCQkJfSBlbHNlIGlmICgqcCA9PSAnICcpIHsKKwkJCQkJLy8gd2Ugc2hvdWxkIGJlIGNhbGN1bGF0aW5nIGNvbHVtbnMsIG5vdCBqdXN0IFNQQUNFCisJCQkJCWZvciAoaiA9IDA7ICpwID09ICcgJyAmJiBqIDwgdGFic3RvcDsgaisrKSB7CisJCQkJCQl0ZXh0X2hvbGVfZGVsZXRlKHAsIHAsIE5PX1VORE8pOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlIGlmIChjID09ICc+JykgeworCQkJCS8vIHNoaWZ0IHJpZ2h0IC0tIGFkZCB0YWIgb3IgOCBzcGFjZXMKKwkJCQljaGFyX2luc2VydChwLCAnXHQnLCBBTExPV19VTkRPKTsKKwkJCX0KKwkJfQorCQlkb3QgPSBmaW5kX2xpbmUoY250KTsJLy8gd2hhdCBsaW5lIHdlcmUgd2Ugb24KKwkJZG90X3NraXBfb3Zlcl93cygpOworCQllbmRfY21kX3EoKTsJLy8gc3RvcCBhZGRpbmcgdG8gcQorCQlicmVhazsKKwljYXNlICdBJzoJCQkvLyBBLSBhcHBlbmQgYXQgZS1vLWwKKwkJZG90X2VuZCgpOwkJLy8gZ28gdG8gZS1vLWwKKwkJLy8qKioqIGZhbGwgdGhyb3VnaCB0byAuLi4gJ2EnCisJY2FzZSAnYSc6CQkJLy8gYS0gYXBwZW5kIGFmdGVyIGN1cnJlbnQgY2hhcgorCQlpZiAoKmRvdCAhPSAnXG4nKQorCQkJZG90Kys7CisJCWdvdG8gZGNfaTsKKwkJYnJlYWs7CisJY2FzZSAnQic6CQkJLy8gQi0gYmFjayBhIGJsYW5rLWRlbGltaXRlZCBXb3JkCisJY2FzZSAnRSc6CQkJLy8gRS0gZW5kIG9mIGEgYmxhbmstZGVsaW1pdGVkIHdvcmQKKwljYXNlICdXJzoJCQkvLyBXLSBmb3J3YXJkIGEgYmxhbmstZGVsaW1pdGVkIHdvcmQKKwkJZGlyID0gRk9SV0FSRDsKKwkJaWYgKGMgPT0gJ0InKQorCQkJZGlyID0gQkFDSzsKKwkJZG8geworCQkJaWYgKGMgPT0gJ1cnIHx8IGlzc3BhY2UoZG90W2Rpcl0pKSB7CisJCQkJZG90ID0gc2tpcF90aGluZyhkb3QsIDEsIGRpciwgU19UT19XUyk7CisJCQkJZG90ID0gc2tpcF90aGluZyhkb3QsIDIsIGRpciwgU19PVkVSX1dTKTsKKwkJCX0KKwkJCWlmIChjICE9ICdXJykKKwkJCQlkb3QgPSBza2lwX3RoaW5nKGRvdCwgMSwgZGlyLCBTX0JFRk9SRV9XUyk7CisJCX0gd2hpbGUgKC0tY21kY250ID4gMCk7CisJCWJyZWFrOworCWNhc2UgJ0MnOgkJCS8vIEMtIENoYW5nZSB0byBlLW8tbAorCWNhc2UgJ0QnOgkJCS8vIEQtIGRlbGV0ZSB0byBlLW8tbAorCQlzYXZlX2RvdCA9IGRvdDsKKwkJZG90ID0gZG9sbGFyX2xpbmUoZG90KTsJLy8gbW92ZSB0byBiZWZvcmUgTkwKKwkJLy8gY29weSB0ZXh0IGludG8gYSByZWdpc3RlciBhbmQgZGVsZXRlCisJCWRvdCA9IHlhbmtfZGVsZXRlKHNhdmVfZG90LCBkb3QsIDAsIFlBTktERUwsIEFMTE9XX1VORE8pOwkvLyBkZWxldGUgdG8gZS1vLWwKKwkJaWYgKGMgPT0gJ0MnKQorCQkJZ290byBkY19pOwkvLyBzdGFydCBpbnNlcnRpbmcKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ET1RfQ01ECisJCWlmIChjID09ICdEJykKKwkJCWVuZF9jbWRfcSgpOwkvLyBzdG9wIGFkZGluZyB0byBxCisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSAnZyc6IC8vICdnZycgZ290byBhIGxpbmUgbnVtYmVyICh2aW0pIChkZWZhdWx0OiB2ZXJ5IGZpcnN0IGxpbmUpCisJCWMxID0gZ2V0X29uZV9jaGFyKCk7CisJCWlmIChjMSAhPSAnZycpIHsKKwkJCWJ1ZlswXSA9ICdnJzsKKwkJCWJ1ZlsxXSA9IGMxOyAvLyBUT0RPOiBpZiBVbmljb2RlPworCQkJYnVmWzJdID0gJ1wwJzsKKwkJCW5vdF9pbXBsZW1lbnRlZChidWYpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNtZGNudCA9PSAwKQorCQkJY21kY250ID0gMTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisJY2FzZSAnRyc6CQkvLyBHLSBnb3RvIHRvIGEgbGluZSBudW1iZXIgKGRlZmF1bHQ9IEUtTy1GKQorCQlkb3QgPSBlbmQgLSAxOwkJCQkvLyBhc3N1bWUgRS1PLUYKKwkJaWYgKGNtZGNudCA+IDApIHsKKwkJCWRvdCA9IGZpbmRfbGluZShjbWRjbnQpOwkvLyB3aGF0IGxpbmUgaXMgI2NtZGNudAorCQl9CisJCWRvdF9za2lwX292ZXJfd3MoKTsKKwkJYnJlYWs7CisJY2FzZSAnSCc6CQkJLy8gSC0gZ290byB0b3AgbGluZSBvbiBzY3JlZW4KKwkJZG90ID0gc2NyZWVuYmVnaW47CisJCWlmIChjbWRjbnQgPiAocm93cyAtIDEpKSB7CisJCQljbWRjbnQgPSAocm93cyAtIDEpOworCQl9CisJCWlmICgtLWNtZGNudCA+IDApIHsKKwkJCWRvX2NtZCgnKycpOworCQl9CisJCWRvdF9za2lwX292ZXJfd3MoKTsKKwkJYnJlYWs7CisJY2FzZSAnSSc6CQkJLy8gSS0gaW5zZXJ0IGJlZm9yZSBmaXJzdCBub24tYmxhbmsKKwkJZG90X2JlZ2luKCk7CS8vIDAKKwkJZG90X3NraXBfb3Zlcl93cygpOworCQkvLyoqKiogZmFsbCB0aHJvdWdoIHRvIC4uLiAnaScKKwljYXNlICdpJzoJCQkvLyBpLSBpbnNlcnQgYmVmb3JlIGN1cnJlbnQgY2hhcgorCWNhc2UgS0VZQ09ERV9JTlNFUlQ6CS8vIEN1cnNvciBLZXkgSW5zZXJ0CisgZGNfaToKKwkJY21kX21vZGUgPSAxOwkvLyBzdGFydCBpbnNlcnRpbmcKKwkJdW5kb19xdWV1ZV9jb21taXQoKTsJLy8gY29tbWl0IHF1ZXVlIHdoZW4gY21kX21vZGUgY2hhbmdlcworCQlicmVhazsKKwljYXNlICdKJzoJCQkvLyBKLSBqb2luIGN1cnJlbnQgYW5kIG5leHQgbGluZXMgdG9nZXRoZXIKKwkJZG8geworCQkJZG90X2VuZCgpOwkJLy8gbW92ZSB0byBOTAorCQkJaWYgKGRvdCA8IGVuZCAtIDEpIHsJLy8gbWFrZSBzdXJlIG5vdCBsYXN0IGNoYXIgaW4gdGV4dFtdCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfVU5ETworCQkJCXVuZG9fcHVzaChkb3QsIDEsIFVORE9fREVMKTsKKwkJCQkqZG90KysgPSAnICc7CS8vIHJlcGxhY2UgTkwgd2l0aCBzcGFjZQorCQkJCXVuZG9fcHVzaCgoZG90IC0gMSksIDEsIFVORE9fSU5TX0NIQUlOKTsKKyNlbHNlCisJCQkJKmRvdCsrID0gJyAnOworCQkJCW1vZGlmaWVkX2NvdW50Kys7CisjZW5kaWYKKwkJCQl3aGlsZSAoaXNibGFuaygqZG90KSkgewkvLyBkZWxldGUgbGVhZGluZyBXUworCQkJCQl0ZXh0X2hvbGVfZGVsZXRlKGRvdCwgZG90LCBBTExPV19VTkRPX0NIQUlOKTsKKwkJCQl9CisJCQl9CisJCX0gd2hpbGUgKC0tY21kY250ID4gMCk7CisJCWVuZF9jbWRfcSgpOwkvLyBzdG9wIGFkZGluZyB0byBxCisJCWJyZWFrOworCWNhc2UgJ0wnOgkJCS8vIEwtIGdvdG8gYm90dG9tIGxpbmUgb24gc2NyZWVuCisJCWRvdCA9IGVuZF9zY3JlZW4oKTsKKwkJaWYgKGNtZGNudCA+IChyb3dzIC0gMSkpIHsKKwkJCWNtZGNudCA9IChyb3dzIC0gMSk7CisJCX0KKwkJaWYgKC0tY21kY250ID4gMCkgeworCQkJZG9fY21kKCctJyk7CisJCX0KKwkJZG90X2JlZ2luKCk7CisJCWRvdF9za2lwX292ZXJfd3MoKTsKKwkJYnJlYWs7CisJY2FzZSAnTSc6CQkJLy8gTS0gZ290byBtaWRkbGUgbGluZSBvbiBzY3JlZW4KKwkJZG90ID0gc2NyZWVuYmVnaW47CisJCWZvciAoY250ID0gMDsgY250IDwgKHJvd3MtMSkgLyAyOyBjbnQrKykKKwkJCWRvdCA9IG5leHRfbGluZShkb3QpOworCQlicmVhazsKKwljYXNlICdPJzoJCQkvLyBPLSBvcGVuIGEgZW1wdHkgbGluZSBhYm92ZQorCQkvLyAgICAwaVxuIEVTQyAtaQorCQlwID0gYmVnaW5fbGluZShkb3QpOworCQlpZiAocFstMV0gPT0gJ1xuJykgeworCQkJZG90X3ByZXYoKTsKKwljYXNlICdvJzoJCQkvLyBvLSBvcGVuIGEgZW1wdHkgbGluZSBiZWxvdzsgWWVzLCBJIGtub3cgaXQgaXMgaW4gdGhlIG1pZGRsZSBvZiB0aGUgImlmICguLi4iCisJCQlkb3RfZW5kKCk7CisJCQlkb3QgPSBjaGFyX2luc2VydChkb3QsICdcbicsIEFMTE9XX1VORE8pOworCQl9IGVsc2UgeworCQkJZG90X2JlZ2luKCk7CS8vIDAKKwkJCWRvdCA9IGNoYXJfaW5zZXJ0KGRvdCwgJ1xuJywgQUxMT1dfVU5ETyk7CS8vIGlcbiBFU0MKKwkJCWRvdF9wcmV2KCk7CS8vIC0KKwkJfQorCQlnb3RvIGRjX2k7CisJCWJyZWFrOworCWNhc2UgJ1InOgkJCS8vIFItIGNvbnRpbnVvdXMgUmVwbGFjZSBjaGFyCisgZGM1OgorCQljbWRfbW9kZSA9IDI7CisJCXVuZG9fcXVldWVfY29tbWl0KCk7CisJCWJyZWFrOworCWNhc2UgS0VZQ09ERV9ERUxFVEU6CisJCWlmIChkb3QgPCBlbmQgLSAxKQorCQkJZG90ID0geWFua19kZWxldGUoZG90LCBkb3QsIDEsIFlBTktERUwsIEFMTE9XX1VORE8pOworCQlicmVhazsKKwljYXNlICdYJzoJCQkvLyBYLSBkZWxldGUgY2hhciBiZWZvcmUgZG90CisJY2FzZSAneCc6CQkJLy8geC0gZGVsZXRlIHRoZSBjdXJyZW50IGNoYXIKKwljYXNlICdzJzoJCQkvLyBzLSBzdWJzdGl0dXRlIHRoZSBjdXJyZW50IGNoYXIKKwkJZGlyID0gMDsKKwkJaWYgKGMgPT0gJ1gnKQorCQkJZGlyID0gLTE7CisJCWRvIHsKKwkJCWlmIChkb3RbZGlyXSAhPSAnXG4nKSB7CisJCQkJaWYgKGMgPT0gJ1gnKQorCQkJCQlkb3QtLTsJLy8gZGVsZXRlIHByZXYgY2hhcgorCQkJCWRvdCA9IHlhbmtfZGVsZXRlKGRvdCwgZG90LCAwLCBZQU5LREVMLCBBTExPV19VTkRPKTsJLy8gZGVsZXRlIGNoYXIKKwkJCX0KKwkJfSB3aGlsZSAoLS1jbWRjbnQgPiAwKTsKKwkJZW5kX2NtZF9xKCk7CS8vIHN0b3AgYWRkaW5nIHRvIHEKKwkJaWYgKGMgPT0gJ3MnKQorCQkJZ290byBkY19pOwkvLyBzdGFydCBpbnNlcnRpbmcKKwkJYnJlYWs7CisJY2FzZSAnWic6CQkJLy8gWi0gaWYgbW9kaWZpZWQsIHt3cml0ZX07IGV4aXQKKwkJLy8gWlogbWVhbnMgdG8gc2F2ZSBmaWxlIChpZiBuZWNlc3NhcnkpLCB0aGVuIGV4aXQKKwkJYzEgPSBnZXRfb25lX2NoYXIoKTsKKwkJaWYgKGMxICE9ICdaJykgeworCQkJaW5kaWNhdGVfZXJyb3IoKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChtb2RpZmllZF9jb3VudCkgeworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX1ZJX1JFQURPTkxZICYmIHJlYWRvbmx5X21vZGUpIHsKKwkJCQlzdGF0dXNfbGluZV9ib2xkKCInJXMnIGlzIHJlYWQgb25seSIsIGN1cnJlbnRfZmlsZW5hbWUpOworCQkJCWJyZWFrOworCQkJfQorCQkJY250ID0gZmlsZV93cml0ZShjdXJyZW50X2ZpbGVuYW1lLCB0ZXh0LCBlbmQgLSAxKTsKKwkJCWlmIChjbnQgPCAwKSB7CisJCQkJaWYgKGNudCA9PSAtMSkKKwkJCQkJc3RhdHVzX2xpbmVfYm9sZCgiV3JpdGUgZXJyb3I6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0gZWxzZSBpZiAoY250ID09IChlbmQgLSAxIC0gdGV4dCArIDEpKSB7CisJCQkJZWRpdGluZyA9IDA7CisJCQl9CisJCX0gZWxzZSB7CisJCQllZGl0aW5nID0gMDsKKwkJfQorCQlicmVhazsKKwljYXNlICdeJzoJCQkvLyBeLSBtb3ZlIHRvIGZpcnN0IG5vbi1ibGFuayBvbiBsaW5lCisJCWRvdF9iZWdpbigpOworCQlkb3Rfc2tpcF9vdmVyX3dzKCk7CisJCWJyZWFrOworCWNhc2UgJ2InOgkJCS8vIGItIGJhY2sgYSB3b3JkCisJY2FzZSAnZSc6CQkJLy8gZS0gZW5kIG9mIHdvcmQKKwkJZGlyID0gRk9SV0FSRDsKKwkJaWYgKGMgPT0gJ2InKQorCQkJZGlyID0gQkFDSzsKKwkJZG8geworCQkJaWYgKChkb3QgKyBkaXIpIDwgdGV4dCB8fCAoZG90ICsgZGlyKSA+IGVuZCAtIDEpCisJCQkJYnJlYWs7CisJCQlkb3QgKz0gZGlyOworCQkJaWYgKGlzc3BhY2UoKmRvdCkpIHsKKwkJCQlkb3QgPSBza2lwX3RoaW5nKGRvdCwgKGMgPT0gJ2UnKSA/IDIgOiAxLCBkaXIsIFNfT1ZFUl9XUyk7CisJCQl9CisJCQlpZiAoaXNhbG51bSgqZG90KSB8fCAqZG90ID09ICdfJykgeworCQkJCWRvdCA9IHNraXBfdGhpbmcoZG90LCAxLCBkaXIsIFNfRU5EX0FMTlVNKTsKKwkJCX0gZWxzZSBpZiAoaXNwdW5jdCgqZG90KSkgeworCQkJCWRvdCA9IHNraXBfdGhpbmcoZG90LCAxLCBkaXIsIFNfRU5EX1BVTkNUKTsKKwkJCX0KKwkJfSB3aGlsZSAoLS1jbWRjbnQgPiAwKTsKKwkJYnJlYWs7CisJY2FzZSAnYyc6CQkJLy8gYy0gY2hhbmdlIHNvbWV0aGluZworCWNhc2UgJ2QnOgkJCS8vIGQtIGRlbGV0ZSBzb21ldGhpbmcKKyNpZiBFTkFCTEVfRkVBVFVSRV9WSV9ZQU5LTUFSSworCWNhc2UgJ3knOgkJCS8vIHktIHlhbmsgICBzb21ldGhpbmcKKwljYXNlICdZJzoJCQkvLyBZLSBZYW5rIGEgbGluZQorI2VuZGlmCisJeworCQlpbnQgeWYsIG1sLCB3aG9sZSA9IDA7CisJCXlmID0gWUFOS0RFTDsJLy8gYXNzdW1lIGVpdGhlciAiYyIgb3IgImQiCisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKKwkJaWYgKGMgPT0gJ3knIHx8IGMgPT0gJ1knKQorCQkJeWYgPSBZQU5LT05MWTsKKyNlbmRpZgorCQljMSA9ICd5JzsKKwkJaWYgKGMgIT0gJ1knKQorCQkJYzEgPSBnZXRfb25lX2NoYXIoKTsJLy8gZ2V0IHRoZSB0eXBlIG9mIHRoaW5nIHRvIGRlbGV0ZQorCQkvLyBkZXRlcm1pbmUgcmFuZ2UsIGFuZCB3aGV0aGVyIGl0IHNwYW5zIGxpbmVzCisJCW1sID0gZmluZF9yYW5nZSgmcCwgJnEsIGMxKTsKKwkJcGxhY2VfY3Vyc29yKDAsIDApOworCQlpZiAoYzEgPT0gMjcpIHsJLy8gRVNDLSB1c2VyIGNoYW5nZWQgbWluZCBhbmQgd2FudHMgb3V0CisJCQljID0gYzEgPSAyNzsJLy8gRXNjYXBlLSBkbyBub3RoaW5nCisJCX0gZWxzZSBpZiAoc3RyY2hyKCJ3VyIsIGMxKSkgeworCQkJaWYgKGMgPT0gJ2MnKSB7CisJCQkJLy8gZG9uJ3QgaW5jbHVkZSB0cmFpbGluZyBXUyBhcyBwYXJ0IG9mIHdvcmQKKwkJCQl3aGlsZSAoaXNibGFuaygqcSkpIHsKKwkJCQkJaWYgKHEgPD0gdGV4dCB8fCBxWy0xXSA9PSAnXG4nKQorCQkJCQkJYnJlYWs7CisJCQkJCXEtLTsKKwkJCQl9CisJCQl9CisJCQlkb3QgPSB5YW5rX2RlbGV0ZShwLCBxLCBtbCwgeWYsIEFMTE9XX1VORE8pOwkvLyBkZWxldGUgd29yZAorCQl9IGVsc2UgaWYgKHN0cmNocigiXjBiQmVFZnQlJCBsaFxiXDE3NyIsIGMxKSkgeworCQkJLy8gcGFydGlhbCBsaW5lIGNvcHkgdGV4dCBpbnRvIGEgcmVnaXN0ZXIgYW5kIGRlbGV0ZQorCQkJZG90ID0geWFua19kZWxldGUocCwgcSwgbWwsIHlmLCBBTExPV19VTkRPKTsJLy8gZGVsZXRlIHdvcmQKKwkJfSBlbHNlIGlmIChzdHJjaHIoImNkeWtqSEwrLXt9XHJcbiIsIGMxKSkgeworCQkJLy8gd2hvbGUgbGluZSBjb3B5IHRleHQgaW50byBhIHJlZ2lzdGVyIGFuZCBkZWxldGUKKwkJCWRvdCA9IHlhbmtfZGVsZXRlKHAsIHEsIG1sLCB5ZiwgQUxMT1dfVU5ETyk7CS8vIGRlbGV0ZSBsaW5lcworCQkJd2hvbGUgPSAxOworCQl9IGVsc2UgeworCQkJLy8gY291bGQgbm90IHJlY29nbml6ZSBvYmplY3QKKwkJCWMgPSBjMSA9IDI3OwkvLyBlcnJvci0KKwkJCW1sID0gMDsKKwkJCWluZGljYXRlX2Vycm9yKCk7CisJCX0KKwkJaWYgKG1sICYmIHdob2xlKSB7CisJCQlpZiAoYyA9PSAnYycpIHsKKwkJCQlkb3QgPSBjaGFyX2luc2VydChkb3QsICdcbicsIEFMTE9XX1VORE9fQ0hBSU4pOworCQkJCS8vIG9uIHRoZSBsYXN0IGxpbmUgb2YgZmlsZSBkb24ndCBtb3ZlIHRvIHByZXYgbGluZQorCQkJCWlmICh3aG9sZSAmJiBkb3QgIT0gKGVuZC0xKSkgeworCQkJCQlkb3RfcHJldigpOworCQkJCX0KKwkJCX0gZWxzZSBpZiAoYyA9PSAnZCcpIHsKKwkJCQlkb3RfYmVnaW4oKTsKKwkJCQlkb3Rfc2tpcF9vdmVyX3dzKCk7CisJCQl9CisJCX0KKwkJaWYgKGMxICE9IDI3KSB7CisJCQkvLyBpZiBDSEFOR0lORywgbm90IGRlbGV0aW5nLCBzdGFydCBpbnNlcnRpbmcgYWZ0ZXIgdGhlIGRlbGV0ZQorCQkJaWYgKGMgPT0gJ2MnKSB7CisJCQkJc3RyY3B5KGJ1ZiwgIkNoYW5nZSIpOworCQkJCWdvdG8gZGNfaTsJLy8gc3RhcnQgaW5zZXJ0aW5nCisJCQl9CisJCQlpZiAoYyA9PSAnZCcpIHsKKwkJCQlzdHJjcHkoYnVmLCAiRGVsZXRlIik7CisJCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfWUFOS01BUksKKwkJCWlmIChjID09ICd5JyB8fCBjID09ICdZJykgeworCQkJCXN0cmNweShidWYsICJZYW5rIik7CisJCQl9CisJCQlwID0gcmVnW1lEcmVnXTsKKwkJCXEgPSBwICsgc3RybGVuKHApOworCQkJZm9yIChjbnQgPSAwOyBwIDw9IHE7IHArKykgeworCQkJCWlmICgqcCA9PSAnXG4nKQorCQkJCQljbnQrKzsKKwkJCX0KKwkJCXN0YXR1c19saW5lKCIlcyAlZCBsaW5lcyAoJWQgY2hhcnMpIHVzaW5nIFslY10iLAorCQkJCWJ1ZiwgY250LCBzdHJsZW4ocmVnW1lEcmVnXSksIHdoYXRfcmVnKCkpOworI2VuZGlmCisJCQllbmRfY21kX3EoKTsJLy8gc3RvcCBhZGRpbmcgdG8gcQorCQl9CisJCWJyZWFrOworCX0KKwljYXNlICdrJzoJCQkvLyBrLSBnb3RvIHByZXYgbGluZSwgc2FtZSBjb2wKKwljYXNlIEtFWUNPREVfVVA6CQkvLyBjdXJzb3Iga2V5IFVwCisJCWRvIHsKKwkJCWRvdF9wcmV2KCk7CisJCQlkb3QgPSBtb3ZlX3RvX2NvbChkb3QsIGNjb2wgKyBvZmZzZXQpOwkvLyB0cnkgc3RheSBpbiBzYW1lIGNvbAorCQl9IHdoaWxlICgtLWNtZGNudCA+IDApOworCQlicmVhazsKKwljYXNlICdyJzoJCQkvLyByLSByZXBsYWNlIHRoZSBjdXJyZW50IGNoYXIgd2l0aCB1c2VyIGlucHV0CisJCWMxID0gZ2V0X29uZV9jaGFyKCk7CS8vIGdldCB0aGUgcmVwbGFjZW1lbnQgY2hhcgorCQlpZiAoKmRvdCAhPSAnXG4nKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfVU5ETworCQkJdW5kb19wdXNoKGRvdCwgMSwgVU5ET19ERUwpOworCQkJKmRvdCA9IGMxOworCQkJdW5kb19wdXNoKGRvdCwgMSwgVU5ET19JTlNfQ0hBSU4pOworI2Vsc2UKKwkJCSpkb3QgPSBjMTsKKwkJCW1vZGlmaWVkX2NvdW50Kys7CisjZW5kaWYKKwkJfQorCQllbmRfY21kX3EoKTsJLy8gc3RvcCBhZGRpbmcgdG8gcQorCQlicmVhazsKKwljYXNlICd0JzoJCQkvLyB0LSBtb3ZlIHRvIGNoYXIgcHJpb3IgdG8gbmV4dCB4CisJCWxhc3RfZm9yd2FyZF9jaGFyID0gZ2V0X29uZV9jaGFyKCk7CisJCWRvX2NtZCgnOycpOworCQlpZiAoKmRvdCA9PSBsYXN0X2ZvcndhcmRfY2hhcikKKwkJCWRvdF9sZWZ0KCk7CisJCWxhc3RfZm9yd2FyZF9jaGFyID0gMDsKKwkJYnJlYWs7CisJY2FzZSAndyc6CQkJLy8gdy0gZm9yd2FyZCBhIHdvcmQKKwkJZG8geworCQkJaWYgKGlzYWxudW0oKmRvdCkgfHwgKmRvdCA9PSAnXycpIHsJLy8gd2UgYXJlIG9uIEFMTlVNCisJCQkJZG90ID0gc2tpcF90aGluZyhkb3QsIDEsIEZPUldBUkQsIFNfRU5EX0FMTlVNKTsKKwkJCX0gZWxzZSBpZiAoaXNwdW5jdCgqZG90KSkgewkvLyB3ZSBhcmUgb24gUFVOQ1QKKwkJCQlkb3QgPSBza2lwX3RoaW5nKGRvdCwgMSwgRk9SV0FSRCwgU19FTkRfUFVOQ1QpOworCQkJfQorCQkJaWYgKGRvdCA8IGVuZCAtIDEpCisJCQkJZG90Kys7CQkvLyBtb3ZlIG92ZXIgd29yZAorCQkJaWYgKGlzc3BhY2UoKmRvdCkpIHsKKwkJCQlkb3QgPSBza2lwX3RoaW5nKGRvdCwgMiwgRk9SV0FSRCwgU19PVkVSX1dTKTsKKwkJCX0KKwkJfSB3aGlsZSAoLS1jbWRjbnQgPiAwKTsKKwkJYnJlYWs7CisJY2FzZSAneic6CQkJLy8gei0KKwkJYzEgPSBnZXRfb25lX2NoYXIoKTsJLy8gZ2V0IHRoZSByZXBsYWNlbWVudCBjaGFyCisJCWNudCA9IDA7CisJCWlmIChjMSA9PSAnLicpCisJCQljbnQgPSAocm93cyAtIDIpIC8gMjsJLy8gcHV0IGRvdCBhdCBjZW50ZXIKKwkJaWYgKGMxID09ICctJykKKwkJCWNudCA9IHJvd3MgLSAyOwkvLyBwdXQgZG90IGF0IGJvdHRvbQorCQlzY3JlZW5iZWdpbiA9IGJlZ2luX2xpbmUoZG90KTsJLy8gc3RhcnQgZG90IGF0IHRvcAorCQlkb3Rfc2Nyb2xsKGNudCwgLTEpOworCQlicmVhazsKKwljYXNlICd8JzoJCQkvLyB8LSBtb3ZlIHRvIGNvbHVtbiAiY21kY250IgorCQlkb3QgPSBtb3ZlX3RvX2NvbChkb3QsIGNtZGNudCAtIDEpOwkvLyB0cnkgdG8gbW92ZSB0byBjb2x1bW4KKwkJYnJlYWs7CisJY2FzZSAnfic6CQkJLy8gfi0gZmxpcCB0aGUgY2FzZSBvZiBsZXR0ZXJzICAgYS16IC0+IEEtWgorCQlkbyB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVklfVU5ETworCQkJaWYgKGlzbG93ZXIoKmRvdCkpIHsKKwkJCQl1bmRvX3B1c2goZG90LCAxLCBVTkRPX0RFTCk7CisJCQkJKmRvdCA9IHRvdXBwZXIoKmRvdCk7CisJCQkJdW5kb19wdXNoKGRvdCwgMSwgVU5ET19JTlNfQ0hBSU4pOworCQkJfSBlbHNlIGlmIChpc3VwcGVyKCpkb3QpKSB7CisJCQkJdW5kb19wdXNoKGRvdCwgMSwgVU5ET19ERUwpOworCQkJCSpkb3QgPSB0b2xvd2VyKCpkb3QpOworCQkJCXVuZG9fcHVzaChkb3QsIDEsIFVORE9fSU5TX0NIQUlOKTsKKwkJCX0KKyNlbHNlCisJCQlpZiAoaXNsb3dlcigqZG90KSkgeworCQkJCSpkb3QgPSB0b3VwcGVyKCpkb3QpOworCQkJCW1vZGlmaWVkX2NvdW50Kys7CisJCQl9IGVsc2UgaWYgKGlzdXBwZXIoKmRvdCkpIHsKKwkJCQkqZG90ID0gdG9sb3dlcigqZG90KTsKKwkJCQltb2RpZmllZF9jb3VudCsrOworCQkJfQorI2VuZGlmCisJCQlkb3RfcmlnaHQoKTsKKwkJfSB3aGlsZSAoLS1jbWRjbnQgPiAwKTsKKwkJZW5kX2NtZF9xKCk7CS8vIHN0b3AgYWRkaW5nIHRvIHEKKwkJYnJlYWs7CisJCS8vLS0tLS0gVGhlIEN1cnNvciBhbmQgRnVuY3Rpb24gS2V5cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWNhc2UgS0VZQ09ERV9IT01FOgkvLyBDdXJzb3IgS2V5IEhvbWUKKwkJZG90X2JlZ2luKCk7CisJCWJyZWFrOworCQkvLyBUaGUgRm4ga2V5cyBjb3VsZCBwb2ludCB0byBkb19tYWNybyB3aGljaCBjb3VsZCB0cmFuc2xhdGUgdGhlbQorI2lmIDAKKwljYXNlIEtFWUNPREVfRlVOMToJLy8gRnVuY3Rpb24gS2V5IEYxCisJY2FzZSBLRVlDT0RFX0ZVTjI6CS8vIEZ1bmN0aW9uIEtleSBGMgorCWNhc2UgS0VZQ09ERV9GVU4zOgkvLyBGdW5jdGlvbiBLZXkgRjMKKwljYXNlIEtFWUNPREVfRlVONDoJLy8gRnVuY3Rpb24gS2V5IEY0CisJY2FzZSBLRVlDT0RFX0ZVTjU6CS8vIEZ1bmN0aW9uIEtleSBGNQorCWNhc2UgS0VZQ09ERV9GVU42OgkvLyBGdW5jdGlvbiBLZXkgRjYKKwljYXNlIEtFWUNPREVfRlVONzoJLy8gRnVuY3Rpb24gS2V5IEY3CisJY2FzZSBLRVlDT0RFX0ZVTjg6CS8vIEZ1bmN0aW9uIEtleSBGOAorCWNhc2UgS0VZQ09ERV9GVU45OgkvLyBGdW5jdGlvbiBLZXkgRjkKKwljYXNlIEtFWUNPREVfRlVOMTA6CS8vIEZ1bmN0aW9uIEtleSBGMTAKKwljYXNlIEtFWUNPREVfRlVOMTE6CS8vIEZ1bmN0aW9uIEtleSBGMTEKKwljYXNlIEtFWUNPREVfRlVOMTI6CS8vIEZ1bmN0aW9uIEtleSBGMTIKKwkJYnJlYWs7CisjZW5kaWYKKwl9CisKKyBkYzE6CisJLy8gaWYgdGV4dFtdIGp1c3QgYmVjYW1lIGVtcHR5LCBhZGQgYmFjayBhbiBlbXB0eSBsaW5lCisJaWYgKGVuZCA9PSB0ZXh0KSB7CisJCWNoYXJfaW5zZXJ0KHRleHQsICdcbicsIE5PX1VORE8pOwkvLyBzdGFydCBlbXB0eSBidWYgd2l0aCBkdW1teSBsaW5lCisJCWRvdCA9IHRleHQ7CisJfQorCS8vIGl0IGlzIE9LIGZvciBkb3QgdG8gZXhhY3RseSBlcXVhbCB0byBlbmQsIG90aGVyd2lzZSBjaGVjayBkb3QgdmFsaWRpdHkKKwlpZiAoZG90ICE9IGVuZCkgeworCQlkb3QgPSBib3VuZF9kb3QoZG90KTsJLy8gbWFrZSBzdXJlICJkb3QiIGlzIHZhbGlkCisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX1lBTktNQVJLCisJY2hlY2tfY29udGV4dChjKTsJLy8gdXBkYXRlIHRoZSBjdXJyZW50IGNvbnRleHQKKyNlbmRpZgorCisJaWYgKCFpc2RpZ2l0KGMpKQorCQljbWRjbnQgPSAwOwkJLy8gY21kIHdhcyBub3QgYSBudW1iZXIsIHJlc2V0IGNtZGNudAorCWNudCA9IGRvdCAtIGJlZ2luX2xpbmUoZG90KTsKKwkvLyBUcnkgdG8gc3RheSBvZmYgb2YgdGhlIE5ld2xpbmUKKwlpZiAoKmRvdCA9PSAnXG4nICYmIGNudCA+IDAgJiYgY21kX21vZGUgPT0gMCkKKwkJZG90LS07Cit9CisKKy8qIE5CISAgdGhlIENSQVNITUUgY29kZSBpcyB1bm1haW50YWluZWQsIGFuZCBkb2Vzbid0IGN1cnJlbnRseSBidWlsZCAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1ZJX0NSQVNITUUKK3N0YXRpYyBpbnQgdG90YWxjbWRzID0gMDsKK3N0YXRpYyBpbnQgTXAgPSA4NTsgICAgICAgICAgICAgLy8gTW92ZW1lbnQgY29tbWFuZCBQcm9iYWJpbGl0eQorc3RhdGljIGludCBOcCA9IDkwOyAgICAgICAgICAgICAvLyBOb24tbW92ZW1lbnQgY29tbWFuZCBQcm9iYWJpbGl0eQorc3RhdGljIGludCBEcCA9IDk2OyAgICAgICAgICAgICAvLyBEZWxldGUgY29tbWFuZCBQcm9iYWJpbGl0eQorc3RhdGljIGludCBJcCA9IDk3OyAgICAgICAgICAgICAvLyBJbnNlcnQgY29tbWFuZCBQcm9iYWJpbGl0eQorc3RhdGljIGludCBZcCA9IDk4OyAgICAgICAgICAgICAvLyBZYW5rIGNvbW1hbmQgUHJvYmFiaWxpdHkKK3N0YXRpYyBpbnQgUHAgPSA5OTsgICAgICAgICAgICAgLy8gUHV0IGNvbW1hbmQgUHJvYmFiaWxpdHkKK3N0YXRpYyBpbnQgTSA9IDAsIE4gPSAwLCBJID0gMCwgRCA9IDAsIFkgPSAwLCBQID0gMCwgVSA9IDA7CitzdGF0aWMgY29uc3QgY2hhciBjaGFyc1syMF0gPSAiXHQwMTIzNDUgYWJjZEFCQ0QtPS4kIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB3b3Jkc1syMF0gPSB7CisJInRoaXMiLCAiaXMiLCAiYSIsICJ0ZXN0IiwKKwkiYnJvYWRjYXN0IiwgInRoZSIsICJlbWVyZ2VuY3kiLCAib2YiLAorCSJzeXN0ZW0iLCAicXVpY2siLCAiYnJvd24iLCAiZm94IiwKKwkianVtcGVkIiwgIm92ZXIiLCAibGF6eSIsICJkb2dzIiwKKwkiYmFjayIsICJKYW51YXJ5IiwgIkZlYnVhcnkiLCAiTWFyY2giCit9Oworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGxpbmVzWzIwXSA9IHsKKwkiWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2VcbiIsCisJImNoYXIgYywgY20sICpjbWQsICpjbWQxO1xuIiwKKwkiZ2VuZXJhdGUgYSBjb21tYW5kIGJ5IHBlcmNlbnRhZ2VzXG4iLAorCSJOdW1iZXJzIG1heSBiZSB0eXBlZCBhcyBhIHByZWZpeCB0byBzb21lIGNvbW1hbmRzLlxuIiwKKwkiUXVpdCwgZGlzY2FyZGluZyBjaGFuZ2VzIVxuIiwKKwkiRm9yY2VkIHdyaXRlLCBpZiBwZXJtaXNzaW9uIG9yaWdpbmFsbHkgbm90IHZhbGlkLlxuIiwKKwkiSW4gZ2VuZXJhbCwgYW55IGV4IG9yIGVkIGNvbW1hbmQgKHN1Y2ggYXMgc3Vic3RpdHV0ZSBvciBkZWxldGUpLlxuIiwKKwkiSSBoYXZlIHRpY2tldHMgYXZhaWxhYmxlIGZvciB0aGUgQmxhemVycyB2cyBMQSBDbGlwcGVycyBmb3IgTW9uZGF5LCBKYW51cmFyeSAxIGF0IDE6MDBwbS5cbiIsCisJIlBsZWFzZSBnZXQgdy8gbWUgYW5kIEkgd2lsbCBnbyBvdmVyIGl0IHdpdGggeW91LlxuIiwKKwkiVGhlIGZvbGxvd2luZyBpcyBhIGxpc3Qgb2Ygc2NoZWR1bGVkLCBjb21taXR0ZWQgY2hhbmdlcy5cbiIsCisJIjEuICAgTGF1bmNoIE5vcnRvbiBBbnRpdmlydXMgKFN0YXJ0LCBQcm9ncmFtcywgTm9ydG9uIEFudGl2aXJ1cylcbiIsCisJIlJlbWluZGVyLi4uLlRvd24gTWVldGluZyBpbiBDZW50cmFsIFBlcmsgY2FmZSB0b2RheSBhdCAzOjAwcG0uXG4iLAorCSJBbnkgcXVlc3Rpb24gYWJvdXQgdHJhbnNhY3Rpb25zIHBsZWFzZSBjb250YWN0IFN0ZXJsaW5nIEh1eGxleS5cbiIsCisJIkkgd2lsbCB0cnkgdG8gZ2V0IGJhY2sgdG8geW91IGJ5IEZyaWRheSwgRGVjZW1iZXIgMzEuXG4iLAorCSJUaGlzIENoYW5nZSB3aWxsIGJlIGltcGxlbWVudGVkIG9uIEZyaWRheS5cbiIsCisJIkxldCBtZSBrbm93IGlmIHlvdSBoYXZlIHByb2JsZW1zIGFjY2Vzc2luZyB0aGlzO1xuIiwKKwkiU3RlcmxpbmcgSHV4bGV5IHJlY2VudGx5IGFkZGVkIHlvdSB0byB0aGUgYWNjZXNzIGxpc3QuXG4iLAorCSJXb3VsZCB5b3UgbGlrZSB0byBnbyB0byBsdW5jaD9cbiIsCisJIlRoZSBsYXN0IGNvbW1hbmQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJ1bi5cbiIsCisJIlRoaXMgaXMgdG9vIG11Y2ggZW5nbGlzaCBmb3IgYSBjb21wdXRlciBnZWVrLlxuIiwKK307CitzdGF0aWMgY2hhciAqbXVsdGlsaW5lc1syMF0gPSB7CisJIllvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlXG4iLAorCSJjaGFyIGMsIGNtLCAqY21kLCAqY21kMTtcbiIsCisJImdlbmVyYXRlIGEgY29tbWFuZCBieSBwZXJjZW50YWdlc1xuIiwKKwkiTnVtYmVycyBtYXkgYmUgdHlwZWQgYXMgYSBwcmVmaXggdG8gc29tZSBjb21tYW5kcy5cbiIsCisJIlF1aXQsIGRpc2NhcmRpbmcgY2hhbmdlcyFcbiIsCisJIkZvcmNlZCB3cml0ZSwgaWYgcGVybWlzc2lvbiBvcmlnaW5hbGx5IG5vdCB2YWxpZC5cbiIsCisJIkluIGdlbmVyYWwsIGFueSBleCBvciBlZCBjb21tYW5kIChzdWNoIGFzIHN1YnN0aXR1dGUgb3IgZGVsZXRlKS5cbiIsCisJIkkgaGF2ZSB0aWNrZXRzIGF2YWlsYWJsZSBmb3IgdGhlIEJsYXplcnMgdnMgTEEgQ2xpcHBlcnMgZm9yIE1vbmRheSwgSmFudXJhcnkgMSBhdCAxOjAwcG0uXG4iLAorCSJQbGVhc2UgZ2V0IHcvIG1lIGFuZCBJIHdpbGwgZ28gb3ZlciBpdCB3aXRoIHlvdS5cbiIsCisJIlRoZSBmb2xsb3dpbmcgaXMgYSBsaXN0IG9mIHNjaGVkdWxlZCwgY29tbWl0dGVkIGNoYW5nZXMuXG4iLAorCSIxLiAgIExhdW5jaCBOb3J0b24gQW50aXZpcnVzIChTdGFydCwgUHJvZ3JhbXMsIE5vcnRvbiBBbnRpdmlydXMpXG4iLAorCSJSZW1pbmRlci4uLi5Ub3duIE1lZXRpbmcgaW4gQ2VudHJhbCBQZXJrIGNhZmUgdG9kYXkgYXQgMzowMHBtLlxuIiwKKwkiQW55IHF1ZXN0aW9uIGFib3V0IHRyYW5zYWN0aW9ucyBwbGVhc2UgY29udGFjdCBTdGVybGluZyBIdXhsZXkuXG4iLAorCSJJIHdpbGwgdHJ5IHRvIGdldCBiYWNrIHRvIHlvdSBieSBGcmlkYXksIERlY2VtYmVyIDMxLlxuIiwKKwkiVGhpcyBDaGFuZ2Ugd2lsbCBiZSBpbXBsZW1lbnRlZCBvbiBGcmlkYXkuXG4iLAorCSJMZXQgbWUga25vdyBpZiB5b3UgaGF2ZSBwcm9ibGVtcyBhY2Nlc3NpbmcgdGhpcztcbiIsCisJIlN0ZXJsaW5nIEh1eGxleSByZWNlbnRseSBhZGRlZCB5b3UgdG8gdGhlIGFjY2VzcyBsaXN0LlxuIiwKKwkiV291bGQgeW91IGxpa2UgdG8gZ28gdG8gbHVuY2g/XG4iLAorCSJUaGUgbGFzdCBjb21tYW5kIHdpbGwgYmUgYXV0b21hdGljYWxseSBydW4uXG4iLAorCSJUaGlzIGlzIHRvbyBtdWNoIGVuZ2xpc2ggZm9yIGEgY29tcHV0ZXIgZ2Vlay5cbiIsCit9OworCisvLyBjcmVhdGUgYSByYW5kb20gY29tbWFuZCB0byBleGVjdXRlCitzdGF0aWMgdm9pZCBjcmFzaF9kdW1teSgpCit7CisJc3RhdGljIGludCBzbGVlcHRpbWU7ICAgLy8gaG93IGxvbmcgdG8gcGF1c2UgYmV0d2VlbiBjb21tYW5kcworCWNoYXIgYywgY20sICpjbWQsICpjbWQxOworCWludCBpLCBjbnQsIHRoaW5nLCByYmksIHN0YXJ0cmJpLCBwZXJjZW50OworCisJLy8gImRvdCIgbW92ZW1lbnQgY29tbWFuZHMKKwljbWQxID0gIiBcblxyXDAwMlwwMDRcMDA1XDAwNlwwMjVcMDMxMF4kLSt3V2VFYkJoamtsSEwiOworCisJLy8gaXMgdGhlcmUgYWxyZWFkeSBhIGNvbW1hbmQgcnVubmluZz8KKwlpZiAocmVhZGJ1ZmZlclswXSA+IDApCisJCWdvdG8gY2QxOworIGNkMDoKKwlyZWFkYnVmZmVyWzBdID0gJ1gnOworCXN0YXJ0cmJpID0gcmJpID0gMTsKKwlzbGVlcHRpbWUgPSAwOyAgICAgICAgICAvLyBob3cgbG9uZyB0byBwYXVzZSBiZXR3ZWVuIGNvbW1hbmRzCisJbWVtc2V0KHJlYWRidWZmZXIsICdcMCcsIHNpemVvZihyZWFkYnVmZmVyKSk7CisJLy8gZ2VuZXJhdGUgYSBjb21tYW5kIGJ5IHBlcmNlbnRhZ2VzCisJcGVyY2VudCA9IChpbnQpIGxyYW5kNDgoKSAlIDEwMDsgICAgICAgIC8vIGdldCBhIG51bWJlciBmcm9tIDAtOTkKKwlpZiAocGVyY2VudCA8IE1wKSB7ICAgICAvLyAgTW92ZW1lbnQgY29tbWFuZHMKKwkJLy8gYXZhaWxhYmxlIGNvbW1hbmRzCisJCWNtZCA9IGNtZDE7CisJCU0rKzsKKwl9IGVsc2UgaWYgKHBlcmNlbnQgPCBOcCkgeyAgICAgIC8vICBub24tbW92ZW1lbnQgY29tbWFuZHMKKwkJY21kID0gIm16PD5cJ1wiIjsgICAgICAgLy8gYXZhaWxhYmxlIGNvbW1hbmRzCisJCU4rKzsKKwl9IGVsc2UgaWYgKHBlcmNlbnQgPCBEcCkgeyAgICAgIC8vICBEZWxldGUgY29tbWFuZHMKKwkJY21kID0gImR4IjsgICAgICAgICAgICAgLy8gYXZhaWxhYmxlIGNvbW1hbmRzCisJCUQrKzsKKwl9IGVsc2UgaWYgKHBlcmNlbnQgPCBJcCkgeyAgICAgIC8vICBJbnNldCBjb21tYW5kcworCQljbWQgPSAiaUlhQXNySiI7ICAgICAgICAvLyBhdmFpbGFibGUgY29tbWFuZHMKKwkJSSsrOworCX0gZWxzZSBpZiAocGVyY2VudCA8IFlwKSB7ICAgICAgLy8gIFlhbmsgY29tbWFuZHMKKwkJY21kID0gInlZIjsgICAgICAgICAgICAgLy8gYXZhaWxhYmxlIGNvbW1hbmRzCisJCVkrKzsKKwl9IGVsc2UgaWYgKHBlcmNlbnQgPCBQcCkgeyAgICAgIC8vICBQdXQgY29tbWFuZHMKKwkJY21kID0gInBQIjsgICAgICAgICAgICAgLy8gYXZhaWxhYmxlIGNvbW1hbmRzCisJCVArKzsKKwl9IGVsc2UgeworCQkvLyBXZSBkbyBub3Qga25vdyBob3cgdG8gaGFuZGxlIHRoaXMgY29tbWFuZCwgdHJ5IGFnYWluCisJCVUrKzsKKwkJZ290byBjZDA7CisJfQorCS8vIHJhbmRvbWx5IHBpY2sgb25lIG9mIHRoZSBhdmFpbGFibGUgY21kcyBmcm9tICJjbWRbXSIKKwlpID0gKGludCkgbHJhbmQ0OCgpICUgc3RybGVuKGNtZCk7CisJY20gPSBjbWRbaV07CisJaWYgKHN0cmNocigiOlwwMjQiLCBjbSkpCisJCWdvdG8gY2QwOyAgICAgICAgICAgICAgIC8vIGRvbnQgYWxsb3cgY29sb24gb3IgY3RybC1UIGNvbW1hbmRzCisJcmVhZGJ1ZmZlcltyYmkrK10gPSBjbTsgLy8gcHV0IGNtZCBpbnRvIGlucHV0IGJ1ZmZlcgorCisJLy8gbm93IHdlIGhhdmUgdGhlIGNvbW1hbmQtCisJLy8gdGhlcmUgYXJlIDEsIDIsIGFuZCBtdWx0aSBjaGFyIGNvbW1hbmRzCisJLy8gZmluZCBvdXQgd2hpY2ggYW5kIGdlbmVyYXRlIHRoZSByZXN0IG9mIGNvbW1hbmQgYXMgbmVjZXNzYXJ5CisJaWYgKHN0cmNocigiZG1yeXo8PlwnXCIiLCBjbSkpIHsgICAgICAgIC8vIDItY2hhciBjb21tYW5kcworCQljbWQxID0gIiBcblxyMCReLSt3V2VFYkJoamtsSEwiOworCQlpZiAoY20gPT0gJ20nIHx8IGNtID09ICdcJycgfHwgY20gPT0gJ1wiJykgeyAgICAvLyBwaWNrIGEgcmVnW10KKwkJCWNtZDEgPSAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiOworCQl9CisJCXRoaW5nID0gKGludCkgbHJhbmQ0OCgpICUgc3RybGVuKGNtZDEpOyAvLyBwaWNrIGEgbW92ZW1lbnQgY29tbWFuZAorCQljID0gY21kMVt0aGluZ107CisJCXJlYWRidWZmZXJbcmJpKytdID0gYzsgIC8vIGFkZCBtb3ZlbWVudCB0byBpbnB1dCBidWZmZXIKKwl9CisJaWYgKHN0cmNocigiaUlhQXNjIiwgY20pKSB7ICAgICAvLyBtdWx0aS1jaGFyIGNvbW1hbmRzCisJCWlmIChjbSA9PSAnYycpIHsKKwkJCS8vIGNoYW5nZSBzb21lIHRoaW5nCisJCQl0aGluZyA9IChpbnQpIGxyYW5kNDgoKSAlIHN0cmxlbihjbWQxKTsgLy8gcGljayBhIG1vdmVtZW50IGNvbW1hbmQKKwkJCWMgPSBjbWQxW3RoaW5nXTsKKwkJCXJlYWRidWZmZXJbcmJpKytdID0gYzsgIC8vIGFkZCBtb3ZlbWVudCB0byBpbnB1dCBidWZmZXIKKwkJfQorCQl0aGluZyA9IChpbnQpIGxyYW5kNDgoKSAlIDQ7ICAgIC8vIHdoYXQgdGhpbmcgdG8gaW5zZXJ0CisJCWNudCA9IChpbnQpIGxyYW5kNDgoKSAlIDEwOyAgICAgLy8gaG93IG1hbnkgdG8gaW5zZXJ0CisJCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworCQkJaWYgKHRoaW5nID09IDApIHsgICAgICAgLy8gaW5zZXJ0IGNoYXJzCisJCQkJcmVhZGJ1ZmZlcltyYmkrK10gPSBjaGFyc1soKGludCkgbHJhbmQ0OCgpICUgc3RybGVuKGNoYXJzKSldOworCQkJfSBlbHNlIGlmICh0aGluZyA9PSAxKSB7ICAgICAgICAvLyBpbnNlcnQgd29yZHMKKwkJCQlzdHJjYXQocmVhZGJ1ZmZlciwgd29yZHNbKGludCkgbHJhbmQ0OCgpICUgMjBdKTsKKwkJCQlzdHJjYXQocmVhZGJ1ZmZlciwgIiAiKTsKKwkJCQlzbGVlcHRpbWUgPSAwOyAgLy8gaG93IGZhc3QgdG8gdHlwZQorCQkJfSBlbHNlIGlmICh0aGluZyA9PSAyKSB7ICAgICAgICAvLyBpbnNlcnQgbGluZXMKKwkJCQlzdHJjYXQocmVhZGJ1ZmZlciwgbGluZXNbKGludCkgbHJhbmQ0OCgpICUgMjBdKTsKKwkJCQlzbGVlcHRpbWUgPSAwOyAgLy8gaG93IGZhc3QgdG8gdHlwZQorCQkJfSBlbHNlIHsgICAgICAgIC8vIGluc2VydCBtdWx0aS1saW5lcworCQkJCXN0cmNhdChyZWFkYnVmZmVyLCBtdWx0aWxpbmVzWyhpbnQpIGxyYW5kNDgoKSAlIDIwXSk7CisJCQkJc2xlZXB0aW1lID0gMDsgIC8vIGhvdyBmYXN0IHRvIHR5cGUKKwkJCX0KKwkJfQorCQlzdHJjYXQocmVhZGJ1ZmZlciwgIlwwMzMiKTsKKwl9CisJcmVhZGJ1ZmZlclswXSA9IHN0cmxlbihyZWFkYnVmZmVyICsgMSk7CisgY2QxOgorCXRvdGFsY21kcysrOworCWlmIChzbGVlcHRpbWUgPiAwKQorCQlteXNsZWVwKHNsZWVwdGltZSk7ICAgICAgLy8gc2xlZXAgMS8xMDAgc2VjCit9CisKKy8vIHRlc3QgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkgZXJyb3JzCitzdGF0aWMgdm9pZCBjcmFzaF90ZXN0KCkKK3sKKwlzdGF0aWMgdGltZV90IG9sZHRpbTsKKworCXRpbWVfdCB0aW07CisJY2hhciBkWzJdLCBtc2dbODBdOworCisJbXNnWzBdID0gJ1wwJzsKKwlpZiAoZW5kIDwgdGV4dCkgeworCQlzdHJjYXQobXNnLCAiZW5kPHRleHQgIik7CisJfQorCWlmIChlbmQgPiB0ZXh0ZW5kKSB7CisJCXN0cmNhdChtc2csICJlbmQ+dGV4dGVuZCAiKTsKKwl9CisJaWYgKGRvdCA8IHRleHQpIHsKKwkJc3RyY2F0KG1zZywgImRvdDx0ZXh0ICIpOworCX0KKwlpZiAoZG90ID4gZW5kKSB7CisJCXN0cmNhdChtc2csICJkb3Q+ZW5kICIpOworCX0KKwlpZiAoc2NyZWVuYmVnaW4gPCB0ZXh0KSB7CisJCXN0cmNhdChtc2csICJzY3JlZW5iZWdpbjx0ZXh0ICIpOworCX0KKwlpZiAoc2NyZWVuYmVnaW4gPiBlbmQgLSAxKSB7CisJCXN0cmNhdChtc2csICJzY3JlZW5iZWdpbj5lbmQtMSAiKTsKKwl9CisKKwlpZiAobXNnWzBdKSB7CisJCXByaW50ZigiXG5cbiVkOiBcJyVjXCcgJXNcblxuXG4lc1tIaXQgcmV0dXJuIHRvIGNvbnRpbnVlXSVzIiwKKwkJCXRvdGFsY21kcywgbGFzdF9pbnB1dF9jaGFyLCBtc2csIEVTQ19CT0xEX1RFWFQsIEVTQ19OT1JNX1RFWFQpOworCQlmZmx1c2hfYWxsKCk7CisJCXdoaWxlIChzYWZlX3JlYWQoU1RESU5fRklMRU5PLCBkLCAxKSA+IDApIHsKKwkJCWlmIChkWzBdID09ICdcbicgfHwgZFswXSA9PSAnXHInKQorCQkJCWJyZWFrOworCQl9CisJfQorCXRpbSA9IHRpbWUoTlVMTCk7CisJaWYgKHRpbSA+PSAob2xkdGltICsgMykpIHsKKwkJc3ByaW50ZihzdGF0dXNfYnVmZmVyLAorCQkJCSJUb3Q9JWQ6IE09JWQgTj0lZCBJPSVkIEQ9JWQgWT0lZCBQPSVkIFU9JWQgc2l6ZT0lZCIsCisJCQkJdG90YWxjbWRzLCBNLCBOLCBJLCBELCBZLCBQLCBVLCBlbmQgLSB0ZXh0ICsgMSk7CisJCW9sZHRpbSA9IHRpbTsKKwl9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2FuZHJvaWQtYnVpbGQgYi9leGFtcGxlcy9hbmRyb2lkLWJ1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEyM2JhOTYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9hbmRyb2lkLWJ1aWxkCkBAIC0wLDAgKzEsMzQgQEAKKyMhL2Jpbi9zaAorIyBCdWlsZCBCdXN5Ym94IGFnYWluc3QgQW5kcm9pZCdzIGJpb25pYworIyBPcmlnaW5hbGx5IGJ5IERhbiBGYW5kcmljaAorIworIyBDb25maWd1cmUgd2l0aCAibWFrZSBhbmRyb2lkX2RlZmNvbmZpZyIKKyMKKyMgVGhpcyBmaWxlIGhhcyBiZWVuIHRlc3RlZCBvbiBBbmRyb2lkIEZyb3lvICh0aGUgbGFjayBvZiB0dHluYW1lX3IgaW4KKyMgdGhlIGFuZHJvaWQgbGliYyBtdXN0IGJlIHBhdGNoZWQgYXJvdW5kKSBhbmQgR2luZ2VyYnJlYWQuCisKKyMgUG9pbnQgdGhpcyB0byB0aGUgQW5kcm9pZCByb290IGRpcmVjdG9yeTsgaXQncyB1c2VkIGluIHRoZSBkZWZjb25maWcgQ0ZMQUdTCitleHBvcnQgQT0iJEhPTUUvYW5kcm9pZCIKKworIyBBbmRyb2lkIHByb2R1Y3QgYmVpbmcgYnVpbHQKK1A9em9vbTIKKworIyBUb29sY2hhaW4gdmVyc2lvbiBpbiB1c2UgYnkgdGhpcyB2ZXJzaW9uIG9mIEFuZHJvaWQKK0dDQ1ZFUj00LjQuMworCitleHBvcnQgUEFUSD0iJEEvcHJlYnVpbHQvbGludXgteDg2L3Rvb2xjaGFpbi9hcm0tZWFiaS0kR0NDVkVSL2JpbjokUEFUSCIKKworIyBTZXQgdGhlIGxpbmtlciBmbGFnczsgY29tcGlsZXIgZmxhZ3MgYXJlIGluIHRoZSBkZWZjb25maWcgZmlsZQoraWYgZ3JlcCAiXkNPTkZJR19TVEFUSUM9eSIgLmNvbmZpZyA+L2Rldi9udWxsIDsgdGhlbgorCSMgU3RhdGljIGxpbmtpbmcKKwlMREZMQUdTPSItc3RhdGljIC1YbGlua2VyIC16IC1YbGlua2VyIG11bGRlZnMgLW5vc3RkbGliICRBL291dC90YXJnZXQvcHJvZHVjdC8kUC9vYmovbGliL2NydGJlZ2luX3N0YXRpYy5vICRBL291dC90YXJnZXQvcHJvZHVjdC8kUC9vYmovbGliL2NydGVuZF9hbmRyb2lkLm8gLUwkQS9vdXQvdGFyZ2V0L3Byb2R1Y3QvJFAvb2JqL2xpYiAtTCRBL291dC90YXJnZXQvcHJvZHVjdC8kUC9vYmovU1RBVElDX0xJQlJBUklFUy9saWJtX2ludGVybWVkaWF0ZXMgLUwkQS9vdXQvdGFyZ2V0L3Byb2R1Y3QvJFAvb2JqL1NUQVRJQ19MSUJSQVJJRVMvbGliY19pbnRlcm1lZGlhdGVzIgorCUxETElCUz0ibSBjIGdjYyIKK2Vsc2UKKwkjIER5bmFtaWMgbGlua2luZworCUxERkxBR1M9Ii1YbGlua2VyIC16IC1YbGlua2VyIG11bGRlZnMgLW5vc3RkbGliIC1CZHluYW1pYyAtWGxpbmtlciAtVCRBL2J1aWxkL2NvcmUvYXJtZWxmLnggLVhsaW5rZXIgLWR5bmFtaWMtbGlua2VyIC1YbGlua2VyIC9zeXN0ZW0vYmluL2xpbmtlciAtWGxpbmtlciAteiAtWGxpbmtlciBub2NvcHlyZWxvYyAtWGxpbmtlciAtLW5vLXVuZGVmaW5lZCAkQS9vdXQvdGFyZ2V0L3Byb2R1Y3QvJFAvb2JqL2xpYi9jcnRiZWdpbl9keW5hbWljLm8gJEEvb3V0L3RhcmdldC9wcm9kdWN0LyRQL29iai9saWIvY3J0ZW5kX2FuZHJvaWQubyAtTCRBL291dC90YXJnZXQvcHJvZHVjdC8kUC9vYmovbGliIgorCUxETElCUz0iZGwgbSBjIGdjYyIKK2ZpCisKKyMgSXQncyBwb3NzaWJsZSB3aXRoIG5ld2VyIHZlcnNpb24KKyMgeW91IG5lZWQgdG8gdXNlIENGTEFHU19idXN5Ym94IGluc3RlYWQgb2YgRVhUUkFfTERGTEFHUyBiZWxvdzoKK21ha2UgRVhUUkFfTERGTEFHUz0iJExERkxBR1MiIExETElCUz0iJExETElCUyIgIiRAIgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9vdGZsb3BweS9ib290ZmxvcHB5LnR4dCBiL2V4YW1wbGVzL2Jvb3RmbG9wcHkvYm9vdGZsb3BweS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWUyY2JlMgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb3RmbG9wcHkvYm9vdGZsb3BweS50eHQKQEAgLTAsMCArMSwxODAgQEAKK0J1aWxkaW5nIGEgQnVzeWJveCBCb290IEZsb3BweQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIGhvdyB0byBidWlkIGEgYm9vdCBmbG9wcHkgdXNpbmcgdGhlIGZvbGxvd2luZworY29tcG9uZW50czoKKworIC0gTGludXggS2VybmVsIChodHRwOi8vd3d3Lmtlcm5lbC5vcmcpCisgLSB1Q2xpYmM6IEMgbGlicmFyeSAoaHR0cDovL3d3dy51Y2xpYmMub3JnLykKKyAtIEJ1c3lib3g6IFVuaXggdXRpbGl0aWVzIChodHRwOi8vYnVzeWJveC5uZXQvKQorIC0gU3lzbGludXg6IGJvb3Rsb2FkZXIgKGh0dHA6Ly9zeXNsaW51eC56eXRvci5jb20pCisKK0l0IGlzIGJhc2VkIGhlYXZpbHkgb24gYSBwYXBlciBwcmVzZW50ZWQgYnkgRXJpayBBbmRlcnNlbiBhdCB0aGUgMjAwMSBFbWJlZGRlZAorU3lzdGVtcyBDb25mZXJlbmNlLgorCisKKworQnVpbGRpbmcgVGhlIFNvZnR3YXJlIENvbXBvbmVudHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0RldGFpbGVkIGluc3RydWN0aW9ucyBvbiBob3cgdG8gYnVpbGQgQnVzeWJveCwgdUNsaWJjLCBvciBhIHdvcmtpbmcgTGludXgKK2tlcm5lbCBhcmUgYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIGRvY3VtZW50LiBUaGUgZm9sbG93aW5nIGd1aWRlbGluZXMgd2lsbAoraGVscCB0aG91Z2g6CisKKwktIFN0b2NrIEJ1c3lib3ggZnJvbSBDVlMgb3IgYSB0YXJiYWxsIHdpbGwgd29yayB3aXRoIG5vIG1vZGlmaWNhdGlvbnMgdG8KKwkgIGFueSBmaWxlcy4gSnVzdCBleHRyYWN0IGFuZCBnby4KKwktIERpdHRvIHVDbGliYy4KKwktIFlvdXIgTGludXgga2VybmVsIG11c3QgaW5jbHVkZSBzdXBwb3J0IGZvciBpbml0cmQgb3IgZWxzZSB0aGUgZmxvcHB5CisJICB3b24ndCBiZSBhYmxlIHRvIG1vdW50IGl0J3Mgcm9vdCBmaWxlIHN5c3RlbS4KKworSWYgeW91IHJlcXVpcmUgZnVydGhlciBpbmZvcm1hdGlvbiBvbiBidWlsZGluZyBCdXN5Ym94IHVDbGliYyBvciBMaW51eCwgcGxlYXNlCityZWZlciB0byB0aGUgd2ViIHBhZ2VzIGFuZCBkb2N1bWVudGF0aW9uIGZvciB0aG9zZSBpbmRpdmlkdWFsIHByb2dyYW1zLgorCisKKworTWFraW5nIGEgUm9vdCBGaWxlIFN5c3RlbQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZm9sbG93aW5nIHN0ZXBzIHdpbGwgY3JlYXRlIGEgcm9vdCBmaWxlIHN5c3RlbS4KKworIC0gQ3JlYXRlIGFuIGVtcHR5IGZpbGUgdGhhdCB5b3UgY2FuIGZvcm1hdCBhcyBhIGZpbGVzeXN0ZW06CisKKwlkZCBpZj0vZGV2L3plcm8gb2Y9cm9vdGZzIGJzPTFrIGNvdW50PTQwMDAKKworIC0gU2V0IHVwIHRoZSByb290ZnMgZmlsZSB3ZSBqdXN0IGNyZWF0ZWQgdG8gYmUgdXNlZCBhcyBhIGxvb3AgZGV2aWNlIChtYXkgbm90CisgICBiZSBuZWNlc3NhcnkpCisKKwlsb3NldHVwIC9kZXYvbG9vcDAgcm9vdGZzCisKKyAtIEZvcm1hdCB0aGUgcm9vdGZzIGZpbGUgd2l0aCBhIGZpbGVzeXN0ZW06CisKKwlta2ZzLmV4dDIgLUYgLWkgMjAwMCByb290ZnMKKworIC0gTW91bnQgdGhlIGZpbGUgb24gYSBtb3VudHBvaW50IHNvIHdlIGNhbiBwbGFjZSBmaWxlcyBpbiBpdDoKKworCW1rZGlyIGxvb3AKKwltb3VudCAtbyBsb29wIHJvb3RmcyBsb29wLworCisJKHlvdSB3aWxsIHByb2JhYmx5IG5lZWQgdG8gYmUgcm9vdCB0byBkbyB0aGlzKQorCisgLSBDb3B5IG9uIHRoZSBDIGxpYnJhcnksIHRoZSBkeW5hbWljIGxpbmtpbmcgbGlicmFyeSwgYW5kIG90aGVyIG5lY2Vzc2FyeQorICAgbGlicmFyaWVzLiBGb3IgdGhpcyBleGFtcGxlLCB3ZSBjb3B5IHRoZSBmb2xsb3dpbmcgZmlsZXMgZnJvbSB0aGUgdUNsaWJjCisgICB0cmVlOgorCisJbWtkaXIgbG9vcC9saWIKKwkoY2hkaXIgdG8gdUNsaWJjIGRpcmVjdG9yeSkKKwljcCAtYSBsaWJjLnNvKiB1Q2xpYmMqLnNvIFwKKwkJbGQuc28tMS9kLWxpbmsvbGQtbGludXgtdWNsaWJjLnNvKiBcCisJCWxkLnNvLTEvbGliZGwvbGliZGwuc28qIFwKKwkJY3J5cHQvbGliY3J5cHQuc28qIFwKKwkJKHBhdGggdG8pbG9vcC9saWIKKworIC0gSW5zdGFsbCB0aGUgQnVzeWJveCBiaW5hcnkgYW5kIGFjY29tcGFueWluZyBzeW1saW5rczoKKworCShjaGRpciB0byBidXN5Ym94IGRpcmVjdG9yeSkKKwltYWtlIENPTkZJR19QUkVGSVg9KHBhdGggdG8pbG9vcC8gaW5zdGFsbAorCisgLSBNYWtlIGRldmljZSBmaWxlcyBpbiAvZGV2OgorCisJVGhpcyBjYW4gYmUgZG9uZSBieSBydW5uaW5nIHRoZSAnbWtkZXZzLnNoJyBzY3JpcHQuIElmIHlvdSB3YW50IHRoZSBnb3J5CisJZGV0YWlscywgeW91IGNhbiByZWFkIHRoZSBzY3JpcHQuCisKKyAtIE1ha2UgbmVjZXNzYXJ5IGZpbGVzIGluIC9ldGM6CisKKwlGb3IgdGhpcywganVzdCBjcCAtYSB0aGUgZXRjLyBkaXJlY3Rvcnkgb250byByb290ZnMuIEFnYWluLCBpZiB5b3Ugd2FudAorCWFsbCB0aGUgZGV0YWlscywgeW91IGNhbiBqdXN0IGxvb2sgYXQgdGhlIGZpbGVzIGluIHRoZSBkaXIuCisKKyAtIFVubW91bnQgdGhlIHJvb3RmcyBmcm9tIHRoZSBtb3VudHBvaW50OgorCisJdW1vdW50IGxvb3AKKworIC0gQ29tcHJlc3MgaXQ6CisKKwlnemlwIC05IHJvb3RmcworCisKK01ha2luZyBhIFNZU0xJTlVYIGJvb3QgZmxvcHB5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgZm9sbG93aW5nIHN0ZXBzIHdpbGwgY3JlYXRlIHRoZSBib290IGZsb3BweS4KKworTm90ZTogWW91IHdpbGwgbmVlZCB0byBoYXZlIHRoZSBtdG9vbHMgcGFja2FnZSBpbnN0YWxsZWQgYmVmb3JlaGFuZC4KKworIC0gSW5zZXJ0IGEgZmxvcHB5IGluIHRoZSBkcml2ZSBhbmQgZm9ybWF0IGl0IHdpdGggYW4gTVNET1MgZmlsZXN5c3RlbToKKworCW1mb3JtYXQgYToKKworCShpZiB0aGUgc3lzdGVtIGRvZXNuJ3Qga25vdyB3aGF0IGRldmljZSAnYTonIGlzLCBsb29rIGF0IC9ldGMvbXRvb2xzLmNvbmYpCisKKyAtIFJ1biBzeXNsaW51eCBvbiB0aGUgZmxvcHB5OgorCisJc3lzbGludXggLXMgL2Rldi9mZDAKKworCSh0aGUgLXMgc3RhbmRzIGZvciAic2FmZSwgc2xvdywgYW5kIHN0dXBpZCIgYW5kIHNob3VsZCB3b3JrIGJldHRlciB3aXRoCisJYnVnZ3kgQklPU2VzOyBpdCBjYW4gYmUgb21pdHRlZCkKKworIC0gUHV0IG9uIGEgc3lzbGludXguY2ZnIGZpbGU6CisKKwltY29weSBzeXNsaW51eC5jZmcgYToKKworCShtb3JlIG9uIHN5c2xpbnV4LmNmZyBiZWxvdykKKworIC0gQ29weSB0aGUgcm9vdCBmaWxlIHN5c3RlbSB5b3UgbWFkZSBvbnRvIHRoZSBNU0RPUyBmb3JtYXR0ZWQgZmxvcHB5CisKKwltY29weSByb290ZnMuZ3ogYToKKworIC0gQnVpbGQgYSBsaW51eCBrZXJuZWwgYW5kIGNvcHkgaXQgb250byB0aGUgZGlzayB3aXRoIHRoZSBmaWxlbmFtZSAnbGludXgnCisKKwltY29weSBiekltYWdlIGE6bGludXgKKworCitTYW1wbGUgc3lzbGludXguY2ZnCit+fn5+fn5+fn5+fn5+fn5+fn5+CisKK1RoZSBmb2xsb3dpbmcgc2ltcGxlIHN5c2xpbnV4LmNmZyBmaWxlIHNob3VsZCB3b3JrLiBZb3UgY2FuIHR3ZWFrIGl0IGlmIHlvdQorbGlrZS4KKworLS0tLWJlZ2luLXN5c2xpbnV4LmNmZy0tLS0tLS0tLS0tLS0tLQorREVGQVVMVCBsaW51eAorQVBQRU5EIGluaXRyZD1yb290ZnMuZ3ogcm9vdD0vZGV2L3JhbTAKK1RJTUVPVVQgMTAKK1BST01QVCAxCistLS0tZW5kLXN5c2xpbnV4LmNmZy0tLS0tLS0tLS0tLS0tLQorCitTb21lIGNoYW5nZXMgeW91IGNvdWxkIG1ha2UgdG8gc3lzbGludXguY2ZnOgorCisgLSBUaGlzIHZhbHVlIGlzIHRoZSBudW1iZXIgc2Vjb25kcyBpdCB3aWxsIHdhaXQgYmVmb3JlIGJvb3RpbmcuIFlvdSBjYW4gc2V0CisgICB0aGUgdGltZW91dCB0byAwIChvciBvbWl0KSB0byBib290IGluc3RhbnRseSwgb3IgeW91IGNhbiBzZXQgaXQgYXMgaGlnaCBhcworICAgMTAgdG8gd2FpdCBhd2hpbGUuCisKKyAtIFBST01QVCBjYW4gYmUgc2V0IHRvIDAgdG8gZGlzYWJsZSB0aGUgJ2Jvb3Q6JyBwcm9tcHQuCisKKyAtIHlvdSBjYW4gYWRkIHRoaXMgbGluZSB0byBkaXNwbGF5IHRoZSBjb250ZW50cyBvZiBhIGZpbGUgYXMgYSB3ZWxjb21lCisgICBtZXNzYWdlOgorCisJRElTUExBWSBkaXNwbGF5LnR4dAorCisKKworQWRkaXRpb25hbCBSZXNvdXJjZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK090aGVyIHVzZWZ1bCBpbmZvcm1hdGlvbiBvbiBtYWtpbmcgYSBMaW51eCBib290ZmxvcHB5IGlzIGF2YWlsYWJsZSBhdCB0aGUKK2ZvbGxvd2luZyBVUkxzOgorCitodHRwOi8vd3d3LmxpbnV4ZG9jLm9yZy9IT1dUTy9Cb290ZGlzay1IT1dUTy9pbmRleC5odG1sCitodHRwOi8vd3d3LmxpbnV4LWVtYmVkZGVkLmNvbS9ob3d0by9FbWJlZGRlZC1MaW51eC1Ib3d0by5odG1sCitodHRwOi8vbGludXgtZW1iZWRkZWQub3JnL2hvd3RvL0xGUy1IT1dUTy5odG1sCitodHRwOi8vbGludXgtZW1iZWRkZWQub3JnL3BtaG93dG8uaHRtbAoraHR0cDovL3JlY3ljbGUubGJsLmdvdi9+bGRvb2xpdHQvZW1iZWRkZWQvIChMYXJyeSBEb29saXR0bGUncyBzdHVmZikKKworCisKK1Bvc3NpYmxlIFRPRE9zCistLS0tLS0tLS0tLS0tLQorCitUaGUgZm9sbG93aW5nIGZlYXR1cmVzIHRoYXQgd2UgbWlnaHQgd2FudCB0byBhZGQgbGF0ZXI6CisKKyAtIHN1cHBvcnQgZm9yIGFkZGl0aW9uYWwgZmlsZXN5c3RlbXMgYmVzaWRlcyBleHQyLCBpLmUuIG1pbml4CisgLSBkaWZmZXJlbnQgbGliYywgc3RhdGljIHZzIGR5bmFtaWMgbG9hZGluZworIC0gbWF5YmUgdXNpbmcgYW4gYWx0ZXJuYXRlIGJvb3Rsb2FkZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb3RmbG9wcHkvZGlzcGxheS50eHQgYi9leGFtcGxlcy9ib290ZmxvcHB5L2Rpc3BsYXkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYWU0OGIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib290ZmxvcHB5L2Rpc3BsYXkudHh0CkBAIC0wLDAgKzEsMyBAQAorCitUaGlzIGJvb3QgZmxvcHB5IGlzIG1hZGUgd2l0aCBCdXN5Ym94LCB1Q2xpYmMsIGFuZCB0aGUgTGludXgga2VybmVsLgorSGl0IFJFVFVSTiB0byBib290IG9yIGVudGVyIGJvb3QgcGFyYW1ldGVycyBhdCB0aGUgcHJvbXB0IGJlbG93LgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9vdGZsb3BweS9ldGMvZnN0YWIgYi9leGFtcGxlcy9ib290ZmxvcHB5L2V0Yy9mc3RhYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzFmNjAyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYm9vdGZsb3BweS9ldGMvZnN0YWIKQEAgLTAsMCArMSBAQAorcHJvYwkJL3Byb2MJcHJvYwlkZWZhdWx0cyAgICAwCTAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb3RmbG9wcHkvZXRjL2luaXQuZC9yY1MgYi9leGFtcGxlcy9ib290ZmxvcHB5L2V0Yy9pbml0LmQvcmNTCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmMjliOTIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib290ZmxvcHB5L2V0Yy9pbml0LmQvcmNTCkBAIC0wLDAgKzEsMyBAQAorIyEgL2Jpbi9zaAorCisvYmluL21vdW50IC1hCmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib290ZmxvcHB5L2V0Yy9pbml0dGFiIGIvZXhhbXBsZXMvYm9vdGZsb3BweS9ldGMvaW5pdHRhYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWM5ZjY4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYm9vdGZsb3BweS9ldGMvaW5pdHRhYgpAQCAtMCwwICsxLDQgQEAKKzo6c3lzaW5pdDovZXRjL2luaXQuZC9yY1MKKzo6cmVzcGF3bjotL2Jpbi9zaAordHR5Mjo6YXNrZmlyc3Q6LS9iaW4vc2gKKzo6Y3RybGFsdGRlbDovYmluL3Vtb3VudCAtYSAtcgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9vdGZsb3BweS9ldGMvcHJvZmlsZSBiL2V4YW1wbGVzL2Jvb3RmbG9wcHkvZXRjL3Byb2ZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y2OGQzMwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb3RmbG9wcHkvZXRjL3Byb2ZpbGUKQEAgLTAsMCArMSw3IEBACisjIC9ldGMvcHJvZmlsZTogc3lzdGVtLXdpZGUgLnByb2ZpbGUgZmlsZSBmb3IgdGhlIEJvdXJuZSBzaGVsbHMKKworZWNobworZWNobyAtbiAiUHJvY2Vzc2luZyAvZXRjL3Byb2ZpbGUuLi4gIgorIyBuby1vcAorZWNobyAiRG9uZSIKK2VjaG8KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb3RmbG9wcHkvbWtkZXZzLnNoIGIvZXhhbXBsZXMvYm9vdGZsb3BweS9ta2RldnMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGU5NTEyZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb3RmbG9wcHkvbWtkZXZzLnNoCkBAIC0wLDAgKzEsNjIgQEAKKyMhL2Jpbi9zaAorIworIyBtYWtlZGV2LnNoIC0gY3JlYXRlcyBkZXZpY2UgZmlsZXMgZm9yIGEgYnVzeWJveCBib290IGZsb3BweSBpbWFnZQorCisKKyMgd2UgZG8gb3VyIHdvcmsgaW4gdGhlIGRldi8gZGlyZWN0b3J5CitpZiBbIC16ICIkMSIgXTsgdGhlbgorCWVjaG8gInVzYWdlOiBgYmFzZW5hbWUgJDBgIHBhdGgvdG8vZGV2L2RpciIKKwlleGl0IDEKK2ZpCisKK2NkICQxCisKKworIyBtaXNjZWxsYW5lb3VzIG9uZS1vZi1hLWtpbmQgc3R1ZmYKK21rbm9kIGNvbnNvbGUgYyA1IDEKK21rbm9kIGZ1bGwgYyAxIDcKK21rbm9kIGttZW0gYyAxIDIKK21rbm9kIG1lbSBjIDEgMQorbWtub2QgbnVsbCBjIDEgMworbWtub2QgcG9ydCBjIDEgNAorbWtub2QgcmFuZG9tIGMgMSA4Citta25vZCB1cmFuZG9tIGMgMSA5Citta25vZCB6ZXJvIGMgMSA1CitsbiAtcyAvcHJvYy9rY29yZSBjb3JlCisKKyMgSURFIEhEIGRldnMKKyMgbm90ZTogbm90IGdvaW5nIHRvIGJvdGhlciBjcmVhdGluZyBhbGwgY29uY2lldmFibGUgcGFydGl0aW9uczsgeW91IGNhbiBkbworIyB0aGF0IHlvdXJzZWxmIGFzIHlvdSBuZWVkICdlbS4KK21rbm9kIGhkYSBiIDMgMAorbWtub2QgaGRiIGIgMyA2NAorbWtub2QgaGRjIGIgMjIgMAorbWtub2QgaGRkIGIgMjIgNjQKKworIyBsb29wIGRldnMKK2ZvciBpIGluIGBzZXEgMCA3YDsgZG8KKwlta25vZCBsb29wJGkgYiA3ICRpCitkb25lCisKKyMgcmFtIGRldnMKK2ZvciBpIGluIGBzZXEgMCA5YDsgZG8KKwlta25vZCByYW0kaSBiIDEgJGkKK2RvbmUKK2xuIC1zIHJhbTEgcmFtCisKKyMgdHR5cworbWtub2QgdHR5IGMgNSAwCitmb3IgaSBpbiBgc2VxIDAgOWA7IGRvCisJbWtub2QgdHR5JGkgYyA0ICRpCitkb25lCisKKyMgdmlydHVhbCBjb25zb2xlIHNjcmVlbiBkZXZzCitmb3IgaSBpbiBgc2VxIDAgOWA7IGRvCisJbWtub2QgdmNzJGkgYiA3ICRpCitkb25lCitsbiAtcyB2Y3MwIHZjcworCisjIHZpcnR1YWwgY29uc29sZSBzY3JlZW4gdy8gYXR0cmlidXRlcyBkZXZzCitmb3IgaSBpbiBgc2VxIDAgOWA7IGRvCisJbWtub2QgdmNzYSRpIGIgNyAkKCgxMjggKyBpKSkKK2RvbmUKK2xuIC1zIHZjc2EwIHZjc2EKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb3RmbG9wcHkvbWtyb290ZnMuc2ggYi9leGFtcGxlcy9ib290ZmxvcHB5L21rcm9vdGZzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE3ZmM0OGIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib290ZmxvcHB5L21rcm9vdGZzLnNoCkBAIC0wLDAgKzEsMTA0IEBACisjIS9iaW4vYmFzaAorIworIyBta3Jvb3Rmcy5zaCAtIGNyZWF0ZXMgYSByb290IGZpbGUgc3lzdGVtCisjCisKKyMgVE9ETzogbmVlZCB0byBhZGQgY2hlY2tzIGhlcmUgdG8gdmVyaWZ5IHRoYXQgYnVzeWJveCwgdUNsaWJjIGFuZCBiekltYWdlCisjIGV4aXN0CisKKworIyBjb21tYW5kLWxpbmUgc2V0dGFibGUgdmFyaWFibGVzCitCVVNZQk9YX0RJUj0uLgorVUNMSUJDX0RJUj0uLi8uLi91Q2xpYmMKK1RBUkdFVF9ESVI9Li9sb29wCitGU1NJWkU9NDAwMAorQ0xFQU5VUD0xCitNS0ZTPSdta2ZzLmV4dDIgLUYnCisKKyMgZG9uJ3QtdG91Y2ggdmFyaWFibGVzCitCQVNFX0RJUj1gcHdkYAorCisKK3doaWxlIGdldG9wdHMgJ2I6dTpzOnQ6Q20nIG9wdAorZG8KKwljYXNlICRvcHQgaW4KKwkJYikgQlVTWUJPWF9ESVI9JE9QVEFSRyA7OworCQl1KSBVQ0xJQkNfRElSPSRPUFRBUkcgOzsKKwkJdCkgVEFSR0VUX0RJUj0kT1BUQVJHIDs7CisJCXMpIEZTU0laRT0kT1BUQVJHIDs7CisJCUMpIENMRUFOVVA9MCA7OworCQltKSBNS0ZTPSdta2ZzLm1pbml4JyA7OworCQkqKQorCQkJZWNobyAidXNhZ2U6IGBiYXNlbmFtZSAkMGAgWy1idV0iCisJCQllY2hvICIgIC1iIERJUiAgcGF0aCB0byBidXN5Ym94IGRpcmVjb3J5IChkZWZhdWx0IC4uKSIKKwkJCWVjaG8gIiAgLXUgRElSICBwYXRoIHRvIHVDbGliYyBkaXJlY29yeSAoZGVmYXVsdCAuLi8uLi91Q2xpYmMpIgorCQkJZWNobyAiICAtdCBESVIgIHBhdGggdG8gdGFyZ2V0IGRpcmVjb3J5IChkZWZhdWx0IC4vbG9vcCkiCisJCQllY2hvICIgIC1zIFNJWkUgc2l6ZSBvZiByb290IGZpbGVzeXN0ZW0gaW4gS2J5dGVzIChkZWZhdWx0IDQwMDApIgorCQkJZWNobyAiICAtQyAgICAgIGRvbid0IHBlcmZvcm0gY2xlYW51cCAodW1vdW50IHRhcmdldCBkaXIsIGd6aXAgcm9vdGZzLCBldGMuKSIKKwkJCWVjaG8gIiAgICAgICAgICAodGhpcyBhbGxvd3MgeW91IHRvICdjaHJvb3QgbG9vcC8gL2Jpbi9zaCcgdG8gdGVzdCBpdCkiCisJCQllY2hvICIgIC1tICAgICAgdXNlIG1pbml4IGZpbGVzeXN0ZW0gKGRlZmF1bHQgaXMgZXh0MikiCisJCQlleGl0IDEKKwkJCTs7CisJZXNhYworZG9uZQorCisKKworCisjIGNsZWFuIHVwIGZyb20gYW55IHByZXZpb3VzIHdvcmsKK21vdW50IHwgZ3JlcCAtcSBsb29wCitbICQ/IC1lcSAwIF0gJiYgdW1vdW50ICRUQVJHRVRfRElSCitbIC1kICRUQVJHRVRfRElSIF0gJiYgcm0gLXJmICRUQVJHRVRfRElSLworWyAtZiByb290ZnMgXSAmJiBybSAtZiByb290ZnMKK1sgLWYgcm9vdGZzLmd6IF0gJiYgcm0gLWYgcm9vdGZzLmd6CisKKworIyBwcmVwYXJlIHJvb3QgZmlsZSBzeXN0ZW0gYW5kIG1vdW50IGFzIGxvb3BiYWNrCitkZCBpZj0vZGV2L3plcm8gb2Y9cm9vdGZzIGJzPTFrIGNvdW50PSRGU1NJWkUKKyRNS0ZTIC1pIDIwMDAgcm9vdGZzCitta2RpciAkVEFSR0VUX0RJUgorbW91bnQgLW8gbG9vcCxleGVjIHJvb3RmcyAkVEFSR0VUX0RJUiAjIG11c3QgYmUgcm9vdAorCisKKyMgaW5zdGFsbCB1Q2xpYmMKK21rZGlyIC1wICRUQVJHRVRfRElSL2xpYgorY2QgJFVDTElCQ19ESVIKK21ha2UgSU5TVEFMTF9ESVI9CitjcCAtYSBsaWJjLnNvKiAkQkFTRV9ESVIvJFRBUkdFVF9ESVIvbGliCitjcCAtYSB1Q2xpYmMqLnNvICRCQVNFX0RJUi8kVEFSR0VUX0RJUi9saWIKK2NwIC1hIGxkLnNvLTEvZC1saW5rL2xkLWxpbnV4LXVjbGliYy5zbyogJEJBU0VfRElSLyRUQVJHRVRfRElSL2xpYgorY3AgLWEgbGQuc28tMS9saWJkbC9saWJkbC5zbyogJEJBU0VfRElSLyRUQVJHRVRfRElSL2xpYgorY3AgLWEgY3J5cHQvbGliY3J5cHQuc28qICRCQVNFX0RJUi8kVEFSR0VUX0RJUi9saWIKK2NkICRCQVNFX0RJUgorCisKKyMgaW5zdGFsbCBidXN5Ym94IGFuZCBjb21wb25lbnRzCitjZCAkQlVTWUJPWF9ESVIKK21ha2UgZGlzdGNsZWFuCittYWtlIENDPSRCQVNFX0RJUi8kVUNMSUJDX0RJUi9leHRyYS9nY2MtdUNsaWJjL2kzODYtdWNsaWJjLWdjYworbWFrZSBDT05GSUdfUFJFRklYPSRCQVNFX0RJUi8kVEFSR0VUX0RJUiBpbnN0YWxsCitjZCAkQkFTRV9ESVIKKworCisjIG1ha2UgZmlsZXMgaW4gL2RldgorbWtkaXIgJFRBUkdFVF9ESVIvZGV2CisuL21rZGV2cy5zaCAkVEFSR0VUX0RJUi9kZXYKKworCisjIG1ha2UgZmlsZXMgaW4gL2V0YworY3AgLWEgZXRjICRUQVJHRVRfRElSCitsbiAtcyAvcHJvYy9tb3VudHMgJFRBUkdFVF9ESVIvZXRjL210YWIKKworCisjIG90aGVyIG1pc2NlbGxhbmVvdXMgc2V0dXAKK21rZGlyICRUQVJHRVRfRElSL2luaXRyZAorbWtkaXIgJFRBUkdFVF9ESVIvcHJvYworCisKKyMgRG9uZS4gTWF5YmUgZG8gY2xlYW51cC4KK2lmIFsgJENMRUFOVVAgLWVxIDEgXQordGhlbgorCXVtb3VudCAkVEFSR0VUX0RJUgorCXJtZGlyICRUQVJHRVRfRElSCisJZ3ppcCAtOSByb290ZnMKK2ZpCmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib290ZmxvcHB5L21rc3lzbGludXguc2ggYi9leGFtcGxlcy9ib290ZmxvcHB5L21rc3lzbGludXguc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTI1NDE3MwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb3RmbG9wcHkvbWtzeXNsaW51eC5zaApAQCAtMCwwICsxLDQ4IEBACisjIS9iaW4vYmFzaAorIworIyBGb3JtYXRzIGEgZmxvcHB5IHRvIHVzZSBTeXNsaW51eAorCitkdW1teT0iIgorCisKKyMgbmVlZCB0byBoYXZlIG10b29scyBpbnN0YWxsZWQKK2lmIFsgLXogYHdoaWNoIG1mb3JtYXRgIC1vIC16IGB3aGljaCBtY29weWAgXTsgdGhlbgorCWVjaG8gIllvdSBtdXN0IGhhdmUgdGhlIG10b29scyBwYWNrYWdlIGluc3RhbGxlZCB0byBydW4gdGhpcyBzY3JpcHQiCisJZXhpdCAxCitmaQorCisKKyMgbmVlZCBhbiBhcmcgZm9yIHRoZSBsb2NhdGlvbiBvZiB0aGUga2VybmVsCitpZiBbIC16ICIkMSIgXTsgdGhlbgorCWVjaG8gInVzYWdlOiBgYmFzZW5hbWUgJDBgIHBhdGgvdG8vbGludXgva2VybmVsIgorCWV4aXQgMQorZmkKKworCisjIG5lZWQgdG8gaGF2ZSBhIHJvb3QgZmlsZSBzeXN0ZW0gYnVpbHQKK2lmIFsgISAtZiByb290ZnMuZ3ogXTsgdGhlbgorCWVjaG8gIllvdSBuZWVkIHRvIGhhdmUgYSByb290ZnMgYnVpbHQgZmlyc3QuIgorCWVjaG8gIkhpdCBSRVRVUk4gdG8gbWFrZSBvbmUgbm93IG9yIENvbnRyb2wtQyB0byBxdWl0LiIKKwlyZWFkIGR1bW15CisJLi9ta3Jvb3Rmcy5zaAorZmkKKworCisjIHByZXBhcmUgdGhlIGZsb3BweQorZWNobyAiUGxlYXNlIGluc2VydCBhIGJsYW5rIGZsb3BweSBpbiB0aGUgZHJpdmUgYW5kIHByZXNzIFJFVFVSTiB0byBmb3JtYXQiCitlY2hvICIoV0FSTklORzogQWxsIGRhdGEgd2lsbCBiZSBlcmFzZWQhIEhpdCBDb250cm9sLUMgdG8gYWJvcnQpIgorcmVhZCBkdW1teQorCitlY2hvICJGb3JtYXR0aW5nIHRoZSBmbG9wcHkuLi4iCittZm9ybWF0IGE6CitlY2hvICJNYWtpbmcgaXQgYm9vdGFibGUgd2l0aCBTeXNsaW51eC4uLiIKK3N5c2xpbnV4IC1zIC9kZXYvZmQwCitlY2hvICJDb3B5aW5nIFN5c2xpbnV4IGNvbmZpZ3VyYXRpb24gZmlsZXMuLi4iCittY29weSBzeXNsaW51eC5jZmcgZGlzcGxheS50eHQgYToKK2VjaG8gIkNvcHlpbmcgcm9vdCBmaWxlc3lzdGVtIGZpbGUuLi4iCittY29weSByb290ZnMuZ3ogYToKKyMgWFhYOiBtYXliZSBjaGVjayBmb3IgIm5vIHNwYWNlIG9uIGRldmljZSIgZXJyb3JzIGhlcmUKK2VjaG8gIkNvcHlpbmcgbGludXgga2VybmVsLi4uIgorbWNvcHkgJDEgYTpsaW51eAorIyBYWFg6IG1heWJlIGNoZWNrIGZvciAibm8gc3BhY2Ugb24gZGV2aWNlIiBlcnJvcnMgaGVyZSB0b28KK2VjaG8gIkZpbmlzaGVkOiBib290IGZsb3BweSBjcmVhdGVkIgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9vdGZsb3BweS9xdWlja3N0YXJ0LnR4dCBiL2V4YW1wbGVzL2Jvb3RmbG9wcHkvcXVpY2tzdGFydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4MDkwOAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb3RmbG9wcHkvcXVpY2tzdGFydC50eHQKQEAgLTAsMCArMSwxNSBAQAorUXVpY2tzdGFydCBvbiBtYWtpbmcgdGhlIEJ1c3lib3ggYm9vdC1mbG9wcHk6CisKKyAgMSkgRG93bmxvYWQgQnVzeWJveCBhbmQgdUNsaWJjIGZyb20gQ1ZTIG9yIHRhcmJhbGxzLiBNYWtlIHN1cmUgdGhleSBzaGFyZSBhCisgICAgIGNvbW1vbiBwYXJlbnQgZGlyZWN0b3J5LiAoaS5lLiBidXN5Ym94LyBhbmQgdWNsaWJjLyBhcmUgYm90aCByaWdodCBvZmYgb2YKKwkgL3RtcCwgb3Igd2hlcmV2ZXIuKQorCisgIDIpIEJ1aWxkIGEgTGludXgga2VybmVsLiBNYWtlIHN1cmUgeW91IGluY2x1ZGUgc3VwcG9ydCBmb3IgaW5pdHJkLgorCisgIDMpIFB1dCBhIGZsb3BweSBpbiB0aGUgZHJpdmUuIE1ha2Ugc3VyZSBpdCBpcyBhIGZsb3BweSB5b3UgZG9uJ3QgY2FyZSBhYm91dAorICAgICBiZWNhdXNlIHRoZSBjb250ZW50cyB3aWxsIGJlIG92ZXJ3cml0dGVuLgorCisgIDQpIEFzIHJvb3QsIHR5cGUgLi9ta3N5c2xpbnV4LnNoIHBhdGgvdG8vbGludXgva2VybmVsIGZyb20gdGhpcyBkaXJlY3RvcnkuCisgICAgIFdhaXQgcGF0aWVudGx5IHdoaWxlIHRoZSBtYWdpYyBoYXBwZW5zLgorCisgIDUpIEJvb3QgdXAgb24gdGhlIGZsb3BweS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb3RmbG9wcHkvc3lzbGludXguY2ZnIGIvZXhhbXBsZXMvYm9vdGZsb3BweS9zeXNsaW51eC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEyNjc3YwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb3RmbG9wcHkvc3lzbGludXguY2ZnCkBAIC0wLDAgKzEsNyBAQAorZGlzcGxheSBkaXNwbGF5LnR4dAorZGVmYXVsdCBsaW51eAordGltZW91dCAxMAorcHJvbXB0IDEKK2xhYmVsIGxpbnV4CisJa2VybmVsIGxpbnV4CisJYXBwZW5kIGluaXRyZD1yb290ZnMuZ3ogcm9vdD0vZGV2L3JhbTAKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2J1c3lib3guc3BlYyBiL2V4YW1wbGVzL2J1c3lib3guc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2QwMDUxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYnVzeWJveC5zcGVjCkBAIC0wLDAgKzEsMTIwIEBACitTdW1tYXJ5OiBTdGF0aWNhbGx5IGxpbmtlZCBiaW5hcnkgcHJvdmlkaW5nIHNpbXBsaWZpZWQgdmVyc2lvbnMgb2Ygc3lzdGVtIGNvbW1hbmRzCitOYW1lOiBidXN5Ym94CitWZXJzaW9uOiAxLjE1LjEKK1JlbGVhc2U6IDElez9kaXN0fQorRXBvY2g6IDEKK0xpY2Vuc2U6IEdQTHYyCitHcm91cDogU3lzdGVtIEVudmlyb25tZW50L1NoZWxscworU291cmNlOiBodHRwOi8vd3d3LmJ1c3lib3gubmV0L2Rvd25sb2Fkcy8le25hbWV9LSV7dmVyc2lvbn0udGFyLmJ6MgorU291cmNlMTogYnVzeWJveC1zdGF0aWMuY29uZmlnCitTb3VyY2UyOiBidXN5Ym94LXBldGl0Ym9vdC5jb25maWcKK1NvdXJjZTM6IGh0dHA6Ly93d3cudWNsaWJjLm9yZy9kb3dubG9hZHMvdUNsaWJjLTAuOS4zMC4xLnRhci5iejIKK1NvdXJjZTQ6IHVDbGliYy5jb25maWcKK1BhdGNoMTY6IGJ1c3lib3gtMS4xMC4xLWh3Y2xvY2sucGF0Y2gKKyMgcGF0Y2ggdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggZ2V0bGluZSgpIGZyb20gc3RkaW8uaCwgYWxyZWFkeSBwcmVzZW50IGluIHVwc3RyZWFtIFZDUworUGF0Y2gyMjogdUNsaWJjLTAuOS4zMC4xLWdldGxpbmUucGF0Y2gKK09ic29sZXRlczogYnVzeWJveC1hbmFjb25kYQorVVJMOiBodHRwOi8vd3d3LmJ1c3lib3gubmV0CitCdWlsZFJvb3Q6ICV7X3RtcHBhdGh9LyV7bmFtZX0tJXt2ZXJzaW9ufS0le3JlbGVhc2V9LXJvb3QtJSgle19faWRfdX0gLW4pCitCdWlsZFJlcXVpcmVzOiBsaWJzZWxpbnV4LWRldmVsID49IDEuMjcuNy0yCitCdWlsZFJlcXVpcmVzOiBsaWJzZXBvbC1kZXZlbAorQnVpbGRSZXF1aXJlczogbGlic2VsaW51eC1zdGF0aWMKK0J1aWxkUmVxdWlyZXM6IGxpYnNlcG9sLXN0YXRpYworQnVpbGRSZXF1aXJlczogZ2xpYmMtc3RhdGljCisKKyVkZWZpbmUgZGVidWdfcGFja2FnZSAle25pbH0KKworJXBhY2thZ2UgcGV0aXRib290CitHcm91cDogU3lzdGVtIEVudmlyb25tZW50L1NoZWxscworU3VtbWFyeTogVmVyc2lvbiBvZiBidXN5Ym94IGNvbmZpZ3VyZWQgZm9yIHVzZSB3aXRoIHBldGl0Ym9vdAorCislZGVzY3JpcHRpb24KK0J1c3lib3ggaXMgYSBzaW5nbGUgYmluYXJ5IHdoaWNoIGluY2x1ZGVzIHZlcnNpb25zIG9mIGEgbGFyZ2UgbnVtYmVyCitvZiBzeXN0ZW0gY29tbWFuZHMsIGluY2x1ZGluZyBhIHNoZWxsLiAgVGhpcyBwYWNrYWdlIGNhbiBiZSB2ZXJ5Cit1c2VmdWwgZm9yIHJlY292ZXJpbmcgZnJvbSBjZXJ0YWluIHR5cGVzIG9mIHN5c3RlbSBmYWlsdXJlcywKK3BhcnRpY3VsYXJseSB0aG9zZSBpbnZvbHZpbmcgYnJva2VuIHNoYXJlZCBsaWJyYXJpZXMuCisKKyVkZXNjcmlwdGlvbiBwZXRpdGJvb3QKK0J1c3lib3ggaXMgYSBzaW5nbGUgYmluYXJ5IHdoaWNoIGluY2x1ZGVzIHZlcnNpb25zIG9mIGEgbGFyZ2UgbnVtYmVyCitvZiBzeXN0ZW0gY29tbWFuZHMsIGluY2x1ZGluZyBhIHNoZWxsLiAgVGhlIHZlcnNpb24gY29udGFpbmVkIGluIHRoaXMKK3BhY2thZ2UgaXMgYSBtaW5pbWFsIGNvbmZpZ3VyYXRpb24gaW50ZW5kZWQgZm9yIHVzZSB3aXRoIHRoZSBQZXRpdGJvb3QKK2Jvb3Rsb2FkZXIgdXNlZCBvbiBQbGF5U3RhdGlvbiAzLiBUaGUgYnVzeWJveCBwYWNrYWdlIHByb3ZpZGVzIGEgYmluYXJ5CitiZXR0ZXIgc3VpdGVkIHRvIG5vcm1hbCB1c2UuCisKKyVwcmVwCislc2V0dXAgLXEgLWEzCislcGF0Y2gxNiAtYiAuaWE2NCAtcDEKK2NhdCAle1NPVVJDRTR9ID51Q2xpYmMtMC45LjMwLjEvLmNvbmZpZzEKKyVwYXRjaDIyIC1iIC5nZXRsaW5lIC1wMQorCislYnVpbGQKKyMgY3JlYXRlIHN0YXRpYyBidXN5Ym94IC0gdGhlIGV4ZWN1dGFibGUgaXMga2VwdCBhcyBidXN5Ym94LXN0YXRpYworIyBXZSB1c2UgdWNsaWJjIGluc3RlYWQgb2Ygc3lzdGVtIGdsaWJjLCB1Y2xpYmMgaXMgc2V2ZXJhbCB0aW1lcworIyBzbWFsbGVyLCB0aGlzIGlzIGltcG9ydGFudCBmb3Igc3RhdGljIGJ1aWxkLgorIyBCdWlsZCB1Y2xpYmMgZmlyc3QuCitjZCB1Q2xpYmMtMC45LjMwLjEKKyMgZml4bWU6Citta2RpciBrZXJuZWwtaW5jbHVkZQorY3AgLWEgL3Vzci9pbmNsdWRlL2FzbSBrZXJuZWwtaW5jbHVkZQorY3AgLWEgL3Vzci9pbmNsdWRlL2FzbS1nZW5lcmljIGtlcm5lbC1pbmNsdWRlCitjcCAtYSAvdXNyL2luY2x1ZGUvbGludXgga2VybmVsLWluY2x1ZGUKKyMgdWNsaWJjIGNhbid0IGJlIGJ1aWx0IG9uIHBwYzY0LHMzOTAsaWE2NCwgd2Ugc2V0ICRhcmNoIHRvICIiIGluIHRoaXMgY2FzZQorYXJjaD1gdW5hbWUgLW0gfCBzZWQgLWUgJ3MvaS44Ni9pMzg2LycgLWUgJ3MvcHBjL3Bvd2VycGMvJyAtZSAncy9wcGM2NC8vJyAtZSAncy9wb3dlcnBjNjQvLycgLWUgJ3MvaWE2NC8vJyAtZSAncy9zMzkwLiovLydgCitlY2hvICJUQVJHRVRfJGFyY2g9eSIgPi5jb25maWcKK2VjaG8gIlRBUkdFVF9BUkNIPVwiJGFyY2hcIiIgPj4uY29uZmlnCitjYXQgLmNvbmZpZzEgPj4uY29uZmlnCitpZiB0ZXN0ICIkYXJjaCI7IHRoZW4geWVzICIiIHwgbWFrZSBvbGRjb25maWc7IGZpCitpZiB0ZXN0ICIkYXJjaCI7IHRoZW4gY2F0IC5jb25maWc7IGZpCitpZiB0ZXN0ICIkYXJjaCI7IHRoZW4gbWFrZSBWPTE7IGZpCitpZiB0ZXN0ICIkYXJjaCI7IHRoZW4gbWFrZSBpbnN0YWxsOyBmaQoraWYgdGVzdCAiJGFyY2giOyB0aGVuIG1ha2UgaW5zdGFsbF9rZXJuZWxfaGVhZGVyczsgZmkKK2NkIC4uCisjIHdlIGFyZSBiYWNrIGluIGJ1c3lib3gtTk4uTU0gZGlyIG5vdworY3AgJXtTT1VSQ0UxfSAuY29uZmlnCisjIHNldCBhbGwgbmV3IG9wdGlvbnMgdG8gZGVmYXVsdHMKK3llcyAiIiB8IG1ha2Ugb2xkY29uZmlnCisjIGdjYyBuZWVkcyB0byBiZSBjb252aW5jZWQgdG8gdXNlIG5laXRoZXIgc3lzdGVtIGhlYWRlcnMsIG5vciBsaWJzLAorIyBub3Igc3RhcnRmaWxlcyAoaS5lLiBjcnRYWFgubyBmaWxlcykKK2lmIHRlc3QgIiRhcmNoIjsgdGhlbiBcCisgICAgbXYgLmNvbmZpZyAuY29uZmlnMSAmJiBcCisgICAgZ3JlcCAtdiBeQ09ORklHX1NFTElOVVggLmNvbmZpZzEgPi5jb25maWcgJiYgXAorICAgIHllcyAiIiB8IG1ha2Ugb2xkY29uZmlnICYmIFwKKyAgICBjYXQgLmNvbmZpZyAmJiBcCisgICAgbWFrZSBWPTEgXAorICAgICAgICBFWFRSQV9DRkxBR1M9Ii1pc3lzdGVtIHVDbGliYy0wLjkuMzAuMS9pbnN0YWxsZWQvaW5jbHVkZSIgXAorICAgICAgICBDRkxBR1NfYnVzeWJveD0iLXN0YXRpYyAtbm9zdGFydGZpbGVzIC1MdUNsaWJjLTAuOS4zMC4xL2luc3RhbGxlZC9saWIgdUNsaWJjLTAuOS4zMC4xL2luc3RhbGxlZC9saWIvY3J0MS5vIHVDbGliYy0wLjkuMzAuMS9pbnN0YWxsZWQvbGliL2NydGkubyB1Q2xpYmMtMC45LjMwLjEvaW5zdGFsbGVkL2xpYi9jcnRuLm8iOyBcCitlbHNlIFwKKyAgICBjYXQgLmNvbmZpZyAmJiBcCisgICAgbWFrZSBWPTEgQ0M9ImdjYyAkUlBNX09QVF9GTEFHUyI7IFwKK2ZpCitjcCBidXN5Ym94IGJ1c3lib3guc3RhdGljCisKKyMgY3JlYXRlIGJ1c3lib3ggb3B0aW1pemVkIGZvciBwZXRpdGJvb3QKK21ha2UgY2xlYW4KKyMgY29weSBuZXcgY29uZmlndXJhdGlvbiBmaWxlCitjcCAle1NPVVJDRTJ9IC5jb25maWcKKyMgc2V0IGFsbCBuZXcgb3B0aW9ucyB0byBkZWZhdWx0cworeWVzICIiIHwgbWFrZSBvbGRjb25maWcKK21ha2UgVj0xIENDPSIlX19jYyAkUlBNX09QVF9GTEFHUyIKK2NwIGJ1c3lib3ggYnVzeWJveC5wZXRpdGJvb3QKKworJWluc3RhbGwKK3JtIC1yZiAkUlBNX0JVSUxEX1JPT1QKK21rZGlyIC1wICRSUE1fQlVJTERfUk9PVC9zYmluCitpbnN0YWxsIC1tIDc1NSBidXN5Ym94LnN0YXRpYyAkUlBNX0JVSUxEX1JPT1Qvc2Jpbi9idXN5Ym94CitpbnN0YWxsIC1tIDc1NSBidXN5Ym94LnBldGl0Ym9vdCAkUlBNX0JVSUxEX1JPT1Qvc2Jpbi9idXN5Ym94LnBldGl0Ym9vdAorCislY2xlYW4KK3JtIC1yZiAkUlBNX0JVSUxEX1JPT1QKKworJWZpbGVzCislZGVmYXR0cigtLHJvb3Qscm9vdCwtKQorJWRvYyBMSUNFTlNFIGRvY3MvYnVzeWJveC5uZXQvKi5odG1sCisvc2Jpbi9idXN5Ym94CisKKyVmaWxlcyBwZXRpdGJvb3QKKyVkZWZhdHRyKC0scm9vdCxyb290LC0pCislZG9jIExJQ0VOU0UKKy9zYmluL2J1c3lib3gucGV0aXRib290CisKKyVjaGFuZ2Vsb2cKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2RlcG1vZCBiL2V4YW1wbGVzL2RlcG1vZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNzY5NTkwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZGVwbW9kCkBAIC0wLDAgKzEsNTcgQEAKKyMhL2Jpbi9zaAorIworIyBTaW1wbGUgZGVwbW9kLCB1c2UgdG8gZ2VuZXJhdGUgbW9kcHJvYmUuY29uZgorIworIyBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorIworCitsb2NhbCBCQVNFPSIkezE6LS91c3IvbGliL21vZHVsZXN9IgorCitmaW5kICIkQkFTRSIgLW5hbWUgJyoua28uZ3onIHwgd2hpbGUgcmVhZCBJIDsgZG8KKwlOPWBiYXNlbmFtZSAiJEkiICcua28uZ3onYAorCWVjaG8gLW4gIkAkTiIKKwl6Y2F0ICIkSSIgfCBzdHJpbmdzIHwgZ3JlcCAnXmRlcGVuZHM9JyB8IHNlZCAtZSAncy9eZGVwZW5kcz0kLy8nIC1lICdzL15kZXBlbmRzPS8sLycgLWUgJ3MvLC8gQC9nJworZG9uZSB8IGF3ayAnCit7CisJIyBtb2R1bGVzIHdoaWNoIGhhcyBubyBkZXBlbmRlbmNpZXMgYXJlIHJlc29sdmVkCisJaWYgKCBORiA9PSAxICkgeyByZXNbJDFdID0gIiI7IG5leHQgfQorCSMgb3RoZXJzIGhhdmUgdG8gYmUgcmVzb2x2ZWQgYmFzZWQgb24gdGhvc2Ugd2hpY2ggYWxyZWFkeSByZXNvbHZlZAorCWkgPSAkMTsgJDEgPSAiIjsgZGVwc1tpXSA9ICQwOyArK25kZXBzCit9CitFTkQgeworCSMgcmVzb2x2ZSBpbXBsaWNpdCBkZXBlbmRlbmNpZXMKKwl3aGlsZSAoIG5kZXBzICkgZm9yIChtb2QgaW4gZGVwcykgeworCQlpZiAoIGluZGV4KGRlcHNbbW9kXSwgIkAiKSA+IDAgKSB7CisJCQkkMCA9IGRlcHNbbW9kXQorCQkJZm9yICggaT0xOyBpPD1ORjsgKytpICkgeworCQkJCWlmICggc3Vic3RyKCRpLDEsMSkgPT0gIkAiICkgeworCQkJCQlpZiAoICRpIGluIHJlcyApIHsKKwkJCQkJCSRpID0gcmVzWyRpXSAiICIgc3Vic3RyKCRpLDIpCisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlkZXBzW21vZF0gPSAkMAorCQl9IGVsc2UgeworCQkJcmVzW21vZF0gPSBkZXBzW21vZF0KKwkJCWRlbGV0ZSBkZXBzW21vZF0KKwkJCS0tbmRlcHMKKwkJfQorCX0KKworCSMgb3V0cHV0IGRlcGVuZGVuY2llcyBpbiBtb2R1bGVzLmRlcCBmb3JtYXQKKwlmb3IgKCBtb2QgaW4gcmVzICkgeworCQkkMCA9IHJlc1ttb2RdCisJCXMgPSAiIgorCQlkZWxldGUgYQorCQlmb3IgKCBpPTE7IGk8PU5GOyArK2kgKSB7CisJCQlpZiAoICEgKCRpIGluIGEpICkgeworCQkJCWFbJGldID0gJGkKKwkJCQlzID0gIiAsIiAkaSBzCisJCQl9CisJCX0KKwkJcHJpbnQgIiwiIHN1YnN0cihtb2QsMikgIjoiIHMKKwl9Cit9CisnIHwgc29ydCB8IHNlZCAtciAtZSAicyEsKFteLDogXSopIS91c3IvbGliL21vZHVsZXMvXFwxLmtvLmd6IWciCmRpZmYgLS1naXQgYS9leGFtcGxlcy9kZXBtb2QucGwgYi9leGFtcGxlcy9kZXBtb2QucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODA5ZGMwOAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2RlcG1vZC5wbApAQCAtMCwwICsxLDM1MyBAQAorIyEvdXNyL2Jpbi9wZXJsIC13CisjIHZpOiBzZXQgc3c9NCB0cz00OgorIyBDb3B5cmlnaHQgKGMpIDIwMDEgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisjIENvcHlyaWdodCAoYykgMjAwMSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjIENvcHlyaWdodCAoYykgMjAwMSBTdHVhcnQgSHVnaGVzIDxzZWhAemVlMi5jb20+CisjIENvcHlyaWdodCAoYykgMjAwMiBTdGV2ZW4gSi4gSGlsbCA8c2hpbGxAYnJvYWRjb20uY29tPgorIyBDb3B5cmlnaHQgKGMpIDIwMDYgRnJlZXNjYWxlIFNlbWljb25kdWN0b3IsIEluYyA8c3R1YXJ0aEBmcmVlc2NhbGUuY29tPgorIworIyBIaXN0b3J5OgorIyBNYXJjaCAyMDA2OiBTdHVhcnQgSHVnaGVzIDxzdHVhcnRoQGZyZWVzY2FsZS5jb20+LgorIyAgICAgICAgICAgICBTaWduaWZpY2FudCB1cGRhdGVzLCBpbmNsdWRpbmcgaW1wbGVtZW50aW5nIHRoZSAnLUYnIG9wdGlvbgorIyAgICAgICAgICAgICBhbmQgYWRkaW5nIHN1cHBvcnQgZm9yIDIuNiBrZXJuZWxzLgorCisjIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisjIHVuZGVyIHRoZSBzYW1lIHRlcm1zIGFzIFBlcmwgaXRzZWxmLgordXNlIEdldG9wdDo6TG9uZyBxdyg6Y29uZmlnIG5vX2F1dG9fYWJicmV2IG5vX2lnbm9yZV9jYXNlKTsKK3VzZSBGaWxlOjpGaW5kOwordXNlIHN0cmljdDsKKworIyBTZXQgdXAgc29tZSBkZWZhdWx0IHZhbHVlcworbXkgJGtkaXI9IiI7CitteSAkYmFzZWRpcj0iIjsKK215ICRrZXJuZWw9IiI7CitteSAka2VybmVsc3ltcz0iIjsKK215ICRzeW1wcmVmaXg9IiI7CitteSAkYWxsPTA7CitteSAkcXVpY2s9MDsKK215ICRlcnJzeW1zPTA7CitteSAkc3Rkb3V0PTA7CitteSAkdmVyYm9zZT0wOworbXkgJGhlbHA9MDsKK215ICRubSA9ICRFTlZ7J05NJ30gfHwgIm5tIjsKKworIyBtb3JlIGdsb2JhbHMKK215IChAbGlibGlzdCkgPSAoKTsKK215ICRleHAgPSB7fTsKK215ICRkZXAgPSB7fTsKK215ICRtb2QgPSB7fTsKKworbXkgJHVzYWdlID0gPDxUWFQ7CiskMCAtYiBiYXNlZGlyIHsgLWsgPHZtbGludXg+IHwgLUYgPFN5c3RlbS5tYXA+IH0gW29wdGlvbnNdLi4uCisgIFdoZXJlOgorICAgLWggLS1oZWxwICAgICAgICAgIDogU2hvdyB0aGlzIGhlbHAgc2NyZWVuCisgICAtYiAtLWJhc2VkaXIgICAgICAgOiBNb2R1bGVzIGJhc2UgZGlyZWN0b3J5IChlLmcgL2xpYi9tb2R1bGVzLzwyLngueT4pCisgICAtayAtLWtlcm5lbCAgICAgICAgOiBLZXJuZWwgYmluYXJ5IGZvciB0aGUgdGFyZ2V0IChlLmcuIHZtbGludXgpCisgICAtRiAtLWtlcm5lbHN5bXMgICAgOiBLZXJuZWwgc3ltYm9sIGZpbGUgKGUuZy4gU3lzdGVtLm1hcCkKKyAgIC1uIC0tc3Rkb3V0ICAgICAgICA6IFdyaXRlIHRvIHN0ZG91dCBpbnN0ZWFkIG9mIDxiYXNlZGlyPi9tb2R1bGVzLmRlcAorICAgLXYgLS12ZXJib3NlICAgICAgIDogUHJpbnQgb3V0IGxvdHMgb2YgZGVidWdnaW5nIHN0dWZmCisgICAtUCAtLXN5bWJvbC1wcmVmaXggOiBTeW1ib2wgcHJlZml4CisgICAtYSAtLWFsbCAgICAgICAgICAgOiBQcm9iZSBhbGwgbW9kdWxlcyAoZGVmYXVsdC9vbmx5IHRoaW5nIHN1cHBvcnRlZCkKKyAgIC1lIC0tZXJyc3ltcyAgICAgICA6IFJlcG9ydCBhbnkgc3ltYm9scyBub3Qgc3VwcGxpZWQgYnkgbW9kdWxlcy9rZXJuZWwKK1RYVAorCisjIGdldCBjb21tYW5kLWxpbmUgb3B0aW9ucworR2V0T3B0aW9ucygKKwkiaGVscHxoIiAgICAgICAgICAgID0+IFwkaGVscCwKKwkiYmFzZWRpcnxiPXMiICAgICAgID0+IFwkYmFzZWRpciwKKwkia2VybmVsfGs9cyIgICAgICAgID0+IFwka2VybmVsLAorCSJrZXJuZWxzeW1zfEY9cyIgICAgPT4gXCRrZXJuZWxzeW1zLAorCSJzdGRvdXR8biIgICAgICAgICAgPT4gXCRzdGRvdXQsCisJInZlcmJvc2V8diIgICAgICAgICA9PiBcJHZlcmJvc2UsCisJInN5bWJvbC1wcmVmaXh8UD1zIiA9PiBcJHN5bXByZWZpeCwKKwkiYWxsfGEiICAgICAgICAgICAgID0+IFwkYWxsLAorCSMgdW5zdXBwb3J0ZWQgb3B0aW9ucworCSJxdWlja3xBIiAgICAgICAgICAgPT4gXCRxdWljaywKKwkjIGlnbm9yZWQgb3B0aW9ucyAoZm9yIGhpc3RvcmljYWwgdXNhZ2UpCisJInF1aWV0fHEiLAorCSJyb290fHIiLAorCSJ1bnJlc29sdmVkLWVycm9yfHUiCispOworCitkaWUgJHVzYWdlIGlmICRoZWxwOworZGllICR1c2FnZSB1bmxlc3MgJGJhc2VkaXIgJiYgKCAka2VybmVsIHx8ICRrZXJuZWxzeW1zICk7CitkaWUgImNhbid0IHVzZSBib3RoIC1rIGFuZCAtRlxuXG4kdXNhZ2UiIGlmICRrZXJuZWwgJiYgJGtlcm5lbHN5bXM7CitkaWUgInNvcnJ5LCAtQS8tLXF1aWNrIGlzIG5vdCBzdXBwb3J0ZWQiIGlmICRxdWljazsKK2RpZSAiLS1lcnJzeW1zIHJlcXVpcmVzIC0ta2VybmVsc3ltcyIgaWYgJGVycnN5bXMgJiYgISRrZXJuZWxzeW1zOworCisjIFN0cmlwIGFueSB0cmFpbGluZyBvciBtdWx0aXBsZSBzbGFzaGVzIGZyb20gYmFzZWRpcgorJGJhc2VkaXIgPX4gcy0vKyQtLWc7CisKKyMgVGhlIGJhc2UgZGlyZWN0b3J5IHNob3VsZCBjb250YWluIC9saWIvbW9kdWxlcyBzb21ld2hlcmUKK2lmKCRiYXNlZGlyICF+IG0tL2xpYi9tb2R1bGVzLSkgeworICAgIHdhcm4gIldBUk5JTkc6IGJhc2UgZGlyZWN0b3J5IGRvZXMgbm90IG1hdGNoIC4uLi4vbGliL21vZHVsZXNcbiI7Cit9CisKKyMgaWYgbm8ga2VybmVsIHZlcnNpb24gaXMgY29udGFpbmVkIGluIHRoZSBiYXNlZGlyLCB0cnkgdG8gZmluZCBvbmUKK2lmKCRiYXNlZGlyICF+IG0tL2xpYi9tb2R1bGVzL1xkXC5cZC0pIHsKKyAgICBvcGVuZGlyKEJELCAkYmFzZWRpcikgb3IgZGllICJjYW4ndCBvcGVuIGJhc2VkaXIgJGJhc2VkaXIgOiAkIVxuIjsKKyAgICBmb3JlYWNoICggcmVhZGRpcihCRCkgKSB7CisgICAgICAgIG5leHQgaWYgL15cLlwuPyQvOworICAgICAgICBuZXh0IHVubGVzcyAtZCAiJGJhc2VkaXIvJF8iOworICAgICAgICB3YXJuICJkaXIgPSAkX1xuIiBpZiAkdmVyYm9zZTsKKyAgICAgICAgaWYoIC9eXGRcLlxkLyApIHsKKyAgICAgICAgICAgICRrZGlyID0gJF87CisgICAgICAgICAgICB3YXJuKCJHdWVzc2VkIG1vZHVsZSBkaXJlY3RvcnkgYXMgJGJhc2VkaXIvJGtkaXJcbiIpOworICAgICAgICAgICAgbGFzdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBjbG9zZWRpcihCRCk7CisgICAgZGllICJDYW5ub3QgZmluZCBhIGtlcm5lbCB2ZXJzaW9uIHVuZGVyICRiYXNlZGlyXG4iIHVubGVzcyAka2RpcjsKKyAgICAkYmFzZWRpciA9ICIkYmFzZWRpci8ka2RpciI7Cit9CisKKyMgRmluZCB0aGUgbGlzdCBvZiAubyBvciAua28gZmlsZXMgbGl2aW5nIHVuZGVyICRiYXNlZGlyCit3YXJuICIqKioqIExvY2F0aW5nIGFsbCBtb2R1bGVzXG4iIGlmICR2ZXJib3NlOworZmluZCBzdWIgeworICAgIG15ICRmaWxlOworCWlmICggLWYgJF8gICYmICEgLWQgJF8gKSB7CisJCSRmaWxlID0gJEZpbGU6OkZpbmQ6Om5hbWU7CisJCWlmICggJGZpbGUgPX4gL1wuaz9vJC8gKSB7CisJCQlwdXNoKEBsaWJsaXN0LCAkZmlsZSk7CisJCQl3YXJuICIkZmlsZVxuIiBpZiAkdmVyYm9zZTsKKwkJfQorCX0KK30sICRiYXNlZGlyOword2FybiAiKioqKiBGaW5pc2hlZCBsb2NhdGluZyBtb2R1bGVzXG4iIGlmICR2ZXJib3NlOworCitmb3JlYWNoIG15ICRvYmogKCBAbGlibGlzdCApeworICAgICMgdHVybiB0aGUgaW5wdXQgZmlsZSBuYW1lIGludG8gYSB0YXJnZXQgdGFnIG5hbWUKKyAgICBteSAoJHRndG5hbWUpID0gJG9iaiA9fiBtLSgvbGliL21vZHVsZXMvLiopJC07CisKKyAgICB3YXJuICJcbk1PRFVMRSA9ICR0Z3RuYW1lXG4iIGlmICR2ZXJib3NlOworCisgICAgIyBnZXQgYSBsaXN0IG9mIHN5bWJvbHMKKwlteSBAb3V0cHV0PWAkbm0gJG9iamA7CisKKyAgICBidWlsZF9yZWZfdGFibGVzKCR0Z3RuYW1lLCBcQG91dHB1dCwgJGV4cCwgJGRlcCk7Cit9CisKKworIyB2bWxpbnV4IGlzIGEgc3BlY2lhbCBuYW1lIHRoYXQgaXMgb25seSB1c2VkIHRvIHJlc29sdmUgc3ltYm9scworbXkgJHRndG5hbWUgPSAndm1saW51eCc7CitteSBAb3V0cHV0ID0gJGtlcm5lbHN5bXMgPyBgY2F0ICRrZXJuZWxzeW1zYCA6IGAkbm0gJGtlcm5lbGA7Cit3YXJuICJcbk1PRFVMRSA9ICR0Z3RuYW1lXG4iIGlmICR2ZXJib3NlOworYnVpbGRfcmVmX3RhYmxlcygkdGd0bmFtZSwgXEBvdXRwdXQsICRleHAsICRkZXApOworCisjIHJlc29sdmUgdGhlIGRlcGVuZGVuY2llcyBmb3IgZWFjaCBtb2R1bGUKKyMgcmVkdWNlIGRlcGVuZGVuY2llczogcmVtb3ZlIHVucmVzb2x2YWJsZSBhbmQgcmVzb2x2ZWQgZnJvbSB2bWxpbnV4L1N5c3RlbS5tYXAKKyMgcmVtb3ZlIGR1cGxpY2F0ZXMKK2ZvcmVhY2ggbXkgJG1vZHVsZSAoa2V5cyAlJGRlcCkgeworICAgIHdhcm4gInJlZHVjaW5nIG1vZHVsZTogJG1vZHVsZVxuIiBpZiAkdmVyYm9zZTsKKyAgICAkbW9kLT57JG1vZHVsZX0gPSB7fTsKKyAgICBmb3JlYWNoIChAeyRkZXAtPnskbW9kdWxlfX0pIHsKKyAgICAgICAgaWYoICRleHAtPnskX30gKSB7CisgICAgICAgICAgICB3YXJuICJyZXNvbHZlZCBzeW1ib2wgJF8gaW4gZmlsZSAkZXhwLT57JF99XG4iIGlmICR2ZXJib3NlOworICAgICAgICAgICAgbmV4dCBpZiAkZXhwLT57JF99ID1+IC92bWxpbnV4LzsKKyAgICAgICAgICAgICRtb2QtPnskbW9kdWxlfXskZXhwLT57JF99fSA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3YXJuICJ1bnJlc29sdmVkIHN5bWJvbCAkXyBpbiBmaWxlICRtb2R1bGVcbiI7CisgICAgICAgIH0KKyAgICB9Cit9CisKKyMgYnVpbGQgYSBjb21wbGV0ZSBkZXBlbmRlbmN5IGxpc3QgZm9yIGVhY2ggbW9kdWxlIGFuZCBtYWtlIHN1cmUgaXQKKyMgaXMga2VwdCBpbiBvcmRlciBwcm9wZXIgb3JkZXIKK215ICRtb2QyID0ge307CitzdWIgbWF5YmVfdW5zaGlmdAoreworCW15ICgkYXJyYXksICRlbGUpID0gQF87CisJIyBjaG9wIG9mZiB0aGUgbGVhZGluZyBwYXRoIC9saWIvbW9kdWxlcy88a3Zlcj4vIGFzIG1vZHByb2JlCisJIyB3aWxsIGhhbmRsZSByZWxhdGl2ZSBwYXRocyBqdXN0IGZpbmUKKwkkZWxlID1+IHM6Xi9saWIvbW9kdWxlcy9bXi9dKi86OjsKKwlmb3JlYWNoIChAeyRhcnJheX0pIHsKKwkJaWYgKCRfIGVxICRlbGUpIHsKKwkJCXJldHVybjsKKwkJfQorCX0KKwl1bnNoaWZ0IChAeyRhcnJheX0sICRlbGUpOworfQorc3ViIGFkZF9tb2RfZGVwcworeworCW15ICgkZGVwdGgsICRtb2QsICRtb2QyLCAkbW9kdWxlLCAkdGhpc19tb2R1bGUpID0gQF87CisKKwkkZGVwdGggLj0gIiAiOworCXdhcm4gIiR7ZGVwdGh9bG9hZGluZyBkZXBzIG9mIG1vZHVsZTogJHRoaXNfbW9kdWxlXG4iIGlmICR2ZXJib3NlOworCWlmIChsZW5ndGgoJGRlcHRoKSA+IDUwKSB7CisJCWRpZSAidG9vIG11Y2ggcmVjdXJzaW9uIChjaXJjdWxhciBkZXBlbmRlbmNpZXMgaW4gbW9kdWxlcz8pIjsKKwl9CisKKwlmb3JlYWNoIG15ICRtZCAoa2V5cyAleyRtb2QtPnskdGhpc19tb2R1bGV9fSkgeworCQlhZGRfbW9kX2RlcHMgKCRkZXB0aCwgJG1vZCwgJG1vZDIsICRtb2R1bGUsICRtZCk7CisJCXdhcm4gIiR7ZGVwdGh9IG91dHB1dHRpbmcgJG1kXG4iIGlmICR2ZXJib3NlOworCQltYXliZV91bnNoaWZ0IChcQHskJG1vZDItPnskbW9kdWxlfX0sICRtZCk7CisJfQorCisJaWYgKCEleyRtb2QtPnskdGhpc19tb2R1bGV9fSkgeworCQl3YXJuICIke2RlcHRofSBubyBkZXBzXG4iIGlmICR2ZXJib3NlOworCX0KK30KK2ZvcmVhY2ggbXkgJG1vZHVsZSAoa2V5cyAlJG1vZCkgeworCXdhcm4gImZpbGxpbmcgb3V0IG1vZHVsZTogJG1vZHVsZVxuIiBpZiAkdmVyYm9zZTsKKwlAeyRtb2QyLT57JG1vZHVsZX19ID0gKCk7CisJYWRkX21vZF9kZXBzICgiIiwgJG1vZCwgXCRtb2QyLCAkbW9kdWxlLCAkbW9kdWxlKTsKK30KKworIyBmaWd1cmUgb3V0IHdoZXJlIHRoZSBvdXRwdXQgc2hvdWxkIGdvCitpZiAoJHN0ZG91dCA9PSAwKSB7CisJd2FybiAid3JpdGluZyAkYmFzZWRpci9tb2R1bGVzLmRlcFxuIiBpZiAkdmVyYm9zZTsKKyAgICBvcGVuKFNURE9VVCwgIj4kYmFzZWRpci9tb2R1bGVzLmRlcCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGRpZSAiY2Fubm90IG9wZW4gJGJhc2VkaXIvbW9kdWxlcy5kZXA6ICQhIjsKK30KK215ICRrc2VyaWVzID0gJGJhc2VkaXIgPX4gbSwvMlwuNFwuW14vXSosID8gJzIuNCcgOiAnb3RoZXJzJzsKKworZm9yZWFjaCBteSAkbW9kdWxlICgga2V5cyAlJG1vZCApIHsKKyAgICBpZigka3NlcmllcyBlcSAnMi40JykgeworCSAgICBwcmludCAiJG1vZHVsZTpcdCI7CisJICAgIG15IEBzb3J0ZWQgPSBzb3J0IGJ5ZGVwIGtleXMgJXskbW9kLT57JG1vZHVsZX19OworCSAgICBwcmludCBqb2luKCIgXFxcblx0IixAc29ydGVkKTsKKwkgICAgcHJpbnQgIlxuXG4iOworICAgIH0gZWxzZSB7CisJICAgIG15ICRzaG9ydG1vZCA9ICRtb2R1bGU7CisJICAgICRzaG9ydG1vZCA9fiBzOl4vbGliL21vZHVsZXMvW14vXSovOjo7CisJICAgIHByaW50ICIkc2hvcnRtb2Q6IjsKKwkgICAgbXkgQHNvcnRlZCA9IEB7JG1vZDItPnskbW9kdWxlfX07CisJICAgIHByaW50ZiAiICIgaWYgQHNvcnRlZDsKKwkgICAgcHJpbnQgam9pbigiICIsQHNvcnRlZCk7CisJICAgIHByaW50ICJcbiI7CisgICAgfQorfQorCisKK3N1YiBidWlsZF9yZWZfdGFibGVzCit7CisgICAgbXkgKCRuYW1lLCAkc3ltX2FyLCAkZXhwLCAkZGVwKSA9IEBfOworCisJbXkgJGtzeW10YWIgPSBncmVwIG0vICR7c3ltcHJlZml4fV9fa3N5bXRhYi8sIEAkc3ltX2FyOworCisgICAgIyBnYXRoZXIgdGhlIGV4cG9ydGVkIHN5bWJvbHMKKwlpZigka3N5bXRhYil7CisgICAgICAgICMgZXhwbGljaXRseSBleHBvcnRlZAorICAgICAgICBmb3JlYWNoICggQCRzeW1fYXIgKSB7CisgICAgICAgICAgICAvICR7c3ltcHJlZml4fV9fa3N5bXRhYl8oLiopJC8gYW5kIGRvIHsKKyAgICAgICAgICAgICAgICBteSAkc3ltID0gJHtzeW1wcmVmaXh9IC4gJDE7CisgICAgICAgICAgICAgICAgd2FybiAic3ltID0gJHN5bVxuIiBpZiAkdmVyYm9zZTsKKyAgICAgICAgICAgICAgICAkZXhwLT57JHN5bX0gPSAkbmFtZTsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKwl9IGVsc2UgeworICAgICAgICAjIGV4cG9ydGluZyBhbGwgc3ltYm9scworICAgICAgICBmb3JlYWNoICggQCRzeW1fYXIgKSB7CisgICAgICAgICAgICAvIFtBQkNER1JTVFddICguKikkLyBhbmQgZG8geworICAgICAgICAgICAgICAgIHdhcm4gInN5bWEgPSAkMVxuIiBpZiAkdmVyYm9zZTsKKyAgICAgICAgICAgICAgICAkZXhwLT57JDF9ID0gJG5hbWU7CisgICAgICAgICAgICB9OworICAgICAgICB9CisJfQorCisgICAgIyB0aGlzIHRha2VzIG1ha2VzIHN1cmUgbW9kdWxlcyB3aXRoIG5vIGRlcGVuZGVuY2llcyBnZXQgbGlzdGVkCisgICAgcHVzaCBAeyRkZXAtPnskbmFtZX19LCAkc3ltcHJlZml4IC4gJ3ByaW50aycgdW5sZXNzICRuYW1lIGVxICd2bWxpbnV4JzsKKworICAgICMgZ2F0aGVyIHRoZSB1bnJlc29sdmVkIHN5bWJvbHMKKyAgICBmb3JlYWNoICggQCRzeW1fYXIgKSB7CisgICAgICAgICEvICR7c3ltcHJlZml4fV9fdGhpc19tb2R1bGUvICYmIC8gVSAoLiopJC8gYW5kIGRvIHsKKyAgICAgICAgICAgIHdhcm4gInVuZCA9ICQxXG4iIGlmICR2ZXJib3NlOworICAgICAgICAgICAgcHVzaCBAeyRkZXAtPnskbmFtZX19LCAkMTsKKyAgICAgICAgfTsKKyAgICB9Cit9CisKK3N1YiBieWRlcAoreworICAgIGZvcmVhY2ggbXkgJGYgKCBrZXlzICV7JG1vZC0+eyRifX0gKSB7CisgICAgICAgIGlmKCRmIGVxICRhKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLTE7Cit9CisKKworCitfX0VORF9fCisKKz1oZWFkMSBOQU1FCisKK2RlcG1vZC5wbCAtIGEgY3Jvc3MgcGxhdGZvcm0gc2NyaXB0IHRvIGdlbmVyYXRlIGtlcm5lbCBtb2R1bGUKK2RlcGVuZGVuY3kgbGlzdHMgKG1vZHVsZXMuY29uZikgd2hpY2ggY2FuIHRoZW4gYmUgdXNlZCBieSBtb2Rwcm9iZQorb24gdGhlIHRhcmdldCBwbGF0Zm9ybS4KKworSXQgc3VwcG9ydHMgTGludXggMi40IGFuZCAyLjYgc3R5bGVzIG9mIG1vZHVsZXMuY29uZiAoYXV0by1kZXRlY3RlZCkKKworPWhlYWQxIFNZTk9QU0lTCisKK2RlcG1vZC5wbCBbT1BUSU9OXS4uLiBbYmFzZWRpcl0uLi4KKworRXhhbXBsZToKKworCWRlcG1vZC5wbCAtRiBsaW51eC9TeXN0ZW0ubWFwIC1iIHRhcmdldC9saWIvbW9kdWxlcy8yLjYuMTEKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoZSBwdXJwb3NlIG9mIHRoaXMgc2NyaXB0IGlzIHRvIGF1dG9tYWdpY2FsbHkgZ2VuZXJhdGUgYSBsaXN0IG9mIG9mIGtlcm5lbAorbW9kdWxlIGRlcGVuZGVuY2llcy4gIFRoaXMgc2NyaXB0IHByb2R1Y2VzIGRlcGVuZGVuY3kgbGlzdHMgdGhhdCBzaG91bGQgYmUKK2lkZW50aWNhbCB0byB0aGUgZGVwbW9kIHByb2dyYW0gZnJvbSB0aGUgbW9kdXRpbHMgcGFja2FnZS4gIFVubGlrZSB0aGUgZGVwbW9kCitiaW5hcnksIGhvd2V2ZXIsIGRlcG1vZC5wbCBpcyBkZXNpZ25lZCB0byBiZSBydW4gb24geW91ciBob3N0IHN5c3RlbSwgbm90CitvbiB5b3VyIHRhcmdldCBzeXN0ZW0uCisKK1RoaXMgc2NyaXB0IHdhcyB3cml0dGVuIGJ5IERhdmlkIFNjaGxlZWYgPGRzQHNjaGxlZWYub3JnPiB0byBiZSB1c2VkIGluCitjb25qdW5jdGlvbiB3aXRoIHRoZSBCdXN5Qm94IG1vZHByb2JlIGFwcGxldC4KKworPWhlYWQxIE9QVElPTlMKKworPW92ZXIgNAorCis9aXRlbSBCPC1oIC0taGVscD4KKworVGhpcyBkaXNwbGF5cyB0aGUgaGVscCBtZXNzYWdlLgorCis9aXRlbSBCPC1iIC0tYmFzZWRpcj4KKworVGhlIGJhc2UgZGlyZWN0b3J5IHVuZXIgd2hpY2ggdGhlIHRhcmdldCdzIG1vZHVsZXMgd2lsbCBiZSBmb3VuZC4gIFRoaXMKK2RlZmF1bHRzIHRvIHRoZSAvbGliL21vZHVsZXMgZGlyZWN0b3J5LgorCitJZiB5b3UgZG9uJ3Qgc3BlY2lmeSB0aGUga2VybmVsIHZlcnNpb24sIHRoaXMgc2NyaXB0IHdpbGwgc2VhcmNoIGZvcgorb25lIHVuZGVyIHRoZSBzcGVjaWZpZWQgYmFzZWQgZGlyZWN0b3J5IGFuZCB1c2UgdGhlIGZpcnN0IHRoaW5nIHRoYXQKK2xvb2tzIGxpa2UgYSBrZXJuZWwgdmVyc2lvbi4KKworPWl0ZW0gQjwtayAtLWtlcm5lbD4KKworS2VybmVsIGJpbmFyeSBmb3IgdGhlIHRhcmdldCAodm1saW51eCkuICBZb3UgbXVzdCBlaXRoZXIgc3VwcGx5IGEga2VybmVsIGJpbmFyeQorb3IgYSBrZXJuZWwgc3ltYm9sIGZpbGUgKHVzaW5nIHRoZSAtRiBvcHRpb24pLgorCis9aXRlbSBCPC1GIC0ta2VybmVsc3ltcz4KKworS2VybmVsIHN5bWJvbCBmaWxlIGZvciB0aGUgdGFyZ2V0IChTeXN0ZW0ubWFwKS4KKworPWl0ZW0gQjwtbiAtLXN0ZG91dD4KKworV3JpdGUgdG8gc3Rkb3V0IGluc3RlYWQgb2YgbW9kdWxlcy5kZXAKK2tlcm5lbCBiaW5hcnkgZm9yIHRoZSB0YXJnZXQgKHVzaW5nIHRoZSAtayBvcHRpb24pLgorCis9aXRlbSBCPC0tdmVyYm9zZT4KKworVmVyYm9zZSAoZGVidWcpIG91dHB1dAorCis9YmFjaworCis9aGVhZDEgQ09QWVJJR0hUIEFORCBMSUNFTlNFCisKKyBDb3B5cmlnaHQgKGMpIDIwMDEgRGF2aWQgU2NobGVlZiA8ZHNAc2NobGVlZi5vcmc+CisgQ29weXJpZ2h0IChjKSAyMDAxIEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyBDb3B5cmlnaHQgKGMpIDIwMDEgU3R1YXJ0IEh1Z2hlcyA8c2VoQHplZTIuY29tPgorIENvcHlyaWdodCAoYykgMjAwMiBTdGV2ZW4gSi4gSGlsbCA8c2hpbGxAYnJvYWRjb20uY29tPgorIENvcHlyaWdodCAoYykgMjAwNiBGcmVlc2NhbGUgU2VtaWNvbmR1Y3RvciwgSW5jIDxzdHVhcnRoQGZyZWVzY2FsZS5jb20+CisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0Cit1bmRlciB0aGUgc2FtZSB0ZXJtcyBhcyBQZXJsIGl0c2VsZi4KKworPWhlYWQxIEFVVEhPUgorCitEYXZpZCBTY2hsZWVmIDxkc0BzY2hsZWVmLm9yZz4KKworPWN1dApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZGV2ZnNkLmNvbmYgYi9leGFtcGxlcy9kZXZmc2QuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGYxYzg3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZGV2ZnNkLmNvbmYKQEAgLTAsMCArMSwxMzMgQEAKKyMgU2FtcGxlIC9ldGMvZGV2ZnNkLmNvbmYgY29uZmlndXJhdGlvbiBmaWxlLgorIyBSaWNoYXJkIEdvb2NoICA8cmdvb2NoQGF0bmYuY3Npcm8uYXU+CQkxNy1GRUItMjAwMgorIworIyBhZGFwdGVkIGZvciBidXN5Ym94IGRldmZzZCBpbXBsZW1lbnRhdGlvbiBieSBUaXRvIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4KKyMKKyMgRW5hYmxlIGZ1bGwgY29tcGF0aWJpbGl0eSBtb2RlIGZvciBvbGQgZGV2aWNlIG5hbWVzLiBZb3UgbWF5IGNvbW1lbnQgdGhlc2UKKyMgb3V0IGlmIHlvdSBkb24ndCB1c2UgdGhlIG9sZCBkZXZpY2UgbmFtZXMuIE1ha2Ugc3VyZSB5b3Uga25vdyB3aGF0IHlvdSdyZQorIyBkb2luZyEKK1JFR0lTVEVSCS4qCQlNS09MRENPTVBBVAorVU5SRUdJU1RFUgkuKgkJUk1PTERDT01QQVQKKworIyBZb3UgbWF5IGNvbW1lbnQgb3V0IHRoZSBhYm92ZSBhbmQgdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgaWYgeW91J3ZlCisjIGNvbmZpZ3VyZWQgeW91ciBzeXN0ZW0gdG8gdXNlIHRoZSBvcmlnaW5hbCAibmV3IiBkZXZmcyBuYW1lcyBvciB0aGUgcmVhbGx5CisjIG5ldyBuYW1lcworI1JFR0lTVEVSCV52Yy8JCU1LT0xEQ09NUEFUCisjVU5SRUdJU1RFUgledmMvCQlSTU9MRENPTVBBVAorI1JFR0lTVEVSCV5wdHkvCQlNS09MRENPTVBBVAorI1VOUkVHSVNURVIJXnB0eS8JCVJNT0xEQ09NUEFUCisjUkVHSVNURVIJXm1pc2MvCQlNS09MRENPTVBBVAorI1VOUkVHSVNURVIJXm1pc2MvCQlSTU9MRENPTVBBVAorCisjIFlvdSBtYXkgY29tbWVudCB0aGVzZSBvdXQgaWYgeW91IGRvbid0IHVzZSB0aGUgb3JpZ2luYWwgIm5ldyIgbmFtZXMKK1JFR0lTVEVSCS4qCQlNS05FV0NPTVBBVAorVU5SRUdJU1RFUgkuKgkJUk1ORVdDT01QQVQKKworIyBFbmFibGUgbW9kdWxlIGF1dG9sb2FkaW5nLiBZb3UgbWF5IGNvbW1lbnQgdGhpcyBvdXQgaWYgeW91IGRvbid0IHVzZQorIyBhdXRvbG9hZGluZworIyBTdXBwb3J0ZWQgYnkgYnVzeWJveCB3aGVuIENPTkZJR19ERVZGU0RfTU9ETE9BRCBpcyBzZXQuCisjIFRoaXMgYWN0dWFsbHkgZG9lc24ndCB3b3JrIHdpdGggYnVzeWJveCAgbW9kdXRpbHMgYnV0IG5lZWRzCisjIHRoZSByZWFsIG1vZHV0aWxzJyBtb2Rwcm9iZQorTE9PS1VQCQkuKgkJTU9ETE9BRAorCisjIFVuY29tbWVudCB0aGUgZm9sbG93aW5nIGlmIHlvdSB3YW50IHRvIHNldCB0aGUgZ3JvdXAgdG8gInR0eSIgZm9yIHRoZQorIyBwc2V1ZG8tdHR5IGRldmljZXMuIFRoaXMgaXMgbmVjZXNzYXJ5IHNvIHRoYXQgbWVzZygxKSBjYW4gbGF0ZXIgYmUgdXNlZCB0bworIyBlbmFibGUvZGlzYWJsZSB0YWxrIHJlcXVlc3RzIGFuZCB3YWxsKDEpIG1lc3NhZ2VzLgorUkVHSVNURVIJXnB0eS9zLioJUEVSTUlTU0lPTlMJLTEudHR5CTA2MDAKKyNSRUdJU1RFUglecHRzLy4qCQlQRVJNSVNTSU9OUwktMS50dHkJMDYwMAorCisjIFJlc3RvcmluZyAvZGV2L2xvZyBvbiBzdGFydHVwIHdvdWxkIHRyaWdnZXIgdGhlIG1pbmlsb2dkL2luaXRsb2cgZGVhZGxvY2sKKyMgKG1pbmlsb2dkIGZhbHNlbHkgYXNzdW1pbmcgc3lzbG9nZCBoYXMgYmVlbiBzdGFydGVkKS4KK1JFR0lTVEVSCV5sb2ckCQlJR05PUkUKK0NSRUFURQkJXmxvZyQJCUlHTk9SRQorQ0hBTkdFCQlebG9nJAkJSUdOT1JFCitERUxFVEUJCV5sb2ckCQlJR05PUkUKKworIworIyBVbmNvbW1lbnQgdGhpcyBpZiB5b3Ugd2FudCBwZXJtaXNzaW9ucyB0byBiZSBzYXZlZCBhbmQgcmVzdG9yZWQKKyMgRG8gbm90IGRvIHRoaXMgZm9yIHBzZXVkby10ZXJtaW5hbCBkZXZpY2VzCitSRUdJU1RFUglecHRbc3ldCQlJR05PUkUKK0NSRUFURQkJXnB0W3N5XQkJSUdOT1JFCitDSEFOR0UJCV5wdFtzeV0JCUlHTk9SRQorREVMRVRFCQlecHRbc3ldCQlJR05PUkUKK1JFR0lTVEVSCS4qCQlDT1BZCS9saWIvZGV2LXN0YXRlLyRkZXZuYW1lICRkZXZwYXRoCitDUkVBVEUJCS4qCQlDT1BZCSRkZXZwYXRoIC9saWIvZGV2LXN0YXRlLyRkZXZuYW1lCitDSEFOR0UJCS4qCQlDT1BZCSRkZXZwYXRoIC9saWIvZGV2LXN0YXRlLyRkZXZuYW1lCisjREVMRVRFCQkuKgkJQ0ZVTkNUSU9OIEdMT0JBTCB1bmxpbmsgL2xpYi9kZXYtc3RhdGUvJGRldm5hbWUKKyMgQnVzeWJveAorREVMRVRFCQkuKgkJRVhFQ1VURSAvYmluL3JtIC1mCQkvbGliL2Rldi1zdGF0ZS8kZGV2bmFtZQorCitSRVNUT1JFCQkvbGliL2Rldi1zdGF0ZQorCisjCisjIFVuY29tbWVudCB0aGlzIGlmIHlvdSB3YW50IHRoZSBvbGQgL2Rldi9jZHJvbSBzeW1saW5rCisjUkVHSVNURVIJXmNkcm9tcy9jZHJvbTAkCUNGVU5DVElPTiBHTE9CQUwgbWtzeW1saW5rICRkZXZuYW1lIGNkcm9tCisjVU5SRUdJU1RFUgleY2Ryb21zL2Nkcm9tMCQJQ0ZVTkNUSU9OIEdMT0JBTCB1bmxpbmsgY2Ryb20KKyMgYnVzeWJveAorUkVHSVNURVIJXmNkcm9tcy9jZHJvbTAkCUVYRUNVVEUgL2Jpbi9sbiAtc2YgJGRldm5hbWUgY2Ryb20KK1VOUkVHSVNURVIJXmNkcm9tcy9jZHJvbTAkCUVYRUNVVEUgL2Jpbi9ybSAtZiBjZHJvbQorCisjUkVHSVNURVIJXnY0bC92aWRlbzAkCUNGVU5DVElPTiBHTE9CQUwgbWtzeW1saW5rIHY0bC92aWRlbzAgdmlkZW8KKyNVTlJFR0lTVEVSCV52NGwvdmlkZW8wJAlDRlVOQ1RJT04gR0xPQkFMIHVubGluayB2aWRlbworI1JFR0lTVEVSCV5yYWRpbzAkCUNGVU5DVElPTiBHTE9CQUwgbWtzeW1saW5rIHJhZGlvMCByYWRpbworI1VOUkVHSVNURVIJXnJhZGlvMCQJQ0ZVTkNUSU9OIEdMT0JBTCB1bmxpbmsgcmFkaW8KKyMgQnVzeWJveAorUkVHSVNURVIJXnY0bC92aWRlbzAkCUVYRUNVVEUgL2Jpbi9sbiAtc2YgdjRsL3ZpZGVvMCB2aWRlbworVU5SRUdJU1RFUgledjRsL3ZpZGVvMCQJRVhFQ1VURSAvYmluL3JtIC1mIHZpZGVvCitSRUdJU1RFUglecmFkaW8wJAkJRVhFQ1VURSAvYmluL2xuIC1zZiAgcmFkaW8wIHJhZGlvCitVTlJFR0lTVEVSCV5yYWRpbzAkCQlFWEVDVVRFIC9iaW4vcm0gLWYgcmFkaW8KKworIyBBTFNBIHN0dWZmCisjTE9PS1VQCQlzbmQJCU1PRExPQUQgQUNUSU9OIHNuZAorCisjIFVuY29tbWVudCB0aGlzIHRvIGxldCBQQU0gbWFuYWdlIGRldmZzCisjIE5vdCBzdXBwb3J0ZWQgYnkgYnVzeWJveAorI1JFR0lTVEVSCS4qCQlDRlVOQ1RJT04gL2xpYi9zZWN1cml0eS9wYW1fY29uc29sZV9hcHBseV9kZXZmc2Quc28gcGFtX2NvbnNvbGVfYXBwbHlfc2luZ2xlICRkZXZwYXRoCisKKyMgVW5jb21tZW50IHRoaXMgdG8gbWFuYWdlIFVTQiBtb3VzZQorIyBOb3Qgc3VwcG9ydGVkIGJ5IGJ1c3lib3gKKyNSRUdJU1RFUgleaW5wdXQvbW91c2UwJAlDRlVOQ1RJT04gR0xPQkFMIG1rc3ltbGluayAkZGV2bmFtZSB1c2Jtb3VzZQorI1VOUkVHSVNURVIJXmlucHV0L21vdXNlMCQJQ0ZVTkNUSU9OIEdMT0JBTCB1bmxpbmsgdXNibW91c2UKKyMgQnVzeWJveAorI1JFR0lTVEVSCV5pbnB1dC9tb3VzZTAkCUVYRUNVVEUgL2Jpbi9sbiAtc2YgJGRldm5hbWUgdXNibW91c2UKKyNVTlJFR0lTVEVSCV5pbnB1dC9tb3VzZTAkCUVYRUNVVEUgL2Jpbi9ybSAtZiB1c2Jtb3VzZQorIyBOb3Qgc3VwcG9ydGVkIGJ5IGJ1c3lib3gKKyNSRUdJU1RFUgleaW5wdXQvbWljZSQJQ0ZVTkNUSU9OIEdMT0JBTCBta3N5bWxpbmsgJGRldm5hbWUgdXNibW91c2UKKyNVTlJFR0lTVEVSCV5pbnB1dC9taWNlJAlDRlVOQ1RJT04gR0xPQkFMIHVubGluayB1c2Jtb3VzZQorIyBCdXN5Ym94CitSRUdJU1RFUgleaW5wdXQvbWljZSQJRVhFQ1VURSAvYmluL2xuIC1zZiAkZGV2bmFtZSB1c2Jtb3VzZQorVU5SRUdJU1RFUgleaW5wdXQvbWljZSQJRVhFQ1VURSAvYmluL3JtIC1mIHVzYm1vdXNlCisKKyMgSWYgeW91IGhhdmUgcmVtb3ZhYmxlIG1lZGlhIGFuZCB3YW50IHRvIGZvcmNlIG1lZGlhIHJldmFsaWRhdGlvbiB3aGVuIGxvb2tpbmcKKyMgdXAgbmV3IG9yIG9sZCBjb21wYXRpYmlsaXR5IG5hbWVzLCB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lcworIyBTQ1NJIE5FV0NPTVBBVCAgL2Rldi9zZC8qIG5hbWVzCitMT09LVVAJCV4oc2QvY1swLTldK2JbMC05XSt0WzAtOV0rdVswLTldKylwWzAtOV0rJAlFWEVDVVRFIC9iaW4vZGQgaWY9JG1udHBudC9cMSBvZj0vZGV2L251bGwgY291bnQ9MQorIyBTQ1NJIE9MRENPTVBBVCAgL2Rldi9zZD8/IG5hbWVzCitMT09LVVAJCV4oc2RbYS16XSspWzAtOV0rJAlFWEVDVVRFIC9iaW4vZGQgaWY9JG1udHBudC9cMSBvZj0vZGV2L251bGwgY291bnQ9MQorIyBJREUgTkVXQ09NUEFUICAgL2Rldi9pZGUvaGQvKiBuYW1lcworTE9PS1VQCQleKGlkZS9oZC9jWzAtOV0rYlswLTldK3RbMC05XSt1WzAtOV0rKXBbMC05XSskCUVYRUNVVEUgL2Jpbi9kZCBpZj0kbW50cG50L1wxIG9mPS9kZXYvbnVsbCBjb3VudD0xCisjIElERSBPTERDT01QQVQgICAvZGV2L2hkPz8gbmFtZXMKK0xPT0tVUAkJXihoZFthLXpdKVswLTldKyQJRVhFQ1VURSAvYmluL2RkIGlmPSRtbnRwbnQvXDEgb2Y9L2Rldi9udWxsIGNvdW50PTEKKyMgSURFLVNDU0kgTkVXQ09NUEFUICAvZGV2L3NkLyogbmFtZXMKKyNMT09LVVAJCV4oc2QvY1swLTldK2JbMC05XSt0WzAtOV0rdVswLTldKylwWzAtOV0rJAlFWEVDVVRFIC9iaW4vZGQgaWY9JG1udHBudC9cMSBvZj0vZGV2L251bGwgY291bnQ9MQorI1NDU0kgT0xEQ09NUEFUICAvZGV2L3NjZD8gbmFtZXMKK0xPT0tVUAkJXihzY2QrKVswLTldKyQJRVhFQ1VURSAvYmluL2RkIGlmPSRtbnRwbnQvXDEgb2Y9L2Rldi9udWxsIGNvdW50PTEKKworCitSRUdJU1RFUiBeZHZiL2NhcmRbMC05XSsvW14vXSskIFBFUk1JU1NJT05TIHJvb3QudmlkZW8gMDY2MAorIyBOb3Qgc3VwcG9ydGVkIGJ5IGJ1c3lib3gKKyNSRUdJU1RFUgleZHZiL2NhcmQoWzAtOV0rKS8oW14vMC05XSopWzAtOV0rJAlDRlVOQ1RJT04gR0xPQkFMIG1rc3ltbGluayAvZGV2LyRkZXZuYW1lIG9zdC9cMlwxCisjVU5SRUdJU1RFUgleZHZiL2NhcmQoWzAtOV0rKS8oW14vMC05XSopWzAtOV0rJAlDRlVOQ1RJT04gR0xPQkFMIHVubGluayBvc3QvXDJcMQorIyBCdXN5Ym94CitSRUdJU1RFUgleZHZiL2NhcmQoWzAtOV0rKS8oW14vMC05XSopWzAtOV0rJAlFWEVDVVRFIC9iaW4vbG4gLXNmIC9kZXYvJGRldm5hbWUgb3N0L1wyXDEKK1VOUkVHSVNURVIJXmR2Yi9jYXJkKFswLTldKykvKFteLzAtOV0qKVswLTldKyQJRVhFQ1VURSAvYmluL3JtIC1mIG9zdC9cMlwxCisKKyMgSW5jbHVkZSBwYWNrYWdlLWdlbmVyYXRlZCBmaWxlcyBmcm9tIC9ldGMvZGV2ZnMvY29uZi5kCisjIFN1cHBvcnRlZCBieSBidXN5Ym94CisjIElOQ0xVREUgICAvZXRjL2RldmZzL2NvbmYuZC8KK0lOQ0xVREUgICAvZXRjL2RldmZzL2J1c3lib3gvCisjIEJ1c3lib3g6IGp1c3QgZm9yIHRlc3RpbmcKKyNJTkNMVURFCQkJL2V0Yy9kZXZmcy9ub3RoaW5nLworI0lOQ0xVREUJCQkvZXRjL2RldmZzL25vdGhpbmcvbm90aGluZworI09QVElPTkFMX0lOQ0xVREUJL2V0Yy9kZXZmcy9ub3RoaW5nLworI09QVElPTkFMX0lOQ0xVREUJL2V0Yy9kZXZmcy9ub3RoaW5nL25vdGhpbmcKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Ruc2QuY29uZiBiL2V4YW1wbGVzL2Ruc2QuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWY2MjJiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZG5zZC5jb25mCkBAIC0wLDAgKzEgQEAKK3RoZWJveCAxOTIuMTY4LjEuNQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaW5ldGQuY29uZiBiL2V4YW1wbGVzL2luZXRkLmNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3ZTNkOAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2luZXRkLmNvbmYKQEAgLTAsMCArMSw3MyBAQAorIyAvZXRjL2luZXRkLmNvbmY6ICBzZWUgaW5ldGQoOCkgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb25zLgorIworIyBJbnRlcm5ldCBzZXJ2ZXIgY29uZmlndXJhdGlvbiBkYXRhYmFzZQorIworIworIyBJZiB5b3Ugd2FudCB0byBkaXNhYmxlIGFuIGVudHJ5IHNvIGl0IGlzbid0IHRvdWNoZWQgZHVyaW5nCisjIHBhY2thZ2UgdXBkYXRlcyBqdXN0IGNvbW1lbnQgaXQgb3V0IHdpdGggYSBzaW5nbGUgJyMnIGNoYXJhY3Rlci4KKyMKKyMgSWYgeW91IG1ha2UgY2hhbmdlcyB0byB0aGlzIGZpbGUsIGVpdGhlciByZWJvb3QgeW91ciBtYWNoaW5lIG9yCisjIHNlbmQgdGhlIGluZXRkIHByb2Nlc3MgYSBIVVAgc2lnbmFsOgorIyBEbyBhICJwcyB4IiBhcyByb290IGFuZCBsb29rIHVwIHRoZSBwaWQgb2YgaW5ldGQuIFRoZW4gZG8gYQorIyAgICAga2lsbCAtSFVQIDxwaWQgb2YgaW5ldGQ+CisjIGluZXRkIHdpbGwgcmUtcmVhZCB0aGlzIGZpbGUgd2hlbmV2ZXIgaXQgZ2V0cyB0aGF0IHNpZ25hbC4KKyMgPHNlcnZpY2VfbmFtZT4gPHNvY2tfdHlwZT4gPHByb3RvPiA8ZmxhZ3M+IDx1c2VyPiA8c2VydmVyX3BhdGg+IDxhcmdzPgorIworIzpJTlRFUk5BTDogSW50ZXJuYWwgc2VydmljZXMKKyMgSXQgaXMgZ2VuZXJhbGx5IGNvbnNpZGVyZWQgc2FmZXIgdG8ga2VlcCB0aGVzZSBvZmYuCitlY2hvICAgICBzdHJlYW0gIHRjcAlub3dhaXQJcm9vdAlpbnRlcm5hbAorZWNobyAgICAgZGdyYW0gICB1ZHAJd2FpdAlyb290CWludGVybmFsCisjZGlzY2FyZCAgc3RyZWFtICB0Y3AJbm93YWl0CXJvb3QJaW50ZXJuYWwKKyNkaXNjYXJkICBkZ3JhbSAgIHVkcAl3YWl0CXJvb3QJaW50ZXJuYWwKK2RheXRpbWUgIHN0cmVhbSAgdGNwCW5vd2FpdAlyb290CWludGVybmFsCitkYXl0aW1lICBkZ3JhbSAgIHVkcAl3YWl0CXJvb3QJaW50ZXJuYWwKKyNjaGFyZ2VuICBzdHJlYW0gIHRjcAlub3dhaXQJcm9vdAlpbnRlcm5hbAorI2NoYXJnZW4gIGRncmFtICAgdWRwCXdhaXQJcm9vdAlpbnRlcm5hbAordGltZSAgICAgc3RyZWFtICB0Y3AJbm93YWl0CXJvb3QJaW50ZXJuYWwKK3RpbWUgICAgIGRncmFtICAgdWRwCXdhaXQJcm9vdAlpbnRlcm5hbAorCisjIFRoZXNlIGFyZSBzdGFuZGFyZCBzZXJ2aWNlcy4KKyMKKyNmdHAJc3RyZWFtCXRjcAlub3dhaXQJcm9vdAkvdXNyL3NiaW4vdGNwZAlpbi5mdHBkCisjdGVsbmV0CXN0cmVhbQl0Y3AJbm93YWl0CXJvb3QJL3NiaW4vdGVsbmV0ZAkvc2Jpbi90ZWxuZXRkCisjbm50cAlzdHJlYW0JdGNwCW5vd2FpdAlyb290CXRjcGQJaW4ubm50cGQKKyNzbXRwICBzdHJlYW0gIHRjcCAgICAgbm93YWl0ICByb290ICAgIHRjcGQgICAgc2VuZG1haWwgLXYKKyMKKyMgU2hlbGwsIGxvZ2luLCBleGVjIGFuZCB0YWxrIGFyZSBCU0QgcHJvdG9jb2xzLgorIworIyBJZiB5b3UgcnVuIGFuIG50YWxrIGRhZW1vbiAoc3VjaCBhcyBuZXRraXQtbnRhbGspIG9uIHRoZSBvbGQgdGFsaworIyBwb3J0LCB0aGF0IGlzLCAidGFsayIgYXMgb3Bwb3NlZCB0byAibnRhbGsiLCBpdCB3b24ndCB3b3JrIGFuZCBtYXkKKyMgY2F1c2UgY2VydGFpbiBicm9rZW4gdGFsayBjbGllbnRzIHRvIG1hbGZ1bmN0aW9uLgorIworIyBUaGUgdGFsa2QgZnJvbSBuZXRraXQtbnRhbGsgMC4xMiBhbmQgaGlnaGVyLCBob3dldmVyLCBjYW4gc3BlYWsgdGhlCisjIG9sZCB0YWxrIHByb3RvY29sIGFuZCBjYW4gYmUgdXNlZCBzYWZlbHkuCisjCisjc2hlbGwJc3RyZWFtCXRjcAlub3dhaXQJcm9vdAkvdXNyL3NiaW4vdGNwZAlpbi5yc2hkIC1MCisjbG9naW4Jc3RyZWFtCXRjcAlub3dhaXQJcm9vdAkvdXNyL3NiaW4vdGNwZAlpbi5ybG9naW5kIC1MCisjZXhlYwlzdHJlYW0JdGNwCW5vd2FpdAlyb290CS91c3Ivc2Jpbi90Y3BkCWluLnJleGVjZAorI3RhbGsJZGdyYW0JdWRwCXdhaXQJcm9vdAkvdXNyL3NiaW4vdGNwZAlpbi50YWxrZAorI250YWxrCWRncmFtCXVkcAl3YWl0CXJvb3QJL3Vzci9zYmluL3RjcGQJaW4udGFsa2QKKyMKKyMgUG9wIGV0IGFsCisjIExlYXZlIHRoZXNlIG9mZiB1bmxlc3MgeW91J3JlIHVzaW5nIHRoZW0uCisjcG9wMglzdHJlYW0JdGNwCW5vd2FpdAlyb290CS91c3Ivc2Jpbi90Y3BkCWluLnBvcDJkCisjcG9wMwlzdHJlYW0JdGNwCW5vd2FpdAlyb290CS91c3Ivc2Jpbi90Y3BkCWluLnBvcDNkCisjCisjIFRoZSBJbnRlcm5ldCBVVUNQIHNlcnZpY2UuCisjIHV1Y3AJc3RyZWFtCXRjcAlub3dhaXQJdXVjcAkvdXNyL3NiaW4vdGNwZAkvdXNyL2xpYi91dWNwL3V1Y2ljbwktbAorIworIyBUZnRwIHNlcnZpY2UgaXMgcHJvdmlkZWQgcHJpbWFyaWx5IGZvciBib290aW5nLiAgTW9zdCBzaXRlcworIyBydW4gdGhpcyBvbmx5IG9uIG1hY2hpbmVzIGFjdGluZyBhcyAiYm9vdCBzZXJ2ZXJzLiIgSWYgeW91IGRvbid0CisjIG5lZWQgaXQsIGRvbid0IHVzZSBpdC4KKyMKKyN0ZnRwCWRncmFtCXVkcAl3YWl0CW5vYm9keQkvdXNyL3NiaW4vdGNwZAlpbi50ZnRwZAorI2Jvb3RwcwlkZ3JhbQl1ZHAJd2FpdAlyb290CS91c3Ivc2Jpbi9pbi5ib290cGQJaW4uYm9vdHBkCisjCisjIEZpbmdlciwgc3lzdGF0IGFuZCBuZXRzdGF0IGdpdmUgb3V0IHVzZXIgaW5mb3JtYXRpb24gd2hpY2ggbWF5IGJlCisjIHZhbHVhYmxlIHRvIHBvdGVudGlhbCAic3lzdGVtIGNyYWNrZXJzLiIgIE1hbnkgc2l0ZXMgY2hvb3NlIHRvIGRpc2FibGUKKyMgc29tZSBvciBhbGwgb2YgdGhlc2Ugc2VydmljZXMgdG8gaW1wcm92ZSBzZWN1cml0eS4KKyMKKyNmaW5nZXIJc3RyZWFtCXRjcAlub3dhaXQJbm9ib2R5CS91c3Ivc2Jpbi90Y3BkCWluLmZpbmdlcmQgLXcKKyNzeXN0YXQJc3RyZWFtCXRjcAlub3dhaXQJbm9ib2R5CS91c3Ivc2Jpbi90Y3BkCS9iaW4vcHMJLWF1d3d4CisjbmV0c3RhdAlzdHJlYW0JdGNwCW5vd2FpdAlyb290CS9iaW4vbmV0c3RhdAkvYmluL25ldHN0YXQJLWEKKyNpZGVudAlzdHJlYW0JdGNwCW5vd2FpdAlyb290CS91c3Ivc2Jpbi9pbi5pZGVudGQJaW4uaWRlbnRkCmRpZmYgLS1naXQgYS9leGFtcGxlcy9pbml0dGFiIGIvZXhhbXBsZXMvaW5pdHRhYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWNlYWVmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaW5pdHRhYgpAQCAtMCwwICsxLDgzIEBACisjIC9ldGMvaW5pdHRhYiBpbml0KDgpIGNvbmZpZ3VyYXRpb24gZm9yIEJ1c3lCb3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIworIyBOb3RlLCBCdXN5Qm94IGluaXQgZG9lc24ndCBzdXBwb3J0IHJ1bmxldmVscy4gIFRoZSBydW5sZXZlbHMgZmllbGQgaXMKKyMgY29tcGxldGVseSBpZ25vcmVkIGJ5IEJ1c3lCb3ggaW5pdC4gSWYgeW91IHdhbnQgcnVubGV2ZWxzLCB1c2Ugc3lzdmluaXQuCisjCisjCisjIEZvcm1hdCBmb3IgZWFjaCBlbnRyeTogPGlkPjo8cnVubGV2ZWxzPjo8YWN0aW9uPjo8cHJvY2Vzcz4KKyMKKyMgPGlkPjogV0FSTklORzogVGhpcyBmaWVsZCBoYXMgYSBub24tdHJhZGl0aW9uYWwgbWVhbmluZyBmb3IgQnVzeUJveCBpbml0IQorIworIwlUaGUgaWQgZmllbGQgaXMgdXNlZCBieSBCdXN5Qm94IGluaXQgdG8gc3BlY2lmeSB0aGUgY29udHJvbGxpbmcgdHR5IGZvcgorIwl0aGUgc3BlY2lmaWVkIHByb2Nlc3MgdG8gcnVuIG9uLiAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgZmllbGQgYXJlCisjCWFwcGVuZGVkIHRvICIvZGV2LyIgYW5kIHVzZWQgYXMtaXMuICBUaGVyZSBpcyBubyBuZWVkIGZvciB0aGlzIGZpZWxkIHRvCisjCWJlIHVuaXF1ZSwgYWx0aG91Z2ggaWYgaXQgaXNuJ3QgeW91IG1heSBoYXZlIHN0cmFuZ2UgcmVzdWx0cy4gIElmIHRoaXMKKyMJZmllbGQgaXMgbGVmdCBibGFuaywgdGhlbiB0aGUgaW5pdCdzIHN0ZGluL291dCB3aWxsIGJlIHVzZWQuCisjCisjIDxydW5sZXZlbHM+OiBUaGUgcnVubGV2ZWxzIGZpZWxkIGlzIGNvbXBsZXRlbHkgaWdub3JlZC4KKyMKKyMgPGFjdGlvbj46IFZhbGlkIGFjdGlvbnMgaW5jbHVkZTogc3lzaW5pdCwgcmVzcGF3biwgYXNrZmlyc3QsIHdhaXQsIG9uY2UsCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3RhcnQsIGN0cmxhbHRkZWwsIGFuZCBzaHV0ZG93bi4KKyMKKyMgICAgICAgTm90ZTogYXNrZmlyc3QgYWN0cyBqdXN0IGxpa2UgcmVzcGF3biwgYnV0IGJlZm9yZSBydW5uaW5nIHRoZSBzcGVjaWZpZWQKKyMgICAgICAgcHJvY2VzcyBpdCBkaXNwbGF5cyB0aGUgbGluZSAiUGxlYXNlIHByZXNzIEVudGVyIHRvIGFjdGl2YXRlIHRoaXMKKyMgICAgICAgY29uc29sZS4iIGFuZCB0aGVuIHdhaXRzIGZvciB0aGUgdXNlciB0byBwcmVzcyBlbnRlciBiZWZvcmUgc3RhcnRpbmcKKyMgICAgICAgdGhlIHNwZWNpZmllZCBwcm9jZXNzLgorIworIyAgICAgICBOb3RlOiB1bnJlY29nbml6ZWQgYWN0aW9ucyAobGlrZSBpbml0ZGVmYXVsdCkgd2lsbCBjYXVzZSBpbml0IHRvIGVtaXQKKyMgICAgICAgYW4gZXJyb3IgbWVzc2FnZSwgYW5kIHRoZW4gZ28gYWxvbmcgd2l0aCBpdHMgYnVzaW5lc3MuCisjCisjIDxwcm9jZXNzPjogU3BlY2lmaWVzIHRoZSBwcm9jZXNzIHRvIGJlIGV4ZWN1dGVkIGFuZCBpdCdzIGNvbW1hbmQgbGluZS4KKyMKKyMgTm90ZTogQnVzeUJveCBpbml0IHdvcmtzIGp1c3QgZmluZSB3aXRob3V0IGFuIGluaXR0YWIuIElmIG5vIGluaXR0YWIgaXMKKyMgZm91bmQsIGl0IGhhcyB0aGUgZm9sbG93aW5nIGRlZmF1bHQgYmVoYXZpb3I6CisjICAgICAgICAgOjpzeXNpbml0Oi9ldGMvaW5pdC5kL3JjUworIyAgICAgICAgIDo6YXNrZmlyc3Q6L2Jpbi9zaAorIyAgICAgICAgIDo6Y3RybGFsdGRlbDovc2Jpbi9yZWJvb3QKKyMgICAgICAgICA6OnNodXRkb3duOi9zYmluL3N3YXBvZmYgLWEKKyMgICAgICAgICA6OnNodXRkb3duOi9iaW4vdW1vdW50IC1hIC1yCisjICAgICAgICAgOjpyZXN0YXJ0Oi9zYmluL2luaXQKKyMgICAgICAgICB0dHkyOjphc2tmaXJzdDovYmluL3NoCisjICAgICAgICAgdHR5Mzo6YXNrZmlyc3Q6L2Jpbi9zaAorIyAgICAgICAgIHR0eTQ6OmFza2ZpcnN0Oi9iaW4vc2gKKyMKKyMgQm9vdC10aW1lIHN5c3RlbSBjb25maWd1cmF0aW9uL2luaXRpYWxpemF0aW9uIHNjcmlwdC4KKyMgVGhpcyBpcyBydW4gZmlyc3QgZXhjZXB0IHdoZW4gYm9vdGluZyBpbiBzaW5nbGUtdXNlciBtb2RlLgorIworOjpzeXNpbml0Oi9ldGMvaW5pdC5kL3JjUworCisjIC9iaW4vc2ggaW52b2NhdGlvbnMgb24gc2VsZWN0ZWQgdHR5cworIworIyBOb3RlIGJlbG93IHRoYXQgd2UgcHJlZml4IHRoZSBzaGVsbCBjb21tYW5kcyB3aXRoIGEgIi0iIHRvIGluZGljYXRlIHRvIHRoZQorIyBzaGVsbCB0aGF0IGl0IGlzIHN1cHBvc2VkIHRvIGJlIGEgbG9naW4gc2hlbGwuICBOb3JtYWxseSB0aGlzIGlzIGhhbmRsZWQgYnkKKyMgbG9naW4sIGJ1dCBzaW5jZSB3ZSBhcmUgYnlwYXNzaW5nIGxvZ2luIGluIHRoaXMgY2FzZSwgQnVzeUJveCBsZXRzIHlvdSBkbworIyB0aGlzIHlvdXJzZWxmLi4uCisjCisjIFN0YXJ0IGFuICJhc2tmaXJzdCIgc2hlbGwgb24gdGhlIGNvbnNvbGUgKHdoYXRldmVyIHRoYXQgbWF5IGJlKQorOjphc2tmaXJzdDotL2Jpbi9zaAorIyBTdGFydCBhbiAiYXNrZmlyc3QiIHNoZWxsIG9uIC9kZXYvdHR5Mi00Cit0dHkyOjphc2tmaXJzdDotL2Jpbi9zaAordHR5Mzo6YXNrZmlyc3Q6LS9iaW4vc2gKK3R0eTQ6OmFza2ZpcnN0Oi0vYmluL3NoCisKKyMgL3NiaW4vZ2V0dHkgaW52b2NhdGlvbnMgZm9yIHNlbGVjdGVkIHR0eXMKK3R0eTQ6OnJlc3Bhd246L3NiaW4vZ2V0dHkgMzg0MDAgdHR5NQordHR5NTo6cmVzcGF3bjovc2Jpbi9nZXR0eSAzODQwMCB0dHk2CisKKyMgRXhhbXBsZSBvZiBob3cgdG8gcHV0IGEgZ2V0dHkgb24gYSBzZXJpYWwgbGluZSAoZm9yIGEgdGVybWluYWwpCisjOjpyZXNwYXduOi9zYmluL2dldHR5IC1MIHR0eVMwIDk2MDAgdnQxMDAKKyM6OnJlc3Bhd246L3NiaW4vZ2V0dHkgLUwgdHR5UzEgOTYwMCB2dDEwMAorIworIyBFeGFtcGxlIGhvdyB0byBwdXQgYSBnZXR0eSBvbiBhIG1vZGVtIGxpbmUuCisjOjpyZXNwYXduOi9zYmluL2dldHR5IDU3NjAwIHR0eVMyCisKKyMgU3R1ZmYgdG8gZG8gd2hlbiByZXN0YXJ0aW5nIHRoZSBpbml0IHByb2Nlc3MKKzo6cmVzdGFydDovc2Jpbi9pbml0CisKKyMgU3R1ZmYgdG8gZG8gYmVmb3JlIHJlYm9vdGluZworOjpjdHJsYWx0ZGVsOi9zYmluL3JlYm9vdAorOjpzaHV0ZG93bjovYmluL3Vtb3VudCAtYSAtcgorOjpzaHV0ZG93bjovc2Jpbi9zd2Fwb2ZmIC1hCmRpZmYgLS1naXQgYS9leGFtcGxlcy9saW51eC0yLjYuMzBfcHJvY19zZWxmX2V4ZS5wYXRjaCBiL2V4YW1wbGVzL2xpbnV4LTIuNi4zMF9wcm9jX3NlbGZfZXhlLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNjU4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9saW51eC0yLjYuMzBfcHJvY19zZWxmX2V4ZS5wYXRjaApAQCAtMCwwICsxLDM0IEBACitUaGlzIHBhdGNoIG1ha2VzIC9wcm9jL3NlbGYvZXhlIGV4ZWN1dGFibGUgZXZlbiBpZiBwcm9jCitpcyBub3QgbW91bnRlZC4gSXQgaXMgZXNwZWNpYWxseSB1c2VmdWwgb24gTk9NTVUgYXJjaGVzLgorCitkaWZmIC11cnAgLi4vbGludXgtMi42LjMwLm9yZy9mcy9leGVjLmMgbGludXgtMi42LjMwL2ZzL2V4ZWMuYworLS0tIC4uL2xpbnV4LTIuNi4zMC5vcmcvZnMvZXhlYy5jCTIwMDktMDYtMTAgMDU6MDU6MjcuMDAwMDAwMDAwICswMjAwCisrKysgbGludXgtMi42LjMwL2ZzL2V4ZWMuYwkyMDA5LTA2LTI1IDAwOjIwOjEzLjAwMDAwMDAwMCArMDIwMAorQEAgLTY1Miw5ICs2NTIsMjUgQEAgc3RydWN0IGZpbGUgKm9wZW5fZXhlYyhjb25zdCBjaGFyICpuYW1lKQorIAlmaWxlID0gZG9fZmlscF9vcGVuKEFUX0ZEQ1dELCBuYW1lLAorIAkJCQlPX0xBUkdFRklMRSB8IE9fUkRPTkxZIHwgRk1PREVfRVhFQywgMCwKKyAJCQkJTUFZX0VYRUMgfCBNQVlfT1BFTik7CistCWlmIChJU19FUlIoZmlsZSkpCistCQlnb3RvIG91dDsKKysJaWYgKElTX0VSUihmaWxlKSkgeworKwkJaWYgKChQVFJfRVJSKGZpbGUpID09IC1FTk9FTlQgfHwgUFRSX0VSUihmaWxlKSA9PSAtRUFDQ0VTKQorKwkJICYmIHN0cmNtcChuYW1lLCAiL3Byb2Mvc2VsZi9leGUiKSA9PSAwCisrCQkpIHsKKysJCQlzdHJ1Y3QgZmlsZSAqc3YgPSBmaWxlOworKwkJCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOworIAorKwkJCW1tID0gZ2V0X3Rhc2tfbW0oY3VycmVudCk7CisrCQkJaWYgKCFtbSkKKysJCQkJZ290byBvdXQ7CisrCQkJZmlsZSA9IGdldF9tbV9leGVfZmlsZShtbSk7CisrCQkJbW1wdXQobW0pOworKwkJCWlmIChmaWxlKQorKwkJCQlnb3RvIG9rOworKwkJCWZpbGUgPSBzdjsKKysJCX0KKysJCWdvdG8gb3V0OworKwl9Cisrb2s6CisgCWVyciA9IC1FQUNDRVM7CisgCWlmICghU19JU1JFRyhmaWxlLT5mX3BhdGguZGVudHJ5LT5kX2lub2RlLT5pX21vZGUpKQorIAkJZ290byBleGl0OwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbWRldi5jb25mIGIvZXhhbXBsZXMvbWRldi5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNzk1NjkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9tZGV2LmNvbmYKQEAgLTAsMCArMSwzNiBAQAorIworIyBUaGlzIGlzIGEgc2FtcGxlIG1kZXYuY29uZgorIworCisjIFByb3ZpZGUgdXNlciwgZ3JvdXAsIGFuZCBtb2RlIGluZm9ybWF0aW9uIGZvciBkZXZpY2VzLiAgSWYgYSByZWdleCBtYXRjaGVzCisjIHRoZSBkZXZpY2UgbmFtZSBwcm92aWRlZCBieSBzeXNmcywgdXNlIHRoZSBhcHByb3ByaWF0ZSB1c2VyOmdyb3VwIGFuZCBtb2RlCisjIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgMDowIDY2MC4KKyMKKyMgU3ludGF4OgorIyBbLV1kZXZpY2VuYW1lX3JlZ2V4IHVzZXI6Z3JvdXAgbW9kZSBbPXBhdGhdfFs+cGF0aF18WyFdIFtAfCR8KmNtZCBhcmdzLi4uXQorIyBbLV0kRU5WVkFSPXJlZ2V4ICAgIHVzZXI6Z3JvdXAgbW9kZSBbPXBhdGhdfFs+cGF0aF18WyFdIFtAfCR8KmNtZCBhcmdzLi4uXQorIyBbLV1AbWFqLG1pblstbWluMl0gIHVzZXI6Z3JvdXAgbW9kZSBbPXBhdGhdfFs+cGF0aF18WyFdIFtAfCR8KmNtZCBhcmdzLi4uXQorIworIyBbLV06IGRvIG5vdCBzdG9wIG9uIHRoaXMgbWF0Y2gsIGNvbnRpbnVlIHJlYWRpbmcgbWRldi5jb25mCisjID06IG1vdmUsID46IG1vdmUgYW5kIGNyZWF0ZSBhIHN5bWxpbmsKKyMgITogZG8gbm90IGNyZWF0ZSBkZXZpY2Ugbm9kZQorIyBAfCR8KjogcnVuQGNtZCBpZiAkQUNUSU9OPWFkZCwgICRjbWQgaWYgJEFDVElPTj1yZW1vdmUsICpjbWQgaW4gYWxsIGNhc2VzCisKK251bGwJCTA6MCA2NjYKK3plcm8JCTA6MCA2NjYKK3VyYW5kb20JCTA6MCA0NDQKKwora21lbQkJMDo5IDAwMAorbWVtCQkwOjkgNjQwCitwb3J0CQkwOjkgNjQwCisKK2NvbnNvbGUJCTA6NSA2MDAKK3B0bXgJCTA6NSA2NjAKK3R0eVswLTldKgkwOjUgNjYwCisKK3R0eVNbMC05XSoJMDoyMCA2NDAKKworZmRbMC05XSoJMDoxMSA2NjAKKworc2RbYS16XSoJMDo2IDY2MAoraGRbYS16XSoJMDo2IDY2MApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbWRldi5jb25mLmNoYW5nZV9ibG9ja2Rldi5zaCBiL2V4YW1wbGVzL21kZXYuY29uZi5jaGFuZ2VfYmxvY2tkZXYuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTEyZTQzZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL21kZXYuY29uZi5jaGFuZ2VfYmxvY2tkZXYuc2gKQEAgLTAsMCArMSwyOSBAQAorIyEvYmluL3NoCisKKyMgU2Vjb25kcyB0byB0cnkgdG8gcmVyZWFkIHBhcnRpdGlvbiB0YWJsZQorY250PTYwCisKK2V4ZWMgPC9kZXYvbnVsbAorZXhlYyA+Ii90bXAvJHswIyMqL30uJCQub3V0IgorZXhlYyAyPiYxCisKKygKK2VjaG8gIlJ1bm5pbmc6ICQwIgorZWNobyAiRW52OiIKK2VudiB8IHNvcnQKKword2hpbGUgc2xlZXAgMTsgdGVzdCAkY250ICE9IDA7IGRvCisJZWNobyAiVHJ5aW5nIHRvIHJlcmVhZCBwYXJ0aXRpb24gdGFibGUgb24gJERFVk5BTUUgKCRjbnQpIgorCTogJCgoY250LS0pKQorCSMgSWYgZGV2aWNlIG5vZGUgZG9lc24ndCBleGlzdCwgaXQgbWVhbnMgdGhlIGRldmljZSB3YXMgcmVtb3ZlZC4KKwkjIFN0b3AgdHJ5aW5nLgorCXRlc3QgLWUgIiRERVZOQU1FIiB8fCB7IGVjaG8gIiRERVZOQU1FIGRvZXNuJ3QgZXhpc3QsIGFib3J0aW5nIjsgZXhpdCAxOyB9CisJI2VjaG8gIiRERVZOQU1FIGV4aXN0cyIKKwlpZiBibG9ja2RldiAtLXJlcmVhZHB0ICIkREVWTkFNRSI7IHRoZW4KKwkJZWNobyAiYmxvY2tkZXYgLS1yZXJlYWRwdCBzdWNjZWVkZWQiCisJCWV4aXQgMAorCWZpCisJZWNobyAiYmxvY2tkZXYgLS1yZXJlYWRwdCBmYWlsZWQsIGV4aXQgY29kZTogJD8iCitkb25lCitlY2hvICJUaW1lZCBvdXQiCispICYKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL21kZXZfZmF0LmNvbmYgYi9leGFtcGxlcy9tZGV2X2ZhdC5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMGQyNzAKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9tZGV2X2ZhdC5jb25mCkBAIC0wLDAgKzEsMTUwIEBACisjCisjIFRoaXMgaXMgYSBzYW1wbGUgbWRldi5jb25mCisjCisKKyMgUHJvdmlkZSB1c2VyLCBncm91cCwgYW5kIG1vZGUgaW5mb3JtYXRpb24gZm9yIGRldmljZXMuICBJZiBhIHJlZ2V4IG1hdGNoZXMKKyMgdGhlIGRldmljZSBuYW1lIHByb3ZpZGVkIGJ5IHN5c2ZzLCB1c2UgdGhlIGFwcHJvcHJpYXRlIHVzZXI6Z3JvdXAgYW5kIG1vZGUKKyMgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCAwOjAgNjYwLgorIworIyBTeW50YXg6CisjIFstXVtFTlZWQVI9cmVnZXg7XS4uLmRldmljZW5hbWVfcmVnZXggdXNlcjpncm91cCBtb2RlIFs9cGF0aF18Wz5wYXRoXXxbIV0gW0B8JHwqY21kIGFyZ3MuLi5dCisjIFstXVtFTlZWQVI9cmVnZXg7XS4uLkBtYWosbWluWy1taW4yXSAgdXNlcjpncm91cCBtb2RlIFs9cGF0aF18Wz5wYXRoXXxbIV0gW0B8JHwqY21kIGFyZ3MuLi5dCisjIFstXSRFTlZWQVI9cmVnZXggICAgICAgICAgICAgICAgICAgICAgdXNlcjpncm91cCBtb2RlIFs9cGF0aF18Wz5wYXRoXXxbIV0gW0B8JHwqY21kIGFyZ3MuLi5dCisjCisjIFstXTogZG8gbm90IHN0b3Agb24gdGhpcyBtYXRjaCwgY29udGludWUgcmVhZGluZyBtZGV2LmNvbmYKKyMgPTogbW92ZSwgPjogbW92ZSBhbmQgY3JlYXRlIGEgc3ltbGluaworIyAhOiBkbyBub3QgY3JlYXRlIGRldmljZSBub2RlCisjIEB8JHwqOiBydW4gY21kIGlmICRBQ1RJT049cmVtb3ZlLCBAY21kIGlmICRBQ1RJT049YWRkLCAqY21kIGluIGFsbCBjYXNlcworCisjIHN1cHBvcnQgbW9kdWxlIGxvYWRpbmcgb24gaG90cGx1ZworJE1PREFMSUFTPS4qCXJvb3Q6cm9vdCA2NjAgQG1vZHByb2JlICIkTU9EQUxJQVMiCisKKyMgbnVsbCBtYXkgYWxyZWFkeSBleGlzdDsgdGhlcmVmb3JlIG1vZGUgaGFzIHRvIGJlIGNoYW5nZWQgd2l0aCBjb21tYW5kCitudWxsCQlyb290OnJvb3QgNjY2IEBjaG1vZCA2NjYgJE1ERVYKK3plcm8JCXJvb3Q6cm9vdCA2NjYKK2Z1bGwJCXJvb3Q6cm9vdCA2NjYKK3JhbmRvbQkJcm9vdDpyb290IDQ0NAordXJhbmRvbQkJcm9vdDpyb290IDQ0NAoraHdyYW5kb20Jcm9vdDpyb290IDQ0NAorZ3JzZWMJCXJvb3Q6cm9vdCA2NjAKKwora21lbQkJcm9vdDpyb290IDY0MAorbWVtCQlyb290OnJvb3QgNjQwCitwb3J0CQlyb290OnJvb3QgNjQwCisjIGNvbnNvbGUgbWF5IGFscmVhZHkgZXhpc3Q7IHRoZXJlZm9yZSBtb2RlIGhhcyB0byBiZSBjaGFuZ2VkIHdpdGggY29tbWFuZAorY29uc29sZQkJcm9vdDp0dHkgNjAwIEBjaG1vZCA2MDAgJE1ERVYKK3B0bXgJCXJvb3Q6dHR5IDY2NgorcHR5LioJCXJvb3Q6dHR5IDY2MAorCisjIFR5cGljYWwgZGV2aWNlcworCit0dHkJCXJvb3Q6dHR5IDY2NgordHR5WzAtOV0qCXJvb3Q6dHR5IDY2MAordmNzYSpbMC05XSoJcm9vdDp0dHkgNjYwCit0dHlTWzAtOV0qCXJvb3Q6dXVjcCA2NjAKKworIyBibG9jayBkZXZpY2VzCityYW0oWzAtOV0qKQlyb290OmRpc2sgNjYwID5yZC8lMQorbG9vcChbMC05XSspCXJvb3Q6ZGlzayA2NjAgPmxvb3AvJTEKK3NkW2Etel0uKglyb290OmRpc2sgNjYwICovbGliL21kZXYvdXNiZGlza19saW5rCitoZFthLXpdWzAtOV0qCXJvb3Q6ZGlzayA2NjAgKi9saWIvbWRldi9pZGVfbGlua3MKK21kWzAtOV0qCXJvb3Q6ZGlzayA2NjAKK3NyWzAtOV0qCXJvb3Q6Y2Ryb20gNjYwIEBsbiAtc2YgJE1ERVYgY2Ryb20KK2ZkWzAtOV0qCXJvb3Q6ZmxvcHB5IDY2MAorCisjIG5ldCBkZXZpY2VzCitTVUJTWVNURU09bmV0Oy4qIHJvb3Q6cm9vdCA2MDAgQG5hbWVpZgordHVuWzAtOV0qCXJvb3Q6cm9vdCA2MDAgPW5ldC8KK3RhcFswLTldKglyb290OnJvb3QgNjAwID1uZXQvCisKKyMgYWxzYSBzb3VuZCBkZXZpY2VzIGFuZCBhdWRpbyBzdHVmZgorcGNtLioJCXJvb3Q6YXVkaW8gNjYwID1zbmQvCitjb250cm9sLioJcm9vdDphdWRpbyA2NjAgPXNuZC8KK21pZGkuKgkJcm9vdDphdWRpbyA2NjAgPXNuZC8KK3NlcQkJcm9vdDphdWRpbyA2NjAgPXNuZC8KK3RpbWVyCQlyb290OmF1ZGlvIDY2MCA9c25kLworIyBmb3Iga2VybmVscy9tZGV2cyB3aGljaCBleHBvc2UgZnVsbCBwYXRoIG9mIGFsc2EgZGV2aWNlczoKK3NuZC9wY20uKglyb290OmF1ZGlvIDY2MAorc25kL2NvbnRyb2wuKglyb290OmF1ZGlvIDY2MAorc25kL21pZGkuKglyb290OmF1ZGlvIDY2MAorc25kL3NlcQkJcm9vdDphdWRpbyA2NjAKK3NuZC90aW1lcglyb290OmF1ZGlvIDY2MAorCithZHNwCQlyb290OmF1ZGlvIDY2MCA+c291bmQvCithdWRpbwkJcm9vdDphdWRpbyA2NjAgPnNvdW5kLworZHNwCQlyb290OmF1ZGlvIDY2MCA+c291bmQvCittaXhlcgkJcm9vdDphdWRpbyA2NjAgPnNvdW5kLworc2VxdWVuY2VyLioJcm9vdDphdWRpbyA2NjAgPnNvdW5kLworCisjIExlc3MgdHlwaWNhbCBkZXZpY2VzCisKKyMgcmFpZCBjb250cm9sbGVycworY2Npc3MhKC4qKQlyb290OmRpc2sgNjYwID1jY2lzcy8lMQoraWRhISguKikJcm9vdDpkaXNrIDY2MCA9aWRhLyUxCityZCEoLiopCQlyb290OmRpc2sgNjYwID1yZC8lMQorCit0dHlMVE1bMC05XQlyb290OmRpYWxvdXQgNjYwIEBsbiAtc2YgJE1ERVYgbW9kZW0KK3R0eVNIU0ZbMC05XQlyb290OmRpYWxvdXQgNjYwIEBsbiAtc2YgJE1ERVYgbW9kZW0KK3NsYW1yCQlyb290OmRpYWxvdXQgNjYwIEBsbiAtc2YgJE1ERVYgc2xhbXIwCitzbHVzYgkJcm9vdDpkaWFsb3V0IDY2MCBAbG4gLXNmICRNREVWIHNsdXNiMAorCitmdXNlCQlyb290OnJvb3QgNjY2CisKKyMgZHJpIGRldmljZQorY2FyZFswLTldCXJvb3Q6dmlkZW8gNjYwID1kcmkvCisKKyMgbWlzYyBzdHVmZgorYWdwZ2FydAkJcm9vdDpyb290IDY2MCA+bWlzYy8KK3BzYXV4CQlyb290OnJvb3QgNjYwID5taXNjLworcnRjCQlyb290OnJvb3QgNjY0ID5taXNjLworCisjIGlucHV0IHN0dWZmCitldmVudFswLTldKwlyb290OnJvb3QgNjQwID1pbnB1dC8KK21pY2UJCXJvb3Q6cm9vdCA2NDAgPWlucHV0LworbW91c2VbMC05XQlyb290OnJvb3QgNjQwID1pbnB1dC8KK3RzWzAtOV0JCXJvb3Q6cm9vdCA2MDAgPWlucHV0LworCisjIHY0bCBzdHVmZgordmJpWzAtOV0Jcm9vdDp2aWRlbyA2NjAgPnY0bC8KK3ZpZGVvWzAtOV0Jcm9vdDp2aWRlbyA2NjAgPnY0bC8KKworIyBkdmIgc3R1ZmYKK2R2Yi4qCQlyb290OnZpZGVvIDY2MCAqL2xpYi9tZGV2L2R2YmRldgorCisjIGxvYWQgZHJpdmVycyBmb3IgdXNiIGRldmljZXMKK3VzYmRldlswLTldLlswLTldCXJvb3Q6cm9vdCA2NjAgKi9saWIvbWRldi91c2JkZXYKK3VzYmRldlswLTldLlswLTldXy4qCXJvb3Q6cm9vdCA2NjAKKworIyB6YXB0ZWwgZGV2aWNlcworemFwKC4qKQkJcm9vdDpkaWFsb3V0IDY2MCA9emFwLyUxCitkYWhkaSEoLiopCXJvb3Q6ZGlhbG91dCA2NjAgPWRhaGRpLyUxCisKKyMgSFRDIEFuZHJvaWQKKyMgQXR0YWNoaW5nIGl0IHZpYSBVU0IgY2FibGUgY2F1c2VzIGEgZmx1cnJ5IG9mIGFjdGl2aXR5OgorIworIyBtZGV2WzEyNzFdOiA0OC42Mzk0NTkgQUNUSU9OOmFkZCBTVUJTWVNURU06dXNiIERFVk5BTUU6YnVzL3VzYi8wMDEvMDA5IERFVlBBVEg6L2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAwOjAyLjEvdXNiMS8xLTUKKyMgbWRldlsxMjcxXTogbWtub2QgYnVzL3VzYi8wMDEvMDA5ICgxODksOCkgMjA2NjAgMDowCisjIG1kZXZbMTI3Ml06IDQ4LjY0MjM1NCBBQ1RJT046YWRkIFNVQlNZU1RFTTp1c2IgREVWTkFNRToobnVsbCkgREVWUEFUSDovZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6MDIuMS91c2IxLzEtNS8xLTU6MS4wCisjIG1kZXZbMTI3Ml06IHJ1bm5pbmc6IG1vZHByb2JlICIkTU9EQUxJQVMiCisjIG1kZXZbMTI3M106IDQ4LjY1MDA3OCBBQ1RJT046YWRkIFNVQlNZU1RFTTpzY3NpIERFVk5BTUU6KG51bGwpIERFVlBBVEg6L2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAwOjAyLjEvdXNiMS8xLTUvMS01OjEuMC9ob3N0MTEKKyMgbWRldlsxMjc0XTogNDguNjUxMjk3IEFDVElPTjphZGQgU1VCU1lTVEVNOnNjc2lfaG9zdCBERVZOQU1FOihudWxsKSBERVZQQVRIOi9kZXZpY2VzL3BjaTAwMDA6MDAvMDAwMDowMDowMi4xL3VzYjEvMS01LzEtNToxLjAvaG9zdDExL3Njc2lfaG9zdC9ob3N0MTEKKyMgbWRldlsxMjc1XTogNDkuNjQ5NDIyIEFDVElPTjphZGQgU1VCU1lTVEVNOnNjc2kgREVWTkFNRToobnVsbCkgREVWUEFUSDovZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6MDIuMS91c2IxLzEtNS8xLTU6MS4wL2hvc3QxMS90YXJnZXQxMTowOjAKKyMgbWRldlsxMjc2XTogNDkuNjUwNzAzIEFDVElPTjphZGQgU1VCU1lTVEVNOnNjc2kgREVWTkFNRToobnVsbCkgREVWUEFUSDovZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6MDIuMS91c2IxLzEtNS8xLTU6MS4wL2hvc3QxMS90YXJnZXQxMTowOjAvMTE6MDowOjAKKyMgbWRldlsxMjc2XTogcnVubmluZzogbW9kcHJvYmUgIiRNT0RBTElBUyIKKyMgbW9kcHJvYmU6IG1vZHVsZSBzY3NpOnQtMHgwMCBub3QgZm91bmQgaW4gbW9kdWxlcy5kZXAKKyMgbWRldlsxMjc3XTogNDkuNjU4MDAyIEFDVElPTjphZGQgU1VCU1lTVEVNOnNjc2lfZGlzayBERVZOQU1FOihudWxsKSBERVZQQVRIOi9kZXZpY2VzL3BjaTAwMDA6MDAvMDAwMDowMDowMi4xL3VzYjEvMS01LzEtNToxLjAvaG9zdDExL3RhcmdldDExOjA6MC8xMTowOjA6MC9zY3NpX2Rpc2svMTE6MDowOjAKKyMgbWRldlsxMjc4XTogNDkuNjU5MjQ0IEFDVElPTjphZGQgU1VCU1lTVEVNOnNjc2lfZGV2aWNlIERFVk5BTUU6KG51bGwpIERFVlBBVEg6L2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAwOjAyLjEvdXNiMS8xLTUvMS01OjEuMC9ob3N0MTEvdGFyZ2V0MTE6MDowLzExOjA6MDowL3Njc2lfZGV2aWNlLzExOjA6MDoKKyMgbWRldlsxMjc5XTogNDkuNjYwNTM1IEFDVElPTjphZGQgU1VCU1lTVEVNOmJzZyBERVZOQU1FOmJzZy8xMTowOjA6MCBERVZQQVRIOi9kZXZpY2VzL3BjaTAwMDA6MDAvMDAwMDowMDowMi4xL3VzYjEvMS01LzEtNToxLjAvaG9zdDExL3RhcmdldDExOjA6MC8xMTowOjA6MC9ic2cvMTE6MDowOjAKKyMgbWRldlsxMjc5XTogbWtub2QgYnNnLzExOjA6MDowICgyNTMsMSkgMjA2NjAgMDowCisjIG1kZXZbMTI4MF06IDQ5LjY2MzUxNiBBQ1RJT046YWRkIFNVQlNZU1RFTTpiZGkgREVWTkFNRToobnVsbCkgREVWUEFUSDovZGV2aWNlcy92aXJ0dWFsL2JkaS84OjE2CisjIG1kZXZbMTI4MV06IDQ5LjY2NDc0OCBBQ1RJT046YWRkIFNVQlNZU1RFTTpibG9jayBERVZOQU1FOnNkYiBERVZQQVRIOi9ibG9jay9zZGIKKyMgbWRldlsxMjgxXTogbWtub2Qgc2RiICg4LDE2KSA2MDY2MCAwOjAKKyMgbWRldlsxMjgyXTogNDkuNjc3NTk3IEFDVElPTjpjaGFuZ2UgU1VCU1lTVEVNOmJsb2NrIERFVk5BTUU6c2RiIERFVlBBVEg6L2Jsb2NrL3NkYgorIyBtZGV2WzEyODNdOiA1MC42OTI5MzYgQUNUSU9OOmNoYW5nZSBTVUJTWVNURU06YmxvY2sgREVWTkFNRTpzZGIgREVWUEFUSDovYmxvY2svc2RiCisjCisjIFdlIGFyZSBob29raW5nIHRvIHRoZSBsYXN0IGV2ZW50cy4gVG8gYXZvaWQgaGF2aW5nIHR3byBzY3JpcHRzIHJ1bm5pbmcsCisjIHdlIGNoZWNrIGZvciBESVNLX01FRElBX0NIQU5HRT0xIChwcmV2IHRvIGxhc3QgZXZlbnQgaGFzIGl0LAorIyBhbmQgaXQncyB0aGUgX29ubHlfIGRpZmZlcmVuY2UgaW4gZW52IGZvciB0aGVzZSB0d28gZXZlbnRzIGFzIG9mIGtlcm5lbCAzLjcuNykKKyMgVW5mb3J0dW5hdGVseSwgdGhlcmUgaXMgbm8gZXZlbnQgZm9yICJ1c2VyIHByZXNzZWQgW1R1cm4gVVNCIHN0b3JhZ2Ugb25dIGJ0biIhCisjIFNjcmlwdCBtZXJlbHkgYmFja2dyb3VuZHMgYW5kIHRyaWVzIHRvIHJlc2NhbiBwYXJ0aXRpb24gdGFibGUgZm9yIDEgbWludXRlOgorQUNUSU9OPWNoYW5nZTtTVUJTWVNURU09YmxvY2s7RElTS19NRURJQV9DSEFOR0U9MTsuKiAgICAwOjAgNjYwICovZXRjL21kZXYuY29uZi5jaGFuZ2VfYmxvY2tkZXYuc2gKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL21rMmtuci5wbCBiL2V4YW1wbGVzL21rMmtuci5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMjU5Yjg0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWsya25yLnBsCkBAIC0wLDAgKzEsODQgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworIworIyBAKCMpIG1rMmtuci5wbCAtIGdlbmVyYXRlcyBhIHBlcmwgc2NyaXB0IHRoYXQgY29udmVydHMgbGV4ZW1lcyB0byBLJlItc3R5bGUKKyMKKyMgSG93IHRvIHVzZSB0aGlzIHNjcmlwdDoKKyMgIC0gSW4gdGhlIGJ1c3lib3ggZGlyZWN0b3J5IHR5cGUgJ2V4YW1wbGVzL21rMmtuci5wbCBmaWxlcy10by1jb252ZXJ0JworIyAgLSBSZXZpZXcgdGhlICdjb252ZXJ0bWUucGwnIHNjcmlwdCBnZW5lcmF0ZWQgYW5kIHJlbW92ZSAvIGVkaXQgYW55IG9mIHRoZQorIyAgICBzdWJzdGl0dXRpb25zIGluIHRoZXJlIChwbGVhc2UgZXNwZWNpYWxseSBjaGVjayBmb3IgZmFsc2UgcG9zaXRpdmVzKQorIyAgLSBUeXBlICcuL2NvbnZlcnRtZS5wbCBzYW1lLWZpbGVzLWFzLWJlZm9yZScKKyMgIC0gQ29tcGlsZSBhbmQgc2VlIGlmIGl0IHdvcmtzCisjCisjIEJVR1M6IFRoaXMgc2NyaXB0IGRvZXMgbm90IGlnbm9yZSBzdHJpbmdzIGluc2lkZSBjb21tZW50cyBvciBzdHJpbmdzIGluc2lkZQorIyBxdW90ZXMgKGl0IHByb2JhYmx5IHNob3VsZCkuCisKKyMgc2V0IHRoaXMgdG8gc29tZXRoaW5nIGVsc2UgaWYgeW91IHdhbnQKKyRjb252ZXJ0bWUgPSAnY29udmVydG1lLnBsJzsKKworIyBpbnRlcm5hbC11c2UgdmFyaWFibGVzIChkb24ndCB0b3VjaCkKKyRjb252ZXJ0ID0gMDsKKyVjb252ZXJ0ZWQgPSAoKTsKKworIyBpZiBubyBmaWxlcyB3ZXJlIHNwZWNpZmllZCwgcHJpbnQgdXNhZ2UKK2RpZSAidXNhZ2U6ICQwIGZpbGUuYyB8IGZpbGUuaFxuIiBpZiBzY2FsYXIoQEFSR1YpID09IDA7CisKKyMgcHJlcGFyZSB0aGUgImNvbnZlcnQgbWUiIGZpbGUKK29wZW4oQ00sICI+JGNvbnZlcnRtZSIpIG9yIGRpZSAiY29udmVydG1lLnBsICQhIjsKK3ByaW50IENNICIjIS91c3IvYmluL3BlcmwgLXAgLWlcblxuIjsKKworIyBwcm9jZXNzIGVhY2ggZmlsZSBwYXNzZWQgb24gdGhlIGNtZCBsaW5lCit3aGlsZSAoPD4pIHsKKworCSMgaWYgdGhlIGxpbmUgc2F5cyAiZ2V0b3B0IiBpbiBpdCBhbnl3aGVyZSwgd2UgZG9uJ3Qgd2FudCB0byBtdWNrIHdpdGggaXQKKwkjIGJlY2F1c2Ugb3B0aW9uIGxpc3RzIHRlbmQgdG8gaW5jbHVkZSBzdHJpbmdzIGxpa2UgImN4dHp2T2Y6IiB3aGljaCBnZXQKKwkjIG1hdGNoZWQgYnkgdGhlICJjaGVjayBmb3IgbWl4ZWQgY2FzZSIgcmVnZXhwcyBiZWxvdworCW5leHQgaWYgL2dldG9wdC87CisKKwkjIHRva2VuaXplIHRoZSBzdHJpbmcgaW50byBqdXN0IHRoZSB2YXJpYWJsZXMKKwl3aGlsZSAoLyhbYS16QS1aX11bYS16QS1aMC05X10qKS9nKSB7CisJCSR2YXIgPSAkMTsKKworCQkjIGlnbm9yZSB0aGUgd29yZCAiQnVzeUJveCIKKwkJbmV4dCBpZiAoJHZhciA9fiAvQnVzeUJveC8pOworCisJCSMgdGhpcyBjaGVja3MgZm9yIGphdmFTdHlsZSBvciBzekh1bmdhcmlhbk5vdGF0aW9uCisJCSRjb252ZXJ0KysgaWYgKCR2YXIgPX4gL15bYS16XStbQS1aXVthLXpdKy8pOworCisJCSMgdGhpcyBjaGVja3MgZm9yIFBhc2NhbFN0eWxlCisJCSRjb252ZXJ0KysgaWYgKCR2YXIgPX4gL15bQS1aXVthLXpdK1tBLVpdW2Etel0rLyk7CisKKwkJIyBpZiB3ZSB3YW50IHRvIGFkZCBtb3JlIGNoZWNrcywgd2UgY2FuIGFkZCAnZW0gaGVyZSwgYnV0IHRoZSBhYm92ZQorCQkjIGNoZWNrcyBjYXRjaCAianVzdCBlbm91Z2giIGFuZCBub3QgdG9vIG11Y2gsIHNvIHByb2xseSBub3QuCisKKwkJaWYgKCRjb252ZXJ0KSB7CisJCQkkY29udmVydCA9IDA7CisKKwkJCSMgc2tpcCBhaGVhZCBpZiB3ZSd2ZSBhbHJlYWR5IGRlYWx0IHdpdGggdGhpcyBvbmUKKwkJCW5leHQgaWYgKCRjb252ZXJ0ZWR7JHZhcn0pOworCisJCQkjIHJlY29yZCB0aGF0IHdlJ3ZlIGRlYWx0IHdpdGggdGhpcyB2YXIKKwkJCSRjb252ZXJ0ZWR7JHZhcn0gPSAxOworCisJCQlwcmludCBDTSAicy9cXGIkdmFyXFxiLyI7ICMgbW9yZSB0byBjb21lIGluIGp1c3QgYSBtaW51dGUKKworCQkJIyBjaGFuZ2UgdGhlIGZpcnN0IGxldHRlciB0byBsb3dlci1jYXNlCisJCQkkdmFyID0gbGNmaXJzdCgkdmFyKTsKKworCQkJIyBwdXQgdW5kZXJzY29yZXMgYmVmb3JlIGFsbCByZW1haW5pbmcgdXBwZXItY2FzZSBsZXR0ZXJzCisJCQkkdmFyID1+IHMvKFtBLVpdKS9fJDEvZzsKKworCQkJIyBub3cgY2hhbmdlIHRoZSByZW1haW5pbmcgY2hhcmFjdGVycyB0byBsb3dlci1jYXNlCisJCQkkdmFyID0gbGMoJHZhcik7CisKKwkJCXByaW50IENNICIkdmFyL2c7XG4iOworCQl9CisJfQorfQorCisjIHRpZHkgdXAgYW5kIG1ha2UgdGhlICRjb252ZXJ0bWUgc2NyaXB0IGV4ZWN1dGFibGUKK2Nsb3NlKENNKTsKK2NobW9kIDA3NTUsICRjb252ZXJ0bWU7CisKKyMgcHJpbnQgYSBoZWxwZnVsIGhlbHAgbWVzc2FnZQorcHJpbnQgIkRvbmUuIFNjaGVkdWxlZCBuYW1lIGNoYW5nZXMgYXJlIGluICRjb252ZXJ0bWUuXG4iOworcHJpbnQgIlBsZWFzZSByZXZpZXcvbW9kaWZ5IGl0IGFuZCB0aGVuIHR5cGUgLi8kY29udmVydG1lIHRvIGRvIHRoZSBzZWFyY2ggJiByZXBsYWNlLlxuIjsKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3VkaGNwL3NhbXBsZS5ib3VuZCBiL2V4YW1wbGVzL3VkaGNwL3NhbXBsZS5ib3VuZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YzlkODU3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdWRoY3Avc2FtcGxlLmJvdW5kCkBAIC0wLDAgKzEsMzUgQEAKKyMhL2Jpbi9zaAorIyBTYW1wbGUgdWRoY3BjIHJlbmV3IHNjcmlwdAorCitSRVNPTFZfQ09ORj0iL2V0Yy91ZGhjcGMvcmVzb2x2LmNvbmYiCisKK1sgLW4gIiRicm9hZGNhc3QiIF0gJiYgQlJPQURDQVNUPSJicm9hZGNhc3QgJGJyb2FkY2FzdCIKK1sgLW4gIiRzdWJuZXQiIF0gJiYgTkVUTUFTSz0ibmV0bWFzayAkc3VibmV0IgorCisvc2Jpbi9pZmNvbmZpZyAkaW50ZXJmYWNlICRpcCAkQlJPQURDQVNUICRORVRNQVNLCisKK2lmIFsgLW4gIiRyb3V0ZXIiIF0KK3RoZW4KKwllY2hvICJkZWxldGluZyByb3V0ZXJzIgorCXdoaWxlIC9zYmluL3JvdXRlIGRlbCBkZWZhdWx0IGd3IDAuMC4wLjAgZGV2ICRpbnRlcmZhY2UKKwlkbyA6CisJZG9uZQorCisJbWV0cmljPTAKKwlmb3IgaSBpbiAkcm91dGVyCisJZG8KKwkJL3NiaW4vcm91dGUgYWRkIGRlZmF1bHQgZ3cgJGkgZGV2ICRpbnRlcmZhY2UgbWV0cmljICQoKG1ldHJpYysrKSkKKwlkb25lCitmaQorCisjIE9ubHkgcmVwbGFjZSByZXNvbHYuY29uZiBpcyB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBETlMgc2VydmVyCitpZiBbIC1uICIkZG5zIiBdCit0aGVuCisJZWNobyAtbiA+ICRSRVNPTFZfQ09ORgorCVsgLW4gIiRkb21haW4iIF0gJiYgZWNobyBkb21haW4gJGRvbWFpbiA+PiAkUkVTT0xWX0NPTkYKKwlmb3IgaSBpbiAkZG5zCisJZG8KKwkJZWNobyBhZGRpbmcgZG5zICRpCisJCWVjaG8gbmFtZXNlcnZlciAkaSA+PiAkUkVTT0xWX0NPTkYKKwlkb25lCitmaQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdWRoY3Avc2FtcGxlLmRlY29uZmlnIGIvZXhhbXBsZXMvdWRoY3Avc2FtcGxlLmRlY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIyMjFiY2YKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy91ZGhjcC9zYW1wbGUuZGVjb25maWcKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKyMgU2FtcGxlIHVkaGNwYyBkZWNvbmZpZyBzY3JpcHQKKworL3NiaW4vaWZjb25maWcgJGludGVyZmFjZSAwLjAuMC4wCmRpZmYgLS1naXQgYS9leGFtcGxlcy91ZGhjcC9zYW1wbGUubmFrIGIvZXhhbXBsZXMvdWRoY3Avc2FtcGxlLm5hawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNGQwOGU2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdWRoY3Avc2FtcGxlLm5hawpAQCAtMCwwICsxLDQgQEAKKyMhL2Jpbi9zaAorIyBTYW1wbGUgdWRoY3BjIG5hayBzY3JpcHQKKworZWNobyBSZWNlaXZlZCBhIE5BSzogJG1lc3NhZ2UKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3VkaGNwL3NhbXBsZS5yZW5ldyBiL2V4YW1wbGVzL3VkaGNwL3NhbXBsZS5yZW5ldwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZGNlODQ4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdWRoY3Avc2FtcGxlLnJlbmV3CkBAIC0wLDAgKzEsMzUgQEAKKyMhL2Jpbi9zaAorIyBTYW1wbGUgdWRoY3BjIGJvdW5kIHNjcmlwdAorCitSRVNPTFZfQ09ORj0iL2V0Yy91ZGhjcGMvcmVzb2x2LmNvbmYiCisKK1sgLW4gIiRicm9hZGNhc3QiIF0gJiYgQlJPQURDQVNUPSJicm9hZGNhc3QgJGJyb2FkY2FzdCIKK1sgLW4gIiRzdWJuZXQiIF0gJiYgTkVUTUFTSz0ibmV0bWFzayAkc3VibmV0IgorCisvc2Jpbi9pZmNvbmZpZyAkaW50ZXJmYWNlICRpcCAkQlJPQURDQVNUICRORVRNQVNLCisKK2lmIFsgLW4gIiRyb3V0ZXIiIF0KK3RoZW4KKwllY2hvICJkZWxldGluZyByb3V0ZXJzIgorCXdoaWxlIC9zYmluL3JvdXRlIGRlbCBkZWZhdWx0IGd3IDAuMC4wLjAgZGV2ICRpbnRlcmZhY2UKKwlkbyA6CisJZG9uZQorCisJbWV0cmljPTAKKwlmb3IgaSBpbiAkcm91dGVyCisJZG8KKwkJL3NiaW4vcm91dGUgYWRkIGRlZmF1bHQgZ3cgJGkgZGV2ICRpbnRlcmZhY2UgbWV0cmljICQoKG1ldHJpYysrKSkKKwlkb25lCitmaQorCisjIE9ubHkgcmVwbGFjZSByZXNvbHYuY29uZiBpcyB3ZSBoYXZlIGF0IGxlYXN0IG9uZSBETlMgc2VydmVyCitpZiBbIC1uICIkZG5zIiBdCit0aGVuCisJZWNobyAtbiA+ICRSRVNPTFZfQ09ORgorCVsgLW4gIiRkb21haW4iIF0gJiYgZWNobyBkb21haW4gJGRvbWFpbiA+PiAkUkVTT0xWX0NPTkYKKwlmb3IgaSBpbiAkZG5zCisJZG8KKwkJZWNobyBhZGRpbmcgZG5zICRpCisJCWVjaG8gbmFtZXNlcnZlciAkaSA+PiAkUkVTT0xWX0NPTkYKKwlkb25lCitmaQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdWRoY3Avc2FtcGxlLnNjcmlwdCBiL2V4YW1wbGVzL3VkaGNwL3NhbXBsZS5zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWI3MTdhYwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3VkaGNwL3NhbXBsZS5zY3JpcHQKQEAgLTAsMCArMSw3IEBACisjIS9iaW4vc2gKKyMgQ3VycmVudGx5LCB3ZSBvbmx5IGRpc3BhdGNoIGFjY29yZGluZyB0byBjb21tYW5kLiAgSG93ZXZlciwgYSBtb3JlCisjIGVsYWJvcmF0ZSBzeXN0ZW0gbWlnaHQgZGlzcGF0Y2ggYnkgY29tbWFuZCBhbmQgaW50ZXJmYWNlIG9yIGRvIHNvbWUKKyMgY29tbW9uIGluaXRpYWxpemF0aW9uIGZpcnN0LCBlc3BlY2lhbGx5IGlmIG1vcmUgZGhjcCBldmVudCBub3RpZmljYXRpb25zCisjIGFyZSBhZGRlZC4KKworZXhlYyAvdXNyL3NoYXJlL3VkaGNwYy9zYW1wbGUuJDEKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3VkaGNwL3NpbXBsZS5zY3JpcHQgYi9leGFtcGxlcy91ZGhjcC9zaW1wbGUuc2NyaXB0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJhOTE3ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy91ZGhjcC9zaW1wbGUuc2NyaXB0CkBAIC0wLDAgKzEsNTIgQEAKKyMhL2Jpbi9zaAorIyB1ZGhjcGMgc2NyaXB0IGVkaXRlZCBieSBUaW0gUmlrZXIgPFRpbUBSaWtlcnMub3JnPgorCitSRVNPTFZfQ09ORj0iL2V0Yy9yZXNvbHYuY29uZiIKKworWyAtbiAiJDEiIF0gfHwgeyBlY2hvICJFcnJvcjogc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHVkaGNwYyI7IGV4aXQgMTsgfQorCitORVRNQVNLPSIiCitbIC1uICIkc3VibmV0IiBdICYmIE5FVE1BU0s9Im5ldG1hc2sgJHN1Ym5ldCIKK0JST0FEQ0FTVD0iYnJvYWRjYXN0ICsiCitbIC1uICIkYnJvYWRjYXN0IiBdICYmIEJST0FEQ0FTVD0iYnJvYWRjYXN0ICRicm9hZGNhc3QiCisKK2Nhc2UgIiQxIiBpbgorCWRlY29uZmlnKQorCQllY2hvICJTZXR0aW5nIElQIGFkZHJlc3MgMC4wLjAuMCBvbiAkaW50ZXJmYWNlIgorCQlpZmNvbmZpZyAkaW50ZXJmYWNlIDAuMC4wLjAKKwkJOzsKKworCXJlbmV3fGJvdW5kKQorCQllY2hvICJTZXR0aW5nIElQIGFkZHJlc3MgJGlwIG9uICRpbnRlcmZhY2UiCisJCWlmY29uZmlnICRpbnRlcmZhY2UgJGlwICRORVRNQVNLICRCUk9BRENBU1QKKworCQlpZiBbIC1uICIkcm91dGVyIiBdIDsgdGhlbgorCQkJZWNobyAiRGVsZXRpbmcgcm91dGVycyIKKwkJCXdoaWxlIHJvdXRlIGRlbCBkZWZhdWx0IGd3IDAuMC4wLjAgZGV2ICRpbnRlcmZhY2UgOyBkbworCQkJCToKKwkJCWRvbmUKKworCQkJbWV0cmljPTAKKwkJCWZvciBpIGluICRyb3V0ZXIgOyBkbworCQkJCWVjaG8gIkFkZGluZyByb3V0ZXIgJGkiCisJCQkJcm91dGUgYWRkIGRlZmF1bHQgZ3cgJGkgZGV2ICRpbnRlcmZhY2UgbWV0cmljICRtZXRyaWMKKwkJCQk6ICQoKCBtZXRyaWMgKz0gMSApKQorCQkJZG9uZQorCQlmaQorCisJCWVjaG8gIlJlY3JlYXRpbmcgJFJFU09MVl9DT05GIgorCQkjIElmIHRoZSBmaWxlIGlzIGEgc3ltbGluayBzb21ld2hlcmUgKGxpa2UgL2V0Yy9yZXNvbHYuY29uZgorCQkjIHBvaW50aW5nIHRvIC9ydW4vcmVzb2x2LmNvbmYpLCBtYWtlIHN1cmUgdGhpbmdzIHdvcmsuCisJCXJlYWxjb25mPSQocmVhZGxpbmsgLWYgIiRSRVNPTFZfQ09ORiIgMj4vZGV2L251bGwgfHwgZWNobyAiJFJFU09MVl9DT05GIikKKwkJdG1wZmlsZT0iJHJlYWxjb25mLSQkIgorCQk+ICIkdG1wZmlsZSIKKwkJWyAtbiAiJGRvbWFpbiIgXSAmJiBlY2hvICJzZWFyY2ggJGRvbWFpbiIgPj4gIiR0bXBmaWxlIgorCQlmb3IgaSBpbiAkZG5zIDsgZG8KKwkJCWVjaG8gIiBBZGRpbmcgRE5TIHNlcnZlciAkaSIKKwkJCWVjaG8gIm5hbWVzZXJ2ZXIgJGkiID4+ICIkdG1wZmlsZSIKKwkJZG9uZQorCQltdiAiJHRtcGZpbGUiICIkcmVhbGNvbmYiCisJCTs7Citlc2FjCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdWRoY3AvdWRoY3BkLmNvbmYgYi9leGFtcGxlcy91ZGhjcC91ZGhjcGQuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2E0NGMwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdWRoY3AvdWRoY3BkLmNvbmYKQEAgLTAsMCArMSwxMTUgQEAKKyMgU2FtcGxlIHVkaGNwZCBjb25maWd1cmF0aW9uIGZpbGUgKC9ldGMvdWRoY3BkLmNvbmYpCisjIFZhbHVlcyBzaG93biBhcmUgZGVmYXVsdHMKKworIyBUaGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgSVAgbGVhc2UgYmxvY2sKK3N0YXJ0CQkxOTIuMTY4LjAuMjAKK2VuZAkJMTkyLjE2OC4wLjI1NAorCisjIFRoZSBpbnRlcmZhY2UgdGhhdCB1ZGhjcGQgd2lsbCB1c2UKK2ludGVyZmFjZQlldGgwCisKKyMgVGhlIG1heGltdW0gbnVtYmVyIG9mIGxlYXNlcyAoaW5jbHVkZXMgYWRkcmVzc2VzIHJlc2VydmVkCisjIGJ5IE9GRkVSJ3MsIERFQ0xJTkUncywgYW5kIEFSUCBjb25mbGljdHMpLiBXaWxsIGJlIGNvcnJlY3RlZAorIyBpZiBpdCdzIGJpZ2dlciB0aGFuIElQIGxlYXNlIGJsb2NrLCBidXQgaXQgb2sgdG8gbWFrZSBpdAorIyBzbWFsbGVyIHRoYW4gbGVhc2UgYmxvY2suCisjbWF4X2xlYXNlcwkyNTQKKworIyBUaGUgYW1vdW50IG9mIHRpbWUgdGhhdCBhbiBJUCB3aWxsIGJlIHJlc2VydmVkIChsZWFzZWQgdG8gbm9ib2R5KQorIyBpZiBhIERIQ1AgZGVjbGluZSBtZXNzYWdlIGlzIHJlY2VpdmVkIChzZWNvbmRzKQorI2RlY2xpbmVfdGltZQkzNjAwCisKKyMgVGhlIGFtb3VudCBvZiB0aW1lIHRoYXQgYW4gSVAgd2lsbCBiZSByZXNlcnZlZAorIyBpZiBhbiBBUlAgY29uZmxpY3Qgb2NjdXJzIChzZWNvbmRzKQorI2NvbmZsaWN0X3RpbWUJMzYwMAorCisjIEhvdyBsb25nIGFuIG9mZmVyZWQgYWRkcmVzcyBpcyByZXNlcnZlZCAoc2Vjb25kcykKKyNvZmZlcl90aW1lCTYwCisKKyMgSWYgY2xpZW50IGFza3MgZm9yIGxlYXNlIGJlbG93IHRoaXMgdmFsdWUsIGl0IHdpbGwgYmUgcm91bmRlZCB1cAorIyB0byB0aGlzIHZhbHVlIChzZWNvbmRzKQorI21pbl9sZWFzZQk2MAorCisjIFRoZSBsb2NhdGlvbiBvZiB0aGUgcGlkIGZpbGUKKyNwaWRmaWxlCS92YXIvcnVuL3VkaGNwZC5waWQKKworIyBUaGUgbG9jYXRpb24gb2YgdGhlIGxlYXNlcyBmaWxlCisjbGVhc2VfZmlsZQkvdmFyL2xpYi9taXNjL3VkaGNwZC5sZWFzZXMKKworIyBUaGUgdGltZSBwZXJpb2QgYXQgd2hpY2ggdWRoY3BkIHdpbGwgd3JpdGUgb3V0IGxlYXNlcyBmaWxlLgorIyBJZiB0aGlzIGlzIDAsIHVkaGNwZCB3aWxsIG5ldmVyIGF1dG9tYXRpY2FsbHkgd3JpdGUgbGVhc2VzIGZpbGUuCisjIFNwZWNpZmllZCBpbiBzZWNvbmRzLgorI2F1dG9fdGltZQk3MjAwCisKKyMgRXZlcnkgdGltZSB1ZGhjcGQgd3JpdGVzIGEgbGVhc2VzIGZpbGUsIHRoZSBiZWxvdyBzY3JpcHQgd2lsbCBiZSBjYWxsZWQKKyNub3RpZnlfZmlsZQkJCSMgZGVmYXVsdDogbm8gc2NyaXB0Cisjbm90aWZ5X2ZpbGUJZHVtcGxlYXNlcwkjIHVzZWZ1bCBmb3IgZGVidWdnaW5nCisKKyMgVGhlIGZvbGxvd2luZyBhcmUgYm9vdHAgc3BlY2lmaWMgb3B0aW9ucworIyBuZXh0IHNlcnZlciB0byB1c2UgaW4gYm9vdHN0cmFwCisjc2lhZGRyCQkxOTIuMTY4LjAuMjIJIyBkZWZhdWx0OiAwLjAuMC4wIChub25lKQorIyB0ZnRwIHNlcnZlciBuYW1lCisjc25hbWUJCXpvcmFrCQkjIGRlZmF1bHQ6IG5vbmUKKyMgdGZ0cCBmaWxlIHRvIGRvd25sb2FkIChlLmcuIGtlcm5lbCBpbWFnZSkKKyNib290X2ZpbGUJL3Zhci9uZnNfcm9vdAkjIGRlZmF1bHQ6IG5vbmUKKworIyBTdGF0aWMgbGVhc2VzIG1hcAorI3N0YXRpY19sZWFzZSAwMDo2MDowODoxMTpDRTo0RSAxOTIuMTY4LjAuNTQKKyNzdGF0aWNfbGVhc2UgMDA6NjA6MDg6MTE6Q0U6M0UgMTkyLjE2OC4wLjQ0CisKKyMgVGhlIHJlbWFpbmRlciBvZiBvcHRpb25zIGFyZSBESENQIG9wdGlvbnMgYW5kIGNhbiBiZSBzcGVjaWZpZWQgd2l0aCB0aGUKKyMga2V5d29yZCAnb3B0JyBvciAnb3B0aW9uJy4gSWYgYW4gb3B0aW9uIGNhbiB0YWtlIG11bHRpcGxlIGl0ZW1zLCBzdWNoCisjIGFzIHRoZSBkbnMgb3B0aW9uLCB0aGV5IGNhbiBiZSBsaXN0ZWQgb24gdGhlIHNhbWUgbGluZSwgb3IgbXVsdGlwbGUKKyMgbGluZXMuCisjIEV4YW1wbGVzOgorb3B0CWRucwkxOTIuMTY4LjEwLjIgMTkyLjE2OC4xMC4xMAorb3B0aW9uCXN1Ym5ldAkyNTUuMjU1LjI1NS4wCitvcHQJcm91dGVyCTE5Mi4xNjguMTAuMgorb3B0CXdpbnMJMTkyLjE2OC4xMC4xMAorb3B0aW9uCWRucwkxMjkuMjE5LjEzLjgxCSMgYXBwZW5kZWQgdG8gYWJvdmUgRE5TIHNlcnZlcnMgZm9yIGEgdG90YWwgb2YgMworb3B0aW9uCWRvbWFpbglsb2NhbAorb3B0aW9uCWxlYXNlCTg2NDAwMAkJIyBkZWZhdWx0OiAxMCBkYXlzCitvcHRpb24JbXNzdGF0aWNyb3V0ZXMJMTAuMC4wLjAvOCAxMC4xMjcuMC4xCQkjIHNpbmdsZSBzdGF0aWMgcm91dGUKK29wdGlvbglzdGF0aWNyb3V0ZXMJMTAuMC4wLjAvOCAxMC4xMjcuMC4xLCAxMC4xMS4xMi4wLzI0IDEwLjExLjEyLjEKKyMgQXJiaXRyYXJ5IG9wdGlvbiBpbiBoZXggZm9ybToKK29wdGlvbgkweDA4CTAxMDIwMzA0CSMgb3B0aW9uIDg6ICJjb29raWUgc2VydmVyIElQIGFkZHI6IDEuMi4zLjQiCisKKyMgQ3VycmVudGx5IHN1cHBvcnRlZCBvcHRpb25zIChmb3IgbW9yZSBpbmZvLCBzZWUgb3B0aW9ucy5jKToKKyNvcHQgbGVhc2UgICAgICBOVU0KKyNvcHQgc3VibmV0ICAgICBJUAorI29wdCBicm9hZGNhc3QgIElQCisjb3B0IHJvdXRlciAgICAgSVBfTElTVAorI29wdCBpcHR0bCAgICAgIE5VTQorI29wdCBtdHUgICAgICAgIE5VTQorI29wdCBob3N0bmFtZSAgIFNUUklORwkJIyBjbGllbnQncyBob3N0bmFtZQorI29wdCBkb21haW4gICAgIFNUUklORwkJIyBjbGllbnQncyBkb21haW4gc3VmZml4Cisjb3B0IHNlYXJjaCAgICAgU1RSSU5HX0xJU1QJIyBzZWFyY2ggZG9tYWlucworI29wdCBuaXNkb21haW4gIFNUUklORworI29wdCB0aW1lem9uZSAgIE5VTQkJIyAobG9jYWx0aW1lIC0gVVRDX3RpbWUpIGluIHNlY29uZHMuIHNpZ25lZAorI29wdCB0ZnRwICAgICAgIFNUUklORwkJIyB0ZnRwIHNlcnZlciBuYW1lCisjb3B0IGJvb3RmaWxlICAgU1RSSU5HCQkjIHRmdHAgZmlsZSB0byBkb3dubG9hZCAoZS5nLiBrZXJuZWwgaW1hZ2UpCisjb3B0IGJvb3RzaXplICAgTlVNCQkjIHNpemUgb2YgdGhhdCBmaWxlCisjb3B0IHJvb3RwYXRoICAgU1RSSU5HCQkjIChORlMpIHBhdGggdG8gbW91bnQgYXMgcm9vdCBmcworI29wdCB3cGFkICAgICAgIFNUUklORworI29wdCBzZXJ2ZXJpZCAgIElQCQkjIGRlZmF1bHQ6IHNlcnZlcidzIElQCisjb3B0IG1lc3NhZ2UgICAgU1RSSU5HCQkjIGVycm9yIG1lc3NhZ2UgKHVkaGNwZCBzZW5kcyBpdCBvbiBzdWNjZXNzIHRvbykKKyNvcHQgdmxhbmlkICAgICBOVU0JCSMgODAyLjFQIFZMQU4gSUQKKyNvcHQgdmxhbnByaW9yaXR5IE5VTQkJIyA4MDIuMVEgVkxBTiBwcmlvcml0eQorIyBPcHRpb25zIHNwZWNpZnlpbmcgc2VydmVyKHMpCisjb3B0IGRucyAgICAgICAgSVBfTElTVAorI29wdCB3aW5zICAgICAgIElQX0xJU1QKKyNvcHQgbmlzc3J2ICAgICBJUF9MSVNUCisjb3B0IG50cHNydiAgICAgSVBfTElTVAorI29wdCBscHJzcnYgICAgIElQX0xJU1QKKyNvcHQgc3dhcHNydiAgICBJUAorIyBPcHRpb25zIHNwZWNpZnlpbmcgcm91dGVzCisjb3B0IHJvdXRlcyAgICAgSVBfUEFJUl9MSVNUCisjb3B0IHN0YXRpY3JvdXRlcyAgIFNUQVRJQ19ST1VURVMgIyBSRkMgMzQ0MiBjbGFzc2xlc3Mgc3RhdGljIHJvdXRlIG9wdGlvbgorI29wdCBtc3N0YXRpY3JvdXRlcyBTVEFUSUNfUk9VVEVTICMgc2FtZSwgdXNpbmcgTVMgb3B0aW9uIG51bWJlcgorIyBPYnNvbGV0ZSBvcHRpb25zLCBubyBsb25nZXIgc3VwcG9ydGVkCisjb3B0IGxvZ3NydiAgICAgSVBfTElTVAkjIDcwNC9VRFAgbG9nIHNlcnZlciAobm90IHN5c2xvZyEpCisjb3B0IG5hbWVzcnYgICAgSVBfTElTVAkjIElFTiAxMTYgbmFtZSBzZXJ2ZXIsIG9ic29sZXRlIChBdWd1c3QgMTk3OSEhISkKKyNvcHQgY29va2llc3J2ICBJUF9MSVNUCSMgUkZDIDg2NSAicXVvdGUgb2YgdGhlIGRheSIgc2VydmVyLCByYXJlbHkgKG5ldmVyPykgdXNlZAorI29wdCB0aW1lc3J2ICAgIElQX0xJU1QJIyBSRkMgODY4IHRpbWUgc2VydmVyLCByYXJlbHkgKG5ldmVyPykgdXNlZAorIyBUT0RPOiBpbiBkZXZlbG9wbWVudAorI29wdCB1c2VyY2xhc3MgIFNUUklORwkJIyBSRkMgMzAwNC4gc2V0IG9mIExBU0NJSSBzdHJpbmdzLiAiSSBhbSBhIHByaW50ZXIiIGV0YworI29wdCBzaXBzZXJ2ICAgIFNUUklORyBMSVNUCSMgUkZDIDMzNjEuIGZsYWcgYnl0ZSwgdGhlbjogMDogZG9tYWluIG5hbWVzLCAxOiBJUCBhZGRycwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdW5kZWIgYi9leGFtcGxlcy91bmRlYgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNzEwNGU5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdW5kZWIKQEAgLTAsMCArMSw1MyBAQAorIyEvYmluL3NoCisjCisjIFRoaXMgc2hvdWxkIHdvcmsgd2l0aCB0aGUgR05VIHZlcnNpb24gb2YgdGFyIGFuZCBnemlwIQorIyBUaGlzIHNob3VsZCB3b3JrIHdpdGggdGhlIGJhc2ggb3IgYXNoIHNoZWxsIQorIyBSZXF1aXJlcyB0aGUgcHJvZ3JhbXMgKGFyLCB0YXIsIGd6aXAsIGFuZCB0aGUgcGFnZXIgbW9yZSBvciBsZXNzKS4KKyMKK3VzYWdlKCkgeworZWNobyAiVXNhZ2U6IHVuZGViIC1jIHBhY2thZ2UuZGViICAgICAgICAgICAgPFByaW50IGNvbnRyb2wgZmlsZSBpbmZvPiIKK2VjaG8gIiAgICAgICB1bmRlYiAtbCBwYWNrYWdlLmRlYiAgICAgICAgICAgIDxMaXN0IGNvbnRlbnRzIG9mIGRlYiBwYWNrYWdlPiIKK2VjaG8gIiAgICAgICB1bmRlYiAteCBwYWNrYWdlLmRlYiAvZm9vL2JvbyAgIDxFeHRyYWN0IGRlYiBwYWNrYWdlIHRvIHRoaXMgZGlyZWN0b3J5LCIKK2VjaG8gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXQgLiBmb3IgY3VycmVudCBkaXJlY3Rvcnk+IgorZXhpdAorfQorCitkZWI9JDIKKworZXhpc3QoKSB7CitpZiBbICIkZGViIiA9ICIiIF07IHRoZW4KK3VzYWdlCitlbGlmIFsgISAtcyAiJGRlYiIgXTsgdGhlbgorZWNobyAiQ2FuJ3QgZmluZCAkZGViISIKK2V4aXQKK2ZpCit9CisKK2lmIFsgIiQxIiA9ICIiIF07IHRoZW4KK3VzYWdlCitlbGlmIFsgIiQxIiA9ICItbCIgXTsgdGhlbgorZXhpc3QKK3R5cGUgbW9yZSA+L2Rldi9udWxsIDI+JjEgJiYgcGFnZXI9bW9yZQordHlwZSBsZXNzID4vZGV2L251bGwgMj4mMSAmJiBwYWdlcj1sZXNzCitbICIkcGFnZXIiID0gIiIgXSAmJiBlY2hvICJObyBwYWdlciBmb3VuZCEiICYmIGV4aXQKKyhhciAtcCAkZGViIGNvbnRyb2wudGFyLmd6IHwgdGFyIC14ek8gKmNvbnRyb2wgOyBlY2hvIC1lICJcblByZXNzIGVudGVyIHRvIHNjcm9sbCwgcSB0byBRdWl0IVxuIiA7IGFyIC1wICRkZWIgZGF0YS50YXIuZ3ogfCB0YXIgLXR6dikgfCAkcGFnZXIKK2V4aXQKK2VsaWYgWyAiJDEiID0gIi1jIiBdOyB0aGVuCitleGlzdAorYXIgLXAgJGRlYiBjb250cm9sLnRhci5neiB8IHRhciAteHpPICpjb250cm9sCitleGl0CitlbGlmIFsgIiQxIiA9ICIteCIgXTsgdGhlbgorZXhpc3QKK2lmIFsgIiQzIiA9ICIiIF07IHRoZW4KK3VzYWdlCitlbGlmIFsgISAtZCAiJDMiIF07IHRoZW4KK2VjaG8gIk5vIHN1Y2ggZGlyZWN0b3J5ICQzISIKK2V4aXQKK2ZpCithciAtcCAkZGViIGRhdGEudGFyLmd6IHwgdGFyIC14enZwZiAtIC1DICQzIHx8IGV4aXQKK2VjaG8KK2VjaG8gIkV4dHJhY3RlZCAkZGViIHRvICQzISIKK2V4aXQKK2Vsc2UKK3VzYWdlCitmaQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdW5ycG0gYi9leGFtcGxlcy91bnJwbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43ZmQzNjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdW5ycG0KQEAgLTAsMCArMSw0OCBAQAorIyEvYmluL3NoCisjCisjIFRoaXMgc2hvdWxkIHdvcmsgd2l0aCB0aGUgR05VIHZlcnNpb24gb2YgY3BpbyBhbmQgZ3ppcCEKKyMgVGhpcyBzaG91bGQgd29yayB3aXRoIHRoZSBiYXNoIG9yIGFzaCBzaGVsbCEKKyMgUmVxdWlyZXMgdGhlIHByb2dyYW1zIChjcGlvLCBnemlwLCBhbmQgdGhlIHBhZ2VyIG1vcmUgb3IgbGVzcykuCisjCit1c2FnZSgpIHsKK2VjaG8gIlVzYWdlOiB1bnJwbSAtbCBwYWNrYWdlLnJwbSAgICAgICAgICAgIDxMaXN0IGNvbnRlbnRzIG9mIHJwbSBwYWNrYWdlPiIKK2VjaG8gIiAgICAgICB1bnJwbSAteCBwYWNrYWdlLnJwbSAvZm9vL2JvbyAgIDxFeHRyYWN0IHJwbSBwYWNrYWdlIHRvIHRoaXMgZGlyZWN0b3J5LCIKK2VjaG8gIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXQgLiBmb3IgY3VycmVudCBkaXJlY3Rvcnk+IgorZXhpdAorfQorCitycG09JDIKKworZXhpc3QoKSB7CitpZiBbICIkcnBtIiA9ICIiIF07IHRoZW4KK3VzYWdlCitlbGlmIFsgISAtcyAiJHJwbSIgXTsgdGhlbgorZWNobyAiQ2FuJ3QgZmluZCAkcnBtISIKK2V4aXQKK2ZpCit9CisKK2lmIFsgIiQxIiA9ICIiIF07IHRoZW4KK3VzYWdlCitlbGlmIFsgIiQxIiA9ICItbCIgXTsgdGhlbgorZXhpc3QKK3R5cGUgbW9yZSA+L2Rldi9udWxsIDI+JjEgJiYgcGFnZXI9bW9yZQordHlwZSBsZXNzID4vZGV2L251bGwgMj4mMSAmJiBwYWdlcj1sZXNzCitbICIkcGFnZXIiID0gIiIgXSAmJiBlY2hvICJObyBwYWdlciBmb3VuZCEiICYmIGV4aXQKKyhlY2hvIC1lICJcblByZXNzIGVudGVyIHRvIHNjcm9sbCwgcSB0byBRdWl0IVxuIiA7IHJwbTJjcGlvICRycG0gfCBjcGlvIC10diAtLXF1aWV0KSB8ICRwYWdlcgorZXhpdAorZWxpZiBbICIkMSIgPSAiLXgiIF07IHRoZW4KK2V4aXN0CitpZiBbICIkMyIgPSAiIiBdOyB0aGVuCit1c2FnZQorZWxpZiBbICEgLWQgIiQzIiBdOyB0aGVuCitlY2hvICJObyBzdWNoIGRpcmVjdG9yeSAkMyEiCitleGl0CitmaQorcnBtMmNwaW8gJHJwbSB8ICh1bWFzayAwIDsgY2QgJDMgOyBjcGlvIC1pZG11dikgfHwgZXhpdAorZWNobworZWNobyAiRXh0cmFjdGVkICRycG0gdG8gJDMhIgorZXhpdAorZWxzZQordXNhZ2UKK2ZpCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9SRUFETUUgYi9leGFtcGxlcy92YXJfc2VydmljZS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFkMWIyNQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL1JFQURNRQpAQCAtMCwwICsxLDY4IEBACitJbiBtYW55IGNhc2VzLCBuZXR3b3JrIGNvbmZpZ3VyYXRpb24gbWFrZXMgaXQgbmVjZXNzYXJ5IHRvIHJ1biBzZXZlcmFsIGRhZW1vbnM6CitkaGNwLCB6ZXJvY29uZiwgcHBwLCBvcGVudnBuIGFuZCBzdWNoLiBUaGV5IG5lZWQgdG8gYmUgY29udHJvbGxlZCwKK2FuZCBpbiBtYW55IGNhc2VzIHlvdSBhbHNvIHdhbnQgdG8gYmFieXNpdCB0aGVtLiBydW5zdmRpciBpcyBhIGdvb2QgdG9vbCBmb3IgdGhpcy4KK2V4YW1wbGVzL3Zhcl9zZXJ2aWNlIGRpcmVjdG9yeSBwcm92aWRlcyBhIGZldyBleGFtcGxlcy4gSXQgaXMgbWVhbnQgdG8gYmUgdXNlZAordGhpcyB3YXk6IGNvcHkgaXQgc29tZXdoZXJlIChzYXksIC92YXIvc2VydmljZSkgYW5kIHJ1biBzb21ldGhpbmcgbGlrZQorCitlbnYgLSBQQVRIPS4uLiA8b3RoZXIgdmFycz0uLi4+IHJ1bnN2ZGlyIC92YXIvc2VydmljZSAmCisKK2Zyb20gb25lIG9mIHN5c3RlbSBzdGFydHVwIHNjcmlwdHMuIChHb29nbGUgIm1hbiBydW5zdmRpciIgYW5kICJtYW4gcnVuc3YiCitmb3IgbW9yZSBpbmZvIGFib3V0IHRoZXNlIHRvb2xzKS4KKworWW91IGNhbiB0cnkgb3IgZGVidWcgYW4gaW5kaXZpZHVhbCBzZXJ2aWNlIGJ5IHJ1bm5pbmcgaXRzIFNFUlZJQ0VfRElSL3J1biBzY3JpcHQuCitJbiB0aGlzIGNhc2UsIGl0cyBzdGRvdXQgYW5kIHN0ZGVyciBnbyB0byB5b3VyIHRlcm1pbmFsLgorCitZb3UgY2FuIGFsc28gcnVuICJydW5zdiBTRVJWSUNFX0RJUiIsIHdoaWNoIHJ1bnMgYm90aCB0aGUgc2VydmljZQorYW5kIGl0cyBsb2dnZXIgc2VydmljZSAoU0VSVklDRV9ESVIvbG9nL3J1bikgaWYgbG9nZ2VyIHNlcnZpY2UgZXhpc3RzLgorSWYgbG9nZ2VyIHNlcnZpY2UgZXhpc3RzLCB0aGUgb3V0cHV0IHdpbGwgZ28gdG8gaXQgaW5zdGVhZCBvZiB0aGUgdGVybWluYWwuCisKKyJydW5zdmRpciBESVIiIG1lcmVseSBydW5zICJydW5zdiBTRVJWSUNFX0RJUiIgZm9yIGV2ZXJ5IHN1YmRpcmVjdG9yeSBpbiBESVIuCisKK1NvbWUgZXhpc3RpbmcgZXhhbXBsZXM6CisKK3Zhcl9zZXJ2aWNlL2RoY3BfaWYgLQorY29udHJvbHMgYSB1ZGhjcGMgaW5zdGFuY2Ugd2hpY2ggcHJvdmlkZXMgZGhwYy1hc3NpZ25lZCBJUAorYWRkcmVzcyBvbiBpbnRlcmZhY2UgbmFtZWQgImlmIi4gQ29weS9yZW5hbWUgdGhpcyBkaXJlY3RvcnkgYXMgbmVlZGVkIHRvIHJ1bgordWRoY3BjIG9uIG90aGVyIGludGVyZmFjZXMgKHZhcl9zZXJ2aWNlL2RoY3BfaWYvcnVuIHNjcmlwdCB1c2VzIF9mb28gc3VmZml4CitvZiB0aGUgcGFyZW50IGRpcmVjdG9yeSBhcyBpbnRlcmZhY2UgbmFtZSkuIFdoZW4gSVAgYWRkcmVzcyBpcyBvYnRhaW5lZCBvciBsb3N0LAordmFyX3NlcnZpY2UvZGhjcF9pZi9kaGNwX2hhbmRsZXIgaXMgcnVuLiBJdCBzYXZlcyBuZXcgY29uZmlnIGRhdGEgdG8KKy92YXIvcnVuL3NlcnZpY2UvZncvZGhjcF9pZi5pcGNvbmYgYW5kIChyZSlzdGFydHMgL3Zhci9zZXJ2aWNlL2Z3IHNlcnZpY2UuCitUaGlzIGV4YW1wbGUgY2FuIGJlIHVzZWQgYXMgYSB0ZW1wbGF0ZSBmb3Igb3RoZXIgZHluYW1pYyBuZXR3b3JrIGxpbmsgc2VydmljZXMKKyhwcHAvdnBuL3pjaXApLgorCit2YXJfc2VydmljZS9pZnBsdWdkX2lmIC0KK3dhdGNoZXMgbGluayBzdGF0dXMgb2YgaW50ZXJmYWNlIGlmLiBEb3ducyBhbmQgdXBzIC92YXIvc2VydmljZS9kaGNwX2lmCitzZXJ2aWNlIGFjY29yZGluZ2x5LiBJbiBlZmZlY3QsIGl0IGFsbG93cyB5b3UgdG8gdW5wbHVnL3BsdWctdG8tZGlmZmVyZW50LW5ldHdvcmsKK2FuZCBoYXZlIHlvdXIgSVAgcHJvcGVybHkgcmUtbmVnb3RpYXRlZCBhdCBvbmNlLgorCit2YXJfc2VydmljZS9kaGNwX2lmX3BpbmdlciAtCitVc2VzIHZhcl9zZXJ2aWNlL2RoY3BfaWYncyBkYXRhICgvdmFyL3NlcnZpY2UvZGhjcF9pZi9kaGNwX2lmLm91dCBmaWxlKQordG8gZGV0ZXJtaW5lIHJvdXRlciBJUC4gUGluZ3MgaXQuIElmIHBpbmcgZmFpbHMsIHJlc3RhcnRzIC92YXIvc2VydmljZS9kaGNwX2lmCitzZXJ2aWNlLiBCYXNpY2FsbHksIGFuIGV4YW1wbGUgb2Ygd2F0Y2hkb2cgc2VydmljZSBmb3IgbmV0d29ya3MKK3doaWNoIGFyZSBub3QgcmVsaWFibGUgYW5kIG5lZWQgYmFieXNpdHRpbmcuCisKK3Zhcl9zZXJ2aWNlL2Z3IC0KK0EgKm9uZS1zaG90KiBzZXJ2aWNlIHdoaWNoIHJlY29uZmlndXJlcyBuZXR3b3JrIGJhc2VkIG9uIGN1cnJlbnQga25vd24gc3RhdGUKK29mIEFMTCBpbnRlcmZhY2VzLiBVc2VzIGNvbmYvKi5pcGNvbmYgKHN0YXRpYyBjb25maWcpIGFuZCAvdmFyL3J1bi9zZXJ2aWNlL2Z3LyouaXBjb25mCisoZHluYW1pYyBjb25maWcgZnJvbSBkaGNwL3BwcC92cG4vZXRjKSB0byBkZXRlcm1pbmUgd2hhdCB0byBkby4KK09uZS1zaG90LW5lc3Mgb2YgdGhpcyBzZXJ2aWNlIG1lYW5zIHRoYXQgaXQgc2h1dHMgaXRzZWxmIG9mZiBhZnRlciBzaW5nbGUgcnVuLgorSU9XOiBpdCBpcyBub3QgYSBjb25zdGFudGx5IHJ1bm5pbmcgZGFlbW9uIHNvcnQgb2YgdGhpbmcuCitJdCBzdGFydHMsIGl0IGNvbmZpZ3VyZXMgdGhlIG5ldHdvcmssIGl0IHNodXRzIGRvd24sIGFsbCBkb25lCisodW5saWtlIGluZmFtb3VzIE5ldHdvcmtNYW5hZ2VycyB3aGljaCBzaXQgaW4gUkFNIGZvcmV2ZXIsIGRvaW5nIGhlbGwga25vd3Mgd2hhdCkuCisKK0hvd2V2ZXIsIGFueSBkaGNwL3BwcC92cG4gb3Igc2ltaWxhciBzZXJ2aWNlIGNhbiByZXN0YXJ0IGl0IGFueXRpbWUKK3doZW4gaXQgc2Vuc2VzIHRoZSBjaGFuZ2UgaW4gbmV0d29yayBjb25maWd1cmF0aW9uLgorVGhpcyBldmVuIHdvcmtzIHdoaWxlIGZ3IHNlcnZpY2UgcnVuczogaWYgZGhjcCBzaWduYWxzIGZ3IHRvIChyZSlzdGFydAord2hpbGUgZncgcnVucywgZncgd2lsbCBub3Qgc3RvcCBhZnRlciBpdHMgZXhlY3V0aW9uLCBidXQgd2lsbCByZS1leGVjdXRlIG9uY2UsCitwaWNraW5nIHVwIGRoY3AncyBuZXcgY29uZmlndXJhdGlvbi4KK1RoaXMgaXMgYWNoaWV2ZWQgdmVyeSBzaW1wbHkgYnkgaGF2aW5nCisJIyBNYWtlIG91cnNlbGYgb25lLXNob3QKKwlzdiBvIC4KK2F0IHRoZSB2ZXJ5IGJlZ2lubmluZyBvZiBmdy9ydW4gc2NyaXB0LCBub3QgYXQgdGhlIGVuZC4KK1RoZXJlZm9yZSwgYW55ICJzdiB1IC92YXIvcnVuL3NlcnZpY2UvZnciIGNvbW1hbmQgYnkgYW55IG90aGVyCitzY3JpcHQgInVuZG9lcyIgbyhuZS1zaG90KSBjb21tYW5kIGlmIGZ3IHN0aWxsIHJ1bnMsIHRodXMKK3J1bnN2IHdpbGwgcmVydW4gaXQ7IG9yIHN0YXJ0IGl0IGluIGEgbm9ybWFsIHdheSBpZiBmdyBpcyBub3QgcnVubmluZy4KKworU3lzdGVtIGFkbWluaXN0cmF0b3JzIGFyZSBleHBlY3RlZCB0byBlZGl0IGZ3L3J1biBzY3JpcHQsIHNpbmNlCituZXR3b3JrIGNvbmZpZ3VyYXRpb24gbmVlZHMgYXJlIGxpa2VseSB0byBiZSB2ZXJ5IGNvbXBsZXggYW5kIGRpZmZlcmVudAorZm9yIG5vbi10cml2aWFsIGluc3RhbGxhdGlvbnMuCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL1JFQURNRSBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWYvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZGNjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL1JFQURNRQpAQCAtMCwwICsxLDUgQEAKK1RoZSByZWFsIFJFQURNRSBmaWxlIGlzIG9uZSBkaXJlY3RvcnkgdXAuCisKK1RoaXMgZGlyZWN0b3J5J3MgcnVuIHNjcmlwdCBjYW4gaGF2ZSB1c2VmdWwgY29tbWVudHMuCitJZiBpdCBkb2Vzbid0IGJ1dCB5b3UgZmVlbCBpdCBzaG91bGQsIHBsZWFzZSBzZW5kIGEgcGF0Y2gKK3RvIGJ1c3lib3gncyBtYWlsaW5nIGxpc3QuCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL2NvbnZlcnQyaXBjb25mIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZi9jb252ZXJ0MmlwY29uZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42MmEyODhlCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZi9jb252ZXJ0MmlwY29uZgpAQCAtMCwwICsxLDQxIEBACisjIS9iaW4vc2gKKyMgY29udmVydDoKKworIyBkaGNwdHlwZT01CisjIHNlcnZlcmlkPTE3Mi4xNi40Mi4xMDIKKyMgbGVhc2U9OTcyMDAKKyMgaW50ZXJmYWNlPWV0aDAKKyMgaXA9MTcyLjE2LjQyLjE3NworIyBzdWJuZXQ9MjU1LjI1NS4yNTUuMAorIyBtYXNrPTI0CisjIGJyb2FkY2FzdD0xNzIuMTYuMjIuMjU1CisjIHJvdXRlcj0xNzIuMTYuNDIuOTgKKyMgZG5zPTEwLjM0LjMyLjEyNSAxMC4zMi42My41IDEwLjM0LjI1NS43IDEwLjExLjI1NS4yNworIyBkb21haW49bGFiLmV4YW1wbGUuY29tIGV4YW1wbGUuY29tCisjIG50cHNydj0xMC4zNC4zMi4xMjUgMTAuMzQuMjU1LjcKKworIyBpbnRvOgorCisjbGV0IGNmZz1jZmcrMQorI2lmWyRjZmddPS4uLjsgaXBbJGNmZ109Li4uOyBpcG1hc2tbJGNmZ109Li4uLy4uLjsgZ3dbJGNmZ109Li4uOyBuZXRbJGNmZ109Li4uIGRuc1skY2ZnXT0uLi4KKworZXhlYyA+L2Rldi9udWxsCisjZXhlYyA+IiQwLm91dCIgICMgZGVidWcKK2V4ZWMgMj4mMQorCit0ZXN0ICIkaW50ZXJmYWNlIiB8fCBleGl0IDEKK3Rlc3QgIiRpcCIgfHwgZXhpdCAxCisKK3sKK2VjaG8gImxldCBjZmc9Y2ZnKzEiCit0ZXN0ICIkaW50ZXJmYWNlIgkmJiBlY2hvICJpZltcJGNmZ109JyRpbnRlcmZhY2UnIgordGVzdCAiJGlwIgkJJiYgZWNobyAiaXBbXCRjZmddPSckaXAnIgordGVzdCAiJGlwIiAmJiB0ZXN0ICIkbWFzayIgXAorCQkJJiYgZWNobyAiaXBtYXNrW1wkY2ZnXT0nJGlwLyRtYXNrJyIKK3Rlc3QgIiRyb3V0ZXIiCQkmJiBlY2hvICJnd1tcJGNmZ109JyRyb3V0ZXInIgordGVzdCAiJGRucyIJCSYmIGVjaG8gImRuc1tcJGNmZ109JyRkbnMnIgorIyBUT0RPOiBJIG5ldmVyIHNhdyBhIGRoY3Agc2VydmVyIHdoaWNoIGNvcnJlY3RseSBhbm5vdW5jZXMKKyMgd2hpY2ggc3VibmV0KHMpIGlzL2FyZSBhdmFpbGFibGUgdGhydSBhZHZlcnRpc2VkIHJvdXRlcgorIyBBc3N1bWUgMC8wCitlY2hvICJuZXRbXCRjZmddPScwLzAnIgorfSA+IiQxIgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZi9jb252ZXJ0Mm50cGNvbmYgYi9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL2NvbnZlcnQybnRwY29uZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZWJmMWViCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZi9jb252ZXJ0Mm50cGNvbmYKQEAgLTAsMCArMSwzNCBAQAorIyEvYmluL3NoCisjIGNvbnZlcnQ6CisKKyMgZGhjcHR5cGU9NQorIyBzZXJ2ZXJpZD0xNzIuMTYuNDIuMTAyCisjIGxlYXNlPTk3MjAwCisjIGludGVyZmFjZT1ldGgwCisjIGlwPTE3Mi4xNi40Mi4xNzcKKyMgc3VibmV0PTI1NS4yNTUuMjU1LjAKKyMgbWFzaz0yNAorIyBicm9hZGNhc3Q9MTcyLjE2LjIyLjI1NQorIyByb3V0ZXI9MTcyLjE2LjQyLjk4CisjIGRucz0xMC4zNC4zMi4xMjUgMTAuMzIuNjMuNSAxMC4zNC4yNTUuNyAxMC4xMS4yNTUuMjcKKyMgZG9tYWluPWxhYi5leGFtcGxlLmNvbSBleGFtcGxlLmNvbQorIyBudHBzcnY9MTAuMzQuMzIuMTI1IDEwLjM0LjI1NS43CisKKyMgaW50bzoKKworI2xldCBjZmc9Y2ZnKzEKKyNudHBpcFskY2ZnXT0uLi4KKworZXhlYyA+L2Rldi9udWxsCisjZXhlYyA+IiQwLm91dCIgICMgZGVidWcKK2V4ZWMgMj4mMQorCit0ZXN0ICIkaW50ZXJmYWNlIiB8fCBleGl0IDEKK3Rlc3QgIiRpcCIgfHwgZXhpdCAxCisKK3sKK2ZvciBuIGluICRudHBzcnY7IGRvCisJZWNobyAibGV0IGNmZz1jZmcrMSIKKwllY2hvICJudHBpcFtcJGNmZ109JyRuJyI7Citkb25lCit9ID4iJDEiCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL2RoY3BfaGFuZGxlciBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWYvZGhjcF9oYW5kbGVyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkyN2UwMmEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL2RoY3BfaGFuZGxlcgpAQCAtMCwwICsxLDgzIEBACisjIS9iaW4vc2gKKyMgZXhlY3V0ZWQgYnkgdWRoY3BjCisjIHBhcmFtZXRlcnM6ICQxIGFuZCBlbnZpcm9ubWVudAorIyAkMSBpczoKKyMKKyMgZGVjb25maWc6IHVkaGNwYyBzdGFydHMsIG9yIGxlYXNlIGlzIGxvc3QuCisjIEVudmlyb25tZW50IGV4YW1wbGU6IGludGVyZmFjZT1ldGgwCisjCisjIGJvdW5kOiBsZWFzZSBpcyBvYnRhaW5lZC4gRW52aXJvbm1lbnQgZXhhbXBsZToKKyMgZGhjcHR5cGU9NQorIyBzZXJ2ZXJpZD0xNzIuMTYuNDIuMTAyCisjIGxlYXNlPTk3MjAwCisjIGludGVyZmFjZT1ldGgwCisjIGlwPTE3Mi4xNi40Mi4xNzcKKyMgc3VibmV0PTI1NS4yNTUuMjU1LjAKKyMgbWFzaz0yNAorIyBicm9hZGNhc3Q9MTcyLjE2LjIyLjI1NQorIyByb3V0ZXI9MTcyLjE2LjQyLjk4CisjIGRucz0xMC4zNC4zMi4xMjUgMTAuMzIuNjMuNSAxMC4zNC4yNTUuNyAxMC4xMS4yNTUuMjcKKyMgZG9tYWluPWxhYi5leGFtcGxlLmNvbSBleGFtcGxlLmNvbQorIyBudHBzcnY9MTAuMzQuMzIuMTI1IDEwLjM0LjI1NS43CisjCisjIHJlbmV3OiBsZWFzZSBpcyByZW5ld2VkLiBFbnZpcm9ubWVudCBpcyBzaW1pbGFyIHRvICJib3VuZCIuCisjIFRoZSBJUCBhZGRyZXNzIGRvZXMgbm90IGNoYW5nZSwgaG93ZXZlciwgdGhlIG90aGVyIERIQ1AgcGFyYW1hdGVycywKKyMgc3VjaCBhcyB0aGUgZGVmYXVsdCBnYXRld2F5LCBzdWJuZXQgbWFzaywgYW5kIGRucyBzZXJ2ZXIgbWF5IGNoYW5nZS4KKyMKKyMgbmFrOiB1ZGhjcGMgcmVjZWl2ZWQgYSBOQUsgbWVzc2FnZS4KKyMgRW52aXJvbm1lbnQgZXhhbXBsZTogaW50ZXJmYWNlPWV0aDAKKyMKKyMgbGVhc2VmYWlsOiB1ZGhjcGMgY2Fubm90IG9idGFpbiBhIGxlYXNlIChESENQIHNlcnZlciBub3QgcmVzcG9uZGluZywgZXRjKS4KKyMgRW52aXJvbm1lbnQgZXhhbXBsZTogaW50ZXJmYWNlPWV0aDAKKworIyBUT0RPOiBwdXQgJGRvbWFpbiBpbnRvIC9ldGMvcmVzb2x2LmNvbmYgKHRocnUgL3Zhci9zZXJ2aWNlL2Z3KQorCitzZXJ2aWNlPSR7UFdEIyMqL30KK2ZpbGVfaXBjb25mPSIkc2VydmljZS5pcGNvbmYiCitmaWxlX250cGNvbmY9IiRzZXJ2aWNlLm50cGNvbmYiCitkaXJfaXBjb25mPSIvdmFyL3J1bi9zZXJ2aWNlL2Z3IgorZGlyX250cGNvbmY9Ii92YXIvcnVuL3NlcnZpY2UvbnRwIgorCitleGVjID4vZGV2L251bGwKKyNleGVjID4+IiQwLm91dCIgICNkZWJ1ZworZXhlYyAyPiYxCisKK2VjaG8gImBkYXRlYDogUGFyYW1zOiAkKiIKKworaWYgdGVzdCB4IiQxIiAhPSB4ImJvdW5kIiAmJiB0ZXN0IHgiJDEiICE9IHgicmVuZXciIDsgdGhlbgorCSMgUmVjb25maWd1cmUgbmV0d29yayB3aXRoIHRoaXMgaW50ZXJmYWNlIGRpc2FibGVkCisJZWNobyAiRGVjb25maWd1cmluZyIKKwlybSAiJHNlcnZpY2Uub3V0IgorCXJtICIkZmlsZV9pcGNvbmYiCisJcm0gIiRmaWxlX250cGNvbmYiCisJcm0gIiRkaXJfaXBjb25mLyRmaWxlX2lwY29uZiIKKwlybSAiJGRpcl9udHBjb25mLyRmaWxlX250cGNvbmYiCisJc3YgdSAvdmFyL3NlcnZpY2UvZncKKwlleGl0CitmaQorCisjIEJvdW5kOiB3ZSd2ZSBnb3QgdGhlIGxlYXNlCisjZW52ID4iJHNlcnZpY2Uub3V0IiAgIyBkZWJ1ZworCisuL2NvbnZlcnQyaXBjb25mICIkZmlsZV9pcGNvbmYiCisjIFJlY29uZmlndXJlIHJvdXRpbmcgYW5kIGZpcmV3YWxsIGlmIG5lZWRlZAorZGlmZiAtLWJyaWVmICIkZmlsZV9pcGNvbmYiICIkZGlyX2lwY29uZi8kZmlsZV9pcGNvbmYiID4vZGV2L251bGwgMj4mMQoraWYgdGVzdCAkPyAhPSAwOyB0aGVuCisJZWNobyAiUmVjb25maWd1cmluZyBmdyIKKwlta2RpciAtcCAiJGRpcl9pcGNvbmYiIDI+L2Rldi9udWxsCisJY3AgIiRmaWxlX2lwY29uZiIgIiRkaXJfaXBjb25mLyRmaWxlX2lwY29uZiIKKwlzdiB1IC92YXIvc2VydmljZS9mdworZmkKKworaWYgdGVzdCAtZCAvdmFyL3NlcnZpY2UvbnRwOyB0aGVuCisJLi9jb252ZXJ0Mm50cGNvbmYgIiRmaWxlX250cGNvbmYiCisJIyBSZWNvbmZpZ3VyZSBudHAgc2VydmVyIGFkZHJlc3NlcyBpZiBuZWVkZWQKKwlkaWZmIC0tYnJpZWYgIiRmaWxlX250cGNvbmYiICIkZGlyX250cGNvbmYvJGZpbGVfbnRwY29uZiIgPi9kZXYvbnVsbCAyPiYxCisJaWYgdGVzdCAkPyAhPSAwOyB0aGVuCisJCWVjaG8gIlJlY29uZmlndXJpbmcgbnRwIgorCQlta2RpciAtcCAiJGRpcl9udHBjb25mIiAyPi9kZXYvbnVsbAorCQljcCAiJGZpbGVfbnRwY29uZiIgIiRkaXJfbnRwY29uZi8kZmlsZV9udHBjb25mIgorCQlzdiB0IC92YXIvc2VydmljZS9udHAKKwkJc3YgdSAvdmFyL3NlcnZpY2UvbnRwCisJZmkKK2ZpCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL2xvZy9ydW4gYi9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL2xvZy9ydW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTYwZDFiMQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWYvbG9nL3J1bgpAQCAtMCwwICsxLDIxIEBACisjIS9iaW4vc2gKKwordXNlcj1sb2dnZXIKKworbG9nZGlyPSIvdmFyL2xvZy9zZXJ2aWNlL2AoY2QgLi47YmFzZW5hbWUgJFBXRClgIgorbWtkaXIgLXAgIiRsb2dkaXIiIDI+L2Rldi9udWxsCitjaG93biAtUiAiJHVzZXIiOiAiJGxvZ2RpciIKK2NobW9kIC1SIGdvLXJ3eHN0LHUrcndYICIkbG9nZGlyIgorcm0gbG9nZGlyCitsbiAtcyAiJGxvZ2RpciIgbG9nZGlyCisKKyMgbWFrZSB0aGlzIGRpciBhY2Nlc3NpYmxlIHRvIGxvZ2dlcgorY2htb2QgYStyWCAuCisKK2V4ZWMgPi9kZXYvbnVsbAorZXhlYyAyPiYxCitleGVjIFwKK2VudiAtIFBBVEg9IiRQQVRIIiBcCitzb2Z0bGltaXQgXAorc2V0dWlkZ2lkICIkdXNlciIgXAorc3Zsb2dkIC10dCAiJGxvZ2RpciIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWYvcF9sb2cgYi9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL3BfbG9nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEyNTIxYmUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL3BfbG9nCkBAIC0wLDAgKzEsNCBAQAorIyEvYmluL3NoCisKK2NkIGxvZy9sb2dkaXIgfHwgZXhpdCAxCitjYXQgQCogY3VycmVudCB8ICRQQUdFUgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZi9ydW4gYi9leGFtcGxlcy92YXJfc2VydmljZS9kaGNwX2lmL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZWM3OWUwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZi9ydW4KQEAgLTAsMCArMSwyMyBAQAorIyEvYmluL3NoCisKK2V4ZWMgMj4mMQorZXhlYyA8L2Rldi9udWxsCisKK3B3ZD0iJFBXRCIKKworaWY9IiR7UFdEIyMqL2RoY3BffSIKKworZWNobyAiKiBVcHBpbmcgaWZhY2UgJGlmIgoraXAgbGluayBzZXQgZGV2ICIkaWYiIHVwCisKK2VjaG8gIiogU3RhcnRpbmcgdWRoY3BjIgorZXhlYyBcCitlbnYgLSBQQVRIPSIkUEFUSCIgXAorc29mdGxpbWl0IFwKK3NldHVpZGdpZCByb290IFwKK3VkaGNwYyAtdnYgXAorLS1ob3N0bmFtZT1udWxsIFwKKy0tZm9yZWdyb3VuZCBcCistLWludGVyZmFjZT0iJGlmIiBcCistLXBpZGZpbGU9IiRwd2QvdWRoY3BjLnBpZCIgXAorLS1zY3JpcHQ9IiRwd2QvZGhjcF9oYW5kbGVyIgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZi93X2xvZyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWYvd19sb2cKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWEzNmVmMQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWYvd19sb2cKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKworY2QgbG9nL2xvZ2RpciB8fCBleGl0IDEKK3dhdGNoIC1uMiAndz1gdHR5c2l6ZSB3YDsgaD1gdHR5c2l6ZSBoYDsgdGFpbCAtJCgoaC0zKSkgY3VycmVudCAyPiYxIHwgY3V0IC1iMS0kKCh3LTIpKScKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWZfcGluZ2VyL1JFQURNRSBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWZfcGluZ2VyL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGRjY2IyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZl9waW5nZXIvUkVBRE1FCkBAIC0wLDAgKzEsNSBAQAorVGhlIHJlYWwgUkVBRE1FIGZpbGUgaXMgb25lIGRpcmVjdG9yeSB1cC4KKworVGhpcyBkaXJlY3RvcnkncyBydW4gc2NyaXB0IGNhbiBoYXZlIHVzZWZ1bCBjb21tZW50cy4KK0lmIGl0IGRvZXNuJ3QgYnV0IHlvdSBmZWVsIGl0IHNob3VsZCwgcGxlYXNlIHNlbmQgYSBwYXRjaAordG8gYnVzeWJveCdzIG1haWxpbmcgbGlzdC4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWZfcGluZ2VyL3J1biBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2RoY3BfaWZfcGluZ2VyL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMGIyZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZGhjcF9pZl9waW5nZXIvcnVuCkBAIC0wLDAgKzEsMjMgQEAKKyMhL2Jpbi9zaAorCitkZWxheT02NworCitpZj0ke1BXRCMjKi9kaGNwX30KK2lmPSR7aWYlJV9waW5nZXJ9CisKK2lmIHRlc3QgLWYgIiQwLmxvZyI7IHRoZW4KKwl0YWlsIC05OTkgIiQwLmxvZyIgPiIkMC5sb2cubmV3IgorCW12ICIkMC5sb2cubmV3IiAiJDAubG9nIgorZmkKKwordGVzdCAtZiAiL3Zhci9zZXJ2aWNlL2RoY3BfJGlmL2RoY3BfJGlmLm91dCIgfHwgZXhlYyBlbnYgLSBzbGVlcCAiJGRlbGF5IgorLiAiL3Zhci9zZXJ2aWNlL2RoY3BfJGlmL2RoY3BfJGlmLm91dCIKK3Rlc3QgeCIkcm91dGVyIiAhPSB4IiIgfHwgZXhlYyBlbnYgLSBzbGVlcCAiJGRlbGF5IgorCisjZWNobyAiYGRhdGUgJyslWS0lbS0lZCAlSDolTTolUydgIFRlc3RpbmcgcGluZyAtYzMgJHJvdXRlciIgPj4iJDAubG9nIgorcGluZyAtYzMgIiRyb3V0ZXIiICYmIGV4ZWMgZW52IC0gc2xlZXAgIiRkZWxheSIKKworZWNobyAiYGRhdGUgJyslWS0lbS0lZCAlSDolTTolUydgIFJlc3RhcnRpbmcgL3Zhci9zZXJ2aWNlL2RoY3BfJGlmIiA+PiIkMC5sb2ciCitzdiB0ICIvdmFyL3NlcnZpY2UvZGhjcF8kaWYiCisKK2V4ZWMgZW52IC0gc2xlZXAgIiRkZWxheSIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z0cGQvUkVBRE1FIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZnRwZC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRkY2NiMgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z0cGQvUkVBRE1FCkBAIC0wLDAgKzEsNSBAQAorVGhlIHJlYWwgUkVBRE1FIGZpbGUgaXMgb25lIGRpcmVjdG9yeSB1cC4KKworVGhpcyBkaXJlY3RvcnkncyBydW4gc2NyaXB0IGNhbiBoYXZlIHVzZWZ1bCBjb21tZW50cy4KK0lmIGl0IGRvZXNuJ3QgYnV0IHlvdSBmZWVsIGl0IHNob3VsZCwgcGxlYXNlIHNlbmQgYSBwYXRjaAordG8gYnVzeWJveCdzIG1haWxpbmcgbGlzdC4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z0cGQvbG9nL3J1biBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z0cGQvbG9nL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NjBkMWIxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZnRwZC9sb2cvcnVuCkBAIC0wLDAgKzEsMjEgQEAKKyMhL2Jpbi9zaAorCit1c2VyPWxvZ2dlcgorCitsb2dkaXI9Ii92YXIvbG9nL3NlcnZpY2UvYChjZCAuLjtiYXNlbmFtZSAkUFdEKWAiCitta2RpciAtcCAiJGxvZ2RpciIgMj4vZGV2L251bGwKK2Nob3duIC1SICIkdXNlciI6ICIkbG9nZGlyIgorY2htb2QgLVIgZ28tcnd4c3QsdStyd1ggIiRsb2dkaXIiCitybSBsb2dkaXIKK2xuIC1zICIkbG9nZGlyIiBsb2dkaXIKKworIyBtYWtlIHRoaXMgZGlyIGFjY2Vzc2libGUgdG8gbG9nZ2VyCitjaG1vZCBhK3JYIC4KKworZXhlYyA+L2Rldi9udWxsCitleGVjIDI+JjEKK2V4ZWMgXAorZW52IC0gUEFUSD0iJFBBVEgiIFwKK3NvZnRsaW1pdCBcCitzZXR1aWRnaWQgIiR1c2VyIiBcCitzdmxvZ2QgLXR0ICIkbG9nZGlyIgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZnRwZC9wX2xvZyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z0cGQvcF9sb2cKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTI1MjFiZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z0cGQvcF9sb2cKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKworY2QgbG9nL2xvZ2RpciB8fCBleGl0IDEKK2NhdCBAKiBjdXJyZW50IHwgJFBBR0VSCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9mdHBkL3J1biBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z0cGQvcnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg3YjdkMmIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9mdHBkL3J1bgpAQCAtMCwwICsxLDE3IEBACisjIS9iaW4vc2gKKworI2V4ZWMgPi9kZXYvbnVsbAorZXhlYyAyPiYxCitleGVjIDwvZGV2L251bGwKKwordXNlcj13d3cKK3VzZXI9cm9vdAorCitleGVjIFwKK2VudiAtIFBBVEg9IiRQQVRIIiBcCitzb2Z0bGltaXQgXAordGNwc3ZkIFwKKyAgLXZFIC1sIDAgLWMgNDAgXAorICAwLjAuMC4wIDIxIFwKK3NldHVpZGdpZCAiJHVzZXIiIFwKK2Z0cGQgLXZ2IC10MTAgL3B1Yi9mdHBkX3Jvb3QKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z0cGQvd19sb2cgYi9leGFtcGxlcy92YXJfc2VydmljZS9mdHBkL3dfbG9nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFhMzZlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9mdHBkL3dfbG9nCkBAIC0wLDAgKzEsNCBAQAorIyEvYmluL3NoCisKK2NkIGxvZy9sb2dkaXIgfHwgZXhpdCAxCit3YXRjaCAtbjIgJ3c9YHR0eXNpemUgd2A7IGg9YHR0eXNpemUgaGA7IHRhaWwgLSQoKGgtMykpIGN1cnJlbnQgMj4mMSB8IGN1dCAtYjEtJCgody0yKSknCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9mdy9SRUFETUUgYi9leGFtcGxlcy92YXJfc2VydmljZS9mdy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRkY2NiMgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z3L1JFQURNRQpAQCAtMCwwICsxLDUgQEAKK1RoZSByZWFsIFJFQURNRSBmaWxlIGlzIG9uZSBkaXJlY3RvcnkgdXAuCisKK1RoaXMgZGlyZWN0b3J5J3MgcnVuIHNjcmlwdCBjYW4gaGF2ZSB1c2VmdWwgY29tbWVudHMuCitJZiBpdCBkb2Vzbid0IGJ1dCB5b3UgZmVlbCBpdCBzaG91bGQsIHBsZWFzZSBzZW5kIGEgcGF0Y2gKK3RvIGJ1c3lib3gncyBtYWlsaW5nIGxpc3QuCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9mdy9jb25mLzExLjIyLjMzLjQ0LmlwY29uZi0tIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvY29uZi8xMS4yMi4zMy40NC5pcGNvbmYtLQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjQ0ZTkwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvY29uZi8xMS4yMi4zMy40NC5pcGNvbmYtLQpAQCAtMCwwICsxLDEwIEBACisjIS9iaW4vc2gKKyMgSWYgd2UgaGF2ZSBzaW1wbGUgc3RhdGljIGFkZHJlc3MuLi4KKyMKK2xldCBjZmc9Y2ZnKzEKK2lmWyRjZmddPWlmCitpcFskY2ZnXT0xMS4yMi4zMy40NAoraXBtYXNrWyRjZmddPTExLjIyLjMzLjQ0LzI0Citnd1skY2ZnXT0xMS4yMi4zMy4xCituZXRbJGNmZ109MC8wCitkbnNbJGNmZ109JzExLjIyLjMzLjIgMTEuMjIuMzMuMycKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z3L2NvbmYvMTkyLjE2OC4wLjEuaXBjb25mIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvY29uZi8xOTIuMTY4LjAuMS5pcGNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNmNTVkYgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z3L2NvbmYvMTkyLjE2OC4wLjEuaXBjb25mCkBAIC0wLDAgKzEsMTEgQEAKKyMhL2Jpbi9zaAorIyBBIHNtYWxsIG5ldHdvcmsgd2l0aCBubyByb3V0ZXJzCisjIChtYXliZSAqd2UqIGFyZSB0aGVpciByb3V0ZXIpCisjCitsZXQgY2ZnPWNmZysxCitpZlskY2ZnXT1pZgoraXBbJGNmZ109MTkyLjE2OC4wLjEKK2lwbWFza1skY2ZnXT0xOTIuMTY4LjAuMS8yNAorIyMjIGd3WyRjZmddPQorIyMjIG5ldFskY2ZnXT0wLzAKKyMjIyBkbnNbJGNmZ109JycKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z3L2NvbmYvbG8uaXBjb25mIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvY29uZi9sby5pcGNvbmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZiZTVmMAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z3L2NvbmYvbG8uaXBjb25mCkBAIC0wLDAgKzEsMTAgQEAKKyMhL2Jpbi9iYXNoCisjIE1vc3RseSByZWR1bmRhbnQgZXhjZXB0IHdoZW4geW91IG5lZWQgZG5zW109eW91cl9zdGF0aWNfZG5zX3NydgorIworbGV0IGNmZz1jZmcrMQoraWZbJGNmZ109bG8KK2lwWyRjZmddPTEyNy4wLjAuMQoraXBtYXNrWyRjZmddPTEyNy4wLjAuMS84Citnd1skY2ZnXT0nJworbmV0WyRjZmddPScnCisjZG5zWyRjZmddPTEyNy4wLjAuMQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvZXRjL2hvc3RzIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvZXRjL2hvc3RzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZWU1MzMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9mdy9ldGMvaG9zdHMKQEAgLTAsMCArMSwyMSBAQAorIyEvYmluL3NoCitlY2hvICJcCisjIFRoaXMgZmlsZSBpcyBhdXRvbWFnaWNhbGx5IHJlZ2VuZXJhdGVkCisjIE5vdGUhIC9ldGMvbnNzd2l0Y2guY29uZiBtYXkgb3ZlcnJpZGUgdGhpcyEKKworIyBGb3IgbG9vcGJhY2tpbmcKKzEyNy4wLjAuMSBsb2NhbGhvc3QKKworIyBPdXIgbG9jYWwgSVBzIgorCitob3N0bmFtZT1gaG9zdG5hbWVgCit0ZXN0ICIkaG9zdG5hbWUiIHx8IGhvc3RuYW1lPWxvY2FsaG9zdAorZG9tYWluPWAoLiAvYm9vdC5jb25mOyBlY2hvICIkRE5TRE9NQUlOTkFNRSIpYAordGVzdCAiJGRvbWFpbiIgJiYgaG9zdG5hbWU9IiRob3N0bmFtZSAkaG9zdG5hbWUuJGRvbWFpbiIKKworaXAgLW8gYSBsIFwKK3wgZ3JlcCAtRiAnaW5ldCAnIFwKK3wgc2VkIC1lICdzL14uKmluZXQgLy8nIC1lICdzOlsgL10uKiQ6ICciJGhvc3RuYW1lIic6JworCitlY2hvCitlY2hvICIjIEVuZCBvZiAvZXRjL2hvc3RzIgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvZXRjL3Jlc29sdi5jb25mIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvZXRjL3Jlc29sdi5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NjE5ODcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9mdy9ldGMvcmVzb2x2LmNvbmYKQEAgLTAsMCArMSwzMSBAQAorIyEvYmluL2Jhc2gKKworZG9tYWluPWAoLiAvYm9vdC5jb25mOyBlY2hvICIkRE5TRE9NQUlOTkFNRSIpIDI+L2Rldi9udWxsYAorCitlY2hvICIjIFRoaXMgZmlsZSBpcyBhdXRvbWFnaWNhbGx5IHJlZ2VuZXJhdGVkIHdpdGggZWFjaCBib290IgorZWNobwordGVzdCAiJGRvbWFpbiIgJiYgZWNobyAiZG9tYWluICRkb21haW4iCit0ZXN0ICIkZG9tYWluIiAmJiBlY2hvICJzZWFyY2ggJGRvbWFpbiIKK2VjaG8KK2VjaG8gIiMgTm90ZSB0aGF0IG5zbG9va3VwIGNhbiBjaG9rZSBvbiBETlMgc2VydmVyIHdoaWNoIGl0c2VsZiIKK2VjaG8gIiMgZG9lcyBOT1QgaGF2ZSBkb21haW4gbmFtZS4gT3RoZXIgdGhpbmdzIGNhbiB3b3JrIGZpbmUuIgorZWNobworIyAjIElmIHdlIHJ1biBETlMgY2FjaGU6CisjIGVjaG8gIm5hbWVzZXJ2ZXIgMTI3LjAuMC4xIgorIyBleGl0CisKK3ByaW89MAoraT0wOyB3aGlsZSB0ZXN0ICIke2lmWyRpXX0iOyBkbworCXRlc3QgeCIke2Ruc19wcmlvWyRpXX0iICE9IHgiIiBcCisJJiYgdGVzdCAiJHtkbnNfcHJpb1skaV19IiAtZ3QgIiRwcmlvIiBcCisJJiYgcHJpbz0iJHtkbnNfcHJpb1skaV19IgorbGV0IGkrKzsgZG9uZQorCitpPTA7IHdoaWxlIHRlc3QgIiR7aWZbJGldfSI7IGRvCisJZm9yIGQgaW4gJHtkbnNbJGldfTsgZG8KKwkJcD0iJHtkbnNfcHJpb1skaV19IgorCQl0ZXN0IHgiJHAiID09IHgiIiAmJiBwPTAKKwkJdGVzdCB4IiRwIiA9PSB4IiRwcmlvIiB8fCBjb250aW51ZQorCQllY2hvICJuYW1lc2VydmVyICRkIgorCWRvbmUKK2xldCBpKys7IGRvbmUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z3L3J1biBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z3L3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOTZiNjc4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZncvcnVuCkBAIC0wLDAgKzEsMjExIEBACisjIS9iaW4vYmFzaAorIyAodXNpbmcgYmFzaGlzbTogYXJyYXlzKQorCitzZXJ2aWNlPSIke1BXRCMjKi99IgorcnVuZGlyPSIvdmFyL3J1bi9zZXJ2aWNlLyRzZXJ2aWNlIgorCit1c2VyPXJvb3QKK2V4dGlmPWlmCitleHRfb3Blbl90Y3A9IjIxIDIyIDgwIiAjIHNwYWNlLXNlcGFyYXRlZAorCisjIE1ha2Ugb3Vyc2VsZiBvbmUtc2hvdAorc3YgbyAuCisjIERlYnVnCisjZGF0ZSAnKyVZLSVtLSVkICVIOiVNOiVTJyA+PiIkMC5sb2ciCisKKyMjIyBmaWx0ZXIgVGhpcyBpcyB0aGUgZGVmYXVsdCB0YWJsZSAoaWYgbm8gLXQgb3B0aW9uIGlzIHBhc3NlZCkuICBJdCBjb250YWlucworIyMjICAgICAgICB0aGUgIGJ1aWx0LWluIGNoYWlucyBJTlBVVCAoZm9yIHBhY2tldHMgY29taW5nIGludG8gdGhlIGJveCBpdHNlbGYpLAorIyMjICAgICAgICBGT1JXQVJEIChmb3IgcGFja2V0cyBiZWluZyByb3V0ZWQgdGhyb3VnaCB0aGUgYm94KSwgYW5kIE9VVFBVVCAoZm9yCisjIyMgICAgICAgIGxvY2FsbHktZ2VuZXJhdGVkIHBhY2tldHMpLgorIyMjCisjIyMgbmF0ICAgIFRoaXMgdGFibGUgaXMgY29uc3VsdGVkIHdoZW4gYSBwYWNrZXQgdGhhdCBjcmVhdGVzIGEgbmV3IGNvbm5lY3Rpb24KKyMjIyAgICAgICAgaXMgZW5jb3VudGVyZWQuICBJdCBjb25zaXN0cyBvZiB0aHJlZSBidWlsdC1pbnM6IFBSRVJPVVRJTkcgKGZvcgorIyMjICAgICAgICBhbHRlcmluZyBwYWNrZXRzIGFzIHNvb24gYXMgdGhleSBjb21lIGluKSwgT1VUUFVUIChmb3IgYWx0ZXJpbmcKKyMjIyAgICAgICAgbG9jYWxseS1nZW5lcmF0ZWQgcGFja2V0cyBiZWZvcmUgcm91dGluZyksIGFuZCBQT1NUUk9VVElORyAoZm9yCisjIyMgICAgICAgIGFsdGVyaW5nIHBhY2tldHMgYXMgdGhleSBhcmUgYWJvdXQgdG8gZ28gb3V0KS4KKyMjIworIyMjIG1hbmdsZSBJdCBoYWQgdHdvIGJ1aWx0LWluIGNoYWluczogUFJFUk9VVElORyAoZm9yIGFsdGVyaW5nIGluY29taW5nCisjIyMgICAgICAgIHBhY2tldHMgYmVmb3JlIHJvdXRpbmcpIGFuZCBPVVRQVVQgKGZvciBhbHRlcmluZyBsb2NhbGx5LWdlbmVyYXRlZAorIyMjICAgICAgICBwYWNrZXRzIGJlZm9yZSByb3V0aW5nKS4gIFJlY2VudGx5IHRocmVlIG90aGVyIGJ1aWx0LWluCisjIyMgICAgICAgIGNoYWlucyBhcmUgYWRkZWQ6IElOUFVUIChmb3IgcGFja2V0cyBjb21pbmcgaW50byB0aGUgYm94CisjIyMgICAgICAgIGl0c2VsZiksIEZPUldBUkQgKGZvciBhbHRlcmluZyBwYWNrZXRzIGJlaW5nIHJvdXRlZCB0aHJvdWdoIHRoZQorIyMjICAgICAgICBib3gpLCBhbmQgUE9TVFJPVVRJTkcgKGZvciBhbHRlcmluZyBwYWNrZXRzIGFzIHRoZXkgYXJlIGFib3V0IHRvIGdvCisjIyMgICAgICAgIG91dCkuCisjIyMKKyMjIyAgICAgICAuLi5pZmFjZS4uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmlmYWNlLi4uCisjIyMgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeCisjIyMgICAgICAgICAgdiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisjIyMgLW1hbmdsZSxOQVQtICAgICAgICAgICAgICAgLW1hbmdsZSxmaWx0ZXItICAgLW1hbmdsZSxOQVQtLQorIyMjIHxQUkVST1VUSU5HfC0tPltSb3V0aW5nXS0tPnxGT1JXQVJEICAgICAgfC0tPnxQT1NUUk9VVElOR3wKKyMjIyAtLS0tLS0tLS0tLS0gICAgfCAgICBeICAgICAtLS0tLS0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tCisjIyMgICAgICAgICAgICAgICAgIHwgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKyMjIyAgICAgICAgICAgICAgICAgfCAgICArLS1pZiBOQVRlZC0tLS0tLS0tLS0tLSsgICAgfAorIyMjICAgICAgICAgICAgICAgICB2ICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICB8CisjIyMgICAgICAtbWFuZ2xlLGZpbHRlci0gICAgICAgICAgICAgICAgLW1hbmdsZSxOQVQsZmlsdGVyLQorIyMjICAgICAgfElOUFVUICAgICAgICB8ICArLT5bUm91dGluZ10tPnxPVVRQVVQgICAgICAgICAgIHwKKyMjIyAgICAgIC0tLS0tLS0tLS0tLS0tLSAgfCAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tCisjIyMgICAgICAgICAgICAgICAgIHwgICAgIHwKKyMjIyAgICAgICAgICAgICAgICAgdiAgICAgfAorIyMjICAgICAgICAgLi4uIExvY2FsIFByb2Nlc3MuLi4KKworZG9pdCgpIHsKKwllY2hvICIjICQqIgorCSIkQCIKK30KKworI2V4ZWMgPi9kZXYvbnVsbAorZXhlYyA+IiQwLm91dCIKK2V4ZWMgMj4mMQorZXhlYyA8L2Rldi9udWxsCisKK3VtYXNrIDA3NworCisjIE1ha2Ugc3VyZSBydW5kaXIvIGV4aXN0cworbWtkaXIgLXAgIiRydW5kaXIiIDI+L2Rldi9udWxsCitjaG93biAtUiAiJHVzZXI6IiAiJHJ1bmRpciIKK2NobW9kIC1SIGE9clggIiRydW5kaXIiCitybSAtcmYgcnVuZGlyIDI+L2Rldi9udWxsCitsbiAtcyAiJHJ1bmRpciIgcnVuZGlyCisKKyMgVGltZXN0YW1waW5nCitkYXRlICcrJVktJW0tJWQgJUg6JU06JVMnCisKKworZWNobzsgZWNobyAiKiBSZWFkaW5nIElQIGNvbmZpZyIKK2NmZz0tMQorIyAgICAgICAgICAgICBzdGF0aWMgY2ZnICAgIGRoY3AsemVyb2NvbmYgZXRjCitmb3IgaXBjb25mIGluIGNvbmYvKi5pcGNvbmYgIiRydW5kaXIiLyouaXBjb25mOyBkbworCWlmIHRlc3QgLWYgIiRpcGNvbmYiOyB0aGVuCisJCWVjaG8gIisgJGlwY29uZiIKKwkJLiAiJGlwY29uZiIKKwlmaQorZG9uZQorCitlY2hvOyBlY2hvICIqIENvbmZpZ3VyaW5nIGhhcmR3YXJlIgorI2RvaXQgZXRodG9vbCAtcyBpZiBhdXRvbmVnIG9mZiBzcGVlZCAxMDAgZHVwbGV4IGZ1bGwKKyNkb2l0IGV0aHRvb2wgLUsgaWYgcnggb2ZmIHR4IG9mZiBzZyBvZmYgdHNvIG9mZgorCitlY2hvOyBlY2hvICIqIFJlc2V0dGluZyBhZGRyZXNzIGFuZCByb3V0aW5nIGluZm8iCitkb2l0IGlwIGEgZiBkZXYgbG8KK2k9MDsgd2hpbGUgdGVzdCAiJHtpZlskaV19IjsgZG8KKwlkb2l0IGlwIGEgZiBkZXYgIiR7aWZbJGldfSIKKwlkb2l0IGlwIHIgZiBkZXYgIiR7aWZbJGldfSIgcm9vdCAwLzAKK2xldCBpKys7IGRvbmUKKworZWNobzsgZWNobyAiKiBDb25maWd1cmluZyBhZGRyZXNzZXMiCitkb2l0IGlwIGEgYSBkZXYgbG8gMTI3LjAuMC4xLzggc2NvcGUgaG9zdAorZG9pdCBpcCBhIGEgZGV2IGxvIDo6MS8xMjggc2NvcGUgaG9zdAoraT0wOyB3aGlsZSB0ZXN0ICIke2lmWyRpXX0iOyBkbworCWlmIHRlc3QgIiR7aXBtYXNrWyRpXX0iOyB0aGVuCisJCWRvaXQgaXAgYSBhIGRldiAiJHtpZlskaV19IiAiJHtpcG1hc2tbJGldfSIgYnJkICsKKwkJZG9pdCBpcCBsIHNldCBkZXYgIiR7aWZbJGldfSIgdXAKKwlmaQorbGV0IGkrKzsgZG9uZQorCitlY2hvOyBlY2hvICIqIENvbmZpZ3VyaW5nIHJvdXRlcyIKK2k9MDsgd2hpbGUgdGVzdCAiJHtpZlskaV19IjsgZG8KKwlpZiB0ZXN0ICIke25ldFskaV19IiAmJiB0ZXN0ICIke2d3WyRpXX0iOyB0aGVuCisJCWRvaXQgaXAgciBhICIke25ldFskaV19IiB2aWEgIiR7Z3dbJGldfSIKKwlmaQorbGV0IGkrKzsgZG9uZQorCitlY2hvOyBlY2hvICIqIFJlY3JlYXRpbmcgL2V0Yy8qIGZpbGVzIHJlZmxlY3RpbmcgbmV3IG5ldHdvcmsgY29uZmlndXJhdGlvbjoiCitmb3IgaSBpbiBldGMvKjsgZG8KKwluPWBiYXNlbmFtZSAiJGkiYAorCWVjaG8gIisgJG4iCisJKC4gIiRpIikgPiIvZXRjLyRuIgorCWNobW9kIDY0NCAiL2V0Yy8kbiIKK2RvbmUKKworCisjIFVzYWdlOiBuZXdfY2hhaW4gPGNoYWluPiBbPHRhYmxlPl0KK25ld19jaGFpbigpIHsKKwlsb2NhbCB0PSIiCisJdGVzdCB4IiQyIiAhPSB4IiIgJiYgdD0iLXQgJDIiCisJZG9pdCBpcHRhYmxlcyAkdCAtTiAkMQorCWlwdD0iaXB0YWJsZXMgJHQgLUEgJDEiCit9CisKK2VjaG87IGVjaG8gIiogUmVzZXQgaXB0YWJsZXMiCitkb2l0IGlwdGFibGVzICAgICAgICAgICAtLWZsdXNoCitkb2l0IGlwdGFibGVzICAgICAgICAgICAtLWRlbGV0ZS1jaGFpbgorZG9pdCBpcHRhYmxlcyAgICAgICAgICAgLS16ZXJvCitkb2l0IGlwdGFibGVzIC10IG5hdCAgICAtLWZsdXNoCitkb2l0IGlwdGFibGVzIC10IG5hdCAgICAtLWRlbGV0ZS1jaGFpbgorZG9pdCBpcHRhYmxlcyAtdCBuYXQgICAgLS16ZXJvCitkb2l0IGlwdGFibGVzIC10IG1hbmdsZSAtLWZsdXNoCitkb2l0IGlwdGFibGVzIC10IG1hbmdsZSAtLWRlbGV0ZS1jaGFpbgorZG9pdCBpcHRhYmxlcyAtdCBtYW5nbGUgLS16ZXJvCisKK2VjaG87IGVjaG8gIiogQ29uZmlndXJlIGlwdGFibGVzIgorZG9pdCBtb2Rwcm9iZSBuZl9uYXRfZnRwCitkb2l0IG1vZHByb2JlIG5mX25hdF90ZnRwCitkb2l0IG1vZHByb2JlIG5mX2Nvbm50cmFja19mdHAKK2RvaXQgbW9kcHJvYmUgbmZfY29ubnRyYWNrX3RmdHAKKworIyAgICAgICAqKiogbmF0ICoqKgorIyAgICAgICBJTkNPTUlORyBUUkFGRklDCitpcHQ9ImlwdGFibGVzIC10IG5hdCAtQSBQUkVST1VUSU5HIgorIyBub3RoaW5nIGhlcmUKKworIyAgICAgICBMT0NBTExZIE9SSUdJTkFURUQgVFJBRkZJQworaXB0PSJpcHRhYmxlcyAtdCBuYXQgLUEgT1VUUFVUIgorIyBub3RoaW5nIGhlcmUKKworIyAgICAgICBPVVRHT0lORyBUUkFGRklDCitpcHQ9ImlwdGFibGVzIC10IG5hdCAtQSBQT1NUUk9VVElORyIKKyMgTWFzcXVlcmFkZSBib3hlcyBvbiBteSBwcml2YXRlIG5ldAorZG9pdCAkaXB0IC1zIDE5Mi4xNjguMC4wLzI0IC1vICRleHRpZiAtaiBNQVNRVUVSQURFCisKKyMgICAgICAgKioqIG1hbmdsZSAqKioKKyMjIyBERUJVRworIyMjIGlwdD0iaXB0YWJsZXMgLXQgbWFuZ2xlIC1BIFBSRVJPVVRJTkciCisjIyMgZG9pdCAkaXB0IC1zIDE5Mi4xNjguMC4wLzI0IC1qIFJFVFVSTgorIyMjIGlwdD0iaXB0YWJsZXMgLXQgbWFuZ2xlIC1BIEZPUldBUkQiCisjIyMgZG9pdCAkaXB0IC1zIDE5Mi4xNjguMC4wLzI0IC1qIFJFVFVSTgorIyMjIGlwdD0iaXB0YWJsZXMgLXQgbWFuZ2xlIC1BIFBPU1RST1VUSU5HIgorIyMjIGRvaXQgJGlwdCAtcyAxOTIuMTY4LjAuMC8yNCAtaiBSRVRVUk4KKyMgbm90aGluZyBoZXJlCisKKyMgICAgICAgKioqIGZpbHRlciAqKioKKyMKK25ld19jaGFpbiBpZXh0IGZpbHRlcgorI2RvaXQgJGlwdCAtcyAyMDMuMTc3LjEwNC43MiAtaiBEUk9QCSMgU29tZSBpZGlvdCBwcm9iZXMgbXkgc3NoCisjZG9pdCAkaXB0IC1kIDIwMy4xNzcuMTA0LjcyIC1qIERST1AJIyBTb21lIGlkaW90IHByb2JlcyBteSBzc2gKK2RvaXQgJGlwdCAtbSBzdGF0ZSAtLXN0YXRlIEVTVEFCTElTSEVELFJFTEFURUQgLWogUkVUVVJOICAjIEZUUCBkYXRhIGV0YyBpcyBvaworaWYgdGVzdCAiJGV4dF9vcGVuX3RjcCI7IHRoZW4KKwlwb3J0bGlzdD0iJHtleHRfb3Blbl90Y3AvLyAvLH0iCisJZG9pdCAkaXB0IC1wIHRjcCAtbSBtdWx0aXBvcnQgLS1kcG9ydHMgJHBvcnRsaXN0IC1qIFJFVFVSTgorZmkKK2RvaXQgJGlwdCAtcCB0Y3AgLWogUkVKRUNUCSMgQW55dGhpbmcgZWxzZSBpc24ndCBvay4gUkVKRUNUID0gaXJjIG9wZW5zIGZhc3RlcgorCQkJCSMgKGl0IHByb2JlcyBwcm94eSBwb3J0cywgRFJPUCB3aWxsIGluY3VyIHRpbWVvdXQgZGVsYXlzKQoraXB0PSJpcHRhYmxlcyAtdCBmaWx0ZXIgLUEgSU5QVVQiCitkb2l0ICRpcHQgLWkgJGV4dGlmIC1qIGlleHQKKworCitlY2hvOyBlY2hvICIqIEVuYWJsaW5nIGZvcndhcmRpbmciCitlY2hvIDEgPi9wcm9jL3N5cy9uZXQvaXB2NC9pcF9mb3J3YXJkCitlY2hvICIvcHJvYy9zeXMvbmV0L2lwdjQvaXBfZm9yd2FyZDogYGNhdCAvcHJvYy9zeXMvbmV0L2lwdjQvaXBfZm9yd2FyZGAiCisKKworIyBTaWduYWwgZXZlcnlib2R5IHRoYXQgZmlyZXdhbGwgaXMgdXAKK2RhdGUgJyslWS0lbS0lZCAlSDolTTolUycgPiIkcnVuZGlyL3VwIgorCisjIE9rLCBzcGV3IG91dCBnb2JzIG9mIGluZm8gYW5kIGRpc2FibGUgb3Vyc2VsZgorZWNobzsgZWNobyAiKiBJUDoiCitpcCBhIGwKK2VjaG87IGVjaG8gIiogUm91dGluZzoiCitpcCByIGwKK2VjaG87IGVjaG8gIiogRmlyZXdhbGw6IgoreworZWNobyAnLS0tRklMVEVSLS0nOworaXB0YWJsZXMgLXYgLUwgLXggLW47CitlY2hvICctLS1OQVQtLS0tLSc7CitpcHRhYmxlcyAtdCBuYXQgLXYgLUwgLXggLW47CitlY2hvICctLS1NQU5HTEUtLSc7CitpcHRhYmxlcyAtdCBtYW5nbGUgLXYgLUwgLXggLW47Cit9IFwKK3wgZ3JlcCAtdiAnXiQnIHwgZ3JlcCAtRnYgJ2J5dGVzIHRhcmdldCcKK2VjaG8KKworZWNobyAiKiBFbmQgb2YgZmlyZXdhbGwgY29uZmlndXJhdGlvbiIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2Z3L3N0YXQgYi9leGFtcGxlcy92YXJfc2VydmljZS9mdy9zdGF0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA4NzM2YWQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9mdy9zdGF0CkBAIC0wLDAgKzEsMTIgQEAKKyMhL2Jpbi9zaAorCitlY2hvOyBlY2hvICIqIEZpcmV3YWxsOiIKK3sKK2VjaG8gJy0tLUZJTFRFUi0tJzsKK2lwdGFibGVzIC12IC1MIC14IC1uOworZWNobyAnLS0tTkFULS0tLS0nOworaXB0YWJsZXMgLXQgbmF0IC12IC1MIC14IC1uOworZWNobyAnLS0tTUFOR0xFLS0nOworaXB0YWJsZXMgLXQgbWFuZ2xlIC12IC1MIC14IC1uOworfSBcCit8IGdyZXAgLXYgJ14kJyB8IGdyZXAgLUZ2ICdieXRlcyB0YXJnZXQnIHwgJFBBR0VSCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL1JFQURNRSBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dldHR5X3R0eTEvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZGNjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL1JFQURNRQpAQCAtMCwwICsxLDUgQEAKK1RoZSByZWFsIFJFQURNRSBmaWxlIGlzIG9uZSBkaXJlY3RvcnkgdXAuCisKK1RoaXMgZGlyZWN0b3J5J3MgcnVuIHNjcmlwdCBjYW4gaGF2ZSB1c2VmdWwgY29tbWVudHMuCitJZiBpdCBkb2Vzbid0IGJ1dCB5b3UgZmVlbCBpdCBzaG91bGQsIHBsZWFzZSBzZW5kIGEgcGF0Y2gKK3RvIGJ1c3lib3gncyBtYWlsaW5nIGxpc3QuCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL2FsdDA4eDE2K3VuaW1hcC5mbnQgYi9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL2FsdDA4eDE2K3VuaW1hcC5mbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJjYzQ1NwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dldHR5X3R0eTEvYWx0MDh4MTYrdW5pbWFwLmZudApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL2NmZyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dldHR5X3R0eTEvY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBmNjNlNTIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL2NmZwpAQCAtMCwwICsxLDI2IEBACisjIS9iaW4vc2gKKworaWYgdGVzdCB4IiRURVJNIiA9IHgiIiAtbyB4IiRURVJNIiA9IHgidW5rbm93biI7IHRoZW4KKwlURVJNPSJsaW51eCIKKwllY2hvICIqIFNldHRpbmcgVEVSTT0nJFRFUk0nIgorZmkKK2V4cG9ydCBURVJNCisKK3R0eW5hbWU9YHR0eWAKK3R0eWJhc2U9IiR7dHR5bmFtZSUlWzAxMjM0NTY3ODldKn0iICAgICAjIHN0cmlwIG51bWVyaWMgdGFpbAorCitpZiB0ZXN0IHgiJHR0eWJhc2UiID0geCIvZGV2L3ZjLyIgLW8geCIkdHR5YmFzZSIgPSB4Ii9kZXYvdHR5IjsgdGhlbgorCWVjaG8gIiogQWN0aXZhdGluZyBDeXJpbGxpYyBLT0k4LVIgLT4gQ1A4NjYgZm9udCBtYXAiCisJZWNobyAtbmUgIlwwMzMoSyIgPiIkdHR5bmFtZSIKKworCWVjaG8gIiogTG9hZGluZyBzY3JlZW4gZm9udCIKKwlzZXRmb250IFwKKwkJLUMgIiR0dHluYW1lIiBcCisJCS1tICIkUFdEL2tvaThyX3RvX3VuaS50cmFucyIgXAorCQkiJFBXRC9hbHQwOHgxNit1bmltYXAuZm50IiBcCisJfHwgZWNobyAiISBzZXRmb250IGZhaWx1cmUiCisKKwllY2hvICIqIExvYWRpbmcga2V5bWFwIgorCWxvYWRrZXlzICIkUFdEL3J1X2tvaThyLmtleW1hcCIgXAorCXx8IGVjaG8gIiEgbG9hZGtleXMgZmFpbHVyZSIKK2ZpCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL2tvaThyX3RvX3VuaS50cmFucyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dldHR5X3R0eTEva29pOHJfdG9fdW5pLnRyYW5zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNmJkMDEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL2tvaThyX3RvX3VuaS50cmFucwpAQCAtMCwwICsxLDI1NiBAQAorMHgwMCBVKzAwMDAgICMgIE5VTEwgKE5VTCkKKzB4MDEgVSswMDAxICAjICBTVEFSVCBPRiBIRUFESU5HIChTT0gpCisweDAyIFUrMDAwMiAgIyAgU1RBUlQgT0YgVEVYVCAoU1RYKQorMHgwMyBVKzAwMDMgICMgIEVORCBPRiBURVhUIChFVFgpCisweDA0IFUrMDAwNCAgIyAgRU5EIE9GIFRSQU5TTUlTU0lPTiAoRU9UKQorMHgwNSBVKzAwMDUgICMgIEVOUVVJUlkgKEVOUSkKKzB4MDYgVSswMDA2ICAjICBBQ0tOT1dMRURHRSAoQUNLKQorMHgwNyBVKzAwMDcgICMgIEJFTEwgKEJFTCkKKzB4MDggVSswMDA4ICAjICBCQUNLU1BBQ0UgKEJTKQorMHgwOSBVKzAwMDkgICMgIENIQVJBQ1RFUiBUQUJVTEFUSU9OIChIVCkKKzB4MGEgVSswMDBBICAjICBMSU5FIEZFRUQgKExGKQorMHgwYiBVKzAwMEIgICMgIExJTkUgVEFCVUxBVElPTiAoVlQpCisweDBjIFUrMDAwQyAgIyAgRk9STSBGRUVEIChGRikKKzB4MGQgVSswMDBEICAjICBDQVJSSUFHRSBSRVRVUk4gKENSKQorMHgwZSBVKzAwMEUgICMgIFNISUZUIE9VVCAoU08pCisweDBmIFUrMDAwRiAgIyAgU0hJRlQgSU4gKFNJKQorMHgxMCBVKzAwMTAgICMgIERBVEFMSU5LIEVTQ0FQRSAoRExFKQorMHgxMSBVKzAwMTEgICMgIERFVklDRSBDT05UUk9MIE9ORSAoREMxKQorMHgxMiBVKzAwMTIgICMgIERFVklDRSBDT05UUk9MIFRXTyAoREMyKQorMHgxMyBVKzAwMTMgICMgIERFVklDRSBDT05UUk9MIFRIUkVFIChEQzMpCisweDE0IFUrMDAxNCAgIyAgREVWSUNFIENPTlRST0wgRk9VUiAoREM0KQorMHgxNSBVKzAwMTUgICMgIE5FR0FUSVZFIEFDS05PV0xFREdFIChOQUspCisweDE2IFUrMDAxNiAgIyAgU1lOQ0hST05PVVMgSURMRSAoU1lOKQorMHgxNyBVKzAwMTcgICMgIEVORCBPRiBUUkFOU01JU1NJT04gQkxPQ0sgKEVUQikKKzB4MTggVSswMDE4ICAjICBDQU5DRUwgKENBTikKKzB4MTkgVSswMDE5ICAjICBFTkQgT0YgTUVESVVNIChFTSkKKzB4MWEgVSswMDFBICAjICBTVUJTVElUVVRFIChTVUIpCisweDFiIFUrMDAxQiAgIyAgRVNDQVBFIChFU0MpCisweDFjIFUrMDAxQyAgIyAgRklMRSBTRVBBUkFUT1IgKElTNCkKKzB4MWQgVSswMDFEICAjICBHUk9VUCBTRVBBUkFUT1IgKElTMykKKzB4MWUgVSswMDFFICAjICBSRUNPUkQgU0VQQVJBVE9SIChJUzIpCisweDFmIFUrMDAxRiAgIyAgVU5JVCBTRVBBUkFUT1IgKElTMSkKKzB4MjAgVSswMDIwICAjICBTUEFDRQorMHgyMSBVKzAwMjEgICMgIEVYQ0xBTUFUSU9OIE1BUksKKzB4MjIgVSswMDIyICAjICBRVU9UQVRJT04gTUFSSworMHgyMyBVKzAwMjMgICMgIE5VTUJFUiBTSUdOCisweDI0IFUrMDAyNCAgIyAgRE9MTEFSIFNJR04KKzB4MjUgVSswMDI1ICAjICBQRVJDRU5UIFNJR04KKzB4MjYgVSswMDI2ICAjICBBTVBFUlNBTkQKKzB4MjcgVSswMDI3ICAjICBBUE9TVFJPUEhFCisweDI4IFUrMDAyOCAgIyAgTEVGVCBQQVJFTlRIRVNJUworMHgyOSBVKzAwMjkgICMgIFJJR0hUIFBBUkVOVEhFU0lTCisweDJhIFUrMDAyQSAgIyAgQVNURVJJU0sKKzB4MmIgVSswMDJCICAjICBQTFVTIFNJR04KKzB4MmMgVSswMDJDICAjICBDT01NQQorMHgyZCBVKzAwMkQgICMgIEhZUEhFTi1NSU5VUworMHgyZSBVKzAwMkUgICMgIEZVTEwgU1RPUAorMHgyZiBVKzAwMkYgICMgIFNPTElEVVMKKzB4MzAgVSswMDMwICAjICBESUdJVCBaRVJPCisweDMxIFUrMDAzMSAgIyAgRElHSVQgT05FCisweDMyIFUrMDAzMiAgIyAgRElHSVQgVFdPCisweDMzIFUrMDAzMyAgIyAgRElHSVQgVEhSRUUKKzB4MzQgVSswMDM0ICAjICBESUdJVCBGT1VSCisweDM1IFUrMDAzNSAgIyAgRElHSVQgRklWRQorMHgzNiBVKzAwMzYgICMgIERJR0lUIFNJWAorMHgzNyBVKzAwMzcgICMgIERJR0lUIFNFVkVOCisweDM4IFUrMDAzOCAgIyAgRElHSVQgRUlHSFQKKzB4MzkgVSswMDM5ICAjICBESUdJVCBOSU5FCisweDNhIFUrMDAzQSAgIyAgQ09MT04KKzB4M2IgVSswMDNCICAjICBTRU1JQ09MT04KKzB4M2MgVSswMDNDICAjICBMRVNTLVRIQU4gU0lHTgorMHgzZCBVKzAwM0QgICMgIEVRVUFMUyBTSUdOCisweDNlIFUrMDAzRSAgIyAgR1JFQVRFUi1USEFOIFNJR04KKzB4M2YgVSswMDNGICAjICBRVUVTVElPTiBNQVJLCisweDQwIFUrMDA0MCAgIyAgQ09NTUVSQ0lBTCBBVAorMHg0MSBVKzAwNDEgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEEKKzB4NDIgVSswMDQyICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBCCisweDQzIFUrMDA0MyAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgQworMHg0NCBVKzAwNDQgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEQKKzB4NDUgVSswMDQ1ICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBFCisweDQ2IFUrMDA0NiAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgRgorMHg0NyBVKzAwNDcgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEcKKzB4NDggVSswMDQ4ICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBICisweDQ5IFUrMDA0OSAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgSQorMHg0YSBVKzAwNEEgICMgIExBVElOIENBUElUQUwgTEVUVEVSIEoKKzB4NGIgVSswMDRCICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBLCisweDRjIFUrMDA0QyAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTAorMHg0ZCBVKzAwNEQgICMgIExBVElOIENBUElUQUwgTEVUVEVSIE0KKzB4NGUgVSswMDRFICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBOCisweDRmIFUrMDA0RiAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgTworMHg1MCBVKzAwNTAgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFAKKzB4NTEgVSswMDUxICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBRCisweDUyIFUrMDA1MiAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgUgorMHg1MyBVKzAwNTMgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFMKKzB4NTQgVSswMDU0ICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBUCisweDU1IFUrMDA1NSAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgVQorMHg1NiBVKzAwNTYgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFYKKzB4NTcgVSswMDU3ICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBXCisweDU4IFUrMDA1OCAgIyAgTEFUSU4gQ0FQSVRBTCBMRVRURVIgWAorMHg1OSBVKzAwNTkgICMgIExBVElOIENBUElUQUwgTEVUVEVSIFkKKzB4NWEgVSswMDVBICAjICBMQVRJTiBDQVBJVEFMIExFVFRFUiBaCisweDViIFUrMDA1QiAgIyAgTEVGVCBTUVVBUkUgQlJBQ0tFVAorMHg1YyBVKzAwNUMgICMgIFJFVkVSU0UgU09MSURVUworMHg1ZCBVKzAwNUQgICMgIFJJR0hUIFNRVUFSRSBCUkFDS0VUCisweDVlIFUrMDA1RSAgIyAgQ0lSQ1VNRkxFWCBBQ0NFTlQKKzB4NWYgVSswMDVGICAjICBMT1cgTElORQorMHg2MCBVKzAwNjAgICMgIEdSQVZFIEFDQ0VOVAorMHg2MSBVKzAwNjEgICMgIExBVElOIFNNQUxMIExFVFRFUiBBCisweDYyIFUrMDA2MiAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEIKKzB4NjMgVSswMDYzICAjICBMQVRJTiBTTUFMTCBMRVRURVIgQworMHg2NCBVKzAwNjQgICMgIExBVElOIFNNQUxMIExFVFRFUiBECisweDY1IFUrMDA2NSAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEUKKzB4NjYgVSswMDY2ICAjICBMQVRJTiBTTUFMTCBMRVRURVIgRgorMHg2NyBVKzAwNjcgICMgIExBVElOIFNNQUxMIExFVFRFUiBHCisweDY4IFUrMDA2OCAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEgKKzB4NjkgVSswMDY5ICAjICBMQVRJTiBTTUFMTCBMRVRURVIgSQorMHg2YSBVKzAwNkEgICMgIExBVElOIFNNQUxMIExFVFRFUiBKCisweDZiIFUrMDA2QiAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIEsKKzB4NmMgVSswMDZDICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTAorMHg2ZCBVKzAwNkQgICMgIExBVElOIFNNQUxMIExFVFRFUiBNCisweDZlIFUrMDA2RSAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIE4KKzB4NmYgVSswMDZGICAjICBMQVRJTiBTTUFMTCBMRVRURVIgTworMHg3MCBVKzAwNzAgICMgIExBVElOIFNNQUxMIExFVFRFUiBQCisweDcxIFUrMDA3MSAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFEKKzB4NzIgVSswMDcyICAjICBMQVRJTiBTTUFMTCBMRVRURVIgUgorMHg3MyBVKzAwNzMgICMgIExBVElOIFNNQUxMIExFVFRFUiBTCisweDc0IFUrMDA3NCAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFQKKzB4NzUgVSswMDc1ICAjICBMQVRJTiBTTUFMTCBMRVRURVIgVQorMHg3NiBVKzAwNzYgICMgIExBVElOIFNNQUxMIExFVFRFUiBWCisweDc3IFUrMDA3NyAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFcKKzB4NzggVSswMDc4ICAjICBMQVRJTiBTTUFMTCBMRVRURVIgWAorMHg3OSBVKzAwNzkgICMgIExBVElOIFNNQUxMIExFVFRFUiBZCisweDdhIFUrMDA3QSAgIyAgTEFUSU4gU01BTEwgTEVUVEVSIFoKKzB4N2IgVSswMDdCICAjICBMRUZUIENVUkxZIEJSQUNLRVQKKzB4N2MgVSswMDdDICAjICBWRVJUSUNBTCBMSU5FCisweDdkIFUrMDA3RCAgIyAgUklHSFQgQ1VSTFkgQlJBQ0tFVAorMHg3ZSBVKzAwN0UgICMgIFRJTERFCisweDdmIFUrMDA3RiAgIyAgREVMRVRFIChERUwpCisweDgwIFUrMjUwMCAgIyAgQk9YIERSQVdJTkdTIExJR0hUIEhPUklaT05UQUwKKzB4ODEgVSsyNTAyICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwKKzB4ODIgVSsyNTBDICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgUklHSFQKKzB4ODMgVSsyNTEwICAjICBCT1ggRFJBV0lOR1MgTElHSFQgRE9XTiBBTkQgTEVGVAorMHg4NCBVKzI1MTQgICMgIEJPWCBEUkFXSU5HUyBMSUdIVCBVUCBBTkQgUklHSFQKKzB4ODUgVSsyNTE4ICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIExFRlQKKzB4ODYgVSsyNTFDICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIFJJR0hUCisweDg3IFUrMjUyNCAgIyAgQk9YIERSQVdJTkdTIExJR0hUIFZFUlRJQ0FMIEFORCBMRUZUCisweDg4IFUrMjUyQyAgIyAgQk9YIERSQVdJTkdTIExJR0hUIERPV04gQU5EIEhPUklaT05UQUwKKzB4ODkgVSsyNTM0ICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVVAgQU5EIEhPUklaT05UQUwKKzB4OGEgVSsyNTNDICAjICBCT1ggRFJBV0lOR1MgTElHSFQgVkVSVElDQUwgQU5EIEhPUklaT05UQUwKKzB4OGIgVSsyNTgwICAjICBVUFBFUiBIQUxGIEJMT0NLCisweDhjIFUrMjU4NCAgIyAgTE9XRVIgSEFMRiBCTE9DSworMHg4ZCBVKzI1ODggICMgIEZVTEwgQkxPQ0sKKzB4OGUgVSsyNThDICAjICBMRUZUIEhBTEYgQkxPQ0sKKzB4OGYgVSsyNTkwICAjICBSSUdIVCBIQUxGIEJMT0NLCisweDkwIFUrMjU5MSAgIyAgTElHSFQgU0hBREUKKzB4OTEgVSsyNTkyICAjICBNRURJVU0gU0hBREUKKzB4OTIgVSsyNTkzICAjICBEQVJLIFNIQURFCisweDkzIFUrMjMyMCAgIyAgVE9QIEhBTEYgSU5URUdSQUwKKzB4OTQgVSsyNUEwICAjICBCTEFDSyBTUVVBUkUKKzB4OTUgVSsyMjE5ICAjICBCVUxMRVQgT1BFUkFUT1IKKzB4OTYgVSsyMjFBICAjICBTUVVBUkUgUk9PVAorMHg5NyBVKzIyNDggICMgIEFMTU9TVCBFUVVBTCBUTworMHg5OCBVKzIyNjQgICMgIExFU1MtVEhBTiBPUiBFUVVBTCBUTworMHg5OSBVKzIyNjUgICMgIEdSRUFURVItVEhBTiBPUiBFUVVBTCBUTworMHg5YSBVKzAwQTAgICMgIE5PLUJSRUFLIFNQQUNFCisweDliIFUrMjMyMSAgIyAgQk9UVE9NIEhBTEYgSU5URUdSQUwKKzB4OWMgVSswMEIwICAjICBERUdSRUUgU0lHTgorMHg5ZCBVKzAwQjIgICMgIFNVUEVSU0NSSVBUIFRXTworMHg5ZSBVKzAwQjcgICMgIE1JRERMRSBET1QKKzB4OWYgVSswMEY3ICAjICBESVZJU0lPTiBTSUdOCisweGEwIFUrMjU1MCAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBIT1JJWk9OVEFMCisweGExIFUrMjU1MSAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTAorMHhhMiBVKzI1NTIgICMgIEJPWCBEUkFXSU5HUyBET1dOIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisweGEzIFUrMDQ1MSAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIElPCisweGE0IFUrMjU1MyAgIyAgQk9YIERSQVdJTkdTIERPV04gRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKzB4YTUgVSsyNTU0ICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIFJJR0hUCisweGE2IFUrMjU1NSAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBMRUZUIERPVUJMRQorMHhhNyBVKzI1NTYgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKzB4YTggVSsyNTU3ICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIExFRlQKKzB4YTkgVSsyNTU4ICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBSSUdIVCBET1VCTEUKKzB4YWEgVSsyNTU5ICAjICBCT1ggRFJBV0lOR1MgVVAgRE9VQkxFIEFORCBSSUdIVCBTSU5HTEUKKzB4YWIgVSsyNTVBICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBSSUdIVAorMHhhYyBVKzI1NUIgICMgIEJPWCBEUkFXSU5HUyBVUCBTSU5HTEUgQU5EIExFRlQgRE9VQkxFCisweGFkIFUrMjU1QyAgIyAgQk9YIERSQVdJTkdTIFVQIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKzB4YWUgVSsyNTVEICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFVQIEFORCBMRUZUCisweGFmIFUrMjU1RSAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIFNJTkdMRSBBTkQgUklHSFQgRE9VQkxFCisweGIwIFUrMjU1RiAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgUklHSFQgU0lOR0xFCisweGIxIFUrMjU2MCAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBWRVJUSUNBTCBBTkQgUklHSFQKKzB4YjIgVSsyNTYxICAjICBCT1ggRFJBV0lOR1MgVkVSVElDQUwgU0lOR0xFIEFORCBMRUZUIERPVUJMRQorMHhiMyBVKzA0MDEgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIElPCisweGI0IFUrMjU2MiAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgTEVGVCBTSU5HTEUKKzB4YjUgVSsyNTYzICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBMRUZUCisweGI2IFUrMjU2NCAgIyAgQk9YIERSQVdJTkdTIERPV04gU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorMHhiNyBVKzI1NjUgICMgIEJPWCBEUkFXSU5HUyBET1dOIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKzB4YjggVSsyNTY2ICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIERPV04gQU5EIEhPUklaT05UQUwKKzB4YjkgVSsyNTY3ICAjICBCT1ggRFJBV0lOR1MgVVAgU0lOR0xFIEFORCBIT1JJWk9OVEFMIERPVUJMRQorMHhiYSBVKzI1NjggICMgIEJPWCBEUkFXSU5HUyBVUCBET1VCTEUgQU5EIEhPUklaT05UQUwgU0lOR0xFCisweGJiIFUrMjU2OSAgIyAgQk9YIERSQVdJTkdTIERPVUJMRSBVUCBBTkQgSE9SSVpPTlRBTAorMHhiYyBVKzI1NkEgICMgIEJPWCBEUkFXSU5HUyBWRVJUSUNBTCBTSU5HTEUgQU5EIEhPUklaT05UQUwgRE9VQkxFCisweGJkIFUrMjU2QiAgIyAgQk9YIERSQVdJTkdTIFZFUlRJQ0FMIERPVUJMRSBBTkQgSE9SSVpPTlRBTCBTSU5HTEUKKzB4YmUgVSsyNTZDICAjICBCT1ggRFJBV0lOR1MgRE9VQkxFIFZFUlRJQ0FMIEFORCBIT1JJWk9OVEFMCisweGJmIFUrMDBBOSAgIyAgQ09QWVJJR0hUIFNJR04KKzB4YzAgVSswNDRFICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWVUKKzB4YzEgVSswNDMwICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgQQorMHhjMiBVKzA0MzEgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBCRQorMHhjMyBVKzA0NDYgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBUU0UKKzB4YzQgVSswNDM0ICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgREUKKzB4YzUgVSswNDM1ICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgSUUKKzB4YzYgVSswNDQ0ICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgRUYKKzB4YzcgVSswNDMzICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgR0hFCisweGM4IFUrMDQ0NSAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEhBCisweGM5IFUrMDQzOCAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEkKKzB4Y2EgVSswNDM5ICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgU0hPUlQgSQorMHhjYiBVKzA0M0EgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBLQQorMHhjYyBVKzA0M0IgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFTAorMHhjZCBVKzA0M0MgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFTQorMHhjZSBVKzA0M0QgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFTgorMHhjZiBVKzA0M0UgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBPCisweGQwIFUrMDQzRiAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFBFCisweGQxIFUrMDQ0RiAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFlBCisweGQyIFUrMDQ0MCAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVSCisweGQzIFUrMDQ0MSAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIEVTCisweGQ0IFUrMDQ0MiAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFRFCisweGQ1IFUrMDQ0MyAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFUKKzB4ZDYgVSswNDM2ICAjICBDWVJJTExJQyBTTUFMTCBMRVRURVIgWkhFCisweGQ3IFUrMDQzMiAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFZFCisweGQ4IFUrMDQ0QyAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNPRlQgU0lHTgorMHhkOSBVKzA0NEIgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBZRVJVCisweGRhIFUrMDQzNyAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFpFCisweGRiIFUrMDQ0OCAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQQorMHhkYyBVKzA0NEQgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBFCisweGRkIFUrMDQ0OSAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIFNIQ0hBCisweGRlIFUrMDQ0NyAgIyAgQ1lSSUxMSUMgU01BTEwgTEVUVEVSIENIRQorMHhkZiBVKzA0NEEgICMgIENZUklMTElDIFNNQUxMIExFVFRFUiBIQVJEIFNJR04KKzB4ZTAgVSswNDJFICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBZVQorMHhlMSBVKzA0MTAgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEEKKzB4ZTIgVSswNDExICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBCRQorMHhlMyBVKzA0MjYgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFRTRQorMHhlNCBVKzA0MTQgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIERFCisweGU1IFUrMDQxNSAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSUUKKzB4ZTYgVSswNDI0ICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFRgorMHhlNyBVKzA0MTMgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEdIRQorMHhlOCBVKzA0MjUgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEhBCisweGU5IFUrMDQxOCAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSQorMHhlYSBVKzA0MTkgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIT1JUIEkKKzB4ZWIgVSswNDFBICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBLQQorMHhlYyBVKzA0MUIgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIEVMCisweGVkIFUrMDQxQyAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRU0KKzB4ZWUgVSswNDFEICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFTgorMHhlZiBVKzA0MUUgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIE8KKzB4ZjAgVSswNDFGICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBQRQorMHhmMSBVKzA0MkYgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFlBCisweGYyIFUrMDQyMCAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRVIKKzB4ZjMgVSswNDIxICAjICBDWVJJTExJQyBDQVBJVEFMIExFVFRFUiBFUworMHhmNCBVKzA0MjIgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFRFCisweGY1IFUrMDQyMyAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgVQorMHhmNiBVKzA0MTYgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFpIRQorMHhmNyBVKzA0MTIgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFZFCisweGY4IFUrMDQyQyAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU09GVCBTSUdOCisweGY5IFUrMDQyQiAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgWUVSVQorMHhmYSBVKzA0MTcgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFpFCisweGZiIFUrMDQyOCAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgU0hBCisweGZjIFUrMDQyRCAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgRQorMHhmZCBVKzA0MjkgICMgIENZUklMTElDIENBUElUQUwgTEVUVEVSIFNIQ0hBCisweGZlIFUrMDQyNyAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgQ0hFCisweGZmIFUrMDQyQSAgIyAgQ1lSSUxMSUMgQ0FQSVRBTCBMRVRURVIgSEFSRCBTSUdOCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL2xvZ2luLnNoIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZ2V0dHlfdHR5MS9sb2dpbi5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNjliNmZkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZ2V0dHlfdHR5MS9sb2dpbi5zaApAQCAtMCwwICsxLDEyIEBACisjIS9iaW4vc2gKKwordHR5bmFtZT1gdHR5YAordHR5YmFzZT0iJHt0dHluYW1lJSVbMDEyMzQ1Njc4OV0qfSIgICAgICMgc3RyaXAgbnVtZXJpYyB0YWlsCisKK2lmIHRlc3QgIiR0dHliYXNlIiA9ICIvZGV2L3R0eSI7IHRoZW4KKwl0YWlsPSIke3R0eW5hbWU6OH0iCisJZWNobyAiKiBTZXR0aW5nIHRlcm1pbmFsIGRldmljZSdzIG93bmVyIHRvICRMT0dJTl9VSUQ6JExPR0lOX0dJRCIKKwljaG93biAiJExPR0lOX1VJRDokTE9HSU5fR0lEIiAiL2Rldi92Y3MkdGFpbCIgIi9kZXYvdmNzYSR0YWlsIgorZmkKKyMgV2UgY2FuIGRvIHRoaXMgYWxzbywgYnV0IGxvZ2luIGRvZXMgaXQgaXRzZWxmCisjIGNob3duICIkTE9HSU5fVUlEOiRMT0dJTl9HSUQiICIkdHR5bmFtZSIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dldHR5X3R0eTEvcnVfa29pOHIua2V5bWFwIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZ2V0dHlfdHR5MS9ydV9rb2k4ci5rZXltYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4MTE1MwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dldHR5X3R0eTEvcnVfa29pOHIua2V5bWFwCkBAIC0wLDAgKzEsMTgzIEBACitrZXltYXBzIDAsMSwgMiwzLCA0LDYsIDgsMTAsIDEyLDE0CisjCisjIFRoaXMgb25lIGlzIGZvciBnZW5lcmF0aW5nIGtvaThyIFJ1c3NpYW4gY2hhcnMKKyMgQ3lyL0xhdCBzd2l0Y2hlczogIFJpZ2h0QWx0LCBTaGlmdCtDdHJsLCBDdHJsK1NoaWZ0CisjIChsYXN0IG9uZSBkb2VzIG5vdCB3b3JrIGZvciBkYXJrIGFuZCBvYnNjdXJlIHJlYXNvbnMgOCggKQorIworIyBwbGFpbixzaGlmdCwgcGxhaW4sc2hpZnQsIGN0cmwsY3RybCBhbHQsYWx0IGN0cmxhbHQsY3RybGFsdAorIyBsYXQtLS0tLS0tLSAgY3lyLS0tLS0tLS0gIGxhdCAgY3lyICBsYXQgY3lyIGxhdCAgICAgY3lyCisjCisjU2hpZnQgICAgICAgICAgICAgICAgICAgICAxCisjQWx0R3IgKGN5cikgICAgICAgICAgICAgICAyCisjQ29udHJvbCAgICAgICAgICAgICAgICAgICA0CisjQWx0ICAgICAgICAgICAgICAgICAgICAgICA4CisjU2hpZnRMICAgICAgICAgICAgICAgICAgIDE2CisjU2hpZnRSICAgICAgICAgICAgICAgICAgIDMyCisjQ3RybEwgICAgICAgICAgICAgICAgICAgIDY0CisjQ3RybFIgICAgICAgICAgICAgICAgICAgMTI4CisjPT09PT09PT09PT09PT0gcGxhaW4gPT09PT09PT09IHNoaWZ0PT09PT09PT09PSBwbGFpbiBjeXIgPT09PT0gc2hpZnQgY3lyID09PT09IGN0cmwgPT09PT09PT09PT09PT09PT09IGN0cmwgY3lyID09PT09PT09PT09PT09IGFsdCA9PT09PT09PT09PT09PT09PT09IGFsdCBjeXIgPT09PT09PT09PT09PT09IGN0cmxhbHQgPT09PT09PT09PT09PT09IGN0cmxhbHQgY3lyID09PT09PT09PT09CitrZXljb2RlICAgMSA9ICAgRXNjYXBlICAgICAgICAgIEVzY2FwZSAgICAgICAgICBFc2NhcGUgICAgICAgICAgRXNjYXBlICAgICAgICAgIEVzY2FwZSAgICAgICAgICAgICAgICAgIEVzY2FwZSAgICAgICAgICAgICAgICAgIE1ldGFfRXNjYXBlICAgICAgICAgICAgIE1ldGFfRXNjYXBlICAgICAgICAgICAgIFNBSyAgICAgICAgICAgICAgICAgICAgIFNBSwora2V5Y29kZSAgIDIgPSAgIG9uZSAgICAgICAgICAgICBleGNsYW0gICAgICAgICAgb25lICAgICAgICAgICAgIGV4Y2xhbSAgICAgICAgICBleGNsYW0gICAgICAgICAgICAgICAgICBleGNsYW0gICAgICAgICAgICAgICAgICBNZXRhX29uZSAgICAgICAgICAgICAgICBNZXRhX29uZQora2V5Y29kZSAgIDMgPSAgIHR3byAgICAgICAgICAgICBhdCAgICAgICAgICAgICAgdHdvICAgICAgICAgICAgIGF0ICAgICAgICAgICAgICBudWwgICAgICAgICAgICAgICAgICAgICBudWwgICAgICAgICAgICAgICAgICAgICBNZXRhX3R3byAgICAgICAgICAgICAgICBNZXRhX3R3bwora2V5Y29kZSAgIDQgPSAgIHRocmVlICAgICAgICAgICBudW1iZXJzaWduICAgICAgdGhyZWUgICAgICAgICAgIG51bWJlcnNpZ24gICAgICB0aHJlZSAgICAgICAgICAgICAgICAgICB0aHJlZSAgICAgICAgICAgICAgICAgICBNZXRhX3RocmVlICAgICAgICAgICAgICBNZXRhX3RocmVlCitrZXljb2RlICAgNSA9ICAgZm91ciAgICAgICAgICAgIGRvbGxhciAgICAgICAgICBmb3VyICAgICAgICAgICAgZG9sbGFyICAgICAgICAgIENvbnRyb2xfYmFja3NsYXNoICAgICAgIENvbnRyb2xfYmFja3NsYXNoICAgICAgIE1ldGFfZm91ciAgICAgICAgICAgICAgIE1ldGFfZm91cgora2V5Y29kZSAgIDYgPSAgIGZpdmUgICAgICAgICAgICBwZXJjZW50ICAgICAgICAgZml2ZSAgICAgICAgICAgIHBlcmNlbnQgICAgICAgICBDb250cm9sX2JyYWNrZXRyaWdodCAgICBDb250cm9sX2JyYWNrZXRyaWdodCAgICBNZXRhX2ZpdmUgICAgICAgICAgICAgICBNZXRhX2ZpdmUKK2tleWNvZGUgICA3ID0gICBzaXggICAgICAgICAgICAgYXNjaWljaXJjdW0gICAgIHNpeCAgICAgICAgICAgICBhc2NpaWNpcmN1bSAgICAgQ29udHJvbF9hc2NpaWNpcmN1bSAgICAgQ29udHJvbF9hc2NpaWNpcmN1bSAgICAgTWV0YV9zaXggICAgICAgICAgICAgICAgTWV0YV9zaXgKK2tleWNvZGUgICA4ID0gICBzZXZlbiAgICAgICAgICAgYW1wZXJzYW5kICAgICAgIHNldmVuICAgICAgICAgICBhbXBlcnNhbmQgICAgICAgQ29udHJvbF91bmRlcnNjb3JlICAgICAgQ29udHJvbF91bmRlcnNjb3JlICAgICAgTWV0YV9zZXZlbiAgICAgICAgICAgICAgTWV0YV9zZXZlbgora2V5Y29kZSAgIDkgPSAgIGVpZ2h0ICAgICAgICAgICBhc3RlcmlzayAgICAgICAgZWlnaHQgICAgICAgICAgIGFzdGVyaXNrICAgICAgICBlaWdodCAgICAgICAgICAgICAgICAgICBlaWdodCAgICAgICAgICAgICAgICAgICBNZXRhX2VpZ2h0ICAgICAgICAgICAgICBNZXRhX2VpZ2h0CitrZXljb2RlICAxMCA9ICAgbmluZSAgICAgICAgICAgIHBhcmVubGVmdCAgICAgICBuaW5lICAgICAgICAgICAgcGFyZW5sZWZ0ICAgICAgIG5pbmUgICAgICAgICAgICAgICAgICAgIG5pbmUgICAgICAgICAgICAgICAgICAgIE1ldGFfbmluZSAgICAgICAgICAgICAgIE1ldGFfbmluZQora2V5Y29kZSAgMTEgPSAgIHplcm8gICAgICAgICAgICBwYXJlbnJpZ2h0ICAgICAgemVybyAgICAgICAgICAgIHBhcmVucmlnaHQgICAgICB6ZXJvICAgICAgICAgICAgICAgICAgICB6ZXJvICAgICAgICAgICAgICAgICAgICBNZXRhX3plcm8gICAgICAgICAgICAgICBNZXRhX3plcm8KK2tleWNvZGUgIDEyID0gICBtaW51cyAgICAgICAgICAgdW5kZXJzY29yZSAgICAgIG1pbnVzICAgICAgICAgICB1bmRlcnNjb3JlICAgICAgQ29udHJvbF91bmRlcnNjb3JlICAgICAgQ29udHJvbF91bmRlcnNjb3JlICAgICAgTWV0YV9taW51cyAgICAgICAgICAgICAgTWV0YV9taW51cwora2V5Y29kZSAgMTMgPSAgIGVxdWFsICAgICAgICAgICBwbHVzICAgICAgICAgICAgZXF1YWwgICAgICAgICAgIHBsdXMgICAgICAgICAgICBlcXVhbCAgICAgICAgICAgICAgICAgICBlcXVhbCAgICAgICAgICAgICAgICAgICBNZXRhX2VxdWFsICAgICAgICAgICAgICBNZXRhX2VxdWFsCitrZXljb2RlICAxNCA9ICAgRGVsZXRlICAgICAgICAgIERlbGV0ZSAgICAgICAgICBEZWxldGUgICAgICAgICAgRGVsZXRlICAgICAgICAgIEJhY2tTcGFjZSAgICAgICAgICAgICAgIEJhY2tTcGFjZSAgICAgICAgICAgICAgIE1ldGFfRGVsZXRlICAgICAgICAgICAgIE1ldGFfRGVsZXRlCitrZXljb2RlICAxNSA9ICAgVGFiICAgICAgICAgICAgIFRhYiAgICAgICAgICAgICBUYWIgICAgICAgICAgICAgVGFiICAgICAgICAgICAgIFRhYiAgICAgICAgICAgICAgICAgICAgIFRhYiAgICAgICAgICAgICAgICAgICAgIE1ldGFfVGFiICAgICAgICAgICAgICAgIE1ldGFfVGFiCitrZXljb2RlICAxNiA9ICAgcSAgICAgICAgICAgICAgIFEgICAgICAgICAgICAgICAyMDIgICAgICAgICAgICAgMjM0ICAgICAgICAgICAgIENvbnRyb2xfcSAgICAgICAgICAgICAgIENvbnRyb2xfcSAgICAgICAgICAgICAgIE1ldGFfcSAgICAgICAgICAgICAgICAgIE1ldGFfcSAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF9xICAgICAgICAgIE1ldGFfQ29udHJvbF9xCitrZXljb2RlICAxNyA9ICAgdyAgICAgICAgICAgICAgIFcgICAgICAgICAgICAgICAxOTUgICAgICAgICAgICAgMjI3ICAgICAgICAgICAgIENvbnRyb2xfdyAgICAgICAgICAgICAgIENvbnRyb2xfdyAgICAgICAgICAgICAgIE1ldGFfdyAgICAgICAgICAgICAgICAgIE1ldGFfdyAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF93ICAgICAgICAgIE1ldGFfQ29udHJvbF93CitrZXljb2RlICAxOCA9ICAgZSAgICAgICAgICAgICAgIEUgICAgICAgICAgICAgICAyMTMgICAgICAgICAgICAgMjQ1ICAgICAgICAgICAgIENvbnRyb2xfZSAgICAgICAgICAgICAgIENvbnRyb2xfZSAgICAgICAgICAgICAgIE1ldGFfZSAgICAgICAgICAgICAgICAgIE1ldGFfZSAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF9lICAgICAgICAgIE1ldGFfQ29udHJvbF9lCitrZXljb2RlICAxOSA9ICAgciAgICAgICAgICAgICAgIFIgICAgICAgICAgICAgICAyMDMgICAgICAgICAgICAgMjM1ICAgICAgICAgICAgIENvbnRyb2xfciAgICAgICAgICAgICAgIENvbnRyb2xfciAgICAgICAgICAgICAgIE1ldGFfciAgICAgICAgICAgICAgICAgIE1ldGFfciAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF9yICAgICAgICAgIE1ldGFfQ29udHJvbF9yCitrZXljb2RlICAyMCA9ICAgdCAgICAgICAgICAgICAgIFQgICAgICAgICAgICAgICAxOTcgICAgICAgICAgICAgMjI5ICAgICAgICAgICAgIENvbnRyb2xfdCAgICAgICAgICAgICAgIENvbnRyb2xfdCAgICAgICAgICAgICAgIE1ldGFfdCAgICAgICAgICAgICAgICAgIE1ldGFfdCAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF90ICAgICAgICAgIE1ldGFfQ29udHJvbF90CisjPT09PT09PT09PT09PT0gcGxhaW4gPT09PT09PT09IHNoaWZ0PT09PT09PT09PSBwbGFpbiBjeXIgPT09PT0gc2hpZnQgY3lyID09PT09IGN0cmwgPT09PT09PT09PT09PT09PT09IGN0cmwgY3lyID09PT09PT09PT09PT09IGFsdCA9PT09PT09PT09PT09PT09PT09IGFsdCBjeXIgPT09PT09PT09PT09PT09IGN0cmxhbHQgPT09PT09PT09PT09PT09IGN0cmxhbHQgY3lyID09PT09PT09PT09CitrZXljb2RlICAyMSA9ICAgeSAgICAgICAgICAgICAgIFkgICAgICAgICAgICAgICAyMDYgICAgICAgICAgICAgMjM4ICAgICAgICAgICAgIENvbnRyb2xfeSAgICAgICAgICAgICAgIENvbnRyb2xfeSAgICAgICAgICAgICAgIE1ldGFfeSAgICAgICAgICAgICAgICAgIE1ldGFfeSAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF95ICAgICAgICAgIE1ldGFfQ29udHJvbF95CitrZXljb2RlICAyMiA9ICAgdSAgICAgICAgICAgICAgIFUgICAgICAgICAgICAgICAxOTkgICAgICAgICAgICAgMjMxICAgICAgICAgICAgIENvbnRyb2xfdSAgICAgICAgICAgICAgIENvbnRyb2xfdSAgICAgICAgICAgICAgIE1ldGFfdSAgICAgICAgICAgICAgICAgIE1ldGFfdSAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF91ICAgICAgICAgIE1ldGFfQ29udHJvbF91CitrZXljb2RlICAyMyA9ICAgaSAgICAgICAgICAgICAgIEkgICAgICAgICAgICAgICAyMTkgICAgICAgICAgICAgMjUxICAgICAgICAgICAgIENvbnRyb2xfaSAgICAgICAgICAgICAgIENvbnRyb2xfaSAgICAgICAgICAgICAgIE1ldGFfaSAgICAgICAgICAgICAgICAgIE1ldGFfaSAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF9pICAgICAgICAgIE1ldGFfQ29udHJvbF9pCitrZXljb2RlICAyNCA9ICAgbyAgICAgICAgICAgICAgIE8gICAgICAgICAgICAgICAyMjEgICAgICAgICAgICAgMjUzICAgICAgICAgICAgIENvbnRyb2xfbyAgICAgICAgICAgICAgIENvbnRyb2xfbyAgICAgICAgICAgICAgIE1ldGFfbyAgICAgICAgICAgICAgICAgIE1ldGFfbyAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF9vICAgICAgICAgIE1ldGFfQ29udHJvbF9vCitrZXljb2RlICAyNSA9ICAgcCAgICAgICAgICAgICAgIFAgICAgICAgICAgICAgICAyMTggICAgICAgICAgICAgMjUwICAgICAgICAgICAgIENvbnRyb2xfcCAgICAgICAgICAgICAgIENvbnRyb2xfcCAgICAgICAgICAgICAgIE1ldGFfcCAgICAgICAgICAgICAgICAgIE1ldGFfcCAgICAgICAgICAgICAgICAgIE1ldGFfQ29udHJvbF9wICAgICAgICAgIE1ldGFfQ29udHJvbF9wCitrZXljb2RlICAyNiA9ICAgYnJhY2tldGxlZnQgICAgIGJyYWNlbGVmdCAgICAgICAyMDAgICAgICAgICAgICAgMjMyICAgICAgICAgICAgIEVzY2FwZSAgICAgICAgICAgICAgICAgIEVzY2FwZSAgICAgICAgICAgICAgICAgIE1ldGFfYnJhY2tldGxlZnQgICAgICAgIE1ldGFfYnJhY2tldGxlZnQKK2tleWNvZGUgIDI3ID0gICBicmFja2V0cmlnaHQgICAgYnJhY2VyaWdodCAgICAgIDIyMyAgICAgICAgICAgICAyNTUgICAgICAgICAgICAgQ29udHJvbF9icmFja2V0cmlnaHQgICAgQ29udHJvbF9icmFja2V0cmlnaHQKK2tleWNvZGUgIDI4ID0gICBSZXR1cm4KKyMgU2hpZnQrQ3RybCAtIEN5cmlsbGljCitrZXljb2RlICAyOSA9ICAgQ29udHJvbAkJQWx0R3JfTG9jayAgICAgIENvbnRyb2wgICAgICAgICBBbHRHcl9Mb2NrICAgICAgQ29udHJvbAkJICAgICAgICBDb250cm9sCQkgICAgICAgIENvbnRyb2wJCSAgICAgICAgQ29udHJvbAkJICAgICAgICBDb250cm9sCQkgICAgICAgIENvbnRyb2wKK2tleWNvZGUgIDMwID0gICBhICAgICAgICAgICAgICAgQSAgICAgICAgICAgICAgIDE5OCAgICAgICAgICAgICAyMzAgICAgICAgICAgICAgQ29udHJvbF9hICAgICAgICAgICAgICAgQ29udHJvbF9hICAgICAgICAgICAgICAgTWV0YV9hICAgICAgICAgICAgICAgICAgTWV0YV9hICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX2EgICAgICAgICAgTWV0YV9Db250cm9sX2EKK2tleWNvZGUgIDMxID0gICBzICAgICAgICAgICAgICAgUyAgICAgICAgICAgICAgIDIxNyAgICAgICAgICAgICAyNDkgICAgICAgICAgICAgQ29udHJvbF9zICAgICAgICAgICAgICAgQ29udHJvbF9zICAgICAgICAgICAgICAgTWV0YV9zICAgICAgICAgICAgICAgICAgTWV0YV9zICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX3MgICAgICAgICAgTWV0YV9Db250cm9sX3MKK2tleWNvZGUgIDMyID0gICBkICAgICAgICAgICAgICAgRCAgICAgICAgICAgICAgIDIxNSAgICAgICAgICAgICAyNDcgICAgICAgICAgICAgQ29udHJvbF9kICAgICAgICAgICAgICAgQ29udHJvbF9kICAgICAgICAgICAgICAgTWV0YV9kICAgICAgICAgICAgICAgICAgTWV0YV9kICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX2QgICAgICAgICAgTWV0YV9Db250cm9sX2QKK2tleWNvZGUgIDMzID0gICBmICAgICAgICAgICAgICAgRiAgICAgICAgICAgICAgIDE5MyAgICAgICAgICAgICAyMjUgICAgICAgICAgICAgQ29udHJvbF9mICAgICAgICAgICAgICAgQ29udHJvbF9mICAgICAgICAgICAgICAgTWV0YV9mICAgICAgICAgICAgICAgICAgTWV0YV9mICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX2YgICAgICAgICAgTWV0YV9Db250cm9sX2YKK2tleWNvZGUgIDM0ID0gICBnICAgICAgICAgICAgICAgRyAgICAgICAgICAgICAgIDIwOCAgICAgICAgICAgICAyNDAgICAgICAgICAgICAgQ29udHJvbF9nICAgICAgICAgICAgICAgQ29udHJvbF9nICAgICAgICAgICAgICAgTWV0YV9nICAgICAgICAgICAgICAgICAgTWV0YV9nICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX2cgICAgICAgICAgTWV0YV9Db250cm9sX2cKK2tleWNvZGUgIDM1ID0gICBoICAgICAgICAgICAgICAgSCAgICAgICAgICAgICAgIDIxMCAgICAgICAgICAgICAyNDIgICAgICAgICAgICAgQ29udHJvbF9oICAgICAgICAgICAgICAgQ29udHJvbF9oICAgICAgICAgICAgICAgTWV0YV9oICAgICAgICAgICAgICAgICAgTWV0YV9oICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX2ggICAgICAgICAgTWV0YV9Db250cm9sX2gKK2tleWNvZGUgIDM2ID0gICBqICAgICAgICAgICAgICAgSiAgICAgICAgICAgICAgIDIwNyAgICAgICAgICAgICAyMzkgICAgICAgICAgICAgQ29udHJvbF9qICAgICAgICAgICAgICAgQ29udHJvbF9qICAgICAgICAgICAgICAgTWV0YV9qICAgICAgICAgICAgICAgICAgTWV0YV9qICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX2ogICAgICAgICAgTWV0YV9Db250cm9sX2oKK2tleWNvZGUgIDM3ID0gICBrICAgICAgICAgICAgICAgSyAgICAgICAgICAgICAgIDIwNCAgICAgICAgICAgICAyMzYgICAgICAgICAgICAgQ29udHJvbF9rICAgICAgICAgICAgICAgQ29udHJvbF9rICAgICAgICAgICAgICAgTWV0YV9rICAgICAgICAgICAgICAgICAgTWV0YV9rICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX2sgICAgICAgICAgTWV0YV9Db250cm9sX2sKK2tleWNvZGUgIDM4ID0gICBsICAgICAgICAgICAgICAgTCAgICAgICAgICAgICAgIDE5NiAgICAgICAgICAgICAyMjggICAgICAgICAgICAgQ29udHJvbF9sICAgICAgICAgICAgICAgQ29udHJvbF9sICAgICAgICAgICAgICAgTWV0YV9sICAgICAgICAgICAgICAgICAgTWV0YV9sICAgICAgICAgICAgICAgICAgTWV0YV9Db250cm9sX2wgICAgICAgICAgTWV0YV9Db250cm9sX2wKK2tleWNvZGUgIDM5ID0gICBzZW1pY29sb24gICAgICAgY29sb24gICAgICAgICAgIDIxNCAgICAgICAgICAgICAyNDYgICAgICAgICAgICAgc2VtaWNvbG9uICAgICAgICAgICAgICAgc2VtaWNvbG9uICAgICAgICAgICAgICAgTWV0YV9zZW1pY29sb24gICAgICAgICAgTWV0YV9zZW1pY29sb24KK2tleWNvZGUgIDQwID0gICBhcG9zdHJvcGhlICAgICAgcXVvdGVkYmwgICAgICAgIDIyMCAgICAgICAgICAgICAyNTIgICAgICAgICAgICAgQ29udHJvbF9nICAgICAgICAgICAgICAgQ29udHJvbF9nICAgICAgICAgICAgICAgTWV0YV9hcG9zdHJvcGhlICAgICAgICAgTWV0YV9hcG9zdHJvcGhlCisjPT09PT09PT09PT09PT0gcGxhaW4gPT09PT09PT09IHNoaWZ0PT09PT09PT09PSBwbGFpbiBjeXIgPT09PT0gc2hpZnQgY3lyID09PT09IGN0cmwgPT09PT09PT09PT09PT09PT09IGN0cmwgY3lyID09PT09PT09PT09PT09IGFsdCA9PT09PT09PT09PT09PT09PT09IGFsdCBjeXIgPT09PT09PT09PT09PT09IGN0cmxhbHQgPT09PT09PT09PT09PT09IGN0cmxhbHQgY3lyID09PT09PT09PT09CitrZXljb2RlICA0MSA9ICAgZ3JhdmUgICAgICAgICAgIGFzY2lpdGlsZGUgICAgICBncmF2ZSAgICAgICAgICAgYXNjaWl0aWxkZSAgICAgIG51bCAgICAgICAgICAgICAgICAgICAgIG51bCAgICAgICAgICAgICAgICAgICAgIE1ldGFfZ3JhdmUgICAgICAgICAgICAgIE1ldGFfZ3JhdmUKK2tleWNvZGUgIDQyID0gICBTaGlmdAora2V5Y29kZSAgNDMgPSAgIGJhY2tzbGFzaCAgICAgICBiYXIgICAgICAgICAgICAgYmFja3NsYXNoICAgICAgIGJhciAgICAgICAgICAgICBDb250cm9sX2JhY2tzbGFzaCAgICAgICBDb250cm9sX2JhY2tzbGFzaCAgICAgICBNZXRhX2JhY2tzbGFzaCAgICAgICAgICBNZXRhX2JhY2tzbGFzaAora2V5Y29kZSAgNDQgPSAgIHogICAgICAgICAgICAgICBaICAgICAgICAgICAgICAgMjA5ICAgICAgICAgICAgIDI0MSAgICAgICAgICAgICBDb250cm9sX3ogICAgICAgICAgICAgICBDb250cm9sX3ogICAgICAgICAgICAgICBNZXRhX3ogICAgICAgICAgICAgICAgICBNZXRhX3ogICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfeiAgICAgICAgICBNZXRhX0NvbnRyb2xfegora2V5Y29kZSAgNDUgPSAgIHggICAgICAgICAgICAgICBYICAgICAgICAgICAgICAgMjIyICAgICAgICAgICAgIDI1NCAgICAgICAgICAgICBDb250cm9sX3ggICAgICAgICAgICAgICBDb250cm9sX3ggICAgICAgICAgICAgICBNZXRhX3ggICAgICAgICAgICAgICAgICBNZXRhX3ggICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfeCAgICAgICAgICBNZXRhX0NvbnRyb2xfeAora2V5Y29kZSAgNDYgPSAgIGMgICAgICAgICAgICAgICBDICAgICAgICAgICAgICAgMjExICAgICAgICAgICAgIDI0MyAgICAgICAgICAgICBDb250cm9sX2MgICAgICAgICAgICAgICBDb250cm9sX2MgICAgICAgICAgICAgICBNZXRhX2MgICAgICAgICAgICAgICAgICBNZXRhX2MgICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfYyAgICAgICAgICBNZXRhX0NvbnRyb2xfYwora2V5Y29kZSAgNDcgPSAgIHYgICAgICAgICAgICAgICBWICAgICAgICAgICAgICAgMjA1ICAgICAgICAgICAgIDIzNyAgICAgICAgICAgICBDb250cm9sX3YgICAgICAgICAgICAgICBDb250cm9sX3YgICAgICAgICAgICAgICBNZXRhX3YgICAgICAgICAgICAgICAgICBNZXRhX3YgICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfdiAgICAgICAgICBNZXRhX0NvbnRyb2xfdgora2V5Y29kZSAgNDggPSAgIGIgICAgICAgICAgICAgICBCICAgICAgICAgICAgICAgMjAxICAgICAgICAgICAgIDIzMyAgICAgICAgICAgICBDb250cm9sX2IgICAgICAgICAgICAgICBDb250cm9sX2IgICAgICAgICAgICAgICBNZXRhX2IgICAgICAgICAgICAgICAgICBNZXRhX2IgICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfYiAgICAgICAgICBNZXRhX0NvbnRyb2xfYgora2V5Y29kZSAgNDkgPSAgIG4gICAgICAgICAgICAgICBOICAgICAgICAgICAgICAgMjEyICAgICAgICAgICAgIDI0NCAgICAgICAgICAgICBDb250cm9sX24gICAgICAgICAgICAgICBDb250cm9sX24gICAgICAgICAgICAgICBNZXRhX24gICAgICAgICAgICAgICAgICBNZXRhX24gICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfbiAgICAgICAgICBNZXRhX0NvbnRyb2xfbgora2V5Y29kZSAgNTAgPSAgIG0gICAgICAgICAgICAgICBNICAgICAgICAgICAgICAgMjE2ICAgICAgICAgICAgIDI0OCAgICAgICAgICAgICBDb250cm9sX20gICAgICAgICAgICAgICBDb250cm9sX20gICAgICAgICAgICAgICBNZXRhX20gICAgICAgICAgICAgICAgICBNZXRhX20gICAgICAgICAgICAgICAgICBNZXRhX0NvbnRyb2xfbSAgICAgICAgICBNZXRhX0NvbnRyb2xfbQora2V5Y29kZSAgNTEgPSAgIGNvbW1hICAgICAgICAgICBsZXNzICAgICAgICAgICAgMTk0ICAgICAgICAgICAgIDIyNiAgICAgICAgICAgICBjb21tYSAgICAgICAgICAgICAgICAgICBjb21tYSAgICAgICAgICAgICAgICAgICBNZXRhX2NvbW1hICAgICAgICAgICAgICBNZXRhX2NvbW1hCitrZXljb2RlICA1MiA9ICAgcGVyaW9kICAgICAgICAgIGdyZWF0ZXIgICAgICAgICAxOTIgICAgICAgICAgICAgMjI0ICAgICAgICAgICAgIENvbXBvc2UgICAgICAgICAgICAgICAgIENvbXBvc2UgICAgICAgICAgICAgICAgIE1ldGFfcGVyaW9kICAgICAgICAgICAgIE1ldGFfcGVyaW9kCitrZXljb2RlICA1MyA9ICAgc2xhc2ggICAgICAgICAgIHF1ZXN0aW9uICAgICAgICBzbGFzaCAgICAgICAgICAgcXVlc3Rpb24gICAgICAgIERlbGV0ZSAgICAgICAgICAgICAgICAgIERlbGV0ZSAgICAgICAgICAgICAgICAgIE1ldGFfc2xhc2ggICAgICAgICAgICAgIE1ldGFfc2xhc2ggICAgICAgICAgICAgIE1ldGFfcXVlc3Rpb24gICAgICAgICAgIE1ldGFfcXVlc3Rpb24KKyMgQ3RybCtTaGlmdCAtIEN5cmlsbGljIChub3Qgd29ya2luZz8/PykKK2tleWNvZGUgIDU0ID0gICBTaGlmdCAgICAgICAgICAgU2hpZnQgICAgICAgICAgIFNoaWZ0ICAgICAgICAgICBTaGlmdCAgICAgICAgICAgQWx0R3JfTG9jayAgICAgICAgICAgICAgQWx0R3JfTG9jayAgICAgICAgICAgICAgU2hpZnQgICAgICAgICAgICAgICAgICAgU2hpZnQgICAgICAgICAgICAgICAgICAgU2hpZnQgICAgICAgICAgICAgICAgICAgU2hpZnQKK2tleWNvZGUgIDU1ID0gICBLUF9NdWx0aXBseQora2V5Y29kZSAgNTYgPSAgIEFsdAora2V5Y29kZSAgNTcgPSAgIHNwYWNlICAgICAgICAgICBzcGFjZSAgICAgICAgICAgc3BhY2UgICAgICAgICAgIHNwYWNlICAgICAgICAgICBudWwgICAgICAgICAgICAgICAgICAgICBudWwgICAgICAgICAgICAgICAgICAgICBNZXRhX3NwYWNlICAgICAgICAgICAgICBNZXRhX3NwYWNlCitrZXljb2RlICA1OCA9ICAgQ2Fwc19Mb2NrCitrZXljb2RlICA1OSA9ICAgRjEgICAgICAgICAgICAgIEYxMSAgICAgICAgICAgICBGMSAgICAgICAgICAgICAgRjExICAgICAgICAgICAgIEYxICAgICAgICAgICAgICAgICAgICAgIEYxICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGVfMSAgICAgICAgICAgICAgIENvbnNvbGVfMSAgICAgICAgICAgICAgIENvbnNvbGVfMSAgICAgICAgICAgICAgIENvbnNvbGVfMQora2V5Y29kZSAgNjAgPSAgIEYyICAgICAgICAgICAgICBGMTIgICAgICAgICAgICAgRjIgICAgICAgICAgICAgIEYxMiAgICAgICAgICAgICBGMiAgICAgICAgICAgICAgICAgICAgICBGMiAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlXzIgICAgICAgICAgICAgICBDb25zb2xlXzIgICAgICAgICAgICAgICBDb25zb2xlXzIgICAgICAgICAgICAgICBDb25zb2xlXzIKKyM9PT09PT09PT09PT09PSBwbGFpbiA9PT09PT09PT0gc2hpZnQ9PT09PT09PT09IHBsYWluIGN5ciA9PT09PSBzaGlmdCBjeXIgPT09PT0gY3RybCA9PT09PT09PT09PT09PT09PT0gY3RybCBjeXIgPT09PT09PT09PT09PT0gYWx0ID09PT09PT09PT09PT09PT09PT0gYWx0IGN5ciA9PT09PT09PT09PT09PT0gY3RybGFsdCA9PT09PT09PT09PT09PT0gY3RybGFsdCBjeXIgPT09PT09PT09PT0KK2tleWNvZGUgIDYxID0gICBGMyAgICAgICAgICAgICAgRjEzICAgICAgICAgICAgIEYzICAgICAgICAgICAgICBGMTMgICAgICAgICAgICAgRjMgICAgICAgICAgICAgICAgICAgICAgRjMgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZV8zICAgICAgICAgICAgICAgQ29uc29sZV8zICAgICAgICAgICAgICAgQ29uc29sZV8zICAgICAgICAgICAgICAgQ29uc29sZV8zCitrZXljb2RlICA2MiA9ICAgRjQgICAgICAgICAgICAgIEYxNCAgICAgICAgICAgICBGNCAgICAgICAgICAgICAgRjE0ICAgICAgICAgICAgIEY0ICAgICAgICAgICAgICAgICAgICAgIEY0ICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGVfNCAgICAgICAgICAgICAgIENvbnNvbGVfNCAgICAgICAgICAgICAgIENvbnNvbGVfNCAgICAgICAgICAgICAgIENvbnNvbGVfNAora2V5Y29kZSAgNjMgPSAgIEY1ICAgICAgICAgICAgICBGMTUgICAgICAgICAgICAgRjUgICAgICAgICAgICAgIEYxNSAgICAgICAgICAgICBGNSAgICAgICAgICAgICAgICAgICAgICBGNSAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlXzUgICAgICAgICAgICAgICBDb25zb2xlXzUgICAgICAgICAgICAgICBDb25zb2xlXzUgICAgICAgICAgICAgICBDb25zb2xlXzUKK2tleWNvZGUgIDY0ID0gICBGNiAgICAgICAgICAgICAgRjE2ICAgICAgICAgICAgIEY2ICAgICAgICAgICAgICBGMTYgICAgICAgICAgICAgRjYgICAgICAgICAgICAgICAgICAgICAgRjYgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZV82ICAgICAgICAgICAgICAgQ29uc29sZV82ICAgICAgICAgICAgICAgQ29uc29sZV82ICAgICAgICAgICAgICAgQ29uc29sZV82CitrZXljb2RlICA2NSA9ICAgRjcgICAgICAgICAgICAgIEYxNyAgICAgICAgICAgICBGNyAgICAgICAgICAgICAgRjE3ICAgICAgICAgICAgIEY3ICAgICAgICAgICAgICAgICAgICAgIEY3ICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGVfNyAgICAgICAgICAgICAgIENvbnNvbGVfNyAgICAgICAgICAgICAgIENvbnNvbGVfNyAgICAgICAgICAgICAgIENvbnNvbGVfNwora2V5Y29kZSAgNjYgPSAgIEY4ICAgICAgICAgICAgICBGMTggICAgICAgICAgICAgRjggICAgICAgICAgICAgIEYxOCAgICAgICAgICAgICBGOCAgICAgICAgICAgICAgICAgICAgICBGOCAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlXzggICAgICAgICAgICAgICBDb25zb2xlXzggICAgICAgICAgICAgICBDb25zb2xlXzggICAgICAgICAgICAgICBDb25zb2xlXzgKK2tleWNvZGUgIDY3ID0gICBGOSAgICAgICAgICAgICAgRjE5ICAgICAgICAgICAgIEY5ICAgICAgICAgICAgICBGMTkgICAgICAgICAgICAgRjkgICAgICAgICAgICAgICAgICAgICAgRjkgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZV85ICAgICAgICAgICAgICAgQ29uc29sZV85ICAgICAgICAgICAgICAgQ29uc29sZV85ICAgICAgICAgICAgICAgQ29uc29sZV85CitrZXljb2RlICA2OCA9ICAgRjEwICAgICAgICAgICAgIEYyMCAgICAgICAgICAgICBGMTAgICAgICAgICAgICAgRjIwICAgICAgICAgICAgIEYxMCAgICAgICAgICAgICAgICAgICAgIEYxMCAgICAgICAgICAgICAgICAgICAgIENvbnNvbGVfMTAgICAgICAgICAgICAgIENvbnNvbGVfMTAgICAgICAgICAgICAgIENvbnNvbGVfMTAgICAgICAgICAgICAgIENvbnNvbGVfMTAKK2tleWNvZGUgIDY5ID0gICBOdW1fTG9jayAgICAgICAgQmFyZV9OdW1fTG9jayAgIE51bV9Mb2NrICAgICAgICBCYXJlX051bV9Mb2NrCitrZXljb2RlICA3MCA9ICAgU2Nyb2xsX0xvY2sgICAgIFNob3dfTWVtb3J5ICAgICBTY3JvbGxfTG9jayAgICAgU2hvd19NZW1vcnkgICAgIFNob3dfU3RhdGUgICAgICAgICAgICAgIFNob3dfU3RhdGUKK2tleWNvZGUgIDcxID0gICBLUF83ICAgICAgICAgICAgS1BfNyAgICAgICAgICAgIEtQXzcgICAgICAgICAgICBLUF83ICAgICAgICAgICAgS1BfNyAgICAgICAgICAgICAgICAgICAgS1BfNyAgICAgICAgICAgICAgICAgICAgQXNjaWlfNyAgICAgICAgICAgICAgICAgQXNjaWlfNwora2V5Y29kZSAgNzIgPSAgIEtQXzggICAgICAgICAgICBLUF84ICAgICAgICAgICAgS1BfOCAgICAgICAgICAgIEtQXzggICAgICAgICAgICBLUF84ICAgICAgICAgICAgICAgICAgICBLUF84ICAgICAgICAgICAgICAgICAgICBBc2NpaV84ICAgICAgICAgICAgICAgICBBc2NpaV84CitrZXljb2RlICA3MyA9ICAgS1BfOSAgICAgICAgICAgIEtQXzkgICAgICAgICAgICBLUF85ICAgICAgICAgICAgS1BfOSAgICAgICAgICAgIEtQXzkgICAgICAgICAgICAgICAgICAgIEtQXzkgICAgICAgICAgICAgICAgICAgIEFzY2lpXzkgICAgICAgICAgICAgICAgIEFzY2lpXzkKK2tleWNvZGUgIDc0ID0gICBLUF9TdWJ0cmFjdCAgICAgS1BfU3VidHJhY3QgICAgIEtQX1N1YnRyYWN0ICAgICBLUF9TdWJ0cmFjdCAgICAgS1BfU3VidHJhY3QgICAgICAgICAgICAgS1BfU3VidHJhY3QgICAgICAgICAgICAgS1BfU3VidHJhY3QgICAgICAgICAgICAgS1BfU3VidHJhY3QKK2tleWNvZGUgIDc1ID0gICBLUF80ICAgICAgICAgICAgS1BfNCAgICAgICAgICAgIEtQXzQgICAgICAgICAgICBLUF80ICAgICAgICAgICAgS1BfNCAgICAgICAgICAgICAgICAgICAgS1BfNCAgICAgICAgICAgICAgICAgICAgQXNjaWlfNCAgICAgICAgICAgICAgICAgQXNjaWlfNAora2V5Y29kZSAgNzYgPSAgIEtQXzUgICAgICAgICAgICBLUF81ICAgICAgICAgICAgS1BfNSAgICAgICAgICAgIEtQXzUgICAgICAgICAgICBLUF81ICAgICAgICAgICAgICAgICAgICBLUF81ICAgICAgICAgICAgICAgICAgICBBc2NpaV81ICAgICAgICAgICAgICAgICBBc2NpaV81CitrZXljb2RlICA3NyA9ICAgS1BfNiAgICAgICAgICAgIEtQXzYgICAgICAgICAgICBLUF82ICAgICAgICAgICAgS1BfNiAgICAgICAgICAgIEtQXzYgICAgICAgICAgICAgICAgICAgIEtQXzYgICAgICAgICAgICAgICAgICAgIEFzY2lpXzYgICAgICAgICAgICAgICAgIEFzY2lpXzYKK2tleWNvZGUgIDc4ID0gICBLUF9BZGQgICAgICAgICAgS1BfQWRkICAgICAgICAgIEtQX0FkZCAgICAgICAgICBLUF9BZGQgICAgICAgICAgS1BfQWRkICAgICAgICAgICAgICAgICAgS1BfQWRkICAgICAgICAgICAgICAgICAgS1BfQWRkICAgICAgICAgICAgICAgICAgS1BfQWRkCitrZXljb2RlICA3OSA9ICAgS1BfMSAgICAgICAgICAgIEtQXzEgICAgICAgICAgICBLUF8xICAgICAgICAgICAgS1BfMSAgICAgICAgICAgIEtQXzEgICAgICAgICAgICAgICAgICAgIEtQXzEgICAgICAgICAgICAgICAgICAgIEFzY2lpXzEgICAgICAgICAgICAgICAgIEFzY2lpXzEKK2tleWNvZGUgIDgwID0gICBLUF8yICAgICAgICAgICAgS1BfMiAgICAgICAgICAgIEtQXzIgICAgICAgICAgICBLUF8yICAgICAgICAgICAgS1BfMiAgICAgICAgICAgICAgICAgICAgS1BfMiAgICAgICAgICAgICAgICAgICAgQXNjaWlfMiAgICAgICAgICAgICAgICAgQXNjaWlfMgorIz09PT09PT09PT09PT09IHBsYWluID09PT09PT09PSBzaGlmdD09PT09PT09PT0gcGxhaW4gY3lyID09PT09IHNoaWZ0IGN5ciA9PT09PSBjdHJsID09PT09PT09PT09PT09PT09PSBjdHJsIGN5ciA9PT09PT09PT09PT09PSBhbHQgPT09PT09PT09PT09PT09PT09PSBhbHQgY3lyID09PT09PT09PT09PT09PSBjdHJsYWx0ID09PT09PT09PT09PT09PSBjdHJsYWx0IGN5ciA9PT09PT09PT09PQora2V5Y29kZSAgODEgPSAgIEtQXzMgICAgICAgICAgICBLUF8zICAgICAgICAgICAgS1BfMyAgICAgICAgICAgIEtQXzMgICAgICAgICAgICBLUF8zICAgICAgICAgICAgICAgICAgICBLUF8zICAgICAgICAgICAgICAgICAgICBBc2NpaV8zICAgICAgICAgICAgICAgICBBc2NpaV8zCitrZXljb2RlICA4MiA9ICAgS1BfMCAgICAgICAgICAgIEtQXzAgICAgICAgICAgICBLUF8wICAgICAgICAgICAgS1BfMCAgICAgICAgICAgIEtQXzAgICAgICAgICAgICAgICAgICAgIEtQXzAgICAgICAgICAgICAgICAgICAgIEFzY2lpXzAgICAgICAgICAgICAgICAgIEFzY2lpXzAKK2tleWNvZGUgIDgzID0gICBLUF9QZXJpb2QgICAgICAgS1BfUGVyaW9kICAgICAgIEtQX1BlcmlvZCAgICAgICBLUF9QZXJpb2QgICAgICAgS1BfUGVyaW9kICAgICAgICAgICAgICAgS1BfUGVyaW9kICAgICAgICAgICAgICAgS1BfUGVyaW9kICAgICAgICAgICAgICAgS1BfUGVyaW9kICAgICAgICAgICAgICAgQm9vdCAgICAgICAgICAgICAgICAgICAgQm9vdAora2V5Y29kZSAgODQgPSAgIExhc3RfQ29uc29sZQora2V5Y29kZSAgODUgPQora2V5Y29kZSAgODYgPSAgIGxlc3MgICAgICAgICAgICBncmVhdGVyICAgICAgICAgbGVzcyAgICAgICAgICAgIGdyZWF0ZXIgICAgICAgICBsZXNzICAgICAgICAgICAgICAgICAgICBsZXNzICAgICAgICAgICAgICAgICAgICBNZXRhX2xlc3MgICAgICAgICAgICAgICBNZXRhX2xlc3MKK2tleWNvZGUgIDg3ID0gICBGMTEgICAgICAgICAgICAgRjExICAgICAgICAgICAgIEYxMSAgICAgICAgICAgICBGMTEgICAgICAgICAgICAgRjExICAgICAgICAgICAgICAgICAgICAgRjExICAgICAgICAgICAgICAgICAgICAgQ29uc29sZV8xMSAgICAgICAgICAgICAgQ29uc29sZV8xMSAgICAgICAgICAgICAgQ29uc29sZV8xMSAgICAgICAgICAgICAgQ29uc29sZV8xMQora2V5Y29kZSAgODggPSAgIEYxMiAgICAgICAgICAgICBGMTIgICAgICAgICAgICAgRjEyICAgICAgICAgICAgIEYxMiAgICAgICAgICAgICBGMTIgICAgICAgICAgICAgICAgICAgICBGMTIgICAgICAgICAgICAgICAgICAgICBDb25zb2xlXzEyICAgICAgICAgICAgICBDb25zb2xlXzEyICAgICAgICAgICAgICBDb25zb2xlXzEyICAgICAgICAgICAgICBDb25zb2xlXzEyCitrZXljb2RlICA4OSA9CitrZXljb2RlICA5MCA9CitrZXljb2RlICA5MSA9CitrZXljb2RlICA5MiA9CitrZXljb2RlICA5MyA9CitrZXljb2RlICA5NCA9CitrZXljb2RlICA5NSA9CitrZXljb2RlICA5NiA9ICAgS1BfRW50ZXIKK2tleWNvZGUgIDk3ID0gICBDb250cm9sCitrZXljb2RlICA5OCA9ICAgS1BfRGl2aWRlCitrZXljb2RlICA5OSA9ICAgQ29udHJvbF9iYWNrc2xhc2gKKyMgUmlnaHQgQWx0IC0gQ3lyaWxsaWMKK2tleWNvZGUgMTAwID0gICBBbHRHcl9Mb2NrCisjPT09PT09PT09PT09PT0gcGxhaW4gPT09PT09PT09IHNoaWZ0PT09PT09PT09PSBwbGFpbiBjeXIgPT09PT0gc2hpZnQgY3lyID09PT09IGN0cmwgPT09PT09PT09PT09PT09PT09IGN0cmwgY3lyID09PT09PT09PT09PT09IGFsdCA9PT09PT09PT09PT09PT09PT09IGFsdCBjeXIgPT09PT09PT09PT09PT09IGN0cmxhbHQgPT09PT09PT09PT09PT09IGN0cmxhbHQgY3lyID09PT09PT09PT09CitrZXljb2RlIDEwMSA9ICAgQnJlYWsKK2tleWNvZGUgMTAyID0gICBGaW5kCitrZXljb2RlIDEwMyA9ICAgVXAKK2tleWNvZGUgMTA0ID0gICBQcmlvciAgICAgICAgICAgU2Nyb2xsX0JhY2t3YXJkIFByaW9yICAgICAgICAgICBTY3JvbGxfQmFja3dhcmQgUHJpb3IgICAgICAgICAgICAgICAgICAgUHJpb3IgICAgICAgICAgICAgICAgICAgUHJpb3IgICAgICAgICAgICAgICAgICAgUHJpb3IgICAgICAgICAgICAgICAgICAgUHJpb3IgICAgICAgICAgICAgICAgICAgUHJpb3IKK2tleWNvZGUgMTA1ID0gICBMZWZ0ICAgICAgICAgICAgTGVmdCAgICAgICAgICAgIExlZnQgICAgICAgICAgICBMZWZ0ICAgICAgICAgICAgTGVmdCAgICAgICAgICAgICAgICAgICAgTGVmdCAgICAgICAgICAgICAgICAgICAgTGVmdCAgICAgICAgICAgICAgICAgICAgTGVmdCAgICAgICAgICAgICAgICAgICAgRGVjcl9Db25zb2xlICAgICAgICAgICAgRGVjcl9Db25zb2xlCitrZXljb2RlIDEwNiA9ICAgUmlnaHQgICAgICAgICAgIFJpZ2h0ICAgICAgICAgICBSaWdodCAgICAgICAgICAgUmlnaHQgICAgICAgICAgIFJpZ2h0ICAgICAgICAgICAgICAgICAgIFJpZ2h0ICAgICAgICAgICAgICAgICAgIFJpZ2h0ICAgICAgICAgICAgICAgICAgIFJpZ2h0ICAgICAgICAgICAgICAgICAgIEluY3JfQ29uc29sZSAgICAgICAgICAgIEluY3JfQ29uc29sZQora2V5Y29kZSAxMDcgPSAgIFNlbGVjdAora2V5Y29kZSAxMDggPSAgIERvd24KK2tleWNvZGUgMTA5ID0gICBOZXh0ICAgICAgICAgICAgU2Nyb2xsX0ZvcndhcmQgIE5leHQgICAgICAgICAgICBTY3JvbGxfRm9yd2FyZCAgTmV4dCAgICAgICAgICAgICAgICAgICAgTmV4dCAgICAgICAgICAgICAgICAgICAgTmV4dCAgICAgICAgICAgICAgICAgICAgTmV4dCAgICAgICAgICAgICAgICAgICAgTmV4dCAgICAgICAgICAgICAgICAgICAgTmV4dAora2V5Y29kZSAxMTAgPSAgIEluc2VydAora2V5Y29kZSAxMTEgPSAgIFJlbW92ZSAgICAgICAgICBSZW1vdmUgICAgICAgICAgUmVtb3ZlICAgICAgICAgIFJlbW92ZSAgICAgICAgICBSZW1vdmUgICAgICAgICAgICAgICAgICBSZW1vdmUgICAgICAgICAgICAgICAgICBSZW1vdmUgICAgICAgICAgICAgICAgICBSZW1vdmUgICAgICAgICAgICAgICAgICBCb290ICAgICAgICAgICAgICAgICAgICBCb290CitrZXljb2RlIDExMiA9ICAgTWFjcm8KK2tleWNvZGUgMTEzID0gICBGMTMKK2tleWNvZGUgMTE0ID0gICBGMTQKK2tleWNvZGUgMTE1ID0gICBIZWxwCitrZXljb2RlIDExNiA9ICAgRG8KK2tleWNvZGUgMTE3ID0gICBGMTcKK2tleWNvZGUgMTE4ID0gICBLUF9NaW5QbHVzCitrZXljb2RlIDExOSA9ICAgUGF1c2UKK2tleWNvZGUgMTIwID0KKyM9PT09PT09PT09PT09PSBwbGFpbiA9PT09PT09PT0gc2hpZnQ9PT09PT09PT09IHBsYWluIGN5ciA9PT09PSBzaGlmdCBjeXIgPT09PT0gY3RybCA9PT09PT09PT09PT09PT09PT0gY3RybCBjeXIgPT09PT09PT09PT09PT0gYWx0ID09PT09PT09PT09PT09PT09PT0gYWx0IGN5ciA9PT09PT09PT09PT09PT0gY3RybGFsdCA9PT09PT09PT09PT09PT0gY3RybGFsdCBjeXIgPT09PT09PT09PT0KK2tleWNvZGUgMTIxID0KK2tleWNvZGUgMTIyID0KK2tleWNvZGUgMTIzID0KK2tleWNvZGUgMTI0ID0KK2tleWNvZGUgMTI1ID0KK2tleWNvZGUgMTI2ID0KK2tleWNvZGUgMTI3ID0KKworc3RyaW5nIEYxID0gIlwwMzNbW0EiCitzdHJpbmcgRjIgPSAiXDAzM1tbQiIKK3N0cmluZyBGMyA9ICJcMDMzW1tDIgorc3RyaW5nIEY0ID0gIlwwMzNbW0QiCitzdHJpbmcgRjUgPSAiXDAzM1tbRSIKK3N0cmluZyBGNiA9ICJcMDMzWzE3fiIKK3N0cmluZyBGNyA9ICJcMDMzWzE4fiIKK3N0cmluZyBGOCA9ICJcMDMzWzE5fiIKK3N0cmluZyBGOSA9ICJcMDMzWzIwfiIKK3N0cmluZyBGMTAgPSAiXDAzM1syMX4iCitzdHJpbmcgRjExID0gIlwwMzNbMjN+Igorc3RyaW5nIEYxMiA9ICJcMDMzWzI0fiIKK3N0cmluZyBGMTMgPSAiXDAzM1syNX4iCitzdHJpbmcgRjE0ID0gIlwwMzNbMjZ+Igorc3RyaW5nIEYxNSA9ICJcMDMzWzI4fiIKK3N0cmluZyBGMTYgPSAiXDAzM1syOX4iCitzdHJpbmcgRjE3ID0gIlwwMzNbMzF+Igorc3RyaW5nIEYxOCA9ICJcMDMzWzMyfiIKK3N0cmluZyBGMTkgPSAiXDAzM1szM34iCitzdHJpbmcgRjIwID0gIlwwMzNbMzR+Igorc3RyaW5nIEZpbmQgPSAiXDAzM1sxfiIKK3N0cmluZyBJbnNlcnQgPSAiXDAzM1syfiIKK3N0cmluZyBSZW1vdmUgPSAiXDAzM1szfiIKK3N0cmluZyBTZWxlY3QgPSAiXDAzM1s0fiIKK3N0cmluZyBQcmlvciA9ICJcMDMzWzV+Igorc3RyaW5nIE5leHQgPSAiXDAzM1s2fiIKK3N0cmluZyBNYWNybyA9ICJcMDMzW00iCitzdHJpbmcgUGF1c2UgPSAiXDAzM1tQIgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZ2V0dHlfdHR5MS9ydW4gYi9leGFtcGxlcy92YXJfc2VydmljZS9nZXR0eV90dHkxL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jN2M0MTNiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZ2V0dHlfdHR5MS9ydW4KQEAgLTAsMCArMSwzMCBAQAorIyEvYmluL3NoCisKK2V4ZWMgPi9kZXYvbnVsbAorZXhlYyAyPiYxCitleGVjIDwvZGV2L251bGwKKwordXNlcj1yb290CitiYXVkPTM4NDAwCitkZWxheT0zCitleHBvcnQgVEVSTT1saW51eAorCit0dHk9Ii9kZXYvJHtQV0QjIyovZ2V0dHlffSIKKworaWYgISB0ZXN0IC1lICIkdHR5IjsgdGhlbgorCWV4ZWMgZW52IC0gc2xlZXAgMzIwMDAKK2ZpCisKK3NsZWVwICIkZGVsYXkiCisKK2Nob3duICIkdXNlciIgIiR0dHkiICMgLSBkZXZmcyBtYWRlIGhhcHB5CisKK2V4ZWMgPCIkdHR5IiA+IiR0dHkiIDI+JjEKKyMgdXNpbmcgLiBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHNldCBlbnYgKFRFUk0gZXRjKSBpbiBjZmcKK3Rlc3QgLXggLi9jZmcgJiYgLiAuL2NmZworCitleGVjIFwKK2VudiAtICJURVJNPSRURVJNIiBQQVRIPSIkUEFUSCIgTE9HSU5fUFJFX1NVSURfU0NSSVBUPSIkUFdEL2xvZ2luLnNoIiBcCitzb2Z0bGltaXQgXAorc2V0dWlkZ2lkICIkdXNlciIgXAorZ2V0dHkgIiRiYXVkIiAiJHR0eSIgIiRURVJNIgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZ3BtL1JFQURNRSBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dwbS9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRkY2NiMgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dwbS9SRUFETUUKQEAgLTAsMCArMSw1IEBACitUaGUgcmVhbCBSRUFETUUgZmlsZSBpcyBvbmUgZGlyZWN0b3J5IHVwLgorCitUaGlzIGRpcmVjdG9yeSdzIHJ1biBzY3JpcHQgY2FuIGhhdmUgdXNlZnVsIGNvbW1lbnRzLgorSWYgaXQgZG9lc24ndCBidXQgeW91IGZlZWwgaXQgc2hvdWxkLCBwbGVhc2Ugc2VuZCBhIHBhdGNoCit0byBidXN5Ym94J3MgbWFpbGluZyBsaXN0LgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvZ3BtL3J1biBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dwbS9ydW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTEzZmRjZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2dwbS9ydW4KQEAgLTAsMCArMSwxNSBAQAorIyEvYmluL3NoCisKK2V4ZWMgPi9kZXYvbnVsbAorZXhlYyAyPiYxCitleGVjIDwvZGV2L251bGwKKwordXNlcj1yb290CitvcHRpb25zPSItRCAtMiAtbSAvZGV2L3BzYXV4IC10IHBzMiIKKyNvcHRpb25zPSItRCAtMiAtbSAvZGV2L3R0eVMwIC10IGJhcmUiCisKK2V4ZWMgXAorZW52IC0gUEFUSD0iJFBBVEgiIFwKK3NvZnRsaW1pdCBcCitzZXR1aWRnaWQgIiR1c2VyIiBcCitncG0gJG9wdGlvbnMKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2h0dHBkL1JFQURNRSBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2h0dHBkL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGRjY2IyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaHR0cGQvUkVBRE1FCkBAIC0wLDAgKzEsNSBAQAorVGhlIHJlYWwgUkVBRE1FIGZpbGUgaXMgb25lIGRpcmVjdG9yeSB1cC4KKworVGhpcyBkaXJlY3RvcnkncyBydW4gc2NyaXB0IGNhbiBoYXZlIHVzZWZ1bCBjb21tZW50cy4KK0lmIGl0IGRvZXNuJ3QgYnV0IHlvdSBmZWVsIGl0IHNob3VsZCwgcGxlYXNlIHNlbmQgYSBwYXRjaAordG8gYnVzeWJveCdzIG1haWxpbmcgbGlzdC4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2h0dHBkL2xvZy9ydW4gYi9leGFtcGxlcy92YXJfc2VydmljZS9odHRwZC9sb2cvcnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU2MGQxYjEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9odHRwZC9sb2cvcnVuCkBAIC0wLDAgKzEsMjEgQEAKKyMhL2Jpbi9zaAorCit1c2VyPWxvZ2dlcgorCitsb2dkaXI9Ii92YXIvbG9nL3NlcnZpY2UvYChjZCAuLjtiYXNlbmFtZSAkUFdEKWAiCitta2RpciAtcCAiJGxvZ2RpciIgMj4vZGV2L251bGwKK2Nob3duIC1SICIkdXNlciI6ICIkbG9nZGlyIgorY2htb2QgLVIgZ28tcnd4c3QsdStyd1ggIiRsb2dkaXIiCitybSBsb2dkaXIKK2xuIC1zICIkbG9nZGlyIiBsb2dkaXIKKworIyBtYWtlIHRoaXMgZGlyIGFjY2Vzc2libGUgdG8gbG9nZ2VyCitjaG1vZCBhK3JYIC4KKworZXhlYyA+L2Rldi9udWxsCitleGVjIDI+JjEKK2V4ZWMgXAorZW52IC0gUEFUSD0iJFBBVEgiIFwKK3NvZnRsaW1pdCBcCitzZXR1aWRnaWQgIiR1c2VyIiBcCitzdmxvZ2QgLXR0ICIkbG9nZGlyIgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaHR0cGQvcF9sb2cgYi9leGFtcGxlcy92YXJfc2VydmljZS9odHRwZC9wX2xvZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMjUyMWJlCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaHR0cGQvcF9sb2cKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKworY2QgbG9nL2xvZ2RpciB8fCBleGl0IDEKK2NhdCBAKiBjdXJyZW50IHwgJFBBR0VSCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9odHRwZC9ydW4gYi9leGFtcGxlcy92YXJfc2VydmljZS9odHRwZC9ydW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmY4ODY5YgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2h0dHBkL3J1bgpAQCAtMCwwICsxLDE4IEBACisjIS9iaW4vc2gKKworI2V4ZWMgPi9kZXYvbnVsbAorZXhlYyAyPiYxCitleGVjIDwvZGV2L251bGwKKwordXNlcj13d3cKK3VzZXI9cm9vdAorCitlY2hvICIqIFN0YXJ0aW5nIHRjcHN2ZCBmb3IgaHR0cGQgWyQkXSIKK2V4ZWMgXAorZW52IC0gUEFUSD0iJFBBVEgiIFwKK3NvZnRsaW1pdCBcCit0Y3BzdmQgXAorICAtdiAtRSAtbCBsb2NhbGhvc3QgLWMgNSBcCisgIDAgODggXAorc2V0dWlkZ2lkICIkdXNlciIgXAoraHR0cGQgLXZ2diAtaSAtaCAvcHViL2h0dHBkX3Jvb3QKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2h0dHBkL3dfbG9nIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaHR0cGQvd19sb2cKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWEzNmVmMQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2h0dHBkL3dfbG9nCkBAIC0wLDAgKzEsNCBAQAorIyEvYmluL3NoCisKK2NkIGxvZy9sb2dkaXIgfHwgZXhpdCAxCit3YXRjaCAtbjIgJ3c9YHR0eXNpemUgd2A7IGg9YHR0eXNpemUgaGA7IHRhaWwgLSQoKGgtMykpIGN1cnJlbnQgMj4mMSB8IGN1dCAtYjEtJCgody0yKSknCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9pZnBsdWdkX2lmL1JFQURNRSBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZGNjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9pZnBsdWdkX2lmL1JFQURNRQpAQCAtMCwwICsxLDUgQEAKK1RoZSByZWFsIFJFQURNRSBmaWxlIGlzIG9uZSBkaXJlY3RvcnkgdXAuCisKK1RoaXMgZGlyZWN0b3J5J3MgcnVuIHNjcmlwdCBjYW4gaGF2ZSB1c2VmdWwgY29tbWVudHMuCitJZiBpdCBkb2Vzbid0IGJ1dCB5b3UgZmVlbCBpdCBzaG91bGQsIHBsZWFzZSBzZW5kIGEgcGF0Y2gKK3RvIGJ1c3lib3gncyBtYWlsaW5nIGxpc3QuCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9pZnBsdWdkX2lmL2lmcGx1Z2RfaGFuZGxlciBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYvaWZwbHVnZF9oYW5kbGVyCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ5NjJmY2YKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9pZnBsdWdkX2lmL2lmcGx1Z2RfaGFuZGxlcgpAQCAtMCwwICsxLDE1IEBACisjIS9iaW4vc2gKKyMgcGFyYW1ldGVyczoKKyMgJDE6IGludGVyZmFjZQorIyAkMjogc3RhdGUKKworaWYgdGVzdCAtZCAiL3Zhci9zZXJ2aWNlL2RoY3BfJDEiOyB0aGVuCisJaWYgdGVzdCB4IiQyIiA9IHgiZG93biI7IHRoZW4KKwkJZWNobyAiRG93bmluZyAvdmFyL3NlcnZpY2UvZGhjcF8kMSIKKwkJc3YgZCAiL3Zhci9zZXJ2aWNlL2RoY3BfJDEiCisJZmkKKwlpZiB0ZXN0IHgiJDIiID0geCJ1cCI7IHRoZW4KKwkJZWNobyAiVXBwaW5nIC92YXIvc2VydmljZS9kaGNwXyQxIgorCQlzdiB1ICIvdmFyL3NlcnZpY2UvZGhjcF8kMSIKKwlmaQorZmkKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYvbG9nL3J1biBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYvbG9nL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NjBkMWIxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaWZwbHVnZF9pZi9sb2cvcnVuCkBAIC0wLDAgKzEsMjEgQEAKKyMhL2Jpbi9zaAorCit1c2VyPWxvZ2dlcgorCitsb2dkaXI9Ii92YXIvbG9nL3NlcnZpY2UvYChjZCAuLjtiYXNlbmFtZSAkUFdEKWAiCitta2RpciAtcCAiJGxvZ2RpciIgMj4vZGV2L251bGwKK2Nob3duIC1SICIkdXNlciI6ICIkbG9nZGlyIgorY2htb2QgLVIgZ28tcnd4c3QsdStyd1ggIiRsb2dkaXIiCitybSBsb2dkaXIKK2xuIC1zICIkbG9nZGlyIiBsb2dkaXIKKworIyBtYWtlIHRoaXMgZGlyIGFjY2Vzc2libGUgdG8gbG9nZ2VyCitjaG1vZCBhK3JYIC4KKworZXhlYyA+L2Rldi9udWxsCitleGVjIDI+JjEKK2V4ZWMgXAorZW52IC0gUEFUSD0iJFBBVEgiIFwKK3NvZnRsaW1pdCBcCitzZXR1aWRnaWQgIiR1c2VyIiBcCitzdmxvZ2QgLXR0ICIkbG9nZGlyIgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaWZwbHVnZF9pZi9wX2xvZyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYvcF9sb2cKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTI1MjFiZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYvcF9sb2cKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKworY2QgbG9nL2xvZ2RpciB8fCBleGl0IDEKK2NhdCBAKiBjdXJyZW50IHwgJFBBR0VSCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9pZnBsdWdkX2lmL3J1biBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYvcnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI3ODFjZjkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9pZnBsdWdkX2lmL3J1bgpAQCAtMCwwICsxLDM5IEBACisjIS9iaW4vc2gKKworI2V4ZWMgPi9kZXYvbnVsbAorZXhlYyAyPiYxCitleGVjIDwvZGV2L251bGwKKworcHdkPSIkUFdEIgorCitpZj0iJHtQV0QjIyovaWZwbHVnZF99IgorCitlY2hvICIqIFN0YXJ0aW5nIGlmcGx1Z2Qgb24gJGlmIFskJF0iCitleGVjIFwKK2VudiAtIFBBVEg9IiRQQVRIIiBcCitzb2Z0bGltaXQgXAorc2V0dWlkZ2lkIHJvb3QgXAoraWZwbHVnZCAtYXBxbnMgLXQzIC11OCAtZDggLWkgIiRpZiIgLXIgIiRwd2QvaWZwbHVnZF9oYW5kbGVyIgorCisjIFdlIHVzZSAtdDMgdG8gd2FrZSBpZnBsdWdkIHVwIGxlc3Mgb2Z0ZW4uCisjIElmIGFmdGVyIHRocmVlIHRlc3RzICgzKjM9OSA+IDgpIGxpbmsgc3RhdGUgc2VlbiB0byBiZSBkaWZmZXJlbnQsCisjIHRoZSBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkLgorIyBJT1c6IHNob3J0IGxpbmsgbG9zc2VzIHdpbGwgYmUgaWdub3JlZCwgbG9uZ2VyIG9uZXMKKyMgd2lsbCB0cmlnZ2VyIERIQ1AgcmVjb25maWd1cmF0aW9uIGFuZCBzdWNoIChzZWUgaGFuZGxlciBjb2RlKS4KKworIy1hICAgICAgIERvIG5vdCB1cCBpbnRlcmZhY2UgYXV0b21hdGljYWxseQorIy1wICAgICAgIERvbnQgcnVuIHNjcmlwdCBvbiBkYWVtb24gc3RhcnR1cAorIy1xICAgICAgIERvbnQgcnVuIHNjcmlwdCBvbiBkYWVtb24gcXVpdAorIy1uICAgICAgIERvIG5vdCBkYWVtb25pemUKKyMtcyAgICAgICBEbyBub3QgbG9nIHRvIHN5c2xvZworIy10IFNFQ1MgIFBvbGwgdGltZSBpbiBzZWNvbmRzCisjLXUgU0VDUyAgRGVsYXkgYmVmb3JlIHJ1bm5pbmcgc2NyaXB0IGFmdGVyIGxpbmsgdXAKKyMtZCBTRUNTICBEZWxheSBhZnRlciBsaW5rIGRvd24KKyMtaSBJRkFDRSBJbnRlcmZhY2UKKyMtciBQUk9HICBTY3JpcHQgdG8gcnVuCisjLWYvLUYgICAgVHJlYXQgbGluayBkZXRlY3Rpb24gZXJyb3IgYXMgbGluayBkb3duL2xpbmsgdXAgKG90aGVyd2lzZSBleGl0IG9uIGVycm9yKQorIy1NICAgICAgIE1vbml0b3IgY3JlYXRpb24vZGVzdHJ1Y3Rpb24gb2YgaW50ZXJmYWNlIChvdGhlcndpc2UgaXQgbXVzdCBleGlzdCkKKyMteCBBUkcgICBFeHRyYSBhcmd1bWVudCBmb3Igc2NyaXB0CisjLUkgICAgICAgRG9udCBleGl0IG9uIG5vbnplcm8gZXhpdCBjb2RlIGZyb20gc2NyaXB0CisjLWwgICAgICAgUnVuIHNjcmlwdCBvbiBzdGFydHVwIGV2ZW4gaWYgbm8gY2FibGUgaXMgZGV0ZWN0ZWQKKyMtbSBNT0RFICBBUEkgbW9kZSAobWlpLCBwcml2LCBldGh0b29sLCB3bGFuLCBhdXRvKQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaWZwbHVnZF9pZi93X2xvZyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYvd19sb2cKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWEzNmVmMQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2lmcGx1Z2RfaWYvd19sb2cKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKworY2QgbG9nL2xvZ2RpciB8fCBleGl0IDEKK3dhdGNoIC1uMiAndz1gdHR5c2l6ZSB3YDsgaD1gdHR5c2l6ZSBoYDsgdGFpbCAtJCgoaC0zKSkgY3VycmVudCAyPiYxIHwgY3V0IC1iMS0kKCh3LTIpKScKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2luZXRkL1JFQURNRSBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2luZXRkL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGRjY2IyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaW5ldGQvUkVBRE1FCkBAIC0wLDAgKzEsNSBAQAorVGhlIHJlYWwgUkVBRE1FIGZpbGUgaXMgb25lIGRpcmVjdG9yeSB1cC4KKworVGhpcyBkaXJlY3RvcnkncyBydW4gc2NyaXB0IGNhbiBoYXZlIHVzZWZ1bCBjb21tZW50cy4KK0lmIGl0IGRvZXNuJ3QgYnV0IHlvdSBmZWVsIGl0IHNob3VsZCwgcGxlYXNlIHNlbmQgYSBwYXRjaAordG8gYnVzeWJveCdzIG1haWxpbmcgbGlzdC4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2luZXRkL2luZXRkLmNvbmYgYi9leGFtcGxlcy92YXJfc2VydmljZS9pbmV0ZC9pbmV0ZC5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZjE1MWIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9pbmV0ZC9pbmV0ZC5jb25mCkBAIC0wLDAgKzEsMTggQEAKKyMgW0FERFI6XXNlcnZpY2VfbmFtZSAgICAgICAgICAgbXVzdCBiZSBpbiAvZXRjL3NlcnZpY2VzLCBvciBwb3J0IG51bWJlcgorIyBzb2NrZXRfdHlwZSAgICAgICAgICAgICAgICAgICBzdHJlYW0vZGdyYW0vcmF3L3JkbS9zZXFwYWNrZXQKKyMgcHJvdG9jb2wgICAgICAgICAgICAgICAgICAgICAgdGNwL3VkcAorIyB3YWl0L25vd2FpdFsubWF4XSAgICAgICAgICAgICB3YWl0IGlzIHVzdWFsbHkgZm9yIHVkcCwgbm93YWl0IGZvciB0Y3AKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiBtYXggY29waWVzIHRvIHJ1bgorIyB1c2VyWy5ncm91cF0gb3IgdXNlcls6Z3JvdXBdICB1c2VyIGFuZCBncm91cCB0byBydW4gdW5kZXIKKyMgYmluYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbSB0byBydW4KKyMgYXJnMCBhcmcxIGFyZzIuLi4gICAgICAgICAgICAgYXJndW1lbnRzLCBJTkNMVURJTkcgcHJvZ3JhbSBuYW1lIChhcmcwKQorCisjIHNlcnYJc29ja2V0IHBybyAgdy9udyAgIHVzZXIgYmluYXJ5IGFyZ3MKKworIyBJUHY2Cis1NTUJZGdyYW0gIHVkcDYgd2FpdCAgIHJvb3QgZWNobyBlY2hvIEhlbGxvIElQdjYgdWRwIHdvcmxkCisjIC4uLndpdGggQUREUiBwcmVmaXg6Cis6OjE6NDQ0CXN0cmVhbSB0Y3A2IG5vd2FpdCByb290IGVjaG8gZWNobyBIZWxsbyBJUHY2IGxvY2FsaG9zdAorCisjIFJhcmVseSBzZWVuIGNhc2U6IHRjcCAqd2FpdCogc2VydmljZQordGVsbmV0CXN0cmVhbSB0Y3AgIHdhaXQgICByb290IHRlbG5ldGQgdGVsbmV0ZCAtdzEwCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9pbmV0ZC9sb2cvcnVuIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaW5ldGQvbG9nL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NjBkMWIxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaW5ldGQvbG9nL3J1bgpAQCAtMCwwICsxLDIxIEBACisjIS9iaW4vc2gKKwordXNlcj1sb2dnZXIKKworbG9nZGlyPSIvdmFyL2xvZy9zZXJ2aWNlL2AoY2QgLi47YmFzZW5hbWUgJFBXRClgIgorbWtkaXIgLXAgIiRsb2dkaXIiIDI+L2Rldi9udWxsCitjaG93biAtUiAiJHVzZXIiOiAiJGxvZ2RpciIKK2NobW9kIC1SIGdvLXJ3eHN0LHUrcndYICIkbG9nZGlyIgorcm0gbG9nZGlyCitsbiAtcyAiJGxvZ2RpciIgbG9nZGlyCisKKyMgbWFrZSB0aGlzIGRpciBhY2Nlc3NpYmxlIHRvIGxvZ2dlcgorY2htb2QgYStyWCAuCisKK2V4ZWMgPi9kZXYvbnVsbAorZXhlYyAyPiYxCitleGVjIFwKK2VudiAtIFBBVEg9IiRQQVRIIiBcCitzb2Z0bGltaXQgXAorc2V0dWlkZ2lkICIkdXNlciIgXAorc3Zsb2dkIC10dCAiJGxvZ2RpciIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2luZXRkL3BfbG9nIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaW5ldGQvcF9sb2cKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTI1MjFiZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2luZXRkL3BfbG9nCkBAIC0wLDAgKzEsNCBAQAorIyEvYmluL3NoCisKK2NkIGxvZy9sb2dkaXIgfHwgZXhpdCAxCitjYXQgQCogY3VycmVudCB8ICRQQUdFUgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaW5ldGQvcnVuIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvaW5ldGQvcnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkxMGMxYjMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9pbmV0ZC9ydW4KQEAgLTAsMCArMSwxNyBAQAorIyEvYmluL3NoCisKKyNleGVjID4vZGV2L251bGwKK2V4ZWMgMj4mMQorZXhlYyA8L2Rldi9udWxsCisKK2VjaG8gIiogU3RhcnRpbmcgaW5ldGQgWyQkXSIKK2V4ZWMgXAorZW52IC0gUEFUSD0iJFBBVEgiIFwKK3NvZnRsaW1pdCBcCitpbmV0ZCAtZiAtZSAiJFBXRC9pbmV0ZC5jb25mIgorCisjIGluZXRkIFstZl0gWy1xIGxlbl0gW2NvbmZdCisjIC1mICAgICAgUnVuIGluIGZvcmVncm91bmQKKyMgLWUgICAgICBMb2cgdG8gc3RkZXJyIChkZWZhdWx0IGlzIHN5c2xvZykKKyMgLXEgTiAgICBTZXQgdGhlIHNpemUgb2YgdGhlIHNvY2tldCBsaXN0ZW4gcXVldWUgdG8gTgorIyAgICAgICAgIChkZWZhdWx0OiAxMjgpCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9pbmV0ZC93X2xvZyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL2luZXRkL3dfbG9nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmFhMzZlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9pbmV0ZC93X2xvZwpAQCAtMCwwICsxLDQgQEAKKyMhL2Jpbi9zaAorCitjZCBsb2cvbG9nZGlyIHx8IGV4aXQgMQord2F0Y2ggLW4yICd3PWB0dHlzaXplIHdgOyBoPWB0dHlzaXplIGhgOyB0YWlsIC0kKChoLTMpKSBjdXJyZW50IDI+JjEgfCBjdXQgLWIxLSQoKHctMikpJwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2Uvbm1ldGVyL1JFQURNRSBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL25tZXRlci9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRkY2NiMgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL25tZXRlci9SRUFETUUKQEAgLTAsMCArMSw1IEBACitUaGUgcmVhbCBSRUFETUUgZmlsZSBpcyBvbmUgZGlyZWN0b3J5IHVwLgorCitUaGlzIGRpcmVjdG9yeSdzIHJ1biBzY3JpcHQgY2FuIGhhdmUgdXNlZnVsIGNvbW1lbnRzLgorSWYgaXQgZG9lc24ndCBidXQgeW91IGZlZWwgaXQgc2hvdWxkLCBwbGVhc2Ugc2VuZCBhIHBhdGNoCit0byBidXN5Ym94J3MgbWFpbGluZyBsaXN0LgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2Uvbm1ldGVyL3J1biBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL25tZXRlci9ydW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2U1MTEyNAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL25tZXRlci9ydW4KQEAgLTAsMCArMSwyMCBAQAorIyEvYmluL3NoCisKK2V4ZWMgPi9kZXYvbnVsbAorZXhlYyAyPiYxCitleGVjIDwvZGV2L251bGwKKworIyBTaW5jZSBwZXItcHJvY2VzcyAvcHJvYy9uZXQvICgtPiAvcHJvYy9zZWxmL25ldC8pIGFwcGVhcmVkLAorIyB3ZSBuZWVkIHRvIGJlIHJvb3QKK3VzZXI9InJvb3QiCit0dHk9Ii9kZXYvdHR5OSIKK2NtZD0ibm1ldGVyICcldCAlYyB4ICV4IHAlcCBmICVmIGIgJWIgbSAlbSBpZiVbbmlmXSciCisKK2NobW9kIC1SIGErWCAuICMgb3IgZWxzZSBlbnYgd2lsbCBtb2FuCitjaG93biAiJHVzZXIiOiAiJHR0eSIgIyBkZXZmcyBtYWRlIGhhcHB5CisKK2V2YWwgZXhlYyBcCitlbnYgLSBQQVRIPSIkUEFUSCIgXAorc2V0dWlkZ2lkICIkdXNlciIgXAorPCIkdHR5IiA+IiR0dHkiIDI+JjEgXAorJGNtZApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvbnRwZC9SRUFETUUgYi9leGFtcGxlcy92YXJfc2VydmljZS9udHBkL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGRjY2IyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvbnRwZC9SRUFETUUKQEAgLTAsMCArMSw1IEBACitUaGUgcmVhbCBSRUFETUUgZmlsZSBpcyBvbmUgZGlyZWN0b3J5IHVwLgorCitUaGlzIGRpcmVjdG9yeSdzIHJ1biBzY3JpcHQgY2FuIGhhdmUgdXNlZnVsIGNvbW1lbnRzLgorSWYgaXQgZG9lc24ndCBidXQgeW91IGZlZWwgaXQgc2hvdWxkLCBwbGVhc2Ugc2VuZCBhIHBhdGNoCit0byBidXN5Ym94J3MgbWFpbGluZyBsaXN0LgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvbnRwZC9sb2cvcnVuIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvbnRwZC9sb2cvcnVuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU2MGQxYjEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9udHBkL2xvZy9ydW4KQEAgLTAsMCArMSwyMSBAQAorIyEvYmluL3NoCisKK3VzZXI9bG9nZ2VyCisKK2xvZ2Rpcj0iL3Zhci9sb2cvc2VydmljZS9gKGNkIC4uO2Jhc2VuYW1lICRQV0QpYCIKK21rZGlyIC1wICIkbG9nZGlyIiAyPi9kZXYvbnVsbAorY2hvd24gLVIgIiR1c2VyIjogIiRsb2dkaXIiCitjaG1vZCAtUiBnby1yd3hzdCx1K3J3WCAiJGxvZ2RpciIKK3JtIGxvZ2RpcgorbG4gLXMgIiRsb2dkaXIiIGxvZ2RpcgorCisjIG1ha2UgdGhpcyBkaXIgYWNjZXNzaWJsZSB0byBsb2dnZXIKK2NobW9kIGErclggLgorCitleGVjID4vZGV2L251bGwKK2V4ZWMgMj4mMQorZXhlYyBcCitlbnYgLSBQQVRIPSIkUEFUSCIgXAorc29mdGxpbWl0IFwKK3NldHVpZGdpZCAiJHVzZXIiIFwKK3N2bG9nZCAtdHQgIiRsb2dkaXIiCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9udHBkL250cC5zY3JpcHQgYi9leGFtcGxlcy92YXJfc2VydmljZS9udHBkL250cC5zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODU0MjE4MQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL250cGQvbnRwLnNjcmlwdApAQCAtMCwwICsxLDU0IEBACisjIS9iaW4vc2gKKworIyBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gcHJvdmlzaW9uIHRvIHByZXZlbnQgc2V2ZXJhbCBjb3BpZXMgb2YgdGhlIHNjcmlwdAorIyB0byBiZSBydW4gaW4gcXVpY2sgc3VjY2Vzc2lvbi4gSW4gZmFjdCwgaXQgaGFwcGVucyByYXRoZXIgb2Z0ZW4KKyMgaWYgaW5pdGlhbCBzeW5jcm9uaXphdGlvbiByZXN1bHRzIGluIGEgc3RlcC4KKyMgWW91IHdpbGwgc2VlICJzdGVwIiBhbmQgdGhlbiAic3RyYXR1bSIgc2NyaXB0IHJ1bnMsIHNvbWV0aW1lcworIyBhcyBjbG9zZSBhcyBvbmx5IDAuMDAyIHNlY29uZHMgYXBhcnQuCisjCisjIFNjcmlwdCBzaG91bGQgYmUgcmVhZHkgdG8gZGVhbCB3aXRoIHRoaXMuCisKK2R0PWBkYXRlICcrJVktJW0tJWQgJUg6JU06JVMnYAorCitlY2hvICJgdGFpbCAtbiAxOTkgLS0gIiQwLmxvZyIgMj4vZGV2L251bGxgIiA+IiQwLmxvZy4kJCIKKworaWYgdGVzdCB4IiQxIiA9IHgidW5zeW5jIiBcCis7IHRoZW4KKwkjIE5vIHJlcGxpZXMgZm9yIG91ciBOVFAgcmVxdWVzdHMgd2VyZSBzZWVuIGZvciBzb21lIHRpbWUuCisJIworCSMgQW1vbmcgbW9yZSBtdW5kYXRlIGNhc2VzIGxpa2UgbmV0d29yayBvdXRhZ2VzLCB0aGlzIGhhcHBlbnMKKwkjIGlmIHdlIHJhbiBmb3IgYSBMT05HIHRpbWUgKGRheXMpIGFuZCBudHAgc2VydmVyJ3MgSVAgaGFzIGNoYW5nZWQuCisJIyBudHBkIGhhcyBubyBjb2RlIHRvIHJlLXJlc29sdmUgcGVlcnMnIGFkZHJlc3NlcyB0byBJUHMsCisJIyB3ZSBuZWVkIHRvIGhlbHAgaXQ6CisJIworCWVjaG8gIiRkdDogJDEiXAorCQkic3luY3Jvbml6YXRpb24gbG9zdCwgcmVzdGFydGluZyBudHBkIlwKKwkJPj4iJDAubG9nLiQkIgorCW12IC0tICIkMC5sb2cuJCQiICIkMC5sb2ciCisJa2lsbCAkUFBJRAorCWV4aXQKK2ZpCisKK2lmIHRlc3QgeCIkc3RyYXR1bSIgIT0geCIiIFwKKyYmIHRlc3QgeCIkcG9sbF9pbnRlcnZhbCIgIT0geCIiIFwKKyYmIHRlc3QgNCAtZ2UgIiRzdHJhdHVtIiBcCismJiB0ZXN0IDEyOCAtbGUgIiRwb2xsX2ludGVydmFsIiBcCis7IHRoZW4KKwllY2hvICIkZHQ6ICQxIlwKKwkJImZyZXFfZHJpZnRfcHBtPSRmcmVxX2RyaWZ0X3BwbSJcCisJCSJvZmZzZXQ9JG9mZnNldCJcCisJCSJzdHJhdHVtPSRzdHJhdHVtIlwKKwkJInBvbGxfaW50ZXJ2YWw9JHBvbGxfaW50ZXJ2YWwsIlwKKwkJInNldHRpbmcgaGFyZHdhcmUgY2xvY2siXAorCQk+PiIkMC5sb2cuJCQiCisJbXYgLS0gIiQwLmxvZy4kJCIgIiQwLmxvZyIKKwlleGVjIGh3Y2xvY2sgLS1zeXN0b2hjCitmaQorCitlY2hvICIkZHQ6ICQxIlwKKwkiZnJlcV9kcmlmdF9wcG09JGZyZXFfZHJpZnRfcHBtIlwKKwkib2Zmc2V0PSRvZmZzZXQiXAorCSJzdHJhdHVtPSRzdHJhdHVtIlwKKwkicG9sbF9pbnRlcnZhbD0kcG9sbF9pbnRlcnZhbCJcCisJPj4iJDAubG9nLiQkIgorbXYgLS0gIiQwLmxvZy4kJCIgIiQwLmxvZyIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL250cGQvcF9sb2cgYi9leGFtcGxlcy92YXJfc2VydmljZS9udHBkL3BfbG9nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEyNTIxYmUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS9udHBkL3BfbG9nCkBAIC0wLDAgKzEsNCBAQAorIyEvYmluL3NoCisKK2NkIGxvZy9sb2dkaXIgfHwgZXhpdCAxCitjYXQgQCogY3VycmVudCB8ICRQQUdFUgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvbnRwZC9ydW4gYi9leGFtcGxlcy92YXJfc2VydmljZS9udHBkL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ODFkMjMxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvbnRwZC9ydW4KQEAgLTAsMCArMSw2MCBAQAorIyEvYmluL2Jhc2gKKyMgKHVzaW5nIGJhc2hpc20gKGFycmF5cykgaW4gZGhjcCBjb25maWcpCisKKyNleGVjID4vZGV2L251bGwKK2V4ZWMgMj4mMQorZXhlYyA8L2Rldi9udWxsCisKK3VzZXI9cm9vdAorcG9vbD0idXMucG9vbC5udHAub3JnIiAjIHJlcGxhY2UgInVzIiB3aXRoIHlvdXIgY291bnRyeSBjb2RlCisKK3NlcnZpY2U9IiR7UFdEIyMqL30iCitydW5kaXI9Ii92YXIvcnVuL3NlcnZpY2UvJHNlcnZpY2UiCitkZWZhdWx0X3Bfb3B0PSItcCAwLiRwb29sIC1wIDEuJHBvb2wgLXAgMi4kcG9vbCAtcCAzLiRwb29sIgorCisKKyMgTWFrZSBzdXJlIHJ1bmRpci8gZXhpc3RzCitta2RpciAtcCAiJHJ1bmRpciIgMj4vZGV2L251bGwKK2Nob3duIC1SICIkdXNlcjoiICIkcnVuZGlyIgorY2htb2QgLVIgYT1yWCAiJHJ1bmRpciIKK3JtIC1yZiBydW5kaXIgMj4vZGV2L251bGwKK2xuIC1zICIkcnVuZGlyIiBydW5kaXIKKworCitlY2hvICIqIENoZWNraW5nIG5ldHdvcmsiCit0ZXN0IC1mIC92YXIvcnVuL3NlcnZpY2UvZncvdXAgfHwgZXhlYyBzbGVlcCA3CitzbGVlcCA1ICAjIHRvIGxldCBpdCBzZXR0bGUKKworIyBHcmFiIGNvbmZpZyBmcm9tIGRoY3AKK2NmZz0tMQorZm9yIGYgaW4gcnVuZGlyLyoubnRwY29uZjsgZG8KKyAgICAgICAgdGVzdCAtZiAiJGYiIHx8IGNvbnRpbnVlCisgICAgICAgIC4gIiRmIgorZG9uZQorCisjIFNlbGVjdCBwZWVycworcF9vcHQ9IiIKK2NmZz0wCit3aGlsZSB0ZXN0IHgiJHtudHBpcFskY2ZnXX0iICE9IHgiIjsgZG8KKyAgICAgICAgcF9vcHQ9IiRwX29wdCAtcCAke250cGlwWyRjZmddfSIKKyAgICAgICAgbGV0IGNmZz1jZmcrMQorZG9uZQordGVzdCB4IiRwX29wdCIgPT0geCIiICYmIHBfb3B0PSIkZGVmYXVsdF9wX29wdCIKKworaWYgdGVzdCB4IiRwX29wdCIgPT0geCIiOyB0aGVuCisJZWNobyAiKiBObyBOVFAgcGVlcnMgY29uZmlndXJlZCwgc3RvcHBpbmciCisJc3YgbyAuCisJZXhlYyBzbGVlcCAxCitmaQorCisKKyMgTGV0IG90aGVycyBrbm93IHRoYXQgd2UgYXJlIHVwCitkYXRlICcrJVktJW0tJWQgJUg6JU06JVMgJVonID5ydW5kaXIvdXAKKworIyBHbyBnbyBnbworZWNobyAiKiBTdGFydGluZyBudHBkWyQkXSIKK2V4ZWMgXAorZW52IC0gUEFUSD0iJFBBVEgiIFwKK3NvZnRsaW1pdCBcCitzZXR1aWRnaWQgIiR1c2VyIiBcCitudHBkIC1kZG5ObCAtUyAuL250cC5zY3JpcHQgJHBfb3B0CmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS9udHBkL3dfbG9nIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvbnRwZC93X2xvZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYTM2ZWYxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvbnRwZC93X2xvZwpAQCAtMCwwICsxLDQgQEAKKyMhL2Jpbi9zaAorCitjZCBsb2cvbG9nZGlyIHx8IGV4aXQgMQord2F0Y2ggLW4yICd3PWB0dHlzaXplIHdgOyBoPWB0dHlzaXplIGhgOyB0YWlsIC0kKChoLTMpKSBjdXJyZW50IDI+JjEgfCBjdXQgLWIxLSQoKHctMikpJwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvdGZ0cGQvUkVBRE1FIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvdGZ0cGQvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZGNjYjIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS90ZnRwZC9SRUFETUUKQEAgLTAsMCArMSw1IEBACitUaGUgcmVhbCBSRUFETUUgZmlsZSBpcyBvbmUgZGlyZWN0b3J5IHVwLgorCitUaGlzIGRpcmVjdG9yeSdzIHJ1biBzY3JpcHQgY2FuIGhhdmUgdXNlZnVsIGNvbW1lbnRzLgorSWYgaXQgZG9lc24ndCBidXQgeW91IGZlZWwgaXQgc2hvdWxkLCBwbGVhc2Ugc2VuZCBhIHBhdGNoCit0byBidXN5Ym94J3MgbWFpbGluZyBsaXN0LgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvdGZ0cGQvbG9nL3J1biBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL3RmdHBkL2xvZy9ydW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTYwZDFiMQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL3RmdHBkL2xvZy9ydW4KQEAgLTAsMCArMSwyMSBAQAorIyEvYmluL3NoCisKK3VzZXI9bG9nZ2VyCisKK2xvZ2Rpcj0iL3Zhci9sb2cvc2VydmljZS9gKGNkIC4uO2Jhc2VuYW1lICRQV0QpYCIKK21rZGlyIC1wICIkbG9nZGlyIiAyPi9kZXYvbnVsbAorY2hvd24gLVIgIiR1c2VyIjogIiRsb2dkaXIiCitjaG1vZCAtUiBnby1yd3hzdCx1K3J3WCAiJGxvZ2RpciIKK3JtIGxvZ2RpcgorbG4gLXMgIiRsb2dkaXIiIGxvZ2RpcgorCisjIG1ha2UgdGhpcyBkaXIgYWNjZXNzaWJsZSB0byBsb2dnZXIKK2NobW9kIGErclggLgorCitleGVjID4vZGV2L251bGwKK2V4ZWMgMj4mMQorZXhlYyBcCitlbnYgLSBQQVRIPSIkUEFUSCIgXAorc29mdGxpbWl0IFwKK3NldHVpZGdpZCAiJHVzZXIiIFwKK3N2bG9nZCAtdHQgIiRsb2dkaXIiCmRpZmYgLS1naXQgYS9leGFtcGxlcy92YXJfc2VydmljZS90ZnRwZC9wX2xvZyBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL3RmdHBkL3BfbG9nCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEyNTIxYmUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy92YXJfc2VydmljZS90ZnRwZC9wX2xvZwpAQCAtMCwwICsxLDQgQEAKKyMhL2Jpbi9zaAorCitjZCBsb2cvbG9nZGlyIHx8IGV4aXQgMQorY2F0IEAqIGN1cnJlbnQgfCAkUEFHRVIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL3RmdHBkL3J1biBiL2V4YW1wbGVzL3Zhcl9zZXJ2aWNlL3RmdHBkL3J1bgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNDkyZDg0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvdGZ0cGQvcnVuCkBAIC0wLDAgKzEsMTUgQEAKKyMhL2Jpbi9zaAorCisjZXhlYyA+L2Rldi9udWxsCitleGVjIDI+JjEKK2V4ZWMgPC9kZXYvbnVsbAorCit1c2VyPXJvb3QgIyBmb3IgYmluZCB0byBwb3J0IDY5CisKK2V4ZWMgXAorZW52IC0gXAorc29mdGxpbWl0IFwKK3NldHVpZGdpZCAiJHVzZXIiIFwKK3VkcHN2ZCAtdiAtYyAxMCAtbCBsb2NhbGhvc3QgXAorICAwIDY5IFwKK3RmdHBkIC9wdWIvdGZ0cGRfcm9vdApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvdmFyX3NlcnZpY2UvdGZ0cGQvd19sb2cgYi9leGFtcGxlcy92YXJfc2VydmljZS90ZnRwZC93X2xvZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYTM2ZWYxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvdmFyX3NlcnZpY2UvdGZ0cGQvd19sb2cKQEAgLTAsMCArMSw0IEBACisjIS9iaW4vc2gKKworY2QgbG9nL2xvZ2RpciB8fCBleGl0IDEKK3dhdGNoIC1uMiAndz1gdHR5c2l6ZSB3YDsgaD1gdHR5c2l6ZSBoYDsgdGFpbCAtJCgoaC0zKSkgY3VycmVudCAyPiYxIHwgY3V0IC1iMS0kKCh3LTIpKScKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3pjaXAuc2NyaXB0IGIvZXhhbXBsZXMvemNpcC5zY3JpcHQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTU0M2MzMAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3pjaXAuc2NyaXB0CkBAIC0wLDAgKzEsMzggQEAKKyMhL2Jpbi9zaAorCisjIG9ubHkgZm9yIHVzZSBhcyBhICJ6Y2lwIiBjYWxsYmFjayBzY3JpcHQKK2lmIFsgIngkaW50ZXJmYWNlIiA9IHggXQordGhlbgorCWV4aXQgMQorZmkKKworIyB6Y2lwIHNob3VsZCBzdGFydCBvbiBib290L3Jlc3VtZSBhbmQgdmFyaW91cyBtZWRpYSBjaGFuZ2VzCitjYXNlICIkMSIgaW4KK2luaXQpCisJIyBmb3Igbm93LCB6Y2lwIHJlcXVpcmVzIHRoZSBsaW5rIHRvIGJlIGFscmVhZHkgdXAsCisJIyBhbmQgaXQgZHJvcHMgbGlua3Mgd2hlbiB0aGV5IGdvIGRvd24uICB0aGF0IGlzbid0CisJIyB0aGUgbW9zdCByb2J1c3QgbW9kZWwuLi4KKwlleGl0IDAKKwk7OworY29uZmlnKQorCWlmIFsgIngkaXAiID0geCBdCisJdGhlbgorCQlleGl0IDEKKwlmaQorCSMgcmVtZW1iZXIgJGlwIGZvciAkaW50ZXJmYWNlLCB0byB1c2Ugb24gcmVzdGFydAorCWlmIFsgIngkaXAiICE9IHggLWEgLXcgIiRpcC4kaW50ZXJmYWNlIiBdCisJdGhlbgorCQllY2hvICRpcCA+ICIkaXAuJGludGVyZmFjZSIKKwlmaQorCWV4ZWMgaXAgYWRkcmVzcyBhZGQgZGV2ICRpbnRlcmZhY2UgXAorCQlzY29wZSBsaW5rIGxvY2FsICIkaXAvMTYiIGJyb2FkY2FzdCArCisJOzsKK2RlY29uZmlnKQorCWlmIFsgeCRpcCA9IHggXQorCXRoZW4KKwkJZXhpdCAxCisJZmkKKwlleGVjIGlwIGFkZHJlc3MgZGVsIGRldiAkaW50ZXJmYWNlIGxvY2FsICRpcAorCTs7Citlc2FjCitleGl0IDEKZGlmZiAtLWdpdCBhL2ZpbmR1dGlscy9Db25maWcuc3JjIGIvZmluZHV0aWxzL0NvbmZpZy5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVlNzFhOAotLS0gL2Rldi9udWxsCisrKyBiL2ZpbmR1dGlscy9Db25maWcuc3JjCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIkZpbmRpbmcgVXRpbGl0aWVzIgorCitJTlNFUlQKKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvZmluZHV0aWxzL0tidWlsZC5zcmMgYi9maW5kdXRpbHMvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjRmYjc0Ci0tLSAvZGV2L251bGwKKysrIGIvZmluZHV0aWxzL0tidWlsZC5zcmMKQEAgLTAsMCArMSw5IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKZGlmZiAtLWdpdCBhL2ZpbmR1dGlscy9maW5kLmMgYi9maW5kdXRpbHMvZmluZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkN2NjYzMKLS0tIC9kZXYvbnVsbAorKysgYi9maW5kdXRpbHMvZmluZC5jCkBAIC0wLDAgKzEsMTQ3MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBmaW5kIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIFJld29ya2VkIGJ5IERhdmlkIERvdXRoaXR0IDxuOXViaEBjYWxsc2lnbi5uZXQ+IGFuZAorICogIE1hdHQgS3JhYWkgPGtyYWFpQGFsdW1uaS5jYXJuZWdpZW1lbGxvbi5lZHU+LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogZmluZHV0aWxzLTQuMS4yMDoKKyAqCisgKiAjIGZpbmQgZmlsZS50eHQgLWV4ZWMgJ2VjaG8ge30nICd7fSAge30nICc7JworICogZmluZDogZWNobyBmaWxlLnR4dDogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorICogIyBmaW5kIGZpbGUudHh0IC1leGVjICdlY2hvJyAne30gIHt9JyAnOyAnCisgKiBmaW5kOiBtaXNzaW5nIGFyZ3VtZW50IHRvIGAtZXhlYycKKyAqICMgZmluZCBmaWxlLnR4dCAtZXhlYyAnZWNobyB7fScgJ3t9ICB7fScgJzsnIGp1bmsKKyAqIGZpbmQ6IHBhdGhzIG11c3QgcHJlY2VkZSBleHByZXNzaW9uCisgKiAjIGZpbmQgZmlsZS50eHQgLWV4ZWMgJ2VjaG8ge30nICd7fSAge30nICc7JyBqdW5rICc7JworICogZmluZDogcGF0aHMgbXVzdCBwcmVjZWRlIGV4cHJlc3Npb24KKyAqICMgZmluZCBmaWxlLnR4dCAtZXhlYyAnZWNobycgJ3t9ICB7fScgJzsnCisgKiBmaWxlLnR4dCAgZmlsZS50eHQKKyAqIChzdHJhY2U6IGV4ZWN2ZSgiL2Jpbi9lY2hvIiwgWyJlY2hvIiwgImZpbGUudHh0ICBmaWxlLnR4dCJdLCBbIDMwIHZhcnMgXSkpCisgKiAjIGZpbmQgZmlsZS50eHQgLWV4ZWMgJ2VjaG8nICd7fSAge30nICc7JyAtcHJpbnQgLWV4ZWMgcHdkICc7JworICogZmlsZS50eHQgIGZpbGUudHh0CisgKiBmaWxlLnR4dAorICogL3RtcAorICogIyBmaW5kIC1uYW1lICcqLmMnIC1vIC1uYW1lICcqLmgnCisgKiBbc2hvd3MgZmlsZXMsICouYyBhbmQgKi5oIGludGVybWl4ZWRdCisgKiAjIGZpbmQgZmlsZS50eHQgLW5hbWUgJypmKicgLW8gLW5hbWUgJyp0KicKKyAqIGZpbGUudHh0CisgKiAjIGZpbmQgZmlsZS50eHQgLW5hbWUgJyp6KicgLW8gLW5hbWUgJyp0KicKKyAqIGZpbGUudHh0CisgKiAjIGZpbmQgZmlsZS50eHQgLW5hbWUgJypmKicgLW8gLW5hbWUgJyp6KicKKyAqIGZpbGUudHh0CisgKgorICogIyBmaW5kIHQgeiAtbmFtZSAnKnQqJyAtcHJpbnQgLW8gLW5hbWUgJyp6KicKKyAqIHQKKyAqICMgZmluZCB0IHogdCB6IC1uYW1lICcqdConIC1vIC1uYW1lICcqeionIC1wcmludAorICogegorICogegorICogIyBmaW5kIHQgeiB0IHogJygnIC1uYW1lICcqdConIC1vIC1uYW1lICcqeionICcpJyAtbyAtcHJpbnQKKyAqIChubyBvdXRwdXQpCisgKi8KKworLyogVGVzdGluZyBzY3JpcHQKKyAqIC4vYnVzeWJveCBmaW5kICIkQCIgfCB0ZWUgL3RtcC9iYl9maW5kCisgKiBlY2hvID09PT09PT09PT09PT09PT09PQorICogL3BhdGgvdG8vZ251L2ZpbmQgIiRAIiB8IHRlZSAvdG1wL3N0ZF9maW5kCisgKiBlY2hvID09PT09PT09PT09PT09PT09PQorICogZGlmZiAtdSAvdG1wL3N0ZF9maW5kIC90bXAvYmJfZmluZCAmJiBlY2hvIElkZW50aWNhbAorICovCisKKy8vY29uZmlnOmNvbmZpZyBGSU5ECisvL2NvbmZpZzoJYm9vbCAiZmluZCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBmaW5kIGlzIHVzZWQgdG8gc2VhcmNoIHlvdXIgc3lzdGVtIHRvIGZpbmQgc3BlY2lmaWVkIGZpbGVzLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX1BSSU5UMAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAtcHJpbnQwOiBOVUwtdGVybWluYXRlZCBvdXRwdXQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGSU5ECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQ2F1c2VzIG91dHB1dCBuYW1lcyB0byBiZSBzZXBhcmF0ZWQgYnkgYSBOVUwgY2hhcmFjdGVyCisvL2NvbmZpZzoJICByYXRoZXIgdGhhbiBhIG5ld2xpbmUuIFRoaXMgYWxsb3dzIG5hbWVzIHRoYXQgY29udGFpbgorLy9jb25maWc6CSAgbmV3bGluZXMgYW5kIG90aGVyIHdoaXRlc3BhY2UgdG8gYmUgbW9yZSBlYXNpbHkKKy8vY29uZmlnOgkgIGludGVycHJldGVkIGJ5IG90aGVyIHByb2dyYW1zLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX01USU1FCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1tdGltZTogbW9kaWZpZWQgdGltZSBtYXRjaGluZyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBBbGxvdyBzZWFyY2hpbmcgYmFzZWQgb24gdGhlIG1vZGlmaWNhdGlvbiB0aW1lIG9mCisvL2NvbmZpZzoJICBmaWxlcywgaW4gZGF5cy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfRklORF9NTUlOCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1tbWluOiBtb2RpZmllZCB0aW1lIG1hdGNoaW5nIGJ5IG1pbnV0ZXMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGSU5ECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQWxsb3cgc2VhcmNoaW5nIGJhc2VkIG9uIHRoZSBtb2RpZmljYXRpb24gdGltZSBvZgorLy9jb25maWc6CSAgZmlsZXMsIGluIG1pbnV0ZXMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfUEVSTQorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAtcGVybTogcGVybWlzc2lvbnMgbWF0Y2hpbmciCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGSU5ECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHNlYXJjaGluZyBiYXNlZCBvbiBmaWxlIHBlcm1pc3Npb25zLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX1RZUEUKKy8vY29uZmlnOglib29sICJFbmFibGUgLXR5cGU6IGZpbGUgdHlwZSBtYXRjaGluZyAoZmlsZS9kaXIvbGluay8uLi4pIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBzZWFyY2hpbmcgYmFzZWQgb24gZmlsZSB0eXBlIChmaWxlLAorLy9jb25maWc6CSAgZGlyZWN0b3J5LCBzb2NrZXQsIGRldmljZSwgZXRjLikuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfWERFVgorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAteGRldjogJ3N0YXkgaW4gZmlsZXN5c3RlbSciCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGSU5ECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVGhpcyBvcHRpb24gYWxsb3dzIGZpbmQgdG8gcmVzdHJpY3Qgc2VhcmNoZXMgdG8gYSBzaW5nbGUgZmlsZXN5c3RlbS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfRklORF9NQVhERVBUSAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAtbWluZGVwdGggTiBhbmQgLW1heGRlcHRoIE4iCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGSU5ECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVGhpcyBvcHRpb24gZW5hYmxlcyAtbWluZGVwdGggTiBhbmQgLW1heGRlcHRoIE4gb3B0aW9uLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX05FV0VSCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1uZXdlcjogY29tcGFyZSBmaWxlIG1vZGlmaWNhdGlvbiB0aW1lcyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdXBwb3J0IHRoZSAnZmluZCAtbmV3ZXInIG9wdGlvbiBmb3IgZmluZGluZyBhbnkgZmlsZXMgd2hpY2ggaGF2ZQorLy9jb25maWc6CSAgbW9kaWZpY2F0aW9uIHRpbWUgdGhhdCBpcyBtb3JlIHJlY2VudCB0aGFuIHRoZSBzcGVjaWZpZWQgRklMRS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfRklORF9JTlVNCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1pbnVtOiBpbm9kZSBudW1iZXIgbWF0Y2hpbmciCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGSU5ECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU3VwcG9ydCB0aGUgJ2ZpbmQgLWludW0nIG9wdGlvbiBmb3Igc2VhcmNoaW5nIGJ5IGlub2RlIG51bWJlci4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfRklORF9FWEVDCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1leGVjOiBleGVjdXRlIGNvbW1hbmRzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN1cHBvcnQgdGhlICdmaW5kIC1leGVjJyBvcHRpb24gZm9yIGV4ZWN1dGluZyBjb21tYW5kcyBiYXNlZCB1cG9uCisvL2NvbmZpZzoJICB0aGUgZmlsZXMgbWF0Y2hlZC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfRklORF9FWEVDX1BMVVMKKy8vY29uZmlnOglib29sICJFbmFibGUgLWV4ZWMgLi4uIHt9ICsiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGRUFUVVJFX0ZJTkRfRVhFQworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN1cHBvcnQgdGhlICdmaW5kIC1leGVjIC4uLiB7fSArJyBvcHRpb24gZm9yIGV4ZWN1dGluZyBjb21tYW5kcworLy9jb25maWc6CSAgZm9yIGFsbCBtYXRjaGVkIGZpbGVzIGF0IG9uY2UuCisvL2NvbmZpZzoJICBXaXRob3V0IHRoaXMgb3B0aW9uLCAtZXhlYyArIGlzIGEgc3lub255bSBmb3IgLWV4ZWMgOworLy9jb25maWc6CSAgKElPVzogaXQgd29ya3MgY29ycmVjdGx5LCBidXQgd2l0aG91dCBleHBlY3RlZCBzcGVlZHVwKQorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX1VTRVIKKy8vY29uZmlnOglib29sICJFbmFibGUgLXVzZXI6IHVzZXJuYW1lL3VpZCBtYXRjaGluZyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdXBwb3J0IHRoZSAnZmluZCAtdXNlcicgb3B0aW9uIGZvciBzZWFyY2hpbmcgYnkgdXNlcm5hbWUgb3IgdWlkLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX0dST1VQCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1ncm91cDogZ3JvdXAvZ2lkIG1hdGNoaW5nIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN1cHBvcnQgdGhlICdmaW5kIC1ncm91cCcgb3B0aW9uIGZvciBzZWFyY2hpbmcgYnkgZ3JvdXAgbmFtZSBvciBnaWQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfTk9UCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIHRoZSAnbm90JyAoISkgb3BlcmF0b3IiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGSU5ECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU3VwcG9ydCB0aGUgJyEnIG9wZXJhdG9yIHRvIGludmVydCB0aGUgdGVzdCByZXN1bHRzLgorLy9jb25maWc6CSAgSWYgJ0VuYWJsZSBmdWxsLWJsb3duIGRlc2t0b3AnIGlzIGVuYWJsZWQsIHRoZW4gd2lsbCBhbHNvIHN1cHBvcnQKKy8vY29uZmlnOgkgIHRoZSBub24tUE9TSVggbm90YXRpb24gJy1ub3QnLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX0RFUFRICisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC1kZXB0aCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBQcm9jZXNzIGVhY2ggZGlyZWN0b3J5J3MgY29udGVudHMgYmVmb3JlIHRoZSBkaXJlY3RvcnkgaXRzZWxmLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GSU5EX1BBUkVOCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIHBhcmVucyBpbiBvcHRpb25zIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSB1c2FnZSBvZiBwYXJlbnMgJygnIHRvIHNwZWNpZnkgbG9naWNhbCBvcmRlciBvZiBhcmd1bWVudHMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfU0laRQorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAtc2l6ZTogZmlsZSBzaXplIG1hdGNoaW5nIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN1cHBvcnQgdGhlICdmaW5kIC1zaXplJyBvcHRpb24gZm9yIHNlYXJjaGluZyBieSBmaWxlIHNpemUuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfUFJVTkUKKy8vY29uZmlnOglib29sICJFbmFibGUgLXBydW5lOiBleGNsdWRlIHN1YmRpcmVjdG9yaWVzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIElmIHRoZSBmaWxlIGlzIGEgZGlyZWN0b3J5LCBkb250IGRlc2NlbmQgaW50byBpdC4gVXNlZnVsIGZvcgorLy9jb25maWc6CSAgZXhjbHVzaW9uIC5zdm4gYW5kIENWUyBkaXJlY3Rvcmllcy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfRklORF9ERUxFVEUKKy8vY29uZmlnOglib29sICJFbmFibGUgLWRlbGV0ZTogZGVsZXRlIGZpbGVzL2RpcnMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGSU5EICYmIEZFQVRVUkVfRklORF9ERVBUSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN1cHBvcnQgdGhlICdmaW5kIC1kZWxldGUnIG9wdGlvbiBmb3IgZGVsZXRpbmcgZmlsZXMgYW5kIGRpcmVjdG9yaWVzLgorLy9jb25maWc6CSAgV0FSTklORzogVGhpcyBvcHRpb24gY2FuIGRvIG11Y2ggaGFybSBpZiB1c2VkIHdyb25nLiBCdXN5Ym94IHdpbGwgbm90CisvL2NvbmZpZzoJICB0cnkgdG8gcHJvdGVjdCB0aGUgdXNlciBmcm9tIGRvaW5nIHN0dXBpZCB0aGluZ3MuIFVzZSB3aXRoIGNhcmUuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfUEFUSAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAtcGF0aDogbWF0Y2ggcGF0aG5hbWUgd2l0aCBzaGVsbCBwYXR0ZXJuIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRoZSAtcGF0aCBvcHRpb24gbWF0Y2hlcyB3aG9sZSBwYXRobmFtZSBpbnN0ZWFkIG9mIGp1c3QgZmlsZW5hbWUuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfUkVHRVgKKy8vY29uZmlnOglib29sICJFbmFibGUgLXJlZ2V4OiBtYXRjaCBwYXRobmFtZSB3aXRoIHJlZ2V4IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRoZSAtcmVnZXggb3B0aW9uIG1hdGNoZXMgd2hvbGUgcGF0aG5hbWUgYWdhaW5zdCByZWd1bGFyIGV4cHJlc3Npb24uCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfQ09OVEVYVAorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAtY29udGV4dDogc2VjdXJpdHkgY29udGV4dCBtYXRjaGluZyIKKy8vY29uZmlnOglkZWZhdWx0IG4KKy8vY29uZmlnOglkZXBlbmRzIG9uIEZJTkQgJiYgU0VMSU5VWAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN1cHBvcnQgdGhlICdmaW5kIC1jb250ZXh0JyBvcHRpb24gZm9yIG1hdGNoaW5nIHNlY3VyaXR5IGNvbnRleHQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0ZJTkRfTElOS1MKKy8vY29uZmlnOglib29sICJFbmFibGUgLWxpbmtzOiBsaW5rIGNvdW50IG1hdGNoaW5nIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRklORAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN1cHBvcnQgdGhlICdmaW5kIC1saW5rcycgb3B0aW9uIGZvciBtYXRjaGluZyBudW1iZXIgb2YgbGlua3MuCisKKy8vYXBwbGV0OklGX0ZJTkQoQVBQTEVUX05PRVhFQyhmaW5kLCBmaW5kLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBmaW5kKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0ZJTkQpICs9IGZpbmQubworCisvL3VzYWdlOiNkZWZpbmUgZmluZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1ITF0gW1BBVEhdLi4uIFtPUFRJT05TXSBbQUNUSU9OU10iCisvL3VzYWdlOiNkZWZpbmUgZmluZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNlYXJjaCBmb3IgZmlsZXMgYW5kIHBlcmZvcm0gYWN0aW9ucyBvbiB0aGVtLlxuIgorLy91c2FnZTogICAgICAgIkZpcnN0IGZhaWxlZCBhY3Rpb24gc3RvcHMgcHJvY2Vzc2luZyBvZiBjdXJyZW50IGZpbGUuXG4iCisvL3VzYWdlOiAgICAgICAiRGVmYXVsdHM6IFBBVEggaXMgY3VycmVudCBkaXJlY3RvcnksIGFjdGlvbiBpcyAnLXByaW50J1xuIgorLy91c2FnZTogICAgICJcbgktTCwtZm9sbG93CUZvbGxvdyBzeW1saW5rcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUgJCS4uLm9uIGNvbW1hbmQgbGluZSBvbmx5IgorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX1hERVYoCisvL3VzYWdlOiAgICAgIlxuCS14ZGV2CQlEb24ndCBkZXNjZW5kIGRpcmVjdG9yaWVzIG9uIG90aGVyIGZpbGVzeXN0ZW1zIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX01BWERFUFRIKAorLy91c2FnZTogICAgICJcbgktbWF4ZGVwdGggTglEZXNjZW5kIGF0IG1vc3QgTiBsZXZlbHMuIC1tYXhkZXB0aCAwIGFwcGxpZXMiCisvL3VzYWdlOiAgICAgIlxuCQkJYWN0aW9ucyB0byBjb21tYW5kIGxpbmUgYXJndW1lbnRzIG9ubHkiCisvL3VzYWdlOiAgICAgIlxuCS1taW5kZXB0aCBOCURvbid0IGFjdCBvbiBmaXJzdCBOIGxldmVscyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9ERVBUSCgKKy8vdXNhZ2U6ICAgICAiXG4JLWRlcHRoCQlBY3Qgb24gZGlyZWN0b3J5ICphZnRlciogdHJhdmVyc2luZyBpdCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuQWN0aW9uczoiCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZJTkRfUEFSRU4oCisvL3VzYWdlOiAgICAgIlxuCSggQUNUSU9OUyApCUdyb3VwIGFjdGlvbnMgZm9yIC1vIC8gLWEiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZJTkRfTk9UKAorLy91c2FnZTogICAgICJcbgkhIEFDVAkJSW52ZXJ0IEFDVCdzIHN1Y2Nlc3MvZmFpbHVyZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JQUNUMSBbLWFdIEFDVDIJSWYgQUNUMSBmYWlscywgc3RvcCwgZWxzZSBkbyBBQ1QyIgorLy91c2FnZTogICAgICJcbglBQ1QxIC1vIEFDVDIJSWYgQUNUMSBzdWNjZWVkcywgc3RvcCwgZWxzZSBkbyBBQ1QyIgorLy91c2FnZTogICAgICJcbgkJCU5vdGU6IC1hIGhhcyBoaWdoZXIgcHJpb3JpdHkgdGhhbiAtbyIKKy8vdXNhZ2U6ICAgICAiXG4JLW5hbWUgUEFUVEVSTglNYXRjaCBmaWxlIG5hbWUgKHcvbyBkaXJlY3RvcnkgbmFtZSkgdG8gUEFUVEVSTiIKKy8vdXNhZ2U6ICAgICAiXG4JLWluYW1lIFBBVFRFUk4JQ2FzZSBpbnNlbnNpdGl2ZSAtbmFtZSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9QQVRIKAorLy91c2FnZTogICAgICJcbgktcGF0aCBQQVRURVJOCU1hdGNoIHBhdGggdG8gUEFUVEVSTiIKKy8vdXNhZ2U6ICAgICAiXG4JLWlwYXRoIFBBVFRFUk4JQ2FzZSBpbnNlbnNpdGl2ZSAtcGF0aCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9SRUdFWCgKKy8vdXNhZ2U6ICAgICAiXG4JLXJlZ2V4IFBBVFRFUk4JTWF0Y2ggcGF0aCB0byByZWdleCBQQVRURVJOIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX1RZUEUoCisvL3VzYWdlOiAgICAgIlxuCS10eXBlIFgJCUZpbGUgdHlwZSBpcyBYIChvbmUgb2Y6IGYsZCxsLGIsYywuLi4pIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX1BFUk0oCisvL3VzYWdlOiAgICAgIlxuCS1wZXJtIE1BU0sJQXQgbGVhc3Qgb25lIG1hc2sgYml0ICgrTUFTSyksIGFsbCBiaXRzICgtTUFTSyksIgorLy91c2FnZTogICAgICJcbgkJCW9yIGV4YWN0bHkgTUFTSyBiaXRzIGFyZSBzZXQgaW4gZmlsZSdzIG1vZGUiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZJTkRfTVRJTUUoCisvL3VzYWdlOiAgICAgIlxuCS1tdGltZSBEQVlTCW10aW1lIGlzIGdyZWF0ZXIgdGhhbiAoK04pLCBsZXNzIHRoYW4gKC1OKSwiCisvL3VzYWdlOiAgICAgIlxuCQkJb3IgZXhhY3RseSBOIGRheXMgaW4gdGhlIHBhc3QiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZJTkRfTU1JTigKKy8vdXNhZ2U6ICAgICAiXG4JLW1taW4gTUlOUwltdGltZSBpcyBncmVhdGVyIHRoYW4gKCtOKSwgbGVzcyB0aGFuICgtTiksIgorLy91c2FnZTogICAgICJcbgkJCW9yIGV4YWN0bHkgTiBtaW51dGVzIGluIHRoZSBwYXN0IgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX05FV0VSKAorLy91c2FnZTogICAgICJcbgktbmV3ZXIgRklMRQltdGltZSBpcyBtb3JlIHJlY2VudCB0aGFuIEZJTEUncyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9JTlVNKAorLy91c2FnZTogICAgICJcbgktaW51bSBOCQlGaWxlIGhhcyBpbm9kZSBudW1iZXIgTiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9VU0VSKAorLy91c2FnZTogICAgICJcbgktdXNlciBOQU1FL0lECUZpbGUgaXMgb3duZWQgYnkgZ2l2ZW4gdXNlciIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9HUk9VUCgKKy8vdXNhZ2U6ICAgICAiXG4JLWdyb3VwIE5BTUUvSUQJRmlsZSBpcyBvd25lZCBieSBnaXZlbiBncm91cCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9TSVpFKAorLy91c2FnZTogICAgICJcbgktc2l6ZSBOW2Jja10JRmlsZSBzaXplIGlzIE4gKGM6Ynl0ZXMsazprYnl0ZXMsYjo1MTIgYnl0ZXMoZGVmLikpIgorLy91c2FnZTogICAgICJcbgkJCSsvLU46IGZpbGUgc2l6ZSBpcyBiaWdnZXIvc21hbGxlciB0aGFuIE4iCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZJTkRfTElOS1MoCisvL3VzYWdlOiAgICAgIlxuCS1saW5rcyBOCU51bWJlciBvZiBsaW5rcyBpcyBncmVhdGVyIHRoYW4gKCtOKSwgbGVzcyB0aGFuICgtTiksIgorLy91c2FnZTogICAgICJcbgkJCW9yIGV4YWN0bHkgTiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9DT05URVhUKAorLy91c2FnZTogICAgICJcbgktY29udGV4dCBDVFgJRmlsZSBoYXMgc3BlY2lmaWVkIHNlY3VyaXR5IGNvbnRleHQiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZJTkRfUFJVTkUoCisvL3VzYWdlOiAgICAgIlxuCS1wcnVuZQkJSWYgY3VycmVudCBmaWxlIGlzIGRpcmVjdG9yeSwgZG9uJ3QgZGVzY2VuZCBpbnRvIGl0IgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbklmIG5vbmUgb2YgdGhlIGZvbGxvd2luZyBhY3Rpb25zIGlzIHNwZWNpZmllZCwgLXByaW50IGlzIGFzc3VtZWQiCisvL3VzYWdlOiAgICAgIlxuCS1wcmludAkJUHJpbnQgZmlsZSBuYW1lIgorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX1BSSU5UMCgKKy8vdXNhZ2U6ICAgICAiXG4JLXByaW50MAkJUHJpbnQgZmlsZSBuYW1lLCBOVUwgdGVybWluYXRlZCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRklORF9FWEVDKAorLy91c2FnZTogICAgICJcbgktZXhlYyBDTUQgQVJHIDsJUnVuIENNRCB3aXRoIGFsbCBpbnN0YW5jZXMgb2Yge30gcmVwbGFjZWQgYnkiCisvL3VzYWdlOiAgICAgIlxuCQkJZmlsZSBuYW1lLiBGYWlscyBpZiBDTUQgZXhpdHMgd2l0aCBub256ZXJvIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9GSU5EX0VYRUNfUExVUygKKy8vdXNhZ2U6ICAgICAiXG4JLWV4ZWMgQ01EIEFSRyArIFJ1biBDTUQgd2l0aCB7fSByZXBsYWNlZCBieSBsaXN0IG9mIGZpbGUgbmFtZXMiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZJTkRfREVMRVRFKAorLy91c2FnZTogICAgICJcbgktZGVsZXRlCQlEZWxldGUgY3VycmVudCBmaWxlL2RpcmVjdG9yeS4gVHVybnMgb24gLWRlcHRoIG9wdGlvbiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZmluZF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBmaW5kIC8gLW5hbWUgcGFzc3dkXG4iCisvL3VzYWdlOiAgICAgICAiL2V0Yy9wYXNzd2RcbiIKKworI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfUkVHRVgKKyMgaW5jbHVkZSAieHJlZ2V4LmgiCisjZW5kaWYKKy8qIEdOVWlzbTogKi8KKyNpZm5kZWYgRk5NX0NBU0VGT0xECisjIGRlZmluZSBGTk1fQ0FTRUZPTEQgMAorI2VuZGlmCisKKyNpZiAxCisjIGRlZmluZSBkYmcoLi4uKSAoKHZvaWQpMCkKKyNlbHNlCisjIGRlZmluZSBkYmcoLi4uKSBiYl9lcnJvcl9tc2coX19WQV9BUkdTX18pCisjZW5kaWYKKworCisvKiBUaGlzIGlzIGEgTk9FWEVDIGFwcGxldC4gQmUgdmVyeSBjYXJlZnVsISAqLworCisKK3R5cGVkZWYgaW50ICgqYWN0aW9uX2ZwKShjb25zdCBjaGFyICpmaWxlTmFtZSwgY29uc3Qgc3RydWN0IHN0YXQgKnN0YXRidWYsIHZvaWQgKikgRkFTVF9GVU5DOworCit0eXBlZGVmIHN0cnVjdCB7CisJYWN0aW9uX2ZwIGY7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9OT1QKKwlib29sIGludmVydDsKKyNlbmRpZgorfSBhY3Rpb247CisKKyNkZWZpbmUgQUNUUyhuYW1lLCAuLi4pIHR5cGVkZWYgc3RydWN0IHsgYWN0aW9uIGE7IF9fVkFfQVJHU19fIH0gYWN0aW9uXyMjbmFtZTsKKyNkZWZpbmUgQUNURihuYW1lKSBcCisJc3RhdGljIGludCBGQVNUX0ZVTkMgZnVuY18jI25hbWUoY29uc3QgY2hhciAqZmlsZU5hbWUgVU5VU0VEX1BBUkFNLCBcCisJCWNvbnN0IHN0cnVjdCBzdGF0ICpzdGF0YnVmIFVOVVNFRF9QQVJBTSwgXAorCQlhY3Rpb25fIyNuYW1lKiBhcCBVTlVTRURfUEFSQU0pCisKKyAgICAgICAgICAgICAgICAgICAgICAgIEFDVFMocHJpbnQpCisgICAgICAgICAgICAgICAgICAgICAgICBBQ1RTKG5hbWUsICBjb25zdCBjaGFyICpwYXR0ZXJuOyBib29sIGluYW1lOykKK0lGX0ZFQVRVUkVfRklORF9QQVRIKCAgIEFDVFMocGF0aCwgIGNvbnN0IGNoYXIgKnBhdHRlcm47IGJvb2wgaXBhdGg7KSkKK0lGX0ZFQVRVUkVfRklORF9SRUdFWCggIEFDVFMocmVnZXgsIHJlZ2V4X3QgY29tcGlsZWRfcGF0dGVybjspKQorSUZfRkVBVFVSRV9GSU5EX1BSSU5UMCggQUNUUyhwcmludDApKQorSUZfRkVBVFVSRV9GSU5EX1RZUEUoICAgQUNUUyh0eXBlLCAgaW50IHR5cGVfbWFzazspKQorSUZfRkVBVFVSRV9GSU5EX1BFUk0oICAgQUNUUyhwZXJtLCAgY2hhciBwZXJtX2NoYXI7IG1vZGVfdCBwZXJtX21hc2s7KSkKK0lGX0ZFQVRVUkVfRklORF9NVElNRSggIEFDVFMobXRpbWUsIGNoYXIgbXRpbWVfY2hhcjsgdW5zaWduZWQgbXRpbWVfZGF5czspKQorSUZfRkVBVFVSRV9GSU5EX01NSU4oICAgQUNUUyhtbWluLCAgY2hhciBtbWluX2NoYXI7IHVuc2lnbmVkIG1taW5fbWluczspKQorSUZfRkVBVFVSRV9GSU5EX05FV0VSKCAgQUNUUyhuZXdlciwgdGltZV90IG5ld2VyX210aW1lOykpCitJRl9GRUFUVVJFX0ZJTkRfSU5VTSggICBBQ1RTKGludW0sICBpbm9fdCBpbm9kZV9udW07KSkKK0lGX0ZFQVRVUkVfRklORF9VU0VSKCAgIEFDVFModXNlciwgIHVpZF90IHVpZDspKQorSUZfRkVBVFVSRV9GSU5EX1NJWkUoICAgQUNUUyhzaXplLCAgY2hhciBzaXplX2NoYXI7IG9mZl90IHNpemU7KSkKK0lGX0ZFQVRVUkVfRklORF9DT05URVhUKEFDVFMoY29udGV4dCwgc2VjdXJpdHlfY29udGV4dF90IGNvbnRleHQ7KSkKK0lGX0ZFQVRVUkVfRklORF9QQVJFTiggIEFDVFMocGFyZW4sIGFjdGlvbiAqKipzdWJleHByOykpCitJRl9GRUFUVVJFX0ZJTkRfUFJVTkUoICBBQ1RTKHBydW5lKSkKK0lGX0ZFQVRVUkVfRklORF9ERUxFVEUoIEFDVFMoZGVsZXRlKSkKK0lGX0ZFQVRVUkVfRklORF9FWEVDKCAgIEFDVFMoZXhlYywKKwkJCQljaGFyICoqZXhlY19hcmd2OyAvKiAtZXhlYyBBUkdTICovCisJCQkJdW5zaWduZWQgKnN1YnN0X2NvdW50OworCQkJCWludCBleGVjX2FyZ2M7IC8qIGNvdW50IG9mIEFSR1MgKi8KKwkJCQlJRl9GRUFUVVJFX0ZJTkRfRVhFQ19QTFVTKAorCQkJCQkvKgorCQkJCQkgKiBmaWxlbGlzdCBpcyBOVUxMIGlmICJleGVjIDsiCisJCQkJCSAqIG5vbi1OVUxMIGlmICJleGVjICsiCisJCQkJCSAqLworCQkJCQljaGFyICoqZmlsZWxpc3Q7CisJCQkJCWludCBmaWxlbGlzdF9pZHg7CisJCQkJCWludCBmaWxlX2xlbjsKKwkJCQkpCisJCQkJKSkKK0lGX0ZFQVRVUkVfRklORF9HUk9VUCggIEFDVFMoZ3JvdXAsIGdpZF90IGdpZDspKQorSUZfRkVBVFVSRV9GSU5EX0xJTktTKCAgQUNUUyhsaW5rcywgY2hhciBsaW5rc19jaGFyOyBpbnQgbGlua3NfY291bnQ7KSkKKworc3RydWN0IGdsb2JhbHMgeworCUlGX0ZFQVRVUkVfRklORF9YREVWKGRldl90ICp4ZGV2X2RldjspCisJSUZfRkVBVFVSRV9GSU5EX1hERVYoaW50IHhkZXZfY291bnQ7KQorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfTUFYREVQVEgKKwlpbnQgbWlubWF4ZGVwdGhbMl07CisjZW5kaWYKKwlhY3Rpb24gKioqYWN0aW9uczsKKwlzbWFsbGludCBuZWVkX3ByaW50OworCXNtYWxsaW50IHhkZXZfb247CisJcmVjdXJzZV9mbGFnc190IHJlY3Vyc2VfZmxhZ3M7CisJSUZfRkVBVFVSRV9GSU5EX0VYRUNfUExVUyh1bnNpZ25lZCBtYXhfYXJndl9sZW47KQorfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJc3RydWN0IEdfc2l6ZWNoZWNrIHsgXAorCQljaGFyIEdfc2l6ZWNoZWNrW3NpemVvZihHKSA+IENPTU1PTl9CVUZTSVpFID8gLTEgOiAxXTsgXAorCX07IFwKKwkvKiB3ZSBoYXZlIHRvIHplcm8gaXQgb3V0IGJlY2F1c2Ugb2YgTk9FWEVDICovIFwKKwltZW1zZXQoJkcsIDAsIHNpemVvZihHKSk7IFwKKwlJRl9GRUFUVVJFX0ZJTkRfTUFYREVQVEgoRy5taW5tYXhkZXB0aFsxXSA9IElOVF9NQVg7KSBcCisJSUZfRkVBVFVSRV9GSU5EX0VYRUNfUExVUyhHLm1heF9hcmd2X2xlbiA9IGJiX2FyZ19tYXgoKSAtIDIwNDg7KSBcCisJRy5uZWVkX3ByaW50ID0gMTsgXAorCUcucmVjdXJzZV9mbGFncyA9IEFDVElPTl9SRUNVUlNFOyBcCit9IHdoaWxlICgwKQorCisvKiBSZXR1cm4gdmFsdWVzIG9mIEFDVEZzICgnYWN0aW9uIGZ1bmN0aW9ucycpIGFyZSBhIGJpdCBtYXNrOgorICogYml0IDE9MTogcHJ1bmUgKHVzZSBTS0lQIGNvbnN0YW50IGZvciBzZXR0aW5nIGl0KQorICogYml0IDA9MTogbWF0Y2hlZCBzdWNjZXNzZnVsbHkgKFRSVUUpCisgKi8KKworc3RhdGljIGludCBleGVjX2FjdGlvbnMoYWN0aW9uICoqKmFwcHAsIGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBjb25zdCBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZikKK3sKKwlpbnQgY3VyX2dyb3VwOworCWludCBjdXJfYWN0aW9uOworCWludCByYyA9IDA7CisJYWN0aW9uICoqYXBwLCAqYXA7CisKKwkvKiAiYWN0aW9uIGdyb3VwIiBpcyBhIHNldCBvZiBhY3Rpb25zIEFORGVkIHRvZ2V0aGVyLgorCSAqIGdyb3VwcyBhcmUgT1JlZCB0b2dldGhlci4KKwkgKiBXZSBzaW1wbHkgZXZhbHVhdGUgZWFjaCBncm91cCB1bnRpbCB3ZSBmaW5kIG9uZSBpbiB3aGljaCBhbGwgYWN0aW9ucworCSAqIHN1Y2NlZWQuICovCisKKwkvKiAtcHJ1bmUgaXMgc3BlY2lhbDogaWYgaXQgaXMgZW5jb3VudGVyZWQsIHRoZW4gd2Ugd29uJ3QKKwkgKiBkZXNjZW5kIGludG8gY3VycmVudCBkaXJlY3RvcnkuIEl0IGRvZXNuJ3QgbWF0dGVyIHdoZXRoZXIKKwkgKiBhY3Rpb24gZ3JvdXAgKGluIHdoaWNoIC1wcnVuZSBzaXRzKSB3aWxsIHN1Y2NlZWQgb3Igbm90OgorCSAqIGZpbmQgKiAtcHJ1bmUgLW5hbWUgJ2YqJyAtbyAtbmFtZSAnbSonIC0tIHBydW5lcyBldmVyeSBkaXIKKwkgKiBmaW5kICogLW5hbWUgJ2YqJyAtbyAtcHJ1bmUgLW5hbWUgJ20qJyAtLSBwcnVuZXMgYWxsIGRpcnMKKwkgKiAgICAgbm90IHN0YXJ0aW5nIHdpdGggJ2YnICovCisKKwkvKiBXZSBpbnZlcnQgVFJVRSBiaXQgKGJpdCAwKS4gTm93IDEgdGhlcmUgbWVhbnMgJ2ZhaWx1cmUnLgorCSAqIGFuZCBiaXR3aXNlIE9SIGluICJyYyB8PSBUUlVFIF4gYXAtPmYoKSIgd2lsbDoKKwkgKiAoMSkgbWFrZSBTS0lQICgtcHJ1bmUpIGJpdCBzdGljazsgYW5kICgyKSBkZXRlY3QgJ2ZhaWx1cmUnLgorCSAqIE9uIHJldHVybiwgYml0IGlzIHJlc3RvcmVkLiAgKi8KKworCWN1cl9ncm91cCA9IC0xOworCXdoaWxlICgoYXBwID0gYXBwcFsrK2N1cl9ncm91cF0pICE9IE5VTEwpIHsKKwkJcmMgJj0gflRSVUU7IC8qICdzdWNjZXNzJyBzbyBmYXIsIGNsZWFyIFRSVUUgYml0ICovCisJCWN1cl9hY3Rpb24gPSAtMTsKKwkJd2hpbGUgKDEpIHsKKwkJCWFwID0gYXBwWysrY3VyX2FjdGlvbl07CisJCQlpZiAoIWFwKSAvKiBhbGwgYWN0aW9ucyBpbiBncm91cCB3ZXJlIHN1Y2Nlc3NmdWwgKi8KKwkJCQlyZXR1cm4gcmMgXiBUUlVFOyAvKiByZXN0b3JlIFRSVUUgYml0ICovCisJCQlyYyB8PSBUUlVFIF4gYXAtPmYoZmlsZU5hbWUsIHN0YXRidWYsIGFwKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX05PVAorCQkJaWYgKGFwLT5pbnZlcnQpIHJjIF49IFRSVUU7CisjZW5kaWYKKwkJCWRiZygiZ3JwICVkIGFjdGlvbiAlZCByYzoweCV4IiwgY3VyX2dyb3VwLCBjdXJfYWN0aW9uLCByYyk7CisJCQlpZiAocmMgJiBUUlVFKSAvKiBjdXJyZW50IGdyb3VwIGZhaWxlZCwgdHJ5IG5leHQgKi8KKwkJCQlicmVhazsKKwkJfQorCX0KKwlkYmcoInJldHVybmluZzoweCV4IiwgcmMgXiBUUlVFKTsKKwlyZXR1cm4gcmMgXiBUUlVFOyAvKiByZXN0b3JlIFRSVUUgYml0ICovCit9CisKKyNpZiAhRk5NX0NBU0VGT0xECitzdGF0aWMgY2hhciAqc3RyY3B5X3VwY2FzZShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKwljaGFyICpkID0gZHN0OworCXdoaWxlICgxKSB7CisJCXVuc2lnbmVkIGNoYXIgY2ggPSAqc3JjKys7CisJCWlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ3onKQorCQkJY2ggLT0gKCdhJyAtICdBJyk7CisJCSpkKysgPSBjaDsKKwkJaWYgKGNoID09ICdcMCcpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGRzdDsKK30KKyNlbmRpZgorCitBQ1RGKG5hbWUpCit7CisJY29uc3QgY2hhciAqdG1wID0gYmJfYmFzZW5hbWUoZmlsZU5hbWUpOworCWlmICh0bXAgIT0gZmlsZU5hbWUgJiYgKnRtcCA9PSAnXDAnKSB7CisJCS8qICJmb28vYmFyLyIuIE9oIG5vLi4uIGdvIGJhY2sgdG8gJ2InICovCisJCXRtcC0tOworCQl3aGlsZSAodG1wICE9IGZpbGVOYW1lICYmICotLXRtcCAhPSAnLycpCisJCQljb250aW51ZTsKKwkJaWYgKCp0bXAgPT0gJy8nKQorCQkJdG1wKys7CisJfQorCS8qIFdhcyB1c2luZyBGTk1fUEVSSU9EIGZsYWcgdG9vLAorCSAqIGJ1dCBzb21ld2hlcmUgYmV0d2VlbiA0LjEuMjAgYW5kIDQuNC4wIEdOVSBmaW5kIHN0b3BwZWQgdXNpbmcgaXQuCisJICogZmluZCAtbmFtZSAnKmZvbycgc2hvdWxkIG1hdGNoIC5mb28gdG9vOgorCSAqLworI2lmIEZOTV9DQVNFRk9MRAorCXJldHVybiBmbm1hdGNoKGFwLT5wYXR0ZXJuLCB0bXAsIChhcC0+aW5hbWUgPyBGTk1fQ0FTRUZPTEQgOiAwKSkgPT0gMDsKKyNlbHNlCisJaWYgKGFwLT5pbmFtZSkKKwkJdG1wID0gc3RyY3B5X3VwY2FzZShhbGxvY2Eoc3RybGVuKHRtcCkgKyAxKSwgdG1wKTsKKwlyZXR1cm4gZm5tYXRjaChhcC0+cGF0dGVybiwgdG1wLCAwKSA9PSAwOworI2VuZGlmCit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX1BBVEgKK0FDVEYocGF0aCkKK3sKKyMgaWYgRk5NX0NBU0VGT0xECisJcmV0dXJuIGZubWF0Y2goYXAtPnBhdHRlcm4sIGZpbGVOYW1lLCAoYXAtPmlwYXRoID8gRk5NX0NBU0VGT0xEIDogMCkpID09IDA7CisjIGVsc2UKKwlpZiAoYXAtPmlwYXRoKQorCQlmaWxlTmFtZSA9IHN0cmNweV91cGNhc2UoYWxsb2NhKHN0cmxlbihmaWxlTmFtZSkgKyAxKSwgZmlsZU5hbWUpOworCXJldHVybiBmbm1hdGNoKGFwLT5wYXR0ZXJuLCBmaWxlTmFtZSwgMCkgPT0gMDsKKyMgZW5kaWYKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfUkVHRVgKK0FDVEYocmVnZXgpCit7CisJcmVnbWF0Y2hfdCBtYXRjaDsKKwlpZiAocmVnZXhlYygmYXAtPmNvbXBpbGVkX3BhdHRlcm4sIGZpbGVOYW1lLCAxLCAmbWF0Y2gsIDAgLyplZmxhZ3MqLykpCisJCXJldHVybiAwOyAvKiBubyBtYXRjaCAqLworCWlmIChtYXRjaC5ybV9zbykKKwkJcmV0dXJuIDA7IC8qIG1hdGNoIGRvZXNuJ3Qgc3RhcnQgYXQgcG9zIDAgKi8KKwlpZiAoZmlsZU5hbWVbbWF0Y2gucm1fZW9dKQorCQlyZXR1cm4gMDsgLyogbWF0Y2ggZG9lc24ndCBlbmQgZXhhY3RseSBhdCBlbmQgb2YgcGF0aG5hbWUgKi8KKwlyZXR1cm4gMTsKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfVFlQRQorQUNURih0eXBlKQoreworCXJldHVybiAoKHN0YXRidWYtPnN0X21vZGUgJiBTX0lGTVQpID09IGFwLT50eXBlX21hc2spOworfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9QRVJNCitBQ1RGKHBlcm0pCit7CisJLyogLXBlcm0gWysvXW1vZGU6IGF0IGxlYXN0IG9uZSBvZiBwZXJtX21hc2sgYml0cyBhcmUgc2V0ICovCisJaWYgKGFwLT5wZXJtX2NoYXIgPT0gJysnIHx8IGFwLT5wZXJtX2NoYXIgPT0gJy8nKQorCQlyZXR1cm4gKHN0YXRidWYtPnN0X21vZGUgJiBhcC0+cGVybV9tYXNrKSAhPSAwOworCS8qIC1wZXJtIC1tb2RlOiBhbGwgb2YgcGVybV9tYXNrIGFyZSBzZXQgKi8KKwlpZiAoYXAtPnBlcm1fY2hhciA9PSAnLScpCisJCXJldHVybiAoc3RhdGJ1Zi0+c3RfbW9kZSAmIGFwLT5wZXJtX21hc2spID09IGFwLT5wZXJtX21hc2s7CisJLyogLXBlcm0gbW9kZTogZmlsZSBtb2RlIG11c3QgbWF0Y2ggcGVybV9tYXNrICovCisJcmV0dXJuIChzdGF0YnVmLT5zdF9tb2RlICYgMDc3NzcpID09IGFwLT5wZXJtX21hc2s7Cit9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX01USU1FCitBQ1RGKG10aW1lKQoreworCXRpbWVfdCBmaWxlX2FnZSA9IHRpbWUoTlVMTCkgLSBzdGF0YnVmLT5zdF9tdGltZTsKKwl0aW1lX3QgbXRpbWVfc2VjcyA9IGFwLT5tdGltZV9kYXlzICogMjQqNjAqNjA7CisJaWYgKGFwLT5tdGltZV9jaGFyID09ICcrJykKKwkJcmV0dXJuIGZpbGVfYWdlID49IG10aW1lX3NlY3MgKyAyNCo2MCo2MDsKKwlpZiAoYXAtPm10aW1lX2NoYXIgPT0gJy0nKQorCQlyZXR1cm4gZmlsZV9hZ2UgPCBtdGltZV9zZWNzOworCS8qIGp1c3QgbnVtZXJpYyBtdGltZSAqLworCXJldHVybiBmaWxlX2FnZSA+PSBtdGltZV9zZWNzICYmIGZpbGVfYWdlIDwgKG10aW1lX3NlY3MgKyAyNCo2MCo2MCk7Cit9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX01NSU4KK0FDVEYobW1pbikKK3sKKwl0aW1lX3QgZmlsZV9hZ2UgPSB0aW1lKE5VTEwpIC0gc3RhdGJ1Zi0+c3RfbXRpbWU7CisJdGltZV90IG1taW5fc2VjcyA9IGFwLT5tbWluX21pbnMgKiA2MDsKKwlpZiAoYXAtPm1taW5fY2hhciA9PSAnKycpCisJCXJldHVybiBmaWxlX2FnZSA+PSBtbWluX3NlY3MgKyA2MDsKKwlpZiAoYXAtPm1taW5fY2hhciA9PSAnLScpCisJCXJldHVybiBmaWxlX2FnZSA8IG1taW5fc2VjczsKKwkvKiBqdXN0IG51bWVyaWMgbW1pbiAqLworCXJldHVybiBmaWxlX2FnZSA+PSBtbWluX3NlY3MgJiYgZmlsZV9hZ2UgPCAobW1pbl9zZWNzICsgNjApOworfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9ORVdFUgorQUNURihuZXdlcikKK3sKKwlyZXR1cm4gKGFwLT5uZXdlcl9tdGltZSA8IHN0YXRidWYtPnN0X210aW1lKTsKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfSU5VTQorQUNURihpbnVtKQoreworCXJldHVybiAoc3RhdGJ1Zi0+c3RfaW5vID09IGFwLT5pbm9kZV9udW0pOworfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9FWEVDCitzdGF0aWMgaW50IGRvX2V4ZWMoYWN0aW9uX2V4ZWMgKmFwLCBjb25zdCBjaGFyICpmaWxlTmFtZSkKK3sKKwlpbnQgaSwgcmM7CisjIGlmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfRVhFQ19QTFVTCisJaW50IHNpemUgPSBhcC0+ZXhlY19hcmdjICsgYXAtPmZpbGVsaXN0X2lkeCArIDE7CisjIGVsc2UKKwlpbnQgc2l6ZSA9IGFwLT5leGVjX2FyZ2MgKyAxOworIyBlbmRpZgorIyBpZiBFTkFCTEVfVVNFX1BPUlRBQkxFX0NPREUKKwljaGFyICoqYXJndiA9IGFsbG9jYShzaXplb2YoY2hhciopICogc2l6ZSk7CisjIGVsc2UgLyogZ2NjIDQuMy4xIGdlbmVyYXRlcyBzbWFsbGVyIGNvZGU6ICovCisJY2hhciAqYXJndltzaXplXTsKKyMgZW5kaWYKKwljaGFyICoqcHAgPSBhcmd2OworCisJZm9yIChpID0gMDsgaSA8IGFwLT5leGVjX2FyZ2M7IGkrKykgeworCQljb25zdCBjaGFyICphcmcgPSBhcC0+ZXhlY19hcmd2W2ldOworCisjIGlmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfRVhFQ19QTFVTCisJCWlmIChhcC0+ZmlsZWxpc3QpIHsKKwkJCS8qIEhhbmRsaW5nICItZXhlYyArIgorCQkJICogT25seSBvbmUgZXhlY19hcmd2W2ldIGhhcyBzdWJzdGl0dXRpb24gaW4gaXQuCisJCQkgKiBFeHBhbmQgdGhhdCBvbmUgZXhlY19hcmd2W2ldIGludG8gZmlsZSBsaXN0LgorCQkJICovCisJCQlpZiAoYXAtPnN1YnN0X2NvdW50W2ldID09IDApIHsKKwkJCQkqcHArKyA9IHhzdHJkdXAoYXJnKTsKKwkJCX0gZWxzZSB7CisJCQkJaW50IGogPSAwOworCQkJCXdoaWxlIChhcC0+ZmlsZWxpc3Rbal0pIHsKKwkJCQkJLyogMm5kIGFyZyBoZXJlIHNob3VsZCBiZSBhcC0+c3Vic3RfY291bnRbaV0sIGJ1dCBpdCBpcyBhbHdheXMgMTogKi8KKwkJCQkJKnBwKysgPSB4bWFsbG9jX3N1YnN0aXR1dGVfc3RyaW5nKGFyZywgMSwgInt9IiwgYXAtPmZpbGVsaXN0W2pdKTsKKwkJCQkJZnJlZShhcC0+ZmlsZWxpc3Rbal0pOworCQkJCQlqKys7CisJCQkJfQorCQkJfQorCQl9IGVsc2UKKyMgZW5kaWYKKwkJeworCQkJLyogSGFuZGxpbmcgIi1leGVjIDsiICovCisJCQkqcHArKyA9IHhtYWxsb2Nfc3Vic3RpdHV0ZV9zdHJpbmcoYXJnLCBhcC0+c3Vic3RfY291bnRbaV0sICJ7fSIsIGZpbGVOYW1lKTsKKwkJfQorCX0KKwkqcHAgPSBOVUxMOyAvKiB0ZXJtaW5hdGUgdGhlIGxpc3QgKi8KKworIyBpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX0VYRUNfUExVUworCWlmIChhcC0+ZmlsZWxpc3QpIHsKKwkJYXAtPmZpbGVsaXN0WzBdID0gTlVMTDsKKwkJYXAtPmZpbGVsaXN0X2lkeCA9IDA7CisJCWFwLT5maWxlX2xlbiA9IDA7CisJfQorIyBlbmRpZgorCisJcmMgPSBzcGF3bl9hbmRfd2FpdChhcmd2KTsKKwlpZiAocmMgPCAwKQorCQliYl9zaW1wbGVfcGVycm9yX21zZyhhcmd2WzBdKTsKKworCWkgPSAwOworCXdoaWxlIChhcmd2W2ldKQorCQlmcmVlKGFyZ3ZbaSsrXSk7CisJcmV0dXJuIHJjID09IDA7IC8qIHJldHVybiAxIGlmIGV4aXRjb2RlIDAgKi8KK30KK0FDVEYoZXhlYykKK3sKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9FWEVDX1BMVVMKKwlpZiAoYXAtPmZpbGVsaXN0KSB7CisJCWludCByYzsKKworCQlhcC0+ZmlsZWxpc3QgPSB4cmVhbGxvY192ZWN0b3IoYXAtPmZpbGVsaXN0LCA4LCBhcC0+ZmlsZWxpc3RfaWR4KTsKKwkJYXAtPmZpbGVsaXN0W2FwLT5maWxlbGlzdF9pZHgrK10gPSB4c3RyZHVwKGZpbGVOYW1lKTsKKwkJYXAtPmZpbGVfbGVuICs9IHN0cmxlbihmaWxlTmFtZSkgKyBzaXplb2YoY2hhciopICsgMTsKKwkJLyogSWYgd2UgaGF2ZSBsb3RzIG9mIGZpbGVzIGFscmVhZHksIGV4ZWMgdGhlIGNvbW1hbmQgKi8KKwkJcmMgPSAxOworCQlpZiAoYXAtPmZpbGVfbGVuID49IEcubWF4X2FyZ3ZfbGVuKQorCQkJcmMgPSBkb19leGVjKGFwLCBOVUxMKTsKKwkJcmV0dXJuIHJjOworCX0KKyMgZW5kaWYKKwlyZXR1cm4gZG9fZXhlYyhhcCwgZmlsZU5hbWUpOworfQorIyBpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX0VYRUNfUExVUworc3RhdGljIGludCBmbHVzaF9leGVjX3BsdXModm9pZCkKK3sKKwlhY3Rpb24gKmFwOworCWFjdGlvbiAqKmFwcDsKKwlhY3Rpb24gKioqYXBwcCA9IEcuYWN0aW9uczsKKwl3aGlsZSAoKGFwcCA9ICphcHBwKyspICE9IE5VTEwpIHsKKwkJd2hpbGUgKChhcCA9ICphcHArKykgIT0gTlVMTCkgeworCQkJaWYgKGFwLT5mID09IChhY3Rpb25fZnApZnVuY19leGVjKSB7CisJCQkJYWN0aW9uX2V4ZWMgKmFlID0gKHZvaWQqKWFwOworCQkJCWlmIChhZS0+ZmlsZWxpc3RfaWR4ICE9IDApIHsKKwkJCQkJaW50IHJjID0gZG9fZXhlYyhhZSwgTlVMTCk7CisjICBpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX05PVAorCQkJCQlpZiAoYXAtPmludmVydCkgcmMgPSAhcmM7CisjICBlbmRpZgorCQkJCQlpZiAocmMgPT0gMCkKKwkJCQkJCXJldHVybiAxOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKyMgZW5kaWYKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfVVNFUgorQUNURih1c2VyKQoreworCXJldHVybiAoc3RhdGJ1Zi0+c3RfdWlkID09IGFwLT51aWQpOworfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9HUk9VUAorQUNURihncm91cCkKK3sKKwlyZXR1cm4gKHN0YXRidWYtPnN0X2dpZCA9PSBhcC0+Z2lkKTsKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfUFJJTlQwCitBQ1RGKHByaW50MCkKK3sKKwlwcmludGYoIiVzJWMiLCBmaWxlTmFtZSwgJ1wwJyk7CisJcmV0dXJuIFRSVUU7Cit9CisjZW5kaWYKK0FDVEYocHJpbnQpCit7CisJcHV0cyhmaWxlTmFtZSk7CisJcmV0dXJuIFRSVUU7Cit9CisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9QQVJFTgorQUNURihwYXJlbikKK3sKKwlyZXR1cm4gZXhlY19hY3Rpb25zKGFwLT5zdWJleHByLCBmaWxlTmFtZSwgc3RhdGJ1Zik7Cit9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX1NJWkUKK0FDVEYoc2l6ZSkKK3sKKwlpZiAoYXAtPnNpemVfY2hhciA9PSAnKycpCisJCXJldHVybiBzdGF0YnVmLT5zdF9zaXplID4gYXAtPnNpemU7CisJaWYgKGFwLT5zaXplX2NoYXIgPT0gJy0nKQorCQlyZXR1cm4gc3RhdGJ1Zi0+c3Rfc2l6ZSA8IGFwLT5zaXplOworCXJldHVybiBzdGF0YnVmLT5zdF9zaXplID09IGFwLT5zaXplOworfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9QUlVORQorLyoKKyAqIC1wcnVuZTogaWYgLWRlcHRoIGlzIG5vdCBnaXZlbiwgcmV0dXJuIHRydWUgYW5kIGRvIG5vdCBkZXNjZW5kCisgKiBjdXJyZW50IGRpcjsgaWYgLWRlcHRoIGlzIGdpdmVuLCByZXR1cm4gZmFsc2Ugd2l0aCBubyBlZmZlY3QuCisgKiBFeGFtcGxlOgorICogZmluZCBkaXIgLW5hbWUgJ2FzbS0qJyAtcHJ1bmUgLW8gLW5hbWUgJyouW2NoU10nIC1wcmludAorICovCitBQ1RGKHBydW5lKQoreworCXJldHVybiBTS0lQICsgVFJVRTsKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfREVMRVRFCitBQ1RGKGRlbGV0ZSkKK3sKKwlpbnQgcmM7CisJaWYgKFNfSVNESVIoc3RhdGJ1Zi0+c3RfbW9kZSkpIHsKKwkJLyogImZpbmQgLiAtZGVsZXRlIiBza2lwcyBybWRpcigiLiIpICovCisJCXJjID0gMDsKKwkJaWYgKE5PVF9MT05FX0NIQVIoZmlsZU5hbWUsICcuJykpCisJCQlyYyA9IHJtZGlyKGZpbGVOYW1lKTsKKwl9IGVsc2UgeworCQlyYyA9IHVubGluayhmaWxlTmFtZSk7CisJfQorCWlmIChyYyA8IDApCisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZpbGVOYW1lKTsKKwlyZXR1cm4gVFJVRTsKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfQ09OVEVYVAorQUNURihjb250ZXh0KQoreworCXNlY3VyaXR5X2NvbnRleHRfdCBjb247CisJaW50IHJjOworCisJaWYgKEcucmVjdXJzZV9mbGFncyAmIEFDVElPTl9GT0xMT1dMSU5LUykgeworCQlyYyA9IGdldGZpbGVjb24oZmlsZU5hbWUsICZjb24pOworCX0gZWxzZSB7CisJCXJjID0gbGdldGZpbGVjb24oZmlsZU5hbWUsICZjb24pOworCX0KKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gRkFMU0U7CisJcmMgPSBzdHJjbXAoYXAtPmNvbnRleHQsIGNvbik7CisJZnJlZWNvbihjb24pOworCXJldHVybiByYyA9PSAwOworfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9MSU5LUworQUNURihsaW5rcykKK3sKKwlzd2l0Y2goYXAtPmxpbmtzX2NoYXIpIHsKKwljYXNlICctJyA6IHJldHVybiAoc3RhdGJ1Zi0+c3RfbmxpbmsgPCAgYXAtPmxpbmtzX2NvdW50KTsKKwljYXNlICcrJyA6IHJldHVybiAoc3RhdGJ1Zi0+c3RfbmxpbmsgPiAgYXAtPmxpbmtzX2NvdW50KTsKKwlkZWZhdWx0OiAgIHJldHVybiAoc3RhdGJ1Zi0+c3RfbmxpbmsgPT0gYXAtPmxpbmtzX2NvdW50KTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIGludCBGQVNUX0ZVTkMgZmlsZUFjdGlvbihjb25zdCBjaGFyICpmaWxlTmFtZSwKKwkJc3RydWN0IHN0YXQgKnN0YXRidWYsCisJCXZvaWQgKnVzZXJEYXRhIFVOVVNFRF9QQVJBTSwKKwkJaW50IGRlcHRoIElGX05PVF9GRUFUVVJFX0ZJTkRfTUFYREVQVEgoVU5VU0VEX1BBUkFNKSkKK3sKKwlpbnQgcjsKKwlpbnQgc2FtZV9mcyA9IDE7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX1hERVYKKwlpZiAoU19JU0RJUihzdGF0YnVmLT5zdF9tb2RlKSAmJiBHLnhkZXZfY291bnQpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBHLnhkZXZfY291bnQ7IGkrKykgeworCQkJaWYgKEcueGRldl9kZXZbaV0gPT0gc3RhdGJ1Zi0+c3RfZGV2KQorCQkJCWdvdG8gZm91bmQ7CisJCX0KKwkJLy9iYl9lcnJvcl9tc2coIiclcyc6IG5vdCBzYW1lIGZzIiwgZmlsZU5hbWUpOworCQlzYW1lX2ZzID0gMDsKKyBmb3VuZDogOworCX0KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9NQVhERVBUSAorCWlmIChkZXB0aCA8IEcubWlubWF4ZGVwdGhbMF0pIHsKKwkJaWYgKHNhbWVfZnMpCisJCQlyZXR1cm4gVFJVRTsgLyogc2tpcCB0aGlzLCBjb250aW51ZSByZWN1cnNpbmcgKi8KKwkJcmV0dXJuIFNLSVA7IC8qIHN0b3AgcmVjdXJzaW5nICovCisJfQorCWlmIChkZXB0aCA+IEcubWlubWF4ZGVwdGhbMV0pCisJCXJldHVybiBTS0lQOyAvKiBzdG9wIHJlY3Vyc2luZyAqLworI2VuZGlmCisKKwlyID0gZXhlY19hY3Rpb25zKEcuYWN0aW9ucywgZmlsZU5hbWUsIHN0YXRidWYpOworCS8qIEhhZCBubyBleHBsaWNpdCAtcHJpbnRbMF0gb3IgLWV4ZWM/IHRoZW4gcHJpbnQgKi8KKwlpZiAoKHIgJiBUUlVFKSAmJiBHLm5lZWRfcHJpbnQpCisJCXB1dHMoZmlsZU5hbWUpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9NQVhERVBUSAorCWlmIChTX0lTRElSKHN0YXRidWYtPnN0X21vZGUpKSB7CisJCWlmIChkZXB0aCA9PSBHLm1pbm1heGRlcHRoWzFdKQorCQkJcmV0dXJuIFNLSVA7CisJfQorI2VuZGlmCisJLyogLXhkZXYgc3RvcHMgb24gbW91bnRwb2ludHMsIGJ1dCBBRlRFUiBtb3VudHBvaXQgaXRzZWxmCisJICogaXMgcHJvY2Vzc2VkIGFzIHVzdWFsICovCisJaWYgKCFzYW1lX2ZzKSB7CisJCXJldHVybiBTS0lQOworCX0KKworCS8qIENhbm5vdCByZXR1cm4gMDogb3VyIGNhbGxlciwgcmVjdXJzaXZlX2FjdGlvbigpLAorCSAqIHdpbGwgcGVycm9yKCkgYW5kIHNraXAgZGlycyAoaWYgY2FsbGVkIG9uIGRpcikgKi8KKwlyZXR1cm4gKHIgJiBTS0lQKSA/IFNLSVAgOiBUUlVFOworfQorCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX1RZUEUKK3N0YXRpYyBpbnQgZmluZF90eXBlKGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaW50IG1hc2sgPSAwOworCisJaWYgKCp0eXBlID09ICdiJykKKwkJbWFzayA9IFNfSUZCTEs7CisJZWxzZSBpZiAoKnR5cGUgPT0gJ2MnKQorCQltYXNrID0gU19JRkNIUjsKKwllbHNlIGlmICgqdHlwZSA9PSAnZCcpCisJCW1hc2sgPSBTX0lGRElSOworCWVsc2UgaWYgKCp0eXBlID09ICdwJykKKwkJbWFzayA9IFNfSUZJRk87CisJZWxzZSBpZiAoKnR5cGUgPT0gJ2YnKQorCQltYXNrID0gU19JRlJFRzsKKwllbHNlIGlmICgqdHlwZSA9PSAnbCcpCisJCW1hc2sgPSBTX0lGTE5LOworCWVsc2UgaWYgKCp0eXBlID09ICdzJykKKwkJbWFzayA9IFNfSUZTT0NLOworCisJaWYgKG1hc2sgPT0gMCB8fCB0eXBlWzFdICE9ICdcMCcpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19pbnZhbGlkX2FyZywgdHlwZSwgIi10eXBlIik7CisKKwlyZXR1cm4gbWFzazsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9QRVJNIFwKKyB8fCBFTkFCTEVfRkVBVFVSRV9GSU5EX01USU1FIHx8IEVOQUJMRV9GRUFUVVJFX0ZJTkRfTU1JTiBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfRklORF9TSVpFICB8fCBFTkFCTEVfRkVBVFVSRV9GSU5EX0xJTktTCitzdGF0aWMgY29uc3QgY2hhciogcGx1c19taW51c19udW0oY29uc3QgY2hhciogc3RyKQoreworCWlmICgqc3RyID09ICctJyB8fCAqc3RyID09ICcrJykKKwkJc3RyKys7CisJcmV0dXJuIHN0cjsKK30KKyNlbmRpZgorCisvKiBTYXkgbm8gdG8gR0NDaXNtICovCisjZGVmaW5lIFVTRV9ORVNURURfRlVOQ1RJT04gMAorCisjaWYgIVVTRV9ORVNURURfRlVOQ1RJT04KK3N0cnVjdCBwcF9sb2NhbHMgeworCWFjdGlvbioqKiBhcHBwOworCXVuc2lnbmVkIGN1cl9ncm91cDsKKwl1bnNpZ25lZCBjdXJfYWN0aW9uOworCUlGX0ZFQVRVUkVfRklORF9OT1QoIGJvb2wgaW52ZXJ0X2ZsYWc7ICkKK307CitzdGF0aWMgYWN0aW9uKiBhbGxvY19hY3Rpb24oc3RydWN0IHBwX2xvY2FscyAqcHBsLCBpbnQgc2l6ZW9mX3N0cnVjdCwgYWN0aW9uX2ZwIGYpCit7CisJYWN0aW9uICphcCA9IHh6YWxsb2Moc2l6ZW9mX3N0cnVjdCk7CisJYWN0aW9uICoqYXBwOworCWFjdGlvbiAqKipncm91cCA9ICZwcGwtPmFwcHBbcHBsLT5jdXJfZ3JvdXBdOworCSpncm91cCA9IGFwcCA9IHhyZWFsbG9jKCpncm91cCwgKHBwbC0+Y3VyX2FjdGlvbisyKSAqIHNpemVvZihwcGwtPmFwcHBbMF1bMF0pKTsKKwlhcHBbcHBsLT5jdXJfYWN0aW9uKytdID0gYXA7CisJYXBwW3BwbC0+Y3VyX2FjdGlvbl0gPSBOVUxMOworCWFwLT5mID0gZjsKKwlJRl9GRUFUVVJFX0ZJTkRfTk9UKCBhcC0+aW52ZXJ0ID0gcHBsLT5pbnZlcnRfZmxhZzsgKQorCUlGX0ZFQVRVUkVfRklORF9OT1QoIHBwbC0+aW52ZXJ0X2ZsYWcgPSAwOyApCisJcmV0dXJuIGFwOworfQorI2VuZGlmCisKK3N0YXRpYyBhY3Rpb24qKiogcGFyc2VfcGFyYW1zKGNoYXIgKiphcmd2KQoreworCWVudW0geworCSAgICAgICAgICAgICAgICAgICAgICAgIE9QVF9GT0xMT1cgICAgICwKKwlJRl9GRUFUVVJFX0ZJTkRfWERFViggICBPUFRfWERFViAgICAgICAsKQorCUlGX0ZFQVRVUkVfRklORF9ERVBUSCggIE9QVF9ERVBUSCAgICAgICwpCisJICAgICAgICAgICAgICAgICAgICAgICAgUEFSTV9hICAgICAgICAgLAorCSAgICAgICAgICAgICAgICAgICAgICAgIFBBUk1fbyAgICAgICAgICwKKwlJRl9GRUFUVVJFX0ZJTkRfTk9UKAlQQVJNX2NoYXJfbm90ICAsKQorI2lmIEVOQUJMRV9ERVNLVE9QCisJICAgICAgICAgICAgICAgICAgICAgICAgUEFSTV9hbmQgICAgICAgLAorCSAgICAgICAgICAgICAgICAgICAgICAgIFBBUk1fb3IgICAgICAgICwKKwlJRl9GRUFUVVJFX0ZJTkRfTk9UKCAgICBQQVJNX25vdCAgICAgICAsKQorI2VuZGlmCisJICAgICAgICAgICAgICAgICAgICAgICAgUEFSTV9wcmludCAgICAgLAorCUlGX0ZFQVRVUkVfRklORF9QUklOVDAoIFBBUk1fcHJpbnQwICAgICwpCisJSUZfRkVBVFVSRV9GSU5EX1BSVU5FKCAgUEFSTV9wcnVuZSAgICAgLCkKKwlJRl9GRUFUVVJFX0ZJTkRfREVMRVRFKCBQQVJNX2RlbGV0ZSAgICAsKQorCUlGX0ZFQVRVUkVfRklORF9FWEVDKCAgIFBBUk1fZXhlYyAgICAgICwpCisJSUZfRkVBVFVSRV9GSU5EX1BBUkVOKCAgUEFSTV9jaGFyX2JyYWNlLCkKKwkvKiBBbGwgb3B0aW9ucy9hY3Rpb25zIHN0YXJ0aW5nIGZyb20gaGVyZSByZXF1aXJlIGFyZ3VtZW50ICovCisJICAgICAgICAgICAgICAgICAgICAgICAgUEFSTV9uYW1lICAgICAgLAorCSAgICAgICAgICAgICAgICAgICAgICAgIFBBUk1faW5hbWUgICAgICwKKwlJRl9GRUFUVVJFX0ZJTkRfUEFUSCggICBQQVJNX3BhdGggICAgICAsKQorI2lmIEVOQUJMRV9ERVNLVE9QCisJLyogLXdob2xlbmFtZSBpcyBhIHN5bm9ueW0gZm9yIC1wYXRoICovCisJLyogV2Ugc3VwcG9ydCBpdCBiZWNhdXNlIExpbnV4IGtlcm5lbCdzICJtYWtlIHRhZ3MiIHVzZXMgaXQgKi8KKwlJRl9GRUFUVVJFX0ZJTkRfUEFUSCggICBQQVJNX3dob2xlbmFtZSAsKQorI2VuZGlmCisJSUZfRkVBVFVSRV9GSU5EX1BBVEgoICAgUEFSTV9pcGF0aCAgICAgLCkKKwlJRl9GRUFUVVJFX0ZJTkRfUkVHRVgoICBQQVJNX3JlZ2V4ICAgICAsKQorCUlGX0ZFQVRVUkVfRklORF9UWVBFKCAgIFBBUk1fdHlwZSAgICAgICwpCisJSUZfRkVBVFVSRV9GSU5EX1BFUk0oICAgUEFSTV9wZXJtICAgICAgLCkKKwlJRl9GRUFUVVJFX0ZJTkRfTVRJTUUoICBQQVJNX210aW1lICAgICAsKQorCUlGX0ZFQVRVUkVfRklORF9NTUlOKCAgIFBBUk1fbW1pbiAgICAgICwpCisJSUZfRkVBVFVSRV9GSU5EX05FV0VSKCAgUEFSTV9uZXdlciAgICAgLCkKKwlJRl9GRUFUVVJFX0ZJTkRfSU5VTSggICBQQVJNX2ludW0gICAgICAsKQorCUlGX0ZFQVRVUkVfRklORF9VU0VSKCAgIFBBUk1fdXNlciAgICAgICwpCisJSUZfRkVBVFVSRV9GSU5EX0dST1VQKCAgUEFSTV9ncm91cCAgICAgLCkKKwlJRl9GRUFUVVJFX0ZJTkRfU0laRSggICBQQVJNX3NpemUgICAgICAsKQorCUlGX0ZFQVRVUkVfRklORF9DT05URVhUKFBBUk1fY29udGV4dCAgICwpCisJSUZfRkVBVFVSRV9GSU5EX0xJTktTKCAgUEFSTV9saW5rcyAgICAgLCkKKwlJRl9GRUFUVVJFX0ZJTkRfTUFYREVQVEgoT1BUX01JTkRFUFRILE9QVF9NQVhERVBUSCwpCisJfTsKKworCXN0YXRpYyBjb25zdCBjaGFyIHBhcmFtc1tdIEFMSUdOMSA9CisJICAgICAgICAgICAgICAgICAgICAgICAgIi1mb2xsb3dcMCIKKwlJRl9GRUFUVVJFX0ZJTkRfWERFViggICAiLXhkZXZcMCIgICAgICAgICAgICAgICAgICkKKwlJRl9GRUFUVVJFX0ZJTkRfREVQVEgoICAiLWRlcHRoXDAiICAgICAgICAgICAgICAgICkKKwkgICAgICAgICAgICAgICAgICAgICAgICAiLWFcMCIKKwkgICAgICAgICAgICAgICAgICAgICAgICAiLW9cMCIKKwlJRl9GRUFUVVJFX0ZJTkRfTk9UKCAgICAiIVwwIiAgICAgICApCisjaWYgRU5BQkxFX0RFU0tUT1AKKwkgICAgICAgICAgICAgICAgICAgICAgICAiLWFuZFwwIgorCSAgICAgICAgICAgICAgICAgICAgICAgICItb3JcMCIKKwlJRl9GRUFUVVJFX0ZJTkRfTk9UKAkiLW5vdFwwIiAgICApCisjZW5kaWYKKwkgICAgICAgICAgICAgICAgICAgICAgICAiLXByaW50XDAiCisJSUZfRkVBVFVSRV9GSU5EX1BSSU5UMCggIi1wcmludDBcMCIgKQorCUlGX0ZFQVRVUkVfRklORF9QUlVORSggICItcHJ1bmVcMCIgICkKKwlJRl9GRUFUVVJFX0ZJTkRfREVMRVRFKCAiLWRlbGV0ZVwwIiApCisJSUZfRkVBVFVSRV9GSU5EX0VYRUMoICAgIi1leGVjXDAiICAgKQorCUlGX0ZFQVRVUkVfRklORF9QQVJFTiggICIoXDAiICAgICAgICkKKwkvKiBBbGwgb3B0aW9ucy9hY3Rpb25zIHN0YXJ0aW5nIGZyb20gaGVyZSByZXF1aXJlIGFyZ3VtZW50ICovCisJICAgICAgICAgICAgICAgICAgICAgICAgIi1uYW1lXDAiCisJICAgICAgICAgICAgICAgICAgICAgICAgIi1pbmFtZVwwIgorCUlGX0ZFQVRVUkVfRklORF9QQVRIKCAgICItcGF0aFwwIiAgICkKKyNpZiBFTkFCTEVfREVTS1RPUAorCUlGX0ZFQVRVUkVfRklORF9QQVRIKCAgICItd2hvbGVuYW1lXDAiKQorI2VuZGlmCisJSUZfRkVBVFVSRV9GSU5EX1BBVEgoICAgIi1pcGF0aFwwIiAgKQorCUlGX0ZFQVRVUkVfRklORF9SRUdFWCggICItcmVnZXhcMCIgICkKKwlJRl9GRUFUVVJFX0ZJTkRfVFlQRSggICAiLXR5cGVcMCIgICApCisJSUZfRkVBVFVSRV9GSU5EX1BFUk0oICAgIi1wZXJtXDAiICAgKQorCUlGX0ZFQVRVUkVfRklORF9NVElNRSggICItbXRpbWVcMCIgICkKKwlJRl9GRUFUVVJFX0ZJTkRfTU1JTiggICAiLW1taW5cMCIgICApCisJSUZfRkVBVFVSRV9GSU5EX05FV0VSKCAgIi1uZXdlclwwIiAgKQorCUlGX0ZFQVRVUkVfRklORF9JTlVNKCAgICItaW51bVwwIiAgICkKKwlJRl9GRUFUVVJFX0ZJTkRfVVNFUiggICAiLXVzZXJcMCIgICApCisJSUZfRkVBVFVSRV9GSU5EX0dST1VQKCAgIi1ncm91cFwwIiAgKQorCUlGX0ZFQVRVUkVfRklORF9TSVpFKCAgICItc2l6ZVwwIiAgICkKKwlJRl9GRUFUVVJFX0ZJTkRfQ09OVEVYVCgiLWNvbnRleHRcMCIpCisJSUZfRkVBVFVSRV9GSU5EX0xJTktTKCAgIi1saW5rc1wwIiAgKQorCUlGX0ZFQVRVUkVfRklORF9NQVhERVBUSCgiLW1pbmRlcHRoXDAiIi1tYXhkZXB0aFwwIikKKwk7CisKKyNpZiAhVVNFX05FU1RFRF9GVU5DVElPTgorCXN0cnVjdCBwcF9sb2NhbHMgcHBsOworI2RlZmluZSBhcHBwICAgICAgICAocHBsLmFwcHAgICAgICAgKQorI2RlZmluZSBjdXJfZ3JvdXAgICAocHBsLmN1cl9ncm91cCAgKQorI2RlZmluZSBjdXJfYWN0aW9uICAocHBsLmN1cl9hY3Rpb24gKQorI2RlZmluZSBpbnZlcnRfZmxhZyAocHBsLmludmVydF9mbGFnKQorI2RlZmluZSBBTExPQ19BQ1RJT04obmFtZSkgKGFjdGlvbl8jI25hbWUqKWFsbG9jX2FjdGlvbigmcHBsLCBzaXplb2YoYWN0aW9uXyMjbmFtZSksIChhY3Rpb25fZnApIGZ1bmNfIyNuYW1lKQorI2Vsc2UKKwlhY3Rpb24qKiogYXBwcDsKKwl1bnNpZ25lZCBjdXJfZ3JvdXA7CisJdW5zaWduZWQgY3VyX2FjdGlvbjsKKwlJRl9GRUFUVVJFX0ZJTkRfTk9UKCBib29sIGludmVydF9mbGFnOyApCisKKwkvKiBUaGlzIGlzIHRoZSBvbmx5IHBsYWNlIGluIGJ1c3lib3ggd2hlcmUgd2UgdXNlIG5lc3RlZCBmdW5jdGlvbi4KKwkgKiBTbyBmYXIgbW9yZSBzdGFuZGFyZCBhbHRlcm5hdGl2ZXMgd2VyZSBiaWdnZXIuICovCisJLyogQXV0byBkZWNsIHN1cHByZXNzZXMgImZ1bmMgd2l0aG91dCBhIHByb3RvdHlwZSIgd2FybmluZzogKi8KKwlhdXRvIGFjdGlvbiogYWxsb2NfYWN0aW9uKGludCBzaXplb2Zfc3RydWN0LCBhY3Rpb25fZnAgZik7CisJYWN0aW9uKiBhbGxvY19hY3Rpb24oaW50IHNpemVvZl9zdHJ1Y3QsIGFjdGlvbl9mcCBmKQorCXsKKwkJYWN0aW9uICphcDsKKwkJYXBwcFtjdXJfZ3JvdXBdID0geHJlYWxsb2MoYXBwcFtjdXJfZ3JvdXBdLCAoY3VyX2FjdGlvbisyKSAqIHNpemVvZihhcHBwWzBdWzBdKSk7CisJCWFwcHBbY3VyX2dyb3VwXVtjdXJfYWN0aW9uKytdID0gYXAgPSB4emFsbG9jKHNpemVvZl9zdHJ1Y3QpOworCQlhcHBwW2N1cl9ncm91cF1bY3VyX2FjdGlvbl0gPSBOVUxMOworCQlhcC0+ZiA9IGY7CisJCUlGX0ZFQVRVUkVfRklORF9OT1QoIGFwLT5pbnZlcnQgPSBpbnZlcnRfZmxhZzsgKQorCQlJRl9GRUFUVVJFX0ZJTkRfTk9UKCBpbnZlcnRfZmxhZyA9IDA7ICkKKwkJcmV0dXJuIGFwOworCX0KKyNkZWZpbmUgQUxMT0NfQUNUSU9OKG5hbWUpIChhY3Rpb25fIyNuYW1lKilhbGxvY19hY3Rpb24oc2l6ZW9mKGFjdGlvbl8jI25hbWUpLCAoYWN0aW9uX2ZwKSBmdW5jXyMjbmFtZSkKKyNlbmRpZgorCisJY3VyX2dyb3VwID0gMDsKKwljdXJfYWN0aW9uID0gMDsKKwlJRl9GRUFUVVJFX0ZJTkRfTk9UKCBpbnZlcnRfZmxhZyA9IDA7ICkKKwlhcHBwID0geHphbGxvYygyICogc2l6ZW9mKGFwcHBbMF0pKTsgLyogYXBwcFswXSxbMV0gPT0gTlVMTCAqLworCisJd2hpbGUgKCphcmd2KSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbMF07CisJCWludCBwYXJtID0gaW5kZXhfaW5fc3RyaW5ncyhwYXJhbXMsIGFyZyk7CisJCWNvbnN0IGNoYXIgKmFyZzEgPSBhcmd2WzFdOworCisJCWRiZygiYXJnOiclcycgYXJnMTonJXMnIHBhcm06JWQgUEFSTV90eXBlOiVkIiwgYXJnLCBhcmcxLCBwYXJtLCBQQVJNX3R5cGUpOworCisJCWlmIChwYXJtID49IFBBUk1fbmFtZSkgeworCQkJLyogQWxsIG9wdGlvbnMvYWN0aW9ucyBzdGFydGluZyBmcm9tIC1uYW1lIHJlcXVpcmUgYXJndW1lbnQgKi8KKwkJCWlmICghYXJnMSkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcmVxdWlyZXNfYXJnLCBhcmcpOworCQkJYXJndisrOworCQl9CisKKwkJLyogV2UgY2FuIHVzZSBiaWcgc3dpdGNoKCkgaGVyZSwgYnV0IG9uIGkzODYKKwkJICogaXQgZG9lc24ndCBnaXZlIHNtYWxsZXIgY29kZS4gT3RoZXIgYXJjaGVzPyAqLworCisvKiBPcHRpb25zIGFsd2F5cyByZXR1cm4gdHJ1ZS4gVGhleSBhbHdheXMgdGFrZSBlZmZlY3QKKyAqIHJhdGhlciB0aGFuIGJlaW5nIHByb2Nlc3NlZCBvbmx5IHdoZW4gdGhlaXIgcGxhY2UgaW4gdGhlCisgKiBleHByZXNzaW9uIGlzIHJlYWNoZWQuCisgKi8KKwkJLyogT3B0aW9ucyAqLworCQlpZiAocGFybSA9PSBPUFRfRk9MTE9XKSB7CisJCQlkYmcoImZvbGxvdyBlbmFibGVkOiAlZCIsIF9fTElORV9fKTsKKwkJCUcucmVjdXJzZV9mbGFncyB8PSBBQ1RJT05fRk9MTE9XTElOS1MgfCBBQ1RJT05fREFOR0xJTkdfT0s7CisJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX1hERVYKKwkJZWxzZSBpZiAocGFybSA9PSBPUFRfWERFVikgeworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCUcueGRldl9vbiA9IDE7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfTUFYREVQVEgKKwkJZWxzZSBpZiAocGFybSA9PSBPUFRfTUlOREVQVEggfHwgcGFybSA9PSBPUFRfTUlOREVQVEggKyAxKSB7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJRy5taW5tYXhkZXB0aFtwYXJtIC0gT1BUX01JTkRFUFRIXSA9IHhhdG9pX3Bvc2l0aXZlKGFyZzEpOworCQl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX0RFUFRICisJCWVsc2UgaWYgKHBhcm0gPT0gT1BUX0RFUFRIKSB7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJRy5yZWN1cnNlX2ZsYWdzIHw9IEFDVElPTl9ERVBUSEZJUlNUOworCQl9CisjZW5kaWYKKy8qIEFjdGlvbnMgYXJlIGdyb3VwZWQgYnkgb3BlcmF0b3JzCisgKiAoIGV4cHIgKSAgICAgICAgICAgICAgRm9yY2UgcHJlY2VkZW5jZQorICogISBleHByICAgICAgICAgICAgICAgIFRydWUgaWYgZXhwciBpcyBmYWxzZQorICogLW5vdCBleHByICAgICAgICAgICAgIFNhbWUgYXMgISBleHByCisgKiBleHByMSBbLWFbbmRdXSBleHByMiAgQW5kOyBleHByMiBpcyBub3QgZXZhbHVhdGVkIGlmIGV4cHIxIGlzIGZhbHNlCisgKiBleHByMSAtb1tyXSBleHByMiAgICAgT3I7IGV4cHIyIGlzIG5vdCBldmFsdWF0ZWQgaWYgZXhwcjEgaXMgdHJ1ZQorICogZXhwcjEgLCBleHByMiAgICAgICAgIExpc3Q7IGJvdGggZXhwcjEgYW5kIGV4cHIyIGFyZSBhbHdheXMgZXZhbHVhdGVkCisgKiBXZSBpbXBsZW1lbnQ6ICgpLCAtYSwgLW8KKyAqLworCQkvKiBPcGVyYXRvcnMgKi8KKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX2EgSUZfREVTS1RPUCh8fCBwYXJtID09IFBBUk1fYW5kKSkgeworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCS8qIG5vIGZ1cnRoZXIgc3BlY2lhbCBoYW5kbGluZyByZXF1aXJlZCAqLworCQl9CisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV9vIElGX0RFU0tUT1AofHwgcGFybSA9PSBQQVJNX29yKSkgeworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCS8qIHN0YXJ0IG5ldyBPUiBncm91cCAqLworCQkJY3VyX2dyb3VwKys7CisJCQlhcHBwID0geHJlYWxsb2MoYXBwcCwgKGN1cl9ncm91cCsyKSAqIHNpemVvZihhcHBwWzBdKSk7CisJCQkvKmFwcHBbY3VyX2dyb3VwXSA9IE5VTEw7IC0gYWxyZWFkeSBOVUxMICovCisJCQlhcHBwW2N1cl9ncm91cCsxXSA9IE5VTEw7CisJCQljdXJfYWN0aW9uID0gMDsKKwkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfTk9UCisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV9jaGFyX25vdCBJRl9ERVNLVE9QKHx8IHBhcm0gPT0gUEFSTV9ub3QpKSB7CisJCQkvKiBhbHNvIGhhbmRsZXMgImZpbmQgISAhIC1uYW1lICdmb28qJyIgKi8KKwkJCWludmVydF9mbGFnIF49IDE7CisJCQlkYmcoImludmVydF9mbGFnOiVkIiwgaW52ZXJ0X2ZsYWcpOworCQl9CisjZW5kaWYKKwkJLyogQWN0aW9ucyAqLworCQllbHNlIGlmIChwYXJtID09IFBBUk1fcHJpbnQpIHsKKwkJCWRiZygiJWQiLCBfX0xJTkVfXyk7CisJCQlHLm5lZWRfcHJpbnQgPSAwOworCQkJKHZvaWQpIEFMTE9DX0FDVElPTihwcmludCk7CisJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX1BSSU5UMAorCQllbHNlIGlmIChwYXJtID09IFBBUk1fcHJpbnQwKSB7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJRy5uZWVkX3ByaW50ID0gMDsKKwkJCSh2b2lkKSBBTExPQ19BQ1RJT04ocHJpbnQwKTsKKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9QUlVORQorCQllbHNlIGlmIChwYXJtID09IFBBUk1fcHJ1bmUpIHsKKwkJCWRiZygiJWQiLCBfX0xJTkVfXyk7CisJCQkodm9pZCkgQUxMT0NfQUNUSU9OKHBydW5lKTsKKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9ERUxFVEUKKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX2RlbGV0ZSkgeworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCUcubmVlZF9wcmludCA9IDA7CisJCQlHLnJlY3Vyc2VfZmxhZ3MgfD0gQUNUSU9OX0RFUFRIRklSU1Q7CisJCQkodm9pZCkgQUxMT0NfQUNUSU9OKGRlbGV0ZSk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfRVhFQworCQllbHNlIGlmIChwYXJtID09IFBBUk1fZXhlYykgeworCQkJaW50IGk7CisJCQlhY3Rpb25fZXhlYyAqYXA7CisJCQlJRl9GRUFUVVJFX0ZJTkRfRVhFQ19QTFVTKGludCBhbGxfc3Vic3QgPSAwOykKKwkJCWRiZygiJWQiLCBfX0xJTkVfXyk7CisJCQlHLm5lZWRfcHJpbnQgPSAwOworCQkJYXAgPSBBTExPQ19BQ1RJT04oZXhlYyk7CisJCQlhcC0+ZXhlY19hcmd2ID0gKythcmd2OyAvKiBmaXJzdCBhcmcgYWZ0ZXIgLWV4ZWMgKi8KKwkJCS8qYXAtPmV4ZWNfYXJnYyA9IDA7IC0gQUxMT0NfQUNUSU9OIGRpZCBpdCAqLworCQkJd2hpbGUgKDEpIHsKKwkJCQlpZiAoISphcmd2KSAvKiBkaWQgbm90IHNlZSAnOycgb3IgJysnIHVudGlsIGVuZCAqLworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcmVxdWlyZXNfYXJnLCAiLWV4ZWMiKTsKKwkJCQkvLyBmaW5kIC1leGVjIGVjaG8gRm9vICI+e308IiAiOyIKKwkJCQkvLyBleGVjdXRlcyAiZWNobyBGb28gPkZJTEVOQU1FPCIsCisJCQkJLy8gZmluZCAtZXhlYyBlY2hvIEZvbyAiPnt9PCIgIisiCisJCQkJLy8gZXhlY3V0ZXMgImVjaG8gRm9vIEZJTEVOQU1FMSBGSUxFTkFNRTIgRklMRU5BTUUzLi4uIi4KKwkJCQlpZiAoKGFyZ3ZbMF1bMF0gPT0gJzsnIHx8IGFyZ3ZbMF1bMF0gPT0gJysnKQorCQkJCSAmJiBhcmd2WzBdWzFdID09ICdcMCcKKwkJCQkpIHsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9FWEVDX1BMVVMKKwkJCQkJaWYgKGFyZ3ZbMF1bMF0gPT0gJysnKQorCQkJCQkJYXAtPmZpbGVsaXN0ID0geHphbGxvYyhzaXplb2YoYXAtPmZpbGVsaXN0WzBdKSk7CisjIGVuZGlmCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlhcmd2Kys7CisJCQkJYXAtPmV4ZWNfYXJnYysrOworCQkJfQorCQkJaWYgKGFwLT5leGVjX2FyZ2MgPT0gMCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcmVxdWlyZXNfYXJnLCBhcmcpOworCQkJYXAtPnN1YnN0X2NvdW50ID0geG1hbGxvYyhhcC0+ZXhlY19hcmdjICogc2l6ZW9mKGludCkpOworCQkJaSA9IGFwLT5leGVjX2FyZ2M7CisJCQl3aGlsZSAoaS0tKSB7CisJCQkJYXAtPnN1YnN0X2NvdW50W2ldID0gY291bnRfc3Ryc3RyKGFwLT5leGVjX2FyZ3ZbaV0sICJ7fSIpOworCQkJCUlGX0ZFQVRVUkVfRklORF9FWEVDX1BMVVMoYWxsX3N1YnN0ICs9IGFwLT5zdWJzdF9jb3VudFtpXTspCisJCQl9CisjIGlmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfRVhFQ19QTFVTCisJCQkvKgorCQkJICogY29yZXV0aWxzIGV4cGVjdHMge30gdG8gYXBwZWFyIG9ubHkgb25jZSBpbiAiLWV4ZWMgKyIKKwkJCSAqLworCQkJaWYgKGFsbF9zdWJzdCAhPSAxICYmIGFwLT5maWxlbGlzdCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgib25seSBvbmUgJ3t9JyBhbGxvd2VkIGZvciAtZXhlYyArIik7CisjIGVuZGlmCisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfUEFSRU4KKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX2NoYXJfYnJhY2UpIHsKKwkJCWFjdGlvbl9wYXJlbiAqYXA7CisJCQljaGFyICoqZW5kYXJnOworCQkJdW5zaWduZWQgbmVzdGVkID0gMTsKKworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCWVuZGFyZyA9IGFyZ3Y7CisJCQl3aGlsZSAoMSkgeworCQkJCWlmICghKisrZW5kYXJnKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5wYWlyZWQgJygnIik7CisJCQkJaWYgKExPTkVfQ0hBUigqZW5kYXJnLCAnKCcpKQorCQkJCQluZXN0ZWQrKzsKKwkJCQllbHNlIGlmIChMT05FX0NIQVIoKmVuZGFyZywgJyknKSAmJiAhLS1uZXN0ZWQpIHsKKwkJCQkJKmVuZGFyZyA9IE5VTEw7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWFwID0gQUxMT0NfQUNUSU9OKHBhcmVuKTsKKwkJCWFwLT5zdWJleHByID0gcGFyc2VfcGFyYW1zKGFyZ3YgKyAxKTsKKwkJCSplbmRhcmcgPSAoY2hhciopICIpIjsgLyogcmVzdG9yZSBOVUxMZWQgcGFyYW1ldGVyICovCisJCQlhcmd2ID0gZW5kYXJnOworCQl9CisjZW5kaWYKKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX25hbWUgfHwgcGFybSA9PSBQQVJNX2luYW1lKSB7CisJCQlhY3Rpb25fbmFtZSAqYXA7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJYXAgPSBBTExPQ19BQ1RJT04obmFtZSk7CisJCQlhcC0+cGF0dGVybiA9IGFyZzE7CisJCQlhcC0+aW5hbWUgPSAocGFybSA9PSBQQVJNX2luYW1lKTsKKwkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfUEFUSAorCQllbHNlIGlmIChwYXJtID09IFBBUk1fcGF0aCBJRl9ERVNLVE9QKHx8IHBhcm0gPT0gUEFSTV93aG9sZW5hbWUpIHx8IHBhcm0gPT0gUEFSTV9pcGF0aCkgeworCQkJYWN0aW9uX3BhdGggKmFwOworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCWFwID0gQUxMT0NfQUNUSU9OKHBhdGgpOworCQkJYXAtPnBhdHRlcm4gPSBhcmcxOworCQkJYXAtPmlwYXRoID0gKHBhcm0gPT0gUEFSTV9pcGF0aCk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfUkVHRVgKKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX3JlZ2V4KSB7CisJCQlhY3Rpb25fcmVnZXggKmFwOworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCWFwID0gQUxMT0NfQUNUSU9OKHJlZ2V4KTsKKwkJCXhyZWdjb21wKCZhcC0+Y29tcGlsZWRfcGF0dGVybiwgYXJnMSwgMCAvKmNmbGFncyovKTsKKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9UWVBFCisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV90eXBlKSB7CisJCQlhY3Rpb25fdHlwZSAqYXA7CisJCQlhcCA9IEFMTE9DX0FDVElPTih0eXBlKTsKKwkJCWFwLT50eXBlX21hc2sgPSBmaW5kX3R5cGUoYXJnMSk7CisJCQlkYmcoImNyZWF0ZWQ6dHlwZSBtYXNrOiV4IiwgYXAtPnR5cGVfbWFzayk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfUEVSTQorLyogLXBlcm0gQklUUyAgIEZpbGUncyBtb2RlIGJpdHMgYXJlIGV4YWN0bHkgQklUUyAob2N0YWwgb3Igc3ltYm9saWMpLgorICogICAgICAgICAgICAgIFN5bWJvbGljIG1vZGVzIHVzZSBtb2RlIDAgYXMgYSBwb2ludCBvZiBkZXBhcnR1cmUuCisgKiAtcGVybSAtQklUUyAgQWxsIG9mIHRoZSBCSVRTIGFyZSBzZXQgaW4gZmlsZSdzIG1vZGUuCisgKiAtcGVybSBbKy9dQklUUyAgQXQgbGVhc3Qgb25lIG9mIHRoZSBCSVRTIGlzIHNldCBpbiBmaWxlJ3MgbW9kZS4KKyAqLworCQllbHNlIGlmIChwYXJtID09IFBBUk1fcGVybSkgeworCQkJYWN0aW9uX3Blcm0gKmFwOworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCWFwID0gQUxMT0NfQUNUSU9OKHBlcm0pOworCQkJYXAtPnBlcm1fY2hhciA9IGFyZzFbMF07CisJCQlhcmcxID0gKGFyZzFbMF0gPT0gJy8nID8gYXJnMSsxIDogcGx1c19taW51c19udW0oYXJnMSkpOworCQkJLyphcC0+cGVybV9tYXNrID0gMDsgLSBBTExPQ19BQ1RJT04gZGlkIGl0ICovCisJCQlhcC0+cGVybV9tYXNrID0gYmJfcGFyc2VfbW9kZShhcmcxLCBhcC0+cGVybV9tYXNrKTsKKwkJCWlmIChhcC0+cGVybV9tYXNrID09IChtb2RlX3QpLTEpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgbW9kZSAnJXMnIiwgYXJnMSk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfTVRJTUUKKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX210aW1lKSB7CisJCQlhY3Rpb25fbXRpbWUgKmFwOworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCWFwID0gQUxMT0NfQUNUSU9OKG10aW1lKTsKKwkJCWFwLT5tdGltZV9jaGFyID0gYXJnMVswXTsKKwkJCWFwLT5tdGltZV9kYXlzID0geGF0b3VsKHBsdXNfbWludXNfbnVtKGFyZzEpKTsKKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9NTUlOCisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV9tbWluKSB7CisJCQlhY3Rpb25fbW1pbiAqYXA7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJYXAgPSBBTExPQ19BQ1RJT04obW1pbik7CisJCQlhcC0+bW1pbl9jaGFyID0gYXJnMVswXTsKKwkJCWFwLT5tbWluX21pbnMgPSB4YXRvdWwocGx1c19taW51c19udW0oYXJnMSkpOworCQl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX05FV0VSCisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV9uZXdlcikgeworCQkJc3RydWN0IHN0YXQgc3RhdF9uZXdlcjsKKwkJCWFjdGlvbl9uZXdlciAqYXA7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJYXAgPSBBTExPQ19BQ1RJT04obmV3ZXIpOworCQkJeHN0YXQoYXJnMSwgJnN0YXRfbmV3ZXIpOworCQkJYXAtPm5ld2VyX210aW1lID0gc3RhdF9uZXdlci5zdF9tdGltZTsKKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9JTlVNCisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV9pbnVtKSB7CisJCQlhY3Rpb25faW51bSAqYXA7CisJCQlkYmcoIiVkIiwgX19MSU5FX18pOworCQkJYXAgPSBBTExPQ19BQ1RJT04oaW51bSk7CisJCQlhcC0+aW5vZGVfbnVtID0geGF0b3VsKGFyZzEpOworCQl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX1VTRVIKKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX3VzZXIpIHsKKwkJCWFjdGlvbl91c2VyICphcDsKKwkJCWRiZygiJWQiLCBfX0xJTkVfXyk7CisJCQlhcCA9IEFMTE9DX0FDVElPTih1c2VyKTsKKwkJCWFwLT51aWQgPSBiYl9zdHJ0b3UoYXJnMSwgTlVMTCwgMTApOworCQkJaWYgKGVycm5vKQorCQkJCWFwLT51aWQgPSB4dW5hbWUydWlkKGFyZzEpOworCQl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9GSU5EX0dST1VQCisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV9ncm91cCkgeworCQkJYWN0aW9uX2dyb3VwICphcDsKKwkJCWRiZygiJWQiLCBfX0xJTkVfXyk7CisJCQlhcCA9IEFMTE9DX0FDVElPTihncm91cCk7CisJCQlhcC0+Z2lkID0gYmJfc3RydG91KGFyZzEsIE5VTEwsIDEwKTsKKwkJCWlmIChlcnJubykKKwkJCQlhcC0+Z2lkID0geGdyb3VwMmdpZChhcmcxKTsKKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfRklORF9TSVpFCisJCWVsc2UgaWYgKHBhcm0gPT0gUEFSTV9zaXplKSB7CisvKiAtc2l6ZSBuW2Jja3ddOiBmaWxlIHVzZXMgbiB1bml0cyBvZiBzcGFjZQorICogYiAoZGVmYXVsdCk6IHVuaXRzIGFyZSA1MTItYnl0ZSBibG9ja3MKKyAqIGM6IDEgYnl0ZQorICogazoga2lsb2J5dGVzCisgKiB3OiAyLWJ5dGUgd29yZHMKKyAqLworI2lmIEVOQUJMRV9MRlMKKyNkZWZpbmUgWEFUT1VfU0ZYIHhhdG91bGxfc2Z4CisjZWxzZQorI2RlZmluZSBYQVRPVV9TRlggeGF0b3VsX3NmeAorI2VuZGlmCisJCQlzdGF0aWMgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0IGZpbmRfc3VmZml4ZXNbXSA9IHsKKwkJCQl7ICJjIiwgMSB9LAorCQkJCXsgInciLCAyIH0sCisJCQkJeyAiIiwgNTEyIH0sCisJCQkJeyAiYiIsIDUxMiB9LAorCQkJCXsgImsiLCAxMDI0IH0sCisJCQkJeyAiIiwgMCB9CisJCQl9OworCQkJYWN0aW9uX3NpemUgKmFwOworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCWFwID0gQUxMT0NfQUNUSU9OKHNpemUpOworCQkJYXAtPnNpemVfY2hhciA9IGFyZzFbMF07CisJCQlhcC0+c2l6ZSA9IFhBVE9VX1NGWChwbHVzX21pbnVzX251bShhcmcxKSwgZmluZF9zdWZmaXhlcyk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfQ09OVEVYVAorCQllbHNlIGlmIChwYXJtID09IFBBUk1fY29udGV4dCkgeworCQkJYWN0aW9uX2NvbnRleHQgKmFwOworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCWFwID0gQUxMT0NfQUNUSU9OKGNvbnRleHQpOworCQkJLyphcC0+Y29udGV4dCA9IE5VTEw7IC0gQUxMT0NfQUNUSU9OIGRpZCBpdCAqLworCQkJLyogU0VMaW51eCBoZWFkZXJzIGVycm9uZW91c2x5IGRlY2xhcmUgbm9uLWNvbnN0IHBhcmFtZXRlciAqLworCQkJaWYgKHNlbGludXhfcmF3X3RvX3RyYW5zX2NvbnRleHQoKGNoYXIqKWFyZzEsICZhcC0+Y29udGV4dCkpCisJCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coYXJnMSk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfTElOS1MKKwkJZWxzZSBpZiAocGFybSA9PSBQQVJNX2xpbmtzKSB7CisJCQlhY3Rpb25fbGlua3MgKmFwOworCQkJZGJnKCIlZCIsIF9fTElORV9fKTsKKwkJCWFwID0gQUxMT0NfQUNUSU9OKGxpbmtzKTsKKwkJCWFwLT5saW5rc19jaGFyID0gYXJnMVswXTsKKwkJCWFwLT5saW5rc19jb3VudCA9IHhhdG91bChwbHVzX21pbnVzX251bShhcmcxKSk7CisJCX0KKyNlbmRpZgorCQllbHNlIHsKKwkJCWJiX2Vycm9yX21zZygidW5yZWNvZ25pemVkOiAlcyIsIGFyZyk7CisJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKwkJYXJndisrOworCX0KKwlkYmcoImV4aXRpbmcgJXMiLCBfX2Z1bmNfXyk7CisJcmV0dXJuIGFwcHA7CisjdW5kZWYgQUxMT0NfQUNUSU9OCisjdW5kZWYgYXBwcAorI3VuZGVmIGN1cl9hY3Rpb24KKyN1bmRlZiBpbnZlcnRfZmxhZworfQorCitpbnQgZmluZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZmluZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGksIGZpcnN0b3B0LCBzdGF0dXMgPSBFWElUX1NVQ0NFU1M7CisJY2hhciAqKnBhc3RfSExQLCAqc2F2ZWQ7CisKKwlJTklUX0coKTsKKworCS8qICJmaW5kIC10eXBlIGYiICsgZ2V0b3B0KCIrSExQIikgPT4gZGlzYXN0ZXIuCisJICogTmVlZCB0byBhdm9pZCBnZXRvcHQgcnVubmluZyBpbnRvIGEgbm9uLUhMUCBvcHRpb24uCisJICogRG8gdGhpcyBieSB0ZW1wb3JhcmlseSBzdG9yaW5nIE5VTEwgdGhlcmU6CisJICovCisJcGFzdF9ITFAgPSBhcmd2OworCWZvciAoOzspIHsKKwkJc2F2ZWQgPSAqKytwYXN0X0hMUDsKKwkJaWYgKCFzYXZlZCkKKwkJCWJyZWFrOworCQlpZiAoc2F2ZWRbMF0gIT0gJy0nKQorCQkJYnJlYWs7CisJCWlmICghc2F2ZWRbMV0pCisJCQlicmVhazsgLyogaXQgaXMgIi0iICovCisJCWlmICgoc2F2ZWQrMSlbc3Ryc3BuKHNhdmVkKzEsICJITFAiKV0gIT0gJ1wwJykKKwkJCWJyZWFrOworCX0KKwkqcGFzdF9ITFAgPSBOVUxMOworCS8qICIrIjogc3RvcCBvbiBmaXJzdCBub24tb3B0aW9uICovCisJaSA9IGdldG9wdDMyKGFyZ3YsICIrSExQIik7CisJaWYgKGkgJiAoMTw8MCkpCisJCUcucmVjdXJzZV9mbGFncyB8PSBBQ1RJT05fRk9MTE9XTElOS1NfTDAgfCBBQ1RJT05fREFOR0xJTkdfT0s7CisJaWYgKGkgJiAoMTw8MSkpCisJCUcucmVjdXJzZV9mbGFncyB8PSBBQ1RJT05fRk9MTE9XTElOS1MgfCBBQ1RJT05fREFOR0xJTkdfT0s7CisJLyogLVAgaXMgZGVmYXVsdCBhbmQgaXMgaWdub3JlZCAqLworCWFyZ3YgPSBwYXN0X0hMUDsgLyogc2FtZSByZXN1bHQgYXMgImFyZ3YgKz0gb3B0aW5kOyIgKi8KKwkqcGFzdF9ITFAgPSBzYXZlZDsKKworCWZvciAoZmlyc3RvcHQgPSAwOyBhcmd2W2ZpcnN0b3B0XTsgZmlyc3RvcHQrKykgeworCQlpZiAoYXJndltmaXJzdG9wdF1bMF0gPT0gJy0nKQorCQkJYnJlYWs7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9GSU5EX05PVCAmJiBMT05FX0NIQVIoYXJndltmaXJzdG9wdF0sICchJykpCisJCQlicmVhazsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0ZJTkRfUEFSRU4gJiYgTE9ORV9DSEFSKGFyZ3ZbZmlyc3RvcHRdLCAnKCcpKQorCQkJYnJlYWs7CisJfQorCWlmIChmaXJzdG9wdCA9PSAwKSB7CisJCSotLWFyZ3YgPSAoY2hhciopIi4iOworCQlmaXJzdG9wdCsrOworCX0KKworCUcuYWN0aW9ucyA9IHBhcnNlX3BhcmFtcygmYXJndltmaXJzdG9wdF0pOworCWFyZ3ZbZmlyc3RvcHRdID0gTlVMTDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZJTkRfWERFVgorCWlmIChHLnhkZXZfb24pIHsKKwkJc3RydWN0IHN0YXQgc3RidWY7CisKKwkJRy54ZGV2X2NvdW50ID0gZmlyc3RvcHQ7CisJCUcueGRldl9kZXYgPSB4emFsbG9jKEcueGRldl9jb3VudCAqIHNpemVvZihHLnhkZXZfZGV2WzBdKSk7CisJCWZvciAoaSA9IDA7IGFyZ3ZbaV07IGkrKykgeworCQkJLyogbm90IHhzdGF0KCk6IHNob3VsZG4ndCBib21iIG91dCBvbgorCQkJICogImZpbmQgbm90X2V4aXN0IGV4aXN0IC14ZGV2IiAqLworCQkJaWYgKHN0YXQoYXJndltpXSwgJnN0YnVmKSA9PSAwKQorCQkJCUcueGRldl9kZXZbaV0gPSBzdGJ1Zi5zdF9kZXY7CisJCQkvKiBlbHNlIEcueGRldl9kZXZbaV0gc3RheXMgMCBhbmQKKwkJCSAqIHdvbid0IG1hdGNoIGFueSByZWFsIGRldmljZSBkZXZfdAorCQkJICovCisJCX0KKwl9CisjZW5kaWYKKworCWZvciAoaSA9IDA7IGFyZ3ZbaV07IGkrKykgeworCQlpZiAoIXJlY3Vyc2l2ZV9hY3Rpb24oYXJndltpXSwKKwkJCQlHLnJlY3Vyc2VfZmxhZ3MsLyogZmxhZ3MgKi8KKwkJCQlmaWxlQWN0aW9uLCAgICAgLyogZmlsZSBhY3Rpb24gKi8KKwkJCQlmaWxlQWN0aW9uLCAgICAgLyogZGlyIGFjdGlvbiAqLworCQkJCU5VTEwsICAgICAgICAgICAvKiB1c2VyIGRhdGEgKi8KKwkJCQkwKSAgICAgICAgICAgICAgLyogZGVwdGggKi8KKwkJKSB7CisJCQlzdGF0dXMgfD0gRVhJVF9GQUlMVVJFOworCQl9CisJfQorCisJSUZfRkVBVFVSRV9GSU5EX0VYRUNfUExVUyhzdGF0dXMgfD0gZmx1c2hfZXhlY19wbHVzKCk7KQorCXJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9maW5kdXRpbHMvZ3JlcC5jIGIvZmluZHV0aWxzL2dyZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTYyMTM4Ci0tLSAvZGV2L251bGwKKysrIGIvZmluZHV0aWxzL2dyZXAuYwpAQCAtMCwwICsxLDg0NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBncmVwIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94IHVzaW5nIGxpYmMgcmVnZXguCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSBieSBMaW5lbywgaW5jLiBhbmQgTWFyayBXaGl0bGV5CisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCwyMDAxIGJ5IE1hcmsgV2hpdGxleSA8bWFya3dAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKy8qIEJCX0FVRElUIFNVU3YzIGRlZmVjdHMgLSB1bnN1cHBvcnRlZCBvcHRpb24gLXggIm1hdGNoIHdob2xlIGxpbmUgb25seSIuICovCisvKiBCQl9BVURJVCBHTlUgZGVmZWN0cyAtIGFsd2F5cyBhY3RzIGFzIC1hLiAgKi8KKy8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMvZ3JlcC5odG1sICovCisvKgorICogMjAwNCwyMDA2IChDKSBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+IC0KKyAqIGNvcnJlY3Rpb24gIi1lIHBhdHRlcm4xIC1lIHBhdHRlcm4yIiBsb2dpYyBhbmQgbW9yZSBvcHRpbWl6YXRpb25zLgorICogcHJlY29tcGlsZWQgcmVnZXgKKyAqCisgKiAoQykgMjAwNiBKYWMgR291ZHNtaXQgYWRkZWQgLW8gb3B0aW9uCisgKi8KKworLy9hcHBsZXQ6SUZfR1JFUChBUFBMRVQoZ3JlcCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8vYXBwbGV0OklGX0ZFQVRVUkVfR1JFUF9FR1JFUF9BTElBUyhBUFBMRVRfT0RETkFNRShlZ3JlcCwgZ3JlcCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBlZ3JlcCkpCisvL2FwcGxldDpJRl9GRUFUVVJFX0dSRVBfRkdSRVBfQUxJQVMoQVBQTEVUX09ERE5BTUUoZmdyZXAsIGdyZXAsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgZmdyZXApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfR1JFUCkgKz0gZ3JlcC5vCisKKy8vY29uZmlnOmNvbmZpZyBHUkVQCisvL2NvbmZpZzoJYm9vbCAiZ3JlcCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBncmVwIGlzIHVzZWQgdG8gc2VhcmNoIGZpbGVzIGZvciBhIHNwZWNpZmllZCBwYXR0ZXJuLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9HUkVQX0VHUkVQX0FMSUFTCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIGV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbnMgKGVncmVwICYgZ3JlcCAtRSkiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBHUkVQCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlZCBzdXBwb3J0IGZvciBleHRlbmRlZCByZWd1bGFyIGV4cHJlc3Npb25zLiBFeHRlbmRlZAorLy9jb25maWc6CSAgcmVndWxhciBleHByZXNzaW9ucyBhbGxvdyBmb3IgYWx0ZXJuYXRpb24gKGZvb3xiYXIpLCBncm91cGluZywKKy8vY29uZmlnOgkgIGFuZCB2YXJpb3VzIHJlcGV0aXRpb24gb3BlcmF0b3JzLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9HUkVQX0ZHUkVQX0FMSUFTCisvL2NvbmZpZzoJYm9vbCAiQWxpYXMgZmdyZXAgdG8gZ3JlcCAtRiIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEdSRVAKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBmZ3JlcCBzZWVzIHRoZSBzZWFyY2ggcGF0dGVybiBhcyBhIG5vcm1hbCBzdHJpbmcgcmF0aGVyIHRoYW4KKy8vY29uZmlnOgkgIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCisvL2NvbmZpZzoJICBncmVwIC1GIGFsd2F5cyB3b3JrcywgdGhpcyBqdXN0IGNyZWF0ZXMgdGhlIGZncmVwIGFsaWFzLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9HUkVQX0NPTlRFWFQKKy8vY29uZmlnOglib29sICJFbmFibGUgYmVmb3JlIGFuZCBhZnRlciBjb250ZXh0IGZsYWdzICgtQSwgLUIgYW5kIC1DKSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEdSRVAKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBQcmludCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBsZWFkaW5nICgtQikgYW5kL29yIHRyYWlsaW5nICgtQSkKKy8vY29uZmlnOgkgIGNvbnRleHQgc3Vycm91bmRpbmcgb3VyIG1hdGNoaW5nIGxpbmVzLgorLy9jb25maWc6CSAgUHJpbnQgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY29udGV4dCBsaW5lcyAoLUMpLgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ4cmVnZXguaCIKKworCisvKiBvcHRpb25zICovCisvL3VzYWdlOiNkZWZpbmUgZ3JlcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1IaG5sTG9xdnNyaXciCisvL3VzYWdlOiAgICAgICAiRiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfR1JFUF9FR1JFUF9BTElBUygiRSIpCisvL3VzYWdlOglJRl9FWFRSQV9DT01QQVQoInoiKQorLy91c2FnZTogICAgICAgIl0gWy1tIE5dICIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfR1JFUF9DT05URVhUKCJbLUEvQi9DIE5dICIpCisvL3VzYWdlOiAgICAgICAiUEFUVEVSTi8tZSBQQVRURVJOLi4uLy1mIEZJTEUgW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIGdyZXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZWFyY2ggZm9yIFBBVFRFUk4gaW4gRklMRXMgKG9yIHN0ZGluKVxuIgorLy91c2FnZTogICAgICJcbgktSAlBZGQgJ2ZpbGVuYW1lOicgcHJlZml4IgorLy91c2FnZTogICAgICJcbgktaAlEbyBub3QgYWRkICdmaWxlbmFtZTonIHByZWZpeCIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JQWRkICdsaW5lX25vOicgcHJlZml4IgorLy91c2FnZTogICAgICJcbgktbAlTaG93IG9ubHkgbmFtZXMgb2YgZmlsZXMgdGhhdCBtYXRjaCIKKy8vdXNhZ2U6ICAgICAiXG4JLUwJU2hvdyBvbmx5IG5hbWVzIG9mIGZpbGVzIHRoYXQgZG9uJ3QgbWF0Y2giCisvL3VzYWdlOiAgICAgIlxuCS1jCVNob3cgb25seSBjb3VudCBvZiBtYXRjaGluZyBsaW5lcyIKKy8vdXNhZ2U6ICAgICAiXG4JLW8JU2hvdyBvbmx5IHRoZSBtYXRjaGluZyBwYXJ0IG9mIGxpbmUiCisvL3VzYWdlOiAgICAgIlxuCS1xCVF1aWV0LiBSZXR1cm4gMCBpZiBQQVRURVJOIGlzIGZvdW5kLCAxIG90aGVyd2lzZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJU2VsZWN0IG5vbi1tYXRjaGluZyBsaW5lcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJU3VwcHJlc3Mgb3BlbiBhbmQgcmVhZCBlcnJvcnMiCisvL3VzYWdlOiAgICAgIlxuCS1yCVJlY3Vyc2UiCisvL3VzYWdlOiAgICAgIlxuCS1pCUlnbm9yZSBjYXNlIgorLy91c2FnZTogICAgICJcbgktdwlNYXRjaCB3aG9sZSB3b3JkcyBvbmx5IgorLy91c2FnZTogICAgICJcbgkteAlNYXRjaCB3aG9sZSBsaW5lcyBvbmx5IgorLy91c2FnZTogICAgICJcbgktRglQQVRURVJOIGlzIGEgbGl0ZXJhbCAobm90IHJlZ2V4cCkiCisvL3VzYWdlOglJRl9GRUFUVVJFX0dSRVBfRUdSRVBfQUxJQVMoCisvL3VzYWdlOiAgICAgIlxuCS1FCVBBVFRFUk4gaXMgYW4gZXh0ZW5kZWQgcmVnZXhwIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRVhUUkFfQ09NUEFUKAorLy91c2FnZTogICAgICJcbgkteglJbnB1dCBpcyBOVUwgdGVybWluYXRlZCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLW0gTglNYXRjaCB1cCB0byBOIHRpbWVzIHBlciBmaWxlIgorLy91c2FnZToJSUZfRkVBVFVSRV9HUkVQX0NPTlRFWFQoCisvL3VzYWdlOiAgICAgIlxuCS1BIE4JUHJpbnQgTiBsaW5lcyBvZiB0cmFpbGluZyBjb250ZXh0IgorLy91c2FnZTogICAgICJcbgktQiBOCVByaW50IE4gbGluZXMgb2YgbGVhZGluZyBjb250ZXh0IgorLy91c2FnZTogICAgICJcbgktQyBOCVNhbWUgYXMgJy1BIE4gLUIgTiciCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1lIFBUUk4JUGF0dGVybiB0byBtYXRjaCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYgRklMRQlSZWFkIHBhdHRlcm4gZnJvbSBmaWxlIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBncmVwX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGdyZXAgcm9vdCAvZXRjL3Bhc3N3ZFxuIgorLy91c2FnZTogICAgICAgInJvb3Q6eDowOjA6cm9vdDovcm9vdDovYmluL2Jhc2hcbiIKKy8vdXNhZ2U6ICAgICAgICIkIGdyZXAgXltyUl1vby4gL2V0Yy9wYXNzd2RcbiIKKy8vdXNhZ2U6ICAgICAgICJyb290Ong6MDowOnJvb3Q6L3Jvb3Q6L2Jpbi9iYXNoXG4iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGVncmVwX3RyaXZpYWxfdXNhZ2UgTk9VU0FHRV9TVFIKKy8vdXNhZ2U6I2RlZmluZSBlZ3JlcF9mdWxsX3VzYWdlICIiCisvL3VzYWdlOiNkZWZpbmUgZmdyZXBfdHJpdmlhbF91c2FnZSBOT1VTQUdFX1NUUgorLy91c2FnZTojZGVmaW5lIGZncmVwX2Z1bGxfdXNhZ2UgIiIKKworI2RlZmluZSBPUFRTVFJfR1JFUCBcCisJImxucXZzY0ZpSGhlOmY6TG9ybTp3eCIgXAorCUlGX0ZFQVRVUkVfR1JFUF9DT05URVhUKCJBOkI6QzoiKSBcCisJSUZfRkVBVFVSRV9HUkVQX0VHUkVQX0FMSUFTKCJFIikgXAorCUlGX0VYVFJBX0NPTVBBVCgieiIpIFwKKwkiYUkiCisvKiBpZ25vcmVkOiAtYSAiYXNzdW1lIGFsbCBmaWxlcyB0byBiZSB0ZXh0IiAqLworLyogaWdub3JlZDogLUkgImFzc3VtZSBiaW5hcnkgZmlsZXMgaGF2ZSBubyBtYXRjaGVzIiAqLworZW51bSB7CisJT1BUQklUX2wsIC8qIGxpc3QgbWF0Y2hlZCBmaWxlIG5hbWVzIG9ubHkgKi8KKwlPUFRCSVRfbiwgLyogcHJpbnQgbGluZSMgKi8KKwlPUFRCSVRfcSwgLyogcXVpZXQgLSBleGl0KEVYSVRfU1VDQ0VTUykgb2YgZmlyc3QgbWF0Y2ggKi8KKwlPUFRCSVRfdiwgLyogaW52ZXJ0IHRoZSBtYXRjaCwgdG8gc2VsZWN0IG5vbi1tYXRjaGluZyBsaW5lcyAqLworCU9QVEJJVF9zLCAvKiBzdXBwcmVzcyBlcnJvcnMgYWJvdXQgZmlsZSBvcGVuIGVycm9ycyAqLworCU9QVEJJVF9jLCAvKiBjb3VudCBtYXRjaGVzIHBlciBmaWxlIChzdXBwcmVzc2VzIG5vcm1hbCBvdXRwdXQpICovCisJT1BUQklUX0YsIC8qIGxpdGVyYWwgbWF0Y2ggKi8KKwlPUFRCSVRfaSwgLyogY2FzZS1pbnNlbnNpdGl2ZSAqLworCU9QVEJJVF9ILCAvKiBmb3JjZSBmaWxlbmFtZSBkaXNwbGF5ICovCisJT1BUQklUX2gsIC8qIGluaGliaXQgZmlsZW5hbWUgZGlzcGxheSAqLworCU9QVEJJVF9lLCAvKiAtZSBQQVRURVJOICovCisJT1BUQklUX2YsIC8qIC1mIEZJTEVfV0lUSF9QQVRURVJOUyAqLworCU9QVEJJVF9MLCAvKiBsaXN0IHVubWF0Y2hlZCBmaWxlIG5hbWVzIG9ubHkgKi8KKwlPUFRCSVRfbywgLyogc2hvdyBvbmx5IG1hdGNoaW5nIHBhcnRzIG9mIGxpbmVzICovCisJT1BUQklUX3IsIC8qIHJlY3Vyc2UgZGlycyAqLworCU9QVEJJVF9tLCAvKiAtbSBNQVhfTUFUQ0hFUyAqLworCU9QVEJJVF93LCAvKiAtdyB3aG9sZSB3b3JkIG1hdGNoICovCisJT1BUQklUX3gsIC8qIC14IHdob2xlIGxpbmUgbWF0Y2ggKi8KKwlJRl9GRUFUVVJFX0dSRVBfQ09OVEVYVCggICAgT1BUQklUX0EgLCkgLyogLUEgTlVNOiBhZnRlci1tYXRjaCBjb250ZXh0ICovCisJSUZfRkVBVFVSRV9HUkVQX0NPTlRFWFQoICAgIE9QVEJJVF9CICwpIC8qIC1CIE5VTTogYmVmb3JlLW1hdGNoIGNvbnRleHQgKi8KKwlJRl9GRUFUVVJFX0dSRVBfQ09OVEVYVCggICAgT1BUQklUX0MgLCkgLyogLUMgTlVNOiAtQSBhbmQgLUIgY29tYmluZWQgKi8KKwlJRl9GRUFUVVJFX0dSRVBfRUdSRVBfQUxJQVMoT1BUQklUX0UgLCkgLyogZXh0ZW5kZWQgcmVnZXhwICovCisJSUZfRVhUUkFfQ09NUEFUKCAgICAgICAgICAgIE9QVEJJVF96ICwpIC8qIGlucHV0IGlzIE5VTCB0ZXJtaW5hdGVkICovCisJT1BUX2wgPSAxIDw8IE9QVEJJVF9sLAorCU9QVF9uID0gMSA8PCBPUFRCSVRfbiwKKwlPUFRfcSA9IDEgPDwgT1BUQklUX3EsCisJT1BUX3YgPSAxIDw8IE9QVEJJVF92LAorCU9QVF9zID0gMSA8PCBPUFRCSVRfcywKKwlPUFRfYyA9IDEgPDwgT1BUQklUX2MsCisJT1BUX0YgPSAxIDw8IE9QVEJJVF9GLAorCU9QVF9pID0gMSA8PCBPUFRCSVRfaSwKKwlPUFRfSCA9IDEgPDwgT1BUQklUX0gsCisJT1BUX2ggPSAxIDw8IE9QVEJJVF9oLAorCU9QVF9lID0gMSA8PCBPUFRCSVRfZSwKKwlPUFRfZiA9IDEgPDwgT1BUQklUX2YsCisJT1BUX0wgPSAxIDw8IE9QVEJJVF9MLAorCU9QVF9vID0gMSA8PCBPUFRCSVRfbywKKwlPUFRfciA9IDEgPDwgT1BUQklUX3IsCisJT1BUX20gPSAxIDw8IE9QVEJJVF9tLAorCU9QVF93ID0gMSA8PCBPUFRCSVRfdywKKwlPUFRfeCA9IDEgPDwgT1BUQklUX3gsCisJT1BUX0EgPSBJRl9GRUFUVVJFX0dSRVBfQ09OVEVYVCggICAgKDEgPDwgT1BUQklUX0EpKSArIDAsCisJT1BUX0IgPSBJRl9GRUFUVVJFX0dSRVBfQ09OVEVYVCggICAgKDEgPDwgT1BUQklUX0IpKSArIDAsCisJT1BUX0MgPSBJRl9GRUFUVVJFX0dSRVBfQ09OVEVYVCggICAgKDEgPDwgT1BUQklUX0MpKSArIDAsCisJT1BUX0UgPSBJRl9GRUFUVVJFX0dSRVBfRUdSRVBfQUxJQVMoKDEgPDwgT1BUQklUX0UpKSArIDAsCisJT1BUX3ogPSBJRl9FWFRSQV9DT01QQVQoICAgICAgICAgICAgKDEgPDwgT1BUQklUX3opKSArIDAsCit9OworCisjZGVmaW5lIFBSSU5UX0ZJTEVTX1dJVEhfTUFUQ0hFUyAgICAob3B0aW9uX21hc2szMiAmIE9QVF9sKQorI2RlZmluZSBQUklOVF9MSU5FX05VTSAgICAgICAgICAgICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfbikKKyNkZWZpbmUgQkVfUVVJRVQgICAgICAgICAgICAgICAgICAgIChvcHRpb25fbWFzazMyICYgT1BUX3EpCisjZGVmaW5lIFNVUFBSRVNTX0VSUl9NU0dTICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9zKQorI2RlZmluZSBQUklOVF9NQVRDSF9DT1VOVFMgICAgICAgICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfYykKKyNkZWZpbmUgRkdSRVBfRkxBRyAgICAgICAgICAgICAgICAgIChvcHRpb25fbWFzazMyICYgT1BUX0YpCisjZGVmaW5lIFBSSU5UX0ZJTEVTX1dJVEhPVVRfTUFUQ0hFUyAob3B0aW9uX21hc2szMiAmIE9QVF9MKQorI2RlZmluZSBOVUxfREVMSU1JVEVEICAgICAgICAgICAgICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfeikKKworc3RydWN0IGdsb2JhbHMgeworCWludCBtYXhfbWF0Y2hlczsKKyNpZiAhRU5BQkxFX0VYVFJBX0NPTVBBVAorCWludCByZWZsYWdzOworI2Vsc2UKKwlSRV9UUkFOU0xBVEVfVFlQRSBjYXNlX2ZvbGQ7IC8qIFJFX1RSQU5TTEFURV9UWVBFIGlzIFtbdW5dc2lnbmVkXSBjaGFyKiAqLworI2VuZGlmCisJc21hbGx1aW50IGludmVydF9zZWFyY2g7CisJc21hbGx1aW50IHByaW50X2ZpbGVuYW1lOworCXNtYWxsdWludCBvcGVuX2Vycm9yczsKKyNpZiBFTkFCTEVfRkVBVFVSRV9HUkVQX0NPTlRFWFQKKwlzbWFsbHVpbnQgZGlkX3ByaW50X2xpbmU7CisJaW50IGxpbmVzX2JlZm9yZTsKKwlpbnQgbGluZXNfYWZ0ZXI7CisJY2hhciAqKmJlZm9yZV9idWY7CisJSUZfRVhUUkFfQ09NUEFUKHNpemVfdCAqYmVmb3JlX2J1Zl9zaXplOykKKwlpbnQgbGFzdF9saW5lX3ByaW50ZWQ7CisjZW5kaWYKKwkvKiBnbG9iYWxzIHVzZWQgaW50ZXJuYWxseSAqLworCWxsaXN0X3QgKnBhdHRlcm5faGVhZDsgICAvKiBncm93YWJsZSBsaXN0IG9mIHBhdHRlcm5zIHRvIG1hdGNoICovCisJY29uc3QgY2hhciAqY3VyX2ZpbGU7ICAgIC8qIHRoZSBjdXJyZW50IGZpbGUgd2UgYXJlIHJlYWRpbmcgKi8KK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCXN0cnVjdCBHX3NpemVjaGVjayB7IFwKKwkJY2hhciBHX3NpemVjaGVja1tzaXplb2YoRykgPiBDT01NT05fQlVGU0laRSA/IC0xIDogMV07IFwKKwl9OyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBtYXhfbWF0Y2hlcyAgICAgICAoRy5tYXhfbWF0Y2hlcyAgICAgICAgICkKKyNpZiAhRU5BQkxFX0VYVFJBX0NPTVBBVAorIyBkZWZpbmUgcmVmbGFncyAgICAgICAgICAoRy5yZWZsYWdzICAgICAgICAgICAgICkKKyNlbHNlCisjIGRlZmluZSBjYXNlX2ZvbGQgICAgICAgIChHLmNhc2VfZm9sZCAgICAgICAgICAgKQorLyogaHR0cDovL3d3dy5kZWxvcmllLmNvbS9nbnUvZG9jcy9yZWdleC9yZWdleF80Ni5odG1sICovCisjIGRlZmluZSByZWZsYWdzICAgICAgICAgICByZV9zeW50YXhfb3B0aW9ucworIyB1bmRlZiBSRUdfTk9TVUIKKyMgdW5kZWYgUkVHX0VYVEVOREVECisjIHVuZGVmIFJFR19JQ0FTRQorIyBkZWZpbmUgUkVHX05PU1VCICAgIGJ1ZzppczpoZXJlIC8qIHNob3VsZCBub3QgYmUgdXNlZCAqLworLyogSnVzdCBSRV9TWU5UQVhfRUdSRVAgaXMgbm90IGVub3VnaCwgbmVlZCB0byBlbmFibGUge25bLFttXV19IHRvbyAqLworIyBkZWZpbmUgUkVHX0VYVEVOREVEIChSRV9TWU5UQVhfRUdSRVAgfCBSRV9JTlRFUlZBTFMgfCBSRV9OT19CS19CUkFDRVMpCisjIGRlZmluZSBSRUdfSUNBU0UgICAgYnVnOmlzOmhlcmUgLyogc2hvdWxkIG5vdCBiZSB1c2VkICovCisjZW5kaWYKKyNkZWZpbmUgaW52ZXJ0X3NlYXJjaCAgICAgKEcuaW52ZXJ0X3NlYXJjaCAgICAgICApCisjZGVmaW5lIHByaW50X2ZpbGVuYW1lICAgIChHLnByaW50X2ZpbGVuYW1lICAgICAgKQorI2RlZmluZSBvcGVuX2Vycm9ycyAgICAgICAoRy5vcGVuX2Vycm9ycyAgICAgICAgICkKKyNkZWZpbmUgZGlkX3ByaW50X2xpbmUgICAgKEcuZGlkX3ByaW50X2xpbmUgICAgICApCisjZGVmaW5lIGxpbmVzX2JlZm9yZSAgICAgIChHLmxpbmVzX2JlZm9yZSAgICAgICAgKQorI2RlZmluZSBsaW5lc19hZnRlciAgICAgICAoRy5saW5lc19hZnRlciAgICAgICAgICkKKyNkZWZpbmUgYmVmb3JlX2J1ZiAgICAgICAgKEcuYmVmb3JlX2J1ZiAgICAgICAgICApCisjZGVmaW5lIGJlZm9yZV9idWZfc2l6ZSAgIChHLmJlZm9yZV9idWZfc2l6ZSAgICAgKQorI2RlZmluZSBsYXN0X2xpbmVfcHJpbnRlZCAoRy5sYXN0X2xpbmVfcHJpbnRlZCAgICkKKyNkZWZpbmUgcGF0dGVybl9oZWFkICAgICAgKEcucGF0dGVybl9oZWFkICAgICAgICApCisjZGVmaW5lIGN1cl9maWxlICAgICAgICAgIChHLmN1cl9maWxlICAgICAgICAgICAgKQorCisKK3R5cGVkZWYgc3RydWN0IGdyZXBfbGlzdF9kYXRhX3QgeworCWNoYXIgKnBhdHRlcm47CisvKiBmb3IgR05VIHJlZ2V4LCBtYXRjaGVkX3JhbmdlIG11c3QgYmUgcGVyc2lzdGVudCBhY3Jvc3MgZ3JlcF9maWxlKCkgY2FsbHMgKi8KKyNpZiAhRU5BQkxFX0VYVFJBX0NPTVBBVAorCXJlZ2V4X3QgY29tcGlsZWRfcmVnZXg7CisJcmVnbWF0Y2hfdCBtYXRjaGVkX3JhbmdlOworI2Vsc2UKKwlzdHJ1Y3QgcmVfcGF0dGVybl9idWZmZXIgY29tcGlsZWRfcmVnZXg7CisJc3RydWN0IHJlX3JlZ2lzdGVycyBtYXRjaGVkX3JhbmdlOworI2VuZGlmCisjZGVmaW5lIEFMTE9DQVRFRCAxCisjZGVmaW5lIENPTVBJTEVEIDIKKwlpbnQgZmxnX21lbV9hbG9jYXRlZF9jb21waWxlZDsKK30gZ3JlcF9saXN0X2RhdGFfdDsKKworI2lmICFFTkFCTEVfRVhUUkFfQ09NUEFUCisjZGVmaW5lIHByaW50X2xpbmUobGluZSwgbGluZV9sZW4sIGxpbmVudW0sIGRlY29yYXRpb24pIFwKKwlwcmludF9saW5lKGxpbmUsIGxpbmVudW0sIGRlY29yYXRpb24pCisjZW5kaWYKK3N0YXRpYyB2b2lkIHByaW50X2xpbmUoY29uc3QgY2hhciAqbGluZSwgc2l6ZV90IGxpbmVfbGVuLCBpbnQgbGluZW51bSwgY2hhciBkZWNvcmF0aW9uKQoreworI2lmIEVOQUJMRV9GRUFUVVJFX0dSRVBfQ09OVEVYVAorCS8qIEhhcHBlbnMgd2hlbiB3ZSBnbyB0byBuZXh0IGZpbGUsIGltbWVkaWF0ZWx5IGhpdCBtYXRjaAorCSAqIGFuZCB0cnkgdG8gcHJpbnQgcHJldiBjb250ZXh0Li4uIGZyb20gcHJldiBmaWxlISBEb24ndCBkbyBpdCAqLworCWlmIChsaW5lbnVtIDwgMSkKKwkJcmV0dXJuOworCS8qIHBvc3NpYmx5IHByaW50IHRoZSBsaXR0bGUgJy0tJyBzZXBhcmF0b3IgKi8KKwlpZiAoKGxpbmVzX2JlZm9yZSB8fCBsaW5lc19hZnRlcikgJiYgZGlkX3ByaW50X2xpbmUKKwkgJiYgbGFzdF9saW5lX3ByaW50ZWQgIT0gbGluZW51bSAtIDEKKwkpIHsKKwkJcHV0cygiLS0iKTsKKwl9CisJLyogZ3VhcmQgYWdhaW5zdCBwcmludGluZyAiLS0iIGJlZm9yZSBmaXJzdCBsaW5lIG9mIGZpcnN0IGZpbGUgKi8KKwlkaWRfcHJpbnRfbGluZSA9IDE7CisJbGFzdF9saW5lX3ByaW50ZWQgPSBsaW5lbnVtOworI2VuZGlmCisJaWYgKHByaW50X2ZpbGVuYW1lKQorCQlwcmludGYoIiVzJWMiLCBjdXJfZmlsZSwgZGVjb3JhdGlvbik7CisJaWYgKFBSSU5UX0xJTkVfTlVNKQorCQlwcmludGYoIiVpJWMiLCBsaW5lbnVtLCBkZWNvcmF0aW9uKTsKKwkvKiBFbXVsYXRlIHdlaXJkIEdOVSBncmVwIGJlaGF2aW9yIHdpdGggLW92ICovCisJaWYgKChvcHRpb25fbWFzazMyICYgKE9QVF92fE9QVF9vKSkgIT0gKE9QVF92fE9QVF9vKSkgeworI2lmICFFTkFCTEVfRVhUUkFfQ09NUEFUCisJCXB1dHMobGluZSk7CisjZWxzZQorCQlmd3JpdGUobGluZSwgMSwgbGluZV9sZW4sIHN0ZG91dCk7CisJCXB1dGNoYXIoTlVMX0RFTElNSVRFRCA/ICdcMCcgOiAnXG4nKTsKKyNlbmRpZgorCX0KK30KKworI2lmIEVOQUJMRV9FWFRSQV9DT01QQVQKKy8qIFVubGlrZSBnZXRsaW5lLCB0aGlzIG9uZSByZW1vdmVzIHRyYWlsaW5nICdcbicgKi8KK3N0YXRpYyBzc2l6ZV90IEZBU1RfRlVOQyBiYl9nZXRsaW5lKGNoYXIgKipsaW5lX3B0ciwgc2l6ZV90ICpsaW5lX2FsbG9jX2xlbiwgRklMRSAqZmlsZSkKK3sKKwlzc2l6ZV90IHJlc19zejsKKwljaGFyICpsaW5lOworCWludCBkZWxpbSA9IChOVUxfREVMSU1JVEVEID8gJ1wwJyA6ICdcbicpOworCisJcmVzX3N6ID0gZ2V0ZGVsaW0obGluZV9wdHIsIGxpbmVfYWxsb2NfbGVuLCBkZWxpbSwgZmlsZSk7CisJbGluZSA9ICpsaW5lX3B0cjsKKworCWlmIChyZXNfc3ogPiAwKSB7CisJCWlmIChsaW5lW3Jlc19zeiAtIDFdID09IGRlbGltKQorCQkJbGluZVstLXJlc19zel0gPSAnXDAnOworCX0gZWxzZSB7CisJCWZyZWUobGluZSk7IC8qIHVjbGliYyBhbGxvY2F0ZXMgYSBidWZmZXIgZXZlbiBvbiBFT0YuIFdURj8gKi8KKwl9CisJcmV0dXJuIHJlc19zejsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGdyZXBfZmlsZShGSUxFICpmaWxlKQoreworCXNtYWxsdWludCBmb3VuZDsKKwlpbnQgbGluZW51bSA9IDA7CisJaW50IG5tYXRjaGVzID0gMDsKKyNpZiAhRU5BQkxFX0VYVFJBX0NPTVBBVAorCWNoYXIgKmxpbmU7CisjZWxzZQorCWNoYXIgKmxpbmUgPSBOVUxMOworCXNzaXplX3QgbGluZV9sZW47CisJc2l6ZV90IGxpbmVfYWxsb2NfbGVuOworIyBkZWZpbmUgcm1fc28gc3RhcnRbMF0KKyMgZGVmaW5lIHJtX2VvIGVuZFswXQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfR1JFUF9DT05URVhUCisJaW50IHByaW50X25fbGluZXNfYWZ0ZXIgPSAwOworCWludCBjdXJwb3MgPSAwOyAvKiB0cmFjayB3aGVyZSB3ZSBhcmUgaW4gdGhlIGNpcmN1bGFyICdiZWZvcmUnIGJ1ZmZlciAqLworCWludCBpZHggPSAwOyAvKiB1c2VkIGZvciBpdGVyYXRpb24gdGhyb3VnaCB0aGUgY2lyY3VsYXIgYnVmZmVyICovCisjZWxzZQorCWVudW0geyBwcmludF9uX2xpbmVzX2FmdGVyID0gMCB9OworI2VuZGlmCisKKwl3aGlsZSAoCisjaWYgIUVOQUJMRV9FWFRSQV9DT01QQVQKKwkJKGxpbmUgPSB4bWFsbG9jX2ZnZXRsaW5lKGZpbGUpKSAhPSBOVUxMCisjZWxzZQorCQkobGluZV9sZW4gPSBiYl9nZXRsaW5lKCZsaW5lLCAmbGluZV9hbGxvY19sZW4sIGZpbGUpKSA+PSAwCisjZW5kaWYKKwkpIHsKKwkJbGxpc3RfdCAqcGF0dGVybl9wdHIgPSBwYXR0ZXJuX2hlYWQ7CisJCWdyZXBfbGlzdF9kYXRhX3QgKmdsID0gZ2w7IC8qIGZvciBnY2MgKi8KKworCQlsaW5lbnVtKys7CisJCWZvdW5kID0gMDsKKwkJd2hpbGUgKHBhdHRlcm5fcHRyKSB7CisJCQlnbCA9IChncmVwX2xpc3RfZGF0YV90ICopcGF0dGVybl9wdHItPmRhdGE7CisJCQlpZiAoRkdSRVBfRkxBRykgeworCQkJCWNoYXIgKm1hdGNoOworCQkJCWNoYXIgKnN0ciA9IGxpbmU7Cisgb3B0X2ZfYWdhaW46CisJCQkJbWF0Y2ggPSAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfaSkKKwkJCQkJPyBzdHJjYXNlc3RyKHN0ciwgZ2wtPnBhdHRlcm4pCisJCQkJCTogc3Ryc3RyKHN0ciwgZ2wtPnBhdHRlcm4pCisJCQkJCSk7CisJCQkJaWYgKG1hdGNoKSB7CisJCQkJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX3gpIHsKKwkJCQkJCWlmIChtYXRjaCAhPSBzdHIpCisJCQkJCQkJZ290byBvcHRfZl9ub3RfZm91bmQ7CisJCQkJCQlpZiAoc3RyW3N0cmxlbihnbC0+cGF0dGVybildICE9ICdcMCcpCisJCQkJCQkJZ290byBvcHRfZl9ub3RfZm91bmQ7CisJCQkJCX0gZWxzZQorCQkJCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF93KSB7CisJCQkJCQljaGFyIGMgPSAobWF0Y2ggIT0gc3RyKSA/IG1hdGNoWy0xXSA6ICcgJzsKKwkJCQkJCWlmICghaXNhbG51bShjKSAmJiBjICE9ICdfJykgeworCQkJCQkJCWMgPSBtYXRjaFtzdHJsZW4oZ2wtPnBhdHRlcm4pXTsKKwkJCQkJCQlpZiAoIWMgfHwgKCFpc2FsbnVtKGMpICYmIGMgIT0gJ18nKSkKKwkJCQkJCQkJZ290byBvcHRfZl9mb3VuZDsKKwkJCQkJCX0KKwkJCQkJCXN0ciA9IG1hdGNoICsgMTsKKwkJCQkJCWdvdG8gb3B0X2ZfYWdhaW47CisJCQkJCX0KKyBvcHRfZl9mb3VuZDoKKwkJCQkJZm91bmQgPSAxOworIG9wdF9mX25vdF9mb3VuZDogOworCQkJCX0KKwkJCX0gZWxzZSB7CisjaWYgRU5BQkxFX0VYVFJBX0NPTVBBVAorCQkJCXVuc2lnbmVkIHN0YXJ0X3BvczsKKyNlbHNlCisJCQkJaW50IG1hdGNoX2ZsZzsKKyNlbmRpZgorCQkJCWNoYXIgKm1hdGNoX2F0OworCisJCQkJaWYgKCEoZ2wtPmZsZ19tZW1fYWxvY2F0ZWRfY29tcGlsZWQgJiBDT01QSUxFRCkpIHsKKwkJCQkJZ2wtPmZsZ19tZW1fYWxvY2F0ZWRfY29tcGlsZWQgfD0gQ09NUElMRUQ7CisjaWYgIUVOQUJMRV9FWFRSQV9DT01QQVQKKwkJCQkJeHJlZ2NvbXAoJmdsLT5jb21waWxlZF9yZWdleCwgZ2wtPnBhdHRlcm4sIHJlZmxhZ3MpOworI2Vsc2UKKwkJCQkJbWVtc2V0KCZnbC0+Y29tcGlsZWRfcmVnZXgsIDAsIHNpemVvZihnbC0+Y29tcGlsZWRfcmVnZXgpKTsKKwkJCQkJZ2wtPmNvbXBpbGVkX3JlZ2V4LnRyYW5zbGF0ZSA9IGNhc2VfZm9sZDsgLyogZm9yIC1pICovCisJCQkJCWlmIChyZV9jb21waWxlX3BhdHRlcm4oZ2wtPnBhdHRlcm4sIHN0cmxlbihnbC0+cGF0dGVybiksICZnbC0+Y29tcGlsZWRfcmVnZXgpKQorCQkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCByZWdleCAnJXMnIiwgZ2wtPnBhdHRlcm4pOworI2VuZGlmCisJCQkJfQorI2lmICFFTkFCTEVfRVhUUkFfQ09NUEFUCisJCQkJZ2wtPm1hdGNoZWRfcmFuZ2Uucm1fc28gPSAwOworCQkJCWdsLT5tYXRjaGVkX3JhbmdlLnJtX2VvID0gMDsKKwkJCQltYXRjaF9mbGcgPSAwOworI2Vsc2UKKwkJCQlzdGFydF9wb3MgPSAwOworI2VuZGlmCisJCQkJbWF0Y2hfYXQgPSBsaW5lOworIG9wdF93X2FnYWluOgorLy9iYl9lcnJvcl9tc2coIiclcycgc3RhcnRfcG9zOiVkIGxpbmVfbGVuOiVkIiwgbWF0Y2hfYXQsIHN0YXJ0X3BvcywgbGluZV9sZW4pOworCQkJCWlmICgKKyNpZiAhRU5BQkxFX0VYVFJBX0NPTVBBVAorCQkJCQlyZWdleGVjKCZnbC0+Y29tcGlsZWRfcmVnZXgsIG1hdGNoX2F0LCAxLCAmZ2wtPm1hdGNoZWRfcmFuZ2UsIG1hdGNoX2ZsZykgPT0gMAorI2Vsc2UKKwkJCQkJcmVfc2VhcmNoKCZnbC0+Y29tcGlsZWRfcmVnZXgsIG1hdGNoX2F0LCBsaW5lX2xlbiwKKwkJCQkJCQlzdGFydF9wb3MsIC8qcmFuZ2U6Ki8gbGluZV9sZW4sCisJCQkJCQkJJmdsLT5tYXRjaGVkX3JhbmdlKSA+PSAwCisjZW5kaWYKKwkJCQkpIHsKKwkJCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfeCkgeworCQkJCQkJZm91bmQgPSAoZ2wtPm1hdGNoZWRfcmFuZ2Uucm1fc28gPT0gMAorCQkJCQkJICAgICAgICAgJiYgbWF0Y2hfYXRbZ2wtPm1hdGNoZWRfcmFuZ2Uucm1fZW9dID09ICdcMCcpOworCQkJCQl9IGVsc2UKKwkJCQkJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF93KSkgeworCQkJCQkJZm91bmQgPSAxOworCQkJCQl9IGVsc2UgeworCQkJCQkJY2hhciBjID0gJyAnOworCQkJCQkJaWYgKG1hdGNoX2F0ID4gbGluZSB8fCBnbC0+bWF0Y2hlZF9yYW5nZS5ybV9zbyAhPSAwKSB7CisJCQkJCQkJYyA9IG1hdGNoX2F0W2dsLT5tYXRjaGVkX3JhbmdlLnJtX3NvIC0gMV07CisJCQkJCQl9CisJCQkJCQlpZiAoIWlzYWxudW0oYykgJiYgYyAhPSAnXycpIHsKKwkJCQkJCQljID0gbWF0Y2hfYXRbZ2wtPm1hdGNoZWRfcmFuZ2Uucm1fZW9dOworCQkJCQkJfQorCQkJCQkJaWYgKCFpc2FsbnVtKGMpICYmIGMgIT0gJ18nKSB7CisJCQkJCQkJZm91bmQgPSAxOworCQkJCQkJfSBlbHNlIHsKKwkJCS8qCisJCQkgKiBXaHkgY2hlY2sgZ2wtPm1hdGNoZWRfcmFuZ2Uucm1fZW8/CisJCQkgKiBaZXJvLWxlbmd0aCBtYXRjaCBtYWtlcyAtdyBza2lwIHRoZSBsaW5lOgorCQkJICogImVjaG8gZm9vIHwgZ3JlcCBeIiBwcmludHMgImZvbyIsCisJCQkgKiAiZWNobyBmb28gfCBncmVwIC13IF4iIHByaW50cyBub3RoaW5nLgorCQkJICogV2l0aG91dCBzdWNoIGNoZWNrLCB3ZSBjYW4gbG9vcCBmb3JldmVyLgorCQkJICovCisjaWYgIUVOQUJMRV9FWFRSQV9DT01QQVQKKwkJCQkJCQlpZiAoZ2wtPm1hdGNoZWRfcmFuZ2Uucm1fZW8gIT0gMCkgeworCQkJCQkJCQltYXRjaF9hdCArPSBnbC0+bWF0Y2hlZF9yYW5nZS5ybV9lbzsKKwkJCQkJCQkJbWF0Y2hfZmxnIHw9IFJFR19OT1RCT0w7CisJCQkJCQkJCWdvdG8gb3B0X3dfYWdhaW47CisJCQkJCQkJfQorI2Vsc2UKKwkJCQkJCQlpZiAoZ2wtPm1hdGNoZWRfcmFuZ2Uucm1fZW8gPiBzdGFydF9wb3MpIHsKKwkJCQkJCQkJc3RhcnRfcG9zID0gZ2wtPm1hdGNoZWRfcmFuZ2Uucm1fZW87CisJCQkJCQkJCWdvdG8gb3B0X3dfYWdhaW47CisJCQkJCQkJfQorI2VuZGlmCisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQkvKiBJZiBpdCdzIG5vbi1pbnZlcnRlZCBzZWFyY2gsIHdlIGNhbiBzdG9wCisJCQkgKiBhdCBmaXJzdCBtYXRjaCAqLworCQkJaWYgKGZvdW5kICYmICFpbnZlcnRfc2VhcmNoKQorCQkJCWdvdG8gZG9fZm91bmQ7CisJCQlwYXR0ZXJuX3B0ciA9IHBhdHRlcm5fcHRyLT5saW5rOworCQl9IC8qIHdoaWxlIChwYXR0ZXJuX3B0cikgKi8KKworCQlpZiAoZm91bmQgXiBpbnZlcnRfc2VhcmNoKSB7CisgZG9fZm91bmQ6CisJCQkvKiBrZWVwIHRyYWNrIG9mIG1hdGNoZXMgKi8KKwkJCW5tYXRjaGVzKys7CisKKwkJCS8qIHF1aWV0L3ByaW50IChub24pbWF0Y2hpbmcgZmlsZSBuYW1lcyBvbmx5PyAqLworCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiAoT1BUX3F8T1BUX2x8T1BUX0wpKSB7CisJCQkJZnJlZShsaW5lKTsgLyogd2UgZG9uJ3QgbmVlZCBsaW5lIGFueW1vcmUgKi8KKwkJCQlpZiAoQkVfUVVJRVQpIHsKKwkJCQkJLyogbWFucGFnZSBzYXlzIGFib3V0IC1xOgorCQkJCQkgKiAiZXhpdCBpbW1lZGlhdGVseSB3aXRoIHplcm8gc3RhdHVzCisJCQkJCSAqIGlmIGFueSBtYXRjaCBpcyBmb3VuZCwKKwkJCQkJICogZXZlbiBpZiBlcnJvcnMgd2VyZSBkZXRlY3RlZCIgKi8KKwkJCQkJZXhpdChFWElUX1NVQ0NFU1MpOworCQkJCX0KKwkJCQkvKiBpZiB3ZSdyZSBqdXN0IHByaW50aW5nIGZpbGVuYW1lcywgd2Ugc3RvcCBhZnRlciB0aGUgZmlyc3QgbWF0Y2ggKi8KKwkJCQlpZiAoUFJJTlRfRklMRVNfV0lUSF9NQVRDSEVTKSB7CisJCQkJCXB1dHMoY3VyX2ZpbGUpOworCQkJCQkvKiBmYWxsIHRocm91Z2ggdG8gInJldHVybiAxIiAqLworCQkJCX0KKwkJCQkvKiBPUFRfTCBha2EgUFJJTlRfRklMRVNfV0lUSE9VVF9NQVRDSEVTOiByZXR1cm4gZWFybHkgKi8KKwkJCQlyZXR1cm4gMTsgLyogb25lIG1hdGNoICovCisJCQl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9HUkVQX0NPTlRFWFQKKwkJCS8qIFdlcmUgd2UgcHJpbnRpbmcgY29udGV4dCBhbmQgc2F3IG5leHQgKHVud2FudGVkKSBtYXRjaD8gKi8KKwkJCWlmICgob3B0aW9uX21hc2szMiAmIE9QVF9tKSAmJiBubWF0Y2hlcyA+IG1heF9tYXRjaGVzKQorCQkJCWJyZWFrOworI2VuZGlmCisKKwkJCS8qIHByaW50IHRoZSBtYXRjaGVkIGxpbmUgKi8KKwkJCWlmIChQUklOVF9NQVRDSF9DT1VOVFMgPT0gMCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0dSRVBfQ09OVEVYVAorCQkJCWludCBwcmV2cG9zID0gKGN1cnBvcyA9PSAwKSA/IGxpbmVzX2JlZm9yZSAtIDEgOiBjdXJwb3MgLSAxOworCisJCQkJLyogaWYgd2Ugd2VyZSB0b2xkIHRvIHByaW50ICdiZWZvcmUnIGxpbmVzIGFuZCB0aGVyZSBpcyBhdCBsZWFzdAorCQkJCSAqIG9uZSBsaW5lIGluIHRoZSBjaXJjdWxhciBidWZmZXIsIHByaW50IHRoZW0gKi8KKwkJCQlpZiAobGluZXNfYmVmb3JlICYmIGJlZm9yZV9idWZbcHJldnBvc10gIT0gTlVMTCkgeworCQkJCQlpbnQgZmlyc3RfYnVmX2VudHJ5X2xpbmVfbnVtID0gbGluZW51bSAtIGxpbmVzX2JlZm9yZTsKKworCQkJCQkvKiBhZHZhbmNlIHRvIHRoZSBmaXJzdCBlbnRyeSBpbiB0aGUgY2lyY3VsYXIgYnVmZmVyLCBhbmQKKwkJCQkJICogZmlndXJlIG91dCB0aGUgbGluZSBudW1iZXIgaXMgb2YgdGhlIGZpcnN0IGxpbmUgaW4gdGhlCisJCQkJCSAqIGJ1ZmZlciAqLworCQkJCQlpZHggPSBjdXJwb3M7CisJCQkJCXdoaWxlIChiZWZvcmVfYnVmW2lkeF0gPT0gTlVMTCkgeworCQkJCQkJaWR4ID0gKGlkeCArIDEpICUgbGluZXNfYmVmb3JlOworCQkJCQkJZmlyc3RfYnVmX2VudHJ5X2xpbmVfbnVtKys7CisJCQkJCX0KKworCQkJCQkvKiBub3cgcHJpbnQgZWFjaCBsaW5lIGluIHRoZSBidWZmZXIsIGNsZWFyaW5nIHRoZW0gYXMgd2UgZ28gKi8KKwkJCQkJd2hpbGUgKGJlZm9yZV9idWZbaWR4XSAhPSBOVUxMKSB7CisJCQkJCQlwcmludF9saW5lKGJlZm9yZV9idWZbaWR4XSwgYmVmb3JlX2J1Zl9zaXplW2lkeF0sIGZpcnN0X2J1Zl9lbnRyeV9saW5lX251bSwgJy0nKTsKKwkJCQkJCWZyZWUoYmVmb3JlX2J1ZltpZHhdKTsKKwkJCQkJCWJlZm9yZV9idWZbaWR4XSA9IE5VTEw7CisJCQkJCQlpZHggPSAoaWR4ICsgMSkgJSBsaW5lc19iZWZvcmU7CisJCQkJCQlmaXJzdF9idWZfZW50cnlfbGluZV9udW0rKzsKKwkJCQkJfQorCQkJCX0KKworCQkJCS8qIG1ha2UgYSBub3RlIHRoYXQgd2UgbmVlZCB0byBwcmludCAnYWZ0ZXInIGxpbmVzICovCisJCQkJcHJpbnRfbl9saW5lc19hZnRlciA9IGxpbmVzX2FmdGVyOworI2VuZGlmCisJCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfbykgeworCQkJCQlpZiAoRkdSRVBfRkxBRykgeworCQkJCQkJLyogLUZvIGp1c3QgcHJpbnRzIHRoZSBwYXR0ZXJuCisJCQkJCQkgKiAodW5sZXNzIC12OiAtRm92IGRvZXNudCBwcmludCBhbnl0aGluZyBhdCBhbGwpICovCisJCQkJCQlpZiAoZm91bmQpCisJCQkJCQkJcHJpbnRfbGluZShnbC0+cGF0dGVybiwgc3RybGVuKGdsLT5wYXR0ZXJuKSwgbGluZW51bSwgJzonKTsKKwkJCQkJfSBlbHNlIHdoaWxlICgxKSB7CisJCQkJCQl1bnNpZ25lZCBzdGFydCA9IGdsLT5tYXRjaGVkX3JhbmdlLnJtX3NvOworCQkJCQkJdW5zaWduZWQgZW5kID0gZ2wtPm1hdGNoZWRfcmFuZ2Uucm1fZW87CisJCQkJCQl1bnNpZ25lZCBsZW4gPSBlbmQgLSBzdGFydDsKKwkJCQkJCWNoYXIgb2xkID0gbGluZVtlbmRdOworCQkJCQkJbGluZVtlbmRdID0gJ1wwJzsKKwkJCQkJCS8qIEVtcHR5IG1hdGNoIGlzIG5vdCBwcmludGVkOiB0cnkgImVjaG8gdGVzdCB8IGdyZXAgLW8gJyciICovCisJCQkJCQlpZiAobGVuICE9IDApCisJCQkJCQkJcHJpbnRfbGluZShsaW5lICsgc3RhcnQsIGxlbiwgbGluZW51bSwgJzonKTsKKwkJCQkJCWlmIChvbGQgPT0gJ1wwJykKKwkJCQkJCQlicmVhazsKKwkJCQkJCWxpbmVbZW5kXSA9IG9sZDsKKwkJCQkJCWlmIChsZW4gPT0gMCkKKwkJCQkJCQllbmQrKzsKKyNpZiAhRU5BQkxFX0VYVFJBX0NPTVBBVAorCQkJCQkJaWYgKHJlZ2V4ZWMoJmdsLT5jb21waWxlZF9yZWdleCwgbGluZSArIGVuZCwKKwkJCQkJCQkJMSwgJmdsLT5tYXRjaGVkX3JhbmdlLCBSRUdfTk9UQk9MKSAhPSAwKQorCQkJCQkJCWJyZWFrOworCQkJCQkJZ2wtPm1hdGNoZWRfcmFuZ2Uucm1fc28gKz0gZW5kOworCQkJCQkJZ2wtPm1hdGNoZWRfcmFuZ2Uucm1fZW8gKz0gZW5kOworI2Vsc2UKKwkJCQkJCWlmIChyZV9zZWFyY2goJmdsLT5jb21waWxlZF9yZWdleCwgbGluZSwgbGluZV9sZW4sCisJCQkJCQkJCWVuZCwgbGluZV9sZW4gLSBlbmQsCisJCQkJCQkJCSZnbC0+bWF0Y2hlZF9yYW5nZSkgPCAwKQorCQkJCQkJCWJyZWFrOworI2VuZGlmCisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlwcmludF9saW5lKGxpbmUsIGxpbmVfbGVuLCBsaW5lbnVtLCAnOicpOworCQkJCX0KKwkJCX0KKwkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0dSRVBfQ09OVEVYVAorCQllbHNlIHsgLyogbm8gbWF0Y2ggKi8KKwkJCS8qIGlmIHdlIG5lZWQgdG8gcHJpbnQgc29tZSBjb250ZXh0IGxpbmVzIGFmdGVyIHRoZSBsYXN0IG1hdGNoLCBkbyBzbyAqLworCQkJaWYgKHByaW50X25fbGluZXNfYWZ0ZXIpIHsKKwkJCQlwcmludF9saW5lKGxpbmUsIHN0cmxlbihsaW5lKSwgbGluZW51bSwgJy0nKTsKKwkJCQlwcmludF9uX2xpbmVzX2FmdGVyLS07CisJCQl9IGVsc2UgaWYgKGxpbmVzX2JlZm9yZSkgeworCQkJCS8qIEFkZCB0aGUgbGluZSB0byB0aGUgY2lyY3VsYXIgJ2JlZm9yZScgYnVmZmVyICovCisJCQkJZnJlZShiZWZvcmVfYnVmW2N1cnBvc10pOworCQkJCWJlZm9yZV9idWZbY3VycG9zXSA9IGxpbmU7CisJCQkJSUZfRVhUUkFfQ09NUEFUKGJlZm9yZV9idWZfc2l6ZVtjdXJwb3NdID0gbGluZV9sZW47KQorCQkJCWN1cnBvcyA9IChjdXJwb3MgKyAxKSAlIGxpbmVzX2JlZm9yZTsKKwkJCQkvKiBhdm9pZCBmcmVlKGxpbmUpIC0gd2UgdG9vayB0aGUgbGluZSAqLworCQkJCWxpbmUgPSBOVUxMOworCQkJfQorCQl9CisKKyNlbmRpZiAvKiBFTkFCTEVfRkVBVFVSRV9HUkVQX0NPTlRFWFQgKi8KKyNpZiAhRU5BQkxFX0VYVFJBX0NPTVBBVAorCQlmcmVlKGxpbmUpOworI2VuZGlmCisJCS8qIERpZCB3ZSBwcmludCBhbGwgY29udGV4dCBhZnRlciBsYXN0IHJlcXVlc3RlZCBtYXRjaD8gKi8KKwkJaWYgKChvcHRpb25fbWFzazMyICYgT1BUX20pCisJCSAmJiAhcHJpbnRfbl9saW5lc19hZnRlcgorCQkgJiYgbm1hdGNoZXMgPT0gbWF4X21hdGNoZXMKKwkJKSB7CisJCQlicmVhazsKKwkJfQorCX0gLyogd2hpbGUgKHJlYWQgbGluZSkgKi8KKworCS8qIHNwZWNpYWwtY2FzZSBmaWxlIHBvc3QtcHJvY2Vzc2luZyBmb3Igb3B0aW9ucyB3aGVyZSB3ZSBkb24ndCBwcmludCBsaW5lCisJICogbWF0Y2hlcywganVzdCBmaWxlbmFtZXMgYW5kIHBvc3NpYmx5IG1hdGNoIGNvdW50cyAqLworCisJLyogZ3JlcCAtYzogcHJpbnQgW2ZpbGVuYW1lOl1jb3VudCwgZXZlbiBpZiBjb3VudCBpcyB6ZXJvICovCisJaWYgKFBSSU5UX01BVENIX0NPVU5UUykgeworCQlpZiAocHJpbnRfZmlsZW5hbWUpCisJCQlwcmludGYoIiVzOiIsIGN1cl9maWxlKTsKKwkJcHJpbnRmKCIlZFxuIiwgbm1hdGNoZXMpOworCX0KKworCS8qIGdyZXAgLUw6IHByaW50IGp1c3QgdGhlIGZpbGVuYW1lICovCisJaWYgKFBSSU5UX0ZJTEVTX1dJVEhPVVRfTUFUQ0hFUykgeworCQkvKiBubWF0Y2hlcyBpcyB6ZXJvLCBubyBuZWVkIHRvIGNoZWNrIGl0OgorCQkgKiB3ZSByZXR1cm4gMSBlYXJseSBpZiB3ZSBkZXRlY3RlZCBhIG1hdGNoCisJCSAqIGFuZCBQUklOVF9GSUxFU19XSVRIT1VUX01BVENIRVMgaXMgc2V0ICovCisJCXB1dHMoY3VyX2ZpbGUpOworCX0KKworCXJldHVybiBubWF0Y2hlczsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQCisjZGVmaW5lIG5ld19ncmVwX2xpc3RfZGF0YShwLCBtKSBhZGRfZ3JlcF9saXN0X2RhdGEocCwgbSkKK3N0YXRpYyBjaGFyICphZGRfZ3JlcF9saXN0X2RhdGEoY2hhciAqcGF0dGVybiwgaW50IGZsZ191c2VkX21lbSkKKyNlbHNlCisjZGVmaW5lIG5ld19ncmVwX2xpc3RfZGF0YShwLCBtKSBhZGRfZ3JlcF9saXN0X2RhdGEocCkKK3N0YXRpYyBjaGFyICphZGRfZ3JlcF9saXN0X2RhdGEoY2hhciAqcGF0dGVybikKKyNlbmRpZgoreworCWdyZXBfbGlzdF9kYXRhX3QgKmdsID0geHphbGxvYyhzaXplb2YoKmdsKSk7CisJZ2wtPnBhdHRlcm4gPSBwYXR0ZXJuOworI2lmIEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQCisJZ2wtPmZsZ19tZW1fYWxvY2F0ZWRfY29tcGlsZWQgPSBmbGdfdXNlZF9tZW07CisjZWxzZQorCS8qZ2wtPmZsZ19tZW1fYWxvY2F0ZWRfY29tcGlsZWQgPSAwOyovCisjZW5kaWYKKwlyZXR1cm4gKGNoYXIgKilnbDsKK30KKworc3RhdGljIHZvaWQgbG9hZF9yZWdleGVzX2Zyb21fZmlsZShsbGlzdF90ICpmb3B0KQoreworCXdoaWxlIChmb3B0KSB7CisJCWNoYXIgKmxpbmU7CisJCUZJTEUgKmZwOworCQlsbGlzdF90ICpjdXIgPSBmb3B0OworCQljaGFyICpmZmlsZSA9IGN1ci0+ZGF0YTsKKworCQlmb3B0ID0gY3VyLT5saW5rOworCQlmcmVlKGN1cik7CisJCWZwID0geGZvcGVuX3N0ZGluKGZmaWxlKTsKKwkJd2hpbGUgKChsaW5lID0geG1hbGxvY19mZ2V0bGluZShmcCkpICE9IE5VTEwpIHsKKwkJCWxsaXN0X2FkZF90bygmcGF0dGVybl9oZWFkLAorCQkJCW5ld19ncmVwX2xpc3RfZGF0YShsaW5lLCBBTExPQ0FURUQpKTsKKwkJfQorCQlmY2xvc2VfaWZfbm90X3N0ZGluKGZwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGZpbGVfYWN0aW9uX2dyZXAoY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCQlzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZiBVTlVTRURfUEFSQU0sCisJCQl2b2lkKiBtYXRjaGVkLAorCQkJaW50IGRlcHRoIFVOVVNFRF9QQVJBTSkKK3sKKwlGSUxFICpmaWxlID0gZm9wZW5fZm9yX3JlYWQoZmlsZW5hbWUpOworCWlmIChmaWxlID09IE5VTEwpIHsKKwkJaWYgKCFTVVBQUkVTU19FUlJfTVNHUykKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGZpbGVuYW1lKTsKKwkJb3Blbl9lcnJvcnMgPSAxOworCQlyZXR1cm4gMDsKKwl9CisJY3VyX2ZpbGUgPSBmaWxlbmFtZTsKKwkqKGludCopbWF0Y2hlZCArPSBncmVwX2ZpbGUoZmlsZSk7CisJZmNsb3NlKGZpbGUpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGdyZXBfZGlyKGNvbnN0IGNoYXIgKmRpcikKK3sKKwlpbnQgbWF0Y2hlZCA9IDA7CisJcmVjdXJzaXZlX2FjdGlvbihkaXIsCisJCS8qIHJlY3Vyc2U9eWVzICovIEFDVElPTl9SRUNVUlNFIHwKKwkJLyogZm9sbG93TGlua3M9Y29tbWFuZCBsaW5lIG9ubHkgKi8gQUNUSU9OX0ZPTExPV0xJTktTX0wwIHwKKwkJLyogZGVwdGhGaXJzdD15ZXMgKi8gQUNUSU9OX0RFUFRIRklSU1QsCisJCS8qIGZpbGVBY3Rpb249ICovIGZpbGVfYWN0aW9uX2dyZXAsCisJCS8qIGRpckFjdGlvbj0gKi8gTlVMTCwKKwkJLyogdXNlckRhdGE9ICovICZtYXRjaGVkLAorCQkvKiBkZXB0aD0gKi8gMCk7CisJcmV0dXJuIG1hdGNoZWQ7Cit9CisKK2ludCBncmVwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBncmVwX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlGSUxFICpmaWxlOworCWludCBtYXRjaGVkOworCWxsaXN0X3QgKmZvcHQgPSBOVUxMOworCisJLyogZG8gbm9ybWFsIG9wdGlvbiBwYXJzaW5nICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfR1JFUF9DT05URVhUCisJaW50IENvcHQsIG9wdHM7CisKKwkvKiAtSCB1bnNldHMgLWg7IC1DIHVuc2V0cyAtQSwtQjsgLWUsLWYgYXJlIGxpc3RzOworCSAqIC1tLC1BLC1CLC1DIGhhdmUgbnVtZXJpYyBwYXJhbSAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIkgtaDpDLUFCOmU6OmY6Om0rOkErOkIrOkMrIjsKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwKKwkJT1BUU1RSX0dSRVAsCisJCSZwYXR0ZXJuX2hlYWQsICZmb3B0LCAmbWF4X21hdGNoZXMsCisJCSZsaW5lc19hZnRlciwgJmxpbmVzX2JlZm9yZSwgJkNvcHQpOworCisJaWYgKG9wdHMgJiBPUFRfQykgeworCQkvKiAtQyB1bnNldHMgcHJldiAtQSBhbmQgLUIsIGJ1dCBmb2xsb3dpbmcgLUEgb3IgLUIKKwkJICogbWF5IG92ZXJyaWRlIGl0ICovCisJCWlmICghKG9wdHMgJiBPUFRfQSkpIC8qIG5vdCBvdmVycmlkZGVuICovCisJCQlsaW5lc19hZnRlciA9IENvcHQ7CisJCWlmICghKG9wdHMgJiBPUFRfQikpIC8qIG5vdCBvdmVycmlkZGVuICovCisJCQlsaW5lc19iZWZvcmUgPSBDb3B0OworCX0KKwkvKiBzYW5pdHkgY2hlY2tzICovCisJaWYgKG9wdHMgJiAoT1BUX2N8T1BUX3F8T1BUX2x8T1BUX0wpKSB7CisJCW9wdGlvbl9tYXNrMzIgJj0gfk9QVF9uOworCQlsaW5lc19iZWZvcmUgPSAwOworCQlsaW5lc19hZnRlciA9IDA7CisJfSBlbHNlIGlmIChsaW5lc19iZWZvcmUgPiAwKSB7CisJCWlmIChsaW5lc19iZWZvcmUgPiBJTlRfTUFYIC8gc2l6ZW9mKGxvbmcgbG9uZykpCisJCQlsaW5lc19iZWZvcmUgPSBJTlRfTUFYIC8gc2l6ZW9mKGxvbmcgbG9uZyk7CisJCS8qIG92ZXJmbG93IGluIChsaW5lc19iZWZvcmUgKiBzaXplb2YoeCkpIGlzIHByZXZlbnRlZCAoYWJvdmUpICovCisJCWJlZm9yZV9idWYgPSB4emFsbG9jKGxpbmVzX2JlZm9yZSAqIHNpemVvZihiZWZvcmVfYnVmWzBdKSk7CisJCUlGX0VYVFJBX0NPTVBBVChiZWZvcmVfYnVmX3NpemUgPSB4emFsbG9jKGxpbmVzX2JlZm9yZSAqIHNpemVvZihiZWZvcmVfYnVmX3NpemVbMF0pKTspCisJfQorI2Vsc2UKKwkvKiB3aXRoIGF1dG8gc2FuaXR5IGNoZWNrcyAqLworCS8qIC1IIHVuc2V0cyAtaDsgLWMsLXEgb3IgLWwgdW5zZXQgLW47IC1lLC1mIGFyZSBsaXN0czsgLW0gTiAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIkgtaDpjLW46cS1uOmwtbjplOjpmOjptKyI7CisJZ2V0b3B0MzIoYXJndiwgT1BUU1RSX0dSRVAsCisJCSZwYXR0ZXJuX2hlYWQsICZmb3B0LCAmbWF4X21hdGNoZXMpOworI2VuZGlmCisJaW52ZXJ0X3NlYXJjaCA9ICgob3B0aW9uX21hc2szMiAmIE9QVF92KSAhPSAwKTsgLyogMCB8IDEgKi8KKworCXsJLyogY29udmVydCBjaGFyICoqYXJndiB0byBncmVwX2xpc3RfZGF0YV90ICovCisJCWxsaXN0X3QgKmN1cjsKKwkJZm9yIChjdXIgPSBwYXR0ZXJuX2hlYWQ7IGN1cjsgY3VyID0gY3VyLT5saW5rKQorCQkJY3VyLT5kYXRhID0gbmV3X2dyZXBfbGlzdF9kYXRhKGN1ci0+ZGF0YSwgMCk7CisJfQorCWlmIChvcHRpb25fbWFzazMyICYgT1BUX2YpIHsKKwkJbG9hZF9yZWdleGVzX2Zyb21fZmlsZShmb3B0KTsKKwkJaWYgKCFwYXR0ZXJuX2hlYWQpIHsgLyogLWYgRU1QVFlfRklMRT8gKi8KKwkJCS8qIEdOVSBncmVwIHRyZWF0cyBpdCBhcyAibm90aGluZyBtYXRjaGVzIiAqLworCQkJbGxpc3RfYWRkX3RvKCZwYXR0ZXJuX2hlYWQsIG5ld19ncmVwX2xpc3RfZGF0YSgoY2hhciopICIiLCAwKSk7CisJCQlpbnZlcnRfc2VhcmNoIF49IDE7CisJCX0KKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfR1JFUF9GR1JFUF9BTElBUyAmJiBhcHBsZXRfbmFtZVswXSA9PSAnZicpCisJCW9wdGlvbl9tYXNrMzIgfD0gT1BUX0Y7CisKKyNpZiAhRU5BQkxFX0VYVFJBX0NPTVBBVAorCWlmICghKG9wdGlvbl9tYXNrMzIgJiAoT1BUX28gfCBPUFRfdyB8IE9QVF94KSkpCisJCXJlZmxhZ3MgPSBSRUdfTk9TVUI7CisjZW5kaWYKKworCWlmIChFTkFCTEVfRkVBVFVSRV9HUkVQX0VHUkVQX0FMSUFTCisJICYmIChhcHBsZXRfbmFtZVswXSA9PSAnZScgfHwgKG9wdGlvbl9tYXNrMzIgJiBPUFRfRSkpCisJKSB7CisJCXJlZmxhZ3MgfD0gUkVHX0VYVEVOREVEOworCX0KKyNpZiBFTkFCTEVfRVhUUkFfQ09NUEFUCisJZWxzZSB7CisJCXJlZmxhZ3MgPSBSRV9TWU5UQVhfR1JFUDsKKwl9CisjZW5kaWYKKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX2kpIHsKKyNpZiAhRU5BQkxFX0VYVFJBX0NPTVBBVAorCQlyZWZsYWdzIHw9IFJFR19JQ0FTRTsKKyNlbHNlCisJCWludCBpOworCQljYXNlX2ZvbGQgPSB4bWFsbG9jKDI1Nik7CisJCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykKKwkJCWNhc2VfZm9sZFtpXSA9ICh1bnNpZ25lZCBjaGFyKWk7CisJCWZvciAoaSA9ICdhJzsgaSA8PSAneic7IGkrKykKKwkJCWNhc2VfZm9sZFtpXSA9ICh1bnNpZ25lZCBjaGFyKShpIC0gKCdhJyAtICdBJykpOworI2VuZGlmCisJfQorCisJYXJndiArPSBvcHRpbmQ7CisKKwkvKiBpZiB3ZSBkaWRuJ3QgZ2V0IGEgcGF0dGVybiBmcm9tIC1lIGFuZCBubyBjb21tYW5kIGZpbGUgd2FzIHNwZWNpZmllZCwKKwkgKiBmaXJzdCBwYXJhbWV0ZXIgc2hvdWxkIGJlIHRoZSBwYXR0ZXJuLiBubyBwYXR0ZXJuLCBubyB3b3JreSAqLworCWlmIChwYXR0ZXJuX2hlYWQgPT0gTlVMTCkgeworCQljaGFyICpwYXR0ZXJuOworCQlpZiAoKmFyZ3YgPT0gTlVMTCkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJcGF0dGVybiA9IG5ld19ncmVwX2xpc3RfZGF0YSgqYXJndisrLCAwKTsKKwkJbGxpc3RfYWRkX3RvKCZwYXR0ZXJuX2hlYWQsIHBhdHRlcm4pOworCX0KKworCS8qIGFyZ3ZbMC4uKGFyZ2MtMSldIHNob3VsZCBiZSBuYW1lcyBvZiBmaWxlIHRvIGdyZXAgdGhyb3VnaC4gSWYKKwkgKiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGZpbGUgdG8gZ3JlcCwgd2Ugd2lsbCBwcmludCB0aGUgZmlsZW5hbWVzLiAqLworCWlmIChhcmd2WzBdICYmIGFyZ3ZbMV0pCisJCXByaW50X2ZpbGVuYW1lID0gMTsKKwkvKiAtSCAvIC1oIG9mIGNvdXJzZSBvdmVycmlkZSAqLworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX0gpCisJCXByaW50X2ZpbGVuYW1lID0gMTsKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9oKQorCQlwcmludF9maWxlbmFtZSA9IDA7CisKKwkvKiBJZiBubyBmaWxlcyB3ZXJlIHNwZWNpZmllZCwgb3IgJy0nIHdhcyBzcGVjaWZpZWQsIHRha2UgaW5wdXQgZnJvbQorCSAqIHN0ZGluLiBPdGhlcndpc2UsIHdlIGdyZXAgdGhyb3VnaCBhbGwgdGhlIGZpbGVzIHNwZWNpZmllZC4gKi8KKwltYXRjaGVkID0gMDsKKwlkbyB7CisJCWN1cl9maWxlID0gKmFyZ3Y7CisJCWZpbGUgPSBzdGRpbjsKKwkJaWYgKCFjdXJfZmlsZSB8fCBMT05FX0RBU0goY3VyX2ZpbGUpKSB7CisJCQljdXJfZmlsZSA9ICIoc3RhbmRhcmQgaW5wdXQpIjsKKwkJfSBlbHNlIHsKKwkJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX3IpIHsKKwkJCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJCQlpZiAoc3RhdChjdXJfZmlsZSwgJnN0KSA9PSAwICYmIFNfSVNESVIoc3Quc3RfbW9kZSkpIHsKKwkJCQkJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9oKSkKKwkJCQkJCXByaW50X2ZpbGVuYW1lID0gMTsKKwkJCQkJbWF0Y2hlZCArPSBncmVwX2RpcihjdXJfZmlsZSk7CisJCQkJCWdvdG8gZ3JlcF9kb25lOworCQkJCX0KKwkJCX0KKwkJCS8qIGVsc2U6IGZvcGVuKGRpcikgd2lsbCBzdWNjZWVkLCBidXQgcmVhZGluZyB3b24ndCAqLworCQkJZmlsZSA9IGZvcGVuX2Zvcl9yZWFkKGN1cl9maWxlKTsKKwkJCWlmIChmaWxlID09IE5VTEwpIHsKKwkJCQlpZiAoIVNVUFBSRVNTX0VSUl9NU0dTKQorCQkJCQliYl9zaW1wbGVfcGVycm9yX21zZyhjdXJfZmlsZSk7CisJCQkJb3Blbl9lcnJvcnMgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCW1hdGNoZWQgKz0gZ3JlcF9maWxlKGZpbGUpOworCQlmY2xvc2VfaWZfbm90X3N0ZGluKGZpbGUpOworIGdyZXBfZG9uZTogOworCX0gd2hpbGUgKCphcmd2ICYmICorK2FyZ3YpOworCisJLyogZGVzdHJveSBhbGwgdGhlIGVsbWVudHMgaW4gdGhlIHBhdHRlcm4gbGlzdCAqLworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQl3aGlsZSAocGF0dGVybl9oZWFkKSB7CisJCQlsbGlzdF90ICpwYXR0ZXJuX2hlYWRfcHRyID0gcGF0dGVybl9oZWFkOworCQkJZ3JlcF9saXN0X2RhdGFfdCAqZ2wgPSAoZ3JlcF9saXN0X2RhdGFfdCAqKXBhdHRlcm5faGVhZF9wdHItPmRhdGE7CisKKwkJCXBhdHRlcm5faGVhZCA9IHBhdHRlcm5faGVhZC0+bGluazsKKwkJCWlmIChnbC0+ZmxnX21lbV9hbG9jYXRlZF9jb21waWxlZCAmIEFMTE9DQVRFRCkKKwkJCQlmcmVlKGdsLT5wYXR0ZXJuKTsKKwkJCWlmIChnbC0+ZmxnX21lbV9hbG9jYXRlZF9jb21waWxlZCAmIENPTVBJTEVEKQorCQkJCXJlZ2ZyZWUoJmdsLT5jb21waWxlZF9yZWdleCk7CisJCQlmcmVlKGdsKTsKKwkJCWZyZWUocGF0dGVybl9oZWFkX3B0cik7CisJCX0KKwl9CisJLyogMCA9IHN1Y2Nlc3MsIDEgPSBmYWlsZWQsIDIgPSBlcnJvciAqLworCWlmIChvcGVuX2Vycm9ycykKKwkJcmV0dXJuIDI7CisJcmV0dXJuICFtYXRjaGVkOyAvKiBpbnZlcnQgcmV0dXJuIHZhbHVlOiAwID0gc3VjY2VzcywgMSA9IGZhaWxlZCAqLworfQpkaWZmIC0tZ2l0IGEvZmluZHV0aWxzL3hhcmdzLmMgYi9maW5kdXRpbHMveGFyZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODcwYjhhCi0tLSAvZGV2L251bGwKKysrIGIvZmluZHV0aWxzL3hhcmdzLmMKQEAgLTAsMCArMSw2NjAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgeGFyZ3MgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiAoQykgMjAwMiwyMDAzIGJ5IFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4KKyAqCisgKiBTcGVjaWFsIHRoYW5rcworICogLSBNYXJrIFdoaXRsZXkgYW5kIEdsZW5uIE1jR3JhdGggZm9yIHN0aW11bHVzIHRvIHJld3JpdGUgOikKKyAqIC0gTWlrZSBSZW5kZWxsIDxtaWNoYWVsQGNzLm11bi5jYT4KKyAqIGFuZCBEYXZpZCBNYWNLZW56aWUgPGRqbUBnbnUuYWkubWl0LmVkdT4uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiB4YXJncyBpcyBkZXNjcmliZWQgaW4gdGhlIFNpbmdsZSBVbml4IFNwZWNpZmljYXRpb24gdjMgYXQKKyAqIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS91dGlsaXRpZXMveGFyZ3MuaHRtbAorICovCisKKy8vY29uZmlnOmNvbmZpZyBYQVJHUworLy9jb25maWc6CWJvb2wgInhhcmdzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIHhhcmdzIGlzIHVzZWQgdG8gZXhlY3V0ZSBhIHNwZWNpZmllZCBjb21tYW5kIGZvcgorLy9jb25maWc6CSAgZXZlcnkgaXRlbSBmcm9tIHN0YW5kYXJkIGlucHV0LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9YQVJHU19TVVBQT1JUX0NPTkZJUk1BVElPTgorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAtcDogcHJvbXB0IGFuZCBjb25maXJtYXRpb24iCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBYQVJHUworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN1cHBvcnQgLXA6IHByb21wdCB0aGUgdXNlciB3aGV0aGVyIHRvIHJ1biBlYWNoIGNvbW1hbmQKKy8vY29uZmlnOgkgIGxpbmUgYW5kIHJlYWQgYSBsaW5lIGZyb20gdGhlIHRlcm1pbmFsLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9YQVJHU19TVVBQT1JUX1FVT1RFUworLy9jb25maWc6CWJvb2wgIkVuYWJsZSBzaW5nbGUgYW5kIGRvdWJsZSBxdW90ZXMgYW5kIGJhY2tzbGFzaCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFhBUkdTCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU3VwcG9ydCBxdW90aW5nIGluIHRoZSBpbnB1dC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfWEFSR1NfU1VQUE9SVF9URVJNT1BUCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC14OiBleGl0IGlmIC1zIG9yIC1uIGlzIGV4Y2VlZGVkIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gWEFSR1MKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdXBwb3J0IC14OiBleGl0IGlmIHRoZSBjb21tYW5kIHNpemUgKHNlZSB0aGUgLXMgb3IgLW4gb3B0aW9uKQorLy9jb25maWc6CSAgaXMgZXhjZWVkZWQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIC0wOiBOVUwtdGVybWluYXRlZCBpbnB1dCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFhBUkdTCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU3VwcG9ydCAtMDogaW5wdXQgaXRlbXMgYXJlIHRlcm1pbmF0ZWQgYnkgYSBOVUwgY2hhcmFjdGVyCisvL2NvbmZpZzoJICBpbnN0ZWFkIG9mIHdoaXRlc3BhY2UsIGFuZCB0aGUgcXVvdGVzIGFuZCBiYWNrc2xhc2gKKy8vY29uZmlnOgkgIGFyZSBub3Qgc3BlY2lhbC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfWEFSR1NfU1VQUE9SVF9SRVBMX1NUUgorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAtSSBTVFI6IHN0cmluZyB0byByZXBsYWNlIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gWEFSR1MKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdXBwb3J0IC1JIFNUUiBhbmQgLWlbU1RSXSBvcHRpb25zLgorCisvL2FwcGxldDpJRl9YQVJHUyhBUFBMRVRfTk9FWEVDKHhhcmdzLCB4YXJncywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgeGFyZ3MpKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfWEFSR1MpICs9IHhhcmdzLm8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgaXMgYSBOT0VYRUMgYXBwbGV0LiBCZSB2ZXJ5IGNhcmVmdWwhICovCisKKworLy8jZGVmaW5lIGRiZ19tc2coLi4uKSBiYl9lcnJvcl9tc2coX19WQV9BUkdTX18pCisjZGVmaW5lIGRiZ19tc2coLi4uKSAoKHZvaWQpMCkKKworCisjaWZkZWYgVEVTVAorIyBpZm5kZWYgRU5BQkxFX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT04KKyMgIGRlZmluZSBFTkFCTEVfRkVBVFVSRV9YQVJHU19TVVBQT1JUX0NPTkZJUk1BVElPTiAxCisjIGVuZGlmCisjIGlmbmRlZiBFTkFCTEVfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1FVT1RFUworIyAgZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfUVVPVEVTIDEKKyMgZW5kaWYKKyMgaWZuZGVmIEVOQUJMRV9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfVEVSTU9QVAorIyAgZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfVEVSTU9QVCAxCisjIGVuZGlmCisjIGlmbmRlZiBFTkFCTEVfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1pFUk9fVEVSTQorIyAgZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfWkVST19URVJNIDEKKyMgZW5kaWYKKyNlbmRpZgorCisKK3N0cnVjdCBnbG9iYWxzIHsKKwljaGFyICoqYXJnczsKKyNpZiBFTkFCTEVfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1JFUExfU1RSCisJY2hhciAqKmFyZ3Y7CisJY29uc3QgY2hhciAqcmVwbF9zdHI7CisJY2hhciBlb2xfY2g7CisjZW5kaWYKKwljb25zdCBjaGFyICplb2Zfc3RyOworCWludCBpZHg7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlHLmVvZl9zdHIgPSBOVUxMOyAvKiBuZWVkIHRvIGNsZWFyIGJ5IGhhbmQgYmVjYXVzZSB3ZSBhcmUgTk9FWEVDIGFwcGxldCAqLyBcCisJSUZfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1JFUExfU1RSKEcucmVwbF9zdHIgPSAie30iOykgXAorCUlGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9SRVBMX1NUUihHLmVvbF9jaCA9ICdcbic7KSBcCit9IHdoaWxlICgwKQorCisKK3N0YXRpYyBpbnQgeGFyZ3NfZXhlYyh2b2lkKQoreworCWludCBzdGF0dXM7CisKKwlzdGF0dXMgPSBzcGF3bl9hbmRfd2FpdChHLmFyZ3MpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKEcuYXJnc1swXSk7CisJCXJldHVybiBlcnJubyA9PSBFTk9FTlQgPyAxMjcgOiAxMjY7CisJfQorCWlmIChzdGF0dXMgPT0gMjU1KSB7CisJCWJiX2Vycm9yX21zZygiJXM6IGV4aXRlZCB3aXRoIHN0YXR1cyAyNTU7IGFib3J0aW5nIiwgRy5hcmdzWzBdKTsKKwkJcmV0dXJuIDEyNDsKKwl9CisJaWYgKHN0YXR1cyA+PSAweDE4MCkgeworCQliYl9lcnJvcl9tc2coIiclcycgdGVybWluYXRlZCBieSBzaWduYWwgJWQiLAorCQkJRy5hcmdzWzBdLCBzdGF0dXMgLSAweDE4MCk7CisJCXJldHVybiAxMjU7CisJfQorCWlmIChzdGF0dXMpCisJCXJldHVybiAxMjM7CisJcmV0dXJuIDA7Cit9CisKKy8qIEluIFBPU0lYL0MgbG9jYWxlIGlzc3BhY2UgaXMgb25seSB0aGVzZSBjaGFyczogIlx0XG5cdlxmXHIiIGFuZCBzcGFjZS4KKyAqICJcdFxuXHZcZlxyIiBoYXBwZW4gdG8gaGF2ZSBBU0NJSSBjb2RlcyA5LDEwLDExLDEyLDEzLgorICovCisjZGVmaW5lIElTU1BBQ0UoYSkgKHsgdW5zaWduZWQgY2hhciB4YXJnc19faXNzcGFjZSA9IChhKSAtIDk7IHhhcmdzX19pc3NwYWNlID09ICgnICcgLSA5KSB8fCB4YXJnc19faXNzcGFjZSA8PSAoMTMgLSA5KTsgfSkKKworc3RhdGljIHZvaWQgc3RvcmVfcGFyYW0oY2hhciAqcykKK3sKKwkvKiBHcm93IGJ5IDI1NiBlbGVtZW50cyBhdCBvbmNlICovCisJaWYgKCEoRy5pZHggJiAweGZmKSkgeyAvKiBHLmlkeCA9PSBOKjI1NiAqLworCQkvKiBFbmxhcmdlLCBtYWtlIEcuYXJnc1soTisxKSoyNTYgLSAxXSBsYXN0IHZhbGlkIGlkeCAqLworCQlHLmFyZ3MgPSB4cmVhbGxvYyhHLmFyZ3MsIHNpemVvZihHLmFyZ3NbMF0pICogKEcuaWR4ICsgMHgxMDApKTsKKwl9CisJRy5hcmdzW0cuaWR4KytdID0gczsKK30KKworLyogcHJvY2Vzc1swXV9zdGRpbjoKKyAqIFJlYWQgY2hhcmFjdGVycyBpbnRvIGJ1ZltuX21heF9jaGFycysxXSwgYW5kIHdoZW4gcGFyYW1ldGVyIGRlbGltaXRlcgorICogaXMgc2Vlbiwgc3RvcmUgdGhlIGFkZHJlc3Mgb2YgYSBuZXcgcGFyYW1ldGVyIHRvIGFyZ3NbXS4KKyAqIElmIHJlYWRpbmcgZGlzY292ZXJzIHRoYXQgbGFzdCBjaGFycyBkbyBub3QgZm9ybSB0aGUgY29tcGxldGUKKyAqIHBhcmFtZXRlciwgdGhlIHBvaW50ZXIgdG8gdGhlIGZpcnN0IHN1Y2ggInRhaWwgY2hhcmFjdGVyIiBpcyByZXR1cm5lZC4KKyAqIChidWYgaGFzIGV4dHJhIGJ5dGUgYXQgdGhlIGVuZCB0byBhY2NvbW1vZGF0ZSB0ZXJtaW5hdGluZyBOVUwKKyAqIG9mICJ0YWlsIGNoYXJhY3RlcnMiIHN0cmluZykuCisgKiBPdGhlcndpc2UsIHRoZSByZXR1cm5lZCBwb2ludGVyIHBvaW50cyB0byBOVUwgYnl0ZS4KKyAqIE9uIGVudHJ5LCBidWZbXSBtYXkgY29udGFpbiBzb21lICJzZWVkIGNoYXJzIiB3aGljaCBhcmUgdG8gYmVjb21lCisgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaXJzdCBwYXJhbWV0ZXIuCisgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfUVVPVEVTCitzdGF0aWMgY2hhciogRkFTVF9GVU5DIHByb2Nlc3Nfc3RkaW4oaW50IG5fbWF4X2NoYXJzLCBpbnQgbl9tYXhfYXJnLCBjaGFyICpidWYpCit7CisjZGVmaW5lIE5PUk0gICAgICAwCisjZGVmaW5lIFFVT1RFICAgICAxCisjZGVmaW5lIEJBQ0tTTEFTSCAyCisjZGVmaW5lIFNQQUNFICAgICA0CisJY2hhciBxID0gJ1wwJzsgICAgICAgICAgICAgLyogcXVvdGUgY2hhciAqLworCWNoYXIgc3RhdGUgPSBOT1JNOworCWNoYXIgKnMgPSBidWY7ICAgICAgICAgICAgIC8qIHN0YXJ0IG9mIHRoZSB3b3JkICovCisJY2hhciAqcCA9IHMgKyBzdHJsZW4oYnVmKTsgLyogZW5kIG9mIHRoZSB3b3JkICovCisKKwlidWYgKz0gbl9tYXhfY2hhcnM7ICAgICAgICAvKiBwYXN0IGJ1ZmZlcidzIGVuZCAqLworCisJLyogImdvdG8gcmV0IiBpcyB1c2VkIGluc3RlYWQgb2YgImJyZWFrIiB0byBtYWtlIGNvbnRyb2wgZmxvdworCSAqIG1vcmUgb2J2aW91czogKi8KKworCXdoaWxlICgxKSB7CisJCWludCBjID0gZ2V0Y2hhcigpOworCQlpZiAoYyA9PSBFT0YpIHsKKwkJCWlmIChwICE9IHMpCisJCQkJZ290byBjbG9zZV93b3JkOworCQkJZ290byByZXQ7CisJCX0KKwkJaWYgKHN0YXRlID09IEJBQ0tTTEFTSCkgeworCQkJc3RhdGUgPSBOT1JNOworCQkJZ290byBzZXQ7CisJCX0KKwkJaWYgKHN0YXRlID09IFFVT1RFKSB7CisJCQlpZiAoYyAhPSBxKQorCQkJCWdvdG8gc2V0OworCQkJcSA9ICdcMCc7CisJCQlzdGF0ZSA9IE5PUk07CisJCX0gZWxzZSB7IC8qIGlmIChzdGF0ZSA9PSBOT1JNKSAqLworCQkJaWYgKElTU1BBQ0UoYykpIHsKKwkJCQlpZiAocCAhPSBzKSB7CisgY2xvc2Vfd29yZDoKKwkJCQkJc3RhdGUgPSBTUEFDRTsKKwkJCQkJYyA9ICdcMCc7CisJCQkJCWdvdG8gc2V0OworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGMgPT0gJ1xcJykgeworCQkJCQlzdGF0ZSA9IEJBQ0tTTEFTSDsKKwkJCQl9IGVsc2UgaWYgKGMgPT0gJ1wnJyB8fCBjID09ICciJykgeworCQkJCQlxID0gYzsKKwkJCQkJc3RhdGUgPSBRVU9URTsKKwkJCQl9IGVsc2UgeworIHNldDoKKwkJCQkJKnArKyA9IGM7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChzdGF0ZSA9PSBTUEFDRSkgeyAgIC8qIHdvcmQncyBkZWxpbWl0ZXIgb3IgRU9GIGRldGVjdGVkICovCisJCQlpZiAocSkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bm1hdGNoZWQgJXMgcXVvdGUiLAorCQkJCQlxID09ICdcJycgPyAic2luZ2xlIiA6ICJkb3VibGUiKTsKKwkJCX0KKwkJCS8qIEEgZnVsbCB3b3JkIGlzIGxvYWRlZCAqLworCQkJaWYgKEcuZW9mX3N0cikgeworCQkJCWlmIChzdHJjbXAocywgRy5lb2Zfc3RyKSA9PSAwKSB7CisJCQkJCXdoaWxlIChnZXRjaGFyKCkgIT0gRU9GKQorCQkJCQkJY29udGludWU7CisJCQkJCXAgPSBzOworCQkJCQlnb3RvIHJldDsKKwkJCQl9CisJCQl9CisJCQlzdG9yZV9wYXJhbShzKTsKKwkJCWRiZ19tc2coImFyZ3NbXTonJXMnIiwgcyk7CisJCQlzID0gcDsKKwkJCW5fbWF4X2FyZy0tOworCQkJaWYgKG5fbWF4X2FyZyA9PSAwKSB7CisJCQkJZ290byByZXQ7CisJCQl9CisJCQlzdGF0ZSA9IE5PUk07CisJCX0KKwkJaWYgKHAgPT0gYnVmKSB7CisJCQlnb3RvIHJldDsKKwkJfQorCX0KKyByZXQ6CisJKnAgPSAnXDAnOworCS8qIHN0b3JlX3BhcmFtKE5VTEwpIC0gY2FsbGVyIHdpbGwgZG8gaXQgKi8KKwlkYmdfbXNnKCJyZXR1cm46JyVzJyIsIHMpOworCXJldHVybiBzOworfQorI2Vsc2UKKy8qIFRoZSB2YXJpYW50IGRvZXMgbm90IHN1cHBvcnQgc2luZ2xlIHF1b3RlcywgZG91YmxlIHF1b3RlcyBvciBiYWNrc2xhc2ggKi8KK3N0YXRpYyBjaGFyKiBGQVNUX0ZVTkMgcHJvY2Vzc19zdGRpbihpbnQgbl9tYXhfY2hhcnMsIGludCBuX21heF9hcmcsIGNoYXIgKmJ1ZikKK3sKKwljaGFyICpzID0gYnVmOyAgICAgICAgICAgICAvKiBzdGFydCBvZiB0aGUgd29yZCAqLworCWNoYXIgKnAgPSBzICsgc3RybGVuKGJ1Zik7IC8qIGVuZCBvZiB0aGUgd29yZCAqLworCisJYnVmICs9IG5fbWF4X2NoYXJzOyAgICAgICAgLyogcGFzdCBidWZmZXIncyBlbmQgKi8KKworCXdoaWxlICgxKSB7CisJCWludCBjID0gZ2V0Y2hhcigpOworCQlpZiAoYyA9PSBFT0YpIHsKKwkJCWlmIChwID09IHMpCisJCQkJZ290byByZXQ7CisJCX0KKwkJaWYgKGMgPT0gRU9GIHx8IElTU1BBQ0UoYykpIHsKKwkJCWlmIChwID09IHMpCisJCQkJY29udGludWU7CisJCQljID0gRU9GOworCQl9CisJCSpwKysgPSAoYyA9PSBFT0YgPyAnXDAnIDogYyk7CisJCWlmIChjID09IEVPRikgeyAvKiB3b3JkJ3MgZGVsaW1pdGVyIG9yIEVPRiBkZXRlY3RlZCAqLworCQkJLyogQSBmdWxsIHdvcmQgaXMgbG9hZGVkICovCisJCQlpZiAoRy5lb2Zfc3RyKSB7CisJCQkJaWYgKHN0cmNtcChzLCBHLmVvZl9zdHIpID09IDApIHsKKwkJCQkJd2hpbGUgKGdldGNoYXIoKSAhPSBFT0YpCisJCQkJCQljb250aW51ZTsKKwkJCQkJcCA9IHM7CisJCQkJCWdvdG8gcmV0OworCQkJCX0KKwkJCX0KKwkJCXN0b3JlX3BhcmFtKHMpOworCQkJZGJnX21zZygiYXJnc1tdOiclcyciLCBzKTsKKwkJCXMgPSBwOworCQkJbl9tYXhfYXJnLS07CisJCQlpZiAobl9tYXhfYXJnID09IDApIHsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKwkJfQorCQlpZiAocCA9PSBidWYpIHsKKwkJCWdvdG8gcmV0OworCQl9CisJfQorIHJldDoKKwkqcCA9ICdcMCc7CisJLyogc3RvcmVfcGFyYW0oTlVMTCkgLSBjYWxsZXIgd2lsbCBkbyBpdCAqLworCWRiZ19tc2coInJldHVybjonJXMnIiwgcyk7CisJcmV0dXJuIHM7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9YQVJHU19TVVBQT1JUX1FVT1RFUyAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9aRVJPX1RFUk0KK3N0YXRpYyBjaGFyKiBGQVNUX0ZVTkMgcHJvY2VzczBfc3RkaW4oaW50IG5fbWF4X2NoYXJzLCBpbnQgbl9tYXhfYXJnLCBjaGFyICpidWYpCit7CisJY2hhciAqcyA9IGJ1ZjsgICAgICAgICAgICAgLyogc3RhcnQgb2YgdGhlIHdvcmQgKi8KKwljaGFyICpwID0gcyArIHN0cmxlbihidWYpOyAvKiBlbmQgb2YgdGhlIHdvcmQgKi8KKworCWJ1ZiArPSBuX21heF9jaGFyczsgICAgICAgIC8qIHBhc3QgYnVmZmVyJ3MgZW5kICovCisKKwl3aGlsZSAoMSkgeworCQlpbnQgYyA9IGdldGNoYXIoKTsKKwkJaWYgKGMgPT0gRU9GKSB7CisJCQlpZiAocCA9PSBzKQorCQkJCWdvdG8gcmV0OworCQkJYyA9ICdcMCc7CisJCX0KKwkJKnArKyA9IGM7CisJCWlmIChjID09ICdcMCcpIHsgICAvKiBOVUwgb3IgRU9GIGRldGVjdGVkICovCisJCQkvKiBBIGZ1bGwgd29yZCBpcyBsb2FkZWQgKi8KKwkJCXN0b3JlX3BhcmFtKHMpOworCQkJZGJnX21zZygiYXJnc1tdOiclcyciLCBzKTsKKwkJCXMgPSBwOworCQkJbl9tYXhfYXJnLS07CisJCQlpZiAobl9tYXhfYXJnID09IDApIHsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKwkJfQorCQlpZiAocCA9PSBidWYpIHsKKwkJCWdvdG8gcmV0OworCQl9CisJfQorIHJldDoKKwkqcCA9ICdcMCc7CisJLyogc3RvcmVfcGFyYW0oTlVMTCkgLSBjYWxsZXIgd2lsbCBkbyBpdCAqLworCWRiZ19tc2coInJldHVybjonJXMnIiwgcyk7CisJcmV0dXJuIHM7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9YQVJHU19TVVBQT1JUX1pFUk9fVEVSTSAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9SRVBMX1NUUgorLyoKKyAqIFVzZWQgaWYgLUk8cmVwbD4gd2FzIHNwZWNpZmllZC4KKyAqIEluIHRoaXMgbW9kZSwgd29yZHMgYXJlbid0IGFwcGVuZGVkIHRvIFBST0cgQVJHUy4KKyAqIEluc3RlYWQsIGVudGlyZSBpbnB1dCBsaW5lIGlzIHJlYWQsIHRoZW4gPHJlcGw+IHN0cmluZworICogaW4gZXZlcnkgUFJPRyBhbmQgQVJHIGlzIHJlcGxhY2VkIHdpdGggdGhlIGxpbmU6CisgKiAgZWNobyAtZSAiaG8gaG9cbmhpIiB8IHhhcmdzIC1JXyBjbWQgX18gXworICogcmVzdWx0cyBpbiAiY21kICdobyBob2hvIGhvJyAnaG8gaG8nIjsgImNtZCAnaGloaScgJ2hpJyIuCisgKiAtbiBNQVhfQVJHUyBzZWVtcyB0byBiZSBpZ25vcmVkLgorICogVGVzdGVkIHdpdGggR05VIGZpbmR1dGlscyA0LjUuMTAuCisgKi8KKy8vRklYTUU6IG5fbWF4X2NoYXJzIGlzIG5vdCBoYW5kbGVkIHRoZSBzYW1lIHdheSBhcyBpbiBHTlUgZmluZHV0aWxzLgorLy9GSVhNRTogcXVvdGluZyBpcyBub3QgaW1wbGVtZW50ZWQuCitzdGF0aWMgY2hhciogRkFTVF9GVU5DIHByb2Nlc3Nfc3RkaW5fd2l0aF9yZXBsYWNlKGludCBuX21heF9jaGFycywgaW50IG5fbWF4X2FyZyBVTlVTRURfUEFSQU0sIGNoYXIgKmJ1ZikKK3sKKwlpbnQgaTsKKwljaGFyICplbmQsICpwOworCisJLyogRnJlZSBzdHJpbmdzIGZyb20gbGFzdCBpbnZvY2F0aW9uLCBpZiBhbnkgKi8KKwlmb3IgKGkgPSAwOyBHLmFyZ3MgJiYgRy5hcmdzW2ldOyBpKyspCisJCWlmIChHLmFyZ3NbaV0gIT0gRy5hcmd2W2ldKQorCQkJZnJlZShHLmFyZ3NbaV0pOworCisJZW5kID0gYnVmICsgbl9tYXhfY2hhcnM7CisJcCA9IGJ1ZjsKKworCXdoaWxlICgxKSB7CisJCWludCBjID0gZ2V0Y2hhcigpOworCQlpZiAoYyA9PSBFT0YgfHwgYyA9PSBHLmVvbF9jaCkgeworCQkJaWYgKHAgPT0gYnVmKQorCQkJCWdvdG8gcmV0OyAvKiBlbXB0eSBsaW5lICovCisJCQljID0gJ1wwJzsKKwkJfQorCQkqcCsrID0gYzsKKwkJaWYgKGMgPT0gJ1wwJykgeyAgIC8qIEVPTCBvciBFT0YgZGV0ZWN0ZWQgKi8KKwkJCWkgPSAwOworCQkJd2hpbGUgKEcuYXJndltpXSkgeworCQkJCWNoYXIgKmFyZyA9IEcuYXJndltpXTsKKwkJCQlpbnQgY291bnQgPSBjb3VudF9zdHJzdHIoYXJnLCBHLnJlcGxfc3RyKTsKKwkJCQlpZiAoY291bnQgIT0gMCkKKwkJCQkJYXJnID0geG1hbGxvY19zdWJzdGl0dXRlX3N0cmluZyhhcmcsIGNvdW50LCBHLnJlcGxfc3RyLCBidWYpOworCQkJCXN0b3JlX3BhcmFtKGFyZyk7CisJCQkJZGJnX21zZygiYXJnc1tdOiclcyciLCBhcmcpOworCQkJCWkrKzsKKwkJCX0KKwkJCXAgPSBidWY7CisJCQlnb3RvIHJldDsKKwkJfQorCQlpZiAocCA9PSBlbmQpIHsKKwkJCWdvdG8gcmV0OworCQl9CisJfQorIHJldDoKKwkqcCA9ICdcMCc7CisJLyogc3RvcmVfcGFyYW0oTlVMTCkgLSBjYWxsZXIgd2lsbCBkbyBpdCAqLworCWRiZ19tc2coInJldHVybjonJXMnIiwgYnVmKTsKKwlyZXR1cm4gYnVmOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9YQVJHU19TVVBQT1JUX0NPTkZJUk1BVElPTgorLyogUHJvbXB0IHRoZSB1c2VyIGZvciBhIHJlc3BvbnNlLCBhbmQKKyAqIGlmIHVzZXIgcmVzcG9uZHMgYWZmaXJtYXRpdmVseSwgcmV0dXJuIHRydWU7CisgKiBvdGhlcndpc2UsIHJldHVybiBmYWxzZS4gVXNlcyAiL2Rldi90dHkiLCBub3Qgc3RkaW4uCisgKi8KK3N0YXRpYyBpbnQgeGFyZ3NfYXNrX2NvbmZpcm1hdGlvbih2b2lkKQoreworCUZJTEUgKnR0eV9zdHJlYW07CisJaW50IGMsIHNhdmVjOworCisJdHR5X3N0cmVhbSA9IHhmb3Blbl9mb3JfcmVhZChDVVJSRU5UX1RUWSk7CisJZnB1dHMoIiA/Li4uIiwgc3RkZXJyKTsKKwlmZmx1c2hfYWxsKCk7CisJYyA9IHNhdmVjID0gZ2V0Yyh0dHlfc3RyZWFtKTsKKwl3aGlsZSAoYyAhPSBFT0YgJiYgYyAhPSAnXG4nKQorCQljID0gZ2V0Yyh0dHlfc3RyZWFtKTsKKwlmY2xvc2UodHR5X3N0cmVhbSk7CisJcmV0dXJuIChzYXZlYyA9PSAneScgfHwgc2F2ZWMgPT0gJ1knKTsKK30KKyNlbHNlCisjIGRlZmluZSB4YXJnc19hc2tfY29uZmlybWF0aW9uKCkgMQorI2VuZGlmCisKKy8vdXNhZ2U6I2RlZmluZSB4YXJnc190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFtQUk9HIEFSR1NdIgorLy91c2FnZTojZGVmaW5lIHhhcmdzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUnVuIFBST0cgb24gZXZlcnkgaXRlbSBnaXZlbiBieSBzdGRpblxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9YQVJHU19TVVBQT1JUX0NPTkZJUk1BVElPTigKKy8vdXNhZ2U6ICAgICAiXG4JLXAJQXNrIHVzZXIgd2hldGhlciB0byBydW4gZWFjaCBjb21tYW5kIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktcglEb24ndCBydW4gY29tbWFuZCBpZiBpbnB1dCBpcyBlbXB0eSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9aRVJPX1RFUk0oCisvL3VzYWdlOiAgICAgIlxuCS0wCUlucHV0IGlzIHNlcGFyYXRlZCBieSBOVUwgY2hhcmFjdGVycyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXQJUHJpbnQgdGhlIGNvbW1hbmQgb24gc3RkZXJyIGJlZm9yZSBleGVjdXRpb24iCisvL3VzYWdlOiAgICAgIlxuCS1lW1NUUl0JU1RSIHN0b3BzIGlucHV0IHByb2Nlc3NpbmciCisvL3VzYWdlOiAgICAgIlxuCS1uIE4JUGFzcyBubyBtb3JlIHRoYW4gTiBhcmdzIHRvIFBST0ciCisvL3VzYWdlOiAgICAgIlxuCS1zIE4JUGFzcyBjb21tYW5kIGxpbmUgb2Ygbm8gbW9yZSB0aGFuIE4gYnl0ZXMiCisvL3VzYWdlOglJRl9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfUkVQTF9TVFIoCisvL3VzYWdlOiAgICAgIlxuCS1JIFNUUglSZXBsYWNlIFNUUiB3aXRoaW4gUFJPRyBBUkdTIHdpdGggaW5wdXQgbGluZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9URVJNT1BUKAorLy91c2FnZTogICAgICJcbgkteAlFeGl0IGlmIHNpemUgaXMgZXhjZWVkZWQiCisvL3VzYWdlOgkpCisvL3VzYWdlOiNkZWZpbmUgeGFyZ3NfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgbHMgfCB4YXJncyBnemlwXG4iCisvL3VzYWdlOiAgICAgICAiJCBmaW5kIC4gLW5hbWUgJyouYycgLXByaW50IHwgeGFyZ3Mgcm1cbiIKKworLyogQ29ycmVjdCByZWdhcmRsZXNzIG9mIGNvbWJpbmF0aW9uIG9mIENPTkZJR194eHggKi8KK2VudW0geworCU9QVEJJVF9WRVJCT1NFID0gMCwKKwlPUFRCSVRfTk9fRU1QVFksCisJT1BUQklUX1VQVE9fTlVNQkVSLAorCU9QVEJJVF9VUFRPX1NJWkUsCisJT1BUQklUX0VPRl9TVFJJTkcsCisJT1BUQklUX0VPRl9TVFJJTkcxLAorCUlGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT04oT1BUQklUX0lOVEVSQUNUSVZFLCkKKwlJRl9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfVEVSTU9QVCggICAgIE9QVEJJVF9URVJNSU5BVEUgICwpCisJSUZfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1pFUk9fVEVSTSggICBPUFRCSVRfWkVST1RFUk0gICAsKQorCUlGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9SRVBMX1NUUiggICAgT1BUQklUX1JFUExTVFIgICAgLCkKKwlJRl9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfUkVQTF9TVFIoICAgIE9QVEJJVF9SRVBMU1RSMSAgICwpCisKKwlPUFRfVkVSQk9TRSAgICAgPSAxIDw8IE9QVEJJVF9WRVJCT1NFICAgICwKKwlPUFRfTk9fRU1QVFkgICAgPSAxIDw8IE9QVEJJVF9OT19FTVBUWSAgICwKKwlPUFRfVVBUT19OVU1CRVIgPSAxIDw8IE9QVEJJVF9VUFRPX05VTUJFUiwKKwlPUFRfVVBUT19TSVpFICAgPSAxIDw8IE9QVEJJVF9VUFRPX1NJWkUgICwKKwlPUFRfRU9GX1NUUklORyAgPSAxIDw8IE9QVEJJVF9FT0ZfU1RSSU5HICwgLyogR05VOiAtZVs8cGFyYW0+XSAqLworCU9QVF9FT0ZfU1RSSU5HMSA9IDEgPDwgT1BUQklUX0VPRl9TVFJJTkcxLCAvKiBTVVM6IC1FPHBhcmFtPiAqLworCU9QVF9JTlRFUkFDVElWRSA9IElGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9DT05GSVJNQVRJT04oKDEgPDwgT1BUQklUX0lOVEVSQUNUSVZFKSkgKyAwLAorCU9QVF9URVJNSU5BVEUgICA9IElGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9URVJNT1BUKCAgICAgKDEgPDwgT1BUQklUX1RFUk1JTkFURSAgKSkgKyAwLAorCU9QVF9aRVJPVEVSTSAgICA9IElGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9aRVJPX1RFUk0oICAgKDEgPDwgT1BUQklUX1pFUk9URVJNICAgKSkgKyAwLAorCU9QVF9SRVBMU1RSICAgICA9IElGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9SRVBMX1NUUiggICAgKDEgPDwgT1BUQklUX1JFUExTVFIgICAgKSkgKyAwLAorCU9QVF9SRVBMU1RSMSAgICA9IElGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9SRVBMX1NUUiggICAgKDEgPDwgT1BUQklUX1JFUExTVFIxICAgKSkgKyAwLAorfTsKKyNkZWZpbmUgT1BUSU9OX1NUUiAiK3RybjpzOmU6OkU6IiBcCisJSUZfRkVBVFVSRV9YQVJHU19TVVBQT1JUX0NPTkZJUk1BVElPTigicCIpIFwKKwlJRl9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfVEVSTU9QVCggICAgICJ4IikgXAorCUlGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9aRVJPX1RFUk0oICAgIjAiKSBcCisJSUZfRkVBVFVSRV9YQVJHU19TVVBQT1JUX1JFUExfU1RSKCAgICAiSTppOjoiKQorCitpbnQgeGFyZ3NfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHhhcmdzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBpOworCWludCBjaGlsZF9lcnJvciA9IDA7CisJY2hhciAqbWF4X2FyZ3M7CisJY2hhciAqbWF4X2NoYXJzOworCWNoYXIgKmJ1ZjsKKwl1bnNpZ25lZCBvcHQ7CisJaW50IG5fbWF4X2NoYXJzOworCWludCBuX21heF9hcmc7CisjaWYgRU5BQkxFX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9aRVJPX1RFUk0gXAorIHx8IEVOQUJMRV9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfUkVQTF9TVFIKKwljaGFyKiBGQVNUX0ZVTkMgKCpyZWFkX2FyZ3MpKGludCwgaW50LCBjaGFyKikgPSBwcm9jZXNzX3N0ZGluOworI2Vsc2UKKyNkZWZpbmUgcmVhZF9hcmdzIHByb2Nlc3Nfc3RkaW4KKyNlbmRpZgorCisJSU5JVF9HKCk7CisKKyNpZiBFTkFCTEVfREVTS1RPUCAmJiBFTkFCTEVfTE9OR19PUFRTCisJLyogRm9yIGV4YW1wbGUsIEZlZG9yYSdzIGJ1aWxkIHN5c3RlbSB1c2VzIC0tbm8tcnVuLWlmLWVtcHR5ICovCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9CisJCSJuby1ydW4taWYtZW1wdHlcMCIgTm9fYXJndW1lbnQgInIiCisJCTsKKyNlbmRpZgorCW9wdCA9IGdldG9wdDMyKGFyZ3YsIE9QVElPTl9TVFIsCisJCSZtYXhfYXJncywgJm1heF9jaGFycywgJkcuZW9mX3N0ciwgJkcuZW9mX3N0cgorCQlJRl9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfUkVQTF9TVFIoLCAmRy5yZXBsX3N0ciwgJkcucmVwbF9zdHIpCisJKTsKKworCS8qIC1FICIiPyBZb3UgbWF5IHdvbmRlciB3aHkgbm90IGp1c3Qgb21pdCAtRT8KKwkgKiBUaGlzIGlzIHVzZWQgZm9yIHBvcnRhYmlsaXR5OgorCSAqIG9sZCB4YXJncyB3YXMgdXNpbmcgIl8iIGFzIGRlZmF1bHQgZm9yIC1FIC8gLWUgKi8KKwlpZiAoKG9wdCAmIE9QVF9FT0ZfU1RSSU5HMSkgJiYgRy5lb2Zfc3RyWzBdID09ICdcMCcpCisJCUcuZW9mX3N0ciA9IE5VTEw7CisKKwlpZiAob3B0ICYgT1BUX1pFUk9URVJNKSB7CisJCUlGX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9aRVJPX1RFUk0ocmVhZF9hcmdzID0gcHJvY2VzczBfc3RkaW47KQorCQlJRl9GRUFUVVJFX1hBUkdTX1NVUFBPUlRfUkVQTF9TVFIoRy5lb2xfY2ggPSAnXDAnOykKKwl9CisKKwlhcmd2ICs9IG9wdGluZDsKKwlhcmdjIC09IG9wdGluZDsKKwlpZiAoIWFyZ3ZbMF0pIHsKKwkJLyogZGVmYXVsdCBiZWhhdmlvciBpcyB0byBlY2hvIGFsbCB0aGUgZmlsZW5hbWVzICovCisJCSotLWFyZ3YgPSAoY2hhciopImVjaG8iOworCQlhcmdjKys7CisJfQorCisJLyoKKwkgKiBUaGUgT3BlbiBHcm91cCBCYXNlIFNwZWNpZmljYXRpb25zIElzc3VlIDY6CisJICogIlRoZSB4YXJncyB1dGlsaXR5IHNoYWxsIGxpbWl0IHRoZSBjb21tYW5kIGxpbmUgbGVuZ3RoIHN1Y2ggdGhhdAorCSAqIHdoZW4gdGhlIGNvbW1hbmQgbGluZSBpcyBpbnZva2VkLCB0aGUgY29tYmluZWQgYXJndW1lbnQKKwkgKiBhbmQgZW52aXJvbm1lbnQgbGlzdHMgKHNlZSB0aGUgZXhlYyBmYW1pbHkgb2YgZnVuY3Rpb25zCisJICogaW4gdGhlIFN5c3RlbSBJbnRlcmZhY2VzIHZvbHVtZSBvZiBJRUVFIFN0ZCAxMDAzLjEtMjAwMSkKKwkgKiBzaGFsbCBub3QgZXhjZWVkIHtBUkdfTUFYfS0yMDQ4IGJ5dGVzIi4KKwkgKi8KKwluX21heF9jaGFycyA9IGJiX2FyZ19tYXgoKTsKKwlpZiAobl9tYXhfY2hhcnMgPiAzMiAqIDEwMjQpCisJCW5fbWF4X2NoYXJzID0gMzIgKiAxMDI0OworCS8qCisJICogUE9TSVggc3VnZ2VzdHMgc3Vic3RyYWN0aW5nIDIwNDggYnl0ZXMgZnJvbSBzeXNjb25mKF9TQ19BUkdfTUFYKQorCSAqIHNvIHRoYXQgdGhlIHByb2Nlc3MgbWF5IHNhZmVseSBtb2RpZnkgaXRzIGVudmlyb25tZW50LgorCSAqLworCW5fbWF4X2NoYXJzIC09IDIwNDg7CisKKwlpZiAob3B0ICYgT1BUX1VQVE9fU0laRSkgeworCQluX21heF9jaGFycyA9IHhhdG91X3JhbmdlKG1heF9jaGFycywgMSwgSU5UX01BWCk7CisJfQorCS8qIEFjY291bnQgZm9yIHByZXBlbmRlZCBmaXhlZCBhcmd1bWVudHMgKi8KKwl7CisJCXNpemVfdCBuX2NoYXJzID0gMDsKKwkJZm9yIChpID0gMDsgYXJndltpXTsgaSsrKSB7CisJCQluX2NoYXJzICs9IHN0cmxlbihhcmd2W2ldKSArIDE7CisJCX0KKwkJbl9tYXhfY2hhcnMgLT0gbl9jaGFyczsKKwl9CisJLyogU2FuaXR5IGNoZWNrICovCisJaWYgKG5fbWF4X2NoYXJzIDw9IDApIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGZpdCBzaW5nbGUgYXJndW1lbnQgd2l0aGluIGFyZ3VtZW50IGxpc3Qgc2l6ZSBsaW1pdCIpOworCX0KKworCWJ1ZiA9IHh6YWxsb2Mobl9tYXhfY2hhcnMgKyAxKTsKKworCW5fbWF4X2FyZyA9IG5fbWF4X2NoYXJzOworCWlmIChvcHQgJiBPUFRfVVBUT19OVU1CRVIpIHsKKwkJbl9tYXhfYXJnID0geGF0b3VfcmFuZ2UobWF4X2FyZ3MsIDEsIElOVF9NQVgpOworCQkvKiBOb3QgbmVjZXNzYXJ5LCB3ZSB1c2UgZ3Jvd2FibGUgYXJnc1tdOiAqLworCQkvKiBpZiAobl9tYXhfYXJnID4gbl9tYXhfY2hhcnMpIG5fbWF4X2FyZyA9IG5fbWF4X2NoYXJzICovCisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfWEFSR1NfU1VQUE9SVF9SRVBMX1NUUgorCWlmIChvcHQgJiAoT1BUX1JFUExTVFIgfCBPUFRfUkVQTFNUUjEpKSB7CisJCS8qCisJCSAqIC1JPHN0cj46CisJCSAqIFVubW9kaWZpZWQgYXJncyBhcmUga2VwdCBpbiBHLmFyZ3ZbaV0sCisJCSAqIEcuYXJnc1tpXSByZWNlaXZlcyBtYWxsb2NlZCBHLmFyZ3ZbaV0gd2l0aCA8c3RyPiByZXBsYWNlZAorCQkgKiB3aXRoIGlucHV0IGxpbmUuIFNldHRpbmcgdGhpcyB1cDoKKwkJICovCisJCUcuYXJncyA9IE5VTEw7CisJCUcuYXJndiA9IGFyZ3Y7CisJCWFyZ2MgPSAwOworCQlyZWFkX2FyZ3MgPSBwcm9jZXNzX3N0ZGluX3dpdGhfcmVwbGFjZTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJLyogQWxsb2NhdGUgcG9pbnRlcnMgZm9yIGV4ZWN2cC4KKwkJICogV2UgY2FuIHN0YXRpY2FsbHkgYWxsb2NhdGUgKGFyZ2MgKyBuX21heF9hcmcgKyAxKSBlbGVtZW50cworCQkgKiBhbmQgZG8gbm90IGJvdGhlciB3aXRoIHJlc2l6aW5nIGFyZ3NbXSwgYnV0IG9uIDY0LWJpdCBtYWNoaW5lcworCQkgKiB0aGlzIHJlc3VsdHMgaW4gYXJnc1tdIHZlY3RvciB3aGljaCBpcyB+OCB0aW1lcyBiaWdnZXIKKwkJICogdGhhbiBuX21heF9jaGFycyEgVGhhdCBpcywgd2l0aCBuX21heF9jaGFycyA9PSAyMGssCisJCSAqIGFyZ3NbXSB3aWxsIHRha2UgMTYwayAoISksIHdoaWNoIHdpbGwgbW9zdCBsaWtlbHkgYmUKKwkJICogYWxtb3N0IGVudGlyZWx5IHVudXNlZC4KKwkJICoKKwkJICogU2VlIHN0b3JlX3BhcmFtKCkgZm9yIG1hdGNoaW5nIDI1Ni1zdGVwIGdyb3d0aCBsb2dpYworCQkgKi8KKwkJRy5hcmdzID0geG1hbGxvYyhzaXplb2YoRy5hcmdzWzBdKSAqICgoYXJnYyArIDB4ZmYpICYgfjB4ZmYpKTsKKwkJLyogU3RvcmUgdGhlIGNvbW1hbmQgdG8gYmUgZXhlY3V0ZWQsIHBhcnQgMSAqLworCQlmb3IgKGkgPSAwOyBhcmd2W2ldOyBpKyspCisJCQlHLmFyZ3NbaV0gPSBhcmd2W2ldOworCX0KKworCXdoaWxlICgxKSB7CisJCWNoYXIgKnJlbTsKKworCQlHLmlkeCA9IGFyZ2M7CisJCXJlbSA9IHJlYWRfYXJncyhuX21heF9jaGFycywgbl9tYXhfYXJnLCBidWYpOworCQlzdG9yZV9wYXJhbShOVUxMKTsKKworCQlpZiAoIUcuYXJnc1thcmdjXSkgeworCQkJaWYgKCpyZW0gIT0gJ1wwJykKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYXJndW1lbnQgbGluZSB0b28gbG9uZyIpOworCQkJaWYgKG9wdCAmIE9QVF9OT19FTVBUWSkKKwkJCQlicmVhazsKKwkJfQorCQlvcHQgfD0gT1BUX05PX0VNUFRZOworCisJCWlmIChvcHQgJiAoT1BUX0lOVEVSQUNUSVZFIHwgT1BUX1ZFUkJPU0UpKSB7CisJCQljb25zdCBjaGFyICpmbXQgPSAiICVzIiArIDE7CisJCQljaGFyICoqYXJncyA9IEcuYXJnczsKKwkJCWZvciAoaSA9IDA7IGFyZ3NbaV07IGkrKykgeworCQkJCWZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ3NbaV0pOworCQkJCWZtdCA9ICIgJXMiOworCQkJfQorCQkJaWYgKCEob3B0ICYgT1BUX0lOVEVSQUNUSVZFKSkKKwkJCQliYl9wdXRjaGFyX3N0ZGVycignXG4nKTsKKwkJfQorCisJCWlmICghKG9wdCAmIE9QVF9JTlRFUkFDVElWRSkgfHwgeGFyZ3NfYXNrX2NvbmZpcm1hdGlvbigpKSB7CisJCQljaGlsZF9lcnJvciA9IHhhcmdzX2V4ZWMoKTsKKwkJfQorCisJCWlmIChjaGlsZF9lcnJvciA+IDAgJiYgY2hpbGRfZXJyb3IgIT0gMTIzKSB7CisJCQlicmVhazsKKwkJfQorCisJCW92ZXJsYXBwaW5nX3N0cmNweShidWYsIHJlbSk7CisJfSAvKiB3aGlsZSAqLworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZyZWUoRy5hcmdzKTsKKwkJZnJlZShidWYpOworCX0KKworCXJldHVybiBjaGlsZF9lcnJvcjsKK30KKworCisjaWZkZWYgVEVTVAorCitjb25zdCBjaGFyICphcHBsZXRfbmFtZSA9ICJkZWJ1ZyBzdHVmZiB1c2FnZSI7CisKK3ZvaWQgYmJfc2hvd191c2FnZSh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIFstcF0gWy1yXSBbLXRdIC1beF0gWy1uIG1heF9hcmddIFstcyBtYXhfY2hhcnNdXG4iLAorCQlhcHBsZXRfbmFtZSk7CisJZXhpdChFWElUX0ZBSUxVUkUpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIHhhcmdzX21haW4oYXJnYywgYXJndik7Cit9CisjZW5kaWYgLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hcHBsZXRfbWV0YWRhdGEuaCBiL2luY2x1ZGUvYXBwbGV0X21ldGFkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2ZWYzNQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXBwbGV0X21ldGFkYXRhLmgKQEAgLTAsMCArMSwzMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2lmbmRlZiBBUFBMRVRfTUVUQURBVEFfSAorI2RlZmluZSBBUFBMRVRfTUVUQURBVEFfSCAxCisKKy8qIE5vdGU6IGNhbiBiZSBpbmNsdWRlZCBieSBib3RoIGhvc3QgYW5kIHRhcmdldCBidWlsZHMhICovCisKKy8qIG9yZGVyIG1hdHRlcnM6IHVzZWQgYXMgaW5kZXggaW50byAiaW5zdGFsbF9kaXJbXSIgaW4gYXBwbGV0bGliLmMgKi8KK3R5cGVkZWYgZW51bSBiYl9pbnN0YWxsX2xvY190IHsKKwlCQl9ESVJfUk9PVCA9IDAsCisJQkJfRElSX0JJTiwKKwlCQl9ESVJfU0JJTiwKKyNpZiBFTkFCTEVfSU5TVEFMTF9OT19VU1IKKwlCQl9ESVJfVVNSX0JJTiAgPSBCQl9ESVJfQklOLAorCUJCX0RJUl9VU1JfU0JJTiA9IEJCX0RJUl9TQklOLAorI2Vsc2UKKwlCQl9ESVJfVVNSX0JJTiwKKwlCQl9ESVJfVVNSX1NCSU4sCisjZW5kaWYKK30gYmJfaW5zdGFsbF9sb2NfdDsKKwordHlwZWRlZiBlbnVtIGJiX3N1aWRfdCB7CisJQkJfU1VJRF9EUk9QID0gMCwKKwlCQl9TVUlEX01BWUJFLAorCUJCX1NVSURfUkVRVUlSRQorfSBiYl9zdWlkX3Q7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hcHBsZXRzLnNyYy5oIGIvaW5jbHVkZS9hcHBsZXRzLnNyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYzgzZTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FwcGxldHMuc3JjLmgKQEAgLTAsMCArMSwzOTggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGFwcGxldHMuaCAtIGEgbGlzdGluZyBvZiBhbGwgYnVzeWJveCBhcHBsZXRzLgorICoKKyAqIElmIHlvdSB3cml0ZSBhIG5ldyBhcHBsZXQsIHlvdSBuZWVkIHRvIGFkZCBhbiBlbnRyeSB0byB0aGlzIGxpc3QgdG8gbWFrZQorICogYnVzeWJveCBhd2FyZSBvZiBpdC4KKyAqLworCisvKgorbmFtZSAgLSBhcHBsZXQgbmFtZSBhcyBpdCBpcyB0eXBlZCBvbiBjb21tYW5kIGxpbmUKK2hlbHAgIC0gYXBwbGV0IG5hbWUsIGNvbnZlcnRlZCB0byBDIChldGhlci13YWtlOiBoZWxwID0gZXRoZXJfd2FrZSkKK21haW4gIC0gY29ycmVzcG9uZGluZyA8YXBwbGV0Pl9tYWluIHRvIGNhbGwgKGJ6Y2F0OiBtYWluID0gYnVuemlwMikKK2wgICAgIC0gbG9jYXRpb24gdG8gaW5zdGFsbCBsaW5rIHRvOiBbL3Vzcl0vW3NdYmluCitzICAgICAtIHN1aWQgdHlwZToKKyAgICAgICAgQkJfU1VJRF9SRVFVSVJFOiB3aWxsIGNvbXBsYWluIGlmIGJ1c3lib3ggaXNuJ3Qgc3VpZAorICAgICAgICBhbmQgaXMgcnVuIGJ5IG5vbi1yb290IChhcHBsZXRfbWFpbigpIHdpbGwgbm90IGJlIGNhbGxlZCBhdCBhbGwpCisgICAgICAgIEJCX1NVSURfRFJPUDogd2lsbCBkcm9wIHN1aWQgcHJpb3IgdG8gYXBwbGV0X21haW4oKQorICAgICAgICBCQl9TVUlEX01BWUJFOiBuZWl0aGVyIG9mIHRoZSBhYm92ZQorICAgICAgICAoZXZlcnkgaW5zdGFuY2Ugb2YgQkJfU1VJRF9SRVFVSVJFIGFuZCBCQl9TVUlEX01BWUJFCisgICAgICAgIG5lZWRzIHRvIGJlIGp1c3RpZmllZCBpbiBjb21tZW50KQorICAgICAgICBOQjogcGxlYXNlIHVwZGF0ZSBGRUFUVVJFX1NVSUQgaGVscCB0ZXh0IHdoZW5ldmVyIHlvdSBhZGQvcmVtb3ZlCisgICAgICAgIEJCX1NVSURfUkVRVUlSRSBvciBCQl9TVUlEX01BWUJFIGFwcGxldC4KKyovCisKKyNpZiBkZWZpbmVkKFBST1RPVFlQRVMpCisjIGRlZmluZSBBUFBMRVQobmFtZSxsLHMpICAgICAgICAgICAgICAgICAgICBpbnQgbmFtZSMjX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKKyMgZGVmaW5lIEFQUExFVF9PREROQU1FKG5hbWUsbWFpbixsLHMsaGVscCkgIGludCBtYWluIyNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworIyBkZWZpbmUgQVBQTEVUX05PRVhFQyhuYW1lLG1haW4sbCxzLGhlbHApICAgaW50IG1haW4jI19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CisjIGRlZmluZSBBUFBMRVRfTk9GT1JLKG5hbWUsbWFpbixsLHMsaGVscCkgICBpbnQgbWFpbiMjX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKKworI2VsaWYgZGVmaW5lZChOQU1FX01BSU4pCisjIGRlZmluZSBBUFBMRVQobmFtZSxsLHMpICAgICAgICAgICAgICAgICAgICBuYW1lIG5hbWUjI19tYWluCisjIGRlZmluZSBBUFBMRVRfT0RETkFNRShuYW1lLG1haW4sbCxzLGhlbHApICBuYW1lIG1haW4jI19tYWluCisjIGRlZmluZSBBUFBMRVRfTk9FWEVDKG5hbWUsbWFpbixsLHMsaGVscCkgICBuYW1lIG1haW4jI19tYWluCisjIGRlZmluZSBBUFBMRVRfTk9GT1JLKG5hbWUsbWFpbixsLHMsaGVscCkgICBuYW1lIG1haW4jI19tYWluCisKKyNlbGlmIGRlZmluZWQoTUFLRV9VU0FHRSkgJiYgRU5BQkxFX0ZFQVRVUkVfVkVSQk9TRV9VU0FHRQorIyBkZWZpbmUgQVBQTEVUKG5hbWUsbCxzKSAgICAgICAgICAgICAgICAgICAgTUFLRV9VU0FHRSgjbmFtZSwgbmFtZSMjX3RyaXZpYWxfdXNhZ2UgbmFtZSMjX2Z1bGxfdXNhZ2UpCisjIGRlZmluZSBBUFBMRVRfT0RETkFNRShuYW1lLG1haW4sbCxzLGhlbHApICBNQUtFX1VTQUdFKCNuYW1lLCBoZWxwIyNfdHJpdmlhbF91c2FnZSBoZWxwIyNfZnVsbF91c2FnZSkKKyMgZGVmaW5lIEFQUExFVF9OT0VYRUMobmFtZSxtYWluLGwscyxoZWxwKSAgIE1BS0VfVVNBR0UoI25hbWUsIGhlbHAjI190cml2aWFsX3VzYWdlIGhlbHAjI19mdWxsX3VzYWdlKQorIyBkZWZpbmUgQVBQTEVUX05PRk9SSyhuYW1lLG1haW4sbCxzLGhlbHApICAgTUFLRV9VU0FHRSgjbmFtZSwgaGVscCMjX3RyaXZpYWxfdXNhZ2UgaGVscCMjX2Z1bGxfdXNhZ2UpCisKKyNlbGlmIGRlZmluZWQoTUFLRV9VU0FHRSkgJiYgIUVOQUJMRV9GRUFUVVJFX1ZFUkJPU0VfVVNBR0UKKyMgZGVmaW5lIEFQUExFVChuYW1lLGwscykgICAgICAgICAgICAgICAgICAgIE1BS0VfVVNBR0UoI25hbWUsIG5hbWUjI190cml2aWFsX3VzYWdlKQorIyBkZWZpbmUgQVBQTEVUX09ERE5BTUUobmFtZSxtYWluLGwscyxoZWxwKSAgTUFLRV9VU0FHRSgjbmFtZSwgaGVscCMjX3RyaXZpYWxfdXNhZ2UpCisjIGRlZmluZSBBUFBMRVRfTk9FWEVDKG5hbWUsbWFpbixsLHMsaGVscCkgICBNQUtFX1VTQUdFKCNuYW1lLCBoZWxwIyNfdHJpdmlhbF91c2FnZSkKKyMgZGVmaW5lIEFQUExFVF9OT0ZPUksobmFtZSxtYWluLGwscyxoZWxwKSAgIE1BS0VfVVNBR0UoI25hbWUsIGhlbHAjI190cml2aWFsX3VzYWdlKQorCisjZWxpZiBkZWZpbmVkKE1BS0VfTElOS1MpCisjIGRlZmluZSBBUFBMRVQobmFtZSxsLGMpICAgICAgICAgICAgICAgICAgICBMSU5LIGwgbmFtZQorIyBkZWZpbmUgQVBQTEVUX09ERE5BTUUobmFtZSxtYWluLGwscyxoZWxwKSAgTElOSyBsIG5hbWUKKyMgZGVmaW5lIEFQUExFVF9OT0VYRUMobmFtZSxtYWluLGwscyxoZWxwKSAgIExJTksgbCBuYW1lCisjIGRlZmluZSBBUFBMRVRfTk9GT1JLKG5hbWUsbWFpbixsLHMsaGVscCkgICBMSU5LIGwgbmFtZQorCisjZWxpZiBkZWZpbmVkKE1BS0VfU1VJRCkKKyMgZGVmaW5lIEFQUExFVChuYW1lLGwscykgICAgICAgICAgICAgICAgICAgIFNVSUQgcyBsIG5hbWUKKyMgZGVmaW5lIEFQUExFVF9PREROQU1FKG5hbWUsbWFpbixsLHMsaGVscCkgIFNVSUQgcyBsIG5hbWUKKyMgZGVmaW5lIEFQUExFVF9OT0VYRUMobmFtZSxtYWluLGwscyxoZWxwKSAgIFNVSUQgcyBsIG5hbWUKKyMgZGVmaW5lIEFQUExFVF9OT0ZPUksobmFtZSxtYWluLGwscyxoZWxwKSAgIFNVSUQgcyBsIG5hbWUKKworI2Vsc2UKKyAgc3RhdGljIHN0cnVjdCBiYl9hcHBsZXQgYXBwbGV0c1tdID0geyAvKiAgICBuYW1lLCBtYWluLCBsb2NhdGlvbiwgbmVlZF9zdWlkICovCisjIGRlZmluZSBBUFBMRVQobmFtZSxsLHMpICAgICAgICAgICAgICAgICAgICB7ICNuYW1lLCAjbmFtZSwgbCwgcyB9LAorIyBkZWZpbmUgQVBQTEVUX09ERE5BTUUobmFtZSxtYWluLGwscyxoZWxwKSAgeyAjbmFtZSwgI21haW4sIGwsIHMgfSwKKyMgZGVmaW5lIEFQUExFVF9OT0VYRUMobmFtZSxtYWluLGwscyxoZWxwKSAgIHsgI25hbWUsICNtYWluLCBsLCBzLCAxIH0sCisjIGRlZmluZSBBUFBMRVRfTk9GT1JLKG5hbWUsbWFpbixsLHMsaGVscCkgICB7ICNuYW1lLCAjbWFpbiwgbCwgcywgMSwgMSB9LAorI2VuZGlmCisKKyNpZiBFTkFCTEVfSU5TVEFMTF9OT19VU1IKKyMgZGVmaW5lIEJCX0RJUl9VU1JfQklOIEJCX0RJUl9CSU4KKyMgZGVmaW5lIEJCX0RJUl9VU1JfU0JJTiBCQl9ESVJfU0JJTgorI2VuZGlmCisKKworSU5TRVJUCitJRl9URVNUKEFQUExFVF9OT0ZPUksoWywgIHRlc3QsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHRlc3QpKQorSUZfVEVTVChBUFBMRVRfTk9GT1JLKFtbLCB0ZXN0LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCB0ZXN0KSkKK0lGX0FDUElEKEFQUExFVChhY3BpZCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9BRERHUk9VUChBUFBMRVQoYWRkZ3JvdXAsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0FERFVTRVIoQVBQTEVUKGFkZHVzZXIsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0FESlRJTUVYKEFQUExFVChhZGp0aW1leCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9BUlAoQVBQTEVUKGFycCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9BUlBJTkcoQVBQTEVUKGFycGluZywgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfQkFTRU5BTUUoQVBQTEVUX05PRk9SSyhiYXNlbmFtZSwgYmFzZW5hbWUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGJhc2VuYW1lKSkKK0lGX0JCQ09ORklHKEFQUExFVChiYmNvbmZpZywgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0JFRVAoQVBQTEVUKGJlZXAsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfQkxLSUQoQVBQTEVUKGJsa2lkLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0JSQ1RMKEFQUExFVChicmN0bCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfQ0FMKEFQUExFVChjYWwsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfQ0FUKEFQUExFVF9OT0ZPUksoY2F0LCBjYXQsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgY2F0KSkKK0lGX0NBVFYoQVBQTEVUKGNhdHYsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9DSEFUKEFQUExFVChjaGF0LCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9DSEFUVFIoQVBQTEVUKGNoYXR0ciwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0NIQ09OKEFQUExFVChjaGNvbiwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9DSEdSUChBUFBMRVRfTk9FWEVDKGNoZ3JwLCBjaGdycCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBjaGdycCkpCitJRl9DSE1PRChBUFBMRVRfTk9FWEVDKGNobW9kLCBjaG1vZCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBjaG1vZCkpCitJRl9DSE9XTihBUFBMRVRfTk9FWEVDKGNob3duLCBjaG93biwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBjaG93bikpCitJRl9DSFBBU1NXRChBUFBMRVQoY2hwYXNzd2QsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0NIUFNUKEFQUExFVChjaHBzdCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9DSFJPT1QoQVBQTEVUKGNocm9vdCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfQ0hSVChBUFBMRVQoY2hydCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9DSFZUKEFQUExFVChjaHZ0LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0NLU1VNKEFQUExFVF9OT0VYRUMoY2tzdW0sIGNrc3VtLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBja3N1bSkpCitJRl9DTEVBUihBUFBMRVQoY2xlYXIsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfQ09NTShBUFBMRVQoY29tbSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9DUChBUFBMRVRfTk9FWEVDKGNwLCBjcCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBjcCkpCisvKiBOZWVkcyB0byBiZSBydW4gYnkgcm9vdCBvciBiZSBzdWlkIHJvb3QgLSBuZWVkcyB0byBjaGFuZ2UgL3Zhci9zcG9vbC9jcm9uKiBmaWxlczogKi8KK0lGX0NST05UQUIoQVBQTEVUKGNyb250YWIsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX1JFUVVJUkUpKQorSUZfQ1JZUFRQVyhBUFBMRVQoY3J5cHRwdywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9DVVQoQVBQTEVUX05PRVhFQyhjdXQsIGN1dCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgY3V0KSkKK0lGX0RDKEFQUExFVChkYywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9ERChBUFBMRVRfTk9FWEVDKGRkLCBkZCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBkZCkpCitJRl9ERUFMTE9DVlQoQVBQTEVUKGRlYWxsb2N2dCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9ERUxHUk9VUChBUFBMRVRfT0RETkFNRShkZWxncm91cCwgZGVsdXNlciwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1AsIGRlbGdyb3VwKSkKK0lGX0RFTFVTRVIoQVBQTEVUKGRlbHVzZXIsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0RFVkZTRChBUFBMRVQoZGV2ZnNkLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0RFVk1FTShBUFBMRVQoZGV2bWVtLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0RGKEFQUExFVChkZiwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0RIQ1BSRUxBWShBUFBMRVQoZGhjcHJlbGF5LCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9ESVJOQU1FKEFQUExFVF9OT0ZPUksoZGlybmFtZSwgZGlybmFtZSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgZGlybmFtZSkpCitJRl9ETUVTRyhBUFBMRVQoZG1lc2csIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9ETlNEKEFQUExFVChkbnNkLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9IT1NUTkFNRShBUFBMRVRfT0RETkFNRShkbnNkb21haW5uYW1lLCBob3N0bmFtZSwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBkbnNkb21haW5uYW1lKSkKK0lGX0RPUzJVTklYKEFQUExFVF9OT0VYRUMoZG9zMnVuaXgsIGRvczJ1bml4LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBkb3MydW5peCkpCitJRl9EVShBUFBMRVQoZHUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRFVNUEtNQVAoQVBQTEVUKGR1bXBrbWFwLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRFVNUExFQVNFUyhBUFBMRVQoZHVtcGxlYXNlcywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisvL0lGX0UyRlNDSyhBUFBMRVQoZTJmc2NrLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8vSUZfRTJMQUJFTChBUFBMRVRfT0RETkFNRShlMmxhYmVsLCB0dW5lMmZzLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBlMmxhYmVsKSkKK0lGX0VDSE8oQVBQTEVUX05PRk9SSyhlY2hvLCBlY2hvLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIGVjaG8pKQorSUZfRUpFQ1QoQVBQTEVUKGVqZWN0LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0VOVihBUFBMRVRfTk9FWEVDKGVudiwgZW52LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBlbnYpKQorSUZfRU5WRElSKEFQUExFVF9PREROQU1FKGVudmRpciwgY2hwc3QsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGVudmRpcikpCitJRl9FTlZVSURHSUQoQVBQTEVUX09ERE5BTUUoZW52dWlkZ2lkLCBjaHBzdCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgZW52dWlkZ2lkKSkKK0lGX0VUSEVSX1dBS0UoQVBQTEVUX09ERE5BTUUoZXRoZXItd2FrZSwgZXRoZXJfd2FrZSwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1AsIGV0aGVyX3dha2UpKQorSUZfRVhQQU5EKEFQUExFVChleHBhbmQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRVhQUihBUFBMRVQoZXhwciwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9GQUtFSURFTlREKEFQUExFVChmYWtlaWRlbnRkLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9GQUxTRShBUFBMRVRfTk9GT1JLKGZhbHNlLCBmYWxzZSwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBmYWxzZSkpCitJRl9GQlNFVChBUFBMRVQoZmJzZXQsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0ZCU1BMQVNIKEFQUExFVChmYnNwbGFzaCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9GREZMVVNIKEFQUExFVF9PREROQU1FKGZkZmx1c2gsIGZyZWVyYW1kaXNrLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIGZkZmx1c2gpKQorSUZfRkRGT1JNQVQoQVBQTEVUKGZkZm9ybWF0LCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9GRElTSyhBUFBMRVQoZmRpc2ssIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRkdDT05TT0xFKEFQUExFVChmZ2NvbnNvbGUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorLyogQmVuZWZpdHMgZnJvbSBzdWlkIHJvb3Q6IGJldHRlciBhY2Nlc3MgdG8gL2Rldi9CTE9DS0RFVnM6ICovCitJRl9GSU5ERlMoQVBQTEVUKGZpbmRmcywgQkJfRElSX1NCSU4sIEJCX1NVSURfTUFZQkUpKQorSUZfRkxBU0hfRVJBU0VBTEwoQVBQTEVUKGZsYXNoX2VyYXNlYWxsLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9GTEFTSF9MT0NLKEFQUExFVF9PREROQU1FKGZsYXNoX2xvY2ssIGZsYXNoX2xvY2tfdW5sb2NrLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCwgZmxhc2hfbG9jaykpCitJRl9GTEFTSF9VTkxPQ0soQVBQTEVUX09ERE5BTUUoZmxhc2hfdW5sb2NrLCBmbGFzaF9sb2NrX3VubG9jaywgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1AsIGZsYXNoX3VubG9jaykpCitJRl9GTEFTSENQKEFQUExFVChmbGFzaGNwLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9GTE9DSyhBUFBMRVQoZmxvY2ssIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRk9MRChBUFBMRVRfTk9FWEVDKGZvbGQsIGZvbGQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGZvbGQpKQorSUZfRlJFRShBUFBMRVQoZnJlZSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9GUkVFUkFNRElTSyhBUFBMRVQoZnJlZXJhbWRpc2ssIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfRlNDSyhBUFBMRVQoZnNjaywgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisvL0lGX0UyRlNDSyhBUFBMRVRfT0RETkFNRShmc2NrLmV4dDIsIGUyZnNjaywgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgZnNja19leHQyKSkKKy8vSUZfRTJGU0NLKEFQUExFVF9PREROQU1FKGZzY2suZXh0MywgZTJmc2NrLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBmc2NrX2V4dDMpKQorSUZfRlNDS19NSU5JWChBUFBMRVRfT0RETkFNRShmc2NrLm1pbml4LCBmc2NrX21pbml4LCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBmc2NrX21pbml4KSkKK0lGX0ZTWU5DKEFQUExFVF9OT0ZPUksoZnN5bmMsIGZzeW5jLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIGZzeW5jKSkKK0lGX0ZUUEQoQVBQTEVUKGZ0cGQsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0ZUUEdFVChBUFBMRVRfT0RETkFNRShmdHBnZXQsIGZ0cGdldHB1dCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgZnRwZ2V0KSkKK0lGX0ZUUFBVVChBUFBMRVRfT0RETkFNRShmdHBwdXQsIGZ0cGdldHB1dCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgZnRwcHV0KSkKK0lGX0ZVU0VSKEFQUExFVChmdXNlciwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9HRVRFTkZPUkNFKEFQUExFVChnZXRlbmZvcmNlLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9HRVRPUFQoQVBQTEVUKGdldG9wdCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0dFVFNFQk9PTChBUFBMRVQoZ2V0c2Vib29sLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9HRVRUWShBUFBMRVQoZ2V0dHksIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfSEQoQVBQTEVUX05PRVhFQyhoZCwgaGV4ZHVtcCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgaGQpKQorSUZfSERQQVJNKEFQUExFVChoZHBhcm0sIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfSEVBRChBUFBMRVRfTk9FWEVDKGhlYWQsIGhlYWQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGhlYWQpKQorSUZfSEVYRFVNUChBUFBMRVRfTk9FWEVDKGhleGR1bXAsIGhleGR1bXAsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGhleGR1bXApKQorSUZfSE9TVE5BTUUoQVBQTEVUKGhvc3RuYW1lLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfSFRUUEQoQVBQTEVUKGh0dHBkLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9IV0NMT0NLKEFQUExFVChod2Nsb2NrLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0lGQ09ORklHKEFQUExFVChpZmNvbmZpZywgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9JRlVQRE9XTihBUFBMRVRfT0RETkFNRShpZmRvd24sIGlmdXBkb3duLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBpZmRvd24pKQorSUZfSUZFTlNMQVZFKEFQUExFVChpZmVuc2xhdmUsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfSUZQTFVHRChBUFBMRVQoaWZwbHVnZCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfSUZVUERPV04oQVBQTEVUX09ERE5BTUUoaWZ1cCwgaWZ1cGRvd24sIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1AsIGlmdXApKQorSUZfSU5FVEQoQVBQTEVUKGluZXRkLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9JTk9USUZZRChBUFBMRVQoaW5vdGlmeWQsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfSU5TVEFMTChBUFBMRVQoaW5zdGFsbCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9JT05JQ0UoQVBQTEVUKGlvbmljZSwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUF9BRERSRVNTIFwKKyB8fCBFTkFCTEVfRkVBVFVSRV9JUF9ST1VURSBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfSVBfTElOSyBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfSVBfVFVOTkVMIFwKKyB8fCBFTkFCTEVfRkVBVFVSRV9JUF9SVUxFCitJRl9JUChBUFBMRVQoaXAsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorI2VuZGlmCitJRl9JUEFERFIoQVBQTEVUKGlwYWRkciwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9JUENBTEMoQVBQTEVUKGlwY2FsYywgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0lQQ1JNKEFQUExFVChpcGNybSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9JUENTKEFQUExFVChpcGNzLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0lQTElOSyhBUFBMRVQoaXBsaW5rLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0lQUk9VVEUoQVBQTEVUKGlwcm91dGUsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfSVBSVUxFKEFQUExFVChpcHJ1bGUsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfSVBUVU5ORUwoQVBQTEVUKGlwdHVubmVsLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0tCRF9NT0RFKEFQUExFVChrYmRfbW9kZSwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0tJTEwoQVBQTEVUKGtpbGwsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9LSUxMQUxMKEFQUExFVF9PREROQU1FKGtpbGxhbGwsIGtpbGwsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGtpbGxhbGwpKQorSUZfS0lMTEFMTDUoQVBQTEVUX09ERE5BTUUoa2lsbGFsbDUsIGtpbGwsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QLCBraWxsYWxsNSkpCitJRl9LTE9HRChBUFBMRVQoa2xvZ2QsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTEFTVChBUFBMRVQobGFzdCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisvL0lGX0xFTkdUSChBUFBMRVRfTk9GT1JLKGxlbmd0aCwgbGVuZ3RoLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBsZW5ndGgpKQorSUZfTEVTUyhBUFBMRVQobGVzcywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TRVRBUkNIKEFQUExFVF9PREROQU1FKGxpbnV4MzIsIHNldGFyY2gsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgbGludXgzMikpCitJRl9TRVRBUkNIKEFQUExFVF9PREROQU1FKGxpbnV4NjQsIHNldGFyY2gsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgbGludXg2NCkpCitJRl9MTihBUFBMRVRfTk9FWEVDKGxuLCBsbiwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBsbikpCitJRl9MT0FEX1BPTElDWShBUFBMRVQobG9hZF9wb2xpY3ksIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0xPQURGT05UKEFQUExFVChsb2FkZm9udCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTE9BREtNQVAoQVBQTEVUKGxvYWRrbWFwLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0xPR0dFUihBUFBMRVQobG9nZ2VyLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8qIE5lZWRzIHRvIGJlIHJ1biBieSByb290IG9yIGJlIHN1aWQgcm9vdCAtIG5lZWRzIHRvIGNoYW5nZSB1aWQgYW5kIGdpZDogKi8KK0lGX0xPR0lOKEFQUExFVChsb2dpbiwgQkJfRElSX0JJTiwgQkJfU1VJRF9SRVFVSVJFKSkKK0lGX0xPR05BTUUoQVBQTEVUX05PRk9SSyhsb2duYW1lLCBsb2duYW1lLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBsb2duYW1lKSkKK0lGX0xPR1JFQUQoQVBQTEVUKGxvZ3JlYWQsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTE9TRVRVUChBUFBMRVQobG9zZXR1cCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9MUEQoQVBQTEVUKGxwZCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTFBRKEFQUExFVF9PREROQU1FKGxwcSwgbHBxciwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgbHBxKSkKK0lGX0xQUihBUFBMRVRfT0RETkFNRShscHIsIGxwcXIsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIGxwcikpCitJRl9MUyhBUFBMRVRfTk9FWEVDKGxzLCBscywgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBscykpCitJRl9MU0FUVFIoQVBQTEVUKGxzYXR0ciwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0xTUENJKEFQUExFVChsc3BjaSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9MU1VTQihBUFBMRVQobHN1c2IsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTUFLRURFVlMoQVBQTEVUKG1ha2VkZXZzLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX01BS0VNSU1FKEFQUExFVChtYWtlbWltZSwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX01BTihBUFBMRVQobWFuLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX01BVENIUEFUSENPTihBUFBMRVQobWF0Y2hwYXRoY29uLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9NRDVTVU0oQVBQTEVUX05PRVhFQyhtZDVzdW0sIG1kNV9zaGExX3N1bSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgbWQ1c3VtKSkKK0lGX01JQ1JPQ09NKEFQUExFVChtaWNyb2NvbSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9NS0RJUihBUFBMRVRfTk9GT1JLKG1rZGlyLCBta2RpciwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBta2RpcikpCitJRl9NS0ZTX1ZGQVQoQVBQTEVUX09ERE5BTUUobWtkb3NmcywgbWtmc192ZmF0LCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBta2ZzX3ZmYXQpKQorSUZfTUtGU19FWFQyKEFQUExFVF9PREROQU1FKG1rZTJmcywgbWtmc19leHQyLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBta2ZzX2V4dDIpKQorSUZfTUtGSUZPKEFQUExFVF9OT0VYRUMobWtmaWZvLCBta2ZpZm8sIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIG1rZmlmbykpCitJRl9NS0ZTX0VYVDIoQVBQTEVUX09ERE5BTUUobWtmcy5leHQyLCBta2ZzX2V4dDIsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1AsIG1rZnNfZXh0MikpCisvL0lGX01LRTJGUyhBUFBMRVRfT0RETkFNRShta2ZzLmV4dDMsIG1rZTJmcywgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgbWtmc19leHQzKSkKK0lGX01LRlNfTUlOSVgoQVBQTEVUX09ERE5BTUUobWtmcy5taW5peCwgbWtmc19taW5peCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgbWtmc19taW5peCkpCitJRl9NS0ZTX1JFSVNFUihBUFBMRVRfT0RETkFNRShta2ZzLnJlaXNlciwgbWtmc19yZWlzZXIsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1AsIG1rZnNfcmVpc2VyKSkKK0lGX01LRlNfVkZBVChBUFBMRVRfT0RETkFNRShta2ZzLnZmYXQsIG1rZnNfdmZhdCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgbWtmc192ZmF0KSkKK0lGX01LTk9EKEFQUExFVF9OT0VYRUMobWtub2QsIG1rbm9kLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIG1rbm9kKSkKK0lGX0NSWVBUUFcoQVBQTEVUX09ERE5BTUUobWtwYXNzd2QsIGNyeXB0cHcsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIG1rcGFzc3dkKSkKK0lGX01LU1dBUChBUFBMRVQobWtzd2FwLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX01LVEVNUChBUFBMRVQobWt0ZW1wLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTU9SRShBUFBMRVQobW9yZSwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8qIE9uIGZ1bGwtYmxvd24gc3lzdGVtcywgcmVxdWlyZXMgc3VpZCBmb3IgdXNlciBtb3VudHMuCisgKiBCdXQgaXQncyBub3QgdW50aGlua2FibGUgdG8gaGF2ZSBpdCBhdmFpbGFibGUgaW4gbm9uLXN1aWQgZmxhdm9yIG9uIHNvbWUgc3lzdGVtcywKKyAqIGZvciB2aWV3aW5nIG1vdW50IHRhYmxlLgorICogVGhlcmVmb3JlIHdlIHVzZSBCQl9TVUlEX01BWUJFIGluc3RlYWQgb2YgQkJfU1VJRF9SRVFVSVJFOiAqLworSUZfTU9VTlQoQVBQTEVUKG1vdW50LCBCQl9ESVJfQklOLCBJRl9ERVNLVE9QKEJCX1NVSURfTUFZQkUpIElGX05PVF9ERVNLVE9QKEJCX1NVSURfRFJPUCkpKQorSUZfTU9VTlRQT0lOVChBUFBMRVQobW91bnRwb2ludCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX01UKEFQUExFVChtdCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX01WKEFQUExFVChtdiwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX05BTUVJRihBUFBMRVQobmFtZWlmLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX05DKEFQUExFVChuYywgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9ORVRTVEFUKEFQUExFVChuZXRzdGF0LCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTklDRShBUFBMRVQobmljZSwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX05PSFVQKEFQUExFVChub2h1cCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9OU0xPT0tVUChBUFBMRVQobnNsb29rdXAsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfTlRQRChBUFBMRVQobnRwZCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfT0QoQVBQTEVUKG9kLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX09QRU5WVChBUFBMRVQob3BlbnZ0LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8vSUZfUEFSU0UoQVBQTEVUKHBhcnNlLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8qIE5lZWRzIHRvIGJlIHJ1biBieSByb290IG9yIGJlIHN1aWQgcm9vdCAtIG5lZWRzIHRvIGNoYW5nZSAvZXRjL3twYXNzd2Qsc2hhZG93fTogKi8KK0lGX1BBU1NXRChBUFBMRVQocGFzc3dkLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9SRVFVSVJFKSkKK0lGX1BHUkVQKEFQUExFVChwZ3JlcCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9QSURPRihBUFBMRVQocGlkb2YsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9QSVBFX1BST0dSRVNTKEFQUExFVChwaXBlX3Byb2dyZXNzLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUElWT1RfUk9PVChBUFBMRVQocGl2b3Rfcm9vdCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9QS0lMTChBUFBMRVRfT0RETkFNRShwa2lsbCwgcGdyZXAsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHBraWxsKSkKK0lGX1BPUE1BSUxESVIoQVBQTEVUKHBvcG1haWxkaXIsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1BSSU5URU5WKEFQUExFVF9OT0ZPUksocHJpbnRlbnYsIHByaW50ZW52LCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIHByaW50ZW52KSkKK0lGX1BSSU5URihBUFBMRVRfTk9GT1JLKHByaW50ZiwgcHJpbnRmLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBwcmludGYpKQorSUZfUFMoQVBQTEVUKHBzLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUFNDQU4oQVBQTEVUKHBzY2FuLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1BXRChBUFBMRVRfTk9GT1JLKHB3ZCwgcHdkLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIHB3ZCkpCitJRl9SQUlEQVVUT1JVTihBUFBMRVQocmFpZGF1dG9ydW4sIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUkRBVEUoQVBQTEVUKHJkYXRlLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9SREVWKEFQUExFVChyZGV2LCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9SRUFEQUhFQUQoQVBQTEVUKHJlYWRhaGVhZCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUkVBRExJTksoQVBQTEVUKHJlYWRsaW5rLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1JFQURQUk9GSUxFKEFQUExFVChyZWFkcHJvZmlsZSwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUkVBTFBBVEgoQVBQTEVUKHJlYWxwYXRoLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1JFRk9STUlNRShBUFBMRVQocmVmb3JtaW1lLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUkVOSUNFKEFQUExFVChyZW5pY2UsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUkVTRVQoQVBQTEVUKHJlc2V0LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1JFU0laRShBUFBMRVQocmVzaXplLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1JFU1RPUkVDT04oQVBQTEVUX09ERE5BTUUocmVzdG9yZWNvbiwgc2V0ZmlsZXMsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1AsIHJlc3RvcmVjb24pKQorSUZfUk0oQVBQTEVUX05PRk9SSyhybSwgcm0sIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgcm0pKQorSUZfUk1ESVIoQVBQTEVUX05PRk9SSyhybWRpciwgcm1kaXIsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgcm1kaXIpKQorSUZfUk9VVEUoQVBQTEVUKHJvdXRlLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1JUQ1dBS0UoQVBQTEVUKHJ0Y3dha2UsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1JVTl9QQVJUUyhBUFBMRVRfT0RETkFNRShydW4tcGFydHMsIHJ1bl9wYXJ0cywgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBydW5fcGFydHMpKQorSUZfUlVOQ09OKEFQUExFVChydW5jb24sIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUlVOTEVWRUwoQVBQTEVUKHJ1bmxldmVsLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1JVTlNWKEFQUExFVChydW5zdiwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9SVU5TVkRJUihBUFBMRVQocnVuc3ZkaXIsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfUlgoQVBQTEVUKHJ4LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NDUklQVChBUFBMRVQoc2NyaXB0LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NDUklQVFJFUExBWShBUFBMRVQoc2NyaXB0cmVwbGF5LCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU0VMSU5VWEVOQUJMRUQoQVBQTEVUKHNlbGludXhlbmFibGVkLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TRU5ETUFJTChBUFBMRVQoc2VuZG1haWwsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NFUShBUFBMRVRfTk9GT1JLKHNlcSwgc2VxLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBzZXEpKQorSUZfU0VTVEFUVVMoQVBQTEVUKHNlc3RhdHVzLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TRVRBUkNIKEFQUExFVChzZXRhcmNoLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU0VUQ09OU09MRShBUFBMRVQoc2V0Y29uc29sZSwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TRVRFTkZPUkNFKEFQUExFVChzZXRlbmZvcmNlLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TRVRGSUxFUyhBUFBMRVQoc2V0ZmlsZXMsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU0VURk9OVChBUFBMRVQoc2V0Zm9udCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU0VUS0VZQ09ERVMoQVBQTEVUKHNldGtleWNvZGVzLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NFVExPR0NPTlMoQVBQTEVUKHNldGxvZ2NvbnMsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NFVFNFQk9PTChBUFBMRVQoc2V0c2Vib29sLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TRVRTSUQoQVBQTEVUKHNldHNpZCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TRVRVSURHSUQoQVBQTEVUX09ERE5BTUUoc2V0dWlkZ2lkLCBjaHBzdCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgc2V0dWlkZ2lkKSkKK0lGX1NIQTFTVU0oQVBQTEVUX05PRVhFQyhzaGExc3VtLCBtZDVfc2hhMV9zdW0sIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHNoYTFzdW0pKQorSUZfU0hBM1NVTShBUFBMRVRfTk9FWEVDKHNoYTNzdW0sIG1kNV9zaGExX3N1bSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgc2hhM3N1bSkpCitJRl9TSEEyNTZTVU0oQVBQTEVUX05PRVhFQyhzaGEyNTZzdW0sIG1kNV9zaGExX3N1bSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgc2hhMjU2c3VtKSkKK0lGX1NIQTUxMlNVTShBUFBMRVRfTk9FWEVDKHNoYTUxMnN1bSwgbWQ1X3NoYTFfc3VtLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBzaGE1MTJzdW0pKQorSUZfU0hPV0tFWShBUFBMRVQoc2hvd2tleSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TTEFUVEFDSChBUFBMRVQoc2xhdHRhY2gsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorLyogRG8gbm90IG1ha2UgdGhpcyBhcHBsZXQgTk9GT1JLLiBJdCBicmVha3MgXkMtaW5nIG9mIHBhdXNlcyBpbiBzaGVsbHM6ICovCitJRl9TTEVFUChBUFBMRVQoc2xlZXAsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TT0ZUTElNSVQoQVBQTEVUX09ERE5BTUUoc29mdGxpbWl0LCBjaHBzdCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgc29mdGxpbWl0KSkKK0lGX1NPUlQoQVBQTEVUX05PRVhFQyhzb3J0LCBzb3J0LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCBzb3J0KSkKK0lGX1NQTElUKEFQUExFVChzcGxpdCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TVEFSVF9TVE9QX0RBRU1PTihBUFBMRVRfT0RETkFNRShzdGFydC1zdG9wLWRhZW1vbiwgc3RhcnRfc3RvcF9kYWVtb24sIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1AsIHN0YXJ0X3N0b3BfZGFlbW9uKSkKK0lGX1NUQVQoQVBQTEVUKHN0YXQsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TVFJJTkdTKEFQUExFVChzdHJpbmdzLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NUVFkoQVBQTEVUKHN0dHksIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCisvKiBOZWVkcyB0byBiZSBydW4gYnkgcm9vdCBvciBiZSBzdWlkIHJvb3QgLSBuZWVkcyB0byBjaGFuZ2UgdWlkIGFuZCBnaWQ6ICovCitJRl9TVShBUFBMRVQoc3UsIEJCX0RJUl9CSU4sIEJCX1NVSURfUkVRVUlSRSkpCitJRl9TVUxPR0lOKEFQUExFVChzdWxvZ2luLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NVTShBUFBMRVQoc3VtLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NWKEFQUExFVChzdiwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9TVkxPR0QoQVBQTEVUKHN2bG9nZCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfU1dBUE9OT0ZGKEFQUExFVF9PREROQU1FKHN3YXBvZmYsIHN3YXBfb25fb2ZmLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBzd2Fwb2ZmKSkKK0lGX1NXQVBPTk9GRihBUFBMRVRfT0RETkFNRShzd2Fwb24sIHN3YXBfb25fb2ZmLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBzd2Fwb24pKQorSUZfU1dJVENIX1JPT1QoQVBQTEVUKHN3aXRjaF9yb290LCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX0JCX1NZU0NUTChBUFBMRVQoc3lzY3RsLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1NZU0xPR0QoQVBQTEVUKHN5c2xvZ2QsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVEFDKEFQUExFVF9OT0VYRUModGFjLCB0YWMsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHRhYykpCitJRl9UQUlMKEFQUExFVCh0YWlsLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8qIElGX1RDKEFQUExFVCh0YywgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpICovCitJRl9UQ1BTVkQoQVBQTEVUX09ERE5BTUUodGNwc3ZkLCB0Y3B1ZHBzdmQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1AsIHRjcHN2ZCkpCitJRl9URUUoQVBQTEVUKHRlZSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9URUxORVQoQVBQTEVUKHRlbG5ldCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9URUxORVREKEFQUExFVCh0ZWxuZXRkLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCitJRl9URVNUKEFQUExFVF9OT0ZPUksodGVzdCwgdGVzdCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgdGVzdCkpCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEZUUF9HRVQgfHwgRU5BQkxFX0ZFQVRVUkVfVEZUUF9QVVQKK0lGX1RGVFAoQVBQTEVUKHRmdHAsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVEZUUEQoQVBQTEVUKHRmdHBkLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisjZW5kaWYKK0lGX1RJTUUoQVBQTEVUKHRpbWUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVElNRU9VVChBUFBMRVQodGltZW91dCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9UT1AoQVBQTEVUKHRvcCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9UUihBUFBMRVQodHIsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorLyogTmVlZHMgc29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCBJUFBST1RPX0lDTVApLCB0aGVyZWZvcmUgQkJfU1VJRF9NQVlCRTogKi8KK0lGX1RSQUNFUk9VVEUoQVBQTEVUKHRyYWNlcm91dGUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX01BWUJFKSkKK0lGX1RSQUNFUk9VVEU2KEFQUExFVCh0cmFjZXJvdXRlNiwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfTUFZQkUpKQorSUZfVFJVRShBUFBMRVRfTk9GT1JLKHRydWUsIHRydWUsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgdHJ1ZSkpCitJRl9UVFkoQVBQTEVUKHR0eSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9UVFlTSVpFKEFQUExFVCh0dHlzaXplLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1RVTkNUTChBUFBMRVQodHVuY3RsLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1RVTkUyRlMoQVBQTEVUKHR1bmUyZnMsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVURIQ1BDKEFQUExFVCh1ZGhjcGMsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVURIQ1BEKEFQUExFVCh1ZGhjcGQsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1VEUFNWRChBUFBMRVRfT0RETkFNRSh1ZHBzdmQsIHRjcHVkcHN2ZCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgdWRwc3ZkKSkKK0lGX1VNT1VOVChBUFBMRVQodW1vdW50LCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVU5BTUUoQVBQTEVUKHVuYW1lLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVU5FWFBBTkQoQVBQTEVUX09ERE5BTUUodW5leHBhbmQsIGV4cGFuZCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgdW5leHBhbmQpKQorSUZfVU5JUShBUFBMRVQodW5pcSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9VTklYMkRPUyhBUFBMRVRfTk9FWEVDKHVuaXgyZG9zLCBkb3MydW5peCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgdW5peDJkb3MpKQorSUZfVVBUSU1FKEFQUExFVCh1cHRpbWUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVVNMRUVQKEFQUExFVF9OT0ZPUksodXNsZWVwLCB1c2xlZXAsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCwgdXNsZWVwKSkKK0lGX1VVREVDT0RFKEFQUExFVCh1dWRlY29kZSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9VVUVOQ09ERShBUFBMRVQodXVlbmNvZGUsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorSUZfVkNPTkZJRyhBUFBMRVQodmNvbmZpZywgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisvKiBOZWVkcyB0byBiZSBydW4gYnkgcm9vdCBvciBiZSBzdWlkIHJvb3QgLSBuZWVkcyB0byBjaGFuZ2UgdWlkIGFuZCBnaWQ6ICovCitJRl9WTE9DSyhBUFBMRVQodmxvY2ssIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX1JFUVVJUkUpKQorSUZfVk9MTkFNRShBUFBMRVQodm9sbmFtZSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9XQVRDSChBUFBMRVQod2F0Y2gsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9XQVRDSERPRyhBUFBMRVQod2F0Y2hkb2csIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorSUZfV0MoQVBQTEVUKHdjLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKK0lGX1dISUNIKEFQUExFVCh3aGljaCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCitJRl9XSE9BTUkoQVBQTEVUX05PRk9SSyh3aG9hbWksIHdob2FtaSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCwgd2hvYW1pKSkKK0lGX1lFUyhBUFBMRVRfTk9GT1JLKHllcywgeWVzLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QLCB5ZXMpKQorSUZfWkNJUChBUFBMRVQoemNpcCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisKKyNpZiAhZGVmaW5lZChQUk9UT1RZUEVTKSAmJiAhZGVmaW5lZChOQU1FX01BSU4pICYmICFkZWZpbmVkKE1BS0VfVVNBR0UpIFwKKwkmJiAhZGVmaW5lZChNQUtFX0xJTktTKSAmJiAhZGVmaW5lZChNQUtFX1NVSUQpCit9OworI2VuZGlmCisKKyN1bmRlZiBBUFBMRVQKKyN1bmRlZiBBUFBMRVRfT0RETkFNRQorI3VuZGVmIEFQUExFVF9OT0VYRUMKKyN1bmRlZiBBUFBMRVRfTk9GT1JLCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FyLmggYi9pbmNsdWRlL2FyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg2ZmUwNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvYXIuaApAQCAtMCwwICsxLDI2IEBACisvKgorICogYnVzeWJveCBhciBhcmNoaXZlIGRhdGEgc3RydWN0dXJlcworICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2lmbmRlZiBBUl9ICisjZGVmaW5lIEFSX0gKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKK3N0cnVjdCBhcl9oZWFkZXIgeworCWNoYXIgbmFtZVsxNl07CisJY2hhciBkYXRlWzEyXTsKKwljaGFyIHVpZFs2XTsKKwljaGFyIGdpZFs2XTsKKwljaGFyIG1vZGVbOF07CisJY2hhciBzaXplWzEwXTsKKwljaGFyIG1hZ2ljWzJdOworfTsKKworI2RlZmluZSBBUl9IRUFERVJfTEVOIHNpemVvZihzdHJ1Y3QgYXJfaGVhZGVyKQorI2RlZmluZSBBUl9NQUdJQyAgICAgICIhPGFyY2g+IgorI2RlZmluZSBBUl9NQUdJQ19MRU4gIDcKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2JiX2FyY2hpdmUuaCBiL2luY2x1ZGUvYmJfYXJjaGl2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOWUyNGMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2JiX2FyY2hpdmUuaApAQCAtMCwwICsxLDI2MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisjaWZuZGVmIFVOQVJDSElWRV9ICisjZGVmaW5lIFVOQVJDSElWRV9IIDEKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKK2VudW0geworI2lmIEJCX0JJR19FTkRJQU4KKwlDT01QUkVTU19NQUdJQyA9IDB4MWY5ZCwKKwlHWklQX01BR0lDICA9IDB4MWY4YiwKKwlCWklQMl9NQUdJQyA9IDI1NiAqICdCJyArICdaJywKKwkvKiAueHogc2lnbmF0dXJlOiAweGZkLCAnNycsICd6JywgJ1gnLCAnWicsIDB4MDAgKi8KKwkvKiBNb3JlIGluZm8gYXQ6IGh0dHA6Ly90dWthYW5pLm9yZy94ei94ei1maWxlLWZvcm1hdC50eHQgKi8KKwlYWl9NQUdJQzEgICA9IDI1NiAqIDB4ZmQgKyAnNycsCisJWFpfTUFHSUMyICAgPSAyNTYgKiAodW5zaWduZWQpKDI1NiAqICgyNTYgKiAneicgKyAnWCcpICsgJ1onKSArIDAsCisJLyogRGlmZmVyZW50IGZvcm06IDMyIGJpdHMsIHRoZW4gMTYgYml0czogKi8KKwkvKiAodW5zaWduZWQpIGNhc3Qgc3VwcHJlc3NlcyAiaW50ZWdlciBvdmVyZmxvdyBpbiBleHByZXNzaW9uIiB3YXJuaW5nICovCisJWFpfTUFHSUMxYSAgPSAyNTYgKiAodW5zaWduZWQpKDI1NiAqICgyNTYgKiAweGZkICsgJzcnKSArICd6JykgKyAnWCcsCisJWFpfTUFHSUMyYSAgPSAyNTYgKiAnWicgKyAwLAorI2Vsc2UKKwlDT01QUkVTU19NQUdJQyA9IDB4OWQxZiwKKwlHWklQX01BR0lDICA9IDB4OGIxZiwKKwlCWklQMl9NQUdJQyA9ICdCJyArICdaJyAqIDI1NiwKKwlYWl9NQUdJQzEgICA9IDB4ZmQgKyAnNycgKiAyNTYsCisJWFpfTUFHSUMyICAgPSAneicgKyAoJ1gnICsgKCdaJyArIDAgKiAyNTYpICogMjU2KSAqIDI1NiwKKwlYWl9NQUdJQzFhICA9IDB4ZmQgKyAoJzcnICsgKCd6JyArICdYJyAqIDI1NikgKiAyNTYpICogMjU2LAorCVhaX01BR0lDMmEgID0gJ1onICsgMCAqIDI1NiwKKyNlbmRpZgorfTsKKwordHlwZWRlZiBzdHJ1Y3QgZmlsZV9oZWFkZXJfdCB7CisJY2hhciAqbmFtZTsKKwljaGFyICpsaW5rX3RhcmdldDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQVJfVU5BTUVfR05BTUUKKwljaGFyICp0YXJfX3VuYW1lOworCWNoYXIgKnRhcl9fZ25hbWU7CisjZW5kaWYKKwlvZmZfdCBzaXplOworCXVpZF90IHVpZDsKKwlnaWRfdCBnaWQ7CisJbW9kZV90IG1vZGU7CisJdGltZV90IG10aW1lOworCWRldl90IGRldmljZTsKK30gZmlsZV9oZWFkZXJfdDsKKworc3RydWN0IGhhcmRsaW5rc190OworCit0eXBlZGVmIHN0cnVjdCBhcmNoaXZlX2hhbmRsZV90IHsKKwkvKiBGbGFncy4gMXN0IHNpbmNlIGl0IGlzIG1vc3QgdXNlZCBtZW1iZXIgKi8KKwl1bnNpZ25lZCBhaF9mbGFnczsKKworCS8qIFRoZSByYXcgc3RyZWFtIGFzIHJlYWQgZnJvbSBkaXNrIG9yIHN0ZGluICovCisJaW50IHNyY19mZDsKKworCS8qIERlZmluZSBpZiB0aGUgaGVhZGVyIGFuZCBkYXRhIGNvbXBvbmVudCBzaG91bGQgYmUgcHJvY2Vzc2VkICovCisJY2hhciBGQVNUX0ZVTkMgKCpmaWx0ZXIpKHN0cnVjdCBhcmNoaXZlX2hhbmRsZV90ICopOworCS8qIExpc3Qgb2YgZmlsZXMgdGhhdCBoYXZlIGJlZW4gYWNjZXB0ZWQgKi8KKwlsbGlzdF90ICphY2NlcHQ7CisJLyogTGlzdCBvZiBmaWxlcyB0aGF0IGhhdmUgYmVlbiByZWplY3RlZCAqLworCWxsaXN0X3QgKnJlamVjdDsKKwkvKiBMaXN0IG9mIGZpbGVzIHRoYXQgaGF2ZSBzdWNjZXNzZnVsbHkgYmVlbiB3b3JrZWQgb24gKi8KKwlsbGlzdF90ICpwYXNzZWQ7CisKKwkvKiBDdXJyZW50bHkgcHJvY2Vzc2VkIGZpbGUncyBoZWFkZXIgKi8KKwlmaWxlX2hlYWRlcl90ICpmaWxlX2hlYWRlcjsKKworCS8qIFByb2Nlc3MgdGhlIGhlYWRlciBjb21wb25lbnQsIGUuZy4gdGFyIC10ICovCisJdm9pZCBGQVNUX0ZVTkMgKCphY3Rpb25faGVhZGVyKShjb25zdCBmaWxlX2hlYWRlcl90ICopOworCisJLyogUHJvY2VzcyB0aGUgZGF0YSBjb21wb25lbnQsIGUuZy4gZXh0cmFjdCB0byBmaWxlc3lzdGVtICovCisJdm9pZCBGQVNUX0ZVTkMgKCphY3Rpb25fZGF0YSkoc3RydWN0IGFyY2hpdmVfaGFuZGxlX3QgKik7CisKKwkvKiBGdW5jdGlvbiB0aGF0IHNraXBzIGRhdGEgKi8KKwl2b2lkIEZBU1RfRlVOQyAoKnNlZWspKGludCBmZCwgb2ZmX3QgYW1vdW50KTsKKworCS8qIENvdW50IHByb2Nlc3NlZCBieXRlcyAqLworCW9mZl90IG9mZnNldDsKKworCS8qIEFyY2hpdmVyIHNwZWNpZmljLiBDYW4gbWFrZSBpdCBhIHVuaW9uIGlmIGl0IGV2ZXIgZ2V0cyBiaWcgKi8KKyNkZWZpbmUgUEFYX05FWFRfRklMRSAwCisjZGVmaW5lIFBBWF9HTE9CQUwgICAgMQorI2lmIEVOQUJMRV9UQVIgfHwgRU5BQkxFX0RQS0cgfHwgRU5BQkxFX0RQS0dfREVCCisJc21hbGxpbnQgdGFyX19lbmQ7CisjIGlmIEVOQUJMRV9GRUFUVVJFX1RBUl9HTlVfRVhURU5TSU9OUworCWNoYXIqIHRhcl9fbG9uZ25hbWU7CisJY2hhciogdGFyX19saW5rbmFtZTsKKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVEFSX1RPX0NPTU1BTkQKKwljaGFyKiB0YXJfX3RvX2NvbW1hbmQ7CisJY29uc3QgY2hhciogdGFyX190b19jb21tYW5kX3NoZWxsOworIyBlbmRpZgorIyBpZiBFTkFCTEVfRkVBVFVSRV9UQVJfU0VMSU5VWAorCWNoYXIqIHRhcl9fc2N0eFsyXTsKKyMgZW5kaWYKKyNlbmRpZgorI2lmIEVOQUJMRV9DUElPIHx8IEVOQUJMRV9SUE0yQ1BJTyB8fCBFTkFCTEVfUlBNCisJdW9mZl90IGNwaW9fX2Jsb2NrczsKKwlzdHJ1Y3QgaGFyZGxpbmtzX3QgKmNwaW9fX2hhcmRsaW5rc190b19jcmVhdGU7CisJc3RydWN0IGhhcmRsaW5rc190ICpjcGlvX19jcmVhdGVkX2hhcmRsaW5rczsKKyNlbmRpZgorI2lmIEVOQUJMRV9EUEtHIHx8IEVOQUJMRV9EUEtHX0RFQgorCS8qIFRlbXBvcmFyeSBzdG9yYWdlICovCisJY2hhciAqZHBrZ19fYnVmZmVyOworCS8qIEhvdyB0byBwcm9jZXNzIGFueSBzdWIgYXJjaGl2ZSwgZS5nLiBnZXRfaGVhZGVyX3Rhcl9neiAqLworCWNoYXIgRkFTVF9GVU5DICgqZHBrZ19fYWN0aW9uX2RhdGFfc3ViYXJjaGl2ZSkoc3RydWN0IGFyY2hpdmVfaGFuZGxlX3QgKik7CisJLyogQ29udGFpbnMgdGhlIGhhbmRsZSB0byBhIHN1YiBhcmNoaXZlICovCisJc3RydWN0IGFyY2hpdmVfaGFuZGxlX3QgKmRwa2dfX3N1Yl9hcmNoaXZlOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfQVJfQ1JFQVRFCisJY29uc3QgY2hhciAqYXJfX25hbWU7CisJc3RydWN0IGFyY2hpdmVfaGFuZGxlX3QgKmFyX19vdXQ7CisjZW5kaWYKK30gYXJjaGl2ZV9oYW5kbGVfdDsKKy8qIGJpdHMgaW4gYWhfZmxhZ3MgKi8KKyNkZWZpbmUgQVJDSElWRV9SRVNUT1JFX0RBVEUgICAgICAgICgxIDw8IDApCisjZGVmaW5lIEFSQ0hJVkVfQ1JFQVRFX0xFQURJTkdfRElSUyAoMSA8PCAxKQorI2RlZmluZSBBUkNISVZFX1VOTElOS19PTEQgICAgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgQVJDSElWRV9FWFRSQUNUX1FVSUVUICAgICAgICgxIDw8IDMpCisjZGVmaW5lIEFSQ0hJVkVfRVhUUkFDVF9ORVdFUiAgICAgICAoMSA8PCA0KQorI2RlZmluZSBBUkNISVZFX0RPTlRfUkVTVE9SRV9PV05FUiAgKDEgPDwgNSkKKyNkZWZpbmUgQVJDSElWRV9ET05UX1JFU1RPUkVfUEVSTSAgICgxIDw8IDYpCisjZGVmaW5lIEFSQ0hJVkVfTlVNRVJJQ19PV05FUiAgICAgICAoMSA8PCA3KQorI2RlZmluZSBBUkNISVZFX09fVFJVTkMgICAgICAgICAgICAgKDEgPDwgOCkKKyNkZWZpbmUgQVJDSElWRV9SRU1FTUJFUl9OQU1FUyAgICAgICgxIDw8IDkpCisjaWYgRU5BQkxFX1JQTQorI2RlZmluZSBBUkNISVZFX1JFUExBQ0VfVklBX1JFTkFNRSAgKDEgPDwgMTApCisjZW5kaWYKKworCisvKiBQT1NJWCB0YXIgSGVhZGVyIEJsb2NrLCBmcm9tIFBPU0lYIDEwMDMuMS0xOTkwICAqLworI2RlZmluZSBUQVJfQkxPQ0tfU0laRSA1MTIKKyNkZWZpbmUgTkFNRV9TSVpFICAgICAgMTAwCisjZGVmaW5lIE5BTUVfU0laRV9TVFIgIjEwMCIKK3R5cGVkZWYgc3RydWN0IHRhcl9oZWFkZXJfdCB7ICAgICAvKiBieXRlIG9mZnNldCAqLworCWNoYXIgbmFtZVtOQU1FX1NJWkVdOyAgICAgLyogICAwLTk5ICovCisJY2hhciBtb2RlWzhdOyAgICAgICAgICAgICAvKiAxMDAtMTA3ICovCisJY2hhciB1aWRbOF07ICAgICAgICAgICAgICAvKiAxMDgtMTE1ICovCisJY2hhciBnaWRbOF07ICAgICAgICAgICAgICAvKiAxMTYtMTIzICovCisJY2hhciBzaXplWzEyXTsgICAgICAgICAgICAvKiAxMjQtMTM1ICovCisJY2hhciBtdGltZVsxMl07ICAgICAgICAgICAvKiAxMzYtMTQ3ICovCisJY2hhciBjaGtzdW1bOF07ICAgICAgICAgICAvKiAxNDgtMTU1ICovCisJY2hhciB0eXBlZmxhZzsgICAgICAgICAgICAvKiAxNTYtMTU2ICovCisJY2hhciBsaW5rbmFtZVtOQU1FX1NJWkVdOyAvKiAxNTctMjU2ICovCisJLyogUE9TSVg6ICAgInVzdGFyIiBOVUwgIjAwIiAqLworCS8qIEdOVSB0YXI6ICJ1c3RhciAgIiBOVUwgKi8KKwkvKiBOb3JtYWxseSBpdCdzIGRlZmluZWQgYXMgbWFnaWNbNl0gZm9sbG93ZWQgYnkKKwkgKiB2ZXJzaW9uWzJdLCBidXQgd2UgcHV0IHRoZW0gdG9nZXRoZXIgdG8gc2F2ZSBjb2RlLgorCSAqLworCWNoYXIgbWFnaWNbOF07ICAgICAgICAgICAgLyogMjU3LTI2NCAqLworCWNoYXIgdW5hbWVbMzJdOyAgICAgICAgICAgLyogMjY1LTI5NiAqLworCWNoYXIgZ25hbWVbMzJdOyAgICAgICAgICAgLyogMjk3LTMyOCAqLworCWNoYXIgZGV2bWFqb3JbOF07ICAgICAgICAgLyogMzI5LTMzNiAqLworCWNoYXIgZGV2bWlub3JbOF07ICAgICAgICAgLyogMzM3LTM0NCAqLworCWNoYXIgcHJlZml4WzE1NV07ICAgICAgICAgLyogMzQ1LTQ5OSAqLworCWNoYXIgcGFkZGluZ1sxMl07ICAgICAgICAgLyogNTAwLTUxMiAocGFkIHRvIGV4YWN0bHkgVEFSX0JMT0NLX1NJWkUpICovCit9IHRhcl9oZWFkZXJfdDsKK3N0cnVjdCBCVUdfdGFyX2hlYWRlciB7CisJY2hhciBjW3NpemVvZih0YXJfaGVhZGVyX3QpID09IFRBUl9CTE9DS19TSVpFID8gMSA6IC0xXTsKK307CisKKworCithcmNoaXZlX2hhbmRsZV90ICppbml0X2hhbmRsZSh2b2lkKSBGQVNUX0ZVTkM7CisKK2NoYXIgZmlsdGVyX2FjY2VwdF9hbGwoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpIEZBU1RfRlVOQzsKK2NoYXIgZmlsdGVyX2FjY2VwdF9saXN0KGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKSBGQVNUX0ZVTkM7CitjaGFyIGZpbHRlcl9hY2NlcHRfbGlzdF9yZWFzc2lnbihhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkgRkFTVF9GVU5DOworY2hhciBmaWx0ZXJfYWNjZXB0X3JlamVjdF9saXN0KGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKSBGQVNUX0ZVTkM7CisKK3ZvaWQgdW5wYWNrX2FyX2FyY2hpdmUoYXJjaGl2ZV9oYW5kbGVfdCAqYXJfYXJjaGl2ZSkgRkFTVF9GVU5DOworCit2b2lkIGRhdGFfc2tpcChhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkgRkFTVF9GVU5DOwordm9pZCBkYXRhX2V4dHJhY3RfYWxsKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKSBGQVNUX0ZVTkM7Cit2b2lkIGRhdGFfZXh0cmFjdF90b19zdGRvdXQoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpIEZBU1RfRlVOQzsKK3ZvaWQgZGF0YV9leHRyYWN0X3RvX2NvbW1hbmQoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpIEZBU1RfRlVOQzsKKwordm9pZCBoZWFkZXJfc2tpcChjb25zdCBmaWxlX2hlYWRlcl90ICpmaWxlX2hlYWRlcikgRkFTVF9GVU5DOwordm9pZCBoZWFkZXJfbGlzdChjb25zdCBmaWxlX2hlYWRlcl90ICpmaWxlX2hlYWRlcikgRkFTVF9GVU5DOwordm9pZCBoZWFkZXJfdmVyYm9zZV9saXN0KGNvbnN0IGZpbGVfaGVhZGVyX3QgKmZpbGVfaGVhZGVyKSBGQVNUX0ZVTkM7CisKK2NoYXIgZ2V0X2hlYWRlcl9hcihhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSkgRkFTVF9GVU5DOworY2hhciBnZXRfaGVhZGVyX2NwaW8oYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpIEZBU1RfRlVOQzsKK2NoYXIgZ2V0X2hlYWRlcl90YXIoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpIEZBU1RfRlVOQzsKK2NoYXIgZ2V0X2hlYWRlcl90YXJfZ3ooYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpIEZBU1RfRlVOQzsKK2NoYXIgZ2V0X2hlYWRlcl90YXJfYnoyKGFyY2hpdmVfaGFuZGxlX3QgKmFyY2hpdmVfaGFuZGxlKSBGQVNUX0ZVTkM7CitjaGFyIGdldF9oZWFkZXJfdGFyX2x6bWEoYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpIEZBU1RfRlVOQzsKK2NoYXIgZ2V0X2hlYWRlcl90YXJfeHooYXJjaGl2ZV9oYW5kbGVfdCAqYXJjaGl2ZV9oYW5kbGUpIEZBU1RfRlVOQzsKKwordm9pZCBzZWVrX2J5X2p1bXAoaW50IGZkLCBvZmZfdCBhbW91bnQpIEZBU1RfRlVOQzsKK3ZvaWQgc2Vla19ieV9yZWFkKGludCBmZCwgb2ZmX3QgYW1vdW50KSBGQVNUX0ZVTkM7CisKK2NvbnN0IGNoYXIgKnN0cmlwX3Vuc2FmZV9wcmVmaXgoY29uc3QgY2hhciAqc3RyKSBGQVNUX0ZVTkM7CisKK3ZvaWQgZGF0YV9hbGlnbihhcmNoaXZlX2hhbmRsZV90ICphcmNoaXZlX2hhbmRsZSwgdW5zaWduZWQgYm91bmRhcnkpIEZBU1RfRlVOQzsKK2NvbnN0IGxsaXN0X3QgKmZpbmRfbGlzdF9lbnRyeShjb25zdCBsbGlzdF90ICpsaXN0LCBjb25zdCBjaGFyICpmaWxlbmFtZSkgRkFTVF9GVU5DOworY29uc3QgbGxpc3RfdCAqZmluZF9saXN0X2VudHJ5Mihjb25zdCBsbGlzdF90ICpsaXN0LCBjb25zdCBjaGFyICpmaWxlbmFtZSkgRkFTVF9GVU5DOworCisvKiBBIGJpdCBvZiBidW56aXAyIGludGVybmFscyBhcmUgZXhwb3NlZCBmb3IgY29tcHJlc3NlZCBoZWxwIHN1cHBvcnQ6ICovCit0eXBlZGVmIHN0cnVjdCBidW56aXBfZGF0YSBidW56aXBfZGF0YTsKK2ludCBzdGFydF9idW56aXAoYnVuemlwX2RhdGEgKipiZHAsIGludCBpbl9mZCwgY29uc3Qgdm9pZCAqaW5idWYsIGludCBsZW4pIEZBU1RfRlVOQzsKKy8qIE5COiByZWFkX2J1bnppcCByZXR1cm5zIDwgMCBvbiBlcnJvciwgb3IgdGhlIG51bWJlciBvZiAqdW5maWxsZWQqIGJ5dGVzCisgKiBpbiBvdXRidWYuIElPVzogb24gRU9GIHJldHVybnMgbGVuICgiYWxsIGJ5dGVzIGFyZSBub3QgZmlsbGVkIiksIG5vdCAwOiAqLworaW50IHJlYWRfYnVuemlwKGJ1bnppcF9kYXRhICpiZCwgY2hhciAqb3V0YnVmLCBpbnQgbGVuKSBGQVNUX0ZVTkM7Cit2b2lkIGRlYWxsb2NfYnVuemlwKGJ1bnppcF9kYXRhICpiZCkgRkFTVF9GVU5DOworCisvKiBNZWFuaW5nIGFuZCBkaXJlY3Rpb24gKGlucHV0L291dHB1dCkgb2YgdGhlIGZpZWxkcyBhcmUgdHJhbnNmb3JtZXItc3BlY2lmaWMgKi8KK3R5cGVkZWYgc3RydWN0IHRyYW5zZm9ybWVyX3N0YXRlX3QgeworCXNtYWxsaW50IGNoZWNrX3NpZ25hdHVyZTsgLyogbW9zdCBvZnRlbiByZWZlcmVuY2VkIG1lbWJlciAqLworCisJSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMgKCp4Zm9ybWVyKShzdHJ1Y3QgdHJhbnNmb3JtZXJfc3RhdGVfdCAqeHN0YXRlKTsKKwlVU0VfRk9SX05PTU1VKGNvbnN0IGNoYXIgKnhmb3JtZXJfcHJvZzspCisKKwkvKiBTb3VyY2UgKi8KKwlpbnQgICAgICBzcmNfZmQ7CisJLyogT3V0cHV0ICovCisJaW50ICAgICAgZHN0X2ZkOworCXNpemVfdCAgIG1lbV9vdXRwdXRfc2l6ZV9tYXg7IC8qIGlmIG5vbi16ZXJvLCBkZWNvbXByZXNzIHRvIFJBTSBpbnN0ZWFkIG9mIGZkICovCisJc2l6ZV90ICAgbWVtX291dHB1dF9zaXplOworCWNoYXIgICAgICptZW1fb3V0cHV0X2J1ZjsKKworCW9mZl90ICAgIGJ5dGVzX291dDsKKwlvZmZfdCAgICBieXRlc19pbjsgIC8qIHVzZWQgaW4gdW56aXAgY29kZSBvbmx5OiBuZWVkcyB0byBrbm93IHBhY2tlZCBzaXplICovCisJdWludDMyX3QgY3JjMzI7CisJdGltZV90ICAgbXRpbWU7ICAgICAvKiBndW56aXAgY29kZSBtYXkgc2V0IHRoaXMgb24gZXhpdCAqLworfSB0cmFuc2Zvcm1lcl9zdGF0ZV90OworCit2b2lkIGluaXRfdHJhbnNmb3JtZXJfc3RhdGUodHJhbnNmb3JtZXJfc3RhdGVfdCAqeHN0YXRlKSBGQVNUX0ZVTkM7Citzc2l6ZV90IHRyYW5zZm9ybWVyX3dyaXRlKHRyYW5zZm9ybWVyX3N0YXRlX3QgKnhzdGF0ZSwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgYnVmc2l6ZSkgRkFTVF9GVU5DOworc3NpemVfdCB4dHJhbnNmb3JtZXJfd3JpdGUodHJhbnNmb3JtZXJfc3RhdGVfdCAqeHN0YXRlLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBidWZzaXplKSBGQVNUX0ZVTkM7CitpbnQgY2hlY2tfc2lnbmF0dXJlMTYodHJhbnNmb3JtZXJfc3RhdGVfdCAqeHN0YXRlLCB1bnNpZ25lZCBtYWdpYzE2KSBGQVNUX0ZVTkM7CisKK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgaW5mbGF0ZV91bnppcCh0cmFuc2Zvcm1lcl9zdGF0ZV90ICp4c3RhdGUpIEZBU1RfRlVOQzsKK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgdW5wYWNrX1pfc3RyZWFtKHRyYW5zZm9ybWVyX3N0YXRlX3QgKnhzdGF0ZSkgRkFTVF9GVU5DOworSUZfREVTS1RPUChsb25nIGxvbmcpIGludCB1bnBhY2tfZ3pfc3RyZWFtKHRyYW5zZm9ybWVyX3N0YXRlX3QgKnhzdGF0ZSkgRkFTVF9GVU5DOworSUZfREVTS1RPUChsb25nIGxvbmcpIGludCB1bnBhY2tfYnoyX3N0cmVhbSh0cmFuc2Zvcm1lcl9zdGF0ZV90ICp4c3RhdGUpIEZBU1RfRlVOQzsKK0lGX0RFU0tUT1AobG9uZyBsb25nKSBpbnQgdW5wYWNrX2x6bWFfc3RyZWFtKHRyYW5zZm9ybWVyX3N0YXRlX3QgKnhzdGF0ZSkgRkFTVF9GVU5DOworSUZfREVTS1RPUChsb25nIGxvbmcpIGludCB1bnBhY2tfeHpfc3RyZWFtKHRyYW5zZm9ybWVyX3N0YXRlX3QgKnhzdGF0ZSkgRkFTVF9GVU5DOworCitjaGFyKiBhcHBlbmRfZXh0KGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpleHBlY3RlZF9leHQpIEZBU1RfRlVOQzsKK2ludCBiYnVucGFjayhjaGFyICoqYXJndiwKKwkJSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMgKCp1bnBhY2tlcikodHJhbnNmb3JtZXJfc3RhdGVfdCAqeHN0YXRlKSwKKwkJY2hhciogRkFTVF9GVU5DICgqbWFrZV9uZXdfbmFtZSkoY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKmV4cGVjdGVkX2V4dCksCisJCWNvbnN0IGNoYXIgKmV4cGVjdGVkX2V4dAorKSBGQVNUX0ZVTkM7CisKK3ZvaWQgY2hlY2tfZXJyb3JzX2luX2NoaWxkcmVuKGludCBzaWdubyk7CisjaWYgQkJfTU1VCit2b2lkIGZvcmtfdHJhbnNmb3JtZXIoaW50IGZkLAorCWludCBjaGVja19zaWduYXR1cmUsCisJSUZfREVTS1RPUChsb25nIGxvbmcpIGludCBGQVNUX0ZVTkMgKCp0cmFuc2Zvcm1lcikodHJhbnNmb3JtZXJfc3RhdGVfdCAqeHN0YXRlKQorKSBGQVNUX0ZVTkM7CisjZGVmaW5lIGZvcmtfdHJhbnNmb3JtZXJfd2l0aF9zaWcoZmQsIHRyYW5zZm9ybWVyLCB0cmFuc2Zvcm1fcHJvZykgZm9ya190cmFuc2Zvcm1lcigoZmQpLCAxLCAodHJhbnNmb3JtZXIpKQorI2RlZmluZSBmb3JrX3RyYW5zZm9ybWVyX3dpdGhfbm9fc2lnKGZkLCB0cmFuc2Zvcm1lcikgICAgICAgICAgICAgIGZvcmtfdHJhbnNmb3JtZXIoKGZkKSwgMCwgKHRyYW5zZm9ybWVyKSkKKyNlbHNlCit2b2lkIGZvcmtfdHJhbnNmb3JtZXIoaW50IGZkLCBjb25zdCBjaGFyICp0cmFuc2Zvcm1fcHJvZykgRkFTVF9GVU5DOworI2RlZmluZSBmb3JrX3RyYW5zZm9ybWVyX3dpdGhfc2lnKGZkLCB0cmFuc2Zvcm1lciwgdHJhbnNmb3JtX3Byb2cpIGZvcmtfdHJhbnNmb3JtZXIoKGZkKSwgKHRyYW5zZm9ybV9wcm9nKSkKKy8qIGZvcmtfdHJhbnNmb3JtZXJfd2l0aF9ub19zaWcoKSBkb2VzIG5vdCBleGlzdCBvbiBOT01NVSAqLworI2VuZGlmCisKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2JiX2UyZnNfZGVmcy5oIGIvaW5jbHVkZS9iYl9lMmZzX2RlZnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjVlM2M0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9iYl9lMmZzX2RlZnMuaApAQCAtMCwwICsxLDYwMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogIGxpbnV4L2luY2x1ZGUvbGludXgvZXh0Ml9mcy5oCisgKgorICogQ29weXJpZ2h0IChDKSAxOTkyLCAxOTkzLCAxOTk0LCAxOTk1CisgKiBSZW15IENhcmQgKGNhcmRAbWFzaS5pYnAuZnIpCisgKiBMYWJvcmF0b2lyZSBNQVNJIC0gSW5zdGl0dXQgQmxhaXNlIFBhc2NhbAorICogVW5pdmVyc2l0ZSBQaWVycmUgZXQgTWFyaWUgQ3VyaWUgKFBhcmlzIFZJKQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiAgTGludXMgVG9ydmFsZHMKKyAqLworCisjaWZuZGVmIExJTlVYX0VYVDJfRlNfSAorI2RlZmluZSBMSU5VWF9FWFQyX0ZTX0ggMQorCisvKgorICogU3BlY2lhbCBpbm9kZSBudW1iZXJzCisgKi8KKyNkZWZpbmUgRVhUMl9CQURfSU5PCQkgMQkvKiBCYWQgYmxvY2tzIGlub2RlICovCisjZGVmaW5lIEVYVDJfUk9PVF9JTk8JCSAyCS8qIFJvb3QgaW5vZGUgKi8KKyNkZWZpbmUgRVhUMl9BQ0xfSURYX0lOTwkgMwkvKiBBQ0wgaW5vZGUgKi8KKyNkZWZpbmUgRVhUMl9BQ0xfREFUQV9JTk8JIDQJLyogQUNMIGlub2RlICovCisjZGVmaW5lIEVYVDJfQk9PVF9MT0FERVJfSU5PCSA1CS8qIEJvb3QgbG9hZGVyIGlub2RlICovCisjZGVmaW5lIEVYVDJfVU5ERUxfRElSX0lOTwkgNgkvKiBVbmRlbGV0ZSBkaXJlY3RvcnkgaW5vZGUgKi8KKyNkZWZpbmUgRVhUMl9SRVNJWkVfSU5PCQkgNwkvKiBSZXNlcnZlZCBncm91cCBkZXNjcmlwdG9ycyBpbm9kZSAqLworI2RlZmluZSBFWFQyX0pPVVJOQUxfSU5PCSA4CS8qIEpvdXJuYWwgaW5vZGUgKi8KKworLyogRmlyc3Qgbm9uLXJlc2VydmVkIGlub2RlIGZvciBvbGQgZXh0MiBmaWxlc3lzdGVtcyAqLworI2RlZmluZSBFWFQyX0dPT0RfT0xEX0ZJUlNUX0lOTwkxMQorCisvKgorICogVGhlIHNlY29uZCBleHRlbmRlZCBmaWxlIHN5c3RlbSBtYWdpYyBudW1iZXIKKyAqLworI2RlZmluZSBFWFQyX1NVUEVSX01BR0lDCTB4RUY1MworCisvKiBBc3N1bWUgdGhhdCB1c2VyIG1vZGUgcHJvZ3JhbXMgYXJlIHBhc3NpbmcgaW4gYW4gZXh0MmZzIHN1cGVyYmxvY2ssIG5vdAorICogYSBrZXJuZWwgc3RydWN0IHN1cGVyX2Jsb2NrLiAgVGhpcyB3aWxsIGFsbG93IHVzIHRvIGNhbGwgdGhlIGZlYXR1cmUtdGVzdAorICogbWFjcm9zIGZyb20gdXNlciBsYW5kLiAqLworI2RlZmluZSBFWFQyX1NCKHNiKQkoc2IpCisKKy8qCisgKiBNYXhpbWFsIGNvdW50IG9mIGxpbmtzIHRvIGEgZmlsZQorICovCisjZGVmaW5lIEVYVDJfTElOS19NQVgJCTMyMDAwCisKKy8qCisgKiBNYWNyby1pbnN0cnVjdGlvbnMgdXNlZCB0byBtYW5hZ2Ugc2V2ZXJhbCBibG9jayBzaXplcworICovCisjZGVmaW5lIEVYVDJfTUlOX0JMT0NLX0xPR19TSVpFCQkxMAkvKiAxMDI0ICovCisjZGVmaW5lIEVYVDJfTUFYX0JMT0NLX0xPR19TSVpFCQkxNgkvKiA2NTUzNiAqLworI2RlZmluZSBFWFQyX01JTl9CTE9DS19TSVpFCSgxIDw8IEVYVDJfTUlOX0JMT0NLX0xPR19TSVpFKQorI2RlZmluZSBFWFQyX01BWF9CTE9DS19TSVpFCSgxIDw8IEVYVDJfTUFYX0JMT0NLX0xPR19TSVpFKQorI2RlZmluZSBFWFQyX0JMT0NLX1NJWkUocykJKEVYVDJfTUlOX0JMT0NLX1NJWkUgPDwgKHMpLT5zX2xvZ19ibG9ja19zaXplKQorI2RlZmluZSBFWFQyX0JMT0NLX1NJWkVfQklUUyhzKQkoKHMpLT5zX2xvZ19ibG9ja19zaXplICsgMTApCisjZGVmaW5lIEVYVDJfSU5PREVfU0laRShzKQkoKChzKS0+c19yZXZfbGV2ZWwgPT0gRVhUMl9HT09EX09MRF9SRVYpID8gXAorCQkJCSBFWFQyX0dPT0RfT0xEX0lOT0RFX1NJWkUgOiAocyktPnNfaW5vZGVfc2l6ZSkKKyNkZWZpbmUgRVhUMl9GSVJTVF9JTk8ocykJKCgocyktPnNfcmV2X2xldmVsID09IEVYVDJfR09PRF9PTERfUkVWKSA/IFwKKwkJCQkgRVhUMl9HT09EX09MRF9GSVJTVF9JTk8gOiAocyktPnNfZmlyc3RfaW5vKQorI2RlZmluZSBFWFQyX0FERFJfUEVSX0JMT0NLKHMpCShFWFQyX0JMT0NLX1NJWkUocykgLyBzaXplb2YodWludDMyX3QpKQorCisvKgorICogTWFjcm8taW5zdHJ1Y3Rpb25zIHVzZWQgdG8gbWFuYWdlIGZyYWdtZW50cworICovCisjZGVmaW5lIEVYVDJfTUlOX0ZSQUdfU0laRQkJRVhUMl9NSU5fQkxPQ0tfU0laRQorI2RlZmluZSBFWFQyX01BWF9GUkFHX1NJWkUJCUVYVDJfTUFYX0JMT0NLX1NJWkUKKyNkZWZpbmUgRVhUMl9NSU5fRlJBR19MT0dfU0laRQkJRVhUMl9NSU5fQkxPQ0tfTE9HX1NJWkUKKyNkZWZpbmUgRVhUMl9GUkFHX1NJWkUocykJCShFWFQyX01JTl9GUkFHX1NJWkUgPDwgKHMpLT5zX2xvZ19mcmFnX3NpemUpCisjZGVmaW5lIEVYVDJfRlJBR1NfUEVSX0JMT0NLKHMpCQkoRVhUMl9CTE9DS19TSVpFKHMpIC8gRVhUMl9GUkFHX1NJWkUocykpCisKKy8qCisgKiBBQ0wgc3RydWN0dXJlcworICovCitzdHJ1Y3QgZXh0Ml9hY2xfaGVhZGVyIHsJLyogSGVhZGVyIG9mIEFjY2VzcyBDb250cm9sIExpc3RzICovCisJdWludDMyX3QJYWNsaF9zaXplOworCXVpbnQzMl90CWFjbGhfZmlsZV9jb3VudDsKKwl1aW50MzJfdAlhY2xoX2FjbGVfY291bnQ7CisJdWludDMyX3QJYWNsaF9maXJzdF9hY2xlOworfTsKKworc3RydWN0IGV4dDJfYWNsX2VudHJ5IHsJLyogQWNjZXNzIENvbnRyb2wgTGlzdCBFbnRyeSAqLworCXVpbnQzMl90CWFjbGVfc2l6ZTsKKwl1aW50MTZfdAlhY2xlX3Blcm1zOwkvKiBBY2Nlc3MgcGVybWlzc2lvbnMgKi8KKwl1aW50MTZfdAlhY2xlX3R5cGU7CS8qIFR5cGUgb2YgZW50cnkgKi8KKwl1aW50MTZfdAlhY2xlX3RhZzsJLyogVXNlciBvciBncm91cCBpZGVudGl0eSAqLworCXVpbnQxNl90CWFjbGVfcGFkMTsKKwl1aW50MzJfdAlhY2xlX25leHQ7CS8qIFBvaW50ZXIgb24gbmV4dCBlbnRyeSBmb3IgdGhlICovCisJCQkJCS8qIHNhbWUgaW5vZGUgb3Igb24gbmV4dCBmcmVlIGVudHJ5ICovCit9OworCisvKgorICogU3RydWN0dXJlIG9mIGEgYmxvY2tzIGdyb3VwIGRlc2NyaXB0b3IKKyAqLworc3RydWN0IGV4dDJfZ3JvdXBfZGVzYyB7CisJdWludDMyX3QJYmdfYmxvY2tfYml0bWFwOwkvKiBCbG9ja3MgYml0bWFwIGJsb2NrICovCisJdWludDMyX3QJYmdfaW5vZGVfYml0bWFwOwkvKiBJbm9kZXMgYml0bWFwIGJsb2NrICovCisJdWludDMyX3QJYmdfaW5vZGVfdGFibGU7CQkvKiBJbm9kZXMgdGFibGUgYmxvY2sgKi8KKwl1aW50MTZfdAliZ19mcmVlX2Jsb2Nrc19jb3VudDsJLyogRnJlZSBibG9ja3MgY291bnQgKi8KKwl1aW50MTZfdAliZ19mcmVlX2lub2Rlc19jb3VudDsJLyogRnJlZSBpbm9kZXMgY291bnQgKi8KKwl1aW50MTZfdAliZ191c2VkX2RpcnNfY291bnQ7CS8qIERpcmVjdG9yaWVzIGNvdW50ICovCisJdWludDE2X3QJYmdfcGFkOworCXVpbnQzMl90CWJnX3Jlc2VydmVkWzNdOworfTsKKworLyoKKyAqIERhdGEgc3RydWN0dXJlcyB1c2VkIGJ5IHRoZSBkaXJlY3RvcnkgaW5kZXhpbmcgZmVhdHVyZQorICoKKyAqIE5vdGU6IGFsbCBvZiB0aGUgbXVsdGlieXRlIGludGVnZXIgZmllbGRzIGFyZSBsaXR0bGUgZW5kaWFuLgorICovCisKKy8qCisgKiBOb3RlOiBkeF9yb290X2luZm8gaXMgbGFpZCBvdXQgc28gdGhhdCBpZiBpdCBzaG91bGQgc29tZWhvdyBnZXQKKyAqIG92ZXJsYWlkIGJ5IGEgZGlyZW50IHRoZSB0d28gbG93IGJpdHMgb2YgdGhlIGhhc2ggdmVyc2lvbiB3aWxsIGJlCisgKiB6ZXJvLiAgVGhlcmVmb3JlLCB0aGUgaGFzaCB2ZXJzaW9uIG1vZCA0IHNob3VsZCBuZXZlciBiZSAwLgorICogU2luY2VyZWx5LCB0aGUgcGFyYW5vaWEgZGVwYXJ0bWVudC4KKyAqLworc3RydWN0IGV4dDJfZHhfcm9vdF9pbmZvIHsKKwl1aW50MzJfdAlyZXNlcnZlZF96ZXJvOworCXVpbnQ4X3QJCWhhc2hfdmVyc2lvbjsgLyogMCBub3csIDEgYXQgcmVsZWFzZSAqLworCXVpbnQ4X3QJCWluZm9fbGVuZ3RoOyAvKiA4ICovCisJdWludDhfdAkJaW5kaXJlY3RfbGV2ZWxzOworCXVpbnQ4X3QJCXVudXNlZF9mbGFnczsKK307CisKKyNkZWZpbmUgRVhUMl9IQVNIX0xFR0FDWQkwCisjZGVmaW5lIEVYVDJfSEFTSF9IQUxGX01ENAkxCisjZGVmaW5lIEVYVDJfSEFTSF9URUEJCTIKKworI2RlZmluZSBFWFQyX0hBU0hfRkxBR19JTkNPTVBBVAkweDEKKworc3RydWN0IGV4dDJfZHhfZW50cnkgeworCXVpbnQzMl90IGhhc2g7CisJdWludDMyX3QgYmxvY2s7Cit9OworCitzdHJ1Y3QgZXh0Ml9keF9jb3VudGxpbWl0IHsKKwl1aW50MTZfdCBsaW1pdDsKKwl1aW50MTZfdCBjb3VudDsKK307CisKKworLyoKKyAqIE1hY3JvLWluc3RydWN0aW9ucyB1c2VkIHRvIG1hbmFnZSBncm91cCBkZXNjcmlwdG9ycworICovCisjZGVmaW5lIEVYVDJfQkxPQ0tTX1BFUl9HUk9VUChzKQkoRVhUMl9TQihzKS0+c19ibG9ja3NfcGVyX2dyb3VwKQorI2RlZmluZSBFWFQyX0lOT0RFU19QRVJfR1JPVVAocykJKEVYVDJfU0IocyktPnNfaW5vZGVzX3Blcl9ncm91cCkKKyNkZWZpbmUgRVhUMl9JTk9ERVNfUEVSX0JMT0NLKHMpCShFWFQyX0JMT0NLX1NJWkUocykvRVhUMl9JTk9ERV9TSVpFKHMpKQorLyogbGltaXRzIGltcG9zZWQgYnkgMTYtYml0IHZhbHVlIGdkX2ZyZWVfe2Jsb2Nrcyxpbm9kZX1fY291bnQgKi8KKyNkZWZpbmUgRVhUMl9NQVhfQkxPQ0tTX1BFUl9HUk9VUChzKQkoKDEgPDwgMTYpIC0gOCkKKyNkZWZpbmUgRVhUMl9NQVhfSU5PREVTX1BFUl9HUk9VUChzKQkoKDEgPDwgMTYpIC0gRVhUMl9JTk9ERVNfUEVSX0JMT0NLKHMpKQorI2RlZmluZSBFWFQyX0RFU0NfUEVSX0JMT0NLKHMpCQkoRVhUMl9CTE9DS19TSVpFKHMpIC8gc2l6ZW9mIChzdHJ1Y3QgZXh0Ml9ncm91cF9kZXNjKSkKKworLyoKKyAqIENvbnN0YW50cyByZWxhdGl2ZSB0byB0aGUgZGF0YSBibG9ja3MKKyAqLworI2RlZmluZSBFWFQyX05ESVJfQkxPQ0tTCQkxMgorI2RlZmluZSBFWFQyX0lORF9CTE9DSwkJCUVYVDJfTkRJUl9CTE9DS1MKKyNkZWZpbmUgRVhUMl9ESU5EX0JMT0NLCQkJKEVYVDJfSU5EX0JMT0NLICsgMSkKKyNkZWZpbmUgRVhUMl9USU5EX0JMT0NLCQkJKEVYVDJfRElORF9CTE9DSyArIDEpCisjZGVmaW5lIEVYVDJfTl9CTE9DS1MJCQkoRVhUMl9USU5EX0JMT0NLICsgMSkKKworLyoKKyAqIElub2RlIGZsYWdzCisgKi8KKyNkZWZpbmUgRVhUMl9TRUNSTV9GTAkJCTB4MDAwMDAwMDEgLyogU2VjdXJlIGRlbGV0aW9uICovCisjZGVmaW5lIEVYVDJfVU5STV9GTAkJCTB4MDAwMDAwMDIgLyogVW5kZWxldGUgKi8KKyNkZWZpbmUgRVhUMl9DT01QUl9GTAkJCTB4MDAwMDAwMDQgLyogQ29tcHJlc3MgZmlsZSAqLworI2RlZmluZSBFWFQyX1NZTkNfRkwJCQkweDAwMDAwMDA4IC8qIFN5bmNocm9ub3VzIHVwZGF0ZXMgKi8KKyNkZWZpbmUgRVhUMl9JTU1VVEFCTEVfRkwJCTB4MDAwMDAwMTAgLyogSW1tdXRhYmxlIGZpbGUgKi8KKyNkZWZpbmUgRVhUMl9BUFBFTkRfRkwJCQkweDAwMDAwMDIwIC8qIHdyaXRlcyB0byBmaWxlIG1heSBvbmx5IGFwcGVuZCAqLworI2RlZmluZSBFWFQyX05PRFVNUF9GTAkJCTB4MDAwMDAwNDAgLyogZG8gbm90IGR1bXAgZmlsZSAqLworI2RlZmluZSBFWFQyX05PQVRJTUVfRkwJCQkweDAwMDAwMDgwIC8qIGRvIG5vdCB1cGRhdGUgYXRpbWUgKi8KKy8qIFJlc2VydmVkIGZvciBjb21wcmVzc2lvbiB1c2FnZS4uLiAqLworI2RlZmluZSBFWFQyX0RJUlRZX0ZMCQkJMHgwMDAwMDEwMAorI2RlZmluZSBFWFQyX0NPTVBSQkxLX0ZMCQkweDAwMDAwMjAwIC8qIE9uZSBvciBtb3JlIGNvbXByZXNzZWQgY2x1c3RlcnMgKi8KKyNkZWZpbmUgRVhUMl9OT0NPTVBSX0ZMCQkJMHgwMDAwMDQwMCAvKiBBY2Nlc3MgcmF3IGNvbXByZXNzZWQgZGF0YSAqLworI2RlZmluZSBFWFQyX0VDT01QUl9GTAkJCTB4MDAwMDA4MDAgLyogQ29tcHJlc3Npb24gZXJyb3IgKi8KKy8qIEVuZCBjb21wcmVzc2lvbiBmbGFncyAtLS0gbWF5YmUgbm90IGFsbCB1c2VkICovCisjZGVmaW5lIEVYVDJfQlRSRUVfRkwJCQkweDAwMDAxMDAwIC8qIGJ0cmVlIGZvcm1hdCBkaXIgKi8KKyNkZWZpbmUgRVhUMl9JTkRFWF9GTAkJCTB4MDAwMDEwMDAgLyogaGFzaC1pbmRleGVkIGRpcmVjdG9yeSAqLworI2RlZmluZSBFWFQyX0lNQUdJQ19GTAkJCTB4MDAwMDIwMDAKKyNkZWZpbmUgRVhUM19KT1VSTkFMX0RBVEFfRkwJCTB4MDAwMDQwMDAgLyogZmlsZSBkYXRhIHNob3VsZCBiZSBqb3VybmFsZWQgKi8KKyNkZWZpbmUgRVhUMl9OT1RBSUxfRkwJCQkweDAwMDA4MDAwIC8qIGZpbGUgdGFpbCBzaG91bGQgbm90IGJlIG1lcmdlZCAqLworI2RlZmluZSBFWFQyX0RJUlNZTkNfRkwJCQkweDAwMDEwMDAwIC8qIFN5bmNocm9ub3VzIGRpcmVjdG9yeSBtb2RpZmljYXRpb25zICovCisjZGVmaW5lIEVYVDJfVE9QRElSX0ZMCQkJMHgwMDAyMDAwMCAvKiBUb3Agb2YgZGlyZWN0b3J5IGhpZXJhcmNoaWVzKi8KKyNkZWZpbmUgRVhUM19FWFRFTlRTX0ZMCQkJMHgwMDA4MDAwMCAvKiBJbm9kZSB1c2VzIGV4dGVudHMgKi8KKyNkZWZpbmUgRVhUMl9SRVNFUlZFRF9GTAkJMHg4MDAwMDAwMCAvKiByZXNlcnZlZCBmb3IgZXh0MiBsaWIgKi8KKworI2RlZmluZSBFWFQyX0ZMX1VTRVJfVklTSUJMRQkJMHgwMDAzREZGRiAvKiBVc2VyIHZpc2libGUgZmxhZ3MgKi8KKyNkZWZpbmUgRVhUMl9GTF9VU0VSX01PRElGSUFCTEUJCTB4MDAwMDgwRkYgLyogVXNlciBtb2RpZmlhYmxlIGZsYWdzICovCisKKy8qCisgKiBpb2N0bCBjb21tYW5kcworICovCisjZGVmaW5lIEVYVDJfSU9DX0dFVEZMQUdTCQlfSU9SKCdmJywgMSwgbG9uZykKKyNkZWZpbmUgRVhUMl9JT0NfU0VURkxBR1MJCV9JT1coJ2YnLCAyLCBsb25nKQorI2RlZmluZSBFWFQyX0lPQ19HRVRWRVJTSU9OCQlfSU9SKCd2JywgMSwgbG9uZykKKyNkZWZpbmUgRVhUMl9JT0NfU0VUVkVSU0lPTgkJX0lPVygndicsIDIsIGxvbmcpCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgYW4gaW5vZGUgb24gdGhlIGRpc2sKKyAqLworc3RydWN0IGV4dDJfaW5vZGUgeworCXVpbnQxNl90CWlfbW9kZTsJCS8qIEZpbGUgbW9kZSAqLworCXVpbnQxNl90CWlfdWlkOwkJLyogTG93IDE2IGJpdHMgb2YgT3duZXIgVWlkICovCisJdWludDMyX3QJaV9zaXplOwkJLyogU2l6ZSBpbiBieXRlcyAqLworCXVpbnQzMl90CWlfYXRpbWU7CS8qIEFjY2VzcyB0aW1lICovCisJdWludDMyX3QJaV9jdGltZTsJLyogQ3JlYXRpb24gdGltZSAqLworCXVpbnQzMl90CWlfbXRpbWU7CS8qIE1vZGlmaWNhdGlvbiB0aW1lICovCisJdWludDMyX3QJaV9kdGltZTsJLyogRGVsZXRpb24gVGltZSAqLworCXVpbnQxNl90CWlfZ2lkOwkJLyogTG93IDE2IGJpdHMgb2YgR3JvdXAgSWQgKi8KKwl1aW50MTZfdAlpX2xpbmtzX2NvdW50OwkvKiBMaW5rcyBjb3VudCAqLworCXVpbnQzMl90CWlfYmxvY2tzOwkvKiBCbG9ja3MgY291bnQgKi8KKwl1aW50MzJfdAlpX2ZsYWdzOwkvKiBGaWxlIGZsYWdzICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgIGxfaV9yZXNlcnZlZDE7CisJCX0gbGludXgxOworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgIGhfaV90cmFuc2xhdG9yOworCQl9IGh1cmQxOworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgIG1faV9yZXNlcnZlZDE7CisJCX0gbWFzaXgxOworCX0gb3NkMTsJCQkJLyogT1MgZGVwZW5kZW50IDEgKi8KKwl1aW50MzJfdAlpX2Jsb2NrW0VYVDJfTl9CTE9DS1NdOy8qIFBvaW50ZXJzIHRvIGJsb2NrcyAqLworCXVpbnQzMl90CWlfZ2VuZXJhdGlvbjsJLyogRmlsZSB2ZXJzaW9uIChmb3IgTkZTKSAqLworCXVpbnQzMl90CWlfZmlsZV9hY2w7CS8qIEZpbGUgQUNMICovCisJdWludDMyX3QJaV9kaXJfYWNsOwkvKiBEaXJlY3RvcnkgQUNMICovCisJdWludDMyX3QJaV9mYWRkcjsJLyogRnJhZ21lbnQgYWRkcmVzcyAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QJCWxfaV9mcmFnOwkvKiBGcmFnbWVudCBudW1iZXIgKi8KKwkJCXVpbnQ4X3QJCWxfaV9mc2l6ZTsJLyogRnJhZ21lbnQgc2l6ZSAqLworCQkJdWludDE2X3QJaV9wYWQxOworCQkJdWludDE2X3QJbF9pX3VpZF9oaWdoOwkvKiB0aGVzZSAyIGZpZWxkcyAgICAqLworCQkJdWludDE2X3QJbF9pX2dpZF9oaWdoOwkvKiB3ZXJlIHJlc2VydmVkMlswXSAqLworCQkJdWludDMyX3QJbF9pX3Jlc2VydmVkMjsKKwkJfSBsaW51eDI7CisJCXN0cnVjdCB7CisJCQl1aW50OF90CQloX2lfZnJhZzsJLyogRnJhZ21lbnQgbnVtYmVyICovCisJCQl1aW50OF90CQloX2lfZnNpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwkJCXVpbnQxNl90CWhfaV9tb2RlX2hpZ2g7CisJCQl1aW50MTZfdAloX2lfdWlkX2hpZ2g7CisJCQl1aW50MTZfdAloX2lfZ2lkX2hpZ2g7CisJCQl1aW50MzJfdAloX2lfYXV0aG9yOworCQl9IGh1cmQyOworCQlzdHJ1Y3QgeworCQkJdWludDhfdAkJbV9pX2ZyYWc7CS8qIEZyYWdtZW50IG51bWJlciAqLworCQkJdWludDhfdAkJbV9pX2ZzaXplOwkvKiBGcmFnbWVudCBzaXplICovCisJCQl1aW50MTZfdAltX3BhZDE7CisJCQl1aW50MzJfdAltX2lfcmVzZXJ2ZWQyWzJdOworCQl9IG1hc2l4MjsKKwl9IG9zZDI7CQkJCS8qIE9TIGRlcGVuZGVudCAyICovCit9OworCisvKgorICogUGVybWFuZW50IHBhcnQgb2YgYW4gbGFyZ2UgaW5vZGUgb24gdGhlIGRpc2sKKyAqLworc3RydWN0IGV4dDJfaW5vZGVfbGFyZ2UgeworCXVpbnQxNl90CWlfbW9kZTsJCS8qIEZpbGUgbW9kZSAqLworCXVpbnQxNl90CWlfdWlkOwkJLyogTG93IDE2IGJpdHMgb2YgT3duZXIgVWlkICovCisJdWludDMyX3QJaV9zaXplOwkJLyogU2l6ZSBpbiBieXRlcyAqLworCXVpbnQzMl90CWlfYXRpbWU7CS8qIEFjY2VzcyB0aW1lICovCisJdWludDMyX3QJaV9jdGltZTsJLyogQ3JlYXRpb24gdGltZSAqLworCXVpbnQzMl90CWlfbXRpbWU7CS8qIE1vZGlmaWNhdGlvbiB0aW1lICovCisJdWludDMyX3QJaV9kdGltZTsJLyogRGVsZXRpb24gVGltZSAqLworCXVpbnQxNl90CWlfZ2lkOwkJLyogTG93IDE2IGJpdHMgb2YgR3JvdXAgSWQgKi8KKwl1aW50MTZfdAlpX2xpbmtzX2NvdW50OwkvKiBMaW5rcyBjb3VudCAqLworCXVpbnQzMl90CWlfYmxvY2tzOwkvKiBCbG9ja3MgY291bnQgKi8KKwl1aW50MzJfdAlpX2ZsYWdzOwkvKiBGaWxlIGZsYWdzICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgIGxfaV9yZXNlcnZlZDE7CisJCX0gbGludXgxOworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgIGhfaV90cmFuc2xhdG9yOworCQl9IGh1cmQxOworCQlzdHJ1Y3QgeworCQkJdWludDMyX3QgIG1faV9yZXNlcnZlZDE7CisJCX0gbWFzaXgxOworCX0gb3NkMTsJCQkJLyogT1MgZGVwZW5kZW50IDEgKi8KKwl1aW50MzJfdAlpX2Jsb2NrW0VYVDJfTl9CTE9DS1NdOy8qIFBvaW50ZXJzIHRvIGJsb2NrcyAqLworCXVpbnQzMl90CWlfZ2VuZXJhdGlvbjsJLyogRmlsZSB2ZXJzaW9uIChmb3IgTkZTKSAqLworCXVpbnQzMl90CWlfZmlsZV9hY2w7CS8qIEZpbGUgQUNMICovCisJdWludDMyX3QJaV9kaXJfYWNsOwkvKiBEaXJlY3RvcnkgQUNMICovCisJdWludDMyX3QJaV9mYWRkcjsJLyogRnJhZ21lbnQgYWRkcmVzcyAqLworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXVpbnQ4X3QJCWxfaV9mcmFnOwkvKiBGcmFnbWVudCBudW1iZXIgKi8KKwkJCXVpbnQ4X3QJCWxfaV9mc2l6ZTsJLyogRnJhZ21lbnQgc2l6ZSAqLworCQkJdWludDE2X3QJaV9wYWQxOworCQkJdWludDE2X3QJbF9pX3VpZF9oaWdoOwkvKiB0aGVzZSAyIGZpZWxkcyAgICAqLworCQkJdWludDE2X3QJbF9pX2dpZF9oaWdoOwkvKiB3ZXJlIHJlc2VydmVkMlswXSAqLworCQkJdWludDMyX3QJbF9pX3Jlc2VydmVkMjsKKwkJfSBsaW51eDI7CisJCXN0cnVjdCB7CisJCQl1aW50OF90CQloX2lfZnJhZzsJLyogRnJhZ21lbnQgbnVtYmVyICovCisJCQl1aW50OF90CQloX2lfZnNpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwkJCXVpbnQxNl90CWhfaV9tb2RlX2hpZ2g7CisJCQl1aW50MTZfdAloX2lfdWlkX2hpZ2g7CisJCQl1aW50MTZfdAloX2lfZ2lkX2hpZ2g7CisJCQl1aW50MzJfdAloX2lfYXV0aG9yOworCQl9IGh1cmQyOworCQlzdHJ1Y3QgeworCQkJdWludDhfdAkJbV9pX2ZyYWc7CS8qIEZyYWdtZW50IG51bWJlciAqLworCQkJdWludDhfdAkJbV9pX2ZzaXplOwkvKiBGcmFnbWVudCBzaXplICovCisJCQl1aW50MTZfdAltX3BhZDE7CisJCQl1aW50MzJfdAltX2lfcmVzZXJ2ZWQyWzJdOworCQl9IG1hc2l4MjsKKwl9IG9zZDI7CQkJCS8qIE9TIGRlcGVuZGVudCAyICovCisJdWludDE2X3QJaV9leHRyYV9pc2l6ZTsKKwl1aW50MTZfdAlpX3BhZDE7Cit9OworCisjZGVmaW5lIGlfc2l6ZV9oaWdoCWlfZGlyX2FjbAorCisvKgorICogRmlsZSBzeXN0ZW0gc3RhdGVzCisgKi8KKyNkZWZpbmUgRVhUMl9WQUxJRF9GUwkJCTB4MDAwMQkvKiBVbm1vdW50ZWQgY2xlYW5seSAqLworI2RlZmluZSBFWFQyX0VSUk9SX0ZTCQkJMHgwMDAyCS8qIEVycm9ycyBkZXRlY3RlZCAqLworCisvKgorICogTW91bnQgZmxhZ3MKKyAqLworI2RlZmluZSBFWFQyX01PVU5UX0NIRUNLCQkweDAwMDEJLyogRG8gbW91bnQtdGltZSBjaGVja3MgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9HUlBJRAkJMHgwMDA0CS8qIENyZWF0ZSBmaWxlcyB3aXRoIGRpcmVjdG9yeSdzIGdyb3VwICovCisjZGVmaW5lIEVYVDJfTU9VTlRfREVCVUcJCTB4MDAwOAkvKiBTb21lIGRlYnVnZ2luZyBtZXNzYWdlcyAqLworI2RlZmluZSBFWFQyX01PVU5UX0VSUk9SU19DT05UCQkweDAwMTAJLyogQ29udGludWUgb24gZXJyb3JzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfRVJST1JTX1JPCQkweDAwMjAJLyogUmVtb3VudCBmcyBybyBvbiBlcnJvcnMgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9FUlJPUlNfUEFOSUMJCTB4MDA0MAkvKiBQYW5pYyBvbiBlcnJvcnMgKi8KKyNkZWZpbmUgRVhUMl9NT1VOVF9NSU5JWF9ERgkJMHgwMDgwCS8qIE1pbWljcyB0aGUgTWluaXggc3RhdGZzICovCisjZGVmaW5lIEVYVDJfTU9VTlRfTk9fVUlEMzIJCTB4MDIwMCAgLyogRGlzYWJsZSAzMi1iaXQgVUlEcyAqLworCisjZGVmaW5lIGNsZWFyX29wdChvLCBvcHQpCQlvICY9IH5FWFQyX01PVU5UXyMjb3B0CisjZGVmaW5lIHNldF9vcHQobywgb3B0KQkJCW8gfD0gRVhUMl9NT1VOVF8jI29wdAorI2RlZmluZSB0ZXN0X29wdChzYiwgb3B0KQkJKEVYVDJfU0Ioc2IpLT5zX21vdW50X29wdCAmIFwKKwkJCQkJIEVYVDJfTU9VTlRfIyNvcHQpCisvKgorICogTWF4aW1hbCBtb3VudCBjb3VudHMgYmV0d2VlbiB0d28gZmlsZXN5c3RlbSBjaGVja3MKKyAqLworI2RlZmluZSBFWFQyX0RGTF9NQVhfTU5UX0NPVU5UCQkyMAkvKiBBbGxvdyAyMCBtb3VudHMgKi8KKyNkZWZpbmUgRVhUMl9ERkxfQ0hFQ0tJTlRFUlZBTAkJMAkvKiBEb24ndCB1c2UgaW50ZXJ2YWwgY2hlY2sgKi8KKworLyoKKyAqIEJlaGF2aW91ciB3aGVuIGRldGVjdGluZyBlcnJvcnMKKyAqLworI2RlZmluZSBFWFQyX0VSUk9SU19DT05USU5VRQkJMQkvKiBDb250aW51ZSBleGVjdXRpb24gKi8KKyNkZWZpbmUgRVhUMl9FUlJPUlNfUk8JCQkyCS8qIFJlbW91bnQgZnMgcmVhZC1vbmx5ICovCisjZGVmaW5lIEVYVDJfRVJST1JTX1BBTklDCQkzCS8qIFBhbmljICovCisjZGVmaW5lIEVYVDJfRVJST1JTX0RFRkFVTFQJCUVYVDJfRVJST1JTX0NPTlRJTlVFCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgdGhlIHN1cGVyIGJsb2NrCisgKi8KK3N0cnVjdCBleHQyX3N1cGVyX2Jsb2NrIHsKKwl1aW50MzJfdAlzX2lub2Rlc19jb3VudDsJCS8qIElub2RlcyBjb3VudCAqLworCXVpbnQzMl90CXNfYmxvY2tzX2NvdW50OwkJLyogQmxvY2tzIGNvdW50ICovCisJdWludDMyX3QJc19yX2Jsb2Nrc19jb3VudDsJLyogUmVzZXJ2ZWQgYmxvY2tzIGNvdW50ICovCisJdWludDMyX3QJc19mcmVlX2Jsb2Nrc19jb3VudDsJLyogRnJlZSBibG9ja3MgY291bnQgKi8KKwl1aW50MzJfdAlzX2ZyZWVfaW5vZGVzX2NvdW50OwkvKiBGcmVlIGlub2RlcyBjb3VudCAqLworCXVpbnQzMl90CXNfZmlyc3RfZGF0YV9ibG9jazsJLyogRmlyc3QgRGF0YSBCbG9jayAqLworCXVpbnQzMl90CXNfbG9nX2Jsb2NrX3NpemU7CS8qIEJsb2NrIHNpemUgKi8KKwlpbnQzMl90CQlzX2xvZ19mcmFnX3NpemU7CS8qIEZyYWdtZW50IHNpemUgKi8KKwl1aW50MzJfdAlzX2Jsb2Nrc19wZXJfZ3JvdXA7CS8qICMgQmxvY2tzIHBlciBncm91cCAqLworCXVpbnQzMl90CXNfZnJhZ3NfcGVyX2dyb3VwOwkvKiAjIEZyYWdtZW50cyBwZXIgZ3JvdXAgKi8KKwl1aW50MzJfdAlzX2lub2Rlc19wZXJfZ3JvdXA7CS8qICMgSW5vZGVzIHBlciBncm91cCAqLworCXVpbnQzMl90CXNfbXRpbWU7CQkvKiBNb3VudCB0aW1lICovCisJdWludDMyX3QJc193dGltZTsJCS8qIFdyaXRlIHRpbWUgKi8KKwl1aW50MTZfdAlzX21udF9jb3VudDsJCS8qIE1vdW50IGNvdW50ICovCisJaW50MTZfdAkJc19tYXhfbW50X2NvdW50OwkvKiBNYXhpbWFsIG1vdW50IGNvdW50ICovCisJdWludDE2X3QJc19tYWdpYzsJCS8qIE1hZ2ljIHNpZ25hdHVyZSAqLworCXVpbnQxNl90CXNfc3RhdGU7CQkvKiBGaWxlIHN5c3RlbSBzdGF0ZSAqLworCXVpbnQxNl90CXNfZXJyb3JzOwkJLyogQmVoYXZpb3VyIHdoZW4gZGV0ZWN0aW5nIGVycm9ycyAqLworCXVpbnQxNl90CXNfbWlub3JfcmV2X2xldmVsOwkvKiBtaW5vciByZXZpc2lvbiBsZXZlbCAqLworCXVpbnQzMl90CXNfbGFzdGNoZWNrOwkJLyogdGltZSBvZiBsYXN0IGNoZWNrICovCisJdWludDMyX3QJc19jaGVja2ludGVydmFsOwkvKiBtYXguIHRpbWUgYmV0d2VlbiBjaGVja3MgKi8KKwl1aW50MzJfdAlzX2NyZWF0b3Jfb3M7CQkvKiBPUyAqLworCXVpbnQzMl90CXNfcmV2X2xldmVsOwkJLyogUmV2aXNpb24gbGV2ZWwgKi8KKwl1aW50MTZfdAlzX2RlZl9yZXN1aWQ7CQkvKiBEZWZhdWx0IHVpZCBmb3IgcmVzZXJ2ZWQgYmxvY2tzICovCisJdWludDE2X3QJc19kZWZfcmVzZ2lkOwkJLyogRGVmYXVsdCBnaWQgZm9yIHJlc2VydmVkIGJsb2NrcyAqLworCS8qCisJICogVGhlc2UgZmllbGRzIGFyZSBmb3IgRVhUMl9EWU5BTUlDX1JFViBzdXBlcmJsb2NrcyBvbmx5LgorCSAqCisJICogTm90ZTogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY29tcGF0aWJsZSBmZWF0dXJlIHNldCBhbmQKKwkgKiB0aGUgaW5jb21wYXRpYmxlIGZlYXR1cmUgc2V0IGlzIHRoYXQgaWYgdGhlcmUgaXMgYSBiaXQgc2V0CisJICogaW4gdGhlIGluY29tcGF0aWJsZSBmZWF0dXJlIHNldCB0aGF0IHRoZSBrZXJuZWwgZG9lc24ndAorCSAqIGtub3cgYWJvdXQsIGl0IHNob3VsZCByZWZ1c2UgdG8gbW91bnQgdGhlIGZpbGVzeXN0ZW0uCisJICoKKwkgKiBlMmZzY2sncyByZXF1aXJlbWVudHMgYXJlIG1vcmUgc3RyaWN0OyBpZiBpdCBkb2Vzbid0IGtub3cKKwkgKiBhYm91dCBhIGZlYXR1cmUgaW4gZWl0aGVyIHRoZSBjb21wYXRpYmxlIG9yIGluY29tcGF0aWJsZQorCSAqIGZlYXR1cmUgc2V0LCBpdCBtdXN0IGFib3J0IGFuZCBub3QgdHJ5IHRvIG1lZGRsZSB3aXRoCisJICogdGhpbmdzIGl0IGRvZXNuJ3QgdW5kZXJzdGFuZC4uLgorCSAqLworCXVpbnQzMl90CXNfZmlyc3RfaW5vOwkJLyogRmlyc3Qgbm9uLXJlc2VydmVkIGlub2RlICovCisJdWludDE2X3QJc19pbm9kZV9zaXplOwkJLyogc2l6ZSBvZiBpbm9kZSBzdHJ1Y3R1cmUgKi8KKwl1aW50MTZfdAlzX2Jsb2NrX2dyb3VwX25yOwkvKiBibG9jayBncm91cCAjIG9mIHRoaXMgc3VwZXJibG9jayAqLworCXVpbnQzMl90CXNfZmVhdHVyZV9jb21wYXQ7CS8qIGNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKwl1aW50MzJfdAlzX2ZlYXR1cmVfaW5jb21wYXQ7CS8qIGluY29tcGF0aWJsZSBmZWF0dXJlIHNldCAqLworCXVpbnQzMl90CXNfZmVhdHVyZV9yb19jb21wYXQ7CS8qIHJlYWRvbmx5LWNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKwl1aW50OF90CQlzX3V1aWRbMTZdOwkJLyogMTI4LWJpdCB1dWlkIGZvciB2b2x1bWUgKi8KKwljaGFyCQlzX3ZvbHVtZV9uYW1lWzE2XTsJLyogdm9sdW1lIG5hbWUgKi8KKwljaGFyCQlzX2xhc3RfbW91bnRlZFs2NF07CS8qIGRpcmVjdG9yeSB3aGVyZSBsYXN0IG1vdW50ZWQgKi8KKwl1aW50MzJfdAlzX2FsZ29yaXRobV91c2FnZV9iaXRtYXA7IC8qIEZvciBjb21wcmVzc2lvbiAqLworCS8qCisJICogUGVyZm9ybWFuY2UgaGludHMuICBEaXJlY3RvcnkgcHJlYWxsb2NhdGlvbiBzaG91bGQgb25seQorCSAqIGhhcHBlbiBpZiB0aGUgRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfUFJFQUxMT0MgZmxhZyBpcyBvbi4KKwkgKi8KKwl1aW50OF90CQlzX3ByZWFsbG9jX2Jsb2NrczsJLyogTnIgb2YgYmxvY2tzIHRvIHRyeSB0byBwcmVhbGxvY2F0ZSovCisJdWludDhfdAkJc19wcmVhbGxvY19kaXJfYmxvY2tzOwkvKiBOciB0byBwcmVhbGxvY2F0ZSBmb3IgZGlycyAqLworCXVpbnQxNl90CXNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrczsJLyogUGVyIGdyb3VwIHRhYmxlIGZvciBvbmxpbmUgZ3Jvd3RoICovCisJLyoKKwkgKiBKb3VybmFsaW5nIHN1cHBvcnQgdmFsaWQgaWYgRVhUMl9GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTCBzZXQuCisJICovCisvKkQwKi8JdWludDhfdAkJc19qb3VybmFsX3V1aWRbMTZdOwkvKiB1dWlkIG9mIGpvdXJuYWwgc3VwZXJibG9jayAqLworLypFMCovCXVpbnQzMl90CXNfam91cm5hbF9pbnVtOwkJLyogaW5vZGUgbnVtYmVyIG9mIGpvdXJuYWwgZmlsZSAqLworCXVpbnQzMl90CXNfam91cm5hbF9kZXY7CQkvKiBkZXZpY2UgbnVtYmVyIG9mIGpvdXJuYWwgZmlsZSAqLworCXVpbnQzMl90CXNfbGFzdF9vcnBoYW47CQkvKiBzdGFydCBvZiBsaXN0IG9mIGlub2RlcyB0byBkZWxldGUgKi8KKwl1aW50MzJfdAlzX2hhc2hfc2VlZFs0XTsJCS8qIEhUUkVFIGhhc2ggc2VlZCAqLworCXVpbnQ4X3QJCXNfZGVmX2hhc2hfdmVyc2lvbjsJLyogRGVmYXVsdCBoYXNoIHZlcnNpb24gdG8gdXNlICovCisJdWludDhfdAkJc19qbmxfYmFja3VwX3R5cGU7CS8qIERlZmF1bHQgdHlwZSBvZiBqb3VybmFsIGJhY2t1cCAqLworCXVpbnQxNl90CXNfcmVzZXJ2ZWRfd29yZF9wYWQ7CisvKjEwMCovCXVpbnQzMl90CXNfZGVmYXVsdF9tb3VudF9vcHRzOworCXVpbnQzMl90CXNfZmlyc3RfbWV0YV9iZzsJLyogRmlyc3QgbWV0YWJsb2NrIGdyb3VwICovCisJLyogZXh0MyBhZGRpdGlvbnMgKi8KKwl1aW50MzJfdAlzX21rZnNfdGltZTsJCS8qIFdoZW4gdGhlIGZpbGVzeXN0ZW0gd2FzIGNyZWF0ZWQgKi8KKwl1aW50MzJfdAlzX2pubF9ibG9ja3NbMTddOwkvKiBCYWNrdXAgb2YgdGhlIGpvdXJuYWwgaW5vZGUgKi8KKwkvKiA2NGJpdCBzdXBwb3J0IHZhbGlkIGlmIEVYVDRfRkVBVFVSRV9DT01QQVRfNjRCSVQgKi8KKy8qMTUwKi8JdWludDMyX3QJc19ibG9ja3NfY291bnRfaGk7CS8qIEJsb2NrcyBjb3VudCAqLworCXVpbnQzMl90CXNfcl9ibG9ja3NfY291bnRfaGk7CS8qIFJlc2VydmVkIGJsb2NrcyBjb3VudCAqLworCXVpbnQzMl90CXNfZnJlZV9ibG9ja3NfY291bnRfaGk7CS8qIEZyZWUgYmxvY2tzIGNvdW50ICovCisJdWludDE2X3QJc19taW5fZXh0cmFfaXNpemU7CS8qIEFsbCBpbm9kZXMgaGF2ZSBhdCBsZWFzdCAjIGJ5dGVzICovCisJdWludDE2X3QJc193YW50X2V4dHJhX2lzaXplOyAJLyogTmV3IGlub2RlcyBzaG91bGQgcmVzZXJ2ZSAjIGJ5dGVzICovCisJdWludDMyX3QJc19mbGFnczsJCS8qIE1pc2NlbGxhbmVvdXMgZmxhZ3MgKi8KKwl1aW50MTZfdAlzX3JhaWRfc3RyaWRlOwkJLyogUkFJRCBzdHJpZGUgKi8KKwl1aW50MTZfdAlzX21tcF9pbnRlcnZhbDsJCS8qICMgc2Vjb25kcyB0byB3YWl0IGluIE1NUCBjaGVja2luZyAqLworCXVpbnQ2NF90CXNfbW1wX2Jsb2NrOwkJLyogQmxvY2sgZm9yIG11bHRpLW1vdW50IHByb3RlY3Rpb24gKi8KKwl1aW50MzJfdAlzX3JhaWRfc3RyaXBlX3dpZHRoOwkvKiBibG9ja3Mgb24gYWxsIGRhdGEgZGlza3MgKE4qc3RyaWRlKSovCisJdWludDhfdAkJc19sb2dfZ3JvdXBzX3Blcl9mbGV4OwkvKiBGTEVYX0JHIGdyb3VwIHNpemUgKi8KKwl1aW50OF90CQlzX3Jlc2VydmVkX2NoYXJfcGFkMjsKKwl1aW50MTZfdAlzX3Jlc2VydmVkX3BhZDsKKwl1aW50MzJfdAlzX3Jlc2VydmVkWzE2Ml07CS8qIFBhZGRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgYmxvY2sgKi8KK307CitzdHJ1Y3QgQlVHX2V4dDJfc3VwZXJfYmxvY2sgeworCWNoYXIgYnVnW3NpemVvZihzdHJ1Y3QgZXh0Ml9zdXBlcl9ibG9jaykgPT0gMTAyNCA/IDEgOiAtMV07Cit9OworCisvKgorICogQ29kZXMgZm9yIG9wZXJhdGluZyBzeXN0ZW1zCisgKi8KKyNkZWZpbmUgRVhUMl9PU19MSU5VWAkJMAorI2RlZmluZSBFWFQyX09TX0hVUkQJCTEKKyNkZWZpbmUgRVhUMl9PU19NQVNJWAkJMgorI2RlZmluZSBFWFQyX09TX0ZSRUVCU0QJCTMKKyNkZWZpbmUgRVhUMl9PU19MSVRFUwkJNAorCisvKgorICogUmV2aXNpb24gbGV2ZWxzCisgKi8KKyNkZWZpbmUgRVhUMl9HT09EX09MRF9SRVYJMAkvKiBUaGUgZ29vZCBvbGQgKG9yaWdpbmFsKSBmb3JtYXQgKi8KKyNkZWZpbmUgRVhUMl9EWU5BTUlDX1JFVgkxCS8qIFYyIGZvcm1hdCB3LyBkeW5hbWljIGlub2RlIHNpemVzICovCisKKyNkZWZpbmUgRVhUMl9DVVJSRU5UX1JFVglFWFQyX0dPT0RfT0xEX1JFVgorI2RlZmluZSBFWFQyX01BWF9TVVBQX1JFVglFWFQyX0RZTkFNSUNfUkVWCisKKyNkZWZpbmUgRVhUMl9HT09EX09MRF9JTk9ERV9TSVpFIDEyOAorCisvKgorICogSm91cm5hbCBpbm9kZSBiYWNrdXAgdHlwZXMKKyAqLworI2RlZmluZSBFWFQzX0pOTF9CQUNLVVBfQkxPQ0tTCTEKKworLyoKKyAqIEZlYXR1cmUgc2V0IGRlZmluaXRpb25zCisgKi8KKworI2RlZmluZSBFWFQyX0hBU19DT01QQVRfRkVBVFVSRShzYixtYXNrKQkJCVwKKwkoIEVYVDJfU0Ioc2IpLT5zX2ZlYXR1cmVfY29tcGF0ICYgKG1hc2spICkKKyNkZWZpbmUgRVhUMl9IQVNfUk9fQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCisJKCBFWFQyX1NCKHNiKS0+c19mZWF0dXJlX3JvX2NvbXBhdCAmIChtYXNrKSApCisjZGVmaW5lIEVYVDJfSEFTX0lOQ09NUEFUX0ZFQVRVUkUoc2IsbWFzaykJCQlcCisJKCBFWFQyX1NCKHNiKS0+c19mZWF0dXJlX2luY29tcGF0ICYgKG1hc2spICkKKworLyogZm9yIHNfZmVhdHVyZV9jb21wYXQgKi8KKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfUFJFQUxMT0MJMHgwMDAxCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfSU1BR0lDX0lOT0RFUwkweDAwMDIKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0NPTVBBVF9IQVNfSk9VUk5BTAkJMHgwMDA0CisjZGVmaW5lIEVYVDJfRkVBVFVSRV9DT01QQVRfRVhUX0FUVFIJCTB4MDAwOAorI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX1JFU0laRV9JTk8JCTB4MDAxMAorI2RlZmluZSBFWFQyX0ZFQVRVUkVfQ09NUEFUX0RJUl9JTkRFWAkJMHgwMDIwCisKKy8qIGZvciBzX2ZlYXR1cmVfcm9fY29tcGF0ICovCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfU1BBUlNFX1NVUEVSCTB4MDAwMQorI2RlZmluZSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX0xBUkdFX0ZJTEUJMHgwMDAyCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfQlRSRUVfRElSCTB4MDAwNCAvKiBub3QgdXNlZCAqLworI2RlZmluZSBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0hVR0VfRklMRQkweDAwMDgKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX1JPX0NPTVBBVF9HRFRfQ1NVTQkJMHgwMDEwCisjZGVmaW5lIEVYVDRfRkVBVFVSRV9ST19DT01QQVRfRElSX05MSU5LCTB4MDAyMAorI2RlZmluZSBFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0VYVFJBX0lTSVpFCTB4MDA0MAorCisvKiBmb3Igc19mZWF0dXJlX2luY29tcGF0ICovCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9DT01QUkVTU0lPTgkweDAwMDEKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFCQkweDAwMDIKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1JFQ09WRVIJCTB4MDAwNAorI2RlZmluZSBFWFQzX0ZFQVRVUkVfSU5DT01QQVRfSk9VUk5BTF9ERVYJMHgwMDA4CisjZGVmaW5lIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9NRVRBX0JHCQkweDAwMTAKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0VYVEVOVFMJCTB4MDA0MAorI2RlZmluZSBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfNjRCSVQJCTB4MDA4MAorI2RlZmluZSBFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfTU1QCQkweDAxMDAKKyNkZWZpbmUgRVhUNF9GRUFUVVJFX0lOQ09NUEFUX0ZMRVhfQkcJCTB4MDIwMAorCisKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0NPTVBBVF9TVVBQCTAKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TVVBQCShFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1NQQVJTRV9TVVBFUnwgXAorCQkJCQkgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9MQVJHRV9GSUxFfCBcCisJCQkJCSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX0JUUkVFX0RJUikKKyNkZWZpbmUgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX1NVUFAJKEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9GSUxFVFlQRXwgXAorCQkJCQkgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX01FVEFfQkcpCisjZGVmaW5lIEVYVDJfRkVBVFVSRV9JTkNPTVBBVF9VTlNVUFBPUlRFRAkofkVYVDJfRkVBVFVSRV9JTkNPTVBBVF9TVVBQKQorI2RlZmluZSBFWFQyX0ZFQVRVUkVfUk9fQ09NUEFUX1VOU1VQUE9SVEVECSh+RVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TVVBQKQorCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9ST19DT01QQVRfU1VQUAkoRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVJ8IFwKKwkJCQkJIEVYVDJfRkVBVFVSRV9ST19DT01QQVRfTEFSR0VfRklMRXwgXAorCQkJCQkgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9CVFJFRV9ESVIpCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9TVVBQCShFWFQyX0ZFQVRVUkVfSU5DT01QQVRfRklMRVRZUEV8IFwKKwkJCQkJIEVYVDNfRkVBVFVSRV9JTkNPTVBBVF9SRUNPVkVSfCBcCisJCQkJCSBFWFQyX0ZFQVRVUkVfSU5DT01QQVRfTUVUQV9CRykKKyNkZWZpbmUgRVhUM19GRUFUVVJFX0lOQ09NUEFUX1VOU1VQUE9SVEVECSh+RVhUM19GRUFUVVJFX0lOQ09NUEFUX1NVUFApCisjZGVmaW5lIEVYVDNfRkVBVFVSRV9ST19DT01QQVRfVU5TVVBQT1JURUQJKH5FWFQzX0ZFQVRVUkVfUk9fQ09NUEFUX1NVUFApCisKKworLyoKKyAqIERlZmF1bHQgdmFsdWVzIGZvciB1c2VyIGFuZC9vciBncm91cCB1c2luZyByZXNlcnZlZCBibG9ja3MKKyAqLworI2RlZmluZSBFWFQyX0RFRl9SRVNVSUQJCTAKKyNkZWZpbmUgRVhUMl9ERUZfUkVTR0lECQkwCisKKy8qCisgKiBEZWZhdWx0IG1vdW50IG9wdGlvbnMKKyAqLworI2RlZmluZSBFWFQyX0RFRk1fREVCVUcJCTB4MDAwMQorI2RlZmluZSBFWFQyX0RFRk1fQlNER1JPVVBTCTB4MDAwMgorI2RlZmluZSBFWFQyX0RFRk1fWEFUVFJfVVNFUgkweDAwMDQKKyNkZWZpbmUgRVhUMl9ERUZNX0FDTAkJMHgwMDA4CisjZGVmaW5lIEVYVDJfREVGTV9VSUQxNgkJMHgwMDEwCisjZGVmaW5lIEVYVDNfREVGTV9KTU9ERQkJMHgwMDYwCisjZGVmaW5lIEVYVDNfREVGTV9KTU9ERV9EQVRBCTB4MDAyMAorI2RlZmluZSBFWFQzX0RFRk1fSk1PREVfT1JERVJFRAkweDAwNDAKKyNkZWZpbmUgRVhUM19ERUZNX0pNT0RFX1dCQUNLCTB4MDA2MAorCisvKgorICogU3RydWN0dXJlIG9mIGEgZGlyZWN0b3J5IGVudHJ5CisgKi8KKyNkZWZpbmUgRVhUMl9OQU1FX0xFTiAyNTUKKworc3RydWN0IGV4dDJfZGlyX2VudHJ5IHsKKwl1aW50MzJfdAlpbm9kZTsJCQkvKiBJbm9kZSBudW1iZXIgKi8KKwl1aW50MTZfdAlyZWNfbGVuOwkJLyogRGlyZWN0b3J5IGVudHJ5IGxlbmd0aCAqLworCXVpbnQxNl90CW5hbWVfbGVuOwkJLyogTmFtZSBsZW5ndGggKi8KKwljaGFyCQluYW1lW0VYVDJfTkFNRV9MRU5dOwkvKiBGaWxlIG5hbWUgKi8KK307CisKKy8qCisgKiBUaGUgbmV3IHZlcnNpb24gb2YgdGhlIGRpcmVjdG9yeSBlbnRyeS4gIFNpbmNlIEVYVDIgc3RydWN0dXJlcyBhcmUKKyAqIHN0b3JlZCBpbiBpbnRlbCBieXRlIG9yZGVyLCBhbmQgdGhlIG5hbWVfbGVuIGZpZWxkIGNvdWxkIG5ldmVyIGJlCisgKiBiaWdnZXIgdGhhbiAyNTUgY2hhcnMsIGl0J3Mgc2FmZSB0byByZWNsYWltIHRoZSBleHRyYSBieXRlIGZvciB0aGUKKyAqIGZpbGVfdHlwZSBmaWVsZC4KKyAqLworc3RydWN0IGV4dDJfZGlyX2VudHJ5XzIgeworCXVpbnQzMl90CWlub2RlOwkJCS8qIElub2RlIG51bWJlciAqLworCXVpbnQxNl90CXJlY19sZW47CQkvKiBEaXJlY3RvcnkgZW50cnkgbGVuZ3RoICovCisJdWludDhfdAkJbmFtZV9sZW47CQkvKiBOYW1lIGxlbmd0aCAqLworCXVpbnQ4X3QJCWZpbGVfdHlwZTsKKwljaGFyCQluYW1lW0VYVDJfTkFNRV9MRU5dOwkvKiBGaWxlIG5hbWUgKi8KK307CisKKy8qCisgKiBFeHQyIGRpcmVjdG9yeSBmaWxlIHR5cGVzLiAgT25seSB0aGUgbG93IDMgYml0cyBhcmUgdXNlZC4gIFRoZQorICogb3RoZXIgYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIG5vdy4KKyAqLworI2RlZmluZSBFWFQyX0ZUX1VOS05PV04JCTAKKyNkZWZpbmUgRVhUMl9GVF9SRUdfRklMRQkxCisjZGVmaW5lIEVYVDJfRlRfRElSCQkyCisjZGVmaW5lIEVYVDJfRlRfQ0hSREVWCQkzCisjZGVmaW5lIEVYVDJfRlRfQkxLREVWCQk0CisjZGVmaW5lIEVYVDJfRlRfRklGTwkJNQorI2RlZmluZSBFWFQyX0ZUX1NPQ0sJCTYKKyNkZWZpbmUgRVhUMl9GVF9TWU1MSU5LCQk3CisKKyNkZWZpbmUgRVhUMl9GVF9NQVgJCTgKKworLyoKKyAqIEVYVDJfRElSX1BBRCBkZWZpbmVzIHRoZSBkaXJlY3RvcnkgZW50cmllcyBib3VuZGFyaWVzCisgKgorICogTk9URTogSXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQKKyAqLworI2RlZmluZSBFWFQyX0RJUl9QQUQJCQk0CisjZGVmaW5lIEVYVDJfRElSX1JPVU5ECQkJKEVYVDJfRElSX1BBRCAtIDEpCisjZGVmaW5lIEVYVDJfRElSX1JFQ19MRU4obmFtZV9sZW4pCSgoKG5hbWVfbGVuKSArIDggKyBFWFQyX0RJUl9ST1VORCkgJiBcCisJCQkJCSB+RVhUMl9ESVJfUk9VTkQpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9idXN5Ym94LmggYi9pbmNsdWRlL2J1c3lib3guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWUzMWU1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9idXN5Ym94LmgKQEAgLTAsMCArMSw2MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2lmbmRlZiBCVVNZQk9YX0gKKyNkZWZpbmUgQlVTWUJPWF9IIDEKKworI2luY2x1ZGUgImxpYmJiLmgiCisvKiBCQl9ESVJfZm9vIGFuZCBCQl9TVUlEX2JhciBjb25zdGFudHM6ICovCisjaW5jbHVkZSAiYXBwbGV0X21ldGFkYXRhLmgiCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCisvKiBEZWZpbmVkIGluIGFwcGxldGxpYi5jIChieSBpbmNsdWRpbmcgZ2VuZXJhdGVkIGFwcGxldF90YWJsZXMuaCkgKi8KKy8qIEtlZXAgaW4gc3luYyB3aXRoIGFwcGxldHMvYXBwbGV0X3RhYmxlcy5jISAqLworZXh0ZXJuIGNvbnN0IGNoYXIgYXBwbGV0X25hbWVzW10gQUxJR04xOworZXh0ZXJuIGludCAoKmNvbnN0IGFwcGxldF9tYWluW10pKGludCBhcmdjLCBjaGFyICoqYXJndik7CitleHRlcm4gY29uc3QgdWludDE2X3QgYXBwbGV0X25hbWVvZnNbXTsKK2V4dGVybiBjb25zdCB1aW50OF90IGFwcGxldF9pbnN0YWxsX2xvY1tdIEFMSUdOMTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NVSUQgfHwgRU5BQkxFX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFMKKyMgZGVmaW5lIEFQUExFVF9OQU1FKGkpIChhcHBsZXRfbmFtZXMgKyAoYXBwbGV0X25hbWVvZnNbaV0gJiAweDBmZmYpKQorI2Vsc2UKKyMgZGVmaW5lIEFQUExFVF9OQU1FKGkpIChhcHBsZXRfbmFtZXMgKyBhcHBsZXRfbmFtZW9mc1tpXSkKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFMKKyMgZGVmaW5lIEFQUExFVF9JU19OT0ZPUksoaSkgKGFwcGxldF9uYW1lb2ZzW2ldICYgKDEgPDwgMTIpKQorIyBkZWZpbmUgQVBQTEVUX0lTX05PRVhFQyhpKSAoYXBwbGV0X25hbWVvZnNbaV0gJiAoMSA8PCAxMykpCisjZWxzZQorIyBkZWZpbmUgQVBQTEVUX0lTX05PRk9SSyhpKSAwCisjIGRlZmluZSBBUFBMRVRfSVNfTk9FWEVDKGkpIDAKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1VJRAorIyBkZWZpbmUgQVBQTEVUX1NVSUQoaSkgKChhcHBsZXRfbmFtZW9mc1tpXSA+PiAxNCkgJiAweDMpCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU1RBTExFUgorI2RlZmluZSBBUFBMRVRfSU5TVEFMTF9MT0MoaSkgKHsgXAorCXVuc2lnbmVkIHYgPSAoaSk7IFwKKwlpZiAodiAmIDEpIHYgPSBhcHBsZXRfaW5zdGFsbF9sb2Nbdi8yXSA+PiA0OyBcCisJZWxzZSB2ID0gYXBwbGV0X2luc3RhbGxfbG9jW3YvMl0gJiAweGY7IFwKKwl2OyB9KQorI2VuZGlmCisKKworLyogTGVuZ3RoIG9mIHRoZXNlIG5hbWVzIGhhcyBlZmZlY3Qgb24gc2l6ZSBvZiBsaWJidXN5Ym94CisgKiBhbmQgImluZGl2aWR1YWwiIGJpbmFyaWVzLiBLZWVwIHRoZW0gc2hvcnQuCisgKi8KKyNpZiBFTkFCTEVfQlVJTERfTElCQlVTWUJPWAorI2lmIEVOQUJMRV9GRUFUVVJFX1NIQVJFRF9CVVNZQk9YCitpbnQgbGJiX21haW4oY2hhciAqKmFyZ3YpIEVYVEVSTkFMTFlfVklTSUJMRTsKKyNlbHNlCitpbnQgbGJiX21haW4oY2hhciAqKmFyZ3YpOworI2VuZGlmCisjZW5kaWYKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2R1bXAuaCBiL2luY2x1ZGUvZHVtcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMjM3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2R1bXAuaApAQCAtMCwwICsxLDU2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKKyNkZWZpbmUJRl9JR05PUkUJMHgwMQkJLyogJV9BICovCisjZGVmaW5lCUZfU0VUUkVQCTB4MDIJCS8qIHJlcCBjb3VudCBzZXQsIG5vdCBkZWZhdWx0ICovCisjZGVmaW5lCUZfQUREUkVTUwkweDAwMQkJLyogcHJpbnQgb2Zmc2V0ICovCisjZGVmaW5lCUZfQlBBRAkJMHgwMDIJCS8qIGJsYW5rIHBhZCAqLworI2RlZmluZQlGX0MJCTB4MDA0CQkvKiAlX2MgKi8KKyNkZWZpbmUJRl9DSEFSCQkweDAwOAkJLyogJWMgKi8KKyNkZWZpbmUJRl9EQkwJCTB4MDEwCQkvKiAlW0VlZkdmXSAqLworI2RlZmluZQlGX0lOVAkJMHgwMjAJCS8qICVbZGldICovCisjZGVmaW5lCUZfUAkJMHgwNDAJCS8qICVfcCAqLworI2RlZmluZQlGX1NUUgkJMHgwODAJCS8qICVzICovCisjZGVmaW5lCUZfVQkJMHgxMDAJCS8qICVfdSAqLworI2RlZmluZQlGX1VJTlQJCTB4MjAwCQkvKiAlW291WHhdICovCisjZGVmaW5lCUZfVEVYVAkJMHg0MDAJCS8qIG5vIGNvbnZlcnNpb25zICovCisKK2VudW0gZHVtcF92ZmxhZ190IHsgQUxMLCBEVVAsIEZJUlNULCBXQUlUIH07CS8qIC12IHZhbHVlcyAqLworCit0eXBlZGVmIHN0cnVjdCBQUiB7CisJc3RydWN0IFBSICpuZXh0cHI7CQkvKiBuZXh0IHByaW50IHVuaXQgKi8KKwl1bnNpZ25lZCBmbGFnczsJCQkvKiBmbGFnIHZhbHVlcyAqLworCWludCBiY250OwkJCS8qIGJ5dGUgY291bnQgKi8KKwljaGFyICpjY2hhcjsJCQkvKiBjb252ZXJzaW9uIGNoYXJhY3RlciAqLworCWNoYXIgKmZtdDsJCQkvKiBwcmludGYgZm9ybWF0ICovCisJY2hhciAqbm9zcGFjZTsJCQkvKiBubyB3aGl0ZXNwYWNlIHZlcnNpb24gKi8KK30gUFI7CisKK3R5cGVkZWYgc3RydWN0IEZVIHsKKwlzdHJ1Y3QgRlUgKm5leHRmdTsJCS8qIG5leHQgZm9ybWF0IHVuaXQgKi8KKwlzdHJ1Y3QgUFIgKm5leHRwcjsJCS8qIG5leHQgcHJpbnQgdW5pdCAqLworCXVuc2lnbmVkIGZsYWdzOwkJCS8qIGZsYWcgdmFsdWVzICovCisJaW50IHJlcHM7CQkJLyogcmVwZXRpdGlvbiBjb3VudCAqLworCWludCBiY250OwkJCS8qIGJ5dGUgY291bnQgKi8KKwljaGFyICpmbXQ7CQkJLyogZm9ybWF0IHN0cmluZyAqLworfSBGVTsKKwordHlwZWRlZiBzdHJ1Y3QgRlMgewkJCS8qIGZvcm1hdCBzdHJpbmdzICovCisJc3RydWN0IEZTICpuZXh0ZnM7CQkvKiBsaW5rZWQgbGlzdCBvZiBmb3JtYXQgc3RyaW5ncyAqLworCXN0cnVjdCBGVSAqbmV4dGZ1OwkJLyogbGlua2VkIGxpc3Qgb2YgZm9ybWF0IHVuaXRzICovCisJaW50IGJjbnQ7Cit9IEZTOworCit0eXBlZGVmIHN0cnVjdCBkdW1wZXJfdCB7CisJb2ZmX3QgZHVtcF9za2lwOyAgICAgICAgICAgICAgICAvKiBieXRlcyB0byBza2lwICovCisJaW50IGR1bXBfbGVuZ3RoOyAgICAgICAgICAgICAgICAvKiBtYXggYnl0ZXMgdG8gcmVhZCAqLworCXNtYWxsaW50IGR1bXBfdmZsYWc7ICAgICAgICAgICAgLyplbnVtIGR1bXBfdmZsYWdfdCovCisJRlMgKmZzaGVhZDsKK30gZHVtcGVyX3Q7CisKK2R1bXBlcl90KiBhbGxvY19kdW1wZXIodm9pZCkgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgYmJfZHVtcF9hZGQoZHVtcGVyX3QgKmR1bXBlciwgY29uc3QgY2hhciAqZm10KSBGQVNUX0ZVTkM7CitleHRlcm4gaW50IGJiX2R1bXBfZHVtcChkdW1wZXJfdCAqZHVtcGVyLCBjaGFyICoqYXJndikgRkFTVF9GVU5DOworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9maXhfdTMyLmggYi9pbmNsdWRlL2ZpeF91MzIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmJhNmQwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9maXhfdTMyLmgKQEAgLTAsMCArMSw1NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVGhpcyBoZWFkZXIgbWFrZXMgaXQgZWFzaWVyIHRvIGluY2x1ZGUga2VybmVsIGhlYWRlcnMKKyAqIHdoaWNoIHVzZSB1MzIgYW5kIHN1Y2guCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2lmbmRlZiBGSVhfVTMyX0gKKyNkZWZpbmUgRklYX1UzMl9IIDEKKworLyogVHJ5IGhhcmQgdG8gcHVsbCBpbiB1MzIgdHlwZXMgYW5kIHN1Y2guCisgKiBPdGhlcndpc2UsICNpbmNsdWRlICJmaXhfdTMyLmgiICsgI2luY2x1ZGUgPGxpbnV4L2Zvby5oPgorICogbWF5IGVuZCB1cCB0eXBlZGVmJ2luZyBiYl9oYWNrX3UzMiBpbnNpZGUgZm9vLmgsCisgKiBhbmQgcmVwZWF0ZWQgdHlwZWRlZnMgYXJlbid0IGFsbG93ZWQgaW4gQy9DKysuCisgKi8KKyNpbmNsdWRlIDxhc20vdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCisvKiBJbiBjYXNlIGFib3ZlIGluY2x1ZGVzIHN0aWxsIGZhaWxlZCB0byBwcm92aWRlIHRoZSB0eXBlcywKKyAqIHByb3ZpZGUgdGhlbSBvdXJzZWxmCisgKi8KKyN1bmRlZiBfX3U2NAorI3VuZGVmIHU2NAorI3VuZGVmIHUzMgorI3VuZGVmIHUxNgorI3VuZGVmIHU4CisjdW5kZWYgX19zNjQKKyN1bmRlZiBzNjQKKyN1bmRlZiBzMzIKKyN1bmRlZiBzMTYKKyN1bmRlZiBzOAorCisjZGVmaW5lIF9fdTY0IGJiX2hhY2tfX191NjQKKyNkZWZpbmUgdTY0ICAgYmJfaGFja191NjQKKyNkZWZpbmUgdTMyICAgYmJfaGFja191MzIKKyNkZWZpbmUgdTE2ICAgYmJfaGFja191MTYKKyNkZWZpbmUgdTggICAgYmJfaGFja191OAorI2RlZmluZSBfX3M2NCBiYl9oYWNrX19fczY0CisjZGVmaW5lIHM2NCAgIGJiX2hhY2tfczY0CisjZGVmaW5lIHMzMiAgIGJiX2hhY2tfczMyCisjZGVmaW5lIHMxNiAgIGJiX2hhY2tfczE2CisjZGVmaW5lIHM4ICAgIGJiX2hhY2tfczgKKwordHlwZWRlZiB1aW50NjRfdCBfX3U2NDsKK3R5cGVkZWYgdWludDY0X3QgdTY0OwordHlwZWRlZiB1aW50MzJfdCB1MzI7Cit0eXBlZGVmIHVpbnQxNl90IHUxNjsKK3R5cGVkZWYgdWludDhfdCB1ODsKK3R5cGVkZWYgaW50NjRfdCBfX3M2NDsKK3R5cGVkZWYgaW50NjRfdCBzNjQ7Cit0eXBlZGVmIGludDMyX3QgczMyOwordHlwZWRlZiBpbnQxNl90IHMxNjsKK3R5cGVkZWYgaW50OF90IHM4OworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZ3JwXy5oIGIvaW5jbHVkZS9ncnBfLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIxM2NlMwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvZ3JwXy5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogQ29weXJpZ2h0IChDKSAxOTkxLDkyLDk1LDk2LDk3LDk4LDk5LDIwMDAsMDEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4KKyAqLworLyoKKyAqIFBPU0lYIFN0YW5kYXJkOiA5LjIuMSBHcm91cCBEYXRhYmFzZSBBY2Nlc3MJPGdycC5oPgorICovCisjaWZuZGVmIEJCX0dSUF9ICisjZGVmaW5lIEJCX0dSUF9IIDEKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKKy8qIFRoaXMgZmlsZSBpcyAjaW5jbHVkZWQgYWZ0ZXIgI2luY2x1ZGUgPGdycC5oPgorICogV2Ugd2lsbCB1c2UgbGliYy1kZWZpbmVkIHN0cnVjdHVyZXMsIGJ1dCB3aWxsICNkZWZpbmUgZnVuY3Rpb24gbmFtZXMKKyAqIHNvIHRoYXQgZnVuY3Rpb24gY2FsbHMgYXJlIGRpcmVjdGVkIHRvIGJiX2ludGVybmFsX1hYWCByZXBsYWNlbWVudHMKKyAqLworI3VuZGVmIGVuZGdyZW50CisjZGVmaW5lIGVuZGdyZW50ICAgICBiYl9pbnRlcm5hbF9lbmRncmVudAorI2RlZmluZSBnZXRncmdpZCAgICAgYmJfaW50ZXJuYWxfZ2V0Z3JnaWQKKyNkZWZpbmUgZ2V0Z3JuYW0gICAgIGJiX2ludGVybmFsX2dldGdybmFtCisjZGVmaW5lIGdldGdyb3VwbGlzdCBiYl9pbnRlcm5hbF9nZXRncm91cGxpc3QKKyNkZWZpbmUgaW5pdGdyb3VwcyAgIGJiX2ludGVybmFsX2luaXRncm91cHMKKworLyogQWxsIGZ1bmN0aW9uIG5hbWVzIGJlbG93IHNob3VsZCBiZSByZW1hcHBlZCBieSAjZGVmaW5lcyBhYm92ZQorICogaW4gb3JkZXIgdG8gbm90IGNvbGxpZGUgd2l0aCBsaWJjIG5hbWVzLiAqLworCisvKiBDbG9zZSB0aGUgZ3JvdXAtZmlsZSBzdHJlYW0uICAqLwordm9pZCBGQVNUX0ZVTkMgZW5kZ3JlbnQodm9pZCk7CisKKy8qIFNlYXJjaCBmb3IgYW4gZW50cnkgd2l0aCBhIG1hdGNoaW5nIGdyb3VwIElELiAgKi8KK3N0cnVjdCBncm91cCogRkFTVF9GVU5DIGdldGdyZ2lkKGdpZF90IF9fZ2lkKTsKKworLyogU2VhcmNoIGZvciBhbiBlbnRyeSB3aXRoIGEgbWF0Y2hpbmcgZ3JvdXAgbmFtZS4gICovCitzdHJ1Y3QgZ3JvdXAqIEZBU1RfRlVOQyBnZXRncm5hbShjb25zdCBjaGFyICpfX25hbWUpOworCisvKiBSZWVudHJhbnQgdmVyc2lvbnMgb2Ygc29tZSBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlLiAqLworCisvKiBTdG9yZSBhdCBtb3N0ICpOR1JPVVBTIG1lbWJlcnMgb2YgdGhlIGdyb3VwIHNldCBmb3IgVVNFUiBpbnRvCisgICAqR1JPVVBTLiAgQWxzbyBpbmNsdWRlIEdST1VQLiAgVGhlIGFjdHVhbCBudW1iZXIgb2YgZ3JvdXBzIGZvdW5kIGlzCisgICByZXR1cm5lZCBpbiAqTkdST1VQUy4gIFJldHVybiAtMSBpZiB0aGUgaWYgKk5HUk9VUFMgaXMgdG9vIHNtYWxsLiAgKi8KK2ludCBGQVNUX0ZVTkMgZ2V0Z3JvdXBsaXN0KGNvbnN0IGNoYXIgKl9fdXNlciwgZ2lkX3QgX19ncm91cCwKKwkJZ2lkX3QgKl9fZ3JvdXBzLCBpbnQgKl9fbmdyb3Vwcyk7CisKKy8qIEluaXRpYWxpemUgdGhlIGdyb3VwIHNldCBmb3IgdGhlIGN1cnJlbnQgdXNlcgorICAgYnkgcmVhZGluZyB0aGUgZ3JvdXAgZGF0YWJhc2UgYW5kIHVzaW5nIGFsbCBncm91cHMKKyAgIG9mIHdoaWNoIFVTRVIgaXMgYSBtZW1iZXIuICBBbHNvIGluY2x1ZGUgR1JPVVAuICAqLworaW50IEZBU1RfRlVOQyBpbml0Z3JvdXBzKGNvbnN0IGNoYXIgKl9fdXNlciwgZ2lkX3QgX19ncm91cCk7CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9pbmV0X2NvbW1vbi5oIGIvaW5jbHVkZS9pbmV0X2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MzhhYTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2luZXRfY29tbW9uLmgKQEAgLTAsMCArMSwzMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogc3RvbGVuIGZyb20gbmV0LXRvb2xzLTEuNTkgYW5kIHN0cmlwcGVkIGRvd24gZm9yIGJ1c3lib3ggYnkKKyAqICAgICAgICAgICAgICAgICAgICAgIEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBIZWF2aWx5IG1vZGlmaWVkIGJ5IE1hbnVlbCBOb3ZvYSBJSUkgICAgICAgTWFyIDEyLCAyMDAxCisgKgorICovCisjaWZuZGVmIElORVRfQ09NTU9OX0gKKyNkZWZpbmUgSU5FVF9DT01NT05fSCAxCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCisvKiBob3N0Zmlyc3QhPTAgSWYgd2UgZXhwZWN0IHRoaXMgdG8gYmUgYSBob3N0bmFtZSwKKyAgIHRyeSBob3N0bmFtZSBkYXRhYmFzZSBmaXJzdAorICovCitpbnQgSU5FVF9yZXNvbHZlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc19pbiwgaW50IGhvc3RmaXJzdCkgRkFTVF9GVU5DOworCisvKiBudW1lcmljOiAmIDB4ODAwMDogImRlZmF1bHQiIGluc3RlYWQgb2YgIioiLAorICogICAgICAgICAgJiAweDQwMDA6IGhvc3QgaW5zdGVhZCBvZiBuZXQsCisgKiAgICAgICAgICAmIDB4MGZmZjogZG9uJ3QgcmVzb2x2ZQorICovCisKK2ludCBJTkVUNl9yZXNvbHZlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjYpIEZBU1RfRlVOQzsKKworLyogVGhlc2UgcmV0dXJuIG1hbGxvY2VkIHN0cmluZyAqLworY2hhciAqSU5FVF9ycmVzb2x2ZShzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNfaW4sIGludCBudW1lcmljLCB1aW50MzJfdCBuZXRtYXNrKSBGQVNUX0ZVTkM7CitjaGFyICpJTkVUNl9ycmVzb2x2ZShzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42LCBpbnQgbnVtZXJpYykgRkFTVF9GVU5DOworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGliYmIuaCBiL2luY2x1ZGUvbGliYmIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGNlYjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saWJiYi5oCkBAIC0wLDAgKzEsMjEyNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQnVzeWJveCBtYWluIGludGVybmFsIGhlYWRlciBmaWxlCisgKgorICogQmFzZWQgaW4gcGFydCBvbiBjb2RlIGZyb20gc2FzaCwgQ29weXJpZ2h0IChjKSAxOTk5IGJ5IERhdmlkIEkuIEJlbGwKKyAqIFBlcm1pc3Npb24gaGFzIGJlZW4gZ3JhbnRlZCB0byByZWRpc3RyaWJ1dGUgdGhpcyBjb2RlIHVuZGVyIEdQTC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaWZuZGVmIExJQkJCX0gKKyNkZWZpbmUgTElCQkJfSCAxCisKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2lmIGRlZmluZWQgX19VQ0xJQkNfXyAvKiBUT0RPOiBhbmQgZ2xpYmM/ICovCisvKiB1c2UgaW5saW5lZCB2ZXJzaW9ucyBvZiB0aGVzZTogKi8KKyMgZGVmaW5lIHNpZ2ZpbGxzZXQocykgICAgX19zaWdmaWxsc2V0KHMpCisjIGRlZmluZSBzaWdlbXB0eXNldChzKSAgIF9fc2lnZW1wdHlzZXQocykKKyMgZGVmaW5lIHNpZ2lzZW1wdHlzZXQocykgX19zaWdpc2VtcHR5c2V0KHMpCisjZW5kaWYKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorLyogVGhlcmUgYXJlIHR3byBpbmNvbXBhdGlibGUgYmFzZW5hbWUncywgbGV0J3Mgbm90IHVzZSB0aGVtISAqLworLyogU2VlIHRoZSBkaXJuYW1lL2Jhc2VuYW1lIG1hbiBwYWdlIGZvciBkZXRhaWxzICovCisjaW5jbHVkZSA8bGliZ2VuLmg+IC8qIGRpcm5hbWUsYmFzZW5hbWUgKi8KKyN1bmRlZiBiYXNlbmFtZQorI2RlZmluZSBiYXNlbmFtZSBkb250X3VzZV9iYXNlbmFtZQorI2luY2x1ZGUgPHBvbGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaWZuZGVmIG1ham9yCisjIGluY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxncnAuaD4KKyNpZiBFTkFCTEVfRkVBVFVSRV9TSEFET1dQQVNTV0RTCisjIGlmICFFTkFCTEVfVVNFX0JCX1NIQURPVworLyogSWYgdXNpbmcgYnVzeWJveCdzIHNoYWRvdyBpbXBsZW1lbnRhdGlvbiwgZG8gbm90IGluY2x1ZGUgdGhlIHNoYWRvdy5oCisgKiBoZWFkZXIgYXMgdGhlIHRvb2xjaGFpbiBtYXkgbm90IHByb3ZpZGUgaXQgYXQgYWxsLgorICovCisjICBpbmNsdWRlIDxzaGFkb3cuaD4KKyMgZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoQU5EUk9JRCkgfHwgZGVmaW5lZChfX0FORFJPSURfXykKKyMgZGVmaW5lIGVuZHB3ZW50KCkgKCh2b2lkKTApCisjIGRlZmluZSBlbmRncmVudCgpICgodm9pZCkwKQorI2VuZGlmCisjaWZkZWYgSEFWRV9NTlRFTlRfSAorIyBpbmNsdWRlIDxtbnRlbnQuaD4KKyNlbmRpZgorI2lmZGVmIEhBVkVfU1lTX1NUQVRGU19ICisjIGluY2x1ZGUgPHN5cy9zdGF0ZnMuaD4KKyNlbmRpZgorLyogRG9uJ3QgZG8gdGhpcyBoZXJlOgorICogI2luY2x1ZGUgPHN5cy9zeXNpbmZvLmg+CisgKiBTb21lIGxpbnV4LyBpbmNsdWRlcyBwdWxsIGluIGNvbmZsaWN0aW5nIGRlZmluaXRpb24KKyAqIG9mIHN0cnVjdCBzeXNpbmZvIChvbmx5IGluIHNvbWUgdG9vbGNoYW5pbnMpLCB3aGljaCBicmVha3MgYnVpbGQuCisgKiBJbmNsdWRlIHN5cy9zeXNpbmZvLmggb25seSBpbiB0aG9zZSBmaWxlcyB3aGljaCBuZWVkIGl0LgorICovCisjaWYgRU5BQkxFX1NFTElOVVgKKyMgaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+CisjIGluY2x1ZGUgPHNlbGludXgvY29udGV4dC5oPgorIyBpbmNsdWRlIDxzZWxpbnV4L2ZsYXNrLmg+CisjIGluY2x1ZGUgPHNlbGludXgvYXZfcGVybWlzc2lvbnMuaD4KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1VUTVAKKyMgaWYgZGVmaW5lZCBfX1VDTElCQ19fICYmICggXAorICAgIChVQ0xJQkNfVkVSU0lPTiA+PSBLRVJORUxfVkVSU0lPTigwLCA5LCAzMikgXAorICAgICAmJiBVQ0xJQkNfVkVSU0lPTiA8IEtFUk5FTF9WRVJTSU9OKDAsIDksIDM0KSBcCisgICAgICYmIGRlZmluZWQgX19VQ0xJQkNfSEFTX1VUTVBYX18gXAorICAgICkgfHwgKCBcCisJIFVDTElCQ19WRVJTSU9OID49IEtFUk5FTF9WRVJTSU9OKDAsIDksIDM0KSBcCisJKSBcCisgICkKKyMgIGluY2x1ZGUgPHV0bXB4Lmg+CisjIGVsaWYgZGVmaW5lZCBfX1VDTElCQ19fCisjICBpbmNsdWRlIDx1dG1wLmg+CisjICBkZWZpbmUgdXRtcHggdXRtcAorIyAgZGVmaW5lIHNldHV0eGVudCBzZXR1dGVudAorIyAgZGVmaW5lIGVuZHV0eGVudCBlbmR1dGVudAorIyAgZGVmaW5lIGdldHV0eGVudCBnZXR1dGVudAorIyAgZGVmaW5lIGdldHV0eGlkIGdldHV0aWQKKyMgIGRlZmluZSBnZXR1dHhsaW5lIGdldHV0bGluZQorIyAgZGVmaW5lIHB1dHV0eGxpbmUgcHV0dXRsaW5lCisjICBkZWZpbmUgdXRtcHhuYW1lIHV0bXBuYW1lCisjICBkZWZpbmUgdXBkd3RtcHggdXBkd3RtcAorIyAgZGVmaW5lIF9QQVRIX1VUTVBYIF9QQVRIX1VUTVAKKyMgZWxzZQorIyAgaW5jbHVkZSA8dXRtcHguaD4KKyMgZW5kaWYKKyNlbmRpZgorI2lmIEVOQUJMRV9MT0NBTEVfU1VQUE9SVAorIyBpbmNsdWRlIDxsb2NhbGUuaD4KKyNlbHNlCisjIGRlZmluZSBzZXRsb2NhbGUoeCx5KSAoKHZvaWQpMCkKKyNlbmRpZgorI2lmZGVmIERNQUxMT0MKKyMgaW5jbHVkZSA8ZG1hbGxvYy5oPgorI2VuZGlmCisvKiBKdXN0IGluIGNhc2UgbGliYyBkb2Vzbid0IGRlZmluZSBzb21lIG9mIHRoZXNlLi4uICovCisjaWZuZGVmIF9QQVRIX1BBU1NXRAorI2RlZmluZSBfUEFUSF9QQVNTV0QgICIvZXRjL3Bhc3N3ZCIKKyNlbmRpZgorI2lmbmRlZiBfUEFUSF9HUk9VUAorI2RlZmluZSBfUEFUSF9HUk9VUCAgICIvZXRjL2dyb3VwIgorI2VuZGlmCisjaWZuZGVmIF9QQVRIX1NIQURPVworI2RlZmluZSBfUEFUSF9TSEFET1cgICIvZXRjL3NoYWRvdyIKKyNlbmRpZgorI2lmbmRlZiBfUEFUSF9HU0hBRE9XCisjZGVmaW5lIF9QQVRIX0dTSEFET1cgIi9ldGMvZ3NoYWRvdyIKKyNlbmRpZgorI2lmIGRlZmluZWQgX19GcmVlQlNEX18gfHwgZGVmaW5lZCBfX09wZW5CU0RfXworIyBpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjIGluY2x1ZGUgPGFycGEvaW5ldC5oPgorI2VsaWYgZGVmaW5lZCBfX0FQUExFX18KKyMgaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2Vsc2UKKyMgaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjIGlmICFkZWZpbmVkKF9fc29ja2xlbl90X2RlZmluZWQpICYmICFkZWZpbmVkKF9TT0NLTEVOX1RfREVDTEFSRUQpCisvKiBXZSAjZGVmaW5lIHNvY2tsZW5fdCAqYWZ0ZXIqIGluY2x1ZGVzLCBvdGhlcndpc2Ugd2UgZ2V0CisgKiB0eXBlZGVmIHJlZGVmaW5pdGlvbiBlcnJvcnMgZnJvbSBzeXN0ZW0gaGVhZGVycworICogKGluIGNhc2UgImlzIGl0IGRlZmluZWQgYWxyZWFkeSIgZGV0ZWN0aW9uIGFib3ZlIGZhaWxlZCkKKyAqLworIyAgZGVmaW5lIHNvY2tsZW5fdCBiYl9zb2NrbGVuX3QKKyAgIHR5cGVkZWYgdW5zaWduZWQgc29ja2xlbl90OworIyBlbmRpZgorI2VuZGlmCisjaWZuZGVmIEhBVkVfQ0xFQVJFTlYKKyMgZGVmaW5lIGNsZWFyZW52KCkgZG8geyBpZiAoZW52aXJvbikgZW52aXJvblswXSA9IE5VTEw7IH0gd2hpbGUgKDApCisjZW5kaWYKKyNpZm5kZWYgSEFWRV9GREFUQVNZTkMKKyMgZGVmaW5lIGZkYXRhc3luYyBmc3luYworI2VuZGlmCisjaWZuZGVmIEhBVkVfWFRBQlMKKyMgZGVmaW5lIFhUQUJTIFRBQjMKKyNlbmRpZgorCisKKy8qIFNvbWUgbGliYydzIGZvcmdldCB0byBkZWNsYXJlIHRoZXNlLCBkbyBpdCBvdXJzZWxmICovCisKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKKyNpZiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgX19HTElCQ19fIDwgMgoraW50IHZkcHJpbnRmKGludCBkLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApOworI2VuZGlmCisvKiBrbG9nY3RsIGlzIGluIGxpYmMncyBrbG9nLmgsIGJ1dCB3ZSBjaGVhdCBhbmQgbm90ICNpbmNsdWRlIHRoYXQgKi8KK2ludCBrbG9nY3RsKGludCB0eXBlLCBjaGFyICpiLCBpbnQgbGVuKTsKKyNpZm5kZWYgUEFUSF9NQVgKKyMgZGVmaW5lIFBBVEhfTUFYIDI1NgorI2VuZGlmCisjaWZuZGVmIEJVRlNJWgorIyBkZWZpbmUgQlVGU0laIDQwOTYKKyNlbmRpZgorCisKKy8qIEJ1c3lib3ggZG9lcyBub3QgdXNlIHRocmVhZHMsIHdlIGNhbiBzcGVlZCB1cCBzdGRpby4gKi8KKyNpZmRlZiBIQVZFX1VOTE9DS0VEX1NURElPCisjIHVuZGVmICBnZXRjCisjIGRlZmluZSBnZXRjKHN0cmVhbSkgZ2V0Y191bmxvY2tlZChzdHJlYW0pCisjIHVuZGVmICBnZXRjaGFyCisjIGRlZmluZSBnZXRjaGFyKCkgZ2V0Y2hhcl91bmxvY2tlZCgpCisjIHVuZGVmICBwdXRjCisjIGRlZmluZSBwdXRjKGMsIHN0cmVhbSkgcHV0Y191bmxvY2tlZChjLCBzdHJlYW0pCisjIHVuZGVmICBwdXRjaGFyCisjIGRlZmluZSBwdXRjaGFyKGMpIHB1dGNoYXJfdW5sb2NrZWQoYykKKyMgdW5kZWYgIGZnZXRjCisjIGRlZmluZSBmZ2V0YyhzdHJlYW0pIGdldGNfdW5sb2NrZWQoc3RyZWFtKQorIyB1bmRlZiAgZnB1dGMKKyMgZGVmaW5lIGZwdXRjKGMsIHN0cmVhbSkgcHV0Y191bmxvY2tlZChjLCBzdHJlYW0pCisjZW5kaWYKKy8qIEFib3ZlIGZ1bmN0aW9ucyBhcmUgcmVxdWlyZWQgYnkgUE9TSVguMS0yMDA4LCBiZWxvdyBvbmVzIGFyZSBleHRlbnNpb25zICovCisjaWZkZWYgSEFWRV9VTkxPQ0tFRF9MSU5FX09QUworIyB1bmRlZiAgZmdldHMKKyMgZGVmaW5lIGZnZXRzKHMsIG4sIHN0cmVhbSkgZmdldHNfdW5sb2NrZWQocywgbiwgc3RyZWFtKQorIyB1bmRlZiAgZnB1dHMKKyMgZGVmaW5lIGZwdXRzKHMsIHN0cmVhbSkgZnB1dHNfdW5sb2NrZWQocywgc3RyZWFtKQorI2VuZGlmCisKKworLyogTWFrZSBhbGwgZGVjbGFyYXRpb25zIGhpZGRlbiAoLWZ2aXNpYmlsaXR5IGZsYWcgb25seSBhZmZlY3RzIGRlZmluaXRpb25zKSAqLworLyogKGRvbid0IGluY2x1ZGUgc3lzdGVtIGhlYWRlcnMgYWZ0ZXIgdGhpcyB1bnRpbCBjb3JyZXNwb25kaW5nIHBvcCEpICovCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworCisjaWYgRU5BQkxFX1VTRV9CQl9QV0RfR1JQCisjIGluY2x1ZGUgInB3ZF8uaCIKKyMgaW5jbHVkZSAiZ3JwXy5oIgorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hBRE9XUEFTU1dEUworIyBpZiBFTkFCTEVfVVNFX0JCX1NIQURPVworIyAgaW5jbHVkZSAic2hhZG93Xy5oIgorIyBlbmRpZgorI2VuZGlmCisKKy8qIFRlc3RlZCB0byB3b3JrIGNvcnJlY3RseSB3aXRoIGFsbCBpbnQgdHlwZXMgKElJUkMgOl0pICovCisjZGVmaW5lIE1BWElOVChUKSAoVCkoIFwKKwkoKFQpLTEpID4gMCBcCisJPyAoVCktMSBcCisJOiAoVCl+KChUKTEgPDwgKHNpemVvZihUKSo4LTEpKSBcCisJKQorCisjZGVmaW5lIE1JTklOVChUKSAoVCkoIFwKKwkoKFQpLTEpID4gMCBcCisJPyAoVCkwIFwKKwk6ICgoVCkxIDw8IChzaXplb2YoVCkqOC0xKSkgXAorCSkKKworLyogTGFyZ2UgZmlsZSBzdXBwb3J0ICovCisvKiBOb3RlIHRoYXQgQ09ORklHX0xGUz15IGZvcmNlcyBiYm94IHRvIGJlIGJ1aWx0IHdpdGggYWxsIGNvbW1vbiBvcHMKKyAqIChzdGF0LCBsc2VlayBldGMpIG1hcHBlZCB0byAibGFyZ2VmaWxlIiB2YXJpYW50cyBieSBsaWJjLgorICogUHJhY3RpY2FsbHkgaXQgbWVhbnMgdGhhdCBvcGVuKCkgYXV0b21hdGljYWxseSBoYXMgT19MQVJHRUZJTEUgYWRkZWQKKyAqIGFuZCBhbGwgZmlsZXNpemUvZmlsZV9vZmZzZXQgcGFyYW1ldGVycyBhbmQgc3RydWN0IG1lbWJlcnMgYXJlICJsYXJnZSIKKyAqIChpbiB0b2RheSdzIHdvcmxkIC0gc2lnbmVkIDY0Yml0KS4gRm9yIGZ1bGwgc3VwcG9ydCBvZiBsYXJnZSBmaWxlcywKKyAqIHdlIG5lZWQgYSBmZXcgaGVscGVyICNkZWZpbmVzIChiZWxvdykgYW5kIGNhcmVmdWwgdXNlIG9mIG9mZl90CisgKiBpbnN0ZWFkIG9mIGludC9zc2l6ZV90LiBObyBsc2VlazY0KCksIE9fTEFSR0VGSUxFIGV0YyBuZWNlc3NhcnkgKi8KKyNpZiBFTkFCTEVfTEZTCisvKiBDT05GSUdfTEZTIGlzIG9uICovCisjIGlmIFVMT05HX01BWCA+IDB4ZmZmZmZmZmYKKy8qICJsb25nIiBpcyBsb25nIGVub3VnaCBvbiB0aGlzIHN5c3RlbSAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVvZmZfdDsKKyMgIGRlZmluZSBYQVRPT0ZGKGEpIHhhdG91bF9yYW5nZSgoYSksIDAsIExPTkdfTUFYKQorLyogdXNhZ2U6IHN6ID0gQkJfU1RSVE9PRkYocywgTlVMTCwgMTApOyBpZiAoZXJybm8gfHwgc3ogPCAwKSBkaWUoKTsgKi8KKyMgIGRlZmluZSBCQl9TVFJUT09GRiBiYl9zdHJ0b3VsCisjICBkZWZpbmUgU1RSVE9PRkYgc3RydG91bAorLyogdXNhZ2U6IHByaW50Zigic2l6ZTogJSJPRkZfRk1UImQgKCUiT0ZGX0ZNVCJ4KVxuIiwgc3osIHN6KTsgKi8KKyMgIGRlZmluZSBPRkZfRk1UICJsIgorIyBlbHNlCisvKiAibG9uZyIgaXMgdG9vIHNob3J0LCBuZWVkICJsb25nIGxvbmciICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1b2ZmX3Q7CisjICBkZWZpbmUgWEFUT09GRihhKSB4YXRvdWxsX3JhbmdlKChhKSwgMCwgTExPTkdfTUFYKQorIyAgZGVmaW5lIEJCX1NUUlRPT0ZGIGJiX3N0cnRvdWxsCisjICBkZWZpbmUgU1RSVE9PRkYgc3RydG91bGwKKyMgIGRlZmluZSBPRkZfRk1UICJsbCIKKyMgZW5kaWYKKyNlbHNlCisvKiBDT05GSUdfTEZTIGlzIG9mZiAqLworIyBpZiBVSU5UX01BWCA9PSAweGZmZmZmZmZmCisvKiBXaGlsZSBzaXplb2Yob2ZmX3QpID09IHNpemVvZihpbnQpLCBvZmZfdCBpcyB0eXBlZGVmJ2VkIHRvIGxvbmcgYW55d2F5LgorICogZ2NjIHdpbGwgdGhyb3cgd2FybmluZ3Mgb24gcHJpbnRmKCIlZCIsIG9mZl90KS4gQ3JhcC4uLiAqLwordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVvZmZfdDsKKyMgIGRlZmluZSBYQVRPT0ZGKGEpIHhhdG9pX3Bvc2l0aXZlKGEpCisjICBkZWZpbmUgQkJfU1RSVE9PRkYgYmJfc3RydG91CisjICBkZWZpbmUgU1RSVE9PRkYgc3RydG9sCisjICBkZWZpbmUgT0ZGX0ZNVCAibCIKKyMgZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIHVvZmZfdDsKKyMgIGRlZmluZSBYQVRPT0ZGKGEpIHhhdG91bF9yYW5nZSgoYSksIDAsIExPTkdfTUFYKQorIyAgZGVmaW5lIEJCX1NUUlRPT0ZGIGJiX3N0cnRvdWwKKyMgIGRlZmluZSBTVFJUT09GRiBzdHJ0b2wKKyMgIGRlZmluZSBPRkZfRk1UICJsIgorIyBlbmRpZgorI2VuZGlmCisvKiBzY2FyeS4gYmV0dGVyIGlkZWFzPyAoYnV0IGRvICp0ZXN0KiB0aGVtIGZpcnN0ISkgKi8KKyNkZWZpbmUgT0ZGX1RfTUFYICAoKG9mZl90KX4oKG9mZl90KTEgPDwgKHNpemVvZihvZmZfdCkqOC0xKSkpCisvKiBVc2VycyByZXBvcnQgYmlvbmljIHRvIHVzZSAzMi1iaXQgb2ZmX3QgZXZlbiBpZiBMQVJHRUZJTEUgc3VwcG9ydCBpcyByZXF1ZXN0ZWQuCisgKiBXZSBtaXNkZXRlY3RlZCB0aGF0LiBEb24ndCBsZXQgaXQgYnVpbGQ6CisgKi8KK3N0cnVjdCBCVUdfb2ZmX3Rfc2l6ZV9pc19taXNkZXRlY3RlZCB7CisJY2hhciBCVUdfb2ZmX3Rfc2l6ZV9pc19taXNkZXRlY3RlZFtzaXplb2Yob2ZmX3QpID09IHNpemVvZih1b2ZmX3QpID8gMSA6IC0xXTsKK307CisKKy8qIFNvbWUgdXNlZnVsIGRlZmluaXRpb25zICovCisjdW5kZWYgRkFMU0UKKyNkZWZpbmUgRkFMU0UgICAoKGludCkgMCkKKyN1bmRlZiBUUlVFCisjZGVmaW5lIFRSVUUgICAgKChpbnQpIDEpCisjdW5kZWYgU0tJUAorI2RlZmluZSBTS0lQCSgoaW50KSAyKQorCisvKiBNYWNyb3MgZm9yIG1pbi9tYXguICAqLworI2lmbmRlZiBNSU4KKyNkZWZpbmUgTUlOKGEsYikgKCgoYSk8KGIpKT8oYSk6KGIpKQorI2VuZGlmCisKKyNpZm5kZWYgTUFYCisjZGVmaW5lIE1BWChhLGIpICgoKGEpPihiKSk/KGEpOihiKSkKKyNlbmRpZgorCisvKiBidWZmZXIgYWxsb2NhdGlvbiBzY2hlbWVzICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfQlVGRkVSU19HT19PTl9TVEFDSworI2RlZmluZSBSRVNFUlZFX0NPTkZJR19CVUZGRVIoYnVmZmVyLGxlbikgIGNoYXIgYnVmZmVyW2xlbl0KKyNkZWZpbmUgUkVTRVJWRV9DT05GSUdfVUJVRkZFUihidWZmZXIsbGVuKSB1bnNpZ25lZCBjaGFyIGJ1ZmZlcltsZW5dCisjZGVmaW5lIFJFTEVBU0VfQ09ORklHX0JVRkZFUihidWZmZXIpICAgICAgKCh2b2lkKTApCisjZWxzZQorI2lmIEVOQUJMRV9GRUFUVVJFX0JVRkZFUlNfR09fSU5fQlNTCisjZGVmaW5lIFJFU0VSVkVfQ09ORklHX0JVRkZFUihidWZmZXIsbGVuKSAgc3RhdGljICAgICAgICAgIGNoYXIgYnVmZmVyW2xlbl0KKyNkZWZpbmUgUkVTRVJWRV9DT05GSUdfVUJVRkZFUihidWZmZXIsbGVuKSBzdGF0aWMgdW5zaWduZWQgY2hhciBidWZmZXJbbGVuXQorI2RlZmluZSBSRUxFQVNFX0NPTkZJR19CVUZGRVIoYnVmZmVyKSAgICAgICgodm9pZCkwKQorI2Vsc2UKKyNkZWZpbmUgUkVTRVJWRV9DT05GSUdfQlVGRkVSKGJ1ZmZlcixsZW4pICBjaGFyICpidWZmZXIgPSB4bWFsbG9jKGxlbikKKyNkZWZpbmUgUkVTRVJWRV9DT05GSUdfVUJVRkZFUihidWZmZXIsbGVuKSB1bnNpZ25lZCBjaGFyICpidWZmZXIgPSB4bWFsbG9jKGxlbikKKyNkZWZpbmUgUkVMRUFTRV9DT05GSUdfQlVGRkVSKGJ1ZmZlcikgICAgICBmcmVlKGJ1ZmZlcikKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fR0xJQkNfXykKKy8qIGdsaWJjIHVzZXMgX19lcnJub19sb2NhdGlvbigpIHRvIGdldCBhIHB0ciB0byBlcnJubyAqLworLyogV2UgY2FuIGp1c3QgbWVtb3JpemUgaXQgb25jZSAtIG5vIG11bHRpdGhyZWFkaW5nIGluIGJ1c3lib3ggOikgKi8KK2V4dGVybiBpbnQgKmNvbnN0IGJiX2Vycm5vOworI3VuZGVmIGVycm5vCisjZGVmaW5lIGVycm5vICgqYmJfZXJybm8pCisjZW5kaWYKKworI2lmICEoVUxPTkdfTUFYID4gMHhmZmZmZmZmZikKKy8qIE9ubHkgMzItYml0IENQVXMgbmVlZCB0aGlzLCA2NC1iaXQgb25lcyB1c2UgaW5saW5lZCB2ZXJzaW9uICovCit1aW50NjRfdCBiYl9ic3dhcF82NCh1aW50NjRfdCB4KSBGQVNUX0ZVTkM7CisjZW5kaWYKKwordW5zaWduZWQgbG9uZyBsb25nIG1vbm90b25pY19ucyh2b2lkKSBGQVNUX0ZVTkM7Cit1bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX3VzKHZvaWQpIEZBU1RfRlVOQzsKK3Vuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfbXModm9pZCkgRkFTVF9GVU5DOwordW5zaWduZWQgbW9ub3RvbmljX3NlYyh2b2lkKSBGQVNUX0ZVTkM7CisKK2V4dGVybiB2b2lkIGNob21wKGNoYXIgKnMpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIHRyaW0oY2hhciAqcykgRkFTVF9GVU5DOworZXh0ZXJuIGNoYXIgKnNraXBfd2hpdGVzcGFjZShjb25zdCBjaGFyICopIEZBU1RfRlVOQzsKK2V4dGVybiBjaGFyICpza2lwX25vbl93aGl0ZXNwYWNlKGNvbnN0IGNoYXIgKikgRkFTVF9GVU5DOworZXh0ZXJuIGNoYXIgKnNraXBfZGV2X3BmeChjb25zdCBjaGFyICp0dHlfbmFtZSkgRkFTVF9GVU5DOworCitleHRlcm4gY2hhciAqc3RycnN0cihjb25zdCBjaGFyICpoYXlzdGFjaywgY29uc3QgY2hhciAqbmVlZGxlKSBGQVNUX0ZVTkM7CisKKy8vVE9ETzogc3VwcGx5IGEgcG9pbnRlciB0byBjaGFyWzExXSBidWZmZXIgKGF2b2lkIHN0YXRpY3MpPworZXh0ZXJuIGNvbnN0IGNoYXIgKmJiX21vZGVfc3RyaW5nKG1vZGVfdCBtb2RlKSBGQVNUX0ZVTkM7CitleHRlcm4gaW50IGlzX2RpcmVjdG9yeShjb25zdCBjaGFyICpuYW1lLCBpbnQgZm9sbG93TGlua3MpIEZBU1RfRlVOQzsKK2VudW0gewkvKiBETyBOT1QgQ0hBTkdFIFRIRVNFIFZBTFVFUyEgIGNwLmMsIG12LmMsIGluc3RhbGwuYyBkZXBlbmQgb24gdGhlbS4gKi8KKwlGSUxFVVRJTFNfUFJFU0VSVkVfU1RBVFVTID0gMSA8PCAwLCAvKiAtcCAqLworCUZJTEVVVElMU19ERVJFRkVSRU5DRSAgICAgPSAxIDw8IDEsIC8qICEtZCAqLworCUZJTEVVVElMU19SRUNVUiAgICAgICAgICAgPSAxIDw8IDIsIC8qIC1SICovCisJRklMRVVUSUxTX0ZPUkNFICAgICAgICAgICA9IDEgPDwgMywgLyogLWYgKi8KKwlGSUxFVVRJTFNfSU5URVJBQ1RJVkUgICAgID0gMSA8PCA0LCAvKiAtaSAqLworCUZJTEVVVElMU19NQUtFX0hBUkRMSU5LICAgPSAxIDw8IDUsIC8qIC1sICovCisJRklMRVVUSUxTX01BS0VfU09GVExJTksgICA9IDEgPDwgNiwgLyogLXMgKi8KKwlGSUxFVVRJTFNfREVSRUZfU09GVExJTksgID0gMSA8PCA3LCAvKiAtTCAqLworCUZJTEVVVElMU19ERVJFRkVSRU5DRV9MMCAgPSAxIDw8IDgsIC8qIC1IICovCisjaWYgRU5BQkxFX1NFTElOVVgKKwlGSUxFVVRJTFNfUFJFU0VSVkVfU0VDVVJJVFlfQ09OVEVYVCA9IDEgPDwgOSwgLyogLWMgKi8KKwlGSUxFVVRJTFNfU0VUX1NFQ1VSSVRZX0NPTlRFWFQgPSAxIDw8IDEwLAorI2VuZGlmCisJRklMRVVUSUxTX0lHTk9SRV9DSE1PRF9FUlIgPSAxIDw8IDExLAorCS8qIC12ICovCisJRklMRVVUSUxTX1ZFUkJPU0UgICAgICAgICA9ICgxIDw8IDEyKSAqIEVOQUJMRV9GRUFUVVJFX1ZFUkJPU0UsCit9OworI2RlZmluZSBGSUxFVVRJTFNfQ1BfT1BUU1RSICJwZFJmaWxzTEgiIElGX1NFTElOVVgoImMiKQorZXh0ZXJuIGludCByZW1vdmVfZmlsZShjb25zdCBjaGFyICpwYXRoLCBpbnQgZmxhZ3MpIEZBU1RfRlVOQzsKKy8qIE5COiB3aXRob3V0IEZJTEVVVElMU19SRUNVUiBpbiBmbGFncywgaXQgd2lsbCBiYXNpY2FsbHkgImNhdCIKKyAqIHRoZSBzb3VyY2UsIG5vdCBjb3B5ICh1bmxlc3MgInNvdXJjZSIgaXMgYSBkaXJlY3RvcnkpLgorICogVGhpcyBtYWtlcyAiY3AgL2Rldi9udWxsIGZpbGUiIGFuZCAiaW5zdGFsbCAvZGV2L251bGwgZmlsZSIgKCEhISkKKyAqIHdvcmsgY29yZXV0aWxzLWNvbXBhdGlibHkuICovCitleHRlcm4gaW50IGNvcHlfZmlsZShjb25zdCBjaGFyICpzb3VyY2UsIGNvbnN0IGNoYXIgKmRlc3QsIGludCBmbGFncykgRkFTVF9GVU5DOworCitlbnVtIHsKKwlBQ1RJT05fUkVDVVJTRSAgICAgICAgPSAoMSA8PCAwKSwKKwlBQ1RJT05fRk9MTE9XTElOS1MgICAgPSAoMSA8PCAxKSwKKwlBQ1RJT05fRk9MTE9XTElOS1NfTDAgPSAoMSA8PCAyKSwKKwlBQ1RJT05fREVQVEhGSVJTVCAgICAgPSAoMSA8PCAzKSwKKwkvKkFDVElPTl9SRVZFUlNFICAgICAgPSAoMSA8PCA0KSwgLSB1bnVzZWQgKi8KKwlBQ1RJT05fUVVJRVQgICAgICAgICAgPSAoMSA8PCA1KSwKKwlBQ1RJT05fREFOR0xJTkdfT0sgICAgPSAoMSA8PCA2KSwKK307Cit0eXBlZGVmIHVpbnQ4X3QgcmVjdXJzZV9mbGFnc190OworZXh0ZXJuIGludCByZWN1cnNpdmVfYWN0aW9uKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCB1bnNpZ25lZCBmbGFncywKKwlpbnQgRkFTVF9GVU5DICgqZmlsZUFjdGlvbikoY29uc3QgY2hhciAqZmlsZU5hbWUsIHN0cnVjdCBzdGF0KiBzdGF0YnVmLCB2b2lkKiB1c2VyRGF0YSwgaW50IGRlcHRoKSwKKwlpbnQgRkFTVF9GVU5DICgqZGlyQWN0aW9uKShjb25zdCBjaGFyICpmaWxlTmFtZSwgc3RydWN0IHN0YXQqIHN0YXRidWYsIHZvaWQqIHVzZXJEYXRhLCBpbnQgZGVwdGgpLAorCXZvaWQqIHVzZXJEYXRhLCB1bnNpZ25lZCBkZXB0aCkgRkFTVF9GVU5DOworZXh0ZXJuIGludCBkZXZpY2Vfb3Blbihjb25zdCBjaGFyICpkZXZpY2UsIGludCBtb2RlKSBGQVNUX0ZVTkM7CitlbnVtIHsgR0VUUFRZX0JVRlNJWkUgPSAxNiB9OyAvKiBtb3JlIHRoYW4gZW5vdWdoIGZvciAiL2Rldi90dHlYWFgiICovCitleHRlcm4gaW50IHhnZXRwdHkoY2hhciAqbGluZSkgRkFTVF9GVU5DOworZXh0ZXJuIGludCBnZXRfY29uc29sZV9mZF9vcl9kaWUodm9pZCkgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgY29uc29sZV9tYWtlX2FjdGl2ZShpbnQgZmQsIGNvbnN0IGludCB2dF9udW0pIEZBU1RfRlVOQzsKK2V4dGVybiBjaGFyICpmaW5kX2Jsb2NrX2RldmljZShjb25zdCBjaGFyICpwYXRoKSBGQVNUX0ZVTkM7CisvKiBiYl9jb3B5ZmRfWFggcHJpbnQgcmVhZC93cml0ZSBlcnJvcnMgYW5kIHJldHVybiAtMSBpZiB0aGV5IG9jY3VyICovCitleHRlcm4gb2ZmX3QgYmJfY29weWZkX2VvZihpbnQgZmQxLCBpbnQgZmQyKSBGQVNUX0ZVTkM7CitleHRlcm4gb2ZmX3QgYmJfY29weWZkX3NpemUoaW50IGZkMSwgaW50IGZkMiwgb2ZmX3Qgc2l6ZSkgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgYmJfY29weWZkX2V4YWN0X3NpemUoaW50IGZkMSwgaW50IGZkMiwgb2ZmX3Qgc2l6ZSkgRkFTVF9GVU5DOworLyogInNob3J0IiBjb3B5IGNhbiBiZSBkZXRlY3RlZCBieSByZXR1cm4gdmFsdWUgPCBzaXplICovCisvKiB0aGlzIGhlbHBlciB5ZWxscyAic2hvcnQgcmVhZCEiIGlmIHBhcmFtIGlzIG5vdCAtMSAqLworZXh0ZXJuIHZvaWQgY29tcGxhaW5fY29weWZkX2FuZF9kaWUob2ZmX3Qgc3opIE5PUkVUVVJOIEZBU1RfRlVOQzsKKworZXh0ZXJuIGNoYXIgYmJfcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UoY29uc3QgY2hhciAqKnB0cikgRkFTVF9GVU5DOworY2hhciogc3RyY3B5X2FuZF9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZXMoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMpIEZBU1RfRlVOQzsKKy8qIHh4eHhfc3RyaXAgdmVyc2lvbiBjYW4gbW9kaWZ5IGl0cyBwYXJhbWV0ZXI6CisgKiAiLyIgICAgICAgIC0+ICIvIgorICogImFiYyIgICAgICAtPiAiYWJjIgorICogImFiYy9kZWYiICAtPiAiZGVmIgorICogImFiYy9kZWYvIiAtPiAiZGVmIiAhIQorICovCitjaGFyICpiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9zdHJpcChjaGFyICpwYXRoKSBGQVNUX0ZVTkM7CisvKiAiYWJjL2RlZi8iIC0+ICIiIGFuZCBpdCBuZXZlciBtb2RpZmllcyAncGF0aCcgKi8KK2NoYXIgKmJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50X25vc3RyaXAoY29uc3QgY2hhciAqcGF0aCkgRkFTVF9GVU5DOworLyogU2ltcGxlciB2ZXJzaW9uOiBkb2VzIG5vdCBzcGVjaWFsIGNhc2UgIi8iIHN0cmluZyAqLworY29uc3QgY2hhciAqYmJfYmFzZW5hbWUoY29uc3QgY2hhciAqbmFtZSkgRkFTVF9GVU5DOworLyogTkI6IGNhbiB2aW9sYXRlIGNvbnN0LW5lc3MgKHNpbWlsYXJseSB0byBzdHJjaHIpICovCitjaGFyICpsYXN0X2NoYXJfaXMoY29uc3QgY2hhciAqcywgaW50IGMpIEZBU1RfRlVOQzsKK2NvbnN0IGNoYXIqIGVuZG9mbmFtZShjb25zdCBjaGFyICpuYW1lKSBGQVNUX0ZVTkM7CitjaGFyICppc19wcmVmaXhlZF93aXRoKGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqa2V5KSBGQVNUX0ZVTkM7CitjaGFyICppc19zdWZmaXhlZF93aXRoKGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqa2V5KSBGQVNUX0ZVTkM7CisKK2ludCBuZGVsYXlfb24oaW50IGZkKSBGQVNUX0ZVTkM7CitpbnQgbmRlbGF5X29mZihpbnQgZmQpIEZBU1RfRlVOQzsKK3ZvaWQgY2xvc2Vfb25fZXhlY19vbihpbnQgZmQpIEZBU1RfRlVOQzsKK3ZvaWQgeGR1cDIoaW50LCBpbnQpIEZBU1RfRlVOQzsKK3ZvaWQgeG1vdmVfZmQoaW50LCBpbnQpIEZBU1RfRlVOQzsKKworCitESVIgKnhvcGVuZGlyKGNvbnN0IGNoYXIgKnBhdGgpIEZBU1RfRlVOQzsKK0RJUiAqd2Fybl9vcGVuZGlyKGNvbnN0IGNoYXIgKnBhdGgpIEZBU1RfRlVOQzsKKworY2hhciAqeG1hbGxvY19yZWFscGF0aChjb25zdCBjaGFyICpwYXRoKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CitjaGFyICp4bWFsbG9jX3JlYWRsaW5rKGNvbnN0IGNoYXIgKnBhdGgpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKK2NoYXIgKnhtYWxsb2NfcmVhZGxpbmtfb3Jfd2Fybihjb25zdCBjaGFyICpwYXRoKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisvKiAhUkVUVVJOU19NQUxMT0M6IGl0J3MgYSByZWFsbG9jLWxpa2UgZnVuY3Rpb24gKi8KK2NoYXIgKnhyZWFsbG9jX2dldGN3ZF9vcl93YXJuKGNoYXIgKmN3ZCkgRkFTVF9GVU5DOworCitjaGFyICp4bWFsbG9jX2ZvbGxvd19zeW1saW5rcyhjb25zdCBjaGFyICpwYXRoKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisKKworZW51bSB7CisJLyogYmJfc2lnbmFscyhCQl9GQVRBTF9TSUdTLCBoYW5kbGVyKSBjYXRjaGVzIGFsbCBzaWduYWxzIHdoaWNoCisJICogb3RoZXJ3aXNlIHdvdWxkIGtpbGwgdXMsIGV4Y2VwdCBmb3IgdGhvc2UgcmVzdWx0aW5nIGZyb20gYnVnczoKKwkgKiBTSUdTRUdWLCBTSUdJTEwsIFNJR0ZQRS4KKwkgKiBPdGhlciBmYXRhbCBzaWduYWxzIG5vdCBpbmNsdWRlZCAoVE9ETz8pOgorCSAqIFNJR0JVUyAgIEJ1cyBlcnJvciAoYmFkIG1lbW9yeSBhY2Nlc3MpCisJICogU0lHUE9MTCAgUG9sbGFibGUgZXZlbnQuIFN5bm9ueW0gb2YgU0lHSU8KKwkgKiBTSUdQUk9GICBQcm9maWxpbmcgdGltZXIgZXhwaXJlZAorCSAqIFNJR1NZUyAgIEJhZCBhcmd1bWVudCB0byByb3V0aW5lCisJICogU0lHVFJBUCAgVHJhY2UvYnJlYWtwb2ludCB0cmFwCisJICoKKwkgKiBUaGUgb25seSBrbm93biBhcmNoIHdpdGggc29tZSBvZiB0aGVzZSBzaWdzIG5vdCBmaXR0aW5nCisJICogaW50byAzMiBiaXRzIGlzIHBhcmlzYyAoU0lHWENQVT0zMywgU0lHWEZTWj0zNCwgU0lHU1RLRkxUPTM2KS4KKwkgKiBEYW5jZSBhcm91bmQgd2l0aCBsb25nIGxvbmcgdG8gZ3VhcmQgYWdhaW5zdCB0aGF0Li4uCisJICovCisJQkJfRkFUQUxfU0lHUyA9IChpbnQpKDAKKwkJKyAoMUxMIDw8IFNJR0hVUCkKKwkJKyAoMUxMIDw8IFNJR0lOVCkKKwkJKyAoMUxMIDw8IFNJR1RFUk0pCisJCSsgKDFMTCA8PCBTSUdQSVBFKSAgIC8vIFdyaXRlIHRvIHBpcGUgd2l0aCBubyByZWFkZXJzCisJCSsgKDFMTCA8PCBTSUdRVUlUKSAgIC8vIFF1aXQgZnJvbSBrZXlib2FyZAorCQkrICgxTEwgPDwgU0lHQUJSVCkgICAvLyBBYm9ydCBzaWduYWwgZnJvbSBhYm9ydCgzKQorCQkrICgxTEwgPDwgU0lHQUxSTSkgICAvLyBUaW1lciBzaWduYWwgZnJvbSBhbGFybSgyKQorCQkrICgxTEwgPDwgU0lHVlRBTFJNKSAvLyBWaXJ0dWFsIGFsYXJtIGNsb2NrCisJCSsgKDFMTCA8PCBTSUdYQ1BVKSAgIC8vIENQVSB0aW1lIGxpbWl0IGV4Y2VlZGVkCisJCSsgKDFMTCA8PCBTSUdYRlNaKSAgIC8vIEZpbGUgc2l6ZSBsaW1pdCBleGNlZWRlZAorCQkrICgxTEwgPDwgU0lHVVNSMSkgICAvLyBZZXMga2lkcywgdGhlc2UgYXJlIGFsc28gZmF0YWwhCisJCSsgKDFMTCA8PCBTSUdVU1IyKQorCQkrIDApLAorfTsKK3ZvaWQgYmJfc2lnbmFscyhpbnQgc2lncywgdm9pZCAoKmYpKGludCkpIEZBU1RfRlVOQzsKKy8qIFVubGlrZSBzaWduYWwoKSBhbmQgYmJfc2lnbmFscywgc2V0cyBoYW5kbGVyIHdpdGggc2lnYWN0aW9uKCkKKyAqIGFuZCBpbiBhIHdheSB0aGF0IHdoaWxlIHNpZ25hbCBoYW5kbGVyIGlzIHJ1biwgbm8gb3RoZXIgc2lnbmFscworICogd2lsbCBiZSBibG9ja2VkOyBzeXNjYWxscyB3aWxsIG5vdCBiZSByZXN0YXJ0ZWQ6ICovCit2b2lkIGJiX3NpZ25hbHNfcmVjdXJzaXZlX25vcmVzdGFydChpbnQgc2lncywgdm9pZCAoKmYpKGludCkpIEZBU1RfRlVOQzsKKy8qIHN5c2NhbGxzIGxpa2UgcmVhZCgpIHdpbGwgYmUgaW50ZXJydXB0ZWQgd2l0aCBFSU5UUjogKi8KK3ZvaWQgc2lnbmFsX25vX1NBX1JFU1RBUlRfZW1wdHlfbWFzayhpbnQgc2lnLCB2b2lkICgqaGFuZGxlcikoaW50KSkgRkFTVF9GVU5DOworLyogc3lzY2FsbHMgbGlrZSByZWFkKCkgd29uJ3QgYmUgaW50ZXJydXB0ZWQgKHRob3VnaCBzZWxlY3QvcG9sbCB3aWxsIGJlKTogKi8KK3ZvaWQgc2lnbmFsX1NBX1JFU1RBUlRfZW1wdHlfbWFzayhpbnQgc2lnLCB2b2lkICgqaGFuZGxlcikoaW50KSkgRkFTVF9GVU5DOwordm9pZCB3YWl0X2Zvcl9hbnlfc2lnKHZvaWQpIEZBU1RfRlVOQzsKK3ZvaWQga2lsbF9teXNlbGZfd2l0aF9zaWcoaW50IHNpZykgTk9SRVRVUk4gRkFTVF9GVU5DOwordm9pZCBzaWdfYmxvY2soaW50IHNpZykgRkFTVF9GVU5DOwordm9pZCBzaWdfdW5ibG9jayhpbnQgc2lnKSBGQVNUX0ZVTkM7CisvKiBXaWxsIGRvIHNpZ2FjdGlvbihzaWdudW0sIGFjdCwgTlVMTCk6ICovCitpbnQgc2lnYWN0aW9uX3NldChpbnQgc2lnLCBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICphY3QpIEZBU1RfRlVOQzsKKy8qIFNJR19CTE9DSy9TSUdfVU5CTE9DSyBhbGwgc2lnbmFsczogKi8KK2ludCBzaWdwcm9jbWFza19hbGxzaWdzKGludCBob3cpIEZBU1RfRlVOQzsKKy8qIFN0YW5kYXJkIGhhbmRsZXIgd2hpY2gganVzdCByZWNvcmRzIHNpZ25vICovCitleHRlcm4gc21hbGxpbnQgYmJfZ290X3NpZ25hbDsKK3ZvaWQgcmVjb3JkX3NpZ25vKGludCBzaWdubyk7IC8qIG5vdCBGQVNUX0ZVTkMhICovCisKKwordm9pZCB4c2V0Z2lkKGdpZF90IGdpZCkgRkFTVF9GVU5DOwordm9pZCB4c2V0dWlkKHVpZF90IHVpZCkgRkFTVF9GVU5DOwordm9pZCB4c2V0ZWdpZChnaWRfdCBlZ2lkKSBGQVNUX0ZVTkM7Cit2b2lkIHhzZXRldWlkKHVpZF90IGV1aWQpIEZBU1RfRlVOQzsKK3ZvaWQgeGNoZGlyKGNvbnN0IGNoYXIgKnBhdGgpIEZBU1RfRlVOQzsKK3ZvaWQgeGNocm9vdChjb25zdCBjaGFyICpwYXRoKSBGQVNUX0ZVTkM7Cit2b2lkIHhzZXRlbnYoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSkgRkFTVF9GVU5DOwordm9pZCBiYl91bnNldGVudihjb25zdCBjaGFyICprZXkpIEZBU1RfRlVOQzsKK3ZvaWQgYmJfdW5zZXRlbnZfYW5kX2ZyZWUoY2hhciAqa2V5KSBGQVNUX0ZVTkM7Cit2b2lkIHh1bmxpbmsoY29uc3QgY2hhciAqcGF0aG5hbWUpIEZBU1RfRlVOQzsKK3ZvaWQgeHN0YXQoY29uc3QgY2hhciAqcGF0aG5hbWUsIHN0cnVjdCBzdGF0ICpidWYpIEZBU1RfRlVOQzsKK3ZvaWQgeGZzdGF0KGludCBmZCwgc3RydWN0IHN0YXQgKmJ1ZiwgY29uc3QgY2hhciAqZXJybXNnKSBGQVNUX0ZVTkM7CitpbnQgb3BlbjNfb3Jfd2Fybihjb25zdCBjaGFyICpwYXRobmFtZSwgaW50IGZsYWdzLCBpbnQgbW9kZSkgRkFTVF9GVU5DOworaW50IG9wZW5fb3Jfd2Fybihjb25zdCBjaGFyICpwYXRobmFtZSwgaW50IGZsYWdzKSBGQVNUX0ZVTkM7CitpbnQgeG9wZW4zKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgZmxhZ3MsIGludCBtb2RlKSBGQVNUX0ZVTkM7CitpbnQgeG9wZW4oY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBmbGFncykgRkFTVF9GVU5DOworaW50IHhvcGVuX25vbmJsb2NraW5nKGNvbnN0IGNoYXIgKnBhdGhuYW1lKSBGQVNUX0ZVTkM7CitpbnQgeG9wZW5fYXNfdWlkX2dpZChjb25zdCBjaGFyICpwYXRobmFtZSwgaW50IGZsYWdzLCB1aWRfdCB1LCBnaWRfdCBnKSBGQVNUX0ZVTkM7CitpbnQgb3Blbl9vcl93YXJuX3N0ZGluKGNvbnN0IGNoYXIgKnBhdGhuYW1lKSBGQVNUX0ZVTkM7CitpbnQgeG9wZW5fc3RkaW4oY29uc3QgY2hhciAqcGF0aG5hbWUpIEZBU1RfRlVOQzsKK3ZvaWQgeHJlbmFtZShjb25zdCBjaGFyICpvbGRwYXRoLCBjb25zdCBjaGFyICpuZXdwYXRoKSBGQVNUX0ZVTkM7CitpbnQgcmVuYW1lX29yX3dhcm4oY29uc3QgY2hhciAqb2xkcGF0aCwgY29uc3QgY2hhciAqbmV3cGF0aCkgRkFTVF9GVU5DOworb2ZmX3QgeGxzZWVrKGludCBmZCwgb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSBGQVNUX0ZVTkM7CitpbnQgeG1rc3RlbXAoY2hhciAqdGVtcGxhdGUpIEZBU1RfRlVOQzsKK29mZl90IGZkbGVuZ3RoKGludCBmZCkgRkFTVF9GVU5DOworCit1b2ZmX3QgRkFTVF9GVU5DIGdldF92b2x1bWVfc2l6ZV9pbl9ieXRlcyhpbnQgZmQsCisJCWNvbnN0IGNoYXIgKm92ZXJyaWRlLAorCQl1bnNpZ25lZCBvdmVycmlkZV91bml0cywKKwkJaW50IGV4dGVuZCk7CisKK3ZvaWQgeHBpcGUoaW50IGZpbGVkZXNbMl0pIEZBU1RfRlVOQzsKKy8qIEluIHRoaXMgZm9ybSBjb2RlIHdpdGggcGlwZXMgaXMgbXVjaCBtb3JlIHJlYWRhYmxlICovCitzdHJ1Y3QgZmRfcGFpciB7IGludCByZDsgaW50IHdyOyB9OworI2RlZmluZSBwaXBlZF9wYWlyKHBhaXIpICBwaXBlKCYoKHBhaXIpLnJkKSkKKyNkZWZpbmUgeHBpcGVkX3BhaXIocGFpcikgeHBpcGUoJigocGFpcikucmQpKQorCisvKiBVc2VmdWwgZm9yIGhhdmluZyBzbWFsbCBzdHJ1Y3R1cmUgbWVtYmVycy9nbG9iYWwgdmFyaWFibGVzICovCit0eXBlZGVmIGludDhfdCBzb2NrdHlwZV90OwordHlwZWRlZiBpbnQ4X3QgZmFtaWx5X3Q7CitzdHJ1Y3QgQlVHX3Rvb19zbWFsbCB7CisJY2hhciBCVUdfc29ja3R5cGVfdF90b29fc21hbGxbKDAKKwkJCXwgU09DS19TVFJFQU0KKwkJCXwgU09DS19ER1JBTQorCQkJfCBTT0NLX1JETQorCQkJfCBTT0NLX1NFUVBBQ0tFVAorCQkJfCBTT0NLX1JBVworCQkJKSA8PSAxMjcgPyAxIDogLTFdOworCWNoYXIgQlVHX2ZhbWlseV90X3Rvb19zbWFsbFsoMAorCQkJfCBBRl9VTlNQRUMKKwkJCXwgQUZfSU5FVAorCQkJfCBBRl9JTkVUNgorCQkJfCBBRl9VTklYCisjaWZkZWYgQUZfUEFDS0VUCisJCQl8IEFGX1BBQ0tFVAorI2VuZGlmCisjaWZkZWYgQUZfTkVUTElOSworCQkJfCBBRl9ORVRMSU5LCisjZW5kaWYKKwkJCS8qIHwgQUZfREVDbmV0ICovCisJCQkvKiB8IEFGX0lQWCAqLworCQkJKSA8PSAxMjcgPyAxIDogLTFdOworfTsKKworCit2b2lkIHBhcnNlX2RhdGVzdHIoY29uc3QgY2hhciAqZGF0ZV9zdHIsIHN0cnVjdCB0bSAqcHRtKSBGQVNUX0ZVTkM7Cit0aW1lX3QgdmFsaWRhdGVfdG1fdGltZShjb25zdCBjaGFyICpkYXRlX3N0ciwgc3RydWN0IHRtICpwdG0pIEZBU1RfRlVOQzsKK2NoYXIgKnN0cmZ0aW1lX0hITU1TUyhjaGFyICpidWYsIHVuc2lnbmVkIGxlbiwgdGltZV90ICp0cCkgRkFTVF9GVU5DOworY2hhciAqc3RyZnRpbWVfWVlZWU1NRERISE1NU1MoY2hhciAqYnVmLCB1bnNpZ25lZCBsZW4sIHRpbWVfdCAqdHApIEZBU1RfRlVOQzsKKworaW50IHhzb2NrZXQoaW50IGRvbWFpbiwgaW50IHR5cGUsIGludCBwcm90b2NvbCkgRkFTVF9GVU5DOwordm9pZCB4YmluZChpbnQgc29ja2ZkLCBzdHJ1Y3Qgc29ja2FkZHIgKm15X2FkZHIsIHNvY2tsZW5fdCBhZGRybGVuKSBGQVNUX0ZVTkM7Cit2b2lkIHhsaXN0ZW4oaW50IHMsIGludCBiYWNrbG9nKSBGQVNUX0ZVTkM7Cit2b2lkIHhjb25uZWN0KGludCBzLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNfYWRkciwgc29ja2xlbl90IGFkZHJsZW4pIEZBU1RfRlVOQzsKK3NzaXplX3QgeHNlbmR0byhpbnQgcywgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnRvLAorCQkJCXNvY2tsZW5fdCB0b2xlbikgRkFTVF9GVU5DOworCitpbnQgc2V0c29ja29wdF9pbnQoaW50IGZkLCBpbnQgbGV2ZWwsIGludCBvcHRuYW1lLCBpbnQgb3B0dmFsKSBGQVNUX0ZVTkM7CitpbnQgc2V0c29ja29wdF8xKGludCBmZCwgaW50IGxldmVsLCBpbnQgb3B0bmFtZSkgRkFTVF9GVU5DOworaW50IHNldHNvY2tvcHRfU09MX1NPQ0tFVF9pbnQoaW50IGZkLCBpbnQgb3B0bmFtZSwgaW50IG9wdHZhbCkgRkFTVF9GVU5DOworaW50IHNldHNvY2tvcHRfU09MX1NPQ0tFVF8xKGludCBmZCwgaW50IG9wdG5hbWUpIEZBU1RfRlVOQzsKKy8qIFNPX1JFVVNFQUREUiBhbGxvd3MgYSBzZXJ2ZXIgdG8gcmViaW5kIHRvIGFuIGFkZHJlc3MgdGhhdCBpcyBhbHJlYWR5CisgKiAiaW4gdXNlIiBieSBvbGQgY29ubmVjdGlvbnMgdG8gZS5nLiBwcmV2aW91cyBzZXJ2ZXIgaW5zdGFuY2Ugd2hpY2ggaXMKKyAqIGtpbGxlZCBvciBjcmFzaGVkLiBXaXRob3V0IGl0IGJpbmQgd2lsbCBmYWlsIHVudGlsIGFsbCBzdWNoIGNvbm5lY3Rpb25zCisgKiB0aW1lIG91dC4gTGludXggZG9lcyBub3QgYWxsb3cgbXVsdGlwbGUgbGl2ZSBiaW5kcyBvbiBzYW1lIGlwOnBvcnQKKyAqIHJlZ2FyZGxlc3Mgb2YgU09fUkVVU0VBRERSICh1bmxpa2Ugc29tZSBvdGhlciBmbGF2b3JzIG9mIFVuaXgpLgorICogVHVybiBpdCBvbiBiZWZvcmUgeW91IGNhbGwgYmluZCgpLiAqLwordm9pZCBzZXRzb2Nrb3B0X3JldXNlYWRkcihpbnQgZmQpIEZBU1RfRlVOQzsgLyogT24gTGludXggdGhpcyBuZXZlciBmYWlscy4gKi8KK2ludCBzZXRzb2Nrb3B0X2tlZXBhbGl2ZShpbnQgZmQpIEZBU1RfRlVOQzsKK2ludCBzZXRzb2Nrb3B0X2Jyb2FkY2FzdChpbnQgZmQpIEZBU1RfRlVOQzsKK2ludCBzZXRzb2Nrb3B0X2JpbmR0b2RldmljZShpbnQgZmQsIGNvbnN0IGNoYXIgKmlmYWNlKSBGQVNUX0ZVTkM7CisvKiBOQjogcmV0dXJucyBwb3J0IGluIGhvc3QgYnl0ZSBvcmRlciAqLwordW5zaWduZWQgYmJfbG9va3VwX3BvcnQoY29uc3QgY2hhciAqcG9ydCwgY29uc3QgY2hhciAqcHJvdG9jb2wsIHVuc2lnbmVkIGRlZmF1bHRfcG9ydCkgRkFTVF9GVU5DOwordHlwZWRlZiBzdHJ1Y3QgbGVuX2FuZF9zb2NrYWRkciB7CisJc29ja2xlbl90IGxlbjsKKwl1bmlvbiB7CisJCXN0cnVjdCBzb2NrYWRkciBzYTsKKwkJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2luNjsKKyNlbmRpZgorCX0gdTsKK30gbGVuX2FuZF9zb2NrYWRkcjsKK2VudW0geworCUxTQV9MRU5fU0laRSA9IG9mZnNldG9mKGxlbl9hbmRfc29ja2FkZHIsIHUpLAorCUxTQV9TSVpFT0ZfU0EgPSBzaXplb2YoCisJCXVuaW9uIHsKKwkJCXN0cnVjdCBzb2NrYWRkciBzYTsKKwkJCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCQkJc3RydWN0IHNvY2thZGRyX2luNiBzaW42OworI2VuZGlmCisJCX0KKwkpCit9OworLyogQ3JlYXRlIHN0cmVhbSBzb2NrZXQsIGFuZCBhbGxvY2F0ZSBzdWl0YWJsZSBsc2EuCisgKiAobHNhIG9mIGNvcnJlY3Qgc2l6ZSBhbmQgbHNhLT5zYS5zYV9mYW1pbHkgKEFGX0lORVQvQUZfSU5FVDYpKQorICogYWYgPT0gQUZfVU5TUEVDIHdpbGwgcmVzdWx0IGluIHRyeWluZyB0byBjcmVhdGUgSVB2NiBzb2NrZXQsCisgKiBhbmQgaWYga2VybmVsIGRvZXNuJ3Qgc3VwcG9ydCBpdCwgZmFsbCBiYWNrIHRvIElQdjQuCisgKiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgcGxhbiB0byBiaW5kIHRvIHJlc3VsdGluZyBsb2NhbCBsc2EuCisgKi8KK2ludCB4c29ja2V0X3R5cGUobGVuX2FuZF9zb2NrYWRkciAqKmxzYXAsIGludCBhZiwgaW50IHNvY2tfdHlwZSkgRkFTVF9GVU5DOworaW50IHhzb2NrZXRfc3RyZWFtKGxlbl9hbmRfc29ja2FkZHIgKipsc2FwKSBGQVNUX0ZVTkM7CisvKiBDcmVhdGUgc2VydmVyIHNvY2tldCBib3VuZCB0byBiaW5kYWRkcjpwb3J0LiBiaW5kYWRkciBjYW4gYmUgTlVMTCwKKyAqIG51bWVyaWMgSVAgKCJOLk4uTi5OIikgb3IgbnVtZXJpYyBJUHY2IGFkZHJlc3MsCisgKiBhbmQgY2FuIGhhdmUgIjpQT1JUIiBzdWZmaXggKGZvciBJUHY2IHVzZSAiW1g6WDouLi46WF06UE9SVCIpLgorICogT25seSBpZiB0aGVyZSBpcyBubyBzdWZmaXgsIHBvcnQgYXJndW1lbnQgaXMgdXNlZCAqLworLyogTkI6IHRoZXNlIHNldCBTT19SRVVTRUFERFIgYmVmb3JlIGJpbmQgKi8KK2ludCBjcmVhdGVfYW5kX2JpbmRfc3RyZWFtX29yX2RpZShjb25zdCBjaGFyICpiaW5kYWRkciwgaW50IHBvcnQpIEZBU1RfRlVOQzsKK2ludCBjcmVhdGVfYW5kX2JpbmRfZGdyYW1fb3JfZGllKGNvbnN0IGNoYXIgKmJpbmRhZGRyLCBpbnQgcG9ydCkgRkFTVF9GVU5DOworLyogQ3JlYXRlIGNsaWVudCBUQ1Agc29ja2V0IGNvbm5lY3RlZCB0byBwZWVyOnBvcnQuIFBlZXIgY2Fubm90IGJlIE5VTEwuCisgKiBQZWVyIGNhbiBiZSBudW1lcmljIElQICgiTi5OLk4uTiIpLCBudW1lcmljIElQdjYgYWRkcmVzcyBvciBob3N0bmFtZSwKKyAqIGFuZCBjYW4gaGF2ZSAiOlBPUlQiIHN1ZmZpeCAoZm9yIElQdjYgdXNlICJbWDpYOi4uLjpYXTpQT1JUIikuCisgKiBJZiB0aGVyZSBpcyBubyBzdWZmaXgsIHBvcnQgYXJndW1lbnQgaXMgdXNlZCAqLworaW50IGNyZWF0ZV9hbmRfY29ubmVjdF9zdHJlYW1fb3JfZGllKGNvbnN0IGNoYXIgKnBlZXIsIGludCBwb3J0KSBGQVNUX0ZVTkM7CisvKiBDb25uZWN0IHRvIHBlZXIgaWRlbnRpZmllZCBieSBsc2EgKi8KK2ludCB4Y29ubmVjdF9zdHJlYW0oY29uc3QgbGVuX2FuZF9zb2NrYWRkciAqbHNhKSBGQVNUX0ZVTkM7CisvKiBHZXQgbG9jYWwgYWRkcmVzcyBvZiBib3VuZCBvciBhY2NlcHRlZCBzb2NrZXQgKi8KK2xlbl9hbmRfc29ja2FkZHIgKmdldF9zb2NrX2xzYShpbnQgZmQpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKKy8qIEdldCByZW1vdGUgYWRkcmVzcyBvZiBjb25uZWN0ZWQgb3IgYWNjZXB0ZWQgc29ja2V0ICovCitsZW5fYW5kX3NvY2thZGRyICpnZXRfcGVlcl9sc2EoaW50IGZkKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisvKiBSZXR1cm4gbWFsbG9jJ2VkIGxlbl9hbmRfc29ja2FkZHIgd2l0aCBzb2NrZXQgYWRkcmVzcyBvZiBob3N0OnBvcnQKKyAqIEN1cnJlbnRseSB3aWxsIHJldHVybiBJUHY0IG9yIElQdjYgc29ja2FkZHJzIG9ubHkKKyAqIChkZXBlbmRpbmcgb24gaG9zdCksIGJ1dCBpbiB0aGVvcnkgbm90aGluZyBwcmV2ZW50cyBlLmcuCisgKiBVTklYIHNvY2tldCBhZGRyZXNzIGJlaW5nIHJldHVybmVkLCBJUFggc29ja2FkZHIgZXRjLi4uCisgKiBPbiBlcnJvciBkb2VzIGJiX2Vycm9yX21zZyBhbmQgcmV0dXJucyBOVUxMICovCitsZW5fYW5kX3NvY2thZGRyKiBob3N0MnNvY2thZGRyKGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0KSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisvKiBWZXJzaW9uIHdoaWNoIGRpZXMgb24gZXJyb3IgKi8KK2xlbl9hbmRfc29ja2FkZHIqIHhob3N0MnNvY2thZGRyKGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0KSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CitsZW5fYW5kX3NvY2thZGRyKiB4ZG90dGVkMnNvY2thZGRyKGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0KSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisvKiBTYW1lLCB1c2VmdWwgaWYgeW91IHdhbnQgdG8gZm9yY2UgZmFtaWx5IChlLmcuIElQdjYpICovCisjaWYgIUVOQUJMRV9GRUFUVVJFX0lQVjYKKyNkZWZpbmUgaG9zdF9hbmRfYWYyc29ja2FkZHIoaG9zdCwgcG9ydCwgYWYpIGhvc3Qyc29ja2FkZHIoKGhvc3QpLCAocG9ydCkpCisjZGVmaW5lIHhob3N0X2FuZF9hZjJzb2NrYWRkcihob3N0LCBwb3J0LCBhZikgeGhvc3Qyc29ja2FkZHIoKGhvc3QpLCAocG9ydCkpCisjZWxzZQorbGVuX2FuZF9zb2NrYWRkciogaG9zdF9hbmRfYWYyc29ja2FkZHIoY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQsIHNhX2ZhbWlseV90IGFmKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CitsZW5fYW5kX3NvY2thZGRyKiB4aG9zdF9hbmRfYWYyc29ja2FkZHIoY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQsIHNhX2ZhbWlseV90IGFmKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisjZW5kaWYKKy8qIEFzc2lnbiBzaW5bNl1fcG9ydCBtZW1iZXIgaWYgdGhlIHNvY2tldCBpcyBhbiBBRl9JTkVUWzZdIG9uZSwKKyAqIG90aGVyd2lzZSBuby1vcC4gVXNlZnVsIGZvciBmdHAuCisgKiBOQjogZG9lcyBOT1QgZG8gaHRvbnMoKSBpbnRlcm5hbGx5LCBqdXN0IGRpcmVjdCBhc3NpZ25tZW50LiAqLwordm9pZCBzZXRfbnBvcnQoc3RydWN0IHNvY2thZGRyICpzYSwgdW5zaWduZWQgcG9ydCkgRkFTVF9GVU5DOworLyogUmV0cmlldmUgc2luWzZdX3BvcnQgb3IgcmV0dXJuIC0xIGZvciBub24tSU5FVFs2XSBsc2EncyAqLworaW50IGdldF9ucG9ydChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhKSBGQVNUX0ZVTkM7CisvKiBSZXZlcnNlIEROUy4gUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUuICovCitjaGFyKiB4bWFsbG9jX3NvY2thZGRyMmhvc3QoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYSkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworLyogVGhpcyBvbmUgZG9lc24ndCBhcHBlbmQgOlBPUlROVU0gKi8KK2NoYXIqIHhtYWxsb2Nfc29ja2FkZHIyaG9zdF9ub3BvcnQoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYSkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworLyogVGhpcyBvbmUgYWxzbyBkb2Vzbid0IGZhbGwgYmFjayB0byBkb3R0ZWQgSVAgKHJldHVybnMgTlVMTCkgKi8KK2NoYXIqIHhtYWxsb2Nfc29ja2FkZHIyaG9zdG9ubHlfbm9wb3J0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKKy8qIGluZXRfW2FwXXRvbiBvbiBzdGVyb2lkcyAqLworY2hhciogeG1hbGxvY19zb2NrYWRkcjJkb3R0ZWQoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYSkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworY2hhciogeG1hbGxvY19zb2NrYWRkcjJkb3R0ZWRfbm9wb3J0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKKy8vICJvbGQiIChpcHY0IG9ubHkpIEFQSQorLy8gdXNlcnM6IHRyYWNlcm91dGUuYyBob3N0bmFtZS5jIC0gdXNlIF9saXN0XyBvZiBhbGwgSVBzCitzdHJ1Y3QgaG9zdGVudCAqeGdldGhvc3RieW5hbWUoY29uc3QgY2hhciAqbmFtZSkgRkFTVF9GVU5DOworLy8gQWxzbyBtb3VudC5jIGFuZCBpbmV0ZC5jIGFyZSB1c2luZyBnZXRob3N0YnluYW1lKCksCisvLyArIGluZXRfY29tbW9uLmMgaGFzIGFkZGl0aW9uYWwgSVB2NC1vbmx5IHN0dWZmCisKKwordm9pZCBzb2NrZXRfd2FudF9wa3RpbmZvKGludCBmZCkgRkFTVF9GVU5DOworc3NpemVfdCBzZW5kX3RvX2Zyb20oaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4sIGludCBmbGFncywKKwkJY29uc3Qgc3RydWN0IHNvY2thZGRyICp0bywKKwkJY29uc3Qgc3RydWN0IHNvY2thZGRyICpmcm9tLAorCQlzb2NrbGVuX3QgdG9sZW4pIEZBU1RfRlVOQzsKK3NzaXplX3QgcmVjdl9mcm9tX3RvKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MsCisJCXN0cnVjdCBzb2NrYWRkciAqZnJvbSwKKwkJc3RydWN0IHNvY2thZGRyICp0bywKKwkJc29ja2xlbl90IHNhX3NpemUpIEZBU1RfRlVOQzsKKwordWludDE2X3QgaW5ldF9ja3N1bSh1aW50MTZfdCAqYWRkciwgaW50IGxlbikgRkFTVF9GVU5DOworCitjaGFyICp4c3RyZHVwKGNvbnN0IGNoYXIgKnMpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKK2NoYXIgKnhzdHJuZHVwKGNvbnN0IGNoYXIgKnMsIGludCBuKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7Cit2b2lkICp4bWVtZHVwKGNvbnN0IHZvaWQgKnMsIGludCBuKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7Cit2b2lkIG92ZXJsYXBwaW5nX3N0cmNweShjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYykgRkFTVF9GVU5DOworY2hhciAqc2FmZV9zdHJuY3B5KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc2l6ZSkgRkFTVF9GVU5DOworY2hhciAqc3RybmNweV9JRk5BTVNJWihjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYykgRkFTVF9GVU5DOwordW5zaWduZWQgY291bnRfc3Ryc3RyKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqc3ViKSBGQVNUX0ZVTkM7CitjaGFyICp4bWFsbG9jX3N1YnN0aXR1dGVfc3RyaW5nKGNvbnN0IGNoYXIgKnNyYywgaW50IGNvdW50LCBjb25zdCBjaGFyICpzdWIsIGNvbnN0IGNoYXIgKnJlcGwpIEZBU1RfRlVOQzsKKy8qIEd1YXJhbnRlZWQgdG8gTk9UIGJlIGEgbWFjcm8gKHNtYWxsZXN0IGNvZGUpLiBTYXZlcyBuZWFybHkgMmsgb24gdWNsaWJjLgorICogQnV0IHBvdGVudGlhbGx5IHNsb3csIGRvbid0IHVzZSBpbiBvbmUtYmlsbGlvbi10aW1lcyBsb29wcyAqLworaW50IGJiX3B1dGNoYXIoaW50IGNoKSBGQVNUX0ZVTkM7CisvKiBOb3RlOiBkb2VzIG5vdCB1c2Ugc3RkaW8sIHdyaXRlcyB0byBmZCAyIGRpcmVjdGx5ICovCitpbnQgYmJfcHV0Y2hhcl9zdGRlcnIoY2hhciBjaCkgRkFTVF9GVU5DOworY2hhciAqeGFzcHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0KHByaW50ZiwgMSwgMikpKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CitjaGFyICphdXRvX3N0cmluZyhjaGFyICpzdHIpIEZBU1RfRlVOQzsKKy8vIGdjYy00LjEuMSBzdGlsbCBpc24ndCBnb29kIGVub3VnaCBhdCBvcHRpbWl6aW5nIGl0CisvLyAoKzIwMCBieXRlcyBjb21wYXJlZCB0byBtYWNybykKKy8vc3RhdGljIEFMV0FZU19JTkxJTkUKKy8vaW50IExPTkVfREFTSChjb25zdCBjaGFyICpzKSB7IHJldHVybiBzWzBdID09ICctJyAmJiAhc1sxXTsgfQorLy9zdGF0aWMgQUxXQVlTX0lOTElORQorLy9pbnQgTk9UX0xPTkVfREFTSChjb25zdCBjaGFyICpzKSB7IHJldHVybiBzWzBdICE9ICctJyB8fCBzWzFdOyB9CisjZGVmaW5lIExPTkVfREFTSChzKSAgICAgKChzKVswXSA9PSAnLScgJiYgIShzKVsxXSkKKyNkZWZpbmUgTk9UX0xPTkVfREFTSChzKSAoKHMpWzBdICE9ICctJyB8fCAocylbMV0pCisjZGVmaW5lIExPTkVfQ0hBUihzLGMpICAgICAoKHMpWzBdID09IChjKSAmJiAhKHMpWzFdKQorI2RlZmluZSBOT1RfTE9ORV9DSEFSKHMsYykgKChzKVswXSAhPSAoYykgfHwgKHMpWzFdKQorI2RlZmluZSBET1RfT1JfRE9URE9UKHMpICgocylbMF0gPT0gJy4nICYmICghKHMpWzFdIHx8ICgocylbMV0gPT0gJy4nICYmICEocylbMl0pKSkKKwordHlwZWRlZiBzdHJ1Y3QgdW5pX3N0YXRfdCB7CisJdW5zaWduZWQgYnl0ZV9jb3VudDsKKwl1bnNpZ25lZCB1bmljb2RlX2NvdW50OworCXVuc2lnbmVkIHVuaWNvZGVfd2lkdGg7Cit9IHVuaV9zdGF0X3Q7CisvKiBSZXR1cm5zIGEgc3RyaW5nIHdpdGggdW5wcmludGFibGUgY2hhcnMgcmVwbGFjZWQgYnkgJz8nIG9yCisgKiBTVUJTVF9XQ0hBUi4gVGhpcyBmdW5jdGlvbiBpcyB1bmljb2RlLWF3YXJlLiAqLworY29uc3QgY2hhciogRkFTVF9GVU5DIHByaW50YWJsZV9zdHJpbmcodW5pX3N0YXRfdCAqc3RhdHMsIGNvbnN0IGNoYXIgKnN0cik7CisvKiBQcmludHMgdW5wcmludGFibGUgY2hhciBjaCBhcyBeQyBvciBNLWMgdG8gZmlsZQorICogKE0tYyBpcyB1c2VkIG9ubHkgaWYgY2ggaXMgT1JlZCB3aXRoIFBSSU5UQUJMRV9NRVRBKSwKKyAqIGVsc2UgaXQgaXMgcHJpbnRlZCBhcy1pcyAoZXhjZXB0IGZvciBjaCA9IDB4OWIpICovCitlbnVtIHsgUFJJTlRBQkxFX01FVEEgPSAweDEwMCB9Owordm9pZCBmcHV0Y19wcmludGFibGUoaW50IGNoLCBGSUxFICpmaWxlKSBGQVNUX0ZVTkM7CisvKiBSZXR1cm4gYSBzdHJpbmcgdGhhdCBpcyB0aGUgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIGNoYXJhY3RlciBjaC4KKyAqIEJ1ZmZlciBtdXN0IGhvbGQgYXQgbGVhc3QgZm91ciBjaGFyYWN0ZXJzLiAqLworZW51bSB7CisJVklTSUJMRV9FTkRMSU5FICAgPSAxIDw8IDAsCisJVklTSUJMRV9TSE9XX1RBQlMgPSAxIDw8IDEsCit9Owordm9pZCB2aXNpYmxlKHVuc2lnbmVkIGNoLCBjaGFyICpidWYsIGludCBmbGFncykgRkFTVF9GVU5DOworCisvKiBkbWFsbG9jIHdpbGwgcmVkZWZpbmUgdGhlc2UgdG8gaXQncyBvd24gaW1wbGVtZW50YXRpb24uIEl0IGlzIHNhZmUKKyAqIHRvIGhhdmUgdGhlIHByb3RvdHlwZXMgaGVyZSB1bmNvbmRpdGlvbmFsbHkuICAqLwordm9pZCAqbWFsbG9jX29yX3dhcm4oc2l6ZV90IHNpemUpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKK3ZvaWQgKnhtYWxsb2Moc2l6ZV90IHNpemUpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKK3ZvaWQgKnh6YWxsb2Moc2l6ZV90IHNpemUpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKK3ZvaWQgKnhyZWFsbG9jKHZvaWQgKm9sZCwgc2l6ZV90IHNpemUpIEZBU1RfRlVOQzsKKy8qIEFmdGVyIHYgPSB4cmVhbGxvY192ZWN0b3IodiwgU0hJRlQsIGlkeCkgaXQncyBvayB0byB1c2UKKyAqIGF0IGxlYXN0IHZbaWR4XSBhbmQgdltpZHgrMV0sIGZvciBhbGwgaWR4IHZhbHVlcy4KKyAqIFNISUZUIHNwZWNpZmllcyBob3cgbWFueSBuZXcgZWxlbWVudHMgYXJlIGFkZGVkICgxOjIsIDI6NCwgLi4uLCA4OjI1Ni4uLikKKyAqIHdoZW4gYWxsIGVsZW1lbnRzIGFyZSB1c2VkIHVwLiBOZXcgZWxlbWVudHMgYXJlIHplcm9lZCBvdXQuCisgKiB4cmVhbGxvY192ZWN0b3IodiwgU0hJRlQsIGlkeCkgKk1VU1QqIGJlIGNhbGxlZCB3aXRoIGNvbnNlY3V0aXZlIElEWHMgLQorICogc2tpcHBpbmcgYW4gaW5kZXggaXMgYSBiYWQgYnVnIC0gaXQgbWF5IG1pc3MgYSByZWFsbG9jIQorICovCisjZGVmaW5lIHhyZWFsbG9jX3ZlY3Rvcih2ZWN0b3IsIHNoaWZ0LCBpZHgpIFwKKwl4cmVhbGxvY192ZWN0b3JfaGVscGVyKCh2ZWN0b3IpLCAoc2l6ZW9mKCh2ZWN0b3IpWzBdKSA8PCA4KSArIChzaGlmdCksIChpZHgpKQordm9pZCogeHJlYWxsb2NfdmVjdG9yX2hlbHBlcih2b2lkICp2ZWN0b3IsIHVuc2lnbmVkIHNpemVvZl9hbmRfc2hpZnQsIGludCBpZHgpIEZBU1RfRlVOQzsKKworCitleHRlcm4gc3NpemVfdCBzYWZlX3JlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkgRkFTVF9GVU5DOworZXh0ZXJuIHNzaXplX3Qgbm9uYmxvY2tfaW1tdW5lX3JlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkgRkFTVF9GVU5DOworLy8gTkI6IHdpbGwgcmV0dXJuIHNob3J0IHJlYWQgb24gZXJyb3IsIG5vdCAtMSwKKy8vIGlmIHNvbWUgZGF0YSB3YXMgcmVhZCBiZWZvcmUgZXJyb3Igb2NjdXJyZWQKK2V4dGVybiBzc2l6ZV90IGZ1bGxfcmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KSBGQVNUX0ZVTkM7CitleHRlcm4gdm9pZCB4cmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KSBGQVNUX0ZVTkM7CitleHRlcm4gdW5zaWduZWQgY2hhciB4cmVhZF9jaGFyKGludCBmZCkgRkFTVF9GVU5DOworZXh0ZXJuIHNzaXplX3QgcmVhZF9jbG9zZShpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IG1heHN6KSBGQVNUX0ZVTkM7CitleHRlcm4gc3NpemVfdCBvcGVuX3JlYWRfY2xvc2UoY29uc3QgY2hhciAqZmlsZW5hbWUsIHZvaWQgKmJ1Ziwgc2l6ZV90IG1heHN6KSBGQVNUX0ZVTkM7CisvLyBSZWFkcyBvbmUgbGluZSBhLWxhIGZnZXRzIChidXQgZG9lc24ndCBzYXZlIHRlcm1pbmF0aW5nICdcbicpLgorLy8gUmVhZHMgYnl0ZS1ieS1ieXRlLiBVc2VmdWwgd2hlbiBpdCBpcyBpbXBvcnRhbnQgdG8gbm90IHJlYWQgYWhlYWQuCisvLyBCeXRlcyBhcmUgYXBwZW5kZWQgdG8gcGZ4ICh3aGljaCBtdXN0IGJlIG1hbGxvY2VkLCBvciBOVUxMKS4KK2V4dGVybiBjaGFyICp4bWFsbG9jX3JlYWRzKGludCBmZCwgc2l6ZV90ICptYXhzel9wKSBGQVNUX0ZVTkM7CisvKiBSZWFkcyBibG9jayB1cCB0byAqbWF4c3pfcCAoZGVmYXVsdDogSU5UX01BWCAtIDQwOTUpICovCitleHRlcm4gdm9pZCAqeG1hbGxvY19yZWFkKGludCBmZCwgc2l6ZV90ICptYXhzel9wKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisvKiBSZXR1cm5zIE5VTEwgaWYgZmlsZSBjYW4ndCBiZSBvcGVuZWQgKGRlZmF1bHQgbWF4IHNpemU6IElOVF9NQVggLSA0MDk1KSAqLworZXh0ZXJuIHZvaWQgKnhtYWxsb2Nfb3Blbl9yZWFkX2Nsb3NlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzaXplX3QgKm1heHN6X3ApIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKKy8qIE5ldmVyIHJldHVybnMgTlVMTCAqLworZXh0ZXJuIHZvaWQgKnhtYWxsb2NfeG9wZW5fcmVhZF9jbG9zZShjb25zdCBjaGFyICpmaWxlbmFtZSwgc2l6ZV90ICptYXhzel9wKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisKKyNpZiBkZWZpbmVkKEFSR19NQVgpICYmIChBUkdfTUFYID49IDYwKjEwMjQgfHwgIWRlZmluZWQoX1NDX0FSR19NQVgpKQorLyogVXNlIF9jb25zdGFudF8gbWF4aW11bSBpZjogZGVmaW5lZCAmJiAoYmlnIGVub3VnaCB8fCBubyB2YXJpYWJsZSBvbmUgZXhpc3RzKSAqLworIyBkZWZpbmUgYmJfYXJnX21heCgpICgodW5zaWduZWQpQVJHX01BWCkKKyNlbGlmIGRlZmluZWQoX1NDX0FSR19NQVgpCisvKiBFbHNlIHVzZSB2YXJpYWJsZSBvbmUgKGEgYml0IG1vcmUgZXhwZW5zaXZlKSAqLwordW5zaWduZWQgYmJfYXJnX21heCh2b2lkKSBGQVNUX0ZVTkM7CisjZWxzZQorLyogSWYgYWxsIGVsc2UgZmFpbHMgKi8KKyMgZGVmaW5lIGJiX2FyZ19tYXgoKSAoKHVuc2lnbmVkKSgzMiAqIDEwMjQpKQorI2VuZGlmCit1bnNpZ25lZCBiYl9jbGtfdGNrKHZvaWQpIEZBU1RfRlVOQzsKKworI2RlZmluZSBTRUFNTEVTU19DT01QUkVTU0lPTiAoMCBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfWFogXAorIHx8IEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0xaTUEgXAorIHx8IEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0JaMiBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfR1ogXAorIHx8IEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX1opCisKKyNpZiBTRUFNTEVTU19DT01QUkVTU0lPTgorLyogQXV0b2RldGVjdHMgZ3ppcC9iemlwMiBmb3JtYXRzLiBmZCBtYXkgYmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgZmlsZSEgKi8KK2V4dGVybiBpbnQgc2V0dXBfdW56aXBfb25fZmQoaW50IGZkLCBpbnQgZmFpbF9pZl9ub3RfY29tcHJlc3NlZCkgRkFTVF9GVU5DOworLyogQXV0b2RldGVjdHMgLmd6IGV0YyAqLworZXh0ZXJuIGludCBvcGVuX3ppcHBlZChjb25zdCBjaGFyICpmbmFtZSwgaW50IGZhaWxfaWZfbm90X2NvbXByZXNzZWQpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkICp4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UoY29uc3QgY2hhciAqZm5hbWUsIHNpemVfdCAqbWF4c3pfcCkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworI2Vsc2UKKyMgZGVmaW5lIHNldHVwX3VuemlwX29uX2ZkKC4uLikgKDApCisjIGRlZmluZSBvcGVuX3ppcHBlZChmbmFtZSwgZmFpbF9pZl9ub3RfY29tcHJlc3NlZCkgIG9wZW4oKGZuYW1lKSwgT19SRE9OTFkpOworIyBkZWZpbmUgeG1hbGxvY19vcGVuX3ppcHBlZF9yZWFkX2Nsb3NlKGZuYW1lLCBtYXhzel9wKSB4bWFsbG9jX29wZW5fcmVhZF9jbG9zZSgoZm5hbWUpLCAobWF4c3pfcCkpCisjZW5kaWYKKworZXh0ZXJuIHNzaXplX3Qgc2FmZV93cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KSBGQVNUX0ZVTkM7CisvLyBOQjogd2lsbCByZXR1cm4gc2hvcnQgd3JpdGUgb24gZXJyb3IsIG5vdCAtMSwKKy8vIGlmIHNvbWUgZGF0YSB3YXMgd3JpdHRlbiBiZWZvcmUgZXJyb3Igb2NjdXJyZWQKK2V4dGVybiBzc2l6ZV90IGZ1bGxfd3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgeHdyaXRlKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIHh3cml0ZV9zdHIoaW50IGZkLCBjb25zdCBjaGFyICpzdHIpIEZBU1RfRlVOQzsKK2V4dGVybiBzc2l6ZV90IGZ1bGxfd3JpdGUxX3N0cihjb25zdCBjaGFyICpzdHIpIEZBU1RfRlVOQzsKK2V4dGVybiBzc2l6ZV90IGZ1bGxfd3JpdGUyX3N0cihjb25zdCBjaGFyICpzdHIpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIHhvcGVuX3h3cml0ZV9jbG9zZShjb25zdCBjaGFyKiBmaWxlLCBjb25zdCBjaGFyICpzdHIpIEZBU1RfRlVOQzsKKworLyogQ2xvc2UgZmQsIGJ1dCBjaGVjayBmb3IgZmFpbHVyZXMgKHNvbWUgdHlwZXMgb2Ygd3JpdGUgZXJyb3JzKSAqLworZXh0ZXJuIHZvaWQgeGNsb3NlKGludCBmZCkgRkFTVF9GVU5DOworCisvKiBSZWFkcyBhbmQgcHJpbnRzIHRvIHN0ZG91dCB0aWxsIGVvZiwgdGhlbiBjbG9zZXMgRklMRS4gRXhpdHMgb24gZXJyb3I6ICovCitleHRlcm4gdm9pZCB4cHJpbnRfYW5kX2Nsb3NlX2ZpbGUoRklMRSAqZmlsZSkgRkFTVF9GVU5DOworCisvKiBSZWFkcyBhIGxpbmUgZnJvbSBhIHRleHQgZmlsZSwgdXAgdG8gYSBuZXdsaW5lIG9yIE5VTCBieXRlLCBpbmNsdXNpdmUuCisgKiBSZXR1cm5zIG1hbGxvYydlZCBjaGFyKi4gSWYgZW5kIGlzIE5VTEwgJ1xuJyBpc24ndCBjb25zaWRlcmVkCisgKiBlbmQgb2YgbGluZS4gSWYgZW5kIGlzbid0IE5VTEwsIGxlbmd0aCBvZiB0aGUgY2h1bmsgaXMgc3RvcmVkIGluIGl0LgorICogUmV0dXJucyBOVUxMIGlmIEVPRi9lcnJvci4KKyAqLworZXh0ZXJuIGNoYXIgKmJiX2dldF9jaHVua19mcm9tX2ZpbGUoRklMRSAqZmlsZSwgaW50ICplbmQpIEZBU1RfRlVOQzsKKy8qIFJlYWRzIHVwIHRvIChhbmQgaW5jbHVkaW5nKSBURVJNSU5BVElOR19TVFJJTkc6ICovCitleHRlcm4gY2hhciAqeG1hbGxvY19mZ2V0c19zdHIoRklMRSAqZmlsZSwgY29uc3QgY2hhciAqdGVybWluYXRpbmdfc3RyaW5nKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisvKiBTYW1lLCB3aXRoIGxpbWl0ZWQgbWF4IHNpemUsIGFuZCByZXR1cm5zIHRoZSBsZW5ndGggKGV4Y2x1ZGluZyBOVUwpOiAqLworZXh0ZXJuIGNoYXIgKnhtYWxsb2NfZmdldHNfc3RyX2xlbihGSUxFICpmaWxlLCBjb25zdCBjaGFyICp0ZXJtaW5hdGluZ19zdHJpbmcsIHNpemVfdCAqbWF4c3pfcCkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworLyogQ2hvcHMgb2ZmIFRFUk1JTkFUSU5HX1NUUklORyBmcm9tIHRoZSBlbmQ6ICovCitleHRlcm4gY2hhciAqeG1hbGxvY19mZ2V0bGluZV9zdHIoRklMRSAqZmlsZSwgY29uc3QgY2hhciAqdGVybWluYXRpbmdfc3RyaW5nKSBGQVNUX0ZVTkMgUkVUVVJOU19NQUxMT0M7CisvKiBSZWFkcyB1cCB0byAoYW5kIGluY2x1ZGluZykgIlxuIiBvciBOVUwgYnl0ZTogKi8KK2V4dGVybiBjaGFyICp4bWFsbG9jX2ZnZXRzKEZJTEUgKmZpbGUpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKKy8qIENob3BzIG9mZiAnXG4nIGZyb20gdGhlIGVuZCwgdW5saWtlIGZnZXRzOiAqLworZXh0ZXJuIGNoYXIgKnhtYWxsb2NfZmdldGxpbmUoRklMRSAqZmlsZSkgRkFTVF9GVU5DIFJFVFVSTlNfTUFMTE9DOworLyogU2FtZSwgYnV0IGRvZXNuJ3QgdHJ5IHRvIGNvbnNlcnZlIHNwYWNlIChtYXkgaGF2ZSBzb21lIHNsYWNrIGFmdGVyIHRoZSBlbmQpICovCisvKiBleHRlcm4gY2hhciAqeG1hbGxvY19mZ2V0bGluZV9mYXN0KEZJTEUgKmZpbGUpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsgKi8KKwordm9pZCBkaWVfaWZfZmVycm9yKEZJTEUgKmZpbGUsIGNvbnN0IGNoYXIgKm1zZykgRkFTVF9GVU5DOwordm9pZCBkaWVfaWZfZmVycm9yX3N0ZG91dCh2b2lkKSBGQVNUX0ZVTkM7CitpbnQgZmZsdXNoX2FsbCh2b2lkKSBGQVNUX0ZVTkM7Cit2b2lkIGZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoaW50IHJldHZhbCkgTk9SRVRVUk4gRkFTVF9GVU5DOworaW50IGZjbG9zZV9pZl9ub3Rfc3RkaW4oRklMRSAqZmlsZSkgRkFTVF9GVU5DOworRklMRSogeGZvcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICptb2RlKSBGQVNUX0ZVTkM7CisvKiBQcmludHMgd2FybmluZyB0byBzdGRlcnIgYW5kIHJldHVybnMgTlVMTCBvbiBmYWlsdXJlOiAqLworRklMRSogZm9wZW5fb3Jfd2Fybihjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqbW9kZSkgRkFTVF9GVU5DOworLyogIk9wZW5zIiBzdGRpbiBpZiBmaWxlbmFtZSBpcyBzcGVjaWFsLCBlbHNlIGp1c3Qgb3BlbnMgZmlsZTogKi8KK0ZJTEUqIHhmb3Blbl9zdGRpbihjb25zdCBjaGFyICpmaWxlbmFtZSkgRkFTVF9GVU5DOworRklMRSogZm9wZW5fb3Jfd2Fybl9zdGRpbihjb25zdCBjaGFyICpmaWxlbmFtZSkgRkFTVF9GVU5DOworRklMRSogZm9wZW5fZm9yX3JlYWQoY29uc3QgY2hhciAqcGF0aCkgRkFTVF9GVU5DOworRklMRSogeGZvcGVuX2Zvcl9yZWFkKGNvbnN0IGNoYXIgKnBhdGgpIEZBU1RfRlVOQzsKK0ZJTEUqIGZvcGVuX2Zvcl93cml0ZShjb25zdCBjaGFyICpwYXRoKSBGQVNUX0ZVTkM7CitGSUxFKiB4Zm9wZW5fZm9yX3dyaXRlKGNvbnN0IGNoYXIgKnBhdGgpIEZBU1RfRlVOQzsKK0ZJTEUqIHhmZG9wZW5fZm9yX3JlYWQoaW50IGZkKSBGQVNUX0ZVTkM7CitGSUxFKiB4ZmRvcGVuX2Zvcl93cml0ZShpbnQgZmQpIEZBU1RfRlVOQzsKKworaW50IGJiX3BzdHJjbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikgLyogbm90IEZBU1RfRlVOQyEgKi87Cit2b2lkIHFzb3J0X3N0cmluZ192ZWN0b3IoY2hhciAqKnN2LCB1bnNpZ25lZCBjb3VudCkgRkFTVF9GVU5DOworCisvKiBXcmFwcGVyIHdoaWNoIHJlc3RhcnRzIHBvbGwgb24gRUlOVFIgb3IgRU5PTUVNLgorICogT24gb3RoZXIgZXJyb3JzIGNvbXBsYWlucyBbcGVycm9yKCJwb2xsIildIGFuZCByZXR1cm5zLgorICogV2FybmluZyEgTWF5IHRha2UgKG11Y2gpIGxvbmdlciB0aGFuIHRpbWVvdXRfbXMgdG8gcmV0dXJuIQorICogSWYgdGhpcyBpcyBhIHByb2JsZW0sIHVzZSBiYXJlIHBvbGwgYW5kIG9wZW4tY29kZSBFSU5UUi9FTk9NRU0gaGFuZGxpbmcgKi8KK2ludCBzYWZlX3BvbGwoc3RydWN0IHBvbGxmZCAqdWZkcywgbmZkc190IG5mZHMsIGludCB0aW1lb3V0X21zKSBGQVNUX0ZVTkM7CisKK2NoYXIgKnNhZmVfZ2V0aG9zdG5hbWUodm9pZCkgRkFTVF9GVU5DOworCisvKiBDb252ZXJ0IGVhY2ggYWxwaGEgY2hhciBpbiBzdHIgdG8gbG93ZXItY2FzZSAqLworY2hhciogc3RyX3RvbG93ZXIoY2hhciAqc3RyKSBGQVNUX0ZVTkM7CisKK2NoYXIgKnV0b2EodW5zaWduZWQgbikgRkFTVF9GVU5DOworY2hhciAqaXRvYShpbnQgbikgRkFTVF9GVU5DOworLyogUmV0dXJucyBhIHBvaW50ZXIgcGFzdCB0aGUgZm9ybWF0dGVkIG51bWJlciwgZG9lcyBOT1QgbnVsbC10ZXJtaW5hdGUgKi8KK2NoYXIgKnV0b2FfdG9fYnVmKHVuc2lnbmVkIG4sIGNoYXIgKmJ1ZiwgdW5zaWduZWQgYnVmbGVuKSBGQVNUX0ZVTkM7CitjaGFyICppdG9hX3RvX2J1ZihpbnQgbiwgY2hhciAqYnVmLCB1bnNpZ25lZCBidWZsZW4pIEZBU1RfRlVOQzsKKy8qIEludGVsbGlnZW50IGZvcm1hdHRlcnMgb2YgYmlnbnVtcyAqLworY2hhciAqc21hcnRfdWxsdG9hNCh1bnNpZ25lZCBsb25nIGxvbmcgdWwsIGNoYXIgYnVmWzRdLCBjb25zdCBjaGFyICpzY2FsZSkgRkFTVF9GVU5DOworY2hhciAqc21hcnRfdWxsdG9hNSh1bnNpZ25lZCBsb25nIGxvbmcgdWwsIGNoYXIgYnVmWzVdLCBjb25zdCBjaGFyICpzY2FsZSkgRkFTVF9GVU5DOworLyogSWYgYmxvY2tfc2l6ZSA9PSAwLCBkaXNwbGF5IHNpemUgd2l0aG91dCBmcmFjdGlvbmFsIHBhcnQsCisgKiBlbHNlIGRpc3BsYXkgKHNpemUgKiBibG9ja19zaXplKSB3aXRoIG9uZSBkZWNpbWFsIGRpZ2l0LgorICogSWYgZGlzcGxheV91bml0ID09IDAsIHNob3cgdmFsdWUgbm8gYmlnZ2VyIHRoYW4gMTAyNCB3aXRoIHN1ZmZpeCAoSyxNLEcuLi4pLAorICogZWxzZSBkaXZpZGUgYnkgZGlzcGxheV91bml0IGFuZCBkbyBub3QgdXNlIHN1ZmZpeC4gKi8KKyNkZWZpbmUgSFVNQU5fUkVBREFCTEVfTUFYX1dJRFRIICAgICAgNyAgLyogIjEwMjQuMEciICovCisjZGVmaW5lIEhVTUFOX1JFQURBQkxFX01BWF9XSURUSF9TVFIgIjciCisvL1RPRE86IHByb3ZpZGUgcG9pbnRlciB0byBidWYgKGF2b2lkIHN0YXRpY3MpPworY29uc3QgY2hhciAqbWFrZV9odW1hbl9yZWFkYWJsZV9zdHIodW5zaWduZWQgbG9uZyBsb25nIHNpemUsCisJCXVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZSwgdW5zaWduZWQgbG9uZyBkaXNwbGF5X3VuaXQpIEZBU1RfRlVOQzsKKy8qIFB1dCBhIHN0cmluZyBvZiBoZXggYnl0ZXMgKCIxYjJlNjZmZSIuLi4pLCByZXR1cm4gYWR2YW5jZWQgcG9pbnRlciAqLworY2hhciAqYmluMmhleChjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgaW50IGNvdW50KSBGQVNUX0ZVTkM7CisvKiBSZXZlcnNlICovCitjaGFyKiBoZXgyYmluKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBpbnQgY291bnQpIEZBU1RfRlVOQzsKKworLyogR2VuZXJhdGUgYSBVVUlEICovCit2b2lkIGdlbmVyYXRlX3V1aWQodWludDhfdCAqYnVmKSBGQVNUX0ZVTkM7CisKKy8qIExhc3QgZWxlbWVudCBpcyBtYXJrZWQgYnkgbXVsdCA9PSAwICovCitzdHJ1Y3Qgc3VmZml4X211bHQgeworCWNoYXIgc3VmZml4WzRdOworCXVuc2lnbmVkIG11bHQ7Cit9OworZXh0ZXJuIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCBia21fc3VmZml4ZXNbXTsKKyNkZWZpbmUga21fc3VmZml4ZXMgKGJrbV9zdWZmaXhlcyArIDEpCitleHRlcm4gY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0IGN3YmtNR19zdWZmaXhlc1tdOworI2RlZmluZSBrTUdfc3VmZml4ZXMgKGN3YmtNR19zdWZmaXhlcyArIDMpCisKKyNpbmNsdWRlICJ4YXRvbnVtLmgiCisvKiBTcGVjaWFsaXplZDogKi8KKworLyogVXNpbmcgeGF0b2koKSBpbnN0ZWFkIG9mIG5haXZlIGF0b2koKSBpcyBub3QgYWx3YXlzIGNvbnZlbmllbnQgLQorICogaW4gbWFueSBwbGFjZXMgcGVvcGxlIHdhbnQgKm5vbi1uZWdhdGl2ZSogdmFsdWVzLCBidXQgc3RvcmUgdGhlbQorICogaW4gc2lnbmVkIGludC4gVGhlcmVmb3JlIHdlIG5lZWQgdGhpcyBvbmU6CisgKiBkaWVzIGlmIGlucHV0IGlzIG5vdCBpbiBbMCwgSU5UX01BWF0gcmFuZ2UuIEFsc28gd2lsbCByZWplY3QgJy0wJyBldGMuCisgKiBJdCBzaG91bGQgcmVhbGx5IGJlIG5hbWVkIHhhdG9pX25vbm5lZ2F0aXZlIChzaW5jZSBpdCBhbGxvd3MgMCksCisgKiBidXQgdGhhdCB3b3VsZCBiZSB0b28gbG9uZy4KKyAqLworaW50IHhhdG9pX3Bvc2l0aXZlKGNvbnN0IGNoYXIgKm51bXN0cikgRkFTVF9GVU5DOworCisvKiBVc2VmdWwgZm9yIHJlYWRpbmcgcG9ydCBudW1iZXJzICovCit1aW50MTZfdCB4YXRvdTE2KGNvbnN0IGNoYXIgKm51bXN0cikgRkFTVF9GVU5DOworCisKKy8qIFRoZXNlIHBhcnNlIGVudHJpZXMgaW4gL2V0Yy9wYXNzd2QgYW5kIC9ldGMvZ3JvdXAuICBUaGlzIGlzIGRlc2lyYWJsZQorICogZm9yIEJ1c3lCb3ggc2luY2Ugd2Ugd2FudCB0byBhdm9pZCB1c2luZyB0aGUgZ2xpYmMgTlNTIHN0dWZmLCB3aGljaAorICogaW5jcmVhc2VzIHRhcmdldCBzaXplIGFuZCBpcyBvZnRlbiBub3QgbmVlZGVkIG9uIGVtYmVkZGVkIHN5c3RlbXMuICAqLworbG9uZyB4dW5hbWUydWlkKGNvbnN0IGNoYXIgKm5hbWUpIEZBU1RfRlVOQzsKK2xvbmcgeGdyb3VwMmdpZChjb25zdCBjaGFyICpuYW1lKSBGQVNUX0ZVTkM7CisvKiB3cmFwcGVyOiBhbGxvd3Mgc3RyaW5nIHRvIGNvbnRhaW4gbnVtZXJpYyB1aWQgb3IgZ2lkICovCit1bnNpZ25lZCBsb25nIGdldF91Z19pZChjb25zdCBjaGFyICpzLCBsb25nIEZBU1RfRlVOQyAoKnhuYW1lMmlkKShjb25zdCBjaGFyICopKSBGQVNUX0ZVTkM7CisvKiBmcm9tIGNocHN0LiBEb2VzIG5vdCBkaWUsIHJldHVybnMgMCBvbiBmYWlsdXJlICovCitzdHJ1Y3QgYmJfdWlkZ2lkX3QgeworCXVpZF90IHVpZDsKKwlnaWRfdCBnaWQ7Cit9OworLyogYWx3YXlzIHNldHMgdWlkIGFuZCBnaWQgKi8KK2ludCBnZXRfdWlkZ2lkKHN0cnVjdCBiYl91aWRnaWRfdCosIGNvbnN0IGNoYXIqLCBpbnQgbnVtZXJpY19vaykgRkFTVF9GVU5DOworLyogYWx3YXlzIHNldHMgdWlkIGFuZCBnaWQsIGFsbG93cyBudW1lcmljOyBleGl0cyBvbiBmYWlsdXJlICovCit2b2lkIHhnZXRfdWlkZ2lkKHN0cnVjdCBiYl91aWRnaWRfdCosIGNvbnN0IGNoYXIqKSBGQVNUX0ZVTkM7CisvKiBjaG93bi1saWtlIGhhbmRsaW5nIG9mICJ1c2VyWzpbZ3JvdXBdIiAqLwordm9pZCBwYXJzZV9jaG93bl91c2VyZ3JvdXBfb3JfZGllKHN0cnVjdCBiYl91aWRnaWRfdCAqdSwgY2hhciAqdXNlcl9ncm91cCkgRkFTVF9GVU5DOworc3RydWN0IHBhc3N3ZCogeGdldHB3bmFtKGNvbnN0IGNoYXIgKm5hbWUpIEZBU1RfRlVOQzsKK3N0cnVjdCBncm91cCogeGdldGdybmFtKGNvbnN0IGNoYXIgKm5hbWUpIEZBU1RfRlVOQzsKK3N0cnVjdCBwYXNzd2QqIHhnZXRwd3VpZCh1aWRfdCB1aWQpIEZBU1RfRlVOQzsKK3N0cnVjdCBncm91cCogeGdldGdyZ2lkKGdpZF90IGdpZCkgRkFTVF9GVU5DOworY2hhciogeHVpZDJ1bmFtZSh1aWRfdCB1aWQpIEZBU1RfRlVOQzsKK2NoYXIqIHhnaWQyZ3JvdXAoZ2lkX3QgZ2lkKSBGQVNUX0ZVTkM7CitjaGFyKiB1aWQydW5hbWUodWlkX3QgdWlkKSBGQVNUX0ZVTkM7CitjaGFyKiBnaWQyZ3JvdXAoZ2lkX3QgZ2lkKSBGQVNUX0ZVTkM7CitjaGFyKiB1aWQydW5hbWVfdXRvYSh1aWRfdCB1aWQpIEZBU1RfRlVOQzsKK2NoYXIqIGdpZDJncm91cF91dG9hKGdpZF90IGdpZCkgRkFTVF9GVU5DOworLyogdmVyc2lvbnMgd2hpY2ggY2FjaGUgcmVzdWx0cyAodXNlZnVsIGZvciBwcywgbHMgZXRjKSAqLworY29uc3QgY2hhciogZ2V0X2NhY2hlZF91c2VybmFtZSh1aWRfdCB1aWQpIEZBU1RfRlVOQzsKK2NvbnN0IGNoYXIqIGdldF9jYWNoZWRfZ3JvdXBuYW1lKGdpZF90IGdpZCkgRkFTVF9GVU5DOwordm9pZCBjbGVhcl91c2VybmFtZV9jYWNoZSh2b2lkKSBGQVNUX0ZVTkM7CisvKiBpbnRlcm5hbGx5IHVzZXJuYW1lcyBhcmUgc2F2ZWQgaW4gZml4ZWQtc2l6ZWQgY2hhcltdIGJ1ZmZlcnMgKi8KK2VudW0geyBVU0VSTkFNRV9NQVhfU0laRSA9IDMyIC0gc2l6ZW9mKHVpZF90KSB9OworI2lmIEVOQUJMRV9GRUFUVVJFX0NIRUNLX05BTUVTCit2b2lkIGRpZV9pZl9iYWRfdXNlcm5hbWUoY29uc3QgY2hhciogbmFtZSkgRkFTVF9GVU5DOworI2Vsc2UKKyNkZWZpbmUgZGllX2lmX2JhZF91c2VybmFtZShuYW1lKSAoKHZvaWQpKG5hbWUpKQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9VVE1QCit2b2lkIEZBU1RfRlVOQyB3cml0ZV9uZXdfdXRtcChwaWRfdCBwaWQsIGludCBuZXdfdHlwZSwgY29uc3QgY2hhciAqdHR5X25hbWUsIGNvbnN0IGNoYXIgKnVzZXJuYW1lLCBjb25zdCBjaGFyICpob3N0bmFtZSk7Cit2b2lkIEZBU1RfRlVOQyB1cGRhdGVfdXRtcChwaWRfdCBwaWQsIGludCBuZXdfdHlwZSwgY29uc3QgY2hhciAqdHR5X25hbWUsIGNvbnN0IGNoYXIgKnVzZXJuYW1lLCBjb25zdCBjaGFyICpob3N0bmFtZSk7Cit2b2lkIEZBU1RfRlVOQyB1cGRhdGVfdXRtcF9ERUFEX1BST0NFU1MocGlkX3QgcGlkKTsKKyNlbHNlCisjIGRlZmluZSB3cml0ZV9uZXdfdXRtcChwaWQsIG5ld190eXBlLCB0dHlfbmFtZSwgdXNlcm5hbWUsIGhvc3RuYW1lKSAoKHZvaWQpMCkKKyMgZGVmaW5lIHVwZGF0ZV91dG1wKHBpZCwgbmV3X3R5cGUsIHR0eV9uYW1lLCB1c2VybmFtZSwgaG9zdG5hbWUpICgodm9pZCkwKQorIyBkZWZpbmUgdXBkYXRlX3V0bXBfREVBRF9QUk9DRVNTKHBpZCkgKCh2b2lkKTApCisjZW5kaWYKKworCitpbnQgZmlsZV9pc19leGVjdXRhYmxlKGNvbnN0IGNoYXIgKm5hbWUpIEZBU1RfRlVOQzsKK2NoYXIgKmZpbmRfZXhlY3V0YWJsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY2hhciAqKlBBVEhwKSBGQVNUX0ZVTkM7CitpbnQgZXhlY3V0YWJsZV9leGlzdHMoY29uc3QgY2hhciAqZmlsZW5hbWUpIEZBU1RfRlVOQzsKKworLyogQkJfRVhFQ3h4IGFsd2F5cyBleGVjcyAoaXQncyBub3QgZG9pbmcgTk9GT1JLL05PRVhFQyBzdHVmZiksCisgKiBidXQgaXQgbWF5IGV4ZWMgYnVzeWJveCBhbmQgY2FsbCBhcHBsZXQgaW5zdGVhZCBvZiBzZWFyY2hpbmcgUEFUSC4KKyAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1BSRUZFUl9BUFBMRVRTCitpbnQgQkJfRVhFQ1ZQKGNvbnN0IGNoYXIgKmZpbGUsIGNoYXIgKmNvbnN0IGFyZ3ZbXSkgRkFTVF9GVU5DOworI2RlZmluZSBCQl9FWEVDTFAocHJvZyxjbWQsLi4uKSBcCisJZG8geyBcCisJCWlmIChmaW5kX2FwcGxldF9ieV9uYW1lKHByb2cpID49IDApIFwKKwkJCWV4ZWNscChiYl9idXN5Ym94X2V4ZWNfcGF0aCwgY21kLCBfX1ZBX0FSR1NfXyk7IFwKKwkJZXhlY2xwKHByb2csIGNtZCwgX19WQV9BUkdTX18pOyBcCisJfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIEJCX0VYRUNWUChwcm9nLGNtZCkgICAgIGV4ZWN2cChwcm9nLGNtZCkKKyNkZWZpbmUgQkJfRVhFQ0xQKHByb2csY21kLC4uLikgZXhlY2xwKHByb2csY21kLF9fVkFfQVJHU19fKQorI2VuZGlmCitpbnQgQkJfRVhFQ1ZQX29yX2RpZShjaGFyICoqYXJndikgTk9SRVRVUk4gRkFTVF9GVU5DOworCisvKiB4dmZvcmsoKSBjYW4ndCBiZSBhIF9mdW5jdGlvbl8sIHJldHVybiBhZnRlciB2Zm9yayBtYW5nbGVzIHN0YWNrCisgKiBpbiB0aGUgcGFyZW50LiBJdCBtdXN0IGJlIGEgbWFjcm8uICovCisjZGVmaW5lIHh2Zm9yaygpIFwKKyh7IFwKKwlwaWRfdCBiYl9feHZmb3JrX3BpZCA9IHZmb3JrKCk7IFwKKwlpZiAoYmJfX3h2Zm9ya19waWQgPCAwKSBcCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgidmZvcmsiKTsgXAorCWJiX194dmZvcmtfcGlkOyBcCit9KQorI2lmIEJCX01NVQorcGlkX3QgeGZvcmsodm9pZCkgRkFTVF9GVU5DOworI2VuZGlmCisKKy8qIE5PTU1VIGZyaWVuZHkgZm9yaytleGVjOiAqLworcGlkX3Qgc3Bhd24oY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3BpZF90IHhzcGF3bihjaGFyICoqYXJndikgRkFTVF9GVU5DOworCitwaWRfdCBzYWZlX3dhaXRwaWQocGlkX3QgcGlkLCBpbnQgKndzdGF0LCBpbnQgb3B0aW9ucykgRkFTVF9GVU5DOworcGlkX3Qgd2FpdF9hbnlfbm9oYW5nKGludCAqd3N0YXQpIEZBU1RfRlVOQzsKKy8qIHdhaXQ0cGlkOiB1bmxpa2Ugd2FpdHBpZCwgd2FpdHMgT05MWSBmb3Igb25lIHByb2Nlc3MuCisgKiBSZXR1cm5zIHNpZyArIDB4MTgwIGlmIGNoaWxkIGlzIGtpbGxlZCBieSBzaWduYWwuCisgKiBJdCdzIHNhZmUgdG8gcGFzcyBuZWdhdGl2ZSAncGlkcycgZnJvbSBmYWlsZWQgW3ZdZm9yayAtCisgKiB3YWl0NHBpZCB3aWxsIHJldHVybiAtMSAoYW5kIHdpbGwgbm90IGNsb2JiZXIgW3ZdZm9yaydzIGVycm5vKS4KKyAqIElPVzogcmMgPSB3YWl0NHBpZChzcGF3bihhcmd2KSk7CisgKiAgICAgIGlmIChyYyA8IDApIGJiX3BlcnJvcl9tc2coIiVzIiwgYXJndlswXSk7CisgKiAgICAgIGlmIChyYyA+IDApIGJiX2Vycm9yX21zZygiZXhpdCBjb2RlOiAlZCIsIHJjICYgMHhmZik7CisgKi8KK2ludCB3YWl0NHBpZChwaWRfdCBwaWQpIEZBU1RfRlVOQzsKKy8qIFNhbWUgYXMgd2FpdDRwaWQoc3Bhd24oYXJndikpLCBidXQgd2l0aCBOT0ZPUksvTk9FWEVDIGlmIGNvbmZpZ3VyZWQ6ICovCitpbnQgc3Bhd25fYW5kX3dhaXQoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKKy8qIERvZXMgTk9UIGNoZWNrIHRoYXQgYXBwbGV0IGlzIE5PRk9SSywganVzdCBibGluZGx5IHJ1bnMgaXQgKi8KK2ludCBydW5fbm9mb3JrX2FwcGxldChpbnQgYXBwbGV0X25vLCBjaGFyICoqYXJndikgRkFTVF9GVU5DOworCisvKiBIZWxwZXJzIGZvciBkYWVtb25pemF0aW9uLgorICoKKyAqIGJiX2RhZW1vbml6ZShmbGFncykgPSBkYWVtb25pemUsIGRvZXMgbm90IGNvbXBpbGUgb24gTk9NTVUKKyAqCisgKiBiYl9kYWVtb25pemVfb3JfcmV4ZWMoZmxhZ3MsIGFyZ3YpID0gZGFlbW9uaXplcyBvbiBNTVUgKGFuZCBpZ25vcmVzIGFyZ3YpLAorICogICAgICByZXhlYydzIGl0c2VsZiBvbiBOT01NVSB3aXRoIGFyZ3YgcGFzc2VkIGFzIGNvbW1hbmQgbGluZS4KKyAqIFRodXMgYmJfZGFlbW9uaXplX29yX3JleGVjIG1heSBjYXVzZSB5b3VyIDxhcHBsZXQ+X21haW4oKSB0byBiZSByZS1leGVjdXRlZAorICogZnJvbSB0aGUgc3RhcnQuIChJdCB3aWxsIGRldGVjdCBpdCBhbmQgbm90IHJlZXhlYyBhZ2FpbiBzZWNvbmQgdGltZSkuCisgKiBZb3UgaGF2ZSB0byBhdWRpdCBjYXJlZnVsbHkgdGhhdCB5b3UgZG9uJ3QgZG8gc29tZXRoaW5nIHR3aWNlIGFzIGEgcmVzdWx0CisgKiAob3BlbmluZyBmaWxlcy9zb2NrZXRzLCBwYXJzaW5nIGNvbmZpZyBmaWxlcyBldGMuLi4pIQorICoKKyAqIEJvdGggb2YgdGhlIGFib3ZlIHdpbGwgcmVkaXJlY3QgZmQgMCwxLDIgdG8gL2Rldi9udWxsIGFuZCBkcm9wIGN0dHkKKyAqICh3aWxsIGRvIHNldHNpZCgpKS4KKyAqCisgKiBmb3JrX29yX3JleGVjKGFyZ3YpID0gYmFyZS1ib25lcyBmb3JrIG9uIE1NVSwKKyAqICAgICAgInZmb3JrICsgcmUtZXhlYyBvdXJzZWxmIiBvbiBOT01NVS4gTm8gZmQgcmVkaXJlY3Rpb24sIG5vIHNldHNpZCgpLgorICogICAgICBPbiBNTVUgaWdub3JlcyBhcmd2LgorICoKKyAqIEhlbHBlciBmb3IgbmV0d29yayBkYWVtb25zIGluIGZvcmVncm91bmQgbW9kZToKKyAqCisgKiBiYl9zYW5pdGl6ZV9zdGRpbygpID0gbWFrZSBzdXJlIHRoYXQgZmQgMCwxLDIgYXJlIG9wZW5lZCBieSBvcGVuaW5nIHRoZW0KKyAqIHRvIC9kZXYvbnVsbCBpZiB0aGV5IGFyZSBub3QuCisgKi8KK2VudW0geworCURBRU1PTl9DSERJUl9ST09UID0gMSwKKwlEQUVNT05fREVWTlVMTF9TVERJTyA9IDIsCisJREFFTU9OX0NMT1NFX0VYVFJBX0ZEUyA9IDQsCisJREFFTU9OX09OTFlfU0FOSVRJWkUgPSA4LCAvKiBpbnRlcm5hbCB1c2UgKi8KKwlEQUVNT05fRE9VQkxFX0ZPUksgPSAxNiwgLyogZG91YmxlIGZvcmsgdG8gYXZvaWQgY29udHJvbGxpbmcgdHR5ICovCit9OworI2lmIEJCX01NVQorICBlbnVtIHsgcmVfZXhlY2VkID0gMCB9OworIyBkZWZpbmUgZm9ya19vcl9yZXhlYyhhcmd2KSAgICAgICAgICAgICAgICB4Zm9yaygpCisjIGRlZmluZSBiYl9kYWVtb25pemVfb3JfcmV4ZWMoZmxhZ3MsIGFyZ3YpIGJiX2RhZW1vbml6ZV9vcl9yZXhlYyhmbGFncykKKyMgZGVmaW5lIGJiX2RhZW1vbml6ZShmbGFncykgICAgICAgICAgICAgICAgYmJfZGFlbW9uaXplX29yX3JleGVjKGZsYWdzLCBib2d1cykKKyNlbHNlCisgIGV4dGVybiBib29sIHJlX2V4ZWNlZDsKKyAgLyogTm90ZTogcmVfZXhlYygpIGFuZCBmb3JrX29yX3JleGVjKCkgZG8gYXJndlswXVswXSB8PSAweDgwIG9uIE5PTU1VIQorICAgKiBfUGFyZW50XyBuZWVkcyB0byB1bmRvIGl0IGlmIGl0IGRvZXNuJ3Qgd2FudCB0byBoYXZlIGFyZ3ZbMF0gbWFuZ2xlZC4KKyAgICovCisgIHZvaWQgcmVfZXhlYyhjaGFyICoqYXJndikgTk9SRVRVUk4gRkFTVF9GVU5DOworICBwaWRfdCBmb3JrX29yX3JleGVjKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CisgIGludCAgQlVHX2ZvcmtfaXNfdW5hdmFpbGFibGVfb25fbm9tbXUodm9pZCkgRkFTVF9GVU5DOworICBpbnQgIEJVR19kYWVtb25faXNfdW5hdmFpbGFibGVfb25fbm9tbXUodm9pZCkgRkFTVF9GVU5DOworICB2b2lkIEJVR19iYl9kYWVtb25pemVfaXNfdW5hdmFpbGFibGVfb25fbm9tbXUodm9pZCkgRkFTVF9GVU5DOworIyBkZWZpbmUgZm9yaygpICAgICAgICAgIEJVR19mb3JrX2lzX3VuYXZhaWxhYmxlX29uX25vbW11KCkKKyMgZGVmaW5lIHhmb3JrKCkgICAgICAgICBCVUdfZm9ya19pc191bmF2YWlsYWJsZV9vbl9ub21tdSgpCisjIGRlZmluZSBkYWVtb24oYSxiKSAgICAgQlVHX2RhZW1vbl9pc191bmF2YWlsYWJsZV9vbl9ub21tdSgpCisjIGRlZmluZSBiYl9kYWVtb25pemUoYSkgQlVHX2JiX2RhZW1vbml6ZV9pc191bmF2YWlsYWJsZV9vbl9ub21tdSgpCisjZW5kaWYKK3ZvaWQgYmJfZGFlbW9uaXplX29yX3JleGVjKGludCBmbGFncywgY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3ZvaWQgYmJfc2FuaXRpemVfc3RkaW8odm9pZCkgRkFTVF9GVU5DOworLyogQ2xlYXIgZGFuZ2Vyb3VzIHN0dWZmLCBzZXQgUEFUSC4gUmV0dXJuIDEgaWYgd2FzIHJ1biBieSBkaWZmZXJlbnQgdXNlci4gKi8KK2ludCBzYW5pdGl6ZV9lbnZfaWZfc3VpZCh2b2lkKSBGQVNUX0ZVTkM7CisKKworY2hhciogc2luZ2xlX2FyZ3YoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK2V4dGVybiBjb25zdCBjaGFyICpjb25zdCBiYl9hcmd2X2Rhc2hbXTsgLyogIi0iLCBOVUxMICovCitleHRlcm4gY29uc3QgY2hhciAqb3B0X2NvbXBsZW1lbnRhcnk7CisjaWYgRU5BQkxFX0xPTkdfT1BUUyB8fCBFTkFCTEVfRkVBVFVSRV9HRVRPUFRfTE9ORworI2RlZmluZSBOb19hcmd1bWVudCAiXDAiCisjZGVmaW5lIFJlcXVpcmVkX2FyZ3VtZW50ICJcMDAxIgorI2RlZmluZSBPcHRpb25hbF9hcmd1bWVudCAiXDAwMiIKK2V4dGVybiBjb25zdCBjaGFyICphcHBsZXRfbG9uZ19vcHRpb25zOworI2VuZGlmCitleHRlcm4gdWludDMyX3Qgb3B0aW9uX21hc2szMjsKK2V4dGVybiB1aW50MzJfdCBnZXRvcHQzMihjaGFyICoqYXJndiwgY29uc3QgY2hhciAqYXBwbGV0X29wdHMsIC4uLikgRkFTVF9GVU5DOworCisKKy8qIEhhdmluZyBuZXh0IHBvaW50ZXIgYXMgYSBmaXJzdCBtZW1iZXIgYWxsb3dzIGVhc3kgY3JlYXRpb24KKyAqIG9mICJsbGlzdC1jb21wYXRpYmxlIiBzdHJ1Y3RzLCBhbmQgdXNpbmcgbGxpc3RfRk9PIGZ1bmN0aW9ucworICogb24gdGhlbS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgbGxpc3RfdCB7CisJc3RydWN0IGxsaXN0X3QgKmxpbms7CisJY2hhciAqZGF0YTsKK30gbGxpc3RfdDsKK3ZvaWQgbGxpc3RfYWRkX3RvKGxsaXN0X3QgKipvbGRfaGVhZCwgdm9pZCAqZGF0YSkgRkFTVF9GVU5DOwordm9pZCBsbGlzdF9hZGRfdG9fZW5kKGxsaXN0X3QgKipsaXN0X2hlYWQsIHZvaWQgKmRhdGEpIEZBU1RfRlVOQzsKK3ZvaWQgKmxsaXN0X3BvcChsbGlzdF90ICoqZWxtKSBGQVNUX0ZVTkM7Cit2b2lkIGxsaXN0X3VubGluayhsbGlzdF90ICoqaGVhZCwgbGxpc3RfdCAqZWxtKSBGQVNUX0ZVTkM7Cit2b2lkIGxsaXN0X2ZyZWUobGxpc3RfdCAqZWxtLCB2b2lkICgqZnJlZWl0KSh2b2lkICpkYXRhKSkgRkFTVF9GVU5DOworbGxpc3RfdCAqbGxpc3RfcmV2KGxsaXN0X3QgKmxpc3QpIEZBU1RfRlVOQzsKK2xsaXN0X3QgKmxsaXN0X2ZpbmRfc3RyKGxsaXN0X3QgKmZpcnN0LCBjb25zdCBjaGFyICpzdHIpIEZBU1RfRlVOQzsKKy8qIEJUVywgc3VycHJpc2luZ2x5LCBjaGFuZ2luZyBBUEkgdG8KKyAqICAgbGxpc3RfdCAqbGxpc3RfYWRkX3RvKGxsaXN0X3QgKm9sZF9oZWFkLCB2b2lkICpkYXRhKQorICogZXRjIGRvZXMgbm90IHJlc3VsdCBpbiBzbWFsbGVyIGNvZGUuLi4gKi8KKworLyogc3RhcnRfc3RvcF9kYWVtb24gYW5kIHVkaGNwYyBhcmUgc3BlY2lhbCAtIHRoZXkgd2FudAorICogdG8gY3JlYXRlIHBpZGZpbGVzIHJlZ2FyZGxlc3Mgb2YgRkVBVFVSRV9QSURGSUxFICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfUElERklMRSB8fCBkZWZpbmVkKFdBTlRfUElERklMRSkKKy8qIFRydWUgb25seSBpZiB3ZSBjcmVhdGVkIHBpZGZpbGUgd2hpY2ggaXMgKmZpbGUqLCBub3QgL2Rldi9udWxsIGV0YyAqLworZXh0ZXJuIHNtYWxsaW50IHdyb3RlX3BpZGZpbGU7Cit2b2lkIHdyaXRlX3BpZGZpbGUoY29uc3QgY2hhciAqcGF0aCkgRkFTVF9GVU5DOworI2RlZmluZSByZW1vdmVfcGlkZmlsZShwYXRoKSBkbyB7IGlmICh3cm90ZV9waWRmaWxlKSB1bmxpbmsocGF0aCk7IH0gd2hpbGUgKDApCisjZWxzZQorZW51bSB7IHdyb3RlX3BpZGZpbGUgPSAwIH07CisjZGVmaW5lIHdyaXRlX3BpZGZpbGUocGF0aCkgICgodm9pZCkwKQorI2RlZmluZSByZW1vdmVfcGlkZmlsZShwYXRoKSAoKHZvaWQpMCkKKyNlbmRpZgorCitlbnVtIHsKKwlMT0dNT0RFX05PTkUgPSAwLAorCUxPR01PREVfU1RESU8gPSAoMSA8PCAwKSwKKwlMT0dNT0RFX1NZU0xPRyA9ICgxIDw8IDEpICogRU5BQkxFX0ZFQVRVUkVfU1lTTE9HLAorCUxPR01PREVfQk9USCA9IExPR01PREVfU1lTTE9HICsgTE9HTU9ERV9TVERJTywKK307CitleHRlcm4gY29uc3QgY2hhciAqbXNnX2VvbDsKK2V4dGVybiBzbWFsbGludCBzeXNsb2dfbGV2ZWw7CitleHRlcm4gc21hbGxpbnQgbG9nbW9kZTsKK2V4dGVybiB1aW50OF90IHhmdW5jX2Vycm9yX3JldHZhbDsKK2V4dGVybiB2b2lkICgqZGllX2Z1bmMpKHZvaWQpOworZXh0ZXJuIHZvaWQgeGZ1bmNfZGllKHZvaWQpIE5PUkVUVVJOIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIGJiX3Nob3dfdXNhZ2Uodm9pZCkgTk9SRVRVUk4gRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgYmJfZXJyb3JfbXNnKGNvbnN0IGNoYXIgKnMsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIGJiX2Vycm9yX21zZ19hbmRfZGllKGNvbnN0IGNoYXIgKnMsIC4uLikgX19hdHRyaWJ1dGVfXyAoKG5vcmV0dXJuLCBmb3JtYXQgKHByaW50ZiwgMSwgMikpKSBGQVNUX0ZVTkM7CitleHRlcm4gdm9pZCBiYl9wZXJyb3JfbXNnKGNvbnN0IGNoYXIgKnMsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIGJiX3NpbXBsZV9wZXJyb3JfbXNnKGNvbnN0IGNoYXIgKnMpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIGJiX3BlcnJvcl9tc2dfYW5kX2RpZShjb25zdCBjaGFyICpzLCAuLi4pIF9fYXR0cmlidXRlX18gKChub3JldHVybiwgZm9ybWF0IChwcmludGYsIDEsIDIpKSkgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShjb25zdCBjaGFyICpzKSBOT1JFVFVSTiBGQVNUX0ZVTkM7CitleHRlcm4gdm9pZCBiYl9oZXJyb3JfbXNnKGNvbnN0IGNoYXIgKnMsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIGJiX2hlcnJvcl9tc2dfYW5kX2RpZShjb25zdCBjaGFyICpzLCAuLi4pIF9fYXR0cmlidXRlX18gKChub3JldHVybiwgZm9ybWF0IChwcmludGYsIDEsIDIpKSkgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgYmJfcGVycm9yX25vbXNnX2FuZF9kaWUodm9pZCkgTk9SRVRVUk4gRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgYmJfcGVycm9yX25vbXNnKHZvaWQpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIGJiX2luZm9fbXNnKGNvbnN0IGNoYXIgKnMsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIGJiX3ZlcnJvcl9tc2coY29uc3QgY2hhciAqcywgdmFfbGlzdCBwLCBjb25zdCBjaGFyICpzdHJlcnIpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIGJiX2xvZ2Vudl9vdmVycmlkZSh2b2lkKSBGQVNUX0ZVTkM7CisKKy8qIFdlIG5lZWQgdG8gZXhwb3J0IFhYWF9tYWluIGZyb20gbGliYnVzeWJveAorICogb25seSBpZiB3ZSBidWlsZCAiaW5kaXZpZHVhbCIgYmluYXJpZXMKKyAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0lORElWSURVQUwKKyNkZWZpbmUgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEUgRVhURVJOQUxMWV9WSVNJQkxFCisjZWxzZQorI2RlZmluZSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRQorI2VuZGlmCisKKworLyogQXBwbGV0cyB3aGljaCBhcmUgdXNlZnVsIGZyb20gYW5vdGhlciBhcHBsZXRzICovCitpbnQgYmJfY2F0KGNoYXIqKiBhcmd2KTsKKy8qIElmIHNoZWxsIG5lZWRzIHRoZW0sIHRoZXkgZXhpc3QgZXZlbiBpZiBub3QgZW5hYmxlZCBhcyBhcHBsZXRzICovCitpbnQgZWNob19tYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgSUZfRUNITyhNQUlOX0VYVEVSTkFMTFlfVklTSUJMRSk7CitpbnQgcHJpbnRmX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBJRl9QUklOVEYoTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEUpOworaW50IHRlc3RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIElGX1RFU1QoTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEUpOworaW50IGtpbGxfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIElGX0tJTEwoTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEUpOworLyogU2ltaWxhciwgYnV0IHVzZWQgYnkgY2hncnAsIG5vdCBzaGVsbCAqLworaW50IGNob3duX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBJRl9DSE9XTihNQUlOX0VYVEVSTkFMTFlfVklTSUJMRSk7CisvKiBVc2VkIGJ5IGZ0cGQgKi8KK2ludCBsc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgSUZfTFMoTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEUpOworLyogRG9uJ3QgbmVlZCBJRl94eHgoKSBndWFyZCBmb3IgdGhlc2UgKi8KK2ludCBndW56aXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGJ1bnppcDJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworCisjaWYgRU5BQkxFX1JPVVRFCit2b2lkIGJiX2Rpc3BsYXlyb3V0ZXMoaW50IG5vcmVzb2x2ZSwgaW50IG5ldHN0YXRmbXQpIEZBU1RfRlVOQzsKKyNlbmRpZgorCisKKy8qIE5ldHdvcmtpbmcgKi8KKy8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgcHJvdG9jb2wgZmFtaWxpZXMgYW5kIHRoZWlyIGhhbmRsZXJzLiAqLworc3RydWN0IGFmdHlwZSB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICp0aXRsZTsKKwlpbnQgYWY7CisJaW50IGFsZW47CisJY2hhciogICAgICAgRkFTVF9GVU5DICgqcHJpbnQpKHVuc2lnbmVkIGNoYXIgKik7CisJY29uc3QgY2hhciogRkFTVF9GVU5DICgqc3ByaW50KShzdHJ1Y3Qgc29ja2FkZHIgKiwgaW50IG51bWVyaWMpOworCWludCAgICAgICAgIEZBU1RfRlVOQyAoKmlucHV0KSgvKmludCB0eXBlLCovIGNvbnN0IGNoYXIgKmJ1ZnAsIHN0cnVjdCBzb2NrYWRkciAqKTsKKwl2b2lkICAgICAgICBGQVNUX0ZVTkMgKCpoZXJyb3IpKGNoYXIgKnRleHQpOworCWludCAgICAgICAgIEZBU1RfRlVOQyAoKnJwcmludCkoaW50IG9wdGlvbnMpOworCWludCAgICAgICAgIEZBU1RfRlVOQyAoKnJpbnB1dCkoaW50IHR5cCwgaW50IGV4dCwgY2hhciAqKmFyZ3YpOworCS8qIG1heSBtb2RpZnkgc3JjICovCisJaW50ICAgICAgICAgRkFTVF9GVU5DICgqZ2V0bWFzaykoY2hhciAqc3JjLCBzdHJ1Y3Qgc29ja2FkZHIgKm1hc2ssIGNoYXIgKm5hbWUpOworfTsKKy8qIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgaGFyZHdhcmUgcHJvdG9jb2xzIGFuZCB0aGVpciBoYW5kbGVycy4gKi8KK3N0cnVjdCBod3R5cGUgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqdGl0bGU7CisJaW50IHR5cGU7CisJaW50IGFsZW47CisJY2hhciogRkFTVF9GVU5DICgqcHJpbnQpKHVuc2lnbmVkIGNoYXIgKik7CisJaW50ICAgRkFTVF9GVU5DICgqaW5wdXQpKGNvbnN0IGNoYXIgKiwgc3RydWN0IHNvY2thZGRyICopOworCWludCAgIEZBU1RfRlVOQyAoKmFjdGl2YXRlKShpbnQgZmQpOworCWludCBzdXBwcmVzc19udWxsX2FkZHI7Cit9OworZXh0ZXJuIHNtYWxsaW50IGludGVyZmFjZV9vcHRfYTsKK2ludCBkaXNwbGF5X2ludGVyZmFjZXMoY2hhciAqaWZuYW1lKSBGQVNUX0ZVTkM7CitpbnQgaW5fZXRoZXIoY29uc3QgY2hhciAqYnVmcCwgc3RydWN0IHNvY2thZGRyICpzYXApIEZBU1RfRlVOQzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9IV0lCCitpbnQgaW5faWIoY29uc3QgY2hhciAqYnVmcCwgc3RydWN0IHNvY2thZGRyICpzYXApIEZBU1RfRlVOQzsKKyNlbHNlCisjZGVmaW5lIGluX2liKGEsIGIpIDEgLyogZmFpbCAqLworI2VuZGlmCitjb25zdCBzdHJ1Y3QgYWZ0eXBlICpnZXRfYWZ0eXBlKGNvbnN0IGNoYXIgKm5hbWUpIEZBU1RfRlVOQzsKK2NvbnN0IHN0cnVjdCBod3R5cGUgKmdldF9od3R5cGUoY29uc3QgY2hhciAqbmFtZSkgRkFTVF9GVU5DOworY29uc3Qgc3RydWN0IGh3dHlwZSAqZ2V0X2h3bnR5cGUoaW50IHR5cGUpIEZBU1RfRlVOQzsKKworCisjaWZuZGVmIEJVSUxEX0lORElWSURVQUwKK2V4dGVybiBpbnQgZmluZF9hcHBsZXRfYnlfbmFtZShjb25zdCBjaGFyICpuYW1lKSBGQVNUX0ZVTkM7CisvKiBSZXR1cm5zIG9ubHkgaWYgYXBwbGV0IGlzIG5vdCBmb3VuZC4gKi8KK2V4dGVybiB2b2lkIHJ1bl9hcHBsZXRfYW5kX2V4aXQoY29uc3QgY2hhciAqbmFtZSwgY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIHJ1bl9hcHBsZXRfbm9fYW5kX2V4aXQoaW50IGEsIGNoYXIgKiphcmd2KSBOT1JFVFVSTiBGQVNUX0ZVTkM7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfTU5URU5UX0gKK2V4dGVybiBpbnQgbWF0Y2hfZnN0eXBlKGNvbnN0IHN0cnVjdCBtbnRlbnQgKm10LCBjb25zdCBjaGFyICpmc3R5cGVzKSBGQVNUX0ZVTkM7CitleHRlcm4gc3RydWN0IG1udGVudCAqZmluZF9tb3VudF9wb2ludChjb25zdCBjaGFyICpuYW1lLCBpbnQgc3ViZGlyX3RvbykgRkFTVF9GVU5DOworI2VuZGlmCitleHRlcm4gdm9pZCBlcmFzZV9tdGFiKGNvbnN0IGNoYXIgKiBuYW1lKSBGQVNUX0ZVTkM7CitleHRlcm4gdW5zaWduZWQgaW50IHR0eV9iYXVkX3RvX3ZhbHVlKHNwZWVkX3Qgc3BlZWQpIEZBU1RfRlVOQzsKK2V4dGVybiBzcGVlZF90IHR0eV92YWx1ZV90b19iYXVkKHVuc2lnbmVkIGludCB2YWx1ZSkgRkFTVF9GVU5DOworI2lmIEVOQUJMRV9ERVNLVE9QCitleHRlcm4gdm9pZCBiYl93YXJuX2lnbm9yaW5nX2FyZ3MoY2hhciAqYXJnKSBGQVNUX0ZVTkM7CisjZWxzZQorIyBkZWZpbmUgYmJfd2Fybl9pZ25vcmluZ19hcmdzKGFyZykgKCh2b2lkKTApCisjZW5kaWYKKworZXh0ZXJuIGludCBnZXRfbGludXhfdmVyc2lvbl9jb2RlKHZvaWQpIEZBU1RfRlVOQzsKKworZXh0ZXJuIGNoYXIgKnF1ZXJ5X2xvb3AoY29uc3QgY2hhciAqZGV2aWNlKSBGQVNUX0ZVTkM7CitleHRlcm4gaW50IGRlbF9sb29wKGNvbnN0IGNoYXIgKmRldmljZSkgRkFTVF9GVU5DOworLyogSWYgKmRldm5hbWUgaXMgbm90IE5VTEwsIHVzZSB0aGF0IG5hbWUsIG90aGVyd2lzZSB0cnkgdG8gZmluZCBmcmVlIG9uZSwKKyAqIG1hbGxvYyBhbmQgcmV0dXJuIGl0IGluICpkZXZuYW1lLgorICogcmV0dXJuIHZhbHVlOiAxOiByZWFkLW9ubHkgbG9vcGRldiB3YXMgc2V0dXAsIDA6IHJ3LCA8IDA6IGVycm9yICovCitleHRlcm4gaW50IHNldF9sb29wKGNoYXIgKipkZXZuYW1lLCBjb25zdCBjaGFyICpmaWxlLCB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0LCBpbnQgcm8pIEZBU1RfRlVOQzsKKworLyogTGlrZSBiYl9hc2sgYmVsb3csIGJ1dCBhc2tzIG9uIHN0ZGluIHdpdGggbm8gdGltZW91dC4gICovCitjaGFyICpiYl9hc2tfc3RkaW4oY29uc3QgY2hhciAqIHByb21wdCkgRkFTVF9GVU5DOworLy9UT0RPOiBwYXNzIGJ1ZiBwb2ludGVyIG9yIHJldHVybiBhbGxvY2F0ZWQgYnVmIChhdm9pZCBzdGF0aWNzKT8KK2NoYXIgKmJiX2Fzayhjb25zdCBpbnQgZmQsIGludCB0aW1lb3V0LCBjb25zdCBjaGFyICogcHJvbXB0KSBGQVNUX0ZVTkM7CitpbnQgYmJfYXNrX2NvbmZpcm1hdGlvbih2b2lkKSBGQVNUX0ZVTkM7CisKKy8qIFJldHVybnMgLTEgaWYgaW5wdXQgaXMgaW52YWxpZC4gY3VycmVudF9tb2RlIGlzIGEgYmFzZSBmb3IgZS5nLiAidStydyIgKi8KK2ludCBiYl9wYXJzZV9tb2RlKGNvbnN0IGNoYXIqIHMsIHVuc2lnbmVkIGN1cl9tb2RlKSBGQVNUX0ZVTkM7CisKKy8qCisgKiBDb25maWcgZmlsZSBwYXJzZXIKKyAqLworZW51bSB7CisJUEFSU0VfQ09MTEFQU0UgID0gMHgwMDAxMDAwMCwgLy8gdHJlYXQgY29uc2VjdXRpdmUgZGVsaW1pdGVycyBhcyBvbmUKKwlQQVJTRV9UUklNICAgICAgPSAweDAwMDIwMDAwLCAvLyB0cmltIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGRlbGltaXRlcnMKKy8vIFRPRE86IENPTExBUFNFIGFuZCBUUklNIHNlZW0gdG8gYWx3YXlzIGdvIGluIHBhaXIKKwlQQVJTRV9HUkVFRFkgICAgPSAweDAwMDQwMDAwLCAvLyBsYXN0IHRva2VuIHRha2VzIGVudGlyZSByZW1haW5kZXIgb2YgdGhlIGxpbmUKKwlQQVJTRV9NSU5fRElFICAgPSAweDAwMTAwMDAwLCAvLyBkaWUgaWYgPCBtaW4gdG9rZW5zIGZvdW5kCisJLy8ga2VlcCBhIGNvcHkgb2YgY3VycmVudCBsaW5lCisJUEFSU0VfS0VFUF9DT1BZID0gMHgwMDIwMDAwMCAqIEVOQUJMRV9GRUFUVVJFX0NST05EX0QsCisJUEFSU0VfRU9MX0NPTU1FTlRTID0gMHgwMDQwMDAwMCwgLy8gY29tbWVudHMgYXJlIHJlY29nbml6ZWQgZXZlbiBpZiB0aGV5IGFyZW4ndCB0aGUgZmlyc3QgY2hhcgorCS8vIE5PUk1BTCBpczoKKwkvLyAqIHJlbW92ZSBsZWFkaW5nIGFuZCB0cmFpbGluZyBkZWxpbWl0ZXJzIGFuZCBjb2xsYXBzZQorCS8vICAgbXVsdGlwbGUgZGVsaW1pdGVycyBpbnRvIG9uZQorCS8vICogd2FybiBhbmQgY29udGludWUgaWYgbGVzcyB0aGFuIG1pbnRva2VucyBkZWxpbWl0ZXJzIGZvdW5kCisJLy8gKiBncmFiIGV2ZXJ5dGhpbmcgaW50byBsYXN0IHRva2VuCisJLy8gKiBjb21tZW50cyBhcmUgcmVjb2duaXplZCBldmVuIGlmIHRoZXkgYXJlbid0IHRoZSBmaXJzdCBjaGFyCisJUEFSU0VfTk9STUFMICAgID0gUEFSU0VfQ09MTEFQU0UgfCBQQVJTRV9UUklNIHwgUEFSU0VfR1JFRURZIHwgUEFSU0VfRU9MX0NPTU1FTlRTLAorfTsKK3R5cGVkZWYgc3RydWN0IHBhcnNlcl90IHsKKwlGSUxFICpmcDsKKwljaGFyICpkYXRhOworCWNoYXIgKmxpbmUsICpubGluZTsKKwlzaXplX3QgbGluZV9hbGxvYywgbmxpbmVfYWxsb2M7CisJaW50IGxpbmVubzsKK30gcGFyc2VyX3Q7CitwYXJzZXJfdCogY29uZmlnX29wZW4oY29uc3QgY2hhciAqZmlsZW5hbWUpIEZBU1RfRlVOQzsKK3BhcnNlcl90KiBjb25maWdfb3BlbjIoY29uc3QgY2hhciAqZmlsZW5hbWUsIEZJTEUqIEZBU1RfRlVOQyAoKmZvcGVuX2Z1bmMpKGNvbnN0IGNoYXIgKnBhdGgpKSBGQVNUX0ZVTkM7CisvKiBkZWxpbXNbMF0gaXMgYSBjb21tZW50IGNoYXIgKHVzZSAnXDAnIHRvIGRpc2FibGUpLCB0aGUgcmVzdCBhcmUgdG9rZW4gZGVsaW1pdGVycyAqLworaW50IGNvbmZpZ19yZWFkKHBhcnNlcl90ICpwYXJzZXIsIGNoYXIgKip0b2tlbnMsIHVuc2lnbmVkIGZsYWdzLCBjb25zdCBjaGFyICpkZWxpbXMpIEZBU1RfRlVOQzsKKyNkZWZpbmUgY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbnMsIG1heCwgbWluLCBzdHIsIGZsYWdzKSBcCisJY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbnMsICgoZmxhZ3MpIHwgKCgobWluKSAmIDB4RkYpIDw8IDgpIHwgKChtYXgpICYgMHhGRikpLCBzdHIpCit2b2lkIGNvbmZpZ19jbG9zZShwYXJzZXJfdCAqcGFyc2VyKSBGQVNUX0ZVTkM7CisKKy8qIENvbmNhdGVuYXRlIHBhdGggYW5kIGZpbGVuYW1lIHRvIG5ldyBhbGxvY2F0ZWQgYnVmZmVyLgorICogQWRkICIvIiBvbmx5IGFzIG5lZWRlZCAobm8gZHVwbGljYXRlICIvLyIgYXJlIHByb2R1Y2VkKS4KKyAqIElmIHBhdGggaXMgTlVMTCwgaXQgaXMgYXNzdW1lZCB0byBiZSAiLyIuCisgKiBmaWxlbmFtZSBzaG91bGQgbm90IGJlIE5VTEwuICovCitjaGFyICpjb25jYXRfcGF0aF9maWxlKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmZpbGVuYW1lKSBGQVNUX0ZVTkM7CisvKiBSZXR1cm5zIE5VTEwgb24gLiBhbmQgLi4gKi8KK2NoYXIgKmNvbmNhdF9zdWJwYXRoX2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqZmlsZW5hbWUpIEZBU1RfRlVOQzsKKworCitpbnQgYmJfbWFrZV9kaXJlY3RvcnkoY2hhciAqcGF0aCwgbG9uZyBtb2RlLCBpbnQgZmxhZ3MpIEZBU1RfRlVOQzsKKworaW50IGdldF9zaWdudW0oY29uc3QgY2hhciAqbmFtZSkgRkFTVF9GVU5DOworY29uc3QgY2hhciAqZ2V0X3NpZ25hbWUoaW50IG51bWJlcikgRkFTVF9GVU5DOwordm9pZCBwcmludF9zaWduYW1lcyh2b2lkKSBGQVNUX0ZVTkM7CisKK2NoYXIgKmJiX3NpbXBsaWZ5X3BhdGgoY29uc3QgY2hhciAqcGF0aCkgRkFTVF9GVU5DOworLyogUmV0dXJucyBwdHIgdG8gTlVMICovCitjaGFyICpiYl9zaW1wbGlmeV9hYnNfcGF0aF9pbnBsYWNlKGNoYXIgKnBhdGgpIEZBU1RfRlVOQzsKKworI2lmbmRlZiBMT0dJTl9GQUlMX0RFTEFZCisjZGVmaW5lIExPR0lOX0ZBSUxfREVMQVkgMworI2VuZGlmCitleHRlcm4gdm9pZCBiYl9kb19kZWxheShpbnQgc2Vjb25kcykgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgY2hhbmdlX2lkZW50aXR5KGNvbnN0IHN0cnVjdCBwYXNzd2QgKnB3KSBGQVNUX0ZVTkM7CitleHRlcm4gdm9pZCBydW5fc2hlbGwoY29uc3QgY2hhciAqc2hlbGwsIGludCBsb2dpbnNoZWxsLCBjb25zdCBjaGFyICpjb21tYW5kLCBjb25zdCBjaGFyICoqYWRkaXRpb25hbF9hcmdzKSBOT1JFVFVSTiBGQVNUX0ZVTkM7CisKKy8qIFJldHVybnMgJFNIRUxMLCBnZXRwd3VpZChnZXR1aWQoKSktPnB3X3NoZWxsLCBvciBERUZBVUxUX1NIRUxMLgorICogTm90ZSB0aGF0IGdldHB3dWlkIHJlc3VsdCBtaWdodCBuZWVkIHhzdHJkdXAnaW5nCisgKiBpZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IG9mIGludGVydmVuaW5nIGdldHB3eHh4KCkgY2FsbHMuCisgKi8KK2NvbnN0IGNoYXIgKmdldF9zaGVsbF9uYW1lKHZvaWQpIEZBU1RfRlVOQzsKKworI2lmIEVOQUJMRV9TRUxJTlVYCitleHRlcm4gdm9pZCByZW5ld19jdXJyZW50X3NlY3VyaXR5X2NvbnRleHQodm9pZCkgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgc2V0X2N1cnJlbnRfc2VjdXJpdHlfY29udGV4dChzZWN1cml0eV9jb250ZXh0X3Qgc2lkKSBGQVNUX0ZVTkM7CitleHRlcm4gY29udGV4dF90IHNldF9zZWN1cml0eV9jb250ZXh0X2NvbXBvbmVudChzZWN1cml0eV9jb250ZXh0X3QgY3VyX2NvbnRleHQsCisJCQkJCQljaGFyICp1c2VyLCBjaGFyICpyb2xlLCBjaGFyICp0eXBlLCBjaGFyICpyYW5nZSkgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgc2V0ZnNjcmVhdGVjb25fb3JfZGllKHNlY3VyaXR5X2NvbnRleHRfdCBzY29udGV4dCkgRkFTVF9GVU5DOworZXh0ZXJuIHZvaWQgc2VsaW51eF9wcmVzZXJ2ZV9mY29udGV4dChpbnQgZmRlc2MpIEZBU1RfRlVOQzsKKyNlbHNlCisjZGVmaW5lIHNlbGludXhfcHJlc2VydmVfZmNvbnRleHQoZmRlc2MpICgodm9pZCkwKQorI2VuZGlmCitleHRlcm4gdm9pZCBzZWxpbnV4X29yX2RpZSh2b2lkKSBGQVNUX0ZVTkM7CisKKworLyogc3lzdGVtZCBzdXBwb3J0ICovCisjZGVmaW5lIFNEX0xJU1RFTl9GRFNfU1RBUlQgMworaW50IHNkX2xpc3Rlbl9mZHModm9pZCk7CisKKworLyogc2V0dXBfZW52aXJvbm1lbnQ6CisgKiBpZiBjaGRpciBwdy0+cHdfZGlyOiBvazogZWxzZSBpZiB0b190bXAgPT0gMTogZ290byAvdG1wIGVsc2U6IGdvdG8gLyBvciBkaWUKKyAqIGlmIGNsZWFyX2VudiA9IDE6IGNkKHB3LT5wd19kaXIpLCBjbGVhciBlbnZpcm9ubWVudCwgdGhlbiBzZXQKKyAqICAgVEVSTT0ob2xkIHZhbHVlKQorICogICBVU0VSPXB3LT5wd19uYW1lLCBMT0dOQU1FPXB3LT5wd19uYW1lCisgKiAgIFBBVEg9YmJfZGVmYXVsdF9bcm9vdF9dcGF0aAorICogICBIT01FPXB3LT5wd19kaXIKKyAqICAgU0hFTEw9c2hlbGwKKyAqIGVsc2UgaWYgY2hhbmdlX2VudiA9IDE6CisgKiAgIGlmIG5vdCByb290IChpZiBwdy0+cHdfdWlkICE9IDApOgorICogICAgIFVTRVI9cHctPnB3X25hbWUsIExPR05BTUU9cHctPnB3X25hbWUKKyAqICAgSE9NRT1wdy0+cHdfZGlyCisgKiAgIFNIRUxMPXNoZWxsCisgKiBlbHNlIGRvZXMgbm90aGluZworICovCisjZGVmaW5lIFNFVFVQX0VOVl9DSEFOR0VFTlYgKDEgPDwgMCkKKyNkZWZpbmUgU0VUVVBfRU5WX0NMRUFSRU5WICAoMSA8PCAxKQorI2RlZmluZSBTRVRVUF9FTlZfVE9fVE1QICAgICgxIDw8IDIpCisjZGVmaW5lIFNFVFVQX0VOVl9OT19DSERJUiAgKDEgPDwgNCkKK3ZvaWQgc2V0dXBfZW52aXJvbm1lbnQoY29uc3QgY2hhciAqc2hlbGwsIGludCBmbGFncywgY29uc3Qgc3RydWN0IHBhc3N3ZCAqcHcpIEZBU1RfRlVOQzsKK3ZvaWQgbnVrZV9zdHIoY2hhciAqc3RyKSBGQVNUX0ZVTkM7CitpbnQgY2hlY2tfcGFzc3dvcmQoY29uc3Qgc3RydWN0IHBhc3N3ZCAqcHcsIGNvbnN0IGNoYXIgKnBsYWludGV4dCkgRkFTVF9GVU5DOworaW50IGFza19hbmRfY2hlY2tfcGFzc3dvcmRfZXh0ZW5kZWQoY29uc3Qgc3RydWN0IHBhc3N3ZCAqcHcsIGludCB0aW1lb3V0LCBjb25zdCBjaGFyICpwcm9tcHQpIEZBU1RfRlVOQzsKK2ludCBhc2tfYW5kX2NoZWNrX3Bhc3N3b3JkKGNvbnN0IHN0cnVjdCBwYXNzd2QgKnB3KSBGQVNUX0ZVTkM7CisvKiBSZXR1cm5zIGEgbWFsbG9jZWQgc3RyaW5nICovCisjaWYgIUVOQUJMRV9VU0VfQkJfQ1JZUFQKKyNkZWZpbmUgcHdfZW5jcnlwdChjbGVhciwgc2FsdCwgY2xlYW51cCkgcHdfZW5jcnlwdChjbGVhciwgc2FsdCkKKyNlbmRpZgorZXh0ZXJuIGNoYXIgKnB3X2VuY3J5cHQoY29uc3QgY2hhciAqY2xlYXIsIGNvbnN0IGNoYXIgKnNhbHQsIGludCBjbGVhbnVwKSBGQVNUX0ZVTkM7CitleHRlcm4gaW50IG9ic2N1cmUoY29uc3QgY2hhciAqb2xkLCBjb25zdCBjaGFyICpuZXd2YWwsIGNvbnN0IHN0cnVjdCBwYXNzd2QgKnB3ZHApIEZBU1RfRlVOQzsKKy8qCisgKiBybmQgaXMgYWRkaXRpb25hbCByYW5kb20gaW5wdXQuIE5ldyBvbmUgaXMgcmV0dXJuZWQuCisgKiBVc2VmdWwgaWYgeW91IGNhbGwgY3J5cHRfbWFrZV9zYWx0IG1hbnkgdGltZXMgaW4gYSByb3c6CisgKiBybmQgPSBjcnlwdF9tYWtlX3NhbHQoYnVmMSwgNCwgMCk7CisgKiBybmQgPSBjcnlwdF9tYWtlX3NhbHQoYnVmMiwgNCwgcm5kKTsKKyAqIHJuZCA9IGNyeXB0X21ha2Vfc2FsdChidWYzLCA0LCBybmQpOworICogKG90aGVyd2lzZSB3ZSByaXNrIGhhdmluZyBzYW1lIHNhbHQgZ2VuZXJhdGVkKQorICovCitleHRlcm4gaW50IGNyeXB0X21ha2Vfc2FsdChjaGFyICpwLCBpbnQgY250IC8qLCBpbnQgcm5kKi8pIEZBU1RfRlVOQzsKKy8qICIkTiQiICsgc2hhX3NhbHRfMTZfYnl0ZXMgKyBOVUwgKi8KKyNkZWZpbmUgTUFYX1BXX1NBTFRfTEVOICgzICsgMTYgKyAxKQorZXh0ZXJuIGNoYXIqIGNyeXB0X21ha2VfcHdfc2FsdChjaGFyIHBbTUFYX1BXX1NBTFRfTEVOXSwgY29uc3QgY2hhciAqYWxnbykgRkFTVF9GVU5DOworCisKKy8qIFJldHVybnMgbnVtYmVyIG9mIGxpbmVzIGNoYW5nZWQsIG9yIC0xIG9uIGVycm9yICovCisjaWYgIShFTkFCTEVfRkVBVFVSRV9BRERVU0VSX1RPX0dST1VQIHx8IEVOQUJMRV9GRUFUVVJFX0RFTF9VU0VSX0ZST01fR1JPVVApCisjZGVmaW5lIHVwZGF0ZV9wYXNzd2QoZmlsZW5hbWUsIHVzZXJuYW1lLCBkYXRhLCBtZW1iZXIpIFwKKwl1cGRhdGVfcGFzc3dkKGZpbGVuYW1lLCB1c2VybmFtZSwgZGF0YSkKKyNlbmRpZgorZXh0ZXJuIGludCB1cGRhdGVfcGFzc3dkKGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQljb25zdCBjaGFyICp1c2VybmFtZSwKKwkJY29uc3QgY2hhciAqZGF0YSwKKwkJY29uc3QgY2hhciAqbWVtYmVyKSBGQVNUX0ZVTkM7CisKK2ludCBpbmRleF9pbl9zdHJfYXJyYXkoY29uc3QgY2hhciAqY29uc3Qgc3RyaW5nX2FycmF5W10sIGNvbnN0IGNoYXIgKmtleSkgRkFTVF9GVU5DOworaW50IGluZGV4X2luX3N0cmluZ3MoY29uc3QgY2hhciAqc3RyaW5ncywgY29uc3QgY2hhciAqa2V5KSBGQVNUX0ZVTkM7CitpbnQgaW5kZXhfaW5fc3Vic3RyX2FycmF5KGNvbnN0IGNoYXIgKmNvbnN0IHN0cmluZ19hcnJheVtdLCBjb25zdCBjaGFyICprZXkpIEZBU1RfRlVOQzsKK2ludCBpbmRleF9pbl9zdWJzdHJpbmdzKGNvbnN0IGNoYXIgKnN0cmluZ3MsIGNvbnN0IGNoYXIgKmtleSkgRkFTVF9GVU5DOworY29uc3QgY2hhciAqbnRoX3N0cmluZyhjb25zdCBjaGFyICpzdHJpbmdzLCBpbnQgbikgRkFTVF9GVU5DOworCitleHRlcm4gdm9pZCBwcmludF9sb2dpbl9pc3N1ZShjb25zdCBjaGFyICppc3N1ZV9maWxlLCBjb25zdCBjaGFyICp0dHkpIEZBU1RfRlVOQzsKK2V4dGVybiB2b2lkIHByaW50X2xvZ2luX3Byb21wdCh2b2lkKSBGQVNUX0ZVTkM7CisKK2NoYXIgKnhtYWxsb2NfdHR5bmFtZShpbnQgZmQpIEZBU1RfRlVOQyBSRVRVUk5TX01BTExPQzsKKy8qIE5COiB0eXBpY2FsbHkgeW91IHdhbnQgdG8gcGFzcyBmZCAwLCBub3QgMS4gVGhpbmsgJ2FwcGxldCB8IGdyZXAgc29tZXRoaW5nJyAqLworaW50IGdldF90ZXJtaW5hbF93aWR0aF9oZWlnaHQoaW50IGZkLCB1bnNpZ25lZCAqd2lkdGgsIHVuc2lnbmVkICpoZWlnaHQpIEZBU1RfRlVOQzsKKworaW50IHRjc2V0YXR0cl9zdGRpbl9UQ1NBTk9XKGNvbnN0IHN0cnVjdCB0ZXJtaW9zICp0cCkgRkFTVF9GVU5DOworCisvKiBOQjogInVuc2lnbmVkIHJlcXVlc3QiIGlzIGNydWNpYWwhICJpbnQgcmVxdWVzdCIgd2lsbCBicmVhayBzb21lIGFyY2hlcyEgKi8KK2ludCBpb2N0bF9vcl9wZXJyb3IoaW50IGZkLCB1bnNpZ25lZCByZXF1ZXN0LCB2b2lkICphcmdwLCBjb25zdCBjaGFyICpmbXQsLi4uKSBfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDQsIDUpKSkgRkFTVF9GVU5DOworaW50IGlvY3RsX29yX3BlcnJvcl9hbmRfZGllKGludCBmZCwgdW5zaWduZWQgcmVxdWVzdCwgdm9pZCAqYXJncCwgY29uc3QgY2hhciAqZm10LC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA0LCA1KSkpIEZBU1RfRlVOQzsKKyNpZiBFTkFCTEVfSU9DVExfSEVYMlNUUl9FUlJPUgoraW50IGJiX2lvY3RsX29yX3dhcm4oaW50IGZkLCB1bnNpZ25lZCByZXF1ZXN0LCB2b2lkICphcmdwLCBjb25zdCBjaGFyICppb2N0bF9uYW1lKSBGQVNUX0ZVTkM7CitpbnQgYmJfeGlvY3RsKGludCBmZCwgdW5zaWduZWQgcmVxdWVzdCwgdm9pZCAqYXJncCwgY29uc3QgY2hhciAqaW9jdGxfbmFtZSkgRkFTVF9GVU5DOworI2RlZmluZSBpb2N0bF9vcl93YXJuKGZkLHJlcXVlc3QsYXJncCkgYmJfaW9jdGxfb3Jfd2FybihmZCxyZXF1ZXN0LGFyZ3AsI3JlcXVlc3QpCisjZGVmaW5lIHhpb2N0bChmZCxyZXF1ZXN0LGFyZ3ApICAgICAgICBiYl94aW9jdGwoZmQscmVxdWVzdCxhcmdwLCNyZXF1ZXN0KQorI2Vsc2UKK2ludCBiYl9pb2N0bF9vcl93YXJuKGludCBmZCwgdW5zaWduZWQgcmVxdWVzdCwgdm9pZCAqYXJncCkgRkFTVF9GVU5DOworaW50IGJiX3hpb2N0bChpbnQgZmQsIHVuc2lnbmVkIHJlcXVlc3QsIHZvaWQgKmFyZ3ApIEZBU1RfRlVOQzsKKyNkZWZpbmUgaW9jdGxfb3Jfd2FybihmZCxyZXF1ZXN0LGFyZ3ApIGJiX2lvY3RsX29yX3dhcm4oZmQscmVxdWVzdCxhcmdwKQorI2RlZmluZSB4aW9jdGwoZmQscmVxdWVzdCxhcmdwKSAgICAgICAgYmJfeGlvY3RsKGZkLHJlcXVlc3QsYXJncCkKKyNlbmRpZgorCitjaGFyICppc19pbl9pbm9fZGV2X2hhc2h0YWJsZShjb25zdCBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZikgRkFTVF9GVU5DOwordm9pZCBhZGRfdG9faW5vX2Rldl9oYXNodGFibGUoY29uc3Qgc3RydWN0IHN0YXQgKnN0YXRidWYsIGNvbnN0IGNoYXIgKm5hbWUpIEZBU1RfRlVOQzsKK3ZvaWQgcmVzZXRfaW5vX2Rldl9oYXNodGFibGUodm9pZCkgRkFTVF9GVU5DOworI2lmZGVmIF9fR0xJQkNfXworLyogQXQgbGVhc3QgZ2xpYmMgaGFzIGhvcnJlbmRvdXNseSBsYXJnZSBpbmxpbmUgZm9yIHRoaXMsIHNvIHdyYXAgaXQgKi8KK3Vuc2lnbmVkIGxvbmcgbG9uZyBiYl9tYWtlZGV2KHVuc2lnbmVkIG1ham9yLCB1bnNpZ25lZCBtaW5vcikgRkFTVF9GVU5DOworI3VuZGVmIG1ha2VkZXYKKyNkZWZpbmUgbWFrZWRldihhLGIpIGJiX21ha2VkZXYoYSxiKQorI2VuZGlmCisKKworLyogIktleWNvZGVzIiB0aGF0IHJlcG9ydCBhbiBlc2NhcGUgc2VxdWVuY2UuCisgKiBXZSB1c2Ugc29tZXRoaW5nIHdoaWNoIGZpdHMgaW50byBzaWduZWQgY2hhciwKKyAqIHlldCBkb2Vzbid0IHJlcHJlc2VudCBhbnkgdmFsaWQgVW5pY29kZSBjaGFyYWN0ZXIuCisgKiBBbHNvLCAtMSBpcyByZXNlcnZlZCBmb3IgZXJyb3IgaW5kaWNhdGlvbiBhbmQgd2UgZG9uJ3QgdXNlIGl0LiAqLworZW51bSB7CisJS0VZQ09ERV9VUCAgICAgICA9ICAtMiwKKwlLRVlDT0RFX0RPV04gICAgID0gIC0zLAorCUtFWUNPREVfUklHSFQgICAgPSAgLTQsCisJS0VZQ09ERV9MRUZUICAgICA9ICAtNSwKKwlLRVlDT0RFX0hPTUUgICAgID0gIC02LAorCUtFWUNPREVfRU5EICAgICAgPSAgLTcsCisJS0VZQ09ERV9JTlNFUlQgICA9ICAtOCwKKwlLRVlDT0RFX0RFTEVURSAgID0gIC05LAorCUtFWUNPREVfUEFHRVVQICAgPSAtMTAsCisJS0VZQ09ERV9QQUdFRE9XTiA9IC0xMSwKKwkvLyAtMTIgaXMgcmVzZXJ2ZWQgZm9yIEFsdC9DdHJsL1NoaWZ0LVRBQgorI2lmIDAKKwlLRVlDT0RFX0ZVTjEgICAgID0gLTEzLAorCUtFWUNPREVfRlVOMiAgICAgPSAtMTQsCisJS0VZQ09ERV9GVU4zICAgICA9IC0xNSwKKwlLRVlDT0RFX0ZVTjQgICAgID0gLTE2LAorCUtFWUNPREVfRlVONSAgICAgPSAtMTcsCisJS0VZQ09ERV9GVU42ICAgICA9IC0xOCwKKwlLRVlDT0RFX0ZVTjcgICAgID0gLTE5LAorCUtFWUNPREVfRlVOOCAgICAgPSAtMjAsCisJS0VZQ09ERV9GVU45ICAgICA9IC0yMSwKKwlLRVlDT0RFX0ZVTjEwICAgID0gLTIyLAorCUtFWUNPREVfRlVOMTEgICAgPSAtMjMsCisJS0VZQ09ERV9GVU4xMiAgICA9IC0yNCwKKyNlbmRpZgorCS8qIEJlIHN1cmUgdGhhdCBsYXN0IGRlZmluZWQgdmFsdWUgaXMgc21hbGwgZW5vdWdoCisJICogdG8gbm90IGludGVyZmVyZSB3aXRoIEFsdC9DdHJsL1NoaWZ0IGJpdHMuCisJICogU28gZmFyIHdlIGRvIG5vdCBleGNlZWQgLTMxICgweGZmZi4uZmZmZTEpLAorCSAqIHdoaWNoIGdpdmVzIHVzIHRocmVlIHVwcGVyIGJpdHMgaW4gTFNCIHRvIHBsYXkgd2l0aC4KKwkgKi8KKwkvL0tFWUNPREVfU0hJRlRfVEFCICA9ICgtMTIpICAgICAgICAgJiB+MHg4MCwKKwkvL0tFWUNPREVfU0hJRlRfLi4uICA9IEtFWUNPREVfLi4uICAgJiB+MHg4MCwKKwkvL0tFWUNPREVfQ1RSTF9VUCAgICA9IEtFWUNPREVfVVAgICAgJiB+MHg0MCwKKwkvL0tFWUNPREVfQ1RSTF9ET1dOICA9IEtFWUNPREVfRE9XTiAgJiB+MHg0MCwKKwlLRVlDT0RFX0NUUkxfUklHSFQgPSBLRVlDT0RFX1JJR0hUICYgfjB4NDAsCisJS0VZQ09ERV9DVFJMX0xFRlQgID0gS0VZQ09ERV9MRUZUICAmIH4weDQwLAorCS8vS0VZQ09ERV9BTFRfVVAgICAgID0gS0VZQ09ERV9VUCAgICAmIH4weDIwLAorCS8vS0VZQ09ERV9BTFRfRE9XTiAgID0gS0VZQ09ERV9ET1dOICAmIH4weDIwLAorCUtFWUNPREVfQUxUX1JJR0hUICA9IEtFWUNPREVfUklHSFQgJiB+MHgyMCwKKwlLRVlDT0RFX0FMVF9MRUZUICAgPSBLRVlDT0RFX0xFRlQgICYgfjB4MjAsCisKKwlLRVlDT0RFX0NVUlNPUl9QT1MgPSAtMHgxMDAsIC8qIDB4ZmZmLi5mZmYwMCAqLworCS8qIEhvdyBsb25nIGlzIHRoZSBsb25nZXN0IEVTQyBzZXF1ZW5jZSB3ZSBrbm93PworCSAqIFdlIHdhbnQgaXQgYmlnIGVub3VnaCB0byBiZSBhYmxlIHRvIGNvbnRhaW4KKwkgKiBjdXJzb3IgcG9zaXRpb24gc2VxdWVuY2UgIkVTQyBbIDk5OTkgOyA5OTk5IFIiCisJICovCisJS0VZQ09ERV9CVUZGRVJfU0laRSA9IDE2Cit9OworLyogTm90ZTogZmQgbWF5IGJlIGluIGJsb2NraW5nIG9yIG5vbi1ibG9ja2luZyBtb2RlLCBib3RoIG1ha2Ugc2Vuc2UuCisgKiBGb3Igb25lLCBsZXNzIHVzZXMgbm9uLWJsb2NraW5nIG1vZGUuCisgKiBPbmx5IHRoZSBmaXJzdCByZWFkIHN5c2NhbGwgaW5zaWRlIHJlYWRfa2V5IG1heSBibG9jayBpbmRlZmluaXRlbHkKKyAqICh1bmxlc3MgZmQgaXMgaW4gbm9uLWJsb2NraW5nIG1vZGUpLAorICogc3Vic2VxdWVudCByZWFkcyB3aWxsIHRpbWUgb3V0IGFmdGVyIGEgZmV3IG1pbGxpc2Vjb25kcy4KKyAqIFJldHVybiBvZiAtMSBtZWFucyBFT0Ygb3IgZXJyb3IgKGVycm5vID09IDAgb24gRU9GKS4KKyAqIGJ1ZmZlclswXSBpcyB1c2VkIGFzIGEgY291bnRlciBvZiBidWZmZXJlZCBjaGFycyBhbmQgbXVzdCBiZSAwCisgKiBvbiBmaXJzdCBjYWxsLgorICogdGltZW91dDoKKyAqIC0yOiBkbyBub3QgcG9sbCBmb3IgaW5wdXQ7CisgKiAtMTogcG9sbCgtMSkgKGkuZS4gYmxvY2spOworICogPj0wOiBwb2xsIGZvciBUSU1FT1VUIG1pbGxpc2Vjb25kcywgcmV0dXJuIC0xL0VBR0FJTiBvbiB0aW1lb3V0CisgKi8KK2ludDY0X3QgcmVhZF9rZXkoaW50IGZkLCBjaGFyICpidWZmZXIsIGludCB0aW1lb3V0KSBGQVNUX0ZVTkM7Cit2b2lkIHJlYWRfa2V5X3VuZ2V0cyhjaGFyICpidWZmZXIsIGNvbnN0IGNoYXIgKnN0ciwgdW5zaWduZWQgbGVuKSBGQVNUX0ZVTkM7CisKKworI2lmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkcKKy8qIEl0J3MgTk9UIGp1c3QgRU5BQkxFZCBvciBkaXNhYmxlZC4gSXQncyBhIG51bWJlcjogKi8KKyMgaWYgZGVmaW5lZCBDT05GSUdfRkVBVFVSRV9FRElUSU5HX0hJU1RPUlkgJiYgQ09ORklHX0ZFQVRVUkVfRURJVElOR19ISVNUT1JZID4gMAorIyAgZGVmaW5lIE1BWF9ISVNUT1JZIChDT05GSUdfRkVBVFVSRV9FRElUSU5HX0hJU1RPUlkgKyAwKQordW5zaWduZWQgc2l6ZV9mcm9tX0hJU1RGSUxFU0laRShjb25zdCBjaGFyICpocCkgRkFTVF9GVU5DOworIyBlbHNlCisjICBkZWZpbmUgTUFYX0hJU1RPUlkgMAorIyBlbmRpZgordHlwZWRlZiBzdHJ1Y3QgbGluZV9pbnB1dF90IHsKKwlpbnQgZmxhZ3M7CisJY29uc3QgY2hhciAqcGF0aF9sb29rdXA7CisjIGlmIE1BWF9ISVNUT1JZCisJaW50IGNudF9oaXN0b3J5OworCWludCBjdXJfaGlzdG9yeTsKKwlpbnQgbWF4X2hpc3Rvcnk7IC8qIG11c3QgbmV2ZXIgYmUgPD0gMCAqLworIyAgaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19TQVZFSElTVE9SWQorCS8qIG1lYW5pbmcgb2YgdGhpcyBmaWVsZCBkZXBlbmRzIG9uIEZFQVRVUkVfRURJVElOR19TQVZFX09OX0VYSVQ6CisJICogaWYgIUZFQVRVUkVfRURJVElOR19TQVZFX09OX0VYSVQ6ICJob3cgbWFueSBsaW5lcyBhcmUKKwkgKiBpbiBvbi1kaXNrIGhpc3RvcnkiCisJICogaWYgRkVBVFVSRV9FRElUSU5HX1NBVkVfT05fRVhJVDogImhvdyBtYW55IGluLW1lbW9yeSBsaW5lcyBhcmUKKwkgKiBhbHNvIGluIG9uLWRpc2sgaGlzdG9yeSAoYW5kIHRodXMgbmVlZCB0byBiZSBza2lwcGVkIG9uIHNhdmUpIgorCSAqLworCXVuc2lnbmVkIGNudF9oaXN0b3J5X2luX2ZpbGU7CisJY29uc3QgY2hhciAqaGlzdF9maWxlOworIyAgZW5kaWYKKwljaGFyICpoaXN0b3J5W01BWF9ISVNUT1JZICsgMV07CisjIGVuZGlmCit9IGxpbmVfaW5wdXRfdDsKK2VudW0geworCURPX0hJU1RPUlkgICAgICAgPSAxICogKE1BWF9ISVNUT1JZID4gMCksCisJVEFCX0NPTVBMRVRJT04gICA9IDIgKiBFTkFCTEVfRkVBVFVSRV9UQUJfQ09NUExFVElPTiwKKwlVU0VSTkFNRV9DT01QTEVUSU9OID0gNCAqIEVOQUJMRV9GRUFUVVJFX1VTRVJOQU1FX0NPTVBMRVRJT04sCisJVklfTU9ERSAgICAgICAgICA9IDggKiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1ZJLAorCVdJVEhfUEFUSF9MT09LVVAgPSAweDEwLAorCUZPUl9TSEVMTCAgICAgICAgPSBET19ISVNUT1JZIHwgVEFCX0NPTVBMRVRJT04gfCBVU0VSTkFNRV9DT01QTEVUSU9OLAorfTsKK2xpbmVfaW5wdXRfdCAqbmV3X2xpbmVfaW5wdXRfdChpbnQgZmxhZ3MpIEZBU1RfRlVOQzsKKy8qIFNvIGZhciBzdGF0aWM6IHZvaWQgZnJlZV9saW5lX2lucHV0X3QobGluZV9pbnB1dF90ICpuKSBGQVNUX0ZVTkM7ICovCisvKgorICogbWF4c2l6ZSBtdXN0IGJlID49IDIuCisgKiBSZXR1cm5zOgorICogLTEgb24gcmVhZCBlcnJvcnMgb3IgRU9GLCBvciBvbiBiYXJlIEN0cmwtRCwKKyAqIDAgIG9uIGN0cmwtQyAodGhlIGxpbmUgZW50ZXJlZCBpcyBzdGlsbCByZXR1cm5lZCBpbiAnY29tbWFuZCcpLAorICogPjAgbGVuZ3RoIG9mIGlucHV0IHN0cmluZywgaW5jbHVkaW5nIHRlcm1pbmF0aW5nICdcbicKKyAqLworaW50IHJlYWRfbGluZV9pbnB1dChsaW5lX2lucHV0X3QgKnN0LCBjb25zdCBjaGFyICpwcm9tcHQsIGNoYXIgKmNvbW1hbmQsIGludCBtYXhzaXplLCBpbnQgdGltZW91dCkgRkFTVF9GVU5DOwordm9pZCBzaG93X2hpc3RvcnkoY29uc3QgbGluZV9pbnB1dF90ICpzdCkgRkFTVF9GVU5DOworIyBpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1NBVkVfT05fRVhJVAordm9pZCBzYXZlX2hpc3RvcnkobGluZV9pbnB1dF90ICpzdCk7CisjIGVuZGlmCisjZWxzZQorI2RlZmluZSBNQVhfSElTVE9SWSAwCitpbnQgcmVhZF9saW5lX2lucHV0KGNvbnN0IGNoYXIqIHByb21wdCwgY2hhciogY29tbWFuZCwgaW50IG1heHNpemUpIEZBU1RfRlVOQzsKKyNkZWZpbmUgcmVhZF9saW5lX2lucHV0KHN0YXRlLCBwcm9tcHQsIGNvbW1hbmQsIG1heHNpemUsIHRpbWVvdXQpIFwKKwlyZWFkX2xpbmVfaW5wdXQocHJvbXB0LCBjb21tYW5kLCBtYXhzaXplKQorI2VuZGlmCisKKworI2lmbmRlZiBDT01NX0xFTgorIyBpZmRlZiBUQVNLX0NPTU1fTEVOCitlbnVtIHsgQ09NTV9MRU4gPSBUQVNLX0NPTU1fTEVOIH07CisjIGVsc2UKKy8qIHN5bmNocm9uaXplIHdpdGggc2l6ZW9mKHRhc2tfc3RydWN0LmNvbW0pIGluIC91c3IvaW5jbHVkZS9saW51eC9zY2hlZC5oICovCitlbnVtIHsgQ09NTV9MRU4gPSAxNiB9OworIyBlbmRpZgorI2VuZGlmCisKK3N0cnVjdCBzbWFwcmVjIHsKKwl1bnNpZ25lZCBsb25nIG1hcHBlZF9ydzsKKwl1bnNpZ25lZCBsb25nIG1hcHBlZF9ybzsKKwl1bnNpZ25lZCBsb25nIHNoYXJlZF9jbGVhbjsKKwl1bnNpZ25lZCBsb25nIHNoYXJlZF9kaXJ0eTsKKwl1bnNpZ25lZCBsb25nIHByaXZhdGVfY2xlYW47CisJdW5zaWduZWQgbG9uZyBwcml2YXRlX2RpcnR5OworCXVuc2lnbmVkIGxvbmcgc3RhY2s7CisJdW5zaWduZWQgbG9uZyBzbWFwX3Bzcywgc21hcF9zd2FwOworCXVuc2lnbmVkIGxvbmcgc21hcF9zaXplOworCXVuc2lnbmVkIGxvbmcgc21hcF9zdGFydDsKKwljaGFyIHNtYXBfbW9kZVs1XTsKKwljaGFyICpzbWFwX25hbWU7Cit9OworCisjaWYgIUVOQUJMRV9QTUFQCisjZGVmaW5lIHByb2Nwc19yZWFkX3NtYXBzKHBpZCwgdG90YWwsIGNiLCBkYXRhKSBcCisJcHJvY3BzX3JlYWRfc21hcHMocGlkLCB0b3RhbCkKKyNlbmRpZgoraW50IEZBU1RfRlVOQyBwcm9jcHNfcmVhZF9zbWFwcyhwaWRfdCBwaWQsIHN0cnVjdCBzbWFwcmVjICp0b3RhbCwKKwkJdm9pZCAoKmNiKShzdHJ1Y3Qgc21hcHJlYyAqLCB2b2lkICopLCB2b2lkICpkYXRhKTsKKwordHlwZWRlZiBzdHJ1Y3QgcHJvY3BzX3N0YXR1c190IHsKKwlESVIgKmRpcjsKKwlJRl9GRUFUVVJFX1NIT1dfVEhSRUFEUyhESVIgKnRhc2tfZGlyOykKKwl1aW50OF90IHNoaWZ0X3BhZ2VzX3RvX2J5dGVzOworCXVpbnQ4X3Qgc2hpZnRfcGFnZXNfdG9fa2I7CisvKiBGaWVsZHMgYXJlIHNldCB0byAwL05VTEwgaWYgZmFpbGVkIHRvIGRldGVybWluZSAob3Igbm90IHJlcXVlc3RlZCkgKi8KKwl1aW50MTZfdCBhcmd2X2xlbjsKKwljaGFyICphcmd2MDsKKwljaGFyICpleGU7CisJSUZfU0VMSU5VWChjaGFyICpjb250ZXh0OykKKwlJRl9GRUFUVVJFX1NIT1dfVEhSRUFEUyh1bnNpZ25lZCBtYWluX3RocmVhZF9waWQ7KQorCS8qIEV2ZXJ5dGhpbmcgYmVsb3cgbXVzdCBjb250YWluIG5vIHB0cnMgdG8gbWFsbG9jJ2VkIGRhdGE6CisJICogaXQgaXMgbWVtc2V0KDApIGZvciBlYWNoIHByb2Nlc3MgaW4gcHJvY3BzX3NjYW4oKSAqLworCXVuc2lnbmVkIGxvbmcgdnN6LCByc3M7IC8qIHdlIHJvdW5kIGl0IHRvIGtieXRlcyAqLworCXVuc2lnbmVkIGxvbmcgc3RpbWUsIHV0aW1lOworCXVuc2lnbmVkIGxvbmcgc3RhcnRfdGltZTsKKwl1bnNpZ25lZCBwaWQ7CisJdW5zaWduZWQgcHBpZDsKKwl1bnNpZ25lZCBwZ2lkOworCXVuc2lnbmVkIHNpZDsKKwl1bnNpZ25lZCB1aWQ7CisJdW5zaWduZWQgZ2lkOworI2lmIEVOQUJMRV9GRUFUVVJFX1BTX0FERElUSU9OQUxfQ09MVU1OUworCXVuc2lnbmVkIHJ1aWQ7CisJdW5zaWduZWQgcmdpZDsKKwlpbnQgbmljZW5lc3M7CisjZW5kaWYKKwl1bnNpZ25lZCB0dHlfbWFqb3IsdHR5X21pbm9yOworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUE1FTQorCXN0cnVjdCBzbWFwcmVjIHNtYXBzOworI2VuZGlmCisJY2hhciBzdGF0ZVs0XTsKKwkvKiBiYXNlbmFtZSBvZiBleGVjdXRhYmxlIGluIGV4ZWMoMiksIHJlYWQgZnJvbSAvcHJvYy9OL3N0YXQKKwkgKiAoaWYgZXhlY3V0YWJsZSBpcyBzeW1saW5rIG9yIHNjcmlwdCwgaXQgaXMgTk9UIHJlcGxhY2VkCisJICogYnkgbGluayB0YXJnZXQgb3IgaW50ZXJwcmV0ZXIgbmFtZSkgKi8KKwljaGFyIGNvbW1bQ09NTV9MRU5dOworCS8qIHVzZXIvZ3JvdXA/IC0gdXNlIHBhc3N3ZC9ncm91cCBwYXJzaW5nIGZ1bmN0aW9ucyAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUworCWludCBsYXN0X3NlZW5fb25fY3B1OworI2VuZGlmCit9IHByb2Nwc19zdGF0dXNfdDsKKy8qIGZsYWcgYml0cyBmb3IgcHJvY3BzX3NjYW4oeHgsIGZsYWdzKSBjYWxscyAqLworZW51bSB7CisJUFNTQ0FOX1BJRCAgICAgID0gMSA8PCAwLAorCVBTU0NBTl9QUElEICAgICA9IDEgPDwgMSwKKwlQU1NDQU5fUEdJRCAgICAgPSAxIDw8IDIsCisJUFNTQ0FOX1NJRCAgICAgID0gMSA8PCAzLAorCVBTU0NBTl9VSURHSUQgICA9IDEgPDwgNCwKKwlQU1NDQU5fQ09NTSAgICAgPSAxIDw8IDUsCisJLyogUFNTQ0FOX0NNRCAgICAgID0gMSA8PCA2LCAtIHVzZSByZWFkX2NtZGxpbmUgaW5zdGVhZCAqLworCVBTU0NBTl9BUkdWMCAgICA9IDEgPDwgNywKKwlQU1NDQU5fRVhFICAgICAgPSAxIDw8IDgsCisJUFNTQ0FOX1NUQVRFICAgID0gMSA8PCA5LAorCVBTU0NBTl9WU1ogICAgICA9IDEgPDwgMTAsCisJUFNTQ0FOX1JTUyAgICAgID0gMSA8PCAxMSwKKwlQU1NDQU5fU1RJTUUgICAgPSAxIDw8IDEyLAorCVBTU0NBTl9VVElNRSAgICA9IDEgPDwgMTMsCisJUFNTQ0FOX1RUWSAgICAgID0gMSA8PCAxNCwKKwlQU1NDQU5fU01BUFMJPSAoMSA8PCAxNSkgKiBFTkFCTEVfRkVBVFVSRV9UT1BNRU0sCisJLyogTkI6IHVzZWQgYnkgZmluZF9waWRfYnlfbmFtZSgpLiBBbnkgYXBwbGV0IHVzaW5nIGl0CisJICogbmVlZHMgdG8gYmUgbWVudGlvbmVkIGhlcmUuICovCisJUFNTQ0FOX0FSR1ZOICAgID0gKDEgPDwgMTYpICogKEVOQUJMRV9LSUxMQUxMCisJCQkJfHwgRU5BQkxFX1BHUkVQIHx8IEVOQUJMRV9QS0lMTAorCQkJCXx8IEVOQUJMRV9QSURPRgorCQkJCXx8IEVOQUJMRV9TRVNUQVRVUworCQkJCSksCisJUFNTQ0FOX0NPTlRFWFQgID0gKDEgPDwgMTcpICogRU5BQkxFX1NFTElOVVgsCisJUFNTQ0FOX1NUQVJUX1RJTUUgPSAxIDw8IDE4LAorCVBTU0NBTl9DUFUgICAgICA9ICgxIDw8IDE5KSAqIEVOQUJMRV9GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUywKKwlQU1NDQU5fTklDRSAgICAgPSAoMSA8PCAyMCkgKiBFTkFCTEVfRkVBVFVSRV9QU19BRERJVElPTkFMX0NPTFVNTlMsCisJUFNTQ0FOX1JVSURHSUQgID0gKDEgPDwgMjEpICogRU5BQkxFX0ZFQVRVUkVfUFNfQURESVRJT05BTF9DT0xVTU5TLAorCVBTU0NBTl9UQVNLUwk9ICgxIDw8IDIyKSAqIEVOQUJMRV9GRUFUVVJFX1NIT1dfVEhSRUFEUywKK307CisvL3Byb2Nwc19zdGF0dXNfdCogYWxsb2NfcHJvY3BzX3NjYW4odm9pZCkgRkFTVF9GVU5DOwordm9pZCBmcmVlX3Byb2Nwc19zY2FuKHByb2Nwc19zdGF0dXNfdCogc3ApIEZBU1RfRlVOQzsKK3Byb2Nwc19zdGF0dXNfdCogcHJvY3BzX3NjYW4ocHJvY3BzX3N0YXR1c190KiBzcCwgaW50IGZsYWdzKSBGQVNUX0ZVTkM7CisvKiBGb3JtYXQgY21kbGluZSAodXAgdG8gY29sIGNoYXJzKSBpbnRvIGNoYXIgYnVmW3NpemVdICovCisvKiBQdXRzIFtjb21tXSBpZiBjbWRsaW5lIGlzIGVtcHR5ICgtPiBwcm9jZXNzIGlzIGEga2VybmVsIHRocmVhZCkgKi8KK3ZvaWQgcmVhZF9jbWRsaW5lKGNoYXIgKmJ1ZiwgaW50IHNpemUsIHVuc2lnbmVkIHBpZCwgY29uc3QgY2hhciAqY29tbSkgRkFTVF9GVU5DOworcGlkX3QgKmZpbmRfcGlkX2J5X25hbWUoY29uc3QgY2hhciogcHJvY05hbWUpIEZBU1RfRlVOQzsKK3BpZF90ICpwaWRsaXN0X3JldmVyc2UocGlkX3QgKnBpZExpc3QpIEZBU1RfRlVOQzsKK2ludCBzdGFydHNfd2l0aF9jcHUoY29uc3QgY2hhciAqc3RyKSBGQVNUX0ZVTkM7Cit1bnNpZ25lZCBnZXRfY3B1X2NvdW50KHZvaWQpIEZBU1RfRlVOQzsKKworCisvKiBVc2Ugc3RyaWN0PTEgaWYgeW91IHByb2Nlc3MgaW5wdXQgZnJvbSB1bnRydXN0ZWQgc291cmNlOgorICogaXQgd2lsbCByZXR1cm4gTlVMTCBvbiBpbnZhbGlkICV4eCAoYmFkIGhleCBjaGFycykKKyAqIGFuZCBzdHIgKyAxIGlmIGRlY29kZWQgY2hhciBpcyAvIG9yIE5VTC4KKyAqIEluIG5vbi1zdHJpY3QgbW9kZSwgaXQgYWx3YXlzIHN1Y2NlZWRzIChyZXR1cm5zIHN0ciksCisgKiBhbmQgYWxzbyBpdCBhZGRpdGlvbmFsbHkgZGVjb2RlZCAnKycgdG8gc3BhY2UuCisgKi8KK2NoYXIgKnBlcmNlbnRfZGVjb2RlX2luX3BsYWNlKGNoYXIgKnN0ciwgaW50IHN0cmljdCkgRkFTVF9GVU5DOworCisKK2V4dGVybiBjb25zdCBjaGFyIGJiX3V1ZW5jX3RibF9iYXNlNjRbXSBBTElHTjE7CitleHRlcm4gY29uc3QgY2hhciBiYl91dWVuY190Ymxfc3RkW10gQUxJR04xOwordm9pZCBiYl91dWVuY29kZShjaGFyICpzdG9yZSwgY29uc3Qgdm9pZCAqcywgaW50IGxlbmd0aCwgY29uc3QgY2hhciAqdGJsKSBGQVNUX0ZVTkM7CitlbnVtIHsKKwlCQVNFNjRfRkxBR19VVV9TVE9QID0gMHgxMDAsCisJLyogU2lnbi1leHRlbmRzIHRvIGEgdmFsdWUgd2hpY2ggbmV2ZXIgbWF0Y2hlcyBmZ2V0YyByZXN1bHQ6ICovCisJQkFTRTY0X0ZMQUdfTk9fU1RPUF9DSEFSID0gMHg4MCwKK307Citjb25zdCBjaGFyICpkZWNvZGVfYmFzZTY0KGNoYXIgKipwcF9kc3QsIGNvbnN0IGNoYXIgKnNyYykgRkFTVF9GVU5DOwordm9pZCByZWFkX2Jhc2U2NChGSUxFICpzcmNfc3RyZWFtLCBGSUxFICpkc3Rfc3RyZWFtLCBpbnQgZmxhZ3MpIEZBU1RfRlVOQzsKKwordHlwZWRlZiBzdHJ1Y3QgbWQ1X2N0eF90IHsKKwl1aW50OF90IHdidWZmZXJbNjRdOyAvKiBhbHdheXMgY29ycmVjdGx5IGFsaWduZWQgZm9yIHVpbnQ2NF90ICovCisJdm9pZCAoKnByb2Nlc3NfYmxvY2spKHN0cnVjdCBtZDVfY3R4X3QqKSBGQVNUX0ZVTkM7CisJdWludDY0X3QgdG90YWw2NDsgICAgLyogbXVzdCBiZSBkaXJlY3RseSBiZWZvcmUgaGFzaFtdICovCisJdWludDMyX3QgaGFzaFs4XTsgICAgLyogNCBlbGVtZW50cyBmb3IgbWQ1LCA1IGZvciBzaGExLCA4IGZvciBzaGEyNTYgKi8KK30gbWQ1X2N0eF90OwordHlwZWRlZiBzdHJ1Y3QgbWQ1X2N0eF90IHNoYTFfY3R4X3Q7Cit0eXBlZGVmIHN0cnVjdCBtZDVfY3R4X3Qgc2hhMjU2X2N0eF90OwordHlwZWRlZiBzdHJ1Y3Qgc2hhNTEyX2N0eF90IHsKKwl1aW50NjRfdCB0b3RhbDY0WzJdOyAgLyogbXVzdCBiZSBkaXJlY3RseSBiZWZvcmUgaGFzaFtdICovCisJdWludDY0X3QgaGFzaFs4XTsKKwl1aW50OF90IHdidWZmZXJbMTI4XTsgLyogYWx3YXlzIGNvcnJlY3RseSBhbGlnbmVkIGZvciB1aW50NjRfdCAqLworfSBzaGE1MTJfY3R4X3Q7Cit0eXBlZGVmIHN0cnVjdCBzaGEzX2N0eF90IHsKKwl1aW50NjRfdCBzdGF0ZVsyNV07CisJdW5zaWduZWQgYnl0ZXNfcXVldWVkOworfSBzaGEzX2N0eF90Owordm9pZCBtZDVfYmVnaW4obWQ1X2N0eF90ICpjdHgpIEZBU1RfRlVOQzsKK3ZvaWQgbWQ1X2hhc2gobWQ1X2N0eF90ICpjdHgsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbikgRkFTVF9GVU5DOwordm9pZCBtZDVfZW5kKG1kNV9jdHhfdCAqY3R4LCB2b2lkICpyZXNidWYpIEZBU1RfRlVOQzsKK3ZvaWQgc2hhMV9iZWdpbihzaGExX2N0eF90ICpjdHgpIEZBU1RfRlVOQzsKKyNkZWZpbmUgc2hhMV9oYXNoIG1kNV9oYXNoCit2b2lkIHNoYTFfZW5kKHNoYTFfY3R4X3QgKmN0eCwgdm9pZCAqcmVzYnVmKSBGQVNUX0ZVTkM7Cit2b2lkIHNoYTI1Nl9iZWdpbihzaGEyNTZfY3R4X3QgKmN0eCkgRkFTVF9GVU5DOworI2RlZmluZSBzaGEyNTZfaGFzaCBtZDVfaGFzaAorI2RlZmluZSBzaGEyNTZfZW5kICBzaGExX2VuZAordm9pZCBzaGE1MTJfYmVnaW4oc2hhNTEyX2N0eF90ICpjdHgpIEZBU1RfRlVOQzsKK3ZvaWQgc2hhNTEyX2hhc2goc2hhNTEyX2N0eF90ICpjdHgsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbikgRkFTVF9GVU5DOwordm9pZCBzaGE1MTJfZW5kKHNoYTUxMl9jdHhfdCAqY3R4LCB2b2lkICpyZXNidWYpIEZBU1RfRlVOQzsKK3ZvaWQgc2hhM19iZWdpbihzaGEzX2N0eF90ICpjdHgpIEZBU1RfRlVOQzsKK3ZvaWQgc2hhM19oYXNoKHNoYTNfY3R4X3QgKmN0eCwgY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgbGVuKSBGQVNUX0ZVTkM7Cit2b2lkIHNoYTNfZW5kKHNoYTNfY3R4X3QgKmN0eCwgdm9pZCAqcmVzYnVmKSBGQVNUX0ZVTkM7CisKK2V4dGVybiB1aW50MzJfdCAqZ2xvYmFsX2NyYzMyX3RhYmxlOwordWludDMyX3QgKmNyYzMyX2ZpbGx0YWJsZSh1aW50MzJfdCAqdGJsMjU2LCBpbnQgZW5kaWFuKSBGQVNUX0ZVTkM7Cit1aW50MzJfdCBjcmMzMl9ibG9ja19lbmRpYW4xKHVpbnQzMl90IHZhbCwgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsZW4sIHVpbnQzMl90ICpjcmNfdGFibGUpIEZBU1RfRlVOQzsKK3VpbnQzMl90IGNyYzMyX2Jsb2NrX2VuZGlhbjAodWludDMyX3QgdmFsLCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxlbiwgdWludDMyX3QgKmNyY190YWJsZSkgRkFTVF9GVU5DOworCit0eXBlZGVmIHN0cnVjdCBtYXNrc19sYWJlbHNfdCB7CisJY29uc3QgY2hhciAqbGFiZWxzOworCWNvbnN0IGludCBtYXNrc1tdOworfSBtYXNrc19sYWJlbHNfdDsKK2ludCBwcmludF9mbGFnc19zZXBhcmF0ZWQoY29uc3QgaW50ICptYXNrcywgY29uc3QgY2hhciAqbGFiZWxzLAorCQlpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKnNlcGFyYXRvcikgRkFTVF9GVU5DOworaW50IHByaW50X2ZsYWdzKGNvbnN0IG1hc2tzX2xhYmVsc190ICptbCwgaW50IGZsYWdzKSBGQVNUX0ZVTkM7CisKK3R5cGVkZWYgc3RydWN0IGJiX3Byb2dyZXNzX3QgeworCXVuc2lnbmVkIGxhc3Rfc2l6ZTsKKwl1bnNpZ25lZCBsYXN0X3VwZGF0ZV9zZWM7CisJdW5zaWduZWQgbGFzdF9jaGFuZ2Vfc2VjOworCXVuc2lnbmVkIHN0YXJ0X3NlYzsKKwljb25zdCBjaGFyICpjdXJmaWxlOworfSBiYl9wcm9ncmVzc190OworCisjZGVmaW5lIGlzX2JiX3Byb2dyZXNzX2luaXRlZChwKSAoKHApLT5jdXJmaWxlICE9IE5VTEwpCisjZGVmaW5lIGJiX3Byb2dyZXNzX2ZyZWUocCkgZG8geyBcCisJaWYgKEVOQUJMRV9VTklDT0RFX1NVUFBPUlQpIGZyZWUoKGNoYXIqKSgocCktPmN1cmZpbGUpKTsgXAorCShwKS0+Y3VyZmlsZSA9IE5VTEw7IFwKK30gd2hpbGUgKDApCit2b2lkIGJiX3Byb2dyZXNzX2luaXQoYmJfcHJvZ3Jlc3NfdCAqcCwgY29uc3QgY2hhciAqY3VyZmlsZSkgRkFTVF9GVU5DOwordm9pZCBiYl9wcm9ncmVzc191cGRhdGUoYmJfcHJvZ3Jlc3NfdCAqcCwKKwkJCXVvZmZfdCBiZWdfcmFuZ2UsCisJCQl1b2ZmX3QgdHJhbnNmZXJyZWQsCisJCQl1b2ZmX3QgdG90YWxzaXplKSBGQVNUX0ZVTkM7CisKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmFwcGxldF9uYW1lOworCisvKiBTb21lIG9sZGVyIGxpbmtlcnMgZG9uJ3QgcGVyZm9ybSBzdHJpbmcgbWVyZ2luZywgd2UgdXNlZCB0byBoYXZlIGNvbW1vbiBzdHJpbmdzCisgKiBhcyBnbG9iYWwgYXJyYXlzIHRvIGRvIGl0IGJ5IGhhbmQuIEJ1dDoKKyAqICgxKSBuZXdlciBsaW5rZXJzIGRvIGl0IHRoZW1zZWx2ZXMsCisgKiAoMikgaG93ZXZlciwgdGhleSBET05UIG1lcmdlIHN0cmluZyBjb25zdGFudHMgd2l0aCBnbG9iYWwgYXJyYXlzLAorICogZXZlbiBpZiB0aGUgdmFsdWUgaXMgdGhlIHNhbWUgKCEpLiBUaHVzIGdsb2JhbCBhcnJheXMgYWN0dWFsbHkKKyAqIGluY3JlYXNlZCBzaXplIGEgYml0OiBmb3IgZXhhbXBsZSwgIi9ldGMvcGFzc3dkIiBzdHJpbmcgZnJvbSBsaWJjCisgKiB3YXNuJ3QgbWVyZ2VkIHdpdGggYmJfcGF0aF9wYXNzd2RfZmlsZVtdIGFycmF5IQorICogVGhlcmVmb3JlIG5vdyB3ZSB1c2UgI2RlZmluZXMuCisgKi8KKy8qICJCdXN5Qm94IHZOLk4uTiAodGltZXN0YW1wIG9yIGV4dHJhX3ZlcnNpb24pIiAqLworZXh0ZXJuIGNvbnN0IGNoYXIgYmJfYmFubmVyW10gQUxJR04xOworZXh0ZXJuIGNvbnN0IGNoYXIgYmJfbXNnX21lbW9yeV9leGhhdXN0ZWRbXSBBTElHTjE7CitleHRlcm4gY29uc3QgY2hhciBiYl9tc2dfaW52YWxpZF9kYXRlW10gQUxJR04xOworI2RlZmluZSBiYl9tc2dfcmVhZF9lcnJvciAicmVhZCBlcnJvciIKKyNkZWZpbmUgYmJfbXNnX3dyaXRlX2Vycm9yICJ3cml0ZSBlcnJvciIKK2V4dGVybiBjb25zdCBjaGFyIGJiX21zZ191bmtub3duW10gQUxJR04xOworZXh0ZXJuIGNvbnN0IGNoYXIgYmJfbXNnX2Nhbl9ub3RfY3JlYXRlX3Jhd19zb2NrZXRbXSBBTElHTjE7CitleHRlcm4gY29uc3QgY2hhciBiYl9tc2dfcGVybV9kZW5pZWRfYXJlX3lvdV9yb290W10gQUxJR04xOworZXh0ZXJuIGNvbnN0IGNoYXIgYmJfbXNnX3lvdV9tdXN0X2JlX3Jvb3RbXSBBTElHTjE7CitleHRlcm4gY29uc3QgY2hhciBiYl9tc2dfcmVxdWlyZXNfYXJnW10gQUxJR04xOworZXh0ZXJuIGNvbnN0IGNoYXIgYmJfbXNnX2ludmFsaWRfYXJnW10gQUxJR04xOworZXh0ZXJuIGNvbnN0IGNoYXIgYmJfbXNnX3N0YW5kYXJkX2lucHV0W10gQUxJR04xOworZXh0ZXJuIGNvbnN0IGNoYXIgYmJfbXNnX3N0YW5kYXJkX291dHB1dFtdIEFMSUdOMTsKKworLyogTkI6IChiYl9oZXhkaWdpdHNfdXBjYXNlW2ldIHwgMHgyMCkgLT4gbG93ZXJjYXNlIGhleCBkaWdpdCAqLworZXh0ZXJuIGNvbnN0IGNoYXIgYmJfaGV4ZGlnaXRzX3VwY2FzZVtdIEFMSUdOMTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgYmJfcGF0aF93dG1wX2ZpbGVbXSBBTElHTjE7CisKKy8qIEJ1c3lib3ggbW91bnQgdXNlcyBlaXRoZXIgL3Byb2MvbW91bnRzIG9yIC9ldGMvbXRhYiB0bworICogZ2V0IHRoZSBsaXN0IG9mIGN1cnJlbnRseSBtb3VudGVkIGZpbGVzeXN0ZW1zICovCisjZGVmaW5lIGJiX3BhdGhfbXRhYl9maWxlIElGX0ZFQVRVUkVfTVRBQl9TVVBQT1JUKCIvZXRjL210YWIiKUlGX05PVF9GRUFUVVJFX01UQUJfU1VQUE9SVCgiL3Byb2MvbW91bnRzIikKKworI2RlZmluZSBiYl9wYXRoX3Bhc3N3ZF9maWxlICBfUEFUSF9QQVNTV0QKKyNkZWZpbmUgYmJfcGF0aF9ncm91cF9maWxlICAgX1BBVEhfR1JPVVAKKyNkZWZpbmUgYmJfcGF0aF9zaGFkb3dfZmlsZSAgX1BBVEhfU0hBRE9XCisjZGVmaW5lIGJiX3BhdGhfZ3NoYWRvd19maWxlIF9QQVRIX0dTSEFET1cKKworI2RlZmluZSBiYl9wYXRoX21vdGRfZmlsZSAiL2V0Yy9tb3RkIgorCisjZGVmaW5lIGJiX2Rldl9udWxsICIvZGV2L251bGwiCitleHRlcm4gY29uc3QgY2hhciBiYl9idXN5Ym94X2V4ZWNfcGF0aFtdIEFMSUdOMTsKKy8qIHV0aWwtbGludXggbWFucGFnZSBzYXlzIC9zYmluOi9iaW46L3Vzci9zYmluOi91c3IvYmluLAorICogYnV0IEkgd2FudCB0byBzYXZlIGEgZmV3IGJ5dGVzIGhlcmUgKi8KK2V4dGVybiBjb25zdCBjaGFyIGJiX1BBVEhfcm9vdF9wYXRoW10gQUxJR04xOyAvKiAiUEFUSD0vc2JpbjovdXNyL3NiaW46L2JpbjovdXNyL2JpbiIgKi8KKyNkZWZpbmUgYmJfZGVmYXVsdF9yb290X3BhdGggKGJiX1BBVEhfcm9vdF9wYXRoICsgc2l6ZW9mKCJQQVRIIikpCisjZGVmaW5lIGJiX2RlZmF1bHRfcGF0aCAgICAgIChiYl9QQVRIX3Jvb3RfcGF0aCArIHNpemVvZigiUEFUSD0vc2JpbjovdXNyL3NiaW4iKSkKKworZXh0ZXJuIGNvbnN0IGludCBjb25zdF9pbnRfMDsKKy8vZXh0ZXJuIGNvbnN0IGludCBjb25zdF9pbnRfMTsKKworCisvKiBQcm92aWRpbmcgaGFyZCBndWFyYW50ZWUgb24gbWluaW11bSBzaXplICh0aGluayBvZiBCVUZTSVogPT0gMTI4KSAqLworZW51bSB7IENPTU1PTl9CVUZTSVpFID0gKEJVRlNJWiA+PSAyNTYqc2l6ZW9mKHZvaWQqKSA/IEJVRlNJWisxIDogMjU2KnNpemVvZih2b2lkKikpIH07CitleHRlcm4gY2hhciBiYl9jb21tb25fYnVmc2l6MVtDT01NT05fQlVGU0laRV07CisvKiBUaGlzIHN0cnVjdCBpcyBkZWxpYmVyYXRlbHkgbm90IGRlZmluZWQuICovCisvKiBTZWUgZG9jcy9rZWVwX2RhdGFfc21hbGwudHh0ICovCitzdHJ1Y3QgZ2xvYmFsczsKKy8qICcqY29uc3QnIHB0ciBtYWtlcyBnY2Mgb3B0aW1pemUgY29kZSBtdWNoIGJldHRlci4KKyAqIE1hZ2ljIHByZXZlbnRzIHB0cl90b19nbG9iYWxzIGZyb20gZ29pbmcgaW50byByb2RhdGEuCisgKiBJZiB5b3Ugd2FudCB0byBhc3NpZ24gYSB2YWx1ZSwgdXNlIFNFVF9QVFJfVE9fR0xPQkFMUyh4KSAqLworZXh0ZXJuIHN0cnVjdCBnbG9iYWxzICpjb25zdCBwdHJfdG9fZ2xvYmFsczsKKy8qIEF0IGxlYXN0IGdjYyAzLjQuNiBvbiBtaXBzZWwgc3lzdGVtIG5lZWRzIG9wdGltaXphdGlvbiBiYXJyaWVyICovCisjZGVmaW5lIGJhcnJpZXIoKSBfX2FzbV9fIF9fdm9sYXRpbGVfXygiIjo6OiJtZW1vcnkiKQorI2RlZmluZSBTRVRfUFRSX1RPX0dMT0JBTFMoeCkgZG8geyBcCisJKCooc3RydWN0IGdsb2JhbHMqKikmcHRyX3RvX2dsb2JhbHMpID0gKHZvaWQqKSh4KTsgXAorCWJhcnJpZXIoKTsgXAorfSB3aGlsZSAoMCkKKyNkZWZpbmUgRlJFRV9QVFJfVE9fR0xPQkFMUygpIGRvIHsgXAorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeyBcCisJCWZyZWUocHRyX3RvX2dsb2JhbHMpOyBcCisJfSBcCit9IHdoaWxlICgwKQorCisvKiBZb3UgY2FuIGNoYW5nZSBMSUJCQl9ERUZBVUxUX0xPR0lOX1NIRUxMLCBidXQgZG9uJ3QgdXNlIGl0LAorICogdXNlIGJiX2RlZmF1bHRfbG9naW5fc2hlbGwgYW5kIGZvbGxvd2luZyBkZWZpbmVzLgorICogSWYgeW91IGNoYW5nZSBMSUJCQl9ERUZBVUxUX0xPR0lOX1NIRUxMLAorICogZG9uJ3QgZm9yZ2V0IHRvIGNoYW5nZSBpbmNyZW1lbnQgY29uc3RhbnQuICovCisjZGVmaW5lIExJQkJCX0RFRkFVTFRfTE9HSU5fU0hFTEwgICItL2Jpbi9zaCIKK2V4dGVybiBjb25zdCBjaGFyIGJiX2RlZmF1bHRfbG9naW5fc2hlbGxbXSBBTElHTjE7CisvKiAiL2Jpbi9zaCIgKi8KKyNkZWZpbmUgREVGQVVMVF9TSEVMTCAgICAgICAgICAgICAgKGJiX2RlZmF1bHRfbG9naW5fc2hlbGwrMSkKKy8qICJzaCIgKi8KKyNkZWZpbmUgREVGQVVMVF9TSEVMTF9TSE9SVF9OQU1FICAgKGJiX2RlZmF1bHRfbG9naW5fc2hlbGwrNikKKworLyogVGhlIGZvbGxvd2luZyBkZXZpY2VzIGFyZSB0aGUgc2FtZSBvbiBhbGwgc3lzdGVtcy4gICovCisjZGVmaW5lIENVUlJFTlRfVFRZICIvZGV2L3R0eSIKKyNkZWZpbmUgREVWX0NPTlNPTEUgIi9kZXYvY29uc29sZSIKKworI2lmIGRlZmluZWQoX19GcmVlQlNEX2tlcm5lbF9fKQorIyBkZWZpbmUgQ1VSUkVOVF9WQyBDVVJSRU5UX1RUWQorIyBkZWZpbmUgVkNfMSAiL2Rldi90dHl2MCIKKyMgZGVmaW5lIFZDXzIgIi9kZXYvdHR5djEiCisjIGRlZmluZSBWQ18zICIvZGV2L3R0eXYyIgorIyBkZWZpbmUgVkNfNCAiL2Rldi90dHl2MyIKKyMgZGVmaW5lIFZDXzUgIi9kZXYvdHR5djQiCisjIGRlZmluZSBWQ19GT1JNQVQgIi9kZXYvdHR5diVkIgorI2VsaWYgZGVmaW5lZChfX0dOVV9fKQorIyBkZWZpbmUgQ1VSUkVOVF9WQyBDVVJSRU5UX1RUWQorIyBkZWZpbmUgVkNfMSAiL2Rldi90dHkxIgorIyBkZWZpbmUgVkNfMiAiL2Rldi90dHkyIgorIyBkZWZpbmUgVkNfMyAiL2Rldi90dHkzIgorIyBkZWZpbmUgVkNfNCAiL2Rldi90dHk0IgorIyBkZWZpbmUgVkNfNSAiL2Rldi90dHk1IgorIyBkZWZpbmUgVkNfRk9STUFUICIvZGV2L3R0eSVkIgorI2VsaWYgRU5BQkxFX0ZFQVRVUkVfREVWRlMKKy8qTGludXgsIG9ic29sZXRlIGRldmZzIG5hbWVzICovCisjIGRlZmluZSBDVVJSRU5UX1ZDICIvZGV2L3ZjLzAiCisjIGRlZmluZSBWQ18xICIvZGV2L3ZjLzEiCisjIGRlZmluZSBWQ18yICIvZGV2L3ZjLzIiCisjIGRlZmluZSBWQ18zICIvZGV2L3ZjLzMiCisjIGRlZmluZSBWQ180ICIvZGV2L3ZjLzQiCisjIGRlZmluZSBWQ181ICIvZGV2L3ZjLzUiCisjIGRlZmluZSBWQ19GT1JNQVQgIi9kZXYvdmMvJWQiCisjIGRlZmluZSBMT09QX0ZPUk1BVCAiL2Rldi9sb29wLyV1IgorIyBkZWZpbmUgTE9PUF9OQU1FU0laRSAoc2l6ZW9mKCIvZGV2L2xvb3AvIikgKyBzaXplb2YoaW50KSozICsgMSkKKyMgZGVmaW5lIExPT1BfTkFNRSAiL2Rldi9sb29wLyIKKyMgZGVmaW5lIEZCXzAgIi9kZXYvZmIvMCIKKyNlbHNlCisvKkxpbnV4LCBub3JtYWwgbmFtZXMgKi8KKyMgZGVmaW5lIENVUlJFTlRfVkMgIi9kZXYvdHR5MCIKKyMgZGVmaW5lIFZDXzEgIi9kZXYvdHR5MSIKKyMgZGVmaW5lIFZDXzIgIi9kZXYvdHR5MiIKKyMgZGVmaW5lIFZDXzMgIi9kZXYvdHR5MyIKKyMgZGVmaW5lIFZDXzQgIi9kZXYvdHR5NCIKKyMgZGVmaW5lIFZDXzUgIi9kZXYvdHR5NSIKKyMgZGVmaW5lIFZDX0ZPUk1BVCAiL2Rldi90dHklZCIKKyMgZGVmaW5lIExPT1BfRk9STUFUICIvZGV2L2xvb3AldSIKKyMgZGVmaW5lIExPT1BfTkFNRVNJWkUgKHNpemVvZigiL2Rldi9sb29wIikgKyBzaXplb2YoaW50KSozICsgMSkKKyMgZGVmaW5lIExPT1BfTkFNRSAiL2Rldi9sb29wIgorIyBkZWZpbmUgRkJfMCAiL2Rldi9mYjAiCisjZW5kaWYKKworCisjZGVmaW5lIEFSUkFZX1NJWkUoeCkgKCh1bnNpZ25lZCkoc2l6ZW9mKHgpIC8gc2l6ZW9mKCh4KVswXSkpKQorCisKKy8qIFdlIHJlZGVmaW5lIGN0eXBlIG1hY3Jvcy4gVW5pY29kZS1jb3JyZWN0IGhhbmRsaW5nIG9mIGNoYXIgdHlwZXMKKyAqIGNhbid0IGJlIGRvbmUgd2l0aCBzdWNoIGJ5dGUtb3JpZW50ZWQgb3BlcmF0aW9ucyBhbnl3YXksCisgKiB3ZSBkb24ndCBsb3NlIGFueXRoaW5nLgorICovCisjdW5kZWYgaXNhbG51bQorI3VuZGVmIGlzYWxwaGEKKyN1bmRlZiBpc2FzY2lpCisjdW5kZWYgaXNibGFuaworI3VuZGVmIGlzY250cmwKKyN1bmRlZiBpc2RpZ2l0CisjdW5kZWYgaXNncmFwaAorI3VuZGVmIGlzbG93ZXIKKyN1bmRlZiBpc3ByaW50CisjdW5kZWYgaXNwdW5jdAorI3VuZGVmIGlzc3BhY2UKKyN1bmRlZiBpc3VwcGVyCisjdW5kZWYgaXN4ZGlnaXQKKyN1bmRlZiB0b3VwcGVyCisjdW5kZWYgdG9sb3dlcgorCisvKiBXZSBzYXZlIH41MDAgYnl0ZXMgb24gaXNkaWdpdCBhbG9uZS4KKyAqIEJUVywgeDg2IGxpa2VzICh1bnNpZ25lZCBjaGFyKSBjYXN0IG1vcmUgdGhhbiAodW5zaWduZWQpLiAqLworCisvKiBUaGVzZSB3b3JrIHRoZSBzYW1lIGZvciBBU0NJSSBhbmQgVW5pY29kZSwKKyAqIGFzc3VtaW5nIG5vIG9uZSBhc2tzICJpcyB0aGlzIGEgKlVuaWNvZGUqIGxldHRlcj8iIHVzaW5nIGlzYWxwaGEobGV0dGVyKSAqLworI2RlZmluZSBpc2FzY2lpKGEpICgodW5zaWduZWQgY2hhcikoYSkgPD0gMHg3ZikKKyNkZWZpbmUgaXNkaWdpdChhKSAoKHVuc2lnbmVkIGNoYXIpKChhKSAtICcwJykgPD0gOSkKKyNkZWZpbmUgaXN1cHBlcihhKSAoKHVuc2lnbmVkIGNoYXIpKChhKSAtICdBJykgPD0gKCdaJyAtICdBJykpCisjZGVmaW5lIGlzbG93ZXIoYSkgKCh1bnNpZ25lZCBjaGFyKSgoYSkgLSAnYScpIDw9ICgneicgLSAnYScpKQorI2RlZmluZSBpc2FscGhhKGEpICgodW5zaWduZWQgY2hhcikoKChhKXwweDIwKSAtICdhJykgPD0gKCd6JyAtICdhJykpCisjZGVmaW5lIGlzYmxhbmsoYSkgKHsgdW5zaWduZWQgY2hhciBiYl9faXNibGFuayA9IChhKTsgYmJfX2lzYmxhbmsgPT0gJyAnIHx8IGJiX19pc2JsYW5rID09ICdcdCc7IH0pCisjZGVmaW5lIGlzY250cmwoYSkgKHsgdW5zaWduZWQgY2hhciBiYl9faXNjbnRybCA9IChhKTsgYmJfX2lzY250cmwgPCAnICcgfHwgYmJfX2lzY250cmwgPT0gMHg3ZjsgfSkKKy8qIEluIFBPU0lYL0MgbG9jYWxlIGlzc3BhY2UgaXMgb25seSB0aGVzZSBjaGFyczogIlx0XG5cdlxmXHIiIGFuZCBzcGFjZS4KKyAqICJcdFxuXHZcZlxyIiBoYXBwZW4gdG8gaGF2ZSBBU0NJSSBjb2RlcyA5LDEwLDExLDEyLDEzLgorICovCisjZGVmaW5lIGlzc3BhY2UoYSkgKHsgdW5zaWduZWQgY2hhciBiYl9faXNzcGFjZSA9IChhKSAtIDk7IGJiX19pc3NwYWNlID09ICgnICcgLSA5KSB8fCBiYl9faXNzcGFjZSA8PSAoMTMgLSA5KTsgfSkKKy8vIFVuc2FmZSB3cnQgTlVMOiAjZGVmaW5lIGlzcHVuY3QoYSkgKHN0cmNocigiIVwiIyQlJicoKSorLC0uLzo7PD0+P0BbXFxdXl9ge3x9fiIsIChhKSkgIT0gTlVMTCkKKyNkZWZpbmUgaXNwdW5jdChhKSAoc3RyY2hybnVsKCIhXCIjJCUmJygpKissLS4vOjs8PT4/QFtcXF1eX2B7fH1+IiwgKGEpKVswXSkKKy8vIEJpZ2dlciBjb2RlOiAjZGVmaW5lIGlzYWxudW0oYSkgKHsgdW5zaWduZWQgY2hhciBiYl9faXNhbG51bSA9IChhKSAtICcwJzsgYmJfX2lzYWxudW0gPD0gOSB8fCAoKGJiX19pc2FsbnVtIC0gKCdBJyAtICcwJykpICYgMHhkZikgPD0gMjU7IH0pCisjZGVmaW5lIGlzYWxudW0oYSkgYmJfYXNjaWlfaXNhbG51bShhKQorc3RhdGljIEFMV0FZU19JTkxJTkUgaW50IGJiX2FzY2lpX2lzYWxudW0odW5zaWduZWQgY2hhciBhKQoreworCXVuc2lnbmVkIGNoYXIgYiA9IGEgLSAnMCc7CisJaWYgKGIgPD0gOSkKKwkJcmV0dXJuIChiIDw9IDkpOworCWIgPSAoYXwweDIwKSAtICdhJzsKKwlyZXR1cm4gYiA8PSAneicgLSAnYSc7Cit9CisjZGVmaW5lIGlzeGRpZ2l0KGEpIGJiX2FzY2lpX2lzeGRpZ2l0KGEpCitzdGF0aWMgQUxXQVlTX0lOTElORSBpbnQgYmJfYXNjaWlfaXN4ZGlnaXQodW5zaWduZWQgY2hhciBhKQoreworCXVuc2lnbmVkIGNoYXIgYiA9IGEgLSAnMCc7CisJaWYgKGIgPD0gOSkKKwkJcmV0dXJuIChiIDw9IDkpOworCWIgPSAoYXwweDIwKSAtICdhJzsKKwlyZXR1cm4gYiA8PSAnZicgLSAnYSc7Cit9CisjZGVmaW5lIHRvdXBwZXIoYSkgYmJfYXNjaWlfdG91cHBlcihhKQorc3RhdGljIEFMV0FZU19JTkxJTkUgdW5zaWduZWQgY2hhciBiYl9hc2NpaV90b3VwcGVyKHVuc2lnbmVkIGNoYXIgYSkKK3sKKwl1bnNpZ25lZCBjaGFyIGIgPSBhIC0gJ2EnOworCWlmIChiIDw9ICgneicgLSAnYScpKQorCQlhIC09ICdhJyAtICdBJzsKKwlyZXR1cm4gYTsKK30KKyNkZWZpbmUgdG9sb3dlcihhKSBiYl9hc2NpaV90b2xvd2VyKGEpCitzdGF0aWMgQUxXQVlTX0lOTElORSB1bnNpZ25lZCBjaGFyIGJiX2FzY2lpX3RvbG93ZXIodW5zaWduZWQgY2hhciBhKQoreworCXVuc2lnbmVkIGNoYXIgYiA9IGEgLSAnQSc7CisJaWYgKGIgPD0gKCdaJyAtICdBJykpCisJCWEgKz0gJ2EnIC0gJ0EnOworCXJldHVybiBhOworfQorCisvKiBJbiBBU0NJSSBhbmQgVW5pY29kZSwgdGhlc2UgYXJlIGxpa2VseSB0byBiZSB2ZXJ5IGRpZmZlcmVudC4KKyAqIExldCdzIHByZXZlbnQgYW1iaWd1b3VzIHVzYWdlIGZyb20gdGhlIHN0YXJ0ICovCisjZGVmaW5lIGlzZ3JhcGgoYSkgaXNncmFwaF9pc19hbWJpZ3VvdXNfZG9udF91c2UoYSkKKyNkZWZpbmUgaXNwcmludChhKSBpc3ByaW50X2lzX2FtYmlndW91c19kb250X3VzZShhKQorLyogTkI6IG11c3Qgbm90IHRyZWF0IEVPRiBhcyBpc2dyYXBoIG9yIGlzcHJpbnQgKi8KKyNkZWZpbmUgaXNncmFwaF9hc2NpaW9ubHkoYSkgKCh1bnNpZ25lZCkoKGEpIC0gMHgyMSkgPD0gMHg3ZSAtIDB4MjEpCisjZGVmaW5lIGlzcHJpbnRfYXNjaWlvbmx5KGEpICgodW5zaWduZWQpKChhKSAtIDB4MjApIDw9IDB4N2UgLSAweDIwKQorCisKKy8qIFNpbXBsZSB1bml0LXRlc3RpbmcgZnJhbWV3b3JrICovCisKK3R5cGVkZWYgdm9pZCAoKmJidW5pdF90ZXN0ZnVuYykodm9pZCk7CisKK3N0cnVjdCBiYnVuaXRfbGlzdGVsZW0geworCWNvbnN0IGNoYXIqIG5hbWU7CisJYmJ1bml0X3Rlc3RmdW5jIHRlc3RmdW5jOworfTsKKwordm9pZCBiYnVuaXRfcmVnaXN0ZXJ0ZXN0KHN0cnVjdCBiYnVuaXRfbGlzdGVsZW0qIHRlc3QpOwordm9pZCBiYnVuaXRfc2V0dGVzdGZhaWxlZCh2b2lkKTsKKworI2RlZmluZSBCQlVOSVRfREVGSU5FX1RFU1QoTkFNRSkgXAorCXN0YXRpYyB2b2lkIGJidW5pdF8jI05BTUUjI190ZXN0KHZvaWQpOyBcCisJc3RhdGljIHN0cnVjdCBiYnVuaXRfbGlzdGVsZW0gYmJ1bml0XyMjTkFNRSMjX2VsZW0gPSB7IFwKKwkJLm5hbWUgPSAjTkFNRSwgXAorCQkudGVzdGZ1bmMgPSBiYnVuaXRfIyNOQU1FIyNfdGVzdCwgXAorCX07IFwKKwlzdGF0aWMgdm9pZCBJTklUX0ZVTkMgYmJ1bml0XyMjTkFNRSMjX3JlZ2lzdGVyKHZvaWQpIFwKKwl7IFwKKwkJYmJ1bml0X3JlZ2lzdGVydGVzdCgmYmJ1bml0XyMjTkFNRSMjX2VsZW0pOyBcCisJfSBcCisJc3RhdGljIHZvaWQgYmJ1bml0XyMjTkFNRSMjX3Rlc3Qodm9pZCkKKworLyoKKyAqIEJvdGggJ2dvdG8gYmJ1bml0X2VuZCcgYW5kICdicmVhaycgYXJlIGhlcmUgb25seSB0byBnZXQgcmlkCisgKiBvZiBjb21waWxlciB3YXJuaW5ncy4KKyAqLworI2RlZmluZSBCQlVOSVRfRU5EVEVTVCBcCisJZG8geyBcCisJCWdvdG8gYmJ1bml0X2VuZDsgXAorCWJidW5pdF9lbmQ6IFwKKwkJYnJlYWs7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEJCVU5JVF9QUklOVEFTU0VSVEZBSUwgXAorCWRvIHsgXAorCQliYl9lcnJvcl9tc2coIFwKKwkJCSJbRVJST1JdIEFzc2VydGlvbiBmYWlsZWQgaW4gZmlsZSAlcywgbGluZSAlZCIsIFwKKwkJCV9fRklMRV9fLCBfX0xJTkVfXyk7IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEJCVU5JVF9BU1NFUlRJT05fRkFJTEVEIFwKKwlkbyB7IFwKKwkJYmJ1bml0X3NldHRlc3RmYWlsZWQoKTsgXAorCQlnb3RvIGJidW5pdF9lbmQ7IFwKKwl9IHdoaWxlICgwKQorCisvKgorICogQXNzZXJ0aW9ucy4KKyAqIEZvciBub3cgd2Ugb25seSBvZmZlciBhc3NlcnRpb25zIHdoaWNoIGNhdXNlIHRlc3RzIHRvIGZhaWwKKyAqIGltbWVkaWF0ZWx5LiBJbiB0aGUgZnV0dXJlICdleHBlY3RzJyBtaWdodCBiZSBhZGRlZCB0b28gLQorICogc2ltaWxhciB0byB0aG9zZSBvZmZlcmVkIGJ5IHRoZSBndGVzdCBmcmFtZXdvcmsuCisgKi8KKyNkZWZpbmUgQkJVTklUX0FTU0VSVF9FUShFWFBFQ1RFRCwgQUNUVUFMKSBcCisJZG8geyBcCisJCWlmICgoRVhQRUNURUQpICE9IChBQ1RVQUwpKSB7IFwKKwkJCUJCVU5JVF9QUklOVEFTU0VSVEZBSUw7IFwKKwkJCWJiX2Vycm9yX21zZygiW0VSUk9SXSAnJXMnIGlzbid0IGVxdWFsIHRvICclcyciLCBcCisJCQkJCQkjRVhQRUNURUQsICNBQ1RVQUwpOyBcCisJCQlCQlVOSVRfQVNTRVJUSU9OX0ZBSUxFRDsgXAorCQl9IFwKKwl9IHdoaWxlICgwKQorCisjZGVmaW5lIEJCVU5JVF9BU1NFUlRfTk9URVEoRVhQRUNURUQsIEFDVFVBTCkgXAorCWRvIHsgXAorCQlpZiAoKEVYUEVDVEVEKSA9PSAoQUNUVUFMKSkgeyBcCisJCQlCQlVOSVRfUFJJTlRBU1NFUlRGQUlMOyBcCisJCQliYl9lcnJvcl9tc2coIltFUlJPUl0gJyVzJyBpcyBlcXVhbCB0byAnJXMnIiwgXAorCQkJCQkJI0VYUEVDVEVELCAjQUNUVUFMKTsgXAorCQkJQkJVTklUX0FTU0VSVElPTl9GQUlMRUQ7IFwKKwkJfSBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBCQlVOSVRfQVNTRVJUX05PVE5VTEwoUFRSKSBcCisJZG8geyBcCisJCWlmICgoUFRSKSA9PSBOVUxMKSB7IFwKKwkJCUJCVU5JVF9QUklOVEFTU0VSVEZBSUw7IFwKKwkJCWJiX2Vycm9yX21zZygiW0VSUk9SXSAnJXMnIGlzIE5VTEwhIiwgI1BUUik7IFwKKwkJCUJCVU5JVF9BU1NFUlRJT05fRkFJTEVEOyBcCisJCX0gXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgQkJVTklUX0FTU0VSVF9OVUxMKFBUUikgXAorCWRvIHsgXAorCQlpZiAoKFBUUikgIT0gTlVMTCkgeyBcCisJCQlCQlVOSVRfUFJJTlRBU1NFUlRGQUlMOyBcCisJCQliYl9lcnJvcl9tc2coIltFUlJPUl0gJyVzJyBpcyBub3QgTlVMTCEiLCAjUFRSKTsgXAorCQkJQkJVTklUX0FTU0VSVElPTl9GQUlMRUQ7IFwKKwkJfSBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBCQlVOSVRfQVNTRVJUX0ZBTFNFKFNUQVRFTUVOVCkgXAorCWRvIHsgXAorCQlpZiAoKFNUQVRFTUVOVCkpIHsgXAorCQkJQkJVTklUX1BSSU5UQVNTRVJURkFJTDsgXAorCQkJYmJfZXJyb3JfbXNnKCJbRVJST1JdIFN0YXRlbWVudCAnJXMnIGV2YWx1YXRlZCB0byB0cnVlISIsIFwKKwkJCQkJCQkJI1NUQVRFTUVOVCk7IFwKKwkJCUJCVU5JVF9BU1NFUlRJT05fRkFJTEVEOyBcCisJCX0gXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgQkJVTklUX0FTU0VSVF9UUlVFKFNUQVRFTUVOVCkgXAorCWRvIHsgXAorCQlpZiAoIShTVEFURU1FTlQpKSB7IFwKKwkJCUJCVU5JVF9QUklOVEFTU0VSVEZBSUw7IFwKKwkJCWJiX2Vycm9yX21zZygiW0VSUk9SXSBTdGF0ZW1lbnQgJyVzJyBldmFsdWF0ZWQgdG8gZmFsc2UhIiwgXAorCQkJCQkjU1RBVEVNRU5UKTsgXAorCQkJQkJVTklUX0FTU0VSVElPTl9GQUlMRUQ7IFwKKwkJfSBcCisJfSB3aGlsZSAoMCkKKworI2RlZmluZSBCQlVOSVRfQVNTRVJUX1NUUkVRKFNUUjEsIFNUUjIpIFwKKwlkbyB7IFwKKwkJaWYgKHN0cmNtcChTVFIxLCBTVFIyKSAhPSAwKSB7IFwKKwkJCUJCVU5JVF9QUklOVEFTU0VSVEZBSUw7IFwKKwkJCWJiX2Vycm9yX21zZygiW0VSUk9SXSBTdHJpbmdzICclcycgYW5kICclcycgIiBcCisJCQkJCSJhcmUgbm90IHRoZSBzYW1lIiwgU1RSMSwgU1RSMik7IFwKKwkJCUJCVU5JVF9BU1NFUlRJT05fRkFJTEVEOyBcCisJCX0gXAorCX0gd2hpbGUgKDApCisKKyNkZWZpbmUgQkJVTklUX0FTU0VSVF9TVFJOT1RFUShTVFIxLCBTVFIyKSBcCisJZG8geyBcCisJCWlmIChzdHJjbXAoU1RSMSwgU1RSMikgPT0gMCkgeyBcCisJCQlCQlVOSVRfUFJJTlRBU1NFUlRGQUlMOyBcCisJCQliYl9lcnJvcl9tc2coIltFUlJPUl0gU3RyaW5ncyAnJXMnIGFuZCAnJXMnICIgXAorCQkJCQkiYXJlIHRoZSBzYW1lLCBidXQgd2VyZSAiIFwKKwkJCQkJImV4cGVjdGVkIHRvIGRpZmZlciIsIFNUUjEsIFNUUjIpOyBcCisJCQlCQlVOSVRfQVNTRVJUSU9OX0ZBSUxFRDsgXAorCQl9IFwKKwl9IHdoaWxlICgwKQorCisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saWJsem9faW50ZXJmYWNlLmggYi9pbmNsdWRlL2xpYmx6b19pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2YxYjYzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saWJsem9faW50ZXJmYWNlLmgKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMWk8gcmVhbC10aW1lIGRhdGEgY29tcHJlc3Npb24gbGlicmFyeS4KKworICAgQ29weXJpZ2h0IChDKSAxOTk2Li4yMDA4IE1hcmt1cyBGcmFueiBYYXZlciBKb2hhbm5lcyBPYmVyaHVtZXIKKyAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisKKyAgIE1hcmt1cyBGLlguSi4gT2Jlcmh1bWVyIDxtYXJrdXNAb2Jlcmh1bWVyLmNvbT4KKyAgIGh0dHA6Ly93d3cub2Jlcmh1bWVyLmNvbS9vcGVuc291cmNlL2x6by8KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKKyAgIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCisgICB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhlIExaTyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhlIExaTyBsaWJyYXJ5OyBzZWUgdGhlIGZpbGUgQ09QWUlORy4KKyAgIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAgIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBLgorICovCisKKyNkZWZpbmUgTFpPMVgKKyN1bmRlZiBMWk8xWQorCisjdW5kZWYgYXNzZXJ0CisvKgorc3RhdGljIHZvaWQgZGllX2F0KGludCBsaW5lKQoreworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnRlcm5hbCBlcnJvciBhdCAlZCIsIGxpbmUpOworfQorI2RlZmluZSBhc3NlcnQodikgaWYgKCEodikpIGRpZV9hdChfX0xJTkVfXykKKyovCisjZGVmaW5lIGFzc2VydCh2KSAoKHZvaWQpMCkKKworaW50IGx6bzF4XzFfY29tcHJlc3MoY29uc3QgdWludDhfdCogc3JjLCB1bnNpZ25lZCBzcmNfbGVuLAorCQl1aW50OF90KiBkc3QsIHVuc2lnbmVkKiBkc3RfbGVuLAorCQl2b2lkKiB3cmttZW0pOworaW50IGx6bzF4XzFfMTVfY29tcHJlc3MoY29uc3QgdWludDhfdCogc3JjLCB1bnNpZ25lZCBzcmNfbGVuLAorCQl1aW50OF90KiBkc3QsIHVuc2lnbmVkKiBkc3RfbGVuLAorCQl2b2lkKiB3cmttZW0pOworaW50IGx6bzF4Xzk5OV9jb21wcmVzc19sZXZlbChjb25zdCB1aW50OF90KiBpbiwgdW5zaWduZWQgaW5fbGVuLAorCQl1aW50OF90KiBvdXQsIHVuc2lnbmVkKiBvdXRfbGVuLAorCQl2b2lkKiB3cmttZW0sCisJCWludCBjb21wcmVzc2lvbl9sZXZlbCk7CisKKy8qIGRlY29tcHJlc3Npb24gKi8KKy8vaW50IGx6bzF4X2RlY29tcHJlc3MoY29uc3QgdWludDhfdCogc3JjLCB1bnNpZ25lZCBzcmNfbGVuLAorLy8JCXVpbnQ4X3QqIGRzdCwgdW5zaWduZWQqIGRzdF9sZW4sCisvLwkJdm9pZCogd3JrbWVtIC8qIE5PVCBVU0VEICovKTsKKy8qIHNhZmUgZGVjb21wcmVzc2lvbiB3aXRoIG92ZXJydW4gdGVzdGluZyAqLworaW50IGx6bzF4X2RlY29tcHJlc3Nfc2FmZShjb25zdCB1aW50OF90KiBzcmMsIHVuc2lnbmVkIHNyY19sZW4sCisJCXVpbnQ4X3QqIGRzdCwgdW5zaWduZWQqIGRzdF9sZW4sCisJCXZvaWQqIHdya21lbSAvKiBOT1QgVVNFRCAqLyk7CisKKyNkZWZpbmUgTFpPX0VfT0sgICAgICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgTFpPX0VfRVJST1IgICAgICAgICAgICAgICAgICgtMSkKKyNkZWZpbmUgTFpPX0VfT1VUX09GX01FTU9SWSAgICAgICAgICgtMikgICAgLyogW25vdCB1c2VkIHJpZ2h0IG5vd10gKi8KKyNkZWZpbmUgTFpPX0VfTk9UX0NPTVBSRVNTSUJMRSAgICAgICgtMykgICAgLyogW25vdCB1c2VkIHJpZ2h0IG5vd10gKi8KKyNkZWZpbmUgTFpPX0VfSU5QVVRfT1ZFUlJVTiAgICAgICAgICgtNCkKKyNkZWZpbmUgTFpPX0VfT1VUUFVUX09WRVJSVU4gICAgICAgICgtNSkKKyNkZWZpbmUgTFpPX0VfTE9PS0JFSElORF9PVkVSUlVOICAgICgtNikKKyNkZWZpbmUgTFpPX0VfRU9GX05PVF9GT1VORCAgICAgICAgICgtNykKKyNkZWZpbmUgTFpPX0VfSU5QVVRfTk9UX0NPTlNVTUVEICAgICgtOCkKKyNkZWZpbmUgTFpPX0VfTk9UX1lFVF9JTVBMRU1FTlRFRCAgICgtOSkgICAgLyogW25vdCB1c2VkIHJpZ2h0IG5vd10gKi8KKworLyogbHpvLTIuMDMvaW5jbHVkZS9sem8vbHpvY29uZi5oICovCisjZGVmaW5lIExaT19WRVJTSU9OICAgMHgyMDMwCmRpZmYgLS1naXQgYS9pbmNsdWRlL3BsYXRmb3JtLmggYi9pbmNsdWRlL3BsYXRmb3JtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwNmIxOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcGxhdGZvcm0uaApAQCAtMCwwICsxLDU3OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IDIwMDYsIEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpZm5kZWYgQkJfUExBVEZPUk1fSAorI2RlZmluZSBCQl9QTEFURk9STV9IIDEKKworCisvKiBDb252ZW5pZW5jZSBtYWNyb3MgdG8gdGVzdCB0aGUgdmVyc2lvbiBvZiBnY2MuICovCisjdW5kZWYgX19HTlVDX1BSRVJFUQorI2lmIGRlZmluZWQgX19HTlVDX18gJiYgZGVmaW5lZCBfX0dOVUNfTUlOT1JfXworIyBkZWZpbmUgX19HTlVDX1BSRVJFUShtYWosIG1pbikgXAorCQkoKF9fR05VQ19fIDw8IDE2KSArIF9fR05VQ19NSU5PUl9fID49ICgobWFqKSA8PCAxNikgKyAobWluKSkKKyNlbHNlCisjIGRlZmluZSBfX0dOVUNfUFJFUkVRKG1haiwgbWluKSAwCisjZW5kaWYKKworLyogX19yZXN0cmljdCBpcyBrbm93biBpbiBFR0NTIDEuMiBhbmQgYWJvdmUuICovCisjaWYgIV9fR05VQ19QUkVSRVEoMiw5MikKKyMgaWZuZGVmIF9fcmVzdHJpY3QKKyMgIGRlZmluZSBfX3Jlc3RyaWN0CisjIGVuZGlmCisjZW5kaWYKKworI2lmICFfX0dOVUNfUFJFUkVRKDIsNykKKyMgaWZuZGVmIF9fYXR0cmlidXRlX18KKyMgIGRlZmluZSBfX2F0dHJpYnV0ZV9fKHgpCisjIGVuZGlmCisjZW5kaWYKKworI3VuZGVmIGlubGluZQorI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgX19TVERDX1ZFUlNJT05fXyA+IDE5OTkwMUwKKy8qIGl0J3MgYSBrZXl3b3JkICovCisjZWxpZiBfX0dOVUNfUFJFUkVRKDIsNykKKyMgZGVmaW5lIGlubGluZSBfX2lubGluZV9fCisjZWxzZQorIyBkZWZpbmUgaW5saW5lCisjZW5kaWYKKworI2lmbmRlZiBfX2NvbnN0CisjIGRlZmluZSBfX2NvbnN0IGNvbnN0CisjZW5kaWYKKworI2RlZmluZSBVTlVTRURfUEFSQU0gX19hdHRyaWJ1dGVfXyAoKF9fdW51c2VkX18pKQorI2RlZmluZSBOT1JFVFVSTiBfX2F0dHJpYnV0ZV9fICgoX19ub3JldHVybl9fKSkKKy8qICJUaGUgbWFsbG9jIGF0dHJpYnV0ZSBpcyB1c2VkIHRvIHRlbGwgdGhlIGNvbXBpbGVyIHRoYXQgYSBmdW5jdGlvbgorICogbWF5IGJlIHRyZWF0ZWQgYXMgaWYgYW55IG5vbi1OVUxMIHBvaW50ZXIgaXQgcmV0dXJucyBjYW5ub3QgYWxpYXMKKyAqIGFueSBvdGhlciBwb2ludGVyIHZhbGlkIHdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMuIFRoaXMgd2lsbCBvZnRlbgorICogaW1wcm92ZSBvcHRpbWl6YXRpb24uIFN0YW5kYXJkIGZ1bmN0aW9ucyB3aXRoIHRoaXMgcHJvcGVydHkgaW5jbHVkZQorICogbWFsbG9jIGFuZCBjYWxsb2MuIHJlYWxsb2MtbGlrZSBmdW5jdGlvbnMgaGF2ZSB0aGlzIHByb3BlcnR5IGFzIGxvbmcKKyAqIGFzIHRoZSBvbGQgcG9pbnRlciBpcyBuZXZlciByZWZlcnJlZCB0byAoaW5jbHVkaW5nIGNvbXBhcmluZyBpdAorICogdG8gdGhlIG5ldyBwb2ludGVyKSBhZnRlciB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIG5vbi1OVUxMIHZhbHVlLiIKKyAqLworI2RlZmluZSBSRVRVUk5TX01BTExPQyBfX2F0dHJpYnV0ZV9fICgobWFsbG9jKSkKKyNkZWZpbmUgUEFDS0VEIF9fYXR0cmlidXRlX18gKChfX3BhY2tlZF9fKSkKKyNkZWZpbmUgQUxJR05FRChtKSBfX2F0dHJpYnV0ZV9fICgoX19hbGlnbmVkX18obSkpKQorCisvKiBfX05PX0lOTElORV9fOiBzb21lIGdjYydzIGRvIG5vdCBob25vciBpbmxpbmluZyEgOiggKi8KKyNpZiBfX0dOVUNfUFJFUkVRKDMsMCkgJiYgIWRlZmluZWQoX19OT19JTkxJTkVfXykKKyMgZGVmaW5lIEFMV0FZU19JTkxJTkUgX19hdHRyaWJ1dGVfXyAoKGFsd2F5c19pbmxpbmUpKSBpbmxpbmUKKy8qIEkndmUgc2VlbiBhIHRvb2xjaGFpbiB3aGVyZSBJIG5lZWRlZCBfX25vaW5saW5lX18gaW5zdGVhZCBvZiBub2lubGluZSAqLworIyBkZWZpbmUgTk9JTkxJTkUgICAgICBfX2F0dHJpYnV0ZV9fKChfX25vaW5saW5lX18pKQorIyBpZiAhRU5BQkxFX1dFUlJPUgorIyAgZGVmaW5lIERFUFJFQ0FURUQgX19hdHRyaWJ1dGVfXyAoKF9fZGVwcmVjYXRlZF9fKSkKKyMgIGRlZmluZSBVTlVTRURfUEFSQU1fUkVTVUxUIF9fYXR0cmlidXRlX18gKCh3YXJuX3VudXNlZF9yZXN1bHQpKQorIyBlbHNlCisjICBkZWZpbmUgREVQUkVDQVRFRAorIyAgZGVmaW5lIFVOVVNFRF9QQVJBTV9SRVNVTFQKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBBTFdBWVNfSU5MSU5FIGlubGluZQorIyBkZWZpbmUgTk9JTkxJTkUKKyMgZGVmaW5lIERFUFJFQ0FURUQKKyMgZGVmaW5lIFVOVVNFRF9QQVJBTV9SRVNVTFQKKyNlbmRpZgorCisvKiB1c2VkIGJ5IHVuaXQgdGVzdCBtYWNoaW5lcnkgdG8gcnVuIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbnMgYmVmb3JlIGNhbGxpbmcgbWFpbigpICovCisjZGVmaW5lIElOSVRfRlVOQyBfX2F0dHJpYnV0ZV9fICgoY29uc3RydWN0b3IpKQorCisvKiAtZndob2xlLXByb2dyYW0gbWFrZXMgYWxsIHN5bWJvbHMgbG9jYWwuIFRoZSBhdHRyaWJ1dGUgZXh0ZXJuYWxseV92aXNpYmxlCisgKiBmb3JjZXMgYSBzeW1ib2wgZ2xvYmFsLiAgKi8KKyNpZiBfX0dOVUNfUFJFUkVRKDQsMSkKKyMgZGVmaW5lIEVYVEVSTkFMTFlfVklTSUJMRSBfX2F0dHJpYnV0ZV9fKCggdmlzaWJpbGl0eSgiZGVmYXVsdCIpICkpCisvL19fYXR0cmlidXRlX18gKChfX2V4dGVybmFsbHlfdmlzaWJsZV9fKSkKKyNlbHNlCisjIGRlZmluZSBFWFRFUk5BTExZX1ZJU0lCTEUKKyNlbmRpZgorCisvKiBBdCA0LjQgZ2NjIGJlY29tZSBtdWNoIG1vcmUgYW5hbCBhYm91dCB0aGlzLCBuZWVkIHRvIHVzZSAiYWxpYXNlZCIgdHlwZXMgKi8KKyNpZiBfX0dOVUNfUFJFUkVRKDQsNCkKKyMgZGVmaW5lIEZJWF9BTElBU0lORyBfX2F0dHJpYnV0ZV9fKChfX21heV9hbGlhc19fKSkKKyNlbHNlCisjIGRlZmluZSBGSVhfQUxJQVNJTkcKKyNlbmRpZgorCisvKiBXZSB1c2UgX19leHRlbnNpb25fXyBpbiBzb21lIHBsYWNlcyB0byBzdXBwcmVzcyAtcGVkYW50aWMgd2FybmluZ3MKKyAqIGFib3V0IEdDQyBleHRlbnNpb25zLiAgVGhpcyBmZWF0dXJlIGRpZG4ndCB3b3JrIHByb3Blcmx5IGJlZm9yZQorICogZ2NjIDIuOC4gICovCisjaWYgIV9fR05VQ19QUkVSRVEoMiw4KQorIyBpZm5kZWYgX19leHRlbnNpb25fXworIyAgZGVmaW5lIF9fZXh0ZW5zaW9uX18KKyMgZW5kaWYKKyNlbmRpZgorCisvKiBGQVNUX0ZVTkMgaXMgYSBxdWFsaWZpZXIgd2hpY2ggKHBvc3NpYmx5KSBtYWtlcyBmdW5jdGlvbiBjYWxsIGZhc3RlcgorICogYW5kL29yIHNtYWxsZXIgYnkgdXNpbmcgbW9kaWZpZWQgQUJJLiBJdCBpcyB1c3VhbGx5IG9ubHkgbmVlZGVkCisgKiBvbiBub24tc3RhdGljLCBidXN5Ym94IGludGVybmFsIGZ1bmN0aW9ucy4gUmVjZW50IHZlcnNpb25zIG9mIGdjYworICogb3B0aW1pemUgc3RhdGljcyBhdXRvbWF0aWNhbGx5LiBGQVNUX0ZVTkMgb24gc3RhdGljIGlzIHJlcXVpcmVkCisgKiBvbmx5IGlmIHlvdSBuZWVkIHRvIG1hdGNoIGEgZnVuY3Rpb24gcG9pbnRlcidzIHR5cGUgKi8KKyNpZiBfX0dOVUNfUFJFUkVRKDMsMCkgJiYgZGVmaW5lZChpMzg2KSAvKiB8fCBkZWZpbmVkKF9feDg2XzY0X18pPyAqLworLyogc3RkY2FsbCBtYWtlcyBjYWxsZWUgdG8gcG9wIGFyZ3VtZW50cyBmcm9tIHN0YWNrLCBub3QgY2FsbGVyICovCisjIGRlZmluZSBGQVNUX0ZVTkMgX19hdHRyaWJ1dGVfXygocmVncGFybSgzKSxzdGRjYWxsKSkKKy8qICNlbGlmIC4uLiAtIGFkZCB5b3VyIGZhdm9yaXRlIGFyY2ggdG9kYXkhICovCisjZWxzZQorIyBkZWZpbmUgRkFTVF9GVU5DCisjZW5kaWYKKworLyogTWFrZSBhbGwgZGVjbGFyYXRpb25zIGhpZGRlbiAoLWZ2aXNpYmlsaXR5IGZsYWcgb25seSBhZmZlY3RzIGRlZmluaXRpb25zKSAqLworLyogKGRvbid0IGluY2x1ZGUgc3lzdGVtIGhlYWRlcnMgYWZ0ZXIgdGhpcyB1bnRpbCBjb3JyZXNwb25kaW5nIHBvcCEpICovCisjaWYgX19HTlVDX1BSRVJFUSg0LDEpICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCisjIGRlZmluZSBQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4gX1ByYWdtYSgiR0NDIHZpc2liaWxpdHkgcHVzaChoaWRkZW4pIikKKyMgZGVmaW5lIFBPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZICAgICAgICAgICAgICBfUHJhZ21hKCJHQ0MgdmlzaWJpbGl0eSBwb3AiKQorI2Vsc2UKKyMgZGVmaW5lIFBVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorIyBkZWZpbmUgUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKyNlbmRpZgorCisvKiBnY2MtMi45NSBoYWQgbm8gdmFfY29weSBidXQgb25seSBfX3ZhX2NvcHkuICovCisjaWYgIV9fR05VQ19QUkVSRVEoMywwKQorIyBpbmNsdWRlIDxzdGRhcmcuaD4KKyMgaWYgIWRlZmluZWQgdmFfY29weSAmJiBkZWZpbmVkIF9fdmFfY29weQorIyAgZGVmaW5lIHZhX2NvcHkoZCxzKSBfX3ZhX2NvcHkoKGQpLChzKSkKKyMgZW5kaWYKKyNlbmRpZgorCisKKy8qIC0tLS0gRW5kaWFuIERldGVjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2lmIGRlZmluZWQoX19kaWdpdGFsX18pICYmIGRlZmluZWQoX191bml4X18pCisjIGluY2x1ZGUgPHNleC5oPgorI2VsaWYgZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKSBcCisgICB8fCBkZWZpbmVkKF9fQVBQTEVfXykKKyMgaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+ICAvKiBybGltaXQgKi8KKyMgaW5jbHVkZSA8bWFjaGluZS9lbmRpYW4uaD4KKyMgZGVmaW5lIGJzd2FwXzY0IF9fYnN3YXA2NAorIyBkZWZpbmUgYnN3YXBfMzIgX19ic3dhcDMyCisjIGRlZmluZSBic3dhcF8xNiBfX2Jzd2FwMTYKKyNlbHNlCisjIGluY2x1ZGUgPGJ5dGVzd2FwLmg+CisjIGluY2x1ZGUgPGVuZGlhbi5oPgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQllURV9PUkRFUikgJiYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorIyBkZWZpbmUgQkJfQklHX0VORElBTiAxCisjIGRlZmluZSBCQl9MSVRUTEVfRU5ESUFOIDAKKyNlbGlmIGRlZmluZWQoX19CWVRFX09SREVSKSAmJiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisjIGRlZmluZSBCQl9CSUdfRU5ESUFOIDAKKyMgZGVmaW5lIEJCX0xJVFRMRV9FTkRJQU4gMQorI2VsaWYgZGVmaW5lZChfQllURV9PUkRFUikgJiYgX0JZVEVfT1JERVIgPT0gX0JJR19FTkRJQU4KKyMgZGVmaW5lIEJCX0JJR19FTkRJQU4gMQorIyBkZWZpbmUgQkJfTElUVExFX0VORElBTiAwCisjZWxpZiBkZWZpbmVkKF9CWVRFX09SREVSKSAmJiBfQllURV9PUkRFUiA9PSBfTElUVExFX0VORElBTgorIyBkZWZpbmUgQkJfQklHX0VORElBTiAwCisjIGRlZmluZSBCQl9MSVRUTEVfRU5ESUFOIDEKKyNlbGlmIGRlZmluZWQoQllURV9PUkRFUikgJiYgQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOCisjIGRlZmluZSBCQl9CSUdfRU5ESUFOIDEKKyMgZGVmaW5lIEJCX0xJVFRMRV9FTkRJQU4gMAorI2VsaWYgZGVmaW5lZChCWVRFX09SREVSKSAmJiBCWVRFX09SREVSID09IExJVFRMRV9FTkRJQU4KKyMgZGVmaW5lIEJCX0JJR19FTkRJQU4gMAorIyBkZWZpbmUgQkJfTElUVExFX0VORElBTiAxCisjZWxpZiBkZWZpbmVkKF9fMzg2X18pCisjIGRlZmluZSBCQl9CSUdfRU5ESUFOIDAKKyMgZGVmaW5lIEJCX0xJVFRMRV9FTkRJQU4gMQorI2Vsc2UKKyMgZXJyb3IgIkNhbid0IGRldGVybWluZSBlbmRpYW5uZXNzIgorI2VuZGlmCisKKyNpZiBVTE9OR19NQVggPiAweGZmZmZmZmZmCisjIGRlZmluZSBiYl9ic3dhcF82NCh4KSBic3dhcF82NCh4KQorI2VuZGlmCisKKy8qIFNXQVBfTEVubiBtZWFucyAiY29udmVydCBDUFU8LT5saXR0bGVfZW5kaWFuIGJ5IHN3YXBwaW5nIGJ5dGVzIiAqLworI2lmIEJCX0JJR19FTkRJQU4KKyMgZGVmaW5lIFNXQVBfQkUxNih4KSAoeCkKKyMgZGVmaW5lIFNXQVBfQkUzMih4KSAoeCkKKyMgZGVmaW5lIFNXQVBfQkU2NCh4KSAoeCkKKyMgZGVmaW5lIFNXQVBfTEUxNih4KSBic3dhcF8xNih4KQorIyBkZWZpbmUgU1dBUF9MRTMyKHgpIGJzd2FwXzMyKHgpCisjIGRlZmluZSBTV0FQX0xFNjQoeCkgYmJfYnN3YXBfNjQoeCkKKyMgZGVmaW5lIElGX0JJR19FTkRJQU4oLi4uKSBfX1ZBX0FSR1NfXworIyBkZWZpbmUgSUZfTElUVExFX0VORElBTiguLi4pCisjZWxzZQorIyBkZWZpbmUgU1dBUF9CRTE2KHgpIGJzd2FwXzE2KHgpCisjIGRlZmluZSBTV0FQX0JFMzIoeCkgYnN3YXBfMzIoeCkKKyMgZGVmaW5lIFNXQVBfQkU2NCh4KSBiYl9ic3dhcF82NCh4KQorIyBkZWZpbmUgU1dBUF9MRTE2KHgpICh4KQorIyBkZWZpbmUgU1dBUF9MRTMyKHgpICh4KQorIyBkZWZpbmUgU1dBUF9MRTY0KHgpICh4KQorIyBkZWZpbmUgSUZfQklHX0VORElBTiguLi4pCisjIGRlZmluZSBJRl9MSVRUTEVfRU5ESUFOKC4uLikgX19WQV9BUkdTX18KKyNlbmRpZgorCisKKy8qIC0tLS0gVW5hbGlnbmVkIGFjY2VzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2luY2x1ZGUgPHN0ZGludC5oPgordHlwZWRlZiBpbnQgICAgICBiYl9fYWxpYXNlZF9pbnQgICAgICBGSVhfQUxJQVNJTkc7Cit0eXBlZGVmIGxvbmcgICAgIGJiX19hbGlhc2VkX2xvbmcgICAgIEZJWF9BTElBU0lORzsKK3R5cGVkZWYgdWludDE2X3QgYmJfX2FsaWFzZWRfdWludDE2X3QgRklYX0FMSUFTSU5HOwordHlwZWRlZiB1aW50MzJfdCBiYl9fYWxpYXNlZF91aW50MzJfdCBGSVhfQUxJQVNJTkc7Cit0eXBlZGVmIHVpbnQ2NF90IGJiX19hbGlhc2VkX3VpbnQ2NF90IEZJWF9BTElBU0lORzsKKworLyogTkI6IHVuYWxpZ25lZCBwYXJhbWV0ZXIgc2hvdWxkIGJlIGEgcG9pbnRlciwgYWxpZ25lZCBvbmUgLQorICogYSBsdmFsdWUuIFRoaXMgbWFrZXMgaXQgbW9yZSBsaWtlbHkgdG8gbm90IHN3YXAgdGhlbSBieSBtaXN0YWtlCisgKi8KKyNpZiBkZWZpbmVkKGkzODYpIHx8IGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfX3Bvd2VycGNfXykKKyMgZGVmaW5lIEJCX1VOQUxJR05FRF9NRU1BQ0NFU1NfT0sgMQorIyBkZWZpbmUgbW92ZV9mcm9tX3VuYWxpZ25lZF9pbnQodiwgaW50cCkgICgodikgPSAqKGJiX19hbGlhc2VkX2ludCopKGludHApKQorIyBkZWZpbmUgbW92ZV9mcm9tX3VuYWxpZ25lZF9sb25nKHYsIGxvbmdwKSAoKHYpID0gKihiYl9fYWxpYXNlZF9sb25nKikobG9uZ3ApKQorIyBkZWZpbmUgbW92ZV9mcm9tX3VuYWxpZ25lZDE2KHYsIHUxNnApICgodikgPSAqKGJiX19hbGlhc2VkX3VpbnQxNl90KikodTE2cCkpCisjIGRlZmluZSBtb3ZlX2Zyb21fdW5hbGlnbmVkMzIodiwgdTMycCkgKCh2KSA9ICooYmJfX2FsaWFzZWRfdWludDMyX3QqKSh1MzJwKSkKKyMgZGVmaW5lIG1vdmVfdG9fdW5hbGlnbmVkMTYodTE2cCwgdikgICAoKihiYl9fYWxpYXNlZF91aW50MTZfdCopKHUxNnApID0gKHYpKQorIyBkZWZpbmUgbW92ZV90b191bmFsaWduZWQzMih1MzJwLCB2KSAgICgqKGJiX19hbGlhc2VkX3VpbnQzMl90KikodTMycCkgPSAodikpCisvKiAjZWxpZiAuLi4gLSBhZGQgeW91ciBmYXZvcml0ZSBhcmNoIHRvZGF5ISAqLworI2Vsc2UKKyMgZGVmaW5lIEJCX1VOQUxJR05FRF9NRU1BQ0NFU1NfT0sgMAorLyogcGVyZm9ybXMgcmVhc29uYWJseSB3ZWxsIChnY2MgdXN1YWxseSBpbmxpbmVzIG1lbWNweSBoZXJlKSAqLworIyBkZWZpbmUgbW92ZV9mcm9tX3VuYWxpZ25lZF9pbnQodiwgaW50cCkgKG1lbWNweSgmKHYpLCAoaW50cCksIHNpemVvZihpbnQpKSkKKyMgZGVmaW5lIG1vdmVfZnJvbV91bmFsaWduZWRfbG9uZyh2LCBsb25ncCkgKG1lbWNweSgmKHYpLCAobG9uZ3ApLCBzaXplb2YobG9uZykpKQorIyBkZWZpbmUgbW92ZV9mcm9tX3VuYWxpZ25lZDE2KHYsIHUxNnApIChtZW1jcHkoJih2KSwgKHUxNnApLCAyKSkKKyMgZGVmaW5lIG1vdmVfZnJvbV91bmFsaWduZWQzMih2LCB1MzJwKSAobWVtY3B5KCYodiksICh1MzJwKSwgNCkpCisjIGRlZmluZSBtb3ZlX3RvX3VuYWxpZ25lZDE2KHUxNnAsIHYpIGRvIHsgXAorCXVpbnQxNl90IF9fdCA9ICh2KTsgXAorCW1lbWNweSgodTE2cCksICZfX3QsIDIpOyBcCit9IHdoaWxlICgwKQorIyBkZWZpbmUgbW92ZV90b191bmFsaWduZWQzMih1MzJwLCB2KSBkbyB7IFwKKwl1aW50MzJfdCBfX3QgPSAodik7IFwKKwltZW1jcHkoKHUzMnApLCAmX190LCA0KTsgXAorfSB3aGlsZSAoMCkKKyNlbmRpZgorCisKKy8qIC0tLS0gU2l6ZS1zYXZpbmcgInNtYWxsIiBpbnRzIChhcmNoLWRlcGVuZGVudCkgLS0tLS0tLS0tLS0gKi8KKworI2lmIGRlZmluZWQoaTM4NikgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9fbWlwc19fKSB8fCBkZWZpbmVkKF9fY3Jpc19fKQorLyogYWRkIG90aGVyIGFyY2hlcyB3aGljaCBiZW5lZml0IGZyb20gdGhpcy4uLiAqLwordHlwZWRlZiBzaWduZWQgY2hhciBzbWFsbGludDsKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBzbWFsbHVpbnQ7CisjZWxzZQorLyogZm9yIGFyY2hlcyB3aGVyZSBieXRlIGFjY2Vzc2VzIGdlbmVyYXRlIGxhcmdlciBjb2RlOiAqLwordHlwZWRlZiBpbnQgc21hbGxpbnQ7Cit0eXBlZGVmIHVuc2lnbmVkIHNtYWxsdWludDsKKyNlbmRpZgorCisvKiBJU08gQyBTdGFuZGFyZDogIDcuMTYgIEJvb2xlYW4gdHlwZSBhbmQgdmFsdWVzICA8c3RkYm9vbC5oPiAqLworI2lmIChkZWZpbmVkIF9fZGlnaXRhbF9fICYmIGRlZmluZWQgX191bml4X18pCisvKiBvbGQgc3lzdGVtIHdpdGhvdXQgKHByb3BlcikgQzk5IHN1cHBvcnQgKi8KKyMgZGVmaW5lIGJvb2wgc21hbGx1aW50CisjZWxzZQorLyogbW9kZXJuIHN5c3RlbSwgc28gdXNlIGl0ICovCisjIGluY2x1ZGUgPHN0ZGJvb2wuaD4KKyNlbmRpZgorCisKKy8qLS0tLS0gS2VybmVsIHZlcnNpb25pbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBLRVJORUxfVkVSU0lPTihhLGIsYykgKCgoYSkgPDwgMTYpICsgKChiKSA8PCA4KSArIChjKSkKKworI2lmZGVmIF9fVUNMSUJDX18KKyMgZGVmaW5lIFVDTElCQ19WRVJTSU9OIEtFUk5FTF9WRVJTSU9OKF9fVUNMSUJDX01BSk9SX18sIF9fVUNMSUJDX01JTk9SX18sIF9fVUNMSUJDX1NVQkxFVkVMX18pCisjZWxzZQorIyBkZWZpbmUgVUNMSUJDX1ZFUlNJT04gMAorI2VuZGlmCisKKworLyogLS0tLSBNaXNjZWxsYW5lb3VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgZGVmaW5lZCBfX0dMSUJDX18gXAorIHx8IGRlZmluZWQgX19VQ0xJQkNfXyBcCisgfHwgZGVmaW5lZCBfX2RpZXRsaWJjX18gXAorIHx8IGRlZmluZWQgX19CSU9OSUNfXyBcCisgfHwgZGVmaW5lZCBfTkVXTElCX1ZFUlNJT04KKyMgaW5jbHVkZSA8ZmVhdHVyZXMuaD4KKyNlbmRpZgorCisvKiBEZWZpbmUgYmJfc2V0cGdycCAqLworI2lmIGRlZmluZWQoX19kaWdpdGFsX18pICYmIGRlZmluZWQoX191bml4X18pCisvKiB1c2UgbGVnYWN5IHNldHBncnAocGlkX3QsIHBpZF90KSBmb3Igbm93LiAgbW92ZSB0byBwbGF0Zm9ybS5jICovCisjIGRlZmluZSBiYl9zZXRwZ3JwKCkgZG8geyBwaWRfdCBfX21lID0gZ2V0cGlkKCk7IHNldHBncnAoX19tZSwgX19tZSk7IH0gd2hpbGUgKDApCisjZWxzZQorIyBkZWZpbmUgYmJfc2V0cGdycCgpIHNldHBncnAoKQorI2VuZGlmCisKKy8qIGZkcHJpbnRmIGlzIG1vcmUgcmVhZGFibGUsIHdlIHVzZWQgaXQgYmVmb3JlIGRwcmludGYgd2FzIHN0YW5kYXJkaXplZCAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2RlZmluZSBmZHByaW50ZiBkcHJpbnRmCisKKy8qIFVzZWZ1bCBmb3IgZGVmZWF0aW5nIGdjYydzIGFsaWdubWVudCBvZiAiY2hhciBtZXNzYWdlW10iLWxpa2UgZGF0YSAqLworI2lmICFkZWZpbmVkKF9fczM5MF9fKQorICAgIC8qIG9uIHMzOTBbeF0sIG5vbi13b3JkLWFsaWduZWQgZGF0YSBhY2Nlc3NlcyByZXF1aXJlIGxhcmdlciBjb2RlICovCisjIGRlZmluZSBBTElHTjEgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgxKSkpCisjIGRlZmluZSBBTElHTjIgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCgyKSkpCisjIGRlZmluZSBBTElHTjQgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCg0KSkpCisjZWxzZQorLyogQXJjaGVzIHdoaWNoIE1VU1QgaGF2ZSAyIG9yIDQgYnl0ZSBhbGlnbm1lbnQgZm9yIGV2ZXJ5dGhpbmcgYXJlIGhlcmUgKi8KKyMgZGVmaW5lIEFMSUdOMQorIyBkZWZpbmUgQUxJR04yCisjIGRlZmluZSBBTElHTjQKKyNlbmRpZgorCisvKgorICogRm9yIDAuOS4yOSBhbmQgc3ZuLCBfX0FSQ0hfVVNFX01NVV9fIGluZGljYXRlcyBuby1tbXUgcmVsaWFibHkuCisgKiBGb3IgZWFybGllciB2ZXJzaW9ucyB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gY2hlY2sgaWYgd2UgYXJlIGJ1aWxkaW5nCisgKiBmb3IgYSBtbXUtbGVzcyBzeXN0ZW0uCisgKi8KKyNpZiBFTkFCTEVfTk9NTVUgfHwgXAorICAgIChkZWZpbmVkIF9fVUNMSUJDX18gJiYgXAorICAgICBVQ0xJQkNfVkVSU0lPTiA+IEtFUk5FTF9WRVJTSU9OKDAsIDksIDI4KSAmJiBcCisgICAgICFkZWZpbmVkIF9fQVJDSF9VU0VfTU1VX18pCisjIGRlZmluZSBCQl9NTVUgMAorIyBkZWZpbmUgVVNFX0ZPUl9OT01NVSguLi4pIF9fVkFfQVJHU19fCisjIGRlZmluZSBVU0VfRk9SX01NVSguLi4pCisjZWxzZQorIyBkZWZpbmUgQkJfTU1VIDEKKyMgZGVmaW5lIFVTRV9GT1JfTk9NTVUoLi4uKQorIyBkZWZpbmUgVVNFX0ZPUl9NTVUoLi4uKSBfX1ZBX0FSR1NfXworI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fZGlnaXRhbF9fKSAmJiBkZWZpbmVkKF9fdW5peF9fKQorIyBpbmNsdWRlIDxzdGFuZGFyZHMuaD4KKyMgaW5jbHVkZSA8aW50dHlwZXMuaD4KKyMgZGVmaW5lIFBSSXUzMiAidSIKKyMgaWYgIWRlZmluZWQgQURKX09GRlNFVF9TSU5HTEVTSE9UICYmIGRlZmluZWQgTU9EX0NMS0EgJiYgZGVmaW5lZCBNT0RfT0ZGU0VUCisjICBkZWZpbmUgQURKX09GRlNFVF9TSU5HTEVTSE9UIChNT0RfQ0xLQSB8IE1PRF9PRkZTRVQpCisjIGVuZGlmCisjIGlmICFkZWZpbmVkIEFESl9GUkVRVUVOQ1kgJiYgZGVmaW5lZCBNT0RfRlJFUVVFTkNZCisjICBkZWZpbmUgQURKX0ZSRVFVRU5DWSBNT0RfRlJFUVVFTkNZCisjIGVuZGlmCisjIGlmICFkZWZpbmVkIEFESl9USU1FQ09OU1QgJiYgZGVmaW5lZCBNT0RfVElNRUNPTlNUCisjICBkZWZpbmUgQURKX1RJTUVDT05TVCBNT0RfVElNRUNPTlNUCisjIGVuZGlmCisjIGlmICFkZWZpbmVkIEFESl9USUNLICYmIGRlZmluZWQgTU9EX0NMS0IKKyMgIGRlZmluZSBBREpfVElDSyBNT0RfQ0xLQgorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQ1lHV0lOX18pCisjIGRlZmluZSBNQVhTWU1MSU5LUyBTWU1MT09QX01BWAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEFORFJPSUQpIHx8IGRlZmluZWQoX19BTkRST0lEX18pCisjIGRlZmluZSBCQl9BRERJVElPTkFMX1BBVEggIjovc3lzdGVtL3NiaW46L3N5c3RlbS9iaW46L3N5c3RlbS94YmluIgorIyBkZWZpbmUgU1lTX2lvcHJpb19zZXQgX19OUl9pb3ByaW9fc2V0CisjIGRlZmluZSBTWVNfaW9wcmlvX2dldCBfX05SX2lvcHJpb19nZXQKKyNlbmRpZgorCisKKy8qIC0tLS0gV2hvIG1pc3NlcyB3aGF0PyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQXNzdW1lIGFsbCB0aGVzZSBmdW5jdGlvbnMgYW5kIGhlYWRlciBmaWxlcyBleGlzdCBieSBkZWZhdWx0LgorICogUGxhdGZvcm1zIHdoZXJlIGl0IGlzIG5vdCB0cnVlIHdpbGwgI3VuZGVmIHRoZW0gYmVsb3cuCisgKi8KKyNkZWZpbmUgSEFWRV9DTEVBUkVOViAxCisjZGVmaW5lIEhBVkVfRkRBVEFTWU5DIDEKKyNkZWZpbmUgSEFWRV9EUFJJTlRGIDEKKyNkZWZpbmUgSEFWRV9NRU1SQ0hSIDEKKyNkZWZpbmUgSEFWRV9NS0RURU1QIDEKKyNkZWZpbmUgSEFWRV9UVFlOQU1FX1IgMQorI2RlZmluZSBIQVZFX1BUU05BTUVfUiAxCisjZGVmaW5lIEhBVkVfU0VUQklUIDEKKyNkZWZpbmUgSEFWRV9TSUdIQU5ETEVSX1QgMQorI2RlZmluZSBIQVZFX1NUUENQWSAxCisjZGVmaW5lIEhBVkVfTUVNUENQWSAxCisjZGVmaW5lIEhBVkVfU1RSQ0FTRVNUUiAxCisjZGVmaW5lIEhBVkVfU1RSQ0hSTlVMIDEKKyNkZWZpbmUgSEFWRV9TVFJTRVAgMQorI2RlZmluZSBIQVZFX1NUUlNJR05BTCAxCisjZGVmaW5lIEhBVkVfU1RSVkVSU0NNUCAxCisjZGVmaW5lIEhBVkVfVkFTUFJJTlRGIDEKKyNkZWZpbmUgSEFWRV9VU0xFRVAgMQorI2RlZmluZSBIQVZFX1VOTE9DS0VEX1NURElPIDEKKyNkZWZpbmUgSEFWRV9VTkxPQ0tFRF9MSU5FX09QUyAxCisjZGVmaW5lIEhBVkVfR0VUTElORSAxCisjZGVmaW5lIEhBVkVfWFRBQlMgMQorI2RlZmluZSBIQVZFX01OVEVOVF9IIDEKKyNkZWZpbmUgSEFWRV9ORVRfRVRIRVJORVRfSCAxCisjZGVmaW5lIEhBVkVfU1lTX1NUQVRGU19IIDEKKworI2lmIGRlZmluZWQoX19VQ0xJQkNfXykKKyMgaWYgVUNMSUJDX1ZFUlNJT04gPCBLRVJORUxfVkVSU0lPTigwLCA5LCAzMikKKyMgIHVuZGVmIEhBVkVfU1RSVkVSU0NNUAorIyBlbmRpZgorIyBpZiBVQ0xJQkNfVkVSU0lPTiA+PSBLRVJORUxfVkVSU0lPTigwLCA5LCAzMCkKKyMgIGlmbmRlZiBfX1VDTElCQ19TVVNWM19MRUdBQ1lfXworIyAgIHVuZGVmIEhBVkVfVVNMRUVQCisjICBlbmRpZgorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fV0FUQ09NQ19fKQorIyB1bmRlZiBIQVZFX0RQUklOVEYKKyMgdW5kZWYgSEFWRV9HRVRMSU5FCisjIHVuZGVmIEhBVkVfTUVNUkNIUgorIyB1bmRlZiBIQVZFX01LRFRFTVAKKyMgdW5kZWYgSEFWRV9TRVRCSVQKKyMgdW5kZWYgSEFWRV9TVFBDUFkKKyMgdW5kZWYgSEFWRV9TVFJDQVNFU1RSCisjIHVuZGVmIEhBVkVfU1RSQ0hSTlVMCisjIHVuZGVmIEhBVkVfU1RSU0VQCisjIHVuZGVmIEhBVkVfU1RSU0lHTkFMCisjIHVuZGVmIEhBVkVfU1RSVkVSU0NNUAorIyB1bmRlZiBIQVZFX1ZBU1BSSU5URgorIyB1bmRlZiBIQVZFX1VOTE9DS0VEX1NURElPCisjIHVuZGVmIEhBVkVfVU5MT0NLRURfTElORV9PUFMKKyMgdW5kZWYgSEFWRV9ORVRfRVRIRVJORVRfSAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQ1lHV0lOX18pCisjIHVuZGVmIEhBVkVfQ0xFQVJFTlYKKyMgdW5kZWYgSEFWRV9GRFBSSU5URgorIyB1bmRlZiBIQVZFX01FTVJDSFIKKyMgdW5kZWYgSEFWRV9QVFNOQU1FX1IKKyMgdW5kZWYgSEFWRV9TVFJWRVJTQ01QCisjIHVuZGVmIEhBVkVfVU5MT0NLRURfTElORV9PUFMKKyNlbmRpZgorCisvKiBUaGVzZSBCU0QtZGVyaXZlZCBPU2VzIHNoYXJlIG1hbnkgc2ltaWxhcml0aWVzICovCisjaWYgKGRlZmluZWQgX19kaWdpdGFsX18gJiYgZGVmaW5lZCBfX3VuaXhfXykgXAorIHx8IGRlZmluZWQgX19BUFBMRV9fIFwKKyB8fCBkZWZpbmVkIF9fT3BlbkJTRF9fIHx8IGRlZmluZWQgX19OZXRCU0RfXworIyB1bmRlZiBIQVZFX0NMRUFSRU5WCisjIHVuZGVmIEhBVkVfRkRBVEFTWU5DCisjIHVuZGVmIEhBVkVfR0VUTElORQorIyB1bmRlZiBIQVZFX01OVEVOVF9ICisjIHVuZGVmIEhBVkVfUFRTTkFNRV9SCisjIHVuZGVmIEhBVkVfU1lTX1NUQVRGU19ICisjIHVuZGVmIEhBVkVfU0lHSEFORExFUl9UCisjIHVuZGVmIEhBVkVfU1RSVkVSU0NNUAorIyB1bmRlZiBIQVZFX1hUQUJTCisjIHVuZGVmIEhBVkVfRFBSSU5URgorIyB1bmRlZiBIQVZFX1VOTE9DS0VEX1NURElPCisjIHVuZGVmIEhBVkVfVU5MT0NLRURfTElORV9PUFMKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX2RpZXRsaWJjX18pCisjIHVuZGVmIEhBVkVfU1RSQ0hSTlVMCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19BUFBMRV9fKQorIyB1bmRlZiBIQVZFX1NUUkNIUk5VTAorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fRnJlZUJTRF9fKQorLyogdXNlcnMgc2F5IG1lbXBjcHkgaXMgbm90IHByZXNlbnQgaW4gRnJlZUJTRCA5LnggKi8KKyMgdW5kZWYgSEFWRV9NRU1QQ1BZCisjIHVuZGVmIEhBVkVfQ0xFQVJFTlYKKyMgdW5kZWYgSEFWRV9GREFUQVNZTkMKKyMgdW5kZWYgSEFWRV9NTlRFTlRfSAorIyB1bmRlZiBIQVZFX1BUU05BTUVfUgorIyB1bmRlZiBIQVZFX1NZU19TVEFURlNfSAorIyB1bmRlZiBIQVZFX1NJR0hBTkRMRVJfVAorIyB1bmRlZiBIQVZFX1NUUlZFUlNDTVAKKyMgdW5kZWYgSEFWRV9YVEFCUworIyB1bmRlZiBIQVZFX1VOTE9DS0VEX0xJTkVfT1BTCisjIGluY2x1ZGUgPG9zcmVsZGF0ZS5oPgorIyBpZiBfX0ZyZWVCU0RfdmVyc2lvbiA8IDEwMDAwMjkKKyMgIHVuZGVmIEhBVkVfU1RSQ0hSTlVMIC8qIEZyZWVCU0QgYWRkZWQgc3RyY2hybnVsKCkgYmV0d2VlbiAxMDAwMDI4IGFuZCAxMDAwMDI5ICovCisjIGVuZGlmCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19OZXRCU0RfXykKKyMgZGVmaW5lIEhBVkVfR0VUTElORSAxICAvKiBSZWNlbnQgTmV0QlNEIHZlcnNpb25zIGhhdmUgZ2V0bGluZSgpICovCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19kaWdpdGFsX18pICYmIGRlZmluZWQoX191bml4X18pCisjIHVuZGVmIEhBVkVfU1RQQ1BZCisjZW5kaWYKKworI2lmIGRlZmluZWQoQU5EUk9JRCkgfHwgZGVmaW5lZChfX0FORFJPSURfXykKKyMgaWYgX19BTkRST0lEX0FQSV9fIDwgOAorIyAgdW5kZWYgSEFWRV9EUFJJTlRGCisjIGVsc2UKKyMgIGRlZmluZSBkcHJpbnRmIGZkcHJpbnRmCisjIGVuZGlmCisjIGlmIF9fQU5EUk9JRF9BUElfXyA8IDIxCisjICB1bmRlZiBIQVZFX1RUWU5BTUVfUgorIyAgdW5kZWYgSEFWRV9HRVRMSU5FCisjICB1bmRlZiBIQVZFX1NUUENQWQorIyBlbmRpZgorIyB1bmRlZiBIQVZFX01FTVBDUFkKKyMgdW5kZWYgSEFWRV9TVFJDSFJOVUwKKyMgdW5kZWYgSEFWRV9TVFJWRVJTQ01QCisjIHVuZGVmIEhBVkVfVU5MT0NLRURfTElORV9PUFMKKyMgdW5kZWYgSEFWRV9ORVRfRVRIRVJORVRfSAorI2VuZGlmCisKKy8qCisgKiBOb3csIGRlZmluZSBwcm90b3R5cGVzIGZvciBhbGwgdGhlIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHBsYXRmb3JtLmMKKyAqIFRoZXNlIG11c3QgY29tZSBhZnRlciBhbGwgdGhlIEhBVkVfKiBtYWNyb3MgYXJlIGRlZmluZWQgKG9yIG5vdCkKKyAqLworCisjaWZuZGVmIEhBVkVfRFBSSU5URgorZXh0ZXJuIGludCBkcHJpbnRmKGludCBmZCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9NRU1SQ0hSCitleHRlcm4gdm9pZCAqbWVtcmNocihjb25zdCB2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pIEZBU1RfRlVOQzsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfTUtEVEVNUAorZXh0ZXJuIGNoYXIgKm1rZHRlbXAoY2hhciAqdGVtcGxhdGUpIEZBU1RfRlVOQzsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfVFRZTkFNRV9SCisjZGVmaW5lIHR0eW5hbWVfciBiYl90dHluYW1lX3IKK2V4dGVybiBpbnQgdHR5bmFtZV9yKGludCBmZCwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKTsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU0VUQklUCisjIGRlZmluZSBzZXRiaXQoYSwgYikgICgoYSlbKGIpID4+IDNdIHw9IDEgPDwgKChiKSAmIDcpKQorIyBkZWZpbmUgY2xyYml0KGEsIGIpICAoKGEpWyhiKSA+PiAzXSAmPSB+KDEgPDwgKChiKSAmIDcpKSkKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU0lHSEFORExFUl9UCit0eXBlZGVmIHZvaWQgKCpzaWdoYW5kbGVyX3QpKGludCk7CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUENQWQorZXh0ZXJuIGNoYXIgKnN0cGNweShjaGFyICpwLCBjb25zdCBjaGFyICp0b19hZGQpIEZBU1RfRlVOQzsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfTUVNUENQWQorI2luY2x1ZGUgPHN0cmluZy5oPgorLyogSW4gY2FzZSB3ZSBhcmUgd3JvbmcgYWJvdXQgIUhBVkVfTUVNUENQWSwgYW5kIHRvb2xjaGFpbiBfZG9lc18gaGF2ZQorICogbWVtcGNweSgpLCBhdm9pZCBjb2xsaWRpbmcgd2l0aCBpdDoKKyAqLworI2RlZmluZSBtZW1wY3B5IGJiX19tZW1wY3B5CitzdGF0aWMgQUxXQVlTX0lOTElORSB2b2lkICptZW1wY3B5KHZvaWQgKmRlc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGxlbikKK3sKKwlyZXR1cm4gbWVtY3B5KGRlc3QsIHNyYywgbGVuKSArIGxlbjsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSQ0FTRVNUUgorZXh0ZXJuIGNoYXIgKnN0cmNhc2VzdHIoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqcGF0dGVybikgRkFTVF9GVU5DOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TVFJDSFJOVUwKK2V4dGVybiBjaGFyICpzdHJjaHJudWwoY29uc3QgY2hhciAqcywgaW50IGMpIEZBU1RfRlVOQzsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSU0VQCitleHRlcm4gY2hhciAqc3Ryc2VwKGNoYXIgKipzdHJpbmdwLCBjb25zdCBjaGFyICpkZWxpbSkgRkFTVF9GVU5DOworI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TVFJTSUdOQUwKKy8qIE5vdCBleGFjdGx5IHRoZSBzYW1lOiBpbnN0ZWFkIG9mICJTdG9wcGVkIiBpdCBzaG93cyAiU1RPUCIgZXRjICovCisjIGRlZmluZSBzdHJzaWduYWwoc2lnKSBnZXRfc2lnbmFtZShzaWcpCisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1VTTEVFUAorZXh0ZXJuIGludCB1c2xlZXAodW5zaWduZWQpIEZBU1RfRlVOQzsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfVkFTUFJJTlRGCitleHRlcm4gaW50IHZhc3ByaW50ZihjaGFyICoqc3RyaW5nX3B0ciwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHApIEZBU1RfRlVOQzsKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfR0VUTElORQorIyBpbmNsdWRlIDxzdGRpby5oPiAvKiBmb3IgRklMRSAqLworIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4gLyogc2l6ZV90ICovCitleHRlcm4gc3NpemVfdCBnZXRsaW5lKGNoYXIgKipsaW5lcHRyLCBzaXplX3QgKm4sIEZJTEUgKnN0cmVhbSkgRkFTVF9GVU5DOworI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wd2RfLmggYi9pbmNsdWRlL3B3ZF8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzM0ODI5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9wd2RfLmgKQEAgLTAsMCArMSw2NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTEsOTIsOTUsOTYsOTcsOTgsOTksMjAwMSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEKKyAgIDAyMTExLTEzMDcgVVNBLiAgKi8KKworLyoKKyAqIFBPU0lYIFN0YW5kYXJkOiA5LjIuMiBVc2VyIERhdGFiYXNlIEFjY2Vzcwk8cHdkLmg+CisgKi8KKworI2lmbmRlZiBCQl9QV0RfSAorI2RlZmluZSBCQl9QV0RfSCAxCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCisvKiBUaGlzIGZpbGUgaXMgI2luY2x1ZGVkIGFmdGVyICNpbmNsdWRlIDxwd2QuaD4KKyAqIFdlIHdpbGwgdXNlIGxpYmMtZGVmaW5lZCBzdHJ1Y3R1cmVzLCBidXQgd2lsbCAjZGVmaW5lIGZ1bmN0aW9uIG5hbWVzCisgKiBzbyB0aGF0IGZ1bmN0aW9uIGNhbGxzIGFyZSBkaXJlY3RlZCB0byBiYl9pbnRlcm5hbF9YWFggcmVwbGFjZW1lbnRzCisgKi8KKyN1bmRlZiBlbmRwd2VudAorI2RlZmluZSBzZXRwd2VudCAgICBiYl9pbnRlcm5hbF9zZXRwd2VudAorI2RlZmluZSBlbmRwd2VudCAgICBiYl9pbnRlcm5hbF9lbmRwd2VudAorI2RlZmluZSBnZXRwd2VudCAgICBiYl9pbnRlcm5hbF9nZXRwd2VudAorI2RlZmluZSBnZXRwd3VpZCAgICBiYl9pbnRlcm5hbF9nZXRwd3VpZAorI2RlZmluZSBnZXRwd25hbSAgICBiYl9pbnRlcm5hbF9nZXRwd25hbQorI2RlZmluZSBnZXRwd25hbV9yICBiYl9pbnRlcm5hbF9nZXRwd25hbV9yCisKKy8qIEFsbCBmdW5jdGlvbiBuYW1lcyBiZWxvdyBzaG91bGQgYmUgcmVtYXBwZWQgYnkgI2RlZmluZXMgYWJvdmUKKyAqIGluIG9yZGVyIHRvIG5vdCBjb2xsaWRlIHdpdGggbGliYyBuYW1lcy4gKi8KKworLyogUmV3aW5kIHRoZSBwYXNzd29yZC1maWxlIHN0cmVhbS4gICovCit2b2lkIEZBU1RfRlVOQyBzZXRwd2VudCh2b2lkKTsKKworLyogQ2xvc2UgdGhlIHBhc3N3b3JkLWZpbGUgc3RyZWFtLiAgKi8KK3ZvaWQgRkFTVF9GVU5DIGVuZHB3ZW50KHZvaWQpOworCisvKiBSZWFkIGFuIGVudHJ5IGZyb20gdGhlIHBhc3N3b3JkLWZpbGUgc3RyZWFtLCBvcGVuaW5nIGl0IGlmIG5lY2Vzc2FyeS4gICovCitzdHJ1Y3QgcGFzc3dkKiBGQVNUX0ZVTkMgZ2V0cHdlbnQodm9pZCk7CisKKy8qIFNlYXJjaCBmb3IgYW4gZW50cnkgd2l0aCBhIG1hdGNoaW5nIHVzZXIgSUQuICAqLworc3RydWN0IHBhc3N3ZCogRkFTVF9GVU5DIGdldHB3dWlkKHVpZF90IF9fdWlkKTsKKworLyogU2VhcmNoIGZvciBhbiBlbnRyeSB3aXRoIGEgbWF0Y2hpbmcgdXNlcm5hbWUuICAqLworc3RydWN0IHBhc3N3ZCogRkFTVF9GVU5DIGdldHB3bmFtKGNvbnN0IGNoYXIgKl9fbmFtZSk7CisKKy8qIFJlZW50cmFudCB2ZXJzaW9ucyBvZiBzb21lIG9mIHRoZSBmdW5jdGlvbnMgYWJvdmUuICovCitpbnQgRkFTVF9GVU5DIGdldHB3bmFtX3IoY29uc3QgY2hhciAqX19yZXN0cmljdCBfX25hbWUsCisJCXN0cnVjdCBwYXNzd2QgKl9fcmVzdHJpY3QgX19yZXN1bHRidWYsCisJCWNoYXIgKl9fcmVzdHJpY3QgX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJc3RydWN0IHBhc3N3ZCAqKl9fcmVzdHJpY3QgX19yZXN1bHQpOworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvcnRjXy5oIGIvaW5jbHVkZS9ydGNfLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUwZmMyMAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvcnRjXy5oCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb21tb24gZGVmaW5lcy9zdHJ1Y3R1cmVzL2V0Yy4uLiBmb3IgYXBwbGV0cyB0aGF0IG5lZWQgdG8gd29yayB3aXRoIHRoZSBSVEMuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaWZuZGVmIEJCX1JUQ19ICisjZGVmaW5lIEJCX1JUQ19IIDEKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCitpbnQgcnRjX2FkanRpbWVfaXNfdXRjKHZvaWQpIEZBU1RfRlVOQzsKK2ludCBydGNfeG9wZW4oY29uc3QgY2hhciAqKmRlZmF1bHRfcnRjLCBpbnQgZmxhZ3MpIEZBU1RfRlVOQzsKK3ZvaWQgcnRjX3JlYWRfdG0oc3RydWN0IHRtICpwdG0sIGludCBmZCkgRkFTVF9GVU5DOwordGltZV90IHJ0Y190bTJ0aW1lKHN0cnVjdCB0bSAqcHRtLCBpbnQgdXRjKSBGQVNUX0ZVTkM7CisKKworLyoKKyAqIEV2ZXJ5dGhpbmcgYmVsb3cgdGhpcyBwb2ludCBoYXMgYmVlbiBjb3BpZWQgZnJvbSBsaW51eC9ydGMuaAorICogdG8gZWxpbWluYXRlIHRoZSBrZXJuZWwgaGVhZGVyIGRlcGVuZGVuY3kKKyAqLworCitzdHJ1Y3QgbGludXhfcnRjX3RpbWUgeworCWludCB0bV9zZWM7CisJaW50IHRtX21pbjsKKwlpbnQgdG1faG91cjsKKwlpbnQgdG1fbWRheTsKKwlpbnQgdG1fbW9uOworCWludCB0bV95ZWFyOworCWludCB0bV93ZGF5OworCWludCB0bV95ZGF5OworCWludCB0bV9pc2RzdDsKK307CisKK3N0cnVjdCBsaW51eF9ydGNfd2thbHJtIHsKKwl1bnNpZ25lZCBjaGFyIGVuYWJsZWQ7ICAvKiAwID0gYWxhcm0gZGlzYWJsZWQsIDEgPSBhbGFybSBlbmFibGVkICovCisJdW5zaWduZWQgY2hhciBwZW5kaW5nOyAgLyogMCA9IGFsYXJtIG5vdCBwZW5kaW5nLCAxID0gYWxhcm0gcGVuZGluZyAqLworCXN0cnVjdCBsaW51eF9ydGNfdGltZSB0aW1lOyAgLyogdGltZSB0aGUgYWxhcm0gaXMgc2V0IHRvICovCit9OworCisvKgorICogaW9jdGwgY2FsbHMgdGhhdCBhcmUgcGVybWl0dGVkIHRvIHRoZSAvZGV2L3J0YyBpbnRlcmZhY2UsIGlmCisgKiBhbnkgb2YgdGhlIFJUQyBkcml2ZXJzIGFyZSBlbmFibGVkLgorICovCisjZGVmaW5lIFJUQ19BSUVfT04gICAgICBfSU8oJ3AnLCAweDAxKSAgLyogQWxhcm0gaW50LiBlbmFibGUgb24gICAgICAgICAqLworI2RlZmluZSBSVENfQUlFX09GRiAgICAgX0lPKCdwJywgMHgwMikgIC8qIC4uLiBvZmYgICAgICAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUlRDX1VJRV9PTiAgICAgIF9JTygncCcsIDB4MDMpICAvKiBVcGRhdGUgaW50LiBlbmFibGUgb24gICAgICAgICovCisjZGVmaW5lIFJUQ19VSUVfT0ZGICAgICBfSU8oJ3AnLCAweDA0KSAgLyogLi4uIG9mZiAgICAgICAgICAgICAgICAgICAgICAqLworI2RlZmluZSBSVENfUElFX09OICAgICAgX0lPKCdwJywgMHgwNSkgIC8qIFBlcmlvZGljIGludC4gZW5hYmxlIG9uICAgICAgKi8KKyNkZWZpbmUgUlRDX1BJRV9PRkYgICAgIF9JTygncCcsIDB4MDYpICAvKiAuLi4gb2ZmICAgICAgICAgICAgICAgICAgICAgICovCisjZGVmaW5lIFJUQ19XSUVfT04gICAgICBfSU8oJ3AnLCAweDBmKSAgLyogV2F0Y2hkb2cgaW50LiBlbmFibGUgb24gICAgICAqLworI2RlZmluZSBSVENfV0lFX09GRiAgICAgX0lPKCdwJywgMHgxMCkgIC8qIC4uLiBvZmYgICAgICAgICAgICAgICAgICAgICAgKi8KKworI2RlZmluZSBSVENfQUxNX1NFVCAgICAgX0lPVygncCcsIDB4MDcsIHN0cnVjdCBsaW51eF9ydGNfdGltZSkgLyogU2V0IGFsYXJtIHRpbWUgICovCisjZGVmaW5lIFJUQ19BTE1fUkVBRCAgICBfSU9SKCdwJywgMHgwOCwgc3RydWN0IGxpbnV4X3J0Y190aW1lKSAvKiBSZWFkIGFsYXJtIHRpbWUgKi8KKyNkZWZpbmUgUlRDX1JEX1RJTUUgICAgIF9JT1IoJ3AnLCAweDA5LCBzdHJ1Y3QgbGludXhfcnRjX3RpbWUpIC8qIFJlYWQgUlRDIHRpbWUgICAqLworI2RlZmluZSBSVENfU0VUX1RJTUUgICAgX0lPVygncCcsIDB4MGEsIHN0cnVjdCBsaW51eF9ydGNfdGltZSkgLyogU2V0IFJUQyB0aW1lICAgICovCisjZGVmaW5lIFJUQ19JUlFQX1JFQUQgICBfSU9SKCdwJywgMHgwYiwgdW5zaWduZWQgbG9uZykgICAvKiBSZWFkIElSUSByYXRlICAgKi8KKyNkZWZpbmUgUlRDX0lSUVBfU0VUICAgIF9JT1coJ3AnLCAweDBjLCB1bnNpZ25lZCBsb25nKSAgIC8qIFNldCBJUlEgcmF0ZSAgICAqLworI2RlZmluZSBSVENfRVBPQ0hfUkVBRCAgX0lPUigncCcsIDB4MGQsIHVuc2lnbmVkIGxvbmcpICAgLyogUmVhZCBlcG9jaCAgICAgICovCisjZGVmaW5lIFJUQ19FUE9DSF9TRVQgICBfSU9XKCdwJywgMHgwZSwgdW5zaWduZWQgbG9uZykgICAvKiBTZXQgZXBvY2ggICAgICAgKi8KKworI2RlZmluZSBSVENfV0tBTE1fU0VUICAgX0lPVygncCcsIDB4MGYsIHN0cnVjdCBsaW51eF9ydGNfd2thbHJtKS8qIFNldCB3YWtldXAgYWxhcm0qLworI2RlZmluZSBSVENfV0tBTE1fUkQgICAgX0lPUigncCcsIDB4MTAsIHN0cnVjdCBsaW51eF9ydGNfd2thbHJtKS8qIEdldCB3YWtldXAgYWxhcm0qLworCisvKiBpbnRlcnJ1cHQgZmxhZ3MgKi8KKyNkZWZpbmUgUlRDX0lSUUYgMHg4MCAvKiBhbnkgb2YgdGhlIGZvbGxvd2luZyBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgUlRDX1BGIDB4NDAKKyNkZWZpbmUgUlRDX0FGIDB4MjAKKyNkZWZpbmUgUlRDX1VGIDB4MTAKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3NoYWRvd18uaCBiL2luY2x1ZGUvc2hhZG93Xy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMjU4MWUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3NoYWRvd18uaApAQCAtMCwwICsxLDEwNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTgsIDE5OTkgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KKworICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgICAwMjExMS0xMzA3IFVTQS4gICovCisKKy8qIERlY2xhcmF0aW9uIG9mIHR5cGVzIGFuZCBmdW5jdGlvbnMgZm9yIHNoYWRvdyBwYXNzd29yZCBzdWl0ZSAqLworCisjaWZuZGVmIEJCX1NIQURPV19ICisjZGVmaW5lIEJCX1NIQURPV19IIDEKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKKy8qIFN0cnVjdHVyZSBvZiB0aGUgcGFzc3dvcmQgZmlsZSAqLworc3RydWN0IHNwd2QgeworCWNoYXIgKnNwX25hbXA7ICAgICAgICAgIC8qIExvZ2luIG5hbWUgKi8KKwljaGFyICpzcF9wd2RwOyAgICAgICAgICAvKiBFbmNyeXB0ZWQgcGFzc3dvcmQgKi8KKwlsb25nIHNwX2xzdGNoZzsgICAgICAgICAvKiBEYXRlIG9mIGxhc3QgY2hhbmdlICovCisJbG9uZyBzcF9taW47ICAgICAgICAgICAgLyogTWluaW11bSBudW1iZXIgb2YgZGF5cyBiZXR3ZWVuIGNoYW5nZXMgKi8KKwlsb25nIHNwX21heDsgICAgICAgICAgICAvKiBNYXhpbXVtIG51bWJlciBvZiBkYXlzIGJldHdlZW4gY2hhbmdlcyAqLworCWxvbmcgc3Bfd2FybjsgICAgICAgICAgIC8qIE51bWJlciBvZiBkYXlzIHRvIHdhcm4gdXNlciB0byBjaGFuZ2UgdGhlIHBhc3N3b3JkICovCisJbG9uZyBzcF9pbmFjdDsgICAgICAgICAgLyogTnVtYmVyIG9mIGRheXMgdGhlIGFjY291bnQgbWF5IGJlIGluYWN0aXZlICovCisJbG9uZyBzcF9leHBpcmU7ICAgICAgICAgLyogTnVtYmVyIG9mIGRheXMgc2luY2UgMTk3MC0wMS0wMSB1bnRpbCBhY2NvdW50IGV4cGlyZXMgKi8KKwl1bnNpZ25lZCBsb25nIHNwX2ZsYWc7ICAvKiBSZXNlcnZlZCAqLworfTsKKworI2RlZmluZSBzZXRzcGVudCAgICBiYl9pbnRlcm5hbF9zZXRzcGVudAorI2RlZmluZSBlbmRzcGVudCAgICBiYl9pbnRlcm5hbF9lbmRzcGVudAorI2RlZmluZSBnZXRzcGVudCAgICBiYl9pbnRlcm5hbF9nZXRzcGVudAorI2RlZmluZSBnZXRzcG5hbSAgICBiYl9pbnRlcm5hbF9nZXRzcG5hbQorI2RlZmluZSBzZ2V0c3BlbnQgICBiYl9pbnRlcm5hbF9zZ2V0c3BlbnQKKyNkZWZpbmUgZmdldHNwZW50ICAgYmJfaW50ZXJuYWxfZmdldHNwZW50CisjZGVmaW5lIHB1dHNwZW50ICAgIGJiX2ludGVybmFsX3B1dHNwZW50CisjZGVmaW5lIGdldHNwZW50X3IgIGJiX2ludGVybmFsX2dldHNwZW50X3IKKyNkZWZpbmUgZ2V0c3BuYW1fciAgYmJfaW50ZXJuYWxfZ2V0c3BuYW1fcgorI2RlZmluZSBzZ2V0c3BlbnRfciBiYl9pbnRlcm5hbF9zZ2V0c3BlbnRfcgorI2RlZmluZSBmZ2V0c3BlbnRfciBiYl9pbnRlcm5hbF9mZ2V0c3BlbnRfcgorI2RlZmluZSBsY2twd2RmICAgICBiYl9pbnRlcm5hbF9sY2twd2RmCisjZGVmaW5lIHVsY2twd2RmICAgIGJiX2ludGVybmFsX3VsY2twd2RmCisKKworLyogQWxsIGZ1bmN0aW9uIG5hbWVzIGJlbG93IHNob3VsZCBiZSByZW1hcHBlZCBieSAjZGVmaW5lcyBhYm92ZQorICogaW4gb3JkZXIgdG8gbm90IGNvbGxpZGUgd2l0aCBsaWJjIG5hbWVzLiAqLworCisjaWZkZWYgVU5VU0VEX0ZPUl9OT1cKKy8qIE9wZW4gZGF0YWJhc2UgZm9yIHJlYWRpbmcgKi8KK3ZvaWQgRkFTVF9GVU5DIHNldHNwZW50KHZvaWQpOworCisvKiBDbG9zZSBkYXRhYmFzZSAqLwordm9pZCBGQVNUX0ZVTkMgZW5kc3BlbnQodm9pZCk7CisKKy8qIEdldCBuZXh0IGVudHJ5IGZyb20gZGF0YWJhc2UsIHBlcmhhcHMgYWZ0ZXIgb3BlbmluZyB0aGUgZmlsZSAqLworc3RydWN0IHNwd2QqIEZBU1RfRlVOQyBnZXRzcGVudCh2b2lkKTsKKworLyogR2V0IHNoYWRvdyBlbnRyeSBtYXRjaGluZyBOQU1FICovCitzdHJ1Y3Qgc3B3ZCogRkFTVF9GVU5DIGdldHNwbmFtKGNvbnN0IGNoYXIgKl9fbmFtZSk7CisKKy8qIFJlYWQgc2hhZG93IGVudHJ5IGZyb20gU1RSSU5HICovCitzdHJ1Y3Qgc3B3ZCogRkFTVF9GVU5DIHNnZXRzcGVudChjb25zdCBjaGFyICpfX3N0cmluZyk7CisKKy8qIFJlYWQgbmV4dCBzaGFkb3cgZW50cnkgZnJvbSBTVFJFQU0gKi8KK3N0cnVjdCBzcHdkKiBGQVNUX0ZVTkMgZmdldHNwZW50KEZJTEUgKl9fc3RyZWFtKTsKKworLyogV3JpdGUgbGluZSBjb250YWluaW5nIHNoYWRvdyBwYXNzd29yZCBlbnRyeSB0byBzdHJlYW0gKi8KK2ludCBGQVNUX0ZVTkMgcHV0c3BlbnQoY29uc3Qgc3RydWN0IHNwd2QgKl9fcCwgRklMRSAqX19zdHJlYW0pOworCisvKiBSZWVudHJhbnQgdmVyc2lvbnMgb2Ygc29tZSBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlICovCitpbnQgRkFTVF9GVU5DIGdldHNwZW50X3Ioc3RydWN0IHNwd2QgKl9fcmVzdWx0X2J1ZiwgY2hhciAqX19idWZmZXIsCisJCXNpemVfdCBfX2J1Zmxlbiwgc3RydWN0IHNwd2QgKipfX3Jlc3VsdCk7CisjZW5kaWYKKworaW50IEZBU1RfRlVOQyBnZXRzcG5hbV9yKGNvbnN0IGNoYXIgKl9fbmFtZSwgc3RydWN0IHNwd2QgKl9fcmVzdWx0X2J1ZiwKKwkJY2hhciAqX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJc3RydWN0IHNwd2QgKipfX3Jlc3VsdCk7CisKKyNpZmRlZiBVTlVTRURfRk9SX05PVworaW50IEZBU1RfRlVOQyBzZ2V0c3BlbnRfcihjb25zdCBjaGFyICpfX3N0cmluZywgc3RydWN0IHNwd2QgKl9fcmVzdWx0X2J1ZiwKKwkJY2hhciAqX19idWZmZXIsIHNpemVfdCBfX2J1ZmxlbiwKKwkJc3RydWN0IHNwd2QgKipfX3Jlc3VsdCk7CisKK2ludCBGQVNUX0ZVTkMgZmdldHNwZW50X3IoRklMRSAqX19zdHJlYW0sIHN0cnVjdCBzcHdkICpfX3Jlc3VsdF9idWYsCisJCWNoYXIgKl9fYnVmZmVyLCBzaXplX3QgX19idWZsZW4sCisJCXN0cnVjdCBzcHdkICoqX19yZXN1bHQpOworLyogUHJvdGVjdCBwYXNzd29yZCBmaWxlIGFnYWluc3QgbXVsdGkgd3JpdGVycyAqLworaW50IEZBU1RfRlVOQyBsY2twd2RmKHZvaWQpOworCisvKiBVbmxvY2sgcGFzc3dvcmQgZmlsZSAqLworaW50IEZBU1RfRlVOQyB1bGNrcHdkZih2b2lkKTsKKyNlbmRpZgorCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYgLyogc2hhZG93LmggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdW5pY29kZS5oIGIvaW5jbHVkZS91bmljb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxN2EyMQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdW5pY29kZS5oCkBAIC0wLDAgKzEsMTI5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaWZuZGVmIFVOSUNPREVfSAorI2RlZmluZSBVTklDT0RFX0ggMQorCisjaWYgRU5BQkxFX1VOSUNPREVfVVNJTkdfTE9DQUxFCisjIGluY2x1ZGUgPHdjaGFyLmg+CisjIGluY2x1ZGUgPHdjdHlwZS5oPgorI2VuZGlmCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCitlbnVtIHsKKwlVTklDT0RFX1VOS05PV04gPSAwLAorCVVOSUNPREVfT0ZGID0gMSwKKwlVTklDT0RFX09OID0gMiwKK307CisKKyNkZWZpbmUgdW5pY29kZV9iaWRpX2lzcnRsKHdjKSAwCisjZGVmaW5lIHVuaWNvZGVfYmlkaV9pc19uZXV0cmFsX3djaGFyKHdjKSAod2MgPD0gMTI2ICYmICFpc2FscGhhKHdjKSkKKworI2lmICFFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisKKyMgZGVmaW5lIHVuaWNvZGVfc3RybGVuKHN0cmluZykgICBzdHJsZW4oc3RyaW5nKQorIyBkZWZpbmUgdW5pY29kZV9zdHJ3aWR0aChzdHJpbmcpIHN0cmxlbihzdHJpbmcpCisjIGRlZmluZSB1bmljb2RlX3N0YXR1cyBVTklDT0RFX09GRgorIyBkZWZpbmUgaW5pdF91bmljb2RlKCkgKCh2b2lkKTApCisjIGRlZmluZSByZWluaXRfdW5pY29kZShMQU5HKSAoKHZvaWQpMCkKKworI2Vsc2UKKworIyBpZiBDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIgPCAxMjYgfHwgQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSID49IDB4MzAwMDAKKyMgIHVuZGVmIENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUgorIyAgZGVmaW5lIENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiAweDJmZmZmCisjIGVuZGlmCisKKyMgaWYgQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSIDwgMHgzMDAKKyMgIHVuZGVmIEVOQUJMRV9VTklDT0RFX0NPTUJJTklOR19XQ0hBUlMKKyMgIGRlZmluZSBFTkFCTEVfVU5JQ09ERV9DT01CSU5JTkdfV0NIQVJTIDAKKyMgZW5kaWYKKworIyBpZiBDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIgPCAweDExMDAKKyMgIHVuZGVmIEVOQUJMRV9VTklDT0RFX1dJREVfV0NIQVJTCisjICBkZWZpbmUgRU5BQkxFX1VOSUNPREVfV0lERV9XQ0hBUlMgMAorIyBlbmRpZgorCisjIGlmIENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiA8IDB4NTkwCisjICB1bmRlZiAgRU5BQkxFX1VOSUNPREVfQklESV9TVVBQT1JUCisjICBkZWZpbmUgRU5BQkxFX1VOSUNPREVfQklESV9TVVBQT1JUIDAKKyMgZW5kaWYKKworLyogTnVtYmVyIG9mIHVuaWNvZGUgY2hhcnMuIEZhbGxzIGJhY2sgdG8gc3RybGVuKCkgb24gaW52YWxpZCB1bmljb2RlICovCitzaXplX3QgRkFTVF9GVU5DIHVuaWNvZGVfc3RybGVuKGNvbnN0IGNoYXIgKnN0cmluZyk7CisvKiBXaWR0aCBvbiB0ZXJtaW5hbCAqLworc2l6ZV90IEZBU1RfRlVOQyB1bmljb2RlX3N0cndpZHRoKGNvbnN0IGNoYXIgKnN0cmluZyk7CitlbnVtIHsKKwlVTklfRkxBR19QQUQgPSAoMSA8PCAwKSwKK307CisvL1VOVVNFRDogdW5zaWduZWQgRkFTVF9GVU5DIHVuaWNvZGVfcGFkZGluZ190b193aWR0aCh1bnNpZ25lZCB3aWR0aCwgY29uc3QgY2hhciAqc3JjKTsKKy8vVU5VU0VEOiBjaGFyKiBGQVNUX0ZVTkMgdW5pY29kZV9jb252X3RvX3ByaW50YWJsZTIodW5pX3N0YXRfdCAqc3RhdHMsIGNvbnN0IGNoYXIgKnNyYywgdW5zaWduZWQgd2lkdGgsIGludCBmbGFncyk7CitjaGFyKiBGQVNUX0ZVTkMgdW5pY29kZV9jb252X3RvX3ByaW50YWJsZSh1bmlfc3RhdF90ICpzdGF0cywgY29uc3QgY2hhciAqc3JjKTsKKy8vVU5VU0VEOiBjaGFyKiBGQVNUX0ZVTkMgdW5pY29kZV9jb252X3RvX3ByaW50YWJsZV9tYXh3aWR0aCh1bmlfc3RhdF90ICpzdGF0cywgY29uc3QgY2hhciAqc3JjLCB1bnNpZ25lZCBtYXh3aWR0aCk7CitjaGFyKiBGQVNUX0ZVTkMgdW5pY29kZV9jb252X3RvX3ByaW50YWJsZV9maXhlZHdpZHRoKC8qdW5pX3N0YXRfdCAqc3RhdHMsKi8gY29uc3QgY2hhciAqc3JjLCB1bnNpZ25lZCB3aWR0aCk7CisKKyMgaWYgRU5BQkxFX1VOSUNPREVfVVNJTkdfTE9DQUxFCisKK2V4dGVybiB1aW50OF90IHVuaWNvZGVfc3RhdHVzOwordm9pZCBpbml0X3VuaWNvZGUodm9pZCkgRkFTVF9GVU5DOwordm9pZCByZWluaXRfdW5pY29kZShjb25zdCBjaGFyICpMQU5HKSBGQVNUX0ZVTkM7CisKKyMgZWxzZQorCisvKiBIb21lZ3Jvd24gVW5pY29kZSBzdXBwb3J0LiBJdCBrbm93cyBvbmx5IEMgYW5kIFVuaWNvZGUgbG9jYWxlcy4gKi8KKworIyAgaWYgIUVOQUJMRV9GRUFUVVJFX0NIRUNLX1VOSUNPREVfSU5fRU5WCisjICAgZGVmaW5lIHVuaWNvZGVfc3RhdHVzIFVOSUNPREVfT04KKyMgICBkZWZpbmUgaW5pdF91bmljb2RlKCkgKCh2b2lkKTApCisjICAgZGVmaW5lIHJlaW5pdF91bmljb2RlKExBTkcpICgodm9pZCkwKQorIyAgZWxzZQorZXh0ZXJuIHVpbnQ4X3QgdW5pY29kZV9zdGF0dXM7Cit2b2lkIGluaXRfdW5pY29kZSh2b2lkKSBGQVNUX0ZVTkM7Cit2b2lkIHJlaW5pdF91bmljb2RlKGNvbnN0IGNoYXIgKkxBTkcpIEZBU1RfRlVOQzsKKyMgIGVuZGlmCisKKyMgIHVuZGVmIE1CX0NVUl9NQVgKKyMgIGRlZmluZSBNQl9DVVJfTUFYIDYKKworLyogUHJldmVudCBuYW1lIGNvbGxpc2lvbnMgKi8KKyMgIGRlZmluZSB3aW50X3QgICAgYmJfd2ludF90CisjICBkZWZpbmUgbWJzdGF0ZV90IGJiX21ic3RhdGVfdAorIyAgZGVmaW5lIG1ic3Rvd2NzICBiYl9tYnN0b3djcworIyAgZGVmaW5lIHdjc3RvbWJzICBiYl93Y3N0b21icworIyAgZGVmaW5lIHdjcnRvbWIgICBiYl93Y3J0b21iCisjICBkZWZpbmUgaXN3c3BhY2UgIGJiX2lzd3NwYWNlCisjICBkZWZpbmUgaXN3YWxudW0gIGJiX2lzd2FsbnVtCisjICBkZWZpbmUgaXN3cHVuY3QgIGJiX2lzd3B1bmN0CisjICBkZWZpbmUgd2N3aWR0aCAgIGJiX3djd2lkdGgKKwordHlwZWRlZiBpbnQzMl90IHdpbnRfdDsKK3R5cGVkZWYgc3RydWN0IHsKKwljaGFyIGJvZ3VzOworfSBtYnN0YXRlX3Q7CisKK3NpemVfdCBtYnN0b3djcyh3Y2hhcl90ICpkZXN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBuKSBGQVNUX0ZVTkM7CitzaXplX3Qgd2NzdG9tYnMoY2hhciAqZGVzdCwgY29uc3Qgd2NoYXJfdCAqc3JjLCBzaXplX3QgbikgRkFTVF9GVU5DOworc2l6ZV90IHdjcnRvbWIoY2hhciAqcywgd2NoYXJfdCB3YywgbWJzdGF0ZV90ICpwcykgRkFTVF9GVU5DOworaW50IGlzd3NwYWNlKHdpbnRfdCB3YykgRkFTVF9GVU5DOworaW50IGlzd2FsbnVtKHdpbnRfdCB3YykgRkFTVF9GVU5DOworaW50IGlzd3B1bmN0KHdpbnRfdCB3YykgRkFTVF9GVU5DOworaW50IHdjd2lkdGgodW5zaWduZWQgdWNzKSBGQVNUX0ZVTkM7CisjICBpZiBFTkFCTEVfVU5JQ09ERV9CSURJX1NVUFBPUlQKKyMgICB1bmRlZiB1bmljb2RlX2JpZGlfaXNydGwKK2ludCB1bmljb2RlX2JpZGlfaXNydGwod2ludF90IHdjKSBGQVNUX0ZVTkM7CisjICAgaWYgRU5BQkxFX1VOSUNPREVfTkVVVFJBTF9UQUJMRQorIyAgICB1bmRlZiB1bmljb2RlX2JpZGlfaXNfbmV1dHJhbF93Y2hhcgoraW50IHVuaWNvZGVfYmlkaV9pc19uZXV0cmFsX3djaGFyKHdpbnRfdCB3YykgRkFTVF9GVU5DOworIyAgIGVuZGlmCisjICBlbmRpZgorCisKKyMgZW5kaWYgLyogIVVOSUNPREVfVVNJTkdfTE9DQUxFICovCisKKyNlbmRpZiAvKiBVTklDT0RFX1NVUFBPUlQgKi8KKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3VzYWdlLnNyYy5oIGIvaW5jbHVkZS91c2FnZS5zcmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGJlY2NmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS91c2FnZS5zcmMuaApAQCAtMCwwICsxLDIyIEBACisvKiB2aTogc2V0IHN3PTggdHM9ODogKi8KKy8qCisgKiBUaGlzIGZpbGUgc3VmZmVycyBmcm9tIGNocm9uaWNhbGx5IGluY29ycmVjdCB0YWJpZmljYXRpb24KKyAqIG9mIG1lc3NhZ2VzLiBCZWZvcmUgZWRpdGluZyB0aGlzIGZpbGU6CisgKiAxLiBTd2l0Y2ggeW91IGVkaXRvciB0byA4LXNwYWNlIHRhYiBtb2RlLgorICogMi4gRG8gbm90IHVzZSBcdCBpbiBtZXNzYWdlcywgdXNlIHJlYWwgdGFiIGNoYXJhY3Rlci4KKyAqIDMuIFN0YXJ0IGVhY2ggc291cmNlIGxpbmUgd2l0aCBtZXNzYWdlIGFzIGZvbGxvd3M6CisgKiAgICB8PDcgc3BhY2VzPiJ0ZXh0IHdpdGggdGFicyIuLi4uCisgKiBvcgorICogICAgfDw1IHNwYWNlcz4iXG50ZXh0IHdpdGggdGFicyIuLi4uCisgKi8KKyNpZm5kZWYgQkJfVVNBR0VfSAorI2RlZmluZSBCQl9VU0FHRV9IIDEKKworI2RlZmluZSBOT1VTQUdFX1NUUiAiXGIiCisKK0lOU0VSVAorCisjZGVmaW5lIGJ1c3lib3hfbm90ZXNfdXNhZ2UgXAorICAgICAgICJIZWxsbyB3b3JsZCFcbiIKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ZvbHVtZV9pZC5oIGIvaW5jbHVkZS92b2x1bWVfaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODNkYTg5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS92b2x1bWVfaWQuaApAQCAtMCwwICsxLDMxIEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworY2hhciAqZ2V0X2Rldm5hbWVfZnJvbV9sYWJlbChjb25zdCBjaGFyICpzcGVjKTsKK2NoYXIgKmdldF9kZXZuYW1lX2Zyb21fdXVpZChjb25zdCBjaGFyICpzcGVjKTsKK3ZvaWQgZGlzcGxheV91dWlkX2NhY2hlKGludCBzY2FuX2RldmljZXMpOworCisvKiBSZXR1cm5zOgorICogMDogbm8gVVVJRD0gb3IgTEFCRUw9IHByZWZpeCBmb3VuZAorICogMTogVVVJRD0gb3IgTEFCRUw9IHByZWZpeCBmb3VuZC4gSW4gdGhpcyBjYXNlLAorICogICAgKmZzbmFtZSBpcyByZXBsYWNlZCBpZiBkZXZpY2Ugd2l0aCBzdWNoIFVVSUQgb3IgTEFCRUwgaXMgZm91bmQKKyAqLworaW50IHJlc29sdmVfbW91bnRfc3BlYyhjaGFyICoqZnNuYW1lKTsKK2ludCBhZGRfdG9fdXVpZF9jYWNoZShjb25zdCBjaGFyICpkZXZpY2UpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS94YXRvbnVtLmggYi9pbmNsdWRlL3hhdG9udW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWViYmZjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS94YXRvbnVtLmgKQEAgLTAsMCArMSwxODUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGFzY2lpLXRvLW51bWJlcnMgaW1wbGVtZW50YXRpb25zIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworLyogUHJvdmlkZXMgZXh0ZXJuIGRlY2xhcmF0aW9ucyBvZiBmdW5jdGlvbnMgKi8KKyNkZWZpbmUgREVDTEFSRV9TVFJfQ09OVih0eXBlLCBULCBVVCkgXAorXAordW5zaWduZWQgdHlwZSB4c3RydG8jI1VUIyNfcmFuZ2Vfc2Z4KGNvbnN0IGNoYXIgKnN0ciwgaW50IGIsIHVuc2lnbmVkIHR5cGUgbCwgdW5zaWduZWQgdHlwZSB1LCBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgKnNmeCkgRkFTVF9GVU5DOyBcCit1bnNpZ25lZCB0eXBlIHhzdHJ0byMjVVQjI19yYW5nZShjb25zdCBjaGFyICpzdHIsIGludCBiLCB1bnNpZ25lZCB0eXBlIGwsIHVuc2lnbmVkIHR5cGUgdSkgRkFTVF9GVU5DOyBcCit1bnNpZ25lZCB0eXBlIHhzdHJ0byMjVVQjI19zZngoY29uc3QgY2hhciAqc3RyLCBpbnQgYiwgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzZngpIEZBU1RfRlVOQzsgXAordW5zaWduZWQgdHlwZSB4c3RydG8jI1VUKGNvbnN0IGNoYXIgKnN0ciwgaW50IGIpIEZBU1RfRlVOQzsgXAordW5zaWduZWQgdHlwZSB4YXRvIyNVVCMjX3JhbmdlX3NmeChjb25zdCBjaGFyICpzdHIsIHVuc2lnbmVkIHR5cGUgbCwgdW5zaWduZWQgdHlwZSB1LCBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgKnNmeCkgRkFTVF9GVU5DOyBcCit1bnNpZ25lZCB0eXBlIHhhdG8jI1VUIyNfcmFuZ2UoY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCB0eXBlIGwsIHVuc2lnbmVkIHR5cGUgdSkgRkFTVF9GVU5DOyBcCit1bnNpZ25lZCB0eXBlIHhhdG8jI1VUIyNfc2Z4KGNvbnN0IGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzZngpIEZBU1RfRlVOQzsgXAordW5zaWduZWQgdHlwZSB4YXRvIyNVVChjb25zdCBjaGFyICpzdHIpIEZBU1RfRlVOQzsgXAordHlwZSB4c3RydG8jI1QjI19yYW5nZV9zZngoY29uc3QgY2hhciAqc3RyLCBpbnQgYiwgdHlwZSBsLCB0eXBlIHUsIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCAqc2Z4KSBGQVNUX0ZVTkM7IFwKK3R5cGUgeHN0cnRvIyNUIyNfcmFuZ2UoY29uc3QgY2hhciAqc3RyLCBpbnQgYiwgdHlwZSBsLCB0eXBlIHUpIEZBU1RfRlVOQzsgXAordHlwZSB4c3RydG8jI1QoY29uc3QgY2hhciAqc3RyLCBpbnQgYikgRkFTVF9GVU5DOyBcCit0eXBlIHhhdG8jI1QjI19yYW5nZV9zZngoY29uc3QgY2hhciAqc3RyLCB0eXBlIGwsIHR5cGUgdSwgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzZngpIEZBU1RfRlVOQzsgXAordHlwZSB4YXRvIyNUIyNfcmFuZ2UoY29uc3QgY2hhciAqc3RyLCB0eXBlIGwsIHR5cGUgdSkgRkFTVF9GVU5DOyBcCit0eXBlIHhhdG8jI1QjI19zZngoY29uc3QgY2hhciAqc3RyLCBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgKnNmeCkgRkFTVF9GVU5DOyBcCit0eXBlIHhhdG8jI1QoY29uc3QgY2hhciAqc3RyKSBGQVNUX0ZVTkM7IFwKKworLyogVW5zaWduZWQgbG9uZyBsb25nIGZ1bmN0aW9ucyBhbHdheXMgZXhpc3QgKi8KK0RFQ0xBUkVfU1RSX0NPTlYobG9uZyBsb25nLCBsbCwgdWxsKQorCisKKy8qIFByb3ZpZGVzIGlubGluZSBkZWZpbml0aW9ucyBvZiBmdW5jdGlvbnMgKi8KKy8qICh1c2VmdWwgZm9yIG1hcHBpbmcgdGhlbSB0byB0aGUgdHlwZSBvZiB0aGUgc2FtZSB3aWR0aCkgKi8KKyNkZWZpbmUgREVGSU5FX0VRVUlWX1NUUl9DT05WKG5hcnJvdywgTiwgVywgVU4sIFVXKSBcCitcCitzdGF0aWMgQUxXQVlTX0lOTElORSBcCit1bnNpZ25lZCBuYXJyb3cgeHN0cnRvIyNVTiMjX3JhbmdlX3NmeChjb25zdCBjaGFyICpzdHIsIGludCBiLCB1bnNpZ25lZCBuYXJyb3cgbCwgdW5zaWduZWQgbmFycm93IHUsIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCAqc2Z4KSBcCit7IHJldHVybiB4c3RydG8jI1VXIyNfcmFuZ2Vfc2Z4KHN0ciwgYiwgbCwgdSwgc2Z4KTsgfSBcCitzdGF0aWMgQUxXQVlTX0lOTElORSBcCit1bnNpZ25lZCBuYXJyb3cgeHN0cnRvIyNVTiMjX3JhbmdlKGNvbnN0IGNoYXIgKnN0ciwgaW50IGIsIHVuc2lnbmVkIG5hcnJvdyBsLCB1bnNpZ25lZCBuYXJyb3cgdSkgXAoreyByZXR1cm4geHN0cnRvIyNVVyMjX3JhbmdlKHN0ciwgYiwgbCwgdSk7IH0gXAorc3RhdGljIEFMV0FZU19JTkxJTkUgXAordW5zaWduZWQgbmFycm93IHhzdHJ0byMjVU4jI19zZngoY29uc3QgY2hhciAqc3RyLCBpbnQgYiwgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzZngpIFwKK3sgcmV0dXJuIHhzdHJ0byMjVVcjI19zZngoc3RyLCBiLCBzZngpOyB9IFwKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIFwKK3Vuc2lnbmVkIG5hcnJvdyB4c3RydG8jI1VOKGNvbnN0IGNoYXIgKnN0ciwgaW50IGIpIFwKK3sgcmV0dXJuIHhzdHJ0byMjVVcoc3RyLCBiKTsgfSBcCitzdGF0aWMgQUxXQVlTX0lOTElORSBcCit1bnNpZ25lZCBuYXJyb3cgeGF0byMjVU4jI19yYW5nZV9zZngoY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBuYXJyb3cgbCwgdW5zaWduZWQgbmFycm93IHUsIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCAqc2Z4KSBcCit7IHJldHVybiB4YXRvIyNVVyMjX3JhbmdlX3NmeChzdHIsIGwsIHUsIHNmeCk7IH0gXAorc3RhdGljIEFMV0FZU19JTkxJTkUgXAordW5zaWduZWQgbmFycm93IHhhdG8jI1VOIyNfcmFuZ2UoY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBuYXJyb3cgbCwgdW5zaWduZWQgbmFycm93IHUpIFwKK3sgcmV0dXJuIHhhdG8jI1VXIyNfcmFuZ2Uoc3RyLCBsLCB1KTsgfSBcCitzdGF0aWMgQUxXQVlTX0lOTElORSBcCit1bnNpZ25lZCBuYXJyb3cgeGF0byMjVU4jI19zZngoY29uc3QgY2hhciAqc3RyLCBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgKnNmeCkgXAoreyByZXR1cm4geGF0byMjVVcjI19zZngoc3RyLCBzZngpOyB9IFwKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIFwKK3Vuc2lnbmVkIG5hcnJvdyB4YXRvIyNVTihjb25zdCBjaGFyICpzdHIpIFwKK3sgcmV0dXJuIHhhdG8jI1VXKHN0cik7IH0gXAorc3RhdGljIEFMV0FZU19JTkxJTkUgXAorbmFycm93IHhzdHJ0byMjTiMjX3JhbmdlX3NmeChjb25zdCBjaGFyICpzdHIsIGludCBiLCBuYXJyb3cgbCwgbmFycm93IHUsIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCAqc2Z4KSBcCit7IHJldHVybiB4c3RydG8jI1cjI19yYW5nZV9zZngoc3RyLCBiLCBsLCB1LCBzZngpOyB9IFwKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIFwKK25hcnJvdyB4c3RydG8jI04jI19yYW5nZShjb25zdCBjaGFyICpzdHIsIGludCBiLCBuYXJyb3cgbCwgbmFycm93IHUpIFwKK3sgcmV0dXJuIHhzdHJ0byMjVyMjX3JhbmdlKHN0ciwgYiwgbCwgdSk7IH0gXAorc3RhdGljIEFMV0FZU19JTkxJTkUgXAorbmFycm93IHhzdHJ0byMjTihjb25zdCBjaGFyICpzdHIsIGludCBiKSBcCit7IHJldHVybiB4c3RydG8jI1coc3RyLCBiKTsgfSBcCitzdGF0aWMgQUxXQVlTX0lOTElORSBcCituYXJyb3cgeGF0byMjTiMjX3JhbmdlX3NmeChjb25zdCBjaGFyICpzdHIsIG5hcnJvdyBsLCBuYXJyb3cgdSwgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzZngpIFwKK3sgcmV0dXJuIHhhdG8jI1cjI19yYW5nZV9zZngoc3RyLCBsLCB1LCBzZngpOyB9IFwKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIFwKK25hcnJvdyB4YXRvIyNOIyNfcmFuZ2UoY29uc3QgY2hhciAqc3RyLCBuYXJyb3cgbCwgbmFycm93IHUpIFwKK3sgcmV0dXJuIHhhdG8jI1cjI19yYW5nZShzdHIsIGwsIHUpOyB9IFwKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIFwKK25hcnJvdyB4YXRvIyNOIyNfc2Z4KGNvbnN0IGNoYXIgKnN0ciwgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzZngpIFwKK3sgcmV0dXJuIHhhdG8jI1cjI19zZngoc3RyLCBzZngpOyB9IFwKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIFwKK25hcnJvdyB4YXRvIyNOKGNvbnN0IGNoYXIgKnN0cikgXAoreyByZXR1cm4geGF0byMjVyhzdHIpOyB9IFwKKworLyogSWYgbG9uZyA9PSBsb25nIGxvbmcsIHRoZW4ganVzdCBtYXAgdGhlbSBvbmUtdG8tb25lICovCisjaWYgVUxPTkdfTUFYID09IFVMTE9OR19NQVgKK0RFRklORV9FUVVJVl9TVFJfQ09OVihsb25nLCBsLCBsbCwgdWwsIHVsbCkKKyNlbHNlCisvKiBFbHNlIHByb3ZpZGUgZXh0ZXJuIGRlZnMgKi8KK0RFQ0xBUkVfU1RSX0NPTlYobG9uZywgbCwgdWwpCisjZW5kaWYKKworLyogU2FtZSBmb3IgaW50IC0+IFtsb25nXSBsb25nICovCisjaWYgVUlOVF9NQVggPT0gVUxMT05HX01BWAorREVGSU5FX0VRVUlWX1NUUl9DT05WKGludCwgaSwgbGwsIHUsIHVsbCkKKyNlbGlmIFVJTlRfTUFYID09IFVMT05HX01BWAorREVGSU5FX0VRVUlWX1NUUl9DT05WKGludCwgaSwgbCwgdSwgdWwpCisjZWxzZQorREVDTEFSRV9TVFJfQ09OVihpbnQsIGksIHUpCisjZW5kaWYKKworLyogU3BlY2lhbGl6ZWQgKi8KKwordWludDMyX3QgQlVHX3hhdG91MzJfdW5pbXBsZW1lbnRlZCh2b2lkKTsKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHVpbnQzMl90IHhhdG91MzIoY29uc3QgY2hhciAqbnVtc3RyKQoreworCWlmIChVSU5UX01BWCA9PSAweGZmZmZmZmZmKQorCQlyZXR1cm4geGF0b3UobnVtc3RyKTsKKwlpZiAoVUxPTkdfTUFYID09IDB4ZmZmZmZmZmYpCisJCXJldHVybiB4YXRvdWwobnVtc3RyKTsKKwlyZXR1cm4gQlVHX3hhdG91MzJfdW5pbXBsZW1lbnRlZCgpOworfQorCisvKiBOb24tYWJvcnRpbmcga2luZCBvZiBjb252ZXJ0b3JzOiBiYl9zdHJ0b1t1XVtsXWwgKi8KKworLyogT24gZXhpdDogZXJybm8gPSAwIG9ubHkgaWYgdGhlcmUgd2FzIG5vbi1lbXB0eSwgJ1wwJyB0ZXJtaW5hdGVkIHZhbHVlCisgKiBlcnJubyA9IEVJTlZBTCBpZiB2YWx1ZSB3YXMgbm90ICdcMCcgdGVybWluYXRlZCwgYnV0IG90aGVyd2lzZSBvaworICogICAgUmV0dXJuIHZhbHVlIGlzIHN0aWxsIHZhbGlkLCBjYWxsZXIgc2hvdWxkIGp1c3QgY2hlY2sgd2hldGhlciBlbmRbMF0KKyAqICAgIGlzIGEgdmFsaWQgdGVybWluYXRpbmcgY2hhciBmb3IgcGFydGljdWxhciBjYXNlLiBPVE9ILCBpZiBjYWxsZXIKKyAqICAgIHJlcXVpcmVzICdcMCcgdGVybWluYXRlZCBpbnB1dCwgW3NdaGUgY2FuIGp1c3QgY2hlY2sgZXJybm8gPT0gMC4KKyAqIGVycm5vID0gRVJBTkdFIGlmIHZhbHVlIGhhZCBhbHBoYW51bWVyaWMgdGVybWluYXRpbmcgY2hhciAoIjEyMzRhYmNnIikuCisgKiBlcnJubyA9IEVSQU5HRSBpZiB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UsIG1pc3NpbmcsIGV0Yy4KKyAqIGVycm5vID0gRVJBTkdFIGlmIHZhbHVlIGhhZCBtaW51cyBzaWduIGZvciBzdHJ0b3VYWCAoZXZlbiAiLTAiIGlzIG5vdCBvayApCisgKiAgICByZXR1cm4gdmFsdWUgaXMgYWxsLW9uZXMgaW4gdGhpcyBjYXNlLgorICovCisKK3Vuc2lnbmVkIGxvbmcgbG9uZyBiYl9zdHJ0b3VsbChjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkgRkFTVF9GVU5DOworbG9uZyBsb25nIGJiX3N0cnRvbGwoY29uc3QgY2hhciAqYXJnLCBjaGFyICoqZW5kcCwgaW50IGJhc2UpIEZBU1RfRlVOQzsKKworI2lmIFVMT05HX01BWCA9PSBVTExPTkdfTUFYCitzdGF0aWMgQUxXQVlTX0lOTElORQordW5zaWduZWQgbG9uZyBiYl9zdHJ0b3VsKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreyByZXR1cm4gYmJfc3RydG91bGwoYXJnLCBlbmRwLCBiYXNlKTsgfQorc3RhdGljIEFMV0FZU19JTkxJTkUKK2xvbmcgYmJfc3RydG9sKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreyByZXR1cm4gYmJfc3RydG9sbChhcmcsIGVuZHAsIGJhc2UpOyB9CisjZWxzZQordW5zaWduZWQgbG9uZyBiYl9zdHJ0b3VsKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKSBGQVNUX0ZVTkM7Citsb25nIGJiX3N0cnRvbChjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkgRkFTVF9GVU5DOworI2VuZGlmCisKKyNpZiBVSU5UX01BWCA9PSBVTExPTkdfTUFYCitzdGF0aWMgQUxXQVlTX0lOTElORQordW5zaWduZWQgYmJfc3RydG91KGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreyByZXR1cm4gYmJfc3RydG91bGwoYXJnLCBlbmRwLCBiYXNlKTsgfQorc3RhdGljIEFMV0FZU19JTkxJTkUKK2ludCBiYl9zdHJ0b2koY29uc3QgY2hhciAqYXJnLCBjaGFyICoqZW5kcCwgaW50IGJhc2UpCit7IHJldHVybiBiYl9zdHJ0b2xsKGFyZywgZW5kcCwgYmFzZSk7IH0KKyNlbGlmIFVJTlRfTUFYID09IFVMT05HX01BWAorc3RhdGljIEFMV0FZU19JTkxJTkUKK3Vuc2lnbmVkIGJiX3N0cnRvdShjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkKK3sgcmV0dXJuIGJiX3N0cnRvdWwoYXJnLCBlbmRwLCBiYXNlKTsgfQorc3RhdGljIEFMV0FZU19JTkxJTkUKK2ludCBiYl9zdHJ0b2koY29uc3QgY2hhciAqYXJnLCBjaGFyICoqZW5kcCwgaW50IGJhc2UpCit7IHJldHVybiBiYl9zdHJ0b2woYXJnLCBlbmRwLCBiYXNlKTsgfQorI2Vsc2UKK3Vuc2lnbmVkIGJiX3N0cnRvdShjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkgRkFTVF9GVU5DOworaW50IGJiX3N0cnRvaShjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkgRkFTVF9GVU5DOworI2VuZGlmCisKK3VpbnQzMl90IEJVR19iYl9zdHJ0b3UzMl91bmltcGxlbWVudGVkKHZvaWQpOworc3RhdGljIEFMV0FZU19JTkxJTkUKK3VpbnQzMl90IGJiX3N0cnRvdTMyKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreworCWlmIChzaXplb2YodWludDMyX3QpID09IHNpemVvZih1bnNpZ25lZCkpCisJCXJldHVybiBiYl9zdHJ0b3UoYXJnLCBlbmRwLCBiYXNlKTsKKwlpZiAoc2l6ZW9mKHVpbnQzMl90KSA9PSBzaXplb2YodW5zaWduZWQgbG9uZykpCisJCXJldHVybiBiYl9zdHJ0b3VsKGFyZywgZW5kcCwgYmFzZSk7CisJcmV0dXJuIEJVR19iYl9zdHJ0b3UzMl91bmltcGxlbWVudGVkKCk7Cit9CitzdGF0aWMgQUxXQVlTX0lOTElORQoraW50MzJfdCBiYl9zdHJ0b2kzMihjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkKK3sKKwlpZiAoc2l6ZW9mKGludDMyX3QpID09IHNpemVvZihpbnQpKQorCQlyZXR1cm4gYmJfc3RydG9pKGFyZywgZW5kcCwgYmFzZSk7CisJaWYgKHNpemVvZihpbnQzMl90KSA9PSBzaXplb2YobG9uZykpCisJCXJldHVybiBiYl9zdHJ0b2woYXJnLCBlbmRwLCBiYXNlKTsKKwlyZXR1cm4gQlVHX2JiX3N0cnRvdTMyX3VuaW1wbGVtZW50ZWQoKTsKK30KKworLyogRmxvYXRpbmcgcG9pbnQgKi8KKworZG91YmxlIGJiX3N0cnRvZChjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwKSBGQVNUX0ZVTkM7CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hyZWdleC5oIGIvaW5jbHVkZS94cmVnZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTVlNmEyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS94cmVnZXguaApAQCAtMCwwICsxLDIzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBCdXN5Ym94IHhyZWdjb21wIHV0aWxpdHkgcm91dGluZS4gIFRoaXMgaXNuJ3QgaW4gbGliYmIuaCBiZWNhdXNlIHRoZQorICogQyBsaWJyYXJ5IHdlJ3JlIGxpbmtpbmcgYWdhaW5zdCBtYXkgbm90IHN1cHBvcnQgcmVnZXguaC4KKyAqCisgKiBCYXNlZCBpbiBwYXJ0IG9uIGNvZGUgZnJvbSBzYXNoLCBDb3B5cmlnaHQgKGMpIDE5OTkgYnkgRGF2aWQgSS4gQmVsbAorICogUGVybWlzc2lvbiBoYXMgYmVlbiBncmFudGVkIHRvIHJlZGlzdHJpYnV0ZSB0aGlzIGNvZGUgdW5kZXIgR1BMLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpZm5kZWYgQkJfUkVHRVhfSAorI2RlZmluZSBCQl9SRUdFWF9IIDEKKworI2luY2x1ZGUgPHJlZ2V4Lmg+CisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCitjaGFyKiByZWdjb21wX29yX2Vycm1zZyhyZWdleF90ICpwcmVnLCBjb25zdCBjaGFyICpyZWdleCwgaW50IGNmbGFncykgRkFTVF9GVU5DOwordm9pZCB4cmVnY29tcChyZWdleF90ICpwcmVnLCBjb25zdCBjaGFyICpyZWdleCwgaW50IGNmbGFncykgRkFTVF9GVU5DOworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luaXQvQ29uZmlnLnNyYyBiL2luaXQvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzY3YzkzCi0tLSAvZGV2L251bGwKKysrIGIvaW5pdC9Db25maWcuc3JjCkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIkluaXQgVXRpbGl0aWVzIgorCitJTlNFUlQKKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvaW5pdC9LYnVpbGQuc3JjIGIvaW5pdC9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNGZiNzQKLS0tIC9kZXYvbnVsbAorKysgYi9pbml0L0tidWlsZC5zcmMKQEAgLTAsMCArMSw5IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKZGlmZiAtLWdpdCBhL2luaXQvYm9vdGNoYXJ0ZC5jIGIvaW5pdC9ib290Y2hhcnRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczODhjOQotLS0gL2Rldi9udWxsCisrKyBiL2luaXQvYm9vdGNoYXJ0ZC5jCkBAIC0wLDAgKzEsNDY4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vYXBwbGV0OklGX0JPT1RDSEFSVEQoQVBQTEVUKGJvb3RjaGFydGQsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfQk9PVENIQVJURCkgKz0gYm9vdGNoYXJ0ZC5vCisKKy8vY29uZmlnOmNvbmZpZyBCT09UQ0hBUlRECisvL2NvbmZpZzoJYm9vbCAiYm9vdGNoYXJ0ZCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBib290Y2hhcnRkIGlzIGNvbW1vbmx5IHVzZWQgdG8gcHJvZmlsZSB0aGUgYm9vdCBwcm9jZXNzCisvL2NvbmZpZzoJICBmb3IgdGhlIHB1cnBvc2Ugb2Ygc3BlZWRpbmcgaXQgdXAuIEluIHRoaXMgY2FzZSwgaXQgaXMgc3RhcnRlZAorLy9jb25maWc6CSAgYnkgdGhlIGtlcm5lbCBhcyB0aGUgaW5pdCBwcm9jZXNzLiBUaGlzIGlzIGNvbmZpZ3VyZWQgYnkgYWRkaW5nCisvL2NvbmZpZzoJICB0aGUgaW5pdD0vc2Jpbi9ib290Y2hhcnRkIG9wdGlvbiB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZS4KKy8vY29uZmlnOgorLy9jb25maWc6CSAgSXQgY2FuIGFsc28gYmUgdXNlZCB0byBtb25pdG9yIHRoZSByZXNvdXJjZSB1c2FnZSBvZiBhIHNwZWNpZmljCisvL2NvbmZpZzoJICBhcHBsaWNhdGlvbiBvciB0aGUgcnVubmluZyBzeXN0ZW0gaW4gZ2VuZXJhbC4gSW4gdGhpcyBjYXNlLAorLy9jb25maWc6CSAgYm9vdGNoYXJ0ZCBpcyBzdGFydGVkIGludGVyYWN0aXZlbHkgYnkgcnVubmluZyBib290Y2hhcnRkIHN0YXJ0CisvL2NvbmZpZzoJICBhbmQgc3RvcHBlZCB1c2luZyBib290Y2hhcnRkIHN0b3AuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0JPT1RDSEFSVERfQkxPQVRFRF9IRUFERVIKKy8vY29uZmlnOglib29sICJDb21wYXRpYmxlLCBibG9hdGVkIGhlYWRlciIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEJPT1RDSEFSVEQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBDcmVhdGUgZXh0ZW5kZWQgaGVhZGVyIGZpbGUgY29tcGF0aWJsZSB3aXRoICJiaWciIGJvb3RjaGFydGQuCisvL2NvbmZpZzoJICAiQmlnIiBib290Y2hhcnRkIGlzIGEgc2hlbGwgc2NyaXB0IGFuZCBpdCBkdW1wcyBzb21lCisvL2NvbmZpZzoJICAiY29udmVuaWVudCIgaW5mbyBpbnQgdGhlIGhlYWRlciwgc3VjaCBhczoKKy8vY29uZmlnOgkgICAgdGl0bGUgPSBCb290IGNoYXJ0IGZvciBgaG9zdG5hbWVgIChgZGF0ZWApCisvL2NvbmZpZzoJICAgIHN5c3RlbS51bmFtZSA9IGB1bmFtZSAtc3J2bWAKKy8vY29uZmlnOgkgICAgc3lzdGVtLnJlbGVhc2UgPSBgY2F0IC9ldGMvRElTVFJPLXJlbGVhc2VgCisvL2NvbmZpZzoJICAgIHN5c3RlbS5jcHUgPSBgZ3JlcCAnXm1vZGVsIG5hbWUnIC9wcm9jL2NwdWluZm8gfCBoZWFkIC0xYCAoJGNwdWNvdW50KQorLy9jb25maWc6CSAgICBzeXN0ZW0ua2VybmVsLm9wdGlvbnMgPSBgY2F0IC9wcm9jL2NtZGxpbmVgCisvL2NvbmZpZzoJICBUaGlzIGRhdGEgaXMgbm90IG1hbmRhdG9yeSBmb3IgYm9vdGNoYXJ0IGdyYXBoIGdlbmVyYXRpb24sCisvL2NvbmZpZzoJICBhbmQgaXMgY29uc2lkZXJlZCBibG9hdC4gTmV2ZXJ0aGVsZXNzLCB0aGlzIG9wdGlvbgorLy9jb25maWc6CSAgbWFrZXMgYm9vdGNoYXJ0ZCBhcHBsZXQgdG8gZHVtcCBhIHN1YnNldCBvZiBpdC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfQk9PVENIQVJURF9DT05GSUdfRklMRQorLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgYm9vdGNoYXJ0ZC5jb25mIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gQk9PVENIQVJURAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSByZWFkaW5nIGFuZCBwYXJzaW5nIG9mICRQV0QvYm9vdGNoYXJ0ZC5jb25mCisvL2NvbmZpZzoJICBhbmQgL2V0Yy9ib290Y2hhcnRkLmNvbmYgZmlsZXMuCisKKyNpbmNsdWRlICJsaWJiYi5oIgorLyogQWZ0ZXIgbGliYmIuaCwgc2luY2UgaXQgbmVlZHMgc3lzL3R5cGVzLmggb24gc29tZSBzeXN0ZW1zICovCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKworI2lmZGVmIF9fbGludXhfXworIyBpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyMgaWZuZGVmIE1TX1NJTEVOVAorIyAgZGVmaW5lIE1TX1NJTEVOVCAgICAgICgxIDw8IDE1KQorIyBlbmRpZgorIyBpZm5kZWYgTU5UX0RFVEFDSAorIyAgZGVmaW5lIE1OVF9ERVRBQ0ggMHgwMDAwMDAwMgorIyBlbmRpZgorI2VuZGlmCisKKyNpZiAhRU5BQkxFX1RBUiAmJiAhRU5BQkxFX1dFUlJPUgorIyB3YXJuaW5nIE5vdGU6IGJvb3RjaGFydGQgcmVxdWlyZXMgdGFyIGNvbW1hbmQsIGJ1dCB5b3UgZGlkIG5vdCBzZWxlY3QgaXQuCisjZWxpZiAhRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfR1ogJiYgIUVOQUJMRV9XRVJST1IKKyMgd2FybmluZyBOb3RlOiBib290Y2hhcnRkIHJlcXVpcmVzIHRhciAteiBzdXBwb3J0LCBidXQgeW91IGRpZCBub3Qgc2VsZWN0IGl0LgorI2VuZGlmCisKKyNkZWZpbmUgQkNfVkVSU0lPTl9TVFIgIjAuOCIKKworLyogRm9yIGRlYnVnZ2luZywgc2V0IHRvIDA6CisgKiBzdHJhY2Ugd29uJ3Qgd29yayB3aXRoIERPX1NJR05BTF9TWU5DIHNldCB0byAxLgorICovCisjZGVmaW5lIERPX1NJR05BTF9TWU5DIDEKKworCisvLyRQV0QvYm9vdGNoYXJ0ZC5jb25mIGFuZCAvZXRjL2Jvb3RjaGFydGQuY29uZjoKKy8vc3VwcG9ydGVkIG9wdGlvbnM6CisvLyMgU2FtcGxpbmcgcGVyaW9kIChpbiBzZWNvbmRzKQorLy9TQU1QTEVfUEVSSU9EPTAuMgorLy8KKy8vbm90IHlldCBzdXBwb3J0ZWQ6CisvLyMgdG1wZnMgc2l6ZQorLy8jICgzMiBNQiBzaG91bGQgc3VmZmljZSBmb3IgfjIwIG1pbnV0ZXMgd29ydGggb2YgbG9nIGRhdGEsIGJ1dCBZTU1WKQorLy9UTVBGU19TSVpFPTMybQorLy8KKy8vIyBXaGV0aGVyIHRvIGVuYWJsZSBhbmQgc3RvcmUgQlNEIHByb2Nlc3MgYWNjb3VudGluZyBpbmZvcm1hdGlvbi4gIFRoZQorLy8jIGtlcm5lbCBuZWVkcyB0byBiZSBjb25maWd1cmVkIHRvIGVuYWJsZSB2MyBhY2NvdW50aW5nCisvLyMgKENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzKS4gYWNjdG9uIGZyb20gdGhlIEdOVSBhY2NvdW50aW5nIHV0aWxpdGllcworLy8jIGlzIGFsc28gcmVxdWlyZWQuCisvL1BST0NFU1NfQUNDT1VOVElORz0ibm8iCisvLworLy8jIFRhcmJhbGwgZm9yIHRoZSB2YXJpb3VzIGJvb3QgbG9nIGZpbGVzCisvL0JPT1RMT0dfREVTVD0vdmFyL2xvZy9ib290Y2hhcnQudGd6CisvLworLy8jIFdoZXRoZXIgdG8gYXV0b21hdGljYWxseSBzdG9wIGxvZ2dpbmcgYXMgdGhlIGJvb3QgcHJvY2VzcyBjb21wbGV0ZXMuCisvLyMgVGhlIGxvZ2dlciB3aWxsIGxvb2sgZm9yIGtub3duIHByb2Nlc3NlcyB0aGF0IGluZGljYXRlIGJvb3R1cCBjb21wbGV0aW9uCisvLyMgYXQgYSBzcGVjaWZpYyBydW5sZXZlbCAoZS5nLiBnZG0tYmluYXJ5LCBtaW5nZXR0eSwgZXRjLikuCisvL0FVVE9fU1RPUF9MT0dHRVI9InllcyIKKy8vCisvLyMgV2hldGhlciB0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIHRoZSBib290IGNoYXJ0IG9uY2UgdGhlIGJvb3QgbG9nZ2VyCisvLyMgY29tcGxldGVzLiAgVGhlIGJvb3QgY2hhcnQgd2lsbCBiZSBnZW5lcmF0ZWQgaW4gJEFVVE9fUkVOREVSX0RJUi4KKy8vIyBOb3RlIHRoYXQgdGhlIGJvb3RjaGFydCBwYWNrYWdlIG11c3QgYmUgaW5zdGFsbGVkLgorLy9BVVRPX1JFTkRFUj0ibm8iCisvLworLy8jIEltYWdlIGZvcm1hdCB0byB1c2UgZm9yIHRoZSBhdXRvLWdlbmVyYXRlZCBib290IGNoYXJ0CisvLyMgKGNob29zZSBiZXR3ZWVuIHBuZywgc3ZnIGFuZCBlcHMpLgorLy9BVVRPX1JFTkRFUl9GT1JNQVQ9InBuZyIKKy8vCisvLyMgT3V0cHV0IGRpcmVjdG9yeSBmb3IgYXV0by1nZW5lcmF0ZWQgYm9vdCBjaGFydHMKKy8vQVVUT19SRU5ERVJfRElSPSIvdmFyL2xvZyIKKworCisvKiBHbG9iYWxzICovCitzdHJ1Y3QgZ2xvYmFscyB7CisJY2hhciBqaWZmeV9saW5lW0NPTU1PTl9CVUZTSVpFXTsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgZHVtcF9maWxlKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlpbnQgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkID49IDApIHsKKwkJZnB1dHMoRy5qaWZmeV9saW5lLCBmcCk7CisJCWZmbHVzaChmcCk7CisJCWJiX2NvcHlmZF9lb2YoZmQsIGZpbGVubyhmcCkpOworCQljbG9zZShmZCk7CisJCWZwdXRjKCdcbicsIGZwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgZHVtcF9wcm9jcyhGSUxFICpmcCwgaW50IGxvb2tfZm9yX2xvZ2luX3Byb2Nlc3MpCit7CisJc3RydWN0IGRpcmVudCAqZW50cnk7CisJRElSICpkaXIgPSBvcGVuZGlyKCIvcHJvYyIpOworCWludCBmb3VuZF9sb2dpbl9wcm9jZXNzID0gMDsKKworCWZwdXRzKEcuamlmZnlfbGluZSwgZnApOworCXdoaWxlICgoZW50cnkgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJY2hhciBuYW1lW3NpemVvZigiL3Byb2MvJXUvY21kbGluZSIpICsgc2l6ZW9mKGludCkqM107CisJCWludCBzdGF0X2ZkOworCQl1bnNpZ25lZCBwaWQgPSBiYl9zdHJ0b3UoZW50cnktPmRfbmFtZSwgTlVMTCwgMTApOworCQlpZiAoZXJybm8pCisJCQljb250aW51ZTsKKworCQkvKiBBbmRyb2lkJ3MgdmVyc2lvbiByZWFkcyAvcHJvYy9QSUQvY21kbGluZSBhbmQgZXh0cmFjdHMKKwkJICogbm9uLXRydW5jYXRlZCBwcm9jZXNzIG5hbWUuIERvIHdlIHdhbnQgdG8gZG8gdGhhdD8gKi8KKworCQlzcHJpbnRmKG5hbWUsICIvcHJvYy8ldS9zdGF0IiwgcGlkKTsKKwkJc3RhdF9mZCA9IG9wZW4obmFtZSwgT19SRE9OTFkpOworCQlpZiAoc3RhdF9mZCA+PSAwKSB7CisJCQljaGFyICpwOworCQkJY2hhciBzdGF0X2xpbmVbNCoxMDI0XTsKKwkJCWludCByZCA9IHNhZmVfcmVhZChzdGF0X2ZkLCBzdGF0X2xpbmUsIHNpemVvZihzdGF0X2xpbmUpLTIpOworCisJCQljbG9zZShzdGF0X2ZkKTsKKwkJCWlmIChyZCA8IDApCisJCQkJY29udGludWU7CisJCQlzdGF0X2xpbmVbcmRdID0gJ1wwJzsKKwkJCXAgPSBzdHJjaHJudWwoc3RhdF9saW5lLCAnXG4nKTsKKwkJCSpwKysgPSAnXG4nOworCQkJKnAgPSAnXDAnOworCQkJZnB1dHMoc3RhdF9saW5lLCBmcCk7CisJCQlpZiAoIWxvb2tfZm9yX2xvZ2luX3Byb2Nlc3MpCisJCQkJY29udGludWU7CisJCQlwID0gc3RyY2hyKHN0YXRfbGluZSwgJygnKTsKKwkJCWlmICghcCkKKwkJCQljb250aW51ZTsKKwkJCXArKzsKKwkJCXN0cmNocm51bChwLCAnKScpWzBdID0gJ1wwJzsKKwkJCS8qIElzIGl0IGdkbSwga2RtIG9yIGEgZ2V0dHk/ICovCisJCQlpZiAoKChwWzBdID09ICdnJyB8fCBwWzBdID09ICdrJyB8fCBwWzBdID09ICd4JykgJiYgcFsxXSA9PSAnZCcgJiYgcFsyXSA9PSAnbScpCisJCQkgfHwgc3Ryc3RyKHAsICJnZXR0eSIpCisJCQkpIHsKKwkJCQlmb3VuZF9sb2dpbl9wcm9jZXNzID0gMTsKKwkJCX0KKwkJfQorCX0KKwljbG9zZWRpcihkaXIpOworCWZwdXRjKCdcbicsIGZwKTsKKwlyZXR1cm4gZm91bmRfbG9naW5fcHJvY2VzczsKK30KKworc3RhdGljIGNoYXIgKm1ha2VfdGVtcGRpcih2b2lkKQoreworCWNoYXIgdGVtcGxhdGVbXSA9ICIvdG1wL2Jvb3RjaGFydC5YWFhYWFgiOworCWNoYXIgKnRlbXBkaXIgPSB4c3RyZHVwKG1rZHRlbXAodGVtcGxhdGUpKTsKKwlpZiAoIXRlbXBkaXIpIHsKKyNpZmRlZiBfX2xpbnV4X18KKwkJLyogL3RtcCBpcyBub3Qgd3JpdGFibGUgKGhhcHBlbnMgd2hlbiB3ZSBhcmUgdXNlZCBhcyBpbml0KS4KKwkJICogVHJ5IHRvIG1vdW50IGEgdG1wZnMsIHRoZW0gY2QgYW5kIGxhemlseSB1bm1vdW50IGl0LgorCQkgKiBTaW5jZSB3ZSB1bm1vdW50IGl0IGF0IG9uY2UsIHdlIGNhbiBtb3VudCBpdCBhbnl3aGVyZS4KKwkJICogVHJ5IGEgZmV3IGxvY2F0aW9ucyB3aGljaCBhcmUgbGlrZWx5IHRpIGV4aXN0LgorCQkgKi8KKwkJc3RhdGljIGNvbnN0IGNoYXIgZGlyc1tdID0gIi9tbnRcMCIiL3RtcFwwIiIvYm9vdFwwIiIvcHJvY1wwIjsKKwkJY29uc3QgY2hhciAqdHJ5X2RpciA9IGRpcnM7CisJCXdoaWxlIChtb3VudCgibm9uZSIsIHRyeV9kaXIsICJ0bXBmcyIsIE1TX1NJTEVOVCwgInNpemU9MTZtIikgIT0gMCkgeworCQkJdHJ5X2RpciArPSBzdHJsZW4odHJ5X2RpcikgKyAxOworCQkJaWYgKCF0cnlfZGlyWzBdKQorCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgJXNtb3VudCB0bXBmcyIsICIiKTsKKwkJfQorCQkvL2JiX2Vycm9yX21zZygibW91bnRlZCB0bXBmcyBvbiAlcyIsIHRyeV9kaXIpOworCQl4Y2hkaXIodHJ5X2Rpcik7CisJCWlmICh1bW91bnQyKHRyeV9kaXIsIE1OVF9ERVRBQ0gpICE9IDApIHsKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgJXNtb3VudCB0bXBmcyIsICJ1biIpOworCQl9CisjZWxzZQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGNyZWF0ZSB0ZW1wb3JhcnkgZGlyZWN0b3J5Iik7CisjZW5kaWYKKwl9IGVsc2UgeworCQl4Y2hkaXIodGVtcGRpcik7CisJfQorCXJldHVybiB0ZW1wZGlyOworfQorCitzdGF0aWMgdm9pZCBkb19sb2dnaW5nKHVuc2lnbmVkIHNhbXBsZV9wZXJpb2RfdXMsIGludCBwcm9jZXNzX2FjY291bnRpbmcpCit7CisJRklMRSAqcHJvY19zdGF0ID0geGZvcGVuKCJwcm9jX3N0YXQubG9nIiwgInciKTsKKwlGSUxFICpwcm9jX2Rpc2tzdGF0cyA9IHhmb3BlbigicHJvY19kaXNrc3RhdHMubG9nIiwgInciKTsKKwkvL0ZJTEUgKnByb2NfbmV0ZGV2ID0geGZvcGVuKCJwcm9jX25ldGRldi5sb2ciLCAidyIpOworCUZJTEUgKnByb2NfcHMgPSB4Zm9wZW4oInByb2NfcHMubG9nIiwgInciKTsKKwlpbnQgbG9va19mb3JfbG9naW5fcHJvY2VzcyA9IChnZXRwcGlkKCkgPT0gMSk7CisJdW5zaWduZWQgY291bnQgPSA2MCoxMDAwKjEwMDAgLyBzYW1wbGVfcGVyaW9kX3VzOyAvKiB+MSBtaW51dGUgKi8KKworCWlmIChwcm9jZXNzX2FjY291bnRpbmcpIHsKKwkJY2xvc2UoeG9wZW4oImtlcm5lbF9wYWNjdCIsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMpKTsKKwkJYWNjdCgia2VybmVsX3BhY2N0Iik7CisJfQorCisJd2hpbGUgKC0tY291bnQgJiYgIWJiX2dvdF9zaWduYWwpIHsKKwkJY2hhciAqcDsKKwkJaW50IGxlbiA9IG9wZW5fcmVhZF9jbG9zZSgiL3Byb2MvdXB0aW1lIiwgRy5qaWZmeV9saW5lLCBzaXplb2YoRy5qaWZmeV9saW5lKS0yKTsKKwkJaWYgKGxlbiA8IDApCisJCQlnb3RvIHdhaXRfbW9yZTsKKwkJLyogL3Byb2MvdXB0aW1lIGhhcyBmb3JtYXQgIk5OTk5OTi5NTSBOTk5OTk5OLk1NIiAqLworCQkvKiB3ZSBjb252ZXJ0IGl0IHRvICJOTk5OTk5NTVxuIiAodXNpbmcgZmlyc3QgdmFsdWUpICovCisJCUcuamlmZnlfbGluZVtsZW5dID0gJ1wwJzsKKwkJcCA9IHN0cmNocihHLmppZmZ5X2xpbmUsICcuJyk7CisJCWlmICghcCkKKwkJCWdvdG8gd2FpdF9tb3JlOworCQl3aGlsZSAoaXNkaWdpdCgqKytwKSkKKwkJCXBbLTFdID0gKnA7CisJCXBbLTFdID0gJ1xuJzsKKwkJcFswXSA9ICdcMCc7CisKKwkJZHVtcF9maWxlKHByb2Nfc3RhdCwgIi9wcm9jL3N0YXQiKTsKKwkJZHVtcF9maWxlKHByb2NfZGlza3N0YXRzLCAiL3Byb2MvZGlza3N0YXRzIik7CisJCS8vZHVtcF9maWxlKHByb2NfbmV0ZGV2LCAiL3Byb2MvbmV0L2RldiIpOworCQlpZiAoZHVtcF9wcm9jcyhwcm9jX3BzLCBsb29rX2Zvcl9sb2dpbl9wcm9jZXNzKSkgeworCQkJLyogZHVtcF9wcm9jcyBzYXcgYSBnZXR0eSBvciB7ZyxrLHh9ZG0KKwkJCSAqIHN0b3AgbG9nZ2luZyBpbiAyIHNlY29uZHM6CisJCQkgKi8KKwkJCWlmIChjb3VudCA+IDIqMTAwMCoxMDAwIC8gc2FtcGxlX3BlcmlvZF91cykKKwkJCQljb3VudCA9IDIqMTAwMCoxMDAwIC8gc2FtcGxlX3BlcmlvZF91czsKKwkJfQorCQlmZmx1c2hfYWxsKCk7Cisgd2FpdF9tb3JlOgorCQl1c2xlZXAoc2FtcGxlX3BlcmlvZF91cyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBmaW5hbGl6ZShjaGFyICp0ZW1wZGlyLCBjb25zdCBjaGFyICpwcm9nLCBpbnQgcHJvY2Vzc19hY2NvdW50aW5nKQoreworCS8vIyBTdG9wIHByb2Nlc3MgYWNjb3VudGluZyBpZiBjb25maWd1cmVkCisJLy9sb2NhbCBwYWNjdD0KKwkvL1sgLWUga2VybmVsX3BhY2N0IF0gJiYgcGFjY3Q9a2VybmVsX3BhY2N0CisKKwlGSUxFICpoZWFkZXJfZnAgPSB4Zm9wZW4oImhlYWRlciIsICJ3Iik7CisKKwlpZiAocHJvY2Vzc19hY2NvdW50aW5nKQorCQlhY2N0KE5VTEwpOworCisJaWYgKHByb2cpCisJCWZwcmludGYoaGVhZGVyX2ZwLCAicHJvZmlsZS5wcm9jZXNzID0gJXNcbiIsIHByb2cpOworCisJZnB1dHMoInZlcnNpb24gPSAiQkNfVkVSU0lPTl9TVFIiXG4iLCBoZWFkZXJfZnApOworCWlmIChFTkFCTEVfRkVBVFVSRV9CT09UQ0hBUlREX0JMT0FURURfSEVBREVSKSB7CisJCWNoYXIgKmhvc3RuYW1lOworCQljaGFyICprY21kbGluZTsKKwkJdGltZV90IHQ7CisJCXN0cnVjdCB0bSB0bV90aW1lOworCQkvKiB4MiBmb3IgcG9zc2libGUgbG9jYWxpemVkIHdlZWtkYXkvbW9udGggbmFtZXMgKi8KKwkJY2hhciBkYXRlX2J1ZltzaXplb2YoIk1vbiBKdW4gMjEgMDU6Mjk6MDMgQ0VTVCAyMDEwIikgKiAyXTsKKwkJc3RydWN0IHV0c25hbWUgdW5hbWVidWY7CisKKwkJaG9zdG5hbWUgPSBzYWZlX2dldGhvc3RuYW1lKCk7CisJCXRpbWUoJnQpOworCQlsb2NhbHRpbWVfcigmdCwgJnRtX3RpbWUpOworCQlzdHJmdGltZShkYXRlX2J1Ziwgc2l6ZW9mKGRhdGVfYnVmKSwgIiVhICViICVlICVIOiVNOiVTICVaICVZIiwgJnRtX3RpbWUpOworCQlmcHJpbnRmKGhlYWRlcl9mcCwgInRpdGxlID0gQm9vdCBjaGFydCBmb3IgJXMgKCVzKVxuIiwgaG9zdG5hbWUsIGRhdGVfYnVmKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZShob3N0bmFtZSk7CisKKwkJdW5hbWUoJnVuYW1lYnVmKTsgLyogbmV2ZXIgZmFpbHMgKi8KKwkJLyogc2FtZSBhcyB1bmFtZSAtc3J2bSAqLworCQlmcHJpbnRmKGhlYWRlcl9mcCwgInN5c3RlbS51bmFtZSA9ICVzICVzICVzICVzXG4iLAorCQkJCXVuYW1lYnVmLnN5c25hbWUsCisJCQkJdW5hbWVidWYucmVsZWFzZSwKKwkJCQl1bmFtZWJ1Zi52ZXJzaW9uLAorCQkJCXVuYW1lYnVmLm1hY2hpbmUKKwkJKTsKKworCQkvL3N5c3RlbS5yZWxlYXNlID0gYGNhdCAvZXRjL0RJU1RSTy1yZWxlYXNlYAorCQkvL3N5c3RlbS5jcHUgPSBgZ3JlcCAnXm1vZGVsIG5hbWUnIC9wcm9jL2NwdWluZm8gfCBoZWFkIC0xYCAoJGNwdWNvdW50KQorCisJCWtjbWRsaW5lID0geG1hbGxvY19vcGVuX3JlYWRfY2xvc2UoIi9wcm9jL2NtZGxpbmUiLCBOVUxMKTsKKwkJLyoga2NtZGxpbmUgaW5jbHVkZXMgdHJhaWxpbmcgIlxuIiAqLworCQlmcHJpbnRmKGhlYWRlcl9mcCwgInN5c3RlbS5rZXJuZWwub3B0aW9ucyA9ICVzIiwga2NtZGxpbmUpOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQlmcmVlKGtjbWRsaW5lKTsKKwl9CisJZmNsb3NlKGhlYWRlcl9mcCk7CisKKwkvKiBQYWNrYWdlIGxvZyBmaWxlcyAqLworCXN5c3RlbSh4YXNwcmludGYoInRhciAtemNmIC92YXIvbG9nL2Jvb3Rsb2cudGd6IGhlYWRlciAlcyAqLmxvZyIsIHByb2Nlc3NfYWNjb3VudGluZyA/ICJrZXJuZWxfcGFjY3QiIDogIiIpKTsKKwkvKiBDbGVhbiB1cCAoaWYgd2UgYXJlIG5vdCBpbiBkZXRhY2hlZCB0bXBmcykgKi8KKwlpZiAodGVtcGRpcikgeworCQl1bmxpbmsoImhlYWRlciIpOworCQl1bmxpbmsoInByb2Nfc3RhdC5sb2ciKTsKKwkJdW5saW5rKCJwcm9jX2Rpc2tzdGF0cy5sb2ciKTsKKwkJLy91bmxpbmsoInByb2NfbmV0ZGV2LmxvZyIpOworCQl1bmxpbmsoInByb2NfcHMubG9nIik7CisJCWlmIChwcm9jZXNzX2FjY291bnRpbmcpCisJCQl1bmxpbmsoImtlcm5lbF9wYWNjdCIpOworCQlybWRpcih0ZW1wZGlyKTsKKwl9CisKKwkvKiBzaGVsbC1iYXNlZCBib290Y2hhcnRkIHRyaWVzIHRvIHJ1biAvdXNyL2Jpbi9ib290Y2hhcnQgaWYgJEFVVE9fUkVOREVSPXllczoKKwkgKiAvdXNyL2Jpbi9ib290Y2hhcnQgLW8gIiRBVVRPX1JFTkRFUl9ESVIiIC1mICRBVVRPX1JFTkRFUl9GT1JNQVQgIiRCT09UTE9HX0RFU1QiCisJICovCit9CisKKy8vdXNhZ2U6I2RlZmluZSBib290Y2hhcnRkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJzdGFydCBbUFJPRyBBUkdTXXxzdG9wfGluaXQiCisvL3VzYWdlOiNkZWZpbmUgYm9vdGNoYXJ0ZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNyZWF0ZSAvdmFyL2xvZy9ib290Y2hhcnQudGd6IHdpdGggYm9vdCBjaGFydCBkYXRhXG4iCisvL3VzYWdlOiAgICAgIlxuc3RhcnQ6IHN0YXJ0IGJhY2tncm91bmQgbG9nZ2luZzsgd2l0aCBQUk9HLCBydW4gUFJPRywgdGhlbiBraWxsIGxvZ2dpbmcgd2l0aCBVU1IxIgorLy91c2FnZTogICAgICJcbnN0b3A6IHNlbmQgVVNSMSB0byBhbGwgYm9vdGNoYXJ0ZCBwcm9jZXNzZXMiCisvL3VzYWdlOiAgICAgIlxuaW5pdDogc3RhcnQgYmFja2dyb3VuZCBsb2dnaW5nOyBzdG9wIHdoZW4gZ2V0dHkveGRtIGlzIHNlZW4gKGZvciBpbml0IHNjcmlwdHMpIgorLy91c2FnZTogICAgICJcblVuZGVyIFBJRCAxOiBhcyBpbml0LCB0aGVuIGV4ZWMgJGJvb3RjaGFydF9pbml0LCAvaW5pdCwgL3NiaW4vaW5pdCIKKworaW50IGJvb3RjaGFydGRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGJvb3RjaGFydGRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIHNhbXBsZV9wZXJpb2RfdXM7CisJcGlkX3QgcGFyZW50X3BpZCwgbG9nZ2VyX3BpZDsKKwlzbWFsbGludCBjbWQ7CisJaW50IHByb2Nlc3NfYWNjb3VudGluZzsKKwllbnVtIHsKKwkJQ01EX1NUT1AgPSAwLAorCQlDTURfU1RBUlQsCisJCUNNRF9JTklULAorCQlDTURfUElEMSwgLyogdXNlZCB0byBtYXJrIHBpZCAxIGNhc2UgKi8KKwl9OworCisJSU5JVF9HKCk7CisKKwlwYXJlbnRfcGlkID0gZ2V0cGlkKCk7CisJaWYgKGFyZ3ZbMV0pIHsKKwkJY21kID0gaW5kZXhfaW5fc3RyaW5ncygic3RvcFwwIiJzdGFydFwwIiJpbml0XDAiLCBhcmd2WzFdKTsKKwkJaWYgKGNtZCA8IDApCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWlmIChjbWQgPT0gQ01EX1NUT1ApIHsKKwkJCXBpZF90ICpwaWRMaXN0ID0gZmluZF9waWRfYnlfbmFtZSgiYm9vdGNoYXJ0ZCIpOworCQkJd2hpbGUgKCpwaWRMaXN0ICE9IDApIHsKKwkJCQlpZiAoKnBpZExpc3QgIT0gcGFyZW50X3BpZCkKKwkJCQkJa2lsbCgqcGlkTGlzdCwgU0lHVVNSMSk7CisJCQkJcGlkTGlzdCsrOworCQkJfQorCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChwYXJlbnRfcGlkICE9IDEpCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWNtZCA9IENNRF9QSUQxOworCX0KKworCS8qIEhlcmUgd2UgYXJlIGluIFNUQVJULCBJTklUIG9yIENNRF9QSUQxIHN0YXRlICovCisKKwkvKiBSZWFkIGNvbmZpZyBmaWxlOiAqLworCXNhbXBsZV9wZXJpb2RfdXMgPSAyMDAgKiAxMDAwOworCXByb2Nlc3NfYWNjb3VudGluZyA9IDA7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0JPT1RDSEFSVERfQ09ORklHX0ZJTEUpIHsKKwkJY2hhciogdG9rZW5bMl07CisJCXBhcnNlcl90ICpwYXJzZXIgPSBjb25maWdfb3BlbjIoIi9ldGMvYm9vdGNoYXJ0ZC5jb25mIiArIDUsIGZvcGVuX2Zvcl9yZWFkKTsKKwkJaWYgKCFwYXJzZXIpCisJCQlwYXJzZXIgPSBjb25maWdfb3BlbjIoIi9ldGMvYm9vdGNoYXJ0ZC5jb25mIiwgZm9wZW5fZm9yX3JlYWQpOworCQl3aGlsZSAoY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbiwgMiwgMCwgIiM9IiwgUEFSU0VfTk9STUFMICYgflBBUlNFX0NPTExBUFNFKSkgeworCQkJaWYgKHN0cmNtcCh0b2tlblswXSwgIlNBTVBMRV9QRVJJT0QiKSA9PSAwICYmIHRva2VuWzFdKQorCQkJCXNhbXBsZV9wZXJpb2RfdXMgPSBhdG9mKHRva2VuWzFdKSAqIDEwMDAwMDA7CisJCQlpZiAoc3RyY21wKHRva2VuWzBdLCAiUFJPQ0VTU19BQ0NPVU5USU5HIikgPT0gMCAmJiB0b2tlblsxXQorCQkJICYmIChzdHJjbXAodG9rZW5bMV0sICJvbiIpID09IDAgfHwgc3RyY21wKHRva2VuWzFdLCAieWVzIikgPT0gMCkKKwkJCSkgeworCQkJCXByb2Nlc3NfYWNjb3VudGluZyA9IDE7CisJCQl9CisJCX0KKwkJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisJCWlmICgoaW50KXNhbXBsZV9wZXJpb2RfdXMgPD0gMCkKKwkJCXNhbXBsZV9wZXJpb2RfdXMgPSAxOyAvKiBwcmV2ZW50IGRpdmlzaW9uIGJ5IDAgKi8KKwl9CisKKwkvKiBDcmVhdGUgbG9nZ2VyIGNoaWxkOiAqLworCWxvZ2dlcl9waWQgPSBmb3JrX29yX3JleGVjKGFyZ3YpOworCisJaWYgKGxvZ2dlcl9waWQgPT0gMCkgeyAvKiBjaGlsZCAqLworCQljaGFyICp0ZW1wZGlyOworCisJCWJiX3NpZ25hbHMoMAorCQkJKyAoMSA8PCBTSUdVU1IxKQorCQkJKyAoMSA8PCBTSUdVU1IyKQorCQkJKyAoMSA8PCBTSUdURVJNKQorCQkJKyAoMSA8PCBTSUdRVUlUKQorCQkJKyAoMSA8PCBTSUdJTlQpCisJCQkrICgxIDw8IFNJR0hVUCkKKwkJCSwgcmVjb3JkX3NpZ25vKTsKKworCQlpZiAoRE9fU0lHTkFMX1NZTkMpCisJCQkvKiBJbmZvcm0gcGFyZW50IHRoYXQgd2UgYXJlIHJlYWR5ICovCisJCQlyYWlzZShTSUdTVE9QKTsKKworCQkvKiBJZiB3ZSBhcmUgc3RhcnRlZCBieSBrZXJuZWwsIFBBVEggbWlnaHQgYmUgdW5zZXQuCisJCSAqIEluIG9yZGVyIHRvIGZpbmQgInRhciIsIGxldCdzIHNldCBzb21lIHNhbmUgUEFUSDoKKwkJICovCisJCWlmIChjbWQgPT0gQ01EX1BJRDEgJiYgIWdldGVudigiUEFUSCIpKQorCQkJcHV0ZW52KChjaGFyKiliYl9QQVRIX3Jvb3RfcGF0aCk7CisKKwkJdGVtcGRpciA9IG1ha2VfdGVtcGRpcigpOworCQlkb19sb2dnaW5nKHNhbXBsZV9wZXJpb2RfdXMsIHByb2Nlc3NfYWNjb3VudGluZyk7CisJCWZpbmFsaXplKHRlbXBkaXIsIGNtZCA9PSBDTURfU1RBUlQgPyBhcmd2WzJdIDogTlVMTCwgcHJvY2Vzc19hY2NvdW50aW5nKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwkvKiBwYXJlbnQgKi8KKworCVVTRV9GT1JfTk9NTVUoYXJndlswXVswXSAmPSAweDdmKTsgLyogdW5kbyBmb3JrX29yX3JleGVjKCkgZGFtYWdlICovCisKKwlpZiAoRE9fU0lHTkFMX1NZTkMpIHsKKwkJLyogV2FpdCBmb3IgbG9nZ2VyIGNoaWxkIHRvIHNldCBoYW5kbGVycywgdGhlbiB1bnBhdXNlIGl0LgorCQkgKiBPdGhlcndpc2Ugd2l0aCBzaG9ydC1saXZlZCBQUk9HIChlLmcuICJib290Y2hhcnRkIHN0YXJ0IHRydWUiKQorCQkgKiB3ZSBtaWdodCBzZW5kIFNJR1VTUjEgYmVmb3JlIGxvZ2dlciBzZXRzIGl0cyBoYW5kbGVyLgorCQkgKi8KKwkJd2FpdHBpZChsb2dnZXJfcGlkLCBOVUxMLCBXVU5UUkFDRUQpOworCQlraWxsKGxvZ2dlcl9waWQsIFNJR0NPTlQpOworCX0KKworCWlmIChjbWQgPT0gQ01EX1BJRDEpIHsKKwkJY2hhciAqYm9vdGNoYXJ0X2luaXQgPSBnZXRlbnYoImJvb3RjaGFydF9pbml0Iik7CisJCWlmIChib290Y2hhcnRfaW5pdCkKKwkJCWV4ZWNsKGJvb3RjaGFydF9pbml0LCBib290Y2hhcnRfaW5pdCwgTlVMTCk7CisJCWV4ZWNsKCIvaW5pdCIsICJpbml0IiwgTlVMTCk7CisJCWV4ZWNsKCIvc2Jpbi9pbml0IiwgImluaXQiLCBOVUxMKTsKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBleGVjdXRlICclcyciLCAiL3NiaW4vaW5pdCIpOworCX0KKworCWlmIChjbWQgPT0gQ01EX1NUQVJUICYmIGFyZ3ZbMl0pIHsgLyogInN0YXJ0IFBST0cgQVJHUyIgKi8KKwkJcGlkX3QgcGlkID0geHZmb3JrKCk7CisJCWlmIChwaWQgPT0gMCkgeyAvKiBjaGlsZCAqLworCQkJYXJndiArPSAyOworCQkJQkJfRVhFQ1ZQX29yX2RpZShhcmd2KTsKKwkJfQorCQkvKiBwYXJlbnQgKi8KKwkJd2FpdHBpZChwaWQsIE5VTEwsIDApOworCQlraWxsKGxvZ2dlcl9waWQsIFNJR1VTUjEpOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9pbml0L2hhbHQuYyBiL2luaXQvaGFsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMTJkOTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbml0L2hhbHQuYwpAQCAtMCwwICsxLDE3MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogUG93ZXJvZmYgcmVib290IGFuZCBoYWx0LCBvaCBteS4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNiBieSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9hcHBsZXQ6SUZfSEFMVChBUFBMRVQoaGFsdCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisvL2FwcGxldDpJRl9IQUxUKEFQUExFVF9PREROQU1FKHBvd2Vyb2ZmLCBoYWx0LCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBwb3dlcm9mZikpCisvL2FwcGxldDpJRl9IQUxUKEFQUExFVF9PREROQU1FKHJlYm9vdCwgaGFsdCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCwgcmVib290KSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0hBTFQpICs9IGhhbHQubworCisvL2NvbmZpZzpjb25maWcgSEFMVAorLy9jb25maWc6CWJvb2wgInBvd2Vyb2ZmLCBoYWx0LCBhbmQgcmVib290IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFN0b3AgYWxsIHByb2Nlc3NlcyBhbmQgZWl0aGVyIGhhbHQsIHJlYm9vdCwgb3IgcG93ZXIgb2ZmIHRoZSBzeXN0ZW0uCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0NBTExfVEVMSU5JVAorLy9jb25maWc6CWJvb2wgIkNhbGwgdGVsaW5pdCBvbiBzaHV0ZG93biBhbmQgcmVib290IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSEFMVCAmJiAhSU5JVAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIENhbGwgYW4gZXh0ZXJuYWwgcHJvZ3JhbSAobm9ybWFsbHkgdGVsaW5pdCkgdG8gZmFjaWxpdGF0ZQorLy9jb25maWc6CSAgYSBzd2l0Y2ggdG8gYSBwcm9wZXIgcnVubGV2ZWwuCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIFRoaXMgb3B0aW9uIGlzIG9ubHkgYXZhaWxhYmxlIGlmIHlvdSBzZWxlY3RlZCBoYWx0IGFuZCBmcmllbmRzLAorLy9jb25maWc6CSAgYnV0IGRpZCBub3Qgc2VsZWN0IGluaXQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBURUxJTklUX1BBVEgKKy8vY29uZmlnOglzdHJpbmcgIlBhdGggdG8gdGVsaW5pdCBleGVjdXRhYmxlIgorLy9jb25maWc6CWRlZmF1bHQgIi9zYmluL3RlbGluaXQiCisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGRUFUVVJFX0NBTExfVEVMSU5JVAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFdoZW4gYnVzeWJveCBoYWx0IGFuZCBmcmllbmRzIGhhdmUgdG8gY2FsbCBleHRlcm5hbCB0ZWxpbml0CisvL2NvbmZpZzoJICB0byBmYWNpbGl0YXRlIHByb3BlciBzaHV0ZG93biwgdGhpcyBwYXRoIGlzIHRvIGJlIHVzZWQgd2hlbgorLy9jb25maWc6CSAgbG9jYXRpbmcgdGVsaW5pdCBleGVjdXRhYmxlLgorCisvL3VzYWdlOiNkZWZpbmUgaGFsdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1kIERFTEFZXSBbLW5dIFstZl0iIElGX0ZFQVRVUkVfV1RNUCgiIFstd10iKQorLy91c2FnZTojZGVmaW5lIGhhbHRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJIYWx0IHRoZSBzeXN0ZW1cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWQgU0VDCURlbGF5IGludGVydmFsIgorLy91c2FnZTogICAgICJcbgktbglEbyBub3Qgc3luYyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgKGRvbid0IGdvIHRocm91Z2ggaW5pdCkiCisvL3VzYWdlOglJRl9GRUFUVVJFX1dUTVAoCisvL3VzYWdlOiAgICAgIlxuCS13CU9ubHkgd3JpdGUgYSB3dG1wIHJlY29yZCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgcG93ZXJvZmZfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZCBERUxBWV0gWy1uXSBbLWZdIgorLy91c2FnZTojZGVmaW5lIHBvd2Vyb2ZmX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiSGFsdCBhbmQgc2h1dCBvZmYgcG93ZXJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWQgU0VDCURlbGF5IGludGVydmFsIgorLy91c2FnZTogICAgICJcbgktbglEbyBub3Qgc3luYyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgKGRvbid0IGdvIHRocm91Z2ggaW5pdCkiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHJlYm9vdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1kIERFTEFZXSBbLW5dIFstZl0iCisvL3VzYWdlOiNkZWZpbmUgcmVib290X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVib290IHRoZSBzeXN0ZW1cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWQgU0VDCURlbGF5IGludGVydmFsIgorLy91c2FnZTogICAgICJcbgktbglEbyBub3Qgc3luYyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgKGRvbid0IGdvIHRocm91Z2ggaW5pdCkiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInJlYm9vdC5oIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfV1RNUAorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisKK3N0YXRpYyB2b2lkIHdyaXRlX3d0bXAodm9pZCkKK3sKKwlzdHJ1Y3QgdXRtcHggdXRtcDsKKwlzdHJ1Y3QgdXRzbmFtZSB1dHM7CisJLyogIm1hbiB1dG1wIiBzYXlzIHd0bXAgZmlsZSBzaG91bGQgKm5vdCogYmUgY3JlYXRlZCBhdXRvbWFnaWNhbGx5ICovCisJLyppZiAoYWNjZXNzKGJiX3BhdGhfd3RtcF9maWxlLCBSX09LfFdfT0spID09IC0xKSB7CisJCWNsb3NlKGNyZWF0KGJiX3BhdGhfd3RtcF9maWxlLCAwNjY0KSk7CisJfSovCisJbWVtc2V0KCZ1dG1wLCAwLCBzaXplb2YodXRtcCkpOworCXV0bXAudXRfdHYudHZfc2VjID0gdGltZShOVUxMKTsKKwlzdHJjcHkodXRtcC51dF91c2VyLCAic2h1dGRvd24iKTsgLyogaXQgaXMgd2lkZSBlbm91Z2ggKi8KKwl1dG1wLnV0X3R5cGUgPSBSVU5fTFZMOworCXV0bXAudXRfaWRbMF0gPSAnfic7IHV0bXAudXRfaWRbMV0gPSAnfic7IC8qID0gc3RyY3B5KHV0bXAudXRfaWQsICJ+fiIpOyAqLworCXV0bXAudXRfbGluZVswXSA9ICd+JzsgdXRtcC51dF9saW5lWzFdID0gJ34nOyAvKiA9IHN0cmNweSh1dG1wLnV0X2xpbmUsICJ+fiIpOyAqLworCXVuYW1lKCZ1dHMpOworCXNhZmVfc3RybmNweSh1dG1wLnV0X2hvc3QsIHV0cy5yZWxlYXNlLCBzaXplb2YodXRtcC51dF9ob3N0KSk7CisJdXBkd3RtcHgoYmJfcGF0aF93dG1wX2ZpbGUsICZ1dG1wKTsKK30KKyNlbHNlCisjZGVmaW5lIHdyaXRlX3d0bXAoKSAoKHZvaWQpMCkKKyNlbmRpZgorCisKK2ludCBoYWx0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBoYWx0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3QgaW50IG1hZ2ljW10gPSB7CisJCVJCX0hBTFRfU1lTVEVNLAorCQlSQl9QT1dFUl9PRkYsCisJCVJCX0FVVE9CT09UCisJfTsKKwlzdGF0aWMgY29uc3Qgc21hbGxpbnQgc2lnbmFsc1tdID0geyBTSUdVU1IxLCBTSUdVU1IyLCBTSUdURVJNIH07CisKKwlpbnQgZGVsYXkgPSAwOworCWludCB3aGljaCwgZmxhZ3MsIHJjOworCisJLyogRmlndXJlIG91dCB3aGljaCBhcHBsZXQgd2UncmUgcnVubmluZyAqLworCWZvciAod2hpY2ggPSAwOyAiaHByIlt3aGljaF0gIT0gYXBwbGV0X25hbWVbMF07IHdoaWNoKyspCisJCWNvbnRpbnVlOworCisJLyogUGFyc2UgYW5kIGhhbmRsZSBhcmd1bWVudHMgKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICJkKyI7IC8qIC1kIE4gKi8KKwkvKiBXZSBzdXBwb3J0IC13IGV2ZW4gaWYgIUVOQUJMRV9GRUFUVVJFX1dUTVAsCisJICogaW4gb3JkZXIgdG8gbm90IGJyZWFrIHNjcmlwdHMuCisJICogLWkgKHNodXQgZG93biBuZXR3b3JrIGludGVyZmFjZXMpIGlzIGlnbm9yZWQuCisJICovCisJZmxhZ3MgPSBnZXRvcHQzMihhcmd2LCAiZDpuZndpIiwgJmRlbGF5KTsKKworCXNsZWVwKGRlbGF5KTsKKworCXdyaXRlX3d0bXAoKTsKKworCWlmIChmbGFncyAmIDgpIC8qIC13ICovCisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisKKwlpZiAoIShmbGFncyAmIDIpKSAvKiBubyAtbiAqLworCQlzeW5jKCk7CisKKwkvKiBQZXJmb3JtIGFjdGlvbi4gKi8KKwlyYyA9IDE7CisJaWYgKCEoZmxhZ3MgJiA0KSkgeyAvKiBubyAtZiAqLworLy9UT0RPOiBJIHRlbmQgdG8gdGhpbmsgdGhhdCBzaWduYWxsaW5nIGxpbnV4cmMgaXMgd3JvbmcKKy8vIHBpdHkgb3JpZ2luYWwgYXV0aG9yIGRpZG4ndCBjb21tZW50IG9uIGl0Li4uCisJCWlmIChFTkFCTEVfRkVBVFVSRV9JTklUUkQpIHsKKwkJCS8qIHRhbGsgdG8gbGludXhyYyAqLworCQkJLyogYmJveCBpbml0L2xpbnV4cmMgYXNzdW1lZCAqLworCQkJcGlkX3QgKnBpZGxpc3QgPSBmaW5kX3BpZF9ieV9uYW1lKCJsaW51eHJjIik7CisJCQlpZiAocGlkbGlzdFswXSA+IDApCisJCQkJcmMgPSBraWxsKHBpZGxpc3RbMF0sIHNpZ25hbHNbd2hpY2hdKTsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCQlmcmVlKHBpZGxpc3QpOworCQl9CisJCWlmIChyYykgeworCQkJLyogdGFsayB0byBpbml0ICovCisJCQlpZiAoIUVOQUJMRV9GRUFUVVJFX0NBTExfVEVMSU5JVCkgeworCQkJCS8qIGJib3ggaW5pdCBhc3N1bWVkICovCisJCQkJcmMgPSBraWxsKDEsIHNpZ25hbHNbd2hpY2hdKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogU3lzViBzdHlsZSBpbml0IGFzc3VtZWQgKi8KKwkJCQkvKiBydW5sZXZlbHM6CisJCQkJICogMCA9PSBzaHV0ZG93bgorCQkJCSAqIDYgPT0gcmVib290ICovCisJCQkJZXhlY2xwKENPTkZJR19URUxJTklUX1BBVEgsCisJCQkJCQlDT05GSUdfVEVMSU5JVF9QQVRILAorCQkJCQkJd2hpY2ggPT0gMiA/ICI2IiA6ICIwIiwKKwkJCQkJCShjaGFyICopTlVMTAorCQkJCSk7CisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBleGVjdXRlICclcyciLAorCQkJCQkJQ09ORklHX1RFTElOSVRfUEFUSCk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlyYyA9IHJlYm9vdChtYWdpY1t3aGljaF0pOworCX0KKworCWlmIChyYykKKwkJYmJfcGVycm9yX25vbXNnX2FuZF9kaWUoKTsKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9pbml0L2luaXQuYyBiL2luaXQvaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYzVkMGYKLS0tIC9kZXYvbnVsbAorKysgYi9pbml0L2luaXQuYwpAQCAtMCwwICsxLDEzNzQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgaW5pdCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBieSBCcnVjZSBQZXJlbnMgPGJydWNlQHBpeGFyLmNvbT4uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBBZGp1c3RlZCBieSBzbyBtYW55IGZvbGtzLCBpdCdzIGltcG9zc2libGUgdG8ga2VlcCB0cmFjay4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vY29uZmlnOmNvbmZpZyBJTklUCisvL2NvbmZpZzoJYm9vbCAiaW5pdCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglzZWxlY3QgRkVBVFVSRV9TWVNMT0cKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBpbml0IGlzIHRoZSBmaXJzdCBwcm9ncmFtIHJ1biB3aGVuIHRoZSBzeXN0ZW0gYm9vdHMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1VTRV9JTklUVEFCCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCByZWFkaW5nIGFuIGluaXR0YWIgZmlsZSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIElOSVQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBBbGxvdyBpbml0IHRvIHJlYWQgYW4gaW5pdHRhYiBmaWxlIHdoZW4gdGhlIHN5c3RlbSBib290LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9LSUxMX1JFTU9WRUQKKy8vY29uZmlnOglib29sICJTdXBwb3J0IGtpbGxpbmcgcHJvY2Vzc2VzIHRoYXQgaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSBpbml0dGFiIgorLy9jb25maWc6CWRlZmF1bHQgbgorLy9jb25maWc6CWRlcGVuZHMgb24gRkVBVFVSRV9VU0VfSU5JVFRBQgorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFdoZW4gcmVzcGF3biBlbnRyaWVzIGFyZSByZW1vdmVkIGZyb20gaW5pdHRhYiBhbmQgYSBTSUdIVVAgaXMKKy8vY29uZmlnOgkgIHNlbnQgdG8gaW5pdCwgdGhpcyBvcHRpb24gd2lsbCBtYWtlIGluaXQga2lsbCB0aGUgcHJvY2Vzc2VzCisvL2NvbmZpZzoJICB0aGF0IGhhdmUgYmVlbiByZW1vdmVkLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9LSUxMX0RFTEFZCisvL2NvbmZpZzoJaW50ICJIb3cgbG9uZyB0byB3YWl0IGJldHdlZW4gVEVSTSBhbmQgS0lMTCAoMCAtIHNlbmQgVEVSTSBvbmx5KSIgaWYgRkVBVFVSRV9LSUxMX1JFTU9WRUQKKy8vY29uZmlnOglyYW5nZSAwIDEwMjQKKy8vY29uZmlnOglkZWZhdWx0IDAKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZFQVRVUkVfS0lMTF9SRU1PVkVECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgV2l0aCBub256ZXJvIHNldHRpbmcsIGluaXQgc2VuZHMgVEVSTSwgZm9ya3MsIGNoaWxkIHdhaXRzIE4KKy8vY29uZmlnOgkgIHNlY29uZHMsIHNlbmRzIEtJTEwgYW5kIGV4aXRzLiBTZXR0aW5nIGl0IHRvbyBoaWdoIGlzIHVud2lzZQorLy9jb25maWc6CSAgKGNoaWxkIHdpbGwgaGFuZyBhcm91bmQgZm9yIHRvbyBsb25nIGFuZCBjb3VsZCBhY3R1YWxseSBraWxsCisvL2NvbmZpZzoJICB0aGUgd3JvbmcgcHJvY2VzcyEpCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0lOSVRfU0NUVFkKKy8vY29uZmlnOglib29sICJSdW4gY29tbWFuZHMgd2l0aCBsZWFkaW5nIGRhc2ggd2l0aCBjb250cm9sbGluZyB0dHkiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBJTklUCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgSWYgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCwgaW5pdCB3aWxsIHRyeSB0byBnaXZlIGEgY29udHJvbGxpbmcKKy8vY29uZmlnOgkgIHR0eSB0byBhbnkgY29tbWFuZCB3aGljaCBoYXMgbGVhZGluZyBoeXBoZW4gKG9mdGVuIGl0J3MgIi0vYmluL3NoIikuCisvL2NvbmZpZzoJICBNb3JlIHByZWNpc2VseSwgaW5pdCB3aWxsIGRvICJpb2N0bChTVERJTl9GSUxFTk8sIFRJT0NTQ1RUWSwgMCkiLgorLy9jb25maWc6CSAgSWYgZGV2aWNlIGF0dGFjaGVkIHRvIFNURElOX0ZJTEVOTyBjYW4gYmUgYSBjdHR5IGJ1dCBpcyBub3QgeWV0CisvL2NvbmZpZzoJICBhIGN0dHkgZm9yIG90aGVyIHNlc3Npb24sIGl0IHdpbGwgYmVjb21lIHRoaXMgcHJvY2VzcycgY3R0eS4KKy8vY29uZmlnOgkgIFRoaXMgaXMgbm90IHRoZSB0cmFkaXRpb25hbCBpbml0IGJlaGF2b3VyLCBidXQgaXMgb2Z0ZW4gd2hhdCB5b3Ugd2FudAorLy9jb25maWc6CSAgaW4gYW4gZW1iZWRkZWQgc3lzdGVtIHdoZXJlIHRoZSBjb25zb2xlIGlzIG9ubHkgYWNjZXNzZWQgZHVyaW5nCisvL2NvbmZpZzoJICBkZXZlbG9wbWVudCBvciBmb3IgbWFpbnRlbmFuY2UuCisvL2NvbmZpZzoJICBOQjogdXNpbmcgY3R0eWhhY2sgYXBwbGV0IG1heSB3b3JrIGJldHRlci4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfSU5JVF9TWVNMT0cKKy8vY29uZmlnOglib29sICJFbmFibGUgaW5pdCB0byB3cml0ZSB0byBzeXNsb2ciCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBJTklUCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0VYVFJBX1FVSUVUCisvL2NvbmZpZzoJYm9vbCAiQmUgX2V4dHJhXyBxdWlldCBvbiBib290IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSU5JVAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFByZXZlbnQgaW5pdCBmcm9tIGxvZ2dpbmcgc29tZSBtZXNzYWdlcyB0byB0aGUgY29uc29sZSBkdXJpbmcgYm9vdC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfSU5JVF9DT1JFRFVNUFMKKy8vY29uZmlnOglib29sICJTdXBwb3J0IGR1bXBpbmcgY29yZSBmb3IgY2hpbGQgcHJvY2Vzc2VzIChkZWJ1Z2dpbmcgb25seSkiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBJTklUCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgSWYgdGhpcyBvcHRpb24gaXMgZW5hYmxlZCBhbmQgdGhlIGZpbGUgLy5pbml0X2VuYWJsZV9jb3JlCisvL2NvbmZpZzoJICBleGlzdHMsIHRoZW4gaW5pdCB3aWxsIGNhbGwgc2V0cmxpbWl0KCkgdG8gYWxsb3cgdW5saW1pdGVkCisvL2NvbmZpZzoJICBjb3JlIGZpbGUgc2l6ZXMuIElmIHRoaXMgb3B0aW9uIGlzIGRpc2FibGVkLCBwcm9jZXNzZXMKKy8vY29uZmlnOgkgIHdpbGwgbm90IGdlbmVyYXRlIGFueSBjb3JlIGZpbGVzLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9JTklUUkQKKy8vY29uZmlnOglib29sICJTdXBwb3J0IHJ1bm5pbmcgaW5pdCBmcm9tIHdpdGhpbiBhbiBpbml0cmQgKG5vdCBpbml0cmFtZnMpIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSU5JVAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIExlZ2FjeSBzdXBwb3J0IGZvciBydW5uaW5nIGluaXQgdW5kZXIgdGhlIG9sZC1zdHlsZSBpbml0cmQuIEFsbG93cworLy9jb25maWc6CSAgdGhlIG5hbWUgbGludXhyYyB0byBhY3QgYXMgaW5pdCwgYW5kIGl0IGRvZXNuJ3QgYXNzdW1lIGluaXQgaXMgUElEIDEuCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIFRoaXMgZG9lcyBub3QgYXBwbHkgdG8gaW5pdHJhbWZzLCB3aGljaCBydW5zIC9pbml0IGFzIFBJRCAxIGFuZAorLy9jb25maWc6CSAgcmVxdWlyZXMgbm8gc3BlY2lhbCBzdXBwb3J0LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgSU5JVF9URVJNSU5BTF9UWVBFCisvL2NvbmZpZzoJc3RyaW5nICJJbml0aWFsIHRlcm1pbmFsIHR5cGUiCisvL2NvbmZpZzoJZGVmYXVsdCAibGludXgiCisvL2NvbmZpZzoJZGVwZW5kcyBvbiBJTklUCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVGhpcyBpcyB0aGUgaW5pdGlhbCB2YWx1ZSBzZXQgYnkgaW5pdCBmb3IgdGhlIFRFUk0gZW52aXJvbm1lbnQKKy8vY29uZmlnOgkgIHZhcmlhYmxlLiBUaGlzIHZhcmlhYmxlIGlzIHVzZWQgYnkgcHJvZ3JhbXMgd2hpY2ggbWFrZSB1c2Ugb2YKKy8vY29uZmlnOgkgIGV4dGVuZGVkIHRlcm1pbmFsIGNhcGFiaWxpdGllcy4KKy8vY29uZmlnOgorLy9jb25maWc6CSAgTm90ZSB0aGF0IG9uIExpbnV4LCBpbml0IGF0dGVtcHRzIHRvIGRldGVjdCBzZXJpYWwgdGVybWluYWwgYW5kCisvL2NvbmZpZzoJICBzZXRzIFRFUk0gdG8gInZ0MTAyIiBpZiBvbmUgaXMgZm91bmQuCisKKy8vYXBwbGV0OklGX0lOSVQoQVBQTEVUKGluaXQsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorLy9hcHBsZXQ6SUZfRkVBVFVSRV9JTklUUkQoQVBQTEVUX09ERE5BTUUobGludXhyYywgaW5pdCwgQkJfRElSX1JPT1QsIEJCX1NVSURfRFJPUCwgbGludXhyYykpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19JTklUKSArPSBpbml0Lm8KKworI2RlZmluZSBERUJVR19TRUdWX0hBTkRMRVIgMAorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxwYXRocy5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2lmZGVmIF9fbGludXhfXworIyBpbmNsdWRlIDxsaW51eC92dC5oPgorIyBpbmNsdWRlIDxzeXMvc3lzaW5mby5oPgorI2VuZGlmCisjaW5jbHVkZSAicmVib290LmgiIC8qIHJlYm9vdCgpIGNvbnN0YW50cyAqLworCisjaWYgREVCVUdfU0VHVl9IQU5ETEVSCisjIHVuZGVmIF9HTlVfU09VUkNFCisjIGRlZmluZSBfR05VX1NPVVJDRSAxCisjIHVuZGVmIF9fVVNFX0dOVQorIyBkZWZpbmUgX19VU0VfR05VIDEKKyMgaW5jbHVkZSA8ZXhlY2luZm8uaD4KKyMgaW5jbHVkZSA8c3lzL3Vjb250ZXh0Lmg+CisjZW5kaWYKKworLyogVXNlZCBvbmx5IGZvciBzYW5pdGl6aW5nIHB1cnBvc2VzIGluIHNldF9zYW5lX3Rlcm0oKSBiZWxvdy4gT24gc3lzdGVtcyB3aGVyZQorICogdGhlIGJhdWQgcmF0ZSBpcyBzdG9yZWQgaW4gYSBzZXBhcmF0ZSBmaWVsZCwgd2UgY2FuIHNhZmVseSBkaXNhYmxlIHRoZW0uICovCisjaWZuZGVmIENCQVVECisjIGRlZmluZSBDQkFVRCAwCisjIGRlZmluZSBDQkFVREVYIDAKKyNlbmRpZgorCisvKiBXYXMgYSBDT05GSUdfeHh4IG9wdGlvbi4gQSBsb3Qgb2YgcGVvcGxlIHdlcmUgYnVpbGRpbmcKKyAqIG5vdCBmdWxseSBmdW5jdGlvbmFsIGluaXQgYnkgc3dpdGNoaW5nIGl0IG9uISAqLworI2RlZmluZSBERUJVR19JTklUIDAKKworI2RlZmluZSBDT05TT0xFX05BTUVfU0laRSAzMgorCisvKiBEZWZhdWx0IHN5c2luaXQgc2NyaXB0LiAqLworI2lmbmRlZiBJTklUX1NDUklQVAorIyBkZWZpbmUgSU5JVF9TQ1JJUFQgICIvZXRjL2luaXQuZC9yY1MiCisjZW5kaWYKKworLyogRWFjaCB0eXBlIG9mIGFjdGlvbnMgY2FuIGFwcGVhciBtYW55IHRpbWVzLiBUaGV5IHdpbGwgYmUKKyAqIGhhbmRsZWQgaW4gb3JkZXIuIFJFU1RBUlQgaXMgYW4gZXhjZXB0aW9uLCBvbmx5IDFzdCBpcyB1c2VkLgorICovCisvKiBTdGFydCB0aGVzZSBhY3Rpb25zIGZpcnN0IGFuZCB3YWl0IGZvciBjb21wbGV0aW9uICovCisjZGVmaW5lIFNZU0lOSVQgICAgIDB4MDEKKy8qIFN0YXJ0IHRoZXNlIGFmdGVyIFNZU0lOSVQgYW5kIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgV0FJVCAgICAgICAgMHgwMgorLyogU3RhcnQgdGhlc2UgYWZ0ZXIgV0FJVCBhbmQgKmRvbnQqIHdhaXQgZm9yIGNvbXBsZXRpb24gKi8KKyNkZWZpbmUgT05DRSAgICAgICAgMHgwNAorLyoKKyAqIE5COiB3aGlsZSBTWVNJTklUL1dBSVQvT05DRSBhcmUgYmVpbmcgcHJvY2Vzc2VkLAorICogU0lHSFVQICgicmVyZWFkIC9ldGMvaW5pdHRhYiIpIHdpbGwgYmUgcHJvY2Vzc2VkIG9ubHkgYWZ0ZXIKKyAqIGVhY2ggZ3JvdXAgb2YgYWN0aW9ucy4gSWYgbmV3IGluaXR0YWIgYWRkcywgc2F5LCBhIFNZU0lOSVQgYWN0aW9uLAorICogaXQgd2lsbCBub3QgYmUgcnVuLCBzaW5jZSBpbml0IGlzIGFscmVhZHkgInBhc3QgU1lTSU5JVCBzdGFnZSIuCisgKi8KKy8qIFN0YXJ0IHRoZXNlIGFmdGVyIE9OQ0UgYXJlIHN0YXJ0ZWQsIHJlc3RhcnQgb24gZXhpdCAqLworI2RlZmluZSBSRVNQQVdOICAgICAweDA4CisvKiBMaWtlIFJFU1BBV04sIGJ1dCB3YWl0IGZvciA8RW50ZXI+IHRvIGJlIHByZXNzZWQgb24gdHR5ICovCisjZGVmaW5lIEFTS0ZJUlNUICAgIDB4MTAKKy8qCisgKiBTdGFydCB0aGVzZSBvbiBTSUdJTlQsIGFuZCB3YWl0IGZvciBjb21wbGV0aW9uLgorICogVGhlbiBnbyBiYWNrIHRvIHJlc3Bhd25pbmcgUkVTUEFXTiBhbmQgQVNLRklSU1QgYWN0aW9ucy4KKyAqIE5COiBrZXJuZWwgc2VuZHMgU0lHSU5UIHRvIHVzIGlmIEN0cmwtQWx0LURlbCB3YXMgcHJlc3NlZC4KKyAqLworI2RlZmluZSBDVFJMQUxUREVMICAweDIwCisvKgorICogU3RhcnQgdGhlc2UgYmVmb3JlIGtpbGxpbmcgYWxsIHByb2Nlc3NlcyBpbiBwcmVwYXJhdGlvbiBmb3IKKyAqIHJ1bm5pbmcgUkVTVEFSVCBhY3Rpb25zIG9yIGRvaW5nIGxvdy1sZXZlbCBoYWx0L3JlYm9vdC9wb3dlcm9mZgorICogKGluaXRpYXRlZCBieSBTSUdVU1IxL1NJR1RFUk0vU0lHVVNSMikuCisgKiBXYWl0IGZvciBjb21wbGV0aW9uIGJlZm9yZSBwcm9jZWVkaW5nLgorICovCisjZGVmaW5lIFNIVVRET1dOICAgIDB4NDAKKy8qCisgKiBleGVjKCkgb24gU0lHUVVJVC4gU0hVVERPV04gYWN0aW9ucyBhcmUgc3RhcnRlZCBhbmQgd2FpdGVkIGZvciwKKyAqIHRoZW4gYWxsIHByb2Nlc3NlcyBhcmUga2lsbGVkLCB0aGVuIGluaXQgZXhlYydzIDFzdCBSRVNUQVJUIGFjdGlvbiwKKyAqIHJlcGxhY2luZyBpdHNlbGYgYnkgaXQuIElmIG5vIFJFU1RBUlQgYWN0aW9uIHNwZWNpZmllZCwKKyAqIFNJR1FVSVQgaGFzIG5vIGVmZmVjdC4KKyAqLworI2RlZmluZSBSRVNUQVJUICAgICAweDgwCisKKworLyogQSBsaW5rZWQgbGlzdCBvZiBpbml0X2FjdGlvbnMsIHRvIGJlIHJlYWQgZnJvbSBpbml0dGFiICovCitzdHJ1Y3QgaW5pdF9hY3Rpb24geworCXN0cnVjdCBpbml0X2FjdGlvbiAqbmV4dDsKKwlwaWRfdCBwaWQ7CisJdWludDhfdCBhY3Rpb25fdHlwZTsKKwljaGFyIHRlcm1pbmFsW0NPTlNPTEVfTkFNRV9TSVpFXTsKKwljaGFyIGNvbW1hbmRbMV07Cit9OworCitzdGF0aWMgc3RydWN0IGluaXRfYWN0aW9uICppbml0X2FjdGlvbl9saXN0ID0gTlVMTDsKKworc3RhdGljIGNvbnN0IGNoYXIgKmxvZ19jb25zb2xlID0gVkNfNTsKKworZW51bSB7CisJTF9MT0cgPSAweDEsCisJTF9DT05TT0xFID0gMHgyLAorfTsKKworLyogUHJpbnQgYSBtZXNzYWdlIHRvIHRoZSBzcGVjaWZpZWQgZGV2aWNlLgorICogIndoZXJlIiBtYXkgYmUgYml0d2lzZS1vcidkIGZyb20gTF9MT0cgfCBMX0NPTlNPTEUKKyAqIE5COiBjYXJlZnVsLCB3ZSBjYW4gYmUgY2FsbGVkIGFmdGVyIHZmb3JrIQorICovCisjZGVmaW5lIGRiZ19tZXNzYWdlKC4uLikgZG8geyBpZiAoREVCVUdfSU5JVCkgbWVzc2FnZShfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCitzdGF0aWMgdm9pZCBtZXNzYWdlKGludCB3aGVyZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdChwcmludGYsIDIsIDMpKSk7CitzdGF0aWMgdm9pZCBtZXNzYWdlKGludCB3aGVyZSwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmd1bWVudHM7CisJdW5zaWduZWQgbDsKKwljaGFyIG1zZ1sxMjhdOworCisJbXNnWzBdID0gJ1xyJzsKKwl2YV9zdGFydChhcmd1bWVudHMsIGZtdCk7CisJbCA9IDEgKyB2c25wcmludGYobXNnICsgMSwgc2l6ZW9mKG1zZykgLSAyLCBmbXQsIGFyZ3VtZW50cyk7CisJaWYgKGwgPiBzaXplb2YobXNnKSAtIDIpCisJCWwgPSBzaXplb2YobXNnKSAtIDI7CisJdmFfZW5kKGFyZ3VtZW50cyk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTklUX1NZU0xPRworCW1zZ1tsXSA9ICdcMCc7CisJaWYgKHdoZXJlICYgTF9MT0cpIHsKKwkJLyogTG9nIHRoZSBtZXNzYWdlIHRvIHN5c2xvZ2QgKi8KKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgMCwgTE9HX0RBRU1PTik7CisJCS8qIGRvbid0IHByaW50ICJcciIgKi8KKwkJc3lzbG9nKExPR19JTkZPLCAiJXMiLCBtc2cgKyAxKTsKKwkJY2xvc2Vsb2coKTsKKwl9CisJbXNnW2wrK10gPSAnXG4nOworCW1zZ1tsXSA9ICdcMCc7CisjZWxzZQorCXsKKwkJc3RhdGljIGludCBsb2dfZmQgPSAtMTsKKworCQltc2dbbCsrXSA9ICdcbic7CisJCW1zZ1tsXSA9ICdcMCc7CisJCS8qIFRha2UgZnVsbCBjb250cm9sIG9mIHRoZSBsb2cgdHR5LCBhbmQgbmV2ZXIgY2xvc2UgaXQuCisJCSAqIEl0J3MgbWluZSwgYWxsIG1pbmUhICBNdWhhaGFoYWhhISAqLworCQlpZiAobG9nX2ZkIDwgMCkgeworCQkJaWYgKCFsb2dfY29uc29sZSkgeworCQkJCWxvZ19mZCA9IFNUREVSUl9GSUxFTk87CisJCQl9IGVsc2UgeworCQkJCWxvZ19mZCA9IGRldmljZV9vcGVuKGxvZ19jb25zb2xlLCBPX1dST05MWSB8IE9fTk9OQkxPQ0sgfCBPX05PQ1RUWSk7CisJCQkJaWYgKGxvZ19mZCA8IDApIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJjYW4ndCBsb2cgdG8gJXMiLCBsb2dfY29uc29sZSk7CisJCQkJCXdoZXJlID0gTF9DT05TT0xFOworCQkJCX0gZWxzZSB7CisJCQkJCWNsb3NlX29uX2V4ZWNfb24obG9nX2ZkKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJaWYgKHdoZXJlICYgTF9MT0cpIHsKKwkJCWZ1bGxfd3JpdGUobG9nX2ZkLCBtc2csIGwpOworCQkJaWYgKGxvZ19mZCA9PSBTVERFUlJfRklMRU5PKQorCQkJCXJldHVybjsgLyogZG9uJ3QgcHJpbnQgZHVwIG1lc3NhZ2VzICovCisJCX0KKwl9CisjZW5kaWYKKworCWlmICh3aGVyZSAmIExfQ09OU09MRSkgeworCQkvKiBTZW5kIGNvbnNvbGUgbWVzc2FnZXMgdG8gY29uc29sZSBzbyBwZW9wbGUgd2lsbCBzZWUgdGhlbS4gKi8KKwkJZnVsbF93cml0ZShTVERFUlJfRklMRU5PLCBtc2csIGwpOworCX0KK30KKworc3RhdGljIHZvaWQgY29uc29sZV9pbml0KHZvaWQpCit7CisjaWZkZWYgVlRfT1BFTlFSWQorCWludCB2dG5vOworI2VuZGlmCisJY2hhciAqczsKKworCXMgPSBnZXRlbnYoIkNPTlNPTEUiKTsKKwlpZiAoIXMpCisJCXMgPSBnZXRlbnYoImNvbnNvbGUiKTsKKwlpZiAocykgeworCQlpbnQgZmQgPSBvcGVuKHMsIE9fUkRXUiB8IE9fTk9OQkxPQ0sgfCBPX05PQ1RUWSk7CisJCWlmIChmZCA+PSAwKSB7CisJCQlkdXAyKGZkLCBTVERJTl9GSUxFTk8pOworCQkJZHVwMihmZCwgU1RET1VUX0ZJTEVOTyk7CisJCQl4bW92ZV9mZChmZCwgU1RERVJSX0ZJTEVOTyk7CisJCX0KKwkJZGJnX21lc3NhZ2UoTF9MT0csICJjb25zb2xlPSclcyciLCBzKTsKKwl9IGVsc2UgeworCQkvKiBNYWtlIHN1cmUgZmQgMCwxLDIgYXJlIG5vdCBjbG9zZWQKKwkJICogKHNvIHRoYXQgdGhleSB3b24ndCBiZSB1c2VkIGJ5IGZ1dHVyZSBvcGVucykgKi8KKwkJYmJfc2FuaXRpemVfc3RkaW8oKTsKKy8vIFVzZXJzIHJlcG9ydCBwcm9ibGVtcworLy8JCS8qIE1ha2Ugc3VyZSBpbml0IGNhbid0IGJlIGJsb2NrZWQgYnkgd3JpdGluZyB0byBzdGRlcnIgKi8KKy8vCQlmY250bChTVERFUlJfRklMRU5PLCBGX1NFVEZMLCBmY250bChTVERFUlJfRklMRU5PLCBGX0dFVEZMKSB8IE9fTk9OQkxPQ0spOworCX0KKworCXMgPSBnZXRlbnYoIlRFUk0iKTsKKyNpZmRlZiBWVF9PUEVOUVJZCisJaWYgKGlvY3RsKFNURElOX0ZJTEVOTywgVlRfT1BFTlFSWSwgJnZ0bm8pICE9IDApIHsKKwkJLyogTm90IGEgbGludXggdGVybWluYWwsIHByb2JhYmx5IHNlcmlhbCBjb25zb2xlLgorCQkgKiBGb3JjZSB0aGUgVEVSTSBzZXR0aW5nIHRvIHZ0MTAyCisJCSAqIGlmIFRFUk0gaXMgc2V0IHRvIGxpbnV4ICh0aGUgZGVmYXVsdCkgKi8KKwkJaWYgKCFzIHx8IHN0cmNtcChzLCAibGludXgiKSA9PSAwKQorCQkJcHV0ZW52KChjaGFyKikiVEVSTT12dDEwMiIpOworCQlpZiAoIUVOQUJMRV9GRUFUVVJFX0lOSVRfU1lTTE9HKQorCQkJbG9nX2NvbnNvbGUgPSBOVUxMOworCX0gZWxzZQorI2VuZGlmCisJaWYgKCFzKQorCQlwdXRlbnYoKGNoYXIqKSJURVJNPSIgQ09ORklHX0lOSVRfVEVSTUlOQUxfVFlQRSk7Cit9CisKKy8qIFNldCB0ZXJtaW5hbCBzZXR0aW5ncyB0byByZWFzb25hYmxlIGRlZmF1bHRzLgorICogTkI6IGNhcmVmdWwsIHdlIGNhbiBiZSBjYWxsZWQgYWZ0ZXIgdmZvcmshICovCitzdGF0aWMgdm9pZCBzZXRfc2FuZV90ZXJtKHZvaWQpCit7CisJc3RydWN0IHRlcm1pb3MgdHR5OworCisJdGNnZXRhdHRyKFNURElOX0ZJTEVOTywgJnR0eSk7CisKKwkvKiBzZXQgY29udHJvbCBjaGFycyAqLworCXR0eS5jX2NjW1ZJTlRSXSA9IDM7CS8qIEMtYyAqLworCXR0eS5jX2NjW1ZRVUlUXSA9IDI4OwkvKiBDLVwgKi8KKwl0dHkuY19jY1tWRVJBU0VdID0gMTI3OwkvKiBDLT8gKi8KKwl0dHkuY19jY1tWS0lMTF0gPSAyMTsJLyogQy11ICovCisJdHR5LmNfY2NbVkVPRl0gPSA0OwkvKiBDLWQgKi8KKwl0dHkuY19jY1tWU1RBUlRdID0gMTc7CS8qIEMtcSAqLworCXR0eS5jX2NjW1ZTVE9QXSA9IDE5OwkvKiBDLXMgKi8KKwl0dHkuY19jY1tWU1VTUF0gPSAyNjsJLyogQy16ICovCisKKyNpZmRlZiBfX2xpbnV4X18KKwkvKiB1c2UgbGluZSBkaXNjaXBsaW5lIDAgKi8KKwl0dHkuY19saW5lID0gMDsKKyNlbmRpZgorCisJLyogTWFrZSBpdCBiZSBzYW5lICovCisjaWZuZGVmIENSVFNDVFMKKyMgZGVmaW5lIENSVFNDVFMgMAorI2VuZGlmCisJLyogYWRkZWQgQ1JUU0NUUyB0byBmaXggRGViaWFuIGJ1ZyA1Mjg1NjAgKi8KKwl0dHkuY19jZmxhZyAmPSBDQkFVRCB8IENCQVVERVggfCBDU0laRSB8IENTVE9QQiB8IFBBUkVOQiB8IFBBUk9ERCB8IENSVFNDVFM7CisJdHR5LmNfY2ZsYWcgfD0gQ1JFQUQgfCBIVVBDTCB8IENMT0NBTDsKKworCS8qIGlucHV0IG1vZGVzICovCisJdHR5LmNfaWZsYWcgPSBJQ1JOTCB8IElYT04gfCBJWE9GRjsKKworCS8qIG91dHB1dCBtb2RlcyAqLworCXR0eS5jX29mbGFnID0gT1BPU1QgfCBPTkxDUjsKKworCS8qIGxvY2FsIG1vZGVzICovCisJdHR5LmNfbGZsYWcgPSBJU0lHIHwgSUNBTk9OIHwgRUNITyB8IEVDSE9FIHwgRUNIT0sgfCBFQ0hPQ1RMIHwgRUNIT0tFIHwgSUVYVEVOOworCisJdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coJnR0eSk7Cit9CisKKy8qIE9wZW4gdGhlIG5ldyB0ZXJtaW5hbCBkZXZpY2UuCisgKiBOQjogY2FyZWZ1bCwgd2UgY2FuIGJlIGNhbGxlZCBhZnRlciB2Zm9yayEgKi8KK3N0YXRpYyBpbnQgb3Blbl9zdGRpb190b190dHkoY29uc3QgY2hhciogdHR5X25hbWUpCit7CisJLyogZW1wdHkgdHR5X25hbWUgbWVhbnMgInVzZSBpbml0J3MgdHR5IiwgZWxzZS4uLiAqLworCWlmICh0dHlfbmFtZVswXSkgeworCQlpbnQgZmQ7CisKKwkJY2xvc2UoU1RESU5fRklMRU5PKTsKKwkJLyogZmQgY2FuIGJlIG9ubHkgPCAwIG9yIDA6ICovCisJCWZkID0gZGV2aWNlX29wZW4odHR5X25hbWUsIE9fUkRXUik7CisJCWlmIChmZCkgeworCQkJbWVzc2FnZShMX0xPRyB8IExfQ09OU09MRSwgImNhbid0IG9wZW4gJXM6ICVzIiwKKwkJCQl0dHlfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldHVybiAwOyAvKiBmYWlsdXJlICovCisJCX0KKwkJZHVwMihTVERJTl9GSUxFTk8sIFNURE9VVF9GSUxFTk8pOworCQlkdXAyKFNURElOX0ZJTEVOTywgU1RERVJSX0ZJTEVOTyk7CisJfQorCXNldF9zYW5lX3Rlcm0oKTsKKwlyZXR1cm4gMTsgLyogc3VjY2VzcyAqLworfQorCitzdGF0aWMgdm9pZCByZXNldF9zaWdoYW5kbGVyc19hbmRfdW5ibG9ja19zaWdzKHZvaWQpCit7CisJYmJfc2lnbmFscygwCisJCSsgKDEgPDwgU0lHVVNSMSkKKwkJKyAoMSA8PCBTSUdVU1IyKQorCQkrICgxIDw8IFNJR1RFUk0pCisJCSsgKDEgPDwgU0lHUVVJVCkKKwkJKyAoMSA8PCBTSUdJTlQpCisJCSsgKDEgPDwgU0lHSFVQKQorCQkrICgxIDw8IFNJR1RTVFApCisJCSsgKDEgPDwgU0lHU1RPUCkKKwkJLCBTSUdfREZMKTsKKwlzaWdwcm9jbWFza19hbGxzaWdzKFNJR19VTkJMT0NLKTsKK30KKworLyogV3JhcHBlciBhcm91bmQgZXhlYzoKKyAqIFRha2VzIHN0cmluZy4KKyAqIElmIGNoYXJzIGxpa2UgJz4nIGRldGVjdGVkLCBleGVjcyAnWy1dL2Jpbi9zaCAtYyAiZXhlYyAuLi4uLi4uIicuCisgKiBPdGhlcndpc2Ugc3BsaXRzIHdvcmRzIG9uIHdoaXRlc3BhY2UsIGRlYWxzIHdpdGggbGVhZGluZyBkYXNoLAorICogYW5kIHVzZXMgcGxhaW4gZXhlYygpLgorICogTkI6IGNhcmVmdWwsIHdlIGNhbiBiZSBjYWxsZWQgYWZ0ZXIgdmZvcmshCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfZXhlYyhjb25zdCBjaGFyICpjb21tYW5kKQoreworCS8qICs4IGFsbG93cyB0byB3cml0ZSBWTEEgc2l6ZXMgYmVsb3cgbW9yZSBlZmZpY2llbnRseTogKi8KKwl1bnNpZ25lZCBjb21tYW5kX3NpemUgPSBzdHJsZW4oY29tbWFuZCkgKyA4OworCS8qIHN0cmxlbihjb21tYW5kKSArIHN0cmxlbigiZXhlYyAiKSsxOiAqLworCWNoYXIgYnVmW2NvbW1hbmRfc2l6ZV07CisJLyogc3RybGVuKGNvbW1hbmQpIC8gMiArIDQ6ICovCisJY2hhciAqY21kW2NvbW1hbmRfc2l6ZSAvIDJdOworCWludCBkYXNoOworCisJZGFzaCA9IChjb21tYW5kWzBdID09ICctJyAvKiBtYXliZT8gJiYgY29tbWFuZFsxXSA9PSAnLycgKi8pOworCWNvbW1hbmQgKz0gZGFzaDsKKworCS8qIFNlZSBpZiBhbnkgc3BlY2lhbCAvYmluL3NoIHJlcXVpcmluZyBjaGFyYWN0ZXJzIGFyZSBwcmVzZW50ICovCisJaWYgKHN0cnBicmsoY29tbWFuZCwgIn5gISReJiooKT18XFx7fVtdO1wiJzw+PyIpICE9IE5VTEwpIHsKKwkJc3ByaW50ZihidWYsICJleGVjICVzIiwgY29tbWFuZCk7IC8qIGV4Y2x1ZGluZyAiLSIgKi8KKwkJLyogTkI6IExJQkJCX0RFRkFVTFRfTE9HSU5fU0hFTEwgZGVmaW5lIGhhcyBsZWFkaW5nIGRhc2ggKi8KKwkJY21kWzBdID0gKGNoYXIqKShMSUJCQl9ERUZBVUxUX0xPR0lOX1NIRUxMICsgIWRhc2gpOworCQljbWRbMV0gPSAoY2hhciopIi1jIjsKKwkJY21kWzJdID0gYnVmOworCQljbWRbM10gPSBOVUxMOworCQljb21tYW5kID0gTElCQkJfREVGQVVMVF9MT0dJTl9TSEVMTCArIDE7CisJfSBlbHNlIHsKKwkJLyogQ29udmVydCBjb21tYW5kIChjaGFyKikgaW50byBjbWQgKGNoYXIqKiwgb25lIHdvcmQgcGVyIHN0cmluZykgKi8KKwkJY2hhciAqd29yZCwgKm5leHQ7CisJCWludCBpID0gMDsKKwkJbmV4dCA9IHN0cmNweShidWYsIGNvbW1hbmQgLSBkYXNoKTsgLyogY29tbWFuZCBpbmNsdWRpbmcgIi0iICovCisJCWNvbW1hbmQgPSBuZXh0ICsgZGFzaDsKKwkJd2hpbGUgKCh3b3JkID0gc3Ryc2VwKCZuZXh0LCAiIFx0IikpICE9IE5VTEwpIHsKKwkJCWlmICgqd29yZCAhPSAnXDAnKSB7IC8qIG5vdCB0d28gc3BhY2VzL3RhYnMgdG9nZXRoZXI/ICovCisJCQkJY21kW2ldID0gd29yZDsKKwkJCQlpKys7CisJCQl9CisJCX0KKwkJY21kW2ldID0gTlVMTDsKKwl9CisJLyogSWYgd2Ugc2F3IGxlYWRpbmcgIi0iLCBpdCBpcyBpbnRlcmFjdGl2ZSBzaGVsbC4KKwkgKiBUcnkgaGFyZGVyIHRvIGdpdmUgaXQgYSBjb250cm9sbGluZyB0dHkuCisJICovCisJaWYgKEVOQUJMRV9GRUFUVVJFX0lOSVRfU0NUVFkgJiYgZGFzaCkgeworCQkvKiBfQXR0ZW1wdF8gdG8gbWFrZSBzdGRpbiBhIGNvbnRyb2xsaW5nIHR0eS4gKi8KKwkJaW9jdGwoU1RESU5fRklMRU5PLCBUSU9DU0NUVFksIDAgLypvbmx5IHRyeSwgZG9uJ3Qgc3RlYWwqLyk7CisJfQorCS8qIEhlcmUgY29tbWFuZCBuZXZlciBjb250YWlucyB0aGUgZGFzaCwgY21kWzBdIG1pZ2h0ICovCisJQkJfRVhFQ1ZQKGNvbW1hbmQsIGNtZCk7CisJbWVzc2FnZShMX0xPRyB8IExfQ09OU09MRSwgImNhbid0IHJ1biAnJXMnOiAlcyIsIGNvbW1hbmQsIHN0cmVycm9yKGVycm5vKSk7CisJLyogcmV0dXJucyBpZiBleGVjdnAgZmFpbHMgKi8KK30KKworLyogVXNlZCBvbmx5IGJ5IHJ1bl9hY3Rpb25zICovCitzdGF0aWMgcGlkX3QgcnVuKGNvbnN0IHN0cnVjdCBpbml0X2FjdGlvbiAqYSkKK3sKKwlwaWRfdCBwaWQ7CisKKwkvKiBDYXJlZnVsOiBkb24ndCBiZSBhZmZlY3RlZCBieSBhIHNpZ25hbCBpbiB2Zm9ya2VkIGNoaWxkICovCisJc2lncHJvY21hc2tfYWxsc2lncyhTSUdfQkxPQ0spOworCWlmIChCQl9NTVUgJiYgKGEtPmFjdGlvbl90eXBlICYgQVNLRklSU1QpKQorCQlwaWQgPSBmb3JrKCk7CisJZWxzZQorCQlwaWQgPSB2Zm9yaygpOworCWlmIChwaWQgPCAwKQorCQltZXNzYWdlKExfTE9HIHwgTF9DT05TT0xFLCAiY2FuJ3QgZm9yayIpOworCWlmIChwaWQpIHsKKwkJc2lncHJvY21hc2tfYWxsc2lncyhTSUdfVU5CTE9DSyk7CisJCXJldHVybiBwaWQ7IC8qIFBhcmVudCBvciBlcnJvciAqLworCX0KKworCS8qIENoaWxkICovCisKKwkvKiBSZXNldCBzaWduYWwgaGFuZGxlcnMgdGhhdCB3ZXJlIHNldCBieSB0aGUgcGFyZW50IHByb2Nlc3MgKi8KKwlyZXNldF9zaWdoYW5kbGVyc19hbmRfdW5ibG9ja19zaWdzKCk7CisKKwkvKiBDcmVhdGUgYSBuZXcgc2Vzc2lvbiBhbmQgbWFrZSBvdXJzZWxmIHRoZSBwcm9jZXNzIGdyb3VwIGxlYWRlciAqLworCXNldHNpZCgpOworCisJLyogT3BlbiB0aGUgbmV3IHRlcm1pbmFsIGRldmljZSAqLworCWlmICghb3Blbl9zdGRpb190b190dHkoYS0+dGVybWluYWwpKQorCQlfZXhpdChFWElUX0ZBSUxVUkUpOworCisJLyogTkI6IG9uIE5PTU1VIHdlIGNhbid0IHdhaXQgZm9yIGlucHV0IGluIGNoaWxkLCBzbworCSAqICJhc2tmaXJzdCIgd2lsbCB3b3JrIHRoZSBzYW1lIGFzICJyZXNwYXduIi4gKi8KKwlpZiAoQkJfTU1VICYmIChhLT5hY3Rpb25fdHlwZSAmIEFTS0ZJUlNUKSkgeworCQlzdGF0aWMgY29uc3QgY2hhciBwcmVzc19lbnRlcltdIEFMSUdOMSA9CisjaWZkZWYgQ1VTVE9NSVpFRF9CQU5ORVIKKyNpbmNsdWRlIENVU1RPTUlaRURfQkFOTkVSCisjZW5kaWYKKwkJCSJcblBsZWFzZSBwcmVzcyBFbnRlciB0byBhY3RpdmF0ZSB0aGlzIGNvbnNvbGUuICI7CisJCWNoYXIgYzsKKwkJLyoKKwkJICogU2F2ZSBtZW1vcnkgYnkgbm90IGV4ZWMtaW5nIGFueXRoaW5nIGxhcmdlIChsaWtlIGEgc2hlbGwpCisJCSAqIGJlZm9yZSB0aGUgdXNlciB3YW50cyBpdC4gVGhpcyBpcyBjcml0aWNhbCBpZiBzd2FwIGlzIG5vdAorCQkgKiBlbmFibGVkIGFuZCB0aGUgc3lzdGVtIGhhcyBsb3cgbWVtb3J5LiBHZW5lcmFsbHkgdGhpcyB3aWxsCisJCSAqIGJlIHJ1biBvbiB0aGUgc2Vjb25kIHZpcnR1YWwgY29uc29sZSwgYW5kIHRoZSBmaXJzdCB3aWxsCisJCSAqIGJlIGFsbG93ZWQgdG8gc3RhcnQgYSBzaGVsbCBvciB3aGF0ZXZlciBhbiBpbml0IHNjcmlwdAorCQkgKiBzcGVjaWZpZXMuCisJCSAqLworCQlkYmdfbWVzc2FnZShMX0xPRywgIndhaXRpbmcgZm9yIGVudGVyIHRvIHN0YXJ0ICclcyciCisJCQkJCSIocGlkICVkLCB0dHkgJyVzJylcbiIsCisJCQkJYS0+Y29tbWFuZCwgZ2V0cGlkKCksIGEtPnRlcm1pbmFsKTsKKwkJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBwcmVzc19lbnRlciwgc2l6ZW9mKHByZXNzX2VudGVyKSAtIDEpOworCQl3aGlsZSAoc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgJmMsIDEpID09IDEgJiYgYyAhPSAnXG4nKQorCQkJY29udGludWU7CisJfQorCisJLyoKKwkgKiBXaGVuIGEgZmlsZSBuYW1lZCAvLmluaXRfZW5hYmxlX2NvcmUgZXhpc3RzLCBzZXRybGltaXQgaXMgY2FsbGVkCisJICogYmVmb3JlIHByb2Nlc3NlcyBhcmUgc3Bhd25lZCB0byBzZXQgY29yZSBmaWxlIHNpemUgYXMgdW5saW1pdGVkLgorCSAqIFRoaXMgaXMgZm9yIGRlYnVnZ2luZyBvbmx5LiAgRG9uJ3QgdXNlIHRoaXMgaXMgcHJvZHVjdGlvbiwgdW5sZXNzCisJICogeW91IHdhbnQgY29yZSBkdW1wcyBseWluZyBhYm91dC4uLi4KKwkgKi8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfSU5JVF9DT1JFRFVNUFMpIHsKKwkJaWYgKGFjY2VzcygiLy5pbml0X2VuYWJsZV9jb3JlIiwgRl9PSykgPT0gMCkgeworCQkJc3RydWN0IHJsaW1pdCBsaW1pdDsKKwkJCWxpbWl0LnJsaW1fY3VyID0gUkxJTV9JTkZJTklUWTsKKwkJCWxpbWl0LnJsaW1fbWF4ID0gUkxJTV9JTkZJTklUWTsKKwkJCXNldHJsaW1pdChSTElNSVRfQ09SRSwgJmxpbWl0KTsKKwkJfQorCX0KKworCS8qIExvZyB0aGUgcHJvY2VzcyBuYW1lIGFuZCBhcmdzICovCisJbWVzc2FnZShMX0xPRywgInN0YXJ0aW5nIHBpZCAlZCwgdHR5ICclcyc6ICclcyciLAorCQkJZ2V0cGlkKCksIGEtPnRlcm1pbmFsLCBhLT5jb21tYW5kKTsKKworCS8qIE5vdyBydW4gaXQuICBUaGUgbmV3IHByb2dyYW0gd2lsbCB0YWtlIG92ZXIgdGhpcyBQSUQsCisJICogc28gbm90aGluZyBmdXJ0aGVyIGluIGluaXQuYyBzaG91bGQgYmUgcnVuLiAqLworCWluaXRfZXhlYyhhLT5jb21tYW5kKTsKKwkvKiBXZSdyZSBzdGlsbCBoZXJlPyAgU29tZSBlcnJvciBoYXBwZW5lZC4gKi8KKwlfZXhpdCgtMSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW5pdF9hY3Rpb24gKm1hcmtfdGVybWluYXRlZChwaWRfdCBwaWQpCit7CisJc3RydWN0IGluaXRfYWN0aW9uICphOworCisJaWYgKHBpZCA+IDApIHsKKwkJdXBkYXRlX3V0bXBfREVBRF9QUk9DRVNTKHBpZCk7CisJCWZvciAoYSA9IGluaXRfYWN0aW9uX2xpc3Q7IGE7IGEgPSBhLT5uZXh0KSB7CisJCQlpZiAoYS0+cGlkID09IHBpZCkgeworCQkJCWEtPnBpZCA9IDA7CisJCQkJcmV0dXJuIGE7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHdhaXRmb3IocGlkX3QgcGlkKQoreworCS8qIHdhaXRmb3IocnVuKHgpKTogcHJvdGVjdCBhZ2FpbnN0IGZhaWxlZCBmb3JrIGluc2lkZSBydW4oKSAqLworCWlmIChwaWQgPD0gMCkKKwkJcmV0dXJuOworCisJLyogV2FpdCBmb3IgYW55IGNoaWxkIChwcmV2ZW50IHpvbWJpZXMgZnJvbSBleGl0aW5nIG9ycGhhbmVkIHByb2Nlc3NlcykKKwkgKiBidXQgZXhpdCB0aGUgbG9vcCBvbmx5IHdoZW4gc3BlY2lmaWVkIG9uZSBoYXMgZXhpdGVkLiAqLworCXdoaWxlICgxKSB7CisJCXBpZF90IHdwaWQgPSB3YWl0KE5VTEwpOworCQltYXJrX3Rlcm1pbmF0ZWQod3BpZCk7CisJCS8qIFVuc2FmZS4gU0lHVFNUUCBoYW5kbGVyIG1pZ2h0IGhhdmUgd2FpdCdlZCBpdCBhbHJlYWR5ICovCisJCS8qaWYgKHdwaWQgPT0gcGlkKSBicmVhazsqLworCQkvKiBNb3JlIHJlbGlhYmxlOiAqLworCQlpZiAoa2lsbChwaWQsIDApKQorCQkJYnJlYWs7CisJfQorfQorCisvKiBSdW4gYWxsIGNvbW1hbmRzIG9mIGEgcGFydGljdWxhciB0eXBlICovCitzdGF0aWMgdm9pZCBydW5fYWN0aW9ucyhpbnQgYWN0aW9uX3R5cGUpCit7CisJc3RydWN0IGluaXRfYWN0aW9uICphOworCisJZm9yIChhID0gaW5pdF9hY3Rpb25fbGlzdDsgYTsgYSA9IGEtPm5leHQpIHsKKwkJaWYgKCEoYS0+YWN0aW9uX3R5cGUgJiBhY3Rpb25fdHlwZSkpCisJCQljb250aW51ZTsKKworCQlpZiAoYS0+YWN0aW9uX3R5cGUgJiAoU1lTSU5JVCB8IFdBSVQgfCBPTkNFIHwgQ1RSTEFMVERFTCB8IFNIVVRET1dOKSkgeworCQkJcGlkX3QgcGlkID0gcnVuKGEpOworCQkJaWYgKGEtPmFjdGlvbl90eXBlICYgKFNZU0lOSVQgfCBXQUlUIHwgQ1RSTEFMVERFTCB8IFNIVVRET1dOKSkKKwkJCQl3YWl0Zm9yKHBpZCk7CisJCX0KKwkJaWYgKGEtPmFjdGlvbl90eXBlICYgKFJFU1BBV04gfCBBU0tGSVJTVCkpIHsKKwkJCS8qIE9ubHkgcnVuIHN0dWZmIHdpdGggcGlkID09IDAuIElmIHBpZCAhPSAwLAorCQkJICogaXQgaXMgYWxyZWFkeSBydW5uaW5nCisJCQkgKi8KKwkJCWlmIChhLT5waWQgPT0gMCkKKwkJCQlhLT5waWQgPSBydW4oYSk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIG5ld19pbml0X2FjdGlvbih1aW50OF90IGFjdGlvbl90eXBlLCBjb25zdCBjaGFyICpjb21tYW5kLCBjb25zdCBjaGFyICpjb25zKQoreworCXN0cnVjdCBpbml0X2FjdGlvbiAqYSwgKipuZXh0cDsKKworCS8qIFNjZW5hcmlvOgorCSAqIG9sZCBpbml0dGFiOgorCSAqIDo6c2h1dGRvd246dW1vdW50IC1hIC1yCisJICogOjpzaHV0ZG93bjpzd2Fwb2ZmIC1hCisJICogbmV3IGluaXR0YWI6CisJICogOjpzaHV0ZG93bjpzd2Fwb2ZmIC1hCisJICogOjpzaHV0ZG93bjp1bW91bnQgLWEgLXIKKwkgKiBPbiByZWxvYWQsIHdlIG11c3QgZW5zdXJlIGVudHJpZXMgZW5kIHVwIGluIGNvcnJlY3Qgb3JkZXIuCisJICogVG8gYWNoaWV2ZSB0aGF0LCBpZiB3ZSBmaW5kIGEgbWF0Y2hpbmcgZW50cnksIHdlIG1vdmUgaXQKKwkgKiB0byB0aGUgZW5kLgorCSAqLworCW5leHRwID0gJmluaXRfYWN0aW9uX2xpc3Q7CisJd2hpbGUgKChhID0gKm5leHRwKSAhPSBOVUxMKSB7CisJCS8qIERvbid0IGVudGVyIGFjdGlvbiBpZiBpdCdzIGFscmVhZHkgaW4gdGhlIGxpc3QuCisJCSAqIFRoaXMgcHJldmVudHMgbG9zaW5nIHJ1bm5pbmcgUkVTUEFXTnMuCisJCSAqLworCQlpZiAoc3RyY21wKGEtPmNvbW1hbmQsIGNvbW1hbmQpID09IDAKKwkJICYmIHN0cmNtcChhLT50ZXJtaW5hbCwgY29ucykgPT0gMAorCQkpIHsKKwkJCS8qIFJlbW92ZSBmcm9tIGxpc3QgKi8KKwkJCSpuZXh0cCA9IGEtPm5leHQ7CisJCQkvKiBGaW5kIHRoZSBlbmQgb2YgdGhlIGxpc3QgKi8KKwkJCXdoaWxlICgqbmV4dHAgIT0gTlVMTCkKKwkJCQluZXh0cCA9ICYoKm5leHRwKS0+bmV4dDsKKwkJCWEtPm5leHQgPSBOVUxMOworCQkJZ290byBhcHBlbmQ7CisJCX0KKwkJbmV4dHAgPSAmYS0+bmV4dDsKKwl9CisKKwlhID0geHphbGxvYyhzaXplb2YoKmEpICsgc3RybGVuKGNvbW1hbmQpKTsKKworCS8qIEFwcGVuZCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0ICovCisgYXBwZW5kOgorCSpuZXh0cCA9IGE7CisJYS0+YWN0aW9uX3R5cGUgPSBhY3Rpb25fdHlwZTsKKwlzdHJjcHkoYS0+Y29tbWFuZCwgY29tbWFuZCk7CisJc2FmZV9zdHJuY3B5KGEtPnRlcm1pbmFsLCBjb25zLCBzaXplb2YoYS0+dGVybWluYWwpKTsKKwlkYmdfbWVzc2FnZShMX0xPRyB8IExfQ09OU09MRSwgImNvbW1hbmQ9JyVzJyBhY3Rpb249JXggdHR5PSclcydcbiIsCisJCWEtPmNvbW1hbmQsIGEtPmFjdGlvbl90eXBlLCBhLT50ZXJtaW5hbCk7Cit9CisKKy8qIE5PVEUgdGhhdCBpZiBDT05GSUdfRkVBVFVSRV9VU0VfSU5JVFRBQiBpcyBOT1QgZGVmaW5lZCwKKyAqIHRoZW4gcGFyc2VfaW5pdHRhYigpIHNpbXBseSBhZGRzIGluIHNvbWUgZGVmYXVsdAorICogYWN0aW9ucyAoaS5lLiwgcnVucyBJTklUX1NDUklQVCBhbmQgdGhlbiBzdGFydHMgYSBwYWlyCisgKiBvZiAiYXNrZmlyc3QiIHNoZWxscykuICBJZiBDT05GSUdfRkVBVFVSRV9VU0VfSU5JVFRBQgorICogX2lzXyBkZWZpbmVkLCBidXQgL2V0Yy9pbml0dGFiIGlzIG1pc3NpbmcsIHRoaXMKKyAqIHJlc3VsdHMgaW4gdGhlIHNhbWUgc2V0IG9mIGRlZmF1bHQgYmVoYXZpb3JzLgorICovCitzdGF0aWMgdm9pZCBwYXJzZV9pbml0dGFiKHZvaWQpCit7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX0lOSVRUQUIKKwljaGFyICp0b2tlbls0XTsKKwlwYXJzZXJfdCAqcGFyc2VyID0gY29uZmlnX29wZW4yKCIvZXRjL2luaXR0YWIiLCBmb3Blbl9mb3JfcmVhZCk7CisKKwlpZiAocGFyc2VyID09IE5VTEwpCisjZW5kaWYKKwl7CisJCS8qIE5vIGluaXR0YWIgZmlsZSAtIHNldCB1cCBzb21lIGRlZmF1bHQgYmVoYXZpb3IgKi8KKwkJLyogU3lzaW5pdCAqLworCQluZXdfaW5pdF9hY3Rpb24oU1lTSU5JVCwgSU5JVF9TQ1JJUFQsICIiKTsKKwkJLyogQXNrZmlyc3Qgc2hlbGwgb24gdHR5MS00ICovCisJCW5ld19pbml0X2FjdGlvbihBU0tGSVJTVCwgYmJfZGVmYXVsdF9sb2dpbl9zaGVsbCwgIiIpOworLy9UT0RPOiBWQ18xIGluc3RlYWQgb2YgIiI/ICIiIGlzIGNvbnNvbGUgLT4gY3R0eSBwcm9ibGVtcyAtPiBhbmdyeSB1c2VycworCQluZXdfaW5pdF9hY3Rpb24oQVNLRklSU1QsIGJiX2RlZmF1bHRfbG9naW5fc2hlbGwsIFZDXzIpOworCQluZXdfaW5pdF9hY3Rpb24oQVNLRklSU1QsIGJiX2RlZmF1bHRfbG9naW5fc2hlbGwsIFZDXzMpOworCQluZXdfaW5pdF9hY3Rpb24oQVNLRklSU1QsIGJiX2RlZmF1bHRfbG9naW5fc2hlbGwsIFZDXzQpOworCQkvKiBSZWJvb3Qgb24gQ3RybC1BbHQtRGVsICovCisJCW5ld19pbml0X2FjdGlvbihDVFJMQUxUREVMLCAicmVib290IiwgIiIpOworCQkvKiBVbW91bnQgYWxsIGZpbGVzeXN0ZW1zIG9uIGhhbHQvcmVib290ICovCisJCW5ld19pbml0X2FjdGlvbihTSFVURE9XTiwgInVtb3VudCAtYSAtciIsICIiKTsKKwkJLyogU3dhcG9mZiBvbiBoYWx0L3JlYm9vdCAqLworCQluZXdfaW5pdF9hY3Rpb24oU0hVVERPV04sICJzd2Fwb2ZmIC1hIiwgIiIpOworCQkvKiBSZXN0YXJ0IGluaXQgd2hlbiBhIFFVSVQgaXMgcmVjZWl2ZWQgKi8KKwkJbmV3X2luaXRfYWN0aW9uKFJFU1RBUlQsICJpbml0IiwgIiIpOworCQlyZXR1cm47CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX0lOSVRUQUIKKwkvKiBvcHRpb25hbF90dHk6aWdub3JlZF9ydW5sZXZlbDphY3Rpb246Y29tbWFuZAorCSAqIERlbGltcyBhcmUgbm90IHRvIGJlIGNvbGxhcHNlZCBhbmQgbmVlZCBleGFjdGx5IDQgdG9rZW5zCisJICovCisJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW4sIDQsIDAsICIjOiIsCisJCQkJUEFSU0VfTk9STUFMICYgfihQQVJTRV9UUklNIHwgUEFSU0VfQ09MTEFQU0UpKSkgeworCQkvKiBvcmRlciBtdXN0IGNvcnJlc3BvbmQgdG8gU1lTSU5JVC4uUkVTVEFSVCBjb25zdGFudHMgKi8KKwkJc3RhdGljIGNvbnN0IGNoYXIgYWN0aW9uc1tdIEFMSUdOMSA9CisJCQkic3lzaW5pdFwwIiJ3YWl0XDAiIm9uY2VcMCIicmVzcGF3blwwIiJhc2tmaXJzdFwwIgorCQkJImN0cmxhbHRkZWxcMCIic2h1dGRvd25cMCIicmVzdGFydFwwIjsKKwkJaW50IGFjdGlvbjsKKwkJY2hhciAqdHR5ID0gdG9rZW5bMF07CisKKwkJaWYgKCF0b2tlblszXSkgLyogbGVzcyB0aGFuIDQgdG9rZW5zICovCisJCQlnb3RvIGJhZF9lbnRyeTsKKwkJYWN0aW9uID0gaW5kZXhfaW5fc3RyaW5ncyhhY3Rpb25zLCB0b2tlblsyXSk7CisJCWlmIChhY3Rpb24gPCAwIHx8ICF0b2tlblszXVswXSkgLyogdG9rZW5bM106IGNvbW1hbmQgKi8KKwkJCWdvdG8gYmFkX2VudHJ5OworCQkvKiB0dXJuIC4qVFRZIC0+IC9kZXYvVFRZICovCisJCWlmICh0dHlbMF0pIHsKKwkJCXR0eSA9IGNvbmNhdF9wYXRoX2ZpbGUoIi9kZXYvIiwgc2tpcF9kZXZfcGZ4KHR0eSkpOworCQl9CisJCW5ld19pbml0X2FjdGlvbigxIDw8IGFjdGlvbiwgdG9rZW5bM10sIHR0eSk7CisJCWlmICh0dHlbMF0pCisJCQlmcmVlKHR0eSk7CisJCWNvbnRpbnVlOworIGJhZF9lbnRyeToKKwkJbWVzc2FnZShMX0xPRyB8IExfQ09OU09MRSwgIkJhZCBpbml0dGFiIGVudHJ5IGF0IGxpbmUgJWQiLAorCQkJCXBhcnNlci0+bGluZW5vKTsKKwl9CisJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgcGF1c2VfYW5kX2xvd19sZXZlbF9yZWJvb3QodW5zaWduZWQgbWFnaWMpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgcGF1c2VfYW5kX2xvd19sZXZlbF9yZWJvb3QodW5zaWduZWQgbWFnaWMpCit7CisJcGlkX3QgcGlkOworCisJLyogQWxsb3cgdGltZSBmb3IgbGFzdCBtZXNzYWdlIHRvIHJlYWNoIHNlcmlhbCBjb25zb2xlLCBldGMgKi8KKwlzbGVlcCgxKTsKKworCS8qIFdlIGhhdmUgdG8gZm9yayBoZXJlLCBzaW5jZSB0aGUga2VybmVsIGNhbGxzIGRvX2V4aXQoRVhJVF9TVUNDRVNTKQorCSAqIGluIGxpbnV4L2tlcm5lbC9zeXMuYywgd2hpY2ggY2FuIGNhdXNlIHRoZSBtYWNoaW5lIHRvIHBhbmljIHdoZW4KKwkgKiB0aGUgaW5pdCBwcm9jZXNzIGV4aXRzLi4uICovCisJcGlkID0gdmZvcmsoKTsKKwlpZiAocGlkID09IDApIHsgLyogY2hpbGQgKi8KKwkJcmVib290KG1hZ2ljKTsKKwkJX2V4aXQoRVhJVF9TVUNDRVNTKTsKKwl9CisJd2hpbGUgKDEpCisJCXNsZWVwKDEpOworfQorCitzdGF0aWMgdm9pZCBydW5fc2h1dGRvd25fYW5kX2tpbGxfcHJvY2Vzc2VzKHZvaWQpCit7CisJLyogUnVuIGV2ZXJ5dGhpbmcgdG8gYmUgcnVuIGF0ICJzaHV0ZG93biIuICBUaGlzIGlzIGRvbmUgX3ByaW9yXworCSAqIHRvIGtpbGxpbmcgZXZlcnl0aGluZywgaW4gY2FzZSBwZW9wbGUgd2lzaCB0byB1c2Ugc2NyaXB0cyB0bworCSAqIHNodXQgdGhpbmdzIGRvd24gZ3JhY2VmdWxseS4uLiAqLworCXJ1bl9hY3Rpb25zKFNIVVRET1dOKTsKKworCW1lc3NhZ2UoTF9DT05TT0xFIHwgTF9MT0csICJUaGUgc3lzdGVtIGlzIGdvaW5nIGRvd24gTk9XISIpOworCisJLyogU2VuZCBzaWduYWxzIHRvIGV2ZXJ5IHByb2Nlc3MgX2V4Y2VwdF8gcGlkIDEgKi8KKwlraWxsKC0xLCBTSUdURVJNKTsKKwltZXNzYWdlKExfQ09OU09MRSB8IExfTE9HLCAiU2VudCBTSUclcyB0byBhbGwgcHJvY2Vzc2VzIiwgIlRFUk0iKTsKKwlzeW5jKCk7CisJc2xlZXAoMSk7CisKKwlraWxsKC0xLCBTSUdLSUxMKTsKKwltZXNzYWdlKExfQ09OU09MRSwgIlNlbnQgU0lHJXMgdG8gYWxsIHByb2Nlc3NlcyIsICJLSUxMIik7CisJc3luYygpOworCS8qc2xlZXAoMSk7IC0gY2FsbGVycyB0YWtlIGNhcmUgYWJvdXQgbWFraW5nIGEgcGF1c2UgKi8KK30KKworLyogU2lnbmFsIGhhbmRsaW5nIGJ5IGluaXQ6CisgKgorICogRm9yIHByb2Nlc3Mgd2l0aCBQSUQ9PTEsIG9uIGVudHJ5IGtlcm5lbCBzZXRzIGFsbCBzaWduYWxzIHRvIFNJR19ERkwKKyAqIGFuZCB1bm1hc2tzIGFsbCBzaWduYWxzLiBIb3dldmVyLCBmb3IgcHJvY2VzcyB3aXRoIFBJRD09MSwKKyAqIGRlZmF1bHQgYWN0aW9uIChTSUdfREZMKSBvbiBhbnkgc2lnbmFsIGlzIHRvIGlnbm9yZSBpdCwKKyAqIGV2ZW4gZm9yIHNwZWNpYWwgc2lnbmFscyBTSUdLSUxMIGFuZCBTSUdDT05ULgorICogQWxzbywgYW55IHNpZ25hbCBjYW4gYmUgY2F1Z2h0IG9yIGJsb2NrZWQuCisgKiAoYnV0IFNJR1NUT1AgaXMgc3RpbGwgaGFuZGxlZCBzcGVjaWFsbHksIGF0IGxlYXN0IGluIDIuNi4yMCkKKyAqCisgKiBXZSBpbnN0YWxsIHR3byBraW5kcyBvZiBoYW5kbGVycywgImltbWVkaWF0ZSIgYW5kICJkZWxheWVkIi4KKyAqCisgKiBJbW1lZGlhdGUgaGFuZGxlcnMgZXhlY3V0ZSBhdCBhbnkgdGltZSwgZXZlbiB3aGlsZSwgc2F5LCBzeXNpbml0CisgKiBpcyBydW5uaW5nLgorICoKKyAqIERlbGF5ZWQgaGFuZGxlcnMganVzdCBzZXQgYSBmbGFnIHZhcmlhYmxlLiBUaGUgdmFyaWFibGUgaXMgY2hlY2tlZAorICogaW4gdGhlIG1haW4gbG9vcCBhbmQgYWN0ZWQgdXBvbi4KKyAqCisgKiBoYWx0L3Bvd2Vyb2ZmL3JlYm9vdCBhbmQgcmVzdGFydCBoYXZlIGltbWVkaWF0ZSBoYW5kbGVycy4KKyAqIFRoZXkgb25seSB0cmF2ZXJzZSBsaW5rZWQgbGlzdCBvZiBzdHJ1Y3QgYWN0aW9uJ3MsIG5ldmVyIG1vZGlmeSBpdCwKKyAqIHRoaXMgc2hvdWxkIGJlIHNhZmUgdG8gZG8gZXZlbiBpbiBzaWduYWwgaGFuZGxlci4gQWxzbyB0aGV5CisgKiBuZXZlciByZXR1cm4uCisgKgorICogU0lHU1RPUCBhbmQgU0lHVFNUUCBoYXZlIGltbWVkaWF0ZSBoYW5kbGVycy4gVGhleSBqdXN0IHdhaXQKKyAqIGZvciBTSUdDT05UIHRvIGhhcHBlbi4KKyAqCisgKiBTSUdIVVAgaGFzIGEgZGVsYXllZCBoYW5kbGVyLCBiZWNhdXNlIG1vZGlmeWluZyBsaW5rZWQgbGlzdAorICogb2Ygc3RydWN0IGFjdGlvbidzIGZyb20gYSBzaWduYWwgaGFuZGxlciB3aGlsZSBpdCBpcyBtYW5pcHVsYXRlZAorICogYnkgdGhlIHByb2dyYW0gbWF5IGJlIGRpc2FzdHJvdXMuCisgKgorICogQ3RybC1BbHQtRGVsIGhhcyBhIGRlbGF5ZWQgaGFuZGxlci4gTm90IGEgbXVzdCwgYnV0IGFsbG93aW5nCisgKiBpdCB0byBoYXBwZW4gZXZlbiBzb21ld2hlcmUgaW5zaWRlICJzeXNpbml0IiB3b3VsZCBiZSBhIGJpdCBhd2t3YXJkLgorICoKKyAqIFRoZXJlIGlzIGEgdGlueSBwcm9iYWJpbGl0eSB0aGF0IFNJR0hVUCBhbmQgQ3RybC1BbHQtRGVsIHdpbGwgY29sbGlkZQorICogYW5kIG9ubHkgb25lIHdpbGwgYmUgcmVtZW1iZXJlZCBhbmQgYWN0ZWQgdXBvbi4KKyAqLworCisvKiBUaGUgU0lHUFdSL1NJR1VTUlsxMl0vU0lHVEVSTSBoYW5kbGVyICovCitzdGF0aWMgdm9pZCBoYWx0X3JlYm9vdF9wd29mZihpbnQgc2lnKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGhhbHRfcmVib290X3B3b2ZmKGludCBzaWcpCit7CisJY29uc3QgY2hhciAqbTsKKwl1bnNpZ25lZCByYjsKKworCS8qIFdlIG1heSBjYWxsIHJ1bigpIGFuZCBpdCB1bm1hc2tzIHNpZ25hbHMsCisJICogaW5jbHVkaW5nIHRoZSBvbmUgbWFza2VkIGluc2lkZSB0aGlzIHNpZ25hbCBoYW5kbGVyLgorCSAqIFRlc3RjYXNlIHdoaWNoIHdvdWxkIHN0YXJ0IG11bHRpcGxlIHJlYm9vdCBzY3JpcHRzOgorCSAqICB3aGlsZSB0cnVlOyBkbyByZWJvb3Q7IGRvbmUKKwkgKiBQcmV2ZW50aW5nIGl0OgorCSAqLworCXJlc2V0X3NpZ2hhbmRsZXJzX2FuZF91bmJsb2NrX3NpZ3MoKTsKKworCXJ1bl9zaHV0ZG93bl9hbmRfa2lsbF9wcm9jZXNzZXMoKTsKKworCW0gPSAiaGFsdCI7CisJcmIgPSBSQl9IQUxUX1NZU1RFTTsKKwlpZiAoc2lnID09IFNJR1RFUk0pIHsKKwkJbSA9ICJyZWJvb3QiOworCQlyYiA9IFJCX0FVVE9CT09UOworCX0gZWxzZSBpZiAoc2lnID09IFNJR1VTUjIpIHsKKwkJbSA9ICJwb3dlcm9mZiI7CisJCXJiID0gUkJfUE9XRVJfT0ZGOworCX0KKwltZXNzYWdlKExfQ09OU09MRSwgIlJlcXVlc3Rpbmcgc3lzdGVtICVzIiwgbSk7CisJcGF1c2VfYW5kX2xvd19sZXZlbF9yZWJvb3QocmIpOworCS8qIG5vdCByZWFjaGVkICovCit9CisKKy8qIEhhbmRsZXIgZm9yIFFVSVQgLSBleGVjICJyZXN0YXJ0IiBhY3Rpb24sCisgKiBlbHNlIChubyBzdWNoIGFjdGlvbiBkZWZpbmVkKSBkbyBub3RoaW5nICovCitzdGF0aWMgdm9pZCBleGVjX3Jlc3RhcnRfYWN0aW9uKHZvaWQpCit7CisJc3RydWN0IGluaXRfYWN0aW9uICphOworCisJZm9yIChhID0gaW5pdF9hY3Rpb25fbGlzdDsgYTsgYSA9IGEtPm5leHQpIHsKKwkJaWYgKCEoYS0+YWN0aW9uX3R5cGUgJiBSRVNUQVJUKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIFN0YXJ0aW5nIGZyb20gaGVyZSwgd2Ugd29uJ3QgcmV0dXJuLgorCQkgKiBUaHVzIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgcHJlc2VydmluZyBlcnJubworCQkgKiBhbmQgc3VjaC4KKwkJICovCisKKwkJcmVzZXRfc2lnaGFuZGxlcnNfYW5kX3VuYmxvY2tfc2lncygpOworCisJCXJ1bl9zaHV0ZG93bl9hbmRfa2lsbF9wcm9jZXNzZXMoKTsKKworI2lmZGVmIFJCX0VOQUJMRV9DQUQKKwkJLyogQWxsb3cgQ3RybC1BbHQtRGVsIHRvIHJlYm9vdCB0aGUgc3lzdGVtLgorCQkgKiBUaGlzIGlzIGhvdyBrZXJuZWwgc2V0cyBpdCB1cCBmb3IgaW5pdCwgd2UgZm9sbG93IHN1aXQuCisJCSAqLworCQlyZWJvb3QoUkJfRU5BQkxFX0NBRCk7IC8qIG1pc25vbWVyICovCisjZW5kaWYKKworCQlpZiAob3Blbl9zdGRpb190b190dHkoYS0+dGVybWluYWwpKSB7CisJCQlkYmdfbWVzc2FnZShMX0NPTlNPTEUsICJUcnlpbmcgdG8gcmUtZXhlYyAlcyIsIGEtPmNvbW1hbmQpOworCQkJLyogVGhlb3JldGljYWxseSBzaG91bGQgYmUgc2FmZS4KKwkJCSAqIEJ1dCBpbiBwcmFjdGljZSwga2VybmVsIGJ1Z3MgbWF5IGxlYXZlCisJCQkgKiB1bmtpbGxhYmxlIHByb2Nlc3NlcywgYW5kIHdhaXQoKSBtYXkgYmxvY2sgZm9yZXZlci4KKwkJCSAqIE9oIHdlbGwuIEhvcGluZyAibmV3IiBpbml0IHdvbid0IGJlIHRvbyBzdXJwcmlzZWQKKwkJCSAqIGJ5IGhhdmluZyBjaGlsZHJlbiBpdCBkaWRuJ3QgY3JlYXRlLgorCQkJICovCisJCQkvL3doaWxlICh3YWl0KE5VTEwpID4gMCkKKwkJCS8vCWNvbnRpbnVlOworCQkJaW5pdF9leGVjKGEtPmNvbW1hbmQpOworCQl9CisJCS8qIE9wZW4gb3IgZXhlYyBmYWlsZWQgKi8KKwkJcGF1c2VfYW5kX2xvd19sZXZlbF9yZWJvb3QoUkJfSEFMVF9TWVNURU0pOworCQkvKiBub3QgcmVhY2hlZCAqLworCX0KK30KKworLyogVGhlIFNJR1NUT1AvU0lHVFNUUCBoYW5kbGVyCisgKiBOQjogaW5zaWRlIGl0LCBhbGwgc2lnbmFscyBleGNlcHQgU0lHQ09OVCBhcmUgbWFza2VkCisgKiB2aWEgYXBwcm9wcmlhdGUgc2V0dXAgaW4gc2lnYWN0aW9uKCkuCisgKi8KK3N0YXRpYyB2b2lkIHN0b3BfaGFuZGxlcihpbnQgc2lnIFVOVVNFRF9QQVJBTSkKK3sKKwlzbWFsbGludCBzYXZlZF9iYl9nb3Rfc2lnbmFsOworCWludCBzYXZlZF9lcnJubzsKKworCXNhdmVkX2JiX2dvdF9zaWduYWwgPSBiYl9nb3Rfc2lnbmFsOworCXNhdmVkX2Vycm5vID0gZXJybm87CisJc2lnbmFsKFNJR0NPTlQsIHJlY29yZF9zaWdubyk7CisKKwl3aGlsZSAoMSkgeworCQlwaWRfdCB3cGlkOworCisJCWlmIChiYl9nb3Rfc2lnbmFsID09IFNJR0NPTlQpCisJCQlicmVhazsKKwkJLyogTkI6IHRoaXMgY2FuIGFjY2lkZW50YWxseSB3YWl0KCkgZm9yIGEgcHJvY2VzcworCQkgKiB3aGljaCB3ZSB3YWl0Zm9yKCkgZWxzZXdoZXJlISB3YWl0Zm9yKCkgbXVzdCBoYXZlCisJCSAqIGNvZGUgd2hpY2ggaXMgcmVzaWxpZW50IGFnYWluc3QgdGhpcy4KKwkJICovCisJCXdwaWQgPSB3YWl0X2FueV9ub2hhbmcoTlVMTCk7CisJCW1hcmtfdGVybWluYXRlZCh3cGlkKTsKKwkJc2xlZXAoMSk7CisJfQorCisJc2lnbmFsKFNJR0NPTlQsIFNJR19ERkwpOworCWVycm5vID0gc2F2ZWRfZXJybm87CisJYmJfZ290X3NpZ25hbCA9IHNhdmVkX2JiX2dvdF9zaWduYWw7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9VU0VfSU5JVFRBQgorc3RhdGljIHZvaWQgcmVsb2FkX2luaXR0YWIodm9pZCkKK3sKKwlzdHJ1Y3QgaW5pdF9hY3Rpb24gKmEsICoqbmV4dHA7CisKKwltZXNzYWdlKExfTE9HLCAicmVsb2FkaW5nIC9ldGMvaW5pdHRhYiIpOworCisJLyogRGlzYWJsZSBvbGQgZW50cmllcyAqLworCWZvciAoYSA9IGluaXRfYWN0aW9uX2xpc3Q7IGE7IGEgPSBhLT5uZXh0KQorCQlhLT5hY3Rpb25fdHlwZSA9IDA7CisKKwkvKiBBcHBlbmQgbmV3IGVudHJpZXMsIG9yIG1vZGlmeSBleGlzdGluZyBlbnRyaWVzCisJICogKGluY2wuIHNldHRpbmcgYS0+YWN0aW9uX3R5cGUpIGlmIGNtZCBhbmQgZGV2aWNlIG5hbWUKKwkgKiBtYXRjaCBuZXcgb25lcy4gRW5kIHJlc3VsdDogb25seSBlbnRyaWVzIHdpdGgKKwkgKiBhLT5hY3Rpb25fdHlwZSA9PSAwIGFyZSBzdGFsZS4KKwkgKi8KKwlwYXJzZV9pbml0dGFiKCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9LSUxMX1JFTU9WRUQKKwkvKiBLaWxsIHN0YWxlIGVudHJpZXMgKi8KKwkvKiBCZSBuaWNlIGFuZCBzZW5kIFNJR1RFUk0gZmlyc3QgKi8KKwlmb3IgKGEgPSBpbml0X2FjdGlvbl9saXN0OyBhOyBhID0gYS0+bmV4dCkKKwkJaWYgKGEtPmFjdGlvbl90eXBlID09IDAgJiYgYS0+cGlkICE9IDApCisJCQlraWxsKGEtPnBpZCwgU0lHVEVSTSk7CisJaWYgKENPTkZJR19GRUFUVVJFX0tJTExfREVMQVkpIHsKKwkJLyogTkI6IHBhcmVudCB3aWxsIHdhaXQgaW4gTk9NTVUgY2FzZSAqLworCQlpZiAoKEJCX01NVSA/IGZvcmsoKSA6IHZmb3JrKCkpID09IDApIHsgLyogY2hpbGQgKi8KKwkJCXNsZWVwKENPTkZJR19GRUFUVVJFX0tJTExfREVMQVkpOworCQkJZm9yIChhID0gaW5pdF9hY3Rpb25fbGlzdDsgYTsgYSA9IGEtPm5leHQpCisJCQkJaWYgKGEtPmFjdGlvbl90eXBlID09IDAgJiYgYS0+cGlkICE9IDApCisJCQkJCWtpbGwoYS0+cGlkLCBTSUdLSUxMKTsKKwkJCV9leGl0KEVYSVRfU1VDQ0VTUyk7CisJCX0KKwl9CisjZW5kaWYKKworCS8qIFJlbW92ZSBzdGFsZSBlbnRyaWVzIGFuZCBTWVNJTklUIGVudHJpZXMuCisJICogV2UgbmV2ZXIgcmVydW4gU1lTSU5JVCBlbnRyaWVzIGFueXdheSwKKwkgKiByZW1vdmluZyB0aGVtIHRvbyBzYXZlcyBhIGZldyBieXRlcworCSAqLworCW5leHRwID0gJmluaXRfYWN0aW9uX2xpc3Q7CisJd2hpbGUgKChhID0gKm5leHRwKSAhPSBOVUxMKSB7CisJCS8qCisJCSAqIFdoeSBwaWQgPT0gMCBjaGVjaz8KKwkJICogUHJvY2VzcyBjYW4gYmUgcmVtb3ZlZCBmcm9tIGluaXR0YWIgYW5kIGFkZGVkICpsYXRlciouCisJCSAqIElmIHdlIGRlbGV0ZSBpdHMgZW50cnkgYnV0IHByb2Nlc3Mgc3RpbGwgcnVucywKKwkJICogZHVwbGljYXRlIGlzIHNwYXduZWQgd2hlbiB0aGUgZW50cnkgaXMgcmUtYWRkZWQuCisJCSAqLworCQlpZiAoKGEtPmFjdGlvbl90eXBlICYgflNZU0lOSVQpID09IDAgJiYgYS0+cGlkID09IDApIHsKKwkJCSpuZXh0cCA9IGEtPm5leHQ7CisJCQlmcmVlKGEpOworCQl9IGVsc2UgeworCQkJbmV4dHAgPSAmYS0+bmV4dDsKKwkJfQorCX0KKworCS8qIE5vdCBuZWVkZWQ6ICovCisJLyogcnVuX2FjdGlvbnMoUkVTUEFXTiB8IEFTS0ZJUlNUKTsgKi8KKwkvKiAtIHdlIHJldHVybiB0byBtYWluIGxvb3AsIHdoaWNoIGRvZXMgdGhpcyBhdXRvbWFnaWNhbGx5ICovCit9CisjZW5kaWYKKworc3RhdGljIGludCBjaGVja19kZWxheWVkX3NpZ3Modm9pZCkKK3sKKwlpbnQgc2lnc19zZWVuID0gMDsKKworCXdoaWxlICgxKSB7CisJCXNtYWxsaW50IHNpZyA9IGJiX2dvdF9zaWduYWw7CisKKwkJaWYgKCFzaWcpCisJCQlyZXR1cm4gc2lnc19zZWVuOworCQliYl9nb3Rfc2lnbmFsID0gMDsKKwkJc2lnc19zZWVuID0gMTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9VU0VfSU5JVFRBQgorCQlpZiAoc2lnID09IFNJR0hVUCkKKwkJCXJlbG9hZF9pbml0dGFiKCk7CisjZW5kaWYKKwkJaWYgKHNpZyA9PSBTSUdJTlQpCisJCQlydW5fYWN0aW9ucyhDVFJMQUxUREVMKTsKKwkJaWYgKHNpZyA9PSBTSUdRVUlUKSB7CisJCQlleGVjX3Jlc3RhcnRfYWN0aW9uKCk7CisJCQkvKiByZXR1cm5zIG9ubHkgaWYgbm8gcmVzdGFydCBhY3Rpb24gZGVmaW5lZCAqLworCQl9CisJCWlmICgoMSA8PCBzaWcpICYgKDAKKyNpZmRlZiBTSUdQV1IKKwkJICAgICsgKDEgPDwgU0lHUFdSKQorI2VuZGlmCisJCSAgICArICgxIDw8IFNJR1VTUjEpCisJCSAgICArICgxIDw8IFNJR1VTUjIpCisJCSAgICArICgxIDw8IFNJR1RFUk0pCisJCSkpIHsKKwkJCWhhbHRfcmVib290X3B3b2ZmKHNpZyk7CisJCX0KKwl9Cit9CisKKyNpZiBERUJVR19TRUdWX0hBTkRMRVIKK3N0YXRpYwordm9pZCBoYW5kbGVfc2lnc2VndihpbnQgc2lnLCBzaWdpbmZvX3QgKmluZm8sIHZvaWQgKnVjb250ZXh0KQoreworCWxvbmcgaXA7CisJdWNvbnRleHRfdCAqdWM7CisKKwl1YyA9IHVjb250ZXh0OworCWlwID0gdWMtPnVjX21jb250ZXh0LmdyZWdzW1JFR19FSVBdOworCWZkcHJpbnRmKDIsICJzaWduYWw6JWQgYWRkcmVzczoweCVseCBpcDoweCVseFxuIiwKKwkJCXNpZywKKwkJCS8qIHRoaXMgaXMgdm9pZCosIGJ1dCB1c2luZyAlcCB3b3VsZCBwcmludCAiKG51bGwpIgorCQkJICogZXZlbiBmb3IgcHRycyB3aGljaCBhcmUgbm90IGV4YWN0bHkgMCwgYnV0LCBzYXksIDB4MTIzOgorCQkJICovCisJCQkobG9uZylpbmZvLT5zaV9hZGRyLAorCQkJaXApOworCXsKKwkJLyogZ2xpYmMgZXh0ZW5zaW9uICovCisJCXZvaWQgKmFycmF5WzUwXTsKKwkJaW50IHNpemU7CisJCXNpemUgPSBiYWNrdHJhY2UoYXJyYXksIDUwKTsKKwkJYmFja3RyYWNlX3N5bWJvbHNfZmQoYXJyYXksIHNpemUsIDIpOworCX0KKwlmb3IgKDs7KSBzbGVlcCg5OTk5KTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzbGVlcF9tdWNoKHZvaWQpCit7CisgICAgICAgIHNsZWVwKDMwICogMjQqNjAqNjApOworfQorCitpbnQgaW5pdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaW5pdF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaWYgKGFyZ3ZbMV0gJiYgc3RyY21wKGFyZ3ZbMV0sICItcSIpID09IDApIHsKKwkJcmV0dXJuIGtpbGwoMSwgU0lHSFVQKTsKKwl9CisKKyNpZiBERUJVR19TRUdWX0hBTkRMRVIKKwl7CisJCXN0cnVjdCBzaWdhY3Rpb24gc2E7CisJCW1lbXNldCgmc2EsIDAsIHNpemVvZihzYSkpOworCQlzYS5zYV9zaWdhY3Rpb24gPSBoYW5kbGVfc2lnc2VndjsKKwkJc2Euc2FfZmxhZ3MgPSBTQV9TSUdJTkZPOworCQlzaWdhY3Rpb24oU0lHU0VHViwgJnNhLCBOVUxMKTsKKwkJc2lnYWN0aW9uKFNJR0lMTCwgJnNhLCBOVUxMKTsKKwkJc2lnYWN0aW9uKFNJR0ZQRSwgJnNhLCBOVUxMKTsKKwkJc2lnYWN0aW9uKFNJR0JVUywgJnNhLCBOVUxMKTsKKwl9CisjZW5kaWYKKworCWlmICghREVCVUdfSU5JVCkgeworCQkvKiBFeHBlY3QgdG8gYmUgaW52b2tlZCBhcyBpbml0IHdpdGggUElEPTEgb3IgYmUgaW52b2tlZCBhcyBsaW51eHJjICovCisJCWlmIChnZXRwaWQoKSAhPSAxCisJCSAmJiAoIUVOQUJMRV9GRUFUVVJFX0lOSVRSRCB8fCBhcHBsZXRfbmFtZVswXSAhPSAnbCcpIC8qIG5vdCBsaW51eHJjPyAqLworCQkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtdXN0IGJlIHJ1biBhcyBQSUQgMSIpOworCQl9CisjaWZkZWYgUkJfRElTQUJMRV9DQUQKKwkJLyogVHVybiBvZmYgcmVib290aW5nIHZpYSBDVEwtQUxULURFTCAtIHdlIGdldCBhCisJCSAqIFNJR0lOVCBvbiBDQUQgc28gd2UgY2FuIHNodXQgdGhpbmdzIGRvd24gZ3JhY2VmdWxseS4uLiAqLworCQlyZWJvb3QoUkJfRElTQUJMRV9DQUQpOyAvKiBtaXNub21lciAqLworI2VuZGlmCisJfQorCisJLyogSWYsIHNheSwgeG1hbGxvYyB3b3VsZCBldmVyIGRpZSwgd2UgZG9uJ3Qgd2FudCB0byBvb3BzIGtlcm5lbAorCSAqIGJ5IGV4aXRpbmcuCisJICogTkI6IHdlIHNldCBkaWVfZnVuYyAqYWZ0ZXIqIFBJRCAxIGNoZWNrIGFuZCBiYl9zaG93X3VzYWdlLgorCSAqIE90aGVyd2lzZSwgZm9yIGV4YW1wbGUsICJpbml0IHUiICgicGxlYXNlIHJleGVjIHlvdXJzZWxmIgorCSAqIGNvbW1hbmQgZm9yIHN5c3Zpbml0KSB3aWxsIHNob3cgaGVscCB0ZXh0ICh3aGljaCBpc24ndCB0b28gYmFkKSwKKwkgKiAqYW5kIHNsZWVwIGZvcmV2ZXIqICh3aGljaCBpcyBiYWQhKQorCSAqLworCWRpZV9mdW5jID0gc2xlZXBfbXVjaDsKKworCS8qIEZpZ3VyZSBvdXQgd2hlcmUgdGhlIGRlZmF1bHQgY29uc29sZSBzaG91bGQgYmUgKi8KKwljb25zb2xlX2luaXQoKTsKKwlzZXRfc2FuZV90ZXJtKCk7CisJeGNoZGlyKCIvIik7CisJc2V0c2lkKCk7CisKKwkvKiBNYWtlIHN1cmUgZW52aXJvbnMgaXMgc2V0IHRvIHNvbWV0aGluZyBzYW5lICovCisJcHV0ZW52KChjaGFyICopICJIT01FPS8iKTsKKwlwdXRlbnYoKGNoYXIgKikgYmJfUEFUSF9yb290X3BhdGgpOworCXB1dGVudigoY2hhciAqKSAiU0hFTEw9L2Jpbi9zaCIpOworCXB1dGVudigoY2hhciAqKSAiVVNFUj1yb290Iik7IC8qIG5lZWRlZD8gd2h5PyAqLworCisJaWYgKGFyZ3ZbMV0pCisJCXhzZXRlbnYoIlJVTkxFVkVMIiwgYXJndlsxXSk7CisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfRVhUUkFfUVVJRVQKKwkvKiBIZWxsbyB3b3JsZCAqLworCW1lc3NhZ2UoTF9DT05TT0xFIHwgTF9MT0csICJpbml0IHN0YXJ0ZWQ6ICVzIiwgYmJfYmFubmVyKTsKKyNlbmRpZgorCisjaWYgMAorLyogSXQncyAyMDEzLCBkb2VzIGFueW9uZSByZWFsbHkgc3RpbGwgZGVwZW5kIG9uIHRoaXM/ICovCisvKiBJZiB5b3UgZG8sIGNvbnNpZGVyIGFkZGluZyBzd2Fwb24gdG8gc3lzaW5pdCBhY3Rpb25zIHRoZW4hICovCisvKiBzdHJ1Y3Qgc3lzaW5mbyBpcyBsaW51eC1zcGVjaWZpYyAqLworIyBpZmRlZiBfX2xpbnV4X18KKwkvKiBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIG1lbW9yeSB0byBkbyBzb21ldGhpbmcgdXNlZnVsLiAqLworCS8qaWYgKEVOQUJMRV9TV0FQT05PRkYpIC0gV1JPTkc6IHdlIG1heSBoYXZlIG5vbi1iYm94IHN3YXBvbiovIHsKKwkJc3RydWN0IHN5c2luZm8gaW5mbzsKKworCQlpZiAoc3lzaW5mbygmaW5mbykgPT0gMAorCQkgJiYgKGluZm8ubWVtX3VuaXQgPyBpbmZvLm1lbV91bml0IDogMSkgKiAobG9uZyBsb25nKWluZm8udG90YWxyYW0gPCAxMDI0KjEwMjQKKwkJKSB7CisJCQltZXNzYWdlKExfQ09OU09MRSwgIkxvdyBtZW1vcnksIGZvcmNpbmcgc3dhcG9uIik7CisJCQkvKiBzd2Fwb24gLWEgcmVxdWlyZXMgL3Byb2MgdHlwaWNhbGx5ICovCisJCQluZXdfaW5pdF9hY3Rpb24oU1lTSU5JVCwgIm1vdW50IC10IHByb2MgcHJvYyAvcHJvYyIsICIiKTsKKwkJCS8qIFRyeSB0byB0dXJuIG9uIHN3YXAgKi8KKwkJCW5ld19pbml0X2FjdGlvbihTWVNJTklULCAic3dhcG9uIC1hIiwgIiIpOworCQkJcnVuX2FjdGlvbnMoU1lTSU5JVCk7ICAgLyogd2FpdCBhbmQgcmVtb3ZpbmcgKi8KKwkJfQorCX0KKyMgZW5kaWYKKyNlbmRpZgorCisJLyogQ2hlY2sgaWYgd2UgYXJlIHN1cHBvc2VkIHRvIGJlIGluIHNpbmdsZSB1c2VyIG1vZGUgKi8KKwlpZiAoYXJndlsxXQorCSAmJiAoc3RyY21wKGFyZ3ZbMV0sICJzaW5nbGUiKSA9PSAwIHx8IHN0cmNtcChhcmd2WzFdLCAiLXMiKSA9PSAwIHx8IExPTkVfQ0hBUihhcmd2WzFdLCAnMScpKQorCSkgeworCQkvKiA/Pz8gc2hvdWxkbid0IHdlIHNldCBSVU5MRVZFTD0iYiIgaGVyZT8gKi8KKwkJLyogU3RhcnQgYSBzaGVsbCBvbiBjb25zb2xlICovCisJCW5ld19pbml0X2FjdGlvbihSRVNQQVdOLCBiYl9kZWZhdWx0X2xvZ2luX3NoZWxsLCAiIik7CisJfSBlbHNlIHsKKwkJLyogTm90IGluIHNpbmdsZSB1c2VyIG1vZGUgLSBzZWUgd2hhdCBpbml0dGFiIHNheXMgKi8KKworCQkvKiBOT1RFIHRoYXQgaWYgQ09ORklHX0ZFQVRVUkVfVVNFX0lOSVRUQUIgaXMgTk9UIGRlZmluZWQsCisJCSAqIHRoZW4gcGFyc2VfaW5pdHRhYigpIHNpbXBseSBhZGRzIGluIHNvbWUgZGVmYXVsdAorCQkgKiBhY3Rpb25zIChpLmUuLCBJTklUX1NDUklQVCBhbmQgYSBwYWlyCisJCSAqIG9mICJhc2tmaXJzdCIgc2hlbGxzKSAqLworCQlwYXJzZV9pbml0dGFiKCk7CisJfQorCisjaWYgRU5BQkxFX1NFTElOVVgKKwlpZiAoZ2V0ZW52KCJTRUxJTlVYX0lOSVQiKSA9PSBOVUxMKSB7CisJCWludCBlbmZvcmNlID0gMDsKKworCQlwdXRlbnYoKGNoYXIqKSJTRUxJTlVYX0lOSVQ9WUVTIik7CisJCWlmIChzZWxpbnV4X2luaXRfbG9hZF9wb2xpY3koJmVuZm9yY2UpID09IDApIHsKKwkJCUJCX0VYRUNWUChhcmd2WzBdLCBhcmd2KTsKKwkJfSBlbHNlIGlmIChlbmZvcmNlID4gMCkgeworCQkJLyogU0VMaW51eCBpbiBlbmZvcmNpbmcgbW9kZSBidXQgbG9hZF9wb2xpY3kgZmFpbGVkICovCisJCQltZXNzYWdlKExfQ09OU09MRSwgImNhbid0IGxvYWQgU0VMaW51eCBQb2xpY3kuICIKKwkJCQkiTWFjaGluZSBpcyBpbiBlbmZvcmNpbmcgbW9kZS4gSGFsdGluZyBub3cuIik7CisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQl9CisJfQorI2VuZGlmCisKKwkvKiBNYWtlIHRoZSBjb21tYW5kIGxpbmUganVzdCBzYXkgImluaXQiICAtIHRoYXRzIGFsbCwgbm90aGluZyBlbHNlICovCisJc3RybmNweShhcmd2WzBdLCAiaW5pdCIsIHN0cmxlbihhcmd2WzBdKSk7CisJLyogV2lwZSBhcmd2WzFdLWFyZ3ZbTl0gc28gdGhleSBkb24ndCBjbHV0dGVyIHRoZSBwcyBsaXN0aW5nICovCisJd2hpbGUgKCorK2FyZ3YpCisJCW51a2Vfc3RyKCphcmd2KTsKKworCS8qIFNldCB1cCBzaWduYWwgaGFuZGxlcnMgKi8KKwlpZiAoIURFQlVHX0lOSVQpIHsKKwkJc3RydWN0IHNpZ2FjdGlvbiBzYTsKKworCQkvKiBTdG9wIGhhbmRsZXIgbXVzdCBhbGxvdyBvbmx5IFNJR0NPTlQgaW5zaWRlIGl0c2VsZiAqLworCQltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKwkJc2lnZmlsbHNldCgmc2Euc2FfbWFzayk7CisJCXNpZ2RlbHNldCgmc2Euc2FfbWFzaywgU0lHQ09OVCk7CisJCXNhLnNhX2hhbmRsZXIgPSBzdG9wX2hhbmRsZXI7CisJCS8qIE5COiBzYV9mbGFncyBkb2Vzbid0IGhhdmUgU0FfUkVTVEFSVC4KKwkJICogSXQgbXVzdCBiZSBhYmxlIHRvIGludGVycnVwdCB3YWl0KCkuCisJCSAqLworCQlzaWdhY3Rpb25fc2V0KFNJR1RTVFAsICZzYSk7IC8qIHBhdXNlICovCisJCS8qIERvZXMgbm90IHdvcmsgYXMgaW50ZW5kZWQsIGF0IGxlYXN0IGluIDIuNi4yMC4KKwkJICogU0lHU1RPUCBpcyBzaW1wbHkgaWdub3JlZCBieSBpbml0OgorCQkgKi8KKwkJc2lnYWN0aW9uX3NldChTSUdTVE9QLCAmc2EpOyAvKiBwYXVzZSAqLworCisJCS8qIFRoZXNlIHNpZ25hbHMgbXVzdCBpbnRlcnJ1cHQgd2FpdCgpLAorCQkgKiBzZXR0aW5nIGhhbmRsZXIgd2l0aG91dCBTQV9SRVNUQVJUIGZsYWcuCisJCSAqLworCQliYl9zaWduYWxzX3JlY3Vyc2l2ZV9ub3Jlc3RhcnQoMAorCQkJKyAoMSA8PCBTSUdJTlQpICAvKiBDdHJsLUFsdC1EZWwgKi8KKwkJCSsgKDEgPDwgU0lHUVVJVCkgLyogcmUtZXhlYyBhbm90aGVyIGluaXQgKi8KKyNpZmRlZiBTSUdQV1IKKwkJCSsgKDEgPDwgU0lHUFdSKSAgLyogaGFsdCAqLworI2VuZGlmCisJCQkrICgxIDw8IFNJR1VTUjEpIC8qIGhhbHQgKi8KKwkJCSsgKDEgPDwgU0lHVEVSTSkgLyogcmVib290ICovCisJCQkrICgxIDw8IFNJR1VTUjIpIC8qIHBvd2Vyb2ZmICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX0lOSVRUQUIKKwkJCSsgKDEgPDwgU0lHSFVQKSAgLyogcmVyZWFkIC9ldGMvaW5pdHRhYiAqLworI2VuZGlmCisJCQksIHJlY29yZF9zaWdubyk7CisJfQorCisJLyogTm93IHJ1biBldmVyeXRoaW5nIHRoYXQgbmVlZHMgdG8gYmUgcnVuICovCisJLyogRmlyc3QgcnVuIHRoZSBzeXNpbml0IGNvbW1hbmQgKi8KKwlydW5fYWN0aW9ucyhTWVNJTklUKTsKKwljaGVja19kZWxheWVkX3NpZ3MoKTsKKwkvKiBOZXh0IHJ1biBhbnl0aGluZyB0aGF0IHdhbnRzIHRvIGJsb2NrICovCisJcnVuX2FjdGlvbnMoV0FJVCk7CisJY2hlY2tfZGVsYXllZF9zaWdzKCk7CisJLyogTmV4dCBydW4gYW55dGhpbmcgdG8gYmUgcnVuIG9ubHkgb25jZSAqLworCXJ1bl9hY3Rpb25zKE9OQ0UpOworCisJLyogTm93IHJ1biB0aGUgbG9vcGluZyBzdHVmZiBmb3IgdGhlIHJlc3Qgb2YgZm9yZXZlci4KKwkgKi8KKwl3aGlsZSAoMSkgeworCQlpbnQgbWF5YmVfV05PSEFORzsKKworCQltYXliZV9XTk9IQU5HID0gY2hlY2tfZGVsYXllZF9zaWdzKCk7CisKKwkJLyogKFJlKXJ1biB0aGUgcmVzcGF3bi9hc2tmaXJzdCBzdHVmZiAqLworCQlydW5fYWN0aW9ucyhSRVNQQVdOIHwgQVNLRklSU1QpOworCQltYXliZV9XTk9IQU5HIHw9IGNoZWNrX2RlbGF5ZWRfc2lncygpOworCisJCS8qIERvbid0IGNvbnN1bWUgYWxsIENQVSB0aW1lIC0gc2xlZXAgYSBiaXQgKi8KKwkJc2xlZXAoMSk7CisJCW1heWJlX1dOT0hBTkcgfD0gY2hlY2tfZGVsYXllZF9zaWdzKCk7CisKKwkJLyogV2FpdCBmb3IgYW55IGNoaWxkIHByb2Nlc3MoZXMpIHRvIGV4aXQuCisJCSAqCisJCSAqIElmIGNoZWNrX2RlbGF5ZWRfc2lncyBhYm92ZSByZXBvcnRlZCB0aGF0IGEgc2lnbmFsCisJCSAqIHdhcyBjYXVnaHQsIHdhaXQgd2lsbCBiZSBub25ibG9ja2luZy4gVGhpcyBlbnN1cmVzCisJCSAqIHRoYXQgaWYgU0lHSFVQIGhhcyByZWxvYWRlZCBpbml0dGFiLCByZXNwYXduIGFuZCBhc2tmaXJzdAorCQkgKiBhY3Rpb25zIHdpbGwgbm90IGJlIGRlbGF5ZWQgdW50aWwgbmV4dCBjaGlsZCBkZWF0aC4KKwkJICovCisJCWlmIChtYXliZV9XTk9IQU5HKQorCQkJbWF5YmVfV05PSEFORyA9IFdOT0hBTkc7CisJCXdoaWxlICgxKSB7CisJCQlwaWRfdCB3cGlkOworCQkJc3RydWN0IGluaXRfYWN0aW9uICphOworCisJCQkvKiBJZiBzaWduYWxzIGhhcHBlbiBfaW5fIHRoZSB3YWl0LCB0aGV5IGludGVycnVwdCBpdCwKKwkJCSAqIGJiX3NpZ25hbHNfcmVjdXJzaXZlX25vcmVzdGFydCBzZXQgdGhlbSB1cCB0aGF0IHdheQorCQkJICovCisJCQl3cGlkID0gd2FpdHBpZCgtMSwgTlVMTCwgbWF5YmVfV05PSEFORyk7CisJCQlpZiAod3BpZCA8PSAwKQorCQkJCWJyZWFrOworCisJCQlhID0gbWFya190ZXJtaW5hdGVkKHdwaWQpOworCQkJaWYgKGEpIHsKKwkJCQltZXNzYWdlKExfTE9HLCAicHJvY2VzcyAnJXMnIChwaWQgJWQpIGV4aXRlZC4gIgorCQkJCQkJIlNjaGVkdWxpbmcgZm9yIHJlc3RhcnQuIiwKKwkJCQkJCWEtPmNvbW1hbmQsIHdwaWQpOworCQkJfQorCQkJLyogU2VlIGlmIGFueW9uZSBlbHNlIGlzIHdhaXRpbmcgdG8gYmUgcmVhcGVkICovCisJCQltYXliZV9XTk9IQU5HID0gV05PSEFORzsKKwkJfQorCX0gLyogd2hpbGUgKDEpICovCit9CisKKy8vdXNhZ2U6I2RlZmluZSBsaW51eHJjX3RyaXZpYWxfdXNhZ2UgTk9VU0FHRV9TVFIKKy8vdXNhZ2U6I2RlZmluZSBsaW51eHJjX2Z1bGxfdXNhZ2UgIiIKKworLy91c2FnZTojZGVmaW5lIGluaXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIiIKKy8vdXNhZ2U6I2RlZmluZSBpbml0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiSW5pdCBpcyB0aGUgZmlyc3QgcHJvY2VzcyBzdGFydGVkIGR1cmluZyBib290LiBJdCBuZXZlciBleGl0cy4iCisvL3VzYWdlOglJRl9GRUFUVVJFX1VTRV9JTklUVEFCKAorLy91c2FnZTogICAiXG4iIkl0IChyZSlzcGF3bnMgY2hpbGRyZW4gYWNjb3JkaW5nIHRvIC9ldGMvaW5pdHRhYi4iCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9OT1RfRkVBVFVSRV9VU0VfSU5JVFRBQigKKy8vdXNhZ2U6ICAgIlxuIiJUaGlzIHZlcnNpb24gb2YgaW5pdCBkb2Vzbid0IHVzZSAvZXRjL2luaXR0YWIsIgorLy91c2FnZTogICAiXG4iImhhcyBmaXhlZCBzZXQgb2YgcHJvY2Vzc2VkIHRvIHJ1bi4iCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGluaXRfbm90ZXNfdXNhZ2UKKy8vdXNhZ2U6CSJUaGlzIHZlcnNpb24gb2YgaW5pdCBpcyBkZXNpZ25lZCB0byBiZSBydW4gb25seSBieSB0aGUga2VybmVsLlxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIkJ1c3lCb3ggaW5pdCBkb2Vzbid0IHN1cHBvcnQgbXVsdGlwbGUgcnVubGV2ZWxzLiBUaGUgcnVubGV2ZWxzIGZpZWxkIG9mXG4iCisvL3VzYWdlOgkidGhlIC9ldGMvaW5pdHRhYiBmaWxlIGlzIGNvbXBsZXRlbHkgaWdub3JlZCBieSBCdXN5Qm94IGluaXQuIElmIHlvdSB3YW50XG4iCisvL3VzYWdlOgkicnVubGV2ZWxzLCB1c2Ugc3lzdmluaXQuXG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiQnVzeUJveCBpbml0IHdvcmtzIGp1c3QgZmluZSB3aXRob3V0IGFuIGluaXR0YWIuIElmIG5vIGluaXR0YWIgaXMgZm91bmQsXG4iCisvL3VzYWdlOgkiaXQgaGFzIHRoZSBmb2xsb3dpbmcgZGVmYXVsdCBiZWhhdmlvcjpcbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJOjpzeXNpbml0Oi9ldGMvaW5pdC5kL3JjU1xuIgorLy91c2FnZToJIgk6OmFza2ZpcnN0Oi9iaW4vc2hcbiIKKy8vdXNhZ2U6CSIJOjpjdHJsYWx0ZGVsOi9zYmluL3JlYm9vdFxuIgorLy91c2FnZToJIgk6OnNodXRkb3duOi9zYmluL3N3YXBvZmYgLWFcbiIKKy8vdXNhZ2U6CSIJOjpzaHV0ZG93bjovYmluL3Vtb3VudCAtYSAtclxuIgorLy91c2FnZToJIgk6OnJlc3RhcnQ6L3NiaW4vaW5pdFxuIgorLy91c2FnZToJIgl0dHkyOjphc2tmaXJzdDovYmluL3NoXG4iCisvL3VzYWdlOgkiCXR0eTM6OmFza2ZpcnN0Oi9iaW4vc2hcbiIKKy8vdXNhZ2U6CSIJdHR5NDo6YXNrZmlyc3Q6L2Jpbi9zaFxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIklmIHlvdSBjaG9vc2UgdG8gdXNlIGFuIC9ldGMvaW5pdHRhYiBmaWxlLCB0aGUgaW5pdHRhYiBlbnRyeSBmb3JtYXQgaXMgYXMgZm9sbG93czpcbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJPGlkPjo8cnVubGV2ZWxzPjo8YWN0aW9uPjo8cHJvY2Vzcz5cbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJPGlkPjpcbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJCVdBUk5JTkc6IFRoaXMgZmllbGQgaGFzIGEgbm9uLXRyYWRpdGlvbmFsIG1lYW5pbmcgZm9yIEJ1c3lCb3ggaW5pdCFcbiIKKy8vdXNhZ2U6CSIJCVRoZSBpZCBmaWVsZCBpcyB1c2VkIGJ5IEJ1c3lCb3ggaW5pdCB0byBzcGVjaWZ5IHRoZSBjb250cm9sbGluZyB0dHkgZm9yXG4iCisvL3VzYWdlOgkiCQl0aGUgc3BlY2lmaWVkIHByb2Nlc3MgdG8gcnVuIG9uLiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWVsZCBhcmVcbiIKKy8vdXNhZ2U6CSIJCWFwcGVuZGVkIHRvIFwiL2Rldi9cIiBhbmQgdXNlZCBhcy1pcy4gVGhlcmUgaXMgbm8gbmVlZCBmb3IgdGhpcyBmaWVsZCB0b1xuIgorLy91c2FnZToJIgkJYmUgdW5pcXVlLCBhbHRob3VnaCBpZiBpdCBpc24ndCB5b3UgbWF5IGhhdmUgc3RyYW5nZSByZXN1bHRzLiBJZiB0aGlzXG4iCisvL3VzYWdlOgkiCQlmaWVsZCBpcyBsZWZ0IGJsYW5rLCB0aGVuIHRoZSBpbml0J3Mgc3RkaW4vb3V0IHdpbGwgYmUgdXNlZC5cbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJPHJ1bmxldmVscz46XG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiCQlUaGUgcnVubGV2ZWxzIGZpZWxkIGlzIGNvbXBsZXRlbHkgaWdub3JlZC5cbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJPGFjdGlvbj46XG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiCQlWYWxpZCBhY3Rpb25zIGluY2x1ZGU6IHN5c2luaXQsIHJlc3Bhd24sIGFza2ZpcnN0LCB3YWl0LFxuIgorLy91c2FnZToJIgkJb25jZSwgcmVzdGFydCwgY3RybGFsdGRlbCwgYW5kIHNodXRkb3duLlxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIgkJVGhlIGF2YWlsYWJsZSBhY3Rpb25zIGNhbiBiZSBjbGFzc2lmaWVkIGludG8gdHdvIGdyb3VwczogYWN0aW9uc1xuIgorLy91c2FnZToJIgkJdGhhdCBhcmUgcnVuIG9ubHkgb25jZSwgYW5kIGFjdGlvbnMgdGhhdCBhcmUgcmUtcnVuIHdoZW4gdGhlIHNwZWNpZmllZFxuIgorLy91c2FnZToJIgkJcHJvY2VzcyBleGl0cy5cbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJCVJ1biBvbmx5LW9uY2UgYWN0aW9uczpcbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJCQknc3lzaW5pdCcgaXMgdGhlIGZpcnN0IGl0ZW0gcnVuIG9uIGJvb3QuIGluaXQgd2FpdHMgdW50aWwgYWxsXG4iCisvL3VzYWdlOgkiCQkJc3lzaW5pdCBhY3Rpb25zIGFyZSBjb21wbGV0ZWQgYmVmb3JlIGNvbnRpbnVpbmcuIEZvbGxvd2luZyB0aGVcbiIKKy8vdXNhZ2U6CSIJCQljb21wbGV0aW9uIG9mIGFsbCBzeXNpbml0IGFjdGlvbnMsIGFsbCAnd2FpdCcgYWN0aW9ucyBhcmUgcnVuLlxuIgorLy91c2FnZToJIgkJCSd3YWl0JyBhY3Rpb25zLCBsaWtlICdzeXNpbml0JyBhY3Rpb25zLCBjYXVzZSBpbml0IHRvIHdhaXQgdW50aWxcbiIKKy8vdXNhZ2U6CSIJCQl0aGUgc3BlY2lmaWVkIHRhc2sgY29tcGxldGVzLiAnb25jZScgYWN0aW9ucyBhcmUgYXN5bmNocm9ub3VzLFxuIgorLy91c2FnZToJIgkJCXRoZXJlZm9yZSwgaW5pdCBkb2VzIG5vdCB3YWl0IGZvciB0aGVtIHRvIGNvbXBsZXRlLiAncmVzdGFydCcgaXNcbiIKKy8vdXNhZ2U6CSIJCQl0aGUgYWN0aW9uIHRha2VuIHRvIHJlc3RhcnQgdGhlIGluaXQgcHJvY2Vzcy4gQnkgZGVmYXVsdCB0aGlzIHNob3VsZFxuIgorLy91c2FnZToJIgkJCXNpbXBseSBydW4gL3NiaW4vaW5pdCwgYnV0IGNhbiBiZSBhIHNjcmlwdCB3aGljaCBydW5zIHBpdm90X3Jvb3Qgb3IgaXRcbiIKKy8vdXNhZ2U6CSIJCQljYW4gZG8gYWxsIHNvcnRzIG9mIG90aGVyIGludGVyZXN0aW5nIHRoaW5ncy4gVGhlICdjdHJsYWx0ZGVsJyBpbml0XG4iCisvL3VzYWdlOgkiCQkJYWN0aW9ucyBhcmUgcnVuIHdoZW4gdGhlIHN5c3RlbSBkZXRlY3RzIHRoYXQgc29tZW9uZSBvbiB0aGUgc3lzdGVtXG4iCisvL3VzYWdlOgkiCQkJY29uc29sZSBoYXMgcHJlc3NlZCB0aGUgQ1RSTC1BTFQtREVMIGtleSBjb21iaW5hdGlvbi4gVHlwaWNhbGx5IG9uZVxuIgorLy91c2FnZToJIgkJCXdhbnRzIHRvIHJ1biAncmVib290JyBhdCB0aGlzIHBvaW50IHRvIGNhdXNlIHRoZSBzeXN0ZW0gdG8gcmVib290LlxuIgorLy91c2FnZToJIgkJCUZpbmFsbHkgdGhlICdzaHV0ZG93bicgYWN0aW9uIHNwZWNpZmllcyB0aGUgYWN0aW9ucyB0byB0YWtlbiB3aGVuXG4iCisvL3VzYWdlOgkiCQkJaW5pdCBpcyB0b2xkIHRvIHJlYm9vdC4gVW5tb3VudGluZyBmaWxlc3lzdGVtcyBhbmQgZGlzYWJsaW5nIHN3YXBcbiIKKy8vdXNhZ2U6CSIJCQlpcyBhIHZlcnkgZ29vZCBoZXJlLlxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIgkJUnVuIHJlcGVhdGVkbHkgYWN0aW9uczpcbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJCQkncmVzcGF3bicgYWN0aW9ucyBhcmUgcnVuIGFmdGVyIHRoZSAnb25jZScgYWN0aW9ucy4gV2hlbiBhIHByb2Nlc3NcbiIKKy8vdXNhZ2U6CSIJCQlzdGFydGVkIHdpdGggYSAncmVzcGF3bicgYWN0aW9uIGV4aXRzLCBpbml0IGF1dG9tYXRpY2FsbHkgcmVzdGFydHNcbiIKKy8vdXNhZ2U6CSIJCQlpdC4gVW5saWtlIHN5c3Zpbml0LCBCdXN5Qm94IGluaXQgZG9lcyBub3Qgc3RvcCBwcm9jZXNzZXMgZnJvbVxuIgorLy91c2FnZToJIgkJCXJlc3Bhd25pbmcgb3V0IG9mIGNvbnRyb2wuIFRoZSAnYXNrZmlyc3QnIGFjdGlvbnMgYWN0cyBqdXN0IGxpa2VcbiIKKy8vdXNhZ2U6CSIJCQlyZXNwYXduLCBleGNlcHQgdGhhdCBiZWZvcmUgcnVubmluZyB0aGUgc3BlY2lmaWVkIHByb2Nlc3MgaXRcbiIKKy8vdXNhZ2U6CSIJCQlkaXNwbGF5cyB0aGUgbGluZSBcIlBsZWFzZSBwcmVzcyBFbnRlciB0byBhY3RpdmF0ZSB0aGlzIGNvbnNvbGUuXCJcbiIKKy8vdXNhZ2U6CSIJCQlhbmQgdGhlbiB3YWl0cyBmb3IgdGhlIHVzZXIgdG8gcHJlc3MgZW50ZXIgYmVmb3JlIHN0YXJ0aW5nIHRoZVxuIgorLy91c2FnZToJIgkJCXNwZWNpZmllZCBwcm9jZXNzLlxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIgkJVW5yZWNvZ25pemVkIGFjdGlvbnMgKGxpa2UgaW5pdGRlZmF1bHQpIHdpbGwgY2F1c2UgaW5pdCB0byBlbWl0IGFuXG4iCisvL3VzYWdlOgkiCQllcnJvciBtZXNzYWdlLCBhbmQgdGhlbiBnbyBhbG9uZyB3aXRoIGl0cyBidXNpbmVzcy4gQWxsIGFjdGlvbnMgYXJlXG4iCisvL3VzYWdlOgkiCQlydW4gaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIC9ldGMvaW5pdHRhYi5cbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJPHByb2Nlc3M+OlxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIgkJU3BlY2lmaWVzIHRoZSBwcm9jZXNzIHRvIGJlIGV4ZWN1dGVkIGFuZCBpdHMgY29tbWFuZCBsaW5lLlxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIkV4YW1wbGUgL2V0Yy9pbml0dGFiIGZpbGU6XG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiCSMgVGhpcyBpcyBydW4gZmlyc3QgZXhjZXB0IHdoZW4gYm9vdGluZyBpbiBzaW5nbGUtdXNlciBtb2RlXG4iCisvL3VzYWdlOgkiCSNcbiIKKy8vdXNhZ2U6CSIJOjpzeXNpbml0Oi9ldGMvaW5pdC5kL3JjU1xuIgorLy91c2FnZToJIglcbiIKKy8vdXNhZ2U6CSIJIyAvYmluL3NoIGludm9jYXRpb25zIG9uIHNlbGVjdGVkIHR0eXNcbiIKKy8vdXNhZ2U6CSIJI1xuIgorLy91c2FnZToJIgkjIFN0YXJ0IGFuIFwiYXNrZmlyc3RcIiBzaGVsbCBvbiB0aGUgY29uc29sZSAod2hhdGV2ZXIgdGhhdCBtYXkgYmUpXG4iCisvL3VzYWdlOgkiCTo6YXNrZmlyc3Q6LS9iaW4vc2hcbiIKKy8vdXNhZ2U6CSIJIyBTdGFydCBhbiBcImFza2ZpcnN0XCIgc2hlbGwgb24gL2Rldi90dHkyLTRcbiIKKy8vdXNhZ2U6CSIJdHR5Mjo6YXNrZmlyc3Q6LS9iaW4vc2hcbiIKKy8vdXNhZ2U6CSIJdHR5Mzo6YXNrZmlyc3Q6LS9iaW4vc2hcbiIKKy8vdXNhZ2U6CSIJdHR5NDo6YXNrZmlyc3Q6LS9iaW4vc2hcbiIKKy8vdXNhZ2U6CSIJXG4iCisvL3VzYWdlOgkiCSMgL3NiaW4vZ2V0dHkgaW52b2NhdGlvbnMgZm9yIHNlbGVjdGVkIHR0eXNcbiIKKy8vdXNhZ2U6CSIJI1xuIgorLy91c2FnZToJIgl0dHk0OjpyZXNwYXduOi9zYmluL2dldHR5IDM4NDAwIHR0eTRcbiIKKy8vdXNhZ2U6CSIJdHR5NTo6cmVzcGF3bjovc2Jpbi9nZXR0eSAzODQwMCB0dHk1XG4iCisvL3VzYWdlOgkiCVxuIgorLy91c2FnZToJIglcbiIKKy8vdXNhZ2U6CSIJIyBFeGFtcGxlIG9mIGhvdyB0byBwdXQgYSBnZXR0eSBvbiBhIHNlcmlhbCBsaW5lIChmb3IgYSB0ZXJtaW5hbClcbiIKKy8vdXNhZ2U6CSIJI1xuIgorLy91c2FnZToJIgkjOjpyZXNwYXduOi9zYmluL2dldHR5IC1MIHR0eVMwIDk2MDAgdnQxMDBcbiIKKy8vdXNhZ2U6CSIJIzo6cmVzcGF3bjovc2Jpbi9nZXR0eSAtTCB0dHlTMSA5NjAwIHZ0MTAwXG4iCisvL3VzYWdlOgkiCSNcbiIKKy8vdXNhZ2U6CSIJIyBFeGFtcGxlIGhvdyB0byBwdXQgYSBnZXR0eSBvbiBhIG1vZGVtIGxpbmVcbiIKKy8vdXNhZ2U6CSIJIzo6cmVzcGF3bjovc2Jpbi9nZXR0eSA1NzYwMCB0dHlTMlxuIgorLy91c2FnZToJIglcbiIKKy8vdXNhZ2U6CSIJIyBTdHVmZiB0byBkbyB3aGVuIHJlc3RhcnRpbmcgdGhlIGluaXQgcHJvY2Vzc1xuIgorLy91c2FnZToJIgk6OnJlc3RhcnQ6L3NiaW4vaW5pdFxuIgorLy91c2FnZToJIglcbiIKKy8vdXNhZ2U6CSIJIyBTdHVmZiB0byBkbyBiZWZvcmUgcmVib290aW5nXG4iCisvL3VzYWdlOgkiCTo6Y3RybGFsdGRlbDovc2Jpbi9yZWJvb3RcbiIKKy8vdXNhZ2U6CSIJOjpzaHV0ZG93bjovYmluL3Vtb3VudCAtYSAtclxuIgorLy91c2FnZToJIgk6OnNodXRkb3duOi9zYmluL3N3YXBvZmYgLWFcbiIKZGlmZiAtLWdpdCBhL2luaXQvbWVzZy5jIGIvaW5pdC9tZXNnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVjMTNiOAotLS0gL2Rldi9udWxsCisrKyBiL2luaXQvbWVzZy5jCkBAIC0wLDAgKzEsNzYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIG1lc2cgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9jb25maWc6Y29uZmlnIE1FU0cKKy8vY29uZmlnOglib29sICJtZXNnIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIE1lc2cgY29udHJvbHMgYWNjZXNzIHRvIHlvdXIgdGVybWluYWwgYnkgb3RoZXJzLiBJdCBpcyB0eXBpY2FsbHkKKy8vY29uZmlnOgkgIHVzZWQgdG8gYWxsb3cgb3IgZGlzYWxsb3cgb3RoZXIgdXNlcnMgdG8gd3JpdGUgdG8geW91ciB0ZXJtaW5hbAorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9NRVNHX0VOQUJMRV9PTkxZX0dST1VQCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIHdyaXRpbmcgdG8gdHR5IG9ubHkgYnkgZ3JvdXAsIG5vdCBieSBldmVyeWJvZHkiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBNRVNHCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVXN1YWxseSwgdHR5cyBhcmUgb3duZWQgYnkgZ3JvdXAgInR0eSIsIGFuZCAid3JpdGUiIHRvb2wgaXMKKy8vY29uZmlnOgkgIHNldGdpZCB0byB0aGlzIGdyb3VwLiBUaGlzIHdheSwgIm1lc2cgeSIgb25seSBuZWVkcyB0byBlbmFibGUKKy8vY29uZmlnOgkgICJ3cml0ZSBieSBvd25pbmcgZ3JvdXAiIGJpdCBpbiB0dHkgbW9kZS4KKy8vY29uZmlnOgorLy9jb25maWc6CSAgSWYgeW91IHNldCB0aGlzIG9wdGlvbiB0byBOLCAibWVzZyB5IiB3aWxsIGVuYWJsZSB3cml0aW5nCisvL2NvbmZpZzoJICBieSBhbnlib2R5IGF0IGFsbC4gVGhpcyBpcyBub3QgcmVjb21tZW5kZWQuCisKKy8vYXBwbGV0OklGX01FU0coQVBQTEVUKG1lc2csIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfTUVTRykgKz0gbWVzZy5vCisKKy8vdXNhZ2U6I2RlZmluZSBtZXNnX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbeXxuXSIKKy8vdXNhZ2U6I2RlZmluZSBtZXNnX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ29udHJvbCB3cml0ZSBhY2Nlc3MgdG8geW91ciB0ZXJtaW5hbFxuIgorLy91c2FnZTogICAgICAgIgl5CUFsbG93IHdyaXRlIGFjY2VzcyB0byB5b3VyIHRlcm1pbmFsXG4iCisvL3VzYWdlOiAgICAgICAiCW4JRGlzYWxsb3cgd3JpdGUgYWNjZXNzIHRvIHlvdXIgdGVybWluYWwiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTUVTR19FTkFCTEVfT05MWV9HUk9VUAorI2RlZmluZSBTX0lXR1JQX09SX1NfSVdPVEggIFNfSVdHUlAKKyNlbHNlCisjZGVmaW5lIFNfSVdHUlBfT1JfU19JV09USCAgKFNfSVdHUlAgfCBTX0lXT1RIKQorI2VuZGlmCisKK2ludCBtZXNnX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBtZXNnX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3Qgc3RhdCBzYjsKKwltb2RlX3QgbTsKKwljaGFyIGMgPSAwOworCisJYXJndisrOworCisJaWYgKGFyZ3ZbMF0KKwkgJiYgKGFyZ3ZbMV0gfHwgKChjID0gYXJndlswXVswXSkgIT0gJ3knICYmIGMgIT0gJ24nKSkKKwkpIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWlmICghaXNhdHR5KFNURElOX0ZJTEVOTykpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJub3QgYSB0dHkiKTsKKworCXhmc3RhdChTVERJTl9GSUxFTk8sICZzYiwgInN0ZGVyciIpOworCWlmIChjID09IDApIHsKKwkJcHV0cygoc2Iuc3RfbW9kZSAmIChTX0lXR1JQfFNfSVdPVEgpKSA/ICJpcyB5IiA6ICJpcyBuIik7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCW0gPSAoYyA9PSAneScpID8gc2Iuc3RfbW9kZSB8IFNfSVdHUlBfT1JfU19JV09USAorCSAgICAgICAgICAgICAgIDogc2Iuc3RfbW9kZSAmIH4oU19JV0dSUHxTX0lXT1RIKTsKKwlpZiAoZmNobW9kKFNURElOX0ZJTEVOTywgbSkgIT0gMCkKKwkJYmJfcGVycm9yX25vbXNnX2FuZF9kaWUoKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvaW5pdC9yZWJvb3QuaCBiL2luaXQvcmVib290LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ5NzYzOQotLS0gL2Rldi9udWxsCisrKyBiL2luaXQvcmVib290LmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIERlZmluaXRpb25zIHJlbGF0ZWQgdG8gdGhlIHJlYm9vdCgpIHN5c3RlbSBjYWxsLAorICogc2hhcmVkIGJldHdlZW4gaW5pdC5jIGFuZCBoYWx0LmMuCisgKi8KKworI2luY2x1ZGUgPHN5cy9yZWJvb3QuaD4KKworI2lmbmRlZiBSQl9IQUxUX1NZU1RFTQorIyBpZiBkZWZpbmVkKF9fbGludXhfXykKKyMgIGRlZmluZSBSQl9IQUxUX1NZU1RFTSAgMHhjZGVmMDEyMworIyAgZGVmaW5lIFJCX0VOQUJMRV9DQUQgICAweDg5YWJjZGVmCisjICBkZWZpbmUgUkJfRElTQUJMRV9DQUQgIDAKKyMgIGRlZmluZSBSQl9QT1dFUl9PRkYgICAgMHg0MzIxZmVkYworIyAgZGVmaW5lIFJCX0FVVE9CT09UICAgICAweDAxMjM0NTY3CisjIGVsaWYgZGVmaW5lZChSQl9IQUxUKQorIyAgZGVmaW5lIFJCX0hBTFRfU1lTVEVNICBSQl9IQUxUCisjIGVuZGlmCisjZW5kaWYKKworLyogU3RvcCBzeXN0ZW0gYW5kIHN3aXRjaCBwb3dlciBvZmYgaWYgcG9zc2libGUuICAqLworI2lmbmRlZiBSQl9QT1dFUl9PRkYKKyMgaWYgZGVmaW5lZChSQl9QT1dFUkRPV04pCisjICBkZWZpbmUgUkJfUE9XRVJfT0ZGICBSQl9QT1dFUkRPV04KKyMgZWxpZiBkZWZpbmVkKF9fbGludXhfXykKKyMgIGRlZmluZSBSQl9QT1dFUl9PRkYgIDB4NDMyMWZlZGMKKyMgZWxzZQorIyAgd2FybmluZyAicG93ZXJvZmYgdW5zdXBwb3J0ZWQsIHVzaW5nIGhhbHQgYXMgZmFsbGJhY2siCisjICBkZWZpbmUgUkJfUE9XRVJfT0ZGICBSQl9IQUxUX1NZU1RFTQorIyBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJiYi9Db25maWcuc3JjIGIvbGliYmIvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTAyMWZlCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDIzNSBAQAorIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiQnVzeWJveCBMaWJyYXJ5IFR1bmluZyIKKworSU5TRVJUCisKK2NvbmZpZyBQQVNTV09SRF9NSU5MRU4KKwlpbnQgIk1pbmltdW0gcGFzc3dvcmQgbGVuZ3RoIgorCWRlZmF1bHQgNgorCXJhbmdlIDUgMzIKKwloZWxwCisJICBNaW5pbXVtIGFsbG93YWJsZSBwYXNzd29yZCBsZW5ndGguCisKK2NvbmZpZyBNRDVfU01BTEwKKwlpbnQgIk1ENTogVHJhZGUgYnl0ZXMgZm9yIHNwZWVkICgwOmZhc3QsIDM6c2xvdykiCisJZGVmYXVsdCAxCisJcmFuZ2UgMCAzCisJaGVscAorCSAgVHJhZGUgYmluYXJ5IHNpemUgdmVyc3VzIHNwZWVkIGZvciB0aGUgbWQ1c3VtIGFsZ29yaXRobS4KKwkgIEFwcHJveGltYXRlIHZhbHVlcyBydW5uaW5nIHVDbGliYyBhbmQgaGFzaGluZworCSAgbGludXgtMi40LjQudGFyLmJ6MiB3ZXJlOgorCSAgICAgICAgICAgICAgICAgICAgdXNlciB0aW1lcyAoc2VjKSAgdGV4dCBzaXplICgzODYpCisJICAwIChmYXN0ZXN0KSAgICAgICAgIDEuMSAgICAgICAgICAgICAgICA2MTQ0CisJICAxICAgICAgICAgICAgICAgICAgIDEuNCAgICAgICAgICAgICAgICA1MzkyCisJICAyICAgICAgICAgICAgICAgICAgIDMuMCAgICAgICAgICAgICAgICA1MDg4CisJICAzIChzbWFsbGVzdCkgICAgICAgIDUuMSAgICAgICAgICAgICAgICA0OTEyCisKK2NvbmZpZyBTSEEzX1NNQUxMCisJaW50ICJTSEEzOiBUcmFkZSBieXRlcyBmb3Igc3BlZWQgKDA6ZmFzdCwgMTpzbG93KSIKKwlkZWZhdWx0IDEKKwlyYW5nZSAwIDEKKwloZWxwCisJICBUcmFkZSBiaW5hcnkgc2l6ZSB2ZXJzdXMgc3BlZWQgZm9yIHRoZSBzaGEzc3VtIGFsZ29yaXRobS4KKwkgIFNIQTNfU01BTEw9MCBjb21wYXJlZCB0byBTSEEzX1NNQUxMPTEgKGFwcHJveGltYXRlKToKKwkgIDY0LWJpdCB4ODY6ICsyNzAgYnl0ZXMgb2YgY29kZSwgNDUlIGZhc3RlcgorCSAgMzItYml0IHg4NjogKzQ1MCBieXRlcyBvZiBjb2RlLCA3NSUgZmFzdGVyCisKK2NvbmZpZyBGRUFUVVJFX0ZBU1RfVE9QCisJYm9vbCAiRmFzdGVyIC9wcm9jIHNjYW5uaW5nIGNvZGUgKCsxMDAgYnl0ZXMpIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIG1ha2VzIHRvcCAoYW5kIHBzKSB+MjAlIGZhc3RlciAob3IgMjAlIGxlc3MgQ1BVIGh1bmdyeSksCisJICBidXQgY29kZSBzaXplIGlzIHNsaWdodGx5IGJpZ2dlci4KKworY29uZmlnIEZFQVRVUkVfRVRDX05FVFdPUktTCisJYm9vbCAiU3VwcG9ydCBmb3IgL2V0Yy9uZXR3b3JrcyIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgbmV0d29yayBuYW1lcyBpbiAvZXRjL25ldHdvcmtzLiBUaGlzIGlzCisJICBhIHJhcmVseSB1c2VkIGZlYXR1cmUgd2hpY2ggYWxsb3dzIHlvdSB0byB1c2UgbmFtZXMKKwkgIGluc3RlYWQgb2YgSVAvbWFzayBwYWlycyBpbiByb3V0ZSBjb21tYW5kLgorCitjb25maWcgRkVBVFVSRV9VU0VfVEVSTUlPUworCWJvb2wgIlVzZSB0ZXJtaW9zIHRvIG1hbmlwdWxhdGUgdGhlIHNjcmVlbiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE1PUkUgfHwgVE9QIHx8IFBPV0VSVE9QCisJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHV0aWxpdGllcyBzdWNoIGFzICdtb3JlJyBhbmQgJ3RvcCcgdG8gZGV0ZXJtaW5lCisJICB0aGUgc2l6ZSBvZiB0aGUgc2NyZWVuLiBJZiB5b3UgbGVhdmUgdGhpcyBkaXNhYmxlZCwgeW91ciB1dGlsaXRpZXMKKwkgIHRoYXQgZGlzcGxheSB0aGluZ3Mgb24gdGhlIHNjcmVlbiB3aWxsIGJlIGVzcGVjaWFsbHkgcHJpbWl0aXZlIGFuZAorCSAgd2lsbCBiZSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZSBjdXJyZW50IHNjcmVlbiBzaXplLCBhbmQgd2lsbCBiZQorCSAgdW5hYmxlIHRvIG1vdmUgdGhlIGN1cnNvci4KKworY29uZmlnIEZFQVRVUkVfRURJVElORworCWJvb2wgIkNvbW1hbmQgbGluZSBlZGl0aW5nIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEVuYWJsZSBsaW5lIGVkaXRpbmcgKG1haW5seSBmb3Igc2hlbGwgY29tbWFuZCBsaW5lKS4KKworY29uZmlnIEZFQVRVUkVfRURJVElOR19NQVhfTEVOCisJaW50ICJNYXhpbXVtIGxlbmd0aCBvZiBpbnB1dCIKKwlyYW5nZSAxMjggODE5MgorCWRlZmF1bHQgMTAyNAorCWRlcGVuZHMgb24gRkVBVFVSRV9FRElUSU5HCisJaGVscAorCSAgTGluZSBlZGl0aW5nIGNvZGUgdXNlcyBvbi1zdGFjayBidWZmZXJzIGZvciBzdG9yYWdlLgorCSAgWW91IG1heSB3YW50IHRvIGRlY3JlYXNlIHRoaXMgcGFyYW1ldGVyIGlmIHlvdXIgdGFyZ2V0IG1hY2hpbmUKKwkgIGJlbmVmaXRzIGZyb20gc21hbGxlciBzdGFjayB1c2FnZS4KKworY29uZmlnIEZFQVRVUkVfRURJVElOR19WSQorCWJvb2wgInZpLXN0eWxlIGxpbmUgZWRpdGluZyBjb21tYW5kcyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZFQVRVUkVfRURJVElORworCWhlbHAKKwkgIEVuYWJsZSB2aS1zdHlsZSBsaW5lIGVkaXRpbmcuIEluIHNoZWxscywgdGhpcyBtb2RlIGNhbiBiZQorCSAgdHVybmVkIG9uIGFuZCBvZmYgd2l0aCAic2V0IC1vIHZpIiBhbmQgInNldCArbyB2aSIuCisKK2NvbmZpZyBGRUFUVVJFX0VESVRJTkdfSElTVE9SWQorCWludCAiSGlzdG9yeSBzaXplIgorCSMgRG9uJ3QgYWxsb3cgd2F5IHRvbyBiaWcgdmFsdWVzIGhlcmUsIGNvZGUgdXNlcyBmaXhlZCAiY2hhciAqaGlzdG9yeVtOXSIgc3RydWN0IG1lbWJlcgorCXJhbmdlIDAgOTk5OQorCWRlZmF1bHQgMjU1CisJZGVwZW5kcyBvbiBGRUFUVVJFX0VESVRJTkcKKwloZWxwCisJICBTcGVjaWZ5IGNvbW1hbmQgaGlzdG9yeSBzaXplICgwIC0gZGlzYWJsZSkuCisKK2NvbmZpZyBGRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkKKwlib29sICJIaXN0b3J5IHNhdmluZyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfRURJVElORworCWhlbHAKKwkgIEVuYWJsZSBoaXN0b3J5IHNhdmluZyBpbiBzaGVsbHMuCisKK2NvbmZpZyBGRUFUVVJFX0VESVRJTkdfU0FWRV9PTl9FWElUCisJYm9vbCAiU2F2ZSBoaXN0b3J5IG9uIHNoZWxsIGV4aXQsIG5vdCBhZnRlciBldmVyeSBjb21tYW5kIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gRkVBVFVSRV9FRElUSU5HX1NBVkVISVNUT1JZCisJaGVscAorCSAgU2F2ZSBoaXN0b3J5IG9uIHNoZWxsIGV4aXQsIG5vdCBhZnRlciBldmVyeSBjb21tYW5kLgorCitjb25maWcgRkVBVFVSRV9SRVZFUlNFX1NFQVJDSAorCWJvb2wgIlJldmVyc2UgaGlzdG9yeSBzZWFyY2giCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkKKwloZWxwCisJICBFbmFibGUgcmVhZGxpbmUtbGlrZSBDdHJsLVIgY29tYmluYXRpb24gZm9yIHJldmVyc2UgaGlzdG9yeSBzZWFyY2guCisJICBJbmNyZWFzZXMgY29kZSBieSBhYm91dCAwLjVrLgorCitjb25maWcgRkVBVFVSRV9UQUJfQ09NUExFVElPTgorCWJvb2wgIlRhYiBjb21wbGV0aW9uIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9FRElUSU5HCisJaGVscAorCSAgRW5hYmxlIHRhYiBjb21wbGV0aW9uLgorCitjb25maWcgRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OCisJYm9vbCAiVXNlcm5hbWUgY29tcGxldGlvbiIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZFQVRVUkVfVEFCX0NPTVBMRVRJT04KKwloZWxwCisJICBFbmFibGUgdXNlcm5hbWUgY29tcGxldGlvbi4KKworY29uZmlnIEZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQKKwlib29sICJGYW5jeSBzaGVsbCBwcm9tcHRzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9FRElUSU5HCisJaGVscAorCSAgU2V0dGluZyB0aGlzIG9wdGlvbiBhbGxvd3MgZm9yIHByb21wdHMgdG8gdXNlIHRoaW5ncyBsaWtlIFx3IGFuZAorCSAgXCQgYW5kIGVzY2FwZSBjb2Rlcy4KKworY29uZmlnIEZFQVRVUkVfRURJVElOR19BU0tfVEVSTUlOQUwKKwlib29sICJRdWVyeSBjdXJzb3IgcG9zaXRpb24gZnJvbSB0ZXJtaW5hbCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZFQVRVUkVfRURJVElORworCWhlbHAKKwkgIEFsbG93IHVzYWdlIG9mICJFU0MgWyA2IG4iIHNlcXVlbmNlLiBUZXJtaW5hbCBhbnN3ZXJzIGJhY2sgd2l0aAorCSAgY3VycmVudCBjdXJzb3IgcG9zaXRpb24uIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBtYWtlIGxpbmUKKwkgIGVkaXRpbmcgbW9yZSByb2J1c3QgaW4gc29tZSBjYXNlcy4KKwkgIElmIHlvdSBhcmUgbm90IHN1cmUgd2hldGhlciB5b3VyIHRlcm1pbmFscyByZXNwb25kIHRvIHRoaXMgY29kZQorCSAgY29ycmVjdGx5LCBvciB3YW50IHRvIHNhdmUgb24gY29kZSBzaXplIChhYm91dCA0MDAgYnl0ZXMpLAorCSAgdGhlbiBkbyBub3QgdHVybiB0aGlzIG9wdGlvbiBvbi4KKworY29uZmlnIEZFQVRVUkVfTk9OX1BPU0lYX0NQCisJYm9vbCAiTm9uLVBPU0lYLCBidXQgc2FmZXIsIGNvcHlpbmcgdG8gc3BlY2lhbCBub2RlcyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBXaXRoIHRoaXMgb3B0aW9uLCAiY3AgZmlsZSBzeW1saW5rIiB3aWxsIGRlbGV0ZSBzeW1saW5rCisJICBhbmQgY3JlYXRlIGEgcmVndWxhciBmaWxlLiBUaGlzIGRvZXMgbm90IGNvbmZvcm0gdG8gUE9TSVgsCisJICBidXQgcHJldmVudHMgYSBzeW1saW5rIGF0dGFjay4KKwkgIFNpbWlsYXJseSwgImNwIGZpbGUgZGV2aWNlIiB3aWxsIG5vdCBzZW5kIGZpbGUncyBkYXRhCisJICB0byB0aGUgZGV2aWNlLiAoVG8gZG8gdGhhdCwgdXNlICJjYXQgZmlsZSA+ZGV2aWNlIikKKworY29uZmlnIEZFQVRVUkVfVkVSQk9TRV9DUF9NRVNTQUdFCisJYm9vbCAiR2l2ZSBtb3JlIHByZWNpc2UgbWVzc2FnZXMgd2hlbiBjb3B5IGZhaWxzIChjcCwgbXYgZXRjKSIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBFcnJvciBtZXNzYWdlcyB3aXRoIHRoaXMgZmVhdHVyZSBlbmFibGVkOgorCSAgICAkIGNwIGZpbGUgL2RvZXNfbm90X2V4aXN0L2ZpbGUKKwkgICAgY3A6IGNhbm5vdCBjcmVhdGUgJy9kb2VzX25vdF9leGlzdC9maWxlJzogUGF0aCBkb2VzIG5vdCBleGlzdAorCSAgICAkIGNwIGZpbGUgL3ZtbGludXovZmlsZQorCSAgICBjcDogY2Fubm90IHN0YXQgJy92bWxpbnV6L2ZpbGUnOiBQYXRoIGhhcyBub24tZGlyZWN0b3J5IGNvbXBvbmVudAorCSAgSWYgdGhpcyBmZWF0dXJlIGlzIG5vdCBlbmFibGVkLCB0aGV5IHdpbGwgYmUsIHJlc3BlY3RpdmVseToKKwkgICAgY3A6IGNhbm5vdCBjcmVhdGUgJy9kb2VzX25vdF9leGlzdC9maWxlJzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorCSAgICBjcDogY2Fubm90IHN0YXQgJy92bWxpbnV6L2ZpbGUnOiBOb3QgYSBkaXJlY3RvcnkKKwkgIFRoaXMgd2lsbCBjb3N0IHlvdSB+NjAgYnl0ZXMuCisKK2NvbmZpZyBGRUFUVVJFX0NPUFlCVUZfS0IKKwlpbnQgIkNvcHkgYnVmZmVyIHNpemUsIGluIGtpbG9ieXRlcyIKKwlyYW5nZSAxIDEwMjQKKwlkZWZhdWx0IDQKKwloZWxwCisJICBTaXplIG9mIGJ1ZmZlciB1c2VkIGJ5IGNwLCBtdiwgaW5zdGFsbCwgd2dldCBldGMuCisJICBCdWZmZXJzIHdoaWNoIGFyZSA0IGtiIG9yIGxlc3Mgd2lsbCBiZSBhbGxvY2F0ZWQgb24gc3RhY2suCisJICBCaWdnZXIgYnVmZmVycyB3aWxsIGJlIGFsbG9jYXRlZCB3aXRoIG1tYXAsIHdpdGggZmFsbGJhY2sgdG8gNCBrYgorCSAgc3RhY2sgYnVmZmVyIGlmIG1tYXAgZmFpbHMuCisKK2NvbmZpZyBGRUFUVVJFX1NLSVBfUk9PVEZTCisJYm9vbCAiU2tpcCByb290ZnMgaW4gbW91bnQgdGFibGUiCisJZGVmYXVsdCB5CisJaGVscAorCSAgSWdub3JlIHJvb3RmcyBlbnRyeSBpbiBtb3VudCB0YWJsZS4KKworCSAgSW4gTGludXgsIGtlcm5lbCBoYXMgYSBzcGVjaWFsIGZpbGVzeXN0ZW0sIHJvb3Rmcywgd2hpY2ggaXMgaW5pdGlhbGx5CisJICBtb3VudGVkIG9uIC8uIEl0IGNvbnRhaW5zIGluaXRyYW1mcyBkYXRhLCBpZiBrZXJuZWwgaXMgY29uZmlndXJlZAorCSAgdG8gaGF2ZSBvbmUuIFVzdWFsbHksIGFub3RoZXIgZmlsZSBzeXN0ZW0gaXMgbW91bnRlZCBvdmVyIC8gZWFybHkKKwkgIGluIGJvb3QgcHJvY2VzcywgYW5kIHRoZXJlZm9yZSBtb3N0IHRvb2xzIHdoaWNoIG1hbmlwdWxhdGUKKwkgIG1vdW50IHRhYmxlLCBzdWNoIGFzIGRmLCB3aWxsIHNraXAgcm9vdGZzIGVudHJ5LgorCisJICBIb3dldmVyLCBzb21lIHN5c3RlbXMgZG8gbm90IG1vdW50IGFueXRoaW5nIG9uIC8uCisJICBJZiB5b3UgbmVlZCB0byBjb25maWd1cmUgYnVzeWJveCBmb3Igb25lIG9mIHRoZXNlIHN5c3RlbXMsCisJICB5b3UgbWF5IGZpbmQgaXQgdXNlZnVsIHRvIHR1cm4gdGhpcyBvcHRpb24gb2ZmIHRvIG1ha2UgZGYgc2hvdworCSAgaW5pdHJhbWZzIHN0YXRpc3RpY3MuCisKKwkgIE90aGVyd2lzZSwgY2hvb3NlIFkuCisKK2NvbmZpZyBNT05PVE9OSUNfU1lTQ0FMTAorCWJvb2wgIlVzZSBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQykgc3lzY2FsbCIKKwlkZWZhdWx0IG4KKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBVc2UgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMpIHN5c2NhbGwgZm9yIG1lYXN1cmluZworCSAgdGltZSBpbnRlcnZhbHMgKHRpbWUsIHBpbmcsIHRyYWNlcm91dGUgZXRjIG5lZWQgdGhpcykuCisJICBQcm9iYWJseSByZXF1aXJlcyBMaW51eCAyLjYrLiBJZiBub3Qgc2VsZWN0ZWQsIGdldHRpbWVvZmRheQorCSAgd2lsbCBiZSB1c2VkIGluc3RlYWQgKHdoaWNoIGdpdmVzIHdyb25nIHJlc3VsdHMgaWYgZGF0ZS90aW1lCisJICBpcyByZXNldCkuCisKK2NvbmZpZyBJT0NUTF9IRVgyU1RSX0VSUk9SCisJYm9vbCAiVXNlIGlvY3RsIG5hbWVzIHJhdGhlciB0aGFuIGhleCB2YWx1ZXMgaW4gZXJyb3IgbWVzc2FnZXMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVXNlIGlvY3RsIG5hbWVzIHJhdGhlciB0aGFuIGhleCB2YWx1ZXMgaW4gZXJyb3IgbWVzc2FnZXMKKwkgIChlLmcuIFZUX0RJU0FMTE9DQVRFIHJhdGhlciB0aGFuIDB4NTYwOCkuIElmIGRpc2FibGVkIHRoaXMKKwkgIHNhdmVzIGFib3V0IDE0MDAgYnl0ZXMuCisKK2NvbmZpZyBGRUFUVVJFX0hXSUIKKwlib29sICJTdXBwb3J0IGluZmluaWJhbmQgSFciCisJZGVmYXVsdCB5CisJaGVscAorCSAgU3VwcG9ydCBmb3IgcHJpbnRpbmcgaW5maW5pYmFuZCBhZGRyZXNzZXMgaW4KKwkgIG5ldHdvcmsgYXBwbGV0cy4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvbGliYmIvS2J1aWxkLnNyYyBiL2xpYmJiL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiNjg3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL0tidWlsZC5zcmMKQEAgLTAsMCArMSwxOTMgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitsaWJiYi9hcHBsZXRsaWIubzogaW5jbHVkZS91c2FnZV9jb21wcmVzc2VkLmgKKworbGliLXk6PQorCitJTlNFUlQKKworbGliLXkgKz0gYXBwbGV0bGliLm8KK2xpYi15ICs9IGFza19jb25maXJtYXRpb24ubworbGliLXkgKz0gYmJfYXNrcGFzcy5vCitsaWIteSArPSBiYl9ic3dhcF82NC5vCitsaWIteSArPSBiYl9kb19kZWxheS5vCitsaWIteSArPSBiYl9wd2QubworbGliLXkgKz0gYmJfcXNvcnQubworI2xpYi15ICs9IGJiX3N0cnRvZC5vCitsaWIteSArPSBiYl9zdHJ0b251bS5vCitsaWIteSArPSBjaGFuZ2VfaWRlbnRpdHkubworbGliLXkgKz0gY2hvbXAubworbGliLXkgKz0gY29tcGFyZV9zdHJpbmdfYXJyYXkubworbGliLXkgKz0gY29uY2F0X3BhdGhfZmlsZS5vCitsaWIteSArPSBjb25jYXRfc3VicGF0aF9maWxlLm8KK2xpYi15ICs9IGNvcHlfZmlsZS5vCitsaWIteSArPSBjb3B5ZmQubworbGliLXkgKz0gY3JjMzIubworbGliLXkgKz0gZGVmYXVsdF9lcnJvcl9yZXR2YWwubworbGliLXkgKz0gZGV2aWNlX29wZW4ubworbGliLXkgKz0gZHVtcC5vCitsaWIteSArPSBleGVjdXRhYmxlLm8KK2xpYi15ICs9IGZjbG9zZV9ub25zdGRpbi5vCitsaWIteSArPSBmZmx1c2hfc3Rkb3V0X2FuZF9leGl0Lm8KK2xpYi15ICs9IGZnZXRzX3N0ci5vCitsaWIteSArPSBmaW5kX3BpZF9ieV9uYW1lLm8KK2xpYi15ICs9IGZpbmRfcm9vdF9kZXZpY2UubworbGliLXkgKz0gZnVsbF93cml0ZS5vCitsaWIteSArPSBnZXRfY29uc29sZS5vCitsaWIteSArPSBnZXRfbGFzdF9wYXRoX2NvbXBvbmVudC5vCitsaWIteSArPSBnZXRfbGluZV9mcm9tX2ZpbGUubworbGliLXkgKz0gZ2V0b3B0MzIubworbGliLXkgKz0gZ2V0cHR5Lm8KK2xpYi15ICs9IGdldF92b2xzaXplLm8KK2xpYi15ICs9IGhlcnJvcl9tc2cubworbGliLXkgKz0gaHVtYW5fcmVhZGFibGUubworbGliLXkgKz0gaW5ldF9jb21tb24ubworbGliLXkgKz0gaW5mb19tc2cubworbGliLXkgKz0gaW5vZGVfaGFzaC5vCitsaWIteSArPSBpc2RpcmVjdG9yeS5vCitsaWIteSArPSBrZXJuZWxfdmVyc2lvbi5vCitsaWIteSArPSBsYXN0X2NoYXJfaXMubworbGliLXkgKz0gbGluZWVkaXQubyBsaW5lZWRpdF9wdHJfaGFjay5vCitsaWIteSArPSBsbGlzdC5vCitsaWIteSArPSBsb2dpbi5vCitsaWIteSArPSBtYWtlX2RpcmVjdG9yeS5vCitsaWIteSArPSBtYWtlZGV2Lm8KK2xpYi15ICs9IGhhc2hfbWQ1X3NoYS5vCisjIEFsdGVybmF0aXZlIChkaXNhYmxlZCkgTUQ1IGltcGxlbWVudGF0aW9uCisjbGliLXkgKz0gaGFzaF9tZDVwcmltZS5vCitsaWIteSArPSBtZXNzYWdlcy5vCitsaWIteSArPSBtb2RlX3N0cmluZy5vCitsaWIteSArPSBwYXJzZV9tb2RlLm8KK2xpYi15ICs9IHBlcnJvcl9tc2cubworbGliLXkgKz0gcGVycm9yX25vbXNnLm8KK2xpYi15ICs9IHBlcnJvcl9ub21zZ19hbmRfZGllLm8KK2xpYi15ICs9IHBpZGZpbGUubworbGliLXkgKz0gcGxhdGZvcm0ubworbGliLXkgKz0gcHJpbnRhYmxlLm8KK2xpYi15ICs9IHByaW50YWJsZV9zdHJpbmcubworbGliLXkgKz0gcHJpbnRfZmxhZ3MubworbGliLXkgKz0gcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UubworbGliLXkgKz0gcHJvY3BzLm8KK2xpYi15ICs9IHByb2dyZXNzLm8KK2xpYi15ICs9IHB0cl90b19nbG9iYWxzLm8KK2xpYi15ICs9IHJlYWQubworbGliLXkgKz0gcmVhZF9wcmludGYubworbGliLXkgKz0gcmVhZF9rZXkubworbGliLXkgKz0gcmVjdXJzaXZlX2FjdGlvbi5vCitsaWIteSArPSByZW1vdmVfZmlsZS5vCitsaWIteSArPSBydW5fc2hlbGwubworbGliLXkgKz0gc2FmZV9nZXRob3N0bmFtZS5vCitsaWIteSArPSBzYWZlX3BvbGwubworbGliLXkgKz0gc2FmZV9zdHJuY3B5Lm8KK2xpYi15ICs9IHNhZmVfd3JpdGUubworbGliLXkgKz0gc2V0dXBfZW52aXJvbm1lbnQubworbGliLXkgKz0gc2lnbmFscy5vCitsaWIteSArPSBzaW1wbGlmeV9wYXRoLm8KK2xpYi15ICs9IHNpbmdsZV9hcmd2Lm8KK2xpYi15ICs9IHNraXBfd2hpdGVzcGFjZS5vCitsaWIteSArPSBzcGVlZF90YWJsZS5vCitsaWIteSArPSBzdHJfdG9sb3dlci5vCitsaWIteSArPSBzdHJyc3RyLm8KK2xpYi15ICs9IHN5c2NvbmYubworbGliLXkgKz0gdGltZS5vCitsaWIteSArPSB0cmltLm8KK2xpYi15ICs9IHVfc2lnbmFsX25hbWVzLm8KK2xpYi15ICs9IHV1ZW5jb2RlLm8KK2xpYi15ICs9IHZkcHJpbnRmLm8KK2xpYi15ICs9IHZlcnJvcl9tc2cubworbGliLXkgKz0gdmZvcmtfZGFlbW9uX3JleGVjLm8KK2xpYi15ICs9IHdhcm5faWdub3JpbmdfYXJncy5vCitsaWIteSArPSB3Zm9wZW4ubworbGliLXkgKz0gd2ZvcGVuX2lucHV0Lm8KK2xpYi15ICs9IHdyaXRlLm8KK2xpYi15ICs9IHhhdG9udW0ubworbGliLXkgKz0geGNvbm5lY3QubworbGliLXkgKz0geGZ1bmNzLm8KK2xpYi15ICs9IHhmdW5jc19wcmludGYubworbGliLXkgKz0geGZ1bmNfZGllLm8KK2xpYi15ICs9IHhnZXRjd2QubworbGliLXkgKz0geGdldGhvc3RieW5hbWUubworbGliLXkgKz0geHJlYWRsaW5rLm8KK2xpYi15ICs9IHhyZWFsbG9jX3ZlY3Rvci5vCisKK2xpYi0kKENPTkZJR19QTEFURk9STV9MSU5VWCkgKz0gbWF0Y2hfZnN0eXBlLm8KKworbGliLSQoQ09ORklHX0ZFQVRVUkVfVVRNUCkgKz0gdXRtcC5vCisKKyMgQSBtaXggb2Ygb3B0aW1pemF0aW9ucyAod2h5IGJ1aWxkIHN0dWZmIHdlIGtub3cgd29uJ3QgYmUgdXNlZCkKKyMgYW5kIG9iamVjdHMgd2hpY2ggbWF5IGZhaWwgdG8gYnVpbGQgKFNFTGludXggb24gc2VsaW51eC1sZXNzIHN5c3RlbSkKK2xpYi0kKENPTkZJR19TRUxJTlVYKSArPSBzZWxpbnV4X2NvbW1vbi5vCitsaWItJChDT05GSUdfRkVBVFVSRV9NVEFCX1NVUFBPUlQpICs9IG10YWIubworbGliLSQoQ09ORklHX1VOSUNPREVfU1VQUE9SVCkgKz0gdW5pY29kZS5vCitsaWItJChDT05GSUdfRkVBVFVSRV9DSEVDS19OQU1FUykgKz0gZGllX2lmX2JhZF91c2VybmFtZS5vCisKK2xpYi0kKENPTkZJR19OQykgKz0gdWRwX2lvLm8KK2xpYi0kKENPTkZJR19ETlNEKSArPSB1ZHBfaW8ubworbGliLSQoQ09ORklHX05UUEQpICs9IHVkcF9pby5vCitsaWItJChDT05GSUdfVEZUUCkgKz0gdWRwX2lvLm8KK2xpYi0kKENPTkZJR19URlRQRCkgKz0gdWRwX2lvLm8KK2xpYi0kKENPTkZJR19UQ1BTVkQpICs9IHVkcF9pby5vCitsaWItJChDT05GSUdfVURQU1ZEKSArPSB1ZHBfaW8ubworbGliLSQoQ09ORklHX1RSQUNFUk9VVEUpICs9IHVkcF9pby5vCisKK2xpYi0kKENPTkZJR19MT1NFVFVQKSArPSBsb29wLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX01PVU5UX0xPT1ApICs9IGxvb3AubworCitsaWItJChDT05GSUdfQURER1JPVVApICs9IHVwZGF0ZV9wYXNzd2QubworbGliLSQoQ09ORklHX0FERFVTRVIpICs9IHVwZGF0ZV9wYXNzd2QubworbGliLSQoQ09ORklHX0RFTEdST1VQKSArPSB1cGRhdGVfcGFzc3dkLm8KK2xpYi0kKENPTkZJR19ERUxVU0VSKSArPSB1cGRhdGVfcGFzc3dkLm8KKworbGliLSQoQ09ORklHX0ZUUEQpICs9IGNvcnJlY3RfcGFzc3dvcmQubworbGliLSQoQ09ORklHX1BBU1NXRCkgKz0gcHdfZW5jcnlwdC5vIHVwZGF0ZV9wYXNzd2QubyBvYnNjdXJlLm8KK2xpYi0kKENPTkZJR19DSFBBU1NXRCkgKz0gcHdfZW5jcnlwdC5vIHVwZGF0ZV9wYXNzd2QubworbGliLSQoQ09ORklHX0NSWVBUUFcpICs9IHB3X2VuY3J5cHQubworbGliLSQoQ09ORklHX1NVTE9HSU4pICs9IHB3X2VuY3J5cHQubyBjb3JyZWN0X3Bhc3N3b3JkLm8KK2xpYi0kKENPTkZJR19WTE9DSykgKz0gcHdfZW5jcnlwdC5vIGNvcnJlY3RfcGFzc3dvcmQubworbGliLSQoQ09ORklHX1NVKSArPSBwd19lbmNyeXB0Lm8gY29ycmVjdF9wYXNzd29yZC5vCitsaWItJChDT05GSUdfTE9HSU4pICs9IHB3X2VuY3J5cHQubyBjb3JyZWN0X3Bhc3N3b3JkLm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1KSArPSBwd19lbmNyeXB0Lm8KK2xpYi0kKENPTkZJR19GRUFUVVJFX0ZUUF9BVVRIRU5USUNBVElPTikgKz0gcHdfZW5jcnlwdC5vCisKK2xpYi0kKENPTkZJR19ERikgKz0gZmluZF9tb3VudF9wb2ludC5vCitsaWItJChDT05GSUdfTUtGU19NSU5JWCkgKz0gZmluZF9tb3VudF9wb2ludC5vCitsaWItJChDT05GSUdfTUtGU19FWFQyKSArPSBmaW5kX21vdW50X3BvaW50Lm8KK2xpYi0kKENPTkZJR19NS0ZTX1JFSVNFUikgKz0gZmluZF9tb3VudF9wb2ludC5vCitsaWItJChDT05GSUdfRlNDS19NSU5JWCkgKz0gZmluZF9tb3VudF9wb2ludC5vCitsaWItJChDT05GSUdfTU9VTlQpICs9IGZpbmRfbW91bnRfcG9pbnQubworCitsaWItJChDT05GSUdfSFdDTE9DSykgKz0gcnRjLm8KK2xpYi0kKENPTkZJR19SVENXQUtFKSArPSBydGMubworCitsaWItJChDT05GSUdfSU9TVEFUKSArPSBnZXRfY3B1X2NvdW50Lm8KK2xpYi0kKENPTkZJR19NUFNUQVQpICs9IGdldF9jcHVfY291bnQubworbGliLSQoQ09ORklHX1BPV0VSVE9QKSArPSBnZXRfY3B1X2NvdW50Lm8KKworbGliLSQoQ09ORklHX1BJTkcpICs9IGluZXRfY2tzdW0ubworbGliLSQoQ09ORklHX1RSQUNFUk9VVEUpICs9IGluZXRfY2tzdW0ubworbGliLSQoQ09ORklHX1RSQUNFUk9VVEU2KSArPSBpbmV0X2Nrc3VtLm8KK2xpYi0kKENPTkZJR19VREhDUEMpICs9IGluZXRfY2tzdW0ubworbGliLSQoQ09ORklHX1VESENQQzYpICs9IGluZXRfY2tzdW0ubworbGliLSQoQ09ORklHX1VESENQRCkgKz0gaW5ldF9ja3N1bS5vCisKKyMgV2Ugc2hvdWxkbid0IGJ1aWxkIHhyZWdjb21wLmMgaWYgd2UgZG9uJ3QgbmVlZCBpdCAtIHRoaXMgZW5zdXJlcyB3ZSBkb24ndAorIyByZXF1aXJlIHJlZ2V4LmggdG8gYmUgaW4gdGhlIGluY2x1ZGUgZGlyIGV2ZW4gaWYgd2UgZG9uJ3QgbmVlZCBpdCB0aGVyZWJ5CisjIGFsbG93aW5nIHVzIHRvIGJ1aWxkIGJ1c3lib3ggZXZlbiBpZiB1Y2xpYmMgcmVnZXggc3VwcG9ydCBpcyBkaXNhYmxlZC4KKworbGliLSQoQ09ORklHX0FXSykgKz0geHJlZ2NvbXAubworbGliLSQoQ09ORklHX1NFRCkgKz0geHJlZ2NvbXAubworbGliLSQoQ09ORklHX0dSRVApICs9IHhyZWdjb21wLm8KK2xpYi0kKENPTkZJR19FWFBSKSArPSB4cmVnY29tcC5vCitsaWItJChDT05GSUdfTURFVikgKz0geHJlZ2NvbXAubworbGliLSQoQ09ORklHX0xFU1MpICs9IHhyZWdjb21wLm8KK2xpYi0kKENPTkZJR19QR1JFUCkgKz0geHJlZ2NvbXAubworbGliLSQoQ09ORklHX1BLSUxMKSArPSB4cmVnY29tcC5vCitsaWItJChDT05GSUdfREVWRlNEKSArPSB4cmVnY29tcC5vCitsaWItJChDT05GSUdfRkVBVFVSRV9GSU5EX1JFR0VYKSArPSB4cmVnY29tcC5vCisKKyMgQWRkIHRoZSBleHBlcmltZW50YWwgbG9nZ2luZyBmdW5jdGlvbmFsaXR5LCBvbmx5IHVzZWQgYnkgemNpcAorbGliLSQoQ09ORklHX1pDSVApICs9IGxvZ2Vudi5vCmRpZmYgLS1naXQgYS9saWJiYi9SRUFETUUgYi9saWJiYi9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU2M2RjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL1JFQURNRQpAQCAtMCwwICsxLDEwIEBACitQbGVhc2Ugc2VlIHRoZSBMSUNFTlNFIGZpbGUgZm9yIGNvcHlyaWdodCBpbmZvcm1hdGlvbiAoR1BMdjIpCisKK2xpYmJiIGlzIEJ1c3lCb3gncyB1dGlsaXR5IGxpYnJhcnkuICBBbGwgb2YgdGhpcyBzdHVmZiB1c2VkIHRvIGJlIHN0dWZmZWQgaW50bworYSBzaW5nbGUgZmlsZSBuYW1lZCB1dGlsaXR5LmMuICBXaGVuIEkgc3BsaXQgdXRpbGl0eS5jIHRvIGNyZWF0ZSBsaWJiYiwgc29tZSBvZgordGhlIHZlcnkgb2xkZXN0IHN0dWZmIGVuZGVkIHVwIHdpdGhvdXQgdGhlaXIgb3JpZ2luYWwgY29weXJpZ2h0IGFuZCBsaWNlbnNpbmcKK2luZm9ybWF0aW9uICh3aGljaCBpcyBub3cgbG9zdCBpbiB0aGUgbWlzdHMgb2YgdGltZSkuICBJZiB5b3Ugc2VlIHNvbWV0aGluZwordGhhdCB5b3Ugd3JvdGUgdGhhdCBpcyBtaXMtYXR0cmlidXRlZCwgZG8gbGV0IG1lIGtub3cgc28gd2UgY2FuIGZpeCB0aGF0IHVwLgorCisJRXJpayBBbmRlcnNlbgorCTxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CmRpZmYgLS1naXQgYS9saWJiYi9hcHBsZXRsaWIuYyBiL2xpYmJiL2FwcGxldGxpYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MjUzY2YKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9hcHBsZXRsaWIuYwpAQCAtMCwwICsxLDg0NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIHRvbnMgb2YgZm9sa3MuICBUcmFja2luZyBkb3duIHdobyB3cm90ZSB3aGF0CisgKiBpc24ndCBzb21ldGhpbmcgSSdtIGdvaW5nIHRvIHdvcnJ5IGFib3V0Li4uICBJZiB5b3Ugd3JvdGUgc29tZXRoaW5nCisgKiBoZXJlLCBwbGVhc2UgZmVlbCBmcmVlIHRvIGFja25vd2xlZGdlIHlvdXIgd29yay4KKyAqCisgKiBCYXNlZCBpbiBwYXJ0IG9uIGNvZGUgZnJvbSBzYXNoLCBDb3B5cmlnaHQgKGMpIDE5OTkgYnkgRGF2aWQgSS4gQmVsbAorICogUGVybWlzc2lvbiBoYXMgYmVlbiBncmFudGVkIHRvIHJlZGlzdHJpYnV0ZSB0aGlzIGNvZGUgdW5kZXIgR1BMLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogV2UgYXJlIHRyeWluZyB0byBub3QgdXNlIHByaW50ZiwgdGhpcyBiZW5lZml0cyB0aGUgY2FzZSB3aGVuIHNlbGVjdGVkCisgKiBhcHBsZXRzIGFyZSByZWFsbHkgc2ltcGxlLiBFeGFtcGxlOgorICoKKyAqICQgLi9idXN5Ym94CisgKiAuLi4KKyAqIEN1cnJlbnRseSBkZWZpbmVkIGZ1bmN0aW9uczoKKyAqICAgICAgICAgYmFzZW5hbWUsIGZhbHNlLCB0cnVlCisgKgorICogJCBzaXplIGJ1c3lib3gKKyAqICAgIHRleHQgICAgZGF0YSAgICAgYnNzICAgICBkZWMgICAgIGhleCBmaWxlbmFtZQorICogICAgNDQ3MyAgICAgIDUyICAgICAgNzIgICAgNDU5NyAgICAxMWY1IGJ1c3lib3gKKyAqCisgKiBGRUFUVVJFX0lOU1RBTExFUiBvciBGRUFUVVJFX1NVSUQgd2lsbCBzdGlsbCBsaW5rIHByaW50ZiByb3V0aW5lcyBpbi4gOigKKyAqLworI2luY2x1ZGUgImJ1c3lib3guaCIKKworI2lmICEoZGVmaW5lZChfX0ZyZWVCU0RfXykgfHwgZGVmaW5lZChfX09wZW5CU0RfXykgfHwgZGVmaW5lZChfX05ldEJTRF9fKSBcCisgICAgfHwgZGVmaW5lZChfX0FQUExFX18pIFwKKyAgICApCisjIGluY2x1ZGUgPG1hbGxvYy5oPiAvKiBmb3IgbWFsbG9wdCAqLworI2VuZGlmCisKKworLyogRGVjbGFyZSA8YXBwbGV0Pl9tYWluKCkgKi8KKyNkZWZpbmUgUFJPVE9UWVBFUworI2luY2x1ZGUgImFwcGxldHMuaCIKKyN1bmRlZiBQUk9UT1RZUEVTCisKKy8qIEluY2x1ZGUgZ2VuZXJhdGVkIGFwcGxldCBuYW1lcywgcG9pbnRlcnMgdG8gPGFwcGxldD5fbWFpbiwgZXRjICovCisjaW5jbHVkZSAiYXBwbGV0X3RhYmxlcy5oIgorLyogLi4uYW5kIGlmIGFwcGxldF90YWJsZXMgZ2VuZXJhdG9yIHNheXMgd2UgaGF2ZSBvbmx5IG9uZSBhcHBsZXQuLi4gKi8KKyNpZmRlZiBTSU5HTEVfQVBQTEVUX01BSU4KKyMgdW5kZWYgRU5BQkxFX0ZFQVRVUkVfSU5ESVZJRFVBTAorIyBkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfSU5ESVZJRFVBTCAxCisjIHVuZGVmIElGX0ZFQVRVUkVfSU5ESVZJRFVBTAorIyBkZWZpbmUgSUZfRkVBVFVSRV9JTkRJVklEVUFMKC4uLikgX19WQV9BUkdTX18KKyNlbmRpZgorCisjaW5jbHVkZSAidXNhZ2VfY29tcHJlc3NlZC5oIgorCisKKyNpZiBFTkFCTEVfU0hPV19VU0FHRSAmJiAhRU5BQkxFX0ZFQVRVUkVfQ09NUFJFU1NfVVNBR0UKK3N0YXRpYyBjb25zdCBjaGFyIHVzYWdlX21lc3NhZ2VzW10gQUxJR04xID0gVU5QQUNLRURfVVNBR0U7CisjZWxzZQorIyBkZWZpbmUgdXNhZ2VfbWVzc2FnZXMgMAorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9DT01QUkVTU19VU0FHRQorCitzdGF0aWMgY29uc3QgY2hhciBwYWNrZWRfdXNhZ2VbXSBBTElHTjEgPSB7IFBBQ0tFRF9VU0FHRSB9OworIyBpbmNsdWRlICJiYl9hcmNoaXZlLmgiCitzdGF0aWMgY29uc3QgY2hhciAqdW5wYWNrX3VzYWdlX21lc3NhZ2VzKHZvaWQpCit7CisJY2hhciAqb3V0YnVmID0gTlVMTDsKKwlidW56aXBfZGF0YSAqYmQ7CisJaW50IGk7CisKKwlpID0gc3RhcnRfYnVuemlwKCZiZCwKKwkJCS8qIHNyY19mZDogKi8gLTEsCisJCQkvKiBpbmJ1ZjogICovIHBhY2tlZF91c2FnZSwKKwkJCS8qIGxlbjogICAgKi8gc2l6ZW9mKHBhY2tlZF91c2FnZSkpOworCS8qIHJlYWRfYnVuemlwIGNhbiBsb25nam1wIHRvIHN0YXJ0X2J1bnppcCwgYW5kIHVsdGltYXRlbHkKKwkgKiBlbmQgdXAgaGVyZSB3aXRoIGkgIT0gMCBvbiByZWFkIGRhdGEgZXJyb3JzISBOb3QgdHJpdmlhbCAqLworCWlmICghaSkgeworCQkvKiBDYW5ub3QgdXNlIHhtYWxsb2M6IHdpbGwgbGVhayBiZCBpbiBOT0ZPUksgY2FzZSEgKi8KKwkJb3V0YnVmID0gbWFsbG9jX29yX3dhcm4oc2l6ZW9mKFVOUEFDS0VEX1VTQUdFKSk7CisJCWlmIChvdXRidWYpCisJCQlyZWFkX2J1bnppcChiZCwgb3V0YnVmLCBzaXplb2YoVU5QQUNLRURfVVNBR0UpKTsKKwl9CisJZGVhbGxvY19idW56aXAoYmQpOworCXJldHVybiBvdXRidWY7Cit9CisjIGRlZmluZSBkZWFsbG9jX3VzYWdlX21lc3NhZ2VzKHMpIGZyZWUocykKKworI2Vsc2UKKworIyBkZWZpbmUgdW5wYWNrX3VzYWdlX21lc3NhZ2VzKCkgdXNhZ2VfbWVzc2FnZXMKKyMgZGVmaW5lIGRlYWxsb2NfdXNhZ2VfbWVzc2FnZXMocykgKCh2b2lkKShzKSkKKworI2VuZGlmIC8qIEZFQVRVUkVfQ09NUFJFU1NfVVNBR0UgKi8KKworCit2b2lkIEZBU1RfRlVOQyBiYl9zaG93X3VzYWdlKHZvaWQpCit7CisJaWYgKEVOQUJMRV9TSE9XX1VTQUdFKSB7CisjaWZkZWYgU0lOR0xFX0FQUExFVF9TVFIKKwkJLyogSW1hZ2luZSB0aGF0IHRoaXMgYXBwbGV0IGlzICJ0cnVlIi4gRG9udCBzdWNrIGluIHByaW50ZiEgKi8KKwkJY29uc3QgY2hhciAqdXNhZ2Vfc3RyaW5nID0gdW5wYWNrX3VzYWdlX21lc3NhZ2VzKCk7CisKKwkJaWYgKCp1c2FnZV9zdHJpbmcgPT0gJ1xiJykgeworCQkJZnVsbF93cml0ZTJfc3RyKCJObyBoZWxwIGF2YWlsYWJsZS5cblxuIik7CisJCX0gZWxzZSB7CisJCQlmdWxsX3dyaXRlMl9zdHIoIlVzYWdlOiAiU0lOR0xFX0FQUExFVF9TVFIiICIpOworCQkJZnVsbF93cml0ZTJfc3RyKHVzYWdlX3N0cmluZyk7CisJCQlmdWxsX3dyaXRlMl9zdHIoIlxuXG4iKTsKKwkJfQorCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQlkZWFsbG9jX3VzYWdlX21lc3NhZ2VzKChjaGFyKil1c2FnZV9zdHJpbmcpOworI2Vsc2UKKwkJY29uc3QgY2hhciAqcDsKKwkJY29uc3QgY2hhciAqdXNhZ2Vfc3RyaW5nID0gcCA9IHVucGFja191c2FnZV9tZXNzYWdlcygpOworCQlpbnQgYXAgPSBmaW5kX2FwcGxldF9ieV9uYW1lKGFwcGxldF9uYW1lKTsKKworCQlpZiAoYXAgPCAwKSAvKiBuZXZlciBoYXBwZW5zLCBwYXJhbm9pYSAqLworCQkJeGZ1bmNfZGllKCk7CisJCXdoaWxlIChhcCkgeworCQkJd2hpbGUgKCpwKyspIGNvbnRpbnVlOworCQkJYXAtLTsKKwkJfQorCQlmdWxsX3dyaXRlMl9zdHIoYmJfYmFubmVyKTsKKwkJZnVsbF93cml0ZTJfc3RyKCIgbXVsdGktY2FsbCBiaW5hcnkuXG4iKTsKKwkJaWYgKCpwID09ICdcYicpCisJCQlmdWxsX3dyaXRlMl9zdHIoIlxuTm8gaGVscCBhdmFpbGFibGUuXG5cbiIpOworCQllbHNlIHsKKwkJCWZ1bGxfd3JpdGUyX3N0cigiXG5Vc2FnZTogIik7CisJCQlmdWxsX3dyaXRlMl9zdHIoYXBwbGV0X25hbWUpOworCQkJZnVsbF93cml0ZTJfc3RyKCIgIik7CisJCQlmdWxsX3dyaXRlMl9zdHIocCk7CisJCQlmdWxsX3dyaXRlMl9zdHIoIlxuIik7CisJCX0KKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZGVhbGxvY191c2FnZV9tZXNzYWdlcygoY2hhciopdXNhZ2Vfc3RyaW5nKTsKKyNlbmRpZgorCX0KKwl4ZnVuY19kaWUoKTsKK30KKworI2lmIE5VTV9BUFBMRVRTID4gOAorc3RhdGljIGludCBhcHBsZXRfbmFtZV9jb21wYXJlKGNvbnN0IHZvaWQgKm5hbWUsIGNvbnN0IHZvaWQgKmlkeCkKK3sKKwlpbnQgaSA9IChpbnQpKHB0cmRpZmZfdClpZHggLSAxOworCXJldHVybiBzdHJjbXAobmFtZSwgQVBQTEVUX05BTUUoaSkpOworfQorI2VuZGlmCitpbnQgRkFTVF9GVU5DIGZpbmRfYXBwbGV0X2J5X25hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKyNpZiBOVU1fQVBQTEVUUyA+IDgKKwkvKiBEbyBhIGJpbmFyeSBzZWFyY2ggdG8gZmluZCB0aGUgYXBwbGV0IGVudHJ5IGdpdmVuIHRoZSBuYW1lLiAqLworCWNvbnN0IGNoYXIgKnA7CisJcCA9IGJzZWFyY2gobmFtZSwgKHZvaWQqKShwdHJkaWZmX3QpMSwgQVJSQVlfU0laRShhcHBsZXRfbWFpbiksIDEsIGFwcGxldF9uYW1lX2NvbXBhcmUpOworCS8qCisJICogaWYgKCFwKSByZXR1cm4gLTE7CisJICogXl5eXl5eXl5eXl5eXl5eXl5eIHRoZSBjb2RlIGJlbG93IHdpbGwgZG8gdGhpcyBpZiBwID09IE5VTEwgOikKKwkgKi8KKwlyZXR1cm4gKGludCkocHRyZGlmZl90KXAgLSAxOworI2Vsc2UKKwkvKiBBIHZlcnNpb24gd2hpY2ggZG9lcyBub3QgcHVsbCBpbiBic2VhcmNoICovCisJaW50IGkgPSAwOworCWNvbnN0IGNoYXIgKnAgPSBhcHBsZXRfbmFtZXM7CisJd2hpbGUgKGkgPCBOVU1fQVBQTEVUUykgeworCQlpZiAoc3RyY21wKG5hbWUsIHApID09IDApCisJCQlyZXR1cm4gaTsKKwkJcCArPSBzdHJsZW4ocCkgKyAxOworCQlpKys7CisJfQorCXJldHVybiAtMTsKKyNlbmRpZgorfQorCisKK3ZvaWQgbGJiX3ByZXBhcmUoY29uc3QgY2hhciAqYXBwbGV0CisJCUlGX0ZFQVRVUkVfSU5ESVZJRFVBTCgsIGNoYXIgKiphcmd2KSkKKwkJCQlNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK3ZvaWQgbGJiX3ByZXBhcmUoY29uc3QgY2hhciAqYXBwbGV0CisJCUlGX0ZFQVRVUkVfSU5ESVZJRFVBTCgsIGNoYXIgKiphcmd2KSkKK3sKKyNpZmRlZiBfX0dMSUJDX18KKwkoKihpbnQgKiopJmJiX2Vycm5vKSA9IF9fZXJybm9fbG9jYXRpb24oKTsKKwliYXJyaWVyKCk7CisjZW5kaWYKKwlhcHBsZXRfbmFtZSA9IGFwcGxldDsKKworCWlmIChFTkFCTEVfTE9DQUxFX1NVUFBPUlQpCisJCXNldGxvY2FsZShMQ19BTEwsICIiKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lORElWSURVQUwKKwkvKiBSZWR1bmRhbnQgZm9yIGJ1c3lib3ggKHJ1bl9hcHBsZXRfYW5kX2V4aXQgY292ZXJzIHRoYXQgY2FzZSkKKwkgKiBidXQgbmVlZGVkIGZvciAiaW5kaXZpZHVhbCBhcHBsZXQiIG1vZGUgKi8KKwlpZiAoYXJndlsxXQorCSAmJiAhYXJndlsyXQorCSAmJiBzdHJjbXAoYXJndlsxXSwgIi0taGVscCIpID09IDAKKwkgJiYgIWlzX3ByZWZpeGVkX3dpdGgoYXBwbGV0LCAiYnVzeWJveCIpCisJKSB7CisJCS8qIFNwZWNpYWwgY2FzZS4gUE9TSVggc2F5cyAidGVzdCAtLWhlbHAiCisJCSAqIHNob3VsZCBiZSBubyBkaWZmZXJlbnQgZnJvbSBlLmcuICJ0ZXN0IC0tZm9vIi4gICovCisJCWlmICghRU5BQkxFX1RFU1QgfHwgc3RyY21wKGFwcGxldF9uYW1lLCAidGVzdCIpICE9IDApCisJCQliYl9zaG93X3VzYWdlKCk7CisJfQorI2VuZGlmCit9CisKKy8qIFRoZSBjb2RlIGJlbG93IGNhbiB3ZWxsIGJlIGluIGFwcGxldHMvYXBwbGV0cy5jLCBhcyBpdCBpcyB1c2VkIG9ubHkKKyAqIGZvciBidXN5Ym94IGJpbmFyeSwgbm90ICJpbmRpdmlkdWFsIiBiaW5hcmllcy4KKyAqIEhvd2V2ZXIsIGtlZXBpbmcgaXQgaGVyZSBhbmQgbGlua2luZyBpdCBpbnRvIGxpYmJ1c3lib3guc28KKyAqICh0b2dldGhlciB3aXRoIHJlbWFpbmluZyB0aW55IGFwcGxldHMvYXBwbGV0cy5vKQorICogbWFrZXMgaXQgcG9zc2libGUgdG8gYXZvaWQgLS13aG9sZS1hcmNoaXZlIGF0IGxpbmsgdGltZS4KKyAqIFRoaXMgbWFrZXMgKHNoYXJlZCBidXN5Ym94KSArIGxpYmJ1c3lib3ggc21hbGxlci4KKyAqICgtLWdjLXNlY3Rpb25zIHdvdWxkIGJlIGV2ZW4gYmV0dGVyLi4uLikKKyAqLworCitjb25zdCBjaGFyICphcHBsZXRfbmFtZTsKKyNpZiAhQkJfTU1VCitib29sIHJlX2V4ZWNlZDsKKyNlbmRpZgorCisKKy8qIElmIG5vdCBidWlsdCBhcyBhIHNpbmdsZS1hcHBsZXQgZXhlY3V0YWJsZS4uLiAqLworI2lmICFkZWZpbmVkKFNJTkdMRV9BUFBMRVRfTUFJTikKKworSUZfRkVBVFVSRV9TVUlEKHN0YXRpYyB1aWRfdCBydWlkOykgIC8qIHJlYWwgdWlkICovCisKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfU1VJRF9DT05GSUcKKworc3RhdGljIHN0cnVjdCBzdWlkX2NvbmZpZ190IHsKKwkvKiBuZXh0IHB0ciBtdXN0IGJlIGZpcnN0OiB0aGlzIHN0cnVjdCBuZWVkcyB0byBiZSBsbGlzdC1jb21wYXRpYmxlICovCisJc3RydWN0IHN1aWRfY29uZmlnX3QgKm1fbmV4dDsKKwlzdHJ1Y3QgYmJfdWlkZ2lkX3QgbV91Z2lkOworCWludCBtX2FwcGxldDsKKwltb2RlX3QgbV9tb2RlOworfSAqc3VpZF9jb25maWc7CisKK3N0YXRpYyBib29sIHN1aWRfY2ZnX3JlYWRhYmxlOworCisvKiBjaGVjayBpZiB1IGlzIG1lbWJlciBvZiBncm91cCBnICovCitzdGF0aWMgaW50IGluZ3JvdXAodWlkX3QgdSwgZ2lkX3QgZykKK3sKKwlzdHJ1Y3QgZ3JvdXAgKmdycCA9IGdldGdyZ2lkKGcpOworCWlmIChncnApIHsKKwkJY2hhciAqKm1lbTsKKwkJZm9yIChtZW0gPSBncnAtPmdyX21lbTsgKm1lbTsgbWVtKyspIHsKKwkJCXN0cnVjdCBwYXNzd2QgKnB3ZCA9IGdldHB3bmFtKCptZW0pOworCQkJaWYgKHB3ZCAmJiAocHdkLT5wd191aWQgPT0gdSkpCisJCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGxpYmJiIGNhbmRpZGF0ZSAqLworc3RhdGljIGNoYXIgKmdldF90cmltbWVkX3NsaWNlKGNoYXIgKnMsIGNoYXIgKmUpCit7CisJLyogRmlyc3QsIGNvbnNpZGVyIHRoZSB2YWx1ZSBhdCBlIHRvIGJlIG51bCBhbmQgYmFjayB1cCB1bnRpbCB3ZQorCSAqIHJlYWNoIGEgbm9uLXNwYWNlIGNoYXIuICBTZXQgdGhlIGNoYXIgYWZ0ZXIgdGhhdCAocG9zc2libHkgYXQKKwkgKiB0aGUgb3JpZ2luYWwgZSkgdG8gbnVsLiAqLworCXdoaWxlIChlLS0gPiBzKSB7CisJCWlmICghaXNzcGFjZSgqZSkpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCWVbMV0gPSAnXDAnOworCisJLyogTmV4dCwgYWR2YW5jZSBwYXN0IGFsbCBsZWFkaW5nIHNwYWNlIGFuZCByZXR1cm4gYSBwdHIgdG8gdGhlCisJICogZmlyc3Qgbm9uLXNwYWNlIGNoYXI7IHBvc3NpYmx5IHRoZSB0ZXJtaW5hdGluZyBudWwuICovCisJcmV0dXJuIHNraXBfd2hpdGVzcGFjZShzKTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfY29uZmlnX2ZpbGUodm9pZCkKK3sKKwkvKiBEb24ndCBkZXBlbmQgb24gdGhlIHRvb2xzIHRvIGNvbWJpbmUgc3RyaW5ncy4gKi8KKwlzdGF0aWMgY29uc3QgY2hhciBjb25maWdfZmlsZVtdIEFMSUdOMSA9ICIvZXRjL2J1c3lib3guY29uZiI7CisKKwlzdHJ1Y3Qgc3VpZF9jb25maWdfdCAqc2N0X2hlYWQ7CisJaW50IGFwcGxldF9ubzsKKwlGSUxFICpmOworCWNvbnN0IGNoYXIgKmVycm1zZzsKKwl1bnNpZ25lZCBsYzsKKwlzbWFsbGludCBzZWN0aW9uOworCXN0cnVjdCBzdGF0IHN0OworCisJcnVpZCA9IGdldHVpZCgpOworCWlmIChydWlkID09IDApIC8qIHJ1biBieSByb290IC0gZG9uJ3QgbmVlZCB0byBldmVuIHJlYWQgY29uZmlnIGZpbGUgKi8KKwkJcmV0dXJuOworCisJaWYgKChzdGF0KGNvbmZpZ19maWxlLCAmc3QpICE9IDApICAgICAgIC8qIE5vIGNvbmZpZyBmaWxlPyAqLworCSB8fCAhU19JU1JFRyhzdC5zdF9tb2RlKSAgICAgICAgICAgICAgICAvKiBOb3QgYSByZWd1bGFyIGZpbGU/ICovCisJIHx8IChzdC5zdF91aWQgIT0gMCkgICAgICAgICAgICAgICAgICAgIC8qIE5vdCBvd25lZCBieSByb290PyAqLworCSB8fCAoc3Quc3RfbW9kZSAmIChTX0lXR1JQIHwgU19JV09USCkpICAvKiBXcml0YWJsZSBieSBub24tcm9vdD8gKi8KKwkgfHwgIShmID0gZm9wZW5fZm9yX3JlYWQoY29uZmlnX2ZpbGUpKSAgLyogQ2Fubm90IG9wZW4/ICovCisJKSB7CisJCXJldHVybjsKKwl9CisKKwlzdWlkX2NmZ19yZWFkYWJsZSA9IDE7CisJc2N0X2hlYWQgPSBOVUxMOworCXNlY3Rpb24gPSBsYyA9IDA7CisKKwl3aGlsZSAoMSkgeworCQljaGFyIGJ1ZmZlclsyNTZdOworCQljaGFyICpzOworCisJCWlmICghZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgZikpIHsgLyogQXJlIHdlIGRvbmU/ICovCisJCQkvLyBMb29rcyBsaWtlIGJsb2F0CisJCQkvL2lmIChmZXJyb3IoZikpIHsgICAvKiBNYWtlIHN1cmUgaXQgd2Fzbid0IGEgcmVhZCBlcnJvci4gKi8KKwkJCS8vCWVycm1zZyA9ICJyZWFkaW5nIjsKKwkJCS8vCWdvdG8gcGVfbGFiZWw7CisJCQkvL30KKwkJCWZjbG9zZShmKTsKKwkJCXN1aWRfY29uZmlnID0gc2N0X2hlYWQ7CS8qIFN1Y2Nlc3MsIHNvIHNldCB0aGUgcG9pbnRlci4gKi8KKwkJCXJldHVybjsKKwkJfQorCisJCXMgPSBidWZmZXI7CisJCWxjKys7CQkJCQkvKiBHb3QgYSAocGFydGlhbCkgbGluZS4gKi8KKworCQkvKiBJZiBhIGxpbmUgaXMgdG9vIGxvbmcgZm9yIG91ciBidWZmZXIsIHdlIGNvbnNpZGVyIGl0IGFuIGVycm9yLgorCQkgKiBUaGUgZm9sbG93aW5nIHRlc3QgZG9lcyBtaXN0cmVhdCBvbmUgY29ybmVyIGNhc2UgdGhvdWdoLgorCQkgKiBJZiB0aGUgZmluYWwgbGluZSBvZiB0aGUgZmlsZSBkb2VzIG5vdCBlbmQgd2l0aCBhIG5ld2xpbmUgYW5kCisJCSAqIHlldCBleGFjdGx5IGZpbGxzIHRoZSBidWZmZXIsIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyB0b28gbG9uZworCQkgKiBldmVuIHRob3VnaCB0aGVyZSBpc24ndCByZWFsbHkgYSBwcm9ibGVtLiAgQnV0IGl0IGlzbid0IHJlYWxseQorCQkgKiB3b3J0aCBhZGRpbmcgY29kZSB0byBkZWFsIHdpdGggc3VjaCBhbiB1bmxpa2VseSBzaXR1YXRpb24sIGFuZAorCQkgKiB3ZSBkbyBlcnIgb24gdGhlIHNpZGUgb2YgY2F1dGlvbi4gIEJlc2lkZXMsIHRoZSBsaW5lIHdvdWxkIGJlCisJCSAqIHRvbyBsb25nIGlmIGl0IGRpZCBlbmQgd2l0aCBhIG5ld2xpbmUuICovCisJCWlmICghc3RyY2hyKHMsICdcbicpICYmICFmZW9mKGYpKSB7CisJCQllcnJtc2cgPSAibGluZSB0b28gbG9uZyI7CisJCQlnb3RvIHBlX2xhYmVsOworCQl9CisKKwkJLyogVHJpbSBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLCBpZ25vcmluZyBjb21tZW50cywgYW5kCisJCSAqIGNoZWNrIGlmIHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzIGVtcHR5LiAqLworCQlzID0gZ2V0X3RyaW1tZWRfc2xpY2Uocywgc3RyY2hybnVsKHMsICcjJykpOworCQlpZiAoISpzKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIENoZWNrIGZvciBhIHNlY3Rpb24gaGVhZGVyLiAqLworCisJCWlmICgqcyA9PSAnWycpIHsKKwkJCS8qIFVubGlrZSB0aGUgb2xkIGNvZGUsIHdlIGlnbm9yZSBsZWFkaW5nIGFuZCB0cmFpbGluZworCQkJICogd2hpdGVzcGFjZSBmb3IgdGhlIHNlY3Rpb24gbmFtZS4gIFdlIGFsc28gcmVxdWlyZSB0aGF0CisJCQkgKiB0aGVyZSBhcmUgbm8gc3RyYXkgY2hhcmFjdGVycyBhZnRlciB0aGUgY2xvc2luZyBicmFja2V0LiAqLworCQkJY2hhciAqZSA9IHN0cmNocihzLCAnXScpOworCQkJaWYgKCFlICAgLyogTWlzc2luZyByaWdodCBicmFja2V0PyAqLworCQkJIHx8IGVbMV0gLyogVHJhaWxpbmcgY2hhcmFjdGVycz8gKi8KKwkJCSB8fCAhKihzID0gZ2V0X3RyaW1tZWRfc2xpY2UocysxLCBlKSkgLyogTWlzc2luZyBuYW1lPyAqLworCQkJKSB7CisJCQkJZXJybXNnID0gInNlY3Rpb24gaGVhZGVyIjsKKwkJCQlnb3RvIHBlX2xhYmVsOworCQkJfQorCQkJLyogUmlnaHQgbm93IHdlIG9ubHkgaGF2ZSBvbmUgc2VjdGlvbiBzbyBqdXN0IGNoZWNrIGl0LgorCQkJICogSWYgbW9yZSBzZWN0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGZ1dHVyZSwgcGxlYXNlIGRvbid0CisJCQkgKiByZXNvcnQgdG8gY2FzY2FkaW5nIGlmcyB3aXRoIG11bHRpcGxlIHN0cmNhc2VjbXAgY2FsbHMuCisJCQkgKiBUaGF0IGtpbmQgb2YgYmxvYXRlZCBjb2RlIGlzIGFsbCB0b28gY29tbW9uLiAgQSBsb29wCisJCQkgKiBhbmQgYSBzdHJpbmcgdGFibGUgd291bGQgYmUgYSBiZXR0ZXIgY2hvaWNlIHVubGVzcyB0aGUKKwkJCSAqIG51bWJlciBvZiBzZWN0aW9ucyBpcyB2ZXJ5IHNtYWxsLiAqLworCQkJaWYgKHN0cmNhc2VjbXAocywgIlNVSUQiKSA9PSAwKSB7CisJCQkJc2VjdGlvbiA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlzZWN0aW9uID0gLTE7CS8qIFVua25vd24gc2VjdGlvbiBzbyBzZXQgdG8gc2tpcC4gKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogUHJvY2VzcyBzZWN0aW9ucy4gKi8KKworCQlpZiAoc2VjdGlvbiA9PSAxKSB7CQkvKiBTVUlEICovCisJCQkvKiBTaW5jZSB3ZSB0cmltbWVkIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHNwYWNlIGFib3ZlLCB3ZSdyZQorCQkJICogbm93IGxvb2tpbmcgZm9yIHN0cmluZ3Mgb2YgdGhlIGZvcm0KKwkJCSAqICAgIDxrZXk+Wzo6c3BhY2U6Ol0qPVs6OnNwYWNlOjpdKjx2YWx1ZT4KKwkJCSAqIHdoZXJlIGJvdGgga2V5IGFuZCB2YWx1ZSBjb3VsZCBjb250YWluIGlubmVyIHdoaXRlc3BhY2UuICovCisKKwkJCS8qIEZpcnN0IGdldCB0aGUga2V5IChhbiBhcHBsZXQgbmFtZSBpbiBvdXIgY2FzZSkuICovCisJCQljaGFyICplID0gc3RyY2hyKHMsICc9Jyk7CisJCQlpZiAoZSkgeworCQkJCXMgPSBnZXRfdHJpbW1lZF9zbGljZShzLCBlKTsKKwkJCX0KKwkJCWlmICghZSB8fCAhKnMpIHsJLyogTWlzc2luZyAnPScgb3IgZW1wdHkga2V5LiAqLworCQkJCWVycm1zZyA9ICJrZXl3b3JkIjsKKwkJCQlnb3RvIHBlX2xhYmVsOworCQkJfQorCisJCQkvKiBPaywgd2UgaGF2ZSBhbiBhcHBsZXQgbmFtZS4gIFByb2Nlc3MgdGhlIHJocyBpZiB0aGlzCisJCQkgKiBhcHBsZXQgaXMgY3VycmVudGx5IGJ1aWx0IGluIGFuZCBpZ25vcmUgaXQgb3RoZXJ3aXNlLgorCQkJICogTm90ZTogdGhpcyBjYW4gaGlkZSBjb25maWcgZmlsZSBidWdzIHdoaWNoIG9ubHkgcG9wCisJCQkgKiB1cCB3aGVuIHRoZSBidXN5Ym94IGNvbmZpZ3VyYXRpb24gaXMgY2hhbmdlZC4gKi8KKwkJCWFwcGxldF9ubyA9IGZpbmRfYXBwbGV0X2J5X25hbWUocyk7CisJCQlpZiAoYXBwbGV0X25vID49IDApIHsKKwkJCQl1bnNpZ25lZCBpOworCQkJCXN0cnVjdCBzdWlkX2NvbmZpZ190ICpzY3Q7CisKKwkJCQkvKiBOb3RlOiBXZSBjdXJyZW50bHkgZG9uJ3QgY2hlY2sgZm9yIGR1cGxpY2F0ZXMhCisJCQkJICogVGhlIGxhc3QgY29uZmlnIGxpbmUgZm9yIGVhY2ggYXBwbGV0IHdpbGwgYmUgdGhlCisJCQkJICogb25lIHVzZWQgc2luY2Ugd2UgaW5zZXJ0IGF0IHRoZSBoZWFkIG9mIHRoZSBsaXN0LgorCQkJCSAqIEkgc3VwcG9zZSB0aGlzIGNvdWxkIGJlIGNvbnNpZGVyZWQgYSBmZWF0dXJlLiAqLworCQkJCXNjdCA9IHh6YWxsb2Moc2l6ZW9mKCpzY3QpKTsKKwkJCQlzY3QtPm1fYXBwbGV0ID0gYXBwbGV0X25vOworCQkJCS8qc2N0LT5tX21vZGUgPSAwOyovCisJCQkJc2N0LT5tX25leHQgPSBzY3RfaGVhZDsKKwkJCQlzY3RfaGVhZCA9IHNjdDsKKworCQkJCS8qIEdldCB0aGUgc3BlY2lmaWVkIG1vZGUuICovCisKKwkJCQllID0gc2tpcF93aGl0ZXNwYWNlKGUrMSk7CisKKwkJCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQkJCS8qIFRoZXJlIGFyZSA0IGNoYXJzIGZvciBlYWNoIG9mIHVzZXIvZ3JvdXAvb3RoZXIuCisJCQkJCSAqICJ4LXh4IiBpbnN0ZWFkIG9mICJ4LSIgYXJlIHRvIG1ha2UKKwkJCQkJICogImlkeCA+IDMiIGNoZWNrIGNhdGNoIGludmFsaWQgY2hhcnMuCisJCQkJCSAqLworCQkJCQlzdGF0aWMgY29uc3QgY2hhciBtb2RlX2NoYXJzW10gQUxJR04xID0gIlNzeC0iICJTc3gtIiAieC14eCI7CisJCQkJCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBtb2RlX21hc2tbXSBBTElHTjIgPSB7CisJCQkJCQlTX0lTVUlELCBTX0lTVUlEfFNfSVhVU1IsIFNfSVhVU1IsIDAsIC8qIFNzeC0gKi8KKwkJCQkJCVNfSVNHSUQsIFNfSVNHSUR8U19JWEdSUCwgU19JWEdSUCwgMCwgLyogU3N4LSAqLworCQkJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICBTX0lYT1RILCAwICAvKiAgIHgtICovCisJCQkJCX07CisJCQkJCWNvbnN0IGNoYXIgKnEgPSBzdHJjaHJudWwobW9kZV9jaGFycyArIDQqaSwgKmUpOworCQkJCQl1bnNpZ25lZCBpZHggPSBxIC0gKG1vZGVfY2hhcnMgKyA0KmkpOworCQkJCQlpZiAoaWR4ID4gMykgeworCQkJCQkJZXJybXNnID0gIm1vZGUiOworCQkJCQkJZ290byBwZV9sYWJlbDsKKwkJCQkJfQorCQkJCQlzY3QtPm1fbW9kZSB8PSBtb2RlX21hc2tbcSAtIG1vZGVfY2hhcnNdOworCQkJCQllKys7CisJCQkJfQorCisJCQkJLyogTm93IGdldCB0aGUgdXNlci9ncm91cCBpbmZvLiAqLworCisJCQkJcyA9IHNraXBfd2hpdGVzcGFjZShlKTsKKwkJCQkvKiBEZWZhdWx0IGlzIDAuMCwgZWxzZSBwYXJzZSBVU0VSLkdST1VQOiAqLworCQkJCWlmICgqcykgeworCQkJCQkvKiBXZSByZXF1aXJlIHdoaXRlc3BhY2UgYmV0d2VlbiBtb2RlIGFuZCBVU0VSLkdST1VQICovCisJCQkJCWlmICgocyA9PSBlKSB8fCAhKGUgPSBzdHJjaHIocywgJy4nKSkpIHsKKwkJCQkJCWVycm1zZyA9ICJ1aWQuZ2lkIjsKKwkJCQkJCWdvdG8gcGVfbGFiZWw7CisJCQkJCX0KKwkJCQkJKmUgPSAnOic7IC8qIGdldF91aWRnaWQgbmVlZHMgVVNFUjpHUk9VUCBzeW50YXggKi8KKwkJCQkJaWYgKGdldF91aWRnaWQoJnNjdC0+bV91Z2lkLCBzLCAvKmFsbG93X251bWVyaWM6Ki8gMSkgPT0gMCkgeworCQkJCQkJZXJybXNnID0gInVua25vd24gdXNlci9ncm91cCI7CisJCQkJCQlnb3RvIHBlX2xhYmVsOworCQkJCQl9CisJCQkJfQorCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQkvKiBVbmtub3duIHNlY3Rpb25zIGFyZSBpZ25vcmVkLiAqLworCisJCS8qIEVuY291bnRlcmluZyBjb25maWd1cmF0aW9uIGxpbmVzIHByaW9yIHRvIHNlZWluZyBhCisJCSAqIHNlY3Rpb24gaGVhZGVyIGlzIHRyZWF0ZWQgYXMgYW4gZXJyb3IuICBUaGlzIGlzIGhvdworCQkgKiB0aGUgb2xkIGNvZGUgd29ya2VkLCBidXQgaXQgbWF5IG5vdCBiZSBkZXNpcmFibGUuCisJCSAqIFdlIG1heSB3YW50IHRvIHNpbXBseSBpZ25vcmUgc3VjaCBsaW5lcyBpbiBjYXNlIHRoZXkKKwkJICogYXJlIHVzZWQgaW4gc29tZSBmdXR1cmUgdmVyc2lvbiBvZiBidXN5Ym94LiAqLworCQlpZiAoIXNlY3Rpb24pIHsKKwkJCWVycm1zZyA9ICJrZXl3b3JkIG91dHNpZGUgc2VjdGlvbiI7CisJCQlnb3RvIHBlX2xhYmVsOworCQl9CisJfSAvKiB3aGlsZSAoMSkgKi8KKworIHBlX2xhYmVsOgorCWZjbG9zZShmKTsKKwliYl9lcnJvcl9tc2coInBhcnNlIGVycm9yIGluICVzLCBsaW5lICV1OiAlcyIsIGNvbmZpZ19maWxlLCBsYywgZXJybXNnKTsKKworCS8qIFJlbGVhc2UgYW55IGFsbG9jYXRlZCBtZW1vcnkgYmVmb3JlIHJldHVybmluZy4gKi8KKwlsbGlzdF9mcmVlKChsbGlzdF90KilzY3RfaGVhZCwgTlVMTCk7Cit9CisjIGVsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBwYXJzZV9jb25maWdfZmlsZSh2b2lkKQoreworCUlGX0ZFQVRVUkVfU1VJRChydWlkID0gZ2V0dWlkKCk7KQorfQorIyBlbmRpZiAvKiBGRUFUVVJFX1NVSURfQ09ORklHICovCisKKworIyBpZiBFTkFCTEVfRkVBVFVSRV9TVUlECitzdGF0aWMgdm9pZCBjaGVja19zdWlkKGludCBhcHBsZXRfbm8pCit7CisJZ2lkX3QgcmdpZDsgIC8qIHJlYWwgZ2lkICovCisKKwlpZiAocnVpZCA9PSAwKSAvKiBzZXQgYnkgcGFyc2VfY29uZmlnX2ZpbGUoKSAqLworCQlyZXR1cm47IC8qIHJ1biBieSByb290IC0gbm8gbmVlZCB0byBjaGVjayBtb3JlICovCisJcmdpZCA9IGdldGdpZCgpOworCisjICBpZiBFTkFCTEVfRkVBVFVSRV9TVUlEX0NPTkZJRworCWlmIChzdWlkX2NmZ19yZWFkYWJsZSkgeworCQl1aWRfdCB1aWQ7CisJCXN0cnVjdCBzdWlkX2NvbmZpZ190ICpzY3Q7CisJCW1vZGVfdCBtOworCisJCWZvciAoc2N0ID0gc3VpZF9jb25maWc7IHNjdDsgc2N0ID0gc2N0LT5tX25leHQpIHsKKwkJCWlmIChzY3QtPm1fYXBwbGV0ID09IGFwcGxldF9ubykKKwkJCQlnb3RvIGZvdW5kOworCQl9CisJCWdvdG8gY2hlY2tfbmVlZF9zdWlkOworIGZvdW5kOgorCQkvKiBJcyB0aGlzIHVzZXIgYWxsb3dlZCB0byBydW4gdGhpcyBhcHBsZXQ/ICovCisJCW0gPSBzY3QtPm1fbW9kZTsKKwkJaWYgKHNjdC0+bV91Z2lkLnVpZCA9PSBydWlkKQorCQkJLyogc2FtZSB1aWQgKi8KKwkJCW0gPj49IDY7CisJCWVsc2UgaWYgKChzY3QtPm1fdWdpZC5naWQgPT0gcmdpZCkgfHwgaW5ncm91cChydWlkLCBzY3QtPm1fdWdpZC5naWQpKQorCQkJLyogc2FtZSBncm91cCAvIGluIGdyb3VwICovCisJCQltID4+PSAzOworCQlpZiAoIShtICYgU19JWE9USCkpIC8qIGlzIHggYml0IG5vdCBzZXQ/ICovCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgieW91IGhhdmUgbm8gcGVybWlzc2lvbiB0byBydW4gdGhpcyBhcHBsZXQiKTsKKworCQkvKiBXZSBzZXQgZWZmZWN0aXZlIEFORCBzYXZlZCBpZHMuIElmIHNhdmVkLWlkIGlzIG5vdCBzZXQKKwkJICogbGlrZSB3ZSBkbyBiZWxvdywgc2V0ZXVpZCgwKSBjYW4gc3RpbGwgbGF0ZXIgc3VjY2VlZCEgKi8KKworCQkvKiBBcmUgd2UgZGlyZWN0ZWQgdG8gY2hhbmdlIGdpZAorCQkgKiAoQVBQTEVUID0gKnMqIFVTRVIuR1JPVVAgb3IgQVBQTEVUID0gKlMqIFVTRVIuR1JPVVApPworCQkgKi8KKwkJaWYgKHNjdC0+bV9tb2RlICYgU19JU0dJRCkKKwkJCXJnaWQgPSBzY3QtPm1fdWdpZC5naWQ7CisJCS8qIGVsc2U6IHdlIHdpbGwgc2V0IGVnaWQgPSByZ2lkLCB0aHVzIGRyb3BwaW5nIHNnaWQgZWZmZWN0ICovCisJCWlmIChzZXRyZXNnaWQoLTEsIHJnaWQsIHJnaWQpKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZXRyZXNnaWQiKTsKKworCQkvKiBBcmUgd2UgZGlyZWN0ZWQgdG8gY2hhbmdlIHVpZAorCQkgKiAoQVBQTEVUID0gcyoqIFVTRVIuR1JPVVAgb3IgQVBQTEVUID0gUyoqIFVTRVIuR1JPVVApPworCQkgKi8KKwkJdWlkID0gcnVpZDsKKwkJaWYgKHNjdC0+bV9tb2RlICYgU19JU1VJRCkKKwkJCXVpZCA9IHNjdC0+bV91Z2lkLnVpZDsKKwkJLyogZWxzZTogd2Ugd2lsbCBzZXQgZXVpZCA9IHJ1aWQsIHRodXMgZHJvcHBpbmcgc3VpZCBlZmZlY3QgKi8KKwkJaWYgKHNldHJlc3VpZCgtMSwgdWlkLCB1aWQpKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZXRyZXN1aWQiKTsKKworCQlnb3RvIHJldDsKKwl9CisjICAgaWYgIUVOQUJMRV9GRUFUVVJFX1NVSURfQ09ORklHX1FVSUVUCisJeworCQlzdGF0aWMgYm9vbCBvbmV0aW1lID0gMDsKKworCQlpZiAoIW9uZXRpbWUpIHsKKwkJCW9uZXRpbWUgPSAxOworCQkJYmJfZXJyb3JfbXNnKCJ1c2luZyBmYWxsYmFjayBzdWlkIG1ldGhvZCIpOworCQl9CisJfQorIyAgIGVuZGlmCisgY2hlY2tfbmVlZF9zdWlkOgorIyAgZW5kaWYKKwlpZiAoQVBQTEVUX1NVSUQoYXBwbGV0X25vKSA9PSBCQl9TVUlEX1JFUVVJUkUpIHsKKwkJLyogUmVhbCB1aWQgaXMgbm90IDAuIElmIGV1aWQgaXNuJ3QgMCB0b28sIHN1aWQgYml0CisJCSAqIGlzIG1vc3QgcHJvYmFibHkgbm90IHNldCBvbiBvdXIgZXhlY3V0YWJsZSAqLworCQlpZiAoZ2V0ZXVpZCgpKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm11c3QgYmUgc3VpZCB0byB3b3JrIHByb3Blcmx5Iik7CisJfSBlbHNlIGlmIChBUFBMRVRfU1VJRChhcHBsZXRfbm8pID09IEJCX1NVSURfRFJPUCkgeworCQl4c2V0Z2lkKHJnaWQpOyAgLyogZHJvcCBhbGwgcHJpdmlsZWdlcyAqLworCQl4c2V0dWlkKHJ1aWQpOworCX0KKyMgIGlmIEVOQUJMRV9GRUFUVVJFX1NVSURfQ09ORklHCisgcmV0OiA7CisJbGxpc3RfZnJlZSgobGxpc3RfdCopc3VpZF9jb25maWcsIE5VTEwpOworIyAgZW5kaWYKK30KKyMgZWxzZQorIyAgZGVmaW5lIGNoZWNrX3N1aWQoeCkgKCh2b2lkKTApCisjIGVuZGlmIC8qIEZFQVRVUkVfU1VJRCAqLworCisKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSU5TVEFMTEVSCitzdGF0aWMgY29uc3QgY2hhciB1c3JfYmluIFtdIEFMSUdOMSA9ICIvdXNyL2Jpbi8iOworc3RhdGljIGNvbnN0IGNoYXIgdXNyX3NiaW5bXSBBTElHTjEgPSAiL3Vzci9zYmluLyI7CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgaW5zdGFsbF9kaXJbXSA9IHsKKwkmdXNyX2JpbiBbOF0sIC8qICIvIiAqLworCSZ1c3JfYmluIFs0XSwgLyogIi9iaW4vIiAqLworCSZ1c3Jfc2Jpbls0XSAgLyogIi9zYmluLyIgKi8KKyMgIGlmICFFTkFCTEVfSU5TVEFMTF9OT19VU1IKKwksdXNyX2JpbgorCSx1c3Jfc2JpbgorIyAgZW5kaWYKK307CisKKy8qIGNyZWF0ZSAoc3ltKWxpbmtzIGZvciBlYWNoIGFwcGxldCAqLworc3RhdGljIHZvaWQgaW5zdGFsbF9saW5rcyhjb25zdCBjaGFyICpidXN5Ym94LCBpbnQgdXNlX3N5bWJvbGljX2xpbmtzLAorCQljaGFyICpjdXN0b21faW5zdGFsbF9kaXIpCit7CisJLyogZGlyZWN0b3J5IHRhYmxlCisJICogdGhpcyBzaG91bGQgYmUgY29uc2lzdGVudCB3LyB0aGUgZW51bSwKKwkgKiBidXN5Ym94Lmg6OmJiX2luc3RhbGxfbG9jX3QsIG9yIGVsc2UuLi4gKi8KKwlpbnQgKCpsZikoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCWNoYXIgKmZwYzsKKwl1bnNpZ25lZCBpOworCWludCByYzsKKworCWxmID0gbGluazsKKwlpZiAodXNlX3N5bWJvbGljX2xpbmtzKQorCQlsZiA9IHN5bWxpbms7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhcHBsZXRfbWFpbik7IGkrKykgeworCQlmcGMgPSBjb25jYXRfcGF0aF9maWxlKAorCQkJCWN1c3RvbV9pbnN0YWxsX2RpciA/IGN1c3RvbV9pbnN0YWxsX2RpciA6IGluc3RhbGxfZGlyW0FQUExFVF9JTlNUQUxMX0xPQyhpKV0sCisJCQkJQVBQTEVUX05BTUUoaSkpOworCQkvLyBkZWJ1ZzogYmJfZXJyb3JfbXNnKCIlc2xpbmtpbmcgJXMgdG8gYnVzeWJveCIsCisJCS8vCQl1c2Vfc3ltYm9saWNfbGlua3MgPyAic3ltIiA6ICIiLCBmcGMpOworCQlyYyA9IGxmKGJ1c3lib3gsIGZwYyk7CisJCWlmIChyYyAhPSAwICYmIGVycm5vICE9IEVFWElTVCkgeworCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2coZnBjKTsKKwkJfQorCQlmcmVlKGZwYyk7CisJfQorfQorIyBlbHNlCitzdGF0aWMgdm9pZCBpbnN0YWxsX2xpbmtzKGNvbnN0IGNoYXIgKmJ1c3lib3ggVU5VU0VEX1BBUkFNLAorCQlpbnQgdXNlX3N5bWJvbGljX2xpbmtzIFVOVVNFRF9QQVJBTSwKKwkJY2hhciAqY3VzdG9tX2luc3RhbGxfZGlyIFVOVVNFRF9QQVJBTSkKK3sKK30KKyMgZW5kaWYKKworLyogSWYgd2Ugd2VyZSBjYWxsZWQgYXMgImJ1c3lib3guLi4iICovCitzdGF0aWMgaW50IGJ1c3lib3hfbWFpbihjaGFyICoqYXJndikKK3sKKwlpZiAoIWFyZ3ZbMV0pIHsKKwkJLyogQ2FsbGVkIHdpdGhvdXQgYXJndW1lbnRzICovCisJCWNvbnN0IGNoYXIgKmE7CisJCWludCBjb2w7CisJCXVuc2lnbmVkIG91dHB1dF93aWR0aDsKKyBoZWxwOgorCQlvdXRwdXRfd2lkdGggPSA4MDsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0FVVE9XSURUSCkgeworCQkJLyogT2J0YWluIHRoZSB0ZXJtaW5hbCB3aWR0aCAqLworCQkJZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodCgwLCAmb3V0cHV0X3dpZHRoLCBOVUxMKTsKKwkJfQorCisJCWR1cDIoMSwgMik7CisJCWZ1bGxfd3JpdGUyX3N0cihiYl9iYW5uZXIpOyAvKiByZXVzZSBjb25zdCBzdHJpbmcgKi8KKwkJZnVsbF93cml0ZTJfc3RyKCIgbXVsdGktY2FsbCBiaW5hcnkuXG4iKTsgLyogcmV1c2UgKi8KKwkJZnVsbF93cml0ZTJfc3RyKAorCQkJIkJ1c3lCb3ggaXMgY29weXJpZ2h0ZWQgYnkgbWFueSBhdXRob3JzIGJldHdlZW4gMTk5OC0yMDE1LlxuIgorCQkJIkxpY2Vuc2VkIHVuZGVyIEdQTHYyLiBTZWUgc291cmNlIGRpc3RyaWJ1dGlvbiBmb3IgZGV0YWlsZWRcbiIKKwkJCSJjb3B5cmlnaHQgbm90aWNlcy5cbiIKKwkJCSJcbiIKKwkJCSJVc2FnZTogYnVzeWJveCBbZnVuY3Rpb24gW2FyZ3VtZW50c10uLi5dXG4iCisJCQkiICAgb3I6IGJ1c3lib3ggLS1saXN0IklGX0ZFQVRVUkVfSU5TVEFMTEVSKCJbLWZ1bGxdIikiXG4iCisJCQlJRl9GRUFUVVJFX0lOU1RBTExFUigKKwkJCSIgICBvcjogYnVzeWJveCAtLWluc3RhbGwgWy1zXSBbRElSXVxuIgorCQkJKQorCQkJIiAgIG9yOiBmdW5jdGlvbiBbYXJndW1lbnRzXS4uLlxuIgorCQkJIlxuIgorCQkJIlx0QnVzeUJveCBpcyBhIG11bHRpLWNhbGwgYmluYXJ5IHRoYXQgY29tYmluZXMgbWFueSBjb21tb24gVW5peFxuIgorCQkJIlx0dXRpbGl0aWVzIGludG8gYSBzaW5nbGUgZXhlY3V0YWJsZS4gIE1vc3QgcGVvcGxlIHdpbGwgY3JlYXRlIGFcbiIKKwkJCSJcdGxpbmsgdG8gYnVzeWJveCBmb3IgZWFjaCBmdW5jdGlvbiB0aGV5IHdpc2ggdG8gdXNlIGFuZCBCdXN5Qm94XG4iCisJCQkiXHR3aWxsIGFjdCBsaWtlIHdoYXRldmVyIGl0IHdhcyBpbnZva2VkIGFzLlxuIgorCQkJIlxuIgorCQkJIkN1cnJlbnRseSBkZWZpbmVkIGZ1bmN0aW9uczpcbiIKKwkJKTsKKwkJY29sID0gMDsKKwkJYSA9IGFwcGxldF9uYW1lczsKKwkJLyogcHJldmVudCBsYXN0IGNvbW1hIHRvIGJlIGluIHRoZSB2ZXJ5IGxhc3QgcG9zICovCisJCW91dHB1dF93aWR0aC0tOworCQl3aGlsZSAoKmEpIHsKKwkJCWludCBsZW4yID0gc3RybGVuKGEpICsgMjsKKwkJCWlmIChjb2wgPj0gKGludClvdXRwdXRfd2lkdGggLSBsZW4yKSB7CisJCQkJZnVsbF93cml0ZTJfc3RyKCIsXG4iKTsKKwkJCQljb2wgPSAwOworCQkJfQorCQkJaWYgKGNvbCA9PSAwKSB7CisJCQkJY29sID0gNjsKKwkJCQlmdWxsX3dyaXRlMl9zdHIoIlx0Iik7CisJCQl9IGVsc2UgeworCQkJCWZ1bGxfd3JpdGUyX3N0cigiLCAiKTsKKwkJCX0KKwkJCWZ1bGxfd3JpdGUyX3N0cihhKTsKKwkJCWNvbCArPSBsZW4yOworCQkJYSArPSBsZW4yIC0gMTsKKwkJfQorCQlmdWxsX3dyaXRlMl9zdHIoIlxuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGlzX3ByZWZpeGVkX3dpdGgoYXJndlsxXSwgIi0tbGlzdCIpKSB7CisJCXVuc2lnbmVkIGkgPSAwOworCQljb25zdCBjaGFyICphID0gYXBwbGV0X25hbWVzOworCQlkdXAyKDEsIDIpOworCQl3aGlsZSAoKmEpIHsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSU5TVEFMTEVSCisJCQlpZiAoYXJndlsxXVs2XSkgLyogLS1saXN0LWZ1bGw/ICovCisJCQkJZnVsbF93cml0ZTJfc3RyKGluc3RhbGxfZGlyW0FQUExFVF9JTlNUQUxMX0xPQyhpKV0gKyAxKTsKKyMgZW5kaWYKKwkJCWZ1bGxfd3JpdGUyX3N0cihhKTsKKwkJCWZ1bGxfd3JpdGUyX3N0cigiXG4iKTsKKwkJCWkrKzsKKwkJCWEgKz0gc3RybGVuKGEpICsgMTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfSU5TVEFMTEVSICYmIHN0cmNtcChhcmd2WzFdLCAiLS1pbnN0YWxsIikgPT0gMCkgeworCQlpbnQgdXNlX3N5bWJvbGljX2xpbmtzOworCQljb25zdCBjaGFyICpidXN5Ym94OworCisJCWJ1c3lib3ggPSB4bWFsbG9jX3JlYWRsaW5rKGJiX2J1c3lib3hfZXhlY19wYXRoKTsKKwkJaWYgKCFidXN5Ym94KSB7CisJCQkvKiBiYl9idXN5Ym94X2V4ZWNfcGF0aCBpcyB1c3VhbGx5ICIvcHJvYy9zZWxmL2V4ZSIuCisJCQkgKiBJbiBjaHJvb3QsIHJlYWRsaW5rKCIvcHJvYy9zZWxmL2V4ZSIpIHVzdWFsbHkgZmFpbHMuCisJCQkgKiBJbiBzdWNoIGNhc2UsIGJldHRlciB1c2UgYXJndlswXSBhcyBzeW1saW5rIHRhcmdldAorCQkJICogaWYgaXQgaXMgYSBmdWxsIHBhdGggbmFtZS4KKwkJCSAqLworCQkJaWYgKGFyZ3ZbMF1bMF0gIT0gJy8nKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCInJXMnIGlzIG5vdCBhbiBhYnNvbHV0ZSBwYXRoIiwgYXJndlswXSk7CisJCQlidXN5Ym94ID0gYXJndlswXTsKKwkJfQorCQkvKiBidXN5Ym94IC0taW5zdGFsbCBbLXNdIFtESVJdOgorCQkgKiAtczogbWFrZSBzeW1saW5rcworCQkgKiBESVI6IGRpcmVjdG9yeSB0byBpbnN0YWxsIGxpbmtzIHRvCisJCSAqLworCQl1c2Vfc3ltYm9saWNfbGlua3MgPSAoYXJndlsyXSAmJiBzdHJjbXAoYXJndlsyXSwgIi1zIikgPT0gMCAmJiArK2FyZ3YpOworCQlpbnN0YWxsX2xpbmtzKGJ1c3lib3gsIHVzZV9zeW1ib2xpY19saW5rcywgYXJndlsyXSk7CisJCXJldHVybiAwOworCX0KKworCWlmIChzdHJjbXAoYXJndlsxXSwgIi0taGVscCIpID09IDApIHsKKwkJLyogImJ1c3lib3ggLS1oZWxwIFs8YXBwbGV0Pl0iICovCisJCWlmICghYXJndlsyXSkKKwkJCWdvdG8gaGVscDsKKwkJLyogY29udmVydCB0byAiPGFwcGxldD4gLS1oZWxwIiAqLworCQlhcmd2WzBdID0gYXJndlsyXTsKKwkJYXJndlsyXSA9IE5VTEw7CisJfSBlbHNlIHsKKwkJLyogImJ1c3lib3ggPGFwcGxldD4gYXJnMSBhcmcyIC4uLiIgKi8KKwkJYXJndisrOworCX0KKwkvKiBXZSBzdXBwb3J0ICJidXN5Ym94IC9hL3BhdGgvdG8vYXBwbGV0IGFyZ3MuLi4iIHRvby4gQWxsb3dzIGZvcgorCSAqICIjIS9iaW4vYnVzeWJveCItc3R5bGUgd3JhcHBlcnMgKi8KKwlhcHBsZXRfbmFtZSA9IGJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50X25vc3RyaXAoYXJndlswXSk7CisJcnVuX2FwcGxldF9hbmRfZXhpdChhcHBsZXRfbmFtZSwgYXJndik7CisKKwkvKmJiX2Vycm9yX21zZ19hbmRfZGllKCJhcHBsZXQgbm90IGZvdW5kIik7IC0gc3Vja3MgaW4gcHJpbnRmICovCisJZnVsbF93cml0ZTJfc3RyKGFwcGxldF9uYW1lKTsKKwlmdWxsX3dyaXRlMl9zdHIoIjogYXBwbGV0IG5vdCBmb3VuZFxuIik7CisJLyogUE9TSVg6ICJJZiBhIGNvbW1hbmQgaXMgbm90IGZvdW5kLCB0aGUgZXhpdCBzdGF0dXMgc2hhbGwgYmUgMTI3IiAqLworCWV4aXQoMTI3KTsKK30KKwordm9pZCBGQVNUX0ZVTkMgcnVuX2FwcGxldF9ub19hbmRfZXhpdChpbnQgYXBwbGV0X25vLCBjaGFyICoqYXJndikKK3sKKwlpbnQgYXJnYyA9IDE7CisKKwl3aGlsZSAoYXJndlthcmdjXSkKKwkJYXJnYysrOworCisJLyogUmVpbml0IHNvbWUgc2hhcmVkIGdsb2JhbCBkYXRhICovCisJeGZ1bmNfZXJyb3JfcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCWFwcGxldF9uYW1lID0gQVBQTEVUX05BTUUoYXBwbGV0X25vKTsKKworCS8qIFNwZWNpYWwgY2FzZS4gUE9TSVggc2F5cyAidGVzdCAtLWhlbHAiCisJICogc2hvdWxkIGJlIG5vIGRpZmZlcmVudCBmcm9tIGUuZy4gInRlc3QgLS1mb28iLgorCSAqIFRodXMgZm9yICJ0ZXN0Iiwgd2Ugc2tpcCAtLWhlbHAgY2hlY2suCisJICogInRydWUiIGFuZCAiZmFsc2UiIGFyZSBhbHNvIHNwZWNpYWwuCisJICovCisJaWYgKDEKKyNpZiBkZWZpbmVkIEFQUExFVF9OT190ZXN0CisJICYmIGFwcGxldF9ubyAhPSBBUFBMRVRfTk9fdGVzdAorI2VuZGlmCisjaWYgZGVmaW5lZCBBUFBMRVRfTk9fdHJ1ZQorCSAmJiBhcHBsZXRfbm8gIT0gQVBQTEVUX05PX3RydWUKKyNlbmRpZgorI2lmIGRlZmluZWQgQVBQTEVUX05PX2ZhbHNlCisJICYmIGFwcGxldF9ubyAhPSBBUFBMRVRfTk9fZmFsc2UKKyNlbmRpZgorCSkgeworCQlpZiAoYXJnYyA9PSAyICYmIHN0cmNtcChhcmd2WzFdLCAiLS1oZWxwIikgPT0gMCkgeworCQkJLyogTWFrZSAiZm9vIC0taGVscCIgZXhpdCB3aXRoIDA6ICovCisJCQl4ZnVuY19lcnJvcl9yZXR2YWwgPSAwOworCQkJYmJfc2hvd191c2FnZSgpOworCQl9CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9TVUlEKQorCQljaGVja19zdWlkKGFwcGxldF9ubyk7CisJZXhpdChhcHBsZXRfbWFpblthcHBsZXRfbm9dKGFyZ2MsIGFyZ3YpKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgcnVuX2FwcGxldF9hbmRfZXhpdChjb25zdCBjaGFyICpuYW1lLCBjaGFyICoqYXJndikKK3sKKwlpbnQgYXBwbGV0ID0gZmluZF9hcHBsZXRfYnlfbmFtZShuYW1lKTsKKwlpZiAoYXBwbGV0ID49IDApCisJCXJ1bl9hcHBsZXRfbm9fYW5kX2V4aXQoYXBwbGV0LCBhcmd2KTsKKwlpZiAoaXNfcHJlZml4ZWRfd2l0aChuYW1lLCAiYnVzeWJveCIpKQorCQlleGl0KGJ1c3lib3hfbWFpbihhcmd2KSk7Cit9CisKKyNlbmRpZiAvKiAhZGVmaW5lZChTSU5HTEVfQVBQTEVUX01BSU4pICovCisKKworCisjaWYgRU5BQkxFX0JVSUxEX0xJQkJVU1lCT1gKK2ludCBsYmJfbWFpbihjaGFyICoqYXJndikKKyNlbHNlCitpbnQgbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQorI2VuZGlmCit7CisJLyogVHdlYWsgbWFsbG9jIGZvciByZWR1Y2VkIG1lbW9yeSBjb25zdW1wdGlvbiAqLworI2lmZGVmIE1fVFJJTV9USFJFU0hPTEQKKwkvKiBNX1RSSU1fVEhSRVNIT0xEIGlzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBmcmVlZCB0b3AtbW9zdCBtZW1vcnkKKwkgKiB0byBrZWVwIGJlZm9yZSByZWxlYXNpbmcgdG8gdGhlIE9TCisJICogRGVmYXVsdCBpcyB3YXkgdG9vIGJpZzogMjU2aworCSAqLworCW1hbGxvcHQoTV9UUklNX1RIUkVTSE9MRCwgOCAqIDEwMjQpOworI2VuZGlmCisjaWZkZWYgTV9NTUFQX1RIUkVTSE9MRAorCS8qIE1fTU1BUF9USFJFU0hPTEQgaXMgdGhlIHJlcXVlc3Qgc2l6ZSB0aHJlc2hvbGQgZm9yIHVzaW5nIG1tYXAoKQorCSAqIERlZmF1bHQgaXMgdG9vIGJpZzogMjU2aworCSAqLworCW1hbGxvcHQoTV9NTUFQX1RIUkVTSE9MRCwgMzIgKiAxMDI0IC0gMjU2KTsKKyNlbmRpZgorCisjaWYgIUJCX01NVQorCS8qIE5PTU1VIHJlLWV4ZWMgdHJpY2sgc2V0cyBoaWdoLW9yZGVyIGJpdCBpbiBmaXJzdCBieXRlIG9mIG5hbWUgKi8KKwlpZiAoYXJndlswXVswXSAmIDB4ODApIHsKKwkJcmVfZXhlY2VkID0gMTsKKwkJYXJndlswXVswXSAmPSAweDdmOworCX0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChTSU5HTEVfQVBQTEVUX01BSU4pCisJLyogT25seSBvbmUgYXBwbGV0IGlzIHNlbGVjdGVkIGluIC5jb25maWcgKi8KKwlpZiAoYXJndlsxXSAmJiBpc19wcmVmaXhlZF93aXRoKGFyZ3ZbMF0sICJidXN5Ym94IikpIHsKKwkJLyogImJ1c3lib3ggPGFwcGxldD4gPHBhcmFtcz4iIHNob3VsZCBzdGlsbCB3b3JrIGFzIGV4cGVjdGVkICovCisJCWFyZ3YrKzsKKwl9CisJLyogYXBwbGV0X25hbWVzIGluIHRoaXMgY2FzZSBpcyBqdXN0ICJhcHBsZXRcMFwwIiAqLworCWxiYl9wcmVwYXJlKGFwcGxldF9uYW1lcyBJRl9GRUFUVVJFX0lORElWSURVQUwoLCBhcmd2KSk7CisJcmV0dXJuIFNJTkdMRV9BUFBMRVRfTUFJTihhcmdjLCBhcmd2KTsKKyNlbHNlCisJbGJiX3ByZXBhcmUoImJ1c3lib3giIElGX0ZFQVRVUkVfSU5ESVZJRFVBTCgsIGFyZ3YpKTsKKworCWFwcGxldF9uYW1lID0gYXJndlswXTsKKwlpZiAoYXBwbGV0X25hbWVbMF0gPT0gJy0nKQorCQlhcHBsZXRfbmFtZSsrOworCWFwcGxldF9uYW1lID0gYmJfYmFzZW5hbWUoYXBwbGV0X25hbWUpOworCisJcGFyc2VfY29uZmlnX2ZpbGUoKTsgLyogLi4ubWF5YmUsIGlmIEZFQVRVUkVfU1VJRF9DT05GSUcgKi8KKworCXJ1bl9hcHBsZXRfYW5kX2V4aXQoYXBwbGV0X25hbWUsIGFyZ3YpOworCisJLypiYl9lcnJvcl9tc2dfYW5kX2RpZSgiYXBwbGV0IG5vdCBmb3VuZCIpOyAtIHN1Y2tzIGluIHByaW50ZiAqLworCWZ1bGxfd3JpdGUyX3N0cihhcHBsZXRfbmFtZSk7CisJZnVsbF93cml0ZTJfc3RyKCI6IGFwcGxldCBub3QgZm91bmRcbiIpOworCS8qIFBPU0lYOiAiSWYgYSBjb21tYW5kIGlzIG5vdCBmb3VuZCwgdGhlIGV4aXQgc3RhdHVzIHNoYWxsIGJlIDEyNyIgKi8KKwlleGl0KDEyNyk7CisjZW5kaWYKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2Fza19jb25maXJtYXRpb24uYyBiL2xpYmJiL2Fza19jb25maXJtYXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTU3MjljCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvYXNrX2NvbmZpcm1hdGlvbi5jCkBAIC0wLDAgKzEsMjcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGJiX2Fza19jb25maXJtYXRpb24gaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIFJlYWQgYSBsaW5lIGZyb20gc3RkaW4uICBJZiB0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhciBpcyAneScgb3IgJ1knLAorICogcmV0dXJuIDEuICBPdGhlcndpc2UgcmV0dXJuIDAuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgRkFTVF9GVU5DIGJiX2Fza19jb25maXJtYXRpb24odm9pZCkKK3sKKwljaGFyIGZpcnN0ID0gMDsKKwlpbnQgYzsKKworCXdoaWxlICgoKGMgPSBnZXRjaGFyKCkpICE9IEVPRikgJiYgKGMgIT0gJ1xuJykpIHsKKwkJaWYgKGZpcnN0ID09IDAgJiYgIWlzYmxhbmsoYykpIHsKKwkJCWZpcnN0ID0gY3wweDIwOworCQl9CisJfQorCisJcmV0dXJuIGZpcnN0ID09ICd5JzsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2F1dG9fc3RyaW5nLmMgYi9saWJiYi9hdXRvX3N0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlOTQwMDYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9hdXRvX3N0cmluZy5jCkBAIC0wLDAgKzEsMjMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE1IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworLy9rYnVpbGQ6bGliLXkgKz0gYXV0b19zdHJpbmcubworCisjaW5jbHVkZSAibGliYmIuaCIKKworY2hhciogRkFTVF9GVU5DIGF1dG9fc3RyaW5nKGNoYXIgKnN0cikKK3sKKwlzdGF0aWMgY2hhciAqc2F2ZWRbNF07CisJc3RhdGljIHVpbnQ4X3QgY3VyX3NhdmVkOyAvKiA9IDAgKi8KKworCWZyZWUoc2F2ZWRbY3VyX3NhdmVkXSk7CisJc2F2ZWRbY3VyX3NhdmVkXSA9IHN0cjsKKwljdXJfc2F2ZWQgPSAoY3VyX3NhdmVkICsgMSkgJiAoQVJSQVlfU0laRShzYXZlZCktMSk7CisKKwlyZXR1cm4gc3RyOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvYmJfYXNrcGFzcy5jIGIvbGliYmIvYmJfYXNrcGFzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNTgwYjkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9iYl9hc2twYXNzLmMKQEAgLTAsMCArMSw5MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQXNrIGZvciBhIHBhc3N3b3JkCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIGRvIG5vdGhpbmcgc2lnbmFsIGhhbmRsZXIgKi8KK3N0YXRpYyB2b2lkIGFza3Bhc3NfdGltZW91dChpbnQgVU5VU0VEX1BBUkFNIGlnbm9yZSkKK3sKK30KKworY2hhciogRkFTVF9GVU5DIGJiX2Fza19zdGRpbihjb25zdCBjaGFyICpwcm9tcHQpCit7CisJcmV0dXJuIGJiX2FzayhTVERJTl9GSUxFTk8sIDAsIHByb21wdCk7Cit9CitjaGFyKiBGQVNUX0ZVTkMgYmJfYXNrKGNvbnN0IGludCBmZCwgaW50IHRpbWVvdXQsIGNvbnN0IGNoYXIgKnByb21wdCkKK3sKKwkvKiBXYXMgc3RhdGljIGNoYXJbQklHTlVNXSAqLworCWVudW0geyBzaXplb2ZfcGFzc3dkID0gMTI4IH07CisKKwljaGFyICpwYXNzd2Q7CisJY2hhciAqcmV0OworCWludCBpOworCXN0cnVjdCBzaWdhY3Rpb24gc2EsIG9sZHNhOworCXN0cnVjdCB0ZXJtaW9zIHRpbywgb2xkdGlvOworCisJdGNmbHVzaChmZCwgVENJRkxVU0gpOworCS8qIFdhcyBidWdneTogd2FzIHByaW50aW5nIHByb21wdCAqYmVmb3JlKiBmbHVzaGluZyBpbnB1dCwKKwkgKiB3aGljaCB3YXMgdXBzZXR0aW5nICJleHBlY3QiIGJhc2VkIHNjcmlwdHMgb2Ygc29tZSB1c2Vycy4KKwkgKi8KKwlmcHV0cyhwcm9tcHQsIHN0ZG91dCk7CisJZmZsdXNoX2FsbCgpOworCisJdGNnZXRhdHRyKGZkLCAmb2xkdGlvKTsKKwl0aW8gPSBvbGR0aW87CisjaWYgMAorCS8qIFN3aXRjaCBvZmYgVVBQRVJDQVNFLT5sb3dlcmNhc2UgY29udmVyc2lvbiAobmV2ZXIgdXNlZCBzaW5jZSAxOTh4KQorCSAqIGFuZCBYT04vWE9GRiAod2h5IHdlIHdhbnQgdG8gbWVzcyB3aXRoIHRoaXM/PykKKwkgKi8KKyMgaWZuZGVmIElVQ0xDCisjICBkZWZpbmUgSVVDTEMgMAorIyBlbmRpZgorCXRpby5jX2lmbGFnICY9IH4oSVVDTEN8SVhPTnxJWE9GRnxJWEFOWSk7CisjZW5kaWYKKwkvKiBTd2l0Y2ggb2ZmIGVjaG8gKi8KKwl0aW8uY19sZmxhZyAmPSB+KEVDSE98RUNIT0V8RUNIT0t8RUNIT05MKTsKKwl0Y3NldGF0dHIoZmQsIFRDU0FOT1csICZ0aW8pOworCisJbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7CisJLyogc2Euc2FfZmxhZ3MgPSAwOyAtIG5vIFNBX1JFU1RBUlQhICovCisJLyogU0lHSU5UIGFuZCBTSUdBTFJNIHdpbGwgaW50ZXJydXB0IHJlYWRzIGJlbG93ICovCisJc2Euc2FfaGFuZGxlciA9IGFza3Bhc3NfdGltZW91dDsKKwlzaWdhY3Rpb24oU0lHSU5ULCAmc2EsICZvbGRzYSk7CisJaWYgKHRpbWVvdXQpIHsKKwkJc2lnYWN0aW9uX3NldChTSUdBTFJNLCAmc2EpOworCQlhbGFybSh0aW1lb3V0KTsKKwl9CisKKwlwYXNzd2QgPSBhdXRvX3N0cmluZyh4bWFsbG9jKHNpemVvZl9wYXNzd2QpKTsKKwlyZXQgPSBwYXNzd2Q7CisJaSA9IDA7CisJd2hpbGUgKDEpIHsKKwkJaW50IHIgPSByZWFkKGZkLCAmcmV0W2ldLCAxKTsKKwkJaWYgKChpID09IDAgJiYgciA9PSAwKSAvKiBFT0YgKF5EKSB3aXRoIG5vIHBhc3N3b3JkICovCisJCSB8fCByIDwgMAorCQkpIHsKKwkJCS8qIHJlYWQgaXMgaW50ZXJydXB0ZWQgYnkgdGltZW91dCBvciBeQyAqLworCQkJcmV0ID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChyID09IDAgLyogRU9GICovCisJCSB8fCByZXRbaV0gPT0gJ1xyJyB8fCByZXRbaV0gPT0gJ1xuJyAvKiBFT0wgKi8KKwkJIHx8ICsraSA9PSBzaXplb2ZfcGFzc3dkLTEgLyogbGluZSBsaW1pdCAqLworCQkpIHsKKwkJCXJldFtpXSA9ICdcMCc7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICh0aW1lb3V0KSB7CisJCWFsYXJtKDApOworCX0KKwlzaWdhY3Rpb25fc2V0KFNJR0lOVCwgJm9sZHNhKTsKKwl0Y3NldGF0dHIoZmQsIFRDU0FOT1csICZvbGR0aW8pOworCWJiX3B1dGNoYXIoJ1xuJyk7CisJZmZsdXNoX2FsbCgpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9iYl9ic3dhcF82NC5jIGIvbGliYmIvYmJfYnN3YXBfNjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTlkNTNiCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvYmJfYnN3YXBfNjQuYwpAQCAtMCwwICsxLDE2IEBACisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGVueXMgVmxhc2Vua28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWYgIShVTE9OR19NQVggPiAweGZmZmZmZmZmKQordWludDY0X3QgRkFTVF9GVU5DIGJiX2Jzd2FwXzY0KHVpbnQ2NF90IHgpCit7CisJcmV0dXJuIGJzd2FwXzY0KHgpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJiYi9iYl9kb19kZWxheS5jIGIvbGliYmIvYmJfZG9fZGVsYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWM4NzlmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvYmJfZG9fZGVsYXkuYwpAQCAtMCwwICsxLDIxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBCdXN5Ym94IHV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IGJ5IFRpdG8gUmFndXNhIDx0aXRvLXdvbGl0QHRpc2NhbGkuaXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKwordm9pZCBGQVNUX0ZVTkMgYmJfZG9fZGVsYXkoaW50IHNlY29uZHMpCit7CisJdGltZV90IHN0YXJ0LCBub3c7CisKKwlzdGFydCA9IHRpbWUoTlVMTCk7CisJZG8geworCQlzbGVlcChzZWNvbmRzKTsKKwkJbm93ID0gdGltZShOVUxMKTsKKwl9IHdoaWxlICgobm93IC0gc3RhcnQpIDwgc2Vjb25kcyk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9iYl9wd2QuYyBiL2xpYmJiL2JiX3B3ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MjliNzIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9iYl9wd2QuYwpAQCAtMCwwICsxLDExMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcGFzc3dvcmQgdXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVGl0byBSYWd1c2EgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRPRE86IG1heWJlIGNoYW5nZSBBUEkgdG8gcmV0dXJuIG1hbGxvY2VkIGRhdGE/CisgKiBUaGlzIHdpbGwgYWxsb3cgdG8gc3RvcCB1c2luZyBsaWJjIGZ1bmN0aW9ucyByZXR1cm5pbmcKKyAqIHBvaW50ZXJzIHRvIHN0YXRpYyBkYXRhIChnZXRwd3VpZCkKKyAqLworCitzdHJ1Y3QgcGFzc3dkKiBGQVNUX0ZVTkMgeGdldHB3bmFtKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHBhc3N3ZCAqcHcgPSBnZXRwd25hbShuYW1lKTsKKwlpZiAoIXB3KQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biB1c2VyICVzIiwgbmFtZSk7CisJcmV0dXJuIHB3OworfQorCitzdHJ1Y3QgZ3JvdXAqIEZBU1RfRlVOQyB4Z2V0Z3JuYW0oY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZ3JvdXAgKmdyID0gZ2V0Z3JuYW0obmFtZSk7CisJaWYgKCFncikKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gZ3JvdXAgJXMiLCBuYW1lKTsKKwlyZXR1cm4gZ3I7Cit9CisKKworc3RydWN0IHBhc3N3ZCogRkFTVF9GVU5DIHhnZXRwd3VpZCh1aWRfdCB1aWQpCit7CisJc3RydWN0IHBhc3N3ZCAqcHcgPSBnZXRwd3VpZCh1aWQpOworCWlmICghcHcpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duIHVpZCAldSIsICh1bnNpZ25lZCl1aWQpOworCXJldHVybiBwdzsKK30KKworc3RydWN0IGdyb3VwKiBGQVNUX0ZVTkMgeGdldGdyZ2lkKGdpZF90IGdpZCkKK3sKKwlzdHJ1Y3QgZ3JvdXAgKmdyID0gZ2V0Z3JnaWQoZ2lkKTsKKwlpZiAoIWdyKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biBnaWQgJXUiLCAodW5zaWduZWQpZ2lkKTsKKwlyZXR1cm4gZ3I7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyB4dWlkMnVuYW1lKHVpZF90IHVpZCkKK3sKKwlzdHJ1Y3QgcGFzc3dkICpwdyA9IHhnZXRwd3VpZCh1aWQpOworCXJldHVybiBwdy0+cHdfbmFtZTsKK30KKworY2hhciogRkFTVF9GVU5DIHhnaWQyZ3JvdXAoZ2lkX3QgZ2lkKQoreworCXN0cnVjdCBncm91cCAqZ3IgPSB4Z2V0Z3JnaWQoZ2lkKTsKKwlyZXR1cm4gZ3ItPmdyX25hbWU7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyB1aWQydW5hbWUodWlkX3QgdWlkKQoreworCXN0cnVjdCBwYXNzd2QgKnB3ID0gZ2V0cHd1aWQodWlkKTsKKwlyZXR1cm4gKHB3KSA/IHB3LT5wd19uYW1lIDogTlVMTDsKK30KKworY2hhciogRkFTVF9GVU5DIGdpZDJncm91cChnaWRfdCBnaWQpCit7CisJc3RydWN0IGdyb3VwICpnciA9IGdldGdyZ2lkKGdpZCk7CisJcmV0dXJuIChncikgPyBnci0+Z3JfbmFtZSA6IE5VTEw7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyB1aWQydW5hbWVfdXRvYSh1aWRfdCB1aWQpCit7CisJY2hhciAqbmFtZSA9IHVpZDJ1bmFtZSh1aWQpOworCXJldHVybiAobmFtZSkgPyBuYW1lIDogdXRvYSh1aWQpOworfQorCitjaGFyKiBGQVNUX0ZVTkMgZ2lkMmdyb3VwX3V0b2EoZ2lkX3QgZ2lkKQoreworCWNoYXIgKm5hbWUgPSBnaWQyZ3JvdXAoZ2lkKTsKKwlyZXR1cm4gKG5hbWUpID8gbmFtZSA6IHV0b2EoZ2lkKTsKK30KKworbG9uZyBGQVNUX0ZVTkMgeHVuYW1lMnVpZChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBwYXNzd2QgKm15dXNlcjsKKworCW15dXNlciA9IHhnZXRwd25hbShuYW1lKTsKKwlyZXR1cm4gbXl1c2VyLT5wd191aWQ7Cit9CisKK2xvbmcgRkFTVF9GVU5DIHhncm91cDJnaWQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZ3JvdXAgKm15Z3JvdXA7CisKKwlteWdyb3VwID0geGdldGdybmFtKG5hbWUpOworCXJldHVybiBteWdyb3VwLT5ncl9naWQ7Cit9CisKK3Vuc2lnbmVkIGxvbmcgRkFTVF9GVU5DIGdldF91Z19pZChjb25zdCBjaGFyICpzLAorCQlsb25nIEZBU1RfRlVOQyAoKnhuYW1lMmlkKShjb25zdCBjaGFyICopKQoreworCXVuc2lnbmVkIGxvbmcgcjsKKworCXIgPSBiYl9zdHJ0b3VsKHMsIE5VTEwsIDEwKTsKKwlpZiAoZXJybm8pCisJCXJldHVybiB4bmFtZTJpZChzKTsKKwlyZXR1cm4gcjsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2JiX3Fzb3J0LmMgYi9saWJiYi9iYl9xc29ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NGU3MjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9iYl9xc29ydC5jCkBAIC0wLDAgKzEsMjAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFdyYXBwZXIgZm9yIGNvbW1vbiBzdHJpbmcgdmVjdG9yIHNvcnRpbmcgb3BlcmF0aW9uCisgKgorICogQ29weXJpZ2h0IChjKSAyMDA4IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IC8qIG5vdCBGQVNUX0ZVTkMhICovIGJiX3BzdHJjbXAoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKwlyZXR1cm4gc3RyY21wKCooY2hhcioqKWEsICooY2hhcioqKWIpOworfQorCit2b2lkIEZBU1RfRlVOQyBxc29ydF9zdHJpbmdfdmVjdG9yKGNoYXIgKipzdiwgdW5zaWduZWQgY291bnQpCit7CisJcXNvcnQoc3YsIGNvdW50LCBzaXplb2YoY2hhciopLCBiYl9wc3RyY21wKTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2JiX3N0cnRvZC5jIGIvbGliYmIvYmJfc3RydG9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRkZTc4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2JiX3N0cnRvZC5jCkBAIC0wLDAgKzEsODggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bWF0aC5oPiAgLyoganVzdCBmb3IgSFVHRV9WQUwgKi8KKworI2RlZmluZSBOT1RfRElHSVQoYSkgKCgodW5zaWduZWQgY2hhcikoYS0nMCcpKSA+IDkpCisKKyNpZiAwIC8vIFVOVVNFRAorZG91YmxlIEZBU1RfRlVOQyBiYl9zdHJ0b2QoY29uc3QgY2hhciAqYXJnLCBjaGFyICoqZW5kcCkKK3sKKwlkb3VibGUgdjsKKwljaGFyICplbmRwdHI7CisKKwkvKiBBbGxvdyAuTk4gZm9ybS4gUGVvcGxlIHdhbnQgdG8gdXNlICJzbGVlcCAuMTUiIGV0YyAqLworCWlmIChhcmdbMF0gIT0gJy0nICYmIGFyZ1swXSAhPSAnLicgJiYgTk9UX0RJR0lUKGFyZ1swXSkpCisJCWdvdG8gZXJyOworCWVycm5vID0gMDsKKwl2ID0gc3RydG9kKGFyZywgJmVuZHB0cik7CisJaWYgKGVuZHApCisJCSplbmRwID0gZW5kcHRyOworCWlmIChlbmRwdHJbMF0pIHsKKwkJLyogIjEyMzRhYmNnIiBvciBvdXQtb2YtcmFuZ2U/ICovCisJCWlmIChpc2FsbnVtKGVuZHB0clswXSkgfHwgZXJybm8pIHsKKyBlcnI6CisJCQllcnJubyA9IEVSQU5HRTsKKwkJCXJldHVybiBIVUdFX1ZBTDsKKwkJfQorCQkvKiBnb29kIG51bWJlciwganVzdCBzdXNwaWNpb3VzIHRlcm1pbmF0b3IgKi8KKwkJZXJybm8gPSBFSU5WQUw7CisJfQorCXJldHVybiB2OworfQorI2VuZGlmCisKKyNpZiAwCisvKiBTdHJpbmcgdG8gdGltZXNwZWM6ICJOTk5OWy5OTk5OTl0iIC0+IHN0cnVjdCB0aW1lc3BlYy4KKyAqIENhbiBiZSB1c2VkIGZvciBvdGhlciBmaXhlZC1wb2ludCBuZWVkcy4KKyAqIFJldHVybnMgcG9pbnRlciBwYXN0IGxhc3QgY29udmVydGVkIGNoYXIsCisgKiBhbmQgcmV0dXJucyBlcnJubyBzaW1pbGFyIHRvIGJiX3N0cnRvWFggZnVuY3Rpb25zLgorICovCitjaGFyKiBGQVNUX0ZVTkMgYmJfc3RyX3RvX3RzKHN0cnVjdCB0aW1lc3BlYyAqdHMsIGNvbnN0IGNoYXIgKmFyZykKK3sKKwlpZiAoc2l6ZW9mKHRzLT50dl9zZWMpIDw9IHNpemVvZihpbnQpKQorCQl0cy0+dHZfc2VjID0gYmJfc3RydG91KGFyZywgJmFyZywgMTApOworCWVsc2UgaWYgKHNpemVvZih0cy0+dHZfc2VjKSA8PSBzaXplb2YobG9uZykpCisJCXRzLT50dl9zZWMgPSBiYl9zdHJ0b3VsKGFyZywgJmFyZywgMTApOworCWVsc2UKKwkJdHMtPnR2X3NlYyA9IGJiX3N0cnRvdWxsKGFyZywgJmFyZywgMTApOworCXRzLT50dl9uc2VjID0gMDsKKworCWlmICgqYXJnICE9ICcuJykKKwkJcmV0dXJuIGFyZzsKKworCS8qICFFSU5WQUw6IG51bWJlciBpcyBub3Qgb2sgKGFscGhhbnVtZXJpYyBlbmRpbmcsIG92ZXJmbG93IGV0YykgKi8KKwlpZiAoZXJybm8gIT0gRUlOVkFMKQorCQlyZXR1cm4gYXJnOworCisJaWYgKCEqKythcmcpIC8qICJOTk4uIiAqLworCQlyZXR1cm4gYXJnOworCisJeyAvKiAiTk5OLnh4eCIgLSBwYXJzZSB4eHggKi8KKwkJaW50IG5kaWdpdHM7CisJCWNoYXIgKnA7CisJCWNoYXIgYnVmWzEwXTsgLyogd2UgbmV2ZXIgdXNlIG1vcmUgdGhhbiA5IGRpZ2l0cyAqLworCisJCS8qIE5lZWQgdG8gbWFrZSBhIGNvcHkgdG8gYXZvaWQgZmFsc2Ugb3ZlcmZsb3cgKi8KKwkJc2FmZV9zdHJuY3B5KGJ1ZiwgYXJnLCAxMCk7CisJCXRzLT50dl9uc2VjID0gYmJfc3RydG91KGJ1ZiwgJnAsIDEwKTsKKwkJbmRpZ2l0cyA9IHAgLSBidWY7CisJCWFyZyArPSBuZGlnaXRzOworCQkvKiBub3JtYWxpemUgdG8gbnNlYyAqLworCQl3aGlsZSAobmRpZ2l0cyA8IDkpIHsKKwkJCW5kaWdpdHMrKzsKKwkJCXRzLT50dl9uc2VjICo9IDEwOworCQl9CisJCXdoaWxlIChpc2RpZ2l0KCphcmcpKSAvKiBza2lwIHBvc3NpYmxlIDEwdGggcGx1cyBkaWdpdHMgKi8KKwkJCWFyZysrOworCX0KKwlyZXR1cm4gYXJnOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJiYi9iYl9zdHJ0b251bS5jIGIvbGliYmIvYmJfc3RydG9udW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDlmMjZiCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvYmJfc3RydG9udW0uYwpAQCAtMCwwICsxLDE2MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogT24gZXhpdDogZXJybm8gPSAwIG9ubHkgaWYgdGhlcmUgd2FzIG5vbi1lbXB0eSwgJ1wwJyB0ZXJtaW5hdGVkIHZhbHVlCisgKiBlcnJubyA9IEVJTlZBTCBpZiB2YWx1ZSB3YXMgbm90ICdcMCcgdGVybWluYXRlZCwgYnV0IG90aGVyd2lzZSBvaworICogICAgUmV0dXJuIHZhbHVlIGlzIHN0aWxsIHZhbGlkLCBjYWxsZXIgc2hvdWxkIGp1c3QgY2hlY2sgd2hldGhlciBlbmRbMF0KKyAqICAgIGlzIGEgdmFsaWQgdGVybWluYXRpbmcgY2hhciBmb3IgcGFydGljdWxhciBjYXNlLiBPVE9ILCBpZiBjYWxsZXIKKyAqICAgIHJlcXVpcmVzICdcMCcgdGVybWluYXRlZCBpbnB1dCwgW3NdaGUgY2FuIGp1c3QgY2hlY2sgZXJybm8gPT0gMC4KKyAqIGVycm5vID0gRVJBTkdFIGlmIHZhbHVlIGhhZCBhbHBoYW51bWVyaWMgdGVybWluYXRpbmcgY2hhciAoIjEyMzRhYmNnIikuCisgKiBlcnJubyA9IEVSQU5HRSBpZiB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UsIG1pc3NpbmcsIGV0Yy4KKyAqIGVycm5vID0gRVJBTkdFIGlmIHZhbHVlIGhhZCBtaW51cyBzaWduIGZvciBzdHJ0b3VYWCAoZXZlbiAiLTAiIGlzIG5vdCBvayApCisgKiAgICByZXR1cm4gdmFsdWUgaXMgYWxsLW9uZXMgaW4gdGhpcyBjYXNlLgorICoKKyAqIFRlc3QgY29kZToKKyAqIGNoYXIgKmVuZHB0cjsKKyAqIGNvbnN0IGNoYXIgKm1pbnVzID0gIi0iOworICogZXJybm8gPSAwOworICogYmJfc3RydG9pKG1pbnVzLCAmZW5kcHRyLCAwKTsgLy8gbXVzdCBzZXQgRVJBTkdFCisgKiBwcmludGYoIm1pbnVzOiVwIGVuZHB0cjolcCBlcnJubzolZCBFSU5WQUw6JWRcbiIsIG1pbnVzLCBlbmRwdHIsIGVycm5vLCBFSU5WQUwpOworICogZXJybm8gPSAwOworICogYmJfc3RydG9pKCItMC0iLCAmZW5kcHRyLCAwKTsgLy8gbXVzdCBzZXQgRUlOVkFMIGFuZCBwb2ludCB0byBzZWNvbmQgJy0nCisgKiBwcmludGYoImVuZHB0clswXTolYyBlcnJubzolZCBFSU5WQUw6JWRcbiIsIGVuZHB0clswXSwgZXJybm8sIEVJTlZBTCk7CisgKi8KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyByZXRfRVJBTkdFKHZvaWQpCit7CisJZXJybm8gPSBFUkFOR0U7IC8qIHRoaXMgYWluJ3QgYXMgc21hbGwgYXMgaXQgbG9va3MgKG9uIGdsaWJjKSAqLworCXJldHVybiBVTExPTkdfTUFYOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGhhbmRsZV9lcnJvcnModW5zaWduZWQgbG9uZyBsb25nIHYsIGNoYXIgKiplbmRwKQoreworCWNoYXIgbmV4dF9jaCA9ICoqZW5kcDsKKworCS8qIGVycm5vIGlzIGFscmVhZHkgc2V0IHRvIEVSQU5HRSBieSBzdHJ0b1hYWCBpZiB2YWx1ZSBvdmVyZmxvd2VkICovCisJaWYgKG5leHRfY2gpIHsKKwkJLyogIjEyMzRhYmNnIiBvciBvdXQtb2YtcmFuZ2U/ICovCisJCWlmIChpc2FsbnVtKG5leHRfY2gpIHx8IGVycm5vKQorCQkJcmV0dXJuIHJldF9FUkFOR0UoKTsKKwkJLyogZ29vZCBudW1iZXIsIGp1c3Qgc3VzcGljaW91cyB0ZXJtaW5hdG9yICovCisJCWVycm5vID0gRUlOVkFMOworCX0KKwlyZXR1cm4gdjsKK30KKworCit1bnNpZ25lZCBsb25nIGxvbmcgRkFTVF9GVU5DIGJiX3N0cnRvdWxsKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB2OworCWNoYXIgKmVuZHB0cjsKKworCWlmICghZW5kcCkgZW5kcCA9ICZlbmRwdHI7CisJKmVuZHAgPSAoY2hhciopIGFyZzsKKworCS8qIHN0cnRvdWwoIiAgLTQyMDAwMDAwMDAiKSByZXR1cm5zIDk0OTY3Mjk2LCBlcnJubyAwICghKSAqLworCS8qIEkgZG9uJ3QgdGhpbmsgdGhhdCB0aGlzIGlzIHJpZ2h0LiBQcmV2ZW50aW5nIHRoaXMuLi4gKi8KKwlpZiAoIWlzYWxudW0oYXJnWzBdKSkgcmV0dXJuIHJldF9FUkFOR0UoKTsKKworCS8qIG5vdCAxMDAlIGNvcnJlY3QgZm9yIGxpYiBmdW5jLCBidXQgY29udmVuaWVudCBmb3IgdGhlIGNhbGxlciAqLworCWVycm5vID0gMDsKKwl2ID0gc3RydG91bGwoYXJnLCBlbmRwLCBiYXNlKTsKKwlyZXR1cm4gaGFuZGxlX2Vycm9ycyh2LCBlbmRwKTsKK30KKworbG9uZyBsb25nIEZBU1RfRlVOQyBiYl9zdHJ0b2xsKGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB2OworCWNoYXIgKmVuZHB0cjsKKwljaGFyIGZpcnN0OworCisJaWYgKCFlbmRwKSBlbmRwID0gJmVuZHB0cjsKKwkqZW5kcCA9IChjaGFyKikgYXJnOworCisJLyogQ2hlY2sgZm9yIHRoZSB3ZWlyZCAiZmVhdHVyZSI6CisJICogYSAiLSIgc3RyaW5nIGlzIGFwcGFyZW50bHkgYSB2YWxpZCAibnVtYmVyIiBmb3Igc3RydG9bdV1sW2xdIQorCSAqIEl0IHJldHVybnMgemVybyBhbmQgZXJybm8gaXMgMCEgOiggKi8KKwlmaXJzdCA9IChhcmdbMF0gIT0gJy0nID8gYXJnWzBdIDogYXJnWzFdKTsKKwlpZiAoIWlzYWxudW0oZmlyc3QpKSByZXR1cm4gcmV0X0VSQU5HRSgpOworCisJZXJybm8gPSAwOworCXYgPSBzdHJ0b2xsKGFyZywgZW5kcCwgYmFzZSk7CisJcmV0dXJuIGhhbmRsZV9lcnJvcnModiwgZW5kcCk7Cit9CisKKyNpZiBVTE9OR19NQVggIT0gVUxMT05HX01BWAordW5zaWduZWQgbG9uZyBGQVNUX0ZVTkMgYmJfc3RydG91bChjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkKK3sKKwl1bnNpZ25lZCBsb25nIHY7CisJY2hhciAqZW5kcHRyOworCisJaWYgKCFlbmRwKSBlbmRwID0gJmVuZHB0cjsKKwkqZW5kcCA9IChjaGFyKikgYXJnOworCisJaWYgKCFpc2FsbnVtKGFyZ1swXSkpIHJldHVybiByZXRfRVJBTkdFKCk7CisJZXJybm8gPSAwOworCXYgPSBzdHJ0b3VsKGFyZywgZW5kcCwgYmFzZSk7CisJcmV0dXJuIGhhbmRsZV9lcnJvcnModiwgZW5kcCk7Cit9CisKK2xvbmcgRkFTVF9GVU5DIGJiX3N0cnRvbChjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkKK3sKKwlsb25nIHY7CisJY2hhciAqZW5kcHRyOworCWNoYXIgZmlyc3Q7CisKKwlpZiAoIWVuZHApIGVuZHAgPSAmZW5kcHRyOworCSplbmRwID0gKGNoYXIqKSBhcmc7CisKKwlmaXJzdCA9IChhcmdbMF0gIT0gJy0nID8gYXJnWzBdIDogYXJnWzFdKTsKKwlpZiAoIWlzYWxudW0oZmlyc3QpKSByZXR1cm4gcmV0X0VSQU5HRSgpOworCisJZXJybm8gPSAwOworCXYgPSBzdHJ0b2woYXJnLCBlbmRwLCBiYXNlKTsKKwlyZXR1cm4gaGFuZGxlX2Vycm9ycyh2LCBlbmRwKTsKK30KKyNlbmRpZgorCisjaWYgVUlOVF9NQVggIT0gVUxPTkdfTUFYCit1bnNpZ25lZCBGQVNUX0ZVTkMgYmJfc3RydG91KGNvbnN0IGNoYXIgKmFyZywgY2hhciAqKmVuZHAsIGludCBiYXNlKQoreworCXVuc2lnbmVkIGxvbmcgdjsKKwljaGFyICplbmRwdHI7CisKKwlpZiAoIWVuZHApIGVuZHAgPSAmZW5kcHRyOworCSplbmRwID0gKGNoYXIqKSBhcmc7CisKKwlpZiAoIWlzYWxudW0oYXJnWzBdKSkgcmV0dXJuIHJldF9FUkFOR0UoKTsKKwllcnJubyA9IDA7CisJdiA9IHN0cnRvdWwoYXJnLCBlbmRwLCBiYXNlKTsKKwlpZiAodiA+IFVJTlRfTUFYKSByZXR1cm4gcmV0X0VSQU5HRSgpOworCXJldHVybiBoYW5kbGVfZXJyb3JzKHYsIGVuZHApOworfQorCitpbnQgRkFTVF9GVU5DIGJiX3N0cnRvaShjb25zdCBjaGFyICphcmcsIGNoYXIgKiplbmRwLCBpbnQgYmFzZSkKK3sKKwlsb25nIHY7CisJY2hhciAqZW5kcHRyOworCWNoYXIgZmlyc3Q7CisKKwlpZiAoIWVuZHApIGVuZHAgPSAmZW5kcHRyOworCSplbmRwID0gKGNoYXIqKSBhcmc7CisKKwlmaXJzdCA9IChhcmdbMF0gIT0gJy0nID8gYXJnWzBdIDogYXJnWzFdKTsKKwlpZiAoIWlzYWxudW0oZmlyc3QpKSByZXR1cm4gcmV0X0VSQU5HRSgpOworCisJZXJybm8gPSAwOworCXYgPSBzdHJ0b2woYXJnLCBlbmRwLCBiYXNlKTsKKwlpZiAodiA+IElOVF9NQVgpIHJldHVybiByZXRfRVJBTkdFKCk7CisJaWYgKHYgPCBJTlRfTUlOKSByZXR1cm4gcmV0X0VSQU5HRSgpOworCXJldHVybiBoYW5kbGVfZXJyb3JzKHYsIGVuZHApOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJiYi9iYnVuaXQuYyBiL2xpYmJiL2JidW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNjdiMTAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9iYnVuaXQuYwpAQCAtMCwwICsxLDY1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBiYnVuaXQ6IFNpbXBsZSB1bml0LXRlc3RpbmcgZnJhbWV3b3JrIGZvciBCdXN5Ym94LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBieSBCYXJ0b3N6IEdvbGFzemV3c2tpIDxiYXJ0ZWtnb2xhQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19VTklUX1RFU1QpICs9IGJidW5pdC5vCisvL2FwcGxldDpJRl9VTklUX1RFU1QoQVBQTEVUKHVuaXQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL3VzYWdlOiNkZWZpbmUgdW5pdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIHVuaXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSdW4gdGhlIHVuaXQtdGVzdCBzdWl0ZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3N0YXRpYyBsbGlzdF90ICp0ZXN0cyA9IE5VTEw7CitzdGF0aWMgdW5zaWduZWQgdGVzdHNfcmVnaXN0ZXJlZCA9IDA7CitzdGF0aWMgaW50IHRlc3RfcmV0dmFsOworCit2b2lkIGJidW5pdF9yZWdpc3RlcnRlc3Qoc3RydWN0IGJidW5pdF9saXN0ZWxlbSAqdGVzdCkKK3sKKwlsbGlzdF9hZGRfdG9fZW5kKCZ0ZXN0cywgdGVzdCk7CisJdGVzdHNfcmVnaXN0ZXJlZCsrOworfQorCit2b2lkIGJidW5pdF9zZXR0ZXN0ZmFpbGVkKHZvaWQpCit7CisJdGVzdF9yZXR2YWwgPSAtMTsKK30KKworaW50IHVuaXRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdW5pdF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXVuc2lnbmVkIHRlc3RzX3J1biA9IDA7CisJdW5zaWduZWQgdGVzdHNfZmFpbGVkID0gMDsKKworCWJiX2Vycm9yX21zZygiUnVubmluZyAlZCB0ZXN0KHMpLi4uIiwgdGVzdHNfcmVnaXN0ZXJlZCk7CisJZm9yICg7OykgeworCQlzdHJ1Y3QgYmJ1bml0X2xpc3RlbGVtKiBlbCA9IGxsaXN0X3BvcCgmdGVzdHMpOworCQlpZiAoIWVsKQorCQkJYnJlYWs7CisKKwkJYmJfZXJyb3JfbXNnKCJDYXNlOiBbJXNdIiwgZWwtPm5hbWUpOworCQl0ZXN0X3JldHZhbCA9IDA7CisJCWVsLT50ZXN0ZnVuYygpOworCisJCWlmICh0ZXN0X3JldHZhbCA8IDApIHsKKwkJCWJiX2Vycm9yX21zZygiW0VSUk9SXSBbJXNdOiBURVNUIEZBSUxFRCIsIGVsLT5uYW1lKTsKKwkJCXRlc3RzX2ZhaWxlZCsrOworCQl9CisJCXRlc3RzX3J1bisrOworCX0KKworCWlmICh0ZXN0c19mYWlsZWQgPiAwKSB7CisJCWJiX2Vycm9yX21zZygiW0VSUk9SXSAldSB0ZXN0KHMpIEZBSUxFRCIsIHRlc3RzX2ZhaWxlZCk7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCisJYmJfZXJyb3JfbXNnKCJBbGwgdGVzdHMgcGFzc2VkIik7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2NoYW5nZV9pZGVudGl0eS5jIGIvbGliYmIvY2hhbmdlX2lkZW50aXR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ4ZDg2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2NoYW5nZV9pZGVudGl0eS5jCkBAIC0wLDAgKzEsNjAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAxOTg5IC0gMTk5MSwgSnVsaWFubmUgRnJhbmNlcyBIYXVnaCA8am9ja2dycmxAYXVzdGluLnJyLmNvbT4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIEp1bGlhbm5lIEYuIEhhdWdoIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEpVTElFIEhBVUdIIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBKVUxJRSBIQVVHSCBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBCZWNvbWUgdGhlIHVzZXIgYW5kIGdyb3VwKHMpIHNwZWNpZmllZCBieSBQVy4gICovCit2b2lkIEZBU1RfRlVOQyBjaGFuZ2VfaWRlbnRpdHkoY29uc3Qgc3RydWN0IHBhc3N3ZCAqcHcpCit7CisJaW50IHJlczsKKworCXJlcyA9IGluaXRncm91cHMocHctPnB3X25hbWUsIHB3LT5wd19naWQpOworCWVuZGdyZW50KCk7IC8qIGhlbHBzIHRvIGNsb3NlIGEgZmQgdXNlZCBpbnRlcm5hbGx5IGJ5IGxpYmMgKi8KKworCWlmIChyZXMgIT0gMCkgeworCQkvKgorCQkgKiBJZiBpbml0Z3JvdXBzKCkgZmFpbHMgYmVjYXVzZSBhIHN5c3RlbSBjYWxsIGlzIHVuaW1wbGVtZW50ZWQKKwkJICogdGhlbiB3ZSBhcmUgcnVubmluZyBvbiBhIExpbnV4IGtlcm5lbCBjb21waWxlZCB3aXRob3V0IG11bHRpdXNlcgorCQkgKiBzdXBwb3J0IChDT05GSUdfTVVMVElVU0VSIGlzIG5vdCBkZWZpbmVkKS4KKwkJICoKKwkJICogSWYgd2UgYXJlIHJ1bm5pbmcgd2l0aG91dCBtdWx0aXVzZXIgc3VwcG9ydCAqYW5kKiB0aGUgdGFyZ2V0IHVpZAorCQkgKiBhbHJlYWR5IG1hdGNoZXMgdGhlIGN1cnJlbnQgdWlkIHRoZW4gd2UgY2FuIHNraXAgdGhlIGNoYW5nZSBvZgorCQkgKiBpZGVudGl0eS4KKwkJICovCisJCWlmIChlcnJubyA9PSBFTk9TWVMgJiYgcHctPnB3X3VpZCA9PSBnZXR1aWQoKSkgeworCQkJcmV0dXJuOworCQl9CisKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzZXQgZ3JvdXBzIik7CisJfQorCisJeHNldGdpZChwdy0+cHdfZ2lkKTsKKwl4c2V0dWlkKHB3LT5wd191aWQpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvY2hvbXAuYyBiL2xpYmJiL2Nob21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I5MmJlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2Nob21wLmMKQEAgLTAsMCArMSwxOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIG1hbnkgZGlmZmVyZW50IHBlb3BsZS4KKyAqIElmIHlvdSB3cm90ZSB0aGlzLCBwbGVhc2UgYWNrbm93bGVkZ2UgeW91ciB3b3JrLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3ZvaWQgRkFTVF9GVU5DIGNob21wKGNoYXIgKnMpCit7CisJY2hhciAqbGMgPSBsYXN0X2NoYXJfaXMocywgJ1xuJyk7CisKKwlpZiAobGMpCisJCSpsYyA9ICdcMCc7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9jb21wYXJlX3N0cmluZ19hcnJheS5jIGIvbGliYmIvY29tcGFyZV9zdHJpbmdfYXJyYXkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjUxMjM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvY29tcGFyZV9zdHJpbmdfYXJyYXkuYwpAQCAtMCwwICsxLDE3MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyoKKyAqIFJldHVybiBOVUxMIGlmIHN0cmluZyBpcyBub3QgcHJlZml4ZWQgd2l0aCBrZXkuIFJldHVybiBwb2ludGVyIHRvIHRoZQorICogZmlyc3QgY2hhcmFjdGVyIGluIHN0cmluZyBhZnRlciB0aGUgcHJlZml4IGtleS4gSWYga2V5IGlzIGFuIGVtcHR5IHN0cmluZywKKyAqIHJldHVybiBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2Ygc3RyaW5nLgorICovCitjaGFyKiBGQVNUX0ZVTkMgaXNfcHJlZml4ZWRfd2l0aChjb25zdCBjaGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKmtleSkKK3sKKyNpZiAwCS8qIFR3byBwYXNzZXMgb3ZlciBrZXkgLSBwcm9iYWJseSBzbG93ZXIgKi8KKwlpbnQgbGVuID0gc3RybGVuKGtleSk7CisJaWYgKHN0cm5jbXAoc3RyaW5nLCBrZXksIGxlbikgPT0gMCkKKwkJcmV0dXJuIHN0cmluZyArIGxlbjsKKwlyZXR1cm4gTlVMTDsKKyNlbHNlCS8qIE9wZW4tY29kZWQgKi8KKwl3aGlsZSAoKmtleSAhPSAnXDAnKSB7CisJCWlmICgqa2V5ICE9ICpzdHJpbmcpCisJCQlyZXR1cm4gTlVMTDsKKwkJa2V5Kys7CisJCXN0cmluZysrOworCX0KKwlyZXR1cm4gKGNoYXIqKXN0cmluZzsKKyNlbmRpZgorfQorCisvKgorICogUmV0dXJuIE5VTEwgaWYgc3RyaW5nIGlzIG5vdCBzdWZmaXhlZCB3aXRoIGtleS4gUmV0dXJuIHBvaW50ZXIgdG8gdGhlCisgKiBiZWdpbm5pbmcgb2YgcHJlZml4IGtleSBpbiBzdHJpbmcuIElmIGtleSBpcyBhbiBlbXB0eSBzdHJpbmcgcmV0dXJuIHBvaW50ZXIKKyAqIHRvIHRoZSBlbmQgb2Ygc3RyaW5nLgorICovCitjaGFyKiBGQVNUX0ZVTkMgaXNfc3VmZml4ZWRfd2l0aChjb25zdCBjaGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKmtleSkKK3sKKwlzaXplX3Qga2V5X2xlbiA9IHN0cmxlbihrZXkpOworCXNzaXplX3QgbGVuX2RpZmYgPSBzdHJsZW4oc3RyaW5nKSAtIGtleV9sZW47CisKKwlpZiAobGVuX2RpZmYgPj0gMCkgeworCQlzdHJpbmcgKz0gbGVuX2RpZmY7CisJCWlmIChzdHJjbXAoc3RyaW5nLCBrZXkpID09IDApIHsKKwkJCXJldHVybiAoY2hhciopc3RyaW5nOworCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIHJldHVybnMgdGhlIGFycmF5IGluZGV4IG9mIHRoZSBzdHJpbmcgKi8KKy8qIChpbmRleCBvZiBmaXJzdCBtYXRjaCBpcyByZXR1cm5lZCwgb3IgLTEpICovCitpbnQgRkFTVF9GVU5DIGluZGV4X2luX3N0cl9hcnJheShjb25zdCBjaGFyICpjb25zdCBzdHJpbmdfYXJyYXlbXSwgY29uc3QgY2hhciAqa2V5KQoreworCWludCBpOworCisJZm9yIChpID0gMDsgc3RyaW5nX2FycmF5W2ldICE9IDA7IGkrKykgeworCQlpZiAoc3RyY21wKHN0cmluZ19hcnJheVtpXSwga2V5KSA9PSAwKSB7CisJCQlyZXR1cm4gaTsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKK2ludCBGQVNUX0ZVTkMgaW5kZXhfaW5fc3RyaW5ncyhjb25zdCBjaGFyICpzdHJpbmdzLCBjb25zdCBjaGFyICprZXkpCit7CisJaW50IGlkeCA9IDA7CisKKwl3aGlsZSAoKnN0cmluZ3MpIHsKKwkJaWYgKHN0cmNtcChzdHJpbmdzLCBrZXkpID09IDApIHsKKwkJCXJldHVybiBpZHg7CisJCX0KKwkJc3RyaW5ncyArPSBzdHJsZW4oc3RyaW5ncykgKyAxOyAvKiBza2lwIE5VTCAqLworCQlpZHgrKzsKKwl9CisJcmV0dXJuIC0xOworfQorCisvKiByZXR1cm5zIHRoZSBhcnJheSBpbmRleCBvZiB0aGUgc3RyaW5nLCBldmVuIGlmIGl0IG1hdGNoZXMgb25seSBhIGJlZ2lubmluZyAqLworLyogKGluZGV4IG9mIGZpcnN0IG1hdGNoIGlzIHJldHVybmVkLCBvciAtMSkgKi8KKyNpZmRlZiBVTlVTRUQKK2ludCBGQVNUX0ZVTkMgaW5kZXhfaW5fc3Vic3RyX2FycmF5KGNvbnN0IGNoYXIgKmNvbnN0IHN0cmluZ19hcnJheVtdLCBjb25zdCBjaGFyICprZXkpCit7CisJaW50IGk7CisJaWYgKGtleVswXSkgeworCQlmb3IgKGkgPSAwOyBzdHJpbmdfYXJyYXlbaV0gIT0gMDsgaSsrKSB7CisJCQlpZiAoaXNfcHJlZml4ZWRfd2l0aChzdHJpbmdfYXJyYXlbaV0sIGtleSkpIHsKKwkJCQlyZXR1cm4gaTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisjZW5kaWYKKworaW50IEZBU1RfRlVOQyBpbmRleF9pbl9zdWJzdHJpbmdzKGNvbnN0IGNoYXIgKnN0cmluZ3MsIGNvbnN0IGNoYXIgKmtleSkKK3sKKwlpbnQgbWF0Y2hlZF9pZHggPSAtMTsKKwljb25zdCBpbnQgbGVuID0gc3RybGVuKGtleSk7CisKKwlpZiAobGVuKSB7CisJCWludCBpZHggPSAwOworCQl3aGlsZSAoKnN0cmluZ3MpIHsKKwkJCWlmIChzdHJuY21wKHN0cmluZ3MsIGtleSwgbGVuKSA9PSAwKSB7CisJCQkJaWYgKHN0cmluZ3NbbGVuXSA9PSAnXDAnKQorCQkJCQlyZXR1cm4gaWR4OyAvKiBleGFjdCBtYXRjaCAqLworCQkJCWlmIChtYXRjaGVkX2lkeCA+PSAwKQorCQkJCQlyZXR1cm4gLTE7IC8qIGFtYmlndW91cyBtYXRjaCAqLworCQkJCW1hdGNoZWRfaWR4ID0gaWR4OworCQkJfQorCQkJc3RyaW5ncyArPSBzdHJsZW4oc3RyaW5ncykgKyAxOyAvKiBza2lwIE5VTCAqLworCQkJaWR4Kys7CisJCX0KKwl9CisJcmV0dXJuIG1hdGNoZWRfaWR4OworfQorCitjb25zdCBjaGFyKiBGQVNUX0ZVTkMgbnRoX3N0cmluZyhjb25zdCBjaGFyICpzdHJpbmdzLCBpbnQgbikKK3sKKwl3aGlsZSAobikgeworCQluLS07CisJCXN0cmluZ3MgKz0gc3RybGVuKHN0cmluZ3MpICsgMTsKKwl9CisJcmV0dXJuIHN0cmluZ3M7Cit9CisKKyNpZmRlZiBVTlVTRURfU09fRkFSIC8qIG9ubHkgYnJjdGwuYyBuZWVkcyBpdCB5ZXQgKi8KKy8qIFJldHVybnMgMCBmb3Igbm8sIDEgZm9yIHllcyBvciBhIG5lZ2F0aXZlIHZhbHVlIG9uIGVycm9yLiAgKi8KK3NtYWxsaW50IEZBU1RfRlVOQyB5ZXNubyhjb25zdCBjaGFyICpzdHIpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgbm9feWVzW10gQUxJR04xID0KKwkJIjBcMCIgIm9mZlwwIiAibm9cMCIKKwkJIjFcMCIgIm9uXDAiICJ5ZXNcMCI7CisJaW50IHJldCA9IGluZGV4X2luX3N1YnN0cmluZ3Mobm9feWVzLCBzdHIpOworCXJldHVybiByZXQgLyAzOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfVU5JVF9URVNUCisKK0JCVU5JVF9ERUZJTkVfVEVTVChpc19wcmVmaXhlZF93aXRoKQoreworCUJCVU5JVF9BU1NFUlRfU1RSRVEoIiBiYXIiLCBpc19wcmVmaXhlZF93aXRoKCJmb28gYmFyIiwgImZvbyIpKTsKKwlCQlVOSVRfQVNTRVJUX1NUUkVRKCJiYXIiLCBpc19wcmVmaXhlZF93aXRoKCJmb28gYmFyIiwgImZvbyAiKSk7CisJQkJVTklUX0FTU0VSVF9TVFJFUSgiIiwgaXNfcHJlZml4ZWRfd2l0aCgiZm9vIiwgImZvbyIpKTsKKwlCQlVOSVRfQVNTRVJUX1NUUkVRKCJmb28iLCBpc19wcmVmaXhlZF93aXRoKCJmb28iLCAiIikpOworCUJCVU5JVF9BU1NFUlRfU1RSRVEoIiIsIGlzX3ByZWZpeGVkX3dpdGgoIiIsICIiKSk7CisKKwlCQlVOSVRfQVNTRVJUX05VTEwoaXNfcHJlZml4ZWRfd2l0aCgiZm9vIiwgImJhciBmb28iKSk7CisJQkJVTklUX0FTU0VSVF9OVUxMKGlzX3ByZWZpeGVkX3dpdGgoImZvbyBmb28iLCAiYmFyIikpOworCUJCVU5JVF9BU1NFUlRfTlVMTChpc19wcmVmaXhlZF93aXRoKCIiLCAiZm9vIikpOworCisJQkJVTklUX0VORFRFU1Q7Cit9CisKK0JCVU5JVF9ERUZJTkVfVEVTVChpc19zdWZmaXhlZF93aXRoKQoreworCUJCVU5JVF9BU1NFUlRfU1RSRVEoImJhciIsIGlzX3N1ZmZpeGVkX3dpdGgoImZvbyBiYXIiLCAiYmFyIikpOworCUJCVU5JVF9BU1NFUlRfU1RSRVEoImZvbyIsIGlzX3N1ZmZpeGVkX3dpdGgoImZvbyIsICJmb28iKSk7CisJQkJVTklUX0FTU0VSVF9TVFJFUSgiIiwgaXNfc3VmZml4ZWRfd2l0aCgiZm9vIiwgIiIpKTsKKwlCQlVOSVRfQVNTRVJUX1NUUkVRKCIiLCBpc19zdWZmaXhlZF93aXRoKCIiLCAiIikpOworCUJCVU5JVF9BU1NFUlRfU1RSRVEoImZvbyIsIGlzX3N1ZmZpeGVkX3dpdGgoImJhcmZvb2ZvbyIsICJmb28iKSk7CisKKwlCQlVOSVRfQVNTRVJUX05VTEwoaXNfc3VmZml4ZWRfd2l0aCgiZm9vIiwgImJhciBmb28iKSk7CisJQkJVTklUX0FTU0VSVF9OVUxMKGlzX3N1ZmZpeGVkX3dpdGgoImZvbyBmb28iLCAiYmFyIikpOworCUJCVU5JVF9BU1NFUlRfTlVMTChpc19zdWZmaXhlZF93aXRoKCIiLCAiZm9vIikpOworCisJQkJVTklUX0VORFRFU1Q7Cit9CisKKyNlbmRpZiAvKiBFTkFCTEVfVU5JVF9URVNUICovCmRpZmYgLS1naXQgYS9saWJiYi9jb25jYXRfcGF0aF9maWxlLmMgYi9saWJiYi9jb25jYXRfcGF0aF9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVkMjk1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2NvbmNhdF9wYXRoX2ZpbGUuYwpAQCAtMCwwICsxLDI5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgbWFueSBkaWZmZXJlbnQgcGVvcGxlLgorICogSWYgeW91IHdyb3RlIHRoaXMsIHBsZWFzZSBhY2tub3dsZWRnZSB5b3VyIHdvcmsuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBDb25jYXRlbmF0ZSBwYXRoIGFuZCBmaWxlbmFtZSB0byBuZXcgYWxsb2NhdGVkIGJ1ZmZlci4KKyAqIEFkZCAnLycgb25seSBhcyBuZWVkZWQgKG5vIGR1cGxpY2F0ZSAvLyBhcmUgcHJvZHVjZWQpLgorICogSWYgcGF0aCBpcyBOVUxMLCBpdCBpcyBhc3N1bWVkIHRvIGJlICIvIi4KKyAqIGZpbGVuYW1lIHNob3VsZCBub3QgYmUgTlVMTC4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworY2hhciogRkFTVF9GVU5DIGNvbmNhdF9wYXRoX2ZpbGUoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJY2hhciAqbGM7CisKKwlpZiAoIXBhdGgpCisJCXBhdGggPSAiIjsKKwlsYyA9IGxhc3RfY2hhcl9pcyhwYXRoLCAnLycpOworCXdoaWxlICgqZmlsZW5hbWUgPT0gJy8nKQorCQlmaWxlbmFtZSsrOworCXJldHVybiB4YXNwcmludGYoIiVzJXMlcyIsIHBhdGgsIChsYz09TlVMTCA/ICIvIiA6ICIiKSwgZmlsZW5hbWUpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvY29uY2F0X3N1YnBhdGhfZmlsZS5jIGIvbGliYmIvY29uY2F0X3N1YnBhdGhfZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MTY3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9jb25jYXRfc3VicGF0aF9maWxlLmMKQEAgLTAsMCArMSwyMyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIChDKSAyMDAzICBWbGFkaW1pciBPbGV5bmlrICA8ZHpvQHNpbXRyZWFzLnJ1PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKKyAgIFRoaXMgZnVuY3Rpb24gbWFrZSBzcGVjaWFsIGZvciByZWN1cnNpdmUgYWN0aW9ucyB3aXRoIHVzYWdlCisgICBjb25jYXRfcGF0aF9maWxlKHBhdGgsIGZpbGVuYW1lKQorICAgYW5kIHNraXBwaW5nICIuIiBhbmQgIi4uIiBkaXJlY3RvcnkgZW50cmllcworKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2NoYXIqIEZBU1RfRlVOQyBjb25jYXRfc3VicGF0aF9maWxlKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKmYpCit7CisJaWYgKGYgJiYgRE9UX09SX0RPVERPVChmKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIGNvbmNhdF9wYXRoX2ZpbGUocGF0aCwgZik7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9jb3B5X2ZpbGUuYyBiL2xpYmJiL2NvcHlfZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YmU4NzUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9jb3B5X2ZpbGUuYwpAQCAtMCwwICsxLDM5NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBjb3B5X2ZpbGUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgTWF0dCBLcmFhaSA8a3JhYWlAYWx1bW5pLmNhcm5lZ2llbWVsbG9uLmVkdT4KKyAqIFNFTGludXggc3VwcG9ydCBieSBZdWljaGkgTmFrYW11cmEgPHluYWthbUBoaXRhY2hpc29mdC5qcD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworLy8gRkVBVFVSRV9OT05fUE9TSVhfQ1A6CisvLworLy8gUE9TSVg6IGlmIGV4aXN0cyBhbmQgLWksIGFzayAody9vIC1pIGFzc3VtZSB5ZXMpLgorLy8gVGhlbiBvcGVuIHcvbyBFWENMICh5ZXMsIG5vdCB1bmxpbmshKS4KKy8vIElmIG9wZW4gc3RpbGwgZmFpbHMgYW5kIC1mLCB0cnkgdW5saW5rLCB0aGVuIHRyeSBvcGVuIGFnYWluLgorLy8gUmVzdWx0OiBhIG1lc3M6CisvLyBJZiBkZXN0IGlzIGEgKHN5bSlsaW5rLCB3ZSBvdmVyd3JpdGUgbGluayBkZXN0aW5hdGlvbiEKKy8vIChvciBmYWlsLCBpZiBpdCBwb2ludHMgdG8gZGlyL25vbmV4aXN0ZW50IGxvY2F0aW9uL2V0YykuCisvLyBUaGlzIGlzIHN0cmFuZ2UsIGJ1dCBQT1NJWC1jb3JyZWN0LgorLy8gY29yZXV0aWxzIGNwIGhhcyAtLXJlbW92ZS1kZXN0aW5hdGlvbiB0byBvdmVycmlkZSB0aGlzLi4uCisKKy8qIENhbGxlZCBpZiBvcGVuIG9mIGRlc3RpbmF0aW9uLCBsaW5rIGNyZWF0aW9uIGV0YyBmYWlscy4KKyAqIGVycm5vIG11c3QgYmUgc2V0IHRvIHJlbGV2YW50IHZhbHVlICgid2h5IHdlIGNhbm5vdCBjcmVhdGUgZGVzdD8iKQorICogdG8gZ2l2ZSByZWFzb25hYmxlIGVycm9yIG1lc3NhZ2UgKi8KK3N0YXRpYyBpbnQgYXNrX2FuZF91bmxpbmsoY29uc3QgY2hhciAqZGVzdCwgaW50IGZsYWdzKQoreworCWludCBlID0gZXJybm87CisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfTk9OX1BPU0lYX0NQCisJaWYgKCEoZmxhZ3MgJiAoRklMRVVUSUxTX0ZPUkNFfEZJTEVVVElMU19JTlRFUkFDVElWRSkpKSB7CisJCS8qIEVpdGhlciBpdCBleGlzdHMsIG9yIHRoZSAqcGF0aCogZG9lc250IGV4aXN0ICovCisJCWJiX3BlcnJvcl9tc2coImNhbid0IGNyZWF0ZSAnJXMnIiwgZGVzdCk7CisJCXJldHVybiAtMTsKKwl9CisjZW5kaWYKKwkvLyBlbHNlOiBhY3QgYXMgaWYgLWYgaXMgYWx3YXlzIGluIGVmZmVjdC4KKwkvLyBXZSBkb24ndCB3YW50ICJjYW4ndCBjcmVhdGUiIG1zZywgd2Ugd2FudCB1bmxpbmsgdG8gYmUgZG9uZQorCS8vIChzaWxlbnRseSB1bmxlc3MgLWkpLiBXaHk/IFBPU0lYIGNwIHVzdWFsbHkgc3VjY2VlZHMgd2l0aAorCS8vIE9fVFJVTkMgb3BlbiBvZiBleGlzdGluZyBmaWxlLCBhbmQgdXNlciBpcyBsZWZ0IGlnbm9yYW50bHkgaGFwcHkuCisJLy8gV2l0aCBhYm92ZSBibG9jayB1bmNvbmRpdGlvbmFsbHkgZW5hYmxlZCwgbm9uLVBPU0lYIGNwCisJLy8gd2lsbCBjb21wbGFpbiBhIGxvdCBtb3JlIHRoYW4gUE9TSVggb25lLgorCisJLyogVE9ETzogbWF5YmUgd2Ugc2hvdWxkIGRvIGl0IG9ubHkgaWYgY3R0eSBpcyBwcmVzZW50PyAqLworCWlmIChmbGFncyAmIEZJTEVVVElMU19JTlRFUkFDVElWRSkgeworCQkvLyBXZSB3b3VsZCBub3QgZG8gUE9TSVggaW5zYW5pdHkuIC1pIGFza3MsCisJCS8vIHRoZW4gX3VubGlua3NfIHRoZSBvZmZlbmRlci4gUHJlc3RvLgorCQkvLyAoTm8gIm9wZW5pbmcgd2l0aG91dCBPX0VYQ0wiLCBubyAidW5saW5rIG9ubHkgaWYgLWYiKQorCQkvLyBPciBlbHNlIHdlIHdpbGwgZW5kIHVwIGhhdmluZyAzIG9wZW4oKXMhCisJCWZwcmludGYoc3RkZXJyLCAiJXM6IG92ZXJ3cml0ZSAnJXMnPyAiLCBhcHBsZXRfbmFtZSwgZGVzdCk7CisJCWlmICghYmJfYXNrX2NvbmZpcm1hdGlvbigpKQorCQkJcmV0dXJuIDA7IC8qIG5vdCBhbGxvd2VkIHRvIG92ZXJ3cml0ZSAqLworCX0KKwlpZiAodW5saW5rKGRlc3QpIDwgMCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX1ZFUkJPU0VfQ1BfTUVTU0FHRQorCQlpZiAoZSA9PSBlcnJubyAmJiBlID09IEVOT0VOVCkgeworCQkJLyogZSA9PSBFTk9URElSIGlzIHNpbWlsYXI6IHBhdGggaGFzIG5vbi1kaXIgY29tcG9uZW50LAorCQkJICogYnV0IGluIHRoaXMgY2FzZSB3ZSBkb24ndCBldmVuIHJlYWNoIGNvcHlfZmlsZSgpICovCisJCQliYl9lcnJvcl9tc2coImNhbid0IGNyZWF0ZSAnJXMnOiBQYXRoIGRvZXMgbm90IGV4aXN0IiwgZGVzdCk7CisJCQlyZXR1cm4gLTE7IC8qIGVycm9yICovCisJCX0KKyNlbmRpZgorCQllcnJubyA9IGU7IC8qIGRvIG5vdCB1c2UgZXJybm8gZnJvbSB1bmxpbmsgKi8KKwkJYmJfcGVycm9yX21zZygiY2FuJ3QgY3JlYXRlICclcyciLCBkZXN0KTsKKwkJcmV0dXJuIC0xOyAvKiBlcnJvciAqLworCX0KKwlyZXR1cm4gMTsgLyogb2sgKHRvIHRyeSBhZ2FpbikgKi8KK30KKworLyogUmV0dXJuOgorICogLTEgZXJyb3IsIGNvcHkgbm90IG1hZGUKKyAqICAwIGNvcHkgaXMgbWFkZSBvciB1c2VyIGFuc3dlcmVkICJubyIgaW4gaW50ZXJhY3RpdmUgbW9kZQorICogICAgKGZhaWx1cmVzIHRvIHByZXNlcnZlIG1vZGUvb3duZXIvdGltZXMgYXJlIG5vdCByZXBvcnRlZCBpbiBleGl0IGNvZGUpCisgKi8KK2ludCBGQVNUX0ZVTkMgY29weV9maWxlKGNvbnN0IGNoYXIgKnNvdXJjZSwgY29uc3QgY2hhciAqZGVzdCwgaW50IGZsYWdzKQoreworCS8qIFRoaXMgaXMgYSByZWN1cnNpdmUgZnVuY3Rpb24sIHRyeSB0byBtaW5pbWl6ZSBzdGFjayB1c2FnZSAqLworCS8qIE5COiBlYWNoIHN0cnVjdCBzdGF0IGlzIH4xMDAgYnl0ZXMgKi8KKwlzdHJ1Y3Qgc3RhdCBzb3VyY2Vfc3RhdDsKKwlzdHJ1Y3Qgc3RhdCBkZXN0X3N0YXQ7CisJc21hbGxpbnQgcmV0dmFsID0gMDsKKwlzbWFsbGludCBkZXN0X2V4aXN0cyA9IDA7CisJc21hbGxpbnQgb3ZyOworCisvKiBJbnZlcnNlIG9mIGNwIC1kICgiY3Agd2l0aG91dCAtZCIpICovCisjZGVmaW5lIEZMQUdTX0RFUkVGIChmbGFncyAmIChGSUxFVVRJTFNfREVSRUZFUkVOQ0UgKyBGSUxFVVRJTFNfREVSRUZFUkVOQ0VfTDApKQorCisJaWYgKChGTEFHU19ERVJFRiA/IHN0YXQgOiBsc3RhdCkoc291cmNlLCAmc291cmNlX3N0YXQpIDwgMCkgeworCQkvKiBUaGlzIG1heSBiZSBhIGRhbmdsaW5nIHN5bWxpbmsuCisJCSAqIE1ha2luZyBbc3ltXWxpbmtzIHRvIGRhbmdsaW5nIHN5bWxpbmtzIHdvcmtzLCBzby4uLiAqLworCQlpZiAoZmxhZ3MgJiAoRklMRVVUSUxTX01BS0VfU09GVExJTkt8RklMRVVUSUxTX01BS0VfSEFSRExJTkspKQorCQkJZ290byBtYWtlX2xpbmtzOworCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBzdGF0ICclcyciLCBzb3VyY2UpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGxzdGF0KGRlc3QsICZkZXN0X3N0YXQpIDwgMCkgeworCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBzdGF0ICclcyciLCBkZXN0KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChzb3VyY2Vfc3RhdC5zdF9kZXYgPT0gZGVzdF9zdGF0LnN0X2RldgorCQkgJiYgc291cmNlX3N0YXQuc3RfaW5vID09IGRlc3Rfc3RhdC5zdF9pbm8KKwkJKSB7CisJCQliYl9lcnJvcl9tc2coIiclcycgYW5kICclcycgYXJlIHRoZSBzYW1lIGZpbGUiLCBzb3VyY2UsIGRlc3QpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWRlc3RfZXhpc3RzID0gMTsKKwl9CisKKyNpZiBFTkFCTEVfU0VMSU5VWAorCWlmICgoZmxhZ3MgJiBGSUxFVVRJTFNfUFJFU0VSVkVfU0VDVVJJVFlfQ09OVEVYVCkgJiYgaXNfc2VsaW51eF9lbmFibGVkKCkgPiAwKSB7CisJCXNlY3VyaXR5X2NvbnRleHRfdCBjb247CisJCWlmIChsZ2V0ZmlsZWNvbihzb3VyY2UsICZjb24pID49IDApIHsKKwkJCWlmIChzZXRmc2NyZWF0ZWNvbihjb24pIDwgMCkgeworCQkJCWJiX3BlcnJvcl9tc2coImNhbid0IHNldCBzZXRmc2NyZWF0ZWNvbiAlcyIsIGNvbik7CisJCQkJZnJlZWNvbihjb24pOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfSBlbHNlIGlmIChlcnJubyA9PSBFTk9UU1VQIHx8IGVycm5vID09IEVOT0RBVEEpIHsKKwkJCXNldGZzY3JlYXRlY29uX29yX2RpZShOVUxMKTsKKwkJfSBlbHNlIHsKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IGxnZXRmaWxlY29uICVzIiwgc291cmNlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKFNfSVNESVIoc291cmNlX3N0YXQuc3RfbW9kZSkpIHsKKwkJRElSICpkcDsKKwkJY29uc3QgY2hhciAqdHA7CisJCXN0cnVjdCBkaXJlbnQgKmQ7CisJCW1vZGVfdCBzYXZlZF91bWFzayA9IDA7CisKKwkJaWYgKCEoZmxhZ3MgJiBGSUxFVVRJTFNfUkVDVVIpKSB7CisJCQliYl9lcnJvcl9tc2coIm9taXR0aW5nIGRpcmVjdG9yeSAnJXMnIiwgc291cmNlKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCS8qIERpZCB3ZSBldmVyIGNyZWF0ZSBzb3VyY2Ugb3Vyc2VsZiBiZWZvcmU/ICovCisJCXRwID0gaXNfaW5faW5vX2Rldl9oYXNodGFibGUoJnNvdXJjZV9zdGF0KTsKKwkJaWYgKHRwKSB7CisJCQkvKiBXZSBkaWQhIGl0J3MgYSByZWN1cnNpb24hIG1hbiB0aGUgbGlmZWJvYXRzLi4uICovCisJCQliYl9lcnJvcl9tc2coInJlY3Vyc2lvbiBkZXRlY3RlZCwgb21pdHRpbmcgZGlyZWN0b3J5ICclcyciLAorCQkJCQlzb3VyY2UpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKGRlc3RfZXhpc3RzKSB7CisJCQlpZiAoIVNfSVNESVIoZGVzdF9zdGF0LnN0X21vZGUpKSB7CisJCQkJYmJfZXJyb3JfbXNnKCJ0YXJnZXQgJyVzJyBpcyBub3QgYSBkaXJlY3RvcnkiLCBkZXN0KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQkvKiByYWNlIGhlcmU6IHVzZXIgY2FuIHN1YnN0aXR1dGUgYSBzeW1saW5rIGJldHdlZW4KKwkJCSAqIHRoaXMgY2hlY2sgYW5kIGFjdHVhbCBjcmVhdGlvbiBvZiBmaWxlcyBpbnNpZGUgZGVzdCAqLworCQl9IGVsc2UgeworCQkJLyogQ3JlYXRlIERFU1QgKi8KKwkJCW1vZGVfdCBtb2RlOworCQkJc2F2ZWRfdW1hc2sgPSB1bWFzaygwKTsKKworCQkJbW9kZSA9IHNvdXJjZV9zdGF0LnN0X21vZGU7CisJCQlpZiAoIShmbGFncyAmIEZJTEVVVElMU19QUkVTRVJWRV9TVEFUVVMpKQorCQkJCW1vZGUgPSBzb3VyY2Vfc3RhdC5zdF9tb2RlICYgfnNhdmVkX3VtYXNrOworCQkJLyogQWxsb3cgb3duZXIgdG8gYWNjZXNzIG5ldyBkaXIgKGF0IGxlYXN0IGZvciBub3cpICovCisJCQltb2RlIHw9IFNfSVJXWFU7CisJCQlpZiAobWtkaXIoZGVzdCwgbW9kZSkgPCAwKSB7CisJCQkJdW1hc2soc2F2ZWRfdW1hc2spOworCQkJCWJiX3BlcnJvcl9tc2coImNhbid0IGNyZWF0ZSBkaXJlY3RvcnkgJyVzJyIsIGRlc3QpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCXVtYXNrKHNhdmVkX3VtYXNrKTsKKwkJCS8qIG5lZWQgc3RhdCBpbmZvIGZvciBhZGRfdG9faW5vX2Rldl9oYXNodGFibGUgKi8KKwkJCWlmIChsc3RhdChkZXN0LCAmZGVzdF9zdGF0KSA8IDApIHsKKwkJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBzdGF0ICclcyciLCBkZXN0KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKwkJLyogcmVtZW1iZXIgKGRldixpbm9kZSkgb2YgZWFjaCBjcmVhdGVkIGRpci4KKwkJICogTlVMTDogbmFtZSBpcyBub3QgcmVtZW1iZXJlZCAqLworCQlhZGRfdG9faW5vX2Rldl9oYXNodGFibGUoJmRlc3Rfc3RhdCwgTlVMTCk7CisKKwkJLyogUmVjdXJzaXZlbHkgY29weSBmaWxlcyBpbiBTT1VSQ0UgKi8KKwkJZHAgPSBvcGVuZGlyKHNvdXJjZSk7CisJCWlmIChkcCA9PSBOVUxMKSB7CisJCQlyZXR2YWwgPSAtMTsKKwkJCWdvdG8gcHJlc2VydmVfbW9kZV91Z2lkX3RpbWU7CisJCX0KKworCQl3aGlsZSAoKGQgPSByZWFkZGlyKGRwKSkgIT0gTlVMTCkgeworCQkJY2hhciAqbmV3X3NvdXJjZSwgKm5ld19kZXN0OworCisJCQluZXdfc291cmNlID0gY29uY2F0X3N1YnBhdGhfZmlsZShzb3VyY2UsIGQtPmRfbmFtZSk7CisJCQlpZiAobmV3X3NvdXJjZSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJbmV3X2Rlc3QgPSBjb25jYXRfcGF0aF9maWxlKGRlc3QsIGQtPmRfbmFtZSk7CisJCQlpZiAoY29weV9maWxlKG5ld19zb3VyY2UsIG5ld19kZXN0LCBmbGFncyAmIH5GSUxFVVRJTFNfREVSRUZFUkVOQ0VfTDApIDwgMCkKKwkJCQlyZXR2YWwgPSAtMTsKKwkJCWZyZWUobmV3X3NvdXJjZSk7CisJCQlmcmVlKG5ld19kZXN0KTsKKwkJfQorCQljbG9zZWRpcihkcCk7CisKKwkJaWYgKCFkZXN0X2V4aXN0cworCQkgJiYgY2htb2QoZGVzdCwgc291cmNlX3N0YXQuc3RfbW9kZSAmIH5zYXZlZF91bWFzaykgPCAwCisJCSkgeworCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgcHJlc2VydmUgJXMgb2YgJyVzJyIsICJwZXJtaXNzaW9ucyIsIGRlc3QpOworCQkJLyogcmV0dmFsID0gLTE7IC0gV1JPTkchIGNvcHkgKldBUyogbWFkZSAqLworCQl9CisJCWdvdG8gcHJlc2VydmVfbW9kZV91Z2lkX3RpbWU7CisJfQorCisJaWYgKGZsYWdzICYgKEZJTEVVVElMU19NQUtFX1NPRlRMSU5LfEZJTEVVVElMU19NQUtFX0hBUkRMSU5LKSkgeworCQlpbnQgKCpsZikoY29uc3QgY2hhciAqb2xkcGF0aCwgY29uc3QgY2hhciAqbmV3cGF0aCk7CisgbWFrZV9saW5rczoKKwkJLyogSG1tLi4uIG1heWJlCisJCSAqIGlmIChERVJFRiAmJiBNQUtFX1NPRlRMSU5LKSBzb3VyY2UgPSByZWFscGF0aChzb3VyY2UpID8KKwkJICogKGJ1dCByZWFscGF0aCByZXR1cm5zIE5VTEwgb24gZGFuZ2xpbmcgc3ltbGlua3MuLi4pICovCisJCWxmID0gKGZsYWdzICYgRklMRVVUSUxTX01BS0VfU09GVExJTkspID8gc3ltbGluayA6IGxpbms7CisJCWlmIChsZihzb3VyY2UsIGRlc3QpIDwgMCkgeworCQkJb3ZyID0gYXNrX2FuZF91bmxpbmsoZGVzdCwgZmxhZ3MpOworCQkJaWYgKG92ciA8PSAwKQorCQkJCXJldHVybiBvdnI7CisJCQlpZiAobGYoc291cmNlLCBkZXN0KSA8IDApIHsKKwkJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjcmVhdGUgbGluayAnJXMnIiwgZGVzdCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQl9CisJCS8qIF9Ob3RfIGp1bXBpbmcgdG8gcHJlc2VydmVfbW9kZV91Z2lkX3RpbWU6CisJCSAqIChzeW0pbGlua3MgZG9uJ3QgaGF2ZSB0aG9zZSAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoLyogImNwIHRoaW5nMSB0aGluZzIiIHdpdGhvdXQgLVI6IGp1c3Qgb3BlbiBhbmQgcmVhZCgpIGZyb20gdGhpbmcxICovCisJICAgICEoZmxhZ3MgJiBGSUxFVVRJTFNfUkVDVVIpCisJICAgIC8qICJjcCBbLW9wdHNdIHJlZ3VsYXJfZmlsZSB0aGluZzIiICovCisJIHx8IFNfSVNSRUcoc291cmNlX3N0YXQuc3RfbW9kZSkKKwkgLyogREVSRUYgdXNlcyBzdGF0LCB3aGljaCBuZXZlciByZXR1cm5zIFNfSVNMTksoKSA9PSB0cnVlLgorCSAgKiBTbyB0aGUgYmVsb3cgaXMgbmV2ZXIgdHJ1ZTogKi8KKwkgLyogfHwgKEZMQUdTX0RFUkVGICYmIFNfSVNMTksoc291cmNlX3N0YXQuc3RfbW9kZSkpICovCisJKSB7CisJCWludCBzcmNfZmQ7CisJCWludCBkc3RfZmQ7CisJCW1vZGVfdCBuZXdfbW9kZTsKKworCQlpZiAoIUZMQUdTX0RFUkVGICYmIFNfSVNMTksoc291cmNlX3N0YXQuc3RfbW9kZSkpIHsKKwkJCS8qICJjcCAtZCBzeW1saW5rIGRzdCI6IGNyZWF0ZSBhIGxpbmsgKi8KKwkJCWdvdG8gZG9udF9jYXQ7CisJCX0KKworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfUFJFU0VSVkVfSEFSRExJTktTICYmICFGTEFHU19ERVJFRikgeworCQkJY29uc3QgY2hhciAqbGlua190YXJnZXQ7CisJCQlsaW5rX3RhcmdldCA9IGlzX2luX2lub19kZXZfaGFzaHRhYmxlKCZzb3VyY2Vfc3RhdCk7CisJCQlpZiAobGlua190YXJnZXQpIHsKKwkJCQlpZiAobGluayhsaW5rX3RhcmdldCwgZGVzdCkgPCAwKSB7CisJCQkJCW92ciA9IGFza19hbmRfdW5saW5rKGRlc3QsIGZsYWdzKTsKKwkJCQkJaWYgKG92ciA8PSAwKQorCQkJCQkJcmV0dXJuIG92cjsKKwkJCQkJaWYgKGxpbmsobGlua190YXJnZXQsIGRlc3QpIDwgMCkgeworCQkJCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgY3JlYXRlIGxpbmsgJyVzJyIsIGRlc3QpOworCQkJCQkJcmV0dXJuIC0xOworCQkJCQl9CisJCQkJfQorCQkJCXJldHVybiAwOworCQkJfQorCQkJYWRkX3RvX2lub19kZXZfaGFzaHRhYmxlKCZzb3VyY2Vfc3RhdCwgZGVzdCk7CisJCX0KKworCQlzcmNfZmQgPSBvcGVuX29yX3dhcm4oc291cmNlLCBPX1JET05MWSk7CisJCWlmIChzcmNfZmQgPCAwKQorCQkJcmV0dXJuIC0xOworCisJCS8qIERvIG5vdCB0cnkgdG8gb3BlbiB3aXRoIHdlaXJkIG1vZGUgZmllbGRzICovCisJCW5ld19tb2RlID0gc291cmNlX3N0YXQuc3RfbW9kZTsKKwkJaWYgKCFTX0lTUkVHKHNvdXJjZV9zdGF0LnN0X21vZGUpKQorCQkJbmV3X21vZGUgPSAwNjY2OworCisJCS8vIFBPU0lYIHdheSBpcyBhIHNlY3VyaXR5IHByb2JsZW0gdmVyc3VzIChzeW0pbGluayBhdHRhY2tzCisJCWlmICghRU5BQkxFX0ZFQVRVUkVfTk9OX1BPU0lYX0NQKSB7CisJCQlkc3RfZmQgPSBvcGVuKGRlc3QsIE9fV1JPTkxZfE9fQ1JFQVR8T19UUlVOQywgbmV3X21vZGUpOworCQl9IGVsc2UgeyAvKiBzYWZlIHdheTogKi8KKwkJCWRzdF9mZCA9IG9wZW4oZGVzdCwgT19XUk9OTFl8T19DUkVBVHxPX0VYQ0wsIG5ld19tb2RlKTsKKwkJfQorCQlpZiAoZHN0X2ZkID09IC0xKSB7CisJCQlvdnIgPSBhc2tfYW5kX3VubGluayhkZXN0LCBmbGFncyk7CisJCQlpZiAob3ZyIDw9IDApIHsKKwkJCQljbG9zZShzcmNfZmQpOworCQkJCXJldHVybiBvdnI7CisJCQl9CisJCQkvKiBJdCBzaG91bGRuJ3QgZXhpc3QuIElmIGl0IGV4aXN0cywgZG8gbm90IG9wZW4gKHN5bWxpbmsgYXR0YWNrPykgKi8KKwkJCWRzdF9mZCA9IG9wZW4zX29yX3dhcm4oZGVzdCwgT19XUk9OTFl8T19DUkVBVHxPX0VYQ0wsIG5ld19tb2RlKTsKKwkJCWlmIChkc3RfZmQgPCAwKSB7CisJCQkJY2xvc2Uoc3JjX2ZkKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCX0KKworI2lmIEVOQUJMRV9TRUxJTlVYCisJCWlmICgoZmxhZ3MgJiAoRklMRVVUSUxTX1BSRVNFUlZFX1NFQ1VSSVRZX0NPTlRFWFR8RklMRVVUSUxTX1NFVF9TRUNVUklUWV9DT05URVhUKSkKKwkJICYmIGlzX3NlbGludXhfZW5hYmxlZCgpID4gMAorCQkpIHsKKwkJCXNlY3VyaXR5X2NvbnRleHRfdCBjb247CisJCQlpZiAoZ2V0ZnNjcmVhdGVjb24oJmNvbikgPT0gLTEpIHsKKwkJCQliYl9wZXJyb3JfbXNnKCJnZXRmc2NyZWF0ZWNvbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChjb24pIHsKKwkJCQlpZiAoc2V0ZmlsZWNvbihkZXN0LCBjb24pID09IC0xKSB7CisJCQkJCWJiX3BlcnJvcl9tc2coInNldGZpbGVjb246JXMsJXMiLCBkZXN0LCBjb24pOworCQkJCQlmcmVlY29uKGNvbik7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJZnJlZWNvbihjb24pOworCQkJfQorCQl9CisjZW5kaWYKKwkJaWYgKGJiX2NvcHlmZF9lb2Yoc3JjX2ZkLCBkc3RfZmQpID09IC0xKQorCQkJcmV0dmFsID0gLTE7CisJCS8qIENhcmVmdWwgd2l0aCB3cml0aW5nLi4uICovCisJCWlmIChjbG9zZShkc3RfZmQpIDwgMCkgeworCQkJYmJfcGVycm9yX21zZygiZXJyb3Igd3JpdGluZyB0byAnJXMnIiwgZGVzdCk7CisJCQlyZXR2YWwgPSAtMTsKKwkJfQorCQkvKiAuLi5idXQgcmVhZCBzaXplIGlzIGFscmVhZHkgY2hlY2tlZCBieSBiYl9jb3B5ZmRfZW9mICovCisJCWNsb3NlKHNyY19mZCk7CisJCS8qICJjcCAvZGV2L3NvbWV0aGluZyBuZXdfZmlsZSIgc2hvdWxkIG5vdAorCQkgKiBjb3B5IG1vZGUgb2YgL2Rldi9zb21ldGhpbmcgKi8KKwkJaWYgKCFTX0lTUkVHKHNvdXJjZV9zdGF0LnN0X21vZGUpKQorCQkJcmV0dXJuIHJldHZhbDsKKwkJZ290byBwcmVzZXJ2ZV9tb2RlX3VnaWRfdGltZTsKKwl9CisgZG9udF9jYXQ6CisKKwkvKiBTb3VyY2UgaXMgYSBzeW1saW5rIG9yIGEgc3BlY2lhbCBmaWxlICovCisJLyogV2UgYXJlIGxhenkgaGVyZSwgYSBiaXQgbGF4IHdpdGggcmFjZXMuLi4gKi8KKwlpZiAoZGVzdF9leGlzdHMpIHsKKwkJZXJybm8gPSBFRVhJU1Q7CisJCW92ciA9IGFza19hbmRfdW5saW5rKGRlc3QsIGZsYWdzKTsKKwkJaWYgKG92ciA8PSAwKQorCQkJcmV0dXJuIG92cjsKKwl9CisJaWYgKFNfSVNMTksoc291cmNlX3N0YXQuc3RfbW9kZSkpIHsKKwkJY2hhciAqbHBhdGggPSB4bWFsbG9jX3JlYWRsaW5rX29yX3dhcm4oc291cmNlKTsKKwkJaWYgKGxwYXRoKSB7CisJCQlpbnQgciA9IHN5bWxpbmsobHBhdGgsIGRlc3QpOworCQkJZnJlZShscGF0aCk7CisJCQlpZiAociA8IDApIHsKKwkJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjcmVhdGUgc3ltbGluayAnJXMnIiwgZGVzdCk7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYgKGZsYWdzICYgRklMRVVUSUxTX1BSRVNFUlZFX1NUQVRVUykKKwkJCQlpZiAobGNob3duKGRlc3QsIHNvdXJjZV9zdGF0LnN0X3VpZCwgc291cmNlX3N0YXQuc3RfZ2lkKSA8IDApCisJCQkJCWJiX3BlcnJvcl9tc2coImNhbid0IHByZXNlcnZlICVzIG9mICclcyciLCAib3duZXJzaGlwIiwgZGVzdCk7CisJCX0KKwkJLyogX05vdF8ganVtcGluZyB0byBwcmVzZXJ2ZV9tb2RlX3VnaWRfdGltZToKKwkJICogc3ltbGlua3MgZG9uJ3QgaGF2ZSB0aG9zZSAqLworCQlyZXR1cm4gMDsKKwl9CisJaWYgKFNfSVNCTEsoc291cmNlX3N0YXQuc3RfbW9kZSkgfHwgU19JU0NIUihzb3VyY2Vfc3RhdC5zdF9tb2RlKQorCSB8fCBTX0lTU09DSyhzb3VyY2Vfc3RhdC5zdF9tb2RlKSB8fCBTX0lTRklGTyhzb3VyY2Vfc3RhdC5zdF9tb2RlKQorCSkgeworCQlpZiAobWtub2QoZGVzdCwgc291cmNlX3N0YXQuc3RfbW9kZSwgc291cmNlX3N0YXQuc3RfcmRldikgPCAwKSB7CisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjcmVhdGUgJyVzJyIsIGRlc3QpOworCQkJcmV0dXJuIC0xOworCQl9CisJfSBlbHNlIHsKKwkJYmJfZXJyb3JfbXNnKCJ1bnJlY29nbml6ZWQgZmlsZSAnJXMnIHdpdGggbW9kZSAleCIsIHNvdXJjZSwgc291cmNlX3N0YXQuc3RfbW9kZSk7CisJCXJldHVybiAtMTsKKwl9CisKKyBwcmVzZXJ2ZV9tb2RlX3VnaWRfdGltZToKKworCWlmIChmbGFncyAmIEZJTEVVVElMU19QUkVTRVJWRV9TVEFUVVMKKwkvKiBDYW5ub3QgaGFwcGVuOiAqLworCS8qICYmICEoZmxhZ3MgJiAoRklMRVVUSUxTX01BS0VfU09GVExJTkt8RklMRVVUSUxTX01BS0VfSEFSRExJTkspKSAqLworCSkgeworCQlzdHJ1Y3QgdGltZXZhbCB0aW1lc1syXTsKKworCQl0aW1lc1sxXS50dl9zZWMgPSB0aW1lc1swXS50dl9zZWMgPSBzb3VyY2Vfc3RhdC5zdF9tdGltZTsKKwkJdGltZXNbMV0udHZfdXNlYyA9IHRpbWVzWzBdLnR2X3VzZWMgPSAwOworCQkvKiBCVFcsIHV0aW1lcyBzZXRzIHVzZWMtcHJlY2lzaW9uIHRpbWUgLSBqdXN0IEZZSSAqLworCQlpZiAodXRpbWVzKGRlc3QsIHRpbWVzKSA8IDApCisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBwcmVzZXJ2ZSAlcyBvZiAnJXMnIiwgInRpbWVzIiwgZGVzdCk7CisJCWlmIChjaG93bihkZXN0LCBzb3VyY2Vfc3RhdC5zdF91aWQsIHNvdXJjZV9zdGF0LnN0X2dpZCkgPCAwKSB7CisJCQlzb3VyY2Vfc3RhdC5zdF9tb2RlICY9IH4oU19JU1VJRCB8IFNfSVNHSUQpOworCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgcHJlc2VydmUgJXMgb2YgJyVzJyIsICJvd25lcnNoaXAiLCBkZXN0KTsKKwkJfQorCQlpZiAoY2htb2QoZGVzdCwgc291cmNlX3N0YXQuc3RfbW9kZSkgPCAwKQorCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgcHJlc2VydmUgJXMgb2YgJyVzJyIsICJwZXJtaXNzaW9ucyIsIGRlc3QpOworCX0KKworCWlmIChmbGFncyAmIEZJTEVVVElMU19WRVJCT1NFKSB7CisJCXByaW50ZigiJyVzJyAtPiAnJXMnXG4iLCBzb3VyY2UsIGRlc3QpOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9jb3B5ZmQuYyBiL2xpYmJiL2NvcHlmZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMzUzMTkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9jb3B5ZmQuYwpAQCAtMCwwICsxLDE2MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9VU0VfU0VOREZJTEUKKyMgaW5jbHVkZSA8c3lzL3NlbmRmaWxlLmg+CisjZWxzZQorIyBkZWZpbmUgc2VuZGZpbGUoYSxiLGMsZCkgKC0xKQorI2VuZGlmCisKKy8qCisgKiBXZSB3ZXJlIHVzaW5nIDB4N2ZmZjAwMDAgYXMgc2VuZGZpbGUgY2h1bmsgc2l6ZSwgYnV0IGl0CisgKiB3YXMgc2VlbiB0byBjYXVzZSBsYXJnaXNoIGRlbGF5cyB3aGVuIHVzZXIgdHJpZXMgdG8gXkMgYSBmaWxlIGNvcHkuCisgKiBMZXQncyB1c2UgYSBzYW5lciBzaXplLgorICogTm90ZTogbmVlZHMgdG8gYmUgPj0gbWF4KENPTkZJR19GRUFUVVJFX0NPUFlCVUZfS0IpLAorICogb3IgZWxzZSAiY29weSB0byBlb2YiIGNvZGUgd2lsbCB1c2UgbmVkZGxlc2x5IHNob3J0IHJlYWRzLgorICovCisjZGVmaW5lIFNFTkRGSUxFX0JJR0JVRiAoMTYqMTAyNCoxMDI0KQorCisvKiBVc2VkIGJ5IE5PRk9SSyBhcHBsZXRzIChlLmcuIGNhdCkgLSBtdXN0IG5vdCB1c2UgeG1hbGxvYy4KKyAqIHNpemUgPCAwIG1lYW5zICJpZ25vcmUgd3JpdGUgZXJyb3JzIiwgdXNlZCBieSB0YXIgLS10by1jb21tYW5kCisgKiBzaXplID0gMCBtZWFucyAiY29weSB0aWxsIEVPRiIKKyAqLworc3RhdGljIG9mZl90IGJiX2Z1bGxfZmRfYWN0aW9uKGludCBzcmNfZmQsIGludCBkc3RfZmQsIG9mZl90IHNpemUpCit7CisJaW50IHN0YXR1cyA9IC0xOworCW9mZl90IHRvdGFsID0gMDsKKwlib29sIGNvbnRpbnVlX29uX3dyaXRlX2Vycm9yID0gMDsKKwlzc2l6ZV90IHNlbmRmaWxlX3N6OworI2lmIENPTkZJR19GRUFUVVJFX0NPUFlCVUZfS0IgPiA0CisJY2hhciAqYnVmZmVyID0gYnVmZmVyOyAvKiBmb3IgY29tcGlsZXIgKi8KKwlpbnQgYnVmZmVyX3NpemUgPSAwOworI2Vsc2UKKwljaGFyIGJ1ZmZlcltDT05GSUdfRkVBVFVSRV9DT1BZQlVGX0tCICogMTAyNF07CisJZW51bSB7IGJ1ZmZlcl9zaXplID0gc2l6ZW9mKGJ1ZmZlcikgfTsKKyNlbmRpZgorCisJaWYgKHNpemUgPCAwKSB7CisJCXNpemUgPSAtc2l6ZTsKKwkJY29udGludWVfb25fd3JpdGVfZXJyb3IgPSAxOworCX0KKworCWlmIChzcmNfZmQgPCAwKQorCQlnb3RvIG91dDsKKworCXNlbmRmaWxlX3N6ID0gIUVOQUJMRV9GRUFUVVJFX1VTRV9TRU5ERklMRQorCQk/IDAKKwkJOiBTRU5ERklMRV9CSUdCVUY7CisJaWYgKCFzaXplKSB7CisJCXNpemUgPSBTRU5ERklMRV9CSUdCVUY7CisJCXN0YXR1cyA9IDE7IC8qIGNvcHkgdW50aWwgZW9mICovCisJfQorCisJd2hpbGUgKDEpIHsKKwkJc3NpemVfdCByZDsKKworCQlpZiAoc2VuZGZpbGVfc3opIHsKKwkJCXJkID0gc2VuZGZpbGUoZHN0X2ZkLCBzcmNfZmQsIE5VTEwsCisJCQkJc2l6ZSA+IHNlbmRmaWxlX3N6ID8gc2VuZGZpbGVfc3ogOiBzaXplKTsKKwkJCWlmIChyZCA+PSAwKQorCQkJCWdvdG8gcmVhZF9vazsKKwkJCXNlbmRmaWxlX3N6ID0gMDsgLyogZG8gbm90IHRyeSBzZW5kZmlsZSBhbnltb3JlICovCisJCX0KKyNpZiBDT05GSUdfRkVBVFVSRV9DT1BZQlVGX0tCID4gNAorCQlpZiAoYnVmZmVyX3NpemUgPT0gMCkgeworCQkJaWYgKHNpemUgPiAwICYmIHNpemUgPD0gNCAqIDEwMjQpCisJCQkJZ290byB1c2Vfc21hbGxfYnVmOworCQkJLyogV2Ugd2FudCBwYWdlLWFsaWduZWQgYnVmZmVyLCBqdXN0IGluIGNhc2Uga2VybmVsIGlzIGNsZXZlcgorCQkJICogYW5kIGNhbiBkbyBwYWdlLWFsaWduZWQgaW8gbW9yZSBlZmZpY2llbnRseSAqLworCQkJYnVmZmVyID0gbW1hcChOVUxMLCBDT05GSUdfRkVBVFVSRV9DT1BZQlVGX0tCICogMTAyNCwKKwkJCQkJUFJPVF9SRUFEIHwgUFJPVF9XUklURSwKKwkJCQkJTUFQX1BSSVZBVEUgfCBNQVBfQU5PTiwKKwkJCQkJLyogaWdub3JlZDogKi8gLTEsIDApOworCQkJYnVmZmVyX3NpemUgPSBDT05GSUdfRkVBVFVSRV9DT1BZQlVGX0tCICogMTAyNDsKKwkJCWlmIChidWZmZXIgPT0gTUFQX0ZBSUxFRCkgeworIHVzZV9zbWFsbF9idWY6CisJCQkJYnVmZmVyID0gYWxsb2NhKDQgKiAxMDI0KTsKKwkJCQlidWZmZXJfc2l6ZSA9IDQgKiAxMDI0OworCQkJfQorCQl9CisjZW5kaWYKKwkJcmQgPSBzYWZlX3JlYWQoc3JjX2ZkLCBidWZmZXIsCisJCQlzaXplID4gYnVmZmVyX3NpemUgPyBidWZmZXJfc2l6ZSA6IHNpemUpOworCQlpZiAocmQgPCAwKSB7CisJCQliYl9wZXJyb3JfbXNnKGJiX21zZ19yZWFkX2Vycm9yKTsKKwkJCWJyZWFrOworCQl9CisgcmVhZF9vazoKKwkJaWYgKCFyZCkgeyAvKiBlb2YgLSBhbGwgZG9uZSAqLworCQkJc3RhdHVzID0gMDsKKwkJCWJyZWFrOworCQl9CisJCS8qIGRzdF9mZCA9PSAtMSBpcyBhIGZha2UsIGVsc2UuLi4gKi8KKwkJaWYgKGRzdF9mZCA+PSAwICYmICFzZW5kZmlsZV9zeikgeworCQkJc3NpemVfdCB3ciA9IGZ1bGxfd3JpdGUoZHN0X2ZkLCBidWZmZXIsIHJkKTsKKwkJCWlmICh3ciA8IHJkKSB7CisJCQkJaWYgKCFjb250aW51ZV9vbl93cml0ZV9lcnJvcikgeworCQkJCQliYl9wZXJyb3JfbXNnKGJiX21zZ193cml0ZV9lcnJvcik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlkc3RfZmQgPSAtMTsKKwkJCX0KKwkJfQorCQl0b3RhbCArPSByZDsKKwkJaWYgKHN0YXR1cyA8IDApIHsgLyogaWYgd2UgYXJlbid0IGNvcHlpbmcgdGlsbCBFT0YuLi4gKi8KKwkJCXNpemUgLT0gcmQ7CisJCQlpZiAoIXNpemUpIHsKKwkJCQkvKiAnc2l6ZScgYnl0ZXMgY29waWVkIC0gYWxsIGRvbmUgKi8KKwkJCQlzdGF0dXMgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorIG91dDoKKworCWlmIChidWZmZXJfc2l6ZSA+IDQgKiAxMDI0KQorCQltdW5tYXAoYnVmZmVyLCBidWZmZXJfc2l6ZSk7CisJcmV0dXJuIHN0YXR1cyA/IC0xIDogdG90YWw7Cit9CisKKworI2lmIDAKK3ZvaWQgRkFTVF9GVU5DIGNvbXBsYWluX2NvcHlmZF9hbmRfZGllKG9mZl90IHN6KQoreworCWlmIChzeiAhPSAtMSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInNob3J0IHJlYWQiKTsKKwkvKiBpZiBzeiA9PSAtMSwgYmJfY29weWZkX1hYIGFscmVhZHkgY29tcGxhaW5lZCAqLworCXhmdW5jX2RpZSgpOworfQorI2VuZGlmCisKK29mZl90IEZBU1RfRlVOQyBiYl9jb3B5ZmRfc2l6ZShpbnQgZmQxLCBpbnQgZmQyLCBvZmZfdCBzaXplKQoreworCWlmIChzaXplKSB7CisJCXJldHVybiBiYl9mdWxsX2ZkX2FjdGlvbihmZDEsIGZkMiwgc2l6ZSk7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIEZBU1RfRlVOQyBiYl9jb3B5ZmRfZXhhY3Rfc2l6ZShpbnQgZmQxLCBpbnQgZmQyLCBvZmZfdCBzaXplKQoreworCW9mZl90IHN6ID0gYmJfY29weWZkX3NpemUoZmQxLCBmZDIsIHNpemUpOworCWlmIChzeiA9PSAoc2l6ZSA+PSAwID8gc2l6ZSA6IC1zaXplKSkKKwkJcmV0dXJuOworCWlmIChzeiAhPSAtMSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInNob3J0IHJlYWQiKTsKKwkvKiBpZiBzeiA9PSAtMSwgYmJfY29weWZkX1hYIGFscmVhZHkgY29tcGxhaW5lZCAqLworCXhmdW5jX2RpZSgpOworfQorCitvZmZfdCBGQVNUX0ZVTkMgYmJfY29weWZkX2VvZihpbnQgZmQxLCBpbnQgZmQyKQoreworCXJldHVybiBiYl9mdWxsX2ZkX2FjdGlvbihmZDEsIGZkMiwgMCk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9jb3JyZWN0X3Bhc3N3b3JkLmMgYi9saWJiYi9jb3JyZWN0X3Bhc3N3b3JkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTEzYzkzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2NvcnJlY3RfcGFzc3dvcmQuYwpAQCAtMCwwICsxLDEyNCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IDE5ODkgLSAxOTkxLCBKdWxpYW5uZSBGcmFuY2VzIEhhdWdoIDxqb2NrZ3JybEBhdXN0aW4ucnIuY29tPgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgSnVsaWFubmUgRi4gSGF1Z2ggbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgSlVMSUUgSEFVR0ggQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIEpVTElFIEhBVUdIIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgU0hBRE9XX0JVRlNJWkUgMjU2CisKKy8qIFJldHJpZXZlIGVuY3J5cHRlZCBwYXNzd29yZCBzdHJpbmcgZm9yIHB3LgorICogSWYgcHcgPT0gTlVMTCwgcmV0dXJuIGEgc3RyaW5nIHdoaWNoIGZhaWxzIHBhc3N3b3JkIGNoZWNrIGFnYWluc3QgYW55CisgKiBwYXNzd29yZC4KKyAqLworI2lmICFFTkFCTEVfRkVBVFVSRV9TSEFET1dQQVNTV0RTCisjZGVmaW5lIGdldF9wYXNzd2QocHcsIGJ1ZmZlcikgZ2V0X3Bhc3N3ZChwdykKKyNlbmRpZgorc3RhdGljIGNvbnN0IGNoYXIgKmdldF9wYXNzd2QoY29uc3Qgc3RydWN0IHBhc3N3ZCAqcHcsIGNoYXIgYnVmZmVyW1NIQURPV19CVUZTSVpFXSkKK3sKKwljb25zdCBjaGFyICpwYXNzOworCisJaWYgKCFwdykKKwkJcmV0dXJuICJhYSI7IC8qICJhYSIgd2lsbCBuZXZlciBtYXRjaCAqLworCisJcGFzcyA9IHB3LT5wd19wYXNzd2Q7CisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hBRE9XUEFTU1dEUworCS8qIFVzaW5nIF9yIGZ1bmN0aW9uIHRvIGF2b2lkIHB1bGxpbmcgaW4gc3RhdGljIGJ1ZmZlcnMgKi8KKwlpZiAoKHBhc3NbMF0gPT0gJ3gnIHx8IHBhc3NbMF0gPT0gJyonKSAmJiAhcGFzc1sxXSkgeworCQlzdHJ1Y3Qgc3B3ZCBzcHc7CisJCWludCByOworCQkvKiBnZXRzcG5hbV9yIG1heSByZXR1cm4gMCB5ZXQgc2V0IHJlc3VsdCB0byBOVUxMLgorCQkgKiBBdCBsZWFzdCBnbGliYyAyLjQgZG9lcyB0aGlzLiBCZSBleHRyYSBwYXJhbm9pZCBoZXJlLiAqLworCQlzdHJ1Y3Qgc3B3ZCAqcmVzdWx0ID0gTlVMTDsKKwkJciA9IGdldHNwbmFtX3IocHctPnB3X25hbWUsICZzcHcsIGJ1ZmZlciwgU0hBRE9XX0JVRlNJWkUsICZyZXN1bHQpOworCQlwYXNzID0gKHIgfHwgIXJlc3VsdCkgPyAiYWEiIDogcmVzdWx0LT5zcF9wd2RwOworCX0KKyNlbmRpZgorCXJldHVybiBwYXNzOworfQorCisvKgorICogUmV0dXJuIDEgaWYgUFcgaGFzIGFuIGVtcHR5IHBhc3N3b3JkLgorICogUmV0dXJuIDEgaWYgdGhlIHVzZXIgZ2l2ZXMgdGhlIGNvcnJlY3QgcGFzc3dvcmQgZm9yIGVudHJ5IFBXLAorICogMCBpZiBub3QuCisgKiBOVUxMIHB3IG1lYW5zICJqdXN0IGZha2UgaXQgZm9yIGxvZ2luIHdpdGggYmFkIHVzZXJuYW1lIgorICovCitpbnQgRkFTVF9GVU5DIGNoZWNrX3Bhc3N3b3JkKGNvbnN0IHN0cnVjdCBwYXNzd2QgKnB3LCBjb25zdCBjaGFyICpwbGFpbnRleHQpCit7CisJSUZfRkVBVFVSRV9TSEFET1dQQVNTV0RTKGNoYXIgYnVmZmVyW1NIQURPV19CVUZTSVpFXTspCisJY2hhciAqZW5jcnlwdGVkOworCWNvbnN0IGNoYXIgKnB3X3Bhc3M7CisJaW50IHI7CisKKwlwd19wYXNzID0gZ2V0X3Bhc3N3ZChwdywgYnVmZmVyKTsKKwlpZiAoIXB3X3Bhc3NbMF0pIHsgLyogZW1wdHkgcGFzc3dvcmQgZmllbGQ/ICovCisJCXJldHVybiAxOworCX0KKworCWVuY3J5cHRlZCA9IHB3X2VuY3J5cHQocGxhaW50ZXh0LCAvKnNhbHQ6Ki8gcHdfcGFzcywgMSk7CisJciA9IChzdHJjbXAoZW5jcnlwdGVkLCBwd19wYXNzKSA9PSAwKTsKKwlmcmVlKGVuY3J5cHRlZCk7CisJcmV0dXJuIHI7Cit9CisKKworLyogQXNrIHRoZSB1c2VyIGZvciBhIHBhc3N3b3JkLgorICogUmV0dXJuIDEgd2l0aG91dCBhc2tpbmcgaWYgUFcgaGFzIGFuIGVtcHR5IHBhc3N3b3JkLgorICogUmV0dXJuIC0xIG9uIEVPRiwgZXJyb3Igd2hpbGUgcmVhZGluZyBpbnB1dCwgb3IgdGltZW91dC4KKyAqIFJldHVybiAxIGlmIHRoZSB1c2VyIGdpdmVzIHRoZSBjb3JyZWN0IHBhc3N3b3JkIGZvciBlbnRyeSBQVywKKyAqIDAgaWYgbm90LgorICoKKyAqIE5VTEwgcHcgbWVhbnMgImp1c3QgZmFrZSBpdCBmb3IgbG9naW4gd2l0aCBiYWQgdXNlcm5hbWUiCisgKi8KK2ludCBGQVNUX0ZVTkMgYXNrX2FuZF9jaGVja19wYXNzd29yZF9leHRlbmRlZChjb25zdCBzdHJ1Y3QgcGFzc3dkICpwdywKKwkJaW50IHRpbWVvdXQsIGNvbnN0IGNoYXIgKnByb21wdCkKK3sKKwlJRl9GRUFUVVJFX1NIQURPV1BBU1NXRFMoY2hhciBidWZmZXJbU0hBRE9XX0JVRlNJWkVdOykKKwljaGFyICpwbGFpbnRleHQ7CisJY29uc3QgY2hhciAqcHdfcGFzczsKKwlpbnQgcjsKKworCXB3X3Bhc3MgPSBnZXRfcGFzc3dkKHB3LCBidWZmZXIpOworCWlmICghcHdfcGFzc1swXSkgLyogZW1wdHkgcGFzc3dvcmQgZmllbGQ/ICovCisJCXJldHVybiAxOworCisJcGxhaW50ZXh0ID0gYmJfYXNrKFNURElOX0ZJTEVOTywgdGltZW91dCwgcHJvbXB0KTsKKwlpZiAoIXBsYWludGV4dCkgeworCQkvKiBFT0YgKHN1Y2ggYXMgXkQpIG9yIGVycm9yIChzdWNoIGFzIF5DKSBvciB0aW1lb3V0ICovCisJCXJldHVybiAtMTsKKwl9CisKKwlyID0gY2hlY2tfcGFzc3dvcmQocHcsIHBsYWludGV4dCk7CisJbnVrZV9zdHIocGxhaW50ZXh0KTsKKwlyZXR1cm4gcjsKK30KKworaW50IEZBU1RfRlVOQyBhc2tfYW5kX2NoZWNrX3Bhc3N3b3JkKGNvbnN0IHN0cnVjdCBwYXNzd2QgKnB3KQoreworCXJldHVybiBhc2tfYW5kX2NoZWNrX3Bhc3N3b3JkX2V4dGVuZGVkKHB3LCAwLCAiUGFzc3dvcmQ6ICIpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvY3JjMzIuYyBiL2xpYmJiL2NyYzMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM5ODM2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2NyYzMyLmMKQEAgLTAsMCArMSw2NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ1JDMzIgdGFibGUgZmlsbCBmdW5jdGlvbgorICogQ29weXJpZ2h0IChDKSAyMDA2IGJ5IFJvYiBTdWxsaXZhbiA8Y29naXRvLmVyZ28uY29naXRvQGdtYWlsLmNvbT4KKyAqIChJIGNhbid0IHJlYWxseSBjbGFpbSBtdWNoIGNyZWRpdCBob3dldmVyLCBhcyB0aGUgYWxnb3JpdGhtIGlzCisgKiB2ZXJ5IHdlbGwta25vd24pCisgKgorICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBjcmVhdGVzIGEgQ1JDMzIgdGFibGUgZGVwZW5kaW5nIG9uIHdoZXRoZXIKKyAqIGEgYmlnLWVuZGlhbiAoMHgwNGMxMWRiNykgb3IgbGl0dGxlLWVuZGlhbiAoMHhlZGI4ODMyMCkgQ1JDMzIgaXMKKyAqIHJlcXVpcmVkLiBBZG1pdHRlZGx5LCB0aGVyZSBhcmUgb3RoZXIgQ1JDMzIgcG9seW5vbWlhbHMgZmxvYXRpbmcKKyAqIGFyb3VuZCwgYnV0IEJ1c3lib3ggZG9lc24ndCB1c2UgdGhlbS4KKyAqCisgKiBlbmRpYW4gPSAxOiBiaWctZW5kaWFuCisgKiBlbmRpYW4gPSAwOiBsaXR0bGUtZW5kaWFuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKwordWludDMyX3QgKmdsb2JhbF9jcmMzMl90YWJsZTsKKwordWludDMyX3QqIEZBU1RfRlVOQyBjcmMzMl9maWxsdGFibGUodWludDMyX3QgKmNyY190YWJsZSwgaW50IGVuZGlhbikKK3sKKwl1aW50MzJfdCBwb2x5bm9taWFsID0gZW5kaWFuID8gMHgwNGMxMWRiNyA6IDB4ZWRiODgzMjA7CisJdWludDMyX3QgYzsKKwlpbnQgaSwgajsKKworCWlmICghY3JjX3RhYmxlKQorCQljcmNfdGFibGUgPSB4bWFsbG9jKDI1NiAqIHNpemVvZih1aW50MzJfdCkpOworCisJZm9yIChpID0gMDsgaSA8IDI1NjsgaSsrKSB7CisJCWMgPSBlbmRpYW4gPyAoaSA8PCAyNCkgOiBpOworCQlmb3IgKGogPSA4OyBqOyBqLS0pIHsKKwkJCWlmIChlbmRpYW4pCisJCQkJYyA9IChjJjB4ODAwMDAwMDApID8gKChjIDw8IDEpIF4gcG9seW5vbWlhbCkgOiAoYyA8PCAxKTsKKwkJCWVsc2UKKwkJCQljID0gKGMmMSkgPyAoKGMgPj4gMSkgXiBwb2x5bm9taWFsKSA6IChjID4+IDEpOworCQl9CisJCSpjcmNfdGFibGUrKyA9IGM7CisJfQorCisJcmV0dXJuIGNyY190YWJsZSAtIDI1NjsKK30KKwordWludDMyX3QgRkFTVF9GVU5DIGNyYzMyX2Jsb2NrX2VuZGlhbjEodWludDMyX3QgdmFsLCBjb25zdCB2b2lkICpidWYsIHVuc2lnbmVkIGxlbiwgdWludDMyX3QgKmNyY190YWJsZSkKK3sKKwljb25zdCB2b2lkICplbmQgPSAodWludDhfdCopYnVmICsgbGVuOworCisJd2hpbGUgKGJ1ZiAhPSBlbmQpIHsKKwkJdmFsID0gKHZhbCA8PCA4KSBeIGNyY190YWJsZVsodmFsID4+IDI0KSBeICoodWludDhfdCopYnVmXTsKKwkJYnVmID0gKHVpbnQ4X3QqKWJ1ZiArIDE7CisJfQorCXJldHVybiB2YWw7Cit9CisKK3VpbnQzMl90IEZBU1RfRlVOQyBjcmMzMl9ibG9ja19lbmRpYW4wKHVpbnQzMl90IHZhbCwgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBsZW4sIHVpbnQzMl90ICpjcmNfdGFibGUpCit7CisJY29uc3Qgdm9pZCAqZW5kID0gKHVpbnQ4X3QqKWJ1ZiArIGxlbjsKKworCXdoaWxlIChidWYgIT0gZW5kKSB7CisJCXZhbCA9IGNyY190YWJsZVsodWludDhfdCl2YWwgXiAqKHVpbnQ4X3QqKWJ1Zl0gXiAodmFsID4+IDgpOworCQlidWYgPSAodWludDhfdCopYnVmICsgMTsKKwl9CisJcmV0dXJuIHZhbDsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2RlZmF1bHRfZXJyb3JfcmV0dmFsLmMgYi9saWJiYi9kZWZhdWx0X2Vycm9yX3JldHZhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNjM5NWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9kZWZhdWx0X2Vycm9yX3JldHZhbC5jCkBAIC0wLDAgKzEsMTggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogU2VlbXMgc2lsbHkgdG8gY29weXJpZ2h0IGEgZ2xvYmFsIHZhcmlhYmxlLiAgOy0pICBPaCB3ZWxsLgorICoKKyAqIEF0IGxlYXN0IG9uZSBhcHBsZXQgKGNtcCkgcmV0dXJucyBhIHZhbHVlIGRpZmZlcmVudCBmcm9tIHRoZSB0eXBpY2FsCisgKiBFWElUX0ZBSUxVUkUgdmFsdWVzICgxKSB3aGVuIGFuIGVycm9yIG9jY3Vycy4gIFNvLCBtYWtlIGl0IGNvbmZpZ3VyYWJsZQorICogYnkgdGhlIGFwcGxldC4gIEkgc3VwcG9zZSB3ZSBjb3VsZCB1c2UgYSB3cmFwcGVyIGZ1bmN0aW9uIHRvIHNldCBpdCwgYnV0CisgKiB0aGF0IHRvbyBzZWVtcyBzaWxseS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKwordWludDhfdCB4ZnVuY19lcnJvcl9yZXR2YWwgPSBFWElUX0ZBSUxVUkU7CmRpZmYgLS1naXQgYS9saWJiYi9kZXZpY2Vfb3Blbi5jIGIvbGliYmIvZGV2aWNlX29wZW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGZlMmZjCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvZGV2aWNlX29wZW4uYwpAQCAtMCwwICsxLDMyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiB0cnkgdG8gb3BlbiB1cCB0aGUgc3BlY2lmaWVkIGRldmljZSAqLworaW50IEZBU1RfRlVOQyBkZXZpY2Vfb3Blbihjb25zdCBjaGFyICpkZXZpY2UsIGludCBtb2RlKQoreworCWludCBtLCBmLCBmZDsKKworCW0gPSBtb2RlIHwgT19OT05CTE9DSzsKKworCS8qIFJldHJ5IHVwIHRvIDUgdGltZXMgKi8KKwkvKiBUT0RPOiBleHBsYWluIHdoeSBpdCBjYW4ndCBiZSBjb25zaWRlcmVkIGluc2FuZSAqLworCWZvciAoZiA9IDA7IGYgPCA1OyBmKyspIHsKKwkJZmQgPSBvcGVuKGRldmljZSwgbSwgMDYwMCk7CisJCWlmIChmZCA+PSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChmZCA8IDApCisJCXJldHVybiBmZDsKKwkvKiBSZXNldCBvcmlnaW5hbCBmbGFncy4gKi8KKwlpZiAobSAhPSBtb2RlKQorCQlmY250bChmZCwgRl9TRVRGTCwgbW9kZSk7CisJcmV0dXJuIGZkOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvZGllX2lmX2JhZF91c2VybmFtZS5jIGIvbGliYmIvZGllX2lmX2JhZF91c2VybmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMTI5N2IKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9kaWVfaWZfYmFkX3VzZXJuYW1lLmMKQEAgLTAsMCArMSw2MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ2hlY2sgdXNlciBhbmQgZ3JvdXAgbmFtZXMgZm9yIGlsbGVnYWwgY2hhcmFjdGVycworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaXRvIFJhZ3VzYSA8ZmFybWF0aXRvQHRpc2NhbGkuaXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVG8gYXZvaWQgcHJvYmxlbXMsIHRoZSB1c2VybmFtZSBzaG91bGQgY29uc2lzdCBvbmx5IG9mCisgKiBsZXR0ZXJzLCBkaWdpdHMsIHVuZGVyc2NvcmVzLCBwZXJpb2RzLCBhdCBzaWducyBhbmQgZGFzaGVzLAorICogYW5kIG5vdCBzdGFydCB3aXRoIGEgZGFzaCAoYXMgZGVmaW5lZCBieSBJRUVFIFN0ZCAxMDAzLjEtMjAwMSkuCisgKiBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIFNhbWJhIG1hY2hpbmUgYWNjb3VudHMgJCBpcyBhbHNvIHN1cHBvcnRlZAorICogYXQgdGhlIGVuZCBvZiB0aGUgdXNlcm5hbWUuCisgKi8KKwordm9pZCBGQVNUX0ZVTkMgZGllX2lmX2JhZF91c2VybmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCWNvbnN0IGNoYXIgKnN0YXJ0ID0gbmFtZTsKKworCS8qIDFzdCBjaGFyIGJlaW5nIGRhc2ggb3IgZG90IGlzbid0IHZhbGlkOgorCSAqIGZvciBleGFtcGxlLCBuYW1lIGxpa2UgIi4uIiBjYW4gbWFrZSBhZGR1c2VyCisJICogY2hvd24gIi9ob21lLy4uIiByZWN1cnNpdmVseSAtIE5PVCBHT09ELgorCSAqIE5hbWUgb2YganVzdCBhIHNpbmdsZSAiJCIgaXMgYWxzbyByZWplY3RlZC4KKwkgKi8KKwlnb3RvIHNraXA7CisKKwlkbyB7CisJCXVuc2lnbmVkIGNoYXIgY2g7CisKKwkJLyogVGhlc2UgY2hhcnMgYXJlIHZhbGlkIHVubGVzcyB0aGV5IGFyZSBhdCB0aGUgMXN0IHBvczogKi8KKwkJaWYgKCpuYW1lID09ICctJworCQkgfHwgKm5hbWUgPT0gJy4nCisJCS8qICQgaXMgYWxsb3dlZCBpZiBpdCdzIHRoZSBsYXN0IGNoYXI6ICovCisJCSB8fCAoKm5hbWUgPT0gJyQnICYmICFuYW1lWzFdKQorCQkpIHsKKwkJCWNvbnRpbnVlOworCQl9Cisgc2tpcDoKKwkJY2ggPSAqbmFtZTsKKwkJaWYgKGNoID09ICdfJworCQkvKiB8fCBjaCA9PSAnQCcgLS0gd2UgZGlzYWxsb3cgdGhpcyB0b28uIFRoaW5rIGFib3V0ICJ1c2VyQGhvc3QiICovCisJCS8qIG9wZW4tY29kZWQgaXNhbG51bTogKi8KKwkJIHx8IChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKQorCQkgfHwgKChjaHwweDIwKSA+PSAnYScgJiYgKGNofDB4MjApIDw9ICd6JykKKwkJKSB7CisJCQljb250aW51ZTsKKwkJfQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaWxsZWdhbCBjaGFyYWN0ZXIgd2l0aCBjb2RlICV1IGF0IHBvc2l0aW9uICV1IiwKKwkJCQkodW5zaWduZWQpY2gsICh1bnNpZ25lZCkobmFtZSAtIHN0YXJ0KSk7CisJfSB3aGlsZSAoKisrbmFtZSk7CisKKwkvKiBUaGUgbWluaW11bSBzaXplIG9mIHRoZSBsb2dpbiBuYW1lIGlzIG9uZSBjaGFyIG9yIHR3byBpZgorCSAqIGxhc3QgY2hhciBpcyB0aGUgJyQnLiBWaW9sYXRpb25zIG9mIHRoaXMgYXJlIGNhdWdodCBhYm92ZS4KKwkgKiBUaGUgbWF4aW11bSBzaXplIG9mIHRoZSBsb2dpbiBuYW1lIGlzIExPR0lOX05BTUVfTUFYCisJICogaW5jbHVkaW5nIHRoZSB0ZXJtaW5hdGluZyBudWxsIGJ5dGUuCisJICovCisJaWYgKG5hbWUgLSBzdGFydCA+PSBMT0dJTl9OQU1FX01BWCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5hbWUgaXMgdG9vIGxvbmciKTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2R1bXAuYyBiL2xpYmJiL2R1bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjY4ODFhCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvZHVtcC5jCkBAIC0wLDAgKzEsODM3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBTdXBwb3J0IGNvZGUgZm9yIHRoZSBoZXhkdW1wIGFuZCBvZCBhcHBsZXRzLAorICogYmFzZWQgb24gY29kZSBmcm9tIHV0aWwtbGludXggdiAyLjExbAorICoKKyAqIENvcHlyaWdodCAoYykgMTk4OQorICogVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgbm90aWNlIGlzIHJldGFpbmVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImR1bXAuaCIKKworc3RhdGljIGNvbnN0IGNoYXIgaW5kZXhfc3RyW10gQUxJR04xID0gIi4jLSsgMDEyMzQ1Njc4OSI7CisKK3N0YXRpYyBjb25zdCBjaGFyIHNpemVfY29udl9zdHJbXSBBTElHTjEgPQorIlx4MVx4NFx4NFx4NFx4NFx4NFx4NFx4OFx4OFx4OFx4OFwwMTBjZGlvdXhYZUVmZ0ciOworCitzdGF0aWMgY29uc3QgY2hhciBsY2NbXSBBTElHTjEgPSAiZGlvdXhYIjsKKworCit0eXBlZGVmIHN0cnVjdCBwcml2X2R1bXBlcl90IHsKKwlkdW1wZXJfdCBwdWI7CisKKwljaGFyICoqYXJndjsKKwlGVSAqZW5kZnU7CisJb2ZmX3Qgc2F2YWRkcmVzczsgICAgICAgIC8qIHNhdmVkIGFkZHJlc3Mvb2Zmc2V0IGluIHN0cmVhbSAqLworCW9mZl90IGVhZGRyZXNzOyAgICAgICAgICAvKiBlbmQgYWRkcmVzcyAqLworCW9mZl90IGFkZHJlc3M7ICAgICAgICAgICAvKiBhZGRyZXNzL29mZnNldCBpbiBzdHJlYW0gKi8KKwlpbnQgYmxvY2tzaXplOworCXNtYWxsaW50IGV4aXR2YWw7ICAgICAgICAvKiBmaW5hbCBleGl0IHZhbHVlICovCisKKwkvKiBmb3JtZXIgc3RhdGljcyAqLworCXNtYWxsaW50IG5leHRfX2RvbmU7CisJc21hbGxpbnQgZ2V0X19hdGVvZjsgLy8gPSAxOworCXVuc2lnbmVkIGNoYXIgKmdldF9fY3VycDsKKwl1bnNpZ25lZCBjaGFyICpnZXRfX3NhdnA7Cit9IHByaXZfZHVtcGVyX3Q7CisKK2R1bXBlcl90KiBGQVNUX0ZVTkMgYWxsb2NfZHVtcGVyKHZvaWQpCit7CisJcHJpdl9kdW1wZXJfdCAqZHVtcGVyID0geHphbGxvYyhzaXplb2YoKmR1bXBlcikpOworCWR1bXBlci0+cHViLmR1bXBfbGVuZ3RoID0gLTE7CisJZHVtcGVyLT5wdWIuZHVtcF92ZmxhZyA9IEZJUlNUOworCWR1bXBlci0+Z2V0X19hdGVvZiA9IDE7CisJcmV0dXJuICZkdW1wZXItPnB1YjsKK30KKworCitzdGF0aWMgTk9JTkxJTkUgaW50IGJiX2R1bXBfc2l6ZShGUyAqZnMpCit7CisJRlUgKmZ1OworCWludCBiY250LCBjdXJfc2l6ZTsKKwljaGFyICpmbXQ7CisJY29uc3QgY2hhciAqcDsKKwlpbnQgcHJlYzsKKworCS8qIGZpZ3VyZSBvdXQgdGhlIGRhdGEgYmxvY2sgYmJfZHVtcF9zaXplIG5lZWRlZCBmb3IgZWFjaCBmb3JtYXQgdW5pdCAqLworCWZvciAoY3VyX3NpemUgPSAwLCBmdSA9IGZzLT5uZXh0ZnU7IGZ1OyBmdSA9IGZ1LT5uZXh0ZnUpIHsKKwkJaWYgKGZ1LT5iY250KSB7CisJCQljdXJfc2l6ZSArPSBmdS0+YmNudCAqIGZ1LT5yZXBzOworCQkJY29udGludWU7CisJCX0KKwkJZm9yIChiY250ID0gcHJlYyA9IDAsIGZtdCA9IGZ1LT5mbXQ7ICpmbXQ7ICsrZm10KSB7CisJCQlpZiAoKmZtdCAhPSAnJScpCisJCQkJY29udGludWU7CisJCQkvKgorCQkJICogc2tpcCBhbnkgc3BlY2lhbCBjaGFycyAtLSBzYXZlIHByZWNpc2lvbiBpbgorCQkJICogY2FzZSBpdCdzIGEgJXMgZm9ybWF0LgorCQkJICovCisJCQl3aGlsZSAoc3RyY2hyKGluZGV4X3N0ciArIDEsICorK2ZtdCkpCisJCQkJY29udGludWU7CisJCQlpZiAoKmZtdCA9PSAnLicgJiYgaXNkaWdpdCgqKytmbXQpKSB7CisJCQkJcHJlYyA9IGF0b2koZm10KTsKKwkJCQl3aGlsZSAoaXNkaWdpdCgqKytmbXQpKQorCQkJCQljb250aW51ZTsKKwkJCX0KKwkJCXAgPSBzdHJjaHIoc2l6ZV9jb252X3N0ciArIDEyLCAqZm10KTsKKwkJCWlmICghcCkgeworCQkJCWlmICgqZm10ID09ICdzJykgeworCQkJCQliY250ICs9IHByZWM7CisJCQkJfSBlbHNlIGlmICgqZm10ID09ICdfJykgeworCQkJCQkrK2ZtdDsKKwkJCQkJaWYgKCgqZm10ID09ICdjJykgfHwgKCpmbXQgPT0gJ3AnKSB8fCAoKmZtdCA9PSAndScpKSB7CisJCQkJCQliY250ICs9IDE7CisJCQkJCX0KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWJjbnQgKz0gc2l6ZV9jb252X3N0cltwIC0gKHNpemVfY29udl9zdHIgKyAxMildOworCQkJfQorCQl9CisJCWN1cl9zaXplICs9IGJjbnQgKiBmdS0+cmVwczsKKwl9CisJcmV0dXJuIGN1cl9zaXplOworfQorCitzdGF0aWMgTk9JTkxJTkUgdm9pZCByZXdyaXRlKHByaXZfZHVtcGVyX3QgKmR1bXBlciwgRlMgKmZzKQoreworCWVudW0geyBOT1RPS0FZLCBVU0VCQ05ULCBVU0VQUkVDIH0gc29rYXk7CisJRlUgKmZ1OworCVBSICpwcjsKKwljaGFyICpwMSwgKnAyLCAqcDM7CisJY2hhciBzYXZlY2gsICpmbXRwOworCWNvbnN0IGNoYXIgKmJ5dGVfY291bnRfc3RyOworCWludCBuY29udiwgcHJlYyA9IDA7CisKKwlmb3IgKGZ1ID0gZnMtPm5leHRmdTsgZnU7IGZ1ID0gZnUtPm5leHRmdSkgeworCQkvKgorCQkgKiBicmVhayBlYWNoIGZvcm1hdCB1bml0IGludG8gcHJpbnQgdW5pdHM7IGVhY2gKKwkJICogY29udmVyc2lvbiBjaGFyYWN0ZXIgZ2V0cyBpdHMgb3duLgorCQkgKi8KKwkJZm9yIChuY29udiA9IDAsIGZtdHAgPSBmdS0+Zm10OyAqZm10cDsgKSB7CisJCQkvKiBOT1NUUklDVCAqLworCQkJLyogREJVOltkdmFlQGNyYXkuY29tXSB6YWxsb2Mgc28gdGhhdCBmb3J3YXJkIHB0cnMgc3RhcnQgb3V0IE5VTEwqLworCQkJcHIgPSB4emFsbG9jKHNpemVvZihQUikpOworCQkJaWYgKCFmdS0+bmV4dHByKQorCQkJCWZ1LT5uZXh0cHIgPSBwcjsKKworCQkJLyogc2tpcCBwcmVjZWRpbmcgdGV4dCBhbmQgdXAgdG8gdGhlIG5leHQgJSBzaWduICovCisJCQlmb3IgKHAxID0gZm10cDsgKnAxICYmICpwMSAhPSAnJSc7ICsrcDEpCisJCQkJY29udGludWU7CisKKwkJCS8qIG9ubHkgdGV4dCBpbiB0aGUgc3RyaW5nICovCisJCQlpZiAoISpwMSkgeworCQkJCXByLT5mbXQgPSBmbXRwOworCQkJCXByLT5mbGFncyA9IEZfVEVYVDsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyoKKwkJCSAqIGdldCBwcmVjaXNpb24gZm9yICVzIC0tIGlmIGhhdmUgYSBieXRlIGNvdW50LCBkb24ndAorCQkJICogbmVlZCBpdC4KKwkJCSAqLworCQkJaWYgKGZ1LT5iY250KSB7CisJCQkJc29rYXkgPSBVU0VCQ05UOworCQkJCS8qIHNraXAgdG8gY29udmVyc2lvbiBjaGFyYWN0ZXIgKi8KKwkJCQlmb3IgKCsrcDE7IHN0cmNocihpbmRleF9zdHIsICpwMSk7ICsrcDEpCisJCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIHsKKwkJCQkvKiBza2lwIGFueSBzcGVjaWFsIGNoYXJzLCBmaWVsZCB3aWR0aCAqLworCQkJCXdoaWxlIChzdHJjaHIoaW5kZXhfc3RyICsgMSwgKisrcDEpKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAoKnAxID09ICcuJyAmJiBpc2RpZ2l0KCorK3AxKSkgeworCQkJCQlzb2theSA9IFVTRVBSRUM7CisJCQkJCXByZWMgPSBhdG9pKHAxKTsKKwkJCQkJd2hpbGUgKGlzZGlnaXQoKisrcDEpKQorCQkJCQkJY29udGludWU7CisJCQkJfSBlbHNlCisJCQkJCXNva2F5ID0gTk9UT0tBWTsKKwkJCX0KKworCQkJcDIgPSBwMSArIDE7IC8qIHNldCBlbmQgcG9pbnRlciAqLworCisJCQkvKgorCQkJICogZmlndXJlIG91dCB0aGUgYnl0ZSBjb3VudCBmb3IgZWFjaCBjb252ZXJzaW9uOworCQkJICogcmV3cml0ZSB0aGUgZm9ybWF0IGFzIG5lY2Vzc2FyeSwgc2V0IHVwIGJsYW5rLQorCQkJICogcGJiX2R1bXBfYWRkaW5nIGZvciBlbmQgb2YgZGF0YS4KKwkJCSAqLworCQkJaWYgKCpwMSA9PSAnYycpIHsKKwkJCQlwci0+ZmxhZ3MgPSBGX0NIQVI7CisgRE9fQllURV9DT1VOVF8xOgorCQkJCWJ5dGVfY291bnRfc3RyID0gIlwwMDEiOworIERPX0JZVEVfQ09VTlQ6CisJCQkJaWYgKGZ1LT5iY250KSB7CisJCQkJCWRvIHsKKwkJCQkJCWlmIChmdS0+YmNudCA9PSAqYnl0ZV9jb3VudF9zdHIpIHsKKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJfSB3aGlsZSAoKisrYnl0ZV9jb3VudF9zdHIpOworCQkJCX0KKwkJCQkvKiBVbmxpa2UgdGhlIG9yaWdpbmFsLCBvdXRwdXQgdGhlIHJlbWFpbmRlciBvZiB0aGUgZm9ybWF0IHN0cmluZy4gKi8KKwkJCQlpZiAoISpieXRlX2NvdW50X3N0cikgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIGJ5dGUgY291bnQgZm9yIGNvbnZlcnNpb24gY2hhcmFjdGVyICVzIiwgcDEpOworCQkJCX0KKwkJCQlwci0+YmNudCA9ICpieXRlX2NvdW50X3N0cjsKKwkJCX0gZWxzZSBpZiAoKnAxID09ICdsJykgeworCQkJCSsrcDI7CisJCQkJKytwMTsKKyBET19JTlRfQ09OVjoKKwkJCQl7CisJCQkJCWNvbnN0IGNoYXIgKmU7CisJCQkJCWUgPSBzdHJjaHIobGNjLCAqcDEpOworCQkJCQlpZiAoIWUpIHsKKwkJCQkJCWdvdG8gRE9fQkFEX0NPTlZfQ0hBUjsKKwkJCQkJfQorCQkJCQlwci0+ZmxhZ3MgPSBGX0lOVDsKKwkJCQkJaWYgKGUgPiBsY2MgKyAxKSB7CisJCQkJCQlwci0+ZmxhZ3MgPSBGX1VJTlQ7CisJCQkJCX0KKwkJCQkJYnl0ZV9jb3VudF9zdHIgPSAiXDAwNFwwMDJcMDAxIjsKKwkJCQkJZ290byBET19CWVRFX0NPVU5UOworCQkJCX0KKwkJCQkvKiBOT1RSRUFDSEVEICovCisJCQl9IGVsc2UgaWYgKHN0cmNocihsY2MsICpwMSkpIHsKKwkJCQlnb3RvIERPX0lOVF9DT05WOworCQkJfSBlbHNlIGlmIChzdHJjaHIoImVFZmdHIiwgKnAxKSkgeworCQkJCXByLT5mbGFncyA9IEZfREJMOworCQkJCWJ5dGVfY291bnRfc3RyID0gIlwwMTBcMDA0IjsKKwkJCQlnb3RvIERPX0JZVEVfQ09VTlQ7CisJCQl9IGVsc2UgaWYgKCpwMSA9PSAncycpIHsKKwkJCQlwci0+ZmxhZ3MgPSBGX1NUUjsKKwkJCQlpZiAoc29rYXkgPT0gVVNFQkNOVCkgeworCQkJCQlwci0+YmNudCA9IGZ1LT5iY250OworCQkJCX0gZWxzZSBpZiAoc29rYXkgPT0gVVNFUFJFQykgeworCQkJCQlwci0+YmNudCA9IHByZWM7CisJCQkJfSBlbHNlIHsgICAvKiBOT1RPS0FZICovCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlJXMgcmVxdWlyZXMgYSBwcmVjaXNpb24gb3IgYSBieXRlIGNvdW50Iik7CisJCQkJfQorCQkJfSBlbHNlIGlmICgqcDEgPT0gJ18nKSB7CisJCQkJKytwMjsKKwkJCQlzd2l0Y2ggKHAxWzFdKSB7CisJCQkJY2FzZSAnQSc6CisJCQkJCWR1bXBlci0+ZW5kZnUgPSBmdTsKKwkJCQkJZnUtPmZsYWdzIHw9IEZfSUdOT1JFOworCQkJCQkvKiBGQUxMVEhST1VHSCAqLworCQkJCWNhc2UgJ2EnOgorCQkJCQlwci0+ZmxhZ3MgPSBGX0FERFJFU1M7CisJCQkJCSsrcDI7CisJCQkJCWlmICgocDFbMl0gIT0gJ2QnKSAmJiAocDFbMl0gIT0gJ28nKSAmJiAocDFbMl0gIT0gJ3gnKSkgeworCQkJCQkJZ290byBET19CQURfQ09OVl9DSEFSOworCQkJCQl9CisJCQkJCSpwMSA9IHAxWzJdOworCQkJCQlicmVhazsKKwkJCQljYXNlICdjJzoKKwkJCQkJcHItPmZsYWdzID0gRl9DOworCQkJCQkvKiAqcDEgPSAnYyc7ICAgc2V0IGluIGNvbnZfYyAqLworCQkJCQlnb3RvIERPX0JZVEVfQ09VTlRfMTsKKwkJCQljYXNlICdwJzoKKwkJCQkJcHItPmZsYWdzID0gRl9QOworCQkJCQkqcDEgPSAnYyc7CisJCQkJCWdvdG8gRE9fQllURV9DT1VOVF8xOworCQkJCWNhc2UgJ3UnOgorCQkJCQlwci0+ZmxhZ3MgPSBGX1U7CisJCQkJCS8qICpwMSA9ICdjJzsgICBzZXQgaW4gY29udl91ICovCisJCQkJCWdvdG8gRE9fQllURV9DT1VOVF8xOworCQkJCWRlZmF1bHQ6CisJCQkJCWdvdG8gRE9fQkFEX0NPTlZfQ0hBUjsKKwkJCQl9CisJCQl9IGVsc2UgeworIERPX0JBRF9DT05WX0NIQVI6CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBjb252ZXJzaW9uIGNoYXJhY3RlciAlJSVzIiwgcDEpOworCQkJfQorCisJCQkvKgorCQkJICogY29weSB0byBQUiBmb3JtYXQgc3RyaW5nLCBzZXQgY29udmVyc2lvbiBjaGFyYWN0ZXIKKwkJCSAqIHBvaW50ZXIsIHVwZGF0ZSBvcmlnaW5hbC4KKwkJCSAqLworCQkJc2F2ZWNoID0gKnAyOworCQkJcDFbMV0gPSAnXDAnOworCQkJcHItPmZtdCA9IHhzdHJkdXAoZm10cCk7CisJCQkqcDIgPSBzYXZlY2g7CisJCQkvL1RvbyBlYXJseSEgeHJlYWxsb2MgY2FuIG1vdmUgcHItPmZtdCEKKwkJCS8vcHItPmNjaGFyID0gcHItPmZtdCArIChwMSAtIGZtdHApOworCisJCQkvKiBEQlU6W2RhdmVAY3JheS5jb21dIHcvbyB0aGlzLCB0cmFpbGluZyBmbXQgdGV4dCwgc3BhY2UgaXMgbG9zdC4KKwkJCSAqIFNraXAgc3Vic2VxdWVudCB0ZXh0IGFuZCB1cCB0byB0aGUgbmV4dCAlIHNpZ24gYW5kIHRhY2sgdGhlCisJCQkgKiBhZGRpdGlvbmFsIHRleHQgb250byBmbXQ6IGVnLiBpZiBmbXQgaXMgIiV4IGlzIGEgSEVYIG51bWJlciIsCisJCQkgKiB3ZSBsb3NlIHRoZSAiIGlzIGEgSEVYIG51bWJlciIgcGFydCBvZiBmbXQuCisJCQkgKi8KKwkJCWZvciAocDMgPSBwMjsgKnAzICYmICpwMyAhPSAnJSc7IHAzKyspCisJCQkJY29udGludWU7CisJCQlpZiAocDMgPiBwMikgeworCQkJCXNhdmVjaCA9ICpwMzsKKwkJCQkqcDMgPSAnXDAnOworCQkJCXByLT5mbXQgPSB4cmVhbGxvYyhwci0+Zm10LCBzdHJsZW4ocHItPmZtdCkgKyAocDMtcDIpICsgMSk7CisJCQkJc3RyY2F0KHByLT5mbXQsIHAyKTsKKwkJCQkqcDMgPSBzYXZlY2g7CisJCQkJcDIgPSBwMzsKKwkJCX0KKworCQkJcHItPmNjaGFyID0gcHItPmZtdCArIChwMSAtIGZtdHApOworCQkJZm10cCA9IHAyOworCisJCQkvKiBvbmx5IG9uZSBjb252ZXJzaW9uIGNoYXJhY3RlciBpZiBieXRlIGNvdW50ICovCisJCQlpZiAoIShwci0+ZmxhZ3MgJiBGX0FERFJFU1MpICYmIGZ1LT5iY250ICYmIG5jb252KyspIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYnl0ZSBjb3VudCB3aXRoIG11bHRpcGxlIGNvbnZlcnNpb24gY2hhcmFjdGVycyIpOworCQkJfQorCQl9CisJCS8qCisJCSAqIGlmIGZvcm1hdCB1bml0IGJ5dGUgY291bnQgbm90IHNwZWNpZmllZCwgZmlndXJlIGl0IG91dAorCQkgKiBzbyBjYW4gYWRqdXN0IHJlcCBjb3VudCBsYXRlci4KKwkJICovCisJCWlmICghZnUtPmJjbnQpCisJCQlmb3IgKHByID0gZnUtPm5leHRwcjsgcHI7IHByID0gcHItPm5leHRwcikKKwkJCQlmdS0+YmNudCArPSBwci0+YmNudDsKKwl9CisJLyoKKwkgKiBpZiB0aGUgZm9ybWF0IHN0cmluZyBpbnRlcnByZXRzIGFueSBkYXRhIGF0IGFsbCwgYW5kIGl0J3MKKwkgKiBub3QgdGhlIHNhbWUgYXMgdGhlIGJsb2Nrc2l6ZSwgYW5kIGl0cyBsYXN0IGZvcm1hdCB1bml0CisJICogaW50ZXJwcmV0cyBhbnkgZGF0YSBhdCBhbGwsIGFuZCBoYXMgbm8gaXRlcmF0aW9uIGNvdW50LAorCSAqIHJlcGVhdCBpdCBhcyBuZWNlc3NhcnkuCisJICoKKwkgKiBpZiByZXAgY291bnQgaXMgZ3JlYXRlciB0aGFuIDEsIG5vIHRyYWlsaW5nIHdoaXRlc3BhY2UKKwkgKiBnZXRzIG91dHB1dCBmcm9tIHRoZSBsYXN0IGl0ZXJhdGlvbiBvZiB0aGUgZm9ybWF0IHVuaXQuCisJICovCisJZm9yIChmdSA9IGZzLT5uZXh0ZnU7IGZ1OyBmdSA9IGZ1LT5uZXh0ZnUpIHsKKwkJaWYgKCFmdS0+bmV4dGZ1CisJCSAmJiBmcy0+YmNudCA8IGR1bXBlci0+YmxvY2tzaXplCisJCSAmJiAhKGZ1LT5mbGFncyAmIEZfU0VUUkVQKQorCQkgJiYgZnUtPmJjbnQKKwkJKSB7CisJCQlmdS0+cmVwcyArPSAoZHVtcGVyLT5ibG9ja3NpemUgLSBmcy0+YmNudCkgLyBmdS0+YmNudDsKKwkJfQorCQlpZiAoZnUtPnJlcHMgPiAxICYmIGZ1LT5uZXh0cHIpIHsKKwkJCWZvciAocHIgPSBmdS0+bmV4dHByOzsgcHIgPSBwci0+bmV4dHByKQorCQkJCWlmICghcHItPm5leHRwcikKKwkJCQkJYnJlYWs7CisJCQlmb3IgKHAxID0gcHItPmZtdCwgcDIgPSBOVUxMOyAqcDE7ICsrcDEpCisJCQkJcDIgPSBpc3NwYWNlKCpwMSkgPyBwMSA6IE5VTEw7CisJCQlpZiAocDIpCisJCQkJcHItPm5vc3BhY2UgPSBwMjsKKwkJfQorCQlpZiAoIWZ1LT5uZXh0ZnUpCisJCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGRvX3NraXAocHJpdl9kdW1wZXJfdCAqZHVtcGVyLCBjb25zdCBjaGFyICpmbmFtZSwgaW50IHN0YXRvaykKK3sKKwlzdHJ1Y3Qgc3RhdCBzYnVmOworCisJaWYgKHN0YXRvaykgeworCQl4ZnN0YXQoU1RESU5fRklMRU5PLCAmc2J1ZiwgZm5hbWUpOworCQlpZiAoIShTX0lTQ0hSKHNidWYuc3RfbW9kZSkgfHwgU19JU0JMSyhzYnVmLnN0X21vZGUpIHx8IFNfSVNGSUZPKHNidWYuc3RfbW9kZSkpCisJCSAmJiBkdW1wZXItPnB1Yi5kdW1wX3NraXAgPj0gc2J1Zi5zdF9zaXplCisJCSkgeworCQkJLyogSWYgYmJfZHVtcF9zaXplIHZhbGlkIGFuZCBwdWIuZHVtcF9za2lwID49IHNpemUgKi8KKwkJCWR1bXBlci0+cHViLmR1bXBfc2tpcCAtPSBzYnVmLnN0X3NpemU7CisJCQlkdW1wZXItPmFkZHJlc3MgKz0gc2J1Zi5zdF9zaXplOworCQkJcmV0dXJuOworCQl9CisJfQorCWlmIChmc2Vla28oc3RkaW4sIGR1bXBlci0+cHViLmR1bXBfc2tpcCwgU0VFS19TRVQpKSB7CisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUoZm5hbWUpOworCX0KKwlkdW1wZXItPmFkZHJlc3MgKz0gZHVtcGVyLT5wdWIuZHVtcF9za2lwOworCWR1bXBlci0+c2F2YWRkcmVzcyA9IGR1bXBlci0+YWRkcmVzczsKKwlkdW1wZXItPnB1Yi5kdW1wX3NraXAgPSAwOworfQorCitzdGF0aWMgTk9JTkxJTkUgaW50IG5leHQocHJpdl9kdW1wZXJfdCAqZHVtcGVyKQoreworCWludCBzdGF0b2s7CisKKwlmb3IgKDs7KSB7CisJCWlmICgqZHVtcGVyLT5hcmd2KSB7CisJCQlkdW1wZXItPm5leHRfX2RvbmUgPSBzdGF0b2sgPSAxOworCQkJaWYgKCEoZnJlb3BlbigqZHVtcGVyLT5hcmd2LCAiciIsIHN0ZGluKSkpIHsKKwkJCQliYl9zaW1wbGVfcGVycm9yX21zZygqZHVtcGVyLT5hcmd2KTsKKwkJCQlkdW1wZXItPmV4aXR2YWwgPSAxOworCQkJCSsrZHVtcGVyLT5hcmd2OworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKGR1bXBlci0+bmV4dF9fZG9uZSkKKwkJCQlyZXR1cm4gMDsgLyogbm8gbmV4dCBmaWxlICovCisJCQlkdW1wZXItPm5leHRfX2RvbmUgPSAxOworCQkJc3RhdG9rID0gMDsKKwkJfQorCQlpZiAoZHVtcGVyLT5wdWIuZHVtcF9za2lwKQorCQkJZG9fc2tpcChkdW1wZXIsIHN0YXRvayA/ICpkdW1wZXItPmFyZ3YgOiAic3RkaW4iLCBzdGF0b2spOworCQlpZiAoKmR1bXBlci0+YXJndikKKwkJCSsrZHVtcGVyLT5hcmd2OworCQlpZiAoIWR1bXBlci0+cHViLmR1bXBfc2tpcCkKKwkJCXJldHVybiAxOworCX0KKwkvKiBOT1RSRUFDSEVEICovCit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyICpnZXQocHJpdl9kdW1wZXJfdCAqZHVtcGVyKQoreworCWludCBuOworCWludCBuZWVkLCBucmVhZDsKKwlpbnQgYmxvY2tzaXplID0gZHVtcGVyLT5ibG9ja3NpemU7CisKKwlpZiAoIWR1bXBlci0+Z2V0X19jdXJwKSB7CisJCWR1bXBlci0+YWRkcmVzcyA9IChvZmZfdCkwOyAvKkRCVTpbZGF2ZUBjcmF5LmNvbV0gaW5pdGlhbGl6ZSxpbml0aWFsaXplLi4qLworCQlkdW1wZXItPmdldF9fY3VycCA9IHhtYWxsb2MoYmxvY2tzaXplKTsKKwkJZHVtcGVyLT5nZXRfX3NhdnAgPSB4emFsbG9jKGJsb2Nrc2l6ZSk7IC8qIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgKi8KKwl9IGVsc2UgeworCQl1bnNpZ25lZCBjaGFyICp0bXAgPSBkdW1wZXItPmdldF9fY3VycDsKKwkJZHVtcGVyLT5nZXRfX2N1cnAgPSBkdW1wZXItPmdldF9fc2F2cDsKKwkJZHVtcGVyLT5nZXRfX3NhdnAgPSB0bXA7CisJCWR1bXBlci0+c2F2YWRkcmVzcyArPSBibG9ja3NpemU7CisJCWR1bXBlci0+YWRkcmVzcyA9IGR1bXBlci0+c2F2YWRkcmVzczsKKwl9CisJbmVlZCA9IGJsb2Nrc2l6ZTsKKwlucmVhZCA9IDA7CisJd2hpbGUgKDEpIHsKKwkJLyoKKwkJICogaWYgcmVhZCB0aGUgcmlnaHQgbnVtYmVyIG9mIGJ5dGVzLCBvciBhdCBFT0YgZm9yIG9uZSBmaWxlLAorCQkgKiBhbmQgbm8gb3RoZXIgZmlsZXMgYXJlIGF2YWlsYWJsZSwgemVyby1wYWQgdGhlIHJlc3Qgb2YgdGhlCisJCSAqIGJsb2NrIGFuZCBzZXQgdGhlIGVuZCBmbGFnLgorCQkgKi8KKwkJaWYgKCFkdW1wZXItPnB1Yi5kdW1wX2xlbmd0aCB8fCAoZHVtcGVyLT5nZXRfX2F0ZW9mICYmICFuZXh0KGR1bXBlcikpKSB7CisJCQlpZiAobmVlZCA9PSBibG9ja3NpemUpIHsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWlmIChkdW1wZXItPnB1Yi5kdW1wX3ZmbGFnICE9IEFMTCAmJiAhbWVtY21wKGR1bXBlci0+Z2V0X19jdXJwLCBkdW1wZXItPmdldF9fc2F2cCwgbnJlYWQpKSB7CisJCQkJaWYgKGR1bXBlci0+cHViLmR1bXBfdmZsYWcgIT0gRFVQKSB7CisJCQkJCXB1dHMoIioiKTsKKwkJCQl9CisJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCQltZW1zZXQoZHVtcGVyLT5nZXRfX2N1cnAgKyBucmVhZCwgMCwgbmVlZCk7CisJCQlkdW1wZXItPmVhZGRyZXNzID0gZHVtcGVyLT5hZGRyZXNzICsgbnJlYWQ7CisJCQlyZXR1cm4gZHVtcGVyLT5nZXRfX2N1cnA7CisJCX0KKwkJbiA9IGZyZWFkKGR1bXBlci0+Z2V0X19jdXJwICsgbnJlYWQsIHNpemVvZih1bnNpZ25lZCBjaGFyKSwKKwkJCQlkdW1wZXItPnB1Yi5kdW1wX2xlbmd0aCA9PSAtMSA/IG5lZWQgOiBNSU4oZHVtcGVyLT5wdWIuZHVtcF9sZW5ndGgsIG5lZWQpLCBzdGRpbik7CisJCWlmICghbikgeworCQkJaWYgKGZlcnJvcihzdGRpbikpIHsKKwkJCQliYl9zaW1wbGVfcGVycm9yX21zZyhkdW1wZXItPmFyZ3ZbLTFdKTsKKwkJCX0KKwkJCWR1bXBlci0+Z2V0X19hdGVvZiA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlkdW1wZXItPmdldF9fYXRlb2YgPSAwOworCQlpZiAoZHVtcGVyLT5wdWIuZHVtcF9sZW5ndGggIT0gLTEpIHsKKwkJCWR1bXBlci0+cHViLmR1bXBfbGVuZ3RoIC09IG47CisJCX0KKwkJbmVlZCAtPSBuOworCQlpZiAoIW5lZWQpIHsKKwkJCWlmIChkdW1wZXItPnB1Yi5kdW1wX3ZmbGFnID09IEFMTCB8fCBkdW1wZXItPnB1Yi5kdW1wX3ZmbGFnID09IEZJUlNUCisJCQkgfHwgbWVtY21wKGR1bXBlci0+Z2V0X19jdXJwLCBkdW1wZXItPmdldF9fc2F2cCwgYmxvY2tzaXplKQorCQkJKSB7CisJCQkJaWYgKGR1bXBlci0+cHViLmR1bXBfdmZsYWcgPT0gRFVQIHx8IGR1bXBlci0+cHViLmR1bXBfdmZsYWcgPT0gRklSU1QpIHsKKwkJCQkJZHVtcGVyLT5wdWIuZHVtcF92ZmxhZyA9IFdBSVQ7CisJCQkJfQorCQkJCXJldHVybiBkdW1wZXItPmdldF9fY3VycDsKKwkJCX0KKwkJCWlmIChkdW1wZXItPnB1Yi5kdW1wX3ZmbGFnID09IFdBSVQpIHsKKwkJCQlwdXRzKCIqIik7CisJCQl9CisJCQlkdW1wZXItPnB1Yi5kdW1wX3ZmbGFnID0gRFVQOworCQkJZHVtcGVyLT5zYXZhZGRyZXNzICs9IGJsb2Nrc2l6ZTsKKwkJCWR1bXBlci0+YWRkcmVzcyA9IGR1bXBlci0+c2F2YWRkcmVzczsKKwkJCW5lZWQgPSBibG9ja3NpemU7CisJCQlucmVhZCA9IDA7CisJCX0gZWxzZSB7CisJCQlucmVhZCArPSBuOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBicGFkKFBSICpwcikKK3sKKwljaGFyICpwMSwgKnAyOworCisJLyoKKwkgKiByZW1vdmUgYWxsIGNvbnZlcnNpb24gZmxhZ3M7ICctJyBpcyB0aGUgb25seSBvbmUgdmFsaWQKKwkgKiB3aXRoICVzLCBhbmQgaXQncyBub3QgdXNlZnVsIGhlcmUuCisJICovCisJcHItPmZsYWdzID0gRl9CUEFEOworCSpwci0+Y2NoYXIgPSAncyc7CisJZm9yIChwMSA9IHByLT5mbXQ7ICpwMSAhPSAnJSc7ICsrcDEpCisJCWNvbnRpbnVlOworCWZvciAocDIgPSArK3AxOyAqcDEgJiYgc3RyY2hyKCIgLTArIyIsICpwMSk7ICsrcDEpCisJCWlmIChwci0+bm9zcGFjZSkKKwkJCXByLT5ub3NwYWNlLS07CisJd2hpbGUgKCgqcDIrKyA9ICpwMSsrKSAhPSAwKQorCQljb250aW51ZTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgY29udl9zdHJbXSBBTElHTjEgPQorCSJcMFxcMFwwIgorCSJcMDA3XFxhXDAiICAvKiBcYSAqLworCSJcYlxcYlwwIgorCSJcZlxcYlwwIgorCSJcblxcblwwIgorCSJcclxcclwwIgorCSJcdFxcdFwwIgorCSJcdlxcdlwwIgorCTsKKworCitzdGF0aWMgdm9pZCBjb252X2MoUFIgKnByLCB1bnNpZ25lZCBjaGFyICpwKQoreworCWNvbnN0IGNoYXIgKnN0ciA9IGNvbnZfc3RyOworCWNoYXIgYnVmWzEwXTsKKworCWRvIHsKKwkJaWYgKCpwID09ICpzdHIpIHsKKwkJCSsrc3RyOworCQkJZ290byBzdHJwcjsKKwkJfQorCQlzdHIgKz0gNDsKKwl9IHdoaWxlICgqc3RyKTsKKworCWlmIChpc3ByaW50X2FzY2lpb25seSgqcCkpIHsKKwkJKnByLT5jY2hhciA9ICdjJzsKKwkJcHJpbnRmKHByLT5mbXQsICpwKTsKKwl9IGVsc2UgeworCQlzcHJpbnRmKGJ1ZiwgIiUwM28iLCAoaW50KSAqcCk7CisJCXN0ciA9IGJ1ZjsKKyBzdHJwcjoKKwkJKnByLT5jY2hhciA9ICdzJzsKKwkJcHJpbnRmKHByLT5mbXQsIHN0cik7CisJfQorfQorCitzdGF0aWMgdm9pZCBjb252X3UoUFIgKnByLCB1bnNpZ25lZCBjaGFyICpwKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGxpc3RbXSBBTElHTjEgPQorCQkibnVsXDBzb2hcMHN0eFwwZXR4XDBlb3RcMGVucVwwYWNrXDBiZWxcMCIKKwkJImJzXDBfaHRcMF9sZlwwX3Z0XDBfZmZcMF9jclwwX3NvXDBfc2lcMF8iCisJCSJkbGVcMGRjbFwwZGMyXDBkYzNcMGRjNFwwbmFrXDBzeW5cMGV0YlwwIgorCQkiY2FuXDBlbVwwX3N1YlwwZXNjXDBmc1wwX2dzXDBfcnNcMF91cyI7CisKKwkvKiBvZCB1c2VkIG5sLCBub3QgbGYgKi8KKwlpZiAoKnAgPD0gMHgxZikgeworCQkqcHItPmNjaGFyID0gJ3MnOworCQlwcmludGYocHItPmZtdCwgbGlzdCArICg0ICogKGludCkqcCkpOworCX0gZWxzZSBpZiAoKnAgPT0gMHg3ZikgeworCQkqcHItPmNjaGFyID0gJ3MnOworCQlwcmludGYocHItPmZtdCwgImRlbCIpOworCX0gZWxzZSBpZiAoKnAgPCAweDdmKSB7IC8qIGlzcHJpbnQoKSAqLworCQkqcHItPmNjaGFyID0gJ2MnOworCQlwcmludGYocHItPmZtdCwgKnApOworCX0gZWxzZSB7CisJCSpwci0+Y2NoYXIgPSAneCc7CisJCXByaW50Zihwci0+Zm10LCAoaW50KSAqcCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkaXNwbGF5KHByaXZfZHVtcGVyX3QqIGR1bXBlcikKK3sKKwlGUyAqZnM7CisJRlUgKmZ1OworCVBSICpwcjsKKwlpbnQgY250OworCXVuc2lnbmVkIGNoYXIgKmJwLCAqc2F2ZWJwOworCW9mZl90IHNhdmVhZGRyZXNzOworCXVuc2lnbmVkIGNoYXIgc2F2ZWNoID0gJ1wwJzsKKworCXdoaWxlICgoYnAgPSBnZXQoZHVtcGVyKSkgIT0gTlVMTCkgeworCQlmcyA9IGR1bXBlci0+cHViLmZzaGVhZDsKKwkJc2F2ZWJwID0gYnA7CisJCXNhdmVhZGRyZXNzID0gZHVtcGVyLT5hZGRyZXNzOworCQlmb3IgKDsgZnM7IGZzID0gZnMtPm5leHRmcywgYnAgPSBzYXZlYnAsIGR1bXBlci0+YWRkcmVzcyA9IHNhdmVhZGRyZXNzKSB7CisJCQlmb3IgKGZ1ID0gZnMtPm5leHRmdTsgZnU7IGZ1ID0gZnUtPm5leHRmdSkgeworCQkJCWlmIChmdS0+ZmxhZ3MgJiBGX0lHTk9SRSkgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJZm9yIChjbnQgPSBmdS0+cmVwczsgY250OyAtLWNudCkgeworCQkJCQlmb3IgKHByID0gZnUtPm5leHRwcjsgcHI7IGR1bXBlci0+YWRkcmVzcyArPSBwci0+YmNudCwKKwkJCQkJCQkJYnAgKz0gcHItPmJjbnQsIHByID0gcHItPm5leHRwcikgeworCQkJCQkJaWYgKGR1bXBlci0+ZWFkZHJlc3MgJiYgZHVtcGVyLT5hZGRyZXNzID49IGR1bXBlci0+ZWFkZHJlc3MKKwkJCQkJCSAmJiAhKHByLT5mbGFncyAmIChGX1RFWFQgfCBGX0JQQUQpKQorCQkJCQkJKSB7CisJCQkJCQkJYnBhZChwcik7CisJCQkJCQl9CisJCQkJCQlpZiAoY250ID09IDEgJiYgcHItPm5vc3BhY2UpIHsKKwkJCQkJCQlzYXZlY2ggPSAqcHItPm5vc3BhY2U7CisJCQkJCQkJKnByLT5ub3NwYWNlID0gJ1wwJzsKKwkJCQkJCX0KKy8qICAgICAgICAgICAgICAgICAgICAgIFBSSU5UOyAqLworCQkJCQkJc3dpdGNoIChwci0+ZmxhZ3MpIHsKKwkJCQkJCWNhc2UgRl9BRERSRVNTOgorCQkJCQkJCXByaW50Zihwci0+Zm10LCAodW5zaWduZWQpIGR1bXBlci0+YWRkcmVzcyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIEZfQlBBRDoKKwkJCQkJCQlwcmludGYocHItPmZtdCwgIiIpOworCQkJCQkJCWJyZWFrOworCQkJCQkJY2FzZSBGX0M6CisJCQkJCQkJY29udl9jKHByLCBicCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIEZfQ0hBUjoKKwkJCQkJCQlwcmludGYocHItPmZtdCwgKmJwKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgRl9EQkw6IHsKKwkJCQkJCQlkb3VibGUgZHZhbDsKKwkJCQkJCQlmbG9hdCBmdmFsOworCisJCQkJCQkJc3dpdGNoIChwci0+YmNudCkgeworCQkJCQkJCWNhc2UgNDoKKwkJCQkJCQkJbWVtY3B5KCZmdmFsLCBicCwgc2l6ZW9mKGZ2YWwpKTsKKwkJCQkJCQkJcHJpbnRmKHByLT5mbXQsIGZ2YWwpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQljYXNlIDg6CisJCQkJCQkJCW1lbWNweSgmZHZhbCwgYnAsIHNpemVvZihkdmFsKSk7CisJCQkJCQkJCXByaW50Zihwci0+Zm10LCBkdmFsKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJfQorCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJY2FzZSBGX0lOVDogeworCQkJCQkJCWludCBpdmFsOworCQkJCQkJCXNob3J0IHN2YWw7CisKKwkJCQkJCQlzd2l0Y2ggKHByLT5iY250KSB7CisJCQkJCQkJY2FzZSAxOgorCQkJCQkJCQlwcmludGYocHItPmZtdCwgKGludCkgKmJwKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOgorCQkJCQkJCQltZW1jcHkoJnN2YWwsIGJwLCBzaXplb2Yoc3ZhbCkpOworCQkJCQkJCQlwcmludGYocHItPmZtdCwgKGludCkgc3ZhbCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCWNhc2UgNDoKKwkJCQkJCQkJbWVtY3B5KCZpdmFsLCBicCwgc2l6ZW9mKGl2YWwpKTsKKwkJCQkJCQkJcHJpbnRmKHByLT5mbXQsIGl2YWwpOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCQljYXNlIEZfUDoKKwkJCQkJCQlwcmludGYocHItPmZtdCwgaXNwcmludF9hc2NpaW9ubHkoKmJwKSA/ICpicCA6ICcuJyk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIEZfU1RSOgorCQkJCQkJCXByaW50Zihwci0+Zm10LCAoY2hhciAqKSBicCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIEZfVEVYVDoKKwkJCQkJCQlwcmludGYocHItPmZtdCk7CisJCQkJCQkJYnJlYWs7CisJCQkJCQljYXNlIEZfVToKKwkJCQkJCQljb252X3UocHIsIGJwKTsKKwkJCQkJCQlicmVhazsKKwkJCQkJCWNhc2UgRl9VSU5UOiB7CisJCQkJCQkJdW5zaWduZWQgaXZhbDsKKwkJCQkJCQl1bnNpZ25lZCBzaG9ydCBzdmFsOworCisJCQkJCQkJc3dpdGNoIChwci0+YmNudCkgeworCQkJCQkJCWNhc2UgMToKKwkJCQkJCQkJcHJpbnRmKHByLT5mbXQsICh1bnNpZ25lZCkgKmJwKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSAyOgorCQkJCQkJCQltZW1jcHkoJnN2YWwsIGJwLCBzaXplb2Yoc3ZhbCkpOworCQkJCQkJCQlwcmludGYocHItPmZtdCwgKHVuc2lnbmVkKSBzdmFsKTsKKwkJCQkJCQkJYnJlYWs7CisJCQkJCQkJY2FzZSA0OgorCQkJCQkJCQltZW1jcHkoJml2YWwsIGJwLCBzaXplb2YoaXZhbCkpOworCQkJCQkJCQlwcmludGYocHItPmZtdCwgaXZhbCk7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCQlicmVhazsKKwkJCQkJCX0KKwkJCQkJCX0KKwkJCQkJCWlmIChjbnQgPT0gMSAmJiBwci0+bm9zcGFjZSkgeworCQkJCQkJCSpwci0+bm9zcGFjZSA9IHNhdmVjaDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZiAoZHVtcGVyLT5lbmRmdSkgeworCQkvKgorCQkgKiBpZiBlYWRkcmVzcyBub3Qgc2V0LCBlcnJvciBvciBmaWxlIHNpemUgd2FzIG11bHRpcGxlCisJCSAqIG9mIGJsb2Nrc2l6ZSwgYW5kIG5vIHBhcnRpYWwgYmxvY2sgZXZlciBmb3VuZC4KKwkJICovCisJCWlmICghZHVtcGVyLT5lYWRkcmVzcykgeworCQkJaWYgKCFkdW1wZXItPmFkZHJlc3MpIHsKKwkJCQlyZXR1cm47CisJCQl9CisJCQlkdW1wZXItPmVhZGRyZXNzID0gZHVtcGVyLT5hZGRyZXNzOworCQl9CisJCWZvciAocHIgPSBkdW1wZXItPmVuZGZ1LT5uZXh0cHI7IHByOyBwciA9IHByLT5uZXh0cHIpIHsKKwkJCXN3aXRjaCAocHItPmZsYWdzKSB7CisJCQljYXNlIEZfQUREUkVTUzoKKwkJCQlwcmludGYocHItPmZtdCwgKHVuc2lnbmVkKSBkdW1wZXItPmVhZGRyZXNzKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRl9URVhUOgorCQkJCXByaW50Zihwci0+Zm10KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKworI2RlZmluZSBkdW1wZXIgKChwcml2X2R1bXBlcl90KilwdWJfZHVtcGVyKQoraW50IEZBU1RfRlVOQyBiYl9kdW1wX2R1bXAoZHVtcGVyX3QgKnB1Yl9kdW1wZXIsIGNoYXIgKiphcmd2KQoreworCUZTICp0ZnM7CisJaW50IGJsb2Nrc2l6ZTsKKworCS8qIGZpZ3VyZSBvdXQgdGhlIGRhdGEgYmxvY2sgYmJfZHVtcF9zaXplICovCisJYmxvY2tzaXplID0gMDsKKwl0ZnMgPSBkdW1wZXItPnB1Yi5mc2hlYWQ7CisJd2hpbGUgKHRmcykgeworCQl0ZnMtPmJjbnQgPSBiYl9kdW1wX3NpemUodGZzKTsKKwkJaWYgKGJsb2Nrc2l6ZSA8IHRmcy0+YmNudCkgeworCQkJYmxvY2tzaXplID0gdGZzLT5iY250OworCQl9CisJCXRmcyA9IHRmcy0+bmV4dGZzOworCX0KKwlkdW1wZXItPmJsb2Nrc2l6ZSA9IGJsb2Nrc2l6ZTsKKworCS8qIHJld3JpdGUgdGhlIHJ1bGVzLCBkbyBzeW50YXggY2hlY2tpbmcgKi8KKwlmb3IgKHRmcyA9IGR1bXBlci0+cHViLmZzaGVhZDsgdGZzOyB0ZnMgPSB0ZnMtPm5leHRmcykgeworCQlyZXdyaXRlKGR1bXBlciwgdGZzKTsKKwl9CisKKwlkdW1wZXItPmFyZ3YgPSBhcmd2OworCWRpc3BsYXkoZHVtcGVyKTsKKworCXJldHVybiBkdW1wZXItPmV4aXR2YWw7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIGJiX2R1bXBfYWRkKGR1bXBlcl90KiBwdWJfZHVtcGVyLCBjb25zdCBjaGFyICpmbXQpCit7CisJY29uc3QgY2hhciAqcDsKKwljaGFyICpwMTsKKwljaGFyICpwMjsKKwlGUyAqdGZzOworCUZVICp0ZnUsICoqbmV4dGZ1cHA7CisJY29uc3QgY2hhciAqc2F2ZXA7CisKKwkvKiBzdGFydCBuZXcgbGlua2VkIGxpc3Qgb2YgZm9ybWF0IHVuaXRzICovCisJdGZzID0geHphbGxvYyhzaXplb2YoRlMpKTsgLypEQlU6W2RhdmVAY3JheS5jb21dIHN0YXJ0IG91dCBOVUxMICovCisJaWYgKCFkdW1wZXItPnB1Yi5mc2hlYWQpIHsKKwkJZHVtcGVyLT5wdWIuZnNoZWFkID0gdGZzOworCX0gZWxzZSB7CisJCUZTICpmc2xhc3QgPSBkdW1wZXItPnB1Yi5mc2hlYWQ7CisJCXdoaWxlIChmc2xhc3QtPm5leHRmcykKKwkJCWZzbGFzdCA9IGZzbGFzdC0+bmV4dGZzOworCQlmc2xhc3QtPm5leHRmcyA9IHRmczsKKwl9CisJbmV4dGZ1cHAgPSAmdGZzLT5uZXh0ZnU7CisKKwkvKiB0YWtlIHRoZSBmb3JtYXQgc3RyaW5nIGFuZCBicmVhayBpdCB1cCBpbnRvIGZvcm1hdCB1bml0cyAqLworCXAgPSBmbXQ7CisJZm9yICg7OykgeworCQlwID0gc2tpcF93aGl0ZXNwYWNlKHApOworCQlpZiAoKnAgPT0gJ1wwJykgeworCQkJYnJlYWs7CisJCX0KKworCQkvKiBhbGxvY2F0ZSBhIG5ldyBmb3JtYXQgdW5pdCBhbmQgbGluayBpdCBpbiAqLworCQkvKiBOT1NUUklDVCAqLworCQkvKiBEQlU6W2RhdmVAY3JheS5jb21dIHphbGxvYyBzbyB0aGF0IGZvcndhcmQgcG9pbnRlcnMgc3RhcnQgb3V0IE5VTEwgKi8KKwkJdGZ1ID0geHphbGxvYyhzaXplb2YoRlUpKTsKKwkJKm5leHRmdXBwID0gdGZ1OworCQluZXh0ZnVwcCA9ICZ0ZnUtPm5leHRmdTsKKwkJdGZ1LT5yZXBzID0gMTsKKworCQkvKiBpZiBsZWFkaW5nIGRpZ2l0LCByZXBldGl0aW9uIGNvdW50ICovCisJCWlmIChpc2RpZ2l0KCpwKSkgeworCQkJZm9yIChzYXZlcCA9IHA7IGlzZGlnaXQoKnApOyArK3ApCisJCQkJY29udGludWU7CisJCQlpZiAoIWlzc3BhY2UoKnApICYmICpwICE9ICcvJykgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgZm9ybWF0IHslc30iLCBmbXQpOworCQkJfQorCQkJLyogbWF5IG92ZXJ3cml0ZSBlaXRoZXIgd2hpdGUgc3BhY2Ugb3Igc2xhc2ggKi8KKwkJCXRmdS0+cmVwcyA9IGF0b2koc2F2ZXApOworCQkJdGZ1LT5mbGFncyA9IEZfU0VUUkVQOworCQkJLyogc2tpcCB0cmFpbGluZyB3aGl0ZSBzcGFjZSAqLworCQkJcCA9IHNraXBfd2hpdGVzcGFjZSgrK3ApOworCQl9CisKKwkJLyogc2tpcCBzbGFzaCBhbmQgdHJhaWxpbmcgd2hpdGUgc3BhY2UgKi8KKwkJaWYgKCpwID09ICcvJykgeworCQkJcCA9IHNraXBfd2hpdGVzcGFjZShwICsgMSk7CisJCX0KKworCQkvKiBieXRlIGNvdW50ICovCisJCWlmIChpc2RpZ2l0KCpwKSkgeworLy8gVE9ETzogdXNlIGJiX3N0cnRvdQorCQkJc2F2ZXAgPSBwOworCQkJd2hpbGUgKGlzZGlnaXQoKisrcCkpCisJCQkJY29udGludWU7CisJCQlpZiAoIWlzc3BhY2UoKnApKSB7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBmb3JtYXQgeyVzfSIsIGZtdCk7CisJCQl9CisJCQl0ZnUtPmJjbnQgPSBhdG9pKHNhdmVwKTsKKwkJCS8qIHNraXAgdHJhaWxpbmcgd2hpdGUgc3BhY2UgKi8KKwkJCXAgPSBza2lwX3doaXRlc3BhY2UocCArIDEpOworCQl9CisKKwkJLyogZm9ybWF0ICovCisJCWlmICgqcCAhPSAnIicpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgZm9ybWF0IHslc30iLCBmbXQpOworCQl9CisJCWZvciAoc2F2ZXAgPSArK3A7ICpwICE9ICciJzspIHsKKwkJCWlmICgqcCsrID09ICdcMCcpIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIGZvcm1hdCB7JXN9IiwgZm10KTsKKwkJCX0KKwkJfQorCQl0ZnUtPmZtdCA9IHhzdHJuZHVwKHNhdmVwLCBwIC0gc2F2ZXApOworLyogICAgICBlc2NhcGUodGZ1LT5mbXQpOyAqLworCisJCXAxID0gdGZ1LT5mbXQ7CisKKwkJLyogYWxwaGFiZXRpYyBlc2NhcGUgc2VxdWVuY2VzIGhhdmUgdG8gYmUgZG9uZSBpbiBwbGFjZSAqLworCQlmb3IgKHAyID0gcDE7OyArK3AxLCArK3AyKSB7CisJCQlpZiAoKnAxID09ICdcMCcpIHsKKwkJCQkqcDIgPSAqcDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoKnAxID09ICdcXCcpIHsKKwkJCQljb25zdCBjaGFyICpjcyA9IGNvbnZfc3RyICsgNDsKKwkJCQkrK3AxOworCQkJCSpwMiA9ICpwMTsKKwkJCQlkbyB7CisJCQkJCWlmICgqcDEgPT0gY3NbMl0pIHsKKwkJCQkJCSpwMiA9IGNzWzBdOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJY3MgKz0gNDsKKwkJCQl9IHdoaWxlICgqY3MpOworCQkJfQorCQl9CisKKwkJcCsrOworCX0KK30KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KZGlmZiAtLWdpdCBhL2xpYmJiL2VuZG9mbmFtZS5jIGIvbGliYmIvZW5kb2ZuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA1ZjA5MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2VuZG9mbmFtZS5jCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9rYnVpbGQ6bGliLXkgKz0gZW5kb2ZuYW1lLm8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgaXNfbmFtZShjKSAgICAgICgoYykgPT0gJ18nIHx8IGlzYWxwaGEoKHVuc2lnbmVkIGNoYXIpKGMpKSkKKyNkZWZpbmUgaXNfaW5fbmFtZShjKSAgICgoYykgPT0gJ18nIHx8IGlzYWxudW0oKHVuc2lnbmVkIGNoYXIpKGMpKSkKKworY29uc3QgY2hhciogRkFTVF9GVU5DCitlbmRvZm5hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoIWlzX25hbWUoKm5hbWUpKQorCQlyZXR1cm4gbmFtZTsKKwl3aGlsZSAoKisrbmFtZSkgeworCQlpZiAoIWlzX2luX25hbWUoKm5hbWUpKQorCQkJYnJlYWs7CisJfQorCXJldHVybiBuYW1lOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvZXhlY3V0YWJsZS5jIGIvbGliYmIvZXhlY3V0YWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZWNjM2UKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9leGVjdXRhYmxlLmMKQEAgLTAsMCArMSw5MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgR2FicmllbCBTb21sbyA8c29tbG8gYXQgY211LmVkdT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBjaGVjayBpZiBwYXRoIHBvaW50cyB0byBhbiBleGVjdXRhYmxlIGZpbGU7CisgKiByZXR1cm4gMSBpZiBmb3VuZDsKKyAqIHJldHVybiAwIG90aGVyd2lzZTsKKyAqLworaW50IEZBU1RfRlVOQyBmaWxlX2lzX2V4ZWN1dGFibGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzOworCXJldHVybiAoIWFjY2VzcyhuYW1lLCBYX09LKSAmJiAhc3RhdChuYW1lLCAmcykgJiYgU19JU1JFRyhzLnN0X21vZGUpKTsKK30KKworLyogc2VhcmNoICgqUEFUSHApIGZvciBhbiBleGVjdXRhYmxlIGZpbGU7CisgKiByZXR1cm4gYWxsb2NhdGVkIHN0cmluZyBjb250YWluaW5nIGZ1bGwgcGF0aCBpZiBmb3VuZDsKKyAqICBQQVRIcCBwb2ludHMgdG8gdGhlIGNvbXBvbmVudCBhZnRlciB0aGUgb25lIHdoZXJlIGl0IHdhcyBmb3VuZAorICogIChvciBOVUxMKSwKKyAqICB5b3UgbWF5IGNhbGwgZmluZF9leGVjdXRhYmxlIGFnYWluIHdpdGggdGhpcyBQQVRIcCB0byBjb250aW51ZQorICogIChpZiBpdCdzIG5vdCBOVUxMKS4KKyAqIHJldHVybiBOVUxMIG90aGVyd2lzZTsgKFBBVEhwIGlzIHVuZGVmaW5lZCkKKyAqIGluIGFsbCBjYXNlcyAoKlBBVEhwKSBjb250ZW50cyB3aWxsIGJlIHRyYXNoZWQgKHMvOi9OVUwvKS4KKyAqLworY2hhciogRkFTVF9GVU5DIGZpbmRfZXhlY3V0YWJsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY2hhciAqKlBBVEhwKQoreworCS8qIEFib3V0IGVtcHR5IGNvbXBvbmVudHMgaW4gJFBBVEg6CisJICogaHR0cDovL3B1YnMub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS9iYXNlZGVmcy94YmRfY2hhcDA4Lmh0bWwKKwkgKiA4LjMgT3RoZXIgRW52aXJvbm1lbnQgVmFyaWFibGVzIC0gUEFUSAorCSAqIEEgemVyby1sZW5ndGggcHJlZml4IGlzIGEgbGVnYWN5IGZlYXR1cmUgdGhhdCBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQKKwkgKiB3b3JraW5nIGRpcmVjdG9yeS4gSXQgYXBwZWFycyBhcyB0d28gYWRqYWNlbnQgY29sb25zICggIjo6IiApLCBhcyBhbgorCSAqIGluaXRpYWwgY29sb24gcHJlY2VkaW5nIHRoZSByZXN0IG9mIHRoZSBsaXN0LCBvciBhcyBhIHRyYWlsaW5nIGNvbG9uCisJICogZm9sbG93aW5nIHRoZSByZXN0IG9mIHRoZSBsaXN0LgorCSAqLworCWNoYXIgKnAsICpuOworCisJcCA9ICpQQVRIcDsKKwl3aGlsZSAocCkgeworCQluID0gc3RyY2hyKHAsICc6Jyk7CisJCWlmIChuKQorCQkJKm4rKyA9ICdcMCc7CisJCXAgPSBjb25jYXRfcGF0aF9maWxlKAorCQkJcFswXSA/IHAgOiAiLiIsIC8qIGhhbmRsZSAiOjoiIGNhc2UgKi8KKwkJCWZpbGVuYW1lCisJCSk7CisJCWlmIChmaWxlX2lzX2V4ZWN1dGFibGUocCkpIHsKKwkJCSpQQVRIcCA9IG47CisJCQlyZXR1cm4gcDsKKwkJfQorCQlmcmVlKHApOworCQlwID0gbjsKKwl9IC8qIG9uIGxvb3AgZXhpdCBwID09IE5VTEwgKi8KKwlyZXR1cm4gcDsKK30KKworLyogc2VhcmNoICRQQVRIIGZvciBhbiBleGVjdXRhYmxlIGZpbGU7CisgKiByZXR1cm4gMSBpZiBmb3VuZDsKKyAqIHJldHVybiAwIG90aGVyd2lzZTsKKyAqLworaW50IEZBU1RfRlVOQyBleGVjdXRhYmxlX2V4aXN0cyhjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwljaGFyICpwYXRoID0geHN0cmR1cChnZXRlbnYoIlBBVEgiKSk7CisJY2hhciAqdG1wID0gcGF0aDsKKwljaGFyICpyZXQgPSBmaW5kX2V4ZWN1dGFibGUoZmlsZW5hbWUsICZ0bXApOworCWZyZWUocGF0aCk7CisJZnJlZShyZXQpOworCXJldHVybiByZXQgIT0gTlVMTDsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1BSRUZFUl9BUFBMRVRTCisvKiBqdXN0IGxpa2UgdGhlIHJlYWwgZXhlY3ZwLCBidXQgdHJ5IHRvIGxhdW5jaCBhbiBhcHBsZXQgbmFtZWQgJ2ZpbGUnIGZpcnN0ICovCitpbnQgRkFTVF9GVU5DIEJCX0VYRUNWUChjb25zdCBjaGFyICpmaWxlLCBjaGFyICpjb25zdCBhcmd2W10pCit7CisJaWYgKGZpbmRfYXBwbGV0X2J5X25hbWUoZmlsZSkgPj0gMCkKKwkJZXhlY3ZwKGJiX2J1c3lib3hfZXhlY19wYXRoLCBhcmd2KTsKKwlyZXR1cm4gZXhlY3ZwKGZpbGUsIGFyZ3YpOworfQorI2VuZGlmCisKK2ludCBGQVNUX0ZVTkMgQkJfRVhFQ1ZQX29yX2RpZShjaGFyICoqYXJndikKK3sKKwlCQl9FWEVDVlAoYXJndlswXSwgYXJndik7CisJLyogU1VTdjMtbWFuZGF0ZWQgZXhpdCBjb2RlcyAqLworCXhmdW5jX2Vycm9yX3JldHZhbCA9IChlcnJubyA9PSBFTk9FTlQpID8gMTI3IDogMTI2OworCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZXhlY3V0ZSAnJXMnIiwgYXJndlswXSk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9mY2xvc2Vfbm9uc3RkaW4uYyBiL2xpYmJiL2ZjbG9zZV9ub25zdGRpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMTQ0MTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9mY2xvc2Vfbm9uc3RkaW4uYwpAQCAtMCwwICsxLDI2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBmY2xvc2Vfbm9uc3RkaW4gaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEEgbnVtYmVyIG9mIHN0YW5kYXJkIHV0aWxpdGllcyBjYW4gYWNjZXB0IG11bHRpcGxlIGNvbW1hbmQgbGluZSBhcmdzCisgKiBvZiAnLScgZm9yIHN0ZGluLCBhY2NvcmRpbmcgdG8gU1VTdjMuICBTbyB3ZSBlbmNhcHN1bGF0ZSB0aGUgY2hlY2sKKyAqIGhlcmUgdG8gc2F2ZSBhIGxpdHRsZSBzcGFjZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IEZBU1RfRlVOQyBmY2xvc2VfaWZfbm90X3N0ZGluKEZJTEUgKmYpCit7CisJLyogU29tZSBtb3JlIHBhcmFub2lkIGFwcGxldHMgd2FudCBmZXJyb3IoKSBjaGVjayB0b28gKi8KKwlpbnQgciA9IGZlcnJvcihmKTsgLyogTkI6IGRvZXMgTk9UIHNldCBlcnJubyEgKi8KKwlpZiAocikKKwkJZXJybm8gPSBFSU87IC8qIHNvIHdlJ2xsIGhlbHAgaXQgKi8KKwlpZiAoZiAhPSBzdGRpbikKKwkJcmV0dXJuIChyIHwgZmNsb3NlKGYpKTsgLyogZmNsb3NlIGRvZXMgc2V0IGVycm5vIG9uIGVycm9yICovCisJcmV0dXJuIHI7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9mZmx1c2hfc3Rkb3V0X2FuZF9leGl0LmMgYi9saWJiYi9mZmx1c2hfc3Rkb3V0X2FuZF9leGl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiZWQ4NgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2ZmbHVzaF9zdGRvdXRfYW5kX2V4aXQuYwpAQCAtMCwwICsxLDI0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBmZmx1c2hfc3Rkb3V0X2FuZF9leGl0IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBBdHRlbXB0IHRvIGZmbHVzaChzdGRvdXQpLCBhbmQgZXhpdCB3aXRoIGFuIGVycm9yIGNvZGUgaWYgc3Rkb3V0IGlzCisgKiBpbiBhbiBlcnJvciBzdGF0ZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKwordm9pZCBGQVNUX0ZVTkMgZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChpbnQgcmV0dmFsKQoreworCXhmdW5jX2Vycm9yX3JldHZhbCA9IHJldHZhbDsKKwlpZiAoZmZsdXNoKHN0ZG91dCkpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfc3RhbmRhcmRfb3V0cHV0KTsKKwkvKiBJbiBjYXNlIHdlIGFyZSBpbiBOT0ZPUksgYXBwbGV0LiBEbyBub3QgZXhpdCgpIGRpcmVjdGx5LAorCSAqIGJ1dCB1c2UgeGZ1bmNfZGllKCkgKi8KKwl4ZnVuY19kaWUoKTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2ZnZXRzX3N0ci5jIGIvbGliYmIvZmdldHNfc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkyMTBhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2ZnZXRzX3N0ci5jCkBAIC0wLDAgKzEsODYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSBtYW55IGRpZmZlcmVudCBwZW9wbGUuCisgKiBJZiB5b3Ugd3JvdGUgdGhpcywgcGxlYXNlIGFja25vd2xlZGdlIHlvdXIgd29yay4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdGF0aWMgY2hhciAqeG1hbGxvY19mZ2V0c19pbnRlcm5hbChGSUxFICpmaWxlLCBjb25zdCBjaGFyICp0ZXJtaW5hdGluZ19zdHJpbmcsIGludCBjaG9wX29mZiwgc2l6ZV90ICptYXhzel9wKQoreworCWNoYXIgKmxpbmVidWYgPSBOVUxMOworCWNvbnN0IGludCB0ZXJtX2xlbmd0aCA9IHN0cmxlbih0ZXJtaW5hdGluZ19zdHJpbmcpOworCWludCBlbmRfc3RyaW5nX29mZnNldDsKKwlpbnQgbGluZWJ1ZnN6ID0gMDsKKwlpbnQgaWR4ID0gMDsKKwlpbnQgY2g7CisJc2l6ZV90IG1heHN6ID0gKm1heHN6X3A7CisKKwl3aGlsZSAoMSkgeworCQljaCA9IGZnZXRjKGZpbGUpOworCQlpZiAoY2ggPT0gRU9GKSB7CisJCQlpZiAoaWR4ID09IDApCisJCQkJcmV0dXJuIGxpbmVidWY7IC8qIE5VTEwgKi8KKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKGlkeCA+PSBsaW5lYnVmc3opIHsKKwkJCWxpbmVidWZzeiArPSAyMDA7CisJCQlsaW5lYnVmID0geHJlYWxsb2MobGluZWJ1ZiwgbGluZWJ1ZnN6KTsKKwkJCWlmIChpZHggPj0gbWF4c3opIHsKKwkJCQlsaW5lYnVmW2lkeF0gPSBjaDsKKwkJCQlpZHgrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWxpbmVidWZbaWR4XSA9IGNoOworCQlpZHgrKzsKKworCQkvKiBDaGVjayBmb3IgdGVybWluYXRpbmcgc3RyaW5nICovCisJCWVuZF9zdHJpbmdfb2Zmc2V0ID0gaWR4IC0gdGVybV9sZW5ndGg7CisJCWlmIChlbmRfc3RyaW5nX29mZnNldCA+PSAwCisJCSAmJiBtZW1jbXAoJmxpbmVidWZbZW5kX3N0cmluZ19vZmZzZXRdLCB0ZXJtaW5hdGluZ19zdHJpbmcsIHRlcm1fbGVuZ3RoKSA9PSAwCisJCSkgeworCQkJaWYgKGNob3Bfb2ZmKQorCQkJCWlkeCAtPSB0ZXJtX2xlbmd0aDsKKwkJCWJyZWFrOworCQl9CisJfQorCS8qIEdyb3cvc2hyaW5rICpmaXJzdCosIHRoZW4gc3RvcmUgTlVMICovCisJbGluZWJ1ZiA9IHhyZWFsbG9jKGxpbmVidWYsIGlkeCArIDEpOworCWxpbmVidWZbaWR4XSA9ICdcMCc7CisJKm1heHN6X3AgPSBpZHg7CisJcmV0dXJuIGxpbmVidWY7Cit9CisKKy8qIFJlYWQgdXAgdG8gVEVSTUlOQVRJTkdfU1RSSU5HIGZyb20gRklMRSBhbmQgcmV0dXJuIGl0LAorICogaW5jbHVkaW5nIHRlcm1pbmF0aW5nIHN0cmluZy4KKyAqIE5vbi10ZXJtaW5hdGVkIHN0cmluZyBjYW4gYmUgcmV0dXJuZWQgaWYgRU9GIGlzIHJlYWNoZWQuCisgKiBSZXR1cm4gTlVMTCBpZiBFT0YgaXMgcmVhY2hlZCBpbW1lZGlhdGVseS4gICovCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19mZ2V0c19zdHIoRklMRSAqZmlsZSwgY29uc3QgY2hhciAqdGVybWluYXRpbmdfc3RyaW5nKQoreworCXNpemVfdCBtYXhzeiA9IElOVF9NQVggLSA0MDk1OworCXJldHVybiB4bWFsbG9jX2ZnZXRzX2ludGVybmFsKGZpbGUsIHRlcm1pbmF0aW5nX3N0cmluZywgMCwgJm1heHN6KTsKK30KKworY2hhciogRkFTVF9GVU5DIHhtYWxsb2NfZmdldHNfc3RyX2xlbihGSUxFICpmaWxlLCBjb25zdCBjaGFyICp0ZXJtaW5hdGluZ19zdHJpbmcsIHNpemVfdCAqbWF4c3pfcCkKK3sKKwlzaXplX3QgbWF4c3o7CisKKwlpZiAoIW1heHN6X3ApIHsKKwkJbWF4c3ogPSBJTlRfTUFYIC0gNDA5NTsKKwkJbWF4c3pfcCA9ICZtYXhzejsKKwl9CisJcmV0dXJuIHhtYWxsb2NfZmdldHNfaW50ZXJuYWwoZmlsZSwgdGVybWluYXRpbmdfc3RyaW5nLCAwLCBtYXhzel9wKTsKK30KKworY2hhciogRkFTVF9GVU5DIHhtYWxsb2NfZmdldGxpbmVfc3RyKEZJTEUgKmZpbGUsIGNvbnN0IGNoYXIgKnRlcm1pbmF0aW5nX3N0cmluZykKK3sKKwlzaXplX3QgbWF4c3ogPSBJTlRfTUFYIC0gNDA5NTsKKwlyZXR1cm4geG1hbGxvY19mZ2V0c19pbnRlcm5hbChmaWxlLCB0ZXJtaW5hdGluZ19zdHJpbmcsIDEsICZtYXhzeik7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9maW5kX21vdW50X3BvaW50LmMgYi9saWJiYi9maW5kX21vdW50X3BvaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3NmI1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2ZpbmRfbW91bnRfcG9pbnQuYwpAQCAtMCwwICsxLDY5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPG1udGVudC5oPgorCisvKgorICogR2l2ZW4gYSBibG9jayBkZXZpY2UsIGZpbmQgdGhlIG1vdW50IHRhYmxlIGVudHJ5IGlmIHRoYXQgYmxvY2sgZGV2aWNlCisgKiBpcyBtb3VudGVkLgorICoKKyAqIEdpdmVuIGFueSBvdGhlciBmaWxlIChvciBkaXJlY3RvcnkpLCBmaW5kIHRoZSBtb3VudCB0YWJsZSBlbnRyeSBmb3IgaXRzCisgKiBmaWxlc3lzdGVtLgorICovCitzdHJ1Y3QgbW50ZW50KiBGQVNUX0ZVTkMgZmluZF9tb3VudF9wb2ludChjb25zdCBjaGFyICpuYW1lLCBpbnQgc3ViZGlyX3RvbykKK3sKKwlzdHJ1Y3Qgc3RhdCBzOworCUZJTEUgKm10YWJfZnA7CisJc3RydWN0IG1udGVudCAqbW91bnRFbnRyeTsKKwlkZXZfdCBkZXZub19vZl9uYW1lOworCWJvb2wgYmxvY2tfZGV2OworCisJaWYgKHN0YXQobmFtZSwgJnMpICE9IDApCisJCXJldHVybiBOVUxMOworCisJZGV2bm9fb2ZfbmFtZSA9IHMuc3RfZGV2OworCWJsb2NrX2RldiA9IDA7CisJLyogV2h5IFNfSVNDSFI/IC0gVUJJIHZvbHVtZXMgdXNlIGNoYXIgZGV2aWNlcywgbm90IGJsb2NrICovCisJaWYgKFNfSVNCTEsocy5zdF9tb2RlKSB8fCBTX0lTQ0hSKHMuc3RfbW9kZSkpIHsKKwkJZGV2bm9fb2ZfbmFtZSA9IHMuc3RfcmRldjsKKwkJYmxvY2tfZGV2ID0gMTsKKwl9CisKKwltdGFiX2ZwID0gc2V0bW50ZW50KGJiX3BhdGhfbXRhYl9maWxlLCAiciIpOworCWlmICghbXRhYl9mcCkKKwkJcmV0dXJuIE5VTEw7CisKKwl3aGlsZSAoKG1vdW50RW50cnkgPSBnZXRtbnRlbnQobXRhYl9mcCkpICE9IE5VTEwpIHsKKwkJLyogcm9vdGZzIG1vdW50IGluIExpbnV4IDIuNiBleGlzdHMgYWx3YXlzLAorCQkgKiBhbmQgaXQgbWFrZXMgc2Vuc2UgdG8gYWx3YXlzIGlnbm9yZSBpdC4KKwkJICogT3RoZXJ3aXNlIHBlb3BsZSBjYW4ndCByZWZlcmVuY2UgdGhlaXIgInJlYWwiIHJvb3QhICovCisJCWlmIChFTkFCTEVfRkVBVFVSRV9TS0lQX1JPT1RGUyAmJiBzdHJjbXAobW91bnRFbnRyeS0+bW50X2ZzbmFtZSwgInJvb3RmcyIpID09IDApCisJCQljb250aW51ZTsKKworCQlpZiAoc3RyY21wKG5hbWUsIG1vdW50RW50cnktPm1udF9kaXIpID09IDAKKwkJIHx8IHN0cmNtcChuYW1lLCBtb3VudEVudHJ5LT5tbnRfZnNuYW1lKSA9PSAwCisJCSkgeyAvKiBTdHJpbmcgbWF0Y2guICovCisJCQlicmVhazsKKwkJfQorCisJCWlmICghKHN1YmRpcl90b28gfHwgYmxvY2tfZGV2KSkKKwkJCWNvbnRpbnVlOworCisJCS8qIElzIGRldmljZSdzIGRldl90ID09IG5hbWUncyBkZXZfdD8gKi8KKwkJaWYgKHN0YXQobW91bnRFbnRyeS0+bW50X2ZzbmFtZSwgJnMpID09IDAgJiYgcy5zdF9yZGV2ID09IGRldm5vX29mX25hbWUpCisJCQlicmVhazsKKwkJLyogTWF0Y2ggdGhlIGRpcmVjdG9yeSdzIG1vdW50IHBvaW50LiAqLworCQlpZiAoc3RhdChtb3VudEVudHJ5LT5tbnRfZGlyLCAmcykgPT0gMCAmJiBzLnN0X2RldiA9PSBkZXZub19vZl9uYW1lKQorCQkJYnJlYWs7CisJfQorCWVuZG1udGVudChtdGFiX2ZwKTsKKworCXJldHVybiBtb3VudEVudHJ5OworfQpkaWZmIC0tZ2l0IGEvbGliYmIvZmluZF9waWRfYnlfbmFtZS5jIGIvbGliYmIvZmluZF9waWRfYnlfbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiODIzZDAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9maW5kX3BpZF9ieV9uYW1lLmMKQEAgLTAsMCArMSwxMjAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qCitJbiBMaW51eCB3ZSBoYXZlIHRocmVlIHdheXMgdG8gZGV0ZXJtaW5lICJwcm9jZXNzIG5hbWUiOgorMS4gL3Byb2MvUElEL3N0YXQgaGFzICIuLi4obmFtZSkuLi4iLCBhbW9uZyBvdGhlciB0aGluZ3MuIEl0J3Mgc28tY2FsbGVkICJjb21tIiBmaWVsZC4KKzIuIC9wcm9jL1BJRC9jbWRsaW5lJ3MgZmlyc3QgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nLiBJdCdzIGFyZ3ZbMF0gZnJvbSBleGVjIHN5c2NhbGwuCiszLiAvcHJvYy9QSUQvZXhlIHN5bWxpbmsuIFBvaW50cyB0byB0aGUgcnVubmluZyBleGVjdXRhYmxlIGZpbGUuCisKK2tlcm5lbCB0aHJlYWRzOgorIGNvbW06IHRocmVhZCBuYW1lCisgY21kbGluZTogZW1wdHkKKyBleGU6IDxyZWFkbGluayBmYWlscz4KKworZXhlY3V0YWJsZQorIGNvbW06IGZpcnN0IDE1IGNoYXJzIG9mIGJhc2UgbmFtZQorIChpZiBleGVjdXRhYmxlIGlzIGEgc3ltbGluaywgdGhlbiBmaXJzdCAxNSBjaGFycyBvZiBzeW1saW5rIG5hbWUgYXJlIHVzZWQpCisgY21kbGluZTogYXJndlswXSBmcm9tIGV4ZWMgc3lzY2FsbAorIGV4ZTogcG9pbnRzIHRvIGV4ZWN1dGFibGUgKHJlc29sdmVzIHN5bWxpbmssIHVubGlrZSBjb21tKQorCitzY3JpcHQgKGFuIGV4ZWN1dGFibGUgd2l0aCAjIS9wYXRoL3RvL2ludGVycHJldGVyKToKKyBjb21tOiBmaXJzdCAxNSBjaGFycyBvZiBzY3JpcHQncyBiYXNlIG5hbWUgKHN5bWxpbmtzIGFyZSBub3QgcmVzb2x2ZWQpCisgY21kbGluZTogL3BhdGgvdG8vaW50ZXJwcmV0ZXIgKHN5bWxpbmtzIGFyZSBub3QgcmVzb2x2ZWQpCisgKHNjcmlwdCBuYW1lIGlzIGluIGFyZ3ZbMV0sIGFyZ3MgYXJlIHB1c2hlZCBpbnRvIGFyZ3ZbMl0gZXRjKQorIGV4ZTogcG9pbnRzIHRvIGludGVycHJldGVyJ3MgZXhlY3V0YWJsZSAoc3ltbGlua3MgYXJlIHJlc29sdmVkKQorCitJZiBGRUFUVVJFX1BSRUZFUl9BUFBMRVRTPXkgKGFuZCBtb3JlIHNvIGlmIEZFQVRVUkVfU0hfU1RBTkRBTE9ORT15KSwKK3NvbWUgY29tbWFuZHMgc3RhcnRlZCBmcm9tIGJ1c3lib3ggc2hlbGwsIHhhcmdzIG9yIGZpbmQgYXJlIHN0YXJ0ZWQgYnkKK2V4ZWNYWFgoIi9wcm9jL3NlbGYvZXhlIiwgYXBwbGV0X25hbWUsIHBhcmFtcy4uLi4pCithbmQgdGhlcmVmb3JlIGNvbW0gZmllbGQgY29udGFpbnMgImV4ZSIuCisqLworCitzdGF0aWMgaW50IGNvbW1fbWF0Y2gocHJvY3BzX3N0YXR1c190ICpwLCBjb25zdCBjaGFyICpwcm9jTmFtZSkKK3sKKwlpbnQgYXJndjFpZHg7CisJY29uc3QgY2hhciAqYXJndjE7CisKKwlpZiAoc3RybmNtcChwLT5jb21tLCBwcm9jTmFtZSwgMTUpICE9IDApCisJCXJldHVybiAwOyAvKiBjb21tIGRvZXMgbm90IG1hdGNoICovCisKKwkvKiBJbiBMaW51eCwgaWYgY29tbSBpcyAxNSBjaGFycywgaXQgaXMgdHJ1bmNhdGVkLgorCSAqIChvciBtYXliZSB0aGUgbmFtZSB3YXMgZXhhY3RseSAxNSBjaGFycywgYnV0IHRoZXJlIGlzCisJICogbm8gd2F5IHRvIGtub3cgdGhhdCkgKi8KKwlpZiAocC0+Y29tbVsxNF0gPT0gJ1wwJykKKwkJcmV0dXJuIDE7IC8qIGNvbW0gaXMgbm90IHRydW5jYXRlZCAtIG1hdGNoZXMgKi8KKworCS8qIGNvbW0gaXMgdHJ1bmNhdGVkLCBidXQgZmlyc3QgMTUgY2hhcnMgbWF0Y2guCisJICogVGhpcyBjYW4gYmUgY3JhemlseV9sb25nX3NjcmlwdF9uYW1lLnNoIQorCSAqIFRoZSB0ZWxsdGFsZSBzaWduIGlzIGJhc2VuYW1lKGFyZ3ZbMV0pID09IHByb2NOYW1lICovCisKKwlpZiAoIXAtPmFyZ3YwKQorCQlyZXR1cm4gMDsKKworCWFyZ3YxaWR4ID0gc3RybGVuKHAtPmFyZ3YwKSArIDE7CisJaWYgKGFyZ3YxaWR4ID49IHAtPmFyZ3ZfbGVuKQorCQlyZXR1cm4gMDsKKwlhcmd2MSA9IHAtPmFyZ3YwICsgYXJndjFpZHg7CisKKwlpZiAoc3RyY21wKGJiX2Jhc2VuYW1lKGFyZ3YxKSwgcHJvY05hbWUpICE9IDApCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qIFRoaXMgZmluZHMgdGhlIHBpZCBvZiB0aGUgc3BlY2lmaWVkIHByb2Nlc3MuCisgKiBDdXJyZW50bHksIGl0J3MgaW1wbGVtZW50ZWQgYnkgcnVtbWFnaW5nIHRocm91Z2gKKyAqIHRoZSBwcm9jIGZpbGVzeXN0ZW0uCisgKgorICogUmV0dXJucyBhIGxpc3Qgb2YgYWxsIG1hdGNoaW5nIFBJRHMKKyAqIEl0IGlzIHRoZSBjYWxsZXIncyBkdXR5IHRvIGZyZWUgdGhlIHJldHVybmVkIHBpZGxpc3QuCisgKgorICogTW9kaWZpZWQgYnkgVmxhZGltaXIgT2xleW5payBmb3IgdXNlIHdpdGggbGliYmIvcHJvY3BzLmMKKyAqLworcGlkX3QqIEZBU1RfRlVOQyBmaW5kX3BpZF9ieV9uYW1lKGNvbnN0IGNoYXIgKnByb2NOYW1lKQoreworCXBpZF90KiBwaWRMaXN0OworCWludCBpID0gMDsKKwlwcm9jcHNfc3RhdHVzX3QqIHAgPSBOVUxMOworCisJcGlkTGlzdCA9IHh6YWxsb2Moc2l6ZW9mKCpwaWRMaXN0KSk7CisJd2hpbGUgKChwID0gcHJvY3BzX3NjYW4ocCwgUFNTQ0FOX1BJRHxQU1NDQU5fQ09NTXxQU1NDQU5fQVJHVk58UFNTQ0FOX0VYRSkpKSB7CisJCWlmIChjb21tX21hdGNoKHAsIHByb2NOYW1lKQorCQkvKiBvciB3ZSByZXF1aXJlIGFyZ3YwIHRvIG1hdGNoIChlc3NlbnRpYWwgZm9yIG1hdGNoaW5nIHJlZXhlY2VkIC9wcm9jL3NlbGYvZXhlKSovCisJCSB8fCAocC0+YXJndjAgJiYgc3RyY21wKGJiX2Jhc2VuYW1lKHAtPmFyZ3YwKSwgcHJvY05hbWUpID09IDApCisJCS8qIG9yIHdlIHJlcXVpcmUgL3Byb2MvUElEL2V4ZSBsaW5rIHRvIG1hdGNoICovCisJCSB8fCAocC0+ZXhlICYmIHN0cmNtcChiYl9iYXNlbmFtZShwLT5leGUpLCBwcm9jTmFtZSkgPT0gMCkKKwkJKSB7CisJCQlwaWRMaXN0ID0geHJlYWxsb2NfdmVjdG9yKHBpZExpc3QsIDIsIGkpOworCQkJcGlkTGlzdFtpKytdID0gcC0+cGlkOworCQl9CisJfQorCisJcGlkTGlzdFtpXSA9IDA7CisJcmV0dXJuIHBpZExpc3Q7Cit9CisKK3BpZF90KiBGQVNUX0ZVTkMgcGlkbGlzdF9yZXZlcnNlKHBpZF90ICpwaWRMaXN0KQoreworCWludCBpID0gMDsKKwl3aGlsZSAocGlkTGlzdFtpXSkKKwkJaSsrOworCWlmICgtLWkgPj0gMCkgeworCQlwaWRfdCBrOworCQlpbnQgajsKKwkJZm9yIChqID0gMDsgaSA+IGo7IGktLSwgaisrKSB7CisJCQlrID0gcGlkTGlzdFtpXTsKKwkJCXBpZExpc3RbaV0gPSBwaWRMaXN0W2pdOworCQkJcGlkTGlzdFtqXSA9IGs7CisJCX0KKwl9CisJcmV0dXJuIHBpZExpc3Q7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9maW5kX3Jvb3RfZGV2aWNlLmMgYi9saWJiYi9maW5kX3Jvb3RfZGV2aWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzNmNkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2ZpbmRfcm9vdF9kZXZpY2UuYwpAQCAtMCwwICsxLDc1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBGaW5kIGJsb2NrIGRldmljZSAvZGV2L1hYWCB3aGljaCBjb250YWlucyBzcGVjaWZpZWQgZmlsZQorICogV2UgaGFuZGxlIC9kZXYvZGlyL2Rpci9kaXIgdG9vLCBhdCBhIGNvc3Qgb2YgfjgwIG1vcmUgYnl0ZXMgY29kZSAqLworCisvKiBEbyBub3QgcmVhbGxvY2F0ZSBhbGwgdGhpcyBzdHVmZiBvbiBlYWNoIHJlY3Vyc2lvbiAqLworZW51bSB7IERFVk5BTUVfTUFYID0gMjU2IH07CitzdHJ1Y3QgYXJlbmEgeworCXN0cnVjdCBzdGF0IHN0OworCWRldl90IGRldjsKKwkvKiBXYXMgUEFUSF9NQVgsIGJ1dCB3ZSByZWN1cnNlIF8vZGV2Xy4gV2UgY2FuIGFzc3VtZQorCSAqIHBlb3BsZSBhcmUgbm90IGNyYXp5IGVub3VnaCB0byBoYXZlIG1lZ2EtZGVlcCB0cmVlIHRoZXJlICovCisJY2hhciBkZXZwYXRoW0RFVk5BTUVfTUFYXTsKK307CisKK3N0YXRpYyBjaGFyICpmaW5kX2Jsb2NrX2RldmljZV9pbl9kaXIoc3RydWN0IGFyZW5hICphcCkKK3sKKwlESVIgKmRpcjsKKwlzdHJ1Y3QgZGlyZW50ICplbnRyeTsKKwljaGFyICpyZXRwYXRoID0gTlVMTDsKKwlpbnQgbGVuLCByZW07CisKKwlsZW4gPSBzdHJsZW4oYXAtPmRldnBhdGgpOworCXJlbSA9IERFVk5BTUVfTUFYLTIgLSBsZW47CisJaWYgKHJlbSA8PSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWRpciA9IG9wZW5kaXIoYXAtPmRldnBhdGgpOworCWlmICghZGlyKQorCQlyZXR1cm4gTlVMTDsKKworCWFwLT5kZXZwYXRoW2xlbisrXSA9ICcvJzsKKworCXdoaWxlICgoZW50cnkgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJc2FmZV9zdHJuY3B5KGFwLT5kZXZwYXRoICsgbGVuLCBlbnRyeS0+ZF9uYW1lLCByZW0pOworCQkvKiBsc3RhdDogZG8gbm90IGZvbGxvdyBsaW5rcyAqLworCQlpZiAobHN0YXQoYXAtPmRldnBhdGgsICZhcC0+c3QpICE9IDApCisJCQljb250aW51ZTsKKwkJaWYgKFNfSVNCTEsoYXAtPnN0LnN0X21vZGUpICYmIGFwLT5zdC5zdF9yZGV2ID09IGFwLT5kZXYpIHsKKwkJCXJldHBhdGggPSB4c3RyZHVwKGFwLT5kZXZwYXRoKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChTX0lTRElSKGFwLT5zdC5zdF9tb2RlKSkgeworCQkJLyogRG8gbm90IHJlY3Vyc2UgZm9yICcuJyBhbmQgJy4uJyAqLworCQkJaWYgKERPVF9PUl9ET1RET1QoZW50cnktPmRfbmFtZSkpCisJCQkJY29udGludWU7CisJCQlyZXRwYXRoID0gZmluZF9ibG9ja19kZXZpY2VfaW5fZGlyKGFwKTsKKwkJCWlmIChyZXRwYXRoKQorCQkJCWJyZWFrOworCQl9CisJfQorCWNsb3NlZGlyKGRpcik7CisKKwlyZXR1cm4gcmV0cGF0aDsKK30KKworY2hhciogRkFTVF9GVU5DIGZpbmRfYmxvY2tfZGV2aWNlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RydWN0IGFyZW5hIGE7CisKKwlpZiAoc3RhdChwYXRoLCAmYS5zdCkgIT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJYS5kZXYgPSBTX0lTQkxLKGEuc3Quc3RfbW9kZSkgPyBhLnN0LnN0X3JkZXYgOiBhLnN0LnN0X2RldjsKKwlzdHJjcHkoYS5kZXZwYXRoLCAiL2RldiIpOworCXJldHVybiBmaW5kX2Jsb2NrX2RldmljZV9pbl9kaXIoJmEpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvZnVsbF93cml0ZS5jIGIvbGliYmIvZnVsbF93cml0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3N2ZiZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9mdWxsX3dyaXRlLmMKQEAgLTAsMCArMSw0MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyoKKyAqIFdyaXRlIGFsbCBvZiB0aGUgc3VwcGxpZWQgYnVmZmVyIG91dCB0byBhIGZpbGUuCisgKiBUaGlzIGRvZXMgbXVsdGlwbGUgd3JpdGVzIGFzIG5lY2Vzc2FyeS4KKyAqIFJldHVybnMgdGhlIGFtb3VudCB3cml0dGVuLCBvciAtMSBvbiBhbiBlcnJvci4KKyAqLworc3NpemVfdCBGQVNUX0ZVTkMgZnVsbF93cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzc2l6ZV90IGNjOworCXNzaXplX3QgdG90YWw7CisKKwl0b3RhbCA9IDA7CisKKwl3aGlsZSAobGVuKSB7CisJCWNjID0gc2FmZV93cml0ZShmZCwgYnVmLCBsZW4pOworCisJCWlmIChjYyA8IDApIHsKKwkJCWlmICh0b3RhbCkgeworCQkJCS8qIHdlIGFscmVhZHkgd3JvdGUgc29tZSEgKi8KKwkJCQkvKiB1c2VyIGNhbiBkbyBhbm90aGVyIHdyaXRlIHRvIGtub3cgdGhlIGVycm9yIGNvZGUgKi8KKwkJCQlyZXR1cm4gdG90YWw7CisJCQl9CisJCQlyZXR1cm4gY2M7ICAvKiB3cml0ZSgpIHJldHVybnMgLTEgb24gZmFpbHVyZS4gKi8KKwkJfQorCisJCXRvdGFsICs9IGNjOworCQlidWYgPSAoKGNvbnN0IGNoYXIgKilidWYpICsgY2M7CisJCWxlbiAtPSBjYzsKKwl9CisKKwlyZXR1cm4gdG90YWw7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9nZXRfY29uc29sZS5jIGIvbGliYmIvZ2V0X2NvbnNvbGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjY0MDdiCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvZ2V0X2NvbnNvbGUuYwpAQCAtMCwwICsxLDgwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgbWFueSBkaWZmZXJlbnQgcGVvcGxlLiAgSWYgeW91IHdyb3RlIHRoaXMsIHBsZWFzZQorICogYWNrbm93bGVkZ2UgeW91ciB3b3JrLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIEZyb20gPGxpbnV4L2tkLmg+ICovCitlbnVtIHsgS0RHS0JUWVBFID0gMHg0QjMzIH07ICAvKiBnZXQga2V5Ym9hcmQgdHlwZSAqLworCitzdGF0aWMgaW50IG9wZW5fYV9jb25zb2xlKGNvbnN0IGNoYXIgKmZuYW0pCit7CisJaW50IGZkOworCisJLyogdHJ5IHJlYWQtd3JpdGUgKi8KKwlmZCA9IG9wZW4oZm5hbSwgT19SRFdSKTsKKworCS8qIGlmIGZhaWxlZCwgdHJ5IHJlYWQtb25seSAqLworCWlmIChmZCA8IDAgJiYgZXJybm8gPT0gRUFDQ0VTKQorCQlmZCA9IG9wZW4oZm5hbSwgT19SRE9OTFkpOworCisJLyogaWYgZmFpbGVkLCB0cnkgd3JpdGUtb25seSAqLworCWlmIChmZCA8IDAgJiYgZXJybm8gPT0gRUFDQ0VTKQorCQlmZCA9IG9wZW4oZm5hbSwgT19XUk9OTFkpOworCisJcmV0dXJuIGZkOworfQorCisvKgorICogR2V0IGFuIGZkIGZvciB1c2Ugd2l0aCBrYmQvY29uc29sZSBpb2N0bHMuCisgKiBXZSB0cnkgc2V2ZXJhbCB0aGluZ3MgYmVjYXVzZSBvcGVuaW5nIC9kZXYvY29uc29sZSB3aWxsIGZhaWwKKyAqIGlmIHNvbWVvbmUgZWxzZSB1c2VkIFggKHdoaWNoIGRvZXMgYSBjaG93biBvbiAvZGV2L2NvbnNvbGUpLgorICovCitpbnQgRkFTVF9GVU5DIGdldF9jb25zb2xlX2ZkX29yX2RpZSh2b2lkKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb25zb2xlX25hbWVzW10gPSB7CisJCURFVl9DT05TT0xFLCBDVVJSRU5UX1ZDLCBDVVJSRU5UX1RUWQorCX07CisKKwlpbnQgZmQ7CisKKwlmb3IgKGZkID0gMjsgZmQgPj0gMDsgZmQtLSkgeworCQlpbnQgZmQ0bmFtZTsKKwkJaW50IGNob2ljZV9mZDsKKwkJY2hhciBhcmc7CisKKwkJZmQ0bmFtZSA9IG9wZW5fYV9jb25zb2xlKGNvbnNvbGVfbmFtZXNbZmRdKTsKKyBjaGtfc3RkOgorCQljaG9pY2VfZmQgPSAoZmQ0bmFtZSA+PSAwID8gZmQ0bmFtZSA6IGZkKTsKKworCQlhcmcgPSAwOworCQlpZiAoaW9jdGwoY2hvaWNlX2ZkLCBLREdLQlRZUEUsICZhcmcpID09IDApCisJCQlyZXR1cm4gY2hvaWNlX2ZkOworCQlpZiAoZmQ0bmFtZSA+PSAwKSB7CisJCQljbG9zZShmZDRuYW1lKTsKKwkJCWZkNG5hbWUgPSAtMTsKKwkJCWdvdG8gY2hrX3N0ZDsKKwkJfQorCX0KKworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBvcGVuIGNvbnNvbGUiKTsKKwkvKnJldHVybiBmZDsgLSB0b3RhbCBmYWlsdXJlICovCit9CisKKy8qIEZyb20gPGxpbnV4L3Z0Lmg+ICovCitlbnVtIHsKKwlWVF9BQ1RJVkFURSA9IDB4NTYwNiwgICAvKiBtYWtlIHZ0IGFjdGl2ZSAqLworCVZUX1dBSVRBQ1RJVkUgPSAweDU2MDcgIC8qIHdhaXQgZm9yIHZ0IGFjdGl2ZSAqLworfTsKKwordm9pZCBGQVNUX0ZVTkMgY29uc29sZV9tYWtlX2FjdGl2ZShpbnQgZmQsIGNvbnN0IGludCB2dF9udW0pCit7CisJeGlvY3RsKGZkLCBWVF9BQ1RJVkFURSwgKHZvaWQgKikocHRyZGlmZl90KXZ0X251bSk7CisJeGlvY3RsKGZkLCBWVF9XQUlUQUNUSVZFLCAodm9pZCAqKShwdHJkaWZmX3QpdnRfbnVtKTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2dldF9jcHVfY291bnQuYyBiL2xpYmJiL2dldF9jcHVfY291bnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjQ2OGFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvZ2V0X2NwdV9jb3VudC5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIEZhY3RvcmVkIG91dCBvZiBtcHN0YXQvaW9zdGF0LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBNYXJlayBQb2xhY2VrIDxtbXBvbGFjZWtAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBEb2VzIHN0ciBzdGFydCB3aXRoICJjcHUiPyAqLworaW50IEZBU1RfRlVOQyBzdGFydHNfd2l0aF9jcHUoY29uc3QgY2hhciAqc3RyKQoreworCXJldHVybiAoKHN0clswXSAtICdjJykgfCAoc3RyWzFdIC0gJ3AnKSB8IChzdHJbMl0gLSAndScpKSA9PSAwOworfQorCisvKgorICogR2V0IG51bWJlciBvZiBwcm9jZXNzb3JzLiBVc2VzIC9wcm9jL3N0YXQuCisgKiBSZXR1cm4gdmFsdWUgMCBtZWFucyBvbmUgQ1BVIGFuZCBub24gU01QIGtlcm5lbC4KKyAqIE90aGVyd2lzZSBOIG1lYW5zIE4gcHJvY2Vzc29yKHMpIGFuZCBTTVAga2VybmVsLgorICovCit1bnNpZ25lZCBGQVNUX0ZVTkMgZ2V0X2NwdV9jb3VudCh2b2lkKQoreworCUZJTEUgKmZwOworCWNoYXIgbGluZVsyNTZdOworCWludCBwcm9jX25yID0gLTE7CisKKwlmcCA9IHhmb3Blbl9mb3JfcmVhZCgiL3Byb2Mvc3RhdCIpOworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgeworCQlpZiAoIXN0YXJ0c193aXRoX2NwdShsaW5lKSkgeworCQkJaWYgKHByb2NfbnIgPj0gMCkKKwkJCQlicmVhazsgLyogd2UgYXJlIHBhc3QgImNwdU4uLi4iIGxpbmVzICovCisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobGluZVszXSAhPSAnICcpIHsgLyogImNwdU4iICovCisJCQlpbnQgbnVtX3Byb2M7CisJCQlpZiAoc3NjYW5mKGxpbmUgKyAzLCAiJXUiLCAmbnVtX3Byb2MpID09IDEKKwkJCSAmJiBudW1fcHJvYyA+IHByb2NfbnIKKwkJCSkgeworCQkJCXByb2NfbnIgPSBudW1fcHJvYzsKKwkJCX0KKwkJfQorCX0KKworCWZjbG9zZShmcCk7CisJcmV0dXJuIHByb2NfbnIgKyAxOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvZ2V0X2xhc3RfcGF0aF9jb21wb25lbnQuYyBiL2xpYmJiL2dldF9sYXN0X3BhdGhfY29tcG9uZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRmZGYyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2dldF9sYXN0X3BhdGhfY29tcG9uZW50LmMKQEAgLTAsMCArMSw1MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYmJfZ2V0X2xhc3RfcGF0aF9jb21wb25lbnQgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworY29uc3QgY2hhciogRkFTVF9GVU5DIGJiX2Jhc2VuYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY29uc3QgY2hhciAqY3AgPSBzdHJyY2hyKG5hbWUsICcvJyk7CisJaWYgKGNwKQorCQlyZXR1cm4gY3AgKyAxOworCXJldHVybiBuYW1lOworfQorCisvKgorICogIi8iICAgICAgICAtPiAiLyIKKyAqICJhYmMiICAgICAgLT4gImFiYyIKKyAqICJhYmMvZGVmIiAgLT4gImRlZiIKKyAqICJhYmMvZGVmLyIgLT4gIiIKKyAqLworY2hhciogRkFTVF9GVU5DIGJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50X25vc3RyaXAoY29uc3QgY2hhciAqcGF0aCkKK3sKKwljaGFyICpzbGFzaCA9IHN0cnJjaHIocGF0aCwgJy8nKTsKKworCWlmICghc2xhc2ggfHwgKHNsYXNoID09IHBhdGggJiYgIXNsYXNoWzFdKSkKKwkJcmV0dXJuIChjaGFyKilwYXRoOworCisJcmV0dXJuIHNsYXNoICsgMTsKK30KKworLyoKKyAqICIvIiAgICAgICAgLT4gIi8iCisgKiAiYWJjIiAgICAgIC0+ICJhYmMiCisgKiAiYWJjL2RlZiIgIC0+ICJkZWYiCisgKiAiYWJjL2RlZi8iIC0+ICJkZWYiICEhCisgKi8KK2NoYXIqIEZBU1RfRlVOQyBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9zdHJpcChjaGFyICpwYXRoKQoreworCWNoYXIgKnNsYXNoID0gbGFzdF9jaGFyX2lzKHBhdGgsICcvJyk7CisKKwlpZiAoc2xhc2gpCisJCXdoaWxlICgqc2xhc2ggPT0gJy8nICYmIHNsYXNoICE9IHBhdGgpCisJCQkqc2xhc2gtLSA9ICdcMCc7CisKKwlyZXR1cm4gYmJfZ2V0X2xhc3RfcGF0aF9jb21wb25lbnRfbm9zdHJpcChwYXRoKTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2dldF9saW5lX2Zyb21fZmlsZS5jIGIvbGliYmIvZ2V0X2xpbmVfZnJvbV9maWxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk4ZGQzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2dldF9saW5lX2Zyb21fZmlsZS5jCkBAIC0wLDAgKzEsMTgwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICogQ29weXJpZ2h0IChDKSAyMDA0IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMSBNYXR0IEtyYWkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitjaGFyKiBGQVNUX0ZVTkMgYmJfZ2V0X2NodW5rX2Zyb21fZmlsZShGSUxFICpmaWxlLCBpbnQgKmVuZCkKK3sKKwlpbnQgY2g7CisJdW5zaWduZWQgaWR4ID0gMDsKKwljaGFyICpsaW5lYnVmID0gTlVMTDsKKworCXdoaWxlICgoY2ggPSBnZXRjKGZpbGUpKSAhPSBFT0YpIHsKKwkJLyogZ3JvdyB0aGUgbGluZSBidWZmZXIgYXMgbmVjZXNzYXJ5ICovCisJCWlmICghKGlkeCAmIDB4ZmYpKQorCQkJbGluZWJ1ZiA9IHhyZWFsbG9jKGxpbmVidWYsIGlkeCArIDB4MTAwKTsKKwkJbGluZWJ1ZltpZHgrK10gPSAoY2hhcikgY2g7CisJCWlmIChjaCA9PSAnXDAnKQorCQkJYnJlYWs7CisJCWlmIChlbmQgJiYgY2ggPT0gJ1xuJykKKwkJCWJyZWFrOworCX0KKwlpZiAoZW5kKQorCQkqZW5kID0gaWR4OworCWlmIChsaW5lYnVmKSB7CisJCS8vIGh1aCwgZG9lcyBmZ2V0cyBkaXNjYXJkIHByaW9yIGRhdGEgb24gZXJyb3IgbGlrZSB0aGlzPworCQkvLyBJIGRvbid0IHRoaW5rIHNvLi4uLgorCQkvL2lmIChmZXJyb3IoZmlsZSkpIHsKKwkJLy8JZnJlZShsaW5lYnVmKTsKKwkJLy8JcmV0dXJuIE5VTEw7CisJCS8vfQorCQlsaW5lYnVmID0geHJlYWxsb2MobGluZWJ1ZiwgaWR4ICsgMSk7CisJCWxpbmVidWZbaWR4XSA9ICdcMCc7CisJfQorCXJldHVybiBsaW5lYnVmOworfQorCisvKiBHZXQgbGluZSwgaW5jbHVkaW5nIHRyYWlsaW5nIFxuIGlmIGFueSAqLworY2hhciogRkFTVF9GVU5DIHhtYWxsb2NfZmdldHMoRklMRSAqZmlsZSkKK3sKKwlpbnQgaTsKKworCXJldHVybiBiYl9nZXRfY2h1bmtfZnJvbV9maWxlKGZpbGUsICZpKTsKK30KKy8qIEdldCBsaW5lLiAgUmVtb3ZlIHRyYWlsaW5nIFxuICovCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19mZ2V0bGluZShGSUxFICpmaWxlKQoreworCWludCBpOworCWNoYXIgKmMgPSBiYl9nZXRfY2h1bmtfZnJvbV9maWxlKGZpbGUsICZpKTsKKworCWlmIChpICYmIGNbLS1pXSA9PSAnXG4nKQorCQljW2ldID0gJ1wwJzsKKworCXJldHVybiBjOworfQorCisjaWYgMAorLyogR05VaXNtIGdldGxpbmUoKSBzaG91bGQgYmUgZmFzdGVyIChub3QgdGVzdGVkKSB0aGFuIGEgbG9vcCB3aXRoIGZnZXRjICovCisKKy8qIEdldCBsaW5lLCBpbmNsdWRpbmcgdHJhaWxpbmcgXG4gaWYgYW55ICovCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19mZ2V0cyhGSUxFICpmaWxlKQoreworCWNoYXIgKnJlc19idWYgPSBOVUxMOworCXNpemVfdCByZXNfc3o7CisKKwlpZiAoZ2V0bGluZSgmcmVzX2J1ZiwgJnJlc19zeiwgZmlsZSkgPT0gLTEpIHsKKwkJZnJlZShyZXNfYnVmKTsgLyogdWNsaWJjIGFsbG9jYXRlcyBhIGJ1ZmZlciBldmVuIG9uIEVPRi4gV1RGPyAqLworCQlyZXNfYnVmID0gTlVMTDsKKwl9CisvL1RPRE86IHRyaW1taW5nIHRvIHJlc19zej8KKwlyZXR1cm4gcmVzX2J1ZjsKK30KKy8qIEdldCBsaW5lLiAgUmVtb3ZlIHRyYWlsaW5nIFxuICovCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19mZ2V0bGluZShGSUxFICpmaWxlKQoreworCWNoYXIgKnJlc19idWYgPSBOVUxMOworCXNpemVfdCByZXNfc3o7CisKKwlyZXNfc3ogPSBnZXRsaW5lKCZyZXNfYnVmLCAmcmVzX3N6LCBmaWxlKTsKKworCWlmICgoc3NpemVfdClyZXNfc3ogIT0gLTEpIHsKKwkJaWYgKHJlc19idWZbcmVzX3N6IC0gMV0gPT0gJ1xuJykKKwkJCXJlc19idWZbLS1yZXNfc3pdID0gJ1wwJzsKKy8vVE9ETzogdHJpbW1pbmcgdG8gcmVzX3N6PworCX0gZWxzZSB7CisJCWZyZWUocmVzX2J1Zik7IC8qIHVjbGliYyBhbGxvY2F0ZXMgYSBidWZmZXIgZXZlbiBvbiBFT0YuIFdURj8gKi8KKwkJcmVzX2J1ZiA9IE5VTEw7CisJfQorCXJldHVybiByZXNfYnVmOworfQorCisjZW5kaWYKKworI2lmIDAKKy8qIEZhc3RlciByb3V0aW5lcyAofnR3aWNlIGFzIGZhc3QpLiArMTcwIGJ5dGVzLiBVbnVzZWQgYXMgb2YgMjAwOC0wNy4KKyAqCisgKiBOQjogdGhleSBzdG9wIGF0IE5VTCBieXRlIHRvby4KKyAqIFBlcmZvcm1hbmNlIGlzIGltcG9ydGFudCBoZXJlLiBUaGluayAiZ3JlcCA1MGdpZ2FieXRlX2ZpbGUiLi4uCisgKiBJcm9uaWNhbGx5LCBncmVwIGNhbid0IHVzZSBpdCBiZWNhdXNlIG9mIE5VTCBpc3N1ZS4KKyAqIFdlIHNvcmVseSBuZWVkIEMgbGliIHRvIHByb3ZpZGUgZmdldHMgd2hpY2ggcmVwb3J0cyBzaXplIQorICoKKyAqIFVwZGF0ZToKKyAqIEFjdHVhbGx5LCB1Y2xpYmMgYW5kIGdsaWJjIGhhdmUgaXQuIG1hbiBnZXRsaW5lLiBJdCdzIEdOVWlzbSwKKyAqICAgYnV0IHZlcnkgdXNlZnVsIG9uZSAoaWYgaXQncyBhcyBmYXN0IGFzIHRoaXMgY29kZSkuCisgKiBUT0RPOgorICogLSBjdXJyZW50bHksIHNlZCBhbmQgc29ydCB1c2UgYmJfZ2V0X2NodW5rX2Zyb21fZmlsZSBhbmQgaGVhdmlseQorICogICBkZXBlbmQgb24gaXRzICJzdG9wIG9uIFxuIG9yIFwwIiBiZWhhdmlvciwgYW5kIFNUSUxMIHRoZXkgZmFpbAorICogICB0byBoYW5kbGUgYWxsIGNhc2VzIHdpdGggZW1iZWRkZWQgTlVMcyBjb3JyZWN0bHkuIFNvOgorICogLSBhdWRpdCBzZWQgYW5kIHNvcnQ7IGNvbnZlcnQgdGhlbSB0byBnZXRsaW5lIEZJUlNULgorICogLSBUSEVOIGRpdGNoIGJiX2dldF9jaHVua19mcm9tX2ZpbGUsIHJlcGxhY2UgaXQgd2l0aCBnZXRsaW5lLgorICogLSBwcm92aWRlIGdldGxpbmUgaW1wbGVtZW50YXRpb24gZm9yIG5vbi1HTlUgc3lzdGVtcy4KKyAqLworCitzdGF0aWMgY2hhciogeG1hbGxvY19mZ2V0c19pbnRlcm5hbChGSUxFICpmaWxlLCBpbnQgKnNpemVwKQoreworCWludCBsZW47CisJaW50IGlkeCA9IDA7CisJY2hhciAqbGluZWJ1ZiA9IE5VTEw7CisKKwl3aGlsZSAoMSkgeworCQljaGFyICpyOworCisJCWxpbmVidWYgPSB4cmVhbGxvYyhsaW5lYnVmLCBpZHggKyAweDEwMCk7CisJCXIgPSBmZ2V0cygmbGluZWJ1ZltpZHhdLCAweDEwMCwgZmlsZSk7CisJCWlmICghcikgeworCQkJLyogbmVlZCB0byB0ZXJtaW5hdGUgaW4gY2FzZSB0aGlzIGlzIGVycm9yCisJCQkgKiAoRU9GIHB1dHMgTlVMIGl0c2VsZikgKi8KKwkJCWxpbmVidWZbaWR4XSA9ICdcMCc7CisJCQlicmVhazsKKwkJfQorCQkvKiBzdHVwaWQuIGZnZXRzIGtub3dzIHRoZSBsZW4sIGl0IHNob3VsZCByZXBvcnQgaXQgc29tZWhvdyAqLworCQlsZW4gPSBzdHJsZW4oJmxpbmVidWZbaWR4XSk7CisJCWlkeCArPSBsZW47CisJCWlmIChsZW4gIT0gMHhmZiB8fCBsaW5lYnVmW2lkeCAtIDFdID09ICdcbicpCisJCQlicmVhazsKKwl9CisJKnNpemVwID0gaWR4OworCWlmIChpZHgpIHsKKwkJLyogeHJlYWxsb2MobGluZWJ1ZiwgaWR4ICsgMSkgaXMgdXAgdG8gY2FsbGVyICovCisJCXJldHVybiBsaW5lYnVmOworCX0KKwlmcmVlKGxpbmVidWYpOworCXJldHVybiBOVUxMOworfQorCisvKiBHZXQgbGluZSwgcmVtb3ZlIHRyYWlsaW5nIFxuICovCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19mZ2V0bGluZV9mYXN0KEZJTEUgKmZpbGUpCit7CisJaW50IHN6OworCWNoYXIgKnIgPSB4bWFsbG9jX2ZnZXRzX2ludGVybmFsKGZpbGUsICZzeik7CisJaWYgKHIgJiYgcltzeiAtIDFdID09ICdcbicpCisJCXJbLS1zel0gPSAnXDAnOworCXJldHVybiByOyAvKiBub3QgeHJlYWxsb2Mociwgc3ogKyAxKSEgKi8KK30KKworY2hhciogRkFTVF9GVU5DIHhtYWxsb2NfZmdldHMoRklMRSAqZmlsZSkKK3sKKwlpbnQgc3o7CisJcmV0dXJuIHhtYWxsb2NfZmdldHNfaW50ZXJuYWwoZmlsZSwgJnN6KTsKK30KKworLyogR2V0IGxpbmUsIHJlbW92ZSB0cmFpbGluZyBcbiAqLworY2hhciogRkFTVF9GVU5DIHhtYWxsb2NfZmdldGxpbmUoRklMRSAqZmlsZSkKK3sKKwlpbnQgc3o7CisJY2hhciAqciA9IHhtYWxsb2NfZmdldHNfaW50ZXJuYWwoZmlsZSwgJnN6KTsKKwlpZiAoIXIpCisJCXJldHVybiByOworCWlmIChyW3N6IC0gMV0gPT0gJ1xuJykKKwkJclstLXN6XSA9ICdcMCc7CisJcmV0dXJuIHhyZWFsbG9jKHIsIHN6ICsgMSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmJiL2dldF9zaGVsbF9uYW1lLmMgYi9saWJiYi9nZXRfc2hlbGxfbmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZWJlOWMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9nZXRfc2hlbGxfbmFtZS5jCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxMSwgRGVueXMgVmxhc2Vua28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8va2J1aWxkOmxpYi15ICs9IGdldF9zaGVsbF9uYW1lLm8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBnZXRfc2hlbGxfbmFtZSh2b2lkKQoreworCXN0cnVjdCBwYXNzd2QgKnB3OworCWNoYXIgKnNoZWxsOworCisJc2hlbGwgPSBnZXRlbnYoIlNIRUxMIik7CisJaWYgKHNoZWxsICYmIHNoZWxsWzBdKQorCQlyZXR1cm4gc2hlbGw7CisKKwlwdyA9IGdldHB3dWlkKGdldHVpZCgpKTsKKwlpZiAocHcgJiYgcHctPnB3X3NoZWxsICYmIHB3LT5wd19zaGVsbFswXSkKKwkJcmV0dXJuIHB3LT5wd19zaGVsbDsKKworCXJldHVybiBERUZBVUxUX1NIRUxMOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvZ2V0X3ZvbHNpemUuYyBiL2xpYmJiL2dldF92b2xzaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxY2VkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2dldF92b2xzaXplLmMKQEAgLTAsMCArMSw0OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGVueXMgVmxhc2Vua28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKwordW9mZl90IEZBU1RfRlVOQyBnZXRfdm9sdW1lX3NpemVfaW5fYnl0ZXMoaW50IGZkLAorCQljb25zdCBjaGFyICpvdmVycmlkZSwKKwkJdW5zaWduZWQgb3ZlcnJpZGVfdW5pdHMsCisJCWludCBleHRlbmQpCit7CisJdW9mZl90IHJlc3VsdDsKKworCWlmIChvdmVycmlkZSkgeworCQlyZXN1bHQgPSBYQVRPT0ZGKG92ZXJyaWRlKTsKKwkJaWYgKHJlc3VsdCA+PSAodW9mZl90KShNQVhJTlQob2ZmX3QpKSAvIG92ZXJyaWRlX3VuaXRzKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImltYWdlIHNpemUgaXMgdG9vIGJpZyIpOworCQlyZXN1bHQgKj0gb3ZlcnJpZGVfdW5pdHM7CisJCS8qIHNlZWsgcGFzdCBlbmQgZmFpbHMgb24gYmxvY2sgZGV2aWNlcyBidXQgd29ya3Mgb24gZmlsZXMgKi8KKwkJaWYgKGxzZWVrKGZkLCByZXN1bHQgLSAxLCBTRUVLX1NFVCkgIT0gKG9mZl90KS0xKSB7CisJCQlpZiAoZXh0ZW5kKQorCQkJCXh3cml0ZShmZCwgIiIsIDEpOyAvKiBmaWxlIGdyb3dzIGlmIG5lZWRlZCAqLworCQl9CisJCS8vZWxzZSB7CisJCS8vCWJiX2Vycm9yX21zZygid2FybmluZywgYmxvY2sgZGV2aWNlIGlzIHNtYWxsZXIiKTsKKwkJLy99CisJfSBlbHNlIHsKKwkJLyogbW9yZSBwb3J0YWJsZSB0aGFuIEJMS0dFVFNJWkVbNjRdICovCisJCXJlc3VsdCA9IHhsc2VlayhmZCwgMCwgU0VFS19FTkQpOworCX0KKworCXhsc2VlayhmZCwgMCwgU0VFS19TRVQpOworCisJLyogUHJldmVudCB0aGluZ3MgbGlrZSB0aGlzOgorCSAqICQgZGQgaWY9L2Rldi96ZXJvIG9mPWZvbyBjb3VudD0xIGJzPTEwMjQKKwkgKiAkIG1rc3dhcCBmb28KKwkgKiBTZXR0aW5nIHVwIHN3YXBzcGFjZSB2ZXJzaW9uIDEsIHNpemUgPSAxODQ0Njc0NDA3MzcwOTU0ODU0NCBieXRlcworCSAqCisJICogUGlja2VkIDE2ayBhcmJpdHJhcmlseTogKi8KKwlpZiAocmVzdWx0IDwgMTYqMTAyNCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImltYWdlIGlzIHRvbyBzbWFsbCIpOworCisJcmV0dXJuIHJlc3VsdDsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2dldG9wdDMyLmMgYi9saWJiYi9nZXRvcHQzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZTgzZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9nZXRvcHQzMi5jCkBAIC0wLDAgKzEsNjE1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB1bml2ZXJzYWwgZ2V0b3B0MzIgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMtMjAwNSAgVmxhZGltaXIgT2xleW5payAgPGR6b0BzaW10cmVhcy5ydT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpZiBFTkFCTEVfTE9OR19PUFRTIHx8IEVOQUJMRV9GRUFUVVJFX0dFVE9QVF9MT05HCisjIGluY2x1ZGUgPGdldG9wdC5oPgorI2VuZGlmCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogICAgICBEb2N1bWVudGF0aW9uCisKK3VpbnQzMl90CitnZXRvcHQzMihjaGFyICoqYXJndiwgY29uc3QgY2hhciAqYXBwbGV0X29wdHMsIC4uLikKKworICAgICAgICBUaGUgY29tbWFuZCBsaW5lIG9wdGlvbnMgbXVzdCBiZSBkZWNsYXJlZCBpbiBjb25zdCBjaGFyCisgICAgICAgICphcHBsZXRfb3B0cyBhcyBhIHN0cmluZyBvZiBjaGFycywgZm9yIGV4YW1wbGU6CisKKyAgICAgICAgZmxhZ3MgPSBnZXRvcHQzMihhcmd2LCAicm51ZyIpOworCisgICAgICAgIElmIG9uZSBvZiB0aGUgZ2l2ZW4gb3B0aW9ucyBpcyBmb3VuZCwgYSBmbGFnIHZhbHVlIGlzIGFkZGVkIHRvCisgICAgICAgIHRoZSByZXR1cm4gdmFsdWUgKGFuIHVuc2lnbmVkIGxvbmcpLgorCisgICAgICAgIFRoZSBmbGFnIHZhbHVlIGlzIGRldGVybWluZWQgYnkgdGhlIHBvc2l0aW9uIG9mIHRoZSBjaGFyIGluCisgICAgICAgIGFwcGxldF9vcHRzIHN0cmluZy4gIEZvciBleGFtcGxlLCBpbiB0aGUgYWJvdmUgY2FzZToKKworICAgICAgICBmbGFncyA9IGdldG9wdDMyKGFyZ3YsICJybnVnIik7CisKKyAgICAgICAgInIiIHdpbGwgYWRkIDEgICAgKGJpdCAwKQorICAgICAgICAibiIgd2lsbCBhZGQgMiAgICAoYml0IDEpCisgICAgICAgICJ1IiB3aWxsIGFkZCA0ICAgIChiaXQgMikKKyAgICAgICAgImciIHdpbGwgYWRkIDggICAgKGJpdCAzKQorCisgICAgICAgIGFuZCBzbyBvbi4gIFlvdSBjYW4gYWxzbyBsb29rIGF0IHRoZSByZXR1cm4gdmFsdWUgYXMgYSBiaXQKKyAgICAgICAgZmllbGQgYW5kIGVhY2ggb3B0aW9uIHNldHMgb25lIGJpdC4KKworICAgICAgICBPbiBleGl0LCBnbG9iYWwgdmFyaWFibGUgb3B0aW5kIGlzIHNldCBzbyB0aGF0IGlmIHlvdQorICAgICAgICB3aWxsIGRvIGFyZ2MgLT0gb3B0aW5kOyBhcmd2ICs9IG9wdGluZDsgdGhlbgorICAgICAgICBhcmdjIHdpbGwgYmUgZXF1YWwgdG8gbnVtYmVyIG9mIHJlbWFpbmluZyBub24tb3B0aW9uCisgICAgICAgIGFyZ3VtZW50cywgZmlyc3Qgb25lIHdvdWxkIGJlIGluIGFyZ3ZbMF0sIG5leHQgaW4gYXJndlsxXSBhbmQgc28gb24KKyAgICAgICAgKG9wdGlvbnMgYW5kIHRoZWlyIHBhcmFtZXRlcnMgd2lsbCBiZSBtb3ZlZCBpbnRvIGFyZ3ZbXQorICAgICAgICBwb3NpdGlvbnMgcHJpb3IgdG8gYXJndltvcHRpbmRdKS4KKworICI6IiAgICBJZiBvbmUgb2YgdGhlIG9wdGlvbnMgcmVxdWlyZXMgYW4gYXJndW1lbnQsIHRoZW4gYWRkIGEgIjoiCisgICAgICAgIGFmdGVyIHRoZSBjaGFyIGluIGFwcGxldF9vcHRzIGFuZCBwcm92aWRlIGEgcG9pbnRlciB0byBzdG9yZQorICAgICAgICB0aGUgYXJndW1lbnQuICBGb3IgZXhhbXBsZToKKworICAgICAgICBjaGFyICpwb2ludGVyX3RvX2FyZ19mb3JfYTsKKyAgICAgICAgY2hhciAqcG9pbnRlcl90b19hcmdfZm9yX2I7CisgICAgICAgIGNoYXIgKnBvaW50ZXJfdG9fYXJnX2Zvcl9jOworICAgICAgICBjaGFyICpwb2ludGVyX3RvX2FyZ19mb3JfZDsKKworICAgICAgICBmbGFncyA9IGdldG9wdDMyKGFyZ3YsICJhOmI6YzpkOiIsCisgICAgICAgICAgICAgICAgICAgICAgICAmcG9pbnRlcl90b19hcmdfZm9yX2EsICZwb2ludGVyX3RvX2FyZ19mb3JfYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwb2ludGVyX3RvX2FyZ19mb3JfYywgJnBvaW50ZXJfdG9fYXJnX2Zvcl9kKTsKKworICAgICAgICBUaGUgdHlwZSBvZiB0aGUgcG9pbnRlciAoY2hhciogb3IgbGxpc3RfdCopIG1heSBiZSBjb250cm9sbGVkCisgICAgICAgIGJ5IHRoZSAiOjoiIHNwZWNpYWwgc2VwYXJhdG9yIHRoYXQgaXMgc2V0IGluIHRoZSBleHRlcm5hbCBzdHJpbmcKKyAgICAgICAgb3B0X2NvbXBsZW1lbnRhcnkgKHNlZSBiZWxvdyBmb3IgbW9yZSBpbmZvKS4KKworICI6OiIgICBJZiBvcHRpb24gY2FuIGhhdmUgYW4gKm9wdGlvbmFsKiBhcmd1bWVudCwgdGhlbiBhZGQgYSAiOjoiCisgICAgICAgIGFmdGVyIGl0cyBjaGFyIGluIGFwcGxldF9vcHRzIGFuZCBwcm92aWRlIGEgcG9pbnRlciB0byBzdG9yZQorICAgICAgICB0aGUgYXJndW1lbnQuICBOb3RlIHRoYXQgb3B0aW9uYWwgYXJndW1lbnRzIF9tdXN0XworICAgICAgICBpbW1lZGlhdGVseSBmb2xsb3cgdGhlIG9wdGlvbjogLW9wYXJhbSwgbm90IC1vIHBhcmFtLgorCisgIisiICAgIElmIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIGFwcGxldF9vcHRzIHN0cmluZyBpcyBhIHBsdXMsCisgICAgICAgIHRoZW4gb3B0aW9uIHByb2Nlc3Npbmcgd2lsbCBzdG9wIGFzIHNvb24gYXMgYSBub24tb3B0aW9uIGlzCisgICAgICAgIGVuY291bnRlcmVkIGluIHRoZSBhcmd2IGFycmF5LiAgVXNlZnVsIGZvciBhcHBsZXRzIGxpa2UgZW52CisgICAgICAgIHdoaWNoIHNob3VsZCBub3QgcHJvY2VzcyBhcmd1bWVudHMgdG8gc3VicHJvZ3JhbXM6CisgICAgICAgIGVudiAtaSBscyAtZCAvCisgICAgICAgIEhlcmUgd2Ugd2FudCBlbnYgdG8gcHJvY2VzcyBqdXN0IHRoZSAnLWknLCBub3QgdGhlICctZCcuCisKKyAiISIgICAgUmVwb3J0IGJhZCBvcHRpb24sIG1pc3NpbmcgcmVxdWlyZWQgb3B0aW9ucywKKyAgICAgICAgaW5jb25zaXN0ZW50IG9wdGlvbnMgd2l0aCBhbGwtb25lcyByZXR1cm4gdmFsdWUgKGluc3RlYWQgb2YgYWJvcnQpLgorCitjb25zdCBjaGFyICphcHBsZXRfbG9uZ19vcHRpb25zCisKKyAgICAgICAgVGhpcyBzdHJ1Y3QgYWxsb3dzIHlvdSB0byBkZWZpbmUgbG9uZyBvcHRpb25zOgorCisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGFwcGxldF9sb25nb3B0c1tdIEFMSUdOMSA9CisgICAgICAgICAgICAgICAgLy8ibmFtZVwwIiBoYXNfYXJnIHZhbAorICAgICAgICAgICAgICAgICJ2ZXJib3NlXDAiIE5vX2FyZ3VtZW50ICJ2IgorICAgICAgICAgICAgICAgIDsKKyAgICAgICAgYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGFwcGxldF9sb25nb3B0czsKKworICAgICAgICBUaGUgbGFzdCBtZW1iZXIgb2Ygc3RydWN0IG9wdGlvbiAodmFsKSB0eXBpY2FsbHkgaXMgc2V0IHRvCisgICAgICAgIG1hdGNoaW5nIHNob3J0IG9wdGlvbiBmcm9tIGFwcGxldF9vcHRzLiBJZiB0aGVyZSBpcyBubyBtYXRjaGluZworICAgICAgICBjaGFyIGluIGFwcGxldF9vcHRzLCB0aGVuOgorICAgICAgICAtIHJldHVybiBiaXQgaGF2ZSBuZXh0IHBvc2l0aW9uIGFmdGVyIHNob3J0IG9wdGlvbnMKKyAgICAgICAgLSBpZiBoYXNfYXJnIGlzIG5vdCAiTm9fYXJndW1lbnQiLCB1c2UgcHRyIGZvciBhcmcgYWxzbworICAgICAgICAtIG9wdF9jb21wbGVtZW50YXJ5IGFmZmVjdHMgaXQgdG9vCisKKyAgICAgICAgTm90ZTogYSBnb29kIGFwcGxldCB3aWxsIG1ha2UgbG9uZyBvcHRpb25zIGNvbmZpZ3VyYWJsZSB2aWEgdGhlCisgICAgICAgIGNvbmZpZyBwcm9jZXNzIGFuZCBub3QgYSByZXF1aXJlZCBmZWF0dXJlLiAgVGhlIGN1cnJlbnQgc3RhbmRhcmQKKyAgICAgICAgaXMgdG8gbmFtZSB0aGUgY29uZmlnIG9wdGlvbiBDT05GSUdfRkVBVFVSRV88YXBwbGV0Pl9MT05HX09QVElPTlMuCisKK2NvbnN0IGNoYXIgKm9wdF9jb21wbGVtZW50YXJ5CisKKyAiOiIgICAgVGhlIGNvbG9uICgiOiIpIGlzIHVzZWQgdG8gc2VwYXJhdGUgZ3JvdXBzIG9mIHR3byBvciBtb3JlIGNoYXJzCisgICAgICAgIGFuZC9vciBncm91cHMgb2YgY2hhcnMgYW5kIHNwZWNpYWwgY2hhcmFjdGVycyAoc3RhdGluZyBzb21lCisgICAgICAgIGNvbmRpdGlvbnMgdG8gYmUgY2hlY2tlZCkuCisKKyAiYWJjIiAgSWYgZ3JvdXBzIG9mIHR3byBvciBtb3JlIGNoYXJzIGFyZSBzcGVjaWZpZWQsIHRoZSBmaXJzdCBjaGFyCisgICAgICAgIGlzIHRoZSBtYWluIG9wdGlvbiBhbmQgdGhlIG90aGVyIGNoYXJzIGFyZSBzZWNvbmRhcnkgb3B0aW9ucy4KKyAgICAgICAgVGhlaXIgZmxhZ3Mgd2lsbCBiZSB0dXJuZWQgb24gaWYgdGhlIG1haW4gb3B0aW9uIGlzIGZvdW5kIGV2ZW4KKyAgICAgICAgaWYgdGhleSBhcmUgbm90IHNwZWNpZmVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBGb3IgZXhhbXBsZToKKworICAgICAgICBvcHRfY29tcGxlbWVudGFyeSA9ICJhYmMiOworICAgICAgICBmbGFncyA9IGdldG9wdDMyKGFyZ3YsICJhYmNkIikKKworICAgICAgICBJZiBnZXRvcHQoKSBmaW5kcyAiLWEiIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZW4KKyAgICAgICAgZ2V0b3B0MzIncyByZXR1cm4gdmFsdWUgd2lsbCBiZSBhcyBpZiAiLWEgLWIgLWMiIHdlcmUKKyAgICAgICAgZm91bmQuCisKKyAid3ciICAgQWRqYWNlbnQgZG91YmxlIG9wdGlvbnMgaGF2ZSBhIGNvdW50ZXIgYXNzb2NpYXRlZCB3aGljaCBpbmRpY2F0ZXMKKyAgICAgICAgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiB0aGUgb3B0aW9uLgorICAgICAgICBGb3IgZXhhbXBsZSB0aGUgcHMgYXBwbGV0IG5lZWRzOgorICAgICAgICBpZiB3IGlzIGdpdmVuIG9uY2UsIEdOVSBwcyBzZXRzIHRoZSB3aWR0aCB0byAxMzIsCisgICAgICAgIGlmIHcgaXMgZ2l2ZW4gbW9yZSB0aGFuIG9uY2UsIGl0IGlzICJ1bmxpbWl0ZWQiCisKKyAgICAgICAgaW50IHdfY291bnRlciA9IDA7IC8vIG11c3QgYmUgaW5pdGlhbGl6ZWQhCisgICAgICAgIG9wdF9jb21wbGVtZW50YXJ5ID0gInd3IjsKKyAgICAgICAgZ2V0b3B0MzIoYXJndiwgInciLCAmd19jb3VudGVyKTsKKyAgICAgICAgaWYgKHdfY291bnRlcikKKyAgICAgICAgICAgICAgICB3aWR0aCA9ICh3X2NvdW50ZXIgPT0gMSkgPyAxMzIgOiBJTlRfTUFYOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgZ2V0X3Rlcm1pbmFsX3dpZHRoKC4uLiZ3aWR0aC4uLik7CisKKyAgICAgICAgd19jb3VudGVyIGlzIGEgcG9pbnRlciB0byBhbiBpbnRlZ2VyLiBJdCBoYXMgdG8gYmUgcGFzc2VkIHRvCisgICAgICAgIGdldG9wdDMyKCkgYWZ0ZXIgYWxsIG90aGVyIG9wdGlvbiBhcmd1bWVudCBzaW5rcy4KKworICAgICAgICBGb3IgZXhhbXBsZTogYWNjZXB0IG11bHRpcGxlIC12IHRvIGluZGljYXRlIHRoZSBsZXZlbCBvZiB2ZXJib3NpdHkKKyAgICAgICAgYW5kIGZvciBlYWNoIC1iIG9wdGFyZywgYWRkIG9wdGFyZyB0byBteV9iLiBGaW5hbGx5LCBpZiBiIGlzIGdpdmVuLAorICAgICAgICB0dXJuIG9mZiBjIGFuZCB2aWNlIHZlcnNhOgorCisgICAgICAgIGxsaXN0X3QgKm15X2IgPSBOVUxMOworICAgICAgICBpbnQgdmVyYm9zZV9sZXZlbCA9IDA7CisgICAgICAgIG9wdF9jb21wbGVtZW50YXJ5ID0gInZ2OmI6OmItYzpjLWIiOworICAgICAgICBmID0gZ2V0b3B0MzIoYXJndiwgInZiOmMiLCAmbXlfYiwgJnZlcmJvc2VfbGV2ZWwpOworICAgICAgICBpZiAoZiAmIDIpICAgICAgIC8vIC1jIGFmdGVyIC1iIHVuc2V0cyAtYiBmbGFnCisgICAgICAgICAgICAgICAgd2hpbGUgKG15X2IpIGRvc29tZXRoaW5nX3dpdGgobGxpc3RfcG9wKCZteV9iKSk7CisgICAgICAgIGlmIChteV9iKSAgICAgICAgLy8gYnV0IGxsaXN0IGlzIHN0b3JlZCBpZiAtYiBpcyBzcGVjaWZpZWQKKyAgICAgICAgICAgICAgICBmcmVlX2xsaXN0KG15X2IpOworICAgICAgICBpZiAodmVyYm9zZV9sZXZlbCkgcHJpbnRmKCJ2ZXJib3NlIGxldmVsIGlzICVkXG4iLCB2ZXJib3NlX2xldmVsKTsKKworU3BlY2lhbCBjaGFyYWN0ZXJzOgorCisgIi0iICAgIEEgZ3JvdXAgY29uc2lzdGluZyBvZiBqdXN0IGEgZGFzaCBmb3JjZXMgYWxsIGFyZ3VtZW50cworICAgICAgICB0byBiZSB0cmVhdGVkIGFzIG9wdGlvbnMsIGV2ZW4gaWYgdGhleSBoYXZlIG5vIGxlYWRpbmcgZGFzaGVzLgorICAgICAgICBOZXh0IGNoYXIgaW4gdGhpcyBjYXNlIGNhbid0IGJlIGEgZGlnaXQgKDAtOSksIHVzZSAnOicgb3IgZW5kIG9mIGxpbmUuCisgICAgICAgIEV4YW1wbGU6CisKKyAgICAgICAgb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTp3LXg6eC13IjsgLy8gIi13LXg6eC13IiB3b3VsZCBhbHNvIHdvcmssCisgICAgICAgIGdldG9wdDMyKGFyZ3YsICJ3eCIpOyAgICAgICAgICAgIC8vIGJ1dCBpcyBsZXNzIHJlYWRhYmxlCisKKyAgICAgICAgVGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2Ugb3B0aW9ucyB3aXRob3V0IGEgZGFzaCAoLi9wcm9ncmFtIHcgeCkKKyAgICAgICAgYXMgd2VsbCBhcyB3aXRoIGEgZGFzaCAoLi9wcm9ncmFtIC14KS4KKworICAgICAgICBOQjogZ2V0b3B0MzIoKSB3aWxsIGxlYWsgYSBzbWFsbCBhbW91bnQgb2YgbWVtb3J5IGlmIHlvdSB1c2UKKyAgICAgICAgdGhpcyBvcHRpb24hIERvIG5vdCB1c2UgaXQgaWYgdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSBvZiByZWN1cnNpdmUKKyAgICAgICAgZ2V0b3B0MzIoKSBjYWxscy4KKworICItLSIgICBBIGRvdWJsZSBkYXNoIGF0IHRoZSBiZWdpbm5pbmcgb2Ygb3B0X2NvbXBsZW1lbnRhcnkgbWVhbnMgdGhlCisgICAgICAgIGFyZ3ZbMV0gc3RyaW5nIHNob3VsZCBhbHdheXMgYmUgdHJlYXRlZCBhcyBvcHRpb25zLCBldmVuIGlmIGl0IGlzbid0CisgICAgICAgIHByZWZpeGVkIHdpdGggYSAiLSIuICBUaGlzIGlzIHVzZWZ1bCBmb3Igc3BlY2lhbCBzeW50YXggaW4gYXBwbGV0cworICAgICAgICBzdWNoIGFzICJhciIgYW5kICJ0YXIiOgorICAgICAgICB0YXIgeHZmIGZvby50YXIKKworICAgICAgICBOQjogZ2V0b3B0MzIoKSB3aWxsIGxlYWsgYSBzbWFsbCBhbW91bnQgb2YgbWVtb3J5IGlmIHlvdSB1c2UKKyAgICAgICAgdGhpcyBvcHRpb24hIERvIG5vdCB1c2UgaXQgaWYgdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSBvZiByZWN1cnNpdmUKKyAgICAgICAgZ2V0b3B0MzIoKSBjYWxscy4KKworICItTiIgICBBIGRhc2ggYXMgdGhlIGZpcnN0IGNoYXIgaW4gYSBvcHRfY29tcGxlbWVudGFyeSBncm91cCBmb2xsb3dlZAorICAgICAgICBieSBhIHNpbmdsZSBkaWdpdCAoMC05KSBtZWFucyB0aGF0IGF0IGxlYXN0IE4gbm9uLW9wdGlvbgorICAgICAgICBhcmd1bWVudHMgbXVzdCBiZSBwcmVzZW50IG9uIHRoZSBjb21tYW5kIGxpbmUKKworICI9TiIgICBBbiBlcXVhbCBzaWduIGFzIHRoZSBmaXJzdCBjaGFyIGluIGEgb3B0X2NvbXBsZW1lbnRhcnkgZ3JvdXAgZm9sbG93ZWQKKyAgICAgICAgYnkgYSBzaW5nbGUgZGlnaXQgKDAtOSkgbWVhbnMgdGhhdCBleGFjdGx5IE4gbm9uLW9wdGlvbgorICAgICAgICBhcmd1bWVudHMgbXVzdCBiZSBwcmVzZW50IG9uIHRoZSBjb21tYW5kIGxpbmUKKworICI/TiIgICBBICI/IiBhcyB0aGUgZmlyc3QgY2hhciBpbiBhIG9wdF9jb21wbGVtZW50YXJ5IGdyb3VwIGZvbGxvd2VkCisgICAgICAgIGJ5IGEgc2luZ2xlIGRpZ2l0ICgwLTkpIG1lYW5zIHRoYXQgYXQgbW9zdCBOIGFyZ3VtZW50cyBtdXN0IGJlIHByZXNlbnQKKyAgICAgICAgb24gdGhlIGNvbW1hbmQgbGluZS4KKworICJWLSIgICBBbiBvcHRpb24gd2l0aCBkYXNoIGJlZm9yZSBjb2xvbiBvciBlbmQtb2YtbGluZSByZXN1bHRzIGluCisgICAgICAgIGJiX3Nob3dfdXNhZ2UoKSBiZWluZyBjYWxsZWQgaWYgdGhpcyBvcHRpb24gaXMgZW5jb3VudGVyZWQuCisgICAgICAgIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgdG8gaW1wbGVtZW50ICJwcmludCB2ZXJib3NlIHVzYWdlIG1lc3NhZ2UKKyAgICAgICAgYW5kIGV4aXQiIG9wdGlvbi4KKworICJhLWIiICBBIGRhc2ggYmV0d2VlbiB0d28gb3B0aW9ucyBjYXVzZXMgdGhlIHNlY29uZCBvZiB0aGUgdHdvCisgICAgICAgIHRvIGJlIHVuc2V0IChhbmQgaWdub3JlZCkgaWYgaXQgaXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KKworICAgICAgICBbRklYTUU6IHdoYXQgaWYgdGhleSBhcmUgdGhlIHNhbWU/IGxpa2UgIngteCI/IElzIGl0IGV2ZXIgdXNlZnVsP10KKworICAgICAgICBGb3IgZXhhbXBsZToKKyAgICAgICAgVGhlIGR1IGFwcGxldCBoYXMgdGhlIG9wdGlvbnMgIi1zIiBhbmQgIi1kIGRlcHRoIi4gIElmCisgICAgICAgIGdldG9wdDMyIGZpbmRzIC1zLCB0aGVuIC1kIGlzIHVuc2V0IG9yIGlmIGl0IGZpbmRzIC1kCisgICAgICAgIHRoZW4gLXMgaXMgdW5zZXQuICAoTm90ZTogIGJ1c3lib3ggaW1wbGVtZW50cyB0aGUgR05VCisgICAgICAgICItLW1heC1kZXB0aCIgb3B0aW9uIGFzICItZCIuKSAgVG8gb2J0YWluIHRoaXMgYmVoYXZpb3IsIHlvdQorICAgICAgICBzZXQgb3B0X2NvbXBsZW1lbnRhcnkgPSAicy1kOmQtcyIuICBPbmx5IG9uZSBmbGFnIHZhbHVlIGlzCisgICAgICAgIGFkZGVkIHRvIGdldG9wdDMyJ3MgcmV0dXJuIHZhbHVlIGRlcGVuZGluZyBvbiB0aGUKKyAgICAgICAgcG9zaXRpb24gb2YgdGhlIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQgbGluZS4gIElmIG9uZSBvZiB0aGUKKyAgICAgICAgdHdvIG9wdGlvbnMgcmVxdWlyZXMgYW4gYXJndW1lbnQgcG9pbnRlciAoIjoiIGluIGFwcGxldF9vcHRzCisgICAgICAgIGFzIGluICJkOiIpIG9wdGFyZyBpcyBzZXQgYWNjb3JkaW5nbHkuCisKKyAgICAgICAgY2hhciAqc21heF9wcmludF9kZXB0aDsKKworICAgICAgICBvcHRfY29tcGxlbWVudGFyeSA9ICJzLWQ6ZC1zOngteCI7CisgICAgICAgIG9wdCA9IGdldG9wdDMyKGFyZ3YsICJzZDp4IiwgJnNtYXhfcHJpbnRfZGVwdGgpOworCisgICAgICAgIGlmIChvcHQgJiAyKQorICAgICAgICAgICAgICAgIG1heF9wcmludF9kZXB0aCA9IGF0b2koc21heF9wcmludF9kZXB0aCk7CisgICAgICAgIGlmIChvcHQgJiA0KQorICAgICAgICAgICAgICAgIHByaW50ZigiRGV0ZWN0ZWQgb2RkIC14IHVzYWdlXG4iKTsKKworICJhLS1iIiBBIGRvdWJsZSBkYXNoIGJldHdlZW4gdHdvIG9wdGlvbnMsIG9yIGJldHdlZW4gYW4gb3B0aW9uIGFuZCBhIGdyb3VwCisgICAgICAgIG9mIG9wdGlvbnMsIG1lYW5zIHRoYXQgdGhleSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiAgVW5saWtlCisgICAgICAgIHRoZSAiLSIgY2FzZSBhYm92ZSwgYW4gZXJyb3Igd2lsbCBiZSBmb3JjZWQgaWYgdGhlIG9wdGlvbnMKKyAgICAgICAgYXJlIHVzZWQgdG9nZXRoZXIuCisKKyAgICAgICAgRm9yIGV4YW1wbGU6CisgICAgICAgIFRoZSBjdXQgYXBwbGV0IG11c3QgaGF2ZSBvbmx5IG9uZSB0eXBlIG9mIGxpc3Qgc3BlY2lmaWVkLCBzbworICAgICAgICAtYiwgLWMgYW5kIC1mIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgYW5kIHNob3VsZCByYWlzZSBhbiBlcnJvcgorICAgICAgICBpZiBzcGVjaWZpZWQgdG9nZXRoZXIuICBJbiB0aGlzIGNhc2UgeW91IG11c3Qgc2V0CisgICAgICAgIG9wdF9jb21wbGVtZW50YXJ5ID0gImItLWNmOmMtLWJmOmYtLWJjIi4gIElmIHR3byBvZiB0aGUKKyAgICAgICAgbXV0dWFsbHkgZXhjbHVzaXZlIG9wdGlvbnMgYXJlIGZvdW5kLCBnZXRvcHQzMiB3aWxsIGNhbGwKKyAgICAgICAgYmJfc2hvd191c2FnZSgpIGFuZCBkaWUuCisKKyAieC0teCIgVmFyaWF0aW9uIG9mIHRoZSBhYm92ZSwgaXQgbWVhbnMgdGhhdCAteCBvcHRpb24gc2hvdWxkIG9jY3VyCisgICAgICAgIGF0IG1vc3Qgb25jZS4KKworICJhKyIgICBBIHBsdXMgYWZ0ZXIgYSBjaGFyIGluIG9wdF9jb21wbGVtZW50YXJ5IG1lYW5zIHRoYXQgdGhlIHBhcmFtZXRlcgorICAgICAgICBmb3IgdGhpcyBvcHRpb24gaXMgYSBub25uZWdhdGl2ZSBpbnRlZ2VyLiBJdCB3aWxsIGJlIHByb2Nlc3NlZAorICAgICAgICB3aXRoIHhhdG9pX3Bvc2l0aXZlKCkgLSBhbGxvd2VkIHJhbmdlIGlzIDAuLklOVF9NQVguCisKKyAgICAgICAgaW50IHBhcmFtOyAgLy8gInVuc2lnbmVkIHBhcmFtOyIgd2lsbCBhbHNvIHdvcmsKKyAgICAgICAgb3B0X2NvbXBsZW1lbnRhcnkgPSAicCsiOworICAgICAgICBnZXRvcHQzMihhcmd2LCAicDoiLCAmcGFyYW0pOworCisgImE6OiIgIEEgZG91YmxlIGNvbG9uIGFmdGVyIGEgY2hhciBpbiBvcHRfY29tcGxlbWVudGFyeSBtZWFucyB0aGF0IHRoZQorICAgICAgICBvcHRpb24gY2FuIG9jY3VyIG11bHRpcGxlIHRpbWVzLiBFYWNoIG9jY3VycmVuY2Ugd2lsbCBiZSBzYXZlZCBhcworICAgICAgICBhIGxsaXN0X3QgZWxlbWVudCBpbnN0ZWFkIG9mIGNoYXIqLgorCisgICAgICAgIEZvciBleGFtcGxlOgorICAgICAgICBUaGUgZ3JlcCBhcHBsZXQgY2FuIGhhdmUgb25lIG9yIG1vcmUgIi1lIHBhdHRlcm4iIGFyZ3VtZW50cy4KKyAgICAgICAgSW4gdGhpcyBjYXNlIHlvdSBzaG91bGQgdXNlIGdldG9wdDMyKCkgYXMgZm9sbG93czoKKworICAgICAgICBsbGlzdF90ICpwYXR0ZXJucyA9IE5VTEw7CisKKyAgICAgICAgKHRoaXMgcG9pbnRlciBtdXN0IGJlIGluaXRpYWxpemF0ZWQgdG8gTlVMTCBpZiB0aGUgbGlzdCBpcyBlbXB0eQorICAgICAgICBhcyByZXF1aXJlZCBieSBsbGlzdF9hZGRfdG9fZW5kKGxsaXN0X3QgKipvbGRfaGVhZCwgY2hhciAqbmV3X2l0ZW0pLikKKworICAgICAgICBvcHRfY29tcGxlbWVudGFyeSA9ICJlOjoiOworCisgICAgICAgIGdldG9wdDMyKGFyZ3YsICJlOiIsICZwYXR0ZXJucyk7CisgICAgICAgICQgZ3JlcCAtZSB1c2VyIC1lIHJvb3QgL2V0Yy9wYXNzd2QKKyAgICAgICAgcm9vdDp4OjA6MDpyb290Oi9yb290Oi9iaW4vYmFzaAorICAgICAgICB1c2VyOng6NTAwOjUwMDo6L2hvbWUvdXNlcjovYmluL2Jhc2gKKworICJhP2IiICBBICI/IiBiZXR3ZWVuIGFuIG9wdGlvbiBhbmQgYSBncm91cCBvZiBvcHRpb25zIG1lYW5zIHRoYXQKKyAgICAgICAgYXQgbGVhc3Qgb25lIG9mIHRoZW0gaXMgcmVxdWlyZWQgdG8gb2NjdXIgaWYgdGhlIGZpcnN0IG9wdGlvbgorICAgICAgICBvY2N1cnMgaW4gcHJlY2VkaW5nIGNvbW1hbmQgbGluZSBhcmd1bWVudHMuCisKKyAgICAgICAgRm9yIGV4YW1wbGUgZnJvbSAiaWQiIGFwcGxldDoKKworICAgICAgICAvLyBEb24ndCBhbGxvdyAtbiAtciAtcm4gLXVnIC1ydWcgLW51ZyAtcm51ZworICAgICAgICBvcHRfY29tcGxlbWVudGFyeSA9ICJyP3VnOm4/dWc6dS0tZzpnLS11IjsKKyAgICAgICAgZmxhZ3MgPSBnZXRvcHQzMihhcmd2LCAicm51ZyIpOworCisgICAgICAgIFRoaXMgZXhhbXBsZSBhbGxvd2VkIG9ubHk6CisgICAgICAgICQgaWQ7IGlkIC11OyBpZCAtZzsgaWQgLXJ1OyBpZCAtbnU7IGlkIC1yZzsgaWQgLW5nOyBpZCAtcm51OyBpZCAtcm5nCisKKyAiWCIgICAgQSBvcHRfY29tcGxlbWVudGFyeSBncm91cCB3aXRoIGp1c3QgYSBzaW5nbGUgbGV0dGVyIG1lYW5zCisgICAgICAgIHRoYXQgdGhpcyBvcHRpb24gaXMgcmVxdWlyZWQuIElmIG1vcmUgdGhhbiBvbmUgc3VjaCBncm91cCBleGlzdHMsCisgICAgICAgIGF0IGxlYXN0IG9uZSBvcHRpb24gaXMgcmVxdWlyZWQgdG8gb2NjdXIgKG5vdCBhbGwgb2YgdGhlbSkuCisgICAgICAgIEZvciBleGFtcGxlIGZyb20gInN0YXJ0LXN0b3AtZGFlbW9uIiBhcHBsZXQ6CisKKyAgICAgICAgLy8gRG9uJ3QgYWxsb3cgLUtTIC1TSywgYnV0IC1TIG9yIC1LIGlzIHJlcXVpcmVkCisgICAgICAgIG9wdF9jb21wbGVtZW50YXJ5ID0gIks6UzpLLS1TOlMtLUsiOworICAgICAgICBmbGFncyA9IGdldG9wdDMyKGFyZ3YsICJLUy4uLik7CisKKworICAgICAgICBEb24ndCBmb3JnZXQgdG8gdXNlICc6Jy4gRm9yIGV4YW1wbGUsICI/MzIyLTIyLTIzWC14LWEiCisgICAgICAgIGlzIGludGVycHJldGVkIGFzICI/MzoyMjotMjoyLTI6Mi0zWGE6Mi0teCIgLQorICAgICAgICBtYXggMyBhcmdzOyBjb3VudCB1c2VzIG9mICctMic7IG1pbiAyIGFyZ3M7IGlmIHRoZXJlIGlzCisgICAgICAgIGEgJy0yJyBvcHRpb24gdGhlbiB1bnNldCAnLTMnLCAnLVgnIGFuZCAnLWEnOyBpZiB0aGVyZSBpcworICAgICAgICBhICctMicgYW5kIGFmdGVyIGl0IGEgJy14JyB0aGVuIGVycm9yIG91dC4KKyAgICAgICAgQnV0IGl0J3MgZmFyIHRvbyBvYmZ1c2NhdGVkLiBVc2UgJzonIHRvIHNlcGFyYXRlIGdyb3Vwcy4KKyovCisKKy8qIENvZGUgaGVyZSBhc3N1bWVzIHRoYXQgJ3Vuc2lnbmVkJyBpcyBhdCBsZWFzdCAzMiBiaXRzIHdpZGUgKi8KKworY29uc3QgY2hhciAqY29uc3QgYmJfYXJndl9kYXNoW10gPSB7ICItIiwgTlVMTCB9OworCitjb25zdCBjaGFyICpvcHRfY29tcGxlbWVudGFyeTsKKworZW51bSB7CisJUEFSQU1fU1RSSU5HLAorCVBBUkFNX0xJU1QsCisJUEFSQU1fSU5ULAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGNoYXIgb3B0X2NoYXI7CisJc21hbGxpbnQgcGFyYW1fdHlwZTsKKwl1bnNpZ25lZCBzd2l0Y2hfb247CisJdW5zaWduZWQgc3dpdGNoX29mZjsKKwl1bnNpZ25lZCBpbmNvbmdydW91c2x5OworCXVuc2lnbmVkIHJlcXVpcmVzOworCXZvaWQgKipvcHRhcmc7ICAvKiBjaGFyKiosIGxsaXN0X3QqKiBvciBpbnQgKi4gKi8KKwlpbnQgKmNvdW50ZXI7Cit9IHRfY29tcGxlbWVudGFyeTsKKworLyogWW91IGNhbiBzZXQgYXBwbGV0X2xvbmdfb3B0aW9ucyBmb3IgcGFyc2UgY2FsbGVkIGxvbmcgb3B0aW9ucyAqLworI2lmIEVOQUJMRV9MT05HX09QVFMgfHwgRU5BQkxFX0ZFQVRVUkVfR0VUT1BUX0xPTkcKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGJiX251bGxfbG9uZ19vcHRpb25zWzFdID0geworCXsgMCwgMCwgMCwgMCB9Cit9OworY29uc3QgY2hhciAqYXBwbGV0X2xvbmdfb3B0aW9uczsKKyNlbmRpZgorCit1aW50MzJfdCBvcHRpb25fbWFzazMyOworCit1aW50MzJfdCBGQVNUX0ZVTkMKK2dldG9wdDMyKGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICphcHBsZXRfb3B0cywgLi4uKQoreworCWludCBhcmdjOworCXVuc2lnbmVkIGZsYWdzID0gMDsKKwl1bnNpZ25lZCByZXF1aXJlcyA9IDA7CisJdF9jb21wbGVtZW50YXJ5IGNvbXBsZW1lbnRhcnlbMzNdOyAvKiBsYXN0IHN0YXlzIHplcm8tZmlsbGVkICovCisJY2hhciBmaXJzdF9jaGFyOworCWludCBjOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnM7CisJdF9jb21wbGVtZW50YXJ5ICpvbl9vZmY7CisJdmFfbGlzdCBwOworI2lmIEVOQUJMRV9MT05HX09QVFMgfHwgRU5BQkxFX0ZFQVRVUkVfR0VUT1BUX0xPTkcKKwljb25zdCBzdHJ1Y3Qgb3B0aW9uICpsX287CisJc3RydWN0IG9wdGlvbiAqbG9uZ19vcHRpb25zID0gKHN0cnVjdCBvcHRpb24gKikgJmJiX251bGxfbG9uZ19vcHRpb25zOworI2VuZGlmCisJdW5zaWduZWQgdHJpZ2dlcjsKKwljaGFyICoqcGFyZ3Y7CisJaW50IG1pbl9hcmcgPSAwOworCWludCBtYXhfYXJnID0gLTE7CisKKyNkZWZpbmUgU0hPV19VU0FHRV9JRl9FUlJPUiAgICAgMQorI2RlZmluZSBBTExfQVJHVl9JU19PUFRTICAgICAgICAyCisjZGVmaW5lIEZJUlNUX0FSR1ZfSVNfT1BUICAgICAgIDQKKworCWludCBzcGVjX2ZsZ3MgPSAwOworCisJLyogc2tpcCAwOiBzb21lIGFwcGxldHMgY2hlYXQ6IHRoZXkgZG8gbm90IGFjdHVhbGx5IEhBVkUgYXJndlswXSAqLworCWFyZ2MgPSAxOworCXdoaWxlIChhcmd2W2FyZ2NdKQorCQlhcmdjKys7CisKKwl2YV9zdGFydChwLCBhcHBsZXRfb3B0cyk7CisKKwljID0gMDsKKwlvbl9vZmYgPSBjb21wbGVtZW50YXJ5OworCW1lbXNldChvbl9vZmYsIDAsIHNpemVvZihjb21wbGVtZW50YXJ5KSk7CisKKwkvKiBza2lwIGJib3ggZXh0ZW5zaW9uICovCisJZmlyc3RfY2hhciA9IGFwcGxldF9vcHRzWzBdOworCWlmIChmaXJzdF9jaGFyID09ICchJykKKwkJYXBwbGV0X29wdHMrKzsKKworCS8qIHNraXAgR05VIGV4dGVuc2lvbiAqLworCXMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWFwcGxldF9vcHRzOworCWlmICgqcyA9PSAnKycgfHwgKnMgPT0gJy0nKQorCQlzKys7CisJd2hpbGUgKCpzKSB7CisJCWlmIChjID49IDMyKQorCQkJYnJlYWs7CisJCW9uX29mZi0+b3B0X2NoYXIgPSAqczsKKwkJb25fb2ZmLT5zd2l0Y2hfb24gPSAoMSA8PCBjKTsKKwkJaWYgKCorK3MgPT0gJzonKSB7CisJCQlvbl9vZmYtPm9wdGFyZyA9IHZhX2FyZyhwLCB2b2lkICoqKTsKKwkJCXdoaWxlICgqKytzID09ICc6JykKKwkJCQljb250aW51ZTsKKwkJfQorCQlvbl9vZmYrKzsKKwkJYysrOworCX0KKworI2lmIEVOQUJMRV9MT05HX09QVFMgfHwgRU5BQkxFX0ZFQVRVUkVfR0VUT1BUX0xPTkcKKwlpZiAoYXBwbGV0X2xvbmdfb3B0aW9ucykgeworCQljb25zdCBjaGFyICpvcHRzdHI7CisJCXVuc2lnbmVkIGksIGNvdW50OworCisJCWNvdW50ID0gMTsKKwkJb3B0c3RyID0gYXBwbGV0X2xvbmdfb3B0aW9uczsKKwkJd2hpbGUgKG9wdHN0clswXSkgeworCQkJb3B0c3RyICs9IHN0cmxlbihvcHRzdHIpICsgMzsgLyogc2tpcCBOVUwsIGhhc19hcmcsIHZhbCAqLworCQkJY291bnQrKzsKKwkJfQorCQkvKiBjb3VudCA9PSBuby4gb2YgbG9uZ29wdHMgKyAxICovCisJCWxvbmdfb3B0aW9ucyA9IGFsbG9jYShjb3VudCAqIHNpemVvZigqbG9uZ19vcHRpb25zKSk7CisJCW1lbXNldChsb25nX29wdGlvbnMsIDAsIGNvdW50ICogc2l6ZW9mKCpsb25nX29wdGlvbnMpKTsKKwkJaSA9IDA7CisJCW9wdHN0ciA9IGFwcGxldF9sb25nX29wdGlvbnM7CisJCXdoaWxlICgtLWNvdW50KSB7CisJCQlsb25nX29wdGlvbnNbaV0ubmFtZSA9IG9wdHN0cjsKKwkJCW9wdHN0ciArPSBzdHJsZW4ob3B0c3RyKSArIDE7CisJCQlsb25nX29wdGlvbnNbaV0uaGFzX2FyZyA9ICh1bnNpZ25lZCBjaGFyKSgqb3B0c3RyKyspOworCQkJLyogbG9uZ19vcHRpb25zW2ldLmZsYWcgPSBOVUxMOyAqLworCQkJbG9uZ19vcHRpb25zW2ldLnZhbCA9ICh1bnNpZ25lZCBjaGFyKSgqb3B0c3RyKyspOworCQkJaSsrOworCQl9CisJCWZvciAobF9vID0gbG9uZ19vcHRpb25zOyBsX28tPm5hbWU7IGxfbysrKSB7CisJCQlpZiAobF9vLT5mbGFnKQorCQkJCWNvbnRpbnVlOworCQkJZm9yIChvbl9vZmYgPSBjb21wbGVtZW50YXJ5OyBvbl9vZmYtPm9wdF9jaGFyOyBvbl9vZmYrKykKKwkJCQlpZiAob25fb2ZmLT5vcHRfY2hhciA9PSBsX28tPnZhbCkKKwkJCQkJZ290byBuZXh0X2xvbmc7CisJCQlpZiAoYyA+PSAzMikKKwkJCQlicmVhazsKKwkJCW9uX29mZi0+b3B0X2NoYXIgPSBsX28tPnZhbDsKKwkJCW9uX29mZi0+c3dpdGNoX29uID0gKDEgPDwgYyk7CisJCQlpZiAobF9vLT5oYXNfYXJnICE9IG5vX2FyZ3VtZW50KQorCQkJCW9uX29mZi0+b3B0YXJnID0gdmFfYXJnKHAsIHZvaWQgKiopOworCQkJYysrOworIG5leHRfbG9uZzogOworCQl9CisJCS8qIE1ha2UgaXQgdW5uZWNlc3NhcnkgdG8gY2xlYXIgYXBwbGV0X2xvbmdfb3B0aW9ucworCQkgKiBieSBoYW5kIGFmdGVyIGVhY2ggY2FsbCB0byBnZXRvcHQzMgorCQkgKi8KKwkJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IE5VTEw7CisJfQorI2VuZGlmIC8qIEVOQUJMRV9MT05HX09QVFMgfHwgRU5BQkxFX0ZFQVRVUkVfR0VUT1BUX0xPTkcgKi8KKwlmb3IgKHMgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKW9wdF9jb21wbGVtZW50YXJ5OyBzICYmICpzOyBzKyspIHsKKwkJdF9jb21wbGVtZW50YXJ5ICpwYWlyOworCQl1bnNpZ25lZCAqcGFpcl9zd2l0Y2g7CisKKwkJaWYgKCpzID09ICc6JykKKwkJCWNvbnRpbnVlOworCQljID0gc1sxXTsKKwkJaWYgKCpzID09ICc/JykgeworCQkJaWYgKGMgPCAnMCcgfHwgYyA+ICc5JykgeworCQkJCXNwZWNfZmxncyB8PSBTSE9XX1VTQUdFX0lGX0VSUk9SOworCQkJfSBlbHNlIHsKKwkJCQltYXhfYXJnID0gYyAtICcwJzsKKwkJCQlzKys7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKnMgPT0gJy0nKSB7CisJCQlpZiAoYyA8ICcwJyB8fCBjID4gJzknKSB7CisJCQkJaWYgKGMgPT0gJy0nKSB7CisJCQkJCXNwZWNfZmxncyB8PSBGSVJTVF9BUkdWX0lTX09QVDsKKwkJCQkJcysrOworCQkJCX0gZWxzZQorCQkJCQlzcGVjX2ZsZ3MgfD0gQUxMX0FSR1ZfSVNfT1BUUzsKKwkJCX0gZWxzZSB7CisJCQkJbWluX2FyZyA9IGMgLSAnMCc7CisJCQkJcysrOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJaWYgKCpzID09ICc9JykgeworCQkJbWluX2FyZyA9IG1heF9hcmcgPSBjIC0gJzAnOworCQkJcysrOworCQkJY29udGludWU7CisJCX0KKwkJZm9yIChvbl9vZmYgPSBjb21wbGVtZW50YXJ5OyBvbl9vZmYtPm9wdF9jaGFyOyBvbl9vZmYrKykKKwkJCWlmIChvbl9vZmYtPm9wdF9jaGFyID09ICpzKQorCQkJCWdvdG8gZm91bmRfb3B0OworCQkvKiBXaXRob3V0IHRoaXMsIGRpYWdub3N0aWMgb2Ygc3VjaCBidWdzIGlzIG5vdCBlYXN5ICovCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJOTyBPUFQgJWMhIiwgKnMpOworIGZvdW5kX29wdDoKKwkJaWYgKGMgPT0gJzonICYmIHNbMl0gPT0gJzonKSB7CisJCQlvbl9vZmYtPnBhcmFtX3R5cGUgPSBQQVJBTV9MSVNUOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGMgPT0gJysnICYmIChzWzJdID09ICc6JyB8fCBzWzJdID09ICdcMCcpKSB7CisJCQlvbl9vZmYtPnBhcmFtX3R5cGUgPSBQQVJBTV9JTlQ7CisJCQlzKys7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA9PSAnOicgfHwgYyA9PSAnXDAnKSB7CisJCQlyZXF1aXJlcyB8PSBvbl9vZmYtPnN3aXRjaF9vbjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID09ICctJyAmJiAoc1syXSA9PSAnOicgfHwgc1syXSA9PSAnXDAnKSkgeworCQkJZmxhZ3MgfD0gb25fb2ZmLT5zd2l0Y2hfb247CisJCQlvbl9vZmYtPmluY29uZ3J1b3VzbHkgfD0gb25fb2ZmLT5zd2l0Y2hfb247CisJCQlzKys7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA9PSAqcykgeworCQkJb25fb2ZmLT5jb3VudGVyID0gdmFfYXJnKHAsIGludCAqKTsKKwkJCXMrKzsKKwkJfQorCQlwYWlyID0gb25fb2ZmOworCQlwYWlyX3N3aXRjaCA9ICZwYWlyLT5zd2l0Y2hfb247CisJCWZvciAocysrOyAqcyAmJiAqcyAhPSAnOic7IHMrKykgeworCQkJaWYgKCpzID09ICc/JykgeworCQkJCXBhaXJfc3dpdGNoID0gJnBhaXItPnJlcXVpcmVzOworCQkJfSBlbHNlIGlmICgqcyA9PSAnLScpIHsKKwkJCQlpZiAocGFpcl9zd2l0Y2ggPT0gJnBhaXItPnN3aXRjaF9vZmYpCisJCQkJCXBhaXJfc3dpdGNoID0gJnBhaXItPmluY29uZ3J1b3VzbHk7CisJCQkJZWxzZQorCQkJCQlwYWlyX3N3aXRjaCA9ICZwYWlyLT5zd2l0Y2hfb2ZmOworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKG9uX29mZiA9IGNvbXBsZW1lbnRhcnk7IG9uX29mZi0+b3B0X2NoYXI7IG9uX29mZisrKQorCQkJCQlpZiAob25fb2ZmLT5vcHRfY2hhciA9PSAqcykgeworCQkJCQkJKnBhaXJfc3dpdGNoIHw9IG9uX29mZi0+c3dpdGNoX29uOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCX0KKwkJfQorCQlzLS07CisJfQorCW9wdF9jb21wbGVtZW50YXJ5ID0gTlVMTDsKKwl2YV9lbmQocCk7CisKKwlpZiAoc3BlY19mbGdzICYgKEZJUlNUX0FSR1ZfSVNfT1BUIHwgQUxMX0FSR1ZfSVNfT1BUUykpIHsKKwkJcGFyZ3YgPSBhcmd2ICsgMTsKKwkJd2hpbGUgKCpwYXJndikgeworCQkJaWYgKHBhcmd2WzBdWzBdICE9ICctJyAmJiBwYXJndlswXVswXSAhPSAnXDAnKSB7CisJCQkJLyogQ2FuJ3QgdXNlIGFsbG9jYTogb3B0cyB3aXRoIHBhcmFtcyB3aWxsCisJCQkJICogcmV0dXJuIHBvaW50ZXJzIHRvIHN0YWNrIQorCQkJCSAqIE5COiB3ZSBsZWFrIHRoZXNlIGFsbG9jYXRpb25zLi4uICovCisJCQkJY2hhciAqcHAgPSB4bWFsbG9jKHN0cmxlbigqcGFyZ3YpICsgMik7CisJCQkJKnBwID0gJy0nOworCQkJCXN0cmNweShwcCArIDEsICpwYXJndik7CisJCQkJKnBhcmd2ID0gcHA7CisJCQl9CisJCQlpZiAoIShzcGVjX2ZsZ3MgJiBBTExfQVJHVl9JU19PUFRTKSkKKwkJCQlicmVhazsKKwkJCXBhcmd2Kys7CisJCX0KKwl9CisKKwkvKiBJbiBjYXNlIGdldG9wdDMyIHdhcyBhbHJlYWR5IGNhbGxlZDoKKwkgKiByZXNldCB0aGUgbGliYyBnZXRvcHQoKSBmdW5jdGlvbiwgd2hpY2gga2VlcHMgaW50ZXJuYWwgc3RhdGUuCisJICogcnVuX25vZm9ya19hcHBsZXQoKSBkb2VzIHRoaXMsIGJ1dCB3ZSBtaWdodCBlbmQgdXAgaGVyZQorCSAqIGFsc28gdmlhIGd1bnppcF9tYWluKCkgLT4gZ3ppcF9tYWluKCkuIFBsYXkgc2FmZS4KKwkgKi8KKyNpZmRlZiBfX0dMSUJDX18KKwlvcHRpbmQgPSAwOworI2Vsc2UgLyogQlNEIHN0eWxlICovCisJb3B0aW5kID0gMTsKKwkvKiBvcHRyZXNldCA9IDE7ICovCisjZW5kaWYKKwkvKiBvcHRhcmcgPSBOVUxMOyBvcHRlcnIgPSAwOyBvcHRvcHQgPSAwOyAtIGRvIHdlIG5lZWQgdGhpcz8/ICovCisKKwkvKiBOb3RlOiBqdXN0ICJnZXRvcHQoKSA8PSAwIiB3aWxsIG5vdCB3b3JrIHdlbGwgZm9yCisJICogImZha2UiIHNob3J0IG9wdGlvbnMsIGxpa2UgdGhpcyBvbmU6CisJICogd2dldCAkJy1cMjAzJyAiVGVzdDogdGVzdCIgaHR0cDovL2tlcm5lbC5vcmcvCisJICogKHN1cHBvc2VkIHRvIGFjdCBhcyAtLWhlYWRlciwgYnV0IGRvZXNuJ3QpICovCisjaWYgRU5BQkxFX0xPTkdfT1BUUyB8fCBFTkFCTEVfRkVBVFVSRV9HRVRPUFRfTE9ORworCXdoaWxlICgoYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsIGFwcGxldF9vcHRzLAorCQkJbG9uZ19vcHRpb25zLCBOVUxMKSkgIT0gLTEpIHsKKyNlbHNlCisJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIGFwcGxldF9vcHRzKSkgIT0gLTEpIHsKKyNlbmRpZgorCQkvKiBnZXRvcHQgcHJpbnRzICJvcHRpb24gcmVxdWlyZXMgYW4gYXJndW1lbnQgLS0gWCIKKwkJICogYW5kIHJldHVybnMgJz8nIGlmIGFuIG9wdGlvbiBoYXMgbm8gYXJnLCBidXQgb25lIGlzIHJlcWQgKi8KKwkJYyAmPSAweGZmOyAvKiBmaWdodCBsaWJjJ3Mgc2lnbiBleHRlbnNpb24gKi8KKwkJZm9yIChvbl9vZmYgPSBjb21wbGVtZW50YXJ5OyBvbl9vZmYtPm9wdF9jaGFyICE9IGM7IG9uX29mZisrKSB7CisJCQkvKiBjIGNhbiBiZSBOVUwgaWYgbG9uZyBvcHQgaGFzIG5vbi1OVUxMIC0+ZmxhZywKKwkJCSAqIGJ1dCB3ZSBjb25zdHJ1Y3QgbG9uZyBvcHRzIHNvIHRoYXQgZmxhZworCQkJICogaXMgYWx3YXlzIE5VTEwgKHNlZSBhYm92ZSkgKi8KKwkJCWlmIChvbl9vZmYtPm9wdF9jaGFyID09ICdcMCcgLyogJiYgYyAhPSAnXDAnICovKSB7CisJCQkJLyogYyBpcyBwcm9iYWJseSAnPycgLSAiYmFkIG9wdGlvbiIgKi8KKwkJCQlnb3RvIGVycm9yOworCQkJfQorCQl9CisJCWlmIChmbGFncyAmIG9uX29mZi0+aW5jb25ncnVvdXNseSkKKwkJCWdvdG8gZXJyb3I7CisJCXRyaWdnZXIgPSBvbl9vZmYtPnN3aXRjaF9vbiAmIG9uX29mZi0+c3dpdGNoX29mZjsKKwkJZmxhZ3MgJj0gfihvbl9vZmYtPnN3aXRjaF9vZmYgXiB0cmlnZ2VyKTsKKwkJZmxhZ3MgfD0gb25fb2ZmLT5zd2l0Y2hfb24gXiB0cmlnZ2VyOworCQlmbGFncyBePSB0cmlnZ2VyOworCQlpZiAob25fb2ZmLT5jb3VudGVyKQorCQkJKCoob25fb2ZmLT5jb3VudGVyKSkrKzsKKwkJaWYgKG9wdGFyZykgeworCQkJaWYgKG9uX29mZi0+cGFyYW1fdHlwZSA9PSBQQVJBTV9MSVNUKSB7CisJCQkJbGxpc3RfYWRkX3RvX2VuZCgobGxpc3RfdCAqKikob25fb2ZmLT5vcHRhcmcpLCBvcHRhcmcpOworCQkJfSBlbHNlIGlmIChvbl9vZmYtPnBhcmFtX3R5cGUgPT0gUEFSQU1fSU5UKSB7CisvL1RPRE86IHhhdG9pX3Bvc2l0aXZlIGluZGlyZWN0bHkgcHVsbHMgaW4gcHJpbnRmIG1hY2hpbmVyeQorCQkJCSoodW5zaWduZWQqKShvbl9vZmYtPm9wdGFyZykgPSB4YXRvaV9wb3NpdGl2ZShvcHRhcmcpOworCQkJfSBlbHNlIGlmIChvbl9vZmYtPm9wdGFyZykgeworCQkJCSooY2hhciAqKikob25fb2ZmLT5vcHRhcmcpID0gb3B0YXJnOworCQkJfQorCQl9CisJfQorCisJLyogY2hlY2sgZGVwZW5kaW5nIHJlcXVpcmVzIGZvciBnaXZlbiBvcHRpb25zICovCisJZm9yIChvbl9vZmYgPSBjb21wbGVtZW50YXJ5OyBvbl9vZmYtPm9wdF9jaGFyOyBvbl9vZmYrKykgeworCQlpZiAob25fb2ZmLT5yZXF1aXJlcworCQkgJiYgKGZsYWdzICYgb25fb2ZmLT5zd2l0Y2hfb24pCisJCSAmJiAoZmxhZ3MgJiBvbl9vZmYtPnJlcXVpcmVzKSA9PSAwCisJCSkgeworCQkJZ290byBlcnJvcjsKKwkJfQorCX0KKwlpZiAocmVxdWlyZXMgJiYgKGZsYWdzICYgcmVxdWlyZXMpID09IDApCisJCWdvdG8gZXJyb3I7CisJYXJnYyAtPSBvcHRpbmQ7CisJaWYgKGFyZ2MgPCBtaW5fYXJnIHx8IChtYXhfYXJnID49IDAgJiYgYXJnYyA+IG1heF9hcmcpKQorCQlnb3RvIGVycm9yOworCisJb3B0aW9uX21hc2szMiA9IGZsYWdzOworCXJldHVybiBmbGFnczsKKworIGVycm9yOgorCWlmIChmaXJzdF9jaGFyICE9ICchJykKKwkJYmJfc2hvd191c2FnZSgpOworCXJldHVybiAoaW50MzJfdCktMTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2dldHB0eS5jIGIvbGliYmIvZ2V0cHR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxZDcyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2dldHB0eS5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgZ2V0cHR5IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKiBCam9ybiBXZXNlbiwgQXhpcyBDb21tdW5pY2F0aW9ucyBBQiAoYmpvcm53QGF4aXMuY29tKQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgREVCVUcgMAorCitpbnQgRkFTVF9GVU5DIHhnZXRwdHkoY2hhciAqbGluZSkKK3sKKwlpbnQgcDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0RFVlBUUworCXAgPSBvcGVuKCIvZGV2L3B0bXgiLCBPX1JEV1IpOworCWlmIChwID49IDApIHsKKwkJZ3JhbnRwdChwKTsgLyogY2htb2QrY2hvd24gY29ycmVzcG9uZGluZyBzbGF2ZSBwdHkgKi8KKwkJdW5sb2NrcHQocCk7IC8qICh3aGF0IGRvZXMgdGhpcyBkbz8pICovCisjIGlmbmRlZiBIQVZFX1BUU05BTUVfUgorCQl7CisJCQljb25zdCBjaGFyICpuYW1lOworCQkJbmFtZSA9IHB0c25hbWUocCk7IC8qIGZpbmQgb3V0IHRoZSBuYW1lIG9mIHNsYXZlIHB0eSAqLworCQkJaWYgKCFuYW1lKSB7CisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJwdHNuYW1lIGVycm9yIChpcyAvZGV2L3B0cyBtb3VudGVkPykiKTsKKwkJCX0KKwkJCXNhZmVfc3RybmNweShsaW5lLCBuYW1lLCBHRVRQVFlfQlVGU0laRSk7CisJCX0KKyMgZWxzZQorCQkvKiBmaW5kIG91dCB0aGUgbmFtZSBvZiBzbGF2ZSBwdHkgKi8KKwkJaWYgKHB0c25hbWVfcihwLCBsaW5lLCBHRVRQVFlfQlVGU0laRS0xKSAhPSAwKSB7CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInB0c25hbWUgZXJyb3IgKGlzIC9kZXYvcHRzIG1vdW50ZWQ/KSIpOworCQl9CisJCWxpbmVbR0VUUFRZX0JVRlNJWkUtMV0gPSAnXDAnOworIyBlbmRpZgorCQlyZXR1cm4gcDsKKwl9CisjZWxzZQorCXN0cnVjdCBzdGF0IHN0YjsKKwlpbnQgaTsKKwlpbnQgajsKKworCXN0cmNweShsaW5lLCAiL2Rldi9wdHlYWCIpOworCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJbGluZVs4XSA9ICJwcXJzdHV2d3h5emFiY2RlIltpXTsKKwkJbGluZVs5XSA9ICcwJzsKKwkJaWYgKHN0YXQobGluZSwgJnN0YikgPCAwKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlmb3IgKGogPSAwOyBqIDwgMTY7IGorKykgeworCQkJbGluZVs5XSA9IGogPCAxMCA/IGogKyAnMCcgOiBqIC0gMTAgKyAnYSc7CisJCQlpZiAoREVCVUcpCisJCQkJZnByaW50ZihzdGRlcnIsICJUcnlpbmcgdG8gb3BlbiBkZXZpY2U6ICVzXG4iLCBsaW5lKTsKKwkJCXAgPSBvcGVuKGxpbmUsIE9fUkRXUiB8IE9fTk9DVFRZKTsKKwkJCWlmIChwID49IDApIHsKKwkJCQlsaW5lWzVdID0gJ3QnOworCQkJCXJldHVybiBwOworCQkJfQorCQl9CisJfQorI2VuZGlmIC8qIEZFQVRVUkVfREVWUFRTICovCisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGZpbmQgZnJlZSBwdHkiKTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2hhc2hfbWQ1X3NoYS5jIGIvbGliYmIvaGFzaF9tZDVfc2hhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA4YzZiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2hhc2hfbWQ1X3NoYS5jCkBAIC0wLDAgKzEsMTQ0MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGVueXMgVmxhc2Vua28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBnY2MgNC4yLjEgb3B0aW1pemVzIHJvdHI2NCBiZXR0ZXIgd2l0aCBpbmxpbmUgdGhhbiB3aXRoIG1hY3JvCisgKiAoZm9yIHJvdFgzMiwgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSkuIFdoeT8gTXkgZ3Vlc3MgaXMgdGhhdAorICogbWFjcm8gcmVxdWlyZXMgY2xldmVyIGNvbW1vbiBzdWJleHByZXNzaW9uIGVsaW1pbmF0aW9uIGhldXJpc3RpY3MKKyAqIGluIGdjYywgd2hpbGUgaW5saW5lIGJhc2ljYWxseSBmb3JjZXMgaXQgdG8gaGFwcGVuLgorICovCisvLyNkZWZpbmUgcm90bDMyKHgsbikgKCgoeCkgPDwgKG4pKSB8ICgoeCkgPj4gKDMyIC0gKG4pKSkpCitzdGF0aWMgQUxXQVlTX0lOTElORSB1aW50MzJfdCByb3RsMzIodWludDMyX3QgeCwgdW5zaWduZWQgbikKK3sKKwlyZXR1cm4gKHggPDwgbikgfCAoeCA+PiAoMzIgLSBuKSk7Cit9CisvLyNkZWZpbmUgcm90cjMyKHgsbikgKCgoeCkgPj4gKG4pKSB8ICgoeCkgPDwgKDMyIC0gKG4pKSkpCitzdGF0aWMgQUxXQVlTX0lOTElORSB1aW50MzJfdCByb3RyMzIodWludDMyX3QgeCwgdW5zaWduZWQgbikKK3sKKwlyZXR1cm4gKHggPj4gbikgfCAoeCA8PCAoMzIgLSBuKSk7Cit9CisvKiByb3RyNjQgaW4gbmVlZGVkIGZvciBzaGE1MTIgb25seTogKi8KKy8vI2RlZmluZSByb3RyNjQoeCxuKSAoKCh4KSA+PiAobikpIHwgKCh4KSA8PCAoNjQgLSAobikpKSkKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHVpbnQ2NF90IHJvdHI2NCh1aW50NjRfdCB4LCB1bnNpZ25lZCBuKQoreworCXJldHVybiAoeCA+PiBuKSB8ICh4IDw8ICg2NCAtIG4pKTsKK30KKworLyogcm90bDY0IG9ubHkgdXNlZCBmb3Igc2hhMyBjdXJyZW50bHkgKi8KK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHVpbnQ2NF90IHJvdGw2NCh1aW50NjRfdCB4LCB1bnNpZ25lZCBuKQoreworCXJldHVybiAoeCA8PCBuKSB8ICh4ID4+ICg2NCAtIG4pKTsKK30KKworLyogRmVlZCBkYXRhIHRocm91Z2ggYSB0ZW1wb3JhcnkgYnVmZmVyLgorICogVGhlIGludGVybmFsIGJ1ZmZlciByZW1lbWJlcnMgcHJldmlvdXMgZGF0YSB1bnRpbCBpdCBoYXMgNjQKKyAqIGJ5dGVzIHdvcnRoIHRvIHBhc3Mgb24uCisgKi8KK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjb21tb242NF9oYXNoKG1kNV9jdHhfdCAqY3R4LCBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW4pCit7CisJdW5zaWduZWQgYnVmcG9zID0gY3R4LT50b3RhbDY0ICYgNjM7CisKKwljdHgtPnRvdGFsNjQgKz0gbGVuOworCisJd2hpbGUgKDEpIHsKKwkJdW5zaWduZWQgcmVtYWluaW5nID0gNjQgLSBidWZwb3M7CisJCWlmIChyZW1haW5pbmcgPiBsZW4pCisJCQlyZW1haW5pbmcgPSBsZW47CisJCS8qIENvcHkgZGF0YSBpbnRvIGFsaWduZWQgYnVmZmVyICovCisJCW1lbWNweShjdHgtPndidWZmZXIgKyBidWZwb3MsIGJ1ZmZlciwgcmVtYWluaW5nKTsKKwkJbGVuIC09IHJlbWFpbmluZzsKKwkJYnVmZmVyID0gKGNvbnN0IGNoYXIgKilidWZmZXIgKyByZW1haW5pbmc7CisJCWJ1ZnBvcyArPSByZW1haW5pbmc7CisJCS8qIENsZXZlciB3YXkgdG8gZG8gImlmIChidWZwb3MgIT0gTikgYnJlYWs7IC4uLiA7IGJ1ZnBvcyA9IDA7IiAqLworCQlidWZwb3MgLT0gNjQ7CisJCWlmIChidWZwb3MgIT0gMCkKKwkJCWJyZWFrOworCQkvKiBCdWZmZXIgaXMgZmlsbGVkIHVwLCBwcm9jZXNzIGl0ICovCisJCWN0eC0+cHJvY2Vzc19ibG9jayhjdHgpOworCQkvKmJ1ZnBvcyA9IDA7IC0gYWxyZWFkeSBpcyAqLworCX0KK30KKworLyogUHJvY2VzcyB0aGUgcmVtYWluaW5nIGJ5dGVzIGluIHRoZSBidWZmZXIgKi8KK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjb21tb242NF9lbmQobWQ1X2N0eF90ICpjdHgsIGludCBzd2FwX25lZWRlZCkKK3sKKwl1bnNpZ25lZCBidWZwb3MgPSBjdHgtPnRvdGFsNjQgJiA2MzsKKwkvKiBQYWQgdGhlIGJ1ZmZlciB0byB0aGUgbmV4dCA2NC1ieXRlIGJvdW5kYXJ5IHdpdGggMHg4MCwwLDAsMC4uLiAqLworCWN0eC0+d2J1ZmZlcltidWZwb3MrK10gPSAweDgwOworCisJLyogVGhpcyBsb29wIGl0ZXJhdGVzIGVpdGhlciBvbmNlIG9yIHR3aWNlLCBubyBtb3JlLCBubyBsZXNzICovCisJd2hpbGUgKDEpIHsKKwkJdW5zaWduZWQgcmVtYWluaW5nID0gNjQgLSBidWZwb3M7CisJCW1lbXNldChjdHgtPndidWZmZXIgKyBidWZwb3MsIDAsIHJlbWFpbmluZyk7CisJCS8qIERvIHdlIGhhdmUgZW5vdWdoIHNwYWNlIGZvciB0aGUgbGVuZ3RoIGNvdW50PyAqLworCQlpZiAocmVtYWluaW5nID49IDgpIHsKKwkJCS8qIFN0b3JlIHRoZSA2NC1iaXQgY291bnRlciBvZiBiaXRzIGluIHRoZSBidWZmZXIgKi8KKwkJCXVpbnQ2NF90IHQgPSBjdHgtPnRvdGFsNjQgPDwgMzsKKwkJCWlmIChzd2FwX25lZWRlZCkKKwkJCQl0ID0gYmJfYnN3YXBfNjQodCk7CisJCQkvKiB3YnVmZmVyIGlzIHN1aXRhYmx5IGFsaWduZWQgZm9yIHRoaXMgKi8KKwkJCSooYmJfX2FsaWFzZWRfdWludDY0X3QgKikgKCZjdHgtPndidWZmZXJbNjQgLSA4XSkgPSB0OworCQl9CisJCWN0eC0+cHJvY2Vzc19ibG9jayhjdHgpOworCQlpZiAocmVtYWluaW5nID49IDgpCisJCQlicmVhazsKKwkJYnVmcG9zID0gMDsKKwl9Cit9CisKKworLyoKKyAqIENvbXB1dGUgTUQ1IGNoZWNrc3VtIG9mIHN0cmluZ3MgYWNjb3JkaW5nIHRvIHRoZQorICogZGVmaW5pdGlvbiBvZiBNRDUgaW4gUkZDIDEzMjEgZnJvbSBBcHJpbCAxOTkyLgorICoKKyAqIFdyaXR0ZW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAZ251LmFpLm1pdC5lZHU+LCAxOTk1LgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NS0xOTk5IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAxIE1hbnVlbCBOb3ZvYSBJSUkKKyAqIENvcHlyaWdodCAoQykgMjAwMyBHbGVubiBMLiBNY0dyYXRoCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgRXJpayBBbmRlcnNlbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogMDogZmFzdGVzdCwgMzogc21hbGxlc3QgKi8KKyNpZiBDT05GSUdfTUQ1X1NNQUxMIDwgMAorIyBkZWZpbmUgTUQ1X1NNQUxMIDAKKyNlbGlmIENPTkZJR19NRDVfU01BTEwgPiAzCisjIGRlZmluZSBNRDVfU01BTEwgMworI2Vsc2UKKyMgZGVmaW5lIE1ENV9TTUFMTCBDT05GSUdfTUQ1X1NNQUxMCisjZW5kaWYKKworLyogVGhlc2UgYXJlIHRoZSBmb3VyIGZ1bmN0aW9ucyB1c2VkIGluIHRoZSBmb3VyIHN0ZXBzIG9mIHRoZSBNRDUgYWxnb3JpdGhtCisgKiBhbmQgZGVmaW5lZCBpbiB0aGUgUkZDIDEzMjEuICBUaGUgZmlyc3QgZnVuY3Rpb24gaXMgYSBsaXR0bGUgYml0IG9wdGltaXplZAorICogKGFzIGZvdW5kIGluIENvbGluIFBsdW1icyBwdWJsaWMgZG9tYWluIGltcGxlbWVudGF0aW9uKS4KKyAqICNkZWZpbmUgRkYoYiwgYywgZCkgKChiICYgYykgfCAofmIgJiBkKSkKKyAqLworI3VuZGVmIEZGCisjdW5kZWYgRkcKKyN1bmRlZiBGSAorI3VuZGVmIEZJCisjZGVmaW5lIEZGKGIsIGMsIGQpIChkIF4gKGIgJiAoYyBeIGQpKSkKKyNkZWZpbmUgRkcoYiwgYywgZCkgRkYoZCwgYiwgYykKKyNkZWZpbmUgRkgoYiwgYywgZCkgKGIgXiBjIF4gZCkKKyNkZWZpbmUgRkkoYiwgYywgZCkgKGMgXiAoYiB8IH5kKSkKKworLyogSGFzaCBhIHNpbmdsZSBibG9jaywgNjQgYnl0ZXMgbG9uZyBhbmQgNC1ieXRlIGFsaWduZWQgKi8KK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBtZDVfcHJvY2Vzc19ibG9jazY0KG1kNV9jdHhfdCAqY3R4KQoreworI2lmIE1ENV9TTUFMTCA+IDAKKwkvKiBCZWZvcmUgd2Ugc3RhcnQsIG9uZSB3b3JkIHRvIHRoZSBzdHJhbmdlIGNvbnN0YW50cy4KKwkgICBUaGV5IGFyZSBkZWZpbmVkIGluIFJGQyAxMzIxIGFzCisJICAgVFtpXSA9IChpbnQpKDJeMzIgKiBmYWJzKHNpbihpKSkpLCBpPTEuLjY0CisJICovCisJc3RhdGljIGNvbnN0IHVpbnQzMl90IENfYXJyYXlbXSA9IHsKKwkJLyogcm91bmQgMSAqLworCQkweGQ3NmFhNDc4LCAweGU4YzdiNzU2LCAweDI0MjA3MGRiLCAweGMxYmRjZWVlLAorCQkweGY1N2MwZmFmLCAweDQ3ODdjNjJhLCAweGE4MzA0NjEzLCAweGZkNDY5NTAxLAorCQkweDY5ODA5OGQ4LCAweDhiNDRmN2FmLCAweGZmZmY1YmIxLCAweDg5NWNkN2JlLAorCQkweDZiOTAxMTIyLCAweGZkOTg3MTkzLCAweGE2Nzk0MzhlLCAweDQ5YjQwODIxLAorCQkvKiByb3VuZCAyICovCisJCTB4ZjYxZTI1NjIsIDB4YzA0MGIzNDAsIDB4MjY1ZTVhNTEsIDB4ZTliNmM3YWEsCisJCTB4ZDYyZjEwNWQsIDB4MDI0NDE0NTMsIDB4ZDhhMWU2ODEsIDB4ZTdkM2ZiYzgsCisJCTB4MjFlMWNkZTYsIDB4YzMzNzA3ZDYsIDB4ZjRkNTBkODcsIDB4NDU1YTE0ZWQsCisJCTB4YTllM2U5MDUsIDB4ZmNlZmEzZjgsIDB4Njc2ZjAyZDksIDB4OGQyYTRjOGEsCisJCS8qIHJvdW5kIDMgKi8KKwkJMHhmZmZhMzk0MiwgMHg4NzcxZjY4MSwgMHg2ZDlkNjEyMiwgMHhmZGU1MzgwYywKKwkJMHhhNGJlZWE0NCwgMHg0YmRlY2ZhOSwgMHhmNmJiNGI2MCwgMHhiZWJmYmM3MCwKKwkJMHgyODliN2VjNiwgMHhlYWExMjdmYSwgMHhkNGVmMzA4NSwgMHg0ODgxZDA1LAorCQkweGQ5ZDRkMDM5LCAweGU2ZGI5OWU1LCAweDFmYTI3Y2Y4LCAweGM0YWM1NjY1LAorCQkvKiByb3VuZCA0ICovCisJCTB4ZjQyOTIyNDQsIDB4NDMyYWZmOTcsIDB4YWI5NDIzYTcsIDB4ZmM5M2EwMzksCisJCTB4NjU1YjU5YzMsIDB4OGYwY2NjOTIsIDB4ZmZlZmY0N2QsIDB4ODU4NDVkZDEsCisJCTB4NmZhODdlNGYsIDB4ZmUyY2U2ZTAsIDB4YTMwMTQzMTQsIDB4NGUwODExYTEsCisJCTB4Zjc1MzdlODIsIDB4YmQzYWYyMzUsIDB4MmFkN2QyYmIsIDB4ZWI4NmQzOTEKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyIFBfYXJyYXlbXSBBTElHTjEgPSB7CisjIGlmIE1ENV9TTUFMTCA+IDEKKwkJMCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOSwgMTAsIDExLCAxMiwgMTMsIDE0LCAxNSwgLyogMSAqLworIyBlbmRpZgorCQkxLCA2LCAxMSwgMCwgNSwgMTAsIDE1LCA0LCA5LCAxNCwgMywgOCwgMTMsIDIsIDcsIDEyLCAvKiAyICovCisJCTUsIDgsIDExLCAxNCwgMSwgNCwgNywgMTAsIDEzLCAwLCAzLCA2LCA5LCAxMiwgMTUsIDIsIC8qIDMgKi8KKwkJMCwgNywgMTQsIDUsIDEyLCAzLCAxMCwgMSwgOCwgMTUsIDYsIDEzLCA0LCAxMSwgMiwgOSAgLyogNCAqLworCX07CisjZW5kaWYKKwl1aW50MzJfdCAqd29yZHMgPSAodm9pZCopIGN0eC0+d2J1ZmZlcjsKKwl1aW50MzJfdCBBID0gY3R4LT5oYXNoWzBdOworCXVpbnQzMl90IEIgPSBjdHgtPmhhc2hbMV07CisJdWludDMyX3QgQyA9IGN0eC0+aGFzaFsyXTsKKwl1aW50MzJfdCBEID0gY3R4LT5oYXNoWzNdOworCisjaWYgTUQ1X1NNQUxMID49IDIgIC8qIDIgb3IgMyAqLworCisJc3RhdGljIGNvbnN0IGNoYXIgU19hcnJheVtdIEFMSUdOMSA9IHsKKwkJNywgMTIsIDE3LCAyMiwKKwkJNSwgOSwgMTQsIDIwLAorCQk0LCAxMSwgMTYsIDIzLAorCQk2LCAxMCwgMTUsIDIxCisJfTsKKwljb25zdCB1aW50MzJfdCAqcGM7CisJY29uc3QgY2hhciAqcHA7CisJY29uc3QgY2hhciAqcHM7CisJaW50IGk7CisJdWludDMyX3QgdGVtcDsKKworCWlmIChCQl9CSUdfRU5ESUFOKQorCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJCXdvcmRzW2ldID0gU1dBUF9MRTMyKHdvcmRzW2ldKTsKKworIyBpZiBNRDVfU01BTEwgPT0gMworCXBjID0gQ19hcnJheTsKKwlwcCA9IFBfYXJyYXk7CisJcHMgPSBTX2FycmF5IC0gNDsKKworCWZvciAoaSA9IDA7IGkgPCA2NDsgaSsrKSB7CisJCWlmICgoaSAmIDB4MGYpID09IDApCisJCQlwcyArPSA0OworCQl0ZW1wID0gQTsKKwkJc3dpdGNoIChpID4+IDQpIHsKKwkJY2FzZSAwOgorCQkJdGVtcCArPSBGRihCLCBDLCBEKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQl0ZW1wICs9IEZHKEIsIEMsIEQpOworCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCXRlbXAgKz0gRkgoQiwgQywgRCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDogLyogY2FzZSAzICovCisJCQl0ZW1wICs9IEZJKEIsIEMsIEQpOworCQl9CisJCXRlbXAgKz0gd29yZHNbKGludCkgKCpwcCsrKV0gKyAqcGMrKzsKKwkJdGVtcCA9IHJvdGwzMih0ZW1wLCBwc1tpICYgM10pOworCQl0ZW1wICs9IEI7CisJCUEgPSBEOworCQlEID0gQzsKKwkJQyA9IEI7CisJCUIgPSB0ZW1wOworCX0KKyMgZWxzZSAgLyogTUQ1X1NNQUxMID09IDIgKi8KKwlwYyA9IENfYXJyYXk7CisJcHAgPSBQX2FycmF5OworCXBzID0gU19hcnJheTsKKworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCXRlbXAgPSBBICsgRkYoQiwgQywgRCkgKyB3b3Jkc1soaW50KSAoKnBwKyspXSArICpwYysrOworCQl0ZW1wID0gcm90bDMyKHRlbXAsIHBzW2kgJiAzXSk7CisJCXRlbXAgKz0gQjsKKwkJQSA9IEQ7CisJCUQgPSBDOworCQlDID0gQjsKKwkJQiA9IHRlbXA7CisJfQorCXBzICs9IDQ7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJdGVtcCA9IEEgKyBGRyhCLCBDLCBEKSArIHdvcmRzWyhpbnQpICgqcHArKyldICsgKnBjKys7CisJCXRlbXAgPSByb3RsMzIodGVtcCwgcHNbaSAmIDNdKTsKKwkJdGVtcCArPSBCOworCQlBID0gRDsKKwkJRCA9IEM7CisJCUMgPSBCOworCQlCID0gdGVtcDsKKwl9CisJcHMgKz0gNDsKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQl0ZW1wID0gQSArIEZIKEIsIEMsIEQpICsgd29yZHNbKGludCkgKCpwcCsrKV0gKyAqcGMrKzsKKwkJdGVtcCA9IHJvdGwzMih0ZW1wLCBwc1tpICYgM10pOworCQl0ZW1wICs9IEI7CisJCUEgPSBEOworCQlEID0gQzsKKwkJQyA9IEI7CisJCUIgPSB0ZW1wOworCX0KKwlwcyArPSA0OworCWZvciAoaSA9IDA7IGkgPCAxNjsgaSsrKSB7CisJCXRlbXAgPSBBICsgRkkoQiwgQywgRCkgKyB3b3Jkc1soaW50KSAoKnBwKyspXSArICpwYysrOworCQl0ZW1wID0gcm90bDMyKHRlbXAsIHBzW2kgJiAzXSk7CisJCXRlbXAgKz0gQjsKKwkJQSA9IEQ7CisJCUQgPSBDOworCQlDID0gQjsKKwkJQiA9IHRlbXA7CisJfQorIyBlbmRpZgorCS8qIEFkZCBjaGVja3N1bSB0byB0aGUgc3RhcnRpbmcgdmFsdWVzICovCisJY3R4LT5oYXNoWzBdICs9IEE7CisJY3R4LT5oYXNoWzFdICs9IEI7CisJY3R4LT5oYXNoWzJdICs9IEM7CisJY3R4LT5oYXNoWzNdICs9IEQ7CisKKyNlbHNlICAvKiBNRDVfU01BTEwgPT0gMCBvciAxICovCisKKyMgaWYgTUQ1X1NNQUxMID09IDEKKwljb25zdCB1aW50MzJfdCAqcGM7CisJY29uc3QgY2hhciAqcHA7CisJaW50IGk7CisjIGVuZGlmCisKKwkvKiBGaXJzdCByb3VuZDogdXNpbmcgdGhlIGdpdmVuIGZ1bmN0aW9uLCB0aGUgY29udGV4dCBhbmQgYSBjb25zdGFudAorCSAgIHRoZSBuZXh0IGNvbnRleHQgaXMgY29tcHV0ZWQuICBCZWNhdXNlIHRoZSBhbGdvcml0aG0ncyBwcm9jZXNzaW5nCisJICAgdW5pdCBpcyBhIDMyLWJpdCB3b3JkIGFuZCBpdCBpcyBkZXRlcm1pbmVkIHRvIHdvcmsgb24gd29yZHMgaW4KKwkgICBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIgd2UgcGVyaGFwcyBoYXZlIHRvIGNoYW5nZSB0aGUgYnl0ZSBvcmRlcgorCSAgIGJlZm9yZSB0aGUgY29tcHV0YXRpb24uICBUbyByZWR1Y2UgdGhlIHdvcmsgZm9yIHRoZSBuZXh0IHN0ZXBzCisJICAgd2Ugc2F2ZSBzd2FwcGVkIHdvcmRzIGluIFdPUkRTIGFycmF5LiAgKi8KKyMgdW5kZWYgT1AKKyMgZGVmaW5lIE9QKGEsIGIsIGMsIGQsIHMsIFQpIFwKKwlkbyB7IFwKKwkJYSArPSBGRihiLCBjLCBkKSArICgqd29yZHMgSUZfQklHX0VORElBTig9IFNXQVBfTEUzMigqd29yZHMpKSkgKyBUOyBcCisJCXdvcmRzKys7IFwKKwkJYSA9IHJvdGwzMihhLCBzKTsgXAorCQlhICs9IGI7IFwKKwl9IHdoaWxlICgwKQorCisJLyogUm91bmQgMSAqLworIyBpZiBNRDVfU01BTEwgPT0gMQorCXBjID0gQ19hcnJheTsKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCU9QKEEsIEIsIEMsIEQsIDcsICpwYysrKTsKKwkJT1AoRCwgQSwgQiwgQywgMTIsICpwYysrKTsKKwkJT1AoQywgRCwgQSwgQiwgMTcsICpwYysrKTsKKwkJT1AoQiwgQywgRCwgQSwgMjIsICpwYysrKTsKKwl9CisjIGVsc2UKKwlPUChBLCBCLCBDLCBELCA3LCAweGQ3NmFhNDc4KTsKKwlPUChELCBBLCBCLCBDLCAxMiwgMHhlOGM3Yjc1Nik7CisJT1AoQywgRCwgQSwgQiwgMTcsIDB4MjQyMDcwZGIpOworCU9QKEIsIEMsIEQsIEEsIDIyLCAweGMxYmRjZWVlKTsKKwlPUChBLCBCLCBDLCBELCA3LCAweGY1N2MwZmFmKTsKKwlPUChELCBBLCBCLCBDLCAxMiwgMHg0Nzg3YzYyYSk7CisJT1AoQywgRCwgQSwgQiwgMTcsIDB4YTgzMDQ2MTMpOworCU9QKEIsIEMsIEQsIEEsIDIyLCAweGZkNDY5NTAxKTsKKwlPUChBLCBCLCBDLCBELCA3LCAweDY5ODA5OGQ4KTsKKwlPUChELCBBLCBCLCBDLCAxMiwgMHg4YjQ0ZjdhZik7CisJT1AoQywgRCwgQSwgQiwgMTcsIDB4ZmZmZjViYjEpOworCU9QKEIsIEMsIEQsIEEsIDIyLCAweDg5NWNkN2JlKTsKKwlPUChBLCBCLCBDLCBELCA3LCAweDZiOTAxMTIyKTsKKwlPUChELCBBLCBCLCBDLCAxMiwgMHhmZDk4NzE5Myk7CisJT1AoQywgRCwgQSwgQiwgMTcsIDB4YTY3OTQzOGUpOworCU9QKEIsIEMsIEQsIEEsIDIyLCAweDQ5YjQwODIxKTsKKyMgZW5kaWYKKwl3b3JkcyAtPSAxNjsKKworCS8qIEZvciB0aGUgc2Vjb25kIHRvIGZvdXJ0aCByb3VuZCB3ZSBoYXZlIHRoZSBwb3NzaWJseSBzd2FwcGVkIHdvcmRzCisJICAgaW4gV09SRFMuICBSZWRlZmluZSB0aGUgbWFjcm8gdG8gdGFrZSBhbiBhZGRpdGlvbmFsIGZpcnN0CisJICAgYXJndW1lbnQgc3BlY2lmeWluZyB0aGUgZnVuY3Rpb24gdG8gdXNlLiAgKi8KKyMgdW5kZWYgT1AKKyMgZGVmaW5lIE9QKGYsIGEsIGIsIGMsIGQsIGssIHMsIFQpIFwKKwlkbyB7IFwKKwkJYSArPSBmKGIsIGMsIGQpICsgd29yZHNba10gKyBUOyBcCisJCWEgPSByb3RsMzIoYSwgcyk7IFwKKwkJYSArPSBiOyBcCisJfSB3aGlsZSAoMCkKKworCS8qIFJvdW5kIDIgKi8KKyMgaWYgTUQ1X1NNQUxMID09IDEKKwlwcCA9IFBfYXJyYXk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlPUChGRywgQSwgQiwgQywgRCwgKGludCkgKCpwcCsrKSwgNSwgKnBjKyspOworCQlPUChGRywgRCwgQSwgQiwgQywgKGludCkgKCpwcCsrKSwgOSwgKnBjKyspOworCQlPUChGRywgQywgRCwgQSwgQiwgKGludCkgKCpwcCsrKSwgMTQsICpwYysrKTsKKwkJT1AoRkcsIEIsIEMsIEQsIEEsIChpbnQpICgqcHArKyksIDIwLCAqcGMrKyk7CisJfQorIyBlbHNlCisJT1AoRkcsIEEsIEIsIEMsIEQsIDEsIDUsIDB4ZjYxZTI1NjIpOworCU9QKEZHLCBELCBBLCBCLCBDLCA2LCA5LCAweGMwNDBiMzQwKTsKKwlPUChGRywgQywgRCwgQSwgQiwgMTEsIDE0LCAweDI2NWU1YTUxKTsKKwlPUChGRywgQiwgQywgRCwgQSwgMCwgMjAsIDB4ZTliNmM3YWEpOworCU9QKEZHLCBBLCBCLCBDLCBELCA1LCA1LCAweGQ2MmYxMDVkKTsKKwlPUChGRywgRCwgQSwgQiwgQywgMTAsIDksIDB4MDI0NDE0NTMpOworCU9QKEZHLCBDLCBELCBBLCBCLCAxNSwgMTQsIDB4ZDhhMWU2ODEpOworCU9QKEZHLCBCLCBDLCBELCBBLCA0LCAyMCwgMHhlN2QzZmJjOCk7CisJT1AoRkcsIEEsIEIsIEMsIEQsIDksIDUsIDB4MjFlMWNkZTYpOworCU9QKEZHLCBELCBBLCBCLCBDLCAxNCwgOSwgMHhjMzM3MDdkNik7CisJT1AoRkcsIEMsIEQsIEEsIEIsIDMsIDE0LCAweGY0ZDUwZDg3KTsKKwlPUChGRywgQiwgQywgRCwgQSwgOCwgMjAsIDB4NDU1YTE0ZWQpOworCU9QKEZHLCBBLCBCLCBDLCBELCAxMywgNSwgMHhhOWUzZTkwNSk7CisJT1AoRkcsIEQsIEEsIEIsIEMsIDIsIDksIDB4ZmNlZmEzZjgpOworCU9QKEZHLCBDLCBELCBBLCBCLCA3LCAxNCwgMHg2NzZmMDJkOSk7CisJT1AoRkcsIEIsIEMsIEQsIEEsIDEyLCAyMCwgMHg4ZDJhNGM4YSk7CisjIGVuZGlmCisKKwkvKiBSb3VuZCAzICovCisjIGlmIE1ENV9TTUFMTCA9PSAxCisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlPUChGSCwgQSwgQiwgQywgRCwgKGludCkgKCpwcCsrKSwgNCwgKnBjKyspOworCQlPUChGSCwgRCwgQSwgQiwgQywgKGludCkgKCpwcCsrKSwgMTEsICpwYysrKTsKKwkJT1AoRkgsIEMsIEQsIEEsIEIsIChpbnQpICgqcHArKyksIDE2LCAqcGMrKyk7CisJCU9QKEZILCBCLCBDLCBELCBBLCAoaW50KSAoKnBwKyspLCAyMywgKnBjKyspOworCX0KKyMgZWxzZQorCU9QKEZILCBBLCBCLCBDLCBELCA1LCA0LCAweGZmZmEzOTQyKTsKKwlPUChGSCwgRCwgQSwgQiwgQywgOCwgMTEsIDB4ODc3MWY2ODEpOworCU9QKEZILCBDLCBELCBBLCBCLCAxMSwgMTYsIDB4NmQ5ZDYxMjIpOworCU9QKEZILCBCLCBDLCBELCBBLCAxNCwgMjMsIDB4ZmRlNTM4MGMpOworCU9QKEZILCBBLCBCLCBDLCBELCAxLCA0LCAweGE0YmVlYTQ0KTsKKwlPUChGSCwgRCwgQSwgQiwgQywgNCwgMTEsIDB4NGJkZWNmYTkpOworCU9QKEZILCBDLCBELCBBLCBCLCA3LCAxNiwgMHhmNmJiNGI2MCk7CisJT1AoRkgsIEIsIEMsIEQsIEEsIDEwLCAyMywgMHhiZWJmYmM3MCk7CisJT1AoRkgsIEEsIEIsIEMsIEQsIDEzLCA0LCAweDI4OWI3ZWM2KTsKKwlPUChGSCwgRCwgQSwgQiwgQywgMCwgMTEsIDB4ZWFhMTI3ZmEpOworCU9QKEZILCBDLCBELCBBLCBCLCAzLCAxNiwgMHhkNGVmMzA4NSk7CisJT1AoRkgsIEIsIEMsIEQsIEEsIDYsIDIzLCAweDA0ODgxZDA1KTsKKwlPUChGSCwgQSwgQiwgQywgRCwgOSwgNCwgMHhkOWQ0ZDAzOSk7CisJT1AoRkgsIEQsIEEsIEIsIEMsIDEyLCAxMSwgMHhlNmRiOTllNSk7CisJT1AoRkgsIEMsIEQsIEEsIEIsIDE1LCAxNiwgMHgxZmEyN2NmOCk7CisJT1AoRkgsIEIsIEMsIEQsIEEsIDIsIDIzLCAweGM0YWM1NjY1KTsKKyMgZW5kaWYKKworCS8qIFJvdW5kIDQgKi8KKyMgaWYgTUQ1X1NNQUxMID09IDEKKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCU9QKEZJLCBBLCBCLCBDLCBELCAoaW50KSAoKnBwKyspLCA2LCAqcGMrKyk7CisJCU9QKEZJLCBELCBBLCBCLCBDLCAoaW50KSAoKnBwKyspLCAxMCwgKnBjKyspOworCQlPUChGSSwgQywgRCwgQSwgQiwgKGludCkgKCpwcCsrKSwgMTUsICpwYysrKTsKKwkJT1AoRkksIEIsIEMsIEQsIEEsIChpbnQpICgqcHArKyksIDIxLCAqcGMrKyk7CisJfQorIyBlbHNlCisJT1AoRkksIEEsIEIsIEMsIEQsIDAsIDYsIDB4ZjQyOTIyNDQpOworCU9QKEZJLCBELCBBLCBCLCBDLCA3LCAxMCwgMHg0MzJhZmY5Nyk7CisJT1AoRkksIEMsIEQsIEEsIEIsIDE0LCAxNSwgMHhhYjk0MjNhNyk7CisJT1AoRkksIEIsIEMsIEQsIEEsIDUsIDIxLCAweGZjOTNhMDM5KTsKKwlPUChGSSwgQSwgQiwgQywgRCwgMTIsIDYsIDB4NjU1YjU5YzMpOworCU9QKEZJLCBELCBBLCBCLCBDLCAzLCAxMCwgMHg4ZjBjY2M5Mik7CisJT1AoRkksIEMsIEQsIEEsIEIsIDEwLCAxNSwgMHhmZmVmZjQ3ZCk7CisJT1AoRkksIEIsIEMsIEQsIEEsIDEsIDIxLCAweDg1ODQ1ZGQxKTsKKwlPUChGSSwgQSwgQiwgQywgRCwgOCwgNiwgMHg2ZmE4N2U0Zik7CisJT1AoRkksIEQsIEEsIEIsIEMsIDE1LCAxMCwgMHhmZTJjZTZlMCk7CisJT1AoRkksIEMsIEQsIEEsIEIsIDYsIDE1LCAweGEzMDE0MzE0KTsKKwlPUChGSSwgQiwgQywgRCwgQSwgMTMsIDIxLCAweDRlMDgxMWExKTsKKwlPUChGSSwgQSwgQiwgQywgRCwgNCwgNiwgMHhmNzUzN2U4Mik7CisJT1AoRkksIEQsIEEsIEIsIEMsIDExLCAxMCwgMHhiZDNhZjIzNSk7CisJT1AoRkksIEMsIEQsIEEsIEIsIDIsIDE1LCAweDJhZDdkMmJiKTsKKwlPUChGSSwgQiwgQywgRCwgQSwgOSwgMjEsIDB4ZWI4NmQzOTEpOworIyB1bmRlZiBPUAorIyBlbmRpZgorCS8qIEFkZCBjaGVja3N1bSB0byB0aGUgc3RhcnRpbmcgdmFsdWVzICovCisJY3R4LT5oYXNoWzBdICs9IEE7CisJY3R4LT5oYXNoWzFdICs9IEI7CisJY3R4LT5oYXNoWzJdICs9IEM7CisJY3R4LT5oYXNoWzNdICs9IEQ7CisjZW5kaWYKK30KKyN1bmRlZiBGRgorI3VuZGVmIEZHCisjdW5kZWYgRkgKKyN1bmRlZiBGSQorCisvKiBJbml0aWFsaXplIHN0cnVjdHVyZSBjb250YWluaW5nIHN0YXRlIG9mIGNvbXB1dGF0aW9uLgorICogKFJGQyAxMzIxLCAzLjM6IFN0ZXAgMykKKyAqLwordm9pZCBGQVNUX0ZVTkMgbWQ1X2JlZ2luKG1kNV9jdHhfdCAqY3R4KQoreworCWN0eC0+aGFzaFswXSA9IDB4Njc0NTIzMDE7CisJY3R4LT5oYXNoWzFdID0gMHhlZmNkYWI4OTsKKwljdHgtPmhhc2hbMl0gPSAweDk4YmFkY2ZlOworCWN0eC0+aGFzaFszXSA9IDB4MTAzMjU0NzY7CisJY3R4LT50b3RhbDY0ID0gMDsKKwljdHgtPnByb2Nlc3NfYmxvY2sgPSBtZDVfcHJvY2Vzc19ibG9jazY0OworfQorCisvKiBVc2VkIGFsc28gZm9yIHNoYTEgYW5kIHNoYTI1NiAqLwordm9pZCBGQVNUX0ZVTkMgbWQ1X2hhc2gobWQ1X2N0eF90ICpjdHgsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbikKK3sKKwljb21tb242NF9oYXNoKGN0eCwgYnVmZmVyLCBsZW4pOworfQorCisvKiBQcm9jZXNzIHRoZSByZW1haW5pbmcgYnl0ZXMgaW4gdGhlIGJ1ZmZlciBhbmQgcHV0IHJlc3VsdCBmcm9tIENUWAorICogaW4gZmlyc3QgMTYgYnl0ZXMgZm9sbG93aW5nIFJFU0JVRi4gIFRoZSByZXN1bHQgaXMgYWx3YXlzIGluIGxpdHRsZQorICogZW5kaWFuIGJ5dGUgb3JkZXIsIHNvIHRoYXQgYSBieXRlLXdpc2Ugb3V0cHV0IHlpZWxkcyB0byB0aGUgd2FudGVkCisgKiBBU0NJSSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZSBkaWdlc3QuCisgKi8KK3ZvaWQgRkFTVF9GVU5DIG1kNV9lbmQobWQ1X2N0eF90ICpjdHgsIHZvaWQgKnJlc2J1ZikKK3sKKwkvKiBNRDUgc3RvcmVzIHRvdGFsIGluIExFLCBuZWVkIHRvIHN3YXAgb24gQkUgYXJjaGVzOiAqLworCWNvbW1vbjY0X2VuZChjdHgsIC8qc3dhcF9uZWVkZWQ6Ki8gQkJfQklHX0VORElBTik7CisKKwkvKiBUaGUgTUQ1IHJlc3VsdCBpcyBpbiBsaXR0bGUgZW5kaWFuIGJ5dGUgb3JkZXIgKi8KKwlpZiAoQkJfQklHX0VORElBTikgeworCQljdHgtPmhhc2hbMF0gPSBTV0FQX0xFMzIoY3R4LT5oYXNoWzBdKTsKKwkJY3R4LT5oYXNoWzFdID0gU1dBUF9MRTMyKGN0eC0+aGFzaFsxXSk7CisJCWN0eC0+aGFzaFsyXSA9IFNXQVBfTEUzMihjdHgtPmhhc2hbMl0pOworCQljdHgtPmhhc2hbM10gPSBTV0FQX0xFMzIoY3R4LT5oYXNoWzNdKTsKKwl9CisKKwltZW1jcHkocmVzYnVmLCBjdHgtPmhhc2gsIHNpemVvZihjdHgtPmhhc2hbMF0pICogNCk7Cit9CisKKworLyoKKyAqIFNIQTEgcGFydCBpczoKKyAqIENvcHlyaWdodCAyMDA3IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogQmFzZWQgb24gdGhlIHB1YmxpYyBkb21haW4gU0hBLTEgaW4gQyBieSBTdGV2ZSBSZWlkIDxzdGV2ZUBlZG13ZWIuY29tPgorICogZnJvbSBodHRwOi8vd3d3Lm1pcnJvcnMud2lyZXRhcHBlZC5uZXQvc2VjdXJpdHkvY3J5cHRvZ3JhcGh5L2hhc2hlcy9zaGExLworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogU0hBMjU2IGFuZCBTSEE1MTIgcGFydHMgYXJlOgorICogUmVsZWFzZWQgaW50byB0aGUgUHVibGljIERvbWFpbiBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckByZWRoYXQuY29tPi4KKyAqIFNocmFuayBieSBEZW55cyBWbGFzZW5rby4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBUaGUgYmVzdCB3YXkgdG8gdGVzdCByYW5kb20gYmxvY2tzaXplcyBpcyB0byBnbyB0byBjb3JldXRpbHMvbWQ1X3NoYTFfc3VtLmMKKyAqIGFuZCByZXBsYWNlICI0MDk2IiB3aXRoIHNvbWV0aGluZyBsaWtlICIyMDAwICsgdGltZShOVUxMKSAlIDIwOTciLAorICogdGhlbiByZWJ1aWxkIGFuZCBjb21wYXJlICJzaGFOTk5zdW0gYmlnZmlsZSIgcmVzdWx0cy4KKyAqLworCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgc2hhMV9wcm9jZXNzX2Jsb2NrNjQoc2hhMV9jdHhfdCAqY3R4KQoreworCXN0YXRpYyBjb25zdCB1aW50MzJfdCByY29uc3RzW10gPSB7CisJCTB4NUE4Mjc5OTksIDB4NkVEOUVCQTEsIDB4OEYxQkJDREMsIDB4Q0E2MkMxRDYKKwl9OworCWludCBpLCBqOworCWludCBjbnQ7CisJdWludDMyX3QgV1sxNisxNl07CisJdWludDMyX3QgYSwgYiwgYywgZCwgZTsKKworCS8qIE9uLXN0YWNrIHdvcmsgYnVmZmVyIGZyZWVzIHVwIG9uZSByZWdpc3RlciBpbiB0aGUgbWFpbiBsb29wCisJICogd2hpY2ggb3RoZXJ3aXNlIHdpbGwgYmUgbmVlZGVkIHRvIGhvbGQgY3R4IHBvaW50ZXIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJV1tpXSA9IFdbaSsxNl0gPSBTV0FQX0JFMzIoKCh1aW50MzJfdCopY3R4LT53YnVmZmVyKVtpXSk7CisKKwlhID0gY3R4LT5oYXNoWzBdOworCWIgPSBjdHgtPmhhc2hbMV07CisJYyA9IGN0eC0+aGFzaFsyXTsKKwlkID0gY3R4LT5oYXNoWzNdOworCWUgPSBjdHgtPmhhc2hbNF07CisKKwkvKiA0IHJvdW5kcyBvZiAyMCBvcGVyYXRpb25zIGVhY2ggKi8KKwljbnQgPSAwOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJaiA9IDE5OworCQlkbyB7CisJCQl1aW50MzJfdCB3b3JrOworCisJCQl3b3JrID0gYyBeIGQ7CisJCQlpZiAoaSA9PSAwKSB7CisJCQkJd29yayA9ICh3b3JrICYgYikgXiBkOworCQkJCWlmIChqIDw9IDMpCisJCQkJCWdvdG8gZ2UxNjsKKwkJCQkvKiBVc2VkIHRvIGRvIFNXQVBfQkUzMiBoZXJlLCBidXQgdGhpcworCQkJCSAqIHJlcXVpcmVzIGN0eCAoc2VlIGNvbW1lbnQgYWJvdmUpICovCisJCQkJd29yayArPSBXW2NudF07CisJCQl9IGVsc2UgeworCQkJCWlmIChpID09IDIpCisJCQkJCXdvcmsgPSAoKGIgfCBjKSAmIGQpIHwgKGIgJiBjKTsKKwkJCQllbHNlIC8qIGkgPSAxIG9yIDMgKi8KKwkJCQkJd29yayBePSBiOworIGdlMTY6CisJCQkJV1tjbnRdID0gV1tjbnQrMTZdID0gcm90bDMyKFdbY250KzEzXSBeIFdbY250KzhdIF4gV1tjbnQrMl0gXiBXW2NudF0sIDEpOworCQkJCXdvcmsgKz0gV1tjbnRdOworCQkJfQorCQkJd29yayArPSBlICsgcm90bDMyKGEsIDUpICsgcmNvbnN0c1tpXTsKKworCQkJLyogUm90YXRlIGJ5IG9uZSBmb3IgbmV4dCB0aW1lICovCisJCQllID0gZDsKKwkJCWQgPSBjOworCQkJYyA9IC8qIGIgPSAqLyByb3RsMzIoYiwgMzApOworCQkJYiA9IGE7CisJCQlhID0gd29yazsKKwkJCWNudCA9IChjbnQgKyAxKSAmIDE1OworCQl9IHdoaWxlICgtLWogPj0gMCk7CisJfQorCisJY3R4LT5oYXNoWzBdICs9IGE7CisJY3R4LT5oYXNoWzFdICs9IGI7CisJY3R4LT5oYXNoWzJdICs9IGM7CisJY3R4LT5oYXNoWzNdICs9IGQ7CisJY3R4LT5oYXNoWzRdICs9IGU7Cit9CisKKy8qIENvbnN0YW50cyBmb3IgU0hBNTEyIGZyb20gRklQUyAxODAtMjo0LjIuMy4KKyAqIFNIQTI1NiBjb25zdGFudHMgZnJvbSBGSVBTIDE4MC0yOjQuMi4yCisgKiBhcmUgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgaGFsZiBvZiBmaXJzdCA2NCBlbGVtZW50cworICogb2YgdGhlIHNhbWUgYXJyYXkuCisgKi8KK3N0YXRpYyBjb25zdCB1aW50NjRfdCBzaGFfS1s4MF0gPSB7CisJMHg0MjhhMmY5OGQ3MjhhZTIyVUxMLCAweDcxMzc0NDkxMjNlZjY1Y2RVTEwsCisJMHhiNWMwZmJjZmVjNGQzYjJmVUxMLCAweGU5YjVkYmE1ODE4OWRiYmNVTEwsCisJMHgzOTU2YzI1YmYzNDhiNTM4VUxMLCAweDU5ZjExMWYxYjYwNWQwMTlVTEwsCisJMHg5MjNmODJhNGFmMTk0ZjliVUxMLCAweGFiMWM1ZWQ1ZGE2ZDgxMThVTEwsCisJMHhkODA3YWE5OGEzMDMwMjQyVUxMLCAweDEyODM1YjAxNDU3MDZmYmVVTEwsCisJMHgyNDMxODViZTRlZTRiMjhjVUxMLCAweDU1MGM3ZGMzZDVmZmI0ZTJVTEwsCisJMHg3MmJlNWQ3NGYyN2I4OTZmVUxMLCAweDgwZGViMWZlM2IxNjk2YjFVTEwsCisJMHg5YmRjMDZhNzI1YzcxMjM1VUxMLCAweGMxOWJmMTc0Y2Y2OTI2OTRVTEwsCisJMHhlNDliNjljMTllZjE0YWQyVUxMLCAweGVmYmU0Nzg2Mzg0ZjI1ZTNVTEwsCisJMHgwZmMxOWRjNjhiOGNkNWI1VUxMLCAweDI0MGNhMWNjNzdhYzljNjVVTEwsCisJMHgyZGU5MmM2ZjU5MmIwMjc1VUxMLCAweDRhNzQ4NGFhNmVhNmU0ODNVTEwsCisJMHg1Y2IwYTlkY2JkNDFmYmQ0VUxMLCAweDc2Zjk4OGRhODMxMTUzYjVVTEwsCisJMHg5ODNlNTE1MmVlNjZkZmFiVUxMLCAweGE4MzFjNjZkMmRiNDMyMTBVTEwsCisJMHhiMDAzMjdjODk4ZmIyMTNmVUxMLCAweGJmNTk3ZmM3YmVlZjBlZTRVTEwsCisJMHhjNmUwMGJmMzNkYTg4ZmMyVUxMLCAweGQ1YTc5MTQ3OTMwYWE3MjVVTEwsCisJMHgwNmNhNjM1MWUwMDM4MjZmVUxMLCAweDE0MjkyOTY3MGEwZTZlNzBVTEwsCisJMHgyN2I3MGE4NTQ2ZDIyZmZjVUxMLCAweDJlMWIyMTM4NWMyNmM5MjZVTEwsCisJMHg0ZDJjNmRmYzVhYzQyYWVkVUxMLCAweDUzMzgwZDEzOWQ5NWIzZGZVTEwsCisJMHg2NTBhNzM1NDhiYWY2M2RlVUxMLCAweDc2NmEwYWJiM2M3N2IyYThVTEwsCisJMHg4MWMyYzkyZTQ3ZWRhZWU2VUxMLCAweDkyNzIyYzg1MTQ4MjM1M2JVTEwsCisJMHhhMmJmZThhMTRjZjEwMzY0VUxMLCAweGE4MWE2NjRiYmM0MjMwMDFVTEwsCisJMHhjMjRiOGI3MGQwZjg5NzkxVUxMLCAweGM3NmM1MWEzMDY1NGJlMzBVTEwsCisJMHhkMTkyZTgxOWQ2ZWY1MjE4VUxMLCAweGQ2OTkwNjI0NTU2NWE5MTBVTEwsCisJMHhmNDBlMzU4NTU3NzEyMDJhVUxMLCAweDEwNmFhMDcwMzJiYmQxYjhVTEwsCisJMHgxOWE0YzExNmI4ZDJkMGM4VUxMLCAweDFlMzc2YzA4NTE0MWFiNTNVTEwsCisJMHgyNzQ4Nzc0Y2RmOGVlYjk5VUxMLCAweDM0YjBiY2I1ZTE5YjQ4YThVTEwsCisJMHgzOTFjMGNiM2M1Yzk1YTYzVUxMLCAweDRlZDhhYTRhZTM0MThhY2JVTEwsCisJMHg1YjljY2E0Zjc3NjNlMzczVUxMLCAweDY4MmU2ZmYzZDZiMmI4YTNVTEwsCisJMHg3NDhmODJlZTVkZWZiMmZjVUxMLCAweDc4YTU2MzZmNDMxNzJmNjBVTEwsCisJMHg4NGM4NzgxNGExZjBhYjcyVUxMLCAweDhjYzcwMjA4MWE2NDM5ZWNVTEwsCisJMHg5MGJlZmZmYTIzNjMxZTI4VUxMLCAweGE0NTA2Y2ViZGU4MmJkZTlVTEwsCisJMHhiZWY5YTNmN2IyYzY3OTE1VUxMLCAweGM2NzE3OGYyZTM3MjUzMmJVTEwsCisJMHhjYTI3M2VjZWVhMjY2MTljVUxMLCAweGQxODZiOGM3MjFjMGMyMDdVTEwsIC8qIFs2NF0rIGFyZSB1c2VkIGZvciBzaGE1MTIgb25seSAqLworCTB4ZWFkYTdkZDZjZGUwZWIxZVVMTCwgMHhmNTdkNGY3ZmVlNmVkMTc4VUxMLAorCTB4MDZmMDY3YWE3MjE3NmZiYVVMTCwgMHgwYTYzN2RjNWEyYzg5OGE2VUxMLAorCTB4MTEzZjk4MDRiZWY5MGRhZVVMTCwgMHgxYjcxMGIzNTEzMWM0NzFiVUxMLAorCTB4MjhkYjc3ZjUyMzA0N2Q4NFVMTCwgMHgzMmNhYWI3YjQwYzcyNDkzVUxMLAorCTB4M2M5ZWJlMGExNWM5YmViY1VMTCwgMHg0MzFkNjdjNDljMTAwZDRjVUxMLAorCTB4NGNjNWQ0YmVjYjNlNDJiNlVMTCwgMHg1OTdmMjk5Y2ZjNjU3ZTJhVUxMLAorCTB4NWZjYjZmYWIzYWQ2ZmFlY1VMTCwgMHg2YzQ0MTk4YzRhNDc1ODE3VUxMCit9OworCisjdW5kZWYgQ2gKKyN1bmRlZiBNYWoKKyN1bmRlZiBTMAorI3VuZGVmIFMxCisjdW5kZWYgUjAKKyN1bmRlZiBSMQorCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgc2hhMjU2X3Byb2Nlc3NfYmxvY2s2NChzaGEyNTZfY3R4X3QgKmN0eCkKK3sKKwl1bnNpZ25lZCB0OworCXVpbnQzMl90IFdbNjRdLCBhLCBiLCBjLCBkLCBlLCBmLCBnLCBoOworCWNvbnN0IHVpbnQzMl90ICp3b3JkcyA9ICh1aW50MzJfdCopIGN0eC0+d2J1ZmZlcjsKKworCS8qIE9wZXJhdG9ycyBkZWZpbmVkIGluIEZJUFMgMTgwLTI6NC4xLjIuICAqLworI2RlZmluZSBDaCh4LCB5LCB6KSAoKHggJiB5KSBeICh+eCAmIHopKQorI2RlZmluZSBNYWooeCwgeSwgeikgKCh4ICYgeSkgXiAoeCAmIHopIF4gKHkgJiB6KSkKKyNkZWZpbmUgUzAoeCkgKHJvdHIzMih4LCAyKSBeIHJvdHIzMih4LCAxMykgXiByb3RyMzIoeCwgMjIpKQorI2RlZmluZSBTMSh4KSAocm90cjMyKHgsIDYpIF4gcm90cjMyKHgsIDExKSBeIHJvdHIzMih4LCAyNSkpCisjZGVmaW5lIFIwKHgpIChyb3RyMzIoeCwgNykgXiByb3RyMzIoeCwgMTgpIF4gKHggPj4gMykpCisjZGVmaW5lIFIxKHgpIChyb3RyMzIoeCwgMTcpIF4gcm90cjMyKHgsIDE5KSBeICh4ID4+IDEwKSkKKworCS8qIENvbXB1dGUgdGhlIG1lc3NhZ2Ugc2NoZWR1bGUgYWNjb3JkaW5nIHRvIEZJUFMgMTgwLTI6Ni4yLjIgc3RlcCAyLiAgKi8KKwlmb3IgKHQgPSAwOyB0IDwgMTY7ICsrdCkKKwkJV1t0XSA9IFNXQVBfQkUzMih3b3Jkc1t0XSk7CisJZm9yICgvKnQgPSAxNiovOyB0IDwgNjQ7ICsrdCkKKwkJV1t0XSA9IFIxKFdbdCAtIDJdKSArIFdbdCAtIDddICsgUjAoV1t0IC0gMTVdKSArIFdbdCAtIDE2XTsKKworCWEgPSBjdHgtPmhhc2hbMF07CisJYiA9IGN0eC0+aGFzaFsxXTsKKwljID0gY3R4LT5oYXNoWzJdOworCWQgPSBjdHgtPmhhc2hbM107CisJZSA9IGN0eC0+aGFzaFs0XTsKKwlmID0gY3R4LT5oYXNoWzVdOworCWcgPSBjdHgtPmhhc2hbNl07CisJaCA9IGN0eC0+aGFzaFs3XTsKKworCS8qIFRoZSBhY3R1YWwgY29tcHV0YXRpb24gYWNjb3JkaW5nIHRvIEZJUFMgMTgwLTI6Ni4yLjIgc3RlcCAzLiAgKi8KKwlmb3IgKHQgPSAwOyB0IDwgNjQ7ICsrdCkgeworCQkvKiBOZWVkIHRvIGZldGNoIHVwcGVyIGhhbGYgb2Ygc2hhX0tbdF0KKwkJICogKEkgaG9wZSBjb21waWxlciBpcyBjbGV2ZXIgZW5vdWdoIHRvIGp1c3QgZmV0Y2gKKwkJICogdXBwZXIgaGFsZikKKwkJICovCisJCXVpbnQzMl90IEtfdCA9IHNoYV9LW3RdID4+IDMyOworCQl1aW50MzJfdCBUMSA9IGggKyBTMShlKSArIENoKGUsIGYsIGcpICsgS190ICsgV1t0XTsKKwkJdWludDMyX3QgVDIgPSBTMChhKSArIE1haihhLCBiLCBjKTsKKwkJaCA9IGc7CisJCWcgPSBmOworCQlmID0gZTsKKwkJZSA9IGQgKyBUMTsKKwkJZCA9IGM7CisJCWMgPSBiOworCQliID0gYTsKKwkJYSA9IFQxICsgVDI7CisJfQorI3VuZGVmIENoCisjdW5kZWYgTWFqCisjdW5kZWYgUzAKKyN1bmRlZiBTMQorI3VuZGVmIFIwCisjdW5kZWYgUjEKKwkvKiBBZGQgdGhlIHN0YXJ0aW5nIHZhbHVlcyBvZiB0aGUgY29udGV4dCBhY2NvcmRpbmcgdG8gRklQUyAxODAtMjo2LjIuMgorCSAgIHN0ZXAgNC4gICovCisJY3R4LT5oYXNoWzBdICs9IGE7CisJY3R4LT5oYXNoWzFdICs9IGI7CisJY3R4LT5oYXNoWzJdICs9IGM7CisJY3R4LT5oYXNoWzNdICs9IGQ7CisJY3R4LT5oYXNoWzRdICs9IGU7CisJY3R4LT5oYXNoWzVdICs9IGY7CisJY3R4LT5oYXNoWzZdICs9IGc7CisJY3R4LT5oYXNoWzddICs9IGg7Cit9CisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBzaGE1MTJfcHJvY2Vzc19ibG9jazEyOChzaGE1MTJfY3R4X3QgKmN0eCkKK3sKKwl1bnNpZ25lZCB0OworCXVpbnQ2NF90IFdbODBdOworCS8qIE9uIGkzODYsIGhhdmluZyBhc3NpZ25tZW50cyBoZXJlIChub3QgbGF0ZXIgYXMgc2hhMjU2IGRvZXMpCisJICogcHJvZHVjZXMgOTkgYnl0ZXMgc21hbGxlciBjb2RlIHdpdGggZ2NjIDQuMy4xCisJICovCisJdWludDY0X3QgYSA9IGN0eC0+aGFzaFswXTsKKwl1aW50NjRfdCBiID0gY3R4LT5oYXNoWzFdOworCXVpbnQ2NF90IGMgPSBjdHgtPmhhc2hbMl07CisJdWludDY0X3QgZCA9IGN0eC0+aGFzaFszXTsKKwl1aW50NjRfdCBlID0gY3R4LT5oYXNoWzRdOworCXVpbnQ2NF90IGYgPSBjdHgtPmhhc2hbNV07CisJdWludDY0X3QgZyA9IGN0eC0+aGFzaFs2XTsKKwl1aW50NjRfdCBoID0gY3R4LT5oYXNoWzddOworCWNvbnN0IHVpbnQ2NF90ICp3b3JkcyA9ICh1aW50NjRfdCopIGN0eC0+d2J1ZmZlcjsKKworCS8qIE9wZXJhdG9ycyBkZWZpbmVkIGluIEZJUFMgMTgwLTI6NC4xLjIuICAqLworI2RlZmluZSBDaCh4LCB5LCB6KSAoKHggJiB5KSBeICh+eCAmIHopKQorI2RlZmluZSBNYWooeCwgeSwgeikgKCh4ICYgeSkgXiAoeCAmIHopIF4gKHkgJiB6KSkKKyNkZWZpbmUgUzAoeCkgKHJvdHI2NCh4LCAyOCkgXiByb3RyNjQoeCwgMzQpIF4gcm90cjY0KHgsIDM5KSkKKyNkZWZpbmUgUzEoeCkgKHJvdHI2NCh4LCAxNCkgXiByb3RyNjQoeCwgMTgpIF4gcm90cjY0KHgsIDQxKSkKKyNkZWZpbmUgUjAoeCkgKHJvdHI2NCh4LCAxKSBeIHJvdHI2NCh4LCA4KSBeICh4ID4+IDcpKQorI2RlZmluZSBSMSh4KSAocm90cjY0KHgsIDE5KSBeIHJvdHI2NCh4LCA2MSkgXiAoeCA+PiA2KSkKKworCS8qIENvbXB1dGUgdGhlIG1lc3NhZ2Ugc2NoZWR1bGUgYWNjb3JkaW5nIHRvIEZJUFMgMTgwLTI6Ni4zLjIgc3RlcCAyLiAgKi8KKwlmb3IgKHQgPSAwOyB0IDwgMTY7ICsrdCkKKwkJV1t0XSA9IFNXQVBfQkU2NCh3b3Jkc1t0XSk7CisJZm9yICgvKnQgPSAxNiovOyB0IDwgODA7ICsrdCkKKwkJV1t0XSA9IFIxKFdbdCAtIDJdKSArIFdbdCAtIDddICsgUjAoV1t0IC0gMTVdKSArIFdbdCAtIDE2XTsKKworCS8qIFRoZSBhY3R1YWwgY29tcHV0YXRpb24gYWNjb3JkaW5nIHRvIEZJUFMgMTgwLTI6Ni4zLjIgc3RlcCAzLiAgKi8KKwlmb3IgKHQgPSAwOyB0IDwgODA7ICsrdCkgeworCQl1aW50NjRfdCBUMSA9IGggKyBTMShlKSArIENoKGUsIGYsIGcpICsgc2hhX0tbdF0gKyBXW3RdOworCQl1aW50NjRfdCBUMiA9IFMwKGEpICsgTWFqKGEsIGIsIGMpOworCQloID0gZzsKKwkJZyA9IGY7CisJCWYgPSBlOworCQllID0gZCArIFQxOworCQlkID0gYzsKKwkJYyA9IGI7CisJCWIgPSBhOworCQlhID0gVDEgKyBUMjsKKwl9CisjdW5kZWYgQ2gKKyN1bmRlZiBNYWoKKyN1bmRlZiBTMAorI3VuZGVmIFMxCisjdW5kZWYgUjAKKyN1bmRlZiBSMQorCS8qIEFkZCB0aGUgc3RhcnRpbmcgdmFsdWVzIG9mIHRoZSBjb250ZXh0IGFjY29yZGluZyB0byBGSVBTIDE4MC0yOjYuMy4yCisJICAgc3RlcCA0LiAgKi8KKwljdHgtPmhhc2hbMF0gKz0gYTsKKwljdHgtPmhhc2hbMV0gKz0gYjsKKwljdHgtPmhhc2hbMl0gKz0gYzsKKwljdHgtPmhhc2hbM10gKz0gZDsKKwljdHgtPmhhc2hbNF0gKz0gZTsKKwljdHgtPmhhc2hbNV0gKz0gZjsKKwljdHgtPmhhc2hbNl0gKz0gZzsKKwljdHgtPmhhc2hbN10gKz0gaDsKK30KKworCit2b2lkIEZBU1RfRlVOQyBzaGExX2JlZ2luKHNoYTFfY3R4X3QgKmN0eCkKK3sKKwljdHgtPmhhc2hbMF0gPSAweDY3NDUyMzAxOworCWN0eC0+aGFzaFsxXSA9IDB4ZWZjZGFiODk7CisJY3R4LT5oYXNoWzJdID0gMHg5OGJhZGNmZTsKKwljdHgtPmhhc2hbM10gPSAweDEwMzI1NDc2OworCWN0eC0+aGFzaFs0XSA9IDB4YzNkMmUxZjA7CisJY3R4LT50b3RhbDY0ID0gMDsKKwljdHgtPnByb2Nlc3NfYmxvY2sgPSBzaGExX3Byb2Nlc3NfYmxvY2s2NDsKK30KKworc3RhdGljIGNvbnN0IHVpbnQzMl90IGluaXQyNTZbXSA9IHsKKwkwLAorCTAsCisJMHg2YTA5ZTY2NywKKwkweGJiNjdhZTg1LAorCTB4M2M2ZWYzNzIsCisJMHhhNTRmZjUzYSwKKwkweDUxMGU1MjdmLAorCTB4OWIwNTY4OGMsCisJMHgxZjgzZDlhYiwKKwkweDViZTBjZDE5LAorfTsKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBpbml0NTEyX2xvW10gPSB7CisJMCwKKwkwLAorCTB4ZjNiY2M5MDgsCisJMHg4NGNhYTczYiwKKwkweGZlOTRmODJiLAorCTB4NWYxZDM2ZjEsCisJMHhhZGU2ODJkMSwKKwkweDJiM2U2YzFmLAorCTB4ZmI0MWJkNmIsCisJMHgxMzdlMjE3OSwKK307CisKKy8qIEluaXRpYWxpemUgc3RydWN0dXJlIGNvbnRhaW5pbmcgc3RhdGUgb2YgY29tcHV0YXRpb24uCisgICAoRklQUyAxODAtMjo1LjMuMikgICovCit2b2lkIEZBU1RfRlVOQyBzaGEyNTZfYmVnaW4oc2hhMjU2X2N0eF90ICpjdHgpCit7CisJbWVtY3B5KCZjdHgtPnRvdGFsNjQsIGluaXQyNTYsIHNpemVvZihpbml0MjU2KSk7CisJLypjdHgtPnRvdGFsNjQgPSAwOyAtIGRvbmUgYnkgcHJlcGVuZGluZyB0d28gMzItYml0IHplcm9zIHRvIGluaXQyNTYgKi8KKwljdHgtPnByb2Nlc3NfYmxvY2sgPSBzaGEyNTZfcHJvY2Vzc19ibG9jazY0OworfQorCisvKiBJbml0aWFsaXplIHN0cnVjdHVyZSBjb250YWluaW5nIHN0YXRlIG9mIGNvbXB1dGF0aW9uLgorICAgKEZJUFMgMTgwLTI6NS4zLjMpICAqLwordm9pZCBGQVNUX0ZVTkMgc2hhNTEyX2JlZ2luKHNoYTUxMl9jdHhfdCAqY3R4KQoreworCWludCBpOworCS8qIFR3byBleHRyYSBpdGVyYXRpb25zIHplcm8gb3V0IGN0eC0+dG90YWw2NFsyXSAqLworCXVpbnQ2NF90ICp0cCA9IGN0eC0+dG90YWw2NDsKKwlmb3IgKGkgPSAwOyBpIDwgMis4OyBpKyspCisJCXRwW2ldID0gKCh1aW50NjRfdCkoaW5pdDI1NltpXSkgPDwgMzIpICsgaW5pdDUxMl9sb1tpXTsKKwkvKmN0eC0+dG90YWw2NFswXSA9IGN0eC0+dG90YWw2NFsxXSA9IDA7IC0gYWxyZWFkeSBkb25lICovCit9CisKK3ZvaWQgRkFTVF9GVU5DIHNoYTUxMl9oYXNoKHNoYTUxMl9jdHhfdCAqY3R4LCBjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBsZW4pCit7CisJdW5zaWduZWQgYnVmcG9zID0gY3R4LT50b3RhbDY0WzBdICYgMTI3OworCXVuc2lnbmVkIHJlbWFpbmluZzsKKworCS8qIEZpcnN0IGluY3JlbWVudCB0aGUgYnl0ZSBjb3VudC4gIEZJUFMgMTgwLTIgc3BlY2lmaWVzIHRoZSBwb3NzaWJsZQorCSAgIGxlbmd0aCBvZiB0aGUgZmlsZSB1cCB0byAyXjEyOCBfYml0c18uCisJICAgV2UgY29tcHV0ZSB0aGUgbnVtYmVyIG9mIF9ieXRlc18gYW5kIGNvbnZlcnQgdG8gYml0cyBsYXRlci4gICovCisJY3R4LT50b3RhbDY0WzBdICs9IGxlbjsKKwlpZiAoY3R4LT50b3RhbDY0WzBdIDwgbGVuKQorCQljdHgtPnRvdGFsNjRbMV0rKzsKKyNpZiAwCisJcmVtYWluaW5nID0gMTI4IC0gYnVmcG9zOworCisJLyogSGFzaCB3aG9sZSBibG9ja3MgKi8KKwl3aGlsZSAobGVuID49IHJlbWFpbmluZykgeworCQltZW1jcHkoY3R4LT53YnVmZmVyICsgYnVmcG9zLCBidWZmZXIsIHJlbWFpbmluZyk7CisJCWJ1ZmZlciA9IChjb25zdCBjaGFyICopYnVmZmVyICsgcmVtYWluaW5nOworCQlsZW4gLT0gcmVtYWluaW5nOworCQlyZW1haW5pbmcgPSAxMjg7CisJCWJ1ZnBvcyA9IDA7CisJCXNoYTUxMl9wcm9jZXNzX2Jsb2NrMTI4KGN0eCk7CisJfQorCisJLyogU2F2ZSBsYXN0LCBwYXJ0aWFsIGJsb3NrICovCisJbWVtY3B5KGN0eC0+d2J1ZmZlciArIGJ1ZnBvcywgYnVmZmVyLCBsZW4pOworI2Vsc2UKKwl3aGlsZSAoMSkgeworCQlyZW1haW5pbmcgPSAxMjggLSBidWZwb3M7CisJCWlmIChyZW1haW5pbmcgPiBsZW4pCisJCQlyZW1haW5pbmcgPSBsZW47CisJCS8qIENvcHkgZGF0YSBpbnRvIGFsaWduZWQgYnVmZmVyICovCisJCW1lbWNweShjdHgtPndidWZmZXIgKyBidWZwb3MsIGJ1ZmZlciwgcmVtYWluaW5nKTsKKwkJbGVuIC09IHJlbWFpbmluZzsKKwkJYnVmZmVyID0gKGNvbnN0IGNoYXIgKilidWZmZXIgKyByZW1haW5pbmc7CisJCWJ1ZnBvcyArPSByZW1haW5pbmc7CisJCS8qIENsZXZlciB3YXkgdG8gZG8gImlmIChidWZwb3MgIT0gTikgYnJlYWs7IC4uLiA7IGJ1ZnBvcyA9IDA7IiAqLworCQlidWZwb3MgLT0gMTI4OworCQlpZiAoYnVmcG9zICE9IDApCisJCQlicmVhazsKKwkJLyogQnVmZmVyIGlzIGZpbGxlZCB1cCwgcHJvY2VzcyBpdCAqLworCQlzaGE1MTJfcHJvY2Vzc19ibG9jazEyOChjdHgpOworCQkvKmJ1ZnBvcyA9IDA7IC0gYWxyZWFkeSBpcyAqLworCX0KKyNlbmRpZgorfQorCisvKiBVc2VkIGFsc28gZm9yIHNoYTI1NiAqLwordm9pZCBGQVNUX0ZVTkMgc2hhMV9lbmQoc2hhMV9jdHhfdCAqY3R4LCB2b2lkICpyZXNidWYpCit7CisJdW5zaWduZWQgaGFzaF9zaXplOworCisJLyogU0hBIHN0b3JlcyB0b3RhbCBpbiBCRSwgbmVlZCB0byBzd2FwIG9uIExFIGFyY2hlczogKi8KKwljb21tb242NF9lbmQoY3R4LCAvKnN3YXBfbmVlZGVkOiovIEJCX0xJVFRMRV9FTkRJQU4pOworCisJaGFzaF9zaXplID0gKGN0eC0+cHJvY2Vzc19ibG9jayA9PSBzaGExX3Byb2Nlc3NfYmxvY2s2NCkgPyA1IDogODsKKwkvKiBUaGlzIHdheSB3ZSBkbyBub3QgaW1wb3NlIGFsaWdubWVudCBjb25zdHJhaW50cyBvbiByZXNidWY6ICovCisJaWYgKEJCX0xJVFRMRV9FTkRJQU4pIHsKKwkJdW5zaWduZWQgaTsKKwkJZm9yIChpID0gMDsgaSA8IGhhc2hfc2l6ZTsgKytpKQorCQkJY3R4LT5oYXNoW2ldID0gU1dBUF9CRTMyKGN0eC0+aGFzaFtpXSk7CisJfQorCW1lbWNweShyZXNidWYsIGN0eC0+aGFzaCwgc2l6ZW9mKGN0eC0+aGFzaFswXSkgKiBoYXNoX3NpemUpOworfQorCit2b2lkIEZBU1RfRlVOQyBzaGE1MTJfZW5kKHNoYTUxMl9jdHhfdCAqY3R4LCB2b2lkICpyZXNidWYpCit7CisJdW5zaWduZWQgYnVmcG9zID0gY3R4LT50b3RhbDY0WzBdICYgMTI3OworCisJLyogUGFkIHRoZSBidWZmZXIgdG8gdGhlIG5leHQgMTI4LWJ5dGUgYm91bmRhcnkgd2l0aCAweDgwLDAsMCwwLi4uICovCisJY3R4LT53YnVmZmVyW2J1ZnBvcysrXSA9IDB4ODA7CisKKwl3aGlsZSAoMSkgeworCQl1bnNpZ25lZCByZW1haW5pbmcgPSAxMjggLSBidWZwb3M7CisJCW1lbXNldChjdHgtPndidWZmZXIgKyBidWZwb3MsIDAsIHJlbWFpbmluZyk7CisJCWlmIChyZW1haW5pbmcgPj0gMTYpIHsKKwkJCS8qIFN0b3JlIHRoZSAxMjgtYml0IGNvdW50ZXIgb2YgYml0cyBpbiB0aGUgYnVmZmVyIGluIEJFIGZvcm1hdCAqLworCQkJdWludDY0X3QgdDsKKwkJCXQgPSBjdHgtPnRvdGFsNjRbMF0gPDwgMzsKKwkJCXQgPSBTV0FQX0JFNjQodCk7CisJCQkqKGJiX19hbGlhc2VkX3VpbnQ2NF90ICopICgmY3R4LT53YnVmZmVyWzEyOCAtIDhdKSA9IHQ7CisJCQl0ID0gKGN0eC0+dG90YWw2NFsxXSA8PCAzKSB8IChjdHgtPnRvdGFsNjRbMF0gPj4gNjEpOworCQkJdCA9IFNXQVBfQkU2NCh0KTsKKwkJCSooYmJfX2FsaWFzZWRfdWludDY0X3QgKikgKCZjdHgtPndidWZmZXJbMTI4IC0gMTZdKSA9IHQ7CisJCX0KKwkJc2hhNTEyX3Byb2Nlc3NfYmxvY2sxMjgoY3R4KTsKKwkJaWYgKHJlbWFpbmluZyA+PSAxNikKKwkJCWJyZWFrOworCQlidWZwb3MgPSAwOworCX0KKworCWlmIChCQl9MSVRUTEVfRU5ESUFOKSB7CisJCXVuc2lnbmVkIGk7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGN0eC0+aGFzaCk7ICsraSkKKwkJCWN0eC0+aGFzaFtpXSA9IFNXQVBfQkU2NChjdHgtPmhhc2hbaV0pOworCX0KKwltZW1jcHkocmVzYnVmLCBjdHgtPmhhc2gsIHNpemVvZihjdHgtPmhhc2gpKTsKK30KKworCisvKgorICogVGhlIEtlY2NhayBzcG9uZ2UgZnVuY3Rpb24sIGRlc2lnbmVkIGJ5IEd1aWRvIEJlcnRvbmksIEpvYW4gRGFlbWVuLAorICogTWljaGFlbCBQZWV0ZXJzIGFuZCBHaWxsZXMgVmFuIEFzc2NoZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIGZlZWRiYWNrIG9yCisgKiBxdWVzdGlvbnMsIHBsZWFzZSByZWZlciB0byBvdXIgd2Vic2l0ZTogaHR0cDovL2tlY2Nhay5ub2VrZW9uLm9yZy8KKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBieSBSb25ueSBWYW4gS2VlciwKKyAqIGhlcmVieSBkZW5vdGVkIGFzICJ0aGUgaW1wbGVtZW50ZXIiLgorICoKKyAqIFRvIHRoZSBleHRlbnQgcG9zc2libGUgdW5kZXIgbGF3LCB0aGUgaW1wbGVtZW50ZXIgaGFzIHdhaXZlZCBhbGwgY29weXJpZ2h0CisgKiBhbmQgcmVsYXRlZCBvciBuZWlnaGJvcmluZyByaWdodHMgdG8gdGhlIHNvdXJjZSBjb2RlIGluIHRoaXMgZmlsZS4KKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMC8KKyAqCisgKiBCdXN5Ym94IG1vZGlmaWNhdGlvbnMgKEMpIExhdXJpIEthc2FuZW4sIHVuZGVyIHRoZSBHUEx2Mi4KKyAqLworCisjaWYgQ09ORklHX1NIQTNfU01BTEwgPCAwCisjIGRlZmluZSBTSEEzX1NNQUxMIDAKKyNlbGlmIENPTkZJR19TSEEzX1NNQUxMID4gMQorIyBkZWZpbmUgU0hBM19TTUFMTCAxCisjZWxzZQorIyBkZWZpbmUgU0hBM19TTUFMTCBDT05GSUdfU0hBM19TTUFMTAorI2VuZGlmCisKKyNkZWZpbmUgT1BUSU1JWkVfU0hBM19GT1JfMzIgMAorLyoKKyAqIFNIQTMgY2FuIGJlIG9wdGltaXplZCBmb3IgMzItYml0IENQVXMgd2l0aCBiaXQtc2xpY2luZzoKKyAqIGV2ZXJ5IDY0LWJpdCB3b3JkIG9mIHN0YXRlW10gY2FuIGJlIHNwbGl0IGludG8gdHdvIDMyLWJpdCB3b3JkcworICogYnkgZXZlbi9vZGQgYml0cy4gSW4gdGhpcyBmb3JtLCBhbGwgcm90YXRpb25zIG9mIHNoYTMgcm91bmQKKyAqIGFyZSAzMi1iaXQgLSBhbmQgdGhlcmUgYXJlIGxvdHMgb2YgdGhlbS4KKyAqIEhvd2V2ZXIsIGl0IHJlcXVpcmVzIGVpdGhlciBzcGxpdHRpbmcvY29tYmluaW5nIHN0YXRlIHdvcmRzCisgKiBiZWZvcmUvYWZ0ZXIgc2hhMyByb3VuZCAoY29kZSBkb2VzIHRoaXMgbm93KQorICogb3Igc2h1ZmZsaW5nIGJpdHMgYmVmb3JlIHhvcidpbmcgdGhlbSBpbnRvIHN0YXRlIGFuZCBpbiBzaGEzX2VuZC4KKyAqIFdpdGhvdXQgc2h1ZmZsaW5nLCBiaXQtc2xpY2luZyByZXN1bHRzIGluIC0xMzAgYnl0ZXMgb2YgY29kZQorICogYW5kIG1hcmdpbmFsIHNwZWVkdXAgKGJ1dCBvZiBjb3Vyc2UgaXQgZ2l2ZXMgd3JvbmcgcmVzdWx0KS4KKyAqIFdpdGggc2h1ZmZsaW5nIGl0IHdvcmtzLCBidXQgKzI2MCBjb2RlIGJ5dGVzLCBhbmQgc2xvd2VyLgorICogRGlzYWJsZWQgZm9yIG5vdzoKKyAqLworI2lmIDAgLyogTE9OR19NQVggPT0gMHg3ZmZmZmZmZiAqLworIyB1bmRlZiBPUFRJTUlaRV9TSEEzX0ZPUl8zMgorIyBkZWZpbmUgT1BUSU1JWkVfU0hBM19GT1JfMzIgMQorI2VuZGlmCisKK2VudW0geworCVNIQTNfSUJMS19CWVRFUyA9IDcyLCAvKiA1NzYgYml0cyAvIDggKi8KK307CisKKyNpZiBPUFRJTUlaRV9TSEEzX0ZPUl8zMgorLyogVGhpcyBzcGxpdHMgZXZlcnkgNjQtYml0IHdvcmQgaW50byBhIHBhaXIgb2YgMzItYml0IHdvcmRzLAorICogZXZlbiBiaXRzIGdvIGludG8gZmlyc3Qgd29yZCwgb2RkIGJpdHMgZ28gdG8gc2Vjb25kIG9uZS4KKyAqIFRoZSBjb252ZXJzaW9uIGlzIGRvbmUgaW4tcGxhY2UuCisgKi8KK3N0YXRpYyB2b2lkIHNwbGl0X2hhbHZlcyh1aW50NjRfdCAqc3RhdGUpCit7CisJLyogQ3JlZGl0OiBIZW5yeSBTLiBXYXJyZW4sIEhhY2tlcidzIERlbGlnaHQsIEFkZGlzb24tV2VzbGV5LCAyMDAyICovCisJdWludDMyX3QgKnMzMiA9ICh1aW50MzJfdCopc3RhdGU7CisJdWludDMyX3QgdCwgeDAsIHgxOworCWludCBpOworCWZvciAoaSA9IDI0OyBpID49IDA7IC0taSkgeworCQl4MCA9IHMzMlswXTsKKwkJdCA9ICh4MCBeICh4MCA+PiAxKSkgJiAweDIyMjIyMjIyOyB4MCA9IHgwIF4gdCBeICh0IDw8IDEpOworCQl0ID0gKHgwIF4gKHgwID4+IDIpKSAmIDB4MEMwQzBDMEM7IHgwID0geDAgXiB0IF4gKHQgPDwgMik7CisJCXQgPSAoeDAgXiAoeDAgPj4gNCkpICYgMHgwMEYwMDBGMDsgeDAgPSB4MCBeIHQgXiAodCA8PCA0KTsKKwkJdCA9ICh4MCBeICh4MCA+PiA4KSkgJiAweDAwMDBGRjAwOyB4MCA9IHgwIF4gdCBeICh0IDw8IDgpOworCQl4MSA9IHMzMlsxXTsKKwkJdCA9ICh4MSBeICh4MSA+PiAxKSkgJiAweDIyMjIyMjIyOyB4MSA9IHgxIF4gdCBeICh0IDw8IDEpOworCQl0ID0gKHgxIF4gKHgxID4+IDIpKSAmIDB4MEMwQzBDMEM7IHgxID0geDEgXiB0IF4gKHQgPDwgMik7CisJCXQgPSAoeDEgXiAoeDEgPj4gNCkpICYgMHgwMEYwMDBGMDsgeDEgPSB4MSBeIHQgXiAodCA8PCA0KTsKKwkJdCA9ICh4MSBeICh4MSA+PiA4KSkgJiAweDAwMDBGRjAwOyB4MSA9IHgxIF4gdCBeICh0IDw8IDgpOworCQkqczMyKysgPSAoeDAgJiAweDAwMDBGRkZGKSB8ICh4MSA8PCAxNik7CisJCSpzMzIrKyA9ICh4MCA+PiAxNikgfCAoeDEgJiAweEZGRkYwMDAwKTsKKwl9Cit9CisvKiBUaGUgcmV2ZXJzZSBvcGVyYXRpb24gKi8KK3N0YXRpYyB2b2lkIGNvbWJpbmVfaGFsdmVzKHVpbnQ2NF90ICpzdGF0ZSkKK3sKKwl1aW50MzJfdCAqczMyID0gKHVpbnQzMl90KilzdGF0ZTsKKwl1aW50MzJfdCB0LCB4MCwgeDE7CisJaW50IGk7CisJZm9yIChpID0gMjQ7IGkgPj0gMDsgLS1pKSB7CisJCXgwID0gczMyWzBdOworCQl4MSA9IHMzMlsxXTsKKwkJdCA9ICh4MCAmIDB4MDAwMEZGRkYpIHwgKHgxIDw8IDE2KTsKKwkJeDEgPSAoeDAgPj4gMTYpIHwgKHgxICYgMHhGRkZGMDAwMCk7CisJCXgwID0gdDsKKwkJdCA9ICh4MCBeICh4MCA+PiA4KSkgJiAweDAwMDBGRjAwOyB4MCA9IHgwIF4gdCBeICh0IDw8IDgpOworCQl0ID0gKHgwIF4gKHgwID4+IDQpKSAmIDB4MDBGMDAwRjA7IHgwID0geDAgXiB0IF4gKHQgPDwgNCk7CisJCXQgPSAoeDAgXiAoeDAgPj4gMikpICYgMHgwQzBDMEMwQzsgeDAgPSB4MCBeIHQgXiAodCA8PCAyKTsKKwkJdCA9ICh4MCBeICh4MCA+PiAxKSkgJiAweDIyMjIyMjIyOyB4MCA9IHgwIF4gdCBeICh0IDw8IDEpOworCQkqczMyKysgPSB4MDsKKwkJdCA9ICh4MSBeICh4MSA+PiA4KSkgJiAweDAwMDBGRjAwOyB4MSA9IHgxIF4gdCBeICh0IDw8IDgpOworCQl0ID0gKHgxIF4gKHgxID4+IDQpKSAmIDB4MDBGMDAwRjA7IHgxID0geDEgXiB0IF4gKHQgPDwgNCk7CisJCXQgPSAoeDEgXiAoeDEgPj4gMikpICYgMHgwQzBDMEMwQzsgeDEgPSB4MSBeIHQgXiAodCA8PCAyKTsKKwkJdCA9ICh4MSBeICh4MSA+PiAxKSkgJiAweDIyMjIyMjIyOyB4MSA9IHgxIF4gdCBeICh0IDw8IDEpOworCQkqczMyKysgPSB4MTsKKwl9Cit9CisjZW5kaWYKKworLyoKKyAqIEluIHRoZSBjcnlwdG8gbGl0ZXJhdHVyZSB0aGlzIGZ1bmN0aW9uIGlzIHVzdWFsbHkgY2FsbGVkIEtlY2Nhay1mKCkuCisgKi8KK3N0YXRpYyB2b2lkIHNoYTNfcHJvY2Vzc19ibG9jazcyKHVpbnQ2NF90ICpzdGF0ZSkKK3sKKwllbnVtIHsgTlJPVU5EUyA9IDI0IH07CisKKyNpZiBPUFRJTUlaRV9TSEEzX0ZPUl8zMgorCS8qCisJc3RhdGljIGNvbnN0IHVpbnQzMl90IElPVEFfQ09OU1RfMFtOUk9VTkRTXSA9IHsKKwkJMHgwMDAwMDAwMVVMLAorCQkweDAwMDAwMDAwVUwsCisJCTB4MDAwMDAwMDBVTCwKKwkJMHgwMDAwMDAwMFVMLAorCQkweDAwMDAwMDAxVUwsCisJCTB4MDAwMDAwMDFVTCwKKwkJMHgwMDAwMDAwMVVMLAorCQkweDAwMDAwMDAxVUwsCisJCTB4MDAwMDAwMDBVTCwKKwkJMHgwMDAwMDAwMFVMLAorCQkweDAwMDAwMDAxVUwsCisJCTB4MDAwMDAwMDBVTCwKKwkJMHgwMDAwMDAwMVVMLAorCQkweDAwMDAwMDAxVUwsCisJCTB4MDAwMDAwMDFVTCwKKwkJMHgwMDAwMDAwMVVMLAorCQkweDAwMDAwMDAwVUwsCisJCTB4MDAwMDAwMDBVTCwKKwkJMHgwMDAwMDAwMFVMLAorCQkweDAwMDAwMDAwVUwsCisJCTB4MDAwMDAwMDFVTCwKKwkJMHgwMDAwMDAwMFVMLAorCQkweDAwMDAwMDAxVUwsCisJCTB4MDAwMDAwMDBVTCwKKwl9OworCSoqIGJpdHMgYXJlIGluIGxzYjogMDEwMSAwMDAwIDExMTEgMDEwMCAxMTExIDAwMDEKKwkqLworCXVpbnQzMl90IElPVEFfQ09OU1RfMGJpdHMgPSAodWludDMyX3QpKDB4MDA1MGY0ZjEpOworCXN0YXRpYyBjb25zdCB1aW50MzJfdCBJT1RBX0NPTlNUXzFbTlJPVU5EU10gPSB7CisJCTB4MDAwMDAwMDBVTCwKKwkJMHgwMDAwMDA4OVVMLAorCQkweDgwMDAwMDhiVUwsCisJCTB4ODAwMDgwODBVTCwKKwkJMHgwMDAwMDA4YlVMLAorCQkweDAwMDA4MDAwVUwsCisJCTB4ODAwMDgwODhVTCwKKwkJMHg4MDAwMDA4MlVMLAorCQkweDAwMDAwMDBiVUwsCisJCTB4MDAwMDAwMGFVTCwKKwkJMHgwMDAwODA4MlVMLAorCQkweDAwMDA4MDAzVUwsCisJCTB4MDAwMDgwOGJVTCwKKwkJMHg4MDAwMDAwYlVMLAorCQkweDgwMDAwMDhhVUwsCisJCTB4ODAwMDAwODFVTCwKKwkJMHg4MDAwMDA4MVVMLAorCQkweDgwMDAwMDA4VUwsCisJCTB4MDAwMDAwODNVTCwKKwkJMHg4MDAwODAwM1VMLAorCQkweDgwMDA4MDg4VUwsCisJCTB4ODAwMDAwODhVTCwKKwkJMHgwMDAwODAwMFVMLAorCQkweDgwMDA4MDgyVUwsCisJfTsKKworCXVpbnQzMl90ICpjb25zdCBzMzIgPSAodWludDMyX3QqKXN0YXRlOworCXVuc2lnbmVkIHJvdW5kOworCisJc3BsaXRfaGFsdmVzKHN0YXRlKTsKKworCWZvciAocm91bmQgPSAwOyByb3VuZCA8IE5ST1VORFM7IHJvdW5kKyspIHsKKwkJdW5zaWduZWQgeDsKKworCQkvKiBUaGV0YSAqLworCQl7CisJCQl1aW50MzJfdCBCQ1syMF07CisJCQlmb3IgKHggPSAwOyB4IDwgMTA7ICsreCkgeworCQkJCUJDW3grMTBdID0gQkNbeF0gPSBzMzJbeF1eczMyW3grMTBdXnMzMlt4KzIwXV5zMzJbeCszMF1eczMyW3grNDBdOworCQkJfQorCQkJZm9yICh4ID0gMDsgeCA8IDEwOyB4ICs9IDIpIHsKKwkJCQl1aW50MzJfdCB0YSwgdGI7CisJCQkJdGEgPSBCQ1t4KzhdIF4gcm90bDMyKEJDW3grM10sIDEpOworCQkJCXRiID0gQkNbeCs5XSBeIEJDW3grMl07CisJCQkJczMyW3grMF0gXj0gdGE7CisJCQkJczMyW3grMV0gXj0gdGI7CisJCQkJczMyW3grMTBdIF49IHRhOworCQkJCXMzMlt4KzExXSBePSB0YjsKKwkJCQlzMzJbeCsyMF0gXj0gdGE7CisJCQkJczMyW3grMjFdIF49IHRiOworCQkJCXMzMlt4KzMwXSBePSB0YTsKKwkJCQlzMzJbeCszMV0gXj0gdGI7CisJCQkJczMyW3grNDBdIF49IHRhOworCQkJCXMzMlt4KzQxXSBePSB0YjsKKwkJCX0KKwkJfQorCQkvKiBSaG9QaSAqLworCQl7CisJCQl1aW50MzJfdCB0MGEsdDBiLCB0MWEsdDFiOworCQkJdDFhID0gczMyWzEqMiswXTsKKwkJCXQxYiA9IHMzMlsxKjIrMV07CisKKyNkZWZpbmUgUmhvUGkoUElfTEFORSwgUk9UX0NPTlNUKSBcCisJdDBhID0gczMyW1BJX0xBTkUqMiswXTtcCisJdDBiID0gczMyW1BJX0xBTkUqMisxXTtcCisJaWYgKFJPVF9DT05TVCAmIDEpIHtcCisJCXMzMltQSV9MQU5FKjIrMF0gPSByb3RsMzIodDFiLCBST1RfQ09OU1QvMisxKTtcCisJCXMzMltQSV9MQU5FKjIrMV0gPSBST1RfQ09OU1QgPT0gMSA/IHQxYSA6IHJvdGwzMih0MWEsIFJPVF9DT05TVC8yKzApO1wKKwl9IGVsc2Uge1wKKwkJczMyW1BJX0xBTkUqMiswXSA9IHJvdGwzMih0MWEsIFJPVF9DT05TVC8yKTtcCisJCXMzMltQSV9MQU5FKjIrMV0gPSByb3RsMzIodDFiLCBST1RfQ09OU1QvMik7XAorCX1cCisJdDFhID0gdDBhOyB0MWIgPSB0MGI7CisKKwkJCVJob1BpKDEwLCAxKQorCQkJUmhvUGkoIDcsIDMpCisJCQlSaG9QaSgxMSwgNikKKwkJCVJob1BpKDE3LDEwKQorCQkJUmhvUGkoMTgsMTUpCisJCQlSaG9QaSggMywyMSkKKwkJCVJob1BpKCA1LDI4KQorCQkJUmhvUGkoMTYsMzYpCisJCQlSaG9QaSggOCw0NSkKKwkJCVJob1BpKDIxLDU1KQorCQkJUmhvUGkoMjQsIDIpCisJCQlSaG9QaSggNCwxNCkKKwkJCVJob1BpKDE1LDI3KQorCQkJUmhvUGkoMjMsNDEpCisJCQlSaG9QaSgxOSw1NikKKwkJCVJob1BpKDEzLCA4KQorCQkJUmhvUGkoMTIsMjUpCisJCQlSaG9QaSggMiw0MykKKwkJCVJob1BpKDIwLDYyKQorCQkJUmhvUGkoMTQsMTgpCisJCQlSaG9QaSgyMiwzOSkKKwkJCVJob1BpKCA5LDYxKQorCQkJUmhvUGkoIDYsMjApCisJCQlSaG9QaSggMSw0NCkKKyN1bmRlZiBSaG9QaQorCQl9CisJCS8qIENoaSAqLworCQlmb3IgKHggPSAwOyB4IDw9IDQwOykgeworCQkJdWludDMyX3QgQkMwLCBCQzEsIEJDMiwgQkMzLCBCQzQ7CisJCQlCQzAgPSBzMzJbeCArIDAqMl07CisJCQlCQzEgPSBzMzJbeCArIDEqMl07CisJCQlCQzIgPSBzMzJbeCArIDIqMl07CisJCQlzMzJbeCArIDAqMl0gPSBCQzAgXiAoKH5CQzEpICYgQkMyKTsKKwkJCUJDMyA9IHMzMlt4ICsgMyoyXTsKKwkJCXMzMlt4ICsgMSoyXSA9IEJDMSBeICgofkJDMikgJiBCQzMpOworCQkJQkM0ID0gczMyW3ggKyA0KjJdOworCQkJczMyW3ggKyAyKjJdID0gQkMyIF4gKCh+QkMzKSAmIEJDNCk7CisJCQlzMzJbeCArIDMqMl0gPSBCQzMgXiAoKH5CQzQpICYgQkMwKTsKKwkJCXMzMlt4ICsgNCoyXSA9IEJDNCBeICgofkJDMCkgJiBCQzEpOworCQkJeCsrOworCQkJQkMwID0gczMyW3ggKyAwKjJdOworCQkJQkMxID0gczMyW3ggKyAxKjJdOworCQkJQkMyID0gczMyW3ggKyAyKjJdOworCQkJczMyW3ggKyAwKjJdID0gQkMwIF4gKCh+QkMxKSAmIEJDMik7CisJCQlCQzMgPSBzMzJbeCArIDMqMl07CisJCQlzMzJbeCArIDEqMl0gPSBCQzEgXiAoKH5CQzIpICYgQkMzKTsKKwkJCUJDNCA9IHMzMlt4ICsgNCoyXTsKKwkJCXMzMlt4ICsgMioyXSA9IEJDMiBeICgofkJDMykgJiBCQzQpOworCQkJczMyW3ggKyAzKjJdID0gQkMzIF4gKCh+QkM0KSAmIEJDMCk7CisJCQlzMzJbeCArIDQqMl0gPSBCQzQgXiAoKH5CQzApICYgQkMxKTsKKwkJCXggKz0gOTsKKwkJfQorCQkvKiBJb3RhICovCisJCXMzMlswXSBePSBJT1RBX0NPTlNUXzBiaXRzICYgMTsKKwkJSU9UQV9DT05TVF8wYml0cyA+Pj0gMTsKKwkJczMyWzFdIF49IElPVEFfQ09OU1RfMVtyb3VuZF07CisJfQorCisJY29tYmluZV9oYWx2ZXMoc3RhdGUpOworI2Vsc2UKKwkvKiBOYXRpdmUgNjQtYml0IGFsZ29yaXRobSAqLworCXN0YXRpYyBjb25zdCB1aW50MTZfdCBJT1RBX0NPTlNUW05ST1VORFNdID0geworCQkvKiBFbGVtZW50cyBzaG91bGQgYmUgNjQtYml0LCBidXQgdG9wIGhhbGYgaXMgYWx3YXlzIHplcm8KKwkJICogb3IgMHg4MDAwMDAwMC4gV2UgZW5jb2RlIDYzcmQgYml0cyBpbiBhIHNlcGFyYXRlIHdvcmQgYmVsb3cuCisJCSAqIFNhbWUgaXMgdHJ1ZSBmb3IgMzF0aCBiaXRzLCB3aGljaCBsZXRzIHVzIHVzZSAxNi1iaXQgdGFibGUKKwkJICogaW5zdGVhZCBvZiA2NC1iaXQuIFRoZSBzcGVlZCBwZW5hbHR5IGlzIGxvc3QgaW4gdGhlIG5vaXNlLgorCQkgKi8KKwkJMHgwMDAxLAorCQkweDgwODIsCisJCTB4ODA4YSwKKwkJMHg4MDAwLAorCQkweDgwOGIsCisJCTB4MDAwMSwKKwkJMHg4MDgxLAorCQkweDgwMDksCisJCTB4MDA4YSwKKwkJMHgwMDg4LAorCQkweDgwMDksCisJCTB4MDAwYSwKKwkJMHg4MDhiLAorCQkweDAwOGIsCisJCTB4ODA4OSwKKwkJMHg4MDAzLAorCQkweDgwMDIsCisJCTB4MDA4MCwKKwkJMHg4MDBhLAorCQkweDAwMGEsCisJCTB4ODA4MSwKKwkJMHg4MDgwLAorCQkweDAwMDEsCisJCTB4ODAwOCwKKwl9OworCS8qIGJpdCBmb3IgQ09OU1RbMF0gaXMgaW4gbXNiOiAwMDExIDAwMTEgMDAwMCAwMTExIDExMDEgMTEwMSAqLworCWNvbnN0IHVpbnQzMl90IElPVEFfQ09OU1RfYml0NjMgPSAodWludDMyX3QpKDB4MzMwN2RkMDApOworCS8qIGJpdCBmb3IgQ09OU1RbMF0gaXMgaW4gbXNiOiAwMDAxIDAxMTAgMDAxMSAxMDAwIDAwMDEgMTAxMSAqLworCWNvbnN0IHVpbnQzMl90IElPVEFfQ09OU1RfYml0MzEgPSAodWludDMyX3QpKDB4MTYzODFiMDApOworCisJc3RhdGljIGNvbnN0IHVpbnQ4X3QgUk9UX0NPTlNUWzI0XSA9IHsKKwkJMSwgMywgNiwgMTAsIDE1LCAyMSwgMjgsIDM2LCA0NSwgNTUsIDIsIDE0LAorCQkyNywgNDEsIDU2LCA4LCAyNSwgNDMsIDYyLCAxOCwgMzksIDYxLCAyMCwgNDQsCisJfTsKKwlzdGF0aWMgY29uc3QgdWludDhfdCBQSV9MQU5FWzI0XSA9IHsKKwkJMTAsIDcsIDExLCAxNywgMTgsIDMsIDUsIDE2LCA4LCAyMSwgMjQsIDQsCisJCTE1LCAyMywgMTksIDEzLCAxMiwgMiwgMjAsIDE0LCAyMiwgOSwgNiwgMSwKKwl9OworCS8qc3RhdGljIGNvbnN0IHVpbnQ4X3QgTU9ENVsxMF0gPSB7IDAsIDEsIDIsIDMsIDQsIDAsIDEsIDIsIDMsIDQsIH07Ki8KKworCXVuc2lnbmVkIHg7CisJdW5zaWduZWQgcm91bmQ7CisKKwlpZiAoQkJfQklHX0VORElBTikgeworCQlmb3IgKHggPSAwOyB4IDwgMjU7IHgrKykgeworCQkJc3RhdGVbeF0gPSBTV0FQX0xFNjQoc3RhdGVbeF0pOworCQl9CisJfQorCisJZm9yIChyb3VuZCA9IDA7IHJvdW5kIDwgTlJPVU5EUzsgKytyb3VuZCkgeworCQkvKiBUaGV0YSAqLworCQl7CisJCQl1aW50NjRfdCBCQ1sxMF07CisJCQlmb3IgKHggPSAwOyB4IDwgNTsgKyt4KSB7CisJCQkJQkNbeCArIDVdID0gQkNbeF0gPSBzdGF0ZVt4XQorCQkJCQleIHN0YXRlW3ggKyA1XSBeIHN0YXRlW3ggKyAxMF0KKwkJCQkJXiBzdGF0ZVt4ICsgMTVdCV4gc3RhdGVbeCArIDIwXTsKKwkJCX0KKwkJCS8qIFVzaW5nIDJ4NSB2ZWN0b3IgYWJvdmUgZWxpbWluYXRlcyB0aGUgbmVlZCB0byB1c2UKKwkJCSAqIEJDW01PRDVbeCtOXV0gdHJpY2sgYmVsb3cgdG8gZmV0Y2ggQkNbKHgrTikgJSA1XSwKKwkJCSAqIGFuZCB0aGUgY29kZSBpcyBhIGJpdCBfc21hbGxlcl8uCisJCQkgKi8KKwkJCWZvciAoeCA9IDA7IHggPCA1OyArK3gpIHsKKwkJCQl1aW50NjRfdCB0ZW1wID0gQkNbeCArIDRdIF4gcm90bDY0KEJDW3ggKyAxXSwgMSk7CisJCQkJc3RhdGVbeF0gXj0gdGVtcDsKKwkJCQlzdGF0ZVt4ICsgNV0gXj0gdGVtcDsKKwkJCQlzdGF0ZVt4ICsgMTBdIF49IHRlbXA7CisJCQkJc3RhdGVbeCArIDE1XSBePSB0ZW1wOworCQkJCXN0YXRlW3ggKyAyMF0gXj0gdGVtcDsKKwkJCX0KKwkJfQorCisJCS8qIFJobyBQaSAqLworCQlpZiAoU0hBM19TTUFMTCkgeworCQkJdWludDY0X3QgdDEgPSBzdGF0ZVsxXTsKKwkJCWZvciAoeCA9IDA7IHggPCAyNDsgKyt4KSB7CisJCQkJdWludDY0X3QgdDAgPSBzdGF0ZVtQSV9MQU5FW3hdXTsKKwkJCQlzdGF0ZVtQSV9MQU5FW3hdXSA9IHJvdGw2NCh0MSwgUk9UX0NPTlNUW3hdKTsKKwkJCQl0MSA9IHQwOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogRXNwZWNpYWxseSBsYXJnZSBiZW5lZml0IGZvciAzMi1iaXQgYXJjaCAoNzUlIGZhc3Rlcik6CisJCQkgKiA2NC1iaXQgcm90YXRpb25zIGJ5IG5vbi1jb25zdGFudCB1c3VhbGx5IGFyZSBTTE9XIG9uIHRob3NlLgorCQkJICogV2UgcmVzb3J0IHRvIHVucm9sbGluZyBoZXJlLgorCQkJICogVGhpcyBvcHRpbWl6ZXMgb3V0IFBJX0xBTkVbXSBhbmQgUk9UX0NPTlNUW10sCisJCQkgKiBidXQgZ2VuZXJhdGVzIDMwMC01MDAgbW9yZSBieXRlcyBvZiBjb2RlLgorCQkJICovCisJCQl1aW50NjRfdCB0MDsKKwkJCXVpbnQ2NF90IHQxID0gc3RhdGVbMV07CisjZGVmaW5lIFJob1BpX3R3aWNlKHgpIFwKKwl0MCA9IHN0YXRlW1BJX0xBTkVbeCAgXV07IFwKKwlzdGF0ZVtQSV9MQU5FW3ggIF1dID0gcm90bDY0KHQxLCBST1RfQ09OU1RbeCAgXSk7IFwKKwl0MSA9IHN0YXRlW1BJX0xBTkVbeCsxXV07IFwKKwlzdGF0ZVtQSV9MQU5FW3grMV1dID0gcm90bDY0KHQwLCBST1RfQ09OU1RbeCsxXSk7CisJCQlSaG9QaV90d2ljZSgwKTsgUmhvUGlfdHdpY2UoMik7CisJCQlSaG9QaV90d2ljZSg0KTsgUmhvUGlfdHdpY2UoNik7CisJCQlSaG9QaV90d2ljZSg4KTsgUmhvUGlfdHdpY2UoMTApOworCQkJUmhvUGlfdHdpY2UoMTIpOyBSaG9QaV90d2ljZSgxNCk7CisJCQlSaG9QaV90d2ljZSgxNik7IFJob1BpX3R3aWNlKDE4KTsKKwkJCVJob1BpX3R3aWNlKDIwKTsgUmhvUGlfdHdpY2UoMjIpOworI3VuZGVmIFJob1BpX3R3aWNlCisJCX0KKwkJLyogQ2hpICovCisjIGlmIExPTkdfTUFYID4gMHg3ZmZmZmZmZgorCQlmb3IgKHggPSAwOyB4IDw9IDIwOyB4ICs9IDUpIHsKKwkJCXVpbnQ2NF90IEJDMCwgQkMxLCBCQzIsIEJDMywgQkM0OworCQkJQkMwID0gc3RhdGVbeCArIDBdOworCQkJQkMxID0gc3RhdGVbeCArIDFdOworCQkJQkMyID0gc3RhdGVbeCArIDJdOworCQkJc3RhdGVbeCArIDBdID0gQkMwIF4gKCh+QkMxKSAmIEJDMik7CisJCQlCQzMgPSBzdGF0ZVt4ICsgM107CisJCQlzdGF0ZVt4ICsgMV0gPSBCQzEgXiAoKH5CQzIpICYgQkMzKTsKKwkJCUJDNCA9IHN0YXRlW3ggKyA0XTsKKwkJCXN0YXRlW3ggKyAyXSA9IEJDMiBeICgofkJDMykgJiBCQzQpOworCQkJc3RhdGVbeCArIDNdID0gQkMzIF4gKCh+QkM0KSAmIEJDMCk7CisJCQlzdGF0ZVt4ICsgNF0gPSBCQzQgXiAoKH5CQzApICYgQkMxKTsKKwkJfQorIyBlbHNlCisJCS8qIFJlZHVjZWQgcmVnaXN0ZXIgcHJlc3N1cmUgdmVyc2lvbgorCQkgKiBmb3IgcmVnaXN0ZXItc3RhcnZlZCAzMi1iaXQgYXJjaGVzCisJCSAqIChpMzg2OiAtOTUgYnl0ZXMsIGFuZCBpdCBpcyBfZmFzdGVyXykKKwkJICovCisJCWZvciAoeCA9IDA7IHggPD0gNDA7KSB7CisJCQl1aW50MzJfdCBCQzAsIEJDMSwgQkMyLCBCQzMsIEJDNDsKKwkJCXVpbnQzMl90ICpjb25zdCBzMzIgPSAodWludDMyX3QqKXN0YXRlOworIyAgaWYgU0hBM19TTUFMTAorIGRvX2hhbGY6CisjICBlbmRpZgorCQkJQkMwID0gczMyW3ggKyAwKjJdOworCQkJQkMxID0gczMyW3ggKyAxKjJdOworCQkJQkMyID0gczMyW3ggKyAyKjJdOworCQkJczMyW3ggKyAwKjJdID0gQkMwIF4gKCh+QkMxKSAmIEJDMik7CisJCQlCQzMgPSBzMzJbeCArIDMqMl07CisJCQlzMzJbeCArIDEqMl0gPSBCQzEgXiAoKH5CQzIpICYgQkMzKTsKKwkJCUJDNCA9IHMzMlt4ICsgNCoyXTsKKwkJCXMzMlt4ICsgMioyXSA9IEJDMiBeICgofkJDMykgJiBCQzQpOworCQkJczMyW3ggKyAzKjJdID0gQkMzIF4gKCh+QkM0KSAmIEJDMCk7CisJCQlzMzJbeCArIDQqMl0gPSBCQzQgXiAoKH5CQzApICYgQkMxKTsKKwkJCXgrKzsKKyMgIGlmIFNIQTNfU01BTEwKKwkJCWlmICh4ICYgMSkKKwkJCQlnb3RvIGRvX2hhbGY7CisJCQl4ICs9IDg7CisjICBlbHNlCisJCQlCQzAgPSBzMzJbeCArIDAqMl07CisJCQlCQzEgPSBzMzJbeCArIDEqMl07CisJCQlCQzIgPSBzMzJbeCArIDIqMl07CisJCQlzMzJbeCArIDAqMl0gPSBCQzAgXiAoKH5CQzEpICYgQkMyKTsKKwkJCUJDMyA9IHMzMlt4ICsgMyoyXTsKKwkJCXMzMlt4ICsgMSoyXSA9IEJDMSBeICgofkJDMikgJiBCQzMpOworCQkJQkM0ID0gczMyW3ggKyA0KjJdOworCQkJczMyW3ggKyAyKjJdID0gQkMyIF4gKCh+QkMzKSAmIEJDNCk7CisJCQlzMzJbeCArIDMqMl0gPSBCQzMgXiAoKH5CQzQpICYgQkMwKTsKKwkJCXMzMlt4ICsgNCoyXSA9IEJDNCBeICgofkJDMCkgJiBCQzEpOworCQkJeCArPSA5OworIyAgZW5kaWYKKwkJfQorIyBlbmRpZiAvKiBsb25nIGlzIDMyLWJpdCAqLworCQkvKiBJb3RhICovCisJCXN0YXRlWzBdIF49IElPVEFfQ09OU1Rbcm91bmRdCisJCQl8ICh1aW50MzJfdCkoKElPVEFfQ09OU1RfYml0MzEgPDwgcm91bmQpICYgMHg4MDAwMDAwMCkKKwkJCXwgKHVpbnQ2NF90KSgoSU9UQV9DT05TVF9iaXQ2MyA8PCByb3VuZCkgJiAweDgwMDAwMDAwKSA8PCAzMjsKKwl9CisKKwlpZiAoQkJfQklHX0VORElBTikgeworCQlmb3IgKHggPSAwOyB4IDwgMjU7IHgrKykgeworCQkJc3RhdGVbeF0gPSBTV0FQX0xFNjQoc3RhdGVbeF0pOworCQl9CisJfQorI2VuZGlmCit9CisKK3ZvaWQgRkFTVF9GVU5DIHNoYTNfYmVnaW4oc2hhM19jdHhfdCAqY3R4KQoreworCW1lbXNldChjdHgsIDAsIHNpemVvZigqY3R4KSk7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHNoYTNfaGFzaChzaGEzX2N0eF90ICpjdHgsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbikKK3sKKyNpZiBTSEEzX1NNQUxMCisJY29uc3QgdWludDhfdCAqZGF0YSA9IGJ1ZmZlcjsKKwl1bnNpZ25lZCBidWZwb3MgPSBjdHgtPmJ5dGVzX3F1ZXVlZDsKKworCXdoaWxlICgxKSB7CisJCXVuc2lnbmVkIHJlbWFpbmluZyA9IFNIQTNfSUJMS19CWVRFUyAtIGJ1ZnBvczsKKwkJaWYgKHJlbWFpbmluZyA+IGxlbikKKwkJCXJlbWFpbmluZyA9IGxlbjsKKwkJbGVuIC09IHJlbWFpbmluZzsKKwkJLyogWE9SIGRhdGEgaW50byBidWZmZXIgKi8KKwkJd2hpbGUgKHJlbWFpbmluZyAhPSAwKSB7CisJCQl1aW50OF90ICpidWYgPSAodWludDhfdCopY3R4LT5zdGF0ZTsKKwkJCWJ1ZltidWZwb3NdIF49ICpkYXRhKys7CisJCQlidWZwb3MrKzsKKwkJCXJlbWFpbmluZy0tOworCQl9CisJCS8qIENsZXZlciB3YXkgdG8gZG8gImlmIChidWZwb3MgIT0gTikgYnJlYWs7IC4uLiA7IGJ1ZnBvcyA9IDA7IiAqLworCQlidWZwb3MgLT0gU0hBM19JQkxLX0JZVEVTOworCQlpZiAoYnVmcG9zICE9IDApCisJCQlicmVhazsKKwkJLyogQnVmZmVyIGlzIGZpbGxlZCB1cCwgcHJvY2VzcyBpdCAqLworCQlzaGEzX3Byb2Nlc3NfYmxvY2s3MihjdHgtPnN0YXRlKTsKKwkJLypidWZwb3MgPSAwOyAtIGFscmVhZHkgaXMgKi8KKwl9CisJY3R4LT5ieXRlc19xdWV1ZWQgPSBidWZwb3MgKyBTSEEzX0lCTEtfQllURVM7CisjZWxzZQorCS8qICs1MCBieXRlcyBjb2RlIHNpemUsIGJ1dCBhIGJpdCBmYXN0ZXIgYmVjYXVzZSBvZiBsb25nLXNpemVkIFhPUnMgKi8KKwljb25zdCB1aW50OF90ICpkYXRhID0gYnVmZmVyOworCXVuc2lnbmVkIGJ1ZnBvcyA9IGN0eC0+Ynl0ZXNfcXVldWVkOworCisJLyogSWYgYWxyZWFkeSBkYXRhIGluIHF1ZXVlLCBjb250aW51ZSBxdWV1aW5nIGZpcnN0ICovCisJd2hpbGUgKGxlbiAhPSAwICYmIGJ1ZnBvcyAhPSAwKSB7CisJCXVpbnQ4X3QgKmJ1ZiA9ICh1aW50OF90KiljdHgtPnN0YXRlOworCQlidWZbYnVmcG9zXSBePSAqZGF0YSsrOworCQlsZW4tLTsKKwkJYnVmcG9zKys7CisJCWlmIChidWZwb3MgPT0gU0hBM19JQkxLX0JZVEVTKSB7CisJCQlidWZwb3MgPSAwOworCQkJZ290byBkb19ibG9jazsKKwkJfQorCX0KKworCS8qIEFic29yYiBjb21wbGV0ZSBibG9ja3MgKi8KKwl3aGlsZSAobGVuID49IFNIQTNfSUJMS19CWVRFUykgeworCQkvKiBYT1IgZGF0YSBvbnRvIGJlZ2lubmluZyBvZiBzdGF0ZVtdLgorCQkgKiBXZSB0cnkgdG8gYmUgZWZmaWNpZW50IC0gb3BlcmF0ZSBvbmUgd29yZCBhdCBhIHRpbWUsIG5vdCBieXRlLgorCQkgKiBDYXJlZnVsIHdydCB1bmFsaWduZWQgYWNjZXNzOiBjYW4ndCBqdXN0IHVzZSAiKihsb25nKilkYXRhIiEKKwkJICovCisJCXVuc2lnbmVkIGNvdW50ID0gU0hBM19JQkxLX0JZVEVTIC8gc2l6ZW9mKGxvbmcpOworCQlsb25nICpidWYgPSAobG9uZyopY3R4LT5zdGF0ZTsKKwkJZG8geworCQkJbG9uZyB2OworCQkJbW92ZV9mcm9tX3VuYWxpZ25lZF9sb25nKHYsIChsb25nKilkYXRhKTsKKwkJCSpidWYrKyBePSB2OworCQkJZGF0YSArPSBzaXplb2YobG9uZyk7CisJCX0gd2hpbGUgKC0tY291bnQpOworCQlsZW4gLT0gU0hBM19JQkxLX0JZVEVTOworIGRvX2Jsb2NrOgorCQlzaGEzX3Byb2Nlc3NfYmxvY2s3MihjdHgtPnN0YXRlKTsKKwl9CisKKwkvKiBRdWV1ZSByZW1haW5pbmcgZGF0YSBieXRlcyAqLworCXdoaWxlIChsZW4gIT0gMCkgeworCQl1aW50OF90ICpidWYgPSAodWludDhfdCopY3R4LT5zdGF0ZTsKKwkJYnVmW2J1ZnBvc10gXj0gKmRhdGErKzsKKwkJYnVmcG9zKys7CisJCWxlbi0tOworCX0KKworCWN0eC0+Ynl0ZXNfcXVldWVkID0gYnVmcG9zOworI2VuZGlmCit9CisKK3ZvaWQgRkFTVF9GVU5DIHNoYTNfZW5kKHNoYTNfY3R4X3QgKmN0eCwgdm9pZCAqcmVzYnVmKQoreworCS8qIFBhZGRpbmcgKi8KKwl1aW50OF90ICpidWYgPSAodWludDhfdCopY3R4LT5zdGF0ZTsKKwlidWZbY3R4LT5ieXRlc19xdWV1ZWRdICAgXj0gMTsKKwlidWZbU0hBM19JQkxLX0JZVEVTIC0gMV0gXj0gMHg4MDsKKworCXNoYTNfcHJvY2Vzc19ibG9jazcyKGN0eC0+c3RhdGUpOworCisJLyogT3V0cHV0ICovCisJbWVtY3B5KHJlc2J1ZiwgY3R4LT5zdGF0ZSwgNjQpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvaGFzaF9tZDVwcmltZS5jIGIvbGliYmIvaGFzaF9tZDVwcmltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwODlhMTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9oYXNoX21kNXByaW1lLmMKQEAgLTAsMCArMSw0NjAgQEAKKy8qIFRoaXMgZmlsZSBpcyBub3QgdXNlZCBieSBidXN5Ym94IHJpZ2h0IG5vdy4KKyAqIEhvd2V2ZXIsIHRoZSBjb2RlIGhlcmUgc2VlbXMgdG8gYmUgYSB0aW55IGJpdCBzbWFsbGVyCisgKiB0aGFuIG9uZSBpbiBtZDUuYy4gTmVlZCB0byBpbnZlc3RpZ2F0ZSB3aGljaCBvbmUKKyAqIGlzIGJldHRlciBvdmVyYWxsLi4uCisgKiBIaW50OiBncmVwIGZvciBtZDVwcmltZSB0byBmaW5kIHBsYWNlcyB3aGVyZSB5b3UgY2FuIHN3aXRjaAorICogbWQ1LmMvbWQ1cHJpbWUuYworICovCisKKy8qCisgKiBNRDVDLkMgLSBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiwgTUQ1IG1lc3NhZ2UtZGlnZXN0IGFsZ29yaXRobQorICoKKyAqIENvcHlyaWdodCAoQykgMTk5MS0yLCBSU0EgRGF0YSBTZWN1cml0eSwgSW5jLiBDcmVhdGVkIDE5OTEuIEFsbAorICogcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIExpY2Vuc2UgdG8gY29weSBhbmQgdXNlIHRoaXMgc29mdHdhcmUgaXMgZ3JhbnRlZCBwcm92aWRlZCB0aGF0IGl0CisgKiBpcyBpZGVudGlmaWVkIGFzIHRoZSAiUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2UtRGlnZXN0CisgKiBBbGdvcml0aG0iIGluIGFsbCBtYXRlcmlhbCBtZW50aW9uaW5nIG9yIHJlZmVyZW5jaW5nIHRoaXMgc29mdHdhcmUKKyAqIG9yIHRoaXMgZnVuY3Rpb24uCisgKgorICogTGljZW5zZSBpcyBhbHNvIGdyYW50ZWQgdG8gbWFrZSBhbmQgdXNlIGRlcml2YXRpdmUgd29ya3MgcHJvdmlkZWQKKyAqIHRoYXQgc3VjaCB3b3JrcyBhcmUgaWRlbnRpZmllZCBhcyAiZGVyaXZlZCBmcm9tIHRoZSBSU0EgRGF0YQorICogU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2UtRGlnZXN0IEFsZ29yaXRobSIgaW4gYWxsIG1hdGVyaWFsCisgKiBtZW50aW9uaW5nIG9yIHJlZmVyZW5jaW5nIHRoZSBkZXJpdmVkIHdvcmsuCisgKgorICogUlNBIERhdGEgU2VjdXJpdHksIEluYy4gbWFrZXMgbm8gcmVwcmVzZW50YXRpb25zIGNvbmNlcm5pbmcgZWl0aGVyCisgKiB0aGUgbWVyY2hhbnRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgb3IgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMKKyAqIHNvZnR3YXJlIGZvciBhbnkgcGFydGljdWxhciBwdXJwb3NlLiBJdCBpcyBwcm92aWRlZCAiYXMgaXMiCisgKiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eSBvZiBhbnkga2luZC4KKyAqCisgKiBUaGVzZSBub3RpY2VzIG11c3QgYmUgcmV0YWluZWQgaW4gYW55IGNvcGllcyBvZiBhbnkgcGFydCBvZiB0aGlzCisgKiBkb2N1bWVudGF0aW9uIGFuZC9vciBzb2Z0d2FyZS4KKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9saWJtZC9tZDVjLmMsdiAxLjkuMi4xIDE5OTkvMDgvMjkgMTQ6NTc6MTIgcGV0ZXIgRXhwICQKKyAqCisgKiBUaGlzIGNvZGUgaXMgdGhlIHNhbWUgYXMgdGhlIGNvZGUgcHVibGlzaGVkIGJ5IFJTQSBJbmMuICBJdCBoYXMgYmVlbgorICogZWRpdGVkIGZvciBjbGFyaXR5IGFuZCBzdHlsZSBvbmx5LgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFRoZSBtZDVfY3J5cHQoKSBmdW5jdGlvbiB3YXMgdGFrZW4gZnJvbSBmcmVlQlNEJ3MgbGliY3J5cHQgYW5kIGNvbnRhaW5zCisgKiB0aGlzIGxpY2Vuc2U6CisgKiAgICAiVEhFIEJFRVItV0FSRSBMSUNFTlNFIiAoUmV2aXNpb24gNDIpOgorICogICAgIDxwaGtAbG9naW4uZGtuZXQuZGs+IHdyb3RlIHRoaXMgZmlsZS4gIEFzIGxvbmcgYXMgeW91IHJldGFpbiB0aGlzIG5vdGljZSB5b3UKKyAqICAgICBjYW4gZG8gd2hhdGV2ZXIgeW91IHdhbnQgd2l0aCB0aGlzIHN0dWZmLiBJZiB3ZSBtZWV0IHNvbWUgZGF5LCBhbmQgeW91IHRoaW5rCisgKiAgICAgdGhpcyBzdHVmZiBpcyB3b3J0aCBpdCwgeW91IGNhbiBidXkgbWUgYSBiZWVyIGluIHJldHVybi4gICBQb3VsLUhlbm5pbmcgS2FtcAorICoKKyAqICRGcmVlQlNEOiBzcmMvbGliL2xpYmNyeXB0L2NyeXB0LmMsdiAxLjcuMi4xIDE5OTkvMDgvMjkgMTQ6NTY6MzMgcGV0ZXIgRXhwICQKKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBPbiBBcHJpbCAxOXRoLCAyMDAxIG1kNV9jcnlwdCgpIHdhcyBtb2RpZmllZCB0byBtYWtlIGl0IHJlZW50cmFudAorICogYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AdWNsaWJjLm9yZz4KKyAqCisgKiBKdW5lIDI4LCAyMDAxICAgICAgICAgICAgIE1hbnVlbCBOb3ZvYSBJSUkKKyAqCisgKiAiVW4taW5saW5lZCIgY29kZSB1c2luZyBsb29wcyBhbmQgc3RhdGljIGNvbnN0IHRhYmxlcyBpbiBvcmRlciB0bworICogcmVkdWNlIGdlbmVyYXRlZCBjb2RlIHNpemUgKG9uIGkzODYgZnJvbSBhcHByb3ggNGsgdG8gYXBwcm94IDIuNWspLgorICoKKyAqIEp1bmUgMjksIDIwMDEgICAgICAgICAgICAgTWFudWVsIE5vdm9hIElJSQorICoKKyAqIENvbXBsZXRlbHkgcmVtb3ZlZCBzdGF0aWMgUEFERElORyBhcnJheS4KKyAqCisgKiBSZWludHJvZHVjZWQgdGhlIGxvb3AgdW5yb2xsaW5nIGluIG1kNV90cmFuc2Zvcm0gYW5kIGFkZGVkIHRoZQorICogTUQ1X1NNQUxMIG9wdGlvbiBmb3IgY29uZmlndXJhYmlsaXR5LiAgRGVmaW5lIGJlbG93IGFzOgorICogICAgICAgMCAgICBmdWxseSB1bnJvbGxlZCBsb29wcworICogICAgICAgMSAgICBwYXJ0aWFsbHkgdW5yb2xsZWQgKDQgb3BzIHBlciBsb29wKQorICogICAgICAgMiAgICBubyB1bnJvbGxpbmcgLS0gaW50cm9kdWNlcyB0aGUgbmVlZCB0byBzd2FwIDQgdmFyaWFibGVzIChzbG93KQorICogICAgICAgMyAgICBubyB1bnJvbGxpbmcgYW5kIGFsbCA0IGxvb3BzIG1lcmdlZCBpbnRvIG9uZSB3aXRoIHN3aXRjaAorICogICAgICAgICAgICAgICBpbiBlYWNoIGxvb3AgKGdsYWNpYWwpCisgKiBPbiBpMzg2LCBzaXplcyBhcmUgcm91Z2hseSAoLU9zIC1mbm8tYnVpbHRpbik6CisgKiAgICAgMDogM2sgICAgIDE6IDIuNWsgICAgIDI6IDIuMmsgICAgIDM6IDJrCisgKgorICogU2luY2UgU3VTdjMgZG9lcyBub3QgcmVxdWlyZSBjcnlwdF9yLCBtb2RpZmllZCBhZ2FpbiBBdWd1c3QgNywgMjAwMgorICogYnkgRXJpayBBbmRlcnNlbiB0byByZW1vdmUgcmVlbnRyYW5jZSBzdHVmZi4uLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiAxOiBmYXN0ZXN0LCAzOiBzbWFsbGVzdCAqLworI2lmIENPTkZJR19NRDVfU01BTEwgPCAxCisjIGRlZmluZSBNRDVfU01BTEwgMQorI2VsaWYgQ09ORklHX01ENV9TTUFMTCA+IDMKKyMgZGVmaW5lIE1ENV9TTUFMTCAzCisjZWxzZQorIyBkZWZpbmUgTUQ1X1NNQUxMIENPTkZJR19NRDVfU01BTEwKKyNlbmRpZgorCisjaWYgQkJfTElUVExFX0VORElBTgorI2RlZmluZSBtZW1jcHkzMl9jcHUybGUgbWVtY3B5CisjZGVmaW5lIG1lbWNweTMyX2xlMmNwdSBtZW1jcHkKKyNlbHNlCisvKiBFbmNvZGVzIGlucHV0ICh1aW50MzJfdCkgaW50byBvdXRwdXQgKHVuc2lnbmVkIGNoYXIpLgorICogQXNzdW1lcyBsZW4gaXMgYSBtdWx0aXBsZSBvZiA0LiAqLworc3RhdGljIHZvaWQKK21lbWNweTMyX2NwdTJsZSh1bnNpZ25lZCBjaGFyICpvdXRwdXQsIHVpbnQzMl90ICppbnB1dCwgdW5zaWduZWQgbGVuKQoreworCXVuc2lnbmVkIGksIGo7CisJZm9yIChpID0gMCwgaiA9IDA7IGogPCBsZW47IGkrKywgaiArPSA0KSB7CisJCW91dHB1dFtqXSA9IGlucHV0W2ldOworCQlvdXRwdXRbaisxXSA9IChpbnB1dFtpXSA+PiA4KTsKKwkJb3V0cHV0W2orMl0gPSAoaW5wdXRbaV0gPj4gMTYpOworCQlvdXRwdXRbaiszXSA9IChpbnB1dFtpXSA+PiAyNCk7CisJfQorfQorLyogRGVjb2RlcyBpbnB1dCAodW5zaWduZWQgY2hhcikgaW50byBvdXRwdXQgKHVpbnQzMl90KS4KKyAqIEFzc3VtZXMgbGVuIGlzIGEgbXVsdGlwbGUgb2YgNC4gKi8KK3N0YXRpYyB2b2lkCittZW1jcHkzMl9sZTJjcHUodWludDMyX3QgKm91dHB1dCwgY29uc3QgdW5zaWduZWQgY2hhciAqaW5wdXQsIHVuc2lnbmVkIGxlbikKK3sKKwl1bnNpZ25lZCBpLCBqOworCWZvciAoaSA9IDAsIGogPSAwOyBqIDwgbGVuOyBpKyssIGogKz0gNCkKKwkJb3V0cHV0W2ldID0gKCh1aW50MzJfdClpbnB1dFtqXSkKKwkJCXwgKCgodWludDMyX3QpaW5wdXRbaisxXSkgPDwgOCkKKwkJCXwgKCgodWludDMyX3QpaW5wdXRbaisyXSkgPDwgMTYpCisJCQl8ICgoKHVpbnQzMl90KWlucHV0W2orM10pIDw8IDI0KTsKK30KKyNlbmRpZiAvKiBpMzg2ICovCisKKy8qIEYsIEcsIEggYW5kIEkgYXJlIGJhc2ljIE1ENSBmdW5jdGlvbnMuICovCisjZGVmaW5lIEYoeCwgeSwgeikgKCgoeCkgJiAoeSkpIHwgKH4oeCkgJiAoeikpKQorI2RlZmluZSBHKHgsIHksIHopICgoKHgpICYgKHopKSB8ICgoeSkgJiB+KHopKSkKKyNkZWZpbmUgSCh4LCB5LCB6KSAoKHgpIF4gKHkpIF4gKHopKQorI2RlZmluZSBJKHgsIHksIHopICgoeSkgXiAoKHgpIHwgfih6KSkpCisKKy8qIHJvdGwzMiByb3RhdGVzIHggbGVmdCBuIGJpdHMuICovCisjZGVmaW5lIHJvdGwzMih4LCBuKSAoKCh4KSA8PCAobikpIHwgKCh4KSA+PiAoMzIgLSAobikpKSkKKworLyoKKyAqIEZGLCBHRywgSEgsIGFuZCBJSSB0cmFuc2Zvcm1hdGlvbnMgZm9yIHJvdW5kcyAxLCAyLCAzLCBhbmQgNC4KKyAqIFJvdGF0aW9uIGlzIHNlcGFyYXRlIGZyb20gYWRkaXRpb24gdG8gcHJldmVudCByZWNvbXB1dGF0aW9uLgorICovCisjZGVmaW5lIEZGKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7IFwKKwkoYSkgKz0gRigoYiksIChjKSwgKGQpKSArICh4KSArICh1aW50MzJfdCkoYWMpOyBcCisJKGEpID0gcm90bDMyKChhKSwgKHMpKTsgXAorCShhKSArPSAoYik7IFwKKwl9CisjZGVmaW5lIEdHKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7IFwKKwkoYSkgKz0gRygoYiksIChjKSwgKGQpKSArICh4KSArICh1aW50MzJfdCkoYWMpOyBcCisJKGEpID0gcm90bDMyKChhKSwgKHMpKTsgXAorCShhKSArPSAoYik7IFwKKwl9CisjZGVmaW5lIEhIKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7IFwKKwkoYSkgKz0gSCgoYiksIChjKSwgKGQpKSArICh4KSArICh1aW50MzJfdCkoYWMpOyBcCisJKGEpID0gcm90bDMyKChhKSwgKHMpKTsgXAorCShhKSArPSAoYik7IFwKKwl9CisjZGVmaW5lIElJKGEsIGIsIGMsIGQsIHgsIHMsIGFjKSB7IFwKKwkoYSkgKz0gSSgoYiksIChjKSwgKGQpKSArICh4KSArICh1aW50MzJfdCkoYWMpOyBcCisJKGEpID0gcm90bDMyKChhKSwgKHMpKTsgXAorCShhKSArPSAoYik7IFwKKwl9CisKKy8qIE1ENSBiYXNpYyB0cmFuc2Zvcm1hdGlvbi4gVHJhbnNmb3JtcyBzdGF0ZSBiYXNlZCBvbiBibG9jay4gKi8KK3N0YXRpYyB2b2lkIG1kNV90cmFuc2Zvcm0odWludDMyX3Qgc3RhdGVbNF0sIGNvbnN0IHVuc2lnbmVkIGNoYXIgYmxvY2tbNjRdKQoreworCXVpbnQzMl90IGEsIGIsIGMsIGQsIHhbMTZdOworI2lmIE1ENV9TTUFMTCA+IDEKKwl1aW50MzJfdCB0ZW1wOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnBzOworCisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgU1tdID0geworCQk3LCAxMiwgMTcsIDIyLAorCQk1LCA5LCAxNCwgMjAsCisJCTQsIDExLCAxNiwgMjMsCisJCTYsIDEwLCAxNSwgMjEKKwl9OworI2VuZGlmIC8qIE1ENV9TTUFMTCA+IDEgKi8KKworI2lmIE1ENV9TTUFMTCA+IDAKKwljb25zdCB1aW50MzJfdCAqcGM7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcHA7CisJaW50IGk7CisKKwlzdGF0aWMgY29uc3QgdWludDMyX3QgQ1tdID0geworCQkvKiByb3VuZCAxICovCisJCTB4ZDc2YWE0NzgsIDB4ZThjN2I3NTYsIDB4MjQyMDcwZGIsIDB4YzFiZGNlZWUsCisJCTB4ZjU3YzBmYWYsIDB4NDc4N2M2MmEsIDB4YTgzMDQ2MTMsIDB4ZmQ0Njk1MDEsCisJCTB4Njk4MDk4ZDgsIDB4OGI0NGY3YWYsIDB4ZmZmZjViYjEsIDB4ODk1Y2Q3YmUsCisJCTB4NmI5MDExMjIsIDB4ZmQ5ODcxOTMsIDB4YTY3OTQzOGUsIDB4NDliNDA4MjEsCisJCS8qIHJvdW5kIDIgKi8KKwkJMHhmNjFlMjU2MiwgMHhjMDQwYjM0MCwgMHgyNjVlNWE1MSwgMHhlOWI2YzdhYSwKKwkJMHhkNjJmMTA1ZCwgMHgyNDQxNDUzLCAgMHhkOGExZTY4MSwgMHhlN2QzZmJjOCwKKwkJMHgyMWUxY2RlNiwgMHhjMzM3MDdkNiwgMHhmNGQ1MGQ4NywgMHg0NTVhMTRlZCwKKwkJMHhhOWUzZTkwNSwgMHhmY2VmYTNmOCwgMHg2NzZmMDJkOSwgMHg4ZDJhNGM4YSwKKwkJLyogcm91bmQgMyAqLworCQkweGZmZmEzOTQyLCAweDg3NzFmNjgxLCAweDZkOWQ2MTIyLCAweGZkZTUzODBjLAorCQkweGE0YmVlYTQ0LCAweDRiZGVjZmE5LCAweGY2YmI0YjYwLCAweGJlYmZiYzcwLAorCQkweDI4OWI3ZWM2LCAweGVhYTEyN2ZhLCAweGQ0ZWYzMDg1LCAweDQ4ODFkMDUsCisJCTB4ZDlkNGQwMzksIDB4ZTZkYjk5ZTUsIDB4MWZhMjdjZjgsIDB4YzRhYzU2NjUsCisJCS8qIHJvdW5kIDQgKi8KKwkJMHhmNDI5MjI0NCwgMHg0MzJhZmY5NywgMHhhYjk0MjNhNywgMHhmYzkzYTAzOSwKKwkJMHg2NTViNTljMywgMHg4ZjBjY2M5MiwgMHhmZmVmZjQ3ZCwgMHg4NTg0NWRkMSwKKwkJMHg2ZmE4N2U0ZiwgMHhmZTJjZTZlMCwgMHhhMzAxNDMxNCwgMHg0ZTA4MTFhMSwKKwkJMHhmNzUzN2U4MiwgMHhiZDNhZjIzNSwgMHgyYWQ3ZDJiYiwgMHhlYjg2ZDM5MQorCX07CisJc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgUFtdID0geworCQkwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAvKiAxICovCisJCTEsIDYsIDExLCAwLCA1LCAxMCwgMTUsIDQsIDksIDE0LCAzLCA4LCAxMywgMiwgNywgMTIsIC8qIDIgKi8KKwkJNSwgOCwgMTEsIDE0LCAxLCA0LCA3LCAxMCwgMTMsIDAsIDMsIDYsIDksIDEyLCAxNSwgMiwgLyogMyAqLworCQkwLCA3LCAxNCwgNSwgMTIsIDMsIDEwLCAxLCA4LCAxNSwgNiwgMTMsIDQsIDExLCAyLCA5ICAvKiA0ICovCisJfTsKKworI2VuZGlmIC8qIE1ENV9TTUFMTCA+IDAgKi8KKworCW1lbWNweTMyX2xlMmNwdSh4LCBibG9jaywgNjQpOworCisJYSA9IHN0YXRlWzBdOworCWIgPSBzdGF0ZVsxXTsKKwljID0gc3RhdGVbMl07CisJZCA9IHN0YXRlWzNdOworCisjaWYgTUQ1X1NNQUxMID4gMgorCXBjID0gQzsKKwlwcCA9IFA7CisJcHMgPSBTIC0gNDsKKwlmb3IgKGkgPSAwOyBpIDwgNjQ7IGkrKykgeworCQlpZiAoKGkgJiAweDBmKSA9PSAwKSBwcyArPSA0OworCQl0ZW1wID0gYTsKKwkJc3dpdGNoIChpPj40KSB7CisJCQljYXNlIDA6CisJCQkJdGVtcCArPSBGKGIsIGMsIGQpOworCQkJCWJyZWFrOworCQkJY2FzZSAxOgorCQkJCXRlbXAgKz0gRyhiLCBjLCBkKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMjoKKwkJCQl0ZW1wICs9IEgoYiwgYywgZCk7CisJCQkJYnJlYWs7CisJCQljYXNlIDM6CisJCQkJdGVtcCArPSBJKGIsIGMsIGQpOworCQkJCWJyZWFrOworCQl9CisJCXRlbXAgKz0geFsqcHArK10gKyAqcGMrKzsKKwkJdGVtcCA9IHJvdGwzMih0ZW1wLCBwc1tpICYgM10pOworCQl0ZW1wICs9IGI7CisJCWEgPSBkOyBkID0gYzsgYyA9IGI7IGIgPSB0ZW1wOworCX0KKyNlbGlmIE1ENV9TTUFMTCA+IDEKKwlwYyA9IEM7CisJcHAgPSBQOworCXBzID0gUzsKKwkvKiBSb3VuZCAxICovCisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJRkYoYSwgYiwgYywgZCwgeFsqcHBdLCBwc1tpICYgMHgzXSwgKnBjKTsgcHArKzsgcGMrKzsKKwkJdGVtcCA9IGQ7IGQgPSBjOyBjID0gYjsgYiA9IGE7IGEgPSB0ZW1wOworCX0KKwkvKiBSb3VuZCAyICovCisJcHMgKz0gNDsKKwlmb3IgKDsgaSA8IDMyOyBpKyspIHsKKwkJR0coYSwgYiwgYywgZCwgeFsqcHBdLCBwc1tpICYgMHgzXSwgKnBjKTsgcHArKzsgcGMrKzsKKwkJdGVtcCA9IGQ7IGQgPSBjOyBjID0gYjsgYiA9IGE7IGEgPSB0ZW1wOworCX0KKwkvKiBSb3VuZCAzICovCisJcHMgKz0gNDsKKwlmb3IgKDsgaSA8IDQ4OyBpKyspIHsKKwkJSEgoYSwgYiwgYywgZCwgeFsqcHBdLCBwc1tpICYgMHgzXSwgKnBjKTsgcHArKzsgcGMrKzsKKwkJdGVtcCA9IGQ7IGQgPSBjOyBjID0gYjsgYiA9IGE7IGEgPSB0ZW1wOworCX0KKwkvKiBSb3VuZCA0ICovCisJcHMgKz0gNDsKKwlmb3IgKDsgaSA8IDY0OyBpKyspIHsKKwkJSUkoYSwgYiwgYywgZCwgeFsqcHBdLCBwc1tpICYgMHgzXSwgKnBjKTsgcHArKzsgcGMrKzsKKwkJdGVtcCA9IGQ7IGQgPSBjOyBjID0gYjsgYiA9IGE7IGEgPSB0ZW1wOworCX0KKyNlbGlmIE1ENV9TTUFMTCA+IDAKKwlwYyA9IEM7CisJcHAgPSBQOworCS8qIFJvdW5kIDEgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCUZGKGEsIGIsIGMsIGQsIHhbKnBwXSwgIDcsICpwYyk7IHBwKys7IHBjKys7CisJCUZGKGQsIGEsIGIsIGMsIHhbKnBwXSwgMTIsICpwYyk7IHBwKys7IHBjKys7CisJCUZGKGMsIGQsIGEsIGIsIHhbKnBwXSwgMTcsICpwYyk7IHBwKys7IHBjKys7CisJCUZGKGIsIGMsIGQsIGEsIHhbKnBwXSwgMjIsICpwYyk7IHBwKys7IHBjKys7CisJfQorCS8qIFJvdW5kIDIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCUdHKGEsIGIsIGMsIGQsIHhbKnBwXSwgIDUsICpwYyk7IHBwKys7IHBjKys7CisJCUdHKGQsIGEsIGIsIGMsIHhbKnBwXSwgIDksICpwYyk7IHBwKys7IHBjKys7CisJCUdHKGMsIGQsIGEsIGIsIHhbKnBwXSwgMTQsICpwYyk7IHBwKys7IHBjKys7CisJCUdHKGIsIGMsIGQsIGEsIHhbKnBwXSwgMjAsICpwYyk7IHBwKys7IHBjKys7CisJfQorCS8qIFJvdW5kIDMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCUhIKGEsIGIsIGMsIGQsIHhbKnBwXSwgIDQsICpwYyk7IHBwKys7IHBjKys7CisJCUhIKGQsIGEsIGIsIGMsIHhbKnBwXSwgMTEsICpwYyk7IHBwKys7IHBjKys7CisJCUhIKGMsIGQsIGEsIGIsIHhbKnBwXSwgMTYsICpwYyk7IHBwKys7IHBjKys7CisJCUhIKGIsIGMsIGQsIGEsIHhbKnBwXSwgMjMsICpwYyk7IHBwKys7IHBjKys7CisJfQorCS8qIFJvdW5kIDQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisJCUlJKGEsIGIsIGMsIGQsIHhbKnBwXSwgIDYsICpwYyk7IHBwKys7IHBjKys7CisJCUlJKGQsIGEsIGIsIGMsIHhbKnBwXSwgMTAsICpwYyk7IHBwKys7IHBjKys7CisJCUlJKGMsIGQsIGEsIGIsIHhbKnBwXSwgMTUsICpwYyk7IHBwKys7IHBjKys7CisJCUlJKGIsIGMsIGQsIGEsIHhbKnBwXSwgMjEsICpwYyk7IHBwKys7IHBjKys7CisJfQorI2Vsc2UKKwkvKiBSb3VuZCAxICovCisjZGVmaW5lIFMxMSA3CisjZGVmaW5lIFMxMiAxMgorI2RlZmluZSBTMTMgMTcKKyNkZWZpbmUgUzE0IDIyCisJRkYoYSwgYiwgYywgZCwgeFsgMF0sIFMxMSwgMHhkNzZhYTQ3OCk7IC8qIDEgKi8KKwlGRihkLCBhLCBiLCBjLCB4WyAxXSwgUzEyLCAweGU4YzdiNzU2KTsgLyogMiAqLworCUZGKGMsIGQsIGEsIGIsIHhbIDJdLCBTMTMsIDB4MjQyMDcwZGIpOyAvKiAzICovCisJRkYoYiwgYywgZCwgYSwgeFsgM10sIFMxNCwgMHhjMWJkY2VlZSk7IC8qIDQgKi8KKwlGRihhLCBiLCBjLCBkLCB4WyA0XSwgUzExLCAweGY1N2MwZmFmKTsgLyogNSAqLworCUZGKGQsIGEsIGIsIGMsIHhbIDVdLCBTMTIsIDB4NDc4N2M2MmEpOyAvKiA2ICovCisJRkYoYywgZCwgYSwgYiwgeFsgNl0sIFMxMywgMHhhODMwNDYxMyk7IC8qIDcgKi8KKwlGRihiLCBjLCBkLCBhLCB4WyA3XSwgUzE0LCAweGZkNDY5NTAxKTsgLyogOCAqLworCUZGKGEsIGIsIGMsIGQsIHhbIDhdLCBTMTEsIDB4Njk4MDk4ZDgpOyAvKiA5ICovCisJRkYoZCwgYSwgYiwgYywgeFsgOV0sIFMxMiwgMHg4YjQ0ZjdhZik7IC8qIDEwICovCisJRkYoYywgZCwgYSwgYiwgeFsxMF0sIFMxMywgMHhmZmZmNWJiMSk7IC8qIDExICovCisJRkYoYiwgYywgZCwgYSwgeFsxMV0sIFMxNCwgMHg4OTVjZDdiZSk7IC8qIDEyICovCisJRkYoYSwgYiwgYywgZCwgeFsxMl0sIFMxMSwgMHg2YjkwMTEyMik7IC8qIDEzICovCisJRkYoZCwgYSwgYiwgYywgeFsxM10sIFMxMiwgMHhmZDk4NzE5Myk7IC8qIDE0ICovCisJRkYoYywgZCwgYSwgYiwgeFsxNF0sIFMxMywgMHhhNjc5NDM4ZSk7IC8qIDE1ICovCisJRkYoYiwgYywgZCwgYSwgeFsxNV0sIFMxNCwgMHg0OWI0MDgyMSk7IC8qIDE2ICovCisJLyogUm91bmQgMiAqLworI2RlZmluZSBTMjEgNQorI2RlZmluZSBTMjIgOQorI2RlZmluZSBTMjMgMTQKKyNkZWZpbmUgUzI0IDIwCisJR0coYSwgYiwgYywgZCwgeFsgMV0sIFMyMSwgMHhmNjFlMjU2Mik7IC8qIDE3ICovCisJR0coZCwgYSwgYiwgYywgeFsgNl0sIFMyMiwgMHhjMDQwYjM0MCk7IC8qIDE4ICovCisJR0coYywgZCwgYSwgYiwgeFsxMV0sIFMyMywgMHgyNjVlNWE1MSk7IC8qIDE5ICovCisJR0coYiwgYywgZCwgYSwgeFsgMF0sIFMyNCwgMHhlOWI2YzdhYSk7IC8qIDIwICovCisJR0coYSwgYiwgYywgZCwgeFsgNV0sIFMyMSwgMHhkNjJmMTA1ZCk7IC8qIDIxICovCisJR0coZCwgYSwgYiwgYywgeFsxMF0sIFMyMiwgIDB4MjQ0MTQ1Myk7IC8qIDIyICovCisJR0coYywgZCwgYSwgYiwgeFsxNV0sIFMyMywgMHhkOGExZTY4MSk7IC8qIDIzICovCisJR0coYiwgYywgZCwgYSwgeFsgNF0sIFMyNCwgMHhlN2QzZmJjOCk7IC8qIDI0ICovCisJR0coYSwgYiwgYywgZCwgeFsgOV0sIFMyMSwgMHgyMWUxY2RlNik7IC8qIDI1ICovCisJR0coZCwgYSwgYiwgYywgeFsxNF0sIFMyMiwgMHhjMzM3MDdkNik7IC8qIDI2ICovCisJR0coYywgZCwgYSwgYiwgeFsgM10sIFMyMywgMHhmNGQ1MGQ4Nyk7IC8qIDI3ICovCisJR0coYiwgYywgZCwgYSwgeFsgOF0sIFMyNCwgMHg0NTVhMTRlZCk7IC8qIDI4ICovCisJR0coYSwgYiwgYywgZCwgeFsxM10sIFMyMSwgMHhhOWUzZTkwNSk7IC8qIDI5ICovCisJR0coZCwgYSwgYiwgYywgeFsgMl0sIFMyMiwgMHhmY2VmYTNmOCk7IC8qIDMwICovCisJR0coYywgZCwgYSwgYiwgeFsgN10sIFMyMywgMHg2NzZmMDJkOSk7IC8qIDMxICovCisJR0coYiwgYywgZCwgYSwgeFsxMl0sIFMyNCwgMHg4ZDJhNGM4YSk7IC8qIDMyICovCisJLyogUm91bmQgMyAqLworI2RlZmluZSBTMzEgNAorI2RlZmluZSBTMzIgMTEKKyNkZWZpbmUgUzMzIDE2CisjZGVmaW5lIFMzNCAyMworCUhIKGEsIGIsIGMsIGQsIHhbIDVdLCBTMzEsIDB4ZmZmYTM5NDIpOyAvKiAzMyAqLworCUhIKGQsIGEsIGIsIGMsIHhbIDhdLCBTMzIsIDB4ODc3MWY2ODEpOyAvKiAzNCAqLworCUhIKGMsIGQsIGEsIGIsIHhbMTFdLCBTMzMsIDB4NmQ5ZDYxMjIpOyAvKiAzNSAqLworCUhIKGIsIGMsIGQsIGEsIHhbMTRdLCBTMzQsIDB4ZmRlNTM4MGMpOyAvKiAzNiAqLworCUhIKGEsIGIsIGMsIGQsIHhbIDFdLCBTMzEsIDB4YTRiZWVhNDQpOyAvKiAzNyAqLworCUhIKGQsIGEsIGIsIGMsIHhbIDRdLCBTMzIsIDB4NGJkZWNmYTkpOyAvKiAzOCAqLworCUhIKGMsIGQsIGEsIGIsIHhbIDddLCBTMzMsIDB4ZjZiYjRiNjApOyAvKiAzOSAqLworCUhIKGIsIGMsIGQsIGEsIHhbMTBdLCBTMzQsIDB4YmViZmJjNzApOyAvKiA0MCAqLworCUhIKGEsIGIsIGMsIGQsIHhbMTNdLCBTMzEsIDB4Mjg5YjdlYzYpOyAvKiA0MSAqLworCUhIKGQsIGEsIGIsIGMsIHhbIDBdLCBTMzIsIDB4ZWFhMTI3ZmEpOyAvKiA0MiAqLworCUhIKGMsIGQsIGEsIGIsIHhbIDNdLCBTMzMsIDB4ZDRlZjMwODUpOyAvKiA0MyAqLworCUhIKGIsIGMsIGQsIGEsIHhbIDZdLCBTMzQsICAweDQ4ODFkMDUpOyAvKiA0NCAqLworCUhIKGEsIGIsIGMsIGQsIHhbIDldLCBTMzEsIDB4ZDlkNGQwMzkpOyAvKiA0NSAqLworCUhIKGQsIGEsIGIsIGMsIHhbMTJdLCBTMzIsIDB4ZTZkYjk5ZTUpOyAvKiA0NiAqLworCUhIKGMsIGQsIGEsIGIsIHhbMTVdLCBTMzMsIDB4MWZhMjdjZjgpOyAvKiA0NyAqLworCUhIKGIsIGMsIGQsIGEsIHhbIDJdLCBTMzQsIDB4YzRhYzU2NjUpOyAvKiA0OCAqLworCS8qIFJvdW5kIDQgKi8KKyNkZWZpbmUgUzQxIDYKKyNkZWZpbmUgUzQyIDEwCisjZGVmaW5lIFM0MyAxNQorI2RlZmluZSBTNDQgMjEKKwlJSShhLCBiLCBjLCBkLCB4WyAwXSwgUzQxLCAweGY0MjkyMjQ0KTsgLyogNDkgKi8KKwlJSShkLCBhLCBiLCBjLCB4WyA3XSwgUzQyLCAweDQzMmFmZjk3KTsgLyogNTAgKi8KKwlJSShjLCBkLCBhLCBiLCB4WzE0XSwgUzQzLCAweGFiOTQyM2E3KTsgLyogNTEgKi8KKwlJSShiLCBjLCBkLCBhLCB4WyA1XSwgUzQ0LCAweGZjOTNhMDM5KTsgLyogNTIgKi8KKwlJSShhLCBiLCBjLCBkLCB4WzEyXSwgUzQxLCAweDY1NWI1OWMzKTsgLyogNTMgKi8KKwlJSShkLCBhLCBiLCBjLCB4WyAzXSwgUzQyLCAweDhmMGNjYzkyKTsgLyogNTQgKi8KKwlJSShjLCBkLCBhLCBiLCB4WzEwXSwgUzQzLCAweGZmZWZmNDdkKTsgLyogNTUgKi8KKwlJSShiLCBjLCBkLCBhLCB4WyAxXSwgUzQ0LCAweDg1ODQ1ZGQxKTsgLyogNTYgKi8KKwlJSShhLCBiLCBjLCBkLCB4WyA4XSwgUzQxLCAweDZmYTg3ZTRmKTsgLyogNTcgKi8KKwlJSShkLCBhLCBiLCBjLCB4WzE1XSwgUzQyLCAweGZlMmNlNmUwKTsgLyogNTggKi8KKwlJSShjLCBkLCBhLCBiLCB4WyA2XSwgUzQzLCAweGEzMDE0MzE0KTsgLyogNTkgKi8KKwlJSShiLCBjLCBkLCBhLCB4WzEzXSwgUzQ0LCAweDRlMDgxMWExKTsgLyogNjAgKi8KKwlJSShhLCBiLCBjLCBkLCB4WyA0XSwgUzQxLCAweGY3NTM3ZTgyKTsgLyogNjEgKi8KKwlJSShkLCBhLCBiLCBjLCB4WzExXSwgUzQyLCAweGJkM2FmMjM1KTsgLyogNjIgKi8KKwlJSShjLCBkLCBhLCBiLCB4WyAyXSwgUzQzLCAweDJhZDdkMmJiKTsgLyogNjMgKi8KKwlJSShiLCBjLCBkLCBhLCB4WyA5XSwgUzQ0LCAweGViODZkMzkxKTsgLyogNjQgKi8KKyNlbmRpZgorCisJc3RhdGVbMF0gKz0gYTsKKwlzdGF0ZVsxXSArPSBiOworCXN0YXRlWzJdICs9IGM7CisJc3RhdGVbM10gKz0gZDsKKworCS8qIFplcm9pemUgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLiAqLworCW1lbXNldCh4LCAwLCBzaXplb2YoeCkpOworfQorCisKKy8qIE1ENSBpbml0aWFsaXphdGlvbi4gKi8KK3ZvaWQgRkFTVF9GVU5DIG1kNV9iZWdpbihtZDVfY3R4X3QgKmNvbnRleHQpCit7CisJY29udGV4dC0+Y291bnRbMF0gPSBjb250ZXh0LT5jb3VudFsxXSA9IDA7CisJLyogTG9hZCBtYWdpYyBpbml0aWFsaXphdGlvbiBjb25zdGFudHMuICAqLworCWNvbnRleHQtPnN0YXRlWzBdID0gMHg2NzQ1MjMwMTsKKwljb250ZXh0LT5zdGF0ZVsxXSA9IDB4ZWZjZGFiODk7CisJY29udGV4dC0+c3RhdGVbMl0gPSAweDk4YmFkY2ZlOworCWNvbnRleHQtPnN0YXRlWzNdID0gMHgxMDMyNTQ3NjsKK30KKworLyoKKyAqIE1ENSBibG9jayB1cGRhdGUgb3BlcmF0aW9uLiBDb250aW51ZXMgYW4gTUQ1IG1lc3NhZ2UtZGlnZXN0CisgKiBvcGVyYXRpb24sIHByb2Nlc3NpbmcgYW5vdGhlciBtZXNzYWdlIGJsb2NrLCBhbmQgdXBkYXRpbmcKKyAqIHRoZSBjb250ZXh0LgorICovCit2b2lkIEZBU1RfRlVOQyBtZDVfaGFzaChjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBpbnB1dExlbiwgbWQ1X2N0eF90ICpjb250ZXh0KQoreworCXVuc2lnbmVkIGksIGlkeCwgcGFydExlbjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICppbnB1dCA9IGJ1ZmZlcjsKKworCS8qIENvbXB1dGUgbnVtYmVyIG9mIGJ5dGVzIG1vZCA2NCAqLworCWlkeCA9IChjb250ZXh0LT5jb3VudFswXSA+PiAzKSAmIDB4M0Y7CisKKwkvKiBVcGRhdGUgbnVtYmVyIG9mIGJpdHMgKi8KKwljb250ZXh0LT5jb3VudFswXSArPSAoaW5wdXRMZW4gPDwgMyk7CisJaWYgKGNvbnRleHQtPmNvdW50WzBdIDwgKGlucHV0TGVuIDw8IDMpKQorCQljb250ZXh0LT5jb3VudFsxXSsrOworCWNvbnRleHQtPmNvdW50WzFdICs9IChpbnB1dExlbiA+PiAyOSk7CisKKwkvKiBUcmFuc2Zvcm0gYXMgbWFueSB0aW1lcyBhcyBwb3NzaWJsZS4gKi8KKwlpID0gMDsKKwlwYXJ0TGVuID0gNjQgLSBpZHg7CisJaWYgKGlucHV0TGVuID49IHBhcnRMZW4pIHsKKwkJbWVtY3B5KCZjb250ZXh0LT5idWZmZXJbaWR4XSwgaW5wdXQsIHBhcnRMZW4pOworCQltZDVfdHJhbnNmb3JtKGNvbnRleHQtPnN0YXRlLCBjb250ZXh0LT5idWZmZXIpOworCQlmb3IgKGkgPSBwYXJ0TGVuOyBpICsgNjMgPCBpbnB1dExlbjsgaSArPSA2NCkKKwkJCW1kNV90cmFuc2Zvcm0oY29udGV4dC0+c3RhdGUsICZpbnB1dFtpXSk7CisJCWlkeCA9IDA7CisJfQorCisJLyogQnVmZmVyIHJlbWFpbmluZyBpbnB1dCAqLworCW1lbWNweSgmY29udGV4dC0+YnVmZmVyW2lkeF0sICZpbnB1dFtpXSwgaW5wdXRMZW4gLSBpKTsKK30KKworLyoKKyAqIE1ENSBmaW5hbGl6YXRpb24uIEVuZHMgYW4gTUQ1IG1lc3NhZ2UtZGlnZXN0IG9wZXJhdGlvbiwKKyAqIHdyaXRpbmcgdGhlIG1lc3NhZ2UgZGlnZXN0LgorICovCit2b2lkIEZBU1RfRlVOQyBtZDVfZW5kKHZvaWQgKmRpZ2VzdCwgbWQ1X2N0eF90ICpjb250ZXh0KQoreworCXVuc2lnbmVkIGlkeCwgcGFkTGVuOworCXVuc2lnbmVkIGNoYXIgYml0c1s4XTsKKwl1bnNpZ25lZCBjaGFyIHBhZGRpbmdbNjRdOworCisJLyogQWRkIHBhZGRpbmcgZm9sbG93ZWQgYnkgb3JpZ2luYWwgbGVuZ3RoLiAqLworCW1lbXNldChwYWRkaW5nLCAwLCBzaXplb2YocGFkZGluZykpOworCXBhZGRpbmdbMF0gPSAweDgwOworCS8qIHNhdmUgbnVtYmVyIG9mIGJpdHMgKi8KKwltZW1jcHkzMl9jcHUybGUoYml0cywgY29udGV4dC0+Y291bnQsIDgpOworCS8qIHBhZCBvdXQgdG8gNTYgbW9kIDY0ICovCisJaWR4ID0gKGNvbnRleHQtPmNvdW50WzBdID4+IDMpICYgMHgzZjsKKwlwYWRMZW4gPSAoaWR4IDwgNTYpID8gKDU2IC0gaWR4KSA6ICgxMjAgLSBpZHgpOworCW1kNV9oYXNoKHBhZGRpbmcsIHBhZExlbiwgY29udGV4dCk7CisJLyogYXBwZW5kIGxlbmd0aCAoYmVmb3JlIHBhZGRpbmcpICovCisJbWQ1X2hhc2goYml0cywgOCwgY29udGV4dCk7CisKKwkvKiBTdG9yZSBzdGF0ZSBpbiBkaWdlc3QgKi8KKwltZW1jcHkzMl9jcHUybGUoZGlnZXN0LCBjb250ZXh0LT5zdGF0ZSwgMTYpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvaGVycm9yX21zZy5jIGIvbGliYmIvaGVycm9yX21zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNDEwNzYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9oZXJyb3JfbXNnLmMKQEAgLTAsMCArMSwyOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKK3ZvaWQgRkFTVF9GVU5DIGJiX2hlcnJvcl9tc2coY29uc3QgY2hhciAqcywgLi4uKQoreworCXZhX2xpc3QgcDsKKworCXZhX3N0YXJ0KHAsIHMpOworCWJiX3ZlcnJvcl9tc2cocywgcCwgaHN0cmVycm9yKGhfZXJybm8pKTsKKwl2YV9lbmQocCk7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIGJiX2hlcnJvcl9tc2dfYW5kX2RpZShjb25zdCBjaGFyICpzLCAuLi4pCit7CisJdmFfbGlzdCBwOworCisJdmFfc3RhcnQocCwgcyk7CisJYmJfdmVycm9yX21zZyhzLCBwLCBoc3RyZXJyb3IoaF9lcnJubykpOworCXZhX2VuZChwKTsKKwl4ZnVuY19kaWUoKTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2h1bWFuX3JlYWRhYmxlLmMgYi9saWJiYi9odW1hbl9yZWFkYWJsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjN2ZjMDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9odW1hbl9yZWFkYWJsZS5jCkBAIC0wLDAgKzEsMTkyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBKdW5lIDMwLCAyMDAxICAgICAgICAgICAgICAgICBNYW51ZWwgTm92b2EgSUlJCisgKgorICogQWxsLWludGVnZXIgdmVyc2lvbiAoaGV5LCBub3QgZXZlcnlvbmUgaGFzIGZsb2F0aW5nIHBvaW50KSBvZgorICogbWFrZV9odW1hbl9yZWFkYWJsZV9zdHIsIG1vZGlmaWVkIGZyb20gc2ltaWxhciBjb2RlIEkgaGFkIHdyaXR0ZW4KKyAqIGZvciBidXN5Ym94IHNldmVyYWwgbW9udGhzIGFnby4KKyAqCisgKiBOb3RlczoKKyAqICAgMSkgSSdtIHVzaW5nIGFuIHVuc2lnbmVkIGxvbmcgbG9uZyB0byBob2xkIHRoZSBwcm9kdWN0IHNpemUgKiBibG9ja19zaXplLAorICogICAgICBhcyBkZiAod2hpY2ggY2FsbHMgdGhpcyByb3V0aW5lKSBjb3VsZCByZXF1ZXN0IGEgcmVwcmVzZW50YXRpb24gb2YgYQorICogICAgICBwYXJ0aXRpb24gc2l6ZSBpbiBieXRlcyA+IG1heCBvZiB1bnNpZ25lZCBsb25nLiAgSWYgbG9uZyBsb25ncyBhcmVuJ3QKKyAqICAgICAgYXZhaWxhYmxlLCBpdCB3b3VsZCBiZSBwb3NzaWJsZSB0byBkbyB3aGF0J3MgbmVlZGVkIHVzaW5nIHBvbHlub21pYWwKKyAqICAgICAgcmVwcmVzZW50YXRpb25zIChzYXksIHBvd2VycyBvZiAxMDI0KSBhbmQgbWFuaXB1bGF0aW5nIGNvZWZmaWNpZW50cy4KKyAqICAgICAgVGhlIGJhc2UgdGVuICJieXRlcyIgb3V0cHV0IGNvdWxkIGJlIGhhbmRsZWQgc2ltaWxhcmx5LgorICoKKyAqICAgMikgVGhpcyByb3V0aW5lIGFsd2F5cyBvdXRwdXRzIGEgZGVjaW1hbCBwb2ludCBhbmQgYSB0ZW50aHMgZGlnaXQgd2hlbgorICogICAgICBkaXNwbGF5X3VuaXQgIT0gMC4gIEhlbmNlLCBpdCBpc24ndCB1bmNvbW1vbiBmb3IgdGhlIHJldHVybmVkIHN0cmluZworICogICAgICB0byBoYXZlIGEgbGVuZ3RoIG9mIDUgb3IgNi4KKyAqCisgKiAgICAgIEl0IG1pZ2h0IGJlIG5pY2UgdG8gYWRkIGEgZmxhZyB0byBpbmRpY2F0ZSBubyBkZWNpbWFsIGRpZ2l0cyBpbgorICogICAgICB0aGF0IGNhc2UuICBUaGlzIGNvdWxkIGJlIGVpdGhlciBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciwgb3IgYQorICogICAgICBzcGVjaWFsIHZhbHVlIG9mIGRpc3BsYXlfdW5pdC4gIFN1Y2ggYSBmbGFnIHdvdWxkIGFsc28gYmUgbmljZSBmb3IgZHUuCisgKgorICogICAgICBTb21lIGNvZGUgdG8gb21pdCB0aGUgZGVjaW1hbCBwb2ludCBhbmQgdGVudGhzIGRpZ2l0IGlzIHNrZXRjaGVkIG91dAorICogICAgICBhbmQgIiNpZiAwIidkIGJlbG93LgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBtYWtlX2h1bWFuX3JlYWRhYmxlX3N0cih1bnNpZ25lZCBsb25nIGxvbmcgdmFsLAorCXVuc2lnbmVkIGxvbmcgYmxvY2tfc2l6ZSwgdW5zaWduZWQgbG9uZyBkaXNwbGF5X3VuaXQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgdW5pdF9jaGFyc1tdIEFMSUdOMSA9IHsKKwkJJ1wwJywgJ0snLCAnTScsICdHJywgJ1QnLCAnUCcsICdFJywgJ1onLCAnWScKKwl9OworCisJdW5zaWduZWQgZnJhYzsgLyogMC4uOSAtIHRoZSBmcmFjdGlvbmFsIGRpZ2l0ICovCisJY29uc3QgY2hhciAqdTsKKwljb25zdCBjaGFyICpmbXQ7CisKKwlpZiAodmFsID09IDApCisJCXJldHVybiAiMCI7CisKKwlmbXQgPSAiJWxsdSI7CisJaWYgKGJsb2NrX3NpemUgPiAxKQorCQl2YWwgKj0gYmxvY2tfc2l6ZTsKKwlmcmFjID0gMDsKKwl1ID0gdW5pdF9jaGFyczsKKworCWlmIChkaXNwbGF5X3VuaXQpIHsKKwkJdmFsICs9IGRpc3BsYXlfdW5pdC8yOyAgLyogRGVhbCB3aXRoIHJvdW5kaW5nICovCisJCXZhbCAvPSBkaXNwbGF5X3VuaXQ7ICAgIC8qIERvbid0IGNvbWJpbmUgd2l0aCB0aGUgbGluZSBhYm92ZSEgKi8KKwkJLyogd2lsbCBqdXN0IHByaW50IGl0IGFzIHVsb25nbG9uZyAoYmVsb3cpICovCisJfSBlbHNlIHsKKwkJd2hpbGUgKCh2YWwgPj0gMTAyNCkKKwkJIC8qICYmICh1IDwgdW5pdF9jaGFycyArIHNpemVvZih1bml0X2NoYXJzKSAtIDEpIC0gYWx3YXlzIHRydWUgKi8KKwkJKSB7CisJCQlmbXQgPSAiJWxsdS4ldSVjIjsKKwkJCXUrKzsKKwkJCWZyYWMgPSAoKCh1bnNpZ25lZCl2YWwgJSAxMDI0KSAqIDEwICsgMTAyNC8yKSAvIDEwMjQ7CisJCQl2YWwgLz0gMTAyNDsKKwkJfQorCQlpZiAoZnJhYyA+PSAxMCkgeyAvKiB3ZSBuZWVkIHRvIHJvdW5kIHVwIGhlcmUgKi8KKwkJCSsrdmFsOworCQkJZnJhYyA9IDA7CisJCX0KKyNpZiAxCisJCS8qIElmIGJsb2NrX3NpemUgaXMgMCwgZG9udCBwcmludCBmcmFjdGlvbmFsIHBhcnQgKi8KKwkJaWYgKGJsb2NrX3NpemUgPT0gMCkgeworCQkJaWYgKGZyYWMgPj0gNSkgeworCQkJCSsrdmFsOworCQkJfQorCQkJZm10ID0gIiVsbHUlKmMiOworCQkJZnJhYyA9IDE7CisJCX0KKyNlbmRpZgorCX0KKworCXJldHVybiBhdXRvX3N0cmluZyh4YXNwcmludGYoZm10LCB2YWwsIGZyYWMsICp1KSk7Cit9CisKKworLyogdmRhJ3MgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBzaW1pbGFyIGlkZWEgKi8KKworLyogQ29udmVydCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUgaW50byBjb21wYWN0IDUtY2hhciByZXByZXNlbnRhdGlvbi4KKyAqIFN0cmluZyBpcyBub3QgdGVybWluYXRlZCAoYnVmWzVdIGlzIHVudG91Y2hlZCkgKi8KK2NoYXIqIEZBU1RfRlVOQyBzbWFydF91bGx0b2E1KHVuc2lnbmVkIGxvbmcgbG9uZyB1bCwgY2hhciBidWZbNV0sIGNvbnN0IGNoYXIgKnNjYWxlKQoreworCWNvbnN0IGNoYXIgKmZtdDsKKwljaGFyIGM7CisJdW5zaWduZWQgdiwgdSwgaWR4ID0gMDsKKworCWlmICh1bCA+IDk5OTk5KSB7IC8vIGRvIG5vdCBzY2FsZSBpZiA5OTk5OSBvciBsZXNzCisJCXVsICo9IDEwOworCQlkbyB7CisJCQl1bCAvPSAxMDI0OworCQkJaWR4Kys7CisJCX0gd2hpbGUgKHVsID49IDEwMDAwMCk7CisJfQorCXYgPSB1bDsgLy8gdWxsb25nIGRpdmlzaW9ucyBhcmUgZXhwZW5zaXZlLCBhdm9pZCB0aGVtCisKKwlmbXQgPSAiIDEyMzQ1Njc4OSI7CisJdSA9IHYgLyAxMDsKKwl2ID0gdiAlIDEwOworCWlmICghaWR4KSB7CisJCS8vIDk5OTk5IG9yIGxlc3M6IHVzZSAiMTIzNDUiIGZvcm1hdAorCQkvLyB1IGlzIHZhbHVlLzEwLCB2IGlzIGxhc3QgZGlnaXQKKwkJYyA9IGJ1ZlswXSA9ICIgMTIzNDU2Nzg5Ilt1LzEwMDBdOworCQlpZiAoYyAhPSAnICcpIGZtdCA9ICIwMTIzNDU2Nzg5IjsKKwkJYyA9IGJ1ZlsxXSA9IGZtdFt1LzEwMCUxMF07CisJCWlmIChjICE9ICcgJykgZm10ID0gIjAxMjM0NTY3ODkiOworCQljID0gYnVmWzJdID0gZm10W3UvMTAlMTBdOworCQlpZiAoYyAhPSAnICcpIGZtdCA9ICIwMTIzNDU2Nzg5IjsKKwkJYnVmWzNdID0gZm10W3UlMTBdOworCQlidWZbNF0gPSAiMDEyMzQ1Njc4OSJbdl07CisJfSBlbHNlIHsKKwkJLy8gdmFsdWUgaGFzIGJlZW4gc2NhbGVkIGludG8gMC4uOTk5OS45IHJhbmdlCisJCS8vIHUgaXMgdmFsdWUsIHYgaXMgMS8xMHRocyAoYWxsb3dzIGZvciA5Mi4xTSBmb3JtYXQpCisJCWlmICh1ID49IDEwMCkgeworCQkJLy8gdmFsdWUgaXMgPj0gMTAwOiB1c2UgIjEyMzRNJywgIiAxMjNNIiBmb3JtYXRzCisJCQljID0gYnVmWzBdID0gIiAxMjM0NTY3ODkiW3UvMTAwMF07CisJCQlpZiAoYyAhPSAnICcpIGZtdCA9ICIwMTIzNDU2Nzg5IjsKKwkJCWMgPSBidWZbMV0gPSBmbXRbdS8xMDAlMTBdOworCQkJaWYgKGMgIT0gJyAnKSBmbXQgPSAiMDEyMzQ1Njc4OSI7CisJCQl2ID0gdSAlIDEwOworCQkJdSA9IHUgLyAxMDsKKwkJCWJ1ZlsyXSA9IGZtdFt1JTEwXTsKKwkJfSBlbHNlIHsKKwkJCS8vIHZhbHVlIGlzIDwgMTAwOiB1c2UgIjkyLjFNIiBmb3JtYXQKKwkJCWMgPSBidWZbMF0gPSAiIDEyMzQ1Njc4OSJbdS8xMF07CisJCQlpZiAoYyAhPSAnICcpIGZtdCA9ICIwMTIzNDU2Nzg5IjsKKwkJCWJ1ZlsxXSA9IGZtdFt1JTEwXTsKKwkJCWJ1ZlsyXSA9ICcuJzsKKwkJfQorCQlidWZbM10gPSAiMDEyMzQ1Njc4OSJbdl07CisJCWJ1Zls0XSA9IHNjYWxlW2lkeF07IC8qIHR5cGljYWxseSBzY2FsZSA9ICIga21ndC4uLiIgKi8KKwl9CisJcmV0dXJuIGJ1ZiArIDU7Cit9CisKKy8qIENvbnZlcnQgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlIGludG8gY29tcGFjdCA0LWNoYXIKKyAqIHJlcHJlc2VudGF0aW9uLiBFeGFtcGxlczogIjEyMzQiLCAiMS4yayIsICIgMjdNIiwgIjEyM1QiCisgKiBTdHJpbmcgaXMgbm90IHRlcm1pbmF0ZWQgKGJ1Zls0XSBpcyB1bnRvdWNoZWQpICovCitjaGFyKiBGQVNUX0ZVTkMgc21hcnRfdWxsdG9hNCh1bnNpZ25lZCBsb25nIGxvbmcgdWwsIGNoYXIgYnVmWzRdLCBjb25zdCBjaGFyICpzY2FsZSkKK3sKKwljb25zdCBjaGFyICpmbXQ7CisJY2hhciBjOworCXVuc2lnbmVkIHYsIHUsIGlkeCA9IDA7CisKKwlpZiAodWwgPiA5OTk5KSB7IC8vIGRvIG5vdCBzY2FsZSBpZiA5OTk5IG9yIGxlc3MKKwkJdWwgKj0gMTA7CisJCWRvIHsKKwkJCXVsIC89IDEwMjQ7CisJCQlpZHgrKzsKKwkJfSB3aGlsZSAodWwgPj0gMTAwMDApOworCX0KKwl2ID0gdWw7IC8vIHVsbG9uZyBkaXZpc2lvbnMgYXJlIGV4cGVuc2l2ZSwgYXZvaWQgdGhlbQorCisJZm10ID0gIiAxMjM0NTY3ODkiOworCXUgPSB2IC8gMTA7CisJdiA9IHYgJSAxMDsKKwlpZiAoIWlkeCkgeworCQkvLyA5OTk5IG9yIGxlc3M6IHVzZSAiMTIzNCIgZm9ybWF0CisJCS8vIHUgaXMgdmFsdWUvMTAsIHYgaXMgbGFzdCBkaWdpdAorCQljID0gYnVmWzBdID0gIiAxMjM0NTY3ODkiW3UvMTAwXTsKKwkJaWYgKGMgIT0gJyAnKSBmbXQgPSAiMDEyMzQ1Njc4OSI7CisJCWMgPSBidWZbMV0gPSBmbXRbdS8xMCUxMF07CisJCWlmIChjICE9ICcgJykgZm10ID0gIjAxMjM0NTY3ODkiOworCQlidWZbMl0gPSBmbXRbdSUxMF07CisJCWJ1ZlszXSA9ICIwMTIzNDU2Nzg5Ilt2XTsKKwl9IGVsc2UgeworCQkvLyB1IGlzIHZhbHVlLCB2IGlzIDEvMTB0aHMgKGFsbG93cyBmb3IgOS4yTSBmb3JtYXQpCisJCWlmICh1ID49IDEwKSB7CisJCQkvLyB2YWx1ZSBpcyA+PSAxMDogdXNlICIxMjNNJywgIiAxMk0iIGZvcm1hdHMKKwkJCWMgPSBidWZbMF0gPSAiIDEyMzQ1Njc4OSJbdS8xMDBdOworCQkJaWYgKGMgIT0gJyAnKSBmbXQgPSAiMDEyMzQ1Njc4OSI7CisJCQl2ID0gdSAlIDEwOworCQkJdSA9IHUgLyAxMDsKKwkJCWJ1ZlsxXSA9IGZtdFt1JTEwXTsKKwkJfSBlbHNlIHsKKwkJCS8vIHZhbHVlIGlzIDwgMTA6IHVzZSAiOS4yTSIgZm9ybWF0CisJCQlidWZbMF0gPSAiMDEyMzQ1Njc4OSJbdV07CisJCQlidWZbMV0gPSAnLic7CisJCX0KKwkJYnVmWzJdID0gIjAxMjM0NTY3ODkiW3ZdOworCQlidWZbM10gPSBzY2FsZVtpZHhdOyAvKiB0eXBpY2FsbHkgc2NhbGUgPSAiIGttZ3QuLi4iICovCisJfQorCXJldHVybiBidWYgKyA0OworfQpkaWZmIC0tZ2l0IGEvbGliYmIvaW5fZXRoZXIuYyBiL2xpYmJiL2luX2V0aGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxYzhlYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2luX2V0aGVyLmMKQEAgLTAsMCArMSw1OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqLworCisvL2tidWlsZDpsaWItJChDT05GSUdfQVJQKSArPSBpbl9ldGhlci5vCisvL2tidWlsZDpsaWItJChDT05GSUdfSUZDT05GSUcpICs9IGluX2V0aGVyLm8KKy8va2J1aWxkOmxpYi0kKENPTkZJR19JRkVOU0xBVkUpICs9IGluX2V0aGVyLm8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bmV0L2lmX2FycC5oPgorI2luY2x1ZGUgPG5ldC9ldGhlcm5ldC5oPgorCisvKiBDb252ZXJ0IEV0aGVybmV0IGFkZHJlc3MgZnJvbSAiWFhbOl1YWFs6XVhYWzpdWFhbOl1YWFs6XVhYIiB0byBzb2NrYWRkci4KKyAqIFJldHVybiBub256ZXJvIG9uIGVycm9yLgorICovCitpbnQgRkFTVF9GVU5DIGluX2V0aGVyKGNvbnN0IGNoYXIgKmJ1ZnAsIHN0cnVjdCBzb2NrYWRkciAqc2FwKQoreworCWNoYXIgKnB0cjsKKwlpbnQgaSwgajsKKwl1bnNpZ25lZCBjaGFyIHZhbDsKKwl1bnNpZ25lZCBjaGFyIGM7CisKKwlzYXAtPnNhX2ZhbWlseSA9IEFSUEhSRF9FVEhFUjsKKwlwdHIgPSAoY2hhciAqKSBzYXAtPnNhX2RhdGE7CisKKwlpID0gRVRIX0FMRU47CisJZ290byBmaXJzdDsKKwlkbyB7CisJCS8qIFdlIG1pZ2h0IGdldCBhIHNlbWljb2xvbiBoZXJlICovCisJCWlmICgqYnVmcCA9PSAnOicpCisJCQlidWZwKys7CisgZmlyc3Q6CisJCWogPSB2YWwgPSAwOworCQlkbyB7CisJCQljID0gKmJ1ZnA7CisJCQlpZiAoKCh1bnNpZ25lZCBjaGFyKShjIC0gJzAnKSkgPD0gOSkgeworCQkJCWMgLT0gJzAnOworCQkJfSBlbHNlIGlmICgodW5zaWduZWQgY2hhcikoKGN8MHgyMCkgLSAnYScpIDw9IDUpIHsKKwkJCQljID0gKHVuc2lnbmVkIGNoYXIpKChjfDB4MjApIC0gJ2EnKSArIDEwOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoaiAmJiAoYyA9PSAnOicgfHwgYyA9PSAnXDAnKSkKKwkJCQkJLyogT25lLWRpZ2l0IGJ5dGU6IF9fOlg6X18gKi8KKwkJCQkJYnJlYWs7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJKytidWZwOworCQkJdmFsIDw8PSA0OworCQkJdmFsICs9IGM7CisJCQlqIF49IDE7CisJCX0gd2hpbGUgKGopOworCisJCSpwdHIrKyA9IHZhbDsKKwl9IHdoaWxlICgtLWkpOworCisJLyogRXJyb3IgaWYgd2UgYXJlbid0IGF0IGVuZCBvZiBzdHJpbmcgKi8KKwlyZXR1cm4gKmJ1ZnA7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9pbmV0X2Nrc3VtLmMgYi9saWJiYi9pbmV0X2Nrc3VtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q1ZGMzYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2luZXRfY2tzdW0uYwpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ2hlY2tzdW0gcm91dGluZSBmb3IgSW50ZXJuZXQgUHJvdG9jb2wgZmFtaWx5IGhlYWRlcnMgKEMgVmVyc2lvbikKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCit1aW50MTZfdCBGQVNUX0ZVTkMgaW5ldF9ja3N1bSh1aW50MTZfdCAqYWRkciwgaW50IG5sZWZ0KQoreworCS8qCisJICogT3VyIGFsZ29yaXRobSBpcyBzaW1wbGUsIHVzaW5nIGEgMzIgYml0IGFjY3VtdWxhdG9yLAorCSAqIHdlIGFkZCBzZXF1ZW50aWFsIDE2IGJpdCB3b3JkcyB0byBpdCwgYW5kIGF0IHRoZSBlbmQsIGZvbGQKKwkgKiBiYWNrIGFsbCB0aGUgY2FycnkgYml0cyBmcm9tIHRoZSB0b3AgMTYgYml0cyBpbnRvIHRoZSBsb3dlcgorCSAqIDE2IGJpdHMuCisJICovCisJdW5zaWduZWQgc3VtID0gMDsKKwl3aGlsZSAobmxlZnQgPiAxKSB7CisJCXN1bSArPSAqYWRkcisrOworCQlubGVmdCAtPSAyOworCX0KKworCS8qIE1vcCB1cCBhbiBvZGQgYnl0ZSwgaWYgbmVjZXNzYXJ5ICovCisJaWYgKG5sZWZ0ID09IDEpIHsKKwkJaWYgKEJCX0xJVFRMRV9FTkRJQU4pCisJCQlzdW0gKz0gKih1aW50OF90KilhZGRyOworCQllbHNlCisJCQlzdW0gKz0gKih1aW50OF90KilhZGRyIDw8IDg7CisJfQorCisJLyogQWRkIGJhY2sgY2Fycnkgb3V0cyBmcm9tIHRvcCAxNiBiaXRzIHRvIGxvdyAxNiBiaXRzICovCisJc3VtID0gKHN1bSA+PiAxNikgKyAoc3VtICYgMHhmZmZmKTsgICAgIC8qIGFkZCBoaSAxNiB0byBsb3cgMTYgKi8KKwlzdW0gKz0gKHN1bSA+PiAxNik7ICAgICAgICAgICAgICAgICAgICAgLyogYWRkIGNhcnJ5ICovCisKKwlyZXR1cm4gKHVpbnQxNl90KX5zdW07Cit9CmRpZmYgLS1naXQgYS9saWJiYi9pbmV0X2NvbW1vbi5jIGIvbGliYmIvaW5ldF9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjRhNGExCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvaW5ldF9jb21tb24uYwpAQCAtMCwwICsxLDIwNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogc3RvbGVuIGZyb20gbmV0LXRvb2xzLTEuNTkgYW5kIHN0cmlwcGVkIGRvd24gZm9yIGJ1c3lib3ggYnkKKyAqICAgICAgICAgICAgICAgICAgICAgIEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBIZWF2aWx5IG1vZGlmaWVkIGJ5IE1hbnVlbCBOb3ZvYSBJSUkgICAgICAgTWFyIDEyLCAyMDAxCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJpbmV0X2NvbW1vbi5oIgorCitpbnQgRkFTVF9GVU5DIElORVRfcmVzb2x2ZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNfaW4sIGludCBob3N0Zmlyc3QpCit7CisJc3RydWN0IGhvc3RlbnQgKmhwOworI2lmIEVOQUJMRV9GRUFUVVJFX0VUQ19ORVRXT1JLUworCXN0cnVjdCBuZXRlbnQgKm5wOworI2VuZGlmCisKKwkvKiBHcm1wZi4gLUZ2SyAqLworCXNfaW4tPnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXNfaW4tPnNpbl9wb3J0ID0gMDsKKworCS8qIERlZmF1bHQgaXMgc3BlY2lhbCwgbWVhbmluZyAwLjAuMC4wLiAqLworCWlmIChzdHJjbXAobmFtZSwgImRlZmF1bHQiKSA9PSAwKSB7CisJCXNfaW4tPnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisJCXJldHVybiAxOworCX0KKwkvKiBMb29rIHRvIHNlZSBpZiBpdCdzIGEgZG90dGVkIHF1YWQuICovCisJaWYgKGluZXRfYXRvbihuYW1lLCAmc19pbi0+c2luX2FkZHIpKSB7CisJCXJldHVybiAwOworCX0KKwkvKiBJZiB3ZSBleHBlY3QgdGhpcyB0byBiZSBhIGhvc3RuYW1lLCB0cnkgaG9zdG5hbWUgZGF0YWJhc2UgZmlyc3QgKi8KKwlpZiAoaG9zdGZpcnN0KSB7CisjaWZkZWYgREVCVUcKKwkJYmJfZXJyb3JfbXNnKCJnZXRob3N0YnluYW1lKCVzKSIsIG5hbWUpOworI2VuZGlmCisJCWhwID0gZ2V0aG9zdGJ5bmFtZShuYW1lKTsKKwkJaWYgKGhwKSB7CisJCQltZW1jcHkoJnNfaW4tPnNpbl9hZGRyLCBocC0+aF9hZGRyX2xpc3RbMF0sCisJCQkJc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9FVENfTkVUV09SS1MKKwkvKiBUcnkgdGhlIE5FVFdPUktTIGRhdGFiYXNlIHRvIHNlZSBpZiB0aGlzIGlzIGEga25vd24gbmV0d29yay4gKi8KKyNpZmRlZiBERUJVRworCWJiX2Vycm9yX21zZygiZ2V0bmV0YnluYW1lKCVzKSIsIG5hbWUpOworI2VuZGlmCisJbnAgPSBnZXRuZXRieW5hbWUobmFtZSk7CisJaWYgKG5wKSB7CisJCXNfaW4tPnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKG5wLT5uX25ldCk7CisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCWlmIChob3N0Zmlyc3QpIHsKKwkJLyogRG9uJ3QgdHJ5IGFnYWluICovCisJCXJldHVybiAtMTsKKwl9CisjaWZkZWYgREVCVUcKKwlyZXNfaW5pdCgpOworCV9yZXMub3B0aW9ucyB8PSBSRVNfREVCVUc7CisJYmJfZXJyb3JfbXNnKCJnZXRob3N0YnluYW1lKCVzKSIsIG5hbWUpOworI2VuZGlmCisJaHAgPSBnZXRob3N0YnluYW1lKG5hbWUpOworCWlmICghaHApIHsKKwkJcmV0dXJuIC0xOworCX0KKwltZW1jcHkoJnNfaW4tPnNpbl9hZGRyLCBocC0+aF9hZGRyX2xpc3RbMF0sIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpOworCXJldHVybiAwOworfQorCisKKy8qIG51bWVyaWM6ICYgMHg4MDAwOiAiZGVmYXVsdCIgaW5zdGVhZCBvZiAiKiIsCisgKiAgICAgICAgICAmIDB4NDAwMDogaG9zdCBpbnN0ZWFkIG9mIG5ldCwKKyAqICAgICAgICAgICYgMHgwZmZmOiBkb24ndCByZXNvbHZlCisgKi8KK2NoYXIqIEZBU1RfRlVOQyBJTkVUX3JyZXNvbHZlKHN0cnVjdCBzb2NrYWRkcl9pbiAqc19pbiwgaW50IG51bWVyaWMsIHVpbnQzMl90IG5ldG1hc2spCit7CisJLyogYWRkci10by1uYW1lIGNhY2hlICovCisJc3RydWN0IGFkZHIgeworCQlzdHJ1Y3QgYWRkciAqbmV4dDsKKwkJdWludDMyX3QgbmlwOworCQlzbWFsbGludCBpc19ob3N0OworCQljaGFyIG5hbWVbMV07CisJfTsKKwlzdGF0aWMgc3RydWN0IGFkZHIgKmNhY2hlID0gTlVMTDsKKworCXN0cnVjdCBhZGRyICpwbjsKKwljaGFyICpuYW1lOworCXVpbnQzMl90IG5pcDsKKwlzbWFsbGludCBpc19ob3N0OworCisJaWYgKHNfaW4tPnNpbl9mYW1pbHkgIT0gQUZfSU5FVCkgeworI2lmZGVmIERFQlVHCisJCWJiX2Vycm9yX21zZygicnJlc29sdmU6IHVuc3VwcG9ydGVkIGFkZHJlc3MgZmFtaWx5ICVkISIsCisJCQkJc19pbi0+c2luX2ZhbWlseSk7CisjZW5kaWYKKwkJZXJybm8gPSBFQUZOT1NVUFBPUlQ7CisJCXJldHVybiBOVUxMOworCX0KKwluaXAgPSBzX2luLT5zaW5fYWRkci5zX2FkZHI7CisjaWZkZWYgREVCVUcKKwliYl9lcnJvcl9tc2coInJyZXNvbHZlOiAlMDh4IG1hc2s6JTA4eCBudW06JTA4eCIsICh1bnNpZ25lZCluaXAsIG5ldG1hc2ssIG51bWVyaWMpOworI2VuZGlmCisJaWYgKG51bWVyaWMgJiAweDBGRkYpCisJCXJldHVybiB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZF9ub3BvcnQoKHZvaWQqKXNfaW4pOworCWlmIChuaXAgPT0gSU5BRERSX0FOWSkgeworCQlpZiAobnVtZXJpYyAmIDB4ODAwMCkKKwkJCXJldHVybiB4c3RyZHVwKCJkZWZhdWx0Iik7CisJCXJldHVybiB4c3RyZHVwKCIqIik7CisJfQorCisJaXNfaG9zdCA9ICgobmlwICYgKH5uZXRtYXNrKSkgIT0gMCB8fCAobnVtZXJpYyAmIDB4NDAwMCkpOworCisJcG4gPSBjYWNoZTsKKwl3aGlsZSAocG4pIHsKKwkJaWYgKHBuLT5uaXAgPT0gbmlwICYmIHBuLT5pc19ob3N0ID09IGlzX2hvc3QpIHsKKyNpZmRlZiBERUJVRworCQkJYmJfZXJyb3JfbXNnKCJycmVzb2x2ZTogZm91bmQgJXMgJTA4eCBpbiBjYWNoZSIsCisJCQkJKGlzX2hvc3QgPyAiaG9zdCIgOiAibmV0IiksICh1bnNpZ25lZCluaXApOworI2VuZGlmCisJCQlyZXR1cm4geHN0cmR1cChwbi0+bmFtZSk7CisJCX0KKwkJcG4gPSBwbi0+bmV4dDsKKwl9CisKKwluYW1lID0gTlVMTDsKKwlpZiAoaXNfaG9zdCkgeworI2lmZGVmIERFQlVHCisJCWJiX2Vycm9yX21zZygic29ja2FkZHIyaG9zdF9ub3BvcnQoJTA4eCkiLCAodW5zaWduZWQpbmlwKTsKKyNlbmRpZgorCQluYW1lID0geG1hbGxvY19zb2NrYWRkcjJob3N0X25vcG9ydCgodm9pZCopc19pbik7CisJfSBlbHNlIGlmIChFTkFCTEVfRkVBVFVSRV9FVENfTkVUV09SS1MpIHsKKwkJc3RydWN0IG5ldGVudCAqbnA7CisjaWZkZWYgREVCVUcKKwkJYmJfZXJyb3JfbXNnKCJnZXRuZXRieWFkZHIoJTA4eCkiLCAodW5zaWduZWQpbnRvaGwobmlwKSk7CisjZW5kaWYKKwkJbnAgPSBnZXRuZXRieWFkZHIobnRvaGwobmlwKSwgQUZfSU5FVCk7CisJCWlmIChucCkKKwkJCW5hbWUgPSB4c3RyZHVwKG5wLT5uX25hbWUpOworCX0KKwlpZiAoIW5hbWUpCisJCW5hbWUgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZF9ub3BvcnQoKHZvaWQqKXNfaW4pOworCisJcG4gPSB4bWFsbG9jKHNpemVvZigqcG4pICsgc3RybGVuKG5hbWUpKTsgLyogbm8gJysgMScsIGl0J3MgYWxyZWFkeSBhY2NvdW50ZWQgZm9yICovCisJcG4tPm5leHQgPSBjYWNoZTsKKwlwbi0+bmlwID0gbmlwOworCXBuLT5pc19ob3N0ID0gaXNfaG9zdDsKKwlzdHJjcHkocG4tPm5hbWUsIG5hbWUpOworCWNhY2hlID0gcG47CisKKwlyZXR1cm4gbmFtZTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKworaW50IEZBU1RfRlVOQyBJTkVUNl9yZXNvbHZlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzb2NrYWRkcl9pbjYgKnNpbjYpCit7CisJc3RydWN0IGFkZHJpbmZvIHJlcSwgKmFpID0gTlVMTDsKKwlpbnQgczsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisJcmVxLmFpX2ZhbWlseSA9IEFGX0lORVQ2OworCXMgPSBnZXRhZGRyaW5mbyhuYW1lLCBOVUxMLCAmcmVxLCAmYWkpOworCWlmIChzICE9IDApIHsKKwkJYmJfZXJyb3JfbXNnKCJnZXRhZGRyaW5mbzogJXM6ICVkIiwgbmFtZSwgcyk7CisJCXJldHVybiAtMTsKKwl9CisJbWVtY3B5KHNpbjYsIGFpLT5haV9hZGRyLCBzaXplb2YoKnNpbjYpKTsKKwlmcmVlYWRkcmluZm8oYWkpOworCXJldHVybiAwOworfQorCisjaWZuZGVmIElONl9JU19BRERSX1VOU1BFQ0lGSUVECisjIGRlZmluZSBJTjZfSVNfQUREUl9VTlNQRUNJRklFRChhKSBcCisJKCgodWludDMyX3QgKikgKGEpKVswXSA9PSAwICYmICgodWludDMyX3QgKikgKGEpKVsxXSA9PSAwICYmIFwKKwkgKCh1aW50MzJfdCAqKSAoYSkpWzJdID09IDAgJiYgKCh1aW50MzJfdCAqKSAoYSkpWzNdID09IDApCisjZW5kaWYKKworCitjaGFyKiBGQVNUX0ZVTkMgSU5FVDZfcnJlc29sdmUoc3RydWN0IHNvY2thZGRyX2luNiAqc2luNiwgaW50IG51bWVyaWMpCit7CisJaWYgKHNpbjYtPnNpbjZfZmFtaWx5ICE9IEFGX0lORVQ2KSB7CisjaWZkZWYgREVCVUcKKwkJYmJfZXJyb3JfbXNnKCJycmVzb2x2ZTogdW5zdXBwb3J0ZWQgYWRkcmVzcyBmYW1pbHkgJWQhIiwKKwkJCQlzaW42LT5zaW42X2ZhbWlseSk7CisjZW5kaWYKKwkJZXJybm8gPSBFQUZOT1NVUFBPUlQ7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAobnVtZXJpYyAmIDB4N0ZGRikgeworCQlyZXR1cm4geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWRfbm9wb3J0KCh2b2lkKilzaW42KTsKKwl9CisJaWYgKElONl9JU19BRERSX1VOU1BFQ0lGSUVEKCZzaW42LT5zaW42X2FkZHIpKSB7CisJCWlmIChudW1lcmljICYgMHg4MDAwKQorCQkJcmV0dXJuIHhzdHJkdXAoImRlZmF1bHQiKTsKKwkJcmV0dXJuIHhzdHJkdXAoIioiKTsKKwl9CisKKwlyZXR1cm4geG1hbGxvY19zb2NrYWRkcjJob3N0X25vcG9ydCgodm9pZCopc2luNik7Cit9CisKKyNlbmRpZiAgLyogQ09ORklHX0ZFQVRVUkVfSVBWNiAqLwpkaWZmIC0tZ2l0IGEvbGliYmIvaW5mb19tc2cuYyBiL2xpYmJiL2luZm9fbXNnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjYTJlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2luZm9fbXNnLmMKQEAgLTAsMCArMSw2MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9TWVNMT0cKKyMgaW5jbHVkZSA8c3lzbG9nLmg+CisjZW5kaWYKKwordm9pZCBGQVNUX0ZVTkMgYmJfaW5mb19tc2coY29uc3QgY2hhciAqcywgLi4uKQoreworI2lmZGVmIFRISVNfT05FX0RPRVNOVF9ET19TSU5HTEVfV1JJVEUKKwl2YV9saXN0IHA7CisJLyogdmFfY29weSBpcyB1c2VkIGJlY2F1c2UgaXQgaXMgbm90IHBvcnRhYmxlCisJICogdG8gdXNlIHZhX2xpc3QgcCB0d2ljZSAqLworCXZhX2xpc3QgcDI7CisKKwl2YV9zdGFydChwLCBzKTsKKwl2YV9jb3B5KHAyLCBwKTsKKwlpZiAobG9nbW9kZSAmIExPR01PREVfU1RESU8pIHsKKwkJdnByaW50ZihzLCBwKTsKKwkJZnB1dHMobXNnX2VvbCwgc3Rkb3V0KTsKKwl9CisjIGlmIEVOQUJMRV9GRUFUVVJFX1NZU0xPRworCWlmIChsb2dtb2RlICYgTE9HTU9ERV9TWVNMT0cpCisJCXZzeXNsb2coTE9HX0lORk8sIHMsIHAyKTsKKyMgZW5kaWYKKwl2YV9lbmQocDIpOworCXZhX2VuZChwKTsKKyNlbHNlCisJaW50IHVzZWQ7CisJY2hhciAqbXNnOworCXZhX2xpc3QgcDsKKworCWlmIChsb2dtb2RlID09IDApCisJCXJldHVybjsKKworCXZhX3N0YXJ0KHAsIHMpOworCXVzZWQgPSB2YXNwcmludGYoJm1zZywgcywgcCk7CisJdmFfZW5kKHApOworCWlmICh1c2VkIDwgMCkKKwkJcmV0dXJuOworCisjIGlmIEVOQUJMRV9GRUFUVVJFX1NZU0xPRworCWlmIChsb2dtb2RlICYgTE9HTU9ERV9TWVNMT0cpCisJCXN5c2xvZyhMT0dfSU5GTywgIiVzIiwgbXNnKTsKKyMgZW5kaWYKKwlpZiAobG9nbW9kZSAmIExPR01PREVfU1RESU8pIHsKKwkJZmZsdXNoX2FsbCgpOworCQkvKiB1c2VkID0gc3RybGVuKG1zZyk7IC0gbXVzdCBiZSB0cnVlIGFscmVhZHkgKi8KKwkJbXNnW3VzZWQrK10gPSAnXG4nOworCQlmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sIG1zZywgdXNlZCk7CisJfQorCisJZnJlZShtc2cpOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9saWJiYi9pbm9kZV9oYXNoLmMgYi9saWJiYi9pbm9kZV9oYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjExYzJhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2lub2RlX2hhc2guYwpAQCAtMCwwICsxLDEwMyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIG1hbnkgZGlmZmVyZW50IHBlb3BsZS4KKyAqIElmIHlvdSB3cm90ZSB0aGlzLCBwbGVhc2UgYWNrbm93bGVkZ2UgeW91ciB3b3JrLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3R5cGVkZWYgc3RydWN0IGlub19kZXZfaGFzaF9idWNrZXRfc3RydWN0IHsKKwlpbm9fdCBpbm87CisJZGV2X3QgZGV2OworCS8qCisJICogQWJvdmUgZmllbGRzIGNhbiBiZSA2NC1iaXQsIHdoaWxlIHBvaW50ZXIgbWF5IGJlIDMyLWJpdC4KKwkgKiBQdXR0aW5nICJuZXh0IiBmaWVsZCBoZXJlIG1heSByZWR1Y2Ugc2l6ZSBvZiB0aGlzIHN0cnVjdDoKKwkgKi8KKwlzdHJ1Y3QgaW5vX2Rldl9oYXNoX2J1Y2tldF9zdHJ1Y3QgKm5leHQ7CisJLyoKKwkgKiBSZXBvcnRlZGx5LCBvbiBjcmFtZnMgYSBmaWxlIGFuZCBhIGRpciBjYW4gaGF2ZSBzYW1lIGluby4KKwkgKiBOZWVkIHRvIGFsc28gcmVtZW1iZXIgImZpbGUvZGlyIiBiaXQ6CisJICovCisJY2hhciBpc2RpcjsgLyogYm9vbCAqLworCWNoYXIgbmFtZVsxXTsKK30gaW5vX2Rldl9oYXNodGFibGVfYnVja2V0X3Q7CisKKyNkZWZpbmUgSEFTSF9TSVpFICAgICAgMzExdSAgIC8qIFNob3VsZCBiZSBwcmltZSAqLworI2RlZmluZSBoYXNoX2lub2RlKGkpICAoKHVuc2lnbmVkKShpKSAlIEhBU0hfU0laRSkKKworLyogYXJyYXkgb2YgW0hBU0hfU0laRV0gZWxlbWVudHMgKi8KK3N0YXRpYyBpbm9fZGV2X2hhc2h0YWJsZV9idWNrZXRfdCAqKmlub19kZXZfaGFzaHRhYmxlOworCisvKgorICogUmV0dXJuIG5hbWUgaWYgc3RhdGJ1Zi0+c3RfaW5vICYmIHN0YXRidWYtPnN0X2RldiBhcmUgcmVjb3JkZWQgaW4KKyAqIGlub19kZXZfaGFzaHRhYmxlLCBlbHNlIHJldHVybiBOVUxMCisgKi8KK2NoYXIqIEZBU1RfRlVOQyBpc19pbl9pbm9fZGV2X2hhc2h0YWJsZShjb25zdCBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZikKK3sKKwlpbm9fZGV2X2hhc2h0YWJsZV9idWNrZXRfdCAqYnVja2V0OworCisJaWYgKCFpbm9fZGV2X2hhc2h0YWJsZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlidWNrZXQgPSBpbm9fZGV2X2hhc2h0YWJsZVtoYXNoX2lub2RlKHN0YXRidWYtPnN0X2lubyldOworCXdoaWxlIChidWNrZXQgIT0gTlVMTCkgeworCQlpZiAoKGJ1Y2tldC0+aW5vID09IHN0YXRidWYtPnN0X2lubykKKwkJICYmIChidWNrZXQtPmRldiA9PSBzdGF0YnVmLT5zdF9kZXYpCisJCSAmJiAoYnVja2V0LT5pc2RpciA9PSAhIVNfSVNESVIoc3RhdGJ1Zi0+c3RfbW9kZSkpCisJCSkgeworCQkJcmV0dXJuIGJ1Y2tldC0+bmFtZTsKKwkJfQorCQlidWNrZXQgPSBidWNrZXQtPm5leHQ7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBBZGQgc3RhdGJ1ZiB0byBzdGF0YnVmIGhhc2ggdGFibGUgKi8KK3ZvaWQgRkFTVF9GVU5DIGFkZF90b19pbm9fZGV2X2hhc2h0YWJsZShjb25zdCBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsKKwlpbm9fZGV2X2hhc2h0YWJsZV9idWNrZXRfdCAqYnVja2V0OworCisJaWYgKCFuYW1lKQorCQluYW1lID0gIiI7CisJYnVja2V0ID0geG1hbGxvYyhzaXplb2YoaW5vX2Rldl9oYXNodGFibGVfYnVja2V0X3QpICsgc3RybGVuKG5hbWUpKTsKKwlidWNrZXQtPmlubyA9IHN0YXRidWYtPnN0X2lubzsKKwlidWNrZXQtPmRldiA9IHN0YXRidWYtPnN0X2RldjsKKwlidWNrZXQtPmlzZGlyID0gISFTX0lTRElSKHN0YXRidWYtPnN0X21vZGUpOworCXN0cmNweShidWNrZXQtPm5hbWUsIG5hbWUpOworCisJaWYgKCFpbm9fZGV2X2hhc2h0YWJsZSkKKwkJaW5vX2Rldl9oYXNodGFibGUgPSB4emFsbG9jKEhBU0hfU0laRSAqIHNpemVvZigqaW5vX2Rldl9oYXNodGFibGUpKTsKKworCWkgPSBoYXNoX2lub2RlKHN0YXRidWYtPnN0X2lubyk7CisJYnVja2V0LT5uZXh0ID0gaW5vX2Rldl9oYXNodGFibGVbaV07CisJaW5vX2Rldl9oYXNodGFibGVbaV0gPSBidWNrZXQ7Cit9CisKKyNpZiBFTkFCTEVfRFUgfHwgRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAKKy8qIENsZWFyIHN0YXRidWYgaGFzaCB0YWJsZSAqLwordm9pZCBGQVNUX0ZVTkMgcmVzZXRfaW5vX2Rldl9oYXNodGFibGUodm9pZCkKK3sKKwlpbnQgaTsKKwlpbm9fZGV2X2hhc2h0YWJsZV9idWNrZXRfdCAqYnVja2V0LCAqbmV4dDsKKworCWlmICghaW5vX2Rldl9oYXNodGFibGUpCisJCXJldHVybjsKKworCWZvciAoaSA9IDA7IGkgPCBIQVNIX1NJWkU7IGkrKykgeworCQlidWNrZXQgPSBpbm9fZGV2X2hhc2h0YWJsZVtpXTsKKworCQl3aGlsZSAoYnVja2V0ICE9IE5VTEwpIHsKKwkJCW5leHQgPSBidWNrZXQtPm5leHQ7CisJCQlmcmVlKGJ1Y2tldCk7CisJCQlidWNrZXQgPSBuZXh0OworCQl9CisJfQorCWZyZWUoaW5vX2Rldl9oYXNodGFibGUpOworCWlub19kZXZfaGFzaHRhYmxlID0gTlVMTDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYmIvaXNkaXJlY3RvcnkuYyBiL2xpYmJiL2lzZGlyZWN0b3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE2YzUyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2lzZGlyZWN0b3J5LmMKQEAgLTAsMCArMSwzMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBCYXNlZCBpbiBwYXJ0IG9uIGNvZGUgZnJvbSBzYXNoLCBDb3B5cmlnaHQgKGMpIDE5OTkgYnkgRGF2aWQgSS4gQmVsbAorICogUGVybWlzc2lvbiBoYXMgYmVlbiBncmFudGVkIHRvIHJlZGlzdHJpYnV0ZSB0aGlzIGNvZGUgdW5kZXIgR1BMLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSAibGliYmIuaCIKKworLyoKKyAqIFJldHVybiBUUlVFIGlmIGZpbGVOYW1lIGlzIGEgZGlyZWN0b3J5LgorICogTm9uZXhpc3RlbnQgZmlsZXMgcmV0dXJuIEZBTFNFLgorICovCitpbnQgRkFTVF9GVU5DIGlzX2RpcmVjdG9yeShjb25zdCBjaGFyICpmaWxlTmFtZSwgaW50IGZvbGxvd0xpbmtzKQoreworCWludCBzdGF0dXM7CisJc3RydWN0IHN0YXQgc3RhdEJ1ZjsKKworCWlmIChmb2xsb3dMaW5rcykKKwkJc3RhdHVzID0gc3RhdChmaWxlTmFtZSwgJnN0YXRCdWYpOworCWVsc2UKKwkJc3RhdHVzID0gbHN0YXQoZmlsZU5hbWUsICZzdGF0QnVmKTsKKworCXN0YXR1cyA9IChzdGF0dXMgPT0gMCAmJiBTX0lTRElSKHN0YXRCdWYuc3RfbW9kZSkpOworCisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL2tlcm5lbF92ZXJzaW9uLmMgYi9saWJiYi9rZXJuZWxfdmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOGVkMDIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9rZXJuZWxfdmVyc2lvbi5jCkBAIC0wLDAgKzEsMzUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisvKiBBZnRlciBsaWJiYi5oLCBzaW5jZSBpdCBuZWVkcyBzeXMvdHlwZXMuaCBvbiBzb21lIHN5c3RlbXMgKi8KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPiAgLyogZm9yIHVuYW1lKDIpICovCisKKworLyogUmV0dXJucyBjdXJyZW50IGtlcm5lbCB2ZXJzaW9uIGVuY29kZWQgYXMgbWFqb3IqNjU1MzYgKyBtaW5vcioyNTYgKyBwYXRjaCwKKyAqIHNvLCBmb3IgZXhhbXBsZSwgIHRvIGNoZWNrIGlmIHRoZSBrZXJuZWwgaXMgZ3JlYXRlciB0aGFuIDIuMi4xMToKKyAqCisgKiAgICAgaWYgKGdldF9saW51eF92ZXJzaW9uX2NvZGUoKSA+IEtFUk5FTF9WRVJTSU9OKDIsMiwxMSkpIHsgPHN0dWZmPiB9CisgKi8KK2ludCBGQVNUX0ZVTkMgZ2V0X2xpbnV4X3ZlcnNpb25fY29kZSh2b2lkKQoreworCXN0cnVjdCB1dHNuYW1lIG5hbWU7CisJY2hhciAqcywgKnQ7CisJaW50IGksIHI7CisKKwl1bmFtZSgmbmFtZSk7IC8qIG5ldmVyIGZhaWxzICovCisJcyA9IG5hbWUucmVsZWFzZTsKKwlyID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCXQgPSBzdHJ0b2socywgIi4iKTsKKwkJciA9IHIgKiAyNTYgKyAodCA/IGF0b2kodCkgOiAwKTsKKwkJcyA9IE5VTEw7CisJfQorCXJldHVybiByOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvbGFzdF9jaGFyX2lzLmMgYi9saWJiYi9sYXN0X2NoYXJfaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWU2Y2RmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvbGFzdF9jaGFyX2lzLmMKQEAgLTAsMCArMSwyNCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYnVzeWJveCBsaWJyYXJ5IGVYdGVuZGVkIGZ1bmN0aW9uCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIExhcnJ5IERvb2xpdHRsZSwgPGxkb29saXR0QHJlY3ljbGUubGJsLmdvdj4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBGaW5kIG91dCBpZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgYSBzdHJpbmcgbWF0Y2hlcyB0aGUgb25lIGdpdmVuLgorICogRG9uJ3QgdW5kZXJydW4gdGhlIGJ1ZmZlciBpZiB0aGUgc3RyaW5nIGxlbmd0aCBpcyAwLgorICovCitjaGFyKiBGQVNUX0ZVTkMgbGFzdF9jaGFyX2lzKGNvbnN0IGNoYXIgKnMsIGludCBjKQoreworCWlmIChzICYmICpzKSB7CisJCXNpemVfdCBzeiA9IHN0cmxlbihzKSAtIDE7CisJCXMgKz0gc3o7CisJCWlmICggKHVuc2lnbmVkIGNoYXIpKnMgPT0gYykKKwkJCXJldHVybiAoY2hhciopczsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9saW5lZWRpdC5jIGIvbGliYmIvbGluZWVkaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODNlMDdjCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvbGluZWVkaXQuYwpAQCAtMCwwICsxLDI4NzMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvbW1hbmQgbGluZSBlZGl0aW5nLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk4Ni0yMDAzIG1heSBzYWZlbHkgYmUgY29uc3VtZWQgYnkgYSBCU0Qgb3IgR1BMIGxpY2Vuc2UuCisgKiBXcml0dGVuIGJ5OiAgIFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4KKyAqCisgKiBVc2VkIGlkZWFzOgorICogICAgICBBZGFtIFJvZ295c2tpICAgIDxyb2dveXNraUBjcy51dGV4YXMuZWR1PgorICogICAgICBEYXZlIENpbmVnZSAgICAgIDxkY2luZWdlQHBzeWNob3Npcy5jb20+CisgKiAgICAgIEpha3ViIEplbGluZWsgKGMpIDE5OTUKKyAqICAgICAgRXJpayBBbmRlcnNlbiAgICA8YW5kZXJzZW5AY29kZXBvZXQub3JnPiAoTWFqb3JseSBhZGp1c3RlZCBmb3IgYnVzeWJveCkKKyAqCisgKiBUaGlzIGNvZGUgaXMgJ2FzIGlzJyB3aXRoIG5vIHdhcnJhbnR5LgorICovCisKKy8qCisgKiBVc2FnZSBhbmQga25vd24gYnVnczoKKyAqIFRlcm1pbmFsIGtleSBjb2RlcyBhcmUgbm90IGV4dGVuc2l2ZSwgbW9yZSBuZWVkcyB0byBiZSBhZGRlZC4KKyAqIFRoaXMgdmVyc2lvbiB3YXMgY3JlYXRlZCBvbiBEZWJpYW4gR05VL0xpbnV4IDIueC4KKyAqIERlbGV0ZSwgQmFja3NwYWNlLCBIb21lLCBFbmQsIGFuZCB0aGUgYXJyb3cga2V5cyB3ZXJlIHRlc3RlZAorICogdG8gd29yayBpbiBhbiBYdGVybSBhbmQgY29uc29sZS4gQ3RybC1BIGFsc28gd29ya3MgYXMgSG9tZS4KKyAqIEN0cmwtRSBhbHNvIHdvcmtzIGFzIEVuZC4KKyAqCisgKiBUaGUgZm9sbG93aW5nIHJlYWRsaW5lLWxpa2UgY29tbWFuZHMgYXJlIG5vdCBpbXBsZW1lbnRlZDoKKyAqIEVTQy1iIC0tIE1vdmUgYmFjayBvbmUgd29yZAorICogRVNDLWYgLS0gTW92ZSBmb3J3YXJkIG9uZSB3b3JkCisgKiBFU0MtZCAtLSBEZWxldGUgZm9yd2FyZCBvbmUgd29yZAorICogQ1RMLXQgLS0gVHJhbnNwb3NlIHR3byBjaGFyYWN0ZXJzCisgKgorICogbGluZWVkaXQgZG9lcyBub3Qga25vdyB0aGF0IHRoZSB0ZXJtaW5hbCBlc2NhcGUgc2VxdWVuY2VzIGRvIG5vdAorICogdGFrZSB1cCBzcGFjZSBvbiB0aGUgc2NyZWVuLiBUaGUgcmVkaXNwbGF5IGNvZGUgYXNzdW1lcywgdW5sZXNzCisgKiB0b2xkIG90aGVyd2lzZSwgdGhhdCBlYWNoIGNoYXJhY3RlciBpbiB0aGUgcHJvbXB0IGlzIGEgcHJpbnRhYmxlCisgKiBjaGFyYWN0ZXIgdGhhdCB0YWtlcyB1cCBvbmUgY2hhcmFjdGVyIHBvc2l0aW9uIG9uIHRoZSBzY3JlZW4uCisgKiBZb3UgbmVlZCB0byB0ZWxsIGxpbmVlZGl0IHRoYXQgc29tZSBzZXF1ZW5jZXMgb2YgY2hhcmFjdGVycworICogaW4gdGhlIHByb21wdCB0YWtlIHVwIG5vIHNjcmVlbiBzcGFjZS4gQ29tcGF0aWJseSB3aXRoIHJlYWRsaW5lLAorICogdXNlIHRoZSBcWyBlc2NhcGUgdG8gYmVnaW4gYSBzZXF1ZW5jZSBvZiBub24tcHJpbnRpbmcgY2hhcmFjdGVycywKKyAqIGFuZCB0aGUgXF0gZXNjYXBlIHRvIHNpZ25hbCB0aGUgZW5kIG9mIHN1Y2ggYSBzZXF1ZW5jZS4gRXhhbXBsZToKKyAqCisgKiBQUzE9J1xbXDAzM1swMTszMm1cXVx1QFxoXFtcMDMzWzAxOzM0bVxdIFx3IFwkXFtcMDMzWzAwbVxdICcKKyAqCisgKiBVbmljb2RlIGluIFBTMSBpcyBub3QgZnVsbHkgc3VwcG9ydGVkOiBwcm9tcHQgbGVuZ3RoIGNhbHVsYXRpb24gaXMgd3JvbmcsCisgKiByZXN1bHRpbmcgaW4gbGluZSB3cmFwIHByb2JsZW1zIHdpdGggbG9uZyAobXVsdGktbGluZSkgaW5wdXQuCisgKgorICogTXVsdGktbGluZSBQUzEgKGUuZy4gUFMxPSJcbltcd11cbiQgIikgaGFzIHByb2JsZW1zIHdpdGggaGlzdG9yeQorICogYnJvd3Npbmc6IHVwL2Rvd24gYXJyb3dzIHJlc3VsdCBpbiBzY3JvbGxpbmcuCisgKiBJdCBzdGVtcyBmcm9tIHNpbXBsaXN0aWMgImNtZGVkaXRfeSA9IGNtZGVkaXRfcHJtdF9sZW4gLyBjbWRlZGl0X3Rlcm13IgorICogY2FsY3VsYXRpb24gb2YgaG93IG1hbnkgbGluZXMgdGhlIHByb21wdCB0YWtlcy4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAidW5pY29kZS5oIgorI2lmbmRlZiBfUE9TSVhfVkRJU0FCTEUKKyMgZGVmaW5lIF9QT1NJWF9WRElTQUJMRSAnXDAnCisjZW5kaWYKKworCisjaWZkZWYgVEVTVAorIyBkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfRURJVElORyAwCisjIGRlZmluZSBFTkFCTEVfRkVBVFVSRV9UQUJfQ09NUExFVElPTiAwCisjIGRlZmluZSBFTkFCTEVfRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OIDAKKyNlbmRpZgorCisKKy8qIEVudGlyZSBmaWxlIChleGNlcHQgVEVTVGluZyBwYXJ0KSBzaXRzIGluc2lkZSB0aGlzICNpZiAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkcKKworCisjZGVmaW5lIEVOQUJMRV9VU0VSTkFNRV9PUl9IT01FRElSIFwKKwkoRU5BQkxFX0ZFQVRVUkVfVVNFUk5BTUVfQ09NUExFVElPTiB8fCBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVCkKKyNkZWZpbmUgSUZfVVNFUk5BTUVfT1JfSE9NRURJUiguLi4pCisjaWYgRU5BQkxFX1VTRVJOQU1FX09SX0hPTUVESVIKKyMgdW5kZWYgSUZfVVNFUk5BTUVfT1JfSE9NRURJUgorIyBkZWZpbmUgSUZfVVNFUk5BTUVfT1JfSE9NRURJUiguLi4pIF9fVkFfQVJHU19fCisjZW5kaWYKKworCisjdW5kZWYgQ0hBUl9UCisjaWYgRU5BQkxFX1VOSUNPREVfU1VQUE9SVAorIyBkZWZpbmUgQkJfTlVMICgod2NoYXJfdCkwKQorIyBkZWZpbmUgQ0hBUl9UIHdjaGFyX3QKK3N0YXRpYyBib29sIEJCX2lzc3BhY2UoQ0hBUl9UIGMpIHsgcmV0dXJuICgodW5zaWduZWQpYyA8IDI1NiAmJiBpc3NwYWNlKGMpKTsgfQorIyBpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1ZJCitzdGF0aWMgYm9vbCBCQl9pc2FsbnVtKENIQVJfVCBjKSB7IHJldHVybiAoKHVuc2lnbmVkKWMgPCAyNTYgJiYgaXNhbG51bShjKSk7IH0KKyMgZW5kaWYKK3N0YXRpYyBib29sIEJCX2lzcHVuY3QoQ0hBUl9UIGMpIHsgcmV0dXJuICgodW5zaWduZWQpYyA8IDI1NiAmJiBpc3B1bmN0KGMpKTsgfQorIyB1bmRlZiBpc3NwYWNlCisjIHVuZGVmIGlzYWxudW0KKyMgdW5kZWYgaXNwdW5jdAorIyB1bmRlZiBpc3ByaW50CisjIGRlZmluZSBpc3NwYWNlIGlzc3BhY2VfbXVzdF9ub3RfYmVfdXNlZAorIyBkZWZpbmUgaXNhbG51bSBpc2FsbnVtX211c3Rfbm90X2JlX3VzZWQKKyMgZGVmaW5lIGlzcHVuY3QgaXNwdW5jdF9tdXN0X25vdF9iZV91c2VkCisjIGRlZmluZSBpc3ByaW50IGlzcHJpbnRfbXVzdF9ub3RfYmVfdXNlZAorI2Vsc2UKKyMgZGVmaW5lIEJCX05VTCAnXDAnCisjIGRlZmluZSBDSEFSX1QgY2hhcgorIyBkZWZpbmUgQkJfaXNzcGFjZShjKSBpc3NwYWNlKGMpCisjIGRlZmluZSBCQl9pc2FsbnVtKGMpIGlzYWxudW0oYykKKyMgZGVmaW5lIEJCX2lzcHVuY3QoYykgaXNwdW5jdChjKQorI2VuZGlmCisjaWYgRU5BQkxFX1VOSUNPREVfUFJFU0VSVkVfQlJPS0VOCisjIGRlZmluZSB1bmljb2RlX21hcmtfcmF3X2J5dGUod2MpICAgKCh3YykgfCAweDIwMDAwMDAwKQorIyBkZWZpbmUgdW5pY29kZV9pc19yYXdfYnl0ZSh3YykgICAgICgod2MpICYgMHgyMDAwMDAwMCkKKyNlbHNlCisjIGRlZmluZSB1bmljb2RlX2lzX3Jhd19ieXRlKHdjKSAgICAgMAorI2VuZGlmCisKKworI2RlZmluZSBFU0MgIlwwMzMiCisKKyNkZWZpbmUgU0VRX0NMRUFSX1RJTExfRU5EX09GX1NDUkVFTiAgRVNDIltKIgorLy8jZGVmaW5lIFNFUV9DTEVBUl9USUxMX0VORF9PRl9MSU5FICBFU0MiW0siCisKKworZW51bSB7CisJTUFYX0xJTkVMRU4gPSBDT05GSUdfRkVBVFVSRV9FRElUSU5HX01BWF9MRU4gPCAweDdmZjAKKwkgICAgICAgICAgICAgID8gQ09ORklHX0ZFQVRVUkVfRURJVElOR19NQVhfTEVOCisJICAgICAgICAgICAgICA6IDB4N2ZmMAorfTsKKworI2lmIEVOQUJMRV9VU0VSTkFNRV9PUl9IT01FRElSCitzdGF0aWMgY29uc3QgY2hhciBudWxsX3N0cltdIEFMSUdOMSA9ICIiOworI2VuZGlmCisKKy8qIFdlIHRyeSB0byBtaW5pbWl6ZSBib3RoIHN0YXRpYyBhbmQgc3RhY2sgdXNhZ2UuICovCitzdHJ1Y3QgbGluZWVkaXRfc3RhdGljcyB7CisJbGluZV9pbnB1dF90ICpzdGF0ZTsKKworCXZvbGF0aWxlIHVuc2lnbmVkIGNtZGVkaXRfdGVybXc7IC8qID0gODA7ICovIC8qIGFjdHVhbCB0ZXJtaW5hbCB3aWR0aCAqLworCXNpZ2hhbmRsZXJfdCBwcmV2aW91c19TSUdXSU5DSF9oYW5kbGVyOworCisJdW5zaWduZWQgY21kZWRpdF94OyAgICAgICAgLyogcmVhbCB4IChjb2wpIHRlcm1pbmFsIHBvc2l0aW9uICovCisJdW5zaWduZWQgY21kZWRpdF95OyAgICAgICAgLyogcHNldWRvcmVhbCB5IChyb3cpIHRlcm1pbmFsIHBvc2l0aW9uICovCisJdW5zaWduZWQgY21kZWRpdF9wcm10X2xlbjsgLyogbGVuZ3RoIG9mIHByb21wdCAod2l0aG91dCBjb2xvcnMgZXRjKSAqLworCisJdW5zaWduZWQgY3Vyc29yOworCWludCBjb21tYW5kX2xlbjsgLyogbXVzdCBiZSBzaWduZWQgKi8KKwkvKiBzaWduZWQgbWF4c2l6ZTogd2Ugd2FudCB4IGluICJpZiAoeCA+IFMubWF4c2l6ZSkiCisJICogdG8gX25vdF8gYmUgcHJvbW90ZWQgdG8gdW5zaWduZWQgKi8KKwlpbnQgbWF4c2l6ZTsKKwlDSEFSX1QgKmNvbW1hbmRfcHM7CisKKwljb25zdCBjaGFyICpjbWRlZGl0X3Byb21wdDsKKworI2lmIEVOQUJMRV9VU0VSTkFNRV9PUl9IT01FRElSCisJY2hhciAqdXNlcl9idWY7CisJY2hhciAqaG9tZV9wd2RfYnVmOyAvKiA9IChjaGFyKiludWxsX3N0cjsgKi8KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT04KKwljaGFyICoqbWF0Y2hlczsKKwl1bnNpZ25lZCBudW1fbWF0Y2hlczsKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19WSQorIyBkZWZpbmUgREVMQlVGU0laIDEyOAorCUNIQVJfVCAqZGVscHRyOworCXNtYWxsaW50IG5ld2RlbGZsYWc7ICAgICAvKiB3aGV0aGVyIGRlbGJ1ZiBzaG91bGQgYmUgcmV1c2VkIHlldCAqLworCUNIQVJfVCBkZWxidWZbREVMQlVGU0laXTsgIC8qIGEgcGxhY2UgdG8gc3RvcmUgZGVsZXRlZCBjaGFyYWN0ZXJzICovCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX0FTS19URVJNSU5BTAorCXNtYWxsaW50IHNlbnRfRVNDX2JyNm47CisjZW5kaWYKK307CisKKy8qIFNlZSBsaW5lZWRpdF9wdHJfaGFjay5jICovCitleHRlcm4gc3RydWN0IGxpbmVlZGl0X3N0YXRpY3MgKmNvbnN0IGxpbmVlZGl0X3B0cl90b19zdGF0aWNzOworCisjZGVmaW5lIFMgKCpsaW5lZWRpdF9wdHJfdG9fc3RhdGljcykKKyNkZWZpbmUgc3RhdGUgICAgICAgICAgICAoUy5zdGF0ZSAgICAgICAgICAgKQorI2RlZmluZSBjbWRlZGl0X3Rlcm13ICAgIChTLmNtZGVkaXRfdGVybXcgICApCisjZGVmaW5lIHByZXZpb3VzX1NJR1dJTkNIX2hhbmRsZXIgKFMucHJldmlvdXNfU0lHV0lOQ0hfaGFuZGxlcikKKyNkZWZpbmUgY21kZWRpdF94ICAgICAgICAoUy5jbWRlZGl0X3ggICAgICAgKQorI2RlZmluZSBjbWRlZGl0X3kgICAgICAgIChTLmNtZGVkaXRfeSAgICAgICApCisjZGVmaW5lIGNtZGVkaXRfcHJtdF9sZW4gKFMuY21kZWRpdF9wcm10X2xlbikKKyNkZWZpbmUgY3Vyc29yICAgICAgICAgICAoUy5jdXJzb3IgICAgICAgICAgKQorI2RlZmluZSBjb21tYW5kX2xlbiAgICAgIChTLmNvbW1hbmRfbGVuICAgICApCisjZGVmaW5lIGNvbW1hbmRfcHMgICAgICAgKFMuY29tbWFuZF9wcyAgICAgICkKKyNkZWZpbmUgY21kZWRpdF9wcm9tcHQgICAoUy5jbWRlZGl0X3Byb21wdCAgKQorI2RlZmluZSB1c2VyX2J1ZiAgICAgICAgIChTLnVzZXJfYnVmICAgICAgICApCisjZGVmaW5lIGhvbWVfcHdkX2J1ZiAgICAgKFMuaG9tZV9wd2RfYnVmICAgICkKKyNkZWZpbmUgbWF0Y2hlcyAgICAgICAgICAoUy5tYXRjaGVzICAgICAgICAgKQorI2RlZmluZSBudW1fbWF0Y2hlcyAgICAgIChTLm51bV9tYXRjaGVzICAgICApCisjZGVmaW5lIGRlbHB0ciAgICAgICAgICAgKFMuZGVscHRyICAgICAgICAgICkKKyNkZWZpbmUgbmV3ZGVsZmxhZyAgICAgICAoUy5uZXdkZWxmbGFnICAgICAgKQorI2RlZmluZSBkZWxidWYgICAgICAgICAgIChTLmRlbGJ1ZiAgICAgICAgICApCisKKyNkZWZpbmUgSU5JVF9TKCkgZG8geyBcCisJKCooc3RydWN0IGxpbmVlZGl0X3N0YXRpY3MqKikmbGluZWVkaXRfcHRyX3RvX3N0YXRpY3MpID0geHphbGxvYyhzaXplb2YoUykpOyBcCisJYmFycmllcigpOyBcCisJY21kZWRpdF90ZXJtdyA9IDgwOyBcCisJSUZfVVNFUk5BTUVfT1JfSE9NRURJUihob21lX3B3ZF9idWYgPSAoY2hhciopbnVsbF9zdHI7KSBcCisJSUZfRkVBVFVSRV9FRElUSU5HX1ZJKGRlbHB0ciA9IGRlbGJ1ZjspIFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIGRlaW5pdF9TKHZvaWQpCit7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQKKwkvKiBUaGlzIG9uZSBpcyBhbGxvY2F0ZWQgb25seSBpZiBGQU5DWV9QUk9NUFQgaXMgb24KKwkgKiAob3RoZXJ3aXNlIGl0IHBvaW50cyB0byB2ZXJiYXRpbSBwcm9tcHQgKE5PVCBtYWxsb2NlZCkpICovCisJZnJlZSgoY2hhciopY21kZWRpdF9wcm9tcHQpOworI2VuZGlmCisjaWYgRU5BQkxFX1VTRVJOQU1FX09SX0hPTUVESVIKKwlmcmVlKHVzZXJfYnVmKTsKKwlpZiAoaG9tZV9wd2RfYnVmICE9IG51bGxfc3RyKQorCQlmcmVlKGhvbWVfcHdkX2J1Zik7CisjZW5kaWYKKwlmcmVlKGxpbmVlZGl0X3B0cl90b19zdGF0aWNzKTsKK30KKyNkZWZpbmUgREVJTklUX1MoKSBkZWluaXRfUygpCisKKworI2lmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKK3N0YXRpYyBzaXplX3QgbG9hZF9zdHJpbmcoY29uc3QgY2hhciAqc3JjKQoreworCWlmICh1bmljb2RlX3N0YXR1cyA9PSBVTklDT0RFX09OKSB7CisJCXNzaXplX3QgbGVuID0gbWJzdG93Y3MoY29tbWFuZF9wcywgc3JjLCBTLm1heHNpemUgLSAxKTsKKwkJaWYgKGxlbiA8IDApCisJCQlsZW4gPSAwOworCQljb21tYW5kX3BzW2xlbl0gPSBCQl9OVUw7CisJCXJldHVybiBsZW47CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgaSA9IDA7CisJCXdoaWxlIChzcmNbaV0gJiYgaSA8IFMubWF4c2l6ZSAtIDEpIHsKKwkJCWNvbW1hbmRfcHNbaV0gPSBzcmNbaV07CisJCQlpKys7CisJCX0KKwkJY29tbWFuZF9wc1tpXSA9IEJCX05VTDsKKwkJcmV0dXJuIGk7CisJfQorfQorc3RhdGljIHVuc2lnbmVkIHNhdmVfc3RyaW5nKGNoYXIgKmRzdCwgdW5zaWduZWQgbWF4c2l6ZSkKK3sKKwlpZiAodW5pY29kZV9zdGF0dXMgPT0gVU5JQ09ERV9PTikgeworIyBpZiAhRU5BQkxFX1VOSUNPREVfUFJFU0VSVkVfQlJPS0VOCisJCXNzaXplX3QgbGVuID0gd2NzdG9tYnMoZHN0LCBjb21tYW5kX3BzLCBtYXhzaXplIC0gMSk7CisJCWlmIChsZW4gPCAwKQorCQkJbGVuID0gMDsKKwkJZHN0W2xlbl0gPSAnXDAnOworCQlyZXR1cm4gbGVuOworIyBlbHNlCisJCXVuc2lnbmVkIGRzdHBvcyA9IDA7CisJCXVuc2lnbmVkIHNyY3BvcyA9IDA7CisKKwkJbWF4c2l6ZS0tOworCQl3aGlsZSAoZHN0cG9zIDwgbWF4c2l6ZSkgeworCQkJd2NoYXJfdCB3YzsKKwkJCWludCBuID0gc3JjcG9zOworCisJCQkvKiBDb252ZXJ0IHVwIHRvIDFzdCBpbnZhbGlkIGJ5dGUgKG9yIHVwIHRvIGVuZCkgKi8KKwkJCXdoaWxlICgod2MgPSBjb21tYW5kX3BzW3NyY3Bvc10pICE9IEJCX05VTAorCQkJICAgICYmICF1bmljb2RlX2lzX3Jhd19ieXRlKHdjKQorCQkJKSB7CisJCQkJc3JjcG9zKys7CisJCQl9CisJCQljb21tYW5kX3BzW3NyY3Bvc10gPSBCQl9OVUw7CisJCQluID0gd2NzdG9tYnMoZHN0ICsgZHN0cG9zLCBjb21tYW5kX3BzICsgbiwgbWF4c2l6ZSAtIGRzdHBvcyk7CisJCQlpZiAobiA8IDApIC8qIHNob3VsZCBub3QgaGFwcGVuICovCisJCQkJYnJlYWs7CisJCQlkc3Rwb3MgKz0gbjsKKwkJCWlmICh3YyA9PSBCQl9OVUwpIC8qIHVzdWFsbHkgaXMgKi8KKwkJCQlicmVhazsKKworCQkJLyogV2UgZG8gaGF2ZSBpbnZhbGlkIGJ5dGUgaGVyZSEgKi8KKwkJCWNvbW1hbmRfcHNbc3JjcG9zXSA9IHdjOyAvKiByZXN0b3JlIGl0ICovCisJCQlzcmNwb3MrKzsKKwkJCWlmIChkc3Rwb3MgPT0gbWF4c2l6ZSkKKwkJCQlicmVhazsKKwkJCWRzdFtkc3Rwb3MrK10gPSAoY2hhcikgd2M7CisJCX0KKwkJZHN0W2RzdHBvc10gPSAnXDAnOworCQlyZXR1cm4gZHN0cG9zOworIyBlbmRpZgorCX0gZWxzZSB7CisJCXVuc2lnbmVkIGkgPSAwOworCQl3aGlsZSAoKGRzdFtpXSA9IGNvbW1hbmRfcHNbaV0pICE9IDApCisJCQlpKys7CisJCXJldHVybiBpOworCX0KK30KKy8qIEkgdGhvdWdodCBqdXN0IGZwdXR3YyhjLCBzdGRvdXQpIHdvdWxkIHdvcmsuIEJ1dCBuby4uLiAqLworc3RhdGljIHZvaWQgQkJfUFVUQ0hBUih3Y2hhcl90IGMpCit7CisJaWYgKHVuaWNvZGVfc3RhdHVzID09IFVOSUNPREVfT04pIHsKKwkJY2hhciBidWZbTUJfQ1VSX01BWCArIDFdOworCQltYnN0YXRlX3QgbWJzdCA9IHsgMCB9OworCQlzc2l6ZV90IGxlbiA9IHdjcnRvbWIoYnVmLCBjLCAmbWJzdCk7CisJCWlmIChsZW4gPiAwKSB7CisJCQlidWZbbGVuXSA9ICdcMCc7CisJCQlmcHV0cyhidWYsIHN0ZG91dCk7CisJCX0KKwl9IGVsc2UgeworCQkvKiBJbiB0aGlzIGNhc2UsIGMgaXMgYWx3YXlzIG9uZSBieXRlICovCisJCXB1dGNoYXIoYyk7CisJfQorfQorIyBpZiBFTkFCTEVfVU5JQ09ERV9DT01CSU5JTkdfV0NIQVJTIHx8IEVOQUJMRV9VTklDT0RFX1dJREVfV0NIQVJTCitzdGF0aWMgd2NoYXJfdCBhZGp1c3Rfd2lkdGhfYW5kX3ZhbGlkYXRlX3djKHVuc2lnbmVkICp3aWR0aF9hZGosIHdjaGFyX3Qgd2MpCisjIGVsc2UKK3N0YXRpYyB3Y2hhcl90IGFkanVzdF93aWR0aF9hbmRfdmFsaWRhdGVfd2Mod2NoYXJfdCB3YykKKyMgIGRlZmluZSBhZGp1c3Rfd2lkdGhfYW5kX3ZhbGlkYXRlX3djKHdpZHRoX2Fkaiwgd2MpIFwKKwkoKCood2lkdGhfYWRqKSkrKywgYWRqdXN0X3dpZHRoX2FuZF92YWxpZGF0ZV93Yyh3YykpCisjIGVuZGlmCit7CisJaW50IHcgPSAxOworCisJaWYgKHVuaWNvZGVfc3RhdHVzID09IFVOSUNPREVfT04pIHsKKwkJaWYgKHdjID4gQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSKSB7CisJCQkvKiBub3RlOiBhbHNvIHRydWUgZm9yIHVuaWNvZGVfaXNfcmF3X2J5dGUod2MpICovCisJCQlnb3RvIHN1YnN0OworCQl9CisJCXcgPSB3Y3dpZHRoKHdjKTsKKwkJaWYgKChFTkFCTEVfVU5JQ09ERV9DT01CSU5JTkdfV0NIQVJTICYmIHcgPCAwKQorCQkgfHwgKCFFTkFCTEVfVU5JQ09ERV9DT01CSU5JTkdfV0NIQVJTICYmIHcgPD0gMCkKKwkJIHx8ICghRU5BQkxFX1VOSUNPREVfV0lERV9XQ0hBUlMgJiYgdyA+IDEpCisJCSkgeworIHN1YnN0OgorCQkJdyA9IDE7CisJCQl3YyA9IENPTkZJR19TVUJTVF9XQ0hBUjsKKwkJfQorCX0KKworIyBpZiBFTkFCTEVfVU5JQ09ERV9DT01CSU5JTkdfV0NIQVJTIHx8IEVOQUJMRV9VTklDT0RFX1dJREVfV0NIQVJTCisJKndpZHRoX2FkaiArPSB3OworI2VuZGlmCisJcmV0dXJuIHdjOworfQorI2Vsc2UgLyogIVVOSUNPREUgKi8KK3N0YXRpYyBzaXplX3QgbG9hZF9zdHJpbmcoY29uc3QgY2hhciAqc3JjKQoreworCXNhZmVfc3RybmNweShjb21tYW5kX3BzLCBzcmMsIFMubWF4c2l6ZSk7CisJcmV0dXJuIHN0cmxlbihjb21tYW5kX3BzKTsKK30KKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT04KK3N0YXRpYyB2b2lkIHNhdmVfc3RyaW5nKGNoYXIgKmRzdCwgdW5zaWduZWQgbWF4c2l6ZSkKK3sKKwlzYWZlX3N0cm5jcHkoZHN0LCBjb21tYW5kX3BzLCBtYXhzaXplKTsKK30KKyMgZW5kaWYKKyMgZGVmaW5lIEJCX1BVVENIQVIoYykgYmJfcHV0Y2hhcihjKQorLyogU2hvdWxkIG5ldmVyIGJlIGNhbGxlZDogKi8KK2ludCBhZGp1c3Rfd2lkdGhfYW5kX3ZhbGlkYXRlX3djKHVuc2lnbmVkICp3aWR0aF9hZGosIGludCB3Yyk7CisjZW5kaWYKKworCisvKiBQdXQgJ2NvbW1hbmRfcHNbY3Vyc29yXScsIGN1cnNvcisrLgorICogQWR2YW5jZSBjdXJzb3Igb24gc2NyZWVuLiBJZiB3ZSByZWFjaGVkIHJpZ2h0IG1hcmdpbiwgc2Nyb2xsIHRleHQgdXAKKyAqIGFuZCByZW1vdmUgdGVybWluYWwgbWFyZ2luIGVmZmVjdCBieSBwcmludGluZyAnbmV4dF9jaGFyJyAqLworI2RlZmluZSBIQUNLX0ZPUl9XUk9OR19XSURUSCAxCitzdGF0aWMgdm9pZCBwdXRfY3VyX2dseXBoX2FuZF9pbmNfY3Vyc29yKHZvaWQpCit7CisJQ0hBUl9UIGMgPSBjb21tYW5kX3BzW2N1cnNvcl07CisJdW5zaWduZWQgd2lkdGggPSAwOworCWludCBvZnNfdG9fcmlnaHQ7CisKKwlpZiAoYyA9PSBCQl9OVUwpIHsKKwkJLyogZXJhc2UgY2hhcmFjdGVyIGFmdGVyIGVuZCBvZiBpbnB1dCBzdHJpbmcgKi8KKwkJYyA9ICcgJzsKKwl9IGVsc2UgeworCQkvKiBhZHZhbmNlIGN1cnNvciBvbmx5IGlmIHdlIGFyZW4ndCBhdCB0aGUgZW5kIHlldCAqLworCQljdXJzb3IrKzsKKwkJaWYgKHVuaWNvZGVfc3RhdHVzID09IFVOSUNPREVfT04pIHsKKwkJCUlGX1VOSUNPREVfV0lERV9XQ0hBUlMod2lkdGggPSBjbWRlZGl0X3g7KQorCQkJYyA9IGFkanVzdF93aWR0aF9hbmRfdmFsaWRhdGVfd2MoJmNtZGVkaXRfeCwgYyk7CisJCQlJRl9VTklDT0RFX1dJREVfV0NIQVJTKHdpZHRoID0gY21kZWRpdF94IC0gd2lkdGg7KQorCQl9IGVsc2UgeworCQkJY21kZWRpdF94Kys7CisJCX0KKwl9CisKKwlvZnNfdG9fcmlnaHQgPSBjbWRlZGl0X3ggLSBjbWRlZGl0X3Rlcm13OworCWlmICghRU5BQkxFX1VOSUNPREVfV0lERV9XQ0hBUlMgfHwgb2ZzX3RvX3JpZ2h0IDw9IDApIHsKKwkJLyogYyBmaXRzIG9uIHRoaXMgbGluZSAqLworCQlCQl9QVVRDSEFSKGMpOworCX0KKworCWlmIChvZnNfdG9fcmlnaHQgPj0gMCkgeworCQkvKiB3ZSBnbyB0byB0aGUgbmV4dCBsaW5lICovCisjaWYgSEFDS19GT1JfV1JPTkdfV0lEVEgKKwkJLyogVGhpcyB3b3JrcyBiZXR0ZXIgaWYgb3VyIGlkZWEgb2YgdGVybSB3aWR0aCBpcyB3cm9uZworCQkgKiBhbmQgaXQgaXMgYWN0dWFsbHkgd2lkZXIgKG9mdGVuIGhhcHBlbnMgb24gc2VyaWFsIGxpbmVzKS4KKwkJICogUHJpbnRpbmcgQ1IsTEYgKmZvcmNlcyogY3Vyc29yIHRvIG5leHQgbGluZS4KKwkJICogT1RPSCBpZiB0ZXJtaW5hbCB3aWR0aCBpcyBjb3JyZWN0IEFORCB0ZXJtaW5hbCBkb2VzIE5PVAorCQkgKiBoYXZlIGF1dG9tYXJnaW4gKElPVzogaXQgaXMgbW92aW5nIGN1cnNvciB0byBuZXh0IGxpbmUKKwkJICogYnkgaXRzZWxmICh3aGljaCBpcyB3cm9uZyBmb3IgVlQtMTB4IHRlcm1pbmFscykpLAorCQkgKiB0aGlzIHdpbGwgYnJlYWsgdGhpbmdzOiB0aGVyZSB3aWxsIGJlIG9uZSBleHRyYSBlbXB0eSBsaW5lICovCisJCXB1dHMoIlxyIik7IC8qICsgaW1wbGljaXQgJ1xuJyAqLworI2Vsc2UKKwkJLyogVlQtMTB4IHRlcm1pbmFscyBkb24ndCB3cmFwIGN1cnNvciB0byBuZXh0IGxpbmUgd2hlbiBsYXN0IGNoYXIKKwkJICogb24gdGhlIGxpbmUgaXMgcHJpbnRlZCAtIGN1cnNvciBzdGF5cyAib3ZlciIgdGhpcyBjaGFyLgorCQkgKiBOZWVkIHRvIHByaW50IF9uZXh0XyBjaGFyIHRvbyAoZmlyc3Qgb25lIHRvIGFwcGVhciBvbiBuZXh0IGxpbmUpCisJCSAqIHRvIG1ha2UgY3Vyc29yIG1vdmUgZG93biB0byBuZXh0IGxpbmUuCisJCSAqLworCQkvKiBXb3JrcyBvayBvbmx5IGlmIGNtZGVkaXRfdGVybXcgaXMgY29ycmVjdC4gKi8KKwkJYyA9IGNvbW1hbmRfcHNbY3Vyc29yXTsKKwkJaWYgKGMgPT0gQkJfTlVMKQorCQkJYyA9ICcgJzsKKwkJQkJfUFVUQ0hBUihjKTsKKwkJYmJfcHV0Y2hhcignXGInKTsKKyNlbmRpZgorCQljbWRlZGl0X3krKzsKKwkJaWYgKCFFTkFCTEVfVU5JQ09ERV9XSURFX1dDSEFSUyB8fCBvZnNfdG9fcmlnaHQgPT0gMCkgeworCQkJd2lkdGggPSAwOworCQl9IGVsc2UgeyAvKiBvZnNfdG9fcmlnaHQgPiAwICovCisJCQkvKiB3aWRlIGNoYXIgYyBkaWRuJ3QgZml0IG9uIHByZXYgbGluZSAqLworCQkJQkJfUFVUQ0hBUihjKTsKKwkJfQorCQljbWRlZGl0X3ggPSB3aWR0aDsKKwl9Cit9CisKKy8qIE1vdmUgdG8gZW5kIG9mIGxpbmUgKGJ5IHByaW50aW5nIGFsbCBjaGFycyB0aWxsIHRoZSBlbmQpICovCitzdGF0aWMgdm9pZCBwdXRfdGlsbF9lbmRfYW5kX2Fkdl9jdXJzb3Iodm9pZCkKK3sKKwl3aGlsZSAoY3Vyc29yIDwgY29tbWFuZF9sZW4pCisJCXB1dF9jdXJfZ2x5cGhfYW5kX2luY19jdXJzb3IoKTsKK30KKworLyogR28gdG8gdGhlIG5leHQgbGluZSAqLworc3RhdGljIHZvaWQgZ290b19uZXdfbGluZSh2b2lkKQoreworCXB1dF90aWxsX2VuZF9hbmRfYWR2X2N1cnNvcigpOworCWlmIChjbWRlZGl0X3ggIT0gMCkKKwkJYmJfcHV0Y2hhcignXG4nKTsKK30KKworc3RhdGljIHZvaWQgYmVlcCh2b2lkKQoreworCWJiX3B1dGNoYXIoJ1wwMDcnKTsKK30KKworc3RhdGljIHZvaWQgcHV0X3Byb21wdCh2b2lkKQoreworCXVuc2lnbmVkIHc7CisKKwlmcHV0cyhjbWRlZGl0X3Byb21wdCwgc3Rkb3V0KTsKKwlmZmx1c2hfYWxsKCk7CisJY3Vyc29yID0gMDsKKwl3ID0gY21kZWRpdF90ZXJtdzsgLyogcmVhZCB2b2xhdGlsZSB2YXIgb25jZSAqLworCWNtZGVkaXRfeSA9IGNtZGVkaXRfcHJtdF9sZW4gLyB3OyAvKiBuZXcgcXVhc2lyZWFsIHkgKi8KKwljbWRlZGl0X3ggPSBjbWRlZGl0X3BybXRfbGVuICUgdzsKK30KKworLyogTW92ZSBiYWNrIG9uZSBjaGFyYWN0ZXIgKi8KKy8qIChvcHRpbWl6ZWQgZm9yIHNsb3cgdGVybWluYWxzKSAqLworc3RhdGljIHZvaWQgaW5wdXRfYmFja3dhcmQodW5zaWduZWQgbnVtKQoreworCWlmIChudW0gPiBjdXJzb3IpCisJCW51bSA9IGN1cnNvcjsKKwlpZiAobnVtID09IDApCisJCXJldHVybjsKKwljdXJzb3IgLT0gbnVtOworCisJaWYgKChFTkFCTEVfVU5JQ09ERV9DT01CSU5JTkdfV0NIQVJTIHx8IEVOQUJMRV9VTklDT0RFX1dJREVfV0NIQVJTKQorCSAmJiB1bmljb2RlX3N0YXR1cyA9PSBVTklDT0RFX09OCisJKSB7CisJCS8qIGNvcnJlY3QgTlVNIHRvIGJlIGVxdWFsIHRvIF9zY3JlZW5fIHdpZHRoICovCisJCWludCBuID0gbnVtOworCQludW0gPSAwOworCQl3aGlsZSAoLS1uID49IDApCisJCQlhZGp1c3Rfd2lkdGhfYW5kX3ZhbGlkYXRlX3djKCZudW0sIGNvbW1hbmRfcHNbY3Vyc29yICsgbl0pOworCQlpZiAobnVtID09IDApCisJCQlyZXR1cm47CisJfQorCisJaWYgKGNtZGVkaXRfeCA+PSBudW0pIHsKKwkJY21kZWRpdF94IC09IG51bTsKKwkJaWYgKG51bSA8PSA0KSB7CisJCQkvKiBUaGlzIGlzIGxvbmdlciBieSA1IGJ5dGVzIG9uIHg4Ni4KKwkJCSAqIEFsc28gZ2V0cyBtaXNjb21waWxlZCBmb3IgQVJNIHVzZXJzCisJCQkgKiAoYnVzeWJveC5uZXQvYnVncy92aWV3LnBocD9pZD0yMjc0KS4KKwkJCSAqIHByaW50ZigoIlxiXGJcYlxiIiArIDQpIC0gbnVtKTsKKwkJCSAqIHJldHVybjsKKwkJCSAqLworCQkJZG8geworCQkJCWJiX3B1dGNoYXIoJ1xiJyk7CisJCQl9IHdoaWxlICgtLW51bSk7CisJCQlyZXR1cm47CisJCX0KKwkJcHJpbnRmKEVTQyJbJXVEIiwgbnVtKTsKKwkJcmV0dXJuOworCX0KKworCS8qIE5lZWQgdG8gZ28gb25lIG9yIG1vcmUgbGluZXMgdXAgKi8KKwlpZiAoRU5BQkxFX1VOSUNPREVfV0lERV9XQ0hBUlMpIHsKKwkJLyogV2l0aCB3aWRlIGNoYXJzLCBpdCBpcyBoYXJkIHRvICJiYWNrdHJhY2siCisJCSAqIGFuZCByZWxpYWJseSBmaWd1cmUgb3V0IHdoZXJlIHRvIHB1dCBjdXJzb3IuCisJCSAqIEV4YW1wbGUgKDw+IGlzIGEgd2lkZSBjaGFyOyAjIGlzIGFuIG9yZGluYXJ5IGNoYXIsIF8gY3Vyc29yKToKKwkJICogfHByb21wdDogPD48PiB8CisJCSAqIHw8Pjw+PD48Pjw+PD4gfAorCQkgKiB8XyAgICAgICAgICAgIHwKKwkJICogYW5kIHVzZXIgcHJlc3NlcyBsZWZ0IGFycm93LiBudW0gPSAxLCBjbWRlZGl0X3ggPSAwLAorCQkgKiBXZSBuZWVkIHRvIGdvIHVwIG9uZSBsaW5lLCBhbmQgdGhlbiAtIGhvdyBkbyB3ZSBrbm93IHRoYXQKKwkJICogd2UgbmVlZCB0byBnbyAqMTAqIHBvc2l0aW9ucyB0byB0aGUgcmlnaHQ/IEJlY2F1c2UKKwkJICogfHByb21wdDogPD4jPD58CisJCSAqIHw8Pjw+PD4jPD48Pjw+fAorCQkgKiB8XyAgICAgICAgICAgIHwKKwkJICogaW4gdGhpcyBzaXR1YXRpb24gd2UgbmVlZCB0byBnbyAqMTEqIHBvc2l0aW9ucyB0byB0aGUgcmlnaHQuCisJCSAqCisJCSAqIEEgc2ltcGxlciB0aGluZyB0byBkbyBpcyB0byByZWRyYXcgZXZlcnl0aGluZyBmcm9tIHRoZSBzdGFydAorCQkgKiB1cCB0byBuZXcgY3Vyc29yIHBvc2l0aW9uICh3aGljaCBpcyBhbHJlYWR5IGtub3duKToKKwkJICovCisJCXVuc2lnbmVkIHN2X2N1cnNvcjsKKwkJLyogZ28gdG8gMXN0IGNvbHVtbjsgZ28gdXAgdG8gZmlyc3QgbGluZSAqLworCQlwcmludGYoIlxyIiBFU0MiWyV1QSIsIGNtZGVkaXRfeSk7CisJCWNtZGVkaXRfeSA9IDA7CisJCXN2X2N1cnNvciA9IGN1cnNvcjsKKwkJcHV0X3Byb21wdCgpOyAvKiBzZXRzIGN1cnNvciB0byAwICovCisJCXdoaWxlIChjdXJzb3IgPCBzdl9jdXJzb3IpCisJCQlwdXRfY3VyX2dseXBoX2FuZF9pbmNfY3Vyc29yKCk7CisJfSBlbHNlIHsKKwkJaW50IGxpbmVzX3VwOworCQl1bnNpZ25lZCB3aWR0aDsKKwkJLyogbnVtID0gY2hhcnMgdG8gZ28gYmFjayBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgY3VycmVudCBsaW5lOiAqLworCQludW0gLT0gY21kZWRpdF94OworCQl3aWR0aCA9IGNtZGVkaXRfdGVybXc7IC8qIHJlYWQgdm9sYXRpbGUgdmFyIG9uY2UgKi8KKwkJLyogbnVtPTEuLi53OiBvbmUgbGluZSB1cCwgdysxLi4uMnc6IHR3bywgZXRjOiAqLworCQlsaW5lc191cCA9IDEgKyAobnVtIC0gMSkgLyB3aWR0aDsKKwkJY21kZWRpdF94ID0gKHdpZHRoICogY21kZWRpdF95IC0gbnVtKSAlIHdpZHRoOworCQljbWRlZGl0X3kgLT0gbGluZXNfdXA7CisJCS8qIGdvIHRvIDFzdCBjb2x1bW47IGdvIHVwICovCisJCXByaW50ZigiXHIiIEVTQyJbJXVBIiwgbGluZXNfdXApOworCQkvKiBnbyB0byBjb3JyZWN0IGNvbHVtbi4KKwkJICogeHRlcm0sIGtvbnNvbGUsIExpbnV4IFZUIGludGVycHJldCAwIGFzIDEgYmVsb3chIHdvdy4KKwkJICogbmVlZCB0byAqbWFrZSBzdXJlKiB3ZSBza2lwIGl0IGlmIGNtZGVkaXRfeCA9PSAwICovCisJCWlmIChjbWRlZGl0X3gpCisJCQlwcmludGYoRVNDIlsldUMiLCBjbWRlZGl0X3gpOworCX0KK30KKworLyogZHJhdyBwcm9tcHQsIGVkaXRvciBsaW5lLCBhbmQgY2xlYXIgdGFpbCAqLworc3RhdGljIHZvaWQgcmVkcmF3KGludCB5LCBpbnQgYmFja19jdXJzb3IpCit7CisJaWYgKHkgPiAwKSAvKiB1cCB5IGxpbmVzICovCisJCXByaW50ZihFU0MiWyV1QSIsIHkpOworCWJiX3B1dGNoYXIoJ1xyJyk7CisJcHV0X3Byb21wdCgpOworCXB1dF90aWxsX2VuZF9hbmRfYWR2X2N1cnNvcigpOworCXByaW50ZihTRVFfQ0xFQVJfVElMTF9FTkRfT0ZfU0NSRUVOKTsKKwlpbnB1dF9iYWNrd2FyZChiYWNrX2N1cnNvcik7Cit9CisKKy8qIERlbGV0ZSB0aGUgY2hhciBpbiBmcm9udCBvZiB0aGUgY3Vyc29yLCBvcHRpb25hbGx5IHNhdmluZyBpdAorICogZm9yIGxhdGVyIHB1dGJhY2sgKi8KKyNpZiAhRU5BQkxFX0ZFQVRVUkVfRURJVElOR19WSQorc3RhdGljIHZvaWQgaW5wdXRfZGVsZXRlKHZvaWQpCisjZGVmaW5lIGlucHV0X2RlbGV0ZShzYXZlKSBpbnB1dF9kZWxldGUoKQorI2Vsc2UKK3N0YXRpYyB2b2lkIGlucHV0X2RlbGV0ZShpbnQgc2F2ZSkKKyNlbmRpZgoreworCWludCBqID0gY3Vyc29yOworCisJaWYgKGogPT0gKGludCljb21tYW5kX2xlbikKKwkJcmV0dXJuOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19WSQorCWlmIChzYXZlKSB7CisJCWlmIChuZXdkZWxmbGFnKSB7CisJCQlkZWxwdHIgPSBkZWxidWY7CisJCQluZXdkZWxmbGFnID0gMDsKKwkJfQorCQlpZiAoKGRlbHB0ciAtIGRlbGJ1ZikgPCBERUxCVUZTSVopCisJCQkqZGVscHRyKysgPSBjb21tYW5kX3BzW2pdOworCX0KKyNlbmRpZgorCisJbWVtbW92ZShjb21tYW5kX3BzICsgaiwgY29tbWFuZF9wcyArIGogKyAxLAorCQkJLyogKGNvbW1hbmRfbGVuICsgMSBbYmVjYXVzZSBvZiBOVUxdKSAtIChqICsgMSkKKwkJCSAqIHNpbXBsaWZpZWQgaW50byAoY29tbWFuZF9sZW4gLSBqKSAqLworCQkJKGNvbW1hbmRfbGVuIC0gaikgKiBzaXplb2YoY29tbWFuZF9wc1swXSkpOworCWNvbW1hbmRfbGVuLS07CisJcHV0X3RpbGxfZW5kX2FuZF9hZHZfY3Vyc29yKCk7CisJLyogTGFzdCBjaGFyIGlzIHN0aWxsIHZpc2libGUsIGVyYXNlIGl0IChhbmQgbW9yZSkgKi8KKwlwcmludGYoU0VRX0NMRUFSX1RJTExfRU5EX09GX1NDUkVFTik7CisJaW5wdXRfYmFja3dhcmQoY3Vyc29yIC0gaik7ICAgICAvKiBiYWNrIHRvIG9sZCBwb3MgY3Vyc29yICovCit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1ZJCitzdGF0aWMgdm9pZCBwdXQodm9pZCkKK3sKKwlpbnQgb2N1cnNvcjsKKwlpbnQgaiA9IGRlbHB0ciAtIGRlbGJ1ZjsKKworCWlmIChqID09IDApCisJCXJldHVybjsKKwlvY3Vyc29yID0gY3Vyc29yOworCS8qIG9wZW4gaG9sZSBhbmQgdGhlbiBmaWxsIGl0ICovCisJbWVtbW92ZShjb21tYW5kX3BzICsgY3Vyc29yICsgaiwgY29tbWFuZF9wcyArIGN1cnNvciwKKwkJCShjb21tYW5kX2xlbiAtIGN1cnNvciArIDEpICogc2l6ZW9mKGNvbW1hbmRfcHNbMF0pKTsKKwltZW1jcHkoY29tbWFuZF9wcyArIGN1cnNvciwgZGVsYnVmLCBqICogc2l6ZW9mKGNvbW1hbmRfcHNbMF0pKTsKKwljb21tYW5kX2xlbiArPSBqOworCXB1dF90aWxsX2VuZF9hbmRfYWR2X2N1cnNvcigpOworCWlucHV0X2JhY2t3YXJkKGN1cnNvciAtIG9jdXJzb3IgLSBqICsgMSk7IC8qIGF0IGVuZCBvZiBuZXcgdGV4dCAqLworfQorI2VuZGlmCisKKy8qIERlbGV0ZSB0aGUgY2hhciBpbiBiYWNrIG9mIHRoZSBjdXJzb3IgKi8KK3N0YXRpYyB2b2lkIGlucHV0X2JhY2tzcGFjZSh2b2lkKQoreworCWlmIChjdXJzb3IgPiAwKSB7CisJCWlucHV0X2JhY2t3YXJkKDEpOworCQlpbnB1dF9kZWxldGUoMCk7CisJfQorfQorCisvKiBNb3ZlIGZvcndhcmQgb25lIGNoYXJhY3RlciAqLworc3RhdGljIHZvaWQgaW5wdXRfZm9yd2FyZCh2b2lkKQoreworCWlmIChjdXJzb3IgPCBjb21tYW5kX2xlbikKKwkJcHV0X2N1cl9nbHlwaF9hbmRfaW5jX2N1cnNvcigpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT04KKworLy9GSVhNRToKKy8vbmVlZHMgdG8gYmUgbW9yZSBjbGV2ZXI6IGN1cnJlbnRseSBpdCB0aGlua3MgdGhhdCAiZm9vXCBiPFRBQj4KKy8vbWF0Y2hlcyB0aGUgZmlsZSBuYW1lZCAiZm9vIGJhciIsIHdoaWNoIGlzIHVudHJ1ZS4KKy8vQWxzbywgcGVyaGFwcyAiZm9vIGI8VEFCPiBuZWVkcyB0byBjb21wbGV0ZSB0byAiZm9vIGJhciIgPGN1cnNvcj4sCisvL25vdCAiZm9vIGJhciA8Y3Vyc29yPi4uLgorCitzdGF0aWMgdm9pZCBmcmVlX3RhYl9jb21wbGV0aW9uX2RhdGEodm9pZCkKK3sKKwlpZiAobWF0Y2hlcykgeworCQl3aGlsZSAobnVtX21hdGNoZXMpCisJCQlmcmVlKG1hdGNoZXNbLS1udW1fbWF0Y2hlc10pOworCQlmcmVlKG1hdGNoZXMpOworCQltYXRjaGVzID0gTlVMTDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9tYXRjaChjaGFyICptYXRjaGVkKQoreworCW1hdGNoZXMgPSB4cmVhbGxvY192ZWN0b3IobWF0Y2hlcywgNCwgbnVtX21hdGNoZXMpOworCW1hdGNoZXNbbnVtX21hdGNoZXNdID0gbWF0Y2hlZDsKKwludW1fbWF0Y2hlcysrOworfQorCisjIGlmIEVOQUJMRV9GRUFUVVJFX1VTRVJOQU1FX0NPTVBMRVRJT04KKy8qIFJlcGxhY2UgIn51c2VyLy4uLiIgd2l0aCAiL2hvbWVkaXIvLi4uIi4KKyAqIFRoZSBwYXJhbWV0ZXIgaXMgbWFsbG9jZWQsIGZyZWUgaXQgb3IgcmV0dXJuIGl0CisgKiB1bmNoYW5nZWQgaWYgbm8gdXNlciBpcyBtYXRjaGVkLgorICovCitzdGF0aWMgY2hhciAqdXNlcm5hbWVfcGF0aF9jb21wbGV0aW9uKGNoYXIgKnVkKQoreworCXN0cnVjdCBwYXNzd2QgKmVudHJ5OworCWNoYXIgKnRpbGRlX25hbWUgPSB1ZDsKKwljaGFyICpob21lID0gTlVMTDsKKworCXVkKys7IC8qIHNraXAgfiAqLworCWlmICgqdWQgPT0gJy8nKSB7ICAgICAgIC8qICJ+Ly4uLiIgKi8KKwkJaG9tZSA9IGhvbWVfcHdkX2J1ZjsKKwl9IGVsc2UgeworCQkvKiAifnVzZXIvLi4uIiAqLworCQl1ZCA9IHN0cmNocih1ZCwgJy8nKTsKKwkJKnVkID0gJ1wwJzsgICAgICAgICAgIC8qICJ+dXNlciIgKi8KKwkJZW50cnkgPSBnZXRwd25hbSh0aWxkZV9uYW1lICsgMSk7CisJCSp1ZCA9ICcvJzsgICAgICAgICAgICAvKiByZXN0b3JlICJ+dXNlci8uLi4iICovCisJCWlmIChlbnRyeSkKKwkJCWhvbWUgPSBlbnRyeS0+cHdfZGlyOworCX0KKwlpZiAoaG9tZSkgeworCQl1ZCA9IGNvbmNhdF9wYXRoX2ZpbGUoaG9tZSwgdWQpOworCQlmcmVlKHRpbGRlX25hbWUpOworCQl0aWxkZV9uYW1lID0gdWQ7CisJfQorCXJldHVybiB0aWxkZV9uYW1lOworfQorCisvKiB+dXNlPHRhYj4gLSBmaW5kIGFsbCB1c2VycyB3aXRoIHRoaXMgcHJlZml4LgorICogUmV0dXJuIHRoZSBsZW5ndGggb2YgdGhlIHByZWZpeCB1c2VkIGZvciBtYXRjaGluZy4KKyAqLworc3RhdGljIE5PSU5MSU5FIHVuc2lnbmVkIGNvbXBsZXRlX3VzZXJuYW1lKGNvbnN0IGNoYXIgKnVkKQoreworCXN0cnVjdCBwYXNzd2QgKnB3OworCXVuc2lnbmVkIHVzZXJsZW47CisKKwl1ZCsrOyAvKiBza2lwIH4gKi8KKwl1c2VybGVuID0gc3RybGVuKHVkKTsKKworCXNldHB3ZW50KCk7CisJd2hpbGUgKChwdyA9IGdldHB3ZW50KCkpICE9IE5VTEwpIHsKKwkJLyogTnVsbCB1c2VybmFtZXMgc2hvdWxkIHJlc3VsdCBpbiBhbGwgdXNlcnMgYXMgcG9zc2libGUgY29tcGxldGlvbnMuICovCisJCWlmICgvKiAhdWRbMF0gfHwgKi8gaXNfcHJlZml4ZWRfd2l0aChwdy0+cHdfbmFtZSwgdWQpKSB7CisJCQlhZGRfbWF0Y2goeGFzcHJpbnRmKCJ+JXMvIiwgcHctPnB3X25hbWUpKTsKKwkJfQorCX0KKwllbmRwd2VudCgpOyAvKiBkb24ndCBrZWVwIHBhc3N3b3JkIGZpbGUgb3BlbiAqLworCisJcmV0dXJuIDEgKyB1c2VybGVuOworfQorIyBlbmRpZiAgLyogRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OICovCisKK2VudW0geworCUZJTkRfRVhFX09OTFkgPSAwLAorCUZJTkRfRElSX09OTFkgPSAxLAorCUZJTkRfRklMRV9PTkxZID0gMiwKK307CisKK3N0YXRpYyBpbnQgcGF0aF9wYXJzZShjaGFyICoqKnApCit7CisJaW50IG5wdGg7CisJY29uc3QgY2hhciAqcHRoOworCWNoYXIgKnRtcDsKKwljaGFyICoqcmVzOworCisJaWYgKHN0YXRlLT5mbGFncyAmIFdJVEhfUEFUSF9MT09LVVApCisJCXB0aCA9IHN0YXRlLT5wYXRoX2xvb2t1cDsKKwllbHNlCisJCXB0aCA9IGdldGVudigiUEFUSCIpOworCisJLyogUEFUSD0iIiBvciBQQVRIPSI6Ij8gKi8KKwlpZiAoIXB0aCB8fCAhcHRoWzBdIHx8IExPTkVfQ0hBUihwdGgsICc6JykpCisJCXJldHVybiAxOworCisJdG1wID0gKGNoYXIqKXB0aDsKKwlucHRoID0gMTsgLyogcGF0aCBjb21wb25lbnQgY291bnQgKi8KKwl3aGlsZSAoMSkgeworCQl0bXAgPSBzdHJjaHIodG1wLCAnOicpOworCQlpZiAoIXRtcCkKKwkJCWJyZWFrOworCQl0bXArKzsKKwkJaWYgKCp0bXAgPT0gJ1wwJykKKwkJCWJyZWFrOyAgLyogOjxlbXB0eT4gKi8KKwkJbnB0aCsrOworCX0KKworCSpwID0gcmVzID0geG1hbGxvYyhucHRoICogc2l6ZW9mKHJlc1swXSkpOworCXJlc1swXSA9IHRtcCA9IHhzdHJkdXAocHRoKTsKKwlucHRoID0gMTsKKwl3aGlsZSAoMSkgeworCQl0bXAgPSBzdHJjaHIodG1wLCAnOicpOworCQlpZiAoIXRtcCkKKwkJCWJyZWFrOworCQkqdG1wKysgPSAnXDAnOyAvKiAnOicgLT4gJ1wwJyAqLworCQlpZiAoKnRtcCA9PSAnXDAnKQorCQkJYnJlYWs7IC8qIDo8ZW1wdHk+ICovCisJCXJlc1tucHRoKytdID0gdG1wOworCX0KKwlyZXR1cm4gbnB0aDsKK30KKworLyogQ29tcGxldGUgY29tbWFuZCwgZGlyZWN0b3J5IG9yIGZpbGUgbmFtZS4KKyAqIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSBwcmVmaXggdXNlZCBmb3IgbWF0Y2hpbmcuCisgKi8KK3N0YXRpYyBOT0lOTElORSB1bnNpZ25lZCBjb21wbGV0ZV9jbWRfZGlyX2ZpbGUoY29uc3QgY2hhciAqY29tbWFuZCwgaW50IHR5cGUpCit7CisJY2hhciAqcGF0aDFbMV07CisJY2hhciAqKnBhdGhzID0gcGF0aDE7CisJaW50IG5wYXRoczsKKwlpbnQgaTsKKwl1bnNpZ25lZCBwZl9sZW47CisJY29uc3QgY2hhciAqcGZpbmQ7CisJY2hhciAqZGlyYnVmID0gTlVMTDsKKworCW5wYXRocyA9IDE7CisJcGF0aDFbMF0gPSAoY2hhciopIi4iOworCisJcGZpbmQgPSBzdHJyY2hyKGNvbW1hbmQsICcvJyk7CisJaWYgKCFwZmluZCkgeworCQlpZiAodHlwZSA9PSBGSU5EX0VYRV9PTkxZKQorCQkJbnBhdGhzID0gcGF0aF9wYXJzZSgmcGF0aHMpOworCQlwZmluZCA9IGNvbW1hbmQ7CisJfSBlbHNlIHsKKwkJLyogcG9pbnQgdG8gJ2wnIGluICIuLi4uL2xhc3RfY29tcG9uZW50IiAqLworCQlwZmluZCsrOworCQkvKiBkaXJidWYgPSAiLi4uLy4uLi8uLi4vIiAqLworCQlkaXJidWYgPSB4c3RybmR1cChjb21tYW5kLCBwZmluZCAtIGNvbW1hbmQpOworIyBpZiBFTkFCTEVfRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OCisJCWlmIChkaXJidWZbMF0gPT0gJ34nKSAgIC8qIH4vLi4uIG9yIH51c2VyLy4uLiAqLworCQkJZGlyYnVmID0gdXNlcm5hbWVfcGF0aF9jb21wbGV0aW9uKGRpcmJ1Zik7CisjIGVuZGlmCisJCXBhdGgxWzBdID0gZGlyYnVmOworCX0KKwlwZl9sZW4gPSBzdHJsZW4ocGZpbmQpOworCisJZm9yIChpID0gMDsgaSA8IG5wYXRoczsgaSsrKSB7CisJCURJUiAqZGlyOworCQlzdHJ1Y3QgZGlyZW50ICpuZXh0OworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJY2hhciAqZm91bmQ7CisKKwkJZGlyID0gb3BlbmRpcihwYXRoc1tpXSk7CisJCWlmICghZGlyKQorCQkJY29udGludWU7IC8qIGRvbid0IHByaW50IGFuIGVycm9yICovCisKKwkJd2hpbGUgKChuZXh0ID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCQl1bnNpZ25lZCBsZW47CisJCQljb25zdCBjaGFyICpuYW1lX2ZvdW5kID0gbmV4dC0+ZF9uYW1lOworCisJCQkvKiAuLi4vPHRhYj46IGJhc2ggMy4yLjAgc2hvd3MgZG90ZmlsZXMsIGJ1dCBub3QgLiBhbmQgLi4gKi8KKwkJCWlmICghcGZpbmRbMF0gJiYgRE9UX09SX0RPVERPVChuYW1lX2ZvdW5kKSkKKwkJCQljb250aW51ZTsKKwkJCS8qIG1hdGNoPyAqLworCQkJaWYgKCFpc19wcmVmaXhlZF93aXRoKG5hbWVfZm91bmQsIHBmaW5kKSkKKwkJCQljb250aW51ZTsgLyogbm8gKi8KKworCQkJZm91bmQgPSBjb25jYXRfcGF0aF9maWxlKHBhdGhzW2ldLCBuYW1lX2ZvdW5kKTsKKwkJCS8qIE5COiBzdGF0KCkgZmlyc3Qgc28gdGhhdCB3ZSBzZWUgaXMgaXQgYSBkaXJlY3Rvcnk7CisJCQkgKiBidXQgaWYgdGhhdCBmYWlscywgdXNlIGxzdGF0KCkgc28gdGhhdAorCQkJICogd2Ugc3RpbGwgbWF0Y2ggZGFuZ2xpbmcgbGlua3MgKi8KKwkJCWlmIChzdGF0KGZvdW5kLCAmc3QpICYmIGxzdGF0KGZvdW5kLCAmc3QpKQorCQkJCWdvdG8gY29udDsgLyogaG1tLCByZW1vdmUgaW4gcHJvZ3Jlc3M/ICovCisKKwkJCS8qIFNhdmUgb25seSBuYW1lICovCisJCQlsZW4gPSBzdHJsZW4obmFtZV9mb3VuZCk7CisJCQlmb3VuZCA9IHhyZWFsbG9jKGZvdW5kLCBsZW4gKyAyKTsgLyogKzI6IGZvciBzbGFzaCBhbmQgTlVMICovCisJCQlzdHJjcHkoZm91bmQsIG5hbWVfZm91bmQpOworCisJCQlpZiAoU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJCS8qIG5hbWUgaXMgYSBkaXJlY3RvcnksIGFkZCBzbGFzaCAqLworCQkJCWZvdW5kW2xlbl0gPSAnLyc7CisJCQkJZm91bmRbbGVuICsgMV0gPSAnXDAnOworCQkJfSBlbHNlIHsKKwkJCQkvKiBza2lwIGZpbGVzIGlmIGxvb2tpbmcgZm9yIGRpcnMgb25seSAoZXhhbXBsZTogY2QpICovCisJCQkJaWYgKHR5cGUgPT0gRklORF9ESVJfT05MWSkKKwkJCQkJZ290byBjb250OworCQkJfQorCQkJLyogYWRkIGl0IHRvIHRoZSBsaXN0ICovCisJCQlhZGRfbWF0Y2goZm91bmQpOworCQkJY29udGludWU7CisgY29udDoKKwkJCWZyZWUoZm91bmQpOworCQl9CisJCWNsb3NlZGlyKGRpcik7CisJfSAvKiBmb3IgZXZlcnkgcGF0aCAqLworCisJaWYgKHBhdGhzICE9IHBhdGgxKSB7CisJCWZyZWUocGF0aHNbMF0pOyAvKiBhbGxvY2F0ZWQgbWVtb3J5IGlzIG9ubHkgaW4gZmlyc3QgbWVtYmVyICovCisJCWZyZWUocGF0aHMpOworCX0KKwlmcmVlKGRpcmJ1Zik7CisKKwlyZXR1cm4gcGZfbGVuOworfQorCisvKiBidWlsZF9tYXRjaF9wcmVmaXg6CisgKiBPbiBlbnRyeSwgbWF0Y2hfYnVmIGNvbnRhaW5zIGV2ZXJ5dGhpbmcgdXAgdG8gY3Vyc29yIGF0IHRoZSBtb21lbnQgPHRhYj4KKyAqIHdhcyBwcmVzc2VkLiBUaGlzIGZ1bmN0aW9uIGxvb2tzIGF0IGl0LCBmaWd1cmVzIG91dCB3aGF0IHBhcnQgb2YgaXQKKyAqIGNvbnN0aXR1dGVzIHRoZSBjb21tYW5kL2ZpbGUvZGlyZWN0b3J5IHByZWZpeCB0byB1c2UgZm9yIGNvbXBsZXRpb24sCisgKiBhbmQgcmV3cml0ZXMgbWF0Y2hfYnVmIHRvIGNvbnRhaW4gb25seSB0aGF0IHBhcnQuCisgKi8KKyNkZWZpbmUgZGJnX2JtcCAwCisvKiBIZWxwZXJzOiAqLworLyogUVVPVCBpcyB1c2VkIG9uIGVsZW1lbnRzIG9mIGludF9idWZbXSwgd2hpY2ggYXJlIGJ5dGVzLAorICogbm90IFVuaWNvZGUgY2hhcnMuIFRoZXJlZm9yZSBpdCB3b3JrcyBjb3JyZWN0bHkgZXZlbiBpbiBVbmljb2RlIG1vZGUuCisgKi8KKyNkZWZpbmUgUVVPVCAoVUNIQVJfTUFYKzEpCitzdGF0aWMgdm9pZCByZW1vdmVfY2h1bmsoaW50MTZfdCAqaW50X2J1ZiwgaW50IGJlZywgaW50IGVuZCkKK3sKKwkvKiBiZWcgbXVzdCBiZSA8PSBlbmQgKi8KKwlpZiAoYmVnID09IGVuZCkKKwkJcmV0dXJuOworCisJd2hpbGUgKChpbnRfYnVmW2JlZ10gPSBpbnRfYnVmW2VuZF0pICE9IDApCisJCWJlZysrLCBlbmQrKzsKKworCWlmIChkYmdfYm1wKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpbnRfYnVmW2ldOyBpKyspCisJCQliYl9wdXRjaGFyKCh1bnNpZ25lZCBjaGFyKWludF9idWZbaV0pOworCQliYl9wdXRjaGFyKCdcbicpOworCX0KK30KKy8qIENhbGxlciBlbnN1cmVzIHRoYXQgbWF0Y2hfYnVmIHBvaW50cyB0byBhIG1hbGxvY2VkIGJ1ZmZlcgorICogYmlnIGVub3VnaCB0byBob2xkIHN0cmxlbihtYXRjaF9idWYpKjIgKyAyCisgKi8KK3N0YXRpYyBOT0lOTElORSBpbnQgYnVpbGRfbWF0Y2hfcHJlZml4KGNoYXIgKm1hdGNoX2J1ZikKK3sKKwlpbnQgaSwgajsKKwlpbnQgY29tbWFuZF9tb2RlOworCWludDE2X3QgKmludF9idWYgPSAoaW50MTZfdCopbWF0Y2hfYnVmOworCisJaWYgKGRiZ19ibXApIHByaW50ZigiXG4lc1xuIiwgbWF0Y2hfYnVmKTsKKworCS8qIENvcHkgaW4gcmV2ZXJzZSBvcmRlciwgc2luY2UgdGhleSBvdmVybGFwICovCisJaSA9IHN0cmxlbihtYXRjaF9idWYpOworCWRvIHsKKwkJaW50X2J1ZltpXSA9ICh1bnNpZ25lZCBjaGFyKW1hdGNoX2J1ZltpXTsKKwkJaS0tOworCX0gd2hpbGUgKGkgPj0gMCk7CisKKwkvKiBNYXJrIGV2ZXJ5IFxjIGFzICJxdW90ZWQgYyIgKi8KKwlmb3IgKGkgPSAwOyBpbnRfYnVmW2ldOyBpKyspIHsKKwkJaWYgKGludF9idWZbaV0gPT0gJ1xcJykgeworCQkJcmVtb3ZlX2NodW5rKGludF9idWYsIGksIGkgKyAxKTsKKwkJCWludF9idWZbaV0gfD0gUVVPVDsKKwkJfQorCX0KKwkvKiBRdW90ZS1tYXJrICJjaGFycyIgYW5kICdjaGFycycsIGRyb3AgZGVsaW1pdGVycyAqLworCXsKKwkJaW50IGluX3F1b3RlID0gMDsKKwkJaSA9IDA7CisJCXdoaWxlIChpbnRfYnVmW2ldKSB7CisJCQlpbnQgY3VyID0gaW50X2J1ZltpXTsKKwkJCWlmICghY3VyKQorCQkJCWJyZWFrOworCQkJaWYgKGN1ciA9PSAnXCcnIHx8IGN1ciA9PSAnIicpIHsKKwkJCQlpZiAoIWluX3F1b3RlIHx8IChjdXIgPT0gaW5fcXVvdGUpKSB7CisJCQkJCWluX3F1b3RlIF49IGN1cjsKKwkJCQkJcmVtb3ZlX2NodW5rKGludF9idWYsIGksIGkgKyAxKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQkJaWYgKGluX3F1b3RlKQorCQkJCWludF9idWZbaV0gPSBjdXIgfCBRVU9UOworCQkJaSsrOworCQl9CisJfQorCisJLyogUmVtb3ZlIGV2ZXJ5dGhpbmcgdXAgdG8gY29tbWFuZCBkZWxpbWl0ZXJzOgorCSAqICc7JyAnOzsnICcmJyAnfCcgJyYmJyAnfHwnLAorCSAqIGJ1dCBjYXJlZnVsIHdpdGggJz4mJyAnPCYnICc+fCcKKwkgKi8KKwlmb3IgKGkgPSAwOyBpbnRfYnVmW2ldOyBpKyspIHsKKwkJaW50IGN1ciA9IGludF9idWZbaV07CisJCWlmIChjdXIgPT0gJzsnIHx8IGN1ciA9PSAnJicgfHwgY3VyID09ICd8JykgeworCQkJaW50IHByZXYgPSBpID8gaW50X2J1ZltpIC0gMV0gOiAwOworCQkJaWYgKGN1ciA9PSAnJicgJiYgKHByZXYgPT0gJz4nIHx8IHByZXYgPT0gJzwnKSkgeworCQkJCWNvbnRpbnVlOworCQkJfSBlbHNlIGlmIChjdXIgPT0gJ3wnICYmIHByZXYgPT0gJz4nKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlyZW1vdmVfY2h1bmsoaW50X2J1ZiwgMCwgaSArIDEgKyAoY3VyID09IGludF9idWZbaSArIDFdKSk7CisJCQlpID0gLTE7ICAvKiBiYWNrIHRvIHNxdWFyZSAxICovCisJCX0KKwl9CisJLyogUmVtb3ZlIGFsbCBgY21kYCAqLworCWZvciAoaSA9IDA7IGludF9idWZbaV07IGkrKykgeworCQlpZiAoaW50X2J1ZltpXSA9PSAnYCcpIHsKKwkJCWZvciAoaiA9IGkgKyAxOyBpbnRfYnVmW2pdOyBqKyspIHsKKwkJCQlpZiAoaW50X2J1ZltqXSA9PSAnYCcpIHsKKwkJCQkJLyogYGNtZGAgc2hvdWxkIGNvdW50IGFzIGEgd29yZDoKKwkJCQkJICogYGNtZGAgYzx0YWI+IHNob3VsZCBzZWFyY2ggZm9yIGZpbGVzIGMqLAorCQkJCQkgKiBub3QgY29tbWFuZHMgYyouIFRoZXJlZm9yZSB3ZSBkb24ndCBkcm9wCisJCQkJCSAqIGBjbWRgIGVudGlyZWx5LCB3ZSByZXBsYWNlIGl0IHdpdGggc2luZ2xlIGAuCisJCQkJCSAqLworCQkJCQlyZW1vdmVfY2h1bmsoaW50X2J1ZiwgaSwgaik7CisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisJCQl9CisJCQkvKiBObyBjbG9zaW5nIGAgLSBjb21tYW5kIG1vZGUsIHJlbW92ZSBhbGwgdXAgdG8gYCAqLworCQkJcmVtb3ZlX2NodW5rKGludF9idWYsIDAsIGkgKyAxKTsKKwkJCWJyZWFrOworIG5leHQ6IDsKKwkJfQorCX0KKworCS8qIFJlbW92ZSAiY21kICgiIGFuZCAiY21kIHsiCisJICogRXhhbXBsZTogImlmIHsgYzx0YWI+IgorCSAqIEluIHRoaXMgZXhhbXBsZSwgYyBzaG91bGQgYmUgbWF0Y2hlZCBhcyBjb21tYW5kIHBmeC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpbnRfYnVmW2ldOyBpKyspIHsKKwkJaWYgKGludF9idWZbaV0gPT0gJygnIHx8IGludF9idWZbaV0gPT0gJ3snKSB7CisJCQlyZW1vdmVfY2h1bmsoaW50X2J1ZiwgMCwgaSArIDEpOworCQkJaSA9IC0xOyAgLyogYmFjayB0byBzcXVhcmUgMSAqLworCQl9CisJfQorCisJLyogUmVtb3ZlIGxlYWRpbmcgdW5xdW90ZWQgc3BhY2VzICovCisJZm9yIChpID0gMDsgaW50X2J1ZltpXTsgaSsrKQorCQlpZiAoaW50X2J1ZltpXSAhPSAnICcpCisJCQlicmVhazsKKwlyZW1vdmVfY2h1bmsoaW50X2J1ZiwgMCwgaSk7CisKKwkvKiBEZXRlcm1pbmUgY29tcGxldGlvbiBtb2RlICovCisJY29tbWFuZF9tb2RlID0gRklORF9FWEVfT05MWTsKKwlmb3IgKGkgPSAwOyBpbnRfYnVmW2ldOyBpKyspIHsKKwkJaWYgKGludF9idWZbaV0gPT0gJyAnIHx8IGludF9idWZbaV0gPT0gJzwnIHx8IGludF9idWZbaV0gPT0gJz4nKSB7CisJCQlpZiAoaW50X2J1ZltpXSA9PSAnICcKKwkJCSAmJiBjb21tYW5kX21vZGUgPT0gRklORF9FWEVfT05MWQorCQkJICYmIChjaGFyKWludF9idWZbMF0gPT0gJ2MnCisJCQkgJiYgKGNoYXIpaW50X2J1ZlsxXSA9PSAnZCcKKwkJCSAmJiBpID09IDIgLyogLT4gaW50X2J1ZlsyXSA9PSAnICcgKi8KKwkJCSkgeworCQkJCWNvbW1hbmRfbW9kZSA9IEZJTkRfRElSX09OTFk7CisJCQl9IGVsc2UgeworCQkJCWNvbW1hbmRfbW9kZSA9IEZJTkRfRklMRV9PTkxZOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmIChkYmdfYm1wKSBwcmludGYoImNvbW1hbmRfbW9kZSgwOmV4ZS8xOmRpci8yOmZpbGUpOiVkXG4iLCBjb21tYW5kX21vZGUpOworCisJLyogUmVtb3ZlIGV2ZXJ5dGhpbmcgZXhjZXB0IGxhc3Qgd29yZCAqLworCWZvciAoaSA9IDA7IGludF9idWZbaV07IGkrKykgLyogcXVhc2ktc3RybGVuKGludF9idWYpICovCisJCWNvbnRpbnVlOworCWZvciAoLS1pOyBpID49IDA7IGktLSkgeworCQlpbnQgY3VyID0gaW50X2J1ZltpXTsKKwkJaWYgKGN1ciA9PSAnICcgfHwgY3VyID09ICc8JyB8fCBjdXIgPT0gJz4nIHx8IGN1ciA9PSAnfCcgfHwgY3VyID09ICcmJykgeworCQkJcmVtb3ZlX2NodW5rKGludF9idWYsIDAsIGkgKyAxKTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJLyogQ29udmVydCBiYWNrIHRvIHN0cmluZyBvZiBfY2hhcnNfICovCisJaSA9IDA7CisJd2hpbGUgKChtYXRjaF9idWZbaV0gPSBpbnRfYnVmW2ldKSAhPSAnXDAnKQorCQlpKys7CisKKwlpZiAoZGJnX2JtcCkgcHJpbnRmKCJmaW5hbCBtYXRjaF9idWY6JyVzJ1xuIiwgbWF0Y2hfYnVmKTsKKworCXJldHVybiBjb21tYW5kX21vZGU7Cit9CisKKy8qCisgKiBEaXNwbGF5IGJ5IGNvbHVtbiAob3JpZ2luYWwgaWRlYSBmcm9tIGxzIGFwcGxldCwKKyAqIHZlcnkgb3B0aW1pemVkIGJ5IG1lIFtWbGFkaW1pcl0gOikKKyAqLworc3RhdGljIHZvaWQgc2hvd2ZpbGVzKHZvaWQpCit7CisJaW50IG5jb2xzLCByb3c7CisJaW50IGNvbHVtbl93aWR0aCA9IDA7CisJaW50IG5maWxlcyA9IG51bV9tYXRjaGVzOworCWludCBucm93cyA9IG5maWxlczsKKwlpbnQgbDsKKworCS8qIGZpbmQgdGhlIGxvbmdlc3QgZmlsZSBuYW1lIC0gdXNlIHRoYXQgYXMgdGhlIGNvbHVtbiB3aWR0aCAqLworCWZvciAocm93ID0gMDsgcm93IDwgbnJvd3M7IHJvdysrKSB7CisJCWwgPSB1bmljb2RlX3N0cndpZHRoKG1hdGNoZXNbcm93XSk7CisJCWlmIChjb2x1bW5fd2lkdGggPCBsKQorCQkJY29sdW1uX3dpZHRoID0gbDsKKwl9CisJY29sdW1uX3dpZHRoICs9IDI7ICAgICAgICAgICAgICAvKiBtaW4gc3BhY2UgZm9yIGNvbHVtbnMgKi8KKwluY29scyA9IGNtZGVkaXRfdGVybXcgLyBjb2x1bW5fd2lkdGg7CisKKwlpZiAobmNvbHMgPiAxKSB7CisJCW5yb3dzIC89IG5jb2xzOworCQlpZiAobmZpbGVzICUgbmNvbHMpCisJCQlucm93cysrOyAgICAgICAgLyogcm91bmQgdXAgZnJhY3Rpb25hbHMgKi8KKwl9IGVsc2UgeworCQluY29scyA9IDE7CisJfQorCWZvciAocm93ID0gMDsgcm93IDwgbnJvd3M7IHJvdysrKSB7CisJCWludCBuID0gcm93OworCQlpbnQgbmM7CisKKwkJZm9yIChuYyA9IDE7IG5jIDwgbmNvbHMgJiYgbitucm93cyA8IG5maWxlczsgbiArPSBucm93cywgbmMrKykgeworCQkJcHJpbnRmKCIlcyUtKnMiLCBtYXRjaGVzW25dLAorCQkJCShpbnQpKGNvbHVtbl93aWR0aCAtIHVuaWNvZGVfc3Ryd2lkdGgobWF0Y2hlc1tuXSkpLCAiIgorCQkJKTsKKwkJfQorCQlpZiAoRU5BQkxFX1VOSUNPREVfU1VQUE9SVCkKKwkJCXB1dHMocHJpbnRhYmxlX3N0cmluZyhOVUxMLCBtYXRjaGVzW25dKSk7CisJCWVsc2UKKwkJCXB1dHMobWF0Y2hlc1tuXSk7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqaXNfc3BlY2lhbF9jaGFyKGNoYXIgYykKK3sKKwlyZXR1cm4gc3RyY2hyKCIgYFwiIyQlXiYqKCk9K3t9W106Oyd8XFw8PiIsIGMpOworfQorCitzdGF0aWMgY2hhciAqcXVvdGVfc3BlY2lhbF9jaGFycyhjaGFyICpmb3VuZCkKK3sKKwlpbnQgbCA9IDA7CisJY2hhciAqcyA9IHh6YWxsb2MoKHN0cmxlbihmb3VuZCkgKyAxKSAqIDIpOworCisJd2hpbGUgKCpmb3VuZCkgeworCQlpZiAoaXNfc3BlY2lhbF9jaGFyKCpmb3VuZCkpCisJCQlzW2wrK10gPSAnXFwnOworCQlzW2wrK10gPSAqZm91bmQrKzsKKwl9CisJLyogc1tsXSA9ICdcMCc7IC0gYWxyZWFkeSBpcyAqLworCXJldHVybiBzOworfQorCisvKiBEbyBUQUIgY29tcGxldGlvbiAqLworc3RhdGljIE5PSU5MSU5FIHZvaWQgaW5wdXRfdGFiKHNtYWxsaW50ICpsYXN0V2FzVGFiKQoreworCWNoYXIgKmNob3Nlbl9tYXRjaDsKKwljaGFyICptYXRjaF9idWY7CisJc2l6ZV90IGxlbl9mb3VuZDsKKwkvKiBMZW5ndGggb2Ygc3RyaW5nIHVzZWQgZm9yIG1hdGNoaW5nICovCisJdW5zaWduZWQgbWF0Y2hfcGZ4X2xlbiA9IG1hdGNoX3BmeF9sZW47CisJaW50IGZpbmRfdHlwZTsKKyMgaWYgRU5BQkxFX1VOSUNPREVfU1VQUE9SVAorCS8qIGN1cnNvciBwb3MgaW4gY29tbWFuZCBjb252ZXJ0ZWQgdG8gbXVsdGlieXRlIGZvcm0gKi8KKwlpbnQgY3Vyc29yX21iOworIyBlbmRpZgorCWlmICghKHN0YXRlLT5mbGFncyAmIFRBQl9DT01QTEVUSU9OKSkKKwkJcmV0dXJuOworCisJaWYgKCpsYXN0V2FzVGFiKSB7CisJCS8qIFRoZSBsYXN0IGNoYXIgd2FzIGEgVEFCIHRvby4KKwkJICogUHJpbnQgYSBsaXN0IG9mIGFsbCB0aGUgYXZhaWxhYmxlIGNob2ljZXMuCisJCSAqLworCQlpZiAobnVtX21hdGNoZXMgPiAwKSB7CisJCQkvKiBjdXJzb3Igd2lsbCBiZSBjaGFuZ2VkIGJ5IGdvdG9fbmV3X2xpbmUoKSAqLworCQkJaW50IHNhdl9jdXJzb3IgPSBjdXJzb3I7CisJCQlnb3RvX25ld19saW5lKCk7CisJCQlzaG93ZmlsZXMoKTsKKwkJCXJlZHJhdygwLCBjb21tYW5kX2xlbiAtIHNhdl9jdXJzb3IpOworCQl9CisJCXJldHVybjsKKwl9CisKKwkqbGFzdFdhc1RhYiA9IDE7CisJY2hvc2VuX21hdGNoID0gTlVMTDsKKworCS8qIE1ha2UgYSBsb2NhbCBjb3B5IG9mIHRoZSBzdHJpbmcgdXAgdG8gdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJzb3IuCisJICogYnVpbGRfbWF0Y2hfcHJlZml4IHdpbGwgZXhwYW5kIGl0IGludG8gaW50MTZfdCdzLCBuZWVkIHRvIGFsbG9jYXRlCisJICogdHdpY2UgYXMgbXVjaCBhcyB0aGUgc3RyaW5nX2xlbisxLgorCSAqICh3ZSB0aGVuIGFsc28gKGFiKXVzZSB0aGlzIGV4dHJhIHNwYWNlIGxhdGVyIC0gc2VlICgqKikpCisJICovCisJbWF0Y2hfYnVmID0geG1hbGxvYyhNQVhfTElORUxFTiAqIHNpemVvZihpbnQxNl90KSk7CisjIGlmICFFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisJc2F2ZV9zdHJpbmcobWF0Y2hfYnVmLCBjdXJzb3IgKyAxKTsgLyogKzEgZm9yIE5VTCAqLworIyBlbHNlCisJeworCQlDSEFSX1Qgd2MgPSBjb21tYW5kX3BzW2N1cnNvcl07CisJCWNvbW1hbmRfcHNbY3Vyc29yXSA9IEJCX05VTDsKKwkJc2F2ZV9zdHJpbmcobWF0Y2hfYnVmLCBNQVhfTElORUxFTik7CisJCWNvbW1hbmRfcHNbY3Vyc29yXSA9IHdjOworCQljdXJzb3JfbWIgPSBzdHJsZW4obWF0Y2hfYnVmKTsKKwl9CisjIGVuZGlmCisJZmluZF90eXBlID0gYnVpbGRfbWF0Y2hfcHJlZml4KG1hdGNoX2J1Zik7CisKKwkvKiBGcmVlIHVwIGFueSBtZW1vcnkgYWxyZWFkeSBhbGxvY2F0ZWQgKi8KKwlmcmVlX3RhYl9jb21wbGV0aW9uX2RhdGEoKTsKKworIyBpZiBFTkFCTEVfRkVBVFVSRV9VU0VSTkFNRV9DT01QTEVUSU9OCisJLyogSWYgdGhlIHdvcmQgc3RhcnRzIHdpdGggfiBhbmQgdGhlcmUgaXMgbm8gc2xhc2ggaW4gdGhlIHdvcmQsCisJICogdGhlbiB0cnkgY29tcGxldGluZyB0aGlzIHdvcmQgYXMgYSB1c2VybmFtZS4gKi8KKwlpZiAoc3RhdGUtPmZsYWdzICYgVVNFUk5BTUVfQ09NUExFVElPTikKKwkJaWYgKG1hdGNoX2J1ZlswXSA9PSAnficgJiYgc3RyY2hyKG1hdGNoX2J1ZiwgJy8nKSA9PSBOVUxMKQorCQkJbWF0Y2hfcGZ4X2xlbiA9IGNvbXBsZXRlX3VzZXJuYW1lKG1hdGNoX2J1Zik7CisjIGVuZGlmCisJLyogSWYgY29tcGxldGVfdXNlcm5hbWUoKSBkaWQgbm90IG1hdGNoLAorCSAqIHRyeSB0byBtYXRjaCBhIGNvbW1hbmQgaW4gJFBBVEgsIG9yIGEgZGlyZWN0b3J5LCBvciBhIGZpbGUgKi8KKwlpZiAoIW1hdGNoZXMpCisJCW1hdGNoX3BmeF9sZW4gPSBjb21wbGV0ZV9jbWRfZGlyX2ZpbGUobWF0Y2hfYnVmLCBmaW5kX3R5cGUpOworCisJLyogQWNjb3VudCBmb3IgYmFja3NsYXNoZXMgd2hpY2ggd2lsbCBiZSBpbnNlcnRlZAorCSAqIGJ5IHF1b3RlX3NwZWNpYWxfY2hhcnMoKSBsYXRlciAqLworCXsKKwkJY29uc3QgY2hhciAqZSA9IG1hdGNoX2J1ZiArIHN0cmxlbihtYXRjaF9idWYpOworCQljb25zdCBjaGFyICpzID0gZSAtIG1hdGNoX3BmeF9sZW47CisJCXdoaWxlIChzIDwgZSkKKwkJCWlmIChpc19zcGVjaWFsX2NoYXIoKnMrKykpCisJCQkJbWF0Y2hfcGZ4X2xlbisrOworCX0KKworCS8qIFJlbW92ZSBkdXBsaWNhdGVzICovCisJaWYgKG1hdGNoZXMpIHsKKwkJdW5zaWduZWQgaSwgbiA9IDA7CisJCXFzb3J0X3N0cmluZ192ZWN0b3IobWF0Y2hlcywgbnVtX21hdGNoZXMpOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX21hdGNoZXMgLSAxOyArK2kpIHsKKwkJCS8vaWYgKG1hdGNoZXNbaV0gJiYgbWF0Y2hlc1tpKzFdKSB7IC8qIHBhcmFub2lhICovCisJCQkJaWYgKHN0cmNtcChtYXRjaGVzW2ldLCBtYXRjaGVzW2krMV0pID09IDApIHsKKwkJCQkJZnJlZShtYXRjaGVzW2ldKTsKKwkJCQkJLy9tYXRjaGVzW2ldID0gTlVMTDsgLyogcGFyYW5vaWEgKi8KKwkJCQl9IGVsc2UgeworCQkJCQltYXRjaGVzW24rK10gPSBtYXRjaGVzW2ldOworCQkJCX0KKwkJCS8vfQorCQl9CisJCW1hdGNoZXNbbisrXSA9IG1hdGNoZXNbaV07CisJCW51bV9tYXRjaGVzID0gbjsKKwl9CisKKwkvKiBEaWQgd2UgZmluZCBleGFjdGx5IG9uZSBtYXRjaD8gKi8KKwlpZiAobnVtX21hdGNoZXMgIT0gMSkgeyAvKiBubyAqLworCQljaGFyICpjcDsKKwkJYmVlcCgpOworCQlpZiAoIW1hdGNoZXMpCisJCQlnb3RvIHJldDsgLyogbm8gbWF0Y2hlcyBhdCBhbGwgKi8KKwkJLyogRmluZCBjb21tb24gcHJlZml4ICovCisJCWNob3Nlbl9tYXRjaCA9IHhzdHJkdXAobWF0Y2hlc1swXSk7CisJCWZvciAoY3AgPSBjaG9zZW5fbWF0Y2g7ICpjcDsgY3ArKykgeworCQkJdW5zaWduZWQgbjsKKwkJCWZvciAobiA9IDE7IG4gPCBudW1fbWF0Y2hlczsgbisrKSB7CisJCQkJaWYgKG1hdGNoZXNbbl1bY3AgLSBjaG9zZW5fbWF0Y2hdICE9ICpjcCkgeworCQkJCQlnb3RvIHN0b3A7CisJCQkJfQorCQkJfQorCQl9Cisgc3RvcDoKKwkJaWYgKGNwID09IGNob3Nlbl9tYXRjaCkgeyAvKiBoYXZlIHVuaXF1ZSBwcmVmaXg/ICovCisJCQlnb3RvIHJldDsgLyogbm8gKi8KKwkJfQorCQkqY3AgPSAnXDAnOworCQljcCA9IHF1b3RlX3NwZWNpYWxfY2hhcnMoY2hvc2VuX21hdGNoKTsKKwkJZnJlZShjaG9zZW5fbWF0Y2gpOworCQljaG9zZW5fbWF0Y2ggPSBjcDsKKwkJbGVuX2ZvdW5kID0gc3RybGVuKGNob3Nlbl9tYXRjaCk7CisJfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBleGFjdGx5IG9uZSBtYXRjaCAqLworCQkvKiBOZXh0IDx0YWI+IGlzIG5vdCBhIGRvdWJsZS10YWIgKi8KKwkJKmxhc3RXYXNUYWIgPSAwOworCisJCWNob3Nlbl9tYXRjaCA9IHF1b3RlX3NwZWNpYWxfY2hhcnMobWF0Y2hlc1swXSk7CisJCWxlbl9mb3VuZCA9IHN0cmxlbihjaG9zZW5fbWF0Y2gpOworCQlpZiAoY2hvc2VuX21hdGNoW2xlbl9mb3VuZC0xXSAhPSAnLycpIHsKKwkJCWNob3Nlbl9tYXRjaFtsZW5fZm91bmRdID0gJyAnOworCQkJY2hvc2VuX21hdGNoWysrbGVuX2ZvdW5kXSA9ICdcMCc7CisJCX0KKwl9CisKKyMgaWYgIUVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwkvKiBIYXZlIHNwYWNlIHRvIHBsYWNlIHRoZSBtYXRjaD8gKi8KKwkvKiBUaGUgcmVzdWx0IGNvbnNpc3RzIG9mIHRocmVlIHBhcnRzIHdpdGggdGhlc2UgbGVuZ3RoczogKi8KKwkvKiBjdXJzb3IgKyAobGVuX2ZvdW5kIC0gbWF0Y2hfcGZ4X2xlbikgKyAoY29tbWFuZF9sZW4gLSBjdXJzb3IpICovCisJLyogaXQgc2ltcGxpZmllcyBpbnRvOiAqLworCWlmICgoaW50KShsZW5fZm91bmQgLSBtYXRjaF9wZnhfbGVuICsgY29tbWFuZF9sZW4pIDwgUy5tYXhzaXplKSB7CisJCWludCBwb3M7CisJCS8qIHNhdmUgdGFpbCAqLworCQlzdHJjcHkobWF0Y2hfYnVmLCAmY29tbWFuZF9wc1tjdXJzb3JdKTsKKwkJLyogYWRkIG1hdGNoIGFuZCB0YWlsICovCisJCXNwcmludGYoJmNvbW1hbmRfcHNbY3Vyc29yXSwgIiVzJXMiLCBjaG9zZW5fbWF0Y2ggKyBtYXRjaF9wZnhfbGVuLCBtYXRjaF9idWYpOworCQljb21tYW5kX2xlbiA9IHN0cmxlbihjb21tYW5kX3BzKTsKKwkJLyogbmV3IHBvcyAqLworCQlwb3MgPSBjdXJzb3IgKyBsZW5fZm91bmQgLSBtYXRjaF9wZnhfbGVuOworCQkvKiB3cml0ZSBvdXQgdGhlIG1hdGNoZWQgY29tbWFuZCAqLworCQlyZWRyYXcoY21kZWRpdF95LCBjb21tYW5kX2xlbiAtIHBvcyk7CisJfQorIyBlbHNlCisJeworCQkvKiBVc2UgMm5kIGhhbGYgb2YgbWF0Y2hfYnVmIGFzIHNjcmF0Y2ggc3BhY2UgLSBzZWUgKCoqKSAqLworCQljaGFyICpjb21tYW5kID0gbWF0Y2hfYnVmICsgTUFYX0xJTkVMRU47CisJCWludCBsZW4gPSBzYXZlX3N0cmluZyhjb21tYW5kLCBNQVhfTElORUxFTik7CisJCS8qIEhhdmUgc3BhY2UgdG8gcGxhY2UgdGhlIG1hdGNoPyAqLworCQkvKiBjdXJzb3JfbWIgKyAobGVuX2ZvdW5kIC0gbWF0Y2hfcGZ4X2xlbikgKyAobGVuIC0gY3Vyc29yX21iKSAqLworCQlpZiAoKGludCkobGVuX2ZvdW5kIC0gbWF0Y2hfcGZ4X2xlbiArIGxlbikgPCBNQVhfTElORUxFTikgeworCQkJaW50IHBvczsKKwkJCS8qIHNhdmUgdGFpbCAqLworCQkJc3RyY3B5KG1hdGNoX2J1ZiwgJmNvbW1hbmRbY3Vyc29yX21iXSk7CisJCQkvKiB3aGVyZSBkbyB3ZSB3YW50IHRvIGhhdmUgY3Vyc29yIGFmdGVyIGFsbD8gKi8KKwkJCXN0cmNweSgmY29tbWFuZFtjdXJzb3JfbWJdLCBjaG9zZW5fbWF0Y2ggKyBtYXRjaF9wZnhfbGVuKTsKKwkJCWxlbiA9IGxvYWRfc3RyaW5nKGNvbW1hbmQpOworCQkJLyogYWRkIG1hdGNoIGFuZCB0YWlsICovCisJCQlzcHJpbnRmKCZjb21tYW5kW2N1cnNvcl9tYl0sICIlcyVzIiwgY2hvc2VuX21hdGNoICsgbWF0Y2hfcGZ4X2xlbiwgbWF0Y2hfYnVmKTsKKwkJCWNvbW1hbmRfbGVuID0gbG9hZF9zdHJpbmcoY29tbWFuZCk7CisJCQkvKiB3cml0ZSBvdXQgdGhlIG1hdGNoZWQgY29tbWFuZCAqLworCQkJLyogcGFyYW5vaWE6IGxvYWRfc3RyaW5nIGNhbiByZXR1cm4gMCBvbiBjb252IGVycm9yLAorCQkJICogcHJldmVudCBwYXNzaW5nIHBvcyA9ICgwIC0gMTIpIHRvIHJlZHJhdyAqLworCQkJcG9zID0gY29tbWFuZF9sZW4gLSBsZW47CisJCQlyZWRyYXcoY21kZWRpdF95LCBwb3MgPj0gMCA/IHBvcyA6IDApOworCQl9CisJfQorIyBlbmRpZgorIHJldDoKKwlmcmVlKGNob3Nlbl9tYXRjaCk7CisJZnJlZShtYXRjaF9idWYpOworfQorCisjZW5kaWYgIC8qIEZFQVRVUkVfVEFCX0NPTVBMRVRJT04gKi8KKworCitsaW5lX2lucHV0X3QqIEZBU1RfRlVOQyBuZXdfbGluZV9pbnB1dF90KGludCBmbGFncykKK3sKKwlsaW5lX2lucHV0X3QgKm4gPSB4emFsbG9jKHNpemVvZigqbikpOworCW4tPmZsYWdzID0gZmxhZ3M7CisjaWYgTUFYX0hJU1RPUlkgPiAwCisJbi0+bWF4X2hpc3RvcnkgPSBNQVhfSElTVE9SWTsKKyNlbmRpZgorCXJldHVybiBuOworfQorCisKKyNpZiBNQVhfSElTVE9SWSA+IDAKKwordW5zaWduZWQgRkFTVF9GVU5DIHNpemVfZnJvbV9ISVNURklMRVNJWkUoY29uc3QgY2hhciAqaHApCit7CisJaW50IHNpemUgPSBNQVhfSElTVE9SWTsKKwlpZiAoaHApIHsKKwkJc2l6ZSA9IGF0b2koaHApOworCQlpZiAoc2l6ZSA8PSAwKQorCQkJcmV0dXJuIDE7CisJCWlmIChzaXplID4gTUFYX0hJU1RPUlkpCisJCQlyZXR1cm4gTUFYX0hJU1RPUlk7CisJfQorCXJldHVybiBzaXplOworfQorCitzdGF0aWMgdm9pZCBzYXZlX2NvbW1hbmRfcHNfYXRfY3VyX2hpc3Rvcnkodm9pZCkKK3sKKwlpZiAoY29tbWFuZF9wc1swXSAhPSBCQl9OVUwpIHsKKwkJaW50IGN1ciA9IHN0YXRlLT5jdXJfaGlzdG9yeTsKKwkJZnJlZShzdGF0ZS0+aGlzdG9yeVtjdXJdKTsKKworIyBpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisJCXsKKwkJCWNoYXIgdGJ1ZltNQVhfTElORUxFTl07CisJCQlzYXZlX3N0cmluZyh0YnVmLCBzaXplb2YodGJ1ZikpOworCQkJc3RhdGUtPmhpc3RvcnlbY3VyXSA9IHhzdHJkdXAodGJ1Zik7CisJCX0KKyMgZWxzZQorCQlzdGF0ZS0+aGlzdG9yeVtjdXJdID0geHN0cmR1cChjb21tYW5kX3BzKTsKKyMgZW5kaWYKKwl9Cit9CisKKy8qIHN0YXRlLT5mbGFncyBpcyBhbHJlYWR5IGNoZWNrZWQgdG8gYmUgbm9uemVybyAqLworc3RhdGljIGludCBnZXRfcHJldmlvdXNfaGlzdG9yeSh2b2lkKQoreworCWlmICgoc3RhdGUtPmZsYWdzICYgRE9fSElTVE9SWSkgJiYgc3RhdGUtPmN1cl9oaXN0b3J5KSB7CisJCXNhdmVfY29tbWFuZF9wc19hdF9jdXJfaGlzdG9yeSgpOworCQlzdGF0ZS0+Y3VyX2hpc3RvcnktLTsKKwkJcmV0dXJuIDE7CisJfQorCWJlZXAoKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfbmV4dF9oaXN0b3J5KHZvaWQpCit7CisJaWYgKHN0YXRlLT5mbGFncyAmIERPX0hJU1RPUlkpIHsKKwkJaWYgKHN0YXRlLT5jdXJfaGlzdG9yeSA8IHN0YXRlLT5jbnRfaGlzdG9yeSkgeworCQkJc2F2ZV9jb21tYW5kX3BzX2F0X2N1cl9oaXN0b3J5KCk7IC8qIHNhdmUgdGhlIGN1cnJlbnQgaGlzdG9yeSBsaW5lICovCisJCQlyZXR1cm4gKytzdGF0ZS0+Y3VyX2hpc3Rvcnk7CisJCX0KKwl9CisJYmVlcCgpOworCXJldHVybiAwOworfQorCisvKiBMaXN0cyBjb21tYW5kIGhpc3RvcnkuIFVzZWQgYnkgc2hlbGwgJ2hpc3RvcnknIGJ1aWx0aW5zICovCit2b2lkIEZBU1RfRlVOQyBzaG93X2hpc3RvcnkoY29uc3QgbGluZV9pbnB1dF90ICpzdCkKK3sKKwlpbnQgaTsKKworCWlmICghc3QpCisJCXJldHVybjsKKwlmb3IgKGkgPSAwOyBpIDwgc3QtPmNudF9oaXN0b3J5OyBpKyspCisJCXByaW50ZigiJTRkICVzXG4iLCBpLCBzdC0+aGlzdG9yeVtpXSk7Cit9CisKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19TQVZFSElTVE9SWQorLyogV2UgdHJ5IHRvIGVuc3VyZSB0aGF0IGNvbmN1cnJlbnQgYWRkaXRpb25zIHRvIHRoZSBoaXN0b3J5CisgKiBkbyBub3Qgb3ZlcndyaXRlIGVhY2ggb3RoZXIuCisgKiBPdGhlcndpc2Ugc2hlbGwgdXNlcnMgZ2V0IHVuaGFwcHkuCisgKgorICogSGlzdG9yeSBmaWxlIGlzIHRyaW1tZWQgbGF6aWx5LCB3aGVuIGl0IGdyb3dzIHNldmVyYWwgdGltZXMgbG9uZ2VyCisgKiB0aGFuIGNvbmZpZ3VyZWQgTUFYX0hJU1RPUlkgbGluZXMuCisgKi8KKworc3RhdGljIHZvaWQgZnJlZV9saW5lX2lucHV0X3QobGluZV9pbnB1dF90ICpuKQoreworCWludCBpID0gbi0+Y250X2hpc3Rvcnk7CisJd2hpbGUgKGkgPiAwKQorCQlmcmVlKG4tPmhpc3RvcnlbLS1pXSk7CisJZnJlZShuKTsKK30KKworLyogc3RhdGUtPmZsYWdzIGlzIGFscmVhZHkgY2hlY2tlZCB0byBiZSBub256ZXJvICovCitzdGF0aWMgdm9pZCBsb2FkX2hpc3RvcnkobGluZV9pbnB1dF90ICpzdF9wYXJtKQoreworCWNoYXIgKnRlbXBfaFtNQVhfSElTVE9SWV07CisJY2hhciAqbGluZTsKKwlGSUxFICpmcDsKKwl1bnNpZ25lZCBpZHgsIGksIGxpbmVfbGVuOworCisJLyogTkI6IGRvIG5vdCB0cmFzaCBvbGQgaGlzdG9yeSBpZiBmaWxlIGNhbid0IGJlIG9wZW5lZCAqLworCisJZnAgPSBmb3Blbl9mb3JfcmVhZChzdF9wYXJtLT5oaXN0X2ZpbGUpOworCWlmIChmcCkgeworCQkvKiBjbGVhbiB1cCBvbGQgaGlzdG9yeSAqLworCQlmb3IgKGlkeCA9IHN0X3Bhcm0tPmNudF9oaXN0b3J5OyBpZHggPiAwOykgeworCQkJaWR4LS07CisJCQlmcmVlKHN0X3Bhcm0tPmhpc3RvcnlbaWR4XSk7CisJCQlzdF9wYXJtLT5oaXN0b3J5W2lkeF0gPSBOVUxMOworCQl9CisKKwkJLyogZmlsbCB0ZW1wX2hbXSwgcmV0YWluaW5nIG9ubHkgbGFzdCBNQVhfSElTVE9SWSBsaW5lcyAqLworCQltZW1zZXQodGVtcF9oLCAwLCBzaXplb2YodGVtcF9oKSk7CisJCWlkeCA9IDA7CisJCXN0X3Bhcm0tPmNudF9oaXN0b3J5X2luX2ZpbGUgPSAwOworCQl3aGlsZSAoKGxpbmUgPSB4bWFsbG9jX2ZnZXRsaW5lKGZwKSkgIT0gTlVMTCkgeworCQkJaWYgKGxpbmVbMF0gPT0gJ1wwJykgeworCQkJCWZyZWUobGluZSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlmcmVlKHRlbXBfaFtpZHhdKTsKKwkJCXRlbXBfaFtpZHhdID0gbGluZTsKKwkJCXN0X3Bhcm0tPmNudF9oaXN0b3J5X2luX2ZpbGUrKzsKKwkJCWlkeCsrOworCQkJaWYgKGlkeCA9PSBzdF9wYXJtLT5tYXhfaGlzdG9yeSkKKwkJCQlpZHggPSAwOworCQl9CisJCWZjbG9zZShmcCk7CisKKwkJLyogZmluZCBmaXJzdCBub24tTlVMTCB0ZW1wX2hbXSwgaWYgYW55ICovCisJCWlmIChzdF9wYXJtLT5jbnRfaGlzdG9yeV9pbl9maWxlKSB7CisJCQl3aGlsZSAodGVtcF9oW2lkeF0gPT0gTlVMTCkgeworCQkJCWlkeCsrOworCQkJCWlmIChpZHggPT0gc3RfcGFybS0+bWF4X2hpc3RvcnkpCisJCQkJCWlkeCA9IDA7CisJCQl9CisJCX0KKworCQkvKiBjb3B5IHRlbXBfaFtdIHRvIHN0X3Bhcm0tPmhpc3RvcnlbXSAqLworCQlmb3IgKGkgPSAwOyBpIDwgc3RfcGFybS0+bWF4X2hpc3Rvcnk7KSB7CisJCQlsaW5lID0gdGVtcF9oW2lkeF07CisJCQlpZiAoIWxpbmUpCisJCQkJYnJlYWs7CisJCQlpZHgrKzsKKwkJCWlmIChpZHggPT0gc3RfcGFybS0+bWF4X2hpc3RvcnkpCisJCQkJaWR4ID0gMDsKKwkJCWxpbmVfbGVuID0gc3RybGVuKGxpbmUpOworCQkJaWYgKGxpbmVfbGVuID49IE1BWF9MSU5FTEVOKQorCQkJCWxpbmVbTUFYX0xJTkVMRU4tMV0gPSAnXDAnOworCQkJc3RfcGFybS0+aGlzdG9yeVtpKytdID0gbGluZTsKKwkJfQorCQlzdF9wYXJtLT5jbnRfaGlzdG9yeSA9IGk7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1NBVkVfT05fRVhJVCkKKwkJCXN0X3Bhcm0tPmNudF9oaXN0b3J5X2luX2ZpbGUgPSBpOworCX0KK30KKworIyAgaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19TQVZFX09OX0VYSVQKK3ZvaWQgc2F2ZV9oaXN0b3J5KGxpbmVfaW5wdXRfdCAqc3QpCit7CisJRklMRSAqZnA7CisKKwlpZiAoIXN0LT5oaXN0X2ZpbGUpCisJCXJldHVybjsKKwlpZiAoc3QtPmNudF9oaXN0b3J5IDw9IHN0LT5jbnRfaGlzdG9yeV9pbl9maWxlKQorCQlyZXR1cm47CisKKwlmcCA9IGZvcGVuKHN0LT5oaXN0X2ZpbGUsICJhIik7CisJaWYgKGZwKSB7CisJCWludCBpLCBmZDsKKwkJY2hhciAqbmV3X25hbWU7CisJCWxpbmVfaW5wdXRfdCAqc3RfdGVtcDsKKworCQlmb3IgKGkgPSBzdC0+Y250X2hpc3RvcnlfaW5fZmlsZTsgaSA8IHN0LT5jbnRfaGlzdG9yeTsgaSsrKQorCQkJZnByaW50ZihmcCwgIiVzXG4iLCBzdC0+aGlzdG9yeVtpXSk7CisJCWZjbG9zZShmcCk7CisKKwkJLyogd2UgbWF5IGhhdmUgY29uY3VycmVudGx5IHdyaXR0ZW4gZW50cmllcyBmcm9tIG90aGVycy4KKwkJICogbG9hZCB0aGVtICovCisJCXN0X3RlbXAgPSBuZXdfbGluZV9pbnB1dF90KHN0LT5mbGFncyk7CisJCXN0X3RlbXAtPmhpc3RfZmlsZSA9IHN0LT5oaXN0X2ZpbGU7CisJCXN0X3RlbXAtPm1heF9oaXN0b3J5ID0gc3QtPm1heF9oaXN0b3J5OworCQlsb2FkX2hpc3Rvcnkoc3RfdGVtcCk7CisKKwkJLyogd3JpdGUgb3V0IHRlbXAgZmlsZSBhbmQgcmVwbGFjZSBoaXN0X2ZpbGUgYXRvbWljYWxseSAqLworCQluZXdfbmFtZSA9IHhhc3ByaW50ZigiJXMuJXUubmV3Iiwgc3QtPmhpc3RfZmlsZSwgKGludCkgZ2V0cGlkKCkpOworCQlmZCA9IG9wZW4obmV3X25hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMsIDA2MDApOworCQlpZiAoZmQgPj0gMCkgeworCQkJZnAgPSB4ZmRvcGVuX2Zvcl93cml0ZShmZCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgc3RfdGVtcC0+Y250X2hpc3Rvcnk7IGkrKykKKwkJCQlmcHJpbnRmKGZwLCAiJXNcbiIsIHN0X3RlbXAtPmhpc3RvcnlbaV0pOworCQkJZmNsb3NlKGZwKTsKKwkJCWlmIChyZW5hbWUobmV3X25hbWUsIHN0LT5oaXN0X2ZpbGUpID09IDApCisJCQkJc3QtPmNudF9oaXN0b3J5X2luX2ZpbGUgPSBzdF90ZW1wLT5jbnRfaGlzdG9yeTsKKwkJfQorCQlmcmVlKG5ld19uYW1lKTsKKwkJZnJlZV9saW5lX2lucHV0X3Qoc3RfdGVtcCk7CisJfQorfQorIyAgZWxzZQorc3RhdGljIHZvaWQgc2F2ZV9oaXN0b3J5KGNoYXIgKnN0cikKK3sKKwlpbnQgZmQ7CisJaW50IGxlbiwgbGVuMjsKKworCWlmICghc3RhdGUtPmhpc3RfZmlsZSkKKwkJcmV0dXJuOworCisJZmQgPSBvcGVuKHN0YXRlLT5oaXN0X2ZpbGUsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fQVBQRU5ELCAwNjAwKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm47CisJeGxzZWVrKGZkLCAwLCBTRUVLX0VORCk7IC8qIHBhcmFub2lhICovCisJbGVuID0gc3RybGVuKHN0cik7CisJc3RyW2xlbl0gPSAnXG4nOyAvKiB3ZSAodHJ5IHRvKSBkbyBhdG9taWMgd3JpdGUgKi8KKwlsZW4yID0gZnVsbF93cml0ZShmZCwgc3RyLCBsZW4gKyAxKTsKKwlzdHJbbGVuXSA9ICdcMCc7CisJY2xvc2UoZmQpOworCWlmIChsZW4yICE9IGxlbiArIDEpCisJCXJldHVybjsgLyogInd0Zj8iICovCisKKwkvKiBkaWQgd2Ugd3JpdGUgc28gbXVjaCB0aGF0IGhpc3RvcnkgZmlsZSBuZWVkcyB0cmltbWluZz8gKi8KKwlzdGF0ZS0+Y250X2hpc3RvcnlfaW5fZmlsZSsrOworCWlmIChzdGF0ZS0+Y250X2hpc3RvcnlfaW5fZmlsZSA+IHN0YXRlLT5tYXhfaGlzdG9yeSAqIDQpIHsKKwkJY2hhciAqbmV3X25hbWU7CisJCWxpbmVfaW5wdXRfdCAqc3RfdGVtcDsKKworCQkvKiB3ZSBtYXkgaGF2ZSBjb25jdXJyZW50bHkgd3JpdHRlbiBlbnRyaWVzIGZyb20gb3RoZXJzLgorCQkgKiBsb2FkIHRoZW0gKi8KKwkJc3RfdGVtcCA9IG5ld19saW5lX2lucHV0X3Qoc3RhdGUtPmZsYWdzKTsKKwkJc3RfdGVtcC0+aGlzdF9maWxlID0gc3RhdGUtPmhpc3RfZmlsZTsKKwkJc3RfdGVtcC0+bWF4X2hpc3RvcnkgPSBzdGF0ZS0+bWF4X2hpc3Rvcnk7CisJCWxvYWRfaGlzdG9yeShzdF90ZW1wKTsKKworCQkvKiB3cml0ZSBvdXQgdGVtcCBmaWxlIGFuZCByZXBsYWNlIGhpc3RfZmlsZSBhdG9taWNhbGx5ICovCisJCW5ld19uYW1lID0geGFzcHJpbnRmKCIlcy4ldS5uZXciLCBzdGF0ZS0+aGlzdF9maWxlLCAoaW50KSBnZXRwaWQoKSk7CisJCWZkID0gb3BlbihuZXdfbmFtZSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQywgMDYwMCk7CisJCWlmIChmZCA+PSAwKSB7CisJCQlGSUxFICpmcDsKKwkJCWludCBpOworCisJCQlmcCA9IHhmZG9wZW5fZm9yX3dyaXRlKGZkKTsKKwkJCWZvciAoaSA9IDA7IGkgPCBzdF90ZW1wLT5jbnRfaGlzdG9yeTsgaSsrKQorCQkJCWZwcmludGYoZnAsICIlc1xuIiwgc3RfdGVtcC0+aGlzdG9yeVtpXSk7CisJCQlmY2xvc2UoZnApOworCQkJaWYgKHJlbmFtZShuZXdfbmFtZSwgc3RhdGUtPmhpc3RfZmlsZSkgPT0gMCkKKwkJCQlzdGF0ZS0+Y250X2hpc3RvcnlfaW5fZmlsZSA9IHN0X3RlbXAtPmNudF9oaXN0b3J5OworCQl9CisJCWZyZWUobmV3X25hbWUpOworCQlmcmVlX2xpbmVfaW5wdXRfdChzdF90ZW1wKTsKKwl9Cit9CisjICBlbmRpZgorIyBlbHNlCisjICBkZWZpbmUgbG9hZF9oaXN0b3J5KGEpICgodm9pZCkwKQorIyAgZGVmaW5lIHNhdmVfaGlzdG9yeShhKSAoKHZvaWQpMCkKKyMgZW5kaWYgLyogRkVBVFVSRV9DT01NQU5EX1NBVkVISVNUT1JZICovCisKK3N0YXRpYyB2b2lkIHJlbWVtYmVyX2luX2hpc3RvcnkoY2hhciAqc3RyKQoreworCWludCBpOworCisJaWYgKCEoc3RhdGUtPmZsYWdzICYgRE9fSElTVE9SWSkpCisJCXJldHVybjsKKwlpZiAoc3RyWzBdID09ICdcMCcpCisJCXJldHVybjsKKwlpID0gc3RhdGUtPmNudF9oaXN0b3J5OworCS8qIERvbid0IHNhdmUgZHVwZXMgKi8KKwlpZiAoaSAmJiBzdHJjbXAoc3RhdGUtPmhpc3RvcnlbaS0xXSwgc3RyKSA9PSAwKQorCQlyZXR1cm47CisKKwlmcmVlKHN0YXRlLT5oaXN0b3J5W3N0YXRlLT5tYXhfaGlzdG9yeV0pOyAvKiByZWR1bmRhbnQsIHBhcmFub2lhICovCisJc3RhdGUtPmhpc3Rvcnlbc3RhdGUtPm1heF9oaXN0b3J5XSA9IE5VTEw7IC8qIHJlZHVuZGFudCwgcGFyYW5vaWEgKi8KKworCS8qIElmIGhpc3RvcnlbXSBpcyBmdWxsLCByZW1vdmUgdGhlIG9sZGVzdCBjb21tYW5kICovCisJLyogd2UgbmVlZCB0byBrZWVwIGhpc3Rvcnlbc3RhdGUtPm1heF9oaXN0b3J5XSBlbXB0eSwgaGVuY2UgPj0sIG5vdCA+ICovCisJaWYgKGkgPj0gc3RhdGUtPm1heF9oaXN0b3J5KSB7CisJCWZyZWUoc3RhdGUtPmhpc3RvcnlbMF0pOworCQlmb3IgKGkgPSAwOyBpIDwgc3RhdGUtPm1heF9oaXN0b3J5LTE7IGkrKykKKwkJCXN0YXRlLT5oaXN0b3J5W2ldID0gc3RhdGUtPmhpc3RvcnlbaSsxXTsKKwkJLyogaSA9PSBzdGF0ZS0+bWF4X2hpc3RvcnktMSAqLworIyBpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1NBVkVfT05fRVhJVAorCQlpZiAoc3RhdGUtPmNudF9oaXN0b3J5X2luX2ZpbGUpCisJCQlzdGF0ZS0+Y250X2hpc3RvcnlfaW5fZmlsZS0tOworIyBlbmRpZgorCX0KKwkvKiBpIDw9IHN0YXRlLT5tYXhfaGlzdG9yeS0xICovCisJc3RhdGUtPmhpc3RvcnlbaSsrXSA9IHhzdHJkdXAoc3RyKTsKKwkvKiBpIDw9IHN0YXRlLT5tYXhfaGlzdG9yeSAqLworCXN0YXRlLT5jdXJfaGlzdG9yeSA9IGk7CisJc3RhdGUtPmNudF9oaXN0b3J5ID0gaTsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19TQVZFSElTVE9SWSAmJiAhRU5BQkxFX0ZFQVRVUkVfRURJVElOR19TQVZFX09OX0VYSVQKKwlzYXZlX2hpc3Rvcnkoc3RyKTsKKyMgZW5kaWYKK30KKworI2Vsc2UgLyogTUFYX0hJU1RPUlkgPT0gMCAqLworIyBkZWZpbmUgcmVtZW1iZXJfaW5faGlzdG9yeShhKSAoKHZvaWQpMCkKKyNlbmRpZiAvKiBNQVhfSElTVE9SWSAqLworCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1ZJCisvKgorICogdmkgbW9kZSBpbXBsZW1lbnRlZCAyMDA1IGJ5IFBhdWwgRm94IDxwZ2ZAZm94aGFycC5ib3N0b24ubWEudXM+CisgKi8KK3N0YXRpYyB2b2lkCit2aV9Xb3JkX21vdGlvbihpbnQgZWF0KQoreworCUNIQVJfVCAqY29tbWFuZCA9IGNvbW1hbmRfcHM7CisKKwl3aGlsZSAoY3Vyc29yIDwgY29tbWFuZF9sZW4gJiYgIUJCX2lzc3BhY2UoY29tbWFuZFtjdXJzb3JdKSkKKwkJaW5wdXRfZm9yd2FyZCgpOworCWlmIChlYXQpIHdoaWxlIChjdXJzb3IgPCBjb21tYW5kX2xlbiAmJiBCQl9pc3NwYWNlKGNvbW1hbmRbY3Vyc29yXSkpCisJCWlucHV0X2ZvcndhcmQoKTsKK30KKworc3RhdGljIHZvaWQKK3ZpX3dvcmRfbW90aW9uKGludCBlYXQpCit7CisJQ0hBUl9UICpjb21tYW5kID0gY29tbWFuZF9wczsKKworCWlmIChCQl9pc2FsbnVtKGNvbW1hbmRbY3Vyc29yXSkgfHwgY29tbWFuZFtjdXJzb3JdID09ICdfJykgeworCQl3aGlsZSAoY3Vyc29yIDwgY29tbWFuZF9sZW4KKwkJICYmIChCQl9pc2FsbnVtKGNvbW1hbmRbY3Vyc29yKzFdKSB8fCBjb21tYW5kW2N1cnNvcisxXSA9PSAnXycpCisJCSkgeworCQkJaW5wdXRfZm9yd2FyZCgpOworCQl9CisJfSBlbHNlIGlmIChCQl9pc3B1bmN0KGNvbW1hbmRbY3Vyc29yXSkpIHsKKwkJd2hpbGUgKGN1cnNvciA8IGNvbW1hbmRfbGVuICYmIEJCX2lzcHVuY3QoY29tbWFuZFtjdXJzb3IrMV0pKQorCQkJaW5wdXRfZm9yd2FyZCgpOworCX0KKworCWlmIChjdXJzb3IgPCBjb21tYW5kX2xlbikKKwkJaW5wdXRfZm9yd2FyZCgpOworCisJaWYgKGVhdCkgeworCQl3aGlsZSAoY3Vyc29yIDwgY29tbWFuZF9sZW4gJiYgQkJfaXNzcGFjZShjb21tYW5kW2N1cnNvcl0pKQorCQkJaW5wdXRfZm9yd2FyZCgpOworCX0KK30KKworc3RhdGljIHZvaWQKK3ZpX0VuZF9tb3Rpb24odm9pZCkKK3sKKwlDSEFSX1QgKmNvbW1hbmQgPSBjb21tYW5kX3BzOworCisJaW5wdXRfZm9yd2FyZCgpOworCXdoaWxlIChjdXJzb3IgPCBjb21tYW5kX2xlbiAmJiBCQl9pc3NwYWNlKGNvbW1hbmRbY3Vyc29yXSkpCisJCWlucHV0X2ZvcndhcmQoKTsKKwl3aGlsZSAoY3Vyc29yIDwgY29tbWFuZF9sZW4tMSAmJiAhQkJfaXNzcGFjZShjb21tYW5kW2N1cnNvcisxXSkpCisJCWlucHV0X2ZvcndhcmQoKTsKK30KKworc3RhdGljIHZvaWQKK3ZpX2VuZF9tb3Rpb24odm9pZCkKK3sKKwlDSEFSX1QgKmNvbW1hbmQgPSBjb21tYW5kX3BzOworCisJaWYgKGN1cnNvciA+PSBjb21tYW5kX2xlbi0xKQorCQlyZXR1cm47CisJaW5wdXRfZm9yd2FyZCgpOworCXdoaWxlIChjdXJzb3IgPCBjb21tYW5kX2xlbi0xICYmIEJCX2lzc3BhY2UoY29tbWFuZFtjdXJzb3JdKSkKKwkJaW5wdXRfZm9yd2FyZCgpOworCWlmIChjdXJzb3IgPj0gY29tbWFuZF9sZW4tMSkKKwkJcmV0dXJuOworCWlmIChCQl9pc2FsbnVtKGNvbW1hbmRbY3Vyc29yXSkgfHwgY29tbWFuZFtjdXJzb3JdID09ICdfJykgeworCQl3aGlsZSAoY3Vyc29yIDwgY29tbWFuZF9sZW4tMQorCQkgJiYgKEJCX2lzYWxudW0oY29tbWFuZFtjdXJzb3IrMV0pIHx8IGNvbW1hbmRbY3Vyc29yKzFdID09ICdfJykKKwkJKSB7CisJCQlpbnB1dF9mb3J3YXJkKCk7CisJCX0KKwl9IGVsc2UgaWYgKEJCX2lzcHVuY3QoY29tbWFuZFtjdXJzb3JdKSkgeworCQl3aGlsZSAoY3Vyc29yIDwgY29tbWFuZF9sZW4tMSAmJiBCQl9pc3B1bmN0KGNvbW1hbmRbY3Vyc29yKzFdKSkKKwkJCWlucHV0X2ZvcndhcmQoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCit2aV9CYWNrX21vdGlvbih2b2lkKQoreworCUNIQVJfVCAqY29tbWFuZCA9IGNvbW1hbmRfcHM7CisKKwl3aGlsZSAoY3Vyc29yID4gMCAmJiBCQl9pc3NwYWNlKGNvbW1hbmRbY3Vyc29yLTFdKSkKKwkJaW5wdXRfYmFja3dhcmQoMSk7CisJd2hpbGUgKGN1cnNvciA+IDAgJiYgIUJCX2lzc3BhY2UoY29tbWFuZFtjdXJzb3ItMV0pKQorCQlpbnB1dF9iYWNrd2FyZCgxKTsKK30KKworc3RhdGljIHZvaWQKK3ZpX2JhY2tfbW90aW9uKHZvaWQpCit7CisJQ0hBUl9UICpjb21tYW5kID0gY29tbWFuZF9wczsKKworCWlmIChjdXJzb3IgPD0gMCkKKwkJcmV0dXJuOworCWlucHV0X2JhY2t3YXJkKDEpOworCXdoaWxlIChjdXJzb3IgPiAwICYmIEJCX2lzc3BhY2UoY29tbWFuZFtjdXJzb3JdKSkKKwkJaW5wdXRfYmFja3dhcmQoMSk7CisJaWYgKGN1cnNvciA8PSAwKQorCQlyZXR1cm47CisJaWYgKEJCX2lzYWxudW0oY29tbWFuZFtjdXJzb3JdKSB8fCBjb21tYW5kW2N1cnNvcl0gPT0gJ18nKSB7CisJCXdoaWxlIChjdXJzb3IgPiAwCisJCSAmJiAoQkJfaXNhbG51bShjb21tYW5kW2N1cnNvci0xXSkgfHwgY29tbWFuZFtjdXJzb3ItMV0gPT0gJ18nKQorCQkpIHsKKwkJCWlucHV0X2JhY2t3YXJkKDEpOworCQl9CisJfSBlbHNlIGlmIChCQl9pc3B1bmN0KGNvbW1hbmRbY3Vyc29yXSkpIHsKKwkJd2hpbGUgKGN1cnNvciA+IDAgJiYgQkJfaXNwdW5jdChjb21tYW5kW2N1cnNvci0xXSkpCisJCQlpbnB1dF9iYWNrd2FyZCgxKTsKKwl9Cit9CisjZW5kaWYKKworLyogTW9kZWxsZWQgYWZ0ZXIgYmFzaCA0LjAgYmVoYXZpb3Igb2YgQ3RybC08YXJyb3c+ICovCitzdGF0aWMgdm9pZCBjdHJsX2xlZnQodm9pZCkKK3sKKwlDSEFSX1QgKmNvbW1hbmQgPSBjb21tYW5kX3BzOworCisJd2hpbGUgKDEpIHsKKwkJQ0hBUl9UIGM7CisKKwkJaW5wdXRfYmFja3dhcmQoMSk7CisJCWlmIChjdXJzb3IgPT0gMCkKKwkJCWJyZWFrOworCQljID0gY29tbWFuZFtjdXJzb3JdOworCQlpZiAoYyAhPSAnICcgJiYgIUJCX2lzcHVuY3QoYykpIHsKKwkJCS8qIHdlIHJlYWNoZWQgYSAid29yZCIgZGVsaW1pdGVkIGJ5IHNwYWNlcy9wdW5jdC4KKwkJCSAqIGdvIHRvIGl0cyBiZWdpbm5pbmcgKi8KKwkJCXdoaWxlICgxKSB7CisJCQkJYyA9IGNvbW1hbmRbY3Vyc29yIC0gMV07CisJCQkJaWYgKGMgPT0gJyAnIHx8IEJCX2lzcHVuY3QoYykpCisJCQkJCWJyZWFrOworCQkJCWlucHV0X2JhY2t3YXJkKDEpOworCQkJCWlmIChjdXJzb3IgPT0gMCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KK30KK3N0YXRpYyB2b2lkIGN0cmxfcmlnaHQodm9pZCkKK3sKKwlDSEFSX1QgKmNvbW1hbmQgPSBjb21tYW5kX3BzOworCisJd2hpbGUgKDEpIHsKKwkJQ0hBUl9UIGM7CisKKwkJYyA9IGNvbW1hbmRbY3Vyc29yXTsKKwkJaWYgKGMgPT0gQkJfTlVMKQorCQkJYnJlYWs7CisJCWlmIChjICE9ICcgJyAmJiAhQkJfaXNwdW5jdChjKSkgeworCQkJLyogd2UgcmVhY2hlZCBhICJ3b3JkIiBkZWxpbWl0ZWQgYnkgc3BhY2VzL3B1bmN0LgorCQkJICogZ28gdG8gaXRzIGVuZCArIDEgKi8KKwkJCXdoaWxlICgxKSB7CisJCQkJaW5wdXRfZm9yd2FyZCgpOworCQkJCWMgPSBjb21tYW5kW2N1cnNvcl07CisJCQkJaWYgKGMgPT0gQkJfTlVMIHx8IGMgPT0gJyAnIHx8IEJCX2lzcHVuY3QoYykpCisJCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJaW5wdXRfZm9yd2FyZCgpOworCX0KK30KKworCisvKgorICogcmVhZF9saW5lX2lucHV0IGFuZCBpdHMgaGVscGVycworICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX0FTS19URVJNSU5BTAorc3RhdGljIHZvaWQgYXNrX3Rlcm1pbmFsKHZvaWQpCit7CisJLyogQXNrIHRlcm1pbmFsIHdoZXJlIGlzIHRoZSBjdXJzb3Igbm93LgorCSAqIGxpbmVlZGl0X3JlYWRfa2V5IGhhbmRsZXMgcmVzcG9uc2UgYW5kIGNvcnJlY3RzCisJICogb3VyIGlkZWEgb2YgY3VycmVudCBjdXJzb3IgcG9zaXRpb24uCisJICogVGVzdGNhc2U6IHJ1biAiZWNobyAtbiBsb25nX2xpbmVfbG9uZ19saW5lX2xvbmdfbGluZSIsCisJICogdGhlbiB0eXBlIGluIGEgbG9uZywgd3JhcHBpbmcgY29tbWFuZCBhbmQgdHJ5IHRvCisJICogZGVsZXRlIGl0IHVzaW5nIGJhY2tzcGFjZSBrZXkuCisJICogTm90ZTogd2UgcHJpbnQgaXQgX2FmdGVyXyBwcm9tcHQsIGJlY2F1c2UKKwkgKiBwcm9tcHQgbWF5IGNvbnRhaW4gQ1IuIEV4YW1wbGU6IFBTMT0nXFtcclxuXF1cdyAnCisJICovCisJLyogUHJvYmxlbTogaWYgdGhlcmUgaXMgYnVmZmVyZWQgaW5wdXQgb24gc3RkaW4sCisJICogdGhlIHJlc3BvbnNlIHdpbGwgYmUgZGVsaXZlcmVkIGxhdGVyLAorCSAqIHBvc3NpYmx5IHRvIGFuIHVuc3VzcGVjdGluZyBhcHBsaWNhdGlvbi4KKwkgKiBUZXN0Y2FzZTogInNsZWVwIDE7IGJ1c3lib3ggYXNoIiArIHByZXNzIGFuZCBob2xkIFtFbnRlcl0uCisJICogUmVzdWx0OgorCSAqIH4vc3JjZGV2ZWwvYmJveC9maXgvYnVzeWJveC50NCAjCisJICogfi9zcmNkZXZlbC9iYm94L2ZpeC9idXN5Ym94LnQ0ICMKKwkgKiBeW1s1OTszNH4vc3JjZGV2ZWwvYmJveC9maXgvYnVzeWJveC50NCAjICA8LS0gZ2FyYmFnZQorCSAqIH4vc3JjZGV2ZWwvYmJveC9maXgvYnVzeWJveC50NCAjCisJICoKKwkgKiBDaGVja2luZyBmb3IgaW5wdXQgd2l0aCBwb2xsIG9ubHkgbWFrZXMgdGhlIHJhY2UgbmFycm93ZXIsCisJICogSSBzdGlsbCBjYW4gdHJpZ2dlciBpdC4gU3RyYWNlOgorCSAqCisJICogd3JpdGUoMSwgIn4vc3JjZGV2ZWwvYmJveC9maXgvYnVzeWJveC50NCAjICIsIDMzKSA9IDMzCisJICogcG9sbChbe2ZkPTAsIGV2ZW50cz1QT0xMSU59XSwgMSwgMCkgPSAwIChUaW1lb3V0KSAgPC0tIG5vIGlucHV0IGV4aXN0cworCSAqIHdyaXRlKDEsICJcMzNbNm4iLCA0KSA9IDQgIDwtLSBzZW5kIHRoZSBFU0Mgc2VxdWVuY2UsIHF1aWNrIQorCSAqIHBvbGwoW3tmZD0wLCBldmVudHM9UE9MTElOfV0sIDEsIC0xKSA9IDEgKFt7ZmQ9MCwgcmV2ZW50cz1QT0xMSU59XSkKKwkgKiByZWFkKDAsICJcbiIsIDEpICAgICAgPSAxICA8LS0gb2ggY3JhcCwgdXNlcidzIGlucHV0IGdvdCBpbiBmaXJzdAorCSAqLworCXN0cnVjdCBwb2xsZmQgcGZkOworCisJcGZkLmZkID0gU1RESU5fRklMRU5POworCXBmZC5ldmVudHMgPSBQT0xMSU47CisJaWYgKHNhZmVfcG9sbCgmcGZkLCAxLCAwKSA9PSAwKSB7CisJCVMuc2VudF9FU0NfYnI2biA9IDE7CisJCWZwdXRzKEVTQyJbNm4iLCBzdGRvdXQpOworCQlmZmx1c2hfYWxsKCk7IC8qIG1ha2UgdGVybWluYWwgc2VlIGl0IEFTQVAhICovCisJfQorfQorI2Vsc2UKKyNkZWZpbmUgYXNrX3Rlcm1pbmFsKCkgKCh2b2lkKTApCisjZW5kaWYKKworLyogQ2FsbGVkIGp1c3Qgb25jZSBhdCByZWFkX2xpbmVfaW5wdXQoKSBpbml0IHRpbWUgKi8KKyNpZiAhRU5BQkxFX0ZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQKK3N0YXRpYyB2b2lkIHBhcnNlX2FuZF9wdXRfcHJvbXB0KGNvbnN0IGNoYXIgKnBybXRfcHRyKQoreworCWNvbnN0IGNoYXIgKnA7CisJY21kZWRpdF9wcm9tcHQgPSBwcm10X3B0cjsKKwlwID0gc3RycmNocihwcm10X3B0ciwgJ1xuJyk7CisJY21kZWRpdF9wcm10X2xlbiA9IHVuaWNvZGVfc3Ryd2lkdGgocCA/IHArMSA6IHBybXRfcHRyKTsKKwlwdXRfcHJvbXB0KCk7Cit9CisjZWxzZQorc3RhdGljIHZvaWQgcGFyc2VfYW5kX3B1dF9wcm9tcHQoY29uc3QgY2hhciAqcHJtdF9wdHIpCit7CisJaW50IHBybXRfc2l6ZSA9IDA7CisJY2hhciAqcHJtdF9tZW1fcHRyID0geHphbGxvYygxKTsKKyMgaWYgRU5BQkxFX1VTRVJOQU1FX09SX0hPTUVESVIKKwljaGFyICpjd2RfYnVmID0gTlVMTDsKKyMgZW5kaWYKKwljaGFyIGZsZ19ub3RfbGVuZ3RoID0gJ1snOworCWNoYXIgY2J1ZlsyXTsKKworCS8qY21kZWRpdF9wcm10X2xlbiA9IDA7IC0gYWxyZWFkeSBpcyAqLworCisJY2J1ZlsxXSA9ICdcMCc7IC8qIG5ldmVyIGNoYW5nZXMgKi8KKworCXdoaWxlICgqcHJtdF9wdHIpIHsKKwkJY2hhciB0aW1lYnVmW3NpemVvZigiSEg6TU06U1MiKV07CisJCWNoYXIgKmZyZWVfbWUgPSBOVUxMOworCQljaGFyICpwYnVmOworCQljaGFyIGM7CisKKwkJcGJ1ZiA9IGNidWY7CisJCWMgPSAqcHJtdF9wdHIrKzsKKwkJaWYgKGMgPT0gJ1xcJykgeworCQkJY29uc3QgY2hhciAqY3A7CisJCQlpbnQgbDsKKy8qCisgKiBTdXBwb3J0ZWQgdmlhIGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlOgorICogXGEJQVNDSUkgYmVsbCBjaGFyYWN0ZXIgKDA3KQorICogXGUJQVNDSUkgZXNjYXBlIGNoYXJhY3RlciAoMDMzKQorICogXG4JbmV3bGluZQorICogXHIJY2FycmlhZ2UgcmV0dXJuCisgKiBcXAliYWNrc2xhc2gKKyAqIFxubm4JY2hhciB3aXRoIG9jdGFsIGNvZGUgbm5uCisgKiBTdXBwb3J0ZWQ6CisgKiBcJAlpZiB0aGUgZWZmZWN0aXZlIFVJRCBpcyAwLCBhICMsIG90aGVyd2lzZSBhICQKKyAqIFx3CWN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnksIHdpdGggJEhPTUUgYWJicmV2aWF0ZWQgd2l0aCBhIHRpbGRlCisgKglOb3RlOiB3ZSBkbyBub3Qgc3VwcG9ydCAkUFJPTVBUX0RJUlRSSU09biBmZWF0dXJlCisgKiBcVwliYXNlbmFtZSBvZiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSwgd2l0aCAkSE9NRSBhYmJyZXZpYXRlZCB3aXRoIGEgdGlsZGUKKyAqIFxoCWhvc3RuYW1lIHVwIHRvIHRoZSBmaXJzdCAnLicKKyAqIFxICWhvc3RuYW1lCisgKiBcdQl1c2VybmFtZQorICogXFsJYmVnaW4gYSBzZXF1ZW5jZSBvZiBub24tcHJpbnRpbmcgY2hhcmFjdGVycworICogXF0JZW5kIGEgc2VxdWVuY2Ugb2Ygbm9uLXByaW50aW5nIGNoYXJhY3RlcnMKKyAqIFxUCWN1cnJlbnQgdGltZSBpbiAxMi1ob3VyIEhIOk1NOlNTIGZvcm1hdAorICogXEAJY3VycmVudCB0aW1lIGluIDEyLWhvdXIgYW0vcG0gZm9ybWF0CisgKiBcQQljdXJyZW50IHRpbWUgaW4gMjQtaG91ciBISDpNTSBmb3JtYXQKKyAqIFx0CWN1cnJlbnQgdGltZSBpbiAyNC1ob3VyIEhIOk1NOlNTIGZvcm1hdAorICoJKGFsbCBvZiB0aGUgYWJvdmUgd29yayBhcyBcQSkKKyAqIE5vdCBzdXBwb3J0ZWQ6CisgKiBcIQloaXN0b3J5IG51bWJlciBvZiB0aGlzIGNvbW1hbmQKKyAqIFwjCWNvbW1hbmQgbnVtYmVyIG9mIHRoaXMgY29tbWFuZAorICogXGoJbnVtYmVyIG9mIGpvYnMgY3VycmVudGx5IG1hbmFnZWQgYnkgdGhlIHNoZWxsCisgKiBcbAliYXNlbmFtZSBvZiB0aGUgc2hlbGwncyB0ZXJtaW5hbCBkZXZpY2UgbmFtZQorICogXHMJbmFtZSBvZiB0aGUgc2hlbGwsIHRoZSBiYXNlbmFtZSBvZiAkMCAodGhlIHBvcnRpb24gZm9sbG93aW5nIHRoZSBmaW5hbCBzbGFzaCkKKyAqIFxWCXJlbGVhc2Ugb2YgYmFzaCwgdmVyc2lvbiArIHBhdGNoIGxldmVsIChlLmcuLCAyLjAwLjApCisgKiBcZAlkYXRlIGluICJXZWVrZGF5IE1vbnRoIERhdGUiIGZvcm1hdCAoZS5nLiwgIlR1ZSBNYXkgMjYiKQorICogXER7Zm9ybWF0fQorICoJZm9ybWF0IGlzIHBhc3NlZCB0byBzdHJmdGltZSgzKS4KKyAqCUFuIGVtcHR5IGZvcm1hdCByZXN1bHRzIGluIGEgbG9jYWxlLXNwZWNpZmljIHRpbWUgcmVwcmVzZW50YXRpb24uCisgKglUaGUgYnJhY2VzIGFyZSByZXF1aXJlZC4KKyAqIE1pc2hhbmRsZWQgYnkgYmJfcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2U6CisgKiBcdgl2ZXJzaW9uIG9mIGJhc2ggKGUuZy4sIDIuMDApCisgKi8KKwkJCWNwID0gcHJtdF9wdHI7CisJCQljID0gKmNwOworCQkJaWYgKGMgIT0gJ3QnKSAvKiBkb24ndCB0cmVhdCBcdCBhcyB0YWIgKi8KKwkJCQljID0gYmJfcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UoJnBybXRfcHRyKTsKKwkJCWlmIChwcm10X3B0ciA9PSBjcCkgeworCQkJCWlmICgqY3AgPT0gJ1wwJykKKwkJCQkJYnJlYWs7CisJCQkJYyA9ICpwcm10X3B0cisrOworCisJCQkJc3dpdGNoIChjKSB7CisjIGlmIEVOQUJMRV9VU0VSTkFNRV9PUl9IT01FRElSCisJCQkJY2FzZSAndSc6CisJCQkJCXBidWYgPSB1c2VyX2J1ZiA/IHVzZXJfYnVmIDogKGNoYXIqKSIiOworCQkJCQlicmVhazsKKyMgZW5kaWYKKwkJCQljYXNlICdIJzoKKwkJCQljYXNlICdoJzoKKwkJCQkJcGJ1ZiA9IGZyZWVfbWUgPSBzYWZlX2dldGhvc3RuYW1lKCk7CisJCQkJCWlmIChjID09ICdoJykKKwkJCQkJCXN0cmNocm51bChwYnVmLCAnLicpWzBdID0gJ1wwJzsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnJCc6CisJCQkJCWMgPSAoZ2V0ZXVpZCgpID09IDAgPyAnIycgOiAnJCcpOworCQkJCQlicmVhazsKKwkJCQljYXNlICdUJzogLyogMTItaG91ciBISDpNTTpTUyBmb3JtYXQgKi8KKwkJCQljYXNlICdAJzogLyogMTItaG91ciBhbS9wbSBmb3JtYXQgKi8KKwkJCQljYXNlICdBJzogLyogMjQtaG91ciBISDpNTSBmb3JtYXQgKi8KKwkJCQljYXNlICd0JzogLyogMjQtaG91ciBISDpNTTpTUyBmb3JtYXQgKi8KKwkJCQkJLyogV2Ugc2hvdyBhbGwgb2YgdGhlbSBhcyAyNC1ob3VyIEhIOk1NICovCisJCQkJCXN0cmZ0aW1lX0hITU1TUyh0aW1lYnVmLCBzaXplb2YodGltZWJ1ZiksIE5VTEwpWy0zXSA9ICdcMCc7CisJCQkJCXBidWYgPSB0aW1lYnVmOworCQkJCQlicmVhazsKKyMgaWYgRU5BQkxFX1VTRVJOQU1FX09SX0hPTUVESVIKKwkJCQljYXNlICd3JzogLyogY3VycmVudCBkaXIgKi8KKwkJCQljYXNlICdXJzogLyogYmFzZW5hbWUgb2YgY3VyIGRpciAqLworCQkJCQlpZiAoIWN3ZF9idWYpIHsKKwkJCQkJCWN3ZF9idWYgPSB4cmVhbGxvY19nZXRjd2Rfb3Jfd2FybihOVUxMKTsKKwkJCQkJCWlmICghY3dkX2J1ZikKKwkJCQkJCQljd2RfYnVmID0gKGNoYXIgKiliYl9tc2dfdW5rbm93bjsKKwkJCQkJCWVsc2UgaWYgKGhvbWVfcHdkX2J1ZlswXSkgeworCQkJCQkJCWNoYXIgKmFmdGVyX2hvbWVfdXNlcjsKKworCQkJCQkJCS8qIC9ob21lL3VzZXJbL3NvbWV0aGluZ10gLT4gflsvc29tZXRoaW5nXSAqLworCQkJCQkJCWFmdGVyX2hvbWVfdXNlciA9IGlzX3ByZWZpeGVkX3dpdGgoY3dkX2J1ZiwgaG9tZV9wd2RfYnVmKTsKKwkJCQkJCQlpZiAoYWZ0ZXJfaG9tZV91c2VyCisJCQkJCQkJICYmICgqYWZ0ZXJfaG9tZV91c2VyID09ICcvJyB8fCAqYWZ0ZXJfaG9tZV91c2VyID09ICdcMCcpCisJCQkJCQkJKSB7CisJCQkJCQkJCWN3ZF9idWZbMF0gPSAnfic7CisJCQkJCQkJCW92ZXJsYXBwaW5nX3N0cmNweShjd2RfYnVmICsgMSwgYWZ0ZXJfaG9tZV91c2VyKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJcGJ1ZiA9IGN3ZF9idWY7CisJCQkJCWlmIChjID09ICd3JykKKwkJCQkJCWJyZWFrOworCQkJCQljcCA9IHN0cnJjaHIocGJ1ZiwgJy8nKTsKKwkJCQkJaWYgKGNwKQorCQkJCQkJcGJ1ZiA9IChjaGFyKiljcCArIDE7CisJCQkJCWJyZWFrOworIyBlbmRpZgorLy8gYmJfcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UgZG9lcyB0aGlzIG5vdzoKKy8vCQkJCWNhc2UgJ2UnOiBjYXNlICdFJzogICAgIC8qIFxlIFxFID0gXDAzMyAqLworLy8JCQkJCWMgPSAnXDAzMyc7CisvLwkJCQkJYnJlYWs7CisJCQkJY2FzZSAneCc6IGNhc2UgJ1gnOiB7CisJCQkJCWNoYXIgYnVmMls0XTsKKwkJCQkJZm9yIChsID0gMDsgbCA8IDM7KSB7CisJCQkJCQl1bnNpZ25lZCBoOworCQkJCQkJYnVmMltsKytdID0gKnBybXRfcHRyOworCQkJCQkJYnVmMltsXSA9ICdcMCc7CisJCQkJCQloID0gc3RydG91bChidWYyLCAmcGJ1ZiwgMTYpOworCQkJCQkJaWYgKGggPiBVQ0hBUl9NQVggfHwgKHBidWYgLSBidWYyKSA8IGwpIHsKKwkJCQkJCQlidWYyWy0tbF0gPSAnXDAnOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJcHJtdF9wdHIrKzsKKwkJCQkJfQorCQkJCQljID0gKGNoYXIpc3RydG91bChidWYyLCBOVUxMLCAxNik7CisJCQkJCWlmIChjID09IDApCisJCQkJCQljID0gJz8nOworCQkJCQlwYnVmID0gY2J1ZjsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgJ1snOiBjYXNlICddJzoKKwkJCQkJaWYgKGMgPT0gZmxnX25vdF9sZW5ndGgpIHsKKwkJCQkJCS8qIFRvZ2dsZSAnWycvJ10nIGhleCA1Yi81ZCAqLworCQkJCQkJZmxnX25vdF9sZW5ndGggXj0gNjsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCX0gLyogc3dpdGNoICovCisJCQl9IC8qIGlmICovCisJCX0gLyogaWYgKi8KKwkJY2J1ZlswXSA9IGM7CisJCXsKKwkJCWludCBuID0gc3RybGVuKHBidWYpOworCQkJcHJtdF9zaXplICs9IG47CisJCQlpZiAoYyA9PSAnXG4nKQorCQkJCWNtZGVkaXRfcHJtdF9sZW4gPSAwOworCQkJZWxzZSBpZiAoZmxnX25vdF9sZW5ndGggIT0gJ10nKSB7CisjaWYgMCAvKkVOQUJMRV9VTklDT0RFX1NVUFBPUlQqLworLyogV29uJ3Qgd29yaywgcGJ1ZiBpcyBvbmUgQllURSBzdHJpbmcgaGVyZSBpbnN0ZWFkIG9mIGFuIG9uZSBVbmljb2RlIGNoYXIgc3RyaW5nLiAqLworLyogRklYTUUgKi8KKwkJCQljbWRlZGl0X3BybXRfbGVuICs9IHVuaWNvZGVfc3Ryd2lkdGgocGJ1Zik7CisjZWxzZQorCQkJCWNtZGVkaXRfcHJtdF9sZW4gKz0gbjsKKyNlbmRpZgorCQkJfQorCQl9CisJCXBybXRfbWVtX3B0ciA9IHN0cmNhdCh4cmVhbGxvYyhwcm10X21lbV9wdHIsIHBybXRfc2l6ZSsxKSwgcGJ1Zik7CisJCWZyZWUoZnJlZV9tZSk7CisJfSAvKiB3aGlsZSAqLworCisjIGlmIEVOQUJMRV9VU0VSTkFNRV9PUl9IT01FRElSCisJaWYgKGN3ZF9idWYgIT0gKGNoYXIgKiliYl9tc2dfdW5rbm93bikKKwkJZnJlZShjd2RfYnVmKTsKKyMgZW5kaWYKKwljbWRlZGl0X3Byb21wdCA9IHBybXRfbWVtX3B0cjsKKwlwdXRfcHJvbXB0KCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgY21kZWRpdF9zZXR3aWR0aCh1bnNpZ25lZCB3LCBpbnQgcmVkcmF3X2ZsZykKK3sKKwljbWRlZGl0X3Rlcm13ID0gdzsKKwlpZiAocmVkcmF3X2ZsZykgeworCQkvKiBuZXcgeSBmb3IgY3VycmVudCBjdXJzb3IgKi8KKwkJaW50IG5ld195ID0gKGN1cnNvciArIGNtZGVkaXRfcHJtdF9sZW4pIC8gdzsKKwkJLyogcmVkcmF3ICovCisJCXJlZHJhdygobmV3X3kgPj0gY21kZWRpdF95ID8gbmV3X3kgOiBjbWRlZGl0X3kpLCBjb21tYW5kX2xlbiAtIGN1cnNvcik7CisJCWZmbHVzaF9hbGwoKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdpbl9jaGFuZ2VkKGludCBuc2lnKQoreworCWludCBzdl9lcnJubyA9IGVycm5vOworCXVuc2lnbmVkIHdpZHRoOworCisJZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodCgwLCAmd2lkdGgsIE5VTEwpOworLy9GSVhNRTogY21kZWRpdF9zZXR3aWR0aCgpIC0+IHJlZHJhdygpIC0+IHByaW50ZigpIC0+IEtBQk9PTSEgKHdlIGFyZSBpbiBzaWduYWwgaGFuZGxlciEpCisJY21kZWRpdF9zZXR3aWR0aCh3aWR0aCwgLypyZWRyYXdfZmxnOiovIG5zaWcpOworCisJZXJybm8gPSBzdl9lcnJubzsKK30KKworc3RhdGljIGludCBsaW5lZWRpdF9yZWFkX2tleShjaGFyICpyZWFkX2tleV9idWZmZXIsIGludCB0aW1lb3V0KQoreworCWludDY0X3QgaWM7CisjaWYgRU5BQkxFX1VOSUNPREVfU1VQUE9SVAorCWNoYXIgdW5pY29kZV9idWZbTUJfQ1VSX01BWCArIDFdOworCWludCB1bmljb2RlX2lkeCA9IDA7CisjZW5kaWYKKworCXdoaWxlICgxKSB7CisJCS8qIFdhaXQgZm9yIGlucHV0LiBUSU1FT1VUID0gLTEgbWFrZXMgcmVhZF9rZXkgd2FpdCBldmVuCisJCSAqIG9uIG5vbmJsb2NraW5nIHN0ZGluLCBUSU1FT1VUID0gNTAgbWFrZXMgc3VyZSB3ZSB3b24ndAorCQkgKiBpbnNpc3Qgb24gZnVsbCBNQl9DVVJfTUFYIGJ1ZmZlciB0byBkZWNsYXJlIGlucHV0IGxpa2UKKwkJICogIlx4ZmZcbiIscGF1c2UsImxzXG4iIGludmFsaWQgYW5kIHRodXMgd29uJ3QgbG9zZSAibHMiLgorCQkgKgorCQkgKiBOb3RlOiByZWFkX2tleSBzZXRzIGVycm5vIHRvIDAgb24gc3VjY2Vzcy4KKwkJICovCisJCWljID0gcmVhZF9rZXkoU1RESU5fRklMRU5PLCByZWFkX2tleV9idWZmZXIsIHRpbWVvdXQpOworCQlpZiAoZXJybm8pIHsKKyNpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisJCQlpZiAoZXJybm8gPT0gRUFHQUlOICYmIHVuaWNvZGVfaWR4ICE9IDApCisJCQkJZ290byBwdXNoYmFjazsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfQVNLX1RFUk1JTkFMCisJCWlmICgoaW50MzJfdClpYyA9PSBLRVlDT0RFX0NVUlNPUl9QT1MKKwkJICYmIFMuc2VudF9FU0NfYnI2bgorCQkpIHsKKwkJCVMuc2VudF9FU0NfYnI2biA9IDA7CisJCQlpZiAoY3Vyc29yID09IDApIHsgLyogb3RoZXJ3aXNlIGl0IG1heSBiZSBib2d1cyAqLworCQkJCWludCBjb2wgPSAoKGljID4+IDMyKSAmIDB4N2ZmZikgLSAxOworCQkJCS8qCisJCQkJICogSXMgY29sID4gY21kZWRpdF9wcm10X2xlbj8KKwkJCQkgKiBJZiB5ZXMgKHRlcm1pbmFsIHNheXMgY3Vyc29yIGlzIGZhcnRoZXIgdG8gdGhlIHJpZ2h0CisJCQkJICogb2Ygd2hlcmUgd2UgdGhpbmsgaXQgc2hvdWxkIGJlKSwKKwkJCQkgKiB0aGUgcHJvbXB0IHdhc24ndCBwcmludGVkIHN0YXJ0aW5nIGF0IGNvbCAxLAorCQkJCSAqIHRoZXJlIHdhcyBhZGRpdGlvbmFsIHRleHQgYmVmb3JlIGl0LgorCQkJCSAqLworCQkJCWlmICgoaW50KShjb2wgLSBjbWRlZGl0X3BybXRfbGVuKSA+IDApIHsKKwkJCQkJLyogRml4IG91ciB1bmRlcnN0YW5kaW5nIG9mIGN1cnJlbnQgeCBwb3NpdGlvbiAqLworCQkJCQljbWRlZGl0X3ggKz0gKGNvbCAtIGNtZGVkaXRfcHJtdF9sZW4pOworCQkJCQl3aGlsZSAoY21kZWRpdF94ID49IGNtZGVkaXRfdGVybXcpIHsKKwkJCQkJCWNtZGVkaXRfeCAtPSBjbWRlZGl0X3Rlcm13OworCQkJCQkJY21kZWRpdF95Kys7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisJCWlmICh1bmljb2RlX3N0YXR1cyA9PSBVTklDT0RFX09OKSB7CisJCQl3Y2hhcl90IHdjOworCisJCQlpZiAoKGludDMyX3QpaWMgPCAwKSAvKiBLRVlDT0RFX3h4eCAqLworCQkJCWJyZWFrOworCQkJLy8gVE9ETzogaW1hZ2luZSBzZXF1ZW5jZSBsaWtlOiAweGZmLDxsZWZ0LWFycm93Pjogd2UgYXJlIGN1cnJlbnRseSBsb3NpbmcgMHhmZi4uLgorCisJCQl1bmljb2RlX2J1Zlt1bmljb2RlX2lkeCsrXSA9IGljOworCQkJdW5pY29kZV9idWZbdW5pY29kZV9pZHhdID0gJ1wwJzsKKwkJCWlmIChtYnN0b3djcygmd2MsIHVuaWNvZGVfYnVmLCAxKSAhPSAxKSB7CisJCQkJLyogTm90ICh5ZXQ/KSBhIHZhbGlkIHVuaWNvZGUgY2hhciAqLworCQkJCWlmICh1bmljb2RlX2lkeCA8IE1CX0NVUl9NQVgpIHsKKwkJCQkJdGltZW91dCA9IDUwOworCQkJCQljb250aW51ZTsKKwkJCQl9CisgcHVzaGJhY2s6CisJCQkJLyogSW52YWxpZCBzZXF1ZW5jZS4gU2F2ZSBhbGwgImJhZCBieXRlcyIgZXhjZXB0IGZpcnN0ICovCisJCQkJcmVhZF9rZXlfdW5nZXRzKHJlYWRfa2V5X2J1ZmZlciwgdW5pY29kZV9idWYgKyAxLCB1bmljb2RlX2lkeCAtIDEpOworIyBpZiAhRU5BQkxFX1VOSUNPREVfUFJFU0VSVkVfQlJPS0VOCisJCQkJaWMgPSBDT05GSUdfU1VCU1RfV0NIQVI7CisjIGVsc2UKKwkJCQlpYyA9IHVuaWNvZGVfbWFya19yYXdfYnl0ZSh1bmljb2RlX2J1ZlswXSk7CisjIGVuZGlmCisJCQl9IGVsc2UgeworCQkJCS8qIFZhbGlkIHVuaWNvZGUgY2hhciwgcmV0dXJuIGl0cyBjb2RlICovCisJCQkJaWMgPSB3YzsKKwkJCX0KKwkJfQorI2VuZGlmCisJCWJyZWFrOworCX0KKworCXJldHVybiBpYzsKK30KKworI2lmIEVOQUJMRV9VTklDT0RFX0JJRElfU1VQUE9SVAorc3RhdGljIGludCBpc3J0bF9zdHIodm9pZCkKK3sKKwlpbnQgaWR4ID0gY3Vyc29yOworCisJd2hpbGUgKGlkeCA8IGNvbW1hbmRfbGVuICYmIHVuaWNvZGVfYmlkaV9pc19uZXV0cmFsX3djaGFyKGNvbW1hbmRfcHNbaWR4XSkpCisJCWlkeCsrOworCXJldHVybiB1bmljb2RlX2JpZGlfaXNydGwoY29tbWFuZF9wc1tpZHhdKTsKK30KKyNlbHNlCisjIGRlZmluZSBpc3J0bF9zdHIoKSAwCisjZW5kaWYKKworLyogbGVhdmUgb3V0IHRoZSAidmktbW9kZSItb25seSBjYXNlIGxhYmVscyBpZiB2aSBlZGl0aW5nIGlzbid0CisgKiBjb25maWd1cmVkLiAqLworI2RlZmluZSB2aV9jYXNlKGNhc2VsYWJlbCkgSUZfRkVBVFVSRV9FRElUSU5HX1ZJKGNhc2UgY2FzZWxhYmVsKQorCisvKiBjb252ZXJ0IHVwcGVyY2FzZSBhc2NpaSB0byBlcXVpdmFsZW50IGNvbnRyb2wgY2hhciwgZm9yIHJlYWRhYmlsaXR5ICovCisjdW5kZWYgQ1RSTAorI2RlZmluZSBDVFJMKGEpICgoYSkgJiB+MHg0MCkKKworZW51bSB7CisJVklfQ01ETU9ERV9CSVQgPSAweDQwMDAwMDAwLAorCS8qIDB4ODAwMDAwMDAgYml0IGZsYWdzIEtFWUNPREVfeHh4ICovCit9OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfUkVWRVJTRV9TRUFSQ0gKKy8qIE1pbWljIHJlYWRsaW5lIEN0cmwtUiByZXZlcnNlIGhpc3Rvcnkgc2VhcmNoLgorICogV2hlbiBpbnZva2VkLCBpdCBzaG93cyB0aGUgZm9sbG93aW5nIHByb21wdDoKKyAqIChyZXZlcnNlLWktc2VhcmNoKScnOiB1c2VyX2lucHV0IFtjdXJzb3IgcG9zIHVuY2hhbmdlZCBieSBDdHJsLVJdCisgKiBhbmQgdHlwaW5nIHJlc3VsdHMgaW4gc2VhcmNoIGJlaW5nIHBlcmZvcm1lZDoKKyAqIChyZXZlcnNlLWktc2VhcmNoKSd0bXAnOiBjZCAvdG1wIFtjdXJzb3IgdW5kZXIgdCBpbiAvdG1wXQorICogU2VhcmNoIGlzIHBlcmZvcm1lZCBieSBsb29raW5nIGF0IHByb2dyZXNzaXZlbHkgb2xkZXIgbGluZXMgaW4gaGlzdG9yeS4KKyAqIEN0cmwtUiBhZ2FpbiBzZWFyY2hlcyBmb3IgdGhlIG5leHQgbWF0Y2ggaW4gaGlzdG9yeS4KKyAqIEJhY2tzcGFjZSBkZWxldGVzIGxhc3QgbWF0Y2hlZCBjaGFyLgorICogQ29udHJvbCBrZXlzIGV4aXQgc2VhcmNoIGFuZCByZXR1cm4gdG8gbm9ybWFsIGVkaXRpbmcgKGF0IGN1cnJlbnQgaGlzdG9yeSBsaW5lKS4KKyAqLworc3RhdGljIGludDMyX3QgcmV2ZXJzZV9pX3NlYXJjaCh2b2lkKQoreworCWNoYXIgbWF0Y2hfYnVmWzEyOF07IC8qIGZvciB1c2VyIGlucHV0ICovCisJY2hhciByZWFkX2tleV9idWZmZXJbS0VZQ09ERV9CVUZGRVJfU0laRV07CisJY29uc3QgY2hhciAqbWF0Y2hlZF9oaXN0b3J5X2xpbmU7CisJY29uc3QgY2hhciAqc2F2ZWRfcHJvbXB0OworCXVuc2lnbmVkIHNhdmVkX3BybXRfbGVuOworCWludDMyX3QgaWM7CisKKwltYXRjaGVkX2hpc3RvcnlfbGluZSA9IE5VTEw7CisJcmVhZF9rZXlfYnVmZmVyWzBdID0gMDsKKwltYXRjaF9idWZbMF0gPSAnXDAnOworCisJLyogU2F2ZSBhbmQgcmVwbGFjZSB0aGUgcHJvbXB0ICovCisJc2F2ZWRfcHJvbXB0ID0gY21kZWRpdF9wcm9tcHQ7CisJc2F2ZWRfcHJtdF9sZW4gPSBjbWRlZGl0X3BybXRfbGVuOworCWdvdG8gc2V0X3Byb21wdDsKKworCXdoaWxlICgxKSB7CisJCWludCBoOworCQl1bnNpZ25lZCBtYXRjaF9idWZfbGVuID0gc3RybGVuKG1hdGNoX2J1Zik7CisKKwkJZmZsdXNoX2FsbCgpOworLy9GSVhNRTogY29ycmVjdCB0aW1lb3V0PworCQlpYyA9IGxpbmVlZGl0X3JlYWRfa2V5KHJlYWRfa2V5X2J1ZmZlciwgLTEpOworCisJCXN3aXRjaCAoaWMpIHsKKwkJY2FzZSBDVFJMKCdSJyk6IC8qIHNlYXJjaGluZyBmb3IgdGhlIG5leHQgbWF0Y2ggKi8KKwkJCWJyZWFrOworCisJCWNhc2UgJ1xiJzoKKwkJY2FzZSAnXHg3Zic6CisJCQkvKiBCYWNrc3BhY2UgKi8KKwkJCWlmICh1bmljb2RlX3N0YXR1cyA9PSBVTklDT0RFX09OKSB7CisJCQkJd2hpbGUgKG1hdGNoX2J1Zl9sZW4gIT0gMCkgeworCQkJCQl1aW50OF90IGMgPSBtYXRjaF9idWZbLS1tYXRjaF9idWZfbGVuXTsKKwkJCQkJaWYgKChjICYgMHhjMCkgIT0gMHg4MCkgLyogc3RhcnQgb2YgVVRGLTggY2hhcj8gKi8KKwkJCQkJCWJyZWFrOyAvKiB5ZXMgKi8KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlmIChtYXRjaF9idWZfbGVuICE9IDApCisJCQkJCW1hdGNoX2J1Zl9sZW4tLTsKKwkJCX0KKwkJCW1hdGNoX2J1ZlttYXRjaF9idWZfbGVuXSA9ICdcMCc7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJaWYgKGljIDwgJyAnCisJCQkgfHwgKCFFTkFCTEVfVU5JQ09ERV9TVVBQT1JUICYmIGljID49IDI1NikKKwkJCSB8fCAoRU5BQkxFX1VOSUNPREVfU1VQUE9SVCAmJiBpYyA+PSBWSV9DTURNT0RFX0JJVCkKKwkJCSkgeworCQkJCWdvdG8gcmV0OworCQkJfQorCisJCQkvKiBBcHBlbmQgdGhpcyBjaGFyICovCisjaWYgRU5BQkxFX1VOSUNPREVfU1VQUE9SVAorCQkJaWYgKHVuaWNvZGVfc3RhdHVzID09IFVOSUNPREVfT04pIHsKKwkJCQltYnN0YXRlX3QgbWJzdGF0ZSA9IHsgMCB9OworCQkJCWNoYXIgYnVmW01CX0NVUl9NQVggKyAxXTsKKwkJCQlpbnQgbGVuID0gd2NydG9tYihidWYsIGljLCAmbWJzdGF0ZSk7CisJCQkJaWYgKGxlbiA+IDApIHsKKwkJCQkJYnVmW2xlbl0gPSAnXDAnOworCQkJCQlpZiAobWF0Y2hfYnVmX2xlbiArIGxlbiA8IHNpemVvZihtYXRjaF9idWYpKQorCQkJCQkJc3RyY3B5KG1hdGNoX2J1ZiArIG1hdGNoX2J1Zl9sZW4sIGJ1Zik7CisJCQkJfQorCQkJfSBlbHNlCisjZW5kaWYKKwkJCWlmIChtYXRjaF9idWZfbGVuIDwgc2l6ZW9mKG1hdGNoX2J1ZikgLSAxKSB7CisJCQkJbWF0Y2hfYnVmW21hdGNoX2J1Zl9sZW5dID0gaWM7CisJCQkJbWF0Y2hfYnVmW21hdGNoX2J1Zl9sZW4gKyAxXSA9ICdcMCc7CisJCQl9CisJCQlicmVhazsKKwkJfSAvKiBzd2l0Y2ggKGljKSAqLworCisJCS8qIFNlYXJjaCBpbiBoaXN0b3J5IGZvciBtYXRjaF9idWYgKi8KKwkJaCA9IHN0YXRlLT5jdXJfaGlzdG9yeTsKKwkJaWYgKGljID09IENUUkwoJ1InKSkKKwkJCWgtLTsKKwkJd2hpbGUgKGggPj0gMCkgeworCQkJaWYgKHN0YXRlLT5oaXN0b3J5W2hdKSB7CisJCQkJY2hhciAqbWF0Y2ggPSBzdHJzdHIoc3RhdGUtPmhpc3RvcnlbaF0sIG1hdGNoX2J1Zik7CisJCQkJaWYgKG1hdGNoKSB7CisJCQkJCXN0YXRlLT5jdXJfaGlzdG9yeSA9IGg7CisJCQkJCW1hdGNoZWRfaGlzdG9yeV9saW5lID0gc3RhdGUtPmhpc3RvcnlbaF07CisJCQkJCWNvbW1hbmRfbGVuID0gbG9hZF9zdHJpbmcobWF0Y2hlZF9oaXN0b3J5X2xpbmUpOworCQkJCQljdXJzb3IgPSBtYXRjaCAtIG1hdGNoZWRfaGlzdG9yeV9saW5lOworLy9GSVhNRTogY3Vyc29yIHBvc2l0aW9uIGZvciBVbmljb2RlIGNhc2UKKworCQkJCQlmcmVlKChjaGFyKiljbWRlZGl0X3Byb21wdCk7Cisgc2V0X3Byb21wdDoKKwkJCQkJY21kZWRpdF9wcm9tcHQgPSB4YXNwcmludGYoIihyZXZlcnNlLWktc2VhcmNoKSclcyc6ICIsIG1hdGNoX2J1Zik7CisJCQkJCWNtZGVkaXRfcHJtdF9sZW4gPSB1bmljb2RlX3N0cndpZHRoKGNtZGVkaXRfcHJvbXB0KTsKKwkJCQkJZ290byBkb19yZWRyYXc7CisJCQkJfQorCQkJfQorCQkJaC0tOworCQl9CisKKwkJLyogTm90IGZvdW5kICovCisJCW1hdGNoX2J1ZlttYXRjaF9idWZfbGVuXSA9ICdcMCc7CisJCWJlZXAoKTsKKwkJY29udGludWU7CisKKyBkb19yZWRyYXc6CisJCXJlZHJhdyhjbWRlZGl0X3ksIGNvbW1hbmRfbGVuIC0gY3Vyc29yKTsKKwl9IC8qIHdoaWxlICgxKSAqLworCisgcmV0OgorCWlmIChtYXRjaGVkX2hpc3RvcnlfbGluZSkKKwkJY29tbWFuZF9sZW4gPSBsb2FkX3N0cmluZyhtYXRjaGVkX2hpc3RvcnlfbGluZSk7CisKKwlmcmVlKChjaGFyKiljbWRlZGl0X3Byb21wdCk7CisJY21kZWRpdF9wcm9tcHQgPSBzYXZlZF9wcm9tcHQ7CisJY21kZWRpdF9wcm10X2xlbiA9IHNhdmVkX3BybXRfbGVuOworCXJlZHJhdyhjbWRlZGl0X3ksIGNvbW1hbmRfbGVuIC0gY3Vyc29yKTsKKworCXJldHVybiBpYzsKK30KKyNlbmRpZgorCisvKiBtYXhzaXplIG11c3QgYmUgPj0gMi4KKyAqIFJldHVybnM6CisgKiAtMSBvbiByZWFkIGVycm9ycyBvciBFT0YsIG9yIG9uIGJhcmUgQ3RybC1ELAorICogMCAgb24gY3RybC1DICh0aGUgbGluZSBlbnRlcmVkIGlzIHN0aWxsIHJldHVybmVkIGluICdjb21tYW5kJyksCisgKiA+MCBsZW5ndGggb2YgaW5wdXQgc3RyaW5nLCBpbmNsdWRpbmcgdGVybWluYXRpbmcgJ1xuJworICovCitpbnQgRkFTVF9GVU5DIHJlYWRfbGluZV9pbnB1dChsaW5lX2lucHV0X3QgKnN0LCBjb25zdCBjaGFyICpwcm9tcHQsIGNoYXIgKmNvbW1hbmQsIGludCBtYXhzaXplLCBpbnQgdGltZW91dCkKK3sKKwlpbnQgbGVuOworI2lmIEVOQUJMRV9GRUFUVVJFX1RBQl9DT01QTEVUSU9OCisJc21hbGxpbnQgbGFzdFdhc1RhYiA9IDA7CisjZW5kaWYKKwlzbWFsbGludCBicmVha19vdXQgPSAwOworI2lmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfVkkKKwlzbWFsbGludCB2aV9jbWRtb2RlID0gMDsKKyNlbmRpZgorCXN0cnVjdCB0ZXJtaW9zIGluaXRpYWxfc2V0dGluZ3M7CisJc3RydWN0IHRlcm1pb3MgbmV3X3NldHRpbmdzOworCWNoYXIgcmVhZF9rZXlfYnVmZmVyW0tFWUNPREVfQlVGRkVSX1NJWkVdOworCisJSU5JVF9TKCk7CisKKwlpZiAodGNnZXRhdHRyKFNURElOX0ZJTEVOTywgJmluaXRpYWxfc2V0dGluZ3MpIDwgMAorCSB8fCAoaW5pdGlhbF9zZXR0aW5ncy5jX2xmbGFnICYgKEVDSE98SUNBTk9OKSkgPT0gSUNBTk9OCisJKSB7CisJCS8qIEhhcHBlbnMgd2hlbiBlLmcuIHN0dHkgLWVjaG8gd2FzIHJ1biBiZWZvcmUuCisJCSAqIEJ1dCBpZiBJQ0FOT04gaXMgbm90IHNldCwgd2UgZG9uJ3QgY29tZSBoZXJlLgorCQkgKiAoZXhhbXBsZTogaW50ZXJhY3RpdmUgcHl0aG9uIF5aLWJhY2tncm91bmRlZCwKKwkJICogdHR5IGlzIHN0aWxsIGluICJyYXcgbW9kZSIpLgorCQkgKi8KKwkJcGFyc2VfYW5kX3B1dF9wcm9tcHQocHJvbXB0KTsKKwkJLyogZmZsdXNoX2FsbCgpOyAtIGRvbmUgYnkgcGFyc2VfYW5kX3B1dF9wcm9tcHQgKi8KKwkJaWYgKGZnZXRzKGNvbW1hbmQsIG1heHNpemUsIHN0ZGluKSA9PSBOVUxMKQorCQkJbGVuID0gLTE7IC8qIEVPRiBvciBlcnJvciAqLworCQllbHNlCisJCQlsZW4gPSBzdHJsZW4oY29tbWFuZCk7CisJCURFSU5JVF9TKCk7CisJCXJldHVybiBsZW47CisJfQorCisJaW5pdF91bmljb2RlKCk7CisKKy8vIEZJWE1FOiBhdWRpdCAmIGltcHJvdmUgdGhpcworCWlmIChtYXhzaXplID4gTUFYX0xJTkVMRU4pCisJCW1heHNpemUgPSBNQVhfTElORUxFTjsKKwlTLm1heHNpemUgPSBtYXhzaXplOworCisJLyogV2l0aCB6ZXJvIGZsYWdzLCBubyBvdGhlciBmaWVsZHMgYXJlIGV2ZXIgdXNlZCAqLworCXN0YXRlID0gc3QgPyBzdCA6IChsaW5lX2lucHV0X3QqKSAmY29uc3RfaW50XzA7CisjaWYgTUFYX0hJU1RPUlkgPiAwCisjIGlmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkKKwlpZiAoc3RhdGUtPmhpc3RfZmlsZSkKKwkJaWYgKHN0YXRlLT5jbnRfaGlzdG9yeSA9PSAwKQorCQkJbG9hZF9oaXN0b3J5KHN0YXRlKTsKKyMgZW5kaWYKKwlpZiAoc3RhdGUtPmZsYWdzICYgRE9fSElTVE9SWSkKKwkJc3RhdGUtPmN1cl9oaXN0b3J5ID0gc3RhdGUtPmNudF9oaXN0b3J5OworI2VuZGlmCisKKwkvKiBwcmVwYXJlIGJlZm9yZSBpbml0IGhhbmRsZXJzICovCisJY21kZWRpdF95ID0gMDsgIC8qIHF1YXNpcmVhbCB5LCBub3QgdHJ1ZSBpZiBsaW5lID4geHQqeXQgKi8KKwljb21tYW5kX2xlbiA9IDA7CisjaWYgRU5BQkxFX1VOSUNPREVfU1VQUE9SVAorCWNvbW1hbmRfcHMgPSB4emFsbG9jKG1heHNpemUgKiBzaXplb2YoY29tbWFuZF9wc1swXSkpOworI2Vsc2UKKwljb21tYW5kX3BzID0gY29tbWFuZDsKKwljb21tYW5kWzBdID0gJ1wwJzsKKyNlbmRpZgorI2RlZmluZSBjb21tYW5kIGNvbW1hbmRfbXVzdF9ub3RfYmVfdXNlZAorCisJbmV3X3NldHRpbmdzID0gaW5pdGlhbF9zZXR0aW5nczsKKwkvKiB+SUNBTk9OOiB1bmJ1ZmZlcmVkIGlucHV0IChtb3N0IGNfY2NbXSBhcmUgZGlzYWJsZWQsIFZNSU4vVlRJTUUgYXJlIGVuYWJsZWQpICovCisJLyogfkVDSE8sIH5FQ0hPTkw6IHR1cm4gb2ZmIGVjaG9pbmcsIGluY2x1ZGluZyBuZXdsaW5lIGVjaG9pbmcgKi8KKwkvKiB+SVNJRzogdHVybiBvZmYgSU5UUiAoY3RybC1DKSwgUVVJVCwgU1VTUCAqLworCW5ld19zZXR0aW5ncy5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyB8IEVDSE9OTCB8IElTSUcpOworCS8qIHJlYWRzIHdvdWxkIGJsb2NrIG9ubHkgaWYgPCAxIGNoYXIgaXMgYXZhaWxhYmxlICovCisJbmV3X3NldHRpbmdzLmNfY2NbVk1JTl0gPSAxOworCS8qIG5vIHRpbWVvdXQgKHJlYWRzIGJsb2NrIGZvcmV2ZXIpICovCisJbmV3X3NldHRpbmdzLmNfY2NbVlRJTUVdID0gMDsKKwkvKiBTaG91bGQgYmUgbm90IG5lZWRlZCBpZiBJU0lHIGlzIG9mZjogKi8KKwkvKiBUdXJuIG9mZiBDVFJMLUMgKi8KKwkvKiBuZXdfc2V0dGluZ3MuY19jY1tWSU5UUl0gPSBfUE9TSVhfVkRJU0FCTEU7ICovCisJdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coJm5ld19zZXR0aW5ncyk7CisKKyNpZiBFTkFCTEVfVVNFUk5BTUVfT1JfSE9NRURJUgorCXsKKwkJc3RydWN0IHBhc3N3ZCAqZW50cnk7CisKKwkJZW50cnkgPSBnZXRwd3VpZChnZXRldWlkKCkpOworCQlpZiAoZW50cnkpIHsKKwkJCXVzZXJfYnVmID0geHN0cmR1cChlbnRyeS0+cHdfbmFtZSk7CisJCQlob21lX3B3ZF9idWYgPSB4c3RyZHVwKGVudHJ5LT5wd19kaXIpOworCQl9CisJfQorI2VuZGlmCisKKyNpZiAwCisJZm9yIChpID0gMDsgaSA8PSBzdGF0ZS0+bWF4X2hpc3Rvcnk7IGkrKykKKwkJYmJfZXJyb3JfbXNnKCJoaXN0b3J5WyVkXTonJXMnIiwgaSwgc3RhdGUtPmhpc3RvcnlbaV0pOworCWJiX2Vycm9yX21zZygiY3VyX2hpc3Rvcnk6JWQgY250X2hpc3Rvcnk6JWQiLCBzdGF0ZS0+Y3VyX2hpc3RvcnksIHN0YXRlLT5jbnRfaGlzdG9yeSk7CisjZW5kaWYKKworCS8qIFByaW50IG91dCB0aGUgY29tbWFuZCBwcm9tcHQsIG9wdGlvbmFsbHkgYXNrIHdoZXJlIGN1cnNvciBpcyAqLworCXBhcnNlX2FuZF9wdXRfcHJvbXB0KHByb21wdCk7CisJYXNrX3Rlcm1pbmFsKCk7CisKKwkvKiBJbnN0YWxsIHdpbmRvdyByZXNpemUgaGFuZGxlciAoTkI6IGFmdGVyICphbGwqIGluaXQgaXMgY29tcGxldGUpICovCisvL0ZJWE1FOiBzYXZlIGVudGlyZSBzaWdhY3Rpb24hCisJcHJldmlvdXNfU0lHV0lOQ0hfaGFuZGxlciA9IHNpZ25hbChTSUdXSU5DSCwgd2luX2NoYW5nZWQpOworCXdpbl9jaGFuZ2VkKDApOyAvKiBnZXQgaW5pdGlhbCB3aW5kb3cgc2l6ZSAqLworCisJcmVhZF9rZXlfYnVmZmVyWzBdID0gMDsKKwl3aGlsZSAoMSkgeworCQkvKgorCQkgKiBUaGUgZW1hY3MgYW5kIHZpIG1vZGVzIHNoYXJlIG11Y2ggb2YgdGhlIGNvZGUgaW4gdGhlIGJpZworCQkgKiBjb21tYW5kIGxvb3AuICBDb21tYW5kcyBlbnRlcmVkIHdoZW4gaW4gdmkncyBjb21tYW5kIG1vZGUKKwkJICogKGFrYSAiZXNjYXBlIG1vZGUiKSBnZXQgYW4gZXh0cmEgYml0IGFkZGVkIHRvIGRpc3Rpbmd1aXNoCisJCSAqIHRoZW0gLSB0aGlzIGtlZXBzIHRoZW0gZnJvbSBiZWluZyBzZWxmLWluc2VydGVkLiBUaGlzCisJCSAqIGNsdXR0ZXJzIHRoZSBiaWcgc3dpdGNoIGEgYml0LCBidXQga2VlcHMgYWxsIHRoZSBjb2RlCisJCSAqIGluIG9uZSBwbGFjZS4KKwkJICovCisJCWludDMyX3QgaWMsIGljX3JhdzsKKworCQlmZmx1c2hfYWxsKCk7CisJCWljID0gaWNfcmF3ID0gbGluZWVkaXRfcmVhZF9rZXkocmVhZF9rZXlfYnVmZmVyLCB0aW1lb3V0KTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1JFVkVSU0VfU0VBUkNICisgYWdhaW46CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1ZJCisJCW5ld2RlbGZsYWcgPSAxOworCQlpZiAodmlfY21kbW9kZSkgeworCQkJLyogYnR3LCBzaW5jZSBLRVlDT0RFX3h4eCBhcmUgYWxsIDwgMCwgdGhpcyBkb2Vzbid0CisJCQkgKiBjaGFuZ2UgaWMgaWYgaXQgY29udGFpbnMgb25lIG9mIHRoZW06ICovCisJCQlpYyB8PSBWSV9DTURNT0RFX0JJVDsKKwkJfQorI2VuZGlmCisKKwkJc3dpdGNoIChpYykgeworCQljYXNlICdcbic6CisJCWNhc2UgJ1xyJzoKKwkJdmlfY2FzZSgnXG4nfFZJX0NNRE1PREVfQklUOikKKwkJdmlfY2FzZSgnXHInfFZJX0NNRE1PREVfQklUOikKKwkJCS8qIEVudGVyICovCisJCQlnb3RvX25ld19saW5lKCk7CisJCQlicmVha19vdXQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgQ1RSTCgnQScpOgorCQl2aV9jYXNlKCcwJ3xWSV9DTURNT0RFX0JJVDopCisJCQkvKiBDb250cm9sLWEgLS0gQmVnaW5uaW5nIG9mIGxpbmUgKi8KKwkJCWlucHV0X2JhY2t3YXJkKGN1cnNvcik7CisJCQlicmVhazsKKwkJY2FzZSBDVFJMKCdCJyk6CisJCXZpX2Nhc2UoJ2gnfFZJX0NNRE1PREVfQklUOikKKwkJdmlfY2FzZSgnXGInfFZJX0NNRE1PREVfQklUOikgLyogXkggKi8KKwkJdmlfY2FzZSgnXHg3Zid8VklfQ01ETU9ERV9CSVQ6KSAvKiBERUwgKi8KKwkJCWlucHV0X2JhY2t3YXJkKDEpOyAvKiBNb3ZlIGJhY2sgb25lIGNoYXJhY3RlciAqLworCQkJYnJlYWs7CisJCWNhc2UgQ1RSTCgnRScpOgorCQl2aV9jYXNlKCckJ3xWSV9DTURNT0RFX0JJVDopCisJCQkvKiBDb250cm9sLWUgLS0gRW5kIG9mIGxpbmUgKi8KKwkJCXB1dF90aWxsX2VuZF9hbmRfYWR2X2N1cnNvcigpOworCQkJYnJlYWs7CisJCWNhc2UgQ1RSTCgnRicpOgorCQl2aV9jYXNlKCdsJ3xWSV9DTURNT0RFX0JJVDopCisJCXZpX2Nhc2UoJyAnfFZJX0NNRE1PREVfQklUOikKKwkJCWlucHV0X2ZvcndhcmQoKTsgLyogTW92ZSBmb3J3YXJkIG9uZSBjaGFyYWN0ZXIgKi8KKwkJCWJyZWFrOworCQljYXNlICdcYic6ICAgLyogXkggKi8KKwkJY2FzZSAnXHg3Zic6IC8qIERFTCAqLworCQkJaWYgKCFpc3J0bF9zdHIoKSkKKwkJCQlpbnB1dF9iYWNrc3BhY2UoKTsKKwkJCWVsc2UKKwkJCQlpbnB1dF9kZWxldGUoMCk7CisJCQlicmVhazsKKwkJY2FzZSBLRVlDT0RFX0RFTEVURToKKwkJCWlmICghaXNydGxfc3RyKCkpCisJCQkJaW5wdXRfZGVsZXRlKDApOworCQkJZWxzZQorCQkJCWlucHV0X2JhY2tzcGFjZSgpOworCQkJYnJlYWs7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFCX0NPTVBMRVRJT04KKwkJY2FzZSAnXHQnOgorCQkJaW5wdXRfdGFiKCZsYXN0V2FzVGFiKTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgQ1RSTCgnSycpOgorCQkJLyogQ29udHJvbC1rIC0tIGNsZWFyIHRvIGVuZCBvZiBsaW5lICovCisJCQljb21tYW5kX3BzW2N1cnNvcl0gPSBCQl9OVUw7CisJCQljb21tYW5kX2xlbiA9IGN1cnNvcjsKKwkJCXByaW50ZihTRVFfQ0xFQVJfVElMTF9FTkRfT0ZfU0NSRUVOKTsKKwkJCWJyZWFrOworCQljYXNlIENUUkwoJ0wnKToKKwkJdmlfY2FzZShDVFJMKCdMJyl8VklfQ01ETU9ERV9CSVQ6KQorCQkJLyogQ29udHJvbC1sIC0tIGNsZWFyIHNjcmVlbiAqLworCQkJcHJpbnRmKEVTQyJbSCIpOyAvKiBjdXJzb3IgdG8gdG9wLGxlZnQgKi8KKwkJCXJlZHJhdygwLCBjb21tYW5kX2xlbiAtIGN1cnNvcik7CisJCQlicmVhazsKKyNpZiBNQVhfSElTVE9SWSA+IDAKKwkJY2FzZSBDVFJMKCdOJyk6CisJCXZpX2Nhc2UoQ1RSTCgnTicpfFZJX0NNRE1PREVfQklUOikKKwkJdmlfY2FzZSgnaid8VklfQ01ETU9ERV9CSVQ6KQorCQkJLyogQ29udHJvbC1uIC0tIEdldCBuZXh0IGNvbW1hbmQgaW4gaGlzdG9yeSAqLworCQkJaWYgKGdldF9uZXh0X2hpc3RvcnkoKSkKKwkJCQlnb3RvIHJld3JpdGVfbGluZTsKKwkJCWJyZWFrOworCQljYXNlIENUUkwoJ1AnKToKKwkJdmlfY2FzZShDVFJMKCdQJyl8VklfQ01ETU9ERV9CSVQ6KQorCQl2aV9jYXNlKCdrJ3xWSV9DTURNT0RFX0JJVDopCisJCQkvKiBDb250cm9sLXAgLS0gR2V0IHByZXZpb3VzIGNvbW1hbmQgZnJvbSBoaXN0b3J5ICovCisJCQlpZiAoZ2V0X3ByZXZpb3VzX2hpc3RvcnkoKSkKKwkJCQlnb3RvIHJld3JpdGVfbGluZTsKKwkJCWJyZWFrOworI2VuZGlmCisJCWNhc2UgQ1RSTCgnVScpOgorCQl2aV9jYXNlKENUUkwoJ1UnKXxWSV9DTURNT0RFX0JJVDopCisJCQkvKiBDb250cm9sLVUgLS0gQ2xlYXIgbGluZSBiZWZvcmUgY3Vyc29yICovCisJCQlpZiAoY3Vyc29yKSB7CisJCQkJY29tbWFuZF9sZW4gLT0gY3Vyc29yOworCQkJCW1lbW1vdmUoY29tbWFuZF9wcywgY29tbWFuZF9wcyArIGN1cnNvciwKKwkJCQkJKGNvbW1hbmRfbGVuICsgMSkgKiBzaXplb2YoY29tbWFuZF9wc1swXSkpOworCQkJCXJlZHJhdyhjbWRlZGl0X3ksIGNvbW1hbmRfbGVuKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIENUUkwoJ1cnKToKKwkJdmlfY2FzZShDVFJMKCdXJyl8VklfQ01ETU9ERV9CSVQ6KQorCQkJLyogQ29udHJvbC1XIC0tIFJlbW92ZSB0aGUgbGFzdCB3b3JkICovCisJCQl3aGlsZSAoY3Vyc29yID4gMCAmJiBCQl9pc3NwYWNlKGNvbW1hbmRfcHNbY3Vyc29yLTFdKSkKKwkJCQlpbnB1dF9iYWNrc3BhY2UoKTsKKwkJCXdoaWxlIChjdXJzb3IgPiAwICYmICFCQl9pc3NwYWNlKGNvbW1hbmRfcHNbY3Vyc29yLTFdKSkKKwkJCQlpbnB1dF9iYWNrc3BhY2UoKTsKKwkJCWJyZWFrOworI2lmIEVOQUJMRV9GRUFUVVJFX1JFVkVSU0VfU0VBUkNICisJCWNhc2UgQ1RSTCgnUicpOgorCQkJaWMgPSBpY19yYXcgPSByZXZlcnNlX2lfc2VhcmNoKCk7CisJCQlnb3RvIGFnYWluOworI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1ZJCisJCWNhc2UgJ2knfFZJX0NNRE1PREVfQklUOgorCQkJdmlfY21kbW9kZSA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnSSd8VklfQ01ETU9ERV9CSVQ6CisJCQlpbnB1dF9iYWNrd2FyZChjdXJzb3IpOworCQkJdmlfY21kbW9kZSA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnYSd8VklfQ01ETU9ERV9CSVQ6CisJCQlpbnB1dF9mb3J3YXJkKCk7CisJCQl2aV9jbWRtb2RlID0gMDsKKwkJCWJyZWFrOworCQljYXNlICdBJ3xWSV9DTURNT0RFX0JJVDoKKwkJCXB1dF90aWxsX2VuZF9hbmRfYWR2X2N1cnNvcigpOworCQkJdmlfY21kbW9kZSA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAneCd8VklfQ01ETU9ERV9CSVQ6CisJCQlpbnB1dF9kZWxldGUoMSk7CisJCQlicmVhazsKKwkJY2FzZSAnWCd8VklfQ01ETU9ERV9CSVQ6CisJCQlpZiAoY3Vyc29yID4gMCkgeworCQkJCWlucHV0X2JhY2t3YXJkKDEpOworCQkJCWlucHV0X2RlbGV0ZSgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdXJ3xWSV9DTURNT0RFX0JJVDoKKwkJCXZpX1dvcmRfbW90aW9uKDEpOworCQkJYnJlYWs7CisJCWNhc2UgJ3cnfFZJX0NNRE1PREVfQklUOgorCQkJdmlfd29yZF9tb3Rpb24oMSk7CisJCQlicmVhazsKKwkJY2FzZSAnRSd8VklfQ01ETU9ERV9CSVQ6CisJCQl2aV9FbmRfbW90aW9uKCk7CisJCQlicmVhazsKKwkJY2FzZSAnZSd8VklfQ01ETU9ERV9CSVQ6CisJCQl2aV9lbmRfbW90aW9uKCk7CisJCQlicmVhazsKKwkJY2FzZSAnQid8VklfQ01ETU9ERV9CSVQ6CisJCQl2aV9CYWNrX21vdGlvbigpOworCQkJYnJlYWs7CisJCWNhc2UgJ2InfFZJX0NNRE1PREVfQklUOgorCQkJdmlfYmFja19tb3Rpb24oKTsKKwkJCWJyZWFrOworCQljYXNlICdDJ3xWSV9DTURNT0RFX0JJVDoKKwkJCXZpX2NtZG1vZGUgPSAwOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgJ0QnfFZJX0NNRE1PREVfQklUOgorCQkJZ290byBjbGVhcl90b19lb2w7CisKKwkJY2FzZSAnYyd8VklfQ01ETU9ERV9CSVQ6CisJCQl2aV9jbWRtb2RlID0gMDsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlICdkJ3xWSV9DTURNT0RFX0JJVDogeworCQkJaW50IG5jLCBzYzsKKworCQkJaWMgPSBsaW5lZWRpdF9yZWFkX2tleShyZWFkX2tleV9idWZmZXIsIHRpbWVvdXQpOworCQkJaWYgKGVycm5vKSAvKiBlcnJvciAqLworCQkJCWdvdG8gcmV0dXJuX2Vycm9yX2luZGljYXRvcjsKKwkJCWlmIChpYyA9PSBpY19yYXcpIHsgLyogImNjIiwgImRkIiAqLworCQkJCWlucHV0X2JhY2t3YXJkKGN1cnNvcik7CisJCQkJZ290byBjbGVhcl90b19lb2w7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCXNjID0gY3Vyc29yOworCQkJc3dpdGNoIChpYykgeworCQkJY2FzZSAndyc6CisJCQljYXNlICdXJzoKKwkJCWNhc2UgJ2UnOgorCQkJY2FzZSAnRSc6CisJCQkJc3dpdGNoIChpYykgeworCQkJCWNhc2UgJ3cnOiAgIC8qICJkdyIsICJjdyIgKi8KKwkJCQkJdmlfd29yZF9tb3Rpb24odmlfY21kbW9kZSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ1cnOiAgIC8qICdkVycsICdjVycgKi8KKwkJCQkJdmlfV29yZF9tb3Rpb24odmlfY21kbW9kZSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ2UnOiAgIC8qICdkZScsICdjZScgKi8KKwkJCQkJdmlfZW5kX21vdGlvbigpOworCQkJCQlpbnB1dF9mb3J3YXJkKCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ0UnOiAgIC8qICdkRScsICdjRScgKi8KKwkJCQkJdmlfRW5kX21vdGlvbigpOworCQkJCQlpbnB1dF9mb3J3YXJkKCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQluYyA9IGN1cnNvcjsKKwkJCQlpbnB1dF9iYWNrd2FyZChjdXJzb3IgLSBzYyk7CisJCQkJd2hpbGUgKG5jLS0gPiBjdXJzb3IpCisJCQkJCWlucHV0X2RlbGV0ZSgxKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2InOiAgLyogImRiIiwgImNiIiAqLworCQkJY2FzZSAnQic6ICAvKiBpbXBsZW1lbnRlZCBhcyBCICovCisJCQkJaWYgKGljID09ICdiJykKKwkJCQkJdmlfYmFja19tb3Rpb24oKTsKKwkJCQllbHNlCisJCQkJCXZpX0JhY2tfbW90aW9uKCk7CisJCQkJd2hpbGUgKHNjLS0gPiBjdXJzb3IpCisJCQkJCWlucHV0X2RlbGV0ZSgxKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJyAnOiAgLyogImQgIiwgImMgIiAqLworCQkJCWlucHV0X2RlbGV0ZSgxKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJyQnOiAgLyogImQkIiwgImMkIiAqLworIGNsZWFyX3RvX2VvbDoKKwkJCQl3aGlsZSAoY3Vyc29yIDwgY29tbWFuZF9sZW4pCisJCQkJCWlucHV0X2RlbGV0ZSgxKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWNhc2UgJ3AnfFZJX0NNRE1PREVfQklUOgorCQkJaW5wdXRfZm9yd2FyZCgpOworCQkJLyogZmFsbHRocm91Z2ggKi8KKwkJY2FzZSAnUCd8VklfQ01ETU9ERV9CSVQ6CisJCQlwdXQoKTsKKwkJCWJyZWFrOworCQljYXNlICdyJ3xWSV9DTURNT0RFX0JJVDoKKy8vRklYTUU6IHVuaWNvZGUgY2FzZT8KKwkJCWljID0gbGluZWVkaXRfcmVhZF9rZXkocmVhZF9rZXlfYnVmZmVyLCB0aW1lb3V0KTsKKwkJCWlmIChlcnJubykgLyogZXJyb3IgKi8KKwkJCQlnb3RvIHJldHVybl9lcnJvcl9pbmRpY2F0b3I7CisJCQlpZiAoaWMgPCAnICcgfHwgaWMgPiAyNTUpIHsKKwkJCQliZWVwKCk7CisJCQl9IGVsc2UgeworCQkJCWNvbW1hbmRfcHNbY3Vyc29yXSA9IGljOworCQkJCWJiX3B1dGNoYXIoaWMpOworCQkJCWJiX3B1dGNoYXIoJ1xiJyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnXHgxYic6IC8qIEVTQyAqLworCQkJaWYgKHN0YXRlLT5mbGFncyAmIFZJX01PREUpIHsKKwkJCQkvKiBpbnNlcnQgbW9kZSAtLT4gY29tbWFuZCBtb2RlICovCisJCQkJdmlfY21kbW9kZSA9IDE7CisJCQkJaW5wdXRfYmFja3dhcmQoMSk7CisJCQl9CisJCQkvKiBIYW5kbGUgYSBmZXcgRVNDLTxrZXk+IGNvbWJpbmF0aW9ucyB0aGUgc2FtZSB3YXkKKwkJCSAqIHN0YW5kYXJkIHJlYWRsaW5lIGJpbmRpbmdzIChJT1c6IGJhc2gpIGRvLgorCQkJICogT2Z0ZW4sIEFsdC08a2V5PiBnZW5lcmF0ZXMgRVNDLTxrZXk+LgorCQkJICovCisJCQlpYyA9IGxpbmVlZGl0X3JlYWRfa2V5KHJlYWRfa2V5X2J1ZmZlciwgNTApOworCQkJc3dpdGNoIChpYykgeworCQkJCS8vY2FzZSBLRVlDT0RFX0xFRlQ6IC0gYmFzaCBkb2Vzbid0IGRvIHRoaXMKKwkJCQljYXNlICdiJzoKKwkJCQkJY3RybF9sZWZ0KCk7CisJCQkJCWJyZWFrOworCQkJCS8vY2FzZSBLRVlDT0RFX1JJR0hUOiAtIGJhc2ggZG9lc24ndCBkbyB0aGlzCisJCQkJY2FzZSAnZic6CisJCQkJCWN0cmxfcmlnaHQoKTsKKwkJCQkJYnJlYWs7CisJCQkJLy9jYXNlIEtFWUNPREVfREVMRVRFOiAtIGJhc2ggZG9lc24ndCBkbyB0aGlzCisJCQkJY2FzZSAnZCc6ICAvKiBBbHQtRCAqLworCQkJCXsKKwkJCQkJLyogRGVsZXRlIHdvcmQgZm9yd2FyZCAqLworCQkJCQlpbnQgbmMsIHNjID0gY3Vyc29yOworCQkJCQljdHJsX3JpZ2h0KCk7CisJCQkJCW5jID0gY3Vyc29yIC0gc2M7CisJCQkJCWlucHV0X2JhY2t3YXJkKG5jKTsKKwkJCQkJd2hpbGUgKC0tbmMgPj0gMCkKKwkJCQkJCWlucHV0X2RlbGV0ZSgxKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWNhc2UgJ1xiJzogICAvKiBBbHQtQmFja3NwYWNlKD8pICovCisJCQkJY2FzZSAnXHg3Zic6IC8qIEFsdC1CYWNrc3BhY2UoPykgKi8KKwkJCQkvL2Nhc2UgJ3cnOiAtIGJhc2ggZG9lc24ndCBkbyB0aGlzCisJCQkJeworCQkJCQkvKiBEZWxldGUgd29yZCBiYWNrd2FyZCAqLworCQkJCQlpbnQgc2MgPSBjdXJzb3I7CisJCQkJCWN0cmxfbGVmdCgpOworCQkJCQl3aGlsZSAoc2MtLSA+IGN1cnNvcikKKwkJCQkJCWlucHV0X2RlbGV0ZSgxKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisjZW5kaWYgLyogRkVBVFVSRV9DT01NQU5EX0VESVRJTkdfVkkgKi8KKworI2lmIE1BWF9ISVNUT1JZID4gMAorCQljYXNlIEtFWUNPREVfVVA6CisJCQlpZiAoZ2V0X3ByZXZpb3VzX2hpc3RvcnkoKSkKKwkJCQlnb3RvIHJld3JpdGVfbGluZTsKKwkJCWJlZXAoKTsKKwkJCWJyZWFrOworCQljYXNlIEtFWUNPREVfRE9XTjoKKwkJCWlmICghZ2V0X25leHRfaGlzdG9yeSgpKQorCQkJCWJyZWFrOworIHJld3JpdGVfbGluZToKKwkJCS8qIFJld3JpdGUgdGhlIGxpbmUgd2l0aCB0aGUgc2VsZWN0ZWQgaGlzdG9yeSBpdGVtICovCisJCQkvKiBjaGFuZ2UgY29tbWFuZCAqLworCQkJY29tbWFuZF9sZW4gPSBsb2FkX3N0cmluZyhzdGF0ZS0+aGlzdG9yeVtzdGF0ZS0+Y3VyX2hpc3RvcnldID8KKwkJCQkJc3RhdGUtPmhpc3Rvcnlbc3RhdGUtPmN1cl9oaXN0b3J5XSA6ICIiKTsKKwkJCS8qIHJlZHJhdyBhbmQgZ28gdG8gZW9sIChib2wsIGluIHZpKSAqLworCQkJcmVkcmF3KGNtZGVkaXRfeSwgKHN0YXRlLT5mbGFncyAmIFZJX01PREUpID8gOTk5OSA6IDApOworCQkJYnJlYWs7CisjZW5kaWYKKwkJY2FzZSBLRVlDT0RFX1JJR0hUOgorCQkJaW5wdXRfZm9yd2FyZCgpOworCQkJYnJlYWs7CisJCWNhc2UgS0VZQ09ERV9MRUZUOgorCQkJaW5wdXRfYmFja3dhcmQoMSk7CisJCQlicmVhazsKKwkJY2FzZSBLRVlDT0RFX0NUUkxfTEVGVDoKKwkJY2FzZSBLRVlDT0RFX0FMVF9MRUZUOiAvKiBiYXNoIGRvZXNuJ3QgZG8gaXQgKi8KKwkJCWN0cmxfbGVmdCgpOworCQkJYnJlYWs7CisJCWNhc2UgS0VZQ09ERV9DVFJMX1JJR0hUOgorCQljYXNlIEtFWUNPREVfQUxUX1JJR0hUOiAvKiBiYXNoIGRvZXNuJ3QgZG8gaXQgKi8KKwkJCWN0cmxfcmlnaHQoKTsKKwkJCWJyZWFrOworCQljYXNlIEtFWUNPREVfSE9NRToKKwkJCWlucHV0X2JhY2t3YXJkKGN1cnNvcik7CisJCQlicmVhazsKKwkJY2FzZSBLRVlDT0RFX0VORDoKKwkJCXB1dF90aWxsX2VuZF9hbmRfYWR2X2N1cnNvcigpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWlmIChpbml0aWFsX3NldHRpbmdzLmNfY2NbVklOVFJdICE9IDAKKwkJCSAmJiBpY19yYXcgPT0gaW5pdGlhbF9zZXR0aW5ncy5jX2NjW1ZJTlRSXQorCQkJKSB7CisJCQkJLyogQ3RybC1DICh1c3VhbGx5KSAtIHN0b3AgZ2F0aGVyaW5nIGlucHV0ICovCisJCQkJZ290b19uZXdfbGluZSgpOworCQkJCWNvbW1hbmRfbGVuID0gMDsKKwkJCQlicmVha19vdXQgPSAtMTsgLyogImRvIG5vdCBhcHBlbmQgJ1xuJyIgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChpbml0aWFsX3NldHRpbmdzLmNfY2NbVkVPRl0gIT0gMAorCQkJICYmIGljX3JhdyA9PSBpbml0aWFsX3NldHRpbmdzLmNfY2NbVkVPRl0KKwkJCSkgeworCQkJCS8qIEN0cmwtRCAodXN1YWxseSkgLSBkZWxldGUgb25lIGNoYXJhY3RlciwKKwkJCQkgKiBvciBleGl0IGlmIGxlbj0wIGFuZCBubyBjaGFycyB0byBkZWxldGUgKi8KKwkJCQlpZiAoY29tbWFuZF9sZW4gPT0gMCkgeworCQkJCQllcnJubyA9IDA7CisKKwkJY2FzZSAtMTogLyogZXJyb3IgKGUuZy4gRUlPIHdoZW4gdHR5IGlzIGRlc3Ryb3llZCkgKi8KKyBJRl9GRUFUVVJFX0VESVRJTkdfVkkocmV0dXJuX2Vycm9yX2luZGljYXRvcjopCisJCQkJCWJyZWFrX291dCA9IGNvbW1hbmRfbGVuID0gLTE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpbnB1dF9kZWxldGUoMCk7CisJCQkJYnJlYWs7CisJCQl9CisvLwkJCS8qIENvbnRyb2wtViAtLSBmb3JjZSBpbnNlcnQgb2YgbmV4dCBjaGFyICovCisvLwkJCWlmIChjID09IENUUkwoJ1YnKSkgeworLy8JCQkJaWYgKHNhZmVfcmVhZChTVERJTl9GSUxFTk8sICZjLCAxKSA8IDEpCisvLwkJCQkJZ290byByZXR1cm5fZXJyb3JfaW5kaWNhdG9yOworLy8JCQkJaWYgKGMgPT0gMCkgeworLy8JCQkJCWJlZXAoKTsKKy8vCQkJCQlicmVhazsKKy8vCQkJCX0KKy8vCQkJfQorCQkJaWYgKGljIDwgJyAnCisJCQkgfHwgKCFFTkFCTEVfVU5JQ09ERV9TVVBQT1JUICYmIGljID49IDI1NikKKwkJCSB8fCAoRU5BQkxFX1VOSUNPREVfU1VQUE9SVCAmJiBpYyA+PSBWSV9DTURNT0RFX0JJVCkKKwkJCSkgeworCQkJCS8qIElmIFZJX0NNRE1PREVfQklUIGlzIHNldCwgaWMgaXMgPj0gMjU2CisJCQkJICogYW5kIHZpIG1vZGUgaWdub3JlcyB1bmV4cGVjdGVkIGNoYXJzLgorCQkJCSAqIE90aGVyd2lzZSwgd2UgYXJlIGhlcmUgaWYgaWMgaXMgYQorCQkJCSAqIGNvbnRyb2wgY2hhciBvciBhbiB1bmhhbmRsZWQgRVNDIHNlcXVlbmNlLAorCQkJCSAqIHdoaWNoIGlzIGFsc28gaWdub3JlZC4KKwkJCQkgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICgoaW50KWNvbW1hbmRfbGVuID49IChtYXhzaXplIC0gMikpIHsKKwkJCQkvKiBOb3QgZW5vdWdoIHNwYWNlIGZvciB0aGUgY2hhciBhbmQgRU9MICovCisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNvbW1hbmRfbGVuKys7CisJCQlpZiAoY3Vyc29yID09IChjb21tYW5kX2xlbiAtIDEpKSB7CisJCQkJLyogV2UgYXJlIGF0IHRoZSBlbmQsIGFwcGVuZCAqLworCQkJCWNvbW1hbmRfcHNbY3Vyc29yXSA9IGljOworCQkJCWNvbW1hbmRfcHNbY3Vyc29yICsgMV0gPSBCQl9OVUw7CisJCQkJcHV0X2N1cl9nbHlwaF9hbmRfaW5jX2N1cnNvcigpOworCQkJCWlmICh1bmljb2RlX2JpZGlfaXNydGwoaWMpKQorCQkJCQlpbnB1dF9iYWNrd2FyZCgxKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogSW4gdGhlIG1pZGRsZSwgaW5zZXJ0ICovCisJCQkJaW50IHNjID0gY3Vyc29yOworCisJCQkJbWVtbW92ZShjb21tYW5kX3BzICsgc2MgKyAxLCBjb21tYW5kX3BzICsgc2MsCisJCQkJCShjb21tYW5kX2xlbiAtIHNjKSAqIHNpemVvZihjb21tYW5kX3BzWzBdKSk7CisJCQkJY29tbWFuZF9wc1tzY10gPSBpYzsKKwkJCQkvKiBpcyByaWdodC10by1sZWZ0IGNoYXIsIG9yIG5ldXRyYWwgb25lIChlLmcuIGNvbW1hKSB3YXMganVzdCBhZGRlZCB0byBydGwgdGV4dD8gKi8KKwkJCQlpZiAoIWlzcnRsX3N0cigpKQorCQkJCQlzYysrOyAvKiBubyAqLworCQkJCXB1dF90aWxsX2VuZF9hbmRfYWR2X2N1cnNvcigpOworCQkJCS8qIHRvIHByZXYgeCBwb3MgKyAxICovCisJCQkJaW5wdXRfYmFja3dhcmQoY3Vyc29yIC0gc2MpOworCQkJfQorCQkJYnJlYWs7CisJCX0gLyogc3dpdGNoIChpYykgKi8KKworCQlpZiAoYnJlYWtfb3V0KQorCQkJYnJlYWs7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQUJfQ09NUExFVElPTgorCQlpZiAoaWNfcmF3ICE9ICdcdCcpCisJCQlsYXN0V2FzVGFiID0gMDsKKyNlbmRpZgorCX0gLyogd2hpbGUgKDEpICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX0FTS19URVJNSU5BTAorCWlmIChTLnNlbnRfRVNDX2JyNm4pIHsKKwkJLyogInNsZWVwIDE7IGJ1c3lib3ggYXNoIiArIGhvbGQgW0VudGVyXSB0byB0cmlnZ2VyLgorCQkgKiBXZSBzZW50ICJFU0MgWyA2IG4iLCBidXQgZ290ICdcbicgZmlyc3QsIGFuZAorCQkgKiBLRVlDT0RFX0NVUlNPUl9QT1MgcmVzcG9uc2UgaXMgbm93IGJ1ZmZlcmVkIGZyb20gdGVybWluYWwuCisJCSAqIEl0J3MgYmFkIGFscmVhZHkgYW5kIG5vdCBtdWNoIGNhbiBiZSBkb25lIHdpdGggaXQKKwkJICogKGl0IF93aWxsXyBiZSB2aXNpYmxlIGZvciB0aGUgbmV4dCBwcm9jZXNzIHRvIHJlYWQgc3RkaW4pLAorCQkgKiBidXQgd2l0aG91dCB0aGlzIGRlbGF5IGl0IGV2ZW4gc2hvd3MgdXAgb24gdGhlIHNjcmVlbgorCQkgKiBhcyBnYXJiYWdlIGJlY2F1c2Ugd2UgcmVzdG9yZSBlY2hvIHNldHRpbmdzIHdpdGggdGNzZXRhdHRyCisJCSAqIGJlZm9yZSBpdCBjb21lcyBpbi4gVUdMWSEKKwkJICovCisJCXVzbGVlcCgyMCoxMDAwKTsKKwl9CisjZW5kaWYKKworLyogRW5kIG9mIGJ1Zy1jYXRjaGluZyAiY29tbWFuZF9tdXN0X25vdF9iZV91c2VkIiB0cmljayAqLworI3VuZGVmIGNvbW1hbmQKKworI2lmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwljb21tYW5kWzBdID0gJ1wwJzsKKwlpZiAoY29tbWFuZF9sZW4gPiAwKQorCQljb21tYW5kX2xlbiA9IHNhdmVfc3RyaW5nKGNvbW1hbmQsIG1heHNpemUgLSAxKTsKKwlmcmVlKGNvbW1hbmRfcHMpOworI2VuZGlmCisKKwlpZiAoY29tbWFuZF9sZW4gPiAwKSB7CisJCXJlbWVtYmVyX2luX2hpc3RvcnkoY29tbWFuZCk7CisJfQorCisJaWYgKGJyZWFrX291dCA+IDApIHsKKwkJY29tbWFuZFtjb21tYW5kX2xlbisrXSA9ICdcbic7CisJCWNvbW1hbmRbY29tbWFuZF9sZW5dID0gJ1wwJzsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UQUJfQ09NUExFVElPTgorCWZyZWVfdGFiX2NvbXBsZXRpb25fZGF0YSgpOworI2VuZGlmCisKKwkvKiByZXN0b3JlIGluaXRpYWxfc2V0dGluZ3MgKi8KKwl0Y3NldGF0dHJfc3RkaW5fVENTQU5PVygmaW5pdGlhbF9zZXR0aW5ncyk7CisJLyogcmVzdG9yZSBTSUdXSU5DSCBoYW5kbGVyICovCisJc2lnbmFsKFNJR1dJTkNILCBwcmV2aW91c19TSUdXSU5DSF9oYW5kbGVyKTsKKwlmZmx1c2hfYWxsKCk7CisKKwlsZW4gPSBjb21tYW5kX2xlbjsKKwlERUlOSVRfUygpOworCisJcmV0dXJuIGxlbjsgLyogY2FuJ3QgcmV0dXJuIGNvbW1hbmRfbGVuLCBERUlOSVRfUygpIGRlc3Ryb3lzIGl0ICovCit9CisKKyNlbHNlICAvKiAhRkVBVFVSRV9FRElUSU5HICovCisKKyN1bmRlZiByZWFkX2xpbmVfaW5wdXQKK2ludCBGQVNUX0ZVTkMgcmVhZF9saW5lX2lucHV0KGNvbnN0IGNoYXIqIHByb21wdCwgY2hhciogY29tbWFuZCwgaW50IG1heHNpemUpCit7CisJZnB1dHMocHJvbXB0LCBzdGRvdXQpOworCWZmbHVzaF9hbGwoKTsKKwlpZiAoIWZnZXRzKGNvbW1hbmQsIG1heHNpemUsIHN0ZGluKSkKKwkJcmV0dXJuIC0xOworCXJldHVybiBzdHJsZW4oY29tbWFuZCk7Cit9CisKKyNlbmRpZiAgLyogIUZFQVRVUkVfRURJVElORyAqLworCisKKy8qCisgKiBUZXN0aW5nCisgKi8KKworI2lmZGVmIFRFU1QKKworI2luY2x1ZGUgPGxvY2FsZS5oPgorCitjb25zdCBjaGFyICphcHBsZXRfbmFtZSA9ICJkZWJ1ZyBzdHVmZiB1c2FnZSI7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyIGJ1ZmZbTUFYX0xJTkVMRU5dOworCWNoYXIgKnByb21wdCA9CisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQKKwkJIlxcW1xcMDMzWzMyOzFtXFxdXFx1QFxcW1xceDFiWzMzOzFtXFxdXFxoOiIKKwkJIlxcW1xcMDMzWzM0OzFtXFxdXFx3XFxbXFwwMzNbMzU7MW1cXF0gIgorCQkiXFwhXFxbXFxlWzM2OzFtXFxdXFwkIFxcW1xcRVswbVxcXSI7CisjZWxzZQorCQkiJSAiOworI2VuZGlmCisKKwl3aGlsZSAoMSkgeworCQlpbnQgbDsKKwkJbCA9IHJlYWRfbGluZV9pbnB1dChwcm9tcHQsIGJ1ZmYpOworCQlpZiAobCA8PSAwIHx8IGJ1ZmZbbC0xXSAhPSAnXG4nKQorCQkJYnJlYWs7CisJCWJ1ZmZbbC0xXSA9ICdcMCc7CisJCXByaW50ZigiKioqIHJlYWRfbGluZV9pbnB1dCgpIHJldHVybmVkIGxpbmUgPSVzPVxuIiwgYnVmZik7CisJfQorCXByaW50ZigiKioqIHJlYWRfbGluZV9pbnB1dCgpIGRldGVjdCBeRFxuIik7CisJcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLyogVEVTVCAqLwpkaWZmIC0tZ2l0IGEvbGliYmIvbGluZWVkaXRfcHRyX2hhY2suYyBiL2xpYmJiL2xpbmVlZGl0X3B0cl9oYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM0NTg1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2xpbmVlZGl0X3B0cl9oYWNrLmMKQEAgLTAsMCArMSwyMyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCitzdHJ1Y3QgbGluZWVkaXRfc3RhdGljczsKKworI2lmbmRlZiBHQ0NfQ09NQklORQorCisvKiBXZSBjaGVhdCBoZXJlLiBJdCBpcyBkZWNsYXJlZCBhcyBjb25zdCBwdHIgaW4gbGliYmIuaCwKKyAqIGJ1dCBoZXJlIHdlIG1ha2UgaXQgbGl2ZSBpbiBSL1cgbWVtb3J5ICovCitzdHJ1Y3QgbGluZWVkaXRfc3RhdGljcyAqbGluZWVkaXRfcHRyX3RvX3N0YXRpY3M7CisKKyNlbHNlCisKKy8qIGdjYyAtY29tYmluZSB3aWxsIHNlZSB0aHJvdWdoIGFuZCBjb21wbGFpbiAqLworLyogVXNpbmcgYWx0ZXJuYXRpdmUgbWV0aG9kIHdoaWNoIGlzIG1vcmUgbGlrZWx5IHRvIGJyZWFrCisgKiBvbiB3ZWlyZCBhcmNoaXRlY3R1cmVzLCBjb21waWxlcnMsIGxpbmtlcnMgYW5kIHNvIG9uICovCitzdHJ1Y3QgbGluZWVkaXRfc3RhdGljcyAqY29uc3QgbGluZWVkaXRfcHRyX3RvX3N0YXRpY3MgX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24gKCIuZGF0YSIpKSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYmIvbGxpc3QuYyBiL2xpYmJiL2xsaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMyZTlmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2xsaXN0LmMKQEAgLTAsMCArMSw5OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbGlua2VkIGxpc3QgaGVscGVyIGZ1bmN0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgR2xlbm4gTWNHcmF0aAorICogQ29weXJpZ2h0IChDKSAyMDA1IFZsYWRpbWlyIE9sZXluaWsKKyAqIENvcHlyaWdodCAoQykgMjAwNSBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqIENvcHlyaWdodCAoQykgMjAwNiBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIEFkZCBkYXRhIHRvIHRoZSBzdGFydCBvZiB0aGUgbGlua2VkIGxpc3QuICAqLwordm9pZCBGQVNUX0ZVTkMgbGxpc3RfYWRkX3RvKGxsaXN0X3QgKipvbGRfaGVhZCwgdm9pZCAqZGF0YSkKK3sKKwlsbGlzdF90ICpuZXdfaGVhZCA9IHhtYWxsb2Moc2l6ZW9mKGxsaXN0X3QpKTsKKworCW5ld19oZWFkLT5kYXRhID0gZGF0YTsKKwluZXdfaGVhZC0+bGluayA9ICpvbGRfaGVhZDsKKwkqb2xkX2hlYWQgPSBuZXdfaGVhZDsKK30KKworLyogQWRkIGRhdGEgdG8gdGhlIGVuZCBvZiB0aGUgbGlua2VkIGxpc3QuICAqLwordm9pZCBGQVNUX0ZVTkMgbGxpc3RfYWRkX3RvX2VuZChsbGlzdF90ICoqbGlzdF9oZWFkLCB2b2lkICpkYXRhKQoreworCXdoaWxlICgqbGlzdF9oZWFkKQorCQlsaXN0X2hlYWQgPSAmKCpsaXN0X2hlYWQpLT5saW5rOworCSpsaXN0X2hlYWQgPSB4emFsbG9jKHNpemVvZihsbGlzdF90KSk7CisJKCpsaXN0X2hlYWQpLT5kYXRhID0gZGF0YTsKKwkvKigqbGlzdF9oZWFkKS0+bGluayA9IE5VTEw7Ki8KK30KKworLyogUmVtb3ZlIGZpcnN0IGVsZW1lbnQgZnJvbSB0aGUgbGlzdCBhbmQgcmV0dXJuIGl0ICovCit2b2lkKiBGQVNUX0ZVTkMgbGxpc3RfcG9wKGxsaXN0X3QgKipoZWFkKQoreworCXZvaWQgKmRhdGEgPSBOVUxMOworCWxsaXN0X3QgKnRlbXAgPSAqaGVhZDsKKworCWlmICh0ZW1wKSB7CisJCWRhdGEgPSB0ZW1wLT5kYXRhOworCQkqaGVhZCA9IHRlbXAtPmxpbms7CisJCWZyZWUodGVtcCk7CisJfQorCXJldHVybiBkYXRhOworfQorCisvKiBVbmxpbmsgYXJiaXRyYXJ5IGdpdmVuIGVsZW1lbnQgZnJvbSB0aGUgbGlzdCAqLwordm9pZCBGQVNUX0ZVTkMgbGxpc3RfdW5saW5rKGxsaXN0X3QgKipoZWFkLCBsbGlzdF90ICplbG0pCit7CisJaWYgKCFlbG0pCisJCXJldHVybjsKKwl3aGlsZSAoKmhlYWQpIHsKKwkJaWYgKCpoZWFkID09IGVsbSkgeworCQkJKmhlYWQgPSAoKmhlYWQpLT5saW5rOworCQkJYnJlYWs7CisJCX0KKwkJaGVhZCA9ICYoKmhlYWQpLT5saW5rOworCX0KK30KKworLyogUmVjdXJzaXZlbHkgZnJlZSBhbGwgZWxlbWVudHMgaW4gdGhlIGxpbmtlZCBsaXN0LiAgSWYgZnJlZWl0ICE9IE5VTEwKKyAqIGNhbGwgaXQgb24gZWFjaCBkYXR1bSBpbiB0aGUgbGlzdCAqLwordm9pZCBGQVNUX0ZVTkMgbGxpc3RfZnJlZShsbGlzdF90ICplbG0sIHZvaWQgKCpmcmVlaXQpKHZvaWQgKmRhdGEpKQoreworCXdoaWxlIChlbG0pIHsKKwkJdm9pZCAqZGF0YSA9IGxsaXN0X3BvcCgmZWxtKTsKKworCQlpZiAoZnJlZWl0KQorCQkJZnJlZWl0KGRhdGEpOworCX0KK30KKworLyogUmV2ZXJzZSBsaXN0IG9yZGVyLiAqLworbGxpc3RfdCogRkFTVF9GVU5DIGxsaXN0X3JldihsbGlzdF90ICpsaXN0KQoreworCWxsaXN0X3QgKnJldiA9IE5VTEw7CisKKwl3aGlsZSAobGlzdCkgeworCQlsbGlzdF90ICpuZXh0ID0gbGlzdC0+bGluazsKKworCQlsaXN0LT5saW5rID0gcmV2OworCQlyZXYgPSBsaXN0OworCQlsaXN0ID0gbmV4dDsKKwl9CisJcmV0dXJuIHJldjsKK30KKworbGxpc3RfdCogRkFTVF9GVU5DIGxsaXN0X2ZpbmRfc3RyKGxsaXN0X3QgKmxpc3QsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwl3aGlsZSAobGlzdCkgeworCQlpZiAoc3RyY21wKGxpc3QtPmRhdGEsIHN0cikgPT0gMCkKKwkJCWJyZWFrOworCQlsaXN0ID0gbGlzdC0+bGluazsKKwl9CisJcmV0dXJuIGxpc3Q7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9sb2dlbnYuYyBiL2xpYmJiL2xvZ2Vudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2YzYwYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9sb2dlbnYuYwpAQCAtMCwwICsxLDI0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBieSBGdWdybyBJbnRlcnNpdGUgQi5WLiA8bS5zdGFtQGZ1Z3JvLm5sPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCit2b2lkIEZBU1RfRlVOQyBiYl9sb2dlbnZfb3ZlcnJpZGUodm9pZCkKK3sKKwljb25zdCBjaGFyKiBtb2RlID0gZ2V0ZW52KCJMT0dHSU5HIik7CisKKwlpZiAoIW1vZGUpCisJCXJldHVybjsKKworCWlmIChzdHJjbXAobW9kZSwgIm5vbmUiKSA9PSAwKQorCQlsb2dtb2RlID0gTE9HTU9ERV9OT05FOworI2lmIEVOQUJMRV9GRUFUVVJFX1NZU0xPRworCWVsc2UgaWYgKHN0cmNtcChtb2RlLCAic3lzbG9nIikgPT0gMCkKKwkJbG9nbW9kZSA9IExPR01PREVfU1lTTE9HOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9saWJiYi9sb2dpbi5jIGIvbGliYmIvbG9naW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjA4MGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvbG9naW4uYwpAQCAtMCwwICsxLDEzMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaXNzdWUuYzogaXNzdWUgcHJpbnRpbmcgY29kZQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBCYXN0aWFuIEJsYW5rIDx3YWxkaUB0dXhib3gub3JnPgorICoKKyAqIE9wdGltaXplIGFuZCBjb3JyZWN0aW5nIE9DUk5MIGJ5IFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorLyogQWZ0ZXIgbGliYmIuaCwgc2luY2UgaXQgbmVlZHMgc3lzL3R5cGVzLmggb24gc29tZSBzeXN0ZW1zICovCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKworI2RlZmluZSBMT0dJTiAiIGxvZ2luOiAiCisKK3N0YXRpYyBjb25zdCBjaGFyIGZtdHN0cl9kW10gQUxJR04xID0gIiVBLCAlZCAlQiAlWSI7CisKK3ZvaWQgRkFTVF9GVU5DIHByaW50X2xvZ2luX2lzc3VlKGNvbnN0IGNoYXIgKmlzc3VlX2ZpbGUsIGNvbnN0IGNoYXIgKnR0eSkKK3sKKwlGSUxFICpmcDsKKwlpbnQgYzsKKwljaGFyIGJ1ZlsyNTYrMV07CisJY29uc3QgY2hhciAqb3V0YnVmOworCXRpbWVfdCB0OworCXN0cnVjdCB1dHNuYW1lIHV0czsKKworCXRpbWUoJnQpOworCXVuYW1lKCZ1dHMpOworCisJcHV0cygiXHIiKTsgIC8qIHN0YXJ0IGEgbmV3IGxpbmUgKi8KKworCWZwID0gZm9wZW5fZm9yX3JlYWQoaXNzdWVfZmlsZSk7CisJaWYgKCFmcCkKKwkJcmV0dXJuOworCXdoaWxlICgoYyA9IGZnZXRjKGZwKSkgIT0gRU9GKSB7CisJCW91dGJ1ZiA9IGJ1ZjsKKwkJYnVmWzBdID0gYzsKKwkJYnVmWzFdID0gJ1wwJzsKKwkJaWYgKGMgPT0gJ1xuJykgeworCQkJYnVmWzFdID0gJ1xyJzsKKwkJCWJ1ZlsyXSA9ICdcMCc7CisJCX0KKwkJaWYgKGMgPT0gJ1xcJyB8fCBjID09ICclJykgeworCQkJYyA9IGZnZXRjKGZwKTsKKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSAncyc6CisJCQkJb3V0YnVmID0gdXRzLnN5c25hbWU7CisJCQkJYnJlYWs7CisJCQljYXNlICduJzoKKwkJCWNhc2UgJ2gnOgorCQkJCW91dGJ1ZiA9IHV0cy5ub2RlbmFtZTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3InOgorCQkJCW91dGJ1ZiA9IHV0cy5yZWxlYXNlOworCQkJCWJyZWFrOworCQkJY2FzZSAndic6CisJCQkJb3V0YnVmID0gdXRzLnZlcnNpb247CisJCQkJYnJlYWs7CisJCQljYXNlICdtJzoKKwkJCQlvdXRidWYgPSB1dHMubWFjaGluZTsKKwkJCQlicmVhazsKKy8qIFRoZSBmaWVsZCBkb21haW5uYW1lIG9mIHN0cnVjdCB1dHNuYW1lIGlzIExpbnV4IHNwZWNpZmljLiAqLworI2lmIGRlZmluZWQoX19saW51eF9fKQorCQkJY2FzZSAnRCc6CisJCQljYXNlICdvJzoKKwkJCQlvdXRidWYgPSB1dHMuZG9tYWlubmFtZTsKKwkJCQlicmVhazsKKyNlbmRpZgorCQkJY2FzZSAnZCc6CisJCQkJc3RyZnRpbWUoYnVmLCBzaXplb2YoYnVmKSwgZm10c3RyX2QsIGxvY2FsdGltZSgmdCkpOworCQkJCWJyZWFrOworCQkJY2FzZSAndCc6CisJCQkJc3RyZnRpbWVfSEhNTVNTKGJ1Ziwgc2l6ZW9mKGJ1ZiksICZ0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2wnOgorCQkJCW91dGJ1ZiA9IHR0eTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnVmWzBdID0gYzsKKwkJCX0KKwkJfQorCQlmcHV0cyhvdXRidWYsIHN0ZG91dCk7CisJfQorCWZjbG9zZShmcCk7CisJZmZsdXNoX2FsbCgpOworfQorCit2b2lkIEZBU1RfRlVOQyBwcmludF9sb2dpbl9wcm9tcHQodm9pZCkKK3sKKwljaGFyICpob3N0bmFtZSA9IHNhZmVfZ2V0aG9zdG5hbWUoKTsKKworCWZwdXRzKGhvc3RuYW1lLCBzdGRvdXQpOworCWZwdXRzKExPR0lOLCBzdGRvdXQpOworCWZmbHVzaF9hbGwoKTsKKwlmcmVlKGhvc3RuYW1lKTsKK30KKworLyogQ2xlYXIgZGFuZ2Vyb3VzIHN0dWZmLCBzZXQgUEFUSCAqLworc3RhdGljIGNvbnN0IGNoYXIgZm9yYmlkW10gQUxJR04xID0KKwkiRU5WIiAiXDAiCisJIkJBU0hfRU5WIiAiXDAiCisJIkhPTUUiICJcMCIKKwkiSUZTIiAiXDAiCisJIlNIRUxMIiAiXDAiCisJIkxEX0xJQlJBUllfUEFUSCIgIlwwIgorCSJMRF9QUkVMT0FEIiAiXDAiCisJIkxEX1RSQUNFX0xPQURFRF9PQkpFQ1RTIiAiXDAiCisJIkxEX0JJTkRfTk9XIiAiXDAiCisJIkxEX0FPVVRfTElCUkFSWV9QQVRIIiAiXDAiCisJIkxEX0FPVVRfUFJFTE9BRCIgIlwwIgorCSJMRF9OT1dBUk4iICJcMCIKKwkiTERfS0VFUERJUiIgIlwwIjsKKworaW50IEZBU1RfRlVOQyBzYW5pdGl6ZV9lbnZfaWZfc3VpZCh2b2lkKQoreworCWNvbnN0IGNoYXIgKnA7CisKKwlpZiAoZ2V0dWlkKCkgPT0gZ2V0ZXVpZCgpKQorCQlyZXR1cm4gMDsKKworCXAgPSBmb3JiaWQ7CisJZG8geworCQl1bnNldGVudihwKTsKKwkJcCArPSBzdHJsZW4ocCkgKyAxOworCX0gd2hpbGUgKCpwKTsKKwlwdXRlbnYoKGNoYXIqKWJiX1BBVEhfcm9vdF9wYXRoKTsKKworCXJldHVybiAxOyAvKiB3ZSBpbmRlZWQgd2VyZSBydW4gYnkgZGlmZmVyZW50IHVzZXIhICovCit9CmRpZmYgLS1naXQgYS9saWJiYi9sb29wLmMgYi9saWJiYi9sb29wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwYjM3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL2xvb3AuYwpAQCAtMCwwICsxLDE3MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgYnkgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxsaW51eC92ZXJzaW9uLmg+CisKKyNpZiBMSU5VWF9WRVJTSU9OX0NPREUgPj0gS0VSTkVMX1ZFUlNJT04oMiw2LDApCisKKy8qIEZvciAyLjYsIHVzZSB0aGUgY2xlYW5lZCB1cCBoZWFkZXIgdG8gZ2V0IHRoZSA2NCBiaXQgQVBJLiAqLworLy8gQ29tbWVudGVkIG91dCBwZXIgUm9iJ3MgcmVxdWVzdAorLy8jIGluY2x1ZGUgImZpeF91MzIuaCIgLyogc29tZSBvbGQgdG9vbGNoYWlucyBuZWVkIF9fdTY0IGZvciBsaW51eC9sb29wLmggKi8KKyMgaW5jbHVkZSA8bGludXgvbG9vcC5oPgordHlwZWRlZiBzdHJ1Y3QgbG9vcF9pbmZvNjQgYmJfbG9vcF9pbmZvOworIyBkZWZpbmUgQkJfTE9PUF9TRVRfU1RBVFVTIExPT1BfU0VUX1NUQVRVUzY0CisjIGRlZmluZSBCQl9MT09QX0dFVF9TVEFUVVMgTE9PUF9HRVRfU1RBVFVTNjQKKworI2Vsc2UKKworLyogRm9yIDIuNCBhbmQgZWFybGllciwgdXNlIHRoZSAzMiBiaXQgQVBJIChhbmQgZG9uJ3QgdHJ1c3QgdGhlIGhlYWRlcnMpICovCisvKiBTdHVmZiBzdG9sZW4gZnJvbSBsaW51eC9sb29wLmggZm9yIDIuNCBhbmQgZWFybGllciBrZXJuZWxzICovCisjIGluY2x1ZGUgPGxpbnV4L3Bvc2l4X3R5cGVzLmg+CisjIGRlZmluZSBMT19OQU1FX1NJWkUgICAgICAgIDY0CisjIGRlZmluZSBMT19LRVlfU0laRSAgICAgICAgIDMyCisjIGRlZmluZSBMT09QX1NFVF9GRCAgICAgICAgIDB4NEMwMAorIyBkZWZpbmUgTE9PUF9DTFJfRkQgICAgICAgICAweDRDMDEKKyMgZGVmaW5lIEJCX0xPT1BfU0VUX1NUQVRVUyAgMHg0QzAyCisjIGRlZmluZSBCQl9MT09QX0dFVF9TVEFUVVMgIDB4NEMwMwordHlwZWRlZiBzdHJ1Y3QgeworCWludCAgICAgICAgICAgICAgICBsb19udW1iZXI7CisJX19rZXJuZWxfZGV2X3QgICAgIGxvX2RldmljZTsKKwl1bnNpZ25lZCBsb25nICAgICAgbG9faW5vZGU7CisJX19rZXJuZWxfZGV2X3QgICAgIGxvX3JkZXZpY2U7CisJaW50ICAgICAgICAgICAgICAgIGxvX29mZnNldDsKKwlpbnQgICAgICAgICAgICAgICAgbG9fZW5jcnlwdF90eXBlOworCWludCAgICAgICAgICAgICAgICBsb19lbmNyeXB0X2tleV9zaXplOworCWludCAgICAgICAgICAgICAgICBsb19mbGFnczsKKwljaGFyICAgICAgICAgICAgICAgbG9fZmlsZV9uYW1lW0xPX05BTUVfU0laRV07CisJdW5zaWduZWQgY2hhciAgICAgIGxvX2VuY3J5cHRfa2V5W0xPX0tFWV9TSVpFXTsKKwl1bnNpZ25lZCBsb25nICAgICAgbG9faW5pdFsyXTsKKwljaGFyICAgICAgICAgICAgICAgcmVzZXJ2ZWRbNF07Cit9IGJiX2xvb3BfaW5mbzsKKyNlbmRpZgorCitjaGFyKiBGQVNUX0ZVTkMgcXVlcnlfbG9vcChjb25zdCBjaGFyICpkZXZpY2UpCit7CisJaW50IGZkOworCWJiX2xvb3BfaW5mbyBsb29waW5mbzsKKwljaGFyICpkZXYgPSBOVUxMOworCisJZmQgPSBvcGVuKGRldmljZSwgT19SRE9OTFkpOworCWlmIChmZCA+PSAwKSB7CisJCWlmIChpb2N0bChmZCwgQkJfTE9PUF9HRVRfU1RBVFVTLCAmbG9vcGluZm8pID09IDApIHsKKwkJCWRldiA9IHhhc3ByaW50ZigiJSJPRkZfRk1UInUgJXMiLCAob2ZmX3QpIGxvb3BpbmZvLmxvX29mZnNldCwKKwkJCQkJKGNoYXIgKilsb29waW5mby5sb19maWxlX25hbWUpOworCQl9CisJCWNsb3NlKGZkKTsKKwl9CisKKwlyZXR1cm4gZGV2OworfQorCitpbnQgRkFTVF9GVU5DIGRlbF9sb29wKGNvbnN0IGNoYXIgKmRldmljZSkKK3sKKwlpbnQgZmQsIHJjOworCisJZmQgPSBvcGVuKGRldmljZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApCisJCXJldHVybiAxOworCXJjID0gaW9jdGwoZmQsIExPT1BfQ0xSX0ZELCAwKTsKKwljbG9zZShmZCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFJldHVybnMgMCBpZiBtb3VudGVkIFJXLCAxIGlmIG1vdW50ZWQgcmVhZC1vbmx5LCA8MCBmb3IgZXJyb3IuCisgICAqZGV2aWNlIGlzIGxvb3AgZGV2aWNlIHRvIHVzZSwgb3IgaWYgKmRldmljZT09TlVMTCBmaW5kcyBhIGxvb3AgZGV2aWNlIHRvCisgICBtb3VudCBpdCBvbiBhbmQgc2V0cyAqZGV2aWNlIHRvIGEgc3RyZHVwIG9mIHRoYXQgbG9vcCBkZXZpY2UgbmFtZS4gIFRoaXMKKyAgIHNlYXJjaCB3aWxsIHJlLXVzZSBhbiBleGlzdGluZyBsb29wIGRldmljZSBhbHJlYWR5IGJvdW5kIHRvIHRoYXQKKyAgIGZpbGUvb2Zmc2V0IGlmIGl0IGZpbmRzIG9uZS4KKyAqLworaW50IEZBU1RfRlVOQyBzZXRfbG9vcChjaGFyICoqZGV2aWNlLCBjb25zdCBjaGFyICpmaWxlLCB1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0LCBpbnQgcm8pCit7CisJY2hhciBkZXZbTE9PUF9OQU1FU0laRV07CisJY2hhciAqdHJ5OworCWJiX2xvb3BfaW5mbyBsb29waW5mbzsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCWludCBpLCBkZmQsIGZmZCwgbW9kZSwgcmMgPSAtMTsKKworCS8qIE9wZW4gdGhlIGZpbGUuICBCYXJmIGlmIHRoaXMgZG9lc24ndCB3b3JrLiAgKi8KKwltb2RlID0gcm8gPyBPX1JET05MWSA6IE9fUkRXUjsKKyBvcGVuX2ZmZDoKKwlmZmQgPSBvcGVuKGZpbGUsIG1vZGUpOworCWlmIChmZmQgPCAwKSB7CisJCWlmIChtb2RlICE9IE9fUkRPTkxZKSB7CisJCQltb2RlID0gT19SRE9OTFk7CisJCQlnb3RvIG9wZW5fZmZkOworCQl9CisJCXJldHVybiAtZXJybm87CisJfQorCisJLyogRmluZCBhIGxvb3AgZGV2aWNlLiAgKi8KKwl0cnkgPSAqZGV2aWNlID8gKmRldmljZSA6IGRldjsKKwkvKiAxMDQ4NTc1ICgweGZmZmZmKSBpcyBhIG1heCBwb3NzaWJsZSBtaW5vciBudW1iZXIgaW4gTGludXggY2lyY2EgMjAxMCAqLworCWZvciAoaSA9IDA7IHJjICYmIGkgPCAxMDQ4NTc2OyBpKyspIHsKKwkJc3ByaW50ZihkZXYsIExPT1BfRk9STUFULCBpKTsKKworCQlJRl9GRUFUVVJFX01PVU5UX0xPT1BfQ1JFQVRFKGVycm5vID0gMDspCisJCWlmIChzdGF0KHRyeSwgJnN0YXRidWYpICE9IDAgfHwgIVNfSVNCTEsoc3RhdGJ1Zi5zdF9tb2RlKSkgeworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX01PVU5UX0xPT1BfQ1JFQVRFCisJCQkgJiYgZXJybm8gPT0gRU5PRU5UCisJCQkgJiYgdHJ5ID09IGRldgorCQkJKSB7CisJCQkJLyogTm9kZSBkb2Vzbid0IGV4aXN0LCB0cnkgdG8gY3JlYXRlIGl0LiAgKi8KKwkJCQlpZiAobWtub2QoZGV2LCBTX0lGQkxLfDA2NDQsIG1ha2VkZXYoNywgaSkpID09IDApCisJCQkJCWdvdG8gdHJ5X3RvX29wZW47CisJCQl9CisJCQkvKiBSYW4gb3V0IG9mIGJsb2NrIGRldmljZXMsIHJldHVybiBmYWlsdXJlLiAgKi8KKwkJCXJjID0gLTE7CisJCQlicmVhazsKKwkJfQorIHRyeV90b19vcGVuOgorCQkvKiBPcGVuIHRoZSBzdWNrZXIgYW5kIGNoZWNrIGl0cyBsb29waW5lc3MuICAqLworCQlkZmQgPSBvcGVuKHRyeSwgbW9kZSk7CisJCWlmIChkZmQgPCAwICYmIGVycm5vID09IEVST0ZTKSB7CisJCQltb2RlID0gT19SRE9OTFk7CisJCQlkZmQgPSBvcGVuKHRyeSwgbW9kZSk7CisJCX0KKwkJaWYgKGRmZCA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFTlhJTykgeworCQkJCS8qIEhhcHBlbnMgaWYgbG9vcCBtb2R1bGUgaXMgbm90IGxvYWRlZCAqLworCQkJCXJjID0gLTE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlnb3RvIHRyeV9hZ2FpbjsKKwkJfQorCisJCXJjID0gaW9jdGwoZGZkLCBCQl9MT09QX0dFVF9TVEFUVVMsICZsb29waW5mbyk7CisKKwkJLyogSWYgZGV2aWNlIGlzIGZyZWUsIGNsYWltIGl0LiAgKi8KKwkJaWYgKHJjICYmIGVycm5vID09IEVOWElPKSB7CisJCQltZW1zZXQoJmxvb3BpbmZvLCAwLCBzaXplb2YobG9vcGluZm8pKTsKKwkJCXNhZmVfc3RybmNweSgoY2hhciAqKWxvb3BpbmZvLmxvX2ZpbGVfbmFtZSwgZmlsZSwgTE9fTkFNRV9TSVpFKTsKKwkJCWxvb3BpbmZvLmxvX29mZnNldCA9IG9mZnNldDsKKwkJCS8qIEFzc29jaWF0ZSBmcmVlIGxvb3AgZGV2aWNlIHdpdGggZmlsZS4gICovCisJCQlpZiAoaW9jdGwoZGZkLCBMT09QX1NFVF9GRCwgZmZkKSA9PSAwKSB7CisJCQkJaWYgKGlvY3RsKGRmZCwgQkJfTE9PUF9TRVRfU1RBVFVTLCAmbG9vcGluZm8pID09IDApCisJCQkJCXJjID0gMDsKKwkJCQllbHNlCisJCQkJCWlvY3RsKGRmZCwgTE9PUF9DTFJfRkQsIDApOworCQkJfQorCQl9IGVsc2UgeworCQkJcmMgPSAtMTsKKwkJfQorCQljbG9zZShkZmQpOworIHRyeV9hZ2FpbjoKKwkJaWYgKCpkZXZpY2UpIGJyZWFrOworCX0KKwljbG9zZShmZmQpOworCWlmIChyYyA9PSAwKSB7CisJCWlmICghKmRldmljZSkKKwkJCSpkZXZpY2UgPSB4c3RyZHVwKGRldik7CisJCXJldHVybiAobW9kZSA9PSBPX1JET05MWSk7IC8qIDE6cm8sIDA6cncgKi8KKwl9CisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvbWFrZV9kaXJlY3RvcnkuYyBiL2xpYmJiL21ha2VfZGlyZWN0b3J5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkzNTJjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL21ha2VfZGlyZWN0b3J5LmMKQEAgLTAsMCArMSwxMzggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHBhcnNlX21vZGUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIE1hciA1LCAyMDAzICAgIE1hbnVlbCBOb3ZvYSBJSUkKKyAqCisgKiBUaGlzIGlzIHRoZSBtYWluIHdvcmsgZnVuY3Rpb24gZm9yIHRoZSAnbWtkaXInIGFwcGxldC4gIEFzIHN1Y2gsIGl0CisgKiBzdHJpdmVzIHRvIGJlIFNVU3YzIGNvbXBsaWFudCBpbiBpdCdzIGJlaGF2aW91ciB3aGVuIHJlY3Vyc2l2ZWx5CisgKiBtYWtpbmcgbWlzc2luZyBwYXJlbnQgZGlycywgYW5kIGluIGl0J3MgbW9kZSBzZXR0aW5nIG9mIHRoZSBmaW5hbAorICogZGlyZWN0b3J5ICdwYXRoJy4KKyAqCisgKiBUbyByZWN1cnNpdmVseSBidWlsZCBhbGwgbWlzc2luZyBpbnRlcm1lZGlhdGUgZGlyZWN0b3JpZXMsIG1ha2UKKyAqIHN1cmUgdGhhdCAoZmxhZ3MgJiBGSUxFVVRJTFNfUkVDVVIpIGlzIG5vbi16ZXJvLiAgTmV3bHkgY3JlYXRlZAorICogaW50ZXJtZWRpYXRlIGRpcmVjdG9yaWVzIHdpbGwgaGF2ZSBhdCBsZWFzdCB1K3d4IHBlcm1zLgorICoKKyAqIFRvIHNldCBzcGVjaWZpYyBwZXJtaXNzaW9ucyBvbiAncGF0aCcsIHBhc3MgdGhlIGFwcHJvcHJpYXRlICdtb2RlJworICogdmFsLiAgT3RoZXJ3aXNlLCBwYXNzIC0xIHRvIGdldCBkZWZhdWx0IHBlcm1pc3Npb25zLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZnJvbSBOT0ZPUksgYXBwbGV0cy4gSXQgbXVzdCBub3QgYWxsb2NhdGUgYW55dGhpbmcgKi8KKworaW50IEZBU1RfRlVOQyBiYl9tYWtlX2RpcmVjdG9yeShjaGFyICpwYXRoLCBsb25nIG1vZGUsIGludCBmbGFncykKK3sKKwltb2RlX3QgY3VyX21hc2s7CisJbW9kZV90IG9yZ19tYXNrOworCWNvbnN0IGNoYXIgKmZhaWxfbXNnOworCWNoYXIgKnM7CisJY2hhciBjOworCXN0cnVjdCBzdGF0IHN0OworCisJLyogSGFwcGVucyBvbiBiYl9tYWtlX2RpcmVjdG9yeShkaXJuYW1lKCJub19zbGFzaGVzIiksLi4uKSAqLworCWlmIChMT05FX0NIQVIocGF0aCwgJy4nKSkKKwkJcmV0dXJuIDA7CisKKwlvcmdfbWFzayA9IGN1cl9tYXNrID0gKG1vZGVfdCktMUw7CisJcyA9IHBhdGg7CisJd2hpbGUgKDEpIHsKKwkJYyA9ICdcMCc7CisKKwkJaWYgKGZsYWdzICYgRklMRVVUSUxTX1JFQ1VSKSB7ICAvKiBHZXQgdGhlIHBhcmVudCAqLworCQkJLyogQnlwYXNzIGxlYWRpbmcgbm9uLScvJ3MgYW5kIHRoZW4gc3Vic2VxdWVudCAnLydzICovCisJCQl3aGlsZSAoKnMpIHsKKwkJCQlpZiAoKnMgPT0gJy8nKSB7CisJCQkJCWRvIHsKKwkJCQkJCSsrczsKKwkJCQkJfSB3aGlsZSAoKnMgPT0gJy8nKTsKKwkJCQkJYyA9ICpzOyAvKiBTYXZlIHRoZSBjdXJyZW50IGNoYXIgKi8KKwkJCQkJKnMgPSAnXDAnOyAvKiBhbmQgcmVwbGFjZSBpdCB3aXRoIG51bCAqLworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJKytzOworCQkJfQorCQl9CisKKwkJaWYgKGMgIT0gJ1wwJykgeworCQkJLyogSW50ZXJtZWRpYXRlIGRpcnM6IG11c3QgaGF2ZSB3eCBmb3IgdXNlciAqLworCQkJaWYgKGN1cl9tYXNrID09IChtb2RlX3QpLTFMKSB7IC8qIHdhc24ndCBkb25lIHlldD8gKi8KKwkJCQltb2RlX3QgbmV3X21hc2s7CisJCQkJb3JnX21hc2sgPSB1bWFzaygwKTsKKwkJCQljdXJfbWFzayA9IDA7CisJCQkJLyogQ2xlYXIgdT13eCBpbiB1bWFzayAtIHRoaXMgZW5zdXJlcworCQkJCSAqIHRoZXkgd29uJ3QgYmUgY2xlYXJlZCBvbiBta2RpciAqLworCQkJCW5ld19tYXNrID0gKG9yZ19tYXNrICYgfihtb2RlX3QpMDMwMCk7CisJCQkJLy9iYl9lcnJvcl9tc2coIm9yZ19tYXNrOiVvIGN1cl9tYXNrOiVvIiwgb3JnX21hc2ssIG5ld19tYXNrKTsKKwkJCQlpZiAobmV3X21hc2sgIT0gY3VyX21hc2spIHsKKwkJCQkJY3VyX21hc2sgPSBuZXdfbWFzazsKKwkJCQkJdW1hc2sobmV3X21hc2spOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIExhc3QgY29tcG9uZW50OiB1c2VzIG9yaWdpbmFsIHVtYXNrICovCisJCQkvL2JiX2Vycm9yX21zZygiMSBvcmdfbWFzazolbyIsIG9yZ19tYXNrKTsKKwkJCWlmIChvcmdfbWFzayAhPSBjdXJfbWFzaykgeworCQkJCWN1cl9tYXNrID0gb3JnX21hc2s7CisJCQkJdW1hc2sob3JnX21hc2spOworCQkJfQorCQl9CisKKwkJaWYgKG1rZGlyKHBhdGgsIDA3NzcpIDwgMCkgeworCQkJLyogSWYgd2UgZmFpbGVkIGZvciBhbnkgb3RoZXIgcmVhc29uIHRoYW4gdGhlIGRpcmVjdG9yeQorCQkJICogYWxyZWFkeSBleGlzdHMsIG91dHB1dCBhIGRpYWdub3N0aWMgYW5kIHJldHVybiAtMSAqLworCQkJaWYgKChlcnJubyAhPSBFRVhJU1QgJiYgZXJybm8gIT0gRUlTRElSKQorCQkJIHx8ICEoZmxhZ3MgJiBGSUxFVVRJTFNfUkVDVVIpCisJCQkgfHwgKChzdGF0KHBhdGgsICZzdCkgPCAwKSB8fCAhU19JU0RJUihzdC5zdF9tb2RlKSkKKwkJCSkgeworCQkJCWZhaWxfbXNnID0gImNyZWF0ZSI7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBTaW5jZSB0aGUgZGlyZWN0b3J5IGV4aXN0cywgZG9uJ3QgYXR0ZW1wdCB0byBjaGFuZ2UKKwkJCSAqIHBlcm1pc3Npb25zIGlmIGl0IHdhcyB0aGUgZnVsbCB0YXJnZXQuICBOb3RlIHRoYXQKKwkJCSAqIHRoaXMgaXMgbm90IGFuIGVycm9yIGNvbmRpdGlvbi4gKi8KKwkJCWlmICghYykgeworCQkJCWdvdG8gcmV0MDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChmbGFncyAmIEZJTEVVVElMU19WRVJCT1NFKSB7CisJCQkJcHJpbnRmKCJjcmVhdGVkIGRpcmVjdG9yeTogJyVzJ1xuIiwgcGF0aCk7CisJCQl9CisJCX0KKworCQlpZiAoIWMpIHsKKwkJCS8qIERvbmUuICBJZiBuZWNlc3NhcnksIHVwZGF0ZSBwZXJtcyBvbiB0aGUgbmV3bHkKKwkJCSAqIGNyZWF0ZWQgZGlyZWN0b3J5LiAgRmFpbHVyZSB0byB1cGRhdGUgaGVyZSBfaXNfCisJCQkgKiBhbiBlcnJvci4gKi8KKwkJCWlmICgobW9kZSAhPSAtMSkgJiYgKGNobW9kKHBhdGgsIG1vZGUpIDwgMCkpIHsKKwkJCQlmYWlsX21zZyA9ICJzZXQgcGVybWlzc2lvbnMgb2YiOworCQkJCWlmIChmbGFncyAmIEZJTEVVVElMU19JR05PUkVfQ0hNT0RfRVJSKSB7CisJCQkJCWZsYWdzID0gMDsKKwkJCQkJZ290byBwcmludF9lcnI7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJZ290byByZXQwOworCQl9CisKKwkJLyogUmVtb3ZlIGFueSBpbnNlcnRlZCBudWwgZnJvbSB0aGUgcGF0aCAocmVjdXJzaXZlIG1vZGUpICovCisJCSpzID0gYzsKKwl9IC8qIHdoaWxlICgxKSAqLworCisJZmxhZ3MgPSAtMTsKKyBwcmludF9lcnI6CisJYmJfcGVycm9yX21zZygiY2FuJ3QgJXMgZGlyZWN0b3J5ICclcyciLCBmYWlsX21zZywgcGF0aCk7CisJZ290byByZXQ7CisgcmV0MDoKKwlmbGFncyA9IDA7CisgcmV0OgorCS8vYmJfZXJyb3JfbXNnKCIyIG9yZ19tYXNrOiVvIiwgb3JnX21hc2spOworCWlmIChvcmdfbWFzayAhPSBjdXJfbWFzaykKKwkJdW1hc2sob3JnX21hc2spOworCXJldHVybiBmbGFnczsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL21ha2VkZXYuYyBiL2xpYmJiL21ha2VkZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmM0MDM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvbWFrZWRldi5jCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogV2UgZG8gbm90IGluY2x1ZGUgbGliYmIuaCAtICNkZWZpbmUgbWFrZWRldigpIGlzIHRoZXJlISAqLworI2luY2x1ZGUgInBsYXRmb3JtLmgiCisKKy8qIERpZmZlcmVudCBVbml4ZXMgd2FudCBkaWZmZXJlbnQgaGVhZGVycyBmb3IgbWFrZWRldiAqLworI2lmIGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykgXAorIHx8IGRlZmluZWQoX19BUFBMRV9fKQorIyBpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNlbHNlCisjIGluY2x1ZGUgPGZlYXR1cmVzLmg+CisjIGluY2x1ZGUgPHN5cy9zeXNtYWNyb3MuaD4KKyNlbmRpZgorCisjaWZkZWYgX19HTElCQ19fCisvKiBBdCBsZWFzdCBnbGliYyBoYXMgaG9ycmVuZG91c2x5IGxhcmdlIGlubGluZSBmb3IgdGhpcywgc28gd3JhcCBpdC4gKi8KKy8qIHVjbGliYyBwZW9wbGUgcGxlYXNlIGNoZWNrIC0gZG8gd2UgbmVlZCAiJiYgIV9fVUNMSUJDX18iIGFib3ZlPyAqLworCisvKiBTdXBwcmVzcyBnY2MgIm5vIHByZXZpb3VzIHByb3RvdHlwZSIgd2FybmluZyAqLwordW5zaWduZWQgbG9uZyBsb25nIEZBU1RfRlVOQyBiYl9tYWtlZGV2KHVuc2lnbmVkIG1ham9yLCB1bnNpZ25lZCBtaW5vcik7Cit1bnNpZ25lZCBsb25nIGxvbmcgRkFTVF9GVU5DIGJiX21ha2VkZXYodW5zaWduZWQgbWFqb3IsIHVuc2lnbmVkIG1pbm9yKQoreworCXJldHVybiBtYWtlZGV2KG1ham9yLCBtaW5vcik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmJiL21hdGNoX2ZzdHlwZS5jIGIvbGliYmIvbWF0Y2hfZnN0eXBlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA2NmI0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL21hdGNoX2ZzdHlwZS5jCkBAIC0wLDAgKzEsNDUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1hdGNoIGZzdHlwZXMgZm9yIHVzZSBpbiBtb3VudCB1bm1vdW50CisgKiBXZSBhY2NlcHQgbm90bXBmcyxuZnMgYnV0IG5vdCBub3RtcGZzLG5vbmZzCisgKiBUaGlzIGFsbG93cyB1cyB0byBtYXRjaCBmc3R5cGVzIHRoYXQgc3RhcnQgd2l0aCBubyBsaWtlIHNvCisgKiAgIG1vdW50IC1hdCAsbm9kZHkKKyAqCisgKiBSZXR1cm5zIDEgZm9yIGEgbWF0Y2gsIG90aGVyd2lzZSAwCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmZGVmIEhBVkVfTU5URU5UX0gKKworaW50IEZBU1RfRlVOQyBtYXRjaF9mc3R5cGUoY29uc3Qgc3RydWN0IG1udGVudCAqbXQsIGNvbnN0IGNoYXIgKnRfZnN0eXBlKQoreworCWludCBtYXRjaCA9IDE7CisKKwlpZiAoIXRfZnN0eXBlKQorCQlyZXR1cm4gbWF0Y2g7CisKKwlpZiAodF9mc3R5cGVbMF0gPT0gJ24nICYmIHRfZnN0eXBlWzFdID09ICdvJykgeworCQltYXRjaC0tOworCQl0X2ZzdHlwZSArPSAyOworCX0KKworCXdoaWxlICgxKSB7CisJCWNoYXIgKmFmdGVyX21udF90eXBlID0gaXNfcHJlZml4ZWRfd2l0aCh0X2ZzdHlwZSwgbXQtPm1udF90eXBlKTsKKwkJaWYgKGFmdGVyX21udF90eXBlCisJCSAmJiAoKmFmdGVyX21udF90eXBlID09ICdcMCcgfHwgKmFmdGVyX21udF90eXBlID09ICcsJykKKwkJKSB7CisJCQlyZXR1cm4gbWF0Y2g7CisJCX0KKwkJdF9mc3R5cGUgPSBzdHJjaHIodF9mc3R5cGUsICcsJyk7CisJCWlmICghdF9mc3R5cGUpCisJCQlicmVhazsKKwkJdF9mc3R5cGUrKzsKKwl9CisKKwlyZXR1cm4gIW1hdGNoOworfQorCisjZW5kaWYgLyogSEFWRV9NTlRFTlRfSCAqLwpkaWZmIC0tZ2l0IGEvbGliYmIvbWVzc2FnZXMuYyBiL2xpYmJiL21lc3NhZ2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFiN2JhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL21lc3NhZ2VzLmMKQEAgLTAsMCArMSw2NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIGFsbG93IGRlZmF1bHQgc3lzdGVtIFBBVEggdG8gYmUgZXh0ZW5kZWQgdmlhIENGTEFHUyAqLworI2lmbmRlZiBCQl9BRERJVElPTkFMX1BBVEgKKyNkZWZpbmUgQkJfQURESVRJT05BTF9QQVRIICIiCisjZW5kaWYKKworLyogYWxsb3cgdmVyc2lvbiB0byBiZSBleHRlbmRlZCwgdmlhIENGTEFHUyAqLworI2lmbmRlZiBCQl9FWFRSQV9WRVJTSU9OCisjZGVmaW5lIEJCX0VYVFJBX1ZFUlNJT04gQkJfQlQKKyNlbmRpZgorCisjZGVmaW5lIEJBTk5FUiAiQnVzeUJveCB2IiBCQl9WRVIgIiAoIiBCQl9FWFRSQV9WRVJTSU9OICIpIgorCitjb25zdCBjaGFyIGJiX2Jhbm5lcltdIEFMSUdOMSA9IEJBTk5FUjsKKworCitjb25zdCBjaGFyIGJiX21zZ19tZW1vcnlfZXhoYXVzdGVkW10gQUxJR04xID0gIm91dCBvZiBtZW1vcnkiOworY29uc3QgY2hhciBiYl9tc2dfaW52YWxpZF9kYXRlW10gQUxJR04xID0gImludmFsaWQgZGF0ZSAnJXMnIjsKK2NvbnN0IGNoYXIgYmJfbXNnX3Vua25vd25bXSBBTElHTjEgPSAiKHVua25vd24pIjsKK2NvbnN0IGNoYXIgYmJfbXNnX2Nhbl9ub3RfY3JlYXRlX3Jhd19zb2NrZXRbXSBBTElHTjEgPSAiY2FuJ3QgY3JlYXRlIHJhdyBzb2NrZXQiOworY29uc3QgY2hhciBiYl9tc2dfcGVybV9kZW5pZWRfYXJlX3lvdV9yb290W10gQUxJR04xID0gInBlcm1pc3Npb24gZGVuaWVkIChhcmUgeW91IHJvb3Q/KSI7Citjb25zdCBjaGFyIGJiX21zZ195b3VfbXVzdF9iZV9yb290W10gQUxJR04xID0gInlvdSBtdXN0IGJlIHJvb3QiOworY29uc3QgY2hhciBiYl9tc2dfcmVxdWlyZXNfYXJnW10gQUxJR04xID0gIiVzIHJlcXVpcmVzIGFuIGFyZ3VtZW50IjsKK2NvbnN0IGNoYXIgYmJfbXNnX2ludmFsaWRfYXJnW10gQUxJR04xID0gImludmFsaWQgYXJndW1lbnQgJyVzJyB0byAnJXMnIjsKK2NvbnN0IGNoYXIgYmJfbXNnX3N0YW5kYXJkX2lucHV0W10gQUxJR04xID0gInN0YW5kYXJkIGlucHV0IjsKK2NvbnN0IGNoYXIgYmJfbXNnX3N0YW5kYXJkX291dHB1dFtdIEFMSUdOMSA9ICJzdGFuZGFyZCBvdXRwdXQiOworCitjb25zdCBjaGFyIGJiX2hleGRpZ2l0c191cGNhc2VbXSBBTElHTjEgPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisKK2NvbnN0IGNoYXIgYmJfYnVzeWJveF9leGVjX3BhdGhbXSBBTElHTjEgPSBDT05GSUdfQlVTWUJPWF9FWEVDX1BBVEg7Citjb25zdCBjaGFyIGJiX2RlZmF1bHRfbG9naW5fc2hlbGxbXSBBTElHTjEgPSBMSUJCQl9ERUZBVUxUX0xPR0lOX1NIRUxMOworLyogdXRpbC1saW51eCBtYW5wYWdlIHNheXMgL3NiaW46L2JpbjovdXNyL3NiaW46L3Vzci9iaW4sCisgKiBidXQgSSB3YW50IHRvIHNhdmUgYSBmZXcgYnl0ZXMgaGVyZS4gQ2hlY2sgbGliYmIuaCBiZWZvcmUgY2hhbmdpbmchICovCitjb25zdCBjaGFyIGJiX1BBVEhfcm9vdF9wYXRoW10gQUxJR04xID0KKwkiUEFUSD0vc2JpbjovdXNyL3NiaW46L2JpbjovdXNyL2JpbiIgQkJfQURESVRJT05BTF9QQVRIOworCisKKy8vY29uc3QgaW50IGNvbnN0X2ludF8xID0gMTsKKy8qIGV4cGxpY2l0bHkgPSAwLCBvdGhlcndpc2UgZ2NjIG1heSBtYWtlIGl0IGEgY29tbW9uIHZhcmlhYmxlCisgKiBhbmQgaXQgd2lsbCBlbmQgdXAgaW4gYnNzICovCitjb25zdCBpbnQgY29uc3RfaW50XzAgPSAwOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfV1RNUAorLyogVGhpcyBpcyB1c3VhbGx5IHNvbWV0aGluZyBsaWtlICIvdmFyL2FkbS93dG1wIiBvciAiL3Zhci9sb2cvd3RtcCIgKi8KK2NvbnN0IGNoYXIgYmJfcGF0aF93dG1wX2ZpbGVbXSBBTElHTjEgPQorIyBpZiBkZWZpbmVkIF9QQVRIX1dUTVAKKwlfUEFUSF9XVE1QOworIyBlbGlmIGRlZmluZWQgV1RNUF9GSUxFCisJV1RNUF9GSUxFOworIyBlbHNlCisjICBlcnJvciB1bmtub3duIHBhdGggdG8gd3RtcCBmaWxlCisjIGVuZGlmCisjZW5kaWYKKworLyogV2UgdXNlIGl0IGZvciAiZ2xvYmFsIiBkYXRhIHZpYSAqKHN0cnVjdCBnbG9iYWwqKSZiYl9jb21tb25fYnVmc2l6MS4KKyAqIFNpbmNlIGdjYyBpbnNpc3RzIG9uIGFsaWduaW5nIHN0cnVjdCBnbG9iYWwncyBtZW1iZXJzLCBpdCB3b3VsZCBiZSBhIHBpdHkKKyAqIChhbmQgYW4gYWxpZ25tZW50IGZhdWx0IG9uIHNvbWUgQ1BVcykgdG8gbWVzcyBpdCB1cC4gKi8KK2NoYXIgYmJfY29tbW9uX2J1ZnNpejFbQ09NTU9OX0JVRlNJWkVdIEFMSUdORUQoc2l6ZW9mKGxvbmcgbG9uZykpOwpkaWZmIC0tZ2l0IGEvbGliYmIvbWlzc2luZ19zeXNjYWxscy5jIGIvbGliYmIvbWlzc2luZ19zeXNjYWxscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYzFlOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9taXNzaW5nX3N5c2NhbGxzLmMKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDEyLCBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9rYnVpbGQ6bGliLXkgKz0gbWlzc2luZ19zeXNjYWxscy5vCisKKy8qI2luY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+IC0gZm9yIHN0cnVjdCB0aW1leCwgYnV0IG1heSBjb2xsaWRlIHdpdGggPHRpbWUuaD4gKi8KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZiBkZWZpbmVkKEFORFJPSUQpIHx8IGRlZmluZWQoX19BTkRST0lEX18pCitwaWRfdCBnZXRzaWQocGlkX3QgcGlkKQoreworCXJldHVybiBzeXNjYWxsKF9fTlJfZ2V0c2lkLCBwaWQpOworfQorCitpbnQgc3RpbWUoY29uc3QgdGltZV90ICp0KQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCXR2LnR2X3NlYyA9ICp0OworCXR2LnR2X3VzZWMgPSAwOworCXJldHVybiBzZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKK30KKworaW50IHNldGhvc3RuYW1lKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIHN5c2NhbGwoX19OUl9zZXRob3N0bmFtZSwgbmFtZSwgbGVuKTsKK30KKworc3RydWN0IHRpbWV4OworaW50IGFkanRpbWV4KHN0cnVjdCB0aW1leCAqYnVmKQoreworCXJldHVybiBzeXNjYWxsKF9fTlJfYWRqdGltZXgsIGJ1Zik7Cit9CisKK2ludCBwaXZvdF9yb290KGNvbnN0IGNoYXIgKm5ld19yb290LCBjb25zdCBjaGFyICpwdXRfb2xkKQoreworCXJldHVybiBzeXNjYWxsKF9fTlJfcGl2b3Rfcm9vdCwgbmV3X3Jvb3QsIHB1dF9vbGQpOworfQorCitpbnQgdGNkcmFpbihpbnQgZmQpCit7CisJcmV0dXJuIGlvY3RsKGZkLCBUQ1NCUkssIDEpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJiYi9tb2RlX3N0cmluZy5jIGIvbGliYmIvbW9kZV9zdHJpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWFmZTdkCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvbW9kZV9zdHJpbmcuYwpAQCAtMCwwICsxLDEyOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbW9kZV9zdHJpbmcgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIEF1ZyAxMywgMjAwMworICogRml4IGEgYnVnIHJlcG9ydGVkIGJ5IGp1bmtpb0Bjb3gubmV0IGludm9sdmluZyB0aGUgbW9kZV9jaGFycyBpbmRleC4KKyAqLworCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmICggU19JU1VJRCAhPSAwNDAwMCApIHx8ICggU19JU0dJRCAhPSAwMjAwMCApIHx8ICggU19JU1ZUWCAhPSAwMTAwMCApIFwKKyB8fCAoIFNfSVJVU1IgIT0gMDA0MDAgKSB8fCAoIFNfSVdVU1IgIT0gMDAyMDAgKSB8fCAoIFNfSVhVU1IgIT0gMDAxMDAgKSBcCisgfHwgKCBTX0lSR1JQICE9IDAwMDQwICkgfHwgKCBTX0lXR1JQICE9IDAwMDIwICkgfHwgKCBTX0lYR1JQICE9IDAwMDEwICkgXAorIHx8ICggU19JUk9USCAhPSAwMDAwNCApIHx8ICggU19JV09USCAhPSAwMDAwMiApIHx8ICggU19JWE9USCAhPSAwMDAwMSApCisjZXJyb3IgcGVybWlzc2lvbiBiaXRmbGFnIHZhbHVlIGFzc3VtcHRpb24ocykgdmlvbGF0ZWQhCisjZW5kaWYKKworI2lmICggU19JRlNPQ0shPSAwMTQwMDAwICkgfHwgKCBTX0lGTE5LICE9IDAxMjAwMDAgKSBcCisgfHwgKCBTX0lGUkVHICE9IDAxMDAwMDAgKSB8fCAoIFNfSUZCTEsgIT0gMDA2MDAwMCApIFwKKyB8fCAoIFNfSUZESVIgIT0gMDA0MDAwMCApIHx8ICggU19JRkNIUiAhPSAwMDIwMDAwICkgXAorIHx8ICggU19JRklGTyAhPSAwMDEwMDAwICkKKyN3YXJuaW5nIG1vZGUgdHlwZSBiaXRmbGFnIHZhbHVlIGFzc3VtcHRpb24ocykgdmlvbGF0ZWQhIGZhbGxpbmcgYmFjayB0byBsYXJnZXIgdmVyc2lvbgorCisjaWYgKFNfSVJXWFUgfCBTX0lSV1hHIHwgU19JUldYTyB8IFNfSVNVSUQgfCBTX0lTR0lEIHwgU19JU1ZUWCkgPT0gMDc3NzcKKyN1bmRlZiBtb2RlX3QKKyNkZWZpbmUgbW9kZV90IHVuc2lnbmVkIHNob3J0CisjZW5kaWYKKworc3RhdGljIGNvbnN0IG1vZGVfdCBtb2RlX2ZsYWdzW10gPSB7CisJU19JUlVTUiwgU19JV1VTUiwgU19JWFVTUiwgU19JU1VJRCwKKwlTX0lSR1JQLCBTX0lXR1JQLCBTX0lYR1JQLCBTX0lTR0lELAorCVNfSVJPVEgsIFNfSVdPVEgsIFNfSVhPVEgsIFNfSVNWVFgKK307CisKKy8qIFRoZSBzdGF0aWMgY29uc3QgY2hhciBhcnJheXMgYmVsb3cgYXJlIGR1cGxpY2F0ZWQgZm9yIHRoZSB0d28gY2FzZXMKKyAqIGJlY2F1c2UgbW92aW5nIHRoZW0gYWhlYWQgb2YgdGhlIG1vZGVfZmxhZ3MgZGVjbGFyYXRpb24gY2F1c2UgYSB0ZXh0CisgKiBzaXplIGluY3JlYXNlIHdpdGggdGhlIGdjYyB2ZXJzaW9uIEknbSB1c2luZy4gKi8KKworLyogVGhlIHByZXZpb3VzIHZlcnNpb24gdXNlZCAiMHBjQ2Q/YkItP2w/cz8/PyIuICBIb3dldmVyLCB0aGUgJzAnLCAnQycsCisgKiBhbmQgJ0InIHR5cGVzIGRvbid0IGFwcGVhciB0byBiZSBhdmFpbGFibGUgb24gbGludXguICBTbyBJIHJlbW92ZWQgdGhlbS4gKi8KK3N0YXRpYyBjb25zdCBjaGFyIHR5cGVfY2hhcnNbMTZdIEFMSUdOMSA9ICI/cGM/ZD9iPy0/bD9zPz8/IjsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAwMTIzNDU2Nzg5YWJjZGVmICovCitzdGF0aWMgY29uc3QgY2hhciBtb2RlX2NoYXJzWzddIEFMSUdOMSA9ICJyd3hTVHN0IjsKKworY29uc3QgY2hhciogRkFTVF9GVU5DIGJiX21vZGVfc3RyaW5nKG1vZGVfdCBtb2RlKQoreworCXN0YXRpYyBjaGFyIGJ1ZlsxMl07CisJY2hhciAqcCA9IGJ1ZjsKKworCWludCBpLCBqLCBrOworCisJKnAgPSB0eXBlX2NoYXJzWyAobW9kZSA+PiAxMikgJiAweGYgXTsKKwlpID0gMDsKKwlkbyB7CisJCWogPSBrID0gMDsKKwkJZG8geworCQkJKisrcCA9ICctJzsKKwkJCWlmIChtb2RlICYgbW9kZV9mbGFnc1tpK2pdKSB7CisJCQkJKnAgPSBtb2RlX2NoYXJzW2pdOworCQkJCWsgPSBqOworCQkJfQorCQl9IHdoaWxlICgrK2ogPCAzKTsKKwkJaWYgKG1vZGUgJiBtb2RlX2ZsYWdzW2kral0pIHsKKwkJCSpwID0gbW9kZV9jaGFyc1szICsgKGsgJiAyKSArICgoaSY4KSA+PiAzKV07CisJCX0KKwkJaSArPSA0OworCX0gd2hpbGUgKGkgPCAxMik7CisKKwkvKiBOb3RlOiBXZSBkb24ndCBib3RoZXIgd2l0aCBudWwgdGVybWluYXRpb24gYmVjYXVzZSBic3MgaW5pdGlhbGl6YXRpb24KKwkgKiBzaG91bGQgaGF2ZSB0YWtlbiBjYXJlIG9mIHRoYXQgZm9yIHVzLiAgSWYgdGhlIHVzZXIgc2NyaWJibGVkIGluIGJ1ZgorCSAqIG1lbW9yeSwgdGhleSBkZXNlcnZlIHdoYXRldmVyIGhhcHBlbnMuICBCdXQgd2UnbGwgYXQgbGVhc3QgYXNzZXJ0LiAqLworCWFzc2VydChidWZbMTBdID09IDApOworCisJcmV0dXJuIGJ1ZjsKK30KKworI2Vsc2UKKworLyogVGhlIHByZXZpb3VzIHZlcnNpb24gdXNlZCAiMHBjQ2Q/YkItP2w/cz8/PyIuICBIb3dldmVyLCB0aGUgJzAnLCAnQycsCisgKiBhbmQgJ0InIHR5cGVzIGRvbid0IGFwcGVhciB0byBiZSBhdmFpbGFibGUgb24gbGludXguICBTbyBJIHJlbW92ZWQgdGhlbS4gKi8KK3N0YXRpYyBjb25zdCBjaGFyIHR5cGVfY2hhcnNbMTZdID0gIj9wYz9kP2I/LT9sP3M/Pz8iOworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogMDEyMzQ1Njc4OWFiY2RlZiAqLworc3RhdGljIGNvbnN0IGNoYXIgbW9kZV9jaGFyc1s3XSA9ICJyd3hTVHN0IjsKKworY29uc3QgY2hhciogRkFTVF9GVU5DIGJiX21vZGVfc3RyaW5nKG1vZGVfdCBtb2RlKQoreworCXN0YXRpYyBjaGFyIGJ1ZlsxMl07CisJY2hhciAqcCA9IGJ1ZjsKKworCWludCBpLCBqLCBrLCBtOworCisJKnAgPSB0eXBlX2NoYXJzWyAobW9kZSA+PiAxMikgJiAweGYgXTsKKwlpID0gMDsKKwltID0gMDQwMDsKKwlkbyB7CisJCWogPSBrID0gMDsKKwkJZG8geworCQkJKisrcCA9ICctJzsKKwkJCWlmIChtb2RlICYgbSkgeworCQkJCSpwID0gbW9kZV9jaGFyc1tqXTsKKwkJCQlrID0gajsKKwkJCX0KKwkJCW0gPj49IDE7CisJCX0gd2hpbGUgKCsraiA8IDMpOworCQkrK2k7CisJCWlmIChtb2RlICYgKDAxMDAwMCA+PiBpKSkgeworCQkJKnAgPSBtb2RlX2NoYXJzWzMgKyAoayAmIDIpICsgKGkgPT0gMyldOworCQl9CisJfSB3aGlsZSAoaSA8IDMpOworCisJLyogTm90ZTogV2UgZG9uJ3QgYm90aGVyIHdpdGggbnVsIHRlcm1pbmF0aW9uIGJlY2F1c2UgYnNzIGluaXRpYWxpemF0aW9uCisJICogc2hvdWxkIGhhdmUgdGFrZW4gY2FyZSBvZiB0aGF0IGZvciB1cy4gIElmIHRoZSB1c2VyIHNjcmliYmxlZCBpbiBidWYKKwkgKiBtZW1vcnksIHRoZXkgZGVzZXJ2ZSB3aGF0ZXZlciBoYXBwZW5zLiAgQnV0IHdlJ2xsIGF0IGxlYXN0IGFzc2VydC4gKi8KKwlhc3NlcnQoYnVmWzEwXSA9PSAwKTsKKworCXJldHVybiBidWY7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYmIvbXRhYi5jIGIvbGliYmIvbXRhYi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYmZmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9tdGFiLmMKQEAgLTAsMCArMSw1NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSA8bW50ZW50Lmg+CisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIEVOQUJMRV9GRUFUVVJFX01UQUJfU1VQUE9SVAordm9pZCBGQVNUX0ZVTkMgZXJhc2VfbXRhYihjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBtbnRlbnQgKmVudHJpZXM7CisJaW50IGksIGNvdW50OworCUZJTEUgKm1vdW50VGFibGU7CisJc3RydWN0IG1udGVudCAqbTsKKworCW1vdW50VGFibGUgPSBzZXRtbnRlbnQoYmJfcGF0aF9tdGFiX2ZpbGUsICJyIik7CisJLyogQnVtbWVyLiBGYWxsIGJhY2sgb24gdHJ5aW5nIHRoZSAvcHJvYyBmaWxlc3lzdGVtICovCisJaWYgKCFtb3VudFRhYmxlKSBtb3VudFRhYmxlID0gc2V0bW50ZW50KCIvcHJvYy9tb3VudHMiLCAiciIpOworCWlmICghbW91bnRUYWJsZSkgeworCQliYl9wZXJyb3JfbXNnKGJiX3BhdGhfbXRhYl9maWxlKTsKKwkJcmV0dXJuOworCX0KKworCWVudHJpZXMgPSBOVUxMOworCWNvdW50ID0gMDsKKwl3aGlsZSAoKG0gPSBnZXRtbnRlbnQobW91bnRUYWJsZSkpICE9IDApIHsKKwkJZW50cmllcyA9IHhyZWFsbG9jX3ZlY3RvcihlbnRyaWVzLCAzLCBjb3VudCk7CisJCWVudHJpZXNbY291bnRdLm1udF9mc25hbWUgPSB4c3RyZHVwKG0tPm1udF9mc25hbWUpOworCQllbnRyaWVzW2NvdW50XS5tbnRfZGlyID0geHN0cmR1cChtLT5tbnRfZGlyKTsKKwkJZW50cmllc1tjb3VudF0ubW50X3R5cGUgPSB4c3RyZHVwKG0tPm1udF90eXBlKTsKKwkJZW50cmllc1tjb3VudF0ubW50X29wdHMgPSB4c3RyZHVwKG0tPm1udF9vcHRzKTsKKwkJZW50cmllc1tjb3VudF0ubW50X2ZyZXEgPSBtLT5tbnRfZnJlcTsKKwkJZW50cmllc1tjb3VudF0ubW50X3Bhc3NubyA9IG0tPm1udF9wYXNzbm87CisJCWNvdW50Kys7CisJfQorCWVuZG1udGVudChtb3VudFRhYmxlKTsKKworLy9UT0RPOiBtYWtlIHVwZGF0ZSBhdG9taWMKKwltb3VudFRhYmxlID0gc2V0bW50ZW50KGJiX3BhdGhfbXRhYl9maWxlLCAidyIpOworCWlmIChtb3VudFRhYmxlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisJCQlpZiAoc3RyY21wKGVudHJpZXNbaV0ubW50X2ZzbmFtZSwgbmFtZSkgIT0gMAorCQkJICYmIHN0cmNtcChlbnRyaWVzW2ldLm1udF9kaXIsIG5hbWUpICE9IDApCisJCQkJYWRkbW50ZW50KG1vdW50VGFibGUsICZlbnRyaWVzW2ldKTsKKwkJfQorCQllbmRtbnRlbnQobW91bnRUYWJsZSk7CisJfSBlbHNlIGlmIChlcnJubyAhPSBFUk9GUykKKwkJYmJfcGVycm9yX21zZyhiYl9wYXRoX210YWJfZmlsZSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmJiL251a2Vfc3RyLmMgYi9saWJiYi9udWtlX3N0ci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YjgwOGIKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9udWtlX3N0ci5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2tidWlsZDpsaWIteSArPSBudWtlX3N0ci5vCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCit2b2lkIEZBU1RfRlVOQyBudWtlX3N0cihjaGFyICpzdHIpCit7CisgICAgICAgIGlmIChzdHIpIHsKKwkJd2hpbGUgKCpzdHIpCisJCQkqc3RyKysgPSAwOworCQkvKiBvcjogbWVtc2V0KHN0ciwgMCwgc3RybGVuKHN0cikpOyAtIG5vdCBhcyBzbWFsbCBhcyBhYm92ZSAqLworCX0KK30KZGlmZiAtLWdpdCBhL2xpYmJiL29ic2N1cmUuYyBiL2xpYmJiL29ic2N1cmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDE3ZDFmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvb2JzY3VyZS5jCkBAIC0wLDAgKzEsMjIyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHdlYWsgcGFzc3dvcmQgY2hlY2tlciBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaXRvIFJhZ3VzYSA8ZmFybWF0aXRvQHRpc2NhbGkuaXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKglBIGdvb2QgcGFzc3dvcmQ6CisJMSkJc2hvdWxkIGNvbnRhaW4gYXQgbGVhc3Qgc2l4IGNoYXJhY3RlcnMgKG1hbiBwYXNzd2QpOworCTIpCWVtcHR5IHBhc3N3b3JkcyBhcmUgbm90IHBlcm1pdHRlZDsKKwkzKQlzaG91bGQgY29udGFpbiBhIG1peCBvZiBmb3VyIGRpZmZlcmVudCB0eXBlcyBvZiBjaGFyYWN0ZXJzCisJCXVwcGVyIGNhc2UgbGV0dGVycywKKwkJbG93ZXIgY2FzZSBsZXR0ZXJzLAorCQludW1iZXJzLAorCQlzcGVjaWFsIGNoYXJhY3RlcnMgc3VjaCBhcyAhQCMkJV4mKiw7Ii4KKwlUaGlzIHBhc3N3b3JkIHR5cGVzIHNob3VsZCBub3QgIGJlIHBlcm1pdHRlZDoKKwlhKQlwdXJlIG51bWJlcnM6IGJpcnRoZGF0ZXMsIHNvY2lhbCBzZWN1cml0eSBudW1iZXIsIGxpY2Vuc2UgcGxhdGUsIHBob25lIG51bWJlcnM7CisJYikJd29yZHMgYW5kIGFsbCBsZXR0ZXJzIG9ubHkgcGFzc3dvcmRzICh1cHBlcmNhc2UsIGxvd2VyY2FzZSBvciBtaXhlZCkKKwkJYXMgcGFsaW5kcm9tZXMsIGNvbnNlY3V0aXZlIG9yIHJlcGV0aXRpdmUgbGV0dGVycworCQlvciBhZGphY2VudCBsZXR0ZXJzIG9uIHlvdXIga2V5Ym9hcmQ7CisJYykJdXNlcm5hbWUsIHJlYWwgbmFtZSwgY29tcGFueSBuYW1lIG9yIChlLW1haWw/KSBhZGRyZXNzCisJCWluIGFueSBmb3JtIChhcy1pcywgcmV2ZXJzZWQsIGNhcGl0YWxpemVkLCBkb3VibGVkLCBldGMuKS4KKwkJKHdlIGNhbiBjaGVjayBvbmx5IGFnYWluc3QgdXNlcm5hbWUsIGdlY29zIGFuZCBob3N0bmFtZSkKKwlkKQljb21tb24gYW5kIG9idmlvdXMgbGV0dGVyLW51bWJlciByZXBsYWNlbWVudHMKKwkJKGUuZy4gcmVwbGFjZSB0aGUgbGV0dGVyIE8gd2l0aCBudW1iZXIgMCkKKwkJc3VjaCBhcyAiTTFjcjAkMGZ0IiBvciAiUEBzc3cwcmQiIChDQVZFQVQ6IHdlIGNhbm5vdCBjaGVjayBmb3IgdGhlbQorCQl3aXRob3V0IHRoZSB1c2Ugb2YgYSBkaWN0aW9uYXJ5KS4KKworCUZvciBlYWNoIG1pc3NpbmcgdHlwZSBvZiBjaGFyYWN0ZXJzIGFuIGluY3JlYXNlIG9mIHBhc3N3b3JkIGxlbmd0aCBpcworCXJlcXVlc3RlZC4KKworCUlmIHVzZXIgaXMgcm9vdCB3ZSB3YXJuIG9ubHkuCisKKwlDQVZFQVQ6IHNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgY3J5cHQoKSB0cnVuY2F0ZXMgcGFzc3dvcmRzIHRvIDggY2hhcnMsCisJc28gdGhhdCBhYWFhYWFhYTFRJCBpcyBlcXVhbCB0byBhYWFhYWFhYSBtYWtpbmcgaXQgcG9zc2libGUgdG8gZm9vbAorCXNvbWUgb2Ygb3VyIGNoZWNrcy4gV2UgZG9uJ3QgdGVzdCBmb3IgdGhpcyBzcGVjaWFsIGNhc2UgYXMgbmV3ZXIgdmVyc2lvbnMKKwlvZiBjcnlwdCBkbyBub3QgdHJ1bmNhdGUgcGFzc3dvcmRzLgorKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3N0YXRpYyBpbnQgc3RyaW5nX2NoZWNrZXJfaGVscGVyKGNvbnN0IGNoYXIgKnAxLCBjb25zdCBjaGFyICpwMikgX19hdHRyaWJ1dGVfXyAoKF9fcHVyZV9fKSk7CisKK3N0YXRpYyBpbnQgc3RyaW5nX2NoZWNrZXJfaGVscGVyKGNvbnN0IGNoYXIgKnAxLCBjb25zdCBjaGFyICpwMikKK3sKKwkvKiBhcyBzdWItc3RyaW5nICovCisJaWYgKHN0cmNhc2VzdHIocDIsIHAxKSAhPSBOVUxMCisJLyogaW52ZXJ0IGluIGNhc2UgaGF5c3RhY2sgaXMgc2hvcnRlciB0aGFuIG5lZWRsZSAqLworCSB8fCBzdHJjYXNlc3RyKHAxLCBwMikgIT0gTlVMTAorCS8qIGFzLWlzIG9yIGNhcGl0YWxpemVkICovCisJLyogfHwgc3RyY2FzZWNtcChwMSwgcDIpID09IDAgLSAxc3Qgc3RyY2FzZXN0ciBzaG91bGQgY2F0Y2ggdGhpcyB0b28gKi8KKwkpIHsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHN0cmluZ19jaGVja2VyKGNvbnN0IGNoYXIgKnAxLCBjb25zdCBjaGFyICpwMikKK3sKKwlpbnQgc2l6ZSwgaTsKKwkvKiBjaGVjayBzdHJpbmcgKi8KKwlpbnQgcmV0ID0gc3RyaW5nX2NoZWNrZXJfaGVscGVyKHAxLCBwMik7CisJLyogbWFrZSBvdXIgb3duIGNvcHkgKi8KKwljaGFyICpwID0geHN0cmR1cChwMSk7CisKKwkvKiByZXZlcnNlIHN0cmluZyAqLworCWkgPSBzaXplID0gc3RybGVuKHAxKTsKKwl3aGlsZSAoLS1pID49IDApIHsKKwkJKnArKyA9IHAxW2ldOworCX0KKwlwIC09IHNpemU7IC8qIHJlc3RvcmUgcG9pbnRlciAqLworCisJLyogY2hlY2sgcmV2ZXJzZWQgc3RyaW5nICovCisJcmV0IHw9IHN0cmluZ19jaGVja2VyX2hlbHBlcihwLCBwMik7CisKKwkvKiBjbGVhbiB1cCAqLworCW51a2Vfc3RyKHApOworCWZyZWUocCk7CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIENBVEVHT1JJRVMgIDQKKworI2RlZmluZSBMT1dFUkNBU0UgICAxCisjZGVmaW5lIFVQUEVSQ0FTRSAgIDIKKyNkZWZpbmUgTlVNQkVSUyAgICAgNAorI2RlZmluZSBTUEVDSUFMICAgICA4CisKKyNkZWZpbmUgTEFTVF9DQVQgICAgOAorCitzdGF0aWMgY29uc3QgY2hhciAqb2JzY3VyZV9tc2coY29uc3QgY2hhciAqb2xkX3AsIGNvbnN0IGNoYXIgKm5ld19wLCBjb25zdCBzdHJ1Y3QgcGFzc3dkICpwdykKK3sKKwl1bnNpZ25lZCBsZW5ndGg7CisJdW5zaWduZWQgc2l6ZTsKKwl1bnNpZ25lZCBtaXhlZDsKKwl1bnNpZ25lZCBjOworCXVuc2lnbmVkIGk7CisJY29uc3QgY2hhciAqcDsKKwljaGFyICpob3N0bmFtZTsKKworCS8qIHNpemUgKi8KKwlpZiAoIW5ld19wIHx8IChsZW5ndGggPSBzdHJsZW4obmV3X3ApKSA8IENPTkZJR19QQVNTV09SRF9NSU5MRU4pCisJCXJldHVybiAidG9vIHNob3J0IjsKKworCS8qIG5vIHVzZXJuYW1lIGFzLWlzLCBhcyBzdWItc3RyaW5nLCByZXZlcnNlZCwgY2FwaXRhbGl6ZWQsIGRvdWJsZWQgKi8KKwlpZiAoc3RyaW5nX2NoZWNrZXIobmV3X3AsIHB3LT5wd19uYW1lKSkgeworCQlyZXR1cm4gInNpbWlsYXIgdG8gdXNlcm5hbWUiOworCX0KKyNpZm5kZWYgX19CSU9OSUNfXworCS8qIG5vIGdlY29zIGFzLWlzLCBhcyBzdWItc3RyaW5nLCByZXZlcnNlZCwgY2FwaXRhbGl6ZWQsIGRvdWJsZWQgKi8KKwlpZiAocHctPnB3X2dlY29zWzBdICYmIHN0cmluZ19jaGVja2VyKG5ld19wLCBwdy0+cHdfZ2Vjb3MpKSB7CisJCXJldHVybiAic2ltaWxhciB0byBnZWNvcyI7CisJfQorI2VuZGlmCisJLyogaG9zdG5hbWUgYXMtaXMsIGFzIHN1Yi1zdHJpbmcsIHJldmVyc2VkLCBjYXBpdGFsaXplZCwgZG91YmxlZCAqLworCWhvc3RuYW1lID0gc2FmZV9nZXRob3N0bmFtZSgpOworCWkgPSBzdHJpbmdfY2hlY2tlcihuZXdfcCwgaG9zdG5hbWUpOworCWZyZWUoaG9zdG5hbWUpOworCWlmIChpKQorCQlyZXR1cm4gInNpbWlsYXIgdG8gaG9zdG5hbWUiOworCisJLyogU2hvdWxkIC8gTXVzdCBjb250YWluIGEgbWl4IG9mOiAqLworCW1peGVkID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKwkJaWYgKGlzbG93ZXIobmV3X3BbaV0pKSB7ICAgICAgICAvKiBhLXogKi8KKwkJCW1peGVkIHw9IExPV0VSQ0FTRTsKKwkJfSBlbHNlIGlmIChpc3VwcGVyKG5ld19wW2ldKSkgeyAvKiBBLVogKi8KKwkJCW1peGVkIHw9IFVQUEVSQ0FTRTsKKwkJfSBlbHNlIGlmIChpc2RpZ2l0KG5ld19wW2ldKSkgeyAvKiAwLTkgKi8KKwkJCW1peGVkIHw9IE5VTUJFUlM7CisJCX0gZWxzZSAgeyAgICAgICAgICAgICAgICAgICAgICAgLyogc3BlY2lhbCBjaGFyYWN0ZXJzICovCisJCQltaXhlZCB8PSBTUEVDSUFMOworCQl9CisJCS8qIENvdW50IGkndGggY2hhciAqLworCQljID0gMDsKKwkJcCA9IG5ld19wOworCQl3aGlsZSAoMSkgeworCQkJcCA9IHN0cmNocihwLCBuZXdfcFtpXSk7CisJCQlpZiAocCA9PSBOVUxMKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQljKys7CisJCQlwKys7CisJCQlpZiAoISpwKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJLyogTW9yZSB0aGFuIDUwJSBzaW1pbGFyIGNoYXJhY3RlcnMgPyAqLworCQlpZiAoYyoyID49IGxlbmd0aCkgeworCQkJcmV0dXJuICJ0b28gbWFueSBzaW1pbGFyIGNoYXJhY3RlcnMiOworCQl9CisJfQorCisJc2l6ZSA9IENPTkZJR19QQVNTV09SRF9NSU5MRU4gKyAyKkNBVEVHT1JJRVM7CisJZm9yIChpID0gMTsgaSA8PSBMQVNUX0NBVDsgaSA8PD0gMSkKKwkJaWYgKG1peGVkICYgaSkKKwkJCXNpemUgLT0gMjsKKwlpZiAobGVuZ3RoIDwgc2l6ZSkKKwkJcmV0dXJuICJ0b28gd2VhayI7CisKKwlpZiAob2xkX3AgJiYgb2xkX3BbMF0pIHsKKwkJLyogY2hlY2sgdnMuIG9sZCBwYXNzd29yZCAqLworCQlpZiAoc3RyaW5nX2NoZWNrZXIobmV3X3AsIG9sZF9wKSkgeworCQkJcmV0dXJuICJzaW1pbGFyIHRvIG9sZCBwYXNzd29yZCI7CisJCX0KKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IEZBU1RfRlVOQyBvYnNjdXJlKGNvbnN0IGNoYXIgKm9sZCwgY29uc3QgY2hhciAqbmV3dmFsLCBjb25zdCBzdHJ1Y3QgcGFzc3dkICpwdykKK3sKKwljb25zdCBjaGFyICptc2c7CisKKwltc2cgPSBvYnNjdXJlX21zZyhvbGQsIG5ld3ZhbCwgcHcpOworCWlmIChtc2cpIHsKKwkJcHJpbnRmKCJCYWQgcGFzc3dvcmQ6ICVzXG4iLCBtc2cpOworCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKyNpZiBFTkFCTEVfVU5JVF9URVNUCisKKy8qIFRlc3Qgb2JzY3VyZV9tc2coKSBpbnN0ZWFkIG9mIG9ic2N1cmUoKSBpbiBvcmRlciBub3QgdG8gcHJpbnQgYW55dGhpbmcuICovCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGFzc3dkIHB3ID0geworCS5wd19uYW1lID0gKGNoYXIgKikiam9obmRvZSIsCisJLnB3X2dlY29zID0gKGNoYXIgKikiSm9obiBEb2UiLAorfTsKKworQkJVTklUX0RFRklORV9URVNUKG9ic2N1cmVfd2Vha19wYXNzKQoreworCS8qIEVtcHR5IHBhc3N3b3JkICovCisJQkJVTklUX0FTU0VSVF9OT1ROVUxMKG9ic2N1cmVfbXNnKCJBZDQjMjE/J1N8IiwgIiIsICZwdykpOworCS8qIFB1cmUgbnVtYmVycyAqLworCUJCVU5JVF9BU1NFUlRfTk9UTlVMTChvYnNjdXJlX21zZygiQWQ0IzIxPydTfCIsICIyMzU3NzMxNSIsICZwdykpOworCS8qIFNpbWlsYXIgdG8gcHdfbmFtZSAqLworCUJCVU5JVF9BU1NFUlRfTk9UTlVMTChvYnNjdXJlX21zZygiQWQ0IzIxPydTfCIsICJqb2huZG9lMTIzJSIsICZwdykpOworCS8qIFNpbWlsYXIgdG8gcHdfZ2Vjb3MsIHJldmVyc2VkICovCisJQkJVTklUX0FTU0VSVF9OT1ROVUxMKG9ic2N1cmVfbXNnKCJBZDQjMjE/J1N8IiwgImVvRCBuaG9KXjQ0QCIsICZwdykpOworCS8qIFNpbWlsYXIgdG8gdGhlIG9sZCBwYXNzd29yZCAqLworCUJCVU5JVF9BU1NFUlRfTk9UTlVMTChvYnNjdXJlX21zZygiQWQ0IzIxPydTfCIsICJkNCMyMT8nUyIsICZwdykpOworCS8qIGFkamFjZW50IGxldHRlcnMgKi8KKwlCQlVOSVRfQVNTRVJUX05PVE5VTEwob2JzY3VyZV9tc2coIkFkNCMyMT8nU3wiLCAicXdlcnR5MTIzIiwgJnB3KSk7CisJLyogTWFueSBzaW1pbGFyIGNoYXJzICovCisJQkJVTklUX0FTU0VSVF9OT1ROVUxMKG9ic2N1cmVfbXNnKCJBZDQjMjE/J1N8IiwgIl4zM0RhYWFhYWExIiwgJnB3KSk7CisKKwlCQlVOSVRfRU5EVEVTVDsKK30KKworQkJVTklUX0RFRklORV9URVNUKG9ic2N1cmVfc3Ryb25nX3Bhc3MpCit7CisJQkJVTklUX0FTU0VSVF9OVUxMKG9ic2N1cmVfbXNnKCJSdDQjIzImOid8IiwgIn0oXiNyclNYM1MqMjIiLCAmcHcpKTsKKworCUJCVU5JVF9FTkRURVNUOworfQorCisjZW5kaWYgLyogRU5BQkxFX1VOSVRfVEVTVCAqLwpkaWZmIC0tZ2l0IGEvbGliYmIvcGFyc2VfY29uZmlnLmMgYi9saWJiYi9wYXJzZV9jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTkwZDlhCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvcGFyc2VfY29uZmlnLmMKQEAgLTAsMCArMSwyNDMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGNvbmZpZyBmaWxlIHBhcnNlciBoZWxwZXIKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKiBBbHNvIGZvciB1c2UgaW4gdUNsaWJjIChodHRwOi8vdWNsaWJjLm9yZy8pIGxpY2Vuc2VkIHVuZGVyIExHUEx2Mi4xIG9yIGxhdGVyLgorICovCisKKy8qIFVuY29tbWVudCB0byBlbmFibGUgdGVzdCBhcHBsZXQgKi8KKy8vLy9jb25maWc6Y29uZmlnIFBBUlNFCisvLy8vY29uZmlnOglib29sICJVbmlmb3JtIGNvbmZpZyBmaWxlIHBhcnNlciBkZWJ1Z2dpbmcgYXBwbGV0OiBwYXJzZSIKKy8vLy9jb25maWc6CWRlZmF1bHQgbgorLy8vL2NvbmZpZzoJaGVscAorLy8vL2NvbmZpZzoJICBUeXBpY2FsIHVzYWdlIG9mIHBhcnNlIEFQSToKKy8vLy9jb25maWc6CQljaGFyICp0WzNdOworLy8vL2NvbmZpZzoJCXBhcnNlcl90ICpwID0gY29uZmlnX29wZW4oZmlsZW5hbWUpOworLy8vL2NvbmZpZzoJCXdoaWxlIChjb25maWdfcmVhZChwLCB0LCAzLCAwLCBkZWxpbWl0ZXJzLCBmbGFncykpIHsgLy8gMS4uMyB0b2tlbnMKKy8vLy9jb25maWc6CQkJYmJfZXJyb3JfbXNnKCJUT0tFTlM6ICclcycnJXMnJyVzJyIsIHRbMF0sIHRbMV0sIHRbMl0pOworLy8vL2NvbmZpZzoJCX0KKy8vLy9jb25maWc6CQljb25maWdfY2xvc2UocCk7CisKKy8vLy9hcHBsZXQ6SUZfUEFSU0UoQVBQTEVUKHBhcnNlLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLXkgKz0gcGFyc2VfY29uZmlnLm8KKworLy91c2FnZTojZGVmaW5lIHBhcnNlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXhdIFstbiBNQVhUT0tFTlNdIFstbSBNSU5UT0tFTlNdIFstZCBERUxJTVNdIFstZiBGTEFHU10gRklMRS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBwYXJzZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgkteAlTdXBwcmVzcyBvdXRwdXQgKGZvciBiZW5jaG1hcmtpbmcpIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIGRlZmluZWQgRU5BQkxFX1BBUlNFICYmIEVOQUJMRV9QQVJTRQoraW50IHBhcnNlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwYXJzZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqZGVsaW1zID0gIiMgXHQiOworCWNoYXIgKip0OworCXVuc2lnbmVkIGZsYWdzID0gUEFSU0VfTk9STUFMOworCWludCBtaW50b2tlbnMgPSAwLCBudG9rZW5zID0gMTI4OworCXVuc2lnbmVkIG5vb3V0OworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTE6bis6bSs6ZisiOworCW5vb3V0ID0gMSAmIGdldG9wdDMyKGFyZ3YsICJ4bjptOmQ6ZjoiLCAmbnRva2VucywgJm1pbnRva2VucywgJmRlbGltcywgJmZsYWdzKTsKKwkvL2FyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCisJdCA9IHhtYWxsb2Moc2l6ZW9mKHRbMF0pICogbnRva2Vucyk7CisJd2hpbGUgKCphcmd2KSB7CisJCWludCBuOworCQlwYXJzZXJfdCAqcCA9IGNvbmZpZ19vcGVuKCphcmd2KTsKKwkJd2hpbGUgKChuID0gY29uZmlnX3JlYWQocCwgdCwgbnRva2VucywgbWludG9rZW5zLCBkZWxpbXMsIGZsYWdzKSkgIT0gMCkgeworCQkJaWYgKCFub291dCkgeworCQkJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKQorCQkJCQlwcmludGYoIlslc10iLCB0W2ldKTsKKwkJCQlwdXRzKCIiKTsKKwkJCX0KKwkJfQorCQljb25maWdfY2xvc2UocCk7CisJCWFyZ3YrKzsKKwl9CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKyNlbmRpZgorCitwYXJzZXJfdCogRkFTVF9GVU5DIGNvbmZpZ19vcGVuMihjb25zdCBjaGFyICpmaWxlbmFtZSwgRklMRSogRkFTVF9GVU5DICgqZm9wZW5fZnVuYykoY29uc3QgY2hhciAqcGF0aCkpCit7CisJRklMRSogZnA7CisJcGFyc2VyX3QgKnBhcnNlcjsKKworCWZwID0gZm9wZW5fZnVuYyhmaWxlbmFtZSk7CisJaWYgKCFmcCkKKwkJcmV0dXJuIE5VTEw7CisJcGFyc2VyID0geHphbGxvYyhzaXplb2YoKnBhcnNlcikpOworCXBhcnNlci0+ZnAgPSBmcDsKKwlyZXR1cm4gcGFyc2VyOworfQorCitwYXJzZXJfdCogRkFTVF9GVU5DIGNvbmZpZ19vcGVuKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCXJldHVybiBjb25maWdfb3BlbjIoZmlsZW5hbWUsIGZvcGVuX29yX3dhcm5fc3RkaW4pOworfQorCit2b2lkIEZBU1RfRlVOQyBjb25maWdfY2xvc2UocGFyc2VyX3QgKnBhcnNlcikKK3sKKwlpZiAocGFyc2VyKSB7CisJCWlmIChQQVJTRV9LRUVQX0NPUFkpIC8qIGNvbXBpbGUtdGltZSBjb25zdGFudCAqLworCQkJZnJlZShwYXJzZXItPmRhdGEpOworCQlmY2xvc2UocGFyc2VyLT5mcCk7CisJCWZyZWUocGFyc2VyLT5saW5lKTsKKwkJZnJlZShwYXJzZXItPm5saW5lKTsKKwkJZnJlZShwYXJzZXIpOworCX0KK30KKworLyogVGhpcyBmdW5jdGlvbiByZWFkcyBhbiBlbnRpcmUgbGluZSBmcm9tIGEgdGV4dCBmaWxlLAorICogdXAgdG8gYSBuZXdsaW5lLCBleGNsdXNpdmUuCisgKiBUcmFpbGluZyAnXCcgaXMgcmVjb2duaXplZCBhcyBsaW5lIGNvbnRpbnVhdGlvbi4KKyAqIFJldHVybnMgLTEgaWYgRU9GL2Vycm9yLgorICovCitzdGF0aWMgaW50IGdldF9saW5lX3dpdGhfY29udGludWF0aW9uKHBhcnNlcl90ICpwYXJzZXIpCit7CisJc3NpemVfdCBsZW4sIG5sZW47CisJY2hhciAqbGluZTsKKworCWxlbiA9IGdldGxpbmUoJnBhcnNlci0+bGluZSwgJnBhcnNlci0+bGluZV9hbGxvYywgcGFyc2VyLT5mcCk7CisJaWYgKGxlbiA8PSAwKQorCQlyZXR1cm4gbGVuOworCisJbGluZSA9IHBhcnNlci0+bGluZTsKKwlmb3IgKDs7KSB7CisJCXBhcnNlci0+bGluZW5vKys7CisJCWlmIChsaW5lW2xlbiAtIDFdID09ICdcbicpCisJCQlsZW4tLTsKKwkJaWYgKGxlbiA9PSAwIHx8IGxpbmVbbGVuIC0gMV0gIT0gJ1xcJykKKwkJCWJyZWFrOworCQlsZW4tLTsKKworCQlubGVuID0gZ2V0bGluZSgmcGFyc2VyLT5ubGluZSwgJnBhcnNlci0+bmxpbmVfYWxsb2MsIHBhcnNlci0+ZnApOworCQlpZiAobmxlbiA8PSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKHBhcnNlci0+bGluZV9hbGxvYyA8IGxlbiArIG5sZW4gKyAxKSB7CisJCQlwYXJzZXItPmxpbmVfYWxsb2MgPSBsZW4gKyBubGVuICsgMTsKKwkJCWxpbmUgPSBwYXJzZXItPmxpbmUgPSB4cmVhbGxvYyhsaW5lLCBwYXJzZXItPmxpbmVfYWxsb2MpOworCQl9CisJCW1lbWNweSgmbGluZVtsZW5dLCBwYXJzZXItPm5saW5lLCBubGVuKTsKKwkJbGVuICs9IG5sZW47CisJfQorCisJbGluZVtsZW5dID0gJ1wwJzsKKwlyZXR1cm4gbGVuOworfQorCisKKy8qCiswLiBJZiBwYXJzZXIgaXMgTlVMTCByZXR1cm4gMC4KKzEuIFJlYWQgYSBsaW5lIGZyb20gY29uZmlnIGZpbGUuIElmIG5vdGhpbmcgdG8gcmVhZCB0aGVuIHJldHVybiAwLgorICAgSGFuZGxlIGNvbnRpbnVhdGlvbiBjaGFyYWN0ZXIuIEFkdmFuY2UgbGluZW5vIGZvciBlYWNoIHBoeXNpY2FsIGxpbmUuCisgICBEaXNjYXJkIGV2ZXJ5dGhpbmcgcGFzdCBjb21tZW50IGNoYXJhY3Rlci4KKzIuIGlmIFBBUlNFX1RSSU0gaXMgc2V0IChkZWZhdWx0KSwgcmVtb3ZlIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGRlbGltaXRlcnMuCiszLiBJZiByZXN1bHRpbmcgbGluZSBpcyBlbXB0eSBnb3RvIDEuCis0LiBMb29rIGZvciBmaXJzdCBkZWxpbWl0ZXIuIElmICFQQVJTRV9DT0xMQVBTRSBvciAhUEFSU0VfVFJJTSBpcyBzZXQgdGhlbgorICAgcmVtZW1iZXIgdGhlIHRva2VuIGFzIGVtcHR5LgorNS4gRWxzZSAoZGVmYXVsdCkgaWYgbnVtYmVyIG9mIHNlZW4gdG9rZW5zIGlzIGVxdWFsIHRvIG1heCBudW1iZXIgb2YgdG9rZW5zCisgICAodG9rZW4gaXMgdGhlIGxhc3Qgb25lKSBhbmQgUEFSU0VfR1JFRURZIGlzIHNldCB0aGVuIHRoZSByZW1haW5kZXIKKyAgIG9mIHRoZSBsaW5lIGlzIHRoZSBsYXN0IHRva2VuLgorICAgRWxzZSAodG9rZW4gaXMgbm90IGxhc3Qgb3IgUEFSU0VfR1JFRURZIGlzIG5vdCBzZXQpIGp1c3QgcmVwbGFjZQorICAgZmlyc3QgZGVsaW1pdGVyIHdpdGggJ1wwJyB0aHVzIGRlbGltaXRpbmcgdGhlIHRva2VuLgorNi4gQWR2YW5jZSBsaW5lIHBvaW50ZXIgcGFzdCB0aGUgZW5kIG9mIHRva2VuLiBJZiBudW1iZXIgb2Ygc2VlbiB0b2tlbnMKKyAgIGlzIGxlc3MgdGhhbiByZXF1aXJlZCBudW1iZXIgb2YgdG9rZW5zIHRoZW4gZ290byA0LgorNy4gQ2hlY2sgdGhlIG51bWJlciBvZiBzZWVuIHRva2VucyBpcyBub3QgbGVzcyB0aGUgbWluIG51bWJlciBvZiB0b2tlbnMuCisgICBDb21wbGFpbiBvciBkaWUgb3RoZXJ3aXNlIGRlcGVuZGluZyBvbiBQQVJTRV9NSU5fRElFLgorOC4gUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2VlbiB0b2tlbnMuCisKK21pbnRva2VucyA+IDAgbWFrZSBjb25maWdfcmVhZCgpIHByaW50IGVycm9yIG1lc3NhZ2UgaWYgbGVzcyB0aGFuIG1pbnRva2VucworKGJ1dCBtb3JlIHRoYW4gMCkgYXJlIGZvdW5kLiBFbXB0eSBsaW5lcyBhcmUgYWx3YXlzIHNraXBwZWQgKG5vdCB3YXJuZWQgYWJvdXQpLgorKi8KKyN1bmRlZiBjb25maWdfcmVhZAoraW50IEZBU1RfRlVOQyBjb25maWdfcmVhZChwYXJzZXJfdCAqcGFyc2VyLCBjaGFyICoqdG9rZW5zLCB1bnNpZ25lZCBmbGFncywgY29uc3QgY2hhciAqZGVsaW1zKQoreworCWNoYXIgKmxpbmU7CisJaW50IG50b2tlbnMsIG1pbnRva2VuczsKKwlpbnQgdDsKKworCWlmICghcGFyc2VyKQorCQlyZXR1cm4gMDsKKworCW50b2tlbnMgPSAodWludDhfdClmbGFnczsKKwltaW50b2tlbnMgPSAodWludDhfdCkoZmxhZ3MgPj4gOCk7CisKKyBhZ2FpbjoKKwltZW1zZXQodG9rZW5zLCAwLCBzaXplb2YodG9rZW5zWzBdKSAqIG50b2tlbnMpOworCisJLyogUmVhZCBvbmUgbGluZSAoaGFuZGxpbmcgY29udGludWF0aW9ucyB3aXRoIGJhY2tzbGFzaCkgKi8KKwlpZiAoZ2V0X2xpbmVfd2l0aF9jb250aW51YXRpb24ocGFyc2VyKSA8IDApCisJCXJldHVybiAwOworCisJbGluZSA9IHBhcnNlci0+bGluZTsKKworCS8qIFNraXAgdG9rZW4gaW4gdGhlIHN0YXJ0IG9mIGxpbmU/ICovCisJaWYgKGZsYWdzICYgUEFSU0VfVFJJTSkKKwkJbGluZSArPSBzdHJzcG4obGluZSwgZGVsaW1zICsgMSk7CisKKwlpZiAobGluZVswXSA9PSAnXDAnIHx8IGxpbmVbMF0gPT0gZGVsaW1zWzBdKQorCQlnb3RvIGFnYWluOworCisJaWYgKGZsYWdzICYgUEFSU0VfS0VFUF9DT1BZKSB7CisJCWZyZWUocGFyc2VyLT5kYXRhKTsKKwkJcGFyc2VyLT5kYXRhID0geHN0cmR1cChsaW5lKTsKKwl9CisKKwkvKiBUb2tlbml6ZSB0aGUgbGluZSAqLworCXQgPSAwOworCWRvIHsKKwkJLyogUGluIHRva2VuICovCisJCXRva2Vuc1t0XSA9IGxpbmU7CisKKwkJLyogQ29tYmluZSByZW1haW5pbmcgYXJndW1lbnRzPyAqLworCQlpZiAoKHQgIT0gKG50b2tlbnMtMSkpIHx8ICEoZmxhZ3MgJiBQQVJTRV9HUkVFRFkpKSB7CisJCQkvKiBWYW5pbGxhIHRva2VuLCBmaW5kIG5leHQgZGVsaW1pdGVyICovCisJCQlsaW5lICs9IHN0cmNzcG4obGluZSwgZGVsaW1zWzBdID8gZGVsaW1zIDogZGVsaW1zICsgMSk7CisJCX0gZWxzZSB7CisJCQkvKiBDb21iaW5pbmcsIGZpbmQgY29tbWVudCBjaGFyIGlmIGFueSAqLworCQkJbGluZSA9IHN0cmNocm51bChsaW5lLCBQQVJTRV9FT0xfQ09NTUVOVFMgPyBkZWxpbXNbMF0gOiAnXDAnKTsKKworCQkJLyogVHJpbSBhbnkgZXh0cmEgZGVsaW1pdGVycyBmcm9tIHRoZSBlbmQgKi8KKwkJCWlmIChmbGFncyAmIFBBUlNFX1RSSU0pIHsKKwkJCQl3aGlsZSAoc3RyY2hyKGRlbGltcyArIDEsIGxpbmVbLTFdKSAhPSBOVUxMKQorCQkJCQlsaW5lLS07CisJCQl9CisJCX0KKworCQkvKiBUb2tlbiBub3QgdGVybWluYXRlZD8gKi8KKwkJaWYgKCpsaW5lID09IGRlbGltc1swXSkKKwkJCSpsaW5lID0gJ1wwJzsKKwkJZWxzZSBpZiAoKmxpbmUgIT0gJ1wwJykKKwkJCSpsaW5lKysgPSAnXDAnOworCisjaWYgMCAvKiB1bnVzZWQgc28gZmFyICovCisJCWlmIChmbGFncyAmIFBBUlNFX0VTQ0FQRSkgeworCQkJc3RyY3B5X2FuZF9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZXModG9rZW5zW3RdLCB0b2tlbnNbdF0pOworCQl9CisjZW5kaWYKKwkJLyogU2tpcCBwb3NzaWJsZSBkZWxpbWl0ZXJzICovCisJCWlmIChmbGFncyAmIFBBUlNFX0NPTExBUFNFKQorCQkJbGluZSArPSBzdHJzcG4obGluZSwgZGVsaW1zICsgMSk7CisKKwkJdCsrOworCX0gd2hpbGUgKCpsaW5lICYmICpsaW5lICE9IGRlbGltc1swXSAmJiB0IDwgbnRva2Vucyk7CisKKwlpZiAodCA8IG1pbnRva2VucykgeworCQliYl9lcnJvcl9tc2coImJhZCBsaW5lICV1OiAlZCB0b2tlbnMgZm91bmQsICVkIG5lZWRlZCIsCisJCQkJcGFyc2VyLT5saW5lbm8sIHQsIG1pbnRva2Vucyk7CisJCWlmIChmbGFncyAmIFBBUlNFX01JTl9ESUUpCisJCQl4ZnVuY19kaWUoKTsKKwkJZ290byBhZ2FpbjsKKwl9CisKKwlyZXR1cm4gdDsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3BhcnNlX21vZGUuYyBiL2xpYmJiL3BhcnNlX21vZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGRkMzliCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvcGFyc2VfbW9kZS5jCkBAIC0wLDAgKzEsMTQ4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBwYXJzZV9tb2RlIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDc5MDQ5NzUvdXRpbGl0aWVzL2NobW9kLmh0bWwgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmcm9tIE5PRk9SSyBhcHBsZXRzLiBJdCBtdXN0IG5vdCBhbGxvY2F0ZSBhbnl0aGluZyAqLworCisjZGVmaW5lIEZJTEVNT0RFQklUUyAoU19JU1VJRCB8IFNfSVNHSUQgfCBTX0lTVlRYIHwgU19JUldYVSB8IFNfSVJXWEcgfCBTX0lSV1hPKQorCitpbnQgRkFTVF9GVU5DIGJiX3BhcnNlX21vZGUoY29uc3QgY2hhciAqcywgdW5zaWduZWQgY3VycmVudF9tb2RlKQoreworCXN0YXRpYyBjb25zdCBtb2RlX3Qgd2hvX21hc2tbXSA9IHsKKwkJU19JU1VJRCB8IFNfSVNHSUQgfCBTX0lTVlRYIHwgU19JUldYVSB8IFNfSVJXWEcgfCBTX0lSV1hPLCAvKiBhICovCisJCVNfSVNVSUQgfCBTX0lSV1hVLCAgICAgICAgICAgLyogdSAqLworCQlTX0lTR0lEIHwgU19JUldYRywgICAgICAgICAgIC8qIGcgKi8KKwkJU19JUldYTyAgICAgICAgICAgICAgICAgICAgICAvKiBvICovCisJfTsKKwlzdGF0aWMgY29uc3QgbW9kZV90IHBlcm1fbWFza1tdID0geworCQlTX0lSVVNSIHwgU19JUkdSUCB8IFNfSVJPVEgsIC8qIHIgKi8KKwkJU19JV1VTUiB8IFNfSVdHUlAgfCBTX0lXT1RILCAvKiB3ICovCisJCVNfSVhVU1IgfCBTX0lYR1JQIHwgU19JWE9USCwgLyogeCAqLworCQlTX0lYVVNSIHwgU19JWEdSUCB8IFNfSVhPVEgsIC8qIFggLS0gc3BlY2lhbCAtLSBzZWUgYmVsb3cgKi8KKwkJU19JU1VJRCB8IFNfSVNHSUQsICAgICAgICAgICAvKiBzICovCisJCVNfSVNWVFggICAgICAgICAgICAgICAgICAgICAgLyogdCAqLworCX07CisJc3RhdGljIGNvbnN0IGNoYXIgd2hvX2NoYXJzW10gQUxJR04xID0gImF1Z28iOworCXN0YXRpYyBjb25zdCBjaGFyIHBlcm1fY2hhcnNbXSBBTElHTjEgPSAicnd4WHN0IjsKKworCWNvbnN0IGNoYXIgKnA7CisJbW9kZV90IHdob2xpc3Q7CisJbW9kZV90IHBlcm1saXN0OworCW1vZGVfdCBuZXdfbW9kZTsKKwljaGFyIG9wOworCisJaWYgKCh1bnNpZ25lZCBjaGFyKSgqcyAtICcwJykgPCA4KSB7CisJCXVuc2lnbmVkIGxvbmcgdG1wOworCQljaGFyICplOworCisJCXRtcCA9IHN0cnRvdWwocywgJmUsIDgpOworCQlpZiAoKmUgfHwgKHRtcCA+IDA3Nzc3VSkpIHsgLyogQ2hlY2sgcmFuZ2UgYW5kIHRyYWlsaW5nIGNoYXJzLiAqLworCQkJcmV0dXJuIC0xOworCQl9CisJCXJldHVybiB0bXA7CisJfQorCisJbmV3X21vZGUgPSBjdXJyZW50X21vZGU7CisKKwkvKiBOb3RlOiB3ZSBhbGxvdyBlbXB0eSBjbGF1c2VzLCBhbmQgaGVuY2UgZW1wdHkgbW9kZXMuCisJICogV2UgdHJlYXQgYW4gZW1wdHkgbW9kZSBhcyBubyBjaGFuZ2UgdG8gcGVybXMuICovCisKKwl3aGlsZSAoKnMpIHsgIC8qIFByb2Nlc3MgY2xhdXNlcy4gKi8KKwkJaWYgKCpzID09ICcsJykgeyAgLyogV2UgYWxsb3cgZW1wdHkgY2xhdXNlcy4gKi8KKwkJCSsrczsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogR2V0IGEgd2hvbGlzdC4gKi8KKwkJd2hvbGlzdCA9IDA7CisgV0hPX0xJU1Q6CisJCXAgPSB3aG9fY2hhcnM7CisJCWRvIHsKKwkJCWlmICgqcCA9PSAqcykgeworCQkJCXdob2xpc3QgfD0gd2hvX21hc2tbKGludCkocC13aG9fY2hhcnMpXTsKKwkJCQlpZiAoISorK3MpIHsKKwkJCQkJcmV0dXJuIC0xOworCQkJCX0KKwkJCQlnb3RvIFdIT19MSVNUOworCQkJfQorCQl9IHdoaWxlICgqKytwKTsKKworCQlkbyB7ICAgIC8qIFByb2Nlc3MgYWN0aW9uIGxpc3QuICovCisJCQlpZiAoKCpzICE9ICcrJykgJiYgKCpzICE9ICctJykpIHsKKwkJCQlpZiAoKnMgIT0gJz0nKSB7CisJCQkJCXJldHVybiAtMTsKKwkJCQl9CisJCQkJLyogU2luY2Ugb3AgaXMgJz0nLCBjbGVhciBhbGwgYml0cyBjb3JyZXNwb25kaW5nIHRvIHRoZQorCQkJCSAqIHdob2xpc3QsIG9yIGFsbCBmaWxlIGJpdHMgaWYgd2hvbGlzdCBpcyBlbXB0eS4gKi8KKwkJCQlwZXJtbGlzdCA9IH5GSUxFTU9ERUJJVFM7CisJCQkJaWYgKHdob2xpc3QpIHsKKwkJCQkJcGVybWxpc3QgPSB+d2hvbGlzdDsKKwkJCQl9CisJCQkJbmV3X21vZGUgJj0gcGVybWxpc3Q7CisJCQl9CisJCQlvcCA9ICpzKys7CisKKwkJCS8qIENoZWNrIGZvciBwZXJtY29weS4gKi8KKwkJCXAgPSB3aG9fY2hhcnMgKyAxOyAgLyogU2tpcCAnYScgZW50cnkuICovCisJCQlkbyB7CisJCQkJaWYgKCpwID09ICpzKSB7CisJCQkJCWludCBpID0gMDsKKwkJCQkJcGVybWxpc3QgPSB3aG9fbWFza1soaW50KShwLXdob19jaGFycyldCisJCQkJCQkJICYgKFNfSVJXWFUgfCBTX0lSV1hHIHwgU19JUldYTykKKwkJCQkJCQkgJiBuZXdfbW9kZTsKKwkJCQkJZG8geworCQkJCQkJaWYgKHBlcm1saXN0ICYgcGVybV9tYXNrW2ldKSB7CisJCQkJCQkJcGVybWxpc3QgfD0gcGVybV9tYXNrW2ldOworCQkJCQkJfQorCQkJCQl9IHdoaWxlICgrK2kgPCAzKTsKKwkJCQkJKytzOworCQkJCQlnb3RvIEdPVF9BQ1RJT047CisJCQkJfQorCQkJfSB3aGlsZSAoKisrcCk7CisKKwkJCS8qIEl0IHdhcyBub3QgYSBwZXJtY29weSwgc28gZ2V0IGEgcGVybWxpc3QuICovCisJCQlwZXJtbGlzdCA9IDA7CisgUEVSTV9MSVNUOgorCQkJcCA9IHBlcm1fY2hhcnM7CisJCQlkbyB7CisJCQkJaWYgKCpwID09ICpzKSB7CisJCQkJCWlmICgoKnAgIT0gJ1gnKQorCQkJCQkgfHwgKG5ld19tb2RlICYgKFNfSUZESVIgfCBTX0lYVVNSIHwgU19JWEdSUCB8IFNfSVhPVEgpKQorCQkJCQkpIHsKKwkJCQkJCXBlcm1saXN0IHw9IHBlcm1fbWFza1soaW50KShwLXBlcm1fY2hhcnMpXTsKKwkJCQkJfQorCQkJCQlpZiAoISorK3MpIHsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWdvdG8gUEVSTV9MSVNUOworCQkJCX0KKwkJCX0gd2hpbGUgKCorK3ApOworIEdPVF9BQ1RJT046CisJCQlpZiAocGVybWxpc3QpIHsgLyogVGhlIHBlcm1saXN0IHdhcyBub25lbXB0eS4gKi8KKwkJCQltb2RlX3QgdG1wID0gd2hvbGlzdDsKKwkJCQlpZiAoIXdob2xpc3QpIHsKKwkJCQkJbW9kZV90IHVfbWFzayA9IHVtYXNrKDApOworCQkJCQl1bWFzayh1X21hc2spOworCQkJCQl0bXAgPSB+dV9tYXNrOworCQkJCX0KKwkJCQlwZXJtbGlzdCAmPSB0bXA7CisJCQkJaWYgKG9wID09ICctJykgeworCQkJCQluZXdfbW9kZSAmPSB+cGVybWxpc3Q7CisJCQkJfSBlbHNlIHsKKwkJCQkJbmV3X21vZGUgfD0gcGVybWxpc3Q7CisJCQkJfQorCQkJfQorCQl9IHdoaWxlICgqcyAmJiAoKnMgIT0gJywnKSk7CisJfQorCisJcmV0dXJuIG5ld19tb2RlOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvcGVyY2VudF9kZWNvZGUuYyBiL2xpYmJiL3BlcmNlbnRfZGVjb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE5ZDgwYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3BlcmNlbnRfZGVjb2RlLmMKQEAgLTAsMCArMSw2OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2tidWlsZDpsaWIteSArPSBwZXJjZW50X2RlY29kZS5vCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdGF0aWMgdW5zaWduZWQgaGV4X3RvX2Jpbih1bnNpZ25lZCBjaGFyIGMpCit7CisJdW5zaWduZWQgdjsKKworCXYgPSBjIC0gJzAnOworCWlmICh2IDw9IDkpCisJCXJldHVybiB2OworCS8qIGMgfCAweDIwOiBsZXR0ZXJzIHRvIGxvd2VyIGNhc2UsIG5vbi1sZXR0ZXJzCisJICogdG8gKHBvdGVudGlhbGx5IGRpZmZlcmVudCkgbm9uLWxldHRlcnMgKi8KKwl2ID0gKHVuc2lnbmVkKShjIHwgMHgyMCkgLSAnYSc7CisJaWYgKHYgPD0gNSkKKwkJcmV0dXJuIHYgKyAxMDsKKwlyZXR1cm4gfjA7CisvKiBGb3IgdGVzdGluZzoKK3ZvaWQgdChjaGFyIGMpIHsgcHJpbnRmKCInJWMnKCV1KSAldVxuIiwgYywgYywgaGV4X3RvX2JpbihjKSk7IH0KK2ludCBtYWluKCkgeyB0KDB4MTApOyB0KDB4MjApOyB0KCcwJyk7IHQoJzknKTsgdCgnQScpOyB0KCdGJyk7IHQoJ2EnKTsgdCgnZicpOwordCgnMCctMSk7IHQoJzknKzEpOyB0KCdBJy0xKTsgdCgnRicrMSk7IHQoJ2EnLTEpOyB0KCdmJysxKTsgcmV0dXJuIDA7IH0KKyovCit9CisKK2NoYXIqIEZBU1RfRlVOQyBwZXJjZW50X2RlY29kZV9pbl9wbGFjZShjaGFyICpzdHIsIGludCBzdHJpY3QpCit7CisJLyogbm90ZSB0aGF0IGRlY29kZWQgc3RyaW5nIGlzIGFsd2F5cyBzaG9ydGVyIHRoYW4gb3JpZ2luYWwgKi8KKwljaGFyICpzcmMgPSBzdHI7CisJY2hhciAqZHN0ID0gc3RyOworCWNoYXIgYzsKKworCXdoaWxlICgoYyA9ICpzcmMrKykgIT0gJ1wwJykgeworCQl1bnNpZ25lZCB2OworCisJCWlmICghc3RyaWN0ICYmIGMgPT0gJysnKSB7CisJCQkqZHN0KysgPSAnICc7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyAhPSAnJScpIHsKKwkJCSpkc3QrKyA9IGM7CisJCQljb250aW51ZTsKKwkJfQorCQl2ID0gaGV4X3RvX2JpbihzcmNbMF0pOworCQlpZiAodiA+IDE1KSB7CisgYmFkX2hleDoKKwkJCWlmIChzdHJpY3QpCisJCQkJcmV0dXJuIE5VTEw7CisJCQkqZHN0KysgPSAnJSc7CisJCQljb250aW51ZTsKKwkJfQorCQl2ID0gKHYgKiAxNikgfCBoZXhfdG9fYmluKHNyY1sxXSk7CisJCWlmICh2ID4gMjU1KQorCQkJZ290byBiYWRfaGV4OworCQlpZiAoc3RyaWN0ICYmICh2ID09ICcvJyB8fCB2ID09ICdcMCcpKSB7CisJCQkvKiBjYWxsZXIgdGFrZXMgaXQgYXMgaW5kaWNhdGlvbiBvZiBpbnZhbGlkCisJCQkgKiAoZGFuZ2Vyb3VzIHdydCBleHBsb2l0cykgY2hhcnMgKi8KKwkJCXJldHVybiBzdHIgKyAxOworCQl9CisJCSpkc3QrKyA9IHY7CisJCXNyYyArPSAyOworCX0KKwkqZHN0ID0gJ1wwJzsKKwlyZXR1cm4gc3RyOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvcGVycm9yX21zZy5jIGIvbGliYmIvcGVycm9yX21zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMWYwZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9wZXJyb3JfbXNnLmMKQEAgLTAsMCArMSw0MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKK3ZvaWQgRkFTVF9GVU5DIGJiX3BlcnJvcl9tc2coY29uc3QgY2hhciAqcywgLi4uKQoreworCXZhX2xpc3QgcDsKKworCXZhX3N0YXJ0KHAsIHMpOworCS8qIEd1YXJkIGFnYWluc3QgIjxlcnJvciBtZXNzYWdlPjogU3VjY2VzcyIgKi8KKwliYl92ZXJyb3JfbXNnKHMsIHAsIGVycm5vID8gc3RyZXJyb3IoZXJybm8pIDogTlVMTCk7CisJdmFfZW5kKHApOworfQorCit2b2lkIEZBU1RfRlVOQyBiYl9wZXJyb3JfbXNnX2FuZF9kaWUoY29uc3QgY2hhciAqcywgLi4uKQoreworCXZhX2xpc3QgcDsKKworCXZhX3N0YXJ0KHAsIHMpOworCS8qIEd1YXJkIGFnYWluc3QgIjxlcnJvciBtZXNzYWdlPjogU3VjY2VzcyIgKi8KKwliYl92ZXJyb3JfbXNnKHMsIHAsIGVycm5vID8gc3RyZXJyb3IoZXJybm8pIDogTlVMTCk7CisJdmFfZW5kKHApOworCXhmdW5jX2RpZSgpOworfQorCit2b2lkIEZBU1RfRlVOQyBiYl9zaW1wbGVfcGVycm9yX21zZyhjb25zdCBjaGFyICpzKQoreworCWJiX3BlcnJvcl9tc2coIiVzIiwgcyk7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIGJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUoY29uc3QgY2hhciAqcykKK3sKKwliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIiVzIiwgcyk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9wZXJyb3Jfbm9tc2cuYyBiL2xpYmJiL3BlcnJvcl9ub21zZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYTExY2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9wZXJyb3Jfbm9tc2cuYwpAQCAtMCwwICsxLDIyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBiYl9wZXJyb3Jfbm9tc2cgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDMgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIGdjYyB3YXJucyBhYm91dCBhIG51bGwgZm9ybWF0IHN0cmluZywgdGhlcmVmb3JlIHdlIHByb3ZpZGUKKyAqIG1vZGlmaWVkIGRlZmluaXRpb24gd2l0aG91dCAiYXR0cmlidXRlIChmb3JtYXQpIgorICogaW5zdGVhZCBvZiBpbmNsdWRpbmcgbGliYmIuaCAqLworLy8jaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJwbGF0Zm9ybS5oIgorZXh0ZXJuIHZvaWQgYmJfcGVycm9yX21zZyhjb25zdCBjaGFyICpzLCAuLi4pIEZBU1RfRlVOQzsKKworLyogc3VwcHJlc3MgZ2NjICJubyBwcmV2aW91cyBwcm90b3R5cGUiIHdhcm5pbmcgKi8KK3ZvaWQgRkFTVF9GVU5DIGJiX3BlcnJvcl9ub21zZyh2b2lkKTsKK3ZvaWQgRkFTVF9GVU5DIGJiX3BlcnJvcl9ub21zZyh2b2lkKQoreworCWJiX3BlcnJvcl9tc2coMCk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9wZXJyb3Jfbm9tc2dfYW5kX2RpZS5jIGIvbGliYmIvcGVycm9yX25vbXNnX2FuZF9kaWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDNmZjUxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvcGVycm9yX25vbXNnX2FuZF9kaWUuYwpAQCAtMCwwICsxLDIyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBiYl9wZXJyb3Jfbm9tc2dfYW5kX2RpZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogZ2NjIHdhcm5zIGFib3V0IGEgbnVsbCBmb3JtYXQgc3RyaW5nLCB0aGVyZWZvcmUgd2UgcHJvdmlkZQorICogbW9kaWZpZWQgZGVmaW5pdGlvbiB3aXRob3V0ICJhdHRyaWJ1dGUgKGZvcm1hdCkiCisgKiBpbnN0ZWFkIG9mIGluY2x1ZGluZyBsaWJiYi5oICovCisvLyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInBsYXRmb3JtLmgiCitleHRlcm4gdm9pZCBiYl9wZXJyb3JfbXNnX2FuZF9kaWUoY29uc3QgY2hhciAqcywgLi4uKSBGQVNUX0ZVTkM7CisKKy8qIHN1cHByZXNzIGdjYyAibm8gcHJldmlvdXMgcHJvdG90eXBlIiB3YXJuaW5nICovCit2b2lkIEZBU1RfRlVOQyBiYl9wZXJyb3Jfbm9tc2dfYW5kX2RpZSh2b2lkKTsKK3ZvaWQgRkFTVF9GVU5DIGJiX3BlcnJvcl9ub21zZ19hbmRfZGllKHZvaWQpCit7CisJYmJfcGVycm9yX21zZ19hbmRfZGllKDApOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvcGlkZmlsZS5jIGIvbGliYmIvcGlkZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OGRmYzMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9waWRmaWxlLmMKQEAgLTAsMCArMSw0MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcGlkIGZpbGUgcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgYnkgU3RlcGhhbmUgQmlsbGlhcnQgPHN0ZXBoYW5lLmJpbGxpYXJ0QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIE92ZXJyaWRlIEVOQUJMRV9GRUFUVVJFX1BJREZJTEUgKi8KKyNkZWZpbmUgV0FOVF9QSURGSUxFIDEKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzbWFsbGludCB3cm90ZV9waWRmaWxlOworCit2b2lkIEZBU1RfRlVOQyB3cml0ZV9waWRmaWxlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaW50IHBpZF9mZDsKKwljaGFyICplbmQ7CisJY2hhciBidWZbc2l6ZW9mKGludCkqMyArIDJdOworCXN0cnVjdCBzdGF0IHNiOworCisJaWYgKCFwYXRoKQorCQlyZXR1cm47CisJLyogd2Ugd2lsbCBvdmVyd3JpdGUgc3RhbGUgcGlkZmlsZSAqLworCXBpZF9mZCA9IG9wZW4ocGF0aCwgT19XUk9OTFl8T19DUkVBVHxPX1RSVU5DLCAwNjY2KTsKKwlpZiAocGlkX2ZkIDwgMCkKKwkJcmV0dXJuOworCisJLyogcGF0aCBjYW4gYmUgIi9kZXYvbnVsbCIhIFRlc3QgZm9yIHN1Y2ggY2FzZXMgKi8KKwl3cm90ZV9waWRmaWxlID0gKGZzdGF0KHBpZF9mZCwgJnNiKSA9PSAwKSAmJiBTX0lTUkVHKHNiLnN0X21vZGUpOworCisJaWYgKHdyb3RlX3BpZGZpbGUpIHsKKwkJLyogZmV3IGJ5dGVzIGxhcmdlciwgYnV0IGRvZXNuJ3QgdXNlIHN0ZGlvICovCisJCWVuZCA9IHV0b2FfdG9fYnVmKGdldHBpZCgpLCBidWYsIHNpemVvZihidWYpKTsKKwkJKmVuZCA9ICdcbic7CisJCWZ1bGxfd3JpdGUocGlkX2ZkLCBidWYsIGVuZCAtIGJ1ZiArIDEpOworCX0KKwljbG9zZShwaWRfZmQpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvcGxhdGZvcm0uYyBiL2xpYmJiL3BsYXRmb3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiYmI3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3BsYXRmb3JtLmMKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBSZXBsYWNlbWVudHMgZm9yIGNvbW1vbiBidXQgdXN1YWxseSBub25zdGFuZGFyZCBmdW5jdGlvbnMgdGhhdCBhcmVuJ3QKKyAqIHN1cHBsaWVkIGJ5IGFsbCBwbGF0Zm9ybXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IGJ5IERhbiBGYW5kcmljaCA8ZGFuQGNvbmVoYXJ2ZXN0ZXJzLmNvbT4sIGV0LiBhbC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmbmRlZiBIQVZFX1NUUkNIUk5VTAorY2hhciogRkFTVF9GVU5DIHN0cmNocm51bChjb25zdCBjaGFyICpzLCBpbnQgYykKK3sKKwl3aGlsZSAoKnMgIT0gJ1wwJyAmJiAqcyAhPSBjKQorCQlzKys7CisJcmV0dXJuIChjaGFyKilzOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9VU0xFRVAKK2ludCBGQVNUX0ZVTkMgdXNsZWVwKHVuc2lnbmVkIHVzZWMpCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCXRzLnR2X3NlYyA9IHVzZWMgLyAxMDAwMDAwdTsKKwl0cy50dl9uc2VjID0gKHVzZWMgJSAxMDAwMDAwdSkgKiAxMDAwdTsKKwkvKgorCSAqIElmIGEgc2lnbmFsIGhhcyBub24tZGVmYXVsdCBoYW5kbGVyLCBuYW5vc2xlZXAgcmV0dXJucyBlYXJseS4KKwkgKiBPdXIgdmVyc2lvbiBvZiB1c2xlZXAgZG9lc24ndCByZXR1cm4gZWFybHkKKwkgKiBpZiBpbnRlcnJ1cHRlZCBieSBzdWNoIHNpZ25hbHM6CisJICoKKwkgKi8KKwl3aGlsZSAobmFub3NsZWVwKCZ0cywgJnRzKSAhPSAwKQorCQljb250aW51ZTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfVkFTUFJJTlRGCitpbnQgRkFTVF9GVU5DIHZhc3ByaW50ZihjaGFyICoqc3RyaW5nX3B0ciwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IHApCit7CisJaW50IHI7CisJdmFfbGlzdCBwMjsKKwljaGFyIGJ1ZlsxMjhdOworCisJdmFfY29weShwMiwgcCk7CisJciA9IHZzbnByaW50ZihidWYsIDEyOCwgZm9ybWF0LCBwKTsKKwl2YV9lbmQocCk7CisKKwkvKiBOb3RlOiBjYW4ndCB1c2UgeHN0cmR1cC94bWFsbG9jLCB0aGV5IGNhbGwgdmFzcHJpbnRmICh1cykgb24gZmFpbHVyZSEgKi8KKworCWlmIChyIDwgMTI4KSB7CisJCXZhX2VuZChwMik7CisJCSpzdHJpbmdfcHRyID0gc3RyZHVwKGJ1Zik7CisJCXJldHVybiAoKnN0cmluZ19wdHIgPyByIDogLTEpOworCX0KKworCSpzdHJpbmdfcHRyID0gbWFsbG9jKHIrMSk7CisJciA9ICgqc3RyaW5nX3B0ciA/IHZzbnByaW50Zigqc3RyaW5nX3B0ciwgcisxLCBmb3JtYXQsIHAyKSA6IC0xKTsKKwl2YV9lbmQocDIpOworCisJcmV0dXJuIHI7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX0RQUklOVEYKKy8qIGRwcmludGYgaXMgbm93IHBhcnQgb2YgUE9TSVguMSwgYnV0IHdhcyBvbmx5IGFkZGVkIGluIDIwMDggKi8KK2ludCBkcHJpbnRmKGludCBmZCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBwOworCWludCByOworCWNoYXIgKnN0cmluZ19wdHI7CisKKwl2YV9zdGFydChwLCBmb3JtYXQpOworCXIgPSB2YXNwcmludGYoJnN0cmluZ19wdHIsIGZvcm1hdCwgcCk7CisJdmFfZW5kKHApOworCWlmIChyID49IDApIHsKKwkJciA9IGZ1bGxfd3JpdGUoZmQsIHN0cmluZ19wdHIsIHIpOworCQlmcmVlKHN0cmluZ19wdHIpOworCX0KKwlyZXR1cm4gcjsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfTUVNUkNIUgorLyogQ29weXJpZ2h0IChDKSAyMDA1IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICogbWVtcmNocigpIGlzIGEgR05VIGZ1bmN0aW9uIHRoYXQgbWlnaHQgbm90IGJlIGF2YWlsYWJsZSBldmVyeXdoZXJlLgorICogSXQncyBiYXNpY2FsbHkgdGhlIGludmVyc2Ugb2YgbWVtY2hyKCkgLSBzZWFyY2ggYmFja3dhcmRzIGluIGEKKyAqIG1lbW9yeSBibG9jayBmb3IgYSBwYXJ0aWN1bGFyIGNoYXJhY3Rlci4KKyAqLwordm9pZCogRkFTVF9GVU5DIG1lbXJjaHIoY29uc3Qgdm9pZCAqcywgaW50IGMsIHNpemVfdCBuKQoreworCWNvbnN0IGNoYXIgKnN0YXJ0ID0gcywgKmVuZCA9IHM7CisKKwllbmQgKz0gbiAtIDE7CisKKwl3aGlsZSAoZW5kID49IHN0YXJ0KSB7CisJCWlmICgqZW5kID09IChjaGFyKWMpCisJCQlyZXR1cm4gKHZvaWQgKikgZW5kOworCQllbmQtLTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfTUtEVEVNUAorLyogVGhpcyBpcyBub3cgYWN0dWFsbHkgcGFydCBvZiBQT1NJWC4xLCBidXQgd2FzIG9ubHkgYWRkZWQgaW4gMjAwOCAqLworY2hhciogRkFTVF9GVU5DIG1rZHRlbXAoY2hhciAqdGVtcGxhdGUpCit7CisJaWYgKG1rdGVtcCh0ZW1wbGF0ZSkgPT0gTlVMTCB8fCBta2Rpcih0ZW1wbGF0ZSwgMDcwMCkgIT0gMCkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHRlbXBsYXRlOworfQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9TVFJDQVNFU1RSCisvKiBDb3B5cmlnaHQgKGMpIDE5OTksIDIwMDAgVGhlIGh0Oi8vRGlnIEdyb3VwICovCitjaGFyKiBGQVNUX0ZVTkMgc3RyY2FzZXN0cihjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpwYXR0ZXJuKQoreworCWludCBsZW5ndGggPSBzdHJsZW4ocGF0dGVybik7CisKKwl3aGlsZSAoKnMpIHsKKwkJaWYgKHN0cm5jYXNlY21wKHMsIHBhdHRlcm4sIGxlbmd0aCkgPT0gMCkKKwkJCXJldHVybiAoY2hhciAqKXM7CisJCXMrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworI2lmbmRlZiBIQVZFX1NUUlNFUAorLyogQ29weXJpZ2h0IChDKSAyMDA0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiAqLworY2hhciogRkFTVF9GVU5DIHN0cnNlcChjaGFyICoqc3RyaW5ncCwgY29uc3QgY2hhciAqZGVsaW0pCit7CisJY2hhciAqc3RhcnQgPSAqc3RyaW5ncDsKKwljaGFyICpwdHI7CisKKwlpZiAoIXN0YXJ0KQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghKmRlbGltKQorCQlwdHIgPSBzdGFydCArIHN0cmxlbihzdGFydCk7CisJZWxzZSB7CisJCXB0ciA9IHN0cnBicmsoc3RhcnQsIGRlbGltKTsKKwkJaWYgKCFwdHIpIHsKKwkJCSpzdHJpbmdwID0gTlVMTDsKKwkJCXJldHVybiBzdGFydDsKKwkJfQorCX0KKworCSpwdHIgPSAnXDAnOworCSpzdHJpbmdwID0gcHRyICsgMTsKKworCXJldHVybiBzdGFydDsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RQQ1BZCitjaGFyKiBGQVNUX0ZVTkMgc3RwY3B5KGNoYXIgKnAsIGNvbnN0IGNoYXIgKnRvX2FkZCkKK3sKKwl3aGlsZSAoKCpwID0gKnRvX2FkZCkgIT0gJ1wwJykgeworCQlwKys7CisJCXRvX2FkZCsrOworCX0KKwlyZXR1cm4gcDsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfR0VUTElORQorc3NpemVfdCBGQVNUX0ZVTkMgZ2V0bGluZShjaGFyICoqbGluZXB0ciwgc2l6ZV90ICpuLCBGSUxFICpzdHJlYW0pCit7CisJaW50IGNoOworCWNoYXIgKmxpbmUgPSAqbGluZXB0cjsKKwlzaXplX3QgYWxsb2NlZCA9ICpuOworCXNpemVfdCBsZW4gPSAwOworCisJZG8geworCQljaCA9IGZnZXRjKHN0cmVhbSk7CisJCWlmIChjaCA9PSBFT0YpCisJCQlicmVhazsKKwkJaWYgKGxlbiArIDEgPj0gYWxsb2NlZCkgeworCQkJYWxsb2NlZCArPSBhbGxvY2VkLzQgKyA2NDsKKwkJCWxpbmUgPSB4cmVhbGxvYyhsaW5lLCBhbGxvY2VkKTsKKwkJfQorCQlsaW5lW2xlbisrXSA9IGNoOworCX0gd2hpbGUgKGNoICE9ICdcbicpOworCisJaWYgKGxlbiA9PSAwKQorCQlyZXR1cm4gLTE7CisKKwlsaW5lW2xlbl0gPSAnXDAnOworCSpsaW5lcHRyID0gbGluZTsKKwkqbiA9IGFsbG9jZWQ7CisJcmV0dXJuIGxlbjsKK30KKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfVFRZTkFNRV9SCitpbnQgdHR5bmFtZV9yKGludCBmZCwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQoreworCWludCByOworCWNoYXIgcGF0aFtzaXplb2YoIi9wcm9jL3NlbGYvZmQvJWQiKSArIHNpemVvZihpbnQpKjNdOworCisJaWYgKCFpc2F0dHkoZmQpKQorCQlyZXR1cm4gZXJybm8gPT0gRUlOVkFMID8gRU5PVFRZIDogZXJybm87CisJc3ByaW50ZihwYXRoLCAiL3Byb2Mvc2VsZi9mZC8lZCIsIGZkKTsKKwlyID0gcmVhZGxpbmsocGF0aCwgYnVmLCBidWZsZW4pOworCWlmIChyIDwgMCkKKwkJcmV0dXJuIGVycm5vOworCWlmIChyID49IGJ1ZmxlbikKKwkJcmV0dXJuIEVSQU5HRTsKKwlidWZbcl0gPSAnXDAnOworCXJldHVybiAwOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJiYi9wcmludF9mbGFncy5jIGIvbGliYmIvcHJpbnRfZmxhZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWVjNzMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvcHJpbnRfZmxhZ3MuYwpAQCAtMCwwICsxLDMxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIFByaW50IHN0cmluZyB0aGF0IG1hdGNoZXMgYml0IG1hc2tlZCBmbGFncworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBOYXRhbmFlbCBDb3BhIDxuYXRhbmFlbC5jb3BhQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogcmV0dXJucyBhIHNldCB3aXRoIHRoZSBmbGFncyBub3QgcHJpbnRlZCAqLworaW50IEZBU1RfRlVOQyBwcmludF9mbGFnc19zZXBhcmF0ZWQoY29uc3QgaW50ICptYXNrcywgY29uc3QgY2hhciAqbGFiZWxzLCBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKnNlcGFyYXRvcikKK3sKKwljb25zdCBjaGFyICpuZWVkX3NlcGFyYXRvciA9IE5VTEw7CisJd2hpbGUgKCpsYWJlbHMpIHsKKwkJaWYgKGZsYWdzICYgKm1hc2tzKSB7CisJCQlwcmludGYoIiVzJXMiLAorCQkJCW5lZWRfc2VwYXJhdG9yID8gbmVlZF9zZXBhcmF0b3IgOiAiIiwKKwkJCQlsYWJlbHMpOworCQkJbmVlZF9zZXBhcmF0b3IgPSBzZXBhcmF0b3I7CisJCQlmbGFncyAmPSB+ICptYXNrczsKKwkJfQorCQltYXNrcysrOworCQlsYWJlbHMgKz0gc3RybGVuKGxhYmVscykgKyAxOworCX0KKwlyZXR1cm4gZmxhZ3M7Cit9CisKK2ludCBGQVNUX0ZVTkMgcHJpbnRfZmxhZ3MoY29uc3QgbWFza3NfbGFiZWxzX3QgKm1sLCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIHByaW50X2ZsYWdzX3NlcGFyYXRlZChtbC0+bWFza3MsIG1sLT5sYWJlbHMsIGZsYWdzLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3ByaW50YWJsZS5jIGIvbGliYmIvcHJpbnRhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE0MjM0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3ByaW50YWJsZS5jCkBAIC0wLDAgKzEsNTggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKwordm9pZCBGQVNUX0ZVTkMgZnB1dGNfcHJpbnRhYmxlKGludCBjaCwgRklMRSAqZmlsZSkKK3sKKwlpZiAoKGNoICYgKDB4ODAgKyBQUklOVEFCTEVfTUVUQSkpID09ICgweDgwICsgUFJJTlRBQkxFX01FVEEpKSB7CisJCWZwdXRzKCJNLSIsIGZpbGUpOworCQljaCAmPSAweDdmOworCX0KKwljaCA9ICh1bnNpZ25lZCBjaGFyKSBjaDsKKwlpZiAoY2ggPT0gMHg5YikgeworCQkvKiBWVDEwMCdzIENTSSwgYWthIE1ldGEtRVNDLCBpcyBub3QgcHJpbnRhYmxlIG9uIHZ0LTEwMCAqLworCQljaCA9ICd7JzsKKwkJZ290byBwcmludF9jYXJldDsKKwl9CisJaWYgKGNoIDwgJyAnKSB7CisJCWNoICs9ICdAJzsKKwkJZ290byBwcmludF9jYXJldDsKKwl9CisJaWYgKGNoID09IDB4N2YpIHsKKwkJY2ggPSAnPyc7CisgcHJpbnRfY2FyZXQ6CisJCWZwdXRjKCdeJywgZmlsZSk7CisJfQorCWZwdXRjKGNoLCBmaWxlKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgdmlzaWJsZSh1bnNpZ25lZCBjaCwgY2hhciAqYnVmLCBpbnQgZmxhZ3MpCit7CisJaWYgKGNoID09ICdcdCcgJiYgIShmbGFncyAmIFZJU0lCTEVfU0hPV19UQUJTKSkgeworCQlnb3RvIHJhdzsKKwl9CisJaWYgKGNoID09ICdcbicpIHsKKwkJaWYgKGZsYWdzICYgVklTSUJMRV9FTkRMSU5FKQorCQkJKmJ1ZisrID0gJyQnOworCX0gZWxzZSB7CisJCWlmIChjaCA+PSAxMjgpIHsKKwkJCWNoIC09IDEyODsKKwkJCSpidWYrKyA9ICdNJzsKKwkJCSpidWYrKyA9ICctJzsKKwkJfQorCQlpZiAoY2ggPCAzMiB8fCBjaCA9PSAxMjcpIHsKKwkJCSpidWYrKyA9ICdeJzsKKwkJCWNoIF49IDB4NDA7CisJCX0KKwl9CisgcmF3OgorCSpidWYrKyA9IGNoOworCSpidWYgPSAnXDAnOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvcHJpbnRhYmxlX3N0cmluZy5jIGIvbGliYmIvcHJpbnRhYmxlX3N0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3N2Q1OGQKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9wcmludGFibGVfc3RyaW5nLmMKQEAgLTAsMCArMSw1NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVW5pY29kZSBzdXBwb3J0IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInVuaWNvZGUuaCIKKworY29uc3QgY2hhciogRkFTVF9GVU5DIHByaW50YWJsZV9zdHJpbmcodW5pX3N0YXRfdCAqc3RhdHMsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwljaGFyICpkc3Q7CisJY29uc3QgY2hhciAqczsKKworCXMgPSBzdHI7CisJd2hpbGUgKDEpIHsKKwkJdW5zaWduZWQgY2hhciBjID0gKnM7CisJCWlmIChjID09ICdcMCcpIHsKKwkJCS8qIDk5KyUgb2YgaW5wdXRzIGRvIG5vdCBuZWVkIGNvbnZlcnNpb24gKi8KKwkJCWlmIChzdGF0cykgeworCQkJCXN0YXRzLT5ieXRlX2NvdW50ID0gKHMgLSBzdHIpOworCQkJCXN0YXRzLT51bmljb2RlX2NvdW50ID0gKHMgLSBzdHIpOworCQkJCXN0YXRzLT51bmljb2RlX3dpZHRoID0gKHMgLSBzdHIpOworCQkJfQorCQkJcmV0dXJuIHN0cjsKKwkJfQorCQlpZiAoYyA8ICcgJykKKwkJCWJyZWFrOworCQlpZiAoYyA+PSAweDdmKQorCQkJYnJlYWs7CisJCXMrKzsKKwl9CisKKyNpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisJZHN0ID0gdW5pY29kZV9jb252X3RvX3ByaW50YWJsZShzdGF0cywgc3RyKTsKKyNlbHNlCisJeworCQljaGFyICpkID0gZHN0ID0geHN0cmR1cChzdHIpOworCQl3aGlsZSAoMSkgeworCQkJdW5zaWduZWQgY2hhciBjID0gKmQ7CisJCQlpZiAoYyA9PSAnXDAnKQorCQkJCWJyZWFrOworCQkJaWYgKGMgPCAnICcgfHwgYyA+PSAweDdmKQorCQkJCSpkID0gJz8nOworCQkJZCsrOworCQl9CisJCWlmIChzdGF0cykgeworCQkJc3RhdHMtPmJ5dGVfY291bnQgPSAoZCAtIGRzdCk7CisJCQlzdGF0cy0+dW5pY29kZV9jb3VudCA9IChkIC0gZHN0KTsKKwkJCXN0YXRzLT51bmljb2RlX3dpZHRoID0gKGQgLSBkc3QpOworCQl9CisJfQorI2VuZGlmCisJcmV0dXJuIGF1dG9fc3RyaW5nKGRzdCk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9wcm9jZXNzX2VzY2FwZV9zZXF1ZW5jZS5jIGIvbGliYmIvcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDZlY2ZhCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UuYwpAQCAtMCwwICsxLDExMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIE1hbnVlbCBOb3ZvYSBJSUkgPG1qbjNAY29kZXBvZXQub3JnPgorICogYW5kIFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjZGVmaW5lIFdBTlRfSEVYX0VTQ0FQRVMgMQorCisvKiBVc3VhbCAidGhpcyBvbmx5IHdvcmtzIGZvciBhc2NpaSBjb21wYXRpYmxlIGVuY29kaW5ncyIgZGlzY2xhaW1lci4gKi8KKyN1bmRlZiBfdG9sb3dlcgorI2RlZmluZSBfdG9sb3dlcihYKSAoKFgpfCgoY2hhcikgMHgyMCkpCisKK2NoYXIgRkFTVF9GVU5DIGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlKGNvbnN0IGNoYXIgKipwdHIpCit7CisJY29uc3QgY2hhciAqcTsKKwl1bnNpZ25lZCBudW1fZGlnaXRzOworCXVuc2lnbmVkIG47CisJdW5zaWduZWQgYmFzZTsKKworCW51bV9kaWdpdHMgPSBuID0gMDsKKwliYXNlID0gODsKKwlxID0gKnB0cjsKKworCWlmIChXQU5UX0hFWF9FU0NBUEVTICYmICpxID09ICd4JykgeworCQkrK3E7CisJCWJhc2UgPSAxNjsKKwkJKytudW1fZGlnaXRzOworCX0KKworCS8qIGJhc2ggcmVxdWlyZXMgbGVhZGluZyAwIGluIG9jdGFsIGVzY2FwZXM6CisJICogXDAyIHdvcmtzLCBcMiBkb2VzIG5vdCAocHJpbnRzIFwgYW5kIDIpLgorCSAqIFdlIHRyZWF0IFwyIGFzIGEgdmFsaWQgb2N0YWwgZXNjYXBlIHNlcXVlbmNlLiAqLworCWRvIHsKKwkJdW5zaWduZWQgcjsKKyNpZiAhV0FOVF9IRVhfRVNDQVBFUworCQl1bnNpZ25lZCBkID0gKHVuc2lnbmVkIGNoYXIpKCpxKSAtICcwJzsKKyNlbHNlCisJCXVuc2lnbmVkIGQgPSAodW5zaWduZWQgY2hhcilfdG9sb3dlcigqcSkgLSAnMCc7CisJCWlmIChkID49IDEwKQorCQkJZCArPSAoJzAnIC0gJ2EnICsgMTApOworI2VuZGlmCisJCWlmIChkID49IGJhc2UpIHsKKwkJCWlmIChXQU5UX0hFWF9FU0NBUEVTICYmIGJhc2UgPT0gMTYpIHsKKwkJCQktLW51bV9kaWdpdHM7CisJCQkJaWYgKG51bV9kaWdpdHMgPT0gMCkgeworCQkJCQkvKiBceDxiYWRfY2hhcj46IHJldHVybiAnXCcsCisJCQkJCSAqIGxlYXZlIHB0ciBwb2ludGluZyB0byB4ICovCisJCQkJCXJldHVybiAnXFwnOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCQl9CisKKwkJciA9IG4gKiBiYXNlICsgZDsKKwkJaWYgKHIgPiBVQ0hBUl9NQVgpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJbiA9IHI7CisJCSsrcTsKKwl9IHdoaWxlICgrK251bV9kaWdpdHMgPCAzKTsKKworCWlmIChudW1fZGlnaXRzID09IDApIHsKKwkJLyogTm90IG9jdGFsIG9yIGhleCBlc2NhcGUgc2VxdWVuY2UuCisJCSAqIElzIGl0IG9uZS1sZXR0ZXIgb25lPyAqLworCisJCS8qIGJhc2ggYnVpbHRpbiAiZWNobyAtZSAnXGVjJyIgaW50ZXJwcmV0cyBcZSBhcyBFU0MsCisJCSAqIGJ1dCBjb3JldXRpbHMgIi9iaW4vZWNobyAtZSAnXGVjJyIgZG9lcyBub3QuCisJCSAqIE1hbnBhZ2VzIHRlbmQgdG8gc3VwcG9ydCBjb3JldXRpbHMgd2F5LgorCQkgKiBVcGRhdGU6IGNvcmV1dGlscyBhZGRlZCBzdXBwb3J0IGZvciBcZSBvbiAyOCBPY3QgMjAwOS4gKi8KKwkJc3RhdGljIGNvbnN0IGNoYXIgY2hhcm1hcFtdIEFMSUdOMSA9IHsKKwkJCSdhJywgICdiJywgJ2UnLCAnZicsICAnbicsICAncicsICAndCcsICAndicsICAnXFwnLCAnXDAnLAorCQkJJ1xhJywgJ1xiJywgMjcsICdcZicsICdcbicsICdccicsICdcdCcsICdcdicsICdcXCcsICdcXCcsCisJCX07CisJCWNvbnN0IGNoYXIgKnAgPSBjaGFybWFwOworCQlkbyB7CisJCQlpZiAoKnAgPT0gKnEpIHsKKwkJCQlxKys7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gd2hpbGUgKCorK3AgIT0gJ1wwJyk7CisJCS8qIHAgcG9pbnRzIHRvIGZvdW5kIGVzY2FwZSBjaGFyIG9yIE5VTCwKKwkJICogYWR2YW5jZSBpdCBhbmQgZmluZCB3aGF0IGl0IHRyYW5zbGF0ZXMgdG8uCisJCSAqIE5vdGUgdGhhdCBcTlVMIGFuZCB1bnJlY29nbml6ZWQgc2VxdWVuY2UgXHogcmV0dXJuICdcJworCQkgKiBhbmQgbGVhdmUgcHRyIHBvaW50aW5nIHRvIE5VTCBvciB6LiAqLworCQluID0gcFtzaXplb2YoY2hhcm1hcCkgLyAyXTsKKwl9CisKKwkqcHRyID0gcTsKKworCXJldHVybiAoY2hhcikgbjsKK30KKworY2hhciogRkFTVF9GVU5DIHN0cmNweV9hbmRfcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2VzKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjKQoreworCXdoaWxlICgxKSB7CisJCWNoYXIgYywgYzE7CisJCWMgPSBjMSA9ICpzcmMrKzsKKwkJaWYgKGMxID09ICdcXCcpCisJCQljMSA9IGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlKCZzcmMpOworCQkqZHN0ID0gYzE7CisJCWlmIChjID09ICdcMCcpCisJCQlyZXR1cm4gZHN0OworCQlkc3QrKzsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJiYi9wcm9jcHMuYyBiL2xpYmJiL3Byb2Nwcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYWQwNzEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9wcm9jcHMuYwpAQCAtMCwwICsxLDY1NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgMTk5OCBieSBBbGJlcnQgQ2FoYWxhbjsgYWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqIENvcHlyaWdodCAoQykgMjAwMiBieSBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+CisgKiBTRUxpbnV4IHN1cHBvcnQ6IChjKSAyMDA3IGJ5IFl1aWNoaSBOYWthbXVyYSA8eW5ha2FtQGhpdGFjaGlzb2Z0LmpwPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKwordHlwZWRlZiBzdHJ1Y3QgaWRfdG9fbmFtZV9tYXBfdCB7CisJdWlkX3QgaWQ7CisJY2hhciBuYW1lW1VTRVJOQU1FX01BWF9TSVpFXTsKK30gaWRfdG9fbmFtZV9tYXBfdDsKKwordHlwZWRlZiBzdHJ1Y3QgY2FjaGVfdCB7CisJaWRfdG9fbmFtZV9tYXBfdCAqY2FjaGU7CisJaW50IHNpemU7Cit9IGNhY2hlX3Q7CisKK3N0YXRpYyBjYWNoZV90IHVzZXJuYW1lLCBncm91cG5hbWU7CisKK3N0YXRpYyB2b2lkIGNsZWFyX2NhY2hlKGNhY2hlX3QgKmNwKQoreworCWZyZWUoY3AtPmNhY2hlKTsKKwljcC0+Y2FjaGUgPSBOVUxMOworCWNwLT5zaXplID0gMDsKK30KK3ZvaWQgRkFTVF9GVU5DIGNsZWFyX3VzZXJuYW1lX2NhY2hlKHZvaWQpCit7CisJY2xlYXJfY2FjaGUoJnVzZXJuYW1lKTsKKwljbGVhcl9jYWNoZSgmZ3JvdXBuYW1lKTsKK30KKworI2lmIDAgLyogbW9yZSBnZW5lcmljLCBidXQgd2UgZG9uJ3QgbmVlZCB0aGF0IHlldCAqLworLyogUmV0dXJucyAtTi0xIGlmIG5vdCBmb3VuZC4gKi8KKy8qIGNwLT5jYWNoZVtOXSBpcyBhbGxvY2F0ZWQgYW5kIG11c3QgYmUgZmlsbGVkIGluIHRoaXMgY2FzZSAqLworc3RhdGljIGludCBnZXRfY2FjaGVkKGNhY2hlX3QgKmNwLCB1aWRfdCBpZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgY3AtPnNpemU7IGkrKykKKwkJaWYgKGNwLT5jYWNoZVtpXS5pZCA9PSBpZCkKKwkJCXJldHVybiBpOworCWkgPSBjcC0+c2l6ZSsrOworCWNwLT5jYWNoZSA9IHhyZWFsbG9jX3ZlY3RvcihjcC0+Y2FjaGUsIDIsIGkpOworCWNwLT5jYWNoZVtpKytdLmlkID0gaWQ7CisJcmV0dXJuIC1pOworfQorI2VuZGlmCisKK3N0YXRpYyBjaGFyKiBnZXRfY2FjaGVkKGNhY2hlX3QgKmNwLCB1aWRfdCBpZCwKKwkJCWNoYXIqIEZBU1RfRlVOQyB4MnhfdXRvYSh1aWRfdCBpZCkpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGNwLT5zaXplOyBpKyspCisJCWlmIChjcC0+Y2FjaGVbaV0uaWQgPT0gaWQpCisJCQlyZXR1cm4gY3AtPmNhY2hlW2ldLm5hbWU7CisJaSA9IGNwLT5zaXplKys7CisJY3AtPmNhY2hlID0geHJlYWxsb2NfdmVjdG9yKGNwLT5jYWNoZSwgMiwgaSk7CisJY3AtPmNhY2hlW2ldLmlkID0gaWQ7CisJLyogTmV2ZXIgZmFpbHMuIEdlbmVyYXRlcyBudW1lcmljIHN0cmluZyBpZiBuYW1lIGlzbid0IGZvdW5kICovCisJc2FmZV9zdHJuY3B5KGNwLT5jYWNoZVtpXS5uYW1lLCB4MnhfdXRvYShpZCksIHNpemVvZihjcC0+Y2FjaGVbaV0ubmFtZSkpOworCXJldHVybiBjcC0+Y2FjaGVbaV0ubmFtZTsKK30KK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBnZXRfY2FjaGVkX3VzZXJuYW1lKHVpZF90IHVpZCkKK3sKKwlyZXR1cm4gZ2V0X2NhY2hlZCgmdXNlcm5hbWUsIHVpZCwgdWlkMnVuYW1lX3V0b2EpOworfQorY29uc3QgY2hhciogRkFTVF9GVU5DIGdldF9jYWNoZWRfZ3JvdXBuYW1lKGdpZF90IGdpZCkKK3sKKwlyZXR1cm4gZ2V0X2NhY2hlZCgmZ3JvdXBuYW1lLCBnaWQsIGdpZDJncm91cF91dG9hKTsKK30KKworCisjZGVmaW5lIFBST0NQU19CVUZTSVpFIDEwMjQKKworc3RhdGljIGludCByZWFkX3RvX2J1Zihjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmKQoreworCWludCBmZDsKKwkvKiBvcGVuX3JlYWRfY2xvc2UoKSB3b3VsZCBkbyB0d28gcmVhZHMsIGNoZWNraW5nIGZvciBFT0YuCisJICogV2hlbiB5b3UgaGF2ZSAxMDAwMCAvcHJvYy8kTlVNL3N0YXQgdG8gcmVhZCwgaXQgaXNuJ3QgZGVzaXJhYmxlICovCisJc3NpemVfdCByZXQgPSAtMTsKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPj0gMCkgeworCQlyZXQgPSByZWFkKGZkLCBidWYsIFBST0NQU19CVUZTSVpFLTEpOworCQljbG9zZShmZCk7CisJfQorCSgoY2hhciAqKWJ1ZilbcmV0ID4gMCA/IHJldCA6IDBdID0gJ1wwJzsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgcHJvY3BzX3N0YXR1c190KiBGQVNUX0ZVTkMgYWxsb2NfcHJvY3BzX3NjYW4odm9pZCkKK3sKKwl1bnNpZ25lZCBuID0gZ2V0cGFnZXNpemUoKTsKKwlwcm9jcHNfc3RhdHVzX3QqIHNwID0geHphbGxvYyhzaXplb2YocHJvY3BzX3N0YXR1c190KSk7CisJc3AtPmRpciA9IHhvcGVuZGlyKCIvcHJvYyIpOworCXdoaWxlICgxKSB7CisJCW4gPj49IDE7CisJCWlmICghbikgYnJlYWs7CisJCXNwLT5zaGlmdF9wYWdlc190b19ieXRlcysrOworCX0KKwlzcC0+c2hpZnRfcGFnZXNfdG9fa2IgPSBzcC0+c2hpZnRfcGFnZXNfdG9fYnl0ZXMgLSAxMDsKKwlyZXR1cm4gc3A7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIGZyZWVfcHJvY3BzX3NjYW4ocHJvY3BzX3N0YXR1c190KiBzcCkKK3sKKwljbG9zZWRpcihzcC0+ZGlyKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSE9XX1RIUkVBRFMKKwlpZiAoc3AtPnRhc2tfZGlyKQorCQljbG9zZWRpcihzcC0+dGFza19kaXIpOworI2VuZGlmCisJZnJlZShzcC0+YXJndjApOworCWZyZWUoc3AtPmV4ZSk7CisJSUZfU0VMSU5VWChmcmVlKHNwLT5jb250ZXh0KTspCisJZnJlZShzcCk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BNRU0gfHwgRU5BQkxFX1BNQVAKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZhc3Rfc3RydG91bF8xNihjaGFyICoqZW5kcHRyKQoreworCXVuc2lnbmVkIGNoYXIgYzsKKwljaGFyICpzdHIgPSAqZW5kcHRyOworCXVuc2lnbmVkIGxvbmcgbiA9IDA7CisKKwkvKiBOZWVkIHRvIHN0b3Agb24gYm90aCAnICcgYW5kICdcbicgKi8KKwl3aGlsZSAoKGMgPSAqc3RyKyspID4gJyAnKSB7CisJCWMgPSAoKGN8MHgyMCkgLSAnMCcpOworCQlpZiAoYyA+IDkpCisJCQkvKiBjID0gYyArICcwJyAtICdhJyArIDEwOiAqLworCQkJYyA9IGMgLSAoJ2EnIC0gJzAnIC0gMTApOworCQluID0gbioxNiArIGM7CisJfQorCSplbmRwdHIgPSBzdHI7IC8qIFdlIHNraXAgdHJhaWxpbmcgc3BhY2UhICovCisJcmV0dXJuIG47Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZBU1RfVE9QIHx8IEVOQUJMRV9GRUFUVVJFX1RPUE1FTSB8fCBFTkFCTEVfUE1BUAorLyogV2UgY3V0IGEgbG90IG9mIGNvcm5lcnMgaGVyZSBmb3Igc3BlZWQgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGZhc3Rfc3RydG91bF8xMChjaGFyICoqZW5kcHRyKQoreworCXVuc2lnbmVkIGNoYXIgYzsKKwljaGFyICpzdHIgPSAqZW5kcHRyOworCXVuc2lnbmVkIGxvbmcgbiA9ICpzdHIgLSAnMCc7CisKKwkvKiBOZWVkIHRvIHN0b3Agb24gYm90aCAnICcgYW5kICdcbicgKi8KKwl3aGlsZSAoKGMgPSAqKytzdHIpID4gJyAnKQorCQluID0gbioxMCArIChjIC0gJzAnKTsKKworCSplbmRwdHIgPSBzdHIgKyAxOyAvKiBXZSBza2lwIHRyYWlsaW5nIHNwYWNlISAqLworCXJldHVybiBuOworfQorCisjIGlmIEVOQUJMRV9GRUFUVVJFX0ZBU1RfVE9QCitzdGF0aWMgbG9uZyBmYXN0X3N0cnRvbF8xMChjaGFyICoqZW5kcHRyKQoreworCWlmICgqKmVuZHB0ciAhPSAnLScpCisJCXJldHVybiBmYXN0X3N0cnRvdWxfMTAoZW5kcHRyKTsKKworCSgqZW5kcHRyKSsrOworCXJldHVybiAtIChsb25nKWZhc3Rfc3RydG91bF8xMChlbmRwdHIpOworfQorIyBlbmRpZgorCitzdGF0aWMgY2hhciAqc2tpcF9maWVsZHMoY2hhciAqc3RyLCBpbnQgY291bnQpCit7CisJZG8geworCQl3aGlsZSAoKnN0cisrICE9ICcgJykKKwkJCWNvbnRpbnVlOworCQkvKiB3ZSBmb3VuZCBhIHNwYWNlIGNoYXIsIHN0ciBwb2ludHMgYWZ0ZXIgaXQgKi8KKwl9IHdoaWxlICgtLWNvdW50KTsKKwlyZXR1cm4gc3RyOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BNRU0gfHwgRU5BQkxFX1BNQVAKK2ludCBGQVNUX0ZVTkMgcHJvY3BzX3JlYWRfc21hcHMocGlkX3QgcGlkLCBzdHJ1Y3Qgc21hcHJlYyAqdG90YWwsCisJCXZvaWQgKCpjYikoc3RydWN0IHNtYXByZWMgKiwgdm9pZCAqKSwgdm9pZCAqZGF0YSkKK3sKKwlGSUxFICpmaWxlOworCXN0cnVjdCBzbWFwcmVjIGN1cnJlYzsKKwljaGFyIGZpbGVuYW1lW3NpemVvZigiL3Byb2MvJXUvc21hcHMiKSArIHNpemVvZihpbnQpKjNdOworCWNoYXIgYnVmW1BST0NQU19CVUZTSVpFXTsKKyNpZiAhRU5BQkxFX1BNQVAKKwl2b2lkICgqY2IpKHN0cnVjdCBzbWFwcmVjICosIHZvaWQgKikgPSBOVUxMOworCXZvaWQgKmRhdGEgPSBOVUxMOworI2VuZGlmCisKKwlzcHJpbnRmKGZpbGVuYW1lLCAiL3Byb2MvJXUvc21hcHMiLCAoaW50KXBpZCk7CisKKwlmaWxlID0gZm9wZW5fZm9yX3JlYWQoZmlsZW5hbWUpOworCWlmICghZmlsZSkKKwkJcmV0dXJuIDE7CisKKwltZW1zZXQoJmN1cnJlYywgMCwgc2l6ZW9mKGN1cnJlYykpOworCXdoaWxlIChmZ2V0cyhidWYsIFBST0NQU19CVUZTSVpFLCBmaWxlKSkgeworCQkvLyBFYWNoIG1hcHBpbmcgZGF0dW0gaGFzIHRoaXMgZm9ybToKKwkJLy8gZjdkMjkwMDAtZjdkMzkwMDAgcnctcyBGSUxFT0ZTIE06bSBJTk9ERSBGSUxFTkFNRQorCQkvLyBTaXplOiAgICAgICAgICAgICAgICBubm4ga0IKKwkJLy8gUnNzOiAgICAgICAgICAgICAgICAgbm5uIGtCCisJCS8vIC4uLi4uCisKKwkJY2hhciAqdHAsICpwOworCisjZGVmaW5lIFNDQU4oUywgWCkgXAorCQlpZiAoKHRwID0gaXNfcHJlZml4ZWRfd2l0aChidWYsIFMpKSAhPSBOVUxMKSB7ICAgICAgIFwKKwkJCXRwID0gc2tpcF93aGl0ZXNwYWNlKHRwKTsgICAgICAgICAgICAgICAgICAgIFwKKwkJCXRvdGFsLT5YICs9IGN1cnJlYy5YID0gZmFzdF9zdHJ0b3VsXzEwKCZ0cCk7IFwKKwkJCWNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJfQorCQlpZiAoY2IpIHsKKwkJCVNDQU4oIlBzczoiICAsIHNtYXBfcHNzICAgICApOworCQkJU0NBTigiU3dhcDoiICwgc21hcF9zd2FwICAgICk7CisJCX0KKwkJU0NBTigiUHJpdmF0ZV9EaXJ0eToiLCBwcml2YXRlX2RpcnR5KTsKKwkJU0NBTigiUHJpdmF0ZV9DbGVhbjoiLCBwcml2YXRlX2NsZWFuKTsKKwkJU0NBTigiU2hhcmVkX0RpcnR5OiIgLCBzaGFyZWRfZGlydHkgKTsKKwkJU0NBTigiU2hhcmVkX0NsZWFuOiIgLCBzaGFyZWRfY2xlYW4gKTsKKyN1bmRlZiBTQ0FOCisJCXRwID0gc3RyY2hyKGJ1ZiwgJy0nKTsKKwkJaWYgKHRwKSB7CisJCQkvLyBXZSByZWFjaGVkIG5leHQgbWFwcGluZyAtIHRoZSBsaW5lIG9mIHRoaXMgZm9ybToKKwkJCS8vIGY3ZDI5MDAwLWY3ZDM5MDAwIHJ3LXMgRklMRU9GUyBNOm0gSU5PREUgRklMRU5BTUUKKworCQkJaWYgKGNiKSB7CisJCQkJLyogSWYgd2UgaGF2ZSBhIHByZXZpb3VzIHJlY29yZCwgdGhlcmUncyBub3RoaW5nIG1vcmUKKwkJCQkgKiBmb3IgaXQsIGNhbGwgdGhlIGNhbGxiYWNrIGFuZCBjbGVhciBjdXJyZWMKKwkJCQkgKi8KKwkJCQlpZiAoY3VycmVjLnNtYXBfc2l6ZSkKKwkJCQkJY2IoJmN1cnJlYywgZGF0YSk7CisJCQkJZnJlZShjdXJyZWMuc21hcF9uYW1lKTsKKwkJCX0KKwkJCW1lbXNldCgmY3VycmVjLCAwLCBzaXplb2YoY3VycmVjKSk7CisKKwkJCSp0cCA9ICcgJzsKKwkJCXRwID0gYnVmOworCQkJY3VycmVjLnNtYXBfc3RhcnQgPSBmYXN0X3N0cnRvdWxfMTYoJnRwKTsKKwkJCWN1cnJlYy5zbWFwX3NpemUgPSAoZmFzdF9zdHJ0b3VsXzE2KCZ0cCkgLSBjdXJyZWMuc21hcF9zdGFydCkgPj4gMTA7CisKKwkJCXN0cm5jcHkoY3VycmVjLnNtYXBfbW9kZSwgdHAsIHNpemVvZihjdXJyZWMuc21hcF9tb2RlKS0xKTsKKworCQkJLy8gc2tpcHBpbmcgInJ3LXMgRklMRU9GUyBNOm0gSU5PREUgIgorCQkJdHAgPSBza2lwX3doaXRlc3BhY2Uoc2tpcF9maWVsZHModHAsIDQpKTsKKwkJCS8vIGZpbHRlciBvdXQgL2Rldi9zb21ldGhpbmcgKHNvbWV0aGluZyAhPSB6ZXJvKQorCQkJaWYgKCFpc19wcmVmaXhlZF93aXRoKHRwLCAiL2Rldi8iKSB8fCBzdHJjbXAodHAsICIvZGV2L3plcm9cbiIpID09IDApIHsKKwkJCQlpZiAoY3VycmVjLnNtYXBfbW9kZVsxXSA9PSAndycpIHsKKwkJCQkJY3VycmVjLm1hcHBlZF9ydyA9IGN1cnJlYy5zbWFwX3NpemU7CisJCQkJCXRvdGFsLT5tYXBwZWRfcncgKz0gY3VycmVjLnNtYXBfc2l6ZTsKKwkJCQl9IGVsc2UgaWYgKGN1cnJlYy5zbWFwX21vZGVbMV0gPT0gJy0nKSB7CisJCQkJCWN1cnJlYy5tYXBwZWRfcm8gPSBjdXJyZWMuc21hcF9zaXplOworCQkJCQl0b3RhbC0+bWFwcGVkX3JvICs9IGN1cnJlYy5zbWFwX3NpemU7CisJCQkJfQorCQkJfQorCisJCQlpZiAoc3RyY21wKHRwLCAiW3N0YWNrXVxuIikgPT0gMCkKKwkJCQl0b3RhbC0+c3RhY2sgKz0gY3VycmVjLnNtYXBfc2l6ZTsKKwkJCWlmIChjYikgeworCQkJCXAgPSBza2lwX25vbl93aGl0ZXNwYWNlKHRwKTsKKwkJCQlpZiAocCA9PSB0cCkgeworCQkJCQljdXJyZWMuc21hcF9uYW1lID0geHN0cmR1cCgiICBbIGFub24gXSIpOworCQkJCX0gZWxzZSB7CisJCQkJCSpwID0gJ1wwJzsKKwkJCQkJY3VycmVjLnNtYXBfbmFtZSA9IHhzdHJkdXAodHApOworCQkJCX0KKwkJCX0KKwkJCXRvdGFsLT5zbWFwX3NpemUgKz0gY3VycmVjLnNtYXBfc2l6ZTsKKwkJfQorCX0KKwlmY2xvc2UoZmlsZSk7CisKKwlpZiAoY2IpIHsKKwkJaWYgKGN1cnJlYy5zbWFwX3NpemUpCisJCQljYigmY3VycmVjLCBkYXRhKTsKKwkJZnJlZShjdXJyZWMuc21hcF9uYW1lKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCit2b2lkIEJVR19jb21tX3NpemUodm9pZCk7Citwcm9jcHNfc3RhdHVzX3QqIEZBU1RfRlVOQyBwcm9jcHNfc2Nhbihwcm9jcHNfc3RhdHVzX3QqIHNwLCBpbnQgZmxhZ3MpCit7CisJaWYgKCFzcCkKKwkJc3AgPSBhbGxvY19wcm9jcHNfc2NhbigpOworCisJZm9yICg7OykgeworCQlzdHJ1Y3QgZGlyZW50ICplbnRyeTsKKwkJY2hhciBidWZbUFJPQ1BTX0JVRlNJWkVdOworCQlsb25nIHRhc2tuaWNlOworCQl1bnNpZ25lZCBwaWQ7CisJCWludCBuOworCQljaGFyIGZpbGVuYW1lW3NpemVvZigiL3Byb2MvJXUvdGFzay8ldS9jbWRsaW5lIikgKyBzaXplb2YoaW50KSozICogMl07CisJCWNoYXIgKmZpbGVuYW1lX3RhaWw7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSE9XX1RIUkVBRFMKKwkJaWYgKHNwLT50YXNrX2RpcikgeworCQkJZW50cnkgPSByZWFkZGlyKHNwLT50YXNrX2Rpcik7CisJCQlpZiAoZW50cnkpCisJCQkJZ290byBnb3RfZW50cnk7CisJCQljbG9zZWRpcihzcC0+dGFza19kaXIpOworCQkJc3AtPnRhc2tfZGlyID0gTlVMTDsKKwkJfQorI2VuZGlmCisJCWVudHJ5ID0gcmVhZGRpcihzcC0+ZGlyKTsKKwkJaWYgKGVudHJ5ID09IE5VTEwpIHsKKwkJCWZyZWVfcHJvY3BzX3NjYW4oc3ApOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKyBJRl9GRUFUVVJFX1NIT1dfVEhSRUFEUyhnb3RfZW50cnk6KQorCQlwaWQgPSBiYl9zdHJ0b3UoZW50cnktPmRfbmFtZSwgTlVMTCwgMTApOworCQlpZiAoZXJybm8pCisJCQljb250aW51ZTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSE9XX1RIUkVBRFMKKwkJaWYgKChmbGFncyAmIFBTU0NBTl9UQVNLUykgJiYgIXNwLT50YXNrX2RpcikgeworCQkJLyogV2UgZm91bmQgYW5vdGhlciAvcHJvYy9QSUQuIERvIG5vdCB1c2UgaXQsCisJCQkgKiB0aGVyZSB3aWxsIGJlIC9wcm9jL1BJRC90YXNrL1BJRCAoc2FtZSBQSUQhKSwKKwkJCSAqIHNvIGp1c3QgZ28gYWhlYWQgYW5kIGRpdmUgaW50byAvcHJvYy9QSUQvdGFzay4gKi8KKwkJCXNwcmludGYoZmlsZW5hbWUsICIvcHJvYy8ldS90YXNrIiwgcGlkKTsKKwkJCS8qIE5vdGU6IGlmIG9wZW5kaXIgZmFpbHMsIHdlIGp1c3QgZ28gdG8gbmV4dCAvcHJvYy9YWFggKi8KKwkJCXNwLT50YXNrX2RpciA9IG9wZW5kaXIoZmlsZW5hbWUpOworCQkJc3AtPm1haW5fdGhyZWFkX3BpZCA9IHBpZDsKKwkJCWNvbnRpbnVlOworCQl9CisjZW5kaWYKKworCQkvKiBBZnRlciB0aGlzIHBvaW50IHdlIGNhbjoKKwkJICogImJyZWFrIjogc3RvcCBwYXJzaW5nLCByZXR1cm4gdGhlIGRhdGEKKwkJICogImNvbnRpbnVlIjogdHJ5IG5leHQgL3Byb2MvWFhYCisJCSAqLworCisJCW1lbXNldCgmc3AtPnZzeiwgMCwgc2l6ZW9mKCpzcCkgLSBvZmZzZXRvZihwcm9jcHNfc3RhdHVzX3QsIHZzeikpOworCisJCXNwLT5waWQgPSBwaWQ7CisJCWlmICghKGZsYWdzICYgflBTU0NBTl9QSUQpKQorCQkJYnJlYWs7IC8qIHdlIG5lZWRlZCBvbmx5IHBpZCwgd2UgZ290IGl0ICovCisKKyNpZiBFTkFCTEVfU0VMSU5VWAorCQlpZiAoZmxhZ3MgJiBQU1NDQU5fQ09OVEVYVCkgeworCQkJaWYgKGdldHBpZGNvbihzcC0+cGlkLCAmc3AtPmNvbnRleHQpIDwgMCkKKwkJCQlzcC0+Y29udGV4dCA9IE5VTEw7CisJCX0KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hPV19USFJFQURTCisJCWlmIChzcC0+dGFza19kaXIpCisJCQlmaWxlbmFtZV90YWlsID0gZmlsZW5hbWUgKyBzcHJpbnRmKGZpbGVuYW1lLCAiL3Byb2MvJXUvdGFzay8ldS8iLCBzcC0+bWFpbl90aHJlYWRfcGlkLCBwaWQpOworCQllbHNlCisjZW5kaWYKKwkJCWZpbGVuYW1lX3RhaWwgPSBmaWxlbmFtZSArIHNwcmludGYoZmlsZW5hbWUsICIvcHJvYy8ldS8iLCBwaWQpOworCisJCWlmIChmbGFncyAmIFBTU0NBTl9VSURHSUQpIHsKKwkJCXN0cnVjdCBzdGF0IHNiOworCQkJaWYgKHN0YXQoZmlsZW5hbWUsICZzYikpCisJCQkJY29udGludWU7IC8qIHByb2Nlc3MgcHJvYmFibHkgZXhpdGVkICovCisJCQkvKiBFZmZlY3RpdmUgVUlEL0dJRCwgbm90IHJlYWwgKi8KKwkJCXNwLT51aWQgPSBzYi5zdF91aWQ7CisJCQlzcC0+Z2lkID0gc2Iuc3RfZ2lkOworCQl9CisKKwkJLyogVGhlc2UgYXJlIGFsbCByZXRyaWV2ZWQgZnJvbSBwcm9jL05OL3N0YXQgaW4gb25lIGdvOiAqLworCQlpZiAoZmxhZ3MgJiAoUFNTQ0FOX1BQSUQgfCBQU1NDQU5fUEdJRCB8IFBTU0NBTl9TSUQKKwkJCXwgUFNTQ0FOX0NPTU0gfCBQU1NDQU5fU1RBVEUKKwkJCXwgUFNTQ0FOX1ZTWiB8IFBTU0NBTl9SU1MKKwkJCXwgUFNTQ0FOX1NUSU1FIHwgUFNTQ0FOX1VUSU1FIHwgUFNTQ0FOX1NUQVJUX1RJTUUKKwkJCXwgUFNTQ0FOX1RUWSB8IFBTU0NBTl9OSUNFCisJCQl8IFBTU0NBTl9DUFUpCisJCSkgeworCQkJY2hhciAqY3AsICpjb21tMTsKKwkJCWludCB0dHk7CisjaWYgIUVOQUJMRV9GRUFUVVJFX0ZBU1RfVE9QCisJCQl1bnNpZ25lZCBsb25nIHZzeiwgcnNzOworI2VuZGlmCisJCQkvKiBzZWUgcHJvYyg1KSBmb3Igc29tZSBkZXRhaWxzIG9uIHRoaXMgKi8KKwkJCXN0cmNweShmaWxlbmFtZV90YWlsLCAic3RhdCIpOworCQkJbiA9IHJlYWRfdG9fYnVmKGZpbGVuYW1lLCBidWYpOworCQkJaWYgKG4gPCAwKQorCQkJCWNvbnRpbnVlOyAvKiBwcm9jZXNzIHByb2JhYmx5IGV4aXRlZCAqLworCQkJY3AgPSBzdHJyY2hyKGJ1ZiwgJyknKTsgLyogc3BsaXQgaW50byAiUElEIChjbWQiIGFuZCAiPHJlc3Q+IiAqLworCQkJLyppZiAoIWNwIHx8IGNwWzFdICE9ICcgJykKKwkJCQljb250aW51ZTsqLworCQkJY3BbMF0gPSAnXDAnOworCQkJaWYgKHNpemVvZihzcC0+Y29tbSkgPCAxNikKKwkJCQlCVUdfY29tbV9zaXplKCk7CisJCQljb21tMSA9IHN0cmNocihidWYsICcoJyk7CisJCQkvKmlmIChjb21tMSkqLworCQkJCXNhZmVfc3RybmNweShzcC0+Y29tbSwgY29tbTEgKyAxLCBzaXplb2Yoc3AtPmNvbW0pKTsKKworI2lmICFFTkFCTEVfRkVBVFVSRV9GQVNUX1RPUAorCQkJbiA9IHNzY2FuZihjcCsyLAorCQkJCSIlYyAldSAiICAgICAgICAgICAgICAgLyogc3RhdGUsIHBwaWQgKi8KKwkJCQkiJXUgJXUgJWQgJSpzICIgICAgICAgIC8qIHBnaWQsIHNpZCwgdHR5LCB0cGdpZCAqLworCQkJCSIlKnMgJSpzICUqcyAlKnMgJSpzICIgLyogZmxhZ3MsIG1pbl9mbHQsIGNtaW5fZmx0LCBtYWpfZmx0LCBjbWFqX2ZsdCAqLworCQkJCSIlbHUgJWx1ICIgICAgICAgICAgICAgLyogdXRpbWUsIHN0aW1lICovCisJCQkJIiUqcyAlKnMgJSpzICIgICAgICAgICAvKiBjdXRpbWUsIGNzdGltZSwgcHJpb3JpdHkgKi8KKwkJCQkiJWxkICIgICAgICAgICAgICAgICAgIC8qIG5pY2UgKi8KKwkJCQkiJSpzICUqcyAiICAgICAgICAgICAgIC8qIHRpbWVvdXQsIGl0X3JlYWxfdmFsdWUgKi8KKwkJCQkiJWx1ICIgICAgICAgICAgICAgICAgIC8qIHN0YXJ0X3RpbWUgKi8KKwkJCQkiJWx1ICIgICAgICAgICAgICAgICAgIC8qIHZzaXplICovCisJCQkJIiVsdSAiICAgICAgICAgICAgICAgICAvKiByc3MgKi8KKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX1NNUF9QUk9DRVNTCisJCQkJIiUqcyAlKnMgJSpzICUqcyAlKnMgJSpzICIgLypyc3NfcmxpbSwgc3RhcnRfY29kZSwgZW5kX2NvZGUsIHN0YXJ0X3N0YWNrLCBrc3RrX2VzcCwga3N0a19laXAgKi8KKwkJCQkiJSpzICUqcyAlKnMgJSpzICIgICAgICAgICAvKnNpZ25hbCwgYmxvY2tlZCwgc2lnaWdub3JlLCBzaWdjYXRjaCAqLworCQkJCSIlKnMgJSpzICUqcyAlKnMgIiAgICAgICAgIC8qd2NoYW4sIG5zd2FwLCBjbnN3YXAsIGV4aXRfc2lnbmFsICovCisJCQkJIiVkIiAgICAgICAgICAgICAgICAgICAgICAgLypjcHUgbGFzdCBzZWVuIG9uKi8KKyMgZW5kaWYKKwkJCQksCisJCQkJc3AtPnN0YXRlLCAmc3AtPnBwaWQsCisJCQkJJnNwLT5wZ2lkLCAmc3AtPnNpZCwgJnR0eSwKKwkJCQkmc3AtPnV0aW1lLCAmc3AtPnN0aW1lLAorCQkJCSZ0YXNrbmljZSwKKwkJCQkmc3AtPnN0YXJ0X3RpbWUsCisJCQkJJnZzeiwKKwkJCQkmcnNzCisjIGlmIEVOQUJMRV9GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUworCQkJCSwgJnNwLT5sYXN0X3NlZW5fb25fY3B1CisjIGVuZGlmCisJCQkJKTsKKworCQkJaWYgKG4gPCAxMSkKKwkJCQljb250aW51ZTsgLyogYm9ndXMgZGF0YSwgZ2V0IG5leHQgL3Byb2MvWFhYICovCisjIGlmIEVOQUJMRV9GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUworCQkJaWYgKG4gPT0gMTEpCisJCQkJc3AtPmxhc3Rfc2Vlbl9vbl9jcHUgPSAwOworIyBlbmRpZgorCisJCQkvKiB2c3ogaXMgaW4gYnl0ZXMgYW5kIHdlIHdhbnQga2IgKi8KKwkJCXNwLT52c3ogPSB2c3ogPj4gMTA7CisJCQkvKiB2c3ogaXMgaW4gYnl0ZXMgYnV0IHJzcyBpcyBpbiAqUEFHRVMqISBDYW4geW91IGJlbGlldmUgdGhhdD8gKi8KKwkJCXNwLT5yc3MgPSByc3MgPDwgc3AtPnNoaWZ0X3BhZ2VzX3RvX2tiOworCQkJc3AtPnR0eV9tYWpvciA9ICh0dHkgPj4gOCkgJiAweGZmZjsKKwkJCXNwLT50dHlfbWlub3IgPSAodHR5ICYgMHhmZikgfCAoKHR0eSA+PiAxMikgJiAweGZmZjAwKTsKKyNlbHNlCisvKiBUaGlzIGNvc3RzIH4xMDAgYnl0ZXMgbW9yZSBidXQgbWFrZXMgdG9wIGZhc3RlciBieSAyMCUKKyAqIElmIHlvdSBydW4gMTAwMDAgcHJvY2Vzc2VzLCB0aGlzIG1heSBiZSBpbXBvcnRhbnQgZm9yIHlvdSAqLworCQkJc3AtPnN0YXRlWzBdID0gY3BbMl07CisJCQljcCArPSA0OworCQkJc3AtPnBwaWQgPSBmYXN0X3N0cnRvdWxfMTAoJmNwKTsKKwkJCXNwLT5wZ2lkID0gZmFzdF9zdHJ0b3VsXzEwKCZjcCk7CisJCQlzcC0+c2lkID0gZmFzdF9zdHJ0b3VsXzEwKCZjcCk7CisJCQl0dHkgPSBmYXN0X3N0cnRvdWxfMTAoJmNwKTsKKwkJCXNwLT50dHlfbWFqb3IgPSAodHR5ID4+IDgpICYgMHhmZmY7CisJCQlzcC0+dHR5X21pbm9yID0gKHR0eSAmIDB4ZmYpIHwgKCh0dHkgPj4gMTIpICYgMHhmZmYwMCk7CisJCQljcCA9IHNraXBfZmllbGRzKGNwLCA2KTsgLyogdHBnaWQsIGZsYWdzLCBtaW5fZmx0LCBjbWluX2ZsdCwgbWFqX2ZsdCwgY21hal9mbHQgKi8KKwkJCXNwLT51dGltZSA9IGZhc3Rfc3RydG91bF8xMCgmY3ApOworCQkJc3AtPnN0aW1lID0gZmFzdF9zdHJ0b3VsXzEwKCZjcCk7CisJCQljcCA9IHNraXBfZmllbGRzKGNwLCAzKTsgLyogY3V0aW1lLCBjc3RpbWUsIHByaW9yaXR5ICovCisJCQl0YXNrbmljZSA9IGZhc3Rfc3RydG9sXzEwKCZjcCk7CisJCQljcCA9IHNraXBfZmllbGRzKGNwLCAyKTsgLyogdGltZW91dCwgaXRfcmVhbF92YWx1ZSAqLworCQkJc3AtPnN0YXJ0X3RpbWUgPSBmYXN0X3N0cnRvdWxfMTAoJmNwKTsKKwkJCS8qIHZzeiBpcyBpbiBieXRlcyBhbmQgd2Ugd2FudCBrYiAqLworCQkJc3AtPnZzeiA9IGZhc3Rfc3RydG91bF8xMCgmY3ApID4+IDEwOworCQkJLyogdnN6IGlzIGluIGJ5dGVzIGJ1dCByc3MgaXMgaW4gKlBBR0VTKiEgQ2FuIHlvdSBiZWxpZXZlIHRoYXQ/ICovCisJCQlzcC0+cnNzID0gZmFzdF9zdHJ0b3VsXzEwKCZjcCkgPDwgc3AtPnNoaWZ0X3BhZ2VzX3RvX2tiOworIyBpZiBFTkFCTEVfRkVBVFVSRV9UT1BfU01QX1BST0NFU1MKKwkJCS8qICg2KTogcnNzX3JsaW0sIHN0YXJ0X2NvZGUsIGVuZF9jb2RlLCBzdGFydF9zdGFjaywga3N0a19lc3AsIGtzdGtfZWlwICovCisJCQkvKiAoNCk6IHNpZ25hbCwgYmxvY2tlZCwgc2lnaWdub3JlLCBzaWdjYXRjaCAqLworCQkJLyogKDQpOiB3Y2hhbiwgbnN3YXAsIGNuc3dhcCwgZXhpdF9zaWduYWwgKi8KKwkJCWNwID0gc2tpcF9maWVsZHMoY3AsIDE0KTsKKy8vRklYTUU6IGlzIGl0IHNhZmUgdG8gYXNzdW1lIHRoaXMgZmllbGQgZXhpc3RzPworCQkJc3AtPmxhc3Rfc2Vlbl9vbl9jcHUgPSBmYXN0X3N0cnRvdWxfMTAoJmNwKTsKKyMgZW5kaWYKKyNlbmRpZiAvKiBGRUFUVVJFX0ZBU1RfVE9QICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9QU19BRERJVElPTkFMX0NPTFVNTlMKKwkJCXNwLT5uaWNlbmVzcyA9IHRhc2tuaWNlOworI2VuZGlmCisKKwkJCWlmIChzcC0+dnN6ID09IDAgJiYgc3AtPnN0YXRlWzBdICE9ICdaJykKKwkJCQlzcC0+c3RhdGVbMV0gPSAnVyc7CisJCQllbHNlCisJCQkJc3AtPnN0YXRlWzFdID0gJyAnOworCQkJaWYgKHRhc2tuaWNlIDwgMCkKKwkJCQlzcC0+c3RhdGVbMl0gPSAnPCc7CisJCQllbHNlIGlmICh0YXNrbmljZSkgLyogPiAwICovCisJCQkJc3AtPnN0YXRlWzJdID0gJ04nOworCQkJZWxzZQorCQkJCXNwLT5zdGF0ZVsyXSA9ICcgJzsKKwkJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QTUVNCisJCWlmIChmbGFncyAmIFBTU0NBTl9TTUFQUykKKwkJCXByb2Nwc19yZWFkX3NtYXBzKHBpZCwgJnNwLT5zbWFwcywgTlVMTCwgTlVMTCk7CisjZW5kaWYgLyogVE9QTUVNICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfUFNfQURESVRJT05BTF9DT0xVTU5TCisJCWlmIChmbGFncyAmIFBTU0NBTl9SVUlER0lEKSB7CisJCQlGSUxFICpmaWxlOworCisJCQlzdHJjcHkoZmlsZW5hbWVfdGFpbCwgInN0YXR1cyIpOworCQkJZmlsZSA9IGZvcGVuX2Zvcl9yZWFkKGZpbGVuYW1lKTsKKwkJCWlmIChmaWxlKSB7CisJCQkJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZpbGUpKSB7CisJCQkJCWNoYXIgKnRwOworI2RlZmluZSBTQ0FOX1RXTyhzdHIsIG5hbWUsIHN0YXRlbWVudCkgXAorCWlmICgodHAgPSBpc19wcmVmaXhlZF93aXRoKGJ1Ziwgc3RyKSkgIT0gTlVMTCkgeyBcCisJCXRwID0gc2tpcF93aGl0ZXNwYWNlKHRwKTsgXAorCQlzc2NhbmYodHAsICIldSIsICZzcC0+bmFtZSk7IFwKKwkJc3RhdGVtZW50OyBcCisJfQorCQkJCQlTQ0FOX1RXTygiVWlkOiIsIHJ1aWQsIGNvbnRpbnVlKTsKKwkJCQkJU0NBTl9UV08oIkdpZDoiLCByZ2lkLCBicmVhayk7CisjdW5kZWYgU0NBTl9UV08KKwkJCQl9CisJCQkJZmNsb3NlKGZpbGUpOworCQkJfQorCQl9CisjZW5kaWYgLyogUFNfQURESVRJT05BTF9DT0xVTU5TICovCisJCWlmIChmbGFncyAmIFBTU0NBTl9FWEUpIHsKKwkJCXN0cmNweShmaWxlbmFtZV90YWlsLCAiZXhlIik7CisJCQlmcmVlKHNwLT5leGUpOworCQkJc3AtPmV4ZSA9IHhtYWxsb2NfcmVhZGxpbmsoZmlsZW5hbWUpOworCQl9CisJCS8qIE5vdGU6IGlmIC9wcm9jL1BJRC9jbWRsaW5lIGlzIGVtcHR5LAorCQkgKiBjb2RlIGJlbG93ICJicmVha3MiLiBUaGVyZWZvcmUgaXQgbXVzdCBiZQorCQkgKiB0aGUgbGFzdCBjb2RlIHRvIHBhcnNlIC9wcm9jL1BJRC94eHggZGF0YQorCQkgKiAod2UgdXNlZCB0byBoYXZlIC9wcm9jL1BJRC9leGUgcGFyc2luZyBhZnRlciBpdAorCQkgKiBhbmQgd2VyZSBnZXR0aW5nIHN0YWxlIHNwLT5leGUpLgorCQkgKi8KKyNpZiAwIC8qIFBTU0NBTl9DTUQgaXMgbm90IHVzZWQgKi8KKwkJaWYgKGZsYWdzICYgKFBTU0NBTl9DTUR8UFNTQ0FOX0FSR1YwKSkgeworCQkJZnJlZShzcC0+YXJndjApOworCQkJc3AtPmFyZ3YwID0gTlVMTDsKKwkJCWZyZWUoc3AtPmNtZCk7CisJCQlzcC0+Y21kID0gTlVMTDsKKwkJCXN0cmNweShmaWxlbmFtZV90YWlsLCAiY21kbGluZSIpOworCQkJLyogVE9ETzogdG8gZ2V0IHJpZCBvZiBzaXplIGxpbWl0cywgcmVhZCBpbnRvIG1hbGxvYyBidWYsCisJCQkgKiB0aGVuIHJlYWxsb2MgaXQgZG93biB0byByZWFsIHNpemUuICovCisJCQluID0gcmVhZF90b19idWYoZmlsZW5hbWUsIGJ1Zik7CisJCQlpZiAobiA8PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKGZsYWdzICYgUFNTQ0FOX0FSR1YwKQorCQkJCXNwLT5hcmd2MCA9IHhzdHJkdXAoYnVmKTsKKwkJCWlmIChmbGFncyAmIFBTU0NBTl9DTUQpIHsKKwkJCQlkbyB7CisJCQkJCW4tLTsKKwkJCQkJaWYgKCh1bnNpZ25lZCBjaGFyKShidWZbbl0pIDwgJyAnKQorCQkJCQkJYnVmW25dID0gJyAnOworCQkJCX0gd2hpbGUgKG4pOworCQkJCXNwLT5jbWQgPSB4c3RyZHVwKGJ1Zik7CisJCQl9CisJCX0KKyNlbHNlCisJCWlmIChmbGFncyAmIChQU1NDQU5fQVJHVjB8UFNTQ0FOX0FSR1ZOKSkgeworCQkJZnJlZShzcC0+YXJndjApOworCQkJc3AtPmFyZ3YwID0gTlVMTDsKKwkJCXN0cmNweShmaWxlbmFtZV90YWlsLCAiY21kbGluZSIpOworCQkJbiA9IHJlYWRfdG9fYnVmKGZpbGVuYW1lLCBidWYpOworCQkJaWYgKG4gPD0gMCkKKwkJCQlicmVhazsKKwkJCWlmIChmbGFncyAmIFBTU0NBTl9BUkdWTikgeworCQkJCXNwLT5hcmd2X2xlbiA9IG47CisJCQkJc3AtPmFyZ3YwID0geG1lbWR1cChidWYsIG4gKyAxKTsKKwkJCQkvKiBzcC0+YXJndjBbbl0gPSAnXDAnOyAtIGJ1ZiBoYXMgaXQgKi8KKwkJCX0gZWxzZSB7CisJCQkJc3AtPmFyZ3ZfbGVuID0gMDsKKwkJCQlzcC0+YXJndjAgPSB4c3RyZHVwKGJ1Zik7CisJCQl9CisJCX0KKyNlbmRpZgorCQlicmVhazsKKwl9IC8qIGZvciAoOzspICovCisKKwlyZXR1cm4gc3A7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHJlYWRfY21kbGluZShjaGFyICpidWYsIGludCBjb2wsIHVuc2lnbmVkIHBpZCwgY29uc3QgY2hhciAqY29tbSkKK3sKKwlpbnQgc3o7CisJY2hhciBmaWxlbmFtZVtzaXplb2YoIi9wcm9jLyV1L2NtZGxpbmUiKSArIHNpemVvZihpbnQpKjNdOworCisJc3ByaW50ZihmaWxlbmFtZSwgIi9wcm9jLyV1L2NtZGxpbmUiLCBwaWQpOworCXN6ID0gb3Blbl9yZWFkX2Nsb3NlKGZpbGVuYW1lLCBidWYsIGNvbCAtIDEpOworCWlmIChzeiA+IDApIHsKKwkJY29uc3QgY2hhciAqYmFzZTsKKwkJaW50IGNvbW1fbGVuOworCisJCWJ1Zltzel0gPSAnXDAnOworCQl3aGlsZSAoLS1zeiA+PSAwICYmIGJ1Zltzel0gPT0gJ1wwJykKKwkJCWNvbnRpbnVlOworCQkvKiBQcmV2ZW50IGJhc2VuYW1lKCJwcm9jZXNzIGZvby9iYXIiKSA9ICJiYXIiICovCisJCXN0cmNocm51bChidWYsICcgJylbMF0gPSAnXDAnOworCQliYXNlID0gYmJfYmFzZW5hbWUoYnVmKTsgLyogYmVmb3JlIHdlIHJlcGxhY2UgYXJndjAncyBOVUwgd2l0aCBzcGFjZSAqLworCQl3aGlsZSAoc3ogPj0gMCkgeworCQkJaWYgKCh1bnNpZ25lZCBjaGFyKShidWZbc3pdKSA8ICcgJykKKwkJCQlidWZbc3pdID0gJyAnOworCQkJc3otLTsKKwkJfQorCisJCS8qIElmIGNvbW0gZGlmZmVycyBmcm9tIGFyZ3YwLCBwcmVwZW5kICJ7Y29tbX0gIi4KKwkJICogSXQgYWxsb3dzIHRvIHNlZSB0aHJlYWQgbmFtZXMgc2V0IGJ5IHByY3RsKFBSX1NFVF9OQU1FKS4KKwkJICovCisJCWlmIChiYXNlWzBdID09ICctJykgLyogIi1zaCIgKGxvZ2luIHNoZWxsKT8gKi8KKwkJCWJhc2UrKzsKKwkJY29tbV9sZW4gPSBzdHJsZW4oY29tbSk7CisJCS8qIFdoeSBjb21wYXJlIHVwIHRvIGNvbW1fbGVuLCBub3QgQ09NTV9MRU4tMT8KKwkJICogV2VsbCwgc29tZSBwcm9jZXNzZXMgcmV3cml0ZSBhcmd2LCBhbmQgdXNlIF9zcGFjZXNfIHRoZXJlCisJCSAqIHdoaWxlIHJld3JpdGluZy4gKEtERSBpcyBvYnNlcnZlZCB0byBkbyBpdCkuCisJCSAqIEkgcHJlZmVyIHRvIHN0aWxsIHRyZWF0IGFyZ3YwICJwcm9jZXNzIGZvbyBiYXIiCisJCSAqIGFzICdlcXVhbCcgdG8gY29tbSAicHJvY2VzcyIuCisJCSAqLworCQlpZiAoc3RybmNtcChiYXNlLCBjb21tLCBjb21tX2xlbikgIT0gMCkgeworCQkJY29tbV9sZW4gKz0gMzsKKwkJCWlmIChjb2wgPiBjb21tX2xlbikKKwkJCQltZW1tb3ZlKGJ1ZiArIGNvbW1fbGVuLCBidWYsIGNvbCAtIGNvbW1fbGVuKTsKKwkJCXNucHJpbnRmKGJ1ZiwgY29sLCAieyVzfSIsIGNvbW0pOworCQkJaWYgKGNvbCA8PSBjb21tX2xlbikKKwkJCQlyZXR1cm47CisJCQlidWZbY29tbV9sZW4gLSAxXSA9ICcgJzsKKwkJCWJ1Zltjb2wgLSAxXSA9ICdcMCc7CisJCX0KKwl9IGVsc2UgeworCQlzbnByaW50ZihidWYsIGNvbCwgIlslc10iLCBjb21tKTsKKwl9Cit9CisKKy8qIGZyb20ga2VybmVsOgorCS8vICAgICAgICAgICAgIHBpZCBjb21tIFMgcHBpZCBwZ2lkIHNpZCB0dHlfbnIgdHR5X3BncnAgZmxnCisJc3ByaW50ZihidWZmZXIsIiVkICglcykgJWMgJWQgICVkICAgJWQgICVkICAgICAlZCAgICAgICAlbHUgJWx1IFwKKyVsdSAlbHUgJWx1ICVsdSAlbHUgJWxkICVsZCAlbGQgJWxkICVkIDAgJWxsdSAlbHUgJWxkICVsdSAlbHUgJWx1ICVsdSAlbHUgXAorJWx1ICVsdSAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsdSAlZCAlZCAlbHUgJWx1ICVsbHVcbiIsCisJCXRhc2stPnBpZCwKKwkJdGNvbW0sCisJCXN0YXRlLAorCQlwcGlkLAorCQlwZ2lkLAorCQlzaWQsCisJCXR0eV9uciwKKwkJdHR5X3BncnAsCisJCXRhc2stPmZsYWdzLAorCQltaW5fZmx0LAorCQljbWluX2ZsdCwKKwkJbWFqX2ZsdCwKKwkJY21hal9mbHQsCisJCWNwdXRpbWVfdG9fY2xvY2tfdCh1dGltZSksCisJCWNwdXRpbWVfdG9fY2xvY2tfdChzdGltZSksCisJCWNwdXRpbWVfdG9fY2xvY2tfdChjdXRpbWUpLAorCQljcHV0aW1lX3RvX2Nsb2NrX3QoY3N0aW1lKSwKKwkJcHJpb3JpdHksCisJCW5pY2UsCisJCW51bV90aHJlYWRzLAorCQkvLyAwLAorCQlzdGFydF90aW1lLAorCQl2c2l6ZSwKKwkJbW0gPyBnZXRfbW1fcnNzKG1tKSA6IDAsCisJCXJzc2xpbSwKKwkJbW0gPyBtbS0+c3RhcnRfY29kZSA6IDAsCisJCW1tID8gbW0tPmVuZF9jb2RlIDogMCwKKwkJbW0gPyBtbS0+c3RhcnRfc3RhY2sgOiAwLAorCQllc3AsCisJCWVpcCwKK3RoZSByZXN0IGlzIHNvbWUgb2Jzb2xldGUgY3J1ZnQKKyovCmRpZmYgLS1naXQgYS9saWJiYi9wcm9ncmVzcy5jIGIvbGliYmIvcHJvZ3Jlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzJmZWIwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvcHJvZ3Jlc3MuYwpAQCAtMCwwICsxLDIwNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogUHJvZ3Jlc3MgYmFyIGNvZGUuCisgKi8KKy8qIE9yaWdpbmFsIGNvcHlyaWdodCBub3RpY2Ugd2hpY2ggYXBwbGllcyB0byB0aGUgQ09ORklHX0ZFQVRVUkVfV0dFVF9TVEFUVVNCQVIgc3R1ZmYsCisgKiBtdWNoIG9mIHdoaWNoIHdhcyBibGF0YW50bHkgc3RvbGVuIGZyb20gb3BlbnNzaC4KKyAqLworLyotCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIsIDE5OTMKKyAqIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEJTRCBBZHZlcnRpc2luZyBDbGF1c2Ugb21pdHRlZCBwZXIgdGhlIEp1bHkgMjIsIDE5OTkgbGljZW5zaW5nIGNoYW5nZQorICogICAgZnRwOi8vZnRwLmNzLmJlcmtlbGV5LmVkdS9wdWIvNGJzZC9SRUFETUUuSW1wdC5MaWNlbnNlLkNoYW5nZQorICoKKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInVuaWNvZGUuaCIKKworZW51bSB7CisJLyogU2Vjb25kcyB3aGVuIHhmZXIgY29uc2lkZXJlZCAic3RhbGxlZCIgKi8KKwlTVEFMTFRJTUUgPSA1Cit9OworCitzdGF0aWMgdW5zaWduZWQgaW50IGdldF90dHkyX3dpZHRoKHZvaWQpCit7CisJdW5zaWduZWQgd2lkdGg7CisJZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodCgyLCAmd2lkdGgsIE5VTEwpOworCXJldHVybiB3aWR0aDsKK30KKwordm9pZCBGQVNUX0ZVTkMgYmJfcHJvZ3Jlc3NfaW5pdChiYl9wcm9ncmVzc190ICpwLCBjb25zdCBjaGFyICpjdXJmaWxlKQoreworI2lmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwlpbml0X3VuaWNvZGUoKTsKKwlwLT5jdXJmaWxlID0gdW5pY29kZV9jb252X3RvX3ByaW50YWJsZV9maXhlZHdpZHRoKC8qTlVMTCwqLyBjdXJmaWxlLCAyMCk7CisjZWxzZQorCXAtPmN1cmZpbGUgPSBjdXJmaWxlOworI2VuZGlmCisJcC0+c3RhcnRfc2VjID0gbW9ub3RvbmljX3NlYygpOworCXAtPmxhc3RfdXBkYXRlX3NlYyA9IHAtPnN0YXJ0X3NlYzsKKwlwLT5sYXN0X2NoYW5nZV9zZWMgPSBwLT5zdGFydF9zZWM7CisJcC0+bGFzdF9zaXplID0gMDsKK30KKworLyogRmlsZSBhbHJlYWR5IGhhZCBiZWdfc2l6ZSBieXRlcy4KKyAqIFRoZW4gd2Ugc3RhcnRlZCBkb3dubG9hZGluZy4KKyAqIFdlIGRvd25sb2FkZWQgInRyYW5zZmVycmVkIiBieXRlcyBzbyBmYXIuCisgKiBEb3dubG9hZCBpcyBleHBlY3RlZCB0byBzdG9wIHdoZW4gdG90YWwgc2l6ZSAoYmVnX3NpemUgKyB0cmFuc2ZlcnJlZCkKKyAqIHdpbGwgYmUgInRvdGFsc2l6ZSIgYnl0ZXMuCisgKiBJZiB0b3RhbHNpemUgPT0gMCwgdGhlbiBpdCBpcyB1bmtub3duLgorICovCit2b2lkIEZBU1RfRlVOQyBiYl9wcm9ncmVzc191cGRhdGUoYmJfcHJvZ3Jlc3NfdCAqcCwKKwkJdW9mZl90IGJlZ19zaXplLAorCQl1b2ZmX3QgdHJhbnNmZXJyZWQsCisJCXVvZmZfdCB0b3RhbHNpemUpCit7CisJdW9mZl90IGJlZ19hbmRfdHJhbnNmZXJyZWQ7CisJdW5zaWduZWQgc2luY2VfbGFzdF91cGRhdGUsIGVsYXBzZWQ7CisJaW50IGJhcmxlbmd0aDsKKwlpbnQga2lsb3NjYWxlOworCisJLy90cmFuc2ZlcnJlZCA9IDEyMzQ7IC8qIHVzZSBmb3Igc3RhbGwgZGV0ZWN0aW9uIHRlc3RpbmcgKi8KKwkvL3RvdGFsc2l6ZSA9IDA7IC8qIHVzZSBmb3IgdW5rbm93biBzaXplIGRvd25sb2FkIHRlc3RpbmcgKi8KKworCWVsYXBzZWQgPSBtb25vdG9uaWNfc2VjKCk7CisJc2luY2VfbGFzdF91cGRhdGUgPSBlbGFwc2VkIC0gcC0+bGFzdF91cGRhdGVfc2VjOworCXAtPmxhc3RfdXBkYXRlX3NlYyA9IGVsYXBzZWQ7CisKKwlpZiAodG90YWxzaXplICE9IDAgJiYgdHJhbnNmZXJyZWQgPj0gdG90YWxzaXplIC0gYmVnX3NpemUpIHsKKwkJLyogTGFzdCBjYWxsLiBEbyBub3Qgc2tpcCB0aGlzIHVwZGF0ZSAqLworCQl0cmFuc2ZlcnJlZCA9IHRvdGFsc2l6ZSAtIGJlZ19zaXplOyAvKiBzYW5pdGl6ZSBqdXN0IGluIGNhc2UgKi8KKwl9CisJZWxzZSBpZiAoc2luY2VfbGFzdF91cGRhdGUgPT0gMCkgeworCQkvKgorCQkgKiBEbyBub3QgdXBkYXRlIG9uIGV2ZXJ5IGNhbGwKKwkJICogKHdlIGNhbiBiZSBjYWxsZWQgb24gZXZlcnkgbmV0d29yayByZWFkISkKKwkJICovCisJCXJldHVybjsKKwl9CisKKwlraWxvc2NhbGUgPSAwOworCS8qCisJICogU2NhbGUgc2l6ZXMgZG93biBpZiB0aGV5IGFyZSBjbG9zZSB0byBvdmVyZmxvd2luZy4KKwkgKiBUaGlzIGFsbG93cyBjYWxjdWxhdGlvbnMgbGlrZSAoMTAwICogdHJhbnNmZXJyZWQgLyB0b3RhbHNpemUpCisJICogd2l0aG91dCByaXNraW5nIG92ZXJmbG93OiB3ZSBndWFyYW50ZWUgMTAgaGlnaGVzdCBiaXRzIHRvIGJlIDAuCisJICogSW50cm9kdWNlZCBlcnJvciBpcyBsZXNzIHRoYW4gMSAvIDJeMTIgfj0gMC4wMjUlCisJICovCisJaWYgKFVMT05HX01BWCA+IDB4ZmZmZmZmZmYgfHwgc2l6ZW9mKG9mZl90KSA9PSA0IHx8IHNpemVvZihvZmZfdCkgIT0gOCkgeworCQkvKgorCQkgKiA2NC1iaXQgQ1BVIHx8IHNtYWxsIG9mZl90OiBpbiBlaXRoZXIgY2FzZSwKKwkJICogPj4gaXMgY2hlYXAsIHNpbmdsZS13b3JkIG9wZXJhdGlvbi4KKwkJICogLi4uIHx8IHN0cmFuZ2Ugb2ZmX3Q6IGFsc28gdXNlIHRoaXMgY29kZQorCQkgKiAoaXQgaXMgc2FmZSwganVzdCBzdWJvcHRpbWFsIHdydCBjb2RlIHNpemUpLAorCQkgKiBiZWNhdXNlIDMyLzY0IG9wdGltaXplZCBvbmUgd29ya3Mgb25seSBmb3IgNjQtYml0IG9mZl90LgorCQkgKi8KKwkJaWYgKHRvdGFsc2l6ZSA+PSAoMSA8PCAyMikpIHsKKwkJCXRvdGFsc2l6ZSA+Pj0gMTA7CisJCQliZWdfc2l6ZSA+Pj0gMTA7CisJCQl0cmFuc2ZlcnJlZCA+Pj0gMTA7CisJCQlraWxvc2NhbGUgPSAxOworCQl9CisJfSBlbHNlIHsKKwkJLyogMzItYml0IENQVSBhbmQgNjQtYml0IG9mZl90LgorCQkgKiBVc2UgYSA0MC1iaXQgc2hpZnQsIGl0IGlzIGVhc2llciB0byBkbyBvbiAzMi1iaXQgQ1BVLgorCQkgKi8KKy8qIE9ORSBzdXBwcmVzc2VzICJ3YXJuaW5nOiBzaGlmdCBjb3VudCA+PSB3aWR0aCBvZiB0eXBlIiAqLworI2RlZmluZSBPTkUgKHNpemVvZihvZmZfdCkgPiA0KQorCQlpZiAodG90YWxzaXplID49ICh1b2ZmX3QpKDFVTEwgPDwgNTQqT05FKSkgeworCQkJdG90YWxzaXplID0gKHVpbnQzMl90KSh0b3RhbHNpemUgPj4gMzIqT05FKSA+PiA4OworCQkJYmVnX3NpemUgPSAodWludDMyX3QpKGJlZ19zaXplID4+IDMyKk9ORSkgPj4gODsKKwkJCXRyYW5zZmVycmVkID0gKHVpbnQzMl90KSh0cmFuc2ZlcnJlZCA+PiAzMipPTkUpID4+IDg7CisJCQlraWxvc2NhbGUgPSA0OworCQl9CisJfQorCisJaWYgKEVOQUJMRV9VTklDT0RFX1NVUFBPUlQpCisJCWZwcmludGYoc3RkZXJyLCAiXHIlcyIsIHAtPmN1cmZpbGUpOworCWVsc2UKKwkJZnByaW50ZihzdGRlcnIsICJcciUtMjAuMjBzIiwgcC0+Y3VyZmlsZSk7CisKKwliZWdfYW5kX3RyYW5zZmVycmVkID0gYmVnX3NpemUgKyB0cmFuc2ZlcnJlZDsKKworCWlmICh0b3RhbHNpemUgIT0gMCkgeworCQl1bnNpZ25lZCByYXRpbyA9IDEwMCAqIGJlZ19hbmRfdHJhbnNmZXJyZWQgLyB0b3RhbHNpemU7CisJCWZwcmludGYoc3RkZXJyLCAiJTR1JSUiLCByYXRpbyk7CisKKwkJYmFybGVuZ3RoID0gZ2V0X3R0eTJfd2lkdGgoKSAtIDQ5OworCQlpZiAoYmFybGVuZ3RoID4gMCkgeworCQkJLyogZ29kIGJsZXNzIGdjYyBmb3IgdmFyaWFibGUgYXJyYXlzIDopICovCisJCQljaGFyIGJ1ZltiYXJsZW5ndGggKyAxXTsKKwkJCXVuc2lnbmVkIHN0YXJzID0gKHVuc2lnbmVkKWJhcmxlbmd0aCAqIGJlZ19hbmRfdHJhbnNmZXJyZWQgLyB0b3RhbHNpemU7CisJCQltZW1zZXQoYnVmLCAnICcsIGJhcmxlbmd0aCk7CisJCQlidWZbYmFybGVuZ3RoXSA9ICdcMCc7CisJCQltZW1zZXQoYnVmLCAnKicsIHN0YXJzKTsKKwkJCWZwcmludGYoc3RkZXJyLCAiIHwlc3wiLCBidWYpOworCQl9CisJfQorCisJd2hpbGUgKGJlZ19hbmRfdHJhbnNmZXJyZWQgPj0gMTAwMDAwKSB7CisJCWJlZ19hbmRfdHJhbnNmZXJyZWQgPj49IDEwOworCQlraWxvc2NhbGUrKzsKKwl9CisJLyogc2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVGVyYSAqLworCWZwcmludGYoc3RkZXJyLCAiJTZ1JWMiLCAodW5zaWduZWQpYmVnX2FuZF90cmFuc2ZlcnJlZCwgIiBrTUdUUEVaWSJba2lsb3NjYWxlXSk7CisjZGVmaW5lIGJlZ19hbmRfdHJhbnNmZXJyZWQgZG9udF91c2VfYmVnX2FuZF90cmFuc2ZlcnJlZF9iZWxvdygpCisKKwlzaW5jZV9sYXN0X3VwZGF0ZSA9IGVsYXBzZWQgLSBwLT5sYXN0X2NoYW5nZV9zZWM7CisJaWYgKCh1bnNpZ25lZCl0cmFuc2ZlcnJlZCAhPSBwLT5sYXN0X3NpemUpIHsKKwkJcC0+bGFzdF9jaGFuZ2Vfc2VjID0gZWxhcHNlZDsKKwkJcC0+bGFzdF9zaXplID0gKHVuc2lnbmVkKXRyYW5zZmVycmVkOworCQlpZiAoc2luY2VfbGFzdF91cGRhdGUgPj0gU1RBTExUSU1FKSB7CisJCQkvKiBXZSAiY3V0IG91dCIgdGhlc2Ugc2Vjb25kcyBmcm9tIGVsYXBzZWQgdGltZQorCQkJICogYnkgYWRqdXN0aW5nIHN0YXJ0IHRpbWUgKi8KKwkJCXAtPnN0YXJ0X3NlYyArPSBzaW5jZV9sYXN0X3VwZGF0ZTsKKwkJfQorCQlzaW5jZV9sYXN0X3VwZGF0ZSA9IDA7IC8qIHdlIGFyZSB1bi1zdGFsbGVkIG5vdyAqLworCX0KKworCWVsYXBzZWQgLT0gcC0+c3RhcnRfc2VjOyAvKiBub3cgaXQncyAiZWxhcHNlZCBzaW5jZSBzdGFydCIgKi8KKworCWlmIChzaW5jZV9sYXN0X3VwZGF0ZSA+PSBTVEFMTFRJTUUpIHsKKwkJZnByaW50ZihzdGRlcnIsICIgIC0gc3RhbGxlZCAtIik7CisJfSBlbHNlIGlmICghdG90YWxzaXplIHx8ICF0cmFuc2ZlcnJlZCB8fCAoaW50KWVsYXBzZWQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiIC0tOi0tOi0tIEVUQSIpOworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGV0YSwgc2VjcywgaG91cnM7CisKKwkJdG90YWxzaXplIC09IGJlZ19zaXplOyAvKiBub3cgaXQncyAidG90YWwgdG8gdXBsb2FkIiAqLworCisJCS8qIEVzdGltYXRlZCByZW1haW5pbmcgdGltZSA9CisJCSAqIGVzdGltYXRlZF9zZWNfdG9fZGxfdG90YWxzaXplX2J5dGVzIC0gZWxhcHNlZF9zZWMgPQorCQkgKiB0b3RhbHNpemUgLyBhdmVyYWdlX2J5dGVzX3NlY19zb19mYXIgLSBlbGFwc2VkID0KKwkJICogdG90YWxzaXplIC8gKHRyYW5zZmVycmVkL2VsYXBzZWQpIC0gZWxhcHNlZCA9CisJCSAqIHRvdGFsc2l6ZSAqIGVsYXBzZWQgLyB0cmFuc2ZlcnJlZCAtIGVsYXBzZWQKKwkJICovCisJCWV0YSA9IHRvdGFsc2l6ZSAqIGVsYXBzZWQgLyB0cmFuc2ZlcnJlZCAtIGVsYXBzZWQ7CisJCWlmIChldGEgPj0gMTAwMCo2MCo2MCkKKwkJCWV0YSA9IDEwMDAqNjAqNjAgLSAxOworCQlzZWNzID0gZXRhICUgMzYwMDsKKwkJaG91cnMgPSBldGEgLyAzNjAwOworCQlmcHJpbnRmKHN0ZGVyciwgIiUzdTolMDJ1OiUwMnUgRVRBIiwgaG91cnMsIHNlY3MgLyA2MCwgc2VjcyAlIDYwKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9saWJiYi9wdHJfdG9fZ2xvYmFscy5jIGIvbGliYmIvcHRyX3RvX2dsb2JhbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDc0NTM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvcHRyX3RvX2dsb2JhbHMuYwpAQCAtMCwwICsxLDM1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorCitzdHJ1Y3QgZ2xvYmFsczsKKworI2lmbmRlZiBHQ0NfQ09NQklORQorCisvKiBXZSBjaGVhdCBoZXJlLiBJdCBpcyBkZWNsYXJlZCBhcyBjb25zdCBwdHIgaW4gbGliYmIuaCwKKyAqIGJ1dCBoZXJlIHdlIG1ha2UgaXQgbGl2ZSBpbiBSL1cgbWVtb3J5ICovCitzdHJ1Y3QgZ2xvYmFscyAqcHRyX3RvX2dsb2JhbHM7CisKKyNpZmRlZiBfX0dMSUJDX18KK2ludCAqYmJfZXJybm87CisjZW5kaWYKKworCisjZWxzZQorCisKKy8qIGdjYyAtY29tYmluZSB3aWxsIHNlZSB0aHJvdWdoIGFuZCBjb21wbGFpbiAqLworLyogVXNpbmcgYWx0ZXJuYXRpdmUgbWV0aG9kIHdoaWNoIGlzIG1vcmUgbGlrZWx5IHRvIGJyZWFrCisgKiBvbiB3ZWlyZCBhcmNoaXRlY3R1cmVzLCBjb21waWxlcnMsIGxpbmtlcnMgYW5kIHNvIG9uICovCitzdHJ1Y3QgZ2xvYmFscyAqY29uc3QgcHRyX3RvX2dsb2JhbHMgX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24gKCIuZGF0YSIpKSk7CisKKyNpZmRlZiBfX0dMSUJDX18KK2ludCAqY29uc3QgYmJfZXJybm8gX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24gKCIuZGF0YSIpKSk7CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJiYi9wd19lbmNyeXB0LmMgYi9saWJiYi9wd19lbmNyeXB0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZjNzAzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3B3X2VuY3J5cHQuYwpAQCAtMCwwICsxLDE1NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogc3RhdGljIGNvbnN0IHVpbnQ4X3QgYXNjaWk2NFtdID0KKyAqICIuLzAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKKyAqLworCitzdGF0aWMgaW50IGk2NGMoaW50IGkpCit7CisJaSAmPSAweDNmOworCWlmIChpID09IDApCisJCXJldHVybiAnLic7CisJaWYgKGkgPT0gMSkKKwkJcmV0dXJuICcvJzsKKwlpZiAoaSA8IDEyKQorCQlyZXR1cm4gKCcwJyAtIDIgKyBpKTsKKwlpZiAoaSA8IDM4KQorCQlyZXR1cm4gKCdBJyAtIDEyICsgaSk7CisJcmV0dXJuICgnYScgLSAzOCArIGkpOworfQorCitpbnQgRkFTVF9GVU5DIGNyeXB0X21ha2Vfc2FsdChjaGFyICpwLCBpbnQgY250IC8qLCBpbnQgeCAqLykKK3sKKwkvKiB3YXM6IHggKz0gLi4uICovCisJaW50IHggPSBnZXRwaWQoKSArIG1vbm90b25pY191cygpOworCWRvIHsKKwkJLyogeCA9ICh4KjE2NjQ1MjUgKyAxMDEzOTA0MjIzKSAlIDJeMzIgZ2VuZXJhdG9yIGlzIGxhbWUKKwkJICogKGxvdy1vcmRlciBiaXQgaXMgbm90ICJyYW5kb20iLCBldGMuLi4pLAorCQkgKiBidXQgZm9yIG91ciBwdXJwb3NlcyBpdCBpcyBnb29kIGVub3VnaCAqLworCQl4ID0geCoxNjY0NTI1ICsgMTAxMzkwNDIyMzsKKwkJLyogQlRXLCBQYXJrIGFuZCBNaWxsZXIncyAibWluaW1hbCBzdGFuZGFyZCBnZW5lcmF0b3IiIGlzCisJCSAqIHggPSB4KjE2ODA3ICUgKCgyXjMxKS0xKQorCQkgKiBJdCBoYXMgbm8gcHJvYmxlbSB3aXRoIHZpc2libHkgYWx0ZXJuYXRpbmcgbG93ZXN0IGJpdAorCQkgKiBidXQgaXMgYWxzbyB3ZWFrIGluIGNyeXB0b2dyYXBoaWMgc2Vuc2UgKyBuZWVkcyBkaXYsCisJCSAqIHdoaWNoIG5lZWRzIG1vcmUgY29kZSAoYW5kIHNsb3dlcikgb24gbWFueSBDUFVzICovCisJCSpwKysgPSBpNjRjKHggPj4gMTYpOworCQkqcCsrID0gaTY0Yyh4ID4+IDIyKTsKKwl9IHdoaWxlICgtLWNudCk7CisJKnAgPSAnXDAnOworCXJldHVybiB4OworfQorCitjaGFyKiBGQVNUX0ZVTkMgY3J5cHRfbWFrZV9wd19zYWx0KGNoYXIgc2FsdFtNQVhfUFdfU0FMVF9MRU5dLCBjb25zdCBjaGFyICphbGdvKQoreworCWludCBsZW4gPSAyLzI7CisJY2hhciAqc2FsdF9wdHIgPSBzYWx0OworCWlmIChhbGdvWzBdICE9ICdkJykgeyAvKiBub3QgZGVzICovCisJCWxlbiA9IDgvMjsgLyogc28gZmFyIGFzc3VtaW5nIG1kNSAqLworCQkqc2FsdF9wdHIrKyA9ICckJzsKKwkJKnNhbHRfcHRyKysgPSAnMSc7CisJCSpzYWx0X3B0cisrID0gJyQnOworI2lmICFFTkFCTEVfVVNFX0JCX0NSWVBUIHx8IEVOQUJMRV9VU0VfQkJfQ1JZUFRfU0hBCisJCWlmIChhbGdvWzBdID09ICdzJykgeyAvKiBzaGEgKi8KKwkJCXNhbHRbMV0gPSAnNScgKyAoc3RyY21wKGFsZ28sICJzaGE1MTIiKSA9PSAwKTsKKwkJCWxlbiA9IDE2LzI7CisJCX0KKyNlbmRpZgorCX0KKwljcnlwdF9tYWtlX3NhbHQoc2FsdF9wdHIsIGxlbik7CisJcmV0dXJuIHNhbHRfcHRyOworfQorCisjaWYgRU5BQkxFX1VTRV9CQl9DUllQVAorCitzdGF0aWMgY2hhcioKK3RvNjQoY2hhciAqcywgdW5zaWduZWQgdiwgaW50IG4pCit7CisJd2hpbGUgKC0tbiA+PSAwKSB7CisJCS8qICpzKysgPSBhc2NpaTY0W3YgJiAweDNmXTsgKi8KKwkJKnMrKyA9IGk2NGModik7CisJCXYgPj49IDY7CisJfQorCXJldHVybiBzOworfQorCisvKgorICogREVTIGFuZCBNRDUgY3J5cHQgaW1wbGVtZW50YXRpb25zIGFyZSB0YWtlbiBmcm9tIHVjbGliYy4KKyAqIFRoZXkgd2VyZSBtb2RpZmllZCB0byBub3QgdXNlIHN0YXRpYyBidWZmZXJzLgorICovCisKKyNpbmNsdWRlICJwd19lbmNyeXB0X2Rlcy5jIgorI2luY2x1ZGUgInB3X2VuY3J5cHRfbWQ1LmMiCisjaWYgRU5BQkxFX1VTRV9CQl9DUllQVF9TSEEKKyNpbmNsdWRlICJwd19lbmNyeXB0X3NoYS5jIgorI2VuZGlmCisKKy8qIE90aGVyIGFkdmFuY2VkIGNyeXB0IGlkcyAoVE9ETz8pOiAqLworLyogJDIkIG9yICQyYSQ6IEJsb3dmaXNoICovCisKK3N0YXRpYyBzdHJ1Y3QgY29uc3RfZGVzX2N0eCAqZGVzX2NjdHg7CitzdGF0aWMgc3RydWN0IGRlc19jdHggKmRlc19jdHg7CisKKy8qIG15X2NyeXB0IHJldHVybnMgbWFsbG9jJ2VkIGRhdGEgKi8KK3N0YXRpYyBjaGFyICpteV9jcnlwdChjb25zdCBjaGFyICprZXksIGNvbnN0IGNoYXIgKnNhbHQpCit7CisJLyogTUQ1IG9yIFNIQT8gKi8KKwlpZiAoc2FsdFswXSA9PSAnJCcgJiYgc2FsdFsxXSAmJiBzYWx0WzJdID09ICckJykgeworCQlpZiAoc2FsdFsxXSA9PSAnMScpCisJCQlyZXR1cm4gbWQ1X2NyeXB0KHh6YWxsb2MoTUQ1X09VVF9CVUZTSVpFKSwgKHVuc2lnbmVkIGNoYXIqKWtleSwgKHVuc2lnbmVkIGNoYXIqKXNhbHQpOworI2lmIEVOQUJMRV9VU0VfQkJfQ1JZUFRfU0hBCisJCWlmIChzYWx0WzFdID09ICc1JyB8fCBzYWx0WzFdID09ICc2JykKKwkJCXJldHVybiBzaGFfY3J5cHQoKGNoYXIqKWtleSwgKGNoYXIqKXNhbHQpOworI2VuZGlmCisJfQorCisJaWYgKCFkZXNfY2N0eCkKKwkJZGVzX2NjdHggPSBjb25zdF9kZXNfaW5pdCgpOworCWRlc19jdHggPSBkZXNfaW5pdChkZXNfY3R4LCBkZXNfY2N0eCk7CisJcmV0dXJuIGRlc19jcnlwdChkZXNfY3R4LCB4emFsbG9jKERFU19PVVRfQlVGU0laRSksICh1bnNpZ25lZCBjaGFyKilrZXksICh1bnNpZ25lZCBjaGFyKilzYWx0KTsKK30KKworLyogU28gZmFyIG5vYm9keSB3YW50cyB0byBoYXZlIGl0IHB1YmxpYyAqLworc3RhdGljIHZvaWQgbXlfY3J5cHRfY2xlYW51cCh2b2lkKQoreworCWZyZWUoZGVzX2NjdHgpOworCWZyZWUoZGVzX2N0eCk7CisJZGVzX2NjdHggPSBOVUxMOworCWRlc19jdHggPSBOVUxMOworfQorCitjaGFyKiBGQVNUX0ZVTkMgcHdfZW5jcnlwdChjb25zdCBjaGFyICpjbGVhciwgY29uc3QgY2hhciAqc2FsdCwgaW50IGNsZWFudXApCit7CisJY2hhciAqZW5jcnlwdGVkOworCisJZW5jcnlwdGVkID0gbXlfY3J5cHQoY2xlYXIsIHNhbHQpOworCisJaWYgKGNsZWFudXApCisJCW15X2NyeXB0X2NsZWFudXAoKTsKKworCXJldHVybiBlbmNyeXB0ZWQ7Cit9CisKKyNlbHNlIC8qIGlmICFFTkFCTEVfVVNFX0JCX0NSWVBUICovCisKK2NoYXIqIEZBU1RfRlVOQyBwd19lbmNyeXB0KGNvbnN0IGNoYXIgKmNsZWFyLCBjb25zdCBjaGFyICpzYWx0LCBpbnQgY2xlYW51cCkKK3sKKwljaGFyICpzOworCisJcyA9IGNyeXB0KGNsZWFyLCBzYWx0KTsKKwkvKgorCSAqIGdsaWJjIHVzZWQgdG8gcmV0dXJuICIiIG9uIG1hbGZvcm1lZCBzYWx0cyAoZm9yIGV4YW1wbGUsICIiKSwKKwkgKiBidXQgc2luY2UgMi4xNyBpdCByZXR1cm5zIE5VTEwuCisJICovCisJcmV0dXJuIHhzdHJkdXAocyA/IHMgOiAiIik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYmIvcHdfZW5jcnlwdF9kZXMuYyBiL2xpYmJiL3B3X2VuY3J5cHRfZGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhlMDJkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3B3X2VuY3J5cHRfZGVzLmMKQEAgLTAsMCArMSw4MjAgQEAKKy8qCisgKiBGcmVlU2VjOiBsaWJjcnlwdCBmb3IgTmV0QlNECisgKgorICogQ29weXJpZ2h0IChjKSAxOTk0IERhdmlkIEJ1cnJlbgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBBZGFwdGVkIGZvciBGcmVlQlNELTIuMCBieSBHZW9mZnJleSBNLiBSZWhtZXQKKyAqCXRoaXMgZmlsZSBzaG91bGQgbm93ICpvbmx5KiBleHBvcnQgY3J5cHQoKSwgaW4gb3JkZXIgdG8gbWFrZQorICoJYmluYXJpZXMgb2YgbGliY3J5cHQgZXhwb3J0YWJsZSBmcm9tIHRoZSBVU0EKKyAqCisgKiBBZGFwdGVkIGZvciBGcmVlQlNELTQuMCBieSBNYXJrIFIgViBNdXJyYXkKKyAqCXRoaXMgZmlsZSBzaG91bGQgbm93ICpvbmx5KiBleHBvcnQgY3J5cHRfZGVzKCksIGluIG9yZGVyIHRvIG1ha2UKKyAqCWEgbW9kdWxlIHRoYXQgY2FuIGJlIG9wdGlvbmFsbHkgaW5jbHVkZWQgaW4gbGliY3J5cHQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBhdXRob3Igbm9yIHRoZSBuYW1lcyBvZiBvdGhlciBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKgorICogVGhpcyBpcyBhbiBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgREVTIGFuZCB0aGUgY3J5cHQoMykgaW50ZXJmYWNlcworICogYnkgRGF2aWQgQnVycmVuIDxkYXZpZGJAd2Vyai5jb20uYXU+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+PiAxNikpOworCS8qIGJpdHMgMTUuLjAgb2YgcjEgYW5kIHR3byB6ZXJvIGJpdHMgKHBsdXMgZXh0cmEgemVybyBieXRlKSAqLworCXRvNjRfbXNiX2ZpcnN0KG91dHB1dCArIDEwLCAocjEgPDwgOCkpOworCS8qIGV4dHJhIHplcm8gYnl0ZSBpcyBlbmNvZGVkIGFzICcuJywgZml4aW5nIGl0ICovCisJb3V0cHV0WzEzXSA9ICdcMCc7CisjZW5kaWYKKworCXJldHVybiBvdXRwdXQ7Cit9CisKKyN1bmRlZiBVU0VfUFJFQ09NUFVURURfdV9zYm94CisjdW5kZWYgVVNFX1JFUEVUSVRJVkVfU1BFRURVUAorI3VuZGVmIFVTRV9pcF9tYXNrCisjdW5kZWYgVVNFX2RlX2tleXMKKworI3VuZGVmIEMKKyN1bmRlZiBpbml0X3Blcm0KKyN1bmRlZiBmaW5hbF9wZXJtCisjdW5kZWYgbV9zYm94CisjdW5kZWYgRAorI3VuZGVmIGNvbnN0X2N0eAorI3VuZGVmIHNhbHRiaXRzCisjdW5kZWYgb2xkX3NhbHQKKyN1bmRlZiBvbGRfcmF3a2V5MAorI3VuZGVmIG9sZF9yYXdrZXkxCisjdW5kZWYgdW5fcGJveAorI3VuZGVmIGludl9jb21wX3Blcm0KKyN1bmRlZiBpbnZfa2V5X3Blcm0KKyN1bmRlZiBlbl9rZXlzbAorI3VuZGVmIGVuX2tleXNyCisjdW5kZWYgZGVfa2V5c2wKKyN1bmRlZiBkZV9rZXlzcgorI3VuZGVmIGlwX21hc2tsCisjdW5kZWYgaXBfbWFza3IKKyN1bmRlZiBmcF9tYXNrbAorI3VuZGVmIGZwX21hc2tyCisjdW5kZWYga2V5X3Blcm1fbWFza2wKKyN1bmRlZiBrZXlfcGVybV9tYXNrcgorI3VuZGVmIGNvbXBfbWFza2wKKyN1bmRlZiBjb21wX21hc2tyCisjdW5kZWYgcHNib3gKZGlmZiAtLWdpdCBhL2xpYmJiL3B3X2VuY3J5cHRfbWQ1LmMgYi9saWJiYi9wd19lbmNyeXB0X21kNS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNTJlY2EKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9wd19lbmNyeXB0X21kNS5jCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogTUQ1Qy5DIC0gUlNBIERhdGEgU2VjdXJpdHksIEluYy4sIE1ENSBtZXNzYWdlLWRpZ2VzdCBhbGdvcml0aG0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTEtMiwgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gQ3JlYXRlZCAxOTkxLiBBbGwKKyAqIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlIHRvIGNvcHkgYW5kIHVzZSB0aGlzIHNvZnR3YXJlIGlzIGdyYW50ZWQgcHJvdmlkZWQgdGhhdCBpdAorICogaXMgaWRlbnRpZmllZCBhcyB0aGUgIlJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlLURpZ2VzdAorICogQWxnb3JpdGhtIiBpbiBhbGwgbWF0ZXJpYWwgbWVudGlvbmluZyBvciByZWZlcmVuY2luZyB0aGlzIHNvZnR3YXJlCisgKiBvciB0aGlzIGZ1bmN0aW9uLgorICoKKyAqIExpY2Vuc2UgaXMgYWxzbyBncmFudGVkIHRvIG1ha2UgYW5kIHVzZSBkZXJpdmF0aXZlIHdvcmtzIHByb3ZpZGVkCisgKiB0aGF0IHN1Y2ggd29ya3MgYXJlIGlkZW50aWZpZWQgYXMgImRlcml2ZWQgZnJvbSB0aGUgUlNBIERhdGEKKyAqIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlLURpZ2VzdCBBbGdvcml0aG0iIGluIGFsbCBtYXRlcmlhbAorICogbWVudGlvbmluZyBvciByZWZlcmVuY2luZyB0aGUgZGVyaXZlZCB3b3JrLgorICoKKyAqIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9ucyBjb25jZXJuaW5nIGVpdGhlcgorICogdGhlIG1lcmNoYW50YWJpbGl0eSBvZiB0aGlzIHNvZnR3YXJlIG9yIHRoZSBzdWl0YWJpbGl0eSBvZiB0aGlzCisgKiBzb2Z0d2FyZSBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZS4gSXQgaXMgcHJvdmlkZWQgImFzIGlzIgorICogd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkgb2YgYW55IGtpbmQuCisgKgorICogVGhlc2Ugbm90aWNlcyBtdXN0IGJlIHJldGFpbmVkIGluIGFueSBjb3BpZXMgb2YgYW55IHBhcnQgb2YgdGhpcworICogZG9jdW1lbnRhdGlvbiBhbmQvb3Igc29mdHdhcmUuCisgKgorICogJEZyZWVCU0Q6IHNyYy9saWIvbGlibWQvbWQ1Yy5jLHYgMS45LjIuMSAxOTk5LzA4LzI5IDE0OjU3OjEyIHBldGVyIEV4cCAkCisgKgorICogVGhpcyBjb2RlIGlzIHRoZSBzYW1lIGFzIHRoZSBjb2RlIHB1Ymxpc2hlZCBieSBSU0EgSW5jLiAgSXQgaGFzIGJlZW4KKyAqIGVkaXRlZCBmb3IgY2xhcml0eSBhbmQgc3R5bGUgb25seS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBUaGUgbWQ1X2NyeXB0KCkgZnVuY3Rpb24gd2FzIHRha2VuIGZyb20gZnJlZUJTRCdzIGxpYmNyeXB0IGFuZCBjb250YWlucworICogdGhpcyBsaWNlbnNlOgorICogICAgIlRIRSBCRUVSLVdBUkUgTElDRU5TRSIgKFJldmlzaW9uIDQyKToKKyAqICAgICA8cGhrQGxvZ2luLmRrbmV0LmRrPiB3cm90ZSB0aGlzIGZpbGUuICBBcyBsb25nIGFzIHlvdSByZXRhaW4gdGhpcyBub3RpY2UgeW91CisgKiAgICAgY2FuIGRvIHdoYXRldmVyIHlvdSB3YW50IHdpdGggdGhpcyBzdHVmZi4gSWYgd2UgbWVldCBzb21lIGRheSwgYW5kIHlvdSB0aGluaworICogICAgIHRoaXMgc3R1ZmYgaXMgd29ydGggaXQsIHlvdSBjYW4gYnV5IG1lIGEgYmVlciBpbiByZXR1cm4uICAgUG91bC1IZW5uaW5nIEthbXAKKyAqCisgKiAkRnJlZUJTRDogc3JjL2xpYi9saWJjcnlwdC9jcnlwdC5jLHYgMS43LjIuMSAxOTk5LzA4LzI5IDE0OjU2OjMzIHBldGVyIEV4cCAkCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogT24gQXByaWwgMTl0aCwgMjAwMSBtZDVfY3J5cHQoKSB3YXMgbW9kaWZpZWQgdG8gbWFrZSBpdCByZWVudHJhbnQKKyAqIGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQHVjbGliYy5vcmc+CisgKgorICoKKyAqIEp1bmUgMjgsIDIwMDEgICAgICAgICAgICAgTWFudWVsIE5vdm9hIElJSQorICoKKyAqICJVbi1pbmxpbmVkIiBjb2RlIHVzaW5nIGxvb3BzIGFuZCBzdGF0aWMgY29uc3QgdGFibGVzIGluIG9yZGVyIHRvCisgKiByZWR1Y2UgZ2VuZXJhdGVkIGNvZGUgc2l6ZSAob24gaTM4NiBmcm9tIGFwcHJveCA0ayB0byBhcHByb3ggMi41aykuCisgKgorICogSnVuZSAyOSwgMjAwMSAgICAgICAgICAgICBNYW51ZWwgTm92b2EgSUlJCisgKgorICogQ29tcGxldGVseSByZW1vdmVkIHN0YXRpYyBQQURESU5HIGFycmF5LgorICoKKyAqIFJlaW50cm9kdWNlZCB0aGUgbG9vcCB1bnJvbGxpbmcgaW4gTUQ1X1RyYW5zZm9ybSBhbmQgYWRkZWQgdGhlCisgKiBNRDVfU0laRV9PVkVSX1NQRUVEIG9wdGlvbiBmb3IgY29uZmlndXJhYmlsaXR5LiAgRGVmaW5lIGJlbG93IGFzOgorICogICAgICAgMCAgICBmdWxseSB1bnJvbGxlZCBsb29wcworICogICAgICAgMSAgICBwYXJ0aWFsbHkgdW5yb2xsZWQgKDQgb3BzIHBlciBsb29wKQorICogICAgICAgMiAgICBubyB1bnJvbGxpbmcgLS0gaW50cm9kdWNlcyB0aGUgbmVlZCB0byBzd2FwIDQgdmFyaWFibGVzIChzbG93KQorICogICAgICAgMyAgICBubyB1bnJvbGxpbmcgYW5kIGFsbCA0IGxvb3BzIG1lcmdlZCBpbnRvIG9uZSB3aXRoIHN3aXRjaAorICogICAgICAgICAgICAgICBpbiBlYWNoIGxvb3AgKGdsYWNpYWwpCisgKiBPbiBpMzg2LCBzaXplcyBhcmUgcm91Z2hseSAoLU9zIC1mbm8tYnVpbHRpbik6CisgKiAgICAgMDogM2sgICAgIDE6IDIuNWsgICAgIDI6IDIuMmsgICAgIDM6IDJrCisgKgorICogU2luY2UgU3VTdjMgZG9lcyBub3QgcmVxdWlyZSBjcnlwdF9yLCBtb2RpZmllZCBhZ2FpbiBBdWd1c3QgNywgMjAwMgorICogYnkgRXJpayBBbmRlcnNlbiB0byByZW1vdmUgcmVlbnRyYW5jZSBzdHVmZi4uLgorICovCisKKy8qCisgKiBVTklYIHBhc3N3b3JkCisgKgorICogVXNlIE1ENSBmb3Igd2hhdCBpdCBpcyBiZXN0IGF0Li4uCisgKi8KKyNkZWZpbmUgTUQ1X09VVF9CVUZTSVpFIDM2CitzdGF0aWMgY2hhciAqCitOT0lOTElORQorbWQ1X2NyeXB0KGNoYXIgcmVzdWx0W01ENV9PVVRfQlVGU0laRV0sIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnB3LCBjb25zdCB1bnNpZ25lZCBjaGFyICpzYWx0KQoreworCWNoYXIgKnA7CisJdW5zaWduZWQgY2hhciBmaW5hbFsxN107IC8qIGZpbmFsWzE2XSBleGlzdHMgb25seSB0byBhaWQgaW4gbG9vcGluZyAqLworCWludCBzbCwgcGwsIGksIHB3X2xlbjsKKwltZDVfY3R4X3QgY3R4LCBjdHgxOworCisJLyogTkI6IGluIGJ1c3lib3gsICIkMSQiIGluIHNhbHQgaXMgYWx3YXlzIHByZXNlbnQgKi8KKworCS8qIFJlZmluZSB0aGUgU2FsdCBmaXJzdCAqLworCisJLyogR2V0IHRoZSBsZW5ndGggb2YgdGhlIHNhbHQgaW5jbHVkaW5nICIkMSQiICovCisJc2wgPSAzOworCXdoaWxlIChzbCA8ICgzICsgOCkgJiYgc2FsdFtzbF0gJiYgc2FsdFtzbF0gIT0gJyQnKQorCQlzbCsrOworCisJLyogSGFzaC4gdGhlIHBhc3N3b3JkIGZpcnN0LCBzaW5jZSB0aGF0IGlzIHdoYXQgaXMgbW9zdCB1bmtub3duICovCisJbWQ1X2JlZ2luKCZjdHgpOworCXB3X2xlbiA9IHN0cmxlbigoY2hhciopcHcpOworCW1kNV9oYXNoKCZjdHgsIHB3LCBwd19sZW4pOworCisJLyogVGhlbiB0aGUgc2FsdCBpbmNsdWRpbmcgIiQxJCIgKi8KKwltZDVfaGFzaCgmY3R4LCBzYWx0LCBzbCk7CisKKwkvKiBDb3B5IHNhbHQgdG8gcmVzdWx0OyBza2lwICIkMSQiICovCisJbWVtY3B5KHJlc3VsdCwgc2FsdCwgc2wpOworCXJlc3VsdFtzbF0gPSAnJCc7CisJc2FsdCArPSAzOworCXNsIC09IDM7CisKKwkvKiBUaGVuIGp1c3QgYXMgbWFueSBjaGFyYWN0ZXJzIG9mIHRoZSBNRDUocHcsIHNhbHQsIHB3KSAqLworCW1kNV9iZWdpbigmY3R4MSk7CisJbWQ1X2hhc2goJmN0eDEsIHB3LCBwd19sZW4pOworCW1kNV9oYXNoKCZjdHgxLCBzYWx0LCBzbCk7CisJbWQ1X2hhc2goJmN0eDEsIHB3LCBwd19sZW4pOworCW1kNV9lbmQoJmN0eDEsIGZpbmFsKTsKKwlmb3IgKHBsID0gcHdfbGVuOyBwbCA+IDA7IHBsIC09IDE2KQorCQltZDVfaGFzaCgmY3R4LCBmaW5hbCwgcGwgPiAxNiA/IDE2IDogcGwpOworCisJLyogVGhlbiBzb21ldGhpbmcgcmVhbGx5IHdlaXJkLi4uICovCisJbWVtc2V0KGZpbmFsLCAwLCBzaXplb2YoZmluYWwpKTsKKwlmb3IgKGkgPSBwd19sZW47IGk7IGkgPj49IDEpIHsKKwkJbWQ1X2hhc2goJmN0eCwgKChpICYgMSkgPyBmaW5hbCA6IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHB3KSwgMSk7CisJfQorCW1kNV9lbmQoJmN0eCwgZmluYWwpOworCisJLyogQW5kIG5vdywganVzdCB0byBtYWtlIHN1cmUgdGhpbmdzIGRvbid0IHJ1biB0b28gZmFzdC4KKwkgKiBPbiBhIDYwIE1oeiBQZW50aXVtIHRoaXMgdGFrZXMgMzQgbXNlYywgc28geW91IHdvdWxkCisJICogbmVlZCAzMCBzZWNvbmRzIHRvIGJ1aWxkIGEgMTAwMCBlbnRyeSBkaWN0aW9uYXJ5Li4uCisJICovCisJZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworCQltZDVfYmVnaW4oJmN0eDEpOworCQlpZiAoaSAmIDEpCisJCQltZDVfaGFzaCgmY3R4MSwgcHcsIHB3X2xlbik7CisJCWVsc2UKKwkJCW1kNV9oYXNoKCZjdHgxLCBmaW5hbCwgMTYpOworCisJCWlmIChpICUgMykKKwkJCW1kNV9oYXNoKCZjdHgxLCBzYWx0LCBzbCk7CisKKwkJaWYgKGkgJSA3KQorCQkJbWQ1X2hhc2goJmN0eDEsIHB3LCBwd19sZW4pOworCisJCWlmIChpICYgMSkKKwkJCW1kNV9oYXNoKCZjdHgxLCBmaW5hbCwgMTYpOworCQllbHNlCisJCQltZDVfaGFzaCgmY3R4MSwgcHcsIHB3X2xlbik7CisJCW1kNV9lbmQoJmN0eDEsIGZpbmFsKTsKKwl9CisKKwlwID0gcmVzdWx0ICsgc2wgKyA0OyAvKiAxMiBieXRlcyBtYXggKHNsIGlzIHVwIHRvIDggYnl0ZXMpICovCisKKwkvKiBBZGQgNSo0KzIgPSAyMiBieXRlcyBvZiBoYXNoLCArIE5VTCBieXRlLiAqLworCWZpbmFsWzE2XSA9IGZpbmFsWzVdOworCWZvciAoaSA9IDA7IGkgPCA1OyBpKyspIHsKKwkJdW5zaWduZWQgbCA9IChmaW5hbFtpXSA8PCAxNikgfCAoZmluYWxbaSs2XSA8PCA4KSB8IGZpbmFsW2krMTJdOworCQlwID0gdG82NChwLCBsLCA0KTsKKwl9CisJcCA9IHRvNjQocCwgZmluYWxbMTFdLCAyKTsKKwkqcCA9ICdcMCc7CisKKwkvKiBEb24ndCBsZWF2ZSBhbnl0aGluZyBhcm91bmQgaW4gdm0gdGhleSBjb3VsZCB1c2UuICovCisJbWVtc2V0KGZpbmFsLCAwLCBzaXplb2YoZmluYWwpKTsKKworCXJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9wd19lbmNyeXB0X3NoYS5jIGIvbGliYmIvcHdfZW5jcnlwdF9zaGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWVhYWNhCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvcHdfZW5jcnlwdF9zaGEuYwpAQCAtMCwwICsxLDI4NiBAQAorLyogU0hBMjU2IGFuZCBTSEE1MTItYmFzZWQgVW5peCBjcnlwdCBpbXBsZW1lbnRhdGlvbi4KKyAqIFJlbGVhc2VkIGludG8gdGhlIFB1YmxpYyBEb21haW4gYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAcmVkaGF0LmNvbT4uCisgKi8KKworLyogUHJlZml4IGZvciBvcHRpb25hbCByb3VuZHMgc3BlY2lmaWNhdGlvbi4gICovCitzdGF0aWMgY29uc3QgY2hhciBzdHJfcm91bmRzW10gQUxJR04xID0gInJvdW5kcz0ldSQiOworCisvKiBNYXhpbXVtIHNhbHQgc3RyaW5nIGxlbmd0aC4gICovCisjZGVmaW5lIFNBTFRfTEVOX01BWCAxNgorLyogRGVmYXVsdCBudW1iZXIgb2Ygcm91bmRzIGlmIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZC4gICovCisjZGVmaW5lIFJPVU5EU19ERUZBVUxUIDUwMDAKKy8qIE1pbmltdW0gbnVtYmVyIG9mIHJvdW5kcy4gICovCisjZGVmaW5lIFJPVU5EU19NSU4gMTAwMAorLyogTWF4aW11bSBudW1iZXIgb2Ygcm91bmRzLiAgKi8KKyNkZWZpbmUgUk9VTkRTX01BWCA5OTk5OTk5OTkKKworc3RhdGljIGNoYXIgKgorTk9JTkxJTkUKK3NoYV9jcnlwdCgvKmNvbnN0Ki8gY2hhciAqa2V5X2RhdGEsIC8qY29uc3QqLyBjaGFyICpzYWx0X2RhdGEpCit7CisJdm9pZCAoKnNoYV9iZWdpbikodm9pZCAqY3R4KSBGQVNUX0ZVTkM7CisJdm9pZCAoKnNoYV9oYXNoKSh2b2lkICpjdHgsIGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGxlbikgRkFTVF9GVU5DOworCXZvaWQgKCpzaGFfZW5kKSh2b2lkICpjdHgsIHZvaWQgKnJlc2J1ZikgRkFTVF9GVU5DOworCWludCBfMzJvcjY0OworCisJY2hhciAqcmVzdWx0LCAqcmVzcHRyOworCisJLyogYnR3LCBzaGEyNTYgbmVlZHMgWzMyXSBhbmQgdWludDMyX3Qgb25seSAqLworCXN0cnVjdCB7CisJCXVuc2lnbmVkIGNoYXIgYWx0X3Jlc3VsdFs2NF07CisJCXVuc2lnbmVkIGNoYXIgdGVtcF9yZXN1bHRbNjRdOworCQl1bmlvbiB7CisJCQlzaGEyNTZfY3R4X3QgeDsKKwkJCXNoYTUxMl9jdHhfdCB5OworCQl9IGN0eDsKKwkJdW5pb24geworCQkJc2hhMjU2X2N0eF90IHg7CisJCQlzaGE1MTJfY3R4X3QgeTsKKwkJfSBhbHRfY3R4OworCX0gTCBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyhfX2FsaWdub2ZfXyh1aW50NjRfdCkpKSk7CisjZGVmaW5lIGFsdF9yZXN1bHQgIChMLmFsdF9yZXN1bHQgKQorI2RlZmluZSB0ZW1wX3Jlc3VsdCAoTC50ZW1wX3Jlc3VsdCkKKyNkZWZpbmUgY3R4ICAgICAgICAgKEwuY3R4ICAgICAgICApCisjZGVmaW5lIGFsdF9jdHggICAgIChMLmFsdF9jdHggICAgKQorCXVuc2lnbmVkIHNhbHRfbGVuOworCXVuc2lnbmVkIGtleV9sZW47CisJdW5zaWduZWQgY250OworCXVuc2lnbmVkIHJvdW5kczsKKwljaGFyICpjcDsKKwljaGFyIGlzX3NoYTUxMjsKKworCS8qIEFuYWx5emUgc2FsdCwgY29uc3RydWN0IGFscmVhZHkga25vd24gcGFydCBvZiByZXN1bHQgKi8KKwljbnQgPSBzdHJsZW4oc2FsdF9kYXRhKSArIDEgKyA0MyArIDE7CisJaXNfc2hhNTEyID0gc2FsdF9kYXRhWzFdOworCWlmIChpc19zaGE1MTIgPT0gJzYnKQorCQljbnQgKz0gNDM7CisJcmVzdWx0ID0gcmVzcHRyID0geHphbGxvYyhjbnQpOyAvKiB3aWxsIHByb3ZpZGUgTlVMIHRlcm1pbmF0b3IgKi8KKwkqcmVzcHRyKysgPSAnJCc7CisJKnJlc3B0cisrID0gaXNfc2hhNTEyOworCSpyZXNwdHIrKyA9ICckJzsKKwlyb3VuZHMgPSBST1VORFNfREVGQVVMVDsKKwlzYWx0X2RhdGEgKz0gMzsKKwlpZiAoc3RybmNtcChzYWx0X2RhdGEsIHN0cl9yb3VuZHMsIDcpID09IDApIHsKKwkJLyogNyA9PSBzdHJsZW4oInJvdW5kcz0iKSAqLworCQljaGFyICplbmRwOworCQljbnQgPSBiYl9zdHJ0b3Uoc2FsdF9kYXRhICsgNywgJmVuZHAsIDEwKTsKKwkJaWYgKCplbmRwID09ICckJykgeworCQkJc2FsdF9kYXRhID0gZW5kcCArIDE7CisJCQlyb3VuZHMgPSBjbnQ7CisJCQlpZiAocm91bmRzIDwgUk9VTkRTX01JTikKKwkJCQlyb3VuZHMgPSBST1VORFNfTUlOOworCQkJaWYgKHJvdW5kcyA+IFJPVU5EU19NQVgpCisJCQkJcm91bmRzID0gUk9VTkRTX01BWDsKKwkJCS8qIGFkZCAicm91bmRzPU5OTk5OJCIgdG8gcmVzdWx0ICovCisJCQlyZXNwdHIgKz0gc3ByaW50ZihyZXNwdHIsIHN0cl9yb3VuZHMsIHJvdW5kcyk7CisJCX0KKwl9CisJc2FsdF9sZW4gPSBzdHJjaHJudWwoc2FsdF9kYXRhLCAnJCcpIC0gc2FsdF9kYXRhOworCWlmIChzYWx0X2xlbiA+IFNBTFRfTEVOX01BWCkKKwkJc2FsdF9sZW4gPSBTQUxUX0xFTl9NQVg7CisJLyogeHN0cmR1cCBhc3N1cmVzIHN1aXRhYmxlIGFsaWdubWVudDsgYWxzbyB3ZSB3aWxsIHVzZSBpdAorCSAgIGFzIGEgc2NyYXRjaCBzcGFjZSBsYXRlci4gKi8KKwlzYWx0X2RhdGEgPSB4c3RybmR1cChzYWx0X2RhdGEsIHNhbHRfbGVuKTsKKwkvKiBhZGQgInNhbHQkIiB0byByZXN1bHQgKi8KKwlzdHJjcHkocmVzcHRyLCBzYWx0X2RhdGEpOworCXJlc3B0ciArPSBzYWx0X2xlbjsKKwkqcmVzcHRyKysgPSAnJCc7CisJLyoga2V5IGRhdGEgZG9lc24ndCBuZWVkIG11Y2ggcHJvY2Vzc2luZyAqLworCWtleV9sZW4gPSBzdHJsZW4oa2V5X2RhdGEpOworCWtleV9kYXRhID0geHN0cmR1cChrZXlfZGF0YSk7CisKKwkvKiBXaGljaCBmbGF2b3Igb2YgU0hBbm5uIG9wcyB0byB1c2U/ICovCisJc2hhX2JlZ2luID0gKHZvaWQqKXNoYTI1Nl9iZWdpbjsKKwlzaGFfaGFzaCA9ICh2b2lkKilzaGEyNTZfaGFzaDsKKwlzaGFfZW5kID0gKHZvaWQqKXNoYTI1Nl9lbmQ7CisJXzMyb3I2NCA9IDMyOworCWlmIChpc19zaGE1MTIgPT0gJzYnKSB7CisJCXNoYV9iZWdpbiA9ICh2b2lkKilzaGE1MTJfYmVnaW47CisJCXNoYV9oYXNoID0gKHZvaWQqKXNoYTUxMl9oYXNoOworCQlzaGFfZW5kID0gKHZvaWQqKXNoYTUxMl9lbmQ7CisJCV8zMm9yNjQgPSA2NDsKKwl9CisKKwkvKiBBZGQgS0VZLCBTQUxULiAgKi8KKwlzaGFfYmVnaW4oJmN0eCk7CisJc2hhX2hhc2goJmN0eCwga2V5X2RhdGEsIGtleV9sZW4pOworCXNoYV9oYXNoKCZjdHgsIHNhbHRfZGF0YSwgc2FsdF9sZW4pOworCisJLyogQ29tcHV0ZSBhbHRlcm5hdGUgU0hBIHN1bSB3aXRoIGlucHV0IEtFWSwgU0FMVCwgYW5kIEtFWS4KKwkgICBUaGUgZmluYWwgcmVzdWx0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGZpcnN0IGNvbnRleHQuICAqLworCXNoYV9iZWdpbigmYWx0X2N0eCk7CisJc2hhX2hhc2goJmFsdF9jdHgsIGtleV9kYXRhLCBrZXlfbGVuKTsKKwlzaGFfaGFzaCgmYWx0X2N0eCwgc2FsdF9kYXRhLCBzYWx0X2xlbik7CisJc2hhX2hhc2goJmFsdF9jdHgsIGtleV9kYXRhLCBrZXlfbGVuKTsKKwlzaGFfZW5kKCZhbHRfY3R4LCBhbHRfcmVzdWx0KTsKKworCS8qIEFkZCByZXN1bHQgb2YgdGhpcyB0byB0aGUgb3RoZXIgY29udGV4dC4gICovCisJLyogQWRkIGZvciBhbnkgY2hhcmFjdGVyIGluIHRoZSBrZXkgb25lIGJ5dGUgb2YgdGhlIGFsdGVybmF0ZSBzdW0uICAqLworCWZvciAoY250ID0ga2V5X2xlbjsgY250ID4gXzMyb3I2NDsgY250IC09IF8zMm9yNjQpCisJCXNoYV9oYXNoKCZjdHgsIGFsdF9yZXN1bHQsIF8zMm9yNjQpOworCXNoYV9oYXNoKCZjdHgsIGFsdF9yZXN1bHQsIGNudCk7CisKKwkvKiBUYWtlIHRoZSBiaW5hcnkgcmVwcmVzZW50YXRpb24gb2YgdGhlIGxlbmd0aCBvZiB0aGUga2V5IGFuZCBmb3IgZXZlcnkKKwkgICAxIGFkZCB0aGUgYWx0ZXJuYXRlIHN1bSwgZm9yIGV2ZXJ5IDAgdGhlIGtleS4gICovCisJZm9yIChjbnQgPSBrZXlfbGVuOyBjbnQgIT0gMDsgY250ID4+PSAxKQorCQlpZiAoKGNudCAmIDEpICE9IDApCisJCQlzaGFfaGFzaCgmY3R4LCBhbHRfcmVzdWx0LCBfMzJvcjY0KTsKKwkJZWxzZQorCQkJc2hhX2hhc2goJmN0eCwga2V5X2RhdGEsIGtleV9sZW4pOworCisJLyogQ3JlYXRlIGludGVybWVkaWF0ZSByZXN1bHQuICAqLworCXNoYV9lbmQoJmN0eCwgYWx0X3Jlc3VsdCk7CisKKwkvKiBTdGFydCBjb21wdXRhdGlvbiBvZiBQIGJ5dGUgc2VxdWVuY2UuICAqLworCS8qIEZvciBldmVyeSBjaGFyYWN0ZXIgaW4gdGhlIHBhc3N3b3JkIGFkZCB0aGUgZW50aXJlIHBhc3N3b3JkLiAgKi8KKwlzaGFfYmVnaW4oJmFsdF9jdHgpOworCWZvciAoY250ID0gMDsgY250IDwga2V5X2xlbjsgKytjbnQpCisJCXNoYV9oYXNoKCZhbHRfY3R4LCBrZXlfZGF0YSwga2V5X2xlbik7CisJc2hhX2VuZCgmYWx0X2N0eCwgdGVtcF9yZXN1bHQpOworCisJLyogTkI6IHBhc3QgdGhpcyBwb2ludCwgcmF3IGtleV9kYXRhIGlzIG5vdCB1c2VkIGFueW1vcmUgKi8KKworCS8qIENyZWF0ZSBieXRlIHNlcXVlbmNlIFAuICAqLworI2RlZmluZSBwX2J5dGVzIGtleV9kYXRhIC8qIHJldXNlIHRoZSBidWZmZXIgYXMgaXQgaXMgb2YgdGhlIGtleV9sZW4gc2l6ZSAqLworCWNwID0gcF9ieXRlczsgLyogd2FzOiAuLi4gPSBhbGxvY2Eoa2V5X2xlbik7ICovCisJZm9yIChjbnQgPSBrZXlfbGVuOyBjbnQgPj0gXzMyb3I2NDsgY250IC09IF8zMm9yNjQpIHsKKwkJY3AgPSBtZW1jcHkoY3AsIHRlbXBfcmVzdWx0LCBfMzJvcjY0KTsKKwkJY3AgKz0gXzMyb3I2NDsKKwl9CisJbWVtY3B5KGNwLCB0ZW1wX3Jlc3VsdCwgY250KTsKKworCS8qIFN0YXJ0IGNvbXB1dGF0aW9uIG9mIFMgYnl0ZSBzZXF1ZW5jZS4gICovCisJLyogRm9yIGV2ZXJ5IGNoYXJhY3RlciBpbiB0aGUgcGFzc3dvcmQgYWRkIHRoZSBlbnRpcmUgcGFzc3dvcmQuICAqLworCXNoYV9iZWdpbigmYWx0X2N0eCk7CisJZm9yIChjbnQgPSAwOyBjbnQgPCAxNiArIGFsdF9yZXN1bHRbMF07ICsrY250KQorCQlzaGFfaGFzaCgmYWx0X2N0eCwgc2FsdF9kYXRhLCBzYWx0X2xlbik7CisJc2hhX2VuZCgmYWx0X2N0eCwgdGVtcF9yZXN1bHQpOworCisJLyogTkI6IHBhc3QgdGhpcyBwb2ludCwgcmF3IHNhbHRfZGF0YSBpcyBub3QgdXNlZCBhbnltb3JlICovCisKKwkvKiBDcmVhdGUgYnl0ZSBzZXF1ZW5jZSBTLiAgKi8KKyNkZWZpbmUgc19ieXRlcyBzYWx0X2RhdGEgLyogcmV1c2UgdGhlIGJ1ZmZlciBhcyBpdCBpcyBvZiB0aGUgc2FsdF9sZW4gc2l6ZSAqLworCWNwID0gc19ieXRlczsgLyogd2FzOiAuLi4gPSBhbGxvY2Eoc2FsdF9sZW4pOyAqLworCWZvciAoY250ID0gc2FsdF9sZW47IGNudCA+PSBfMzJvcjY0OyBjbnQgLT0gXzMyb3I2NCkgeworCQljcCA9IG1lbWNweShjcCwgdGVtcF9yZXN1bHQsIF8zMm9yNjQpOworCQljcCArPSBfMzJvcjY0OworCX0KKwltZW1jcHkoY3AsIHRlbXBfcmVzdWx0LCBjbnQpOworCisJLyogUmVwZWF0ZWRseSBydW4gdGhlIGNvbGxlY3RlZCBoYXNoIHZhbHVlIHRocm91Z2ggU0hBIHRvIGJ1cm4KKwkgICBDUFUgY3ljbGVzLiAgKi8KKwlmb3IgKGNudCA9IDA7IGNudCA8IHJvdW5kczsgKytjbnQpIHsKKwkJc2hhX2JlZ2luKCZjdHgpOworCisJCS8qIEFkZCBrZXkgb3IgbGFzdCByZXN1bHQuICAqLworCQlpZiAoKGNudCAmIDEpICE9IDApCisJCQlzaGFfaGFzaCgmY3R4LCBwX2J5dGVzLCBrZXlfbGVuKTsKKwkJZWxzZQorCQkJc2hhX2hhc2goJmN0eCwgYWx0X3Jlc3VsdCwgXzMyb3I2NCk7CisJCS8qIEFkZCBzYWx0IGZvciBudW1iZXJzIG5vdCBkaXZpc2libGUgYnkgMy4gICovCisJCWlmIChjbnQgJSAzICE9IDApCisJCQlzaGFfaGFzaCgmY3R4LCBzX2J5dGVzLCBzYWx0X2xlbik7CisJCS8qIEFkZCBrZXkgZm9yIG51bWJlcnMgbm90IGRpdmlzaWJsZSBieSA3LiAgKi8KKwkJaWYgKGNudCAlIDcgIT0gMCkKKwkJCXNoYV9oYXNoKCZjdHgsIHBfYnl0ZXMsIGtleV9sZW4pOworCQkvKiBBZGQga2V5IG9yIGxhc3QgcmVzdWx0LiAgKi8KKwkJaWYgKChjbnQgJiAxKSAhPSAwKQorCQkJc2hhX2hhc2goJmN0eCwgYWx0X3Jlc3VsdCwgXzMyb3I2NCk7CisJCWVsc2UKKwkJCXNoYV9oYXNoKCZjdHgsIHBfYnl0ZXMsIGtleV9sZW4pOworCisJCXNoYV9lbmQoJmN0eCwgYWx0X3Jlc3VsdCk7CisJfQorCisJLyogQXBwZW5kIGVuY3J5cHRlZCBwYXNzd29yZCB0byByZXN1bHQgYnVmZmVyICovCisvL1RPRE86IHJlcGxhY2Ugd2l0aCBzb21ldGhpbmcgbGlrZQorLy8JYmJfdXVlbmNvZGUoY3AsIHNyYywgbGVuZ3RoLCBiYl91dWVuY190YmxfWFhYYmFzZTY0KTsKKyNkZWZpbmUgYjY0X2Zyb21fMjRiaXQoQjIsIEIxLCBCMCwgTikgXAorZG8geyBcCisJdW5zaWduZWQgdyA9ICgoQjIpIDw8IDE2KSB8ICgoQjEpIDw8IDgpIHwgKEIwKTsgXAorCXJlc3B0ciA9IHRvNjQocmVzcHRyLCB3LCBOKTsgXAorfSB3aGlsZSAoMCkKKwlpZiAoaXNfc2hhNTEyID09ICc1JykgeworCQl1bnNpZ25lZCBpID0gMDsKKwkJd2hpbGUgKDEpIHsKKwkJCXVuc2lnbmVkIGogPSBpICsgMTA7CisJCQl1bnNpZ25lZCBrID0gaSArIDIwOworCQkJaWYgKGogPj0gMzApIGogLT0gMzA7CisJCQlpZiAoayA+PSAzMCkgayAtPSAzMDsKKwkJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbaV0sIGFsdF9yZXN1bHRbal0sIGFsdF9yZXN1bHRba10sIDQpOworCQkJaWYgKGsgPT0gMjkpCisJCQkJYnJlYWs7CisJCQlpID0gayArIDE7CisJCX0KKwkJYjY0X2Zyb21fMjRiaXQoMCwgYWx0X3Jlc3VsdFszMV0sIGFsdF9yZXN1bHRbMzBdLCAzKTsKKwkJLyogd2FzOgorCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzBdLCBhbHRfcmVzdWx0WzEwXSwgYWx0X3Jlc3VsdFsyMF0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzIxXSwgYWx0X3Jlc3VsdFsxXSwgYWx0X3Jlc3VsdFsxMV0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzEyXSwgYWx0X3Jlc3VsdFsyMl0sIGFsdF9yZXN1bHRbMl0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzNdLCBhbHRfcmVzdWx0WzEzXSwgYWx0X3Jlc3VsdFsyM10sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzI0XSwgYWx0X3Jlc3VsdFs0XSwgYWx0X3Jlc3VsdFsxNF0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzE1XSwgYWx0X3Jlc3VsdFsyNV0sIGFsdF9yZXN1bHRbNV0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzZdLCBhbHRfcmVzdWx0WzE2XSwgYWx0X3Jlc3VsdFsyNl0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzI3XSwgYWx0X3Jlc3VsdFs3XSwgYWx0X3Jlc3VsdFsxN10sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzE4XSwgYWx0X3Jlc3VsdFsyOF0sIGFsdF9yZXN1bHRbOF0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzldLCBhbHRfcmVzdWx0WzE5XSwgYWx0X3Jlc3VsdFsyOV0sIDQpOworCQliNjRfZnJvbV8yNGJpdCgwLCBhbHRfcmVzdWx0WzMxXSwgYWx0X3Jlc3VsdFszMF0sIDMpOworCQkqLworCX0gZWxzZSB7CisJCXVuc2lnbmVkIGkgPSAwOworCQl3aGlsZSAoMSkgeworCQkJdW5zaWduZWQgaiA9IGkgKyAyMTsKKwkJCXVuc2lnbmVkIGsgPSBpICsgNDI7CisJCQlpZiAoaiA+PSA2MykgaiAtPSA2MzsKKwkJCWlmIChrID49IDYzKSBrIC09IDYzOworCQkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFtpXSwgYWx0X3Jlc3VsdFtqXSwgYWx0X3Jlc3VsdFtrXSwgNCk7CisJCQlpZiAoaiA9PSAyMCkKKwkJCQlicmVhazsKKwkJCWkgPSBqICsgMTsKKwkJfQorCQliNjRfZnJvbV8yNGJpdCgwLCAwLCBhbHRfcmVzdWx0WzYzXSwgMik7CisJCS8qIHdhczoKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFswXSwgYWx0X3Jlc3VsdFsyMV0sIGFsdF9yZXN1bHRbNDJdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFsyMl0sIGFsdF9yZXN1bHRbNDNdLCBhbHRfcmVzdWx0WzFdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFs0NF0sIGFsdF9yZXN1bHRbMl0sIGFsdF9yZXN1bHRbMjNdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFszXSwgYWx0X3Jlc3VsdFsyNF0sIGFsdF9yZXN1bHRbNDVdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFsyNV0sIGFsdF9yZXN1bHRbNDZdLCBhbHRfcmVzdWx0WzRdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFs0N10sIGFsdF9yZXN1bHRbNV0sIGFsdF9yZXN1bHRbMjZdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFs2XSwgYWx0X3Jlc3VsdFsyN10sIGFsdF9yZXN1bHRbNDhdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFsyOF0sIGFsdF9yZXN1bHRbNDldLCBhbHRfcmVzdWx0WzddLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFs1MF0sIGFsdF9yZXN1bHRbOF0sIGFsdF9yZXN1bHRbMjldLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFs5XSwgYWx0X3Jlc3VsdFszMF0sIGFsdF9yZXN1bHRbNTFdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFszMV0sIGFsdF9yZXN1bHRbNTJdLCBhbHRfcmVzdWx0WzEwXSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbNTNdLCBhbHRfcmVzdWx0WzExXSwgYWx0X3Jlc3VsdFszMl0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzEyXSwgYWx0X3Jlc3VsdFszM10sIGFsdF9yZXN1bHRbNTRdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFszNF0sIGFsdF9yZXN1bHRbNTVdLCBhbHRfcmVzdWx0WzEzXSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbNTZdLCBhbHRfcmVzdWx0WzE0XSwgYWx0X3Jlc3VsdFszNV0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzE1XSwgYWx0X3Jlc3VsdFszNl0sIGFsdF9yZXN1bHRbNTddLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFszN10sIGFsdF9yZXN1bHRbNThdLCBhbHRfcmVzdWx0WzE2XSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbNTldLCBhbHRfcmVzdWx0WzE3XSwgYWx0X3Jlc3VsdFszOF0sIDQpOworCQliNjRfZnJvbV8yNGJpdChhbHRfcmVzdWx0WzE4XSwgYWx0X3Jlc3VsdFszOV0sIGFsdF9yZXN1bHRbNjBdLCA0KTsKKwkJYjY0X2Zyb21fMjRiaXQoYWx0X3Jlc3VsdFs0MF0sIGFsdF9yZXN1bHRbNjFdLCBhbHRfcmVzdWx0WzE5XSwgNCk7CisJCWI2NF9mcm9tXzI0Yml0KGFsdF9yZXN1bHRbNjJdLCBhbHRfcmVzdWx0WzIwXSwgYWx0X3Jlc3VsdFs0MV0sIDQpOworCQliNjRfZnJvbV8yNGJpdCgwLCAwLCBhbHRfcmVzdWx0WzYzXSwgMik7CisJCSovCisJfQorCS8qICpyZXNwdHIgPSAnXDAnOyAtIHh6YWxsb2MgZGlkIGl0ICovCisjdW5kZWYgYjY0X2Zyb21fMjRiaXQKKworCS8qIENsZWFyIHRoZSBidWZmZXIgZm9yIHRoZSBpbnRlcm1lZGlhdGUgcmVzdWx0IHNvIHRoYXQgcGVvcGxlCisJICAgYXR0YWNoaW5nIHRvIHByb2Nlc3NlcyBvciByZWFkaW5nIGNvcmUgZHVtcHMgY2Fubm90IGdldCBhbnkKKwkgICBpbmZvcm1hdGlvbi4gICovCisJbWVtc2V0KCZMLCAwLCBzaXplb2YoTCkpOyAvKiBbYWx0XV9jdHggYW5kIFhYWF9yZXN1bHQgYnVmZmVycyAqLworCW1lbXNldChrZXlfZGF0YSwgMCwga2V5X2xlbik7IC8qIGFsc28gcF9ieXRlcyAqLworCW1lbXNldChzYWx0X2RhdGEsIDAsIHNhbHRfbGVuKTsgLyogYWxzbyBzX2J5dGVzICovCisJZnJlZShrZXlfZGF0YSk7CisJZnJlZShzYWx0X2RhdGEpOworI3VuZGVmIHBfYnl0ZXMKKyN1bmRlZiBzX2J5dGVzCisKKwlyZXR1cm4gcmVzdWx0OworI3VuZGVmIGFsdF9yZXN1bHQKKyN1bmRlZiB0ZW1wX3Jlc3VsdAorI3VuZGVmIGN0eAorI3VuZGVmIGFsdF9jdHgKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3JlYWQuYyBiL2xpYmJiL3JlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTA2YmMyCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvcmVhZC5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCitzc2l6ZV90IEZBU1RfRlVOQyBzYWZlX3JlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzc2l6ZV90IG47CisKKwlkbyB7CisJCW4gPSByZWFkKGZkLCBidWYsIGNvdW50KTsKKwl9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKwlyZXR1cm4gbjsKK30KKworLyoKKyAqIFJlYWQgYWxsIG9mIHRoZSBzdXBwbGllZCBidWZmZXIgZnJvbSBhIGZpbGUuCisgKiBUaGlzIGRvZXMgbXVsdGlwbGUgcmVhZHMgYXMgbmVjZXNzYXJ5LgorICogUmV0dXJucyB0aGUgYW1vdW50IHJlYWQsIG9yIC0xIG9uIGFuIGVycm9yLgorICogQSBzaG9ydCByZWFkIGlzIHJldHVybmVkIG9uIGFuIGVuZCBvZiBmaWxlLgorICovCitzc2l6ZV90IEZBU1RfRlVOQyBmdWxsX3JlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisJc3NpemVfdCBjYzsKKwlzc2l6ZV90IHRvdGFsOworCisJdG90YWwgPSAwOworCisJd2hpbGUgKGxlbikgeworCQljYyA9IHNhZmVfcmVhZChmZCwgYnVmLCBsZW4pOworCisJCWlmIChjYyA8IDApIHsKKwkJCWlmICh0b3RhbCkgeworCQkJCS8qIHdlIGFscmVhZHkgaGF2ZSBzb21lISAqLworCQkJCS8qIHVzZXIgY2FuIGRvIGFub3RoZXIgcmVhZCB0byBrbm93IHRoZSBlcnJvciBjb2RlICovCisJCQkJcmV0dXJuIHRvdGFsOworCQkJfQorCQkJcmV0dXJuIGNjOyAvKiByZWFkKCkgcmV0dXJucyAtMSBvbiBmYWlsdXJlLiAqLworCQl9CisJCWlmIChjYyA9PSAwKQorCQkJYnJlYWs7CisJCWJ1ZiA9ICgoY2hhciAqKWJ1ZikgKyBjYzsKKwkJdG90YWwgKz0gY2M7CisJCWxlbiAtPSBjYzsKKwl9CisKKwlyZXR1cm4gdG90YWw7Cit9CisKK3NzaXplX3QgRkFTVF9GVU5DIHJlYWRfY2xvc2UoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBzaXplKQoreworCS8qaW50IGU7Ki8KKwlzaXplID0gZnVsbF9yZWFkKGZkLCBidWYsIHNpemUpOworCS8qZSA9IGVycm5vOyovCisJY2xvc2UoZmQpOworCS8qZXJybm8gPSBlOyovCisJcmV0dXJuIHNpemU7Cit9CisKK3NzaXplX3QgRkFTVF9GVU5DIG9wZW5fcmVhZF9jbG9zZShjb25zdCBjaGFyICpmaWxlbmFtZSwgdm9pZCAqYnVmLCBzaXplX3Qgc2l6ZSkKK3sKKwlpbnQgZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIGZkOworCXJldHVybiByZWFkX2Nsb3NlKGZkLCBidWYsIHNpemUpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvcmVhZF9rZXkuYyBiL2xpYmJiL3JlYWRfa2V5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNlMjNkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3JlYWRfa2V5LmMKQEAgLTAsMCArMSwyODEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50NjRfdCBGQVNUX0ZVTkMgcmVhZF9rZXkoaW50IGZkLCBjaGFyICpidWZmZXIsIGludCB0aW1lb3V0KQoreworCXN0cnVjdCBwb2xsZmQgcGZkOworCWNvbnN0IGNoYXIgKnNlcTsKKwlpbnQgbjsKKworCS8qIEtub3duIGVzY2FwZSBzZXF1ZW5jZXMgZm9yIGN1cnNvciBhbmQgZnVuY3Rpb24ga2V5cy4KKwkgKiBTZWUgIlh0ZXJtIENvbnRyb2wgU2VxdWVuY2VzIgorCSAqIGh0dHA6Ly9pbnZpc2libGUtaXNsYW5kLm5ldC94dGVybS9jdGxzZXFzL2N0bHNlcXMuaHRtbAorCSAqLworCXN0YXRpYyBjb25zdCBjaGFyIGVzY2NtZHNbXSBBTElHTjEgPSB7CisJCSdPJywnQScgICAgICAgIHwweDgwLEtFWUNPREVfVVAgICAgICAsCisJCSdPJywnQicgICAgICAgIHwweDgwLEtFWUNPREVfRE9XTiAgICAsCisJCSdPJywnQycgICAgICAgIHwweDgwLEtFWUNPREVfUklHSFQgICAsCisJCSdPJywnRCcgICAgICAgIHwweDgwLEtFWUNPREVfTEVGVCAgICAsCisJCSdPJywnSCcgICAgICAgIHwweDgwLEtFWUNPREVfSE9NRSAgICAsCisJCSdPJywnRicgICAgICAgIHwweDgwLEtFWUNPREVfRU5EICAgICAsCisjaWYgMAorCQknTycsJ1AnICAgICAgICB8MHg4MCxLRVlDT0RFX0ZVTjEgICAgLAorCQkvKiBbRVNDXSBFU0MgTyBbMl0gUCAtIFtBbHQtXVtTaGlmdC1dRjEgKi8KKwkJLyogRVNDIFsgTyAxIDsgMiBQIC0gU2hpZnQtRjEgKi8KKwkJLyogRVNDIFsgTyAxIDsgMyBQIC0gQWx0LUYxICovCisJCS8qIEVTQyBbIE8gMSA7IDQgUCAtIEFsdC1TaGlmdC1GMSAqLworCQkvKiBFU0MgWyBPIDEgOyA1IFAgLSBDdHJsLUYxICovCisJCS8qIEVTQyBbIE8gMSA7IDYgUCAtIEN0cmwtU2hpZnQtRjEgKi8KKwkJJ08nLCdRJyAgICAgICAgfDB4ODAsS0VZQ09ERV9GVU4yICAgICwKKwkJJ08nLCdSJyAgICAgICAgfDB4ODAsS0VZQ09ERV9GVU4zICAgICwKKwkJJ08nLCdTJyAgICAgICAgfDB4ODAsS0VZQ09ERV9GVU40ICAgICwKKyNlbmRpZgorCQknWycsJ0EnICAgICAgICB8MHg4MCxLRVlDT0RFX1VQICAgICAgLAorCQknWycsJ0InICAgICAgICB8MHg4MCxLRVlDT0RFX0RPV04gICAgLAorCQknWycsJ0MnICAgICAgICB8MHg4MCxLRVlDT0RFX1JJR0hUICAgLAorCQknWycsJ0QnICAgICAgICB8MHg4MCxLRVlDT0RFX0xFRlQgICAgLAorCQkvKiBFU0MgWyAxIDsgMiB4LCB3aGVyZSB4ID0gQS9CL0MvRDogU2hpZnQtPGFycm93PiAqLworCQkvKiBFU0MgWyAxIDsgMyB4LCB3aGVyZSB4ID0gQS9CL0MvRDogQWx0LTxhcnJvdz4gLSBpbXBsZW1lbnRlZCBiZWxvdyAqLworCQkvKiBFU0MgWyAxIDsgNCB4LCB3aGVyZSB4ID0gQS9CL0MvRDogQWx0LVNoaWZ0LTxhcnJvdz4gKi8KKwkJLyogRVNDIFsgMSA7IDUgeCwgd2hlcmUgeCA9IEEvQi9DL0Q6IEN0cmwtPGFycm93PiAtIGltcGxlbWVudGVkIGJlbG93ICovCisJCS8qIEVTQyBbIDEgOyA2IHgsIHdoZXJlIHggPSBBL0IvQy9EOiBDdHJsLVNoaWZ0LTxhcnJvdz4gKi8KKwkJLyogRVNDIFsgMSA7IDcgeCwgd2hlcmUgeCA9IEEvQi9DL0Q6IEN0cmwtQWx0LTxhcnJvdz4gKi8KKwkJLyogRVNDIFsgMSA7IDggeCwgd2hlcmUgeCA9IEEvQi9DL0Q6IEN0cmwtQWx0LVNoaWZ0LTxhcnJvdz4gKi8KKwkJJ1snLCdIJyAgICAgICAgfDB4ODAsS0VZQ09ERV9IT01FICAgICwgLyogeHRlcm0gKi8KKwkJJ1snLCdGJyAgICAgICAgfDB4ODAsS0VZQ09ERV9FTkQgICAgICwgLyogeHRlcm0gKi8KKwkJLyogW0VTQ10gRVNDIFsgWzJdIEggLSBbQWx0LV1bU2hpZnQtXUhvbWUgKEVuZCBzaW1pbGFybHk/KSAqLworCQkvKiAnWycsJ1onICAgICAgICB8MHg4MCxLRVlDT0RFX1NISUZUX1RBQiwgKi8KKwkJJ1snLCcxJywnficgICAgfDB4ODAsS0VZQ09ERV9IT01FICAgICwgLyogdnQxMDA/IGxpbnV4IHZ0PyBvciB3aGF0PyAqLworCQknWycsJzInLCd+JyAgICB8MHg4MCxLRVlDT0RFX0lOU0VSVCAgLAorCQkvKiBFU0MgWyAyIDsgMyB+IC0gQWx0LUluc2VydCAqLworCQknWycsJzMnLCd+JyAgICB8MHg4MCxLRVlDT0RFX0RFTEVURSAgLAorCQkvKiBbRVNDXSBFU0MgWyAzIFs7Ml0gfiAtIFtBbHQtXVtTaGlmdC1dRGVsZXRlICovCisJCS8qIEVTQyBbIDMgOyAzIH4gLSBBbHQtRGVsZXRlICovCisJCS8qIEVTQyBbIDMgOyA1IH4gLSBDdHJsLURlbGV0ZSAqLworCQknWycsJzQnLCd+JyAgICB8MHg4MCxLRVlDT0RFX0VORCAgICAgLCAvKiB2dDEwMD8gbGludXggdnQ/IG9yIHdoYXQ/ICovCisJCSdbJywnNScsJ34nICAgIHwweDgwLEtFWUNPREVfUEFHRVVQICAsCisJCS8qIEVTQyBbIDUgOyAzIH4gLSBBbHQtUGdVcCAqLworCQkvKiBFU0MgWyA1IDsgNSB+IC0gQ3RybC1QZ1VwICovCisJCS8qIEVTQyBbIDUgOyA3IH4gLSBDdHJsLUFsdC1QZ1VwICovCisJCSdbJywnNicsJ34nICAgIHwweDgwLEtFWUNPREVfUEFHRURPV04sCisJCSdbJywnNycsJ34nICAgIHwweDgwLEtFWUNPREVfSE9NRSAgICAsIC8qIHZ0MTAwPyBsaW51eCB2dD8gb3Igd2hhdD8gKi8KKwkJJ1snLCc4JywnficgICAgfDB4ODAsS0VZQ09ERV9FTkQgICAgICwgLyogdnQxMDA/IGxpbnV4IHZ0PyBvciB3aGF0PyAqLworI2lmIDAKKwkJJ1snLCcxJywnMScsJ34nfDB4ODAsS0VZQ09ERV9GVU4xICAgICwgLyogb2xkIHh0ZXJtLCBkZXByZWNhdGVkIGJ5IEVTQyBPIFAgKi8KKwkJJ1snLCcxJywnMicsJ34nfDB4ODAsS0VZQ09ERV9GVU4yICAgICwgLyogb2xkIHh0ZXJtLi4uICovCisJCSdbJywnMScsJzMnLCd+J3wweDgwLEtFWUNPREVfRlVOMyAgICAsIC8qIG9sZCB4dGVybS4uLiAqLworCQknWycsJzEnLCc0Jywnfid8MHg4MCxLRVlDT0RFX0ZVTjQgICAgLCAvKiBvbGQgeHRlcm0uLi4gKi8KKwkJJ1snLCcxJywnNScsJ34nfDB4ODAsS0VZQ09ERV9GVU41ICAgICwKKwkJLyogW0VTQ10gRVNDIFsgMSA1IFs7Ml0gfiAtIFtBbHQtXVtTaGlmdC1dRjUgKi8KKwkJJ1snLCcxJywnNycsJ34nfDB4ODAsS0VZQ09ERV9GVU42ICAgICwKKwkJJ1snLCcxJywnOCcsJ34nfDB4ODAsS0VZQ09ERV9GVU43ICAgICwKKwkJJ1snLCcxJywnOScsJ34nfDB4ODAsS0VZQ09ERV9GVU44ICAgICwKKwkJJ1snLCcyJywnMCcsJ34nfDB4ODAsS0VZQ09ERV9GVU45ICAgICwKKwkJJ1snLCcyJywnMScsJ34nfDB4ODAsS0VZQ09ERV9GVU4xMCAgICwKKwkJJ1snLCcyJywnMycsJ34nfDB4ODAsS0VZQ09ERV9GVU4xMSAgICwKKwkJJ1snLCcyJywnNCcsJ34nfDB4ODAsS0VZQ09ERV9GVU4xMiAgICwKKwkJLyogRVNDIFsgMiA0IDsgMiB+IC0gU2hpZnQtRjEyICovCisJCS8qIEVTQyBbIDIgNCA7IDMgfiAtIEFsdC1GMTIgKi8KKwkJLyogRVNDIFsgMiA0IDsgNCB+IC0gQWx0LVNoaWZ0LUYxMiAqLworCQkvKiBFU0MgWyAyIDQgOyA1IH4gLSBDdHJsLUYxMiAqLworCQkvKiBFU0MgWyAyIDQgOyA2IH4gLSBDdHJsLVNoaWZ0LUYxMiAqLworI2VuZGlmCisJCS8qICdbJywnMScsJzsnLCc1JywnQScgfDB4ODAsS0VZQ09ERV9DVFJMX1VQICAgLCAtIHVudXNlZCAqLworCQkvKiAnWycsJzEnLCc7JywnNScsJ0InIHwweDgwLEtFWUNPREVfQ1RSTF9ET1dOICwgLSB1bnVzZWQgKi8KKwkJJ1snLCcxJywnOycsJzUnLCdDJyB8MHg4MCxLRVlDT0RFX0NUUkxfUklHSFQsCisJCSdbJywnMScsJzsnLCc1JywnRCcgfDB4ODAsS0VZQ09ERV9DVFJMX0xFRlQgLAorCQkvKiAnWycsJzEnLCc7JywnMycsJ0EnIHwweDgwLEtFWUNPREVfQUxUX1VQICAgICwgLSB1bnVzZWQgKi8KKwkJLyogJ1snLCcxJywnOycsJzMnLCdCJyB8MHg4MCxLRVlDT0RFX0FMVF9ET1dOICAsIC0gdW51c2VkICovCisJCSdbJywnMScsJzsnLCczJywnQycgfDB4ODAsS0VZQ09ERV9BTFRfUklHSFQsCisJCSdbJywnMScsJzsnLCczJywnRCcgfDB4ODAsS0VZQ09ERV9BTFRfTEVGVCAsCisJCS8qICdbJywnMycsJzsnLCczJywnficgfDB4ODAsS0VZQ09ERV9BTFRfREVMRVRFLCAtIHVudXNlZCAqLworCQkwCisJfTsKKworCXBmZC5mZCA9IGZkOworCXBmZC5ldmVudHMgPSBQT0xMSU47CisKKwlidWZmZXIrKzsgLyogc2F2ZWQgY2hhcnMgY291bnRlciBpcyBpbiBidWZmZXJbLTFdIG5vdyAqLworCisgc3RhcnRfb3ZlcjoKKwllcnJubyA9IDA7CisJbiA9ICh1bnNpZ25lZCBjaGFyKWJ1ZmZlclstMV07CisJaWYgKG4gPT0gMCkgeworCQkvKiBJZiBubyBkYXRhLCB3YWl0IGZvciBpbnB1dC4KKwkJICogSWYgcmVxdWVzdGVkLCB3YWl0IFRJTUVPVVQgbXMuIFRJTUVPVVQgPSAtMSBpcyB1c2VmdWwKKwkJICogaWYgZmQgY2FuIGJlIGluIG5vbi1ibG9ja2luZyBtb2RlLgorCQkgKi8KKwkJaWYgKHRpbWVvdXQgPj0gLTEpIHsKKwkJCWlmIChzYWZlX3BvbGwoJnBmZCwgMSwgdGltZW91dCkgPT0gMCkgeworCQkJCS8qIFRpbWVkIG91dCAqLworCQkJCWVycm5vID0gRUFHQUlOOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCQkvKiBJdCBpcyB0ZW1wdGluZyB0byByZWFkIG1vcmUgdGhhbiBvbmUgYnl0ZSBoZXJlLAorCQkgKiBidXQgaXQgYnJlYWtzIHBhc3RpbmcuIEV4YW1wbGU6IGF0IHNoZWxsIHByb21wdCwKKwkJICogdXNlciBwcmVzc2VzICJjIiwiYSIsInQiIGFuZCB0aGVuIHBhc3RlcyAiXG5saW5lXG4iLgorCQkgKiBXaGVuIHdlIHdlcmUgcmVhZGluZyAzIGJ5dGVzIGhlcmUsIHdlIHdlcmUgZWF0aW5nCisJCSAqICJsaSIgdG9vLCBhbmQgY2F0IHdhcyBnZXR0aW5nIHdyb25nIGlucHV0LgorCQkgKi8KKwkJbiA9IHNhZmVfcmVhZChmZCwgYnVmZmVyLCAxKTsKKwkJaWYgKG4gPD0gMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwl7CisJCXVuc2lnbmVkIGNoYXIgYyA9IGJ1ZmZlclswXTsKKwkJbi0tOworCQlpZiAobikKKwkJCW1lbW1vdmUoYnVmZmVyLCBidWZmZXIgKyAxLCBuKTsKKwkJLyogT25seSBFU0Mgc3RhcnRzIEVTQyBzZXF1ZW5jZXMgKi8KKwkJaWYgKGMgIT0gMjcpIHsKKwkJCWJ1ZmZlclstMV0gPSBuOworCQkJcmV0dXJuIGM7CisJCX0KKwl9CisKKwkvKiBMb29wIHRocm91Z2gga25vd24gRVNDIHNlcXVlbmNlcyAqLworCXNlcSA9IGVzY2NtZHM7CisJd2hpbGUgKCpzZXEgIT0gJ1wwJykgeworCQkvKiBuIC0gcG9zaXRpb24gaW4gc2VxdWVuY2Ugd2UgZGlkIG5vdCByZWFkIHlldCAqLworCQlpbnQgaSA9IDA7IC8qIHBvc2l0aW9uIGluIHNlcXVlbmNlIHRvIGNvbXBhcmUgKi8KKworCQkvKiBMb29wIHRocm91Z2ggY2hhcnMgaW4gdGhpcyBzZXF1ZW5jZSAqLworCQl3aGlsZSAoMSkgeworCQkJLyogU28gZmFyIGVzY2FwZSBzZXF1ZW5jZSBtYXRjaGVkIHVwIHRvIFtpLTFdICovCisJCQlpZiAobiA8PSBpKSB7CisJCQkJLyogTmVlZCBtb3JlIGNoYXJzLCByZWFkIGFub3RoZXIgb25lIGlmIGl0IHdvdWxkbid0IGJsb2NrLgorCQkJCSAqIE5vdGUgdGhhdCBlc2NhcGUgc2VxdWVuY2VzIGNvbWUgaW4gYXMgYSB1bml0LAorCQkJCSAqIHNvIGlmIHdlIGJsb2NrIGZvciBsb25nIGl0J3Mgbm90IHJlYWxseSBhbiBlc2NhcGUgc2VxdWVuY2UuCisJCQkJICogVGltZW91dCBpcyBuZWVkZWQgdG8gcmVjb25uZWN0IGVzY2FwZSBzZXF1ZW5jZXMKKwkJCQkgKiBzcGxpdCB1cCBieSB0cmFuc21pc3Npb24gb3ZlciBhIHNlcmlhbCBjb25zb2xlLiAqLworCQkJCWlmIChzYWZlX3BvbGwoJnBmZCwgMSwgNTApID09IDApIHsKKwkJCQkJLyogTm8gbW9yZSBkYXRhIQorCQkJCQkgKiBBcnJheSBpcyBzb3J0ZWQgZnJvbSBzaG9ydGVzdCB0byBsb25nZXN0LAorCQkJCQkgKiB3ZSBjYW4ndCBtYXRjaCBhbnl0aGluZyBsYXRlciBpbiBhcnJheSAtCisJCQkJCSAqIGFueXRoaW5nIGxhdGVyIGlzIGxvbmdlciB0aGFuIHRoaXMgc2VxLgorCQkJCQkgKiBCcmVhayBvdXQgb2YgYm90aCBsb29wcy4gKi8KKwkJCQkJZ290byBnb3RfYWxsOworCQkJCX0KKwkJCQllcnJubyA9IDA7CisJCQkJaWYgKHNhZmVfcmVhZChmZCwgYnVmZmVyICsgbiwgMSkgPD0gMCkgeworCQkJCQkvKiBJZiBFQUdBSU4sIHRoZW4gZmQgaXMgT19OT05CTE9DSyBhbmQgcG9sbCBsaWVkOgorCQkJCQkgKiBpbiBmYWN0LCB0aGVyZSBpcyBubyBkYXRhLiAqLworCQkJCQlpZiAoZXJybm8gIT0gRUFHQUlOKSB7CisJCQkJCQkvKiBvdGhlcndpc2U6IGl0J3MgRU9GL2Vycm9yICovCisJCQkJCQlidWZmZXJbLTFdID0gMDsKKwkJCQkJCXJldHVybiAtMTsKKwkJCQkJfQorCQkJCQlnb3RvIGdvdF9hbGw7CisJCQkJfQorCQkJCW4rKzsKKwkJCX0KKwkJCWlmIChidWZmZXJbaV0gIT0gKHNlcVtpXSAmIDB4N2YpKSB7CisJCQkJLyogVGhpcyBzZXEgZG9lc24ndCBtYXRjaCwgZ28gdG8gbmV4dCAqLworCQkJCXNlcSArPSBpOworCQkJCS8qIEZvcndhcmQgdG8gbGFzdCBjaGFyICovCisJCQkJd2hpbGUgKCEoKnNlcSAmIDB4ODApKQorCQkJCQlzZXErKzsKKwkJCQkvKiBTa2lwIGl0IGFuZCB0aGUga2V5Y29kZSB3aGljaCBmb2xsb3dzICovCisJCQkJc2VxICs9IDI7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoc2VxW2ldICYgMHg4MCkgeworCQkJCS8qIEVudGlyZSBzZXEgbWF0Y2hlZCAqLworCQkJCW4gPSAwOworCQkJCS8qIG4gLT0gaTsgbWVtbW92ZSguLi4pOworCQkJCSAqIHdvdWxkIGJlIG1vcmUgY29ycmVjdCwKKwkJCQkgKiBidXQgd2UgbmV2ZXIgcmVhZCBhaGVhZCB0aGF0IG11Y2gsCisJCQkJICogYW5kIG4gPT0gaSBoZXJlLiAqLworCQkJCWJ1ZmZlclstMV0gPSAwOworCQkJCXJldHVybiAoc2lnbmVkIGNoYXIpc2VxW2krMV07CisJCQl9CisJCQlpKys7CisJCX0KKwl9CisJLyogV2UgZGlkIG5vdCBmaW5kIG1hdGNoaW5nIHNlcXVlbmNlLgorCSAqIFdlIHBvc3NpYmx5IHJlYWQgYW5kIHN0b3JlZCBtb3JlIGlucHV0IGluIGJ1ZmZlcltdIGJ5IG5vdy4KKwkgKiBuID0gYnl0ZXMgcmVhZC4gVHJ5IHRvIHJlYWQgbW9yZSB1bnRpbCB3ZSB0aW1lIG91dC4KKwkgKi8KKwl3aGlsZSAobiA8IEtFWUNPREVfQlVGRkVSX1NJWkUtMSkgeyAvKiAxIGZvciBjb3VudCBieXRlIGF0IGJ1ZmZlclstMV0gKi8KKwkJaWYgKHNhZmVfcG9sbCgmcGZkLCAxLCA1MCkgPT0gMCkgeworCQkJLyogTm8gbW9yZSBkYXRhISAqLworCQkJYnJlYWs7CisJCX0KKwkJZXJybm8gPSAwOworCQlpZiAoc2FmZV9yZWFkKGZkLCBidWZmZXIgKyBuLCAxKSA8PSAwKSB7CisJCQkvKiBJZiBFQUdBSU4sIHRoZW4gZmQgaXMgT19OT05CTE9DSyBhbmQgcG9sbCBsaWVkOgorCQkJICogaW4gZmFjdCwgdGhlcmUgaXMgbm8gZGF0YS4gKi8KKwkJCWlmIChlcnJubyAhPSBFQUdBSU4pIHsKKwkJCQkvKiBvdGhlcndpc2U6IGl0J3MgRU9GL2Vycm9yICovCisJCQkJYnVmZmVyWy0xXSA9IDA7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJbisrOworCQkvKiBUcnkgdG8gZGVjaXBoZXIgIkVTQyBbIE5OTiA7IE5OTiBSIiBzZXF1ZW5jZSAqLworCQlpZiAoKEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfQVNLX1RFUk1JTkFMCisJCSAgICB8fCBFTkFCTEVfRkVBVFVSRV9WSV9BU0tfVEVSTUlOQUwKKwkJICAgIHx8IEVOQUJMRV9GRUFUVVJFX0xFU1NfQVNLX1RFUk1JTkFMCisJCSAgICApCisJCSAmJiBuID49IDUKKwkJICYmIGJ1ZmZlclswXSA9PSAnWycKKwkJICYmIGJ1ZmZlcltuLTFdID09ICdSJworCQkgJiYgaXNkaWdpdChidWZmZXJbMV0pCisJCSkgeworCQkJY2hhciAqZW5kOworCQkJdW5zaWduZWQgbG9uZyByb3csIGNvbDsKKworCQkJcm93ID0gc3RydG91bChidWZmZXIgKyAxLCAmZW5kLCAxMCk7CisJCQlpZiAoKmVuZCAhPSAnOycgfHwgIWlzZGlnaXQoZW5kWzFdKSkKKwkJCQljb250aW51ZTsKKwkJCWNvbCA9IHN0cnRvdWwoZW5kICsgMSwgJmVuZCwgMTApOworCQkJaWYgKCplbmQgIT0gJ1InKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHJvdyA8IDEgfHwgY29sIDwgMSB8fCAocm93IHwgY29sKSA+IDB4N2ZmZikKKwkJCQljb250aW51ZTsKKworCQkJYnVmZmVyWy0xXSA9IDA7CisJCQkvKiBQYWNrIGludG8gIjEgPHJvdzE1Yml0cz4gPGNvbDE2Yml0cz4iIDMyLWJpdCBzZXF1ZW5jZSAqLworCQkJY29sIHw9ICgoKC0xIDw8IDE1KSB8IHJvdykgPDwgMTYpOworCQkJLyogUmV0dXJuIGl0IGluIGhpZ2gtb3JkZXIgd29yZCAqLworCQkJcmV0dXJuICgoaW50NjRfdCkgY29sIDw8IDMyKSB8ICh1aW50MzJfdClLRVlDT0RFX0NVUlNPUl9QT1M7CisJCX0KKwl9CisgZ290X2FsbDoKKworCWlmIChuIDw9IDEpIHsKKwkJLyogQWx0LXggaXMgdXN1YWxseSByZXR1cm5lZCBhcyBFU0MgeC4KKwkJICogUmVwb3J0IEVTQywgeCBpcyByZW1lbWJlcmVkIGZvciB0aGUgbmV4dCBjYWxsLgorCQkgKi8KKwkJYnVmZmVyWy0xXSA9IG47CisJCXJldHVybiAyNzsKKwl9CisKKwkvKiBXZSB3ZXJlIGRvaW5nICJidWZmZXJbLTFdID0gbjsgcmV0dXJuIGM7IiBoZXJlLCBidXQgdGhpcyByZXN1bHRzCisJICogaW4gdW5rbm93biBrZXkgc2VxdWVuY2VzIGJlaW5nIGludGVycHJldGVkIGFzIEVTQyArIGdhcmJhZ2UuCisJICogVGhpcyB3YXMgbm90IHVzZWZ1bC4gUHJldGVuZCB0aGVyZSB3YXMgbm8ga2V5IHByZXNzZWQsCisJICogZ28gYW5kIHdhaXQgZm9yIGEgbmV3IGtleXByZXNzOgorCSAqLworCWJ1ZmZlclstMV0gPSAwOworCWdvdG8gc3RhcnRfb3ZlcjsKK30KKwordm9pZCBGQVNUX0ZVTkMgcmVhZF9rZXlfdW5nZXRzKGNoYXIgKmJ1ZmZlciwgY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCBsZW4pCit7CisJdW5zaWduZWQgY3VyX2xlbiA9ICh1bnNpZ25lZCBjaGFyKWJ1ZmZlclswXTsKKwlpZiAobGVuID4gS0VZQ09ERV9CVUZGRVJfU0laRS0xIC0gY3VyX2xlbikKKwkJbGVuID0gS0VZQ09ERV9CVUZGRVJfU0laRS0xIC0gY3VyX2xlbjsKKwltZW1jcHkoYnVmZmVyICsgMSArIGN1cl9sZW4sIHN0ciwgbGVuKTsKKwlidWZmZXJbMF0gKz0gbGVuOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvcmVhZF9wcmludGYuYyBiL2xpYmJiL3JlYWRfcHJpbnRmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZhMTdjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3JlYWRfcHJpbnRmLmMKQEAgLTAsMCArMSwyMzYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCisKKy8qIFN1cHBvc2UgdGhhdCB5b3UgYXJlIGEgc2hlbGwuIFlvdSBzdGFydCBjaGlsZCBwcm9jZXNzZXMuCisgKiBUaGV5IHdvcmsgYW5kIGV2ZW50dWFsbHkgZXhpdC4gWW91IHdhbnQgdG8gZ2V0IHVzZXIgaW5wdXQuCisgKiBZb3UgcmVhZCBzdGRpbi4gQnV0IHdoYXQgaGFwcGVucyBpZiBsYXN0IGNoaWxkIHN3aXRjaGVkCisgKiBpdHMgc3RkaW4gaW50byBPX05PTkJMT0NLIG1vZGU/CisgKgorICogKioqIFNVUlBSSVNFISBJdCB3aWxsIGFmZmVjdCB0aGUgcGFyZW50IHRvbyEgKioqCisgKiAqKiogQklHIFNVUlBSSVNFISBJdCBzdGF5cyBldmVuIGFmdGVyIGNoaWxkIGV4aXRzISAqKioKKyAqCisgKiBUaGlzIGlzIGEgZGVzaWduIGJ1ZyBpbiBVTklYIEFQSS4KKyAqICAgICAgZmNudGwoMCwgRl9TRVRGTCwgZmNudGwoMCwgRl9HRVRGTCkgfCBPX05PTkJMT0NLKTsKKyAqIHdpbGwgc2V0IG5vbmJsb2NraW5nIG1vZGUgbm90IG9ubHkgb24gX3lvdXJfIHN0ZGluLCBidXQKKyAqIGFsc28gb24gc3RkaW4gb2YgeW91ciBwYXJlbnQsIGV0Yy4KKyAqCisgKiBJbiBnZW5lcmFsLAorICogICAgICBmZDIgPSBkdXAoZmQxKTsKKyAqICAgICAgZmNudGwoZmQyLCBGX1NFVEZMLCBmY250bChmZDIsIEZfR0VURkwpIHwgT19OT05CTE9DSyk7CisgKiBzZXRzIGJvdGggZmQxIGFuZCBmZDIgdG8gT19OT05CTE9DSy4gVGhpcyBpbmNsdWRlcyBjYXNlcworICogd2hlcmUgZHVwaW5nIGlzIGRvbmUgaW1wbGljaXRseSBieSBmb3JrKCkgZXRjLgorICoKKyAqIFdlIG5lZWQKKyAqICAgICAgZmNudGwoZmQyLCBGX1NFVEZELCBmY250bChmZDIsIEZfR0VURkQpIHwgT19OT05CTE9DSyk7CisgKiAobm90ZSBTRVRGRCwgbm90IFNFVEZMISkgYnV0IHN1Y2ggdGhpbmcgZG9lc24ndCBleGlzdC4KKyAqCisgKiBBbHRlcm5hdGl2ZWx5LCB3ZSBuZWVkIG5vbmJsb2NraW5nX3JlYWQoZmQsIC4uLikgd2hpY2ggZG9lc24ndAorICogcmVxdWlyZSBPX05PTkJMT0NLIGRhbmNlIGF0IGFsbC4gQWN0dWFsbHksIGl0IGV4aXN0czoKKyAqICAgICAgbiA9IHJlY3YoZmQsIGJ1ZiwgbGVuLCBNU0dfRE9OVFdBSVQpOworICogICAgICAiTVNHX0RPTlRXQUlUOgorICogICAgICBFbmFibGVzIG5vbi1ibG9ja2luZyBvcGVyYXRpb247IGlmIHRoZSBvcGVyYXRpb24KKyAqICAgICAgd291bGQgYmxvY2ssIEVBR0FJTiBpcyByZXR1cm5lZC4iCisgKiBidXQgcmVjdigpIHdvcmtzIG9ubHkgZm9yIHNvY2tldHMhCisgKgorICogU28gZmFyIEkgZG9uJ3Qgc2VlIGFueSBnb29kIHNvbHV0aW9uLCBJIGNhbiBvbmx5IHByb3Bvc2UKKyAqIHRoYXQgYWZmZWN0ZWQgcmVhZGVycyBzaG91bGQgYmUgY2FyZWZ1bCBhbmQgdXNlIHRoaXMgcm91dGluZSwKKyAqIHdoaWNoIGRldGVjdHMgRUFHQUlOIGFuZCB1c2VzIHBvbGwoKSB0byB3YWl0IG9uIHRoZSBmZC4KKyAqIFRoYW5rZnVsbHksIHBvbGwoKSBkb2Vzbid0IGNhcmUgYWJvdXQgT19OT05CTE9DSyBmbGFnLgorICovCitzc2l6ZV90IEZBU1RfRlVOQyBub25ibG9ja19pbW11bmVfcmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBwb2xsZmQgcGZkWzFdOworCXNzaXplX3QgbjsKKworCXdoaWxlICgxKSB7CisJCW4gPSBzYWZlX3JlYWQoZmQsIGJ1ZiwgY291bnQpOworCQlpZiAobiA+PSAwIHx8IGVycm5vICE9IEVBR0FJTikKKwkJCXJldHVybiBuOworCQkvKiBmZCBpcyBpbiBPX05PTkJMT0NLIG1vZGUuIFdhaXQgdXNpbmcgcG9sbCBhbmQgcmVwZWF0ICovCisJCXBmZFswXS5mZCA9IGZkOworCQlwZmRbMF0uZXZlbnRzID0gUE9MTElOOworCQkvKiBub3RlOiBzYWZlX3BvbGwgcHVsbHMgaW4gcHJpbnRmICovCisJCXNhZmVfcG9sbChwZmQsIDEsIC0xKTsKKwl9Cit9CisKKy8vIFJlYWRzIG9uZSBsaW5lIGEtbGEgZmdldHMgKGJ1dCBkb2Vzbid0IHNhdmUgdGVybWluYXRpbmcgJ1xuJykuCisvLyBSZWFkcyBieXRlLWJ5LWJ5dGUuIFVzZWZ1bCB3aGVuIGl0IGlzIGltcG9ydGFudCB0byBub3QgcmVhZCBhaGVhZC4KKy8vIEJ5dGVzIGFyZSBhcHBlbmRlZCB0byBwZnggKHdoaWNoIG11c3QgYmUgbWFsbG9jZWQsIG9yIE5VTEwpLgorY2hhciogRkFTVF9GVU5DIHhtYWxsb2NfcmVhZHMoaW50IGZkLCBzaXplX3QgKm1heHN6X3ApCit7CisJY2hhciAqcDsKKwljaGFyICpidWYgPSBOVUxMOworCXNpemVfdCBzeiA9IDA7CisJc2l6ZV90IG1heHN6ID0gbWF4c3pfcCA/ICptYXhzel9wIDogKElOVF9NQVggLSA0MDk1KTsKKworCWdvdG8ganVtcF9pbjsKKworCXdoaWxlIChzeiA8IG1heHN6KSB7CisJCWlmICgoc2l6ZV90KShwIC0gYnVmKSA9PSBzeikgeworIGp1bXBfaW46CisJCQlidWYgPSB4cmVhbGxvYyhidWYsIHN6ICsgMTI4KTsKKwkJCXAgPSBidWYgKyBzejsKKwkJCXN6ICs9IDEyODsKKwkJfQorCQlpZiAobm9uYmxvY2tfaW1tdW5lX3JlYWQoZmQsIHAsIDEpICE9IDEpIHsKKwkJCS8qIEVPRi9lcnJvciAqLworCQkJaWYgKHAgPT0gYnVmKSB7IC8qIHdlIHJlYWQgbm90aGluZyAqLworCQkJCWZyZWUoYnVmKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWlmICgqcCA9PSAnXG4nKQorCQkJYnJlYWs7CisJCXArKzsKKwl9CisJKnAgPSAnXDAnOworCWlmIChtYXhzel9wKQorCQkqbWF4c3pfcCAgPSBwIC0gYnVmOworCXArKzsKKwlyZXR1cm4geHJlYWxsb2MoYnVmLCBwIC0gYnVmKTsKK30KKworLy8gUmVhZCAocG90ZW50aWFsbHkgYmlnKSBmaWxlcyBpbiBvbmUgZ28uIEZpbGUgc2l6ZSBpcyBlc3RpbWF0ZWQKKy8vIGJ5IHN0YXQuIEV4dHJhICdcMCcgYnl0ZSBpcyBhcHBlbmRlZC4KK3ZvaWQqIEZBU1RfRlVOQyB4bWFsbG9jX3JlYWQoaW50IGZkLCBzaXplX3QgKm1heHN6X3ApCit7CisJY2hhciAqYnVmOworCXNpemVfdCBzaXplLCByZF9zaXplLCB0b3RhbDsKKwlzaXplX3QgdG9fcmVhZDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCXRvX3JlYWQgPSBtYXhzel9wID8gKm1heHN6X3AgOiAoSU5UX01BWCAtIDQwOTUpOyAvKiBtYXggdG8gcmVhZCAqLworCisJLyogRXN0aW1hdGUgZmlsZSBzaXplICovCisJc3Quc3Rfc2l6ZSA9IDA7IC8qIGluIGNhc2UgZnN0YXQgZmFpbHMsIGFzc3VtZSAwICovCisJZnN0YXQoZmQsICZzdCk7CisJLyogL3Byb2MvTi9zdGF0IGZpbGVzIHJlcG9ydCBzdF9zaXplIDAgKi8KKwkvKiBJbiBvcmRlciB0byBtYWtlIHN1Y2ggZmlsZXMgcmVhZGFibGUsIHdlIGFkZCBzbWFsbCBjb25zdCAqLworCXNpemUgPSAoc3Quc3Rfc2l6ZSB8IDB4M2ZmKSArIDE7CisKKwl0b3RhbCA9IDA7CisJYnVmID0gTlVMTDsKKwl3aGlsZSAoMSkgeworCQlpZiAodG9fcmVhZCA8IHNpemUpCisJCQlzaXplID0gdG9fcmVhZDsKKwkJYnVmID0geHJlYWxsb2MoYnVmLCB0b3RhbCArIHNpemUgKyAxKTsKKwkJcmRfc2l6ZSA9IGZ1bGxfcmVhZChmZCwgYnVmICsgdG90YWwsIHNpemUpOworCQlpZiAoKHNzaXplX3QpcmRfc2l6ZSA9PSAoc3NpemVfdCkoLTEpKSB7IC8qIGVycm9yICovCisJCQlmcmVlKGJ1Zik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQl0b3RhbCArPSByZF9zaXplOworCQlpZiAocmRfc2l6ZSA8IHNpemUpIC8qIEVPRiAqLworCQkJYnJlYWs7CisJCWlmICh0b19yZWFkIDw9IHJkX3NpemUpCisJCQlicmVhazsKKwkJdG9fcmVhZCAtPSByZF9zaXplOworCQkvKiBncm93IGJ5IDEvOCwgYnV0IGluIFsxay4uNjRrXSBib3VuZHMgKi8KKwkJc2l6ZSA9ICgodG90YWwgLyA4KSB8IDB4M2ZmKSArIDE7CisJCWlmIChzaXplID4gNjQqMTAyNCkKKwkJCXNpemUgPSA2NCoxMDI0OworCX0KKwlidWYgPSB4cmVhbGxvYyhidWYsIHRvdGFsICsgMSk7CisJYnVmW3RvdGFsXSA9ICdcMCc7CisKKwlpZiAobWF4c3pfcCkKKwkJKm1heHN6X3AgPSB0b3RhbDsKKwlyZXR1cm4gYnVmOworfQorCisjaWZkZWYgVVNJTkdfTFNFRUtfVE9fR0VUX1NJWkUKKy8qIEFsdGVybmF0aXZlbHksIGZpbGUgc2l6ZSBjYW4gYmUgb2J0YWluZWQgYnkgbHNlZWsgdG8gdGhlIGVuZC4KKyAqIFRoZSBjb2RlIGlzIHNsaWdodGx5IGJpZ2dlci4gUmV0YWluZWQgaW4gY2FzZSBmc3RhdCBhcHByb2FjaAorICogd2lsbCBub3Qgd29yayBmb3Igc29tZSB3ZWlyZCBjYXNlcyAoL3Byb2MsIGJsb2NrIGRldmljZXMsIGV0YykuCisgKiAoTkI6IGxzZWVrIGFsc28gY2FuIGZhaWwgdG8gd29yayBmb3Igc29tZSB3ZWlyZCBmaWxlcykgKi8KKworLy8gUmVhZCAocG90ZW50aWFsbHkgYmlnKSBmaWxlcyBpbiBvbmUgZ28uIEZpbGUgc2l6ZSBpcyBlc3RpbWF0ZWQgYnkKKy8vIGxzZWVrIHRvIGVuZC4KK3ZvaWQqIEZBU1RfRlVOQyB4bWFsbG9jX29wZW5fcmVhZF9jbG9zZShjb25zdCBjaGFyICpmaWxlbmFtZSwgc2l6ZV90ICptYXhzel9wKQoreworCWNoYXIgKmJ1ZjsKKwlzaXplX3Qgc2l6ZTsKKwlpbnQgZmQ7CisJb2ZmX3QgbGVuOworCisJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiAvcHJvYy9OL3N0YXQgZmlsZXMgcmVwb3J0IGxlbiAwIGhlcmUgKi8KKwkvKiBJbiBvcmRlciB0byBtYWtlIHN1Y2ggZmlsZXMgcmVhZGFibGUsIHdlIGFkZCBzbWFsbCBjb25zdCAqLworCXNpemUgPSAweDNmZjsgLyogcmVhZCBvbmx5IDFrIG9uIHVuc2Vla2FibGUgZmlsZXMgKi8KKwlsZW4gPSBsc2VlayhmZCwgMCwgU0VFS19FTkQpIHwgMHgzZmY7IC8qICsgdXAgdG8gMWsgKi8KKwlpZiAobGVuICE9IChvZmZfdCktMSkgeworCQl4bHNlZWsoZmQsIDAsIFNFRUtfU0VUKTsKKwkJc2l6ZSA9IG1heHN6X3AgPyAqbWF4c3pfcCA6IChJTlRfTUFYIC0gNDA5NSk7CisJCWlmIChsZW4gPCBzaXplKQorCQkJc2l6ZSA9IGxlbjsKKwl9CisKKwlidWYgPSB4bWFsbG9jKHNpemUgKyAxKTsKKwlzaXplID0gcmVhZF9jbG9zZShmZCwgYnVmLCBzaXplKTsKKwlpZiAoKHNzaXplX3Qpc2l6ZSA8IDApIHsKKwkJZnJlZShidWYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJYnVmID0geHJlYWxsb2MoYnVmLCBzaXplICsgMSk7CisJYnVmW3NpemVdID0gJ1wwJzsKKworCWlmIChtYXhzel9wKQorCQkqbWF4c3pfcCA9IHNpemU7CisJcmV0dXJuIGJ1ZjsKK30KKyNlbmRpZgorCisvLyBSZWFkIChwb3RlbnRpYWxseSBiaWcpIGZpbGVzIGluIG9uZSBnby4gRmlsZSBzaXplIGlzIGVzdGltYXRlZAorLy8gYnkgc3RhdC4KK3ZvaWQqIEZBU1RfRlVOQyB4bWFsbG9jX29wZW5fcmVhZF9jbG9zZShjb25zdCBjaGFyICpmaWxlbmFtZSwgc2l6ZV90ICptYXhzel9wKQoreworCWNoYXIgKmJ1ZjsKKwlpbnQgZmQ7CisKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gTlVMTDsKKworCWJ1ZiA9IHhtYWxsb2NfcmVhZChmZCwgbWF4c3pfcCk7CisJY2xvc2UoZmQpOworCXJldHVybiBidWY7Cit9CisKKy8qIERpZSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgd2UgY2FuJ3QgcmVhZCB0aGUgZW50aXJlIGJ1ZmZlci4gKi8KK3ZvaWQgRkFTVF9GVU5DIHhyZWFkKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpCit7CisJaWYgKGNvdW50KSB7CisJCXNzaXplX3Qgc2l6ZSA9IGZ1bGxfcmVhZChmZCwgYnVmLCBjb3VudCk7CisJCWlmICgoc2l6ZV90KXNpemUgIT0gY291bnQpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic2hvcnQgcmVhZCIpOworCX0KK30KKworLyogRGllIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiB3ZSBjYW4ndCByZWFkIG9uZSBjaGFyYWN0ZXIuICovCit1bnNpZ25lZCBjaGFyIEZBU1RfRlVOQyB4cmVhZF9jaGFyKGludCBmZCkKK3sKKwljaGFyIHRtcDsKKwl4cmVhZChmZCwgJnRtcCwgMSk7CisJcmV0dXJuIHRtcDsKK30KKwordm9pZCogRkFTVF9GVU5DIHhtYWxsb2NfeG9wZW5fcmVhZF9jbG9zZShjb25zdCBjaGFyICpmaWxlbmFtZSwgc2l6ZV90ICptYXhzel9wKQoreworCXZvaWQgKmJ1ZiA9IHhtYWxsb2Nfb3Blbl9yZWFkX2Nsb3NlKGZpbGVuYW1lLCBtYXhzel9wKTsKKwlpZiAoIWJ1ZikKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCByZWFkICclcyciLCBmaWxlbmFtZSk7CisJcmV0dXJuIGJ1ZjsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3JlY3Vyc2l2ZV9hY3Rpb24uYyBiL2xpYmJiL3JlY3Vyc2l2ZV9hY3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWNmN2MwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvcmVjdXJzaXZlX2FjdGlvbi5jCkBAIC0wLDAgKzEsMTU2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjdW5kZWYgREVCVUdfUkVDVVJTX0FDVElPTgorCisvKgorICogV2FsayBkb3duIGFsbCB0aGUgZGlyZWN0b3JpZXMgdW5kZXIgdGhlIHNwZWNpZmllZAorICogbG9jYXRpb24sIGFuZCBkbyBzb21ldGhpbmcgKHNvbWV0aGluZyBzcGVjaWZpZWQKKyAqIGJ5IHRoZSBmaWxlQWN0aW9uIGFuZCBkaXJBY3Rpb24gZnVuY3Rpb24gcG9pbnRlcnMpLgorICoKKyAqIFVuZm9ydHVuYXRlbHksIHdoaWxlIG5mdHcoMykgY291bGQgcmVwbGFjZSB0aGlzIGFuZCByZWR1Y2UKKyAqIGNvZGUgc2l6ZSBhIGJpdCwgbmZ0dygpIHdhc24ndCBzdXBwb3J0ZWQgYmVmb3JlIEdOVSBsaWJjIDIuMSwKKyAqIGFuZCBzbyBpc24ndCBzdWZmaWNpZW50bHkgcG9ydGFibGUgdG8gdGFrZSBvdmVyIHNpbmNlIGdsaWJjMi4xCisgKiBpcyBzbyBzdGlua2luZyBodWdlLgorICovCisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHRydWVfYWN0aW9uKGNvbnN0IGNoYXIgKmZpbGVOYW1lIFVOVVNFRF9QQVJBTSwKKwkJc3RydWN0IHN0YXQgKnN0YXRidWYgVU5VU0VEX1BBUkFNLAorCQl2b2lkKiB1c2VyRGF0YSBVTlVTRURfUEFSQU0sCisJCWludCBkZXB0aCBVTlVTRURfUEFSQU0pCit7CisJcmV0dXJuIFRSVUU7Cit9CisKKy8qIGZpbGVBY3Rpb24gcmV0dXJuIHZhbHVlIG9mIDAgb24gYW55IGZpbGUgaW4gZGlyZWN0b3J5IHdpbGwgbWFrZQorICogcmVjdXJzaXZlX2FjdGlvbigpIHJldHVybiAwLCBidXQgaXQgZG9lc24ndCBzdG9wIGRpcmVjdG9yeSB0cmF2ZXJzYWwKKyAqIChmaWxlQWN0aW9uL2RpckFjdGlvbiB3aWxsIGJlIGNhbGxlZCBvbiBlYWNoIGZpbGUpLgorICoKKyAqIElmICFBQ1RJT05fUkVDVVJTRSwgZGlyQWN0aW9uIGlzIGNhbGxlZCBvbiB0aGUgZGlyZWN0b3J5IGFuZCBpdHMKKyAqIHJldHVybiB2YWx1ZSBpcyByZXR1cm5lZCBmcm9tIHJlY3Vyc2l2ZV9hY3Rpb24oKS4gTm8gcmVjdXJzaW9uLgorICoKKyAqIElmIEFDVElPTl9SRUNVUlNFLCByZWN1cnNpdmVfYWN0aW9uKCkgaXMgY2FsbGVkIG9uIGVhY2ggZGlyZWN0b3J5LgorICogSWYgYW55IG9uZSBvZiB0aGVzZSBjYWxscyByZXR1cm5zIDAsIGN1cnJlbnQgcmVjdXJzaXZlX2FjdGlvbigpIHJldHVybnMgMC4KKyAqCisgKiBJZiBBQ1RJT05fREVQVEhGSVJTVCwgZGlyQWN0aW9uIGlzIGNhbGxlZCBhZnRlciByZWN1cnNlLgorICogSWYgaXQgcmV0dXJucyAwLCB0aGUgd2FybmluZyBpcyBwcmludGVkIGFuZCByZWN1cnNpdmVfYWN0aW9uKCkgcmV0dXJucyAwLgorICoKKyAqIElmICFBQ1RJT05fREVQVEhGSVJTVCwgZGlyQWN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgd2UgcmVjdXJzZS4KKyAqIFJldHVybiB2YWx1ZSBvZiAwIChGQUxTRSkgb3IgMiAoU0tJUCkgcHJldmVudHMgcmVjdXJzaW9uCisgKiBpbnRvIHRoYXQgZGlyZWN0b3J5LCBpbnN0ZWFkIHJlY3Vyc2l2ZV9hY3Rpb24oKSByZXR1cm5zIDAgKGlmIEZBTFNFKQorICogb3IgMSAoaWYgU0tJUCkKKyAqCisgKiBBQ1RJT05fRk9MTE9XTElOS1MgbWFpbmx5IGNvbnRyb2xzIGhhbmRsaW5nIG9mIGxpbmtzIHRvIGRpcnMuCisgKiAwOiBsc3RhdChzdGF0YnVmKS4gQ2FsbHMgZmlsZUFjdGlvbiBvbiBsaW5rIG5hbWUgZXZlbiBpZiBwb2ludHMgdG8gZGlyLgorICogMTogc3RhdChzdGF0YnVmKS4gQ2FsbHMgZGlyQWN0aW9uIGFuZCBvcHRpb25hbGx5IHJlY3Vyc2Ugb24gbGluayB0byBkaXIuCisgKi8KKworaW50IEZBU1RfRlVOQyByZWN1cnNpdmVfYWN0aW9uKGNvbnN0IGNoYXIgKmZpbGVOYW1lLAorCQl1bnNpZ25lZCBmbGFncywKKwkJaW50IEZBU1RfRlVOQyAoKmZpbGVBY3Rpb24pKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1Ziwgdm9pZCogdXNlckRhdGEsIGludCBkZXB0aCksCisJCWludCBGQVNUX0ZVTkMgKCpkaXJBY3Rpb24pKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBzdHJ1Y3Qgc3RhdCAqc3RhdGJ1Ziwgdm9pZCogdXNlckRhdGEsIGludCBkZXB0aCksCisJCXZvaWQqIHVzZXJEYXRhLAorCQl1bnNpZ25lZCBkZXB0aCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCXVuc2lnbmVkIGZvbGxvdzsKKwlpbnQgc3RhdHVzOworCURJUiAqZGlyOworCXN0cnVjdCBkaXJlbnQgKm5leHQ7CisKKwlpZiAoIWZpbGVBY3Rpb24pIGZpbGVBY3Rpb24gPSB0cnVlX2FjdGlvbjsKKwlpZiAoIWRpckFjdGlvbikgZGlyQWN0aW9uID0gdHJ1ZV9hY3Rpb247CisKKwlmb2xsb3cgPSBBQ1RJT05fRk9MTE9XTElOS1M7CisJaWYgKGRlcHRoID09IDApCisJCWZvbGxvdyA9IEFDVElPTl9GT0xMT1dMSU5LUyB8IEFDVElPTl9GT0xMT1dMSU5LU19MMDsKKwlmb2xsb3cgJj0gZmxhZ3M7CisJc3RhdHVzID0gKGZvbGxvdyA/IHN0YXQgOiBsc3RhdCkoZmlsZU5hbWUsICZzdGF0YnVmKTsKKwlpZiAoc3RhdHVzIDwgMCkgeworI2lmZGVmIERFQlVHX1JFQ1VSU19BQ1RJT04KKwkJYmJfZXJyb3JfbXNnKCJzdGF0dXM9JWQgZmxhZ3M9JXgiLCBzdGF0dXMsIGZsYWdzKTsKKyNlbmRpZgorCQlpZiAoKGZsYWdzICYgQUNUSU9OX0RBTkdMSU5HX09LKQorCQkgJiYgZXJybm8gPT0gRU5PRU5UCisJCSAmJiBsc3RhdChmaWxlTmFtZSwgJnN0YXRidWYpID09IDAKKwkJKSB7CisJCQkvKiBEYW5nbGluZyBsaW5rICovCisJCQlyZXR1cm4gZmlsZUFjdGlvbihmaWxlTmFtZSwgJnN0YXRidWYsIHVzZXJEYXRhLCBkZXB0aCk7CisJCX0KKwkJZ290byBkb25lX25ha193YXJuOworCX0KKworCS8qIElmIFNfSVNMTksobSksIHRoZW4gd2Uga25vdyB0aGF0ICFTX0lTRElSKG0pLgorCSAqIFRoZW4gd2UgY2FuIHNraXAgY2hlY2tpbmcgZmlyc3QgcGFydDogaWYgaXQgaXMgdHJ1ZSwgdGhlbgorCSAqICghZGlyKSBpcyBhbHNvIHRydWUhICovCisJaWYgKCAvKiAoIShmbGFncyAmIEFDVElPTl9GT0xMT1dMSU5LUykgJiYgU19JU0xOSyhzdGF0YnVmLnN0X21vZGUpKSB8fCAqLworCSAhU19JU0RJUihzdGF0YnVmLnN0X21vZGUpCisJKSB7CisJCXJldHVybiBmaWxlQWN0aW9uKGZpbGVOYW1lLCAmc3RhdGJ1ZiwgdXNlckRhdGEsIGRlcHRoKTsKKwl9CisKKwkvKiBJdCdzIGEgZGlyZWN0b3J5IChvciBhIGxpbmsgdG8gb25lLCBhbmQgZm9sbG93TGlua3MgaXMgc2V0KSAqLworCisJaWYgKCEoZmxhZ3MgJiBBQ1RJT05fUkVDVVJTRSkpIHsKKwkJcmV0dXJuIGRpckFjdGlvbihmaWxlTmFtZSwgJnN0YXRidWYsIHVzZXJEYXRhLCBkZXB0aCk7CisJfQorCisJaWYgKCEoZmxhZ3MgJiBBQ1RJT05fREVQVEhGSVJTVCkpIHsKKwkJc3RhdHVzID0gZGlyQWN0aW9uKGZpbGVOYW1lLCAmc3RhdGJ1ZiwgdXNlckRhdGEsIGRlcHRoKTsKKwkJaWYgKCFzdGF0dXMpCisJCQlnb3RvIGRvbmVfbmFrX3dhcm47CisJCWlmIChzdGF0dXMgPT0gU0tJUCkKKwkJCXJldHVybiBUUlVFOworCX0KKworCWRpciA9IG9wZW5kaXIoZmlsZU5hbWUpOworCWlmICghZGlyKSB7CisJCS8qIGZpbmR1dGlscy00LjEuMjAgcmVwb3J0cyB0aGlzICovCisJCS8qIChpLmUuIGl0IGRvZXNuJ3Qgc2lsZW50bHkgcmV0dXJuIHdpdGggZXhpdCBjb2RlIDEpICovCisJCS8qIFRvIHRyaWdnZXI6ICJmaW5kIC1leGVjIHJtIC1yZiB7fSBcOyIgKi8KKwkJZ290byBkb25lX25ha193YXJuOworCX0KKwlzdGF0dXMgPSBUUlVFOworCXdoaWxlICgobmV4dCA9IHJlYWRkaXIoZGlyKSkgIT0gTlVMTCkgeworCQljaGFyICpuZXh0RmlsZTsKKworCQluZXh0RmlsZSA9IGNvbmNhdF9zdWJwYXRoX2ZpbGUoZmlsZU5hbWUsIG5leHQtPmRfbmFtZSk7CisJCWlmIChuZXh0RmlsZSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCS8qIHByb2Nlc3MgZXZlcnkgZmlsZSAoTkI6IEFDVElPTl9SRUNVUlNFIGlzIHNldCBpbiBmbGFncykgKi8KKwkJaWYgKCFyZWN1cnNpdmVfYWN0aW9uKG5leHRGaWxlLCBmbGFncywgZmlsZUFjdGlvbiwgZGlyQWN0aW9uLAorCQkJCQkJdXNlckRhdGEsIGRlcHRoICsgMSkpCisJCQlzdGF0dXMgPSBGQUxTRTsKKy8vCQlzID0gcmVjdXJzaXZlX2FjdGlvbihuZXh0RmlsZSwgZmxhZ3MsIGZpbGVBY3Rpb24sIGRpckFjdGlvbiwKKy8vCQkJCQkJdXNlckRhdGEsIGRlcHRoICsgMSk7CisJCWZyZWUobmV4dEZpbGUpOworLy8jZGVmaW5lIFJFQ1VSU0VfUkVTVUxUX0FCT1JUIDMKKy8vCQlpZiAocyA9PSBSRUNVUlNFX1JFU1VMVF9BQk9SVCkgeworLy8JCQljbG9zZWRpcihkaXIpOworLy8JCQlyZXR1cm4gczsKKy8vCQl9CisvLwkJaWYgKHMgPT0gRkFMU0UpCisvLwkJCXN0YXR1cyA9IEZBTFNFOworCX0KKwljbG9zZWRpcihkaXIpOworCisJaWYgKGZsYWdzICYgQUNUSU9OX0RFUFRIRklSU1QpIHsKKwkJaWYgKCFkaXJBY3Rpb24oZmlsZU5hbWUsICZzdGF0YnVmLCB1c2VyRGF0YSwgZGVwdGgpKQorCQkJZ290byBkb25lX25ha193YXJuOworCX0KKworCXJldHVybiBzdGF0dXM7CisKKyBkb25lX25ha193YXJuOgorCWlmICghKGZsYWdzICYgQUNUSU9OX1FVSUVUKSkKKwkJYmJfc2ltcGxlX3BlcnJvcl9tc2coZmlsZU5hbWUpOworCXJldHVybiBGQUxTRTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3JlbW92ZV9maWxlLmMgYi9saWJiYi9yZW1vdmVfZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhY2EyOTMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9yZW1vdmVfZmlsZS5jCkBAIC0wLDAgKzEsMTEwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHJlbW92ZV9maWxlIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIE1hdHQgS3JhYWkgPGtyYWFpQGFsdW1uaS5jYXJuZWdpZW1lbGxvbi5lZHU+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVXNlZCBmcm9tIE5PRk9SSyBhcHBsZXRzLiBNdXN0IG5vdCBhbGxvY2F0ZSBhbnl0aGluZyAqLworCitpbnQgRkFTVF9GVU5DIHJlbW92ZV9maWxlKGNvbnN0IGNoYXIgKnBhdGgsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc3RhdCBwYXRoX3N0YXQ7CisKKwlpZiAobHN0YXQocGF0aCwgJnBhdGhfc3RhdCkgPCAwKSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpIHsKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IHN0YXQgJyVzJyIsIHBhdGgpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmICghKGZsYWdzICYgRklMRVVUSUxTX0ZPUkNFKSkgeworCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgcmVtb3ZlICclcyciLCBwYXRoKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoU19JU0RJUihwYXRoX3N0YXQuc3RfbW9kZSkpIHsKKwkJRElSICpkcDsKKwkJc3RydWN0IGRpcmVudCAqZDsKKwkJaW50IHN0YXR1cyA9IDA7CisKKwkJaWYgKCEoZmxhZ3MgJiBGSUxFVVRJTFNfUkVDVVIpKSB7CisJCQliYl9lcnJvcl9tc2coIiclcycgaXMgYSBkaXJlY3RvcnkiLCBwYXRoKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmICgoIShmbGFncyAmIEZJTEVVVElMU19GT1JDRSkgJiYgYWNjZXNzKHBhdGgsIFdfT0spIDwgMCAmJiBpc2F0dHkoMCkpCisJCSB8fCAoZmxhZ3MgJiBGSUxFVVRJTFNfSU5URVJBQ1RJVkUpCisJCSkgeworCQkJZnByaW50ZihzdGRlcnIsICIlczogZGVzY2VuZCBpbnRvIGRpcmVjdG9yeSAnJXMnPyAiLCBhcHBsZXRfbmFtZSwKKwkJCQkJcGF0aCk7CisJCQlpZiAoIWJiX2Fza19jb25maXJtYXRpb24oKSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCisJCWRwID0gb3BlbmRpcihwYXRoKTsKKwkJaWYgKGRwID09IE5VTEwpIHsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXdoaWxlICgoZCA9IHJlYWRkaXIoZHApKSAhPSBOVUxMKSB7CisJCQljaGFyICpuZXdfcGF0aDsKKworCQkJbmV3X3BhdGggPSBjb25jYXRfc3VicGF0aF9maWxlKHBhdGgsIGQtPmRfbmFtZSk7CisJCQlpZiAobmV3X3BhdGggPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCWlmIChyZW1vdmVfZmlsZShuZXdfcGF0aCwgZmxhZ3MpIDwgMCkKKwkJCQlzdGF0dXMgPSAtMTsKKwkJCWZyZWUobmV3X3BhdGgpOworCQl9CisKKwkJaWYgKGNsb3NlZGlyKGRwKSA8IDApIHsKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IGNsb3NlICclcyciLCBwYXRoKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChmbGFncyAmIEZJTEVVVElMU19JTlRFUkFDVElWRSkgeworCQkJZnByaW50ZihzdGRlcnIsICIlczogcmVtb3ZlIGRpcmVjdG9yeSAnJXMnPyAiLCBhcHBsZXRfbmFtZSwgcGF0aCk7CisJCQlpZiAoIWJiX2Fza19jb25maXJtYXRpb24oKSkKKwkJCQlyZXR1cm4gc3RhdHVzOworCQl9CisKKwkJaWYgKHJtZGlyKHBhdGgpIDwgMCkgeworCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgcmVtb3ZlICclcyciLCBwYXRoKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWlmIChmbGFncyAmIEZJTEVVVElMU19WRVJCT1NFKSB7CisJCQlwcmludGYoInJlbW92ZWQgZGlyZWN0b3J5OiAnJXMnXG4iLCBwYXRoKTsKKwkJfQorCisJCXJldHVybiBzdGF0dXM7CisJfQorCisJLyogIUlTRElSICovCisJaWYgKCghKGZsYWdzICYgRklMRVVUSUxTX0ZPUkNFKQorCSAgICAgJiYgYWNjZXNzKHBhdGgsIFdfT0spIDwgMAorCSAgICAgJiYgIVNfSVNMTksocGF0aF9zdGF0LnN0X21vZGUpCisJICAgICAmJiBpc2F0dHkoMCkpCisJIHx8IChmbGFncyAmIEZJTEVVVElMU19JTlRFUkFDVElWRSkKKwkpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlczogcmVtb3ZlICclcyc/ICIsIGFwcGxldF9uYW1lLCBwYXRoKTsKKwkJaWYgKCFiYl9hc2tfY29uZmlybWF0aW9uKCkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAodW5saW5rKHBhdGgpIDwgMCkgeworCQliYl9wZXJyb3JfbXNnKCJjYW4ndCByZW1vdmUgJyVzJyIsIHBhdGgpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGZsYWdzICYgRklMRVVUSUxTX1ZFUkJPU0UpIHsKKwkJcHJpbnRmKCJyZW1vdmVkICclcydcbiIsIHBhdGgpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvcmVwbGFjZS5jIGIvbGliYmIvcmVwbGFjZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MTFmOTUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9yZXBsYWNlLmMKQEAgLTAsMCArMSw0NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2tidWlsZDpsaWIteSArPSByZXBsYWNlLm8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3Vuc2lnbmVkIEZBU1RfRlVOQyBjb3VudF9zdHJzdHIoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpzdWIpCit7CisJc2l6ZV90IHN1Yl9sZW4gPSBzdHJsZW4oc3ViKTsKKwl1bnNpZ25lZCBjb3VudCA9IDA7CisKKwl3aGlsZSAoKHN0ciA9IHN0cnN0cihzdHIsIHN1YikpICE9IE5VTEwpIHsKKwkJY291bnQrKzsKKwkJc3RyICs9IHN1Yl9sZW47CisJfQorCXJldHVybiBjb3VudDsKK30KKworY2hhciogRkFTVF9GVU5DIHhtYWxsb2Nfc3Vic3RpdHV0ZV9zdHJpbmcoY29uc3QgY2hhciAqc3JjLCBpbnQgY291bnQsIGNvbnN0IGNoYXIgKnN1YiwgY29uc3QgY2hhciAqcmVwbCkKK3sKKwljaGFyICpidWYsICpkc3QsICplbmQ7CisJc2l6ZV90IHN1Yl9sZW4gPSBzdHJsZW4oc3ViKTsKKwlzaXplX3QgcmVwbF9sZW4gPSBzdHJsZW4ocmVwbCk7CisKKwkvL2RiZ19tc2coInN1YnN0KHM6JyVzJyxjb3VudDolZCxzdWI6JyVzJyxyZXBsOiclcyciLCBzcmMsIGNvdW50LCBzdWIsIHJlcGwpOworCisJYnVmID0gZHN0ID0geG1hbGxvYyhzdHJsZW4oc3JjKSArIGNvdW50ICogKChpbnQpcmVwbF9sZW4gLSAoaW50KXN1Yl9sZW4pICsgMSk7CisJLyogd2UgcmVwbGFjZSBlYWNoIHN1YiB3aXRoIHJlcGwgKi8KKwl3aGlsZSAoKGVuZCA9IHN0cnN0cihzcmMsIHN1YikpICE9IE5VTEwpIHsKKwkJZHN0ID0gbWVtcGNweShkc3QsIHNyYywgZW5kIC0gc3JjKTsKKwkJZHN0ID0gbWVtcGNweShkc3QsIHJlcGwsIHJlcGxfbGVuKTsKKwkJLypzcmMgPSBlbmQgKyAxOyAtIEdOVSBmaW5kdXRpbHMgNC41LjEwIGRvZXNuJ3QgZG8gdGhpcy4uLiAqLworCQlzcmMgPSBlbmQgKyBzdWJfbGVuOyAvKiBidXQgdGhpcy4gVHJ5ICJ4YXJncyAtSWFhIGVjaG8gYWFhIiAqLworCX0KKwlzdHJjcHkoZHN0LCBzcmMpOworCS8vZGJnX21zZygic3Vic3Q5OiclcyciLCBidWYpOworCXJldHVybiBidWY7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9ydGMuYyBiL2xpYmJiL3J0Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MTE3YmEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9ydGMuYwpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvbW1vbiBSVEMgZnVuY3Rpb25zCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJydGNfLmgiCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IV0NMT0NLX0FESlRJTUVfRkhTCisjIGRlZmluZSBBREpUSU1FX1BBVEggIi92YXIvbGliL2h3Y2xvY2svYWRqdGltZSIKKyNlbHNlCisjIGRlZmluZSBBREpUSU1FX1BBVEggIi9ldGMvYWRqdGltZSIKKyNlbmRpZgorCitpbnQgRkFTVF9GVU5DIHJ0Y19hZGp0aW1lX2lzX3V0Yyh2b2lkKQoreworCWludCB1dGMgPSAwOworCUZJTEUgKmYgPSBmb3Blbl9mb3JfcmVhZChBREpUSU1FX1BBVEgpOworCisJaWYgKGYpIHsKKwkJY2hhciBidWZmZXJbMTI4XTsKKworCQl3aGlsZSAoZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgZikpIHsKKwkJCWlmIChpc19wcmVmaXhlZF93aXRoKGJ1ZmZlciwgIlVUQyIpKSB7CisJCQkJdXRjID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlmY2xvc2UoZik7CisJfQorCisJcmV0dXJuIHV0YzsKK30KKworLyogcnRjIG9wZW5zIGFyZSBleGNsdXNpdmUuCisgKiBUcnkgdG8gcnVuIHR3byAiaHdjbG9jayAtdyIgYXQgdGhlIHNhbWUgdGltZSB0byBzZWUgaXQuCisgKiBVc2VycyB3b3VsZG4ndCBleHBlY3QgdGhhdCB0byBmYWlsIG1lcmVseSBiZWNhdXNlIC9kZXYvcnRjCisgKiB3YXMgbW9tZW50YXJpbHkgYnVzeSwgbGV0J3MgdHJ5IGEgYml0IGhhcmRlciBvbiBlcnJubyA9PSBFQlVTWS4KKyAqLworc3RhdGljIGludCBvcGVuX2xvb3Bfb25fYnVzeShjb25zdCBjaGFyICpuYW1lLCBpbnQgZmxhZ3MpCit7CisJaW50IHJ0YzsKKwkvKgorCSAqIFRlc3RlZCB3aXRoIHR3byBwYXJhbGxlbCAiaHdjbG9jayAtdyIgbG9vcHMuCisJICogV2l0aCB0cnkgPSAxMCwgbm8gZmFpbHVyZXMgd2l0aCAyeDEwMDAwMDAgbG9vcCBpdGVyYXRpb25zLgorCSAqLworCWludCB0cnkgPSAxMDAwIC8gMjA7CisgYWdhaW46CisJZXJybm8gPSAwOworCXJ0YyA9IG9wZW4obmFtZSwgZmxhZ3MpOworCWlmIChlcnJubyA9PSBFQlVTWSkgeworCQl1c2xlZXAoMjAgKiAxMDAwKTsKKwkJaWYgKC0tdHJ5ICE9IDApCisJCQlnb3RvIGFnYWluOworCQkvKiBFQlVTWS4gTGFzdCB0cnksIGV4aXQgb24gZXJyb3IgaW5zdGVhZCBvZiByZXR1cm5pbmcgLTEgKi8KKwkJcmV0dXJuIHhvcGVuKG5hbWUsIGZsYWdzKTsKKwl9CisJcmV0dXJuIHJ0YzsKK30KKworLyogTmV2ZXIgZmFpbHMgKi8KK2ludCBGQVNUX0ZVTkMgcnRjX3hvcGVuKGNvbnN0IGNoYXIgKipkZWZhdWx0X3J0YywgaW50IGZsYWdzKQoreworCWludCBydGM7CisJY29uc3QgY2hhciAqbmFtZSA9CisJCSIvZGV2L3J0YyIiXDAiCisJCSIvZGV2L3J0YzAiIlwwIgorCQkiL2Rldi9taXNjL3J0YyIiXDAiOworCisJaWYgKCEqZGVmYXVsdF9ydGMpCisJCWdvdG8gdHJ5X25hbWU7CisJbmFtZSA9ICIiOyAvKmVsc2U6IHdlIGhhdmUgcnRjIG5hbWUsIGRvbid0IHRyeSBvdGhlciBuYW1lcyAqLworCisJZm9yICg7OykgeworCQlydGMgPSBvcGVuX2xvb3Bfb25fYnVzeSgqZGVmYXVsdF9ydGMsIGZsYWdzKTsKKwkJaWYgKHJ0YyA+PSAwKQorCQkJcmV0dXJuIHJ0YzsKKwkJaWYgKCFuYW1lWzBdKQorCQkJcmV0dXJuIHhvcGVuKCpkZWZhdWx0X3J0YywgZmxhZ3MpOworIHRyeV9uYW1lOgorCQkqZGVmYXVsdF9ydGMgPSBuYW1lOworCQluYW1lICs9IHN0cmxlbihuYW1lKSArIDE7CisJfQorfQorCit2b2lkIEZBU1RfRlVOQyBydGNfcmVhZF90bShzdHJ1Y3QgdG0gKnB0bSwgaW50IGZkKQoreworCW1lbXNldChwdG0sIDAsIHNpemVvZigqcHRtKSk7CisJeGlvY3RsKGZkLCBSVENfUkRfVElNRSwgcHRtKTsKKwlwdG0tPnRtX2lzZHN0ID0gLTE7IC8qICJub3Qga25vd24iICovCit9CisKK3RpbWVfdCBGQVNUX0ZVTkMgcnRjX3RtMnRpbWUoc3RydWN0IHRtICpwdG0sIGludCB1dGMpCit7CisJY2hhciAqb2xkdHogPSBvbGR0ejsgLyogZm9yIGNvbXBpbGVyICovCisJdGltZV90IHQ7CisKKwlpZiAodXRjKSB7CisJCW9sZHR6ID0gZ2V0ZW52KCJUWiIpOworCQlwdXRlbnYoKGNoYXIqKSJUWj1VVEMwIik7CisJCXR6c2V0KCk7CisJfQorCisJdCA9IG1rdGltZShwdG0pOworCisJaWYgKHV0YykgeworCQl1bnNldGVudigiVFoiKTsKKwkJaWYgKG9sZHR6KQorCQkJcHV0ZW52KG9sZHR6IC0gMyk7CisJCXR6c2V0KCk7CisJfQorCisJcmV0dXJuIHQ7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9ydW5fc2hlbGwuYyBiL2xpYmJiL3J1bl9zaGVsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOTJjM2MKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9ydW5fc2hlbGwuYwpAQCAtMCwwICsxLDkyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgMTk4OSAtIDE5OTEsIEp1bGlhbm5lIEZyYW5jZXMgSGF1Z2ggPGpvY2tncnJsQGF1c3Rpbi5yci5jb20+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBKdWxpYW5uZSBGLiBIYXVnaCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBKVUxJRSBIQVVHSCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgSlVMSUUgSEFVR0ggT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZiBFTkFCTEVfU0VMSU5VWAorI2luY2x1ZGUgPHNlbGludXgvc2VsaW51eC5oPiAgLyogZm9yIHNldGV4ZWNjb24gICovCisjZW5kaWYKKworI2lmIEVOQUJMRV9TRUxJTlVYCitzdGF0aWMgc2VjdXJpdHlfY29udGV4dF90IGN1cnJlbnRfc2lkOworCit2b2lkIEZBU1RfRlVOQyByZW5ld19jdXJyZW50X3NlY3VyaXR5X2NvbnRleHQodm9pZCkKK3sKKwlmcmVlY29uKGN1cnJlbnRfc2lkKTsgIC8qIFJlbGVhc2Ugb2xkIGNvbnRleHQgICovCisJZ2V0Y29uKCZjdXJyZW50X3NpZCk7ICAvKiB1cGRhdGUgKi8KK30KK3ZvaWQgRkFTVF9GVU5DIHNldF9jdXJyZW50X3NlY3VyaXR5X2NvbnRleHQoc2VjdXJpdHlfY29udGV4dF90IHNpZCkKK3sKKwlmcmVlY29uKGN1cnJlbnRfc2lkKTsgIC8qIFJlbGVhc2Ugb2xkIGNvbnRleHQgICovCisJY3VycmVudF9zaWQgPSBzaWQ7Cit9CisKKyNlbmRpZgorCisvKiBSdW4gU0hFTEwsIG9yIERFRkFVTFRfU0hFTEwgaWYgU0hFTEwgaXMgIiIgb3IgTlVMTC4KKyAqIElmIENPTU1BTkQgaXMgbm9uemVybywgcGFzcyBpdCB0byB0aGUgc2hlbGwgd2l0aCB0aGUgLWMgb3B0aW9uLgorICogSWYgQURESVRJT05BTF9BUkdTIGlzIG5vbnplcm8sIHBhc3MgaXQgdG8gdGhlIHNoZWxsIGFzIG1vcmUKKyAqIGFyZ3VtZW50cy4gICovCit2b2lkIEZBU1RfRlVOQyBydW5fc2hlbGwoY29uc3QgY2hhciAqc2hlbGwsIGludCBsb2dpbnNoZWxsLCBjb25zdCBjaGFyICpjb21tYW5kLCBjb25zdCBjaGFyICoqYWRkaXRpb25hbF9hcmdzKQoreworCWNvbnN0IGNoYXIgKiphcmdzOworCWludCBhcmdubzsKKwlpbnQgYWRkaXRpb25hbF9hcmdzX2NudCA9IDA7CisKKwlmb3IgKGFyZ3MgPSBhZGRpdGlvbmFsX2FyZ3M7IGFyZ3MgJiYgKmFyZ3M7IGFyZ3MrKykKKwkJYWRkaXRpb25hbF9hcmdzX2NudCsrOworCisJYXJncyA9IHhtYWxsb2Moc2l6ZW9mKGNoYXIqKSAqICg0ICsgYWRkaXRpb25hbF9hcmdzX2NudCkpOworCisJaWYgKCFzaGVsbCB8fCAhc2hlbGxbMF0pCisJCXNoZWxsID0gREVGQVVMVF9TSEVMTDsKKworCWFyZ3NbMF0gPSBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9ub3N0cmlwKHNoZWxsKTsKKwlpZiAobG9naW5zaGVsbCkKKwkJYXJnc1swXSA9IHhhc3ByaW50ZigiLSVzIiwgYXJnc1swXSk7CisJYXJnbm8gPSAxOworCWlmIChjb21tYW5kKSB7CisJCWFyZ3NbYXJnbm8rK10gPSAiLWMiOworCQlhcmdzW2FyZ25vKytdID0gY29tbWFuZDsKKwl9CisJaWYgKGFkZGl0aW9uYWxfYXJncykgeworCQlmb3IgKDsgKmFkZGl0aW9uYWxfYXJnczsgKythZGRpdGlvbmFsX2FyZ3MpCisJCQlhcmdzW2FyZ25vKytdID0gKmFkZGl0aW9uYWxfYXJnczsKKwl9CisJYXJnc1thcmdub10gPSBOVUxMOworCisjaWYgRU5BQkxFX1NFTElOVVgKKwlpZiAoY3VycmVudF9zaWQpCisJCXNldGV4ZWNjb24oY3VycmVudF9zaWQpOworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZWNvbihjdXJyZW50X3NpZCk7CisjZW5kaWYKKwlleGVjdihzaGVsbCwgKGNoYXIgKiopIGFyZ3MpOworCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZXhlY3V0ZSAnJXMnIiwgc2hlbGwpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvc2FmZV9nZXRob3N0bmFtZS5jIGIvbGliYmIvc2FmZV9nZXRob3N0bmFtZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYzk5YWUKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9zYWZlX2dldGhvc3RuYW1lLmMKQEAgLTAsMCArMSw1MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU2FmZSBnZXRob3N0bmFtZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaXRvIFJhZ3VzYSA8ZmFybWF0aXRvQHRpc2NhbGkuaXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorICogU1VTdjIgZ3VhcmFudGVlcyB0aGF0ICJIb3N0IG5hbWVzIGFyZSBsaW1pdGVkIHRvIDI1NSBieXRlcyIKKyAqIFBPU0lYLjEtMjAwMSBndWFyYW50ZWVzIHRoYXQgIkhvc3QgbmFtZXMgKG5vdCBpbmNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nCisgKiBudWxsIGJ5dGUpIGFyZSBsaW1pdGVkIHRvIEhPU1RfTkFNRV9NQVggYnl0ZXMiICg2NCBieXRlcyBvbiBteSBib3gpLgorICoKKyAqIFJGQzExMjMgc2F5czoKKyAqCisgKiBUaGUgc3ludGF4IG9mIGEgbGVnYWwgSW50ZXJuZXQgaG9zdCBuYW1lIHdhcyBzcGVjaWZpZWQgaW4gUkZDLTk1MgorICogW0ROUzo0XS4gIE9uZSBhc3BlY3Qgb2YgaG9zdCBuYW1lIHN5bnRheCBpcyBoZXJlYnkgY2hhbmdlZDogdGhlCisgKiByZXN0cmljdGlvbiBvbiB0aGUgZmlyc3QgY2hhcmFjdGVyIGlzIHJlbGF4ZWQgdG8gYWxsb3cgZWl0aGVyIGEKKyAqIGxldHRlciBvciBhIGRpZ2l0LiAgSG9zdCBzb2Z0d2FyZSBNVVNUIHN1cHBvcnQgdGhpcyBtb3JlIGxpYmVyYWwKKyAqIHN5bnRheC4KKyAqCisgKiBIb3N0IHNvZnR3YXJlIE1VU1QgaGFuZGxlIGhvc3QgbmFtZXMgb2YgdXAgdG8gNjMgY2hhcmFjdGVycyBhbmQKKyAqIFNIT1VMRCBoYW5kbGUgaG9zdCBuYW1lcyBvZiB1cCB0byAyNTUgY2hhcmFjdGVycy4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorCisvKgorICogT24gc3VjY2VzcyByZXR1cm4gdGhlIGN1cnJlbnQgbWFsbG9jZWQgYW5kIE5VTCB0ZXJtaW5hdGVkIGhvc3RuYW1lLgorICogT24gZXJyb3IgcmV0dXJuIG1hbGxvY2VkIGFuZCBOVUwgdGVybWluYXRlZCBzdHJpbmcgIj8iLgorICogVGhpcyBpcyBhbiBpbGxlZ2FsIGZpcnN0IGNoYXJhY3RlciBmb3IgYSBob3N0bmFtZS4KKyAqIFRoZSByZXR1cm5lZCBtYWxsb2NlZCBzdHJpbmcgbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICovCitjaGFyKiBGQVNUX0ZVTkMgc2FmZV9nZXRob3N0bmFtZSh2b2lkKQoreworCXN0cnVjdCB1dHNuYW1lIHV0czsKKworCS8qIFRoZSBsZW5ndGggb2YgdGhlIGFycmF5cyBpbiBhIHN0cnVjdCB1dHNuYW1lIGlzIHVuc3BlY2lmaWVkOworCSAqIHRoZSBmaWVsZHMgYXJlIHRlcm1pbmF0ZWQgYnkgYSBudWxsIGJ5dGUuCisJICogTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHN0YW5kYXJkIHRoYXQgc2F5cyB0aGF0IHRoZSBob3N0bmFtZQorCSAqIHNldCBieSBzZXRob3N0bmFtZSgyKSBpcyB0aGUgc2FtZSBzdHJpbmcgYXMgdGhlIG5vZGVuYW1lIGZpZWxkIG9mIHRoZQorCSAqIHN0cnVjdCByZXR1cm5lZCBieSB1bmFtZSAoaW5kZWVkLCBzb21lIHN5c3RlbXMgYWxsb3cgYSAyNTYtYnl0ZSBob3N0LQorCSAqIG5hbWUgYW5kIGFuIDgtYnl0ZSBub2RlbmFtZSksIGJ1dCB0aGlzIGlzIHRydWUgb24gTGludXguIFRoZSBzYW1lIGhvbGRzCisJICogZm9yIHNldGRvbWFpbm5hbWUoMikgYW5kIHRoZSBkb21haW5uYW1lIGZpZWxkLgorCSAqLworCisJLyogVW5hbWUgY2FuIGZhaWwgb25seSBpZiB5b3UgcGFzcyBhIGJhZCBwb2ludGVyIHRvIGl0LiAqLworCXVuYW1lKCZ1dHMpOworCXJldHVybiB4c3RybmR1cCghdXRzLm5vZGVuYW1lWzBdID8gIj8iIDogdXRzLm5vZGVuYW1lLCBzaXplb2YodXRzLm5vZGVuYW1lKSk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9zYWZlX3BvbGwuYyBiL2xpYmJiL3NhZmVfcG9sbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0OTJhODEKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9zYWZlX3BvbGwuYwpAQCAtMCwwICsxLDM0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFdyYXBwZXIgd2hpY2ggcmVzdGFydHMgcG9sbCBvbiBFSU5UUiBvciBFTk9NRU0uCisgKiBPbiBvdGhlciBlcnJvcnMgZG9lcyBwZXJyb3IoInBvbGwiKSBhbmQgcmV0dXJucy4KKyAqIFdhcm5pbmchIE1heSB0YWtlIGxvbmdlciB0aGFuIHRpbWVvdXRfbXMgdG8gcmV0dXJuISAqLworaW50IEZBU1RfRlVOQyBzYWZlX3BvbGwoc3RydWN0IHBvbGxmZCAqdWZkcywgbmZkc190IG5mZHMsIGludCB0aW1lb3V0KQoreworCXdoaWxlICgxKSB7CisJCWludCBuID0gcG9sbCh1ZmRzLCBuZmRzLCB0aW1lb3V0KTsKKwkJaWYgKG4gPj0gMCkKKwkJCXJldHVybiBuOworCQkvKiBNYWtlIHN1cmUgd2UgaW5jaCB0b3dhcmRzIGNvbXBsZXRpb24gKi8KKwkJaWYgKHRpbWVvdXQgPiAwKQorCQkJdGltZW91dC0tOworCQkvKiBFLmcuIHN0cmFjZSBjYXVzZXMgcG9sbCB0byByZXR1cm4gdGhpcyAqLworCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQljb250aW51ZTsKKwkJLyogS2VybmVsIGlzIHZlcnkgbG93IG9uIG1lbW9yeS4gUmV0cnkuICovCisJCS8qIEkgZG91YnQgbWFueSBjYWxsZXJzIHdvdWxkIGhhbmRsZSB0aGlzIGNvcnJlY3RseSEgKi8KKwkJaWYgKGVycm5vID09IEVOT01FTSkKKwkJCWNvbnRpbnVlOworCQliYl9wZXJyb3JfbXNnKCJwb2xsIik7CisJCXJldHVybiBuOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYmJiL3NhZmVfc3RybmNweS5jIGIvbGliYmIvc2FmZV9zdHJuY3B5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWViMGRiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3NhZmVfc3RybmNweS5jCkBAIC0wLDAgKzEsMzIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIExpa2Ugc3RybmNweSBidXQgbWFrZSBzdXJlIHRoZSByZXN1bHRpbmcgc3RyaW5nIGlzIGFsd2F5cyAwIHRlcm1pbmF0ZWQuICovCitjaGFyKiBGQVNUX0ZVTkMgc2FmZV9zdHJuY3B5KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc2l6ZSkKK3sKKwlpZiAoIXNpemUpIHJldHVybiBkc3Q7CisJZHN0Wy0tc2l6ZV0gPSAnXDAnOworCXJldHVybiBzdHJuY3B5KGRzdCwgc3JjLCBzaXplKTsKK30KKworLyogTGlrZSBzdHJjcHkgYnV0IGNhbiBjb3B5IG92ZXJsYXBwaW5nIHN0cmluZ3MuICovCit2b2lkIEZBU1RfRlVOQyBvdmVybGFwcGluZ19zdHJjcHkoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMpCit7CisJLyogQ2hlYXAgb3B0aW1pemF0aW9uIGZvciBkc3QgPT0gc3JjIGNhc2UgLQorCSAqIGJldHRlciB0byBoYXZlIGl0IGhlcmUgdGhhbiBpbiBtYW55IGNhbGxlcnMuCisJICovCisJaWYgKGRzdCAhPSBzcmMpIHsKKwkJd2hpbGUgKCgqZHN0ID0gKnNyYykgIT0gJ1wwJykgeworCQkJZHN0Kys7CisJCQlzcmMrKzsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL2xpYmJiL3NhZmVfd3JpdGUuYyBiL2xpYmJiL3NhZmVfd3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjc2MjgwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvc2FmZV93cml0ZS5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK3NzaXplX3QgRkFTVF9GVU5DIHNhZmVfd3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzc2l6ZV90IG47CisKKwlkbyB7CisJCW4gPSB3cml0ZShmZCwgYnVmLCBjb3VudCk7CisJfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCisJcmV0dXJuIG47Cit9CmRpZmYgLS1naXQgYS9saWJiYi9zZWxpbnV4X2NvbW1vbi5jIGIvbGliYmIvc2VsaW51eF9jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjU4NTU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvc2VsaW51eF9jb21tb24uYwpAQCAtMCwwICsxLDU1IEBACisvKgorICogbGliYmIvc2VsaW51eF9jb21tb24uYworICogICAtLSBjb21tb24gU0VMaW51eCB1dGlsaXR5IGZ1bmN0aW9ucworICoKKyAqIENvcHlyaWdodCAyMDA3IEthaUdhaSBLb2hlaSA8a2FpZ2FpQGthaWdhaS5nci5qcD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzZWxpbnV4L2NvbnRleHQuaD4KKworY29udGV4dF90IEZBU1RfRlVOQyBzZXRfc2VjdXJpdHlfY29udGV4dF9jb21wb25lbnQoc2VjdXJpdHlfY29udGV4dF90IGN1cl9jb250ZXh0LAorCQkJY2hhciAqdXNlciwgY2hhciAqcm9sZSwgY2hhciAqdHlwZSwgY2hhciAqcmFuZ2UpCit7CisJY29udGV4dF90IGNvbiA9IGNvbnRleHRfbmV3KGN1cl9jb250ZXh0KTsKKwlpZiAoIWNvbikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodXNlciAmJiBjb250ZXh0X3VzZXJfc2V0KGNvbiwgdXNlcikpCisJCWdvdG8gZXJyb3I7CisJaWYgKHR5cGUgJiYgY29udGV4dF90eXBlX3NldChjb24sIHR5cGUpKQorCQlnb3RvIGVycm9yOworCWlmIChyYW5nZSAmJiBjb250ZXh0X3JhbmdlX3NldChjb24sIHJhbmdlKSkKKwkJZ290byBlcnJvcjsKKwlpZiAocm9sZSAmJiBjb250ZXh0X3JvbGVfc2V0KGNvbiwgcm9sZSkpCisJCWdvdG8gZXJyb3I7CisJcmV0dXJuIGNvbjsKKworZXJyb3I6CisJY29udGV4dF9mcmVlKGNvbik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHNldGZzY3JlYXRlY29uX29yX2RpZShzZWN1cml0eV9jb250ZXh0X3Qgc2NvbnRleHQpCit7CisJaWYgKHNldGZzY3JlYXRlY29uKHNjb250ZXh0KSA8IDApIHsKKwkJLyogQ2FuIGJlIE5VTEwuIEFsbCBrbm93biBwcmludGYgaW1wbGVtZW50YXRpb25zCisJCSAqIGRpc3BsYXkgIihudWxsKSIsICI8bnVsbD4iIGV0YyAqLworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHNldCBkZWZhdWx0ICIKKwkJCQkiZmlsZSBjcmVhdGlvbiBjb250ZXh0IHRvICVzIiwgc2NvbnRleHQpOworCX0KK30KKwordm9pZCBGQVNUX0ZVTkMgc2VsaW51eF9wcmVzZXJ2ZV9mY29udGV4dChpbnQgZmRlc2MpCit7CisJc2VjdXJpdHlfY29udGV4dF90IGNvbnRleHQ7CisKKwlpZiAoZmdldGZpbGVjb24oZmRlc2MsICZjb250ZXh0KSA8IDApIHsKKwkJaWYgKGVycm5vID09IEVOT0RBVEEgfHwgZXJybm8gPT0gRU5PVFNVUCkKKwkJCXJldHVybjsKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJmZ2V0ZmlsZWNvbiBmYWlsZWQiKTsKKwl9CisJc2V0ZnNjcmVhdGVjb25fb3JfZGllKGNvbnRleHQpOworCWZyZWVjb24oY29udGV4dCk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9zZXR1cF9lbnZpcm9ubWVudC5jIGIvbGliYmIvc2V0dXBfZW52aXJvbm1lbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjU4NjU2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvc2V0dXBfZW52aXJvbm1lbnQuYwpAQCAtMCwwICsxLDc0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgMTk4OSAtIDE5OTEsIEp1bGlhbm5lIEZyYW5jZXMgSGF1Z2ggPGpvY2tncnJsQGF1c3Rpbi5yci5jb20+CisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBKdWxpYW5uZSBGLiBIYXVnaCBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBKVUxJRSBIQVVHSCBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgSlVMSUUgSEFVR0ggT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKwordm9pZCBGQVNUX0ZVTkMgc2V0dXBfZW52aXJvbm1lbnQoY29uc3QgY2hhciAqc2hlbGwsIGludCBmbGFncywgY29uc3Qgc3RydWN0IHBhc3N3ZCAqcHcpCit7CisJaWYgKCFzaGVsbCB8fCAhc2hlbGxbMF0pCisJCXNoZWxsID0gREVGQVVMVF9TSEVMTDsKKworCS8qIENoYW5nZSB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSB0byBiZSB0aGUgaG9tZSBkaXJlY3RvcnkKKwkgKiBvZiB0aGUgdXNlciAqLworCWlmICghKGZsYWdzICYgU0VUVVBfRU5WX05PX0NIRElSKSkgeworCQlpZiAoY2hkaXIocHctPnB3X2RpcikgIT0gMCkgeworCQkJYmJfZXJyb3JfbXNnKCJjYW4ndCBjaGFuZ2UgZGlyZWN0b3J5IHRvICclcyciLCBwdy0+cHdfZGlyKTsKKwkJCXhjaGRpcigoZmxhZ3MgJiBTRVRVUF9FTlZfVE9fVE1QKSA/ICIvdG1wIiA6ICIvIik7CisJCX0KKwl9CisKKwlpZiAoZmxhZ3MgJiBTRVRVUF9FTlZfQ0xFQVJFTlYpIHsKKwkJY29uc3QgY2hhciAqdGVybTsKKworCQkvKiBMZWF2ZSBURVJNIHVuY2hhbmdlZC4gU2V0IEhPTUUsIFNIRUxMLCBVU0VSLCBMT0dOQU1FLCBQQVRILgorCQkgKiBVbnNldCBhbGwgb3RoZXIgZW52aXJvbm1lbnQgdmFyaWFibGVzLiAgKi8KKwkJdGVybSA9IGdldGVudigiVEVSTSIpOworCQljbGVhcmVudigpOworCQlpZiAodGVybSkKKwkJCXhzZXRlbnYoIlRFUk0iLCB0ZXJtKTsKKwkJeHNldGVudigiUEFUSCIsIChwdy0+cHdfdWlkID8gYmJfZGVmYXVsdF9wYXRoIDogYmJfZGVmYXVsdF9yb290X3BhdGgpKTsKKwkJZ290byBzaG9ydGN1dDsKKwkJLy8gTm8sIGdjYyAoNC4yLjEpIGlzIG5vdCBjbGV2ZXIgZW5vdWduIHRvIGRvIGl0IGl0c2VsZi4KKwkJLy94c2V0ZW52KCJVU0VSIiwgICAgcHctPnB3X25hbWUpOworCQkvL3hzZXRlbnYoIkxPR05BTUUiLCBwdy0+cHdfbmFtZSk7CisJCS8veHNldGVudigiSE9NRSIsICAgIHB3LT5wd19kaXIpOworCQkvL3hzZXRlbnYoIlNIRUxMIiwgICBzaGVsbCk7CisJfSBlbHNlIGlmIChmbGFncyAmIFNFVFVQX0VOVl9DSEFOR0VFTlYpIHsKKwkJLyogU2V0IEhPTUUsIFNIRUxMLCBhbmQgaWYgbm90IGJlY29taW5nIGEgc3VwZXItdXNlciwKKwkJICogVVNFUiBhbmQgTE9HTkFNRS4gICovCisJCWlmIChwdy0+cHdfdWlkKSB7Cisgc2hvcnRjdXQ6CisJCQl4c2V0ZW52KCJVU0VSIiwgICAgcHctPnB3X25hbWUpOworCQkJeHNldGVudigiTE9HTkFNRSIsIHB3LT5wd19uYW1lKTsKKwkJfQorCQl4c2V0ZW52KCJIT01FIiwgICAgcHctPnB3X2Rpcik7CisJCXhzZXRlbnYoIlNIRUxMIiwgICBzaGVsbCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGliYmIvc2lnbmFscy5jIGIvbGliYmIvc2lnbmFscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NTEyNDcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9zaWduYWxzLmMKQEAgLTAsMCArMSwxMjEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA2IFJvYiBMYW5kbGV5CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGVueXMgVmxhc2Vua28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBBbGwga25vd24gYXJjaGVzIHVzZSBzbWFsbCBpbnRzIGZvciBzaWduYWxzICovCitzbWFsbGludCBiYl9nb3Rfc2lnbmFsOworCit2b2lkIHJlY29yZF9zaWdubyhpbnQgc2lnbm8pCit7CisJYmJfZ290X3NpZ25hbCA9IHNpZ25vOworfQorCisvKiBTYXZlcyAyIGJ5dGVzIG9uIHg4NiEgT2ggbXkuLi4gKi8KK2ludCBGQVNUX0ZVTkMgc2lnYWN0aW9uX3NldChpbnQgc2lnbnVtLCBjb25zdCBzdHJ1Y3Qgc2lnYWN0aW9uICphY3QpCit7CisJcmV0dXJuIHNpZ2FjdGlvbihzaWdudW0sIGFjdCwgTlVMTCk7Cit9CisKK2ludCBGQVNUX0ZVTkMgc2lncHJvY21hc2tfYWxsc2lncyhpbnQgaG93KQoreworCXNpZ3NldF90IHNldDsKKwlzaWdmaWxsc2V0KCZzZXQpOworCXJldHVybiBzaWdwcm9jbWFzayhob3csICZzZXQsIE5VTEwpOworfQorCit2b2lkIEZBU1RfRlVOQyBiYl9zaWduYWxzKGludCBzaWdzLCB2b2lkICgqZikoaW50KSkKK3sKKwlpbnQgc2lnX25vID0gMDsKKwlpbnQgYml0ID0gMTsKKworCXdoaWxlIChzaWdzKSB7CisJCWlmIChzaWdzICYgYml0KSB7CisJCQlzaWdzIC09IGJpdDsKKwkJCXNpZ25hbChzaWdfbm8sIGYpOworCQl9CisJCXNpZ19ubysrOworCQliaXQgPDw9IDE7CisJfQorfQorCit2b2lkIEZBU1RfRlVOQyBiYl9zaWduYWxzX3JlY3Vyc2l2ZV9ub3Jlc3RhcnQoaW50IHNpZ3MsIHZvaWQgKCpmKShpbnQpKQoreworCWludCBzaWdfbm8gPSAwOworCWludCBiaXQgPSAxOworCXN0cnVjdCBzaWdhY3Rpb24gc2E7CisKKwltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKwlzYS5zYV9oYW5kbGVyID0gZjsKKwkvKnNhLnNhX2ZsYWdzID0gMDsqLworCS8qc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOyAtIGhvcGUgbWVtc2V0IGRpZCBpdCovCisKKwl3aGlsZSAoc2lncykgeworCQlpZiAoc2lncyAmIGJpdCkgeworCQkJc2lncyAtPSBiaXQ7CisJCQlzaWdhY3Rpb25fc2V0KHNpZ19ubywgJnNhKTsKKwkJfQorCQlzaWdfbm8rKzsKKwkJYml0IDw8PSAxOworCX0KK30KKwordm9pZCBGQVNUX0ZVTkMgc2lnX2Jsb2NrKGludCBzaWcpCit7CisJc2lnc2V0X3Qgc3M7CisJc2lnZW1wdHlzZXQoJnNzKTsKKwlzaWdhZGRzZXQoJnNzLCBzaWcpOworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNzLCBOVUxMKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgc2lnX3VuYmxvY2soaW50IHNpZykKK3sKKwlzaWdzZXRfdCBzczsKKwlzaWdlbXB0eXNldCgmc3MpOworCXNpZ2FkZHNldCgmc3MsIHNpZyk7CisJc2lncHJvY21hc2soU0lHX1VOQkxPQ0ssICZzcywgTlVMTCk7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHdhaXRfZm9yX2FueV9zaWcodm9pZCkKK3sKKwlzaWdzZXRfdCBzczsKKwlzaWdlbXB0eXNldCgmc3MpOworCXNpZ3N1c3BlbmQoJnNzKTsKK30KKworLyogQXNzdW1pbmcgdGhlIHNpZyBpcyBmYXRhbCAqLwordm9pZCBGQVNUX0ZVTkMga2lsbF9teXNlbGZfd2l0aF9zaWcoaW50IHNpZykKK3sKKwlzaWduYWwoc2lnLCBTSUdfREZMKTsKKwlzaWdfdW5ibG9jayhzaWcpOworCXJhaXNlKHNpZyk7CisJX2V4aXQoc2lnIHwgMTI4KTsgLyogU2hvdWxkIG5vdCByZWFjaCBpdCAqLworfQorCit2b2lkIEZBU1RfRlVOQyBzaWduYWxfU0FfUkVTVEFSVF9lbXB0eV9tYXNrKGludCBzaWcsIHZvaWQgKCpoYW5kbGVyKShpbnQpKQoreworCXN0cnVjdCBzaWdhY3Rpb24gc2E7CisJbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7CisJLypzaWdlbXB0eXNldCgmc2Euc2FfbWFzayk7Ki8KKwlzYS5zYV9mbGFncyA9IFNBX1JFU1RBUlQ7CisJc2Euc2FfaGFuZGxlciA9IGhhbmRsZXI7CisJc2lnYWN0aW9uX3NldChzaWcsICZzYSk7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHNpZ25hbF9ub19TQV9SRVNUQVJUX2VtcHR5X21hc2soaW50IHNpZywgdm9pZCAoKmhhbmRsZXIpKGludCkpCit7CisJc3RydWN0IHNpZ2FjdGlvbiBzYTsKKwltZW1zZXQoJnNhLCAwLCBzaXplb2Yoc2EpKTsKKwkvKnNpZ2VtcHR5c2V0KCZzYS5zYV9tYXNrKTsqLworCS8qc2Euc2FfZmxhZ3MgPSAwOyovCisJc2Euc2FfaGFuZGxlciA9IGhhbmRsZXI7CisJc2lnYWN0aW9uX3NldChzaWcsICZzYSk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9zaW1wbGlmeV9wYXRoLmMgYi9saWJiYi9zaW1wbGlmeV9wYXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkYzViZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3NpbXBsaWZ5X3BhdGguYwpAQCAtMCwwICsxLDU5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBiYl9zaW1wbGlmeV9wYXRoIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKK2NoYXIqIEZBU1RfRlVOQyBiYl9zaW1wbGlmeV9hYnNfcGF0aF9pbnBsYWNlKGNoYXIgKnN0YXJ0KQoreworCWNoYXIgKnMsICpwOworCisJcCA9IHMgPSBzdGFydDsKKwlkbyB7CisJCWlmICgqcCA9PSAnLycpIHsKKwkJCWlmICgqcyA9PSAnLycpIHsgIC8qIHNraXAgZHVwbGljYXRlIChvciBpbml0aWFsKSBzbGFzaCAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCpzID09ICcuJykgeworCQkJCWlmIChzWzFdID09ICcvJyB8fCAhc1sxXSkgeyAgLyogcmVtb3ZlIGV4dHJhICcuJyAqLworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKChzWzFdID09ICcuJykgJiYgKHNbMl0gPT0gJy8nIHx8ICFzWzJdKSkgeworCQkJCQkrK3M7CisJCQkJCWlmIChwID4gc3RhcnQpIHsKKwkJCQkJCXdoaWxlICgqLS1wICE9ICcvJykgIC8qIG9taXQgcHJldmlvdXMgZGlyICovCisJCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJfQorCQl9CisJCSorK3AgPSAqczsKKwl9IHdoaWxlICgqKytzKTsKKworCWlmICgocCA9PSBzdGFydCkgfHwgKCpwICE9ICcvJykpIHsgIC8qIG5vdCBhIHRyYWlsaW5nIHNsYXNoICovCisJCSsrcDsgIC8qIHNvIGtlZXAgbGFzdCBjaGFyYWN0ZXIgKi8KKwl9CisJKnAgPSAnXDAnOworCXJldHVybiBwOworfQorCitjaGFyKiBGQVNUX0ZVTkMgYmJfc2ltcGxpZnlfcGF0aChjb25zdCBjaGFyICpwYXRoKQoreworCWNoYXIgKnMsICpwOworCisJaWYgKHBhdGhbMF0gPT0gJy8nKQorCQlzID0geHN0cmR1cChwYXRoKTsKKwllbHNlIHsKKwkJcCA9IHhyZWFsbG9jX2dldGN3ZF9vcl93YXJuKE5VTEwpOworCQlzID0gY29uY2F0X3BhdGhfZmlsZShwLCBwYXRoKTsKKwkJZnJlZShwKTsKKwl9CisKKwliYl9zaW1wbGlmeV9hYnNfcGF0aF9pbnBsYWNlKHMpOworCXJldHVybiBzOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvc2luZ2xlX2FyZ3YuYyBiL2xpYmJiL3NpbmdsZV9hcmd2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ4NDRkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3NpbmdsZV9hcmd2LmMKQEAgLTAsMCArMSwxOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRGVueXMgVmxhc2Vua28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworY2hhciogRkFTVF9GVU5DIHNpbmdsZV9hcmd2KGNoYXIgKiphcmd2KQoreworCWlmIChhcmd2WzFdICYmIHN0cmNtcChhcmd2WzFdLCAiLS0iKSA9PSAwKQorCQlhcmd2Kys7CisJaWYgKCFhcmd2WzFdIHx8IGFyZ3ZbMl0pCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwlyZXR1cm4gYXJndlsxXTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3NraXBfd2hpdGVzcGFjZS5jIGIvbGliYmIvc2tpcF93aGl0ZXNwYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZjZmJiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3NraXBfd2hpdGVzcGFjZS5jCkBAIC0wLDAgKzEsMzkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHNraXBfd2hpdGVzcGFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2NoYXIqIEZBU1RfRlVOQyBza2lwX3doaXRlc3BhY2UoY29uc3QgY2hhciAqcykKK3sKKwkvKiBJbiBQT1NJWC9DIGxvY2FsZSAodGhlIG9ubHkgbG9jYWxlIHdlIGNhcmUgYWJvdXQ6IGRvIHdlIFJFQUxMWSB3YW50CisJICogdG8gYWxsb3cgVW5pY29kZSB3aGl0ZXNwYWNlIGluLCBzYXksIC5jb25mIGZpbGVzPyBudXRzISkKKwkgKiBpc3NwYWNlIGlzIG9ubHkgdGhlc2UgY2hhcnM6ICJcdFxuXHZcZlxyIiBhbmQgc3BhY2UuCisJICogIlx0XG5cdlxmXHIiIGhhcHBlbiB0byBoYXZlIEFTQ0lJIGNvZGVzIDksMTAsMTEsMTIsMTMuCisJICogVXNlIHRoYXQuCisJICovCisJd2hpbGUgKCpzID09ICcgJyB8fCAodW5zaWduZWQgY2hhcikoKnMgLSA5KSA8PSAoMTMgLSA5KSkKKwkJcysrOworCisJcmV0dXJuIChjaGFyICopIHM7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyBza2lwX25vbl93aGl0ZXNwYWNlKGNvbnN0IGNoYXIgKnMpCit7CisJd2hpbGUgKCpzICE9ICdcMCcgJiYgKnMgIT0gJyAnICYmICh1bnNpZ25lZCBjaGFyKSgqcyAtIDkpID4gKDEzIC0gOSkpCisJCXMrKzsKKworCXJldHVybiAoY2hhciAqKSBzOworfQorCitjaGFyKiBGQVNUX0ZVTkMgc2tpcF9kZXZfcGZ4KGNvbnN0IGNoYXIgKnR0eV9uYW1lKQoreworCWlmIChpc19wcmVmaXhlZF93aXRoKHR0eV9uYW1lLCAiL2Rldi8iKSkKKwkJdHR5X25hbWUgKz0gNTsKKwlyZXR1cm4gKGNoYXIqKXR0eV9uYW1lOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvc3BlZWRfdGFibGUuYyBiL2xpYmJiL3NwZWVkX3RhYmxlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc0ZDUzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3NwZWVkX3RhYmxlLmMKQEAgLTAsMCArMSwxMjQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGNvbXBhY3Qgc3BlZWRfdCA8LT4gc3BlZWQgZnVuY3Rpb25zIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RydWN0IHNwZWVkX21hcCB7CisjaWYgZGVmaW5lZCBfX0ZyZWVCU0RfXworCS8qIE9uIEZyZWVCU0QsIEI8bnVtPiBjb25zdGFudHMgZG9uJ3QgZml0IGludG8gYSBzaG9ydCAqLworCXVuc2lnbmVkIHNwZWVkOworI2Vsc2UKKwl1bnNpZ25lZCBzaG9ydCBzcGVlZDsKKyNlbmRpZgorCXVuc2lnbmVkIHNob3J0IHZhbHVlOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBzcGVlZF9tYXAgc3BlZWRzW10gPSB7CisJe0IwLCAwfSwKKwl7QjUwLCA1MH0sCisJe0I3NSwgNzV9LAorCXtCMTEwLCAxMTB9LAorCXtCMTM0LCAxMzR9LAorCXtCMTUwLCAxNTB9LAorCXtCMjAwLCAyMDB9LAorCXtCMzAwLCAzMDB9LAorCXtCNjAwLCA2MDB9LAorCXtCMTIwMCwgMTIwMH0sCisJe0IxODAwLCAxODAwfSwKKwl7QjI0MDAsIDI0MDB9LAorCXtCNDgwMCwgNDgwMH0sCisJe0I5NjAwLCA5NjAwfSwKKyNpZmRlZiBCMTkyMDAKKwl7QjE5MjAwLCAxOTIwMH0sCisjZWxpZiBkZWZpbmVkKEVYVEEpCisJe0VYVEEsIDE5MjAwfSwKKyNlbmRpZgorI2lmZGVmIEIzODQwMAorCXtCMzg0MDAsIDM4NDAwLzI1NiArIDB4ODAwMFV9LAorI2VsaWYgZGVmaW5lZChFWFRCKQorCXtFWFRCLCAzODQwMC8yNTYgKyAweDgwMDBVfSwKKyNlbmRpZgorI2lmZGVmIEI1NzYwMAorCXtCNTc2MDAsIDU3NjAwLzI1NiArIDB4ODAwMFV9LAorI2VuZGlmCisjaWZkZWYgQjExNTIwMAorCXtCMTE1MjAwLCAxMTUyMDAvMjU2ICsgMHg4MDAwVX0sCisjZW5kaWYKKyNpZmRlZiBCMjMwNDAwCisJe0IyMzA0MDAsIDIzMDQwMC8yNTYgKyAweDgwMDBVfSwKKyNlbmRpZgorI2lmZGVmIEI0NjA4MDAKKwl7QjQ2MDgwMCwgNDYwODAwLzI1NiArIDB4ODAwMFV9LAorI2VuZGlmCisjaWZkZWYgQjkyMTYwMAorCXtCOTIxNjAwLCA5MjE2MDAvMjU2ICsgMHg4MDAwVX0sCisjZW5kaWYKK307CisKK2VudW0geyBOVU1fU1BFRURTID0gQVJSQVlfU0laRShzcGVlZHMpIH07CisKK3Vuc2lnbmVkIEZBU1RfRlVOQyB0dHlfYmF1ZF90b192YWx1ZShzcGVlZF90IHNwZWVkKQoreworCWludCBpID0gMDsKKworCWRvIHsKKwkJaWYgKHNwZWVkID09IHNwZWVkc1tpXS5zcGVlZCkgeworCQkJaWYgKHNwZWVkc1tpXS52YWx1ZSAmIDB4ODAwMFUpIHsKKwkJCQlyZXR1cm4gKCh1bnNpZ25lZCBsb25nKSAoc3BlZWRzW2ldLnZhbHVlKSAmIDB4N2ZmZlUpICogMjU2OworCQkJfQorCQkJcmV0dXJuIHNwZWVkc1tpXS52YWx1ZTsKKwkJfQorCX0gd2hpbGUgKCsraSA8IE5VTV9TUEVFRFMpOworCisJcmV0dXJuIDA7Cit9CisKK3NwZWVkX3QgRkFTVF9GVU5DIHR0eV92YWx1ZV90b19iYXVkKHVuc2lnbmVkIGludCB2YWx1ZSkKK3sKKwlpbnQgaSA9IDA7CisKKwlkbyB7CisJCWlmICh2YWx1ZSA9PSB0dHlfYmF1ZF90b192YWx1ZShzcGVlZHNbaV0uc3BlZWQpKSB7CisJCQlyZXR1cm4gc3BlZWRzW2ldLnNwZWVkOworCQl9CisJfSB3aGlsZSAoKytpIDwgTlVNX1NQRUVEUyk7CisKKwlyZXR1cm4gKHNwZWVkX3QpIC0gMTsKK30KKworI2lmIDAKKy8qIHRlc3RpbmcgY29kZSAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBtYWluKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB2OworCXNwZWVkX3QgczsKKworCWZvciAodiA9IDAgOyB2IDwgMTAwMDAwMDsgdisrKSB7CisJCXMgPSB0dHlfdmFsdWVfdG9fYmF1ZCh2KTsKKwkJaWYgKHMgPT0gKHNwZWVkX3QpIC0xKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmludGYoInYgPSAlbHUgLS0gcyA9ICUwbG9cbiIsIHYsICh1bnNpZ25lZCBsb25nKSBzKTsKKwl9CisKKwlwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCisJZm9yIChzID0gMCA7IHMgPCAwMTAwMTcrMTsgcysrKSB7CisJCXYgPSB0dHlfYmF1ZF90b192YWx1ZShzKTsKKwkJaWYgKCF2KSB7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmludGYoInYgPSAlbHUgLS0gcyA9ICUwbG9cbiIsIHYsICh1bnNpZ25lZCBsb25nKSBzKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGliYmIvc3RyX3RvbG93ZXIuYyBiL2xpYmJiL3N0cl90b2xvd2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJkNTYzNwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3N0cl90b2xvd2VyLmMKQEAgLTAsMCArMSwxNCBAQAorLyogdmkgc2V0OiBzdz00IHRzPTQ6ICovCisvKiBDb252ZXJ0IHN0cmluZyBzdHIgdG8gbG93ZXJjYXNlLCByZXR1cm4gc3RyLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCitjaGFyKiBGQVNUX0ZVTkMgc3RyX3RvbG93ZXIoY2hhciAqc3RyKQoreworCWNoYXIgKmM7CisJZm9yIChjID0gc3RyOyAqYzsgKytjKQorCQkqYyA9IHRvbG93ZXIoKmMpOworCXJldHVybiBzdHI7Cit9CmRpZmYgLS1naXQgYS9saWJiYi9zdHJyc3RyLmMgYi9saWJiYi9zdHJyc3RyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkOTcwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3N0cnJzdHIuYwpAQCAtMCwwICsxLDY2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKgorICogVGhlIHN0cnJzdHIoKSBmdW5jdGlvbiBmaW5kcyB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZSBzdWJzdHJpbmcgbmVlZGxlCisgKiBpbiB0aGUgc3RyaW5nIGhheXN0YWNrLiBUaGUgdGVybWluYXRpbmcgbnVsIGNoYXJhY3RlcnMgYXJlIG5vdCBjb21wYXJlZC4KKyAqLworY2hhciogRkFTVF9GVU5DIHN0cnJzdHIoY29uc3QgY2hhciAqaGF5c3RhY2ssIGNvbnN0IGNoYXIgKm5lZWRsZSkKK3sKKwljaGFyICpyID0gTlVMTDsKKworCWlmICghbmVlZGxlWzBdKQorCQlyZXR1cm4gKGNoYXIqKWhheXN0YWNrICsgc3RybGVuKGhheXN0YWNrKTsKKwl3aGlsZSAoMSkgeworCQljaGFyICpwID0gc3Ryc3RyKGhheXN0YWNrLCBuZWVkbGUpOworCQlpZiAoIXApCisJCQlyZXR1cm4gcjsKKwkJciA9IHA7CisJCWhheXN0YWNrID0gcCArIDE7CisJfQorfQorCisjaWYgRU5BQkxFX1VOSVRfVEVTVAorCitCQlVOSVRfREVGSU5FX1RFU1Qoc3RycnN0cikKK3sKKwlzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwkJY29uc3QgY2hhciAqaCwgKm47CisJCWludCBwb3M7CisJfSB0ZXN0X2FycmF5W10gPSB7CisJCS8qIDAxMjM0NTY3ODkgKi8KKwkJeyAiYmFhYWJhYWFiIiwgICJhYWEiLCA1ICB9LAorCQl7ICJiYWFhYmFhYWFiIiwgImFhYSIsIDYgIH0sCisJCXsgImJhYWFiYWFiIiwgICAiYWFhIiwgMSAgfSwKKwkJeyAiYWFhIiwgICAgICAgICJhYWEiLCAwICB9LAorCQl7ICJhYWEiLCAgICAgICAgImEiLCAgIDIgIH0sCisJCXsgImFhYSIsICAgICAgICAiYmJiIiwgLTEgfSwKKwkJeyAiYSIsICAgICAgICAgICJhYWEiLCAtMSB9LAorCQl7ICJhYWEiLCAgICAgICAgIiIsICAgIDMgIH0sCisJCXsgIiIsICAgICAgICAgICAiYWFhIiwgLTEgfSwKKwkJeyAiIiwgICAgICAgICAgICIiLCAgICAwICB9LAorCX07CisKKwlpbnQgaTsKKworCWkgPSAwOworCXdoaWxlIChpIDwgc2l6ZW9mKHRlc3RfYXJyYXkpIC8gc2l6ZW9mKHRlc3RfYXJyYXlbMF0pKSB7CisJCWNvbnN0IGNoYXIgKnIgPSBzdHJyc3RyKHRlc3RfYXJyYXlbaV0uaCwgdGVzdF9hcnJheVtpXS5uKTsKKwkJaWYgKHIgPT0gTlVMTCkKKwkJCXIgPSB0ZXN0X2FycmF5W2ldLmggLSAxOworCQlCQlVOSVRfQVNTRVJUX0VRKHIsIHRlc3RfYXJyYXlbaV0uaCArIHRlc3RfYXJyYXlbaV0ucG9zKTsKKwkJaSsrOworCX0KKworCUJCVU5JVF9FTkRURVNUOworfQorCisjZW5kaWYgLyogRU5BQkxFX1VOSVRfVEVTVCAqLwpkaWZmIC0tZ2l0IGEvbGliYmIvc3lzY29uZi5jIGIvbGliYmIvc3lzY29uZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMWNhZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi9zeXNjb25mLmMKQEAgLTAsMCArMSwzMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVmFyaW91cyBzeXN0ZW0gY29uZmlndXJhdGlvbiBoZWxwZXJzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBCYXJ0b3N6IEdvbGFzemV3c2tpIDxiYXJ0ZWtnb2xhQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmICFkZWZpbmVkKGJiX2FyZ19tYXgpCit1bnNpZ25lZCBGQVNUX0ZVTkMgYmJfYXJnX21heCh2b2lkKQoreworCWxvbmcgciA9IHN5c2NvbmYoX1NDX0FSR19NQVgpOworCisJLyogSSd2ZSBzZWVuIGEgdmVyc2lvbiBvZiB1Y2xpYmMgd2hpY2ggcmV0dXJuZWQgLTEuCisJICogR3VhcmQgYWJvdXQgaXQsIGFuZCBhbHNvIGF2b2lkIGluc2FuZWx5IGxhcmdlIHZhbHVlcworCSAqLworCWlmICgodW5zaWduZWQgbG9uZylyID4gNjQqMTAyNCoxMDI0KQorCQlyID0gNjQqMTAyNCoxMDI0OworCisJcmV0dXJuIHI7Cit9CisjZW5kaWYKKworLyogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2xvY2sgdGlja3MgcGVyIHNlY29uZC4gKi8KK3Vuc2lnbmVkIEZBU1RfRlVOQyBiYl9jbGtfdGNrKHZvaWQpCit7CisJcmV0dXJuIHN5c2NvbmYoX1NDX0NMS19UQ0spOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvc3lzdGVtZF9zdXBwb3J0LmMgYi9saWJiYi9zeXN0ZW1kX3N1cHBvcnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDJhM2VmCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvc3lzdGVtZF9zdXBwb3J0LmMKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBEYXZpZGUgQ2F2YWxjYSA8ZGF2aWRlQGdlZXhib3gub3JnPgorICoKKyAqIEJhc2VkIG9uIGh0dHA6Ly9jZ2l0LmZyZWVkZXNrdG9wLm9yZy9zeXN0ZW1kL3RyZWUvc3JjL3NkLWRhZW1vbi5jCisgKiBDb3B5cmlnaHQgMjAxMCBMZW5uYXJ0IFBvZXR0ZXJpbmcKKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbgorICogb2J0YWluaW5nIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMKKyAqICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sCisgKiBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLAorICogcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwKKyAqIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sCisgKiBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5ECisgKiBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTCisgKiBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4KKyAqIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOCisgKiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFCisgKiBTT0ZUV0FSRS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1NZU1RFTUQKKy8vY29uZmlnOglib29sICJFbmFibGUgc3lzdGVtZCBzdXBwb3J0IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIElmIHlvdSBwbGFuIHRvIHVzZSBidXN5Ym94IGRhZW1vbnMgb24gYSBzeXN0ZW0gd2hlcmUgZGFlbW9ucworLy9jb25maWc6CSAgYXJlIGNvbnRyb2xsZWQgYnkgc3lzdGVtZCwgZW5hYmxlIHRoaXMgb3B0aW9uLgorLy9jb25maWc6CSAgSWYgeW91IGRvbid0IHVzZSBzeXN0ZW1kLCBpdCBpcyBzdGlsbCBzYWZlIHRvIGVuYWJsZSBpdCwKKy8vY29uZmlnOgkgIGJ1dCB0aGUgZG93bnNpZGUgaXMgaW5jcmVhc2VkIGNvZGUgc2l6ZS4KKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0ZFQVRVUkVfU1lTVEVNRCkgKz0gc3lzdGVtZF9zdXBwb3J0Lm8KKworaW50IHNkX2xpc3Rlbl9mZHModm9pZCkKK3sKKwljb25zdCBjaGFyICplOworCWludCBuOworCWludCBmZDsKKworCWUgPSBnZXRlbnYoIkxJU1RFTl9QSUQiKTsKKwlpZiAoIWUpCisJCXJldHVybiAwOworCW4gPSB4YXRvaV9wb3NpdGl2ZShlKTsKKwkvKiBJcyB0aGlzIGZvciB1cz8gKi8KKwlpZiAoZ2V0cGlkKCkgIT0gKHBpZF90KSBuKQorCQlyZXR1cm4gMDsKKworCWUgPSBnZXRlbnYoIkxJU1RFTl9GRFMiKTsKKwlpZiAoIWUpCisJCXJldHVybiAwOworCW4gPSB4YXRvaV9wb3NpdGl2ZShlKTsKKwlmb3IgKGZkID0gU0RfTElTVEVOX0ZEU19TVEFSVDsgZmQgPCBTRF9MSVNURU5fRkRTX1NUQVJUICsgbjsgZmQrKykKKwkJY2xvc2Vfb25fZXhlY19vbihmZCk7CisKKwlyZXR1cm4gbjsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3RpbWUuYyBiL2xpYmJiL3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTE5YTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvdGltZS5jCkBAIC0wLDAgKzEsMjk4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCit2b2lkIEZBU1RfRlVOQyBwYXJzZV9kYXRlc3RyKGNvbnN0IGNoYXIgKmRhdGVfc3RyLCBzdHJ1Y3QgdG0gKnB0bSkKK3sKKwljaGFyIGVuZCA9ICdcMCc7CisJY29uc3QgY2hhciAqbGFzdF9jb2xvbiA9IHN0cnJjaHIoZGF0ZV9zdHIsICc6Jyk7CisKKwlpZiAobGFzdF9jb2xvbiAhPSBOVUxMKSB7CisJCS8qIFBhcnNlIGlucHV0IGFuZCBhc3NpZ24gYXBwcm9wcmlhdGVseSB0byBwdG0gKi8KKyNpZiBFTkFCTEVfREVTS1RPUAorCQljb25zdCBjaGFyICplbmRwOworI2VuZGlmCisKKwkJLyogSEg6TU0gKi8KKwkJaWYgKHNzY2FuZihkYXRlX3N0ciwgIiV1OiV1JWMiLAorCQkJCQkmcHRtLT50bV9ob3VyLAorCQkJCQkmcHRtLT50bV9taW4sCisJCQkJCSZlbmQpID49IDIKKwkJKSB7CisJCQkvKiBubyBhZGp1c3RtZW50cyBuZWVkZWQgKi8KKwkJfSBlbHNlCisJCS8qIG1tLmRkLUhIOk1NICovCisJCWlmIChzc2NhbmYoZGF0ZV9zdHIsICIldS4ldS0ldToldSVjIiwKKwkJCQkJJnB0bS0+dG1fbW9uLCAmcHRtLT50bV9tZGF5LAorCQkJCQkmcHRtLT50bV9ob3VyLCAmcHRtLT50bV9taW4sCisJCQkJCSZlbmQpID49IDQKKwkJKSB7CisJCQkvKiBBZGp1c3QgbW9udGggZnJvbSAxLTEyIHRvIDAtMTEgKi8KKwkJCXB0bS0+dG1fbW9uIC09IDE7CisJCX0gZWxzZQorCQkvKiB5eXl5Lm1tLmRkLUhIOk1NICovCisJCWlmIChzc2NhbmYoZGF0ZV9zdHIsICIldS4ldS4ldS0ldToldSVjIiwgJnB0bS0+dG1feWVhciwKKwkJCQkJJnB0bS0+dG1fbW9uLCAmcHRtLT50bV9tZGF5LAorCQkJCQkmcHRtLT50bV9ob3VyLCAmcHRtLT50bV9taW4sCisJCQkJCSZlbmQpID49IDUKKwkJLyogeXl5eS1tbS1kZCBISDpNTSAqLworCQkgfHwgc3NjYW5mKGRhdGVfc3RyLCAiJXUtJXUtJXUgJXU6JXUlYyIsICZwdG0tPnRtX3llYXIsCisJCQkJCSZwdG0tPnRtX21vbiwgJnB0bS0+dG1fbWRheSwKKwkJCQkJJnB0bS0+dG1faG91ciwgJnB0bS0+dG1fbWluLAorCQkJCQkmZW5kKSA+PSA1CisJCSkgeworCQkJcHRtLT50bV95ZWFyIC09IDE5MDA7IC8qIEFkanVzdCB5ZWFycyAqLworCQkJcHRtLT50bV9tb24gLT0gMTsgLyogQWRqdXN0IG1vbnRoIGZyb20gMS0xMiB0byAwLTExICovCisJCX0gZWxzZQorI2lmIEVOQUJMRV9ERVNLVE9QICAvKiBzdHJwdGltZSBpcyBCSUc6IH4xayBpbiB1Y2xpYmMsIH4xMGsgaW4gZ2xpYmMgKi8KKwkJLyogbW9udGhfbmFtZSBkIEhIOk1NOlNTIFlZWVkuIFN1cHBvcnRlZCBieSBHTlUgZGF0ZSAqLworCQlpZiAoKGVuZHAgPSBzdHJwdGltZShkYXRlX3N0ciwgIiViICVkICVUICVZIiwgcHRtKSkgIT0gTlVMTAorCQkgJiYgKmVuZHAgPT0gJ1wwJworCQkpIHsKKwkJCXJldHVybjsgLyogZG9uJ3QgZmFsbCB0aHJvdWdoIHRvIGVuZCA9PSAiOiIgY2hlY2sgKi8KKwkJfSBlbHNlCisjZW5kaWYKKwkJeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2ludmFsaWRfZGF0ZSwgZGF0ZV9zdHIpOworCQl9CisJCWlmIChlbmQgPT0gJzonKSB7CisJCQkvKiB4eHg6U1MgKi8KKwkJCWlmIChzc2NhbmYobGFzdF9jb2xvbiArIDEsICIldSVjIiwgJnB0bS0+dG1fc2VjLCAmZW5kKSA9PSAxKQorCQkJCWVuZCA9ICdcMCc7CisJCQkvKiBlbHNlIGVuZCAhPSBOVUwgYW5kIHdlIGVycm9yIG91dCAqLworCQl9CisJfSBlbHNlCisJaWYgKHN0cmNocihkYXRlX3N0ciwgJy0nKQorCSAgICAvKiBXaHkgc3RyY2hyKCctJykgY2hlY2s/CisJICAgICAqIHNzY2FuZiBiZWxvdyB3aWxsIHRyYXNoIHB0bS0+dG1feWVhciwgdGhpcyBicmVha3MKKwkgICAgICogaWYgcGFyc2Vfc3RyIGlzICIxMDEwMTAxMCIgKGlvdywgIk1NZGRoaG1tIiBmb3JtKQorCSAgICAgKiBiZWNhdXNlIHdlIGRlc3Ryb3kgeWVhci4gRG8gdGhlc2Ugc3NjYW5mCisJICAgICAqIG9ubHkgaWYgd2Ugc2F3IGEgZGFzaCBpbiBwYXJzZV9zdHIuCisJICAgICAqLworCQkvKiB5eXl5LW1tLWRkIEhIICovCisJICYmIChzc2NhbmYoZGF0ZV9zdHIsICIldS0ldS0ldSAldSVjIiwgJnB0bS0+dG1feWVhciwKKwkJCQkmcHRtLT50bV9tb24sICZwdG0tPnRtX21kYXksCisJCQkJJnB0bS0+dG1faG91ciwKKwkJCQkmZW5kKSA+PSA0CisJCS8qIHl5eXktbW0tZGQgKi8KKwkgICAgIHx8IHNzY2FuZihkYXRlX3N0ciwgIiV1LSV1LSV1JWMiLCAmcHRtLT50bV95ZWFyLAorCQkJCSZwdG0tPnRtX21vbiwgJnB0bS0+dG1fbWRheSwKKwkJCQkmZW5kKSA+PSAzCisJICAgICkKKwkpIHsKKwkJcHRtLT50bV95ZWFyIC09IDE5MDA7IC8qIEFkanVzdCB5ZWFycyAqLworCQlwdG0tPnRtX21vbiAtPSAxOyAvKiBBZGp1c3QgbW9udGggZnJvbSAxLTEyIHRvIDAtMTEgKi8KKwl9IGVsc2UKKwlpZiAoZGF0ZV9zdHJbMF0gPT0gJ0AnKSB7CisJCXRpbWVfdCB0ID0gYmJfc3RydG9sKGRhdGVfc3RyICsgMSwgTlVMTCwgMTApOworCQlpZiAoIWVycm5vKSB7CisJCQlzdHJ1Y3QgdG0gKmx0ID0gbG9jYWx0aW1lKCZ0KTsKKwkJCWlmIChsdCkgeworCQkJCSpwdG0gPSAqbHQ7CisJCQkJcmV0dXJuOworCQkJfQorCQl9CisJCWVuZCA9ICcxJzsKKwl9IGVsc2UgeworCQkvKiBHb29nbGVkIHRoZSBmb2xsb3dpbmcgb24gYW4gb2xkIGRhdGUgbWFucGFnZToKKwkJICoKKwkJICogVGhlIGNhbm9uaWNhbCByZXByZXNlbnRhdGlvbiBmb3Igc2V0dGluZyB0aGUgZGF0ZS90aW1lIGlzOgorCQkgKiBjYyAgIENlbnR1cnkgKGVpdGhlciAxOSBvciAyMCkKKwkJICogeXkgICBZZWFyIGluIGFiYnJldmlhdGVkIGZvcm0gKGUuZy4gODksIDA2KQorCQkgKiBtbSAgIE51bWVyaWMgbW9udGgsIGEgbnVtYmVyIGZyb20gMSB0byAxMgorCQkgKiBkZCAgIERheSwgYSBudW1iZXIgZnJvbSAxIHRvIDMxCisJCSAqIEhIICAgSG91ciwgYSBudW1iZXIgZnJvbSAwIHRvIDIzCisJCSAqIE1NICAgTWludXRlcywgYSBudW1iZXIgZnJvbSAwIHRvIDU5CisJCSAqIC5TUyAgU2Vjb25kcywgYSBudW1iZXIgZnJvbSAwIHRvIDYxICh3aXRoIGxlYXAgc2Vjb25kcykKKwkJICogRXZlcnl0aGluZyBidXQgdGhlIG1pbnV0ZXMgaXMgb3B0aW9uYWwKKwkJICoKKwkJICogInRvdWNoIC10IERBVEVUSU1FIiBmb3JtYXQ6IFtbW1tbWVldWVldTU1dRERdaGhdbW1bLnNzXQorCQkgKiBTb21lLCBidXQgbm90IGFsbCwgVW5peCAiZGF0ZSBEQVRFVElNRSIgY29tbWFuZHMKKwkJICogbW92ZSBbW1lZXVlZXSBwYXN0IG1pbnV0ZXMgbW0gZmllbGQgKCEpLgorCQkgKiBDb3JldXRpbHMgZGF0ZSBkb2VzIGl0LCBhbmQgU1VTIG1hbmRhdGVzIGl0LgorCQkgKiAoZGF0ZSAtcyBEQVRFVElNRSBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgZm9ybWF0LiBsb3ZlbHkhKQorCQkgKiBJbiBiYm94LCB0aGlzIGZvcm1hdCBpcyBzcGVjaWFsLWNhc2VkIGluIGRhdGUgYXBwbGV0CisJCSAqIChJT1c6IHRoaXMgZnVuY3Rpb24gYXNzdW1lcyAidG91Y2ggLXQiIGZvcm1hdCkuCisJCSAqLworCQl1bnNpZ25lZCBjdXJfeWVhciA9IHB0bS0+dG1feWVhcjsKKwkJaW50IGxlbiA9IHN0cmNocm51bChkYXRlX3N0ciwgJy4nKSAtIGRhdGVfc3RyOworCisJCS8qIE1NWy5TU10gKi8KKwkJaWYgKGxlbiA9PSAyICYmIHNzY2FuZihkYXRlX3N0ciwgIiUydSUydSUydSUydSIiJTJ1JWMiICsgMTIsCisJCQkJCSZwdG0tPnRtX21pbiwKKwkJCQkJJmVuZCkgPj0gMSkgeworCQl9IGVsc2UKKwkJLyogSEhNTVsuU1NdICovCisJCWlmIChsZW4gPT0gNCAmJiBzc2NhbmYoZGF0ZV9zdHIsICIlMnUlMnUlMnUiIiUydSUydSVjIiArIDksCisJCQkJCSZwdG0tPnRtX2hvdXIsCisJCQkJCSZwdG0tPnRtX21pbiwKKwkJCQkJJmVuZCkgPj0gMikgeworCQl9IGVsc2UKKwkJLyogZGRISE1NWy5TU10gKi8KKwkJaWYgKGxlbiA9PSA2ICYmIHNzY2FuZihkYXRlX3N0ciwgIiUydSUydSIiJTJ1JTJ1JTJ1JWMiICsgNiwKKwkJCQkJJnB0bS0+dG1fbWRheSwKKwkJCQkJJnB0bS0+dG1faG91ciwKKwkJCQkJJnB0bS0+dG1fbWluLAorCQkJCQkmZW5kKSA+PSAzKSB7CisJCX0gZWxzZQorCQkvKiBtbWRkSEhNTVsuU1NdICovCisJCWlmIChsZW4gPT0gOCAmJiBzc2NhbmYoZGF0ZV9zdHIsICIlMnUiIiUydSUydSUydSUydSVjIiArIDMsCisJCQkJCSZwdG0tPnRtX21vbiwKKwkJCQkJJnB0bS0+dG1fbWRheSwKKwkJCQkJJnB0bS0+dG1faG91ciwKKwkJCQkJJnB0bS0+dG1fbWluLAorCQkJCQkmZW5kKSA+PSA0KSB7CisJCQkvKiBBZGp1c3QgbW9udGggZnJvbSAxLTEyIHRvIDAtMTEgKi8KKwkJCXB0bS0+dG1fbW9uIC09IDE7CisJCX0gZWxzZQorCQkvKiB5eW1tZGRISE1NWy5TU10gKi8KKwkJaWYgKGxlbiA9PSAxMCAmJiBzc2NhbmYoZGF0ZV9zdHIsICIlMnUlMnUlMnUlMnUlMnUlYyIsCisJCQkJCSZwdG0tPnRtX3llYXIsCisJCQkJCSZwdG0tPnRtX21vbiwKKwkJCQkJJnB0bS0+dG1fbWRheSwKKwkJCQkJJnB0bS0+dG1faG91ciwKKwkJCQkJJnB0bS0+dG1fbWluLAorCQkJCQkmZW5kKSA+PSA1KSB7CisJCQkvKiBBZGp1c3QgbW9udGggZnJvbSAxLTEyIHRvIDAtMTEgKi8KKwkJCXB0bS0+dG1fbW9uIC09IDE7CisJCQlpZiAoKGludCljdXJfeWVhciA+PSA1MCkgeyAvKiA+PSAxOTUwICovCisJCQkJLyogQWRqdXN0IHllYXI6ICovCisJCQkJLyogMS4gUHV0IGl0IGluIHRoZSBjdXJyZW50IGNlbnR1cnkgKi8KKwkJCQlwdG0tPnRtX3llYXIgKz0gKGN1cl95ZWFyIC8gMTAwKSAqIDEwMDsKKwkJCQkvKiAyLiBJZiB0b28gZmFyIGluIHRoZSBwYXN0LCArMTAwIHllYXJzICovCisJCQkJaWYgKHB0bS0+dG1feWVhciA8IGN1cl95ZWFyIC0gNTApCisJCQkJCXB0bS0+dG1feWVhciArPSAxMDA7CisJCQkJLyogMy4gSWYgdG9vIGZhciBpbiB0aGUgZnV0dXJlLCAtMTAwIHllYXJzICovCisJCQkJaWYgKHB0bS0+dG1feWVhciA+IGN1cl95ZWFyICsgNTApCisJCQkJCXB0bS0+dG1feWVhciAtPSAxMDA7CisJCQl9CisJCX0gZWxzZQorCQkvKiBjY3l5bW1kZEhITU1bLlNTXSAqLworCQlpZiAobGVuID09IDEyICYmIHNzY2FuZihkYXRlX3N0ciwgIiU0dSUydSUydSUydSUydSVjIiwKKwkJCQkJJnB0bS0+dG1feWVhciwKKwkJCQkJJnB0bS0+dG1fbW9uLAorCQkJCQkmcHRtLT50bV9tZGF5LAorCQkJCQkmcHRtLT50bV9ob3VyLAorCQkJCQkmcHRtLT50bV9taW4sCisJCQkJCSZlbmQpID49IDUpIHsKKwkJCXB0bS0+dG1feWVhciAtPSAxOTAwOyAvKiBBZGp1c3QgeWVhcnMgKi8KKwkJCXB0bS0+dG1fbW9uIC09IDE7IC8qIEFkanVzdCBtb250aCBmcm9tIDEtMTIgdG8gMC0xMSAqLworCQl9IGVsc2UgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2ludmFsaWRfZGF0ZSwgZGF0ZV9zdHIpOworCQl9CisJCWlmIChlbmQgPT0gJy4nKSB7CisJCQkvKiB4eHguU1MgKi8KKwkJCWlmIChzc2NhbmYoc3RyY2hyKGRhdGVfc3RyLCAnLicpICsgMSwgIiV1JWMiLAorCQkJCQkmcHRtLT50bV9zZWMsICZlbmQpID09IDEpCisJCQkJZW5kID0gJ1wwJzsKKwkJCS8qIGVsc2UgZW5kICE9IE5VTCBhbmQgd2UgZXJyb3Igb3V0ICovCisJCX0KKwl9CisJaWYgKGVuZCAhPSAnXDAnKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19pbnZhbGlkX2RhdGUsIGRhdGVfc3RyKTsKKwl9Cit9CisKK3RpbWVfdCBGQVNUX0ZVTkMgdmFsaWRhdGVfdG1fdGltZShjb25zdCBjaGFyICpkYXRlX3N0ciwgc3RydWN0IHRtICpwdG0pCit7CisJdGltZV90IHQgPSBta3RpbWUocHRtKTsKKwlpZiAodCA9PSAodGltZV90KSAtMUwpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2ludmFsaWRfZGF0ZSwgZGF0ZV9zdHIpOworCX0KKwlyZXR1cm4gdDsKK30KKworc3RhdGljIGNoYXIqIHN0cmZ0aW1lX2ZtdChjaGFyICpidWYsIHVuc2lnbmVkIGxlbiwgdGltZV90ICp0cCwgY29uc3QgY2hhciAqZm10KQoreworCXRpbWVfdCB0OworCWlmICghdHApIHsKKwkJdHAgPSAmdDsKKwkJdGltZSh0cCk7CisJfQorCS8qIFJldHVybnMgcG9pbnRlciB0byBOVUwgKi8KKwlyZXR1cm4gYnVmICsgc3RyZnRpbWUoYnVmLCBsZW4sIGZtdCwgbG9jYWx0aW1lKHRwKSk7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyBzdHJmdGltZV9ISE1NU1MoY2hhciAqYnVmLCB1bnNpZ25lZCBsZW4sIHRpbWVfdCAqdHApCit7CisJcmV0dXJuIHN0cmZ0aW1lX2ZtdChidWYsIGxlbiwgdHAsICIlSDolTTolUyIpOworfQorCitjaGFyKiBGQVNUX0ZVTkMgc3RyZnRpbWVfWVlZWU1NRERISE1NU1MoY2hhciAqYnVmLCB1bnNpZ25lZCBsZW4sIHRpbWVfdCAqdHApCit7CisJcmV0dXJuIHN0cmZ0aW1lX2ZtdChidWYsIGxlbiwgdHAsICIlWS0lbS0lZCAlSDolTTolUyIpOworfQorCisjaWYgRU5BQkxFX01PTk9UT05JQ19TWVNDQUxMCisKKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorLyogT2xkIGdsaWJjICg8IDIuMy40KSBkb2VzIG5vdCBwcm92aWRlIHRoaXMgY29uc3RhbnQuIFdlIHVzZSBzeXNjYWxsCisgKiBkaXJlY3RseSBzbyB0aGlzIGRlZmluaXRpb24gaXMgc2FmZS4gKi8KKyNpZm5kZWYgQ0xPQ0tfTU9OT1RPTklDCisjZGVmaW5lIENMT0NLX01PTk9UT05JQyAxCisjZW5kaWYKKworLyogbGliYyBoYXMgaW5jcmVkaWJseSBtZXNzeSB3YXkgb2YgZG9pbmcgdGhpcywKKyAqIHR5cGljYWxseSByZXF1aXJpbmcgLWxydC4gV2UganVzdCBza2lwIGFsbCB0aGlzIG1lc3MgKi8KK3N0YXRpYyB2b2lkIGdldF9tb25vKHN0cnVjdCB0aW1lc3BlYyAqdHMpCit7CisJaWYgKHN5c2NhbGwoX19OUl9jbG9ja19nZXR0aW1lLCBDTE9DS19NT05PVE9OSUMsIHRzKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNsb2NrX2dldHRpbWUoTU9OT1RPTklDKSBmYWlsZWQiKTsKK30KK3Vuc2lnbmVkIGxvbmcgbG9uZyBGQVNUX0ZVTkMgbW9ub3RvbmljX25zKHZvaWQpCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCWdldF9tb25vKCZ0cyk7CisJcmV0dXJuIHRzLnR2X3NlYyAqIDEwMDAwMDAwMDBVTEwgKyB0cy50dl9uc2VjOworfQordW5zaWduZWQgbG9uZyBsb25nIEZBU1RfRlVOQyBtb25vdG9uaWNfdXModm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJZ2V0X21vbm8oJnRzKTsKKwlyZXR1cm4gdHMudHZfc2VjICogMTAwMDAwMFVMTCArIHRzLnR2X25zZWMvMTAwMDsKK30KK3Vuc2lnbmVkIGxvbmcgbG9uZyBGQVNUX0ZVTkMgbW9ub3RvbmljX21zKHZvaWQpCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCWdldF9tb25vKCZ0cyk7CisJcmV0dXJuIHRzLnR2X3NlYyAqIDEwMDBVTEwgKyB0cy50dl9uc2VjLzEwMDAwMDA7Cit9Cit1bnNpZ25lZCBGQVNUX0ZVTkMgbW9ub3RvbmljX3NlYyh2b2lkKQoreworCXN0cnVjdCB0aW1lc3BlYyB0czsKKwlnZXRfbW9ubygmdHMpOworCXJldHVybiB0cy50dl9zZWM7Cit9CisKKyNlbHNlCisKK3Vuc2lnbmVkIGxvbmcgbG9uZyBGQVNUX0ZVTkMgbW9ub3RvbmljX25zKHZvaWQpCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJcmV0dXJuIHR2LnR2X3NlYyAqIDEwMDAwMDAwMDBVTEwgKyB0di50dl91c2VjICogMTAwMDsKK30KK3Vuc2lnbmVkIGxvbmcgbG9uZyBGQVNUX0ZVTkMgbW9ub3RvbmljX3VzKHZvaWQpCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJcmV0dXJuIHR2LnR2X3NlYyAqIDEwMDAwMDBVTEwgKyB0di50dl91c2VjOworfQordW5zaWduZWQgbG9uZyBsb25nIEZBU1RfRlVOQyBtb25vdG9uaWNfbXModm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwlyZXR1cm4gdHYudHZfc2VjICogMTAwMFVMTCArIHR2LnR2X3VzZWMgLyAxMDAwOworfQordW5zaWduZWQgRkFTVF9GVU5DIG1vbm90b25pY19zZWModm9pZCkKK3sKKwlyZXR1cm4gdGltZShOVUxMKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saWJiYi90cmltLmMgYi9saWJiYi90cmltLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjYjRmYgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3RyaW0uYwpAQCAtMCwwICsxLDMwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgbWFueSBkaWZmZXJlbnQgcGVvcGxlLgorICogSWYgeW91IHdyb3RlIHRoaXMsIHBsZWFzZSBhY2tub3dsZWRnZSB5b3VyIHdvcmsuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKwordm9pZCBGQVNUX0ZVTkMgdHJpbShjaGFyICpzKQoreworCXNpemVfdCBsZW4gPSBzdHJsZW4ocyk7CisKKwkvKiB0cmltIHRyYWlsaW5nIHdoaXRlc3BhY2UgKi8KKwl3aGlsZSAobGVuICYmIGlzc3BhY2Uoc1tsZW4tMV0pKQorCQktLWxlbjsKKworCS8qIHRyaW0gbGVhZGluZyB3aGl0ZXNwYWNlICovCisJaWYgKGxlbikgeworCQljaGFyICpud3MgPSBza2lwX3doaXRlc3BhY2Uocyk7CisJCWlmICgobndzIC0gcykgIT0gMCkgeworCQkJbGVuIC09IChud3MgLSBzKTsKKwkJCW1lbW1vdmUocywgbndzLCBsZW4pOworCQl9CisJfQorCXNbbGVuXSA9ICdcMCc7Cit9CmRpZmYgLS1naXQgYS9saWJiYi91X3NpZ25hbF9uYW1lcy5jIGIvbGliYmIvdV9zaWduYWxfbmFtZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yzc4ZjVlCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvdV9zaWduYWxfbmFtZXMuYwpAQCAtMCwwICsxLDIzNiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU2lnbmFsIG5hbWUvbnVtYmVyIGNvbnZlcnNpb24gcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IDIwMDYgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1JUTUlOTUFYCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCBSVE1JTlsrbl0gYW5kIFJUTUFYWy1uXSBzaWduYWwgbmFtZXMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU3VwcG9ydCBSVE1JTlsrbl0gYW5kIFJUTUFYWy1uXSBzaWduYWwgbmFtZXMKKy8vY29uZmlnOgkgIGluIGtpbGwsIGtpbGxhbGwgZXRjLiBUaGlzIGNvc3RzIH4yNTAgYnl0ZXMuCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBCZWxpZXZlIGl0IG9yIG5vdCwgYnV0IHNvbWUgYXJjaGVzIGhhdmUgbW9yZSB0aGFuIDMyIFNJR3MhCisgKiBIUFBBOiBTSUdTVEtGTFQgPT0gMzYuICovCisKK3N0YXRpYyBjb25zdCBjaGFyIHNpZ25hbHNbXVs3XSA9IHsKKwkvLyBTVVN2MyBzYXlzIGtpbGwgbXVzdCBzdXBwb3J0IHRoZXNlLCBhbmQgc3BlY2lmaWVzIHRoZSBudW1lcmljYWwgdmFsdWVzLAorCS8vIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS91dGlsaXRpZXMva2lsbC5odG1sCisJLy8gezAsICJFWElUIn0sIHsxLCAiSFVQIn0sIHsyLCAiSU5UIn0sIHszLCAiUVVJVCJ9LAorCS8vIHs2LCAiQUJSVCJ9LCB7OSwgIktJTEwifSwgezE0LCAiQUxSTSJ9LCB7MTUsICJURVJNIn0KKwkvLyBBbmQgUG9zaXggYWRkcyB0aGUgZm9sbG93aW5nOgorCS8vIHtTSUdJTEwsICJJTEwifSwge1NJR1RSQVAsICJUUkFQIn0sIHtTSUdGUEUsICJGUEUifSwge1NJR1VTUjEsICJVU1IxIn0sCisJLy8ge1NJR1NFR1YsICJTRUdWIn0sIHtTSUdVU1IyLCAiVVNSMiJ9LCB7U0lHUElQRSwgIlBJUEUifSwge1NJR0NITEQsICJDSExEIn0sCisJLy8ge1NJR0NPTlQsICJDT05UIn0sIHtTSUdTVE9QLCAiU1RPUCJ9LCB7U0lHVFNUUCwgIlRTVFAifSwge1NJR1RUSU4sICJUVElOIn0sCisJLy8ge1NJR1RUT1UsICJUVE9VIn0KKworCVswXSA9ICJFWElUIiwKKyNpZmRlZiBTSUdIVVAKKwlbU0lHSFVQICAgXSA9ICJIVVAiLAorI2VuZGlmCisjaWZkZWYgU0lHSU5UCisJW1NJR0lOVCAgIF0gPSAiSU5UIiwKKyNlbmRpZgorI2lmZGVmIFNJR1FVSVQKKwlbU0lHUVVJVCAgXSA9ICJRVUlUIiwKKyNlbmRpZgorI2lmZGVmIFNJR0lMTAorCVtTSUdJTEwgICBdID0gIklMTCIsCisjZW5kaWYKKyNpZmRlZiBTSUdUUkFQCisJW1NJR1RSQVAgIF0gPSAiVFJBUCIsCisjZW5kaWYKKyNpZmRlZiBTSUdBQlJUCisJW1NJR0FCUlQgIF0gPSAiQUJSVCIsCisjZW5kaWYKKyNpZmRlZiBTSUdCVVMKKwlbU0lHQlVTICAgXSA9ICJCVVMiLAorI2VuZGlmCisjaWZkZWYgU0lHRlBFCisJW1NJR0ZQRSAgIF0gPSAiRlBFIiwKKyNlbmRpZgorI2lmZGVmIFNJR0tJTEwKKwlbU0lHS0lMTCAgXSA9ICJLSUxMIiwKKyNlbmRpZgorI2lmZGVmIFNJR1VTUjEKKwlbU0lHVVNSMSAgXSA9ICJVU1IxIiwKKyNlbmRpZgorI2lmZGVmIFNJR1NFR1YKKwlbU0lHU0VHViAgXSA9ICJTRUdWIiwKKyNlbmRpZgorI2lmZGVmIFNJR1VTUjIKKwlbU0lHVVNSMiAgXSA9ICJVU1IyIiwKKyNlbmRpZgorI2lmZGVmIFNJR1BJUEUKKwlbU0lHUElQRSAgXSA9ICJQSVBFIiwKKyNlbmRpZgorI2lmZGVmIFNJR0FMUk0KKwlbU0lHQUxSTSAgXSA9ICJBTFJNIiwKKyNlbmRpZgorI2lmZGVmIFNJR1RFUk0KKwlbU0lHVEVSTSAgXSA9ICJURVJNIiwKKyNlbmRpZgorI2lmZGVmIFNJR1NUS0ZMVAorCVtTSUdTVEtGTFRdID0gIlNUS0ZMVCIsCisjZW5kaWYKKyNpZmRlZiBTSUdDSExECisJW1NJR0NITEQgIF0gPSAiQ0hMRCIsCisjZW5kaWYKKyNpZmRlZiBTSUdDT05UCisJW1NJR0NPTlQgIF0gPSAiQ09OVCIsCisjZW5kaWYKKyNpZmRlZiBTSUdTVE9QCisJW1NJR1NUT1AgIF0gPSAiU1RPUCIsCisjZW5kaWYKKyNpZmRlZiBTSUdUU1RQCisJW1NJR1RTVFAgIF0gPSAiVFNUUCIsCisjZW5kaWYKKyNpZmRlZiBTSUdUVElOCisJW1NJR1RUSU4gIF0gPSAiVFRJTiIsCisjZW5kaWYKKyNpZmRlZiBTSUdUVE9VCisJW1NJR1RUT1UgIF0gPSAiVFRPVSIsCisjZW5kaWYKKyNpZmRlZiBTSUdVUkcKKwlbU0lHVVJHICAgXSA9ICJVUkciLAorI2VuZGlmCisjaWZkZWYgU0lHWENQVQorCVtTSUdYQ1BVICBdID0gIlhDUFUiLAorI2VuZGlmCisjaWZkZWYgU0lHWEZTWgorCVtTSUdYRlNaICBdID0gIlhGU1oiLAorI2VuZGlmCisjaWZkZWYgU0lHVlRBTFJNCisJW1NJR1ZUQUxSTV0gPSAiVlRBTFJNIiwKKyNlbmRpZgorI2lmZGVmIFNJR1BST0YKKwlbU0lHUFJPRiAgXSA9ICJQUk9GIiwKKyNlbmRpZgorI2lmZGVmIFNJR1dJTkNICisJW1NJR1dJTkNIIF0gPSAiV0lOQ0giLAorI2VuZGlmCisjaWZkZWYgU0lHUE9MTAorCVtTSUdQT0xMICBdID0gIlBPTEwiLAorI2VuZGlmCisjaWZkZWYgU0lHUFdSCisJW1NJR1BXUiAgIF0gPSAiUFdSIiwKKyNlbmRpZgorI2lmZGVmIFNJR1NZUworCVtTSUdTWVMgICBdID0gIlNZUyIsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9SVE1JTk1BWAorIyBpZmRlZiBfX1NJR1JUTUlOCisJW19fU0lHUlRNSU5dID0gIlJUTUlOIiwKKyMgZW5kaWYKKy8vIFRoaXMgbWFrZXMgYXJyYXkgYWJvdXQgeDIgYmlnZ2VyLgorLy8gTW9yZSBjb21wYWN0IGFwcHJvYWNoIGlzIHRvIHNwZWNpYWwtY2FzZSBTSUdSVE1BWCBpbiBwcmludF9zaWduYW1lcygpCisvLyMgaWZkZWYgX19TSUdSVE1BWAorLy8JW19fU0lHUlRNQVhdID0gIlJUTUFYIiwKKy8vIyBlbmRpZgorI2VuZGlmCit9OworCisvLyBDb252ZXJ0IHNpZ25hbCBuYW1lIHRvIG51bWJlci4KKworaW50IEZBU1RfRlVOQyBnZXRfc2lnbnVtKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgaTsKKworCWkgPSBiYl9zdHJ0b3UobmFtZSwgTlVMTCwgMTApOworCWlmICghZXJybm8pCisJCXJldHVybiBpOworCWlmIChzdHJuY2FzZWNtcChuYW1lLCAiU0lHIiwgMykgPT0gMCkKKwkJbmFtZSArPSAzOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNpZ25hbHMpOyBpKyspCisJCWlmIChzdHJjYXNlY21wKG5hbWUsIHNpZ25hbHNbaV0pID09IDApCisJCQlyZXR1cm4gaTsKKworI2lmIEVOQUJMRV9ERVNLVE9QCisjIGlmIGRlZmluZWQoU0lHSU9UKSB8fCBkZWZpbmVkKFNJR0lPKQorCS8qIFNJR0lPW1RdIGFyZSBhbGlhc2VkIHRvIG90aGVyIG5hbWVzLAorCSAqIHRodXMgY2Fubm90IGJlIHN0b3JlZCBpbiB0aGUgc2lnbmFsc1tdIGFycmF5LgorCSAqIE5lZWQgc3BlY2lhbCBjb2RlIHRvIHJlY29nbml6ZSB0aGVtICovCisJaWYgKChuYW1lWzBdIHwgMHgyMCkgPT0gJ2knICYmIChuYW1lWzFdIHwgMHgyMCkgPT0gJ28nKSB7CisjICBpZmRlZiBTSUdJTworCQlpZiAoIW5hbWVbMl0pCisJCQlyZXR1cm4gU0lHSU87CisjICBlbmRpZgorIyAgaWZkZWYgU0lHSU9UCisJCWlmICgobmFtZVsyXSB8IDB4MjApID09ICd0JyAmJiAhbmFtZVszXSkKKwkJCXJldHVybiBTSUdJT1Q7CisjICBlbmRpZgorCX0KKyMgZW5kaWYKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfUlRNSU5NQVgKKyMgaWYgZGVmaW5lZChTSUdSVE1JTikgJiYgZGVmaW5lZChTSUdSVE1BWCkKKy8qIGxpYmMgbWF5IHVzZSBzb21lIHJ0IHNpZ3MgZm9yIHB0aHJlYWRzIGFuZCB0aGVyZWZvcmUgInJlbWFwIiBTSUdSVE1JTi9NQVgsCisgKiBidXQgd2Ugd2FudCB0byB1c2UgInJhdyIgU0lHUlRNSU4vTUFYLiBVbmRlcnNjb3JlZCBuYW1lcywgaWYgZXhpc3QsIHByb3ZpZGUKKyAqIHRoZW0uIElmIHRoZXkgZG9uJ3QgZXhpc3QsIGZhbGwgYmFjayB0byBub24tdW5kZXJzY29yZWQgb25lczogKi8KKyMgIGlmICFkZWZpbmVkKF9fU0lHUlRNSU4pCisjICAgZGVmaW5lIF9fU0lHUlRNSU4gU0lHUlRNSU4KKyMgIGVuZGlmCisjICBpZiAhZGVmaW5lZChfX1NJR1JUTUFYKQorIyAgIGRlZmluZSBfX1NJR1JUTUFYIFNJR1JUTUFYCisjICBlbmRpZgorCWlmIChzdHJuY2FzZWNtcChuYW1lLCAiUlRNSU4iLCA1KSA9PSAwKSB7CisJCWlmICghbmFtZVs1XSkKKwkJCXJldHVybiBfX1NJR1JUTUlOOworCQlpZiAobmFtZVs1XSA9PSAnKycpIHsKKwkJCWkgPSBiYl9zdHJ0b3UobmFtZSArIDYsIE5VTEwsIDEwKTsKKwkJCWlmICghZXJybm8gJiYgaSA8PSBfX1NJR1JUTUFYIC0gX19TSUdSVE1JTikKKwkJCQlyZXR1cm4gX19TSUdSVE1JTiArIGk7CisJCX0KKwl9CisJZWxzZSBpZiAoc3RybmNhc2VjbXAobmFtZSwgIlJUTUFYIiwgNSkgPT0gMCkgeworCQlpZiAoIW5hbWVbNV0pCisJCQlyZXR1cm4gX19TSUdSVE1BWDsKKwkJaWYgKG5hbWVbNV0gPT0gJy0nKSB7CisJCQlpID0gYmJfc3RydG91KG5hbWUgKyA2LCBOVUxMLCAxMCk7CisJCQlpZiAoIWVycm5vICYmIGkgPD0gX19TSUdSVE1BWCAtIF9fU0lHUlRNSU4pCisJCQkJcmV0dXJuIF9fU0lHUlRNQVggLSBpOworCQl9CisJfQorIyBlbmRpZgorI2VuZGlmCisKKwlyZXR1cm4gLTE7Cit9CisKKy8vIENvbnZlcnQgc2lnbmFsIG51bWJlciB0byBuYW1lCisKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBnZXRfc2lnbmFtZShpbnQgbnVtYmVyKQoreworCWlmICgodW5zaWduZWQpbnVtYmVyIDwgQVJSQVlfU0laRShzaWduYWxzKSkgeworCQlpZiAoc2lnbmFsc1tudW1iZXJdWzBdKSAvKiBpZiBpdCdzIG5vdCBhbiBlbXB0eSBzdHIgKi8KKwkJCXJldHVybiBzaWduYWxzW251bWJlcl07CisJfQorCisJcmV0dXJuIGl0b2EobnVtYmVyKTsKK30KKworCisvLyBQcmludCB0aGUgd2hvbGUgc2lnbmFsIGxpc3QKKwordm9pZCBGQVNUX0ZVTkMgcHJpbnRfc2lnbmFtZXModm9pZCkKK3sKKwl1bnNpZ25lZCBzaWdubzsKKworCWZvciAoc2lnbm8gPSAxOyBzaWdubyA8IEFSUkFZX1NJWkUoc2lnbmFscyk7IHNpZ25vKyspIHsKKwkJY29uc3QgY2hhciAqbmFtZSA9IHNpZ25hbHNbc2lnbm9dOworCQlpZiAobmFtZVswXSkKKwkJCXByaW50ZigiJTJ1KSAlc1xuIiwgc2lnbm8sIG5hbWUpOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9SVE1JTk1BWAorIyBpZmRlZiBfX1NJR1JUTUFYCisJcHJpbnRmKCIlMnUpICVzXG4iLCBfX1NJR1JUTUFYLCAiUlRNQVgiKTsKKyMgZW5kaWYKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvbGliYmIvdWRwX2lvLmMgYi9saWJiYi91ZHBfaW8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzJhZjliCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvdWRwX2lvLmMKQEAgLTAsMCArMSwxNzkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qCisgKiBUaGlzIGFza3Mga2VybmVsIHRvIGxldCB1cyBrbm93IGRzdCBhZGRyL3BvcnQgb2YgaW5jb21pbmcgcGFja2V0cworICogV2UgZG9uJ3QgY2hlY2sgZm9yIGVycm9ycyBoZXJlLiBOb3Qgc3VwcG9ydGVkID09IHdvbid0IGJlIHVzZWQKKyAqLwordm9pZCBGQVNUX0ZVTkMKK3NvY2tldF93YW50X3BrdGluZm8oaW50IGZkIFVOVVNFRF9QQVJBTSkKK3sKKyNpZmRlZiBJUF9QS1RJTkZPCisJc2V0c29ja29wdF8xKGZkLCBJUFBST1RPX0lQLCBJUF9QS1RJTkZPKTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYgJiYgZGVmaW5lZChJUFY2X1BLVElORk8pCisJc2V0c29ja29wdF8xKGZkLCBJUFBST1RPX0lQVjYsIElQVjZfUEtUSU5GTyk7CisjZW5kaWYKK30KKworCitzc2l6ZV90IEZBU1RfRlVOQworc2VuZF90b19mcm9tKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MsCisJCWNvbnN0IHN0cnVjdCBzb2NrYWRkciAqdG8sCisJCWNvbnN0IHN0cnVjdCBzb2NrYWRkciAqZnJvbSwKKwkJc29ja2xlbl90IHRvbGVuKQoreworI2lmbmRlZiBJUF9QS1RJTkZPCisJKHZvaWQpZnJvbTsgLyogc3VwcHJlc3MgInVudXNlZCBmcm9tIiB3YXJuaW5nICovCisJcmV0dXJuIHNlbmR0byhmZCwgYnVmLCBsZW4sIGZsYWdzLCB0bywgdG9sZW4pOworI2Vsc2UKKwlzdHJ1Y3QgaW92ZWMgaW92WzFdOworCXN0cnVjdCBtc2doZHIgbXNnOworCXVuaW9uIHsKKwkJY2hhciBjbXNnW0NNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBpbl9wa3RpbmZvKSldOworIyBpZiBFTkFCTEVfRkVBVFVSRV9JUFY2ICYmIGRlZmluZWQoSVBWNl9QS1RJTkZPKQorCQljaGFyIGNtc2c2W0NNU0dfU1BBQ0Uoc2l6ZW9mKHN0cnVjdCBpbjZfcGt0aW5mbykpXTsKKyMgZW5kaWYKKwl9IHU7CisJc3RydWN0IGNtc2doZHIqIGNtc2dwdHI7CisKKwlpZiAoZnJvbS0+c2FfZmFtaWx5ICE9IEFGX0lORVQKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCSAmJiBmcm9tLT5zYV9mYW1pbHkgIT0gQUZfSU5FVDYKKyMgZW5kaWYKKwkpIHsKKwkJLyogQU5ZIGxvY2FsIGFkZHJlc3MgKi8KKwkJcmV0dXJuIHNlbmR0byhmZCwgYnVmLCBsZW4sIGZsYWdzLCB0bywgdG9sZW4pOworCX0KKworCS8qIG1hbiByZWN2bXNnIGFuZCBtYW4gY21zZyBpcyBuZWVkZWQgdG8gbWFrZSBzZW5zZSBvZiBjb2RlIGJlbG93ICovCisKKwlpb3ZbMF0uaW92X2Jhc2UgPSBidWY7CisJaW92WzBdLmlvdl9sZW4gPSBsZW47CisKKwltZW1zZXQoJnUsIDAsIHNpemVvZih1KSk7CisKKwltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOworCW1zZy5tc2dfbmFtZSA9ICh2b2lkICopKHN0cnVjdCBzb2NrYWRkciAqKXRvOyAvKiBvciBjb21waWxlciB3aWxsIGFubm95IHVzICovCisJbXNnLm1zZ19uYW1lbGVuID0gdG9sZW47CisJbXNnLm1zZ19pb3YgPSBpb3Y7CisJbXNnLm1zZ19pb3ZsZW4gPSAxOworCW1zZy5tc2dfY29udHJvbCA9ICZ1OworCW1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZih1KTsKKwltc2cubXNnX2ZsYWdzID0gZmxhZ3M7CisKKwljbXNncHRyID0gQ01TR19GSVJTVEhEUigmbXNnKTsKKwlpZiAodG8tPnNhX2ZhbWlseSA9PSBBRl9JTkVUICYmIGZyb20tPnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisJCXN0cnVjdCBpbl9wa3RpbmZvICpwa3RwdHI7CisJCWNtc2dwdHItPmNtc2dfbGV2ZWwgPSBJUFBST1RPX0lQOworCQljbXNncHRyLT5jbXNnX3R5cGUgPSBJUF9QS1RJTkZPOworCQljbXNncHRyLT5jbXNnX2xlbiA9IENNU0dfTEVOKHNpemVvZihzdHJ1Y3QgaW5fcGt0aW5mbykpOworCQlwa3RwdHIgPSAoc3RydWN0IGluX3BrdGluZm8gKikoQ01TR19EQVRBKGNtc2dwdHIpKTsKKwkJLypwa3RwdHItPmlwaV9pZmluZGV4ID0gMDsgLS0gYWxyZWFkeSBkb25lIGJ5IG1lbXNldCh1Li4uKSAqLworCQkvKiBJbiBnZW5lcmFsLCBDTVNHX0RBVEEoKSBjYW4gYmUgdW5hbGlnbmVkLCBidXQgaW4gdGhpcyBjYXNlCisJCSAqIHdlIGtub3cgZm9yIHN1cmUgaXQgaXMgc3VmZmljaWVudGx5IGFsaWduZWQ6CisJCSAqIENNU0dfRklSU1RIRFIgc2ltcGx5IHJldHVybnMgJnUgYWJvdmUsCisJCSAqIGFuZCBDTVNHX0RBVEEgcmV0dXJucyAmdSArIHNpemVfdCArIGludCArIGludC4KKwkJICogVGh1cyBkaXJlY3QgYXNzaWdubWVudCBpcyBvazoKKwkJICovCisJCXBrdHB0ci0+aXBpX3NwZWNfZHN0ID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW4qKWZyb20pLT5zaW5fYWRkcjsKKwl9CisjIGlmIEVOQUJMRV9GRUFUVVJFX0lQVjYgJiYgZGVmaW5lZChJUFY2X1BLVElORk8pCisJZWxzZSBpZiAodG8tPnNhX2ZhbWlseSA9PSBBRl9JTkVUNiAmJiBmcm9tLT5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJc3RydWN0IGluNl9wa3RpbmZvICpwa3RwdHI7CisJCWNtc2dwdHItPmNtc2dfbGV2ZWwgPSBJUFBST1RPX0lQVjY7CisJCWNtc2dwdHItPmNtc2dfdHlwZSA9IElQVjZfUEtUSU5GTzsKKwkJY21zZ3B0ci0+Y21zZ19sZW4gPSBDTVNHX0xFTihzaXplb2Yoc3RydWN0IGluNl9wa3RpbmZvKSk7CisJCXBrdHB0ciA9IChzdHJ1Y3QgaW42X3BrdGluZm8gKikoQ01TR19EQVRBKGNtc2dwdHIpKTsKKwkJLyogcGt0cHRyLT5pcGk2X2lmaW5kZXggPSAwOyAtLSBhbHJlYWR5IGRvbmUgYnkgbWVtc2V0KHUuLi4pICovCisJCXBrdHB0ci0+aXBpNl9hZGRyID0gKChzdHJ1Y3Qgc29ja2FkZHJfaW42Kilmcm9tKS0+c2luNl9hZGRyOworCX0KKyMgZW5kaWYKKwltc2cubXNnX2NvbnRyb2xsZW4gPSBjbXNncHRyLT5jbXNnX2xlbjsKKworCXJldHVybiBzZW5kbXNnKGZkLCAmbXNnLCBmbGFncyk7CisjZW5kaWYKK30KKworLyogTkI6IHRoaXMgd2lsbCBuZXZlciBzZXQgcG9ydCMgaW4gJ3RvJyEKKyAqIF9Pbmx5XyBJUC9JUHY2IGFkZHJlc3MgcGFydCBvZiAndG8nIGlzIF9tYXliZV8gbW9kaWZpZWQuCisgKiBUeXBpY2FsIHVzYWdlIGlzIHRvIHByZWluaXQgJ3RvJyB3aXRoICJkZWZhdWx0IiB2YWx1ZQorICogYmVmb3JlIGNhbGxpbmcgcmVjdl9mcm9tX3RvKCkuICovCitzc2l6ZV90IEZBU1RfRlVOQworcmVjdl9mcm9tX3RvKGludCBmZCwgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCBpbnQgZmxhZ3MsCisJCXN0cnVjdCBzb2NrYWRkciAqZnJvbSwgc3RydWN0IHNvY2thZGRyICp0bywKKwkJc29ja2xlbl90IHNhX3NpemUpCit7CisjaWZuZGVmIElQX1BLVElORk8KKwkodm9pZCl0bzsgLyogc3VwcHJlc3MgInVudXNlZCB0byIgd2FybmluZyAqLworCXJldHVybiByZWN2ZnJvbShmZCwgYnVmLCBsZW4sIGZsYWdzLCBmcm9tLCAmc2Ffc2l6ZSk7CisjZWxzZQorCS8qIG1hbiByZWN2bXNnIGFuZCBtYW4gY21zZyBpcyBuZWVkZWQgdG8gbWFrZSBzZW5zZSBvZiBjb2RlIGJlbG93ICovCisJc3RydWN0IGlvdmVjIGlvdlsxXTsKKwl1bmlvbiB7CisJCWNoYXIgY21zZ1tDTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgaW5fcGt0aW5mbykpXTsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNiAmJiBkZWZpbmVkKElQVjZfUEtUSU5GTykKKwkJY2hhciBjbXNnNltDTVNHX1NQQUNFKHNpemVvZihzdHJ1Y3QgaW42X3BrdGluZm8pKV07CisjIGVuZGlmCisJfSB1OworCXN0cnVjdCBjbXNnaGRyICpjbXNncHRyOworCXN0cnVjdCBtc2doZHIgbXNnOworCXNzaXplX3QgcmVjdl9sZW5ndGg7CisKKwlpb3ZbMF0uaW92X2Jhc2UgPSBidWY7CisJaW92WzBdLmlvdl9sZW4gPSBsZW47CisKKwltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOworCW1zZy5tc2dfbmFtZSA9IChzdHJ1Y3Qgc29ja2FkZHIgKilmcm9tOworCW1zZy5tc2dfbmFtZWxlbiA9IHNhX3NpemU7CisJbXNnLm1zZ19pb3YgPSBpb3Y7CisJbXNnLm1zZ19pb3ZsZW4gPSAxOworCW1zZy5tc2dfY29udHJvbCA9ICZ1OworCW1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZih1KTsKKworCXJlY3ZfbGVuZ3RoID0gcmVjdm1zZyhmZCwgJm1zZywgZmxhZ3MpOworCWlmIChyZWN2X2xlbmd0aCA8IDApCisJCXJldHVybiByZWN2X2xlbmd0aDsKKworIyBkZWZpbmUgdG80ICgoc3RydWN0IHNvY2thZGRyX2luKil0bykKKyMgZGVmaW5lIHRvNiAoKHN0cnVjdCBzb2NrYWRkcl9pbjYqKXRvKQorCS8qIEhlcmUgd2UgdHJ5IHRvIHJldHJpZXZlIGRlc3RpbmF0aW9uIElQIGFuZCBtZW1vcml6ZSBpdCAqLworCWZvciAoY21zZ3B0ciA9IENNU0dfRklSU1RIRFIoJm1zZyk7CisJCQljbXNncHRyICE9IE5VTEw7CisJCQljbXNncHRyID0gQ01TR19OWFRIRFIoJm1zZywgY21zZ3B0cikKKwkpIHsKKwkJaWYgKGNtc2dwdHItPmNtc2dfbGV2ZWwgPT0gSVBQUk9UT19JUAorCQkgJiYgY21zZ3B0ci0+Y21zZ190eXBlID09IElQX1BLVElORk8KKwkJKSB7CisJCQljb25zdCBpbnQgSVBJX0FERFJfT0ZGID0gb2Zmc2V0b2Yoc3RydWN0IGluX3BrdGluZm8sIGlwaV9hZGRyKTsKKwkJCXRvLT5zYV9mYW1pbHkgPSBBRl9JTkVUOworCQkJLyojIGRlZmluZSBwa3RpbmZvKGNtc2dwdHIpICggKHN0cnVjdCBpbl9wa3RpbmZvKikoQ01TR19EQVRBKGNtc2dwdHIpKSApKi8KKwkJCS8qdG80LT5zaW5fYWRkciA9IHBrdGluZm8oY21zZ3B0ciktPmlwaV9hZGRyOyAtIG1heSBiZSB1bmFsaWduZWQgKi8KKwkJCW1lbWNweSgmdG80LT5zaW5fYWRkciwgKGNoYXIqKShDTVNHX0RBVEEoY21zZ3B0cikpICsgSVBJX0FERFJfT0ZGLCBzaXplb2YodG80LT5zaW5fYWRkcikpOworCQkJLyp0bzQtPnNpbl9wb3J0ID0gMTIzOyAtIHRoaXMgZGF0YSBpcyBub3Qgc3VwcGxpZWQgYnkga2VybmVsICovCisJCQlicmVhazsKKwkJfQorIyBpZiBFTkFCTEVfRkVBVFVSRV9JUFY2ICYmIGRlZmluZWQoSVBWNl9QS1RJTkZPKQorCQlpZiAoY21zZ3B0ci0+Y21zZ19sZXZlbCA9PSBJUFBST1RPX0lQVjYKKwkJICYmIGNtc2dwdHItPmNtc2dfdHlwZSA9PSBJUFY2X1BLVElORk8KKwkJKSB7CisJCQljb25zdCBpbnQgSVBJNl9BRERSX09GRiA9IG9mZnNldG9mKHN0cnVjdCBpbjZfcGt0aW5mbywgaXBpNl9hZGRyKTsKKwkJCXRvLT5zYV9mYW1pbHkgPSBBRl9JTkVUNjsKKwkJCS8qIyAgZGVmaW5lIHBrdGluZm8oY21zZ3B0cikgKCAoc3RydWN0IGluNl9wa3RpbmZvKikoQ01TR19EQVRBKGNtc2dwdHIpKSApKi8KKwkJCS8qdG82LT5zaW42X2FkZHIgPSBwa3RpbmZvKGNtc2dwdHIpLT5pcGk2X2FkZHI7IC0gbWF5IGJlIHVuYWxpZ25lZCAqLworCQkJbWVtY3B5KCZ0bzYtPnNpbjZfYWRkciwgKGNoYXIqKShDTVNHX0RBVEEoY21zZ3B0cikpICsgSVBJNl9BRERSX09GRiwgc2l6ZW9mKHRvNi0+c2luNl9hZGRyKSk7CisJCQkvKnRvNi0+c2luNl9wb3J0ID0gMTIzOyAqLworCQkJYnJlYWs7CisJCX0KKyMgZW5kaWYKKwl9CisJcmV0dXJuIHJlY3ZfbGVuZ3RoOworI2VuZGlmCit9CmRpZmYgLS1naXQgYS9saWJiYi91bmljb2RlLmMgYi9saWJiYi91bmljb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM0ZGE1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3VuaWNvZGUuYwpAQCAtMCwwICsxLDExNzggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFVuaWNvZGUgc3VwcG9ydCByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgRGVueXMgVmxhc2Vua28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ1bmljb2RlLmgiCisKKy8qIElmIGl0J3Mgbm90ICNkZWZpbmVkIGFzIGEgY29uc3RhbnQgaW4gdW5pY29kZS5oLi4uICovCisjaWZuZGVmIHVuaWNvZGVfc3RhdHVzCit1aW50OF90IHVuaWNvZGVfc3RhdHVzOworI2VuZGlmCisKKy8qIFRoaXMgZmlsZSBpcyBjb21waWxlZCBvbmx5IGlmIFVOSUNPREVfU1VQUE9SVCBpcyBvbi4KKyAqIFdlIGNoZWNrIG90aGVyIG9wdGlvbnMgYW5kIGRlY2lkZSB3aGV0aGVyIHRvIHVzZSBsaWJjIHN1cHBvcnQKKyAqIHZpYSBsb2NhbGUsIG9yIHVzZSBvdXIgb3duIGxvZ2ljOgorICovCisKKyNpZiBFTkFCTEVfVU5JQ09ERV9VU0lOR19MT0NBTEUKKworLyogVW5pY29kZSBzdXBwb3J0IHVzaW5nIGxpYmMgbG9jYWxlIHN1cHBvcnQuICovCisKK3ZvaWQgRkFTVF9GVU5DIHJlaW5pdF91bmljb2RlKGNvbnN0IGNoYXIgKkxBTkcpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgdW5pY29kZV8weDM5NFtdID0geyAweGNlLCAweDk0LCAwIH07CisJc2l6ZV90IHdpZHRoOworCisJLyogV2UgcGFzcyAiIiBpbnN0ZWFkIG9mICJDIiBiZWNhdXNlIHNvbWUgbGliYydzIGhhdmUKKwkgKiBub24tQVNDSUkgZGVmYXVsdCBsb2NhbGUgZm9yIHNldGxvY2FsZSgiIikgY2FsbAorCSAqICh0aGlzIGFsbG93cyB1c2VycyBvZiBzdWNoIGxpYmMgdG8gaGF2ZSBVbmljb2RlZAorCSAqIHN5c3RlbSB3aXRob3V0IGhhdmluZyB0byBtZXNzIHdpdGggZW52KS4KKwkgKgorCSAqIFdlIHNldCBMQ19DVFlQRSBiZWNhdXNlIChhKSB3ZSBtYXkgYmUgY2FsbGVkIHdpdGggJExDX0NUWVBFCisJICogdmFsdWUgaW4gTEFORywgbm90IHdpdGggJExDX0FMTCwgKGIpIGludGVybmF0aW9uYWxpemVkCisJICogTENfTlVNRVJJQyBhbmQgTENfVElNRSBhcmUgbW9yZSBQSVRBIHRoYW4gYmVuZWZpdAorCSAqIChmb3Igb25lLCBzb21lIHV0aWxpdGllcyBoYXZlIGhhcmQgdGltZSB3aXRoIGNvbW1hCisJICogdXNlZCBhcyBhIGZyYWN0aW9uYWwgc2VwYXJhdG9yKS4KKwkgKi8KKy8vVE9ETzogYXZvaWQgcmVwZWF0ZWQgY2FsbHMgYnkgY2FjaGluZyBsYXN0IHN0cmluZz8KKwlzZXRsb2NhbGUoTENfQ1RZUEUsIExBTkcgPyBMQU5HIDogIiIpOworCisJLyogSW4gdW5pY29kZSwgdGhpcyBpcyBhIG9uZSBjaGFyYWN0ZXIgc3RyaW5nICovCisJd2lkdGggPSB1bmljb2RlX3N0cmxlbih1bmljb2RlXzB4Mzk0KTsKKwl1bmljb2RlX3N0YXR1cyA9ICh3aWR0aCA9PSAxID8gVU5JQ09ERV9PTiA6IFVOSUNPREVfT0ZGKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgaW5pdF91bmljb2RlKHZvaWQpCit7CisJLyogU29tZSBwZW9wbGUgc2V0IG9ubHkgJExDX0NUWVBFLCBub3QgJExDX0FMTCwgYmVjYXVzZSB0aGV5IHdhbnQKKwkgKiBvbmx5IFVuaWNvZGUgdG8gYmUgYWN0aXZhdGVkIG9uIHRoZWlyIHN5c3RlbSwgbm90IHRoZSB3aG9sZQorCSAqIHNoZWJhbmcgb2Ygd3JvbmcgZGVjaW1hbCBwb2ludHMsIHN0cmFuZ2UgZGF0ZSBmb3JtYXRzIGFuZCBzbyBvbi4KKwkgKi8KKwlpZiAodW5pY29kZV9zdGF0dXMgPT0gVU5JQ09ERV9VTktOT1dOKSB7CisJCWNoYXIgKnMgPSBnZXRlbnYoIkxDX0FMTCIpOworCQlpZiAoIXMpIHMgPSBnZXRlbnYoIkxDX0NUWVBFIik7CisJCWlmICghcykgcyA9IGdldGVudigiTEFORyIpOworCQlyZWluaXRfdW5pY29kZShzKTsKKwl9Cit9CisKKyNlbHNlCisKKy8qIEhvbWVncm93biBVbmljb2RlIHN1cHBvcnQuIEl0IGtub3dzIG9ubHkgQyBhbmQgVW5pY29kZSBsb2NhbGVzLiAqLworCisjIGlmIEVOQUJMRV9GRUFUVVJFX0NIRUNLX1VOSUNPREVfSU5fRU5WCit2b2lkIEZBU1RfRlVOQyByZWluaXRfdW5pY29kZShjb25zdCBjaGFyICpMQU5HKQoreworCXVuaWNvZGVfc3RhdHVzID0gVU5JQ09ERV9PRkY7CisJaWYgKCFMQU5HIHx8ICEoc3Ryc3RyKExBTkcsICIudXRmIikgfHwgc3Ryc3RyKExBTkcsICIuVVRGIikpKQorCQlyZXR1cm47CisJdW5pY29kZV9zdGF0dXMgPSBVTklDT0RFX09OOworfQorCit2b2lkIEZBU1RfRlVOQyBpbml0X3VuaWNvZGUodm9pZCkKK3sKKwlpZiAodW5pY29kZV9zdGF0dXMgPT0gVU5JQ09ERV9VTktOT1dOKSB7CisJCWNoYXIgKnMgPSBnZXRlbnYoIkxDX0FMTCIpOworCQlpZiAoIXMpIHMgPSBnZXRlbnYoIkxDX0NUWVBFIik7CisJCWlmICghcykgcyA9IGdldGVudigiTEFORyIpOworCQlyZWluaXRfdW5pY29kZShzKTsKKwl9Cit9CisjIGVuZGlmCisKK3N0YXRpYyBzaXplX3Qgd2NydG9tYl9pbnRlcm5hbChjaGFyICpzLCB3Y2hhcl90IHdjKQoreworCWludCBuLCBpOworCXVpbnQzMl90IHYgPSB3YzsKKworCWlmICh2IDw9IDB4N2YpIHsKKwkJKnMgPSB2OworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBSRkMgMzYyOSBzYXlzIHRoYXQgVW5pY29kZSBlbmRzIGF0IDEwRkZGRiwKKwkgKiBidXQgd2UgY292ZXIgZW50aXJlIDMyIGJpdHMgKi8KKworCS8qIDQwMDAwMDAtRkZGRkZGRkYgLT4gMTExMTExdHQgMTB0dHR0dHQgMTB6enp6enogMTB6enl5eXkgMTB5eXl5eHggMTB4eHh4eHggKi8KKwkvKiAyMDAwMDAtM0ZGRkZGRiAtPiAxMTExMTB0dCAxMHp6enp6eiAxMHp6eXl5eSAxMHl5eXl4eCAxMHh4eHh4eCAqLworCS8qIDEwMDAwLTFGRkZGRiAtPiAxMTExMHp6eiAxMHp6eXl5eSAxMHl5eXl4eCAxMHh4eHh4eCAqLworCS8qIDgwMC1GRkZGIC0+IDExMTB5eXl5IDEweXl5eXh4IDEweHh4eHh4ICovCisJLyogODAtN0ZGIC0+IDExMHl5eXh4IDEweHh4eHh4ICovCisKKwkvKiBIb3cgbWFueSBieXRlcyBkbyB3ZSBuZWVkPyAqLworCW4gPSAyOworCS8qICgweDgwMDAwMDAwKyB3b3VsZCByZXN1bHQgaW4gbiA9IDcsIGxpbWl0aW5nIG4gdG8gNikgKi8KKwl3aGlsZSAodiA+PSAweDgwMCAmJiBuIDwgNikgeworCQl2ID4+PSA1OworCQluKys7CisJfQorCS8qIEZpbGwgYnl0ZXMgbi0xLi4xICovCisJaSA9IG47CisJd2hpbGUgKC0taSkgeworCQlzW2ldID0gKHdjICYgMHgzZikgfCAweDgwOworCQl3YyA+Pj0gNjsKKwl9CisJLyogRmlsbCBieXRlIDAgKi8KKwlzWzBdID0gd2MgfCAodWludDhfdCkoMHgzZjAwID4+IG4pOworCXJldHVybiBuOworfQorc2l6ZV90IEZBU1RfRlVOQyB3Y3J0b21iKGNoYXIgKnMsIHdjaGFyX3Qgd2MsIG1ic3RhdGVfdCAqcHMgVU5VU0VEX1BBUkFNKQoreworCWlmICh1bmljb2RlX3N0YXR1cyAhPSBVTklDT0RFX09OKSB7CisJCSpzID0gd2M7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiB3Y3J0b21iX2ludGVybmFsKHMsIHdjKTsKK30KK3NpemVfdCBGQVNUX0ZVTkMgd2NzdG9tYnMoY2hhciAqZGVzdCwgY29uc3Qgd2NoYXJfdCAqc3JjLCBzaXplX3QgbikKK3sKKwlzaXplX3Qgb3JnX24gPSBuOworCisJaWYgKHVuaWNvZGVfc3RhdHVzICE9IFVOSUNPREVfT04pIHsKKwkJd2hpbGUgKG4pIHsKKwkJCXdjaGFyX3QgYyA9ICpzcmMrKzsKKwkJCSpkZXN0KysgPSBjOworCQkJaWYgKGMgPT0gMCkKKwkJCQlicmVhazsKKwkJCW4tLTsKKwkJfQorCQlyZXR1cm4gb3JnX24gLSBuOworCX0KKworCXdoaWxlIChuID49IE1CX0NVUl9NQVgpIHsKKwkJd2NoYXJfdCB3YyA9ICpzcmMrKzsKKwkJc2l6ZV90IGxlbiA9IHdjcnRvbWJfaW50ZXJuYWwoZGVzdCwgd2MpOworCisJCWlmICh3YyA9PSBMJ1wwJykKKwkJCXJldHVybiBvcmdfbiAtIG47CisJCWRlc3QgKz0gbGVuOworCQluIC09IGxlbjsKKwl9CisJd2hpbGUgKG4pIHsKKwkJY2hhciB0YnVmW01CX0NVUl9NQVhdOworCQl3Y2hhcl90IHdjID0gKnNyYysrOworCQlzaXplX3QgbGVuID0gd2NydG9tYl9pbnRlcm5hbCh0YnVmLCB3Yyk7CisKKwkJaWYgKGxlbiA+IG4pCisJCQlicmVhazsKKwkJbWVtY3B5KGRlc3QsIHRidWYsIGxlbik7CisJCWlmICh3YyA9PSBMJ1wwJykKKwkJCXJldHVybiBvcmdfbiAtIG47CisJCWRlc3QgKz0gbGVuOworCQluIC09IGxlbjsKKwl9CisJcmV0dXJuIG9yZ19uIC0gbjsKK30KKworIyBkZWZpbmUgRVJST1JfV0NIQVIgKH4od2NoYXJfdCkwKQorCitzdGF0aWMgY29uc3QgY2hhciAqbWJzdG93Y19pbnRlcm5hbCh3Y2hhcl90ICpyZXMsIGNvbnN0IGNoYXIgKnNyYykKK3sKKwlpbnQgYnl0ZXM7CisJdW5zaWduZWQgYyA9ICh1bnNpZ25lZCBjaGFyKSAqc3JjKys7CisKKwlpZiAoYyA8PSAweDdmKSB7CisJCSpyZXMgPSBjOworCQlyZXR1cm4gc3JjOworCX0KKworCS8qIDgwLTdGRiAtPiAxMTB5eXl4eCAxMHh4eHh4eCAqLworCS8qIDgwMC1GRkZGIC0+IDExMTB5eXl5IDEweXl5eXh4IDEweHh4eHh4ICovCisJLyogMTAwMDAtMUZGRkZGIC0+IDExMTEwenp6IDEwenp5eXl5IDEweXl5eXh4IDEweHh4eHh4ICovCisJLyogMjAwMDAwLTNGRkZGRkYgLT4gMTExMTEwdHQgMTB6enp6enogMTB6enl5eXkgMTB5eXl5eHggMTB4eHh4eHggKi8KKwkvKiA0MDAwMDAwLUZGRkZGRkZGIC0+IDExMTExMXR0IDEwdHR0dHR0IDEwenp6enp6IDEwenp5eXl5IDEweXl5eXh4IDEweHh4eHh4ICovCisJYnl0ZXMgPSAwOworCWRvIHsKKwkJYyA8PD0gMTsKKwkJYnl0ZXMrKzsKKwl9IHdoaWxlICgoYyAmIDB4ODApICYmIGJ5dGVzIDwgNik7CisJaWYgKGJ5dGVzID09IDEpIHsKKwkJLyogQSBiYXJlICJjb250aW51YXRpb24iIGJ5dGUuIFNheSwgODAgKi8KKwkJKnJlcyA9IEVSUk9SX1dDSEFSOworCQlyZXR1cm4gc3JjOworCX0KKwljID0gKHVpbnQ4X3QpKGMpID4+IGJ5dGVzOworCisJd2hpbGUgKC0tYnl0ZXMpIHsKKwkJdW5zaWduZWQgY2ggPSAodW5zaWduZWQgY2hhcikgKnNyYzsKKwkJaWYgKChjaCAmIDB4YzApICE9IDB4ODApIHsKKwkJCS8qIE1pc3NpbmcgImNvbnRpbnVhdGlvbiIgYnl0ZS4gRXhhbXBsZTogZTAgODAgKi8KKwkJCSpyZXMgPSBFUlJPUl9XQ0hBUjsKKwkJCXJldHVybiBzcmM7CisJCX0KKwkJYyA9IChjIDw8IDYpICsgKGNoICYgMHgzZik7CisJCXNyYysrOworCX0KKworCS8qIFRPRE8gKi8KKwkvKiBOZWVkIHRvIGNoZWNrIHRoYXQgYyBpc24ndCBwcm9kdWNlZCBieSBvdmVybG9uZyBlbmNvZGluZyAqLworCS8qIEV4YW1wbGU6IDExMDAwMDAwIDEwMDAwMDAwIGNvbnZlcnRzIHRvIE5VTCAqLworCS8qIDExMTEwMDAwIDEwMDAwMDAwIDEwMDAwMTAwIDEwMDAwMDAwIGNvbnZlcnRzIHRvIDB4MTAwICovCisJLyogY29ycmVjdCBlbmNvZGluZzogMTEwMDAxMDAgMTAwMDAwMDAgKi8KKwlpZiAoYyA8PSAweDdmKSB7IC8qIGNydWRlIGNoZWNrICovCisJCSpyZXMgPSBFUlJPUl9XQ0hBUjsKKwkJcmV0dXJuIHNyYzsKKwl9CisKKwkqcmVzID0gYzsKKwlyZXR1cm4gc3JjOworfQorc2l6ZV90IEZBU1RfRlVOQyBtYnN0b3djcyh3Y2hhcl90ICpkZXN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBuKQoreworCXNpemVfdCBvcmdfbiA9IG47CisKKwlpZiAodW5pY29kZV9zdGF0dXMgIT0gVU5JQ09ERV9PTikgeworCQl3aGlsZSAobikgeworCQkJdW5zaWduZWQgY2hhciBjID0gKnNyYysrOworCisJCQlpZiAoZGVzdCkKKwkJCQkqZGVzdCsrID0gYzsKKwkJCWlmIChjID09IDApCisJCQkJYnJlYWs7CisJCQluLS07CisJCX0KKwkJcmV0dXJuIG9yZ19uIC0gbjsKKwl9CisKKwl3aGlsZSAobikgeworCQl3Y2hhcl90IHdjOworCQlzcmMgPSBtYnN0b3djX2ludGVybmFsKCZ3Yywgc3JjKTsKKwkJaWYgKHdjID09IEVSUk9SX1dDSEFSKSAvKiBlcnJvciAqLworCQkJcmV0dXJuIChzaXplX3QpIC0xTDsKKwkJaWYgKGRlc3QpCisJCQkqZGVzdCsrID0gd2M7CisJCWlmICh3YyA9PSAwKSAvKiBlbmQtb2Ytc3RyaW5nICovCisJCQlicmVhazsKKwkJbi0tOworCX0KKworCXJldHVybiBvcmdfbiAtIG47Cit9CisKK2ludCBGQVNUX0ZVTkMgaXN3c3BhY2Uod2ludF90IHdjKQoreworCXJldHVybiAodW5zaWduZWQpd2MgPD0gMHg3ZiAmJiBpc3NwYWNlKHdjKTsKK30KKworaW50IEZBU1RfRlVOQyBpc3dhbG51bSh3aW50X3Qgd2MpCit7CisJcmV0dXJuICh1bnNpZ25lZCl3YyA8PSAweDdmICYmIGlzYWxudW0od2MpOworfQorCitpbnQgRkFTVF9GVU5DIGlzd3B1bmN0KHdpbnRfdCB3YykKK3sKKwlyZXR1cm4gKHVuc2lnbmVkKXdjIDw9IDB4N2YgJiYgaXNwdW5jdCh3Yyk7Cit9CisKKworIyBpZiBDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIgPj0gMHgzMDAKK3N0cnVjdCBpbnRlcnZhbCB7CisJdWludDE2X3QgZmlyc3Q7CisJdWludDE2X3QgbGFzdDsKK307CisKKy8qIGF1eGlsaWFyeSBmdW5jdGlvbiBmb3IgYmluYXJ5IHNlYXJjaCBpbiBpbnRlcnZhbCB0YWJsZSAqLworc3RhdGljIGludCBpbl9pbnRlcnZhbF90YWJsZSh1bnNpZ25lZCB1Y3MsIGNvbnN0IHN0cnVjdCBpbnRlcnZhbCAqdGFibGUsIHVuc2lnbmVkIG1heCkKK3sKKwl1bnNpZ25lZCBtaW47CisJdW5zaWduZWQgbWlkOworCisJaWYgKHVjcyA8IHRhYmxlWzBdLmZpcnN0IHx8IHVjcyA+IHRhYmxlW21heF0ubGFzdCkKKwkJcmV0dXJuIDA7CisKKwltaW4gPSAwOworCXdoaWxlIChtYXggPj0gbWluKSB7CisJCW1pZCA9IChtaW4gKyBtYXgpIC8gMjsKKwkJaWYgKHVjcyA+IHRhYmxlW21pZF0ubGFzdCkKKwkJCW1pbiA9IG1pZCArIDE7CisJCWVsc2UgaWYgKHVjcyA8IHRhYmxlW21pZF0uZmlyc3QpCisJCQltYXggPSBtaWQgLSAxOworCQllbHNlCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaW5fdWludDE2X3RhYmxlKHVuc2lnbmVkIHVjcywgY29uc3QgdWludDE2X3QgKnRhYmxlLCB1bnNpZ25lZCBtYXgpCit7CisJdW5zaWduZWQgbWluOworCXVuc2lnbmVkIG1pZDsKKwl1bnNpZ25lZCBmaXJzdCwgbGFzdDsKKworCWZpcnN0ID0gdGFibGVbMF0gPj4gMjsKKwlsYXN0ID0gZmlyc3QgKyAodGFibGVbMF0gJiAzKTsKKwlpZiAodWNzIDwgZmlyc3QgfHwgdWNzID4gbGFzdCkKKwkJcmV0dXJuIDA7CisKKwltaW4gPSAwOworCXdoaWxlIChtYXggPj0gbWluKSB7CisJCW1pZCA9IChtaW4gKyBtYXgpIC8gMjsKKwkJZmlyc3QgPSB0YWJsZVttaWRdID4+IDI7CisJCWxhc3QgPSBmaXJzdCArICh0YWJsZVttaWRdICYgMyk7CisJCWlmICh1Y3MgPiBsYXN0KQorCQkJbWluID0gbWlkICsgMTsKKwkJZWxzZSBpZiAodWNzIDwgZmlyc3QpCisJCQltYXggPSBtaWQgLSAxOworCQllbHNlCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisjIGVuZGlmCisKKworLyoKKyAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2Ygd2N3aWR0aCgpIGFuZCB3Y3N3aWR0aCgpIChkZWZpbmVkIGluCisgKiBJRUVFIFN0ZCAxMDAyLjEtMjAwMSkgZm9yIFVuaWNvZGUuCisgKgorICogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L2Z1bmN0aW9ucy93Y3dpZHRoLmh0bWwKKyAqIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwNzkwNDk3NS9mdW5jdGlvbnMvd2Nzd2lkdGguaHRtbAorICoKKyAqIEluIGZpeGVkLXdpZHRoIG91dHB1dCBkZXZpY2VzLCBMYXRpbiBjaGFyYWN0ZXJzIGFsbCBvY2N1cHkgYSBzaW5nbGUKKyAqICJjZWxsIiBwb3NpdGlvbiBvZiBlcXVhbCB3aWR0aCwgd2hlcmVhcyBpZGVvZ3JhcGhpYyBDSksgY2hhcmFjdGVycworICogb2NjdXB5IHR3byBzdWNoIGNlbGxzLiBJbnRlcm9wZXJhYmlsaXR5IGJldHdlZW4gdGVybWluYWwtbGluZQorICogYXBwbGljYXRpb25zIGFuZCAodGVsZXR5cGUtc3R5bGUpIGNoYXJhY3RlciB0ZXJtaW5hbHMgdXNpbmcgdGhlCisgKiBVVEYtOCBlbmNvZGluZyByZXF1aXJlcyBhZ3JlZW1lbnQgb24gd2hpY2ggY2hhcmFjdGVyIHNob3VsZCBhZHZhbmNlCisgKiB0aGUgY3Vyc29yIGJ5IGhvdyBtYW55IGNlbGwgcG9zaXRpb25zLiBObyBlc3RhYmxpc2hlZCBmb3JtYWwKKyAqIHN0YW5kYXJkcyBleGlzdCBhdCBwcmVzZW50IG9uIHdoaWNoIFVuaWNvZGUgY2hhcmFjdGVyIHNoYWxsIG9jY3VweQorICogaG93IG1hbnkgY2VsbCBwb3NpdGlvbnMgb24gY2hhcmFjdGVyIHRlcm1pbmFscy4gVGhlc2Ugcm91dGluZXMgYXJlCisgKiBhIGZpcnN0IGF0dGVtcHQgb2YgZGVmaW5pbmcgc3VjaCBiZWhhdmlvciBiYXNlZCBvbiBzaW1wbGUgcnVsZXMKKyAqIGFwcGxpZWQgdG8gZGF0YSBwcm92aWRlZCBieSB0aGUgVW5pY29kZSBDb25zb3J0aXVtLgorICoKKyAqIEZvciBzb21lIGdyYXBoaWNhbCBjaGFyYWN0ZXJzLCB0aGUgVW5pY29kZSBzdGFuZGFyZCBleHBsaWNpdGx5CisgKiBkZWZpbmVzIGEgY2hhcmFjdGVyLWNlbGwgd2lkdGggdmlhIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBFYXN0IEFzaWFuCisgKiBGdWxsV2lkdGggKEYpLCBXaWRlIChXKSwgSGFsZi13aWR0aCAoSCksIGFuZCBOYXJyb3cgKE5hKSBjbGFzc2VzLgorICogSW4gYWxsIHRoZXNlIGNhc2VzLCB0aGVyZSBpcyBubyBhbWJpZ3VpdHkgYWJvdXQgd2hpY2ggd2lkdGggYQorICogdGVybWluYWwgc2hhbGwgdXNlLiBGb3IgY2hhcmFjdGVycyBpbiB0aGUgRWFzdCBBc2lhbiBBbWJpZ3VvdXMgKEEpCisgKiBjbGFzcywgdGhlIHdpZHRoIGNob2ljZSBkZXBlbmRzIHB1cmVseSBvbiBhIHByZWZlcmVuY2Ugb2YgYmFja3dhcmQKKyAqIGNvbXBhdGliaWxpdHkgd2l0aCBlaXRoZXIgaGlzdG9yaWMgQ0pLIG9yIFdlc3Rlcm4gcHJhY3RpY2UuCisgKiBDaG9vc2luZyBzaW5nbGUtd2lkdGggZm9yIHRoZXNlIGNoYXJhY3RlcnMgaXMgZWFzeSB0byBqdXN0aWZ5IGFzCisgKiB0aGUgYXBwcm9wcmlhdGUgbG9uZy10ZXJtIHNvbHV0aW9uLCBhcyB0aGUgQ0pLIHByYWN0aWNlIG9mCisgKiBkaXNwbGF5aW5nIHRoZXNlIGNoYXJhY3RlcnMgYXMgZG91YmxlLXdpZHRoIGNvbWVzIGZyb20gaGlzdG9yaWMKKyAqIGltcGxlbWVudGF0aW9uIHNpbXBsaWNpdHkgKDgtYml0IGVuY29kZWQgY2hhcmFjdGVycyB3ZXJlIGRpc3BsYXllZAorICogc2luZ2xlLXdpZHRoIGFuZCAxNi1iaXQgb25lcyBkb3VibGUtd2lkdGgsIGV2ZW4gZm9yIEdyZWVrLAorICogQ3lyaWxsaWMsIGV0Yy4pIGFuZCBub3QgYW55IHR5cG9ncmFwaGljIGNvbnNpZGVyYXRpb25zLgorICoKKyAqIE11Y2ggbGVzcyBjbGVhciBpcyB0aGUgY2hvaWNlIG9mIHdpZHRoIGZvciB0aGUgTm90IEVhc3QgQXNpYW4KKyAqIChOZXV0cmFsKSBjbGFzcy4gRXhpc3RpbmcgcHJhY3RpY2UgZG9lcyBub3QgZGljdGF0ZSBhIHdpZHRoIGZvciBhbnkKKyAqIG9mIHRoZXNlIGNoYXJhY3RlcnMuIEl0IHdvdWxkIG5ldmVydGhlbGVzcyBtYWtlIHNlbnNlCisgKiB0eXBvZ3JhcGhpY2FsbHkgdG8gYWxsb2NhdGUgdHdvIGNoYXJhY3RlciBjZWxscyB0byBjaGFyYWN0ZXJzIHN1Y2gKKyAqIGFzIGZvciBpbnN0YW5jZSBFTSBTUEFDRSBvciBWT0xVTUUgSU5URUdSQUwsIHdoaWNoIGNhbm5vdCBiZQorICogcmVwcmVzZW50ZWQgYWRlcXVhdGVseSB3aXRoIGEgc2luZ2xlLXdpZHRoIGdseXBoLiBUaGUgZm9sbG93aW5nCisgKiByb3V0aW5lcyBhdCBwcmVzZW50IG1lcmVseSBhc3NpZ24gYSBzaW5nbGUtY2VsbCB3aWR0aCB0byBhbGwKKyAqIG5ldXRyYWwgY2hhcmFjdGVycywgaW4gdGhlIGludGVyZXN0IG9mIHNpbXBsaWNpdHkuIFRoaXMgaXMgbm90CisgKiBlbnRpcmVseSBzYXRpc2ZhY3RvcnkgYW5kIHNob3VsZCBiZSByZWNvbnNpZGVyZWQgYmVmb3JlCisgKiBlc3RhYmxpc2hpbmcgYSBmb3JtYWwgc3RhbmRhcmQgaW4gdGhpcyBhcmVhLiBBdCB0aGUgbW9tZW50LCB0aGUKKyAqIGRlY2lzaW9uIHdoaWNoIE5vdCBFYXN0IEFzaWFuIChOZXV0cmFsKSBjaGFyYWN0ZXJzIHNob3VsZCBiZQorICogcmVwcmVzZW50ZWQgYnkgZG91YmxlLXdpZHRoIGdseXBocyBjYW5ub3QgeWV0IGJlIGFuc3dlcmVkIGJ5CisgKiBhcHBseWluZyBhIHNpbXBsZSBydWxlIGZyb20gdGhlIFVuaWNvZGUgZGF0YWJhc2UgY29udGVudC4gU2V0dGluZworICogdXAgYSBwcm9wZXIgc3RhbmRhcmQgZm9yIHRoZSBiZWhhdmlvciBvZiBVVEYtOCBjaGFyYWN0ZXIgdGVybWluYWxzCisgKiB3aWxsIHJlcXVpcmUgYSBjYXJlZnVsIGFuYWx5c2lzIG5vdCBvbmx5IG9mIGVhY2ggVW5pY29kZSBjaGFyYWN0ZXIsCisgKiBidXQgYWxzbyBvZiBlYWNoIHByZXNlbnRhdGlvbiBmb3JtLCBzb21ldGhpbmcgdGhlIGF1dGhvciBvZiB0aGVzZQorICogcm91dGluZXMgaGFzIGF2b2lkZWQgdG8gZG8gc28gZmFyLgorICoKKyAqIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvdW5pY29kZS9yZXBvcnRzL3RyMTEvCisgKgorICogTWFya3VzIEt1aG4gLS0gMjAwNy0wNS0yNiAoVW5pY29kZSA1LjApCisgKgorICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZQorICogZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC4gVGhlIGF1dGhvcgorICogZGlzY2xhaW1zIGFsbCB3YXJyYW50aWVzIHdpdGggcmVnYXJkIHRvIHRoaXMgc29mdHdhcmUuCisgKgorICogTGF0ZXN0IHZlcnNpb246IGh0dHA6Ly93d3cuY2wuY2FtLmFjLnVrL35tZ2syNS91Y3Mvd2N3aWR0aC5jCisgKi8KKworLyogQXNzaWduZWQgVW5pY29kZSBjaGFyYWN0ZXIgcmFuZ2VzOgorICogUGxhbmUgUmFuZ2UKKyAqIDAgICAgICAgMDAwMOKAk0ZGRkYgICBCYXNpYyBNdWx0aWxpbmd1YWwgUGxhbmUKKyAqIDEgICAgICAxMDAwMOKAkzFGRkZGICBTdXBwbGVtZW50YXJ5IE11bHRpbGluZ3VhbCBQbGFuZQorICogMiAgICAgIDIwMDAw4oCTMkZGRkYgIFN1cHBsZW1lbnRhcnkgSWRlb2dyYXBoaWMgUGxhbmUKKyAqIDMgICAgICAzMDAwMC0zRkZGRiAgVGVydGlhcnkgSWRlb2dyYXBoaWMgUGxhbmUgKG5vIGNoYXJzIGFzc2lnbmVkIHlldCkKKyAqIDQtMTMgICA0MDAwMOKAk0RGRkZGICBjdXJyZW50bHkgdW5hc3NpZ25lZAorICogMTQgICAgIEUwMDAw4oCTRUZGRkYgIFN1cHBsZW1lbnRhcnkgU3BlY2lhbC1wdXJwb3NlIFBsYW5lCisgKiAxNSAgICAgRjAwMDDigJNGRkZGRiAgU3VwcGxlbWVudGFyeSBQcml2YXRlIFVzZSBBcmVhLUEKKyAqIDE2ICAgIDEwMDAwMOKAkzEwRkZGRiBTdXBwbGVtZW50YXJ5IFByaXZhdGUgVXNlIEFyZWEtQgorICoKKyAqICJTdXBwbGVtZW50YXJ5IFNwZWNpYWwtcHVycG9zZSBQbGFuZSBjdXJyZW50bHkgY29udGFpbnMgbm9uLWdyYXBoaWNhbAorICogY2hhcmFjdGVycyBpbiB0d28gYmxvY2tzIG9mIDEyOCBhbmQgMjQwIGNoYXJhY3RlcnMuIFRoZSBmaXJzdCBibG9jaworICogaXMgZm9yIGxhbmd1YWdlIHRhZyBjaGFyYWN0ZXJzIGZvciB1c2Ugd2hlbiBsYW5ndWFnZSBjYW5ub3QgYmUgaW5kaWNhdGVkCisgKiB0aHJvdWdoIG90aGVyIHByb3RvY29scyAoc3VjaCBhcyB0aGUgeG1sOmxhbmcgIGF0dHJpYnV0ZSBpbiBYTUwpLgorICogVGhlIG90aGVyIGJsb2NrIGNvbnRhaW5zIGdseXBoIHZhcmlhdGlvbiBzZWxlY3RvcnMgdG8gaW5kaWNhdGUKKyAqIGFuIGFsdGVybmF0ZSBnbHlwaCBmb3IgYSBjaGFyYWN0ZXIgdGhhdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBieSBjb250ZXh0LiIKKyAqCisgKiBJbiBzaW1wbGVyIHRlcm1zOiBpdCBpcyBhIHRvb2wgdG8gZml4IHRoZSAiSGFuIHVuaWZpY2F0aW9uIiBtZXNzCisgKiBjcmVhdGVkIGJ5IFVuaWNvZGUgY29tbWl0dGVlLCB0byBzZWxlY3QgQ2hpbmVzZS9KYXBhbmVzZS9Lb3JlYW4vVGFpd2FuCisgKiB2ZXJzaW9uIG9mIGEgY2hhcmFjdGVyLiAoVGhleSBmb3Jnb3QgdGhhdCB0aGUgd2hvbGUgcHVycG9zZSBvZiB0aGUgVW5pY29kZQorICogd2FzIHRvIGJlIGFibGUgdG8gd3JpdGUgYWxsIGNoYXJzIGluIG9uZSBjaGFyc2V0IHdpdGhvdXQgc3VjaCB0cmlja3MpLgorICogVW50aWwgRWFzdCBBc2lhbiB1c2VycyBzYXkgaXQgaXMgYWN0dWFsbHkgbmVjZXNzYXJ5IHRvIHN1cHBvcnQgdGhlc2UKKyAqIGNvZGUgcG9pbnRzIGluIGNvbnNvbGUgYXBwbGljYXRpb25zIGxpa2UgYnVzeWJveAorICogKGkuZS4gZG8gdGhlc2UgY2hhcnMgZXZlciBhcHBlYXIgaW4gZmlsZW5hbWVzLCBob3N0bmFtZXMsIHRleHQgZmlsZXMKKyAqIGFuZCBzdWNoPyksIHdlIGFyZSB0cmVhdGluZyB0aGVzZSBjb2RlIHBvaW50cyBhcyBpbnZhbGlkLgorICoKKyAqIFRlcnRpYXJ5IElkZW9ncmFwaGljIFBsYW5lIGlzIGFsc28gaWdub3JlZCBmb3Igbm93LAorICogdW50aWwgVW5pY29kZSBjb21taXR0ZWUgYXNzaWducyBzb21ldGhpbmcgdGhlcmUuCisgKi8KKy8qIFRoZSBmb2xsb3dpbmcgdHdvIGZ1bmN0aW9ucyBkZWZpbmUgdGhlIGNvbHVtbiB3aWR0aCBvZiBhbiBJU08gMTA2NDYKKyAqIGNoYXJhY3RlciBhcyBmb2xsb3dzOgorICoKKyAqICAgIC0gVGhlIG51bGwgY2hhcmFjdGVyIChVKzAwMDApIGhhcyBhIGNvbHVtbiB3aWR0aCBvZiAwLgorICoKKyAqICAgIC0gT3RoZXIgQzAvQzEgY29udHJvbCBjaGFyYWN0ZXJzIGFuZCBERUwgd2lsbCBsZWFkIHRvIGEgcmV0dXJuCisgKiAgICAgIHZhbHVlIG9mIC0xLgorICoKKyAqICAgIC0gTm9uLXNwYWNpbmcgYW5kIGVuY2xvc2luZyBjb21iaW5pbmcgY2hhcmFjdGVycyAoZ2VuZXJhbAorICogICAgICBjYXRlZ29yeSBjb2RlIE1uIG9yIE1lIGluIHRoZSBVbmljb2RlIGRhdGFiYXNlKSBoYXZlIGEKKyAqICAgICAgY29sdW1uIHdpZHRoIG9mIDAuCisgKgorICogICAgLSBTT0ZUIEhZUEhFTiAoVSswMEFEKSBoYXMgYSBjb2x1bW4gd2lkdGggb2YgMS4KKyAqCisgKiAgICAtIE90aGVyIGZvcm1hdCBjaGFyYWN0ZXJzIChnZW5lcmFsIGNhdGVnb3J5IGNvZGUgQ2YgaW4gdGhlIFVuaWNvZGUKKyAqICAgICAgZGF0YWJhc2UpIGFuZCBaRVJPIFdJRFRIIFNQQUNFIChVKzIwMEIpIGhhdmUgYSBjb2x1bW4gd2lkdGggb2YgMC4KKyAqCisgKiAgICAtIEhhbmd1bCBKYW1vIG1lZGlhbCB2b3dlbHMgYW5kIGZpbmFsIGNvbnNvbmFudHMgKFUrMTE2MC1VKzExRkYpCisgKiAgICAgIGhhdmUgYSBjb2x1bW4gd2lkdGggb2YgMC4KKyAqCisgKiAgICAtIFNwYWNpbmcgY2hhcmFjdGVycyBpbiB0aGUgRWFzdCBBc2lhbiBXaWRlIChXKSBvciBFYXN0IEFzaWFuCisgKiAgICAgIEZ1bGwtd2lkdGggKEYpIGNhdGVnb3J5IGFzIGRlZmluZWQgaW4gVW5pY29kZSBUZWNobmljYWwKKyAqICAgICAgUmVwb3J0ICMxMSBoYXZlIGEgY29sdW1uIHdpZHRoIG9mIDIuCisgKgorICogICAgLSBBbGwgcmVtYWluaW5nIGNoYXJhY3RlcnMgKGluY2x1ZGluZyBhbGwgcHJpbnRhYmxlCisgKiAgICAgIElTTyA4ODU5LTEgYW5kIFdHTDQgY2hhcmFjdGVycywgVW5pY29kZSBjb250cm9sIGNoYXJhY3RlcnMsCisgKiAgICAgIGV0Yy4pIGhhdmUgYSBjb2x1bW4gd2lkdGggb2YgMS4KKyAqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhhdCB3Y2hhcl90IGNoYXJhY3RlcnMgYXJlIGVuY29kZWQKKyAqIGluIElTTyAxMDY0Ni4KKyAqLworaW50IEZBU1RfRlVOQyB3Y3dpZHRoKHVuc2lnbmVkIHVjcykKK3sKKyMgaWYgQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSID49IDB4MzAwCisJLyogc29ydGVkIGxpc3Qgb2Ygbm9uLW92ZXJsYXBwaW5nIGludGVydmFscyBvZiBub24tc3BhY2luZyBjaGFyYWN0ZXJzICovCisJLyogZ2VuZXJhdGVkIGJ5ICJ1bmlzZXQgK2NhdD1NZSArY2F0PU1uICtjYXQ9Q2YgLTAwQUQgKzExNjAtMTFGRiArMjAwQiBjIiAqLworIyAgZGVmaW5lIEJJR18oYSxiKSB7IGEsIGIgfSwKKyMgIGRlZmluZSBQQUlSKGEsYikKKyMgIGRlZmluZSBBUlJBWSAvKiBQQUlSIGlmIDwgMHg0MDAwIGFuZCBubyBtb3JlIHRoYW4gNCBjaGFycyBiaWcgKi8gXAorCQlCSUdfKDB4MDMwMCwgMHgwMzZGKSBcCisJCVBBSVIoMHgwNDgzLCAweDA0ODYpIFwKKwkJUEFJUigweDA0ODgsIDB4MDQ4OSkgXAorCQlCSUdfKDB4MDU5MSwgMHgwNUJEKSBcCisJCVBBSVIoMHgwNUJGLCAweDA1QkYpIFwKKwkJUEFJUigweDA1QzEsIDB4MDVDMikgXAorCQlQQUlSKDB4MDVDNCwgMHgwNUM1KSBcCisJCVBBSVIoMHgwNUM3LCAweDA1QzcpIFwKKwkJUEFJUigweDA2MDAsIDB4MDYwMykgXAorCQlCSUdfKDB4MDYxMCwgMHgwNjE1KSBcCisJCUJJR18oMHgwNjRCLCAweDA2NUUpIFwKKwkJUEFJUigweDA2NzAsIDB4MDY3MCkgXAorCQlCSUdfKDB4MDZENiwgMHgwNkU0KSBcCisJCVBBSVIoMHgwNkU3LCAweDA2RTgpIFwKKwkJUEFJUigweDA2RUEsIDB4MDZFRCkgXAorCQlQQUlSKDB4MDcwRiwgMHgwNzBGKSBcCisJCVBBSVIoMHgwNzExLCAweDA3MTEpIFwKKwkJQklHXygweDA3MzAsIDB4MDc0QSkgXAorCQlCSUdfKDB4MDdBNiwgMHgwN0IwKSBcCisJCUJJR18oMHgwN0VCLCAweDA3RjMpIFwKKwkJUEFJUigweDA5MDEsIDB4MDkwMikgXAorCQlQQUlSKDB4MDkzQywgMHgwOTNDKSBcCisJCUJJR18oMHgwOTQxLCAweDA5NDgpIFwKKwkJUEFJUigweDA5NEQsIDB4MDk0RCkgXAorCQlQQUlSKDB4MDk1MSwgMHgwOTU0KSBcCisJCVBBSVIoMHgwOTYyLCAweDA5NjMpIFwKKwkJUEFJUigweDA5ODEsIDB4MDk4MSkgXAorCQlQQUlSKDB4MDlCQywgMHgwOUJDKSBcCisJCVBBSVIoMHgwOUMxLCAweDA5QzQpIFwKKwkJUEFJUigweDA5Q0QsIDB4MDlDRCkgXAorCQlQQUlSKDB4MDlFMiwgMHgwOUUzKSBcCisJCVBBSVIoMHgwQTAxLCAweDBBMDIpIFwKKwkJUEFJUigweDBBM0MsIDB4MEEzQykgXAorCQlQQUlSKDB4MEE0MSwgMHgwQTQyKSBcCisJCVBBSVIoMHgwQTQ3LCAweDBBNDgpIFwKKwkJUEFJUigweDBBNEIsIDB4MEE0RCkgXAorCQlQQUlSKDB4MEE3MCwgMHgwQTcxKSBcCisJCVBBSVIoMHgwQTgxLCAweDBBODIpIFwKKwkJUEFJUigweDBBQkMsIDB4MEFCQykgXAorCQlCSUdfKDB4MEFDMSwgMHgwQUM1KSBcCisJCVBBSVIoMHgwQUM3LCAweDBBQzgpIFwKKwkJUEFJUigweDBBQ0QsIDB4MEFDRCkgXAorCQlQQUlSKDB4MEFFMiwgMHgwQUUzKSBcCisJCVBBSVIoMHgwQjAxLCAweDBCMDEpIFwKKwkJUEFJUigweDBCM0MsIDB4MEIzQykgXAorCQlQQUlSKDB4MEIzRiwgMHgwQjNGKSBcCisJCVBBSVIoMHgwQjQxLCAweDBCNDMpIFwKKwkJUEFJUigweDBCNEQsIDB4MEI0RCkgXAorCQlQQUlSKDB4MEI1NiwgMHgwQjU2KSBcCisJCVBBSVIoMHgwQjgyLCAweDBCODIpIFwKKwkJUEFJUigweDBCQzAsIDB4MEJDMCkgXAorCQlQQUlSKDB4MEJDRCwgMHgwQkNEKSBcCisJCVBBSVIoMHgwQzNFLCAweDBDNDApIFwKKwkJUEFJUigweDBDNDYsIDB4MEM0OCkgXAorCQlQQUlSKDB4MEM0QSwgMHgwQzREKSBcCisJCVBBSVIoMHgwQzU1LCAweDBDNTYpIFwKKwkJUEFJUigweDBDQkMsIDB4MENCQykgXAorCQlQQUlSKDB4MENCRiwgMHgwQ0JGKSBcCisJCVBBSVIoMHgwQ0M2LCAweDBDQzYpIFwKKwkJUEFJUigweDBDQ0MsIDB4MENDRCkgXAorCQlQQUlSKDB4MENFMiwgMHgwQ0UzKSBcCisJCVBBSVIoMHgwRDQxLCAweDBENDMpIFwKKwkJUEFJUigweDBENEQsIDB4MEQ0RCkgXAorCQlQQUlSKDB4MERDQSwgMHgwRENBKSBcCisJCVBBSVIoMHgwREQyLCAweDBERDQpIFwKKwkJUEFJUigweDBERDYsIDB4MERENikgXAorCQlQQUlSKDB4MEUzMSwgMHgwRTMxKSBcCisJCUJJR18oMHgwRTM0LCAweDBFM0EpIFwKKwkJQklHXygweDBFNDcsIDB4MEU0RSkgXAorCQlQQUlSKDB4MEVCMSwgMHgwRUIxKSBcCisJCUJJR18oMHgwRUI0LCAweDBFQjkpIFwKKwkJUEFJUigweDBFQkIsIDB4MEVCQykgXAorCQlCSUdfKDB4MEVDOCwgMHgwRUNEKSBcCisJCVBBSVIoMHgwRjE4LCAweDBGMTkpIFwKKwkJUEFJUigweDBGMzUsIDB4MEYzNSkgXAorCQlQQUlSKDB4MEYzNywgMHgwRjM3KSBcCisJCVBBSVIoMHgwRjM5LCAweDBGMzkpIFwKKwkJQklHXygweDBGNzEsIDB4MEY3RSkgXAorCQlCSUdfKDB4MEY4MCwgMHgwRjg0KSBcCisJCVBBSVIoMHgwRjg2LCAweDBGODcpIFwKKwkJUEFJUigweDBGQzYsIDB4MEZDNikgXAorCQlCSUdfKDB4MEY5MCwgMHgwRjk3KSBcCisJCUJJR18oMHgwRjk5LCAweDBGQkMpIFwKKwkJUEFJUigweDEwMkQsIDB4MTAzMCkgXAorCQlQQUlSKDB4MTAzMiwgMHgxMDMyKSBcCisJCVBBSVIoMHgxMDM2LCAweDEwMzcpIFwKKwkJUEFJUigweDEwMzksIDB4MTAzOSkgXAorCQlQQUlSKDB4MTA1OCwgMHgxMDU5KSBcCisJCUJJR18oMHgxMTYwLCAweDExRkYpIFwKKwkJUEFJUigweDEzNUYsIDB4MTM1RikgXAorCQlQQUlSKDB4MTcxMiwgMHgxNzE0KSBcCisJCVBBSVIoMHgxNzMyLCAweDE3MzQpIFwKKwkJUEFJUigweDE3NTIsIDB4MTc1MykgXAorCQlQQUlSKDB4MTc3MiwgMHgxNzczKSBcCisJCVBBSVIoMHgxN0I0LCAweDE3QjUpIFwKKwkJQklHXygweDE3QjcsIDB4MTdCRCkgXAorCQlQQUlSKDB4MTdDNiwgMHgxN0M2KSBcCisJCUJJR18oMHgxN0M5LCAweDE3RDMpIFwKKwkJUEFJUigweDE3REQsIDB4MTdERCkgXAorCQlQQUlSKDB4MTgwQiwgMHgxODBEKSBcCisJCVBBSVIoMHgxOEE5LCAweDE4QTkpIFwKKwkJUEFJUigweDE5MjAsIDB4MTkyMikgXAorCQlQQUlSKDB4MTkyNywgMHgxOTI4KSBcCisJCVBBSVIoMHgxOTMyLCAweDE5MzIpIFwKKwkJUEFJUigweDE5MzksIDB4MTkzQikgXAorCQlQQUlSKDB4MUExNywgMHgxQTE4KSBcCisJCVBBSVIoMHgxQjAwLCAweDFCMDMpIFwKKwkJUEFJUigweDFCMzQsIDB4MUIzNCkgXAorCQlCSUdfKDB4MUIzNiwgMHgxQjNBKSBcCisJCVBBSVIoMHgxQjNDLCAweDFCM0MpIFwKKwkJUEFJUigweDFCNDIsIDB4MUI0MikgXAorCQlCSUdfKDB4MUI2QiwgMHgxQjczKSBcCisJCUJJR18oMHgxREMwLCAweDFEQ0EpIFwKKwkJUEFJUigweDFERkUsIDB4MURGRikgXAorCQlCSUdfKDB4MjAwQiwgMHgyMDBGKSBcCisJCUJJR18oMHgyMDJBLCAweDIwMkUpIFwKKwkJUEFJUigweDIwNjAsIDB4MjA2MykgXAorCQlCSUdfKDB4MjA2QSwgMHgyMDZGKSBcCisJCUJJR18oMHgyMEQwLCAweDIwRUYpIFwKKwkJQklHXygweDMwMkEsIDB4MzAyRikgXAorCQlQQUlSKDB4MzA5OSwgMHgzMDlBKSBcCisJCS8qIFRvbyBiaWcgdG8gYmUgcGFja2VkIGluIFBBSVJzOiAqLyBcCisJCUJJR18oMHhBODA2LCAweEE4MDYpIFwKKwkJQklHXygweEE4MEIsIDB4QTgwQikgXAorCQlCSUdfKDB4QTgyNSwgMHhBODI2KSBcCisJCUJJR18oMHhGQjFFLCAweEZCMUUpIFwKKwkJQklHXygweEZFMDAsIDB4RkUwRikgXAorCQlCSUdfKDB4RkUyMCwgMHhGRTIzKSBcCisJCUJJR18oMHhGRUZGLCAweEZFRkYpIFwKKwkJQklHXygweEZGRjksIDB4RkZGQikKKwlzdGF0aWMgY29uc3Qgc3RydWN0IGludGVydmFsIGNvbWJpbmluZ1tdID0geyBBUlJBWSB9OworIyAgdW5kZWYgQklHXworIyAgdW5kZWYgUEFJUgorIyAgZGVmaW5lIEJJR18oYSxiKQorIyAgZGVmaW5lIFBBSVIoYSxiKSAoYSA8PCAyKSB8IChiLWEpLAorCXN0YXRpYyBjb25zdCB1aW50MTZfdCBjb21iaW5pbmcxW10gPSB7IEFSUkFZIH07CisjICB1bmRlZiBCSUdfCisjICB1bmRlZiBQQUlSCisjICBkZWZpbmUgQklHXyhhLGIpIGNoYXIgYmlnXyMjYVtiIDwgMHg0MDAwICYmIGItYSA8PSAzID8gLTEgOiAxXTsKKyMgIGRlZmluZSBQQUlSKGEsYikgY2hhciBwYWlyIyNhW2IgPj0gMHg0MDAwIHx8IGItYSA+IDMgPyAtMSA6IDFdOworCXN0cnVjdCBDSEVDSyB7IEFSUkFZIH07CisjICB1bmRlZiBCSUdfCisjICB1bmRlZiBQQUlSCisjICB1bmRlZiBBUlJBWQorIyBlbmRpZgorCisJaWYgKHVjcyA9PSAwKQorCQlyZXR1cm4gMDsKKworCS8qIFRlc3QgZm9yIDgtYml0IGNvbnRyb2wgY2hhcmFjdGVycyAoMDAtMWYsIDgwLTlmLCA3ZikgKi8KKwlpZiAoKHVjcyAmIH4weDgwKSA8IDB4MjAgfHwgdWNzID09IDB4N2YpCisJCXJldHVybiAtMTsKKwkvKiBRdWljayBhYm9ydCBpZiBpdCBpcyBhbiBvYnZpb3VzbHkgaW52YWxpZCBjaGFyICovCisJaWYgKHVjcyA+IENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUikKKwkJcmV0dXJuIC0xOworCisJLyogT3B0aW1pemF0aW9uOiBubyBjb21iaW5pbmcgY2hhcnMgYmVsb3cgMHgzMDAgKi8KKwlpZiAoQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSIDwgMHgzMDAgfHwgdWNzIDwgMHgzMDApCisJCXJldHVybiAxOworCisjIGlmIENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiA+PSAweDMwMAorCS8qIEJpbmFyeSBzZWFyY2ggaW4gdGFibGUgb2Ygbm9uLXNwYWNpbmcgY2hhcmFjdGVycyAqLworCWlmIChpbl9pbnRlcnZhbF90YWJsZSh1Y3MsIGNvbWJpbmluZywgQVJSQVlfU0laRShjb21iaW5pbmcpIC0gMSkpCisJCXJldHVybiAwOworCWlmIChpbl91aW50MTZfdGFibGUodWNzLCBjb21iaW5pbmcxLCBBUlJBWV9TSVpFKGNvbWJpbmluZzEpIC0gMSkpCisJCXJldHVybiAwOworCisJLyogT3B0aW1pemF0aW9uOiBhbGwgY2hhcnMgYmVsb3cgMHgxMTAwIGFyZSBub3QgZG91YmxlLXdpZHRoICovCisJaWYgKENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiA8IDB4MTEwMCB8fCB1Y3MgPCAweDExMDApCisJCXJldHVybiAxOworCisjICBpZiBDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIgPj0gMHgxMTAwCisJLyogSW52YWxpZCBjb2RlIHBvaW50czogKi8KKwkvKiBIaWdoIChkODAwLi5kYmZmKSBhbmQgbG93IChkYzAwLi5kZmZmKSBzdXJyb2dhdGVzICh2YWxpZCBvbmx5IGluIFVURjE2KSAqLworCS8qIFByaXZhdGUgVXNlIEFyZWEgKGUwMDAuLmY4ZmYpICovCisJLyogTm9uY2hhcmFjdGVycyBmZGQwLi5mZGVmICovCisJaWYgKChDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIgPj0gMHhkODAwICYmIHVjcyA+PSAweGQ4MDAgJiYgdWNzIDw9IDB4ZjhmZikKKwkgfHwgKENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiA+PSAweGZkZDAgJiYgdWNzID49IDB4ZmRkMCAmJiB1Y3MgPD0gMHhmZGVmKQorCSkgeworCQlyZXR1cm4gLTE7CisJfQorCS8qIDB4ZmZmZSBhbmQgMHhmZmZmIGluIGV2ZXJ5IHBsYW5lIGFyZSBpbnZhbGlkICovCisJaWYgKENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiA+PSAweGZmZmUgJiYgKCh1Y3MgJiAweGZmZmUpID09IDB4ZmZmZSkpIHsKKwkJcmV0dXJuIC0xOworCX0KKworIyAgIGlmIENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiA+PSAweDEwMDAwCisJaWYgKHVjcyA+PSAweDEwMDAwKSB7CisJCS8qIENvbWJpbmluZyBjaGFycyBpbiBTdXBwbGVtZW50YXJ5IE11bHRpbGluZ3VhbCBQbGFuZSAweDF4eHh4ICovCisJCXN0YXRpYyBjb25zdCBzdHJ1Y3QgaW50ZXJ2YWwgY29tYmluaW5nMHgxMDAwMFtdID0geworCQkJeyAweDBBMDEsIDB4MEEwMyB9LCB7IDB4MEEwNSwgMHgwQTA2IH0sIHsgMHgwQTBDLCAweDBBMEYgfSwKKwkJCXsgMHgwQTM4LCAweDBBM0EgfSwgeyAweDBBM0YsIDB4MEEzRiB9LCB7IDB4RDE2NywgMHhEMTY5IH0sCisJCQl7IDB4RDE3MywgMHhEMTgyIH0sIHsgMHhEMTg1LCAweEQxOEIgfSwgeyAweEQxQUEsIDB4RDFBRCB9LAorCQkJeyAweEQyNDIsIDB4RDI0NCB9CisJCX07CisJCS8qIEJpbmFyeSBzZWFyY2ggaW4gdGFibGUgb2Ygbm9uLXNwYWNpbmcgY2hhcmFjdGVycyBpbiBTdXBwbGVtZW50YXJ5IE11bHRpbGluZ3VhbCBQbGFuZSAqLworCQlpZiAoaW5faW50ZXJ2YWxfdGFibGUodWNzIF4gMHgxMDAwMCwgY29tYmluaW5nMHgxMDAwMCwgQVJSQVlfU0laRShjb21iaW5pbmcweDEwMDAwKSAtIDEpKQorCQkJcmV0dXJuIDA7CisJCS8qIENoZWNrIGEgZmV3IG5vbi1zcGFjaW5nIGNoYXJzIGluIFN1cHBsZW1lbnRhcnkgU3BlY2lhbC1wdXJwb3NlIFBsYW5lIDB4RXh4eHggKi8KKwkJaWYgKENPTkZJR19MQVNUX1NVUFBPUlRFRF9XQ0hBUiA+PSAweEUwMDAxCisJCSAmJiAoICB1Y3MgPT0gMHhFMDAwMQorCQkgICAgfHwgKHVjcyA+PSAweEUwMDIwICYmIHVjcyA8PSAweEUwMDdGKQorCQkgICAgfHwgKHVjcyA+PSAweEUwMTAwICYmIHVjcyA8PSAweEUwMUVGKQorCQkgICAgKQorCQkpIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorIyAgIGVuZGlmCisKKwkvKiBJZiB3ZSBhcnJpdmUgaGVyZSwgdWNzIGlzIG5vdCBhIGNvbWJpbmluZyBvciBDMC9DMSBjb250cm9sIGNoYXJhY3Rlci4KKwkgKiBDaGVjayB3aGV0aGVyIGl0J3MgMSBjaGFyIG9yIDItc2hhciB3aWRlLgorCSAqLworCXJldHVybiAxICsKKwkJKCAgKC8qdWNzID49IDB4MTEwMCAmJiovIHVjcyA8PSAweDExNWYpIC8qIEhhbmd1bCBKYW1vIGluaXQuIGNvbnNvbmFudHMgKi8KKwkJfHwgdWNzID09IDB4MjMyOSAvKiBsZWZ0LXBvaW50aW5nIGFuZ2xlIGJyYWNrZXQ7IGFsc28gQ0pLIHB1bmN0LiBjaGFyICovCisJCXx8IHVjcyA9PSAweDIzMmEgLyogcmlnaHQtcG9pbnRpbmcgYW5nbGUgYnJhY2tldDsgYWxzbyBDSksgcHVuY3QuIGNoYXIgKi8KKwkJfHwgKHVjcyA+PSAweDJlODAgJiYgdWNzIDw9IDB4YTRjZiAmJiB1Y3MgIT0gMHgzMDNmKSAvKiBDSksgLi4uIFlpICovCisjICAgaWYgQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSID49IDB4YWMwMAorCQl8fCAodWNzID49IDB4YWMwMCAmJiB1Y3MgPD0gMHhkN2EzKSAvKiBIYW5ndWwgU3lsbGFibGVzICovCisJCXx8ICh1Y3MgPj0gMHhmOTAwICYmIHVjcyA8PSAweGZhZmYpIC8qIENKSyBDb21wYXRpYmlsaXR5IElkZW9ncmFwaHMgKi8KKwkJfHwgKHVjcyA+PSAweGZlMTAgJiYgdWNzIDw9IDB4ZmUxOSkgLyogVmVydGljYWwgZm9ybXMgKi8KKwkJfHwgKHVjcyA+PSAweGZlMzAgJiYgdWNzIDw9IDB4ZmU2ZikgLyogQ0pLIENvbXBhdGliaWxpdHkgRm9ybXMgKi8KKwkJfHwgKHVjcyA+PSAweGZmMDAgJiYgdWNzIDw9IDB4ZmY2MCkgLyogRnVsbHdpZHRoIEZvcm1zICovCisJCXx8ICh1Y3MgPj0gMHhmZmUwICYmIHVjcyA8PSAweGZmZTYpCisJCXx8ICgodWNzID4+IDE3KSA9PSAoMiA+PiAxKSkgLyogMjAwMDAuLjNmZmZmOiBTdXBwbGVtZW50YXJ5IGFuZCBUZXJ0aWFyeSBJZGVvZ3JhcGhpYyBQbGFuZXMgKi8KKyMgICBlbmRpZgorCQkpOworIyAgZW5kaWYgLyogPj0gMHgxMTAwICovCisjIGVuZGlmIC8qID49IDB4MzAwICovCit9CisKKworIyBpZiBFTkFCTEVfVU5JQ09ERV9CSURJX1NVUFBPUlQKK2ludCBGQVNUX0ZVTkMgdW5pY29kZV9iaWRpX2lzcnRsKHdpbnRfdCB3YykKK3sKKwkvKiByYW5nZXMgdGFrZW4gZnJvbQorCSAqIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljLzUuMi4wL3VjZC9leHRyYWN0ZWQvRGVyaXZlZEJpZGlDbGFzcy50eHQKKwkgKiBCaWRpX0NsYXNzPUxlZnRfVG9fUmlnaHQgfCBCaWRpX0NsYXNzPUFyYWJpY19MZXR0ZXIKKwkgKi8KKyMgIGRlZmluZSBCSUdfKGEsYikgeyBhLCBiIH0sCisjICBkZWZpbmUgUEFJUihhLGIpCisjICBkZWZpbmUgQVJSQVkgXAorCQlQQUlSKDB4MDU5MCwgMHgwNTkwKSBcCisJCVBBSVIoMHgwNUJFLCAweDA1QkUpIFwKKwkJUEFJUigweDA1QzAsIDB4MDVDMCkgXAorCQlQQUlSKDB4MDVDMywgMHgwNUMzKSBcCisJCVBBSVIoMHgwNUM2LCAweDA1QzYpIFwKKwkJQklHXygweDA1QzgsIDB4MDVGRikgXAorCQlQQUlSKDB4MDYwNCwgMHgwNjA1KSBcCisJCVBBSVIoMHgwNjA4LCAweDA2MDgpIFwKKwkJUEFJUigweDA2MEIsIDB4MDYwQikgXAorCQlQQUlSKDB4MDYwRCwgMHgwNjBEKSBcCisJCUJJR18oMHgwNjFCLCAweDA2NEEpIFwKKwkJUEFJUigweDA2NUYsIDB4MDY1RikgXAorCQlQQUlSKDB4MDY2RCwgMHgwNjZGKSBcCisJCUJJR18oMHgwNjcxLCAweDA2RDUpIFwKKwkJUEFJUigweDA2RTUsIDB4MDZFNikgXAorCQlQQUlSKDB4MDZFRSwgMHgwNkVGKSBcCisJCUJJR18oMHgwNkZBLCAweDA3MEUpIFwKKwkJUEFJUigweDA3MTAsIDB4MDcxMCkgXAorCQlCSUdfKDB4MDcxMiwgMHgwNzJGKSBcCisJCUJJR18oMHgwNzRCLCAweDA3QTUpIFwKKwkJQklHXygweDA3QjEsIDB4MDdFQSkgXAorCQlQQUlSKDB4MDdGNCwgMHgwN0Y1KSBcCisJCUJJR18oMHgwN0ZBLCAweDA4MTUpIFwKKwkJUEFJUigweDA4MUEsIDB4MDgxQSkgXAorCQlQQUlSKDB4MDgyNCwgMHgwODI0KSBcCisJCVBBSVIoMHgwODI4LCAweDA4MjgpIFwKKwkJQklHXygweDA4MkUsIDB4MDhGRikgXAorCQlQQUlSKDB4MjAwRiwgMHgyMDBGKSBcCisJCVBBSVIoMHgyMDJCLCAweDIwMkIpIFwKKwkJUEFJUigweDIwMkUsIDB4MjAyRSkgXAorCQlCSUdfKDB4RkIxRCwgMHhGQjFEKSBcCisJCUJJR18oMHhGQjFGLCAweEZCMjgpIFwKKwkJQklHXygweEZCMkEsIDB4RkQzRCkgXAorCQlCSUdfKDB4RkQ0MCwgMHhGRENGKSBcCisJCUJJR18oMHhGREM4LCAweEZEQ0YpIFwKKwkJQklHXygweEZERjAsIDB4RkRGQykgXAorCQlCSUdfKDB4RkRGRSwgMHhGREZGKSBcCisJCUJJR18oMHhGRTcwLCAweEZFRkUpCisJCS8qIFByb2JhYmx5IG5vdCBuZWNlc3NhcnkKKwkJezB4MTA4MDAsIDB4MTA5MUV9LAorCQl7MHgxMDkyMCwgMHgxMEEwMH0sCisJCXsweDEwQTA0LCAweDEwQTA0fSwKKwkJezB4MTBBMDcsIDB4MTBBMEJ9LAorCQl7MHgxMEExMCwgMHgxMEEzN30sCisJCXsweDEwQTNCLCAweDEwQTNFfSwKKwkJezB4MTBBNDAsIDB4MTBBN0Z9LAorCQl7MHgxMEIzNiwgMHgxMEIzOH0sCisJCXsweDEwQjQwLCAweDEwRTVGfSwKKwkJezB4MTBFN0YsIDB4MTBGRkZ9LAorCQl7MHgxRTgwMCwgMHgxRUZGRn0KKwkJKi8KKwlzdGF0aWMgY29uc3Qgc3RydWN0IGludGVydmFsIHJ0bF9iW10gPSB7IEFSUkFZIH07CisjICB1bmRlZiBCSUdfCisjICB1bmRlZiBQQUlSCisjICBkZWZpbmUgQklHXyhhLGIpCisjICBkZWZpbmUgUEFJUihhLGIpIChhIDw8IDIpIHwgKGItYSksCisJc3RhdGljIGNvbnN0IHVpbnQxNl90IHJ0bF9wW10gPSB7IEFSUkFZIH07CisjICB1bmRlZiBCSUdfCisjICB1bmRlZiBQQUlSCisjICBkZWZpbmUgQklHXyhhLGIpIGNoYXIgYmlnXyMjYVtiIDwgMHg0MDAwICYmIGItYSA8PSAzID8gLTEgOiAxXTsKKyMgIGRlZmluZSBQQUlSKGEsYikgY2hhciBwYWlyIyNhW2IgPj0gMHg0MDAwIHx8IGItYSA+IDMgPyAtMSA6IDFdOworCXN0cnVjdCBDSEVDSyB7IEFSUkFZIH07CisjICB1bmRlZiBCSUdfCisjICB1bmRlZiBQQUlSCisjICB1bmRlZiBBUlJBWQorCisJaWYgKGluX2ludGVydmFsX3RhYmxlKHdjLCBydGxfYiwgQVJSQVlfU0laRShydGxfYikgLSAxKSkKKwkJcmV0dXJuIDE7CisJaWYgKGluX3VpbnQxNl90YWJsZSh3YywgcnRsX3AsIEFSUkFZX1NJWkUocnRsX3ApIC0gMSkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisjICBpZiBFTkFCTEVfVU5JQ09ERV9ORVVUUkFMX1RBQkxFCitpbnQgRkFTVF9GVU5DIHVuaWNvZGVfYmlkaV9pc19uZXV0cmFsX3djaGFyKHdpbnRfdCB3YykKK3sKKwkvKiByYW5nZXMgdGFrZW4gZnJvbQorCSAqIGh0dHA6Ly93d3cudW5pY29kZS5vcmcvUHVibGljLzUuMi4wL3VjZC9leHRyYWN0ZWQvRGVyaXZlZEJpZGlDbGFzcy50eHQKKwkgKiBCaWRpX0NsYXNzZXM6IFBhcmFncmFwaF9TZXBhcmF0b3IsIFNlZ21lbnRfU2VwYXJhdG9yLAorCSAqIFdoaXRlX1NwYWNlLCBPdGhlcl9OZXV0cmFsLCBFdXJvcGVhbl9OdW1iZXIsIEV1cm9wZWFuX1NlcGFyYXRvciwKKwkgKiBFdXJvcGVhbl9UZXJtaW5hdG9yLCBBcmFiaWNfTnVtYmVyLCBDb21tb25fU2VwYXJhdG9yCisJICovCisjICBkZWZpbmUgQklHXyhhLGIpIHsgYSwgYiB9LAorIyAgZGVmaW5lIFBBSVIoYSxiKQorIyAgZGVmaW5lIEFSUkFZIFwKKwkJQklHXygweDAwMDksIDB4MDAwRCkgXAorCQlCSUdfKDB4MDAxQywgMHgwMDQwKSBcCisJCUJJR18oMHgwMDVCLCAweDAwNjApIFwKKwkJUEFJUigweDAwN0IsIDB4MDA3RSkgXAorCQlQQUlSKDB4MDA4NSwgMHgwMDg1KSBcCisJCUJJR18oMHgwMEEwLCAweDAwQTkpIFwKKwkJUEFJUigweDAwQUIsIDB4MDBBQykgXAorCQlCSUdfKDB4MDBBRSwgMHgwMEI0KSBcCisJCVBBSVIoMHgwMEI2LCAweDAwQjkpIFwKKwkJQklHXygweDAwQkIsIDB4MDBCRikgXAorCQlQQUlSKDB4MDBENywgMHgwMEQ3KSBcCisJCVBBSVIoMHgwMEY3LCAweDAwRjcpIFwKKwkJUEFJUigweDAyQjksIDB4MDJCQSkgXAorCQlCSUdfKDB4MDJDMiwgMHgwMkNGKSBcCisJCUJJR18oMHgwMkQyLCAweDAyREYpIFwKKwkJQklHXygweDAyRTUsIDB4MDJGRikgXAorCQlQQUlSKDB4MDM3NCwgMHgwMzc1KSBcCisJCVBBSVIoMHgwMzdFLCAweDAzN0UpIFwKKwkJUEFJUigweDAzODQsIDB4MDM4NSkgXAorCQlQQUlSKDB4MDM4NywgMHgwMzg3KSBcCisJCVBBSVIoMHgwM0Y2LCAweDAzRjYpIFwKKwkJUEFJUigweDA1OEEsIDB4MDU4QSkgXAorCQlQQUlSKDB4MDYwMCwgMHgwNjAzKSBcCisJCVBBSVIoMHgwNjA2LCAweDA2MDcpIFwKKwkJUEFJUigweDA2MDksIDB4MDYwQSkgXAorCQlQQUlSKDB4MDYwQywgMHgwNjBDKSBcCisJCVBBSVIoMHgwNjBFLCAweDA2MEYpIFwKKwkJQklHXygweDA2NjAsIDB4MDY2QykgXAorCQlQQUlSKDB4MDZERCwgMHgwNkREKSBcCisJCVBBSVIoMHgwNkU5LCAweDA2RTkpIFwKKwkJQklHXygweDA2RjAsIDB4MDZGOSkgXAorCQlQQUlSKDB4MDdGNiwgMHgwN0Y5KSBcCisJCVBBSVIoMHgwOUYyLCAweDA5RjMpIFwKKwkJUEFJUigweDA5RkIsIDB4MDlGQikgXAorCQlQQUlSKDB4MEFGMSwgMHgwQUYxKSBcCisJCUJJR18oMHgwQkYzLCAweDBCRkEpIFwKKwkJQklHXygweDBDNzgsIDB4MEM3RSkgXAorCQlQQUlSKDB4MENGMSwgMHgwQ0YyKSBcCisJCVBBSVIoMHgwRTNGLCAweDBFM0YpIFwKKwkJUEFJUigweDBGM0EsIDB4MEYzRCkgXAorCQlCSUdfKDB4MTM5MCwgMHgxNDAwKSBcCisJCVBBSVIoMHgxNjgwLCAweDE2ODApIFwKKwkJUEFJUigweDE2OUIsIDB4MTY5QykgXAorCQlQQUlSKDB4MTdEQiwgMHgxN0RCKSBcCisJCUJJR18oMHgxN0YwLCAweDE3RjkpIFwKKwkJQklHXygweDE4MDAsIDB4MTgwQSkgXAorCQlQQUlSKDB4MTgwRSwgMHgxODBFKSBcCisJCVBBSVIoMHgxOTQwLCAweDE5NDApIFwKKwkJUEFJUigweDE5NDQsIDB4MTk0NSkgXAorCQlCSUdfKDB4MTlERSwgMHgxOUZGKSBcCisJCVBBSVIoMHgxRkJELCAweDFGQkQpIFwKKwkJUEFJUigweDFGQkYsIDB4MUZDMSkgXAorCQlQQUlSKDB4MUZDRCwgMHgxRkNGKSBcCisJCVBBSVIoMHgxRkRELCAweDFGREYpIFwKKwkJUEFJUigweDFGRUQsIDB4MUZFRikgXAorCQlQQUlSKDB4MUZGRCwgMHgxRkZFKSBcCisJCUJJR18oMHgyMDAwLCAweDIwMEEpIFwKKwkJQklHXygweDIwMTAsIDB4MjAyOSkgXAorCQlCSUdfKDB4MjAyRiwgMHgyMDVGKSBcCisJCVBBSVIoMHgyMDcwLCAweDIwNzApIFwKKwkJQklHXygweDIwNzQsIDB4MjA3RSkgXAorCQlCSUdfKDB4MjA4MCwgMHgyMDhFKSBcCisJCUJJR18oMHgyMEEwLCAweDIwQjgpIFwKKwkJUEFJUigweDIxMDAsIDB4MjEwMSkgXAorCQlQQUlSKDB4MjEwMywgMHgyMTA2KSBcCisJCVBBSVIoMHgyMTA4LCAweDIxMDkpIFwKKwkJUEFJUigweDIxMTQsIDB4MjExNCkgXAorCQlQQUlSKDB4MjExNiwgMHgyMTE4KSBcCisJCUJJR18oMHgyMTFFLCAweDIxMjMpIFwKKwkJUEFJUigweDIxMjUsIDB4MjEyNSkgXAorCQlQQUlSKDB4MjEyNywgMHgyMTI3KSBcCisJCVBBSVIoMHgyMTI5LCAweDIxMjkpIFwKKwkJUEFJUigweDIxMkUsIDB4MjEyRSkgXAorCQlQQUlSKDB4MjEzQSwgMHgyMTNCKSBcCisJCUJJR18oMHgyMTQwLCAweDIxNDQpIFwKKwkJUEFJUigweDIxNEEsIDB4MjE0RCkgXAorCQlCSUdfKDB4MjE1MCwgMHgyMTVGKSBcCisJCVBBSVIoMHgyMTg5LCAweDIxODkpIFwKKwkJQklHXygweDIxOTAsIDB4MjMzNSkgXAorCQlCSUdfKDB4MjM3QiwgMHgyMzk0KSBcCisJCUJJR18oMHgyMzk2LCAweDIzRTgpIFwKKwkJQklHXygweDI0MDAsIDB4MjQyNikgXAorCQlCSUdfKDB4MjQ0MCwgMHgyNDRBKSBcCisJCUJJR18oMHgyNDYwLCAweDI0OUIpIFwKKwkJQklHXygweDI0RUEsIDB4MjZBQikgXAorCQlCSUdfKDB4MjZBRCwgMHgyNkNEKSBcCisJCUJJR18oMHgyNkNGLCAweDI2RTEpIFwKKwkJUEFJUigweDI2RTMsIDB4MjZFMykgXAorCQlCSUdfKDB4MjZFOCwgMHgyNkZGKSBcCisJCVBBSVIoMHgyNzAxLCAweDI3MDQpIFwKKwkJUEFJUigweDI3MDYsIDB4MjcwOSkgXAorCQlCSUdfKDB4MjcwQywgMHgyNzI3KSBcCisJCUJJR18oMHgyNzI5LCAweDI3NEIpIFwKKwkJUEFJUigweDI3NEQsIDB4Mjc0RCkgXAorCQlQQUlSKDB4Mjc0RiwgMHgyNzUyKSBcCisJCUJJR18oMHgyNzU2LCAweDI3NUUpIFwKKwkJQklHXygweDI3NjEsIDB4Mjc5NCkgXAorCQlCSUdfKDB4Mjc5OCwgMHgyN0FGKSBcCisJCUJJR18oMHgyN0IxLCAweDI3QkUpIFwKKwkJQklHXygweDI3QzAsIDB4MjdDQSkgXAorCQlQQUlSKDB4MjdDQywgMHgyN0NDKSBcCisJCUJJR18oMHgyN0QwLCAweDI3RkYpIFwKKwkJQklHXygweDI5MDAsIDB4MkI0QykgXAorCQlCSUdfKDB4MkI1MCwgMHgyQjU5KSBcCisJCUJJR18oMHgyQ0U1LCAweDJDRUEpIFwKKwkJQklHXygweDJDRjksIDB4MkNGRikgXAorCQlCSUdfKDB4MkUwMCwgMHgyRTk5KSBcCisJCUJJR18oMHgyRTlCLCAweDJFRjMpIFwKKwkJQklHXygweDJGMDAsIDB4MkZENSkgXAorCQlCSUdfKDB4MkZGMCwgMHgyRkZCKSBcCisJCUJJR18oMHgzMDAwLCAweDMwMDQpIFwKKwkJQklHXygweDMwMDgsIDB4MzAyMCkgXAorCQlQQUlSKDB4MzAzMCwgMHgzMDMwKSBcCisJCVBBSVIoMHgzMDM2LCAweDMwMzcpIFwKKwkJUEFJUigweDMwM0QsIDB4MzAzRCkgXAorCQlQQUlSKDB4MzAzRSwgMHgzMDNGKSBcCisJCVBBSVIoMHgzMDlCLCAweDMwOUMpIFwKKwkJUEFJUigweDMwQTAsIDB4MzBBMCkgXAorCQlQQUlSKDB4MzBGQiwgMHgzMEZCKSBcCisJCUJJR18oMHgzMUMwLCAweDMxRTMpIFwKKwkJUEFJUigweDMyMUQsIDB4MzIxRSkgXAorCQlCSUdfKDB4MzI1MCwgMHgzMjVGKSBcCisJCVBBSVIoMHgzMjdDLCAweDMyN0UpIFwKKwkJQklHXygweDMyQjEsIDB4MzJCRikgXAorCQlQQUlSKDB4MzJDQywgMHgzMkNGKSBcCisJCVBBSVIoMHgzMzc3LCAweDMzN0EpIFwKKwkJUEFJUigweDMzREUsIDB4MzNERikgXAorCQlQQUlSKDB4MzNGRiwgMHgzM0ZGKSBcCisJCUJJR18oMHg0REMwLCAweDRERkYpIFwKKwkJQklHXygweEE0OTAsIDB4QTRDNikgXAorCQlCSUdfKDB4QTYwRCwgMHhBNjBGKSBcCisJCUJJR18oMHhBNjczLCAweEE2NzMpIFwKKwkJQklHXygweEE2N0UsIDB4QTY3RikgXAorCQlCSUdfKDB4QTcwMCwgMHhBNzIxKSBcCisJCUJJR18oMHhBNzg4LCAweEE3ODgpIFwKKwkJQklHXygweEE4MjgsIDB4QTgyQikgXAorCQlCSUdfKDB4QTgzOCwgMHhBODM5KSBcCisJCUJJR18oMHhBODc0LCAweEE4NzcpIFwKKwkJQklHXygweEZCMjksIDB4RkIyOSkgXAorCQlCSUdfKDB4RkQzRSwgMHhGRDNGKSBcCisJCUJJR18oMHhGREZELCAweEZERkQpIFwKKwkJQklHXygweEZFMTAsIDB4RkUxOSkgXAorCQlCSUdfKDB4RkUzMCwgMHhGRTUyKSBcCisJCUJJR18oMHhGRTU0LCAweEZFNjYpIFwKKwkJQklHXygweEZFNjgsIDB4RkU2QikgXAorCQlCSUdfKDB4RkYwMSwgMHhGRjIwKSBcCisJCUJJR18oMHhGRjNCLCAweEZGNDApIFwKKwkJQklHXygweEZGNUIsIDB4RkY2NSkgXAorCQlCSUdfKDB4RkZFMCwgMHhGRkU2KSBcCisJCUJJR18oMHhGRkU4LCAweEZGRUUpIFwKKwkJQklHXygweEZGRjksIDB4RkZGRCkKKwkJLyoKKwkJezB4MTAxMDEsIDB4MTAxMDF9LAorCQl7MHgxMDE0MCwgMHgxMDE5Qn0sCisJCXsweDEwOTFGLCAweDEwOTFGfSwKKwkJezB4MTBCMzksIDB4MTBCM0Z9LAorCQl7MHgxMEU2MCwgMHgxMEU3RX0sCisJCXsweDFEMjAwLCAweDFEMjQxfSwKKwkJezB4MUQyNDUsIDB4MUQyNDV9LAorCQl7MHgxRDMwMCwgMHgxRDM1Nn0sCisJCXsweDFENkRCLCAweDFENkRCfSwKKwkJezB4MUQ3MTUsIDB4MUQ3MTV9LAorCQl7MHgxRDc0RiwgMHgxRDc0Rn0sCisJCXsweDFENzg5LCAweDFENzg5fSwKKwkJezB4MUQ3QzMsIDB4MUQ3QzN9LAorCQl7MHgxRDdDRSwgMHgxRDdGRn0sCisJCXsweDFGMDAwLCAweDFGMDJCfSwKKwkJezB4MUYwMzAsIDB4MUYwOTN9LAorCQl7MHgxRjEwMCwgMHgxRjEwQX0KKwkJKi8KKwlzdGF0aWMgY29uc3Qgc3RydWN0IGludGVydmFsIG5ldXRyYWxfYltdID0geyBBUlJBWSB9OworIyAgdW5kZWYgQklHXworIyAgdW5kZWYgUEFJUgorIyAgZGVmaW5lIEJJR18oYSxiKQorIyAgZGVmaW5lIFBBSVIoYSxiKSAoYSA8PCAyKSB8IChiLWEpLAorCXN0YXRpYyBjb25zdCB1aW50MTZfdCBuZXV0cmFsX3BbXSA9IHsgQVJSQVkgfTsKKyMgIHVuZGVmIEJJR18KKyMgIHVuZGVmIFBBSVIKKyMgIGRlZmluZSBCSUdfKGEsYikgY2hhciBiaWdfIyNhW2IgPCAweDQwMDAgJiYgYi1hIDw9IDMgPyAtMSA6IDFdOworIyAgZGVmaW5lIFBBSVIoYSxiKSBjaGFyIHBhaXIjI2FbYiA+PSAweDQwMDAgfHwgYi1hID4gMyA/IC0xIDogMV07CisJc3RydWN0IENIRUNLIHsgQVJSQVkgfTsKKyMgIHVuZGVmIEJJR18KKyMgIHVuZGVmIFBBSVIKKyMgIHVuZGVmIEFSUkFZCisKKwlpZiAoaW5faW50ZXJ2YWxfdGFibGUod2MsIG5ldXRyYWxfYiwgQVJSQVlfU0laRShuZXV0cmFsX2IpIC0gMSkpCisJCXJldHVybiAxOworCWlmIChpbl91aW50MTZfdGFibGUod2MsIG5ldXRyYWxfcCwgQVJSQVlfU0laRShuZXV0cmFsX3ApIC0gMSkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorIyAgZW5kaWYKKworIyBlbmRpZiAvKiBVTklDT0RFX0JJRElfU1VQUE9SVCAqLworCisjZW5kaWYgLyogSG9tZWdyb3duIFVuaWNvZGUgc3VwcG9ydCAqLworCisKKy8qIFRoZSByZXN0IGlzIG1vc3RseSBzYW1lIGZvciBsaWJjIGFuZCBmb3IgImhvbWVncm93biIgc3VwcG9ydCAqLworCitzaXplX3QgRkFTVF9GVU5DIHVuaWNvZGVfc3RybGVuKGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwlzaXplX3Qgd2lkdGggPSBtYnN0b3djcyhOVUxMLCBzdHJpbmcsIElOVF9NQVgpOworCWlmICh3aWR0aCA9PSAoc2l6ZV90KS0xTCkKKwkJcmV0dXJuIHN0cmxlbihzdHJpbmcpOworCXJldHVybiB3aWR0aDsKK30KKworc2l6ZV90IEZBU1RfRlVOQyB1bmljb2RlX3N0cndpZHRoKGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwl1bmlfc3RhdF90IHVuaV9zdGF0OworCXByaW50YWJsZV9zdHJpbmcoJnVuaV9zdGF0LCBzdHJpbmcpOworCXJldHVybiB1bmlfc3RhdC51bmljb2RlX3dpZHRoOworfQorCitzdGF0aWMgY2hhciogRkFTVF9GVU5DIHVuaWNvZGVfY29udl90b19wcmludGFibGUyKHVuaV9zdGF0X3QgKnN0YXRzLCBjb25zdCBjaGFyICpzcmMsIHVuc2lnbmVkIHdpZHRoLCBpbnQgZmxhZ3MpCit7CisJY2hhciAqZHN0OworCXVuc2lnbmVkIGRzdF9sZW47CisJdW5zaWduZWQgdW5pX2NvdW50OworCXVuc2lnbmVkIHVuaV93aWR0aDsKKworCWlmICh1bmljb2RlX3N0YXR1cyAhPSBVTklDT0RFX09OKSB7CisJCWNoYXIgKmQ7CisJCWlmIChmbGFncyAmIFVOSV9GTEFHX1BBRCkgeworCQkJZCA9IGRzdCA9IHhtYWxsb2Mod2lkdGggKyAxKTsKKwkJCXdoaWxlICgoaW50KS0td2lkdGggPj0gMCkgeworCQkJCXVuc2lnbmVkIGNoYXIgYyA9ICpzcmM7CisJCQkJaWYgKGMgPT0gJ1wwJykgeworCQkJCQlkbworCQkJCQkJKmQrKyA9ICcgJzsKKwkJCQkJd2hpbGUgKChpbnQpLS13aWR0aCA+PSAwKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCSpkKysgPSAoYyA+PSAnICcgJiYgYyA8IDB4N2YpID8gYyA6ICc/JzsKKwkJCQlzcmMrKzsKKwkJCX0KKwkJCSpkID0gJ1wwJzsKKwkJfSBlbHNlIHsKKwkJCWQgPSBkc3QgPSB4c3RybmR1cChzcmMsIHdpZHRoKTsKKwkJCXdoaWxlICgqZCkgeworCQkJCXVuc2lnbmVkIGNoYXIgYyA9ICpkOworCQkJCWlmIChjIDwgJyAnIHx8IGMgPj0gMHg3ZikKKwkJCQkJKmQgPSAnPyc7CisJCQkJZCsrOworCQkJfQorCQl9CisJCWlmIChzdGF0cykgeworCQkJc3RhdHMtPmJ5dGVfY291bnQgPSAoZCAtIGRzdCk7CisJCQlzdGF0cy0+dW5pY29kZV9jb3VudCA9IChkIC0gZHN0KTsKKwkJCXN0YXRzLT51bmljb2RlX3dpZHRoID0gKGQgLSBkc3QpOworCQl9CisJCXJldHVybiBkc3Q7CisJfQorCisJZHN0ID0gTlVMTDsKKwl1bmlfY291bnQgPSB1bmlfd2lkdGggPSAwOworCWRzdF9sZW4gPSAwOworCXdoaWxlICgxKSB7CisJCWludCB3OworCQl3Y2hhcl90IHdjOworCisjaWYgRU5BQkxFX1VOSUNPREVfVVNJTkdfTE9DQUxFCisJCXsKKwkJCW1ic3RhdGVfdCBtYnN0ID0geyAwIH07CisJCQlzc2l6ZV90IHJjID0gbWJzcnRvd2NzKCZ3YywgJnNyYywgMSwgJm1ic3QpOworCQkJLyogSWYgaW52YWxpZCBzZXF1ZW5jZSBpcyBzZWVuOiAtMSBpcyByZXR1cm5lZCwKKwkJCSAqIHNyYyBwb2ludHMgdG8gdGhlIGludmFsaWQgc2VxdWVuY2UsIGVycm5vID0gRUlMU0VRLgorCQkJICogRWxzZSBudW1iZXIgb2Ygd2NoYXJzIChleGNsdWRpbmcgdGVybWluYXRpbmcgTCdcMCcpCisJCQkgKiB3cml0dGVuIHRvIGRlc3QgaXMgcmV0dXJuZWQuCisJCQkgKiBJZiBsZW4gKGhlcmU6IDEpIG5vbi1MJ1wwJyB3Y2hhcnMgc3RvcmVkIGF0IGRlc3QsCisJCQkgKiBzcmMgcG9pbnRzIHRvIHRoZSBuZXh0IGNoYXIgdG8gYmUgY29udmVydGVkLgorCQkJICogSWYgc3RyaW5nIGlzIGNvbXBsZXRlbHkgY29udmVydGVkOiBzcmMgPSBOVUxMLgorCQkJICovCisJCQlpZiAocmMgPT0gMCkgLyogZW5kLW9mLXN0cmluZyAqLworCQkJCWJyZWFrOworCQkJaWYgKHJjIDwgMCkgeyAvKiBlcnJvciAqLworCQkJCXNyYysrOworCQkJCWdvdG8gc3Vic3Q7CisJCQl9CisJCQlpZiAoIWlzd3ByaW50KHdjKSkKKwkJCQlnb3RvIHN1YnN0OworCQl9CisjZWxzZQorCQlzcmMgPSBtYnN0b3djX2ludGVybmFsKCZ3Yywgc3JjKTsKKwkJLyogc3JjIGlzIGFkdmFuY2VkIHRvIG5leHQgbWIgY2hhcgorCQkgKiB3YyA9PSBFUlJPUl9XQ0hBUjogaW52YWxpZCBzZXF1ZW5jZSBpcyBzZWVuCisJCSAqIGVsc2U6IHdjIGlzIHNldAorCQkgKi8KKwkJaWYgKHdjID09IEVSUk9SX1dDSEFSKSAvKiBlcnJvciAqLworCQkJZ290byBzdWJzdDsKKwkJaWYgKHdjID09IDApIC8qIGVuZC1vZi1zdHJpbmcgKi8KKwkJCWJyZWFrOworI2VuZGlmCisJCWlmIChDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIgJiYgd2MgPiBDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIpCisJCQlnb3RvIHN1YnN0OworCQl3ID0gd2N3aWR0aCh3Yyk7CisJCWlmICgoRU5BQkxFX1VOSUNPREVfQ09NQklOSU5HX1dDSEFSUyAmJiB3IDwgMCkgLyogbm9uLXByaW50YWJsZSB3Y2hhciAqLworCQkgfHwgKCFFTkFCTEVfVU5JQ09ERV9DT01CSU5JTkdfV0NIQVJTICYmIHcgPD0gMCkKKwkJIHx8ICghRU5BQkxFX1VOSUNPREVfV0lERV9XQ0hBUlMgJiYgdyA+IDEpCisJCSkgeworIHN1YnN0OgorCQkJd2MgPSBDT05GSUdfU1VCU1RfV0NIQVI7CisJCQl3ID0gMTsKKwkJfQorCQl3aWR0aCAtPSB3OworCQkvKiBOb3RlOiBpZiB3aWR0aCA9PSAwLCB3ZSBzdGlsbCBtYXkgYWRkIG1vcmUgY2hhcnMsCisJCSAqIHRoZXkgbWF5IGJlIHplcm8td2lkdGggb3IgY29tYmluaW5nIG9uZXMgKi8KKwkJaWYgKChpbnQpd2lkdGggPCAwKSB7CisJCQkvKiBjYW4ndCBhZGQgdGhpcyB3Yywgc3RyaW5nIHdvdWxkIGJlY29tZSBsb25nZXIgdGhhbiB3aWR0aCAqLworCQkJd2lkdGggKz0gdzsKKwkJCWJyZWFrOworCQl9CisKKwkJdW5pX2NvdW50Kys7CisJCXVuaV93aWR0aCArPSB3OworCQlkc3QgPSB4cmVhbGxvYyhkc3QsIGRzdF9sZW4gKyBNQl9DVVJfTUFYKTsKKyNpZiBFTkFCTEVfVU5JQ09ERV9VU0lOR19MT0NBTEUKKwkJeworCQkJbWJzdGF0ZV90IG1ic3QgPSB7IDAgfTsKKwkJCWRzdF9sZW4gKz0gd2NydG9tYigmZHN0W2RzdF9sZW5dLCB3YywgJm1ic3QpOworCQl9CisjZWxzZQorCQlkc3RfbGVuICs9IHdjcnRvbWJfaW50ZXJuYWwoJmRzdFtkc3RfbGVuXSwgd2MpOworI2VuZGlmCisJfQorCisJLyogUGFkIHRvIHJlbWFpbmluZyB3aWR0aCAqLworCWlmIChmbGFncyAmIFVOSV9GTEFHX1BBRCkgeworCQlkc3QgPSB4cmVhbGxvYyhkc3QsIGRzdF9sZW4gKyB3aWR0aCArIDEpOworCQl1bmlfY291bnQgKz0gd2lkdGg7CisJCXVuaV93aWR0aCArPSB3aWR0aDsKKwkJd2hpbGUgKChpbnQpLS13aWR0aCA+PSAwKSB7CisJCQlkc3RbZHN0X2xlbisrXSA9ICcgJzsKKwkJfQorCX0KKwlkc3RbZHN0X2xlbl0gPSAnXDAnOworCWlmIChzdGF0cykgeworCQlzdGF0cy0+Ynl0ZV9jb3VudCA9IGRzdF9sZW47CisJCXN0YXRzLT51bmljb2RlX2NvdW50ID0gdW5pX2NvdW50OworCQlzdGF0cy0+dW5pY29kZV93aWR0aCA9IHVuaV93aWR0aDsKKwl9CisKKwlyZXR1cm4gZHN0OworfQorY2hhciogRkFTVF9GVU5DIHVuaWNvZGVfY29udl90b19wcmludGFibGUodW5pX3N0YXRfdCAqc3RhdHMsIGNvbnN0IGNoYXIgKnNyYykKK3sKKwlyZXR1cm4gdW5pY29kZV9jb252X3RvX3ByaW50YWJsZTIoc3RhdHMsIHNyYywgSU5UX01BWCwgMCk7Cit9CitjaGFyKiBGQVNUX0ZVTkMgdW5pY29kZV9jb252X3RvX3ByaW50YWJsZV9maXhlZHdpZHRoKC8qdW5pX3N0YXRfdCAqc3RhdHMsKi8gY29uc3QgY2hhciAqc3JjLCB1bnNpZ25lZCB3aWR0aCkKK3sKKwlyZXR1cm4gdW5pY29kZV9jb252X3RvX3ByaW50YWJsZTIoLypzdGF0czoqLyBOVUxMLCBzcmMsIHdpZHRoLCBVTklfRkxBR19QQUQpOworfQorCisjaWZkZWYgVU5VU0VECitjaGFyKiBGQVNUX0ZVTkMgdW5pY29kZV9jb252X3RvX3ByaW50YWJsZV9tYXh3aWR0aCh1bmlfc3RhdF90ICpzdGF0cywgY29uc3QgY2hhciAqc3JjLCB1bnNpZ25lZCBtYXh3aWR0aCkKK3sKKwlyZXR1cm4gdW5pY29kZV9jb252X3RvX3ByaW50YWJsZTIoc3RhdHMsIHNyYywgbWF4d2lkdGgsIDApOworfQorCit1bnNpZ25lZCBGQVNUX0ZVTkMgdW5pY29kZV9wYWRkaW5nX3RvX3dpZHRoKHVuc2lnbmVkIHdpZHRoLCBjb25zdCBjaGFyICpzcmMpCit7CisJaWYgKHVuaWNvZGVfc3RhdHVzICE9IFVOSUNPREVfT04pIHsKKwkJcmV0dXJuIHdpZHRoIC0gc3RybmxlbihzcmMsIHdpZHRoKTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlpbnQgdzsKKwkJd2NoYXJfdCB3YzsKKworI2lmIEVOQUJMRV9VTklDT0RFX1VTSU5HX0xPQ0FMRQorCQl7CisJCQltYnN0YXRlX3QgbWJzdCA9IHsgMCB9OworCQkJc3NpemVfdCByYyA9IG1ic3J0b3djcygmd2MsICZzcmMsIDEsICZtYnN0KTsKKwkJCWlmIChyYyA8PSAwKSAvKiBlcnJvciwgb3IgZW5kLW9mLXN0cmluZyAqLworCQkJCXJldHVybiB3aWR0aDsKKwkJfQorI2Vsc2UKKwkJc3JjID0gbWJzdG93Y19pbnRlcm5hbCgmd2MsIHNyYyk7CisJCWlmICh3YyA9PSBFUlJPUl9XQ0hBUiB8fCB3YyA9PSAwKSAvKiBlcnJvciwgb3IgZW5kLW9mLXN0cmluZyAqLworCQkJcmV0dXJuIHdpZHRoOworI2VuZGlmCisJCXcgPSB3Y3dpZHRoKHdjKTsKKwkJaWYgKHcgPCAwKSAvKiBub24tcHJpbnRhYmxlIHdjaGFyICovCisJCQlyZXR1cm4gd2lkdGg7CisJCXdpZHRoIC09IHc7CisJCWlmICgoaW50KXdpZHRoIDw9IDApIC8qIHN0cmluZyBpcyBsb25nZXIgdGhhbiB3aWR0aCAqLworCQkJcmV0dXJuIDA7CisJfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saWJiYi91cGRhdGVfcGFzc3dkLmMgYi9saWJiYi91cGRhdGVfcGFzc3dkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIwMDRmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3VwZGF0ZV9wYXNzd2QuYwpAQCAtMCwwICsxLDMxOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdXBkYXRlX3Bhc3N3ZAorICoKKyAqIHVwZGF0ZV9wYXNzd2QgaXMgYSBjb21tb24gZnVuY3Rpb24gZm9yIHBhc3N3ZCBhbmQgY2hwYXNzd2QgYXBwbGV0czsKKyAqIGl0IGlzIHJlc3BvbnNpYmxlIGZvciB1cGRhdGluZyBwYXNzd29yZCBmaWxlIChpLmUuIC9ldGMvcGFzc3dkIG9yCisgKiAvZXRjL3NoYWRvdykgZm9yIGEgZ2l2ZW4gdXNlciBhbmQgcGFzc3dvcmQuCisgKgorICogTW92ZWQgZnJvbSBsb2dpbnV0aWxzL3Bhc3N3ZC5jIGJ5IEFsZXhhbmRlciBTaGlzaGtpbiA8dmlydHVvc29Ac2xpbmQub3JnPgorICoKKyAqIE1vZGlmaWVkIHRvIGJlIGFibGUgdG8gYWRkIG9yIGRlbGV0ZSB1c2VycywgZ3JvdXBzIGFuZCB1c2VycyB0by9mcm9tIGdyb3VwcworICogYnkgVGl0byBSYWd1c2EgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWYgRU5BQkxFX1NFTElOVVgKK3N0YXRpYyB2b2lkIGNoZWNrX3NlbGludXhfdXBkYXRlX3Bhc3N3ZChjb25zdCBjaGFyICp1c2VybmFtZSkKK3sKKwlzZWN1cml0eV9jb250ZXh0X3QgY29udGV4dDsKKwljaGFyICpzZXVzZXI7CisKKwlpZiAoZ2V0dWlkKCkgIT0gKHVpZF90KTAgfHwgaXNfc2VsaW51eF9lbmFibGVkKCkgPT0gMCkKKwkJcmV0dXJuOyAgLyogTm8gbmVlZCB0byBjaGVjayAqLworCisJaWYgKGdldHByZXZjb25fcmF3KCZjb250ZXh0KSA8IDApCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZ2V0cHJldmNvbiBmYWlsZWQiKTsKKwlzZXVzZXIgPSBzdHJ0b2soY29udGV4dCwgIjoiKTsKKwlpZiAoIXNldXNlcikKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgY29udGV4dCAnJXMnIiwgY29udGV4dCk7CisJaWYgKHN0cmNtcChzZXVzZXIsIHVzZXJuYW1lKSAhPSAwKSB7CisJCWlmIChjaGVja1Bhc3N3ZEFjY2VzcyhQQVNTV0RfX1BBU1NXRCkgIT0gMCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJTRUxpbnV4OiBhY2Nlc3MgZGVuaWVkIik7CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZWNvbihjb250ZXh0KTsKK30KKyNlbHNlCisjIGRlZmluZSBjaGVja19zZWxpbnV4X3VwZGF0ZV9wYXNzd2QodXNlcm5hbWUpICgodm9pZCkwKQorI2VuZGlmCisKKy8qCisgMSkgYWRkIGEgdXNlcjogdXBkYXRlX3Bhc3N3ZChGSUxFLCBVU0VSLCBSRU1BSU5JTkdfUFdMSU5FLCBOVUxMKQorICAgIG9ubHkgaWYgQ09ORklHX0FERFVTRVI9eSBhbmQgYXBwbGV0X25hbWVbMF0gPT0gJ2EnIGxpa2UgaW4gYWRkdXNlcgorCisgMikgYWRkIGEgZ3JvdXA6IHVwZGF0ZV9wYXNzd2QoRklMRSwgR1JPVVAsIFJFTUFJTklOR19HUkxJTkUsIE5VTEwpCisgICAgb25seSBpZiBDT05GSUdfQURER1JPVVA9eSBhbmQgYXBwbGV0X25hbWVbMF0gPT0gJ2EnIGxpa2UgaW4gYWRkZ3JvdXAKKworIDMpIGFkZCBhIHVzZXIgdG8gYSBncm91cDogdXBkYXRlX3Bhc3N3ZChGSUxFLCBHUk9VUCwgTlVMTCwgTUVNQkVSKQorICAgIG9ubHkgaWYgQ09ORklHX0ZFQVRVUkVfQUREVVNFUl9UT19HUk9VUD15LCBhcHBsZXRfbmFtZVswXSA9PSAnYScKKyAgICBsaWtlIGluIGFkZGdyb3VwIGFuZCBtZW1iZXIgIT0gTlVMTAorCisgNCkgZGVsZXRlIGEgdXNlcjogdXBkYXRlX3Bhc3N3ZChGSUxFLCBVU0VSLCBOVUxMLCBOVUxMKQorCisgNSkgZGVsZXRlIGEgZ3JvdXA6IHVwZGF0ZV9wYXNzd2QoRklMRSwgR1JPVVAsIE5VTEwsIE5VTEwpCisKKyA2KSBkZWxldGUgYSB1c2VyIGZyb20gYSBncm91cDogdXBkYXRlX3Bhc3N3ZChGSUxFLCBHUk9VUCwgTlVMTCwgTUVNQkVSKQorICAgIG9ubHkgaWYgQ09ORklHX0ZFQVRVUkVfREVMX1VTRVJfRlJPTV9HUk9VUD15IGFuZCBtZW1iZXIgIT0gTlVMTAorCisgNykgY2hhbmdlIHVzZXIncyBwYXNzd29yZDogdXBkYXRlX3Bhc3N3ZChGSUxFLCBVU0VSLCBORVdfUEFTU1dELCBOVUxMKQorICAgIG9ubHkgaWYgQ09ORklHX1BBU1NXRD15IGFuZCBhcHBsZXRfbmFtZVswXSA9PSAncCcgbGlrZSBpbiBwYXNzd2QKKyAgICBvciBpZiBDT05GSUdfQ0hQQVNTV0Q9eSBhbmQgYXBwbGV0X25hbWVbMF0gPT0gJ2MnIGxpa2UgaW4gY2hwYXNzd2QKKworIDgpIGRlbGV0ZSBhIHVzZXIgZnJvbSBhbGwgZ3JvdXBzOiB1cGRhdGVfcGFzc3dkKEZJTEUsIE5VTEwsIE5VTEwsIE1FTUJFUikKKworIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgdmFsaWRhdGUgdGhlIGFyZ3VtZW50cyBmZWQgdG8gaXQKKyBzbyB0aGUgY2FsbGluZyBwcm9ncmFtIHNob3VsZCB0YWtlIGNhcmUgb2YgdGhhdC4KKworIFJldHVybnMgbnVtYmVyIG9mIGxpbmVzIGNoYW5nZWQsIG9yIC0xIG9uIGVycm9yLgorKi8KK2ludCBGQVNUX0ZVTkMgdXBkYXRlX3Bhc3N3ZChjb25zdCBjaGFyICpmaWxlbmFtZSwKKwkJY29uc3QgY2hhciAqbmFtZSwKKwkJY29uc3QgY2hhciAqbmV3X3Bhc3N3ZCwKKwkJY29uc3QgY2hhciAqbWVtYmVyKQoreworI2lmICEoRU5BQkxFX0ZFQVRVUkVfQUREVVNFUl9UT19HUk9VUCB8fCBFTkFCTEVfRkVBVFVSRV9ERUxfVVNFUl9GUk9NX0dST1VQKQorI2RlZmluZSBtZW1iZXIgTlVMTAorI2VuZGlmCisJc3RydWN0IHN0YXQgc2I7CisJc3RydWN0IGZsb2NrIGxvY2s7CisJRklMRSAqb2xkX2ZwOworCUZJTEUgKm5ld19mcDsKKwljaGFyICpmbmFtZXNmeDsKKwljaGFyICpzZnhfY2hhcjsKKwljaGFyICpuYW1lX2NvbG9uOworCWludCBvbGRfZmQ7CisJaW50IG5ld19mZDsKKwlpbnQgaTsKKwlpbnQgY2hhbmdlZF9saW5lczsKKwlpbnQgcmV0ID0gLTE7IC8qIGZhaWx1cmUgKi8KKwkvKiB1c2VkIGFzIGEgYm9vbDogImFyZSB3ZSBtb2RpZnlpbmcgL2V0Yy9zaGFkb3c/IiAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1NIQURPV1BBU1NXRFMKKwljb25zdCBjaGFyICpzaGFkb3cgPSBzdHJzdHIoZmlsZW5hbWUsICJzaGFkb3ciKTsKKyNlbHNlCisjIGRlZmluZSBzaGFkb3cgTlVMTAorI2VuZGlmCisKKwlmaWxlbmFtZSA9IHhtYWxsb2NfZm9sbG93X3N5bWxpbmtzKGZpbGVuYW1lKTsKKwlpZiAoZmlsZW5hbWUgPT0gTlVMTCkKKwkJcmV0dXJuIHJldDsKKworCWlmIChuYW1lKQorCQljaGVja19zZWxpbnV4X3VwZGF0ZV9wYXNzd2QobmFtZSk7CisKKwkvKiBOZXcgcGFzc3dkIGZpbGUsICIvZXRjL3Bhc3N3ZCsiIGZvciBub3cgKi8KKwlmbmFtZXNmeCA9IHhhc3ByaW50ZigiJXMrIiwgZmlsZW5hbWUpOworCXNmeF9jaGFyID0gJmZuYW1lc2Z4W3N0cmxlbihmbmFtZXNmeCktMV07CisJbmFtZV9jb2xvbiA9IHhhc3ByaW50ZigiJXM6IiwgbmFtZSA/IG5hbWUgOiAiIik7CisKKwlpZiAoc2hhZG93KQorCQlvbGRfZnAgPSBmb3BlbihmaWxlbmFtZSwgInIrIik7CisJZWxzZQorCQlvbGRfZnAgPSBmb3Blbl9vcl93YXJuKGZpbGVuYW1lLCAicisiKTsKKwlpZiAoIW9sZF9mcCkgeworCQlpZiAoc2hhZG93KQorCQkJcmV0ID0gMDsgLyogbWlzc2luZyBzaGFkb3cgaXMgbm90IGFuIGVycm9yICovCisJCWdvdG8gZnJlZV9tZW07CisJfQorCW9sZF9mZCA9IGZpbGVubyhvbGRfZnApOworCisJc2VsaW51eF9wcmVzZXJ2ZV9mY29udGV4dChvbGRfZmQpOworCisJLyogVHJ5IHRvIGNyZWF0ZSAiL2V0Yy9wYXNzd2QrIi4gV2FpdCBpZiBpdCBleGlzdHMuICovCisJaSA9IDMwOworCWRvIHsKKwkJLy8gRklYTUU6IG9uIGxhc3QgaXRlcmF0aW9uIHRyeSB3L28gT19FWENMIGJ1dCB3aXRoIE9fVFJVTkM/CisJCW5ld19mZCA9IG9wZW4oZm5hbWVzZngsIE9fV1JPTkxZfE9fQ1JFQVR8T19FWENMLCAwNjAwKTsKKwkJaWYgKG5ld19mZCA+PSAwKSBnb3RvIGNyZWF0ZWQ7CisJCWlmIChlcnJubyAhPSBFRVhJU1QpIGJyZWFrOworCQl1c2xlZXAoMTAwMDAwKTsgLyogMC4xIHNlYyAqLworCX0gd2hpbGUgKC0taSk7CisJYmJfcGVycm9yX21zZygiY2FuJ3QgY3JlYXRlICclcyciLCBmbmFtZXNmeCk7CisJZ290byBjbG9zZV9vbGRfZnA7CisKKyBjcmVhdGVkOgorCWlmIChmc3RhdChvbGRfZmQsICZzYikgPT0gMCkgeworCQlmY2htb2QobmV3X2ZkLCBzYi5zdF9tb2RlICYgMDc3Nyk7IC8qIGlnbm9yZSBlcnJvcnMgKi8KKwkJZmNob3duKG5ld19mZCwgc2Iuc3RfdWlkLCBzYi5zdF9naWQpOworCX0KKwllcnJubyA9IDA7CisJbmV3X2ZwID0geGZkb3Blbl9mb3Jfd3JpdGUobmV3X2ZkKTsKKworCS8qIEJhY2t1cCBmaWxlIGlzICIvZXRjL3Bhc3N3ZC0iICovCisJKnNmeF9jaGFyID0gJy0nOworCS8qIERlbGV0ZSBvbGQgYmFja3VwICovCisJaSA9ICh1bmxpbmsoZm5hbWVzZngpICYmIGVycm5vICE9IEVOT0VOVCk7CisJLyogQ3JlYXRlIGJhY2t1cCBhcyBhIGhhcmRsaW5rIHRvIGN1cnJlbnQgKi8KKwlpZiAoaSB8fCBsaW5rKGZpbGVuYW1lLCBmbmFtZXNmeCkpCisJCWJiX3BlcnJvcl9tc2coIndhcm5pbmc6IGNhbid0IGNyZWF0ZSBiYWNrdXAgY29weSAnJXMnIiwKKwkJCQlmbmFtZXNmeCk7CisJKnNmeF9jaGFyID0gJysnOworCisJLyogTG9jayB0aGUgcGFzc3dvcmQgZmlsZSBiZWZvcmUgdXBkYXRpbmcgKi8KKwlsb2NrLmxfdHlwZSA9IEZfV1JMQ0s7CisJbG9jay5sX3doZW5jZSA9IFNFRUtfU0VUOworCWxvY2subF9zdGFydCA9IDA7CisJbG9jay5sX2xlbiA9IDA7CisJaWYgKGZjbnRsKG9sZF9mZCwgRl9TRVRMSywgJmxvY2spIDwgMCkKKwkJYmJfcGVycm9yX21zZygid2FybmluZzogY2FuJ3QgbG9jayAnJXMnIiwgZmlsZW5hbWUpOworCWxvY2subF90eXBlID0gRl9VTkxDSzsKKworCS8qIFJlYWQgY3VycmVudCBwYXNzd29yZCBmaWxlLCB3cml0ZSB1cGRhdGVkIC9ldGMvcGFzc3dkKyAqLworCWNoYW5nZWRfbGluZXMgPSAwOworCXdoaWxlICgxKSB7CisJCWNoYXIgKmNwLCAqbGluZTsKKworCQlsaW5lID0geG1hbGxvY19mZ2V0bGluZShvbGRfZnApOworCQlpZiAoIWxpbmUpIC8qIEVPRi9lcnJvciAqLworCQkJYnJlYWs7CisKKwkJaWYgKCFuYW1lICYmIG1lbWJlcikgeworCQkJLyogRGVsZXRlIG1lbWJlciBmcm9tIGFsbCBncm91cHMgKi8KKwkJCS8qIGxpbmUgaXMgIkdST1VQOlBBU1NXRDpbbWVtYmVyMVssbWVtYmVyMl0uLi5dIiAqLworCQkJdW5zaWduZWQgbWVtYmVyX2xlbiA9IHN0cmxlbihtZW1iZXIpOworCQkJY2hhciAqbGlzdCA9IHN0cnJjaHIobGluZSwgJzonKTsKKwkJCXdoaWxlIChsaXN0KSB7CisJCQkJbGlzdCsrOworIG5leHRfbGlzdF9lbGVtZW50OgorCQkJCWlmIChpc19wcmVmaXhlZF93aXRoKGxpc3QsIG1lbWJlcikpIHsKKwkJCQkJY2hhciBjOworCQkJCQljaGFuZ2VkX2xpbmVzKys7CisJCQkJCWMgPSBsaXN0W21lbWJlcl9sZW5dOworCQkJCQlpZiAoYyA9PSAnXDAnKSB7CisJCQkJCQlpZiAobGlzdFstMV0gPT0gJywnKQorCQkJCQkJCWxpc3QtLTsKKwkJCQkJCSpsaXN0ID0gJ1wwJzsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWlmIChjID09ICcsJykgeworCQkJCQkJb3ZlcmxhcHBpbmdfc3RyY3B5KGxpc3QsIGxpc3QgKyBtZW1iZXJfbGVuICsgMSk7CisJCQkJCQlnb3RvIG5leHRfbGlzdF9lbGVtZW50OworCQkJCQl9CisJCQkJCWNoYW5nZWRfbGluZXMtLTsKKwkJCQl9CisJCQkJbGlzdCA9IHN0cmNocihsaXN0LCAnLCcpOworCQkJfQorCQkJZnByaW50ZihuZXdfZnAsICIlc1xuIiwgbGluZSk7CisJCQlnb3RvIG5leHQ7CisJCX0KKworCQljcCA9IGlzX3ByZWZpeGVkX3dpdGgobGluZSwgbmFtZV9jb2xvbik7CisJCWlmICghY3ApIHsKKwkJCWZwcmludGYobmV3X2ZwLCAiJXNcbiIsIGxpbmUpOworCQkJZ290byBuZXh0OworCQl9CisKKwkJLyogV2UgaGF2ZSBhIG1hdGNoIHdpdGggIm5hbWU6Ii4uLiAqLworCQkvKiBjcCBwb2ludHMgcGFzdCAibmFtZToiICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9BRERVU0VSX1RPX0dST1VQIHx8IEVOQUJMRV9GRUFUVVJFX0RFTF9VU0VSX0ZST01fR1JPVVAKKwkJaWYgKG1lbWJlcikgeworCQkJLyogSXQncyBhY3R1YWxseSAvZXRjL2dyb3VwKywgbm90IC9ldGMvcGFzc3dkKyAqLworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0FERFVTRVJfVE9fR1JPVVAKKwkJCSAmJiBhcHBsZXRfbmFtZVswXSA9PSAnYScKKwkJCSkgeworCQkJCS8qIEFkZCB1c2VyIHRvIGdyb3VwICovCisJCQkJZnByaW50ZihuZXdfZnAsICIlcyVzJXNcbiIsIGxpbmUsCisJCQkJCWxhc3RfY2hhcl9pcyhsaW5lLCAnOicpID8gIiIgOiAiLCIsCisJCQkJCW1lbWJlcik7CisJCQkJY2hhbmdlZF9saW5lcysrOworCQkJfSBlbHNlIGlmIChFTkFCTEVfRkVBVFVSRV9ERUxfVVNFUl9GUk9NX0dST1VQCisJCQkvKiAmJiBhcHBsZXRfbmFtZVswXSA9PSAnZCcgKi8KKwkJCSkgeworCQkJCS8qIERlbGV0ZSB1c2VyIGZyb20gZ3JvdXAgKi8KKwkJCQljaGFyICp0bXA7CisJCQkJY29uc3QgY2hhciAqZm10ID0gIiVzIjsKKworCQkJCS8qIGZpbmQgdGhlIHN0YXJ0IG9mIHRoZSBtZW1iZXIgbGlzdDogbGFzdCAnOicgKi8KKwkJCQljcCA9IHN0cnJjaHIobGluZSwgJzonKTsKKwkJCQkvKiBjdXQgaXQgKi8KKwkJCQkqY3ArKyA9ICdcMCc7CisJCQkJLyogd3JpdGUgdGhlIGN1dCBsaW5lIG5hbWU6cGFzc3dkOmdpZDoKKwkJCQkgKiBvciBuYW1lOiE6OiAqLworCQkJCWZwcmludGYobmV3X2ZwLCAiJXM6IiwgbGluZSk7CisJCQkJLyogcGFyc2UgdGhlIHRva2VucyBvZiB0aGUgbWVtYmVyIGxpc3QgKi8KKwkJCQl0bXAgPSBjcDsKKwkJCQl3aGlsZSAoKGNwID0gc3Ryc2VwKCZ0bXAsICIsIikpICE9IE5VTEwpIHsKKwkJCQkJaWYgKHN0cmNtcChtZW1iZXIsIGNwKSAhPSAwKSB7CisJCQkJCQlmcHJpbnRmKG5ld19mcCwgZm10LCBjcCk7CisJCQkJCQlmbXQgPSAiLCVzIjsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCS8qIGZvdW5kIG1lbWJlciwgc2tpcCBpdCAqLworCQkJCQkJY2hhbmdlZF9saW5lcysrOworCQkJCQl9CisJCQkJfQorCQkJCWZwcmludGYobmV3X2ZwLCAiXG4iKTsKKwkJCX0KKwkJfSBlbHNlCisjZW5kaWYKKwkJaWYgKChFTkFCTEVfUEFTU1dEICYmIGFwcGxldF9uYW1lWzBdID09ICdwJykKKwkJIHx8IChFTkFCTEVfQ0hQQVNTV0QgJiYgYXBwbGV0X25hbWVbMF0gPT0gJ2MnKQorCQkpIHsKKwkJCS8qIENoYW5nZSBwYXNzd2QgKi8KKwkJCWNwID0gc3RyY2hybnVsKGNwLCAnOicpOyAvKiBtb3ZlIHBhc3Qgb2xkIHBhc3N3ZCAqLworCisJCQlpZiAoc2hhZG93ICYmICpjcCA9PSAnOicpIHsKKwkJCQkvKiAvZXRjL3NoYWRvdydzIGZpZWxkIDMgKHBhc3N3ZCBjaGFuZ2UgZGF0ZSkgbmVlZHMgdXBkYXRpbmcgKi8KKwkJCQkvKiBtb3ZlIHBhc3Qgb2xkIGNoYW5nZSBkYXRlICovCisJCQkJY3AgPSBzdHJjaHJudWwoY3AgKyAxLCAnOicpOworCQkJCS8qICJuYW1lOiIgKyAibmV3X3Bhc3N3ZCIgKyAiOiIgKyAiY2hhbmdlIGRhdGUiICsgIjpyZXN0IG9mIGxpbmUiICovCisJCQkJZnByaW50ZihuZXdfZnAsICIlcyVzOiV1JXNcbiIsIG5hbWVfY29sb24sIG5ld19wYXNzd2QsCisJCQkJCSh1bnNpZ25lZCkodGltZShOVUxMKSkgLyAoMjQqNjAqNjApLCBjcCk7CisJCQl9IGVsc2UgeworCQkJCS8qICJuYW1lOiIgKyAibmV3X3Bhc3N3ZCIgKyAiOnJlc3Qgb2YgbGluZSIgKi8KKwkJCQlmcHJpbnRmKG5ld19mcCwgIiVzJXMlc1xuIiwgbmFtZV9jb2xvbiwgbmV3X3Bhc3N3ZCwgY3ApOworCQkJfQorCQkJY2hhbmdlZF9saW5lcysrOworCQl9IC8qIGVsc2UgZGVsZXRlIHVzZXIgb3IgZ3JvdXA6IHNraXAgdGhlIGxpbmUgKi8KKyBuZXh0OgorCQlmcmVlKGxpbmUpOworCX0KKworCWlmIChjaGFuZ2VkX2xpbmVzID09IDApIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9BRERVU0VSX1RPX0dST1VQIHx8IEVOQUJMRV9GRUFUVVJFX0RFTF9VU0VSX0ZST01fR1JPVVAKKwkJaWYgKG1lbWJlcikgeworCQkJaWYgKEVOQUJMRV9BRERHUk9VUCAmJiBhcHBsZXRfbmFtZVswXSA9PSAnYScpCisJCQkJYmJfZXJyb3JfbXNnKCJjYW4ndCBmaW5kICVzIGluICVzIiwgbmFtZSwgZmlsZW5hbWUpOworCQkJaWYgKEVOQUJMRV9ERUxHUk9VUCAmJiBhcHBsZXRfbmFtZVswXSA9PSAnZCcpCisJCQkJYmJfZXJyb3JfbXNnKCJjYW4ndCBmaW5kICVzIGluICVzIiwgbWVtYmVyLCBmaWxlbmFtZSk7CisJCX0KKyNlbmRpZgorCQlpZiAoKEVOQUJMRV9BRERVU0VSIHx8IEVOQUJMRV9BRERHUk9VUCkKKwkJICYmIGFwcGxldF9uYW1lWzBdID09ICdhJyAmJiAhbWVtYmVyCisJCSkgeworCQkJLyogYWRkIHVzZXIgb3IgZ3JvdXAgKi8KKwkJCWZwcmludGYobmV3X2ZwLCAiJXMlc1xuIiwgbmFtZV9jb2xvbiwgbmV3X3Bhc3N3ZCk7CisJCQljaGFuZ2VkX2xpbmVzKys7CisJCX0KKwl9CisKKwlmY250bChvbGRfZmQsIEZfU0VUTEssICZsb2NrKTsKKworCS8qIFdlIGRvIHdhbnQgYWxsIG9mIHRoZW0gdG8gZXhlY3V0ZSwgdGh1cyB8IGluc3RlYWQgb2YgfHwgKi8KKwllcnJubyA9IDA7CisJaWYgKChmZXJyb3Iob2xkX2ZwKSB8IGZmbHVzaChuZXdfZnApIHwgZnN5bmMobmV3X2ZkKSB8IGZjbG9zZShuZXdfZnApKQorCSB8fCByZW5hbWUoZm5hbWVzZngsIGZpbGVuYW1lKQorCSkgeworCQkvKiBBdCBsZWFzdCBvbmUgb2YgdGhvc2UgZmFpbGVkICovCisJCWJiX3BlcnJvcl9ub21zZygpOworCQlnb3RvIHVubGlua19uZXc7CisJfQorCS8qIFN1Y2Nlc3M6IHJldCA+PSAwICovCisJcmV0ID0gY2hhbmdlZF9saW5lczsKKworIHVubGlua19uZXc6CisJaWYgKHJldCA8IDApCisJCXVubGluayhmbmFtZXNmeCk7CisKKyBjbG9zZV9vbGRfZnA6CisJZmNsb3NlKG9sZF9mcCk7CisKKyBmcmVlX21lbToKKwlmcmVlKGZuYW1lc2Z4KTsKKwlmcmVlKChjaGFyICopZmlsZW5hbWUpOworCWZyZWUobmFtZV9jb2xvbik7CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3V0bXAuYyBiL2xpYmJiL3V0bXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDA3NjcwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvdXRtcC5jCkBAIC0wLDAgKzEsMTQ2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB1dG1wL3d0bXAgc3VwcG9ydCByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgRGVueXMgVmxhc2Vua28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RhdGljIHZvaWQgdG91Y2goY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaWYgKGFjY2VzcyhmaWxlbmFtZSwgUl9PSyB8IFdfT0spID09IC0xKQorCQljbG9zZShvcGVuKGZpbGVuYW1lLCBPX1dST05MWSB8IE9fQ1JFQVQsIDA2NjQpKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgd3JpdGVfbmV3X3V0bXAocGlkX3QgcGlkLCBpbnQgbmV3X3R5cGUsIGNvbnN0IGNoYXIgKnR0eV9uYW1lLCBjb25zdCBjaGFyICp1c2VybmFtZSwgY29uc3QgY2hhciAqaG9zdG5hbWUpCit7CisJc3RydWN0IHV0bXB4IHV0ZW50OworCWNoYXIgKmlkOworCXVuc2lnbmVkIHdpZHRoOworCisJbWVtc2V0KCZ1dGVudCwgMCwgc2l6ZW9mKHV0ZW50KSk7CisJdXRlbnQudXRfcGlkID0gcGlkOworCXV0ZW50LnV0X3R5cGUgPSBuZXdfdHlwZTsKKwl0dHlfbmFtZSA9IHNraXBfZGV2X3BmeCh0dHlfbmFtZSk7CisJc2FmZV9zdHJuY3B5KHV0ZW50LnV0X2xpbmUsIHR0eV9uYW1lLCBzaXplb2YodXRlbnQudXRfbGluZSkpOworCWlmICh1c2VybmFtZSkKKwkJc2FmZV9zdHJuY3B5KHV0ZW50LnV0X3VzZXIsIHVzZXJuYW1lLCBzaXplb2YodXRlbnQudXRfdXNlcikpOworCWlmIChob3N0bmFtZSkKKwkJc2FmZV9zdHJuY3B5KHV0ZW50LnV0X2hvc3QsIGhvc3RuYW1lLCBzaXplb2YodXRlbnQudXRfaG9zdCkpOworCXV0ZW50LnV0X3R2LnR2X3NlYyA9IHRpbWUoTlVMTCk7CisKKwkvKiBJbnZlbnQgb3VyIG93biB1dF9pZC4gdXRfaWQgaXMgb25seSA0IGNoYXJzIHdpZGUuCisJICogVHJ5IHRvIGZpdCBzb21ldGhpbmcgcmVtb3RlbHkgbWVhbmluZ2Z1bC4uLiAqLworCWlkID0gdXRlbnQudXRfaWQ7CisJd2lkdGggPSBzaXplb2YodXRlbnQudXRfaWQpOworCWlmICh0dHlfbmFtZVswXSA9PSAncCcpIHsKKwkJLyogaWYgInB0eVhYWCIsIG1hcCB0byAicFhYWCIgKi8KKwkJLyogaWYgInB0cy9YWCIsIG1hcCB0byAicC9YWCIgKi8KKwkJKmlkKysgPSAncCc7CisJCXdpZHRoLS07CisJfSAvKiBlbHNlOiB1c3VhbGx5IGl0J3MgInR0eVhYWFgiLCBtYXAgdG8gIlhYWFgiICovCisJaWYgKHN0cmxlbih0dHlfbmFtZSkgPiAzKQorCQl0dHlfbmFtZSArPSAzOworCXN0cm5jcHkoaWQsIHR0eV9uYW1lLCB3aWR0aCk7CisKKwl0b3VjaChfUEFUSF9VVE1QWCk7CisJLy91dG1weG5hbWUoX1BBVEhfVVRNUFgpOworCXNldHV0eGVudCgpOworCS8qIEFwcGVuZCBuZXcgb25lIChob3BlZnVsbHksIHVubGVzcyB3ZSBjb2xsaWRlIG9uIHV0X2lkKSAqLworCXB1dHV0eGxpbmUoJnV0ZW50KTsKKwllbmR1dHhlbnQoKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1dUTVAKKwkvKiAibWFuIHV0bXAiIHNheXMgd3RtcCBmaWxlIHNob3VsZCAqbm90KiBiZSBjcmVhdGVkIGF1dG9tYWdpY2FsbHkgKi8KKwkvKnRvdWNoKGJiX3BhdGhfd3RtcF9maWxlKTsqLworCXVwZHd0bXB4KGJiX3BhdGhfd3RtcF9maWxlLCAmdXRlbnQpOworI2VuZGlmCit9CisKKy8qCisgKiBSZWFkICJtYW4gdXRtcCIgdG8gbWFrZSBzZW5zZSBvdXQgb2YgaXQuCisgKi8KK3ZvaWQgRkFTVF9GVU5DIHVwZGF0ZV91dG1wKHBpZF90IHBpZCwgaW50IG5ld190eXBlLCBjb25zdCBjaGFyICp0dHlfbmFtZSwgY29uc3QgY2hhciAqdXNlcm5hbWUsIGNvbnN0IGNoYXIgKmhvc3RuYW1lKQoreworCXN0cnVjdCB1dG1weCB1dGVudDsKKwlzdHJ1Y3QgdXRtcHggKnV0cDsKKworCXRvdWNoKF9QQVRIX1VUTVBYKTsKKwkvL3V0bXB4bmFtZShfUEFUSF9VVE1QWCk7CisJc2V0dXR4ZW50KCk7CisKKwkvKiBEaWQgaW5pdC9nZXR0eS90ZWxuZXRkL3NzaGQvLi4uIGNyZWF0ZSBhbiBlbnRyeSBmb3IgdXM/CisJICogSXQgc2hvdWxkIGJlIChuZXdfdHlwZS0xKSwgYnV0IHdlJ2QgYWxzbyByZXVzZQorCSAqIGFueSBvdGhlciBwb3RlbnRpYWxseSBzdGFsZSB4eHhfUFJPQ0VTUyBlbnRyeSAqLworCXdoaWxlICgodXRwID0gZ2V0dXR4ZW50KCkpICE9IE5VTEwpIHsKKwkJaWYgKHV0cC0+dXRfcGlkID09IHBpZAorCQkvLyAmJiB1dC0+dXRfbGluZVswXQorCQkgJiYgdXRwLT51dF9pZFswXSAvKiBtdXN0IGhhdmUgbm9uemVybyBpZCAqLworCQkgJiYgKCAgdXRwLT51dF90eXBlID09IElOSVRfUFJPQ0VTUworCQkgICAgfHwgdXRwLT51dF90eXBlID09IExPR0lOX1BST0NFU1MKKwkJICAgIHx8IHV0cC0+dXRfdHlwZSA9PSBVU0VSX1BST0NFU1MKKwkJICAgIHx8IHV0cC0+dXRfdHlwZSA9PSBERUFEX1BST0NFU1MKKwkJICAgICkKKwkJKSB7CisJCQlpZiAodXRwLT51dF90eXBlID49IG5ld190eXBlKSB7CisJCQkJLyogU3RhbGUgcmVjb3JkLiBOdWtlIGhvc3RuYW1lICovCisJCQkJbWVtc2V0KHV0cC0+dXRfaG9zdCwgMCwgc2l6ZW9mKHV0cC0+dXRfaG9zdCkpOworCQkJfQorCQkJLyogTkI6IHB1dHV0eGxpbmUgKHNlZSBsYXRlcikgc2VhcmNoZXMgZm9yIG1hdGNoaW5nIHV0eGVudAorCQkJICogdXNpbmcgZ2V0dXR4aWQodXRlbnQpIC0gd2UgbXVzdCBub3QgY2hhbmdlIHV0X2lkCisJCQkgKiBpZiB3ZSB3YW50ICpleGFjdGx5IHRoaXMqIHJlY29yZCB0byBiZSBvdmVyd3JpdHRlbiEKKwkJCSAqLworCQkJYnJlYWs7CisJCX0KKwl9CisJLy9lbmR1dHhlbnQoKTsgLSBubyBuZWVkLCBwdXR1dHhsaW5lIGNhbiBkZWFsIHdpdGggKGFuZCBhY3R1YWxseSBsaWtlcykKKwkvL3RoZSBzaXR1YXRpb24gd2hlbiB1dG1wIGZpbGUgaXMgcG9zaXRpb25lZCBvbiBmb3VuZCByZWNvcmQKKworCWlmICghdXRwKSB7CisJCWlmIChuZXdfdHlwZSAhPSBERUFEX1BST0NFU1MpCisJCQl3cml0ZV9uZXdfdXRtcChwaWQsIG5ld190eXBlLCB0dHlfbmFtZSwgdXNlcm5hbWUsIGhvc3RuYW1lKTsKKwkJZWxzZQorCQkJZW5kdXR4ZW50KCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBNYWtlIGEgY29weS4gV2UgY2FuJ3QgdXNlICp1dHAsIHB1dHV0eGxpbmUncyBpbnRlcm5hbCBnZXR1dHhpZAorCSAqIHdpbGwgb3ZlcndyaXRlIGl0IGJlZm9yZSBpdCBpcyB1c2VkISAqLworCXV0ZW50ID0gKnV0cDsKKworCXV0ZW50LnV0X3R5cGUgPSBuZXdfdHlwZTsKKwlpZiAodHR5X25hbWUpCisJCXNhZmVfc3RybmNweSh1dGVudC51dF9saW5lLCBza2lwX2Rldl9wZngodHR5X25hbWUpLCBzaXplb2YodXRlbnQudXRfbGluZSkpOworCWlmICh1c2VybmFtZSkKKwkJc2FmZV9zdHJuY3B5KHV0ZW50LnV0X3VzZXIsIHVzZXJuYW1lLCBzaXplb2YodXRlbnQudXRfdXNlcikpOworCWlmIChob3N0bmFtZSkKKwkJc2FmZV9zdHJuY3B5KHV0ZW50LnV0X2hvc3QsIGhvc3RuYW1lLCBzaXplb2YodXRlbnQudXRfaG9zdCkpOworCXV0ZW50LnV0X3R2LnR2X3NlYyA9IHRpbWUoTlVMTCk7CisKKwkvKiBVcGRhdGUsIG9yIGFwcGVuZCBuZXcgb25lICovCisJLy9zZXR1dHhlbnQoKTsKKwlwdXR1dHhsaW5lKCZ1dGVudCk7CisJZW5kdXR4ZW50KCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9XVE1QCisJLyogIm1hbiB1dG1wIiBzYXlzIHd0bXAgZmlsZSBzaG91bGQgKm5vdCogYmUgY3JlYXRlZCBhdXRvbWFnaWNhbGx5ICovCisJLyp0b3VjaChiYl9wYXRoX3d0bXBfZmlsZSk7Ki8KKwl1cGR3dG1weChiYl9wYXRoX3d0bXBfZmlsZSwgJnV0ZW50KTsKKyNlbmRpZgorfQorCisvKiBtYW4gdXRtcDoKKyAqIFdoZW4gaW5pdCg4KSBmaW5kcyB0aGF0IGEgcHJvY2VzcyBoYXMgZXhpdGVkLCBpdCBsb2NhdGVzIGl0cyB1dG1wIGVudHJ5CisgKiBieSB1dF9waWQsIHNldHMgdXRfdHlwZSB0byBERUFEX1BST0NFU1MsIGFuZCBjbGVhcnMgdXRfdXNlciwgdXRfaG9zdAorICogYW5kIHV0X3RpbWUgd2l0aCBudWxsIGJ5dGVzLgorICogW3NhbWUgYXBwbGllcyB0byBvdGhlciBwcm9jZXNzZXMgd2hpY2ggbWFpbnRhaW4gdXRtcCBlbnRyaWVzLCBsaWtlIHRlbG5ldGRdCisgKgorICogV2UgZG8gbm90IGJvdGhlciBhY3R1YWxseSBjbGVhcmluZyBmaWVsZHM6CisgKiBpdCBtaWdodCBiZSBpbnRlcmVzdGluZyB0byBrbm93IHdobyB3YXMgbG9nZ2VkIGluIGFuZCBmcm9tIHdoZXJlCisgKi8KK3ZvaWQgRkFTVF9GVU5DIHVwZGF0ZV91dG1wX0RFQURfUFJPQ0VTUyhwaWRfdCBwaWQpCit7CisJdXBkYXRlX3V0bXAocGlkLCBERUFEX1BST0NFU1MsIE5VTEwsIE5VTEwsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvdXVlbmNvZGUuYyBiL2xpYmJiL3V1ZW5jb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdiMjQ4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3V1ZW5jb2RlLmMKQEAgLTAsMCArMSwyMjQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAyMDAzLCBHbGVubiBNY0dyYXRoCisgKiBDb3B5cmlnaHQgMjAwNiwgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqIENvcHlyaWdodCAyMDEwLCBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIENvbnZlcnNpb24gdGFibGUuICBmb3IgYmFzZSA2NCAqLworY29uc3QgY2hhciBiYl91dWVuY190YmxfYmFzZTY0WzY1ICsgMV0gQUxJR04xID0geworCSdBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsICdHJywgJ0gnLAorCSdJJywgJ0onLCAnSycsICdMJywgJ00nLCAnTicsICdPJywgJ1AnLAorCSdRJywgJ1InLCAnUycsICdUJywgJ1UnLCAnVicsICdXJywgJ1gnLAorCSdZJywgJ1onLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLAorCSdnJywgJ2gnLCAnaScsICdqJywgJ2snLCAnbCcsICdtJywgJ24nLAorCSdvJywgJ3AnLCAncScsICdyJywgJ3MnLCAndCcsICd1JywgJ3YnLAorCSd3JywgJ3gnLCAneScsICd6JywgJzAnLCAnMScsICcyJywgJzMnLAorCSc0JywgJzUnLCAnNicsICc3JywgJzgnLCAnOScsICcrJywgJy8nLAorCSc9JyAvKiB0ZXJtaW5hdGlvbiBjaGFyYWN0ZXIgKi8sCisJJ1wwJyAvKiBuZWVkZWQgZm9yIHV1ZGVjb2RlLmMgb25seSAqLworfTsKKworY29uc3QgY2hhciBiYl91dWVuY190Ymxfc3RkWzY1XSBBTElHTjEgPSB7CisJJ2AnLCAnIScsICciJywgJyMnLCAnJCcsICclJywgJyYnLCAnXCcnLAorCScoJywgJyknLCAnKicsICcrJywgJywnLCAnLScsICcuJywgJy8nLAorCScwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLAorCSc4JywgJzknLCAnOicsICc7JywgJzwnLCAnPScsICc+JywgJz8nLAorCSdAJywgJ0EnLCAnQicsICdDJywgJ0QnLCAnRScsICdGJywgJ0cnLAorCSdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywgJ08nLAorCSdQJywgJ1EnLCAnUicsICdTJywgJ1QnLCAnVScsICdWJywgJ1cnLAorCSdYJywgJ1knLCAnWicsICdbJywgJ1xcJywgJ10nLCAnXicsICdfJywKKwknYCcgLyogdGVybWluYXRpb24gY2hhcmFjdGVyICovCit9OworCisvKgorICogRW5jb2RlIGJ5dGVzIGF0IFMgb2YgbGVuZ3RoIExFTkdUSCB0byB1dWVuY29kZSBvciBiYXNlNjQgZm9ybWF0IGFuZCBwbGFjZSBpdAorICogdG8gU1RPUkUuICBTVE9SRSB3aWxsIGJlIDAtdGVybWluYXRlZCwgYW5kIG11c3QgcG9pbnQgdG8gYSB3cml0YWJsZQorICogYnVmZmVyIG9mIGF0IGxlYXN0IDErQkFTRTY0X0xFTkdUSChsZW5ndGgpIGJ5dGVzLgorICogd2hlcmUgQkFTRTY0X0xFTkdUSChsZW4pID0gKDQgKiAoKExFTkdUSCArIDIpIC8gMykpCisgKi8KK3ZvaWQgRkFTVF9GVU5DIGJiX3V1ZW5jb2RlKGNoYXIgKnAsIGNvbnN0IHZvaWQgKnNyYywgaW50IGxlbmd0aCwgY29uc3QgY2hhciAqdGJsKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnMgPSBzcmM7CisKKwkvKiBUcmFuc2Zvcm0gdGhlIDN4OCBiaXRzIHRvIDR4NiBiaXRzICovCisJd2hpbGUgKGxlbmd0aCA+IDApIHsKKwkJdW5zaWduZWQgczEsIHMyOworCisJCS8qIEFyZSBzWzFdLCBzWzJdIHZhbGlkIG9yIHNob3VsZCBiZSBhc3N1bWVkIDA/ICovCisJCXMxID0gczIgPSAwOworCQlsZW5ndGggLT0gMzsgLyogY2FuIGJlID49MCwgLTEsIC0yICovCisJCWlmIChsZW5ndGggPj0gLTEpIHsKKwkJCXMxID0gc1sxXTsKKwkJCWlmIChsZW5ndGggPj0gMCkKKwkJCQlzMiA9IHNbMl07CisJCX0KKwkJKnArKyA9IHRibFtzWzBdID4+IDJdOworCQkqcCsrID0gdGJsWygoc1swXSAmIDMpIDw8IDQpICsgKHMxID4+IDQpXTsKKwkJKnArKyA9IHRibFsoKHMxICYgMHhmKSA8PCAyKSArIChzMiA+PiA2KV07CisJCSpwKysgPSB0YmxbczIgJiAweDNmXTsKKwkJcyArPSAzOworCX0KKwkvKiBaZXJvLXRlcm1pbmF0ZSAqLworCSpwID0gJ1wwJzsKKwkvKiBJZiBsZW5ndGggaXMgLTIgb3IgLTEsIHBhZCBsYXN0IGNoYXIgb3IgdHdvICovCisJd2hpbGUgKGxlbmd0aCkgeworCQkqLS1wID0gdGJsWzY0XTsKKwkJbGVuZ3RoKys7CisJfQorfQorCisvKgorICogRGVjb2RlIGJhc2U2NCBlbmNvZGVkIHN0cmluZy4gU3RvcHMgb24gJ1wwJy4KKyAqCisgKiBSZXR1cm5zOiBwb2ludGVyIHRvIHRoZSB1bmRlY29kZWQgcGFydCBvZiBzb3VyY2UuCisgKiBJZiBwb2ludHMgdG8gJ1wwJywgdGhlbiB0aGUgc291cmNlIHdhcyBmdWxseSBkZWNvZGVkLgorICogKCpwcF9kc3QpOiBhZHZhbmNlZCBwYXN0IHRoZSBsYXN0IHdyaXR0ZW4gYnl0ZS4KKyAqLworY29uc3QgY2hhciogRkFTVF9GVU5DIGRlY29kZV9iYXNlNjQoY2hhciAqKnBwX2RzdCwgY29uc3QgY2hhciAqc3JjKQoreworCWNoYXIgKmRzdCA9ICpwcF9kc3Q7CisJY29uc3QgY2hhciAqc3JjX3RhaWw7CisKKwl3aGlsZSAoMSkgeworCQl1bnNpZ25lZCBjaGFyIHNpeF9iaXRbNF07CisJCWludCBjb3VudCA9IDA7CisKKwkJLyogRmV0Y2ggdXAgdG8gZm91ciA2LWJpdCB2YWx1ZXMgKi8KKwkJc3JjX3RhaWwgPSBzcmM7CisJCXdoaWxlIChjb3VudCA8IDQpIHsKKwkJCWNoYXIgKnRhYmxlX3B0cjsKKwkJCWludCBjaDsKKworCQkJLyogR2V0IG5leHQgX3ZhbGlkXyBjaGFyYWN0ZXIuCisJCQkgKiBiYl91dWVuY190YmxfYmFzZTY0W10gY29udGFpbnMgdGhpcyBzdHJpbmc6CisJCQkgKiAgMCAgICAgICAgIDEgICAgICAgICAyICAgICAgICAgMyAgICAgICAgIDQgICAgICAgICA1ICAgICAgICAgNgorCQkJICogIDAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0CisJCQkgKiAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz0iCisJCQkgKi8KKwkJCWRvIHsKKwkJCQljaCA9ICpzcmM7CisJCQkJaWYgKGNoID09ICdcMCcpIHsKKwkJCQkJaWYgKGNvdW50ID09IDApIHsKKwkJCQkJCS8qIEV4YW1wbGU6CisJCQkJCQkgKiBJZiB3ZSBkZWNvZGUgIlFVSkQgPE5VTD4iLCB3ZSB3YW50CisJCQkJCQkgKiB0byByZXR1cm4gcHRyIHRvIE5VTCwgbm90IHRvICcgJywKKwkJCQkJCSAqIGJlY2F1c2Ugd2UgZGlkIGZ1bGx5IGRlY29kZQorCQkJCQkJICogdGhlIHN0cmluZyAodG8gIkFCQyIpLgorCQkJCQkJICovCisJCQkJCQlzcmNfdGFpbCA9IHNyYzsKKwkJCQkJfQorCQkJCQlnb3RvIHJldDsKKwkJCQl9CisJCQkJc3JjKys7CisJCQkJdGFibGVfcHRyID0gc3RyY2hyKGJiX3V1ZW5jX3RibF9iYXNlNjQsIGNoKTsKKy8vVE9ETzogYWRkIEJBU0U2NF9GTEFHX2ZvbyB0byBkaWUgb24gYmFkIGNoYXI/CisJCQl9IHdoaWxlICghdGFibGVfcHRyKTsKKworCQkJLyogQ29udmVydCBlbmNvZGVkIGNoYXJhY3RlciB0byBkZWNpbWFsICovCisJCQljaCA9IHRhYmxlX3B0ciAtIGJiX3V1ZW5jX3RibF9iYXNlNjQ7CisKKwkJCS8qIGNoIGlzIDY0IGlmIGNoYXIgd2FzICc9Jywgb3RoZXJ3aXNlIDAuLjYzICovCisJCQlpZiAoY2ggPT0gNjQpCisJCQkJYnJlYWs7CisJCQlzaXhfYml0W2NvdW50XSA9IGNoOworCQkJY291bnQrKzsKKwkJfQorCisJCS8qIFRyYW5zZm9ybSA2LWJpdCB2YWx1ZXMgdG8gOC1iaXQgb25lcy4KKwkJICogY291bnQgY2FuIGJlIDwgNCB3aGVuIHdlIGRlY29kZSB0aGUgdGFpbDoKKwkJICogImVRPT0iIC0+ICJ5Iiwgbm90ICJ5IE5VTCBOVUwiLgorCQkgKiBOb3RlIHRoYXQgKGNvdW50ID4gMSkgaXMgYWx3YXlzIHRydWUsCisJCSAqICJ4PT09IiBlbmNvZGluZyBpcyBub3QgdmFsaWQ6CisJCSAqIGV2ZW4gYSBzaW5nbGUgemVybyBieXRlIGVuY29kZXMgYXMgIkFBPT0iLgorCQkgKiBIb3dldmVyLCB3aXRoIGN1cnJlbnQgbG9naWMgd2UgY29tZSBoZXJlIHdpdGggY291bnQgPT0gMQorCQkgKiB3aGVuIHdlIGRlY29kZSAiPT0iIHRhaWwuCisJCSAqLworCQlpZiAoY291bnQgPiAxKQorCQkJKmRzdCsrID0gc2l4X2JpdFswXSA8PCAyIHwgc2l4X2JpdFsxXSA+PiA0OworCQlpZiAoY291bnQgPiAyKQorCQkJKmRzdCsrID0gc2l4X2JpdFsxXSA8PCA0IHwgc2l4X2JpdFsyXSA+PiAyOworCQlpZiAoY291bnQgPiAzKQorCQkJKmRzdCsrID0gc2l4X2JpdFsyXSA8PCA2IHwgc2l4X2JpdFszXTsKKwkJLyogTm90ZSB0aGF0IGlmIHdlIGRlY29kZSAiQUE9PSIgYW5kIGF0ZSBmaXJzdCAnPScsCisJCSAqIHdlIGp1c3QgZGVjb2RlZCBvbmUgY2hhciAoY291bnQgPT0gMikgYW5kIG5vdyB3ZSdsbAorCQkgKiBkbyB0aGUgbG9vcCBvbmNlIG1vcmUgdG8gZGVjb2RlIHNlY29uZCAnPScuCisJCSAqLworCX0gLyogd2hpbGUgKDEpICovCisgcmV0OgorCSpwcF9kc3QgPSBkc3Q7CisJcmV0dXJuIHNyY190YWlsOworfQorCisvKgorICogRGVjb2RlIGJhc2U2NCBlbmNvZGVkIHN0cmVhbS4KKyAqIENhbiBzdG9wIG9uIEVPRiwgc3BlY2lmaWVkIGNoYXIsIG9yIG9uIHV1ZW5jb2RlLXN0eWxlICI9PT09IiBsaW5lOgorICogZmxhZ3MgYXJndW1lbnQgY29udHJvbHMgaXQuCisgKi8KK3ZvaWQgRkFTVF9GVU5DIHJlYWRfYmFzZTY0KEZJTEUgKnNyY19zdHJlYW0sIEZJTEUgKmRzdF9zdHJlYW0sIGludCBmbGFncykKK3sKKy8qIE5vdGUgdGhhdCBFT0YgX2Nhbl8gYmUgcGFzc2VkIGFzIGV4aXRfY2hhciB0b28gKi8KKyNkZWZpbmUgZXhpdF9jaGFyICAgICgoaW50KShzaWduZWQgY2hhcilmbGFncykKKyNkZWZpbmUgdXVfc3R5bGVfZW5kIChmbGFncyAmIEJBU0U2NF9GTEFHX1VVX1NUT1ApCisKKwkvKiB1dWVuY29kZWQgZmlsZXMgaGF2ZSA2MSBieXRlIGxpbmVzLiBVc2UgNjQgYnl0ZSBidWZmZXIKKwkgKiB0byBwcm9jZXNzIGxpbmUgYXQgYSB0aW1lLgorCSAqLworCWVudW0geyBCVUZGRVJfU0laRSA9IDY0IH07CisKKwljaGFyIGluX2J1ZltCVUZGRVJfU0laRSArIDJdOworCWNoYXIgb3V0X2J1ZltCVUZGRVJfU0laRSAvIDQgKiAzICsgMl07CisJY2hhciAqb3V0X3RhaWw7CisJY29uc3QgY2hhciAqaW5fdGFpbDsKKwlpbnQgdGVybV9zZWVuID0gMDsKKwlpbnQgaW5fY291bnQgPSAwOworCisJd2hpbGUgKDEpIHsKKwkJd2hpbGUgKGluX2NvdW50IDwgQlVGRkVSX1NJWkUpIHsKKwkJCWludCBjaCA9IGZnZXRjKHNyY19zdHJlYW0pOworCQkJaWYgKGNoID09IGV4aXRfY2hhcikgeworCQkJCWlmIChpbl9jb3VudCA9PSAwKQorCQkJCQlyZXR1cm47CisJCQkJdGVybV9zZWVuID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChjaCA9PSBFT0YpIHsKKwkJCQl0ZXJtX3NlZW4gPSAxOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogUHJldmVudCAiPT09PSIgbGluZSB0byBiZSBzcGxpdDogc3RvcCBpZiB3ZSBzZWUgJ1xuJy4KKwkJCSAqIFdlIGNhbiBhbHNvIHNraXAgb3RoZXIgd2hpdGVzcGFjZSBhbmQgc2tpcnQgdGhlIHByb2JsZW0KKwkJCSAqIG9mIGZpbGVzIHdpdGggTlVMcyBieSBzdG9wcGluZyBvbiBhbnkgY29udHJvbCBjaGFyIG9yIHNwYWNlOgorCQkJICovCisJCQlpZiAoY2ggPD0gJyAnKQorCQkJCWJyZWFrOworCQkJaW5fYnVmW2luX2NvdW50KytdID0gY2g7CisJCX0KKwkJaW5fYnVmW2luX2NvdW50XSA9ICdcMCc7CisKKwkJLyogRGlkIHdlIGVuY291bnRlciAiPT09PSIgbGluZT8gKi8KKwkJaWYgKHV1X3N0eWxlX2VuZCAmJiBzdHJjbXAoaW5fYnVmLCAiPT09PSIpID09IDApCisJCQlyZXR1cm47CisKKwkJb3V0X3RhaWwgPSBvdXRfYnVmOworCQlpbl90YWlsID0gZGVjb2RlX2Jhc2U2NCgmb3V0X3RhaWwsIGluX2J1Zik7CisKKwkJZndyaXRlKG91dF9idWYsIChvdXRfdGFpbCAtIG91dF9idWYpLCAxLCBkc3Rfc3RyZWFtKTsKKworCQlpZiAodGVybV9zZWVuKSB7CisJCQkvKiBEaWQgd2UgY29uc3VtZSBBTEwgY2hhcmFjdGVycz8gKi8KKwkJCWlmICgqaW5fdGFpbCA9PSAnXDAnKQorCQkJCXJldHVybjsKKwkJCS8qIE5vICovCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidHJ1bmNhdGVkIGJhc2U2NCBpbnB1dCIpOworCQl9CisKKwkJLyogSXQgd2FzIHBhcnRpYWwgZGVjb2RlICovCisJCWluX2NvdW50ID0gc3RybGVuKGluX3RhaWwpOworCQltZW1tb3ZlKGluX2J1ZiwgaW5fdGFpbCwgaW5fY291bnQpOworCX0KK30KZGlmZiAtLWdpdCBhL2xpYmJiL3ZkcHJpbnRmLmMgYi9saWJiYi92ZHByaW50Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NDI2ODcKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi92ZHByaW50Zi5jCkBAIC0wLDAgKzEsMjEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgX19HTElCQ19fIDwgMgoraW50IEZBU1RfRlVOQyB2ZHByaW50ZihpbnQgZCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQoreworCWNoYXIgYnVmWzggKiAxMDI0XTsKKwlpbnQgbGVuOworCisJbGVuID0gdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZvcm1hdCwgYXApOworCXJldHVybiB3cml0ZShkLCBidWYsIGxlbik7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmJiL3ZlcnJvcl9tc2cuYyBiL2xpYmJiL3ZlcnJvcl9tc2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWYyYTMxCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvdmVycm9yX21zZy5jCkBAIC0wLDAgKzEsMTYxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9TWVNMT0cKKyMgaW5jbHVkZSA8c3lzbG9nLmg+CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NZU0xPRworc21hbGxpbnQgc3lzbG9nX2xldmVsID0gTE9HX0VSUjsKKyNlbmRpZgorc21hbGxpbnQgbG9nbW9kZSA9IExPR01PREVfU1RESU87Citjb25zdCBjaGFyICptc2dfZW9sID0gIlxuIjsKKwordm9pZCBGQVNUX0ZVTkMgYmJfdmVycm9yX21zZyhjb25zdCBjaGFyICpzLCB2YV9saXN0IHAsIGNvbnN0IGNoYXIqIHN0cmVycikKK3sKKwljaGFyICptc2csICptc2cxOworCWludCBhcHBsZXRfbGVuLCBzdHJlcnJfbGVuLCBtc2dlb2xfbGVuLCB1c2VkOworCisJaWYgKCFsb2dtb2RlKQorCQlyZXR1cm47CisKKwlpZiAoIXMpIC8qIG5vbXNnW19hbmRfZGllXSB1c2VzIE5VTEwgZm10ICovCisJCXMgPSAiIjsgLyogc29tZSBsaWJjIGRvbid0IGxpa2UgcHJpbnRmKE5VTEwpICovCisKKwl1c2VkID0gdmFzcHJpbnRmKCZtc2csIHMsIHApOworCWlmICh1c2VkIDwgMCkKKwkJcmV0dXJuOworCisJLyogVGhpcyBpcyB1Z2x5IGFuZCBjb3N0cyArNjAgYnl0ZXMgY29tcGFyZWQgdG8gbXVsdGlwbGUKKwkgKiBmcHJpbnRmJ3MsIGJ1dCBpcyBndWFyYW50ZWVkIHRvIGRvIGEgc2luZ2xlIHdyaXRlLgorCSAqIFRoaXMgaXMgbmVlZGVkIGZvciBlLmcuIGh0dHBkIGxvZ2dpbmcsIHdoZW4gbXVsdGlwbGUKKwkgKiBjaGlsZHJlbiBjYW4gcHJvZHVjZSBsb2cgbWVzc2FnZXMgc2ltdWx0YW5lb3VzbHkuICovCisKKwlhcHBsZXRfbGVuID0gc3RybGVuKGFwcGxldF9uYW1lKSArIDI7IC8qICJhcHBsZXQ6ICIgKi8KKwlzdHJlcnJfbGVuID0gc3RyZXJyID8gc3RybGVuKHN0cmVycikgOiAwOworCW1zZ2VvbF9sZW4gPSBzdHJsZW4obXNnX2VvbCk7CisJLyogY2FuJ3QgdXNlIHhyZWFsbG9jOiBpdCBjYWxscyBlcnJvcl9tc2cgb24gZmFpbHVyZSwKKwkgKiB0aGF0IG1heSByZXN1bHQgaW4gYSByZWN1cnNpb24gKi8KKwkvKiArMyBpcyBmb3IgIjogIiBiZWZvcmUgc3RyZXJyIGFuZCBmb3IgdGVybWluYXRpbmcgTlVMICovCisJbXNnMSA9IHJlYWxsb2MobXNnLCBhcHBsZXRfbGVuICsgdXNlZCArIHN0cmVycl9sZW4gKyBtc2dlb2xfbGVuICsgMyk7CisJaWYgKCFtc2cxKSB7CisJCW1zZ1t1c2VkKytdID0gJ1xuJzsgLyogb3ZlcndyaXRlcyBOVUwgKi8KKwkJYXBwbGV0X2xlbiA9IDA7CisJfSBlbHNlIHsKKwkJbXNnID0gbXNnMTsKKwkJLyogVE9ETzogbWF5YmUgdXNlIHdyaXRldiBpbnN0ZWFkIG9mIG1lbW1vdmluZz8gTmVlZCBmdWxsX3dyaXRldj8gKi8KKwkJbWVtbW92ZShtc2cgKyBhcHBsZXRfbGVuLCBtc2csIHVzZWQpOworCQl1c2VkICs9IGFwcGxldF9sZW47CisJCXN0cmNweShtc2csIGFwcGxldF9uYW1lKTsKKwkJbXNnW2FwcGxldF9sZW4gLSAyXSA9ICc6JzsKKwkJbXNnW2FwcGxldF9sZW4gLSAxXSA9ICcgJzsKKwkJaWYgKHN0cmVycikgeworCQkJaWYgKHNbMF0pIHsgLyogbm90IHBlcnJvcl9ub21zZz8gKi8KKwkJCQltc2dbdXNlZCsrXSA9ICc6JzsKKwkJCQltc2dbdXNlZCsrXSA9ICcgJzsKKwkJCX0KKwkJCXN0cmNweSgmbXNnW3VzZWRdLCBzdHJlcnIpOworCQkJdXNlZCArPSBzdHJlcnJfbGVuOworCQl9CisJCXN0cmNweSgmbXNnW3VzZWRdLCBtc2dfZW9sKTsKKwkJdXNlZCArPSBtc2dlb2xfbGVuOworCX0KKworCWlmIChsb2dtb2RlICYgTE9HTU9ERV9TVERJTykgeworCQlmZmx1c2hfYWxsKCk7CisJCWZ1bGxfd3JpdGUoU1RERVJSX0ZJTEVOTywgbXNnLCB1c2VkKTsKKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfU1lTTE9HCisJaWYgKGxvZ21vZGUgJiBMT0dNT0RFX1NZU0xPRykgeworCQlzeXNsb2coc3lzbG9nX2xldmVsLCAiJXMiLCBtc2cgKyBhcHBsZXRfbGVuKTsKKwl9CisjZW5kaWYKKwlmcmVlKG1zZyk7Cit9CisKKyNpZmRlZiBWRVJTSU9OX1dJVEhfV1JJVEVWCisvKiBDb2RlIHNpemUgaXMgYXBwcm94aW1hdGVseSB0aGUgc2FtZSwgYnV0IGN1cnJlbnRseSBpdCdzIHRoZSBvbmx5IHVzZXIKKyAqIG9mIHdyaXRldiBpbiBlbnRpcmUgYmJveC4gX19saWJjX3dyaXRldiBpbiB1Y2xpYmMgaXMgfjUwIGJ5dGVzLiAqLwordm9pZCBGQVNUX0ZVTkMgYmJfdmVycm9yX21zZyhjb25zdCBjaGFyICpzLCB2YV9saXN0IHAsIGNvbnN0IGNoYXIqIHN0cmVycikKK3sKKwlpbnQgc3RyZXJyX2xlbiwgbXNnZW9sX2xlbjsKKwlzdHJ1Y3QgaW92ZWMgaW92WzNdOworCisjZGVmaW5lIHVzZWQgICAoaW92WzJdLmlvdl9sZW4pCisjZGVmaW5lIG1zZ3YgICAoaW92WzJdLmlvdl9iYXNlKQorI2RlZmluZSBtc2djICAgKChjaGFyKikoaW92WzJdLmlvdl9iYXNlKSkKKyNkZWZpbmUgbXNncHRyICgmKGlvdlsyXS5pb3ZfYmFzZSkpCisKKwlpZiAoIWxvZ21vZGUpCisJCXJldHVybjsKKworCWlmICghcykgLyogbm9tc2dbX2FuZF9kaWVdIHVzZXMgTlVMTCBmbXQgKi8KKwkJcyA9ICIiOyAvKiBzb21lIGxpYmMgZG9uJ3QgbGlrZSBwcmludGYoTlVMTCkgKi8KKworCS8qIFByZXZlbnQgImRlcmVmaW5nIHR5cGUtcHVubmVkIHB0ciB3aWxsIGJyZWFrIGFsaWFzaW5nIHJ1bGVzIiAqLworCXVzZWQgPSB2YXNwcmludGYoKGNoYXIqKikodm9pZCopbXNncHRyLCBzLCBwKTsKKwlpZiAodXNlZCA8IDApCisJCXJldHVybjsKKworCS8qIFRoaXMgaXMgdWdseSBhbmQgY29zdHMgKzYwIGJ5dGVzIGNvbXBhcmVkIHRvIG11bHRpcGxlCisJICogZnByaW50ZidzLCBidXQgaXMgZ3VhcmFudGVlZCB0byBkbyBhIHNpbmdsZSB3cml0ZS4KKwkgKiBUaGlzIGlzIG5lZWRlZCBmb3IgZS5nLiBodHRwZCBsb2dnaW5nLCB3aGVuIG11bHRpcGxlCisJICogY2hpbGRyZW4gY2FuIHByb2R1Y2UgbG9nIG1lc3NhZ2VzIHNpbXVsdGFuZW91c2x5LiAqLworCisJc3RyZXJyX2xlbiA9IHN0cmVyciA/IHN0cmxlbihzdHJlcnIpIDogMDsKKwltc2dlb2xfbGVuID0gc3RybGVuKG1zZ19lb2wpOworCS8qICszIGlzIGZvciAiOiAiIGJlZm9yZSBzdHJlcnIgYW5kIGZvciB0ZXJtaW5hdGluZyBOVUwgKi8KKwltc2d2ID0geHJlYWxsb2MobXNndiwgdXNlZCArIHN0cmVycl9sZW4gKyBtc2dlb2xfbGVuICsgMyk7CisJaWYgKHN0cmVycikgeworCQltc2djW3VzZWQrK10gPSAnOic7CisJCW1zZ2NbdXNlZCsrXSA9ICcgJzsKKwkJc3RyY3B5KG1zZ2MgKyB1c2VkLCBzdHJlcnIpOworCQl1c2VkICs9IHN0cmVycl9sZW47CisJfQorCXN0cmNweShtc2djICsgdXNlZCwgbXNnX2VvbCk7CisJdXNlZCArPSBtc2dlb2xfbGVuOworCisJaWYgKGxvZ21vZGUgJiBMT0dNT0RFX1NURElPKSB7CisJCWlvdlswXS5pb3ZfYmFzZSA9IChjaGFyKilhcHBsZXRfbmFtZTsKKwkJaW92WzBdLmlvdl9sZW4gPSBzdHJsZW4oYXBwbGV0X25hbWUpOworCQlpb3ZbMV0uaW92X2Jhc2UgPSAoY2hhciopIjogIjsKKwkJaW92WzFdLmlvdl9sZW4gPSAyOworCQkvKmlvdlsyXS5pb3ZfYmFzZSA9IG1zZ2M7Ki8KKwkJLyppb3ZbMl0uaW92X2xlbiA9IHVzZWQ7Ki8KKwkJZmZsdXNoX2FsbCgpOworCQl3cml0ZXYoU1RERVJSX0ZJTEVOTywgaW92LCAzKTsKKwl9CisjIGlmIEVOQUJMRV9GRUFUVVJFX1NZU0xPRworCWlmIChsb2dtb2RlICYgTE9HTU9ERV9TWVNMT0cpIHsKKwkJc3lzbG9nKExPR19FUlIsICIlcyIsIG1zZ2MpOworCX0KKyMgZW5kaWYKKwlmcmVlKG1zZ2MpOworfQorI2VuZGlmCisKKwordm9pZCBGQVNUX0ZVTkMgYmJfZXJyb3JfbXNnX2FuZF9kaWUoY29uc3QgY2hhciAqcywgLi4uKQoreworCXZhX2xpc3QgcDsKKworCXZhX3N0YXJ0KHAsIHMpOworCWJiX3ZlcnJvcl9tc2cocywgcCwgTlVMTCk7CisJdmFfZW5kKHApOworCXhmdW5jX2RpZSgpOworfQorCit2b2lkIEZBU1RfRlVOQyBiYl9lcnJvcl9tc2coY29uc3QgY2hhciAqcywgLi4uKQoreworCXZhX2xpc3QgcDsKKworCXZhX3N0YXJ0KHAsIHMpOworCWJiX3ZlcnJvcl9tc2cocywgcCwgTlVMTCk7CisJdmFfZW5kKHApOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvdmZvcmtfZGFlbW9uX3JleGVjLmMgYi9saWJiYi92Zm9ya19kYWVtb25fcmV4ZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmNhN2IyCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvdmZvcmtfZGFlbW9uX3JleGVjLmMKQEAgLTAsMCArMSwyOTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFJleGVjIHByb2dyYW0gZm9yIHN5c3RlbSBoYXZlIGZvcmsoKSBhcyB2Zm9yaygpIHdpdGggZm9yZWdyb3VuZCBvcHRpb24KKyAqCisgKiBDb3B5cmlnaHQgKEMpIFZsYWRpbWlyIE4uIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4KKyAqIENvcHlyaWdodCAoQykgMjAwMyBSdXNzIERpbGwgPFJ1c3MuRGlsbEBhc3UuZWR1PgorICoKKyAqIGRhZW1vbigpIHBvcnRpb24gdGFrZW4gZnJvbSB1Q2xpYmM6CisgKgorICogQ29weXJpZ2h0IChjKSAxOTkxLCAxOTkzCisgKiAgICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIE1vZGlmaWVkIGZvciB1Q2xpYmMgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZWVAZGViaWFuLm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJidXN5Ym94LmgiIC8qIHVzZXMgYXBwbGV0IHRhYmxlcyAqLworCisvKiBUaGlzIGRvZXMgYSBmb3JrL2V4ZWMgaW4gb25lIGNhbGwsIHVzaW5nIHZmb3JrKCkuICBSZXR1cm5zIFBJRCBvZiBuZXcgY2hpbGQsCisgKiAtMSBmb3IgZmFpbHVyZS4gIFJ1bnMgYXJndlswXSwgc2VhcmNoaW5nIHBhdGggaWYgdGhhdCBoYXMgbm8gLyBpbiBpdC4gKi8KK3BpZF90IEZBU1RfRlVOQyBzcGF3bihjaGFyICoqYXJndikKK3sKKwkvKiBDb21waWxlciBzaG91bGQgbm90IG9wdGltaXplIHN0b3JlcyBoZXJlICovCisJdm9sYXRpbGUgaW50IGZhaWxlZDsKKwlwaWRfdCBwaWQ7CisKKwlmZmx1c2hfYWxsKCk7CisKKwkvKiBCZSBuaWNlIHRvIG5vbW11IG1hY2hpbmVzLiAqLworCWZhaWxlZCA9IDA7CisJcGlkID0gdmZvcmsoKTsKKwlpZiAocGlkIDwgMCkgLyogZXJyb3IgKi8KKwkJcmV0dXJuIHBpZDsKKwlpZiAoIXBpZCkgeyAvKiBjaGlsZCAqLworCQkvKiBUaGlzIG1hY3JvIGlzIG9rIC0gaXQgZG9lc24ndCBkbyBOT0VYRUMvTk9GT1JLIHRyaWNrcyAqLworCQlCQl9FWEVDVlAoYXJndlswXSwgYXJndik7CisKKwkJLyogV2UgYXJlIChtYXliZSkgc2hhcmluZyBhIHN0YWNrIHdpdGggYmxvY2tlZCBwYXJlbnQsCisJCSAqIGxldCBwYXJlbnQga25vdyB3ZSBmYWlsZWQgYW5kIHRoZW4gZXhpdCB0byB1bmJsb2NrIHBhcmVudAorCQkgKiAoYnV0IGRvbid0IHJ1biBhdGV4aXQoKSBzdHVmZiwgd2hpY2ggd291bGQgc2NyZXcgdXAgcGFyZW50LikKKwkJICovCisJCWZhaWxlZCA9IGVycm5vOworCQkvKiBtb3VudCwgZm9yIGV4YW1wbGUsIGRvZXMgbm90IHdhbnQgdGhlIG1lc3NhZ2UgKi8KKwkJLypiYl9wZXJyb3JfbXNnKCJjYW4ndCBleGVjdXRlICclcyciLCBhcmd2WzBdKTsqLworCQlfZXhpdCgxMTEpOworCX0KKwkvKiBwYXJlbnQgKi8KKwkvKiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzIG5vdCByZWxpYWJsZTogYWNjb3JkaW5nIHRvIHN0YW5kYXJkcworCSAqIHZmb3JrKCkgY2FuIGJlIGVxdWl2YWxlbnQgdG8gZm9yaygpIGFuZCB3ZSB3b24ndCBzZWUgdmFsdWUKKwkgKiBvZiAnZmFpbGVkJy4KKwkgKiBJbnRlcmVzdGVkIHBhcnR5IGNhbiB3YWl0IG9uIHBpZCBhbmQgbGVhcm4gZXhpdCBjb2RlLgorCSAqIElmIDExMSAtIHRoZW4gaXQgKG1vc3QgcHJvYmFibHkpIGZhaWxlZCB0byBleGVjICovCisJaWYgKGZhaWxlZCkgeworCQlzYWZlX3dhaXRwaWQocGlkLCBOVUxMLCAwKTsgLyogcHJldmVudCB6b21iaWUgKi8KKwkJZXJybm8gPSBmYWlsZWQ7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIHBpZDsKK30KKworLyogRGllIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiB3ZSBjYW4ndCBzcGF3biBhIGNoaWxkIHByb2Nlc3MuICovCitwaWRfdCBGQVNUX0ZVTkMgeHNwYXduKGNoYXIgKiphcmd2KQoreworCXBpZF90IHBpZCA9IHNwYXduKGFyZ3YpOworCWlmIChwaWQgPCAwKQorCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKCphcmd2KTsKKwlyZXR1cm4gcGlkOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFMKK3N0YXRpYyBqbXBfYnVmIGRpZV9qbXA7CitzdGF0aWMgdm9pZCBqdW1wKHZvaWQpCit7CisJLyogU3BlY2lhbCBjYXNlLiBXZSBhcnJpdmUgaGVyZSBpZiBOT0ZPUksgYXBwbGV0CisJICogY2FsbHMgeGZ1bmMsIHdoaWNoIHRoZW4gZGVjaWRlcyB0byBkaWUuCisJICogV2UgZG9uJ3QgZGllLCBidXQganVtcCBpbnN0ZWFkIGJhY2sgdG8gY2FsbGVyLgorCSAqIE5PRk9SSyBhcHBsZXRzIHN0aWxsIGNhbm5vdCBjYXJlbGVzc2x5IGNhbGwgeGZ1bmNzOgorCSAqIHAgPSB4bWFsbG9jKDEwKTsKKwkgKiBxID0geG1hbGxvYygxMCk7IC8vIEJVRyEgaWYgdGhpcyBkaWVzLCB3ZSBsZWFrIHAhCisJICovCisJLyogfCAweDEwMCBhbGxvd3MgdG8gcGFzcyB6ZXJvIGV4aXRjb2RlIChsb25nam1wIGNhbid0IHBhc3MgMCkuCisJICogVGhpcyB3b3JrcyBiZWNhdXNlIGV4aXRjb2RlcyBhcmUgYnl0ZXMsCisJICogcnVuX25vZm9ya19hcHBsZXQoKSBlbnN1cmVzIHRoYXQgYnkgIiYgMHhmZiIgKi8KKwlsb25nam1wKGRpZV9qbXAsIHhmdW5jX2Vycm9yX3JldHZhbCB8IDB4MTAwKTsKK30KKworc3RydWN0IG5vZm9ya19zYXZlX2FyZWEgeworCWptcF9idWYgZGllX2ptcDsKKwl2b2lkICgqZGllX2Z1bmMpKHZvaWQpOworCWNvbnN0IGNoYXIgKmFwcGxldF9uYW1lOworCXVpbnQzMl90IG9wdGlvbl9tYXNrMzI7CisJdWludDhfdCB4ZnVuY19lcnJvcl9yZXR2YWw7Cit9Oworc3RhdGljIHZvaWQgc2F2ZV9ub2ZvcmtfZGF0YShzdHJ1Y3Qgbm9mb3JrX3NhdmVfYXJlYSAqc2F2ZSkKK3sKKwltZW1jcHkoJnNhdmUtPmRpZV9qbXAsICZkaWVfam1wLCBzaXplb2YoZGllX2ptcCkpOworCXNhdmUtPmRpZV9mdW5jID0gZGllX2Z1bmM7CisJc2F2ZS0+YXBwbGV0X25hbWUgPSBhcHBsZXRfbmFtZTsKKwlzYXZlLT5vcHRpb25fbWFzazMyID0gb3B0aW9uX21hc2szMjsKKwlzYXZlLT54ZnVuY19lcnJvcl9yZXR2YWwgPSB4ZnVuY19lcnJvcl9yZXR2YWw7Cit9CitzdGF0aWMgdm9pZCByZXN0b3JlX25vZm9ya19kYXRhKHN0cnVjdCBub2Zvcmtfc2F2ZV9hcmVhICpzYXZlKQoreworCW1lbWNweSgmZGllX2ptcCwgJnNhdmUtPmRpZV9qbXAsIHNpemVvZihkaWVfam1wKSk7CisJZGllX2Z1bmMgPSBzYXZlLT5kaWVfZnVuYzsKKwlhcHBsZXRfbmFtZSA9IHNhdmUtPmFwcGxldF9uYW1lOworCW9wdGlvbl9tYXNrMzIgPSBzYXZlLT5vcHRpb25fbWFzazMyOworCXhmdW5jX2Vycm9yX3JldHZhbCA9IHNhdmUtPnhmdW5jX2Vycm9yX3JldHZhbDsKK30KKworaW50IEZBU1RfRlVOQyBydW5fbm9mb3JrX2FwcGxldChpbnQgYXBwbGV0X25vLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmMsIGFyZ2M7CisJc3RydWN0IG5vZm9ya19zYXZlX2FyZWEgb2xkOworCisJc2F2ZV9ub2ZvcmtfZGF0YSgmb2xkKTsKKworCWFwcGxldF9uYW1lID0gQVBQTEVUX05BTUUoYXBwbGV0X25vKTsKKworCXhmdW5jX2Vycm9yX3JldHZhbCA9IEVYSVRfRkFJTFVSRTsKKworCS8qIEluIGNhc2UgZ2V0b3B0KCkgb3IgZ2V0b3B0MzIoKSB3YXMgYWxyZWFkeSBjYWxsZWQ6CisJICogcmVzZXQgdGhlIGxpYmMgZ2V0b3B0KCkgZnVuY3Rpb24sIHdoaWNoIGtlZXBzIGludGVybmFsIHN0YXRlLgorCSAqCisJICogQlNELWRlcml2ZWQgZ2V0b3B0KCkgZnVuY3Rpb25zIHJlcXVpcmUgdGhhdCBvcHRpbmQgYmUgc2V0IHRvIDEgaW4KKwkgKiBvcmRlciB0byByZXNldCBnZXRvcHQoKSBzdGF0ZS4gIFRoaXMgdXNlZCB0byBiZSBnZW5lcmFsbHkgYWNjZXB0ZWQKKwkgKiB3YXkgb2YgcmVzZXR0aW5nIGdldG9wdCgpLiAgSG93ZXZlciwgZ2xpYmMncyBnZXRvcHQoKQorCSAqIGhhcyBhZGRpdGlvbmFsIGdldG9wdCgpIHN0YXRlIGJleW9uZCBvcHRpbmQsIGFuZCByZXF1aXJlcyB0aGF0CisJICogb3B0aW5kIGJlIHNldCB0byB6ZXJvIHRvIHJlc2V0IGl0cyBzdGF0ZS4gIFNvIHRoZSB1bmZvcnR1bmF0ZSBzdGF0ZSBvZgorCSAqIGFmZmFpcnMgaXMgdGhhdCBCU0QtZGVyaXZlZCB2ZXJzaW9ucyBvZiBnZXRvcHQoKSBtaXNiZWhhdmUgaWYKKwkgKiBvcHRpbmQgaXMgc2V0IHRvIDAgaW4gb3JkZXIgdG8gcmVzZXQgZ2V0b3B0KCksIGFuZCBnbGliYydzIGdldG9wdCgpCisJICogd2lsbCBjb3JlIGR1bXAgaWYgb3B0aW5kIGlzIHNldCAxIGluIG9yZGVyIHRvIHJlc2V0IGdldG9wdCgpLgorCSAqCisJICogTW9yZSBtb2Rlcm4gdmVyc2lvbnMgb2YgQlNEIHJlcXVpcmUgdGhhdCBvcHRyZXNldCBiZSBzZXQgdG8gMSBpbgorCSAqIG9yZGVyIHRvIHJlc2V0IGdldG9wdCgpLiAgU2lnaC4gIFN0YW5kYXJkcywgYW55b25lPworCSAqLworI2lmZGVmIF9fR0xJQkNfXworCW9wdGluZCA9IDA7CisjZWxzZSAvKiBCU0Qgc3R5bGUgKi8KKwlvcHRpbmQgPSAxOworCS8qIG9wdHJlc2V0ID0gMTsgKi8KKyNlbmRpZgorCS8qIG9wdGFyZyA9IE5VTEw7IG9wdGVyciA9IDE7IG9wdG9wdCA9IDYzOyAtIGRvIHdlIG5lZWQgdGhpcyB0b28/ICovCisJLyogKHZhbHVlcyBhYm92ZSBhcmUgd2hhdCB0aGV5IGluaXRpYWxpemVkIHRvIGluIGdsaWJjIGFuZCB1Y2xpYmMpICovCisJLyogb3B0aW9uX21hc2szMiA9IDA7IC0gbm90IG5lZWRlZCwgbm8gYXBwbGV0IGRlcGVuZHMgb24gaXQgYmVpbmcgMCAqLworCisJYXJnYyA9IDE7CisJd2hpbGUgKGFyZ3ZbYXJnY10pCisJCWFyZ2MrKzsKKworCS8qIElmIHhmdW5jICJkaWVzIiBpbiBOT0ZPUksgYXBwbGV0LCBkaWVfZnVuYyBsb25nam1wJ3MgaGVyZSBpbnN0ZWFkICovCisJZGllX2Z1bmMgPSBqdW1wOworCXJjID0gc2V0am1wKGRpZV9qbXApOworCWlmICghcmMpIHsKKwkJLyogU29tZSBjYWxsZXJzICh4YXJncykKKwkJICogbmVlZCBhcmd2IHVudG91Y2hlZCBiZWNhdXNlIHRoZXkgZnJlZSBhcmd2W2ldISAqLworCQljaGFyICp0bXBfYXJndlthcmdjKzFdOworCQltZW1jcHkodG1wX2FyZ3YsIGFyZ3YsIChhcmdjKzEpICogc2l6ZW9mKHRtcF9hcmd2WzBdKSk7CisJCS8qIEZpbmFsbHkgd2UgY2FuIGNhbGwgTk9GT1JLIGFwcGxldCdzIG1haW4oKSAqLworCQlyYyA9IGFwcGxldF9tYWluW2FwcGxldF9ub10oYXJnYywgdG1wX2FyZ3YpOworCX0gZWxzZSB7CisJCS8qIHhmdW5jIGRpZWQgaW4gTk9GT1JLIGFwcGxldCAqLworCX0KKworCS8qIFJlc3RvcmluZyBzb21lIGdsb2JhbHMgKi8KKwlyZXN0b3JlX25vZm9ya19kYXRhKCZvbGQpOworCisJLyogT3RoZXIgZ2xvYmFscyBjYW4gYmUgc2ltcGx5IHJlc2V0IHRvIGRlZmF1bHRzICovCisjaWZkZWYgX19HTElCQ19fCisJb3B0aW5kID0gMDsKKyNlbHNlIC8qIEJTRCBzdHlsZSAqLworCW9wdGluZCA9IDE7CisjZW5kaWYKKworCXJldHVybiByYyAmIDB4ZmY7IC8qIGRvbid0IGNvbmZ1c2UgcGVvcGxlIHdpdGggImV4aXRjb2RlcyIgPjI1NSAqLworfQorI2VuZGlmIC8qIEZFQVRVUkVfUFJFRkVSX0FQUExFVFMgKi8KKworaW50IEZBU1RfRlVOQyBzcGF3bl9hbmRfd2FpdChjaGFyICoqYXJndikKK3sKKwlpbnQgcmM7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUFJFRkVSX0FQUExFVFMKKwlpbnQgYSA9IGZpbmRfYXBwbGV0X2J5X25hbWUoYXJndlswXSk7CisKKwlpZiAoYSA+PSAwICYmIChBUFBMRVRfSVNfTk9GT1JLKGEpCisjIGlmIEJCX01NVQorCQkJfHwgQVBQTEVUX0lTX05PRVhFQyhhKSAvKiBOT0VYRUMgdHJpY2sgbmVlZHMgZm9yaygpICovCisjIGVuZGlmCisJKSkgeworIyBpZiBCQl9NTVUKKwkJaWYgKEFQUExFVF9JU19OT0ZPUksoYSkpCisjIGVuZGlmCisJCXsKKwkJCXJldHVybiBydW5fbm9mb3JrX2FwcGxldChhLCBhcmd2KTsKKwkJfQorIyBpZiBCQl9NTVUKKwkJLyogTU1VIG9ubHkgKi8KKwkJLyogYS0+bm9leGVjIGlzIHRydWUgKi8KKwkJcmMgPSBmb3JrKCk7CisJCWlmIChyYykgLyogcGFyZW50IG9yIGVycm9yICovCisJCQlyZXR1cm4gd2FpdDRwaWQocmMpOworCQkvKiBjaGlsZCAqLworCQl4ZnVuY19lcnJvcl9yZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJCXJ1bl9hcHBsZXRfbm9fYW5kX2V4aXQoYSwgYXJndik7CisjIGVuZGlmCisJfQorI2VuZGlmIC8qIEZFQVRVUkVfUFJFRkVSX0FQUExFVFMgKi8KKwlyYyA9IHNwYXduKGFyZ3YpOworCXJldHVybiB3YWl0NHBpZChyYyk7Cit9CisKKyNpZiAhQkJfTU1VCit2b2lkIEZBU1RfRlVOQyByZV9leGVjKGNoYXIgKiphcmd2KQoreworCS8qIGhpZ2gtb3JkZXIgYml0IG9mIGZpcnN0IGNoYXIgaW4gYXJndlswXSBpcyBhIGhpZGRlbgorCSAqICJ3ZSBoYXZlIChhbHJlYWR5KSByZS1leGVjZWQsIGRvbid0IGRvIGl0IGFnYWluIiBmbGFnICovCisJYXJndlswXVswXSB8PSAweDgwOworCWV4ZWN2KGJiX2J1c3lib3hfZXhlY19wYXRoLCBhcmd2KTsKKwliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGV4ZWN1dGUgJyVzJyIsIGJiX2J1c3lib3hfZXhlY19wYXRoKTsKK30KKworcGlkX3QgRkFTVF9GVU5DIGZvcmtfb3JfcmV4ZWMoY2hhciAqKmFyZ3YpCit7CisJcGlkX3QgcGlkOworCS8qIE1heWJlIHdlIGFyZSBhbHJlYWR5IHJlLWV4ZWNlZCBhbmQgY29tZSBoZXJlIGFnYWluPyAqLworCWlmIChyZV9leGVjZWQpCisJCXJldHVybiAwOworCXBpZCA9IHh2Zm9yaygpOworCWlmIChwaWQpIC8qIHBhcmVudCAqLworCQlyZXR1cm4gcGlkOworCS8qIGNoaWxkIC0gcmUtZXhlYyBvdXJzZWxmICovCisJcmVfZXhlYyhhcmd2KTsKK30KKyNlbmRpZgorCisvKiBEdWUgdG8gYSAjZGVmaW5lIGluIGxpYmJiLmggb24gTU1VIHN5c3RlbXMgd2UgYWN0dWFsbHkgaGF2ZSAxIGFyZ3VtZW50IC0KKyAqIGNoYXIgKiphcmd2ICJ2YW5pc2hlcyIgKi8KK3ZvaWQgRkFTVF9GVU5DIGJiX2RhZW1vbml6ZV9vcl9yZXhlYyhpbnQgZmxhZ3MsIGNoYXIgKiphcmd2KQoreworCWludCBmZDsKKworCWlmIChmbGFncyAmIERBRU1PTl9DSERJUl9ST09UKQorCQl4Y2hkaXIoIi8iKTsKKworCWlmIChmbGFncyAmIERBRU1PTl9ERVZOVUxMX1NURElPKSB7CisJCWNsb3NlKDApOworCQljbG9zZSgxKTsKKwkJY2xvc2UoMik7CisJfQorCisJZmQgPSBvcGVuKGJiX2Rldl9udWxsLCBPX1JEV1IpOworCWlmIChmZCA8IDApIHsKKwkJLyogTkI6IHdlIGNhbiBiZSBjYWxsZWQgYXMgYmJfc2FuaXRpemVfc3RkaW8oKSBmcm9tIGluaXQKKwkJICogb3IgbWRldiwgYW5kIHRoZXJlIC9kZXYvbnVsbCBtYXkgbGVnaXRpbWF0ZWx5IG5vdCAoeWV0KSBleGlzdCEKKwkJICogRG8gbm90IHVzZSB4b3BlbiBhYm92ZSwgYnV0IG9idGFpbiBfQU5ZXyBvcGVuIGRlc2NyaXB0b3IsCisJCSAqIGV2ZW4gYm9ndXMgb25lIGFzIGJlbG93LiAqLworCQlmZCA9IHhvcGVuKCIvIiwgT19SRE9OTFkpOyAvKiBkb24ndCBiZWxpZXZlIHRoaXMgY2FuIGZhaWwgKi8KKwl9CisKKwl3aGlsZSAoKHVuc2lnbmVkKWZkIDwgMikKKwkJZmQgPSBkdXAoZmQpOyAvKiBoYXZlIDAsMSwyIG9wZW4gYXQgbGVhc3QgdG8gL2Rldi9udWxsICovCisKKwlpZiAoIShmbGFncyAmIERBRU1PTl9PTkxZX1NBTklUSVpFKSkgeworCQlpZiAoZm9ya19vcl9yZXhlYyhhcmd2KSkKKwkJCWV4aXQoRVhJVF9TVUNDRVNTKTsgLyogcGFyZW50ICovCisJCS8qIGlmIGRhZW1vbml6aW5nLCBkZXRhY2ggZnJvbSBzdGRpbyAmIGN0dHkgKi8KKwkJc2V0c2lkKCk7CisJCWR1cDIoZmQsIDApOworCQlkdXAyKGZkLCAxKTsKKwkJZHVwMihmZCwgMik7CisJCWlmIChmbGFncyAmIERBRU1PTl9ET1VCTEVfRk9SSykgeworCQkJLyogT24gTGludXgsIHNlc3Npb24gbGVhZGVyIGNhbiBhY3F1aXJlIGN0dHkKKwkJCSAqIHVua25vd2luZ2x5LCBieSBvcGVuaW5nIGEgdHR5LgorCQkJICogUHJldmVudCB0aGlzOiBzdG9wIGJlaW5nIGEgc2Vzc2lvbiBsZWFkZXIuCisJCQkgKi8KKwkJCWlmIChmb3JrX29yX3JleGVjKGFyZ3YpKQorCQkJCWV4aXQoRVhJVF9TVUNDRVNTKTsgLyogcGFyZW50ICovCisJCX0KKwl9CisJd2hpbGUgKGZkID4gMikgeworCQljbG9zZShmZC0tKTsKKwkJaWYgKCEoZmxhZ3MgJiBEQUVNT05fQ0xPU0VfRVhUUkFfRkRTKSkKKwkJCXJldHVybjsKKwkJLyogZWxzZSBjbG9zZSBldmVyeXRoaW5nIGFmdGVyIGZkIzIgKi8KKwl9Cit9CisKK3ZvaWQgRkFTVF9GVU5DIGJiX3Nhbml0aXplX3N0ZGlvKHZvaWQpCit7CisJYmJfZGFlbW9uaXplX29yX3JleGVjKERBRU1PTl9PTkxZX1NBTklUSVpFLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3dhcm5faWdub3JpbmdfYXJncy5jIGIvbGliYmIvd2Fybl9pZ25vcmluZ19hcmdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YzMDI1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3dhcm5faWdub3JpbmdfYXJncy5jCkBAIC0wLDAgKzEsMTggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHdhcm5faWdub3JpbmdfYXJncyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWYgRU5BQkxFX0RFU0tUT1AKK3ZvaWQgRkFTVF9GVU5DIGJiX3dhcm5faWdub3JpbmdfYXJncyhjaGFyICphcmcpCit7CisJaWYgKGFyZykgeworCQliYl9lcnJvcl9tc2coImlnbm9yaW5nIGFsbCBhcmd1bWVudHMiKTsKKwl9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmJiL3dmb3Blbi5jIGIvbGliYmIvd2ZvcGVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZkYzhiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3dmb3Blbi5jCkBAIC0wLDAgKzEsNTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK0ZJTEUqIEZBU1RfRlVOQyBmb3Blbl9vcl93YXJuKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKm1vZGUpCit7CisJRklMRSAqZnAgPSBmb3BlbihwYXRoLCBtb2RlKTsKKwlpZiAoIWZwKSB7CisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKHBhdGgpOworCQkvL2Vycm5vID0gMDsgLyogd2h5PyAqLworCX0KKwlyZXR1cm4gZnA7Cit9CisKK0ZJTEUqIEZBU1RfRlVOQyBmb3Blbl9mb3JfcmVhZChjb25zdCBjaGFyICpwYXRoKQoreworCXJldHVybiBmb3BlbihwYXRoLCAiciIpOworfQorCitGSUxFKiBGQVNUX0ZVTkMgeGZvcGVuX2Zvcl9yZWFkKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJcmV0dXJuIHhmb3BlbihwYXRoLCAiciIpOworfQorCitGSUxFKiBGQVNUX0ZVTkMgZm9wZW5fZm9yX3dyaXRlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJcmV0dXJuIGZvcGVuKHBhdGgsICJ3Iik7Cit9CisKK0ZJTEUqIEZBU1RfRlVOQyB4Zm9wZW5fZm9yX3dyaXRlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJcmV0dXJuIHhmb3BlbihwYXRoLCAidyIpOworfQorCitzdGF0aWMgRklMRSogeGZkb3Blbl9oZWxwZXIodW5zaWduZWQgZmRfYW5kX3J3X2JpdCkKK3sKKwlGSUxFKiBmcCA9IGZkb3BlbihmZF9hbmRfcndfYml0ID4+IDEsIGZkX2FuZF9yd19iaXQgJiAxID8gInciIDogInIiKTsKKwlpZiAoIWZwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfbWVtb3J5X2V4aGF1c3RlZCk7CisJcmV0dXJuIGZwOworfQorRklMRSogRkFTVF9GVU5DIHhmZG9wZW5fZm9yX3JlYWQoaW50IGZkKQoreworCXJldHVybiB4ZmRvcGVuX2hlbHBlcihmZCA8PCAxKTsKK30KK0ZJTEUqIEZBU1RfRlVOQyB4ZmRvcGVuX2Zvcl93cml0ZShpbnQgZmQpCit7CisJcmV0dXJuIHhmZG9wZW5faGVscGVyKChmZCA8PCAxKSArIDEpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIvd2ZvcGVuX2lucHV0LmMgYi9saWJiYi93Zm9wZW5faW5wdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGIxYzRhCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvd2ZvcGVuX2lucHV0LmMKQEAgLTAsMCArMSw1NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogd2ZvcGVuX2lucHV0IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBNYW51ZWwgTm92b2EgSUlJICA8bWpuM0Bjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBBIG51bWJlciBvZiBhcHBsZXRzIG5lZWQgdG8gb3BlbiBhIGZpbGUgZm9yIHJlYWRpbmcsIHdoZXJlIHRoZSBmaWxlbmFtZQorICogaXMgYSBjb21tYW5kIGxpbmUgYXJnLiAgU2luY2Ugb2Z0ZW4gdGhhdCBhcmcgaXMgJy0nIChtZWFuaW5nIHN0ZGluKSwKKyAqIHdlIGF2b2lkIHRlc3RpbmcgZXZlcnl3aGVyZSBieSBjb25zb2xpZGF0aW5nIHRoaW5ncyBpbiB0aGlzIHJvdXRpbmUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK0ZJTEUqIEZBU1RfRlVOQyBmb3Blbl9vcl93YXJuX3N0ZGluKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCUZJTEUgKmZwID0gc3RkaW47CisKKwlpZiAoZmlsZW5hbWUgIT0gYmJfbXNnX3N0YW5kYXJkX2lucHV0CisJICYmIE5PVF9MT05FX0RBU0goZmlsZW5hbWUpCisJKSB7CisJCWZwID0gZm9wZW5fb3Jfd2FybihmaWxlbmFtZSwgInIiKTsKKwl9CisJcmV0dXJuIGZwOworfQorCitGSUxFKiBGQVNUX0ZVTkMgeGZvcGVuX3N0ZGluKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCUZJTEUgKmZwID0gZm9wZW5fb3Jfd2Fybl9zdGRpbihmaWxlbmFtZSk7CisJaWYgKGZwKQorCQlyZXR1cm4gZnA7CisJeGZ1bmNfZGllKCk7ICAvKiBXZSBhbHJlYWR5IG91dHB1dCBhbiBlcnJvciBtZXNzYWdlLiAqLworfQorCitpbnQgRkFTVF9GVU5DIG9wZW5fb3Jfd2Fybl9zdGRpbihjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlpbnQgZmQgPSBTVERJTl9GSUxFTk87CisKKwlpZiAoZmlsZW5hbWUgIT0gYmJfbXNnX3N0YW5kYXJkX2lucHV0CisJICYmIE5PVF9MT05FX0RBU0goZmlsZW5hbWUpCisJKSB7CisJCWZkID0gb3Blbl9vcl93YXJuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJfQorCisJcmV0dXJuIGZkOworfQorCitpbnQgRkFTVF9GVU5DIHhvcGVuX3N0ZGluKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWludCBmZCA9IG9wZW5fb3Jfd2Fybl9zdGRpbihmaWxlbmFtZSk7CisJaWYgKGZkID49IDApCisJCXJldHVybiBmZDsKKwl4ZnVuY19kaWUoKTsgIC8qIFdlIGFscmVhZHkgb3V0cHV0IGFuIGVycm9yIG1lc3NhZ2UuICovCit9CmRpZmYgLS1naXQgYS9saWJiYi93cml0ZS5jIGIvbGliYmIvd3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDY3YTcyCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIvd3JpdGUuYwpAQCAtMCwwICsxLDE5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBPcGVuIGZpbGUgYW5kIHdyaXRlIHN0cmluZyBzdHIgdG8gaXQsIGNsb3NlIGZpbGUuCisgKiBEaWUgb24gYW55IG9wZW4gb3Igd3JpdGUgZXJyb3IuICAqLwordm9pZCBGQVNUX0ZVTkMgeG9wZW5feHdyaXRlX2Nsb3NlKGNvbnN0IGNoYXIqIGZpbGUsIGNvbnN0IGNoYXIqIHN0cikKK3sKKwlpbnQgZmQgPSB4b3BlbihmaWxlLCBPX1dST05MWSk7CisJeHdyaXRlX3N0cihmZCwgc3RyKTsKKwljbG9zZShmZCk7Cit9CmRpZmYgLS1naXQgYS9saWJiYi94YXRvbnVtLmMgYi9saWJiYi94YXRvbnVtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRkNWMzZQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3hhdG9udW0uYwpAQCAtMCwwICsxLDk4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBhc2NpaS10by1udW1iZXJzIGltcGxlbWVudGF0aW9ucyBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgdHlwZSBsb25nIGxvbmcKKyNkZWZpbmUgeHN0cnRvdShyZXN0KSB4c3RydG91bGwjI3Jlc3QKKyNkZWZpbmUgeHN0cnRvKHJlc3QpIHhzdHJ0b2xsIyNyZXN0CisjZGVmaW5lIHhhdG91KHJlc3QpIHhhdG91bGwjI3Jlc3QKKyNkZWZpbmUgeGF0byhyZXN0KSB4YXRvbGwjI3Jlc3QKKyNkZWZpbmUgWFNUUl9VVFlQRV9NQVggVUxMT05HX01BWAorI2RlZmluZSBYU1RSX1RZUEVfTUFYIExMT05HX01BWAorI2RlZmluZSBYU1RSX1RZUEVfTUlOIExMT05HX01JTgorI2RlZmluZSBYU1RSX1NUUlRPVSBzdHJ0b3VsbAorI2luY2x1ZGUgInhhdG9udW1fdGVtcGxhdGUuYyIKKworI2lmIFVMT05HX01BWCAhPSBVTExPTkdfTUFYCisjZGVmaW5lIHR5cGUgbG9uZworI2RlZmluZSB4c3RydG91KHJlc3QpIHhzdHJ0b3VsIyNyZXN0CisjZGVmaW5lIHhzdHJ0byhyZXN0KSB4c3RydG9sIyNyZXN0CisjZGVmaW5lIHhhdG91KHJlc3QpIHhhdG91bCMjcmVzdAorI2RlZmluZSB4YXRvKHJlc3QpIHhhdG9sIyNyZXN0CisjZGVmaW5lIFhTVFJfVVRZUEVfTUFYIFVMT05HX01BWAorI2RlZmluZSBYU1RSX1RZUEVfTUFYIExPTkdfTUFYCisjZGVmaW5lIFhTVFJfVFlQRV9NSU4gTE9OR19NSU4KKyNkZWZpbmUgWFNUUl9TVFJUT1Ugc3RydG91bAorI2luY2x1ZGUgInhhdG9udW1fdGVtcGxhdGUuYyIKKyNlbmRpZgorCisjaWYgVUlOVF9NQVggIT0gVUxPTkdfTUFYCitzdGF0aWMgQUxXQVlTX0lOTElORQordW5zaWduZWQgYmJfc3RydG91aShjb25zdCBjaGFyICpzdHIsIGNoYXIgKiplbmQsIGludCBiKQoreworCXVuc2lnbmVkIGxvbmcgdiA9IHN0cnRvdWwoc3RyLCBlbmQsIGIpOworCWlmICh2ID4gVUlOVF9NQVgpIHsKKwkJZXJybm8gPSBFUkFOR0U7CisJCXJldHVybiBVSU5UX01BWDsKKwl9CisJcmV0dXJuIHY7Cit9CisjZGVmaW5lIHR5cGUgaW50CisjZGVmaW5lIHhzdHJ0b3UocmVzdCkgeHN0cnRvdSMjcmVzdAorI2RlZmluZSB4c3RydG8ocmVzdCkgeHN0cnRvaSMjcmVzdAorI2RlZmluZSB4YXRvdShyZXN0KSB4YXRvdSMjcmVzdAorI2RlZmluZSB4YXRvKHJlc3QpIHhhdG9pIyNyZXN0CisjZGVmaW5lIFhTVFJfVVRZUEVfTUFYIFVJTlRfTUFYCisjZGVmaW5lIFhTVFJfVFlQRV9NQVggSU5UX01BWAorI2RlZmluZSBYU1RSX1RZUEVfTUlOIElOVF9NSU4KKy8qIGxpYmMgaGFzIG5vIHN0cnRvdWksIHNvIHdlIG5lZWQgdG8gY3JlYXRlL3VzZSBvdXIgb3duICovCisjZGVmaW5lIFhTVFJfU1RSVE9VIGJiX3N0cnRvdWkKKyNpbmNsdWRlICJ4YXRvbnVtX3RlbXBsYXRlLmMiCisjZW5kaWYKKworLyogQSBmZXcgc3BlY2lhbCBjYXNlcyAqLworCitpbnQgRkFTVF9GVU5DIHhhdG9pX3Bvc2l0aXZlKGNvbnN0IGNoYXIgKm51bXN0cikKK3sKKwlyZXR1cm4geGF0b3VfcmFuZ2UobnVtc3RyLCAwLCBJTlRfTUFYKTsKK30KKwordWludDE2X3QgRkFTVF9GVU5DIHhhdG91MTYoY29uc3QgY2hhciAqbnVtc3RyKQoreworCXJldHVybiB4YXRvdV9yYW5nZShudW1zdHIsIDAsIDB4ZmZmZik7Cit9CisKK2NvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCBia21fc3VmZml4ZXNbXSA9IHsKKwl7ICJiIiwgNTEyIH0sCisJeyAiayIsIDEwMjQgfSwKKwl7ICJtIiwgMTAyNCoxMDI0IH0sCisJeyAiIiwgMCB9Cit9OworCitjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgY3dia01HX3N1ZmZpeGVzW10gPSB7CisJeyAiYyIsIDEgfSwKKwl7ICJ3IiwgMiB9LAorCXsgImIiLCA1MTIgfSwKKwl7ICJrQiIsIDEwMDAgfSwKKwl7ICJrRCIsIDEwMDAgfSwKKwl7ICJrIiwgMTAyNCB9LAorCXsgIktCIiwgMTAwMCB9LCAvKiBjb21wYXQgd2l0aCBjb3JldXRpbHMgZGQgKi8KKwl7ICJLRCIsIDEwMDAgfSwgLyogY29tcGF0IHdpdGggY29yZXV0aWxzIGRkICovCisJeyAiSyIsIDEwMjQgfSwgIC8qIGNvbXBhdCB3aXRoIGNvcmV1dGlscyBkZCAqLworCXsgIk1CIiwgMTAwMDAwMCB9LAorCXsgIk1EIiwgMTAwMDAwMCB9LAorCXsgIk0iLCAxMDI0KjEwMjQgfSwKKwl7ICJHQiIsIDEwMDAwMDAwMDAgfSwKKwl7ICJHRCIsIDEwMDAwMDAwMDAgfSwKKwl7ICJHIiwgMTAyNCoxMDI0KjEwMjQgfSwKKwkvKiAiRCIgc3VmZml4IGZvciBkZWNpbWFsIGlzIG5vdCBpbiBjb3JldXRpbHMgbWFucGFnZSwgbG9va3MgbGlrZSBpdCdzIGRlcHJlY2F0ZWQgKi8KKwkvKiBjb3JldXRpbHMgYWxzbyB1bmRlcnN0YW5kcyBUUEVaWSBzdWZmaXhlcyBmb3IgdGVyYS0gYW5kIHNvIG9uLCB3aXRoIEIgc3VmZml4IGZvciBkZWNpbWFsICovCisJeyAiIiwgMCB9Cit9OwpkaWZmIC0tZ2l0IGEvbGliYmIveGF0b251bV90ZW1wbGF0ZS5jIGIvbGliYmIveGF0b251bV90ZW1wbGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNDcxOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi94YXRvbnVtX3RlbXBsYXRlLmMKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworLyoKK1lvdSBuZWVkIHRvIGRlZmluZSB0aGUgZm9sbG93aW5nIChleGFtcGxlKToKKworI2RlZmluZSB0eXBlIGxvbmcKKyNkZWZpbmUgeHN0cnRvdShyZXN0KSB4c3RydG91bCMjcmVzdAorI2RlZmluZSB4c3RydG8ocmVzdCkgeHN0cnRvbCMjcmVzdAorI2RlZmluZSB4YXRvdShyZXN0KSB4YXRvdWwjI3Jlc3QKKyNkZWZpbmUgeGF0byhyZXN0KSB4YXRvbCMjcmVzdAorI2RlZmluZSBYU1RSX1VUWVBFX01BWCBVTE9OR19NQVgKKyNkZWZpbmUgWFNUUl9UWVBFX01BWCBMT05HX01BWAorI2RlZmluZSBYU1RSX1RZUEVfTUlOIExPTkdfTUlOCisjZGVmaW5lIFhTVFJfU1RSVE9VIHN0cnRvdWwKKyovCisKK3Vuc2lnbmVkIHR5cGUgRkFTVF9GVU5DIHhzdHJ0b3UoX3JhbmdlX3NmeCkoY29uc3QgY2hhciAqbnVtc3RyLCBpbnQgYmFzZSwKKwkJdW5zaWduZWQgdHlwZSBsb3dlciwKKwkJdW5zaWduZWQgdHlwZSB1cHBlciwKKwkJY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzdWZmaXhlcykKK3sKKwl1bnNpZ25lZCB0eXBlIHI7CisJaW50IG9sZF9lcnJubzsKKwljaGFyICplOworCisJLyogRGlzYWxsb3cgJy0nIGFuZCBhbnkgbGVhZGluZyB3aGl0ZXNwYWNlLiAqLworCWlmICgqbnVtc3RyID09ICctJyB8fCAqbnVtc3RyID09ICcrJyB8fCBpc3NwYWNlKCpudW1zdHIpKQorCQlnb3RvIGludmFsOworCisJLyogU2luY2UgdGhpcyBpcyBhIGxpYiBmdW5jdGlvbiwgd2UncmUgbm90IGFsbG93ZWQgdG8gcmVzZXQgZXJybm8gdG8gMC4KKwkgKiBEb2luZyBzbyBjb3VsZCBicmVhayBhbiBhcHAgdGhhdCBpcyBkZWZlcnJpbmcgY2hlY2tpbmcgb2YgZXJybm8uCisJICogU28sIHNhdmUgdGhlIG9sZCB2YWx1ZSBzbyB0aGF0IHdlIGNhbiByZXN0b3JlIGl0IGlmIHN1Y2Nlc3NmdWwuICovCisJb2xkX2Vycm5vID0gZXJybm87CisJZXJybm8gPSAwOworCXIgPSBYU1RSX1NUUlRPVShudW1zdHIsICZlLCBiYXNlKTsKKwkvKiBEbyB0aGUgaW5pdGlhbCB2YWxpZGl0eSBjaGVjay4gIE5vdGU6IFRoZSBzdGFuZGFyZHMgZG8gbm90CisJICogZ3VhcmFudGVlIHRoYXQgZXJybm8gaXMgc2V0IGlmIG5vIGRpZ2l0cyB3ZXJlIGZvdW5kLiAgU28gd2UKKwkgKiBtdXN0IHRlc3QgZm9yIHRoaXMgZXhwbGljaXRseS4gKi8KKwlpZiAoZXJybm8gfHwgbnVtc3RyID09IGUpCisJCWdvdG8gaW52YWw7IC8qIGVycm9yIC8gbm8gZGlnaXRzIC8gaWxsZWdhbCB0cmFpbGluZyBjaGFycyAqLworCisJZXJybm8gPSBvbGRfZXJybm87ICAvKiBPay4gIFNvIHJlc3RvcmUgZXJybm8uICovCisKKwkvKiBEbyBvcHRpb25hbCBzdWZmaXggcGFyc2luZy4gIEFsbG93ICdlbXB0eScgc3VmZml4IHRhYmxlcy4KKwkgKiBOb3RlIHRoYXQgd2UgYWxzbyBhbGxvdyBudWwgc3VmZml4ZXMgd2l0aCBhc3NvY2lhdGVkIG11bHRpcGxpZXJzLAorCSAqIHRvIGFsbG93IGZvciBzY2FsaW5nIG9mIHRoZSBudW1zdHIgYnkgc29tZSBkZWZhdWx0IG11bHRpcGxpZXIuICovCisJaWYgKHN1ZmZpeGVzKSB7CisJCXdoaWxlIChzdWZmaXhlcy0+bXVsdCkgeworCQkJaWYgKHN0cmNtcChzdWZmaXhlcy0+c3VmZml4LCBlKSA9PSAwKSB7CisJCQkJaWYgKFhTVFJfVVRZUEVfTUFYIC8gc3VmZml4ZXMtPm11bHQgPCByKQorCQkJCQlnb3RvIHJhbmdlOyAvKiBvdmVyZmxvdyEgKi8KKwkJCQlyICo9IHN1ZmZpeGVzLT5tdWx0OworCQkJCWdvdG8gY2hrX3JhbmdlOworCQkJfQorCQkJKytzdWZmaXhlczsKKwkJfQorCX0KKworCS8qIE5vdGU6IHRyYWlsaW5nIHNwYWNlIGlzIGFuIGVycm9yLgorCSAqIEl0IHdvdWxkIGJlIGVhc3kgZW5vdWdoIHRvIGFsbG93IHRob3VnaCBpZiBkZXNpcmVkLiAqLworCWlmICgqZSkKKwkJZ290byBpbnZhbDsKKyBjaGtfcmFuZ2U6CisJLyogRmluYWxseSwgY2hlY2sgZm9yIHJhbmdlIGxpbWl0cy4gKi8KKwlpZiAociA+PSBsb3dlciAmJiByIDw9IHVwcGVyKQorCQlyZXR1cm4gcjsKKyByYW5nZToKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgibnVtYmVyICVzIGlzIG5vdCBpbiAlbGx1Li4lbGx1IHJhbmdlIiwKKwkJbnVtc3RyLCAodW5zaWduZWQgbG9uZyBsb25nKWxvd2VyLAorCQkodW5zaWduZWQgbG9uZyBsb25nKXVwcGVyKTsKKyBpbnZhbDoKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBudW1iZXIgJyVzJyIsIG51bXN0cik7Cit9CisKK3Vuc2lnbmVkIHR5cGUgRkFTVF9GVU5DIHhzdHJ0b3UoX3JhbmdlKShjb25zdCBjaGFyICpudW1zdHIsIGludCBiYXNlLAorCQl1bnNpZ25lZCB0eXBlIGxvd2VyLAorCQl1bnNpZ25lZCB0eXBlIHVwcGVyKQoreworCXJldHVybiB4c3RydG91KF9yYW5nZV9zZngpKG51bXN0ciwgYmFzZSwgbG93ZXIsIHVwcGVyLCBOVUxMKTsKK30KKwordW5zaWduZWQgdHlwZSBGQVNUX0ZVTkMgeHN0cnRvdShfc2Z4KShjb25zdCBjaGFyICpudW1zdHIsIGludCBiYXNlLAorCQljb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgKnN1ZmZpeGVzKQoreworCXJldHVybiB4c3RydG91KF9yYW5nZV9zZngpKG51bXN0ciwgYmFzZSwgMCwgWFNUUl9VVFlQRV9NQVgsIHN1ZmZpeGVzKTsKK30KKwordW5zaWduZWQgdHlwZSBGQVNUX0ZVTkMgeHN0cnRvdSgpKGNvbnN0IGNoYXIgKm51bXN0ciwgaW50IGJhc2UpCit7CisJcmV0dXJuIHhzdHJ0b3UoX3JhbmdlX3NmeCkobnVtc3RyLCBiYXNlLCAwLCBYU1RSX1VUWVBFX01BWCwgTlVMTCk7Cit9CisKK3Vuc2lnbmVkIHR5cGUgRkFTVF9GVU5DIHhhdG91KF9yYW5nZV9zZngpKGNvbnN0IGNoYXIgKm51bXN0ciwKKwkJdW5zaWduZWQgdHlwZSBsb3dlciwKKwkJdW5zaWduZWQgdHlwZSB1cHBlciwKKwkJY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzdWZmaXhlcykKK3sKKwlyZXR1cm4geHN0cnRvdShfcmFuZ2Vfc2Z4KShudW1zdHIsIDEwLCBsb3dlciwgdXBwZXIsIHN1ZmZpeGVzKTsKK30KKwordW5zaWduZWQgdHlwZSBGQVNUX0ZVTkMgeGF0b3UoX3JhbmdlKShjb25zdCBjaGFyICpudW1zdHIsCisJCXVuc2lnbmVkIHR5cGUgbG93ZXIsCisJCXVuc2lnbmVkIHR5cGUgdXBwZXIpCit7CisJcmV0dXJuIHhzdHJ0b3UoX3JhbmdlX3NmeCkobnVtc3RyLCAxMCwgbG93ZXIsIHVwcGVyLCBOVUxMKTsKK30KKwordW5zaWduZWQgdHlwZSBGQVNUX0ZVTkMgeGF0b3UoX3NmeCkoY29uc3QgY2hhciAqbnVtc3RyLAorCQljb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgKnN1ZmZpeGVzKQoreworCXJldHVybiB4c3RydG91KF9yYW5nZV9zZngpKG51bXN0ciwgMTAsIDAsIFhTVFJfVVRZUEVfTUFYLCBzdWZmaXhlcyk7Cit9CisKK3Vuc2lnbmVkIHR5cGUgRkFTVF9GVU5DIHhhdG91KCkoY29uc3QgY2hhciAqbnVtc3RyKQoreworCXJldHVybiB4YXRvdShfc2Z4KShudW1zdHIsIE5VTEwpOworfQorCisvKiBTaWduZWQgb25lcyAqLworCit0eXBlIEZBU1RfRlVOQyB4c3RydG8oX3JhbmdlX3NmeCkoY29uc3QgY2hhciAqbnVtc3RyLCBpbnQgYmFzZSwKKwkJdHlwZSBsb3dlciwKKwkJdHlwZSB1cHBlciwKKwkJY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzdWZmaXhlcykKK3sKKwl1bnNpZ25lZCB0eXBlIHUgPSBYU1RSX1RZUEVfTUFYOworCXR5cGUgcjsKKwljb25zdCBjaGFyICpwID0gbnVtc3RyOworCisJLyogTkI6IGlmIHlvdSdsbCBkZWNpZGUgdG8gZGlzYWxsb3cgJysnOgorCSAqIGF0IGxlYXN0IHJlbmljZSBhcHBsZXQgbmVlZHMgdG8gYWxsb3cgaXQgKi8KKwlpZiAocFswXSA9PSAnKycgfHwgcFswXSA9PSAnLScpIHsKKwkJKytwOworCQlpZiAocFswXSA9PSAnLScpCisJCQkrK3U7IC8qID0gPHR5cGU+X01JTiAoMDExMTEuLi4gKyAxID09IDEwMDAwLi4uKSAqLworCX0KKworCXIgPSB4c3RydG91KF9yYW5nZV9zZngpKHAsIGJhc2UsIDAsIHUsIHN1ZmZpeGVzKTsKKworCWlmICgqbnVtc3RyID09ICctJykgeworCQlyID0gLXI7CisJfQorCisJaWYgKHIgPCBsb3dlciB8fCByID4gdXBwZXIpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm51bWJlciAlcyBpcyBub3QgaW4gJWxsZC4uJWxsZCByYW5nZSIsCisJCQkJbnVtc3RyLCAobG9uZyBsb25nKWxvd2VyLCAobG9uZyBsb25nKXVwcGVyKTsKKwl9CisKKwlyZXR1cm4gcjsKK30KKwordHlwZSBGQVNUX0ZVTkMgeHN0cnRvKF9yYW5nZSkoY29uc3QgY2hhciAqbnVtc3RyLCBpbnQgYmFzZSwgdHlwZSBsb3dlciwgdHlwZSB1cHBlcikKK3sKKwlyZXR1cm4geHN0cnRvKF9yYW5nZV9zZngpKG51bXN0ciwgYmFzZSwgbG93ZXIsIHVwcGVyLCBOVUxMKTsKK30KKwordHlwZSBGQVNUX0ZVTkMgeHN0cnRvKCkoY29uc3QgY2hhciAqbnVtc3RyLCBpbnQgYmFzZSkKK3sKKwlyZXR1cm4geHN0cnRvKF9yYW5nZV9zZngpKG51bXN0ciwgYmFzZSwgWFNUUl9UWVBFX01JTiwgWFNUUl9UWVBFX01BWCwgTlVMTCk7Cit9CisKK3R5cGUgRkFTVF9GVU5DIHhhdG8oX3JhbmdlX3NmeCkoY29uc3QgY2hhciAqbnVtc3RyLAorCQl0eXBlIGxvd2VyLAorCQl0eXBlIHVwcGVyLAorCQljb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgKnN1ZmZpeGVzKQoreworCXJldHVybiB4c3RydG8oX3JhbmdlX3NmeCkobnVtc3RyLCAxMCwgbG93ZXIsIHVwcGVyLCBzdWZmaXhlcyk7Cit9CisKK3R5cGUgRkFTVF9GVU5DIHhhdG8oX3JhbmdlKShjb25zdCBjaGFyICpudW1zdHIsIHR5cGUgbG93ZXIsIHR5cGUgdXBwZXIpCit7CisJcmV0dXJuIHhzdHJ0byhfcmFuZ2Vfc2Z4KShudW1zdHIsIDEwLCBsb3dlciwgdXBwZXIsIE5VTEwpOworfQorCit0eXBlIEZBU1RfRlVOQyB4YXRvKF9zZngpKGNvbnN0IGNoYXIgKm51bXN0ciwgY29uc3Qgc3RydWN0IHN1ZmZpeF9tdWx0ICpzdWZmaXhlcykKK3sKKwlyZXR1cm4geHN0cnRvKF9yYW5nZV9zZngpKG51bXN0ciwgMTAsIFhTVFJfVFlQRV9NSU4sIFhTVFJfVFlQRV9NQVgsIHN1ZmZpeGVzKTsKK30KKwordHlwZSBGQVNUX0ZVTkMgeGF0bygpKGNvbnN0IGNoYXIgKm51bXN0cikKK3sKKwlyZXR1cm4geHN0cnRvKF9yYW5nZV9zZngpKG51bXN0ciwgMTAsIFhTVFJfVFlQRV9NSU4sIFhTVFJfVFlQRV9NQVgsIE5VTEwpOworfQorCisjdW5kZWYgdHlwZQorI3VuZGVmIHhzdHJ0b3UKKyN1bmRlZiB4c3RydG8KKyN1bmRlZiB4YXRvdQorI3VuZGVmIHhhdG8KKyN1bmRlZiBYU1RSX1VUWVBFX01BWAorI3VuZGVmIFhTVFJfVFlQRV9NQVgKKyN1bmRlZiBYU1RSX1RZUEVfTUlOCisjdW5kZWYgWFNUUl9TVFJUT1UKZGlmZiAtLWdpdCBhL2xpYmJiL3hjb25uZWN0LmMgYi9saWJiYi94Y29ubmVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNzhlNjMKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi94Y29ubmVjdC5jCkBAIC0wLDAgKzEsNTA3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvbm5lY3QgdG8gaG9zdCBhdCBwb3J0IHVzaW5nIGFkZHJlc3MgcmVzb2x1dGlvbiBmcm9tIGdldGFkZHJpbmZvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPiAvKiBuZXRpbmV0L2luLmggbmVlZHMgaXQgKi8KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8c3lzL3VuLmg+CisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IEZBU1RfRlVOQyBzZXRzb2Nrb3B0X2ludChpbnQgZmQsIGludCBsZXZlbCwgaW50IG9wdG5hbWUsIGludCBvcHR2YWwpCit7CisJcmV0dXJuIHNldHNvY2tvcHQoZmQsIGxldmVsLCBvcHRuYW1lLCAmb3B0dmFsLCBzaXplb2YoaW50KSk7Cit9CitpbnQgRkFTVF9GVU5DIHNldHNvY2tvcHRfMShpbnQgZmQsIGludCBsZXZlbCwgaW50IG9wdG5hbWUpCit7CisJcmV0dXJuIHNldHNvY2tvcHRfaW50KGZkLCBsZXZlbCwgb3B0bmFtZSwgMSk7Cit9CitpbnQgRkFTVF9GVU5DIHNldHNvY2tvcHRfU09MX1NPQ0tFVF9pbnQoaW50IGZkLCBpbnQgb3B0bmFtZSwgaW50IG9wdHZhbCkKK3sKKwlyZXR1cm4gc2V0c29ja29wdF9pbnQoZmQsIFNPTF9TT0NLRVQsIG9wdG5hbWUsIG9wdHZhbCk7Cit9CitpbnQgRkFTVF9GVU5DIHNldHNvY2tvcHRfU09MX1NPQ0tFVF8xKGludCBmZCwgaW50IG9wdG5hbWUpCit7CisJcmV0dXJuIHNldHNvY2tvcHRfU09MX1NPQ0tFVF9pbnQoZmQsIG9wdG5hbWUsIDEpOworfQorCit2b2lkIEZBU1RfRlVOQyBzZXRzb2Nrb3B0X3JldXNlYWRkcihpbnQgZmQpCit7CisJc2V0c29ja29wdF9TT0xfU09DS0VUXzEoZmQsIFNPX1JFVVNFQUREUik7Cit9CitpbnQgRkFTVF9GVU5DIHNldHNvY2tvcHRfYnJvYWRjYXN0KGludCBmZCkKK3sKKwlyZXR1cm4gc2V0c29ja29wdF9TT0xfU09DS0VUXzEoZmQsIFNPX0JST0FEQ0FTVCk7Cit9CitpbnQgRkFTVF9GVU5DIHNldHNvY2tvcHRfa2VlcGFsaXZlKGludCBmZCkKK3sKKwlyZXR1cm4gc2V0c29ja29wdF9TT0xfU09DS0VUXzEoZmQsIFNPX0tFRVBBTElWRSk7Cit9CisKKyNpZmRlZiBTT19CSU5EVE9ERVZJQ0UKK2ludCBGQVNUX0ZVTkMgc2V0c29ja29wdF9iaW5kdG9kZXZpY2UoaW50IGZkLCBjb25zdCBjaGFyICppZmFjZSkKK3sKKwlpbnQgcjsKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBpZmFjZSk7CisJLyogTkI6IHBhc3NpbmcgKGlmYWNlLCBzdHJsZW4oaWZhY2UpICsgMSkgZG9lcyBub3Qgd29yayEKKwkgKiAobWF5YmUgaXQgd29ya3Mgb24gX3NvbWVfIGtlcm5lbHMsIGJ1dCBub3Qgb24gMi42LjI2KQorCSAqIEFjdHVhbGx5LCBpZnJfbmFtZSBpcyBhdCBvZmZzZXQgMCwgYW5kIGluIHByYWN0aWNlCisJICoganVzdCBnaXZpbmcgY2hhcltJRk5BTVNJWl0gaW5zdGVhZCBvZiBzdHJ1Y3QgaWZyZXEgd29ya3MgdG9vLgorCSAqIEJ1dCBqdXN0IGluIGNhc2UgaXQncyBub3QgdHJ1ZSBvbiBzb21lIG9ic2N1cmUgYXJjaC4uLiAqLworCXIgPSBzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19CSU5EVE9ERVZJQ0UsICZpZnIsIHNpemVvZihpZnIpKTsKKwlpZiAocikKKwkJYmJfcGVycm9yX21zZygiY2FuJ3QgYmluZCB0byBpbnRlcmZhY2UgJXMiLCBpZmFjZSk7CisJcmV0dXJuIHI7Cit9CisjZWxzZQoraW50IEZBU1RfRlVOQyBzZXRzb2Nrb3B0X2JpbmR0b2RldmljZShpbnQgZmQgVU5VU0VEX1BBUkFNLAorCQljb25zdCBjaGFyICppZmFjZSBVTlVTRURfUEFSQU0pCit7CisJYmJfZXJyb3JfbXNnKCJTT19CSU5EVE9ERVZJQ0UgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGlzIHN5c3RlbSIpOworCXJldHVybiAtMTsKK30KKyNlbmRpZgorCitzdGF0aWMgbGVuX2FuZF9zb2NrYWRkciogZ2V0X2xzYShpbnQgZmQsIGludCAoKmdldF9uYW1lKShpbnQgZmQsIHN0cnVjdCBzb2NrYWRkciAqYWRkciwgc29ja2xlbl90ICphZGRybGVuKSkKK3sKKwlsZW5fYW5kX3NvY2thZGRyIGxzYTsKKwlsZW5fYW5kX3NvY2thZGRyICpsc2FfcHRyOworCisJbHNhLmxlbiA9IExTQV9TSVpFT0ZfU0E7CisJaWYgKGdldF9uYW1lKGZkLCAmbHNhLnUuc2EsICZsc2EubGVuKSAhPSAwKQorCQlyZXR1cm4gTlVMTDsKKworCWxzYV9wdHIgPSB4emFsbG9jKExTQV9MRU5fU0laRSArIGxzYS5sZW4pOworCWlmIChsc2EubGVuID4gTFNBX1NJWkVPRl9TQSkgeyAvKiByYXJlbHkgKGlmIGV2ZXIpIGhhcHBlbnMgKi8KKwkJbHNhX3B0ci0+bGVuID0gbHNhLmxlbjsKKwkJZ2V0X25hbWUoZmQsICZsc2FfcHRyLT51LnNhLCAmbHNhX3B0ci0+bGVuKTsKKwl9IGVsc2UgeworCQltZW1jcHkobHNhX3B0ciwgJmxzYSwgTFNBX0xFTl9TSVpFICsgbHNhLmxlbik7CisJfQorCXJldHVybiBsc2FfcHRyOworfQorCitsZW5fYW5kX3NvY2thZGRyKiBGQVNUX0ZVTkMgZ2V0X3NvY2tfbHNhKGludCBmZCkKK3sKKwlyZXR1cm4gZ2V0X2xzYShmZCwgZ2V0c29ja25hbWUpOworfQorCitsZW5fYW5kX3NvY2thZGRyKiBGQVNUX0ZVTkMgZ2V0X3BlZXJfbHNhKGludCBmZCkKK3sKKwlyZXR1cm4gZ2V0X2xzYShmZCwgZ2V0cGVlcm5hbWUpOworfQorCit2b2lkIEZBU1RfRlVOQyB4Y29ubmVjdChpbnQgcywgY29uc3Qgc3RydWN0IHNvY2thZGRyICpzX2FkZHIsIHNvY2tsZW5fdCBhZGRybGVuKQoreworCWlmIChjb25uZWN0KHMsIHNfYWRkciwgYWRkcmxlbikgPCAwKSB7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWNsb3NlKHMpOworCQlpZiAoc19hZGRyLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiJXMgKCVzKSIsCisJCQkJImNhbid0IGNvbm5lY3QgdG8gcmVtb3RlIGhvc3QiLAorCQkJCWluZXRfbnRvYSgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKXNfYWRkciktPnNpbl9hZGRyKSk7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgY29ubmVjdCB0byByZW1vdGUgaG9zdCIpOworCX0KK30KKworLyogUmV0dXJuIHBvcnQgbnVtYmVyIGZvciBhIHNlcnZpY2UuCisgKiBJZiAicG9ydCIgaXMgYSBudW1iZXIgdXNlIGl0IGFzIHRoZSBwb3J0LgorICogSWYgInBvcnQiIGlzIGEgbmFtZSBpdCBpcyBsb29rZWQgdXAgaW4gL2V0Yy9zZXJ2aWNlcywKKyAqIGlmIGl0IGlzbnQgZm91bmQgcmV0dXJuIGRlZmF1bHRfcG9ydAorICovCit1bnNpZ25lZCBGQVNUX0ZVTkMgYmJfbG9va3VwX3BvcnQoY29uc3QgY2hhciAqcG9ydCwgY29uc3QgY2hhciAqcHJvdG9jb2wsIHVuc2lnbmVkIGRlZmF1bHRfcG9ydCkKK3sKKwl1bnNpZ25lZCBwb3J0X25yID0gZGVmYXVsdF9wb3J0OworCWlmIChwb3J0KSB7CisJCWludCBvbGRfZXJybm87CisKKwkJLyogU2luY2UgdGhpcyBpcyBhIGxpYiBmdW5jdGlvbiwgd2UncmUgbm90IGFsbG93ZWQgdG8gcmVzZXQgZXJybm8gdG8gMC4KKwkJICogRG9pbmcgc28gY291bGQgYnJlYWsgYW4gYXBwIHRoYXQgaXMgZGVmZXJyaW5nIGNoZWNraW5nIG9mIGVycm5vLiAqLworCQlvbGRfZXJybm8gPSBlcnJubzsKKwkJcG9ydF9uciA9IGJiX3N0cnRvdShwb3J0LCBOVUxMLCAxMCk7CisJCWlmIChlcnJubyB8fCBwb3J0X25yID4gNjU1MzUpIHsKKwkJCXN0cnVjdCBzZXJ2ZW50ICp0c2VydiA9IGdldHNlcnZieW5hbWUocG9ydCwgcHJvdG9jb2wpOworCQkJcG9ydF9uciA9IGRlZmF1bHRfcG9ydDsKKwkJCWlmICh0c2VydikKKwkJCQlwb3J0X25yID0gbnRvaHModHNlcnYtPnNfcG9ydCk7CisJCX0KKwkJZXJybm8gPSBvbGRfZXJybm87CisJfQorCXJldHVybiAodWludDE2X3QpcG9ydF9ucjsKK30KKworCisvKiAiTmV3IiBuZXR3b3JraW5nIEFQSSAqLworCisKK2ludCBGQVNUX0ZVTkMgZ2V0X25wb3J0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EpCit7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCWlmIChzYS0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCXJldHVybiAoKHN0cnVjdCBzb2NrYWRkcl9pbjYqKXNhKS0+c2luNl9wb3J0OworCX0KKyNlbmRpZgorCWlmIChzYS0+c2FfZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJcmV0dXJuICgoc3RydWN0IHNvY2thZGRyX2luKilzYSktPnNpbl9wb3J0OworCX0KKwkvKiBXaGF0PyBVTklYIHNvY2tldD8gSVBYPz8gOikgKi8KKwlyZXR1cm4gLTE7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHNldF9ucG9ydChzdHJ1Y3Qgc29ja2FkZHIgKnNhLCB1bnNpZ25lZCBwb3J0KQoreworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwlpZiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW42ICpzaW42ID0gKHZvaWQqKSBzYTsKKwkJc2luNi0+c2luNl9wb3J0ID0gcG9ydDsKKwkJcmV0dXJuOworCX0KKyNlbmRpZgorCWlmIChzYS0+c2FfZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJc3RydWN0IHNvY2thZGRyX2luICpzaW4gPSAodm9pZCopIHNhOworCQlzaW4tPnNpbl9wb3J0ID0gcG9ydDsKKwkJcmV0dXJuOworCX0KKwkvKiBXaGF0PyBVTklYIHNvY2tldD8gSVBYPz8gOikgKi8KK30KKworLyogV2UgaGlqYWNrIHRoaXMgY29uc3RhbnQgdG8gbWVhbiBzb21ldGhpbmcgZWxzZSAqLworLyogSXQgZG9lc24ndCBodXJ0IGJlY2F1c2Ugd2Ugd2lsbCByZW1vdmUgdGhpcyBiaXQgYW55d2F5ICovCisjZGVmaW5lIERJRV9PTl9FUlJPUiBBSV9DQU5PTk5BTUUKKworLyogaG9zdDogIjEuMi4zLjRbOnBvcnRdIiwgInd3dy5nb29nbGUuY29tWzpwb3J0XSIKKyAqIHBvcnQ6IGlmIG5laXRoZXIgb2YgYWJvdmUgc3BlY2lmaWVzIHBvcnQgIyAqLworc3RhdGljIGxlbl9hbmRfc29ja2FkZHIqIHN0cjJzb2NrYWRkcigKKwkJY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQsCitJRl9GRUFUVVJFX0lQVjYoc2FfZmFtaWx5X3QgYWYsKQorCQlpbnQgYWlfZmxhZ3MpCit7CitJRl9OT1RfRkVBVFVSRV9JUFY2KHNhX2ZhbWlseV90IGFmID0gQUZfSU5FVDspCisJaW50IHJjOworCWxlbl9hbmRfc29ja2FkZHIgKnI7CisJc3RydWN0IGFkZHJpbmZvICpyZXN1bHQgPSBOVUxMOworCXN0cnVjdCBhZGRyaW5mbyAqdXNlZF9yZXM7CisJY29uc3QgY2hhciAqb3JnX2hvc3QgPSBob3N0OyAvKiBvbmx5IGZvciBlcnJvciBtc2cgKi8KKwljb25zdCBjaGFyICpjcDsKKwlzdHJ1Y3QgYWRkcmluZm8gaGludDsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9VTklYX0xPQ0FMICYmIGlzX3ByZWZpeGVkX3dpdGgoaG9zdCwgImxvY2FsOiIpKSB7CisJCXN0cnVjdCBzb2NrYWRkcl91biAqc3VuOworCisJCXIgPSB4emFsbG9jKExTQV9MRU5fU0laRSArIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pKTsKKwkJci0+bGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl91bik7CisJCXItPnUuc2Euc2FfZmFtaWx5ID0gQUZfVU5JWDsKKwkJc3VuID0gKHN0cnVjdCBzb2NrYWRkcl91biAqKSZyLT51LnNhOworCQlzYWZlX3N0cm5jcHkoc3VuLT5zdW5fcGF0aCwgaG9zdCArIDYsIHNpemVvZihzdW4tPnN1bl9wYXRoKSk7CisJCXJldHVybiByOworCX0KKworCXIgPSBOVUxMOworCisJLyogVWdseSBwYXJzaW5nIG9mIGhvc3Q6YWRkciAqLworCWlmIChFTkFCTEVfRkVBVFVSRV9JUFY2ICYmIGhvc3RbMF0gPT0gJ1snKSB7CisJCS8qIEV2ZW4gdWdsaWVyIHBhcnNpbmcgb2YgW3h4XTpubiAqLworCQlob3N0Kys7CisJCWNwID0gc3RyY2hyKGhvc3QsICddJyk7CisJCWlmICghY3AgfHwgKGNwWzFdICE9ICc6JyAmJiBjcFsxXSAhPSAnXDAnKSkgeworCQkJLyogTWFsZm9ybWVkOiBtdXN0IGJlIFt4eF06bm4gb3IgW3h4XSAqLworCQkJYmJfZXJyb3JfbXNnKCJiYWQgYWRkcmVzcyAnJXMnIiwgb3JnX2hvc3QpOworCQkJaWYgKGFpX2ZsYWdzICYgRElFX09OX0VSUk9SKQorCQkJCXhmdW5jX2RpZSgpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwl9IGVsc2UgeworCQljcCA9IHN0cnJjaHIoaG9zdCwgJzonKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0lQVjYgJiYgY3AgJiYgc3RyY2hyKGhvc3QsICc6JykgIT0gY3ApIHsKKwkJCS8qIFRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgJzonIChlLmcuICI6OjEiKSAqLworCQkJY3AgPSBOVUxMOyAvKiBpdCdzIG5vdCBhIHBvcnQgc3BlYyAqLworCQl9CisJfQorCWlmIChjcCkgeyAvKiBwb2ludHMgdG8gIjoiIG9yICJdOiIgKi8KKwkJaW50IHN6ID0gY3AgLSBob3N0ICsgMTsKKworCQlob3N0ID0gc2FmZV9zdHJuY3B5KGFsbG9jYShzeiksIGhvc3QsIHN6KTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0lQVjYgJiYgKmNwICE9ICc6JykgeworCQkJY3ArKzsgLyogc2tpcCAnXScgKi8KKwkJCWlmICgqY3AgPT0gJ1wwJykgLyogW3h4XSB3aXRob3V0IHBvcnQgKi8KKwkJCQlnb3RvIHNraXA7CisJCX0KKwkJY3ArKzsgLyogc2tpcCAnOicgKi8KKwkJcG9ydCA9IGJiX3N0cnRvdShjcCwgTlVMTCwgMTApOworCQlpZiAoZXJybm8gfHwgKHVuc2lnbmVkKXBvcnQgPiAweGZmZmYpIHsKKwkJCWJiX2Vycm9yX21zZygiYmFkIHBvcnQgc3BlYyAnJXMnIiwgb3JnX2hvc3QpOworCQkJaWYgKGFpX2ZsYWdzICYgRElFX09OX0VSUk9SKQorCQkJCXhmdW5jX2RpZSgpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKyBza2lwOiA7CisJfQorCisJLyogTmV4dCB0d28gaWYgYmxvY2tzIGFsbG93IHRvIHNraXAgZ2V0YWRkcmluZm8oKQorCSAqIGluIGNhc2UgaG9zdCBuYW1lIGlzIGEgbnVtZXJpYyBJUCh2NikgYWRkcmVzcy4KKwkgKiBnZXRhZGRyaW5mbygpIGluaXRpYWxpemVzIEROUyByZXNvbHV0aW9uIG1hY2hpbmVyeSwKKwkgKiBzY2FucyBuZXR3b3JrIGNvbmZpZyBhbmQgc3VjaCAtIHRlbnMgb2Ygc3lzY2FsbHMuCisJICovCisJLyogSWYgd2Ugd2VyZSBub3QgYXNrZWQgc3BlY2lmaWNhbGx5IGZvciBJUHY2LAorCSAqIGNoZWNrIHdoZXRoZXIgdGhpcyBpcyBhIG51bWVyaWMgSVB2NCAqLworCUlGX0ZFQVRVUkVfSVBWNihpZihhZiAhPSBBRl9JTkVUNikpIHsKKwkJc3RydWN0IGluX2FkZHIgaW40OworCQlpZiAoaW5ldF9hdG9uKGhvc3QsICZpbjQpICE9IDApIHsKKwkJCXIgPSB4emFsbG9jKExTQV9MRU5fU0laRSArIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pKTsKKwkJCXItPmxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW4pOworCQkJci0+dS5zYS5zYV9mYW1pbHkgPSBBRl9JTkVUOworCQkJci0+dS5zaW4uc2luX2FkZHIgPSBpbjQ7CisJCQlnb3RvIHNldF9wb3J0OworCQl9CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkvKiBJZiB3ZSB3ZXJlIG5vdCBhc2tlZCBzcGVjaWZpY2FsbHkgZm9yIElQdjQsCisJICogY2hlY2sgd2hldGhlciB0aGlzIGlzIGEgbnVtZXJpYyBJUHY2ICovCisJaWYgKGFmICE9IEFGX0lORVQpIHsKKwkJc3RydWN0IGluNl9hZGRyIGluNjsKKwkJaWYgKGluZXRfcHRvbihBRl9JTkVUNiwgaG9zdCwgJmluNikgPiAwKSB7CisJCQlyID0geHphbGxvYyhMU0FfTEVOX1NJWkUgKyBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNikpOworCQkJci0+bGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbjYpOworCQkJci0+dS5zYS5zYV9mYW1pbHkgPSBBRl9JTkVUNjsKKwkJCXItPnUuc2luNi5zaW42X2FkZHIgPSBpbjY7CisJCQlnb3RvIHNldF9wb3J0OworCQl9CisJfQorI2VuZGlmCisKKwltZW1zZXQoJmhpbnQsIDAgLCBzaXplb2YoaGludCkpOworCWhpbnQuYWlfZmFtaWx5ID0gYWY7CisJLyogTmVlZCBTT0NLX1NUUkVBTSwgb3IgZWxzZSB3ZSBnZXQgZWFjaCBhZGRyZXNzIHRocmljZSAob3IgbW9yZSkKKwkgKiBmb3IgZWFjaCBwb3NzaWJsZSBzb2NrZXQgdHlwZSAodGNwLHVkcCxyYXcuLi4pOiAqLworCWhpbnQuYWlfc29ja3R5cGUgPSBTT0NLX1NUUkVBTTsKKwloaW50LmFpX2ZsYWdzID0gYWlfZmxhZ3MgJiB+RElFX09OX0VSUk9SOworCXJjID0gZ2V0YWRkcmluZm8oaG9zdCwgTlVMTCwgJmhpbnQsICZyZXN1bHQpOworCWlmIChyYyB8fCAhcmVzdWx0KSB7CisJCWJiX2Vycm9yX21zZygiYmFkIGFkZHJlc3MgJyVzJyIsIG9yZ19ob3N0KTsKKwkJaWYgKGFpX2ZsYWdzICYgRElFX09OX0VSUk9SKQorCQkJeGZ1bmNfZGllKCk7CisJCWdvdG8gcmV0OworCX0KKwl1c2VkX3JlcyA9IHJlc3VsdDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9QUkVGRVJfSVBWNF9BRERSRVNTCisJd2hpbGUgKDEpIHsKKwkJaWYgKHVzZWRfcmVzLT5haV9mYW1pbHkgPT0gQUZfSU5FVCkKKwkJCWJyZWFrOworCQl1c2VkX3JlcyA9IHVzZWRfcmVzLT5haV9uZXh0OworCQlpZiAoIXVzZWRfcmVzKSB7CisJCQl1c2VkX3JlcyA9IHJlc3VsdDsKKwkJCWJyZWFrOworCQl9CisJfQorI2VuZGlmCisJciA9IHhtYWxsb2MoTFNBX0xFTl9TSVpFICsgdXNlZF9yZXMtPmFpX2FkZHJsZW4pOworCXItPmxlbiA9IHVzZWRfcmVzLT5haV9hZGRybGVuOworCW1lbWNweSgmci0+dS5zYSwgdXNlZF9yZXMtPmFpX2FkZHIsIHVzZWRfcmVzLT5haV9hZGRybGVuKTsKKworIHNldF9wb3J0OgorCXNldF9ucG9ydCgmci0+dS5zYSwgaHRvbnMocG9ydCkpOworIHJldDoKKwlpZiAocmVzdWx0KQorCQlmcmVlYWRkcmluZm8ocmVzdWx0KTsKKwlyZXR1cm4gcjsKK30KKyNpZiAhRU5BQkxFX0ZFQVRVUkVfSVBWNgorI2RlZmluZSBzdHIyc29ja2FkZHIoaG9zdCwgcG9ydCwgYWYsIGFpX2ZsYWdzKSBzdHIyc29ja2FkZHIoaG9zdCwgcG9ydCwgYWlfZmxhZ3MpCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKK2xlbl9hbmRfc29ja2FkZHIqIEZBU1RfRlVOQyBob3N0X2FuZF9hZjJzb2NrYWRkcihjb25zdCBjaGFyICpob3N0LCBpbnQgcG9ydCwgc2FfZmFtaWx5X3QgYWYpCit7CisJcmV0dXJuIHN0cjJzb2NrYWRkcihob3N0LCBwb3J0LCBhZiwgMCk7Cit9CisKK2xlbl9hbmRfc29ja2FkZHIqIEZBU1RfRlVOQyB4aG9zdF9hbmRfYWYyc29ja2FkZHIoY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQsIHNhX2ZhbWlseV90IGFmKQoreworCXJldHVybiBzdHIyc29ja2FkZHIoaG9zdCwgcG9ydCwgYWYsIERJRV9PTl9FUlJPUik7Cit9CisjZW5kaWYKKworbGVuX2FuZF9zb2NrYWRkciogRkFTVF9GVU5DIGhvc3Qyc29ja2FkZHIoY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQpCit7CisJcmV0dXJuIHN0cjJzb2NrYWRkcihob3N0LCBwb3J0LCBBRl9VTlNQRUMsIDApOworfQorCitsZW5fYW5kX3NvY2thZGRyKiBGQVNUX0ZVTkMgeGhvc3Qyc29ja2FkZHIoY29uc3QgY2hhciAqaG9zdCwgaW50IHBvcnQpCit7CisJcmV0dXJuIHN0cjJzb2NrYWRkcihob3N0LCBwb3J0LCBBRl9VTlNQRUMsIERJRV9PTl9FUlJPUik7Cit9CisKK2xlbl9hbmRfc29ja2FkZHIqIEZBU1RfRlVOQyB4ZG90dGVkMnNvY2thZGRyKGNvbnN0IGNoYXIgKmhvc3QsIGludCBwb3J0KQoreworCXJldHVybiBzdHIyc29ja2FkZHIoaG9zdCwgcG9ydCwgQUZfVU5TUEVDLCBBSV9OVU1FUklDSE9TVCB8IERJRV9PTl9FUlJPUik7Cit9CisKK2ludCBGQVNUX0ZVTkMgeHNvY2tldF90eXBlKGxlbl9hbmRfc29ja2FkZHIgKipsc2FwLCBpbnQgZmFtaWx5LCBpbnQgc29ja190eXBlKQoreworCWxlbl9hbmRfc29ja2FkZHIgKmxzYTsKKwlpbnQgZmQ7CisJaW50IGxlbjsKKworCWlmIChmYW1pbHkgPT0gQUZfVU5TUEVDKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCQlmZCA9IHNvY2tldChBRl9JTkVUNiwgc29ja190eXBlLCAwKTsKKwkJaWYgKGZkID49IDApIHsKKwkJCWZhbWlseSA9IEFGX0lORVQ2OworCQkJZ290byBkb25lOworCQl9CisjZW5kaWYKKwkJZmFtaWx5ID0gQUZfSU5FVDsKKwl9CisKKwlmZCA9IHhzb2NrZXQoZmFtaWx5LCBzb2NrX3R5cGUsIDApOworCisJbGVuID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJaWYgKGZhbWlseSA9PSBBRl9VTklYKQorCQlsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX3VuKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJaWYgKGZhbWlseSA9PSBBRl9JTkVUNikgeworIGRvbmU6CisJCWxlbiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKwl9CisjZW5kaWYKKwlsc2EgPSB4emFsbG9jKExTQV9MRU5fU0laRSArIGxlbik7CisJbHNhLT5sZW4gPSBsZW47CisJbHNhLT51LnNhLnNhX2ZhbWlseSA9IGZhbWlseTsKKwkqbHNhcCA9IGxzYTsKKwlyZXR1cm4gZmQ7Cit9CisKK2ludCBGQVNUX0ZVTkMgeHNvY2tldF9zdHJlYW0obGVuX2FuZF9zb2NrYWRkciAqKmxzYXApCit7CisJcmV0dXJuIHhzb2NrZXRfdHlwZShsc2FwLCBBRl9VTlNQRUMsIFNPQ0tfU1RSRUFNKTsKK30KKworc3RhdGljIGludCBjcmVhdGVfYW5kX2JpbmRfb3JfZGllKGNvbnN0IGNoYXIgKmJpbmRhZGRyLCBpbnQgcG9ydCwgaW50IHNvY2tfdHlwZSkKK3sKKwlpbnQgZmQ7CisJbGVuX2FuZF9zb2NrYWRkciAqbHNhOworCisJaWYgKGJpbmRhZGRyICYmIGJpbmRhZGRyWzBdKSB7CisJCWxzYSA9IHhkb3R0ZWQyc29ja2FkZHIoYmluZGFkZHIsIHBvcnQpOworCQkvKiB1c2VyIHNwZWNpZmllZCBiaW5kIGFkZHIgZGljdGF0ZXMgZmFtaWx5ICovCisJCWZkID0geHNvY2tldChsc2EtPnUuc2Euc2FfZmFtaWx5LCBzb2NrX3R5cGUsIDApOworCX0gZWxzZSB7CisJCWZkID0geHNvY2tldF90eXBlKCZsc2EsIEFGX1VOU1BFQywgc29ja190eXBlKTsKKwkJc2V0X25wb3J0KCZsc2EtPnUuc2EsIGh0b25zKHBvcnQpKTsKKwl9CisJc2V0c29ja29wdF9yZXVzZWFkZHIoZmQpOworCXhiaW5kKGZkLCAmbHNhLT51LnNhLCBsc2EtPmxlbik7CisJZnJlZShsc2EpOworCXJldHVybiBmZDsKK30KKworaW50IEZBU1RfRlVOQyBjcmVhdGVfYW5kX2JpbmRfc3RyZWFtX29yX2RpZShjb25zdCBjaGFyICpiaW5kYWRkciwgaW50IHBvcnQpCit7CisJcmV0dXJuIGNyZWF0ZV9hbmRfYmluZF9vcl9kaWUoYmluZGFkZHIsIHBvcnQsIFNPQ0tfU1RSRUFNKTsKK30KKworaW50IEZBU1RfRlVOQyBjcmVhdGVfYW5kX2JpbmRfZGdyYW1fb3JfZGllKGNvbnN0IGNoYXIgKmJpbmRhZGRyLCBpbnQgcG9ydCkKK3sKKwlyZXR1cm4gY3JlYXRlX2FuZF9iaW5kX29yX2RpZShiaW5kYWRkciwgcG9ydCwgU09DS19ER1JBTSk7Cit9CisKKworaW50IEZBU1RfRlVOQyBjcmVhdGVfYW5kX2Nvbm5lY3Rfc3RyZWFtX29yX2RpZShjb25zdCBjaGFyICpwZWVyLCBpbnQgcG9ydCkKK3sKKwlpbnQgZmQ7CisJbGVuX2FuZF9zb2NrYWRkciAqbHNhOworCisJbHNhID0geGhvc3Qyc29ja2FkZHIocGVlciwgcG9ydCk7CisJZmQgPSB4c29ja2V0KGxzYS0+dS5zYS5zYV9mYW1pbHksIFNPQ0tfU1RSRUFNLCAwKTsKKwlzZXRzb2Nrb3B0X3JldXNlYWRkcihmZCk7CisJeGNvbm5lY3QoZmQsICZsc2EtPnUuc2EsIGxzYS0+bGVuKTsKKwlmcmVlKGxzYSk7CisJcmV0dXJuIGZkOworfQorCitpbnQgRkFTVF9GVU5DIHhjb25uZWN0X3N0cmVhbShjb25zdCBsZW5fYW5kX3NvY2thZGRyICpsc2EpCit7CisJaW50IGZkID0geHNvY2tldChsc2EtPnUuc2Euc2FfZmFtaWx5LCBTT0NLX1NUUkVBTSwgMCk7CisJeGNvbm5lY3QoZmQsICZsc2EtPnUuc2EsIGxzYS0+bGVuKTsKKwlyZXR1cm4gZmQ7Cit9CisKKy8qIFdlIGhpamFjayB0aGlzIGNvbnN0YW50IHRvIG1lYW4gc29tZXRoaW5nIGVsc2UgKi8KKy8qIEl0IGRvZXNuJ3QgaHVydCBiZWNhdXNlIHdlIHdpbGwgYWRkIHRoaXMgYml0IGFueXdheSAqLworI2RlZmluZSBJR05PUkVfUE9SVCBOSV9OVU1FUklDU0VSVgorc3RhdGljIGNoYXIqIEZBU1RfRlVOQyBzb2NrYWRkcjJzdHIoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYSwgaW50IGZsYWdzKQoreworCWNoYXIgaG9zdFsxMjhdOworCWNoYXIgc2VydlsxNl07CisJaW50IHJjOworCXNvY2tsZW5fdCBzYWxlbjsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9VTklYX0xPQ0FMICYmIHNhLT5zYV9mYW1pbHkgPT0gQUZfVU5JWCkgeworCQlzdHJ1Y3Qgc29ja2FkZHJfdW4gKnN1biA9IChzdHJ1Y3Qgc29ja2FkZHJfdW4gKilzYTsKKwkJcmV0dXJuIHhhc3ByaW50ZigibG9jYWw6JS4qcyIsCisJCQkJKGludCkgc2l6ZW9mKHN1bi0+c3VuX3BhdGgpLAorCQkJCXN1bi0+c3VuX3BhdGgpOworCX0KKworCXNhbGVuID0gTFNBX1NJWkVPRl9TQTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJaWYgKHNhLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkKKwkJc2FsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKTsKKwlpZiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikKKwkJc2FsZW4gPSBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luNik7CisjZW5kaWYKKwlyYyA9IGdldG5hbWVpbmZvKHNhLCBzYWxlbiwKKwkJCWhvc3QsIHNpemVvZihob3N0KSwKKwkvKiBjYW4gZG8gKChmbGFncyAmIElHTk9SRV9QT1JUKSA/IE5VTEwgOiBzZXJ2KSBidXQgd2h5IGJvdGhlcj8gKi8KKwkJCXNlcnYsIHNpemVvZihzZXJ2KSwKKwkJCS8qIGRvIG5vdCByZXNvbHZlIHBvcnQjIGludG8gc2VydmljZSBfbmFtZV8gKi8KKwkJCWZsYWdzIHwgTklfTlVNRVJJQ1NFUlYKKwkpOworCWlmIChyYykKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGZsYWdzICYgSUdOT1JFX1BPUlQpCisJCXJldHVybiB4c3RyZHVwKGhvc3QpOworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwlpZiAoc2EtPnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQlpZiAoc3RyY2hyKGhvc3QsICc6JykpIC8qIGhlaCwgaXQncyBub3QgYSByZXNvbHZlZCBob3N0bmFtZSAqLworCQkJcmV0dXJuIHhhc3ByaW50ZigiWyVzXTolcyIsIGhvc3QsIHNlcnYpOworCQkvKnJldHVybiB4YXNwcmludGYoIiVzOiVzIiwgaG9zdCwgc2Vydik7Ki8KKwkJLyogLSBmYWxsIHRocm91Z2ggaW5zdGVhZCAqLworCX0KKyNlbmRpZgorCS8qIEZvciBub3cgd2UgZG9uJ3Qgc3VwcG9ydCBhbnl0aGluZyBlbHNlLCBzbyBpdCBoYXMgdG8gYmUgSU5FVCAqLworCS8qaWYgKHNhLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkqLworCQlyZXR1cm4geGFzcHJpbnRmKCIlczolcyIsIGhvc3QsIHNlcnYpOworCS8qcmV0dXJuIHhzdHJkdXAoaG9zdCk7Ki8KK30KKworY2hhciogRkFTVF9GVU5DIHhtYWxsb2Nfc29ja2FkZHIyaG9zdChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhKQoreworCXJldHVybiBzb2NrYWRkcjJzdHIoc2EsIDApOworfQorCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19zb2NrYWRkcjJob3N0X25vcG9ydChjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnNhKQoreworCXJldHVybiBzb2NrYWRkcjJzdHIoc2EsIElHTk9SRV9QT1JUKTsKK30KKworY2hhciogRkFTVF9GVU5DIHhtYWxsb2Nfc29ja2FkZHIyaG9zdG9ubHlfbm9wb3J0KGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqc2EpCit7CisJcmV0dXJuIHNvY2thZGRyMnN0cihzYSwgTklfTkFNRVJFUUQgfCBJR05PUkVfUE9SVCk7Cit9CitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19zb2NrYWRkcjJkb3R0ZWQoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYSkKK3sKKwlyZXR1cm4gc29ja2FkZHIyc3RyKHNhLCBOSV9OVU1FUklDSE9TVCk7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZF9ub3BvcnQoY29uc3Qgc3RydWN0IHNvY2thZGRyICpzYSkKK3sKKwlyZXR1cm4gc29ja2FkZHIyc3RyKHNhLCBOSV9OVU1FUklDSE9TVCB8IElHTk9SRV9QT1JUKTsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3hmdW5jX2RpZS5jIGIvbGliYmIveGZ1bmNfZGllLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNmNzk5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3hmdW5jX2RpZS5jCkBAIC0wLDAgKzEsMjIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBLZWVwaW5nIGl0IHNlcGFyYXRlIGFsbG93cyB0byBOT1QgcHVsbCBpbiBzdGRpbyBmb3IgVkVSWSBzbWFsbCBhcHBsZXRzLgorICogVHJ5IGJ1aWxkaW5nIGJ1c3lib3ggd2l0aCBvbmx5ICJ0cnVlIiBlbmFibGVkLi4uICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCit2b2lkICgqZGllX2Z1bmMpKHZvaWQpOworCit2b2lkIEZBU1RfRlVOQyB4ZnVuY19kaWUodm9pZCkKK3sKKwlpZiAoZGllX2Z1bmMpCisJCWRpZV9mdW5jKCk7CisJZXhpdCh4ZnVuY19lcnJvcl9yZXR2YWwpOworfQpkaWZmIC0tZ2l0IGEvbGliYmIveGZ1bmNzLmMgYi9saWJiYi94ZnVuY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzk5Njk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIveGZ1bmNzLmMKQEAgLTAsMCArMSwzMTEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFV0aWxpdHkgcm91dGluZXMuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA2IFJvYiBMYW5kbGV5CisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgRGVueXMgVmxhc2Vua28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIFdlIG5lZWQgdG8gaGF2ZSBzZXBhcmF0ZSB4ZnVuY3MuYyBhbmQgeGZ1bmNzX3ByaW50Zi5jIGJlY2F1c2UKKyAqIHdpdGggY3VycmVudCBsaW5rZXJzLCBldmVuIHdpdGggc2VjdGlvbiBnYXJiYWdlIGNvbGxlY3Rpb24sCisgKiBpZiAqLm8gbW9kdWxlIHJlZmVyZW5jZXMgYW55IG9mIFhYWHByaW50ZiBmdW5jdGlvbnMsIHlvdSBwdWxsIGluCisgKiBlbnRpcmUgcHJpbnRmIG1hY2hpbmVyeS4gRXZlbiBpZiB5b3UgZG8gbm90IHVzZSB0aGUgZnVuY3Rpb24KKyAqIHdoaWNoIHVzZXMgWFhYcHJpbnRmLgorICoKKyAqIHhmdW5jcy5jIGNvbnRhaW5zIGZ1bmN0aW9ucyAobm90IG5lY2Vzc2FyaWx5IHhmdW5jcykKKyAqIHdoaWNoIGRvIG5vdCBwdWxsIGluIHByaW50ZiwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseS4KKyAqIHhmdW5jX3ByaW50Zi5jIGNvbnRhaW5zIHRob3NlIHdoaWNoIGRvLgorICoKKyAqIFRPRE86IG1vdmUgeG1hbGxvYygpIGFuZCB4YXRvbnVtKCkgaGVyZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVHVybiBvbiBub25ibG9ja2luZyBJL08gb24gYSBmZCAqLworaW50IEZBU1RfRlVOQyBuZGVsYXlfb24oaW50IGZkKQoreworCWludCBmbGFncyA9IGZjbnRsKGZkLCBGX0dFVEZMKTsKKwlpZiAoZmxhZ3MgJiBPX05PTkJMT0NLKQorCQlyZXR1cm4gZmxhZ3M7CisJZmNudGwoZmQsIEZfU0VURkwsIGZsYWdzIHwgT19OT05CTE9DSyk7CisJcmV0dXJuIGZsYWdzOworfQorCitpbnQgRkFTVF9GVU5DIG5kZWxheV9vZmYoaW50IGZkKQoreworCWludCBmbGFncyA9IGZjbnRsKGZkLCBGX0dFVEZMKTsKKwlpZiAoIShmbGFncyAmIE9fTk9OQkxPQ0spKQorCQlyZXR1cm4gZmxhZ3M7CisJZmNudGwoZmQsIEZfU0VURkwsIGZsYWdzICYgfk9fTk9OQkxPQ0spOworCXJldHVybiBmbGFnczsKK30KKwordm9pZCBGQVNUX0ZVTkMgY2xvc2Vfb25fZXhlY19vbihpbnQgZmQpCit7CisJZmNudGwoZmQsIEZfU0VURkQsIEZEX0NMT0VYRUMpOworfQorCitjaGFyKiBGQVNUX0ZVTkMgc3RybmNweV9JRk5BTVNJWihjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKyNpZm5kZWYgSUZOQU1TSVoKKwllbnVtIHsgSUZOQU1TSVogPSAxNiB9OworI2VuZGlmCisJcmV0dXJuIHN0cm5jcHkoZHN0LCBzcmMsIElGTkFNU0laKTsKK30KKworCisvKiBDb252ZXJ0IHVuc2lnbmVkIGludGVnZXIgdG8gYXNjaWksIHdyaXRpbmcgaW50byBzdXBwbGllZCBidWZmZXIuCisgKiBBIHRydW5jYXRlZCByZXN1bHQgY29udGFpbnMgdGhlIGZpcnN0IGZldyBkaWdpdHMgb2YgdGhlIHJlc3VsdCBhbGEgc3RybmNweS4KKyAqIFJldHVybnMgYSBwb2ludGVyIHBhc3QgbGFzdCBnZW5lcmF0ZWQgZGlnaXQsIGRvZXMgX25vdF8gc3RvcmUgTlVMLgorICovCit2b2lkIEJVR19zaXplb2Yodm9pZCk7CitjaGFyKiBGQVNUX0ZVTkMgdXRvYV90b19idWYodW5zaWduZWQgbiwgY2hhciAqYnVmLCB1bnNpZ25lZCBidWZsZW4pCit7CisJdW5zaWduZWQgaSwgb3V0LCByZXM7CisKKwlpZiAoYnVmbGVuKSB7CisJCW91dCA9IDA7CisJCWlmIChzaXplb2YobikgPT0gNCkKKwkJLy8gMl4zMi0xID0gNDI5NDk2NzI5NQorCQkJaSA9IDEwMDAwMDAwMDA7CisjaWYgVUlOVF9NQVggPiA0Mjk0OTY3Mjk1IC8qIHByZXZlbnRzIHdhcm5pbmcgYWJvdXQgImNvbnN0IHRvbyBsYXJnZSIgKi8KKwkJZWxzZQorCQlpZiAoc2l6ZW9mKG4pID09IDgpCisJCS8vIDJeNjQtMSA9IDE4NDQ2NzQ0MDczNzA5NTUxNjE1CisJCQlpID0gMTAwMDAwMDAwMDAwMDAwMDAwMDA7CisjZW5kaWYKKwkJZWxzZQorCQkJQlVHX3NpemVvZigpOworCQlmb3IgKDsgaTsgaSAvPSAxMCkgeworCQkJcmVzID0gbiAvIGk7CisJCQluID0gbiAlIGk7CisJCQlpZiAocmVzIHx8IG91dCB8fCBpID09IDEpIHsKKwkJCQlpZiAoLS1idWZsZW4gPT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJb3V0Kys7CisJCQkJKmJ1ZisrID0gJzAnICsgcmVzOworCQkJfQorCQl9CisJfQorCXJldHVybiBidWY7Cit9CisKKy8qIENvbnZlcnQgc2lnbmVkIGludGVnZXIgdG8gYXNjaWksIGxpa2UgdXRvYV90b19idWYoKSAqLworY2hhciogRkFTVF9GVU5DIGl0b2FfdG9fYnVmKGludCBuLCBjaGFyICpidWYsIHVuc2lnbmVkIGJ1ZmxlbikKK3sKKwlpZiAoIWJ1ZmxlbikKKwkJcmV0dXJuIGJ1ZjsKKwlpZiAobiA8IDApIHsKKwkJbiA9IC1uOworCQkqYnVmKysgPSAnLSc7CisJCWJ1Zmxlbi0tOworCX0KKwlyZXR1cm4gdXRvYV90b19idWYoKHVuc2lnbmVkKW4sIGJ1ZiwgYnVmbGVuKTsKK30KKworLy8gVGhlIGZvbGxvd2luZyB0d28gZnVuY3Rpb25zIHVzZSBhIHN0YXRpYyBidWZmZXIsIHNvIGNhbGxpbmcgZWl0aGVyIG9uZSBhCisvLyBzZWNvbmQgdGltZSB3aWxsIG92ZXJ3cml0ZSBwcmV2aW91cyByZXN1bHRzLgorLy8KKy8vIFRoZSBsYXJnZXN0IDMyIGJpdCBpbnRlZ2VyIGlzIC0yIGJpbGxpb24gcGx1cyBOVUwsIG9yIDErMTArMT0xMiBieXRlcy4KKy8vIEl0IHNvIGhhcHBlbnMgdGhhdCBzaXplb2YoaW50KSAqIDMgaXMgZW5vdWdoIGZvciAzMisgYml0IGludHMuCisvLyAoc2l6ZW9mKGludCkgKiAzICsgMiBpcyBjb3JyZWN0IGZvciBhbnkgd2lkdGgsIGV2ZW4gOC1iaXQpCisKK3N0YXRpYyBjaGFyIGxvY2FsX2J1ZltzaXplb2YoaW50KSAqIDNdOworCisvKiBDb252ZXJ0IHVuc2lnbmVkIGludGVnZXIgdG8gYXNjaWkgdXNpbmcgYSBzdGF0aWMgYnVmZmVyIChyZXR1cm5lZCkuICovCitjaGFyKiBGQVNUX0ZVTkMgdXRvYSh1bnNpZ25lZCBuKQoreworCSoodXRvYV90b19idWYobiwgbG9jYWxfYnVmLCBzaXplb2YobG9jYWxfYnVmKSAtIDEpKSA9ICdcMCc7CisKKwlyZXR1cm4gbG9jYWxfYnVmOworfQorCisvKiBDb252ZXJ0IHNpZ25lZCBpbnRlZ2VyIHRvIGFzY2lpIHVzaW5nIGEgc3RhdGljIGJ1ZmZlciAocmV0dXJuZWQpLiAqLworY2hhciogRkFTVF9GVU5DIGl0b2EoaW50IG4pCit7CisJKihpdG9hX3RvX2J1ZihuLCBsb2NhbF9idWYsIHNpemVvZihsb2NhbF9idWYpIC0gMSkpID0gJ1wwJzsKKworCXJldHVybiBsb2NhbF9idWY7Cit9CisKKy8qIEVtaXQgYSBzdHJpbmcgb2YgaGV4IHJlcHJlc2VudGF0aW9uIG9mIGJ5dGVzICovCitjaGFyKiBGQVNUX0ZVTkMgYmluMmhleChjaGFyICpwLCBjb25zdCBjaGFyICpjcCwgaW50IGNvdW50KQoreworCXdoaWxlIChjb3VudCkgeworCQl1bnNpZ25lZCBjaGFyIGMgPSAqY3ArKzsKKwkJLyogcHV0IGxvd2VyY2FzZSBoZXggZGlnaXRzICovCisJCSpwKysgPSAweDIwIHwgYmJfaGV4ZGlnaXRzX3VwY2FzZVtjID4+IDRdOworCQkqcCsrID0gMHgyMCB8IGJiX2hleGRpZ2l0c191cGNhc2VbYyAmIDB4Zl07CisJCWNvdW50LS07CisJfQorCXJldHVybiBwOworfQorCisvKiBDb252ZXJ0ICJbeF14WzpdW3hdeFs6XVt4XXhbOl1beF14IiBoZXggc3RyaW5nIHRvIGJpbmFyeSwgbm8gbW9yZSB0aGFuIENPVU5UIGJ5dGVzICovCitjaGFyKiBGQVNUX0ZVTkMgaGV4MmJpbihjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnN0ciwgaW50IGNvdW50KQoreworCWVycm5vID0gRUlOVkFMOworCXdoaWxlICgqc3RyICYmIGNvdW50KSB7CisJCXVpbnQ4X3QgdmFsOworCQl1aW50OF90IGMgPSAqc3RyKys7CisJCWlmIChpc2RpZ2l0KGMpKQorCQkJdmFsID0gYyAtICcwJzsKKwkJZWxzZSBpZiAoKGN8MHgyMCkgPj0gJ2EnICYmIChjfDB4MjApIDw9ICdmJykKKwkJCXZhbCA9IChjfDB4MjApIC0gKCdhJyAtIDEwKTsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJCXZhbCA8PD0gNDsKKwkJYyA9ICpzdHI7CisJCWlmIChpc2RpZ2l0KGMpKQorCQkJdmFsIHw9IGMgLSAnMCc7CisJCWVsc2UgaWYgKChjfDB4MjApID49ICdhJyAmJiAoY3wweDIwKSA8PSAnZicpCisJCQl2YWwgfD0gKGN8MHgyMCkgLSAoJ2EnIC0gMTApOworCQllbHNlIGlmIChjID09ICc6JyB8fCBjID09ICdcMCcpCisJCQl2YWwgPj49IDQ7CisJCWVsc2UKKwkJCXJldHVybiBOVUxMOworCisJCSpkc3QrKyA9IHZhbDsKKwkJaWYgKGMgIT0gJ1wwJykKKwkJCXN0cisrOworCQlpZiAoKnN0ciA9PSAnOicpCisJCQlzdHIrKzsKKwkJY291bnQtLTsKKwl9CisJZXJybm8gPSAoKnN0ciA/IEVSQU5HRSA6IDApOworCXJldHVybiBkc3Q7Cit9CisKKy8qIFJldHVybiBob3cgbG9uZyB0aGUgZmlsZSBhdCBmZCBpcywgaWYgdGhlcmUncyBhbnkgd2F5IHRvIGRldGVybWluZSBpdC4gKi8KKyNpZmRlZiBVTlVTRUQKK29mZl90IEZBU1RfRlVOQyBmZGxlbmd0aChpbnQgZmQpCit7CisJb2ZmX3QgYm90dG9tID0gMCwgdG9wID0gMCwgcG9zOworCWxvbmcgc2l6ZTsKKworCS8vIElmIHRoZSBpb2N0bCB3b3JrcyBmb3IgdGhpcywgcmV0dXJuIGl0LgorCisJaWYgKGlvY3RsKGZkLCBCTEtHRVRTSVpFLCAmc2l6ZSkgPj0gMCkgcmV0dXJuIHNpemUqNTEyOworCisJLy8gRklYTUU6IGV4cGxhaW4gd2h5IGxzZWVrKFNFRUtfRU5EKSBpcyBub3QgdXNlZCBoZXJlIQorCisJLy8gSWYgbm90LCBkbyBhIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBsYXN0IGxvY2F0aW9uIHdlIGNhbiByZWFkLiAgKFNvbWUKKwkvLyBibG9jayBkZXZpY2VzIGRvbid0IGRvIEJMS0dFVFNJWkUgcmlnaHQuKQorCisJZG8geworCQljaGFyIHRlbXA7CisKKwkJcG9zID0gYm90dG9tICsgKHRvcCAtIGJvdHRvbSkgLyAyOworCisJCS8vIElmIHdlIGNhbiByZWFkIGZyb20gdGhlIGN1cnJlbnQgbG9jYXRpb24sIGl0J3MgYmlnZ2VyLgorCisJCWlmIChsc2VlayhmZCwgcG9zLCBTRUVLX1NFVCk+PTAgJiYgc2FmZV9yZWFkKGZkLCAmdGVtcCwgMSk9PTEpIHsKKwkJCWlmIChib3R0b20gPT0gdG9wKSBib3R0b20gPSB0b3AgPSAodG9wKzEpICogMjsKKwkJCWVsc2UgYm90dG9tID0gcG9zOworCisJCS8vIElmIHdlIGNhbid0LCBpdCdzIHNtYWxsZXIuCisJCX0gZWxzZSB7CisJCQlpZiAoYm90dG9tID09IHRvcCkgeworCQkJCWlmICghdG9wKSByZXR1cm4gMDsKKwkJCQlib3R0b20gPSB0b3AvMjsKKwkJCX0KKwkJCWVsc2UgdG9wID0gcG9zOworCQl9CisJfSB3aGlsZSAoYm90dG9tICsgMSAhPSB0b3ApOworCisJcmV0dXJuIHBvcyArIDE7Cit9CisjZW5kaWYKKworaW50IEZBU1RfRlVOQyBiYl9wdXRjaGFyX3N0ZGVycihjaGFyIGNoKQoreworCXJldHVybiB3cml0ZShTVERFUlJfRklMRU5PLCAmY2gsIDEpOworfQorCitzc2l6ZV90IEZBU1RfRlVOQyBmdWxsX3dyaXRlMV9zdHIoY29uc3QgY2hhciAqc3RyKQoreworCXJldHVybiBmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sIHN0ciwgc3RybGVuKHN0cikpOworfQorCitzc2l6ZV90IEZBU1RfRlVOQyBmdWxsX3dyaXRlMl9zdHIoY29uc3QgY2hhciAqc3RyKQoreworCXJldHVybiBmdWxsX3dyaXRlKFNUREVSUl9GSUxFTk8sIHN0ciwgc3RybGVuKHN0cikpOworfQorCitzdGF0aWMgaW50IHdoX2hlbHBlcihpbnQgdmFsdWUsIGludCBkZWZfdmFsLCBjb25zdCBjaGFyICplbnZfbmFtZSwgaW50ICplcnIpCit7CisJaWYgKHZhbHVlID09IDApIHsKKwkJY2hhciAqcyA9IGdldGVudihlbnZfbmFtZSk7CisJCWlmIChzKSB7CisJCQl2YWx1ZSA9IGF0b2kocyk7CisJCQkvKiBJZiBMSU5FUy9DT0xVTU5TIGFyZSBzZXQsIHByZXRlbmQgdGhhdCB0aGVyZSBpcworCQkJICogbm8gZXJyb3IgZ2V0dGluZyB3L2gsIHRoaXMgcHJldmVudHMgc29tZSB1Z2x5CisJCQkgKiBjdXJzb3IgdHJpY2tzIGJ5IG91ciBjYWxsZXJzICovCisJCQkqZXJyID0gMDsKKwkJfQorCX0KKwlpZiAodmFsdWUgPD0gMSB8fCB2YWx1ZSA+PSAzMDAwMCkKKwkJdmFsdWUgPSBkZWZfdmFsOworCXJldHVybiB2YWx1ZTsKK30KKworLyogSXQgaXMgcGVyZmVjdGx5IG9rIHRvIHBhc3MgaW4gYSBOVUxMIGZvciBlaXRoZXIgd2lkdGggb3IgZm9yCisgKiBoZWlnaHQsIGluIHdoaWNoIGNhc2UgdGhhdCB2YWx1ZSB3aWxsIG5vdCBiZSBzZXQuICAqLworaW50IEZBU1RfRlVOQyBnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KGludCBmZCwgdW5zaWduZWQgKndpZHRoLCB1bnNpZ25lZCAqaGVpZ2h0KQoreworCXN0cnVjdCB3aW5zaXplIHdpbjsKKwlpbnQgZXJyOworCisJd2luLndzX3JvdyA9IDA7CisJd2luLndzX2NvbCA9IDA7CisJLyogSSd2ZSBzZWVuIGlvY3RsIHJldHVybmluZyAwLCBidXQgcm93L2NvbCBpcyAoc3RpbGw/KSAwLgorCSAqIFdlIHRyZWF0IHRoYXQgYXMgYW4gZXJyb3IgdG9vLiAgKi8KKwllcnIgPSBpb2N0bChmZCwgVElPQ0dXSU5TWiwgJndpbikgIT0gMCB8fCB3aW4ud3Nfcm93ID09IDA7CisJaWYgKGhlaWdodCkKKwkJKmhlaWdodCA9IHdoX2hlbHBlcih3aW4ud3Nfcm93LCAyNCwgIkxJTkVTIiwgJmVycik7CisJaWYgKHdpZHRoKQorCQkqd2lkdGggPSB3aF9oZWxwZXIod2luLndzX2NvbCwgODAsICJDT0xVTU5TIiwgJmVycik7CisJcmV0dXJuIGVycjsKK30KKworaW50IEZBU1RfRlVOQyB0Y3NldGF0dHJfc3RkaW5fVENTQU5PVyhjb25zdCBzdHJ1Y3QgdGVybWlvcyAqdHApCit7CisJcmV0dXJuIHRjc2V0YXR0cihTVERJTl9GSUxFTk8sIFRDU0FOT1csIHRwKTsKK30KKworcGlkX3QgRkFTVF9GVU5DIHNhZmVfd2FpdHBpZChwaWRfdCBwaWQsIGludCAqd3N0YXQsIGludCBvcHRpb25zKQoreworCXBpZF90IHI7CisKKwlkbworCQlyID0gd2FpdHBpZChwaWQsIHdzdGF0LCBvcHRpb25zKTsKKwl3aGlsZSAoKHIgPT0gLTEpICYmIChlcnJubyA9PSBFSU5UUikpOworCXJldHVybiByOworfQorCitwaWRfdCBGQVNUX0ZVTkMgd2FpdF9hbnlfbm9oYW5nKGludCAqd3N0YXQpCit7CisJcmV0dXJuIHNhZmVfd2FpdHBpZCgtMSwgd3N0YXQsIFdOT0hBTkcpOworfQorCisvLyBXYWl0IGZvciB0aGUgc3BlY2lmaWVkIGNoaWxkIFBJRCB0byBleGl0LCByZXR1cm5pbmcgY2hpbGQncyBlcnJvciByZXR1cm4uCitpbnQgRkFTVF9GVU5DIHdhaXQ0cGlkKHBpZF90IHBpZCkKK3sKKwlpbnQgc3RhdHVzOworCisJaWYgKHBpZCA8PSAwKSB7CisJCS8qZXJybm8gPSBFQ0hJTEQ7IC0tIHdyb25nLiAqLworCQkvKiB3ZSBleHBlY3QgZXJybm8gdG8gYmUgYWxyZWFkeSBzZXQgZnJvbSBmYWlsZWQgW3ZdZm9yay9leGVjICovCisJCXJldHVybiAtMTsKKwl9CisJaWYgKHNhZmVfd2FpdHBpZChwaWQsICZzdGF0dXMsIDApID09IC0xKQorCQlyZXR1cm4gLTE7CisJaWYgKFdJRkVYSVRFRChzdGF0dXMpKQorCQlyZXR1cm4gV0VYSVRTVEFUVVMoc3RhdHVzKTsKKwlpZiAoV0lGU0lHTkFMRUQoc3RhdHVzKSkKKwkJcmV0dXJuIFdURVJNU0lHKHN0YXR1cykgKyAweDE4MDsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2xpYmJiL3hmdW5jc19wcmludGYuYyBiL2xpYmJiL3hmdW5jc19wcmludGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzQ4ODkwCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIveGZ1bmNzX3ByaW50Zi5jCkBAIC0wLDAgKzEsNjU1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBVdGlsaXR5IHJvdXRpbmVzLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwNiBSb2IgTGFuZGxleQorICogQ29weXJpZ2h0IChDKSAyMDA2IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBXZSBuZWVkIHRvIGhhdmUgc2VwYXJhdGUgeGZ1bmNzLmMgYW5kIHhmdW5jc19wcmludGYuYyBiZWNhdXNlCisgKiB3aXRoIGN1cnJlbnQgbGlua2VycywgZXZlbiB3aXRoIHNlY3Rpb24gZ2FyYmFnZSBjb2xsZWN0aW9uLAorICogaWYgKi5vIG1vZHVsZSByZWZlcmVuY2VzIGFueSBvZiBYWFhwcmludGYgZnVuY3Rpb25zLCB5b3UgcHVsbCBpbgorICogZW50aXJlIHByaW50ZiBtYWNoaW5lcnkuIEV2ZW4gaWYgeW91IGRvIG5vdCB1c2UgdGhlIGZ1bmN0aW9uCisgKiB3aGljaCB1c2VzIFhYWHByaW50Zi4KKyAqCisgKiB4ZnVuY3MuYyBjb250YWlucyBmdW5jdGlvbnMgKG5vdCBuZWNlc3NhcmlseSB4ZnVuY3MpCisgKiB3aGljaCBkbyBub3QgcHVsbCBpbiBwcmludGYsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkuCisgKiB4ZnVuY19wcmludGYuYyBjb250YWlucyB0aG9zZSB3aGljaCBkby4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworCisvKiBBbGwgdGhlIGZ1bmN0aW9ucyBzdGFydGluZyB3aXRoICJ4IiBjYWxsIGJiX2Vycm9yX21zZ19hbmRfZGllKCkgaWYgdGhleQorICogZmFpbCwgc28gY2FsbGVycyBuZXZlciBuZWVkIHRvIGNoZWNrIGZvciBlcnJvcnMuICBJZiBpdCByZXR1cm5lZCwgaXQKKyAqIHN1Y2NlZWRlZC4gKi8KKworI2lmbmRlZiBETUFMTE9DCisvKiBkbWFsbG9jIHByb3ZpZGVzIHZhcmlhbnRzIG9mIHRoZXNlIHRoYXQgZG8gYWJvcnQoKSBvbiBmYWlsdXJlLgorICogU2luY2UgZG1hbGxvYydzIHByb3RvdHlwZXMgb3ZlcndyaXRlIHRoZSBpbXBscyBoZXJlIGFzIHRoZXkgYXJlCisgKiBpbmNsdWRlZCBhZnRlciB0aGVzZSBwcm90b3R5cGVzIGluIGxpYmJiLmgsIGFsbCBpcyB3ZWxsLgorICovCisvLyBXYXJuIGlmIHdlIGNhbid0IGFsbG9jYXRlIHNpemUgYnl0ZXMgb2YgbWVtb3J5Lgordm9pZCogRkFTVF9GVU5DIG1hbGxvY19vcl93YXJuKHNpemVfdCBzaXplKQoreworCXZvaWQgKnB0ciA9IG1hbGxvYyhzaXplKTsKKwlpZiAocHRyID09IE5VTEwgJiYgc2l6ZSAhPSAwKQorCQliYl9lcnJvcl9tc2coYmJfbXNnX21lbW9yeV9leGhhdXN0ZWQpOworCXJldHVybiBwdHI7Cit9CisKKy8vIERpZSBpZiB3ZSBjYW4ndCBhbGxvY2F0ZSBzaXplIGJ5dGVzIG9mIG1lbW9yeS4KK3ZvaWQqIEZBU1RfRlVOQyB4bWFsbG9jKHNpemVfdCBzaXplKQoreworCXZvaWQgKnB0ciA9IG1hbGxvYyhzaXplKTsKKwlpZiAocHRyID09IE5VTEwgJiYgc2l6ZSAhPSAwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfbWVtb3J5X2V4aGF1c3RlZCk7CisJcmV0dXJuIHB0cjsKK30KKworLy8gRGllIGlmIHdlIGNhbid0IHJlc2l6ZSBwcmV2aW91c2x5IGFsbG9jYXRlZCBtZW1vcnkuICAoVGhpcyByZXR1cm5zIGEgcG9pbnRlcgorLy8gdG8gdGhlIG5ldyBtZW1vcnksIHdoaWNoIG1heSBvciBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIHRoZSBvbGQgbWVtb3J5LgorLy8gSXQnbGwgY29weSB0aGUgY29udGVudHMgdG8gYSBuZXcgY2h1bmsgYW5kIGZyZWUgdGhlIG9sZCBvbmUgaWYgbmVjZXNzYXJ5LikKK3ZvaWQqIEZBU1RfRlVOQyB4cmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBzaXplKQoreworCXB0ciA9IHJlYWxsb2MocHRyLCBzaXplKTsKKwlpZiAocHRyID09IE5VTEwgJiYgc2l6ZSAhPSAwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfbWVtb3J5X2V4aGF1c3RlZCk7CisJcmV0dXJuIHB0cjsKK30KKyNlbmRpZiAvKiBETUFMTE9DICovCisKKy8vIERpZSBpZiB3ZSBjYW4ndCBhbGxvY2F0ZSBhbmQgemVybyBzaXplIGJ5dGVzIG9mIG1lbW9yeS4KK3ZvaWQqIEZBU1RfRlVOQyB4emFsbG9jKHNpemVfdCBzaXplKQoreworCXZvaWQgKnB0ciA9IHhtYWxsb2Moc2l6ZSk7CisJbWVtc2V0KHB0ciwgMCwgc2l6ZSk7CisJcmV0dXJuIHB0cjsKK30KKworLy8gRGllIGlmIHdlIGNhbid0IGNvcHkgYSBzdHJpbmcgdG8gZnJlc2hseSBhbGxvY2F0ZWQgbWVtb3J5LgorY2hhciogRkFTVF9GVU5DIHhzdHJkdXAoY29uc3QgY2hhciAqcykKK3sKKwljaGFyICp0OworCisJaWYgKHMgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwl0ID0gc3RyZHVwKHMpOworCisJaWYgKHQgPT0gTlVMTCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX21lbW9yeV9leGhhdXN0ZWQpOworCisJcmV0dXJuIHQ7Cit9CisKKy8vIERpZSBpZiB3ZSBjYW4ndCBhbGxvY2F0ZSBuKzEgYnl0ZXMgKHNwYWNlIGZvciB0aGUgbnVsbCB0ZXJtaW5hdG9yKSBhbmQgY29weQorLy8gdGhlIChwb3NzaWJseSB0cnVuY2F0ZWQgdG8gbGVuZ3RoIG4pIHN0cmluZyBpbnRvIGl0LgorY2hhciogRkFTVF9GVU5DIHhzdHJuZHVwKGNvbnN0IGNoYXIgKnMsIGludCBuKQoreworCWludCBtOworCWNoYXIgKnQ7CisKKwlpZiAoRU5BQkxFX0RFQlVHICYmIHMgPT0gTlVMTCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInhzdHJuZHVwIGJ1ZyIpOworCisJLyogV2UgY2FuIGp1c3QgeG1hbGxvYyhuKzEpIGFuZCBzdHJuY3B5IGludG8gaXQsICovCisJLyogYnV0IHRoaW5rIGFib3V0IHhzdHJuZHVwKCJhYmMiLCAxMDAwMCkgd2FzdGFnZSEgKi8KKwltID0gbjsKKwl0ID0gKGNoYXIqKSBzOworCXdoaWxlIChtKSB7CisJCWlmICghKnQpIGJyZWFrOworCQltLS07CisJCXQrKzsKKwl9CisJbiAtPSBtOworCXQgPSB4bWFsbG9jKG4gKyAxKTsKKwl0W25dID0gJ1wwJzsKKworCXJldHVybiBtZW1jcHkodCwgcywgbik7Cit9CisKK3ZvaWQqIEZBU1RfRlVOQyB4bWVtZHVwKGNvbnN0IHZvaWQgKnMsIGludCBuKQoreworCXJldHVybiBtZW1jcHkoeG1hbGxvYyhuKSwgcywgbik7Cit9CisKKy8vIERpZSBpZiB3ZSBjYW4ndCBvcGVuIGEgZmlsZSBhbmQgcmV0dXJuIGEgRklMRSogdG8gaXQuCisvLyBOb3RpY2Ugd2UgaGF2ZW4ndCBnb3QgeGZyZWFkKCksIFRoaXMgaXMgZm9yIHVzZSB3aXRoIGZzY2FuZigpIGFuZCBmcmllbmRzLgorRklMRSogRkFTVF9GVU5DIHhmb3Blbihjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICptb2RlKQoreworCUZJTEUgKmZwID0gZm9wZW4ocGF0aCwgbW9kZSk7CisJaWYgKGZwID09IE5VTEwpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgb3BlbiAnJXMnIiwgcGF0aCk7CisJcmV0dXJuIGZwOworfQorCisvLyBEaWUgaWYgd2UgY2FuJ3Qgb3BlbiBhIGZpbGUgYW5kIHJldHVybiBhIGZkLgoraW50IEZBU1RfRlVOQyB4b3BlbjMoY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBmbGFncywgaW50IG1vZGUpCit7CisJaW50IHJldDsKKworCXJldCA9IG9wZW4ocGF0aG5hbWUsIGZsYWdzLCBtb2RlKTsKKwlpZiAocmV0IDwgMCkgeworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IG9wZW4gJyVzJyIsIHBhdGhuYW1lKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLy8gRGllIGlmIHdlIGNhbid0IG9wZW4gYSBmaWxlIGFuZCByZXR1cm4gYSBmZC4KK2ludCBGQVNUX0ZVTkMgeG9wZW4oY29uc3QgY2hhciAqcGF0aG5hbWUsIGludCBmbGFncykKK3sKKwlyZXR1cm4geG9wZW4zKHBhdGhuYW1lLCBmbGFncywgMDY2Nik7Cit9CisKKy8vIFdhcm4gaWYgd2UgY2FuJ3Qgb3BlbiBhIGZpbGUgYW5kIHJldHVybiBhIGZkLgoraW50IEZBU1RfRlVOQyBvcGVuM19vcl93YXJuKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgZmxhZ3MsIGludCBtb2RlKQoreworCWludCByZXQ7CisKKwlyZXQgPSBvcGVuKHBhdGhuYW1lLCBmbGFncywgbW9kZSk7CisJaWYgKHJldCA8IDApIHsKKwkJYmJfcGVycm9yX21zZygiY2FuJ3Qgb3BlbiAnJXMnIiwgcGF0aG5hbWUpOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvLyBXYXJuIGlmIHdlIGNhbid0IG9wZW4gYSBmaWxlIGFuZCByZXR1cm4gYSBmZC4KK2ludCBGQVNUX0ZVTkMgb3Blbl9vcl93YXJuKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIG9wZW4zX29yX3dhcm4ocGF0aG5hbWUsIGZsYWdzLCAwNjY2KTsKK30KKworLyogRGllIGlmIHdlIGNhbid0IG9wZW4gYW4gZXhpc3RpbmcgZmlsZSByZWFkb25seSB3aXRoIE9fTk9OQkxPQ0sKKyAqIGFuZCByZXR1cm4gdGhlIGZkLgorICogTm90ZSB0aGF0IGZvciBpb2N0bCBPX1JET05MWSBpcyBzdWZmaWNpZW50LgorICovCitpbnQgRkFTVF9GVU5DIHhvcGVuX25vbmJsb2NraW5nKGNvbnN0IGNoYXIgKnBhdGhuYW1lKQoreworCXJldHVybiB4b3BlbihwYXRobmFtZSwgT19SRE9OTFkgfCBPX05PTkJMT0NLKTsKK30KKworaW50IEZBU1RfRlVOQyB4b3Blbl9hc191aWRfZ2lkKGNvbnN0IGNoYXIgKnBhdGhuYW1lLCBpbnQgZmxhZ3MsIHVpZF90IHUsIGdpZF90IGcpCit7CisJaW50IGZkOworCXVpZF90IG9sZF9ldWlkID0gZ2V0ZXVpZCgpOworCWdpZF90IG9sZF9lZ2lkID0gZ2V0ZWdpZCgpOworCisJeHNldGVnaWQoZyk7CisJeHNldGV1aWQodSk7CisKKwlmZCA9IHhvcGVuKHBhdGhuYW1lLCBmbGFncyk7CisKKwl4c2V0ZXVpZChvbGRfZXVpZCk7CisJeHNldGVnaWQob2xkX2VnaWQpOworCisJcmV0dXJuIGZkOworfQorCit2b2lkIEZBU1RfRlVOQyB4dW5saW5rKGNvbnN0IGNoYXIgKnBhdGhuYW1lKQoreworCWlmICh1bmxpbmsocGF0aG5hbWUpKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJlbW92ZSBmaWxlICclcyciLCBwYXRobmFtZSk7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHhyZW5hbWUoY29uc3QgY2hhciAqb2xkcGF0aCwgY29uc3QgY2hhciAqbmV3cGF0aCkKK3sKKwlpZiAocmVuYW1lKG9sZHBhdGgsIG5ld3BhdGgpKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IG1vdmUgJyVzJyB0byAnJXMnIiwgb2xkcGF0aCwgbmV3cGF0aCk7Cit9CisKK2ludCBGQVNUX0ZVTkMgcmVuYW1lX29yX3dhcm4oY29uc3QgY2hhciAqb2xkcGF0aCwgY29uc3QgY2hhciAqbmV3cGF0aCkKK3sKKwlpbnQgbiA9IHJlbmFtZShvbGRwYXRoLCBuZXdwYXRoKTsKKwlpZiAobikKKwkJYmJfcGVycm9yX21zZygiY2FuJ3QgbW92ZSAnJXMnIHRvICclcyciLCBvbGRwYXRoLCBuZXdwYXRoKTsKKwlyZXR1cm4gbjsKK30KKwordm9pZCBGQVNUX0ZVTkMgeHBpcGUoaW50IGZpbGVkZXNbMl0pCit7CisJaWYgKHBpcGUoZmlsZWRlcykpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgY3JlYXRlIHBpcGUiKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgeGR1cDIoaW50IGZyb20sIGludCB0bykKK3sKKwlpZiAoZHVwMihmcm9tLCB0bykgIT0gdG8pCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZHVwbGljYXRlIGZpbGUgZGVzY3JpcHRvciIpOworfQorCisvLyAiUmVudW1iZXIiIG9wZW5lZCBmZAordm9pZCBGQVNUX0ZVTkMgeG1vdmVfZmQoaW50IGZyb20sIGludCB0bykKK3sKKwlpZiAoZnJvbSA9PSB0bykKKwkJcmV0dXJuOworCXhkdXAyKGZyb20sIHRvKTsKKwljbG9zZShmcm9tKTsKK30KKworLy8gRGllIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiB3ZSBjYW4ndCB3cml0ZSB0aGUgZW50aXJlIGJ1ZmZlci4KK3ZvaWQgRkFTVF9GVU5DIHh3cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWlmIChjb3VudCkgeworCQlzc2l6ZV90IHNpemUgPSBmdWxsX3dyaXRlKGZkLCBidWYsIGNvdW50KTsKKwkJaWYgKChzaXplX3Qpc2l6ZSAhPSBjb3VudCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzaG9ydCB3cml0ZSIpOworCX0KK30KK3ZvaWQgRkFTVF9GVU5DIHh3cml0ZV9zdHIoaW50IGZkLCBjb25zdCBjaGFyICpzdHIpCit7CisJeHdyaXRlKGZkLCBzdHIsIHN0cmxlbihzdHIpKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgeGNsb3NlKGludCBmZCkKK3sKKwlpZiAoY2xvc2UoZmQpKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNsb3NlIGZhaWxlZCIpOworfQorCisvLyBEaWUgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGlmIHdlIGNhbid0IGxzZWVrIHRvIHRoZSByaWdodCBzcG90Lgorb2ZmX3QgRkFTVF9GVU5DIHhsc2VlayhpbnQgZmQsIG9mZl90IG9mZnNldCwgaW50IHdoZW5jZSkKK3sKKwlvZmZfdCBvZmYgPSBsc2VlayhmZCwgb2Zmc2V0LCB3aGVuY2UpOworCWlmIChvZmYgPT0gKG9mZl90KS0xKSB7CisJCWlmICh3aGVuY2UgPT0gU0VFS19TRVQpCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImxzZWVrKCUiT0ZGX0ZNVCJ1KSIsIG9mZnNldCk7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgibHNlZWsiKTsKKwl9CisJcmV0dXJuIG9mZjsKK30KKworaW50IEZBU1RfRlVOQyB4bWtzdGVtcChjaGFyICp0ZW1wbGF0ZSkKK3sKKwlpbnQgZmQgPSBta3N0ZW1wKHRlbXBsYXRlKTsKKwlpZiAoZmQgPCAwKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGNyZWF0ZSB0ZW1wIGZpbGUgJyVzJyIsIHRlbXBsYXRlKTsKKwlyZXR1cm4gZmQ7Cit9CisKKy8vIERpZSB3aXRoIHN1cHBsaWVkIGZpbGVuYW1lIGlmIHRoaXMgRklMRSogaGFzIGZlcnJvciBzZXQuCit2b2lkIEZBU1RfRlVOQyBkaWVfaWZfZmVycm9yKEZJTEUgKmZwLCBjb25zdCBjaGFyICpmbikKK3sKKwlpZiAoZmVycm9yKGZwKSkgeworCQkvKiBmZXJyb3IgZG9lc24ndCBzZXQgdXNlZnVsIGVycm5vICovCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlczogSS9PIGVycm9yIiwgZm4pOworCX0KK30KKworLy8gRGllIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBzdGRvdXQgaGFzIGZlcnJvciBzZXQuCit2b2lkIEZBU1RfRlVOQyBkaWVfaWZfZmVycm9yX3N0ZG91dCh2b2lkKQoreworCWRpZV9pZl9mZXJyb3Ioc3Rkb3V0LCBiYl9tc2dfc3RhbmRhcmRfb3V0cHV0KTsKK30KKworaW50IEZBU1RfRlVOQyBmZmx1c2hfYWxsKHZvaWQpCit7CisJcmV0dXJuIGZmbHVzaChOVUxMKTsKK30KKworCitpbnQgRkFTVF9GVU5DIGJiX3B1dGNoYXIoaW50IGNoKQoreworCXJldHVybiBwdXRjaGFyKGNoKTsKK30KKworLyogRGllIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiB3ZSBjYW4ndCBjb3B5IGFuIGVudGlyZSBGSUxFKiB0byBzdGRvdXQsCisgKiB0aGVuIGNsb3NlIHRoYXQgZmlsZS4gKi8KK3ZvaWQgRkFTVF9GVU5DIHhwcmludF9hbmRfY2xvc2VfZmlsZShGSUxFICpmaWxlKQoreworCWZmbHVzaF9hbGwoKTsKKwkvLyBjb3B5ZmQgb3V0cHV0cyBlcnJvciBtZXNzYWdlcyBmb3IgdXMuCisJaWYgKGJiX2NvcHlmZF9lb2YoZmlsZW5vKGZpbGUpLCBTVERPVVRfRklMRU5PKSA9PSAtMSkKKwkJeGZ1bmNfZGllKCk7CisKKwlmY2xvc2UoZmlsZSk7Cit9CisKKy8vIERpZSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgd2UgY2FuJ3QgbWFsbG9jKCkgZW5vdWdoIHNwYWNlIGFuZCBkbyBhbgorLy8gc3ByaW50ZigpIGludG8gdGhhdCBzcGFjZS4KK2NoYXIqIEZBU1RfRlVOQyB4YXNwcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBwOworCWludCByOworCWNoYXIgKnN0cmluZ19wdHI7CisKKwl2YV9zdGFydChwLCBmb3JtYXQpOworCXIgPSB2YXNwcmludGYoJnN0cmluZ19wdHIsIGZvcm1hdCwgcCk7CisJdmFfZW5kKHApOworCisJaWYgKHIgPCAwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfbWVtb3J5X2V4aGF1c3RlZCk7CisJcmV0dXJuIHN0cmluZ19wdHI7Cit9CisKK3ZvaWQgRkFTVF9GVU5DIHhzZXRlbnYoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAoc2V0ZW52KGtleSwgdmFsdWUsIDEpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfbWVtb3J5X2V4aGF1c3RlZCk7Cit9CisKKy8qIEhhbmRsZXMgIlZBUj1WQUwiIHN0cmluZ3MsIGV2ZW4gdGhvc2Ugd2hpY2ggYXJlIHBhcnQgb2YgZW52aXJvbgorICogX3JpZ2h0IG5vd18KKyAqLwordm9pZCBGQVNUX0ZVTkMgYmJfdW5zZXRlbnYoY29uc3QgY2hhciAqdmFyKQoreworCWNoYXIgKnRwID0gc3RyY2hyKHZhciwgJz0nKTsKKworCWlmICghdHApIHsKKwkJdW5zZXRlbnYodmFyKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEluIGNhc2UgdmFyIHdhcyBwdXRlbnYnZWQsIHdlIGNhbid0IHJlcGxhY2UgJz0nCisJICogd2l0aCBOVUwgYW5kIHVuc2V0ZW52KHZhcikgLSBpdCB3b24ndCB3b3JrLAorCSAqIGVudiBpcyBtb2RpZmllZCBieSB0aGUgcmVwbGFjZW1lbnQsIHVuc2V0ZW52CisJICogc2VlcyAiVkFSIiBpbnN0ZWFkIG9mICJWQVI9VkFMIiBhbmQgZG9lcyBub3QgcmVtb3ZlIGl0IQorCSAqIGhvcnJvciA6KCAqLworCXRwID0geHN0cm5kdXAodmFyLCB0cCAtIHZhcik7CisJdW5zZXRlbnYodHApOworCWZyZWUodHApOworfQorCit2b2lkIEZBU1RfRlVOQyBiYl91bnNldGVudl9hbmRfZnJlZShjaGFyICp2YXIpCit7CisJYmJfdW5zZXRlbnYodmFyKTsKKwlmcmVlKHZhcik7Cit9CisKKy8vIERpZSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgd2UgY2FuJ3Qgc2V0IGdpZC4gIChCZWNhdXNlIHJlc291cmNlIGxpbWl0cyBtYXkKKy8vIGxpbWl0IHRoaXMgdXNlciB0byBhIGdpdmVuIG51bWJlciBvZiBwcm9jZXNzZXMsIGFuZCBpZiB0aGF0IGZpbGxzIHVwIHRoZQorLy8gc2V0Z2lkKCkgd2lsbCBmYWlsIGFuZCB3ZSdsbCBfc3RpbGxfYmVfcm9vdF8sIHdoaWNoIGlzIGJhZC4pCit2b2lkIEZBU1RfRlVOQyB4c2V0Z2lkKGdpZF90IGdpZCkKK3sKKwlpZiAoc2V0Z2lkKGdpZCkpIGJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0Z2lkIik7Cit9CisKKy8vIERpZSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgd2UgY2FuJ3Qgc2V0IHVpZC4gIChTZWUgeHNldGdpZCgpIGZvciB3aHkuKQordm9pZCBGQVNUX0ZVTkMgeHNldHVpZCh1aWRfdCB1aWQpCit7CisJaWYgKHNldHVpZCh1aWQpKSBiYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNldHVpZCIpOworfQorCit2b2lkIEZBU1RfRlVOQyB4c2V0ZWdpZChnaWRfdCBlZ2lkKQoreworCWlmIChzZXRlZ2lkKGVnaWQpKSBiYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNldGVnaWQiKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgeHNldGV1aWQodWlkX3QgZXVpZCkKK3sKKwlpZiAoc2V0ZXVpZChldWlkKSkgYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZXRldWlkIik7Cit9CisKKy8vIERpZSBpZiB3ZSBjYW4ndCBjaGRpciB0byBhIG5ldyBwYXRoLgordm9pZCBGQVNUX0ZVTkMgeGNoZGlyKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaWYgKGNoZGlyKHBhdGgpKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGNoYW5nZSBkaXJlY3RvcnkgdG8gJyVzJyIsIHBhdGgpOworfQorCit2b2lkIEZBU1RfRlVOQyB4Y2hyb290KGNvbnN0IGNoYXIgKnBhdGgpCit7CisJaWYgKGNocm9vdChwYXRoKSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBjaGFuZ2Ugcm9vdCBkaXJlY3RvcnkgdG8gJyVzJyIsIHBhdGgpOworCXhjaGRpcigiLyIpOworfQorCisvLyBQcmludCBhIHdhcm5pbmcgbWVzc2FnZSBpZiBvcGVuZGlyKCkgZmFpbHMsIGJ1dCBkb24ndCBkaWUuCitESVIqIEZBU1RfRlVOQyB3YXJuX29wZW5kaXIoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlESVIgKmRwOworCisJZHAgPSBvcGVuZGlyKHBhdGgpOworCWlmICghZHApCisJCWJiX3BlcnJvcl9tc2coImNhbid0IG9wZW4gJyVzJyIsIHBhdGgpOworCXJldHVybiBkcDsKK30KKworLy8gRGllIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBvcGVuZGlyKCkgZmFpbHMuCitESVIqIEZBU1RfRlVOQyB4b3BlbmRpcihjb25zdCBjaGFyICpwYXRoKQoreworCURJUiAqZHA7CisKKwlkcCA9IG9wZW5kaXIocGF0aCk7CisJaWYgKCFkcCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBvcGVuICclcyciLCBwYXRoKTsKKwlyZXR1cm4gZHA7Cit9CisKKy8vIERpZSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgd2UgY2FuJ3Qgb3BlbiBhIG5ldyBzb2NrZXQuCitpbnQgRkFTVF9GVU5DIHhzb2NrZXQoaW50IGRvbWFpbiwgaW50IHR5cGUsIGludCBwcm90b2NvbCkKK3sKKwlpbnQgciA9IHNvY2tldChkb21haW4sIHR5cGUsIHByb3RvY29sKTsKKworCWlmIChyIDwgMCkgeworCQkvKiBIaWphY2sgdmFndWVseSByZWxhdGVkIGNvbmZpZyBvcHRpb24gKi8KKyNpZiBFTkFCTEVfVkVSQk9TRV9SRVNPTFVUSU9OX0VSUk9SUworCQljb25zdCBjaGFyICpzID0gIklORVQiOworIyBpZmRlZiBBRl9QQUNLRVQKKwkJaWYgKGRvbWFpbiA9PSBBRl9QQUNLRVQpIHMgPSAiUEFDS0VUIjsKKyMgZW5kaWYKKyMgaWZkZWYgQUZfTkVUTElOSworCQlpZiAoZG9tYWluID09IEFGX05FVExJTkspIHMgPSAiTkVUTElOSyI7CisjIGVuZGlmCitJRl9GRUFUVVJFX0lQVjYoaWYgKGRvbWFpbiA9PSBBRl9JTkVUNikgcyA9ICJJTkVUNiI7KQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNvY2tldChBRl8lcywlZCwlZCkiLCBzLCB0eXBlLCBwcm90b2NvbCk7CisjZWxzZQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNvY2tldCIpOworI2VuZGlmCisJfQorCisJcmV0dXJuIHI7Cit9CisKKy8vIERpZSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgd2UgY2FuJ3QgYmluZCBhIHNvY2tldCB0byBhbiBhZGRyZXNzLgordm9pZCBGQVNUX0ZVTkMgeGJpbmQoaW50IHNvY2tmZCwgc3RydWN0IHNvY2thZGRyICpteV9hZGRyLCBzb2NrbGVuX3QgYWRkcmxlbikKK3sKKwlpZiAoYmluZChzb2NrZmQsIG15X2FkZHIsIGFkZHJsZW4pKSBiYl9wZXJyb3JfbXNnX2FuZF9kaWUoImJpbmQiKTsKK30KKworLy8gRGllIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiB3ZSBjYW4ndCBsaXN0ZW4gZm9yIGNvbm5lY3Rpb25zIG9uIGEgc29ja2V0Lgordm9pZCBGQVNUX0ZVTkMgeGxpc3RlbihpbnQgcywgaW50IGJhY2tsb2cpCit7CisJaWYgKGxpc3RlbihzLCBiYWNrbG9nKSkgYmJfcGVycm9yX21zZ19hbmRfZGllKCJsaXN0ZW4iKTsKK30KKworLyogRGllIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBzZW5kdG8gZmFpbGVkLgorICogUmV0dXJuIGJ5dGVzIHNlbnQgb3RoZXJ3aXNlICAqLworc3NpemVfdCBGQVNUX0ZVTkMgeHNlbmR0byhpbnQgcywgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnRvLAorCQkJCXNvY2tsZW5fdCB0b2xlbikKK3sKKwlzc2l6ZV90IHJldCA9IHNlbmR0byhzLCBidWYsIGxlbiwgMCwgdG8sIHRvbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQljbG9zZShzKTsKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZW5kdG8iKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLy8geHN0YXQoKSAtIGEgc3RhdCgpIHdoaWNoIGRpZXMgb24gZmFpbHVyZSB3aXRoIG1lYW5pbmdmdWwgZXJyb3IgbWVzc2FnZQordm9pZCBGQVNUX0ZVTkMgeHN0YXQoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IHN0YXQgKnN0YXRfYnVmKQoreworCWlmIChzdGF0KG5hbWUsIHN0YXRfYnVmKSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzdGF0ICclcyciLCBuYW1lKTsKK30KKwordm9pZCBGQVNUX0ZVTkMgeGZzdGF0KGludCBmZCwgc3RydWN0IHN0YXQgKnN0YXRfYnVmLCBjb25zdCBjaGFyICplcnJtc2cpCit7CisJLyogZXJybXNnIGlzIHVzdWFsbHkgYSBmaWxlIG5hbWUsIGJ1dCBub3QgYWx3YXlzOgorCSAqIHhmc3RhdCBtYXkgYmUgY2FsbGVkIGluIGEgc3BvdCB3aGVyZSBmaWxlIG5hbWUgaXMgbm8gbG9uZ2VyCisJICogYXZhaWxhYmxlLCBhbmQgY2FsbGVyIG1heSBnaXZlIGUuZy4gImNhbid0IHN0YXQgaW5wdXQgZmlsZSIgc3RyaW5nLgorCSAqLworCWlmIChmc3RhdChmZCwgc3RhdF9idWYpKQorCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKGVycm1zZyk7Cit9CisKKy8vIHNlbGludXhfb3JfZGllKCkgLSBkaWUgaWYgU0VMaW51eCBpcyBkaXNhYmxlZC4KK3ZvaWQgRkFTVF9GVU5DIHNlbGludXhfb3JfZGllKHZvaWQpCit7CisjaWYgRU5BQkxFX1NFTElOVVgKKwlpbnQgcmMgPSBpc19zZWxpbnV4X2VuYWJsZWQoKTsKKwlpZiAocmMgPT0gMCkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiU0VMaW51eCBpcyBkaXNhYmxlZCIpOworCX0gZWxzZSBpZiAocmMgPCAwKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpc19zZWxpbnV4X2VuYWJsZWQoKSBmYWlsZWQiKTsKKwl9CisjZWxzZQorCWJiX2Vycm9yX21zZ19hbmRfZGllKCJTRUxpbnV4IHN1cHBvcnQgaXMgZGlzYWJsZWQiKTsKKyNlbmRpZgorfQorCitpbnQgRkFTVF9GVU5DIGlvY3RsX29yX3BlcnJvcl9hbmRfZGllKGludCBmZCwgdW5zaWduZWQgcmVxdWVzdCwgdm9pZCAqYXJncCwgY29uc3QgY2hhciAqZm10LC4uLikKK3sKKwlpbnQgcmV0OworCXZhX2xpc3QgcDsKKworCXJldCA9IGlvY3RsKGZkLCByZXF1ZXN0LCBhcmdwKTsKKwlpZiAocmV0IDwgMCkgeworCQl2YV9zdGFydChwLCBmbXQpOworCQliYl92ZXJyb3JfbXNnKGZtdCwgcCwgc3RyZXJyb3IoZXJybm8pKTsKKwkJLyogeGZ1bmNfZGllIGNhbiBhY3R1YWxseSBsb25nam1wLCBzbyBiZSBuaWNlICovCisJCXZhX2VuZChwKTsKKwkJeGZ1bmNfZGllKCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKK2ludCBGQVNUX0ZVTkMgaW9jdGxfb3JfcGVycm9yKGludCBmZCwgdW5zaWduZWQgcmVxdWVzdCwgdm9pZCAqYXJncCwgY29uc3QgY2hhciAqZm10LC4uLikKK3sKKwl2YV9saXN0IHA7CisJaW50IHJldCA9IGlvY3RsKGZkLCByZXF1ZXN0LCBhcmdwKTsKKworCWlmIChyZXQgPCAwKSB7CisJCXZhX3N0YXJ0KHAsIGZtdCk7CisJCWJiX3ZlcnJvcl9tc2coZm10LCBwLCBzdHJlcnJvcihlcnJubykpOworCQl2YV9lbmQocCk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKyNpZiBFTkFCTEVfSU9DVExfSEVYMlNUUl9FUlJPUgoraW50IEZBU1RfRlVOQyBiYl9pb2N0bF9vcl93YXJuKGludCBmZCwgdW5zaWduZWQgcmVxdWVzdCwgdm9pZCAqYXJncCwgY29uc3QgY2hhciAqaW9jdGxfbmFtZSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gaW9jdGwoZmQsIHJlcXVlc3QsIGFyZ3ApOworCWlmIChyZXQgPCAwKQorCQliYl9zaW1wbGVfcGVycm9yX21zZyhpb2N0bF9uYW1lKTsKKwlyZXR1cm4gcmV0OworfQoraW50IEZBU1RfRlVOQyBiYl94aW9jdGwoaW50IGZkLCB1bnNpZ25lZCByZXF1ZXN0LCB2b2lkICphcmdwLCBjb25zdCBjaGFyICppb2N0bF9uYW1lKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpb2N0bChmZCwgcmVxdWVzdCwgYXJncCk7CisJaWYgKHJldCA8IDApCisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUoaW9jdGxfbmFtZSk7CisJcmV0dXJuIHJldDsKK30KKyNlbHNlCitpbnQgRkFTVF9GVU5DIGJiX2lvY3RsX29yX3dhcm4oaW50IGZkLCB1bnNpZ25lZCByZXF1ZXN0LCB2b2lkICphcmdwKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpb2N0bChmZCwgcmVxdWVzdCwgYXJncCk7CisJaWYgKHJldCA8IDApCisJCWJiX3BlcnJvcl9tc2coImlvY3RsICUjeCBmYWlsZWQiLCByZXF1ZXN0KTsKKwlyZXR1cm4gcmV0OworfQoraW50IEZBU1RfRlVOQyBiYl94aW9jdGwoaW50IGZkLCB1bnNpZ25lZCByZXF1ZXN0LCB2b2lkICphcmdwKQoreworCWludCByZXQ7CisKKwlyZXQgPSBpb2N0bChmZCwgcmVxdWVzdCwgYXJncCk7CisJaWYgKHJldCA8IDApCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiaW9jdGwgJSN4IGZhaWxlZCIsIHJlcXVlc3QpOworCXJldHVybiByZXQ7Cit9CisjZW5kaWYKKworY2hhciogRkFTVF9GVU5DIHhtYWxsb2NfdHR5bmFtZShpbnQgZmQpCit7CisJY2hhciBidWZbMTI4XTsKKwlpbnQgciA9IHR0eW5hbWVfcihmZCwgYnVmLCBzaXplb2YoYnVmKSAtIDEpOworCWlmIChyKQorCQlyZXR1cm4gTlVMTDsKKwlyZXR1cm4geHN0cmR1cChidWYpOworfQorCit2b2lkIEZBU1RfRlVOQyBnZW5lcmF0ZV91dWlkKHVpbnQ4X3QgKmJ1ZikKK3sKKwkvKiBodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmM0MTIyLnR4dAorCSAqICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKKwkgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVfbG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisJICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKwkgKiB8ICAgICAgIHRpbWVfbWlkICAgICAgICAgICAgICAgIHwgICAgICAgICB0aW1lX2hpX2FuZF92ZXJzaW9uICAgfAorCSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisJICogfGNsa19zZXFfYW5kX3ZhcmlhbnQgICAgICAgICAgICB8ICAgICAgICAgbm9kZSAoMC0xKSAgICAgICAgICAgIHwKKwkgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCSAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSAoMi01KSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisJICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKwkgKiBJT1csIHV1aWQgaGFzIHRoaXMgbGF5b3V0OgorCSAqIHVpbnQzMl90IHRpbWVfbG93IChiaWcgZW5kaWFuKQorCSAqIHVpbnQxNl90IHRpbWVfbWlkIChiaWcgZW5kaWFuKQorCSAqIHVpbnQxNl90IHRpbWVfaGlfYW5kX3ZlcnNpb24gKGJpZyBlbmRpYW4pCisJICogIHZlcnNpb24gaXMgYSA0LWJpdCBmaWVsZDoKKwkgKiAgIDEgVGltZS1iYXNlZAorCSAqICAgMiBEQ0UgU2VjdXJpdHksIHdpdGggZW1iZWRkZWQgUE9TSVggVUlEcworCSAqICAgMyBOYW1lLWJhc2VkIChNRDUpCisJICogICA0IFJhbmRvbWx5IGdlbmVyYXRlZAorCSAqICAgNSBOYW1lLWJhc2VkIChTSEEtMSkKKwkgKiB1aW50MTZfdCBjbGtfc2VxX2FuZF92YXJpYW50IChiaWcgZW5kaWFuKQorCSAqICB2YXJpYW50IGlzIGEgMy1iaXQgZmllbGQ6CisJICogICAweHggUmVzZXJ2ZWQsIE5DUyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisJICogICAxMHggVGhlIHZhcmlhbnQgc3BlY2lmaWVkIGluIHJmYzQxMjIKKwkgKiAgIDExMCBSZXNlcnZlZCwgTWljcm9zb2Z0IGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKwkgKiAgIDExMSBSZXNlcnZlZCBmb3IgZnV0dXJlIGRlZmluaXRpb24KKwkgKiB1aW50OF90IG5vZGVbNl0KKwkgKgorCSAqIEZvciB2ZXJzaW9uIDQsIHRoZXNlIGJpdHMgYXJlIHNldC9jbGVhcmVkOgorCSAqIHRpbWVfaGlfYW5kX3ZlcnNpb24gJiAweDBmZmYgfCAweDQwMDAKKwkgKiBjbGtfc2VxX2FuZF92YXJpYW50ICYgMHgzZmZmIHwgMHg4MDAwCisJICovCisJcGlkX3QgcGlkOworCWludCBpOworCisJaSA9IG9wZW4oIi9kZXYvdXJhbmRvbSIsIE9fUkRPTkxZKTsKKwlpZiAoaSA+PSAwKSB7CisJCXJlYWQoaSwgYnVmLCAxNik7CisJCWNsb3NlKGkpOworCX0KKwkvKiBQYXJhbm9pYS4gL2Rldi91cmFuZG9tIG1heSBiZSBtaXNzaW5nLgorCSAqIHJhbmQoKSBpcyBndWFyYW50ZWVkIHRvIGdlbmVyYXRlIGF0IGxlYXN0IFswLCAyXjE1KSByYW5nZSwKKwkgKiBidXQgbG93ZXN0IGJpdHMgaW4gc29tZSBsaWJjIGFyZSBub3Qgc28gInJhbmRvbSIuICAqLworCXNyYW5kKG1vbm90b25pY191cygpKTsgLyogcHVsbHMgaW4gcHJpbnRmICovCisJcGlkID0gZ2V0cGlkKCk7CisJd2hpbGUgKDEpIHsKKwkJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspCisJCQlidWZbaV0gXj0gcmFuZCgpID4+IDU7CisJCWlmIChwaWQgPT0gMCkKKwkJCWJyZWFrOworCQlzcmFuZChwaWQpOworCQlwaWQgPSAwOworCX0KKworCS8qIHZlcnNpb24gPSA0ICovCisJYnVmWzQgKyAyICAgIF0gPSAoYnVmWzQgKyAyICAgIF0gJiAweDBmKSB8IDB4NDA7CisJLyogdmFyaWFudCA9IDEweCAqLworCWJ1Zls0ICsgMiArIDJdID0gKGJ1Zls0ICsgMiArIDJdICYgMHgzZikgfCAweDgwOworfQorCisjaWYgQkJfTU1VCitwaWRfdCBGQVNUX0ZVTkMgeGZvcmsodm9pZCkKK3sKKwlwaWRfdCBwaWQ7CisJcGlkID0gZm9yaygpOworCWlmIChwaWQgPCAwKSAvKiB3dGY/ICovCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgidmZvcmsiKzEpOworCXJldHVybiBwaWQ7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpYmJiL3hnZXRjd2QuYyBiL2xpYmJiL3hnZXRjd2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTcyMGQzCi0tLSAvZGV2L251bGwKKysrIGIvbGliYmIveGdldGN3ZC5jCkBAIC0wLDAgKzEsNDMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHhnZXRjd2QuYyAtLSByZXR1cm4gY3VycmVudCBkaXJlY3Rvcnkgd2l0aCB1bmxpbWl0ZWQgbGVuZ3RoCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIsIDE5OTYgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgKiBXcml0dGVuIGJ5IERhdmlkIE1hY0tlbnppZSA8ZGptQGdudS5haS5taXQuZWR1Pi4KKyAqCisgKiBTcGVjaWFsIGZ1bmN0aW9uIGZvciBidXN5Ym94IHdyaXR0ZW4gYnkgVmxhZGltaXIgT2xleW5payA8ZHpvQHNpbXRyZWFzLnJ1PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIFJldHVybiB0aGUgY3VycmVudCBkaXJlY3RvcnksIG5ld2x5IGFsbG9jYXRlZCwgYXJiaXRyYXJpbHkgbG9uZy4KKyAgIFJldHVybiBOVUxMIGFuZCBzZXQgZXJybm8gb24gZXJyb3IuCisgICBJZiBhcmd1bWVudCBpcyBub3QgTlVMTCAocHJldmlvdXMgdXNhZ2UgYWxsb2NhdGUgbWVtb3J5KSwgY2FsbCBmcmVlKCkKKyovCisKK2NoYXIqIEZBU1RfRlVOQworeHJlYWxsb2NfZ2V0Y3dkX29yX3dhcm4oY2hhciAqY3dkKQoreworI2RlZmluZSBQQVRIX0lOQ1IgNjQKKworCWNoYXIgKnJldDsKKwl1bnNpZ25lZCBwYXRoX21heDsKKworCXBhdGhfbWF4ID0gMTI4OyAvKiAxMjggKyA2NCBzaG91bGQgYmUgZW5vdWdoIGZvciA5OSUgb2YgY2FzZXMgKi8KKworCXdoaWxlICgxKSB7CisJCXBhdGhfbWF4ICs9IFBBVEhfSU5DUjsKKwkJY3dkID0geHJlYWxsb2MoY3dkLCBwYXRoX21heCk7CisJCXJldCA9IGdldGN3ZChjd2QsIHBhdGhfbWF4KTsKKwkJaWYgKHJldCA9PSBOVUxMKSB7CisJCQlpZiAoZXJybm8gPT0gRVJBTkdFKQorCQkJCWNvbnRpbnVlOworCQkJZnJlZShjd2QpOworCQkJYmJfcGVycm9yX21zZygiZ2V0Y3dkIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQljd2QgPSB4cmVhbGxvYyhjd2QsIHN0cmxlbihjd2QpICsgMSk7CisJCXJldHVybiBjd2Q7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGliYmIveGdldGhvc3RieW5hbWUuYyBiL2xpYmJiL3hnZXRob3N0YnluYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkMDMyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3hnZXRob3N0YnluYW1lLmMKQEAgLTAsMCArMSwxNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSB4Z2V0aG9zdGJ5bmFtZSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTWF0dCBLcmFhaSA8a3JhYWlAYWx1bW5pLmNhcm5lZ2llbWVsbG9uLmVkdT4uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisKK3N0cnVjdCBob3N0ZW50KiBGQVNUX0ZVTkMgeGdldGhvc3RieW5hbWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgaG9zdGVudCAqcmV0dmFsID0gZ2V0aG9zdGJ5bmFtZShuYW1lKTsKKwlpZiAoIXJldHZhbCkKKwkJYmJfaGVycm9yX21zZ19hbmRfZGllKCIlcyIsIG5hbWUpOworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9saWJiYi94cmVhZGxpbmsuYyBiL2xpYmJiL3hyZWFkbGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNGNiNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saWJiYi94cmVhZGxpbmsuYwpAQCAtMCwwICsxLDEyNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogeHJlYWRsaW5rLmMgLSBzYWZlIGltcGxlbWVudGF0aW9uIG9mIHJlYWRsaW5rLgorICogUmV0dXJucyBhIE5VTEwgb24gZmFpbHVyZS4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBTb21lIHN5c3RlbXMgKGVnIEh1cmQpIGRvIG5vdCBoYXZlIE1BWFNZTUxJTktTIGRlZmluaXRpb24sCisgKiBzZXQgaXQgdG8gc29tZSByZWFzb25hYmxlIHZhbHVlIGlmIGl0IGlzbid0IGRlZmluZWQgKi8KKyNpZm5kZWYgTUFYU1lNTElOS1MKKyMgZGVmaW5lIE1BWFNZTUxJTktTIDIwCisjZW5kaWYKKworLyoKKyAqIE5PVEU6IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG1hbGxvY2VkIGNoYXIqIHRoYXQgeW91IHdpbGwgaGF2ZSB0byBmcmVlCisgKiB5b3Vyc2VsZi4KKyAqLworY2hhciogRkFTVF9GVU5DIHhtYWxsb2NfcmVhZGxpbmsoY29uc3QgY2hhciAqcGF0aCkKK3sKKwllbnVtIHsgR1JPV0JZID0gODAgfTsgLyogaG93IGxhcmdlIHdlIHdpbGwgZ3JvdyBzdHJpbmdzIGJ5ICovCisKKwljaGFyICpidWYgPSBOVUxMOworCWludCBidWZzaXplID0gMCwgcmVhZHNpemUgPSAwOworCisJZG8geworCQlidWZzaXplICs9IEdST1dCWTsKKwkJYnVmID0geHJlYWxsb2MoYnVmLCBidWZzaXplKTsKKwkJcmVhZHNpemUgPSByZWFkbGluayhwYXRoLCBidWYsIGJ1ZnNpemUpOworCQlpZiAocmVhZHNpemUgPT0gLTEpIHsKKwkJCWZyZWUoYnVmKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJfSB3aGlsZSAoYnVmc2l6ZSA8IHJlYWRzaXplICsgMSk7CisKKwlidWZbcmVhZHNpemVdID0gJ1wwJzsKKworCXJldHVybiBidWY7Cit9CisKKy8qCisgKiBUaGlzIHJvdXRpbmUgaXMgbm90IHRoZSBzYW1lIGFzIHJlYWxwYXRoKCksIHdoaWNoCisgKiBjYW5vbmljYWxpemVzIHRoZSBnaXZlbiBwYXRoIGNvbXBsZXRlbHkuIFRoaXMgcm91dGluZSBvbmx5CisgKiBmb2xsb3dzIHRyYWlsaW5nIHN5bWxpbmtzIHVudGlsIGEgcmVhbCBmaWxlIGlzIHJlYWNoZWQgYW5kCisgKiByZXR1cm5zIGl0cyBuYW1lLiBJZiB0aGUgcGF0aCBlbmRzIGluIGEgZGFuZ2xpbmcgbGluayBvciBpZgorICogdGhlIHRhcmdldCBkb2Vzbid0IGV4aXN0LCB0aGUgcGF0aCBpcyByZXR1cm5lZCBpbiBhbnkgY2FzZS4KKyAqIEludGVybWVkaWF0ZSBzeW1saW5rcyBpbiB0aGUgcGF0aCBhcmUgbm90IGV4cGFuZGVkIC0tIG9ubHkKKyAqIHRob3NlIGF0IHRoZSB0YWlsLgorICogQSBtYWxsb2NlZCBjaGFyKiBpcyByZXR1cm5lZCwgd2hpY2ggbXVzdCBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorICovCitjaGFyKiBGQVNUX0ZVTkMgeG1hbGxvY19mb2xsb3dfc3ltbGlua3MoY29uc3QgY2hhciAqcGF0aCkKK3sKKwljaGFyICpidWY7CisJY2hhciAqbHBjOworCWNoYXIgKmxpbmtwYXRoOworCWludCBidWZzaXplOworCWludCBsb29waW5nID0gTUFYU1lNTElOS1MgKyAxOworCisJYnVmID0geHN0cmR1cChwYXRoKTsKKwlnb3RvIGp1bXBfaW47CisKKwl3aGlsZSAoMSkgeworCQlsaW5rcGF0aCA9IHhtYWxsb2NfcmVhZGxpbmsoYnVmKTsKKwkJaWYgKCFsaW5rcGF0aCkgeworCQkJLyogbm90IGEgc3ltbGluaywgb3IgZG9lc24ndCBleGlzdCAqLworCQkJaWYgKGVycm5vID09IEVJTlZBTCB8fCBlcnJubyA9PSBFTk9FTlQpCisJCQkJcmV0dXJuIGJ1ZjsKKwkJCWdvdG8gZnJlZV9idWZfcmV0X251bGw7CisJCX0KKworCQlpZiAoIS0tbG9vcGluZykgeworCQkJZnJlZShsaW5rcGF0aCk7CisgZnJlZV9idWZfcmV0X251bGw6CisJCQlmcmVlKGJ1Zik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCisJCWlmICgqbGlua3BhdGggIT0gJy8nKSB7CisJCQlidWZzaXplICs9IHN0cmxlbihsaW5rcGF0aCk7CisJCQlidWYgPSB4cmVhbGxvYyhidWYsIGJ1ZnNpemUpOworCQkJbHBjID0gYmJfZ2V0X2xhc3RfcGF0aF9jb21wb25lbnRfc3RyaXAoYnVmKTsKKwkJCXN0cmNweShscGMsIGxpbmtwYXRoKTsKKwkJCWZyZWUobGlua3BhdGgpOworCQl9IGVsc2UgeworCQkJZnJlZShidWYpOworCQkJYnVmID0gbGlua3BhdGg7CisganVtcF9pbjoKKwkJCWJ1ZnNpemUgPSBzdHJsZW4oYnVmKSArIDE7CisJCX0KKwl9Cit9CisKK2NoYXIqIEZBU1RfRlVOQyB4bWFsbG9jX3JlYWRsaW5rX29yX3dhcm4oY29uc3QgY2hhciAqcGF0aCkKK3sKKwljaGFyICpidWYgPSB4bWFsbG9jX3JlYWRsaW5rKHBhdGgpOworCWlmICghYnVmKSB7CisJCS8qIEVJTlZBTCA9PiAiZmlsZTogSW52YWxpZCBhcmd1bWVudCIgPT4gcHV6emxlZCB1c2VyICovCisJCWNvbnN0IGNoYXIgKmVycm1zZyA9ICJub3QgYSBzeW1saW5rIjsKKwkJaW50IGVyciA9IGVycm5vOworCQlpZiAoZXJyICE9IEVJTlZBTCkKKwkJCWVycm1zZyA9IHN0cmVycm9yKGVycik7CisJCWJiX2Vycm9yX21zZygiJXM6IGNhbm5vdCByZWFkIGxpbms6ICVzIiwgcGF0aCwgZXJybXNnKTsKKwl9CisJcmV0dXJuIGJ1ZjsKK30KKworY2hhciogRkFTVF9GVU5DIHhtYWxsb2NfcmVhbHBhdGgoY29uc3QgY2hhciAqcGF0aCkKK3sKKy8qIE5COiB1Y2xpYmMgYWxzbyBkZWZpbmVzIF9fR0xJQkNfXworICogVGhlcmVmb3JlIHRoZSB0ZXN0ICJpZiBnbGliYywgb3IgdWNsaWJjID49IDAuOS4zMSIgbG9va3MgYSBiaXQgd2VpcmQ6CisgKi8KKyNpZiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgXAorICAgICghZGVmaW5lZChfX1VDTElCQ19fKSB8fCBVQ0xJQkNfVkVSU0lPTiA+PSBLRVJORUxfVkVSU0lPTigwLCA5LCAzMSkpCisJLyogZ2xpYmMgcHJvdmlkZXMgYSBub24tc3RhbmRhcmQgZXh0ZW5zaW9uICovCisJLyogbmV3OiBQT1NJWC4xLTIwMDggc3BlY2lmaWVzIHRoaXMgYmVoYXZpb3IgYXMgd2VsbCAqLworCXJldHVybiByZWFscGF0aChwYXRoLCBOVUxMKTsKKyNlbHNlCisJY2hhciBidWZbUEFUSF9NQVgrMV07CisKKwkvKiBvbiBlcnJvciByZXR1cm5zIE5VTEwgKHhzdHJkdXAoTlVMTCkgPT0gTlVMTCkgKi8KKwlyZXR1cm4geHN0cmR1cChyZWFscGF0aChwYXRoLCBidWYpKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvbGliYmIveHJlYWxsb2NfdmVjdG9yLmMgYi9saWJiYi94cmVhbGxvY192ZWN0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGQzMWI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGliYmIveHJlYWxsb2NfdmVjdG9yLmMKQEAgLTAsMCArMSw0NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRGVueXMgVmxhc2Vua28KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBSZXNpemUgKGdyb3cpIG1hbGxvY2VkIHZlY3Rvci4KKyAqCisgKiAgI2RlZmluZSBtYWdpYyBwYWNrZWQgdHdvIHBhcmFtZXRlcnMgaW50byBvbmU6CisgKiAgc2l6ZW9mID0gc2l6ZW9mX2FuZF9zaGlmdCA+PiA4CisgKiAgc2hpZnQgID0gKHNpemVvZl9hbmRfc2hpZnQpICYgMHhmZgorICoKKyAqIExldHMgc2F5IHNoaWZ0ID0gNC4gMSA8PCA0ID09IDB4MTAuCisgKiBJZiBpZHggPT0gMCwgMHgxMCwgMHgyMCBldGMsIHZlY3RvcltdIGlzIHJlc2l6ZWQgdG8gbmV4dCBoaWdoZXIKKyAqIGlkeCBzdGVwLCBwbHVzIG9uZTogaWYgaWR4ID09IDB4MjAsIHZlY3RvcltdIGlzIHJlc2l6ZWQgdG8gMHgzMSwKKyAqIHRodXMgbGFzdCB1c2FibGUgZWxlbWVudCBpcyB2ZWN0b3JbMHgzMF0uCisgKgorICogSW4gb3RoZXIgd29yZHM6IGFmdGVyIHhyZWFsbG9jX3ZlY3Rvcih2LCA0LCBpZHgpLCB3aXRoIGFueSBpZHgsCisgKiBpdCdzIG9rIHRvIHVzZSBhdCBsZWFzdCB2W2lkeF0gYW5kIHZbaWR4KzFdLgorICogdltpZHgrMl0gZXRjIGdlbmVyYWxseSBhcmUgbm90IG9rLgorICoKKyAqIE5ldyBlbGVtZW50cyBhcmUgemVyb2VkIG91dCwgYnV0IG9ubHkgaWYgcmVhbGxvYyB3YXMgZG9uZQorICogKG5vdCBvbiBldmVyeSBjYWxsKS4gWW91IGNhbiBkZXBlbmQgb24gdltpZHhdIGFuZCB2W2lkeCsxXSBiZWluZworICogemVyb2VkIG91dCBpZiB5b3UgdXNlIGl0IGxpa2UgdGhpczoKKyAqICB2ID0geHJlYWxsb2NfdmVjdG9yKHYsIDQsIGlkeCk7CisgKiAgdltpZHhdLnNvbWVfZmllbGRzID0gLi4uOyAtIHRoZSByZXN0IHN0YXlzIDAvTlVMTAorICogIGlkeCsrOworICogSWYgeW91IGRvIG5vdCBhZHZhbmNlIGlkeCBsaWtlIGFib3ZlLCB5b3Ugc2hvdWxkIGJlIG1vcmUgY2FyZWZ1bC4KKyAqIE5leHQgY2FsbCB0byB4cmVhbGxvY192ZWN0b3IodiwgNCwgaWR4KSBtYXkgb3IgbWF5IG5vdCB6ZXJvIG91dCB2W2lkeF0uCisgKi8KK3ZvaWQqIEZBU1RfRlVOQyB4cmVhbGxvY192ZWN0b3JfaGVscGVyKHZvaWQgKnZlY3RvciwgdW5zaWduZWQgc2l6ZW9mX2FuZF9zaGlmdCwgaW50IGlkeCkKK3sKKwlpbnQgbWFzayA9IDEgPDwgKHVpbnQ4X3Qpc2l6ZW9mX2FuZF9zaGlmdDsKKworCWlmICghKGlkeCAmIChtYXNrIC0gMSkpKSB7CisJCXNpemVvZl9hbmRfc2hpZnQgPj49IDg7IC8qIHNpemVvZih2ZWN0b3JbMF0pICovCisJCXZlY3RvciA9IHhyZWFsbG9jKHZlY3Rvciwgc2l6ZW9mX2FuZF9zaGlmdCAqIChpZHggKyBtYXNrICsgMSkpOworCQltZW1zZXQoKGNoYXIqKXZlY3RvciArIChzaXplb2ZfYW5kX3NoaWZ0ICogaWR4KSwgMCwgc2l6ZW9mX2FuZF9zaGlmdCAqIChtYXNrICsgMSkpOworCX0KKwlyZXR1cm4gdmVjdG9yOworfQpkaWZmIC0tZ2l0IGEvbGliYmIveHJlZ2NvbXAuYyBiL2xpYmJiL3hyZWdjb21wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ0MDI4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpYmJiL3hyZWdjb21wLmMKQEAgLTAsMCArMSwzMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVXRpbGl0eSByb3V0aW5lcy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIG1hbnkgZGlmZmVyZW50IHBlb3BsZS4KKyAqIElmIHlvdSB3cm90ZSB0aGlzLCBwbGVhc2UgYWNrbm93bGVkZ2UgeW91ciB3b3JrLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAieHJlZ2V4LmgiCisKK2NoYXIqIEZBU1RfRlVOQyByZWdjb21wX29yX2Vycm1zZyhyZWdleF90ICpwcmVnLCBjb25zdCBjaGFyICpyZWdleCwgaW50IGNmbGFncykKK3sKKwlpbnQgcmV0ID0gcmVnY29tcChwcmVnLCByZWdleCwgY2ZsYWdzKTsKKwlpZiAocmV0KSB7CisJCWludCBlcnJtc2dzeiA9IHJlZ2Vycm9yKHJldCwgcHJlZywgTlVMTCwgMCk7CisJCWNoYXIgKmVycm1zZyA9IHhtYWxsb2MoZXJybXNnc3opOworCQlyZWdlcnJvcihyZXQsIHByZWcsIGVycm1zZywgZXJybXNnc3opOworCQlyZXR1cm4gZXJybXNnOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBGQVNUX0ZVTkMgeHJlZ2NvbXAocmVnZXhfdCAqcHJlZywgY29uc3QgY2hhciAqcmVnZXgsIGludCBjZmxhZ3MpCit7CisJY2hhciAqZXJybXNnID0gcmVnY29tcF9vcl9lcnJtc2cocHJlZywgcmVnZXgsIGNmbGFncyk7CisJaWYgKGVycm1zZykgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIHJlZ2V4ICclcyc6ICVzIiwgcmVnZXgsIGVycm1zZyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbGlicHdkZ3JwL0tidWlsZC5zcmMgYi9saWJwd2RncnAvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTVlM2EyCi0tLSAvZGV2L251bGwKKysrIGIvbGlicHdkZ3JwL0tidWlsZC5zcmMKQEAgLTAsMCArMSw5IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXkgOj0gdWlkZ2lkX2dldC5vCisKK2xpYi0kKENPTkZJR19VU0VfQkJfUFdEX0dSUCkgKz0gcHdkX2dycC5vCmRpZmYgLS1naXQgYS9saWJwd2RncnAvcHdkX2dycC5jIGIvbGlicHdkZ3JwL3B3ZF9ncnAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzliOTMwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicHdkZ3JwL3B3ZF9ncnAuYwpAQCAtMCwwICsxLDU2MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGl0byBSYWd1c2EgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKy8qIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZISEKKyAqCisgKiBSZXdyaXRlIG9mIHNvbWUgcGFydHMuIE1haW4gZGlmZmVyZW5jZXMgYXJlOgorICoKKyAqIDEpIHRoZSBidWZmZXIgZm9yIGdldHB3dWlkLCBnZXRncmdpZCwgZ2V0cHduYW0sIGdldGdybmFtIGlzIGR5bmFtaWNhbGx5CisgKiAgICBhbGxvY2F0ZWQuCisgKiAgICBJZiBFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCBpcyBzZXQgdGhlIGJ1ZmZlcnMgYXJlIGZyZWVkIGF0IHByb2dyYW0KKyAqICAgIGV4aXQgdXNpbmcgdGhlIGF0ZXhpdCBmdW5jdGlvbiB0byBtYWtlIHZhbGdyaW5kIGhhcHB5LgorICogMikgdGhlIHBhc3N3ZC9ncm91cCBmaWxlczoKKyAqICAgICAgYSkgbXVzdCBjb250YWluIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgZmllbGRzIChhcyBwZXIgY291bnQgb2YgZmllbGQKKyAqICAgICAgICAgZGVsaW1ldGVycyAiOiIpIG9yIHdlIHdpbGwgY29tcGxhaW4gd2l0aCBhIGVycm9yIG1lc3NhZ2UuCisgKiAgICAgIGIpIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UgaW4gZmllbGRzIGlzIHN0cmlwcGVkLgorICogICAgICBjKSBzb21lIGZpZWxkcyBhcmUgbm90IGFsbG93ZWQgdG8gYmUgZW1wdHkgKGUuZy4gdXNlcm5hbWUsIHVpZC9naWQsCisgKiAgICAgICAgIGhvbWVkaXIsIHNoZWxsKSBhbmQgaW4gdGhpcyBjYXNlIE5VTEwgaXMgcmV0dXJuZWQgYW5kIGVycm5vIGlzCisgKiAgICAgICAgIHNldCB0byBFSU5WQUwuIFRoaXMgYmVoYXZpb3VyIGNvdWxkIGJlIGVhc2lseSBjaGFuZ2VkIGJ5CisgKiAgICAgICAgIG1vZGlmeWluZyBQV19ERUYsIEdSX0RFRiwgU1BfREVGIHN0cmluZ3MgKHVwcGVyY2FzZQorICogICAgICAgICBtYWtlcyBhIGZpZWxkIG1hbmRhdG9yeSkuCisgKiAgICAgIGQpIHRoZSBzdHJpbmcgcmVwcmVzZW50aW5nIHVpZC9naWQgbXVzdCBiZSBjb252ZXJ0aWJsZSBieSBzdHJ0b1hYCisgKiAgICAgICAgIGZ1bmN0aW9ucywgb3IgZXJybm8gaXMgc2V0IHRvIEVJTlZBTC4KKyAqICAgICAgZSkgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpbiBncm91cCBtZW1iZXIgbmFtZXMgaXMgc3RyaXBwZWQuCisgKiAzKSB0aGUgaW50ZXJuYWwgZnVuY3Rpb24gZm9yIGdldGdyb3VwbGlzdCB1c2VzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBidWZmZXIuCisgKiA0KSBhdCB0aGUgbW9tZW50IG9ubHkgdGhlIGZ1bmN0aW9ucyByZWFsbHkgdXNlZCBieSBidXN5Ym94IGNvZGUgYXJlCisgKiAgICBpbXBsZW1lbnRlZCwgaWYgeW91IG5lZWQgYSBwYXJ0aWN1bGFyIG1pc3NpbmcgZnVuY3Rpb24gaXQgc2hvdWxkIGJlCisgKiAgICBlYXN5IHRvIHdyaXRlIGl0IGJ5IHVzaW5nIHRoZSBpbnRlcm5hbCBjb21tb24gY29kZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RydWN0IGNvbnN0X3Bhc3NkYiB7CisJY29uc3QgY2hhciAqZmlsZW5hbWU7CisJY2hhciBkZWZbNyArIDIqRU5BQkxFX1VTRV9CQl9TSEFET1ddOworCXVpbnQ4X3Qgb2ZmWzcgKyAyKkVOQUJMRV9VU0VfQkJfU0hBRE9XXTsKKwl1aW50OF90IG51bWZpZWxkczsKKwl1aW50OF90IHNpemVfb2Y7Cit9Oworc3RydWN0IHBhc3NkYiB7CisJY29uc3QgY2hhciAqZmlsZW5hbWU7CisJY2hhciBkZWZbNyArIDIqRU5BQkxFX1VTRV9CQl9TSEFET1ddOworCXVpbnQ4X3Qgb2ZmWzcgKyAyKkVOQUJMRV9VU0VfQkJfU0hBRE9XXTsKKwl1aW50OF90IG51bWZpZWxkczsKKwl1aW50OF90IHNpemVfb2Y7CisJRklMRSAqZnA7CisJY2hhciAqbWFsbG9jZWQ7Cit9OworLyogTm90ZTogZm9yIHNoYWRvdyBkYiwgZGVmW10gd2lsbCBub3QgY29udGFpbiB0ZXJtaW5hdGluZyBOVUwsCisgKiBidXQgY29udmVydF90b19zdHJ1Y3QoKSBsb2dpYyBkZXRlY3RzIGRlZltdIGVuZCBieSAibGVzcyB0aGFuIFNQPyIsCisgKiBub3QgYnkgImlzIGl0IE5VTD8iIGNvbmRpdGlvbjsgYW5kIG9mZlswXSBoYXBwZW5zIHRvIGJlIHplcm8KKyAqIGZvciBldmVyeSBkYiBhbnl3YXksIHNvIHRoZXJlIF9pc18gaW4gZmFjdCBhIHRlcm1pbmF0aW5nIE5VTCB0aGVyZS4KKyAqLworCisvKiBTID0gc3RyaW5nIG5vdCBlbXB0eSwgcyA9IHN0cmluZyBtYXliZSBlbXB0eSwKKyAqIEkgPSB1aWQsZ2lkLCBsID0gbG9uZyBtYXliZSBlbXB0eSwgbSA9IG1lbWJlcnMsCisgKiByID0gcmVzZXJ2ZWQKKyAqLworI2RlZmluZSBQV19ERUYgIlNzSUlzc3MiCisjZGVmaW5lIEdSX0RFRiAiU3NJbSIKKyNkZWZpbmUgU1BfREVGICJTc2xsbGxsbHIiCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY29uc3RfcGFzc2RiIGNvbnN0X3B3X2RiID0geworCV9QQVRIX1BBU1NXRCwgUFdfREVGLAorCXsKKwkJb2Zmc2V0b2Yoc3RydWN0IHBhc3N3ZCwgcHdfbmFtZSksICAgICAgIC8qIDAgUyAqLworCQlvZmZzZXRvZihzdHJ1Y3QgcGFzc3dkLCBwd19wYXNzd2QpLCAgICAgLyogMSBzICovCisJCW9mZnNldG9mKHN0cnVjdCBwYXNzd2QsIHB3X3VpZCksICAgICAgICAvKiAyIEkgKi8KKwkJb2Zmc2V0b2Yoc3RydWN0IHBhc3N3ZCwgcHdfZ2lkKSwgICAgICAgIC8qIDMgSSAqLworCQlvZmZzZXRvZihzdHJ1Y3QgcGFzc3dkLCBwd19nZWNvcyksICAgICAgLyogNCBzICovCisJCW9mZnNldG9mKHN0cnVjdCBwYXNzd2QsIHB3X2RpciksICAgICAgICAvKiA1IFMgKi8KKwkJb2Zmc2V0b2Yoc3RydWN0IHBhc3N3ZCwgcHdfc2hlbGwpICAgICAgIC8qIDYgUyAqLworCX0sCisJc2l6ZW9mKFBXX0RFRiktMSwgc2l6ZW9mKHN0cnVjdCBwYXNzd2QpCit9Oworc3RhdGljIGNvbnN0IHN0cnVjdCBjb25zdF9wYXNzZGIgY29uc3RfZ3JfZGIgPSB7CisJX1BBVEhfR1JPVVAsIEdSX0RFRiwKKwl7CisJCW9mZnNldG9mKHN0cnVjdCBncm91cCwgZ3JfbmFtZSksICAgICAgICAvKiAwIFMgKi8KKwkJb2Zmc2V0b2Yoc3RydWN0IGdyb3VwLCBncl9wYXNzd2QpLCAgICAgIC8qIDEgcyAqLworCQlvZmZzZXRvZihzdHJ1Y3QgZ3JvdXAsIGdyX2dpZCksICAgICAgICAgLyogMiBJICovCisJCW9mZnNldG9mKHN0cnVjdCBncm91cCwgZ3JfbWVtKSAgICAgICAgICAvKiAzIG0gKGNoYXIgKiopICovCisJfSwKKwlzaXplb2YoR1JfREVGKS0xLCBzaXplb2Yoc3RydWN0IGdyb3VwKQorfTsKKyNpZiBFTkFCTEVfVVNFX0JCX1NIQURPVworc3RhdGljIGNvbnN0IHN0cnVjdCBjb25zdF9wYXNzZGIgY29uc3Rfc3BfZGIgPSB7CisJX1BBVEhfU0hBRE9XLCBTUF9ERUYsCisJeworCQlvZmZzZXRvZihzdHJ1Y3Qgc3B3ZCwgc3BfbmFtcCksICAgICAgICAgLyogMCBTIExvZ2luIG5hbWUgKi8KKwkJb2Zmc2V0b2Yoc3RydWN0IHNwd2QsIHNwX3B3ZHApLCAgICAgICAgIC8qIDEgcyBFbmNyeXB0ZWQgcGFzc3dvcmQgKi8KKwkJb2Zmc2V0b2Yoc3RydWN0IHNwd2QsIHNwX2xzdGNoZyksICAgICAgIC8qIDIgbCAqLworCQlvZmZzZXRvZihzdHJ1Y3Qgc3B3ZCwgc3BfbWluKSwgICAgICAgICAgLyogMyBsICovCisJCW9mZnNldG9mKHN0cnVjdCBzcHdkLCBzcF9tYXgpLCAgICAgICAgICAvKiA0IGwgKi8KKwkJb2Zmc2V0b2Yoc3RydWN0IHNwd2QsIHNwX3dhcm4pLCAgICAgICAgIC8qIDUgbCAqLworCQlvZmZzZXRvZihzdHJ1Y3Qgc3B3ZCwgc3BfaW5hY3QpLCAgICAgICAgLyogNiBsICovCisJCW9mZnNldG9mKHN0cnVjdCBzcHdkLCBzcF9leHBpcmUpLCAgICAgICAvKiA3IGwgKi8KKwkJb2Zmc2V0b2Yoc3RydWN0IHNwd2QsIHNwX2ZsYWcpICAgICAgICAgIC8qIDggciBSZXNlcnZlZCAqLworCX0sCisJc2l6ZW9mKFNQX0RFRiktMSwgc2l6ZW9mKHN0cnVjdCBzcHdkKQorfTsKKyNlbmRpZgorCisvKiBXZSBhdm9pZCBoYXZpbmcgYmlnIGdsb2JhbCBkYXRhLiAqLworc3RydWN0IHN0YXRpY3MgeworCS8qIFdlIHVzZSBzYW1lIGJ1ZmZlciAoZGJbMF0ubWFsbG9jZWQpIGZvciBnZXRwd3VpZCBhbmQgZ2V0cHduYW0uCisJICogTWFucGFnZSBzYXlzOgorCSAqICJUaGUgcmV0dXJuIHZhbHVlIG1heSBwb2ludCB0byBhIHN0YXRpYyBhcmVhLCBhbmQgbWF5IGJlIG92ZXJ3cml0dGVuCisJICogYnkgc3Vic2VxdWVudCBjYWxscyB0byBnZXRwd2VudCgpLCBnZXRwd25hbSgpLCBvciBnZXRwd3VpZCgpLiIKKwkgKi8KKwlzdHJ1Y3QgcGFzc2RiIGRiWzIgKyBFTkFCTEVfVVNFX0JCX1NIQURPV107CisJY2hhciAqdG9rZW5pemVfZW5kOworCXVuc2lnbmVkIHN0cmluZ19zaXplOworfTsKKworc3RhdGljIHN0cnVjdCBzdGF0aWNzICpwdHJfdG9fc3RhdGljczsKKyNkZWZpbmUgUyAgICAgKCpwdHJfdG9fc3RhdGljcykKKyNkZWZpbmUgaGFzX1MgKHB0cl90b19zdGF0aWNzKQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAKK3N0YXRpYyB2b2lkIGZyZWVfc3RhdGljKHZvaWQpCit7CisgICAgCWZyZWUoUy5kYlswXS5tYWxsb2NlZCk7CisJZnJlZShTLmRiWzFdLm1hbGxvY2VkKTsKKyMgaWYgRU5BQkxFX1VTRV9CQl9TSEFET1cKKwlmcmVlKFMuZGJbMl0ubWFsbG9jZWQpOworIyBlbmRpZgorCWZyZWUocHRyX3RvX3N0YXRpY3MpOworfQorI2VuZGlmCisKK3N0YXRpYyBzdHJ1Y3Qgc3RhdGljcyAqZ2V0X1Modm9pZCkKK3sKKwlpZiAoIXB0cl90b19zdGF0aWNzKSB7CisJCXB0cl90b19zdGF0aWNzID0geHphbGxvYyhzaXplb2YoUykpOworCQltZW1jcHkoJlMuZGJbMF0sICZjb25zdF9wd19kYiwgc2l6ZW9mKGNvbnN0X3B3X2RiKSk7CisJCW1lbWNweSgmUy5kYlsxXSwgJmNvbnN0X2dyX2RiLCBzaXplb2YoY29uc3RfZ3JfZGIpKTsKKyNpZiBFTkFCTEVfVVNFX0JCX1NIQURPVworCQltZW1jcHkoJlMuZGJbMl0sICZjb25zdF9zcF9kYiwgc2l6ZW9mKGNvbnN0X3NwX2RiKSk7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUAorCQlhdGV4aXQoZnJlZV9zdGF0aWMpOworI2VuZGlmCisJfQorCXJldHVybiBwdHJfdG9fc3RhdGljczsKK30KKworLyogSW50ZXJuYWwgZnVuY3Rpb25zICovCisKKy8qIERpdmlkZSB0aGUgcGFzc3dkL2dyb3VwL3NoYWRvdyByZWNvcmQgaW4gZmllbGRzCisgKiBieSBzdWJzdGl0dXRpbmcgdGhlIGdpdmVuIGRlbGltZXRlcgorICogZS5nLiAnOicgb3IgJywnIHdpdGggJ1wwJy4KKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBmaWVsZHMgZm91bmQuCisgKiBTdHJpcHMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBpbiBmaWVsZHMuCisgKi8KK3N0YXRpYyBpbnQgdG9rZW5pemUoY2hhciAqYnVmZmVyLCBpbnQgY2gpCit7CisJY2hhciAqcCA9IGJ1ZmZlcjsKKwljaGFyICpzID0gcDsKKwlpbnQgbnVtX2ZpZWxkcyA9IDA7CisKKwlmb3IgKDs7KSB7CisJCWlmIChpc2JsYW5rKCpzKSkgeworCQkJb3ZlcmxhcHBpbmdfc3RyY3B5KHMsIHNraXBfd2hpdGVzcGFjZShzKSk7CisJCX0KKwkJaWYgKCpwID09IGNoIHx8ICpwID09ICdcMCcpIHsKKwkJCWNoYXIgKmVuZCA9IHA7CisJCQl3aGlsZSAocCAhPSBzICYmIGlzYmxhbmsocFstMV0pKQorCQkJCXAtLTsKKwkJCWlmIChwICE9IGVuZCkKKwkJCQlvdmVybGFwcGluZ19zdHJjcHkocCwgZW5kKTsKKwkJCW51bV9maWVsZHMrKzsKKwkJCWlmICgqZW5kID09ICdcMCcpIHsKKwkJCQlTLnRva2VuaXplX2VuZCA9IHAgKyAxOworCQkJCXJldHVybiBudW1fZmllbGRzOworCQkJfQorCQkJKnAgPSAnXDAnOworCQkJcyA9IHAgKyAxOworCQl9CisJCXArKzsKKwl9Cit9CisKKy8qIFJldHVybnMgIU5VTEwgb24gc3VjY2VzcyBhbmQgbWF0Y2hpbmcgbGluZSBicm9rZW4gdXAgaW4gZmllbGRzIGJ5ICdcMCcgaW4gYnVmLgorICogV2UgcmVxdWlyZSB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGZpZWxkcyB0byBiZSBmb3VuZC4KKyAqLworc3RhdGljIGNoYXIgKnBhcnNlX2NvbW1vbihGSUxFICpmcCwgc3RydWN0IHBhc3NkYiAqZGIsCisJCWNvbnN0IGNoYXIgKmtleSwgaW50IGZpZWxkX3BvcykKK3sKKwljaGFyICpidWY7CisKKwl3aGlsZSAoKGJ1ZiA9IHhtYWxsb2NfZmdldGxpbmUoZnApKSAhPSBOVUxMKSB7CisJCS8qIFNraXAgZW1wdHkgbGluZXMsIGNvbW1lbnQgbGluZXMgKi8KKwkJaWYgKGJ1ZlswXSA9PSAnXDAnIHx8IGJ1ZlswXSA9PSAnIycpCisJCQlnb3RvIGZyZWVfYW5kX25leHQ7CisJCWlmICh0b2tlbml6ZShidWYsICc6JykgIT0gZGItPm51bWZpZWxkcykgeworCQkJLyogbnVtYmVyIG9mIGZpZWxkcyBpcyB3cm9uZyAqLworCQkJYmJfZXJyb3JfbXNnKCIlczogYmFkIHJlY29yZCIsIGRiLT5maWxlbmFtZSk7CisJCQlnb3RvIGZyZWVfYW5kX25leHQ7CisJCX0KKworCQlpZiAoZmllbGRfcG9zID09IC0xKSB7CisJCQkvKiBubyBrZXkgc3BlY2lmaWVkOiBzZXF1ZW50aWFsIHJlYWQsIHJldHVybiBhIHJlY29yZCAqLworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHN0cmNtcChrZXksIG50aF9zdHJpbmcoYnVmLCBmaWVsZF9wb3MpKSA9PSAwKSB7CisJCQkvKiByZWNvcmQgZm91bmQgKi8KKwkJCWJyZWFrOworCQl9CisgZnJlZV9hbmRfbmV4dDoKKwkJZnJlZShidWYpOworCX0KKworCVMuc3RyaW5nX3NpemUgPSBTLnRva2VuaXplX2VuZCAtIGJ1ZjsKKy8qCisgKiBVZ2x5IGhhY2s6IGdyb3VwIGRiIHJlcXVpcmVzIGFkZGl0aW9uYWwgYnVmZmVyIHNwYWNlCisgKiBmb3IgbWVtYmVyc1tdIGFycmF5LiBJZiB0aGVyZSBpcyBvbmx5IG9uZSBncm91cCwgd2UgbmVlZCBzcGFjZQorICogZm9yIDMgcG9pbnRlcnM6IGFsaWdubWVudCBwYWRkaW5nLCBncm91cCBuYW1lLCBOVUxMLgorICogKzEgZm9yIGV2ZXJ5IGFkZGl0aW9uYWwgZ3JvdXAuCisgKi8KKwlpZiAoYnVmICYmIGRiLT5udW1maWVsZHMgPT0gc2l6ZW9mKEdSX0RFRiktMSkgeyAvKiBpZiB3ZSByZWFkIGdyb3VwIGZpbGUuLi4gKi8KKwkJaW50IGNudCA9IDM7CisJCWNoYXIgKnAgPSBidWY7CisJCXdoaWxlIChwIDwgUy50b2tlbml6ZV9lbmQpCisJCQlpZiAoKnArKyA9PSAnLCcpCisJCQkJY250Kys7CisJCVMuc3RyaW5nX3NpemUgKz0gY250ICogc2l6ZW9mKGNoYXIqKTsKKy8vYmJfZXJyb3JfbXNnKCIrJWQgd29yZHMgPSAldSBrZXk6JXMgYnVmOiclcyciLCBjbnQsIFMuc3RyaW5nX3NpemUsIGtleSwgYnVmKTsKKwkJYnVmID0geHJlYWxsb2MoYnVmLCBTLnN0cmluZ19zaXplKTsKKwl9CisKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgY2hhciAqcGFyc2VfZmlsZShzdHJ1Y3QgcGFzc2RiICpkYiwKKwkJY29uc3QgY2hhciAqa2V5LCBpbnQgZmllbGRfcG9zKQoreworCWNoYXIgKmJ1ZiA9IE5VTEw7CisJRklMRSAqZnAgPSBmb3Blbl9mb3JfcmVhZChkYi0+ZmlsZW5hbWUpOworCisJaWYgKGZwKSB7CisJCWJ1ZiA9IHBhcnNlX2NvbW1vbihmcCwgZGIsIGtleSwgZmllbGRfcG9zKTsKKwkJZmNsb3NlKGZwKTsKKwl9CisJcmV0dXJuIGJ1ZjsKK30KKworLyogQ29udmVydCBwYXNzd2QvZ3JvdXAvc2hhZG93IGZpbGUgcmVjb3JkIGluIGJ1ZmZlciB0byBhIHN0cnVjdCAqLworc3RhdGljIHZvaWQgKmNvbnZlcnRfdG9fc3RydWN0KHN0cnVjdCBwYXNzZGIgKmRiLAorCQljaGFyICpidWZmZXIsIHZvaWQgKnJlc3VsdCkKK3sKKwljb25zdCBjaGFyICpkZWYgPSBkYi0+ZGVmOworCWNvbnN0IHVpbnQ4X3QgKm9mZiA9IGRiLT5vZmY7CisKKwkvKiBGb3IgY29uc2lzdGVuY3ksIHplcm8gb3V0IGFsbCBmaWVsZHMgKi8KKwltZW1zZXQocmVzdWx0LCAwLCBkYi0+c2l6ZV9vZik7CisKKwlmb3IgKDs7KSB7CisJCXZvaWQgKm1lbWJlciA9IChjaGFyKilyZXN1bHQgKyAoKm9mZisrKTsKKworCQlpZiAoKCpkZWYgfCAweDIwKSA9PSAncycpIHsgLyogcyBvciBTICovCisJCQkqKGNoYXIgKiopbWVtYmVyID0gKGNoYXIqKWJ1ZmZlcjsKKwkJCWlmICghYnVmZmVyWzBdICYmICgqZGVmID09ICdTJykpIHsKKwkJCQllcnJubyA9IEVJTlZBTDsKKwkJCX0KKwkJfQorCQlpZiAoKmRlZiA9PSAnSScpIHsKKwkJCSooaW50ICopbWVtYmVyID0gYmJfc3RydG91KGJ1ZmZlciwgTlVMTCwgMTApOworCQl9CisjaWYgRU5BQkxFX1VTRV9CQl9TSEFET1cKKwkJaWYgKCpkZWYgPT0gJ2wnKSB7CisJCQlsb25nIG4gPSAtMTsKKwkJCWlmIChidWZmZXJbMF0pCisJCQkJbiA9IGJiX3N0cnRvbChidWZmZXIsIE5VTEwsIDEwKTsKKwkJCSoobG9uZyAqKW1lbWJlciA9IG47CisJCX0KKyNlbmRpZgorCQlpZiAoKmRlZiA9PSAnbScpIHsKKwkJCWNoYXIgKiptZW1iZXJzOworCQkJaW50IGkgPSB0b2tlbml6ZShidWZmZXIsICcsJyk7CisKKwkJCS8qIFN0b3JlIG1lbWJlcnNbXSBhZnRlciBidWZmZXIncyBlbmQuCisJCQkgKiBUaGlzIGlzIHNhZmUgT05MWSBiZWNhdXNlIHRoZXJlIGlzIGEgaGFjaworCQkJICogaW4gcGFyc2VfY29tbW9uKCkgd2hpY2ggYWxsb2NhdGVzIGFkZGl0aW9uYWwgc3BhY2UKKwkJCSAqIGF0IHRoZSBlbmQgb2YgbWFsbG9jZWQgYnVmZmVyIQorCQkJICovCisJCQltZW1iZXJzID0gKGNoYXIgKiopCisJCQkJKCAoKGludHB0cl90KVMudG9rZW5pemVfZW5kICsgc2l6ZW9mKG1lbWJlcnNbMF0pKQorCQkJCSYgLShpbnRwdHJfdClzaXplb2YobWVtYmVyc1swXSkKKwkJCQkpOworCQkJKChzdHJ1Y3QgZ3JvdXAgKilyZXN1bHQpLT5ncl9tZW0gPSBtZW1iZXJzOworCQkJd2hpbGUgKC0taSA+PSAwKSB7CisJCQkJaWYgKGJ1ZmZlclswXSkgeworCQkJCQkqbWVtYmVycysrID0gYnVmZmVyOworCQkJCQkvLyBiYl9lcnJvcl9tc2coIm1lbWJlcltdPSclcyciLCBidWZmZXIpOworCQkJCX0KKwkJCQlidWZmZXIgKz0gc3RybGVuKGJ1ZmZlcikgKyAxOworCQkJfQorCQkJKm1lbWJlcnMgPSBOVUxMOworCQl9CisJCS8qIGRlZiAiciIgZG9lcyBub3RoaW5nICovCisKKwkJZGVmKys7CisJCWlmICgodW5zaWduZWQgY2hhcikqZGVmIDw9ICh1bnNpZ25lZCBjaGFyKScgJykKKwkJCWJyZWFrOworCQlidWZmZXIgKz0gc3RybGVuKGJ1ZmZlcikgKyAxOworCX0KKworCWlmIChlcnJubykKKwkJcmVzdWx0ID0gTlVMTDsKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IG1hc3NhZ2VfZGF0YV9mb3Jfcl9mdW5jKHN0cnVjdCBwYXNzZGIgKmRiLAorCQljaGFyICpidWZmZXIsIHNpemVfdCBidWZsZW4sCisJCXZvaWQgKipyZXN1bHQsCisJCWNoYXIgKmJ1ZikKK3sKKwl2b2lkICpyZXN1bHRfYnVmID0gKnJlc3VsdDsKKwkqcmVzdWx0ID0gTlVMTDsKKwlpZiAoYnVmKSB7CisJCWlmIChTLnN0cmluZ19zaXplID4gYnVmbGVuKSB7CisJCQllcnJubyA9IEVSQU5HRTsKKwkJfSBlbHNlIHsKKwkJCW1lbWNweShidWZmZXIsIGJ1ZiwgUy5zdHJpbmdfc2l6ZSk7CisJCQkqcmVzdWx0ID0gY29udmVydF90b19zdHJ1Y3QoZGIsIGJ1ZmZlciwgcmVzdWx0X2J1Zik7CisJCX0KKwkJZnJlZShidWYpOworCX0KKwkvKiAiVGhlIHJlZW50cmFudCBmdW5jdGlvbnMgcmV0dXJuIHplcm8gb24gc3VjY2Vzcy4KKwkgKiBJbiBjYXNlIG9mIGVycm9yLCBhbiBlcnJvciBudW1iZXIgaXMgcmV0dXJuZWQuIgorCSAqIE5COiBub3QgZmluZGluZyB0aGUgcmVjb3JkIGlzIGFsc28gYSAic3VjY2VzcyIgaGVyZToKKwkgKi8KKwlyZXR1cm4gZXJybm87Cit9CisKK3N0YXRpYyB2b2lkKiBtYXNzYWdlX2RhdGFfZm9yX25vbl9yX2Z1bmMoc3RydWN0IHBhc3NkYiAqZGIsIGNoYXIgKmJ1ZikKK3sKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuIE5VTEw7CisKKwlmcmVlKGRiLT5tYWxsb2NlZCk7CisJLyogV2UgZW5sYXJnZSBidWYgYW5kIG1vdmUgc3RyaW5nIGRhdGEgdXAsIGZyZWVpbmcgc3BhY2UKKwkgKiBmb3Igc3RydWN0IHBhc3N3ZC9ncm91cC9zcHdkIGF0IHRoZSBiZWdpbm5pbmcuIFRoaXMgd2F5LAorCSAqIGVudGlyZSByZXN1bHQgb2YgZ2V0WFhuYW0gaXMgaW4gYSBzaW5nbGUgbWFsbG9jZWQgYmxvY2suCisJICogVGhpcyBlbmFibGVzIGVhc3kgY3JlYXRpb24gb2YgeG1hbGxvY19nZXRwd25hbSgpIEFQSS4KKwkgKi8KKwlkYi0+bWFsbG9jZWQgPSBidWYgPSB4cmVhbGxvYyhidWYsIGRiLT5zaXplX29mICsgUy5zdHJpbmdfc2l6ZSk7CisJbWVtbW92ZShidWYgKyBkYi0+c2l6ZV9vZiwgYnVmLCBTLnN0cmluZ19zaXplKTsKKwlyZXR1cm4gY29udmVydF90b19zdHJ1Y3QoZGIsIGJ1ZiArIGRiLT5zaXplX29mLCBidWYpOworfQorCisvKioqKioqIGdldFhYbmFtL2lkX3IgKi8KKworc3RhdGljIGludCBGQVNUX0ZVTkMgZ2V0WFhuYW1fcihjb25zdCBjaGFyICpuYW1lLCB1aW50cHRyX3QgZGJfYW5kX2ZpZWxkX3BvcywKKwkJY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmbGVuLAorCQl2b2lkICpyZXN1bHQpCit7CisJY2hhciAqYnVmOworCXN0cnVjdCBwYXNzZGIgKmRiID0gJmdldF9TKCktPmRiW2RiX2FuZF9maWVsZF9wb3MgPj4gMl07CisKKwlidWYgPSBwYXJzZV9maWxlKGRiLCBuYW1lLCAwIC8qZGJfYW5kX2ZpZWxkX3BvcyAmIDMqLyk7CisJLyogImRiX2FuZF9maWVsZF9wb3MgJiAzIiBpcyBjb21tZW50ZWQgb3V0IHNpbmNlIHNvIGZhciB3ZSBkb24ndCBpbXBsZW1lbnQKKwkgKiBnZXRYWFhpZF9yKCkgZnVuY3Rpb25zIHdoaWNoIHdvdWxkIHVzZSB0aGF0IHRvIHBhc3MgMiBoZXJlICovCisKKwlyZXR1cm4gbWFzc2FnZV9kYXRhX2Zvcl9yX2Z1bmMoZGIsIGJ1ZmZlciwgYnVmbGVuLCByZXN1bHQsIGJ1Zik7Cit9CisKK2ludCBGQVNUX0ZVTkMgZ2V0cHduYW1fcihjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgcGFzc3dkICpzdHJ1Y3RfYnVmLAorCQljaGFyICpidWZmZXIsIHNpemVfdCBidWZsZW4sCisJCXN0cnVjdCBwYXNzd2QgKipyZXN1bHQpCit7CisJLyogV2h5IHRoZSAic3RvcmUgYnVmZmVyIGFkZHJlc3MgaW4gcmVzdWx0IiB0cmljaz8KKwkgKiBUaGlzIHdheSwgZ2V0WFhuYW1fciBoYXMgdGhlIHNhbWUgQUJJIHNpZ25hdHVyZSBhcyBnZXRwd25hbV9yLAorCSAqIGhvcGVmdWxseSBjb21waWxlciBjYW4gb3B0aW1pemUgdGFpbCBjYWxsIGJldHRlciBpbiB0aGlzIGNhc2UuCisJICovCisJKnJlc3VsdCA9IHN0cnVjdF9idWY7CisJcmV0dXJuIGdldFhYbmFtX3IobmFtZSwgKDAgPDwgMikgKyAwLCBidWZmZXIsIGJ1ZmxlbiwgcmVzdWx0KTsKK30KKyNpZiBFTkFCTEVfVVNFX0JCX1NIQURPVworaW50IEZBU1RfRlVOQyBnZXRzcG5hbV9yKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzcHdkICpzdHJ1Y3RfYnVmLCBjaGFyICpidWZmZXIsIHNpemVfdCBidWZsZW4sCisJCXN0cnVjdCBzcHdkICoqcmVzdWx0KQoreworCSpyZXN1bHQgPSBzdHJ1Y3RfYnVmOworCXJldHVybiBnZXRYWG5hbV9yKG5hbWUsICgyIDw8IDIpICsgMCwgYnVmZmVyLCBidWZsZW4sIHJlc3VsdCk7Cit9CisjZW5kaWYKKworI2lmZGVmIFVOVVNFRAorLyoqKioqKiBnZXRYWGVudF9yICovCisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGdldFhYZW50X3IodWludHB0cl90IGRiX2lkeCwgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmbGVuLAorCQl2b2lkICpyZXN1bHQpCit7CisJY2hhciAqYnVmOworCXN0cnVjdCBwYXNzZGIgKmRiID0gJmdldF9TKCktPmRiW2RiX2lkeF07CisKKwlpZiAoIWRiLT5mcCkgeworCQlkYi0+ZnAgPSBmb3Blbl9mb3JfcmVhZChkYi0+ZmlsZW5hbWUpOworCQlpZiAoIWRiLT5mcCkgeworCQkJcmV0dXJuIGVycm5vOworCQl9CisJCWNsb3NlX29uX2V4ZWNfb24oZmlsZW5vKGRiLT5mcCkpOworCX0KKworCWJ1ZiA9IHBhcnNlX2NvbW1vbihkYi0+ZnAsIGRiLCAvKm5vIHNlYXJjaCBrZXk6Ki8gTlVMTCwgLTEpOworCWlmICghYnVmICYmICFlcnJubykKKwkJZXJybm8gPSBFTk9FTlQ7CisJcmV0dXJuIG1hc3NhZ2VfZGF0YV9mb3Jfcl9mdW5jKGRiLCBidWZmZXIsIGJ1ZmxlbiwgcmVzdWx0LCBidWYpOworfQorCitpbnQgRkFTVF9GVU5DIGdldHB3ZW50X3Ioc3RydWN0IHBhc3N3ZCAqc3RydWN0X2J1ZiwgY2hhciAqYnVmZmVyLCBzaXplX3QgYnVmbGVuLAorCQlzdHJ1Y3QgcGFzc3dkICoqcmVzdWx0KQoreworCSpyZXN1bHQgPSBzdHJ1Y3RfYnVmOworCXJldHVybiBnZXRYWGVudF9yKDAsIGJ1ZmZlciwgYnVmbGVuLCByZXN1bHQpOworfQorI2VuZGlmCisKKy8qKioqKiogZ2V0WFhlbnQgKi8KKworc3RhdGljIHZvaWQqIEZBU1RfRlVOQyBnZXRYWGVudCh1aW50cHRyX3QgZGJfaWR4KQoreworCWNoYXIgKmJ1ZjsKKwlzdHJ1Y3QgcGFzc2RiICpkYiA9ICZnZXRfUygpLT5kYltkYl9pZHhdOworCisJaWYgKCFkYi0+ZnApIHsKKwkJZGItPmZwID0gZm9wZW5fZm9yX3JlYWQoZGItPmZpbGVuYW1lKTsKKwkJaWYgKCFkYi0+ZnApIHsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWNsb3NlX29uX2V4ZWNfb24oZmlsZW5vKGRiLT5mcCkpOworCX0KKworCWJ1ZiA9IHBhcnNlX2NvbW1vbihkYi0+ZnAsIGRiLCAvKm5vIHNlYXJjaCBrZXk6Ki8gTlVMTCwgLTEpOworCXJldHVybiBtYXNzYWdlX2RhdGFfZm9yX25vbl9yX2Z1bmMoZGIsIGJ1Zik7Cit9CisKK3N0cnVjdCBwYXNzd2QqIEZBU1RfRlVOQyBnZXRwd2VudCh2b2lkKQoreworCXJldHVybiBnZXRYWGVudCgwKTsKK30KKworLyoqKioqKiBnZXRYWG5hbS9pZCAqLworCitzdGF0aWMgdm9pZCogRkFTVF9GVU5DIGdldFhYbmFtKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGRiX2FuZF9maWVsZF9wb3MpCit7CisJY2hhciAqYnVmOworCXN0cnVjdCBwYXNzZGIgKmRiID0gJmdldF9TKCktPmRiW2RiX2FuZF9maWVsZF9wb3MgPj4gMl07CisKKwlidWYgPSBwYXJzZV9maWxlKGRiLCBuYW1lLCBkYl9hbmRfZmllbGRfcG9zICYgMyk7CisJcmV0dXJuIG1hc3NhZ2VfZGF0YV9mb3Jfbm9uX3JfZnVuYyhkYiwgYnVmKTsKK30KKworc3RydWN0IHBhc3N3ZCogRkFTVF9GVU5DIGdldHB3bmFtKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIGdldFhYbmFtKG5hbWUsICgwIDw8IDIpICsgMCk7Cit9CitzdHJ1Y3QgZ3JvdXAqIEZBU1RfRlVOQyBnZXRncm5hbShjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiBnZXRYWG5hbShuYW1lLCAoMSA8PCAyKSArIDApOworfQorc3RydWN0IHBhc3N3ZCogRkFTVF9GVU5DIGdldHB3dWlkKHVpZF90IGlkKQoreworCXJldHVybiBnZXRYWG5hbSh1dG9hKGlkKSwgKDAgPDwgMikgKyAyKTsKK30KK3N0cnVjdCBncm91cCogRkFTVF9GVU5DIGdldGdyZ2lkKGdpZF90IGlkKQoreworCXJldHVybiBnZXRYWG5hbSh1dG9hKGlkKSwgKDEgPDwgMikgKyAyKTsKK30KKworLyoqKioqKiBlbmQvc2V0WFhlbmQgKi8KKwordm9pZCBGQVNUX0ZVTkMgZW5kcHdlbnQodm9pZCkKK3sKKwlpZiAoaGFzX1MgJiYgUy5kYlswXS5mcCkgeworCQlmY2xvc2UoUy5kYlswXS5mcCk7CisJCVMuZGJbMF0uZnAgPSBOVUxMOworCX0KK30KK3ZvaWQgRkFTVF9GVU5DIHNldHB3ZW50KHZvaWQpCit7CisJaWYgKGhhc19TICYmIFMuZGJbMF0uZnApIHsKKwkJcmV3aW5kKFMuZGJbMF0uZnApOworCX0KK30KK3ZvaWQgRkFTVF9GVU5DIGVuZGdyZW50KHZvaWQpCit7CisJaWYgKGhhc19TICYmIFMuZGJbMV0uZnApIHsKKwkJZmNsb3NlKFMuZGJbMV0uZnApOworCQlTLmRiWzFdLmZwID0gTlVMTDsKKwl9Cit9CisKKy8qKioqKiogaW5pdGdyb3VwcyBhbmQgZ2V0Z3JvdXBsaXN0ICovCisKK3N0YXRpYyBnaWRfdCogRkFTVF9GVU5DIGdldGdyb3VwbGlzdF9pbnRlcm5hbChpbnQgKm5ncm91cHNfcHRyLAorCQljb25zdCBjaGFyICp1c2VyLCBnaWRfdCBnaWQpCit7CisJRklMRSAqZnA7CisJZ2lkX3QgKmdyb3VwX2xpc3Q7CisJaW50IG5ncm91cHM7CisKKwkvKiBXZSBhbGxvYyBzcGFjZSBmb3IgOCBnaWRzIGF0IGEgdGltZS4gKi8KKwlncm91cF9saXN0ID0geHphbGxvYyg4ICogc2l6ZW9mKGdyb3VwX2xpc3RbMF0pKTsKKwlncm91cF9saXN0WzBdID0gZ2lkOworCW5ncm91cHMgPSAxOworCisJZnAgPSBmb3Blbl9mb3JfcmVhZChfUEFUSF9HUk9VUCk7CisJaWYgKGZwKSB7CisJCXN0cnVjdCBwYXNzZGIgKmRiID0gJmdldF9TKCktPmRiWzFdOworCQljaGFyICpidWY7CisJCXdoaWxlICgoYnVmID0gcGFyc2VfY29tbW9uKGZwLCBkYiwgTlVMTCwgLTEpKSAhPSBOVUxMKSB7CisJCQljaGFyICoqbTsKKwkJCXN0cnVjdCBncm91cCBncm91cDsKKwkJCWlmICghY29udmVydF90b19zdHJ1Y3QoZGIsIGJ1ZiwgJmdyb3VwKSkKKwkJCQlnb3RvIG5leHQ7CisJCQlpZiAoZ3JvdXAuZ3JfZ2lkID09IGdpZCkKKwkJCQlnb3RvIG5leHQ7CisJCQlmb3IgKG0gPSBncm91cC5ncl9tZW07ICptOyBtKyspIHsKKwkJCQlpZiAoc3RyY21wKCptLCB1c2VyKSAhPSAwKQorCQkJCQljb250aW51ZTsKKwkJCQlncm91cF9saXN0ID0geHJlYWxsb2NfdmVjdG9yKGdyb3VwX2xpc3QsIC8qOD0yXjM6Ki8gMywgbmdyb3Vwcyk7CisJCQkJZ3JvdXBfbGlzdFtuZ3JvdXBzKytdID0gZ3JvdXAuZ3JfZ2lkOworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKyBuZXh0OgorCQkJZnJlZShidWYpOworCQl9CisJCWZjbG9zZShmcCk7CisJfQorCSpuZ3JvdXBzX3B0ciA9IG5ncm91cHM7CisJcmV0dXJuIGdyb3VwX2xpc3Q7Cit9CisKK2ludCBGQVNUX0ZVTkMgaW5pdGdyb3Vwcyhjb25zdCBjaGFyICp1c2VyLCBnaWRfdCBnaWQpCit7CisJaW50IG5ncm91cHM7CisJZ2lkX3QgKmdyb3VwX2xpc3QgPSBnZXRncm91cGxpc3RfaW50ZXJuYWwoJm5ncm91cHMsIHVzZXIsIGdpZCk7CisKKwluZ3JvdXBzID0gc2V0Z3JvdXBzKG5ncm91cHMsIGdyb3VwX2xpc3QpOworCWZyZWUoZ3JvdXBfbGlzdCk7CisJcmV0dXJuIG5ncm91cHM7Cit9CisKK2ludCBGQVNUX0ZVTkMgZ2V0Z3JvdXBsaXN0KGNvbnN0IGNoYXIgKnVzZXIsIGdpZF90IGdpZCwgZ2lkX3QgKmdyb3VwcywgaW50ICpuZ3JvdXBzKQoreworCWludCBuZ3JvdXBzX29sZCA9ICpuZ3JvdXBzOworCWdpZF90ICpncm91cF9saXN0ID0gZ2V0Z3JvdXBsaXN0X2ludGVybmFsKG5ncm91cHMsIHVzZXIsIGdpZCk7CisKKwlpZiAoKm5ncm91cHMgPD0gbmdyb3Vwc19vbGQpIHsKKwkJbmdyb3Vwc19vbGQgPSAqbmdyb3VwczsKKwkJbWVtY3B5KGdyb3VwcywgZ3JvdXBfbGlzdCwgbmdyb3Vwc19vbGQgKiBzaXplb2YoZ3JvdXBzWzBdKSk7CisJfSBlbHNlIHsKKwkJbmdyb3Vwc19vbGQgPSAtMTsKKwl9CisJZnJlZShncm91cF9saXN0KTsKKwlyZXR1cm4gbmdyb3Vwc19vbGQ7Cit9CmRpZmYgLS1naXQgYS9saWJwd2RncnAvdWlkZ2lkX2dldC5jIGIvbGlicHdkZ3JwL3VpZGdpZF9nZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzg4YmUwCi0tLSAvZGV2L251bGwKKysrIGIvbGlicHdkZ3JwL3VpZGdpZF9nZXQuYwpAQCAtMCwwICsxLDEzNSBAQAorLyoKK0NvcHlyaWdodCAoYykgMjAwMS0yMDA2LCBHZXJyaXQgUGFwZQorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PCitFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCitTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCitQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKK09SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKK09USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKK0FEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIEFsd2F5cyBzZXRzIHVpZCBhbmQgZ2lkICovCitpbnQgRkFTVF9GVU5DIGdldF91aWRnaWQoc3RydWN0IGJiX3VpZGdpZF90ICp1LCBjb25zdCBjaGFyICp1ZywgaW50IG51bWVyaWNfb2spCit7CisJc3RydWN0IHBhc3N3ZCAqcHdkOworCXN0cnVjdCBncm91cCAqZ3I7CisJY2hhciAqdXNlciwgKmdyb3VwOworCXVuc2lnbmVkIG47CisKKwl1c2VyID0gKGNoYXIqKXVnOworCWdyb3VwID0gc3RyY2hyKHVnLCAnOicpOworCWlmIChncm91cCkgeworCQlpbnQgc3ogPSAoKytncm91cCkgLSB1ZzsKKwkJdXNlciA9IGFsbG9jYShzeik7CisJCS8qIGNvcGllcyBzei0xIGJ5dGVzLCBzdG9yZXMgdGVybWluYXRpbmcgJ1wwJyAqLworCQlzYWZlX3N0cm5jcHkodXNlciwgdWcsIHN6KTsKKwl9CisJaWYgKG51bWVyaWNfb2spIHsKKwkJbiA9IGJiX3N0cnRvdSh1c2VyLCBOVUxMLCAxMCk7CisJCWlmICghZXJybm8pIHsKKwkJCXUtPnVpZCA9IG47CisJCQlwd2QgPSBnZXRwd3VpZChuKTsKKwkJCS8qIElmIHdlIGhhdmUgZS5nLiAiNTAwIiBzdHJpbmcgd2l0aG91dCB1c2VyICovCisJCQkvKiB3aXRoIHVpZCA1MDAgaW4gL2V0Yy9wYXNzd2QsIHdlIHNldCBnaWQgPT0gdWlkICovCisJCQl1LT5naWQgPSBwd2QgPyBwd2QtPnB3X2dpZCA6IG47CisJCQlnb3RvIHNraXA7CisJCX0KKwl9CisJLyogRWl0aGVyIGl0IGlzIG5vdCBudW1lcmljLCBvciBjYWxsZXIgZGlzYWxsb3dzIG51bWVyaWMgdXNlcm5hbWUgKi8KKwlwd2QgPSBnZXRwd25hbSh1c2VyKTsKKwlpZiAoIXB3ZCkKKwkJcmV0dXJuIDA7CisJdS0+dWlkID0gcHdkLT5wd191aWQ7CisJdS0+Z2lkID0gcHdkLT5wd19naWQ7CisKKyBza2lwOgorCWlmIChncm91cCkgeworCQlpZiAobnVtZXJpY19vaykgeworCQkJbiA9IGJiX3N0cnRvdShncm91cCwgTlVMTCwgMTApOworCQkJaWYgKCFlcnJubykgeworCQkJCXUtPmdpZCA9IG47CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0KKwkJZ3IgPSBnZXRncm5hbShncm91cCk7CisJCWlmICghZ3IpCisJCQlyZXR1cm4gMDsKKwkJdS0+Z2lkID0gZ3ItPmdyX2dpZDsKKwl9CisJcmV0dXJuIDE7Cit9Cit2b2lkIEZBU1RfRlVOQyB4Z2V0X3VpZGdpZChzdHJ1Y3QgYmJfdWlkZ2lkX3QgKnUsIGNvbnN0IGNoYXIgKnVnKQoreworCWlmICghZ2V0X3VpZGdpZCh1LCB1ZywgMSkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duIHVzZXIvZ3JvdXAgJXMiLCB1Zyk7Cit9CisKKy8qIGNob3duLWxpa2U6CisgKiAidXNlciIgc2V0cyB1aWQgb25seSwKKyAqICI6Z3JvdXAiIHNldHMgZ2lkIG9ubHkKKyAqICJ1c2VyOiIgc2V0cyB1aWQgYW5kIGdpZCAodG8gdXNlcidzIHByaW1hcnkgZ3JvdXAgaWQpCisgKiAidXNlcjpncm91cCIgc2V0cyB1aWQgYW5kIGdpZAorICogKCd1bnNldCcgdWlkIG9yIGdpZCByZXRhaW5zIHRoZSB2YWx1ZSBpdCBoYXMgb24gZW50cnkpCisgKi8KK3ZvaWQgRkFTVF9GVU5DIHBhcnNlX2Nob3duX3VzZXJncm91cF9vcl9kaWUoc3RydWN0IGJiX3VpZGdpZF90ICp1LCBjaGFyICp1c2VyX2dyb3VwKQoreworCWNoYXIgKmdyb3VwOworCisJLyogQ2hlY2sgaWYgdGhlcmUgaXMgYSBncm91cCBuYW1lICovCisJZ3JvdXAgPSBzdHJjaHIodXNlcl9ncm91cCwgJy4nKTsgLyogZGVwcmVjYXRlZD8gKi8KKwlpZiAoIWdyb3VwKQorCQlncm91cCA9IHN0cmNocih1c2VyX2dyb3VwLCAnOicpOworCWVsc2UKKwkJKmdyb3VwID0gJzonOyAvKiByZXBsYWNlICcuJyB3aXRoICc6JyAqLworCisJLyogUGFyc2UgInVzZXJbOltncm91cF1dIiAqLworCWlmICghZ3JvdXApIHsgLyogInVzZXIiICovCisJCXUtPnVpZCA9IGdldF91Z19pZCh1c2VyX2dyb3VwLCB4dW5hbWUydWlkKTsKKwl9IGVsc2UgaWYgKGdyb3VwID09IHVzZXJfZ3JvdXApIHsgLyogIjpncm91cCIgKi8KKwkJdS0+Z2lkID0gZ2V0X3VnX2lkKGdyb3VwICsgMSwgeGdyb3VwMmdpZCk7CisJfSBlbHNlIHsKKwkJaWYgKCFncm91cFsxXSkgLyogInVzZXI6IiAqLworCQkJKmdyb3VwID0gJ1wwJzsKKwkJeGdldF91aWRnaWQodSwgdXNlcl9ncm91cCk7CisJfQorfQorCisjaWYgMAorI2luY2x1ZGUgPHN0ZGlvLmg+CitpbnQgbWFpbigpCit7CisJdW5zaWduZWQgdTsKKwlzdHJ1Y3QgYmJfdWlkZ2lkX3QgdWc7CisJdSA9IGdldF91aWRnaWQoJnVnLCAiYXBhY2hlIiwgMCk7CisJcHJpbnRmKCIldSA9ICV1OiV1XG4iLCB1LCB1Zy51aWQsIHVnLmdpZCk7CisJdWcudWlkID0gdWcuZ2lkID0gMTExMTsKKwl1ID0gZ2V0X3VpZGdpZCgmdWcsICJhcGFjaGUiLCAwKTsKKwlwcmludGYoIiV1ID0gJXU6JXVcbiIsIHUsIHVnLnVpZCwgdWcuZ2lkKTsKKwl1Zy51aWQgPSB1Zy5naWQgPSAxMTExOworCXUgPSBnZXRfdWlkZ2lkKCZ1ZywgImFwYWNoZTp1c2VycyIsIDApOworCXByaW50ZigiJXUgPSAldToldVxuIiwgdSwgdWcudWlkLCB1Zy5naWQpOworCXVnLnVpZCA9IHVnLmdpZCA9IDExMTE7CisJdSA9IGdldF91aWRnaWQoJnVnLCAiYXBhY2hlOnVzZXJzIiwgMCk7CisJcHJpbnRmKCIldSA9ICV1OiV1XG4iLCB1LCB1Zy51aWQsIHVnLmdpZCk7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xvZ2ludXRpbHMvQ29uZmlnLnNyYyBiL2xvZ2ludXRpbHMvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTJiNGY4Ci0tLSAvZGV2L251bGwKKysrIGIvbG9naW51dGlscy9Db25maWcuc3JjCkBAIC0wLDAgKzEsMzMxIEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJMb2dpbi9QYXNzd29yZCBNYW5hZ2VtZW50IFV0aWxpdGllcyIKKworSU5TRVJUCisKK2NvbmZpZyBGRUFUVVJFX1NIQURPV1BBU1NXRFMKKwlib29sICJTdXBwb3J0IGZvciBzaGFkb3cgcGFzc3dvcmRzIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEJ1aWxkIHN1cHBvcnQgZm9yIHNoYWRvdyBwYXNzd29yZCBpbiAvZXRjL3NoYWRvdy4gVGhpcyBmaWxlIGlzIG9ubHkKKwkgIHJlYWRhYmxlIGJ5IHJvb3QgYW5kIHRodXMgdGhlIGVuY3J5cHRlZCBwYXNzd29yZHMgYXJlIG5vIGxvbmdlcgorCSAgcHVibGljbHkgcmVhZGFibGUuCisKK2NvbmZpZyBVU0VfQkJfUFdEX0dSUAorCWJvb2wgIlVzZSBpbnRlcm5hbCBwYXNzd29yZCBhbmQgZ3JvdXAgZnVuY3Rpb25zIHJhdGhlciB0aGFuIHN5c3RlbSBmdW5jdGlvbnMiCisJZGVmYXVsdCB5CisJaGVscAorCSAgSWYgeW91IGxlYXZlIHRoaXMgZGlzYWJsZWQsIGJ1c3lib3ggd2lsbCB1c2UgdGhlIHN5c3RlbSdzIHBhc3N3b3JkCisJICBhbmQgZ3JvdXAgZnVuY3Rpb25zLiBBbmQgaWYgeW91IGFyZSB1c2luZyB0aGUgR05VIEMgbGlicmFyeQorCSAgKGdsaWJjKSwgeW91IHdpbGwgdGhlbiBuZWVkIHRvIGluc3RhbGwgdGhlIC9ldGMvbnNzd2l0Y2guY29uZgorCSAgY29uZmlndXJhdGlvbiBmaWxlIGFuZCB0aGUgcmVxdWlyZWQgL2xpYi9saWJuc3NfKiBsaWJyYXJpZXMgaW4KKwkgIG9yZGVyIGZvciB0aGUgcGFzc3dvcmQgYW5kIGdyb3VwIGZ1bmN0aW9ucyB0byB3b3JrLiBUaGlzIGdlbmVyYWxseQorCSAgbWFrZXMgeW91ciBlbWJlZGRlZCBzeXN0ZW0gcXVpdGUgYSBiaXQgbGFyZ2VyLgorCisJICBFbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIGNhdXNlIGJ1c3lib3ggdG8gZGlyZWN0bHkgYWNjZXNzIHRoZQorCSAgc3lzdGVtJ3MgL2V0Yy9wYXNzd29yZCwgL2V0Yy9ncm91cCBmaWxlcyAoYW5kIHlvdXIgc3lzdGVtIHdpbGwgYmUKKwkgIHNtYWxsZXIsIGFuZCBJIHdpbGwgZ2V0IGZld2VyIGVtYWlscyBhc2tpbmcgYWJvdXQgaG93IGdsaWJjIE5TUworCSAgd29ya3MpLiBXaGVuIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIHVzZQorCSAgUEFNIHRvIGFjY2VzcyByZW1vdGUgTERBUCBwYXNzd29yZCBzZXJ2ZXJzIGFuZCB3aGF0bm90LiBBbmQgaWYgeW91CisJICB3YW50IGhvc3RuYW1lIHJlc29sdXRpb24gdG8gd29yayB3aXRoIGdsaWJjLCB5b3Ugc3RpbGwgbmVlZCB0aGUKKwkgIC9saWIvbGlibnNzXyogbGlicmFyaWVzLgorCisJICBJZiB5b3UgbmVlZCB0byB1c2UgZ2xpYmMncyBuc3N3aXRjaC5jb25mIG1lY2hhbmlzbQorCSAgKGUuZy4gaWYgdXNlci9ncm91cCBkYXRhYmFzZSBpcyBOT1Qgc3RvcmVkIGluIC9ldGMvcGFzc3dkIGV0YyksCisJICB5b3UgbXVzdCBOT1QgdXNlIHRoaXMgb3B0aW9uLgorCisJICBJZiB5b3UgZW5hYmxlIHRoaXMgb3B0aW9uLCBpdCB3aWxsIGFkZCBhYm91dCAxLjVrLgorCitjb25maWcgVVNFX0JCX1NIQURPVworCWJvb2wgIlVzZSBpbnRlcm5hbCBzaGFkb3cgcGFzc3dvcmQgZnVuY3Rpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVVNFX0JCX1BXRF9HUlAgJiYgRkVBVFVSRV9TSEFET1dQQVNTV0RTCisJaGVscAorCSAgSWYgeW91IGxlYXZlIHRoaXMgZGlzYWJsZWQsIGJ1c3lib3ggd2lsbCB1c2UgdGhlIHN5c3RlbSdzIHNoYWRvdworCSAgcGFzc3dvcmQgaGFuZGxpbmcgZnVuY3Rpb25zLiBBbmQgaWYgeW91IGFyZSB1c2luZyB0aGUgR05VIEMgbGlicmFyeQorCSAgKGdsaWJjKSwgeW91IHdpbGwgdGhlbiBuZWVkIHRvIGluc3RhbGwgdGhlIC9ldGMvbnNzd2l0Y2guY29uZgorCSAgY29uZmlndXJhdGlvbiBmaWxlIGFuZCB0aGUgcmVxdWlyZWQgL2xpYi9saWJuc3NfKiBsaWJyYXJpZXMgaW4KKwkgIG9yZGVyIGZvciB0aGUgc2hhZG93IHBhc3N3b3JkIGZ1bmN0aW9ucyB0byB3b3JrLiBUaGlzIGdlbmVyYWxseQorCSAgbWFrZXMgeW91ciBlbWJlZGRlZCBzeXN0ZW0gcXVpdGUgYSBiaXQgbGFyZ2VyLgorCisJICBFbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIGNhdXNlIGJ1c3lib3ggdG8gZGlyZWN0bHkgYWNjZXNzIHRoZQorCSAgc3lzdGVtJ3MgL2V0Yy9zaGFkb3cgZmlsZSB3aGVuIGhhbmRsaW5nIHNoYWRvdyBwYXNzd29yZHMuIFRoaXMKKwkgIG1ha2VzIHlvdXIgc3lzdGVtIHNtYWxsZXIgKGFuZCBJIHdpbGwgZ2V0IGZld2VyIGVtYWlscyBhc2tpbmcgYWJvdXQKKwkgIGhvdyBnbGliYyBOU1Mgd29ya3MpLiBXaGVuIHRoaXMgb3B0aW9uIGlzIGVuYWJsZWQsIHlvdSB3aWxsIG5vdCBiZQorCSAgYWJsZSB0byB1c2UgUEFNIHRvIGFjY2VzcyBzaGFkb3cgcGFzc3dvcmRzIGZyb20gcmVtb3RlIExEQVAKKwkgIHBhc3N3b3JkIHNlcnZlcnMgYW5kIHdoYXRub3QuCisKK2NvbmZpZyBVU0VfQkJfQ1JZUFQKKwlib29sICJVc2UgaW50ZXJuYWwgY3J5cHQgZnVuY3Rpb25zIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEJ1c3lib3ggaGFzIGludGVybmFsIERFUyBhbmQgTUQ1IGNyeXB0IGZ1bmN0aW9ucy4KKwkgIFRoZXkgcHJvZHVjZSByZXN1bHRzIHdoaWNoIGFyZSBpZGVudGljYWwgdG8gY29ycmVzcG9uZGluZworCSAgc3RhbmRhcmQgQyBsaWJyYXJ5IGZ1bmN0aW9ucy4KKworCSAgSWYgeW91IGxlYXZlIHRoaXMgZGlzYWJsZWQsIGJ1c3lib3ggd2lsbCB1c2UgdGhlIHN5c3RlbSdzCisJICBjcnlwdCBmdW5jdGlvbnMuIE1vc3QgQyBsaWJyYXJpZXMgdXNlIGxhcmdlICh+NzBrKQorCSAgc3RhdGljIGJ1ZmZlcnMgdGhlcmUsIGFuZCBhbHNvIGNvbWJpbmUgdGhlbSB3aXRoIG1vcmUgZ2VuZXJhbAorCSAgREVTIGVuY3J5cHRpb24vZGVjcnlwdGlvbi4KKworCSAgRm9yIGJ1c3lib3gsIGhhdmluZyBsYXJnZSBzdGF0aWMgYnVmZmVycyBpcyB1bmRlc2lyYWJsZSwKKwkgIGVzcGVjaWFsbHkgb24gTk9NTVUgbWFjaGluZXMuIEJ1c3lib3ggYWxzbyBkb2Vzbid0IG5lZWQKKwkgIERFUyBlbmNyeXB0aW9uL2RlY3J5cHRpb24gYW5kIGNhbiBkbyB3aXRoIHNtYWxsZXIgY29kZS4KKworCSAgSWYgeW91IGVuYWJsZSB0aGlzIG9wdGlvbiwgaXQgd2lsbCBhZGQgYWJvdXQgNC44ayBvZiBjb2RlCisJICBpZiB5b3UgYXJlIGJ1aWxkaW5nIGR5bmFtaWNhbGx5IGxpbmtlZCBleGVjdXRhYmxlLgorCSAgSW4gc3RhdGljIGJ1aWxkLCBpdCBtYWtlcyBjb2RlIF9zbWFsbGVyXyBieSBhYm91dCAxLjJrLAorCSAgYW5kIGxpa2VseSBtYW55IGtpbG9ieXRlcyBsZXNzIG9mIGJzcy4KKworY29uZmlnIFVTRV9CQl9DUllQVF9TSEEKKwlib29sICJFbmFibGUgU0hBMjU2LzUxMiBjcnlwdCBmdW5jdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBVU0VfQkJfQ1JZUFQKKwloZWxwCisJICBFbmFibGUgdGhpcyBpZiB5b3UgaGF2ZSBwYXNzd29yZHMgc3RhcnRpbmcgd2l0aCAiJDUkIiBvciAiJDYkIgorCSAgaW4geW91ciAvZXRjL3Bhc3N3ZCBvciAvZXRjL3NoYWRvdyBmaWxlcy4gVGhlc2UgcGFzc3dvcmRzCisJICBhcmUgaGFzaGVkIHVzaW5nIFNIQTI1NiBhbmQgU0hBNTEyIGFsZ29yaXRobXMuIFN1cHBvcnQgZm9yIHRoZW0KKwkgIHdhcyBhZGRlZCB0byBnbGliYyBpbiAyMDA4LgorCSAgV2l0aCB0aGlzIG9wdGlvbiBvZmYsIGxvZ2luIHdpbGwgZmFpbCBwYXNzd29yZCBjaGVjayBmb3IgYW55CisJICB1c2VyIHdoaWNoIGhhcyBwYXNzd29yZCBlbmNyeXB0ZWQgd2l0aCB0aGVzZSBhbGdvcml0aG1zLgorCitjb25maWcgQUREVVNFUgorCWJvb2wgImFkZHVzZXIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVXRpbGl0eSBmb3IgY3JlYXRpbmcgYSBuZXcgdXNlciBhY2NvdW50LgorCitjb25maWcgRkVBVFVSRV9BRERVU0VSX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBBRERVU0VSICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgYWRkdXNlciBhcHBsZXQuCisKK2NvbmZpZyBGRUFUVVJFX0NIRUNLX05BTUVTCisJYm9vbCAiRW5hYmxlIHNhbml0eSBjaGVjayBvbiB1c2VyL2dyb3VwIG5hbWVzIGluIGFkZHVzZXIgYW5kIGFkZGdyb3VwIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gQUREVVNFUiB8fCBBRERHUk9VUAorCWhlbHAKKwkgIEVuYWJsZSBzYW5pdHkgY2hlY2sgb24gdXNlciBhbmQgZ3JvdXAgbmFtZXMgaW4gYWRkdXNlciBhbmQgYWRkZ3JvdXAuCisJICBUbyBhdm9pZCBwcm9ibGVtcywgdGhlIHVzZXIgb3IgZ3JvdXAgbmFtZSBzaG91bGQgY29uc2lzdCBvbmx5IG9mCisJICBsZXR0ZXJzLCBkaWdpdHMsIHVuZGVyc2NvcmVzLCBwZXJpb2RzLCBhdCBzaWducyBhbmQgZGFzaGVzLAorCSAgYW5kIG5vdCBzdGFydCB3aXRoIGEgZGFzaCAoYXMgZGVmaW5lZCBieSBJRUVFIFN0ZCAxMDAzLjEtMjAwMSkuCisJICBGb3IgY29tcGF0aWJpbGl0eSB3aXRoIFNhbWJhIG1hY2hpbmUgYWNjb3VudHMgIiQiIGlzIGFsc28gc3VwcG9ydGVkCisJICBhdCB0aGUgZW5kIG9mIHRoZSB1c2VyIG9yIGdyb3VwIG5hbWUuCisKK2NvbmZpZyBMQVNUX0lECisJaW50ICJMYXN0IHZhbGlkIHVpZCBvciBnaWQgZm9yIGFkZHVzZXIgYW5kIGFkZGdyb3VwIgorCWRlcGVuZHMgb24gQUREVVNFUiB8fCBBRERHUk9VUAorCWRlZmF1bHQgNjAwMDAKKwloZWxwCisJICBMYXN0IHZhbGlkIHVpZCBvciBnaWQgZm9yIGFkZHVzZXIgYW5kIGFkZGdyb3VwCisKK2NvbmZpZyBGSVJTVF9TWVNURU1fSUQKKwlpbnQgIkZpcnN0IHZhbGlkIHN5c3RlbSB1aWQgb3IgZ2lkIGZvciBhZGR1c2VyIGFuZCBhZGRncm91cCIKKwlkZXBlbmRzIG9uIEFERFVTRVIgfHwgQURER1JPVVAKKwlyYW5nZSAwIExBU1RfSUQKKwlkZWZhdWx0IDEwMAorCWhlbHAKKwkgIEZpcnN0IHZhbGlkIHN5c3RlbSB1aWQgb3IgZ2lkIGZvciBhZGR1c2VyIGFuZCBhZGRncm91cAorCitjb25maWcgTEFTVF9TWVNURU1fSUQKKwlpbnQgIkxhc3QgdmFsaWQgc3lzdGVtIHVpZCBvciBnaWQgZm9yIGFkZHVzZXIgYW5kIGFkZGdyb3VwIgorCWRlcGVuZHMgb24gQUREVVNFUiB8fCBBRERHUk9VUAorCXJhbmdlIEZJUlNUX1NZU1RFTV9JRCBMQVNUX0lECisJZGVmYXVsdCA5OTkKKwloZWxwCisJICBMYXN0IHZhbGlkIHN5c3RlbSB1aWQgb3IgZ2lkIGZvciBhZGR1c2VyIGFuZCBhZGRncm91cAorCitjb25maWcgQURER1JPVVAKKwlib29sICJhZGRncm91cCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBVdGlsaXR5IGZvciBjcmVhdGluZyBhIG5ldyBncm91cCBhY2NvdW50LgorCitjb25maWcgRkVBVFVSRV9BRERHUk9VUF9MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQURER1JPVVAgJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBhZGRncm91cCBhcHBsZXQuCisKK2NvbmZpZyBGRUFUVVJFX0FERFVTRVJfVE9fR1JPVVAKKwlib29sICJTdXBwb3J0IGZvciBhZGRpbmcgdXNlcnMgdG8gZ3JvdXBzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQURER1JPVVAKKwloZWxwCisJICBJZiAgY2FsbGVkICB3aXRoIHR3byBub24tb3B0aW9uIGFyZ3VtZW50cywKKwkgIGFkZGdyb3VwIHdpbGwgYWRkIGFuIGV4aXN0aW5nIHVzZXIgdG8gYW4KKwkgIGV4aXN0aW5nIGdyb3VwLgorCitjb25maWcgREVMVVNFUgorCWJvb2wgImRlbHVzZXIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVXRpbGl0eSBmb3IgZGVsZXRpbmcgYSB1c2VyIGFjY291bnQuCisKK2NvbmZpZyBERUxHUk9VUAorCWJvb2wgImRlbGdyb3VwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFV0aWxpdHkgZm9yIGRlbGV0aW5nIGEgZ3JvdXAgYWNjb3VudC4KKworY29uZmlnIEZFQVRVUkVfREVMX1VTRVJfRlJPTV9HUk9VUAorCWJvb2wgIlN1cHBvcnQgZm9yIHJlbW92aW5nIHVzZXJzIGZyb20gZ3JvdXBzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gREVMR1JPVVAKKwloZWxwCisJICBJZiBjYWxsZWQgd2l0aCB0d28gbm9uLW9wdGlvbiBhcmd1bWVudHMsIGRlbHVzZXIKKwkgIG9yIGRlbGdyb3VwIHdpbGwgcmVtb3ZlIGFuIHVzZXIgZnJvbSBhIHNwZWNpZmllZCBncm91cC4KKworY29uZmlnIEdFVFRZCisJYm9vbCAiZ2V0dHkiCisJZGVmYXVsdCB5CisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgZ2V0dHkgbGV0cyB5b3UgbG9nIGluIG9uIGEgdHR5LiBJdCBpcyBub3JtYWxseSBpbnZva2VkIGJ5IGluaXQuCisKKwkgIE5vdGUgdGhhdCB5b3UgY2FuIHNhdmUgYSBmZXcgYnl0ZXMgYnkgZGlzYWJsaW5nIGl0IGFuZAorCSAgdXNpbmcgbG9naW4gYXBwbGV0IGRpcmVjdGx5LgorCSAgSWYgeW91IG5lZWQgdG8gcmVzZXQgdHR5IGF0dHJpYnV0ZXMgYmVmb3JlIGNhbGxpbmcgbG9naW4sCisJICB0aGlzIHNjcmlwdCBhcHByb3hpbWF0ZXMgZ2V0dHk6CisKKwkgIGV4ZWMgPC9kZXYvJDEgPi9kZXYvJDEgMj4mMSB8fCBleGl0IDEKKwkgIHJlc2V0CisJICBzdHR5IHNhbmU7IHN0dHkgaXNwZWVkIDM4NDAwOyBzdHR5IG9zcGVlZCAzODQwMAorCSAgcHJpbnRmICIlcyBsb2dpbjogIiAiYGhvc3RuYW1lYCIKKwkgIHJlYWQgLXIgbG9naW4KKwkgIGV4ZWMgL2Jpbi9sb2dpbiAiJGxvZ2luIgorCitjb25maWcgTE9HSU4KKwlib29sICJsb2dpbiIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgRkVBVFVSRV9TWVNMT0cKKwloZWxwCisJICBsb2dpbiBpcyB1c2VkIHdoZW4gc2lnbmluZyBvbnRvIGEgc3lzdGVtLgorCisJICBOb3RlIHRoYXQgQnVzeWJveCBiaW5hcnkgbXVzdCBiZSBzZXR1aWQgcm9vdCBmb3IgdGhpcyBhcHBsZXQgdG8KKwkgIHdvcmsgcHJvcGVybHkuCisKK2NvbmZpZyBMT0dJTl9TRVNTSU9OX0FTX0NISUxECisJYm9vbCAiUnVuIGxvZ2dlZCBpbiBzZXNzaW9uIGluIGEgY2hpbGQgcHJvY2VzcyIKKwlkZWZhdWx0IHkgaWYgUEFNCisJZGVwZW5kcyBvbiBMT0dJTgorCWhlbHAKKwkgIFJ1biB0aGUgbG9nZ2VkIGluIHNlc3Npb24gaW4gYSBjaGlsZCBwcm9jZXNzLiAgVGhpcyBhbGxvd3MKKwkgIGxvZ2luIHRvIGNsZWFuIHVwIHRoaW5ncyBzdWNoIGFzIHV0bXAgZW50cmllcyBvciBQQU0gc2Vzc2lvbnMKKwkgIHdoZW4gdGhlIGxvZ2luIHNlc3Npb24gaXMgY29tcGxldGUuICBJZiB5b3UgdXNlIFBBTSwgeW91CisJICBhbG1vc3QgYWx3YXlzIHdvdWxkIHdhbnQgdGhpcyB0byBiZSBzZXQgdG8gWSwgZWxzZSBQQU0gc2Vzc2lvbgorCSAgd2lsbCBub3QgYmUgY2xlYW5lZCB1cC4KKworY29uZmlnIExPR0lOX1NDUklQVFMKKwlib29sICJTdXBwb3J0IGZvciBsb2dpbiBzY3JpcHRzIgorCWRlcGVuZHMgb24gTE9HSU4KKwlkZWZhdWx0IHkKKwloZWxwCisJICBFbmFibGUgdGhpcyBpZiB5b3Ugd2FudCBsb2dpbiB0byBleGVjdXRlICRMT0dJTl9QUkVfU1VJRF9TQ1JJUFQKKwkgIGp1c3QgcHJpb3IgdG8gc3dpdGNoaW5nIGZyb20gcm9vdCB0byBsb2dnZWQtaW4gdXNlci4KKworY29uZmlnIEZFQVRVUkVfTk9MT0dJTgorCWJvb2wgIlN1cHBvcnQgZm9yIC9ldGMvbm9sb2dpbiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIExPR0lOCisJaGVscAorCSAgVGhlIGZpbGUgL2V0Yy9ub2xvZ2luIGlzIHVzZWQgYnkgKHNvbWUgdmVyc2lvbnMgb2YpIGxvZ2luKDEpLgorCSAgSWYgaXQgZXhpc3RzLCBub24tcm9vdCBsb2dpbnMgYXJlIHByb2hpYml0ZWQuCisKK2NvbmZpZyBGRUFUVVJFX1NFQ1VSRVRUWQorCWJvb2wgIlN1cHBvcnQgZm9yIC9ldGMvc2VjdXJldHR5IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTE9HSU4KKwloZWxwCisJICBUaGUgZmlsZSAvZXRjL3NlY3VyZXR0eSBpcyB1c2VkIGJ5IChzb21lIHZlcnNpb25zIG9mKSBsb2dpbigxKS4KKwkgIFRoZSBmaWxlIGNvbnRhaW5zIHRoZSBkZXZpY2UgbmFtZXMgb2YgdHR5IGxpbmVzIChvbmUgcGVyIGxpbmUsCisJICB3aXRob3V0IGxlYWRpbmcgL2Rldi8pIG9uIHdoaWNoIHJvb3QgaXMgYWxsb3dlZCB0byBsb2dpbi4KKworY29uZmlnIFBBU1NXRAorCWJvb2wgInBhc3N3ZCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgRkVBVFVSRV9TWVNMT0cKKwloZWxwCisJICBwYXNzd2QgY2hhbmdlcyBwYXNzd29yZHMgZm9yIHVzZXIgYW5kIGdyb3VwIGFjY291bnRzLiBBIG5vcm1hbCB1c2VyCisJICBtYXkgb25seSBjaGFuZ2UgdGhlIHBhc3N3b3JkIGZvciBoaXMvaGVyIG93biBhY2NvdW50LCB0aGUgc3VwZXIgdXNlcgorCSAgbWF5IGNoYW5nZSB0aGUgcGFzc3dvcmQgZm9yIGFueSBhY2NvdW50LiBUaGUgYWRtaW5pc3RyYXRvciBvZiBhIGdyb3VwCisJICBtYXkgY2hhbmdlIHRoZSBwYXNzd29yZCBmb3IgdGhlIGdyb3VwLgorCisJICBOb3RlIHRoYXQgQnVzeWJveCBiaW5hcnkgbXVzdCBiZSBzZXR1aWQgcm9vdCBmb3IgdGhpcyBhcHBsZXQgdG8KKwkgIHdvcmsgcHJvcGVybHkuCisKK2NvbmZpZyBGRUFUVVJFX1BBU1NXRF9XRUFLX0NIRUNLCisJYm9vbCAiQ2hlY2sgbmV3IHBhc3N3b3JkcyBmb3Igd2Vha25lc3MiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBQQVNTV0QKKwloZWxwCisJICBXaXRoIHRoaXMgb3B0aW9uIHBhc3N3ZCB3aWxsIHJlZnVzZSBuZXcgcGFzc3dvcmRzIHdoaWNoIGFyZSAid2VhayIuCisKK2NvbmZpZyBDUllQVFBXCisJYm9vbCAiY3J5cHRwdyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBFbmNyeXB0cyB0aGUgZ2l2ZW4gcGFzc3dvcmQgd2l0aCB0aGUgY3J5cHQoMykgbGliYyBmdW5jdGlvbgorCSAgdXNpbmcgdGhlIGdpdmVuIHNhbHQuIERlYmlhbiBoYXMgdGhpcyB1dGlsaXR5IHVuZGVyIG1rcGFzc3dkCisJICBuYW1lLiBCdXN5Ym94IHByb3ZpZGVzIG1rcGFzc3dkIGFzIGFuIGFsaWFzIGZvciBjcnlwdHB3LgorCitjb25maWcgQ0hQQVNTV0QKKwlib29sICJjaHBhc3N3ZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBSZWFkcyBhIGZpbGUgb2YgdXNlciBuYW1lIGFuZCBwYXNzd29yZCBwYWlycyBmcm9tIHN0YW5kYXJkIGlucHV0CisJICBhbmQgdXNlcyB0aGlzIGluZm9ybWF0aW9uIHRvIHVwZGF0ZSBhIGdyb3VwIG9mIGV4aXN0aW5nIHVzZXJzLgorCitjb25maWcgRkVBVFVSRV9ERUZBVUxUX1BBU1NXRF9BTEdPCisJc3RyaW5nICJEZWZhdWx0IHBhc3N3b3JkIGVuY3J5cHRpb24gbWV0aG9kIChwYXNzd2QgLWEsIGNyeXB0cHcgLW0gcGFyYW1ldGVyKSIKKwlkZWZhdWx0ICJkZXMiCisJZGVwZW5kcyBvbiBQQVNTV0QgfHwgQ1JZUFRQVworCWhlbHAKKwkgIFBvc3NpYmxlIGNob2ljZXMgYXJlICJkW2VzXSIsICJtW2Q1XSIsICJzW2hhMjU2XSIgb3IgInNoYTUxMiIuCisKK2NvbmZpZyBTVQorCWJvb2wgInN1IgorCWRlZmF1bHQgeQorCXNlbGVjdCBGRUFUVVJFX1NZU0xPRworCWhlbHAKKwkgIHN1IGlzIHVzZWQgdG8gYmVjb21lIGFub3RoZXIgdXNlciBkdXJpbmcgYSBsb2dpbiBzZXNzaW9uLgorCSAgSW52b2tlZCB3aXRob3V0IGEgdXNlcm5hbWUsIHN1IGRlZmF1bHRzIHRvIGJlY29taW5nIHRoZSBzdXBlciB1c2VyLgorCisJICBOb3RlIHRoYXQgQnVzeWJveCBiaW5hcnkgbXVzdCBiZSBzZXR1aWQgcm9vdCBmb3IgdGhpcyBhcHBsZXQgdG8KKwkgIHdvcmsgcHJvcGVybHkuCisKK2NvbmZpZyBGRUFUVVJFX1NVX1NZU0xPRworCWJvb2wgIkVuYWJsZSBzdSB0byB3cml0ZSB0byBzeXNsb2ciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBTVQorCitjb25maWcgRkVBVFVSRV9TVV9DSEVDS1NfU0hFTExTCisJYm9vbCAiRW5hYmxlIHN1IHRvIGNoZWNrIHVzZXIncyBzaGVsbCB0byBiZSBsaXN0ZWQgaW4gL2V0Yy9zaGVsbHMiCisJZGVwZW5kcyBvbiBTVQorCWRlZmF1bHQgeQorCitjb25maWcgU1VMT0dJTgorCWJvb2wgInN1bG9naW4iCisJZGVmYXVsdCB5CisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgc3Vsb2dpbiBpcyBpbnZva2VkIHdoZW4gdGhlIHN5c3RlbSBnb2VzIGludG8gc2luZ2xlIHVzZXIKKwkgIG1vZGUgKHRoaXMgaXMgZG9uZSB0aHJvdWdoIGFuIGVudHJ5IGluIGluaXR0YWIpLgorCitjb25maWcgVkxPQ0sKKwlib29sICJ2bG9jayIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBCdWlsZCB0aGUgInZsb2NrIiBhcHBsZXQgd2hpY2ggYWxsb3dzIHlvdSB0byBsb2NrICh2aXJ0dWFsKSB0ZXJtaW5hbHMuCisKKwkgIE5vdGUgdGhhdCBCdXN5Ym94IGJpbmFyeSBtdXN0IGJlIHNldHVpZCByb290IGZvciB0aGlzIGFwcGxldCB0bworCSAgd29yayBwcm9wZXJseS4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvbG9naW51dGlscy9LYnVpbGQuc3JjIGIvbG9naW51dGlscy9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNDE2YTcKLS0tIC9kZXYvbnVsbAorKysgYi9sb2dpbnV0aWxzL0tidWlsZC5zcmMKQEAgLTAsMCArMSwyMSBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15Oj0KKworSU5TRVJUCitsaWItJChDT05GSUdfQURER1JPVVApCSs9IGFkZGdyb3VwLm8KK2xpYi0kKENPTkZJR19BRERVU0VSKQkrPSBhZGR1c2VyLm8KK2xpYi0kKENPTkZJR19DUllQVFBXKQkrPSBjcnlwdHB3Lm8KK2xpYi0kKENPTkZJR19DSFBBU1NXRCkJKz0gY2hwYXNzd2QubworbGliLSQoQ09ORklHX0dFVFRZKQkrPSBnZXR0eS5vCitsaWItJChDT05GSUdfTE9HSU4pCSs9IGxvZ2luLm8KK2xpYi0kKENPTkZJR19QQVNTV0QpCSs9IHBhc3N3ZC5vCitsaWItJChDT05GSUdfU1UpCSs9IHN1Lm8KK2xpYi0kKENPTkZJR19TVUxPR0lOKQkrPSBzdWxvZ2luLm8KK2xpYi0kKENPTkZJR19WTE9DSykJKz0gdmxvY2subworbGliLSQoQ09ORklHX0RFTFVTRVIpCSs9IGRlbHVzZXIubworbGliLSQoQ09ORklHX0RFTEdST1VQKQkrPSBkZWx1c2VyLm8KZGlmZiAtLWdpdCBhL2xvZ2ludXRpbHMvUkVBRE1FIGIvbG9naW51dGlscy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4ODUxMAotLS0gL2Rldi9udWxsCisrKyBiL2xvZ2ludXRpbHMvUkVBRE1FCkBAIC0wLDAgKzEsNzAgQEAKKwlHZXR0eQorCis/Pz8gU2hvdWxkIGdldHR5IG9wZW4gdHR5IHdpdGggb3Igd2l0aG91dCBPX05PTkJMT0NLPworRm9yIHNlcmlhbCBsaW5lcywgaXQgbWVhbnMgInNob3VsZCBnZXR0eSB3YWl0IGZvciBDYXJyaWVyIERldGVjdCBwaW4/IgorSSBjaGVja2VkIG90aGVyIGdldHRpZXM6CisKKy0gYWdldHR5IGFsd2F5cyB1c2VzIE9fTk9OQkxPQ0sKKy0gbWdldHR5IHVzZXMgT19OT05CTE9DSyB1bmxlc3MgcnVuIHdpdGggLWIsIG9yIGFzICJnZXR0eSIKKworPz8/IElmIHdlIGRlY2lkZWQgdG8gdXNlIE9fTk9OQkxPQ0sgKHBlcmhhcHMgb3B0aW9uYWxseSB3aXRoIC1iKSwKK3doZW4gZ2V0dHkgc2hvdWxkIHNlbmQgLUkgSU5JVFNUUiBkYXRhIHRvIHR0eT8gQWZ0ZXIgb3BlbiBzdWNjZWVkcz8KK1doYXQgaWYgd2UgYWxzbyB3YW50IHRvIGluaXRpYWxpemUgKm1vZGVtKiB3aXRoIHNvbWUgQVQgY29tbWFuZHM/CisKKz8/PyBTaG91bGQgd2UgY2hlY2svY3JlYXRlIC92YXIvbG9jay9MQ0suLnR0eVBGWCBsb2NrZmlsZXM/CisKKz8/PyBtZ2V0dHkgb3BlbnMgdHR5IGJ1dCBkb2VzIE5PVCBsb2NrIGl0LCB0aGVuIHdhaXRzIGZvciBpbnB1dCB2aWEKK3NlbGVjdC9wb2xsLCBhbmQgd2hlbiBpbnB1dCBpcyBhdmFpbGFibGUsIGl0IGNoZWNrcyBsb2NrIGZpbGUuCitJZiBpdCBleGlzdHMsIG1nZXR0eSBleGl0cyAoaXQgYXNzdW1lcyBzb21lb25lIGVsc2UgdXNlcyB0aGUgbGluZSkuCitJZiBubywgaXQgY3JlYXRlcyB0aGUgZmlsZSAobG9jayB0aGUgdHR5KS4gU291bmRzIGxpa2UgYSBnb29kIGFsZ29yaXRobQordG8gdXNlIGlmIHdlIGFyZSBjYWxsZWQgd2l0aCAtdy4uLgorCitHZXR0eSBzaG91bGQgZXN0YWJsaXNoIGEgbmV3IHNlc3Npb24gYW5kIHByb2Nlc3MgZ3JvdXAsIGFuZCBlbnN1cmUKK3RoYXQgdHR5IGlzIGEgY3R0eS4KKworPz8/IFNob3VsZCBnZXR0eSBlbnN1cmUgdGhhdCBvdGhlciBwcm9jZXNzZXMgd2hpY2ggbWlnaHQgaGF2ZSBvcGVuZWQKK2ZkcyB0byB0aGlzIHR0eSBiZSBkdXNjb25uZWN0ZWQ/IGFnZXR0eSBoYXMgYSAtUiBvcHRpb24gd2hpY2ggbWFrZXMKK2FnZXR0eSBjYWxsIHZoYW5ndXAoKSBhZnRlciB0dHkgaXMgb3BlbmVkLiAoVGhlbiBhZ2V0dHkgb3BlbnMgaXQgYWdhaW4sCitzaW5jZSBpdCBwcm9iYWJseSB2aGFuZ3VwJ2VkIGl0cyBvd24gZmQgdG9vKS4KKworR2V0dHkgc2hvdWxkIGxlYXZlIHRoZSB0dHkgaW4gYXBwcm94aW1hdGVseSB0aGUgc2FtZSBzdGF0ZSBhcyAic3R0eSBzYW5lIgorYmVmb3JlIGl0IGV4ZWNzIGxvZ2luIHByb2dyYW0uIE1pbm9yIHRoaW5ncyB3ZSBkbyBjb25kaXRpb25hbGx5IGFyZToKKwljX2lmbGFnIHw9IElDUk5MOyAvLyBpZiAnXHInIHdhcyB1c2VkIHRvIGVuZCB1c2VybmFtZQorCis/Pz8gbWdldHR5IHVzZXMgcGVyLXR0eSBmaWxlIHRvIGlnbm9yZSBjb25uZWN0cywgL2V0Yy9ub2xvZ2luLnR0eXh4IC0KK2lzIGl0IHVzZWZ1bD8KKworSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHJ1biAiZ2V0dHkgMCAtIiBmcm9tIGEgc2hlbGwgcHJvbXB0LgorW1RoaXMgY3VycmVudGx5IGRvZXNuJ3Qgd29yayBmcm9tIGludGVyYWN0aXZlIHNoZWxsIHNpbmNlIHNldHNpZCgpCitmYWlscyBpbiBwcm9jZXNzIGdyb3VwIGxlYWRlci4gVGhlIHdvcmthcm91bmQgaXMgdG8gcnVuIGl0IGFzIGEgY2hpbGQKK29mIHNvbWV0aGluZy4gc2ggLWMgJ2dldHR5IC0gMDsgdHJ1ZScgdXN1YWxseSB3b3Jrcy4gU2hvdWxkIHdlIGZpeCB0aGlzP10KK0l0IHNob3VsZCBsZWF2ZSB0dHkgaW4gYSBzYW5lIHN0YXRlIHdoZW4gaXQgZXhpdHMgKEN0cmwtRCwgLXQgU0VDIHRpbWVvdXQpOgorZWNobyBzaG91bGQgYmUgb24sIHNwZWVkLCBjb250cm9sIGNoYXJzIHByb3Blcmx5IHNldCwgZXRjLgorKEhvd2V2ZXIsIGl0IGNhbid0IHJlc3RvcmUgY3R0eS4gVGhlIHN5bXB0b20gaXMgdGhhdCAiPC9kZXYvdHR5IgorZmFpbHMgaW4gdGhlIHBhcmVudCBzaGVsbCBhZnRlciBnZXR0eSBleGl0czogL2Rldi90dHkgY2FuJ3QgYmUgb3BlbmVkKS4KKworR2V0dHkgc2hvdWxkIHdyaXRlIExPR0lOX1BST0NFU1MgdXRtcCByZWNvcmQgYmVmb3JlIGl0IHN0YXJ0cyB3YWl0aW5nCitmb3IgdXNlcm5hbWUgdG8gYmUgZW50ZXJlZC4KKworCUxvZ2luCisKK0xvZ2luIHNob3VsZCBub3QgdHJ5IHRvIHNldCB1cCB0dHkgcGFyYW1ldGVycyAtIGFwYXJ0IGZyb20gc3dpdGNoaW5nIGVjaG8KK29mZiB3aGlsZSBlbnRlcmluZyBwYXNzd29yZCwgYW5kIHN3aXRjaGluZyBpdCBiYWNrIG9uIGFmdGVyLgorCitMb2dpbiBzaG91bGQgbm90IGxlYXZlICJlY2hvIG9mZiIgc3RhdGUgd2hlbiBpdCB0aW1lcyBvdXQgcmVhZGluZyBwYXNzd29yZAorb3Igb3RoZXJ3aXNlIHRlcm1pbmF0ZXMgKEN0cmwtQywgQ3RybC1EIGV0YykuCisKKz8/PyBTaG91bGQgbG9naW4gZXN0YWJsaXNoIGEgbmV3IHNlc3Npb24gYW5kL29yIHByb2Nlc3MgZ3JvdXAsIGFuZCBlbnN1cmUKK3RoYXQgdHR5IGlzIGEgY3R0eT8gV2l0aG91dCB0aGlzLCBydW5uaW5nIGxvZ2luIGRpcmVjdGx5IChub3QgdmlhIGdldHR5KQorZnJvbSBlLmcuIGluaXRzY3JpcHQgd2lsbCB1c3VhbGx5IHJlc3VsdCB3aXRoIGEgbG9naW4gc2Vzc2lvbiB3aXRob3V0CitjdHR5IGFuZCB3aXRob3V0IHNlc3Npb24vcGdycCBwcm9wZXJseSBjcmVhdGVkLi4uCisKK0l0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBydW4gImxvZ2luIFtVU0VSXSIgZnJvbSBhIHNoZWxsIHByb21wdCwKK2FuZCBpdCBzaG91bGQgd29yayAobm90IGJsb2NrL2RpZS9lcnJvciBvdXQpLgorU2ltaWxhcmx5IHRvIGdldHR5LCBpdCBzaG91bGQgbGVhdmUgdHR5IGluIHRoZSBzYW5lIHN0YXRlIHdoZW4gaXQgZXhpdHMuCisKKz8/PyBTaG91bGQgbG9naW4gd3JpdGUgTE9HSU5fUFJPQ0VTUyB1dG1wIHJlY29yZCBiZWZvcmUgaXQgc3RhcnRzIHdhaXRpbmcKK2ZvciB1c2VybmFtZS9wYXNzd29yZCB0byBiZSBlbnRlcmVkPworCitMb2dpbiBzaG91bGQgd3JpdGUgVVNFUl9QUk9DRVNTIHV0bXAgcmVjb3JkIGp1c3QgYmVmb3JlIGl0IGlzIGFib3V0Cit0byBleGVjIHVzZXIncyBzaGVsbC4KZGlmZiAtLWdpdCBhL2xvZ2ludXRpbHMvYWRkLXJlbW92ZS1zaGVsbC5jIGIvbG9naW51dGlscy9hZGQtcmVtb3ZlLXNoZWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQxOWZmNQotLS0gL2Rldi9udWxsCisrKyBiL2xvZ2ludXRpbHMvYWRkLXJlbW92ZS1zaGVsbC5jCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogYWRkLXNoZWxsIGFuZCByZW1vdmUtc2hlbGwgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IEFsZXhhbmRlciBTaGlzaGtpbiA8dmlydHVvc29Ac2xpbmQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGlzIHNvdXJjZSB0cmVlCisgKiBmb3IgZGV0YWlscy4KKyAqLworCisvL2FwcGxldDpJRl9BRERfU0hFTEwoICAgQVBQTEVUX09ERE5BTUUoYWRkLXNoZWxsICAgLCBhZGRfcmVtb3ZlX3NoZWxsLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCwgYWRkX3NoZWxsICAgKSkKKy8vYXBwbGV0OklGX1JFTU9WRV9TSEVMTChBUFBMRVRfT0RETkFNRShyZW1vdmUtc2hlbGwsIGFkZF9yZW1vdmVfc2hlbGwsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QLCByZW1vdmVfc2hlbGwpKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfQUREX1NIRUxMKSAgICArPSBhZGQtcmVtb3ZlLXNoZWxsLm8KKy8va2J1aWxkOmxpYi0kKENPTkZJR19SRU1PVkVfU0hFTEwpICs9IGFkZC1yZW1vdmUtc2hlbGwubworCisvL2NvbmZpZzpjb25maWcgQUREX1NIRUxMCisvL2NvbmZpZzogICAgICAgYm9vbCAiYWRkLXNoZWxsIgorLy9jb25maWc6ICAgICAgIGRlZmF1bHQgeSBpZiBERVNLVE9QCisvL2NvbmZpZzogICAgICAgaGVscAorLy9jb25maWc6ICAgICAgICAgQWRkIHNoZWxscyB0byAvZXRjL3NoZWxscy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIFJFTU9WRV9TSEVMTAorLy9jb25maWc6ICAgICAgIGJvb2wgInJlbW92ZS1zaGVsbCIKKy8vY29uZmlnOiAgICAgICBkZWZhdWx0IHkgaWYgREVTS1RPUAorLy9jb25maWc6ICAgICAgIGhlbHAKKy8vY29uZmlnOiAgICAgICAgIFJlbW92ZSBzaGVsbHMgZnJvbSAvZXRjL3NoZWxscy4KKworLy91c2FnZTojZGVmaW5lIGFkZF9zaGVsbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiU0hFTEwuLi4iCisvL3VzYWdlOiNkZWZpbmUgYWRkX3NoZWxsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQWRkIFNIRUxMcyB0byAvZXRjL3NoZWxscyIKKworLy91c2FnZTojZGVmaW5lIHJlbW92ZV9zaGVsbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiU0hFTEwuLi4iCisvL3VzYWdlOiNkZWZpbmUgcmVtb3ZlX3NoZWxsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVtb3ZlIFNIRUxMcyBmcm9tIC9ldGMvc2hlbGxzIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2RlZmluZSBTSEVMTFNfRklMRSAiL2V0Yy9zaGVsbHMiCisKKyNkZWZpbmUgUkVNT1ZFX1NIRUxMIChFTkFCTEVfUkVNT1ZFX1NIRUxMICYmICghRU5BQkxFX0FERF9TSEVMTCB8fCBhcHBsZXRfbmFtZVswXSA9PSAncicpKQorI2RlZmluZSBBRERfU0hFTEwgICAgKEVOQUJMRV9BRERfU0hFTEwgJiYgKCFFTkFCTEVfUkVNT1ZFX1NIRUxMIHx8IGFwcGxldF9uYW1lWzBdID09ICdhJykpCisKKy8qIE5COiB3ZSB1c2UgdGhlIF9hZGRyZXNzXywgbm90IHRoZSB2YWx1ZSwgb2YgdGhpcyBzdHJpbmcKKyAqIGFzIGEgInNwZWNpYWwgdmFsdWUgb2YgcG9pbnRlciIgaW4gdGhlIGNvZGUuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGRvbnRfYWRkW10gQUxJR04xID0gIlxuIjsKKworaW50IGFkZF9yZW1vdmVfc2hlbGxfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGFkZF9yZW1vdmVfc2hlbGxfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCUZJTEUgKm9yaWdfZnA7CisJY2hhciAqb3JpZ19mbjsKKwljaGFyICpuZXdfZm47CisKKwlhcmd2Kys7CisKKwlvcmlnX2ZuID0geG1hbGxvY19mb2xsb3dfc3ltbGlua3MoU0hFTExTX0ZJTEUpOworCWlmICghb3JpZ19mbikKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwlvcmlnX2ZwID0gZm9wZW5fZm9yX3JlYWQob3JpZ19mbik7CisKKwluZXdfZm4gPSB4YXNwcmludGYoIiVzLnRtcCIsIG9yaWdfZm4pOworCS8qCisJICogT19UUlVOQyBvciBPX0VYQ0w/IEF0IHRoZSBmaXJzdCBnbGFuY2UsIE9fRVhDTCBsb29rcyBiZXR0ZXIsCisJICogc2luY2UgaXQgcHJldmVudHMgcmFjZXMuIEJ1dDogKDEpIGl0IHJlcXVpcmVzIGEgcmV0cnkgbG9vcCwKKwkgKiAoMikgaWYgL2V0Yy9zaGVsbHMudG1wIGlzICpzdGFsZSosIHRoZW4gcmV0cnkgbG9vcAorCSAqIHdpdGggT19FWENMIHdpbGwgbmV2ZXIgc3VjY2VlZCAtIGl0IHNob3VsZCBoYXZlIGEgdGltZW91dCwKKwkgKiBhZnRlciB3aGljaCBpdCBzaG91bGQgcmV2ZXJ0IHRvIE9fVFJVTkMuCisJICogRm9yIG5vdywgSSBzZXR0bGUgZm9yIE9fVFJVTkMgaW5zdGVhZC4KKwkgKi8KKwl4bW92ZV9mZCh4b3BlbihuZXdfZm4sIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMpLCBTVERPVVRfRklMRU5PKTsKKworCS8qIFRPRE86CisJc3RydWN0IHN0YXQgc2I7CisJeGZzdGF0KGZpbGVubyhvcmlnX2ZwKSwgJnNiKTsKKwl4ZmNob3duKFNURE9VVF9GSUxFTk8sIHNiLnN0X3VpZCwgc2Iuc3RfZ2lkKTsKKwl4ZmNobW9kKFNURE9VVF9GSUxFTk8sIHNiLnN0X21vZGUpOworCSovCisKKwlpZiAob3JpZ19mcCkgeworCQkvKiBDb3B5IG9sZCBmaWxlLCBwb3NzaWJseSBza2lwcGluZyByZW1vdmVkIHNoZWxsIG5hbWVzICovCisJCWNoYXIgKmxpbmU7CisJCXdoaWxlICgobGluZSA9IHhtYWxsb2NfZmdldGxpbmUob3JpZ19mcCkpICE9IE5VTEwpIHsKKwkJCWNoYXIgKipjcHAgPSBhcmd2OworCQkJd2hpbGUgKCpjcHApIHsKKwkJCQlpZiAoc3RyY21wKCpjcHAsIGxpbmUpID09IDApIHsKKwkJCQkJLyogT2xkIGZpbGUgaGFzIHRoaXMgc2hlbGwgbmFtZSAqLworCQkJCQlpZiAoUkVNT1ZFX1NIRUxMKSB7CisJCQkJCQkvKiB3ZSBhcmUgcmVtb3ZlLXNoZWxsICovCisJCQkJCQkvKiBkZWxldGUgdGhpcyBuYW1lIGJ5IG5vdCBjb3B5aW5nIGl0ICovCisJCQkJCQlnb3RvIG5leHRfbGluZTsKKwkJCQkJfQorCQkJCQkvKiB3ZSBhcmUgYWRkLXNoZWxsICovCisJCQkJCS8qIG1hcmsgdGhpcyBuYW1lIGFzICJkbyBub3QgYWRkIiAqLworCQkJCQkqY3BwID0gKGNoYXIqKWRvbnRfYWRkOworCQkJCX0KKwkJCQljcHArKzsKKwkJCX0KKwkJCS8qIGNvcHkgc2hlbGwgbmFtZSBmcm9tIG9sZCB0byBuZXcgZmlsZSAqLworCQkJcHV0cyhsaW5lKTsKKyBuZXh0X2xpbmU6CisJCQlmcmVlKGxpbmUpOworCQl9CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZjbG9zZShvcmlnX2ZwKTsKKwl9CisKKwlpZiAoQUREX1NIRUxMKSB7CisJCWNoYXIgKipjcHAgPSBhcmd2OworCQl3aGlsZSAoKmNwcCkgeworCQkJaWYgKCpjcHAgIT0gZG9udF9hZGQpCisJCQkJcHV0cygqY3BwKTsKKwkJCWNwcCsrOworCQl9CisJfQorCisJLyogRW5zdXJlIHdlIHdyb3RlIG91dCBldmVyeXRoaW5nICovCisJaWYgKGZjbG9zZShzdGRvdXQpICE9IDApIHsKKwkJeHVubGluayhuZXdfZm4pOworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiB3cml0ZSBlcnJvciIsIG5ld19mbik7CisJfQorCisJLyogU21hbGwgaG9sZTogaWYgcmVuYW1lIGZhaWxzLCAvZXRjL3NoZWxscy50bXAgaXMgbm90IHJlbW92ZWQgKi8KKwl4cmVuYW1lKG5ld19mbiwgb3JpZ19mbik7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZnJlZShvcmlnX2ZuKTsKKwkJZnJlZShuZXdfZm4pOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9sb2dpbnV0aWxzL2FkZGdyb3VwLmMgYi9sb2dpbnV0aWxzL2FkZGdyb3VwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYwZTMzNwotLS0gL2Rldi9udWxsCisrKyBiL2xvZ2ludXRpbHMvYWRkZ3JvdXAuYwpAQCAtMCwwICsxLDE4MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYWRkZ3JvdXAgLSBhZGQgZ3JvdXBzIHRvIC9ldGMvZ3JvdXAgYW5kIC9ldGMvZ3NoYWRvdworICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBieSBMaW5lbywgaW5jLiBhbmQgSm9obiBCZXBwdQorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSBieSBKb2huIEJlcHB1IDxiZXBwdUBjb2RlcG9ldC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgYnkgVGl0byBSYWd1c2EgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBhZGRncm91cF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1nIEdJRF0gWy1TXSAiIElGX0ZFQVRVUkVfQUREVVNFUl9UT19HUk9VUCgiW1VTRVJdICIpICJHUk9VUCIKKy8vdXNhZ2U6I2RlZmluZSBhZGRncm91cF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkFkZCBhIGdyb3VwIiBJRl9GRUFUVVJFX0FERFVTRVJfVE9fR1JPVVAoIiBvciBhZGQgYSB1c2VyIHRvIGEgZ3JvdXAiKSAiXG4iCisvL3VzYWdlOiAgICAgIlxuCS1nIEdJRAlHcm91cCBpZCIKKy8vdXNhZ2U6ICAgICAiXG4JLVMJQ3JlYXRlIGEgc3lzdGVtIGdyb3VwIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIENPTkZJR19MQVNUX1NZU1RFTV9JRCA8IENPTkZJR19GSVJTVF9TWVNURU1fSUQKKyNlcnJvciBCYWQgTEFTVF9TWVNURU1fSUQgb3IgRklSU1RfU1lTVEVNX0lEIGluIC5jb25maWcKKyNlbmRpZgorI2lmIENPTkZJR19MQVNUX0lEIDwgQ09ORklHX0xBU1RfU1lTVEVNX0lECisjZXJyb3IgQmFkIExBU1RfSUQgb3IgTEFTVF9TWVNURU1fSUQgaW4gLmNvbmZpZworI2VuZGlmCisKKyNkZWZpbmUgT1BUX0dJRCAgICAgICAgICAgICAgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgT1BUX1NZU1RFTV9BQ0NPVU5UICAgICAgICAgICAgKDEgPDwgMSkKKworc3RhdGljIHZvaWQgeGdyb3VwX3N0dWR5KHN0cnVjdCBncm91cCAqZykKK3sKKwl1bnNpZ25lZCBtYXggPSBDT05GSUdfTEFTVF9JRDsKKworCS8qIE1ha2Ugc3VyZSBncl9uYW1lIGlzIHVudXNlZCAqLworCWlmIChnZXRncm5hbShnLT5ncl9uYW1lKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgJyVzJyBpbiB1c2UiLCAiZ3JvdXAiLCBnLT5ncl9uYW1lKTsKKwkJLyogdGhlc2UgZm9ybWF0IHN0cmluZ3MgYXJlIHJldXNlZCBpbiBhZGR1c2VyIGFuZCBhZGRncm91cCAqLworCX0KKworCS8qIGlmIGEgc3BlY2lmaWMgZ2lkIGlzIHJlcXVlc3RlZCwgdGhlIC0tc3lzdGVtIHN3aXRjaCBhbmQgKi8KKwkvKiBtaW4gYW5kIG1heCB2YWx1ZXMgYXJlIG92ZXJyaWRkZW4sIGFuZCB0aGUgcmFuZ2Ugb2YgdmFsaWQgKi8KKwkvKiBnaWQgdmFsdWVzIGlzIHNldCB0byBbMCwgSU5UX01BWF0gKi8KKwlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX0dJRCkpIHsKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfU1lTVEVNX0FDQ09VTlQpIHsKKwkJCWctPmdyX2dpZCA9IENPTkZJR19GSVJTVF9TWVNURU1fSUQ7CisJCQltYXggPSBDT05GSUdfTEFTVF9TWVNURU1fSUQ7CisJCX0gZWxzZSB7CisJCQlnLT5ncl9naWQgPSBDT05GSUdfTEFTVF9TWVNURU1fSUQgKyAxOworCQl9CisJfQorCS8qIENoZWNrIGlmIHRoZSBkZXNpcmVkIGdpZCBpcyBmcmVlCisJICogb3IgZmluZCB0aGUgZmlyc3QgZnJlZSBvbmUgKi8KKwl3aGlsZSAoMSkgeworCQlpZiAoIWdldGdyZ2lkKGctPmdyX2dpZCkpIHsKKwkJCXJldHVybjsgLyogZm91bmQgZnJlZSBncm91cDogcmV0dXJuICovCisJCX0KKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfR0lEKSB7CisJCQkvKiAtZyBOLCBjYW5ub3QgcGljayBnaWQgb3RoZXIgdGhhbiBOOiBlcnJvciAqLworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzICclcycgaW4gdXNlIiwgImdpZCIsIGl0b2EoZy0+Z3JfZ2lkKSk7CisJCQkvKiB0aGlzIGZvcm1hdCBzdHJpbmdzIGlzIHJldXNlZCBpbiBhZGR1c2VyIGFuZCBhZGRncm91cCAqLworCQl9CisJCWlmIChnLT5ncl9naWQgPT0gbWF4KSB7CisJCQkvKiBvdmVyZmxvd2VkOiBlcnJvciAqLworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vICVjaWRzIGxlZnQiLCAnZycpOworCQkJLyogdGhpcyBmb3JtYXQgc3RyaW5nIGlzIHJldXNlZCBpbiBhZGR1c2VyIGFuZCBhZGRncm91cCAqLworCQl9CisJCWctPmdyX2dpZCsrOworCX0KK30KKworLyogYXBwZW5kIGEgbmV3IHVzZXIgdG8gdGhlIHBhc3N3ZCBmaWxlICovCitzdGF0aWMgdm9pZCBuZXdfZ3JvdXAoY2hhciAqZ3JvdXAsIGdpZF90IGdpZCkKK3sKKwlzdHJ1Y3QgZ3JvdXAgZ3I7CisJY2hhciAqcDsKKworCS8qIG1ha2Ugc3VyZSBnaWQgYW5kIGdyb3VwIGhhdmVuJ3QgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCAqLworCWdyLmdyX2dpZCA9IGdpZDsKKwlnci5ncl9uYW1lID0gZ3JvdXA7CisJeGdyb3VwX3N0dWR5KCZncik7CisKKwkvKiBhZGQgZW50cnkgdG8gZ3JvdXAgKi8KKwlwID0geGFzcHJpbnRmKCJ4OiV1OiIsICh1bnNpZ25lZCkgZ3IuZ3JfZ2lkKTsKKwlpZiAodXBkYXRlX3Bhc3N3ZChiYl9wYXRoX2dyb3VwX2ZpbGUsIGdyb3VwLCBwLCBOVUxMKSA8IDApCisJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWZyZWUocCk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hBRE9XUEFTU1dEUworCS8qIC9ldGMvZ3NoYWRvdyBmaWVsZHM6CisJICogMS4gR3JvdXAgbmFtZS4KKwkgKiAyLiBFbmNyeXB0ZWQgcGFzc3dvcmQuCisJICogICAgSWYgc2V0LCBub24tbWVtYmVycyBvZiB0aGUgZ3JvdXAgY2FuIGpvaW4gdGhlIGdyb3VwCisJICogICAgYnkgdHlwaW5nIHRoZSBwYXNzd29yZCBmb3IgdGhhdCBncm91cCB1c2luZyB0aGUgbmV3Z3JwIGNvbW1hbmQuCisJICogICAgSWYgdGhlIHZhbHVlIGlzIG9mIHRoaXMgZmllbGQgISB0aGVuIG5vIHVzZXIgaXMgYWxsb3dlZAorCSAqICAgIHRvIGFjY2VzcyB0aGUgZ3JvdXAgdXNpbmcgdGhlIG5ld2dycCBjb21tYW5kLiBBIHZhbHVlIG9mICEhCisJICogICAgaXMgdHJlYXRlZCB0aGUgc2FtZSBhcyBhIHZhbHVlIG9mICEgb25seSBpdCBpbmRpY2F0ZXMKKwkgKiAgICB0aGF0IGEgcGFzc3dvcmQgaGFzIG5ldmVyIGJlZW4gc2V0IGJlZm9yZS4gSWYgdGhlIHZhbHVlIGlzIG51bGwsCisJICogICAgb25seSBncm91cCBtZW1iZXJzIGNhbiBsb2cgaW50byB0aGUgZ3JvdXAuCisJICogMy4gR3JvdXAgYWRtaW5pc3RyYXRvcnMgKGNvbW1hIGRlbGltaXRlZCBsaXN0KS4KKwkgKiAgICBHcm91cCBtZW1iZXJzIGxpc3RlZCBoZXJlIGNhbiBhZGQgb3IgcmVtb3ZlIGdyb3VwIG1lbWJlcnMKKwkgKiAgICB1c2luZyB0aGUgZ3Bhc3N3ZCBjb21tYW5kLgorCSAqIDQuIEdyb3VwIG1lbWJlcnMgKGNvbW1hIGRlbGltaXRlZCBsaXN0KS4KKwkgKi8KKwkvKiBJZ25vcmUgZXJyb3JzOiBpZiBmaWxlIGlzIG1pc3Npbmcgd2UgYXNzdW1lIGFkbWluIGRvZXNuJ3Qgd2FudCBpdCAqLworCXVwZGF0ZV9wYXNzd2QoYmJfcGF0aF9nc2hhZG93X2ZpbGUsIGdyb3VwLCAiITo6IiwgTlVMTCk7CisjZW5kaWYKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0FEREdST1VQX0xPTkdfT1BUSU9OUworc3RhdGljIGNvbnN0IGNoYXIgYWRkZ3JvdXBfbG9uZ29wdHNbXSBBTElHTjEgPQorCQkiZ2lkXDAiICAgICAgICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiZyIKKwkJInN5c3RlbVwwIiAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIlMiCisJCTsKKyNlbmRpZgorCisvKgorICogYWRkZ3JvdXAgd2lsbCB0YWtlIGEgbG9naW5fbmFtZSBhcyBpdHMgZmlyc3QgcGFyYW1ldGVyLgorICoKKyAqIGdpZCBjYW4gYmUgY3VzdG9taXplZCB2aWEgY29tbWFuZC1saW5lIHBhcmFtZXRlcnMuCisgKiBJZiBjYWxsZWQgd2l0aCB0d28gbm9uLW9wdGlvbiBhcmd1bWVudHMsIGFkZGdyb3VwCisgKiB3aWxsIGFkZCBhbiBleGlzdGluZyB1c2VyIHRvIGFuIGV4aXN0aW5nIGdyb3VwLgorICovCitpbnQgYWRkZ3JvdXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGFkZGdyb3VwX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHRzOworCWNvbnN0IGNoYXIgKmdpZCA9ICIwIjsKKworCS8qIG5lZWQgdG8gYmUgcm9vdCAqLworCWlmIChnZXRldWlkKCkpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3Blcm1fZGVuaWVkX2FyZV95b3Vfcm9vdCk7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0FEREdST1VQX0xPTkdfT1BUSU9OUworCWFwcGxldF9sb25nX29wdGlvbnMgPSBhZGRncm91cF9sb25nb3B0czsKKyNlbmRpZgorCS8qIFN5bnRheDoKKwkgKiAgYWRkZ3JvdXAgZ3JvdXAKKwkgKiAgYWRkZ3JvdXAgLWcgbnVtIGdyb3VwCisJICogIGFkZGdyb3VwIHVzZXIgZ3JvdXAKKwkgKiBDaGVjayBmb3IgbWluLCBtYXggYW5kIG1pc3NpbmcgYXJncyAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xOj8yIjsKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgImc6UyIsICZnaWQpOworCS8qIG1vdmUgcGFzdCB0aGUgY29tbWFuZGxpbmUgb3B0aW9ucyAqLworCWFyZ3YgKz0gb3B0aW5kOworCS8vYXJnYyAtPSBvcHRpbmQ7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9BRERVU0VSX1RPX0dST1VQCisJaWYgKGFyZ3ZbMV0pIHsKKwkJc3RydWN0IGdyb3VwICpncjsKKworCQlpZiAob3B0cyAmIE9QVF9HSUQpIHsKKwkJCS8qIC1nIHdhcyB0aGVyZSwgYnV0ICJhZGRncm91cCAtZyBudW0gdXNlciBncm91cCIKKwkJCSAqIGlzIGEgbm8tbm8gKi8KKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJfQorCisJCS8qIGNoZWNrIGlmIGdyb3VwIGFuZCB1c2VyIGV4aXN0ICovCisJCXh1bmFtZTJ1aWQoYXJndlswXSk7IC8qIHVua25vd24gdXNlcjogZXhpdCAqLworCQlnciA9IHhnZXRncm5hbShhcmd2WzFdKTsgLyogdW5rbm93biBncm91cDogZXhpdCAqLworCQkvKiBjaGVjayBpZiB1c2VyIGlzIGFscmVhZHkgaW4gdGhpcyBncm91cCAqLworCQlmb3IgKDsgKihnci0+Z3JfbWVtKSAhPSBOVUxMOyAoZ3ItPmdyX21lbSkrKykgeworCQkJaWYgKCFzdHJjbXAoYXJndlswXSwgKihnci0+Z3JfbWVtKSkpIHsKKwkJCQkvKiB1c2VyIGlzIGFscmVhZHkgaW4gZ3JvdXA6IGRvIG5vdGhpbmcgKi8KKwkJCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCQkJfQorCQl9CisJCWlmICh1cGRhdGVfcGFzc3dkKGJiX3BhdGhfZ3JvdXBfZmlsZSwgYXJndlsxXSwgTlVMTCwgYXJndlswXSkgPCAwKSB7CisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQl9CisjIGlmIEVOQUJMRV9GRUFUVVJFX1NIQURPV1BBU1NXRFMKKwkJdXBkYXRlX3Bhc3N3ZChiYl9wYXRoX2dzaGFkb3dfZmlsZSwgYXJndlsxXSwgTlVMTCwgYXJndlswXSk7CisjIGVuZGlmCisJfSBlbHNlCisjZW5kaWYgLyogRU5BQkxFX0ZFQVRVUkVfQUREVVNFUl9UT19HUk9VUCAqLworCXsKKwkJZGllX2lmX2JhZF91c2VybmFtZShhcmd2WzBdKTsKKwkJbmV3X2dyb3VwKGFyZ3ZbMF0sIHhhdG91X3JhbmdlKGdpZCwgMCwgQ09ORklHX0xBU1RfSUQpKTsKKwl9CisJLyogUmVhY2hlZCBvbmx5IG9uIHN1Y2Nlc3MgKi8KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbG9naW51dGlscy9hZGR1c2VyLmMgYi9sb2dpbnV0aWxzL2FkZHVzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDVlMzM2Ci0tLSAvZGV2L251bGwKKysrIGIvbG9naW51dGlscy9hZGR1c2VyLmMKQEAgLTAsMCArMSwyNzcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGFkZHVzZXIgLSBhZGQgdXNlcnMgdG8gL2V0Yy9wYXNzd2QgYW5kIC9ldGMvc2hhZG93CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IGJ5IExpbmVvLCBpbmMuIGFuZCBKb2huIEJlcHB1CisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCwyMDAxIGJ5IEpvaG4gQmVwcHUgPGJlcHB1QGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBhZGR1c2VyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gVVNFUiBbR1JPVVBdIgorLy91c2FnZTojZGVmaW5lIGFkZHVzZXJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDcmVhdGUgbmV3IHVzZXIsIG9yIGFkZCBVU0VSIHRvIEdST1VQXG4iCisvL3VzYWdlOiAgICAgIlxuCS1oIERJUgkJSG9tZSBkaXJlY3RvcnkiCisvL3VzYWdlOiAgICAgIlxuCS1nIEdFQ09TCUdFQ09TIGZpZWxkIgorLy91c2FnZTogICAgICJcbgktcyBTSEVMTAlMb2dpbiBzaGVsbCIKKy8vdXNhZ2U6ICAgICAiXG4JLUcgR1JQCQlBZGQgdXNlciB0byBleGlzdGluZyBncm91cCIKKy8vdXNhZ2U6ICAgICAiXG4JLVMJCUNyZWF0ZSBhIHN5c3RlbSB1c2VyIgorLy91c2FnZTogICAgICJcbgktRAkJRG9uJ3QgYXNzaWduIGEgcGFzc3dvcmQiCisvL3VzYWdlOiAgICAgIlxuCS1ICQlEb24ndCBjcmVhdGUgaG9tZSBkaXJlY3RvcnkiCisvL3VzYWdlOiAgICAgIlxuCS11IFVJRAkJVXNlciBpZCIKKy8vdXNhZ2U6ICAgICAiXG4JLWsgU0tFTAkJU2tlbGV0b24gZGlyZWN0b3J5ICgvZXRjL3NrZWwpIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIENPTkZJR19MQVNUX1NZU1RFTV9JRCA8IENPTkZJR19GSVJTVF9TWVNURU1fSUQKKyNlcnJvciBCYWQgTEFTVF9TWVNURU1fSUQgb3IgRklSU1RfU1lTVEVNX0lEIGluIC5jb25maWcKKyNlbmRpZgorI2lmIENPTkZJR19MQVNUX0lEIDwgQ09ORklHX0xBU1RfU1lTVEVNX0lECisjZXJyb3IgQmFkIExBU1RfSUQgb3IgTEFTVF9TWVNURU1fSUQgaW4gLmNvbmZpZworI2VuZGlmCisKKworLyogI2RlZmluZSBPUFRfSE9NRSAgICAgICAgICAgKDEgPDwgMCkgKi8gLyogdW51c2VkICovCisvKiAjZGVmaW5lIE9QVF9HRUNPUyAgICAgICAgICAoMSA8PCAxKSAqLyAvKiB1bnVzZWQgKi8KKyNkZWZpbmUgT1BUX1NIRUxMICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIE9QVF9HSUQgICAgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBPUFRfRE9OVF9TRVRfUEFTUyAgKDEgPDwgNCkKKyNkZWZpbmUgT1BUX1NZU1RFTV9BQ0NPVU5UICgxIDw8IDUpCisjZGVmaW5lIE9QVF9ET05UX01BS0VfSE9NRSAoMSA8PCA2KQorI2RlZmluZSBPUFRfVUlEICAgICAgICAgICAgKDEgPDwgNykKKyNkZWZpbmUgT1BUX1NLRUwgICAgICAgICAgICgxIDw8IDgpCisKKy8qIHJlbWl4ICovCisvKiByZWNvZGVkIHN1Y2ggdGhhdCB0aGUgdWlkIG1heSBiZSBwYXNzZWQgaW4gKnAgKi8KK3N0YXRpYyB2b2lkIHBhc3N3ZF9zdHVkeShzdHJ1Y3QgcGFzc3dkICpwKQoreworCWludCBtYXggPSBDT05GSUdfTEFTVF9JRDsKKworCWlmIChnZXRwd25hbShwLT5wd19uYW1lKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgJyVzJyBpbiB1c2UiLCAidXNlciIsIHAtPnB3X25hbWUpOworCQkvKiB0aGlzIGZvcm1hdCBzdHJpbmcgaXMgcmV1c2VkIGluIGFkZHVzZXIgYW5kIGFkZGdyb3VwICovCisJfQorCisJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9VSUQpKSB7CisJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX1NZU1RFTV9BQ0NPVU5UKSB7CisJCQlwLT5wd191aWQgPSBDT05GSUdfRklSU1RfU1lTVEVNX0lEOworCQkJbWF4ID0gQ09ORklHX0xBU1RfU1lTVEVNX0lEOworCQl9IGVsc2UgeworCQkJcC0+cHdfdWlkID0gQ09ORklHX0xBU1RfU1lTVEVNX0lEICsgMTsKKwkJfQorCX0KKwkvKiBjaGVjayBmb3IgYSBmcmVlIHVpZCAoYW5kIG1heWJlIGdpZCkgKi8KKwl3aGlsZSAoZ2V0cHd1aWQocC0+cHdfdWlkKSB8fCAocC0+cHdfZ2lkID09IChnaWRfdCktMSAmJiBnZXRncmdpZChwLT5wd191aWQpKSkgeworCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9VSUQpIHsKKwkJCS8qIC11IE4sIGNhbm5vdCBwaWNrIHVpZCBvdGhlciB0aGFuIE46IGVycm9yICovCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgJyVzJyBpbiB1c2UiLCAidWlkIiwgaXRvYShwLT5wd191aWQpKTsKKwkJCS8qIHRoaXMgZm9ybWF0IHN0cmluZyBpcyByZXVzZWQgaW4gYWRkdXNlciBhbmQgYWRkZ3JvdXAgKi8KKwkJfQorCQlpZiAocC0+cHdfdWlkID09IG1heCkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vICVjaWRzIGxlZnQiLCAndScpOworCQkJLyogdGhpcyBmb3JtYXQgc3RyaW5nIGlzIHJldXNlZCBpbiBhZGR1c2VyIGFuZCBhZGRncm91cCAqLworCQl9CisJCXAtPnB3X3VpZCsrOworCX0KKworCWlmIChwLT5wd19naWQgPT0gKGdpZF90KS0xKSB7CisJCXAtPnB3X2dpZCA9IHAtPnB3X3VpZDsgLyogbmV3IGdpZCA9IHVpZCAqLworCQlpZiAoZ2V0Z3JuYW0ocC0+cHdfbmFtZSkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyAnJXMnIGluIHVzZSIsICJncm91cCIsIHAtPnB3X25hbWUpOworCQkJLyogdGhpcyBmb3JtYXQgc3RyaW5nIGlzIHJldXNlZCBpbiBhZGR1c2VyIGFuZCBhZGRncm91cCAqLworCQl9CisJfQorfQorCitzdGF0aWMgaW50IGFkZGdyb3VwX3dyYXBwZXIoc3RydWN0IHBhc3N3ZCAqcCwgY29uc3QgY2hhciAqZ3JvdXBfbmFtZSkKK3sKKwljaGFyICphcmd2WzZdOworCisJYXJndlswXSA9IChjaGFyKikiYWRkZ3JvdXAiOworCWlmIChncm91cF9uYW1lKSB7CisJCS8qIEFkZCB1c2VyIHRvIGV4aXN0aW5nIGdyb3VwICovCisJCWFyZ3ZbMV0gPSAoY2hhciopIi0tIjsKKwkJYXJndlsyXSA9IHAtPnB3X25hbWU7CisJCWFyZ3ZbM10gPSAoY2hhciopZ3JvdXBfbmFtZTsKKwkJYXJndls0XSA9IE5VTEw7CisJfSBlbHNlIHsKKwkJLyogQWRkIHVzZXIgdG8gaGlzIG93biBncm91cCB3aXRoIHRoZSBmaXJzdCBmcmVlIGdpZAorCQkgKiBmb3VuZCBpbiBwYXNzd2Rfc3R1ZHkuCisJCSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0FEREdST1VQX0xPTkdfT1BUSU9OUyB8fCAhRU5BQkxFX0FEREdST1VQCisJCS8qIFdlIHRyeSB0byB1c2UgLS1naWQsIG5vdCAtZywgYmVjYXVzZSAic3RhbmRhcmQiIGFkZGdyb3VwCisJCSAqIGhhcyBubyBzaG9ydCBvcHRpb24gLWcsIGl0IGhhcyBvbmx5IGxvbmcgLS1naWQuCisJCSAqLworCQlhcmd2WzFdID0gKGNoYXIqKSItLWdpZCI7CisjZWxzZQorCQkvKiBCcmVha3MgaWYgc3lzdGVtIGluIGZhY3QgZG9lcyBOT1QgdXNlIGJ1c3lib3ggYWRkZ3JvdXAgKi8KKwkJYXJndlsxXSA9IChjaGFyKikiLWciOworI2VuZGlmCisJCWFyZ3ZbMl0gPSB1dG9hKHAtPnB3X2dpZCk7CisJCWFyZ3ZbM10gPSAoY2hhciopIi0tIjsKKwkJYXJndls0XSA9IHAtPnB3X25hbWU7CisJCWFyZ3ZbNV0gPSBOVUxMOworCX0KKworCXJldHVybiBzcGF3bl9hbmRfd2FpdChhcmd2KTsKK30KKworc3RhdGljIHZvaWQgcGFzc3dkX3dyYXBwZXIoY29uc3QgY2hhciAqbG9naW5fbmFtZSkgTk9SRVRVUk47CisKK3N0YXRpYyB2b2lkIHBhc3N3ZF93cmFwcGVyKGNvbnN0IGNoYXIgKmxvZ2luX25hbWUpCit7CisJQkJfRVhFQ0xQKCJwYXNzd2QiLCAicGFzc3dkIiwgIi0tIiwgbG9naW5fbmFtZSwgTlVMTCk7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGV4ZWN1dGUgcGFzc3dkLCB5b3UgbXVzdCBzZXQgcGFzc3dvcmQgbWFudWFsbHkiKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0FERFVTRVJfTE9OR19PUFRJT05TCitzdGF0aWMgY29uc3QgY2hhciBhZGR1c2VyX2xvbmdvcHRzW10gQUxJR04xID0KKwkJImhvbWVcMCIgICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgImgiCisJCSJnZWNvc1wwIiAgICAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJnIgorCQkic2hlbGxcMCIgICAgICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAicyIKKwkJImluZ3JvdXBcMCIgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIkciCisJCSJkaXNhYmxlZC1wYXNzd29yZFwwIiAgIE5vX2FyZ3VtZW50ICAgICAgICJEIgorCQkiZW1wdHktcGFzc3dvcmRcMCIgICAgICBOb19hcmd1bWVudCAgICAgICAiRCIKKwkJInN5c3RlbVwwIiAgICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIlMiCisJCSJuby1jcmVhdGUtaG9tZVwwIiAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJIIgorCQkidWlkXDAiICAgICAgICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAidSIKKwkJInNrZWxcMCIgICAgICAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgImsiCisJCTsKKyNlbmRpZgorCisvKgorICogYWRkdXNlciB3aWxsIHRha2UgYSBsb2dpbl9uYW1lIGFzIGl0cyBmaXJzdCBwYXJhbWV0ZXIuCisgKiBob21lLCBzaGVsbCwgZ2Vjb3M6CisgKiBjYW4gYmUgY3VzdG9taXplZCB2aWEgY29tbWFuZC1saW5lIHBhcmFtZXRlcnMuCisgKi8KK2ludCBhZGR1c2VyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBhZGR1c2VyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgcGFzc3dkIHB3OworCWNvbnN0IGNoYXIgKnVzZWdyb3VwID0gTlVMTDsKKwljaGFyICpwOworCXVuc2lnbmVkIG9wdHM7CisJY2hhciAqdWlkOworCWNvbnN0IGNoYXIgKnNrZWwgPSAiL2V0Yy9za2VsIjsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0FERFVTRVJfTE9OR19PUFRJT05TCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGFkZHVzZXJfbG9uZ29wdHM7CisjZW5kaWYKKworCS8qIGdvdCByb290PyAqLworCWlmIChnZXRldWlkKCkpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3Blcm1fZGVuaWVkX2FyZV95b3Vfcm9vdCk7CisJfQorCisJcHcucHdfZ2Vjb3MgPSAoY2hhciAqKSJMaW51eCBVc2VyLCwsIjsKKwkvKiBXZSBhc3N1bWUgdGhhdCBuZXdseSBjcmVhdGVkIHVzZXJzICJpbmhlcml0IiByb290J3Mgc2hlbGwgc2V0dGluZyAqLworCXB3LnB3X3NoZWxsID0gKGNoYXIgKilnZXRfc2hlbGxfbmFtZSgpOworCXB3LnB3X2RpciA9IE5VTEw7CisKKwkvKiBhdCBsZWFzdCBvbmUgYW5kIGF0IG1vc3QgdHdvIG5vbi1vcHRpb24gYXJncyAqLworCS8qIGRpc2FibGUgaW50ZXJhY3RpdmUgcGFzc3dkIGZvciBzeXN0ZW0gYWNjb3VudHMgKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMTo/MjpTRCI7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJoOmc6czpHOkRTSHU6azoiLCAmcHcucHdfZGlyLCAmcHcucHdfZ2Vjb3MsICZwdy5wd19zaGVsbCwgJnVzZWdyb3VwLCAmdWlkLCAmc2tlbCk7CisJaWYgKG9wdHMgJiBPUFRfVUlEKQorCQlwdy5wd191aWQgPSB4YXRvdV9yYW5nZSh1aWQsIDAsIENPTkZJR19MQVNUX0lEKTsKKworCWFyZ3YgKz0gb3B0aW5kOworCXB3LnB3X25hbWUgPSBhcmd2WzBdOworCisJaWYgKCFvcHRzICYmIGFyZ3ZbMV0pIHsKKwkJLyogaWYgY2FsbGVkIHdpdGggdHdvIG5vbi1vcHRpb24gYXJndW1lbnRzLCBhZGR1c2VyCisJCSAqIHdpbGwgYWRkIGFuIGV4aXN0aW5nIHVzZXIgdG8gYW4gZXhpc3RpbmcgZ3JvdXAuCisJCSAqLworCQlyZXR1cm4gYWRkZ3JvdXBfd3JhcHBlcigmcHcsIGFyZ3ZbMV0pOworCX0KKworCS8qIGZpbGwgaW4gdGhlIHBhc3N3ZCBzdHJ1Y3QgKi8KKwlkaWVfaWZfYmFkX3VzZXJuYW1lKHB3LnB3X25hbWUpOworCWlmICghcHcucHdfZGlyKSB7CisJCS8qIGNyZWF0ZSBzdHJpbmcgZm9yICRIT01FIGlmIG5vdCBzcGVjaWZpZWQgYWxyZWFkeSAqLworCQlwdy5wd19kaXIgPSB4YXNwcmludGYoIi9ob21lLyVzIiwgYXJndlswXSk7CisJfQorCXB3LnB3X3Bhc3N3ZCA9IChjaGFyICopIngiOworCWlmIChvcHRzICYgT1BUX1NZU1RFTV9BQ0NPVU5UKSB7CisJCWlmICghdXNlZ3JvdXApIHsKKwkJCXVzZWdyb3VwID0gIm5vZ3JvdXAiOworCQl9CisJCWlmICghKG9wdHMgJiBPUFRfU0hFTEwpKSB7CisJCQlwdy5wd19zaGVsbCA9IChjaGFyICopICIvYmluL2ZhbHNlIjsKKwkJfQorCX0KKwlwdy5wd19naWQgPSB1c2Vncm91cCA/IHhncm91cDJnaWQodXNlZ3JvdXApIDogLTE7IC8qIGV4aXRzIG9uIGZhaWx1cmUgKi8KKworCS8qIG1ha2Ugc3VyZSBldmVyeXRoaW5nIGlzIGtvc2hlciBhbmQgc2V0dXAgdWlkICYmIG1heWJlIGdpZCAqLworCXBhc3N3ZF9zdHVkeSgmcHcpOworCisJcCA9IHhhc3ByaW50ZigieDoldToldTolczolczolcyIsCisJCQkodW5zaWduZWQpIHB3LnB3X3VpZCwgKHVuc2lnbmVkKSBwdy5wd19naWQsCisJCQlwdy5wd19nZWNvcywgcHcucHdfZGlyLCBwdy5wd19zaGVsbCk7CisJaWYgKHVwZGF0ZV9wYXNzd2QoYmJfcGF0aF9wYXNzd2RfZmlsZSwgcHcucHdfbmFtZSwgcCwgTlVMTCkgPCAwKSB7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZShwKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSEFET1dQQVNTV0RTCisJLyogL2V0Yy9zaGFkb3cgZmllbGRzOgorCSAqIDEuIHVzZXJuYW1lCisJICogMi4gZW5jcnlwdGVkIHBhc3N3b3JkCisJICogMy4gbGFzdCBwYXNzd29yZCBjaGFuZ2UgKHVuaXggZGF0ZSAodW5peCB0aW1lLzI0KjYwKjYwKSkKKwkgKiA0LiBtaW5pbXVtIGRheXMgcmVxdWlyZWQgYmV0d2VlbiBwYXNzd29yZCBjaGFuZ2VzCisJICogNS4gbWF4aW11bSBkYXlzIHBhc3N3b3JkIGlzIHZhbGlkCisJICogNi4gZGF5cyBiZWZvcmUgcGFzc3dvcmQgaXMgdG8gZXhwaXJlIHRoYXQgdXNlciBpcyB3YXJuZWQKKwkgKiA3LiBkYXlzIGFmdGVyIHBhc3N3b3JkIGV4cGlyZXMgdGhhdCBhY2NvdW50IGlzIGRpc2FibGVkCisJICogOC4gdW5peCBkYXRlIHdoZW4gbG9naW4gZXhwaXJlcyAoaS5lLiB3aGVuIGl0IG1heSBubyBsb25nZXIgYmUgdXNlZCkKKwkgKi8KKwkvKiBmaWVsZHM6ICAgICAyIDMgIDQgNSAgICAgNiA3OCAqLworCXAgPSB4YXNwcmludGYoIiE6JXU6MDo5OTk5OTo3Ojo6IiwgKHVuc2lnbmVkKSh0aW1lKE5VTEwpKSAvICgyNCo2MCo2MCkpOworCS8qIGlnbm9yZSBlcnJvcnM6IGlmIGZpbGUgaXMgbWlzc2luZyB3ZSBzdXBwb3NlIGFkbWluIGRvZXNuJ3Qgd2FudCBpdCAqLworCXVwZGF0ZV9wYXNzd2QoYmJfcGF0aF9zaGFkb3dfZmlsZSwgcHcucHdfbmFtZSwgcCwgTlVMTCk7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmcmVlKHApOworI2VuZGlmCisKKwkvKiBhZGQgdG8gZ3JvdXAgKi8KKwlhZGRncm91cF93cmFwcGVyKCZwdywgdXNlZ3JvdXApOworCisJLyogY2xlYXIgdGhlIHVtYXNrIGZvciB0aGlzIHByb2Nlc3Mgc28gaXQgZG9lc24ndAorCSAqIHNjcmV3IHVwIHRoZSBwZXJtaXNzaW9ucyBvbiB0aGUgbWtkaXIgYW5kIGNob3duLiAqLworCXVtYXNrKDApOworCWlmICghKG9wdHMgJiBPUFRfRE9OVF9NQUtFX0hPTUUpKSB7CisJCS8qIHNldCB0aGUgb3duZXIgYW5kIGdyb3VwIHNvIGl0IGlzIG93bmVkIGJ5IHRoZSBuZXcgdXNlciwKKwkJICogdGhlbiBmaXggdXAgdGhlIHBlcm1pc3Npb25zIHRvIDI3NTUuIENhbid0IGRvIGl0IGJlZm9yZQorCQkgKiBzaW5jZSBjaG93biB3aWxsIGNsZWFyIHRoZSBzZXRnaWQgYml0ICovCisJCWludCBta2Rpcl9lcnIgPSBta2Rpcihwdy5wd19kaXIsIDA3NTUpOworCQlpZiAobWtkaXJfZXJyID09IDApIHsKKwkJCS8qIE5ldyBob21lLiBDb3B5IC9ldGMvc2tlbCB0byBpdCAqLworCQkJY29uc3QgY2hhciAqYXJnc1tdID0geworCQkJCSJjaG93biIsCisJCQkJIi1SIiwKKwkJCQl4YXNwcmludGYoIiV1OiV1IiwgKGludClwdy5wd191aWQsIChpbnQpcHcucHdfZ2lkKSwKKwkJCQlwdy5wd19kaXIsCisJCQkJTlVMTAorCQkJfTsKKwkJCS8qIEJlIHNpbGVudCBvbiBhbnkgZXJyb3JzIChsaWtlOiBubyAvZXRjL3NrZWwpICovCisJCQlpZiAoIShvcHRzICYgT1BUX1NLRUwpKQorCQkJCWxvZ21vZGUgPSBMT0dNT0RFX05PTkU7CisJCQljb3B5X2ZpbGUoc2tlbCwgcHcucHdfZGlyLCBGSUxFVVRJTFNfUkVDVVIpOworCQkJbG9nbW9kZSA9IExPR01PREVfU1RESU87CisJCQljaG93bl9tYWluKDQsIChjaGFyKiopYXJncyk7CisJCX0KKwkJaWYgKChta2Rpcl9lcnIgIT0gMCAmJiBlcnJubyAhPSBFRVhJU1QpCisJCSB8fCBjaG93bihwdy5wd19kaXIsIHB3LnB3X3VpZCwgcHcucHdfZ2lkKSAhPSAwCisJCSB8fCBjaG1vZChwdy5wd19kaXIsIDAyNzU1KSAhPSAwIC8qIHNldCBzZXRnaWQgYml0IG9uIGhvbWVkaXIgKi8KKwkJKSB7CisJCQliYl9zaW1wbGVfcGVycm9yX21zZyhwdy5wd19kaXIpOworCQl9CisJfQorCisJaWYgKCEob3B0cyAmIE9QVF9ET05UX1NFVF9QQVNTKSkgeworCQkvKiBpbnRlcmFjdGl2ZWx5IHNldCBwYXNzd2QgKi8KKwkJcGFzc3dkX3dyYXBwZXIocHcucHdfbmFtZSk7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2xvZ2ludXRpbHMvY2hwYXNzd2QuYyBiL2xvZ2ludXRpbHMvY2hwYXNzd2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGVkNzM3Ci0tLSAvZGV2L251bGwKKysrIGIvbG9naW51dGlscy9jaHBhc3N3ZC5jCkBAIC0wLDAgKzEsOTUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGNocGFzc3dkLmMKKyAqCisgKiBXcml0dGVuIGZvciBTTElORCAoZnJvbSBwYXNzd2QuYykgYnkgQWxleGFuZGVyIFNoaXNoa2luIDx2aXJ0dW9zb0BzbGluZC5vcmc+CisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKworLy91c2FnZTojZGVmaW5lIGNocGFzc3dkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CUlGX0xPTkdfT1BUUygiWy0tbWQ1fC0tZW5jcnlwdGVkXSIpIElGX05PVF9MT05HX09QVFMoIlstbXwtZV0iKQorLy91c2FnZTojZGVmaW5lIGNocGFzc3dkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVhZCB1c2VyOnBhc3N3b3JkIGZyb20gc3RkaW4gYW5kIHVwZGF0ZSAvZXRjL3Bhc3N3ZFxuIgorLy91c2FnZToJSUZfTE9OR19PUFRTKAorLy91c2FnZTogICAgICJcbgktZSwtLWVuY3J5cHRlZAlTdXBwbGllZCBwYXNzd29yZHMgYXJlIGluIGVuY3J5cHRlZCBmb3JtIgorLy91c2FnZTogICAgICJcbgktbSwtLW1kNQlVc2UgTUQ1IGVuY3J5cHRpb24gaW5zdGVhZCBvZiBERVMiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9OT1RfTE9OR19PUFRTKAorLy91c2FnZTogICAgICJcbgktZQlTdXBwbGllZCBwYXNzd29yZHMgYXJlIGluIGVuY3J5cHRlZCBmb3JtIgorLy91c2FnZTogICAgICJcbgktbQlVc2UgTUQ1IGVuY3J5cHRpb24gaW5zdGVhZCBvZiBERVMiCisvL3VzYWdlOgkpCisKKy8vVE9ETzogaW1wbGVtZW50IC1jIEFMR08KKworI2lmIEVOQUJMRV9MT05HX09QVFMKK3N0YXRpYyBjb25zdCBjaGFyIGNocGFzc3dkX2xvbmdvcHRzW10gQUxJR04xID0KKwkiZW5jcnlwdGVkXDAiIE5vX2FyZ3VtZW50ICJlIgorCSJtZDVcMCIgICAgICAgTm9fYXJndW1lbnQgIm0iCisJOworI2VuZGlmCisKKyNkZWZpbmUgT1BUX0VOQyAgMQorI2RlZmluZSBPUFRfTUQ1ICAyCisKK2ludCBjaHBhc3N3ZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY2hwYXNzd2RfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKm5hbWU7CisJaW50IG9wdDsKKworCWlmIChnZXR1aWQoKSAhPSAwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcGVybV9kZW5pZWRfYXJlX3lvdV9yb290KTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIm0tLWU6ZS0tbSI7CisJSUZfTE9OR19PUFRTKGFwcGxldF9sb25nX29wdGlvbnMgPSBjaHBhc3N3ZF9sb25nb3B0czspCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImVtIik7CisKKwl3aGlsZSAoKG5hbWUgPSB4bWFsbG9jX2ZnZXRsaW5lKHN0ZGluKSkgIT0gTlVMTCkgeworCQljaGFyICpmcmVlX21lOworCQljaGFyICpwYXNzOworCQlpbnQgcmM7CisKKwkJcGFzcyA9IHN0cmNocihuYW1lLCAnOicpOworCQlpZiAoIXBhc3MpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibWlzc2luZyBuZXcgcGFzc3dvcmQiKTsKKwkJKnBhc3MrKyA9ICdcMCc7CisKKwkJeHVuYW1lMnVpZChuYW1lKTsgLyogZGllcyBpZiB0aGVyZSBpcyBubyBzdWNoIHVzZXIgKi8KKworCQlmcmVlX21lID0gTlVMTDsKKwkJaWYgKCEob3B0ICYgT1BUX0VOQykpIHsKKwkJCWNoYXIgc2FsdFtzaXplb2YoIiROJFhYWFhYWFhYIildOworCisJCQljcnlwdF9tYWtlX3NhbHQoc2FsdCwgMSk7CisJCQlpZiAob3B0ICYgT1BUX01ENSkgeworCQkJCXNhbHRbMF0gPSAnJCc7CisJCQkJc2FsdFsxXSA9ICcxJzsKKwkJCQlzYWx0WzJdID0gJyQnOworCQkJCWNyeXB0X21ha2Vfc2FsdChzYWx0ICsgMywgNCk7CisJCQl9CisJCQlmcmVlX21lID0gcGFzcyA9IHB3X2VuY3J5cHQocGFzcywgc2FsdCwgMCk7CisJCX0KKworCQkvKiBUaGlzIGlzIHJhdGhlciBjb21wbGV4OiBpZiB1c2VyIGlzIG5vdCBmb3VuZCBpbiAvZXRjL3NoYWRvdywKKwkJICogd2UgdHJ5IHRvIGZpbmQgJiBjaGFuZ2UgaGlzIHBhc3N3ZCBpbiAvZXRjL3Bhc3N3ZCAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1NIQURPV1BBU1NXRFMKKwkJcmMgPSB1cGRhdGVfcGFzc3dkKGJiX3BhdGhfc2hhZG93X2ZpbGUsIG5hbWUsIHBhc3MsIE5VTEwpOworCQlpZiAocmMgPiAwKSAvKiBwYXNzd29yZCBpbiAvZXRjL3NoYWRvdyB3YXMgdXBkYXRlZCAqLworCQkJcGFzcyA9IChjaGFyKikieCI7CisJCWlmIChyYyA+PSAwKQorCQkJLyogMCA9IC9ldGMvc2hhZG93IG1pc3NpbmcgKG5vdCBhbiBlcnJvciksID4wID0gcGFzc3dkIGNoYW5nZWQgaW4gL2V0Yy9zaGFkb3cgKi8KKyNlbmRpZgorCQkJcmMgPSB1cGRhdGVfcGFzc3dkKGJiX3BhdGhfcGFzc3dkX2ZpbGUsIG5hbWUsIHBhc3MsIE5VTEwpOworCQkvKiBMT0dNT0RFX0JPVEggbG9ncyB0byBzeXNsb2cgYWxzbyAqLworCQlsb2dtb2RlID0gTE9HTU9ERV9CT1RIOworCQlpZiAocmMgPCAwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImFuIGVycm9yIG9jY3VycmVkIHVwZGF0aW5nIHBhc3N3b3JkIGZvciAlcyIsIG5hbWUpOworCQlpZiAocmMpCisJCQliYl9pbmZvX21zZygiUGFzc3dvcmQgZm9yICclcycgY2hhbmdlZCIsIG5hbWUpOworCQlsb2dtb2RlID0gTE9HTU9ERV9TVERJTzsKKwkJZnJlZShuYW1lKTsKKwkJZnJlZShmcmVlX21lKTsKKwl9CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL2xvZ2ludXRpbHMvY3J5cHRwdy5jIGIvbG9naW51dGlscy9jcnlwdHB3LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmMGZiZQotLS0gL2Rldi9udWxsCisrKyBiL2xvZ2ludXRpbHMvY3J5cHRwdy5jCkBAIC0wLDAgKzEsMTQyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBjcnlwdHB3LmMgLSBvdXRwdXQgYSBjcnlwdCgzKWVkIHBhc3N3b3JkIHRvIHN0ZG91dC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIENvb2tlZCBmcm9tIHBhc3N3ZC5jIGJ5IFRob21hcyBMdW5kcXVpc3QgPHRob21hc2V6QHplbG93Lm5vPgorICogbWtwYXNzd2QgY29tcGF0aWJsZSBvcHRpb25zIGFkZGVkIGJ5IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGNyeXB0cHdfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbUEFTU1dPUkRdIFtTQUxUXSIKKy8qIFdlIGRvIHN1cHBvcnQgLXMsIHdlIGp1c3QgZG9uJ3QgbWVudGlvbiBpdCAqLworLy91c2FnZTojZGVmaW5lIGNyeXB0cHdfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDcnlwdCBQQVNTV09SRCB1c2luZyBjcnlwdCgzKVxuIgorLy91c2FnZToJSUZfTE9OR19PUFRTKAorLy91c2FnZTogICAgICJcbgktUCwtLXBhc3N3b3JkLWZkPU4JUmVhZCBwYXNzd29yZCBmcm9tIGZkIE4iCisvKiAvL3VzYWdlOiAgIlxuCS1zLC0tc3RkaW4JCVVzZSBzdGRpbjsgbGlrZSAtUDAiICovCisvL3VzYWdlOiAgICAgIlxuCS1tLC0tbWV0aG9kPVRZUEUJRW5jcnlwdGlvbiBtZXRob2QiCisvL3VzYWdlOiAgICAgIlxuCS1TLC0tc2FsdD1TQUxUIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAiXG4JLVAgTglSZWFkIHBhc3N3b3JkIGZyb20gZmQgTiIKKy8qIC8vdXNhZ2U6ICAiXG4JLXMJVXNlIHN0ZGluOyBsaWtlIC1QMCIgKi8KKy8vdXNhZ2U6ICAgICAiXG4JLW0gVFlQRQlFbmNyeXB0aW9uIG1ldGhvZCBUWVBFIgorLy91c2FnZTogICAgICJcbgktUyBTQUxUIgorLy91c2FnZToJKQorCisvKiBta3Bhc3N3ZCBpcyBhbiBhbGlhcyB0byBjcnlwdHB3ICovCisvL3VzYWdlOiNkZWZpbmUgbWtwYXNzd2RfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbUEFTU1dPUkRdIFtTQUxUXSIKKy8qIFdlIGRvIHN1cHBvcnQgLXMsIHdlIGp1c3QgZG9uJ3QgbWVudGlvbiBpdCAqLworLy91c2FnZTojZGVmaW5lIG1rcGFzc3dkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ3J5cHQgUEFTU1dPUkQgdXNpbmcgY3J5cHQoMylcbiIKKy8vdXNhZ2U6CUlGX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAiXG4JLVAsLS1wYXNzd29yZC1mZD1OCVJlYWQgcGFzc3dvcmQgZnJvbSBmZCBOIgorLyogLy91c2FnZTogICJcbgktcywtLXN0ZGluCQlVc2Ugc3RkaW47IGxpa2UgLVAwIiAqLworLy91c2FnZTogICAgICJcbgktbSwtLW1ldGhvZD1UWVBFCUVuY3J5cHRpb24gbWV0aG9kIgorLy91c2FnZTogICAgICJcbgktUywtLXNhbHQ9U0FMVCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgIlxuCS1QIE4JUmVhZCBwYXNzd29yZCBmcm9tIGZkIE4iCisvKiAvL3VzYWdlOiAgIlxuCS1zCVVzZSBzdGRpbjsgbGlrZSAtUDAiICovCisvL3VzYWdlOiAgICAgIlxuCS1tIFRZUEUJRW5jcnlwdGlvbiBtZXRob2QgVFlQRSIKKy8vdXNhZ2U6ICAgICAiXG4JLVMgU0FMVCIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIERlYmlhbiBoYXMgJ21rcGFzc3dkJyB1dGlsaXR5LCBtYW5wYWdlIHNheXM6CisKK05BTUUKKyAgICBta3Bhc3N3ZCAtIE92ZXJmZWF0dXJlZCBmcm9udCBlbmQgdG8gY3J5cHQoMykKK1NZTk9QU0lTCisgICAgbWtwYXNzd2QgUEFTU1dPUkQgU0FMVAorLi4uCitPUFRJT05TCistUywgLS1zYWx0PVNUUklORworICAgIFVzZSB0aGUgU1RSSU5HIGFzIHNhbHQuIEl0IG11c3Qgbm90ICBjb250YWluICBwcmVmaXhlcyAgc3VjaCAgYXMKKyAgICAkMSQuCistUiwgLS1yb3VuZHM9TlVNQkVSCisgICAgVXNlIE5VTUJFUiByb3VuZHMuIFRoaXMgYXJndW1lbnQgaXMgaWdub3JlZCBpZiB0aGUgbWV0aG9kCisgICAgY2hvb3NlbiBkb2VzIG5vdCBzdXBwb3J0IHZhcmlhYmxlIHJvdW5kcy4gRm9yIHRoZSBPcGVuQlNEIEJsb3dmaXNoCisgICAgbWV0aG9kIHRoaXMgaXMgdGhlIGxvZ2FyaXRobSBvZiB0aGUgbnVtYmVyIG9mIHJvdW5kcy4KKy1tLCAtLW1ldGhvZD1UWVBFCisgICAgQ29tcHV0ZSB0aGUgcGFzc3dvcmQgdXNpbmcgdGhlIFRZUEUgbWV0aG9kLiBJZiBUWVBFIGlzICdoZWxwJworICAgIHRoZW4gdGhlIGF2YWlsYWJsZSBtZXRob2RzIGFyZSBwcmludGVkLgorLVAsIC0tcGFzc3dvcmQtZmQ9TlVNCisgICAgUmVhZCB0aGUgcGFzc3dvcmQgZnJvbSBmaWxlIGRlc2NyaXB0b3IgTlVNIGluc3RlYWQgb2YgdXNpbmcgZ2V0cGFzcygzKS4KKyAgICBJZiB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIG5vdCBjb25uZWN0ZWQgdG8gYSB0dHkgdGhlbgorICAgIG5vIG90aGVyIG1lc3NhZ2UgdGhhbiB0aGUgaGFzaGVkIHBhc3N3b3JkIGlzIHByaW50ZWQgb24gc3Rkb3V0LgorLXMsIC0tc3RkaW4KKyAgICBMaWtlIC0tcGFzc3dvcmQtZmQ9MC4KK0VOVklST05NRU5UCisgICAgJE1LUEFTU1dEX09QVElPTlMKKyAgICBBIGxpc3Qgb2Ygb3B0aW9ucyB3aGljaCB3aWxsIGJlIGV2YWx1YXRlZCBiZWZvcmUgdGhlIG9uZXMKKyAgICBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4KK0JVR1MKKyAgICBUaGlzIHByb2dyYW1zIHN1ZmZlcnMgb2YgYSBiYWQgY2FzZSBvZiBmZWF0dXJpdGlzLgorICAgIF5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisKK1ZlcnkgdHJ1ZS4uLgorCitjcnlwdHB3IHdhcyBpbiBiYm94IGJlZm9yZSB0aGlzIGdlbSwgc28gd2UgcmV0YWluIGl0LCBhbmQgYWxpYXMgbWtwYXNzd2QKK3RvIGNyeXB0cHcuIC1hIG9wdGlvbiAoYWxpYXMgZm9yIC1tKSBjYW1lIGZyb20gY3J5cHRwdy4KKyovCisKK2ludCBjcnlwdHB3X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjcnlwdHB3X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyIHNhbHRbTUFYX1BXX1NBTFRfTEVOXTsKKwljaGFyICpzYWx0X3B0cjsKKwljaGFyICpwYXNzd29yZDsKKwljb25zdCBjaGFyICpvcHRfbSwgKm9wdF9TOworCWludCBmZDsKKworI2lmIEVOQUJMRV9MT05HX09QVFMKKwlzdGF0aWMgY29uc3QgY2hhciBta3Bhc3N3ZF9sb25nb3B0c1tdIEFMSUdOMSA9CisJCSJzdGRpblwwIiAgICAgICBOb19hcmd1bWVudCAgICAgICAicyIKKwkJInBhc3N3b3JkLWZkXDAiIFJlcXVpcmVkX2FyZ3VtZW50ICJQIgorCQkic2FsdFwwIiAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIlMiCisJCSJtZXRob2RcMCIgICAgICBSZXF1aXJlZF9hcmd1bWVudCAibSIKKwk7CisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IG1rcGFzc3dkX2xvbmdvcHRzOworI2VuZGlmCisJZmQgPSBTVERJTl9GSUxFTk87CisJb3B0X20gPSBDT05GSUdfRkVBVFVSRV9ERUZBVUxUX1BBU1NXRF9BTEdPOworCW9wdF9TID0gTlVMTDsKKwkvKiBhdCBtb3N0IHR3byBub24tb3B0aW9uIGFyZ3VtZW50czsgLVAgTlVNICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPzI6UCsiOworCWdldG9wdDMyKGFyZ3YsICJzUDpTOm06YToiLCAmZmQsICZvcHRfUywgJm9wdF9tLCAmb3B0X20pOworCWFyZ3YgKz0gb3B0aW5kOworCisJLyogaGF2ZSBubyBpZGVhIGhvdyB0byBoYW5kbGUgLXMuLi4gKi8KKworCWlmIChhcmd2WzBdICYmICFvcHRfUykKKwkJb3B0X1MgPSBhcmd2WzFdOworCisJc2FsdF9wdHIgPSBjcnlwdF9tYWtlX3B3X3NhbHQoc2FsdCwgb3B0X20pOworCWlmIChvcHRfUykKKwkJc2FmZV9zdHJuY3B5KHNhbHRfcHRyLCBvcHRfUywgc2l6ZW9mKHNhbHQpIC0gKHNpemVvZigiJE4kIiktMSkpOworCisJeG1vdmVfZmQoZmQsIFNURElOX0ZJTEVOTyk7CisKKwlwYXNzd29yZCA9IGFyZ3ZbMF07CisJaWYgKCFwYXNzd29yZCkgeworCQkvKiBPbmx5IG1rcGFzc3dkLCBhbmQgb25seSBmcm9tIHR0eSwgcHJvbXB0cy4KKwkJICogT3RoZXJ3aXNlIGl0IGlzIGEgcGxhaW4gcmVhZC4gKi8KKwkJcGFzc3dvcmQgPSAoaXNhdHR5KFNURElOX0ZJTEVOTykgJiYgYXBwbGV0X25hbWVbMF0gPT0gJ20nKQorCQkJPyBiYl9hc2tfc3RkaW4oIlBhc3N3b3JkOiAiKQorCQkJOiB4bWFsbG9jX2ZnZXRsaW5lKHN0ZGluKQorCQk7CisJCS8qIG1heSBzdGlsbCBiZSBOVUxMIG9uIEVPRi9lcnJvciAqLworCX0KKworCWlmIChwYXNzd29yZCkKKwkJcHV0cyhwd19lbmNyeXB0KHBhc3N3b3JkLCBzYWx0LCAxKSk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbG9naW51dGlscy9kZWx1c2VyLmMgYi9sb2dpbnV0aWxzL2RlbHVzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTBjZDYzCi0tLSAvZGV2L251bGwKKysrIGIvbG9naW51dGlscy9kZWx1c2VyLmMKQEAgLTAsMCArMSwxMzggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGRlbHVzZXIvZGVsZ3JvdXAgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgYnkgTGluZW8sIGluYy4gYW5kIEpvaG4gQmVwcHUKKyAqIENvcHlyaWdodCAoQykgMTk5OSwyMDAwLDIwMDEgYnkgSm9obiBCZXBwdSA8YmVwcHVAY29kZXBvZXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA3IGJ5IFRpdG8gUmFndXNhIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZGVsdXNlcl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICBJRl9MT05HX09QVFMoIlstLXJlbW92ZS1ob21lXSAiKSAiVVNFUiIKKy8vdXNhZ2U6I2RlZmluZSBkZWx1c2VyX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGVsZXRlIFVTRVIgZnJvbSB0aGUgc3lzdGVtIgorLy8JLS1yZW1vdmUtaG9tZSBpcyBzZWxmLWV4cGxhbmF0b3J5IGVub3VnaCB0byBwdXQgaXQgaW4gLS1oZWxwCisKKy8vdXNhZ2U6I2RlZmluZSBkZWxncm91cF90cml2aWFsX3VzYWdlCisvL3VzYWdlOglJRl9GRUFUVVJFX0RFTF9VU0VSX0ZST01fR1JPVVAoIltVU0VSXSAiKSJHUk9VUCIKKy8vdXNhZ2U6I2RlZmluZSBkZWxncm91cF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRlbGV0ZSBncm91cCBHUk9VUCBmcm9tIHRoZSBzeXN0ZW0iCisvL3VzYWdlOglJRl9GRUFUVVJFX0RFTF9VU0VSX0ZST01fR1JPVVAoIiBvciB1c2VyIFVTRVIgZnJvbSBncm91cCBHUk9VUCIpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgZGVsdXNlcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZGVsdXNlcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwkvKiBVc2VyIG9yIGdyb3VwIG5hbWUgKi8KKwljaGFyICpuYW1lOworCS8qIFVzZXJuYW1lIChub24tTlVMTCBvbmx5IGluICJkZWxncm91cCBVU0VSIEdST1VQIiBjYXNlKSAqLworCWNoYXIgKm1lbWJlcjsKKwkvKiBOYW1lIG9mIHBhc3N3ZCBvciBncm91cCBmaWxlICovCisJY29uc3QgY2hhciAqcGZpbGU7CisJLyogTmFtZSBvZiBzaGFkb3cgb3IgZ3NoYWRvdyBmaWxlICovCisJY29uc3QgY2hhciAqc2ZpbGU7CisJLyogQXJlIHdlIGRlbHVzZXIgb3IgZGVsZ3JvdXA/ICovCisJaW50IGRvX2RlbHVzZXIgPSAoRU5BQkxFX0RFTFVTRVIgJiYgKCFFTkFCTEVfREVMR1JPVVAgfHwgYXBwbGV0X25hbWVbM10gPT0gJ3UnKSk7CisKKyNpZiAhRU5BQkxFX0xPTkdfT1BUUworCWNvbnN0IGludCBvcHRfZGVsaG9tZSA9IDA7CisjZWxzZQorCWludCBvcHRfZGVsaG9tZSA9IDA7CisJaWYgKGRvX2RlbHVzZXIpIHsKKwkJYXBwbGV0X2xvbmdfb3B0aW9ucyA9CisJCQkicmVtb3ZlLWhvbWVcMCIgTm9fYXJndW1lbnQgIlx4ZmYiOworCQlvcHRfZGVsaG9tZSA9IGdldG9wdDMyKGFyZ3YsICIiKTsKKwkJYXJndiArPSBvcHRfZGVsaG9tZTsKKwkJYXJnYyAtPSBvcHRfZGVsaG9tZTsKKwl9CisjZW5kaWYKKworCWlmIChnZXRldWlkKCkgIT0gMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3Blcm1fZGVuaWVkX2FyZV95b3Vfcm9vdCk7CisKKwluYW1lID0gYXJndlsxXTsKKwltZW1iZXIgPSBOVUxMOworCisJc3dpdGNoIChhcmdjKSB7CisJY2FzZSAzOgorCQlpZiAoIUVOQUJMRV9GRUFUVVJFX0RFTF9VU0VSX0ZST01fR1JPVVAgfHwgZG9fZGVsdXNlcikKKwkJCWJyZWFrOworCQkvKiBJdCdzICJkZWxncm91cCBVU0VSIEdST1VQIiAqLworCQltZW1iZXIgPSBuYW1lOworCQluYW1lID0gYXJndlsyXTsKKwkJLyogRmFsbHRocm91Z2ggKi8KKworCWNhc2UgMjoKKwkJaWYgKGRvX2RlbHVzZXIpIHsKKwkJCS8qICJkZWx1c2VyIFVTRVIiICovCisJCQlzdHJ1Y3QgcGFzc3dkICpwdzsKKworCQkJcHcgPSB4Z2V0cHduYW0obmFtZSk7IC8qIGJhaWwgb3V0IGlmIFVTRVIgaXMgd3JvbmcgKi8KKwkJCXBmaWxlID0gYmJfcGF0aF9wYXNzd2RfZmlsZTsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9TSEFET1dQQVNTV0RTKQorCQkJCXNmaWxlID0gYmJfcGF0aF9zaGFkb3dfZmlsZTsKKwkJCWlmIChvcHRfZGVsaG9tZSkKKwkJCQlyZW1vdmVfZmlsZShwdy0+cHdfZGlyLCBGSUxFVVRJTFNfUkVDVVIpOworCQl9IGVsc2UgeworCQkJc3RydWN0IGdyb3VwICpncjsKKyBkb19kZWxncm91cDoKKwkJCS8qICJkZWxncm91cCBHUk9VUCIgb3IgImRlbGdyb3VwIFVTRVIgR1JPVVAiICovCisJCQlpZiAoZG9fZGVsdXNlciA8IDApIHsgLyogZGVsZ3JvdXAgYWZ0ZXIgZGVsdXNlcj8gKi8KKwkJCQlnciA9IGdldGdybmFtKG5hbWUpOworCQkJCWlmICghZ3IpCisJCQkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCQl9IGVsc2UgeworCQkJCWdyID0geGdldGdybmFtKG5hbWUpOyAvKiBiYWlsIG91dCBpZiBHUk9VUCBpcyB3cm9uZyAqLworCQkJfQorCQkJaWYgKCFtZW1iZXIpIHsKKwkJCQkvKiAiZGVsZ3JvdXAgR1JPVVAiICovCisJCQkJc3RydWN0IHBhc3N3ZCAqcHc7CisJCQkJLyogQ2hlY2sgaWYgdGhlIGdyb3VwIGlzIGluIHVzZSAqLworCQkJCXdoaWxlICgocHcgPSBnZXRwd2VudCgpKSAhPSBOVUxMKSB7CisJCQkJCWlmIChwdy0+cHdfZ2lkID09IGdyLT5ncl9naWQpCisJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJyVzJyBzdGlsbCBoYXMgJyVzJyBhcyB0aGVpciBwcmltYXJ5IGdyb3VwISIsCisJCQkJCQkJcHctPnB3X25hbWUsIG5hbWUpOworCQkJCX0KKwkJCQkvL2VuZHB3ZW50KCk7CisJCQl9CisJCQlwZmlsZSA9IGJiX3BhdGhfZ3JvdXBfZmlsZTsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9TSEFET1dQQVNTV0RTKQorCQkJCXNmaWxlID0gYmJfcGF0aF9nc2hhZG93X2ZpbGU7CisJCX0KKworCQkvKiBNb2RpZnkgcGZpbGUsIHRoZW4gc2ZpbGUgKi8KKwkJZG8geworCQkJaWYgKHVwZGF0ZV9wYXNzd2QocGZpbGUsIG5hbWUsIE5VTEwsIG1lbWJlcikgPT0gLTEpCisJCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9TSEFET1dQQVNTV0RTKSB7CisJCQkJcGZpbGUgPSBzZmlsZTsKKwkJCQlzZmlsZSA9IE5VTEw7CisJCQl9CisJCX0gd2hpbGUgKEVOQUJMRV9GRUFUVVJFX1NIQURPV1BBU1NXRFMgJiYgcGZpbGUpOworCisJCWlmIChkb19kZWx1c2VyID4gMCkgeworCQkJLyogRGVsZXRlIHVzZXIgZnJvbSBhbGwgZ3JvdXBzICovCisJCQlpZiAodXBkYXRlX3Bhc3N3ZChiYl9wYXRoX2dyb3VwX2ZpbGUsIE5VTEwsIE5VTEwsIG5hbWUpID09IC0xKQorCQkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisKKwkJCWlmIChFTkFCTEVfREVMR1JPVVApIHsKKwkJCQkvKiAiZGVsdXNlciBVU0VSIiBhbHNvIHNob3VsZCB0cnkgdG8gZGVsZXRlCisJCQkJICogc2FtZS1uYW1lZCBncm91cC4gSU9XOiBkbyAiZGVsZ3JvdXAgVVNFUiIKKwkJCQkgKi8KKy8vIE9uIGRlYmlhbiBkZWx1c2VyIGlzIGEgcGVybCBzY3JpcHQgdGhhdCBjYWxscyB1c2VyZGVsLgorLy8gRnJvbSBtYW4gdXNlcmRlbDoKKy8vICBJZiBVU0VSR1JPVVBTX0VOQUIgaXMgZGVmaW5lZCB0byB5ZXMgaW4gL2V0Yy9sb2dpbi5kZWZzLCB1c2VyZGVsIHdpbGwKKy8vICBkZWxldGUgdGhlIGdyb3VwIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgdXNlci4KKwkJCQlkb19kZWx1c2VyID0gLTE7CisJCQkJZ290byBkb19kZWxncm91cDsKKwkJCX0KKwkJfQorCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKwkvKiBSZWFjaGVkIG9ubHkgaWYgbnVtYmVyIG9mIGNvbW1hbmQgbGluZSBhcmdzIGlzIHdyb25nICovCisJYmJfc2hvd191c2FnZSgpOworfQpkaWZmIC0tZ2l0IGEvbG9naW51dGlscy9nZXR0eS5jIGIvbG9naW51dGlscy9nZXR0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MmQ1YzcKLS0tIC9kZXYvbnVsbAorKysgYi9sb2dpbnV0aWxzL2dldHR5LmMKQEAgLTAsMCArMSw3MTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIEJhc2VkIG9uIGFnZXR0eSAtIGFub3RoZXIgZ2V0dHkgcHJvZ3JhbSBmb3IgTGludXguIEJ5IFcuIFouIFZlbmVtYSAxOTg5CisgKiBQb3J0ZWQgdG8gTGludXggYnkgUGV0ZXIgT3JiYWVrIDxwb2VAZGFpbWkuYWF1LmRrPgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWVseSBkaXN0cmlidXRhYmxlLgorICoKKyAqIG9wdGlvbiBhZGRlZCBieSBFcmljIFJhc211c3NlbiA8ZWFyQHVzZmlyc3Qub3JnPiAtIDEyLzI4Lzk1CisgKgorICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWlja2lld2ljeiA8bWlzaWVrQG1pc2llay5ldS5vcmc+CisgKiAtIEFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisgKgorICogMTk5OS0wNS0wNSBUaG9yc3RlbiBLcmFuemtvd3NraSA8ZGw4YmN1QGdteC5uZXQ+CisgKiAtIEVuYWJsZWQgaGFyZHdhcmUgZmxvdyBjb250cm9sIGJlZm9yZSBkaXNwbGF5aW5nIC9ldGMvaXNzdWUKKyAqCisgKiAyMDExLTAxIFZlbnlzIFZsYXNlbmtvCisgKiAtIFJlbW92ZWQgcGFyaXR5IGRldGVjdGlvbiBjb2RlLiBJdCBjYW4ndCB3b3JrIHJlbGlhYmx5OgorICogaWYgYWxsIGNoYXJzIHJlY2VpdmVkIGhhdmUgYml0IDcgY2xlYXJlZCBhbmQgb2RkIChvciBldmVuKSBwYXJpdHksCisgKiBpdCBpcyBpbXBvc3NpYmxlIHRvIGRldGVybWluZSB3aGV0aGVyIG90aGVyIHNpZGUgaXMgOC1iaXQsbm8tcGFyaXR5CisgKiBvciA3LWJpdCxvZGQoZXZlbiktcGFyaXR5LiBJdCBhbHNvIGludGVyZmVyZXMgd2l0aCBub24tQVNDSUkgdXNlcm5hbWVzLgorICogLSBGcm9tIG5vdyBvbiwgd2UgYXNzdW1lIHRoYXQgcGFyaXR5IGlzIGNvcnJlY3RseSBzZXQuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpZm5kZWYgSVVDTEMKKyMgZGVmaW5lIElVQ0xDIDAKKyNlbmRpZgorCisjaWZuZGVmIExPR0lOX1BST0NFU1MKKyMgdW5kZWYgRU5BQkxFX0ZFQVRVUkVfVVRNUAorIyB1bmRlZiBFTkFCTEVfRkVBVFVSRV9XVE1QCisjIGRlZmluZSBFTkFCTEVfRkVBVFVSRV9VVE1QIDAKKyMgZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1dUTVAgMAorI2VuZGlmCisKKworLyogVGhlIGZvbGxvd2luZyBpcyB1c2VkIGZvciB1bmRlcnN0YW5kYWJsZSBkaWFnbm9zdGljcyAqLworI2lmZGVmIERFQlVHR0lORworc3RhdGljIEZJTEUgKmRiZjsKKyMgZGVmaW5lIERFQlVHVEVSTSAiL2Rldi90dHlwMCIKKyMgZGVmaW5lIGRlYnVnKC4uLikgZG8geyBmcHJpbnRmKGRiZiwgX19WQV9BUkdTX18pOyBmZmx1c2goZGJmKTsgfSB3aGlsZSAoMCkKKyNlbHNlCisjIGRlZmluZSBkZWJ1ZyguLi4pICgodm9pZCkwKQorI2VuZGlmCisKKworLyoKKyAqIFRoaW5ncyB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5LgorICoKKyAqIFlvdSBtYXkgZGlzYWdyZWUgd2l0aCB0aGUgZGVmYXVsdCBsaW5lLWVkaXRpbmcgZXRjLiBjaGFyYWN0ZXJzIGRlZmluZWQKKyAqIGJlbG93LiBOb3RlLCBob3dldmVyLCB0aGF0IERFTCBjYW5ub3QgYmUgdXNlZCBmb3IgaW50ZXJydXB0IGdlbmVyYXRpb24KKyAqIGFuZCBmb3IgbGluZSBlZGl0aW5nIGF0IHRoZSBzYW1lIHRpbWUuCisgKi8KKyN1bmRlZiAgX1BBVEhfTE9HSU4KKyNkZWZpbmUgX1BBVEhfTE9HSU4gIi9iaW4vbG9naW4iCisKKy8qIERpc3BsYXllZCBiZWZvcmUgdGhlIGxvZ2luIHByb21wdC4KKyAqIElmIElTU1VFIGlzIG5vdCBkZWZpbmVkLCBnZXR0eSB3aWxsIG5ldmVyIGRpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZQorICogL2V0Yy9pc3N1ZSBmaWxlLiBZb3Ugd2lsbCBub3Qgd2FudCB0byBzcGl0IG91dCBsYXJnZSAiaXNzdWUiIGZpbGVzIGF0IHRoZQorICogd3JvbmcgYmF1ZCByYXRlLgorICovCisjZGVmaW5lIElTU1VFICIvZXRjL2lzc3VlIgorCisvKiBNYWNybyB0byBidWlsZCBDdHJsLUxFVFRFUi4gQXNzdW1lcyBBU0NJSSBkaWFsZWN0ICovCisjZGVmaW5lIENUTCh4KSAgICAgICAgICAoKHgpIF4gMDEwMCkKKworLyoKKyAqIFdoZW4gbXVsdGlwbGUgYmF1ZCByYXRlcyBhcmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsCisgKiB0aGUgZmlyc3Qgb25lIHdlIHdpbGwgdHJ5IGlzIHRoZSBmaXJzdCBvbmUgc3BlY2lmaWVkLgorICovCisjZGVmaW5lIE1BWF9TUEVFRCAgICAgICAxMCAgICAgICAgICAgICAgLyogbWF4LiBuci4gb2YgYmF1ZCByYXRlcyAqLworCitzdHJ1Y3QgZ2xvYmFscyB7CisJdW5zaWduZWQgdGltZW91dDsKKwljb25zdCBjaGFyICpsb2dpbjsgICAgICAgICAgICAgIC8qIGxvZ2luIHByb2dyYW0gKi8KKwljb25zdCBjaGFyICpmYWtlaG9zdDsKKwljb25zdCBjaGFyICp0dHlfbmFtZTsKKwljaGFyICppbml0c3RyaW5nOyAgICAgICAgICAgICAgIC8qIG1vZGVtIGluaXQgc3RyaW5nICovCisJY29uc3QgY2hhciAqaXNzdWU7ICAgICAgICAgICAgICAvKiBhbHRlcm5hdGl2ZSBpc3N1ZSBmaWxlICovCisJaW50IG51bXNwZWVkOyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgYmF1ZCByYXRlcyB0byB0cnkgKi8KKwlpbnQgc3BlZWRzW01BWF9TUEVFRF07ICAgICAgICAgIC8qIGJhdWQgcmF0ZXMgdG8gYmUgdHJpZWQgKi8KKwl1bnNpZ25lZCBjaGFyIGVvbDsgICAgICAgICAgICAgIC8qIGVuZC1vZi1saW5lIGNoYXIgc2VlbiAoQ1Igb3IgTkwpICovCisJc3RydWN0IHRlcm1pb3MgdHR5X2F0dHJzOworCWNoYXIgbGluZV9idWZbMTI4XTsKK307CisKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorfSB3aGlsZSAoMCkKKworLy91c2FnZTojZGVmaW5lIGdldHR5X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gQkFVRF9SQVRFWyxCQVVEX1JBVEVdLi4uIFRUWSBbVEVSTVRZUEVdIgorLy91c2FnZTojZGVmaW5lIGdldHR5X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiT3BlbiBUVFksIHByb21wdCBmb3IgbG9naW4gbmFtZSwgdGhlbiBpbnZva2UgL2Jpbi9sb2dpblxuIgorLy91c2FnZTogICAgICJcbgktaAkJRW5hYmxlIGhhcmR3YXJlIFJUUy9DVFMgZmxvdyBjb250cm9sIgorLy91c2FnZTogICAgICJcbgktTAkJU2V0IENMT0NBTCAoaWdub3JlIENhcnJpZXIgRGV0ZWN0IHN0YXRlKSIKKy8vdXNhZ2U6ICAgICAiXG4JLW0JCUdldCBiYXVkIHJhdGUgZnJvbSBtb2RlbSdzIENPTk5FQ1Qgc3RhdHVzIG1lc3NhZ2UiCisvL3VzYWdlOiAgICAgIlxuCS1uCQlEb24ndCBwcm9tcHQgZm9yIGxvZ2luIG5hbWUiCisvL3VzYWdlOiAgICAgIlxuCS13CQlXYWl0IGZvciBDUiBvciBMRiBiZWZvcmUgc2VuZGluZyAvZXRjL2lzc3VlIgorLy91c2FnZTogICAgICJcbgktaQkJRG9uJ3QgZGlzcGxheSAvZXRjL2lzc3VlIgorLy91c2FnZTogICAgICJcbgktZiBJU1NVRV9GSUxFCURpc3BsYXkgSVNTVUVfRklMRSBpbnN0ZWFkIG9mIC9ldGMvaXNzdWUiCisvL3VzYWdlOiAgICAgIlxuCS1sIExPR0lOCUludm9rZSBMT0dJTiBpbnN0ZWFkIG9mIC9iaW4vbG9naW4iCisvL3VzYWdlOiAgICAgIlxuCS10IFNFQwkJVGVybWluYXRlIGFmdGVyIFNFQyBpZiBubyBsb2dpbiBuYW1lIGlzIHJlYWQiCisvL3VzYWdlOiAgICAgIlxuCS1JIElOSVRTVFIJU2VuZCBJTklUU1RSIGJlZm9yZSBhbnl0aGluZyBlbHNlIgorLy91c2FnZTogICAgICJcbgktSCBIT1NUCQlMb2cgSE9TVCBpbnRvIHRoZSB1dG1wIGZpbGUgYXMgdGhlIGhvc3RuYW1lIgorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG5CQVVEX1JBVEUgb2YgMCBsZWF2ZXMgaXQgdW5jaGFuZ2VkIgorCitzdGF0aWMgY29uc3QgY2hhciBvcHRfc3RyaW5nW10gQUxJR04xID0gIkk6TEg6ZjpoaWw6bXQ6d24iOworI2RlZmluZSBGX0lOSVRTVFJJTkcgICAgKDEgPDwgMCkgICAvKiAtSSAqLworI2RlZmluZSBGX0xPQ0FMICAgICAgICAgKDEgPDwgMSkgICAvKiAtTCAqLworI2RlZmluZSBGX0ZBS0VIT1NUICAgICAgKDEgPDwgMikgICAvKiAtSCAqLworI2RlZmluZSBGX0NVU1RJU1NVRSAgICAgKDEgPDwgMykgICAvKiAtZiAqLworI2RlZmluZSBGX1JUU0NUUyAgICAgICAgKDEgPDwgNCkgICAvKiAtaCAqLworI2RlZmluZSBGX05PSVNTVUUgICAgICAgKDEgPDwgNSkgICAvKiAtaSAqLworI2RlZmluZSBGX0xPR0lOICAgICAgICAgKDEgPDwgNikgICAvKiAtbCAqLworI2RlZmluZSBGX1BBUlNFICAgICAgICAgKDEgPDwgNykgICAvKiAtbSAqLworI2RlZmluZSBGX1RJTUVPVVQgICAgICAgKDEgPDwgOCkgICAvKiAtdCAqLworI2RlZmluZSBGX1dBSVRDUkxGICAgICAgKDEgPDwgOSkgICAvKiAtdyAqLworI2RlZmluZSBGX05PUFJPTVBUICAgICAgKDEgPDwgMTApICAvKiAtbiAqLworCisKKy8qIGNvbnZlcnQgc3BlZWQgc3RyaW5nIHRvIHNwZWVkIGNvZGU7IHJldHVybiA8PSAwIG9uIGZhaWx1cmUgKi8KK3N0YXRpYyBpbnQgYmNvZGUoY29uc3QgY2hhciAqcykKK3sKKwlpbnQgdmFsdWUgPSBiYl9zdHJ0b3UocywgTlVMTCwgMTApOyAvKiB5ZXMsIGludCBpcyBpbnRlbmRlZCEgKi8KKwlpZiAodmFsdWUgPCAwKSAvKiBiYWQgdGVybWluYXRpbmcgY2hhciwgb3ZlcmZsb3csIGV0YyAqLworCQlyZXR1cm4gdmFsdWU7CisJcmV0dXJuIHR0eV92YWx1ZV90b19iYXVkKHZhbHVlKTsKK30KKworLyogcGFyc2UgYWx0ZXJuYXRlIGJhdWQgcmF0ZXMgKi8KK3N0YXRpYyB2b2lkIHBhcnNlX3NwZWVkcyhjaGFyICphcmcpCit7CisJY2hhciAqY3A7CisKKwkvKiBOQjogYXQgbGVhc3Qgb25lIGl0ZXJhdGlvbiBpcyBhbHdheXMgZG9uZSAqLworCWRlYnVnKCJlbnRlcmVkIHBhcnNlX3NwZWVkc1xuIik7CisJd2hpbGUgKChjcCA9IHN0cnNlcCgmYXJnLCAiLCIpKSAhPSBOVUxMKSB7CisJCUcuc3BlZWRzW0cubnVtc3BlZWRdID0gYmNvZGUoY3ApOworCQlpZiAoRy5zcGVlZHNbRy5udW1zcGVlZF0gPCAwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBzcGVlZDogJXMiLCBjcCk7CisJCS8qIG5vdGU6IGFyZyAiMCIgdHVybnMgaW50byBzcGVlZCBCMCAqLworCQlHLm51bXNwZWVkKys7CisJCWlmIChHLm51bXNwZWVkID4gTUFYX1NQRUVEKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRvbyBtYW55IGFsdGVybmF0ZSBzcGVlZHMiKTsKKwl9CisJZGVidWcoImV4aXRpbmcgcGFyc2Vfc3BlZWRzXG4iKTsKK30KKworLyogcGFyc2UgY29tbWFuZC1saW5lIGFyZ3VtZW50cyAqLworc3RhdGljIHZvaWQgcGFyc2VfYXJncyhjaGFyICoqYXJndikKK3sKKwljaGFyICp0czsKKwlpbnQgZmxhZ3M7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMjp0KyI7IC8qIGF0IGxlYXN0IDIgYXJnczsgLXQgTiAqLworCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgb3B0X3N0cmluZywKKwkJJkcuaW5pdHN0cmluZywgJkcuZmFrZWhvc3QsICZHLmlzc3VlLAorCQkmRy5sb2dpbiwgJkcudGltZW91dAorCSk7CisJaWYgKGZsYWdzICYgRl9JTklUU1RSSU5HKSB7CisJCUcuaW5pdHN0cmluZyA9IHhzdHJkdXAoRy5pbml0c3RyaW5nKTsKKwkJLyogZGVjb2RlIFxkZGQgb2N0YWwgY29kZXMgaW50byBjaGFycyAqLworCQlzdHJjcHlfYW5kX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlcyhHLmluaXRzdHJpbmcsIEcuaW5pdHN0cmluZyk7CisJfQorCWFyZ3YgKz0gb3B0aW5kOworCWRlYnVnKCJhZnRlciBnZXRvcHRcbiIpOworCisJLyogV2UgbG9vc2VuIHVwIGEgYml0IGFuZCBhY2NlcHQgYm90aCAiYmF1ZHJhdGUgdHR5IiBhbmQgInR0eSBiYXVkcmF0ZSIgKi8KKwlHLnR0eV9uYW1lID0gYXJndlswXTsKKwl0cyA9IGFyZ3ZbMV07ICAgICAgICAgICAgLyogYmF1ZCByYXRlKHMpICovCisJaWYgKGlzZGlnaXQoYXJndlswXVswXSkpIHsKKwkJLyogQSBudW1iZXIgZmlyc3QsIGFzc3VtZSBpdCdzIGEgc3BlZWQgKEJTRCBzdHlsZSkgKi8KKwkJRy50dHlfbmFtZSA9IHRzOyAvKiB0dHkgbmFtZSBpcyBpbiBhcmd2WzFdICovCisJCXRzID0gYXJndlswXTsgICAgLyogYmF1ZCByYXRlKHMpICovCisJfQorCXBhcnNlX3NwZWVkcyh0cyk7CisKKwlpZiAoYXJndlsyXSkKKwkJeHNldGVudigiVEVSTSIsIGFyZ3ZbMl0pOworCisJZGVidWcoImV4aXRpbmcgcGFyc2VfYXJnc1xuIik7Cit9CisKKy8qIHNldCB1cCB0dHkgYXMgc3RhbmRhcmQgaW5wdXQsIG91dHB1dCwgZXJyb3IgKi8KK3N0YXRpYyB2b2lkIG9wZW5fdHR5KHZvaWQpCit7CisJLyogU2V0IHVwIG5ldyBzdGFuZGFyZCBpbnB1dCwgdW5sZXNzIHdlIGFyZSBnaXZlbiBhbiBhbHJlYWR5IG9wZW5lZCBwb3J0ICovCisJaWYgKE5PVF9MT05FX0RBU0goRy50dHlfbmFtZSkpIHsKKwkJaWYgKEcudHR5X25hbWVbMF0gIT0gJy8nKQorCQkJRy50dHlfbmFtZSA9IHhhc3ByaW50ZigiL2Rldi8lcyIsIEcudHR5X25hbWUpOyAvKiB3aWxsIGxlYWsgaXQgKi8KKworCQkvKiBPcGVuIHRoZSB0dHkgYXMgc3RhbmRhcmQgaW5wdXQgKi8KKwkJZGVidWcoIm9wZW4oMilcbiIpOworCQljbG9zZSgwKTsKKwkJeG9wZW4oRy50dHlfbmFtZSwgT19SRFdSIHwgT19OT05CTE9DSyk7IC8qIHVzZXMgZmQgMCAqLworCisJCS8qIFNldCBwcm9wZXIgcHJvdGVjdGlvbnMgYW5kIG93bmVyc2hpcCAqLworCQlmY2hvd24oMCwgMCwgMCk7ICAgICAgICAvKiAwOjAgKi8KKwkJZmNobW9kKDAsIDA2MjApOyAgICAgICAgLyogY3J3LS13LS0tLSAqLworCX0gZWxzZSB7CisJCWNoYXIgKm47CisJCS8qCisJCSAqIFN0YW5kYXJkIGlucHV0IHNob3VsZCBhbHJlYWR5IGJlIGNvbm5lY3RlZCB0byBhbiBvcGVuIHBvcnQuCisJCSAqIE1ha2Ugc3VyZSBpdCBpcyBvcGVuIGZvciByZWFkL3dyaXRlLgorCQkgKi8KKwkJaWYgKChmY250bCgwLCBGX0dFVEZMKSAmIChPX1JEV1J8T19SRE9OTFl8T19XUk9OTFkpKSAhPSBPX1JEV1IpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic3RkaW4gaXMgbm90IG9wZW4gZm9yIHJlYWQvd3JpdGUiKTsKKworCQkvKiBUcnkgdG8gZ2V0IHJlYWwgdHR5IG5hbWUgaW5zdGVhZCBvZiAiLSIgKi8KKwkJbiA9IHhtYWxsb2NfdHR5bmFtZSgwKTsKKwkJaWYgKG4pCisJCQlHLnR0eV9uYW1lID0gbjsKKwl9CisJYXBwbGV0X25hbWUgPSB4YXNwcmludGYoImdldHR5OiAlcyIsIHNraXBfZGV2X3BmeChHLnR0eV9uYW1lKSk7Cit9CisKK3N0YXRpYyB2b2lkIHNldF90dHlfYXR0cnModm9pZCkKK3sKKwlpZiAodGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coJkcudHR5X2F0dHJzKSA8IDApCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgidGNzZXRhdHRyIik7Cit9CisKKy8qIFdlIG1hbmlwdWxhdGUgdHR5X2F0dHJzIHRoaXMgd2F5OgorICogLSBmaXJzdCwgd2UgcmVhZCBleGlzdGluZyB0dHlfYXR0cnMKKyAqIC0gaW5pdF90dHlfYXR0cnMgbW9kaWZpZXMgc29tZSBwYXJ0cyBhbmQgc2V0cyBpdAorICogLSBhdXRvX2JhdWQgYW5kL29yIEJSRUFLIHByb2Nlc3NpbmcgY2FuIHNldCBkaWZmZXJlbnQgc3BlZWQgYW5kIHNldCB0dHkgYXR0cnMKKyAqIC0gZmluYWxpemVfdHR5X2F0dHJzIGFnYWluIG1vZGlmaWVzIHNvbWUgcGFydHMgYW5kIHNldHMgdHR5IGF0dHJzIGJlZm9yZQorICogICBleGVjaW5nIGxvZ2luCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfdHR5X2F0dHJzKGludCBzcGVlZCkKK3sKKwkvKiBUcnkgdG8gZHJhaW4gb3V0cHV0IGJ1ZmZlciwgd2l0aCA1IHNlYyB0aW1lb3V0LgorCSAqIEFkZGVkIG9uIHJlcXVlc3QgZnJvbSB1c2VycyBvZiB+NjAwIGJhdWQgc2VyaWFsIGludGVyZmFjZQorCSAqIHdpdGggYmlnZ2lzaCBidWZmZXIgb24gYSA5ME1IeiBDUFUuCisJICogVGhleSB3ZXJlIGxvc2luZyBodW5kcmVkcyBvZiBieXRlcyBvZiBidWZmZXJlZCBvdXRwdXQKKwkgKiBvbiB0Y2ZsdXNoLgorCSAqLworCXNpZ25hbF9ub19TQV9SRVNUQVJUX2VtcHR5X21hc2soU0lHQUxSTSwgcmVjb3JkX3NpZ25vKTsKKwlhbGFybSg1KTsKKwl0Y2RyYWluKFNURElOX0ZJTEVOTyk7CisJYWxhcm0oMCk7CisKKwkvKiBGbHVzaCBpbnB1dCBhbmQgb3V0cHV0IHF1ZXVlcywgaW1wb3J0YW50IGZvciBtb2RlbXMhICovCisJdGNmbHVzaChTVERJTl9GSUxFTk8sIFRDSU9GTFVTSCk7CisKKwkvKiBTZXQgc3BlZWQgaWYgaXQgd2Fzbid0IHNwZWNpZmllZCBhcyAiMCIgb24gY29tbWFuZCBsaW5lICovCisJaWYgKHNwZWVkICE9IEIwKQorCQljZnNldHNwZWVkKCZHLnR0eV9hdHRycywgc3BlZWQpOworCisJLyogSW5pdGlhbCBzZXR0aW5nczogOC1iaXQgY2hhcmFjdGVycywgcmF3IG1vZGUsIGJsb2NraW5nIGkvby4KKwkgKiBTcGVjaWFsIGNoYXJhY3RlcnMgYXJlIHNldCBhZnRlciB3ZSBoYXZlIHJlYWQgdGhlIGxvZ2luIG5hbWU7IGFsbAorCSAqIHJlYWRzIHdpbGwgYmUgZG9uZSBpbiByYXcgbW9kZSBhbnl3YXkuCisJICovCisJLyogQ2xlYXIgYWxsIGJpdHMgZXhjZXB0OiAqLworCUcudHR5X2F0dHJzLmNfY2ZsYWcgJj0gKDAKKwkJLyogMiBzdG9wIGJpdHMgKDEgb3RoZXJ3aXNlKQorCQkgKiBFbmFibGUgcGFyaXR5IGJpdCAoYm90aCBvbiBpbnB1dCBhbmQgb3V0cHV0KQorCQkgKiBPZGQgcGFyaXR5IChlbHNlIGV2ZW4pCisJCSAqLworCQl8IENTVE9QQiB8IFBBUkVOQiB8IFBBUk9ERAorI2lmZGVmIENNU1BBUgorCQl8IENNU1BBUiAgLyogbWFyayBvciBzcGFjZSBwYXJpdHkgKi8KKyNlbmRpZgorI2lmZGVmIENCQVVECisJCXwgQ0JBVUQgICAvKiAob3V0cHV0KSBiYXVkIHJhdGUgKi8KKyNlbmRpZgorI2lmZGVmIENCQVVERVgKKwkJfCBDQkFVREVYIC8qIChvdXRwdXQpIGJhdWQgcmF0ZSAqLworI2VuZGlmCisjaWZkZWYgQ0lCQVVECisJCXwgQ0lCQVVEICAgLyogaW5wdXQgYmF1ZCByYXRlICovCisjZW5kaWYKKwkpOworCS8qIFNldDogOCBiaXRzOyBoYW5nIHVwIChkcm9wIERUUikgb24gbGFzdCBjbG9zZTsgZW5hYmxlIHJlY2VpdmUgKi8KKwlHLnR0eV9hdHRycy5jX2NmbGFnIHw9IENTOCB8IEhVUENMIHwgQ1JFQUQ7CisJaWYgKG9wdGlvbl9tYXNrMzIgJiBGX0xPQ0FMKSB7CisJCS8qIGlnbm9yZSBDYXJyaWVyIERldGVjdCBwaW46CisJCSAqIG9wZW5zIGRvbid0IGJsb2NrIHdoZW4gQ0QgaXMgbG93LAorCQkgKiBsb3NpbmcgQ0QgZG9lc24ndCBoYW5nIHVwIHByb2Nlc3NlcyB3aG9zZSBjdHR5IGlzIHRoaXMgdHR5CisJCSAqLworCQlHLnR0eV9hdHRycy5jX2NmbGFnIHw9IENMT0NBTDsKKwl9CisjaWZkZWYgQ1JUU0NUUworCWlmIChvcHRpb25fbWFzazMyICYgRl9SVFNDVFMpCisJCUcudHR5X2F0dHJzLmNfY2ZsYWcgfD0gQ1JUU0NUUzsgLyogZmxvdyBjb250cm9sIHVzaW5nIFJUUy9DVFMgcGlucyAqLworI2VuZGlmCisJRy50dHlfYXR0cnMuY19pZmxhZyA9IDA7CisJRy50dHlfYXR0cnMuY19sZmxhZyA9IDA7CisJLyogbm9uLXJhdyBvdXRwdXQ7IGFkZCBDUiB0byBlYWNoIE5MICovCisJRy50dHlfYXR0cnMuY19vZmxhZyA9IE9QT1NUIHwgT05MQ1I7CisKKwkvKiByZWFkcyB3b3VsZCBibG9jayBvbmx5IGlmIDwgMSBjaGFyIGlzIGF2YWlsYWJsZSAqLworCUcudHR5X2F0dHJzLmNfY2NbVk1JTl0gPSAxOworCS8qIG5vIHRpbWVvdXQgKHJlYWRzIGJsb2NrIGZvcmV2ZXIpICovCisJRy50dHlfYXR0cnMuY19jY1tWVElNRV0gPSAwOworI2lmZGVmIF9fbGludXhfXworCUcudHR5X2F0dHJzLmNfbGluZSA9IDA7CisjZW5kaWYKKworCXNldF90dHlfYXR0cnMoKTsKKworCWRlYnVnKCJ0ZXJtX2lvIDJcbiIpOworfQorCitzdGF0aWMgdm9pZCBmaW5hbGl6ZV90dHlfYXR0cnModm9pZCkKK3sKKwkvKiBzb2Z0d2FyZSBmbG93IGNvbnRyb2wgb24gb3V0cHV0IChzdG9wIHNlbmRpbmcgaWYgWE9GRiBpcyByZWN2ZCk7CisJICogYW5kIG9uIGlucHV0IChzZW5kIFhPRkYgd2hlbiBidWZmZXIgaXMgZnVsbCkKKwkgKi8KKwlHLnR0eV9hdHRycy5jX2lmbGFnIHw9IElYT04gfCBJWE9GRjsKKwlpZiAoRy5lb2wgPT0gJ1xyJykgeworCQlHLnR0eV9hdHRycy5jX2lmbGFnIHw9IElDUk5MOyAvKiBtYXAgQ1Igb24gaW5wdXQgdG8gTkwgKi8KKwl9CisJLyogT3RoZXIgYml0cyBpbiBjX2lmbGFnOgorCSAqIElYQU5ZICAgQW55IHJlY3ZkIGNoYXIgZW5hYmxlcyBvdXRwdXQgKGFueSBjaGFyIGlzIGFsc28gYSBYT04pCisJICogSU5QQ0sgICBFbmFibGUgcGFyaXR5IGNoZWNrCisJICogSUdOUEFSICBJZ25vcmUgcGFyaXR5IGVycm9ycyAoZHJvcCBiYWQgYnl0ZXMpCisJICogUEFSTVJLICBNYXJrIHBhcml0eSBlcnJvcnMgd2l0aCAweGZmLCAweDAwIHByZWZpeAorCSAqICAgICAgICAgKGVsc2UgYmFkIGJ5dGUgaXMgcmVjZWl2ZWQgYXMgMHgwMCkKKwkgKiBJU1RSSVAgIFN0cmlwIHBhcml0eSBiaXQKKwkgKiBJR05CUksgIElnbm9yZSBicmVhayBjb25kaXRpb24KKwkgKiBCUktJTlQgIFNlbmQgU0lHSU5UIG9uIGJyZWFrIC0gbWF5YmUgc2V0IHRoaXM/CisJICogSU5MQ1IgICBNYXAgTkwgdG8gQ1IKKwkgKiBJR05DUiAgIElnbm9yZSBDUgorCSAqIElDUk5MICAgTWFwIENSIHRvIE5MCisJICogSVVDTEMgICBNYXAgdXBwZXJjYXNlIHRvIGxvd2VyY2FzZQorCSAqIElNQVhCRUwgRWNobyBCRUwgb24gaW5wdXQgbGluZSB0b28gbG9uZworCSAqIElVVEY4ICAgQXBwZWFycyB0byBhZmZlY3QgdHR5J3MgaWRlYSBvZiBjaGFyIHdpZHRocywKKwkgKiAgICAgICAgIG9ic2VydmVkIHRvIGltcHJvdmUgYmFja3NwYWNpbmcgdGhyb3VnaCBVbmljb2RlIGNoYXJzCisJICovCisKKwkvKiBJQ0FOT04gIGxpbmUgYnVmZmVyZWQgaW5wdXQgKE5MIG9yIEVPTCBvciBFT0YgY2hhcnMgZW5kIGEgbGluZSk7CisJICogSVNJRyAgICByZWNvZ25pemUgSU5UL1FVSVQvU1VTUCBjaGFyczsKKwkgKiBFQ0hPICAgIGVjaG8gaW5wdXQgY2hhcnM7CisJICogRUNIT0UgICBlY2hvIEJTLVNQLUJTIG9uIGVyYXNlIGNoYXJhY3RlcjsKKwkgKiBFQ0hPSyAgIGVjaG8ga2lsbCBjaGFyIHNwZWNpYWxseSwgbm90IGFzIF5jIChFQ0hPS0UgY29udHJvbHMgaG93IGV4YWN0bHkpOworCSAqIEVDSE9LRSAgZXJhc2UgYWxsIGlucHV0IHZpYSBCUy1TUC1CUyBvbiBraWxsIGNoYXIgKGVsc2UgZ28gdG8gbmV4dCBsaW5lKQorCSAqIEVDSE9DVEwgRWNobyBjdHJsIGNoYXJzIGFzIF5jIChlbHNlIGVjaG8gdmVyYmF0aW06CisJICogICAgICAgICBlLmcuIHVwIGFycm93IGVtaXRzICJFU0Mtc29tZXRoaW5nIiBhbmQgdGh1cyBtb3ZlcyBjdXJzb3IgdXAhKQorCSAqLworCUcudHR5X2F0dHJzLmNfbGZsYWcgfD0gSUNBTk9OIHwgSVNJRyB8IEVDSE8gfCBFQ0hPRSB8IEVDSE9LIHwgRUNIT0tFIHwgRUNIT0NUTDsKKwkvKiBPdGhlciBiaXRzIGluIGNfbGZsYWc6CisJICogWENBU0UgICBNYXAgdXBwZXJjYXNlIHRvIFxsb3dlcmNhc2UgW3RyaWVkLCBkb2Vzbid0IHdvcmtdCisJICogRUNIT05MICBFY2hvIE5MIGV2ZW4gaWYgRUNITyBpcyBub3Qgc2V0CisJICogRUNIT1BSVCBPbiBlcmFzZSwgZWNobyBlcmFzZWQgY2hhcnMKKwkgKiAgICAgICAgIFtxd2U8QlM+PEJTPjxCUz4gaW5wdXQgbG9va3MgbGlrZSAicXdlXGV3cS8iIG9uIHNjcmVlbl0KKwkgKiBOT0ZMU0ggIERvbid0IGZsdXNoIGlucHV0IGJ1ZmZlciBhZnRlciBpbnRlcnJ1cHQgb3IgcXVpdCBjaGFycworCSAqIElFWFRFTiAgRW5hYmxlIGV4dGVuZGVkIGZ1bmN0aW9ucyAoPz8pCisJICogICAgICAgICBbZ2xpYmMgc2F5cyBpdCBlbmFibGVzIGNfY2NbTE5FWFRdICJlbnRlciBsaXRlcmFsIGNoYXIiCisJICogICAgICAgICBhbmQgY19jY1tWRElTQ0FSRF0gInRvZ2dsZSBkaXNjYXJkIGJ1ZmZlcmVkIG91dHB1dCIgY2hhcnNdCisJICogRkxVU0hPICBPdXRwdXQgYmVpbmcgZmx1c2hlZCAoY19jY1tWRElTQ0FSRF0gaXMgaW4gZWZmZWN0KQorCSAqIFBFTkRJTiAgUmV0eXBlIHBlbmRpbmcgaW5wdXQgYXQgbmV4dCByZWFkIG9yIGlucHV0IGNoYXIKKwkgKiAgICAgICAgIChjX2NjW1ZSRVBSSU5UXSBpcyBiZWluZyBwcm9jZXNzZWQpCisJICogVE9TVE9QICBTZW5kIFNJR1RUT1UgZm9yIGJhY2tncm91bmQgb3V0cHV0CisJICogICAgICAgICAod2h5ICJzdHR5IHNhbmUiIHVuc2V0cyB0aGlzIGJpdD8pCisJICovCisKKwlHLnR0eV9hdHRycy5jX2NjW1ZJTlRSXSA9IENUTCgnQycpOworCUcudHR5X2F0dHJzLmNfY2NbVlFVSVRdID0gQ1RMKCdcXCcpOworCUcudHR5X2F0dHJzLmNfY2NbVkVPRl0gPSBDVEwoJ0QnKTsKKwlHLnR0eV9hdHRycy5jX2NjW1ZFT0xdID0gJ1xuJzsKKyNpZmRlZiBWU1dUQworCUcudHR5X2F0dHJzLmNfY2NbVlNXVENdID0gMDsKKyNlbmRpZgorI2lmZGVmIFZTV1RDSAorCUcudHR5X2F0dHJzLmNfY2NbVlNXVENIXSA9IDA7CisjZW5kaWYKKwlHLnR0eV9hdHRycy5jX2NjW1ZLSUxMXSA9IENUTCgnVScpOworCS8qIE90aGVyIGNvbnRyb2wgY2hhcnM6CisJICogVkVPTDIKKwkgKiBWRVJBU0UsIFZXRVJBU0UgLSAod29yZCkgZXJhc2UuIHdlIG1heSBzZXQgVkVSQVNFIGluIGdldF9sb2duYW1lCisJICogVlJFUFJJTlQgLSByZXByaW50IGN1cnJlbnQgaW5wdXQgYnVmZmVyCisJICogVkxORVhULCBWRElTQ0FSRCwgVlNUQVRVUworCSAqIFZTVVNQLCBWRFNVU1AgLSBzZW5kIChkZWxheWVkKSBTSUdUU1RQCisJICogVlNUQVJULCBWU1RPUCAtIGNoYXJzIHVzZWQgZm9yIElYT04vSVhPRkYKKwkgKi8KKworCXNldF90dHlfYXR0cnMoKTsKKworCS8qIE5vdyB0aGUgbmV3bGluZSBjaGFyYWN0ZXIgc2hvdWxkIGJlIHByb3Blcmx5IHdyaXR0ZW4gKi8KKwlmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sICJcbiIsIDEpOworfQorCisvKiBleHRyYWN0IGJhdWQgcmF0ZSBmcm9tIG1vZGVtIHN0YXR1cyBtZXNzYWdlICovCitzdGF0aWMgdm9pZCBhdXRvX2JhdWQodm9pZCkKK3sKKwlpbnQgbnJlYWQ7CisKKwkvKgorCSAqIFRoaXMgd29ya3Mgb25seSBpZiB0aGUgbW9kZW0gcHJvZHVjZXMgaXRzIHN0YXR1cyBjb2RlIEFGVEVSIHJhaXNpbmcKKwkgKiB0aGUgRENEIGxpbmUsIGFuZCBpZiB0aGUgY29tcHV0ZXIgaXMgZmFzdCBlbm91Z2ggdG8gc2V0IHRoZSBwcm9wZXIKKwkgKiBiYXVkIHJhdGUgYmVmb3JlIHRoZSBtZXNzYWdlIGhhcyBnb25lIGJ5LiBXZSBleHBlY3QgYSBtZXNzYWdlIG9mIHRoZQorCSAqIGZvbGxvd2luZyBmb3JtYXQ6CisJICoKKwkgKiA8anVuaz48bnVtYmVyPjxqdW5rPgorCSAqCisJICogVGhlIG51bWJlciBpcyBpbnRlcnByZXRlZCBhcyB0aGUgYmF1ZCByYXRlIG9mIHRoZSBpbmNvbWluZyBjYWxsLiBJZiB0aGUKKwkgKiBtb2RlbSBkb2VzIG5vdCB0ZWxsIHVzIHRoZSBiYXVkIHJhdGUgd2l0aGluIG9uZSBzZWNvbmQsIHdlIHdpbGwga2VlcAorCSAqIHVzaW5nIHRoZSBjdXJyZW50IGJhdWQgcmF0ZS4gSXQgaXMgYWR2aXNhYmxlIHRvIGVuYWJsZSBCUkVBSworCSAqIHByb2Nlc3NpbmcgKGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGJhdWQgcmF0ZXMpIGlmIHRoZSBwcm9jZXNzaW5nIG9mCisJICogbW9kZW0gc3RhdHVzIG1lc3NhZ2VzIGlzIGVuYWJsZWQuCisJICovCisKKwlHLnR0eV9hdHRycy5jX2NjW1ZNSU5dID0gMDsgLyogZG9uJ3QgYmxvY2sgcmVhZHMgKG1pbiByZWFkIGlzIDAgY2hhcnMpICovCisJc2V0X3R0eV9hdHRycygpOworCisJLyoKKwkgKiBXYWl0IGZvciBhIHdoaWxlLCB0aGVuIHJlYWQgZXZlcnl0aGluZyB0aGUgbW9kZW0gaGFzIHNhaWQgc28gZmFyIGFuZAorCSAqIHRyeSB0byBleHRyYWN0IHRoZSBzcGVlZCBvZiB0aGUgZGlhbC1pbiBjYWxsLgorCSAqLworCXNsZWVwKDEpOworCW5yZWFkID0gc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgRy5saW5lX2J1Ziwgc2l6ZW9mKEcubGluZV9idWYpIC0gMSk7CisJaWYgKG5yZWFkID4gMCkgeworCQlpbnQgc3BlZWQ7CisJCWNoYXIgKmJwOworCQlHLmxpbmVfYnVmW25yZWFkXSA9ICdcMCc7CisJCWZvciAoYnAgPSBHLmxpbmVfYnVmOyBicCA8IEcubGluZV9idWYgKyBucmVhZDsgYnArKykgeworCQkJaWYgKGlzZGlnaXQoKmJwKSkgeworCQkJCXNwZWVkID0gYmNvZGUoYnApOworCQkJCWlmIChzcGVlZCA+IDApCisJCQkJCWNmc2V0c3BlZWQoJkcudHR5X2F0dHJzLCBzcGVlZCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvKiBSZXN0b3JlIHRlcm1pbmFsIHNldHRpbmdzICovCisJRy50dHlfYXR0cnMuY19jY1tWTUlOXSA9IDE7IC8qIHJlc3RvcmUgdG8gdmFsdWUgc2V0IGJ5IGluaXRfdHR5X2F0dHJzICovCisJc2V0X3R0eV9hdHRycygpOworfQorCisvKiBnZXQgdXNlciBuYW1lLCBlc3RhYmxpc2ggcGFyaXR5LCBzcGVlZCwgZXJhc2UsIGtpbGwsIGVvbDsKKyAqIHJldHVybiBOVUxMIG9uIEJSRUFLLCBsb2duYW1lIG9uIHN1Y2Nlc3MKKyAqLworc3RhdGljIGNoYXIgKmdldF9sb2duYW1lKHZvaWQpCit7CisJY2hhciAqYnA7CisJY2hhciBjOworCisJLyogRmx1c2ggcGVuZGluZyBpbnB1dCAoZXNwLiBhZnRlciBwYXJzaW5nIG9yIHN3aXRjaGluZyB0aGUgYmF1ZCByYXRlKSAqLworCXVzbGVlcCgxMDAqMTAwMCk7IC8qIDAuMSBzZWMgKi8KKwl0Y2ZsdXNoKFNURElOX0ZJTEVOTywgVENJRkxVU0gpOworCisJLyogUHJvbXB0IGZvciBhbmQgcmVhZCBhIGxvZ2luIG5hbWUgKi8KKwlkbyB7CisJCS8qIFdyaXRlIGlzc3VlIGZpbGUgYW5kIHByb21wdCAqLworI2lmZGVmIElTU1VFCisJCWlmICghKG9wdGlvbl9tYXNrMzIgJiBGX05PSVNTVUUpKQorCQkJcHJpbnRfbG9naW5faXNzdWUoRy5pc3N1ZSwgRy50dHlfbmFtZSk7CisjZW5kaWYKKwkJcHJpbnRfbG9naW5fcHJvbXB0KCk7CisKKwkJLyogUmVhZCBuYW1lLCB3YXRjaCBmb3IgYnJlYWssIGVyYXNlLCBraWxsLCBlbmQtb2YtbGluZSAqLworCQlicCA9IEcubGluZV9idWY7CisJCXdoaWxlICgxKSB7CisJCQkvKiBEbyBub3QgcmVwb3J0IHRyaXZpYWwgRUlOVFIvRUlPIGVycm9ycyAqLworCQkJZXJybm8gPSBFSU5UUjsgLyogbWFrZSByZWFkIG9mIDAgYnl0ZXMgYmUgc2lsZW50IHRvbyAqLworCQkJaWYgKHJlYWQoU1RESU5fRklMRU5PLCAmYywgMSkgPCAxKSB7CisJCQkJZmluYWxpemVfdHR5X2F0dHJzKCk7CisJCQkJaWYgKGVycm5vID09IEVJTlRSIHx8IGVycm5vID09IEVJTykKKwkJCQkJZXhpdChFWElUX1NVQ0NFU1MpOworCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcmVhZF9lcnJvcik7CisJCQl9CisKKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSAnXHInOgorCQkJY2FzZSAnXG4nOgorCQkJCSpicCA9ICdcMCc7CisJCQkJRy5lb2wgPSBjOworCQkJCWdvdG8gZ290X2xvZ25hbWU7CisJCQljYXNlIENUTCgnSCcpOgorCQkJY2FzZSAweDdmOgorCQkJCUcudHR5X2F0dHJzLmNfY2NbVkVSQVNFXSA9IGM7CisJCQkJaWYgKGJwID4gRy5saW5lX2J1ZikgeworCQkJCQlmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sICJcMDEwIFwwMTAiLCAzKTsKKwkJCQkJYnAtLTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIENUTCgnVScpOgorCQkJCXdoaWxlIChicCA+IEcubGluZV9idWYpIHsKKwkJCQkJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCAiXDAxMCBcMDEwIiwgMyk7CisJCQkJCWJwLS07CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBDVEwoJ0MnKToKKwkJCWNhc2UgQ1RMKCdEJyk6CisJCQkJZmluYWxpemVfdHR5X2F0dHJzKCk7CisJCQkJZXhpdChFWElUX1NVQ0NFU1MpOworCQkJY2FzZSAnXDAnOgorCQkJCS8qIEJSRUFLLiBJZiB3ZSBoYXZlIHNwZWVkcyB0byB0cnksCisJCQkJICogcmV0dXJuIE5VTEwgKHdpbGwgc3dpdGNoIHNwZWVkcyBhbmQgcmV0dXJuIGhlcmUpICovCisJCQkJaWYgKEcubnVtc3BlZWQgPiAxKQorCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQkvKiBmYWxsIHRocm91Z2ggYW5kIGlnbm9yZSBpdCAqLworCQkJZGVmYXVsdDoKKwkJCQlpZiAoKHVuc2lnbmVkIGNoYXIpYyA8ICcgJykgeworCQkJCQkvKiBpZ25vcmUgZ2FyYmFnZSBjaGFyYWN0ZXJzICovCisJCQkJfSBlbHNlIGlmICgoaW50KShicCAtIEcubGluZV9idWYpIDwgc2l6ZW9mKEcubGluZV9idWYpIC0gMSkgeworCQkJCQkvKiBlY2hvIGFuZCBzdG9yZSB0aGUgY2hhcmFjdGVyICovCisJCQkJCWZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgJmMsIDEpOworCQkJCQkqYnArKyA9IGM7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9IC8qIGVuZCBvZiBnZXQgY2hhciBsb29wICovCisgZ290X2xvZ25hbWU6IDsKKwl9IHdoaWxlIChHLmxpbmVfYnVmWzBdID09ICdcMCcpOyAgLyogd2hpbGUgbG9nbmFtZSBpcyBlbXB0eSAqLworCisJcmV0dXJuIEcubGluZV9idWY7Cit9CisKK3N0YXRpYyB2b2lkIGFsYXJtX2hhbmRsZXIoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJZmluYWxpemVfdHR5X2F0dHJzKCk7CisJX2V4aXQoRVhJVF9TVUNDRVNTKTsKK30KKworc3RhdGljIHZvaWQgc2xlZXAxMCh2b2lkKQoreworCXNsZWVwKDEwKTsKK30KKworaW50IGdldHR5X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBnZXR0eV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IG47CisJcGlkX3QgcGlkLCB0c2lkOworCWNoYXIgKmxvZ25hbWU7CisKKwlJTklUX0coKTsKKwlHLmxvZ2luID0gX1BBVEhfTE9HSU47ICAgIC8qIGRlZmF1bHQgbG9naW4gcHJvZ3JhbSAqLworI2lmZGVmIElTU1VFCisJRy5pc3N1ZSA9IElTU1VFOyAgICAgICAgICAvKiBkZWZhdWx0IGlzc3VlIGZpbGUgKi8KKyNlbmRpZgorCUcuZW9sID0gJ1xyJzsKKworCS8qIFBhcnNlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgKi8KKwlwYXJzZV9hcmdzKGFyZ3YpOworCisJLyogQ3JlYXRlIG5ldyBzZXNzaW9uIGFuZCBwZ3JwLCBsb3NlIGNvbnRyb2xsaW5nIHR0eSAqLworCXBpZCA9IHNldHNpZCgpOyAgLyogdGhpcyBhbHNvIGdpdmVzIHVzIG91ciBwaWQgOikgKi8KKwlpZiAocGlkIDwgMCkgeworCQlpbnQgZmQ7CisJCS8qIDooCisJCSAqIGRvY3MvY3R0eS5odG0gc2F5czoKKwkJICogIlRoaXMgaXMgYWxsb3dlZCBvbmx5IHdoZW4gdGhlIGN1cnJlbnQgcHJvY2VzcworCQkgKiAgaXMgbm90IGEgcHJvY2VzcyBncm91cCBsZWFkZXIiLgorCQkgKiBUaHVzLCBzZXRzaWQoKSB3aWxsIGZhaWwgaWYgd2UgX2FscmVhZHlfIGFyZQorCQkgKiBhIHNlc3Npb24gbGVhZGVyIC0gd2hpY2ggaXMgcXVpdGUgcG9zc2libGUgZm9yIGdldHR5IQorCQkgKi8KKwkJcGlkID0gZ2V0cGlkKCk7CisJCWlmIChnZXRzaWQoMCkgIT0gcGlkKSB7CisJCQkvL2ZvciBkZWJ1Z2dpbmc6CisJCQkvL2JiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0c2lkIGZhaWxlZDoiCisJCQkvLwkiIHBpZCAlZCBwcGlkICVkIgorCQkJLy8JIiBzaWQgJWQgcGdpZCAlZCIsCisJCQkvLwlwaWQsIGdldHBwaWQoKSwKKwkJCS8vCWdldHNpZCgwKSwgZ2V0cGdpZCgwKSk7CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNldHNpZCIpOworCQkJLyoKKwkJCSAqIFdoZW4gd2UgY2FuIGVuZCB1cCBoZXJlPworCQkJICogRXhhbXBsZTogc2V0c2lkKCkgZmFpbHMgd2hlbiBydW4gYWxvbmUgaW4gaW50ZXJhY3RpdmUgc2hlbGw6CisJCQkgKiAgIyBnZXR0eSAxMTUyMDAgL2Rldi90dHkyCisJCQkgKiBiZWNhdXNlIHNoZWxsJ3MgY2hpbGQgKGdldHR5KSBpcyBwdXQgaW4gYSBuZXcgcHJvY2VzcyBncm91cC4KKwkJCSAqIEJ1dCBkb2Vzbid0IGZhaWwgaWYgc2hlbGwgaXMgbm90IGludGVyYWN0aXZlCisJCQkgKiAoYW5kIHRoZXJlZm9yZSBkb2Vzbid0IGNyZWF0ZSBwcm9jZXNzIGdyb3VwcyBmb3IgcGlwZXMpLAorCQkJICogb3IgaWYgZ2V0dHkgaXMgbm90IHRoZSBmaXJzdCBwcm9jZXNzIGluIHRoZSBwcm9jZXNzIGdyb3VwOgorCQkJICogICMgdHJ1ZSB8IGdldHR5IDExNTIwMCAvZGV2L3R0eTIKKwkJCSAqLworCQl9CisJCS8qIExvb2tzIGxpa2Ugd2UgYXJlIGFscmVhZHkgYSBzZXNzaW9uIGxlYWRlci4KKwkJICogSW4gdGhpcyBjYXNlIChzZXRzaWQgZmFpbGVkKSB3ZSBtYXkgc3RpbGwgaGF2ZSBjdHR5LAorCQkgKiBhbmQgaXQgbWF5IGJlIGRpZmZlcmVudCBmcm9tIHR0eSB3ZSBuZWVkIHRvIGNvbnRyb2whCisJCSAqIElmIHdlIHN0aWxsIGhhdmUgY3R0eSwgb24gTGludXggaW9jdGwoVElPQ1NDVFRZKQorCQkgKiAod2hpY2ggd2UgYXJlIGdvaW5nIHRvIHVzZSBhIGJpdCBsYXRlcikgYWx3YXlzIGZhaWxzIC0KKwkJICogZXZlbiBpZiB3ZSB0cnkgdG8gdGFrZSBjdHR5IHdoaWNoIGlzIGFscmVhZHkgb3VycyEKKwkJICogVHJ5IHRvIGRyb3Agb2xkIGN0dHkgbm93IHRvIHByZXZlbnQgdGhhdC4KKwkJICogVXNlIE9fTk9OQkxPQ0s6IG9sZCBjdHR5IG1heSBiZSBhIHNlcmlhbCBsaW5lLgorCQkgKi8KKwkJZmQgPSBvcGVuKCIvZGV2L3R0eSIsIE9fUkRXUiB8IE9fTk9OQkxPQ0spOworCQlpZiAoZmQgPj0gMCkgeworCQkJLyogVElPQ05PVFRZIHNlbmRzIFNJR0hVUCB0byB0aGUgZm9yZWdyb3VuZAorCQkJICogcHJvY2VzcyBncm91cCAtIHdoaWNoIG1heSBpbmNsdWRlIHVzIQorCQkJICogTWFrZSBzdXJlIHRvIG5vdCBkaWUgb24gaXQ6CisJCQkgKi8KKwkJCXNpZ2hhbmRsZXJfdCBvbGQgPSBzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKKwkJCWlvY3RsKGZkLCBUSU9DTk9UVFkpOworCQkJY2xvc2UoZmQpOworCQkJc2lnbmFsKFNJR0hVUCwgb2xkKTsKKwkJfQorCX0KKworCS8qIENsb3NlIHN0ZGlvLCBhbmQgc3RyYXkgZGVzY3JpcHRvcnMsIGp1c3QgaW4gY2FzZSAqLworCW4gPSB4b3BlbihiYl9kZXZfbnVsbCwgT19SRFdSKTsKKwkvKiBkdXAyKG4sIDApOyAtIG5vLCB3ZSBuZWVkIHRvIGhhbmRsZSAiZ2V0dHkgLSA5NjAwIiB0b28gKi8KKwl4ZHVwMihuLCAxKTsKKwl4ZHVwMihuLCAyKTsKKwl3aGlsZSAobiA+IDIpCisJCWNsb3NlKG4tLSk7CisKKwkvKiBMb2dnaW5nLiBXZSB3YW50IHNwZWNpYWwgZmxhdm9yIG9mIGVycm9yX21zZ19hbmRfZGllICovCisJZGllX2Z1bmMgPSBzbGVlcDEwOworCW1zZ19lb2wgPSAiXHJcbiI7CisJLyogbW9zdCBsaWtlbHkgd2lsbCBpbnRlcm5hbGx5IHVzZSBmZCAjMyBpbiBDTE9FWEVDIG1vZGU6ICovCisJb3BlbmxvZyhhcHBsZXRfbmFtZSwgTE9HX1BJRCwgTE9HX0FVVEgpOworCWxvZ21vZGUgPSBMT0dNT0RFX0JPVEg7CisKKyNpZmRlZiBERUJVR0dJTkcKKwlkYmYgPSB4Zm9wZW5fZm9yX3dyaXRlKERFQlVHVEVSTSk7CisJZm9yIChuID0gMTsgYXJndltuXTsgbisrKSB7CisJCWRlYnVnKGFyZ3Zbbl0pOworCQlkZWJ1ZygiXG4iKTsKKwl9CisjZW5kaWYKKworCS8qIE9wZW4gdGhlIHR0eSBhcyBzdGFuZGFyZCBpbnB1dCwgaWYgaXQgaXMgbm90ICItIiAqLworCWRlYnVnKCJjYWxsaW5nIG9wZW5fdHR5XG4iKTsKKwlvcGVuX3R0eSgpOworCW5kZWxheV9vZmYoU1RESU5fRklMRU5PKTsKKwlkZWJ1ZygiZHVwaW5nXG4iKTsKKwl4ZHVwMihTVERJTl9GSUxFTk8sIDEpOworCXhkdXAyKFNURElOX0ZJTEVOTywgMik7CisKKwkvKiBTdGVhbCBjdHR5IGlmIHdlIGRvbid0IGhhdmUgaXQgeWV0ICovCisJdHNpZCA9IHRjZ2V0c2lkKFNURElOX0ZJTEVOTyk7CisJaWYgKHRzaWQgPCAwIHx8IHBpZCAhPSB0c2lkKSB7CisJCWlmIChpb2N0bChTVERJTl9GSUxFTk8sIFRJT0NTQ1RUWSwgLypmb3JjZToqLyAobG9uZykxKSA8IDApCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIlRJT0NTQ1RUWSIpOworCX0KKworI2lmZGVmIF9fbGludXhfXworCS8qIE1ha2Ugb3Vyc2VsZiBhIGZvcmVncm91bmQgcHJvY2VzcyBncm91cCB3aXRoaW4gb3VyIHNlc3Npb24gKi8KKwlpZiAodGNzZXRwZ3JwKFNURElOX0ZJTEVOTywgcGlkKSA8IDApCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgidGNzZXRwZ3JwIik7CisjZW5kaWYKKworCS8qCisJICogVGhlIGZvbGxvd2luZyBpb2N0bCB3aWxsIGZhaWwgaWYgc3RkaW4gaXMgbm90IGEgdHR5LCBidXQgYWxzbyB3aGVuCisJICogdGhlcmUgaXMgbm9pc2Ugb24gdGhlIG1vZGVtIGNvbnRyb2wgbGluZXMuIEluIHRoZSBsYXR0ZXIgY2FzZSwgdGhlCisJICogY29tbW9uIGNvdXJzZSBvZiBhY3Rpb24gaXMgKDEpIGZpeCB5b3VyIGNhYmxlcyAoMikgZ2l2ZSB0aGUgbW9kZW0gbW9yZQorCSAqIHRpbWUgdG8gcHJvcGVybHkgcmVzZXQgYWZ0ZXIgaGFuZ2luZyB1cC4gU3VuT1MgdXNlcnMgY2FuIGFjaGlldmUgKDIpCisJICogYnkgcGF0Y2hpbmcgdGhlIFN1bk9TIGtlcm5lbCB2YXJpYWJsZSAienNhZHRybG93IiB0byBhIGxhcmdlciB2YWx1ZTsKKwkgKiA1IHNlY29uZHMgc2VlbXMgdG8gYmUgYSBnb29kIHZhbHVlLgorCSAqLworCWlmICh0Y2dldGF0dHIoU1RESU5fRklMRU5PLCAmRy50dHlfYXR0cnMpIDwgMCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJ0Y2dldGF0dHIiKTsKKworCS8qIFVwZGF0ZSB0aGUgdXRtcCBmaWxlLiBUaGlzIHR0eSBpcyBvdXJzIG5vdyEgKi8KKwl1cGRhdGVfdXRtcChwaWQsIExPR0lOX1BST0NFU1MsIEcudHR5X25hbWUsICJMT0dJTiIsIEcuZmFrZWhvc3QpOworCisJLyogSW5pdGlhbGl6ZSB0dHkgYXR0cnMgKHJhdyBtb2RlLCBlaWdodC1iaXQsIGJsb2NraW5nIGkvbykgKi8KKwlkZWJ1ZygiY2FsbGluZyBpbml0X3R0eV9hdHRyc1xuIik7CisJaW5pdF90dHlfYXR0cnMoRy5zcGVlZHNbMF0pOworCisJLyogV3JpdGUgdGhlIG1vZGVtIGluaXQgc3RyaW5nIGFuZCBET04nVCBmbHVzaCB0aGUgYnVmZmVycyAqLworCWlmIChvcHRpb25fbWFzazMyICYgRl9JTklUU1RSSU5HKSB7CisJCWRlYnVnKCJ3cml0aW5nIGluaXQgc3RyaW5nXG4iKTsKKwkJZnVsbF93cml0ZTFfc3RyKEcuaW5pdHN0cmluZyk7CisJfQorCisJLyogT3B0aW9uYWxseSBkZXRlY3QgdGhlIGJhdWQgcmF0ZSBmcm9tIHRoZSBtb2RlbSBzdGF0dXMgbWVzc2FnZSAqLworCWRlYnVnKCJiZWZvcmUgYXV0b2JhdWRcbiIpOworCWlmIChvcHRpb25fbWFzazMyICYgRl9QQVJTRSkKKwkJYXV0b19iYXVkKCk7CisKKwkvKiBTZXQgdGhlIG9wdGlvbmFsIHRpbWVyICovCisJc2lnbmFsKFNJR0FMUk0sIGFsYXJtX2hhbmRsZXIpOworCWFsYXJtKEcudGltZW91dCk7IC8qIGlmIDAsIGFsYXJtIGlzIG5vdCBzZXQgKi8KKworCS8qIE9wdGlvbmFsbHkgd2FpdCBmb3IgQ1Igb3IgTEYgYmVmb3JlIHdyaXRpbmcgL2V0Yy9pc3N1ZSAqLworCWlmIChvcHRpb25fbWFzazMyICYgRl9XQUlUQ1JMRikgeworCQljaGFyIGNoOworCQlkZWJ1Zygid2FpdGluZyBmb3IgY3ItbGZcbiIpOworCQl3aGlsZSAoc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgJmNoLCAxKSA9PSAxKSB7CisJCQlkZWJ1ZygicmVhZCAleFxuIiwgKHVuc2lnbmVkIGNoYXIpY2gpOworCQkJaWYgKGNoID09ICdcbicgfHwgY2ggPT0gJ1xyJykKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWxvZ25hbWUgPSBOVUxMOworCWlmICghKG9wdGlvbl9tYXNrMzIgJiBGX05PUFJPTVBUKSkgeworCQkvKiBOQjogaW5pdF90dHlfYXR0cnMgYWxyZWFkeSBzZXQgbGluZSBzcGVlZAorCQkgKiB0byBHLnNwZWVkc1swXSAqLworCQlpbnQgYmF1ZF9pbmRleCA9IDA7CisKKwkJd2hpbGUgKDEpIHsKKwkJCS8qIFJlYWQgdGhlIGxvZ2luIG5hbWUgKi8KKwkJCWRlYnVnKCJyZWFkaW5nIGxvZ2luIG5hbWVcbiIpOworCQkJbG9nbmFtZSA9IGdldF9sb2duYW1lKCk7CisJCQlpZiAobG9nbmFtZSkKKwkJCQlicmVhazsKKwkJCS8qIFdlIGFyZSBoZXJlIG9ubHkgaWYgRy5udW1zcGVlZCA+IDEgKi8KKwkJCWJhdWRfaW5kZXggPSAoYmF1ZF9pbmRleCArIDEpICUgRy5udW1zcGVlZDsKKwkJCWNmc2V0c3BlZWQoJkcudHR5X2F0dHJzLCBHLnNwZWVkc1tiYXVkX2luZGV4XSk7CisJCQlzZXRfdHR5X2F0dHJzKCk7CisJCX0KKwl9CisKKwkvKiBEaXNhYmxlIHRpbWVyICovCisJYWxhcm0oMCk7CisKKwlmaW5hbGl6ZV90dHlfYXR0cnMoKTsKKworCS8qIExldCB0aGUgbG9naW4gcHJvZ3JhbSB0YWtlIGNhcmUgb2YgcGFzc3dvcmQgdmFsaWRhdGlvbiAqLworCS8qIFdlIHVzZSBQQVRIIGJlY2F1c2Ugd2UgdHJ1c3QgdGhhdCByb290IGRvZXNuJ3Qgc2V0ICJiYWQiIFBBVEgsCisJICogYW5kIGdldHR5IGlzIG5vdCBzdWlkLXJvb3QgYXBwbGV0ICovCisJLyogV2l0aCAtbiwgbG9nbmFtZSA9PSBOVUxMLCBhbmQgbG9naW4gd2lsbCBhc2sgZm9yIHVzZXJuYW1lIGluc3RlYWQgKi8KKwlCQl9FWEVDTFAoRy5sb2dpbiwgRy5sb2dpbiwgIi0tIiwgbG9nbmFtZSwgKGNoYXIgKikwKTsKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZXhlY3V0ZSAnJXMnIiwgRy5sb2dpbik7Cit9CmRpZmYgLS1naXQgYS9sb2dpbnV0aWxzL2xvZ2luLmMgYi9sb2dpbnV0aWxzL2xvZ2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwMGNmYwotLS0gL2Rldi9udWxsCisrKyBiL2xvZ2ludXRpbHMvbG9naW4uYwpAQCAtMCwwICsxLDUzMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbG9naW5fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstcF0gWy1oIEhPU1RdIFtbLWZdIFVTRVJdIgorLy91c2FnZTojZGVmaW5lIGxvZ2luX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQmVnaW4gYSBuZXcgc2Vzc2lvbiBvbiB0aGUgc3lzdGVtXG4iCisvL3VzYWdlOiAgICAgIlxuCS1mCURvbid0IGF1dGhlbnRpY2F0ZSAodXNlciBhbHJlYWR5IGF1dGhlbnRpY2F0ZWQpIgorLy91c2FnZTogICAgICJcbgktaAlOYW1lIG9mIHRoZSByZW1vdGUgaG9zdCIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJUHJlc2VydmUgZW52aXJvbm1lbnQiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorCisjaWYgRU5BQkxFX1NFTElOVVgKKyMgaW5jbHVkZSA8c2VsaW51eC9zZWxpbnV4Lmg+ICAvKiBmb3IgaXNfc2VsaW51eF9lbmFibGVkKCkgICovCisjIGluY2x1ZGUgPHNlbGludXgvZ2V0X2NvbnRleHRfbGlzdC5oPiAvKiBmb3IgZ2V0X2RlZmF1bHRfY29udGV4dCgpICovCisjIGluY2x1ZGUgPHNlbGludXgvZmxhc2suaD4gLyogZm9yIHNlY3VyaXR5IGNsYXNzIGRlZmluaXRpb25zICAqLworI2VuZGlmCisKKyNpZiBFTkFCTEVfUEFNCisvKiBQQU0gbWF5IGluY2x1ZGUgPGxvY2FsZS5oPi4gV2UgbWF5IG5lZWQgdG8gdW5kZWZpbmUgYmJveCdzIHN0dWIgZGVmaW5lOiAqLworIyB1bmRlZiBzZXRsb2NhbGUKKy8qIEZvciBzb21lIG9ic2N1cmUgcmVhc29uLCBQQU0gaXMgbm90IGluIHBhbS94eHgsIGJ1dCBpbiBzZWN1cml0eS94eHguCisgKiBBcHBhcmVudGx5IHRoZXkgbGlrZSB0byBjb25mdXNlIHBlb3BsZS4gKi8KKyMgaW5jbHVkZSA8c2VjdXJpdHkvcGFtX2FwcGwuaD4KKyMgaW5jbHVkZSA8c2VjdXJpdHkvcGFtX21pc2MuaD4KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcGFtX2NvbnYgY29udiA9IHsKKwltaXNjX2NvbnYsCisJTlVMTAorfTsKKyNlbmRpZgorCitlbnVtIHsKKwlUSU1FT1VUID0gNjAsCisJRU1QVFlfVVNFUk5BTUVfQ09VTlQgPSAxMCwKKwkvKiBTb21lIHVzZXJzIGZvdW5kIDMyIGNoYXJzIGxpbWl0IHRvIGJlIHRvbyBsb3c6ICovCisJVVNFUk5BTUVfU0laRSA9IDY0LAorCVRUWU5BTUVfU0laRSA9IDMyLAorfTsKKworc3RydWN0IGdsb2JhbHMgeworCXN0cnVjdCB0ZXJtaW9zIHR0eV9hdHRyczsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgfSB3aGlsZSAoMCkKKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfTk9MT0dJTgorc3RhdGljIHZvaWQgZGllX2lmX25vbG9naW4odm9pZCkKK3sKKwlGSUxFICpmcDsKKwlpbnQgYzsKKwlpbnQgZW1wdHkgPSAxOworCisJZnAgPSBmb3Blbl9mb3JfcmVhZCgiL2V0Yy9ub2xvZ2luIik7CisJaWYgKCFmcCkgLyogYXNzdW1pbmcgaXQgZG9lcyBub3QgZXhpc3QgKi8KKwkJcmV0dXJuOworCisJd2hpbGUgKChjID0gZ2V0YyhmcCkpICE9IEVPRikgeworCQlpZiAoYyA9PSAnXG4nKQorCQkJYmJfcHV0Y2hhcignXHInKTsKKwkJYmJfcHV0Y2hhcihjKTsKKwkJZW1wdHkgPSAwOworCX0KKwlpZiAoZW1wdHkpCisJCXB1dHMoIlxyXG5TeXN0ZW0gY2xvc2VkIGZvciByb3V0aW5lIG1haW50ZW5hbmNlXHIiKTsKKworCWZjbG9zZShmcCk7CisJZmZsdXNoX2FsbCgpOworCS8qIFVzZXJzIHNheSB0aGF0IHRoZXkgZG8gbmVlZCB0aGlzIHByaW9yIHRvIGV4aXQ6ICovCisJdGNkcmFpbihTVERPVVRfRklMRU5PKTsKKwlleGl0KEVYSVRfRkFJTFVSRSk7Cit9CisjZWxzZQorIyBkZWZpbmUgZGllX2lmX25vbG9naW4oKSAoKHZvaWQpMCkKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0VDVVJFVFRZICYmICFFTkFCTEVfUEFNCitzdGF0aWMgaW50IGNoZWNrX3NlY3VyZXR0eShjb25zdCBjaGFyICpzaG9ydF90dHkpCit7CisJY2hhciAqYnVmID0gKGNoYXIqKSIvZXRjL3NlY3VyZXR0eSI7IC8qIGFueSBub24tTlVMTCBpcyBvayAqLworCXBhcnNlcl90ICpwYXJzZXIgPSBjb25maWdfb3BlbjIoIi9ldGMvc2VjdXJldHR5IiwgZm9wZW5fZm9yX3JlYWQpOworCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsICZidWYsIDEsIDEsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQlpZiAoc3RyY21wKGJ1Ziwgc2hvcnRfdHR5KSA9PSAwKQorCQkJYnJlYWs7CisJCWJ1ZiA9IE5VTEw7CisJfQorCWNvbmZpZ19jbG9zZShwYXJzZXIpOworCS8qIGJ1ZiAhPSBOVUxMIGhlcmUgaWYgY29uZmlnIGZpbGUgd2FzIG5vdCBmb3VuZCwgZW1wdHkKKwkgKiBvciBsaW5lIHdhcyBmb3VuZCB3aGljaCBlcXVhbHMgc2hvcnRfdHR5ICovCisJcmV0dXJuIGJ1ZiAhPSBOVUxMOworfQorI2Vsc2UKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIGludCBjaGVja19zZWN1cmV0dHkoY29uc3QgY2hhciAqc2hvcnRfdHR5IFVOVVNFRF9QQVJBTSkgeyByZXR1cm4gMTsgfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfU0VMSU5VWAorc3RhdGljIHZvaWQgaW5pdHNlbGludXgoY2hhciAqdXNlcm5hbWUsIGNoYXIgKmZ1bGxfdHR5LAorCQkJCQkJc2VjdXJpdHlfY29udGV4dF90ICp1c2VyX3NpZCkKK3sKKwlzZWN1cml0eV9jb250ZXh0X3Qgb2xkX3R0eV9zaWQsIG5ld190dHlfc2lkOworCisJaWYgKCFpc19zZWxpbnV4X2VuYWJsZWQoKSkKKwkJcmV0dXJuOworCisJaWYgKGdldF9kZWZhdWx0X2NvbnRleHQodXNlcm5hbWUsIE5VTEwsIHVzZXJfc2lkKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZ2V0IFNJRCBmb3IgJXMiLCB1c2VybmFtZSk7CisJfQorCWlmIChnZXRmaWxlY29uKGZ1bGxfdHR5LCAmb2xkX3R0eV9zaWQpIDwgMCkgeworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImdldGZpbGVjb24oJXMpIGZhaWxlZCIsIGZ1bGxfdHR5KTsKKwl9CisJaWYgKHNlY3VyaXR5X2NvbXB1dGVfcmVsYWJlbCgqdXNlcl9zaWQsIG9sZF90dHlfc2lkLAorCQkJCVNFQ0NMQVNTX0NIUl9GSUxFLCAmbmV3X3R0eV9zaWQpICE9IDApIHsKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZWN1cml0eV9jaGFuZ2Vfc2lkKCVzKSBmYWlsZWQiLCBmdWxsX3R0eSk7CisJfQorCWlmIChzZXRmaWxlY29uKGZ1bGxfdHR5LCBuZXdfdHR5X3NpZCkgIT0gMCkgeworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNoc2lkKCVzLCAlcykgZmFpbGVkIiwgZnVsbF90dHksIG5ld190dHlfc2lkKTsKKwl9Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9MT0dJTl9TQ1JJUFRTCitzdGF0aWMgdm9pZCBydW5fbG9naW5fc2NyaXB0KHN0cnVjdCBwYXNzd2QgKnB3LCBjaGFyICpmdWxsX3R0eSkKK3sKKwljaGFyICp0X2FyZ3ZbMl07CisKKwl0X2FyZ3ZbMF0gPSBnZXRlbnYoIkxPR0lOX1BSRV9TVUlEX1NDUklQVCIpOworCWlmICh0X2FyZ3ZbMF0pIHsKKwkJdF9hcmd2WzFdID0gTlVMTDsKKwkJeHNldGVudigiTE9HSU5fVFRZIiwgZnVsbF90dHkpOworCQl4c2V0ZW52KCJMT0dJTl9VU0VSIiwgcHctPnB3X25hbWUpOworCQl4c2V0ZW52KCJMT0dJTl9VSUQiLCB1dG9hKHB3LT5wd191aWQpKTsKKwkJeHNldGVudigiTE9HSU5fR0lEIiwgdXRvYShwdy0+cHdfZ2lkKSk7CisJCXhzZXRlbnYoIkxPR0lOX1NIRUxMIiwgcHctPnB3X3NoZWxsKTsKKwkJc3Bhd25fYW5kX3dhaXQodF9hcmd2KTsgLyogTk9NTVUtZnJpZW5kbHkgKi8KKwkJdW5zZXRlbnYoIkxPR0lOX1RUWSIpOworCQl1bnNldGVudigiTE9HSU5fVVNFUiIpOworCQl1bnNldGVudigiTE9HSU5fVUlEIik7CisJCXVuc2V0ZW52KCJMT0dJTl9HSUQiKTsKKwkJdW5zZXRlbnYoIkxPR0lOX1NIRUxMIik7CisJfQorfQorI2Vsc2UKK3ZvaWQgcnVuX2xvZ2luX3NjcmlwdChzdHJ1Y3QgcGFzc3dkICpwdywgY2hhciAqZnVsbF90dHkpOworI2VuZGlmCisKKyNpZiBFTkFCTEVfTE9HSU5fU0VTU0lPTl9BU19DSElMRCAmJiBFTkFCTEVfUEFNCitzdGF0aWMgdm9pZCBsb2dpbl9wYW1fZW5kKHBhbV9oYW5kbGVfdCAqcGFtaCkKK3sKKwlpbnQgcGFtcmV0OworCisJcGFtcmV0ID0gcGFtX3NldGNyZWQocGFtaCwgUEFNX0RFTEVURV9DUkVEKTsKKwlpZiAocGFtcmV0ICE9IFBBTV9TVUNDRVNTKSB7CisJCWJiX2Vycm9yX21zZygicGFtXyVzIGZhaWxlZDogJXMgKCVkKSIsICJzZXRjcmVkIiwKKwkJCXBhbV9zdHJlcnJvcihwYW1oLCBwYW1yZXQpLCBwYW1yZXQpOworCX0KKwlwYW1yZXQgPSBwYW1fY2xvc2Vfc2Vzc2lvbihwYW1oLCAwKTsKKwlpZiAocGFtcmV0ICE9IFBBTV9TVUNDRVNTKSB7CisJCWJiX2Vycm9yX21zZygicGFtXyVzIGZhaWxlZDogJXMgKCVkKSIsICJjbG9zZV9zZXNzaW9uIiwKKwkJCXBhbV9zdHJlcnJvcihwYW1oLCBwYW1yZXQpLCBwYW1yZXQpOworCX0KKwlwYW1yZXQgPSBwYW1fZW5kKHBhbWgsIHBhbXJldCk7CisJaWYgKHBhbXJldCAhPSBQQU1fU1VDQ0VTUykgeworCQliYl9lcnJvcl9tc2coInBhbV8lcyBmYWlsZWQ6ICVzICglZCkiLCAiZW5kIiwKKwkJCXBhbV9zdHJlcnJvcihwYW1oLCBwYW1yZXQpLCBwYW1yZXQpOworCX0KK30KKyNlbmRpZiAvKiBFTkFCTEVfUEFNICovCisKK3N0YXRpYyB2b2lkIGdldF91c2VybmFtZV9vcl9kaWUoY2hhciAqYnVmLCBpbnQgc2l6ZV9idWYpCit7CisJaW50IGMsIGNudGRvd247CisKKwljbnRkb3duID0gRU1QVFlfVVNFUk5BTUVfQ09VTlQ7CisgcHJvbXB0OgorCXByaW50X2xvZ2luX3Byb21wdCgpOworCS8qIHNraXAgd2hpdGVzcGFjZSAqLworCWRvIHsKKwkJYyA9IGdldGNoYXIoKTsKKwkJaWYgKGMgPT0gRU9GKQorCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQlpZiAoYyA9PSAnXG4nKSB7CisJCQlpZiAoIS0tY250ZG93bikKKwkJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJCQlnb3RvIHByb21wdDsKKwkJfQorCX0gd2hpbGUgKGlzc3BhY2UoYykpOyAvKiBtYXliZSBpc2JsYW5rPyAqLworCisJKmJ1ZisrID0gYzsKKwlpZiAoIWZnZXRzKGJ1Ziwgc2l6ZV9idWYtMiwgc3RkaW4pKQorCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJaWYgKCFzdHJjaHIoYnVmLCAnXG4nKSkKKwkJZXhpdChFWElUX0ZBSUxVUkUpOworCXdoaWxlICgodW5zaWduZWQgY2hhcikqYnVmID4gJyAnKQorCQlidWYrKzsKKwkqYnVmID0gJ1wwJzsKK30KKworc3RhdGljIHZvaWQgbW90ZCh2b2lkKQoreworCWludCBmZDsKKworCWZkID0gb3BlbihiYl9wYXRoX21vdGRfZmlsZSwgT19SRE9OTFkpOworCWlmIChmZCA+PSAwKSB7CisJCWZmbHVzaF9hbGwoKTsKKwkJYmJfY29weWZkX2VvZihmZCwgU1RET1VUX0ZJTEVOTyk7CisJCWNsb3NlKGZkKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGFsYXJtX2hhbmRsZXIoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJLyogVGhpcyBpcyB0aGUgZXNjYXBlIGhhdGNoISBQb29yIHNlcmlhbCBsaW5lIHVzZXJzIGFuZCB0aGUgbGlrZQorCSAqIGFycml2ZSBoZXJlIHdoZW4gdGhlaXIgY29ubmVjdGlvbiBpcyBicm9rZW4uCisJICogV2UgZG9uJ3Qgd2FudCB0byBibG9jayBoZXJlICovCisJbmRlbGF5X29uKFNURE9VVF9GSUxFTk8pOworCS8qIFRlc3QgZm9yIGNvcnJlY3QgYXR0ciByZXN0b3Jpbmc6CisJICogcnVuICJnZXR0eSAwIC0iIGZyb20gYSBzaGVsbCwgZW50ZXIgYm9ndXMgdXNlcm5hbWUsIHN0b3AgYXQKKwkgKiBwYXNzd29yZCBwcm9tcHQsIGxldCBpdCB0aW1lIG91dC4gV2l0aG91dCB0aGUgdGNzZXRhdHRyIGJlbG93LAorCSAqIHdoZW4geW91IGFyZSBiYWNrIGF0IHNoZWxsIHByb21wdCwgZWNobyB3aWxsIGJlIHN0aWxsIG9mZi4KKwkgKi8KKwl0Y3NldGF0dHJfc3RkaW5fVENTQU5PVygmRy50dHlfYXR0cnMpOworCXByaW50ZigiXHJcbkxvZ2luIHRpbWVkIG91dCBhZnRlciAldSBzZWNvbmRzXHJcbiIsIFRJTUVPVVQpOworCWZmbHVzaF9hbGwoKTsKKwkvKiB1bml4IEFQSSBpcyBicmFpbiBkYW1hZ2VkIHJlZ2FyZGluZyBPX05PTkJMT0NLLAorCSAqIHdlIHNob3VsZCB1bmRvIGl0LCBvciBlbHNlIHdlIGNhbiBhZmZlY3Qgb3RoZXIgcHJvY2Vzc2VzICovCisJbmRlbGF5X29mZihTVERPVVRfRklMRU5PKTsKKwlfZXhpdChFWElUX1NVQ0NFU1MpOworfQorCitpbnQgbG9naW5fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGxvZ2luX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwllbnVtIHsKKwkJTE9HSU5fT1BUX2YgPSAoMTw8MCksCisJCUxPR0lOX09QVF9oID0gKDE8PDEpLAorCQlMT0dJTl9PUFRfcCA9ICgxPDwyKSwKKwl9OworCWNoYXIgKmZyb21ob3N0OworCWNoYXIgdXNlcm5hbWVbVVNFUk5BTUVfU0laRV07CisJaW50IHJ1bl9ieV9yb290OworCXVuc2lnbmVkIG9wdDsKKwlpbnQgY291bnQgPSAwOworCXN0cnVjdCBwYXNzd2QgKnB3OworCWNoYXIgKm9wdF9ob3N0ID0gTlVMTDsKKwljaGFyICpvcHRfdXNlciA9IG9wdF91c2VyOyAvKiBmb3IgY29tcGlsZXIgKi8KKwljaGFyICpmdWxsX3R0eTsKKwljaGFyICpzaG9ydF90dHk7CisJSUZfU0VMSU5VWChzZWN1cml0eV9jb250ZXh0X3QgdXNlcl9zaWQgPSBOVUxMOykKKyNpZiBFTkFCTEVfUEFNCisJaW50IHBhbXJldDsKKwlwYW1faGFuZGxlX3QgKnBhbWg7CisJY29uc3QgY2hhciAqcGFtdXNlcjsKKwljb25zdCBjaGFyICpmYWlsZWRfbXNnOworCXN0cnVjdCBwYXNzd2QgcHdkc3RydWN0OworCWNoYXIgcHdkYnVmWzI1Nl07CisJY2hhciAqKnBhbWVudjsKKyNlbmRpZgorI2lmIEVOQUJMRV9MT0dJTl9TRVNTSU9OX0FTX0NISUxECisJcGlkX3QgY2hpbGRfcGlkOworI2VuZGlmCisKKwlJTklUX0coKTsKKworCS8qIE1vcmUgb2Ygc3VpZCBwYXJhbm9pYSBpZiBjYWxsZWQgYnkgbm9uLXJvb3Q6ICovCisJLyogQ2xlYXIgZGFuZ2Vyb3VzIHN0dWZmLCBzZXQgUEFUSCAqLworCXJ1bl9ieV9yb290ID0gIXNhbml0aXplX2Vudl9pZl9zdWlkKCk7CisKKwkvKiBNYW5kYXRvcnkgcGFyYW5vaWEgZm9yIHN1aWQgYXBwbGV0OgorCSAqIGVuc3VyZSB0aGF0IGZkIyAwLDEsMiBhcmUgb3BlbmVkIChhdCBsZWFzdCB0byAvZGV2L251bGwpCisJICogYW5kIGFueSBleHRyYSBvcGVuIGZkJ3MgYXJlIGNsb3NlZC4KKwkgKiAoVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGlzIG1pc2xlYWRpbmcuIE5vdCBkYWVtb25pemluZyBoZXJlLikgKi8KKwliYl9kYWVtb25pemVfb3JfcmV4ZWMoREFFTU9OX09OTFlfU0FOSVRJWkUgfCBEQUVNT05fQ0xPU0VfRVhUUkFfRkRTLCBOVUxMKTsKKworCXVzZXJuYW1lWzBdID0gJ1wwJzsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiZjpoOnAiLCAmb3B0X3VzZXIsICZvcHRfaG9zdCk7CisJaWYgKG9wdCAmIExPR0lOX09QVF9mKSB7CisJCWlmICghcnVuX2J5X3Jvb3QpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiLWYgaXMgZm9yIHJvb3Qgb25seSIpOworCQlzYWZlX3N0cm5jcHkodXNlcm5hbWUsIG9wdF91c2VyLCBzaXplb2YodXNlcm5hbWUpKTsKKwl9CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKGFyZ3ZbMF0pIC8qIHVzZXIgZnJvbSBjb21tYW5kIGxpbmUgKGdldHR5KSAqLworCQlzYWZlX3N0cm5jcHkodXNlcm5hbWUsIGFyZ3ZbMF0sIHNpemVvZih1c2VybmFtZSkpOworCisJLyogU2F2ZSB0dHkgYXR0cmlidXRlcyAtIGFuZCBieSBkb2luZyBpdCwgY2hlY2sgdGhhdCBpdCdzIGluZGVlZCBhIHR0eSAqLworCWlmICh0Y2dldGF0dHIoU1RESU5fRklMRU5PLCAmRy50dHlfYXR0cnMpIDwgMAorCSB8fCAhaXNhdHR5KFNURE9VVF9GSUxFTk8pCisJIC8qfHwgIWlzYXR0eShTVERFUlJfRklMRU5PKSAtIG5vLCBndWVzcyBzb21lIHBlb3BsZSBtaWdodCB3YW50IHRvIHJlZGlyZWN0IHRoaXMgKi8KKwkpIHsKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsgIC8qIE11c3QgYmUgYSB0ZXJtaW5hbCAqLworCX0KKworCS8qIFdlIGluc3RhbGwgdGltZW91dCBoYW5kbGVyIG9ubHkgX2FmdGVyXyB3ZSBzYXZlZCBHLnR0eV9hdHRycyAqLworCXNpZ25hbChTSUdBTFJNLCBhbGFybV9oYW5kbGVyKTsKKwlhbGFybShUSU1FT1VUKTsKKworCS8qIEZpbmQgb3V0IGFuZCBtZW1vcml6ZSBvdXIgdHR5IG5hbWUgKi8KKwlmdWxsX3R0eSA9IHhtYWxsb2NfdHR5bmFtZShTVERJTl9GSUxFTk8pOworCWlmICghZnVsbF90dHkpCisJCWZ1bGxfdHR5ID0geHN0cmR1cCgiVU5LTk9XTiIpOworCXNob3J0X3R0eSA9IHNraXBfZGV2X3BmeChmdWxsX3R0eSk7CisKKwlpZiAob3B0X2hvc3QpIHsKKwkJZnJvbWhvc3QgPSB4YXNwcmludGYoIiBvbiAnJXMnIGZyb20gJyVzJyIsIHNob3J0X3R0eSwgb3B0X2hvc3QpOworCX0gZWxzZSB7CisJCWZyb21ob3N0ID0geGFzcHJpbnRmKCIgb24gJyVzJyIsIHNob3J0X3R0eSk7CisJfQorCisJLyogV2FzIGJyZWFraW5nICJsb2dpbiA8dXNlcm5hbWU+IiBmcm9tIHNoZWxsIGNvbW1hbmQgbGluZTogKi8KKwkvKmJiX3NldHBncnAoKTsqLworCisJb3BlbmxvZyhhcHBsZXRfbmFtZSwgTE9HX1BJRCB8IExPR19DT05TLCBMT0dfQVVUSCk7CisKKwl3aGlsZSAoMSkgeworCQkvKiBmbHVzaCBhd2F5IGFueSB0eXBlLWFoZWFkIChhcyBnZXR0eSBkb2VzKSAqLworCQl0Y2ZsdXNoKDAsIFRDSUZMVVNIKTsKKworCQlpZiAoIXVzZXJuYW1lWzBdKQorCQkJZ2V0X3VzZXJuYW1lX29yX2RpZSh1c2VybmFtZSwgc2l6ZW9mKHVzZXJuYW1lKSk7CisKKyNpZiBFTkFCTEVfUEFNCisJCXBhbXJldCA9IHBhbV9zdGFydCgibG9naW4iLCB1c2VybmFtZSwgJmNvbnYsICZwYW1oKTsKKwkJaWYgKHBhbXJldCAhPSBQQU1fU1VDQ0VTUykgeworCQkJZmFpbGVkX21zZyA9ICJzdGFydCI7CisJCQlnb3RvIHBhbV9hdXRoX2ZhaWxlZDsKKwkJfQorCQkvKiBzZXQgVFRZIChzbyB0aGluZ3MgbGlrZSBzZWN1cmV0dHkgd29yaykgKi8KKwkJcGFtcmV0ID0gcGFtX3NldF9pdGVtKHBhbWgsIFBBTV9UVFksIHNob3J0X3R0eSk7CisJCWlmIChwYW1yZXQgIT0gUEFNX1NVQ0NFU1MpIHsKKwkJCWZhaWxlZF9tc2cgPSAic2V0X2l0ZW0oVFRZKSI7CisJCQlnb3RvIHBhbV9hdXRoX2ZhaWxlZDsKKwkJfQorCQkvKiBzZXQgUkhPU1QgKi8KKwkJaWYgKG9wdF9ob3N0KSB7CisJCQlwYW1yZXQgPSBwYW1fc2V0X2l0ZW0ocGFtaCwgUEFNX1JIT1NULCBvcHRfaG9zdCk7CisJCQlpZiAocGFtcmV0ICE9IFBBTV9TVUNDRVNTKSB7CisJCQkJZmFpbGVkX21zZyA9ICJzZXRfaXRlbShSSE9TVCkiOworCQkJCWdvdG8gcGFtX2F1dGhfZmFpbGVkOworCQkJfQorCQl9CisJCWlmICghKG9wdCAmIExPR0lOX09QVF9mKSkgeworCQkJcGFtcmV0ID0gcGFtX2F1dGhlbnRpY2F0ZShwYW1oLCAwKTsKKwkJCWlmIChwYW1yZXQgIT0gUEFNX1NVQ0NFU1MpIHsKKwkJCQlmYWlsZWRfbXNnID0gImF1dGhlbnRpY2F0ZSI7CisJCQkJZ290byBwYW1fYXV0aF9mYWlsZWQ7CisJCQkJLyogVE9ETzogb3IganVzdCAiZ290byBhdXRoX2ZhaWxlZCIKKwkJCQkgKiBzaW5jZSB1c2VyIHNlZW1zIHRvIGVudGVyIHdyb25nIHBhc3N3b3JkCisJCQkJICogKGluIHRoaXMgY2FzZSBwYW1yZXQgPT0gNykKKwkJCQkgKi8KKwkJCX0KKwkJfQorCQkvKiBjaGVjayB0aGF0IHRoZSBhY2NvdW50IGlzIGhlYWx0aHkgKi8KKwkJcGFtcmV0ID0gcGFtX2FjY3RfbWdtdChwYW1oLCAwKTsKKwkJaWYgKHBhbXJldCAhPSBQQU1fU1VDQ0VTUykgeworCQkJZmFpbGVkX21zZyA9ICJhY2N0X21nbXQiOworCQkJZ290byBwYW1fYXV0aF9mYWlsZWQ7CisJCX0KKwkJLyogcmVhZCB1c2VyIGJhY2sgKi8KKwkJcGFtdXNlciA9IE5VTEw7CisJCS8qIGdjYzogImRlcmVmZXJlbmNpbmcgdHlwZS1wdW5uZWQgcG9pbnRlciBicmVha3MgYWxpYXNpbmcgcnVsZXMuLi4iCisJCSAqIHRodXMgd2UgY2FzdCB0byAodm9pZCopICovCisJCWlmIChwYW1fZ2V0X2l0ZW0ocGFtaCwgUEFNX1VTRVIsICh2b2lkKikmcGFtdXNlcikgIT0gUEFNX1NVQ0NFU1MpIHsKKwkJCWZhaWxlZF9tc2cgPSAiZ2V0X2l0ZW0oVVNFUikiOworCQkJZ290byBwYW1fYXV0aF9mYWlsZWQ7CisJCX0KKwkJaWYgKCFwYW11c2VyIHx8ICFwYW11c2VyWzBdKQorCQkJZ290byBhdXRoX2ZhaWxlZDsKKwkJc2FmZV9zdHJuY3B5KHVzZXJuYW1lLCBwYW11c2VyLCBzaXplb2YodXNlcm5hbWUpKTsKKwkJLyogRG9uJ3QgdXNlICJwdyA9IGdldHB3bmFtKHVzZXJuYW1lKTsiLAorCQkgKiBQQU0gaXMgc2FpZCB0byBiZSBjYXBhYmxlIG9mIGRlc3Ryb3lpbmcgc3RhdGljIHN0b3JhZ2UKKwkJICogdXNlZCBieSBnZXRwd25hbSgpLiBXZSBhcmUgdXNpbmcgc2FmZShyKSBmdW5jdGlvbiAqLworCQlwdyA9IE5VTEw7CisJCWdldHB3bmFtX3IodXNlcm5hbWUsICZwd2RzdHJ1Y3QsIHB3ZGJ1Ziwgc2l6ZW9mKHB3ZGJ1ZiksICZwdyk7CisJCWlmICghcHcpCisJCQlnb3RvIGF1dGhfZmFpbGVkOworCQlwYW1yZXQgPSBwYW1fb3Blbl9zZXNzaW9uKHBhbWgsIDApOworCQlpZiAocGFtcmV0ICE9IFBBTV9TVUNDRVNTKSB7CisJCQlmYWlsZWRfbXNnID0gIm9wZW5fc2Vzc2lvbiI7CisJCQlnb3RvIHBhbV9hdXRoX2ZhaWxlZDsKKwkJfQorCQlwYW1yZXQgPSBwYW1fc2V0Y3JlZChwYW1oLCBQQU1fRVNUQUJMSVNIX0NSRUQpOworCQlpZiAocGFtcmV0ICE9IFBBTV9TVUNDRVNTKSB7CisJCQlmYWlsZWRfbXNnID0gInNldGNyZWQiOworCQkJZ290byBwYW1fYXV0aF9mYWlsZWQ7CisJCX0KKwkJYnJlYWs7IC8qIHN1Y2Nlc3MsIGNvbnRpbnVlIGxvZ2luIHByb2Nlc3MgKi8KKworIHBhbV9hdXRoX2ZhaWxlZDoKKwkJLyogc3lzbG9nLCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgcG90ZW50aWFsIGF0dGFja2VyCisJCSAqIHRvIGtub3cgX3doeV8gbG9naW4gZmFpbGVkICovCisJCXN5c2xvZyhMT0dfV0FSTklORywgInBhbV8lcyBjYWxsIGZhaWxlZDogJXMgKCVkKSIsIGZhaWxlZF9tc2csCisJCQkJCXBhbV9zdHJlcnJvcihwYW1oLCBwYW1yZXQpLCBwYW1yZXQpOworCQlzYWZlX3N0cm5jcHkodXNlcm5hbWUsICJVTktOT1dOIiwgc2l6ZW9mKHVzZXJuYW1lKSk7CisjZWxzZSAvKiBub3QgUEFNICovCisJCXB3ID0gZ2V0cHduYW0odXNlcm5hbWUpOworCQlpZiAoIXB3KSB7CisJCQlzdHJjcHkodXNlcm5hbWUsICJVTktOT1dOIik7CisJCQlnb3RvIGZha2VfaXQ7CisJCX0KKworCQlpZiAocHctPnB3X3Bhc3N3ZFswXSA9PSAnIScgfHwgcHctPnB3X3Bhc3N3ZFswXSA9PSAnKicpCisJCQlnb3RvIGF1dGhfZmFpbGVkOworCisJCWlmIChvcHQgJiBMT0dJTl9PUFRfZikKKwkJCWJyZWFrOyAvKiAtZiBVU0VSOiBzdWNjZXNzIHdpdGhvdXQgYXNraW5nIHBhc3N3ZCAqLworCisJCWlmIChwdy0+cHdfdWlkID09IDAgJiYgIWNoZWNrX3NlY3VyZXR0eShzaG9ydF90dHkpKQorCQkJZ290byBhdXRoX2ZhaWxlZDsKKworCQkvKiBEb24ndCBjaGVjayB0aGUgcGFzc3dvcmQgaWYgcGFzc3dvcmQgZW50cnkgaXMgZW1wdHkgKCEpICovCisJCWlmICghcHctPnB3X3Bhc3N3ZFswXSkKKwkJCWJyZWFrOworIGZha2VfaXQ6CisJCS8qIFBhc3N3b3JkIHJlYWRpbmcgYW5kIGF1dGhvcml6YXRpb24gdGFrZXMgcGxhY2UgaGVyZS4KKwkJICogTm90ZSB0aGF0IHJlYWRzIChpbiBuby1lY2hvIG1vZGUpIHRyYXNoIHR0eSBhdHRyaWJ1dGVzLgorCQkgKiBJZiB3ZSBnZXQgaW50ZXJydXB0ZWQgYnkgU0lHQUxSTSwgd2UgbmVlZCB0byByZXN0b3JlIGF0dHJzLgorCQkgKi8KKwkJaWYgKGFza19hbmRfY2hlY2tfcGFzc3dvcmQocHcpID4gMCkKKwkJCWJyZWFrOworI2VuZGlmIC8qIEVOQUJMRV9QQU0gKi8KKyBhdXRoX2ZhaWxlZDoKKwkJb3B0ICY9IH5MT0dJTl9PUFRfZjsKKwkJYmJfZG9fZGVsYXkoTE9HSU5fRkFJTF9ERUxBWSk7CisJCS8qIFRPRE86IGRvZXNuJ3Qgc291bmQgbGlrZSBjb3JyZWN0IEVuZ2xpc2ggcGhyYXNlIHRvIG1lICovCisJCXB1dHMoIkxvZ2luIGluY29ycmVjdCIpOworCQlpZiAoKytjb3VudCA9PSAzKSB7CisJCQlzeXNsb2coTE9HX1dBUk5JTkcsICJpbnZhbGlkIHBhc3N3b3JkIGZvciAnJXMnJXMiLAorCQkJCQkJdXNlcm5hbWUsIGZyb21ob3N0KTsKKworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJCWZyZWUoZnJvbWhvc3QpOworCisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQl9CisJCXVzZXJuYW1lWzBdID0gJ1wwJzsKKwl9IC8qIHdoaWxlICgxKSAqLworCisJYWxhcm0oMCk7CisJLyogV2UgY2FuIGlnbm9yZSAvZXRjL25vbG9naW4gaWYgd2UgYXJlIGxvZ2dpbmcgaW4gYXMgcm9vdCwKKwkgKiBpdCBkb2Vzbid0IG1hdHRlciB3aGV0aGVyIHdlIGFyZSBydW4gYnkgcm9vdCBvciBub3QgKi8KKwlpZiAocHctPnB3X3VpZCAhPSAwKQorCQlkaWVfaWZfbm9sb2dpbigpOworCisjaWYgRU5BQkxFX0xPR0lOX1NFU1NJT05fQVNfQ0hJTEQKKwljaGlsZF9waWQgPSB2Zm9yaygpOworCWlmIChjaGlsZF9waWQgIT0gMCkgeworCQlpZiAoY2hpbGRfcGlkIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2coInZmb3JrIik7CisJCWVsc2UgeworCQkJaWYgKHNhZmVfd2FpdHBpZChjaGlsZF9waWQsIE5VTEwsIDApID09IC0xKQorCQkJCWJiX3BlcnJvcl9tc2coIndhaXRwaWQiKTsKKwkJCXVwZGF0ZV91dG1wX0RFQURfUFJPQ0VTUyhjaGlsZF9waWQpOworCQl9CisJCUlGX1BBTShsb2dpbl9wYW1fZW5kKHBhbWgpOykKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisKKwlJRl9TRUxJTlVYKGluaXRzZWxpbnV4KHVzZXJuYW1lLCBmdWxsX3R0eSwgJnVzZXJfc2lkKTspCisKKwkvKiBUcnkgdGhlc2UsIGJ1dCBkb24ndCBjb21wbGFpbiBpZiB0aGV5IGZhaWwuCisJICogX2ZfY2hvd24gaXMgc2FmZSB3cnQgcmFjZSB0PXR0eW5hbWUoMCk7Li4uO2Nob3duKHQpOyAqLworCWZjaG93bigwLCBwdy0+cHdfdWlkLCBwdy0+cHdfZ2lkKTsKKwlmY2htb2QoMCwgMDYwMCk7CisKKwl1cGRhdGVfdXRtcChnZXRwaWQoKSwgVVNFUl9QUk9DRVNTLCBzaG9ydF90dHksIHVzZXJuYW1lLCBydW5fYnlfcm9vdCA/IG9wdF9ob3N0IDogTlVMTCk7CisKKwkvKiBXZSB0cnVzdCBlbnZpcm9ubWVudCBvbmx5IGlmIHdlIHJ1biBieSByb290ICovCisJaWYgKEVOQUJMRV9MT0dJTl9TQ1JJUFRTICYmIHJ1bl9ieV9yb290KQorCQlydW5fbG9naW5fc2NyaXB0KHB3LCBmdWxsX3R0eSk7CisKKwljaGFuZ2VfaWRlbnRpdHkocHcpOworCXNldHVwX2Vudmlyb25tZW50KHB3LT5wd19zaGVsbCwKKwkJCSghKG9wdCAmIExPR0lOX09QVF9wKSAqIFNFVFVQX0VOVl9DTEVBUkVOVikgKyBTRVRVUF9FTlZfQ0hBTkdFRU5WLAorCQkJcHcpOworCisjaWYgRU5BQkxFX1BBTQorCS8qIE1vZHVsZXMgc3VjaCBhcyBwYW1fZW52IHdpbGwgc2V0dXAgdGhlIFBBTSBlbnZpcm9ubWVudCwKKwkgKiB3aGljaCBzaG91bGQgYmUgY29waWVkIGludG8gdGhlIG5ldyBlbnZpcm9ubWVudC4gKi8KKwlwYW1lbnYgPSBwYW1fZ2V0ZW52bGlzdChwYW1oKTsKKwlpZiAocGFtZW52KSB3aGlsZSAoKnBhbWVudikgeworCQlwdXRlbnYoKnBhbWVudik7CisJCXBhbWVudisrOworCX0KKyNlbmRpZgorCisJaWYgKGFjY2VzcygiLmh1c2hsb2dpbiIsIEZfT0spICE9IDApCisJCW1vdGQoKTsKKworCWlmIChwdy0+cHdfdWlkID09IDApCisJCXN5c2xvZyhMT0dfSU5GTywgInJvb3QgbG9naW4lcyIsIGZyb21ob3N0KTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZShmcm9taG9zdCk7CisKKwkvKiB3ZWxsLCBhIHNpbXBsZSBzZXRleGVjY29uKCkgaGVyZSB3b3VsZCBkbyB0aGUgam9iIGFzIHdlbGwsCisJICogYnV0IGxldCdzIHBsYXkgdGhlIGdhbWUgZm9yIG5vdyAqLworCUlGX1NFTElOVVgoc2V0X2N1cnJlbnRfc2VjdXJpdHlfY29udGV4dCh1c2VyX3NpZCk7KQorCisJLy8gdXRpbC1saW51eCBsb2dpbiBhbHNvIGRvZXM6CisJLy8gLyogc3RhcnQgbmV3IHNlc3Npb24gKi8KKwkvLyBzZXRzaWQoKTsKKwkvLyAvKiBUSU9DU0NUVFk6IHN0ZWFsIHR0eSBmcm9tIG90aGVyIHByb2Nlc3MgZ3JvdXAgKi8KKwkvLyBpZiAoaW9jdGwoMCwgVElPQ1NDVFRZLCAxKSkgZXJyb3JfbXNnLi4uCisJLy8gQkJveCBsb2dpbiB1c2VkIHRvIGRvIHRoaXMgKHNlZSBhYm92ZSk6CisJLy8gYmJfc2V0cGdycCgpOworCS8vIElmIHRoaXMgc3R1ZmYgaXMgcmVhbGx5IG5lZWRlZCwgYWRkIGl0IGFuZCBleHBsYWluIHdoeSEKKworCS8qIFNldCBzaWduYWxzIHRvIGRlZmF1bHRzICovCisJLyogTm9uLWlnbm9yZWQgc2lnbmFscyByZXZlcnQgdG8gU0lHX0RGTCBvbiBleGVjIGFueXdheSAqLworCS8qc2lnbmFsKFNJR0FMUk0sIFNJR19ERkwpOyovCisKKwkvKiBJcyB0aGlzIGNvcnJlY3Q/IFRoaXMgd2F5IHVzZXIgY2FuIGN0cmwtYyBvdXQgb2YgL2V0Yy9wcm9maWxlLAorCSAqIHBvdGVudGlhbGx5IGNyZWF0aW5nIHNlY3VyaXR5IGJyZWFjaCAodGVzdGVkIHdpdGggYmFzaCAzLjApLgorCSAqIEJ1dCB3aXRob3V0IHRoaXMsIGJhc2ggMy4wIHdpbGwgbm90IGVuYWJsZSBjdHJsLWMgZWl0aGVyLgorCSAqIE1heWJlIGJhc2ggaXMgYnVnZ3k/CisJICogTmVlZCB0byBmaW5kIG91dCB3aGF0IHN0YW5kYXJkcyBzYXkgYWJvdXQgL2Jpbi9sb2dpbiAtCisJICogc2hvdWxkIHdlIGxlYXZlIFNJR0lOVCBldGMgZW5hYmxlZCBvciBkaXNhYmxlZD8gKi8KKwlzaWduYWwoU0lHSU5ULCBTSUdfREZMKTsKKworCS8qIEV4ZWMgbG9naW4gc2hlbGwgd2l0aCBubyBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgKi8KKwlydW5fc2hlbGwocHctPnB3X3NoZWxsLCAxLCBOVUxMLCBOVUxMKTsKKworCS8qIHJldHVybiBFWElUX0ZBSUxVUkU7IC0gbm90IHJlYWNoZWQgKi8KK30KZGlmZiAtLWdpdCBhL2xvZ2ludXRpbHMvcGFzc3dkLmMgYi9sb2dpbnV0aWxzL3Bhc3N3ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MDkwODkKLS0tIC9kZXYvbnVsbAorKysgYi9sb2dpbnV0aWxzL3Bhc3N3ZC5jCkBAIC0wLDAgKzEsMjIxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBwYXNzd2RfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbVVNFUl0iCisvL3VzYWdlOiNkZWZpbmUgcGFzc3dkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ2hhbmdlIFVTRVIncyBwYXNzd29yZCAoZGVmYXVsdDogY3VycmVudCB1c2VyKSIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuCS1hIEFMRwlFbmNyeXB0aW9uIG1ldGhvZCIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJU2V0IHBhc3N3b3JkIHRvICcnIgorLy91c2FnZTogICAgICJcbgktbAlMb2NrIChkaXNhYmxlKSBhY2NvdW50IgorLy91c2FnZTogICAgICJcbgktdQlVbmxvY2sgKGVuYWJsZSkgYWNjb3VudCIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+IC8qIHNldHJsaW1pdCAqLworCitzdGF0aWMgY2hhciogbmV3X3Bhc3N3b3JkKGNvbnN0IHN0cnVjdCBwYXNzd2QgKnB3LCB1aWRfdCBteXVpZCwgY29uc3QgY2hhciAqYWxnbykKK3sKKwljaGFyIHNhbHRbTUFYX1BXX1NBTFRfTEVOXTsKKwljaGFyICpvcmlnID0gKGNoYXIqKSIiOworCWNoYXIgKm5ld3AgPSBOVUxMOworCWNoYXIgKmNwID0gTlVMTDsKKwljaGFyICpyZXQgPSBOVUxMOyAvKiBmYWlsdXJlIHNvIGZhciAqLworCisJaWYgKG15dWlkICE9IDAgJiYgcHctPnB3X3Bhc3N3ZFswXSkgeworCQljaGFyICplbmNyeXB0ZWQ7CisKKwkJb3JpZyA9IGJiX2Fza19zdGRpbigiT2xkIHBhc3N3b3JkOiAiKTsgLyogcmV0dXJucyBwdHIgdG8gc3RhdGljICovCisJCWlmICghb3JpZykKKwkJCWdvdG8gZXJyX3JldDsKKwkJZW5jcnlwdGVkID0gcHdfZW5jcnlwdChvcmlnLCBwdy0+cHdfcGFzc3dkLCAxKTsgLyogcmV0dXJucyBtYWxsb2NlZCBzdHIgKi8KKwkJaWYgKHN0cmNtcChlbmNyeXB0ZWQsIHB3LT5wd19wYXNzd2QpICE9IDApIHsKKwkJCXN5c2xvZyhMT0dfV0FSTklORywgImluY29ycmVjdCBwYXNzd29yZCBmb3IgJXMiLCBwdy0+cHdfbmFtZSk7CisJCQliYl9kb19kZWxheShMT0dJTl9GQUlMX0RFTEFZKTsKKwkJCXB1dHMoIkluY29ycmVjdCBwYXNzd29yZCIpOworCQkJZ290byBlcnJfcmV0OworCQl9CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZyZWUoZW5jcnlwdGVkKTsKKwl9CisJb3JpZyA9IHhzdHJkdXAob3JpZyk7IC8qIG9yIGVsc2UgYmJfYXNrX3N0ZGluKCkgd2lsbCBkZXN0cm95IGl0ICovCisJbmV3cCA9IGJiX2Fza19zdGRpbigiTmV3IHBhc3N3b3JkOiAiKTsgLyogcmV0dXJucyBwdHIgdG8gc3RhdGljICovCisJaWYgKCFuZXdwKQorCQlnb3RvIGVycl9yZXQ7CisJbmV3cCA9IHhzdHJkdXAobmV3cCk7IC8qIHdlIGFyZSBnb2luZyB0byBiYl9hc2tfc3RkaW4oKSBhZ2Fpbiwgc28gc2F2ZSBpdCAqLworCWlmIChFTkFCTEVfRkVBVFVSRV9QQVNTV0RfV0VBS19DSEVDSworCSAmJiBvYnNjdXJlKG9yaWcsIG5ld3AsIHB3KQorCSAmJiBteXVpZCAhPSAwCisJKSB7CisJCWdvdG8gZXJyX3JldDsgLyogbm9uLXJvb3QgaXMgbm90IGFsbG93ZWQgdG8gaGF2ZSB3ZWFrIHBhc3N3ZCAqLworCX0KKworCWNwID0gYmJfYXNrX3N0ZGluKCJSZXR5cGUgcGFzc3dvcmQ6ICIpOworCWlmICghY3ApCisJCWdvdG8gZXJyX3JldDsKKwlpZiAoc3RyY21wKGNwLCBuZXdwKSAhPSAwKSB7CisJCXB1dHMoIlBhc3N3b3JkcyBkb24ndCBtYXRjaCIpOworCQlnb3RvIGVycl9yZXQ7CisJfQorCisJY3J5cHRfbWFrZV9wd19zYWx0KHNhbHQsIGFsZ28pOworCisJLyogcHdfZW5jcnlwdCByZXR1cm5zIG1hbGxvY2VkIHN0ciAqLworCXJldCA9IHB3X2VuY3J5cHQobmV3cCwgc2FsdCwgMSk7CisJLyogd2hlZSwgc3VjY2VzcyEgKi8KKworIGVycl9yZXQ6CisJbnVrZV9zdHIob3JpZyk7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBmcmVlKG9yaWcpOworCisJbnVrZV9zdHIobmV3cCk7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBmcmVlKG5ld3ApOworCisJbnVrZV9zdHIoY3ApOworCXJldHVybiByZXQ7Cit9CisKK2ludCBwYXNzd2RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHBhc3N3ZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJZW51bSB7CisJCU9QVF9hbGdvICAgPSAoMSA8PCAwKSwgLyogLWEgLSBwYXNzd29yZCBhbGdvcml0aG0gKi8KKwkJT1BUX2xvY2sgICA9ICgxIDw8IDEpLCAvKiAtbCAtIGxvY2sgYWNjb3VudCAqLworCQlPUFRfdW5sb2NrID0gKDEgPDwgMiksIC8qIC11IC0gdW5sb2NrIGFjY291bnQgKi8KKwkJT1BUX2RlbGV0ZSA9ICgxIDw8IDMpLCAvKiAtZCAtIGRlbGV0ZSBwYXNzd29yZCAqLworCQlPUFRfbHVkICAgID0gT1BUX2xvY2sgfCBPUFRfdW5sb2NrIHwgT1BUX2RlbGV0ZSwKKwl9OworCXVuc2lnbmVkIG9wdDsKKwlpbnQgcmM7CisJY29uc3QgY2hhciAqb3B0X2EgPSBDT05GSUdfRkVBVFVSRV9ERUZBVUxUX1BBU1NXRF9BTEdPOworCWNvbnN0IGNoYXIgKmZpbGVuYW1lOworCWNoYXIgKm15bmFtZTsKKwljaGFyICpuYW1lOworCWNoYXIgKm5ld3A7CisJc3RydWN0IHBhc3N3ZCAqcHc7CisJdWlkX3QgbXl1aWQ7CisJc3RydWN0IHJsaW1pdCBybGltaXRfZnNpemU7CisJY2hhciBjOworI2lmIEVOQUJMRV9GRUFUVVJFX1NIQURPV1BBU1NXRFMKKwkvKiBVc2luZyBfciBmdW5jdGlvbiB0byBhdm9pZCBwdWxsaW5nIGluIHN0YXRpYyBidWZmZXJzICovCisJc3RydWN0IHNwd2Qgc3B3OworCWNoYXIgYnVmZmVyWzI1Nl07CisjZW5kaWYKKworCWxvZ21vZGUgPSBMT0dNT0RFX0JPVEg7CisJb3BlbmxvZyhhcHBsZXRfbmFtZSwgMCwgTE9HX0FVVEgpOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJhOmx1ZCIsICZvcHRfYSk7CisJLy9hcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworCW15dWlkID0gZ2V0dWlkKCk7CisJLyogLWwsIC11LCAtZCByZXF1aXJlIHJvb3QgcHJpdiBhbmQgdXNlcm5hbWUgYXJndW1lbnQgKi8KKwlpZiAoKG9wdCAmIE9QVF9sdWQpICYmIChteXVpZCAhPSAwIHx8ICFhcmd2WzBdKSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJLyogV2lsbCBjb21wbGFpbiBhbmQgZGllIGlmIHVzZXJuYW1lIG5vdCBmb3VuZCAqLworCW15bmFtZSA9IHhzdHJkdXAoeHVpZDJ1bmFtZShteXVpZCkpOworCW5hbWUgPSBhcmd2WzBdID8gYXJndlswXSA6IG15bmFtZTsKKworCXB3ID0geGdldHB3bmFtKG5hbWUpOworCWlmIChteXVpZCAhPSAwICYmIHB3LT5wd191aWQgIT0gbXl1aWQpIHsKKwkJLyogTE9HTU9ERV9CT1RIICovCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyBjYW4ndCBjaGFuZ2UgcGFzc3dvcmQgZm9yICVzIiwgbXluYW1lLCBuYW1lKTsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSEFET1dQQVNTV0RTCisJeworCQkvKiBnZXRzcG5hbV9yIG1heSByZXR1cm4gMCB5ZXQgc2V0IHJlc3VsdCB0byBOVUxMLgorCQkgKiBBdCBsZWFzdCBnbGliYyAyLjQgZG9lcyB0aGlzLiBCZSBleHRyYSBwYXJhbm9pZCBoZXJlLiAqLworCQlzdHJ1Y3Qgc3B3ZCAqcmVzdWx0ID0gTlVMTDsKKwkJZXJybm8gPSAwOworCQlpZiAoZ2V0c3BuYW1fcihwdy0+cHdfbmFtZSwgJnNwdywgYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgJnJlc3VsdCkgIT0gMAorCQkgfHwgIXJlc3VsdCAvKiBubyBlcnJvciwgYnV0IG5vIHJlY29yZCBmb3VuZCBlaXRoZXIgKi8KKwkJIHx8IHN0cmNtcChyZXN1bHQtPnNwX25hbXAsIHB3LT5wd19uYW1lKSAhPSAwIC8qIHBhcmFub2lhICovCisJCSkgeworCQkJaWYgKGVycm5vICE9IEVOT0VOVCkgeworCQkJCS8qIExPR01PREVfQk9USCAqLworCQkJCWJiX3BlcnJvcl9tc2coIm5vIHJlY29yZCBvZiAlcyBpbiAlcywgdXNpbmcgJXMiLAorCQkJCQluYW1lLCBiYl9wYXRoX3NoYWRvd19maWxlLAorCQkJCQliYl9wYXRoX3Bhc3N3ZF9maWxlKTsKKwkJCX0KKwkJCS8qIGVsc2U6IC9ldGMvc2hhZG93IGRvZXMgbm90IGV4aXN0LAorCQkJICogYXBwYXJlbnRseSB3ZSBhcmUgb24gYSBzaGFkb3ctbGVzcyBzeXN0ZW0sCisJCQkgKiBubyBzdXJwcmlzZSB0aGVyZSAqLworCQl9IGVsc2UgeworCQkJcHctPnB3X3Bhc3N3ZCA9IHJlc3VsdC0+c3BfcHdkcDsKKwkJfQorCX0KKyNlbmRpZgorCisJLyogRGVjaWRlIHdoYXQgdGhlIG5ldyBwYXNzd29yZCB3aWxsIGJlICovCisJbmV3cCA9IE5VTEw7CisJYyA9IHB3LT5wd19wYXNzd2RbMF0gLSAnISc7CisJaWYgKCEob3B0ICYgT1BUX2x1ZCkpIHsKKwkJaWYgKG15dWlkICE9IDAgJiYgIWMpIHsgLyogcGFzc3dkIHN0YXJ0cyB3aXRoICchJyAqLworCQkJLyogTE9HTU9ERV9CT1RIICovCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgY2hhbmdlICIKKwkJCQkJImxvY2tlZCBwYXNzd29yZCBmb3IgJXMiLCBuYW1lKTsKKwkJfQorCQlwcmludGYoIkNoYW5naW5nIHBhc3N3b3JkIGZvciAlc1xuIiwgbmFtZSk7CisJCW5ld3AgPSBuZXdfcGFzc3dvcmQocHcsIG15dWlkLCBvcHRfYSk7CisJCWlmICghbmV3cCkgeworCQkJbG9nbW9kZSA9IExPR01PREVfU1RESU87CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicGFzc3dvcmQgZm9yICVzIGlzIHVuY2hhbmdlZCIsIG5hbWUpOworCQl9CisJfSBlbHNlIGlmIChvcHQgJiBPUFRfbG9jaykgeworCQlpZiAoIWMpCisJCQlnb3RvIHNraXA7IC8qIHBhc3N3ZCBzdGFydHMgd2l0aCAnIScgKi8KKwkJbmV3cCA9IHhhc3ByaW50ZigiISVzIiwgcHctPnB3X3Bhc3N3ZCk7CisJfSBlbHNlIGlmIChvcHQgJiBPUFRfdW5sb2NrKSB7CisJCWlmIChjKQorCQkJZ290byBza2lwOyAvKiBub3QgJyEnICovCisJCS8qIHB3LT5wd19wYXNzd2QgcG9pbnRzIHRvIHN0YXRpYyBzdG9yYWdlLAorCQkgKiBzdHJkdXAnaW5nIHRvIGF2b2lkIG5hc3R5IHN1cnByaXplcyAqLworCQluZXdwID0geHN0cmR1cCgmcHctPnB3X3Bhc3N3ZFsxXSk7CisJfSBlbHNlIGlmIChvcHQgJiBPUFRfZGVsZXRlKSB7CisJCW5ld3AgPSAoY2hhciopIiI7CisJfQorCisJcmxpbWl0X2ZzaXplLnJsaW1fY3VyID0gcmxpbWl0X2ZzaXplLnJsaW1fbWF4ID0gNTEyTCAqIDMwMDAwOworCXNldHJsaW1pdChSTElNSVRfRlNJWkUsICZybGltaXRfZnNpemUpOworCWJiX3NpZ25hbHMoMAorCQkrICgxIDw8IFNJR0hVUCkKKwkJKyAoMSA8PCBTSUdJTlQpCisJCSsgKDEgPDwgU0lHUVVJVCkKKwkJLCBTSUdfSUdOKTsKKwl1bWFzaygwNzcpOworCXhzZXR1aWQoMCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TSEFET1dQQVNTV0RTCisJZmlsZW5hbWUgPSBiYl9wYXRoX3NoYWRvd19maWxlOworCXJjID0gdXBkYXRlX3Bhc3N3ZChiYl9wYXRoX3NoYWRvd19maWxlLCBuYW1lLCBuZXdwLCBOVUxMKTsKKwlpZiAocmMgPiAwKQorCQkvKiBwYXNzd29yZCBpbiAvZXRjL3NoYWRvdyB3YXMgdXBkYXRlZCAqLworCQluZXdwID0gKGNoYXIqKSAieCI7CisJaWYgKHJjID49IDApCisJCS8qIDAgPSAvZXRjL3NoYWRvdyBtaXNzaW5nIChub3QgYW4gZXJyb3IpLCA+MCA9IHBhc3N3ZCBjaGFuZ2VkIGluIC9ldGMvc2hhZG93ICovCisjZW5kaWYKKwl7CisJCWZpbGVuYW1lID0gYmJfcGF0aF9wYXNzd2RfZmlsZTsKKwkJcmMgPSB1cGRhdGVfcGFzc3dkKGJiX3BhdGhfcGFzc3dkX2ZpbGUsIG5hbWUsIG5ld3AsIE5VTEwpOworCX0KKwkvKiBMT0dNT0RFX0JPVEggKi8KKwlpZiAocmMgPCAwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgdXBkYXRlIHBhc3N3b3JkIGZpbGUgJXMiLCBmaWxlbmFtZSk7CisJYmJfaW5mb19tc2coIlBhc3N3b3JkIGZvciAlcyBjaGFuZ2VkIGJ5ICVzIiwgbmFtZSwgbXluYW1lKTsKKworCS8qaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBmcmVlKG5ld3ApOyAtIGNhbid0LCBpdCBtYXkgYmUgbm9uLW1hbGxvY2VkICovCisgc2tpcDoKKwlpZiAoIW5ld3ApIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInBhc3N3b3JkIGZvciAlcyBpcyBhbHJlYWR5ICVzbG9ja2VkIiwKKwkJCW5hbWUsIChvcHQgJiBPUFRfdW5sb2NrKSA/ICJ1biIgOiAiIik7CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmcmVlKG15bmFtZSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9sb2dpbnV0aWxzL3N1LmMgYi9sb2dpbnV0aWxzL3N1LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgxMjUwNQotLS0gL2Rldi9udWxsCisrKyBiL2xvZ2ludXRpbHMvc3UuYwpAQCAtMCwwICsxLDE0NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBzdSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzbG9nLmg+CisKKy8vdXNhZ2U6I2RlZmluZSBzdV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFstXSBbVVNFUl0iCisvL3VzYWdlOiNkZWZpbmUgc3VfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSdW4gc2hlbGwgdW5kZXIgVVNFUiAoYnkgZGVmYXVsdCwgcm9vdClcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLSwtbAlDbGVhciBlbnZpcm9ubWVudCwgcnVuIHNoZWxsIGFzIGxvZ2luIHNoZWxsIgorLy91c2FnZTogICAgICJcbgktcCwtbQlEbyBub3Qgc2V0IG5ldyAkSE9NRSwgJFNIRUxMLCAkVVNFUiwgJExPR05BTUUiCisvL3VzYWdlOiAgICAgIlxuCS1jIENNRAlDb21tYW5kIHRvIHBhc3MgdG8gJ3NoIC1jJyIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgU0gJU2hlbGwgdG8gdXNlIGluc3RlYWQgb2YgdXNlcidzIGRlZmF1bHQiCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TVV9DSEVDS1NfU0hFTExTCisvKiBSZXR1cm4gMSBpZiBTSEVMTCBpcyBhIHJlc3RyaWN0ZWQgc2hlbGwgKG9uZSBub3QgcmV0dXJuZWQgYnkKKyAqIGdldHVzZXJzaGVsbCksIGVsc2UgMCwgbWVhbmluZyBpdCBpcyBhIHN0YW5kYXJkIHNoZWxsLiAgKi8KK3N0YXRpYyBpbnQgcmVzdHJpY3RlZF9zaGVsbChjb25zdCBjaGFyICpzaGVsbCkKK3sKKwljaGFyICpsaW5lOworCWludCByZXN1bHQgPSAxOworCisJLypzZXR1c2Vyc2hlbGwoKTsgLSBnZXR1c2Vyc2hlbGwgZG9lcyBpdCBpdHNlbGYqLworCXdoaWxlICgobGluZSA9IGdldHVzZXJzaGVsbCgpKSAhPSBOVUxMKSB7CisJCWlmICgvKiAqbGluZSAhPSAnIycgJiYgKi8gc3RyY21wKGxpbmUsIHNoZWxsKSA9PSAwKSB7CisJCQlyZXN1bHQgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQllbmR1c2Vyc2hlbGwoKTsKKwlyZXR1cm4gcmVzdWx0OworfQorI2VuZGlmCisKKyNkZWZpbmUgU1VfT1BUX21wICgzKQorI2RlZmluZSBTVV9PUFRfbCAgKDQpCisKK2ludCBzdV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc3VfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGZsYWdzOworCWNoYXIgKm9wdF9zaGVsbCA9IE5VTEw7CisJY2hhciAqb3B0X2NvbW1hbmQgPSBOVUxMOworCWNvbnN0IGNoYXIgKm9wdF91c2VybmFtZSA9ICJyb290IjsKKwlzdHJ1Y3QgcGFzc3dkICpwdzsKKwl1aWRfdCBjdXJfdWlkID0gZ2V0dWlkKCk7CisJY29uc3QgY2hhciAqdHR5OworI2lmIEVOQUJMRV9GRUFUVVJFX1VUTVAKKwljaGFyIHVzZXJfYnVmWzY0XTsKKyNlbmRpZgorCWNvbnN0IGNoYXIgKm9sZF91c2VyOworCisJZmxhZ3MgPSBnZXRvcHQzMihhcmd2LCAibXBsYzpzOiIsICZvcHRfY29tbWFuZCwgJm9wdF9zaGVsbCk7CisJLy9hcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChhcmd2WzBdICYmIExPTkVfREFTSChhcmd2WzBdKSkgeworCQlmbGFncyB8PSBTVV9PUFRfbDsKKwkJYXJndisrOworCX0KKworCS8qIGdldCB1c2VyIGlmIHNwZWNpZmllZCAqLworCWlmIChhcmd2WzBdKSB7CisJCW9wdF91c2VybmFtZSA9IGFyZ3ZbMF07CisJCWFyZ3YrKzsKKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfU1VfU1lTTE9HKSB7CisJCS8qIFRoZSB1dG1wIGVudHJ5ICh2aWEgZ2V0bG9naW4pIGlzIHByb2JhYmx5IHRoZSBiZXN0IHdheSB0bworCQkgKiBpZGVudGlmeSB0aGUgdXNlciwgZXNwZWNpYWxseSBpZiBzb21lb25lIHN1J3MgZnJvbSBhIHN1LXNoZWxsLgorCQkgKiBCdXQgZ2V0bG9naW4gY2FuIGZhaWwgLS0gdXN1YWxseSBkdWUgdG8gbGFjayBvZiB1dG1wIGVudHJ5LgorCQkgKiBpbiB0aGlzIGNhc2UgcmVzb3J0IHRvIGdldHB3dWlkLiAgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9VVE1QCisJCW9sZF91c2VyID0gdXNlcl9idWY7CisJCWlmIChnZXRsb2dpbl9yKHVzZXJfYnVmLCBzaXplb2YodXNlcl9idWYpKSAhPSAwKQorI2VuZGlmCisJCXsKKwkJCXB3ID0gZ2V0cHd1aWQoY3VyX3VpZCk7CisJCQlvbGRfdXNlciA9IHB3ID8geHN0cmR1cChwdy0+cHdfbmFtZSkgOiAiIjsKKwkJfQorCQl0dHkgPSB4bWFsbG9jX3R0eW5hbWUoMik7CisJCWlmICghdHR5KSB7CisJCQl0dHkgPSAibm9uZSI7CisJCX0KKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgMCwgTE9HX0FVVEgpOworCX0KKworCXB3ID0geGdldHB3bmFtKG9wdF91c2VybmFtZSk7CisKKwlpZiAoY3VyX3VpZCA9PSAwIHx8IGFza19hbmRfY2hlY2tfcGFzc3dvcmQocHcpID4gMCkgeworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfU1VfU1lTTE9HKQorCQkJc3lzbG9nKExPR19OT1RJQ0UsICIlYyAlcyAlczolcyIsCisJCQkJJysnLCB0dHksIG9sZF91c2VyLCBvcHRfdXNlcm5hbWUpOworCX0gZWxzZSB7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9TVV9TWVNMT0cpCisJCQlzeXNsb2coTE9HX05PVElDRSwgIiVjICVzICVzOiVzIiwKKwkJCQknLScsIHR0eSwgb2xkX3VzZXIsIG9wdF91c2VybmFtZSk7CisJCWJiX2RvX2RlbGF5KExPR0lOX0ZBSUxfREVMQVkpOworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW5jb3JyZWN0IHBhc3N3b3JkIik7CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQICYmIEVOQUJMRV9GRUFUVVJFX1NVX1NZU0xPRykgeworCQljbG9zZWxvZygpOworCX0KKworCWlmICghb3B0X3NoZWxsICYmIChmbGFncyAmIFNVX09QVF9tcCkpIHsKKwkJLyogLXMgU0hFTEwgaXMgbm90IGdpdmVuLCBidXQgInByZXNlcnZlIGVudiIgb3B0IGlzICovCisJCW9wdF9zaGVsbCA9IGdldGVudigiU0hFTEwiKTsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TVV9DSEVDS1NfU0hFTExTCisJaWYgKG9wdF9zaGVsbCAmJiBjdXJfdWlkICE9IDAgJiYgcHctPnB3X3NoZWxsICYmIHJlc3RyaWN0ZWRfc2hlbGwocHctPnB3X3NoZWxsKSkgeworCQkvKiBUaGUgdXNlciBiZWluZyBzdSdkIHRvIGhhcyBhIG5vbnN0YW5kYXJkIHNoZWxsLCBhbmQgc28gaXMKKwkJICogcHJvYmFibHkgYSB1dWNwIGFjY291bnQgb3IgaGFzIHJlc3RyaWN0ZWQgYWNjZXNzLiAgRG9uJ3QKKwkJICogY29tcHJvbWlzZSB0aGUgYWNjb3VudCBieSBhbGxvd2luZyBhY2Nlc3Mgd2l0aCBhIHN0YW5kYXJkCisJCSAqIHNoZWxsLiAgKi8KKwkJYmJfZXJyb3JfbXNnKCJ1c2luZyByZXN0cmljdGVkIHNoZWxsIik7CisJCW9wdF9zaGVsbCA9IE5VTEw7IC8qIGlnbm9yZSAtcyBQUk9HICovCisJfQorCS8qIGVsc2U6IHVzZXIgY2FuIHJ1biB3aGF0ZXZlciBoZSB3YW50cyB2aWEgInN1IC1zIFBST0cgVVNFUiIuCisJICogVGhpcyBpcyBzYWZlIHNpbmNlIFBST0cgaXMgcnVuIHVuZGVyIHVzZXIncyB1aWQvZ2lkLiAqLworI2VuZGlmCisJaWYgKCFvcHRfc2hlbGwpCisJCW9wdF9zaGVsbCA9IHB3LT5wd19zaGVsbDsKKworCWNoYW5nZV9pZGVudGl0eShwdyk7CisJc2V0dXBfZW52aXJvbm1lbnQob3B0X3NoZWxsLAorCQkJKChmbGFncyAmIFNVX09QVF9sKSAvIFNVX09QVF9sICogU0VUVVBfRU5WX0NMRUFSRU5WKQorCQkJKyAoIShmbGFncyAmIFNVX09QVF9tcCkgKiBTRVRVUF9FTlZfQ0hBTkdFRU5WKQorCQkJKyAoIShmbGFncyAmIFNVX09QVF9sKSAqIFNFVFVQX0VOVl9OT19DSERJUiksCisJCQlwdyk7CisJSUZfU0VMSU5VWChzZXRfY3VycmVudF9zZWN1cml0eV9jb250ZXh0KE5VTEwpOykKKworCS8qIE5ldmVyIHJldHVybnMgKi8KKwlydW5fc2hlbGwob3B0X3NoZWxsLCBmbGFncyAmIFNVX09QVF9sLCBvcHRfY29tbWFuZCwgKGNvbnN0IGNoYXIqKilhcmd2KTsKKworCS8qIHJldHVybiBFWElUX0ZBSUxVUkU7IC0gbm90IHJlYWNoZWQgKi8KK30KZGlmZiAtLWdpdCBhL2xvZ2ludXRpbHMvc3Vsb2dpbi5jIGIvbG9naW51dGlscy9zdWxvZ2luLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEyOTA5OQotLS0gL2Rldi9udWxsCisrKyBiL2xvZ2ludXRpbHMvc3Vsb2dpbi5jCkBAIC0wLDAgKzEsODcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgc3Vsb2dpbiBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHN1bG9naW5fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstdCBOXSBbVFRZXSIKKy8vdXNhZ2U6I2RlZmluZSBzdWxvZ2luX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2luZ2xlIHVzZXIgbG9naW5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXQgTglUaW1lb3V0IgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXNsb2cuaD4KKworaW50IHN1bG9naW5fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHN1bG9naW5fbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCB0aW1lb3V0ID0gMDsKKwlzdHJ1Y3QgcGFzc3dkICpwd2Q7CisJY29uc3QgY2hhciAqc2hlbGw7CisKKwlsb2dtb2RlID0gTE9HTU9ERV9CT1RIOworCW9wZW5sb2coYXBwbGV0X25hbWUsIDAsIExPR19BVVRIKTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gInQrIjsgLyogLXQgTiAqLworCWdldG9wdDMyKGFyZ3YsICJ0OiIsICZ0aW1lb3V0KTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChhcmd2WzBdKSB7CisJCWNsb3NlKDApOworCQljbG9zZSgxKTsKKwkJZHVwKHhvcGVuKGFyZ3ZbMF0sIE9fUkRXUikpOworCQljbG9zZSgyKTsKKwkJZHVwKDApOworCX0KKworCS8qIE1hbGljaW91cyB1c2UgbGlrZSAic3Vsb2dpbiAvZGV2L3NkYSI/ICovCisJaWYgKCFpc2F0dHkoMCkgfHwgIWlzYXR0eSgxKSB8fCAhaXNhdHR5KDIpKSB7CisJCWxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vdCBhIHR0eSIpOworCX0KKworCS8qIENsZWFyIGRhbmdlcm91cyBzdHVmZiwgc2V0IFBBVEggKi8KKwlzYW5pdGl6ZV9lbnZfaWZfc3VpZCgpOworCisJcHdkID0gZ2V0cHd1aWQoMCk7CisJaWYgKCFwd2QpIHsKKwkJZ290byBhdXRoX2Vycm9yOworCX0KKworCXdoaWxlICgxKSB7CisJCWludCByOworCisJCXIgPSBhc2tfYW5kX2NoZWNrX3Bhc3N3b3JkX2V4dGVuZGVkKHB3ZCwgdGltZW91dCwKKwkJCSJHaXZlIHJvb3QgcGFzc3dvcmQgZm9yIHN5c3RlbSBtYWludGVuYW5jZVxuIgorCQkJIihvciB0eXBlIENvbnRyb2wtRCBmb3Igbm9ybWFsIHN0YXJ0dXApOiIKKwkJKTsKKwkJaWYgKHIgPCAwKSB7CisJCQkvKiBeRCwgXkMsIHRpbWVvdXQsIG9yIHJlYWQgZXJyb3IgKi8KKwkJCWJiX2luZm9fbXNnKCJOb3JtYWwgc3RhcnR1cCIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKHIgPiAwKSB7CisJCQlicmVhazsKKwkJfQorCQliYl9kb19kZWxheShMT0dJTl9GQUlMX0RFTEFZKTsKKwkJYmJfaW5mb19tc2coIkxvZ2luIGluY29ycmVjdCIpOworCX0KKworCWJiX2luZm9fbXNnKCJTeXN0ZW0gTWFpbnRlbmFuY2UgTW9kZSIpOworCisJSUZfU0VMSU5VWChyZW5ld19jdXJyZW50X3NlY3VyaXR5X2NvbnRleHQoKSk7CisKKwlzaGVsbCA9IGdldGVudigiU1VTSEVMTCIpOworCWlmICghc2hlbGwpCisJCXNoZWxsID0gZ2V0ZW52KCJzdXNoZWxsIik7CisJaWYgKCFzaGVsbCkKKwkJc2hlbGwgPSBwd2QtPnB3X3NoZWxsOworCisJLyogRXhlYyBsb2dpbiBzaGVsbCB3aXRoIG5vIGFkZGl0aW9uYWwgcGFyYW1ldGVycy4gTmV2ZXIgcmV0dXJucy4gKi8KKwlydW5fc2hlbGwoc2hlbGwsIDEsIE5VTEwsIE5VTEwpOworCisgYXV0aF9lcnJvcjoKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm8gcGFzc3dvcmQgZW50cnkgZm9yIHJvb3QiKTsKK30KZGlmZiAtLWdpdCBhL2xvZ2ludXRpbHMvdmxvY2suYyBiL2xvZ2ludXRpbHMvdmxvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGIxNGU2Ci0tLSAvZGV2L251bGwKKysrIGIvbG9naW51dGlscy92bG9jay5jCkBAIC0wLDAgKzEsMTE5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB2bG9jayBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBieSBzcG9vbiA8c3Bvb25AaXgubmV0Y29tLmNvbT4KKyAqIFdyaXR0ZW4gYnkgc3Bvb24gPHNwb25AaXgubmV0Y29tLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIFNob3V0eiB0byBNaWNoYWVsIEsuIEpvaG5zb24gPGpvaG5zb25tQHJlZGhhdC5jb20+LCBhdXRob3Igb2YgdGhlCisgKiBvcmlnaW5hbCB2bG9jay4gIEkgc25hZ2dlZCBhIGJ1bmNoIG9mIGhpcyBjb2RlIHRvIHdyaXRlIHRoaXMKKyAqIG1pbmltYWxpc3RpYyB2bG9jay4KKyAqLworLyogRml4ZWQgYnkgRXJpayBBbmRlcnNlbiB0byBkbyBwYXNzd29yZHMgdGhlIHRpbnlsb2dpbiB3YXkuLi4KKyAqIEl0IG5vdyB3b3JrcyB3aXRoIG1kNSwgc2hhMSwgZXRjIHBhc3N3b3Jkcy4gKi8KKworLy91c2FnZTojZGVmaW5lIHZsb2NrX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWFdIgorLy91c2FnZTojZGVmaW5lIHZsb2NrX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTG9jayBhIHZpcnR1YWwgdGVybWluYWwuIEEgcGFzc3dvcmQgaXMgcmVxdWlyZWQgdG8gdW5sb2NrLlxuIgorLy91c2FnZTogICAgICJcbgktYQlMb2NrIGFsbCBWVHMiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWZkZWYgX19saW51eF9fCisjaW5jbHVkZSA8c3lzL3Z0Lmg+CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfdnQoaW50IHNpZ25vIFVOVVNFRF9QQVJBTSkKK3sKKwkvKiBJZiAtYSwgcGFyYW0gaXMgMCwgd2hpY2ggbWVhbnM6CisJICogIm5vLCBrZXJuZWwsIHdlIGRvbid0IGFsbG93IGNvbnNvbGUgc3dpdGNoIGF3YXkgZnJvbSB1cyEiICovCisJaW9jdGwoU1RESU5fRklMRU5PLCBWVF9SRUxESVNQLCAodW5zaWduZWQgbG9uZykgIW9wdGlvbl9tYXNrMzIpOworfQorCitzdGF0aWMgdm9pZCBhY3F1aXJlX3Z0KGludCBzaWdubyBVTlVTRURfUEFSQU0pCit7CisJLyogQUNLIHRvIGtlcm5lbCB0aGF0IHN3aXRjaCB0byBjb25zb2xlIGlzIHN1Y2Nlc3NmdWwgKi8KKwlpb2N0bChTVERJTl9GSUxFTk8sIFZUX1JFTERJU1AsIFZUX0FDS0FDUSk7Cit9CisjZW5kaWYKKworaW50IHZsb2NrX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB2bG9ja19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisjaWZkZWYgX19saW51eF9fCisJc3RydWN0IHZ0X21vZGUgdnRtOworCXN0cnVjdCB2dF9tb2RlIG92dG07CisjZW5kaWYKKwlzdHJ1Y3QgdGVybWlvcyB0ZXJtOworCXN0cnVjdCB0ZXJtaW9zIG90ZXJtOworCXN0cnVjdCBwYXNzd2QgKnB3OworCisJcHcgPSB4Z2V0cHd1aWQoZ2V0dWlkKCkpOworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0wIjsgLyogbm8gcGFyYW1zISAqLworCWdldG9wdDMyKGFyZ3YsICJhIik7CisKKwkvKiBJZ25vcmUgc29tZSBzaWduYWxzIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGtpbGxlZCBieSB0aGVtICovCisJYmJfc2lnbmFscygwCisJCSsgKDEgPDwgU0lHVFNUUCkKKwkJKyAoMSA8PCBTSUdUVElOKQorCQkrICgxIDw8IFNJR1RUT1UpCisJCSsgKDEgPDwgU0lHSFVQICkKKwkJKyAoMSA8PCBTSUdDSExEKSAvKiBwYXJhbm9pYSA6KSAqLworCQkrICgxIDw8IFNJR1FVSVQpCisJCSsgKDEgPDwgU0lHSU5UICkKKwkJLCBTSUdfSUdOKTsKKworI2lmZGVmIF9fbGludXhfXworCS8qIFdlIHdpbGwgdXNlIFNJR1VTUnggZm9yIGNvbnNvbGUgc3dpdGNoIGNvbnRyb2w6ICovCisJLyogMTogc2V0IGhhbmRsZXJzICovCisJc2lnbmFsX1NBX1JFU1RBUlRfZW1wdHlfbWFzayhTSUdVU1IxLCByZWxlYXNlX3Z0KTsKKwlzaWduYWxfU0FfUkVTVEFSVF9lbXB0eV9tYXNrKFNJR1VTUjIsIGFjcXVpcmVfdnQpOworCS8qIDI6IHVubWFzayB0aGVtICovCisJc2lnX3VuYmxvY2soU0lHVVNSMSk7CisJc2lnX3VuYmxvY2soU0lHVVNSMik7CisjZW5kaWYKKworCS8qIFJldmVydCBzdGRpbi9vdXQgdG8gb3VyIGNvbnRyb2xsaW5nIHR0eQorCSAqIChvciBkaWUgaWYgd2UgaGF2ZSBub25lKSAqLworCXhtb3ZlX2ZkKHhvcGVuKENVUlJFTlRfVFRZLCBPX1JEV1IpLCBTVERJTl9GSUxFTk8pOworCXhkdXAyKFNURElOX0ZJTEVOTywgU1RET1VUX0ZJTEVOTyk7CisKKyNpZmRlZiBfX2xpbnV4X18KKwl4aW9jdGwoU1RESU5fRklMRU5PLCBWVF9HRVRNT0RFLCAmdnRtKTsKKwlvdnRtID0gdnRtOworCS8qICJjb25zb2xlIHN3aXRjaGVzIGFyZSBjb250cm9sbGVkIGJ5IHVzLCBub3Qga2VybmVsISIgKi8KKwl2dG0ubW9kZSA9IFZUX1BST0NFU1M7CisJdnRtLnJlbHNpZyA9IFNJR1VTUjE7CisJdnRtLmFjcXNpZyA9IFNJR1VTUjI7CisJaW9jdGwoU1RESU5fRklMRU5PLCBWVF9TRVRNT0RFLCAmdnRtKTsKKyNlbmRpZgorCisJdGNnZXRhdHRyKFNURElOX0ZJTEVOTywgJm90ZXJtKTsKKwl0ZXJtID0gb3Rlcm07CisJdGVybS5jX2lmbGFnICY9IH5CUktJTlQ7CisJdGVybS5jX2lmbGFnIHw9IElHTkJSSzsKKwl0ZXJtLmNfbGZsYWcgJj0gfklTSUc7CisJdGVybS5jX2xmbGFnICY9IH4oRUNITyB8IEVDSE9DVEwpOworCXRjc2V0YXR0cl9zdGRpbl9UQ1NBTk9XKCZ0ZXJtKTsKKworCXdoaWxlICgxKSB7CisJCXByaW50ZigiVmlydHVhbCBjb25zb2xlJXMgbG9ja2VkIGJ5ICVzLlxuIiwKKwkJCQkvKiAicyIgaWYgLWEsIGVsc2UgIiI6ICovICJzIiArICFvcHRpb25fbWFzazMyLAorCQkJCXB3LT5wd19uYW1lCisJCSk7CisJCWlmIChhc2tfYW5kX2NoZWNrX3Bhc3N3b3JkKHB3KSA+IDApIHsKKwkJCWJyZWFrOworCQl9CisJCWJiX2RvX2RlbGF5KExPR0lOX0ZBSUxfREVMQVkpOworCQlwdXRzKCJJbmNvcnJlY3QgcGFzc3dvcmQiKTsKKwl9CisKKyNpZmRlZiBfX2xpbnV4X18KKwlpb2N0bChTVERJTl9GSUxFTk8sIFZUX1NFVE1PREUsICZvdnRtKTsKKyNlbmRpZgorCXRjc2V0YXR0cl9zdGRpbl9UQ1NBTk9XKCZvdGVybSk7CisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChFWElUX1NVQ0NFU1MpOworfQpkaWZmIC0tZ2l0IGEvbWFpbHV0aWxzL0NvbmZpZy5zcmMgYi9tYWlsdXRpbHMvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTljNWMwCi0tLSAvZGV2L251bGwKKysrIGIvbWFpbHV0aWxzL0NvbmZpZy5zcmMKQEAgLTAsMCArMSw1NSBAQAorbWVudSAiTWFpbCBVdGlsaXRpZXMiCisKK0lOU0VSVAorCitjb25maWcgTUFLRU1JTUUKKwlib29sICJtYWtlbWltZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBDcmVhdGUgTUlNRS1mb3JtYXR0ZWQgbWVzc2FnZXMuCisKK2NvbmZpZyBGRUFUVVJFX01JTUVfQ0hBUlNFVAorCXN0cmluZyAiRGVmYXVsdCBjaGFyc2V0IgorCWRlZmF1bHQgInVzLWFzY2lpIgorCWRlcGVuZHMgb24gTUFLRU1JTUUgfHwgUkVGT1JNSU1FIHx8IFNFTkRNQUlMCisJaGVscAorCSAgRGVmYXVsdCBjaGFyc2V0IG9mIHRoZSBtZXNzYWdlLgorCitjb25maWcgUE9QTUFJTERJUgorCWJvb2wgInBvcG1haWxkaXIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2ltcGxlIHlldCBwb3dlcmZ1bCBQT1AzIG1haWwgcG9wcGVyLiBEZWxpdmVycyBjb250ZW50CisJICBvZiByZW1vdGUgbWFpbGJveGVzIHRvIGxvY2FsIE1haWxkaXIuCisKK2NvbmZpZyBGRUFUVVJFX1BPUE1BSUxESVJfREVMSVZFUlkKKwlib29sICJBbGxvdyBtZXNzYWdlIGZpbHRlcnMgYW5kIGN1c3RvbSBkZWxpdmVyeSBwcm9ncmFtIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gUE9QTUFJTERJUgorCWhlbHAKKwkgIEFsbG93IHRvIHVzZSBhIGN1c3RvbSBwcm9ncmFtIHRvIGZpbHRlciB0aGUgY29udGVudAorCSAgb2YgdGhlIG1lc3NhZ2UgYmVmb3JlIGFjdHVhbCBkZWxpdmVyeSAoLUYgInByb2cgW2FyZ3MuLi5dIikuCisJICBBbGxvdyB0byB1c2UgYSBjdXN0b20gcHJvZ3JhbSBmb3IgbWVzc2FnZSBhY3R1YWwgZGVsaXZlcnkKKwkgICgtTSAicHJvZyBbYXJncy4uLl0iKS4KKworY29uZmlnIFJFRk9STUlNRQorCWJvb2wgInJlZm9ybWltZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBQYXJzZSBNSU1FLWZvcm1hdHRlZCBtZXNzYWdlcy4KKworY29uZmlnIEZFQVRVUkVfUkVGT1JNSU1FX0NPTVBBVAorCWJvb2wgIkFjY2VwdCBhbmQgaWdub3JlIG9wdGlvbnMgb3RoZXIgdGhhbiAteCBhbmQgLVgiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBSRUZPUk1JTUUKKwloZWxwCisJICBBY2NlcHQgKGZvciBjb21wYXRpYmlsaXR5IG9ubHkpIGFuZCBpZ25vcmUgb3B0aW9ucworCSAgb3RoZXIgdGhhbiAteCBhbmQgLVguCisKK2NvbmZpZyBTRU5ETUFJTAorCWJvb2wgInNlbmRtYWlsIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEJhcmVib25lcyBzZW5kbWFpbC4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvbWFpbHV0aWxzL0tidWlsZC5zcmMgYi9tYWlsdXRpbHMvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjRmYjc0Ci0tLSAvZGV2L251bGwKKysrIGIvbWFpbHV0aWxzL0tidWlsZC5zcmMKQEAgLTAsMCArMSw5IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKZGlmZiAtLWdpdCBhL21haWx1dGlscy9tYWlsLmMgYi9tYWlsdXRpbHMvbWFpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZTQzYzAKLS0tIC9kZXYvbnVsbAorKysgYi9tYWlsdXRpbHMvbWFpbC5jCkBAIC0wLDAgKzEsMTgzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBoZWxwZXIgcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgIm1haWwuaCIKKworc3RhdGljIHZvaWQga2lsbF9oZWxwZXIodm9pZCkKK3sKKwlpZiAoRy5oZWxwZXJfcGlkID4gMCkgeworCQlraWxsKEcuaGVscGVyX3BpZCwgU0lHVEVSTSk7CisJCUcuaGVscGVyX3BpZCA9IDA7CisJfQorfQorCisvLyBnZW5lcmljIHNpZ25hbCBoYW5kbGVyCitzdGF0aWMgdm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnbm8pCit7CisjZGVmaW5lIGVyciBzaWdubworCWlmIChTSUdBTFJNID09IHNpZ25vKSB7CisJCWtpbGxfaGVscGVyKCk7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0aW1lZCBvdXQiKTsKKwl9CisKKwkvLyBTSUdDSExELiByZWFwIHpvbWJpZXMKKwlpZiAoc2FmZV93YWl0cGlkKEcuaGVscGVyX3BpZCwgJmVyciwgV05PSEFORykgPiAwKSB7CisJCWlmIChXSUZTSUdOQUxFRChlcnIpKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImhlbHBlciBraWxsZWQgYnkgc2lnbmFsICV1IiwgV1RFUk1TSUcoZXJyKSk7CisJCWlmIChXSUZFWElURUQoZXJyKSkgeworCQkJRy5oZWxwZXJfcGlkID0gMDsKKwkJCWlmIChXRVhJVFNUQVRVUyhlcnIpKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJoZWxwZXIgZXhpdGVkICgldSkiLCBXRVhJVFNUQVRVUyhlcnIpKTsKKwkJfQorCX0KKyN1bmRlZiBlcnIKK30KKwordm9pZCBGQVNUX0ZVTkMgbGF1bmNoX2hlbHBlcihjb25zdCBjaGFyICoqYXJndikKK3sKKwkvLyBzZXR1cCB2YW5pbGxhIHVuaWRpcmVjdGlvbmFsIHBpcGVzIGludGVyY2hhbmdlCisJaW50IGk7CisJaW50IHBpcGVzWzRdOworCisJeHBpcGUocGlwZXMpOworCXhwaXBlKHBpcGVzICsgMik7CisKKwkvLyBOQjogaGFuZGxlciBtdXN0IGJlIGluc3RhbGxlZCBiZWZvcmUgdmZvcmsKKwliYl9zaWduYWxzKDAKKwkJKyAoMSA8PCBTSUdDSExEKQorCQkrICgxIDw8IFNJR0FMUk0pCisJCSwgc2lnbmFsX2hhbmRsZXIpOworCisJRy5oZWxwZXJfcGlkID0geHZmb3JrKCk7CisKKwlpID0gKCFHLmhlbHBlcl9waWQpICogMjsgLy8gZm9yIHBhcmVudDowLCBmb3IgY2hpbGQ6MgorCWNsb3NlKHBpcGVzW2kgKyAxXSk7ICAgICAvLyAxIG9yIDMgLSBjbG9zaW5nIG9uZSB3cml0ZSBlbmQKKwljbG9zZShwaXBlc1syIC0gaV0pOyAgICAgLy8gMiBvciAwIC0gY2xvc2luZyBvbmUgcmVhZCBlbmQKKwl4bW92ZV9mZChwaXBlc1tpXSwgU1RESU5fRklMRU5PKTsgICAgICAvLyAwIG9yIDIgLSB1c2luZyBvdGhlciByZWFkIGVuZAorCXhtb3ZlX2ZkKHBpcGVzWzMgLSBpXSwgU1RET1VUX0ZJTEVOTyk7IC8vIDMgb3IgMSAtIHVzaW5nIG90aGVyIHdyaXRlIGVuZAorCS8vIEVuZCByZXN1bHQ6CisJLy8gcGFyZW50IHN0ZG91dCBbM10gLT4gY2hpbGQgc3RkaW4gWzJdCisJLy8gY2hpbGQgc3Rkb3V0IFsxXSAtPiBwYXJlbnQgc3RkaW4gWzBdCisKKwlpZiAoIUcuaGVscGVyX3BpZCkgeworCQkvLyBjaGlsZDogdHJ5IHRvIGV4ZWN1dGUgY29ubmVjdGlvbiBoZWxwZXIKKwkJLy8gTkI6IFNJR0NITEQgJiBTSUdBTFJNIHJldmVydCB0byBTSUdfREZMIG9uIGV4ZWMKKwkJQkJfRVhFQ1ZQX29yX2RpZSgoY2hhcioqKWFyZ3YpOworCX0KKworCS8vIHBhcmVudAorCS8vIGNoZWNrIHdoZXRoZXIgY2hpbGQgaXMgYWxpdmUKKwkvL3JlZHVuZGFudDpzaWduYWxfaGFuZGxlcihTSUdDSExEKTsKKwkvLyBjaGlsZCBzZWVtcyBPSyAtPiBwYXJlbnQgZ29lcyBvbgorCWF0ZXhpdChraWxsX2hlbHBlcik7Cit9CisKK2NoYXIqIEZBU1RfRlVOQyBzZW5kX21haWxfY29tbWFuZChjb25zdCBjaGFyICpmbXQsIGNvbnN0IGNoYXIgKnBhcmFtKQoreworCWNoYXIgKm1zZzsKKwlpZiAodGltZW91dCkKKwkJYWxhcm0odGltZW91dCk7CisJbXNnID0gKGNoYXIqKWZtdDsKKwlpZiAoZm10KSB7CisJCW1zZyA9IHhhc3ByaW50ZihmbXQsIHBhcmFtKTsKKwkJaWYgKHZlcmJvc2UpCisJCQliYl9lcnJvcl9tc2coInNlbmQ6JyVzJyIsIG1zZyk7CisJCXByaW50ZigiJXNcclxuIiwgbXNnKTsKKwl9CisJZmZsdXNoX2FsbCgpOworCXJldHVybiBtc2c7Cit9CisKKy8vIE5COiBwYXJzZV91cmwgY2FuIG1vZGlmeSB1cmxbXSAoZGVzcGl0ZSBjb25zdCksIGJ1dCBvbmx5IGlmICdAJyBpcyB0aGVyZQorLyoKK3N0YXRpYyBjaGFyKiBGQVNUX0ZVTkMgcGFyc2VfdXJsKGNoYXIgKnVybCwgY2hhciAqKnVzZXIsIGNoYXIgKipwYXNzKQoreworCS8vIHBhcnNlIFt1c2VyWzpwYXNzXUBdaG9zdAorCS8vIHJldHVybiBob3N0CisJY2hhciAqcyA9IHN0cmNocih1cmwsICdAJyk7CisJKnVzZXIgPSAqcGFzcyA9IE5VTEw7CisJaWYgKHMpIHsKKwkJKnMrKyA9ICdcMCc7CisJCSp1c2VyID0gdXJsOworCQl1cmwgPSBzOworCQlzID0gc3RyY2hyKCp1c2VyLCAnOicpOworCQlpZiAocykgeworCQkJKnMrKyA9ICdcMCc7CisJCQkqcGFzcyA9IHM7CisJCX0KKwl9CisJcmV0dXJuIHVybDsKK30KKyovCisKK3ZvaWQgRkFTVF9GVU5DIGVuY29kZV9iYXNlNjQoY2hhciAqZm5hbWUsIGNvbnN0IGNoYXIgKnRleHQsIGNvbnN0IGNoYXIgKmVvbCkKK3sKKwllbnVtIHsKKwkJU1JDX0JVRl9TSVpFID0gNTcsICAvKiBUaGlzICpNVVNUKiBiZSBhIG11bHRpcGxlIG9mIDMgKi8KKwkJRFNUX0JVRl9TSVpFID0gNCAqICgoU1JDX0JVRl9TSVpFICsgMikgLyAzKSwKKwl9OworI2RlZmluZSBzcmNfYnVmIHRleHQKKwljaGFyIHNyY1tTUkNfQlVGX1NJWkVdOworCUZJTEUgKmZwID0gZnA7CisJc3NpemVfdCBsZW4gPSBsZW47CisJY2hhciBkc3RfYnVmW0RTVF9CVUZfU0laRSArIDFdOworCisJaWYgKGZuYW1lKSB7CisJCWZwID0gKE5PVF9MT05FX0RBU0goZm5hbWUpKSA/IHhmb3Blbl9mb3JfcmVhZChmbmFtZSkgOiAoRklMRSAqKXRleHQ7CisJCXNyY19idWYgPSBzcmM7CisJfSBlbHNlIGlmICh0ZXh0KSB7CisJCS8vIHRob3VnaCB3ZSBkbyBub3QgY2FsbCB1dWVuY29kZShOVUxMLCBOVUxMKSBleHBsaWNpdGx5CisJCS8vIHN0aWxsIHdlIGRvIG5vdCB3YW50IHRvIGJyZWFrIHRoaW5ncyBzdWRkZW5seQorCQlsZW4gPSBzdHJsZW4odGV4dCk7CisJfSBlbHNlCisJCXJldHVybjsKKworCXdoaWxlICgxKSB7CisJCXNpemVfdCBzaXplOworCQlpZiAoZm5hbWUpIHsKKwkJCXNpemUgPSBmcmVhZCgoY2hhciAqKXNyY19idWYsIDEsIFNSQ19CVUZfU0laRSwgZnApOworCQkJaWYgKChzc2l6ZV90KXNpemUgPCAwKQorCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfcmVhZF9lcnJvcik7CisJCX0gZWxzZSB7CisJCQlzaXplID0gbGVuOworCQkJaWYgKGxlbiA+IFNSQ19CVUZfU0laRSkKKwkJCQlzaXplID0gU1JDX0JVRl9TSVpFOworCQl9CisJCWlmICghc2l6ZSkKKwkJCWJyZWFrOworCQkvLyBlbmNvZGUgdGhlIGJ1ZmZlciB3ZSBqdXN0IHJlYWQgaW4KKwkJYmJfdXVlbmNvZGUoZHN0X2J1Ziwgc3JjX2J1Ziwgc2l6ZSwgYmJfdXVlbmNfdGJsX2Jhc2U2NCk7CisJCWlmIChmbmFtZSkgeworCQkJcHV0cyhlb2wpOworCQl9IGVsc2UgeworCQkJc3JjX2J1ZiArPSBzaXplOworCQkJbGVuIC09IHNpemU7CisJCX0KKwkJZndyaXRlKGRzdF9idWYsIDEsIDQgKiAoKHNpemUgKyAyKSAvIDMpLCBzdGRvdXQpOworCX0KKwlpZiAoZm5hbWUgJiYgTk9UX0xPTkVfREFTSChmbmFtZSkpCisJCWZjbG9zZShmcCk7CisjdW5kZWYgc3JjX2J1ZgorfQorCisvKgorICogZ2V0IHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmcm9tIGEgZmlsZSBkZXNjcmlwdG9yCisgKi8KK3ZvaWQgRkFTVF9GVU5DIGdldF9jcmVkX29yX2RpZShpbnQgZmQpCit7CisJaWYgKGlzYXR0eShmZCkpIHsKKwkJRy51c2VyID0geHN0cmR1cChiYl9hc2soZmQsIC8qIHRpbWVvdXQ6ICovIDAsICJVc2VyOiAiKSk7CisJCUcucGFzcyA9IHhzdHJkdXAoYmJfYXNrKGZkLCAvKiB0aW1lb3V0OiAqLyAwLCAiUGFzc3dvcmQ6ICIpKTsKKwl9IGVsc2UgeworCQlHLnVzZXIgPSB4bWFsbG9jX3JlYWRzKGZkLCAvKiBtYXhzaXplOiAqLyBOVUxMKTsKKwkJRy5wYXNzID0geG1hbGxvY19yZWFkcyhmZCwgLyogbWF4c2l6ZTogKi8gTlVMTCk7CisJfQorCWlmICghRy51c2VyIHx8ICEqRy51c2VyIHx8ICFHLnBhc3MpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyB1c2VybmFtZSBvciBwYXNzd29yZCIpOworfQpkaWZmIC0tZ2l0IGEvbWFpbHV0aWxzL21haWwuaCBiL21haWx1dGlscy9tYWlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEwYzViMwotLS0gL2Rldi9udWxsCisrKyBiL21haWx1dGlscy9tYWlsLmgKQEAgLTAsMCArMSwzNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaGVscGVyIHJvdXRpbmVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlwaWRfdCBoZWxwZXJfcGlkOworCXVuc2lnbmVkIHRpbWVvdXQ7CisJdW5zaWduZWQgdmVyYm9zZTsKKwl1bnNpZ25lZCBvcHRzOworCWNoYXIgKnVzZXI7CisJY2hhciAqcGFzczsKKwlGSUxFICpmcDA7IC8vIGluaXRpYWwgc3RkaW4KKwljaGFyICpvcHRfY2hhcnNldDsKK307CisKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSB0aW1lb3V0ICAgICAgICAgKEcudGltZW91dCAgKQorI2RlZmluZSB2ZXJib3NlICAgICAgICAgKEcudmVyYm9zZSAgKQorI2RlZmluZSBvcHRzICAgICAgICAgICAgKEcub3B0cyAgICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorCUcub3B0X2NoYXJzZXQgPSAoY2hhciAqKUNPTkZJR19GRUFUVVJFX01JTUVfQ0hBUlNFVDsgXAorfSB3aGlsZSAoMCkKKworLy9jaGFyIEZBU1RfRlVOQyAqcGFyc2VfdXJsKGNoYXIgKnVybCwgY2hhciAqKnVzZXIsIGNoYXIgKipwYXNzKTsKKwordm9pZCBsYXVuY2hfaGVscGVyKGNvbnN0IGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7Cit2b2lkIGdldF9jcmVkX29yX2RpZShpbnQgZmQpIEZBU1RfRlVOQzsKKworY2hhciAqc2VuZF9tYWlsX2NvbW1hbmQoY29uc3QgY2hhciAqZm10LCBjb25zdCBjaGFyICpwYXJhbSkgRkFTVF9GVU5DOworCit2b2lkIGVuY29kZV9iYXNlNjQoY2hhciAqZm5hbWUsIGNvbnN0IGNoYXIgKnRleHQsIGNvbnN0IGNoYXIgKmVvbCkgRkFTVF9GVU5DOwpkaWZmIC0tZ2l0IGEvbWFpbHV0aWxzL21ha2VtaW1lLmMgYi9tYWlsdXRpbHMvbWFrZW1pbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGFkZDcxCi0tLSAvZGV2L251bGwKKysrIGIvbWFpbHV0aWxzL21ha2VtaW1lLmMKQEAgLTAsMCArMSwyMzkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIG1ha2VtaW1lOiBjcmVhdGUgTUlNRS1lbmNvZGVkIG1lc3NhZ2UKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX01BS0VNSU1FKSArPSBtYWtlbWltZS5vIG1haWwubworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJtYWlsLmgiCisKKyNpZiAwCisjIGRlZmluZSBkYmdfZXJyb3JfbXNnKC4uLikgYmJfZXJyb3JfbXNnKF9fVkFfQVJHU19fKQorI2Vsc2UKKyMgZGVmaW5lIGRiZ19lcnJvcl9tc2coLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorCisvKgorICBtYWtlbWltZSAtYyB0eXBlIFstbyBmaWxlXSBbLWUgZW5jb2RpbmddIFstQyBjaGFyc2V0XSBbLU4gbmFtZV0gXAorICAgICAgICAgICAgICAgICAgIFstYSAiSGVhZGVyOiBDb250ZW50cyJdIGZpbGUKKyAgICAgICAgICAgLW0gWyB0eXBlIF0gWy1vIGZpbGVdIFstZSBlbmNvZGluZ10gWy1hICJIZWFkZXI6IENvbnRlbnRzIl0gZmlsZQorICAgICAgICAgICAtaiBbLW8gZmlsZV0gZmlsZTEgZmlsZTIKKyAgICAgICAgICAgQGZpbGUKKworICAgZmlsZTogIGZpbGVuYW1lICAgIC0gcmVhZCBvciB3cml0ZSBmcm9tIGZpbGVuYW1lCisgICAgICAgICAgLSAgICAgICAgICAgLSByZWFkIG9yIHdyaXRlIGZyb20gc3RkaW4gb3Igc3Rkb3V0CisgICAgICAgICAgJm4gICAgICAgICAgLSByZWFkIG9yIHdyaXRlIGZyb20gZmlsZSBkZXNjcmlwdG9yIG4KKyAgICAgICAgICBcKCBvcHRzIFwpICAtIHJlYWQgZnJvbSBjaGlsZCBwcm9jZXNzLCB0aGF0IGdlbmVyYXRlcyBbIG9wdHMgXQorCitPcHRpb25zOgorICAtYyB0eXBlICAgICAgICAgLSBjcmVhdGUgYSBuZXcgTUlNRSBzZWN0aW9uIGZyb20gImZpbGUiIHdpdGggdGhpcworICAgICAgICAgICAgICAgICAgICBDb250ZW50LVR5cGU6IChkZWZhdWx0IGlzIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSkuCisgIC1DIGNoYXJzZXQgICAgICAtIE1JTUUgY2hhcnNldCBvZiBhIG5ldyB0ZXh0L3BsYWluIHNlY3Rpb24uCisgIC1OIG5hbWUgICAgICAgICAtIE1JTUUgY29udGVudCBuYW1lIG9mIHRoZSBuZXcgbWltZSBzZWN0aW9uLgorICAtbSBbIHR5cGUgXSAgICAgLSBjcmVhdGUgYSBtdWx0aXBhcnQgbWltZSBzZWN0aW9uIGZyb20gImZpbGUiIG9mIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgQ29udGVudC1UeXBlOiAoZGVmYXVsdCBpcyBtdWx0aXBhcnQvbWl4ZWQpLgorICAtZSBlbmNvZGluZyAgICAgLSB1c2UgdGhlIGdpdmVuIGVuY29kaW5nICg3Yml0LCA4Yml0LCBxdW90ZWQtcHJpbnRhYmxlLAorICAgICAgICAgICAgICAgICAgICBvciBiYXNlNjQpLCBpbnN0ZWFkIG9mIGd1ZXNzaW5nLiAgT21pdCAiLWUiIGFuZCB1c2UKKyAgICAgICAgICAgICAgICAgICAgLWMgYXV0byB0byBzZXQgQ29udGVudC1UeXBlOiB0byB0ZXh0L3BsYWluIG9yCisgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSBiYXNlZCBvbiBwaWNrZWQgZW5jb2RpbmcuCisgIC1qIGZpbGUxIGZpbGUyICAtIGpvaW4gbWltZSBzZWN0aW9uIGZpbGUyIHRvIG11bHRpcGFydCBzZWN0aW9uIGZpbGUxLgorICAtbyBmaWxlICAgICAgICAgLSB3cml0ZSB0aGUgcmVzdWx0IHRvIGZpbGUsIGluc3RlYWQgb2Ygc3Rkb3V0IChub3QKKyAgICAgICAgICAgICAgICAgICAgYWxsb3dlZCBpbiBjaGlsZCBwcm9jZXNzZXMpLgorICAtYSBoZWFkZXIgICAgICAgLSBwcmVwZW5kIGFuIGFkZGl0aW9uYWwgaGVhZGVyIHRvIHRoZSBvdXRwdXQuCisKKyAgQGZpbGUgLSByZWFkIGFsbCBvZiB0aGUgYWJvdmUgb3B0aW9ucyBmcm9tIGZpbGUsIG9uZSBvcHRpb24gb3IKKyAgICAgICAgICB2YWx1ZSBvbiBlYWNoIGxpbmUuCisgIHt3aGljaCB2ZXJzaW9uIG9mIG1ha2VtaW1lIGlzIHRoaXM/IFdoYXQgZG8gd2Ugc3VwcG9ydD99CisqLworLyogbWFuIG1ha2VtaW1lOgorCisgKiAtYyBUWVBFOiBjcmVhdGUgYSAobm9uLW11bHRpcGFydCkgTUlNRSBzZWN0aW9uIHdpdGggQ29udGVudC1UeXBlOiBUWVBFCisgKiBtYWtlbWltZSAtYyBUWVBFIFstZSBFTkNPRElOR10gWy1vIE9VVEZJTEVdIFstQyBDSEFSU0VUXSBbLU4gTkFNRV0gWy1hIEhFQURFUi4uLl0gRklMRQorICogVGhlIC1DIG9wdGlvbiBzZXRzIHRoZSBNSU1FIGNoYXJzZXQgYXR0cmlidXRlIGZvciB0ZXh0L3BsYWluIGNvbnRlbnQuCisgKiBUaGUgLU4gb3B0aW9uIHNldHMgdGhlIG5hbWUgYXR0cmlidXRlIGZvciBDb250ZW50LVR5cGU6CisgKiBFbmNvZGluZyBtdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOiA3Yml0LCA4Yml0LCBxdW90ZWQtcHJpbnRhYmxlLCBvciBiYXNlNjQuCisKKyAqIC1tIG11bHRpcGFydC9UWVBFOiBjcmVhdGUgYSBtdWx0aXBhcnQgTUlNRSBjb2xsZWN0aW9uIHdpdGggQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvVFlQRQorICogbWFrZW1pbWUgLW0gbXVsdGlwYXJ0L1RZUEUgWy1lIEVOQ09ESU5HXSBbLW8gT1VURklMRV0gWy1hIEhFQURFUi4uLl0gRklMRQorICogVHlwZSBtdXN0IGJlIGVpdGhlciAibXVsdGlwYXJ0L21peGVkIiwgIm11bHRpcGFydC9hbHRlcm5hdGl2ZSIsIG9yIHNvbWUgb3RoZXIgTUlNRSBtdWx0aXBhcnQgY29udGVudCB0eXBlLgorICogQWRkaXRpb25hbGx5LCBlbmNvZGluZyBjYW4gb25seSBiZSAiN2JpdCIgb3IgIjhiaXQiLCBhbmQgd2lsbCBkZWZhdWx0IHRvICI4Yml0IiBpZiBub3Qgc3BlY2lmaWVkLgorICogRmluYWxseSwgZmlsZW5hbWUgbXVzdCBiZSBhIE1JTUUtZm9ybWF0dGVkIHNlY3Rpb24sIE5PVCBhIHJlZ3VsYXIgZmlsZS4KKyAqIFRoZSAtbSBvcHRpb24gY3JlYXRlcyBhbiBpbml0aWFsIG11bHRpcGFydCBNSU1FIGNvbGxlY3Rpb24sIHRoYXQgY29udGFpbnMgb25seSBvbmUgTUlNRSBzZWN0aW9uLCB0YWtlbiBmcm9tIGZpbGVuYW1lLgorICogVGhlIGNvbGxlY3Rpb24gaXMgd3JpdHRlbiB0byBzdGFuZGFyZCBvdXRwdXQsIG9yIHRoZSBwaXBlIG9yIHRvIG91dHB1dGZpbGUuCisKKyAqIC1qIEZJTEUxOiBhZGQgYSBzZWN0aW9uIHRvIGEgbXVsdGlwYXJ0IE1JTUUgY29sbGVjdGlvbgorICogbWFrZW1pbWUgLWogRklMRTEgWy1vIE9VVEZJTEVdIEZJTEUyCisgKiBGSUxFMSBtdXN0IGJlIGEgTUlNRSBjb2xsZWN0aW9uIHRoYXQgd2FzIHByZXZpb3VzbHkgY3JlYXRlZCBieSB0aGUgLW0gb3B0aW9uLgorICogRklMRTIgbXVzdCBiZSBhIE1JTUUgc2VjdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IGNyZWF0ZWQgYnkgdGhlIC1jIG9wdGlvbi4KKyAqIFRoZSAtaiBvcHRpb25zIGFkZHMgdGhlIE1JTUUgc2VjdGlvbiBpbiBGSUxFMiB0byB0aGUgTUlNRSBjb2xsZWN0aW9uIGluIEZJTEUxLgorICovCisKKworLyogSW4gYnVzeWJveCAxLjE1LjAuc3ZuLCBtYWtlbWltZSBnZW5lcmF0ZXMgb3V0cHV0IGxpa2UgdGhpcworICogKGVtcHR5IGxpbmVzIGFyZSBzaG93biBleGFjdGx5ISk6Cit7aGVhZGVycyBhZGRlZCB3aXRoIC1hIEhEUn0KK01pbWUtVmVyc2lvbjogMS4wCitDb250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9IjI0MjY5NTM0LTIxNDU1ODM0NDgtMTY1NTg5MDY3NiIKKworLS0yNDI2OTUzNC0yMTQ1NTgzNDQ4LTE2NTU4OTA2NzYKK0NvbnRlbnQtVHlwZToge3NldCBieSAtYywgZS5nLiB0ZXh0L3BsYWlufTsgY2hhcnNldD17c2V0IGJ5IC1DLCBlLmcuIHVzLWFzY2lpfQorQ29udGVudC1EaXNwb3NpdGlvbjogaW5saW5lOyBmaWxlbmFtZT0iQSIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NAorCisuLi5maWxlIEEgY29udGVudHMuLi4KKy0tMjQyNjk1MzQtMjE0NTU4MzQ0OC0xNjU1ODkwNjc2CitDb250ZW50LVR5cGU6IHtzZXQgYnkgLWMsIGUuZy4gdGV4dC9wbGFpbn07IGNoYXJzZXQ9e3NldCBieSAtQywgZS5nLiB1cy1hc2NpaX0KK0NvbnRlbnQtRGlzcG9zaXRpb246IGlubGluZTsgZmlsZW5hbWU9IkIiCitDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiBiYXNlNjQKKworLi4uZmlsZSBCIGNvbnRlbnRzLi4uCistLTI0MjY5NTM0LTIxNDU1ODM0NDgtMTY1NTg5MDY3Ni0tCisKKyAqCisgKiBGb3IgcmVmZXJlbmNlOiBoZXJlIGlzIGFuIGV4YW1wbGUgZW1haWwgdG8gTEtNTCB3aGljaCBoYXMKKyAqIDFzdCB1bm5hbWVkIHBhcnQgKHNvIGl0IHNlcnZlcyBhcyBhbiBlbWFpbCBib2R5KQorICogYW5kIG9uZSBhdHRhY2hlZCBmaWxlOgorLi4ub3RoZXIgaGVhZGVycy4uLgorQ29udGVudC1UeXBlOiBtdWx0aXBhcnQvbWl4ZWQ7IGJvdW5kYXJ5PSI9LXRPZlRmM2J5T1MwdlpneEVXY1grIgorLi4ub3RoZXIgaGVhZGVycy4uLgorTWltZS1WZXJzaW9uOiAxLjAKKy4uLm90aGVyIGhlYWRlcnMuLi4KKworCistLT0tdE9mVGYzYnlPUzB2Wmd4RVdjWCsKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZzogN2JpdAorCisuLi5lbWFpbCB0ZXh0Li4uCisuLi5lbWFpbCB0ZXh0Li4uCisKKworLS09LXRPZlRmM2J5T1MwdlpneEVXY1grCitDb250ZW50LURpc3Bvc2l0aW9uOiBhdHRhY2htZW50OyBmaWxlbmFtZT0ieHl6IgorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluOyBuYW1lPSJ4eXoiOyBjaGFyc2V0PSJVVEYtOCIKK0NvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IDdiaXQKKworLi4uZmlsZSBjb250ZW50cy4uLgorLi4uZmlsZSBjb250ZW50cy4uLgorCistLT0tdE9mVGYzYnlPUzB2Wmd4RVdjWCstLQorCisuLi5yYW5kb20ganVuayBhZGRlZCBieSBtYWlsaW5nIGxpc3Qgcm9ib3RzIGFuZCBzdWNoLi4uCisqLworCisvL3VzYWdlOiNkZWZpbmUgbWFrZW1pbWVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgbWFrZW1pbWVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDcmVhdGUgbXVsdGlwYXJ0IE1JTUUtZW5jb2RlZCBtZXNzYWdlIGZyb20gRklMRXNcbiIKKy8qIC8vdXNhZ2U6ICAgICJUcmFuc2ZlciBlbmNvZGluZyBpcyBiYXNlNjQsIGRpc3Bvc2l0aW9uIGlzIGlubGluZSAobm90IGF0dGFjaG1lbnQpXG4iICovCisvL3VzYWdlOiAgICAgIlxuCS1vIEZJTEUJT3V0cHV0LiBEZWZhdWx0OiBzdGRvdXQiCisvL3VzYWdlOiAgICAgIlxuCS1hIEhEUglBZGQgaGVhZGVyKHMpLiBFeGFtcGxlczoiCisvL3VzYWdlOiAgICAgIlxuCQlcIkZyb206IHVzZXJAaG9zdC5vcmdcIiwgXCJEYXRlOiBgZGF0ZSAtUmBcIiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMgQ1QJQ29udGVudCB0eXBlLiBEZWZhdWx0OiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iCisvL3VzYWdlOiAgICAgIlxuCS1DIENTCUNoYXJzZXQuIERlZmF1bHQ6ICIgQ09ORklHX0ZFQVRVUkVfTUlNRV9DSEFSU0VUCisvKiAvL3VzYWdlOiAgIlxuCS1lIEVOQwlUcmFuc2ZlciBlbmNvZGluZy4gSWdub3JlZC4gYmFzZTY0IGlzIGFzc3VtZWQiICovCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbk90aGVyIG9wdGlvbnMgYXJlIHNpbGVudGx5IGlnbm9yZWQiCisKKy8qCisgKiAtYyBbQ29udGVudC1UeXBlXSBzaG91bGQgY3JlYXRlIGp1c3Qgb25lIE1JTUUgc2VjdGlvbgorICogd2l0aCAiQ29udGVudC1UeXBlOiIsICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiIsIGFuZCBIRFJzIGZyb20gIi1hIEhEUiIuCisgKiBOQjogd2l0aG91dCAiQ29udGVudC1EaXNwb3NpdGlvbjoiIGF1dG8tYWRkZWQsIHVubGlrZSB3ZSBkbyBub3cKKyAqIE5CMjogLWMgaGFzICpvcHRpb25hbCogcGFyYW0gd2hpY2ggbmV2ZXJ0aGVsZXNzIF9jYW5fIGJlIHNwZWNpZmllZCBhZnRlciBhIHNwYWNlIDooCisgKgorICogLW0gW211bHRpcGFydC9taXhlZF0gc2hvdWxkIGNyZWF0ZSBtdWx0aXBhcnQgTUlNRSBzZWN0aW9uCisgKiB3aXRoICJDb250ZW50LVR5cGU6IiwgIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IiwgYW5kIEhEUnMgZnJvbSAiLWEgSERSIiwKKyAqIGFuZCBhZGQgRklMRSB0byBpdCBfdmVyYmF0aW1fOgorICogIEhFQURFUlMKKyAqCisgKiAgLS09XzFfMTMyMTcwOTExMl8xNjA1CisgKiAgRklMRV9DT05URU5UUworICogIC0tPV8xXzEzMjE3MDkxMTJfMTYwNQorICogd2l0aG91dCBhbnkgZW5jb2Rpbmcgb2YgRklMRV9DT05URU5UUy4gKEJhc2ljYWxseSwgaXQgZXhwZWN0cyB0aGF0IEZJTEUKKyAqIGlzIHRoZSByZXN1bHQgb2YgIm1ha2VtaW1lIC1jIikuCisgKgorICogLWogTVVMVElQQVJUX0ZJTEUxIFNJTkdMRV9GSUxFMiBzaG91bGQgb3V0cHV0IE1VTFRJUEFSVF9GSUxFMSArIFNJTkdMRV9GSUxFMgorICoKKyAqIE91ciBjdXJyZW50IGJlaGF2aW9yIGlzIGEgbXV0YW50ICItbSArIC1jICsgLWoiIG9uZTogd2UgY3JlYXRlIG11bHRpcGFydCBNSU1FCisgKiBhbmQgd2UgcHV0ICItYyIgZW5jb2RlZCBGSUxFcyBpbnRvIG1hbnkgbXVsdGlwYXJ0IHNlY3Rpb25zLgorICovCisKK2ludCBtYWtlbWltZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbWFrZW1pbWVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWxsaXN0X3QgKm9wdF9oZWFkZXJzID0gTlVMTCwgKmw7CisJY29uc3QgY2hhciAqb3B0X291dHB1dDsKKwljb25zdCBjaGFyICpjb250ZW50X3R5cGUgPSAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIjsKKyNkZWZpbmUgYm91bmRhcnkgb3B0X291dHB1dAorCWVudW0geworCQlPUFRfYyA9IDEgPDwgMCwgICAgICAgICAvLyBjcmVhdGUgKG5vbi1tdWx0aXBhcnQpIHNlY3Rpb24KKwkJT1BUX2UgPSAxIDw8IDEsICAgICAgICAgLy8gQ29udGVudC1UcmFuc2Zlci1FbmNvZGluZy4gSWdub3JlZC4gQXNzdW1lZCBiYXNlNjQKKwkJT1BUX28gPSAxIDw8IDIsICAgICAgICAgLy8gb3V0cHV0IHRvCisJCU9QVF9DID0gMSA8PCAzLCAgICAgICAgIC8vIGNoYXJzZXQKKwkJT1BUX04gPSAxIDw8IDQsICAgICAgICAgLy8gQ09NUEFUCisJCU9QVF9hID0gMSA8PCA1LCAgICAgICAgIC8vIGFkZGl0aW9uYWwgaGVhZGVycworCQkvL09QVF9tID0gMSA8PCA2LCAgICAgICAgIC8vIGNyZWF0ZSBtdXRpcGFydCBzZWN0aW9uCisJCS8vT1BUX2ogPSAxIDw8IDcsICAgICAgICAgLy8gam9pbiBzZWN0aW9uIHRvIG11bHRpcGFydCBzZWN0aW9uCisJfTsKKworCUlOSVRfRygpOworCisJLy8gcGFyc2Ugb3B0aW9ucworCW9wdF9jb21wbGVtZW50YXJ5ID0gImE6OiI7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsCisJCSJjOmU6bzpDOk46YToiLCAvLyAibTpqOiIsCisJCSZjb250ZW50X3R5cGUsIE5VTEwsICZvcHRfb3V0cHV0LCAmRy5vcHRfY2hhcnNldCwgTlVMTCwgJm9wdF9oZWFkZXJzIC8vLCBOVUxMLCBOVUxMCisJKTsKKwkvL2FyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCisJLy8gcmVzcGVjdCAtbyBvdXRwdXQKKwlpZiAob3B0cyAmIE9QVF9vKQorCQlmcmVvcGVuKG9wdF9vdXRwdXQsICJ3Iiwgc3Rkb3V0KTsKKworCS8vIG5vIGZpbGVzIGdpdmVuIG9uIGNvbW1hbmQgbGluZT8gLT4gdXNlIHN0ZGluCisJaWYgKCEqYXJndikKKwkJKi0tYXJndiA9IChjaGFyICopIi0iOworCisJLy8gcHV0IGFkZGl0aW9uYWwgaGVhZGVycworCWZvciAobCA9IG9wdF9oZWFkZXJzOyBsOyBsID0gbC0+bGluaykKKwkJcHV0cyhsLT5kYXRhKTsKKworCS8vIG1ha2UgYSByYW5kb20gc3RyaW5nIC0tIGl0IHdpbGwgZGVsaW1pdCBtZXNzYWdlIHBhcnRzCisJc3JhbmQobW9ub3RvbmljX3VzKCkpOworCWJvdW5kYXJ5ID0geGFzcHJpbnRmKCIldS0ldS0ldSIsCisJCQkodW5zaWduZWQpcmFuZCgpLCAodW5zaWduZWQpcmFuZCgpLCAodW5zaWduZWQpcmFuZCgpKTsKKworCS8vIHB1dCBtdWx0aXBhcnQgaGVhZGVyCisJcHJpbnRmKAorCQkiTWltZS1WZXJzaW9uOiAxLjBcbiIKKwkJIkNvbnRlbnQtVHlwZTogbXVsdGlwYXJ0L21peGVkOyBib3VuZGFyeT1cIiVzXCJcbiIKKwkJLCBib3VuZGFyeQorCSk7CisKKwkvLyBwdXQgYXR0YWNobWVudHMKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJcHJpbnRmKAorCQkJIlxuLS0lc1xuIgorCQkJIkNvbnRlbnQtVHlwZTogJXM7IGNoYXJzZXQ9JXNcbiIKKwkJCSJDb250ZW50LURpc3Bvc2l0aW9uOiBpbmxpbmU7IGZpbGVuYW1lPVwiJXNcIlxuIgorCQkJIkNvbnRlbnQtVHJhbnNmZXItRW5jb2Rpbmc6IGJhc2U2NFxuIgorCQkJLCBib3VuZGFyeQorCQkJLCBjb250ZW50X3R5cGUKKwkJCSwgRy5vcHRfY2hhcnNldAorCQkJLCBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9zdHJpcCgqYXJndikKKwkJKTsKKwkJZW5jb2RlX2Jhc2U2NCgqYXJndisrLCAoY29uc3QgY2hhciAqKXN0ZGluLCAiIik7CisJfQorCisJLy8gcHV0IG11bHRpcGFydCBmb290ZXIKKwlwcmludGYoIlxuLS0lcy0tXG4iICJcbiIsIGJvdW5kYXJ5KTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7CisjdW5kZWYgYm91bmRhcnkKK30KZGlmZiAtLWdpdCBhL21haWx1dGlscy9wb3BtYWlsZGlyLmMgYi9tYWlsdXRpbHMvcG9wbWFpbGRpci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMDMwMzMKLS0tIC9kZXYvbnVsbAorKysgYi9tYWlsdXRpbHMvcG9wbWFpbGRpci5jCkBAIC0wLDAgKzEsMjcxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBwb3BtYWlsZGlyOiBhIHNpbXBsZSB5ZXQgcG93ZXJmdWwgUE9QMyBjbGllbnQKKyAqIERlbGl2ZXJzIGNvbnRlbnRzIG9mIHJlbW90ZSBtYWlsYm94ZXMgdG8gbG9jYWwgTWFpbGRpcgorICoKKyAqIEluc3BpcmVkIGJ5IG9yaWdpbmFsIHV0aWxpdHkgYnkgTmlrb2xhIFZsYWRvdgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBWbGFkaW1pciBEcm9ubmlrb3YgPGRyb25uaWtvdkBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2tidWlsZDpsaWItJChDT05GSUdfUE9QTUFJTERJUikgKz0gcG9wbWFpbGRpci5vIG1haWwubworCisvL3VzYWdlOiNkZWZpbmUgcG9wbWFpbGRpcl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIE1BSUxESVIgW0NPTk5fSEVMUEVSIEFSR1NdIgorLy91c2FnZTojZGVmaW5lIHBvcG1haWxkaXJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJGZXRjaCBjb250ZW50IG9mIHJlbW90ZSBtYWlsYm94IHRvIGxvY2FsIG1haWxkaXJcbiIKKy8qIC8vdXNhZ2U6ICAiXG4JLWIJCUJpbmFyeSBtb2RlLiBJZ25vcmVkIiAqLworLyogLy91c2FnZTogICJcbgktZAkJRGVidWcuIElnbm9yZWQiICovCisvKiAvL3VzYWdlOiAgIlxuCS1tCQlTaG93IHVzZWQgbWVtb3J5LiBJZ25vcmVkIiAqLworLyogLy91c2FnZTogICJcbgktVgkJU2hvdyB2ZXJzaW9uLiBJZ25vcmVkIiAqLworLyogLy91c2FnZTogICJcbgktYwkJVXNlIHRjcGNsaWVudC4gSWdub3JlZCIgKi8KKy8qIC8vdXNhZ2U6ICAiXG4JLWEJCVVzZSBBUE9QIHByb3RvY29sLiBJbXBsaWVkLiBJZiBzZXJ2ZXIgc3VwcG9ydHMgQVBPUCAtPiB1c2UgaXQiICovCisvL3VzYWdlOiAgICAgIlxuCS1zCQlTa2lwIGF1dGhvcml6YXRpb24iCisvL3VzYWdlOiAgICAgIlxuCS1UCQlHZXQgbWVzc2FnZXMgd2l0aCBUT1AgaW5zdGVhZCBvZiBSRVRSIgorLy91c2FnZTogICAgICJcbgktawkJS2VlcCByZXRyaWV2ZWQgbWVzc2FnZXMgb24gdGhlIHNlcnZlciIKKy8vdXNhZ2U6ICAgICAiXG4JLXQgU0VDCQlOZXR3b3JrIHRpbWVvdXQiCisvL3VzYWdlOglJRl9GRUFUVVJFX1BPUE1BSUxESVJfREVMSVZFUlkoCisvL3VzYWdlOiAgICAgIlxuCS1GIFwiUFJPRyBBUkdTXCIJRmlsdGVyIHByb2dyYW0gKG1heSBiZSByZXBlYXRlZCkiCisvL3VzYWdlOiAgICAgIlxuCS1NIFwiUFJPRyBBUkdTXCIJRGVsaXZlcnkgcHJvZ3JhbSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuRmV0Y2ggZnJvbSBwbGFpbiBQT1AzIHNlcnZlcjoiCisvL3VzYWdlOiAgICAgIlxucG9wbWFpbGRpciAtayBESVIgbmMgcG9wMy5zZXJ2ZXIuY29tIDExMCA8dXNlcl9hbmRfcGFzcy50eHQiCisvL3VzYWdlOiAgICAgIlxuRmV0Y2ggZnJvbSBTU0xlZCBQT1AzIHNlcnZlciBhbmQgZGVsZXRlIGZldGNoZWQgZW1haWxzOiIKKy8vdXNhZ2U6ICAgICAiXG5wb3BtYWlsZGlyIERJUiAtLSBvcGVuc3NsIHNfY2xpZW50IC1xdWlldCAtY29ubmVjdCBwb3AzLnNlcnZlci5jb206OTk1IDx1c2VyX2FuZF9wYXNzLnR4dCIKKy8qIC8vdXNhZ2U6ICAiXG4JLVIgQllURVMJUmVtb3ZlIG9sZCBtZXNzYWdlcyBvbiB0aGUgc2VydmVyID49IEJZVEVTLiBJZ25vcmVkIiAqLworLyogLy91c2FnZTogICJcbgktWiBOMS1OMglSZW1vdmUgbWVzc2FnZXMgZnJvbSBOMSB0byBOMiAoZGFuZ2Vyb3VzKS4gSWdub3JlZCIgKi8KKy8qIC8vdXNhZ2U6ICAiXG4JLUwgQllURVMJRG9uJ3QgcmV0cmlldmUgbmV3IG1lc3NhZ2VzID49IEJZVEVTLiBJZ25vcmVkIiAqLworLyogLy91c2FnZTogICJcbgktSCBMSU5FUwlUeXBlIGZpcnN0IExJTkVTIG9mIGEgbWVzc2FnZS4gSWdub3JlZCIgKi8KKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgcG9wbWFpbGRpcl9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBwb3BtYWlsZGlyIC1rIH4vTWFpbGRpciAtLSBuYyBwb3AuZHJ2di5ydSAxMTAgWzxwYXNzd29yZF9maWxlXVxuIgorLy91c2FnZTogICAgICAgIiQgcG9wbWFpbGRpciB+L01haWxkaXIgLS0gb3BlbnNzbCBzX2NsaWVudCAtcXVpZXQgLWNvbm5lY3QgcG9wLmdtYWlsLmNvbTo5OTUgWzxwYXNzd29yZF9maWxlXVxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJtYWlsLmgiCisKK3N0YXRpYyB2b2lkIHBvcDNfY2hlY2tyKGNvbnN0IGNoYXIgKmZtdCwgY29uc3QgY2hhciAqcGFyYW0sIGNoYXIgKipyZXQpCit7CisJY2hhciAqbXNnID0gc2VuZF9tYWlsX2NvbW1hbmQoZm10LCBwYXJhbSk7CisJY2hhciAqYW5zd2VyID0geG1hbGxvY19mZ2V0bGluZShzdGRpbik7CisJaWYgKGFuc3dlciAmJiAnKycgPT0gYW5zd2VyWzBdKSB7CisJCWZyZWUobXNnKTsKKwkJaWYgKHRpbWVvdXQpCisJCQlhbGFybSgwKTsKKwkJaWYgKHJldCkgeworCQkJLy8gc2tpcCAiK09LICIKKwkJCW1lbW1vdmUoYW5zd2VyLCBhbnN3ZXIgKyA0LCBzdHJsZW4oYW5zd2VyKSAtIDQpOworCQkJKnJldCA9IGFuc3dlcjsKKwkJfSBlbHNlCisJCQlmcmVlKGFuc3dlcik7CisJCXJldHVybjsKKwl9CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIGZhaWxlZCwgcmVwbHkgd2FzOiAlcyIsIG1zZywgYW5zd2VyKTsKK30KKworc3RhdGljIHZvaWQgcG9wM19jaGVjayhjb25zdCBjaGFyICpmbXQsIGNvbnN0IGNoYXIgKnBhcmFtKQoreworCXBvcDNfY2hlY2tyKGZtdCwgcGFyYW0sIE5VTEwpOworfQorCitpbnQgcG9wbWFpbGRpcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcG9wbWFpbGRpcl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqYnVmOworCXVuc2lnbmVkIG5tc2c7CisJY2hhciAqaG9zdG5hbWU7CisJcGlkX3QgcGlkOworCWNvbnN0IGNoYXIgKnJldHI7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUE9QTUFJTERJUl9ERUxJVkVSWQorCWNvbnN0IGNoYXIgKmRlbGl2ZXJ5OworI2VuZGlmCisJdW5zaWduZWQgb3B0X25saW5lcyA9IDA7CisKKwllbnVtIHsKKwkJT1BUX2IgPSAxIDw8IDAsCQkvLyAtYiBiaW5hcnkgbW9kZS4gSWdub3JlZAorCQlPUFRfZCA9IDEgPDwgMSwJCS8vIC1kLC1kZCwtZGRkIGRlYnVnLiBJZ25vcmVkCisJCU9QVF9tID0gMSA8PCAyLAkJLy8gLW0gc2hvdyB1c2VkIG1lbW9yeS4gSWdub3JlZAorCQlPUFRfViA9IDEgPDwgMywJCS8vIC1WIHZlcnNpb24uIElnbm9yZWQKKwkJT1BUX2MgPSAxIDw8IDQsCQkvLyAtYyB1c2UgdGNwY2xpZW50LiBJZ25vcmVkCisJCU9QVF9hID0gMSA8PCA1LAkJLy8gLWEgdXNlIEFQT1AgcHJvdG9jb2wKKwkJT1BUX3MgPSAxIDw8IDYsCQkvLyAtcyBza2lwIGF1dGhvcml6YXRpb24KKwkJT1BUX1QgPSAxIDw8IDcsCQkvLyAtVCBnZXQgbWVzc2FnZXMgd2l0aCBUT1AgaW5zdGVhZCB3aXRoIFJFVFIKKwkJT1BUX2sgPSAxIDw8IDgsCQkvLyAtayBrZWVwIHJldHJpZXZlZCBtZXNzYWdlcyBvbiB0aGUgc2VydmVyCisJCU9QVF90ID0gMSA8PCA5LAkJLy8gLXQ5MCBzZXQgdGltZW91dCB0byA5MCBzZWMKKwkJT1BUX1IgPSAxIDw8IDEwLAkvLyAtUjIwMDAwIHJlbW92ZSBvbGQgbWVzc2FnZXMgb24gdGhlIHNlcnZlciA+PSAyMDAwMCBieXRlcyAocmVxdWlyZXMgLWspLiBJZ25vcmVkCisJCU9QVF9aID0gMSA8PCAxMSwJLy8gLVoxMS0yMyByZW1vdmUgbWVzc2FnZXMgZnJvbSAxMSB0byAyMyAoZGFuZ2Vyb3VzKS4gSWdub3JlZAorCQlPUFRfTCA9IDEgPDwgMTIsCS8vIC1MNTAwMDAgbm90IHJldHJpZXZlIG5ldyBtZXNzYWdlcyA+PSA1MDAwMCBieXRlcy4gSWdub3JlZAorCQlPUFRfSCA9IDEgPDwgMTMsCS8vIC1IMzAgdHlwZSBmaXJzdCAzMCBsaW5lcyBvZiBhIG1lc3NhZ2U7ICgtTDEyMDAwIC1IMzApLiBJZ25vcmVkCisJCU9QVF9NID0gMSA8PCAxNCwJLy8gLU1cInByb2dyYW0gYXJnMSBhcmcyIC4uLlwiOyBkZWxpdmVyIGJ5IHByb2dyYW0uIFRyZWF0ZWQgbGlrZSAtRgorCQlPUFRfRiA9IDEgPDwgMTUsCS8vIC1GXCJwcm9ncmFtIGFyZzEgYXJnMiAuLi5cIjsgZmlsdGVyIGJ5IHByb2dyYW0uIFRyZWF0ZWQgbGlrZSAtTQorCX07CisKKwkvLyBpbml0IGdsb2JhbCB2YXJpYWJsZXMKKwlJTklUX0coKTsKKworCS8vIHBhcnNlIG9wdGlvbnMKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMTpkZDp0KzpSKzpMKzpIKyI7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsCisJCSJiZG1WY2FzVGt0OiIgIlI6WjpMOkg6IiBJRl9GRUFUVVJFX1BPUE1BSUxESVJfREVMSVZFUlkoIk06RjoiKSwKKwkJJnRpbWVvdXQsIE5VTEwsIE5VTEwsIE5VTEwsICZvcHRfbmxpbmVzCisJCUlGX0ZFQVRVUkVfUE9QTUFJTERJUl9ERUxJVkVSWSgsICZkZWxpdmVyeSwgJmRlbGl2ZXJ5KSAvLyB3ZSB0cmVhdCAtTSBhbmQgLUYgdGhlIHNhbWUKKwkpOworCS8vYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisKKwkvLyBnZXQgYXV0aCBpbmZvCisJaWYgKCEob3B0cyAmIE9QVF9zKSkKKwkJZ2V0X2NyZWRfb3JfZGllKFNURElOX0ZJTEVOTyk7CisKKwkvLyBnb3RvIG1haWxkaXIKKwl4Y2hkaXIoKmFyZ3YrKyk7CisKKwkvLyBsYXVuY2ggY29ubmVjdCBoZWxwZXIsIGlmIGFueQorCWlmICgqYXJndikKKwkJbGF1bmNoX2hlbHBlcigoY29uc3QgY2hhciAqKilhcmd2KTsKKworCS8vIGdldCBzZXJ2ZXIgZ3JlZXRpbmcKKwlwb3AzX2NoZWNrcihOVUxMLCBOVUxMLCAmYnVmKTsKKworCS8vIGF1dGhlbnRpY2F0ZSAoaWYgbm8gLXMgZ2l2ZW4pCisJaWYgKCEob3B0cyAmIE9QVF9zKSkgeworCQkvLyBzZXJ2ZXIgc3VwcG9ydHMgQVBPUCBhbmQgd2Ugd2FudCBpdD8KKwkJaWYgKCc8JyA9PSBidWZbMF0gJiYgKG9wdHMgJiBPUFRfYSkpIHsKKwkJCXVuaW9uIHsgLy8gc2F2ZSBhIGJpdCBvZiBzdGFjaworCQkJCW1kNV9jdHhfdCBjdHg7CisJCQkJY2hhciBoZXhbMTYgKiAyICsgMV07CisJCQl9IG1kNTsKKwkJCXVpbnQzMl90IHJlc1sxNiAvIDRdOworCisJCQljaGFyICpzID0gc3RyY2hyKGJ1ZiwgJz4nKTsKKwkJCWlmIChzKQorCQkJCXNbMV0gPSAnXDAnOworCQkJLy8gZ2V0IG1kNSBzdW0gb2YgIjxzdGFtcD5wYXNzd29yZCIgc3RyaW5nCisJCQltZDVfYmVnaW4oJm1kNS5jdHgpOworCQkJbWQ1X2hhc2goJm1kNS5jdHgsIGJ1Ziwgc3RybGVuKGJ1ZikpOworCQkJbWQ1X2hhc2goJm1kNS5jdHgsIEcucGFzcywgc3RybGVuKEcucGFzcykpOworCQkJbWQ1X2VuZCgmbWQ1LmN0eCwgcmVzKTsKKwkJCSpiaW4yaGV4KG1kNS5oZXgsIChjaGFyKilyZXMsIDE2KSA9ICdcMCc7CisJCQkvLyBBUE9QCisJCQlzID0geGFzcHJpbnRmKCIlcyAlcyIsIEcudXNlciwgbWQ1LmhleCk7CisJCQlwb3AzX2NoZWNrKCJBUE9QICVzIiwgcyk7CisJCQlmcmVlKHMpOworCQkJZnJlZShidWYpOworCQkvLyBzZXJ2ZXIgaWdub3JlcyBBUE9QIC0+IHVzZSBzaW1wbGUgdGV4dCBhdXRoZW50aWNhdGlvbgorCQl9IGVsc2UgeworCQkJLy8gVVNFUgorCQkJcG9wM19jaGVjaygiVVNFUiAlcyIsIEcudXNlcik7CisJCQkvLyBQQVNTCisJCQlwb3AzX2NoZWNrKCJQQVNTICVzIiwgRy5wYXNzKTsKKwkJfQorCX0KKworCS8vIGdldCBtYWlsYm94IHN0YXRpc3RpY3MKKwlwb3AzX2NoZWNrcigiU1RBVCIsIE5VTEwsICZidWYpOworCisJLy8gcHJlcGFyZSBtZXNzYWdlIGZpbGVuYW1lIHN1ZmZpeAorCWhvc3RuYW1lID0gc2FmZV9nZXRob3N0bmFtZSgpOworCXBpZCA9IGdldHBpZCgpOworCisJLy8gZ2V0IG1lc3NhZ2VzIGNvdW50ZXIKKwkvLyBOT1RFOiB3ZSBkb24ndCB1c2UgeGF0b3UoYnVmKSBzaW5jZSBidWYgaXMgIm5tc2cgbmJ5dGVzIgorCS8vIHdlIG9ubHkgbmVlZCBubXNnIGFuZCBhdG9pIGlzIGp1c3QgZXhhY3RseSB3aGF0IHdlIG5lZWQKKwkvLyBpZiBhdG9pIGZhaWxzIHRvIGNvbnZlcnQgYnVmIGludG8gbnVtYmVyIGl0IHJldHVybnMgMAorCS8vIGluIHRoaXMgY2FzZSB0aGUgZm9sbG93aW5nIGxvb3Agc2ltcGx5IHdpbGwgbm90IGJlIGV4ZWN1dGVkCisJbm1zZyA9IGF0b2koYnVmKTsKKwlmcmVlKGJ1Zik7CisKKwkvLyBsb29wIHRocm91Z2ggbWVzc2FnZXMKKwlyZXRyID0gKG9wdHMgJiBPUFRfVCkgPyB4YXNwcmludGYoIlRPUCAlJXUgJXUiLCBvcHRfbmxpbmVzKSA6ICJSRVRSICV1IjsKKwlmb3IgKDsgbm1zZzsgbm1zZy0tKSB7CisKKwkJY2hhciAqZmlsZW5hbWU7CisJCWNoYXIgKnRhcmdldDsKKwkJY2hhciAqYW5zd2VyOworCQlGSUxFICpmcDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9QT1BNQUlMRElSX0RFTElWRVJZCisJCWludCByYzsKKyNlbmRpZgorCQkvLyBnZW5lcmF0ZSB1bmlxdWUgZmlsZW5hbWUKKwkJZmlsZW5hbWUgID0geGFzcHJpbnRmKCJ0bXAvJWxsdS4ldS4lcyIsCisJCQltb25vdG9uaWNfdXMoKSwgKHVuc2lnbmVkKXBpZCwgaG9zdG5hbWUpOworCisJCS8vIHJldHJpZXZlIG1lc3NhZ2UgaW4gLi90bXAvIHVubGVzcyBmaWx0ZXIgaXMgc3BlY2lmaWVkCisJCXBvcDNfY2hlY2socmV0ciwgKGNvbnN0IGNoYXIgKikocHRyZGlmZl90KW5tc2cpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfUE9QTUFJTERJUl9ERUxJVkVSWQorCQkvLyBkZWxpdmVyeSBoZWxwZXIgb3JkZXJlZD8gLT4gc2V0dXAgcGlwZQorCQlpZiAob3B0cyAmIChPUFRfRnxPUFRfTSkpIHsKKwkJCS8vIGhlbHBlciB3aWxsIGhhdmUgJEZJTEVOQU1FIHNldCB0byBmaWxlbmFtZQorCQkJeHNldGVudigiRklMRU5BTUUiLCBmaWxlbmFtZSk7CisJCQlmcCA9IHBvcGVuKGRlbGl2ZXJ5LCAidyIpOworCQkJdW5zZXRlbnYoIkZJTEVOQU1FIik7CisJCQlpZiAoIWZwKSB7CisJCQkJYmJfcGVycm9yX21zZygiZGVsaXZlcnkgaGVscGVyIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZQorI2VuZGlmCisJCS8vIGNyZWF0ZSBhbmQgb3BlbiBmaWxlIGZpbGVuYW1lCisJCWZwID0geGZvcGVuX2Zvcl93cml0ZShmaWxlbmFtZSk7CisKKwkJLy8gY29weSBzdGRpbiB0byBmcCAoZWl0aGVyIGZpbGVuYW1lIG9yIGRlbGl2ZXJ5IGhlbHBlcikKKwkJd2hpbGUgKChhbnN3ZXIgPSB4bWFsbG9jX2ZnZXRzX3N0cihzdGRpbiwgIlxyXG4iKSkgIT0gTlVMTCkgeworCQkJY2hhciAqcyA9IGFuc3dlcjsKKwkJCWlmICgnLicgPT0gYW5zd2VyWzBdKSB7CisJCQkJaWYgKCcuJyA9PSBhbnN3ZXJbMV0pCisJCQkJCXMrKzsKKwkJCQllbHNlIGlmICgnXHInID09IGFuc3dlclsxXSAmJiAnXG4nID09IGFuc3dlclsyXSAmJiAnXDAnID09IGFuc3dlclszXSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQkvLypzdHJjaHJudWwocywgJ1xyJykgPSAnXG4nOworCQkJZnB1dHMocywgZnApOworCQkJZnJlZShhbnN3ZXIpOworCQl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9QT1BNQUlMRElSX0RFTElWRVJZCisJCS8vIGFuYWx5c2UgZGVsaXZlcnkgc3RhdHVzCisJCWlmIChvcHRzICYgKE9QVF9GfE9QVF9NKSkgeworCQkJcmMgPSBwY2xvc2UoZnApOworCQkJaWYgKDk5ID09IHJjKSAvLyA5OSBtZWFucyBiYWlsIG91dAorCQkJCWJyZWFrOworLy8JCQlpZiAocmMpIC8vICEwIG1lYW5zIHNraXAgdG8gdGhlIG5leHQgbWVzc2FnZQorCQkJCWdvdG8gc2tpcDsKKy8vCQkJLy8gMCBtZWFucyBjb250aW51ZQorCQl9IGVsc2UgeworCQkJLy8gY2xvc2UgZmlsZW5hbWUKKwkJCWZjbG9zZShmcCk7CisJCX0KKyNlbmRpZgorCisJCS8vIGRlbGV0ZSBtZXNzYWdlIGZyb20gc2VydmVyCisJCWlmICghKG9wdHMgJiBPUFRfaykpCisJCQlwb3AzX2NoZWNrKCJERUxFICV1IiwgKGNvbnN0IGNoYXIqKShwdHJkaWZmX3Qpbm1zZyk7CisKKwkJLy8gYXRvbWljYWxseSBtb3ZlIG1lc3NhZ2UgdG8gLi9uZXcvCisJCXRhcmdldCA9IHhzdHJkdXAoZmlsZW5hbWUpOworCQlzdHJuY3B5KHRhcmdldCwgIm5ldyIsIDMpOworCQkvLyAuLi4gb3IganVzdCBzdG9wIHJlY2VpdmluZyBvbiBmYWlsdXJlCisJCWlmIChyZW5hbWVfb3Jfd2FybihmaWxlbmFtZSwgdGFyZ2V0KSkKKwkJCWJyZWFrOworCQlmcmVlKHRhcmdldCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9QT1BNQUlMRElSX0RFTElWRVJZCisgc2tpcDoKKyNlbmRpZgorCQlmcmVlKGZpbGVuYW1lKTsKKwl9CisKKwkvLyBCeWUKKwlwb3AzX2NoZWNrKCJRVUlUIiwgTlVMTCk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZnJlZShHLnVzZXIpOworCQlmcmVlKEcucGFzcyk7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21haWx1dGlscy9yZWZvcm1pbWUuYyBiL21haWx1dGlscy9yZWZvcm1pbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmIyY2ZlCi0tLSAvZGV2L251bGwKKysrIGIvbWFpbHV0aWxzL3JlZm9ybWltZS5jCkBAIC0wLDAgKzEsMjc3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiByZWZvcm1pbWU6IHBhcnNlIE1JTUUtZW5jb2RlZCBtZXNzYWdlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19SRUZPUk1JTUUpICs9IHJlZm9ybWltZS5vIG1haWwubworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJtYWlsLmgiCisKKyNpZiAwCisjIGRlZmluZSBkYmdfZXJyb3JfbXNnKC4uLikgYmJfZXJyb3JfbXNnKF9fVkFfQVJHU19fKQorI2Vsc2UKKyMgZGVmaW5lIGRiZ19lcnJvcl9tc2coLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciAqZmluZF90b2tlbihjb25zdCBjaGFyICpjb25zdCBzdHJpbmdfYXJyYXlbXSwgY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICpkZWZ2YWx1ZSkKK3sKKwljb25zdCBjaGFyICpyID0gTlVMTDsKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBzdHJpbmdfYXJyYXlbaV0gIT0gTlVMTDsgaSsrKSB7CisJCWlmIChzdHJjYXNlY21wKHN0cmluZ19hcnJheVtpXSwga2V5KSA9PSAwKSB7CisJCQlyID0gKGNoYXIgKilzdHJpbmdfYXJyYXlbaSsxXTsKKwkJCWJyZWFrOworCQl9CisJfQorCXJldHVybiAocikgPyByIDogZGVmdmFsdWU7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICp4ZmluZF90b2tlbihjb25zdCBjaGFyICpjb25zdCBzdHJpbmdfYXJyYXlbXSwgY29uc3QgY2hhciAqa2V5KQoreworCWNvbnN0IGNoYXIgKnIgPSBmaW5kX3Rva2VuKHN0cmluZ19hcnJheSwga2V5LCBOVUxMKTsKKwlpZiAocikKKwkJcmV0dXJuIHI7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vdCBmb3VuZDogJyVzJyIsIGtleSk7Cit9CisKK2VudW0geworCU9QVF94ID0gMSA8PCAwLAorCU9QVF9YID0gMSA8PCAxLAorI2lmIEVOQUJMRV9GRUFUVVJFX1JFRk9STUlNRV9DT01QQVQKKwlPUFRfZCA9IDEgPDwgMiwKKwlPUFRfZSA9IDEgPDwgMywKKwlPUFRfaSA9IDEgPDwgNCwKKwlPUFRfcyA9IDEgPDwgNSwKKwlPUFRfciA9IDEgPDwgNiwKKwlPUFRfYyA9IDEgPDwgNywKKwlPUFRfbSA9IDEgPDwgOCwKKwlPUFRfaCA9IDEgPDwgOSwKKwlPUFRfbyA9IDEgPDwgMTAsCisJT1BUX08gPSAxIDw8IDExLAorI2VuZGlmCit9OworCitzdGF0aWMgaW50IHBhcnNlKGNvbnN0IGNoYXIgKmJvdW5kYXJ5LCBjaGFyICoqYXJndikKK3sKKwlpbnQgYm91bmRhcnlfbGVuID0gc3RybGVuKGJvdW5kYXJ5KTsKKwljaGFyIHVuaXFbc2l6ZW9mKCIlJWxsdS4ldSIpICsgc2l6ZW9mKGludCkqM107CisKKwlkYmdfZXJyb3JfbXNnKCJCT1VOREFSWVslc10iLCBib3VuZGFyeSk7CisKKwkvLyBwcmVwYXJlIHVuaXF1ZSBzdHJpbmcgcGF0dGVybgorCXNwcmludGYodW5pcSwgIiUlbGx1LiV1IiwgKHVuc2lnbmVkKWdldHBpZCgpKTsKKwlkYmdfZXJyb3JfbXNnKCJVTklRWyVzXSIsIHVuaXEpOworCisJd2hpbGUgKDEpIHsKKwkJY2hhciAqaGVhZGVyOworCQljb25zdCBjaGFyICp0b2tlbnNbMzJdOyAvKiAzMiBpcyBlbm91Z2ggKi8KKwkJY29uc3QgY2hhciAqdHlwZTsKKworCQkvKiBSZWFkIHRoZSBoZWFkZXIgKGV2ZXJ5dGhpbmcgdXAgdG8gdHdvIFxuKSAqLworCQl7CisJCQl1bnNpZ25lZCBoZWFkZXJfaWR4ID0gMDsKKwkJCWludCBsYXN0X2NoID0gMDsKKwkJCWhlYWRlciA9IE5VTEw7CisJCQl3aGlsZSAoMSkgeworCQkJCWludCBjaCA9IGZnZXRjKHN0ZGluKTsKKwkJCQlpZiAoY2ggPT0gJ1xyJykgLyogU3VwcG9ydCBib3RoIGxpbmUgZW5kaW5ncyAqLworCQkJCQljb250aW51ZTsKKwkJCQlpZiAoY2ggPT0gRU9GKQorCQkJCQlicmVhazsKKwkJCQlpZiAoY2ggPT0gJ1xuJyAmJiBsYXN0X2NoID09IGNoKQorCQkJCQlicmVhazsKKwkJCQlpZiAoIShoZWFkZXJfaWR4ICYgMHhmZikpCisJCQkJCWhlYWRlciA9IHhyZWFsbG9jKGhlYWRlciwgaGVhZGVyX2lkeCArIDB4MTAxKTsKKwkJCQloZWFkZXJbaGVhZGVyX2lkeCsrXSA9IGxhc3RfY2ggPSBjaDsKKwkJCX0KKwkJCWlmICghaGVhZGVyKSB7CisJCQkJZGJnX2Vycm9yX21zZygiRU9GIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQloZWFkZXJbaGVhZGVyX2lkeF0gPSAnXDAnOworCQkJZGJnX2Vycm9yX21zZygiSDonJXMnIiwgcCk7CisJCX0KKworCQkvKiBTcGxpdCB0byB0b2tlbnMgKi8KKwkJeworCQkJY2hhciAqcywgKnA7CisJCQl1bnNpZ25lZCBudG9rZW5zOworCQkJY29uc3QgY2hhciAqZGVsaW1zID0gIjs9XCIgXHRcbiI7CisKKwkJCS8qIFNraXAgdG8gbGFzdCBDb250ZW50LVR5cGU6ICovCisJCQlzID0gcCA9IGhlYWRlcjsKKwkJCXdoaWxlICgocCA9IHN0cmNocihwLCAnXG4nKSkgIT0gTlVMTCkgeworCQkJCXArKzsKKwkJCQlpZiAoc3RybmNhc2VjbXAocCwgIkNvbnRlbnQtVHlwZToiLCBzaXplb2YoIkNvbnRlbnQtVHlwZToiKS0xKSA9PSAwKQorCQkJCQlzID0gcDsKKwkJCX0KKwkJCWRiZ19lcnJvcl9tc2coIkw6JyVzJyIsIHApOworCQkJbnRva2VucyA9IDA7CisJCQlzID0gc3RydG9rKHMsIGRlbGltcyk7CisJCQl3aGlsZSAocykgeworCQkJCXRva2Vuc1tudG9rZW5zXSA9IHM7CisJCQkJaWYgKG50b2tlbnMgPCBBUlJBWV9TSVpFKHRva2VucykgLSAxKQorCQkJCQludG9rZW5zKys7CisJCQkJZGJnX2Vycm9yX21zZygiTFslZF09JyVzJyIsIG50b2tlbnMsIHMpOworCQkJCXMgPSBzdHJ0b2soTlVMTCwgZGVsaW1zKTsKKwkJCX0KKwkJCXRva2Vuc1tudG9rZW5zXSA9IE5VTEw7CisJCQlkYmdfZXJyb3JfbXNnKCJFTVBUWUxJTkUsIG50b2tlbnM6JWQiLCBudG9rZW5zKTsKKwkJCWlmIChudG9rZW5zID09IDApCisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBJcyBpdCBtdWx0aXBhcnQ/ICovCisJCXR5cGUgPSBmaW5kX3Rva2VuKHRva2VucywgIkNvbnRlbnQtVHlwZToiLCAidGV4dC9wbGFpbiIpOworCQlkYmdfZXJyb3JfbXNnKCJUWVBFOiclcyciLCB0eXBlKTsKKwkJaWYgKDAgPT0gc3RybmNhc2VjbXAodHlwZSwgIm11bHRpcGFydC8iLCAxMCkpIHsKKwkJCS8qIFllcywgcmVjdXJzZSAqLworCQkJaWYgKHN0cmNhc2VjbXAodHlwZSArIDEwLCAibWl4ZWQiKSAhPSAwKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyBzdXBwb3J0IG9mIGNvbnRlbnQgdHlwZSAnJXMnIiwgdHlwZSk7CisJCQlwYXJzZSh4ZmluZF90b2tlbih0b2tlbnMsICJib3VuZGFyeSIpLCBhcmd2KTsKKwkJfSBlbHNlIHsKKwkJCS8qIE5vLCBwcm9jZXNzIG9uZSBub24tbXVsdGlwYXJ0IHNlY3Rpb24gKi8KKwkJCWNoYXIgKmVuZDsKKwkJCXBpZF90IHBpZCA9IHBpZDsKKwkJCUZJTEUgKmZwOworCisJCQljb25zdCBjaGFyICpjaGFyc2V0ID0gZmluZF90b2tlbih0b2tlbnMsICJjaGFyc2V0IiwgQ09ORklHX0ZFQVRVUkVfTUlNRV9DSEFSU0VUKTsKKwkJCWNvbnN0IGNoYXIgKmVuY29kaW5nID0gZmluZF90b2tlbih0b2tlbnMsICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nOiIsICI3Yml0Iik7CisKKwkJCS8qIENvbXBvc2UgdGFyZ2V0IGZpbGVuYW1lICovCisJCQljaGFyICpmaWxlbmFtZSA9IChjaGFyICopZmluZF90b2tlbih0b2tlbnMsICJmaWxlbmFtZSIsIE5VTEwpOworCQkJaWYgKCFmaWxlbmFtZSkKKwkJCQlmaWxlbmFtZSA9IHhhc3ByaW50Zih1bmlxLCBtb25vdG9uaWNfdXMoKSk7CisJCQllbHNlCisJCQkJZmlsZW5hbWUgPSBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9zdHJpcCh4c3RyZHVwKGZpbGVuYW1lKSk7CisKKwkJCWlmIChvcHRzICYgT1BUX1gpIHsKKwkJCQlpbnQgZmRbMl07CisKKwkJCQkvKiBzdGFydCBleHRlcm5hbCBoZWxwZXIgKi8KKwkJCQl4cGlwZShmZCk7CisJCQkJcGlkID0gdmZvcmsoKTsKKwkJCQlpZiAoMCA9PSBwaWQpIHsKKwkJCQkJLyogY2hpbGQgcmVhZHMgZnJvbSBmZFswXSAqLworCQkJCQljbG9zZShmZFsxXSk7CisJCQkJCXhtb3ZlX2ZkKGZkWzBdLCBTVERJTl9GSUxFTk8pOworCQkJCQl4c2V0ZW52KCJDT05URU5UX1RZUEUiLCB0eXBlKTsKKwkJCQkJeHNldGVudigiQ0hBUlNFVCIsIGNoYXJzZXQpOworCQkJCQl4c2V0ZW52KCJFTkNPRElORyIsIGVuY29kaW5nKTsKKwkJCQkJeHNldGVudigiRklMRU5BTUUiLCBmaWxlbmFtZSk7CisJCQkJCUJCX0VYRUNWUF9vcl9kaWUoYXJndik7CisJCQkJfQorCQkJCS8qIHBhcmVudCB3aWxsIHdyaXRlIHRvIGZkWzFdICovCisJCQkJY2xvc2UoZmRbMF0pOworCQkJCWZwID0geGZkb3Blbl9mb3Jfd3JpdGUoZmRbMV0pOworCQkJCXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogd3JpdGUgdG8gZmlsZSAqLworCQkJCWNoYXIgKmZuYW1lID0geGFzcHJpbnRmKCIlcyVzIiwgKmFyZ3YsIGZpbGVuYW1lKTsKKwkJCQlmcCA9IHhmb3Blbl9mb3Jfd3JpdGUoZm5hbWUpOworCQkJCWZyZWUoZm5hbWUpOworCQkJfQorCQkJZnJlZShmaWxlbmFtZSk7CisKKwkJCS8qIHdyaXRlIHRvIGZwICovCisJCQllbmQgPSBOVUxMOworCQkJaWYgKDAgPT0gc3RyY2FzZWNtcChlbmNvZGluZywgImJhc2U2NCIpKSB7CisJCQkJcmVhZF9iYXNlNjQoc3RkaW4sIGZwLCAnLScpOworCQkJfSBlbHNlCisJCQlpZiAoMCAhPSBzdHJjYXNlY21wKGVuY29kaW5nLCAiN2JpdCIpCisJCQkgJiYgMCAhPSBzdHJjYXNlY21wKGVuY29kaW5nLCAiOGJpdCIpCisJCQkpIHsKKwkJCQkvKiBxdW90ZWQtcHJpbnRhYmxlLCBiaW5hcnksIHVzZXItZGVmaW5lZCBhcmUgdW5zdXBwb3J0ZWQgc28gZmFyICovCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImVuY29kaW5nICclcycgbm90IHN1cHBvcnRlZCIsIGVuY29kaW5nKTsKKwkJCX0gZWxzZSB7CisJCQkJLyogcGxhaW4gN2JpdCBvciA4Yml0ICovCisJCQkJd2hpbGUgKChlbmQgPSB4bWFsbG9jX2ZnZXRzKHN0ZGluKSkgIT0gTlVMTCkgeworCQkJCQlpZiAoJy0nID09IGVuZFswXQorCQkJCQkgJiYgJy0nID09IGVuZFsxXQorCQkJCQkgJiYgc3RybmNtcChlbmQgKyAyLCBib3VuZGFyeSwgYm91bmRhcnlfbGVuKSA9PSAwCisJCQkJCSkgeworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJZnB1dHMoZW5kLCBmcCk7CisJCQkJfQorCQkJfQorCQkJZmNsb3NlKGZwKTsKKworCQkJLyogV2FpdCBmb3IgY2hpbGQgKi8KKwkJCWlmIChvcHRzICYgT1BUX1gpIHsKKwkJCQlpbnQgcmM7CisJCQkJc2lnbmFsKFNJR1BJUEUsIFNJR19ERkwpOworCQkJCXJjID0gKHdhaXQ0cGlkKHBpZCkgJiAweGZmKTsKKwkJCQlpZiAocmMgIT0gMCkKKwkJCQkJcmV0dXJuIHJjICsgMjA7CisJCQl9CisKKwkJCS8qIE11bHRpcGFydCBlbmRlZD8gKi8KKwkJCWlmIChlbmQgJiYgJy0nID09IGVuZFsyICsgYm91bmRhcnlfbGVuXSAmJiAnLScgPT0gZW5kWzIgKyBib3VuZGFyeV9sZW4gKyAxXSkgeworCQkJCWRiZ19lcnJvcl9tc2coIkZJTklTSEVEIE1QQVJUOiclcyciLCBlbmQpOworCQkJCWJyZWFrOworCQkJfQorCQkJZGJnX2Vycm9yX21zZygiRklOSVNIRUQ6JyVzJyIsIGVuZCk7CisJCQlmcmVlKGVuZCk7CisJCX0gLyogZW5kIG9mICJoYW5kbGUgb25lIG5vbi1tdWx0aXBhcnQgYmxvY2siICovCisKKwkJZnJlZShoZWFkZXIpOworCX0gLyogd2hpbGUgKDEpICovCisKKwlkYmdfZXJyb3JfbXNnKCJFTkRQQVJTRVslc10iLCBib3VuZGFyeSk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCisvL3VzYWdlOiNkZWZpbmUgcmVmb3JtaW1lX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10iCisvL3VzYWdlOiNkZWZpbmUgcmVmb3JtaW1lX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUGFyc2UgTUlNRS1lbmNvZGVkIG1lc3NhZ2Ugb24gc3RkaW5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXggUFJFRklYCUV4dHJhY3QgY29udGVudCBvZiBNSU1FIHNlY3Rpb25zIHRvIGZpbGVzIgorLy91c2FnZTogICAgICJcbgktWCBQUk9HIEFSR1MJRmlsdGVyIGNvbnRlbnQgb2YgTUlNRSBzZWN0aW9ucyB0aHJvdWdoIFBST0ciCisvL3VzYWdlOiAgICAgIlxuCQkJTXVzdCBiZSB0aGUgbGFzdCBvcHRpb24iCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbk90aGVyIG9wdGlvbnMgYXJlIHNpbGVudGx5IGlnbm9yZWQiCisKKy8qCitVc2FnZTogcmVmb3JtaW1lIFtvcHRpb25zXQorICAgIC1kIC0gcGFyc2UgYSBkZWxpdmVyeSBzdGF0dXMgbm90aWZpY2F0aW9uLgorICAgIC1lIC0gZXh0cmFjdCBjb250ZW50cyBvZiBNSU1FIHNlY3Rpb24uCisgICAgLXggLSBleHRyYWN0IE1JTUUgc2VjdGlvbiB0byBhIGZpbGUuCisgICAgLVggLSBwaXBlIE1JTUUgc2VjdGlvbiB0byBhIHByb2dyYW0uCisgICAgLWkgLSBzaG93IE1JTUUgaW5mby4KKyAgICAtcyBuLm4ubi5uIC0gc3BlY2lmeSBNSU1FIHNlY3Rpb24uCisgICAgLXIgLSByZXdyaXRlIG1lc3NhZ2UsIGZpbGxpbmcgaW4gbWlzc2luZyBNSU1FIGhlYWRlcnMuCisgICAgLXI3IC0gYWxzbyBjb252ZXJ0IDhiaXQvcmF3IGVuY29kaW5nIHRvIHF1b3RlZC1wcmludGFibGUsIGlmIHBvc3NpYmxlLgorICAgIC1yOCAtIGFsc28gY29udmVydCBxdW90ZWQtcHJpbnRhYmxlIGVuY29kaW5nIHRvIDhiaXQsIGlmIHBvc3NpYmxlLgorICAgIC1jIGNoYXJzZXQgLSBkZWZhdWx0IGNoYXJzZXQgZm9yIHJld3JpdGluZywgLW8sIGFuZCAtTy4KKyAgICAtbSBbZmlsZV0gW2ZpbGVdLi4uIC0gY3JlYXRlIGEgTUlNRSBtZXNzYWdlIGRpZ2VzdC4KKyAgICAtaCAiaGVhZGVyIiAtIGRlY29kZSBSRkMgMjA0Ny1lbmNvZGVkIGhlYWRlci4KKyAgICAtbyAiaGVhZGVyIiAtIGVuY29kZSB1bnN0cnVjdHVyZWQgaGVhZGVyIHVzaW5nIFJGQyAyMDQ3LgorICAgIC1PICJoZWFkZXIiIC0gZW5jb2RlIGFkZHJlc3MgbGlzdCBoZWFkZXIgdXNpbmcgUkZDIDIwNDcuCisqLworCitpbnQgcmVmb3JtaW1lX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCByZWZvcm1pbWVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKm9wdF9wcmVmaXggPSAiIjsKKworCUlOSVRfRygpOworCisJLy8gcGFyc2Ugb3B0aW9ucworCS8vIE4uQi4gb25seSAteCBhbmQgLVggYXJlIHN1cHBvcnRlZCBzbyBmYXIKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJ4LS1YOlgtLXgiIElGX0ZFQVRVUkVfUkVGT1JNSU1FX0NPTVBBVCgiOm06OiIpOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LAorCQkieDpYIiBJRl9GRUFUVVJFX1JFRk9STUlNRV9DT01QQVQoImRlaXM6cjpjOm06aDpvOk86IiksCisJCSZvcHRfcHJlZml4CisJCUlGX0ZFQVRVUkVfUkVGT1JNSU1FX0NPTVBBVCgsIE5VTEwsIE5VTEwsICZHLm9wdF9jaGFyc2V0LCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKQorCSk7CisJYXJndiArPSBvcHRpbmQ7CisKKwlyZXR1cm4gcGFyc2UoIiIsIChvcHRzICYgT1BUX1gpID8gYXJndiA6IChjaGFyICoqKSZvcHRfcHJlZml4KTsKK30KZGlmZiAtLWdpdCBhL21haWx1dGlscy9zZW5kbWFpbC5jIGIvbWFpbHV0aWxzL3NlbmRtYWlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM1NWU0ZAotLS0gL2Rldi9udWxsCisrKyBiL21haWx1dGlscy9zZW5kbWFpbC5jCkBAIC0wLDAgKzEsNDg3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBiYXJlIGJvbmVzIHNlbmRtYWlsCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19TRU5ETUFJTCkgKz0gc2VuZG1haWwubyBtYWlsLm8KKworLy91c2FnZTojZGVmaW5lIHNlbmRtYWlsX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gW1JFQ0lQSUVOVF9FTUFJTF0uLi4iCisvL3VzYWdlOiNkZWZpbmUgc2VuZG1haWxfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSZWFkIGVtYWlsIGZyb20gc3RkaW4gYW5kIHNlbmQgaXRcbiIKKy8vdXNhZ2U6ICAgICAiXG5TdGFuZGFyZCBvcHRpb25zOiIKKy8vdXNhZ2U6ICAgICAiXG4JLXQJCVJlYWQgYWRkaXRpb25hbCByZWNpcGllbnRzIGZyb20gbWVzc2FnZSBib2R5IgorLy91c2FnZTogICAgICJcbgktZiBTRU5ERVIJRm9yIHVzZSBpbiBNQUlMIEZST006PHNlbmRlcj4uIENhbiBiZSBlbXB0eSBzdHJpbmciCisvL3VzYWdlOiAgICAgIlxuCQkJRGVmYXVsdDogLWF1VVNFUiwgb3IgdXNlcm5hbWUgb2YgY3VycmVudCBVSUQiCisvL3VzYWdlOiAgICAgIlxuCS1vIE9QVElPTlMJVmFyaW91cyBvcHRpb25zLiAtb2kgaW1wbGllZCwgb3RoZXJzIGFyZSBpZ25vcmVkIgorLy91c2FnZTogICAgICJcbgktaQkJLW9pIHN5bm9ueW0uIGltcGxpZWQgYW5kIGlnbm9yZWQiCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbkJ1c3lib3ggc3BlY2lmaWMgb3B0aW9uczoiCisvL3VzYWdlOiAgICAgIlxuCS12CQlWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktdyBTRUNTCQlOZXR3b3JrIHRpbWVvdXQiCisvL3VzYWdlOiAgICAgIlxuCS1IICdQUk9HIEFSR1MnCVJ1biBjb25uZWN0aW9uIGhlbHBlciIKKy8vdXNhZ2U6ICAgICAiXG4JCQlFeGFtcGxlczoiCisvL3VzYWdlOiAgICAgIlxuCQkJLUggJ2V4ZWMgb3BlbnNzbCBzX2NsaWVudCAtcXVpZXQgLXRsczEgLXN0YXJ0dGxzIHNtdHAiCisvL3VzYWdlOiAgICAgIlxuCQkJCS1jb25uZWN0IHNtdHAuZ21haWwuY29tOjI1JyA8ZW1haWwudHh0IgorLy91c2FnZTogICAgICJcbgkJCQlbNDx1c2VybmFtZV9hbmRfcGFzc3dkLnR4dCB8IC1hdVVTRVIgLWFwUEFTU10iCisvL3VzYWdlOiAgICAgIlxuCQkJLUggJ2V4ZWMgb3BlbnNzbCBzX2NsaWVudCAtcXVpZXQgLXRsczEiCisvL3VzYWdlOiAgICAgIlxuCQkJCS1jb25uZWN0IHNtdHAuZ21haWwuY29tOjQ2NScgPGVtYWlsLnR4dCIKKy8vdXNhZ2U6ICAgICAiXG4JCQkJWzQ8dXNlcm5hbWVfYW5kX3Bhc3N3ZC50eHQgfCAtYXVVU0VSIC1hcFBBU1NdIgorLy91c2FnZTogICAgICJcbgktUyBIT1NUWzpQT1JUXQlTZXJ2ZXIiCisvL3VzYWdlOiAgICAgIlxuCS1hdVVTRVIJCVVzZXJuYW1lIGZvciBBVVRIIExPR0lOIgorLy91c2FnZTogICAgICJcbgktYXBQQVNTIAlQYXNzd29yZCBmb3IgQVVUSCBMT0dJTiIKKy8vLy91c2FnZTogICAgICJcbgktYW1NRVRIT0QJQXV0aGVudGljYXRpb24gbWV0aG9kLiBJZ25vcmVkLiBMT0dJTiBpcyBpbXBsaWVkIgorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG5PdGhlciBvcHRpb25zIGFyZSBzaWxlbnRseSBpZ25vcmVkOyAtb2kgLXQgaXMgaW1wbGllZCIKKy8vdXNhZ2U6CUlGX01BS0VNSU1FKAorLy91c2FnZTogICAgICJcblVzZSBtYWtlbWltZSB0byBjcmVhdGUgZW1haWxzIHdpdGggYXR0YWNobWVudHMiCisvL3VzYWdlOgkpCisKKy8qIEN1cnJlbnRseSB3ZSBkb24ndCBzYW5pdGl6ZSBvciBlc2NhcGUgdXNlci1zdXBwbGllZCBTRU5ERVIgYW5kIFJFQ0lQSUVOVF9FTUFJTHMuCisgKiBXZSBtYXkgbmVlZCB0byBkbyBzby4gRm9yIG9uZSwgJy4nIGluIHVzZXJuYW1lcyBzZWVtcyB0byByZXF1aXJlIGVzY2FwaW5nIQorICoKKyAqIEZyb20gaHR0cDovL2NyLnlwLnRvL3NtdHAvYWRkcmVzcy5odG1sOgorICoKKyAqIFNNVFAgb2ZmZXJzIHRocmVlIHdheXMgdG8gZW5jb2RlIGEgY2hhcmFjdGVyIGluc2lkZSBhbiBhZGRyZXNzOgorICoKKyAqICJzYWZlIjogdGhlIGNoYXJhY3RlciwgaWYgaXQgaXMgbm90IDw+KClbXS4sOzpALCBiYWNrc2xhc2gsCisgKiAgZG91YmxlLXF1b3RlLCBzcGFjZSwgb3IgYW4gQVNDSUkgY29udHJvbCBjaGFyYWN0ZXI7CisgKiAicXVvdGVkIjogdGhlIGNoYXJhY3RlciwgaWYgaXQgaXMgbm90IFwwMTIsIFwwMTUsIGJhY2tzbGFzaCwKKyAqICAgb3IgZG91YmxlLXF1b3RlOyBvcgorICogInNsYXNoZWQiOiBiYWNrc2xhc2ggZm9sbG93ZWQgYnkgdGhlIGNoYXJhY3Rlci4KKyAqCisgKiBBbiBlbmNvZGVkIGJveCBwYXJ0IGlzIGVpdGhlciAoMSkgYSBzZXF1ZW5jZSBvZiBvbmUgb3IgbW9yZSBzbGFzaGVkCisgKiBvciBzYWZlIGNoYXJhY3RlcnMgb3IgKDIpIGEgZG91YmxlIHF1b3RlLCBhIHNlcXVlbmNlIG9mIHplcm8gb3IgbW9yZQorICogc2xhc2hlZCBvciBxdW90ZWQgY2hhcmFjdGVycywgYW5kIGEgZG91YmxlIHF1b3RlLiBJdCByZXByZXNlbnRzCisgKiB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgY2hhcmFjdGVycyBlbmNvZGVkIGluc2lkZSBpdC4KKyAqCisgKiBGb3IgZXhhbXBsZSwgdGhlIGVuY29kZWQgYm94IHBhcnRzCisgKglhbmdlbHMKKyAqCVxhXG5cZ1xlXGxccworICoJIlxhXG5cZ1xlXGxccyIKKyAqCSJhbmdlbHMiCisgKgkiYW5nXGVscyIKKyAqIGFsbCByZXByZXNlbnQgdGhlIDYtYnl0ZSBzdHJpbmcgImFuZ2VscyIsIGFuZCB0aGUgZW5jb2RlZCBib3ggcGFydHMKKyAqCWFcLGNvbW1hCisgKglcYVwsXGNcb1xtXG1cYQorICoJImEsY29tbWEiCisgKiBhbGwgcmVwcmVzZW50IHRoZSA3LWJ5dGUgc3RyaW5nICJhLGNvbW1hIi4KKyAqCisgKiBBbiBlbmNvZGVkIGFkZHJlc3MgY29udGFpbnMKKyAqCXRoZSBieXRlIDw7CisgKglvcHRpb25hbGx5LCBhIHJvdXRlIGZvbGxvd2VkIGJ5IGEgY29sb247CisgKglhbiBlbmNvZGVkIGJveCBwYXJ0LCB0aGUgYnl0ZSBALCBhbmQgYSBkb21haW47IGFuZAorICoJdGhlIGJ5dGUgPi4KKyAqCisgKiBJdCByZXByZXNlbnRzIGFuIEludGVybmV0IG1haWwgYWRkcmVzcywgZ2l2ZW4gYnkgY29uY2F0ZW5hdGluZworICogdGhlIHN0cmluZyByZXByZXNlbnRlZCBieSB0aGUgZW5jb2RlZCBib3ggcGFydCwgdGhlIGJ5dGUgQCwKKyAqIGFuZCB0aGUgZG9tYWluLiBGb3IgZXhhbXBsZSwgdGhlIGVuY29kZWQgYWRkcmVzc2VzCisgKiAgICAgPEdvZEBoZWF2ZW4uYWYubWlsPgorICogICAgIDxcR29kQGhlYXZlbi5hZi5taWw+CisgKiAgICAgPCJHb2QiQGhlYXZlbi5hZi5taWw+CisgKiAgICAgPEBnYXRld2F5LmFmLm1pbCxAdXVjcC5sb2NhbDoiXEdcb1xkIkBoZWF2ZW4uYWYubWlsPgorICogYWxsIHJlcHJlc2VudCB0aGUgSW50ZXJuZXQgbWFpbCBhZGRyZXNzICJHb2RAaGVhdmVuLmFmLm1pbCIuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibWFpbC5oIgorCisvLyBsaW1pdCBtYXhpbXVtIGFsbG93ZWQgbnVtYmVyIG9mIGhlYWRlcnMgdG8gcHJldmVudCBvdmVyZmxvd3MuCisvLyBzZXQgdG8gMCB0byBub3QgbGltaXQKKyNkZWZpbmUgTUFYX0hFQURFUlMgMjU2CisKK3N0YXRpYyB2b2lkIHNlbmRfcl9uKGNvbnN0IGNoYXIgKnMpCit7CisJaWYgKHZlcmJvc2UpCisJCWJiX2Vycm9yX21zZygic2VuZDonJXMnIiwgcyk7CisJcHJpbnRmKCIlc1xyXG4iLCBzKTsKK30KKworc3RhdGljIGludCBzbXRwX2NoZWNrcChjb25zdCBjaGFyICpmbXQsIGNvbnN0IGNoYXIgKnBhcmFtLCBpbnQgY29kZSkKK3sKKwljaGFyICphbnN3ZXI7CisJY2hhciAqbXNnID0gc2VuZF9tYWlsX2NvbW1hbmQoZm10LCBwYXJhbSk7CisJLy8gcmVhZCBzdGRpbgorCS8vIGlmIHRoZSBzdHJpbmcgaGFzIGEgZm9ybSBOTk4tIC0tIHJlYWQgbmV4dCBzdHJpbmcuIEUuZy4gRUhMTyByZXNwb25zZQorCS8vIHBhcnNlIGZpcnN0IGJ5dGVzIHRvIGEgbnVtYmVyCisJLy8gaWYgY29kZSA9IC0xIHRoZW4ganVzdCByZXR1cm4gdGhpcyBudW1iZXIKKwkvLyBpZiBjb2RlICE9IC0xIHRoZW4gY2hlY2tzIHdoZXRoZXIgdGhlIG51bWJlciBlcXVhbHMgdGhlIGNvZGUKKwkvLyBpZiBub3QgZXF1YWwgLT4gZGllIHNheWluZyBtc2cKKwl3aGlsZSAoKGFuc3dlciA9IHhtYWxsb2NfZmdldGxpbmUoc3RkaW4pKSAhPSBOVUxMKSB7CisJCWlmICh2ZXJib3NlKQorCQkJYmJfZXJyb3JfbXNnKCJyZWN2OiclLipzJyIsIChpbnQpKHN0cmNocm51bChhbnN3ZXIsICdccicpIC0gYW5zd2VyKSwgYW5zd2VyKTsKKwkJaWYgKHN0cmxlbihhbnN3ZXIpIDw9IDMgfHwgJy0nICE9IGFuc3dlclszXSkKKwkJCWJyZWFrOworCQlmcmVlKGFuc3dlcik7CisJfQorCWlmIChhbnN3ZXIpIHsKKwkJaW50IG4gPSBhdG9pKGFuc3dlcik7CisJCWlmICh0aW1lb3V0KQorCQkJYWxhcm0oMCk7CisJCWZyZWUoYW5zd2VyKTsKKwkJaWYgKC0xID09IGNvZGUgfHwgbiA9PSBjb2RlKSB7CisJCQlmcmVlKG1zZyk7CisJCQlyZXR1cm4gbjsKKwkJfQorCX0KKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgZmFpbGVkIiwgbXNnKTsKK30KKworc3RhdGljIGludCBzbXRwX2NoZWNrKGNvbnN0IGNoYXIgKmZtdCwgaW50IGNvZGUpCit7CisJcmV0dXJuIHNtdHBfY2hlY2twKGZtdCwgTlVMTCwgY29kZSk7Cit9CisKKy8vIHN0cmlwIGFyZ3VtZW50IG9mIGJhZCBjaGFycworc3RhdGljIGNoYXIgKnNhbmVfYWRkcmVzcyhjaGFyICpzdHIpCit7CisJY2hhciAqczsKKworCXRyaW0oc3RyKTsKKwlzID0gc3RyOworCXdoaWxlICgqcykgeworCQlpZiAoIWlzYWxudW0oKnMpICYmICFzdHJjaHIoIl8tLkAiLCAqcykpIHsKKwkJCWJiX2Vycm9yX21zZygiYmFkIGFkZHJlc3MgJyVzJyIsIHN0cik7CisJCQkvKiByZXR1cm5pbmcgIiI6ICovCisJCQlzdHJbMF0gPSAnXDAnOworCQkJcmV0dXJuIHN0cjsKKwkJfQorCQlzKys7CisJfQorCXJldHVybiBzdHI7Cit9CisKKy8vIGNoZWNrIGZvciBhbiBhZGRyZXNzIGluc2lkZSBhbmdsZSBicmFja2V0cywgaWYgbm90IGZvdW5kIGZhbGwgYmFjayB0byBub3JtYWwKK3N0YXRpYyBjaGFyICphbmdsZV9hZGRyZXNzKGNoYXIgKnN0cikKK3sKKwljaGFyICpzLCAqZTsKKworCXRyaW0oc3RyKTsKKwllID0gbGFzdF9jaGFyX2lzKHN0ciwgJz4nKTsKKwlpZiAoZSkgeworCQlzID0gc3RycmNocihzdHIsICc8Jyk7CisJCWlmIChzKSB7CisJCQkqZSA9ICdcMCc7CisJCQlzdHIgPSBzICsgMTsKKwkJfQorCX0KKwlyZXR1cm4gc2FuZV9hZGRyZXNzKHN0cik7Cit9CisKK3N0YXRpYyB2b2lkIHJjcHR0byhjb25zdCBjaGFyICpzKQoreworCWlmICghKnMpCisJCXJldHVybjsKKwkvLyBOLkIuIHdlIGRvbid0IGRpZSBpZiByZWNpcGllbnQgaXMgcmVqZWN0ZWQsIGZvciB0aGUgb3RoZXIgcmVjaXBpZW50cyBtYXkgYmUgYWNjZXB0ZWQKKwlpZiAoMjUwICE9IHNtdHBfY2hlY2twKCJSQ1BUIFRPOjwlcz4iLCBzLCAtMSkpCisJCWJiX2Vycm9yX21zZygiQmFkIHJlY2lwaWVudDogPCVzPiIsIHMpOworfQorCisvLyBzZW5kIHRvIGEgbGlzdCBvZiBjb21tYSBzZXBhcmF0ZWQgYWRkcmVzc2VzCitzdGF0aWMgdm9pZCByY3B0dG9fbGlzdChjb25zdCBjaGFyICpsaXN0KQoreworCWNoYXIgKnN0ciA9IHhzdHJkdXAobGlzdCk7CisJY2hhciAqcyA9IHN0cjsKKwljaGFyIHByZXYgPSAwOworCWludCBpbl9xdW90ZSA9IDA7CisKKwl3aGlsZSAoKnMpIHsKKwkJY2hhciBjaCA9ICpzKys7CisKKwkJaWYgKGNoID09ICciJyAmJiBwcmV2ICE9ICdcXCcpIHsKKwkJCWluX3F1b3RlID0gIWluX3F1b3RlOworCQl9IGVsc2UgaWYgKCFpbl9xdW90ZSAmJiBjaCA9PSAnLCcpIHsKKwkJCXNbLTFdID0gJ1wwJzsKKwkJCXJjcHR0byhhbmdsZV9hZGRyZXNzKHN0cikpOworCQkJc3RyID0gczsKKwkJfQorCQlwcmV2ID0gY2g7CisJfQorCWlmIChwcmV2ICE9ICcsJykKKwkJcmNwdHRvKGFuZ2xlX2FkZHJlc3Moc3RyKSk7CisJZnJlZShzdHIpOworfQorCitpbnQgc2VuZG1haWxfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNlbmRtYWlsX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpvcHRfY29ubmVjdCA9IG9wdF9jb25uZWN0OworCWNoYXIgKm9wdF9mcm9tID0gTlVMTDsKKwljaGFyICpzOworCWxsaXN0X3QgKmxpc3QgPSBOVUxMOworCWNoYXIgKmhvc3QgPSBzYW5lX2FkZHJlc3Moc2FmZV9nZXRob3N0bmFtZSgpKTsKKwl1bnNpZ25lZCBuaGVhZGVycyA9IDA7CisJaW50IGNvZGU7CisJZW51bSB7CisJCUhEUl9PVEhFUiA9IDAsCisJCUhEUl9UT0NDLAorCQlIRFJfQkNDLAorCX0gbGFzdF9oZHIgPSAwOworCWludCBjaGVja19oZHI7CisJaW50IGhhc190byA9IDA7CisKKwllbnVtIHsKKwkvLy0tLSBzdGFuZGFyZCBvcHRpb25zCisJCU9QVF90ID0gMSA8PCAwLCAgICAgICAgIC8vIHJlYWQgbWVzc2FnZSBmb3IgcmVjaXBpZW50cywgYXBwZW5kIHRoZW0gdG8gdGhvc2Ugb24gY21kbGluZQorCQlPUFRfZiA9IDEgPDwgMSwgICAgICAgICAvLyBzZW5kZXIgYWRkcmVzcworCQlPUFRfbyA9IDEgPDwgMiwgICAgICAgICAvLyB2YXJpb3VzIG9wdGlvbnMuIC1vaSBJTVBMSUVEISBvdGhlcnMgYXJlIElHTk9SRUQhCisJCU9QVF9pID0gMSA8PCAzLCAgICAgICAgIC8vIElNUExJRUQhCisJLy8tLS0gQkIgc3BlY2lmaWMgb3B0aW9ucworCQlPUFRfdyA9IDEgPDwgNCwgICAgICAgICAvLyBuZXR3b3JrIHRpbWVvdXQKKwkJT1BUX0ggPSAxIDw8IDUsICAgICAgICAgLy8gdXNlIGV4dGVybmFsIGNvbm5lY3Rpb24gaGVscGVyCisJCU9QVF9TID0gMSA8PCA2LCAgICAgICAgIC8vIHNwZWNpZnkgY29ubmVjdGlvbiBzdHJpbmcKKwkJT1BUX2EgPSAxIDw8IDcsICAgICAgICAgLy8gYXV0aGVudGljYXRpb24gdG9rZW5zCisJCU9QVF92ID0gMSA8PCA4LCAgICAgICAgIC8vIHZlcmJvc2l0eQorCX07CisKKwkvLyBpbml0IGdsb2JhbCB2YXJpYWJsZXMKKwlJTklUX0coKTsKKworCS8vIHNhdmUgaW5pdGlhbCBzdGRpbiBzaW5jZSBib2R5IGlzIHBpcGVkIQorCXhkdXAyKFNURElOX0ZJTEVOTywgMyk7CisJRy5mcDAgPSB4ZmRvcGVuX2Zvcl9yZWFkKDMpOworCisJLy8gcGFyc2Ugb3B0aW9ucworCS8vIC12IGlzIGEgY291bnRlciwgLUggYW5kIC1TIGFyZSBtdXR1YWxseSBleGNsdXNpdmUsIC1hIGlzIGEgbGlzdAorCW9wdF9jb21wbGVtZW50YXJ5ID0gInZ2OncrOkgtLVM6Uy0tSDphOjoiOworCS8vIE4uQi4gc2luY2UgLUggYW5kIC1TIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgdGhleSBkbyBub3QgaW50ZXJmZXJlIGluIG9wdF9jb25uZWN0CisJLy8gLWEgaXMgZm9yIHNzbXRwIChodHRwOi8vZG93bmxvYWRzLm9wZW53cnQub3JnL3Blb3BsZS9uaWNvL21hbi9tYW44L3NzbXRwLjguaHRtbCkgY29tcGF0aWJpbGl0eSwKKwkvLyBpdCBpcyBzdGlsbCB1bmRlciBkZXZlbG9wbWVudC4KKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgInRmOm86aXc6SDpTOmE6OnYiLCAmb3B0X2Zyb20sIE5VTEwsCisJCQkmdGltZW91dCwgJm9wdF9jb25uZWN0LCAmb3B0X2Nvbm5lY3QsICZsaXN0LCAmdmVyYm9zZSk7CisJLy9hcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworCS8vIHByb2Nlc3MgLWFbdXBtXTx0b2tlbj4gb3B0aW9ucworCWlmICgob3B0cyAmIE9QVF9hKSAmJiAhbGlzdCkKKwkJYmJfc2hvd191c2FnZSgpOworCXdoaWxlIChsaXN0KSB7CisJCWNoYXIgKmEgPSAoY2hhciAqKSBsbGlzdF9wb3AoJmxpc3QpOworCQlpZiAoJ3UnID09IGFbMF0pCisJCQlHLnVzZXIgPSB4c3RyZHVwKGErMSk7CisJCWlmICgncCcgPT0gYVswXSkKKwkJCUcucGFzcyA9IHhzdHJkdXAoYSsxKTsKKwkJLy8gTi5CLiB3ZSBzdXBwb3J0IG9ubHkgQVVUSCBMT0dJTiBzbyBmYXIKKwkJLy9pZiAoJ20nID09IGFbMF0pCisJCS8vCUcubWV0aG9kID0geHN0cmR1cChhKzEpOworCX0KKwkvLyBOLkIuIGxpc3QgPT0gTlVMTCBoZXJlCisJLy9iYl9pbmZvX21zZygiT1BUWyV4XSBBVVslc10sIEFQWyVzXSwgQU1bJXNdLCBBUkdWWyVzXSIsIG9wdHMsIGF1LCBhcCwgYW0sICphcmd2KTsKKworCS8vIGNvbm5lY3QgdG8gc2VydmVyCisKKwkvLyBjb25uZWN0aW9uIGhlbHBlciBvcmRlcmVkPyAtPgorCWlmIChvcHRzICYgT1BUX0gpIHsKKwkJY29uc3QgY2hhciAqYXJnc1tdID0geyAic2giLCAiLWMiLCBvcHRfY29ubmVjdCwgTlVMTCB9OworCQkvLyBwbHVnIGl0IGluCisJCWxhdW5jaF9oZWxwZXIoYXJncyk7CisJCS8vIE5vdzoKKwkJLy8gb3VyIHN0ZG91dCB3aWxsIGdvIHRvIGhlbHBlcidzIHN0ZGluLAorCQkvLyBoZWxwZXIncyBzdGRvdXQgd2lsbCBiZSBhdmFpbGFibGUgb24gb3VyIHN0ZGluLgorCisJCS8vIFdhaXQgZm9yIGluaXRpYWwgc2VydmVyIG1lc3NhZ2UuCisJCS8vIElmIGhlbHBlciAoc3VjaCBhcyBvcGVuc3NsKSBpbnZva2VzIFNUQVJUVExTLCB0aGUgaW5pdGlhbCAyMjAKKwkJLy8gaXMgc3dhbGxvd2VkIGJ5IGhlbHBlciAoYW5kIG5vdCByZXBlYXRlZCBhZnRlciBUTFMgaXMgaW5pdGlhdGVkKS4KKwkJLy8gV2Ugd2lsbCBzZW5kIE5PT1AgY21kIHRvIHNlcnZlciBhbmQgY2hlY2sgdGhlIHJlc3BvbnNlLgorCQkvLyBXZSBzaG91bGQgZ2V0IDIyMCsyNTAgb24gcGxhaW4gY29ubmVjdGlvbiwgMjUwIG9uIFNUQVJUVExTZWQgc2Vzc2lvbi4KKwkJLy8KKwkJLy8gVGhlIHByb2JsZW0gaGVyZSBpcyBzb21lIHNlcnZlcnMgZGVsYXkgaW5pdGlhbCAyMjAgbWVzc2FnZSwKKwkJLy8gYW5kIGNvbnNpZGVyIGNsaWVudCB0byBiZSBhIHNwYW1tZXIgaWYgaXQgc3RhcnRzIHNlbmRpbmcgY21kcworCQkvLyBiZWZvcmUgMjIwIHJlYWNoZWQgaXQuIFRoZSBjb2RlIGJlbG93IGlzIHVuc2FmZSBpbiB0aGlzIHJlZ2FyZDoKKwkJLy8gaW4gbm9uLVNUQVJUVExTZWQgY2FzZSwgd2UgcG90ZW50aWFsbHkgc2VuZCBOT09QIGJlZm9yZSAyMjAKKwkJLy8gaXMgc2VudCBieSBzZXJ2ZXIuCisJCS8vIElkZWFzPyAoLS1kZWxheSBTRUNTIG9wdD8gLS1hc3N1bWUtc3RhcnR0bHMtaGVscGVyIG9wdD8pCisJCWNvZGUgPSBzbXRwX2NoZWNrKCJOT09QIiwgLTEpOworCQlpZiAoY29kZSA9PSAyMjApCisJCQkvLyB3ZSBnb3QgMjIwIC0gdGhpcyBpcyBub3QgU1RBUlRUTFNlZCBjb25uZWN0aW9uLAorCQkJLy8gZWF0IDI1MCByZXNwb25zZSB0byBvdXIgTk9PUAorCQkJc210cF9jaGVjayhOVUxMLCAyNTApOworCQllbHNlCisJCWlmIChjb2RlICE9IDI1MCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJTTVRQIGluaXQgZmFpbGVkIik7CisJfSBlbHNlIHsKKwkJLy8gdmFuaWxsYSBjb25uZWN0aW9uCisJCWludCBmZDsKKwkJLy8gaG9zdFs6cG9ydF0gbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkPyAtPiB1c2UgJFNNVFBIT1NUCisJCS8vIG5vICRTTVRQSE9TVD8gLT4gdXNlIGxvY2FsaG9zdAorCQlpZiAoIShvcHRzICYgT1BUX1MpKSB7CisJCQlvcHRfY29ubmVjdCA9IGdldGVudigiU01UUEhPU1QiKTsKKwkJCWlmICghb3B0X2Nvbm5lY3QpCisJCQkJb3B0X2Nvbm5lY3QgPSAoY2hhciAqKSIxMjcuMC4wLjEiOworCQl9CisJCS8vIGRvIGNvbm5lY3QKKwkJZmQgPSBjcmVhdGVfYW5kX2Nvbm5lY3Rfc3RyZWFtX29yX2RpZShvcHRfY29ubmVjdCwgMjUpOworCQkvLyBhbmQgbWFrZSBvdXJzZWx2ZXMgYSBzaW1wbGUgSU8gZmlsdGVyCisJCXhtb3ZlX2ZkKGZkLCBTVERJTl9GSUxFTk8pOworCQl4ZHVwMihTVERJTl9GSUxFTk8sIFNURE9VVF9GSUxFTk8pOworCisJCS8vIFdhaXQgZm9yIGluaXRpYWwgc2VydmVyIDIyMCBtZXNzYWdlCisJCXNtdHBfY2hlY2soTlVMTCwgMjIwKTsKKwl9CisKKwkvLyB3ZSBzaG91bGQgc3RhcnQgd2l0aCBtb2Rlcm4gRUhMTworCWlmICgyNTAgIT0gc210cF9jaGVja3AoIkVITE8gJXMiLCBob3N0LCAtMSkpCisJCXNtdHBfY2hlY2twKCJIRUxPICVzIiwgaG9zdCwgMjUwKTsKKworCS8vIHBlcmZvcm0gYXV0aGVudGljYXRpb24KKwlpZiAob3B0cyAmIE9QVF9hKSB7CisJCXNtdHBfY2hlY2soIkFVVEggTE9HSU4iLCAzMzQpOworCQkvLyB3ZSBtdXN0IHJlYWQgY3JlZGVudGlhbHMgdW5sZXNzIHRoZXkgYXJlIGdpdmVuIHZpYSAtYVt1cF0gb3B0aW9ucworCQlpZiAoIUcudXNlciB8fCAhRy5wYXNzKQorCQkJZ2V0X2NyZWRfb3JfZGllKDQpOworCQllbmNvZGVfYmFzZTY0KE5VTEwsIEcudXNlciwgTlVMTCk7CisJCXNtdHBfY2hlY2soIiIsIDMzNCk7CisJCWVuY29kZV9iYXNlNjQoTlVMTCwgRy5wYXNzLCBOVUxMKTsKKwkJc210cF9jaGVjaygiIiwgMjM1KTsKKwl9CisKKwkvLyBzZXQgc2VuZGVyCisJLy8gTi5CLiB3ZSBoYXZlIGhlcmUgYSB2ZXJ5IGxvb3NlbHkgZGVmaW5lZCBhbGdvcnl0aG0KKwkvLyBzaW5jZSBzZW5kbWFpbCBoaXN0b3JpY2FsbHkgb2ZmZXJzIG5vIG1lYW5zIHRvIHNwZWNpZnkgc2VjcmV0cyBvbiBjbWRsaW5lLgorCS8vIDEpIHNlcnZlciBjYW4gcmVxdWlyZSBubyBhdXRoZW50aWNhdGlvbiAtPgorCS8vCXdlIG11c3QganVzdCBwcm92aWRlIGEgKHBvc3NpYmx5IGZha2UpIHJlcGx5IGFkZHJlc3MuCisJLy8gMikgc2VydmVyIGNhbiByZXF1aXJlIEFVVEggLT4KKwkvLwl3ZSBtdXN0IHByb3ZpZGUgdmFsaWQgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGFsb25nIHdpdGggYSAocG9zc2libHkgZmFrZSkgcmVwbHkgYWRkcmVzcy4KKwkvLwlGb3IgdGhlIHNha2Ugb2Ygc2VjdXJpdHkgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGFyZSB0byBiZSByZWFkIGVpdGhlciBmcm9tIGNvbnNvbGUgb3IgZnJvbSBhIHNlY3VyZWQgZmlsZS4KKwkvLwlTaW5jZSByZWFkaW5nIGZyb20gY29uc29sZSBtYXkgZGVmZWF0IHVzYWJpbGl0eSwgdGhlIHNvbHV0aW9uIGlzIGVpdGhlciB0byByZWFkIGZyb20gYSBwcmVkZWZpbmVkCisJLy8JZmlsZSBkZXNjcmlwdG9yIChlLmcuIDQpLCBvciBhZ2FpbiBmcm9tIGEgc2VjdXJlZCBmaWxlLgorCisJLy8gZ290IG5vIHNlbmRlciBhZGRyZXNzPyB1c2UgYXV0aCBuYW1lLCB0aGVuIFVJRCB1c2VybmFtZSBhcyBhIGxhc3QgcmVzb3J0CisJaWYgKCFvcHRfZnJvbSkgeworCQlvcHRfZnJvbSA9IHhhc3ByaW50ZigiJXNAJXMiLAorCQkgICAgICAgICAgICAgICAgICAgICBHLnVzZXIgPyBHLnVzZXIgOiB4dWlkMnVuYW1lKGdldHVpZCgpKSwKKwkJICAgICAgICAgICAgICAgICAgICAgeGdldGhvc3RieW5hbWUoaG9zdCktPmhfbmFtZSk7CisJfQorCWZyZWUoaG9zdCk7CisKKwlzbXRwX2NoZWNrcCgiTUFJTCBGUk9NOjwlcz4iLCBvcHRfZnJvbSwgMjUwKTsKKworCS8vIHByb2Nlc3MgbWVzc2FnZQorCisJLy8gcmVhZCByZWNpcGllbnRzIGZyb20gbWVzc2FnZSBhbmQgYWRkIHRoZW0gdG8gdGhvc2UgZ2l2ZW4gb24gY21kbGluZS4KKwkvLyB0aGlzIG1lYW5zIHdlIHNjYW4gc3RkaW4gZm9yIFRvOiwgQ2M6LCBCY2M6IGxpbmVzIHVudGlsIGFuIGVtcHR5IGxpbmUKKwkvLyBhbmQgdGhlbiB1c2UgdGhlIHJlc3Qgb2Ygc3RkaW4gYXMgbWVzc2FnZSBib2R5CisJY29kZSA9IDA7IC8vIHNldCAiYW5hbHl6ZSBoZWFkZXJzIiBtb2RlCisJd2hpbGUgKChzID0geG1hbGxvY19mZ2V0bGluZShHLmZwMCkpICE9IE5VTEwpIHsKKyBkdW1wOgorCQkvLyBwdXQgbWVzc2FnZSBsaW5lcyBkb3VibGluZyBsZWFkaW5nIGRvdHMKKwkJaWYgKGNvZGUpIHsKKwkJCS8vIGVzY2FwZSBsZWFkaW5nIGRvdHMKKwkJCS8vIE4uQi4gdGhpcyBmZWF0dXJlIGlzIGltcGxpZWQgZXZlbiBpZiBubyAtaSAoLW9pKSBzd2l0Y2ggZ2l2ZW4KKwkJCS8vIE4uQi4gd2UgbmVlZCB0byBlc2NhcGUgdGhlIGxlYWRpbmcgZG90IHJlZ2FyZGxlc3Mgb2YKKwkJCS8vIHdoZXRoZXIgaXQgaXMgc2luZ2xlIG9yIG5vdCBjaGFyYWN0ZXIgb24gdGhlIGxpbmUKKwkJCWlmICgnLicgPT0gc1swXSAvKiYmICdcMCcgPT0gc1sxXSAqLykKKwkJCQliYl9wdXRjaGFyKCcuJyk7CisJCQkvLyBkdW1wIHJlYWQgbGluZQorCQkJc2VuZF9yX24ocyk7CisJCQlmcmVlKHMpOworCQkJY29udGludWU7CisJCX0KKworCQkvLyBhbmFseXplIGhlYWRlcnMKKwkJLy8gVG86IG9yIENjOiBoZWFkZXJzIGFkZCByZWNpcGllbnRzCisJCWNoZWNrX2hkciA9ICgwID09IHN0cm5jYXNlY21wKCJUbzoiLCBzLCAzKSk7CisJCWhhc190byB8PSBjaGVja19oZHI7CisJCWlmIChvcHRzICYgT1BUX3QpIHsKKwkJCWlmIChjaGVja19oZHIgfHwgMCA9PSBzdHJuY2FzZWNtcCgiQmNjOiIgKyAxLCBzLCAzKSkgeworCQkJCXJjcHR0b19saXN0KHMrMyk7CisJCQkJbGFzdF9oZHIgPSBIRFJfVE9DQzsKKwkJCQlnb3RvIGFkZGhlYWRlcjsKKwkJCX0KKwkJCS8vIEJjYzogaGVhZGVyIGFkZHMgYmxpbmQgY29weSAoaGlkZGVuKSByZWNpcGllbnQKKwkJCWlmICgwID09IHN0cm5jYXNlY21wKCJCY2M6IiwgcywgNCkpIHsKKwkJCQlyY3B0dG9fbGlzdChzKzQpOworCQkJCWZyZWUocyk7CisJCQkJbGFzdF9oZHIgPSBIRFJfQkNDOworCQkJCWNvbnRpbnVlOyAvLyBOLkIuIEJjYzogdmFuaXNoZXMgZnJvbSBoZWFkZXJzIQorCQkJfQorCQl9CisJCWNoZWNrX2hkciA9IChsaXN0ICYmIGlzc3BhY2Uoc1swXSkpOworCQlpZiAoc3RyY2hyKHMsICc6JykgfHwgY2hlY2tfaGRyKSB7CisJCQkvLyBvdGhlciBoZWFkZXJzIGdvIHZlcmJhdGltCisJCQkvLyBOLkIuIFJGQzI4MjIgMi4yLjMgIkxvbmcgSGVhZGVyIEZpZWxkcyIgYWxsb3dzIGZvciBoZWFkZXJzIHRvIG9jY3VweSBzZXZlcmFsIGxpbmVzLgorCQkJLy8gQ29udGludWF0aW9uIGlzIGRlbm90ZWQgYnkgcHJlZml4aW5nIGFkZGl0aW9uYWwgbGluZXMgd2l0aCB3aGl0ZXNwYWNlKHMpLgorCQkJLy8gVGhhbmtzIChzdGVmYW4uc2V5ZnJpZWQgYXQgZ29vZ2xlbWFpbC5jb20pIGZvciBwb2ludGluZyB0aGlzIG91dC4KKwkJCWlmIChjaGVja19oZHIgJiYgbGFzdF9oZHIgIT0gSERSX09USEVSKSB7CisJCQkJcmNwdHRvX2xpc3QocysxKTsKKwkJCQlpZiAobGFzdF9oZHIgPT0gSERSX0JDQykKKwkJCQkJY29udGludWU7CisJCQkJCS8vIE4uQi4gQmNjOiB2YW5pc2hlcyBmcm9tIGhlYWRlcnMhCisJCQl9IGVsc2UgeworCQkJCWxhc3RfaGRyID0gSERSX09USEVSOworCQkJfQorIGFkZGhlYWRlcjoKKwkJCS8vIE4uQi4gd2UgYWxsb3cgTUFYX0hFQURFUlMgZ2VuZXJpYyBoZWFkZXJzIGF0IG1vc3QgdG8gcHJldmVudCBhdHRhY2tzCisJCQlpZiAoTUFYX0hFQURFUlMgJiYgKytuaGVhZGVycyA+PSBNQVhfSEVBREVSUykKKwkJCQlnb3RvIGJhaWw7CisJCQlsbGlzdF9hZGRfdG9fZW5kKCZsaXN0LCBzKTsKKwkJfSBlbHNlIHsKKwkJCS8vIGEgbGluZSB3aXRob3V0ICI6IiAoYW4gZW1wdHkgbGluZSB0b28sIGJ5IGRlZmluaXRpb24pIGRvZXNuJ3QgbG9vayBsaWtlIGEgdmFsaWQgaGVhZGVyCisJCQkvLyBzbyBzdG9wICJhbmFseXplIGhlYWRlcnMiIG1vZGUKKyByZWVudGVyOgorCQkJLy8gcHV0IHJlY2lwaWVudHMgc3BlY2lmaWVkIG9uIGNtZGxpbmUKKwkJCWNoZWNrX2hkciA9IDE7CisJCQl3aGlsZSAoKmFyZ3YpIHsKKwkJCQljaGFyICp0ID0gc2FuZV9hZGRyZXNzKCphcmd2KTsKKwkJCQlyY3B0dG8odCk7CisJCQkJLy9pZiAoTUFYX0hFQURFUlMgJiYgKytuaGVhZGVycyA+PSBNQVhfSEVBREVSUykKKwkJCQkvLwlnb3RvIGJhaWw7CisJCQkJaWYgKCFoYXNfdG8pIHsKKwkJCQkJY29uc3QgY2hhciAqaGRyOworCisJCQkJCWlmIChjaGVja19oZHIgJiYgYXJndlsxXSkKKwkJCQkJCWhkciA9ICJUbzogJXMsIjsKKwkJCQkJZWxzZSBpZiAoY2hlY2tfaGRyKQorCQkJCQkJaGRyID0gIlRvOiAlcyI7CisJCQkJCWVsc2UgaWYgKGFyZ3ZbMV0pCisJCQkJCQloZHIgPSAiVG86ICVzLCIgKyAzOworCQkJCQllbHNlCisJCQkJCQloZHIgPSAiVG86ICVzIiArIDM7CisJCQkJCWxsaXN0X2FkZF90b19lbmQoJmxpc3QsCisJCQkJCQkJeGFzcHJpbnRmKGhkciwgdCkpOworCQkJCQljaGVja19oZHIgPSAwOworCQkJCX0KKwkJCQlhcmd2Kys7CisJCQl9CisJCQkvLyBlbnRlciAicHV0IG1lc3NhZ2UiIG1vZGUKKwkJCS8vIE4uQi4gREFUQSBmYWlscyBpZmYgbm8gcmVjaXBpZW50cyB3ZXJlIGFjY2VwdGVkIChvciBldmVuIHByb3ZpZGVkKQorCQkJLy8gaW4gdGhpcyBjYXNlIGp1c3QgYmFpbCBvdXQgZ3JhY2VmdWxseQorCQkJaWYgKDM1NCAhPSBzbXRwX2NoZWNrKCJEQVRBIiwgLTEpKQorCQkJCWdvdG8gYmFpbDsKKwkJCS8vIGR1bXAgdGhlIGhlYWRlcnMKKwkJCXdoaWxlIChsaXN0KSB7CisJCQkJc2VuZF9yX24oKGNoYXIgKikgbGxpc3RfcG9wKCZsaXN0KSk7CisJCQl9CisJCQkvLyBzdG9wIGFuYWx5emluZyBoZWFkZXJzCisJCQljb2RlKys7CisJCQkvLyBOLkIuICFzIG1lYW5zOiB3ZSByZWFkIG5vdGhpbmcsIGFuZCBub3RoaW5nIHRvIGJlIHJlYWQgaW4gdGhlIGZ1dHVyZS4KKwkJCS8vIGp1c3QgZHVtcCBlbXB0eSBsaW5lIGFuZCBicmVhayB0aGUgbG9vcAorCQkJaWYgKCFzKSB7CisJCQkJc2VuZF9yX24oIiIpOworCQkJCWJyZWFrOworCQkJfQorCQkJLy8gZ28gZHVtcCBtZXNzYWdlIGJvZHkKKwkJCS8vIE4uQi4gInMiIGFscmVhZHkgY29udGFpbnMgdGhlIGZpcnN0IG5vbi1oZWFkZXIgbGluZSwgc28gcHJldGVuZCB3ZSByZWFkIGl0IGZyb20gaW5wdXQKKwkJCWdvdG8gZHVtcDsKKwkJfQorCX0KKwkvLyBvZGQgY2FzZTogd2UgZGlkbid0IHN0b3AgImFuYWx5emUgaGVhZGVycyIgbW9kZSAtPiBtZXNzYWdlIGJvZHkgaXMgZW1wdHkuIFJlZW50ZXIgdGhlIGxvb3AKKwkvLyBOLkIuIGFmdGVyIHJlZW50ZXIgY29kZSB3aWxsIGJlID4gMAorCWlmICghY29kZSkKKwkJZ290byByZWVudGVyOworCisJLy8gZmluYWxpemUgdGhlIG1lc3NhZ2UKKwlzbXRwX2NoZWNrKCIuIiwgMjUwKTsKKyBiYWlsOgorCS8vIC4uLiBhbmQgc2F5IGdvb2RieWUKKwlzbXRwX2NoZWNrKCJRVUlUIiwgMjIxKTsKKwkvLyBjbGVhbnVwCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmY2xvc2UoRy5mcDApOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9Db25maWcuc3JjIGIvbWlzY3V0aWxzL0NvbmZpZy5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5YWJmMQotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9Db25maWcuc3JjCkBAIC0wLDAgKzEsNTQ0IEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJNaXNjZWxsYW5lb3VzIFV0aWxpdGllcyIKKworSU5TRVJUCisKK2NvbmZpZyBBREpUSU1FWAorCWJvb2wgImFkanRpbWV4IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIEFkanRpbWV4IHJlYWRzIGFuZCBvcHRpb25hbGx5IHNldHMgYWRqdXN0bWVudCBwYXJhbWV0ZXJzIGZvcgorCSAgdGhlIExpbnV4IGNsb2NrIGFkanVzdG1lbnQgYWxnb3JpdGhtLgorCitjb25maWcgQkJDT05GSUcKKwlib29sICJiYmNvbmZpZyIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBUaGUgYmJjb25maWcgYXBwbGV0IHdpbGwgcHJpbnQgdGhlIGNvbmZpZyBmaWxlIHdpdGggd2hpY2gKKwkgIGJ1c3lib3ggd2FzIGJ1aWx0LgorCitjb25maWcgRkVBVFVSRV9DT01QUkVTU19CQkNPTkZJRworCWJvb2wgIkNvbXByZXNzIGJiY29uZmlnIGRhdGEiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBCQkNPTkZJRworCWhlbHAKKwkgIFN0b3JlIGJiY29uZmlnIGRhdGEgaW4gY29tcHJlc3NlZCBmb3JtLCB1bmNvbXByZXNzIHRoZW0gb24tdGhlLWZseQorCSAgYmVmb3JlIG91dHB1dC4KKworCSAgSWYgeW91IGhhdmUgYSByZWFsbHkgdGlueSBidXN5Ym94IHdpdGggZmV3IGFwcGxldHMgZW5hYmxlZCAoYW5kCisJICBidW56aXAyIGlzbid0IG9uZSBvZiB0aGVtKSwgdGhlIG92ZXJoZWFkIG9mIHRoZSBkZWNvbXByZXNzb3IgbWlnaHQKKwkgIGJlIG5vdGljZWFibGUuIEFsc28sIGlmIHlvdSBydW4gZXhlY3V0YWJsZXMgZGlyZWN0bHkgZnJvbSBST00KKwkgIGFuZCBoYXZlIHZlcnkgbGl0dGxlIG1lbW9yeSwgdGhpcyBtaWdodCBub3QgYmUgYSB3aW4uIE90aGVyd2lzZSwKKwkgIHlvdSBwcm9iYWJseSB3YW50IHRoaXMuCisKK2NvbmZpZyBCRUVQCisJYm9vbCAiYmVlcCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGUgYmVlcCBhcHBsZXRzIGJlZXBzIGluIGEgZ2l2ZW4gZnJlcS9Iei4KKworY29uZmlnIEZFQVRVUkVfQkVFUF9GUkVRCisJaW50ICJkZWZhdWx0IGZyZXF1ZW5jeSIKKwlyYW5nZSAwIDIxNDc0ODM2NDcKKwlkZWZhdWx0IDQwMDAKKwlkZXBlbmRzIG9uIEJFRVAKKwloZWxwCisJICBGcmVxdWVuY3kgZm9yIGRlZmF1bHQgYmVlcC4KKworY29uZmlnIEZFQVRVUkVfQkVFUF9MRU5HVEhfTVMKKwlpbnQgImRlZmF1bHQgbGVuZ3RoIgorCXJhbmdlIDAgMjE0NzQ4MzY0NworCWRlZmF1bHQgMzAKKwlkZXBlbmRzIG9uIEJFRVAKKwloZWxwCisJICBMZW5ndGggaW4gbXMgZm9yIGRlZmF1bHQgYmVlcC4KKworY29uZmlnIENIQVQKKwlib29sICJjaGF0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNpbXBsZSBjaGF0IHV0aWxpdHkuCisKK2NvbmZpZyBGRUFUVVJFX0NIQVRfTk9GQUlMCisJYm9vbCAiRW5hYmxlIE5PRkFJTCBleHBlY3Qgc3RyaW5ncyIKKwlkZXBlbmRzIG9uIENIQVQKKwlkZWZhdWx0IHkKKwloZWxwCisJICBXaGVuIGVuYWJsZWQgZXhwZWN0IHN0cmluZ3Mgd2hpY2ggYXJlIHN0YXJ0ZWQgd2l0aCBhIGRhc2ggdHJpZ2dlcgorCSAgbm8tZmFpbCBtb2RlLiBUaGF0IGlzIHdoZW4gZXhwZWN0YXRpb24gaXMgbm90IG1ldCB3aXRoaW4gdGltZW91dAorCSAgdGhlIHNjcmlwdCBpcyBub3QgdGVybWluYXRlZCBidXQgc2VuZHMgbmV4dCBTRU5EIHN0cmluZyBhbmQgd2FpdHMKKwkgIGZvciBuZXh0IEVYUEVDVCBzdHJpbmcuIFRoaXMgYWxsb3dzIHRvIGNvbXBvc2UgZmFyIG1vcmUgZmxleGlibGUKKwkgIHNjcmlwdHMuCisKK2NvbmZpZyBGRUFUVVJFX0NIQVRfVFRZX0hJRkkKKwlib29sICJGb3JjZSBTVERJTiB0byBiZSBhIFRUWSIKKwlkZXBlbmRzIG9uIENIQVQKKwlkZWZhdWx0IG4KKwloZWxwCisJICBPcmlnaW5hbCBjaGF0IGFsd2F5cyB0cmVhdHMgU1RESU4gYXMgYSBUVFkgZGV2aWNlIGFuZCBzZXRzIGZvciBpdAorCSAgc28tY2FsbGVkIHJhdyBtb2RlLiBUaGlzIG9wdGlvbiB0dXJucyBvbiBzdWNoIGJlaGF2aW91ci4KKworY29uZmlnIEZFQVRVUkVfQ0hBVF9JTVBMSUNJVF9DUgorCWJvb2wgIkVuYWJsZSBpbXBsaWNpdCBDYXJyaWFnZSBSZXR1cm4iCisJZGVwZW5kcyBvbiBDSEFUCisJZGVmYXVsdCB5CisJaGVscAorCSAgV2hlbiBlbmFibGVkIG1ha2UgY2hhdCB0byB0ZXJtaW5hdGUgYWxsIFNFTkQgc3RyaW5ncyB3aXRoIGEgIlxyIgorCSAgdW5sZXNzICJcYyIgaXMgbWV0IGFueXdoZXJlIGluIHRoZSBzdHJpbmcuCisKK2NvbmZpZyBGRUFUVVJFX0NIQVRfU1dBTExPV19PUFRTCisJYm9vbCAiU3dhbGxvdyBvcHRpb25zIgorCWRlcGVuZHMgb24gQ0hBVAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEJ1c3lib3ggY2hhdCByZXF1aXJlIG5vIG9wdGlvbnMuIFRvIG1ha2UgaXQgbm90IGZhaWwgd2hlbiB1c2VkCisJICBpbiBwbGFjZSBvZiBvcmlnaW5hbCBjaGF0ICh3aGljaCBoYXMgYSBidW5jaCBvZiBvcHRpb25zKSB0dXJuCisJICB0aGlzIG9uLgorCitjb25maWcgRkVBVFVSRV9DSEFUX1NFTkRfRVNDQVBFUworCWJvb2wgIlN1cHBvcnQgd2VpcmQgU0VORCBlc2NhcGVzIgorCWRlcGVuZHMgb24gQ0hBVAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIE9yaWdpbmFsIGNoYXQgdXNlcyBzb21lIGVzY2FwZSBzZXF1ZW5jZXMgaW4gU0VORCBhcmd1bWVudHMgd2hpY2gKKwkgIGFyZSBub3Qgc2VudCB0byBkZXZpY2UgYnV0IHJhdGhlciBwZXJmb3JtcyBzcGVjaWFsIGFjdGlvbnMuCisJICBFLmcuICJcSyIgbWVhbnMgdG8gc2VuZCBhIGJyZWFrIHNlcXVlbmNlIHRvIGRldmljZS4KKwkgICJcZCIgZGVsYXlzIGV4ZWN1dGlvbiBmb3IgYSBzZWNvbmQsICJccCIgLS0gZm9yIGEgMS8xMDAgb2Ygc2Vjb25kLgorCSAgQmVmb3JlIHR1cm5pbmcgdGhpcyBvcHRpb24gb24gdGhpbmsgdHdpY2U6IGRvIHlvdSByZWFsbHkgbmVlZCB0aGVtPworCitjb25maWcgRkVBVFVSRV9DSEFUX1ZBUl9BQk9SVF9MRU4KKwlib29sICJTdXBwb3J0IHZhcmlhYmxlLWxlbmd0aCBBQk9SVCBjb25kaXRpb25zIgorCWRlcGVuZHMgb24gQ0hBVAorCWRlZmF1bHQgeQorCWhlbHAKKwkgIE9yaWdpbmFsIGNoYXQgdXNlcyBmaXhlZCA1MC1ieXRlcyBsZW5ndGggQUJPUlQgY29uZGl0aW9ucy4gU2F5IE4gaGVyZS4KKworY29uZmlnIEZFQVRVUkVfQ0hBVF9DTFJfQUJPUlQKKwlib29sICJTdXBwb3J0IHJldm9raW5nIG9mIEFCT1JUIGNvbmRpdGlvbnMiCisJZGVwZW5kcyBvbiBDSEFUCisJZGVmYXVsdCB5CisJaGVscAorCSAgU3VwcG9ydCBDTFJfQUJPUlQgZGlyZWN0aXZlLgorCitjb25maWcgQ0hSVAorCWJvb2wgImNocnQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgbWFuaXB1bGF0ZSByZWFsLXRpbWUgYXR0cmlidXRlcyBvZiBhIHByb2Nlc3MuCisJICBUaGlzIHJlcXVpcmVzIHNjaGVkX3tnLHN9ZXRwYXJhbSBzdXBwb3J0IGluIHlvdXIgbGliYy4KKworY29uZmlnIENST05UQUIKKwlib29sICJjcm9udGFiIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIENyb250YWIgbWFuaXB1bGF0ZXMgdGhlIGNyb250YWIgZm9yIGEgcGFydGljdWxhciB1c2VyLiBPbmx5CisJICB0aGUgc3VwZXJ1c2VyIG1heSBzcGVjaWZ5IGEgZGlmZmVyZW50IHVzZXIgYW5kL29yIGNyb250YWIgZGlyZWN0b3J5LgorCSAgTm90ZSB0aGF0IEJ1c3lib3ggYmluYXJ5IG11c3QgYmUgc2V0dWlkIHJvb3QgZm9yIHRoaXMgYXBwbGV0IHRvCisJICB3b3JrIHByb3Blcmx5LgorCitjb25maWcgREMKKwlib29sICJkYyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBEYyBpcyBhIHJldmVyc2UtcG9saXNoIGRlc2sgY2FsY3VsYXRvciB3aGljaCBzdXBwb3J0cyB1bmxpbWl0ZWQKKwkgIHByZWNpc2lvbiBhcml0aG1ldGljLgorCitjb25maWcgRkVBVFVSRV9EQ19MSUJNCisJYm9vbCAiRW5hYmxlIHBvd2VyIGFuZCBleHAgZnVuY3Rpb25zIChyZXF1aXJlcyBsaWJtKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIERDCisJaGVscAorCSAgRW5hYmxlIHBvd2VyIGFuZCBleHAgZnVuY3Rpb25zLgorCSAgTk9URTogVGhpcyB3aWxsIHJlcXVpcmUgbGlibSB0byBiZSBwcmVzZW50IGZvciBsaW5raW5nLgorCitjb25maWcgREVWRlNECisJYm9vbCAiZGV2ZnNkIChvYnNvbGV0ZSkiCisJZGVmYXVsdCBuCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgVGhpcyBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgTk9UIGJlIHVzZWQgYW55bW9yZS4KKwkgIFVzZSBsaW51eCA+PSAyLjYgKG9wdGlvbmFsbHkgd2l0aCBob3RwbHVnKSBhbmQgbWRldiBpbnN0ZWFkIQorCSAgU2VlIGRvY3MvbWRldi50eHQgZm9yIGRldGFpbGVkIGluc3RydWN0aW9ucyBvbiBob3cgdG8gdXNlIG1kZXYKKwkgIGluc3RlYWQuCisKKwkgIFByb3ZpZGVzIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgZGV2aWNlIG5hbWVzIG9uIGEgZGV2ZnMgc3lzdGVtcy4KKwkgIFlvdSBzaG91bGQgc2V0IGl0IHRvIHRydWUgaWYgeW91IGhhdmUgZGV2ZnMgZW5hYmxlZC4KKwkgIFRoZSBmb2xsb3dpbmcga2V5d29yZHMgaW4gZGV2c2ZkLmNvbmYgYXJlIHN1cHBvcnRlZDoKKwkgICJDTEVBUl9DT05GSUciLCAiSU5DTFVERSIsICJPUFRJT05BTF9JTkNMVURFIiwgIlJFU1RPUkUiLAorCSAgIlBFUk1JU1NJT05TIiwgIkVYRUNVVEUiLCAiQ09QWSIsICJJR05PUkUiLAorCSAgIk1LT0xEQ09NUEFUIiwgIk1LTkVXQ09NUEFUIiwiUk1PTERDT01QQVQiLCAiUk1ORVdDT01QQVQiLgorCisJICBCdXQgb25seSBpZiB0aGV5IGFyZSB3cml0dGVuIFVQUEVSQ0FTRSEhISEhISEhCisKK2NvbmZpZyBERVZGU0RfTU9ETE9BRAorCWJvb2wgIkFkZHMgc3VwcG9ydCBmb3IgTU9ETE9BRCBrZXl3b3JkIGluIGRldnNmZC5jb25mIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gREVWRlNECisJaGVscAorCSAgVGhpcyBhY3R1YWxseSBkb2Vzbid0IHdvcmsgd2l0aCBidXN5Ym94IG1vZHV0aWxzIGJ1dCBuZWVkcworCSAgdGhlIGV4dGVybmFsIG1vZHV0aWxzLgorCitjb25maWcgREVWRlNEX0ZHX05QCisJYm9vbCAiRW5hYmxlcyB0aGUgLWZnIGFuZCAtbnAgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIERFVkZTRAorCWhlbHAKKwkgIC1mZyAgUnVuIHRoZSBkYWVtb24gaW4gdGhlIGZvcmVncm91bmQuCisJICAtbnAgIEV4aXQgYWZ0ZXIgcGFyc2luZyB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorCSAgICAgICBEbyBub3QgcG9sbCBmb3IgZXZlbnRzLgorCitjb25maWcgREVWRlNEX1ZFUkJPU0UKKwlib29sICJJbmNyZWFzZXMgbG9nZ2luZyAoYW5kIHNpemUpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gREVWRlNECisJaGVscAorCSAgSW5jcmVhc2VzIGxvZ2dpbmcgdG8gc3RkZXJyIG9yIHN5c2xvZy4KKworY29uZmlnIEZFQVRVUkVfREVWRlMKKwlib29sICJVc2UgZGV2ZnMgbmFtZXMgZm9yIGFsbCBkZXZpY2VzIChvYnNvbGV0ZSkiCisJZGVmYXVsdCBuCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhpcyBpcyBvYnNvbGV0ZSBhbmQgc2hvdWxkIE5PVCBiZSB1c2VkIGFueW1vcmUuCisJICBVc2UgbGludXggPj0gMi42IChvcHRpb25hbGx5IHdpdGggaG90cGx1ZykgYW5kIG1kZXYgaW5zdGVhZCEKKworCSAgRm9yIGxlZ2FjeSBzeXN0ZW1zIC0tIGlmIHRoZXJlIGlzIG5vIHdheSBhcm91bmQgZGV2ZnNkIC0tIHRoaXMKKwkgIHRlbGxzIGJ1c3lib3ggdG8gbG9vayBmb3IgbmFtZXMgbGlrZSAvZGV2L2xvb3AvMCBpbnN0ZWFkIG9mCisJICAvZGV2L2xvb3AwLiBJZiB5b3VyIC9kZXYgZGlyZWN0b3J5IGhhcyBub3JtYWwgbmFtZXMgaW5zdGVhZCBvZgorCSAgZGV2ZnMgbmFtZXMsIHlvdSBkb24ndCB3YW50IHRoaXMuCisKK2NvbmZpZyBERVZNRU0KKwlib29sICJkZXZtZW0iCisJZGVmYXVsdCB5CisJaGVscAorCSAgZGV2bWVtIGlzIGEgc21hbGwgcHJvZ3JhbSB0aGF0IHJlYWRzIGFuZCB3cml0ZXMgZnJvbSBwaHlzaWNhbAorCSAgbWVtb3J5IHVzaW5nIC9kZXYvbWVtLgorCitjb25maWcgRUpFQ1QKKwlib29sICJlamVjdCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBVc2VkIHRvIGVqZWN0IGNkcm9tcy4gKGRlZmF1bHRzIHRvIC9kZXYvY2Ryb20pCisKK2NvbmZpZyBGRUFUVVJFX0VKRUNUX1NDU0kKKwlib29sICJTQ1NJIHN1cHBvcnQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBFSkVDVAorCWhlbHAKKwkgIEFkZCB0aGUgLXMgb3B0aW9uIHRvIGVqZWN0LCB0aGlzIGFsbG93cyB0byBlamVjdCBTQ1NJLURldmljZXMgYW5kCisJICB1c2Itc3RvcmFnZSBkZXZpY2VzLgorCitjb25maWcgRkJTUExBU0gKKwlib29sICJmYnNwbGFzaCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBTaG93cyBzcGxhc2ggaW1hZ2UgYW5kIHByb2dyZXNzIGJhciBvbiBmcmFtZWJ1ZmZlciBkZXZpY2UuCisJICBDYW4gYmUgdXNlZCBkdXJpbmcgYm9vdCBwaGFzZSBvZiBhbiBlbWJlZGRlZCBkZXZpY2UuIH4ya2IuCisJICBVc2FnZToKKwkgIC0gdXNlIGtlcm5lbCBvcHRpb24gJ3ZnYT14eHgnIG9yIG90aGVyd2lzZSBlbmFibGUgZmIgZGV2aWNlLgorCSAgLSBwdXQgc29tZXdoZXJlIGZic3BsYXNoLmNmZyBmaWxlIGFuZCBhbiBpbWFnZSBpbiAucHBtIGZvcm1hdC4KKwkgIC0gJCBzZXRzaWQgZmJzcGxhc2ggW3BhcmFtc10gJgorCSAgICAtYzogaGlkZSBjdXJzb3IKKwkgICAgLWQgL2Rldi9mYk46IGZyYW1lYnVmZmVyIGRldmljZSAoaWYgbm90IC9kZXYvZmIwKQorCSAgICAtcyBwYXRoX3RvX2ltYWdlX2ZpbGUgKGNhbiBiZSAiLSIgZm9yIHN0ZGluKQorCSAgICAtaSBwYXRoX3RvX2NmZ19maWxlIChjYW4gYmUgIi0iIGZvciBzdGRpbikKKwkgICAgLWYgcGF0aF90b19maWZvIChjYW4gYmUgIi0iIGZvciBzdGRpbikKKwkgIC0gaWYgeW91IHdhbnQgdG8gcnVuIGl0IG9ubHkgaW4gcHJlc2VuY2Ugb2Yga2VybmVsIHBhcmFtZXRlcjoKKwkgICAgZ3JlcCAtcSAiZmJzcGxhc2g9b24iIDwvcHJvYy9jbWRsaW5lICYmIHNldHNpZCBmYnNwbGFzaCBbcGFyYW1zXSAmCisJICAtIGNvbW1hbmRzIGZvciBmaWZvOgorCSAgICAiTk4iIChBU0NJSSBkZWNpbWFsIG51bWJlcikgLSBwZXJjZW50YWdlIHRvIHNob3cgb24gcHJvZ3Jlc3MgYmFyCisJICAgICJleGl0IiAtIHdlbGwgeW91IGd1ZXNzZWQgaXQKKworY29uZmlnIEZMQVNIQ1AKKwlib29sICJmbGFzaGNwIgorCWRlZmF1bHQgbiAgIyBkb2Vzbid0IGJ1aWxkIG9uIFVidW50dSA4LjA0CisJaGVscAorCSAgVGhlIGZsYXNoY3AgYmluYXJ5LCBpbnNwaXJlZCBieSBtdGQtdXRpbHMgYXMgb2YgZ2l0IGhlYWQgNWVjZWI3NGY3LgorCSAgVGhpcyB1dGlsaXR5IGlzIHVzZWQgdG8gY29weSBpbWFnZXMgaW50byBhIE1URCBkZXZpY2UuCisKK2NvbmZpZyBGTEFTSF9MT0NLCisJYm9vbCAiZmxhc2hfbG9jayIKKwlkZWZhdWx0IG4gICMgZG9lc24ndCBidWlsZCBvbiBVYnVudHUgOC4wNAorCWhlbHAKKwkgIFRoZSBmbGFzaF9sb2NrIGJpbmFyeSBmcm9tIG10ZC11dGlscyBhcyBvZiBnaXQgaGVhZCA1ZWMwYzEwZDAuIFRoaXMKKwkgIHV0aWxpdHkgbG9ja3MgcGFydCBvciBhbGwgb2YgdGhlIGZsYXNoIGRldmljZS4KKworY29uZmlnIEZMQVNIX1VOTE9DSworCWJvb2wgImZsYXNoX3VubG9jayIKKwlkZWZhdWx0IG4gICMgZG9lc24ndCBidWlsZCBvbiBVYnVudHUgOC4wNAorCWhlbHAKKwkgIFRoZSBmbGFzaF91bmxvY2sgYmluYXJ5IGZyb20gbXRkLXV0aWxzIGFzIG9mIGdpdCBoZWFkIDVlYzBjMTBkMC4gVGhpcworCSAgdXRpbGl0eSB1bmxvY2tzIHBhcnQgb3IgYWxsIG9mIHRoZSBmbGFzaCBkZXZpY2UuCisKK2NvbmZpZyBGTEFTSF9FUkFTRUFMTAorCWJvb2wgImZsYXNoX2VyYXNlYWxsIgorCWRlZmF1bHQgbiAgIyBkb2Vzbid0IGJ1aWxkIG9uIFVidW50dSA4LjA0CisJaGVscAorCSAgVGhlIGZsYXNoX2VyYXNlYWxsIGJpbmFyeSBmcm9tIG10ZC11dGlscyBhcyBvZiBnaXQgaGVhZCBjNGM2YTU5ZWIuCisJICBUaGlzIHV0aWxpdHkgaXMgdXNlZCB0byBlcmFzZSB0aGUgd2hvbGUgTVREIGRldmljZS4KKworY29uZmlnIElPTklDRQorCWJvb2wgImlvbmljZSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBTZXQvc2V0IHByb2dyYW0gaW8gc2NoZWR1bGluZyBjbGFzcyBhbmQgcHJpb3JpdHkKKwkgIFJlcXVpcmVzIGtlcm5lbCA+PSAyLjYuMTMKKworY29uZmlnIElOT1RJRllECisJYm9vbCAiaW5vdGlmeWQiCisJZGVmYXVsdCBuICAjIGRvZXNuJ3QgYnVpbGQgb24gS25vcHBpeCA1CisJaGVscAorCSAgU2ltcGxlIGlub3RpZnkgZGFlbW9uLiBSZXBvcnRzIGZpbGVzeXN0ZW0gY2hhbmdlcy4gUmVxdWlyZXMKKwkgIGtlcm5lbCA+PSAyLjYuMTMKKworY29uZmlnIExBU1QKKwlib29sICJsYXN0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9XVE1QCisJaGVscAorCSAgJ2xhc3QnIGRpc3BsYXlzIGEgbGlzdCBvZiB0aGUgbGFzdCB1c2VycyB0aGF0IGxvZ2dlZCBpbnRvIHRoZSBzeXN0ZW0uCisKK2Nob2ljZQorCXByb21wdCAiQ2hvb3NlIGxhc3QgaW1wbGVtZW50YXRpb24iCisJZGVwZW5kcyBvbiBMQVNUCisJZGVmYXVsdCBGRUFUVVJFX0xBU1RfRkFOQ1kKKworY29uZmlnIEZFQVRVUkVfTEFTVF9TTUFMTAorCWJvb2wgInNtYWxsIgorCWhlbHAKKwkgIFRoaXMgaXMgYSBzbWFsbCB2ZXJzaW9uIG9mIGxhc3Qgd2l0aCBqdXN0IHRoZSBiYXNpYyBzZXQgb2YKKwkgIGZlYXR1cmVzLgorCitjb25maWcgRkVBVFVSRV9MQVNUX0ZBTkNZCisJYm9vbCAiaHVnZSIKKwloZWxwCisJICAnbGFzdCcgZGlzcGxheXMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGxhc3QgdXNlcnMgdGhhdAorCSAgbG9nZ2VkIGludG8gdGhlIHN5c3RlbSAobWltaWNzIHN5c3Zpbml0IGxhc3QpLiArOTAwIGJ5dGVzLgorZW5kY2hvaWNlCisKK2NvbmZpZyBIRFBBUk0KKwlib29sICJoZHBhcm0iCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgR2V0L1NldCBoYXJkIGRyaXZlIHBhcmFtZXRlcnMuIFByaW1hcmlseSBpbnRlbmRlZCBmb3IgQVRBCisJICBkcml2ZXMuIEFkZHMgYWJvdXQgMTNrIChvciBhcm91bmQgMzBrIGlmIHlvdSBlbmFibGUgdGhlCisJICBGRUFUVVJFX0hEUEFSTV9HRVRfSURFTlRJVFkgb3B0aW9uKS4uLi4KKworY29uZmlnIEZFQVRVUkVfSERQQVJNX0dFVF9JREVOVElUWQorCWJvb2wgIlN1cHBvcnQgb2J0YWluaW5nIGRldGFpbGVkIGluZm9ybWF0aW9uIGRpcmVjdGx5IGZyb20gZHJpdmVzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSERQQVJNCisJaGVscAorCSAgRW5hYmxlcyB0aGUgLUkgYW5kIC1pIG9wdGlvbnMgdG8gb2J0YWluIGRldGFpbGVkIGluZm9ybWF0aW9uCisJICBkaXJlY3RseSBmcm9tIGRyaXZlcyBhYm91dCB0aGVpciBjYXBhYmlsaXRpZXMgYW5kIHN1cHBvcnRlZCBBVEEKKwkgIGZlYXR1cmUgc2V0LiBJZiBubyBkZXZpY2UgbmFtZSBpcyBzcGVjaWZpZWQsIGhkcGFybSB3aWxsIHJlYWQKKwkgIGlkZW50aWZ5IGRhdGEgZnJvbSBzdGRpbi4gRW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBhZGQgYWJvdXQgMTZrLi4uCisKK2NvbmZpZyBGRUFUVVJFX0hEUEFSTV9IRElPX1NDQU5fSFdJRgorCWJvb2wgIlJlZ2lzdGVyIGFuIElERSBpbnRlcmZhY2UgKERBTkdFUk9VUykiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIRFBBUk0KKwloZWxwCisJICBFbmFibGVzIHRoZSAnaGRwYXJtIC1SJyBvcHRpb24gdG8gcmVnaXN0ZXIgYW4gSURFIGludGVyZmFjZS4KKwkgIFRoaXMgaXMgZGFuZ2Vyb3VzIHN0dWZmLCBzbyB5b3Ugc2hvdWxkIHByb2JhYmx5IHNheSBOLgorCitjb25maWcgRkVBVFVSRV9IRFBBUk1fSERJT19VTlJFR0lTVEVSX0hXSUYKKwlib29sICJVbi1yZWdpc3RlciBhbiBJREUgaW50ZXJmYWNlIChEQU5HRVJPVVMpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSERQQVJNCisJaGVscAorCSAgRW5hYmxlcyB0aGUgJ2hkcGFybSAtVScgb3B0aW9uIHRvIHVuLXJlZ2lzdGVyIGFuIElERSBpbnRlcmZhY2UuCisJICBUaGlzIGlzIGRhbmdlcm91cyBzdHVmZiwgc28geW91IHNob3VsZCBwcm9iYWJseSBzYXkgTi4KKworY29uZmlnIEZFQVRVUkVfSERQQVJNX0hESU9fRFJJVkVfUkVTRVQKKwlib29sICJQZXJmb3JtIGRldmljZSByZXNldCAoREFOR0VST1VTKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhEUEFSTQorCWhlbHAKKwkgIEVuYWJsZXMgdGhlICdoZHBhcm0gLXcnIG9wdGlvbiB0byBwZXJmb3JtIGEgZGV2aWNlIHJlc2V0LgorCSAgVGhpcyBpcyBkYW5nZXJvdXMgc3R1ZmYsIHNvIHlvdSBzaG91bGQgcHJvYmFibHkgc2F5IE4uCisKK2NvbmZpZyBGRUFUVVJFX0hEUEFSTV9IRElPX1RSSVNUQVRFX0hXSUYKKwlib29sICJUcmlzdGF0ZSBkZXZpY2UgZm9yIGhvdHN3YXAgKERBTkdFUk9VUykiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIRFBBUk0KKwloZWxwCisJICBFbmFibGVzIHRoZSAnaGRwYXJtIC14JyBvcHRpb24gdG8gdHJpc3RhdGUgZGV2aWNlIGZvciBob3Rzd2FwLAorCSAgYW5kIHRoZSAnLWInIG9wdGlvbiB0byBnZXQvc2V0IGJ1cyBzdGF0ZS4gVGhpcyBpcyBkYW5nZXJvdXMKKwkgIHN0dWZmLCBzbyB5b3Ugc2hvdWxkIHByb2JhYmx5IHNheSBOLgorCitjb25maWcgRkVBVFVSRV9IRFBBUk1fSERJT19HRVRTRVRfRE1BCisJYm9vbCAiR2V0L3NldCB1c2luZ19kbWEgZmxhZyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhEUEFSTQorCWhlbHAKKwkgIEVuYWJsZXMgdGhlICdoZHBhcm0gLWQnIG9wdGlvbiB0byBnZXQvc2V0IHVzaW5nX2RtYSBmbGFnLgorCitjb25maWcgTUFLRURFVlMKKwlib29sICJtYWtlZGV2cyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICAnbWFrZWRldnMnIGlzIGEgdXRpbGl0eSB1c2VkIHRvIGNyZWF0ZSBhIGJhdGNoIG9mIGRldmljZXMgd2l0aAorCSAgb25lIGNvbW1hbmQuCisKKwkgIFRoZXJlIGFyZSB0d28gY2hvaWNlcyBmb3IgY29tbWFuZCBsaW5lIGJlaGF2aW91ciwgdGhlIGludGVyZmFjZQorCSAgYXMgdXNlZCBieSBMRUFGL0xpbnV4IFJvdXRlciBQcm9qZWN0LCBvciBhIGRldmljZSB0YWJsZSBmaWxlLgorCisJICAnbGVhZicgaXMgdHJhZGl0aW9uYWxseSB3aGF0IGJ1c3lib3ggZm9sbG93cywgaXQgYWxsb3dzIG11bHRpcGxlCisJICBkZXZpY2VzIG9mIGEgcGFydGljbHVhciB0eXBlIHRvIGJlIGNyZWF0ZWQgcGVyIGNvbW1hbmQuCisJICBlLmcuIC9kZXYvaGRhWzAtOV0KKwkgIERldmljZSBwcm9wZXJ0aWVzIGFyZSBwYXNzZWQgYXMgY29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKworCSAgJ3RhYmxlJyByZWFkcyBkZXZpY2UgcHJvcGVydGllcyBmcm9tIGEgZmlsZSBvciBzdGRpbiwgYWxsb3dpbmcKKwkgIGEgYmF0Y2ggb2YgdW5yZWxhdGVkIGRldmljZXMgdG8gYmUgbWFkZSB3aXRoIG9uZSBjb21tYW5kLgorCSAgVXNlci9ncm91cCBuYW1lcyBhcmUgYWxsb3dlZCBhcyBhbiBhbHRlcm5hdGl2ZSB0byB1aWQvZ2lkLgorCitjaG9pY2UKKwlwcm9tcHQgIkNob29zZSBtYWtlZGV2cyBiZWhhdmlvdXIiCisJZGVwZW5kcyBvbiBNQUtFREVWUworCWRlZmF1bHQgRkVBVFVSRV9NQUtFREVWU19UQUJMRQorCitjb25maWcgRkVBVFVSRV9NQUtFREVWU19MRUFGCisJYm9vbCAibGVhZiIKKworY29uZmlnIEZFQVRVUkVfTUFLRURFVlNfVEFCTEUKKwlib29sICJ0YWJsZSIKKworZW5kY2hvaWNlCisKK2NvbmZpZyBNQU4KKwlib29sICJtYW4iCisJZGVmYXVsdCB5CisJaGVscAorCSAgRm9ybWF0IGFuZCBkaXNwbGF5IG1hbnVhbCBwYWdlcy4KKworY29uZmlnIE1JQ1JPQ09NCisJYm9vbCAibWljcm9jb20iCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIHBvb3IgbWFuJ3MgbWluaWNvbSB1dGlsaXR5IGZvciBjaGF0dGluZyB3aXRoIHNlcmlhbCBwb3J0IGRldmljZXMuCisKK2NvbmZpZyBNT1VOVFBPSU5UCisJYm9vbCAibW91bnRwb2ludCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBtb3VudHBvaW50IGNoZWNrcyBpZiB0aGUgZGlyZWN0b3J5IGlzIGEgbW91bnRwb2ludC4KKworY29uZmlnIE1UCisJYm9vbCAibXQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgbXQgaXMgdXNlZCB0byBjb250cm9sIHRhcGUgZGV2aWNlcy4gWW91IGNhbiB1c2UgdGhlIG10IHV0aWxpdHkKKwkgIHRvIGFkdmFuY2Ugb3IgcmV3aW5kIGEgdGFwZSBwYXN0IGEgc3BlY2lmaWVkIG51bWJlciBvZiBhcmNoaXZlCisJICBmaWxlcyBvbiB0aGUgdGFwZS4KKworY29uZmlnIFJBSURBVVRPUlVOCisJYm9vbCAicmFpZGF1dG9ydW4iCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgcmFpZGF1dG9ydW4gdGVsbHMgdGhlIGtlcm5lbCBtZCBkcml2ZXIgdG8KKwkgIHNlYXJjaCBhbmQgc3RhcnQgUkFJRCBhcnJheXMuCisKK2NvbmZpZyBSRUFEQUhFQUQKKwlib29sICJyZWFkYWhlYWQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBMRlMKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBQcmVsb2FkIHRoZSBmaWxlcyBsaXN0ZWQgb24gdGhlIGNvbW1hbmQgbGluZSBpbnRvIFJBTSBjYWNoZSBzbyB0aGF0CisJICBzdWJzZXF1ZW50IHJlYWRzIG9uIHRoZXNlIGZpbGVzIHdpbGwgbm90IGJsb2NrIG9uIGRpc2sgSS9PLgorCisJICBUaGlzIGFwcGxldCBqdXN0IGNhbGxzIHRoZSByZWFkYWhlYWQoMikgc3lzdGVtIGNhbGwgb24gZWFjaCBmaWxlLgorCSAgSXQgaXMgbWFpbmx5IHVzZWZ1bCBpbiBzeXN0ZW0gc3RhcnR1cCBzY3JpcHRzIHRvIHByZWxvYWQgZmlsZXMKKwkgIG9yIGV4ZWN1dGFibGVzIGJlZm9yZSB0aGV5IGFyZSB1c2VkLiBXaGVuIHVzZWQgYXQgdGhlIHJpZ2h0IHRpbWUKKwkgIChpbiBwYXJ0aWN1bGFyIHdoZW4gYSBDUFUgYm91bmQgcHJvY2VzcyBpcyBydW5uaW5nKSBpdCBjYW4KKwkgIHNpZ25pZmljYW50bHkgc3BlZWQgdXAgc3lzdGVtIHN0YXJ0dXAuCisKKwkgIEFzIHJlYWRhaGVhZCgyKSBibG9ja3MgdW50aWwgZWFjaCBmaWxlIGhhcyBiZWVuIHJlYWQsIGl0IGlzIGJlc3QgdG8KKwkgIHJ1biB0aGlzIGFwcGxldCBhcyBhIGJhY2tncm91bmQgam9iLgorCitjb25maWcgUlVOTEVWRUwKKwlib29sICJydW5sZXZlbCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfVVRNUAorCWhlbHAKKwkgIGZpbmQgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN5c3RlbSBydW5sZXZlbC4KKworCSAgVGhpcyBhcHBsZXQgdXNlcyB1dG1wIGJ1dCBkb2VzIG5vdCByZWx5IG9uIGJ1c3lib3ggc3VwcG9yaW5nCisJICB1dG1wIG9uIHB1cnBvc2UuIEl0IGlzIHVzZWQgYnkgZS5nLiBlbWRlYmlhbiB2aWEgL2V0Yy9pbml0LmQvcmMuCisKK2NvbmZpZyBSWAorCWJvb2wgInJ4IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFJlY2VpdmUgZmlsZXMgdXNpbmcgdGhlIFhtb2RlbSBwcm90b2NvbC4KKworY29uZmlnIFNFVFNJRAorCWJvb2wgInNldHNpZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBzZXRzaWQgcnVucyBhIHByb2dyYW0gaW4gYSBuZXcgc2Vzc2lvbgorCitjb25maWcgU1RSSU5HUworCWJvb2wgInN0cmluZ3MiCisJZGVmYXVsdCB5CisJaGVscAorCSAgc3RyaW5ncyBwcmludHMgdGhlIHByaW50YWJsZSBjaGFyYWN0ZXIgc2VxdWVuY2VzIGZvciBlYWNoIGZpbGUKKwkgIHNwZWNpZmllZC4KKworY29uZmlnIFRJTUUKKwlib29sICJ0aW1lIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSB0aW1lIGNvbW1hbmQgcnVucyB0aGUgc3BlY2lmaWVkIHByb2dyYW0gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgorCSAgV2hlbiB0aGUgY29tbWFuZCBmaW5pc2hlcywgdGltZSB3cml0ZXMgYSBtZXNzYWdlIHRvIHN0YW5kYXJkIG91dHB1dAorCSAgZ2l2aW5nIHRpbWluZyBzdGF0aXN0aWNzIGFib3V0IHRoaXMgcHJvZ3JhbSBydW4uCisKK2NvbmZpZyBUSU1FT1VUCisJYm9vbCAidGltZW91dCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBSdW5zIGEgcHJvZ3JhbSBhbmQgd2F0Y2hlcyBpdC4gSWYgaXQgZG9lcyBub3QgdGVybWluYXRlIGluCisJICBzcGVjaWZpZWQgbnVtYmVyIG9mIHNlY29uZHMsIGl0IGlzIHNlbnQgYSBzaWduYWwuCisKK2NvbmZpZyBUVFlTSVpFCisJYm9vbCAidHR5c2l6ZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBBIHJlcGxhY2VtZW50IGZvciAic3R0eSBzaXplIi4gVW5saWtlIHN0dHksIGNhbiByZXBvcnQgb25seSB3aWR0aCwKKwkgIG9ubHkgaGVpZ2h0LCBvciBib3RoLCBpbiBhbnkgb3JkZXIuIEl0IGFsc28gZG9lcyBub3QgY29tcGxhaW4gb24KKwkgIGVycm9yLCBidXQgcmV0dXJucyBkZWZhdWx0IDgweDI0LgorCSAgVXNhZ2UgaW4gc2hlbGwgc2NyaXB0czogd2lkdGg9YHR0eXNpemUgd2AuCisKK2NvbmZpZyBWT0xOQU1FCisJYm9vbCAidm9sbmFtZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBQcmludHMgYSBDRC1ST00gdm9sdW1lIG5hbWUuCisKK2NvbmZpZyBXQVRDSERPRworCWJvb2wgIndhdGNoZG9nIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoZSB3YXRjaGRvZyB1dGlsaXR5IGlzIHVzZWQgd2l0aCBoYXJkd2FyZSBvciBzb2Z0d2FyZSB3YXRjaGRvZworCSAgZGV2aWNlIGRyaXZlcnMuIEl0IG9wZW5zIHRoZSBzcGVjaWZpZWQgd2F0Y2hkb2cgZGV2aWNlIHNwZWNpYWwgZmlsZQorCSAgYW5kIHBlcmlvZGljYWxseSB3cml0ZXMgYSBtYWdpYyBjaGFyYWN0ZXIgdG8gdGhlIGRldmljZS4gSWYgdGhlCisJICB3YXRjaGRvZyBhcHBsZXQgZXZlciBmYWlscyB0byB3cml0ZSB0aGUgbWFnaWMgY2hhcmFjdGVyIHdpdGhpbiBhCisJICBjZXJ0YWluIGFtb3VudCBvZiB0aW1lLCB0aGUgd2F0Y2hkb2cgZGV2aWNlIGFzc3VtZXMgdGhlIHN5c3RlbSBoYXMKKwkgIGh1bmcsIGFuZCB3aWxsIGNhdXNlIHRoZSBoYXJkd2FyZSB0byByZWJvb3QuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL21pc2N1dGlscy9LYnVpbGQuc3JjIGIvbWlzY3V0aWxzL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I0NDllNgotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsNDYgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitsaWIteTo9CisKK0lOU0VSVAorbGliLSQoQ09ORklHX0FESlRJTUVYKSAgICArPSBhZGp0aW1leC5vCitsaWItJChDT05GSUdfQkJDT05GSUcpICAgICs9IGJiY29uZmlnLm8KK2xpYi0kKENPTkZJR19CRUVQKSAgICAgICAgKz0gYmVlcC5vCitsaWItJChDT05GSUdfQ0hBVCkgICAgICAgICs9IGNoYXQubworbGliLSQoQ09ORklHX0NIUlQpICAgICAgICArPSBjaHJ0Lm8KK2xpYi0kKENPTkZJR19DUk9OVEFCKSAgICAgKz0gY3JvbnRhYi5vCitsaWItJChDT05GSUdfREMpICAgICAgICAgICs9IGRjLm8KK2xpYi0kKENPTkZJR19ERVZGU0QpICAgICAgKz0gZGV2ZnNkLm8KK2xpYi0kKENPTkZJR19ERVZNRU0pICAgICAgKz0gZGV2bWVtLm8KK2xpYi0kKENPTkZJR19FSkVDVCkgICAgICAgKz0gZWplY3QubworbGliLSQoQ09ORklHX0ZCU1BMQVNIKSAgICArPSBmYnNwbGFzaC5vCitsaWItJChDT05GSUdfRkxBU0hDUCkgICAgICs9IGZsYXNoY3AubworbGliLSQoQ09ORklHX0ZMQVNIX0VSQVNFQUxMKSArPSBmbGFzaF9lcmFzZWFsbC5vCitsaWItJChDT05GSUdfRkxBU0hfTE9DSykgICAgICs9IGZsYXNoX2xvY2tfdW5sb2NrLm8KK2xpYi0kKENPTkZJR19GTEFTSF9VTkxPQ0spICAgKz0gZmxhc2hfbG9ja191bmxvY2subworbGliLSQoQ09ORklHX0lPTklDRSkgICAgICArPSBpb25pY2UubworbGliLSQoQ09ORklHX0hEUEFSTSkgICAgICArPSBoZHBhcm0ubworbGliLSQoQ09ORklHX0lOT1RJRllEKSAgICArPSBpbm90aWZ5ZC5vCitsaWItJChDT05GSUdfRkVBVFVSRV9MQVNUX1NNQUxMKSs9IGxhc3QubworbGliLSQoQ09ORklHX0ZFQVRVUkVfTEFTVF9GQU5DWSkrPSBsYXN0X2ZhbmN5Lm8KK2xpYi0kKENPTkZJR19MRVNTKSAgICAgICAgKz0gbGVzcy5vCitsaWItJChDT05GSUdfTUFLRURFVlMpICAgICs9IG1ha2VkZXZzLm8KK2xpYi0kKENPTkZJR19NQU4pICAgICAgICAgKz0gbWFuLm8KK2xpYi0kKENPTkZJR19NSUNST0NPTSkgICAgKz0gbWljcm9jb20ubworbGliLSQoQ09ORklHX01PVU5UUE9JTlQpICArPSBtb3VudHBvaW50Lm8KK2xpYi0kKENPTkZJR19NVCkgICAgICAgICAgKz0gbXQubworbGliLSQoQ09ORklHX1JBSURBVVRPUlVOKSArPSByYWlkYXV0b3J1bi5vCitsaWItJChDT05GSUdfUkVBREFIRUFEKSAgICs9IHJlYWRhaGVhZC5vCitsaWItJChDT05GSUdfUlVOTEVWRUwpICAgICs9IHJ1bmxldmVsLm8KK2xpYi0kKENPTkZJR19SWCkgICAgICAgICAgKz0gcngubworbGliLSQoQ09ORklHX1NFVFNJRCkgICAgICArPSBzZXRzaWQubworbGliLSQoQ09ORklHX1NUUklOR1MpICAgICArPSBzdHJpbmdzLm8KK2xpYi0kKENPTkZJR19USU1FKSAgICAgICAgKz0gdGltZS5vCitsaWItJChDT05GSUdfVElNRU9VVCkgICAgICs9IHRpbWVvdXQubworbGliLSQoQ09ORklHX1RUWVNJWkUpICAgICArPSB0dHlzaXplLm8KK2xpYi0kKENPTkZJR19WT0xOQU1FKSAgICAgKz0gdm9sbmFtZS5vCitsaWItJChDT05GSUdfV0FUQ0hET0cpICAgICs9IHdhdGNoZG9nLm8KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9hZGp0aW1leC5jIGIvbWlzY3V0aWxzL2FkanRpbWV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTM0MzY0YQotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9hZGp0aW1leC5jCkBAIC0wLDAgKzEsMTU3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBhZGp0aW1leC5jIC0gcmVhZCwgYW5kIHBvc3NpYmx5IG1vZGlmeSwgdGhlIExpbnV4IGtlcm5lbCBgdGltZXgnIHZhcmlhYmxlcy4KKyAqCisgKiBPcmlnaW5hbGx5IHdyaXR0ZW46IE9jdG9iZXIgMTk5NworICogTGFzdCBoYWNrOiBNYXJjaCAyMDAxCisgKiBDb3B5cmlnaHQgMTk5NywgMjAwMCwgMjAwMSBMYXJyeSBEb29saXR0bGUgPExSRG9vbGl0dGxlQGxibC5nb3Y+CisgKgorICogYnVzeWJveGVkIDIwIE1hcmNoIDIwMDEsIExhcnJ5IERvb2xpdHRsZSA8bGRvb2xpdHRAcmVjeWNsZS5sYmwuZ292PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGFkanRpbWV4X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXFdIFstbyBPRkZdIFstZiBGUkVRXSBbLXAgVENPTlNUXSBbLXQgVElDS10iCisvL3VzYWdlOiNkZWZpbmUgYWRqdGltZXhfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSZWFkIG9yIHNldCBrZXJuZWwgdGltZSB2YXJpYWJsZXMuIFNlZSBhZGp0aW1leCgyKVxuIgorLy91c2FnZTogICAgICJcbgktcQlRdWlldCIKKy8vdXNhZ2U6ICAgICAiXG4JLW8gT0ZGCVRpbWUgb2Zmc2V0LCBtaWNyb3NlY29uZHMiCisvL3VzYWdlOiAgICAgIlxuCS1mIEZSRVEJRnJlcXVlbmN5IGFkanVzdCwgaW50ZWdlciBrZXJuZWwgdW5pdHMgKDY1NTM2IGlzIDFwcG0pIgorLy91c2FnZTogICAgICJcbgktdCBUSUNLCU1pY3Jvc2Vjb25kcyBwZXIgdGljaywgdXN1YWxseSAxMDAwMCIKKy8vdXNhZ2U6ICAgICAiXG4JCShwb3NpdGl2ZSAtdCBvciAtZiB2YWx1ZXMgbWFrZSBjbG9jayBydW4gZmFzdGVyKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAgVENPTlNUIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZmRlZiBfX0JJT05JQ19fCisjIGluY2x1ZGUgPGxpbnV4L3RpbWV4Lmg+CisjZWxzZQorIyBpbmNsdWRlIDxzeXMvdGltZXguaD4KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgdWludDE2X3Qgc3RhdGxpc3RfYml0W10gPSB7CisJU1RBX1BMTCwKKwlTVEFfUFBTRlJFUSwKKwlTVEFfUFBTVElNRSwKKwlTVEFfRkxMLAorCVNUQV9JTlMsCisJU1RBX0RFTCwKKwlTVEFfVU5TWU5DLAorCVNUQV9GUkVRSE9MRCwKKwlTVEFfUFBTU0lHTkFMLAorCVNUQV9QUFNKSVRURVIsCisJU1RBX1BQU1dBTkRFUiwKKwlTVEFfUFBTRVJST1IsCisJU1RBX0NMT0NLRVJSLAorCTAKK307CitzdGF0aWMgY29uc3QgY2hhciBzdGF0bGlzdF9uYW1lW10gPQorCSJQTEwiICAgICAgICJcMCIKKwkiUFBTRlJFUSIgICAiXDAiCisJIlBQU1RJTUUiICAgIlwwIgorCSJGRkwiICAgICAgICJcMCIKKwkiSU5TIiAgICAgICAiXDAiCisJIkRFTCIgICAgICAgIlwwIgorCSJVTlNZTkMiICAgICJcMCIKKwkiRlJFUUhPTEQiICAiXDAiCisJIlBQU1NJR05BTCIgIlwwIgorCSJQUFNKSVRURVIiICJcMCIKKwkiUFBTV0FOREVSIiAiXDAiCisJIlBQU0VSUk9SIiAgIlwwIgorCSJDTE9DS0VSUiIKKzsKKworc3RhdGljIGNvbnN0IGNoYXIgcmV0X2NvZGVfZGVzY3JpcHRbXSA9CisJImNsb2NrIHN5bmNocm9uaXplZCIgIlwwIgorCSJpbnNlcnQgbGVhcCBzZWNvbmQiICJcMCIKKwkiZGVsZXRlIGxlYXAgc2Vjb25kIiAiXDAiCisJImxlYXAgc2Vjb25kIGluIHByb2dyZXNzIiAiXDAiCisJImxlYXAgc2Vjb25kIGhhcyBvY2N1cnJlZCIgIlwwIgorCSJjbG9jayBub3Qgc3luY2hyb25pemVkIgorOworCitpbnQgYWRqdGltZXhfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGFkanRpbWV4X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwllbnVtIHsKKwkJT1BUX3F1aWV0ID0gMHgxCisJfTsKKwl1bnNpZ25lZCBvcHQ7CisJY2hhciAqb3B0X28sICpvcHRfZiwgKm9wdF9wLCAqb3B0X3Q7CisJc3RydWN0IHRpbWV4IHR4YzsKKwlpbnQgaSwgcmV0OworCWNvbnN0IGNoYXIgKmRlc2NyaXB0OworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTAiOyAvKiBubyB2YWxpZCBub24tb3B0aW9uIHBhcmFtZXRlcnMgKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAicW86ZjpwOnQ6IiwKKwkJCSZvcHRfbywgJm9wdF9mLCAmb3B0X3AsICZvcHRfdCk7CisJdHhjLm1vZGVzID0gMDsKKwkvL2lmIChvcHQgJiAweDEpIC8vIC1xCisJaWYgKG9wdCAmIDB4MikgeyAvLyAtbworCQl0eGMub2Zmc2V0ID0geGF0b2wob3B0X28pOworCQl0eGMubW9kZXMgfD0gQURKX09GRlNFVF9TSU5HTEVTSE9UOworCX0KKwlpZiAob3B0ICYgMHg0KSB7IC8vIC1mCisJCXR4Yy5mcmVxID0geGF0b2wob3B0X2YpOworCQl0eGMubW9kZXMgfD0gQURKX0ZSRVFVRU5DWTsKKwl9CisJaWYgKG9wdCAmIDB4OCkgeyAvLyAtcAorCQl0eGMuY29uc3RhbnQgPSB4YXRvbChvcHRfcCk7CisJCXR4Yy5tb2RlcyB8PSBBREpfVElNRUNPTlNUOworCX0KKwlpZiAob3B0ICYgMHgxMCkgeyAvLyAtdAorCQl0eGMudGljayA9IHhhdG9sKG9wdF90KTsKKwkJdHhjLm1vZGVzIHw9IEFESl9USUNLOworCX0KKworCXJldCA9IGFkanRpbWV4KCZ0eGMpOworCisJaWYgKHJldCA8IDApIHsKKwkJYmJfcGVycm9yX25vbXNnX2FuZF9kaWUoKTsKKwl9CisKKwlpZiAoIShvcHQgJiBPUFRfcXVpZXQpKSB7CisJCWNvbnN0IGNoYXIgKnNlcDsKKwkJY29uc3QgY2hhciAqbmFtZTsKKworCQlwcmludGYoCisJCQkiICAgIG1vZGU6ICAgICAgICAgJWRcbiIKKwkJCSItbyAgb2Zmc2V0OiAgICAgICAlbGQgdXNcbiIKKwkJCSItZiAgZnJlcS5hZGp1c3Q6ICAlbGQgKDY1NTM2ID0gMXBwbSlcbiIKKwkJCSIgICAgbWF4ZXJyb3I6ICAgICAlbGRcbiIKKwkJCSIgICAgZXN0ZXJyb3I6ICAgICAlbGRcbiIKKwkJCSIgICAgc3RhdHVzOiAgICAgICAlZCAoIiwKKwkJdHhjLm1vZGVzLCB0eGMub2Zmc2V0LCB0eGMuZnJlcSwgdHhjLm1heGVycm9yLAorCQl0eGMuZXN0ZXJyb3IsIHR4Yy5zdGF0dXMpOworCisJCS8qIHJlcHJlc2VudGF0aXZlIG91dHB1dCBvZiBuZXh0IGNvZGUgZnJhZ21lbnQ6CisJCSAqICJQTEwgfCBQUFNUSU1FIgorCQkgKi8KKwkJbmFtZSA9IHN0YXRsaXN0X25hbWU7CisJCXNlcCA9ICIiOworCQlmb3IgKGkgPSAwOyBzdGF0bGlzdF9iaXRbaV07IGkrKykgeworCQkJaWYgKHR4Yy5zdGF0dXMgJiBzdGF0bGlzdF9iaXRbaV0pIHsKKwkJCQlwcmludGYoIiVzJXMiLCBzZXAsIG5hbWUpOworCQkJCXNlcCA9ICIgfCAiOworCQkJfQorCQkJbmFtZSArPSBzdHJsZW4obmFtZSkgKyAxOworCQl9CisKKwkJZGVzY3JpcHQgPSAiZXJyb3IiOworCQlpZiAocmV0IDw9IDUpCisJCQlkZXNjcmlwdCA9IG50aF9zdHJpbmcocmV0X2NvZGVfZGVzY3JpcHQsIHJldCk7CisJCXByaW50ZigiKVxuIgorCQkJIi1wICB0aW1lY29uc3RhbnQ6ICVsZFxuIgorCQkJIiAgICBwcmVjaXNpb246ICAgICVsZCB1c1xuIgorCQkJIiAgICB0b2xlcmFuY2U6ICAgICVsZFxuIgorCQkJIi10ICB0aWNrOiAgICAgICAgICVsZCB1c1xuIgorCQkJIiAgICB0aW1lLnR2X3NlYzogICVsZFxuIgorCQkJIiAgICB0aW1lLnR2X3VzZWM6ICVsZFxuIgorCQkJIiAgICByZXR1cm4gdmFsdWU6ICVkICglcylcbiIsCisJCXR4Yy5jb25zdGFudCwKKwkJdHhjLnByZWNpc2lvbiwgdHhjLnRvbGVyYW5jZSwgdHhjLnRpY2ssCisJCShsb25nKXR4Yy50aW1lLnR2X3NlYywgKGxvbmcpdHhjLnRpbWUudHZfdXNlYywgcmV0LCBkZXNjcmlwdCk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvYmJjb25maWcuYyBiL21pc2N1dGlscy9iYmNvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZjRlYjMKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvYmJjb25maWcuYwpAQCAtMCwwICsxLDQwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIFRoaXMgZmlsZSB3YXMgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbiBieSBQYXVsIEZveC4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgYmJjb25maWdfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIiIKKy8vdXNhZ2U6I2RlZmluZSBiYmNvbmZpZ19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IHRoZSBjb25maWcgZmlsZSB1c2VkIGJ5IGJ1c3lib3ggYnVpbGQiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImJiY29uZmlnb3B0cy5oIgorI2lmIEVOQUJMRV9GRUFUVVJFX0NPTVBSRVNTX0JCQ09ORklHCisjIGluY2x1ZGUgImJiX2FyY2hpdmUuaCIKKyMgaW5jbHVkZSAiYmJjb25maWdvcHRzX2J6Mi5oIgorI2VuZGlmCisKK2ludCBiYmNvbmZpZ19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgYmJjb25maWdfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKyNpZiBFTkFCTEVfRkVBVFVSRV9DT01QUkVTU19CQkNPTkZJRworCWJ1bnppcF9kYXRhICpiZDsKKwlpbnQgaSA9IHN0YXJ0X2J1bnppcCgmYmQsCisJCQkvKiBzcmNfZmQ6ICovIC0xLAorCQkJLyogaW5idWY6ICAqLyBiYmNvbmZpZ19jb25maWdfYnoyLAorCQkJLyogbGVuOiAgICAqLyBzaXplb2YoYmJjb25maWdfY29uZmlnX2J6MikpOworCS8qIHJlYWRfYnVuemlwIGNhbiBsb25nam1wIHRvIHN0YXJ0X2J1bnppcCwgYW5kIHVsdGltYXRlbHkKKwkgKiBlbmQgdXAgaGVyZSB3aXRoIGkgIT0gMCBvbiByZWFkIGRhdGEgZXJyb3JzISBOb3QgdHJpdmlhbCAqLworCWlmICghaSkgeworCQkvKiBDYW5ub3QgdXNlIHhtYWxsb2M6IHdpbGwgbGVhayBiZCBpbiBOT0ZPUksgY2FzZSEgKi8KKwkJY2hhciAqb3V0YnVmID0gbWFsbG9jX29yX3dhcm4oc2l6ZW9mKGJiY29uZmlnX2NvbmZpZykpOworCQlpZiAob3V0YnVmKSB7CisJCQlyZWFkX2J1bnppcChiZCwgb3V0YnVmLCBzaXplb2YoYmJjb25maWdfY29uZmlnKSk7CisJCQlmdWxsX3dyaXRlMV9zdHIob3V0YnVmKTsKKwkJfQorCX0KKyNlbHNlCisJZnVsbF93cml0ZTFfc3RyKGJiY29uZmlnX2NvbmZpZyk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9iZWVwLmMgYi9taXNjdXRpbHMvYmVlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMGUwM2UKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvYmVlcC5jCkBAIC0wLDAgKzEsMTI3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBiZWVwIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBiZWVwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICItZiBGUkVRIC1sIExFTiAtZCBERUxBWSAtciBDT1VOVCAtbiIKKy8vdXNhZ2U6I2RlZmluZSBiZWVwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1mCUZyZXF1ZW5jeSBpbiBIeiIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGVuZ3RoIGluIG1zIgorLy91c2FnZTogICAgICJcbgktZAlEZWxheSBpbiBtcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXIJUmVwZXRpdGlvbnMiCisvL3VzYWdlOiAgICAgIlxuCS1uCVN0YXJ0IG5ldyB0b25lIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2luY2x1ZGUgPGxpbnV4L2tkLmg+CisjaWZuZGVmIENMT0NLX1RJQ0tfUkFURQorIyBkZWZpbmUgQ0xPQ0tfVElDS19SQVRFIDExOTMxODAKKyNlbmRpZgorCisvKiBkZWZhdWx0cyAqLworI2lmbmRlZiBDT05GSUdfRkVBVFVSRV9CRUVQX0ZSRVEKKyMgZGVmaW5lIEZSRVEgKDQwMDApCisjZWxzZQorIyBkZWZpbmUgRlJFUSAoQ09ORklHX0ZFQVRVUkVfQkVFUF9GUkVRKQorI2VuZGlmCisjaWZuZGVmIENPTkZJR19GRUFUVVJFX0JFRVBfTEVOR1RIX01TCisjIGRlZmluZSBMRU5HVEggKDMwKQorI2Vsc2UKKyMgZGVmaW5lIExFTkdUSCAoQ09ORklHX0ZFQVRVUkVfQkVFUF9MRU5HVEhfTVMpCisjZW5kaWYKKyNkZWZpbmUgREVMQVkgKDApCisjZGVmaW5lIFJFUEVUSVRJT05TICgxKQorCitpbnQgYmVlcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgYmVlcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgc3BlYWtlciA9IGdldF9jb25zb2xlX2ZkX29yX2RpZSgpOworCXVuc2lnbmVkIHRpY2tyYXRlX2Rpdl9mcmVxID0gdGlja3JhdGVfZGl2X2ZyZXE7IC8qIGZvciBjb21waWxlciAqLworCXVuc2lnbmVkIGxlbmd0aCA9IGxlbmd0aDsKKwl1bnNpZ25lZCBkZWxheSA9IGRlbGF5OworCXVuc2lnbmVkIHJlcCA9IHJlcDsKKwlpbnQgYzsKKworCWMgPSAnbic7CisJd2hpbGUgKGMgIT0gLTEpIHsKKwkJaWYgKGMgPT0gJ24nKSB7CisJCQl0aWNrcmF0ZV9kaXZfZnJlcSA9IENMT0NLX1RJQ0tfUkFURSAvIEZSRVE7CisJCQlsZW5ndGggPSBMRU5HVEg7CisJCQlkZWxheSA9IERFTEFZOworCQkJcmVwID0gUkVQRVRJVElPTlM7CisJCX0KKwkJYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiZjpsOmQ6cjpuIik7CisvKiBUT0RPOiAtcywgLWM6CisgKiBwaXBlIHN0ZGluIHRvIHN0ZG91dCwgYnV0IGFsc28gYmVlcCBhZnRlciBlYWNoIGxpbmUgKC1zKSBvciBjaGFyICgtYykKKyAqLworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnZic6CisvKiBUT0RPOiB3aGF0ICItZiAwIiBzaG91bGQgZG8/ICovCisJCQl0aWNrcmF0ZV9kaXZfZnJlcSA9ICh1bnNpZ25lZClDTE9DS19USUNLX1JBVEUgLyB4YXRvdShvcHRhcmcpOworCQkJY29udGludWU7CisJCWNhc2UgJ2wnOgorCQkJbGVuZ3RoID0geGF0b3Uob3B0YXJnKTsKKwkJCWNvbnRpbnVlOworCQljYXNlICdkJzoKKy8qIFRPRE86CisgKiAtZCBOLCAtRCBOCisgKiBzcGVjaWZ5IGEgZGVsYXkgb2YgTiBtaWxsaXNlY29uZHMgYmV0d2VlbiByZXBldGl0aW9ucy4KKyAqIC1kIHNwZWNpZmllcyB0aGF0IHRoaXMgZGVsYXkgc2hvdWxkIG9ubHkgb2NjdXIgYmV0d2VlbiBiZWVwcywKKyAqIHRoYXQgaXMsIGl0IHNob3VsZCBub3Qgb2NjdXIgYWZ0ZXIgdGhlIGxhc3QgcmVwZXRpdGlvbi4KKyAqIC1EIGluZGljYXRlcyB0aGF0IHRoZSBkZWxheSBzaG91bGQgb2NjdXIgYWZ0ZXIgZXZlcnkgcmVwZXRpdGlvbgorICovCisJCQlkZWxheSA9IHhhdG91KG9wdGFyZyk7CisJCQljb250aW51ZTsKKwkJY2FzZSAncic6CisJCQlyZXAgPSB4YXRvdShvcHRhcmcpOworCQkJY29udGludWU7CisJCWNhc2UgJ24nOgorCQljYXNlIC0xOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKwkJd2hpbGUgKHJlcCkgeworLy9iYl9pbmZvX21zZygicmVwWyVkXSBmcmVxPSVkLCBsZW5ndGg9JWQsIGRlbGF5PSVkIiwgcmVwLCBmcmVxLCBsZW5ndGgsIGRlbGF5KTsKKwkJCXhpb2N0bChzcGVha2VyLCBLSU9DU09VTkQsICh2b2lkKikodWludHB0cl90KXRpY2tyYXRlX2Rpdl9mcmVxKTsKKwkJCXVzbGVlcCgxMDAwICogbGVuZ3RoKTsKKwkJCWlvY3RsKHNwZWFrZXIsIEtJT0NTT1VORCwgKHZvaWQqKTApOworCQkJaWYgKC0tcmVwKQorCQkJCXVzbGVlcCgxMDAwICogZGVsYXkpOworCQl9CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShzcGVha2VyKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorLyoKKyAqIHNvLCBlLmcuIEJlZXRob3ZlbidzIDl0aCBzeW1waG9ueSAiT2RlIGFuIGRpZSBGcmV1ZGUiIHdvdWxkIGJlCisgKiBzb21ldGhpbmcgbGlrZToKK2E9JCgoMjIwKjMpKQorYj0kKCgyNDcqMykpCitjPSQoKDI2MiozKSkKK2Q9JCgoMjk0KjMpKQorZT0kKCgzMjkqMykpCitmPSQoKDM0OSozKSkKK2c9JCgoMzkyKjMpKQorIy4vYmVlcCAtZiRkIC1sMjAwIC1yMiAtbiAtZiRlIC1sMTAwIC1kIDEwIC1uIC1mJGMgLWw0MDAgLWYkZyAtbDIwMAorLi9iZWVwIC1mJGUgLWwyMDAgLXIyIFwKKyAgICAgICAgLW4gLWQgMTAwIC1mJGYgLWwyMDAgXAorICAgICAgICAtbiAtZiRnIC1sMjAwIC1yMiBcCisgICAgICAgIC1uIC1mJGYgLWwyMDAgXAorICAgICAgICAtbiAtZiRlIC1sMjAwIFwKKyAgICAgICAgLW4gLWYkZCAtbDIwMCBcCisgICAgICAgIC1uIC1mJGMgLWwyMDAgLXIyIFwKKyAgICAgICAgLW4gLWYkZCAtbDIwMCBcCisgICAgICAgIC1uIC1mJGUgLWwyMDAgXAorICAgICAgICAtbiAtZiRlIC1sNDAwIFwKKyAgICAgICAgLW4gLWYkZCAtbDEwMCBcCisgICAgICAgIC1uIC1mJGQgLWwyMDAgXAorKi8KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9jaGF0LmMgYi9taXNjdXRpbHMvY2hhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMmFiYzIKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvY2hhdC5jCkBAIC0wLDAgKzEsNDQ1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBiYXJlIGJvbmVzIGNoYXQgdXRpbGl0eQorICogaW5zcGlyZWQgYnkgcHBwJ3MgY2hhdAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBWbGFkaW1pciBEcm9ubmlrb3YgPGRyb25uaWtvdkBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgY2hhdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiRVhQRUNUIFtTRU5EIFtFWFBFQ1QgW1NFTkQuLi5dXV0iCisvL3VzYWdlOiNkZWZpbmUgY2hhdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlVzZWZ1bCBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBhIG1vZGVtIGNvbm5lY3RlZCB0byBzdGRpbi9zdGRvdXQuXG4iCisvL3VzYWdlOiAgICAgICAiQSBzY3JpcHQgY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUgXCJleHBlY3Qtc2VuZFwiIHBhaXJzIG9mIHN0cmluZ3MsXG4iCisvL3VzYWdlOiAgICAgICAiZWFjaCBwYWlyIGlzIGEgcGFpciBvZiBhcmd1bWVudHMuIEV4YW1wbGU6XG4iCisvL3VzYWdlOiAgICAgICAiY2hhdCAnJyBBVFogT0sgQVREMTIzNDU2IENPTk5FQ1QgJycgb2dpbjogcHBwdXNlciB3b3JkOiBwcHBwYXNzICd+JyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8vIGRlZmF1bHQgdGltZW91dDogNDUgc2VjCisjZGVmaW5lIERFRkFVTFRfQ0hBVF9USU1FT1VUIDQ1KjEwMDAKKy8vIG1heCBsZW5ndGggb2YgImFib3J0IHN0cmluZyIsCisvLyBpLmUuIGRldmljZSByZXBseSB3aGljaCBjYXVzZXMgdGVybWluYXRpb24KKyNkZWZpbmUgTUFYX0FCT1JUX0xFTiA1MAorCisvLyBwb3NzaWJsZSBleGl0IGNvZGVzCitlbnVtIHsKKwlFUlJfT0sgPSAwLCAgICAgLy8gYWxsJ3Mgd2VsbAorCUVSUl9NRU0sICAgICAgICAvLyByZWFkIHRvbyBtdWNoIHdoaWxlIGV4cGVjdGluZworCUVSUl9JTywgICAgICAgICAvLyBzaWduYWxsZWQgb3IgSS9PIGVycm9yCisJRVJSX1RJTUVPVVQsICAgIC8vIHRpbWVkIG91dCB3aGlsZSBleHBlY3RpbmcKKwlFUlJfQUJPUlQsICAgICAgLy8gZmlyc3QgYWJvcnQgY29uZGl0aW9uIHdhcyBtZXQKKy8vCUVSUl9BQk9SVDIsICAgICAvLyBzZWNvbmQgYWJvcnQgY29uZGl0aW9uIHdhcyBtZXQKKy8vCS4uLgorfTsKKworLy8gZXhpdCBjb2RlCisjZGVmaW5lIGV4aXRjb2RlIGJiX2dvdF9zaWduYWwKKworLy8gdHJhcCBmb3IgY3JpdGljYWwgc2lnbmFscworc3RhdGljIHZvaWQgc2lnbmFsX2hhbmRsZXIoVU5VU0VEX1BBUkFNIGludCBzaWdubykKK3sKKwkvLyByZXBvcnQgSS9PIGVycm9yIGNvbmRpdGlvbgorCWV4aXRjb2RlID0gRVJSX0lPOworfQorCisjaWYgIUVOQUJMRV9GRUFUVVJFX0NIQVRfSU1QTElDSVRfQ1IKKyNkZWZpbmUgdW5lc2NhcGUocywgbm9jcikgdW5lc2NhcGUocykKKyNlbmRpZgorc3RhdGljIHNpemVfdCB1bmVzY2FwZShjaGFyICpzLCBpbnQgKm5vY3IpCit7CisJY2hhciAqc3RhcnQgPSBzOworCWNoYXIgKnAgPSBzOworCisJd2hpbGUgKCpzKSB7CisJCWNoYXIgYyA9ICpzOworCQkvLyBkbyB3ZSBuZWVkIHNwZWNpYWwgcHJvY2Vzc2luZz8KKwkJLy8gc3RhbmRhcmQgZXNjYXBlcyArIFxzIGZvciBzcGFjZSBhbmQgXE4gZm9yIFwwCisJCS8vIFxjIGluaGliaXRzIHRlcm1pbmF0aW5nIFxyIGZvciBjb21tYW5kcyBhbmQgaXMgbm9vcCBmb3IgZXhwZWN0cworCQlpZiAoJ1xcJyA9PSBjKSB7CisJCQljID0gKisrczsKKwkJCWlmIChjKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hBVF9JTVBMSUNJVF9DUgorCQkJCWlmICgnYycgPT0gYykgeworCQkJCQkqbm9jciA9IDE7CisJCQkJCWdvdG8gbmV4dDsKKwkJCQl9CisjZW5kaWYKKwkJCQlpZiAoJ04nID09IGMpIHsKKwkJCQkJYyA9ICdcMCc7CisJCQkJfSBlbHNlIGlmICgncycgPT0gYykgeworCQkJCQljID0gJyAnOworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQVRfTk9GQUlMCisJCQkJLy8gdW5lc2NhcGUgbGVhZGluZyBkYXNoIG9ubHkKKwkJCQkvLyBUT0RPOiBhbmQgb25seSBmb3IgZXhwZWN0LCBub3QgY29tbWFuZCBzdHJpbmcKKwkJCQl9IGVsc2UgaWYgKCctJyA9PSBjICYmIChzdGFydCArIDEgPT0gcykpIHsKKwkJCQkJLy9jID0gJy0nOworI2VuZGlmCisJCQkJfSBlbHNlIHsKKwkJCQkJYyA9IGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlKChjb25zdCBjaGFyICoqKSZzKTsKKwkJCQkJcy0tOworCQkJCX0KKwkJCX0KKwkJLy8gXkEgYmVjb21lcyBcMDAxLCBeQiAtLSBcMDAyIGFuZCBzbyBvbi4uLgorCQl9IGVsc2UgaWYgKCdeJyA9PSBjKSB7CisJCQljID0gKisrcy0nQCc7CisJCX0KKwkJLy8gcHV0IHVuZXNjYXBlZCBjaGFyCisJCSpwKysgPSBjOworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQVRfSU1QTElDSVRfQ1IKKyBuZXh0OgorI2VuZGlmCisJCS8vIG5leHQgY2hhcgorCQlzKys7CisJfQorCSpwID0gJ1wwJzsKKworCXJldHVybiBwIC0gc3RhcnQ7Cit9CisKK2ludCBjaGF0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjaGF0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmVjb3JkX2ZkID0gLTE7CisJYm9vbCBlY2hvID0gMDsKKwkvLyBjb2xsZWN0aW9uIG9mIGRldmljZSByZXBsaWVzIHdoaWNoIGNhdXNlIHVuY29uZGl0aW9uYWwgdGVybWluYXRpb24KKwlsbGlzdF90ICphYm9ydHMgPSBOVUxMOworCS8vIGluYWN0aXZpdHkgcGVyaW9kCisJaW50IHRpbWVvdXQgPSBERUZBVUxUX0NIQVRfVElNRU9VVDsKKwkvLyBtYXhpbXVtIGxlbmd0aCBvZiBhYm9ydCBzdHJpbmcKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSEFUX1ZBUl9BQk9SVF9MRU4KKwlzaXplX3QgbWF4X2Fib3J0X2xlbiA9IDA7CisjZWxzZQorI2RlZmluZSBtYXhfYWJvcnRfbGVuIE1BWF9BQk9SVF9MRU4KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0NIQVRfVFRZX0hJRkkKKwlzdHJ1Y3QgdGVybWlvcyB0aW8wLCB0aW87CisjZW5kaWYKKwkvLyBkaXJlY3RpdmUgbmFtZXMKKwllbnVtIHsKKwkJRElSX0hBTkdVUCA9IDAsCisJCURJUl9BQk9SVCwKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSEFUX0NMUl9BQk9SVAorCQlESVJfQ0xSX0FCT1JULAorI2VuZGlmCisJCURJUl9USU1FT1VULAorCQlESVJfRUNITywKKwkJRElSX1NBWSwKKwkJRElSX1JFQ09SRCwKKwl9OworCisJLy8gbWFrZSB4KiBmdW5jdGlvbnMgZmFpbCB3aXRoIGNvcnJlY3QgZXhpdGNvZGUKKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSBFUlJfSU87CisKKwkvLyB0cmFwIHZhbmlsbGEgc2lnbmFscyB0byBwcmV2ZW50IHByb2Nlc3MgZnJvbSBiZWluZyBraWxsZWQgc3VkZGVubHkKKwliYl9zaWduYWxzKDAKKwkJKyAoMSA8PCBTSUdIVVApCisJCSsgKDEgPDwgU0lHSU5UKQorCQkrICgxIDw8IFNJR1RFUk0pCisJCSsgKDEgPDwgU0lHUElQRSkKKwkJLCBzaWduYWxfaGFuZGxlcik7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSEFUX1RUWV9ISUZJCisJdGNnZXRhdHRyKFNURElOX0ZJTEVOTywgJnRpbyk7CisJdGlvMCA9IHRpbzsKKwljZm1ha2VyYXcoJnRpbyk7CisJdGNzZXRhdHRyKFNURElOX0ZJTEVOTywgVENTQUZMVVNILCAmdGlvKTsKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hBVF9TV0FMTE9XX09QVFMKKwlnZXRvcHQzMihhcmd2LCAidlZzU0UiKTsKKwlhcmd2ICs9IG9wdGluZDsKKyNlbHNlCisJYXJndisrOyAvLyBnb3RvIGZpcnN0IGFyZworI2VuZGlmCisJLy8gaGFuZGxlIGNoYXQgZXhwZWN0LXNlbmQgcGFpcnMKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJLy8gZGlyZWN0aXZlIGdpdmVuPyBwcm9jZXNzIGl0CisJCWludCBrZXkgPSBpbmRleF9pbl9zdHJpbmdzKAorCQkJIkhBTkdVUFwwIiAiQUJPUlRcMCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSEFUX0NMUl9BQk9SVAorCQkJIkNMUl9BQk9SVFwwIgorI2VuZGlmCisJCQkiVElNRU9VVFwwIiAiRUNIT1wwIiAiU0FZXDAiICJSRUNPUkRcMCIKKwkJCSwgKmFyZ3YKKwkJKTsKKwkJaWYgKGtleSA+PSAwKSB7CisJCQkvLyBjYWNoZSBkaXJlY3RpdmUgdmFsdWUKKwkJCWNoYXIgKmFyZyA9ICorK2FyZ3Y7CisJCQkvLyBPRkYgLT4gMCwgYW55dGhpbmcgZWxzZSAtPiAxCisJCQlib29sIG9ub2ZmID0gKDAgIT0gc3RyY21wKCJPRkYiLCBhcmcpKTsKKwkJCS8vIHByb2Nlc3MgZGlyZWN0aXZlCisJCQlpZiAoRElSX0hBTkdVUCA9PSBrZXkpIHsKKwkJCQkvLyB0dXJuIFNJR0hVUCBvbi9vZmYKKwkJCQlzaWduYWwoU0lHSFVQLCBvbm9mZiA/IHNpZ25hbF9oYW5kbGVyIDogU0lHX0lHTik7CisJCQl9IGVsc2UgaWYgKERJUl9BQk9SVCA9PSBrZXkpIHsKKwkJCQkvLyBhcHBlbmQgdGhlIHN0cmluZyB0byBhYm9ydCBjb25kaXRpb25zCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hBVF9WQVJfQUJPUlRfTEVOCisJCQkJc2l6ZV90IGxlbiA9IHN0cmxlbihhcmcpOworCQkJCWlmIChsZW4gPiBtYXhfYWJvcnRfbGVuKQorCQkJCQltYXhfYWJvcnRfbGVuID0gbGVuOworI2VuZGlmCisJCQkJbGxpc3RfYWRkX3RvX2VuZCgmYWJvcnRzLCBhcmcpOworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQVRfQ0xSX0FCT1JUCisJCQl9IGVsc2UgaWYgKERJUl9DTFJfQUJPUlQgPT0ga2V5KSB7CisJCQkJbGxpc3RfdCAqbDsKKwkJCQkvLyByZW1vdmUgdGhlIHN0cmluZyBmcm9tIGFib3J0IGNvbmRpdGlvbnMKKwkJCQkvLyBOLkIuIGdvdHRhIHJlZnJlc2ggbWF4aW11bSBsZW5ndGggdG9vLi4uCisjIGlmIEVOQUJMRV9GRUFUVVJFX0NIQVRfVkFSX0FCT1JUX0xFTgorCQkJCW1heF9hYm9ydF9sZW4gPSAwOworIyBlbmRpZgorCQkJCWZvciAobCA9IGFib3J0czsgbDsgbCA9IGwtPmxpbmspIHsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfQ0hBVF9WQVJfQUJPUlRfTEVOCisJCQkJCXNpemVfdCBsZW4gPSBzdHJsZW4obC0+ZGF0YSk7CisjIGVuZGlmCisJCQkJCWlmIChzdHJjbXAoYXJnLCBsLT5kYXRhKSA9PSAwKSB7CisJCQkJCQlsbGlzdF91bmxpbmsoJmFib3J0cywgbCk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorIyBpZiBFTkFCTEVfRkVBVFVSRV9DSEFUX1ZBUl9BQk9SVF9MRU4KKwkJCQkJaWYgKGxlbiA+IG1heF9hYm9ydF9sZW4pCisJCQkJCQltYXhfYWJvcnRfbGVuID0gbGVuOworIyBlbmRpZgorCQkJCX0KKyNlbmRpZgorCQkJfSBlbHNlIGlmIChESVJfVElNRU9VVCA9PSBrZXkpIHsKKwkJCQkvLyBzZXQgbmV3IHRpbWVvdXQKKwkJCQkvLyAtMSBtZWFucyBPRkYKKwkJCQl0aW1lb3V0ID0gYXRvaShhcmcpICogMTAwMDsKKwkJCQkvLyAwIG1lYW5zIGRlZmF1bHQKKwkJCQkvLyA+MCBtZWFucyB2YWx1ZSBpbiBtc2VjcworCQkJCWlmICghdGltZW91dCkKKwkJCQkJdGltZW91dCA9IERFRkFVTFRfQ0hBVF9USU1FT1VUOworCQkJfSBlbHNlIGlmIChESVJfRUNITyA9PSBrZXkpIHsKKwkJCQkvLyB0dXJuIGVjaG8gb24vb2ZmCisJCQkJLy8gTi5CLiBlY2hvIG1lYW5zIGR1bXBpbmcgZGV2aWNlIGlucHV0L291dHB1dCB0byBzdGRlcnIKKwkJCQllY2hvID0gb25vZmY7CisJCQl9IGVsc2UgaWYgKERJUl9SRUNPUkQgPT0ga2V5KSB7CisJCQkJLy8gdHVybiByZWNvcmQgb24vb2ZmCisJCQkJLy8gTi5CLiByZWNvcmQgbWVhbnMgZHVtcGluZyBkZXZpY2UgaW5wdXQgdG8gYSBmaWxlCisJCQkJCS8vIGNsb3NlIHByZXZpb3VzIHJlY29yZF9mZAorCQkJCWlmIChyZWNvcmRfZmQgPiAwKQorCQkJCQljbG9zZShyZWNvcmRfZmQpOworCQkJCS8vIE4uQi4gZG8gd2UgaGF2ZSB0byBkaWUgaGVyZSBvbiBvcGVuIGVycm9yPworCQkJCXJlY29yZF9mZCA9IChvbm9mZikgPyB4b3BlbihhcmcsIE9fV1JPTkxZfE9fQ1JFQVR8T19UUlVOQykgOiAtMTsKKwkJCX0gZWxzZSBpZiAoRElSX1NBWSA9PSBrZXkpIHsKKwkJCQkvLyBqdXN0IHByaW50IGFyZ3VtZW50IHZlcmJhdGltCisJCQkJLy8gVE9ETzogc2hvdWxkIHdlIHVzZSBmdWxsX3dyaXRlKCkgdG8gYXZvaWQgdW5pc3RkL3N0ZGlvIGNvbmZsaWN0PworCQkJCWJiX2Vycm9yX21zZygiJXMiLCBhcmcpOworCQkJfQorCQkJLy8gbmV4dCwgcGxlYXNlIQorCQkJYXJndisrOworCQkvLyBvcmRpbmFyeSBleHBlY3Qtc2VuZCBwYWlyIQorCQl9IGVsc2UgeworCQkJLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCQkJLy8gZG8gZXhwZWN0CisJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlpbnQgZXhwZWN0X2xlbjsKKwkJCXNpemVfdCBidWZfbGVuID0gMDsKKwkJCXNpemVfdCBtYXhfbGVuID0gbWF4X2Fib3J0X2xlbjsKKworCQkJc3RydWN0IHBvbGxmZCBwZmQ7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hBVF9OT0ZBSUwKKwkJCWludCBub2ZhaWwgPSAwOworI2VuZGlmCisJCQljaGFyICpleHBlY3QgPSAqYXJndisrOworCisJCQkvLyBzYW5pdHkgY2hlY2s6IHNoYWxsIHdlIHJlYWxseSBleHBlY3Qgc29tZXRoaW5nPworCQkJaWYgKCFleHBlY3QpCisJCQkJZ290byBleHBlY3RfZG9uZTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQVRfTk9GQUlMCisJCQkvLyBpZiBleHBlY3Qgc3RhcnRzIHdpdGggLQorCQkJaWYgKCctJyA9PSAqZXhwZWN0KSB7CisJCQkJLy8gc3dhbGxvdyAtCisJCQkJZXhwZWN0Kys7CisJCQkJLy8gYW5kIGVudGVyIG5vZmFpbCBtb2RlCisJCQkJbm9mYWlsKys7CisJCQl9CisjZW5kaWYKKworI2lmZGVmIF9fX1RFU1RfX19CVUZfX18gLy8gdGVzdCBiZWhhdmlvdXIgd2l0aCBhIHNtYWxsIGJ1ZmZlcgorIwl1bmRlZiBDT01NT05fQlVGU0laRQorIwlkZWZpbmUgQ09NTU9OX0JVRlNJWkUgNgorI2VuZGlmCisJCQkvLyBleHBhbmQgZXNjYXBlIHNlcXVlbmNlcyBpbiBleHBlY3QKKwkJCWV4cGVjdF9sZW4gPSB1bmVzY2FwZShleHBlY3QsICZleHBlY3RfbGVuIC8qZHVtbXkqLyk7CisJCQlpZiAoZXhwZWN0X2xlbiA+IG1heF9sZW4pCisJCQkJbWF4X2xlbiA9IGV4cGVjdF9sZW47CisJCQkvLyBzYW5pdHkgY2hlY2s6CisJCQkvLyB3ZSBzaG91bGQgZXhwZWN0IG1vcmUgdGhhbiBub3RoaW5nIGJ1dCBub3QgbW9yZSB0aGFuIGlucHV0IGJ1ZmZlcgorCQkJLy8gVE9ETzogbGF0ZXIgd2UnbGwgZ2V0IHJpZCBvZiBmaXhlZC1zaXplIGJ1ZmZlcgorCQkJaWYgKCFleHBlY3RfbGVuKQorCQkJCWdvdG8gZXhwZWN0X2RvbmU7CisJCQlpZiAobWF4X2xlbiA+PSBDT01NT05fQlVGU0laRSkgeworCQkJCWV4aXRjb2RlID0gRVJSX01FTTsKKwkJCQlnb3RvIGV4cGVjdF9kb25lOworCQkJfQorCisJCQkvLyBnZXQgcmVwbHkKKwkJCXBmZC5mZCA9IFNURElOX0ZJTEVOTzsKKwkJCXBmZC5ldmVudHMgPSBQT0xMSU47CisJCQl3aGlsZSAoIWV4aXRjb2RlCisJCQkgICAgJiYgcG9sbCgmcGZkLCAxLCB0aW1lb3V0KSA+IDAKKwkJCSAgICAmJiAocGZkLnJldmVudHMgJiBQT0xMSU4pCisJCQkpIHsKKyNkZWZpbmUgYnVmIGJiX2NvbW1vbl9idWZzaXoxCisJCQkJbGxpc3RfdCAqbDsKKwkJCQlzc2l6ZV90IGRlbHRhOworCisJCQkJLy8gcmVhZCBuZXh0IGNoYXIgZnJvbSBkZXZpY2UKKwkJCQlpZiAoc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgYnVmK2J1Zl9sZW4sIDEpID4gMCkgeworCQkJCQkvLyBkdW1wIGRldmljZSBpbnB1dCBpZiBSRUNPUkQgZm5hbWUKKwkJCQkJaWYgKHJlY29yZF9mZCA+IDApIHsKKwkJCQkJCWZ1bGxfd3JpdGUocmVjb3JkX2ZkLCBidWYrYnVmX2xlbiwgMSk7CisJCQkJCX0KKwkJCQkJLy8gZHVtcCBkZXZpY2UgaW5wdXQgaWYgRUNITyBPTgorCQkJCQlpZiAoZWNobykgeworLy8JCQkJCQlpZiAoYnVmW2J1Zl9sZW5dIDwgJyAnKSB7CisvLwkJCQkJCQlmdWxsX3dyaXRlKFNUREVSUl9GSUxFTk8sICJeIiwgMSk7CisvLwkJCQkJCQlidWZbYnVmX2xlbl0gKz0gJ0AnOworLy8JCQkJCQl9CisJCQkJCQlmdWxsX3dyaXRlKFNUREVSUl9GSUxFTk8sIGJ1ZitidWZfbGVuLCAxKTsKKwkJCQkJfQorCQkJCQlidWZfbGVuKys7CisJCQkJCS8vIG1vdmUgaW5wdXQgZnJhbWUgaWYgd2UndmUgcmVhY2hlZCBoaWdoZXIgYm91bmQKKwkJCQkJaWYgKGJ1Zl9sZW4gPiBDT01NT05fQlVGU0laRSkgeworCQkJCQkJbWVtbW92ZShidWYsIGJ1ZitidWZfbGVuLW1heF9sZW4sIG1heF9sZW4pOworCQkJCQkJYnVmX2xlbiA9IG1heF9sZW47CisJCQkJCX0KKwkJCQl9CisJCQkJLy8gTi5CLiBydWxlIG9mIHRodW1iOiB2YWx1ZXMgYmVpbmcgbG9va2VkIGZvciBjYW4KKwkJCQkvLyBiZSBmb3VuZCBvbmx5IGF0IHRoZSBlbmQgb2YgaW5wdXQgYnVmZmVyCisJCQkJLy8gdGhpcyBhbGxvd3MgdG8gZ2V0IHJpZCBvZiBzdHJzdHIoKSBhbmQgbWVtbWVtKCkKKworCQkJCS8vIFRPRE86IG1ha2UgZXhwZWN0IGFuZCBhYm9ydCBzdHJpbmdzIHByb2Nlc3NlZCB1bmlmb3JtbHkKKwkJCQkvLyBhYm9ydCBjb25kaXRpb24gaXMgbWV0PyAtPiBiYWlsIG91dAorCQkJCWZvciAobCA9IGFib3J0cywgZXhpdGNvZGUgPSBFUlJfQUJPUlQ7IGw7IGwgPSBsLT5saW5rLCArK2V4aXRjb2RlKSB7CisJCQkJCXNpemVfdCBsZW4gPSBzdHJsZW4obC0+ZGF0YSk7CisJCQkJCWRlbHRhID0gYnVmX2xlbi1sZW47CisJCQkJCWlmIChkZWx0YSA+PSAwICYmICFtZW1jbXAoYnVmK2RlbHRhLCBsLT5kYXRhLCBsZW4pKQorCQkJCQkJZ290byBleHBlY3RfZG9uZTsKKwkJCQl9CisJCQkJZXhpdGNvZGUgPSBFUlJfT0s7CisKKwkJCQkvLyBleHBlY3RlZCByZXBseSByZWNlaXZlZD8gLT4gZ290byBuZXh0IGNvbW1hbmQKKwkJCQlkZWx0YSA9IGJ1Zl9sZW4gLSBleHBlY3RfbGVuOworCQkJCWlmIChkZWx0YSA+PSAwICYmICFtZW1jbXAoYnVmK2RlbHRhLCBleHBlY3QsIGV4cGVjdF9sZW4pKQorCQkJCQlnb3RvIGV4cGVjdF9kb25lOworI3VuZGVmIGJ1ZgorCQkJfSAvKiB3aGlsZSAoaGF2ZSBkYXRhKSAqLworCisJCQkvLyBkZXZpY2UgdGltZWQgb3V0IG9yIHVuZXhwZWN0ZWQgcmVwbHkgcmVjZWl2ZWQKKwkJCWV4aXRjb2RlID0gRVJSX1RJTUVPVVQ7CisgZXhwZWN0X2RvbmU6CisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hBVF9OT0ZBSUwKKwkJCS8vIG9uIHN1Y2Nlc3MgYW5kIHdoZW4gaW4gbm9mYWlsIG1vZGUKKwkJCS8vIHdlIHNob3VsZCBza2lwIGZvbGxvd2luZyBzdWJzZW5kLXN1YmV4cGVjdCBwYWlycworCQkJaWYgKG5vZmFpbCkgeworCQkJCWlmICghZXhpdGNvZGUpIHsKKwkJCQkJLy8gZmluZCBsYXN0IHNlbmQgYmVmb3JlIG5vbi1kYXNoZWQgZXhwZWN0CisJCQkJCXdoaWxlICgqYXJndiAmJiBhcmd2WzFdICYmICctJyA9PSBhcmd2WzFdWzBdKQorCQkJCQkJYXJndiArPSAyOworCQkJCQkvLyBza2lwIHRoZSBwYWlyCisJCQkJCS8vIE4uQi4gZG8gd2UgcmVhbGx5IG5lZWQgdGhpcz8hCisJCQkJCWlmICghKmFyZ3YrKyB8fCAhKmFyZ3YrKykKKwkJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvLyBub2ZhaWwgbW9kZSBhbHNvIGNsZWFycyBhbGwgYnV0IElPIGVycm9ycyAob3Igc2lnbmFscykKKwkJCQlpZiAoRVJSX0lPICE9IGV4aXRjb2RlKQorCQkJCQlleGl0Y29kZSA9IEVSUl9PSzsKKwkJCX0KKyNlbmRpZgorCQkJLy8gYmFpbCBvdXQgdW5sZXNzIHdlIGV4cGVjdGVkIHN1Y2Nlc3NmdWxseQorCQkJaWYgKGV4aXRjb2RlKQorCQkJCWJyZWFrOworCisJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQkvLyBkbyBzZW5kCisJCQkvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJCQlpZiAoKmFyZ3YpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSEFUX0lNUExJQ0lUX0NSCisJCQkJaW50IG5vY3IgPSAwOyAvLyBpbmhpYml0IHRlcm1pbmF0aW5nIGNvbW1hbmQgd2l0aCBccgorI2VuZGlmCisJCQkJY2hhciAqbG9hZGVkID0gTlVMTDsgLy8gbG9hZGVkIGNvbW1hbmQKKwkJCQlzaXplX3QgbGVuOworCQkJCWNoYXIgKmJ1ZiA9ICphcmd2Kys7CisKKwkJCQkvLyBpZiBjb21tYW5kIHN0YXJ0cyB3aXRoIEAKKwkJCQkvLyBsb2FkICJyZWFsIiBjb21tYW5kIGZyb20gZmlsZSBuYW1lZCBhZnRlciBACisJCQkJaWYgKCdAJyA9PSAqYnVmKSB7CisJCQkJCS8vIHNraXAgdGhlIEAgYW5kIGFueSBmb2xsb3dpbmcgd2hpdGUtc3BhY2UKKwkJCQkJdHJpbSgrK2J1Zik7CisJCQkJCWJ1ZiA9IGxvYWRlZCA9IHhtYWxsb2NfeG9wZW5fcmVhZF9jbG9zZShidWYsIE5VTEwpOworCQkJCX0KKwkJCQkvLyBleHBhbmQgZXNjYXBlIHNlcXVlbmNlcyBpbiBjb21tYW5kCisJCQkJbGVuID0gdW5lc2NhcGUoYnVmLCAmbm9jcik7CisKKwkJCQkvLyBzZW5kIGNvbW1hbmQKKwkJCQlhbGFybSh0aW1lb3V0KTsKKwkJCQlwZmQuZmQgPSBTVERPVVRfRklMRU5POworCQkJCXBmZC5ldmVudHMgPSBQT0xMT1VUOworCQkJCXdoaWxlIChsZW4gJiYgIWV4aXRjb2RlCisJCQkJICAgICYmIHBvbGwoJnBmZCwgMSwgLTEpID4gMAorCQkJCSAgICAmJiAocGZkLnJldmVudHMgJiBQT0xMT1VUKQorCQkJCSkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQVRfU0VORF9FU0NBUEVTCisJCQkJCS8vICJcXGQiIG1lYW5zIDEgc2VjIGRlbGF5LCAiXFxwIiBtZWFucyAwLjAxIHNlYyBkZWxheQorCQkJCQkvLyAiXFxLIiBtZWFucyBzZW5kIEJSRUFLCisJCQkJCWNoYXIgYyA9ICpidWY7CisJCQkJCWlmICgnXFwnID09IGMpIHsKKwkJCQkJCWMgPSAqKytidWY7CisJCQkJCQlpZiAoJ2QnID09IGMpIHsKKwkJCQkJCQlzbGVlcCgxKTsKKwkJCQkJCQlsZW4tLTsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJCWlmICgncCcgPT0gYykgeworCQkJCQkJCXVzbGVlcCgxMDAwMCk7CisJCQkJCQkJbGVuLS07CisJCQkJCQkJY29udGludWU7CisJCQkJCQl9CisJCQkJCQlpZiAoJ0snID09IGMpIHsKKwkJCQkJCQl0Y3NlbmRicmVhayhTVERPVVRfRklMRU5PLCAwKTsKKwkJCQkJCQlsZW4tLTsKKwkJCQkJCQljb250aW51ZTsKKwkJCQkJCX0KKwkJCQkJCWJ1Zi0tOworCQkJCQl9CisJCQkJCWlmIChzYWZlX3dyaXRlKFNURE9VVF9GSUxFTk8sIGJ1ZiwgMSkgIT0gMSkKKwkJCQkJCWJyZWFrOworCQkJCQlsZW4tLTsKKwkJCQkJYnVmKys7CisjZWxzZQorCQkJCQlsZW4gLT0gZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBidWYsIGxlbik7CisjZW5kaWYKKwkJCQl9IC8qIHdoaWxlIChjYW4gd3JpdGUpICovCisJCQkJYWxhcm0oMCk7CisKKwkJCQkvLyByZXBvcnQgSS9PIGVycm9yIGlmIHRoZXJlIHN0aWxsIGV4aXN0cyBhdCBsZWFzdCBvbmUgbm9uLXNlbnQgY2hhcgorCQkJCWlmIChsZW4pCisJCQkJCWV4aXRjb2RlID0gRVJSX0lPOworCisJCQkJLy8gZnJlZSBsb2FkZWQgY29tbWFuZCAoaWYgYW55KQorCQkJCWlmIChsb2FkZWQpCisJCQkJCWZyZWUobG9hZGVkKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSEFUX0lNUExJQ0lUX0NSCisJCQkJLy8gb3IgdGVybWluYXRlIGNvbW1hbmQgd2l0aCBcciAoaWYgbm90IGluaGliaXRlZCkKKwkJCQllbHNlIGlmICghbm9jcikKKwkJCQkJeHdyaXRlKFNURE9VVF9GSUxFTk8sICJcciIsIDEpOworI2VuZGlmCisJCQkJLy8gYmFpbCBvdXQgdW5sZXNzIHdlIHNlbnQgY29tbWFuZCBzdWNjZXNzZnVsbHkKKwkJCQlpZiAoZXhpdGNvZGUpCisJCQkJCWJyZWFrOworCQkJfSAvKiBpZiAoKmFyZ3YpICovCisJCX0KKwl9IC8qIHdoaWxlICgqYXJndikgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX0NIQVRfVFRZX0hJRkkKKwl0Y3NldGF0dHIoU1RESU5fRklMRU5PLCBUQ1NBRkxVU0gsICZ0aW8wKTsKKyNlbmRpZgorCisJcmV0dXJuIGV4aXRjb2RlOworfQpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL2NocnQuYyBiL21pc2N1dGlscy9jaHJ0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmNTU5ZgotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9jaHJ0LmMKQEAgLTAsMCArMSwxMzkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGNocnQgLSBtYW5pcHVsYXRlIHJlYWwtdGltZSBhdHRyaWJ1dGVzIG9mIGEgcHJvY2VzcworICogQ29weXJpZ2h0IChjKSAyMDA2LTIwMDcgQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgY2hydF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1wcmZvbV0gW1BSSU9dIFtQSUQgfCBQUk9HIEFSR1NdIgorLy91c2FnZTojZGVmaW5lIGNocnRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDaGFuZ2Ugc2NoZWR1bGluZyBwcmlvcml0eSBhbmQgY2xhc3MgZm9yIGEgcHJvY2Vzc1xuIgorLy91c2FnZTogICAgICJcbgktcAlPcGVyYXRlIG9uIFBJRCIKKy8vdXNhZ2U6ICAgICAiXG4JLXIJU2V0IFNDSEVEX1JSIGNsYXNzIgorLy91c2FnZTogICAgICJcbgktZglTZXQgU0NIRURfRklGTyBjbGFzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLW8JU2V0IFNDSEVEX09USEVSIGNsYXNzIgorLy91c2FnZTogICAgICJcbgktbQlTaG93IG1pbi9tYXggcHJpb3JpdGllcyIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgY2hydF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBjaHJ0IC1yIDQgc2xlZXAgOTAwOyB4PSQhXG4iCisvL3VzYWdlOiAgICAgICAiJCBjaHJ0IC1mIC1wIDMgJHhcbiIKKy8vdXNhZ2U6ICAgICAgICJZb3UgbmVlZCBDQVBfU1lTX05JQ0UgcHJpdmlsZWdlcyB0byBzZXQgc2NoZWR1bGluZyBhdHRyaWJ1dGVzIG9mIGEgcHJvY2VzcyIKKworI2luY2x1ZGUgPHNjaGVkLmg+CisjaW5jbHVkZSAibGliYmIuaCIKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJaW50IHBvbGljeTsKKwljaGFyIG5hbWVbc2l6ZW9mKCJTQ0hFRF9PVEhFUiIpXTsKK30gcG9saWNpZXNbXSA9IHsKKwl7U0NIRURfT1RIRVIsICJTQ0hFRF9PVEhFUiJ9LAorCXtTQ0hFRF9GSUZPLCAiU0NIRURfRklGTyJ9LAorCXtTQ0hFRF9SUiwgIlNDSEVEX1JSIn0KK307CisKKy8vVE9ETzogYWRkCisvLyAtYiwgU0NIRURfQkFUQ0gKKy8vIC1pLCBTQ0hFRF9JRExFCisKK3N0YXRpYyB2b2lkIHNob3dfbWluX21heChpbnQgcG9sKQoreworCWNvbnN0IGNoYXIgKmZtdCA9ICIlcyBtaW4vbWF4IHByaW9yaXR5XHQ6ICV1LyV1XG4iOworCWludCBtYXgsIG1pbjsKKworCW1heCA9IHNjaGVkX2dldF9wcmlvcml0eV9tYXgocG9sKTsKKwltaW4gPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWluKHBvbCk7CisJaWYgKChtYXh8bWluKSA8IDApCisJCWZtdCA9ICIlcyBub3Qgc3VwcG9ydGVkXG4iOworCXByaW50ZihmbXQsIHBvbGljaWVzW3BvbF0ubmFtZSwgbWluLCBtYXgpOworfQorCisjZGVmaW5lIE9QVF9tICgxPDwwKQorI2RlZmluZSBPUFRfcCAoMTw8MSkKKyNkZWZpbmUgT1BUX3IgKDE8PDIpCisjZGVmaW5lIE9QVF9mICgxPDwzKQorI2RlZmluZSBPUFRfbyAoMTw8NCkKKworaW50IGNocnRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGNocnRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXBpZF90IHBpZCA9IDA7CisJdW5zaWduZWQgb3B0OworCXN0cnVjdCBzY2hlZF9wYXJhbSBzcDsKKwljaGFyICpwaWRfc3RyOworCWNoYXIgKnByaW9yaXR5ID0gcHJpb3JpdHk7IC8qIGZvciBjb21waWxlciAqLworCWNvbnN0IGNoYXIgKmN1cnJlbnRfbmV3OworCWludCBwb2xpY3kgPSBTQ0hFRF9SUjsKKworCS8qIG9ubHkgb25lIHBvbGljeSBhY2NlcHRlZCAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gInItLWZvOmYtLXJvOm8tLXJmIjsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiK21wcmZvIik7CisJaWYgKG9wdCAmIE9QVF9tKSB7IC8qIHByaW50IG1pbi9tYXggYW5kIGV4aXQgKi8KKwkJc2hvd19taW5fbWF4KFNDSEVEX0ZJRk8pOworCQlzaG93X21pbl9tYXgoU0NIRURfUlIpOworCQlzaG93X21pbl9tYXgoU0NIRURfT1RIRVIpOworCQlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KEVYSVRfU1VDQ0VTUyk7CisJfQorCWlmIChvcHQgJiBPUFRfcikKKwkJcG9saWN5ID0gU0NIRURfUlI7CisJaWYgKG9wdCAmIE9QVF9mKQorCQlwb2xpY3kgPSBTQ0hFRF9GSUZPOworCWlmIChvcHQgJiBPUFRfbykKKwkJcG9saWN5ID0gU0NIRURfT1RIRVI7CisKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoIWFyZ3ZbMF0pCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwlpZiAob3B0ICYgT1BUX3ApIHsKKwkJcGlkX3N0ciA9ICphcmd2Kys7CisJCWlmICgqYXJndikgeyAvKiAiLXAgPHByaW9yaXR5PiA8cGlkPiBbLi4uXSIgKi8KKwkJCXByaW9yaXR5ID0gcGlkX3N0cjsKKwkJCXBpZF9zdHIgPSAqYXJndjsKKwkJfQorCQkvKiBlbHNlICItcCA8cGlkPiIsIGFuZCAqYXJndiA9PSBOVUxMICovCisJCXBpZCA9IHhhdG91bF9yYW5nZShwaWRfc3RyLCAxLCAoKHVuc2lnbmVkKShwaWRfdClVTE9OR19NQVgpID4+IDEpOworCX0gZWxzZSB7CisJCXByaW9yaXR5ID0gKmFyZ3YrKzsKKwkJaWYgKCEqYXJndikKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwljdXJyZW50X25ldyA9ICJjdXJyZW50XDBuZXciOworCWlmIChvcHQgJiBPUFRfcCkgeworCQlpbnQgcG9sOworIHByaW50X3J0X2luZm86CisJCXBvbCA9IHNjaGVkX2dldHNjaGVkdWxlcihwaWQpOworCQlpZiAocG9sIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgJWNldCBwaWQgJWQncyBwb2xpY3kiLCAnZycsIChpbnQpcGlkKTsKKwkJcHJpbnRmKCJwaWQgJWQncyAlcyBzY2hlZHVsaW5nIHBvbGljeTogJXNcbiIsCisJCQkJcGlkLCBjdXJyZW50X25ldywgcG9saWNpZXNbcG9sXS5uYW1lKTsKKwkJaWYgKHNjaGVkX2dldHBhcmFtKHBpZCwgJnNwKSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZ2V0IHBpZCAlZCdzIGF0dHJpYnV0ZXMiLCAoaW50KXBpZCk7CisJCXByaW50ZigicGlkICVkJ3MgJXMgc2NoZWR1bGluZyBwcmlvcml0eTogJWRcbiIsCisJCQkJKGludClwaWQsIGN1cnJlbnRfbmV3LCBzcC5zY2hlZF9wcmlvcml0eSk7CisJCWlmICghKmFyZ3YpIHsKKwkJCS8qIEVpdGhlciBpdCB3YXMganVzdCAiLXAgPHBpZD4iLAorCQkJICogb3IgaXQgd2FzICItcCA8cHJpb3JpdHk+IDxwaWQ+IiBhbmQgd2UgY2FtZSBoZXJlCisJCQkgKiBmb3IgdGhlIHNlY29uZCB0aW1lIChzZWUgZ290byBiZWxvdykgKi8KKwkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCX0KKwkJKmFyZ3YgPSBOVUxMOworCQljdXJyZW50X25ldyArPSA4OworCX0KKworCS8qIGZyb20gdGhlIG1hbnBhZ2Ugb2Ygc2NoZWRfZ2V0c2NoZWR1bGVyOgorCVsuLi5dIHNjaGVkX3ByaW9yaXR5IGNhbiBoYXZlIGEgdmFsdWUgaW4gdGhlIHJhbmdlIDAgdG8gOTkuCisJWy4uLl0gU0NIRURfT1RIRVIgb3IgU0NIRURfQkFUQ0ggbXVzdCBiZSBhc3NpZ25lZCBzdGF0aWMgcHJpb3JpdHkgMC4KKwlbLi4uXSBTQ0hFRF9GSUZPIG9yIFNDSEVEX1JSIGNhbiBoYXZlIHN0YXRpYyBwcmlvcml0eSBpbiAxLi45OSByYW5nZS4KKwkqLworCXNwLnNjaGVkX3ByaW9yaXR5ID0geHN0cnRvdV9yYW5nZShwcmlvcml0eSwgMCwgcG9saWN5ICE9IFNDSEVEX09USEVSID8gMSA6IDAsIDk5KTsKKworCWlmIChzY2hlZF9zZXRzY2hlZHVsZXIocGlkLCBwb2xpY3ksICZzcCkgPCAwKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0ICVjZXQgcGlkICVkJ3MgcG9saWN5IiwgJ3MnLCAoaW50KXBpZCk7CisKKwlpZiAoIWFyZ3ZbMF0pIC8qICItcCA8cHJpb3JpdHk+IDxwaWQ+IFsuLi5dIiAqLworCQlnb3RvIHByaW50X3J0X2luZm87CisKKwlCQl9FWEVDVlBfb3JfZGllKGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL2NvbnNweS5jIGIvbWlzY3V0aWxzL2NvbnNweS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNDZhNDMKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvY29uc3B5LmMKQEAgLTAsMCArMSw1NzcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIEEgdGV4dC1tb2RlIFZOQyBsaWtlIHByb2dyYW0gZm9yIExpbnV4IHZpcnR1YWwgdGVybWluYWxzLgorICoKKyAqIHBhc2NhbC5iZWxsYXJkQGFkcy1sdS5jb20KKyAqCisgKiBCYXNlZCBvbiBSdXNzZWxsIFN0dWFydCdzIGNvbnNweS5jCisgKiAgIGh0dHA6Ly9hY2UtaG9zdC5zdHVhcnQuaWQuYXUvcnVzc2VsbC9maWxlcy9jb25zcHkuYworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9hcHBsZXQ6SUZfQ09OU1BZKEFQUExFVChjb25zcHksIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19DT05TUFkpICs9IGNvbnNweS5vCisKKy8vY29uZmlnOmNvbmZpZyBDT05TUFkKKy8vY29uZmlnOglib29sICJjb25zcHkiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQSB0ZXh0LW1vZGUgVk5DIGxpa2UgcHJvZ3JhbSBmb3IgTGludXggdmlydHVhbCB0ZXJtaW5hbHMuCisvL2NvbmZpZzoJICBleGFtcGxlOiAgY29uc3B5IE5VTSAgICAgIHNoYXJlZCBhY2Nlc3MgdG8gY29uc29sZSBudW0KKy8vY29uZmlnOgkgIG9yICAgICAgICBjb25zcHkgLW5kIE5VTSAgc2NyZWVuc2hvdCBvZiBjb25zb2xlIG51bQorLy9jb25maWc6CSAgb3IgICAgICAgIGNvbnNweSAtY3MgTlVNICBwb29yIG1hbidzIEdOVSBzY3JlZW4gbGlrZQorCisvL3VzYWdlOiNkZWZpbmUgY29uc3B5X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSJbLXZjc25kZkZRXSBbLXggQ09MXSBbLXkgTElORV0gW0NPTlNPTEVfTk9dIgorLy91c2FnZTojZGVmaW5lIGNvbnNweV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICJBIHRleHQtbW9kZSBWTkMgbGlrZSBwcm9ncmFtIGZvciBMaW51eCB2aXJ0dWFsIGNvbnNvbGVzLiIKKy8vdXNhZ2U6ICAgICAiXG5UbyBleGl0LCBxdWlja2x5IHByZXNzIEVTQyAzIHRpbWVzLiIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuCS12CURvbid0IHNlbmQga2V5c3Ryb2tlcyB0byB0aGUgY29uc29sZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJQ3JlYXRlIG1pc3NpbmcgL2Rldi97dHR5LHZjc2F9TiIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJT3BlbiBhIFNIRUxMIHNlc3Npb24iCisvL3VzYWdlOiAgICAgIlxuCS1uCUJsYWNrICYgd2hpdGUiCisvL3VzYWdlOiAgICAgIlxuCS1kCUR1bXAgY29uc29sZSB0byBzdGRvdXQiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvbGxvdyBjdXJzb3IiCisvL3VzYWdlOiAgICAgIlxuCS1GCUFzc3VtZSBjb25zb2xlIGlzIG9uIGEgZnJhbWVidWZmZXIgZGV2aWNlIgorLy91c2FnZTogICAgICJcbgktUQlEaXNhYmxlIGV4aXQgb24gRVNDLUVTQy1FU0MiCisvL3VzYWdlOiAgICAgIlxuCS14IENPTAlTdGFydGluZyBjb2x1bW4iCisvL3VzYWdlOiAgICAgIlxuCS15IExJTkUJU3RhcnRpbmcgbGluZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzL2tkLmg+CisKKyNkZWZpbmUgRVNDICJcMDMzIgorI2RlZmluZSBDVVJTT1JfT04JLTEKKyNkZWZpbmUgQ1VSU09SX09GRgkxCisKKyNkZWZpbmUgREVWX1RUWQkJIi9kZXYvdHR5IgorI2RlZmluZSBERVZfVkNTQQkiL2Rldi92Y3NhIgorCitzdHJ1Y3Qgc2NyZWVuX2luZm8geworCXVuc2lnbmVkIGNoYXIgbGluZXMsIGNvbHMsIGN1cnNvcl94LCBjdXJzb3JfeTsKK307CisKKyNkZWZpbmUgQ0hBUih4KSAoKih1aW50OF90KikoeCkpCisjZGVmaW5lIEFUVFIoeCkgKCgodWludDhfdCopKHgpKVsxXSkKKyNkZWZpbmUgTkVYVCh4KSAoKHgpICs9IDIpCisjZGVmaW5lIERBVEEoeCkgKCoodWludDE2X3QqKSh4KSkKKworc3RydWN0IGdsb2JhbHMgeworCWNoYXIqIGRhdGE7CisJaW50IHNpemU7CisJaW50IHgsIHk7CisJaW50IGtiZF9mZDsKKwlpbnQgaW9lcnJvcl9jb3VudDsKKwlpbnQga2V5X2NvdW50OworCWludCBlc2NhcGVfY291bnQ7CisJaW50IG5va2V5czsKKwlpbnQgY3VycmVudDsKKwlpbnQgZmlyc3RfbGluZV9vZmZzZXQ7CisJaW50IGxhc3RfYXR0cjsKKwkvLyBjYWNoZWQgbG9jYWwgdHR5IHBhcmFtZXRlcnMKKwl1bnNpZ25lZCB3aWR0aDsKKwl1bnNpZ25lZCBoZWlnaHQ7CisJdW5zaWduZWQgY29sOworCXVuc2lnbmVkIGxpbmU7CisJc21hbGxpbnQgY3Vyb2ZmOyAvLyB1bmtub3duOjAgY3Vyc29yIG9uOi0xIGN1cnNvciBvZmY6MQorCWNoYXIgYXR0cmJ1ZltzaXplb2YoIjA7MTs1OzMwOzQwbSIpXTsKKwkvLyByZW1vdGUgY29uc29sZQorCXN0cnVjdCBzY3JlZW5faW5mbyByZW1vdGU7CisJLy8gc2F2ZWQgbG9jYWwgdHR5IHRlcm1pbmZvCisJc3RydWN0IHRlcm1pb3MgdGVybV9vcmlnOworCWNoYXIgdmNzYV9uYW1lW3NpemVvZihERVZfVkNTQSAiTk4iKV07Cit9OworCisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKKwlHLndpZHRoID0gRy5oZWlnaHQgPSBVSU5UX01BWDsgXAorCUcubGFzdF9hdHRyLS07IFwKK30gd2hpbGUgKDApCisKK2VudW0geworCUZMQUdfdiwgIC8vIHZpZXcgb25seQorCUZMQUdfYywgIC8vIGNyZWF0ZSBkZXZpY2UgaWYgbmVlZAorCUZMQUdfUSwgIC8vIG5ldmVyIGV4aXQKKwlGTEFHX3MsICAvLyBzZXNzaW9uCisJRkxBR19uLCAgLy8gbm8gY29sb3JzCisJRkxBR19kLCAgLy8gZHVtcCBzY3JlZW4KKwlGTEFHX2YsICAvLyBmb2xsb3cgY3Vyc29yCisJRkxBR19GLCAgLy8gZnJhbWVidWZmZXIKK307CisjZGVmaW5lIEZMQUcoeCkgKDEgPDwgRkxBR18jI3gpCisjZGVmaW5lIEJXIChvcHRpb25fbWFzazMyICYgRkxBRyhuKSkKKworc3RhdGljIHZvaWQgcHV0Y3NpKGNvbnN0IGNoYXIgKnMpCit7CisJZnB1dHMoRVNDIlsiLCBzdGRvdXQpOworCWZwdXRzKHMsIHN0ZG91dCk7Cit9CisKK3N0YXRpYyB2b2lkIGNscnNjcih2b2lkKQoreworCS8vIEhvbWUsIGNsZWFyIHRpbGwgZW5kIG9mIHNjcmVlbgorCXB1dGNzaSgiMTsxSCIgRVNDIltKIik7CisJRy5jb2wgPSBHLmxpbmUgPSAwOworfQorCitzdGF0aWMgdm9pZCBzZXRfY3Vyc29yKGludCBzdGF0ZSkKK3sKKwlpZiAoRy5jdXJvZmYgIT0gc3RhdGUpIHsKKwkJRy5jdXJvZmYgPSBzdGF0ZTsKKwkJcHV0Y3NpKCI/MjUiKTsKKwkJYmJfcHV0Y2hhcigiaD9sIlsxICsgc3RhdGVdKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdvdG94eShpbnQgY29sLCBpbnQgbGluZSkKK3sKKwlpZiAoRy5jb2wgIT0gY29sIHx8IEcubGluZSAhPSBsaW5lKSB7CisJCUcuY29sID0gY29sOworCQlHLmxpbmUgPSBsaW5lOworCQlwcmludGYoRVNDIlsldTsldUgiLCBsaW5lICsgMSwgY29sICsgMSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjbGVhbnVwKGludCBjb2RlKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGNsZWFudXAoaW50IGNvZGUpCit7CisJc2V0X2N1cnNvcihDVVJTT1JfT04pOworCXRjc2V0YXR0cihHLmtiZF9mZCwgVENTQU5PVywgJkcudGVybV9vcmlnKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJY2xvc2UoRy5rYmRfZmQpOworCX0KKwkvLyBSZXNldCBhdHRyaWJ1dGVzCisJaWYgKCFCVykKKwkJcHV0Y3NpKCIwbSIpOworCWJiX3B1dGNoYXIoJ1xuJyk7CisJaWYgKGNvZGUgPiBFWElUX0ZBSUxVUkUpCisJCWtpbGxfbXlzZWxmX3dpdGhfc2lnKGNvZGUpOworCWV4aXQoY29kZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNjcmVlbl9yZWFkX2Nsb3NlKHZvaWQpCit7CisJdW5zaWduZWQgaSwgajsKKwlpbnQgdmNzYV9mZDsKKwljaGFyICpkYXRhOworCisJLy8gQ2xvc2UgJiByZS1vcGVuIHZjc2EgaW4gY2FzZSB0aGV5IGhhdmUgc3dhcHBlZCB2aXJ0dWFsIGNvbnNvbGVzCisJdmNzYV9mZCA9IHhvcGVuKEcudmNzYV9uYW1lLCBPX1JET05MWSk7CisJeHJlYWQodmNzYV9mZCwgJkcucmVtb3RlLCA0KTsKKwlpID0gRy5yZW1vdGUuY29scyAqIDI7CisJRy5maXJzdF9saW5lX29mZnNldCA9IEcueSAqIGk7CisJaSAqPSBHLnJlbW90ZS5saW5lczsKKwlpZiAoRy5kYXRhID09IE5VTEwpIHsKKwkJRy5zaXplID0gaTsKKwkJRy5kYXRhID0geHphbGxvYygyICogaSk7CisJfQorCWlmIChHLnNpemUgIT0gaSkgeworCQljbGVhbnVwKEVYSVRfRkFJTFVSRSk7CisJfQorCWRhdGEgPSBHLmRhdGEgKyBHLmN1cnJlbnQ7CisJeHJlYWQodmNzYV9mZCwgZGF0YSwgRy5zaXplKTsKKwljbG9zZSh2Y3NhX2ZkKTsKKwlmb3IgKGkgPSAwOyBpIDwgRy5yZW1vdGUubGluZXM7IGkrKykgeworCQlmb3IgKGogPSAwOyBqIDwgRy5yZW1vdGUuY29sczsgaisrLCBORVhUKGRhdGEpKSB7CisJCQl1bnNpZ25lZCB4ID0gaiAtIEcueDsgLy8gaWYgd2lsbCBjYXRjaCBqIDwgRy54IHRvbworCQkJdW5zaWduZWQgeSA9IGkgLSBHLnk7IC8vIGlmIHdpbGwgY2F0Y2ggaSA8IEcueSB0b28KKworCQkJaWYgKHkgPj0gRy5oZWlnaHQgfHwgeCA+PSBHLndpZHRoKQorCQkJCURBVEEoZGF0YSkgPSAwOworCQkJZWxzZSB7CisJCQkJdWludDhfdCBjaCA9IENIQVIoZGF0YSk7CisJCQkJaWYgKGNoIDwgJyAnKQorCQkJCQlDSEFSKGRhdGEpID0gY2ggfCAweDQwOworCQkJCWVsc2UgaWYgKGNoID4gMHg3ZSkKKwkJCQkJQ0hBUihkYXRhKSA9ICc/JzsKKwkJCX0KKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc2NyZWVuX2NoYXIoY2hhciAqZGF0YSkKK3sKKwlpZiAoIUJXKSB7CisJCXVpbnQ4X3QgYXR0cl9kaWZmOworCQl1aW50OF90IGF0dHIgPSBBVFRSKGRhdGEpOworCisJCWlmIChvcHRpb25fbWFzazMyICYgRkxBRyhGKSkgeworCQkJYXR0ciA+Pj0gMTsKKwkJfQorCQlhdHRyX2RpZmYgPSBHLmxhc3RfYXR0ciBeIGF0dHI7CisJCWlmIChhdHRyX2RpZmYpIHsKKy8vIEF0dHJpYnV0ZSBsYXlvdXQgZm9yIFZHQSBjb21wYXRpYmxlIHRleHQgdmlkZW9idWZmZXI6CisvLyBibGlua2luZyB0ZXh0CisvLyB8cmVkIGJrZ2QKKy8vIHx8Z3JlZW4gYmtnZAorLy8gfHx8Ymx1ZSBia2dkCisvLyB2dnZ2CisvLyAwMDAwMDAwMCA8LSBsc2IgYml0IG9uIHRoZSByaWdodAorLy8gICAgIGJvbGQgdGV4dCAvIHRleHQgOHRoIGJpdAorLy8gICAgICByZWQgdGV4dAorLy8gICAgICAgZ3JlZW4gdGV4dAorLy8gICAgICAgIGJsdWUgdGV4dAorLy8gVE9ETzogYXBwYXJlbnRseSBmcmFtZWJ1ZmZlci1iYXNlZCBjb25zb2xlIHVzZXMgZGlmZmVyZW50IGxheW91dAorLy8gKGJ1Zz8gYXR0ZW1wdCB0byBnZXQgOHRoIHRleHQgYml0IGluIGJldHRlciBwb3NpdGlvbj8pCisvLyByZWQgYmtnZAorLy8gfGdyZWVuIGJrZ2QKKy8vIHx8Ymx1ZSBia2dkCisvLyB2dnYKKy8vIDAwMDAwMDAwIDwtIGxzYiBiaXQgb24gdGhlIHJpZ2h0CisvLyAgICBib2xkIHRleHQKKy8vICAgICByZWQgdGV4dAorLy8gICAgICBncmVlbiB0ZXh0CisvLyAgICAgICBibHVlIHRleHQKKy8vICAgICAgICB0ZXh0IDh0aCBiaXQKKwkJCS8vIGNvbnZlcnRpbmcgUkdCIGNvbG9yIGJpdCB0cmlhZCB0byBCR1I6CisJCQlzdGF0aWMgY29uc3QgY2hhciBjb2xvcls4XSA9ICIwNDI2MTUzNyI7CisJCQljb25zdCB1aW50OF90IGZnX21hc2sgPSAweDA3LCBib2xkX21hc2sgID0gMHgwODsKKwkJCWNvbnN0IHVpbnQ4X3QgYmdfbWFzayA9IDB4NzAsIGJsaW5rX21hc2sgPSAweDgwOworCQkJY2hhciAqcHRyOworCisJCQlwdHIgPSBHLmF0dHJidWY7CisKKwkJCS8vIChHLmxhc3RfYXR0ciAmIH5hdHRyKSBoYXMgMSBvbmx5IHdoZXJlCisJCQkvLyBHLmxhc3RfYXR0ciBoYXMgMSBidXQgYXR0ciBoYXMgMC4KKwkJCS8vIEhlcmUgd2UgY2hlY2sgd2hldGhlciB3ZSBoYXZlIHRyYW5zaXRpb24KKwkJCS8vIGJvbGQtPm5vbi1ib2xkIG9yIGJsaW5rLT5ub24tYmxpbms6CisJCQlpZiAoRy5sYXN0X2F0dHIgPCAwICAvLyBpbml0aWFsIHZhbHVlCisJCQkgfHwgKChHLmxhc3RfYXR0ciAmIH5hdHRyKSAmIChib2xkX21hc2sgfCBibGlua19tYXNrKSkgIT0gMAorCQkJKSB7CisJCQkJKnB0cisrID0gJzAnOyAvLyAicmVzZXQgYWxsIGF0dHJzIgorCQkJCSpwdHIrKyA9ICc7JzsKKwkJCQkvLyBtdXN0IHNldCBmZyAmIGJnLCBtYXliZSBuZWVkIHRvIHNldCBib2xkIG9yIGJsaW5rOgorCQkJCWF0dHJfZGlmZiA9IGF0dHIgfCB+KGJvbGRfbWFzayB8IGJsaW5rX21hc2spOworCQkJfQorCQkJRy5sYXN0X2F0dHIgPSBhdHRyOworCQkJaWYgKGF0dHJfZGlmZiAmIGJvbGRfbWFzaykgeworCQkJCSpwdHIrKyA9ICcxJzsKKwkJCQkqcHRyKysgPSAnOyc7CisJCQl9CisJCQlpZiAoYXR0cl9kaWZmICYgYmxpbmtfbWFzaykgeworCQkJCSpwdHIrKyA9ICc1JzsKKwkJCQkqcHRyKysgPSAnOyc7CisJCQl9CisJCQlpZiAoYXR0cl9kaWZmICYgZmdfbWFzaykgeworCQkJCSpwdHIrKyA9ICczJzsKKwkJCQkqcHRyKysgPSBjb2xvclthdHRyICYgZmdfbWFza107CisJCQkJKnB0cisrID0gJzsnOworCQkJfQorCQkJaWYgKGF0dHJfZGlmZiAmIGJnX21hc2spIHsKKwkJCQkqcHRyKysgPSAnNCc7CisJCQkJKnB0cisrID0gY29sb3JbKGF0dHIgJiBiZ19tYXNrKSA+PiA0XTsKKwkJCQlwdHIrKzsgLy8gbGFzdCBhdHRyaWJ1dGUKKwkJCX0KKwkJCWlmIChwdHIgIT0gRy5hdHRyYnVmKSB7CisJCQkJcHRyWy0xXSA9ICdtJzsKKwkJCQkqcHRyID0gJ1wwJzsKKwkJCQlwdXRjc2koRy5hdHRyYnVmKTsKKwkJCX0KKwkJfQorCX0KKwlwdXRjaGFyKENIQVIoZGF0YSkpOworCUcuY29sKys7Cit9CisKK3N0YXRpYyB2b2lkIHNjcmVlbl9kdW1wKHZvaWQpCit7CisJaW50IGxpbmVmZWVkX2NudDsKKwlpbnQgbGluZSwgY29sOworCWludCBsaW5lY250ID0gRy5yZW1vdGUubGluZXMgLSBHLnk7CisJY2hhciAqZGF0YSA9IEcuZGF0YSArIEcuY3VycmVudCArIEcuZmlyc3RfbGluZV9vZmZzZXQ7CisKKwlsaW5lZmVlZF9jbnQgPSAwOworCWZvciAobGluZSA9IDA7IGxpbmUgPCBsaW5lY250ICYmIGxpbmUgPCBHLmhlaWdodDsgbGluZSsrKSB7CisJCWludCBzcGFjZV9jbnQgPSAwOworCQlmb3IgKGNvbCA9IDA7IGNvbCA8IEcucmVtb3RlLmNvbHM7IGNvbCsrLCBORVhUKGRhdGEpKSB7CisJCQl1bnNpZ25lZCB0dHlfY29sID0gY29sIC0gRy54OyAvLyBpZiB3aWxsIGNhdGNoIGNvbCA8IEcueCB0b28KKworCQkJaWYgKHR0eV9jb2wgPj0gRy53aWR0aCkKKwkJCQljb250aW51ZTsKKwkJCXNwYWNlX2NudCsrOworCQkJaWYgKEJXICYmIENIQVIoZGF0YSkgPT0gJyAnKQorCQkJCWNvbnRpbnVlOworCQkJd2hpbGUgKGxpbmVmZWVkX2NudCAhPSAwKSB7CisJCQkJLy9iYl9wdXRjaGFyKCdccicpOyAtIHR0eSBkcml2ZXIgZG9lcyBpdCBmb3IgdXMKKwkJCQliYl9wdXRjaGFyKCdcbicpOworCQkJCWxpbmVmZWVkX2NudC0tOworCQkJfQorCQkJd2hpbGUgKC0tc3BhY2VfY250KQorCQkJCWJiX3B1dGNoYXIoJyAnKTsKKwkJCXNjcmVlbl9jaGFyKGRhdGEpOworCQl9CisJCWxpbmVmZWVkX2NudCsrOworCX0KK30KKworc3RhdGljIHZvaWQgY3VybW92ZSh2b2lkKQoreworCXVuc2lnbmVkIGN4ID0gRy5yZW1vdGUuY3Vyc29yX3ggLSBHLng7CisJdW5zaWduZWQgY3kgPSBHLnJlbW90ZS5jdXJzb3JfeSAtIEcueTsKKwlpbnQgY3Vyc29yID0gQ1VSU09SX09GRjsKKworCWlmIChjeCA8IEcud2lkdGggJiYgY3kgPCBHLmhlaWdodCkgeworCQlnb3RveHkoY3gsIGN5KTsKKwkJY3Vyc29yID0gQ1VSU09SX09OOworCX0KKwlzZXRfY3Vyc29yKGN1cnNvcik7Cit9CisKK3N0YXRpYyB2b2lkIGNyZWF0ZV9jZGV2X2lmX2RvZXNudF9leGlzdChjb25zdCBjaGFyKiBuYW1lLCBkZXZfdCBkZXYpCit7CisJaW50IGZkID0gb3BlbihuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkICE9IC0xKQorCQljbG9zZShmZCk7CisJZWxzZSBpZiAoZXJybm8gPT0gRU5PRU5UKQorCQlta25vZChuYW1lLCBTX0lGQ0hSIHwgMDY2MCwgZGV2KTsKK30KKworc3RhdGljIE5PSU5MSU5FIHZvaWQgc3RhcnRfc2hlbGxfaW5fY2hpbGQoY29uc3QgY2hhciogdHR5X25hbWUpCit7CisJaW50IHBpZCA9IHh2Zm9yaygpOworCWlmIChwaWQgPT0gMCkgeworCQlzdHJ1Y3QgdGVybWlvcyB0ZXJtY2hpbGQ7CisJCWNvbnN0IGNoYXIgKnNoZWxsID0gZ2V0X3NoZWxsX25hbWUoKTsKKworCQlzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKKwkJLy8gc2V0IHR0eSBhcyBhIGNvbnRyb2xsaW5nIHR0eQorCQlzZXRzaWQoKTsKKwkJLy8gbWFrZSB0dHkgdG8gYmUgaW5wdXQsIG91dHB1dCwgZXJyb3IKKwkJY2xvc2UoMCk7CisJCXhvcGVuKHR0eV9uYW1lLCBPX1JEV1IpOyAvLyB1c2VzIGZkIDAKKwkJeGR1cDIoMCwgMSk7CisJCXhkdXAyKDAsIDIpOworCQlpb2N0bCgwLCBUSU9DU0NUVFksIDEpOworCQl0Y3NldHBncnAoMCwgZ2V0cGlkKCkpOworCQl0Y2dldGF0dHIoMCwgJnRlcm1jaGlsZCk7CisJCXRlcm1jaGlsZC5jX2xmbGFnIHw9IEVDSE87CisJCXRlcm1jaGlsZC5jX29mbGFnIHw9IE9OTENSIHwgWFRBQlM7CisJCXRlcm1jaGlsZC5jX2lmbGFnIHw9IElDUk5MOworCQl0ZXJtY2hpbGQuY19pZmxhZyAmPSB+SVhPRkY7CisJCXRjc2V0YXR0cl9zdGRpbl9UQ1NBTk9XKCZ0ZXJtY2hpbGQpOworCQlleGVjbChzaGVsbCwgc2hlbGwsICItaSIsIChjaGFyICopIE5VTEwpOworCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKHNoZWxsKTsKKwl9Cit9CisKK2ludCBjb25zcHlfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGNvbnNweV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciB0dHlfbmFtZVtzaXplb2YoREVWX1RUWSAiTk4iKV07CisjZGVmaW5lIGtleWJ1ZiBiYl9jb21tb25fYnVmc2l6MQorCXN0cnVjdCB0ZXJtaW9zIHRlcm1idWY7CisJdW5zaWduZWQgb3B0czsKKwl1bnNpZ25lZCB0dHludW07CisJaW50IHBvbGxfdGltZW91dF9tczsKKyNpZiBFTkFCTEVfTE9OR19PUFRTCisJc3RhdGljIGNvbnN0IGNoYXIgZ2V0b3B0X2xvbmdvcHRzW10gQUxJR04xID0KKwkJInZpZXdvbmx5XDAiICAgICBOb19hcmd1bWVudCAidiIKKwkJImNyZWF0ZWRldmljZVwwIiBOb19hcmd1bWVudCAiYyIKKwkJIm5ldmVycXVpdFwwIiAgICBOb19hcmd1bWVudCAiUSIKKwkJInNlc3Npb25cMCIgICAgICBOb19hcmd1bWVudCAicyIKKwkJIm5vY29sb3JzXDAiICAgICBOb19hcmd1bWVudCAibiIKKwkJImR1bXBcMCIgICAgICAgICBOb19hcmd1bWVudCAiZCIKKwkJImZvbGxvd1wwIiAgICAgICBOb19hcmd1bWVudCAiZiIKKwkJImZyYW1lYnVmZmVyXDAiICBOb19hcmd1bWVudCAiRiIKKwkJOworCisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGdldG9wdF9sb25nb3B0czsKKyNlbmRpZgorCUlOSVRfRygpOworCXN0cmNweShHLnZjc2FfbmFtZSwgREVWX1ZDU0EpOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAieCs6eSsiOyAvLyBudW1lcmljIHBhcmFtcworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAidmNRc25kZkZ4Onk6IiwgJkcueCwgJkcueSk7CisJYXJndiArPSBvcHRpbmQ7CisJdHR5bnVtID0gMDsKKwlpZiAoYXJndlswXSkgeworCQl0dHludW0gPSB4YXRvdV9yYW5nZShhcmd2WzBdLCAwLCA2Myk7CisJCXNwcmludGYoRy52Y3NhX25hbWUgKyBzaXplb2YoREVWX1ZDU0EpLTEsICIldSIsIHR0eW51bSk7CisJfQorCXNwcmludGYodHR5X25hbWUsICIlcyV1IiwgREVWX1RUWSwgdHR5bnVtKTsKKwlpZiAob3B0cyAmIEZMQUcoYykpIHsKKwkJaWYgKChvcHRzICYgKEZMQUcocyl8RkxBRyh2KSkpICE9IEZMQUcodikpCisJCQljcmVhdGVfY2Rldl9pZl9kb2VzbnRfZXhpc3QodHR5X25hbWUsIG1ha2VkZXYoNCwgdHR5bnVtKSk7CisJCWNyZWF0ZV9jZGV2X2lmX2RvZXNudF9leGlzdChHLnZjc2FfbmFtZSwgbWFrZWRldig3LCAxMjggKyB0dHludW0pKTsKKwl9CisJaWYgKChvcHRzICYgRkxBRyhzKSkgJiYgdHR5bnVtKSB7CisJCXN0YXJ0X3NoZWxsX2luX2NoaWxkKHR0eV9uYW1lKTsKKwl9CisKKwlzY3JlZW5fcmVhZF9jbG9zZSgpOworCWlmIChvcHRzICYgRkxBRyhkKSkgeworCQlzY3JlZW5fZHVtcCgpOworCQliYl9wdXRjaGFyKCdcbicpOworCQlyZXR1cm4gMDsKKwl9CisKKwliYl9zaWduYWxzKEJCX0ZBVEFMX1NJR1MsIGNsZWFudXApOworCisJLy8gQWxsIGNoYXJhY3RlcnMgbXVzdCBiZSBwYXNzZWQgdGhyb3VnaCB0byB1cyB1bmFsdGVyZWQKKwlHLmtiZF9mZCA9IHhvcGVuKENVUlJFTlRfVFRZLCBPX1JET05MWSk7CisJdGNnZXRhdHRyKEcua2JkX2ZkLCAmRy50ZXJtX29yaWcpOworCXRlcm1idWYgPSBHLnRlcm1fb3JpZzsKKwl0ZXJtYnVmLmNfaWZsYWcgJj0gfihCUktJTlR8SU5MQ1J8SUNSTkx8SVhPTnxJWE9GRnxJVUNMQ3xJWEFOWXxJTUFYQkVMKTsKKwkvL3Rlcm1idWYuY19vZmxhZyAmPSB+KE9QT1NUKTsgLSBubywgd2Ugc3RpbGwgd2FudCBcbiAtPiBcclxuCisJdGVybWJ1Zi5jX2xmbGFnICY9IH4oSVNJR3xJQ0FOT058RUNITyk7CisJdGVybWJ1Zi5jX2NjW1ZNSU5dID0gMTsKKwl0ZXJtYnVmLmNfY2NbVlRJTUVdID0gMDsKKwl0Y3NldGF0dHIoRy5rYmRfZmQsIFRDU0FOT1csICZ0ZXJtYnVmKTsKKworCXBvbGxfdGltZW91dF9tcyA9IDI1MDsKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgcG9sbGZkIHBmZDsKKwkJaW50IGJ5dGVzX3JlYWQ7CisJCWludCBpLCBqOworCQljaGFyICpkYXRhLCAqb2xkOworCisJCS8vIGluIHRoZSBmaXJzdCBsb29wIEcud2lkdGggPSBHLmhlaWdodCA9IDA6IHJlZnJlc2gKKwkJaSA9IEcud2lkdGg7CisJCWogPSBHLmhlaWdodDsKKwkJZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodChHLmtiZF9mZCwgJkcud2lkdGgsICZHLmhlaWdodCk7CisJCWlmIChvcHRpb25fbWFzazMyICYgRkxBRyhmKSkgeworCQkJaW50IG54ID0gRy5yZW1vdGUuY3Vyc29yX3ggLSBHLndpZHRoICsgMTsKKwkJCWludCBueSA9IEcucmVtb3RlLmN1cnNvcl95IC0gRy5oZWlnaHQgKyAxOworCisJCQlpZiAoRy5yZW1vdGUuY3Vyc29yX3ggPCBHLngpIHsKKwkJCQlHLnggPSBHLnJlbW90ZS5jdXJzb3JfeDsKKwkJCQlpID0gMDsgLy8gZm9yY2UgcmVmcmVzaAorCQkJfQorCQkJaWYgKG54ID4gRy54KSB7CisJCQkJRy54ID0gbng7CisJCQkJaSA9IDA7IC8vIGZvcmNlIHJlZnJlc2gKKwkJCX0KKwkJCWlmIChHLnJlbW90ZS5jdXJzb3JfeSA8IEcueSkgeworCQkJCUcueSA9IEcucmVtb3RlLmN1cnNvcl95OworCQkJCWkgPSAwOyAvLyBmb3JjZSByZWZyZXNoCisJCQl9CisJCQlpZiAobnkgPiBHLnkpIHsKKwkJCQlHLnkgPSBueTsKKwkJCQlpID0gMDsgLy8gZm9yY2UgcmVmcmVzaAorCQkJfQorCQl9CisKKwkJLy8gU2NhbiBjb25zb2xlIGRhdGEgYW5kIHJlZHJhdyBvdXIgdHR5IHdoZXJlIG5lZWRlZAorCQlvbGQgPSBHLmRhdGEgKyBHLmN1cnJlbnQ7CisJCUcuY3VycmVudCA9IEcuc2l6ZSAtIEcuY3VycmVudDsKKwkJZGF0YSA9IEcuZGF0YSArIEcuY3VycmVudDsKKwkJc2NyZWVuX3JlYWRfY2xvc2UoKTsKKwkJaWYgKGkgIT0gRy53aWR0aCB8fCBqICE9IEcuaGVpZ2h0KSB7CisJCQljbHJzY3IoKTsKKwkJCXNjcmVlbl9kdW1wKCk7CisJCX0gZWxzZSB7CisJCQkvLyBGb3IgZWFjaCByZW1vdGUgbGluZQorCQkJb2xkICs9IEcuZmlyc3RfbGluZV9vZmZzZXQ7CisJCQlkYXRhICs9IEcuZmlyc3RfbGluZV9vZmZzZXQ7CisJCQlmb3IgKGkgPSBHLnk7IGkgPCBHLnJlbW90ZS5saW5lczsgaSsrKSB7CisJCQkJY2hhciAqZmlyc3QgPSBOVUxMOyAvLyBmaXJzdCBjaGFyIHdoaWNoIG5lZWRzIHVwZGF0aW5nCisJCQkJY2hhciAqbGFzdCA9IGxhc3Q7ICAvLyBsYXN0IGNoYXIgd2hpY2ggbmVlZHMgdXBkYXRpbmcKKwkJCQl1bnNpZ25lZCBpeSA9IGkgLSBHLnk7CisKKwkJCQlpZiAoaXkgPj0gRy5oZWlnaHQpCisJCQkJCWJyZWFrOworCQkJCWZvciAoaiA9IDA7IGogPCBHLnJlbW90ZS5jb2xzOyBqKyssIE5FWFQob2xkKSwgTkVYVChkYXRhKSkgeworCQkJCQl1bnNpZ25lZCBqeCA9IGogLSBHLng7IC8vIGlmIHdpbGwgY2F0Y2ggaiA+PSBHLnggdG9vCisKKwkJCQkJaWYgKGp4IDwgRy53aWR0aCAmJiBEQVRBKGRhdGEpICE9IERBVEEob2xkKSkgeworCQkJCQkJbGFzdCA9IGRhdGE7CisJCQkJCQlpZiAoIWZpcnN0KSB7CisJCQkJCQkJZmlyc3QgPSBkYXRhOworCQkJCQkJCWdvdG94eShqeCwgaXkpOworCQkJCQkJfQorCQkJCQl9CisJCQkJfQorCQkJCWlmIChmaXJzdCkgeworCQkJCQkvLyBSZXdyaXRlIHVwZGF0ZWQgZGF0YSBvbiB0aGUgbG9jYWwgc2NyZWVuCisJCQkJCWZvciAoOyBmaXJzdCA8PSBsYXN0OyBORVhUKGZpcnN0KSkKKwkJCQkJCXNjcmVlbl9jaGFyKGZpcnN0KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJY3VybW92ZSgpOworCisJCS8vIFdhaXQgZm9yIGxvY2FsIHVzZXIga2V5cHJlc3NlcworCQlmZmx1c2hfYWxsKCk7CisJCXBmZC5mZCA9IEcua2JkX2ZkOworCQlwZmQuZXZlbnRzID0gUE9MTElOOworCQlieXRlc19yZWFkID0gMDsKKwkJc3dpdGNoIChwb2xsKCZwZmQsIDEsIHBvbGxfdGltZW91dF9tcykpIHsKKwkJCWNoYXIgKms7CisJCWNhc2UgLTE6CisJCQlpZiAoZXJybm8gIT0gRUlOVFIpCisJCQkJZ290byBhYm9ydDsKKwkJCWJyZWFrOworCQljYXNlIDA6CisJCQlpZiAoKytHLm5va2V5cyA+PSA0KQorCQkJCUcubm9rZXlzID0gRy5lc2NhcGVfY291bnQgPSAwOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvLyBSZWFkIHRoZSBrZXlzIHByZXNzZWQKKwkJCWsgPSBrZXlidWYgKyBHLmtleV9jb3VudDsKKwkJCWJ5dGVzX3JlYWQgPSByZWFkKEcua2JkX2ZkLCBrLCBzaXplb2Yoa2V5YnVmKSAtIEcua2V5X2NvdW50KTsKKwkJCWlmIChieXRlc19yZWFkIDwgMCkKKwkJCQlnb3RvIGFib3J0OworCisJCQkvLyBEbyBleGl0IHByb2Nlc3NpbmcKKwkJCWlmICghKG9wdGlvbl9tYXNrMzIgJiBGTEFHKFEpKSkgeworCQkJCWZvciAoaSA9IDA7IGkgPCBieXRlc19yZWFkOyBpKyspIHsKKwkJCQkJaWYgKGtbaV0gIT0gJ1wwMzMnKQorCQkJCQkJRy5lc2NhcGVfY291bnQgPSAtMTsKKwkJCQkJaWYgKCsrRy5lc2NhcGVfY291bnQgPj0gMykKKwkJCQkJCWNsZWFudXAoRVhJVF9TVUNDRVNTKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJcG9sbF90aW1lb3V0X21zID0gMjUwOworCQlpZiAob3B0aW9uX21hc2szMiAmIEZMQUcodikpIGNvbnRpbnVlOworCisJCS8vIEluc2VydCBhbGwga2V5cyBwcmVzc2VkIGludG8gdGhlIHZpcnR1YWwgY29uc29sZSdzIGlucHV0CisJCS8vIGJ1ZmZlci4gIERvbid0IGRvIHRoaXMgaWYgdGhlIHZpcnR1YWwgY29uc29sZSBpcyBpbiBzY2FuCisJCS8vIGNvZGUgbW9kZSAtIGdpdmluZyBBU0NJSSBjaGFyYWN0ZXJzIHRvIGEgcHJvZ3JhbSBleHBlY3RpbmcKKwkJLy8gc2NhbiBjb2RlcyB3aWxsIGNvbmZ1c2UgaXQuCisJCUcua2V5X2NvdW50ICs9IGJ5dGVzX3JlYWQ7CisJCWlmIChHLmVzY2FwZV9jb3VudCA9PSAwKSB7CisJCQlpbnQgaGFuZGxlLCByZXN1bHQ7CisJCQlsb25nIGtiZF9tb2RlOworCisJCQloYW5kbGUgPSB4b3Blbih0dHlfbmFtZSwgT19XUk9OTFkpOworCQkJcmVzdWx0ID0gaW9jdGwoaGFuZGxlLCBLREdLQk1PREUsICZrYmRfbW9kZSk7CisJCQlpZiAocmVzdWx0ID49IDApIHsKKwkJCQljaGFyICpwID0ga2V5YnVmOworCisJCQkJRy5pb2Vycm9yX2NvdW50ID0gMDsKKwkJCQlpZiAoa2JkX21vZGUgIT0gS19YTEFURSAmJiBrYmRfbW9kZSAhPSBLX1VOSUNPREUpIHsKKwkJCQkJRy5rZXlfY291bnQgPSAwOyAvLyBzY2FuIGNvZGUgbW9kZQorCQkJCX0KKwkJCQlmb3IgKDsgRy5rZXlfY291bnQgIT0gMDsgcCsrLCBHLmtleV9jb3VudC0tKSB7CisJCQkJCXJlc3VsdCA9IGlvY3RsKGhhbmRsZSwgVElPQ1NUSSwgcCk7CisJCQkJCWlmIChyZXN1bHQgPCAwKSB7CisJCQkJCQltZW1tb3ZlKGtleWJ1ZiwgcCwgRy5rZXlfY291bnQpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJLy8gSWYgdGhlcmUgaXMgYW4gYXBwbGljYXRpb24gb24gY29uc29sZSB3aGljaCByZWFjdHMKKwkJCQkJLy8gdG8ga2V5cHJlc3Nlcywgd2UgbmVlZCB0byBtYWtlIG91ciBmaXJzdCBzbGVlcAorCQkJCQkvLyBzaG9ydGVyIHRvIHF1aWNrbHkgcmVkcmF3IHdoYXRldmVyIGl0IHByaW50ZWQgdGhlcmUuCisJCQkJCXBvbGxfdGltZW91dF9tcyA9IDIwOworCQkJCX0KKwkJCX0KKwkJCS8vIFdlIHNvbWV0aW1lcyBnZXQgc3B1cmlvdXMgSU8gZXJyb3JzIG9uIHRoZSBUVFkKKwkJCS8vIGFzIHByb2dyYW1zIGNsb3NlIGFuZCByZS1vcGVuIGl0CisJCQllbHNlIGlmIChlcnJubyAhPSBFSU8gfHwgKytHLmlvZXJyb3JfY291bnQgPiA0KSB7CisJCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJCQljbG9zZShoYW5kbGUpOworCQkJCWdvdG8gYWJvcnQ7CisJCQl9CisJCQkvLyBDbG9zZSAmIHJlLW9wZW4gdHR5IGluIGNhc2UgdGhleSBoYXZlCisJCQkvLyBzd2FwcGVkIHZpcnR1YWwgY29uc29sZXMKKwkJCWNsb3NlKGhhbmRsZSk7CisJCX0KKwl9IC8qIHdoaWxlICgxKSAqLworICBhYm9ydDoKKwljbGVhbnVwKEVYSVRfRkFJTFVSRSk7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvY3JvbmQuYyBiL21pc2N1dGlscy9jcm9uZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMzI3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvY3JvbmQuYwpAQCAtMCwwICsxLDEwMTQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHJ1biBhcyByb290LCBidXQgTk9UIHNldHVpZCByb290CisgKgorICogQ29weXJpZ2h0IDE5OTQgTWF0dGhldyBEaWxsb24gKGRpbGxvbkBhcG9sbG8ud2VzdC5vaWMuY29tKQorICogKHZlcnNpb24gMi4zLjIpCisgKiBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+IChDKSAyMDAyCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworLy9jb25maWc6Y29uZmlnIENST05ECisvL2NvbmZpZzoJYm9vbCAiY3JvbmQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQ3JvbmQgaXMgYSBiYWNrZ3JvdW5kIGRhZW1vbiB0aGF0IHBhcnNlcyBpbmRpdmlkdWFsIGNyb250YWIKKy8vY29uZmlnOgkgIGZpbGVzIGFuZCBleGVjdXRlcyBjb21tYW5kcyBvbiBiZWhhbGYgb2YgdGhlIHVzZXJzIGluIHF1ZXN0aW9uLgorLy9jb25maWc6CSAgVGhpcyBpcyBhIHBvcnQgb2YgZGNyb24gZnJvbSBzbGFja3dhcmUuIEl0IHVzZXMgZmlsZXMgb2YgdGhlCisvL2NvbmZpZzoJICBmb3JtYXQgL3Zhci9zcG9vbC9jcm9uL2Nyb250YWJzLzx1c2VybmFtZT4gZmlsZXMsIGZvciBleGFtcGxlOgorLy9jb25maWc6CSAgICAgICQgY2F0IC92YXIvc3Bvb2wvY3Jvbi9jcm9udGFicy9yb290CisvL2NvbmZpZzoJICAgICAgIyBSdW4gZGFpbHkgY3JvbiBqb2JzIGF0IDQ6NDAgZXZlcnkgZGF5OgorLy9jb25maWc6CSAgICAgIDQwIDQgKiAqICogL2V0Yy9jcm9uL2RhaWx5ID4gL2Rldi9udWxsIDI+JjEKKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfQ1JPTkRfRAorLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgb3B0aW9uIC1kIHRvIHJlZGlyZWN0IG91dHB1dCB0byBzdGRlcnIiCisvL2NvbmZpZzoJZGVwZW5kcyBvbiBDUk9ORAorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIC1kIE4gc2V0cyBsb2dsZXZlbCAoMDptb3N0IHZlcmJvc2UpIGFuZCBkaXJlY3RzIGFsbCBvdXRwdXQgdG8gc3RkZXJyLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMCisvL2NvbmZpZzoJYm9vbCAiUmVwb3J0IGNvbW1hbmQgb3V0cHV0IHZpYSBlbWFpbCAodXNpbmcgc2VuZG1haWwpIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gQ1JPTkQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBDb21tYW5kIG91dHB1dCB3aWxsIGJlIHNlbnQgdG8gY29ycmVzcG9uZGluZyB1c2VyIHZpYSBlbWFpbC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfQ1JPTkRfRElSCisvL2NvbmZpZzoJc3RyaW5nICJjcm9uZCBzcG9vbCBkaXJlY3RvcnkiCisvL2NvbmZpZzoJZGVmYXVsdCAiL3Zhci9zcG9vbC9jcm9uIgorLy9jb25maWc6CWRlcGVuZHMgb24gQ1JPTkQgfHwgQ1JPTlRBQgorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIExvY2F0aW9uIG9mIGNyb25kIHNwb29sLgorCisvL2FwcGxldDpJRl9DUk9ORChBUFBMRVQoY3JvbmQsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0NST05EKSArPSBjcm9uZC5vCisKKy8vdXNhZ2U6I2RlZmluZSBjcm9uZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiLWZiUyAtbCBOICIgSUZfRkVBVFVSRV9DUk9ORF9EKCItZCBOICIpICItTCBMT0dGSUxFIC1jIERJUiIKKy8vdXNhZ2U6I2RlZmluZSBjcm9uZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgktZglGb3JlZ3JvdW5kIgorLy91c2FnZTogICAgICJcbgktYglCYWNrZ3JvdW5kIChkZWZhdWx0KSIKKy8vdXNhZ2U6ICAgICAiXG4JLVMJTG9nIHRvIHN5c2xvZyAoZGVmYXVsdCkiCisvL3VzYWdlOiAgICAgIlxuCS1sIE4JU2V0IGxvZyBsZXZlbC4gTW9zdCB2ZXJib3NlOjAsIGRlZmF1bHQ6OCIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfQ1JPTkRfRCgKKy8vdXNhZ2U6ICAgICAiXG4JLWQgTglTZXQgbG9nIGxldmVsLCBsb2cgdG8gc3RkZXJyIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktTCBGSUxFCUxvZyB0byBGSUxFIgorLy91c2FnZTogICAgICJcbgktYyBESVIJQ3JvbiBkaXIuIERlZmF1bHQ6IkNPTkZJR19GRUFUVVJFX0NST05EX0RJUiIvY3JvbnRhYnMiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5c2xvZy5oPgorCisvKiBnbGliYyBmcmVlcyBwcmV2aW91cyBzZXRlbnYnZWQgdmFsdWUgd2hlbiB3ZSBkbyBuZXh0IHNldGVudigpCisgKiBvZiB0aGUgc2FtZSB2YXJpYWJsZS4gdWNsaWJjIGRvZXMgbm90IGRvIHRoaXMhICovCisjaWYgKGRlZmluZWQoX19HTElCQ19fKSAmJiAhZGVmaW5lZChfX1VDTElCQ19fKSkgLyogfHwgT1RIRVJfU0FGRV9MSUJDLi4uICovCisjIGRlZmluZSBTRVRFTlZfTEVBS1MgMAorI2Vsc2UKKyMgZGVmaW5lIFNFVEVOVl9MRUFLUyAxCisjZW5kaWYKKworCisjZGVmaW5lIENST05fRElSICAgICAgICBDT05GSUdfRkVBVFVSRV9DUk9ORF9ESVIKKyNkZWZpbmUgQ1JPTlRBQlMgICAgICAgIENPTkZJR19GRUFUVVJFX0NST05EX0RJUiAiL2Nyb250YWJzIgorI2lmbmRlZiBTRU5ETUFJTAorIyBkZWZpbmUgU0VORE1BSUwgICAgICAgInNlbmRtYWlsIgorI2VuZGlmCisjaWZuZGVmIFNFTkRNQUlMX0FSR1MKKyMgZGVmaW5lIFNFTkRNQUlMX0FSR1MgICItdGkiCisjZW5kaWYKKyNpZm5kZWYgQ1JPTlVQREFURQorIyBkZWZpbmUgQ1JPTlVQREFURSAgICAgImNyb24udXBkYXRlIgorI2VuZGlmCisjaWZuZGVmIE1BWExJTkVTCisjIGRlZmluZSBNQVhMSU5FUyAgICAgICAyNTYgIC8qIG1heCBsaW5lcyBpbiBub24tcm9vdCBjcm9udGFicyAqLworI2VuZGlmCisKKwordHlwZWRlZiBzdHJ1Y3QgQ3JvbkZpbGUgeworCXN0cnVjdCBDcm9uRmlsZSAqY2ZfbmV4dDsKKwlzdHJ1Y3QgQ3JvbkxpbmUgKmNmX2xpbmVzOworCWNoYXIgKmNmX3VzZXJuYW1lOworCXNtYWxsaW50IGNmX3dhbnRzX3N0YXJ0aW5nOyAgICAgLyogYm9vbDogb25lIG9yIG1vcmUgam9icyByZWFkeSAqLworCXNtYWxsaW50IGNmX2hhc19ydW5uaW5nOyAgICAgICAgLyogYm9vbDogb25lIG9yIG1vcmUgam9icyBydW5uaW5nICovCisJc21hbGxpbnQgY2ZfZGVsZXRlZDsgICAgICAgICAgICAvKiBtYXJrZWQgZm9yIGRlbGV0aW9uIChidXQgc3RpbGwgaGFzIHJ1bm5pbmcgam9icykgKi8KK30gQ3JvbkZpbGU7CisKK3R5cGVkZWYgc3RydWN0IENyb25MaW5lIHsKKwlzdHJ1Y3QgQ3JvbkxpbmUgKmNsX25leHQ7CisJY2hhciAqY2xfY21kOyAgICAgICAgICAgICAgICAgICAvKiBzaGVsbCBjb21tYW5kICovCisJcGlkX3QgY2xfcGlkOyAgICAgICAgICAgICAgICAgICAvKiA+MDpydW5uaW5nLCA8MDpuZWVkcyB0byBiZSBzdGFydGVkIGluIHRoaXMgbWludXRlLCAwOmRvcm1hbnQgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMCisJaW50IGNsX2VtcHR5X21haWxfc2l6ZTsgICAgICAgICAvKiBzaXplIG9mIG1haWwgaGVhZGVyIG9ubHksIDAgaWYgbm8gbWFpbGZpbGUgKi8KKwljaGFyICpjbF9tYWlsdG87ICAgICAgICAgICAgICAgIC8qIHdob20gdG8gbWFpbCByZXN1bHRzLCBtYXkgYmUgTlVMTCAqLworI2VuZGlmCisJY2hhciAqY2xfc2hlbGw7CisJLyogb3JkZXJlZCBieSBzaXplLCBub3QgaW4gbmF0dXJhbCBvcmRlci4gbWFrZXMgY29kZSBzbWFsbGVyOiAqLworCWNoYXIgY2xfRG93WzddOyAgICAgICAgICAgICAgICAgLyogMC02LCBiZWdpbm5pbmcgc3VuZGF5ICovCisJY2hhciBjbF9Nb25zWzEyXTsgICAgICAgICAgICAgICAvKiAwLTExICovCisJY2hhciBjbF9IcnNbMjRdOyAgICAgICAgICAgICAgICAvKiAwLTIzICovCisJY2hhciBjbF9EYXlzWzMyXTsgICAgICAgICAgICAgICAvKiAxLTMxICovCisJY2hhciBjbF9NaW5zWzYwXTsgICAgICAgICAgICAgICAvKiAwLTU5ICovCit9IENyb25MaW5lOworCisKKyNkZWZpbmUgREFFTU9OX1VJRCAwCisKKworZW51bSB7CisJT1BUX2wgPSAoMSA8PCAwKSwKKwlPUFRfTCA9ICgxIDw8IDEpLAorCU9QVF9mID0gKDEgPDwgMiksCisJT1BUX2IgPSAoMSA8PCAzKSwKKwlPUFRfUyA9ICgxIDw8IDQpLAorCU9QVF9jID0gKDEgPDwgNSksCisJT1BUX2QgPSAoMSA8PCA2KSAqIEVOQUJMRV9GRUFUVVJFX0NST05EX0QsCit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJdW5zaWduZWQgbG9nX2xldmVsOyAvKiA9IDg7ICovCisJdGltZV90IGNyb250YWJfZGlyX210aW1lOworCWNvbnN0IGNoYXIgKmxvZ19maWxlbmFtZTsKKwljb25zdCBjaGFyICpjcm9udGFiX2Rpcl9uYW1lOyAvKiA9IENST05UQUJTOyAqLworCUNyb25GaWxlICpjcm9uX2ZpbGVzOworI2lmIFNFVEVOVl9MRUFLUworCWNoYXIgKmVudl92YXJfdXNlcjsKKwljaGFyICplbnZfdmFyX2hvbWU7CisJY2hhciAqZW52X3Zhcl9zaGVsbDsKKwljaGFyICplbnZfdmFyX2xvZ25hbWU7CisjZW5kaWYKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCUcubG9nX2xldmVsID0gODsgXAorCUcuY3JvbnRhYl9kaXJfbmFtZSA9IENST05UQUJTOyBcCit9IHdoaWxlICgwKQorCisvKiBMb2cgbGV2ZWxzOgorICogMCBpcyB0aGUgbW9zdCB2ZXJib3NlLCBkZWZhdWx0IDguCisgKiBGb3Igc29tZSByZWFzb24sIGluIGZhY3Qgb25seSA1LCA3IGFuZCA4IGFyZSB1c2VkLgorICovCitzdGF0aWMgdm9pZCBjcm9uZGxvZyh1bnNpZ25lZCBsZXZlbCwgY29uc3QgY2hhciAqbXNnLCB2YV9saXN0IHZhKQoreworCWlmIChsZXZlbCA+PSBHLmxvZ19sZXZlbCkgeworCQkvKgorCQkgKiBXZSBhcmUgY2FsbGVkIG9ubHkgZm9yIGluZm8gbWVlc2FnZXMuCisJCSAqIFdhcm5pbmdzL2Vycm9ycyB1c2UgcGxhaW4gYmJfW3BdZXJyb3JfbXNnJ3MsIHdoaWNoCisJCSAqIG5lZWQgbm90IHRvdWNoIHN5c2xvZ19sZXZlbAorCQkgKiAodGhleSBhcmUgb2sgd2l0aCBMT0dfRVJSIGRlZmF1bHQpLgorCQkgKi8KKwkJc3lzbG9nX2xldmVsID0gTE9HX0lORk87CisJCWJiX3ZlcnJvcl9tc2cobXNnLCB2YSwgLyogc3RyZXJyOiAqLyBOVUxMKTsKKwkJc3lzbG9nX2xldmVsID0gTE9HX0VSUjsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGxvZzUoY29uc3QgY2hhciAqbXNnLCAuLi4pCit7CisJdmFfbGlzdCB2YTsKKwl2YV9zdGFydCh2YSwgbXNnKTsKKwljcm9uZGxvZyg0LCBtc2csIHZhKTsKKwl2YV9lbmQodmEpOworfQorCitzdGF0aWMgdm9pZCBsb2c3KGNvbnN0IGNoYXIgKm1zZywgLi4uKQoreworCXZhX2xpc3QgdmE7CisJdmFfc3RhcnQodmEsIG1zZyk7CisJY3JvbmRsb2coNywgbXNnLCB2YSk7CisJdmFfZW5kKHZhKTsKK30KKworc3RhdGljIHZvaWQgbG9nOChjb25zdCBjaGFyICptc2csIC4uLikKK3sKKwl2YV9saXN0IHZhOworCXZhX3N0YXJ0KHZhLCBtc2cpOworCWNyb25kbG9nKDgsIG1zZywgdmEpOworCXZhX2VuZCh2YSk7Cit9CisKKworc3RhdGljIGNvbnN0IGNoYXIgRG93QXJ5W10gQUxJR04xID0KKwkic3VuIiJtb24iInR1ZSIid2VkIiJ0aHUiImZyaSIic2F0IgorOworCitzdGF0aWMgY29uc3QgY2hhciBNb25BcnlbXSBBTElHTjEgPQorCSJqYW4iImZlYiIibWFyIiJhcHIiIm1heSIianVuIiJqdWwiImF1ZyIic2VwIiJvY3QiIm5vdiIiZGVjIgorOworCitzdGF0aWMgdm9pZCBQYXJzZUZpZWxkKGNoYXIgKnVzZXIsIGNoYXIgKmFyeSwgaW50IG1vZHZhbHVlLCBpbnQgb2ZmLAorCQkJCWNvbnN0IGNoYXIgKm5hbWVzLCBjaGFyICpwdHIpCisvKiAnbmFtZXMnIGlzIGEgcG9pbnRlciB0byBhIHNldCBvZiAzLWNoYXIgYWJicmV2aWF0aW9ucyAqLworeworCWNoYXIgKmJhc2UgPSBwdHI7CisJaW50IG4xID0gLTE7CisJaW50IG4yID0gLTE7CisKKwkvLyB0aGlzIGNhbid0IGhhcHBlbiBkdWUgdG8gY29uZmlnX3JlYWQoKQorCS8qaWYgKGJhc2UgPT0gTlVMTCkKKwkJcmV0dXJuOyovCisKKwl3aGlsZSAoMSkgeworCQlpbnQgc2tpcCA9IDA7CisKKwkJLyogSGFuZGxlIG51bWVyaWMgZGlnaXQgb3Igc3ltYm9sIG9yICcqJyAqLworCQlpZiAoKnB0ciA9PSAnKicpIHsKKwkJCW4xID0gMDsgIC8qIGV2ZXJ5dGhpbmcgd2lsbCBiZSBmaWxsZWQgKi8KKwkJCW4yID0gbW9kdmFsdWUgLSAxOworCQkJc2tpcCA9IDE7CisJCQkrK3B0cjsKKwkJfSBlbHNlIGlmIChpc2RpZ2l0KCpwdHIpKSB7CisJCQljaGFyICplbmRwOworCQkJaWYgKG4xIDwgMCkgeworCQkJCW4xID0gc3RydG9sKHB0ciwgJmVuZHAsIDEwKSArIG9mZjsKKwkJCX0gZWxzZSB7CisJCQkJbjIgPSBzdHJ0b2wocHRyLCAmZW5kcCwgMTApICsgb2ZmOworCQkJfQorCQkJcHRyID0gZW5kcDsgLyogZ2NjIGxpa2VzIHRlbXAgdmFyIGZvciAmZW5kcCAqLworCQkJc2tpcCA9IDE7CisJCX0gZWxzZSBpZiAobmFtZXMpIHsKKwkJCWludCBpOworCisJCQlmb3IgKGkgPSAwOyBuYW1lc1tpXTsgaSArPSAzKSB7CisJCQkJLyogd2FzIHVzaW5nIHN0cm5jbXAgYmVmb3JlLi4uICovCisJCQkJaWYgKHN0cm5jYXNlY21wKHB0ciwgJm5hbWVzW2ldLCAzKSA9PSAwKSB7CisJCQkJCXB0ciArPSAzOworCQkJCQlpZiAobjEgPCAwKSB7CisJCQkJCQluMSA9IGkgLyAzOworCQkJCQl9IGVsc2UgeworCQkJCQkJbjIgPSBpIC8gMzsKKwkJCQkJfQorCQkJCQlza2lwID0gMTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyogaGFuZGxlIG9wdGlvbmFsIHJhbmdlICctJyAqLworCQlpZiAoc2tpcCA9PSAwKSB7CisJCQlnb3RvIGVycjsKKwkJfQorCQlpZiAoKnB0ciA9PSAnLScgJiYgbjIgPCAwKSB7CisJCQkrK3B0cjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogY29sbGFwc2Ugc2luZ2xlLXZhbHVlIHJhbmdlcywgaGFuZGxlIHNraXBtYXJrLCBhbmQgZmlsbAorCQkgKiBpbiB0aGUgY2hhcmFjdGVyIGFycmF5IGFwcHJvcHJpYXRlbHkuCisJCSAqLworCQlpZiAobjIgPCAwKSB7CisJCQluMiA9IG4xOworCQl9CisJCWlmICgqcHRyID09ICcvJykgeworCQkJY2hhciAqZW5kcDsKKwkJCXNraXAgPSBzdHJ0b2wocHRyICsgMSwgJmVuZHAsIDEwKTsKKwkJCXB0ciA9IGVuZHA7IC8qIGdjYyBsaWtlcyB0ZW1wIHZhciBmb3IgJmVuZHAgKi8KKwkJfQorCisJCS8qCisJCSAqIGZpbGwgYXJyYXksIHVzaW5nIGEgZmFpbHNhZmUgaXMgdGhlIGVhc2llc3Qgd2F5IHRvIHByZXZlbnQKKwkJICogYW4gZW5kbGVzcyBsb29wCisJCSAqLworCQl7CisJCQlpbnQgczAgPSAxOworCQkJaW50IGZhaWxzYWZlID0gMTAyNDsKKworCQkJLS1uMTsKKwkJCWRvIHsKKwkJCQluMSA9IChuMSArIDEpICUgbW9kdmFsdWU7CisKKwkJCQlpZiAoLS1zMCA9PSAwKSB7CisJCQkJCWFyeVtuMSAlIG1vZHZhbHVlXSA9IDE7CisJCQkJCXMwID0gc2tpcDsKKwkJCQl9CisJCQkJaWYgKC0tZmFpbHNhZmUgPT0gMCkgeworCQkJCQlnb3RvIGVycjsKKwkJCQl9CisJCQl9IHdoaWxlIChuMSAhPSBuMik7CisJCX0KKwkJaWYgKCpwdHIgIT0gJywnKSB7CisJCQlicmVhazsKKwkJfQorCQkrK3B0cjsKKwkJbjEgPSAtMTsKKwkJbjIgPSAtMTsKKwl9CisKKwlpZiAoKnB0cikgeworIGVycjoKKwkJYmJfZXJyb3JfbXNnKCJ1c2VyICVzOiBwYXJzZSBlcnJvciBhdCAlcyIsIHVzZXIsIGJhc2UpOworCQlyZXR1cm47CisJfQorCisJLyogY2FuJ3QgdXNlIGxvZzUgKGl0IGluc2VydHMgbmV3bGluZXMpLCBvcGVuLWNvZGluZyBpdCAqLworCWlmIChHLmxvZ19sZXZlbCA8PSA1ICYmIGxvZ21vZGUgIT0gTE9HTU9ERV9TWVNMT0cpIHsKKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBtb2R2YWx1ZTsgKytpKQorCQkJZnByaW50ZihzdGRlcnIsICIlZCIsICh1bnNpZ25lZCBjaGFyKWFyeVtpXSk7CisJCWJiX3B1dGNoYXJfc3RkZXJyKCdcbicpOworCX0KK30KKworc3RhdGljIHZvaWQgRml4RGF5RG93KENyb25MaW5lICpsaW5lKQoreworCXVuc2lnbmVkIGk7CisJaW50IHdlZWtVc2VkID0gMDsKKwlpbnQgZGF5c1VzZWQgPSAwOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGluZS0+Y2xfRG93KTsgKytpKSB7CisJCWlmIChsaW5lLT5jbF9Eb3dbaV0gPT0gMCkgeworCQkJd2Vla1VzZWQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGluZS0+Y2xfRGF5cyk7ICsraSkgeworCQlpZiAobGluZS0+Y2xfRGF5c1tpXSA9PSAwKSB7CisJCQlkYXlzVXNlZCA9IDE7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAod2Vla1VzZWQgIT0gZGF5c1VzZWQpIHsKKwkJaWYgKHdlZWtVc2VkKQorCQkJbWVtc2V0KGxpbmUtPmNsX0RheXMsIDAsIHNpemVvZihsaW5lLT5jbF9EYXlzKSk7CisJCWVsc2UgLyogZGF5c1VzZWQgKi8KKwkJCW1lbXNldChsaW5lLT5jbF9Eb3csIDAsIHNpemVvZihsaW5lLT5jbF9Eb3cpKTsKKwl9Cit9CisKKy8qCisgKiBkZWxldGVfY3JvbmZpbGUoKSAtIGRlbGV0ZSB1c2VyIGRhdGFiYXNlCisgKgorICogTm90ZTogbXVsdGlwbGUgZW50cmllcyBmb3Igc2FtZSB1c2VyIG1heSBleGlzdCBpZiB3ZSB3ZXJlIHVuYWJsZSB0bworICogY29tcGxldGVseSBkZWxldGUgYSBkYXRhYmFzZSBkdWUgdG8gcnVubmluZyBwcm9jZXNzZXMuCisgKi8KKy8vRklYTUU6IHdlIHdpbGwgc3RhcnQgYSBuZXcgam9iIGV2ZW4gaWYgdGhlIG9sZCBqb2IgaXMgcnVubmluZworLy9pZiBjcm9udGFiIHdhcyByZWxvYWRlZDogY3JvbmQgdGhpbmtzIHRoYXQgIm5ldyIgam9iIGlzIGRpZmZlcmVudCBmcm9tICJvbGQiCisvL2V2ZW4gaWYgdGhleSBhcmUgaW4gZmFjdCBjb21wbGV0ZWx5IHRoZSBzYW1lLiBFeGFtcGxlCisvL0Nyb250YWIgd2FzOgorLy8gMC01OSAqICogKiAqIGpvYjEKKy8vIDAtNTkgKiAqICogKiBsb25nX3J1bm5pbmdfam9iMgorLy9Vc2VyIGVkaXRzIGNyb250YWIgdG86CisvLyAwLTU5ICogKiAqICogam9iMV91cGRhdGVkCisvLyAwLTU5ICogKiAqICogbG9uZ19ydW5uaW5nX2pvYjIKKy8vQnVnOiBjcm9uZCBjYW4gbm93IHN0YXJ0IGFub3RoZXIgbG9uZ19ydW5uaW5nX2pvYjIgZXZlbiBpZiBvbGQgb25lCisvL2lzIHN0aWxsIHJ1bm5pbmcuCisvL09UT0ggbW9zdCBvdGhlciB2ZXJzaW9ucyBvZiBjcm9uIGRvIG5vdCB3YWl0IGZvciBqb2IgdGVybWluYXRpb24gYW55d2F5LAorLy90aGV5IGVuZCB1cCB3aXRoIG11bHRpcGxlIGNvcGllcyBvZiBqb2JzIGlmIHRoZXkgZG9uJ3QgdGVybWluYXRlIHNvb24gZW5vdWdoLgorc3RhdGljIHZvaWQgZGVsZXRlX2Nyb25maWxlKGNvbnN0IGNoYXIgKnVzZXJOYW1lKQoreworCUNyb25GaWxlICoqcGZpbGUgPSAmRy5jcm9uX2ZpbGVzOworCUNyb25GaWxlICpmaWxlOworCisJd2hpbGUgKChmaWxlID0gKnBmaWxlKSAhPSBOVUxMKSB7CisJCWlmIChzdHJjbXAodXNlck5hbWUsIGZpbGUtPmNmX3VzZXJuYW1lKSA9PSAwKSB7CisJCQlDcm9uTGluZSAqKnBsaW5lID0gJmZpbGUtPmNmX2xpbmVzOworCQkJQ3JvbkxpbmUgKmxpbmU7CisKKwkJCWZpbGUtPmNmX2hhc19ydW5uaW5nID0gMDsKKwkJCWZpbGUtPmNmX2RlbGV0ZWQgPSAxOworCisJCQl3aGlsZSAoKGxpbmUgPSAqcGxpbmUpICE9IE5VTEwpIHsKKwkJCQlpZiAobGluZS0+Y2xfcGlkID4gMCkgeworCQkJCQlmaWxlLT5jZl9oYXNfcnVubmluZyA9IDE7CisJCQkJCXBsaW5lID0gJmxpbmUtPmNsX25leHQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJKnBsaW5lID0gbGluZS0+Y2xfbmV4dDsKKwkJCQkJZnJlZShsaW5lLT5jbF9jbWQpOworCQkJCQlmcmVlKGxpbmUpOworCQkJCX0KKwkJCX0KKwkJCWlmIChmaWxlLT5jZl9oYXNfcnVubmluZyA9PSAwKSB7CisJCQkJKnBmaWxlID0gZmlsZS0+Y2ZfbmV4dDsKKwkJCQlmcmVlKGZpbGUtPmNmX3VzZXJuYW1lKTsKKwkJCQlmcmVlKGZpbGUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCXBmaWxlID0gJmZpbGUtPmNmX25leHQ7CisJfQorfQorCitzdGF0aWMgdm9pZCBsb2FkX2Nyb250YWIoY29uc3QgY2hhciAqZmlsZU5hbWUpCit7CisJc3RydWN0IHBhcnNlcl90ICpwYXJzZXI7CisJc3RydWN0IHN0YXQgc2J1ZjsKKwlpbnQgbWF4TGluZXM7CisJY2hhciAqdG9rZW5zWzZdOworI2lmIEVOQUJMRV9GRUFUVVJFX0NST05EX0NBTExfU0VORE1BSUwKKwljaGFyICptYWlsVG8gPSBOVUxMOworI2VuZGlmCisJY2hhciAqc2hlbGwgPSBOVUxMOworCisJZGVsZXRlX2Nyb25maWxlKGZpbGVOYW1lKTsKKworCWlmICghZ2V0cHduYW0oZmlsZU5hbWUpKSB7CisJCWxvZzcoImlnbm9yaW5nIGZpbGUgJyVzJyAobm8gc3VjaCB1c2VyKSIsIGZpbGVOYW1lKTsKKwkJcmV0dXJuOworCX0KKworCXBhcnNlciA9IGNvbmZpZ19vcGVuKGZpbGVOYW1lKTsKKwlpZiAoIXBhcnNlcikKKwkJcmV0dXJuOworCisJbWF4TGluZXMgPSAoc3RyY21wKGZpbGVOYW1lLCAicm9vdCIpID09IDApID8gNjU1MzUgOiBNQVhMSU5FUzsKKworCWlmIChmc3RhdChmaWxlbm8ocGFyc2VyLT5mcCksICZzYnVmKSA9PSAwICYmIHNidWYuc3RfdWlkID09IERBRU1PTl9VSUQpIHsKKwkJQ3JvbkZpbGUgKmZpbGUgPSB4emFsbG9jKHNpemVvZihDcm9uRmlsZSkpOworCQlDcm9uTGluZSAqKnBsaW5lOworCQlpbnQgbjsKKworCQlmaWxlLT5jZl91c2VybmFtZSA9IHhzdHJkdXAoZmlsZU5hbWUpOworCQlwbGluZSA9ICZmaWxlLT5jZl9saW5lczsKKworCQl3aGlsZSAoMSkgeworCQkJQ3JvbkxpbmUgKmxpbmU7CisKKwkJCWlmICghLS1tYXhMaW5lcykgeworCQkJCWJiX2Vycm9yX21zZygidXNlciAlczogdG9vIG1hbnkgbGluZXMiLCBmaWxlTmFtZSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCW4gPSBjb25maWdfcmVhZChwYXJzZXIsIHRva2VucywgNiwgMSwgIiMgXHQiLCBQQVJTRV9OT1JNQUwgfCBQQVJTRV9LRUVQX0NPUFkpOworCQkJaWYgKCFuKQorCQkJCWJyZWFrOworCisJCQlsb2c1KCJ1c2VyOiVzIGVudHJ5OiVzIiwgZmlsZU5hbWUsIHBhcnNlci0+ZGF0YSk7CisKKwkJCS8qIGNoZWNrIGlmIGxpbmUgaXMgc2V0dGluZyBNQUlMVE89ICovCisJCQlpZiAoaXNfcHJlZml4ZWRfd2l0aCh0b2tlbnNbMF0sICJNQUlMVE89IikpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMCisJCQkJZnJlZShtYWlsVG8pOworCQkJCW1haWxUbyA9ICh0b2tlbnNbMF1bN10pID8geHN0cmR1cCgmdG9rZW5zWzBdWzddKSA6IE5VTEw7CisjZW5kaWYgLyogb3RoZXJ3aXNlIGp1c3QgaWdub3JlIHN1Y2ggbGluZXMgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChpc19wcmVmaXhlZF93aXRoKHRva2Vuc1swXSwgIlNIRUxMPSIpKSB7CisJCQkJZnJlZShzaGVsbCk7CisJCQkJc2hlbGwgPSB4c3RyZHVwKCZ0b2tlbnNbMF1bNl0pOworCQkJCWNvbnRpbnVlOworCQkJfQorLy9UT0RPOiBoYW5kbGUgSE9NRT0gdG9vPyAibWFuIGNyb250YWIiIHNheXM6CisvL25hbWUgPSB2YWx1ZQorLy8KKy8vd2hlcmUgdGhlIHNwYWNlcyBhcm91bmQgdGhlIGVxdWFsLXNpZ24gKD0pIGFyZSBvcHRpb25hbCwgYW5kIGFueSBzdWJzZXF1ZW50CisvL25vbi1sZWFkaW5nIHNwYWNlcyBpbiB2YWx1ZSB3aWxsIGJlIHBhcnQgb2YgdGhlIHZhbHVlIGFzc2lnbmVkIHRvIG5hbWUuCisvL1RoZSB2YWx1ZSBzdHJpbmcgbWF5IGJlIHBsYWNlZCBpbiBxdW90ZXMgKHNpbmdsZSBvciBkb3VibGUsIGJ1dCBtYXRjaGluZykKKy8vdG8gcHJlc2VydmUgbGVhZGluZyBvciB0cmFpbGluZyBibGFua3MuCisvLworLy9TZXZlcmFsIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcmUgc2V0IHVwIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGNyb24oOCkgZGFlbW9uLgorLy9TSEVMTCBpcyBzZXQgdG8gL2Jpbi9zaCwgYW5kIExPR05BTUUgYW5kIEhPTUUgYXJlIHNldCBmcm9tIHRoZSAvZXRjL3Bhc3N3ZAorLy9saW5lIG9mIHRoZSBjcm9udGFiJ3Mgb3duZXIuIEhPTUUgYW5kIFNIRUxMIG1heSBiZSBvdmVycmlkZGVuIGJ5IHNldHRpbmdzCisvL2luIHRoZSBjcm9udGFiOyBMT0dOQU1FIG1heSBub3QuCisKKwkJCS8qIGNoZWNrIGlmIGEgbWluaW11bSBvZiB0b2tlbnMgaXMgc3BlY2lmaWVkICovCisJCQlpZiAobiA8IDYpCisJCQkJY29udGludWU7CisJCQkqcGxpbmUgPSBsaW5lID0geHphbGxvYyhzaXplb2YoKmxpbmUpKTsKKwkJCS8qIHBhcnNlIGRhdGUgcmFuZ2VzICovCisJCQlQYXJzZUZpZWxkKGZpbGUtPmNmX3VzZXJuYW1lLCBsaW5lLT5jbF9NaW5zLCA2MCwgMCwgTlVMTCwgdG9rZW5zWzBdKTsKKwkJCVBhcnNlRmllbGQoZmlsZS0+Y2ZfdXNlcm5hbWUsIGxpbmUtPmNsX0hycywgMjQsIDAsIE5VTEwsIHRva2Vuc1sxXSk7CisJCQlQYXJzZUZpZWxkKGZpbGUtPmNmX3VzZXJuYW1lLCBsaW5lLT5jbF9EYXlzLCAzMiwgMCwgTlVMTCwgdG9rZW5zWzJdKTsKKwkJCVBhcnNlRmllbGQoZmlsZS0+Y2ZfdXNlcm5hbWUsIGxpbmUtPmNsX01vbnMsIDEyLCAtMSwgTW9uQXJ5LCB0b2tlbnNbM10pOworCQkJUGFyc2VGaWVsZChmaWxlLT5jZl91c2VybmFtZSwgbGluZS0+Y2xfRG93LCA3LCAwLCBEb3dBcnksIHRva2Vuc1s0XSk7CisJCQkvKgorCQkJICogZml4IGRheXMgYW5kIGRvdyAtIGlmIG9uZSBpcyBub3QgIioiIGFuZCB0aGUgb3RoZXIKKwkJCSAqIGlzICIqIiwgdGhlIG90aGVyIGlzIHNldCB0byAwLCBhbmQgdmlzZS12ZXJzYQorCQkJICovCisJCQlGaXhEYXlEb3cobGluZSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQ1JPTkRfQ0FMTF9TRU5ETUFJTAorCQkJLyogY29weSBtYWlsdG8gKGNhbiBiZSBOVUxMKSAqLworCQkJbGluZS0+Y2xfbWFpbHRvID0geHN0cmR1cChtYWlsVG8pOworI2VuZGlmCisJCQlsaW5lLT5jbF9zaGVsbCA9IHhzdHJkdXAoc2hlbGwpOworCQkJLyogY29weSBjb21tYW5kICovCisJCQlsaW5lLT5jbF9jbWQgPSB4c3RyZHVwKHRva2Vuc1s1XSk7CisJCQlwbGluZSA9ICZsaW5lLT5jbF9uZXh0OworLy9iYl9lcnJvcl9tc2coIk1bJXNdRlslc11bJXNdWyVzXVslc11bJXNdWyVzXSIsIG1haWxUbywgdG9rZW5zWzBdLCB0b2tlbnNbMV0sIHRva2Vuc1syXSwgdG9rZW5zWzNdLCB0b2tlbnNbNF0sIHRva2Vuc1s1XSk7CisJCX0KKwkJKnBsaW5lID0gTlVMTDsKKworCQlmaWxlLT5jZl9uZXh0ID0gRy5jcm9uX2ZpbGVzOworCQlHLmNyb25fZmlsZXMgPSBmaWxlOworCX0KKwljb25maWdfY2xvc2UocGFyc2VyKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMCisJZnJlZShtYWlsVG8pOworI2VuZGlmCisJZnJlZShzaGVsbCk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfY3Jvbl91cGRhdGVfZmlsZSh2b2lkKQoreworCUZJTEUgKmZpOworCWNoYXIgYnVmWzI1Nl07CisKKwlmaSA9IGZvcGVuX2Zvcl9yZWFkKENST05VUERBVEUpOworCWlmIChmaSAhPSBOVUxMKSB7CisJCXVubGluayhDUk9OVVBEQVRFKTsKKwkJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZpKSAhPSBOVUxMKSB7CisJCQkvKiB1c2UgZmlyc3Qgd29yZCBvbmx5ICovCisJCQlza2lwX25vbl93aGl0ZXNwYWNlKGJ1ZilbMF0gPSAnXDAnOworCQkJbG9hZF9jcm9udGFiKGJ1Zik7CisJCX0KKwkJZmNsb3NlKGZpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlc2Nhbl9jcm9udGFiX2Rpcih2b2lkKQoreworCUNyb25GaWxlICpmaWxlOworCisJLyogRGVsZXRlIGFsbCBmaWxlcyB1bnRpbCB3ZSBvbmx5IGhhdmUgb25lcyB3aXRoIHJ1bm5pbmcgam9icyAob3Igbm9uZSkgKi8KKyBhZ2FpbjoKKwlmb3IgKGZpbGUgPSBHLmNyb25fZmlsZXM7IGZpbGU7IGZpbGUgPSBmaWxlLT5jZl9uZXh0KSB7CisJCWlmICghZmlsZS0+Y2ZfZGVsZXRlZCkgeworCQkJZGVsZXRlX2Nyb25maWxlKGZpbGUtPmNmX3VzZXJuYW1lKTsKKwkJCWdvdG8gYWdhaW47CisJCX0KKwl9CisKKwkvKiBSZW1vdmUgY3JvbiB1cGRhdGUgZmlsZSAqLworCXVubGluayhDUk9OVVBEQVRFKTsKKwkvKiBSZS1jaGRpciwgaW4gY2FzZSBkaXJlY3Rvcnkgd2FzIHJlbmFtZWQgJiBkZWxldGVkICovCisJeGNoZGlyKEcuY3JvbnRhYl9kaXJfbmFtZSk7CisKKwkvKiBTY2FuIGRpcmVjdG9yeSBhbmQgYWRkIGFzc29jaWF0ZWQgdXNlcnMgKi8KKwl7CisJCURJUiAqZGlyID0gb3BlbmRpcigiLiIpOworCQlzdHJ1Y3QgZGlyZW50ICpkZW47CisKKwkJLyogeG9wZW5kaXIgZXhpc3RzLCBidXQgImNhbid0IG9wZW4gJy4nIiBpcyBub3QgaW5mb3JtYXRpdmUgKi8KKwkJaWYgKCFkaXIpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgb3BlbiAnJXMnIiwgRy5jcm9udGFiX2Rpcl9uYW1lKTsKKwkJd2hpbGUgKChkZW4gPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJCWlmIChzdHJjaHIoZGVuLT5kX25hbWUsICcuJykgIT0gTlVMTCkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJbG9hZF9jcm9udGFiKGRlbi0+ZF9uYW1lKTsKKwkJfQorCQljbG9zZWRpcihkaXIpOworCX0KK30KKworI2lmIFNFVEVOVl9MRUFLUworLyogV2Ugc2V0IGVudmlyb25tZW50ICpiZWZvcmUqIHZmb3JrIChiZWNhdXNlIHdlIHdhbnQgdG8gdXNlIHZmb3JrKSwKKyAqIHNvIHdlIGNhbm5vdCB1c2Ugc2V0ZW52KCkgLSByZXBlYXRlZCBjYWxscyB0byBzZXRlbnYoKSBtYXkgbGVhayBtZW1vcnkhCisgKiBVc2luZyBwdXRlbnYoKSwgYW5kIGZyZWVpbmcgbWVtb3J5IGFmdGVyIHVuc2V0ZW52KCkgd29uJ3QgbGVhayAqLworc3RhdGljIHZvaWQgc2FmZV9zZXRlbnYoY2hhciAqKnB2YXJfdmFsLCBjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbCkKK3sKKwljaGFyICp2YXJfdmFsID0gKnB2YXJfdmFsOworCisJaWYgKHZhcl92YWwpIHsKKwkJYmJfdW5zZXRlbnZfYW5kX2ZyZWUodmFyX3ZhbCk7CisJfQorCSpwdmFyX3ZhbCA9IHhhc3ByaW50ZigiJXM9JXMiLCB2YXIsIHZhbCk7CisJcHV0ZW52KCpwdmFyX3ZhbCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgc2V0X2Vudl92YXJzKHN0cnVjdCBwYXNzd2QgKnBhcywgY29uc3QgY2hhciAqc2hlbGwpCit7CisJLyogUE9TSVggcmVxdWlyZXMgY3JvbmQgdG8gc2V0IHVwIGF0IGxlYXN0IEhPTUUsIExPR05BTUUsIFBBVEgsIFNIRUxMLgorCSAqIFdlIGFzc3VtZSBjcm9uZCBpbmhlcml0ZWQgc3VpdGFibGUgUEFUSC4KKwkgKi8KKyNpZiBTRVRFTlZfTEVBS1MKKwlzYWZlX3NldGVudigmRy5lbnZfdmFyX2xvZ25hbWUsICJMT0dOQU1FIiwgcGFzLT5wd19uYW1lKTsKKwlzYWZlX3NldGVudigmRy5lbnZfdmFyX3VzZXIsICJVU0VSIiwgcGFzLT5wd19uYW1lKTsKKwlzYWZlX3NldGVudigmRy5lbnZfdmFyX2hvbWUsICJIT01FIiwgcGFzLT5wd19kaXIpOworCXNhZmVfc2V0ZW52KCZHLmVudl92YXJfc2hlbGwsICJTSEVMTCIsIHNoZWxsKTsKKyNlbHNlCisJeHNldGVudigiTE9HTkFNRSIsIHBhcy0+cHdfbmFtZSk7CisJeHNldGVudigiVVNFUiIsIHBhcy0+cHdfbmFtZSk7CisJeHNldGVudigiSE9NRSIsIHBhcy0+cHdfZGlyKTsKKwl4c2V0ZW52KCJTSEVMTCIsIHNoZWxsKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBjaGFuZ2VfdXNlcihzdHJ1Y3QgcGFzc3dkICpwYXMpCit7CisJLyogY2FyZWZ1bDogd2UncmUgYWZ0ZXIgdmZvcmshICovCisJY2hhbmdlX2lkZW50aXR5KHBhcyk7IC8qIC0gaW5pdGdyb3Vwcywgc2V0Z2lkLCBzZXR1aWQgKi8KKwlpZiAoY2hkaXIocGFzLT5wd19kaXIpIDwgMCkgeworCQliYl9lcnJvcl9tc2coImNhbid0IGNoYW5nZSBkaXJlY3RvcnkgdG8gJyVzJyIsIHBhcy0+cHdfZGlyKTsKKwkJeGNoZGlyKENST05fRElSKTsKKwl9Cit9CisKKy8vIFRPRE86IHNlbmRtYWlsIHNob3VsZCBiZSBfcnVuLXRpbWVfIG9wdGlvbiwgbm90IGNvbXBpbGUtdGltZSEKKyNpZiBFTkFCTEVfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMCisKK3N0YXRpYyBwaWRfdAorZm9ya19qb2IoY29uc3QgY2hhciAqdXNlciwgaW50IG1haWxGZCwgQ3JvbkxpbmUgKmxpbmUsIGJvb2wgcnVuX3NlbmRtYWlsKQoreworCXN0cnVjdCBwYXNzd2QgKnBhczsKKwljb25zdCBjaGFyICpzaGVsbCwgKnByb2c7CisJc21hbGxpbnQgc3ZfbG9nbW9kZTsKKwlwaWRfdCBwaWQ7CisKKwkvKiBwcmVwYXJlIHRoaW5ncyBiZWZvcmUgdmZvcmsgKi8KKwlwYXMgPSBnZXRwd25hbSh1c2VyKTsKKwlpZiAoIXBhcykgeworCQliYl9lcnJvcl9tc2coImNhbid0IGdldCB1aWQgZm9yICVzIiwgdXNlcik7CisJCWdvdG8gZXJyOworCX0KKworCXNoZWxsID0gbGluZS0+Y2xfc2hlbGwgPyBsaW5lLT5jbF9zaGVsbCA6IERFRkFVTFRfU0hFTEw7CisJcHJvZyA9IHJ1bl9zZW5kbWFpbCA/IFNFTkRNQUlMIDogc2hlbGw7CisKKwlzZXRfZW52X3ZhcnMocGFzLCBzaGVsbCk7CisKKwlzdl9sb2dtb2RlID0gbG9nbW9kZTsKKwlwaWQgPSB2Zm9yaygpOworCWlmIChwaWQgPT0gMCkgeworCQkvKiBDSElMRCAqLworCQkvKiBpbml0Z3JvdXBzLCBzZXRnaWQsIHNldHVpZCwgYW5kIGNoZGlyIHRvIGhvbWUgb3IgQ1JPTl9ESVIgKi8KKwkJY2hhbmdlX3VzZXIocGFzKTsKKwkJbG9nNSgiY2hpbGQgcnVubmluZyAlcyIsIHByb2cpOworCQlpZiAobWFpbEZkID49IDApIHsKKwkJCXhtb3ZlX2ZkKG1haWxGZCwgcnVuX3NlbmRtYWlsID8gMCA6IDEpOworCQkJZHVwMigxLCAyKTsKKwkJfQorCQkvKiBjcm9uZCAzLjBwbDEtMTAwIHB1dHMgdGFza3MgaW4gc2VwYXJhdGUgcHJvY2VzcyBncm91cHMgKi8KKwkJYmJfc2V0cGdycCgpOworCQlpZiAoIXJ1bl9zZW5kbWFpbCkKKwkJCWV4ZWNscChwcm9nLCBwcm9nLCAiLWMiLCBsaW5lLT5jbF9jbWQsIChjaGFyICopIE5VTEwpOworCQllbHNlCisJCQlleGVjbHAocHJvZywgcHJvZywgU0VORE1BSUxfQVJHUywgKGNoYXIgKikgTlVMTCk7CisJCS8qCisJCSAqIEkgd2FudCB0aGlzIGVycm9yIG1lc3NhZ2Ugb24gc3RkZXJyIHRvbywKKwkJICogZXZlbiBpZiBvdGhlciBtZXNzYWdlcyBnbyBvbmx5IHRvIHN5c2xvZzoKKwkJICovCisJCWxvZ21vZGUgfD0gTE9HTU9ERV9TVERJTzsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGV4ZWN1dGUgJyVzJyBmb3IgdXNlciAlcyIsIHByb2csIHVzZXIpOworCX0KKwlsb2dtb2RlID0gc3ZfbG9nbW9kZTsKKworCWlmIChwaWQgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2coInZmb3JrIik7CisgZXJyOgorCQlwaWQgPSAwOworCX0gLyogZWxzZTogUEFSRU5ULCBGT1JLIFNVQ0NFU1MgKi8KKworCS8qCisJICogQ2xvc2UgdGhlIG1haWwgZmlsZSBkZXNjcmlwdG9yLi4gd2UgY2FuJ3QganVzdCBsZWF2ZSBpdCBvcGVuIGluCisJICogYSBzdHJ1Y3R1cmUsIGNsb3NpbmcgaXQgbGF0ZXIsIGJlY2F1c2Ugd2UgbWlnaHQgcnVuIG91dCBvZiBkZXNjcmlwdG9ycworCSAqLworCWlmIChtYWlsRmQgPj0gMCkgeworCQljbG9zZShtYWlsRmQpOworCX0KKwlyZXR1cm4gcGlkOworfQorCitzdGF0aWMgdm9pZCBzdGFydF9vbmVfam9iKGNvbnN0IGNoYXIgKnVzZXIsIENyb25MaW5lICpsaW5lKQoreworCWNoYXIgbWFpbEZpbGVbMTI4XTsKKwlpbnQgbWFpbEZkID0gLTE7CisKKwlsaW5lLT5jbF9waWQgPSAwOworCWxpbmUtPmNsX2VtcHR5X21haWxfc2l6ZSA9IDA7CisKKwlpZiAobGluZS0+Y2xfbWFpbHRvKSB7CisJCS8qIE9wZW4gbWFpbCBmaWxlIChvd25lciBpcyByb290IHNvIG5vYm9keSBjYW4gc2NyZXcgd2l0aCBpdCkgKi8KKwkJc25wcmludGYobWFpbEZpbGUsIHNpemVvZihtYWlsRmlsZSksICIlcy9jcm9uLiVzLiVkIiwgQ1JPTl9ESVIsIHVzZXIsIGdldHBpZCgpKTsKKwkJbWFpbEZkID0gb3BlbihtYWlsRmlsZSwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX1dST05MWSB8IE9fRVhDTCB8IE9fQVBQRU5ELCAwNjAwKTsKKworCQlpZiAobWFpbEZkID49IDApIHsKKwkJCWZkcHJpbnRmKG1haWxGZCwgIlRvOiAlc1xuU3ViamVjdDogY3JvbjogJXNcblxuIiwgbGluZS0+Y2xfbWFpbHRvLAorCQkJCWxpbmUtPmNsX2NtZCk7CisJCQlsaW5lLT5jbF9lbXB0eV9tYWlsX3NpemUgPSBsc2VlayhtYWlsRmQsIDAsIFNFRUtfQ1VSKTsKKwkJfSBlbHNlIHsKKwkJCWJiX2Vycm9yX21zZygiY2FuJ3QgY3JlYXRlIG1haWwgZmlsZSAlcyBmb3IgdXNlciAlcywgIgorCQkJCQkiZGlzY2FyZGluZyBvdXRwdXQiLCBtYWlsRmlsZSwgdXNlcik7CisJCX0KKwl9CisKKwlsaW5lLT5jbF9waWQgPSBmb3JrX2pvYih1c2VyLCBtYWlsRmQsIGxpbmUsIC8qc2VuZG1haWw/Ki8gMCk7CisJaWYgKG1haWxGZCA+PSAwKSB7CisJCWlmIChsaW5lLT5jbF9waWQgPD0gMCkgeworCQkJdW5saW5rKG1haWxGaWxlKTsKKwkJfSBlbHNlIHsKKwkJCS8qIHJlbmFtZSBtYWlsLWZpbGUgYmFzZWQgb24gcGlkIG9mIHByb2Nlc3MgKi8KKwkJCWNoYXIgKm1haWxGaWxlMiA9IHhhc3ByaW50ZigiJXMvY3Jvbi4lcy4lZCIsIENST05fRElSLCB1c2VyLCAoaW50KWxpbmUtPmNsX3BpZCk7CisJCQlyZW5hbWUobWFpbEZpbGUsIG1haWxGaWxlMik7IC8vIFRPRE86IHhyZW5hbWU/CisJCQlmcmVlKG1haWxGaWxlMik7CisJCX0KKwl9Cit9CisKKy8qCisgKiBwcm9jZXNzX2ZpbmlzaGVkX2pvYiAtIGNhbGxlZCB3aGVuIGpvYiB0ZXJtaW5hdGVzIGFuZCB3aGVuIG1haWwgdGVybWluYXRlcworICovCitzdGF0aWMgdm9pZCBwcm9jZXNzX2ZpbmlzaGVkX2pvYihjb25zdCBjaGFyICp1c2VyLCBDcm9uTGluZSAqbGluZSkKK3sKKwlwaWRfdCBwaWQ7CisJaW50IG1haWxGZDsKKwljaGFyIG1haWxGaWxlWzEyOF07CisJc3RydWN0IHN0YXQgc2J1ZjsKKworCXBpZCA9IGxpbmUtPmNsX3BpZDsKKwlsaW5lLT5jbF9waWQgPSAwOworCWlmIChwaWQgPD0gMCkgeworCQkvKiBObyBqb2IgKi8KKwkJcmV0dXJuOworCX0KKwlpZiAobGluZS0+Y2xfZW1wdHlfbWFpbF9zaXplIDw9IDApIHsKKwkJLyogRW5kIG9mIGpvYiBhbmQgbm8gbWFpbCBmaWxlLCBvciBlbmQgb2Ygc2VuZG1haWwgam9iICovCisJCXJldHVybjsKKwl9CisKKwkvKgorCSAqIEVuZCBvZiBwcmltYXJ5IGpvYiAtIGNoZWNrIGZvciBtYWlsIGZpbGUuCisJICogSWYgc2l6ZSBoYXMgY2hhbmdlZCBhbmQgdGhlIGZpbGUgaXMgc3RpbGwgdmFsaWQsIHdlIHNlbmQgaXQuCisJICovCisJc25wcmludGYobWFpbEZpbGUsIHNpemVvZihtYWlsRmlsZSksICIlcy9jcm9uLiVzLiVkIiwgQ1JPTl9ESVIsIHVzZXIsIChpbnQpcGlkKTsKKwltYWlsRmQgPSBvcGVuKG1haWxGaWxlLCBPX1JET05MWSk7CisJdW5saW5rKG1haWxGaWxlKTsKKwlpZiAobWFpbEZkIDwgMCkgeworCQlyZXR1cm47CisJfQorCisJaWYgKGZzdGF0KG1haWxGZCwgJnNidWYpIDwgMAorCSB8fCBzYnVmLnN0X3VpZCAhPSBEQUVNT05fVUlECisJIHx8IHNidWYuc3RfbmxpbmsgIT0gMAorCSB8fCBzYnVmLnN0X3NpemUgPT0gbGluZS0+Y2xfZW1wdHlfbWFpbF9zaXplCisJIHx8ICFTX0lTUkVHKHNidWYuc3RfbW9kZSkKKwkpIHsKKwkJY2xvc2UobWFpbEZkKTsKKwkJcmV0dXJuOworCX0KKwlsaW5lLT5jbF9lbXB0eV9tYWlsX3NpemUgPSAwOworCS8qIGlmIChsaW5lLT5jbF9tYWlsdG8pIC0gYWx3YXlzIHRydWUgaWYgY2xfZW1wdHlfbWFpbF9zaXplIHdhcyBub256ZXJvICovCisJCWxpbmUtPmNsX3BpZCA9IGZvcmtfam9iKHVzZXIsIG1haWxGZCwgbGluZSwgLypzZW5kbWFpbD8qLyAxKTsKK30KKworI2Vsc2UgLyogIUVOQUJMRV9GRUFUVVJFX0NST05EX0NBTExfU0VORE1BSUwgKi8KKworc3RhdGljIHZvaWQgc3RhcnRfb25lX2pvYihjb25zdCBjaGFyICp1c2VyLCBDcm9uTGluZSAqbGluZSkKK3sKKwljb25zdCBjaGFyICpzaGVsbDsKKwlzdHJ1Y3QgcGFzc3dkICpwYXM7CisJcGlkX3QgcGlkOworCisJcGFzID0gZ2V0cHduYW0odXNlcik7CisJaWYgKCFwYXMpIHsKKwkJYmJfZXJyb3JfbXNnKCJjYW4ndCBnZXQgdWlkIGZvciAlcyIsIHVzZXIpOworCQlnb3RvIGVycjsKKwl9CisKKwkvKiBQcmVwYXJlIHRoaW5ncyBiZWZvcmUgdmZvcmsgKi8KKwlzaGVsbCA9IGxpbmUtPmNsX3NoZWxsID8gbGluZS0+Y2xfc2hlbGwgOiBERUZBVUxUX1NIRUxMOworCXNldF9lbnZfdmFycyhwYXMsIHNoZWxsKTsKKworCS8qIEZvcmsgYXMgdGhlIHVzZXIgaW4gcXVlc3Rpb24gYW5kIHJ1biBwcm9ncmFtICovCisJcGlkID0gdmZvcmsoKTsKKwlpZiAocGlkID09IDApIHsKKwkJLyogQ0hJTEQgKi8KKwkJLyogaW5pdGdyb3Vwcywgc2V0Z2lkLCBzZXR1aWQsIGFuZCBjaGRpciB0byBob21lIG9yIENST05fRElSICovCisJCWNoYW5nZV91c2VyKHBhcyk7CisJCWxvZzUoImNoaWxkIHJ1bm5pbmcgJXMiLCBzaGVsbCk7CisJCS8qIGNyb25kIDMuMHBsMS0xMDAgcHV0cyB0YXNrcyBpbiBzZXBhcmF0ZSBwcm9jZXNzIGdyb3VwcyAqLworCQliYl9zZXRwZ3JwKCk7CisJCWV4ZWNsKHNoZWxsLCBzaGVsbCwgIi1jIiwgbGluZS0+Y2xfY21kLCAoY2hhciAqKSBOVUxMKTsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGV4ZWN1dGUgJyVzJyBmb3IgdXNlciAlcyIsIHNoZWxsLCB1c2VyKTsKKwl9CisJaWYgKHBpZCA8IDApIHsKKwkJYmJfcGVycm9yX21zZygidmZvcmsiKTsKKyBlcnI6CisJCXBpZCA9IDA7CisJfQorCWxpbmUtPmNsX3BpZCA9IHBpZDsKK30KKworI2RlZmluZSBwcm9jZXNzX2ZpbmlzaGVkX2pvYih1c2VyLCBsaW5lKSAgKChsaW5lKS0+Y2xfcGlkID0gMCkKKworI2VuZGlmIC8qICFFTkFCTEVfRkVBVFVSRV9DUk9ORF9DQUxMX1NFTkRNQUlMICovCisKKy8qCisgKiBEZXRlcm1pbmUgd2hpY2ggam9icyBuZWVkIHRvIGJlIHJ1bi4gIFVuZGVyIG5vcm1hbCBjb25kaXRpb25zLCB0aGUKKyAqIHBlcmlvZCBpcyBhYm91dCBhIG1pbnV0ZSAob25lIHNjYW4pLiAgV29yc3QgY2FzZSBpdCB3aWxsIGJlIG9uZQorICogaG91ciAoNjAgc2NhbnMpLgorICovCitzdGF0aWMgdm9pZCBmbGFnX3N0YXJ0aW5nX2pvYnModGltZV90IHQxLCB0aW1lX3QgdDIpCit7CisJdGltZV90IHQ7CisKKwkvKiBGaW5kIGpvYnMgPiB0MSBhbmQgPD0gdDIgKi8KKworCWZvciAodCA9IHQxIC0gdDEgJSA2MDsgdCA8PSB0MjsgdCArPSA2MCkgeworCQlzdHJ1Y3QgdG0gKnB0bTsKKwkJQ3JvbkZpbGUgKmZpbGU7CisJCUNyb25MaW5lICpsaW5lOworCisJCWlmICh0IDw9IHQxKQorCQkJY29udGludWU7CisKKwkJcHRtID0gbG9jYWx0aW1lKCZ0KTsKKwkJZm9yIChmaWxlID0gRy5jcm9uX2ZpbGVzOyBmaWxlOyBmaWxlID0gZmlsZS0+Y2ZfbmV4dCkgeworCQkJbG9nNSgiZmlsZSAlczoiLCBmaWxlLT5jZl91c2VybmFtZSk7CisJCQlpZiAoZmlsZS0+Y2ZfZGVsZXRlZCkKKwkJCQljb250aW51ZTsKKwkJCWZvciAobGluZSA9IGZpbGUtPmNmX2xpbmVzOyBsaW5lOyBsaW5lID0gbGluZS0+Y2xfbmV4dCkgeworCQkJCWxvZzUoIiBsaW5lICVzIiwgbGluZS0+Y2xfY21kKTsKKwkJCQlpZiAobGluZS0+Y2xfTWluc1twdG0tPnRtX21pbl0KKwkJCQkgJiYgbGluZS0+Y2xfSHJzW3B0bS0+dG1faG91cl0KKwkJCQkgJiYgKGxpbmUtPmNsX0RheXNbcHRtLT50bV9tZGF5XSB8fCBsaW5lLT5jbF9Eb3dbcHRtLT50bV93ZGF5XSkKKwkJCQkgJiYgbGluZS0+Y2xfTW9uc1twdG0tPnRtX21vbl0KKwkJCQkpIHsKKwkJCQkJbG9nNSgiIGpvYjogJWQgJXMiLAorCQkJCQkJCShpbnQpbGluZS0+Y2xfcGlkLCBsaW5lLT5jbF9jbWQpOworCQkJCQlpZiAobGluZS0+Y2xfcGlkID4gMCkgeworCQkJCQkJbG9nOCgidXNlciAlczogcHJvY2VzcyBhbHJlYWR5IHJ1bm5pbmc6ICVzIiwKKwkJCQkJCQlmaWxlLT5jZl91c2VybmFtZSwgbGluZS0+Y2xfY21kKTsKKwkJCQkJfSBlbHNlIGlmIChsaW5lLT5jbF9waWQgPT0gMCkgeworCQkJCQkJbGluZS0+Y2xfcGlkID0gLTE7CisJCQkJCQlmaWxlLT5jZl93YW50c19zdGFydGluZyA9IDE7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0X2pvYnModm9pZCkKK3sKKwlDcm9uRmlsZSAqZmlsZTsKKwlDcm9uTGluZSAqbGluZTsKKworCWZvciAoZmlsZSA9IEcuY3Jvbl9maWxlczsgZmlsZTsgZmlsZSA9IGZpbGUtPmNmX25leHQpIHsKKwkJaWYgKCFmaWxlLT5jZl93YW50c19zdGFydGluZykKKwkJCWNvbnRpbnVlOworCisJCWZpbGUtPmNmX3dhbnRzX3N0YXJ0aW5nID0gMDsKKwkJZm9yIChsaW5lID0gZmlsZS0+Y2ZfbGluZXM7IGxpbmU7IGxpbmUgPSBsaW5lLT5jbF9uZXh0KSB7CisJCQlwaWRfdCBwaWQ7CisJCQlpZiAobGluZS0+Y2xfcGlkID49IDApCisJCQkJY29udGludWU7CisKKwkJCXN0YXJ0X29uZV9qb2IoZmlsZS0+Y2ZfdXNlcm5hbWUsIGxpbmUpOworCQkJcGlkID0gbGluZS0+Y2xfcGlkOworCQkJbG9nOCgiVVNFUiAlcyBwaWQgJTNkIGNtZCAlcyIsCisJCQkJZmlsZS0+Y2ZfdXNlcm5hbWUsIChpbnQpcGlkLCBsaW5lLT5jbF9jbWQpOworCQkJaWYgKHBpZCA8IDApIHsKKwkJCQlmaWxlLT5jZl93YW50c19zdGFydGluZyA9IDE7CisJCQl9CisJCQlpZiAocGlkID4gMCkgeworCQkJCWZpbGUtPmNmX2hhc19ydW5uaW5nID0gMTsKKwkJCX0KKwkJfQorCX0KK30KKworLyoKKyAqIENoZWNrIGZvciBqb2IgY29tcGxldGlvbiwgcmV0dXJuIG51bWJlciBvZiBqb2JzIHN0aWxsIHJ1bm5pbmcgYWZ0ZXIKKyAqIGFsbCBkb25lLgorICovCitzdGF0aWMgaW50IGNoZWNrX2NvbXBsZXRpb25zKHZvaWQpCit7CisJQ3JvbkZpbGUgKmZpbGU7CisJQ3JvbkxpbmUgKmxpbmU7CisJaW50IG51bV9zdGlsbF9ydW5uaW5nID0gMDsKKworCWZvciAoZmlsZSA9IEcuY3Jvbl9maWxlczsgZmlsZTsgZmlsZSA9IGZpbGUtPmNmX25leHQpIHsKKwkJaWYgKCFmaWxlLT5jZl9oYXNfcnVubmluZykKKwkJCWNvbnRpbnVlOworCisJCWZpbGUtPmNmX2hhc19ydW5uaW5nID0gMDsKKwkJZm9yIChsaW5lID0gZmlsZS0+Y2ZfbGluZXM7IGxpbmU7IGxpbmUgPSBsaW5lLT5jbF9uZXh0KSB7CisJCQlpbnQgcjsKKworCQkJaWYgKGxpbmUtPmNsX3BpZCA8PSAwKQorCQkJCWNvbnRpbnVlOworCisJCQlyID0gd2FpdHBpZChsaW5lLT5jbF9waWQsIE5VTEwsIFdOT0hBTkcpOworCQkJaWYgKHIgPCAwIHx8IHIgPT0gbGluZS0+Y2xfcGlkKSB7CisJCQkJcHJvY2Vzc19maW5pc2hlZF9qb2IoZmlsZS0+Y2ZfdXNlcm5hbWUsIGxpbmUpOworCQkJCWlmIChsaW5lLT5jbF9waWQgPT0gMCkgeworCQkJCQkvKiBzZW5kbWFpbCB3YXMgbm90IHN0YXJ0ZWQgZm9yIGl0ICovCisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvKiBlbHNlOiBzZW5kbWFpbCB3YXMgc3RhcnRlZCwgam9iIGlzIHN0aWxsIHJ1bm5pbmcsIGZhbGwgdGhydSAqLworCQkJfQorCQkJLyogZWxzZTogciA9PSAwOiAicHJvY2VzcyBpcyBzdGlsbCBydW5uaW5nIiAqLworCQkJZmlsZS0+Y2ZfaGFzX3J1bm5pbmcgPSAxOworCQl9CisvL0ZJWE1FOiBpZiAhZmlsZS0+Y2ZfaGFzX3J1bm5pbmcgJiYgZmlsZS0+ZGVsZXRlZDogZGVsZXRlIGl0IQorLy9vdGhlcndpc2UgZGVsZXRlZCBlbnRyaWVzIHdpbGwgc3RheSBmb3JldmVyLCByaWdodD8KKwkJbnVtX3N0aWxsX3J1bm5pbmcgKz0gZmlsZS0+Y2ZfaGFzX3J1bm5pbmc7CisJfQorCXJldHVybiBudW1fc3RpbGxfcnVubmluZzsKK30KKworc3RhdGljIHZvaWQgcmVvcGVuX2xvZ2ZpbGVfdG9fc3RkZXJyKHZvaWQpCit7CisJaWYgKEcubG9nX2ZpbGVuYW1lKSB7CisJCWludCBsb2dmZCA9IG9wZW5fb3Jfd2FybihHLmxvZ19maWxlbmFtZSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19BUFBFTkQpOworCQlpZiAobG9nZmQgPj0gMCkKKwkJCXhtb3ZlX2ZkKGxvZ2ZkLCBTVERFUlJfRklMRU5PKTsKKwl9Cit9CisKK2ludCBjcm9uZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY3JvbmRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXRpbWVfdCB0MjsKKwl1bnNpZ25lZCByZXNjYW47CisJdW5zaWduZWQgc2xlZXBfdGltZTsKKwl1bnNpZ25lZCBvcHRzOworCisJSU5JVF9HKCk7CisKKwkvKiAiLWIgYWZ0ZXIgLWYgaXMgaWdub3JlZCIsIGFuZCBzbyBvbiBmb3IgZXZlcnkgcGFpciBhLWIgKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICJmLWI6Yi1mOlMtTDpMLVMiIElGX0ZFQVRVUkVfQ1JPTkRfRCgiOmQtbCIpCisJCQkvKiAtbCBhbmQgLWQgaGF2ZSBudW1lcmljIHBhcmFtICovCisJCQkiOmwrIiBJRl9GRUFUVVJFX0NST05EX0QoIjpkKyIpOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAibDpMOmZiU2M6IiBJRl9GRUFUVVJFX0NST05EX0QoImQ6IiksCisJCQkmRy5sb2dfbGV2ZWwsICZHLmxvZ19maWxlbmFtZSwgJkcuY3JvbnRhYl9kaXJfbmFtZQorCQkJSUZfRkVBVFVSRV9DUk9ORF9EKCwmRy5sb2dfbGV2ZWwpKTsKKwkvKiBib3RoIC1kIE4gYW5kIC1sIE4gc2V0IHRoZSBzYW1lIHZhcmlhYmxlOiBHLmxvZ19sZXZlbCAqLworCisJaWYgKCEob3B0cyAmIE9QVF9mKSkgeworCQkvKiBjbG9zZSBzdGRpbiwgc3Rkb3V0LCBzdGRlcnIuCisJCSAqIGNsb3NlIHVudXNlZCBkZXNjcmlwdG9ycyAtIGRvbid0IG5lZWQgdGhlbS4gKi8KKwkJYmJfZGFlbW9uaXplX29yX3JleGVjKERBRU1PTl9DTE9TRV9FWFRSQV9GRFMsIGFyZ3YpOworCX0KKworCWlmICghKG9wdHMgJiBPUFRfZCkgJiYgRy5sb2dfZmlsZW5hbWUgPT0gTlVMTCkgeworCQkvKiBsb2dnaW5nIHRvIHN5c2xvZyAqLworCQlvcGVubG9nKGFwcGxldF9uYW1lLCBMT0dfQ09OUyB8IExPR19QSUQsIExPR19DUk9OKTsKKwkJbG9nbW9kZSA9IExPR01PREVfU1lTTE9HOworCX0KKworCS8vc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7IC8qID8gb3JpZ2luYWwgY3JvbmQgZGllcyBvbiBIVVAuLi4gKi8KKworCXJlb3Blbl9sb2dmaWxlX3RvX3N0ZGVycigpOworCXhjaGRpcihHLmNyb250YWJfZGlyX25hbWUpOworCWxvZzgoImNyb25kIChidXN5Ym94ICJCQl9WRVIiKSBzdGFydGVkLCBsb2cgbGV2ZWwgJWQiLCBHLmxvZ19sZXZlbCk7CisJcmVzY2FuX2Nyb250YWJfZGlyKCk7CisJd3JpdGVfcGlkZmlsZShDT05GSUdfUElEX0ZJTEVfUEFUSCAiL2Nyb25kLnBpZCIpOworCisJLyogTWFpbiBsb29wICovCisJdDIgPSB0aW1lKE5VTEwpOworCXJlc2NhbiA9IDYwOworCXNsZWVwX3RpbWUgPSA2MDsKKwlmb3IgKDs7KSB7CisJCXN0cnVjdCBzdGF0IHNidWY7CisJCXRpbWVfdCB0MTsKKwkJbG9uZyBkdDsKKworCQkvKiBTeW5jaHJvbml6ZSB0byAxIG1pbnV0ZSwgbWluaW11bSAxIHNlY29uZCAqLworCQl0MSA9IHQyOworCQlzbGVlcChzbGVlcF90aW1lIC0gKHRpbWUoTlVMTCkgJSBzbGVlcF90aW1lKSk7CisJCXQyID0gdGltZShOVUxMKTsKKwkJZHQgPSAobG9uZyl0MiAtIChsb25nKXQxOworCisJCXJlb3Blbl9sb2dmaWxlX3RvX3N0ZGVycigpOworCisJCS8qCisJCSAqIFRoZSBmaWxlICdjcm9uLnVwZGF0ZScgaXMgY2hlY2tlZCB0byBkZXRlcm1pbmUgbmV3IGNyb24KKwkJICogam9icy4gIFRoZSBkaXJlY3RvcnkgaXMgcmVzY2FubmVkIG9uY2UgYW4gaG91ciB0byBkZWFsCisJCSAqIHdpdGggYW55IHNjcmV3dXBzLgorCQkgKgorCQkgKiBDaGVjayBmb3IgdGltZSBqdW1wLiAgRGlzcGFyaXRpZXMgb3ZlciBhbiBob3VyIGVpdGhlciB3YXkKKwkJICogcmVzdWx0IGluIHJlc3luY2hyb25pemF0aW9uLiAgQSBuZWdhdGl2ZSBkaXNwYXJpdHkKKwkJICogbGVzcyB0aGFuIGFuIGhvdXIgY2F1c2VzIHVzIHRvIGVmZmVjdGl2ZWx5IHNsZWVwIHVudGlsIHdlCisJCSAqIG1hdGNoIHRoZSBvcmlnaW5hbCB0aW1lIChpLmUuIG5vIHJlLWV4ZWN1dGlvbiBvZiBqb2JzIHRoYXQKKwkJICogaGF2ZSBqdXN0IGJlZW4gcnVuKS4gIEEgcG9zaXRpdmUgZGlzcGFyaXR5IGxlc3MgdGhhbgorCQkgKiBhbiBob3VyIGNhdXNlcyBpbnRlcm1lZGlhdGUgam9icyB0byBiZSBydW4sIGJ1dCBvbmx5IG9uY2UKKwkJICogaW4gdGhlIHdvcnN0IGNhc2UuCisJCSAqCisJCSAqIFdoZW4gcnVubmluZyBqb2JzLCB0aGUgaW5lcXVhbGl0eSB1c2VkIGlzIGdyZWF0ZXIgYnV0IG5vdAorCQkgKiBlcXVhbCB0byB0MSwgYW5kIGxlc3MgdGhlbiBvciBlcXVhbCB0byB0Mi4KKwkJICovCisJCWlmIChzdGF0KEcuY3JvbnRhYl9kaXJfbmFtZSwgJnNidWYpICE9IDApCisJCQlzYnVmLnN0X210aW1lID0gMDsgLyogZm9yY2UgdXBkYXRlIChvbmNlKSBpZiBkaXIgd2FzIGRlbGV0ZWQgKi8KKwkJaWYgKEcuY3JvbnRhYl9kaXJfbXRpbWUgIT0gc2J1Zi5zdF9tdGltZSkgeworCQkJRy5jcm9udGFiX2Rpcl9tdGltZSA9IHNidWYuc3RfbXRpbWU7CisJCQlyZXNjYW4gPSAxOworCQl9CisJCWlmICgtLXJlc2NhbiA9PSAwKSB7CisJCQlyZXNjYW4gPSA2MDsKKwkJCXJlc2Nhbl9jcm9udGFiX2RpcigpOworCQl9CisJCXByb2Nlc3NfY3Jvbl91cGRhdGVfZmlsZSgpOworCQlsb2c1KCJ3YWtldXAgZHQ9JWxkIiwgZHQpOworCQlpZiAoZHQgPCAtNjAgKiA2MCB8fCBkdCA+IDYwICogNjApIHsKKwkJCWJiX2Vycm9yX21zZygidGltZSBkaXNwYXJpdHkgb2YgJWxkIG1pbnV0ZXMgZGV0ZWN0ZWQiLCBkdCAvIDYwKTsKKwkJCS8qIGFuZCB3ZSBkbyBub3QgcnVuIGFueSBqb2JzIGluIHRoaXMgY2FzZSAqLworCQl9IGVsc2UgaWYgKGR0ID4gMCkgeworCQkJLyogVXN1YWwgY2FzZTogdGltZSBhZHZhbmNlcyBmb3J3YXJkLCBhcyBleHBlY3RlZCAqLworCQkJZmxhZ19zdGFydGluZ19qb2JzKHQxLCB0Mik7CisJCQlzdGFydF9qb2JzKCk7CisJCQlzbGVlcF90aW1lID0gNjA7CisJCQlpZiAoY2hlY2tfY29tcGxldGlvbnMoKSA+IDApIHsKKwkJCQkvKiBzb21lIGpvYnMgYXJlIHN0aWxsIHJ1bm5pbmcgKi8KKwkJCQlzbGVlcF90aW1lID0gMTA7CisJCQl9CisJCX0KKwkJLyogZWxzZTogdGltZSBqdW1wZWQgYmFjaywgZG8gbm90IHJ1biBhbnkgam9icyAqLworCX0gLyogZm9yICg7OykgKi8KKworCXJldHVybiAwOyAvKiBub3QgcmVhY2hlZCAqLworfQpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL2Nyb250YWIuYyBiL21pc2N1dGlscy9jcm9udGFiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVjNjYyMwotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9jcm9udGFiLmMKQEAgLTAsMCArMSwxOTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENST05UQUIKKyAqCisgKiB1c3VhbGx5IHNldHVpZCByb290LCAtYyBvcHRpb24gb25seSB3b3JrcyBpZiBnZXR1aWQoKSA9PSBnZXRldWlkKCkKKyAqCisgKiBDb3B5cmlnaHQgMTk5NCBNYXR0aGV3IERpbGxvbiAoZGlsbG9uQGFwb2xsby53ZXN0Lm9pYy5jb20pCisgKiBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+IChDKSAyMDAyCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgY3JvbnRhYl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jIERJUl0gWy11IFVTRVJdIFstbGVyXXxbRklMRV0iCisvL3VzYWdlOiNkZWZpbmUgY3JvbnRhYl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgktYwlDcm9udGFiIGRpcmVjdG9yeSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUJVXNlciIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGlzdCBjcm9udGFiIgorLy91c2FnZTogICAgICJcbgktZQlFZGl0IGNyb250YWIiCisvL3VzYWdlOiAgICAgIlxuCS1yCURlbGV0ZSBjcm9udGFiIgorLy91c2FnZTogICAgICJcbglGSUxFCVJlcGxhY2UgY3JvbnRhYiBieSBGSUxFICgnLSc6IHN0ZGluKSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgQ1JPTlRBQlMgICAgICAgIENPTkZJR19GRUFUVVJFX0NST05EX0RJUiAiL2Nyb250YWJzIgorI2lmbmRlZiBDUk9OVVBEQVRFCisjZGVmaW5lIENST05VUERBVEUgICAgICAiY3Jvbi51cGRhdGUiCisjZW5kaWYKKworc3RhdGljIHZvaWQgZWRpdF9maWxlKGNvbnN0IHN0cnVjdCBwYXNzd2QgKnBhcywgY29uc3QgY2hhciAqZmlsZSkKK3sKKwljb25zdCBjaGFyICpwdHI7CisJcGlkX3QgcGlkOworCisJcGlkID0geHZmb3JrKCk7CisJaWYgKHBpZCkgeyAvKiBwYXJlbnQgKi8KKwkJd2FpdDRwaWQocGlkKTsKKwkJcmV0dXJuOworCX0KKworCS8qIENISUxEIC0gY2hhbmdlIHVzZXIgYW5kIHJ1biBlZGl0b3IgKi8KKwkvKiBpbml0Z3JvdXBzLCBzZXRnaWQsIHNldHVpZCAqLworCWNoYW5nZV9pZGVudGl0eShwYXMpOworCXNldHVwX2Vudmlyb25tZW50KHBhcy0+cHdfc2hlbGwsCisJCQlTRVRVUF9FTlZfQ0hBTkdFRU5WIHwgU0VUVVBfRU5WX1RPX1RNUCwKKwkJCXBhcyk7CisJcHRyID0gZ2V0ZW52KCJWSVNVQUwiKTsKKwlpZiAoIXB0cikgeworCQlwdHIgPSBnZXRlbnYoIkVESVRPUiIpOworCQlpZiAoIXB0cikKKwkJCXB0ciA9ICJ2aSI7CisJfQorCisJQkJfRVhFQ0xQKHB0ciwgcHRyLCBmaWxlLCBOVUxMKTsKKwliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGV4ZWN1dGUgJyVzJyIsIHB0cik7Cit9CisKK2ludCBjcm9udGFiX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjcm9udGFiX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBzdHJ1Y3QgcGFzc3dkICpwYXM7CisJY29uc3QgY2hhciAqY3JvbnRhYl9kaXIgPSBDUk9OVEFCUzsKKwljaGFyICp0bXBfZm5hbWU7CisJY2hhciAqbmV3X2ZuYW1lOworCWNoYXIgKnVzZXJfbmFtZTsgIC8qIC11IFVTRVIgKi8KKwlpbnQgZmQ7CisJaW50IHNyY19mZDsKKwlpbnQgb3B0X2xlcjsKKworCS8qIGZpbGUgW29wdHNdICAgICBSZXBsYWNlIGNyb250YWIgZnJvbSBmaWxlCisJICogLSBbb3B0c10gICAgICAgIFJlcGxhY2UgY3JvbnRhYiBmcm9tIHN0ZGluCisJICogLXUgdXNlciAgICAgICAgIFVzZXIKKwkgKiAtYyBkaXIgICAgICAgICAgQ3JvbnRhYiBkaXJlY3RvcnkKKwkgKiAtbCAgICAgICAgICAgICAgTGlzdCBjcm9udGFiIGZvciB1c2VyCisJICogLWUgICAgICAgICAgICAgIEVkaXQgY3JvbnRhYiBmb3IgdXNlcgorCSAqIC1yICAgICAgICAgICAgICBEZWxldGUgY3JvbnRhYiBmb3IgdXNlcgorCSAqIGJib3ggYWxzbyBzdXBwb3J0cyAtZCA9PSAtciwgYnV0IG1vc3Qgb3RoZXIgY3JvbnRhYgorCSAqIGltcGxlbWVudGF0aW9ucyBkbyBub3QuIERlcHJlY2F0ZWQuCisJICovCisJZW51bSB7CisJCU9QVF91ID0gKDEgPDwgMCksCisJCU9QVF9jID0gKDEgPDwgMSksCisJCU9QVF9sID0gKDEgPDwgMiksCisJCU9QVF9lID0gKDEgPDwgMyksCisJCU9QVF9yID0gKDEgPDwgNCksCisJCU9QVF9sZXIgPSBPUFRfbCArIE9QVF9lICsgT1BUX3IsCisJfTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj8xOmRyIjsgLyogbWF4IG9uZSBhcmd1bWVudDsgLWQgaW1wbGllcyAtciAqLworCW9wdF9sZXIgPSBnZXRvcHQzMihhcmd2LCAidTpjOmxlcmQiLCAmdXNlcl9uYW1lLCAmY3JvbnRhYl9kaXIpOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKHNhbml0aXplX2Vudl9pZl9zdWlkKCkpIHsgLyogQ2xlYXJzIGRhbmdlcm91cyBzdHVmZiwgc2V0cyBQQVRIICovCisJCS8qIFJ1biBieSBub24tcm9vdCAqLworCQlpZiAob3B0X2xlciAmIChPUFRfdXxPUFRfYykpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfeW91X211c3RfYmVfcm9vdCk7CisJfQorCisJaWYgKG9wdF9sZXIgJiBPUFRfdSkgeworCQlwYXMgPSB4Z2V0cHduYW0odXNlcl9uYW1lKTsKKwl9IGVsc2UgeworCQlwYXMgPSB4Z2V0cHd1aWQoZ2V0dWlkKCkpOworCX0KKworI2RlZmluZSB1c2VyX25hbWUgRE9OVF9VU0VfTUVfQkVZT05EX1RISVNfUE9JTlQKKworCS8qIEZyb20gbm93IG9uLCBrZWVwIG9ubHkgLWwsIC1lLCAtciBiaXRzICovCisJb3B0X2xlciAmPSBPUFRfbGVyOworCWlmICgob3B0X2xlciAtIDEpICYgb3B0X2xlcikgLyogbW9yZSB0aGFuIG9uZSBiaXQgc2V0PyAqLworCQliYl9zaG93X3VzYWdlKCk7CisKKwkvKiBSZWFkIHJlcGxhY2VtZW50IGZpbGUgdW5kZXIgdXNlcidzIFVJRC9HSUQvZ3JvdXAgdmVjdG9yICovCisJc3JjX2ZkID0gU1RESU5fRklMRU5POworCWlmICghb3B0X2xlcikgeyAvKiBSZXBsYWNlPyAqLworCQlpZiAoIWFyZ3ZbMF0pCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWlmIChOT1RfTE9ORV9EQVNIKGFyZ3ZbMF0pKSB7CisJCQlzcmNfZmQgPSB4b3Blbl9hc191aWRfZ2lkKGFyZ3ZbMF0sIE9fUkRPTkxZLCBwYXMtPnB3X3VpZCwgcGFzLT5wd19naWQpOworCQl9CisJfQorCisJLyogY2QgdG8gb3VyIGNyb250YWIgZGlyZWN0b3J5ICovCisJeGNoZGlyKGNyb250YWJfZGlyKTsKKworCXRtcF9mbmFtZSA9IE5VTEw7CisKKwkvKiBIYW5kbGUgcmVxdWVzdGVkIG9wZXJhdGlvbiAqLworCXN3aXRjaCAob3B0X2xlcikgeworCisJZGVmYXVsdDogLyogY2FzZSBPUFRfcjogRGVsZXRlICovCisJCXVubGluayhwYXMtPnB3X25hbWUpOworCQlicmVhazsKKworCWNhc2UgT1BUX2w6IC8qIExpc3QgKi8KKwkJeworCQkJY2hhciAqYXJnc1syXSA9IHsgcGFzLT5wd19uYW1lLCBOVUxMIH07CisJCQlyZXR1cm4gYmJfY2F0KGFyZ3MpOworCQkJLyogbGlzdCBleGl0cywKKwkJCSAqIHRoZSByZXN0IGdvIHBsYXkgd2l0aCBjcm9uIHVwZGF0ZSBmaWxlICovCisJCX0KKworCWNhc2UgT1BUX2U6IC8qIEVkaXQgKi8KKwkJdG1wX2ZuYW1lID0geGFzcHJpbnRmKCIlcy4ldSIsIGNyb250YWJfZGlyLCAodW5zaWduZWQpZ2V0cGlkKCkpOworCQkvKiBObyBPX0VYQ0w6IHdlIGRvbid0IHdhbnQgdG8gYmUgc3R1Y2sgaWYgZWFybGllciBjcm9udGFicworCQkgKiB3ZXJlIGtpbGxlZCwgbGVhdmluZyBzdGFsZSB0ZW1wIGZpbGUgYmVoaW5kICovCisJCXNyY19mZCA9IHhvcGVuMyh0bXBfZm5hbWUsIE9fUkRXUnxPX0NSRUFUfE9fVFJVTkMsIDA2MDApOworCQlmY2hvd24oc3JjX2ZkLCBwYXMtPnB3X3VpZCwgcGFzLT5wd19naWQpOworCQlmZCA9IG9wZW4ocGFzLT5wd19uYW1lLCBPX1JET05MWSk7CisJCWlmIChmZCA+PSAwKSB7CisJCQliYl9jb3B5ZmRfZW9mKGZkLCBzcmNfZmQpOworCQkJY2xvc2UoZmQpOworCQkJeGxzZWVrKHNyY19mZCwgMCwgU0VFS19TRVQpOworCQl9CisJCWNsb3NlX29uX2V4ZWNfb24oc3JjX2ZkKTsgLyogZG9uJ3Qgd2FudCBlZGl0b3IgdG8gc2VlIHRoaXMgZmQgKi8KKwkJZWRpdF9maWxlKHBhcywgdG1wX2ZuYW1lKTsKKwkJLyogZmFsbCB0aHJvdWdoICovCisKKwljYXNlIDA6IC8qIFJlcGxhY2UgKG5vIC1sLCAtZSwgb3IgLXIgd2VyZSBnaXZlbikgKi8KKwkJbmV3X2ZuYW1lID0geGFzcHJpbnRmKCIlcy5uZXciLCBwYXMtPnB3X25hbWUpOworCQlmZCA9IG9wZW4obmV3X2ZuYW1lLCBPX1dST05MWXxPX0NSRUFUfE9fVFJVTkN8T19BUFBFTkQsIDA2MDApOworCQlpZiAoZmQgPj0gMCkgeworCQkJYmJfY29weWZkX2VvZihzcmNfZmQsIGZkKTsKKwkJCWNsb3NlKGZkKTsKKwkJCXhyZW5hbWUobmV3X2ZuYW1lLCBwYXMtPnB3X25hbWUpOworCQl9IGVsc2UgeworCQkJYmJfZXJyb3JfbXNnKCJjYW4ndCBjcmVhdGUgJXMvJXMiLAorCQkJCQljcm9udGFiX2RpciwgbmV3X2ZuYW1lKTsKKwkJfQorCQlpZiAodG1wX2ZuYW1lKQorCQkJdW5saW5rKHRtcF9mbmFtZSk7CisJCS8qZnJlZSh0bXBfZm5hbWUpOyovCisJCS8qZnJlZShuZXdfZm5hbWUpOyovCisJfSAvKiBzd2l0Y2ggKi8KKworCS8qIEJ1bXAgbm90aWZpY2F0aW9uIGZpbGUuICBIYW5kbGUgd2luZG93IHdoZXJlIGNyb25kIHBpY2tzIGZpbGUgdXAKKwkgKiBiZWZvcmUgd2UgY2FuIHdyaXRlIG91ciBlbnRyeSBvdXQuCisJICovCisJd2hpbGUgKChmZCA9IG9wZW4oQ1JPTlVQREFURSwgT19XUk9OTFl8T19DUkVBVHxPX0FQUEVORCwgMDYwMCkpID49IDApIHsKKwkJc3RydWN0IHN0YXQgc3Q7CisKKwkJZmRwcmludGYoZmQsICIlc1xuIiwgcGFzLT5wd19uYW1lKTsKKwkJaWYgKGZzdGF0KGZkLCAmc3QpICE9IDAgfHwgc3Quc3RfbmxpbmsgIT0gMCkgeworCQkJLypjbG9zZShmZCk7Ki8KKwkJCWJyZWFrOworCQl9CisJCS8qIHN0LnN0X25saW5rID09IDA6CisJCSAqIGZpbGUgd2FzIGRlbGV0ZWQsIG1heWJlIGNyb25kIG1pc3NlZCBvdXIgbm90aWZpY2F0aW9uICovCisJCWNsb3NlKGZkKTsKKwkJLyogbG9vcCAqLworCX0KKwlpZiAoZmQgPCAwKSB7CisJCWJiX2Vycm9yX21zZygiY2FuJ3QgYXBwZW5kIHRvICVzLyVzIiwKKwkJCQljcm9udGFiX2RpciwgQ1JPTlVQREFURSk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL2RjLmMgYi9taXNjdXRpbHMvZGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yzc0MTcyCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL2RjLmMKQEAgLTAsMCArMSwyODQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bWF0aC5oPgorCisvL3VzYWdlOiNkZWZpbmUgZGNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkVYUFJFU1NJT04uLi4iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGRjX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVGlueSBSUE4gY2FsY3VsYXRvci4gT3BlcmF0aW9uczpcbiIKKy8vdXNhZ2U6ICAgICAgICIrLCBhZGQsIC0sIHN1YiwgKiwgbXVsLCAvLCBkaXYsICUsIG1vZCwgIklGX0ZFQVRVUkVfRENfTElCTSgiKiosIGV4cCwgIikiYW5kLCBvciwgbm90LCB4b3IsXG4iCisvL3VzYWdlOiAgICAgICAicCAtIHByaW50IHRvcCBvZiB0aGUgc3RhY2sgKHdpdGhvdXQgcG9wcGluZyksXG4iCisvL3VzYWdlOiAgICAgICAiZiAtIHByaW50IGVudGlyZSBzdGFjayxcbiIKKy8vdXNhZ2U6ICAgICAgICJvIC0gcG9wIHRoZSB2YWx1ZSBhbmQgc2V0IG91dHB1dCByYWRpeCAobXVzdCBiZSAxMCwgMTYsIDggb3IgMikuXG4iCisvL3VzYWdlOiAgICAgICAiRXhhbXBsZXM6ICdkYyAyIDIgYWRkIHAnIC0+IDQsICdkYyA4IDggbXVsIDIgMiArIC8gcCcgLT4gMTYiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGRjX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGRjIDIgMiArIHBcbiIKKy8vdXNhZ2U6ICAgICAgICI0XG4iCisvL3VzYWdlOiAgICAgICAiJCBkYyA4IDggXFwqIDIgMiArIC8gcFxuIgorLy91c2FnZTogICAgICAgIjE2XG4iCisvL3VzYWdlOiAgICAgICAiJCBkYyAwIDEgYW5kIHBcbiIKKy8vdXNhZ2U6ICAgICAgICIwXG4iCisvL3VzYWdlOiAgICAgICAiJCBkYyAwIDEgb3IgcFxuIgorLy91c2FnZTogICAgICAgIjFcbiIKKy8vdXNhZ2U6ICAgICAgICIkIGVjaG8gNzIgOSBkaXYgOCBtdWwgcCB8IGRjXG4iCisvL3VzYWdlOiAgICAgICAiNjRcbiIKKworI2lmIDAKK3R5cGVkZWYgdW5zaWduZWQgZGF0YV90OworI2RlZmluZSBEQVRBX0ZNVCAiIgorI2VsaWYgMAordHlwZWRlZiB1bnNpZ25lZCBsb25nIGRhdGFfdDsKKyNkZWZpbmUgREFUQV9GTVQgImwiCisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgZGF0YV90OworI2RlZmluZSBEQVRBX0ZNVCAibGwiCisjZW5kaWYKKworCitzdHJ1Y3QgZ2xvYmFscyB7CisJdW5zaWduZWQgcG9pbnRlcjsKKwl1bnNpZ25lZCBiYXNlOworCWRvdWJsZSBzdGFja1sxXTsKK30gRklYX0FMSUFTSU5HOworZW51bSB7IFNUQUNLX1NJWkUgPSAoQ09NTU9OX0JVRlNJWkUgLSBvZmZzZXRvZihzdHJ1Y3QgZ2xvYmFscywgc3RhY2spKSAvIHNpemVvZihkb3VibGUpIH07CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgcG9pbnRlciAgIChHLnBvaW50ZXIgICApCisjZGVmaW5lIGJhc2UgICAgICAoRy5iYXNlICAgICAgKQorI2RlZmluZSBzdGFjayAgICAgKEcuc3RhY2sgICAgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJYmFzZSA9IDEwOyBcCit9IHdoaWxlICgwKQorCisKK3N0YXRpYyB2b2lkIGNoZWNrX3VuZGVyKHZvaWQpCit7CisJaWYgKHBvaW50ZXIgPT0gMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN0YWNrIHVuZGVyZmxvdyIpOworfQorCitzdGF0aWMgdm9pZCBwdXNoKGRvdWJsZSBhKQoreworCWlmIChwb2ludGVyID49IFNUQUNLX1NJWkUpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzdGFjayBvdmVyZmxvdyIpOworCXN0YWNrW3BvaW50ZXIrK10gPSBhOworfQorCitzdGF0aWMgZG91YmxlIHBvcCh2b2lkKQoreworCWNoZWNrX3VuZGVyKCk7CisJcmV0dXJuIHN0YWNrWy0tcG9pbnRlcl07Cit9CisKK3N0YXRpYyB2b2lkIGFkZCh2b2lkKQoreworCXB1c2gocG9wKCkgKyBwb3AoKSk7Cit9CisKK3N0YXRpYyB2b2lkIHN1Yih2b2lkKQoreworCWRvdWJsZSBzdWJ0cmFoZW5kID0gcG9wKCk7CisKKwlwdXNoKHBvcCgpIC0gc3VidHJhaGVuZCk7Cit9CisKK3N0YXRpYyB2b2lkIG11bCh2b2lkKQoreworCXB1c2gocG9wKCkgKiBwb3AoKSk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9EQ19MSUJNCitzdGF0aWMgdm9pZCBwb3dlcih2b2lkKQoreworCWRvdWJsZSB0b3Bvd2VyID0gcG9wKCk7CisKKwlwdXNoKHBvdyhwb3AoKSwgdG9wb3dlcikpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGRpdmlkZSh2b2lkKQoreworCWRvdWJsZSBkaXZpc29yID0gcG9wKCk7CisKKwlwdXNoKHBvcCgpIC8gZGl2aXNvcik7Cit9CisKK3N0YXRpYyB2b2lkIG1vZCh2b2lkKQoreworCWRhdGFfdCBkID0gcG9wKCk7CisKKwlwdXNoKChkYXRhX3QpIHBvcCgpICUgZCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuZCh2b2lkKQoreworCXB1c2goKGRhdGFfdCkgcG9wKCkgJiAoZGF0YV90KSBwb3AoKSk7Cit9CisKK3N0YXRpYyB2b2lkIG9yKHZvaWQpCit7CisJcHVzaCgoZGF0YV90KSBwb3AoKSB8IChkYXRhX3QpIHBvcCgpKTsKK30KKworc3RhdGljIHZvaWQgZW9yKHZvaWQpCit7CisJcHVzaCgoZGF0YV90KSBwb3AoKSBeIChkYXRhX3QpIHBvcCgpKTsKK30KKworc3RhdGljIHZvaWQgbm90KHZvaWQpCit7CisJcHVzaCh+KGRhdGFfdCkgcG9wKCkpOworfQorCitzdGF0aWMgdm9pZCBzZXRfb3V0cHV0X2Jhc2Uodm9pZCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBiYXNlc1tdIEFMSUdOMSA9IHsgMiwgOCwgMTAsIDE2LCAwIH07CisJdW5zaWduZWQgYiA9ICh1bnNpZ25lZClwb3AoKTsKKworCWJhc2UgPSAqc3RyY2hybnVsKGJhc2VzLCBiKTsKKwlpZiAoYmFzZSA9PSAwKSB7CisJCWJiX2Vycm9yX21zZygiZXJyb3IsIGJhc2UgJXUgaXMgbm90IHN1cHBvcnRlZCIsIGIpOworCQliYXNlID0gMTA7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcmludF9iYXNlKGRvdWJsZSBwcmludCkKK3sKKwlkYXRhX3QgeCwgaTsKKworCXggPSAoZGF0YV90KSBwcmludDsKKwlpZiAoYmFzZSA9PSAxMCkgeworCQlpZiAoeCA9PSBwcmludCkgLyogZXhhY3RseSByZXByZXNlbnRhYmxlIGFzIHVuc2lnbmVkIGludGVnZXIgKi8KKwkJCXByaW50ZigiJSJEQVRBX0ZNVCJ1XG4iLCB4KTsKKwkJZWxzZQorCQkJcHJpbnRmKCIlZ1xuIiwgcHJpbnQpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChiYXNlKSB7CisJY2FzZSAxNjoKKwkJcHJpbnRmKCIlIkRBVEFfRk1UInhcbiIsIHgpOworCQlicmVhazsKKwljYXNlIDg6CisJCXByaW50ZigiJSJEQVRBX0ZNVCJvXG4iLCB4KTsKKwkJYnJlYWs7CisJZGVmYXVsdDogLyogYmFzZSAyICovCisJCWkgPSBNQVhJTlQoZGF0YV90KSAtIChNQVhJTlQoZGF0YV90KSA+PiAxKTsKKwkJLyogaSBpcyAxMDAwMDAuLi4wMDAwMCAqLworCQlkbyB7CisJCQlpZiAoeCAmIGkpCisJCQkJYnJlYWs7CisJCQlpID4+PSAxOworCQl9IHdoaWxlIChpID4gMSk7CisJCWRvIHsKKwkJCWJiX3B1dGNoYXIoJzEnIC0gISh4ICYgaSkpOworCQkJaSA+Pj0gMTsKKwkJfSB3aGlsZSAoaSk7CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcmludF9zdGFja19ub19wb3Aodm9pZCkKK3sKKwl1bnNpZ25lZCBpID0gcG9pbnRlcjsKKwl3aGlsZSAoaSkKKwkJcHJpbnRfYmFzZShzdGFja1stLWldKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbm9fcG9wKHZvaWQpCit7CisJY2hlY2tfdW5kZXIoKTsKKwlwcmludF9iYXNlKHN0YWNrW3BvaW50ZXItMV0pOworfQorCitzdHJ1Y3Qgb3AgeworCWNvbnN0IGNoYXIgbmFtZVs0XTsKKwl2b2lkICgqZnVuY3Rpb24pICh2b2lkKTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3Agb3BlcmF0b3JzW10gPSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRENfTElCTQorCXsiKioiLCAgcG93ZXJ9LAorCXsiZXhwIiwgcG93ZXJ9LAorCXsicG93IiwgcG93ZXJ9LAorI2VuZGlmCisJeyIlIiwgICBtb2R9LAorCXsibW9kIiwgbW9kfSwKKwl7ImFuZCIsIGFuZH0sCisJeyJvciIsICBvcn0sCisJeyJub3QiLCBub3R9LAorCXsiZW9yIiwgZW9yfSwKKwl7InhvciIsIGVvcn0sCisJeyIrIiwgICBhZGR9LAorCXsiYWRkIiwgYWRkfSwKKwl7Ii0iLCAgIHN1Yn0sCisJeyJzdWIiLCBzdWJ9LAorCXsiKiIsICAgbXVsfSwKKwl7Im11bCIsIG11bH0sCisJeyIvIiwgICBkaXZpZGV9LAorCXsiZGl2IiwgZGl2aWRlfSwKKwl7InAiLCBwcmludF9ub19wb3B9LAorCXsiZiIsIHByaW50X3N0YWNrX25vX3BvcH0sCisJeyJvIiwgc2V0X291dHB1dF9iYXNlfSwKK307CisKKy8qIEZlZWQgdGhlIHN0YWNrIG1hY2hpbmUgKi8KK3N0YXRpYyB2b2lkIHN0YWNrX21hY2hpbmUoY29uc3QgY2hhciAqYXJndW1lbnQpCit7CisJY2hhciAqZW5kOworCWRvdWJsZSBudW1iZXI7CisJY29uc3Qgc3RydWN0IG9wICpvOworCisgbmV4dDoKKwludW1iZXIgPSBzdHJ0b2QoYXJndW1lbnQsICZlbmQpOworCWlmIChlbmQgIT0gYXJndW1lbnQpIHsKKwkJYXJndW1lbnQgPSBlbmQ7CisJCXB1c2gobnVtYmVyKTsKKwkJZ290byBuZXh0OworCX0KKworCS8qIFdlIG1pZ2h0IGhhdmUgbWF0Y2hlZCBhIGRpZ2l0LCBldmVudHVhbGx5IGFkdmFuY2UgdGhlIGFyZ3VtZW50ICovCisJYXJndW1lbnQgPSBza2lwX3doaXRlc3BhY2UoYXJndW1lbnQpOworCisJaWYgKCphcmd1bWVudCA9PSAnXDAnKQorCQlyZXR1cm47CisKKwlvID0gb3BlcmF0b3JzOworCWRvIHsKKwkJY2hhciAqYWZ0ZXJfbmFtZSA9IGlzX3ByZWZpeGVkX3dpdGgoYXJndW1lbnQsIG8tPm5hbWUpOworCQlpZiAoYWZ0ZXJfbmFtZSkgeworCQkJYXJndW1lbnQgPSBhZnRlcl9uYW1lOworCQkJby0+ZnVuY3Rpb24oKTsKKwkJCWdvdG8gbmV4dDsKKwkJfQorCQlvKys7CisJfSB3aGlsZSAobyAhPSBvcGVyYXRvcnMgKyBBUlJBWV9TSVpFKG9wZXJhdG9ycykpOworCisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN5bnRheCBlcnJvciBhdCAnJXMnIiwgYXJndW1lbnQpOworfQorCitpbnQgZGNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGRjX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlJTklUX0coKTsKKworCWFyZ3YrKzsKKwlpZiAoIWFyZ3ZbMF0pIHsKKwkJLyogdGFrZSBzdHVmZiBmcm9tIHN0ZGluIGlmIG5vIGFyZ3MgYXJlIGdpdmVuICovCisJCWNoYXIgKmxpbmU7CisJCXdoaWxlICgobGluZSA9IHhtYWxsb2NfZmdldGxpbmUoc3RkaW4pKSAhPSBOVUxMKSB7CisJCQlzdGFja19tYWNoaW5lKGxpbmUpOworCQkJZnJlZShsaW5lKTsKKwkJfQorCX0gZWxzZSB7CisJCWRvIHsKKwkJCXN0YWNrX21hY2hpbmUoKmFyZ3YpOworCQl9IHdoaWxlICgqKythcmd2KTsKKwl9CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9kZXZmc2QuYyBiL21pc2N1dGlscy9kZXZmc2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjU2NTY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL2RldmZzZC5jCkBAIC0wLDAgKzEsMTgwOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorCWRldmZzZCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorCisJQ29weXJpZ2h0IChDKSAyMDAzIGJ5IFRpdG8gUmFndXNhIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4KKworCUJ1c3lib3ggdmVyc2lvbiBpcyBiYXNlZCBvbiBzb21lIHByZXZpb3VzIHdvcmsgYW5kIGlkZWFzCisJQ29weXJpZ2h0IChDKSBbMjAwM10gYnkgW01hdHRlbyBDcm9jZV0gPDMyOTc2Mjc3OTlAd2luZC5pdD4KKworCWRldmZzZC5jCisKKwlNYWluIGZpbGUgZm9yICBkZXZmc2QgIChkZXZmcyBkYWVtb24gZm9yIExpbnV4KS4KKworICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAyICBSaWNoYXJkIEdvb2NoCisKKwlkZXZmc2QuaAorCisgICAgSGVhZGVyIGZpbGUgZm9yICBkZXZmc2QgIChkZXZmcyBkYWVtb24gZm9yIExpbnV4KS4KKworICAgIENvcHlyaWdodCAoQykgMTk5OC0yMDAwICBSaWNoYXJkIEdvb2NoCisKKwljb21wYXRfbmFtZS5jCisKKyAgICBDb21wYXRpYmlsaXR5IG5hbWUgZmlsZSBmb3IgIGRldmZzZCAgKGJ1aWxkIGNvbXBhdGliaWxpdHkgbmFtZXMpLgorCisgICAgQ29weXJpZ2h0IChDKSAxOTk4LTIwMDIgIFJpY2hhcmQgR29vY2gKKworCWV4cHJlc3Npb24uYworCisgICAgVGhpcyBjb2RlIHByb3ZpZGVzIEJvcm5lIFNoZWxsLWxpa2UgZXhwcmVzc2lvbiBleHBhbnNpb24uCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5OTctMTk5OSAgUmljaGFyZCBHb29jaAorCisJVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisKKyAgICBSaWNoYXJkIEdvb2NoIG1heSBiZSByZWFjaGVkIGJ5IGVtYWlsIGF0ICByZ29vY2hAYXRuZi5jc2lyby5hdQorICAgIFRoZSBwb3N0YWwgYWRkcmVzcyBpczoKKyAgICAgIFJpY2hhcmQgR29vY2gsIGMvbyBBVE5GLCBQLiBPLiBCb3ggNzYsIEVwcGluZywgTi5TLlcuLCAyMTIxLCBBdXN0cmFsaWEuCisqLworCisvL3VzYWdlOiNkZWZpbmUgZGV2ZnNkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJtbnRwbnQgWy12XSIgSUZfREVWRlNEX0ZHX05QKCJbLWZnXVstbnBdIikKKy8vdXNhZ2U6I2RlZmluZSBkZXZmc2RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJNYW5hZ2UgZGV2ZnMgcGVybWlzc2lvbnMgYW5kIG9sZCBkZXZpY2UgbmFtZSBzeW1saW5rc1xuIgorLy91c2FnZTogICAgICJcbgltbnRwbnQJVGhlIG1vdW50IHBvaW50IHdoZXJlIGRldmZzIGlzIG1vdW50ZWQiCisvL3VzYWdlOiAgICAgIlxuCS12CVByaW50IHRoZSBwcm90b2NvbCB2ZXJzaW9uIG51bWJlcnMgZm9yIGRldmZzZCIKKy8vdXNhZ2U6ICAgICAiXG4JCWFuZCB0aGUga2VybmVsLXNpZGUgcHJvdG9jb2wgdmVyc2lvbiBhbmQgZXhpdCIKKy8vdXNhZ2U6CUlGX0RFVkZTRF9GR19OUCgKKy8vdXNhZ2U6ICAgICAiXG4JLWZnCVJ1biBpbiBmb3JlZ3JvdW5kIgorLy91c2FnZTogICAgICJcbgktbnAJRXhpdCBhZnRlciBwYXJzaW5nIHRoZSBjb25maWd1cmF0aW9uIGZpbGUiCisvL3VzYWdlOiAgICAgIlxuCQlhbmQgcHJvY2Vzc2luZyBzeW50aGV0aWMgUkVHSVNURVIgZXZlbnRzLCIKKy8vdXNhZ2U6ICAgICAiXG4JCWRvbid0IHBvbGwgZm9yIGV2ZW50cyIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAieHJlZ2V4LmgiCisjaW5jbHVkZSA8c3lzbG9nLmg+CisKKyNpbmNsdWRlIDxzeXMvdW4uaD4KKyNpbmNsdWRlIDxzeXMvc3lzbWFjcm9zLmg+CisKKy8qIFZhcmlvdXMgZGVmaW5lcyB0YWtlbiBmcm9tIGxpbnV4L21ham9yLmggKi8KKyNkZWZpbmUgSURFMF9NQUpPUgkzCisjZGVmaW5lIElERTFfTUFKT1IJMjIKKyNkZWZpbmUgSURFMl9NQUpPUgkzMworI2RlZmluZSBJREUzX01BSk9SCTM0CisjZGVmaW5lIElERTRfTUFKT1IJNTYKKyNkZWZpbmUgSURFNV9NQUpPUgk1NworI2RlZmluZSBJREU2X01BSk9SCTg4CisjZGVmaW5lIElERTdfTUFKT1IJODkKKyNkZWZpbmUgSURFOF9NQUpPUgk5MAorI2RlZmluZSBJREU5X01BSk9SCTkxCisKKworLyogVmFyaW91cyBkZWZpbmVzIHRha2VuIGZyb20gbGludXgvZGV2ZnNfZnMuaCAqLworI2RlZmluZSBERVZGU0RfUFJPVE9DT0xfUkVWSVNJT05fS0VSTkVMICA1CisjZGVmaW5lIERFVkZTRF9JT0NUTF9CQVNFCSdkJworLyogIFRoZXNlIGFyZSB0aGUgdmFyaW91cyBpb2N0bHMgICovCisjZGVmaW5lIERFVkZTRElPQ19HRVRfUFJPVE9fUkVWICAgICAgICAgX0lPUihERVZGU0RfSU9DVExfQkFTRSwgMCwgaW50KQorI2RlZmluZSBERVZGU0RJT0NfU0VUX0VWRU5UX01BU0sgICAgICAgIF9JT1coREVWRlNEX0lPQ1RMX0JBU0UsIDIsIGludCkKKyNkZWZpbmUgREVWRlNESU9DX1JFTEVBU0VfRVZFTlRfUVVFVUUgICBfSU9XKERFVkZTRF9JT0NUTF9CQVNFLCAzLCBpbnQpCisjZGVmaW5lIERFVkZTRElPQ19TRVRfQ09ORklHX0RFQlVHX01BU0sgX0lPVyhERVZGU0RfSU9DVExfQkFTRSwgNCwgaW50KQorI2RlZmluZSBERVZGU0RfTk9USUZZX1JFR0lTVEVSRUQgICAgMAorI2RlZmluZSBERVZGU0RfTk9USUZZX1VOUkVHSVNURVJFRCAgMQorI2RlZmluZSBERVZGU0RfTk9USUZZX0FTWU5DX09QRU4gICAgMgorI2RlZmluZSBERVZGU0RfTk9USUZZX0NMT1NFICAgICAgICAgMworI2RlZmluZSBERVZGU0RfTk9USUZZX0xPT0tVUCAgICAgICAgNAorI2RlZmluZSBERVZGU0RfTk9USUZZX0NIQU5HRSAgICAgICAgNQorI2RlZmluZSBERVZGU0RfTk9USUZZX0NSRUFURSAgICAgICAgNgorI2RlZmluZSBERVZGU0RfTk9USUZZX0RFTEVURSAgICAgICAgNworI2RlZmluZSBERVZGU19QQVRITEVOICAgICAgICAgICAgICAgMTAyNAorLyogIE5ldmVyIGNoYW5nZSB0aGlzIG90aGVyd2lzZSB0aGUgYmluYXJ5IGludGVyZmFjZSB3aWxsIGNoYW5nZSAgICovCisKK3N0cnVjdCBkZXZmc2Rfbm90aWZ5X3N0cnVjdCB7CisJLyogIFVzZSBuYXRpdmUgQyB0eXBlcyB0byBlbnN1cmUgc2FtZSB0eXBlcyBpbiBrZXJuZWwgYW5kIHVzZXIgc3BhY2UgICAgICovCisJdW5zaWduZWQgaW50IHR5cGU7ICAgICAgICAgICAvKiAgREVWRlNEX05PVElGWV8qIHZhbHVlICAgICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgaW50IG1vZGU7ICAgICAgICAgICAvKiAgTW9kZSBvZiB0aGUgaW5vZGUgb3IgZGV2aWNlIGVudHJ5ICAgICAgICovCisJdW5zaWduZWQgaW50IG1ham9yOyAgICAgICAgICAvKiAgTWFqb3IgbnVtYmVyIG9mIGRldmljZSBlbnRyeSAgICAgICAgICAgICovCisJdW5zaWduZWQgaW50IG1pbm9yOyAgICAgICAgICAvKiAgTWlub3IgbnVtYmVyIG9mIGRldmljZSBlbnRyeSAgICAgICAgICAgICovCisJdW5zaWduZWQgaW50IHVpZDsgICAgICAgICAgICAvKiAgVWlkIG9mIHByb2Nlc3MsIGlub2RlIG9yIGRldmljZSBlbnRyeSAgICovCisJdW5zaWduZWQgaW50IGdpZDsgICAgICAgICAgICAvKiAgR2lkIG9mIHByb2Nlc3MsIGlub2RlIG9yIGRldmljZSBlbnRyeSAgICovCisJdW5zaWduZWQgaW50IG92ZXJydW5fY291bnQ7ICAvKiAgTnVtYmVyIG9mIGxvc3QgZXZlbnRzICAgICAgICAgICAgICAgICAgICovCisJdW5zaWduZWQgaW50IG5hbWVsZW47ICAgICAgICAvKiAgTnVtYmVyIG9mIGNoYXJhY3RlcnMgbm90IGluY2x1ZGluZyAnXDAnICovCisJLyogIFRoZSBkZXZpY2UgbmFtZSBNVVNUIGNvbWUgbGFzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJY2hhciBkZXZuYW1lW0RFVkZTX1BBVEhMRU5dOyAvKiAgVGhpcyB3aWxsIGJlICdcMCcgdGVybWluYXRlZCAgICAgICAgICAgICovCit9OworCisjZGVmaW5lIEJVRkZFUl9TSVpFIDE2Mzg0CisjZGVmaW5lIERFVkZTRF9WRVJTSU9OICIxLjMuMjUiCisjZGVmaW5lIENPTkZJR19GSUxFICAiL2V0Yy9kZXZmc2QuY29uZiIKKyNkZWZpbmUgTU9EUFJPQkUJCSIvc2Jpbi9tb2Rwcm9iZSIKKyNkZWZpbmUgTU9EUFJPQkVfU1dJVENIXzEgIi1rIgorI2RlZmluZSBNT0RQUk9CRV9TV0lUQ0hfMiAiLUMiCisjZGVmaW5lIENPTkZJR19NT0RVTEVTX0RFVkZTICIvZXRjL21vZHVsZXMuZGV2ZnMiCisjZGVmaW5lIE1BWF9BUkdTICAgICAoNiArIDEpCisjZGVmaW5lIE1BWF9TVUJFWFBSICAxMAorI2RlZmluZSBTVFJJTkdfTEVOR1RIIDI1NQorCisvKiBmb3IgZ2V0X3VpZF9naWQoKSAqLworI2RlZmluZSBVSUQJCQkwCisjZGVmaW5lIEdJRAkJCTEKKworLyogZm9ya19hbmRfZXhlY3V0ZSgpICovCisjIGRlZmluZSBESUUJCQkxCisjIGRlZmluZSBOT19ESUUJCQkwCisKKy8qIGZvciBkaXJfb3BlcmF0aW9uKCkgKi8KKyNkZWZpbmUgUkVTVE9SRQkJMAorI2RlZmluZSBTRVJWSUNFCQkxCisjZGVmaW5lIFJFQURfQ09ORklHIDIKKworLyogIFVwZGF0ZSBvbmx5IGFmdGVyIGNoYW5naW5nIGNvZGUgdG8gcmVmbGVjdCBuZXcgcHJvdG9jb2wgICovCisjZGVmaW5lIERFVkZTRF9QUk9UT0NPTF9SRVZJU0lPTl9EQUVNT04gIDUKKworLyogIENvbXBpbGUtdGltZSBjaGVjayAgKi8KKyNpZiBERVZGU0RfUFJPVE9DT0xfUkVWSVNJT05fS0VSTkVMICE9IERFVkZTRF9QUk9UT0NPTF9SRVZJU0lPTl9EQUVNT04KKyNlcnJvciBwcm90b2NvbCB2ZXJzaW9uIG1pc21hdGNoLiBVcGRhdGUgeW91ciBrZXJuZWwgaGVhZGVycworI2VuZGlmCisKKyNkZWZpbmUgQUNfUEVSTUlTU0lPTlMJCQkJMAorI2RlZmluZSBBQ19NT0RMT0FECQkJCQkxCisjZGVmaW5lIEFDX0VYRUNVVEUJCQkJCTIKKyNkZWZpbmUgQUNfTUZVTkNUSU9OCQkJCTMJLyogbm90IHN1cHBvcnRlZCBieSBidXN5Ym94ICovCisjZGVmaW5lIEFDX0NGVU5DVElPTgkJCQk0CS8qIG5vdCBzdXBwb3J0ZWQgYnkgYnVzeWJveCAqLworI2RlZmluZSBBQ19DT1BZCQkJCQkJNQorI2RlZmluZSBBQ19JR05PUkUJCQkJCTYKKyNkZWZpbmUgQUNfTUtPTERDT01QQVQJCQkJNworI2RlZmluZSBBQ19NS05FV0NPTVBBVAkJCQk4CisjZGVmaW5lIEFDX1JNT0xEQ09NUEFUCQkJCTkKKyNkZWZpbmUgQUNfUk1ORVdDT01QQVQJCQkJMTAKKyNkZWZpbmUgQUNfUkVTVE9SRQkJCQkJMTEKKworc3RydWN0IHBlcm1pc3Npb25zX3R5cGUgeworCW1vZGVfdCBtb2RlOworCXVpZF90IHVpZDsKKwlnaWRfdCBnaWQ7Cit9OworCitzdHJ1Y3QgZXhlY3V0ZV90eXBlIHsKKwljaGFyICphcmd2W01BWF9BUkdTICsgMV07ICAvKiAgYXJndlswXSBtdXN0IGFsd2F5cyBiZSB0aGUgcHJvZ3JhbW1lICAqLworfTsKKworc3RydWN0IGNvcHlfdHlwZSB7CisJY29uc3QgY2hhciAqc291cmNlOworCWNvbnN0IGNoYXIgKmRlc3RpbmF0aW9uOworfTsKKworc3RydWN0IGFjdGlvbl90eXBlIHsKKwl1bnNpZ25lZCBpbnQgd2hhdDsKKwl1bnNpZ25lZCBpbnQgd2hlbjsKK307CisKK3N0cnVjdCBjb25maWdfZW50cnlfc3RydWN0IHsKKwlzdHJ1Y3QgYWN0aW9uX3R5cGUgYWN0aW9uOworCXJlZ2V4X3QgcHJlZzsKKwl1bmlvbgorCXsKKwlzdHJ1Y3QgcGVybWlzc2lvbnNfdHlwZSBwZXJtaXNzaW9uczsKKwlzdHJ1Y3QgZXhlY3V0ZV90eXBlIGV4ZWN1dGU7CisJc3RydWN0IGNvcHlfdHlwZSBjb3B5OworCX0KKwl1OworCXN0cnVjdCBjb25maWdfZW50cnlfc3RydWN0ICpuZXh0OworfTsKKworc3RydWN0IGdldF92YXJpYWJsZV9pbmZvIHsKKwljb25zdCBzdHJ1Y3QgZGV2ZnNkX25vdGlmeV9zdHJ1Y3QgKmluZm87CisJY29uc3QgY2hhciAqZGV2bmFtZTsKKwljaGFyIGRldnBhdGhbU1RSSU5HX0xFTkdUSF07Cit9OworCitzdGF0aWMgdm9pZCBkaXJfb3BlcmF0aW9uKGludCAsIGNvbnN0IGNoYXIgKiAsIGludCwgIHVuc2lnbmVkIGxvbmcqKTsKK3N0YXRpYyB2b2lkIHNlcnZpY2Uoc3RydWN0IHN0YXQgc3RhdGJ1ZiwgY2hhciAqcGF0aCk7CitzdGF0aWMgaW50IHN0X2V4cHJfZXhwYW5kKGNoYXIgKiwgdW5zaWduZWQsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKCopKGNvbnN0IGNoYXIgKiwgdm9pZCAqKSwgdm9pZCAqKTsKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfb2xkX25hbWUoY29uc3QgY2hhciAqLCB1bnNpZ25lZCwgY2hhciAqLCB1bnNpZ25lZCwgdW5zaWduZWQpOworc3RhdGljIGludCBta3N5bWxpbmsoY29uc3QgY2hhciAqb2xkcGF0aCwgY29uc3QgY2hhciAqbmV3cGF0aCk7CitzdGF0aWMgdm9pZCByZWFkX2NvbmZpZ19maWxlKGNoYXIgKnBhdGgsIGludCBvcHRpb25hbCwgdW5zaWduZWQgbG9uZyAqZXZlbnRfbWFzayk7CitzdGF0aWMgdm9pZCBwcm9jZXNzX2NvbmZpZ19saW5lKGNvbnN0IGNoYXIgKiwgdW5zaWduZWQgbG9uZyAqKTsKK3N0YXRpYyBpbnQgIGRvX3NlcnZpY2luZyhpbnQsIHVuc2lnbmVkIGxvbmcpOworc3RhdGljIHZvaWQgc2VydmljZV9uYW1lKGNvbnN0IHN0cnVjdCBkZXZmc2Rfbm90aWZ5X3N0cnVjdCAqKTsKK3N0YXRpYyB2b2lkIGFjdGlvbl9wZXJtaXNzaW9ucyhjb25zdCBzdHJ1Y3QgZGV2ZnNkX25vdGlmeV9zdHJ1Y3QgKiwgY29uc3Qgc3RydWN0IGNvbmZpZ19lbnRyeV9zdHJ1Y3QgKik7CitzdGF0aWMgdm9pZCBhY3Rpb25fZXhlY3V0ZShjb25zdCBzdHJ1Y3QgZGV2ZnNkX25vdGlmeV9zdHJ1Y3QgKiwgY29uc3Qgc3RydWN0IGNvbmZpZ19lbnRyeV9zdHJ1Y3QgKiwKKwkJCQkJCQljb25zdCByZWdtYXRjaF90ICosIHVuc2lnbmVkKTsKK3N0YXRpYyB2b2lkIGFjdGlvbl9tb2Rsb2FkKGNvbnN0IHN0cnVjdCBkZXZmc2Rfbm90aWZ5X3N0cnVjdCAqaW5mbywgY29uc3Qgc3RydWN0IGNvbmZpZ19lbnRyeV9zdHJ1Y3QgKmVudHJ5KTsKK3N0YXRpYyB2b2lkIGFjdGlvbl9jb3B5KGNvbnN0IHN0cnVjdCBkZXZmc2Rfbm90aWZ5X3N0cnVjdCAqLCBjb25zdCBzdHJ1Y3QgY29uZmlnX2VudHJ5X3N0cnVjdCAqLAorCQkJCQkJY29uc3QgcmVnbWF0Y2hfdCAqLCB1bnNpZ25lZCk7CitzdGF0aWMgdm9pZCBhY3Rpb25fY29tcGF0KGNvbnN0IHN0cnVjdCBkZXZmc2Rfbm90aWZ5X3N0cnVjdCAqLCB1bnNpZ25lZCk7CitzdGF0aWMgdm9pZCBmcmVlX2NvbmZpZyh2b2lkKTsKK3N0YXRpYyB2b2lkIHJlc3RvcmUoY2hhciAqc3BhdGgsIHN0cnVjdCBzdGF0IHNvdXJjZV9zdGF0LCBpbnQgcm9vdGxlbik7CitzdGF0aWMgaW50IGNvcHlfaW5vZGUoY29uc3QgY2hhciAqLCBjb25zdCBzdHJ1Y3Qgc3RhdCAqLCBtb2RlX3QsIGNvbnN0IGNoYXIgKiwgY29uc3Qgc3RydWN0IHN0YXQgKik7CitzdGF0aWMgbW9kZV90IGdldF9tb2RlKGNvbnN0IGNoYXIgKik7CitzdGF0aWMgdm9pZCBzaWduYWxfaGFuZGxlcihpbnQpOworc3RhdGljIGNvbnN0IGNoYXIgKmdldF92YXJpYWJsZShjb25zdCBjaGFyICosIHZvaWQgKik7CitzdGF0aWMgaW50IG1ha2VfZGlyX3RyZWUoY29uc3QgY2hhciAqKTsKK3N0YXRpYyBpbnQgZXhwYW5kX2V4cHJlc3Npb24oY2hhciAqLCB1bnNpZ25lZCwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICooKikoY29uc3QgY2hhciAqLCB2b2lkICopLCB2b2lkICosCisJCQkJCQkJY29uc3QgY2hhciAqLCBjb25zdCByZWdtYXRjaF90ICosIHVuc2lnbmVkKTsKK3N0YXRpYyB2b2lkIGV4cGFuZF9yZWdleHAoY2hhciAqLCBzaXplX3QsIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCByZWdtYXRjaF90ICosIHVuc2lnbmVkKTsKK3N0YXRpYyBjb25zdCBjaGFyICpleHBhbmRfdmFyaWFibGUoCWNoYXIgKiwgdW5zaWduZWQsIHVuc2lnbmVkICosIGNvbnN0IGNoYXIgKiwKKwkJCQkJCQkJCWNvbnN0IGNoYXIgKigqKShjb25zdCBjaGFyICosIHZvaWQgKiksIHZvaWQgKik7CitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3ZhcmlhYmxlX3YyKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKCopKGNvbnN0IGNoYXIgKiwgdm9pZCAqKSwgdm9pZCAqKTsKK3N0YXRpYyBjaGFyIGdldF9vbGRfaWRlX25hbWUodW5zaWduZWQsIHVuc2lnbmVkKTsKK3N0YXRpYyBjaGFyICp3cml0ZV9vbGRfc2RfbmFtZShjaGFyICosIHVuc2lnbmVkLCB1bnNpZ25lZCwgY29uc3QgY2hhciAqKTsKKworLyogYnVzeWJveCBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgZ2V0X3VpZF9naWQoaW50IGZsYWcsIGNvbnN0IGNoYXIgKnN0cmluZyk7CitzdGF0aWMgdm9pZCBzYWZlX21lbWNweShjaGFyICogZGVzdCwgY29uc3QgY2hhciAqIHNyYywgaW50IGxlbik7CitzdGF0aWMgdW5zaWduZWQgaW50IHNjYW5fZGV2X25hbWVfY29tbW9uKGNvbnN0IGNoYXIgKmQsIHVuc2lnbmVkIGludCBuLCBpbnQgYWRkZW5kdW0sIGNvbnN0IGNoYXIgKnB0cik7CitzdGF0aWMgdW5zaWduZWQgaW50IHNjYW5fZGV2X25hbWUoY29uc3QgY2hhciAqZCwgdW5zaWduZWQgaW50IG4sIGNvbnN0IGNoYXIgKnB0cik7CisKKy8qIFN0cnVjdHMgYW5kIHZhcnMgKi8KK3N0YXRpYyBzdHJ1Y3QgY29uZmlnX2VudHJ5X3N0cnVjdCAqZmlyc3RfY29uZmlnID0gTlVMTDsKK3N0YXRpYyBzdHJ1Y3QgY29uZmlnX2VudHJ5X3N0cnVjdCAqbGFzdF9jb25maWcgPSBOVUxMOworc3RhdGljIGNoYXIgKm1vdW50X3BvaW50ID0gTlVMTDsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgY2F1Z2h0X3NpZ25hbCA9IEZBTFNFOworc3RhdGljIHZvbGF0aWxlIGludCBjYXVnaHRfc2lnaHVwID0gRkFMU0U7CitzdGF0aWMgc3RydWN0IGluaXRpYWxfc3ltbGlua19zdHJ1Y3QgeworCWNvbnN0IGNoYXIgKmRlc3Q7CisJY29uc3QgY2hhciAqbmFtZTsKK30gaW5pdGlhbF9zeW1saW5rc1tdID0geworCXsiL3Byb2Mvc2VsZi9mZCIsICJmZCJ9LAorCXsiZmQvMCIsICJzdGRpbiJ9LAorCXsiZmQvMSIsICJzdGRvdXQifSwKKwl7ImZkLzIiLCAic3RkZXJyIn0sCisJe05VTEwsIE5VTEx9LAorfTsKKworc3RhdGljIHN0cnVjdCBldmVudF90eXBlIHsKKwl1bnNpZ25lZCBpbnQgdHlwZTsgICAgICAgIC8qICBUaGUgREVWRlNEX05PVElGWV8qIHZhbHVlICAgICAgICAgICAgICAgICAgKi8KKwljb25zdCBjaGFyICpjb25maWdfbmFtZTsgIC8qICBUaGUgbmFtZSB1c2VkIGluIHRoZSBjb25maWcgZmlsZSAgICAgICAgICAgKi8KK30gZXZlbnRfdHlwZXNbXSA9IHsKKwl7REVWRlNEX05PVElGWV9SRUdJU1RFUkVELCAgICJSRUdJU1RFUiJ9LAorCXtERVZGU0RfTk9USUZZX1VOUkVHSVNURVJFRCwgIlVOUkVHSVNURVIifSwKKwl7REVWRlNEX05PVElGWV9BU1lOQ19PUEVOLCAgICJBU1lOQ19PUEVOIn0sCisJe0RFVkZTRF9OT1RJRllfQ0xPU0UsICAgICAgICAiQ0xPU0UifSwKKwl7REVWRlNEX05PVElGWV9MT09LVVAsICAgICAgICJMT09LVVAifSwKKwl7REVWRlNEX05PVElGWV9DSEFOR0UsICAgICAgICJDSEFOR0UifSwKKwl7REVWRlNEX05PVElGWV9DUkVBVEUsICAgICAgICJDUkVBVEUifSwKKwl7REVWRlNEX05PVElGWV9ERUxFVEUsICAgICAgICJERUxFVEUifSwKKwl7MHhmZmZmZmZmZiwgICAgICAgICAgICAgICAgIE5VTEx9Cit9OworCisvKiBCdXN5Ym94IG1lc3NhZ2VzICovCisKK3N0YXRpYyBjb25zdCBjaGFyIGJiX21zZ19wcm90b19yZXZbXSBBTElHTjEgICAgICAgICAgPSAicHJvdG9jb2wgcmV2aXNpb24iOworc3RhdGljIGNvbnN0IGNoYXIgYmJfbXNnX2JhZF9jb25maWdbXSBBTElHTjEgICAgICAgICA9ICJiYWQgJXMgY29uZmlnIGZpbGU6ICVzIjsKK3N0YXRpYyBjb25zdCBjaGFyIGJiX21zZ19zbWFsbF9idWZmZXJbXSBBTElHTjEgICAgICAgPSAiYnVmZmVyIHRvbyBzbWFsbCI7CitzdGF0aWMgY29uc3QgY2hhciBiYl9tc2dfdmFyaWFibGVfbm90X2ZvdW5kW10gQUxJR04xID0gInZhcmlhYmxlOiAlcyBub3QgZm91bmQiOworCisvKiBCdXN5Ym94IHN0dWZmICovCisjaWYgRU5BQkxFX0RFVkZTRF9WRVJCT1NFIHx8IEVOQUJMRV9ERUJVRworI2RlZmluZSBpbmZvX2xvZ2dlcihwLCBmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICAgICBiYl9pbmZvX21zZyhmbXQsICMjIGFyZ3MpCisjZGVmaW5lIG1zZ19sb2dnZXIocCwgZm10LCBhcmdzLi4uKSAgICAgICAgICAgICAgICAgIGJiX2Vycm9yX21zZyhmbXQsICMjIGFyZ3MpCisjZGVmaW5lIG1zZ19sb2dnZXJfYW5kX2RpZShwLCBmbXQsIGFyZ3MuLi4pICAgICAgICAgIGJiX2Vycm9yX21zZ19hbmRfZGllKGZtdCwgIyMgYXJncykKKyNkZWZpbmUgZXJyb3JfbG9nZ2VyKHAsIGZtdCwgYXJncy4uLikgICAgICAgICAgICAgICAgYmJfcGVycm9yX21zZyhmbXQsICMjIGFyZ3MpCisjZGVmaW5lIGVycm9yX2xvZ2dlcl9hbmRfZGllKHAsIGZtdCwgYXJncy4uLikgICAgICAgIGJiX3BlcnJvcl9tc2dfYW5kX2RpZShmbXQsICMjIGFyZ3MpCisjZWxzZQorI2RlZmluZSBpbmZvX2xvZ2dlcihwLCBmbXQsIGFyZ3MuLi4pCisjZGVmaW5lIG1zZ19sb2dnZXIocCwgZm10LCBhcmdzLi4uKQorI2RlZmluZSBtc2dfbG9nZ2VyX2FuZF9kaWUocCwgZm10LCBhcmdzLi4uKSAgICAgICAgICAgZXhpdChFWElUX0ZBSUxVUkUpCisjZGVmaW5lIGVycm9yX2xvZ2dlcihwLCBmbXQsIGFyZ3MuLi4pCisjZGVmaW5lIGVycm9yX2xvZ2dlcl9hbmRfZGllKHAsIGZtdCwgYXJncy4uLikgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzYWZlX21lbWNweShjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMsIGludCBsZW4pCit7CisJbWVtY3B5KGRlc3QgLCBzcmMsIGxlbik7CisJZGVzdFtsZW5dID0gJ1wwJzsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBzY2FuX2Rldl9uYW1lX2NvbW1vbihjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgbiwgaW50IGFkZGVuZHVtLCBjb25zdCBjaGFyICpwdHIpCit7CisJaWYgKGRbbiAtIDRdID09ICdkJyAmJiBkW24gLSAzXSA9PSAnaScgJiYgZFtuIC0gMl0gPT0gJ3MnICYmIGRbbiAtIDFdID09ICdjJykKKwkJcmV0dXJuIDIgKyBhZGRlbmR1bTsKKwlpZiAoZFtuIC0gMl0gPT0gJ2MnICYmIGRbbiAtIDFdID09ICdkJykKKwkJcmV0dXJuIDMgKyBhZGRlbmR1bTsKKwlpZiAocHRyWzBdID09ICdwJyAmJiBwdHJbMV0gPT0gJ2EnICYmIHB0clsyXSA9PSAncicgJiYgcHRyWzNdID09ICd0JykKKwkJcmV0dXJuIDQgKyBhZGRlbmR1bTsKKwlpZiAocHRyW24gLSAyXSA9PSAnbScgJiYgcHRyW24gLSAxXSA9PSAndCcpCisJCXJldHVybiA1ICsgYWRkZW5kdW07CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgc2Nhbl9kZXZfbmFtZShjb25zdCBjaGFyICpkLCB1bnNpZ25lZCBpbnQgbiwgY29uc3QgY2hhciAqcHRyKQoreworCWlmIChkWzBdID09ICdzJyAmJiBkWzFdID09ICdjJyAmJiBkWzJdID09ICdzJyAmJiBkWzNdID09ICdpJyAmJiBkWzRdID09ICcvJykgeworCQlpZiAoZFtuIC0gN10gPT0gJ2cnICYmIGRbbiAtIDZdID09ICdlJyAmJiBkW24gLSA1XSA9PSAnbicKKwkJCSYmIGRbbiAtIDRdID09ICdlJyAmJiBkW24gLSAzXSA9PSAncicgJiYgZFtuIC0gMl0gPT0gJ2knICYmIGRbbiAtIDFdID09ICdjJworCQkpCisJCQlyZXR1cm4gMTsKKwkJcmV0dXJuIHNjYW5fZGV2X25hbWVfY29tbW9uKGQsIG4sIDAsIHB0cik7CisJfQorCWlmIChkWzBdID09ICdpJyAmJiBkWzFdID09ICdkJyAmJiBkWzJdID09ICdlJyAmJiBkWzNdID09ICcvJworCQkmJiBkWzRdID09ICdoJyAmJiBkWzVdID09ICdvJyAmJiBkWzZdID09ICdzJyAmJiBkWzddID09ICd0JworCSkKKwkJcmV0dXJuIHNjYW5fZGV2X25hbWVfY29tbW9uKGQsIG4sIDQsIHB0cik7CisJaWYgKGRbMF0gPT0gJ3MnICYmIGRbMV0gPT0gJ2InICYmIGRbMl0gPT0gJ3AnICYmIGRbM10gPT0gJy8nKQorCQlyZXR1cm4gMTA7CisJaWYgKGRbMF0gPT0gJ3YnICYmIGRbMV0gPT0gJ2MnICYmIGRbMl0gPT0gJ2MnICYmIGRbM10gPT0gJy8nKQorCQlyZXR1cm4gMTE7CisJaWYgKGRbMF0gPT0gJ3AnICYmIGRbMV0gPT0gJ3QnICYmIGRbMl0gPT0gJ3knICYmIGRbM10gPT0gJy8nKQorCQlyZXR1cm4gMTI7CisJcmV0dXJuIDA7Cit9CisKKy8qICBQdWJsaWMgZnVuY3Rpb25zIGZvbGxvdyAgKi8KKworaW50IGRldmZzZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZGV2ZnNkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBwcmludF92ZXJzaW9uID0gRkFMU0U7CisJaW50IGRvX2RhZW1vbiA9IFRSVUU7CisJaW50IG5vX3BvbGxpbmcgPSBGQUxTRTsKKwlpbnQgZG9fc2NhbjsKKwlpbnQgZmQsIHByb3RvX3JldiwgY291bnQ7CisJdW5zaWduZWQgbG9uZyBldmVudF9tYXNrID0gMDsKKwlzdHJ1Y3Qgc2lnYWN0aW9uIG5ld19hY3Rpb247CisJc3RydWN0IGluaXRpYWxfc3ltbGlua19zdHJ1Y3QgKmN1cnI7CisKKwlpZiAoYXJnYyA8IDIpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCWZvciAoY291bnQgPSAyOyBjb3VudCA8IGFyZ2M7ICsrY291bnQpIHsKKwkJaWYgKGFyZ3ZbY291bnRdWzBdID09ICctJykgeworCQkJaWYgKGFyZ3ZbY291bnRdWzFdID09ICd2JyAmJiAhYXJndltjb3VudF1bMl0pIC8qIC12ICovCisJCQkJcHJpbnRfdmVyc2lvbiA9IFRSVUU7CisJCQllbHNlIGlmIChFTkFCTEVfREVWRlNEX0ZHX05QICYmIGFyZ3ZbY291bnRdWzFdID09ICdmJworCQkJICYmIGFyZ3ZbY291bnRdWzJdID09ICdnJyAmJiAhYXJndltjb3VudF1bM10pIC8qIC1mZyAqLworCQkJCWRvX2RhZW1vbiA9IEZBTFNFOworCQkJZWxzZSBpZiAoRU5BQkxFX0RFVkZTRF9GR19OUCAmJiBhcmd2W2NvdW50XVsxXSA9PSAnbicKKwkJCSAmJiBhcmd2W2NvdW50XVsyXSA9PSAncCcgJiYgIWFyZ3ZbY291bnRdWzNdKSAvKiAtbnAgKi8KKwkJCQlub19wb2xsaW5nID0gVFJVRTsKKwkJCWVsc2UKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKwl9CisKKwltb3VudF9wb2ludCA9IGJiX3NpbXBsaWZ5X3BhdGgoYXJndlsxXSk7CisKKwl4Y2hkaXIobW91bnRfcG9pbnQpOworCisJZmQgPSB4b3BlbigiLmRldmZzZCIsIE9fUkRPTkxZKTsKKwljbG9zZV9vbl9leGVjX29uKGZkKTsKKwl4aW9jdGwoZmQsIERFVkZTRElPQ19HRVRfUFJPVE9fUkVWLCAmcHJvdG9fcmV2KTsKKworCS8qc2V0dXAgaW5pdGlhbCBlbnRyaWVzICovCisJZm9yIChjdXJyID0gaW5pdGlhbF9zeW1saW5rczsgY3Vyci0+ZGVzdCAhPSBOVUxMOyArK2N1cnIpCisJCXN5bWxpbmsoY3Vyci0+ZGVzdCwgY3Vyci0+bmFtZSk7CisKKwkvKiBOQjogVGhlIGNoZWNrIGZvciBDT05GSUdfRklMRSBpcyBkb25lIGluIHJlYWRfY29uZmlnX2ZpbGUoKSAqLworCisJaWYgKHByaW50X3ZlcnNpb24gfHwgKERFVkZTRF9QUk9UT0NPTF9SRVZJU0lPTl9EQUVNT04gIT0gcHJvdG9fcmV2KSkgeworCQlwcmludGYoIiVzIHYlc1xuRGFlbW9uICVzOlx0JWRcbktlcm5lbC1zaWRlICVzOlx0JWRcbiIsCisJCQkJYXBwbGV0X25hbWUsIERFVkZTRF9WRVJTSU9OLCBiYl9tc2dfcHJvdG9fcmV2LAorCQkJCURFVkZTRF9QUk9UT0NPTF9SRVZJU0lPTl9EQUVNT04sIGJiX21zZ19wcm90b19yZXYsIHByb3RvX3Jldik7CisJCWlmIChERVZGU0RfUFJPVE9DT0xfUkVWSVNJT05fREFFTU9OICE9IHByb3RvX3JldikKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyBtaXNtYXRjaCEiLCBiYl9tc2dfcHJvdG9fcmV2KTsKKwkJZXhpdChFWElUX1NVQ0NFU1MpOyAvKiAtdiAqLworCX0KKwkvKiAgVGVsbCBrZXJuZWwgd2UgYXJlIHNwZWNpYWwoaS5lLiB3ZSBnZXQgdG8gc2VlIGhpZGRlbiBlbnRyaWVzKSAgKi8KKwl4aW9jdGwoZmQsIERFVkZTRElPQ19TRVRfRVZFTlRfTUFTSywgMCk7CisKKwkvKiAgU2V0IHVwIFNJR0hVUCBhbmQgU0lHVVNSMSBoYW5kbGVycyAgKi8KKwlzaWdlbXB0eXNldCgmbmV3X2FjdGlvbi5zYV9tYXNrKTsKKwluZXdfYWN0aW9uLnNhX2ZsYWdzID0gMDsKKwluZXdfYWN0aW9uLnNhX2hhbmRsZXIgPSBzaWduYWxfaGFuZGxlcjsKKwlzaWdhY3Rpb25fc2V0KFNJR0hVUCwgJm5ld19hY3Rpb24pOworCXNpZ2FjdGlvbl9zZXQoU0lHVVNSMSwgJm5ld19hY3Rpb24pOworCisJcHJpbnRmKCIlcyB2JXMgc3RhcnRlZCBmb3IgJXNcbiIsIGFwcGxldF9uYW1lLCBERVZGU0RfVkVSU0lPTiwgbW91bnRfcG9pbnQpOworCisJLyogIFNldCB1bWFzayBzbyB0aGF0IG1rbm9kKDIpLCBvcGVuKDIpIGFuZCBta2RpcigyKSBoYXZlIGNvbXBsZXRlIGNvbnRyb2wgb3ZlciBwZXJtaXNzaW9ucyAgKi8KKwl1bWFzaygwKTsKKwlyZWFkX2NvbmZpZ19maWxlKChjaGFyKilDT05GSUdfRklMRSwgRkFMU0UsICZldmVudF9tYXNrKTsKKwkvKiAgRG8gdGhlIHNjYW4gYmVmb3JlIGZvcmtpbmcsIHNvIHRoYXQgYm9vdCBzY3JpcHRzIHNlZSB0aGUgZmluaXNoZWQgcHJvZHVjdCAgKi8KKwlkaXJfb3BlcmF0aW9uKFNFUlZJQ0UsIG1vdW50X3BvaW50LCAwLCBOVUxMKTsKKworCWlmIChFTkFCTEVfREVWRlNEX0ZHX05QICYmIG5vX3BvbGxpbmcpCisJCWV4aXQoRVhJVF9TVUNDRVNTKTsKKworCWlmIChFTkFCTEVfREVWRlNEX1ZFUkJPU0UgfHwgRU5BQkxFX0RFQlVHKQorCQlsb2dtb2RlID0gTE9HTU9ERV9CT1RIOworCWVsc2UgaWYgKGRvX2RhZW1vbiA9PSBUUlVFKQorCQlsb2dtb2RlID0gTE9HTU9ERV9TWVNMT0c7CisJLyogVGhpcyBpcyB0aGUgZGVmYXVsdCAqLworCS8qZWxzZQorCQlsb2dtb2RlID0gTE9HTU9ERV9TVERJTzsgKi8KKworCWlmIChkb19kYWVtb24pIHsKKwkJLyogIFJlbGVhc2Ugc28gdGhhdCB0aGUgY2hpbGQgY2FuIGdyYWIgaXQgICovCisJCXhpb2N0bChmZCwgREVWRlNESU9DX1JFTEVBU0VfRVZFTlRfUVVFVUUsIDApOworCQliYl9kYWVtb25pemVfb3JfcmV4ZWMoMCwgYXJndik7CisJfSBlbHNlIGlmIChFTkFCTEVfREVWRlNEX0ZHX05QKSB7CisJCXNldHBnaWQoMCwgMCk7ICAvKiAgQmVjb21lIHByb2Nlc3MgZ3JvdXAgbGVhZGVyICAgICAgICAgICAgICAgICAgICAqLworCX0KKworCXdoaWxlIChUUlVFKSB7CisJCWRvX3NjYW4gPSBkb19zZXJ2aWNpbmcoZmQsIGV2ZW50X21hc2spOworCisJCWZyZWVfY29uZmlnKCk7CisJCXJlYWRfY29uZmlnX2ZpbGUoKGNoYXIqKUNPTkZJR19GSUxFLCBGQUxTRSwgJmV2ZW50X21hc2spOworCQlpZiAoZG9fc2NhbikKKwkJCWRpcl9vcGVyYXRpb24oU0VSVklDRSwgbW91bnRfcG9pbnQsIDAsIE5VTEwpOworCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGZyZWUobW91bnRfcG9pbnQpOworfSAgIC8qICBFbmQgRnVuY3Rpb24gbWFpbiAgKi8KKworCisvKiAgUHJpdmF0ZSBmdW5jdGlvbnMgZm9sbG93ICAqLworCitzdGF0aWMgdm9pZCByZWFkX2NvbmZpZ19maWxlKGNoYXIgKnBhdGgsIGludCBvcHRpb25hbCwgdW5zaWduZWQgbG9uZyAqZXZlbnRfbWFzaykKKy8qICBbU1VNTUFSWV0gUmVhZCBhIGNvbmZpZ3VyYXRpb24gZGF0YWJhc2UuCisgICAgPHBhdGg+IFRoZSBwYXRoIHRvIHJlYWQgdGhlIGRhdGFiYXNlIGZyb20uIElmIHRoaXMgaXMgYSBkaXJlY3RvcnksIGFsbAorICAgIGVudHJpZXMgaW4gdGhhdCBkaXJlY3Rvcnkgd2lsbCBiZSByZWFkKGV4Y2VwdCBoaWRkZW4gZW50cmllcykuCisgICAgPG9wdGlvbmFsPiBJZiBUUlVFLCB0aGUgcm91dGluZSB3aWxsIHNpbGVudGx5IGlnbm9yZSBhIG1pc3NpbmcgY29uZmlnIGZpbGUuCisgICAgPGV2ZW50X21hc2s+IFRoZSBldmVudCBtYXNrIGlzIHdyaXR0ZW4gaGVyZS4gVGhpcyBpcyBub3QgaW5pdGlhbGlzZWQuCisgICAgW1JFVFVSTlNdIE5vdGhpbmcuCisqLworeworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJRklMRSAqZnA7CisJY2hhciBidWZbU1RSSU5HX0xFTkdUSF07CisJY2hhciAqbGluZSA9IE5VTEw7CisJY2hhciAqcDsKKworCWlmIChzdGF0KHBhdGgsICZzdGF0YnVmKSA9PSAwKSB7CisJCS8qIERvbid0IHJlYWQgMCBsZW5ndGggZmlsZXM6IGlnbm9yZWQgKi8KKwkJLyppZiAoc3RhdGJ1Zi5zdF9zaXplID09IDApCisJCQkJcmV0dXJuOyovCisJCWlmIChTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkpIHsKKwkJCXAgPSBiYl9zaW1wbGlmeV9wYXRoKHBhdGgpOworCQkJZGlyX29wZXJhdGlvbihSRUFEX0NPTkZJRywgcCwgMCwgZXZlbnRfbWFzayk7CisJCQlmcmVlKHApOworCQkJcmV0dXJuOworCQl9CisJCWZwID0gZm9wZW5fZm9yX3JlYWQocGF0aCk7CisJCWlmIChmcCAhPSBOVUxMKSB7CisJCQl3aGlsZSAoZmdldHMoYnVmLCBTVFJJTkdfTEVOR1RILCBmcCkgIT0gTlVMTCkgeworCQkJCS8qICBTa2lwIHdoaXRlc3BhY2UgICovCisJCQkJbGluZSA9IGJ1ZjsKKwkJCQlsaW5lID0gc2tpcF93aGl0ZXNwYWNlKGxpbmUpOworCQkJCWlmIChsaW5lWzBdID09ICdcMCcgfHwgbGluZVswXSA9PSAnIycpCisJCQkJCWNvbnRpbnVlOworCQkJCXByb2Nlc3NfY29uZmlnX2xpbmUobGluZSwgZXZlbnRfbWFzayk7CisJCQl9CisJCQlmY2xvc2UoZnApOworCQl9IGVsc2UgeworCQkJZ290byByZWFkX2NvbmZpZ19maWxlX2VycjsKKwkJfQorCX0gZWxzZSB7CityZWFkX2NvbmZpZ19maWxlX2VycjoKKwkJaWYgKG9wdGlvbmFsID09IDAgJiYgZXJybm8gPT0gRU5PRU5UKQorCQkJZXJyb3JfbG9nZ2VyX2FuZF9kaWUoTE9HX0VSUiwgInJlYWQgY29uZmlnIGZpbGU6ICVzIiwgcGF0aCk7CisJfQorfSAgIC8qICBFbmQgRnVuY3Rpb24gcmVhZF9jb25maWdfZmlsZSAgICovCisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfY29uZmlnX2xpbmUoY29uc3QgY2hhciAqbGluZSwgdW5zaWduZWQgbG9uZyAqZXZlbnRfbWFzaykKKy8qICBbU1VNTUFSWV0gUHJvY2VzcyBhIGxpbmUgZnJvbSBhIGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICA8bGluZT4gVGhlIGNvbmZpZ3VyYXRpb24gbGluZS4KKyAgICA8ZXZlbnRfbWFzaz4gVGhlIGV2ZW50IG1hc2sgaXMgd3JpdHRlbiBoZXJlLiBUaGlzIGlzIG5vdCBpbml0aWFsaXNlZC4KKyAgICBbUkVUVVJOU10gTm90aGluZy4KKyovCit7CisJaW50ICBudW1fYXJncywgY291bnQ7CisJc3RydWN0IGNvbmZpZ19lbnRyeV9zdHJ1Y3QgKm5ldzsKKwljaGFyIHBbTUFYX0FSR1NdW1NUUklOR19MRU5HVEhdOworCWNoYXIgd2hlbltTVFJJTkdfTEVOR1RIXSwgd2hhdFtTVFJJTkdfTEVOR1RIXTsKKwljaGFyIG5hbWVbU1RSSU5HX0xFTkdUSF07CisJY29uc3QgY2hhciAqbXNnID0gIiI7CisJY2hhciAqcHRyOworCWludCBpOworCisJLyogISEhISBPbmx5IFVwcGVyY2FzZSBLZXl3b3JkcyBpbiBkZXZzZmQuY29uZiAqLworCXN0YXRpYyBjb25zdCBjaGFyIG9wdGlvbnNbXSBBTElHTjEgPQorCQkiQ0xFQVJfQ09ORklHXDAiIklOQ0xVREVcMCIiT1BUSU9OQUxfSU5DTFVERVwwIgorCQkiUkVTVE9SRVwwIiJQRVJNSVNTSU9OU1wwIiJNT0RMT0FEXDAiIkVYRUNVVEVcMCIKKwkJIkNPUFlcMCIiSUdOT1JFXDAiIk1LT0xEQ09NUEFUXDAiIk1LTkVXQ09NUEFUXDAiCisJCSJSTU9MRENPTVBBVFwwIiJSTU5FV0NPTVBBVFwwIjsKKworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IE1BWF9BUkdTOyArK2NvdW50KQorCQlwW2NvdW50XVswXSA9ICdcMCc7CisJbnVtX2FyZ3MgPSBzc2NhbmYobGluZSwgIiVzICVzICVzICVzICVzICVzICVzICVzICVzICVzIiwKKwkJCXdoZW4sIG5hbWUsIHdoYXQsCisJCQlwWzBdLCBwWzFdLCBwWzJdLCBwWzNdLCBwWzRdLCBwWzVdLCBwWzZdKTsKKworCWkgPSBpbmRleF9pbl9zdHJpbmdzKG9wdGlvbnMsIHdoZW4pOworCisJLyogIkNMRUFSX0NPTkZJRyIgKi8KKwlpZiAoaSA9PSAwKSB7CisJCWZyZWVfY29uZmlnKCk7CisJCSpldmVudF9tYXNrID0gMDsKKwkJcmV0dXJuOworCX0KKworCWlmIChudW1fYXJncyA8IDIpCisJCWdvdG8gcHJvY2Vzc19jb25maWdfbGluZV9lcnI7CisKKwkvKiAiSU5DTFVERSIgJiAiT1BUSU9OQUxfSU5DTFVERSIgKi8KKwlpZiAoaSA9PSAxIHx8IGkgPT0gMikgeworCQlzdF9leHByX2V4cGFuZChuYW1lLCBTVFJJTkdfTEVOR1RILCBuYW1lLCBnZXRfdmFyaWFibGUsIE5VTEwpOworCQlpbmZvX2xvZ2dlcihMT0dfSU5GTywgIiVzaW5jbHVkZTogJXMiLCAodG91cHBlcih3aGVuWzBdKSA9PSAnSScpID8gIiI6ICJvcHRpb25hbF8iLCBuYW1lKTsKKwkJcmVhZF9jb25maWdfZmlsZShuYW1lLCAodG91cHBlcih3aGVuWzBdKSA9PSAnSScpID8gRkFMU0UgOiBUUlVFLCBldmVudF9tYXNrKTsKKwkJcmV0dXJuOworCX0KKwkvKiAiUkVTVE9SRSIgKi8KKwlpZiAoaSA9PSAzKSB7CisJCWRpcl9vcGVyYXRpb24oUkVTVE9SRSwgbmFtZSwgc3RybGVuKG5hbWUpLE5VTEwpOworCQlyZXR1cm47CisJfQorCWlmIChudW1fYXJncyA8IDMpCisJCWdvdG8gcHJvY2Vzc19jb25maWdfbGluZV9lcnI7CisKKwluZXcgPSB4emFsbG9jKHNpemVvZiAqbmV3KTsKKworCWZvciAoY291bnQgPSAwOyBldmVudF90eXBlc1tjb3VudF0uY29uZmlnX25hbWUgIT0gTlVMTDsgKytjb3VudCkgeworCQlpZiAoc3RyY2FzZWNtcCh3aGVuLCBldmVudF90eXBlc1tjb3VudF0uY29uZmlnX25hbWUpICE9IDApCisJCQljb250aW51ZTsKKwkJbmV3LT5hY3Rpb24ud2hlbiA9IGV2ZW50X3R5cGVzW2NvdW50XS50eXBlOworCQlicmVhazsKKwl9CisJaWYgKGV2ZW50X3R5cGVzW2NvdW50XS5jb25maWdfbmFtZSA9PSBOVUxMKSB7CisJCW1zZyA9ICJXSEVOIGluIjsKKwkJZ290byBwcm9jZXNzX2NvbmZpZ19saW5lX2VycjsKKwl9CisKKwlpID0gaW5kZXhfaW5fc3RyaW5ncyhvcHRpb25zLCB3aGF0KTsKKworCXN3aXRjaCAoaSkgeworCQljYXNlIDQ6CS8qICJQRVJNSVNTSU9OUyIgKi8KKwkJCW5ldy0+YWN0aW9uLndoYXQgPSBBQ19QRVJNSVNTSU9OUzsKKwkJCS8qICBHZXQgdXNlciBhbmQgZ3JvdXAgICovCisJCQlwdHIgPSBzdHJjaHIocFswXSwgJy4nKTsKKwkJCWlmIChwdHIgPT0gTlVMTCkgeworCQkJCW1zZyA9ICJVSUQuR0lEIjsKKwkJCQlnb3RvIHByb2Nlc3NfY29uZmlnX2xpbmVfZXJyOyAvKiJtaXNzaW5nICcuJyBpbiBVSUQuR0lEIiovCisJCQl9CisKKwkJCSpwdHIrKyA9ICdcMCc7CisJCQluZXctPnUucGVybWlzc2lvbnMudWlkID0gZ2V0X3VpZF9naWQoVUlELCBwWzBdKTsKKwkJCW5ldy0+dS5wZXJtaXNzaW9ucy5naWQgPSBnZXRfdWlkX2dpZChHSUQsIHB0cik7CisJCQkvKiAgR2V0IG1vZGUgICovCisJCQluZXctPnUucGVybWlzc2lvbnMubW9kZSA9IGdldF9tb2RlKHBbMV0pOworCQkJYnJlYWs7CisJCWNhc2UgNToJLyogIE1PRExPQUQgKi8KKwkJCS8qVGhpcyAgYWN0aW9uIHdpbGwgcGFzcyAiL2Rldi8kZGV2bmFtZSIoaS5lLiAiL2Rldi8iIHByZWZpeGVkIHRvCisJCQl0aGUgZGV2aWNlIG5hbWUpIHRvIHRoZSBtb2R1bGUgbG9hZGluZyAgZmFjaWxpdHkuICBJbiAgYWRkaXRpb24sCisJCQl0aGUgL2V0Yy9tb2R1bGVzLmRldmZzIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyB1c2VkLiovCisJCQlpZiAoRU5BQkxFX0RFVkZTRF9NT0RMT0FEKQorCQkJCW5ldy0+YWN0aW9uLndoYXQgPSBBQ19NT0RMT0FEOworCQkJYnJlYWs7CisJCWNhc2UgNjogLyogRVhFQ1VURSAqLworCQkJbmV3LT5hY3Rpb24ud2hhdCA9IEFDX0VYRUNVVEU7CisJCQludW1fYXJncyAtPSAzOworCisJCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBudW1fYXJnczsgKytjb3VudCkKKwkJCQluZXctPnUuZXhlY3V0ZS5hcmd2W2NvdW50XSA9IHhzdHJkdXAocFtjb3VudF0pOworCisJCQluZXctPnUuZXhlY3V0ZS5hcmd2W251bV9hcmdzXSA9IE5VTEw7CisJCQlicmVhazsKKwkJY2FzZSA3OiAvKiBDT1BZICovCisJCQluZXctPmFjdGlvbi53aGF0ID0gQUNfQ09QWTsKKwkJCW51bV9hcmdzIC09IDM7CisJCQlpZiAobnVtX2FyZ3MgIT0gMikKKwkJCQlnb3RvIHByb2Nlc3NfY29uZmlnX2xpbmVfZXJyOyAvKiBtaXNzaW5nIHBhdGggYW5kIGZ1bmN0aW9uIGluIGxpbmUgKi8KKworCQkJbmV3LT51LmNvcHkuc291cmNlID0geHN0cmR1cChwWzBdKTsKKwkJCW5ldy0+dS5jb3B5LmRlc3RpbmF0aW9uID0geHN0cmR1cChwWzFdKTsKKwkJCWJyZWFrOworCQljYXNlIDg6IC8qIElHTk9SRSAqLworCQkvKiBGQUxMVFJPVUdIICovCisJCWNhc2UgOTogLyogTUtPTERDT01QQVQgKi8KKwkJLyogRkFMTFRST1VHSCAqLworCQljYXNlIDEwOiAvKiBNS05FV0NPTVBBVCAqLworCQkvKiBGQUxMVFJPVUdIICovCisJCWNhc2UgMTE6LyogUk1PTERDT01QQVQgKi8KKwkJLyogRkFMTFRST1VHSCAqLworCQljYXNlIDEyOiAvKiBSTU5FV0NPTVBBVCAqLworCQkvKglBQ19JR05PUkUJCQkJCTYKKwkJCUFDX01LT0xEQ09NUEFUCQkJCTcKKwkJCUFDX01LTkVXQ09NUEFUCQkJCTgKKwkJCUFDX1JNT0xEQ09NUEFUCQkJCTkKKwkJCUFDX1JNTkVXQ09NUEFUCQkJCTEwKi8KKwkJCW5ldy0+YWN0aW9uLndoYXQgPSBpIC0gMjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJbXNnID0gIldIQVQgaW4iOworCQkJZ290byBwcm9jZXNzX2NvbmZpZ19saW5lX2VycjsKKwkJLyplc2FjKi8KKwl9IC8qIHN3aXRjaCAoaSkgKi8KKworCXhyZWdjb21wKCZuZXctPnByZWcsIG5hbWUsIFJFR19FWFRFTkRFRCk7CisKKwkqZXZlbnRfbWFzayB8PSAxIDw8IG5ldy0+YWN0aW9uLndoZW47CisJbmV3LT5uZXh0ID0gTlVMTDsKKwlpZiAoZmlyc3RfY29uZmlnID09IE5VTEwpCisJCWZpcnN0X2NvbmZpZyA9IG5ldzsKKwllbHNlCisJCWxhc3RfY29uZmlnLT5uZXh0ID0gbmV3OworCWxhc3RfY29uZmlnID0gbmV3OworCXJldHVybjsKKworIHByb2Nlc3NfY29uZmlnX2xpbmVfZXJyOgorCW1zZ19sb2dnZXJfYW5kX2RpZShMT0dfRVJSLCBiYl9tc2dfYmFkX2NvbmZpZywgbXNnICwgbGluZSk7Cit9ICAvKiAgRW5kIEZ1bmN0aW9uIHByb2Nlc3NfY29uZmlnX2xpbmUgICAqLworCitzdGF0aWMgaW50IGRvX3NlcnZpY2luZyhpbnQgZmQsIHVuc2lnbmVkIGxvbmcgZXZlbnRfbWFzaykKKy8qICBbU1VNTUFSWV0gU2VydmljZSBkZXZmcyBjaGFuZ2VzIHVudGlsIGEgc2lnbmFsIGlzIHJlY2VpdmVkLgorICAgIDxmZD4gVGhlIG9wZW4gY29udHJvbCBmaWxlLgorICAgIDxldmVudF9tYXNrPiBUaGUgZXZlbnQgbWFzay4KKyAgICBbUkVUVVJOU10gVFJVRSBpZiBTSUdIVVAgd2FzIGNhdWdodCwgZWxzZSBGQUxTRS4KKyovCit7CisJc3NpemVfdCBieXRlczsKKwlzdHJ1Y3QgZGV2ZnNkX25vdGlmeV9zdHJ1Y3QgaW5mbzsKKworCS8qICh2b2lkKikgY2FzdCBpcyBvbmx5IGluIG9yZGVyIHRvIG1hdGNoIHByb3RvdHlwZSAqLworCXhpb2N0bChmZCwgREVWRlNESU9DX1NFVF9FVkVOVF9NQVNLLCAodm9pZCopZXZlbnRfbWFzayk7CisJd2hpbGUgKCFjYXVnaHRfc2lnbmFsKSB7CisJCWVycm5vID0gMDsKKwkJYnl0ZXMgPSByZWFkKGZkLCAoY2hhciAqKSAmaW5mbywgc2l6ZW9mIGluZm8pOworCQlpZiAoY2F1Z2h0X3NpZ25hbCkKKwkJCWJyZWFrOyAgICAgIC8qICBNdXN0IHRlc3QgZm9yIHRoaXMgZmlyc3QgICAgICovCisJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCWNvbnRpbnVlOyAgLyogIFllcywgdGhlIG9yZGVyIGlzIGltcG9ydGFudCAgKi8KKwkJaWYgKGJ5dGVzIDwgMSkKKwkJCWJyZWFrOworCQlzZXJ2aWNlX25hbWUoJmluZm8pOworCX0KKwlpZiAoY2F1Z2h0X3NpZ25hbCkgeworCQlpbnQgY19zaWdodXAgPSBjYXVnaHRfc2lnaHVwOworCisJCWNhdWdodF9zaWduYWwgPSBGQUxTRTsKKwkJY2F1Z2h0X3NpZ2h1cCA9IEZBTFNFOworCQlyZXR1cm4gY19zaWdodXA7CisJfQorCW1zZ19sb2dnZXJfYW5kX2RpZShMT0dfRVJSLCAicmVhZCBlcnJvciBvbiBjb250cm9sIGZpbGUiKTsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIGRvX3NlcnZpY2luZyAgKi8KKworc3RhdGljIHZvaWQgc2VydmljZV9uYW1lKGNvbnN0IHN0cnVjdCBkZXZmc2Rfbm90aWZ5X3N0cnVjdCAqaW5mbykKKy8qICBbU1VNTUFSWV0gU2VydmljZSBhIHNpbmdsZSBkZXZmcyBjaGFuZ2UuCisgICAgPGluZm8+IFRoZSBkZXZmcyBjaGFuZ2UuCisgICAgW1JFVFVSTlNdIE5vdGhpbmcuCisqLworeworCXVuc2lnbmVkIGludCBuOworCXJlZ21hdGNoX3QgbWJ1ZltNQVhfU1VCRVhQUl07CisJc3RydWN0IGNvbmZpZ19lbnRyeV9zdHJ1Y3QgKmVudHJ5OworCisJaWYgKEVOQUJMRV9ERUJVRyAmJiBpbmZvLT5vdmVycnVuX2NvdW50ID4gMCkKKwkJbXNnX2xvZ2dlcihMT0dfRVJSLCAibG9zdCAldSBldmVudHMiLCBpbmZvLT5vdmVycnVuX2NvdW50KTsKKworCS8qICBEaXNjYXJkIGxvb2t1cHMgb24gIi9kZXYvbG9nIiBhbmQgIi9kZXYvaW5pdGN0bCIgICovCisJaWYgKGluZm8tPnR5cGUgPT0gREVWRlNEX05PVElGWV9MT09LVVAKKwkJJiYgKChpbmZvLT5kZXZuYW1lWzBdID09ICdsJyAmJiBpbmZvLT5kZXZuYW1lWzFdID09ICdvJworCQkmJiBpbmZvLT5kZXZuYW1lWzJdID09ICdnJyAmJiAhaW5mby0+ZGV2bmFtZVszXSkKKwkJfHwgKGluZm8tPmRldm5hbWVbMF0gPT0gJ2knICYmIGluZm8tPmRldm5hbWVbMV0gPT0gJ24nCisJCSYmIGluZm8tPmRldm5hbWVbMl0gPT0gJ2knICYmIGluZm8tPmRldm5hbWVbM10gPT0gJ3QnCisJCSYmIGluZm8tPmRldm5hbWVbNF0gPT0gJ2MnICYmIGluZm8tPmRldm5hbWVbNV0gPT0gJ3QnCisJCSYmIGluZm8tPmRldm5hbWVbNl0gPT0gJ2wnICYmICFpbmZvLT5kZXZuYW1lWzddKSkKKwkpCisJCXJldHVybjsKKworCWZvciAoZW50cnkgPSBmaXJzdF9jb25maWc7IGVudHJ5ICE9IE5VTEw7IGVudHJ5ID0gZW50cnktPm5leHQpIHsKKwkJLyogIEZpcnN0IGNoZWNrIGlmIGFjdGlvbiBtYXRjaGVzIHRoZSB0eXBlLCB0aGVuIGNoZWNrIGlmIG5hbWUgbWF0Y2hlcyAqLworCQlpZiAoaW5mby0+dHlwZSAhPSBlbnRyeS0+YWN0aW9uLndoZW4KKwkJfHwgcmVnZXhlYygmZW50cnktPnByZWcsIGluZm8tPmRldm5hbWUsIE1BWF9TVUJFWFBSLCBtYnVmLCAwKSAhPSAwKQorCQkJY29udGludWU7CisJCWZvciAobiA9IDA7KG4gPCBNQVhfU1VCRVhQUikgJiYgKG1idWZbbl0ucm1fc28gIT0gLTEpOyArK24pCisJCQkvKiBWT0lEICovOworCisJCXN3aXRjaCAoZW50cnktPmFjdGlvbi53aGF0KSB7CisJCQljYXNlIEFDX1BFUk1JU1NJT05TOgorCQkJCWFjdGlvbl9wZXJtaXNzaW9ucyhpbmZvLCBlbnRyeSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEFDX01PRExPQUQ6CisJCQkJaWYgKEVOQUJMRV9ERVZGU0RfTU9ETE9BRCkKKwkJCQkJYWN0aW9uX21vZGxvYWQoaW5mbywgZW50cnkpOworCQkJCWJyZWFrOworCQkJY2FzZSBBQ19FWEVDVVRFOgorCQkJCWFjdGlvbl9leGVjdXRlKGluZm8sIGVudHJ5LCBtYnVmLCBuKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUNfQ09QWToKKwkJCQlhY3Rpb25fY29weShpbmZvLCBlbnRyeSwgbWJ1Ziwgbik7CisJCQkJYnJlYWs7CisJCQljYXNlIEFDX0lHTk9SRToKKwkJCQlyZXR1cm47CisJCQkJLypicmVhazsqLworCQkJY2FzZSBBQ19NS09MRENPTVBBVDoKKwkJCWNhc2UgQUNfTUtORVdDT01QQVQ6CisJCQljYXNlIEFDX1JNT0xEQ09NUEFUOgorCQkJY2FzZSBBQ19STU5FV0NPTVBBVDoKKwkJCQlhY3Rpb25fY29tcGF0KGluZm8sIGVudHJ5LT5hY3Rpb24ud2hhdCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCW1zZ19sb2dnZXJfYW5kX2RpZShMT0dfRVJSLCAiVW5rbm93biBhY3Rpb24iKTsKKwkJfQorCX0KK30gICAvKiAgRW5kIEZ1bmN0aW9uIHNlcnZpY2VfbmFtZSAgKi8KKworc3RhdGljIHZvaWQgYWN0aW9uX3Blcm1pc3Npb25zKGNvbnN0IHN0cnVjdCBkZXZmc2Rfbm90aWZ5X3N0cnVjdCAqaW5mbywKKwkJCQljb25zdCBzdHJ1Y3QgY29uZmlnX2VudHJ5X3N0cnVjdCAqZW50cnkpCisvKiAgW1NVTU1BUlldIFVwZGF0ZSBwZXJtaXNzaW9ucyBmb3IgYSBkZXZpY2UgZW50cnkuCisgICAgPGluZm8+IFRoZSBkZXZmcyBjaGFuZ2UuCisgICAgPGVudHJ5PiBUaGUgY29uZmlnIGZpbGUgZW50cnkuCisgICAgW1JFVFVSTlNdIE5vdGhpbmcuCisqLworeworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisKKwlpZiAoc3RhdChpbmZvLT5kZXZuYW1lLCAmc3RhdGJ1ZikgIT0gMAorCSB8fCBjaG1vZChpbmZvLT5kZXZuYW1lLCAoc3RhdGJ1Zi5zdF9tb2RlICYgU19JRk1UKSB8IChlbnRyeS0+dS5wZXJtaXNzaW9ucy5tb2RlICYgflNfSUZNVCkpICE9IDAKKwkgfHwgY2hvd24oaW5mby0+ZGV2bmFtZSwgZW50cnktPnUucGVybWlzc2lvbnMudWlkLCBlbnRyeS0+dS5wZXJtaXNzaW9ucy5naWQpICE9IDAKKwkpCisJCWVycm9yX2xvZ2dlcihMT0dfRVJSLCAiQ2FuJ3QgY2htb2Qgb3IgY2hvd246ICVzIiwgaW5mby0+ZGV2bmFtZSk7Cit9ICAgLyogIEVuZCBGdW5jdGlvbiBhY3Rpb25fcGVybWlzc2lvbnMgICovCisKK3N0YXRpYyB2b2lkIGFjdGlvbl9tb2Rsb2FkKGNvbnN0IHN0cnVjdCBkZXZmc2Rfbm90aWZ5X3N0cnVjdCAqaW5mbywKKwkJCWNvbnN0IHN0cnVjdCBjb25maWdfZW50cnlfc3RydWN0ICplbnRyeSBVTlVTRURfUEFSQU0pCisvKiAgW1NVTU1BUlldIExvYWQgYSBtb2R1bGUuCisgICAgPGluZm8+IFRoZSBkZXZmcyBjaGFuZ2UuCisgICAgPGVudHJ5PiBUaGUgY29uZmlnIGZpbGUgZW50cnkuCisgICAgW1JFVFVSTlNdIE5vdGhpbmcuCisqLworeworCWNoYXIgKmFyZ3ZbNl07CisKKwlhcmd2WzBdID0gKGNoYXIqKU1PRFBST0JFOworCWFyZ3ZbMV0gPSAoY2hhciopTU9EUFJPQkVfU1dJVENIXzE7IC8qICItayIgKi8KKwlhcmd2WzJdID0gKGNoYXIqKU1PRFBST0JFX1NXSVRDSF8yOyAvKiAiLUMiICovCisJYXJndlszXSA9IChjaGFyKilDT05GSUdfTU9EVUxFU19ERVZGUzsKKwlhcmd2WzRdID0gY29uY2F0X3BhdGhfZmlsZSgiL2RldiIsIGluZm8tPmRldm5hbWUpOyAvKiBkZXZpY2UgKi8KKwlhcmd2WzVdID0gTlVMTDsKKworCXNwYXduX2FuZF93YWl0KGFyZ3YpOworCWZyZWUoYXJndls0XSk7Cit9ICAvKiAgRW5kIEZ1bmN0aW9uIGFjdGlvbl9tb2Rsb2FkICAqLworCitzdGF0aWMgdm9pZCBhY3Rpb25fZXhlY3V0ZShjb25zdCBzdHJ1Y3QgZGV2ZnNkX25vdGlmeV9zdHJ1Y3QgKmluZm8sCisJCQljb25zdCBzdHJ1Y3QgY29uZmlnX2VudHJ5X3N0cnVjdCAqZW50cnksCisJCQljb25zdCByZWdtYXRjaF90ICpyZWdleHByLCB1bnNpZ25lZCBpbnQgbnVtZXhwcikKKy8qICBbU1VNTUFSWV0gRXhlY3V0ZSBhIHByb2dyYW1tZS4KKyAgICA8aW5mbz4gVGhlIGRldmZzIGNoYW5nZS4KKyAgICA8ZW50cnk+IFRoZSBjb25maWcgZmlsZSBlbnRyeS4KKyAgICA8cmVnZXhwcj4gVGhlIG51bWJlciBvZiBzdWJleHByZXNzaW9uKHN0YXJ0LCBlbmQpIG9mZnNldHMgd2l0aGluIHRoZQorICAgIGRldmljZSBuYW1lLgorICAgIDxudW1leHByPiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHdpdGhpbiA8PHJlZ2V4cHI+Pi4KKyAgICBbUkVUVVJOU10gTm90aGluZy4KKyovCit7CisJdW5zaWduZWQgaW50IGNvdW50OworCXN0cnVjdCBnZXRfdmFyaWFibGVfaW5mbyBndl9pbmZvOworCWNoYXIgKmFyZ3ZbTUFYX0FSR1MgKyAxXTsKKwljaGFyIGxhcmd2W01BWF9BUkdTICsgMV1bU1RSSU5HX0xFTkdUSF07CisKKwlndl9pbmZvLmluZm8gPSBpbmZvOworCWd2X2luZm8uZGV2bmFtZSA9IGluZm8tPmRldm5hbWU7CisJc25wcmludGYoZ3ZfaW5mby5kZXZwYXRoLCBzaXplb2YoZ3ZfaW5mby5kZXZwYXRoKSwgIiVzLyVzIiwgbW91bnRfcG9pbnQsIGluZm8tPmRldm5hbWUpOworCWZvciAoY291bnQgPSAwOyBlbnRyeS0+dS5leGVjdXRlLmFyZ3ZbY291bnRdICE9IE5VTEw7ICsrY291bnQpIHsKKwkJZXhwYW5kX2V4cHJlc3Npb24obGFyZ3ZbY291bnRdLCBTVFJJTkdfTEVOR1RILAorCQkJCWVudHJ5LT51LmV4ZWN1dGUuYXJndltjb3VudF0sCisJCQkJZ2V0X3ZhcmlhYmxlLCAmZ3ZfaW5mbywKKwkJCQlndl9pbmZvLmRldm5hbWUsIHJlZ2V4cHIsIG51bWV4cHIpOworCQlhcmd2W2NvdW50XSA9IGxhcmd2W2NvdW50XTsKKwl9CisJYXJndltjb3VudF0gPSBOVUxMOworCXNwYXduX2FuZF93YWl0KGFyZ3YpOworfSAgIC8qICBFbmQgRnVuY3Rpb24gYWN0aW9uX2V4ZWN1dGUgICovCisKKworc3RhdGljIHZvaWQgYWN0aW9uX2NvcHkoY29uc3Qgc3RydWN0IGRldmZzZF9ub3RpZnlfc3RydWN0ICppbmZvLAorCQkJY29uc3Qgc3RydWN0IGNvbmZpZ19lbnRyeV9zdHJ1Y3QgKmVudHJ5LAorCQkJY29uc3QgcmVnbWF0Y2hfdCAqcmVnZXhwciwgdW5zaWduZWQgaW50IG51bWV4cHIpCisvKiAgW1NVTU1BUlldIENvcHkgcGVybWlzc2lvbnMuCisgICAgPGluZm8+IFRoZSBkZXZmcyBjaGFuZ2UuCisgICAgPGVudHJ5PiBUaGUgY29uZmlnIGZpbGUgZW50cnkuCisgICAgPHJlZ2V4cHI+IFRoaXMgbGlzdCBvZiBzdWJleHByZXNzaW9uKHN0YXJ0LCBlbmQpIG9mZnNldHMgd2l0aGluIHRoZQorICAgIGRldmljZSBuYW1lLgorICAgIDxudW1leHByPiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIDw8cmVnZXhwcj4+LgorICAgIFtSRVRVUk5TXSBOb3RoaW5nLgorKi8KK3sKKwltb2RlX3QgbmV3X21vZGU7CisJc3RydWN0IGdldF92YXJpYWJsZV9pbmZvIGd2X2luZm87CisJc3RydWN0IHN0YXQgc291cmNlX3N0YXQsIGRlc3Rfc3RhdDsKKwljaGFyIHNvdXJjZVtTVFJJTkdfTEVOR1RIXSwgZGVzdGluYXRpb25bU1RSSU5HX0xFTkdUSF07CisJaW50IHJldCA9IDA7CisKKwlkZXN0X3N0YXQuc3RfbW9kZSA9IDA7CisKKwlpZiAoKGluZm8tPnR5cGUgPT0gREVWRlNEX05PVElGWV9DSEFOR0UpICYmIFNfSVNMTksoaW5mby0+bW9kZSkpCisJCXJldHVybjsKKwlndl9pbmZvLmluZm8gPSBpbmZvOworCWd2X2luZm8uZGV2bmFtZSA9IGluZm8tPmRldm5hbWU7CisKKwlzbnByaW50Zihndl9pbmZvLmRldnBhdGgsIHNpemVvZihndl9pbmZvLmRldnBhdGgpLCAiJXMvJXMiLCBtb3VudF9wb2ludCwgaW5mby0+ZGV2bmFtZSk7CisJZXhwYW5kX2V4cHJlc3Npb24oc291cmNlLCBTVFJJTkdfTEVOR1RILCBlbnRyeS0+dS5jb3B5LnNvdXJjZSwKKwkJCQlnZXRfdmFyaWFibGUsICZndl9pbmZvLCBndl9pbmZvLmRldm5hbWUsCisJCQkJcmVnZXhwciwgbnVtZXhwcik7CisKKwlleHBhbmRfZXhwcmVzc2lvbihkZXN0aW5hdGlvbiwgU1RSSU5HX0xFTkdUSCwgZW50cnktPnUuY29weS5kZXN0aW5hdGlvbiwKKwkJCQlnZXRfdmFyaWFibGUsICZndl9pbmZvLCBndl9pbmZvLmRldm5hbWUsCisJCQkJcmVnZXhwciwgbnVtZXhwcik7CisKKwlpZiAoIW1ha2VfZGlyX3RyZWUoZGVzdGluYXRpb24pIHx8IGxzdGF0KHNvdXJjZSwgJnNvdXJjZV9zdGF0KSAhPSAwKQorCQkJcmV0dXJuOworCWxzdGF0KGRlc3RpbmF0aW9uLCAmZGVzdF9zdGF0KTsKKwluZXdfbW9kZSA9IHNvdXJjZV9zdGF0LnN0X21vZGUgJiB+U19JU1ZUWDsKKwlpZiAoaW5mby0+dHlwZSA9PSBERVZGU0RfTk9USUZZX0NSRUFURSkKKwkJbmV3X21vZGUgfD0gU19JU1ZUWDsKKwllbHNlIGlmICgoaW5mby0+dHlwZSA9PSBERVZGU0RfTk9USUZZX0NIQU5HRSkgJiYoZGVzdF9zdGF0LnN0X21vZGUgJiBTX0lTVlRYKSkKKwkJbmV3X21vZGUgfD0gU19JU1ZUWDsKKwlyZXQgPSBjb3B5X2lub2RlKGRlc3RpbmF0aW9uLCAmZGVzdF9zdGF0LCBuZXdfbW9kZSwgc291cmNlLCAmc291cmNlX3N0YXQpOworCWlmIChFTkFCTEVfREVCVUcgJiYgcmV0ICYmIChlcnJubyAhPSBFRVhJU1QpKQorCQllcnJvcl9sb2dnZXIoTE9HX0VSUiwgImNvcHlfaW5vZGU6ICVzIHRvICVzIiwgc291cmNlLCBkZXN0aW5hdGlvbik7Cit9ICAgLyogIEVuZCBGdW5jdGlvbiBhY3Rpb25fY29weSAgKi8KKworc3RhdGljIHZvaWQgYWN0aW9uX2NvbXBhdChjb25zdCBzdHJ1Y3QgZGV2ZnNkX25vdGlmeV9zdHJ1Y3QgKmluZm8sIHVuc2lnbmVkIGludCBhY3Rpb24pCisvKiAgW1NVTU1BUlldIFByb2Nlc3MgYSBjb21wYXRpYmlsaXR5IHJlcXVlc3QuCisgICAgPGluZm8+IFRoZSBkZXZmcyBjaGFuZ2UuCisgICAgPGFjdGlvbj4gVGhlIGFjdGlvbiB0byB0YWtlLgorICAgIFtSRVRVUk5TXSBOb3RoaW5nLgorKi8KK3sKKwlpbnQgcmV0OworCWNvbnN0IGNoYXIgKmNvbXBhdF9uYW1lID0gTlVMTDsKKwljb25zdCBjaGFyICpkZXN0X25hbWUgPSBpbmZvLT5kZXZuYW1lOworCWNvbnN0IGNoYXIgKnB0cjsKKwljaGFyIGNvbXBhdF9idWZbU1RSSU5HX0xFTkdUSF0sIGRlc3RfYnVmW1NUUklOR19MRU5HVEhdOworCWludCBtb2RlLCBob3N0LCBidXMsIHRhcmdldCwgbHVuOworCXVuc2lnbmVkIGludCBpOworCWNoYXIgcmV3aW5kXzsKKwkvKiAxIHRvIDUgICJzY3NpLyIgLCA2IHRvIDkgImlkZS9ob3N0IiAqLworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmbXRbXSA9IHsKKwkJTlVMTCAsCisJCSJzZy9jJWRiJWR0JWR1JWQiLAkJLyogc2NzaS9nZW5lcmljICovCisJCSJzZC9jJWRiJWR0JWR1JWQiLAkJLyogc2NzaS9kaXNjICovCisJCSJzci9jJWRiJWR0JWR1JWQiLAkJLyogc2NzaS9jZCAqLworCQkic2QvYyVkYiVkdCVkdSVkcCVkIiwJCS8qIHNjc2kvcGFydCAqLworCQkic3QvYyVkYiVkdCVkdSVkbSVkJWMiLAkJLyogc2NzaS9tdCAqLworCQkiaWRlL2hkL2MlZGIlZHQlZHUlZCIsCQkvKiBpZGUvaG9zdC9kaXNjICovCisJCSJpZGUvY2QvYyVkYiVkdCVkdSVkIiwJCS8qIGlkZS9ob3N0L2NkICovCisJCSJpZGUvaGQvYyVkYiVkdCVkdSVkcCVkIiwJLyogaWRlL2hvc3QvcGFydCAqLworCQkiaWRlL210L2MlZGIlZHQlZHUlZCVzIiwJLyogaWRlL2hvc3QvbXQgKi8KKwkJTlVMTAorCX07CisKKwkvKiAgRmlyc3QgY29uc3RydWN0IGNvbXBhdGliaWxpdHkgbmFtZSAgKi8KKwlzd2l0Y2ggKGFjdGlvbikgeworCQljYXNlIEFDX01LT0xEQ09NUEFUOgorCQljYXNlIEFDX1JNT0xEQ09NUEFUOgorCQkJY29tcGF0X25hbWUgPSBnZXRfb2xkX25hbWUoaW5mby0+ZGV2bmFtZSwgaW5mby0+bmFtZWxlbiwgY29tcGF0X2J1ZiwgaW5mby0+bWFqb3IsIGluZm8tPm1pbm9yKTsKKwkJCWJyZWFrOworCQljYXNlIEFDX01LTkVXQ09NUEFUOgorCQljYXNlIEFDX1JNTkVXQ09NUEFUOgorCQkJcHRyID0gYmJfYmFzZW5hbWUoaW5mby0+ZGV2bmFtZSk7CisJCQlpID0gc2Nhbl9kZXZfbmFtZShpbmZvLT5kZXZuYW1lLCBpbmZvLT5uYW1lbGVuLCBwdHIpOworCisJCQkvKiBub3RoaW5nIGZvdW5kICovCisJCQlpZiAoaSA9PSAwIHx8IGkgPiA5KQorCQkJCXJldHVybjsKKworCQkJc3NjYW5mKGluZm8tPmRldm5hbWUgKyAoKGkgPCA2KSA/IDUgOiA0KSwgImhvc3QlZC9idXMlZC90YXJnZXQlZC9sdW4lZC8iLCAmaG9zdCwgJmJ1cywgJnRhcmdldCwgJmx1bik7CisJCQlzbnByaW50ZihkZXN0X2J1Ziwgc2l6ZW9mKGRlc3RfYnVmKSwgIi4uLyVzIiwgaW5mby0+ZGV2bmFtZSArICgoIGkgPiA1KSA/IDQgOiAwKSk7CisJCQlkZXN0X25hbWUgPSBkZXN0X2J1ZjsKKwkJCWNvbXBhdF9uYW1lID0gY29tcGF0X2J1ZjsKKworCisJCQkvKiAxID09IHNjc2kvZ2VuZXJpYyAgMiA9PSBzY3NpL2Rpc2MgMyA9PSBzY3NpL2NkIDYgPT0gaWRlL2hvc3QvZGlzYyA3ID09IGlkZS9ob3N0L2NkICovCisJCQlpZiAoaSA9PSAxIHx8IGkgPT0gMiB8fCBpID09IDMgfHwgaSA9PSA2IHx8IGkgPT03KQorCQkJCXNwcmludGYoY29tcGF0X2J1ZiwgZm10W2ldLCBob3N0LCBidXMsIHRhcmdldCwgbHVuKTsKKworCQkJLyogNCA9PSBzY3NpL3BhcnQgOCA9PSBpZGUvaG9zdC9wYXJ0ICovCisJCQlpZiAoaSA9PSA0IHx8IGkgPT0gOCkKKwkJCQlzcHJpbnRmKGNvbXBhdF9idWYsIGZtdFtpXSwgaG9zdCwgYnVzLCB0YXJnZXQsIGx1biwgYXRvaShwdHIgKyA0KSk7CisKKwkJCS8qIDUgPT0gc2NzaS9tdCAqLworCQkJaWYgKGkgPT0gNSkgeworCQkJCXJld2luZF8gPSBpbmZvLT5kZXZuYW1lW2luZm8tPm5hbWVsZW4gLSAxXTsKKwkJCQlpZiAocmV3aW5kXyAhPSAnbicpCisJCQkJCXJld2luZF8gPSAnXDAnOworCQkJCW1vZGU9MDsKKwkJCQlpZiAocHRyWzJdID09ICAnbCcgLyoxMDgqLyB8fCBwdHJbMl0gPT0gJ20nLyoxMDkqLykKKwkJCQkJbW9kZSA9IHB0clsyXSAtIDEwNzsgLyogMSBvciAyICovCisJCQkJaWYgKHB0clsyXSA9PSAgJ2EnKQorCQkJCQltb2RlID0gMzsKKwkJCQlzcHJpbnRmKGNvbXBhdF9idWYsIGZtdFtpXSwgaG9zdCwgYnVzLCB0YXJnZXQsIGx1biwgbW9kZSwgcmV3aW5kXyk7CisJCQl9CisKKwkJCS8qIDkgPT0gaWRlL2hvc3QvbXQgKi8KKwkJCWlmIChpID09ICA5KQorCQkJCXNucHJpbnRmKGNvbXBhdF9idWYsIHNpemVvZihjb21wYXRfYnVmKSwgZm10W2ldLCBob3N0LCBidXMsIHRhcmdldCwgbHVuLCBwdHIgKyAyKTsKKwkJLyogZXNhYyAqLworCX0gLyogc3dpdGNoIChhY3Rpb24pICovCisKKwlpZiAoY29tcGF0X25hbWUgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJLyogIE5vdyBkZWNpZGUgd2hhdCB0byBkbyB3aXRoIGl0ICAqLworCXN3aXRjaCAoYWN0aW9uKSB7CisJCWNhc2UgQUNfTUtPTERDT01QQVQ6CisJCWNhc2UgQUNfTUtORVdDT01QQVQ6CisJCQlta3N5bWxpbmsoZGVzdF9uYW1lLCBjb21wYXRfbmFtZSk7CisJCQlicmVhazsKKwkJY2FzZSBBQ19STU9MRENPTVBBVDoKKwkJY2FzZSBBQ19STU5FV0NPTVBBVDoKKwkJCXJldCA9IHVubGluayhjb21wYXRfbmFtZSk7CisJCQlpZiAoRU5BQkxFX0RFQlVHICYmIHJldCkKKwkJCQllcnJvcl9sb2dnZXIoTE9HX0VSUiwgInVubGluazogJXMiLCBjb21wYXRfbmFtZSk7CisJCQlicmVhazsKKwkJLyplc2FjKi8KKwl9IC8qIHN3aXRjaCAoYWN0aW9uKSAqLworfSAgIC8qICBFbmQgRnVuY3Rpb24gYWN0aW9uX2NvbXBhdCAgKi8KKworc3RhdGljIHZvaWQgcmVzdG9yZShjaGFyICpzcGF0aCwgc3RydWN0IHN0YXQgc291cmNlX3N0YXQsIGludCByb290bGVuKQoreworCWNoYXIgKmRwYXRoOworCXN0cnVjdCBzdGF0IGRlc3Rfc3RhdDsKKworCWRlc3Rfc3RhdC5zdF9tb2RlID0gMDsKKwlkcGF0aCA9IGNvbmNhdF9wYXRoX2ZpbGUobW91bnRfcG9pbnQsIHNwYXRoICsgcm9vdGxlbik7CisJbHN0YXQoZHBhdGgsICZkZXN0X3N0YXQpOworCWZyZWUoZHBhdGgpOworCWlmIChTX0lTTE5LKHNvdXJjZV9zdGF0LnN0X21vZGUpIHx8IChzb3VyY2Vfc3RhdC5zdF9tb2RlICYgU19JU1ZUWCkpCisJCWNvcHlfaW5vZGUoZHBhdGgsICZkZXN0X3N0YXQsIChzb3VyY2Vfc3RhdC5zdF9tb2RlICYgflNfSVNWVFgpLCBzcGF0aCwgJnNvdXJjZV9zdGF0KTsKKworCWlmIChTX0lTRElSKHNvdXJjZV9zdGF0LnN0X21vZGUpKQorCQlkaXJfb3BlcmF0aW9uKFJFU1RPUkUsIHNwYXRoLCByb290bGVuLCBOVUxMKTsKK30KKworCitzdGF0aWMgaW50IGNvcHlfaW5vZGUoY29uc3QgY2hhciAqZGVzdHBhdGgsIGNvbnN0IHN0cnVjdCBzdGF0ICpkZXN0X3N0YXQsCisJCQltb2RlX3QgbmV3X21vZGUsCisJCQljb25zdCBjaGFyICpzb3VyY2VwYXRoLCBjb25zdCBzdHJ1Y3Qgc3RhdCAqc291cmNlX3N0YXQpCisvKiAgW1NVTU1BUlldIENvcHkgYW4gaW5vZGUuCisgICAgPGRlc3RwYXRoPiBUaGUgZGVzdGluYXRpb24gcGF0aC4gQW4gZXhpc3RpbmcgaW5vZGUgbWF5IGJlIGRlbGV0ZWQuCisgICAgPGRlc3Rfc3RhdD4gVGhlIGRlc3RpbmF0aW9uIHN0YXQoMikgaW5mb3JtYXRpb24uCisgICAgPG5ld19tb2RlPiBUaGUgZGVzaXJlZCBuZXcgbW9kZSBmb3IgdGhlIGRlc3RpbmF0aW9uLgorICAgIDxzb3VyY2VwYXRoPiBUaGUgc291cmNlIHBhdGguCisgICAgPHNvdXJjZV9zdGF0PiBUaGUgc291cmNlIHN0YXQoMikgaW5mb3JtYXRpb24uCisgICAgW1JFVFVSTlNdIFRSVUUgb24gc3VjY2VzcywgZWxzZSBGQUxTRS4KKyovCit7CisJaW50IHNvdXJjZV9sZW4sIGRlc3RfbGVuOworCWNoYXIgc291cmNlX2xpbmtbU1RSSU5HX0xFTkdUSF0sIGRlc3RfbGlua1tTVFJJTkdfTEVOR1RIXTsKKwlpbnQgZmQsIHZhbDsKKwlzdHJ1Y3Qgc29ja2FkZHJfdW4gdW5fYWRkcjsKKwljaGFyIHN5bWxpbmtfdmFsW1NUUklOR19MRU5HVEhdOworCisJaWYgKChzb3VyY2Vfc3RhdC0+c3RfbW9kZSAmIFNfSUZNVCkgPT0oZGVzdF9zdGF0LT5zdF9tb2RlICYgU19JRk1UKSkgeworCQkvKiAgU2FtZSB0eXBlICAqLworCQlpZiAoU19JU0xOSyhzb3VyY2Vfc3RhdC0+c3RfbW9kZSkpIHsKKwkJCXNvdXJjZV9sZW4gPSByZWFkbGluayhzb3VyY2VwYXRoLCBzb3VyY2VfbGluaywgU1RSSU5HX0xFTkdUSCAtIDEpOworCQkJaWYgKChzb3VyY2VfbGVuIDwgMCkKKwkJCSB8fCAoZGVzdF9sZW4gPSByZWFkbGluayhkZXN0cGF0aCwgZGVzdF9saW5rLCBTVFJJTkdfTEVOR1RIIC0gMSkpIDwgMAorCQkJKQorCQkJCXJldHVybiBGQUxTRTsKKwkJCXNvdXJjZV9saW5rW3NvdXJjZV9sZW5dCT0gJ1wwJzsKKwkJCWRlc3RfbGlua1tkZXN0X2xlbl0JPSAnXDAnOworCQkJaWYgKChzb3VyY2VfbGVuICE9IGRlc3RfbGVuKSB8fCAoc3RyY21wKHNvdXJjZV9saW5rLCBkZXN0X2xpbmspICE9IDApKSB7CisJCQkJdW5saW5rKGRlc3RwYXRoKTsKKwkJCQlzeW1saW5rKHNvdXJjZV9saW5rLCBkZXN0cGF0aCk7CisJCQl9CisJCQlyZXR1cm4gVFJVRTsKKwkJfSAgIC8qICBFbHNlIG5vdCBhIHN5bWxpbmsgICovCisJCWNobW9kKGRlc3RwYXRoLCBuZXdfbW9kZSAmIH5TX0lGTVQpOworCQljaG93bihkZXN0cGF0aCwgc291cmNlX3N0YXQtPnN0X3VpZCwgc291cmNlX3N0YXQtPnN0X2dpZCk7CisJCXJldHVybiBUUlVFOworCX0KKwkvKiAgRGlmZmVyZW50IHR5cGVzOiB1bmxpbmsgYW5kIGNyZWF0ZSAgKi8KKwl1bmxpbmsoZGVzdHBhdGgpOworCXN3aXRjaCAoc291cmNlX3N0YXQtPnN0X21vZGUgJiBTX0lGTVQpIHsKKwkJY2FzZSBTX0lGU09DSzoKKwkJCWZkID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKKwkJCWlmIChmZCA8IDApCisJCQkJYnJlYWs7CisJCQl1bl9hZGRyLnN1bl9mYW1pbHkgPSBBRl9VTklYOworCQkJc25wcmludGYodW5fYWRkci5zdW5fcGF0aCwgc2l6ZW9mKHVuX2FkZHIuc3VuX3BhdGgpLCAiJXMiLCBkZXN0cGF0aCk7CisJCQl2YWwgPSBiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopICZ1bl9hZGRyLCAoaW50KSBzaXplb2YgdW5fYWRkcik7CisJCQljbG9zZShmZCk7CisJCQlpZiAodmFsICE9IDAgfHwgY2htb2QoZGVzdHBhdGgsIG5ld19tb2RlICYgflNfSUZNVCkgIT0gMCkKKwkJCQlicmVhazsKKwkJCWdvdG8gZG9fY2hvd247CisJCWNhc2UgU19JRkxOSzoKKwkJCXZhbCA9IHJlYWRsaW5rKHNvdXJjZXBhdGgsIHN5bWxpbmtfdmFsLCBTVFJJTkdfTEVOR1RIIC0gMSk7CisJCQlpZiAodmFsIDwgMCkKKwkJCQlicmVhazsKKwkJCXN5bWxpbmtfdmFsW3ZhbF0gPSAnXDAnOworCQkJaWYgKHN5bWxpbmsoc3ltbGlua192YWwsIGRlc3RwYXRoKSA9PSAwKQorCQkJCXJldHVybiBUUlVFOworCQkJYnJlYWs7CisJCWNhc2UgU19JRlJFRzoKKwkJCWZkID0gb3BlbihkZXN0cGF0aCwgT19SRE9OTFkgfCBPX0NSRUFULCBuZXdfbW9kZSAmIH5TX0lGTVQpOworCQkJaWYgKGZkIDwgMCkKKwkJCQlicmVhazsKKwkJCWNsb3NlKGZkKTsKKwkJCWlmIChjaG1vZChkZXN0cGF0aCwgbmV3X21vZGUgJiB+U19JRk1UKSAhPSAwKQorCQkJCWJyZWFrOworCQkJZ290byBkb19jaG93bjsKKwkJY2FzZSBTX0lGQkxLOgorCQljYXNlIFNfSUZDSFI6CisJCWNhc2UgU19JRklGTzoKKwkJCWlmIChta25vZChkZXN0cGF0aCwgbmV3X21vZGUsIHNvdXJjZV9zdGF0LT5zdF9yZGV2KSAhPSAwKQorCQkJCWJyZWFrOworCQkJZ290byBkb19jaG93bjsKKwkJY2FzZSBTX0lGRElSOgorCQkJaWYgKG1rZGlyKGRlc3RwYXRoLCBuZXdfbW9kZSAmIH5TX0lGTVQpICE9IDApCisJCQkJYnJlYWs7Citkb19jaG93bjoKKwkJCWlmIChjaG93bihkZXN0cGF0aCwgc291cmNlX3N0YXQtPnN0X3VpZCwgc291cmNlX3N0YXQtPnN0X2dpZCkgPT0gMCkKKwkJCQlyZXR1cm4gVFJVRTsKKwkJLypicmVhazsqLworCX0KKwlyZXR1cm4gRkFMU0U7Cit9ICAgLyogIEVuZCBGdW5jdGlvbiBjb3B5X2lub2RlICAqLworCitzdGF0aWMgdm9pZCBmcmVlX2NvbmZpZyh2b2lkKQorLyogIFtTVU1NQVJZXSBGcmVlIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLgorICAgIFtSRVRVUk5TXSBOb3RoaW5nLgorKi8KK3sKKwlzdHJ1Y3QgY29uZmlnX2VudHJ5X3N0cnVjdCAqY19lbnRyeTsKKwl2b2lkICpuZXh0OworCisJZm9yIChjX2VudHJ5ID0gZmlyc3RfY29uZmlnOyBjX2VudHJ5ICE9IE5VTEw7IGNfZW50cnkgPSBuZXh0KSB7CisJCXVuc2lnbmVkIGludCBjb3VudDsKKworCQluZXh0ID0gY19lbnRyeS0+bmV4dDsKKwkJcmVnZnJlZSgmY19lbnRyeS0+cHJlZyk7CisJCWlmIChjX2VudHJ5LT5hY3Rpb24ud2hhdCA9PSBBQ19FWEVDVVRFKSB7CisJCQlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBNQVhfQVJHUzsgKytjb3VudCkgeworCQkJCWlmIChjX2VudHJ5LT51LmV4ZWN1dGUuYXJndltjb3VudF0gPT0gTlVMTCkKKwkJCQkJYnJlYWs7CisJCQkJZnJlZShjX2VudHJ5LT51LmV4ZWN1dGUuYXJndltjb3VudF0pOworCQkJfQorCQl9CisJCWZyZWUoY19lbnRyeSk7CisJfQorCWZpcnN0X2NvbmZpZyA9IE5VTEw7CisJbGFzdF9jb25maWcgPSBOVUxMOworfSAgIC8qICBFbmQgRnVuY3Rpb24gZnJlZV9jb25maWcgICovCisKK3N0YXRpYyBpbnQgZ2V0X3VpZF9naWQoaW50IGZsYWcsIGNvbnN0IGNoYXIgKnN0cmluZykKKy8qICBbU1VNTUFSWV0gQ29udmVydCBhIHN0cmluZyB0byBhIFVJRCBvciBHSUQgdmFsdWUuCisJPGZsYWc+ICJVSUQiIG9yICJHSUQiLgorCTxzdHJpbmc+IFRoZSBzdHJpbmcuCisgICAgW1JFVFVSTlNdIFRoZSBVSUQgb3IgR0lEIHZhbHVlLgorKi8KK3sKKwlzdHJ1Y3QgcGFzc3dkICpwd19lbnQ7CisJc3RydWN0IGdyb3VwICpncnBfZW50OworCWNvbnN0IGNoYXIgKm1zZzsKKworCWlmIChpc2RpZ2l0KHN0cmluZ1swXSkgfHwgKChzdHJpbmdbMF0gPT0gJy0nKSAmJiBpc2RpZ2l0KHN0cmluZ1sxXSkpKQorCQlyZXR1cm4gYXRvaShzdHJpbmcpOworCisJaWYgKGZsYWcgPT0gVUlEICYmIChwd19lbnQgPSBnZXRwd25hbShzdHJpbmcpKSAhPSBOVUxMKQorCQlyZXR1cm4gcHdfZW50LT5wd191aWQ7CisKKwlpZiAoRU5BQkxFX0RFVkZTRF9WRVJCT1NFKQorCQltc2cgPSAidXNlciI7CisKKwlpZiAoZmxhZyA9PSBHSUQpIHsKKwkJaWYgKChncnBfZW50ID0gZ2V0Z3JuYW0oc3RyaW5nKSkgIT0gTlVMTCkKKwkJCXJldHVybiBncnBfZW50LT5ncl9naWQ7CisJCWlmIChFTkFCTEVfREVWRlNEX1ZFUkJPU0UpCisJCQltc2cgPSAiZ3JvdXAiOworCX0KKworCWlmIChFTkFCTEVfREVWRlNEX1ZFUkJPU0UpCisJCW1zZ19sb2dnZXIoTE9HX0VSUiwgInVua25vd24gJXM6ICVzLCBkZWZhdWx0aW5nIHRvICVjaWQ9MCIsICBtc2csIHN0cmluZywgbXNnWzBdKTsKKwlyZXR1cm4gMDsKK30vKiAgRW5kIEZ1bmN0aW9uIGdldF91aWRfZ2lkICAqLworCitzdGF0aWMgbW9kZV90IGdldF9tb2RlKGNvbnN0IGNoYXIgKnN0cmluZykKKy8qICBbU1VNTUFSWV0gQ29udmVydCBhIHN0cmluZyB0byBhIG1vZGUgdmFsdWUuCisgICAgPHN0cmluZz4gVGhlIHN0cmluZy4KKyAgICBbUkVUVVJOU10gVGhlIG1vZGUgdmFsdWUuCisqLworeworCW1vZGVfdCBtb2RlOworCWludCBpOworCisJaWYgKGlzZGlnaXQoc3RyaW5nWzBdKSkKKwkJcmV0dXJuIHN0cnRvdWwoc3RyaW5nLCBOVUxMLCA4KTsKKwlpZiAoc3RybGVuKHN0cmluZykgIT0gOSkKKwkJbXNnX2xvZ2dlcl9hbmRfZGllKExPR19FUlIsICJiYWQgbW9kZTogJXMiLCBzdHJpbmcpOworCisJbW9kZSA9IDA7CisJaSA9IFNfSVJVU1I7CisJd2hpbGUgKGkgPiAwKSB7CisJCWlmIChzdHJpbmdbMF0gPT0gJ3InIHx8IHN0cmluZ1swXSA9PSAndycgfHwgc3RyaW5nWzBdID09ICd4JykKKwkJCW1vZGUgKz0gaTsKKwkJaSA9IGkgLyAyOworCQlzdHJpbmcrKzsKKwl9CisJcmV0dXJuIG1vZGU7Cit9ICAgLyogIEVuZCBGdW5jdGlvbiBnZXRfbW9kZSAgKi8KKworc3RhdGljIHZvaWQgc2lnbmFsX2hhbmRsZXIoaW50IHNpZykKK3sKKwljYXVnaHRfc2lnbmFsID0gVFJVRTsKKwlpZiAoc2lnID09IFNJR0hVUCkKKwkJY2F1Z2h0X3NpZ2h1cCA9IFRSVUU7CisKKwlpbmZvX2xvZ2dlcihMT0dfSU5GTywgIkNhdWdodCBzaWduYWwgJWQiLCBzaWcpOworfSAgIC8qICBFbmQgRnVuY3Rpb24gc2lnbmFsX2hhbmRsZXIgICovCisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfdmFyaWFibGUoY29uc3QgY2hhciAqdmFyaWFibGUsIHZvaWQgKmluZm8pCit7CisJc3RhdGljIGNoYXIgKmhvc3RuYW1lOworCisJc3RydWN0IGdldF92YXJpYWJsZV9pbmZvICpndl9pbmZvID0gaW5mbzsKKwljb25zdCBjaGFyICpmaWVsZF9uYW1lc1tdID0geworCQkJImhvc3RuYW1lIiwgIm1udHB0IiwgImRldnBhdGgiLCAiZGV2bmFtZSIsICJ1aWQiLCAiZ2lkIiwgIm1vZGUiLAorCQkJTlVMTCwgbW91bnRfcG9pbnQsIGd2X2luZm8tPmRldnBhdGgsIGd2X2luZm8tPmRldm5hbWUsIE5VTEwKKwl9OworCWludCBpOworCisJaWYgKCFob3N0bmFtZSkKKwkJaG9zdG5hbWUgPSBzYWZlX2dldGhvc3RuYW1lKCk7CisJZmllbGRfbmFtZXNbN10gPSBob3N0bmFtZTsKKworCS8qIGluZGV4X2luX3N0cl9hcnJheSByZXR1cm5zIGk+PTAgICovCisJaSA9IGluZGV4X2luX3N0cl9hcnJheShmaWVsZF9uYW1lcywgdmFyaWFibGUpOworCisJaWYgKGkgPiA2IHx8IGkgPCAwIHx8IChpID4gMSAmJiBndl9pbmZvID09IE5VTEwpKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAoaSA+PSAwICYmIGkgPD0gMykKKwkJcmV0dXJuIGZpZWxkX25hbWVzW2kgKyA3XTsKKworCWlmIChpID09IDQpCisJCXJldHVybiBhdXRvX3N0cmluZyh4YXNwcmludGYoIiV1IiwgZ3ZfaW5mby0+aW5mby0+dWlkKSk7CisJaWYgKGkgPT0gNSkKKwkJcmV0dXJuIGF1dG9fc3RyaW5nKHhhc3ByaW50ZigiJXUiLCBndl9pbmZvLT5pbmZvLT5naWQpKTsKKwkvKiBpID09IDYgKi8KKwlyZXR1cm4gYXV0b19zdHJpbmcoeGFzcHJpbnRmKCIlbyIsIGd2X2luZm8tPmluZm8tPm1vZGUpKTsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIGdldF92YXJpYWJsZSAgKi8KKworc3RhdGljIHZvaWQgc2VydmljZShzdHJ1Y3Qgc3RhdCBzdGF0YnVmLCBjaGFyICpwYXRoKQoreworCXN0cnVjdCBkZXZmc2Rfbm90aWZ5X3N0cnVjdCBpbmZvOworCisJbWVtc2V0KCZpbmZvLCAwLCBzaXplb2YgaW5mbyk7CisJaW5mby50eXBlID0gREVWRlNEX05PVElGWV9SRUdJU1RFUkVEOworCWluZm8ubW9kZSA9IHN0YXRidWYuc3RfbW9kZTsKKwlpbmZvLm1ham9yID0gbWFqb3Ioc3RhdGJ1Zi5zdF9yZGV2KTsKKwlpbmZvLm1pbm9yID0gbWlub3Ioc3RhdGJ1Zi5zdF9yZGV2KTsKKwlpbmZvLnVpZCA9IHN0YXRidWYuc3RfdWlkOworCWluZm8uZ2lkID0gc3RhdGJ1Zi5zdF9naWQ7CisJc25wcmludGYoaW5mby5kZXZuYW1lLCBzaXplb2YoaW5mby5kZXZuYW1lKSwgIiVzIiwgcGF0aCArIHN0cmxlbihtb3VudF9wb2ludCkgKyAxKTsKKwlpbmZvLm5hbWVsZW4gPSBzdHJsZW4oaW5mby5kZXZuYW1lKTsKKwlzZXJ2aWNlX25hbWUoJmluZm8pOworCWlmIChTX0lTRElSKHN0YXRidWYuc3RfbW9kZSkpCisJCWRpcl9vcGVyYXRpb24oU0VSVklDRSwgcGF0aCwgMCwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGRpcl9vcGVyYXRpb24oaW50IHR5cGUsIGNvbnN0IGNoYXIgKiBkaXJfbmFtZSwgaW50IHZhciwgdW5zaWduZWQgbG9uZyAqZXZlbnRfbWFzaykKKy8qICBbU1VNTUFSWV0gU2NhbiBhIGRpcmVjdG9yeSB0cmVlIGFuZCBnZW5lcmF0ZSByZWdpc3RlciBldmVudHMgb24gbGVhZiBub2Rlcy4KKwk8ZmxhZz4gVG8gY2hvb3NlIHdoaWNoIGZ1bmN0aW9uIHRvIHBlcmZvcm0KKwk8ZHA+IFRoZSBkaXJlY3RvcnkgcG9pbnRlci4gVGhpcyBpcyBjbG9zZWQgdXBvbiBjb21wbGV0aW9uLgorICAgIDxkaXJfbmFtZT4gVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeS4KKwk8cm9vdGxlbj4gc3RyaW5nIGxlbmd0aCBwYXJhbWV0ZXIuCisgICAgW1JFVFVSTlNdIE5vdGhpbmcuCisqLworeworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJRElSICpkcDsKKwlzdHJ1Y3QgZGlyZW50ICpkZTsKKwljaGFyICpwYXRoOworCisJZHAgPSB3YXJuX29wZW5kaXIoZGlyX25hbWUpOworCWlmIChkcCA9PSBOVUxMKQorCQlyZXR1cm47CisKKwl3aGlsZSAoKGRlID0gcmVhZGRpcihkcCkpICE9IE5VTEwpIHsKKworCQlpZiAoZGUtPmRfbmFtZSAmJiBET1RfT1JfRE9URE9UKGRlLT5kX25hbWUpKQorCQkJY29udGludWU7CisJCXBhdGggPSBjb25jYXRfcGF0aF9maWxlKGRpcl9uYW1lLCBkZS0+ZF9uYW1lKTsKKwkJaWYgKGxzdGF0KHBhdGgsICZzdGF0YnVmKSA9PSAwKSB7CisJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCQljYXNlIFNFUlZJQ0U6CisJCQkJCXNlcnZpY2Uoc3RhdGJ1ZiwgcGF0aCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUkVTVE9SRToKKwkJCQkJcmVzdG9yZShwYXRoLCBzdGF0YnVmLCB2YXIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIFJFQURfQ09ORklHOgorCQkJCQlyZWFkX2NvbmZpZ19maWxlKHBhdGgsIHZhciwgZXZlbnRfbWFzayk7CisJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWZyZWUocGF0aCk7CisJfQorCWNsb3NlZGlyKGRwKTsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIGRvX3NjYW5fYW5kX3NlcnZpY2UgICovCisKK3N0YXRpYyBpbnQgbWtzeW1saW5rKGNvbnN0IGNoYXIgKm9sZHBhdGgsIGNvbnN0IGNoYXIgKm5ld3BhdGgpCisvKiAgW1NVTU1BUlldIENyZWF0ZSBhIHN5bWxpbmssIGNyZWF0aW5nIGludGVydmVuaW5nIGRpcmVjdG9yaWVzIGFzIHJlcXVpcmVkLgorICAgIDxvbGRwYXRoPiBUaGUgc3RyaW5nIGNvbnRhaW5lZCBpbiB0aGUgc3ltbGluay4KKyAgICA8bmV3cGF0aD4gVGhlIG5hbWUgb2YgdGhlIG5ldyBzeW1saW5rLgorICAgIFtSRVRVUk5TXSAwIG9uIHN1Y2Nlc3MsIGVsc2UgLTEuCisqLworeworCWlmICghbWFrZV9kaXJfdHJlZShuZXdwYXRoKSkKKwkJcmV0dXJuIC0xOworCisJaWYgKHN5bWxpbmsob2xkcGF0aCwgbmV3cGF0aCkgIT0gMCkgeworCQlpZiAoZXJybm8gIT0gRUVYSVNUKQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMDsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIG1rc3ltbGluayAgKi8KKworCitzdGF0aWMgaW50IG1ha2VfZGlyX3RyZWUoY29uc3QgY2hhciAqcGF0aCkKKy8qICBbU1VNTUFSWV0gQ3JlYXRpbmcgaW50ZXJ2ZW5pbmcgZGlyZWN0b3JpZXMgZm9yIGEgcGF0aCBhcyByZXF1aXJlZC4KKyAgICA8cGF0aD4gVGhlIGZ1bGwgcGF0aG5hbWUoaW5jbHVkaW5nIHRoZSBsZWFmIG5vZGUpLgorICAgIFtSRVRVUk5TXSBUUlVFIG9uIHN1Y2Nlc3MsIGVsc2UgRkFMU0UuCisqLworeworCWlmIChiYl9tYWtlX2RpcmVjdG9yeShkaXJuYW1lKChjaGFyICopcGF0aCksIC0xLCBGSUxFVVRJTFNfUkVDVVIpID09IC0xKQorCQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIFRSVUU7Cit9IC8qICBFbmQgRnVuY3Rpb24gbWFrZV9kaXJfdHJlZSAgKi8KKworc3RhdGljIGludCBleHBhbmRfZXhwcmVzc2lvbihjaGFyICpvdXRwdXQsIHVuc2lnbmVkIGludCBvdXRzaXplLAorCQkJY29uc3QgY2hhciAqaW5wdXQsCisJCQljb25zdCBjaGFyICooKmdldF92YXJpYWJsZV9mdW5jKShjb25zdCBjaGFyICp2YXJpYWJsZSwgdm9pZCAqaW5mbyksCisJCQl2b2lkICppbmZvLAorCQkJY29uc3QgY2hhciAqZGV2bmFtZSwKKwkJCWNvbnN0IHJlZ21hdGNoX3QgKmV4LCB1bnNpZ25lZCBpbnQgbnVtZXhwKQorLyogIFtTVU1NQVJZXSBFeHBhbmQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFuZCByZWd1bGFyIHN1YmV4cHJlc3Npb25zIGluIHN0cmluZy4KKyAgICA8b3V0cHV0PiBUaGUgb3V0cHV0IGV4cGFuZGVkIGV4cHJlc3Npb24gaXMgd3JpdHRlbiBoZXJlLgorICAgIDxsZW5ndGg+IFRoZSBzaXplIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgIDxpbnB1dD4gVGhlIGlucHV0IGV4cHJlc3Npb24uIFRoaXMgbWF5IGVxdWFsIDw8b3V0cHV0Pj4uCisgICAgPGdldF92YXJpYWJsZT4gQSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZ2V0IHZhcmlhYmxlIHZhbHVlcy4gSWYKKyAgICB0aGlzIHJldHVybnMgTlVMTCwgdGhlIGVudmlyb25tZW50IGlzIHNlYXJjaGVkIGluc3RlYWQuIElmIHRoaXMgaXMgTlVMTCwKKyAgICBvbmx5IHRoZSBlbnZpcm9ubWVudCBpcyBzZWFyY2hlZC4KKyAgICA8aW5mbz4gQW4gYXJiaXRyYXJ5IHBvaW50ZXIgcGFzc2VkIHRvIDw8Z2V0X3ZhcmlhYmxlPj4uCisgICAgPGRldm5hbWU+IERldmljZSBuYW1lOyBzcGVjaWZpY2FsbHksIHRoaXMgaXMgdGhlIHN0cmluZyB0aGF0IGNvbnRhaW5zIGFsbAorICAgIG9mIHRoZSByZWd1bGFyIHN1YmV4cHJlc3Npb25zLgorICAgIDxleD4gQXJyYXkgb2Ygc3RhcnQgLyBlbmQgb2Zmc2V0cyBpbnRvIGluZm8tPmRldm5hbWUgZm9yIGVhY2ggc3ViZXhwcmVzc2lvbgorICAgIDxudW1leHA+IE51bWJlciBvZiByZWd1bGFyIHN1YmV4cHJlc3Npb25zIGZvdW5kIGluIDw8ZGV2bmFtZT4+LgorICAgIFtSRVRVUk5TXSBUUlVFIG9uIHN1Y2Nlc3MsIGVsc2UgRkFMU0UuCisqLworeworCWNoYXIgdGVtcFtTVFJJTkdfTEVOR1RIXTsKKworCWlmICghc3RfZXhwcl9leHBhbmQodGVtcCwgU1RSSU5HX0xFTkdUSCwgaW5wdXQsIGdldF92YXJpYWJsZV9mdW5jLCBpbmZvKSkKKwkJcmV0dXJuIEZBTFNFOworCWV4cGFuZF9yZWdleHAob3V0cHV0LCBvdXRzaXplLCB0ZW1wLCBkZXZuYW1lLCBleCwgbnVtZXhwKTsKKwlyZXR1cm4gVFJVRTsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIGV4cGFuZF9leHByZXNzaW9uICAqLworCitzdGF0aWMgdm9pZCBleHBhbmRfcmVnZXhwKGNoYXIgKm91dHB1dCwgc2l6ZV90IG91dHNpemUsIGNvbnN0IGNoYXIgKmlucHV0LAorCQkJY29uc3QgY2hhciAqZGV2bmFtZSwKKwkJCWNvbnN0IHJlZ21hdGNoX3QgKmV4LCB1bnNpZ25lZCBpbnQgbnVtZXgpCisvKiAgW1NVTU1BUlldIEV4cGFuZCBhbGwgb2NjdXJyZW5jZXMgb2YgdGhlIHJlZ3VsYXIgc3ViZXhwcmVzc2lvbnMgXDAgdG8gXDkuCisgICAgPG91dHB1dD4gVGhlIG91dHB1dCBleHBhbmRlZCBleHByZXNzaW9uIGlzIHdyaXR0ZW4gaGVyZS4KKyAgICA8b3V0c2l6ZT4gVGhlIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIuCisgICAgPGlucHV0PiBUaGUgaW5wdXQgZXhwcmVzc2lvbi4gVGhpcyBtYXkgTk9UIGVxdWFsIDw8b3V0cHV0Pj4sIGJlY2F1c2UKKyAgICBzdXBwb3J0aW5nIHRoYXQgd291bGQgcmVxdWlyZSB5ZXQgYW5vdGhlciBzdHJpbmctY29weS4gSG93ZXZlciwgaXQncyBub3QKKyAgICBoYXJkIHRvIHdyaXRlIGEgc2ltcGxlIHdyYXBwZXIgZnVuY3Rpb24gdG8gYWRkIHRoaXMgZnVuY3Rpb25hbGl0eSBmb3IgdGhvc2UKKyAgICBmZXcgY2FzZXMgdGhhdCBuZWVkIGl0LgorICAgIDxkZXZuYW1lPiBEZXZpY2UgbmFtZTsgc3BlY2lmaWNhbGx5LCB0aGlzIGlzIHRoZSBzdHJpbmcgdGhhdCBjb250YWlucyBhbGwKKyAgICBvZiB0aGUgcmVndWxhciBzdWJleHByZXNzaW9ucy4KKyAgICA8ZXg+IEFuIGFycmF5IG9mIHN0YXJ0IGFuZCBlbmQgb2Zmc2V0cyBpbnRvIDw8ZGV2bmFtZT4+LCBvbmUgZm9yIGVhY2gKKyAgICBzdWJleHByZXNzaW9uCisgICAgPG51bWV4PiBOdW1iZXIgb2Ygc3ViZXhwcmVzc2lvbnMgaW4gdGhlIG9mZnNldC1hcnJheSA8PGV4Pj4uCisgICAgW1JFVFVSTlNdIE5vdGhpbmcuCisqLworeworCWNvbnN0IGNoYXIgbGFzdF9leHAgPSAnMCcgLSAxICsgbnVtZXg7CisJaW50IGMgPSAtMTsKKworCS8qICBHdWFyYW50ZWUgTlVMTCB0ZXJtaW5hdGlvbiBieSB3cml0aW5nIGFuIGV4cGxpY2l0ICdcMCcgY2hhcmFjdGVyIGludG8KKwl0aGUgdmVyeSBsYXN0IGJ5dGUgICovCisJaWYgKG91dHNpemUpCisJCW91dHB1dFstLW91dHNpemVdID0gJ1wwJzsKKwkvKiAgQ29weSB0aGUgaW5wdXQgc3RyaW5nIGludG8gdGhlIG91dHB1dCBidWZmZXIsIHJlcGxhY2luZyAnXFwnIHdpdGggJ1wnCisJYW5kICdcMCcgLi4gJ1w5JyB3aXRoIHN1YmV4cHJlc3Npb25zIDAgLi4gOSwgaWYgdGhleSBleGlzdC4gT3RoZXIgXHgKKwljb2RlcyBhcmUgZGVsZXRlZCAgKi8KKwl3aGlsZSAoKGMgIT0gJ1wwJykgJiYgKG91dHNpemUgIT0gMCkpIHsKKwkJYyA9ICppbnB1dDsKKwkJKytpbnB1dDsKKwkJaWYgKGMgPT0gJ1xcJykgeworCQkJYyA9ICppbnB1dDsKKwkJCSsraW5wdXQ7CisJCQlpZiAoYyAhPSAnXFwnKSB7CisJCQkJaWYgKChjID49ICcwJykgJiYgKGMgPD0gbGFzdF9leHApKSB7CisJCQkJCWNvbnN0IHJlZ21hdGNoX3QgKnN1YmV4cCA9IGV4ICsgKGMgLSAnMCcpOworCQkJCQl1bnNpZ25lZCBpbnQgc3VibGVuID0gc3ViZXhwLT5ybV9lbyAtIHN1YmV4cC0+cm1fc287CisKKwkJCQkJLyogIFJhbmdlIGNoZWNraW5nICAqLworCQkJCQlpZiAoc3VibGVuID4gb3V0c2l6ZSkKKwkJCQkJCXN1YmxlbiA9IG91dHNpemU7CisJCQkJCXN0cm5jcHkob3V0cHV0LCBkZXZuYW1lICsgc3ViZXhwLT5ybV9zbywgc3VibGVuKTsKKwkJCQkJb3V0cHV0ICs9IHN1YmxlbjsKKwkJCQkJb3V0c2l6ZSAtPSBzdWJsZW47CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCSpvdXRwdXQgPSBjOworCQkrK291dHB1dDsKKwkJLS1vdXRzaXplOworCX0gLyogd2hpbGUgKi8KK30gICAvKiAgRW5kIEZ1bmN0aW9uIGV4cGFuZF9yZWdleHAgICovCisKKworLyogZnJvbSBjb21wYXRfbmFtZS5jICovCisKK3N0cnVjdCB0cmFuc2xhdGVfc3RydWN0IHsKKwljb25zdCBjaGFyICptYXRjaDsgICAgLyogIFRoZSBzdHJpbmcgdG8gbWF0Y2ggdG8odXAgdG8gbGVuZ3RoKSAgICAgICAgICAgICAgICAqLworCWNvbnN0IGNoYXIgKmZvcm1hdDsgICAvKiAgRm9ybWF0IG9mIG91dHB1dCwgIiVzIiB0YWtlcyBkYXRhIHBhc3QgbWF0Y2ggc3RyaW5nLAorCQkJTlVMTCBpcyBlZmZlY3RpdmVseSAiJXMiKGp1c3QgbW9yZSBlZmZpY2llbnQpICAgICAgICovCit9OworCitzdGF0aWMgc3RydWN0IHRyYW5zbGF0ZV9zdHJ1Y3QgdHJhbnNsYXRlX3RhYmxlW10gPQoreworCXsic291bmQvIiwgICAgIE5VTEx9LAorCXsicHJpbnRlcnMvIiwgICJscCVzIn0sCisJeyJ2NGwvIiwgICAgICAgTlVMTH0sCisJeyJwYXJwb3J0cy8iLCAgInBhcnBvcnQlcyJ9LAorCXsiZmIvIiwgICAgICAgICJmYiVzIn0sCisJeyJuZXRsaW5rLyIsICAgTlVMTH0sCisJeyJsb29wLyIsICAgICAgImxvb3AlcyJ9LAorCXsiZmxvcHB5LyIsICAgICJmZCVzIn0sCisJeyJyZC8iLCAgICAgICAgInJhbSVzIn0sCisJeyJtZC8iLCAgICAgICAgIm1kJXMifSwgICAgICAgICAvKiAgTWV0YS1kZXZpY2VzICAgICAgICAgICAgICAgICAgICAgICAgICovCisJeyJ2Yy8iLCAgICAgICAgInR0eSVzIn0sCisJeyJtaXNjLyIsICAgICAgTlVMTH0sCisJeyJpc2RuLyIsICAgICAgTlVMTH0sCisJeyJwZy8iLCAgICAgICAgInBnJXMifSwgICAgICAgICAvKiAgUGFyYWxsZWwgcG9ydCBnZW5lcmljIEFUQVBJIGludGVyZmFjZSovCisJeyJpMmMvIiwgICAgICAgImkyYy0lcyJ9LAorCXsic3RhbGlvbWVtLyIsICJzdGFsaW9tZW0lcyJ9LCAgLyogIFN0YWxsaW9uIHNlcmlhbCBkcml2ZXIgY29udHJvbCAgICAgICAqLworCXsidHRzL0UiLCAgICAgICJ0dHlFJXMifSwgICAgICAgLyogIFN0YWxsaW9uIHNlcmlhbCBkcml2ZXIgICAgICAgICAgICAgICAqLworCXsiY3VhL0UiLCAgICAgICJjdWUlcyJ9LCAgICAgICAgLyogIFN0YWxsaW9uIHNlcmlhbCBkcml2ZXIgY2FsbG91dCAgICAgICAqLworCXsidHRzL1IiLCAgICAgICJ0dHlSJXMifSwgICAgICAgLyogIFJvY2tldHBvcnQgc2VyaWFsIGRyaXZlciAgICAgICAgICAgICAqLworCXsiY3VhL1IiLCAgICAgICJjdXIlcyJ9LCAgICAgICAgLyogIFJvY2tldHBvcnQgc2VyaWFsIGRyaXZlciBjYWxsb3V0ICAgICAqLworCXsiaXAyLyIsICAgICAgICJpcDIlcyJ9LCAgICAgICAgLyogIENvbXB1dG9uZSBzZXJpYWwgZHJpdmVyIGNvbnRyb2wgICAgICAqLworCXsidHRzL0YiLCAgICAgICJ0dHlGJXMifSwgICAgICAgLyogIENvbXB1dG9uZSBzZXJpYWwgZHJpdmVyICAgICAgICAgICAgICAqLworCXsiY3VhL0YiLCAgICAgICJjdWYlcyJ9LCAgICAgICAgLyogIENvbXB1dG9uZSBzZXJpYWwgZHJpdmVyIGNhbGxvdXQgICAgICAqLworCXsidHRzL0MiLCAgICAgICJ0dHlDJXMifSwgICAgICAgLyogIEN5Y2xhZGVzIHNlcmlhbCBkcml2ZXIgICAgICAgICAgICAgICAqLworCXsiY3VhL0MiLCAgICAgICJjdWIlcyJ9LCAgICAgICAgLyogIEN5Y2xhZGVzIHNlcmlhbCBkcml2ZXIgY2FsbG91dCAgICAgICAqLworCXsidHRzLyIsICAgICAgICJ0dHlTJXMifSwgICAgICAgLyogIEdlbmVyaWMgc2VyaWFsOiBtdXN0IGJlIGFmdGVyIG90aGVycyAqLworCXsiY3VhLyIsICAgICAgICJjdWElcyJ9LCAgICAgICAgLyogIEdlbmVyaWMgc2VyaWFsOiBtdXN0IGJlIGFmdGVyIG90aGVycyAqLworCXsiaW5wdXQvanMiLCAgICJqcyVzIn0sICAgICAgICAgLyogIEpveXN0aWNrIGRyaXZlciAgICAgICAgICAgICAgICAgICAgICAqLworCXtOVUxMLCAgICAgICAgIE5VTEx9Cit9OworCitjb25zdCBjaGFyICpnZXRfb2xkX25hbWUoY29uc3QgY2hhciAqZGV2bmFtZSwgdW5zaWduZWQgaW50IG5hbWVsZW4sCisJCQljaGFyICpidWZmZXIsIHVuc2lnbmVkIGludCBtYWpvciwgdW5zaWduZWQgaW50IG1pbm9yKQorLyogIFtTVU1NQVJZXSBUcmFuc2xhdGUgYSBrZXJuZWwtc3VwcGxpZWQgbmFtZSBpbnRvIGFuIG9sZCBuYW1lLgorICAgIDxkZXZuYW1lPiBUaGUgZGV2aWNlIG5hbWUgcHJvdmlkZWQgYnkgdGhlIGtlcm5lbC4KKyAgICA8bmFtZWxlbj4gVGhlIGxlbmd0aCBvZiB0aGUgbmFtZS4KKyAgICA8YnVmZmVyPiBBIGJ1ZmZlciB0aGF0IG1heSBiZSB1c2VkLiBUaGlzIHNob3VsZCBiZSBhdCBsZWFzdCAxMjggYnl0ZXMgbG9uZy4KKyAgICA8bWFqb3I+IFRoZSBtYWpvciBudW1iZXIgZm9yIHRoZSBkZXZpY2UuCisgICAgPG1pbm9yPiBUaGUgbWlub3IgbnVtYmVyIGZvciB0aGUgZGV2aWNlLgorICAgIFtSRVRVUk5TXSBBIHBvaW50ZXIgdG8gdGhlIG9sZCBuYW1lIGlmIGtub3duLCBlbHNlIE5VTEwuCisqLworeworCWNvbnN0IGNoYXIgKmNvbXBhdF9uYW1lID0gTlVMTDsKKwljb25zdCBjaGFyICpwdHI7CisJc3RydWN0IHRyYW5zbGF0ZV9zdHJ1Y3QgKnRyYW5zOworCXVuc2lnbmVkIGludCBpOworCWNoYXIgbW9kZTsKKwlpbnQgaW5kZXh4OworCWNvbnN0IGNoYXIgKnB0eTE7CisJY29uc3QgY2hhciAqcHR5MjsKKwkvKiAxIHRvIDUgICJzY3NpLyIgLCA2IHRvIDkgImlkZS9ob3N0IiwgMTAgc2JwLywgMTEgdmNjLywgMTIgcHR5LyAqLworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBmbXRbXSA9IHsKKwkJTlVMTCAsCisJCSJzZyV1IiwJCQkvKiBzY3NpL2dlbmVyaWMgKi8KKwkJTlVMTCwJCQkvKiBzY3NpL2Rpc2MgKi8KKwkJInNyJXUiLAkJCS8qIHNjc2kvY2QgKi8KKwkJTlVMTCwJCQkvKiBzY3NpL3BhcnQgKi8KKwkJIm5zdCV1JWMiLAkJLyogc2NzaS9tdCAqLworCQkiaGQlYyIJLAkJLyogaWRlL2hvc3QvZGlzYyAqLworCQkiaGQlYyIJLAkJLyogaWRlL2hvc3QvY2QgKi8KKwkJImhkJWMlcyIsCQkvKiBpZGUvaG9zdC9wYXJ0ICovCisJCSIlc2h0JWQiLAkJLyogaWRlL2hvc3QvbXQgKi8KKwkJInNicGNkJXUiLAkJLyogc2JwLyAqLworCQkidmNzJXMiLAkJLyogdmNjLyAqLworCQkiJWN0eSVjJWMiLAkJLyogcHR5LyAqLworCQlOVUxMCisJfTsKKworCWZvciAodHJhbnMgPSB0cmFuc2xhdGVfdGFibGU7IHRyYW5zLT5tYXRjaCAhPSBOVUxMOyArK3RyYW5zKSB7CisJCWNoYXIgKmFmdGVyX21hdGNoID0gaXNfcHJlZml4ZWRfd2l0aChkZXZuYW1lLCB0cmFucy0+bWF0Y2gpOworCQlpZiAoYWZ0ZXJfbWF0Y2gpIHsKKwkJCWlmICh0cmFucy0+Zm9ybWF0ID09IE5VTEwpCisJCQkJcmV0dXJuIGFmdGVyX21hdGNoOworCQkJc3ByaW50ZihidWZmZXIsIHRyYW5zLT5mb3JtYXQsIGFmdGVyX21hdGNoKTsKKwkJCXJldHVybiBidWZmZXI7CisJCX0KKwl9CisKKwlwdHIgPSBiYl9iYXNlbmFtZShkZXZuYW1lKTsKKwlpID0gc2Nhbl9kZXZfbmFtZShkZXZuYW1lLCBuYW1lbGVuLCBwdHIpOworCisJaWYgKGkgPiAwICYmIGkgPCAxMykKKwkJY29tcGF0X25hbWUgPSBidWZmZXI7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKKworCS8qIDEgPT0gc2NzaS9nZW5lcmljLCAzID09IHNjc2kvY2QsIDEwID09IHNicC8gKi8KKwlpZiAoaSA9PSAxIHx8IGkgPT0gMyB8fCBpID09IDEwKQorCQlzcHJpbnRmKGJ1ZmZlciwgZm10W2ldLCBtaW5vcik7CisKKwkvKiAyID09c2NzaS9kaXNjLCA0ID09IHNjc2kvcGFydCAqLworCWlmIChpID09IDIgfHwgaSA9PSA0KQorCQljb21wYXRfbmFtZSA9IHdyaXRlX29sZF9zZF9uYW1lKGJ1ZmZlciwgbWFqb3IsIG1pbm9yLCAoKGkgPT0gMikgPyAiIiA6IChwdHIgKyA0KSkpOworCisJLyogNSA9PSBzY3NpL210ICovCisJaWYgKGkgPT0gNSkgeworCQltb2RlID0gcHRyWzJdOworCQlpZiAobW9kZSA9PSAnbicpCisJCQltb2RlID0gJ1wwJzsKKwkJc3ByaW50ZihidWZmZXIsIGZtdFtpXSwgbWlub3IgJiAweDFmLCBtb2RlKTsKKwkJaWYgKGRldm5hbWVbbmFtZWxlbiAtIDFdICE9ICduJykKKwkJCSsrY29tcGF0X25hbWU7CisJfQorCS8qIDYgPT0gaWRlL2hvc3QvZGlzYywgNyA9PSBpZGUvaG9zdC9jZCwgOCA9PSBpZGUvaG9zdC9wYXJ0ICovCisJaWYgKGkgPT0gNiB8fCBpID09IDcgfHwgaSA9PSA4KQorCQkvKiBsYXN0IGFyZyBzaG91bGQgYmUgaWdub3JlZCBmb3IgaSA9PSA2IG9yIGk9PSA3ICovCisJCXNwcmludGYoYnVmZmVyLCBmbXRbaV0gLCBnZXRfb2xkX2lkZV9uYW1lKG1ham9yLCBtaW5vciksIHB0ciArIDQpOworCisJLyogOSA9PSAgaWRlL2hvc3QvbXQgKi8KKwlpZiAoaSA9PSA5KQorCQlzcHJpbnRmKGJ1ZmZlciwgZm10W2ldLCBwdHIgKyAyLCBtaW5vciAmIDB4N2YpOworCisJLyogIDExID09IHZjYy8gKi8KKwlpZiAoaSA9PSAxMSkgeworCQlzcHJpbnRmKGJ1ZmZlciwgZm10W2ldLCBkZXZuYW1lICsgNCk7CisJCWlmIChidWZmZXJbM10gPT0gJzAnKQorCQkJYnVmZmVyWzNdID0gJ1wwJzsKKwl9CisJLyogMTIgPT0gIHB0eS8gKi8KKwlpZiAoaSA9PSAxMikgeworCQlwdHkxID0gInBxcnN0dXZ3eHl6YWJjZGUiOworCQlwdHkyID0gIjAxMjM0NTY3ODlhYmNkZWYiOworCQlpbmRleHggPSBhdG9pKGRldm5hbWUgKyA1KTsKKwkJc3ByaW50ZihidWZmZXIsIGZtdFtpXSwgKGRldm5hbWVbNF0gPT0gJ20nKSA/ICdwJyA6ICd0JywgcHR5MVtpbmRleHggPj4gNF0sIHB0eTJbaW5kZXh4ICYgMHgwZl0pOworCX0KKwlyZXR1cm4gY29tcGF0X25hbWU7Cit9ICAgLyogIEVuZCBGdW5jdGlvbiBnZXRfb2xkX25hbWUgICovCisKK3N0YXRpYyBjaGFyIGdldF9vbGRfaWRlX25hbWUodW5zaWduZWQgaW50IG1ham9yLCB1bnNpZ25lZCBpbnQgbWlub3IpCisvKiAgW1NVTU1BUlldIEdldCB0aGUgb2xkIElERSBuYW1lIGZvciBhIGRldmljZS4KKyAgICA8bWFqb3I+IFRoZSBtYWpvciBudW1iZXIgZm9yIHRoZSBkZXZpY2UuCisgICAgPG1pbm9yPiBUaGUgbWlub3IgbnVtYmVyIGZvciB0aGUgZGV2aWNlLgorICAgIFtSRVRVUk5TXSBUaGUgZHJpdmUgbGV0dGVyLgorKi8KK3sKKwljaGFyIGxldHRlciA9ICd5JzsJLyogMTIxICovCisJY2hhciBjID0gJ2EnOwkJLyogIDk3ICovCisJaW50IGkgPSBJREUwX01BSk9SOworCisJLyogSSBob3BlIGl0IHdvcmtzIGxpa2UgdGhlIHByZXZpb3VzIGNvZGUgYXMgaXQgc2F2ZXMgYSBmZXcgYnl0ZXMuIFRpdG8gO1AgKi8KKwlkbyB7CisJCWlmIChpID09IElERTBfTUFKT1IgfHwgaSA9PSBJREUxX01BSk9SIHx8IGkgPT0gSURFMl9NQUpPUgorCQkgfHwgaSA9PSBJREUzX01BSk9SIHx8IGkgPT0gSURFNF9NQUpPUiB8fCBpID09IElERTVfTUFKT1IKKwkJIHx8IGkgPT0gSURFNl9NQUpPUiB8fCBpID09IElERTdfTUFKT1IgfHwgaSA9PSBJREU4X01BSk9SCisJCSB8fCBpID09IElERTlfTUFKT1IKKwkJKSB7CisJCQlpZiAoKHVuc2lnbmVkIGludClpID09IG1ham9yKSB7CisJCQkJbGV0dGVyID0gYzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWMgKz0gMjsKKwkJfQorCQlpKys7CisJfSB3aGlsZSAoaSA8PSBJREU5X01BSk9SKTsKKworCWlmIChtaW5vciA+IDYzKQorCQkrK2xldHRlcjsKKwlyZXR1cm4gbGV0dGVyOworfSAgIC8qICBFbmQgRnVuY3Rpb24gZ2V0X29sZF9pZGVfbmFtZSAgKi8KKworc3RhdGljIGNoYXIgKndyaXRlX29sZF9zZF9uYW1lKGNoYXIgKmJ1ZmZlciwKKwkJCQl1bnNpZ25lZCBpbnQgbWFqb3IsIHVuc2lnbmVkIGludCBtaW5vciwKKwkJCQljb25zdCBjaGFyICpwYXJ0KQorLyogIFtTVU1NQVJZXSBXcml0ZSB0aGUgb2xkIFNDU0kgZGlzYyBuYW1lIHRvIGEgYnVmZmVyLgorICAgIDxidWZmZXI+IFRoZSBidWZmZXIgdG8gd3JpdGUgdG8uCisgICAgPG1ham9yPiBUaGUgbWFqb3IgbnVtYmVyIGZvciB0aGUgZGV2aWNlLgorICAgIDxtaW5vcj4gVGhlIG1pbm9yIG51bWJlciBmb3IgdGhlIGRldmljZS4KKyAgICA8cGFydD4gVGhlIHBhcnRpdGlvbiBzdHJpbmcuIE11c3QgYmUgIiIgZm9yIGEgd2hvbGUtZGlzYyBlbnRyeS4KKyAgICBbUkVUVVJOU10gQSBwb2ludGVyIHRvIHRoZSBidWZmZXIgb24gc3VjY2VzcywgZWxzZSBOVUxMLgorKi8KK3sKKwl1bnNpZ25lZCBpbnQgZGlzY19pbmRleDsKKworCWlmIChtYWpvciA9PSA4KSB7CisJCXNwcmludGYoYnVmZmVyLCAic2QlYyVzIiwgJ2EnICsgKG1pbm9yID4+IDQpLCBwYXJ0KTsKKwkJcmV0dXJuIGJ1ZmZlcjsKKwl9CisJaWYgKChtYWpvciA+IDY0KSAmJiAobWFqb3IgPCA3MikpIHsKKwkJZGlzY19pbmRleCA9ICgobWFqb3IgLSA2NCkgPDwgNCkgKyhtaW5vciA+PiA0KTsKKwkJaWYgKGRpc2NfaW5kZXggPCAyNikKKwkJCXNwcmludGYoYnVmZmVyLCAic2QlYyVzIiwgJ2EnICsgZGlzY19pbmRleCwgcGFydCk7CisJCWVsc2UKKwkJCXNwcmludGYoYnVmZmVyLCAic2QlYyVjJXMiLCAnYScgKyhkaXNjX2luZGV4IC8gMjYpIC0gMSwgJ2EnICsgZGlzY19pbmRleCAlIDI2LCBwYXJ0KTsKKwkJcmV0dXJuIGJ1ZmZlcjsKKwl9CisJcmV0dXJuIE5VTEw7Cit9ICAgLyogIEVuZCBGdW5jdGlvbiB3cml0ZV9vbGRfc2RfbmFtZSAgKi8KKworCisvKiAgZXhwcmVzc2lvbi5jICovCisKKy8qRVhQRVJJTUVOVEFMX0ZVTkNUSU9OKi8KKworaW50IHN0X2V4cHJfZXhwYW5kKGNoYXIgKm91dHB1dCwgdW5zaWduZWQgaW50IGxlbmd0aCwgY29uc3QgY2hhciAqaW5wdXQsCisJCWNvbnN0IGNoYXIgKigqZ2V0X3ZhcmlhYmxlX2Z1bmMpKGNvbnN0IGNoYXIgKnZhcmlhYmxlLAorCQkJCQkJdm9pZCAqaW5mbyksCisJCXZvaWQgKmluZm8pCisvKiAgW1NVTU1BUlldIEV4cGFuZCBhbiBleHByZXNzaW9uIHVzaW5nIEJvcm5lIFNoZWxsLWxpa2UgdW5xdW90ZWQgcnVsZXMuCisgICAgPG91dHB1dD4gVGhlIG91dHB1dCBleHBhbmRlZCBleHByZXNzaW9uIGlzIHdyaXR0ZW4gaGVyZS4KKyAgICA8bGVuZ3RoPiBUaGUgc2l6ZSBvZiB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICA8aW5wdXQ+IFRoZSBpbnB1dCBleHByZXNzaW9uLiBUaGlzIG1heSBlcXVhbCA8PG91dHB1dD4+LgorICAgIDxnZXRfdmFyaWFibGU+IEEgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGdldCB2YXJpYWJsZSB2YWx1ZXMuIElmCisgICAgdGhpcyByZXR1cm5zIE5VTEwsIHRoZSBlbnZpcm9ubWVudCBpcyBzZWFyY2hlZCBpbnN0ZWFkLiBJZiB0aGlzIGlzIE5VTEwsCisgICAgb25seSB0aGUgZW52aXJvbm1lbnQgaXMgc2VhcmNoZWQuCisgICAgPGluZm8+IEFuIGFyYml0cmFyeSBwb2ludGVyIHBhc3NlZCB0byA8PGdldF92YXJpYWJsZT4+LgorICAgIFtSRVRVUk5TXSBUUlVFIG9uIHN1Y2Nlc3MsIGVsc2UgRkFMU0UuCisqLworeworCWNoYXIgY2g7CisJdW5zaWduZWQgaW50IGxlbjsKKwl1bnNpZ25lZCBpbnQgb3V0X3BvcyA9IDA7CisJY29uc3QgY2hhciAqZW52OworCWNvbnN0IGNoYXIgKnB0cjsKKwlzdHJ1Y3QgcGFzc3dkICpwd2VudDsKKwljaGFyIGJ1ZmZlcltCVUZGRVJfU0laRV0sIHRtcFtTVFJJTkdfTEVOR1RIXTsKKworCWlmIChsZW5ndGggPiBCVUZGRVJfU0laRSkKKwkJbGVuZ3RoID0gQlVGRkVSX1NJWkU7CisJZm9yICg7IFRSVUU7ICsraW5wdXQpIHsKKwkJc3dpdGNoIChjaCA9ICppbnB1dCkgeworCQkJY2FzZSAnJCc6CisJCQkJLyogIFZhcmlhYmxlIGV4cGFuc2lvbiAgKi8KKwkJCQlpbnB1dCA9IGV4cGFuZF92YXJpYWJsZShidWZmZXIsIGxlbmd0aCwgJm91dF9wb3MsICsraW5wdXQsIGdldF92YXJpYWJsZV9mdW5jLCBpbmZvKTsKKwkJCQlpZiAoaW5wdXQgPT0gTlVMTCkKKwkJCQkJcmV0dXJuIEZBTFNFOworCQkJCWJyZWFrOworCQkJY2FzZSAnfic6CisJCQkJLyogIEhvbWUgZGlyZWN0b3J5IGV4cGFuc2lvbiAgKi8KKwkJCQljaCA9IGlucHV0WzFdOworCQkJCWlmIChpc3NwYWNlKGNoKSB8fChjaCA9PSAnLycpIHx8KGNoID09ICdcMCcpKSB7CisJCQkJCS8qIFVzZXIncyBvd24gaG9tZSBkaXJlY3Rvcnk6IGxlYXZlIHNlcGFyYXRvciBmb3IgbmV4dCB0aW1lICovCisJCQkJCWVudiA9IGdldGVudigiSE9NRSIpOworCQkJCQlpZiAoZW52ID09IE5VTEwpIHsKKwkJCQkJCWluZm9fbG9nZ2VyKExPR19JTkZPLCBiYl9tc2dfdmFyaWFibGVfbm90X2ZvdW5kLCAiSE9NRSIpOworCQkJCQkJcmV0dXJuIEZBTFNFOworCQkJCQl9CisJCQkJCWxlbiA9IHN0cmxlbihlbnYpOworCQkJCQlpZiAobGVuICsgb3V0X3BvcyA+PSBsZW5ndGgpCisJCQkJCQlnb3RvIHN0X2V4cHJfZXhwYW5kX291dDsKKwkJCQkJbWVtY3B5KGJ1ZmZlciArIG91dF9wb3MsIGVudiwgbGVuICsgMSk7CisJCQkJCW91dF9wb3MgKz0gbGVuOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyogIFNvbWVvbmUgZWxzZSdzIGhvbWUgZGlyZWN0b3J5ICAqLworCQkJCWZvciAocHRyID0gKytpbnB1dDsgIWlzc3BhY2UoY2gpICYmIChjaCAhPSAnLycpICYmIChjaCAhPSAnXDAnKTsgY2ggPSAqKytwdHIpCisJCQkJCS8qIFZPSUQgKi87CisJCQkJbGVuID0gcHRyIC0gaW5wdXQ7CisJCQkJaWYgKGxlbiA+PSBzaXplb2YgdG1wKQorCQkJCQlnb3RvIHN0X2V4cHJfZXhwYW5kX291dDsKKwkJCQlzYWZlX21lbWNweSh0bXAsIGlucHV0LCBsZW4pOworCQkJCWlucHV0ID0gcHRyIC0gMTsKKwkJCQlwd2VudCA9IGdldHB3bmFtKHRtcCk7CisJCQkJaWYgKHB3ZW50ID09IE5VTEwpIHsKKwkJCQkJaW5mb19sb2dnZXIoTE9HX0lORk8sICJubyBwd2VudCBmb3I6ICVzIiwgdG1wKTsKKwkJCQkJcmV0dXJuIEZBTFNFOworCQkJCX0KKwkJCQlsZW4gPSBzdHJsZW4ocHdlbnQtPnB3X2Rpcik7CisJCQkJaWYgKGxlbiArIG91dF9wb3MgPj0gbGVuZ3RoKQorCQkJCQlnb3RvIHN0X2V4cHJfZXhwYW5kX291dDsKKwkJCQltZW1jcHkoYnVmZmVyICsgb3V0X3BvcywgcHdlbnQtPnB3X2RpciwgbGVuICsgMSk7CisJCQkJb3V0X3BvcyArPSBsZW47CisJCQkJYnJlYWs7CisJCQljYXNlICdcMCc6CisJCQkvKiBGYWxsdHJvdWdoICovCisJCQlkZWZhdWx0OgorCQkJCWlmIChvdXRfcG9zID49IGxlbmd0aCkKKwkJCQkJZ290byBzdF9leHByX2V4cGFuZF9vdXQ7CisJCQkJYnVmZmVyW291dF9wb3MrK10gPSBjaDsKKwkJCQlpZiAoY2ggPT0gJ1wwJykgeworCQkJCQltZW1jcHkob3V0cHV0LCBidWZmZXIsIG91dF9wb3MpOworCQkJCQlyZXR1cm4gVFJVRTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQkvKiBlc2FjICovCisJCX0KKwl9CisJcmV0dXJuIEZBTFNFOworc3RfZXhwcl9leHBhbmRfb3V0OgorCWluZm9fbG9nZ2VyKExPR19JTkZPLCBiYl9tc2dfc21hbGxfYnVmZmVyKTsKKwlyZXR1cm4gRkFMU0U7Cit9ICAgLyogIEVuZCBGdW5jdGlvbiBzdF9leHByX2V4cGFuZCAgKi8KKworCisvKiAgUHJpdmF0ZSBmdW5jdGlvbnMgZm9sbG93ICAqLworCitzdGF0aWMgY29uc3QgY2hhciAqZXhwYW5kX3ZhcmlhYmxlKGNoYXIgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGxlbmd0aCwKKwkJCQl1bnNpZ25lZCBpbnQgKm91dF9wb3MsIGNvbnN0IGNoYXIgKmlucHV0LAorCQkJCWNvbnN0IGNoYXIgKigqZnVuYykoY29uc3QgY2hhciAqdmFyaWFibGUsCisJCQkJCQkJdm9pZCAqaW5mbyksCisJCQkJdm9pZCAqaW5mbykKKy8qICBbU1VNTUFSWV0gRXhwYW5kIGEgdmFyaWFibGUuCisgICAgPGJ1ZmZlcj4gVGhlIGJ1ZmZlciB0byB3cml0ZSB0by4KKyAgICA8bGVuZ3RoPiBUaGUgbGVuZ3RoIG9mIHRoZSBvdXRwdXQgYnVmZmVyLgorICAgIDxvdXRfcG9zPiBUaGUgY3VycmVudCBvdXRwdXQgcG9zaXRpb24uIFRoaXMgaXMgdXBkYXRlZC4KKyAgICA8aW5wdXQ+IEEgcG9pbnRlciB0byB0aGUgaW5wdXQgY2hhcmFjdGVyIHBvaW50ZXIuCisgICAgPGZ1bmM+IEEgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGdldCB2YXJpYWJsZSB2YWx1ZXMuIElmIHRoaXMKKyAgICByZXR1cm5zIE5VTEwsIHRoZSBlbnZpcm9ubWVudCBpcyBzZWFyY2hlZCBpbnN0ZWFkLiBJZiB0aGlzIGlzIE5VTEwsIG9ubHkKKyAgICB0aGUgZW52aXJvbm1lbnQgaXMgc2VhcmNoZWQuCisgICAgPGluZm8+IEFuIGFyYml0cmFyeSBwb2ludGVyIHBhc3NlZCB0byA8PGZ1bmM+Pi4KKyAgICA8ZXJyZnA+IERpYWdub3N0aWMgbWVzc2FnZXMgYXJlIHdyaXR0ZW4gaGVyZS4KKyAgICBbUkVUVVJOU10gQSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhpcyBzdWJleHByZXNzaW9uIG9uIHN1Y2Nlc3MsIGVsc2UgTlVMTC4KKyovCit7CisJY2hhciBjaDsKKwlpbnQgbGVuOworCXVuc2lnbmVkIGludCBvcGVuX2JyYWNlczsKKwljb25zdCBjaGFyICplbnYsICpwdHI7CisJY2hhciB0bXBbU1RSSU5HX0xFTkdUSF07CisKKwljaCA9IGlucHV0WzBdOworCWlmIChjaCA9PSAnJCcpIHsKKwkJLyogIFNwZWNpYWwgY2FzZSBmb3IgIiQkIjogUElEICAqLworCQlzcHJpbnRmKHRtcCwgIiVkIiwgKGludCkgZ2V0cGlkKCkpOworCQlsZW4gPSBzdHJsZW4odG1wKTsKKwkJaWYgKGxlbiArICpvdXRfcG9zID49IGxlbmd0aCkKKwkJCWdvdG8gZXhwYW5kX3ZhcmlhYmxlX291dDsKKworCQltZW1jcHkoYnVmZmVyICsgKm91dF9wb3MsIHRtcCwgbGVuICsgMSk7CisJCW91dF9wb3MgKz0gbGVuOworCQlyZXR1cm4gaW5wdXQ7CisJfQorCS8qICBPcmRpbmFyeSB2YXJpYWJsZSBleHBhbnNpb24sIHBvc3NpYmx5IGluIGJyYWNlcyAgKi8KKwlpZiAoY2ggIT0gJ3snKSB7CisJCS8qICBTaW1wbGUgdmFyaWFibGUgZXhwYW5zaW9uICAqLworCQlmb3IgKHB0ciA9IGlucHV0OyBpc2FsbnVtKGNoKSB8fCAoY2ggPT0gJ18nKSB8fCAoY2ggPT0gJzonKTsgY2ggPSAqKytwdHIpCisJCQkvKiBWT0lEICovOworCQlsZW4gPSBwdHIgLSBpbnB1dDsKKwkJaWYgKChzaXplX3QpbGVuID49IHNpemVvZiB0bXApCisJCQlnb3RvIGV4cGFuZF92YXJpYWJsZV9vdXQ7CisKKwkJc2FmZV9tZW1jcHkodG1wLCBpbnB1dCwgbGVuKTsKKwkJaW5wdXQgPSBwdHIgLSAxOworCQllbnYgPSBnZXRfdmFyaWFibGVfdjIodG1wLCBmdW5jLCBpbmZvKTsKKwkJaWYgKGVudiA9PSBOVUxMKSB7CisJCQlpbmZvX2xvZ2dlcihMT0dfSU5GTywgYmJfbXNnX3ZhcmlhYmxlX25vdF9mb3VuZCwgdG1wKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCWxlbiA9IHN0cmxlbihlbnYpOworCQlpZiAobGVuICsgKm91dF9wb3MgPj0gbGVuZ3RoKQorCQkJZ290byBleHBhbmRfdmFyaWFibGVfb3V0OworCisJCW1lbWNweShidWZmZXIgKyAqb3V0X3BvcywgZW52LCBsZW4gKyAxKTsKKwkJKm91dF9wb3MgKz0gbGVuOworCQlyZXR1cm4gaW5wdXQ7CisJfQorCS8qICBWYXJpYWJsZSBpbiBicmFjZXM6IGNoZWNrIGZvciAnOicgdHJpY2tzICAqLworCWNoID0gKisraW5wdXQ7CisJZm9yIChwdHIgPSBpbnB1dDsgaXNhbG51bShjaCkgfHwgKGNoID09ICdfJyk7IGNoID0gKisrcHRyKQorCQkvKiBWT0lEICovOworCWlmIChjaCA9PSAnfScpIHsKKwkJLyogIE11c3QgYmUgc2ltcGxlIHZhcmlhYmxlIGV4cGFuc2lvbiB3aXRoICIke3Zhcn0iICAqLworCQlsZW4gPSBwdHIgLSBpbnB1dDsKKwkJaWYgKChzaXplX3QpbGVuID49IHNpemVvZiB0bXApCisJCQlnb3RvIGV4cGFuZF92YXJpYWJsZV9vdXQ7CisKKwkJc2FmZV9tZW1jcHkodG1wLCBpbnB1dCwgbGVuKTsKKwkJcHRyID0gZXhwYW5kX3ZhcmlhYmxlKGJ1ZmZlciwgbGVuZ3RoLCBvdXRfcG9zLCB0bXAsIGZ1bmMsIGluZm8pOworCQlpZiAocHRyID09IE5VTEwpCisJCQlyZXR1cm4gTlVMTDsKKwkJcmV0dXJuIGlucHV0ICsgbGVuOworCX0KKwlpZiAoY2ggIT0gJzonIHx8IHB0clsxXSAhPSAnLScpIHsKKwkJaW5mb19sb2dnZXIoTE9HX0lORk8sICJpbGxlZ2FsIGNoYXIgaW4gdmFyIG5hbWUiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCS8qICBJdCdzIHRoYXQgaGFuZHkgIiR7dmFyOi13b3JkfSIgZXhwcmVzc2lvbi4gQ2hlY2sgaWYgdmFyIGlzIGRlZmluZWQgICovCisJbGVuID0gcHRyIC0gaW5wdXQ7CisJaWYgKChzaXplX3QpbGVuID49IHNpemVvZiB0bXApCisJCWdvdG8gZXhwYW5kX3ZhcmlhYmxlX291dDsKKworCXNhZmVfbWVtY3B5KHRtcCwgaW5wdXQsIGxlbik7CisJLyogIE1vdmUgaW5wdXQgcG9pbnRlciB0byAnOicgICovCisJaW5wdXQgPSBwdHI7CisJLyogIEZpcnN0IHNraXAgdG8gY2xvc2luZyBicmFjZSwgdGFraW5nIG5vdGUgb2YgbmVzdGVkIGV4cHJlc3Npb25zICAqLworCXB0ciArPSAyOworCWNoID0gcHRyWzBdOworCWZvciAob3Blbl9icmFjZXMgPSAxOyBvcGVuX2JyYWNlcyA+IDA7IGNoID0gKisrcHRyKSB7CisJCXN3aXRjaCAoY2gpIHsKKwkJCWNhc2UgJ3snOgorCQkJCSsrb3Blbl9icmFjZXM7CisJCQkJYnJlYWs7CisJCQljYXNlICd9JzoKKwkJCQktLW9wZW5fYnJhY2VzOworCQkJCWJyZWFrOworCQkJY2FzZSAnXDAnOgorCQkJCWluZm9fbG9nZ2VyKExPR19JTkZPLCAiXCJ9XCIgbm90IGZvdW5kIGluOiAlcyIsIGlucHV0KTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCX0KKwl9CisJLS1wdHI7CisJLyogIEF0IHRoaXMgcG9pbnQgcHRyIHNob3VsZCBwb2ludCB0byBjbG9zaW5nIGJyYWNlIG9mICIke3Zhcjotd29yZH0iICAqLworCWVudiA9IGdldF92YXJpYWJsZV92Mih0bXAsIGZ1bmMsIGluZm8pOworCWlmIChlbnYgIT0gTlVMTCkgeworCQkvKiAgRm91bmQgZW52aXJvbm1lbnQgdmFyaWFibGUsIHNvIHNraXAgdGhlIGlucHV0IHRvIHRoZSBjbG9zaW5nIGJyYWNlCisJCQlhbmQgcmV0dXJuIHRoZSB2YXJpYWJsZSAgKi8KKwkJaW5wdXQgPSBwdHI7CisJCWxlbiA9IHN0cmxlbihlbnYpOworCQlpZiAobGVuICsgKm91dF9wb3MgPj0gbGVuZ3RoKQorCQkJZ290byBleHBhbmRfdmFyaWFibGVfb3V0OworCisJCW1lbWNweShidWZmZXIgKyAqb3V0X3BvcywgZW52LCBsZW4gKyAxKTsKKwkJKm91dF9wb3MgKz0gbGVuOworCQlyZXR1cm4gaW5wdXQ7CisJfQorCS8qICBFbnZpcm9ubWVudCB2YXJpYWJsZSB3YXMgbm90IGZvdW5kLCBzbyBwcm9jZXNzIHdvcmQuIEFkdmFuY2UgaW5wdXQKKwlwb2ludGVyIHRvIHN0YXJ0IG9mIHdvcmQgaW4gIiR7dmFyOi13b3JkfSIgICovCisJaW5wdXQgKz0gMjsKKwlsZW4gPSBwdHIgLSBpbnB1dDsKKwlpZiAoKHNpemVfdClsZW4gPj0gc2l6ZW9mIHRtcCkKKwkJZ290byBleHBhbmRfdmFyaWFibGVfb3V0OworCisJc2FmZV9tZW1jcHkodG1wLCBpbnB1dCwgbGVuKTsKKwlpbnB1dCA9IHB0cjsKKwlpZiAoIXN0X2V4cHJfZXhwYW5kKHRtcCwgU1RSSU5HX0xFTkdUSCwgdG1wLCBmdW5jLCBpbmZvKSkKKwkJcmV0dXJuIE5VTEw7CisJbGVuID0gc3RybGVuKHRtcCk7CisJaWYgKGxlbiArICpvdXRfcG9zID49IGxlbmd0aCkKKwkJZ290byBleHBhbmRfdmFyaWFibGVfb3V0OworCisJbWVtY3B5KGJ1ZmZlciArICpvdXRfcG9zLCB0bXAsIGxlbiArIDEpOworCSpvdXRfcG9zICs9IGxlbjsKKwlyZXR1cm4gaW5wdXQ7CitleHBhbmRfdmFyaWFibGVfb3V0OgorCWluZm9fbG9nZ2VyKExPR19JTkZPLCBiYl9tc2dfc21hbGxfYnVmZmVyKTsKKwlyZXR1cm4gTlVMTDsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIGV4cGFuZF92YXJpYWJsZSAgKi8KKworCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3ZhcmlhYmxlX3YyKGNvbnN0IGNoYXIgKnZhcmlhYmxlLAorCQkJCWNvbnN0IGNoYXIgKigqZnVuYykoY29uc3QgY2hhciAqdmFyaWFibGUsIHZvaWQgKmluZm8pLAorCQkJCXZvaWQgKmluZm8pCisvKiAgW1NVTU1BUlldIEdldCBhIHZhcmlhYmxlIGZyb20gdGhlIGVudmlyb25tZW50IG9yIC4KKyAgICA8dmFyaWFibGU+IFRoZSB2YXJpYWJsZSBuYW1lLgorICAgIDxmdW5jPiBBIGZ1bmN0aW9uIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBnZXQgdGhlIHZhcmlhYmxlLiBJZiB0aGlzIHJldHVybnMKKyAgICBOVUxMLCB0aGUgZW52aXJvbm1lbnQgaXMgc2VhcmNoZWQgaW5zdGVhZC4gSWYgdGhpcyBpcyBOVUxMLCBvbmx5IHRoZQorICAgIGVudmlyb25tZW50IGlzIHNlYXJjaGVkLgorICAgIFtSRVRVUk5TXSBUaGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIG9uIHN1Y2Nlc3MsIGVsc2UgTlVMTC4KKyovCit7CisJY29uc3QgY2hhciAqdmFsdWU7CisKKwlpZiAoZnVuYyAhPSBOVUxMKSB7CisJCXZhbHVlID0gKCpmdW5jKSh2YXJpYWJsZSwgaW5mbyk7CisJCWlmICh2YWx1ZSAhPSBOVUxMKQorCQkJcmV0dXJuIHZhbHVlOworCX0KKwlyZXR1cm4gZ2V0ZW52KHZhcmlhYmxlKTsKK30gICAvKiAgRW5kIEZ1bmN0aW9uIGdldF92YXJpYWJsZSAgKi8KKworLyogRU5EIE9GIENPREUgKi8KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9kZXZtZW0uYyBiL21pc2N1dGlscy9kZXZtZW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODZhMjFiCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL2Rldm1lbS5jCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDAsIEphbi1EZXJrIEJha2tlciAoSi5ELkJha2tlckBpdHMudHVkZWxmdC5ubCkKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDgsIEJ1c3lCb3ggVGVhbS4gLXNvbGFyIDQvMjYvMDgKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZGV2bWVtX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSJBRERSRVNTIFtXSURUSCBbVkFMVUVdXSIKKy8vdXNhZ2U6I2RlZmluZSBkZXZtZW1fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSZWFkL3dyaXRlIGZyb20gcGh5c2ljYWwgYWRkcmVzc1xuIgorLy91c2FnZTogICAgICJcbglBRERSRVNTCUFkZHJlc3MgdG8gYWN0IHVwb24iCisvL3VzYWdlOiAgICAgIlxuCVdJRFRICVdpZHRoICg4LzE2Ly4uLikiCisvL3VzYWdlOiAgICAgIlxuCVZBTFVFCURhdGEgdG8gYmUgd3JpdHRlbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBkZXZtZW1fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGRldm1lbV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdm9pZCAqbWFwX2Jhc2UsICp2aXJ0X2FkZHI7CisJdWludDY0X3QgcmVhZF9yZXN1bHQ7CisJdWludDY0X3Qgd3JpdGV2YWwgPSB3cml0ZXZhbDsgLyogZm9yIGNvbXBpbGVyICovCisJb2ZmX3QgdGFyZ2V0OworCXVuc2lnbmVkIHBhZ2Vfc2l6ZSwgbWFwcGVkX3NpemUsIG9mZnNldF9pbl9wYWdlOworCWludCBmZDsKKwl1bnNpZ25lZCB3aWR0aCA9IDggKiBzaXplb2YoaW50KTsKKworCS8qIGRldm1lbSBBRERSRVNTIFtXSURUSCBbVkFMVUVdXSAqLworLy8gVE9ETzogb3B0aW9ucz8KKy8vIC1yOiByZWFkIGFuZCBvdXRwdXQgb25seSB0aGUgdmFsdWUgaW4gaGV4LCB3aXRoIDB4IHByZWZpeAorLy8gLXc6IHdyaXRlIG9ubHksIG5vIHJlYWRzIGJlZm9yZSBvciBhZnRlciwgYW5kIG5vIG91dHB1dAorLy8gb3IgbWFrZSB0aGlzIGJlaGF2aW9yIGRlZmF1bHQ/CisvLyBMZXQncyB0cnkgdGhpcyBhbmQgc2VlIGhvdyB1c2VycyByZWFjdC4KKworCS8qIEFERFJFU1MgKi8KKwlpZiAoIWFyZ3ZbMV0pCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwllcnJubyA9IDA7CisJdGFyZ2V0ID0gYmJfc3RydG91bGwoYXJndlsxXSwgTlVMTCwgMCk7IC8qIGFsbG93cyBoZXgsIG9jdCBldGMgKi8KKworCS8qIFdJRFRIICovCisJaWYgKGFyZ3ZbMl0pIHsKKwkJaWYgKGlzZGlnaXQoYXJndlsyXVswXSkgfHwgYXJndlsyXVsxXSkKKwkJCXdpZHRoID0geGF0b3UoYXJndlsyXSk7CisJCWVsc2UgeworCQkJc3RhdGljIGNvbnN0IGNoYXIgYmh3bFtdIEFMSUdOMSA9ICJiaHdsIjsKKwkJCXN0YXRpYyBjb25zdCB1aW50OF90IHNpemVzW10gQUxJR04xID0geworCQkJCTggKiBzaXplb2YoY2hhciksCisJCQkJOCAqIHNpemVvZihzaG9ydCksCisJCQkJOCAqIHNpemVvZihpbnQpLAorCQkJCTggKiBzaXplb2YobG9uZyksCisJCQkJMCAvKiBiYWQgKi8KKwkJCX07CisJCQl3aWR0aCA9IHN0cmNocm51bChiaHdsLCAoYXJndlsyXVswXSB8IDB4MjApKSAtIGJod2w7CisJCQl3aWR0aCA9IHNpemVzW3dpZHRoXTsKKwkJfQorCQkvKiBWQUxVRSAqLworCQlpZiAoYXJndlszXSkKKwkJCXdyaXRldmFsID0gYmJfc3RydG91bGwoYXJndlszXSwgTlVMTCwgMCk7CisJfSBlbHNlIHsgLyogYXJndlsyXSA9PSBOVUxMICovCisJCS8qIG1ha2UgYXJndlszXSB0byBiZSBhIHZhbGlkIHRoaW5nIHRvIGZldGNoICovCisJCWFyZ3YtLTsKKwl9CisJaWYgKGVycm5vKQorCQliYl9zaG93X3VzYWdlKCk7IC8qIG9uZSBvZiBiYl9zdHJ0b3VYWCBmYWlsZWQgKi8KKworCWZkID0geG9wZW4oIi9kZXYvbWVtIiwgYXJndlszXSA/IChPX1JEV1IgfCBPX1NZTkMpIDogKE9fUkRPTkxZIHwgT19TWU5DKSk7CisJbWFwcGVkX3NpemUgPSBwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpOworCW9mZnNldF9pbl9wYWdlID0gKHVuc2lnbmVkKXRhcmdldCAmIChwYWdlX3NpemUgLSAxKTsKKwlpZiAob2Zmc2V0X2luX3BhZ2UgKyB3aWR0aCA+IHBhZ2Vfc2l6ZSkgeworCQkvKiBUaGlzIGFjY2VzcyBzcGFucyBwYWdlcy4KKwkJICogTXVzdCBtYXAgdHdvIHBhZ2VzIHRvIG1ha2UgaXQgcG9zc2libGU6ICovCisJCW1hcHBlZF9zaXplICo9IDI7CisJfQorCW1hcF9iYXNlID0gbW1hcChOVUxMLAorCQkJbWFwcGVkX3NpemUsCisJCQlhcmd2WzNdID8gKFBST1RfUkVBRCB8IFBST1RfV1JJVEUpIDogUFJPVF9SRUFELAorCQkJTUFQX1NIQVJFRCwKKwkJCWZkLAorCQkJdGFyZ2V0ICYgfihvZmZfdCkocGFnZV9zaXplIC0gMSkpOworCWlmIChtYXBfYmFzZSA9PSBNQVBfRkFJTEVEKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIm1tYXAiKTsKKworLy8JcHJpbnRmKCJNZW1vcnkgbWFwcGVkIGF0IGFkZHJlc3MgJXAuXG4iLCBtYXBfYmFzZSk7CisKKwl2aXJ0X2FkZHIgPSAoY2hhciopbWFwX2Jhc2UgKyBvZmZzZXRfaW5fcGFnZTsKKworCWlmICghYXJndlszXSkgeworCQlzd2l0Y2ggKHdpZHRoKSB7CisJCWNhc2UgODoKKwkJCXJlYWRfcmVzdWx0ID0gKih2b2xhdGlsZSB1aW50OF90Kil2aXJ0X2FkZHI7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCXJlYWRfcmVzdWx0ID0gKih2b2xhdGlsZSB1aW50MTZfdCopdmlydF9hZGRyOworCQkJYnJlYWs7CisJCWNhc2UgMzI6CisJCQlyZWFkX3Jlc3VsdCA9ICoodm9sYXRpbGUgdWludDMyX3QqKXZpcnRfYWRkcjsKKwkJCWJyZWFrOworCQljYXNlIDY0OgorCQkJcmVhZF9yZXN1bHQgPSAqKHZvbGF0aWxlIHVpbnQ2NF90Kil2aXJ0X2FkZHI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgd2lkdGgiKTsKKwkJfQorLy8JCXByaW50ZigiVmFsdWUgYXQgYWRkcmVzcyAweCUiT0ZGX0ZNVCJYICglcCk6IDB4JWxsWFxuIiwKKy8vCQkJdGFyZ2V0LCB2aXJ0X2FkZHIsCisvLwkJCSh1bnNpZ25lZCBsb25nIGxvbmcpcmVhZF9yZXN1bHQpOworCQkvKiBaZXJvLXBhZGRlZCBvdXRwdXQgc2hvd3MgdGhlIHdpZHRoIG9mIGFjY2VzcyBqdXN0IGRvbmUgKi8KKwkJcHJpbnRmKCIweCUwKmxsWFxuIiwgKHdpZHRoID4+IDIpLCAodW5zaWduZWQgbG9uZyBsb25nKXJlYWRfcmVzdWx0KTsKKwl9IGVsc2UgeworCQlzd2l0Y2ggKHdpZHRoKSB7CisJCWNhc2UgODoKKwkJCSoodm9sYXRpbGUgdWludDhfdCopdmlydF9hZGRyID0gd3JpdGV2YWw7CisvLwkJCXJlYWRfcmVzdWx0ID0gKih2b2xhdGlsZSB1aW50OF90Kil2aXJ0X2FkZHI7CisJCQlicmVhazsKKwkJY2FzZSAxNjoKKwkJCSoodm9sYXRpbGUgdWludDE2X3QqKXZpcnRfYWRkciA9IHdyaXRldmFsOworLy8JCQlyZWFkX3Jlc3VsdCA9ICoodm9sYXRpbGUgdWludDE2X3QqKXZpcnRfYWRkcjsKKwkJCWJyZWFrOworCQljYXNlIDMyOgorCQkJKih2b2xhdGlsZSB1aW50MzJfdCopdmlydF9hZGRyID0gd3JpdGV2YWw7CisvLwkJCXJlYWRfcmVzdWx0ID0gKih2b2xhdGlsZSB1aW50MzJfdCopdmlydF9hZGRyOworCQkJYnJlYWs7CisJCWNhc2UgNjQ6CisJCQkqKHZvbGF0aWxlIHVpbnQ2NF90Kil2aXJ0X2FkZHIgPSB3cml0ZXZhbDsKKy8vCQkJcmVhZF9yZXN1bHQgPSAqKHZvbGF0aWxlIHVpbnQ2NF90Kil2aXJ0X2FkZHI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgd2lkdGgiKTsKKwkJfQorLy8JCXByaW50ZigiV3JpdHRlbiAweCVsbFg7IHJlYWRiYWNrIDB4JWxsWFxuIiwKKy8vCQkJCSh1bnNpZ25lZCBsb25nIGxvbmcpd3JpdGV2YWwsCisvLwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXJlYWRfcmVzdWx0KTsKKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJaWYgKG11bm1hcChtYXBfYmFzZSwgbWFwcGVkX3NpemUpID09IC0xKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJtdW5tYXAiKTsKKwkJY2xvc2UoZmQpOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvZWplY3QuYyBiL21pc2N1dGlscy9lamVjdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMGUwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvZWplY3QuYwpAQCAtMCwwICsxLDEyOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZWplY3QgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgIFBldGVyIFdpbGxpcyA8cHN5cGhyZWFrQHBocmVha2VyLm5ldD4KKyAqIENvcHlyaWdodCAoQykgMjAwNSAgVGl0byBSYWd1c2EgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKKyAqIFRoaXMgaXMgYSBzaW1wbGUgaGFjayBvZiBlamVjdCBiYXNlZCBvbiBzb21ldGhpbmcgRXJpayBwb3N0ZWQgaW4gI3VjbGliYy4KKyAqIE1vc3Qgb2YgdGhlIGRpcnR5IHdvcmsgYmxhdGFudGx5IHJpcHBlZCBvZmYgZnJvbSBjYXQuYyA9KQorICovCisKKy8vdXNhZ2U6I2RlZmluZSBlamVjdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy10XSBbLVRdIFtERVZJQ0VdIgorLy91c2FnZTojZGVmaW5lIGVqZWN0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRWplY3QgREVWSUNFIG9yIGRlZmF1bHQgL2Rldi9jZHJvbVxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9FSkVDVF9TQ1NJKAorLy91c2FnZTogICAgICJcbgktcwlTQ1NJIGRldmljZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXQJQ2xvc2UgdHJheSIKKy8vdXNhZ2U6ICAgICAiXG4JLVQJT3Blbi9jbG9zZSB0cmF5ICh0b2dnbGUpIgorCisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSAibGliYmIuaCIKKy8qIE11c3QgYmUgYWZ0ZXIgbGliYmIuaDogdGhleSBuZWVkIHNpemVfdCAqLworI2luY2x1ZGUgImZpeF91MzIuaCIKKyNpbmNsdWRlIDxzY3NpL3NnLmg+CisjaW5jbHVkZSA8c2NzaS9zY3NpLmg+CisKKy8qIHZhcmlvdXMgZGVmaW5lcyBzd2lwZWQgZnJvbSBsaW51eC9jZHJvbS5oICovCisjZGVmaW5lIENEUk9NQ0xPU0VUUkFZICAgICAgICAgICAgMHg1MzE5ICAvKiBwZW5kYW50IG9mIENEUk9NRUpFQ1QgICovCisjZGVmaW5lIENEUk9NRUpFQ1QgICAgICAgICAgICAgICAgMHg1MzA5ICAvKiBFamVjdHMgdGhlIGNkcm9tIG1lZGlhICovCisjZGVmaW5lIENEUk9NX0RSSVZFX1NUQVRVUyAgICAgICAgMHg1MzI2ICAvKiBHZXQgdHJheSBwb3NpdGlvbiwgZXRjLiAqLworLyogZHJpdmUgc3RhdHVzIHBvc3NpYmlsaXRpZXMgcmV0dXJuZWQgYnkgQ0RST01fRFJJVkVfU1RBVFVTIGlvY3RsICovCisjZGVmaW5lIENEU19UUkFZX09QRU4gICAgICAgIDIKKworI2RlZmluZSBkZXZfZmQgMworCisvKiBDb2RlIHRha2VuIGZyb20gdGhlIG9yaWdpbmFsIGVqZWN0IChodHRwOi8vZWplY3Quc291cmNlZm9yZ2UubmV0LyksCisgKiByZWZhY3RvcmVkIGl0IGEgYml0IGZvciBidXN5Ym94IChuZS1iYkBuaWNvZXJmdXJ0aC5kZSkgKi8KKworc3RhdGljIHZvaWQgZWplY3Rfc2NzaShjb25zdCBjaGFyICpkZXYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgc2dfY29tbWFuZHNbM11bNl0gPSB7CisJCXsgQUxMT1dfTUVESVVNX1JFTU9WQUwsIDAsIDAsIDAsIDAsIDAgfSwKKwkJeyBTVEFSVF9TVE9QLCAwLCAwLCAwLCAxLCAwIH0sCisJCXsgU1RBUlRfU1RPUCwgMCwgMCwgMCwgMiwgMCB9CisJfTsKKworCXVuc2lnbmVkIGk7CisJdW5zaWduZWQgY2hhciBzZW5zZV9idWZmZXJbMzJdOworCXVuc2lnbmVkIGNoYXIgaW5xQnVmZlsyXTsKKwlzZ19pb19oZHJfdCBpb19oZHI7CisKKwlpZiAoKGlvY3RsKGRldl9mZCwgU0dfR0VUX1ZFUlNJT05fTlVNLCAmaSkgPCAwKSB8fCAoaSA8IDMwMDAwKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vdCBhIHNnIGRldmljZSBvciBvbGQgc2cgZHJpdmVyIik7CisKKwltZW1zZXQoJmlvX2hkciwgMCwgc2l6ZW9mKHNnX2lvX2hkcl90KSk7CisJaW9faGRyLmludGVyZmFjZV9pZCA9ICdTJzsKKwlpb19oZHIuY21kX2xlbiA9IDY7CisJaW9faGRyLm14X3NiX2xlbiA9IHNpemVvZihzZW5zZV9idWZmZXIpOworCWlvX2hkci5keGZlcl9kaXJlY3Rpb24gPSBTR19EWEZFUl9OT05FOworCS8qIGlvX2hkci5keGZlcl9sZW4gPSAwOyAqLworCWlvX2hkci5keGZlcnAgPSBpbnFCdWZmOworCWlvX2hkci5zYnAgPSBzZW5zZV9idWZmZXI7CisJaW9faGRyLnRpbWVvdXQgPSAyMDAwOworCisJZm9yIChpID0gMDsgaSA8IDM7IGkrKykgeworCQlpb19oZHIuY21kcCA9ICh2b2lkICopc2dfY29tbWFuZHNbaV07CisJCWlvY3RsX29yX3BlcnJvcl9hbmRfZGllKGRldl9mZCwgU0dfSU8sICh2b2lkICopJmlvX2hkciwgIiVzIiwgZGV2KTsKKwl9CisKKwkvKiBmb3JjZSBrZXJuZWwgdG8gcmVyZWFkIHBhcnRpdGlvbiB0YWJsZSB3aGVuIG5ldyBkaXNjIGlzIGluc2VydGVkICovCisJaW9jdGwoZGV2X2ZkLCBCTEtSUlBBUlQpOworfQorCisjZGVmaW5lIEZMQUdfQ0xPU0UgIDEKKyNkZWZpbmUgRkxBR19TTUFSVCAgMgorI2RlZmluZSBGTEFHX1NDU0kgICA0CisKK3N0YXRpYyB2b2lkIGVqZWN0X2Nkcm9tKHVuc2lnbmVkIGZsYWdzLCBjb25zdCBjaGFyICpkZXYpCit7CisJaW50IGNtZCA9IENEUk9NRUpFQ1Q7CisKKwlpZiAoZmxhZ3MgJiBGTEFHX0NMT1NFCisJIHx8ICgoZmxhZ3MgJiBGTEFHX1NNQVJUKSAmJiBpb2N0bChkZXZfZmQsIENEUk9NX0RSSVZFX1NUQVRVUykgPT0gQ0RTX1RSQVlfT1BFTikKKwkpIHsKKwkJY21kID0gQ0RST01DTE9TRVRSQVk7CisJfQorCisJaW9jdGxfb3JfcGVycm9yX2FuZF9kaWUoZGV2X2ZkLCBjbWQsIE5VTEwsICIlcyIsIGRldik7Cit9CisKK2ludCBlamVjdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZWplY3RfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGZsYWdzOworCWNvbnN0IGNoYXIgKmRldmljZTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj8xOnQtLVQ6VC0tdCI7CisJZmxhZ3MgPSBnZXRvcHQzMihhcmd2LCAidFQiIElGX0ZFQVRVUkVfRUpFQ1RfU0NTSSgicyIpKTsKKwlkZXZpY2UgPSBhcmd2W29wdGluZF0gPyBhcmd2W29wdGluZF0gOiAiL2Rldi9jZHJvbSI7CisKKwkvKiBXZSB1c2VkIHRvIGRvICJ1bW91bnQgPGRldmljZT4iIGhlcmUsIGJ1dCBpdCB3YXMgYnVnZ3kKKwkgICBpZiBzb21ldGhpbmcgd2FzIG1vdW50ZWQgT1ZFUiBjZHJvbSBhbmQKKwkgICBpZiBjZHJvbSBpcyBtb3VudGVkIG1hbnkgdGltZXMuCisKKwkgICBUaGlzIHdvcmtzIGVxdWFsbHkgd2VsbCAob3IgYmV0dGVyKToKKwkgICAjIS9iaW4vc2gKKwkgICB1bW91bnQgL2Rldi9jZHJvbQorCSAgIGVqZWN0IC9kZXYvY2Ryb20KKwkqLworCisJeG1vdmVfZmQoeG9wZW5fbm9uYmxvY2tpbmcoZGV2aWNlKSwgZGV2X2ZkKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9FSkVDVF9TQ1NJICYmIChmbGFncyAmIEZMQUdfU0NTSSkpCisJCWVqZWN0X3Njc2koZGV2aWNlKTsKKwllbHNlCisJCWVqZWN0X2Nkcm9tKGZsYWdzLCBkZXZpY2UpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShkZXZfZmQpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9mYnNwbGFzaC5jIGIvbWlzY3V0aWxzL2Zic3BsYXNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcwMzNjMgotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9mYnNwbGFzaC5jCkBAIC0wLDAgKzEsNTM3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggTWljaGVsZSBTYW5nZXMgPG1pY2hlbGUuc2FuZ2VzQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIFVzYWdlOgorICogLSB1c2Uga2VybmVsIG9wdGlvbiAndmdhPXh4eCcgb3Igb3RoZXJ3aXNlIGVuYWJsZSBmcmFtZWJ1ZmZlciBkZXZpY2UuCisgKiAtIHB1dCBzb21ld2hlcmUgZmJzcGxhc2guY2ZnIGZpbGUgYW5kIGFuIGltYWdlIGluIC5wcG0gZm9ybWF0LgorICogLSBydW4gYXBwbGV0OiAkIHNldHNpZCBmYnNwbGFzaCBbcGFyYW1zXSAmCisgKiAgICAgIC1jOiBoaWRlIGN1cnNvcgorICogICAgICAtZCAvZGV2L2ZiTjogZnJhbWVidWZmZXIgZGV2aWNlIChpZiBub3QgL2Rldi9mYjApCisgKiAgICAgIC1zIHBhdGhfdG9faW1hZ2VfZmlsZSAoY2FuIGJlICItIiBmb3Igc3RkaW4pCisgKiAgICAgIC1pIHBhdGhfdG9fY2ZnX2ZpbGUKKyAqICAgICAgLWYgcGF0aF90b19maWZvIChjYW4gYmUgIi0iIGZvciBzdGRpbikKKyAqIC0gaWYgeW91IHdhbnQgdG8gcnVuIGl0IG9ubHkgaW4gcHJlc2VuY2Ugb2YgYSBrZXJuZWwgcGFyYW1ldGVyCisgKiAgIChmb3IgZXhhbXBsZSBmYnNwbGFzaD1vbiksIHVzZToKKyAqICAgZ3JlcCAtcSAiZmJzcGxhc2g9b24iIDwvcHJvYy9jbWRsaW5lICYmIHNldHNpZCBmYnNwbGFzaCBbcGFyYW1zXQorICogLSBjb21tYW5kcyBmb3IgZmlmbzoKKyAqICAgIk5OIiAoQVNDSUkgZGVjaW1hbCBudW1iZXIpIC0gcGVyY2VudGFnZSB0byBzaG93IG9uIHByb2dyZXNzIGJhci4KKyAqICAgImV4aXQiIChvciBqdXN0IGNsb3NlIGZpZm8pIC0gd2VsbCB5b3UgZ3Vlc3NlZCBpdC4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZmJzcGxhc2hfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIi1zIElNR0ZJTEUgWy1jXSBbLWQgREVWXSBbLWkgSU5JRklMRV0gWy1mIENNRF0iCisvL3VzYWdlOiNkZWZpbmUgZmJzcGxhc2hfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLXMJSW1hZ2UiCisvL3VzYWdlOiAgICAgIlxuCS1jCUhpZGUgY3Vyc29yIgorLy91c2FnZTogICAgICJcbgktZAlGcmFtZWJ1ZmZlciBkZXZpY2UgKGRlZmF1bHQgL2Rldi9mYjApIgorLy91c2FnZTogICAgICJcbgktaQlDb25maWcgZmlsZSAodmFyPXZhbHVlKToiCisvL3VzYWdlOiAgICAgIlxuCQkJQkFSX0xFRlQsQkFSX1RPUCxCQVJfV0lEVEgsQkFSX0hFSUdIVCIKKy8vdXNhZ2U6ICAgICAiXG4JCQlCQVJfUixCQVJfRyxCQVJfQiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJQ29udHJvbCBwaXBlIChlbHNlIGV4aXQgYWZ0ZXIgZHJhd2luZyBpbWFnZSkiCisvL3VzYWdlOiAgICAgIlxuCQkJY29tbWFuZHM6ICdOTicgKCUgZm9yIHByb2dyZXNzIGJhcikgb3IgJ2V4aXQnIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxsaW51eC9mYi5oPgorCisvKiBJZiB5b3Ugd2FudCBsb2dnaW5nIG1lc3NhZ2VzIG9uIC90bXAvZmJzcGxhc2gubG9nLi4uICovCisjZGVmaW5lIERFQlVHIDAKKworc3RydWN0IGdsb2JhbHMgeworI2lmIERFQlVHCisJYm9vbCBiZGVidWdfbWVzc2FnZXM7CS8vIGVuYWJsZS9kaXNhYmxlIGxvZ2dpbmcKKwlGSUxFICpsb2dmaWxlX2ZkOwkvLyBsb2cgZmlsZQorI2VuZGlmCisJdW5zaWduZWQgY2hhciAqYWRkcjsJLy8gcG9pbnRlciB0byBmcmFtZWJ1ZmZlciBtZW1vcnkKKwl1bnNpZ25lZCBuc1s3XTsJCS8vIG4tcGFyYW1ldGVycworCWNvbnN0IGNoYXIgKmltYWdlX2ZpbGVuYW1lOworCXN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyBzY3JfdmFyOworCXN0cnVjdCBmYl9maXhfc2NyZWVuaW5mbyBzY3JfZml4OworCXVuc2lnbmVkIGJ5dGVzX3Blcl9waXhlbDsKKwkvLyBjYWNoZWQgKDggLSBzY3JfdmFyLkNPTE9SLmxlbmd0aCk6CisJdW5zaWduZWQgcmVkX3NoaWZ0OworCXVuc2lnbmVkIGdyZWVuX3NoaWZ0OworCXVuc2lnbmVkIGJsdWVfc2hpZnQ7Cit9OworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIG5iYXJfd2lkdGgJbnNbMF0JLy8gcHJvZ3Jlc3MgYmFyIHdpZHRoCisjZGVmaW5lIG5iYXJfaGVpZ2h0CW5zWzFdCS8vIHByb2dyZXNzIGJhciBoZWlnaHQKKyNkZWZpbmUgbmJhcl9wb3N4CW5zWzJdCS8vIHByb2dyZXNzIGJhciBob3Jpem9udGFsIHBvc2l0aW9uCisjZGVmaW5lIG5iYXJfcG9zeQluc1szXQkvLyBwcm9ncmVzcyBiYXIgdmVydGljYWwgcG9zaXRpb24KKyNkZWZpbmUgbmJhcl9jb2xyCW5zWzRdCS8vIHByb2dyZXNzIGJhciBjb2xvciByZWQgY29tcG9uZW50CisjZGVmaW5lIG5iYXJfY29sZwluc1s1XQkvLyBwcm9ncmVzcyBiYXIgY29sb3IgZ3JlZW4gY29tcG9uZW50CisjZGVmaW5lIG5iYXJfY29sYgluc1s2XQkvLyBwcm9ncmVzcyBiYXIgY29sb3IgYmx1ZSBjb21wb25lbnQKKworI2lmIERFQlVHCisjZGVmaW5lIERFQlVHX01FU1NBR0Uoc3RyTWVzc2FnZSwgYXJncy4uLikgXAorCWlmIChHLmJkZWJ1Z19tZXNzYWdlcykgeyBcCisJCWZwcmludGYoRy5sb2dmaWxlX2ZkLCAiWyVzXVslc10gLSAlc1xuIiwgXAorCQlfX0ZJTEVfXywgX19GVU5DVElPTl9fLCBzdHJNZXNzYWdlKTsJXAorCX0KKyNlbHNlCisjZGVmaW5lIERFQlVHX01FU1NBR0UoLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorCisvKioKKyAqIENvbmZpZ3VyZSBwYWxldHRlIGZvciBSR0I6MzMyCisgKi8KK3N0YXRpYyB2b2lkIGZiX3NldHBhbChpbnQgZmQpCit7CisJc3RydWN0IGZiX2NtYXAgY21hcDsKKwkvKiBmYiBjb2xvcnMgYXJlIDE2IGJpdCAqLworCXVuc2lnbmVkIHNob3J0IHJlZFsyNTZdLCBncmVlblsyNTZdLCBibHVlWzI1Nl07CisJdW5zaWduZWQgaTsKKworCS8qIFJHQjozMzIgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJLyogQ29sb3IgaXMgZW5jb2RlZCBpbiBwaXhlbCB2YWx1ZSBhcyBycnJnZ2diYi4KKwkJICogMy1iaXQgY29sb3IgaXMgbWFwcGVkIHRvIDE2LWJpdCBvbmUgYXM6CisJCSAqIDAwMCAtPiAwMDAwMDAwMCAwMDAwMDAwMAorCQkgKiAwMDEgLT4gMDAxMDAxMDAgMTAwMTAwMTAKKwkJICogLi4uCisJCSAqIDAxMSAtPiAwMTEwMTEwMSAxMDExMDExMAorCQkgKiAxMDAgLT4gMTAwMTAwMTAgMDEwMDEwMDEKKwkJICogLi4uCisJCSAqIDExMSAtPiAxMTExMTExMSAxMTExMTExMQorCQkgKi8KKwkJcmVkW2ldICAgPSAoKCBpID4+IDUgICAgICAgKSAqIDB4OTI0OSkgPj4gMjsgLy8gcnJyICogMDAgMTAwMTAwMTAgMDEwMDEwMDEgPj4gMgorCQlncmVlbltpXSA9ICgoKGkgPj4gMikgJiAweDcpICogMHg5MjQ5KSA+PiAyOyAvLyBnZ2cgKiAwMCAxMDAxMDAxMCAwMTAwMTAwMSA+PiAyCisJCS8qIDItYml0IGNvbG9yIGlzIGVhc2llcjogKi8KKwkJYmx1ZVtpXSAgPSAgKCBpICAgICAgICYgMHgzKSAqIDB4NTU1NTsgLy8gYmIgKiAwMTAxMDEwMSAwMTAxMDEwMQorCX0KKworCWNtYXAuc3RhcnQgPSAwOworCWNtYXAubGVuICAgPSAyNTY7CisJY21hcC5yZWQgICA9IHJlZDsKKwljbWFwLmdyZWVuID0gZ3JlZW47CisJY21hcC5ibHVlICA9IGJsdWU7CisJY21hcC50cmFuc3AgPSAwOworCisJeGlvY3RsKGZkLCBGQklPUFVUQ01BUCwgJmNtYXApOworfQorCisvKioKKyAqIE9wZW4gYW5kIGluaXRpYWxpemUgdGhlIGZyYW1lYnVmZmVyIGRldmljZQorICogXHBhcmFtICpzdHJmYl9kZXZpY2UgcG9pbnRlciB0byBmcmFtZWJ1ZmZlciBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgZmJfb3Blbihjb25zdCBjaGFyICpzdHJmYl9kZXZpY2UpCit7CisJaW50IGZiZmQgPSB4b3BlbihzdHJmYl9kZXZpY2UsIE9fUkRXUik7CisKKwkvLyBmcmFtZWJ1ZmZlciBwcm9wZXJ0aWVzCisJeGlvY3RsKGZiZmQsIEZCSU9HRVRfVlNDUkVFTklORk8sICZHLnNjcl92YXIpOworCXhpb2N0bChmYmZkLCBGQklPR0VUX0ZTQ1JFRU5JTkZPLCAmRy5zY3JfZml4KTsKKworCXN3aXRjaCAoRy5zY3JfdmFyLmJpdHNfcGVyX3BpeGVsKSB7CisJY2FzZSA4OgorCQlmYl9zZXRwYWwoZmJmZCk7CisJCWJyZWFrOworCisJY2FzZSAxNjoKKwljYXNlIDI0OgorCWNhc2UgMzI6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVuc3VwcG9ydGVkICV1IGJwcCIsIChpbnQpRy5zY3JfdmFyLmJpdHNfcGVyX3BpeGVsKTsKKwkJYnJlYWs7CisJfQorCisJRy5yZWRfc2hpZnQgICA9IDggLSBHLnNjcl92YXIucmVkLmxlbmd0aDsKKwlHLmdyZWVuX3NoaWZ0ID0gOCAtIEcuc2NyX3Zhci5ncmVlbi5sZW5ndGg7CisJRy5ibHVlX3NoaWZ0ICA9IDggLSBHLnNjcl92YXIuYmx1ZS5sZW5ndGg7CisJRy5ieXRlc19wZXJfcGl4ZWwgPSAoRy5zY3JfdmFyLmJpdHNfcGVyX3BpeGVsICsgNykgPj4gMzsKKworCS8vIG1hcCB0aGUgZGV2aWNlIGluIG1lbW9yeQorCUcuYWRkciA9IG1tYXAoTlVMTCwKKwkJCUcuc2NyX3Zhci55cmVzICogRy5zY3JfZml4LmxpbmVfbGVuZ3RoLAorCQkJUFJPVF9XUklURSwgTUFQX1NIQVJFRCwgZmJmZCwgMCk7CisJaWYgKEcuYWRkciA9PSBNQVBfRkFJTEVEKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIm1tYXAiKTsKKworCS8vIHBvaW50IHRvIHRoZSBzdGFydCBvZiB0aGUgdmlzaWJsZSBzY3JlZW4KKwlHLmFkZHIgKz0gRy5zY3JfdmFyLnlvZmZzZXQgKiBHLnNjcl9maXgubGluZV9sZW5ndGggKyBHLnNjcl92YXIueG9mZnNldCAqIEcuYnl0ZXNfcGVyX3BpeGVsOworCWNsb3NlKGZiZmQpOworfQorCisKKy8qKgorICogUmV0dXJuIHBpeGVsIHZhbHVlIG9mIHRoZSBwYXNzZWQgUkdCIGNvbG9yLgorICogVGhpcyBpcyBwZXJmb3JtYW5jZSBjcml0aWNhbCBmbi4KKyAqLworc3RhdGljIHVuc2lnbmVkIGZiX3BpeGVsX3ZhbHVlKHVuc2lnbmVkIHIsIHVuc2lnbmVkIGcsIHVuc2lnbmVkIGIpCit7CisJLyogV2UgYXNzdW1lIHRoYXQgdGhlIHIsZyxiIHZhbHVlcyBhcmUgPD0gMjU1ICovCisKKwlpZiAoRy5ieXRlc19wZXJfcGl4ZWwgPT0gMSkgeworCQlyID0gciAgICAgICAgJiAweGUwOyAvLyAzLWJpdCByZWQKKwkJZyA9IChnID4+IDMpICYgMHgxYzsgLy8gMy1iaXQgZ3JlZW4KKwkJYiA9ICBiID4+IDY7ICAgICAgICAgLy8gMi1iaXQgYmx1ZQorCQlyZXR1cm4gciArIGcgKyBiOworCX0KKwlpZiAoRy5ieXRlc19wZXJfcGl4ZWwgPT0gMikgeworCQkvLyBBUk0gUEwxMTAgb24gSW50ZWdyYXRvci9DUCBoYXMgUkdCQTU1NTEgYml0IGFycmFuZ2VtZW50LgorCQkvLyBXZSB3YW50IHRvIHN1cHBvcnQgYml0IGxvY2F0aW9ucyBsaWtlIHRoYXQuCisJCS8vCisJCS8vIEZpcnN0IHNoaWZ0IG91dCB1bnVzZWQgYml0cworCQlyID0gciA+PiBHLnJlZF9zaGlmdDsKKwkJZyA9IGcgPj4gRy5ncmVlbl9zaGlmdDsKKwkJYiA9IGIgPj4gRy5ibHVlX3NoaWZ0OworCQkvLyBUaGVuIHNoaWZ0IHRoZSByZW1haW5pbmcgYml0cyB0byB0aGVpciBvZmZzZXQKKwkJcmV0dXJuIChyIDw8IEcuc2NyX3Zhci5yZWQub2Zmc2V0KSArCisJCQkoZyA8PCBHLnNjcl92YXIuZ3JlZW4ub2Zmc2V0KSArCisJCQkoYiA8PCBHLnNjcl92YXIuYmx1ZS5vZmZzZXQpOworCX0KKwkvLyBSR0IgODg4CisJcmV0dXJuIGIgKyAoZyA8PCA4KSArIChyIDw8IDE2KTsKK30KKworLyoqCisgKiBEcmF3IHBpeGVsIG9uIGZyYW1lYnVmZmVyCisgKi8KK3N0YXRpYyB2b2lkIGZiX3dyaXRlX3BpeGVsKHVuc2lnbmVkIGNoYXIgKmFkZHIsIHVuc2lnbmVkIHBpeGVsKQoreworCXN3aXRjaCAoRy5ieXRlc19wZXJfcGl4ZWwpIHsKKwljYXNlIDE6CisJCSphZGRyID0gcGl4ZWw7CisJCWJyZWFrOworCWNhc2UgMjoKKwkJKih1aW50MTZfdCAqKWFkZHIgPSBwaXhlbDsKKwkJYnJlYWs7CisJY2FzZSA0OgorCQkqKHVpbnQzMl90ICopYWRkciA9IHBpeGVsOworCQlicmVhazsKKwlkZWZhdWx0OiAvLyAyNCBiaXRzIHBlciBwaXhlbAorCQlhZGRyWzBdID0gcGl4ZWw7CisJCWFkZHJbMV0gPSBwaXhlbCA+PiA4OworCQlhZGRyWzJdID0gcGl4ZWwgPj4gMTY7CisJfQorfQorCisKKy8qKgorICogRHJhdyBob2xsb3cgcmVjdGFuZ2xlIG9uIGZyYW1lYnVmZmVyCisgKi8KK3N0YXRpYyB2b2lkIGZiX2RyYXdyZWN0YW5nbGUodm9pZCkKK3sKKwlpbnQgY250OworCXVuc2lnbmVkIHRoaXNwaXg7CisJdW5zaWduZWQgY2hhciAqcHRyMSwgKnB0cjI7CisJdW5zaWduZWQgY2hhciBucmVkID0gRy5uYmFyX2NvbHIvMjsKKwl1bnNpZ25lZCBjaGFyIG5ncmVlbiA9ICBHLm5iYXJfY29sZy8yOworCXVuc2lnbmVkIGNoYXIgbmJsdWUgPSBHLm5iYXJfY29sYi8yOworCisJdGhpc3BpeCA9IGZiX3BpeGVsX3ZhbHVlKG5yZWQsIG5ncmVlbiwgbmJsdWUpOworCisJLy8gaG9yaXpvbnRhbCBsaW5lcworCXB0cjEgPSBHLmFkZHIgKyBHLm5iYXJfcG9zeSAqIEcuc2NyX2ZpeC5saW5lX2xlbmd0aCArIEcubmJhcl9wb3N4ICogRy5ieXRlc19wZXJfcGl4ZWw7CisJcHRyMiA9IEcuYWRkciArIChHLm5iYXJfcG9zeSArIEcubmJhcl9oZWlnaHQgLSAxKSAqIEcuc2NyX2ZpeC5saW5lX2xlbmd0aCArIEcubmJhcl9wb3N4ICogRy5ieXRlc19wZXJfcGl4ZWw7CisJY250ID0gRy5uYmFyX3dpZHRoIC0gMTsKKwlkbyB7CisJCWZiX3dyaXRlX3BpeGVsKHB0cjEsIHRoaXNwaXgpOworCQlmYl93cml0ZV9waXhlbChwdHIyLCB0aGlzcGl4KTsKKwkJcHRyMSArPSBHLmJ5dGVzX3Blcl9waXhlbDsKKwkJcHRyMiArPSBHLmJ5dGVzX3Blcl9waXhlbDsKKwl9IHdoaWxlICgtLWNudCA+PSAwKTsKKworCS8vIHZlcnRpY2FsIGxpbmVzCisJcHRyMSA9IEcuYWRkciArIEcubmJhcl9wb3N5ICogRy5zY3JfZml4LmxpbmVfbGVuZ3RoICsgRy5uYmFyX3Bvc3ggKiBHLmJ5dGVzX3Blcl9waXhlbDsKKwlwdHIyID0gRy5hZGRyICsgRy5uYmFyX3Bvc3kgKiBHLnNjcl9maXgubGluZV9sZW5ndGggKyAoRy5uYmFyX3Bvc3ggKyBHLm5iYXJfd2lkdGggLSAxKSAqIEcuYnl0ZXNfcGVyX3BpeGVsOworCWNudCA9IEcubmJhcl9oZWlnaHQgLSAxOworCWRvIHsKKwkJZmJfd3JpdGVfcGl4ZWwocHRyMSwgdGhpc3BpeCk7CisJCWZiX3dyaXRlX3BpeGVsKHB0cjIsIHRoaXNwaXgpOworCQlwdHIxICs9IEcuc2NyX2ZpeC5saW5lX2xlbmd0aDsKKwkJcHRyMiArPSBHLnNjcl9maXgubGluZV9sZW5ndGg7CisJfSB3aGlsZSAoLS1jbnQgPj0gMCk7Cit9CisKKworLyoqCisgKiBEcmF3IGZpbGxlZCByZWN0YW5nbGUgb24gZnJhbWVidWZmZXIKKyAqIFxwYXJhbSBueDFwb3MsbnkxcG9zIHVwcGVyIGxlZnQgcG9zaXRpb24KKyAqIFxwYXJhbSBueDJwb3MsbnkycG9zIGRvd24gcmlnaHQgcG9zaXRpb24KKyAqIFxwYXJhbSBucmVkLG5ncmVlbixuYmx1ZSByZ2IgY29sb3IKKyAqLworc3RhdGljIHZvaWQgZmJfZHJhd2Z1bGxyZWN0YW5nbGUoaW50IG54MXBvcywgaW50IG55MXBvcywgaW50IG54MnBvcywgaW50IG55MnBvcywKKwl1bnNpZ25lZCBjaGFyIG5yZWQsIHVuc2lnbmVkIGNoYXIgbmdyZWVuLCB1bnNpZ25lZCBjaGFyIG5ibHVlKQoreworCWludCBjbnQxLCBjbnQyLCBueXBvczsKKwl1bnNpZ25lZCB0aGlzcGl4OworCXVuc2lnbmVkIGNoYXIgKnB0cjsKKworCXRoaXNwaXggPSBmYl9waXhlbF92YWx1ZShucmVkLCBuZ3JlZW4sIG5ibHVlKTsKKworCWNudDEgPSBueTJwb3MgLSBueTFwb3M7CisJbnlwb3MgPSBueTFwb3M7CisJZG8geworCQlwdHIgPSBHLmFkZHIgKyBueXBvcyAqIEcuc2NyX2ZpeC5saW5lX2xlbmd0aCArIG54MXBvcyAqIEcuYnl0ZXNfcGVyX3BpeGVsOworCQljbnQyID0gbngycG9zIC0gbngxcG9zOworCQlkbyB7CisJCQlmYl93cml0ZV9waXhlbChwdHIsIHRoaXNwaXgpOworCQkJcHRyICs9IEcuYnl0ZXNfcGVyX3BpeGVsOworCQl9IHdoaWxlICgtLWNudDIgPj0gMCk7CisKKwkJbnlwb3MrKzsKKwl9IHdoaWxlICgtLWNudDEgPj0gMCk7Cit9CisKKworLyoqCisgKiBEcmF3IGEgcHJvZ3Jlc3MgYmFyIG9uIGZyYW1lYnVmZmVyCisgKiBccGFyYW0gcGVyY2VudCBwZXJjZW50YWdlIG9mIGxvYWRpbmcKKyAqLworc3RhdGljIHZvaWQgZmJfZHJhd3Byb2dyZXNzYmFyKHVuc2lnbmVkIHBlcmNlbnQpCit7CisJaW50IGxlZnRfeCwgdG9wX3ksIHBvc194OworCXVuc2lnbmVkIHdpZHRoLCBoZWlnaHQ7CisKKwkvLyBvdXRlciBib3gKKwlsZWZ0X3ggPSBHLm5iYXJfcG9zeDsKKwl0b3BfeSA9IEcubmJhcl9wb3N5OworCXdpZHRoID0gRy5uYmFyX3dpZHRoIC0gMTsKKwloZWlnaHQgPSBHLm5iYXJfaGVpZ2h0IC0gMTsKKwlpZiAoKGludCkoaGVpZ2h0IHwgd2lkdGgpIDwgMCkKKwkJcmV0dXJuOworCS8vIE5COiAid2lkdGgiIG9mIDEgYWN0dWFsbHkgbWFrZXMgcmVjdCB3aXRoIHdpZHRoIG9mIDIhCisJZmJfZHJhd3JlY3RhbmdsZSgpOworCisJLy8gaW5uZXIgImVtcHR5IiByZWN0YW5nbGUKKwlsZWZ0X3grKzsKKwl0b3BfeSsrOworCXdpZHRoIC09IDI7CisJaGVpZ2h0IC09IDI7CisJaWYgKChpbnQpKGhlaWdodCB8IHdpZHRoKSA8IDApCisJCXJldHVybjsKKworCXBvc194ID0gbGVmdF94OworCWlmIChwZXJjZW50ID4gMCkgeworCQlpbnQgaSwgeTsKKworCQkvLyBhY3R1YWwgcHJvZ3Jlc3MgYmFyCisJCXBvc194ICs9ICh1bnNpZ25lZCkod2lkdGggKiBwZXJjZW50KSAvIDEwMDsKKworCQl5ID0gdG9wX3k7CisJCWkgPSBoZWlnaHQ7CisJCWlmIChoZWlnaHQgPT0gMCkKKwkJCWhlaWdodCsrOyAvLyBkaXZpZGUgYnkgMCBpcyBiYWQKKwkJd2hpbGUgKGkgPj0gMCkgeworCQkJLy8gZHJhdyBvbmUtbGluZSB0aGljayAicmVjdGFuZ2xlIgorCQkJLy8gdG9wIGxpbmUgd2lsbCBoYXZlIGdyYXkgbHZsIDIwMCwgYm90dG9tIG9uZSAxMDAKKwkJCXVuc2lnbmVkIGdyYXlfbGV2ZWwgPSAxMDAgKyAodW5zaWduZWQpaSoxMDAgLyBoZWlnaHQ7CisJCQlmYl9kcmF3ZnVsbHJlY3RhbmdsZSgKKwkJCQkJbGVmdF94LCB5LCBwb3NfeCwgeSwKKwkJCQkJZ3JheV9sZXZlbCwgZ3JheV9sZXZlbCwgZ3JheV9sZXZlbCk7CisJCQl5Kys7CisJCQlpLS07CisJCX0KKwl9CisKKwlmYl9kcmF3ZnVsbHJlY3RhbmdsZSgKKwkJCXBvc194LCB0b3BfeSwKKwkJCWxlZnRfeCArIHdpZHRoLCB0b3BfeSArIGhlaWdodCwKKwkJCUcubmJhcl9jb2xyLCBHLm5iYXJfY29sZywgRy5uYmFyX2NvbGIpOworfQorCisKKy8qKgorICogRHJhdyBpbWFnZSBmcm9tIFBQTSBmaWxlCisgKi8KK3N0YXRpYyB2b2lkIGZiX2RyYXdpbWFnZSh2b2lkKQoreworCUZJTEUgKnRoZW1lX2ZpbGU7CisJY2hhciAqcmVhZF9wdHI7CisJdW5zaWduZWQgY2hhciAqcGl4bGluZTsKKwl1bnNpZ25lZCBpLCBqLCB3aWR0aCwgaGVpZ2h0LCBsaW5lX3NpemU7CisKKwlpZiAoTE9ORV9EQVNIKEcuaW1hZ2VfZmlsZW5hbWUpKSB7CisJCXRoZW1lX2ZpbGUgPSBzdGRpbjsKKwl9IGVsc2UgeworCQlpbnQgZmQgPSBvcGVuX3ppcHBlZChHLmltYWdlX2ZpbGVuYW1lLCAvKmZhaWxfaWZfbm90X2NvbXByZXNzZWQ6Ki8gMCk7CisJCWlmIChmZCA8IDApCisJCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKEcuaW1hZ2VfZmlsZW5hbWUpOworCQl0aGVtZV9maWxlID0geGZkb3Blbl9mb3JfcmVhZChmZCk7CisJfQorCisJLyogUGFyc2UgcHBtIGhlYWRlcjoKKwkgKiAtIE1hZ2ljOiB0d28gY2hhcmFjdGVycyAiUDYiLgorCSAqIC0gV2hpdGVzcGFjZSAoYmxhbmtzLCBUQUJzLCBDUnMsIExGcykuCisJICogLSBBIHdpZHRoLCBmb3JtYXR0ZWQgYXMgQVNDSUkgY2hhcmFjdGVycyBpbiBkZWNpbWFsLgorCSAqIC0gV2hpdGVzcGFjZS4KKwkgKiAtIEEgaGVpZ2h0LCBBU0NJSSBkZWNpbWFsLgorCSAqIC0gV2hpdGVzcGFjZS4KKwkgKiAtIFRoZSBtYXhpbXVtIGNvbG9yIHZhbHVlLCBBU0NJSSBkZWNpbWFsLCBpbiAwLi42NTUzNQorCSAqIC0gTmV3bGluZSBvciBvdGhlciBzaW5nbGUgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuCisJICogICAod2Ugc3VwcG9ydCBuZXdsaW5lIG9ubHkpCisJICogLSBBIHJhc3RlciBvZiBXaWR0aCAqIEhlaWdodCBwaXhlbHMgaW4gdHJpcGxldHMgb2YgcmdiCisJICogICBpbiBwdXJlIGJpbmFyeSBieSAxIG9yIDIgYnl0ZXMuICh3ZSBzdXBwb3J0IG9ubHkgMSBieXRlKQorCSAqLworI2RlZmluZSBjb25jYXRfYnVmIGJiX2NvbW1vbl9idWZzaXoxCisJcmVhZF9wdHIgPSBjb25jYXRfYnVmOworCXdoaWxlICgxKSB7CisJCWludCB3LCBoLCBtYXhfY29sb3JfdmFsOworCQlpbnQgcmVtID0gY29uY2F0X2J1ZiArIHNpemVvZihjb25jYXRfYnVmKSAtIHJlYWRfcHRyOworCQlpZiAocmVtIDwgMgorCQkgfHwgZmdldHMocmVhZF9wdHIsIHJlbSwgdGhlbWVfZmlsZSkgPT0gTlVMTAorCQkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgUFBNIGZpbGUgJyVzJyIsIEcuaW1hZ2VfZmlsZW5hbWUpOworCQl9CisJCXJlYWRfcHRyID0gc3RyY2hybnVsKHJlYWRfcHRyLCAnIycpOworCQkqcmVhZF9wdHIgPSAnXDAnOyAvKiBpZ25vcmUgI2NvbW1lbnRzICovCisJCWlmIChzc2NhbmYoY29uY2F0X2J1ZiwgIlA2ICV1ICV1ICV1IiwgJncsICZoLCAmbWF4X2NvbG9yX3ZhbCkgPT0gMworCQkgJiYgbWF4X2NvbG9yX3ZhbCA8PSAyNTUKKwkJKSB7CisJCQl3aWR0aCA9IHc7IC8qIHcgaXMgb24gc3RhY2ssIHdpZHRoIG1heSBiZSBpbiByZWdpc3RlciAqLworCQkJaGVpZ2h0ID0gaDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJbGluZV9zaXplID0gd2lkdGgqMzsKKwlwaXhsaW5lID0geG1hbGxvYyhsaW5lX3NpemUpOworCisJaWYgKHdpZHRoID4gRy5zY3JfdmFyLnhyZXMpCisJCXdpZHRoID0gRy5zY3JfdmFyLnhyZXM7CisJaWYgKGhlaWdodCA+IEcuc2NyX3Zhci55cmVzKQorCQloZWlnaHQgPSBHLnNjcl92YXIueXJlczsKKwlmb3IgKGogPSAwOyBqIDwgaGVpZ2h0OyBqKyspIHsKKwkJdW5zaWduZWQgY2hhciAqcGl4ZWw7CisJCXVuc2lnbmVkIGNoYXIgKnNyYzsKKworCQlpZiAoZnJlYWQocGl4bGluZSwgMSwgbGluZV9zaXplLCB0aGVtZV9maWxlKSAhPSBsaW5lX3NpemUpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIFBQTSBmaWxlICclcyciLCBHLmltYWdlX2ZpbGVuYW1lKTsKKwkJcGl4ZWwgPSBwaXhsaW5lOworCQlzcmMgPSBHLmFkZHIgKyBqICogRy5zY3JfZml4LmxpbmVfbGVuZ3RoOworCQlmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykgeworCQkJdW5zaWduZWQgdGhpc3BpeCA9IGZiX3BpeGVsX3ZhbHVlKHBpeGVsWzBdLCBwaXhlbFsxXSwgcGl4ZWxbMl0pOworCQkJZmJfd3JpdGVfcGl4ZWwoc3JjLCB0aGlzcGl4KTsKKwkJCXNyYyArPSBHLmJ5dGVzX3Blcl9waXhlbDsKKwkJCXBpeGVsICs9IDM7CisJCX0KKwl9CisJZnJlZShwaXhsaW5lKTsKKwlmY2xvc2UodGhlbWVfZmlsZSk7Cit9CisKKworLyoqCisgKiBQYXJzZSBjb25maWd1cmF0aW9uIGZpbGUKKyAqIFxwYXJhbSAqY2ZnX2ZpbGVuYW1lIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQorICovCitzdGF0aWMgdm9pZCBpbml0KGNvbnN0IGNoYXIgKmNmZ19maWxlbmFtZSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBwYXJhbV9uYW1lc1tdIEFMSUdOMSA9CisJCSJCQVJfV0lEVEhcMCIgIkJBUl9IRUlHSFRcMCIKKwkJIkJBUl9MRUZUXDAiICJCQVJfVE9QXDAiCisJCSJCQVJfUlwwIiAiQkFSX0dcMCIgIkJBUl9CXDAiCisjaWYgREVCVUcKKwkJIkRFQlVHXDAiCisjZW5kaWYKKwkJOworCWNoYXIgKnRva2VuWzJdOworCXBhcnNlcl90ICpwYXJzZXIgPSBjb25maWdfb3BlbjIoY2ZnX2ZpbGVuYW1lLCB4Zm9wZW5fc3RkaW4pOworCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRva2VuLCAyLCAyLCAiIz0iLAorCQkJCShQQVJTRV9OT1JNQUwgfCBQQVJTRV9NSU5fRElFKSAmIH4oUEFSU0VfVFJJTSB8IFBBUlNFX0NPTExBUFNFKSkpIHsKKwkJdW5zaWduZWQgdmFsID0geGF0b2lfcG9zaXRpdmUodG9rZW5bMV0pOworCQlpbnQgaSA9IGluZGV4X2luX3N0cmluZ3MocGFyYW1fbmFtZXMsIHRva2VuWzBdKTsKKwkJaWYgKGkgPCAwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN5bnRheCBlcnJvcjogJXMiLCB0b2tlblswXSk7CisJCWlmIChpID49IDAgJiYgaSA8IDcpCisJCQlHLm5zW2ldID0gdmFsOworI2lmIERFQlVHCisJCWlmIChpID09IDcpIHsKKwkJCUcuYmRlYnVnX21lc3NhZ2VzID0gdmFsOworCQkJaWYgKEcuYmRlYnVnX21lc3NhZ2VzKQorCQkJCUcubG9nZmlsZV9mZCA9IHhmb3Blbl9mb3Jfd3JpdGUoIi90bXAvZmJzcGxhc2gubG9nIik7CisJCX0KKyNlbmRpZgorCX0KKwljb25maWdfY2xvc2UocGFyc2VyKTsKK30KKworCitpbnQgZmJzcGxhc2hfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZic3BsYXNoX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICpmYl9kZXZpY2UsICpjZmdfZmlsZW5hbWUsICpmaWZvX2ZpbGVuYW1lOworCUZJTEUgKmZwID0gZnA7IC8vIGZvciBjb21waWxlcgorCWNoYXIgKm51bV9idWY7CisJdW5zaWduZWQgbnVtOworCWJvb2wgYkN1cnNvck9mZjsKKworCUlOSVRfRygpOworCisJLy8gcGFyc2UgY29tbWFuZCBsaW5lIG9wdGlvbnMKKwlmYl9kZXZpY2UgPSAiL2Rldi9mYjAiOworCWNmZ19maWxlbmFtZSA9IE5VTEw7CisJZmlmb19maWxlbmFtZSA9IE5VTEw7CisJYkN1cnNvck9mZiA9IDEgJiBnZXRvcHQzMihhcmd2LCAiY3M6ZDppOmY6IiwKKwkJCSZHLmltYWdlX2ZpbGVuYW1lLCAmZmJfZGV2aWNlLCAmY2ZnX2ZpbGVuYW1lLCAmZmlmb19maWxlbmFtZSk7CisKKwkvLyBwYXJzZSBjb25maWd1cmF0aW9uIGZpbGUKKwlpZiAoY2ZnX2ZpbGVuYW1lKQorCQlpbml0KGNmZ19maWxlbmFtZSk7CisKKwkvLyBXZSBtdXN0IGhhdmUgLXMgSU1HCisJaWYgKCFHLmltYWdlX2ZpbGVuYW1lKQorCQliYl9zaG93X3VzYWdlKCk7CisKKwlmYl9vcGVuKGZiX2RldmljZSk7CisKKwlpZiAoZmlmb19maWxlbmFtZSAmJiBiQ3Vyc29yT2ZmKSB7CisJCS8vIGhpZGUgY3Vyc29yIChCRUZPUkUgYW55IGZiIG9wcykKKwkJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCAiXDAzM1s/MjVsIiwgNik7CisJfQorCisJZmJfZHJhd2ltYWdlKCk7CisKKwlpZiAoIWZpZm9fZmlsZW5hbWUpCisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisKKwlmcCA9IHhmb3Blbl9zdGRpbihmaWZvX2ZpbGVuYW1lKTsKKwlpZiAoZnAgIT0gc3RkaW4pIHsKKwkJLy8gRm9yIG5hbWVkIHBpcGVzLCB3ZSB3YW50IHRvIHN1cHBvcnQgdGhpczoKKwkJLy8gIG1rZmlmbyBjbWRfcGlwZQorCQkvLyAgZmJzcGxhc2ggLWYgY21kX3BpcGUgLi4uLiAmCisJCS8vICAuLi4KKwkJLy8gIGVjaG8gMzMgPmNtZF9waXBlCisJCS8vICAuLi4KKwkJLy8gIGVjaG8gNjYgPmNtZF9waXBlCisJCS8vIFRoaXMgbWVhbnMgdGhhdCB3ZSBkb24ndCB3YW50IGZic3BsYXNoIHRvIGdldCBFT0YKKwkJLy8gd2hlbiBsYXN0IHdyaXRlciBjbG9zZXMgaW5wdXQgZW5kLgorCQkvLyBUaGUgc2ltcGxlc3Qgd2F5IGlzIHRvIG9wZW4gZmlmbyBmb3Igd3JpdGluZyB0b28KKwkJLy8gYW5kIGJlY29tZSBhbiBhZGRpdGlvbmFsIHdyaXRlciA6KQorCQlvcGVuKGZpZm9fZmlsZW5hbWUsIE9fV1JPTkxZKTsgLy8gZXJyb3JzIGFyZSBpZ25vcmVkCisJfQorCisJZmJfZHJhd3Byb2dyZXNzYmFyKDApOworCS8vIEJsb2NrIG9uIHJlYWQsIHdhaXRpbmcgZm9yIHNvbWUgaW5wdXQuCisJLy8gVXNlIG9mIDxzdGRpby5oPiBzdHlsZSBJL08gYWxsb3dzIHRvIGNvcnJlY3RseQorCS8vIGhhbmRsZSBhIGNhc2Ugd2hlbiB3ZSBoYXZlIG1hbnkgYnVmZmVyZWQgbGluZXMKKwkvLyBhbHJlYWR5IGluIHRoZSBwaXBlCisJd2hpbGUgKChudW1fYnVmID0geG1hbGxvY19mZ2V0bGluZShmcCkpICE9IE5VTEwpIHsKKwkJaWYgKGlzX3ByZWZpeGVkX3dpdGgobnVtX2J1ZiwgImV4aXQiKSkgeworCQkJREVCVUdfTUVTU0FHRSgiZXhpdCIpOworCQkJYnJlYWs7CisJCX0KKwkJbnVtID0gYXRvaShudW1fYnVmKTsKKwkJaWYgKGlzZGlnaXQobnVtX2J1ZlswXSkgJiYgKG51bSA8PSAxMDApKSB7CisjaWYgREVCVUcKKwkJCURFQlVHX01FU1NBR0UoaXRvYShudW0pKTsKKyNlbmRpZgorCQkJZmJfZHJhd3Byb2dyZXNzYmFyKG51bSk7CisJCX0KKwkJZnJlZShudW1fYnVmKTsKKwl9CisKKwlpZiAoYkN1cnNvck9mZikgLy8gcmVzdG9yZSBjdXJzb3IKKwkJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCAiXDAzM1s/MjVoIiwgNik7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL2Zic3BsYXNoLmNmZyBiL21pc2N1dGlscy9mYnNwbGFzaC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZjZjYwNwotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9mYnNwbGFzaC5jZmcKQEAgLTAsMCArMSw5IEBACisjIHByb2dyZXNzIGJhciBwb3NpdGlvbgorQkFSX0xFRlQ9MTcwCitCQVJfVE9QPTMwMAorQkFSX1dJRFRIPTMwMAorQkFSX0hFSUdIVD0yMAorIyBwcm9ncmVzcyBiYXIgY29sb3IKK0JBUl9SPTgwCitCQVJfRz04MAorQkFSX0I9MTMwCmRpZmYgLS1naXQgYS9taXNjdXRpbHMvZmxhc2hfZXJhc2VhbGwuYyBiL21pc2N1dGlscy9mbGFzaF9lcmFzZWFsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmOWI3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvZmxhc2hfZXJhc2VhbGwuYwpAQCAtMCwwICsxLDIwNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBlcmFzZWFsbC5jIC0tIGVyYXNlIHRoZSB3aG9sZSBvZiBhIE1URCBkZXZpY2UKKyAqCisgKiBQb3J0ZWQgdG8gYnVzeWJveCBmcm9tIG10ZC11dGlscy4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgQXJjb20gQ29udHJvbCBTeXN0ZW0gTHRkCisgKgorICogUmVuYW1lZCB0byBmbGFzaF9lcmFzZWFsbC5jCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZmxhc2hfZXJhc2VhbGxfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstak5xXSBNVERfREVWSUNFIgorLy91c2FnZTojZGVmaW5lIGZsYXNoX2VyYXNlYWxsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRXJhc2UgYW4gTVREIGRldmljZVxuIgorLy91c2FnZTogICAgICJcbgktaglGb3JtYXQgdGhlIGRldmljZSBmb3IgamZmczIiCisvL3VzYWdlOiAgICAgIlxuCS1OCURvbid0IHNraXAgYmFkIGJsb2NrcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJRG9uJ3QgZGlzcGxheSBwcm9ncmVzcyBtZXNzYWdlcyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bXRkL210ZC11c2VyLmg+CisjaW5jbHVkZSA8bGludXgvamZmczIuaD4KKworI2RlZmluZSBPUFRJT05fSiAgKDEgPDwgMCkKKyNkZWZpbmUgT1BUSU9OX04gICgxIDw8IDEpCisjZGVmaW5lIE9QVElPTl9RICAoMSA8PCAyKQorI2RlZmluZSBJU19OQU5EICAgKDEgPDwgMykKKworLyogbXRkL2pmZnMyLXVzZXIuaCB1c2VkIHRvIGhhdmUgdGhpcyBhdHJvY2l0eToKK2V4dGVybiBpbnQgdGFyZ2V0X2VuZGlhbjsKKworI2RlZmluZSB0MTYoeCkgKHsgX191MTYgX19iID0gKHgpOyAodGFyZ2V0X2VuZGlhbj09X19CWVRFX09SREVSKT9fX2I6YnN3YXBfMTYoX19iKTsgfSkKKyNkZWZpbmUgdDMyKHgpICh7IF9fdTMyIF9fYiA9ICh4KTsgKHRhcmdldF9lbmRpYW49PV9fQllURV9PUkRFUik/X19iOmJzd2FwXzMyKF9fYik7IH0pCisKKyNkZWZpbmUgY3B1X3RvX2plMTYoeCkgKChqaW50MTZfdCl7dDE2KHgpfSkKKyNkZWZpbmUgY3B1X3RvX2plMzIoeCkgKChqaW50MzJfdCl7dDMyKHgpfSkKKyNkZWZpbmUgY3B1X3RvX2plbW9kZSh4KSAoKGptb2RlX3Qpe3QzMih4KX0pCisKKyNkZWZpbmUgamUxNl90b19jcHUoeCkgKHQxNigoeCkudjE2KSkKKyNkZWZpbmUgamUzMl90b19jcHUoeCkgKHQzMigoeCkudjMyKSkKKyNkZWZpbmUgamVtb2RlX3RvX2NwdSh4KSAodDMyKCh4KS5tKSkKKworYnV0IG10ZC9qZmZzMi11c2VyLmggaXMgZ29uZSBub3cgKGF0IGxlYXN0IDIuNi4zMS42IGRvZXMgbm90IGhhdmUgaXQgYW55bW9yZSkKKyovCisKKy8qIFdlIGFsd2F5cyB1c2UgbmF0aXZlIGVuZGlhbm5lc3MgKi8KKyN1bmRlZiBjcHVfdG9famUxNgorI3VuZGVmIGNwdV90b19qZTMyCisjZGVmaW5lIGNwdV90b19qZTE2KHYpICgoamludDE2X3Qpeyh2KX0pCisjZGVmaW5lIGNwdV90b19qZTMyKHYpICgoamludDMyX3Qpeyh2KX0pCisKK3N0YXRpYyB2b2lkIHNob3dfcHJvZ3Jlc3MobXRkX2luZm9fdCAqbWVtaW5mbywgZXJhc2VfaW5mb190ICplcmFzZSkKK3sKKwlwcmludGYoIlxyRXJhc2luZyAldSBLaWJ5dGUgQCAleCAtICUydSUlIGNvbXBsZXRlLiIsCisJCSh1bnNpZ25lZCltZW1pbmZvLT5lcmFzZXNpemUgLyAxMDI0LAorCQllcmFzZS0+c3RhcnQsCisJCSh1bnNpZ25lZCkgKCh1bnNpZ25lZCBsb25nIGxvbmcpIGVyYXNlLT5zdGFydCAqIDEwMCAvIG1lbWluZm8tPnNpemUpCisJKTsKKwlmZmx1c2hfYWxsKCk7Cit9CisKK2ludCBmbGFzaF9lcmFzZWFsbF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZmxhc2hfZXJhc2VhbGxfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBqZmZzMl91bmtub3duX25vZGUgY2xlYW5tYXJrZXI7CisJbXRkX2luZm9fdCBtZW1pbmZvOworCWludCBmZCwgY2xtcG9zLCBjbG1sZW47CisJZXJhc2VfaW5mb190IGVyYXNlOworCXN0cnVjdCBzdGF0IHN0OworCXVuc2lnbmVkIGludCBmbGFnczsKKwljaGFyICptdGRfbmFtZTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0xIjsKKwlmbGFncyA9IGdldG9wdDMyKGFyZ3YsICJqTnEiKTsKKworCW10ZF9uYW1lID0gYXJndltvcHRpbmRdOworCWZkID0geG9wZW4obXRkX25hbWUsIE9fUkRXUik7CisJZnN0YXQoZmQsICZzdCk7CisJaWYgKCFTX0lTQ0hSKHN0LnN0X21vZGUpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6IG5vdCBhIGNoYXIgZGV2aWNlIiwgbXRkX25hbWUpOworCisJeGlvY3RsKGZkLCBNRU1HRVRJTkZPLCAmbWVtaW5mbyk7CisJZXJhc2UubGVuZ3RoID0gbWVtaW5mby5lcmFzZXNpemU7CisJaWYgKG1lbWluZm8udHlwZSA9PSBNVERfTkFOREZMQVNIKQorCQlmbGFncyB8PSBJU19OQU5EOworCisJY2xtcG9zID0gMDsKKwljbG1sZW4gPSA4OworCWlmIChmbGFncyAmIE9QVElPTl9KKSB7CisJCXVpbnQzMl90ICpjcmMzMl90YWJsZTsKKworCQljcmMzMl90YWJsZSA9IGNyYzMyX2ZpbGx0YWJsZShOVUxMLCAwKTsKKworCQljbGVhbm1hcmtlci5tYWdpYyA9IGNwdV90b19qZTE2KEpGRlMyX01BR0lDX0JJVE1BU0spOworCQljbGVhbm1hcmtlci5ub2RldHlwZSA9IGNwdV90b19qZTE2KEpGRlMyX05PREVUWVBFX0NMRUFOTUFSS0VSKTsKKwkJaWYgKCEoZmxhZ3MgJiBJU19OQU5EKSkKKwkJCWNsZWFubWFya2VyLnRvdGxlbiA9IGNwdV90b19qZTMyKHNpemVvZihzdHJ1Y3QgamZmczJfdW5rbm93bl9ub2RlKSk7CisJCWVsc2UgeworCQkJc3RydWN0IG5hbmRfb29iaW5mbyBvb2JpbmZvOworCisJCQl4aW9jdGwoZmQsIE1FTUdFVE9PQlNFTCwgJm9vYmluZm8pOworCisJCQkvKiBDaGVjayBmb3IgYXV0b3BsYWNlbWVudCAqLworCQkJaWYgKG9vYmluZm8udXNlZWNjID09IE1URF9OQU5ERUNDX0FVVE9QTEFDRSkgeworCQkJCS8qIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGZyZWUgYnl0ZXMgKi8KKwkJCQljbG1wb3MgPSBvb2JpbmZvLm9vYmZyZWVbMF1bMF07CisJCQkJY2xtbGVuID0gb29iaW5mby5vb2JmcmVlWzBdWzFdOworCQkJCWlmIChjbG1sZW4gPiA4KQorCQkJCQljbG1sZW4gPSA4OworCQkJCWlmIChjbG1sZW4gPT0gMCkKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImF1dG9wbGFjZW1lbnQgc2VsZWN0ZWQgYW5kIG5vIGVtcHR5IHNwYWNlIGluIG9vYiIpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBMZWdhY3kgbW9kZSAqLworCQkJCXN3aXRjaCAobWVtaW5mby5vb2JzaXplKSB7CisJCQkJY2FzZSA4OgorCQkJCQljbG1wb3MgPSA2OworCQkJCQljbG1sZW4gPSAyOworCQkJCQlicmVhazsKKwkJCQljYXNlIDE2OgorCQkJCQljbG1wb3MgPSA4OworCQkJCQkvKmNsbWxlbiA9IDg7Ki8KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA2NDoKKwkJCQkJY2xtcG9zID0gMTY7CisJCQkJCS8qY2xtbGVuID0gODsqLworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQljbGVhbm1hcmtlci50b3RsZW4gPSBjcHVfdG9famUzMig4KTsKKwkJfQorCisJCWNsZWFubWFya2VyLmhkcl9jcmMgPSBjcHVfdG9famUzMigKKwkJCWNyYzMyX2Jsb2NrX2VuZGlhbjAoMCwgJmNsZWFubWFya2VyLCBzaXplb2Yoc3RydWN0IGpmZnMyX3Vua25vd25fbm9kZSkgLSA0LCBjcmMzMl90YWJsZSkKKwkJKTsKKwl9CisKKwkvKiBEb24ndCB3YW50IHRvIGRlc3Ryb3kgcHJvZ3Jlc3MgaW5kaWNhdG9yIGJ5IGJiX2Vycm9yX21zZydzICovCisJYXBwbGV0X25hbWUgPSB4YXNwcmludGYoIlxuJXM6ICVzIiwgYXBwbGV0X25hbWUsIG10ZF9uYW1lKTsKKworCWZvciAoZXJhc2Uuc3RhcnQgPSAwOyBlcmFzZS5zdGFydCA8IG1lbWluZm8uc2l6ZTsKKwkgICAgIGVyYXNlLnN0YXJ0ICs9IG1lbWluZm8uZXJhc2VzaXplKSB7CisJCWlmICghKGZsYWdzICYgT1BUSU9OX04pKSB7CisJCQlpbnQgcmV0OworCQkJbG9mZl90IG9mZnNldCA9IGVyYXNlLnN0YXJ0OworCisJCQlyZXQgPSBpb2N0bChmZCwgTUVNR0VUQkFEQkxPQ0ssICZvZmZzZXQpOworCQkJaWYgKHJldCA+IDApIHsKKwkJCQlpZiAoIShmbGFncyAmIE9QVElPTl9RKSkKKwkJCQkJYmJfaW5mb19tc2coIlxuU2tpcHBpbmcgYmFkIGJsb2NrIGF0IDB4JTA4eCIsIGVyYXNlLnN0YXJ0KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChyZXQgPCAwKSB7CisJCQkJLyogQmxhY2sgYmxvY2sgdGFibGUgaXMgbm90IGF2YWlsYWJsZSBvbiBjZXJ0YWluIGZsYXNoCisJCQkJICogdHlwZXMgZS5nLiBOT1IKKwkJCQkgKi8KKwkJCQlpZiAoZXJybm8gPT0gRU9QTk9UU1VQUCkgeworCQkJCQlmbGFncyB8PSBPUFRJT05fTjsKKwkJCQkJaWYgKGZsYWdzICYgSVNfTkFORCkKKwkJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgYmxvY2sgY2hlY2sgbm90IGF2YWlsYWJsZSIpOworCQkJCX0gZWxzZSB7CisJCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiTUVNR0VUQkFEQkxPQ0sgZXJyb3IiKTsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoIShmbGFncyAmIE9QVElPTl9RKSkKKwkJCXNob3dfcHJvZ3Jlc3MoJm1lbWluZm8sICZlcmFzZSk7CisKKwkJeGlvY3RsKGZkLCBNRU1FUkFTRSwgJmVyYXNlKTsKKworCQkvKiBmb3JtYXQgZm9yIEpGRlMyID8gKi8KKwkJaWYgKCEoZmxhZ3MgJiBPUFRJT05fSikpCisJCQljb250aW51ZTsKKworCQkvKiB3cml0ZSBjbGVhbm1hcmtlciAqLworCQlpZiAoZmxhZ3MgJiBJU19OQU5EKSB7CisJCQlzdHJ1Y3QgbXRkX29vYl9idWYgb29iOworCisJCQlvb2IucHRyID0gKHVuc2lnbmVkIGNoYXIgKikgJmNsZWFubWFya2VyOworCQkJb29iLnN0YXJ0ID0gZXJhc2Uuc3RhcnQgKyBjbG1wb3M7CisJCQlvb2IubGVuZ3RoID0gY2xtbGVuOworCQkJeGlvY3RsKGZkLCBNRU1XUklURU9PQiwgJm9vYik7CisJCX0gZWxzZSB7CisJCQl4bHNlZWsoZmQsIGVyYXNlLnN0YXJ0LCBTRUVLX1NFVCk7CisJCQkvKiBpZiAobHNlZWsoZmQsIGVyYXNlLnN0YXJ0LCBTRUVLX1NFVCkgPCAwKSB7CisJCQkJYmJfcGVycm9yX21zZygiTVREICVzIGZhaWx1cmUiLCAic2VlayIpOworCQkJCWNvbnRpbnVlOworCQkJfSAqLworCQkJeHdyaXRlKGZkLCAmY2xlYW5tYXJrZXIsIHNpemVvZihjbGVhbm1hcmtlcikpOworCQkJLyogaWYgKHdyaXRlKGZkLCAmY2xlYW5tYXJrZXIsIHNpemVvZihjbGVhbm1hcmtlcikpICE9IHNpemVvZihjbGVhbm1hcmtlcikpIHsKKwkJCQliYl9wZXJyb3JfbXNnKCJNVEQgJXMgZmFpbHVyZSIsICJ3cml0ZSIpOworCQkJCWNvbnRpbnVlOworCQkJfSAqLworCQl9CisJCWlmICghKGZsYWdzICYgT1BUSU9OX1EpKQorCQkJcHJpbnRmKCIgQ2xlYW5tYXJrZXIgd3JpdHRlbiBhdCAleC4iLCBlcmFzZS5zdGFydCk7CisJfQorCWlmICghKGZsYWdzICYgT1BUSU9OX1EpKSB7CisJCXNob3dfcHJvZ3Jlc3MoJm1lbWluZm8sICZlcmFzZSk7CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShmZCk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9mbGFzaF9sb2NrX3VubG9jay5jIGIvbWlzY3V0aWxzL2ZsYXNoX2xvY2tfdW5sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZlZmQ5NQotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9mbGFzaF9sb2NrX3VubG9jay5jCkBAIC0wLDAgKzEsODEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogUG9ydGVkIHRvIGJ1c3lib3ggZnJvbSBtdGQtdXRpbHMuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZmxhc2hfbG9ja190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiTVREX0RFVklDRSBPRkZTRVQgU0VDVE9SUyIKKy8vdXNhZ2U6I2RlZmluZSBmbGFzaF9sb2NrX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTG9jayBwYXJ0IG9yIGFsbCBvZiBhbiBNVEQgZGV2aWNlLiBJZiBTRUNUT1JTIGlzIC0xLCB0aGVuIGFsbCBzZWN0b3JzXG4iCisvL3VzYWdlOiAgICAgICAid2lsbCBiZSBsb2NrZWQsIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIE9GRlNFVCIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZmxhc2hfdW5sb2NrX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJNVERfREVWSUNFIgorLy91c2FnZTojZGVmaW5lIGZsYXNoX3VubG9ja19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlVubG9jayBhbiBNVEQgZGV2aWNlIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxtdGQvbXRkLXVzZXIuaD4KKworaW50IGZsYXNoX2xvY2tfdW5sb2NrX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBmbGFzaF9sb2NrX3VubG9ja19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJLyogbm90ZTogZmllbGRzIGluIHRoZXNlIHN0cnVjdHMgYXJlIDMyLWJpdHMuCisJICogYXBwYXJlbnRseSB3ZSBjYW4ndCB3aW4gYW55dGhpbmcgYnkgdXNpbmcgb2ZmX3QKKwkgKiBvciBsb25nIGxvbmcncyBmb3Igb2Zmc2V0IGFuZC9vciBzZWN0b3JzIHZhcnMuICovCisJc3RydWN0IG10ZF9pbmZvX3VzZXIgaW5mbzsKKwlzdHJ1Y3QgZXJhc2VfaW5mb191c2VyIGxvY2s7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQ7CisJbG9uZyBzZWN0b3JzOworCWludCBmZDsKKworI2RlZmluZSBkb19sb2NrIChFTkFCTEVfRkxBU0hfTE9DSyAmJiAoIUVOQUJMRV9GTEFTSF9VTkxPQ0sgfHwgKGFwcGxldF9uYW1lWzZdID09ICdsJykpKQorCisJaWYgKCFhcmd2WzFdKQorCQliYl9zaG93X3VzYWdlKCk7CisKKwkvKiBwYXJzZSBvZmZzZXQgYW5kIG51bWJlciBvZiBzZWN0b3JzIHRvIGxvY2sgKi8KKwlvZmZzZXQgPSAwOworCXNlY3RvcnMgPSAtMTsKKwlpZiAoZG9fbG9jaykgeworCQlpZiAoIWFyZ3ZbMl0gfHwgIWFyZ3ZbM10pCisJCQliYl9zaG93X3VzYWdlKCk7CisJCW9mZnNldCA9IHhzdHJ0b3VsKGFyZ3ZbMl0sIDApOworCQlzZWN0b3JzID0geHN0cnRvbChhcmd2WzNdLCAwKTsKKwl9CisKKwlmZCA9IHhvcGVuKGFyZ3ZbMV0sIE9fUkRXUik7CisKKwl4aW9jdGwoZmQsIE1FTUdFVElORk8sICZpbmZvKTsKKworCWxvY2suc3RhcnQgPSAwOworCWxvY2subGVuZ3RoID0gaW5mby5zaXplOworCWlmIChkb19sb2NrKSB7CisJCXVuc2lnbmVkIGxvbmcgc2l6ZSA9IGluZm8uc2l6ZSAtIGluZm8uZXJhc2VzaXplOworCQlpZiAob2Zmc2V0ID4gc2l6ZSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVseCBpcyBiZXlvbmQgZGV2aWNlIHNpemUgJWx4XG4iLAorCQkJCQlvZmZzZXQsIHNpemUpOworCQl9CisKKwkJaWYgKHNlY3RvcnMgPT0gLTEpIHsKKwkJCXNlY3RvcnMgPSBpbmZvLnNpemUgLyBpbmZvLmVyYXNlc2l6ZTsKKwkJfSBlbHNlIHsKKy8vIGlzbid0IHRoaXMgdXNlbGVzcz8KKwkJCXVuc2lnbmVkIGxvbmcgbnVtID0gaW5mby5zaXplIC8gaW5mby5lcmFzZXNpemU7CisJCQlpZiAoc2VjdG9ycyA+IG51bSkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlbGQgYXJlIHRvbyBtYW55ICIKKwkJCQkJCSJzZWN0b3JzLCBkZXZpY2Ugb25seSBoYXMgIgorCQkJCQkJIiVsZFxuIiwgc2VjdG9ycywgbnVtKTsKKwkJCX0KKwkJfQorCisJCWxvY2suc3RhcnQgPSBvZmZzZXQ7CisJCWxvY2subGVuZ3RoID0gc2VjdG9ycyAqIGluZm8uZXJhc2VzaXplOworCQl4aW9jdGwoZmQsIE1FTUxPQ0ssICZsb2NrKTsKKwl9IGVsc2UgeworCQl4aW9jdGwoZmQsIE1FTVVOTE9DSywgJmxvY2spOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvZmxhc2hjcC5jIGIvbWlzY3V0aWxzL2ZsYXNoY3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmM1ODhkCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL2ZsYXNoY3AuYwpAQCAtMCwwICsxLDE2MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYnVzeWJveCByZWltcGxlbWVudGF0aW9uIG9mIGZsYXNoY3AKKyAqCisgKiAoQykgMjAwOSBTdGVmYW4gU2V5ZnJpZWQgPHNlaWZlQHNwaGFpcm9uLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBmbGFzaGNwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICItdiBGSUxFIE1URF9ERVZJQ0UiCisvL3VzYWdlOiNkZWZpbmUgZmxhc2hjcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvcHkgYW4gaW1hZ2UgdG8gTVREIGRldmljZVxuIgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxtdGQvbXRkLXVzZXIuaD4KKworLyogSWYgMSwgc2ltdWxhdGVzICJmbGFzaGluZyIgYnkgd3JpdGluZyB0byBleGlzdGluZyByZWd1bGFyIGZpbGUgKi8KKyNkZWZpbmUgTVREX0RFQlVHIDAKKworI2RlZmluZSBPUFRfdiAoMSA8PCAwKQorCisjZGVmaW5lIEJVRlNJWkUgKDQgKiAxMDI0KQorCitzdGF0aWMgdm9pZCBwcm9ncmVzcyhpbnQgbW9kZSwgdW9mZl90IGNvdW50LCB1b2ZmX3QgdG90YWwpCit7CisJdW9mZl90IHBlcmNlbnQ7CisKKwlpZiAoIW9wdGlvbl9tYXNrMzIpIC8vaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF92KSkKKwkJcmV0dXJuOworCXBlcmNlbnQgPSBjb3VudCAqIDEwMDsKKwlpZiAodG90YWwpCisJCXBlcmNlbnQgPSAodW5zaWduZWQpIChwZXJjZW50IC8gdG90YWwpOworCXByaW50ZigiXHIlczogJSJPRkZfRk1UInUvJSJPRkZfRk1UInUgKCV1JSUpICIsCisJCShtb2RlIDwgMCkgPyAiRXJhc2luZyBibG9jayIgOiAoKG1vZGUgPT0gMCkgPyAiV3JpdGluZyBrYiIgOiAiVmVyaWZ5aW5nIGtiIiksCisJCWNvdW50LCB0b3RhbCwgKHVuc2lnbmVkKXBlcmNlbnQpOworCWZmbHVzaF9hbGwoKTsKK30KKworc3RhdGljIHZvaWQgcHJvZ3Jlc3NfbmV3bGluZSh2b2lkKQoreworCWlmICghb3B0aW9uX21hc2szMikgLy9pZiAoIShvcHRpb25fbWFzazMyICYgT1BUX3YpKQorCQlyZXR1cm47CisJYmJfcHV0Y2hhcignXG4nKTsKK30KKworaW50IGZsYXNoY3BfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZsYXNoY3BfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBmZF9mLCBmZF9kOyAvKiBpbnB1dCBmaWxlIGFuZCBtdGQgZGV2aWNlIGZpbGUgZGVzY3JpcHRvcnMgKi8KKwlpbnQgaTsKKwl1b2ZmX3QgZXJhc2VfY291bnQ7CisJc3RydWN0IG10ZF9pbmZvX3VzZXIgbXRkOworCXN0cnVjdCBlcmFzZV9pbmZvX3VzZXIgZTsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YjsKKy8vCWNvbnN0IGNoYXIgKmZpbGVuYW1lLCAqZGV2aWNlbmFtZTsKKwlSRVNFUlZFX0NPTkZJR19VQlVGRkVSKGJ1ZiwgQlVGU0laRSk7CisJUkVTRVJWRV9DT05GSUdfVUJVRkZFUihidWYyLCBCVUZTSVpFKTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0yIjsgLyogZXhhY3RseSAyIG5vbi1vcHRpb24gYXJnczogZmlsZSwgZGV2ICovCisJLypvcHRzID0qLyBnZXRvcHQzMihhcmd2LCAidiIpOworCWFyZ3YgKz0gb3B0aW5kOworLy8JZmlsZW5hbWUgPSAqYXJndisrOworLy8JZGV2aWNlbmFtZSA9ICphcmd2OworI2RlZmluZSBmaWxlbmFtZSBhcmd2WzBdCisjZGVmaW5lIGRldmljZW5hbWUgYXJndlsxXQorCisJLyogb3BlbiBpbnB1dCBmaWxlIGFuZCBtdGQgZGV2aWNlIGFuZCBkbyBzYW5pdHkgY2hlY2tzICovCisJZmRfZiA9IHhvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJZnN0YXQoZmRfZiwgJnN0YXRiKTsKKwlmZF9kID0geG9wZW4oZGV2aWNlbmFtZSwgT19TWU5DIHwgT19SRFdSKTsKKyNpZiAhTVREX0RFQlVHCisJaWYgKGlvY3RsKGZkX2QsIE1FTUdFVElORk8sICZtdGQpIDwgMCkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgaXMgbm90IGEgTVREIGZsYXNoIGRldmljZSIsIGRldmljZW5hbWUpOworCX0KKwlpZiAoc3RhdGIuc3Rfc2l6ZSA+IG10ZC5zaXplKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyBiaWdnZXIgdGhhbiAlcyIsIGZpbGVuYW1lLCBkZXZpY2VuYW1lKTsKKwl9CisjZWxzZQorCW10ZC5lcmFzZXNpemUgPSA2NCAqIDEwMjQ7CisjZW5kaWYKKworCS8qIGFsd2F5cyBlcmFzZSBhIGNvbXBsZXRlIGJsb2NrICovCisJZXJhc2VfY291bnQgPSAodW9mZl90KShzdGF0Yi5zdF9zaXplICsgbXRkLmVyYXNlc2l6ZSAtIDEpIC8gbXRkLmVyYXNlc2l6ZTsKKwkvKiBlcmFzZSAxIGJsb2NrIGF0IGEgdGltZSB0byBiZSBhYmxlIHRvIGdpdmUgdmVyYm9zZSBvdXRwdXQgKi8KKwllLmxlbmd0aCA9IG10ZC5lcmFzZXNpemU7CisjaWYgMAorLyogKDEpIGJsb2F0CisgKiAoMikgd2lsbCBpdCB3b3JrIGZvciBtdWx0aS1naWdhYnl0ZSBkZXZpY2VzPworICogKDMpIHdvcnNlIHdydCBlcnJvciBkZXRlY3Rpb24gZ3JhbnVsYXJpdHkKKyAqLworCS8qIG9wdGltaXphdGlvbjogaWYgbm90IHZlcmJvc2UsIGVyYXNlIGluIG9uZSBnbyAqLworCWlmICghb3B0cykgeyAvLyBpZiAoIShvcHRzICYgT1BUX3YpKQorCQllLmxlbmd0aCA9IG10ZC5lcmFzZXNpemUgKiBlcmFzZV9jb3VudDsKKwkJZXJhc2VfY291bnQgPSAxOworCX0KKyNlbmRpZgorCWUuc3RhcnQgPSAwOworCWZvciAoaSA9IDE7IGkgPD0gZXJhc2VfY291bnQ7IGkrKykgeworCQlwcm9ncmVzcygtMSwgaSwgZXJhc2VfY291bnQpOworI2lmICFNVERfREVCVUcKKwkJaWYgKGlvY3RsKGZkX2QsIE1FTUVSQVNFLCAmZSkgPCAwKSB7CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImVyYXNlIGVycm9yIGF0IDB4JWxseCBvbiAlcyIsCisJCQkJKGxvbmcgbG9uZyllLnN0YXJ0LCBkZXZpY2VuYW1lKTsKKwkJfQorI2Vsc2UKKwkJdXNsZWVwKDEwMCoxMDAwKTsKKyNlbmRpZgorCQllLnN0YXJ0ICs9IG10ZC5lcmFzZXNpemU7CisJfQorCXByb2dyZXNzX25ld2xpbmUoKTsKKworCS8qIGRvaW5nIHRoaXMgb3V0ZXIgbG9vcCBnaXZlcyBzaWduaWZpY2FudGx5IHNtYWxsZXIgY29kZQorCSAqIHRoYW4gZG9pbmcgdHdvIHNlcGFyYXRlIGxvb3BzIGZvciB3cml0aW5nIGFuZCB2ZXJpZnlpbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDw9IDE7IGkrKykgeworCQl1b2ZmX3QgZG9uZTsKKwkJdW5zaWduZWQgY291bnQ7CisKKwkJeGxzZWVrKGZkX2YsIDAsIFNFRUtfU0VUKTsKKwkJeGxzZWVrKGZkX2QsIDAsIFNFRUtfU0VUKTsKKwkJZG9uZSA9IDA7CisJCWNvdW50ID0gQlVGU0laRTsKKwkJd2hpbGUgKDEpIHsKKwkJCXVvZmZfdCByZW07CisKKwkJCXByb2dyZXNzKGksIGRvbmUgLyAxMDI0LCAodW9mZl90KXN0YXRiLnN0X3NpemUgLyAxMDI0KTsKKwkJCXJlbSA9IHN0YXRiLnN0X3NpemUgLSBkb25lOworCQkJaWYgKHJlbSA9PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKHJlbSA8IEJVRlNJWkUpCisJCQkJY291bnQgPSByZW07CisJCQl4cmVhZChmZF9mLCBidWYsIGNvdW50KTsKKwkJCWlmIChpID09IDApIHsKKwkJCQlpbnQgcmV0OworCQkJCWlmIChjb3VudCA8IEJVRlNJWkUpCisJCQkJCW1lbXNldCgoY2hhciopYnVmICsgY291bnQsIDAsIEJVRlNJWkUgLSBjb3VudCk7CisJCQkJZXJybm8gPSAwOworCQkJCXJldCA9IGZ1bGxfd3JpdGUoZmRfZCwgYnVmLCBCVUZTSVpFKTsKKwkJCQlpZiAocmV0ICE9IEJVRlNJWkUpIHsKKwkJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJ3cml0ZSBlcnJvciBhdCAweCUiT0ZGX0ZNVCJ4IG9uICVzLCAiCisJCQkJCQkid3JpdGUgcmV0dXJuZWQgJWQiLAorCQkJCQkJZG9uZSwgZGV2aWNlbmFtZSwgcmV0KTsKKwkJCQl9CisJCQl9IGVsc2UgeyAvKiBpID09IDEgKi8KKwkJCQl4cmVhZChmZF9kLCBidWYyLCBjb3VudCk7CisJCQkJaWYgKG1lbWNtcChidWYsIGJ1ZjIsIGNvdW50KSAhPSAwKSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ2ZXJpZmljYXRpb24gbWlzbWF0Y2ggYXQgMHglIk9GRl9GTVQieCIsIGRvbmUpOworCQkJCX0KKwkJCX0KKworCQkJZG9uZSArPSBjb3VudDsKKwkJfQorCisJCXByb2dyZXNzX25ld2xpbmUoKTsKKwl9CisJLyogd2Ugd29uJ3QgY29tZSBoZXJlIGlmIHRoZXJlIHdhcyBhbiBlcnJvciAqLworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9oZHBhcm0uYyBiL21pc2N1dGlscy9oZHBhcm0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzQ4NmU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL2hkcGFybS5jCkBAIC0wLDAgKzEsMjEzOCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaGRwYXJtIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSBbMjAwM10gYnkgW01hdHRlbyBDcm9jZV0gPDMyOTc2Mjc3OTlAd2luZC5pdD4KKyAqIEhhY2tlZCBieSBUaXRvIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4gZm9yIHNpemUgb3B0aW1pemF0aW9uLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGJhc2VkIG9uIHRoZSBzb3VyY2UgY29kZSBvZiBoZHBhcm06IHNlZSBiZWxvdy4uLgorICogaGRwYXJtLmMgLSBDb21tYW5kIGxpbmUgaW50ZXJmYWNlIHRvIGdldC9zZXQgaGFyZCBkaXNrIHBhcmFtZXRlcnMKKyAqICAgICAgICAgIC0gYnkgTWFyayBMb3JkIChDKSAxOTk0LTIwMDIgLS0gZnJlZWx5IGRpc3RyaWJ1dGFibGUKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgaGRwYXJtX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gW0RFVklDRV0iCisvL3VzYWdlOiNkZWZpbmUgaGRwYXJtX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1hCUdldC9zZXQgZnMgcmVhZGFoZWFkIgorLy91c2FnZTogICAgICJcbgktQQlTZXQgZHJpdmUgcmVhZC1sb29rYWhlYWQgZmxhZyAoMC8xKSIKKy8vdXNhZ2U6ICAgICAiXG4JLWIJR2V0L3NldCBidXMgc3RhdGUgKDAgPT0gb2ZmLCAxID09IG9uLCAyID09IHRyaXN0YXRlKSIKKy8vdXNhZ2U6ICAgICAiXG4JLUIJU2V0IEFkdmFuY2VkIFBvd2VyIE1hbmFnZW1lbnQgc2V0dGluZyAoMS0yNTUpIgorLy91c2FnZTogICAgICJcbgktYwlHZXQvc2V0IElERSAzMi1iaXQgSU8gc2V0dGluZyIKKy8vdXNhZ2U6ICAgICAiXG4JLUMJQ2hlY2sgSURFIHBvd2VyIG1vZGUgc3RhdHVzIgorLy91c2FnZToJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19HRVRTRVRfRE1BKAorLy91c2FnZTogICAgICJcbgktZAlHZXQvc2V0IHVzaW5nX2RtYSBmbGFnIikKKy8vdXNhZ2U6ICAgICAiXG4JLUQJRW5hYmxlL2Rpc2FibGUgZHJpdmUgZGVmZWN0LW1nbXQiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZsdXNoIGJ1ZmZlciBjYWNoZSBmb3IgZGV2aWNlIG9uIGV4aXQiCisvL3VzYWdlOiAgICAgIlxuCS1nCURpc3BsYXkgZHJpdmUgZ2VvbWV0cnkiCisvL3VzYWdlOiAgICAgIlxuCS1oCURpc3BsYXkgdGVyc2UgdXNhZ2UgaW5mb3JtYXRpb24iCisvL3VzYWdlOglJRl9GRUFUVVJFX0hEUEFSTV9HRVRfSURFTlRJVFkoCisvL3VzYWdlOiAgICAgIlxuCS1pCURpc3BsYXkgZHJpdmUgaWRlbnRpZmljYXRpb24iKQorLy91c2FnZToJSUZfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZKAorLy91c2FnZTogICAgICJcbgktSQlEZXRhaWxlZC9jdXJyZW50IGluZm9ybWF0aW9uIGRpcmVjdGx5IGZyb20gZHJpdmUiKQorLy91c2FnZTogICAgICJcbgktawlHZXQvc2V0IGtlZXBfc2V0dGluZ3Nfb3Zlcl9yZXNldCBmbGFnICgwLzEpIgorLy91c2FnZTogICAgICJcbgktSwlTZXQgZHJpdmUga2VlcF9mZWF0dXJlc19vdmVyX3Jlc2V0IGZsYWcgKDAvMSkiCisvL3VzYWdlOiAgICAgIlxuCS1MCVNldCBkcml2ZSBkb29ybG9jayAoMC8xKSAocmVtb3ZhYmxlIGhhcmRkaXNrcyBvbmx5KSIKKy8vdXNhZ2U6ICAgICAiXG4JLW0JR2V0L3NldCBtdWx0aXBsZSBzZWN0b3IgY291bnQiCisvL3VzYWdlOiAgICAgIlxuCS1uCUdldC9zZXQgaWdub3JlLXdyaXRlLWVycm9ycyBmbGFnICgwLzEpIgorLy91c2FnZTogICAgICJcbgktcAlTZXQgUElPIG1vZGUgb24gSURFIGludGVyZmFjZSBjaGlwc2V0ICgwLDEsMiwzLDQsLi4uKSIKKy8vdXNhZ2U6ICAgICAiXG4JLVAJU2V0IGRyaXZlIHByZWZldGNoIGNvdW50IgorLyogLy91c2FnZTogICJcbgktcQlDaGFuZ2UgbmV4dCBzZXR0aW5nIHF1aWV0bHkiIC0gbm90IHN1cHBvcnRlZCBpYiBiYm94ICovCisvL3VzYWdlOiAgICAgIlxuCS1RCUdldC9zZXQgRE1BIHRhZ2dlZC1xdWV1aW5nIGRlcHRoIChpZiBzdXBwb3J0ZWQpIgorLy91c2FnZTogICAgICJcbgktcglHZXQvc2V0IHJlYWRvbmx5IGZsYWcgKERBTkdFUk9VUyB0byBzZXQpIgorLy91c2FnZToJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19TQ0FOX0hXSUYoCisvL3VzYWdlOiAgICAgIlxuCS1SCVJlZ2lzdGVyIGFuIElERSBpbnRlcmZhY2UgKERBTkdFUk9VUykiKQorLy91c2FnZTogICAgICJcbgktUwlTZXQgc3RhbmRieSAoc3BpbmRvd24pIHRpbWVvdXQiCisvL3VzYWdlOiAgICAgIlxuCS10CVBlcmZvcm0gZGV2aWNlIHJlYWQgdGltaW5ncyIKKy8vdXNhZ2U6ICAgICAiXG4JLVQJUGVyZm9ybSBjYWNoZSByZWFkIHRpbWluZ3MiCisvL3VzYWdlOiAgICAgIlxuCS11CUdldC9zZXQgdW5tYXNraXJxIGZsYWcgKDAvMSkiCisvL3VzYWdlOglJRl9GRUFUVVJFX0hEUEFSTV9IRElPX1VOUkVHSVNURVJfSFdJRigKKy8vdXNhZ2U6ICAgICAiXG4JLVUJVW5yZWdpc3RlciBhbiBJREUgaW50ZXJmYWNlIChEQU5HRVJPVVMpIikKKy8vdXNhZ2U6ICAgICAiXG4JLXYJRGVmYXVsdHM7IHNhbWUgYXMgLW1jdWRrcmFnIGZvciBJREUgZHJpdmVzIgorLy91c2FnZTogICAgICJcbgktVglEaXNwbGF5IHByb2dyYW0gdmVyc2lvbiBhbmQgZXhpdCBpbW1lZGlhdGVseSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fRFJJVkVfUkVTRVQoCisvL3VzYWdlOiAgICAgIlxuCS13CVBlcmZvcm0gZGV2aWNlIHJlc2V0IChEQU5HRVJPVVMpIikKKy8vdXNhZ2U6ICAgICAiXG4JLVcJU2V0IGRyaXZlIHdyaXRlLWNhY2hpbmcgZmxhZyAoMC8xKSAoREFOR0VST1VTKSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRigKKy8vdXNhZ2U6ICAgICAiXG4JLXgJVHJpc3RhdGUgZGV2aWNlIGZvciBob3Rzd2FwICgwLzEpIChEQU5HRVJPVVMpIikKKy8vdXNhZ2U6ICAgICAiXG4JLVgJU2V0IElERSB4ZmVyIG1vZGUgKERBTkdFUk9VUykiCisvL3VzYWdlOiAgICAgIlxuCS15CVB1dCBJREUgZHJpdmUgaW4gc3RhbmRieSBtb2RlIgorLy91c2FnZTogICAgICJcbgktWQlQdXQgSURFIGRyaXZlIHRvIHNsZWVwIgorLy91c2FnZTogICAgICJcbgktWglEaXNhYmxlIFNlYWdhdGUgYXV0by1wb3dlcnNhdmluZyBtb2RlIgorLy91c2FnZTogICAgICJcbgkteglSZXJlYWQgcGFydGl0aW9uIHRhYmxlIgorCisjaW5jbHVkZSAibGliYmIuaCIKKy8qIG11c3QgYmUgX2FmdGVyXyBsaWJiYi5oOiAqLworI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaWYgIWRlZmluZWQoQkxLR0VUU0laRTY0KQorIyBkZWZpbmUgQkxLR0VUU0laRTY0IF9JT1IoMHgxMiwxMTQsc2l6ZV90KQorI2VuZGlmCisKKy8qIGRldmljZSB0eXBlcyAqLworLyogLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIE5PX0RFViAgICAgICAgICAgICAgICAgIDB4ZmZmZgorI2RlZmluZSBBVEFfREVWICAgICAgICAgICAgICAgICAweDAwMDAKKyNkZWZpbmUgQVRBUElfREVWICAgICAgICAgICAgICAgMHgwMDAxCisKKy8qIHdvcmQgZGVmaW5pdGlvbnMgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0gKi8KKyNkZWZpbmUgR0VOX0NPTkZJRwkJMCAgIC8qIGdlbmVyYWwgY29uZmlndXJhdGlvbiAqLworI2RlZmluZSBMQ1lMUwkJCTEgICAvKiBudW1iZXIgb2YgbG9naWNhbCBjeWxpbmRlcnMgKi8KKyNkZWZpbmUgQ09ORklHCQkJMiAgIC8qIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gKi8KKyNkZWZpbmUgTEhFQURTCQkJMyAgIC8qIG51bWJlciBvZiBsb2dpY2FsIGhlYWRzICovCisjZGVmaW5lIFRSQUNLX0JZVEVTCQk0ICAgLyogbnVtYmVyIG9mIGJ5dGVzL3RyYWNrIChBVEEtMSkgKi8KKyNkZWZpbmUgU0VDVF9CWVRFUwkJNSAgIC8qIG51bWJlciBvZiBieXRlcy9zZWN0b3IgKEFUQS0xKSAqLworI2RlZmluZSBMU0VDVFMJCQk2ICAgLyogbnVtYmVyIG9mIGxvZ2ljYWwgc2VjdG9ycy90cmFjayAqLworI2RlZmluZSBTVEFSVF9TRVJJQUwgICAgICAgICAgICAxMCAgLyogQVNDSUkgc2VyaWFsIG51bWJlciAqLworI2RlZmluZSBMRU5HVEhfU0VSSUFMICAgICAgICAgICAxMCAgLyogMTAgd29yZHMgKDIwIGJ5dGVzIG9yIGNoYXJhY3RlcnMpICovCisjZGVmaW5lIEJVRl9UWVBFCQkyMCAgLyogYnVmZmVyIHR5cGUgKEFUQS0xKSAqLworI2RlZmluZSBCVUZGRVJfX1NJWkUJCTIxICAvKiBidWZmZXIgc2l6ZSAoQVRBLTEpICovCisjZGVmaW5lIFJXX0xPTkcJCQkyMiAgLyogZXh0cmEgYnl0ZXMgaW4gUi9XIExPTkcgY21kICggPCBBVEEtNCkqLworI2RlZmluZSBTVEFSVF9GV19SRVYgICAgICAgICAgICAyMyAgLyogQVNDSUkgZmlybXdhcmUgcmV2aXNpb24gKi8KKyNkZWZpbmUgTEVOR1RIX0ZXX1JFVgkJIDQgIC8qICA0IHdvcmRzICg4IGJ5dGVzIG9yIGNoYXJhY3RlcnMpICovCisjZGVmaW5lIFNUQVJUX01PREVMCQkyNyAgLyogQVNDSUkgbW9kZWwgbnVtYmVyICovCisjZGVmaW5lIExFTkdUSF9NT0RFTAkJMjAgIC8qIDIwIHdvcmRzICg0MCBieXRlcyBvciBjaGFyYWN0ZXJzKSAqLworI2RlZmluZSBTRUNUT1JfWEZFUl9NQVgJCTQ3ICAvKiByL3cgbXVsdGlwbGU6IG1heCBzZWN0b3JzIHhmZXJlZCAqLworI2RlZmluZSBEV09SRF9JTwkJNDggIC8qIGNhbiBkbyBkb3VibGUtd29yZCBJTyAoQVRBLTEgb25seSkgKi8KKyNkZWZpbmUgQ0FQQUJfMAkJCTQ5ICAvKiBjYXBhYmlsaXRpZXMgKi8KKyNkZWZpbmUgQ0FQQUJfMQkJCTUwCisjZGVmaW5lIFBJT19NT0RFCQk1MSAgLyogbWF4IFBJTyBtb2RlIHN1cHBvcnRlZCAob2Jzb2xldGUpKi8KKyNkZWZpbmUgRE1BX01PREUJCTUyICAvKiBtYXggU2luZ2xld29yZCBETUEgbW9kZSBzdXBwb3J0ZWQgKG9icykqLworI2RlZmluZSBXSEFUU19WQUxJRAkJNTMgIC8qIHdoYXQgZmllbGRzIGFyZSB2YWxpZCAqLworI2RlZmluZSBMQ1lMU19DVVIJCTU0ICAvKiBjdXJyZW50IGxvZ2ljYWwgY3lsaW5kZXJzICovCisjZGVmaW5lIExIRUFEU19DVVIJCTU1ICAvKiBjdXJyZW50IGxvZ2ljYWwgaGVhZHMgKi8KKyNkZWZpbmUgTFNFQ1RTX0NVUgkJNTYgIC8qIGN1cnJlbnQgbG9naWNhbCBzZWN0b3JzL3RyYWNrICovCisjZGVmaW5lIENBUEFDSVRZX0xTQgkJNTcgIC8qIGN1cnJlbnQgY2FwYWNpdHkgaW4gc2VjdG9ycyAqLworI2RlZmluZSBDQVBBQ0lUWV9NU0IJCTU4CisjZGVmaW5lIFNFQ1RPUl9YRkVSX0NVUgkJNTkgIC8qIHIvdyBtdWx0aXBsZTogY3VycmVudCBzZWN0b3JzIHhmZXJlZCAqLworI2RlZmluZSBMQkFfU0VDVFNfTFNCCQk2MCAgLyogTEJBOiB0b3RhbCBudW1iZXIgb2YgdXNlciAqLworI2RlZmluZSBMQkFfU0VDVFNfTVNCCQk2MSAgLyogICAgICBhZGRyZXNzYWJsZSBzZWN0b3JzICovCisjZGVmaW5lIFNJTkdMRV9ETUEJCTYyICAvKiBzaW5nbGV3b3JkIERNQSBtb2RlcyAqLworI2RlZmluZSBNVUxUSV9ETUEJCTYzICAvKiBtdWx0aXdvcmQgRE1BIG1vZGVzICovCisjZGVmaW5lIEFEVl9QSU9fTU9ERVMJCTY0ICAvKiBhZHZhbmNlZCBQSU8gbW9kZXMgc3VwcG9ydGVkICovCisJCQkJICAgIC8qIG11bHRpd29yZCBETUEgeGZlciBjeWNsZSB0aW1lOiAqLworI2RlZmluZSBETUFfVElNRV9NSU4JCTY1ICAvKiAgIC0gbWluaW11bSAqLworI2RlZmluZSBETUFfVElNRV9OT1JNCQk2NiAgLyogICAtIG1hbnVmYWN0dXJlcidzIHJlY29tbWVuZGVkICovCisJCQkJICAgIC8qIG1pbmltdW0gUElPIHhmZXIgY3ljbGUgdGltZTogKi8KKyNkZWZpbmUgUElPX05PX0ZMT1cJCTY3ICAvKiAgIC0gd2l0aG91dCBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUgUElPX0ZMT1cJCTY4ICAvKiAgIC0gd2l0aCBJT1JEWSBmbG93IGNvbnRyb2wgKi8KKyNkZWZpbmUgUEtUX1JFTAkJCTcxICAvKiB0eXBpY2FsICNucyBmcm9tIFBLVCBjbWQgdG8gYnVzIHJlbCAqLworI2RlZmluZSBTVkNfTkJTWQkJNzIgIC8qIHR5cGljYWwgI25zIGZyb20gU0VSVklDRSBjbWQgdG8gIUJTWSAqLworI2RlZmluZSBDRFJfTUFKT1IJCTczICAvKiBDRCBST006IG1ham9yIHZlcnNpb24gbnVtYmVyICovCisjZGVmaW5lIENEUl9NSU5PUgkJNzQgIC8qIENEIFJPTTogbWlub3IgdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUgUVVFVUVfREVQVEgJCTc1ICAvKiBxdWV1ZSBkZXB0aCAqLworI2RlZmluZSBNQUpPUgkJCTgwICAvKiBtYWpvciB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZSBNSU5PUgkJCTgxICAvKiBtaW5vciB2ZXJzaW9uIG51bWJlciAqLworI2RlZmluZSBDTURTX1NVUFBfMAkJODIgIC8qIGNvbW1hbmQvZmVhdHVyZSBzZXQocykgc3VwcG9ydGVkICovCisjZGVmaW5lIENNRFNfU1VQUF8xCQk4MworI2RlZmluZSBDTURTX1NVUFBfMgkJODQKKyNkZWZpbmUgQ01EU19FTl8wCQk4NSAgLyogY29tbWFuZC9mZWF0dXJlIHNldChzKSBlbmFibGVkICovCisjZGVmaW5lIENNRFNfRU5fMQkJODYKKyNkZWZpbmUgQ01EU19FTl8yCQk4NworI2RlZmluZSBVTFRSQV9ETUEJCTg4ICAvKiB1bHRyYSBETUEgbW9kZXMgKi8KKwkJCQkgICAgLyogdGltZSB0byBjb21wbGV0ZSBzZWN1cml0eSBlcmFzZSAqLworI2RlZmluZSBFUkFTRV9USU1FCQk4OSAgLyogICAtIG9yZGluYXJ5ICovCisjZGVmaW5lIEVOSF9FUkFTRV9USU1FCQk5MCAgLyogICAtIGVuaGFuY2VkICovCisjZGVmaW5lIEFEVl9QV1IJCQk5MSAgLyogY3VycmVudCBhZHZhbmNlZCBwb3dlciBtYW5hZ2VtZW50IGxldmVsCisJCQkJICAgICAgIGluIGxvdyBieXRlLCAweDQwIGluIGhpZ2ggYnl0ZS4gKi8KKyNkZWZpbmUgUFNXRF9DT0RFCQk5MiAgLyogbWFzdGVyIHBhc3N3b3JkIHJldmlzaW9uIGNvZGUgKi8KKyNkZWZpbmUgSFdSU1RfUlNMVAkJOTMgIC8qIGhhcmR3YXJlIHJlc2V0IHJlc3VsdCAqLworI2RlZmluZSBBQ09VU1RJQwkJOTQgIC8qIGFjb3VzdGljIG1nbXQgdmFsdWVzICggPj0gQVRBLTYpICovCisjZGVmaW5lIExCQV9MU0IJCQkxMDAgLyogTEJBOiBtYXhpbXVtLiAgQ3VycmVudGx5IG9ubHkgNDggKi8KKyNkZWZpbmUgTEJBX01JRAkJCTEwMSAvKiAgICAgIGJpdHMgYXJlIHVzZWQsIGJ1dCBhZGRyIDEwMyAqLworI2RlZmluZSBMQkFfNDhfTVNCCQkxMDIgLyogICAgICBoYXMgYmVlbiByZXNlcnZlZCBmb3IgTEJBIGluICovCisjZGVmaW5lIExCQV82NF9NU0IJCTEwMyAvKiAgICAgIHRoZSBmdXR1cmUuICovCisjZGVmaW5lIFJNX1NUQVQJCQkxMjcgLyogcmVtb3ZhYmxlIG1lZGlhIHN0YXR1cyBub3RpZmljYXRpb24gZmVhdHVyZSBzZXQgc3VwcG9ydCAqLworI2RlZmluZSBTRUNVX1NUQVRVUwkJMTI4IC8qIHNlY3VyaXR5IHN0YXR1cyAqLworI2RlZmluZSBDRkFfUFdSX01PREUJCTE2MCAvKiBDRkEgcG93ZXIgbW9kZSAxICovCisjZGVmaW5lIFNUQVJUX01FRElBICAgICAgICAgICAgIDE3NiAvKiBtZWRpYSBzZXJpYWwgbnVtYmVyICovCisjZGVmaW5lIExFTkdUSF9NRURJQSAgICAgICAgICAgIDIwICAvKiAyMCB3b3JkcyAoNDAgYnl0ZXMgb3IgY2hhcmFjdGVycykqLworI2RlZmluZSBTVEFSVF9NQU5VRiAgICAgICAgICAgICAxOTYgLyogbWVkaWEgbWFudWZhY3R1cmVyIEkuRC4gKi8KKyNkZWZpbmUgTEVOR1RIX01BTlVGICAgICAgICAgICAgMTAgIC8qIDEwIHdvcmRzICgyMCBieXRlcyBvciBjaGFyYWN0ZXJzKSAqLworI2RlZmluZSBJTlRFR1JJVFkJCTI1NSAvKiBpbnRlZ3JpdHkgd29yZCAqLworCisvKiBiaXQgZGVmaW5pdGlvbnMgd2l0aGluIHRoZSB3b3JkcyAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogbWFueSB3b3JkcyBhcmUgY29uc2lkZXJlZCB2YWxpZCBpZiBiaXQgMTUgaXMgMCBhbmQgYml0IDE0IGlzIDEgKi8KKyNkZWZpbmUgVkFMSUQJCQkweGMwMDAKKyNkZWZpbmUgVkFMSURfVkFMCQkweDQwMDAKKy8qIG1hbnkgd29yZHMgYXJlIGNvbnNpZGVyZWQgaW52YWxpZCBpZiB0aGV5IGFyZSBlaXRoZXIgYWxsLTAgb3IgYWxsLTEgKi8KKyNkZWZpbmUgTk9WQUxfMAkJCTB4MDAwMAorI2RlZmluZSBOT1ZBTF8xCQkJMHhmZmZmCisKKy8qIHdvcmQgMDogZ2VuX2NvbmZpZyAqLworI2RlZmluZSBOT1RfQVRBCQkJMHg4MDAwCisjZGVmaW5lIE5PVF9BVEFQSQkJMHg0MDAwCS8qIChjaGVjayBvbmx5IGlmIGJpdCAxNSA9PSAxKSAqLworI2RlZmluZSBNRURJQV9SRU1PVkFCTEUJCTB4MDA4MAorI2RlZmluZSBEUklWRV9OT1RfUkVNT1ZBQkxFCTB4MDA0MCAgLyogYml0IG9ic29sZXRlZCBpbiBBVEEgNiAqLworI2RlZmluZSBJTkNPTVBMRVRFCQkweDAwMDQKKyNkZWZpbmUgQ0ZBX1NVUFBPUlRfVkFMCQkweDg0OGEJLyogODQ4YT1DRkEgZmVhdHVyZSBzZXQgc3VwcG9ydCAqLworI2RlZmluZSBEUlFfUkVTUE9OU0VfVElNRQkweDAwNjAKKyNkZWZpbmUgRFJRXzNNU19WQUwJCTB4MDAwMAorI2RlZmluZSBEUlFfSU5UUl9WQUwJCTB4MDAyMAorI2RlZmluZSBEUlFfNTBVU19WQUwJCTB4MDA0MAorI2RlZmluZSBQS1RfU0laRV9TVVBQT1JURUQJMHgwMDAzCisjZGVmaW5lIFBLVF9TSVpFXzEyX1ZBTAkJMHgwMDAwCisjZGVmaW5lIFBLVF9TSVpFXzE2X1ZBTAkJMHgwMDAxCisjZGVmaW5lIEVRUFRfVFlQRQkJMHgxZjAwCisjZGVmaW5lIFNISUZUX0VRUFQJCTgKKworI2RlZmluZSBDRFJPTSAweDAwMDUKKworLyogd29yZCAxOiBudW1iZXIgb2YgbG9naWNhbCBjeWxpbmRlcnMgKi8KKyNkZWZpbmUgTENZTFNfTUFYCQkweDNmZmYgLyogbWF4aW11bSBhbGxvd2FibGUgdmFsdWUgKi8KKworLyogd29yZCAyOiBzcGVjaWZpYyBjb25maWd1cmF0aW9uCisgKiAoYSkgcmVxdWlyZSBTRVQgRkVBVFVSRVMgdG8gc3Bpbi11cAorICogKGIpIHJlcXVpcmUgc3Bpbi11cCB0byBmdWxseSByZXBseSB0byBJREVOVElGWSBERVZJQ0UKKyAqLworI2RlZmluZSBTVEJZX05JRF9WQUwJCTB4MzdjOCAgLyogICAgIChhKSBhbmQgICAgIChiKSAqLworI2RlZmluZSBTVEJZX0lEX1ZBTAkJMHg3MzhjCS8qICAgICAoYSkgYW5kIG5vdCAoYikgKi8KKyNkZWZpbmUgUFdSRF9OSURfVkFMCQkweDhjNzMJLyogbm90IChhKSBhbmQgICAgIChiKSAqLworI2RlZmluZSBQV1JEX0lEX1ZBTAkJMHhjODM3CS8qIG5vdCAoYSkgYW5kIG5vdCAoYikgKi8KKworLyogd29yZHMgNDcgJiA1OTogc2VjdG9yX3hmZXJfbWF4ICYgc2VjdG9yX3hmZXJfY3VyICovCisjZGVmaW5lIFNFQ1RPUl9YRkVSCQkweDAwZmYgIC8qIHNlY3RvcnMgeGZlcmVkIG9uIHIvdyBtdWx0aXBsZSBjbWRzKi8KKyNkZWZpbmUgTVVMVElQTEVfU0VUVElOR19WQUxJRCAgMHgwMTAwICAvKiAxPW11bHRpcGxlIHNlY3RvciBzZXR0aW5nIGlzIHZhbGlkICovCisKKy8qIHdvcmQgNDk6IGNhcGFiaWxpdGllcyAwICovCisjZGVmaW5lIFNURF9TVEJZCQkweDIwMDAgIC8qIDE9c3RhbmRhcmQgdmFsdWVzIHN1cHBvcnRlZCAoQVRBKTsgMD12ZW5kb3Igc3BlY2lmaWMgdmFsdWVzICovCisjZGVmaW5lIElPUkRZX1NVUAkJMHgwODAwICAvKiAxPXN1cHBvcnQ7IDA9bWF5IGJlIHN1cHBvcnRlZCAqLworI2RlZmluZSBJT1JEWV9PRkYJCTB4MDQwMCAgLyogMT1tYXkgYmUgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTEJBX1NVUAkJCTB4MDIwMCAgLyogMT1Mb2dpY2FsIEJsb2NrIEFkZHJlc3Mgc3VwcG9ydCAqLworI2RlZmluZSBETUFfU1VQCQkJMHgwMTAwICAvKiAxPURpcmVjdCBNZW1vcnkgQWNjZXNzIHN1cHBvcnQgKi8KKyNkZWZpbmUgRE1BX0lMX1NVUAkJMHg4MDAwICAvKiAxPWludGVybGVhdmVkIERNQSBzdXBwb3J0IChBVEFQSSkgKi8KKyNkZWZpbmUgQ01EX1FfU1VQCQkweDQwMDAgIC8qIDE9Y29tbWFuZCBxdWV1aW5nIHN1cHBvcnQgKEFUQVBJKSAqLworI2RlZmluZSBPVkxQX1NVUAkJMHgyMDAwICAvKiAxPW92ZXJsYXAgb3BlcmF0aW9uIHN1cHBvcnQgKEFUQVBJKSAqLworI2RlZmluZSBTV1JTVF9SRVEJCTB4MTAwMCAgLyogMT1BVEEgU1cgcmVzZXQgcmVxdWlyZWQgKEFUQVBJLCBvYnNvbGV0ZSAqLworCisvKiB3b3JkIDUwOiBjYXBhYmlsaXRpZXMgMSAqLworI2RlZmluZSBNSU5fU1RBTkRCWV9USU1FUgkweDAwMDEgIC8qIDE9ZGV2aWNlIHNwZWNpZmljIHN0YW5kYnkgdGltZXIgdmFsdWUgbWluaW11bSAqLworCisvKiB3b3JkcyA1MSAmIDUyOiBQSU8gJiBETUEgY3ljbGUgdGltZXMgKi8KKyNkZWZpbmUgTU9ERQkJCTB4ZmYwMCAgLyogdGhlIG1vZGUgaXMgaW4gdGhlIE1TQnMgKi8KKworLyogd29yZCA1Mzogd2hhdHNfdmFsaWQgKi8KKyNkZWZpbmUgT0tfVzg4CQkJMHgwMDA0CS8qIHRoZSB1bHRyYV9kbWEgaW5mbyBpcyB2YWxpZCAqLworI2RlZmluZSBPS19XNjRfNzAJCTB4MDAwMiAgLyogc2VlIGFib3ZlIGZvciB3b3JkIGRlc2NyaXB0aW9ucyAqLworI2RlZmluZSBPS19XNTRfNTgJCTB4MDAwMSAgLyogY3VycmVudCBjeWwsIGhlYWQsIHNlY3RvciwgY2FwLiBpbmZvIHZhbGlkICovCisKKy8qd29yZCA2Myw4ODogZG1hX21vZGUsIHVsdHJhX2RtYV9tb2RlKi8KKyNkZWZpbmUgTU9ERV9NQVgJCTcJLyogYml0IGRlZmluaXRpb25zIGZvcmNlIHVkbWEgPD03ICh3aGVuCisJCQkJCSAqIHVkbWEgPj04IGNvbWVzIG91dCBpdCdsbCBoYXZlIHRvIGJlCisJCQkJCSAqIGRlZmluZWQgaW4gYSBuZXcgZG1hX21vZGUgd29yZCEpICovCisKKy8qIHdvcmQgNjQ6IFBJTyB0cmFuc2ZlciBtb2RlcyAqLworI2RlZmluZSBQSU9fU1VQCQkJMHgwMGZmICAvKiBvbmx5IGJpdHMgMCAmIDEgYXJlIHVzZWQgc28gZmFyLCAgKi8KKyNkZWZpbmUgUElPX01PREVfTUFYCQk4ICAgICAgIC8qIGJ1dCBhbGwgOCBiaXRzIGFyZSBkZWZpbmVkICAgICAgICAqLworCisvKiB3b3JkIDc1OiBxdWV1ZV9kZXB0aCAqLworI2RlZmluZSBERVBUSF9CSVRTCQkweDAwMWYgIC8qIGJpdHMgdXNlZCBmb3IgcXVldWUgZGVwdGggKi8KKworLyogd29yZHMgODAtODE6IHZlcnNpb24gbnVtYmVycyAqLworLyogTk9WQUxfMCBvciAgTk9WQUxfMSBtZWFucyBkZXZpY2UgZG9lcyBub3QgcmVwb3J0IHZlcnNpb24gKi8KKworLyogd29yZCA4MTogbWlub3IgdmVyc2lvbiBudW1iZXIgKi8KKyNkZWZpbmUgTUlOT1JfTUFYCQkweDIyCisvKiB3b3JkcyA4Mi04NDogY21kcy9mZWF0cyBzdXBwb3J0ZWQgKi8KKyNkZWZpbmUgQ01EU19XODIJCTB4NzdmZiAgLyogd29yZCA4MjogZGVmaW5lZCBjb21tYW5kIGxvY2F0aW9ucyovCisjZGVmaW5lIENNRFNfVzgzCQkweDNmZmYgIC8qIHdvcmQgODM6IGRlZmluZWQgY29tbWFuZCBsb2NhdGlvbnMqLworI2RlZmluZSBDTURTX1c4NAkJMHgwMDJmICAvKiB3b3JkIDgzOiBkZWZpbmVkIGNvbW1hbmQgbG9jYXRpb25zKi8KKyNkZWZpbmUgU1VQUE9SVF80OF9CSVQJCTB4MDQwMAorI2RlZmluZSBOVU1fQ01EX0ZFQVRfU1RSCTQ4CisKKy8qIHdvcmRzIDg1LTg3OiBjbWRzL2ZlYXRzIGVuYWJsZWQgKi8KKy8qIHVzZSBjbWRfZmVhdF9zdHJbXSB0byBkaXNwbGF5IHdoYXQgY29tbWFuZHMgYW5kIGZlYXR1cmVzIGhhdmUKKyAqIGJlZW4gZW5hYmxlZCB3aXRoIHdvcmRzIDg1LTg3CisgKi8KKworLyogd29yZHMgODksIDkwLCBTRUNVIEVSQVNFIFRJTUUgKi8KKyNkZWZpbmUgRVJBU0VfQklUUyAgICAgIDB4MDBmZgorCisvKiB3b3JkIDkyOiBtYXN0ZXIgcGFzc3dvcmQgcmV2aXNpb24gKi8KKy8qIE5PVkFMXzAgb3IgIE5PVkFMXzEgbWVhbnMgbm8gc3VwcG9ydCBmb3IgbWFzdGVyIHBhc3N3b3JkIHJldmlzaW9uICovCisKKy8qIHdvcmQgOTM6IGh3IHJlc2V0IHJlc3VsdCAqLworI2RlZmluZSBDQkxJRCAgICAgICAgICAgMHgyMDAwICAvKiBDQkxJRCBzdGF0dXMgKi8KKyNkZWZpbmUgUlNUMCAgICAgICAgICAgIDB4MDAwMSAgLyogMT1yZXNldCB0byBkZXZpY2UgIzAgKi8KKyNkZWZpbmUgREVWX0RFVCAgICAgICAgIDB4MDAwNiAgLyogaG93IGRldmljZSBudW0gZGV0ZXJtaW5lZCAqLworI2RlZmluZSBKVU1QRVJfVkFMICAgICAgMHgwMDAyICAvKiBkZXZpY2UgbnVtIGRldGVybWluZWQgYnkganVtcGVyICovCisjZGVmaW5lIENTRUxfVkFMICAgICAgICAweDAwMDQgIC8qIGRldmljZSBudW0gZGV0ZXJtaW5lZCBieSBDU0VMX1ZBTCAqLworCisvKiB3b3JkIDEyNzogcmVtb3ZhYmxlIG1lZGlhIHN0YXR1cyBub3RpZmljYXRpb24gZmVhdHVyZSBzZXQgc3VwcG9ydCAqLworI2RlZmluZSBSTV9TVEFUX0JJVFMgICAgMHgwMDAzCisjZGVmaW5lIFJNX1NUQVRfU1VQICAgICAweDAwMDEKKworLyogd29yZCAxMjg6IHNlY3VyaXR5ICovCisjZGVmaW5lIFNFQ1VfRU5BQkxFRCAgICAweDAwMDIKKyNkZWZpbmUgU0VDVV9MRVZFTCAgICAgIDB4MDAxMAorI2RlZmluZSBOVU1fU0VDVV9TVFIgICAgNgorCisvKiB3b3JkIDE2MDogQ0ZBIHBvd2VyIG1vZGUgKi8KKyNkZWZpbmUgVkFMSURfVzE2MCAgICAgICAgICAgICAgMHg4MDAwICAvKiAxPXdvcmQgdmFsaWQgKi8KKyNkZWZpbmUgUFdSX01PREVfUkVRICAgICAgICAgICAgMHgyMDAwICAvKiAxPUNGQSBwb3dlciBtb2RlIHJlcSdkIGJ5IHNvbWUgY21kcyovCisjZGVmaW5lIFBXUl9NT0RFX09GRiAgICAgICAgICAgIDB4MTAwMCAgLyogMT1DRkEgcG93ZXIgbW9kZWQgZGlzYWJsZWQgKi8KKyNkZWZpbmUgTUFYX0FNUFMgICAgICAgICAgICAgICAgMHgwZmZmICAvKiB2YWx1ZSA9IG1heCBjdXJyZW50IGluIG1hICovCisKKy8qIHdvcmQgMjU1OiBpbnRlZ3JpdHkgKi8KKyNkZWZpbmUgU0lHICAgICAgICAgICAgICAgICAgICAgMHgwMGZmICAvKiBzaWduYXR1cmUgbG9jYXRpb24gKi8KKyNkZWZpbmUgU0lHX1ZBTCAgICAgICAgICAgICAgICAgMHgwMGE1ICAvKiBzaWduYXR1cmUgdmFsdWUgKi8KKworI2RlZmluZSBUSU1JTkdfQlVGX01CICAgICAgICAgICAxCisjZGVmaW5lIFRJTUlOR19CVUZfQllURVMgICAgICAgIChUSU1JTkdfQlVGX01CICogMTAyNCAqIDEwMjQpCisKKyN1bmRlZiBET19GTFVTSENBQ0hFICAgICAgICAgICAgLyogdW5kZXIgY29uc3RydWN0aW9uOiBmb3JjZSBjYWNoZSBmbHVzaCBvbiAtVzAgKi8KKworCisjZGVmaW5lIElTX0dFVCAxCisjZGVmaW5lIElTX1NFVCAyCisKKworZW51bSB7IGZkID0gMyB9OworCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlzbWFsbGludCBnZXRfaWRlbnRpdHksIGdldF9nZW9tOworCXNtYWxsaW50IGRvX2ZsdXNoOworCXNtYWxsaW50IGRvX2N0aW1pbmdzLCBkb190aW1pbmdzOworCXNtYWxsaW50IHJlcmVhZF9wYXJ0bjsKKwlzbWFsbGludCBzZXRfcGlvbW9kZSwgbm9pc3lfcGlvbW9kZTsKKwlzbWFsbGludCBnZXRzZXRfcmVhZGFoZWFkOworCXNtYWxsaW50IGdldHNldF9yZWFkb25seTsKKwlzbWFsbGludCBnZXRzZXRfdW5tYXNrOworCXNtYWxsaW50IGdldHNldF9tdWx0OworI2lmZGVmIEhESU9fR0VUX1FETUEKKwlzbWFsbGludCBnZXRzZXRfZG1hX3E7CisjZW5kaWYKKwlzbWFsbGludCBnZXRzZXRfbm93ZXJyOworCXNtYWxsaW50IGdldHNldF9rZWVwOworCXNtYWxsaW50IGdldHNldF9pbzMyYml0OworCWludCBwaW9tb2RlOworCXVuc2lnbmVkIGxvbmcgWHJlYWRhaGVhZDsKKwl1bnNpZ25lZCBsb25nIHJlYWRvbmx5OworCXVuc2lnbmVkIGxvbmcgdW5tYXNrOworCXVuc2lnbmVkIGxvbmcgbXVsdDsKKyNpZmRlZiBIRElPX1NFVF9RRE1BCisJdW5zaWduZWQgbG9uZyBkbWFfcTsKKyNlbmRpZgorCXVuc2lnbmVkIGxvbmcgbm93ZXJyOworCXVuc2lnbmVkIGxvbmcga2VlcDsKKwl1bnNpZ25lZCBsb25nIGlvMzJiaXQ7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fR0VUU0VUX0RNQQorCXVuc2lnbmVkIGxvbmcgZG1hOworCXNtYWxsaW50IGdldHNldF9kbWE7CisjZW5kaWYKKyNpZmRlZiBIRElPX0RSSVZFX0NNRAorCXNtYWxsaW50IHNldF94ZmVybW9kZSwgZ2V0X3hmZXJtb2RlOworCXNtYWxsaW50IGdldHNldF9ka2VlcDsKKwlzbWFsbGludCBnZXRzZXRfc3RhbmRieTsKKwlzbWFsbGludCBnZXRzZXRfbG9va2FoZWFkOworCXNtYWxsaW50IGdldHNldF9wcmVmZXRjaDsKKwlzbWFsbGludCBnZXRzZXRfZGVmZWN0czsKKwlzbWFsbGludCBnZXRzZXRfd2NhY2hlOworCXNtYWxsaW50IGdldHNldF9kb29ybG9jazsKKwlzbWFsbGludCBzZXRfc2VhZ2F0ZTsKKwlzbWFsbGludCBzZXRfc3RhbmRieW5vdzsKKwlzbWFsbGludCBzZXRfc2xlZXBub3c7CisJc21hbGxpbnQgZ2V0X3Bvd2VybW9kZTsKKwlzbWFsbGludCBnZXRzZXRfYXBtbW9kZTsKKwlpbnQgeGZlcm1vZGVfcmVxdWVzdGVkOworCXVuc2lnbmVkIGxvbmcgZGtlZXA7CisJdW5zaWduZWQgbG9uZyBzdGFuZGJ5X3JlcXVlc3RlZDsgLyogMC4uMjU1ICovCisJdW5zaWduZWQgbG9uZyBsb29rYWhlYWQ7CisJdW5zaWduZWQgbG9uZyBwcmVmZXRjaDsKKwl1bnNpZ25lZCBsb25nIGRlZmVjdHM7CisJdW5zaWduZWQgbG9uZyB3Y2FjaGU7CisJdW5zaWduZWQgbG9uZyBkb29ybG9jazsKKwl1bnNpZ25lZCBsb25nIGFwbW1vZGU7CisjZW5kaWYKKwlJRl9GRUFUVVJFX0hEUEFSTV9HRVRfSURFTlRJVFkoICAgICAgICBzbWFsbGludCBnZXRfSURlbnRpdHk7KQorCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRiggIHNtYWxsaW50IGdldHNldF9idXNzdGF0ZTspCisJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19EUklWRV9SRVNFVCggICAgc21hbGxpbnQgcGVyZm9ybV9yZXNldDspCisJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19UUklTVEFURV9IV0lGKCAgc21hbGxpbnQgcGVyZm9ybV90cmlzdGF0ZTspCisJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19VTlJFR0lTVEVSX0hXSUYoc21hbGxpbnQgdW5yZWdpc3Rlcl9od2lmOykKKwlJRl9GRUFUVVJFX0hEUEFSTV9IRElPX1NDQU5fSFdJRiggICAgICBzbWFsbGludCBzY2FuX2h3aWY7KQorCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRiggIHVuc2lnbmVkIGxvbmcgYnVzc3RhdGU7KQorCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRiggIHVuc2lnbmVkIGxvbmcgdHJpc3RhdGU7KQorCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fVU5SRUdJU1RFUl9IV0lGKHVuc2lnbmVkIGxvbmcgaHdpZjspCisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fU0NBTl9IV0lGCisJdW5zaWduZWQgbG9uZyBod2lmX2RhdGE7CisJdW5zaWduZWQgbG9uZyBod2lmX2N0cmw7CisJdW5zaWduZWQgbG9uZyBod2lmX2lycTsKKyNlbmRpZgorI2lmZGVmIERPX0ZMVVNIQ0FDSEUKKwl1bnNpZ25lZCBjaGFyIGZsdXNoY2FjaGVbNF0gPSB7IFdJTl9GTFVTSENBQ0hFLCAwLCAwLCAwIH07CisjZW5kaWYKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCitzdHJ1Y3QgQlVHX0dfdG9vX2JpZyB7CisJY2hhciBCVUdfR190b29fYmlnW3NpemVvZihHKSA8PSBDT01NT05fQlVGU0laRSA/IDEgOiAtMV07Cit9OworI2RlZmluZSBnZXRfaWRlbnRpdHkgICAgICAgKEcuZ2V0X2lkZW50aXR5ICAgICAgICAgICApCisjZGVmaW5lIGdldF9nZW9tICAgICAgICAgICAoRy5nZXRfZ2VvbSAgICAgICAgICAgICAgICkKKyNkZWZpbmUgZG9fZmx1c2ggICAgICAgICAgIChHLmRvX2ZsdXNoICAgICAgICAgICAgICAgKQorI2RlZmluZSBkb19jdGltaW5ncyAgICAgICAgKEcuZG9fY3RpbWluZ3MgICAgICAgICAgICApCisjZGVmaW5lIGRvX3RpbWluZ3MgICAgICAgICAoRy5kb190aW1pbmdzICAgICAgICAgICAgICkKKyNkZWZpbmUgcmVyZWFkX3BhcnRuICAgICAgIChHLnJlcmVhZF9wYXJ0biAgICAgICAgICAgKQorI2RlZmluZSBzZXRfcGlvbW9kZSAgICAgICAgKEcuc2V0X3Bpb21vZGUgICAgICAgICAgICApCisjZGVmaW5lIG5vaXN5X3Bpb21vZGUgICAgICAoRy5ub2lzeV9waW9tb2RlICAgICAgICAgICkKKyNkZWZpbmUgZ2V0c2V0X3JlYWRhaGVhZCAgIChHLmdldHNldF9yZWFkYWhlYWQgICAgICAgKQorI2RlZmluZSBnZXRzZXRfcmVhZG9ubHkgICAgKEcuZ2V0c2V0X3JlYWRvbmx5ICAgICAgICApCisjZGVmaW5lIGdldHNldF91bm1hc2sgICAgICAoRy5nZXRzZXRfdW5tYXNrICAgICAgICAgICkKKyNkZWZpbmUgZ2V0c2V0X211bHQgICAgICAgIChHLmdldHNldF9tdWx0ICAgICAgICAgICAgKQorI2RlZmluZSBnZXRzZXRfZG1hX3EgICAgICAgKEcuZ2V0c2V0X2RtYV9xICAgICAgICAgICApCisjZGVmaW5lIGdldHNldF9ub3dlcnIgICAgICAoRy5nZXRzZXRfbm93ZXJyICAgICAgICAgICkKKyNkZWZpbmUgZ2V0c2V0X2tlZXAgICAgICAgIChHLmdldHNldF9rZWVwICAgICAgICAgICAgKQorI2RlZmluZSBnZXRzZXRfaW8zMmJpdCAgICAgKEcuZ2V0c2V0X2lvMzJiaXQgICAgICAgICApCisjZGVmaW5lIHBpb21vZGUgICAgICAgICAgICAoRy5waW9tb2RlICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgWHJlYWRhaGVhZCAgICAgICAgIChHLlhyZWFkYWhlYWQgICAgICAgICAgICAgKQorI2RlZmluZSByZWFkb25seSAgICAgICAgICAgKEcucmVhZG9ubHkgICAgICAgICAgICAgICApCisjZGVmaW5lIHVubWFzayAgICAgICAgICAgICAoRy51bm1hc2sgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgbXVsdCAgICAgICAgICAgICAgIChHLm11bHQgICAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBkbWFfcSAgICAgICAgICAgICAgKEcuZG1hX3EgICAgICAgICAgICAgICAgICApCisjZGVmaW5lIG5vd2VyciAgICAgICAgICAgICAoRy5ub3dlcnIgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUga2VlcCAgICAgICAgICAgICAgIChHLmtlZXAgICAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBpbzMyYml0ICAgICAgICAgICAgKEcuaW8zMmJpdCAgICAgICAgICAgICAgICApCisjZGVmaW5lIGRtYSAgICAgICAgICAgICAgICAoRy5kbWEgICAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgZ2V0c2V0X2RtYSAgICAgICAgIChHLmdldHNldF9kbWEgICAgICAgICAgICAgKQorI2RlZmluZSBzZXRfeGZlcm1vZGUgICAgICAgKEcuc2V0X3hmZXJtb2RlICAgICAgICAgICApCisjZGVmaW5lIGdldF94ZmVybW9kZSAgICAgICAoRy5nZXRfeGZlcm1vZGUgICAgICAgICAgICkKKyNkZWZpbmUgZ2V0c2V0X2RrZWVwICAgICAgIChHLmdldHNldF9ka2VlcCAgICAgICAgICAgKQorI2RlZmluZSBnZXRzZXRfc3RhbmRieSAgICAgKEcuZ2V0c2V0X3N0YW5kYnkgICAgICAgICApCisjZGVmaW5lIGdldHNldF9sb29rYWhlYWQgICAoRy5nZXRzZXRfbG9va2FoZWFkICAgICAgICkKKyNkZWZpbmUgZ2V0c2V0X3ByZWZldGNoICAgIChHLmdldHNldF9wcmVmZXRjaCAgICAgICAgKQorI2RlZmluZSBnZXRzZXRfZGVmZWN0cyAgICAgKEcuZ2V0c2V0X2RlZmVjdHMgICAgICAgICApCisjZGVmaW5lIGdldHNldF93Y2FjaGUgICAgICAoRy5nZXRzZXRfd2NhY2hlICAgICAgICAgICkKKyNkZWZpbmUgZ2V0c2V0X2Rvb3Jsb2NrICAgIChHLmdldHNldF9kb29ybG9jayAgICAgICAgKQorI2RlZmluZSBzZXRfc2VhZ2F0ZSAgICAgICAgKEcuc2V0X3NlYWdhdGUgICAgICAgICAgICApCisjZGVmaW5lIHNldF9zdGFuZGJ5bm93ICAgICAoRy5zZXRfc3RhbmRieW5vdyAgICAgICAgICkKKyNkZWZpbmUgc2V0X3NsZWVwbm93ICAgICAgIChHLnNldF9zbGVlcG5vdyAgICAgICAgICAgKQorI2RlZmluZSBnZXRfcG93ZXJtb2RlICAgICAgKEcuZ2V0X3Bvd2VybW9kZSAgICAgICAgICApCisjZGVmaW5lIGdldHNldF9hcG1tb2RlICAgICAoRy5nZXRzZXRfYXBtbW9kZSAgICAgICAgICkKKyNkZWZpbmUgeGZlcm1vZGVfcmVxdWVzdGVkIChHLnhmZXJtb2RlX3JlcXVlc3RlZCAgICAgKQorI2RlZmluZSBka2VlcCAgICAgICAgICAgICAgKEcuZGtlZXAgICAgICAgICAgICAgICAgICApCisjZGVmaW5lIHN0YW5kYnlfcmVxdWVzdGVkICAoRy5zdGFuZGJ5X3JlcXVlc3RlZCAgICAgICkKKyNkZWZpbmUgbG9va2FoZWFkICAgICAgICAgIChHLmxvb2thaGVhZCAgICAgICAgICAgICAgKQorI2RlZmluZSBwcmVmZXRjaCAgICAgICAgICAgKEcucHJlZmV0Y2ggICAgICAgICAgICAgICApCisjZGVmaW5lIGRlZmVjdHMgICAgICAgICAgICAoRy5kZWZlY3RzICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgd2NhY2hlICAgICAgICAgICAgIChHLndjYWNoZSAgICAgICAgICAgICAgICAgKQorI2RlZmluZSBkb29ybG9jayAgICAgICAgICAgKEcuZG9vcmxvY2sgICAgICAgICAgICAgICApCisjZGVmaW5lIGFwbW1vZGUgICAgICAgICAgICAoRy5hcG1tb2RlICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgZ2V0X0lEZW50aXR5ICAgICAgIChHLmdldF9JRGVudGl0eSAgICAgICAgICAgKQorI2RlZmluZSBnZXRzZXRfYnVzc3RhdGUgICAgKEcuZ2V0c2V0X2J1c3N0YXRlICAgICAgICApCisjZGVmaW5lIHBlcmZvcm1fcmVzZXQgICAgICAoRy5wZXJmb3JtX3Jlc2V0ICAgICAgICAgICkKKyNkZWZpbmUgcGVyZm9ybV90cmlzdGF0ZSAgIChHLnBlcmZvcm1fdHJpc3RhdGUgICAgICAgKQorI2RlZmluZSB1bnJlZ2lzdGVyX2h3aWYgICAgKEcudW5yZWdpc3Rlcl9od2lmICAgICAgICApCisjZGVmaW5lIHNjYW5faHdpZiAgICAgICAgICAoRy5zY2FuX2h3aWYgICAgICAgICAgICAgICkKKyNkZWZpbmUgYnVzc3RhdGUgICAgICAgICAgIChHLmJ1c3N0YXRlICAgICAgICAgICAgICAgKQorI2RlZmluZSB0cmlzdGF0ZSAgICAgICAgICAgKEcudHJpc3RhdGUgICAgICAgICAgICAgICApCisjZGVmaW5lIGh3aWYgICAgICAgICAgICAgICAoRy5od2lmICAgICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgaHdpZl9kYXRhICAgICAgICAgIChHLmh3aWZfZGF0YSAgICAgICAgICAgICAgKQorI2RlZmluZSBod2lmX2N0cmwgICAgICAgICAgKEcuaHdpZl9jdHJsICAgICAgICAgICAgICApCisjZGVmaW5lIGh3aWZfaXJxICAgICAgICAgICAoRy5od2lmX2lycSAgICAgICAgICAgICAgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyB9IHdoaWxlICgwKQorCisKKy8qIEJ1c3lib3ggbWVzc2FnZXMgYW5kIGZ1bmN0aW9ucyAqLworI2lmIEVOQUJMRV9JT0NUTF9IRVgyU1RSX0VSUk9SCitzdGF0aWMgaW50IGlvY3RsX2FsdF9mdW5jKC8qaW50IGZkLCovIGludCBjbWQsIHVuc2lnbmVkIGNoYXIgKmFyZ3MsIGludCBhbHQsIGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwlpZiAoIWlvY3RsKGZkLCBjbWQsIGFyZ3MpKQorCQlyZXR1cm4gMDsKKwlhcmdzWzBdID0gYWx0OworCXJldHVybiBiYl9pb2N0bF9vcl93YXJuKGZkLCBjbWQsIGFyZ3MsIHN0cmluZyk7Cit9CisjZGVmaW5lIGlvY3RsX2FsdF9vcl93YXJuKGNtZCxhcmdzLGFsdCkgaW9jdGxfYWx0X2Z1bmMoY21kLGFyZ3MsYWx0LCNjbWQpCisjZWxzZQorc3RhdGljIGludCBpb2N0bF9hbHRfZnVuYygvKmludCBmZCwqLyBpbnQgY21kLCB1bnNpZ25lZCBjaGFyICphcmdzLCBpbnQgYWx0KQoreworCWlmICghaW9jdGwoZmQsIGNtZCwgYXJncykpCisJCXJldHVybiAwOworCWFyZ3NbMF0gPSBhbHQ7CisJcmV0dXJuIGJiX2lvY3RsX29yX3dhcm4oZmQsIGNtZCwgYXJncyk7Cit9CisjZGVmaW5lIGlvY3RsX2FsdF9vcl93YXJuKGNtZCxhcmdzLGFsdCkgaW9jdGxfYWx0X2Z1bmMoY21kLGFyZ3MsYWx0KQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIG9uX29mZihpbnQgdmFsdWUpCit7CisJcHV0cyh2YWx1ZSA/ICIgKG9uKSIgOiAiIChvZmYpIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2ZsYWdfb25fb2ZmKGludCBnZXRfYXJnLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlpZiAoZ2V0X2FyZykgeworCQlwcmludGYoIiBzZXR0aW5nICVzIHRvICVsdSIsIHMsIGFyZyk7CisJCW9uX29mZihhcmcpOworCX0KK30KKworc3RhdGljIHZvaWQgcHJpbnRfdmFsdWVfb25fb2ZmKGNvbnN0IGNoYXIgKnN0ciwgdW5zaWduZWQgbG9uZyBhcmdwKQoreworCXByaW50ZigiICVzXHQ9ICUybHUiLCBzdHIsIGFyZ3ApOworCW9uX29mZihhcmdwICE9IDApOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0dFVF9JREVOVElUWQorc3RhdGljIHZvaWQgcHJpbnRfYXNjaWkoY29uc3QgY2hhciAqcCwgaW50IGxlbmd0aCkKK3sKKyNpZiBCQl9CSUdfRU5ESUFOCisjZGVmaW5lIExFX09OTFkoeCkKKwllbnVtIHsgb2ZzID0gMCB9OworI2Vsc2UKKyNkZWZpbmUgTEVfT05MWSh4KSB4CisJLyogZXZlcnkgMTZiaXQgd29yZCBpcyBiaWctZW5kaWFuIChpLmUuIGludmVydGVkKSAqLworCS8qIGFjY2Vzc2luZyBieXRlcyBpbiAxLDAsIDMsMiwgNSw0Li4uIHNlcXVlbmNlICovCisJaW50IG9mcyA9IDE7CisjZW5kaWYKKworCWxlbmd0aCAqPSAyOworCS8qIGZpbmQgZmlyc3Qgbm9uLXNwYWNlICYgcHJpbnQgaXQgKi8KKwl3aGlsZSAobGVuZ3RoICYmIHBbb2ZzXSAhPSAnICcpIHsKKwkJcCsrOworCQlMRV9PTkxZKG9mcyA9IC1vZnM7KQorCQlsZW5ndGgtLTsKKwl9CisJd2hpbGUgKGxlbmd0aCAmJiBwW29mc10pIHsKKwkJYmJfcHV0Y2hhcihwW29mc10pOworCQlwKys7CisJCUxFX09OTFkob2ZzID0gLW9mczspCisJCWxlbmd0aC0tOworCX0KKwliYl9wdXRjaGFyKCdcbicpOworI3VuZGVmIExFX09OTFkKK30KKworc3RhdGljIHZvaWQgeHByaW50X2FzY2lpKHVpbnQxNl90ICp2YWwsIGludCBpLCBjb25zdCBjaGFyICpzdHJpbmcsIGludCBuKQoreworCWlmICh2YWxbaV0pIHsKKwkJcHJpbnRmKCJcdCUtMjBzIiwgc3RyaW5nKTsKKwkJcHJpbnRfYXNjaWkoKHZvaWQqKSZ2YWxbaV0sIG4pOworCX0KK30KKworc3RhdGljIHVpbnQ4X3QgbW9kZV9sb29wKHVpbnQxNl90IG1vZGVfc3VwLCB1aW50MTZfdCBtb2RlX3NlbCwgaW50IGNjLCB1aW50OF90ICpoYXZlX21vZGUpCit7CisJdWludDE2X3QgaWk7CisJdWludDhfdCBlcnJfZG1hID0gMDsKKworCWZvciAoaWkgPSAwOyBpaSA8PSBNT0RFX01BWDsgaWkrKykgeworCQlpZiAobW9kZV9zZWwgJiAweDAwMDEpIHsKKwkJCXByaW50ZigiKiVjZG1hJXUgIiwgY2MsIGlpKTsKKwkJCWlmICgqaGF2ZV9tb2RlKQorCQkJCWVycl9kbWEgPSAxOworCQkJKmhhdmVfbW9kZSA9IDE7CisJCX0gZWxzZSBpZiAobW9kZV9zdXAgJiAweDAwMDEpCisJCQlwcmludGYoIiVjZG1hJXUgIiwgY2MsIGlpKTsKKworCQltb2RlX3N1cCA+Pj0gMTsKKwkJbW9kZV9zZWwgPj49IDE7CisJfQorCXJldHVybiBlcnJfZG1hOworfQorCitzdGF0aWMgY29uc3QgY2hhciBwa3Rfc3RyW10gQUxJR04xID0KKwkiRGlyZWN0LWFjY2VzcyBkZXZpY2UiICJcMCIgICAgICAgICAgICAgLyogd29yZCAwLCBiaXRzIDEyLTggPSAwMCAqLworCSJTZXF1ZW50aWFsLWFjY2VzcyBkZXZpY2UiICJcMCIgICAgICAgICAvKiB3b3JkIDAsIGJpdHMgMTItOCA9IDAxICovCisJIlByaW50ZXIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgMCwgYml0cyAxMi04ID0gMDIgKi8KKwkiUHJvY2Vzc29yIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCAwLCBiaXRzIDEyLTggPSAwMyAqLworCSJXcml0ZS1vbmNlIGRldmljZSIgIlwwIiAgICAgICAgICAgICAgICAvKiB3b3JkIDAsIGJpdHMgMTItOCA9IDA0ICovCisJIkNELVJPTSIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgMCwgYml0cyAxMi04ID0gMDUgKi8KKwkiU2Nhbm5lciIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCAwLCBiaXRzIDEyLTggPSAwNiAqLworCSJPcHRpY2FsIG1lbW9yeSIgIlwwIiAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDAsIGJpdHMgMTItOCA9IDA3ICovCisJIk1lZGl1bSBjaGFuZ2VyIiAiXDAiICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgMCwgYml0cyAxMi04ID0gMDggKi8KKwkiQ29tbXVuaWNhdGlvbnMgZGV2aWNlIiAiXDAiICAgICAgICAgICAgLyogd29yZCAwLCBiaXRzIDEyLTggPSAwOSAqLworCSJBQ1MtSVQ4IGRldmljZSIgIlwwIiAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDAsIGJpdHMgMTItOCA9IDBhICovCisJIkFDUy1JVDggZGV2aWNlIiAiXDAiICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgMCwgYml0cyAxMi04ID0gMGIgKi8KKwkiQXJyYXkgY29udHJvbGxlciIgIlwwIiAgICAgICAgICAgICAgICAgLyogd29yZCAwLCBiaXRzIDEyLTggPSAwYyAqLworCSJFbmNsb3N1cmUgc2VydmljZXMiICJcMCIgICAgICAgICAgICAgICAvKiB3b3JkIDAsIGJpdHMgMTItOCA9IDBkICovCisJIlJlZHVjZWQgYmxvY2sgY29tbWFuZCBkZXZpY2UiICJcMCIgICAgIC8qIHdvcmQgMCwgYml0cyAxMi04ID0gMGUgKi8KKwkiT3B0aWNhbCBjYXJkIHJlYWRlci93cml0ZXIiICJcMCIgICAgICAgLyogd29yZCAwLCBiaXRzIDEyLTggPSAwZiAqLworOworCitzdGF0aWMgY29uc3QgY2hhciBhdGExX2NmZ19zdHJbXSBBTElHTjEgPSAgICAgICAvKiB3b3JkIDAgaW4gQVRBLTEgbW9kZSAqLworCSJyZXNlcnZlZCIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXQgMCAqLworCSJoYXJkIHNlY3RvcmVkIiAiXDAiICAgICAgICAgICAgICAgICAgICAvKiBiaXQgMSAqLworCSJzb2Z0IHNlY3RvcmVkIiAiXDAiICAgICAgICAgICAgICAgICAgICAvKiBiaXQgMiAqLworCSJub3QgTUZNIGVuY29kZWQgIiAiXDAiICAgICAgICAgICAgICAgICAvKiBiaXQgMyAqLworCSJoZWFkIHN3aXRjaCB0aW1lID4gMTV1cyIgIlwwIiAgICAgICAgICAvKiBiaXQgNCAqLworCSJzcGluZGxlIG1vdG9yIGNvbnRyb2wgb3B0aW9uIiAiXDAiICAgICAvKiBiaXQgNSAqLworCSJmaXhlZCBkcml2ZSIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAvKiBiaXQgNiAqLworCSJyZW1vdmFibGUgZHJpdmUiICJcMCIgICAgICAgICAgICAgICAgICAvKiBiaXQgNyAqLworCSJkaXNrIHhmZXIgcmF0ZSA8PSA1TWJzIiAiXDAiICAgICAgICAgICAvKiBiaXQgOCAqLworCSJkaXNrIHhmZXIgcmF0ZSA+IDVNYnMsIDw9IDEwTWJzIiAiXDAiICAvKiBiaXQgOSAqLworCSJkaXNrIHhmZXIgcmF0ZSA+IDVNYnMiICJcMCIgICAgICAgICAgICAvKiBiaXQgMTAgKi8KKwkicm90YXRpb25hbCBzcGVlZCB0b2wuIiAiXDAiICAgICAgICAgICAgLyogYml0IDExICovCisJImRhdGEgc3Ryb2JlIG9mZnNldCBvcHRpb24iICJcMCIgICAgICAgIC8qIGJpdCAxMiAqLworCSJ0cmFjayBvZmZzZXQgb3B0aW9uIiAiXDAiICAgICAgICAgICAgICAvKiBiaXQgMTMgKi8KKwkiZm9ybWF0IHNwZWVkIHRvbGVyYW5jZSBnYXAgcmVxZCIgIlwwIiAgLyogYml0IDE0ICovCisJIkFUQVBJIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGJpdCAxNCAqLworOworCitzdGF0aWMgY29uc3QgY2hhciBtaW5vcl9zdHJbXSBBTElHTjEgPQorCS8qIHdvcmQgODEgdmFsdWU6ICovCisJIlVuc3BlY2lmaWVkIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAwMCAqLworCSJBVEEtMSBYM1Q5LjIgNzgxRCBwcmlvciB0byByZXYuNCIgIlwwIiAgICAgICAgICAgICAvKiAweDAwMDEgKi8KKwkiQVRBLTEgcHVibGlzaGVkLCBBTlNJIFgzLjIyMS0xOTk0IiAiXDAiICAgICAgICAgICAgLyogMHgwMDAyICovCisJIkFUQS0xIFgzVDkuMiA3ODFEIHJldi40IiAiXDAiICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAwMyAqLworCSJBVEEtMiBwdWJsaXNoZWQsIEFOU0kgWDMuMjc5LTE5OTYiICJcMCIgICAgICAgICAgICAvKiAweDAwMDQgKi8KKwkiQVRBLTIgWDNUMTAgOTQ4RCBwcmlvciB0byByZXYuMmsiICJcMCIgICAgICAgICAgICAgLyogMHgwMDA1ICovCisJIkFUQS0zIFgzVDEwIDIwMDhEIHJldi4xIiAiXDAiICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAwNiAqLworCSJBVEEtMiBYM1QxMCA5NDhEIHJldi4yayIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAvKiAweDAwMDcgKi8KKwkiQVRBLTMgWDNUMTAgMjAwOEQgcmV2LjAiICJcMCIgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMDA4ICovCisJIkFUQS0yIFgzVDEwIDk0OEQgcmV2LjMiICJcMCIgICAgICAgICAgICAgICAgICAgICAgIC8qIDB4MDAwOSAqLworCSJBVEEtMyBwdWJsaXNoZWQsIEFOU0kgWDMuMjk4LTE5OXgiICJcMCIgICAgICAgICAgICAvKiAweDAwMGEgKi8KKwkiQVRBLTMgWDNUMTAgMjAwOEQgcmV2LjYiICJcMCIgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMDBiICovCisJIkFUQS0zIFgzVDEzIDIwMDhEIHJldi43IGFuZCA3YSIgIlwwIiAgICAgICAgICAgICAgIC8qIDB4MDAwYyAqLworCSJBVEEvQVRBUEktNCBYM1QxMyAxMTUzRCByZXYuNiIgIlwwIiAgICAgICAgICAgICAgICAvKiAweDAwMGQgKi8KKwkiQVRBL0FUQVBJLTQgVDEzIDExNTNEIHJldi4xMyIgIlwwIiAgICAgICAgICAgICAgICAgLyogMHgwMDBlICovCisJIkFUQS9BVEFQSS00IFgzVDEzIDExNTNEIHJldi43IiAiXDAiICAgICAgICAgICAgICAgIC8qIDB4MDAwZiAqLworCSJBVEEvQVRBUEktNCBUMTMgMTE1M0QgcmV2LjE4IiAiXDAiICAgICAgICAgICAgICAgICAvKiAweDAwMTAgKi8KKwkiQVRBL0FUQVBJLTQgVDEzIDExNTNEIHJldi4xNSIgIlwwIiAgICAgICAgICAgICAgICAgLyogMHgwMDExICovCisJIkFUQS9BVEFQSS00IHB1Ymxpc2hlZCwgQU5TSSBJTkNJVFMgMzE3LTE5OTgiICJcMCIgIC8qIDB4MDAxMiAqLworCSJBVEEvQVRBUEktNSBUMTMgMTMyMUQgcmV2LjMiICJcMCIgICAgICAgICAgICAgICAgICAvKiAweDAwMTMgKi8KKwkiQVRBL0FUQVBJLTQgVDEzIDExNTNEIHJldi4xNCIgIlwwIiAgICAgICAgICAgICAgICAgLyogMHgwMDE0ICovCisJIkFUQS9BVEFQSS01IFQxMyAxMzIxRCByZXYuMSIgIlwwIiAgICAgICAgICAgICAgICAgIC8qIDB4MDAxNSAqLworCSJBVEEvQVRBUEktNSBwdWJsaXNoZWQsIEFOU0kgSU5DSVRTIDM0MC0yMDAwIiAiXDAiICAvKiAweDAwMTYgKi8KKwkiQVRBL0FUQVBJLTQgVDEzIDExNTNEIHJldi4xNyIgIlwwIiAgICAgICAgICAgICAgICAgLyogMHgwMDE3ICovCisJIkFUQS9BVEFQSS02IFQxMyAxNDEwRCByZXYuMCIgIlwwIiAgICAgICAgICAgICAgICAgIC8qIDB4MDAxOCAqLworCSJBVEEvQVRBUEktNiBUMTMgMTQxMEQgcmV2LjNhIiAiXDAiICAgICAgICAgICAgICAgICAvKiAweDAwMTkgKi8KKwkiQVRBL0FUQVBJLTcgVDEzIDE1MzJEIHJldi4xIiAiXDAiICAgICAgICAgICAgICAgICAgLyogMHgwMDFhICovCisJIkFUQS9BVEFQSS02IFQxMyAxNDEwRCByZXYuMiIgIlwwIiAgICAgICAgICAgICAgICAgIC8qIDB4MDAxYiAqLworCSJBVEEvQVRBUEktNiBUMTMgMTQxMEQgcmV2LjEiICJcMCIgICAgICAgICAgICAgICAgICAvKiAweDAwMWMgKi8KKwkiQVRBL0FUQVBJLTcgcHVibGlzaGVkLCBBTlNJIElOQ0lUUyAzOTctMjAwNSIgIlwwIiAgLyogMHgwMDFkICovCisJIkFUQS9BVEFQSS03IFQxMyAxNTMyRCByZXYuMCIgIlwwIiAgICAgICAgICAgICAgICAgIC8qIDB4MDAxZSAqLworCSJyZXNlcnZlZCIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAweDAwMWYgKi8KKwkicmVzZXJ2ZWQiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMDIwICovCisJIkFUQS9BVEFQSS03IFQxMyAxNTMyRCByZXYuNGEiICJcMCIgICAgICAgICAgICAgICAgIC8qIDB4MDAyMSAqLworCSJBVEEvQVRBUEktNiBwdWJsaXNoZWQsIEFOU0kgSU5DSVRTIDM2MS0yMDAyIiAiXDAiICAvKiAweDAwMjIgKi8KKwkicmVzZXJ2ZWQiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMHgwMDIzLTB4ZmZmZSAqLworOworc3RhdGljIGNvbnN0IGNoYXIgYWN0dWFsX3ZlcltNSU5PUl9NQVggKyAyXSBBTElHTjEgPSB7CisJICAgLyogd29yZCA4MSB2YWx1ZTogKi8KKwkwLCAvKiAweDAwMDAgV0FSTklORzogYWN0dWFsX3ZlcltdIGFycmF5ICovCisJMSwgLyogMHgwMDAxIFdBUk5JTkc6IGNvcnJlc3BvbmRzICAgICAgICAqLworCTEsIC8qIDB4MDAwMiBXQVJOSU5HOiAqZXhhY3RseSogICAgICAgICAgKi8KKwkxLCAvKiAweDAwMDMgV0FSTklORzogdG8gdGhlIEFUQS8gICAgICAgICovCisJMiwgLyogMHgwMDA0IFdBUk5JTkc6IEFUQVBJIHZlcnNpb24gICAgICAqLworCTIsIC8qIDB4MDAwNSBXQVJOSU5HOiBsaXN0ZWQgaW4gICAgICAgICAgKi8KKwkzLCAvKiAweDAwMDYgV0FSTklORzogdGhlICAgICAgICAgICAgICAgICovCisJMiwgLyogMHgwMDA3IFdBUk5JTkc6IG1pbm9yX3N0ciAgICAgICAgICAqLworCTMsIC8qIDB4MDAwOCBXQVJOSU5HOiBhcnJheSAgICAgICAgICAgICAgKi8KKwkyLCAvKiAweDAwMDkgV0FSTklORzogYWJvdmUuICAgICAgICAgICAgICovCisJMywgLyogMHgwMDBhIFdBUk5JTkc6ICAgICAgICAgICAgICAgICAgICAqLworCTMsIC8qIDB4MDAwYiBXQVJOSU5HOiBJZiB5b3UgY2hhbmdlICAgICAgKi8KKwkzLCAvKiAweDAwMGMgV0FSTklORzogdGhhdCBvbmUsICAgICAgICAgICovCisJNCwgLyogMHgwMDBkIFdBUk5JTkc6IGNoYW5nZSB0aGlzIG9uZSAgICAqLworCTQsIC8qIDB4MDAwZSBXQVJOSU5HOiB0b28hISEgICAgICAgICAgICAgKi8KKwk0LCAvKiAweDAwMGYgKi8KKwk0LCAvKiAweDAwMTAgKi8KKwk0LCAvKiAweDAwMTEgKi8KKwk0LCAvKiAweDAwMTIgKi8KKwk1LCAvKiAweDAwMTMgKi8KKwk0LCAvKiAweDAwMTQgKi8KKwk1LCAvKiAweDAwMTUgKi8KKwk1LCAvKiAweDAwMTYgKi8KKwk0LCAvKiAweDAwMTcgKi8KKwk2LCAvKiAweDAwMTggKi8KKwk2LCAvKiAweDAwMTkgKi8KKwk3LCAvKiAweDAwMWEgKi8KKwk2LCAvKiAweDAwMWIgKi8KKwk2LCAvKiAweDAwMWMgKi8KKwk3LCAvKiAweDAwMWQgKi8KKwk3LCAvKiAweDAwMWUgKi8KKwkwLCAvKiAweDAwMWYgKi8KKwkwLCAvKiAweDAwMjAgKi8KKwk3LCAvKiAweDAwMjEgKi8KKwk2LCAvKiAweDAwMjIgKi8KKwkwICAvKiAweDAwMjMtMHhmZmZlICovCit9OworCitzdGF0aWMgY29uc3QgY2hhciBjbWRfZmVhdF9zdHJbXSBBTElHTjEgPQorCSIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4MiBiaXQgMTU6IG9ic29sZXRlICAqLworCSJOT1AgY21kIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4MiBiaXQgMTQgKi8KKwkiUkVBRCBCVUZGRVIgY21kIiAiXDAiICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgODIgYml0IDEzICovCisJIldSSVRFIEJVRkZFUiBjbWQiICJcMCIgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDgyIGJpdCAxMiAqLworCSIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4MiBiaXQgMTE6IG9ic29sZXRlICAqLworCSJIb3N0IFByb3RlY3RlZCBBcmVhIGZlYXR1cmUgc2V0IiAiXDAiICAgICAgLyogd29yZCA4MiBiaXQgMTAgKi8KKwkiREVWSUNFIFJFU0VUIGNtZCIgIlwwIiAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgODIgYml0ICA5ICovCisJIlNFUlZJQ0UgaW50ZXJydXB0IiAiXDAiICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDgyIGJpdCAgOCAqLworCSJSZWxlYXNlIGludGVycnVwdCIgIlwwIiAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4MiBiaXQgIDcgKi8KKwkiTG9vay1haGVhZCIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgODIgYml0ICA2ICovCisJIldyaXRlIGNhY2hlIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDgyIGJpdCAgNSAqLworCSJQQUNLRVQgY29tbWFuZCBmZWF0dXJlIHNldCIgIlwwIiAgICAgICAgICAgLyogd29yZCA4MiBiaXQgIDQgKi8KKwkiUG93ZXIgTWFuYWdlbWVudCBmZWF0dXJlIHNldCIgIlwwIiAgICAgICAgIC8qIHdvcmQgODIgYml0ICAzICovCisJIlJlbW92YWJsZSBNZWRpYSBmZWF0dXJlIHNldCIgIlwwIiAgICAgICAgICAvKiB3b3JkIDgyIGJpdCAgMiAqLworCSJTZWN1cml0eSBNb2RlIGZlYXR1cmUgc2V0IiAiXDAiICAgICAgICAgICAgLyogd29yZCA4MiBiaXQgIDEgKi8KKwkiU01BUlQgZmVhdHVyZSBzZXQiICJcMCIgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgODIgYml0ICAwICovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLSAqLworCSIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4MyBiaXQgMTU6ICF2YWxpZCBiaXQgKi8KKwkiIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgODMgYml0IDE0OiAgdmFsaWQgYml0ICovCisJIkZMVVNIIENBQ0hFIEVYVCBjbWQiICJcMCIgICAgICAgICAgICAgICAgICAvKiB3b3JkIDgzIGJpdCAxMyAqLworCSJNYW5kYXRvcnkgRkxVU0ggQ0FDSEUgY21kICIgIlwwIiAgICAgICAgICAgLyogd29yZCA4MyBiaXQgMTIgKi8KKwkiRGV2aWNlIENvbmZpZ3VyYXRpb24gT3ZlcmxheSBmZWF0dXJlIHNldCAiICJcMCIKKwkiNDgtYml0IEFkZHJlc3MgZmVhdHVyZSBzZXQgIiAiXDAiICAgICAgICAgIC8qIHdvcmQgODMgYml0IDEwICovCisJIiIgIlwwIgorCSJTRVQgTUFYIHNlY3VyaXR5IGV4dGVuc2lvbiIgIlwwIiAgICAgICAgICAgLyogd29yZCA4MyBiaXQgIDggKi8KKwkiQWRkcmVzcyBPZmZzZXQgUmVzZXJ2ZWQgQXJlYSBCb290IiAiXDAiICAgIC8qIHdvcmQgODMgYml0ICA3ICovCisJIlNFVCBGRUFUVVJFUyBzdWJjb21tYW5kIHJlcXVpcmVkIHRvIHNwaW51cCBhZnRlciBwb3dlciB1cCIgIlwwIgorCSJQb3dlci1VcCBJbiBTdGFuZGJ5IGZlYXR1cmUgc2V0IiAiXDAiICAgICAgLyogd29yZCA4MyBiaXQgIDUgKi8KKwkiUmVtb3ZhYmxlIE1lZGlhIFN0YXR1cyBOb3RpZmljYXRpb24gZmVhdHVyZSBzZXQiICJcMCIKKwkiQWR2LiBQb3dlciBNYW5hZ2VtZW50IGZlYXR1cmUgc2V0IiAiXDAiICAgIC8qIHdvcmQgODMgYml0ICAzICovCisJIkNGQSBmZWF0dXJlIHNldCIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDgzIGJpdCAgMiAqLworCSJSRUFEL1dSSVRFIERNQSBRVUVVRUQiICJcMCIgICAgICAgICAgICAgICAgLyogd29yZCA4MyBiaXQgIDEgKi8KKwkiRE9XTkxPQUQgTUlDUk9DT0RFIGNtZCIgIlwwIiAgICAgICAgICAgICAgIC8qIHdvcmQgODMgYml0ICAwICovCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLSAqLworCSIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4NCBiaXQgMTU6ICF2YWxpZCBiaXQgKi8KKwkiIiAiXDAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgODQgYml0IDE0OiAgdmFsaWQgYml0ICovCisJIiIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDg0IGJpdCAxMzogIHJlc2VydmVkICovCisJIiIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDg0IGJpdCAxMjogIHJlc2VydmVkICovCisJIiIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDg0IGJpdCAxMTogIHJlc2VydmVkICovCisJIiIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDg0IGJpdCAxMDogIHJlc2VydmVkICovCisJIiIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDg0IGJpdCAgOTogIHJlc2VydmVkICovCisJIiIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDg0IGJpdCAgODogIHJlc2VydmVkICovCisJIiIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDg0IGJpdCAgNzogIHJlc2VydmVkICovCisJIiIgIlwwIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDg0IGJpdCAgNjogIHJlc2VydmVkICovCisJIkdlbmVyYWwgUHVycG9zZSBMb2dnaW5nIGZlYXR1cmUgc2V0IiAiXDAiICAvKiB3b3JkIDg0IGJpdCAgNSAqLworCSIiICJcMCIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogd29yZCA4NCBiaXQgIDQ6ICByZXNlcnZlZCAqLworCSJNZWRpYSBDYXJkIFBhc3MgVGhyb3VnaCBDb21tYW5kIGZlYXR1cmUgc2V0ICIgIlwwIgorCSJNZWRpYSBzZXJpYWwgbnVtYmVyICIgIlwwIiAgICAgICAgICAgICAgICAgLyogd29yZCA4NCBiaXQgIDIgKi8KKwkiU01BUlQgc2VsZi10ZXN0ICIgIlwwIiAgICAgICAgICAgICAgICAgICAgIC8qIHdvcmQgODQgYml0ICAxICovCisJIlNNQVJUIGVycm9yIGxvZ2dpbmcgIiAgICAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDg0IGJpdCAgMCAqLworOworCitzdGF0aWMgY29uc3QgY2hhciBzZWN1X3N0cltdIEFMSUdOMSA9CisJInN1cHBvcnRlZCIgIlwwIiAgICAgICAgICAgICAgICAvKiB3b3JkIDEyOCwgYml0IDAgKi8KKwkiZW5hYmxlZCIgIlwwIiAgICAgICAgICAgICAgICAgIC8qIHdvcmQgMTI4LCBiaXQgMSAqLworCSJsb2NrZWQiICJcMCIgICAgICAgICAgICAgICAgICAgLyogd29yZCAxMjgsIGJpdCAyICovCisJImZyb3plbiIgIlwwIiAgICAgICAgICAgICAgICAgICAvKiB3b3JkIDEyOCwgYml0IDMgKi8KKwkiZXhwaXJlZDogc2VjdXJpdHkgY291bnQiICJcMCIgIC8qIHdvcmQgMTI4LCBiaXQgNCAqLworCSJzdXBwb3J0ZWQ6IGVuaGFuY2VkIGVyYXNlIiAgICAgLyogd29yZCAxMjgsIGJpdCA1ICovCis7CisKKy8vIFBhcnNlIDUxMiBieXRlIGRpc2sgaWRlbnRpZmljYXRpb24gYmxvY2sgYW5kIHByaW50IG11Y2ggY3JhcC4KK3N0YXRpYyB2b2lkIGlkZW50aWZ5KHVpbnQxNl90ICp2YWwpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgaWRlbnRpZnkodWludDE2X3QgKnZhbCkKK3sKKwl1aW50MTZfdCBpaSwgamosIGtrOworCXVpbnQxNl90IGxpa2Vfc3RkID0gMSwgc3RkID0gMCwgbWluX3N0ZCA9IDB4ZmZmZjsKKwl1aW50MTZfdCBkZXYgPSBOT19ERVYsIGVxcHQgPSBOT19ERVY7CisJdWludDhfdCAgaGF2ZV9tb2RlID0gMCwgZXJyX2RtYSA9IDA7CisJdWludDhfdCAgY2hrc3VtID0gMDsKKwl1aW50MzJfdCBsbCwgbW0sIG5uLCBvbzsKKwl1aW50NjRfdCBiYmJpZzsgLyogKDopICovCisJY29uc3QgY2hhciAqc3Rybmc7CisjaWYgQkJfQklHX0VORElBTgorCXVpbnQxNl90IGJ1ZlsyNTZdOworCisJLy8gQWRqdXN0IGZvciBlbmRpYW5uZXNzCisJc3dhYih2YWwsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCXZhbCA9IGJ1ZjsKKyNlbmRpZgorCS8qIGNoZWNrIGlmIHdlIHJlY29nbml6ZSB0aGUgZGV2aWNlIHR5cGUgKi8KKwliYl9wdXRjaGFyKCdcbicpOworCWlmICghKHZhbFtHRU5fQ09ORklHXSAmIE5PVF9BVEEpKSB7CisJCWRldiA9IEFUQV9ERVY7CisJCXByaW50ZigiQVRBIGRldmljZSwgd2l0aCAiKTsKKwl9IGVsc2UgaWYgKHZhbFtHRU5fQ09ORklHXT09Q0ZBX1NVUFBPUlRfVkFMKSB7CisJCWRldiA9IEFUQV9ERVY7CisJCWxpa2Vfc3RkID0gNDsKKwkJcHJpbnRmKCJDb21wYWN0Rmxhc2ggQVRBIGRldmljZSwgd2l0aCAiKTsKKwl9IGVsc2UgaWYgKCEodmFsW0dFTl9DT05GSUddICYgTk9UX0FUQVBJKSkgeworCQlkZXYgPSBBVEFQSV9ERVY7CisJCWVxcHQgPSAodmFsW0dFTl9DT05GSUddICYgRVFQVF9UWVBFKSA+PiBTSElGVF9FUVBUOworCQlwcmludGYoIkFUQVBJICVzLCB3aXRoICIsIGVxcHQgPD0gMHhmID8gbnRoX3N0cmluZyhwa3Rfc3RyLCBlcXB0KSA6ICJ1bmtub3duIik7CisJCWxpa2Vfc3RkID0gMzsKKwl9IGVsc2UKKwkJLyogIlVua25vd24gZGV2aWNlIHR5cGU6XG5cdGJpdHMgMTUmMTQgb2YgZ2VuZXJhbCBjb25maWd1cmF0aW9uIHdvcmQgMCBib3RoIHNldCB0byAxLlxuIiAqLworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biBkZXZpY2UgdHlwZSIpOworCisJcHJpbnRmKCIlc3JlbW92YWJsZSBtZWRpYVxuIiwgISh2YWxbR0VOX0NPTkZJR10gJiBNRURJQV9SRU1PVkFCTEUpID8gIm5vbi0iIDogIiIpOworCS8qIEluZm8gZnJvbSB0aGUgc3BlY2lmaWMgY29uZmlndXJhdGlvbiB3b3JkIHNheXMgd2hldGhlciBvciBub3QgdGhlCisJICogSUQgY29tbWFuZCBjb21wbGV0ZWQgY29ycmVjdGx5LiAgSXQgaXMgb25seSBkZWZpbmVkLCBob3dldmVyIGluCisJICogQVRBL0FUQVBJLTUgJiA2OyBpdCBpcyByZXNlcnZlZCAodmFsdWUgdGhlb3JldGljYWxseSAwKSBpbiBwcmlvcgorCSAqIHN0YW5kYXJkcy4gIFNpbmNlIHRoZSB2YWx1ZXMgYWxsb3dlZCBmb3IgdGhpcyB3b3JkIGFyZSBleHRyZW1lbHkKKwkgKiBzcGVjaWZpYywgaXQgc2hvdWxkIGJlIHNhZmUgdG8gY2hlY2sgaXQgbm93LCBldmVuIHRob3VnaCB3ZSBkb24ndAorCSAqIGtub3cgeWV0IHdoYXQgc3RhbmRhcmQgdGhpcyBkZXZpY2UgaXMgdXNpbmcuCisJICovCisJaWYgKCh2YWxbQ09ORklHXT09U1RCWV9OSURfVkFMKSB8fCAodmFsW0NPTkZJR109PVNUQllfSURfVkFMKQorCSB8fCAodmFsW0NPTkZJR109PVBXUkRfTklEX1ZBTCkgfHwgKHZhbFtDT05GSUddPT1QV1JEX0lEX1ZBTCkKKwkpIHsKKwkJbGlrZV9zdGQgPSA1OworCQlpZiAoKHZhbFtDT05GSUddPT1TVEJZX05JRF9WQUwpIHx8ICh2YWxbQ09ORklHXT09U1RCWV9JRF9WQUwpKQorCQkJcHV0cygicG93ZXJzLXVwIGluIHN0YW5kYnk7IFNFVCBGRUFUVVJFUyBzdWJjbWQgc3BpbnMtdXAuIik7CisJCWlmICgoKHZhbFtDT05GSUddPT1TVEJZX05JRF9WQUwpIHx8ICh2YWxbQ09ORklHXT09UFdSRF9OSURfVkFMKSkgJiYgKHZhbFtHRU5fQ09ORklHXSAmIElOQ09NUExFVEUpKQorCQkJcHV0cygiXG5cdFdBUk5JTkc6IElEIHJlc3BvbnNlIGluY29tcGxldGUuXG5cdEZvbGxvd2luZyBkYXRhIG1heSBiZSBpbmNvcnJlY3QuXG4iKTsKKwl9CisKKwkvKiBvdXRwdXQgdGhlIG1vZGVsIGFuZCBzZXJpYWwgbnVtYmVycyBhbmQgdGhlIGZ3IHJldmlzaW9uICovCisJeHByaW50X2FzY2lpKHZhbCwgU1RBUlRfTU9ERUwsICAiTW9kZWwgTnVtYmVyOiIsICAgICAgICBMRU5HVEhfTU9ERUwpOworCXhwcmludF9hc2NpaSh2YWwsIFNUQVJUX1NFUklBTCwgIlNlcmlhbCBOdW1iZXI6IiwgICAgICAgTEVOR1RIX1NFUklBTCk7CisJeHByaW50X2FzY2lpKHZhbCwgU1RBUlRfRldfUkVWLCAiRmlybXdhcmUgUmV2aXNpb246IiwgICBMRU5HVEhfRldfUkVWKTsKKwl4cHJpbnRfYXNjaWkodmFsLCBTVEFSVF9NRURJQSwgICJNZWRpYSBTZXJpYWwgTnVtOiIsICAgIExFTkdUSF9NRURJQSk7CisJeHByaW50X2FzY2lpKHZhbCwgU1RBUlRfTUFOVUYsICAiTWVkaWEgTWFudWZhY3R1cmVyOiIsICBMRU5HVEhfTUFOVUYpOworCisJLyogbWFqb3IgJiBtaW5vciBzdGFuZGFyZHMgdmVyc2lvbiBudW1iZXIgKE5vdGU6IHRoZXNlIHdvcmRzIHdlcmUgbm90CisJICogZGVmaW5lZCB1bnRpbCBBVEEtMyAmIHRoZSBDRFJPTSBzdGQgdXNlcyBkaWZmZXJlbnQgd29yZHMuKSAqLworCXByaW50ZigiU3RhbmRhcmRzOiIpOworCWlmIChlcXB0ICE9IENEUk9NKSB7CisJCWlmICh2YWxbTUlOT1JdICYmICh2YWxbTUlOT1JdIDw9IE1JTk9SX01BWCkpIHsKKwkJCWlmIChsaWtlX3N0ZCA8IDMpIGxpa2Vfc3RkID0gMzsKKwkJCXN0ZCA9IGFjdHVhbF92ZXJbdmFsW01JTk9SXV07CisJCQlpZiAoc3RkKQorCQkJCXByaW50ZigiXG5cdFVzZWQ6ICVzICIsIG50aF9zdHJpbmcobWlub3Jfc3RyLCB2YWxbTUlOT1JdKSk7CisJCX0KKwkJLyogbG9va3MgbGlrZSB3aGVuIHRoZXkgdXAtaXNzdWUgdGhlIHN0ZCwgdGhleSBvYnNvbGV0ZSBvbmU7CisJCSAqIHRodXMsIG9ubHkgdGhlIG5ld2VzdCA0IGlzc3VlcyBuZWVkIGJlIHN1cHBvcnRlZC4gKFRoYXQncworCQkgKiB3aGF0ICJrayIgYW5kICJtaW5fc3RkIiBhcmUgYWxsIGFib3V0LikgKi8KKwkJaWYgKHZhbFtNQUpPUl0gJiYgKHZhbFtNQUpPUl0gIT0gTk9WQUxfMSkpIHsKKwkJCXByaW50ZigiXG5cdFN1cHBvcnRlZDogIik7CisJCQlqaiA9IHZhbFtNQUpPUl0gPDwgMTsKKwkJCWtrID0gbGlrZV9zdGQgPjQgPyBsaWtlX3N0ZC00OiAwOworCQkJZm9yIChpaSA9IDE0OyAoaWkgPjApJiYoaWk+a2spOyBpaS0tKSB7CisJCQkJaWYgKGpqICYgMHg4MDAwKSB7CisJCQkJCXByaW50ZigiJXUgIiwgaWkpOworCQkJCQlpZiAobGlrZV9zdGQgPCBpaSkgeworCQkJCQkJbGlrZV9zdGQgPSBpaTsKKwkJCQkJCWtrID0gbGlrZV9zdGQgPjQgPyBsaWtlX3N0ZC00OiAwOworCQkJCQl9CisJCQkJCWlmIChtaW5fc3RkID4gaWkpIG1pbl9zdGQgPSBpaTsKKwkJCQl9CisJCQkJamogPDw9IDE7CisJCQl9CisJCQlpZiAobGlrZV9zdGQgPCAzKSBsaWtlX3N0ZCA9IDM7CisJCX0KKwkJLyogRmlndXJlIG91dCB3aGF0IHN0YW5kYXJkIHRoZSBkZXZpY2UgaXMgdXNpbmcgaWYgaXQgaGFzbid0IHRvbGQKKwkJICogdXMuICBJZiB3ZSBrbm93IHRoZSBzdGQsIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgdXNpbmcgYW55IG9mCisJCSAqIHRoZSB3b3JkcyBmcm9tIHRoZSBuZXh0IGxldmVsIHVwLiAgSXQgaGFwcGVucy4KKwkJICovCisJCWlmIChsaWtlX3N0ZCA8IHN0ZCkgbGlrZV9zdGQgPSBzdGQ7CisKKwkJaWYgKCgoc3RkID09IDUpIHx8ICghc3RkICYmIChsaWtlX3N0ZCA8IDYpKSkgJiYKKwkJCSgoKCh2YWxbQ01EU19TVVBQXzFdICYgVkFMSUQpID09IFZBTElEX1ZBTCkgJiYKKwkJCSgoCXZhbFtDTURTX1NVUFBfMV0gJiBDTURTX1c4MykgPiAweDAwZmYpKSB8fAorCQkJKCgoCXZhbFtDTURTX1NVUFBfMl0gJiBWQUxJRCkgPT0gVkFMSURfVkFMKSAmJgorCQkJKAl2YWxbQ01EU19TVVBQXzJdICYgQ01EU19XODQpICkgKQorCQkpIHsKKwkJCWxpa2Vfc3RkID0gNjsKKwkJfSBlbHNlIGlmICgoKHN0ZCA9PSA0KSB8fCAoIXN0ZCAmJiAobGlrZV9zdGQgPCA1KSkpICYmCisJCQkoKCgodmFsW0lOVEVHUklUWV0JJiBTSUcpID09IFNJR19WQUwpICYmICFjaGtzdW0pIHx8CisJCQkoKAl2YWxbSFdSU1RfUlNMVF0gJiBWQUxJRCkgPT0gVkFMSURfVkFMKSB8fAorCQkJKCgoCXZhbFtDTURTX1NVUFBfMV0gJiBWQUxJRCkgPT0gVkFMSURfVkFMKSAmJgorCQkJKCgJdmFsW0NNRFNfU1VQUF8xXSAmIENNRFNfVzgzKSA+IDB4MDAxZikpICkgKQorCQl7CisJCQlsaWtlX3N0ZCA9IDU7CisJCX0gZWxzZSBpZiAoKChzdGQgPT0gMykgfHwgKCFzdGQgJiYgKGxpa2Vfc3RkIDwgNCkpKSAmJgorCQkJCSgoKCh2YWxbQ01EU19TVVBQXzFdICYgVkFMSUQpID09IFZBTElEX1ZBTCkgJiYKKwkJCQkoKCgJdmFsW0NNRFNfU1VQUF8xXSAmIENNRFNfVzgzKSA+IDB4MDAwMCkgfHwKKwkJCQkoKAl2YWxbQ01EU19TVVBQXzBdICYgQ01EU19XODIpID4gMHgwMDBmKSkpIHx8CisJCQkJKCgJdmFsW0NBUEFCXzFdICYgVkFMSUQpID09IFZBTElEX1ZBTCkgfHwKKwkJCQkoKAl2YWxbV0hBVFNfVkFMSURdICYgT0tfVzg4KSAmJiB2YWxbVUxUUkFfRE1BXSkgfHwKKwkJCQkoKAl2YWxbUk1fU1RBVF0gJiBSTV9TVEFUX0JJVFMpID09IFJNX1NUQVRfU1VQKSApCisJCSkgeworCQkJbGlrZV9zdGQgPSA0OworCQl9IGVsc2UgaWYgKCgoc3RkID09IDIpIHx8ICghc3RkICYmIChsaWtlX3N0ZCA8IDMpKSkKKwkJICYmICgodmFsW0NNRFNfU1VQUF8xXSAmIFZBTElEKSA9PSBWQUxJRF9WQUwpCisJCSkgeworCQkJbGlrZV9zdGQgPSAzOworCQl9IGVsc2UgaWYgKCgoc3RkID09IDEpIHx8ICghc3RkICYmIChsaWtlX3N0ZCA8IDIpKSkgJiYKKwkJCQkoKHZhbFtDQVBBQl8wXSAmIChJT1JEWV9TVVAgfCBJT1JEWV9PRkYpKSB8fAorCQkJCSh2YWxbV0hBVFNfVkFMSURdICYgT0tfVzY0XzcwKSkgKQorCQl7CisJCQlsaWtlX3N0ZCA9IDI7CisJCX0KKworCQlpZiAoIXN0ZCkKKwkJCXByaW50ZigiXG5cdExpa2VseSB1c2VkOiAldVxuIiwgbGlrZV9zdGQpOworCQllbHNlIGlmIChsaWtlX3N0ZCA+IHN0ZCkKKwkJCXByaW50ZigiJiBzb21lIG9mICV1XG4iLCBsaWtlX3N0ZCk7CisJCWVsc2UKKwkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfSBlbHNlIHsKKwkJLyogVEJEOiBkbyBDRFJPTSBzdHVmZiBtb3JlIHRob3JvdWdobHkuICBGb3Igbm93Li4uICovCisJCWtrID0gMDsKKwkJaWYgKHZhbFtDRFJfTUlOT1JdID09IDkpIHsKKwkJCWtrID0gMTsKKwkJCXByaW50ZigiXG5cdFVzZWQ6IEFUQVBJIGZvciBDRC1ST01zLCBTRkYtODAyMGksIHIyLjUiKTsKKwkJfQorCQlpZiAodmFsW0NEUl9NQUpPUl0gJiYgKHZhbFtDRFJfTUFKT1JdICE9Tk9WQUxfMSkpIHsKKwkJCWtrID0gMTsKKwkJCXByaW50ZigiXG5cdFN1cHBvcnRlZDogQ0QtUk9NIEFUQVBJIik7CisJCQlqaiA9IHZhbFtDRFJfTUFKT1JdID4+IDE7CisJCQlmb3IgKGlpID0gMTsgaWkgPCAxNTsgaWkrKykgeworCQkJCWlmIChqaiAmIDB4MDAwMSkgcHJpbnRmKCItJXUgIiwgaWkpOworCQkJCWpqID4+PSAxOworCQkJfQorCQl9CisJCXB1dHMoa2sgPyAiIiA6ICJcblx0TGlrZWx5IHVzZWQgQ0QtUk9NIEFUQVBJLTEiKTsKKwkJLyogdGhlIGNkcm9tIHN0dWZmIGlzIG1vcmUgbGlrZSBBVEEtMiB0aGFuIGFueXRoaW5nIGVsc2UsIHNvOiAqLworCQlsaWtlX3N0ZCA9IDI7CisJfQorCisJaWYgKG1pbl9zdGQgPT0gMHhmZmZmKQorCQltaW5fc3RkID0gbGlrZV9zdGQgPiA0ID8gbGlrZV9zdGQgLSAzIDogMTsKKworCXB1dHMoIkNvbmZpZ3VyYXRpb246Iik7CisJLyogbW9yZSBpbmZvIGZyb20gdGhlIGdlbmVyYWwgY29uZmlndXJhdGlvbiB3b3JkICovCisJaWYgKChlcXB0ICE9IENEUk9NKSAmJiAobGlrZV9zdGQgPT0gMSkpIHsKKwkJamogPSB2YWxbR0VOX0NPTkZJR10gPj4gMTsKKwkJZm9yIChpaSA9IDE7IGlpIDwgMTU7IGlpKyspIHsKKwkJCWlmIChqaiAmIDB4MDAwMSkKKwkJCQlwcmludGYoIlx0JXNcbiIsIG50aF9zdHJpbmcoYXRhMV9jZmdfc3RyLCBpaSkpOworCQkJamogPj49MTsKKwkJfQorCX0KKwlpZiAoZGV2ID09IEFUQVBJX0RFVikgeworCQlpZiAoKHZhbFtHRU5fQ09ORklHXSAmIERSUV9SRVNQT05TRV9USU1FKSA9PSAgRFJRXzNNU19WQUwpCisJCQlzdHJuZyA9ICIzbXMiOworCQllbHNlIGlmICgodmFsW0dFTl9DT05GSUddICYgRFJRX1JFU1BPTlNFX1RJTUUpID09ICBEUlFfSU5UUl9WQUwpCisJCQlzdHJuZyA9ICI8PTEwbXMgd2l0aCBJTlRSUSI7CisJCWVsc2UgaWYgKCh2YWxbR0VOX0NPTkZJR10gJiBEUlFfUkVTUE9OU0VfVElNRSkgPT0gIERSUV81MFVTX1ZBTCkKKwkJCXN0cm5nID0iNTB1cyI7CisJCWVsc2UKKwkJCXN0cm5nID0gInVua25vd24iOworCQlwcmludGYoIlx0RFJRIHJlc3BvbnNlOiAlc1xuXHRQYWNrZXQgc2l6ZTogIiwgc3RybmcpOyAvKiBEYXRhIFJlcXVlc3QgKERSUSkgKi8KKworCQlpZiAoKHZhbFtHRU5fQ09ORklHXSAmIFBLVF9TSVpFX1NVUFBPUlRFRCkgPT0gUEtUX1NJWkVfMTJfVkFMKQorCQkJc3RybmcgPSAiMTIgYnl0ZXMiOworCQllbHNlIGlmICgodmFsW0dFTl9DT05GSUddICYgUEtUX1NJWkVfU1VQUE9SVEVEKSA9PSBQS1RfU0laRV8xNl9WQUwpCisJCQlzdHJuZyA9ICIxNiBieXRlcyI7CisJCWVsc2UKKwkJCXN0cm5nID0gInVua25vd24iOworCQlwdXRzKHN0cm5nKTsKKwl9IGVsc2UgeworCQkvKiBhZGRyZXNzaW5nLi4uQ0hTPyBTZWUgc2VjdGlvbiA2LjIgb2YgQVRBIHNwZWNzIDQgb3IgNSAqLworCQlsbCA9ICh1aW50MzJfdCl2YWxbTEJBX1NFQ1RTX01TQl0gPDwgMTYgfCB2YWxbTEJBX1NFQ1RTX0xTQl07CisJCW1tID0gMDsKKwkJYmJiaWcgPSAwOworCQlpZiAoKGxsID4gMHgwMEZCRkMxMCkgJiYgKCF2YWxbTENZTFNdKSkKKwkJCXB1dHMoIlx0Q0hTIGFkZHJlc3Npbmcgbm90IHN1cHBvcnRlZCIpOworCQllbHNlIHsKKwkJCWpqID0gdmFsW1dIQVRTX1ZBTElEXSAmIE9LX1c1NF81ODsKKwkJCXByaW50ZigiXHRMb2dpY2FsXHRcdG1heFx0Y3VycmVudFxuIgorCQkJCSJcdGN5bGluZGVyc1x0JXVcdCV1XG4iCisJCQkJIlx0aGVhZHNcdFx0JXVcdCV1XG4iCisJCQkJIlx0c2VjdG9ycy90cmFja1x0JXVcdCV1XG4iCisJCQkJIlx0LS1cbiIsCisJCQkJdmFsW0xDWUxTXSwKKwkJCQlqaiA/IHZhbFtMQ1lMU19DVVJdIDogMCwKKwkJCQl2YWxbTEhFQURTXSwKKwkJCQlqaiA/IHZhbFtMSEVBRFNfQ1VSXSA6IDAsCisJCQkJdmFsW0xTRUNUU10sCisJCQkJamogPyB2YWxbTFNFQ1RTX0NVUl0gOiAwKTsKKworCQkJaWYgKChtaW5fc3RkID09IDEpICYmICh2YWxbVFJBQ0tfQllURVNdIHx8IHZhbFtTRUNUX0JZVEVTXSkpCisJCQkJcHJpbnRmKCJcdGJ5dGVzL3RyYWNrOiAldVx0Ynl0ZXMvc2VjdG9yOiAldVxuIiwKKwkJCQkJdmFsW1RSQUNLX0JZVEVTXSwgdmFsW1NFQ1RfQllURVNdKTsKKworCQkJaWYgKGpqKSB7CisJCQkJbW0gPSAodWludDMyX3QpdmFsW0NBUEFDSVRZX01TQl0gPDwgMTYgfCB2YWxbQ0FQQUNJVFlfTFNCXTsKKwkJCQlpZiAobGlrZV9zdGQgPCAzKSB7CisJCQkJCS8qIGNoZWNrIEVuZGlhbiBvZiBjYXBhY2l0eSBieXRlcyAqLworCQkJCQlubiA9IHZhbFtMQ1lMU19DVVJdICogdmFsW0xIRUFEU19DVVJdICogdmFsW0xTRUNUU19DVVJdOworCQkJCQlvbyA9ICh1aW50MzJfdCl2YWxbQ0FQQUNJVFlfTFNCXSA8PCAxNiB8IHZhbFtDQVBBQ0lUWV9NU0JdOworCQkJCQlpZiAoYWJzKG1tIC0gbm4pID4gYWJzKG9vIC0gbm4pKQorCQkJCQkJbW0gPSBvbzsKKwkJCQl9CisJCQkJcHJpbnRmKCJcdENIUyBjdXJyZW50IGFkZHJlc3NhYmxlIHNlY3RvcnM6JTExdVxuIiwgbW0pOworCQkJfQorCQl9CisJCS8qIExCQSBhZGRyZXNzaW5nICovCisJCXByaW50ZigiXHRMQkEgICAgdXNlciBhZGRyZXNzYWJsZSBzZWN0b3JzOiUxMXVcbiIsIGxsKTsKKwkJaWYgKCgodmFsW0NNRFNfU1VQUF8xXSAmIFZBTElEKSA9PSBWQUxJRF9WQUwpCisJCSAmJiAodmFsW0NNRFNfU1VQUF8xXSAmIFNVUFBPUlRfNDhfQklUKQorCQkpIHsKKwkJCWJiYmlnID0gKHVpbnQ2NF90KXZhbFtMQkFfNjRfTVNCXSA8PCA0OCB8CisJCQkgICAgICAgICh1aW50NjRfdCl2YWxbTEJBXzQ4X01TQl0gPDwgMzIgfAorCQkJICAgICAgICAodWludDY0X3QpdmFsW0xCQV9NSURdIDw8IDE2IHwKKwkJCQkJdmFsW0xCQV9MU0JdOworCQkJcHJpbnRmKCJcdExCQTQ4ICB1c2VyIGFkZHJlc3NhYmxlIHNlY3RvcnM6JTExIlBSSXU2NCJcbiIsIGJiYmlnKTsKKwkJfQorCisJCWlmICghYmJiaWcpCisJCQliYmJpZyA9ICh1aW50NjRfdCkobGw+bW0gPyBsbCA6IG1tKTsgLyogIyA1MTIgYnl0ZSBibG9ja3MgKi8KKwkJcHJpbnRmKCJcdGRldmljZSBzaXplIHdpdGggTSA9IDEwMjQqMTAyNDogJTExIlBSSXU2NCIgTUJ5dGVzXG4iLCBiYmJpZz4+MTEpOworCQliYmJpZyA9IChiYmJpZyA8PCA5KSAvIDEwMDAwMDA7CisJCXByaW50ZigiXHRkZXZpY2Ugc2l6ZSB3aXRoIE0gPSAxMDAwKjEwMDA6ICUxMSJQUkl1NjQiIE1CeXRlcyAiLCBiYmJpZyk7CisKKwkJaWYgKGJiYmlnID4gMTAwMCkKKwkJCXByaW50ZigiKCUiUFJJdTY0IiBHQilcbiIsIGJiYmlnLzEwMDApOworCQllbHNlCisJCQliYl9wdXRjaGFyKCdcbicpOworCX0KKworCS8qIGh3IHN1cHBvcnQgb2YgY29tbWFuZHMgKGNhcGFiaWxpdGllcykgKi8KKwlwcmludGYoIkNhcGFiaWxpdGllczpcblx0Iik7CisKKwlpZiAoZGV2ID09IEFUQVBJX0RFVikgeworCQlpZiAoZXFwdCAhPSBDRFJPTSAmJiAodmFsW0NBUEFCXzBdICYgQ01EX1FfU1VQKSkKKwkJCXByaW50ZigiQ21kIHF1ZXVpbmcsICIpOworCQlpZiAodmFsW0NBUEFCXzBdICYgT1ZMUF9TVVApCisJCQlwcmludGYoIkNtZCBvdmVybGFwLCAiKTsKKwl9CisJaWYgKHZhbFtDQVBBQl8wXSAmIExCQV9TVVApIHByaW50ZigiTEJBLCAiKTsKKworCWlmIChsaWtlX3N0ZCAhPSAxKSB7CisJCXByaW50ZigiSU9SRFklcyhjYW4lcyBiZSBkaXNhYmxlZClcbiIsCisJCQkhKHZhbFtDQVBBQl8wXSAmIElPUkRZX1NVUCkgPyAiKG1heSBiZSkiIDogIiIsCisJCQkodmFsW0NBUEFCXzBdICYgSU9SRFlfT0ZGKSA/ICIiIDoibm90Iik7CisJfSBlbHNlCisJCXB1dHMoIm5vIElPUkRZIik7CisKKwlpZiAoKGxpa2Vfc3RkID09IDEpICYmIHZhbFtCVUZfVFlQRV0pIHsKKwkJcHJpbnRmKCJcdEJ1ZmZlciB0eXBlOiAlMDR4OiAlcyVzXG4iLCB2YWxbQlVGX1RZUEVdLAorCQkJKHZhbFtCVUZfVFlQRV0gPCAyKSA/ICJzaW5nbGUgcG9ydCwgc2luZ2xlLXNlY3RvciIgOiAiZHVhbCBwb3J0LCBtdWx0aS1zZWN0b3IiLAorCQkJKHZhbFtCVUZfVFlQRV0gPiAyKSA/ICIgd2l0aCByZWFkIGNhY2hpbmcgYWJpbGl0eSIgOiAiIik7CisJfQorCisJaWYgKChtaW5fc3RkID09IDEpICYmICh2YWxbQlVGRkVSX19TSVpFXSAmJiAodmFsW0JVRkZFUl9fU0laRV0gIT0gTk9WQUxfMSkpKSB7CisJCXByaW50ZigiXHRCdWZmZXIgc2l6ZTogJS4xZmtCXG4iLCAoZmxvYXQpdmFsW0JVRkZFUl9fU0laRV0vMik7CisJfQorCWlmICgobWluX3N0ZCA8IDQpICYmICh2YWxbUldfTE9OR10pKSB7CisJCXByaW50ZigiXHRieXRlcyBhdmFpbCBvbiByL3cgbG9uZzogJXVcbiIsIHZhbFtSV19MT05HXSk7CisJfQorCWlmICgoZXFwdCAhPSBDRFJPTSkgJiYgKGxpa2Vfc3RkID4gMykpIHsKKwkJcHJpbnRmKCJcdFF1ZXVlIGRlcHRoOiAldVxuIiwgKHZhbFtRVUVVRV9ERVBUSF0gJiBERVBUSF9CSVRTKSArIDEpOworCX0KKworCWlmIChkZXYgPT0gQVRBX0RFVikgeworCQlpZiAobGlrZV9zdGQgPT0gMSkKKwkJCXByaW50ZigiXHRDYW4lcyBwZXJmb3JtIGRvdWJsZS13b3JkIElPXG4iLCAoIXZhbFtEV09SRF9JT10pID8gIm5vdCIgOiAiIik7CisJCWVsc2UgeworCQkJcHJpbnRmKCJcdFN0YW5kYnkgdGltZXIgdmFsdWVzOiBzcGVjJ2QgYnkgJXMiLAorCQkJCSh2YWxbQ0FQQUJfMF0gJiBTVERfU1RCWSkgPyAic3RhbmRhcmQiIDogInZlbmRvciIpOworCQkJaWYgKChsaWtlX3N0ZCA+IDMpICYmICgodmFsW0NBUEFCXzFdICYgVkFMSUQpID09IFZBTElEX1ZBTCkpCisJCQkJcHJpbnRmKCIsICVzIGRldmljZSBzcGVjaWZpYyBtaW5pbXVtXG4iLAorCQkJCQkodmFsW0NBUEFCXzFdICYgTUlOX1NUQU5EQllfVElNRVIpID8gIndpdGgiIDogIm5vIik7CisJCQllbHNlCisJCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJfQorCQlwcmludGYoIlx0Ui9XIG11bHRpcGxlIHNlY3RvciB0cmFuc2ZlcjogIik7CisJCWlmICgobGlrZV9zdGQgPCAzKSAmJiAhKHZhbFtTRUNUT1JfWEZFUl9NQVhdICYgU0VDVE9SX1hGRVIpKQorCQkJcHV0cygibm90IHN1cHBvcnRlZCIpOworCQllbHNlIHsKKwkJCXByaW50ZigiTWF4ID0gJXVcdEN1cnJlbnQgPSAiLCB2YWxbU0VDVE9SX1hGRVJfTUFYXSAmIFNFQ1RPUl9YRkVSKTsKKwkJCWlmICh2YWxbU0VDVE9SX1hGRVJfQ1VSXSAmIE1VTFRJUExFX1NFVFRJTkdfVkFMSUQpCisJCQkJcHJpbnRmKCIldVxuIiwgdmFsW1NFQ1RPUl9YRkVSX0NVUl0gJiBTRUNUT1JfWEZFUik7CisJCQllbHNlCisJCQkJcHV0cygiPyIpOworCQl9CisJCWlmICgobGlrZV9zdGQgPiAzKSAmJiAodmFsW0NNRFNfU1VQUF8xXSAmIDB4MDAwOCkpIHsKKwkJCS8qIFdlIHByaW50IG91dCBlbHNld2hlcmUgd2hldGhlciB0aGUgQVBNIGZlYXR1cmUgaXMgZW5hYmxlZCBvcgorCQkJICogbm90LiAgSWYgaXQncyBub3QgZW5hYmxlZCwgbGV0J3Mgbm90IHJlcGVhdCB0aGUgaW5mbzsganVzdCBwcmludAorCQkJICogbm90aGluZyBoZXJlLiAqLworCQkJcHJpbnRmKCJcdEFkdmFuY2VkUE0gbGV2ZWw6ICIpOworCQkJaWYgKCh2YWxbQURWX1BXUl0gJiAweEZGMDApID09IDB4NDAwMCkgeworCQkJCXVpbnQ4X3QgYXBtX2xldmVsID0gdmFsW0FEVl9QV1JdICYgMHgwMEZGOworCQkJCXByaW50ZigiJXUgKDB4JXgpXG4iLCBhcG1fbGV2ZWwsIGFwbV9sZXZlbCk7CisJCQl9CisJCQllbHNlCisJCQkJcHJpbnRmKCJ1bmtub3duIHNldHRpbmcgKDB4JTA0eClcbiIsIHZhbFtBRFZfUFdSXSk7CisJCX0KKwkJaWYgKGxpa2Vfc3RkID4gNSAmJiB2YWxbQUNPVVNUSUNdKSB7CisJCQlwcmludGYoIlx0UmVjb21tZW5kZWQgYWNvdXN0aWMgbWFuYWdlbWVudCB2YWx1ZTogJXUsIGN1cnJlbnQgdmFsdWU6ICV1XG4iLAorCQkJCSh2YWxbQUNPVVNUSUNdID4+IDgpICYgMHgwMGZmLAorCQkJCXZhbFtBQ09VU1RJQ10gJiAweDAwZmYpOworCQl9CisJfSBlbHNlIHsKKwkJLyogQVRBUEkgKi8KKwkJaWYgKGVxcHQgIT0gQ0RST00gJiYgKHZhbFtDQVBBQl8wXSAmIFNXUlNUX1JFUSkpCisJCQlwdXRzKCJcdEFUQSBzdyByZXNldCByZXF1aXJlZCIpOworCisJCWlmICh2YWxbUEtUX1JFTF0gfHwgdmFsW1NWQ19OQlNZXSkgeworCQkJcHJpbnRmKCJcdE92ZXJsYXAgc3VwcG9ydDoiKTsKKwkJCWlmICh2YWxbUEtUX1JFTF0pCisJCQkJcHJpbnRmKCIgJXV1cyB0byByZWxlYXNlIGJ1cy4iLCB2YWxbUEtUX1JFTF0pOworCQkJaWYgKHZhbFtTVkNfTkJTWV0pCisJCQkJcHJpbnRmKCIgJXV1cyB0byBjbGVhciBCU1kgYWZ0ZXIgU0VSVklDRSBjbWQuIiwKKwkJCQkJdmFsW1NWQ19OQlNZXSk7CisJCQliYl9wdXRjaGFyKCdcbicpOworCQl9CisJfQorCisJLyogRE1BIHN0dWZmLiBDaGVjayB0aGF0IG9ubHkgb25lIERNQSBtb2RlIGlzIHNlbGVjdGVkLiAqLworCXByaW50ZigiXHRETUE6ICIpOworCWlmICghKHZhbFtDQVBBQl8wXSAmIERNQV9TVVApKQorCQlwdXRzKCJub3Qgc3VwcG9ydGVkIik7CisJZWxzZSB7CisJCWlmICh2YWxbRE1BX01PREVdICYmICF2YWxbU0lOR0xFX0RNQV0gJiYgIXZhbFtNVUxUSV9ETUFdKQorCQkJcHJpbnRmKCIgc2RtYSV1XG4iLCAodmFsW0RNQV9NT0RFXSAmIE1PREUpID4+IDgpOworCQlpZiAodmFsW1NJTkdMRV9ETUFdKSB7CisJCQlqaiA9IHZhbFtTSU5HTEVfRE1BXTsKKwkJCWtrID0gdmFsW1NJTkdMRV9ETUFdID4+IDg7CisJCQllcnJfZG1hICs9IG1vZGVfbG9vcChqaiwga2ssICdzJywgJmhhdmVfbW9kZSk7CisJCX0KKwkJaWYgKHZhbFtNVUxUSV9ETUFdKSB7CisJCQlqaiA9IHZhbFtNVUxUSV9ETUFdOworCQkJa2sgPSB2YWxbTVVMVElfRE1BXSA+PiA4OworCQkJZXJyX2RtYSArPSBtb2RlX2xvb3AoamosIGtrLCAnbScsICZoYXZlX21vZGUpOworCQl9CisJCWlmICgodmFsW1dIQVRTX1ZBTElEXSAmIE9LX1c4OCkgJiYgdmFsW1VMVFJBX0RNQV0pIHsKKwkJCWpqID0gdmFsW1VMVFJBX0RNQV07CisJCQlrayA9IHZhbFtVTFRSQV9ETUFdID4+IDg7CisJCQllcnJfZG1hICs9IG1vZGVfbG9vcChqaiwga2ssICd1JywgJmhhdmVfbW9kZSk7CisJCX0KKwkJaWYgKGVycl9kbWEgfHwgIWhhdmVfbW9kZSkgcHJpbnRmKCIoPykiKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKworCQlpZiAoKGRldiA9PSBBVEFQSV9ERVYpICYmIChlcXB0ICE9IENEUk9NKSAmJiAodmFsW0NBUEFCXzBdICYgRE1BX0lMX1NVUCkpCisJCQlwdXRzKCJcdFx0SW50ZXJsZWF2ZWQgRE1BIHN1cHBvcnQiKTsKKworCQlpZiAoKHZhbFtXSEFUU19WQUxJRF0gJiBPS19XNjRfNzApCisJCSAmJiAodmFsW0RNQV9USU1FX01JTl0gfHwgdmFsW0RNQV9USU1FX05PUk1dKQorCQkpIHsKKwkJCXByaW50ZigiXHRcdEN5Y2xlIHRpbWU6Iik7CisJCQlpZiAodmFsW0RNQV9USU1FX01JTl0pIHByaW50ZigiIG1pbj0ldW5zIiwgdmFsW0RNQV9USU1FX01JTl0pOworCQkJaWYgKHZhbFtETUFfVElNRV9OT1JNXSkgcHJpbnRmKCIgcmVjb21tZW5kZWQ9JXVucyIsIHZhbFtETUFfVElNRV9OT1JNXSk7CisJCQliYl9wdXRjaGFyKCdcbicpOworCQl9CisJfQorCisJLyogUHJvZ3JhbW1lZCBJTyBzdHVmZiAqLworCXByaW50ZigiXHRQSU86ICIpOworCS8qIElmIGEgZHJpdmUgc3VwcG9ydHMgbW9kZSBuIChlLmcuIDMpLCBpdCBhbHNvIHN1cHBvcnRzIGFsbCBtb2RlcyBsZXNzCisJICogdGhhbiBuIChlLmcuIDMsIDIsIDEgYW5kIDApLiAgUHJpbnQgYWxsIHRoZSBtb2Rlcy4gKi8KKwlpZiAoKHZhbFtXSEFUU19WQUxJRF0gJiBPS19XNjRfNzApICYmICh2YWxbQURWX1BJT19NT0RFU10gJiBQSU9fU1VQKSkgeworCQlqaiA9ICgodmFsW0FEVl9QSU9fTU9ERVNdICYgUElPX1NVUCkgPDwgMykgfCAweDAwMDc7CisJCWZvciAoaWkgPSAwOyBpaSA8PSBQSU9fTU9ERV9NQVg7IGlpKyspIHsKKwkJCWlmIChqaiAmIDB4MDAwMSkgcHJpbnRmKCJwaW8lZCAiLCBpaSk7CisJCQlqaiA+Pj0xOworCQl9CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfSBlbHNlIGlmICgoKG1pbl9zdGQgPCA1KSB8fCAoZXFwdCA9PSBDRFJPTSkpICYmICh2YWxbUElPX01PREVdICYgTU9ERSkpIHsKKwkJZm9yIChpaSA9IDA7IGlpIDw9IHZhbFtQSU9fTU9ERV0+Pjg7IGlpKyspCisJCQlwcmludGYoInBpbyVkICIsIGlpKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9IGVsc2UKKwkJcHV0cygidW5rbm93biIpOworCisJaWYgKHZhbFtXSEFUU19WQUxJRF0gJiBPS19XNjRfNzApIHsKKwkJaWYgKHZhbFtQSU9fTk9fRkxPV10gfHwgdmFsW1BJT19GTE9XXSkgeworCQkJcHJpbnRmKCJcdFx0Q3ljbGUgdGltZToiKTsKKwkJCWlmICh2YWxbUElPX05PX0ZMT1ddKQorCQkJCXByaW50ZigiIG5vIGZsb3cgY29udHJvbD0ldW5zIiwgdmFsW1BJT19OT19GTE9XXSk7CisJCQlpZiAodmFsW1BJT19GTE9XXSkKKwkJCQlwcmludGYoIiAgSU9SRFkgZmxvdyBjb250cm9sPSV1bnMiLCB2YWxbUElPX0ZMT1ddKTsKKwkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCX0KKwl9CisKKwlpZiAoKHZhbFtDTURTX1NVUFBfMV0gJiBWQUxJRCkgPT0gVkFMSURfVkFMKSB7CisJCXB1dHMoIkNvbW1hbmRzL2ZlYXR1cmVzOlxuIgorCQkJIlx0RW5hYmxlZFx0U3VwcG9ydGVkOiIpOworCQlqaiA9IHZhbFtDTURTX1NVUFBfMF07CisJCWtrID0gdmFsW0NNRFNfRU5fMF07CisJCWZvciAoaWkgPSAwOyBpaSA8IE5VTV9DTURfRkVBVF9TVFI7IGlpKyspIHsKKwkJCWNvbnN0IGNoYXIgKmZlYXRfc3RyID0gbnRoX3N0cmluZyhjbWRfZmVhdF9zdHIsIGlpKTsKKwkJCWlmICgoamogJiAweDgwMDApICYmICgqZmVhdF9zdHIgIT0gJ1wwJykpIHsKKwkJCQlwcmludGYoIlx0JXNcdCVzXG4iLCAoa2sgJiAweDgwMDApID8gIiAgICoiIDogIiIsIGZlYXRfc3RyKTsKKwkJCX0KKwkJCWpqIDw8PSAxOworCQkJa2sgPDw9IDE7CisJCQlpZiAoaWkgJSAxNiA9PSAxNSkgeworCQkJCWpqID0gdmFsW0NNRFNfU1VQUF8wKzErKGlpLzE2KV07CisJCQkJa2sgPSB2YWxbQ01EU19FTl8wKzErKGlpLzE2KV07CisJCQl9CisJCQlpZiAoaWkgPT0gMzEpIHsKKwkJCQlpZiAoKHZhbFtDTURTX1NVUFBfMl0gJiBWQUxJRCkgIT0gVkFMSURfVkFMKQorCQkJCQlpaSArPTE2OworCQkJfQorCQl9CisJfQorCS8qIFJlbW92YWJsZSBNZWRpYSBTdGF0dXMgTm90aWZpY2F0aW9uIGZlYXR1cmUgc2V0ICovCisJaWYgKCh2YWxbUk1fU1RBVF0gJiBSTV9TVEFUX0JJVFMpID09IFJNX1NUQVRfU1VQKQorCQlwcmludGYoIlx0JXMgc3VwcG9ydGVkXG4iLCBudGhfc3RyaW5nKGNtZF9mZWF0X3N0ciwgMjcpKTsKKworCS8qIHNlY3VyaXR5ICovCisJaWYgKChlcXB0ICE9IENEUk9NKSAmJiAobGlrZV9zdGQgPiAzKQorCSAmJiAodmFsW1NFQ1VfU1RBVFVTXSB8fCB2YWxbRVJBU0VfVElNRV0gfHwgdmFsW0VOSF9FUkFTRV9USU1FXSkKKwkpIHsKKwkJcHV0cygiU2VjdXJpdHk6Iik7CisJCWlmICh2YWxbUFNXRF9DT0RFXSAmJiAodmFsW1BTV0RfQ09ERV0gIT0gTk9WQUxfMSkpCisJCQlwcmludGYoIlx0TWFzdGVyIHBhc3N3b3JkIHJldmlzaW9uIGNvZGUgPSAldVxuIiwgdmFsW1BTV0RfQ09ERV0pOworCQlqaiA9IHZhbFtTRUNVX1NUQVRVU107CisJCWlmIChqaikgeworCQkJZm9yIChpaSA9IDA7IGlpIDwgTlVNX1NFQ1VfU1RSOyBpaSsrKSB7CisJCQkJcHJpbnRmKCJcdCVzXHQlc1xuIiwKKwkJCQkJKCEoamogJiAweDAwMDEpKSA/ICJub3QiIDogIiIsCisJCQkJCW50aF9zdHJpbmcoc2VjdV9zdHIsIGlpKSk7CisJCQkJamogPj49MTsKKwkJCX0KKwkJCWlmICh2YWxbU0VDVV9TVEFUVVNdICYgU0VDVV9FTkFCTEVEKSB7CisJCQkJcHJpbnRmKCJcdFNlY3VyaXR5IGxldmVsICVzXG4iLAorCQkJCQkodmFsW1NFQ1VfU1RBVFVTXSAmIFNFQ1VfTEVWRUwpID8gIm1heGltdW0iIDogImhpZ2giKTsKKwkJCX0KKwkJfQorCQlqaiA9ICB2YWxbRVJBU0VfVElNRV0gICAgICYgRVJBU0VfQklUUzsKKwkJa2sgPSAgdmFsW0VOSF9FUkFTRV9USU1FXSAmIEVSQVNFX0JJVFM7CisJCWlmIChqaiB8fCBraykgeworCQkJYmJfcHV0Y2hhcignXHQnKTsKKwkJCWlmIChqaikgcHJpbnRmKCIldW1pbiBmb3IgJXNTRUNVUklUWSBFUkFTRSBVTklULiAiLCBqaj09RVJBU0VfQklUUyA/IDUwOCA6IGpqPDwxLCAiIik7CisJCQlpZiAoa2spIHByaW50ZigiJXVtaW4gZm9yICVzU0VDVVJJVFkgRVJBU0UgVU5JVC4gIiwga2s9PUVSQVNFX0JJVFMgPyA1MDggOiBrazw8MSwgIkVOSEFOQ0VEICIpOworCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJfQorCX0KKworCS8qIHJlc2V0IHJlc3VsdCAqLworCWpqID0gdmFsW0hXUlNUX1JTTFRdOworCWlmICgoamogJiBWQUxJRCkgPT0gVkFMSURfVkFMKSB7CisJCW9vID0gKGpqICYgUlNUMCk7CisJCWlmICghb28pCisJCQlqaiA+Pj0gODsKKwkJaWYgKChqaiAmIERFVl9ERVQpID09IEpVTVBFUl9WQUwpCisJCQlzdHJuZyA9ICIgZGV0ZXJtaW5lZCBieSB0aGUganVtcGVyIjsKKwkJZWxzZSBpZiAoKGpqICYgREVWX0RFVCkgPT0gQ1NFTF9WQUwpCisJCQlzdHJuZyA9ICIgZGV0ZXJtaW5lZCBieSBDU0VMIjsKKwkJZWxzZQorCQkJc3RybmcgPSAiIjsKKwkJcHJpbnRmKCJIVyByZXNldCByZXN1bHRzOlxuIgorCQkJIlx0Q0JMSUQtICVzIFZpaFxuIgorCQkJIlx0RGV2aWNlIG51bSA9ICVpJXNcbiIsCisJCQkodmFsW0hXUlNUX1JTTFRdICYgQ0JMSUQpID8gImFib3ZlIiA6ICJiZWxvdyIsCisJCQkhKG9vKSwgc3RybmcpOworCX0KKworCS8qIG1vcmUgc3R1ZmYgZnJvbSBzdGQgNSAqLworCWlmICgobGlrZV9zdGQgPiA0KSAmJiAoZXFwdCAhPSBDRFJPTSkpIHsKKwkJaWYgKHZhbFtDRkFfUFdSX01PREVdICYgVkFMSURfVzE2MCkgeworCQkJcHJpbnRmKCJDRkEgcG93ZXIgbW9kZSAxOlxuIgorCQkJCSJcdCVzJXNcbiIsCisJCQkJKHZhbFtDRkFfUFdSX01PREVdICYgUFdSX01PREVfT0ZGKSA/ICJkaXNhYmxlZCIgOiAiZW5hYmxlZCIsCisJCQkJKHZhbFtDRkFfUFdSX01PREVdICYgUFdSX01PREVfUkVRKSA/ICIgYW5kIHJlcXVpcmVkIGJ5IHNvbWUgY29tbWFuZHMiIDogIiIpOworCQkJaWYgKHZhbFtDRkFfUFdSX01PREVdICYgTUFYX0FNUFMpCisJCQkJcHJpbnRmKCJcdE1heGltdW0gY3VycmVudCA9ICV1bWFcbiIsIHZhbFtDRkFfUFdSX01PREVdICYgTUFYX0FNUFMpOworCQl9CisJCWlmICgodmFsW0lOVEVHUklUWV0gJiBTSUcpID09IFNJR19WQUwpIHsKKwkJCXByaW50ZigiQ2hlY2tzdW06ICVzY29ycmVjdFxuIiwgY2hrc3VtID8gImluIiA6ICIiKTsKKwkJfQorCX0KKworCWV4aXQoRVhJVF9TVUNDRVNTKTsKK30KKyNlbmRpZgorCisvLyBIaXN0b3JpY2FsbHksIGlmIHRoZXJlIHdhcyBubyBIRElPX09CU09MRVRFX0lERU5USVRZLCB0aGVuCisvLyB0aGVuIHRoZSBIRElPX0dFVF9JREVOVElUWSBvbmx5IHJldHVybmVkIDE0MiBieXRlcy4KKy8vIE90aGVyd2lzZSwgSERJT19PQlNPTEVURV9JREVOVElUWSByZXR1cm5zIDE0MiBieXRlcywKKy8vIGFuZCBIRElPX0dFVF9JREVOVElUWSByZXR1cm5zIDUxMiBieXRlcy4gIEJ1dCB0aGUgbGF0ZXN0CisvLyAyLjUueHgga2VybmVscyBubyBsb25nZXIgZGVmaW5lIEhESU9fT0JTT0xFVEVfSURFTlRJVFkKKy8vICh3aGljaCB0aGV5IHNob3VsZCwgYnV0IHRoZXkgc2hvdWxkIGp1c3QgcmV0dXJuIC1FSU5WQUwpLgorLy8KKy8vIFNvLi4gd2UgbXVzdCBub3cgYXNzdW1lIHRoYXQgSERJT19HRVRfSURFTlRJVFkgcmV0dXJucyA1MTIgYnl0ZXMuCisvLyBPbiBhIHJlYWxseSBvbGQgc3lzdGVtLCBpdCB3aWxsIG5vdCwgYW5kIHdlIHdpbGwgYmUgY29uZnVzZWQuCisvLyBUb28gYmFkLCByZWFsbHkuCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZCitzdGF0aWMgY29uc3QgY2hhciBjZmdfc3RyW10gQUxJR04xID0KKwkiIiJcMCIgICAgICAgICAgICAiSGFyZFNlY3QiIlwwIiAgICJTb2Z0U2VjdCIiXDAiICAiTm90TUZNIiJcMCIKKwkiSGRTdz4xNXVTZWMiIlwwIiAiU3Bpbk1vdEN0bCIiXDAiICJGaXhlZCIiXDAiICAgICAiUmVtb3ZlYWJsZSIiXDAiCisJIkRUUjw9NU1icyIiXDAiICAgIkRUUj41TWJzIiJcMCIgICAiRFRSPjEwTWJzIiJcMCIgIlJvdFNwZFRvbD4uNSUiIlwwIgorCSJkU3RiT2ZmIiJcMCIgICAgICJUcmtPZmYiIlwwIiAgICAgIkZtdEdhcFJlcSIiXDAiICJub25NYWduZXRpYyIKKzsKKworc3RhdGljIGNvbnN0IGNoYXIgQnVmZlR5cGVbXSBBTElHTjEgPQorCSJ1bmtub3duIiJcMCIgICAgICIxU2VjdCIiXDAiICAgICAgIkR1YWxQb3J0IiJcMCIgICJEdWFsUG9ydENhY2hlIgorOworCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBkdW1wX2lkZW50aXR5KGNvbnN0IHN0cnVjdCBoZF9kcml2ZWlkICppZCkKK3sKKwlpbnQgaTsKKwljb25zdCB1bnNpZ25lZCBzaG9ydCAqaWRfcmVncyA9IChjb25zdCB2b2lkKikgaWQ7CisKKwlwcmludGYoIlxuIE1vZGVsPSUuNDBzLCBGd1Jldj0lLjhzLCBTZXJpYWxObz0lLjIwc1xuIENvbmZpZz17IiwKKwkJCQlpZC0+bW9kZWwsIGlkLT5md19yZXYsIGlkLT5zZXJpYWxfbm8pOworCWZvciAoaSA9IDA7IGkgPD0gMTU7IGkrKykgeworCQlpZiAoaWQtPmNvbmZpZyAmICgxPDxpKSkKKwkJCXByaW50ZigiICVzIiwgbnRoX3N0cmluZyhjZmdfc3RyLCBpKSk7CisJfQorCXByaW50ZigiIH1cbiBSYXdDSFM9JXUvJXUvJXUsIFRya1NpemU9JXUsIFNlY3RTaXplPSV1LCBFQ0NieXRlcz0ldVxuIgorCQkiIEJ1ZmZUeXBlPSgldSkgJXMsIEJ1ZmZTaXplPSV1a0IsIE1heE11bHRTZWN0PSV1IiwKKwkJaWQtPmN5bHMsIGlkLT5oZWFkcywgaWQtPnNlY3RvcnMsIGlkLT50cmFja19ieXRlcywKKwkJaWQtPnNlY3Rvcl9ieXRlcywgaWQtPmVjY19ieXRlcywKKwkJaWQtPmJ1Zl90eXBlLAorCQludGhfc3RyaW5nKEJ1ZmZUeXBlLCAoaWQtPmJ1Zl90eXBlID4gMykgPyAwIDogaWQtPmJ1Zl90eXBlKSwKKwkJaWQtPmJ1Zl9zaXplLzIsIGlkLT5tYXhfbXVsdHNlY3QpOworCWlmIChpZC0+bWF4X211bHRzZWN0KSB7CisJCXByaW50ZigiLCBNdWx0U2VjdD0iKTsKKwkJaWYgKCEoaWQtPm11bHRzZWN0X3ZhbGlkICYgMSkpCisJCQlwcmludGYoIj8ldT8iLCBpZC0+bXVsdHNlY3QpOworCQllbHNlIGlmIChpZC0+bXVsdHNlY3QpCisJCQlwcmludGYoIiV1IiwgaWQtPm11bHRzZWN0KTsKKwkJZWxzZQorCQkJcHJpbnRmKCJvZmYiKTsKKwl9CisJYmJfcHV0Y2hhcignXG4nKTsKKworCWlmICghKGlkLT5maWVsZF92YWxpZCAmIDEpKQorCQlwcmludGYoIiAobWF5YmUpOiIpOworCisJcHJpbnRmKCIgQ3VyQ0hTPSV1LyV1LyV1LCBDdXJTZWN0cz0lbHUsIExCQT0lcyIsIGlkLT5jdXJfY3lscywgaWQtPmN1cl9oZWFkcywKKwkJaWQtPmN1cl9zZWN0b3JzLAorCQkoQkJfQklHX0VORElBTikgPworCQkJKHVuc2lnbmVkIGxvbmcpKGlkLT5jdXJfY2FwYWNpdHkwIDw8IDE2KSB8IGlkLT5jdXJfY2FwYWNpdHkxIDoKKwkJCSh1bnNpZ25lZCBsb25nKShpZC0+Y3VyX2NhcGFjaXR5MSA8PCAxNikgfCBpZC0+Y3VyX2NhcGFjaXR5MCwKKwkJCSgoaWQtPmNhcGFiaWxpdHkmMikgPT0gMCkgPyAibm8iIDogInllcyIpOworCisJaWYgKGlkLT5jYXBhYmlsaXR5ICYgMikKKwkJcHJpbnRmKCIsIExCQXNlY3RzPSV1IiwgaWQtPmxiYV9jYXBhY2l0eSk7CisKKwlwcmludGYoIlxuIElPUkRZPSVzIiwKKwkJKGlkLT5jYXBhYmlsaXR5ICYgOCkKKwkJCT8gKChpZC0+Y2FwYWJpbGl0eSAmIDQpID8gIm9uL29mZiIgOiAieWVzIikKKwkJCTogIm5vIik7CisKKwlpZiAoKChpZC0+Y2FwYWJpbGl0eSAmIDgpIHx8IChpZC0+ZmllbGRfdmFsaWQgJiAyKSkgJiYgKGlkLT5maWVsZF92YWxpZCAmIDIpKQorCQlwcmludGYoIiwgdFBJTz17bWluOiV1LHcvSU9SRFk6JXV9IiwgaWQtPmVpZGVfcGlvLCBpZC0+ZWlkZV9waW9faW9yZHkpOworCisJaWYgKChpZC0+Y2FwYWJpbGl0eSAmIDEpICYmIChpZC0+ZmllbGRfdmFsaWQgJiAyKSkKKwkJcHJpbnRmKCIsIHRETUE9e21pbjoldSxyZWM6JXV9IiwgaWQtPmVpZGVfZG1hX21pbiwgaWQtPmVpZGVfZG1hX3RpbWUpOworCisJcHJpbnRmKCJcbiBQSU8gbW9kZXM6ICAiKTsKKwlpZiAoaWQtPnRQSU8gPD0gNSkgeworCQlwcmludGYoInBpbzAgIik7CisJCWlmIChpZC0+dFBJTyA+PSAxKSBwcmludGYoInBpbzEgIik7CisJCWlmIChpZC0+dFBJTyA+PSAyKSBwcmludGYoInBpbzIgIik7CisJfQorCWlmIChpZC0+ZmllbGRfdmFsaWQgJiAyKSB7CisJCXN0YXRpYyBjb25zdCBtYXNrc19sYWJlbHNfdCBwaW9fbW9kZXMgPSB7CisJCQkubWFza3MgPSB7IDEsIDIsIH4zIH0sCisJCQkubGFiZWxzID0gInBpbzMgXDAiInBpbzQgXDAiInBpbz8gXDAiLAorCQl9OworCQlwcmludF9mbGFncygmcGlvX21vZGVzLCBpZC0+ZWlkZV9waW9fbW9kZXMpOworCX0KKwlpZiAoaWQtPmNhcGFiaWxpdHkgJiAxKSB7CisJCWlmIChpZC0+ZG1hXzF3b3JkIHwgaWQtPmRtYV9td29yZCkgeworCQkJc3RhdGljIGNvbnN0IGludCBkbWFfd21vZGVfbWFza3NbXSA9IHsgMHgxMDAsIDEsIDB4MjAwLCAyLCAweDQwMCwgNCwgMHhmODAwLCAweGY4IH07CisJCQlwcmludGYoIlxuIERNQSBtb2RlczogICIpOworCQkJcHJpbnRfZmxhZ3Nfc2VwYXJhdGVkKGRtYV93bW9kZV9tYXNrcywKKwkJCQkiKlwwIiJzZG1hMCBcMCIiKlwwIiJzZG1hMSBcMCIiKlwwIiJzZG1hMiBcMCIiKlwwIiJzZG1hPyBcMCIsCisJCQkJaWQtPmRtYV8xd29yZCwgTlVMTCk7CisJCQlwcmludF9mbGFnc19zZXBhcmF0ZWQoZG1hX3dtb2RlX21hc2tzLAorCQkJCSIqXDAiIm1kbWEwIFwwIiIqXDAiIm1kbWExIFwwIiIqXDAiIm1kbWEyIFwwIiIqXDAiIm1kbWE/IFwwIiwKKwkJCQlpZC0+ZG1hX213b3JkLCBOVUxMKTsKKwkJfQorCX0KKwlpZiAoKChpZC0+Y2FwYWJpbGl0eSAmIDgpIHx8IChpZC0+ZmllbGRfdmFsaWQgJiAyKSkgJiYgaWQtPmZpZWxkX3ZhbGlkICYgNCkgeworCQlzdGF0aWMgY29uc3QgbWFza3NfbGFiZWxzX3QgdWx0cmFfbW9kZXMxID0geworCQkJLm1hc2tzID0geyAweDEwMCwgMHgwMDEsIDB4MjAwLCAweDAwMiwgMHg0MDAsIDB4MDA0IH0sCisJCQkubGFiZWxzID0gIipcMCIidWRtYTAgXDAiIipcMCIidWRtYTEgXDAiIipcMCIidWRtYTIgXDAiLAorCQl9OworCisJCXByaW50ZigiXG4gVURNQSBtb2RlczogIik7CisJCXByaW50X2ZsYWdzKCZ1bHRyYV9tb2RlczEsIGlkLT5kbWFfdWx0cmEpOworI2lmZGVmIF9fTkVXX0hEX0RSSVZFX0lECisJCWlmIChpZC0+aHdfY29uZmlnICYgMHgyMDAwKSB7CisjZWxzZSAvKiAhX19ORVdfSERfRFJJVkVfSUQgKi8KKwkJaWYgKGlkLT53b3JkOTMgJiAweDIwMDApIHsKKyNlbmRpZiAvKiBfX05FV19IRF9EUklWRV9JRCAqLworCQkJc3RhdGljIGNvbnN0IG1hc2tzX2xhYmVsc190IHVsdHJhX21vZGVzMiA9IHsKKwkJCQkubWFza3MgPSB7IDB4MDgwMCwgMHgwMDA4LCAweDEwMDAsIDB4MDAxMCwKKwkJCQkJMHgyMDAwLCAweDAwMjAsIDB4NDAwMCwgMHgwMDQwLAorCQkJCQkweDgwMDAsIDB4MDA4MCB9LAorCQkJCS5sYWJlbHMgPSAiKlwwIiJ1ZG1hMyBcMCIiKlwwIiJ1ZG1hNCBcMCIKKwkJCQkJIipcMCIidWRtYTUgXDAiIipcMCIidWRtYTYgXDAiCisJCQkJCSIqXDAiInVkbWE3IFwwIgorCQkJfTsKKwkJCXByaW50X2ZsYWdzKCZ1bHRyYV9tb2RlczIsIGlkLT5kbWFfdWx0cmEpOworCQl9CisJfQorCXByaW50ZigiXG4gQWR2YW5jZWRQTT0lcyIsICghKGlkX3JlZ3NbODNdICYgOCkpID8gIm5vIiA6ICJ5ZXMiKTsKKwlpZiAoaWRfcmVnc1s4M10gJiA4KSB7CisJCWlmICghKGlkX3JlZ3NbODZdICYgOCkpCisJCQlwcmludGYoIjogZGlzYWJsZWQgKDI1NSkiKTsKKwkJZWxzZSBpZiAoKGlkX3JlZ3NbOTFdICYgMHhGRjAwKSAhPSAweDQwMDApCisJCQlwcmludGYoIjogdW5rbm93biBzZXR0aW5nIik7CisJCWVsc2UKKwkJCXByaW50ZigiOiBtb2RlPTB4JTAyWCAoJXUpIiwgaWRfcmVnc1s5MV0gJiAweEZGLCBpZF9yZWdzWzkxXSAmIDB4RkYpOworCX0KKwlpZiAoaWRfcmVnc1s4Ml0gJiAweDIwKQorCQlwcmludGYoIiBXcml0ZUNhY2hlPSVzIiwgKGlkX3JlZ3NbODVdICYgMHgyMCkgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKyNpZmRlZiBfX05FV19IRF9EUklWRV9JRAorCWlmICgoaWQtPm1pbm9yX3Jldl9udW0gJiYgaWQtPm1pbm9yX3Jldl9udW0gPD0gMzEpCisJIHx8IChpZC0+bWFqb3JfcmV2X251bSAmJiBpZC0+bWlub3JfcmV2X251bSA8PSAzMSkKKwkpIHsKKwkJcHJpbnRmKCJcbiBEcml2ZSBjb25mb3JtcyB0bzogJXM6ICIsCisJCQkoaWQtPm1pbm9yX3Jldl9udW0gPD0gMzEpID8gbnRoX3N0cmluZyhtaW5vcl9zdHIsIGlkLT5taW5vcl9yZXZfbnVtKSA6ICJ1bmtub3duIik7CisJCWlmIChpZC0+bWFqb3JfcmV2X251bSAhPSAweDAwMDAgLyogTk9WQUxfMCAqLworCQkgJiYgaWQtPm1ham9yX3Jldl9udW0gIT0gMHhGRkZGIC8qIE5PVkFMXzEgKi8KKwkJKSB7CisJCQlmb3IgKGkgPSAwOyBpIDw9IDE1OyBpKyspIHsKKwkJCQlpZiAoaWQtPm1ham9yX3Jldl9udW0gJiAoMTw8aSkpCisJCQkJCXByaW50ZigiIEFUQS9BVEFQSS0ldSIsIGkpOworCQkJfQorCQl9CisJfQorI2VuZGlmIC8qIF9fTkVXX0hEX0RSSVZFX0lEICovCisJcHV0cygiXG5cbiAqIGN1cnJlbnQgYWN0aXZlIG1vZGVcbiIpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGZsdXNoX2J1ZmZlcl9jYWNoZSgvKmludCBmZCovIHZvaWQpCit7CisJZnN5bmMoZmQpOwkJCQkvKiBmbHVzaCBidWZmZXJzICovCisJaW9jdGxfb3Jfd2FybihmZCwgQkxLRkxTQlVGLCBOVUxMKTsgLyogZG8gaXQgYWdhaW4sIGJpZyB0aW1lICovCisjaWZkZWYgSERJT19EUklWRV9DTUQKKwlzbGVlcCgxKTsKKwlpZiAoaW9jdGwoZmQsIEhESU9fRFJJVkVfQ01ELCBOVUxMKSAmJiBlcnJubyAhPSBFSU5WQUwpIHsJLyogYXdhaXQgY29tcGxldGlvbiAqLworCQlpZiAoRU5BQkxFX0lPQ1RMX0hFWDJTVFJfRVJST1IpIC8qIFRvIGJlIGNvaGVyZW50IHdpdGggaW9jdGxfb3Jfd2FybiAqLworCQkJYmJfcGVycm9yX21zZygiSERJT19EUklWRV9DTUQiKTsKKwkJZWxzZQorCQkJYmJfcGVycm9yX21zZygiaW9jdGwgJSN4IGZhaWxlZCIsIEhESU9fRFJJVkVfQ01EKTsKKwl9CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgc2Vla190b196ZXJvKC8qaW50IGZkKi8gdm9pZCkKK3sKKwl4bHNlZWsoZmQsIChvZmZfdCkgMCwgU0VFS19TRVQpOworfQorCitzdGF0aWMgdm9pZCByZWFkX2JpZ19ibG9jaygvKmludCBmZCwqLyBjaGFyICpidWYpCit7CisJaW50IGk7CisKKwl4cmVhZChmZCwgYnVmLCBUSU1JTkdfQlVGX0JZVEVTKTsKKwkvKiBhY2Nlc3MgYWxsIHNlY3RvcnMgb2YgYnVmIHRvIGVuc3VyZSB0aGUgcmVhZCBmdWxseSBjb21wbGV0ZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgVElNSU5HX0JVRl9CWVRFUzsgaSArPSA1MTIpCisJCWJ1ZltpXSAmPSAxOworfQorCitzdGF0aWMgdW5zaWduZWQgZGV2X3NpemVfbWIoLyppbnQgZmQqLyB2b2lkKQoreworCXVuaW9uIHsKKwkJdW5zaWduZWQgbG9uZyBsb25nIGJsa3NpemU2NDsKKwkJdW5zaWduZWQgYmxrc2l6ZTMyOworCX0gdTsKKworCWlmICgwID09IGlvY3RsKGZkLCBCTEtHRVRTSVpFNjQsICZ1LmJsa3NpemU2NCkpIHsgLy8gYnl0ZXMKKwkJdS5ibGtzaXplNjQgLz0gKDEwMjQgKiAxMDI0KTsKKwl9IGVsc2UgeworCQl4aW9jdGwoZmQsIEJMS0dFVFNJWkUsICZ1LmJsa3NpemUzMik7IC8vIHNlY3RvcnMKKwkJdS5ibGtzaXplNjQgPSB1LmJsa3NpemUzMiAvICgyICogMTAyNCk7CisJfQorCWlmICh1LmJsa3NpemU2NCA+IFVJTlRfTUFYKQorCQlyZXR1cm4gVUlOVF9NQVg7CisJcmV0dXJuIHUuYmxrc2l6ZTY0OworfQorCitzdGF0aWMgdm9pZCBwcmludF90aW1pbmcodW5zaWduZWQgbSwgdW5zaWduZWQgZWxhcHNlZF91cykKK3sKKwl1bnNpZ25lZCBzZWMgPSBlbGFwc2VkX3VzIC8gMTAwMDAwMDsKKwl1bnNpZ25lZCBocyA9IChlbGFwc2VkX3VzICUgMTAwMDAwMCkgLyAxMDAwMDsKKworCXByaW50ZigiJTV1IE1CIGluICV1LiUwMnUgc2Vjb25kcyA9ICV1IGtCL3NcbiIsCisJCW0sIHNlYywgaHMsCisJCS8qICJ8IDEiIHByZXZlbnRzIGRpdi1ieS0wICovCisJCSh1bnNpZ25lZCkgKCh1bnNpZ25lZCBsb25nIGxvbmcpbSAqICgxMDI0ICogMTAwMDAwMCkgLyAoZWxhcHNlZF91cyB8IDEpKQorCQkvLyB+PSAobSAqIDEwMjQpIC8gKGVsYXBzZWRfdXMgLyAxMDAwMDAwKQorCQkvLyA9IGtiIC8gZWxhcHNlZF9zZWMKKwkpOworfQorCitzdGF0aWMgdm9pZCBkb190aW1lKGludCBjYWNoZSAvKixpbnQgZmQqLykKKy8qIGNhY2hlPTE6IHRpbWUgY2FjaGU6IHJlcGVhdGVkbHkgcmVhZCBOIE1CIGF0IG9mZnNldCAwCisgKiBjYWNoZT0wOiB0aW1lIGRldmljZTogbGluZWFyIHJlYWQsIHN0YXJ0aW5nIGF0IG9mZnNldCAwCisgKi8KK3sKKwl1bnNpZ25lZCBtYXhfaXRlcmF0aW9ucywgaXRlcmF0aW9uczsKKwl1bnNpZ25lZCBzdGFydDsgLyogZG9lc24ndCBuZWVkIHRvIGJlIGxvbmcgbG9uZyAqLworCXVuc2lnbmVkIGVsYXBzZWQsIGVsYXBzZWQyOworCXVuc2lnbmVkIHRvdGFsX01COworCWNoYXIgKmJ1ZiA9IHhtYWxsb2MoVElNSU5HX0JVRl9CWVRFUyk7CisKKwlpZiAobWxvY2soYnVmLCBUSU1JTkdfQlVGX0JZVEVTKSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJtbG9jayIpOworCisJLyogQ2xlYXIgb3V0IHRoZSBkZXZpY2UgcmVxdWVzdCBxdWV1ZXMgJiBnaXZlIHRoZW0gdGltZSB0byBjb21wbGV0ZS4KKwkgKiBOQjogKnNtYWxsKiBkZWxheS4gVXNlciBpcyBleHBlY3RlZCB0byBoYXZlIGEgY2x1ZSBhbmQgdG8gbm90IHJ1bgorCSAqIGhlYXZ5IGlvIGluIHBhcmFsbGVsIHdpdGggbWVhc3VyZW1lbnRzLiAqLworCXN5bmMoKTsKKwlzbGVlcCgxKTsKKwlpZiAoY2FjaGUpIHsgLyogVGltZSBjYWNoZSAqLworCQlzZWVrX3RvX3plcm8oKTsKKwkJcmVhZF9iaWdfYmxvY2soYnVmKTsKKwkJcHJpbnRmKCJUaW1pbmcgYnVmZmVyLWNhY2hlIHJlYWRzOiAiKTsKKwl9IGVsc2UgeyAvKiBUaW1lIGRldmljZSAqLworCQlwcmludGYoIlRpbWluZyBidWZmZXJlZCBkaXNrIHJlYWRzOiIpOworCX0KKwlmZmx1c2hfYWxsKCk7CisKKwkvKiBOb3cgZG8gdGhlIHRpbWluZyAqLworCWl0ZXJhdGlvbnMgPSAwOworCS8qIE1heCB0aW1lIHRvIHJ1biAoc21hbGwgZm9yIGNhY2hlLCBhdm9pZHMgZ2V0dGluZworCSAqIGh1Z2UgdG90YWxfTUIgd2hpY2ggY2FuIG92ZXJsb3cgdW5zaWduZWQgdHlwZSkgKi8KKwllbGFwc2VkMiA9IDUxMDAwMDsgLyogY2FjaGUgKi8KKwltYXhfaXRlcmF0aW9ucyA9IFVJTlRfTUFYOworCWlmICghY2FjaGUpIHsKKwkJZWxhcHNlZDIgPSAzMDAwMDAwOyAvKiBub3QgY2FjaGUgKi8KKwkJLyogRG9uJ3Qgd2FudCB0byByZWFkIHBhc3QgdGhlIGVuZCEgKi8KKwkJbWF4X2l0ZXJhdGlvbnMgPSBkZXZfc2l6ZV9tYigpIC8gVElNSU5HX0JVRl9NQjsKKwl9CisJc3RhcnQgPSBtb25vdG9uaWNfdXMoKTsKKwlkbyB7CisJCWlmIChjYWNoZSkKKwkJCXNlZWtfdG9femVybygpOworCQlyZWFkX2JpZ19ibG9jayhidWYpOworCQllbGFwc2VkID0gKHVuc2lnbmVkKW1vbm90b25pY191cygpIC0gc3RhcnQ7CisJCSsraXRlcmF0aW9uczsKKwl9IHdoaWxlIChlbGFwc2VkIDwgZWxhcHNlZDIgJiYgaXRlcmF0aW9ucyA8IG1heF9pdGVyYXRpb25zKTsKKwl0b3RhbF9NQiA9IGl0ZXJhdGlvbnMgKiBUSU1JTkdfQlVGX01COworCS8vcHJpbnRmKCIgZWxhcHNlZDoldSBpdGVyYXRpb25zOiV1ICIsIGVsYXBzZWQsIGl0ZXJhdGlvbnMpOworCWlmIChjYWNoZSkgeworCQkvKiBDYWNoZTogcmVtb3ZlIGxzZWVrKCkgYW5kIG1vbm90b25pY191cygpIG92ZXJoZWFkcworCQkgKiBmcm9tIGVsYXBzZWQgKi8KKwkJc3RhcnQgPSBtb25vdG9uaWNfdXMoKTsKKwkJZG8geworCQkJc2Vla190b196ZXJvKCk7CisJCQllbGFwc2VkMiA9ICh1bnNpZ25lZCltb25vdG9uaWNfdXMoKSAtIHN0YXJ0OworCQl9IHdoaWxlICgtLWl0ZXJhdGlvbnMpOworCQkvL3ByaW50ZigiIGVsYXBzZWQyOiV1ICIsIGVsYXBzZWQyKTsKKwkJZWxhcHNlZCAtPSBlbGFwc2VkMjsKKwkJdG90YWxfTUIgKj0gMjsgLy8gQlVGQ0FDSEVfRkFDVE9SICh3aHk/KQorCQlmbHVzaF9idWZmZXJfY2FjaGUoKTsKKwl9CisJcHJpbnRfdGltaW5nKHRvdGFsX01CLCBlbGFwc2VkKTsKKwltdW5sb2NrKGJ1ZiwgVElNSU5HX0JVRl9CWVRFUyk7CisJZnJlZShidWYpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRgorc3RhdGljIHZvaWQgYnVzX3N0YXRlX3ZhbHVlKHVuc2lnbmVkIHZhbHVlKQoreworCWlmICh2YWx1ZSA9PSBCVVNTVEFURV9PTikKKwkJb25fb2ZmKDEpOworCWVsc2UgaWYgKHZhbHVlID09IEJVU1NUQVRFX09GRikKKwkJb25fb2ZmKDApOworCWVsc2UgaWYgKHZhbHVlID09IEJVU1NUQVRFX1RSSVNUQVRFKQorCQlwdXRzKCIgKHRyaXN0YXRlKSIpOworCWVsc2UKKwkJcHJpbnRmKCIgKHVua25vd246ICV1KVxuIiwgdmFsdWUpOworfQorI2VuZGlmCisKKyNpZmRlZiBIRElPX0RSSVZFX0NNRAorc3RhdGljIHZvaWQgaW50ZXJwcmV0X3N0YW5kYnkodWludDhfdCBzdGFuZGJ5KQoreworCXByaW50ZigiICgiKTsKKwlpZiAoc3RhbmRieSA9PSAwKSB7CisJCXByaW50Zigib2ZmIik7CisJfSBlbHNlIGlmIChzdGFuZGJ5IDw9IDI0MCB8fCBzdGFuZGJ5ID09IDI1MiB8fCBzdGFuZGJ5ID09IDI1NSkgeworCQkvKiBzdGFuZGJ5IGlzIGluIDUgc2VjIHVuaXRzICovCisJCXVuc2lnbmVkIHQgPSBzdGFuZGJ5ICogNTsKKwkJcHJpbnRmKCIldSBtaW51dGVzICV1IHNlY29uZHMiLCB0IC8gNjAsIHQgJSA2MCk7CisJfSBlbHNlIGlmIChzdGFuZGJ5IDw9IDI1MSkgeworCQl1bnNpZ25lZCB0ID0gKHN0YW5kYnkgLSAyNDApOyAvKiB0IGlzIGluIDMwIG1pbiB1bml0cyAqLzsKKwkJcHJpbnRmKCIldS4lYyBob3VycyIsIHQgLyAyLCAodCAmIDEpID8gJzUnIDogJzAnKTsKKwl9CisJaWYgKHN0YW5kYnkgPT0gMjUzKQorCQlwcmludGYoInZlbmRvci1zcGVjaWZpYyIpOworCWlmIChzdGFuZGJ5ID09IDI1NCkKKwkJcHJpbnRmKCJyZXNlcnZlZCIpOworCXB1dHMoIikiKTsKK30KKworc3RhdGljIGNvbnN0IHVpbnQ4X3QgeGZlcm1vZGVfdmFsW10gQUxJR04xID0geworCSA4LCAgICAgIDksICAgICAxMCwgICAgIDExLCAgICAgMTIsICAgICAxMywgICAgIDE0LCAgICAgMTUsCisJMTYsICAgICAxNywgICAgIDE4LCAgICAgMTksICAgICAyMCwgICAgIDIxLCAgICAgMjIsICAgICAyMywKKwkzMiwgICAgIDMzLCAgICAgMzQsICAgICAzNSwgICAgIDM2LCAgICAgMzcsICAgICAzOCwgICAgIDM5LAorCTY0LCAgICAgNjUsICAgICA2NiwgICAgIDY3LCAgICAgNjgsICAgICA2OSwgICAgIDcwLCAgICAgNzEKK307CisvKiBOQjogd2Ugc2F2ZSBzaXplIGJ5IF9ub3RfIHN0b3JpbmcgdGVybmluYXRpbmcgTlVMISAqLworc3RhdGljIGNvbnN0IGNoYXIgeGZlcm1vZGVfbmFtZVtdWzVdIEFMSUdOMSA9IHsKKwkicGlvMCIsICJwaW8xIiwgInBpbzIiLCAicGlvMyIsICJwaW80IiwgInBpbzUiLCAicGlvNiIsICJwaW83IiwKKwkic2RtYTAiLCJzZG1hMSIsInNkbWEyIiwic2RtYTMiLCJzZG1hNCIsInNkbWE1Iiwic2RtYTYiLCJzZG1hNyIsCisJIm1kbWEwIiwibWRtYTEiLCJtZG1hMiIsIm1kbWEzIiwibWRtYTQiLCJtZG1hNSIsIm1kbWE2IiwibWRtYTciLAorCSJ1ZG1hMCIsInVkbWExIiwidWRtYTIiLCJ1ZG1hMyIsInVkbWE0IiwidWRtYTUiLCJ1ZG1hNiIsInVkbWE3IgorfTsKKworc3RhdGljIGludCB0cmFuc2xhdGVfeGZlcm1vZGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgdmFsOworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh4ZmVybW9kZV92YWwpOyBpKyspIHsKKwkJaWYgKCFzdHJuY21wKG5hbWUsIHhmZXJtb2RlX25hbWVbaV0sIDUpKQorCQkJaWYgKHN0cmxlbihuYW1lKSA8PSA1KQorCQkJCXJldHVybiB4ZmVybW9kZV92YWxbaV07CisJfQorCS8qIE5lZ2F0aXZlIG51bWJlcnMgYXJlIGludmFsaWQgYW5kIGFyZSBjYXVnaHQgbGF0ZXIgKi8KKwl2YWwgPSBiYl9zdHJ0b2kobmFtZSwgTlVMTCwgMTApOworCWlmICghZXJybm8pCisJCXJldHVybiB2YWw7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBpbnRlcnByZXRfeGZlcm1vZGUodW5zaWduZWQgeGZlcm1vZGUpCit7CisJcHJpbnRmKCIgKCIpOworCWlmICh4ZmVybW9kZSA9PSAwKQorCQlwcmludGYoImRlZmF1bHQgUElPIG1vZGUiKTsKKwllbHNlIGlmICh4ZmVybW9kZSA9PSAxKQorCQlwcmludGYoImRlZmF1bHQgUElPIG1vZGUsIGRpc2FibGUgSU9SRFkiKTsKKwllbHNlIGlmICh4ZmVybW9kZSA+PSA4ICYmIHhmZXJtb2RlIDw9IDE1KQorCQlwcmludGYoIlBJTyBmbG93IGNvbnRyb2wgbW9kZSV1IiwgeGZlcm1vZGUgLSA4KTsKKwllbHNlIGlmICh4ZmVybW9kZSA+PSAxNiAmJiB4ZmVybW9kZSA8PSAyMykKKwkJcHJpbnRmKCJzaW5nbGV3b3JkIERNQSBtb2RlJXUiLCB4ZmVybW9kZSAtIDE2KTsKKwllbHNlIGlmICh4ZmVybW9kZSA+PSAzMiAmJiB4ZmVybW9kZSA8PSAzOSkKKwkJcHJpbnRmKCJtdWx0aXdvcmQgRE1BIG1vZGUldSIsIHhmZXJtb2RlIC0gMzIpOworCWVsc2UgaWYgKHhmZXJtb2RlID49IDY0ICYmIHhmZXJtb2RlIDw9IDcxKQorCQlwcmludGYoIlVsdHJhRE1BIG1vZGUldSIsIHhmZXJtb2RlIC0gNjQpOworCWVsc2UKKwkJcHJpbnRmKCJ1bmtub3duIik7CisJcHV0cygiKSIpOworfQorI2VuZGlmIC8qIEhESU9fRFJJVkVfQ01EICovCisKK3N0YXRpYyB2b2lkIHByaW50X2ZsYWcoaW50IGZsYWcsIGNvbnN0IGNoYXIgKnMsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCit7CisJaWYgKGZsYWcpCisJCXByaW50ZigiIHNldHRpbmcgJXMgdG8gJWx1XG4iLCBzLCB2YWx1ZSk7Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfZGV2KGNoYXIgKmRldm5hbWUpCit7CisJLyppbnQgZmQ7Ki8KKwlsb25nIHBhcm0sIG11bHRjb3VudDsKKyNpZm5kZWYgSERJT19EUklWRV9DTUQKKwlpbnQgZm9yY2Vfb3BlcmF0aW9uID0gMDsKKyNlbmRpZgorCS8qIFBsZWFzZSByZXN0b3JlIGFyZ3Nbbl0gdG8gdGhlc2UgdmFsdWVzIGFmdGVyIGVhY2ggaW9jdGwKKwkgICBleGNlcHQgZm9yIGFyZ3NbMl0gKi8KKwl1bnNpZ25lZCBjaGFyIGFyZ3NbNF0gPSB7IFdJTl9TRVRGRUFUVVJFUywgMCwgMCwgMCB9OworCWNvbnN0IGNoYXIgKmZtdCA9ICIgJXNcdD0gJTJsZCI7CisKKwkvKmZkID0geG9wZW5fbm9uYmxvY2tpbmcoZGV2bmFtZSk7Ki8KKwl4bW92ZV9mZCh4b3Blbl9ub25ibG9ja2luZyhkZXZuYW1lKSwgZmQpOworCXByaW50ZigiXG4lczpcbiIsIGRldm5hbWUpOworCisJaWYgKGdldHNldF9yZWFkYWhlYWQgPT0gSVNfU0VUKSB7CisJCXByaW50X2ZsYWcoZ2V0c2V0X3JlYWRhaGVhZCwgImZzIHJlYWRhaGVhZCIsIFhyZWFkYWhlYWQpOworCQlpb2N0bF9vcl93YXJuKGZkLCBCTEtSQVNFVCwgKGludCAqKVhyZWFkYWhlYWQpOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9IRFBBUk1fSERJT19VTlJFR0lTVEVSX0hXSUYKKwlpZiAodW5yZWdpc3Rlcl9od2lmKSB7CisJCXByaW50ZigiIGF0dGVtcHRpbmcgdG8gdW5yZWdpc3RlciBod2lmIyVsdVxuIiwgaHdpZik7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fVU5SRUdJU1RFUl9IV0lGLCAoaW50ICopKHVuc2lnbmVkIGxvbmcpaHdpZik7CisJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fU0NBTl9IV0lGCisJaWYgKHNjYW5faHdpZiA9PSBJU19TRVQpIHsKKwkJcHJpbnRmKCIgYXR0ZW1wdGluZyB0byBzY2FuIGh3aWYgKDB4JWx4LCAweCVseCwgJWx1KVxuIiwgaHdpZl9kYXRhLCBod2lmX2N0cmwsIGh3aWZfaXJxKTsKKwkJYXJnc1swXSA9IGh3aWZfZGF0YTsKKwkJYXJnc1sxXSA9IGh3aWZfY3RybDsKKwkJYXJnc1syXSA9IGh3aWZfaXJxOworCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX1NDQU5fSFdJRiwgYXJncyk7CisJCWFyZ3NbMF0gPSBXSU5fU0VURkVBVFVSRVM7CisJCWFyZ3NbMV0gPSAwOworCX0KKyNlbmRpZgorCWlmIChzZXRfcGlvbW9kZSkgeworCQlpZiAobm9pc3lfcGlvbW9kZSkgeworCQkJcHJpbnRmKCIgYXR0ZW1wdGluZyB0byAiKTsKKwkJCWlmIChwaW9tb2RlID09IDI1NSkKKwkJCQlwdXRzKCJhdXRvLXR1bmUgUElPIG1vZGUiKTsKKwkJCWVsc2UgaWYgKHBpb21vZGUgPCAxMDApCisJCQkJcHJpbnRmKCJzZXQgUElPIG1vZGUgdG8gJWRcbiIsIHBpb21vZGUpOworCQkJZWxzZSBpZiAocGlvbW9kZSA8IDIwMCkKKwkJCQlwcmludGYoInNldCBNRE1BIG1vZGUgdG8gJWRcbiIsIChwaW9tb2RlLTEwMCkpOworCQkJZWxzZQorCQkJCXByaW50Zigic2V0IFVETUEgbW9kZSB0byAlZFxuIiwgKHBpb21vZGUtMjAwKSk7CisJCX0KKwkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19TRVRfUElPX01PREUsIChpbnQgKikodW5zaWduZWQgbG9uZylwaW9tb2RlKTsKKwl9CisJaWYgKGdldHNldF9pbzMyYml0ID09IElTX1NFVCkgeworCQlwcmludF9mbGFnKGdldHNldF9pbzMyYml0LCAiMzItYml0IElPX3N1cHBvcnQgZmxhZyIsIGlvMzJiaXQpOworCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX1NFVF8zMkJJVCwgKGludCAqKWlvMzJiaXQpOworCX0KKwlpZiAoZ2V0c2V0X211bHQgPT0gSVNfU0VUKSB7CisJCXByaW50X2ZsYWcoZ2V0c2V0X211bHQsICJtdWx0Y291bnQiLCBtdWx0KTsKKyNpZmRlZiBIRElPX0RSSVZFX0NNRAorCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX1NFVF9NVUxUQ09VTlQsICh2b2lkICopbXVsdCk7CisjZWxzZQorCQlmb3JjZV9vcGVyYXRpb24gfD0gKCFpb2N0bF9vcl93YXJuKGZkLCBIRElPX1NFVF9NVUxUQ09VTlQsICh2b2lkICopbXVsdCkpOworI2VuZGlmCisJfQorCWlmIChnZXRzZXRfcmVhZG9ubHkgPT0gSVNfU0VUKSB7CisJCXByaW50X2ZsYWdfb25fb2ZmKGdldHNldF9yZWFkb25seSwgInJlYWRvbmx5IiwgcmVhZG9ubHkpOworCQlpb2N0bF9vcl93YXJuKGZkLCBCTEtST1NFVCwgJnJlYWRvbmx5KTsKKwl9CisJaWYgKGdldHNldF91bm1hc2sgPT0gSVNfU0VUKSB7CisJCXByaW50X2ZsYWdfb25fb2ZmKGdldHNldF91bm1hc2ssICJ1bm1hc2tpcnEiLCB1bm1hc2spOworCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX1NFVF9VTk1BU0tJTlRSLCAoaW50ICopdW5tYXNrKTsKKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fR0VUU0VUX0RNQQorCWlmIChnZXRzZXRfZG1hID09IElTX1NFVCkgeworCQlwcmludF9mbGFnX29uX29mZihnZXRzZXRfZG1hLCAidXNpbmdfZG1hIiwgZG1hKTsKKwkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19TRVRfRE1BLCAoaW50ICopZG1hKTsKKwl9CisjZW5kaWYgLyogRkVBVFVSRV9IRFBBUk1fSERJT19HRVRTRVRfRE1BICovCisjaWZkZWYgSERJT19TRVRfUURNQQorCWlmIChnZXRzZXRfZG1hX3EgPT0gSVNfU0VUKSB7CisJCXByaW50X2ZsYWdfb25fb2ZmKGdldHNldF9kbWFfcSwgIkRNQSBxdWV1ZV9kZXB0aCIsIGRtYV9xKTsKKwkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19TRVRfUURNQSwgKGludCAqKWRtYV9xKTsKKwl9CisjZW5kaWYKKwlpZiAoZ2V0c2V0X25vd2VyciA9PSBJU19TRVQpIHsKKwkJcHJpbnRfZmxhZ19vbl9vZmYoZ2V0c2V0X25vd2VyciwgIm5vd2VyciIsIG5vd2Vycik7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fU0VUX05PV0VSUiwgKGludCAqKW5vd2Vycik7CisJfQorCWlmIChnZXRzZXRfa2VlcCA9PSBJU19TRVQpIHsKKwkJcHJpbnRfZmxhZ19vbl9vZmYoZ2V0c2V0X2tlZXAsICJrZWVwX3NldHRpbmdzIiwga2VlcCk7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fU0VUX0tFRVBTRVRUSU5HUywgKGludCAqKWtlZXApOworCX0KKyNpZmRlZiBIRElPX0RSSVZFX0NNRAorCWlmIChnZXRzZXRfZG9vcmxvY2sgPT0gSVNfU0VUKSB7CisJCWFyZ3NbMF0gPSBkb29ybG9jayA/IFdJTl9ET09STE9DSyA6IFdJTl9ET09SVU5MT0NLOworCQlhcmdzWzJdID0gMDsKKwkJcHJpbnRfZmxhZ19vbl9vZmYoZ2V0c2V0X2Rvb3Jsb2NrLCAiZHJpdmUgZG9vcmxvY2siLCBkb29ybG9jayk7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fRFJJVkVfQ01ELCAmYXJncyk7CisJCWFyZ3NbMF0gPSBXSU5fU0VURkVBVFVSRVM7CisJfQorCWlmIChnZXRzZXRfZGtlZXAgPT0gSVNfU0VUKSB7CisJCS8qIGxvY2svdW5sb2NrIHRoZSBkcml2ZSdzICJmZWF0dXJlIiBzZXR0aW5ncyAqLworCQlwcmludF9mbGFnX29uX29mZihnZXRzZXRfZGtlZXAsICJkcml2ZSBrZWVwIGZlYXR1cmVzIiwgZGtlZXApOworCQlhcmdzWzJdID0gZGtlZXAgPyAweDY2IDogMHhjYzsKKwkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19EUklWRV9DTUQsICZhcmdzKTsKKwl9CisJaWYgKGdldHNldF9kZWZlY3RzID09IElTX1NFVCkgeworCQlhcmdzWzJdID0gZGVmZWN0cyA/IDB4MDQgOiAweDg0OworCQlwcmludF9mbGFnKGdldHNldF9kZWZlY3RzLCAiZHJpdmUgZGVmZWN0LW1nbXQiLCBkZWZlY3RzKTsKKwkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19EUklWRV9DTUQsICZhcmdzKTsKKwl9CisJaWYgKGdldHNldF9wcmVmZXRjaCA9PSBJU19TRVQpIHsKKwkJYXJnc1sxXSA9IHByZWZldGNoOworCQlhcmdzWzJdID0gMHhhYjsKKwkJcHJpbnRfZmxhZyhnZXRzZXRfcHJlZmV0Y2gsICJkcml2ZSBwcmVmZXRjaCIsIHByZWZldGNoKTsKKwkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19EUklWRV9DTUQsICZhcmdzKTsKKwkJYXJnc1sxXSA9IDA7CisJfQorCWlmIChzZXRfeGZlcm1vZGUpIHsKKwkJYXJnc1sxXSA9IHhmZXJtb2RlX3JlcXVlc3RlZDsKKwkJYXJnc1syXSA9IDM7CisJCXByaW50X2ZsYWcoMSwgInhmZXJtb2RlIiwgeGZlcm1vZGVfcmVxdWVzdGVkKTsKKwkJaW50ZXJwcmV0X3hmZXJtb2RlKHhmZXJtb2RlX3JlcXVlc3RlZCk7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fRFJJVkVfQ01ELCAmYXJncyk7CisJCWFyZ3NbMV0gPSAwOworCX0KKwlpZiAoZ2V0c2V0X2xvb2thaGVhZCA9PSBJU19TRVQpIHsKKwkJYXJnc1syXSA9IGxvb2thaGVhZCA/IDB4YWEgOiAweDU1OworCQlwcmludF9mbGFnX29uX29mZihnZXRzZXRfbG9va2FoZWFkLCAiZHJpdmUgcmVhZC1sb29rYWhlYWQiLCBsb29rYWhlYWQpOworCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX0RSSVZFX0NNRCwgJmFyZ3MpOworCX0KKwlpZiAoZ2V0c2V0X2FwbW1vZGUgPT0gSVNfU0VUKSB7CisJCS8qIGZlYXR1cmUgcmVnaXN0ZXIgKi8KKwkJYXJnc1syXSA9IChhcG1tb2RlID09IDI1NSkgPyAweDg1IC8qIGRpc2FibGUgKi8gOiAweDA1IC8qIHNldCAqLzsKKwkJYXJnc1sxXSA9IGFwbW1vZGU7IC8qIHNlY3RvciBjb3VudCByZWdpc3RlciAxLTI1NSAqLworCQlwcmludGYoIiBzZXR0aW5nIEFQTSBsZXZlbCB0byAlcyAweCUwMmxYICglbGQpXG4iLAorCQkJKGFwbW1vZGUgPT0gMjU1KSA/ICJkaXNhYmxlZCIgOiAiIiwKKwkJCWFwbW1vZGUsIGFwbW1vZGUpOworCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX0RSSVZFX0NNRCwgJmFyZ3MpOworCQlhcmdzWzFdID0gMDsKKwl9CisJaWYgKGdldHNldF93Y2FjaGUgPT0gSVNfU0VUKSB7CisjaWZkZWYgRE9fRkxVU0hDQUNIRQorI2lmbmRlZiBXSU5fRkxVU0hDQUNIRQorI2RlZmluZSBXSU5fRkxVU0hDQUNIRSAweGU3CisjZW5kaWYKKyNlbmRpZiAvKiBET19GTFVTSENBQ0hFICovCisJCWFyZ3NbMl0gPSB3Y2FjaGUgPyAweDAyIDogMHg4MjsKKwkJcHJpbnRfZmxhZ19vbl9vZmYoZ2V0c2V0X3djYWNoZSwgImRyaXZlIHdyaXRlLWNhY2hpbmciLCB3Y2FjaGUpOworI2lmZGVmIERPX0ZMVVNIQ0FDSEUKKwkJaWYgKCF3Y2FjaGUpCisJCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX0RSSVZFX0NNRCwgJmZsdXNoY2FjaGUpOworI2VuZGlmIC8qIERPX0ZMVVNIQ0FDSEUgKi8KKwkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19EUklWRV9DTUQsICZhcmdzKTsKKyNpZmRlZiBET19GTFVTSENBQ0hFCisJCWlmICghd2NhY2hlKQorCQkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19EUklWRV9DTUQsICZmbHVzaGNhY2hlKTsKKyNlbmRpZiAvKiBET19GTFVTSENBQ0hFICovCisJfQorCisJLyogSW4gY29kZSBiZWxvdywgd2UgZG8gbm90IHByZXNlcnZlIGFyZ3NbMF0sIGJ1dCB0aGUgcmVzdAorCSAgIGlzIHByZXNlcnZlZCwgaW5jbHVkaW5nIGFyZ3NbMl0gKi8KKwlhcmdzWzJdID0gMDsKKworCWlmIChzZXRfc3RhbmRieW5vdykgeworI2lmbmRlZiBXSU5fU1RBTkRCWU5PVzEKKyNkZWZpbmUgV0lOX1NUQU5EQllOT1cxIDB4RTAKKyNlbmRpZgorI2lmbmRlZiBXSU5fU1RBTkRCWU5PVzIKKyNkZWZpbmUgV0lOX1NUQU5EQllOT1cyIDB4OTQKKyNlbmRpZgorCQlwdXRzKCIgaXNzdWluZyBzdGFuZGJ5IGNvbW1hbmQiKTsKKwkJYXJnc1swXSA9IFdJTl9TVEFOREJZTk9XMTsKKwkJaW9jdGxfYWx0X29yX3dhcm4oSERJT19EUklWRV9DTUQsIGFyZ3MsIFdJTl9TVEFOREJZTk9XMik7CisJfQorCWlmIChzZXRfc2xlZXBub3cpIHsKKyNpZm5kZWYgV0lOX1NMRUVQTk9XMQorI2RlZmluZSBXSU5fU0xFRVBOT1cxIDB4RTYKKyNlbmRpZgorI2lmbmRlZiBXSU5fU0xFRVBOT1cyCisjZGVmaW5lIFdJTl9TTEVFUE5PVzIgMHg5OQorI2VuZGlmCisJCXB1dHMoIiBpc3N1aW5nIHNsZWVwIGNvbW1hbmQiKTsKKwkJYXJnc1swXSA9IFdJTl9TTEVFUE5PVzE7CisJCWlvY3RsX2FsdF9vcl93YXJuKEhESU9fRFJJVkVfQ01ELCBhcmdzLCBXSU5fU0xFRVBOT1cyKTsKKwl9CisJaWYgKHNldF9zZWFnYXRlKSB7CisJCWFyZ3NbMF0gPSAweGZiOworCQlwdXRzKCIgZGlzYWJsaW5nIFNlYWdhdGUgYXV0byBwb3dlcnNhdmluZyBtb2RlIik7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fRFJJVkVfQ01ELCAmYXJncyk7CisJfQorCWlmIChnZXRzZXRfc3RhbmRieSA9PSBJU19TRVQpIHsKKwkJYXJnc1swXSA9IFdJTl9TRVRJRExFMTsKKwkJYXJnc1sxXSA9IHN0YW5kYnlfcmVxdWVzdGVkOworCQlwcmludF9mbGFnKDEsICJzdGFuZGJ5Iiwgc3RhbmRieV9yZXF1ZXN0ZWQpOworCQlpbnRlcnByZXRfc3RhbmRieShzdGFuZGJ5X3JlcXVlc3RlZCk7CisJCWlvY3RsX29yX3dhcm4oZmQsIEhESU9fRFJJVkVfQ01ELCAmYXJncyk7CisJCWFyZ3NbMV0gPSAwOworCX0KKyNlbHNlCS8qIEhESU9fRFJJVkVfQ01EICovCisJaWYgKGZvcmNlX29wZXJhdGlvbikgeworCQljaGFyIGJ1Zls1MTJdOworCQlmbHVzaF9idWZmZXJfY2FjaGUoKTsKKwkJaWYgKC0xID09IHJlYWQoZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZikpKQorCQkJYmJfcGVycm9yX21zZygicmVhZCBvZiA1MTIgYnl0ZXMgZmFpbGVkIik7CisJfQorI2VuZGlmICAvKiBIRElPX0RSSVZFX0NNRCAqLworCWlmIChnZXRzZXRfbXVsdCB8fCBnZXRfaWRlbnRpdHkpIHsKKwkJbXVsdGNvdW50ID0gLTE7CisJCWlmIChpb2N0bChmZCwgSERJT19HRVRfTVVMVENPVU5ULCAmbXVsdGNvdW50KSkgeworCQkJLyogVG8gYmUgY29oZXJlbnQgd2l0aCBpb2N0bF9vcl93YXJuLiAqLworCQkJaWYgKGdldHNldF9tdWx0ICYmIEVOQUJMRV9JT0NUTF9IRVgyU1RSX0VSUk9SKQorCQkJCWJiX3BlcnJvcl9tc2coIkhESU9fR0VUX01VTFRDT1VOVCIpOworCQkJZWxzZQorCQkJCWJiX3BlcnJvcl9tc2coImlvY3RsICUjeCBmYWlsZWQiLCBIRElPX0dFVF9NVUxUQ09VTlQpOworCQl9IGVsc2UgaWYgKGdldHNldF9tdWx0KSB7CisJCQlwcmludGYoZm10LCAibXVsdGNvdW50IiwgbXVsdGNvdW50KTsKKwkJCW9uX29mZihtdWx0Y291bnQgIT0gMCk7CisJCX0KKwl9CisJaWYgKGdldHNldF9pbzMyYml0KSB7CisJCWlmICghaW9jdGxfb3Jfd2FybihmZCwgSERJT19HRVRfMzJCSVQsICZwYXJtKSkgeworCQkJcHJpbnRmKCIgSU9fc3VwcG9ydFx0PSUzbGQgKCIsIHBhcm0pOworCQkJaWYgKHBhcm0gPT0gMCkKKwkJCQlwdXRzKCJkZWZhdWx0IDE2LWJpdCkiKTsKKwkJCWVsc2UgaWYgKHBhcm0gPT0gMikKKwkJCQlwdXRzKCIxNi1iaXQpIik7CisJCQllbHNlIGlmIChwYXJtID09IDEpCisJCQkJcHV0cygiMzItYml0KSIpOworCQkJZWxzZSBpZiAocGFybSA9PSAzKQorCQkJCXB1dHMoIjMyLWJpdCB3L3N5bmMpIik7CisJCQllbHNlIGlmIChwYXJtID09IDgpCisJCQkJcHV0cygiUmVxdWVzdC1RdWV1ZS1CeXBhc3MpIik7CisJCQllbHNlCisJCQkJcHV0cygiXD9cP1w/KSIpOworCQl9CisJfQorCWlmIChnZXRzZXRfdW5tYXNrKSB7CisJCWlmICghaW9jdGxfb3Jfd2FybihmZCwgSERJT19HRVRfVU5NQVNLSU5UUiwgJnBhcm0pKQorCQkJcHJpbnRfdmFsdWVfb25fb2ZmKCJ1bm1hc2tpcnEiLCBwYXJtKTsKKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fR0VUU0VUX0RNQQorCWlmIChnZXRzZXRfZG1hKSB7CisJCWlmICghaW9jdGxfb3Jfd2FybihmZCwgSERJT19HRVRfRE1BLCAmcGFybSkpIHsKKwkJCXByaW50ZihmbXQsICJ1c2luZ19kbWEiLCBwYXJtKTsKKwkJCWlmIChwYXJtID09IDgpCisJCQkJcHV0cygiIChETUEtQXNzaXN0ZWQtUElPKSIpOworCQkJZWxzZQorCQkJCW9uX29mZihwYXJtICE9IDApOworCQl9CisJfQorI2VuZGlmCisjaWZkZWYgSERJT19HRVRfUURNQQorCWlmIChnZXRzZXRfZG1hX3EpIHsKKwkJaWYgKCFpb2N0bF9vcl93YXJuKGZkLCBIRElPX0dFVF9RRE1BLCAmcGFybSkpCisJCQlwcmludF92YWx1ZV9vbl9vZmYoInF1ZXVlX2RlcHRoIiwgcGFybSk7CisJfQorI2VuZGlmCisJaWYgKGdldHNldF9rZWVwKSB7CisJCWlmICghaW9jdGxfb3Jfd2FybihmZCwgSERJT19HRVRfS0VFUFNFVFRJTkdTLCAmcGFybSkpCisJCQlwcmludF92YWx1ZV9vbl9vZmYoImtlZXBzZXR0aW5ncyIsIHBhcm0pOworCX0KKwlpZiAoZ2V0c2V0X25vd2VycikgeworCQlpZiAoIWlvY3RsX29yX3dhcm4oZmQsIEhESU9fR0VUX05PV0VSUiwgJnBhcm0pKQorCQkJcHJpbnRfdmFsdWVfb25fb2ZmKCJub3dlcnIiLCBwYXJtKTsKKwl9CisJaWYgKGdldHNldF9yZWFkb25seSkgeworCQlpZiAoIWlvY3RsX29yX3dhcm4oZmQsIEJMS1JPR0VULCAmcGFybSkpCisJCQlwcmludF92YWx1ZV9vbl9vZmYoInJlYWRvbmx5IiwgcGFybSk7CisJfQorCWlmIChnZXRzZXRfcmVhZGFoZWFkKSB7CisJCWlmICghaW9jdGxfb3Jfd2FybihmZCwgQkxLUkFHRVQsICZwYXJtKSkKKwkJCXByaW50X3ZhbHVlX29uX29mZigicmVhZGFoZWFkIiwgcGFybSk7CisJfQorCWlmIChnZXRfZ2VvbSkgeworCQlpZiAoIWlvY3RsX29yX3dhcm4oZmQsIEJMS0dFVFNJWkUsICZwYXJtKSkgeworCQkJc3RydWN0IGhkX2dlb21ldHJ5IGc7CisKKwkJCWlmICghaW9jdGxfb3Jfd2FybihmZCwgSERJT19HRVRHRU8sICZnKSkKKwkJCQlwcmludGYoIiBnZW9tZXRyeVx0PSAldS8ldS8ldSwgc2VjdG9ycyA9ICVsZCwgc3RhcnQgPSAlbGRcbiIsCisJCQkJCWcuY3lsaW5kZXJzLCBnLmhlYWRzLCBnLnNlY3RvcnMsIHBhcm0sIGcuc3RhcnQpOworCQl9CisJfQorI2lmZGVmIEhESU9fRFJJVkVfQ01ECisJaWYgKGdldF9wb3dlcm1vZGUpIHsKKyNpZm5kZWYgV0lOX0NIRUNLUE9XRVJNT0RFMQorI2RlZmluZSBXSU5fQ0hFQ0tQT1dFUk1PREUxIDB4RTUKKyNlbmRpZgorI2lmbmRlZiBXSU5fQ0hFQ0tQT1dFUk1PREUyCisjZGVmaW5lIFdJTl9DSEVDS1BPV0VSTU9ERTIgMHg5OAorI2VuZGlmCisJCWNvbnN0IGNoYXIgKnN0YXRlOworCisJCWFyZ3NbMF0gPSBXSU5fQ0hFQ0tQT1dFUk1PREUxOworCQlpZiAoaW9jdGxfYWx0X29yX3dhcm4oSERJT19EUklWRV9DTUQsIGFyZ3MsIFdJTl9DSEVDS1BPV0VSTU9ERTIpKSB7CisJCQlpZiAoZXJybm8gIT0gRUlPIHx8IGFyZ3NbMF0gIT0gMCB8fCBhcmdzWzFdICE9IDApCisJCQkJc3RhdGUgPSAidW5rbm93biI7CisJCQllbHNlCisJCQkJc3RhdGUgPSAic2xlZXBpbmciOworCQl9IGVsc2UKKwkJCXN0YXRlID0gKGFyZ3NbMl0gPT0gMjU1KSA/ICJhY3RpdmUvaWRsZSIgOiAic3RhbmRieSI7CisJCWFyZ3NbMV0gPSBhcmdzWzJdID0gMDsKKworCQlwcmludGYoIiBkcml2ZSBzdGF0ZSBpczogICVzXG4iLCBzdGF0ZSk7CisJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fRFJJVkVfUkVTRVQKKwlpZiAocGVyZm9ybV9yZXNldCkgeworCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX0RSSVZFX1JFU0VULCBOVUxMKTsKKwl9CisjZW5kaWYgLyogRkVBVFVSRV9IRFBBUk1fSERJT19EUklWRV9SRVNFVCAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0hEUEFSTV9IRElPX1RSSVNUQVRFX0hXSUYKKwlpZiAocGVyZm9ybV90cmlzdGF0ZSkgeworCQlhcmdzWzBdID0gMDsKKwkJYXJnc1sxXSA9IHRyaXN0YXRlOworCQlpb2N0bF9vcl93YXJuKGZkLCBIRElPX1RSSVNUQVRFX0hXSUYsICZhcmdzKTsKKwl9CisjZW5kaWYgLyogRkVBVFVSRV9IRFBBUk1fSERJT19UUklTVEFURV9IV0lGICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0dFVF9JREVOVElUWQorCWlmIChnZXRfaWRlbnRpdHkpIHsKKwkJc3RydWN0IGhkX2RyaXZlaWQgaWQ7CisKKwkJaWYgKCFpb2N0bChmZCwgSERJT19HRVRfSURFTlRJVFksICZpZCkpCXsKKwkJCWlmIChtdWx0Y291bnQgIT0gLTEpIHsKKwkJCQlpZC5tdWx0c2VjdCA9IG11bHRjb3VudDsKKwkJCQlpZC5tdWx0c2VjdF92YWxpZCB8PSAxOworCQkJfSBlbHNlCisJCQkJaWQubXVsdHNlY3RfdmFsaWQgJj0gfjE7CisJCQlkdW1wX2lkZW50aXR5KCZpZCk7CisJCX0gZWxzZSBpZiAoZXJybm8gPT0gLUVOT01TRykKKwkJCXB1dHMoIiBubyBpZGVudGlmaWNhdGlvbiBpbmZvIGF2YWlsYWJsZSIpOworCQllbHNlIGlmIChFTkFCTEVfSU9DVExfSEVYMlNUUl9FUlJPUikgIC8qIFRvIGJlIGNvaGVyZW50IHdpdGggaW9jdGxfb3Jfd2FybiAqLworCQkJYmJfcGVycm9yX21zZygiSERJT19HRVRfSURFTlRJVFkiKTsKKwkJZWxzZQorCQkJYmJfcGVycm9yX21zZygiaW9jdGwgJSN4IGZhaWxlZCIsIEhESU9fR0VUX0lERU5USVRZKTsKKwl9CisKKwlpZiAoZ2V0X0lEZW50aXR5KSB7CisJCXVuc2lnbmVkIGNoYXIgYXJnczFbNCs1MTJdOyAvKiA9IHsgLi4uIH0gd2lsbCBlYXQgMC41ayBvZiByb2RhdGEhICovCisKKwkJbWVtc2V0KGFyZ3MxLCAwLCBzaXplb2YoYXJnczEpKTsKKwkJYXJnczFbMF0gPSBXSU5fSURFTlRJRlk7CisJCWFyZ3MxWzNdID0gMTsKKwkJaWYgKCFpb2N0bF9hbHRfb3Jfd2FybihIRElPX0RSSVZFX0NNRCwgYXJnczEsIFdJTl9QSURFTlRJRlkpKQorCQkJaWRlbnRpZnkoKHZvaWQgKikoYXJnczEgKyA0KSk7CisJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRgorCWlmIChnZXRzZXRfYnVzc3RhdGUgPT0gSVNfU0VUKSB7CisJCXByaW50X2ZsYWcoMSwgImJ1cyBzdGF0ZSIsIGJ1c3N0YXRlKTsKKwkJYnVzX3N0YXRlX3ZhbHVlKGJ1c3N0YXRlKTsKKwkJaW9jdGxfb3Jfd2FybihmZCwgSERJT19TRVRfQlVTU1RBVEUsIChpbnQgKikodW5zaWduZWQgbG9uZylidXNzdGF0ZSk7CisJfQorCWlmIChnZXRzZXRfYnVzc3RhdGUpIHsKKwkJaWYgKCFpb2N0bF9vcl93YXJuKGZkLCBIRElPX0dFVF9CVVNTVEFURSwgJnBhcm0pKSB7CisJCQlwcmludGYoZm10LCAiYnVzIHN0YXRlIiwgcGFybSk7CisJCQlidXNfc3RhdGVfdmFsdWUocGFybSk7CisJCX0KKwl9CisjZW5kaWYKKwlpZiAocmVyZWFkX3BhcnRuKQorCQlpb2N0bF9vcl93YXJuKGZkLCBCTEtSUlBBUlQsIE5VTEwpOworCisJaWYgKGRvX2N0aW1pbmdzKQorCQlkb190aW1lKDEgLyosZmQqLyk7IC8qIHRpbWUgY2FjaGUgKi8KKwlpZiAoZG9fdGltaW5ncykKKwkJZG9fdGltZSgwIC8qLGZkKi8pOyAvKiB0aW1lIGRldmljZSAqLworCWlmIChkb19mbHVzaCkKKwkJZmx1c2hfYnVmZmVyX2NhY2hlKCk7CisJY2xvc2UoZmQpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSERQQVJNX0dFVF9JREVOVElUWQorc3RhdGljIGludCBmcm9taGV4KHVuc2lnbmVkIGNoYXIgYykKK3sKKwlpZiAoaXNkaWdpdChjKSkKKwkJcmV0dXJuIChjIC0gJzAnKTsKKwlpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisJCXJldHVybiAoYyAtICgnYScgLSAxMCkpOworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgY2hhcjogJyVjJyAweCUwMngiLCBjLCBjKTsKK30KKworc3RhdGljIHZvaWQgaWRlbnRpZnlfZnJvbV9zdGRpbih2b2lkKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGlkZW50aWZ5X2Zyb21fc3RkaW4odm9pZCkKK3sKKwl1aW50MTZfdCBzYnVmWzI1Nl07CisJdW5zaWduZWQgY2hhciBidWZbMTI4MF07CisJdW5zaWduZWQgY2hhciAqYiA9ICh1bnNpZ25lZCBjaGFyICopYnVmOworCWludCBpOworCisJeHJlYWQoU1RESU5fRklMRU5PLCBidWYsIDEyODApOworCisJLy8gQ29udmVydCB0aGUgbmV3bGluZS1zZXBhcmF0ZWQgaGV4IGRhdGEgaW50byBhbiBpZGVudGlmeSBibG9jay4KKworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkrKykgeworCQlpbnQgajsKKwkJZm9yIChqID0gMDsgaiA8IDQ7IGorKykKKwkJCXNidWZbaV0gPSAoc2J1ZltpXSA8PCA0KSArIGZyb21oZXgoKihiKyspKTsKKwl9CisKKwkvLyBQYXJzZSB0aGUgZGF0YS4KKworCWlkZW50aWZ5KHNidWYpOworfQorI2Vsc2UKK3ZvaWQgaWRlbnRpZnlfZnJvbV9zdGRpbih2b2lkKTsKKyNlbmRpZgorCisvKiBidXN5Ym94IHNwZWNpZmljIHN0dWZmICovCitzdGF0aWMgaW50IHBhcnNlX29wdHModW5zaWduZWQgbG9uZyAqdmFsdWUsIGludCBtaW4sIGludCBtYXgpCit7CisJaWYgKG9wdGFyZykgeworCQkqdmFsdWUgPSB4YXRvbF9yYW5nZShvcHRhcmcsIG1pbiwgbWF4KTsKKwkJcmV0dXJuIElTX1NFVDsKKwl9CisJcmV0dXJuIElTX0dFVDsKK30KK3N0YXRpYyBpbnQgcGFyc2Vfb3B0c18wX21heCh1bnNpZ25lZCBsb25nICp2YWx1ZSwgaW50IG1heCkKK3sKKwlyZXR1cm4gcGFyc2Vfb3B0cyh2YWx1ZSwgMCwgbWF4KTsKK30KK3N0YXRpYyBpbnQgcGFyc2Vfb3B0c18wXzEodW5zaWduZWQgbG9uZyAqdmFsdWUpCit7CisJcmV0dXJuIHBhcnNlX29wdHModmFsdWUsIDAsIDEpOworfQorc3RhdGljIGludCBwYXJzZV9vcHRzXzBfSU5UTUFYKHVuc2lnbmVkIGxvbmcgKnZhbHVlKQoreworCXJldHVybiBwYXJzZV9vcHRzKHZhbHVlLCAwLCBJTlRfTUFYKTsKK30KKworc3RhdGljIHZvaWQgcGFyc2VfeGZlcm1vZGUoaW50IGZsYWcsIHNtYWxsaW50ICpnZXQsIHNtYWxsaW50ICpzZXQsIGludCAqdmFsdWUpCit7CisJaWYgKGZsYWcpIHsKKwkJKmdldCA9IElTX0dFVDsKKwkJaWYgKG9wdGFyZykgeworCQkJKnZhbHVlID0gdHJhbnNsYXRlX3hmZXJtb2RlKG9wdGFyZyk7CisJCQkqc2V0ID0gKCp2YWx1ZSA+IC0xKTsKKwkJfQorCX0KK30KKworLyotLS0tLS0tIGdldG9wdCBzaG9ydCBvcHRpb25zIC0tLS0tLS0tKi8KK3N0YXRpYyBjb25zdCBjaGFyIGhkcGFybV9vcHRpb25zW10gQUxJR04xID0KKwkiZ2Z1OjpuOjpwOnI6Om06OmM6Oms6OmE6OkI6dFQiCisJSUZfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZKCJpSSIpCisJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19HRVRTRVRfRE1BKCJkOjoiKQorI2lmZGVmIEhESU9fRFJJVkVfQ01ECisJIlM6RDpQOlg6SzpBOkw6VzpDeVl6WiIKKyNlbmRpZgorCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fVU5SRUdJU1RFUl9IV0lGKCJVOiIpCisjaWZkZWYgSERJT19HRVRfUURNQQorI2lmZGVmIEhESU9fU0VUX1FETUEKKwkiUToiCisjZWxzZQorCSJRIgorI2VuZGlmCisjZW5kaWYKKwlJRl9GRUFUVVJFX0hEUEFSTV9IRElPX0RSSVZFX1JFU0VUKCJ3IikKKwlJRl9GRUFUVVJFX0hEUEFSTV9IRElPX1RSSVNUQVRFX0hXSUYoIng6OmI6IikKKwlJRl9GRUFUVVJFX0hEUEFSTV9IRElPX1NDQU5fSFdJRigiUjoiKTsKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qIG91ciBtYWluKCkgcm91dGluZTogKi8KK2ludCBoZHBhcm1fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGhkcGFybV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgYzsKKwlpbnQgZmxhZ2NvdW50ID0gMDsKKworCUlOSVRfRygpOworCisJd2hpbGUgKChjID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIGhkcGFybV9vcHRpb25zKSkgPj0gMCkgeworCQlmbGFnY291bnQrKzsKKwkJSUZfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZKGdldF9JRGVudGl0eSB8PSAoYyA9PSAnSScpKTsKKwkJSUZfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZKGdldF9pZGVudGl0eSB8PSAoYyA9PSAnaScpKTsKKwkJZ2V0X2dlb20gfD0gKGMgPT0gJ2cnKTsKKwkJZG9fZmx1c2ggfD0gKGMgPT0gJ2YnKTsKKwkJaWYgKGMgPT0gJ3UnKSBnZXRzZXRfdW5tYXNrICAgID0gcGFyc2Vfb3B0c18wXzEoJnVubWFzayk7CisJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19HRVRTRVRfRE1BKAorCQlpZiAoYyA9PSAnZCcpIGdldHNldF9kbWEgICAgICAgPSBwYXJzZV9vcHRzXzBfbWF4KCZkbWEsIDkpOworCSkKKwkJaWYgKGMgPT0gJ24nKSBnZXRzZXRfbm93ZXJyICAgID0gcGFyc2Vfb3B0c18wXzEoJm5vd2Vycik7CisJCXBhcnNlX3hmZXJtb2RlKChjID09ICdwJyksICZub2lzeV9waW9tb2RlLCAmc2V0X3Bpb21vZGUsICZwaW9tb2RlKTsKKwkJaWYgKGMgPT0gJ3InKSBnZXRzZXRfcmVhZG9ubHkgID0gcGFyc2Vfb3B0c18wXzEoJnJlYWRvbmx5KTsKKwkJaWYgKGMgPT0gJ20nKSBnZXRzZXRfbXVsdCAgICAgID0gcGFyc2Vfb3B0c18wX0lOVE1BWCgmbXVsdCAvKjMyKi8pOworCQlpZiAoYyA9PSAnYycpIGdldHNldF9pbzMyYml0ICAgPSBwYXJzZV9vcHRzXzBfSU5UTUFYKCZpbzMyYml0IC8qOCovKTsKKwkJaWYgKGMgPT0gJ2snKSBnZXRzZXRfa2VlcCAgICAgID0gcGFyc2Vfb3B0c18wXzEoJmtlZXApOworCQlpZiAoYyA9PSAnYScpIGdldHNldF9yZWFkYWhlYWQgPSBwYXJzZV9vcHRzXzBfSU5UTUFYKCZYcmVhZGFoZWFkKTsKKwkJaWYgKGMgPT0gJ0InKSBnZXRzZXRfYXBtbW9kZSAgID0gcGFyc2Vfb3B0cygmYXBtbW9kZSwgMSwgMjU1KTsKKwkJZG9fZmx1c2ggfD0gZG9fdGltaW5ncyB8PSAoYyA9PSAndCcpOworCQlkb19mbHVzaCB8PSBkb19jdGltaW5ncyB8PSAoYyA9PSAnVCcpOworI2lmZGVmIEhESU9fRFJJVkVfQ01ECisJCWlmIChjID09ICdTJykgZ2V0c2V0X3N0YW5kYnkgID0gcGFyc2Vfb3B0c18wX21heCgmc3RhbmRieV9yZXF1ZXN0ZWQsIDI1NSk7CisJCWlmIChjID09ICdEJykgZ2V0c2V0X2RlZmVjdHMgID0gcGFyc2Vfb3B0c18wX0lOVE1BWCgmZGVmZWN0cyk7CisJCWlmIChjID09ICdQJykgZ2V0c2V0X3ByZWZldGNoID0gcGFyc2Vfb3B0c18wX0lOVE1BWCgmcHJlZmV0Y2gpOworCQlwYXJzZV94ZmVybW9kZSgoYyA9PSAnWCcpLCAmZ2V0X3hmZXJtb2RlLCAmc2V0X3hmZXJtb2RlLCAmeGZlcm1vZGVfcmVxdWVzdGVkKTsKKwkJaWYgKGMgPT0gJ0snKSBnZXRzZXRfZGtlZXAgICAgID0gcGFyc2Vfb3B0c18wXzEoJnByZWZldGNoKTsKKwkJaWYgKGMgPT0gJ0EnKSBnZXRzZXRfbG9va2FoZWFkID0gcGFyc2Vfb3B0c18wXzEoJmxvb2thaGVhZCk7CisJCWlmIChjID09ICdMJykgZ2V0c2V0X2Rvb3Jsb2NrICA9IHBhcnNlX29wdHNfMF8xKCZkb29ybG9jayk7CisJCWlmIChjID09ICdXJykgZ2V0c2V0X3djYWNoZSAgICA9IHBhcnNlX29wdHNfMF8xKCZ3Y2FjaGUpOworCQlnZXRfcG93ZXJtb2RlIHw9IChjID09ICdDJyk7CisJCXNldF9zdGFuZGJ5bm93IHw9IChjID09ICd5Jyk7CisJCXNldF9zbGVlcG5vdyB8PSAoYyA9PSAnWScpOworCQlyZXJlYWRfcGFydG4gfD0gKGMgPT0gJ3onKTsKKwkJc2V0X3NlYWdhdGUgfD0gKGMgPT0gJ1onKTsKKyNlbmRpZgorCQlJRl9GRUFUVVJFX0hEUEFSTV9IRElPX1VOUkVHSVNURVJfSFdJRihpZiAoYyA9PSAnVScpIHVucmVnaXN0ZXJfaHdpZiA9IHBhcnNlX29wdHNfMF9JTlRNQVgoJmh3aWYpKTsKKyNpZmRlZiBIRElPX0dFVF9RRE1BCisJCWlmIChjID09ICdRJykgeworCQkJZ2V0c2V0X2RtYV9xID0gcGFyc2Vfb3B0c18wX0lOVE1BWCgmZG1hX3EpOworCQl9CisjZW5kaWYKKwkJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19EUklWRV9SRVNFVChwZXJmb3JtX3Jlc2V0ID0gKGMgPT0gJ3InKSk7CisJCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fVFJJU1RBVEVfSFdJRihpZiAoYyA9PSAneCcpIHBlcmZvcm1fdHJpc3RhdGUgPSBwYXJzZV9vcHRzXzBfMSgmdHJpc3RhdGUpKTsKKwkJSUZfRkVBVFVSRV9IRFBBUk1fSERJT19UUklTVEFURV9IV0lGKGlmIChjID09ICdiJykgZ2V0c2V0X2J1c3N0YXRlID0gcGFyc2Vfb3B0c18wX21heCgmYnVzc3RhdGUsIDIpKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9IRFBBUk1fSERJT19TQ0FOX0hXSUYKKwkJaWYgKGMgPT0gJ1InKSB7CisJCQlzY2FuX2h3aWYgPSBwYXJzZV9vcHRzXzBfSU5UTUFYKCZod2lmX2RhdGEpOworCQkJaHdpZl9jdHJsID0geGF0b2lfcG9zaXRpdmUoKGFyZ3Zbb3B0aW5kXSkgPyBhcmd2W29wdGluZF0gOiAiIik7CisJCQlod2lmX2lycSAgPSB4YXRvaV9wb3NpdGl2ZSgoYXJndltvcHRpbmQrMV0pID8gYXJndltvcHRpbmQrMV0gOiAiIik7CisJCQkvKiBNb3ZlIHBhc3QgdGhlIDIgYWRkaXRpb25hbCBhcmd1bWVudHMgKi8KKwkJCWFyZ3YgKz0gMjsKKwkJCWFyZ2MgLT0gMjsKKwkJfQorI2VuZGlmCisJfQorCS8qIFdoZW4gbm8gZmxhZ3MgYXJlIGdpdmVuIChmbGFnY291bnQgPSAwKSwgLWFjZGdrbW5ydSBpcyBhc3N1bWVkLiAqLworCWlmICghZmxhZ2NvdW50KSB7CisJCWdldHNldF9tdWx0ID0gZ2V0c2V0X2lvMzJiaXQgPSBnZXRzZXRfdW5tYXNrID0gZ2V0c2V0X2tlZXAgPSBnZXRzZXRfcmVhZG9ubHkgPSBnZXRzZXRfcmVhZGFoZWFkID0gZ2V0X2dlb20gPSBJU19HRVQ7CisJCUlGX0ZFQVRVUkVfSERQQVJNX0hESU9fR0VUU0VUX0RNQShnZXRzZXRfZG1hID0gSVNfR0VUKTsKKwl9CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoISphcmd2KSB7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9IRFBBUk1fR0VUX0lERU5USVRZICYmICFpc2F0dHkoU1RESU5fRklMRU5PKSkKKwkJCWlkZW50aWZ5X2Zyb21fc3RkaW4oKTsgLyogRVhJVCAqLworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJZG8geworCQlwcm9jZXNzX2RldigqYXJndisrKTsKKwl9IHdoaWxlICgqYXJndik7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL2kyY190b29scy5jIGIvbWlzY3V0aWxzL2kyY190b29scy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3N2U2YmEKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvaTJjX3Rvb2xzLmMKQEAgLTAsMCArMSwxMzMzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pbWFsIGkyYy10b29scyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveC4KKyAqIFBhcnRzIG9mIGNvZGUgcG9ydGVkIGZyb20gaTJjLXRvb2xzOgorICogCQlodHRwOi8vd3d3LmxtLXNlbnNvcnMub3JnL3dpa2kvSTJDVG9vbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDE0IGJ5IEJhcnRvc3ogR29sYXN6ZXdza2kgPGJhcnRla2dvbGFAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9jb25maWc6Y29uZmlnIEkyQ0dFVAorLy9jb25maWc6CWJvb2wgImkyY2dldCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglzZWxlY3QgUExBVEZPUk1fTElOVVgKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBSZWFkIGZyb20gSTJDL1NNQnVzIGNoaXAgcmVnaXN0ZXJzLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgSTJDU0VUCisvL2NvbmZpZzoJYm9vbCAiaTJjc2V0IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CXNlbGVjdCBQTEFURk9STV9MSU5VWAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFNldCBJMkMgcmVnaXN0ZXJzLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgSTJDRFVNUAorLy9jb25maWc6CWJvb2wgImkyY2R1bXAiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRXhhbWluZSBJMkMgcmVnaXN0ZXJzLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgSTJDREVURUNUCisvL2NvbmZpZzoJYm9vbCAiaTJjZGV0ZWN0IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CXNlbGVjdCBQTEFURk9STV9MSU5VWAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIERldGVjdCBJMkMgY2hpcHMuCisvL2NvbmZpZzoKKworLy9hcHBsZXQ6SUZfSTJDR0VUKEFQUExFVChpMmNnZXQsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8vYXBwbGV0OklGX0kyQ1NFVChBUFBMRVQoaTJjc2V0LCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisvL2FwcGxldDpJRl9JMkNEVU1QKEFQUExFVChpMmNkdW1wLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisvL2FwcGxldDpJRl9JMkNERVRFQ1QoQVBQTEVUKGkyY2RldGVjdCwgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfSTJDR0VUKSArPSBpMmNfdG9vbHMubworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0kyQ1NFVCkgKz0gaTJjX3Rvb2xzLm8KKy8va2J1aWxkOmxpYi0kKENPTkZJR19JMkNEVU1QKSArPSBpMmNfdG9vbHMubworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0kyQ0RFVEVDVCkgKz0gaTJjX3Rvb2xzLm8KKworLyoKKyAqIFVuc3VwcG9ydGVkIHN0dWZmOgorICoKKyAqIC0gdXBzdHJlYW0gaTJjLXRvb2xzIGNhbiBhbHNvIGxvb2stdXAgaTJjIGJ1c3NlcyBieSBuYW1lLCB3ZSBvbmx5IGFjY2VwdAorICogICBudW1iZXJzLAorICogLSBiYW5rIGFuZCBiYW5rcmVnIHBhcmFtZXRlcnMgZm9yIGkyY2R1bXAgYXJlIG5vdCBzdXBwb3J0ZWQgYmVjYXVzZSBvZgorICogICB0aGVpciBsaW1pdGVkIHVzZWZ1bG5lc3MgKHNlZSBpMmNkdW1wIG1hbnVhbCBlbnRyeSBmb3IgbW9yZSBpbmZvKSwKKyAqIC0gaTJjZGV0ZWN0IGRvZXNuJ3QgbG9vayBmb3IgYnVzIGluZm8gaW4gL3Byb2MgYXMgaXQgZG9lcyBpbiB1cHN0cmVhbSwgYnV0CisgKiAgIGl0IHNob3VsZG4ndCBiZSBhIHByb2JsZW0gaW4gbW9kZXJuIGtlcm5lbHMuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpbmNsdWRlIDxsaW51eC9pMmMuaD4KKyNpbmNsdWRlIDxsaW51eC9pMmMtZGV2Lmg+CisKKyNkZWZpbmUgSTJDRFVNUF9OVU1fUkVHUwkJMjU2CisKKyNkZWZpbmUgSTJDREVURUNUX01PREVfQVVUTwkJMAorI2RlZmluZSBJMkNERVRFQ1RfTU9ERV9RVUlDSwkJMQorI2RlZmluZSBJMkNERVRFQ1RfTU9ERV9SRUFECQkyCisKKy8qCisgKiBUaGlzIGlzIG5lZWRlZCBmb3IgaW9jdGxfb3JfcGVycm9yX2FuZF9kaWUoKSBzaW5jZSBpdCBvbmx5IGFjY2VwdHMgcG9pbnRlcnMuCisgKi8KK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHZvaWQgKml0b3B0cihpbnQgaSkKK3sKKwlyZXR1cm4gKHZvaWQqKShpbnRwdHJfdClpOworfQorCitzdGF0aWMgaW50MzJfdCBpMmNfc21idXNfYWNjZXNzKGludCBmZCwgY2hhciByZWFkX3dyaXRlLCB1aW50OF90IGNtZCwKKwkJCQlpbnQgc2l6ZSwgdW5pb24gaTJjX3NtYnVzX2RhdGEgKmRhdGEpCit7CisJc3RydWN0IGkyY19zbWJ1c19pb2N0bF9kYXRhIGFyZ3M7CisKKwlhcmdzLnJlYWRfd3JpdGUgPSByZWFkX3dyaXRlOworCWFyZ3MuY29tbWFuZCA9IGNtZDsKKwlhcmdzLnNpemUgPSBzaXplOworCWFyZ3MuZGF0YSA9IGRhdGE7CisKKwlyZXR1cm4gaW9jdGwoZmQsIEkyQ19TTUJVUywgJmFyZ3MpOworfQorCitzdGF0aWMgaW50MzJfdCBpMmNfc21idXNfcmVhZF9ieXRlKGludCBmZCkKK3sKKwl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOworCWludCBlcnI7CisKKwllcnIgPSBpMmNfc21idXNfYWNjZXNzKGZkLCBJMkNfU01CVVNfUkVBRCwgMCwgSTJDX1NNQlVTX0JZVEUsICZkYXRhKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBkYXRhLmJ5dGU7Cit9CisKKyNpZiBFTkFCTEVfSTJDR0VUIHx8IEVOQUJMRV9JMkNTRVQgfHwgRU5BQkxFX0kyQ0RVTVAKK3N0YXRpYyBpbnQzMl90IGkyY19zbWJ1c193cml0ZV9ieXRlKGludCBmZCwgdWludDhfdCB2YWwpCit7CisJcmV0dXJuIGkyY19zbWJ1c19hY2Nlc3MoZmQsIEkyQ19TTUJVU19XUklURSwKKwkJCQl2YWwsIEkyQ19TTUJVU19CWVRFLCBOVUxMKTsKK30KKworc3RhdGljIGludDMyX3QgaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGludCBmZCwgdWludDhfdCBjbWQpCit7CisJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKKwlpbnQgZXJyOworCisJZXJyID0gaTJjX3NtYnVzX2FjY2VzcyhmZCwgSTJDX1NNQlVTX1JFQUQsIGNtZCwKKwkJCSAgICAgICBJMkNfU01CVVNfQllURV9EQVRBLCAmZGF0YSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlyZXR1cm4gZGF0YS5ieXRlOworfQorCitzdGF0aWMgaW50MzJfdCBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoaW50IGZkLCB1aW50OF90IGNtZCkKK3sKKwl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOworCWludCBlcnI7CisKKwllcnIgPSBpMmNfc21idXNfYWNjZXNzKGZkLCBJMkNfU01CVVNfUkVBRCwgY21kLAorCQkJICAgICAgIEkyQ19TTUJVU19XT1JEX0RBVEEsICZkYXRhKTsKKwlpZiAoZXJyIDwgMCkKKwkJcmV0dXJuIGVycjsKKworCXJldHVybiBkYXRhLndvcmQ7Cit9CisjZW5kaWYgLyogRU5BQkxFX0kyQ0dFVCB8fCBFTkFCTEVfSTJDU0VUIHx8IEVOQUJMRV9JMkNEVU1QICovCisKKyNpZiBFTkFCTEVfSTJDU0VUCitzdGF0aWMgaW50MzJfdCBpMmNfc21idXNfd3JpdGVfYnl0ZV9kYXRhKGludCBmaWxlLAorCQkJCQkgdWludDhfdCBjbWQsIHVpbnQ4X3QgdmFsdWUpCit7CisJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKKworCWRhdGEuYnl0ZSA9IHZhbHVlOworCisJcmV0dXJuIGkyY19zbWJ1c19hY2Nlc3MoZmlsZSwgSTJDX1NNQlVTX1dSSVRFLCBjbWQsCisJCQkJSTJDX1NNQlVTX0JZVEVfREFUQSwgJmRhdGEpOworfQorCitzdGF0aWMgaW50MzJfdCBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGludCBmaWxlLCB1aW50OF90IGNtZCwgdWludDE2X3QgdmFsdWUpCit7CisJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKKworCWRhdGEud29yZCA9IHZhbHVlOworCisJcmV0dXJuIGkyY19zbWJ1c19hY2Nlc3MoZmlsZSwgSTJDX1NNQlVTX1dSSVRFLCBjbWQsCisJCQkJSTJDX1NNQlVTX1dPUkRfREFUQSwgJmRhdGEpOworfQorCitzdGF0aWMgaW50MzJfdCBpMmNfc21idXNfd3JpdGVfYmxvY2tfZGF0YShpbnQgZmlsZSwgdWludDhfdCBjbWQsCisJCQkJICAgdWludDhfdCBsZW5ndGgsIGNvbnN0IHVpbnQ4X3QgKnZhbHVlcykKK3sKKwl1bmlvbiBpMmNfc21idXNfZGF0YSBkYXRhOworCisJaWYgKGxlbmd0aCA+IEkyQ19TTUJVU19CTE9DS19NQVgpCisJCWxlbmd0aCA9IEkyQ19TTUJVU19CTE9DS19NQVg7CisKKwltZW1jcHkoZGF0YS5ibG9jaysxLCB2YWx1ZXMsIGxlbmd0aCk7CisJZGF0YS5ibG9ja1swXSA9IGxlbmd0aDsKKworCXJldHVybiBpMmNfc21idXNfYWNjZXNzKGZpbGUsIEkyQ19TTUJVU19XUklURSwgY21kLAorCQkJCUkyQ19TTUJVU19CTE9DS19EQVRBLCAmZGF0YSk7Cit9CisKK3N0YXRpYyBpbnQzMl90IGkyY19zbWJ1c193cml0ZV9pMmNfYmxvY2tfZGF0YShpbnQgZmlsZSwgdWludDhfdCBjbWQsCisJCQkJICAgICAgIHVpbnQ4X3QgbGVuZ3RoLCBjb25zdCB1aW50OF90ICp2YWx1ZXMpCit7CisJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKKworCWlmIChsZW5ndGggPiBJMkNfU01CVVNfQkxPQ0tfTUFYKQorCQlsZW5ndGggPSBJMkNfU01CVVNfQkxPQ0tfTUFYOworCisJbWVtY3B5KGRhdGEuYmxvY2srMSwgdmFsdWVzLCBsZW5ndGgpOworCWRhdGEuYmxvY2tbMF0gPSBsZW5ndGg7CisKKwlyZXR1cm4gaTJjX3NtYnVzX2FjY2VzcyhmaWxlLCBJMkNfU01CVVNfV1JJVEUsIGNtZCwKKwkJCQlJMkNfU01CVVNfSTJDX0JMT0NLX0JST0tFTiwgJmRhdGEpOworfQorI2VuZGlmIC8qIEVOQUJMRV9JMkNTRVQgKi8KKworI2lmIEVOQUJMRV9JMkNEVU1QCisvKgorICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIHZhbHMgbXVzdCBob2xkIGF0CisgKiBsZWFzdCBJMkNfU01CVVNfQkxPQ0tfTUFYIGJ5dGVzLgorICovCitzdGF0aWMgaW50MzJfdCBpMmNfc21idXNfcmVhZF9ibG9ja19kYXRhKGludCBmZCwgdWludDhfdCBjbWQsIHVpbnQ4X3QgKnZhbHMpCit7CisJdW5pb24gaTJjX3NtYnVzX2RhdGEgZGF0YTsKKwlpbnQgaSwgZXJyOworCisJZXJyID0gaTJjX3NtYnVzX2FjY2VzcyhmZCwgSTJDX1NNQlVTX1JFQUQsIGNtZCwKKwkJCSAgICAgICBJMkNfU01CVVNfQkxPQ0tfREFUQSwgJmRhdGEpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCisJZm9yIChpID0gMTsgaSA8PSBkYXRhLmJsb2NrWzBdOyBpKyspCisJCSp2YWxzKysgPSBkYXRhLmJsb2NrW2ldOworCXJldHVybiBkYXRhLmJsb2NrWzBdOworfQorCitzdGF0aWMgaW50MzJfdCBpMmNfc21idXNfcmVhZF9pMmNfYmxvY2tfZGF0YShpbnQgZmQsIHVpbnQ4X3QgY21kLAorCQkJCQkgICAgIHVpbnQ4X3QgbGVuLCB1aW50OF90ICp2YWxzKQoreworCXVuaW9uIGkyY19zbWJ1c19kYXRhIGRhdGE7CisJaW50IGksIGVycjsKKworCWlmIChsZW4gPiBJMkNfU01CVVNfQkxPQ0tfTUFYKQorCQlsZW4gPSBJMkNfU01CVVNfQkxPQ0tfTUFYOworCWRhdGEuYmxvY2tbMF0gPSBsZW47CisKKwllcnIgPSBpMmNfc21idXNfYWNjZXNzKGZkLCBJMkNfU01CVVNfUkVBRCwgY21kLAorCQkJICAgICAgIGxlbiA9PSAzMiA/IEkyQ19TTUJVU19JMkNfQkxPQ0tfQlJPS0VOIDoKKwkJCQkJICAgSTJDX1NNQlVTX0kyQ19CTE9DS19EQVRBLCAmZGF0YSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlmb3IgKGkgPSAxOyBpIDw9IGRhdGEuYmxvY2tbMF07IGkrKykKKwkJKnZhbHMrKyA9IGRhdGEuYmxvY2tbaV07CisJcmV0dXJuIGRhdGEuYmxvY2tbMF07Cit9CisjZW5kaWYgLyogRU5BQkxFX0kyQ0RVTVAgKi8KKworI2lmIEVOQUJMRV9JMkNERVRFQ1QKK3N0YXRpYyBpbnQzMl90IGkyY19zbWJ1c193cml0ZV9xdWljayhpbnQgZmQsIHVpbnQ4X3QgdmFsKQoreworCXJldHVybiBpMmNfc21idXNfYWNjZXNzKGZkLCB2YWwsIDAsIEkyQ19TTUJVU19RVUlDSywgTlVMTCk7Cit9CisjZW5kaWYgLyogRU5BQkxFX0kyQ0RFVEVDVCAqLworCitzdGF0aWMgaW50IGkyY19idXNfbG9va3VwKGNvbnN0IGNoYXIgKmJ1c19zdHIpCit7CisJcmV0dXJuIHhzdHJ0b3VfcmFuZ2UoYnVzX3N0ciwgMTAsIDAsIDB4ZmZmZmYpOworfQorCisjaWYgRU5BQkxFX0kyQ0dFVCB8fCBFTkFCTEVfSTJDU0VUIHx8IEVOQUJMRV9JMkNEVU1QCitzdGF0aWMgaW50IGkyY19wYXJzZV9idXNfYWRkcihjb25zdCBjaGFyICphZGRyX3N0cikKK3sKKwkvKiBTbGF2ZSBhZGRyZXNzIG11c3QgYmUgaW4gcmFuZ2UgMHgwMyAtIDB4NzcuICovCisJcmV0dXJuIHhzdHJ0b3VfcmFuZ2UoYWRkcl9zdHIsIDE2LCAweDAzLCAweDc3KTsKK30KKworc3RhdGljIHZvaWQgaTJjX3NldF9wZWMoaW50IGZkLCBpbnQgcGVjKQoreworCWlvY3RsX29yX3BlcnJvcl9hbmRfZGllKGZkLCBJMkNfUEVDLAorCQkJCWl0b3B0cihwZWMgPyAxIDogMCksCisJCQkJImNhbid0IHNldCBQRUMiKTsKK30KKworc3RhdGljIHZvaWQgaTJjX3NldF9zbGF2ZV9hZGRyKGludCBmZCwgaW50IGFkZHIsIGludCBmb3JjZSkKK3sKKwlpb2N0bF9vcl9wZXJyb3JfYW5kX2RpZShmZCwgZm9yY2UgPyBJMkNfU0xBVkVfRk9SQ0UgOiBJMkNfU0xBVkUsCisJCQkJaXRvcHRyKGFkZHIpLAorCQkJCSJjYW4ndCBzZXQgYWRkcmVzcyB0byAweCUwMngiLCBhZGRyKTsKK30KKyNlbmRpZiAvKiBFTkFCTEVfSTJDR0VUIHx8IEVOQUJMRV9JMkNTRVQgfHwgRU5BQkxFX0kyQ0RVTVAgKi8KKworI2lmIEVOQUJMRV9JMkNHRVQgfHwgRU5BQkxFX0kyQ1NFVAorc3RhdGljIGludCBpMmNfcGFyc2VfZGF0YV9hZGRyKGNvbnN0IGNoYXIgKmRhdGFfYWRkcikKK3sKKwkvKiBEYXRhIGFkZHJlc3MgbXVzdCBiZSBhbiA4IGJpdCBpbnRlZ2VyLiAqLworCXJldHVybiB4c3RydG91X3JhbmdlKGRhdGFfYWRkciwgMTYsIDAsIDB4ZmYpOworfQorI2VuZGlmIC8qIEVOQUJMRV9JMkNHRVQgfHwgRU5BQkxFX0kyQ1NFVCAqLworCisvKgorICogT3BlbnMgdGhlIGRldmljZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCBnaXZlbiBpMmMgYnVzLgorICoKKyAqIFVwc3RyZWFtIGkyYy10b29scyBhbHNvIHN1cHBvcnQgb3BlbmluZyBkZXZpY2VzIGJ5IGkyYyBidXMgbmFtZQorICogYnV0IHdlIGRyb3AgaXQgaGVyZSBmb3Igc2l6ZSByZWR1Y3Rpb24uCisgKi8KK3N0YXRpYyBpbnQgaTJjX2Rldl9vcGVuKGludCBpMmNidXMpCit7CisJY2hhciBmaWxlbmFtZVtzaXplb2YoIi9kZXYvaTJjLSVkIikgKyBzaXplb2YoaW50KSozXTsKKwlpbnQgZmQ7CisKKwlzcHJpbnRmKGZpbGVuYW1lLCAiL2Rldi9pMmMtJWQiLCBpMmNidXMpOworCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRFdSKTsKKwlpZiAoZmQgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFTk9FTlQpIHsKKwkJCWZpbGVuYW1lWzhdID0gJy8nOyAvKiBjaGFuZ2UgdG8gIi9kZXYvaTJjLyVkIiAqLworCQkJZmQgPSB4b3BlbihmaWxlbmFtZSwgT19SRFdSKTsKKwkJfSBlbHNlIHsKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgb3BlbiAnJXMnIiwgZmlsZW5hbWUpOworCQl9CisJfQorCisJcmV0dXJuIGZkOworfQorCisvKiBTaXplIHJlZHVjaW5nIGhlbHBlcnMgZm9yIHh4eF9jaGVja19mdW5jcygpLiAqLworc3RhdGljIHZvaWQgZ2V0X2Z1bmNzX21hdHJpeChpbnQgZmQsIHVuc2lnbmVkIGxvbmcgKmZ1bmNzKQoreworCWlvY3RsX29yX3BlcnJvcl9hbmRfZGllKGZkLCBJMkNfRlVOQ1MsIGZ1bmNzLAorCQkJImNhbid0IGdldCBhZGFwdGVyIGZ1bmN0aW9uYWxpdHkgbWF0cml4Iik7Cit9CisKKyNpZiBFTkFCTEVfSTJDR0VUIHx8IEVOQUJMRV9JMkNTRVQgfHwgRU5BQkxFX0kyQ0RVTVAKK3N0YXRpYyB2b2lkIGNoZWNrX2Z1bmNzX3Rlc3RfZW5kKGludCBmdW5jcywgaW50IHBlYywgY29uc3QgY2hhciAqZXJyKQoreworCWlmIChwZWMgJiYgIShmdW5jcyAmIChJMkNfRlVOQ19TTUJVU19QRUMgfCBJMkNfRlVOQ19JMkMpKSkKKwkJYmJfZXJyb3JfbXNnKCJ3YXJuaW5nOiBhZGFwdGVyIGRvZXMgbm90IHN1cHBvcnQgUEVDIik7CisKKwlpZiAoZXJyKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgKKwkJCSJhZGFwdGVyIGhhcyBubyAlcyBjYXBhYmlsaXR5IiwgZXJyKTsKK30KKyNlbmRpZiAvKiBFTkFCTEVfSTJDR0VUIHx8IEVOQUJMRV9JMkNTRVQgfHwgRU5BQkxFX0kyQ0RVTVAgKi8KKworLyoKKyAqIFRoZSBiZWxvdyBmdW5jdGlvbnMgZW1pdCBhbiBlcnJvciBtZXNzYWdlIGFuZCBleGl0IGlmIHRoZSBhZGFwdGVyIGRvZXNuJ3QKKyAqIHN1cHBvcnQgZGVzaXJlZCBmdW5jdGlvbmFsaXRpZXMuCisgKi8KKyNpZiBFTkFCTEVfSTJDR0VUIHx8IEVOQUJMRV9JMkNEVU1QCitzdGF0aWMgdm9pZCBjaGVja19yZWFkX2Z1bmNzKGludCBmZCwgaW50IG1vZGUsIGludCBkYXRhX2FkZHIsIGludCBwZWMpCit7CisJdW5zaWduZWQgbG9uZyBmdW5jczsKKwljb25zdCBjaGFyICplcnIgPSBOVUxMOworCisJZ2V0X2Z1bmNzX21hdHJpeChmZCwgJmZ1bmNzKTsKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEkyQ19TTUJVU19CWVRFOgorCQlpZiAoIShmdW5jcyAmIEkyQ19GVU5DX1NNQlVTX1JFQURfQllURSkpIHsKKwkJCWVyciA9ICJTTUJ1cyByZWNlaXZlIGJ5dGUiOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGRhdGFfYWRkciA+PSAwICYmICEoZnVuY3MgJiBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFKSkKKwkJCWVyciA9ICJTTUJ1cyBzZW5kIGJ5dGUiOworCQlicmVhazsKKwljYXNlIEkyQ19TTUJVU19CWVRFX0RBVEE6CisJCWlmICghKGZ1bmNzICYgSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFX0RBVEEpKQorCQkJZXJyID0gIlNNQnVzIHJlYWQgYnl0ZSI7CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX1dPUkRfREFUQToKKwkJaWYgKCEoZnVuY3MgJiBJMkNfRlVOQ19TTUJVU19SRUFEX1dPUkRfREFUQSkpCisJCQllcnIgPSAiU01CdXMgcmVhZCB3b3JkIjsKKwkJYnJlYWs7CisjaWYgRU5BQkxFX0kyQ0RVTVAKKwljYXNlIEkyQ19TTUJVU19CTE9DS19EQVRBOgorCQlpZiAoIShmdW5jcyAmIEkyQ19GVU5DX1NNQlVTX1JFQURfQkxPQ0tfREFUQSkpCisJCQllcnIgPSAiU01CdXMgYmxvY2sgcmVhZCI7CisJCWJyZWFrOworCisJY2FzZSBJMkNfU01CVVNfSTJDX0JMT0NLX0RBVEE6CisJCWlmICghKGZ1bmNzICYgSTJDX0ZVTkNfU01CVVNfUkVBRF9JMkNfQkxPQ0spKQorCQkJZXJyID0gIkkyQyBibG9jayByZWFkIjsKKwkJYnJlYWs7CisjZW5kaWYgLyogRU5BQkxFX0kyQ0RVTVAgKi8KKwlkZWZhdWx0OgorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW50ZXJuYWwgZXJyb3IiKTsKKwl9CisJY2hlY2tfZnVuY3NfdGVzdF9lbmQoZnVuY3MsIHBlYywgZXJyKTsKK30KKyNlbmRpZiAvKiBFTkFCTEVfSTJDR0VUIHx8IEVOQUJMRV9JMkNEVU1QICovCisKKyNpZiBFTkFCTEVfSTJDU0VUCitzdGF0aWMgdm9pZCBjaGVja193cml0ZV9mdW5jcyhpbnQgZmQsIGludCBtb2RlLCBpbnQgcGVjKQoreworCXVuc2lnbmVkIGxvbmcgZnVuY3M7CisJY29uc3QgY2hhciAqZXJyID0gTlVMTDsKKworCWdldF9mdW5jc19tYXRyaXgoZmQsICZmdW5jcyk7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBJMkNfU01CVVNfQllURToKKwkJaWYgKCEoZnVuY3MgJiBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFKSkKKwkJCWVyciA9ICJTTUJ1cyBzZW5kIGJ5dGUiOworCQlicmVhazsKKworCWNhc2UgSTJDX1NNQlVTX0JZVEVfREFUQToKKwkJaWYgKCEoZnVuY3MgJiBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEEpKQorCQkJZXJyID0gIlNNQnVzIHdyaXRlIGJ5dGUiOworCQlicmVhazsKKworCWNhc2UgSTJDX1NNQlVTX1dPUkRfREFUQToKKwkJaWYgKCEoZnVuY3MgJiBJMkNfRlVOQ19TTUJVU19XUklURV9XT1JEX0RBVEEpKQorCQkJZXJyID0gIlNNQnVzIHdyaXRlIHdvcmQiOworCQlicmVhazsKKworCWNhc2UgSTJDX1NNQlVTX0JMT0NLX0RBVEE6CisJCWlmICghKGZ1bmNzICYgSTJDX0ZVTkNfU01CVVNfV1JJVEVfQkxPQ0tfREFUQSkpCisJCQllcnIgPSAiU01CdXMgYmxvY2sgd3JpdGUiOworCQlicmVhazsKKwljYXNlIEkyQ19TTUJVU19JMkNfQkxPQ0tfREFUQToKKwkJaWYgKCEoZnVuY3MgJiBJMkNfRlVOQ19TTUJVU19XUklURV9JMkNfQkxPQ0spKQorCQkJZXJyID0gIkkyQyBibG9jayB3cml0ZSI7CisJCWJyZWFrOworCX0KKwljaGVja19mdW5jc190ZXN0X2VuZChmdW5jcywgcGVjLCBlcnIpOworfQorI2VuZGlmIC8qIEVOQUJMRV9JMkNTRVQgKi8KKworc3RhdGljIHZvaWQgY29uZmlybV9vcl9hYm9ydCh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiQ29udGludWU/IFt5L05dICIpOworCWZmbHVzaF9hbGwoKTsKKwlpZiAoIWJiX2Fza19jb25maXJtYXRpb24oKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImFib3J0aW5nIik7Cit9CisKKy8qCisgKiBSZXR1cm4gb25seSBpZiB1c2VyIGNvbmZpcm1zIHRoZSBhY3Rpb24sIGFib3J0IG90aGVyd2lzZS4KKyAqCisgKiBUaGUgbWVzc2FnZXMgZGlzcGxheWVkIGhlcmUgYXJlIG11Y2ggbGVzcyBlbGFib3JhdGUgdGhhbiB0aGVpciBpMmMtdG9vbHMKKyAqIGNvdW50ZXJwYXJ0cyAtIHRoaXMgaXMgZG9uZSBmb3Igc2l6ZSByZWR1Y3Rpb24uCisgKi8KK3N0YXRpYyB2b2lkIGNvbmZpcm1fYWN0aW9uKGludCBidXNfYWRkciwgaW50IG1vZGUsIGludCBkYXRhX2FkZHIsIGludCBwZWMpCit7CisJYmJfZXJyb3JfbXNnKCJXQVJOSU5HISBUaGlzIHByb2dyYW0gY2FuIGNvbmZ1c2UgeW91ciBJMkMgYnVzIik7CisKKwkvKiBEb24ndCBsZXQgdGhlIHVzZXIgYnJlYWsgaGlzL2hlciBFRVBST01zICovCisJaWYgKGJ1c19hZGRyID49IDB4NTAgJiYgYnVzX2FkZHIgPD0gMHg1NyAmJiBwZWMpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRoaXMgaXMgSTJDIG5vdCBzbWJ1cyAtIHVzaW5nIFBFQyBvbiBJMkMgIgorCQkJImRldmljZXMgbWF5IHJlc3VsdCBpbiBkYXRhIGxvc3MsIGFib3J0aW5nIik7CisJfQorCisJaWYgKG1vZGUgPT0gSTJDX1NNQlVTX0JZVEUgJiYgZGF0YV9hZGRyID49IDAgJiYgcGVjKQorCQliYl9lcnJvcl9tc2coIldBUk5JTkchIE1heSBpbnRlcnByZXQgYSB3cml0ZSBieXRlIGNvbW1hbmQgIgorCQkJIndpdGggUEVDIGFzIGEgd3JpdGUgYnl0ZSBkYXRhIGNvbW1hbmQiKTsKKworCWlmIChwZWMpCisJCWJiX2Vycm9yX21zZygiUEVDIGNoZWNraW5nIGVuYWJsZWQiKTsKKworCWNvbmZpcm1fb3JfYWJvcnQoKTsKK30KKworI2lmIEVOQUJMRV9JMkNHRVQKKy8vdXNhZ2U6I2RlZmluZSBpMmNnZXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZl0gWy15XSBCVVMgQ0hJUC1BRERSRVNTIFtEQVRBLUFERFJFU1MgW01PREVdXSIKKy8vdXNhZ2U6I2RlZmluZSBpMmNnZXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSZWFkIGZyb20gSTJDL1NNQnVzIGNoaXAgcmVnaXN0ZXJzXG4iCisvL3VzYWdlOiAgICAgIlxuCUkyQ0JVUwlpMmMgYnVzIG51bWJlciIKKy8vdXNhZ2U6ICAgICAiXG4JQUREUkVTUwkweDAzIC0gMHg3NyIKKy8vdXNhZ2U6ICAgICAiXG5NT0RFIGlzOiIKKy8vdXNhZ2U6ICAgICAiXG4JYglyZWFkIGJ5dGUgZGF0YSAoZGVmYXVsdCkiCisvL3VzYWdlOiAgICAgIlxuCXcJcmVhZCB3b3JkIGRhdGEiCisvL3VzYWdlOiAgICAgIlxuCWMJd3JpdGUgYnl0ZS9yZWFkIGJ5dGUiCisvL3VzYWdlOiAgICAgIlxuCUFwcGVuZCBwIGZvciBTTUJ1cyBQRUMiCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbgktZglmb3JjZSBhY2Nlc3MiCisvL3VzYWdlOiAgICAgIlxuCS15CWRpc2FibGUgaW50ZXJhY3RpdmUgbW9kZSIKK2ludCBpMmNnZXRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGkyY2dldF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgdW5zaWduZWQgb3B0X2YgPSAoMSA8PCAwKSwgb3B0X3kgPSAoMSA8PCAxKTsKKwljb25zdCBjaGFyICpjb25zdCBvcHRzdHIgPSAiZnkiOworCisJaW50IGJ1c19udW0sIGJ1c19hZGRyLCBkYXRhX2FkZHIgPSAtMSwgc3RhdHVzOworCWludCBtb2RlID0gSTJDX1NNQlVTX0JZVEUsIHBlYyA9IDAsIGZkOworCXVuc2lnbmVkIG9wdHM7CisKKyAgICAgICAgb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTI6PzQiOyAvKiBmcm9tIDIgdG8gNCBhcmdzICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsIG9wdHN0cik7CisJYXJndiArPSBvcHRpbmQ7CisKKwlidXNfbnVtID0gaTJjX2J1c19sb29rdXAoYXJndlswXSk7CisJYnVzX2FkZHIgPSBpMmNfcGFyc2VfYnVzX2FkZHIoYXJndlsxXSk7CisKKwlpZiAoYXJndlsyXSkgeworCQlkYXRhX2FkZHIgPSBpMmNfcGFyc2VfZGF0YV9hZGRyKGFyZ3ZbMl0pOworCQltb2RlID0gSTJDX1NNQlVTX0JZVEVfREFUQTsKKwkJaWYgKGFyZ3ZbM10pIHsKKwkJCXN3aXRjaCAoYXJndlszXVswXSkgeworCQkJY2FzZSAnYic6CS8qIEFscmVhZHkgc2V0ICovCQlicmVhazsKKwkJCWNhc2UgJ3cnOgltb2RlID0gSTJDX1NNQlVTX1dPUkRfREFUQTsJYnJlYWs7CisJCQljYXNlICdjJzoJbW9kZSA9IEkyQ19TTUJVU19CWVRFOwkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJiX2Vycm9yX21zZygiaW52YWxpZCBtb2RlIik7CisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJfQorCQkJcGVjID0gYXJndlszXVsxXSA9PSAncCc7CisJCX0KKwl9CisKKwlmZCA9IGkyY19kZXZfb3BlbihidXNfbnVtKTsKKwljaGVja19yZWFkX2Z1bmNzKGZkLCBtb2RlLCBkYXRhX2FkZHIsIHBlYyk7CisJaTJjX3NldF9zbGF2ZV9hZGRyKGZkLCBidXNfYWRkciwgb3B0cyAmIG9wdF9mKTsKKworCWlmICghKG9wdHMgJiBvcHRfeSkpCisJCWNvbmZpcm1fYWN0aW9uKGJ1c19hZGRyLCBtb2RlLCBkYXRhX2FkZHIsIHBlYyk7CisKKwlpZiAocGVjKQorCQlpMmNfc2V0X3BlYyhmZCwgMSk7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEkyQ19TTUJVU19CWVRFOgorCQlpZiAoZGF0YV9hZGRyID49IDApIHsKKwkJCXN0YXR1cyA9IGkyY19zbWJ1c193cml0ZV9ieXRlKGZkLCBkYXRhX2FkZHIpOworCQkJaWYgKHN0YXR1cyA8IDApCisJCQkJYmJfZXJyb3JfbXNnKCJ3YXJuaW5nIC0gd3JpdGUgZmFpbGVkIik7CisJCX0KKwkJc3RhdHVzID0gaTJjX3NtYnVzX3JlYWRfYnl0ZShmZCk7CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX1dPUkRfREFUQToKKwkJc3RhdHVzID0gaTJjX3NtYnVzX3JlYWRfd29yZF9kYXRhKGZkLCBkYXRhX2FkZHIpOworCQlicmVhazsKKwlkZWZhdWx0OiAvKiBJMkNfU01CVVNfQllURV9EQVRBICovCisJCXN0YXR1cyA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShmZCwgZGF0YV9hZGRyKTsKKwl9CisJY2xvc2UoZmQpOworCisJaWYgKHN0YXR1cyA8IDApCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgicmVhZCBmYWlsZWQiKTsKKworCXByaW50ZigiMHglMCp4XG4iLCBtb2RlID09IEkyQ19TTUJVU19XT1JEX0RBVEEgPyA0IDogMiwgc3RhdHVzKTsKKworCXJldHVybiAwOworfQorI2VuZGlmIC8qIEVOQUJMRV9JMkNHRVQgKi8KKworI2lmIEVOQUJMRV9JMkNTRVQKKy8vdXNhZ2U6I2RlZmluZSBpMmNzZXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZl0gWy15XSBbLW0gTUFTS10gQlVTIENISVAtQUREUiBEQVRBLUFERFIgW1ZBTFVFXSAuLi4gW01PREVdIgorLy91c2FnZTojZGVmaW5lIGkyY3NldF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNldCBJMkMgcmVnaXN0ZXJzXG4iCisvL3VzYWdlOiAgICAgIlxuCUkyQ0JVUwlpMmMgYnVzIG51bWJlciIKKy8vdXNhZ2U6ICAgICAiXG4JQUREUkVTUwkweDAzIC0gMHg3NyIKKy8vdXNhZ2U6ICAgICAiXG5NT0RFIGlzOiIKKy8vdXNhZ2U6ICAgICAiXG4JYwlieXRlLCBubyB2YWx1ZSIKKy8vdXNhZ2U6ICAgICAiXG4JYglieXRlIGRhdGEgKGRlZmF1bHQpIgorLy91c2FnZTogICAgICJcbgl3CXdvcmQgZGF0YSIKKy8vdXNhZ2U6ICAgICAiXG4JaQlJMkMgYmxvY2sgZGF0YSIKKy8vdXNhZ2U6ICAgICAiXG4JcwlTTUJ1cyBibG9jayBkYXRhIgorLy91c2FnZTogICAgICJcbglBcHBlbmQgcCBmb3IgU01CdXMgUEVDIgorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJZm9yY2UgYWNjZXNzIgorLy91c2FnZTogICAgICJcbgkteQlkaXNhYmxlIGludGVyYWN0aXZlIG1vZGUiCisvL3VzYWdlOiAgICAgIlxuCS1yCXJlYWQgYmFjayBhbmQgY29tcGFyZSB0aGUgcmVzdWx0IgorLy91c2FnZTogICAgICJcbgktbSBNQVNLCW1hc2sgc3BlY2lmeWluZyB3aGljaCBiaXRzIHRvIHdyaXRlIgoraW50IGkyY3NldF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaTJjc2V0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNvbnN0IHVuc2lnbmVkIG9wdF9mID0gKDEgPDwgMCksIG9wdF95ID0gKDEgPDwgMSksCisJCQkgICAgICBvcHRfbSA9ICgxIDw8IDIpLCBvcHRfciA9ICgxIDw8IDMpOworCWNvbnN0IGNoYXIgKmNvbnN0IG9wdHN0ciA9ICJmeW06ciI7CisKKwlpbnQgYnVzX251bSwgYnVzX2FkZHIsIGRhdGFfYWRkciwgbW9kZSA9IEkyQ19TTUJVU19CWVRFLCBwZWMgPSAwOworCWludCB2YWwsIGJsZW4gPSAwLCBtYXNrID0gMCwgZmQsIHN0YXR1czsKKwl1bnNpZ25lZCBjaGFyIGJsb2NrW0kyQ19TTUJVU19CTE9DS19NQVhdOworCWNoYXIgKm9wdF9tX2FyZyA9IE5VTEw7CisJdW5zaWduZWQgb3B0czsKKworICAgICAgICBvcHRfY29tcGxlbWVudGFyeSA9ICItMyI7IC8qIGZyb20gMyB0byA/IGFyZ3MgKi8KKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgb3B0c3RyLCAmb3B0X21fYXJnKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlhcmdjIC09IG9wdGluZDsKKworCWJ1c19udW0gPSBpMmNfYnVzX2xvb2t1cChhcmd2WzBdKTsKKwlidXNfYWRkciA9IGkyY19wYXJzZV9idXNfYWRkcihhcmd2WzFdKTsKKwlkYXRhX2FkZHIgPSBpMmNfcGFyc2VfZGF0YV9hZGRyKGFyZ3ZbMl0pOworCisJaWYgKGFyZ3ZbM10pIHsKKwkJaWYgKCFhcmd2WzRdICYmIGFyZ3ZbM11bMF0gIT0gJ2MnKSB7CisJCQltb2RlID0gSTJDX1NNQlVTX0JZVEVfREFUQTsgLyogSW1wbGljaXQgYiAqLworCQl9IGVsc2UgeworCQkJc3dpdGNoIChhcmd2W2FyZ2MtMV1bMF0pIHsKKwkJCWNhc2UgJ2MnOiAvKiBBbHJlYWR5IHNldCAqLwkJCWJyZWFrOworCQkJY2FzZSAnYic6IG1vZGUgPSBJMkNfU01CVVNfQllURV9EQVRBOwkJYnJlYWs7CisJCQljYXNlICd3JzogbW9kZSA9IEkyQ19TTUJVU19XT1JEX0RBVEE7CQlicmVhazsKKwkJCWNhc2UgJ3MnOiBtb2RlID0gSTJDX1NNQlVTX0JMT0NLX0RBVEE7CQlicmVhazsKKwkJCWNhc2UgJ2knOiBtb2RlID0gSTJDX1NNQlVTX0kyQ19CTE9DS19EQVRBOwlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYmJfZXJyb3JfbXNnKCJpbnZhbGlkIG1vZGUiKTsKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCQl9CisKKwkJCXBlYyA9IGFyZ3ZbYXJnYy0xXVsxXSA9PSAncCc7CisJCQlpZiAobW9kZSA9PSBJMkNfU01CVVNfQkxPQ0tfREFUQSB8fAorCQkJCQltb2RlID09IEkyQ19TTUJVU19JMkNfQkxPQ0tfREFUQSkgeworCQkJCWlmIChwZWMgJiYgbW9kZSA9PSBJMkNfU01CVVNfSTJDX0JMT0NLX0RBVEEpCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKAorCQkJCQkJIlBFQyBub3Qgc3VwcG9ydGVkIGZvciBJMkMgIgorCQkJCQkJImJsb2NrIHdyaXRlcyIpOworCQkJCWlmIChvcHRzICYgb3B0X20pCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKAorCQkJCQkJIm1hc2sgbm90IHN1cHBvcnRlZCBmb3IgYmxvY2sgIgorCQkJCQkJIndyaXRlcyIpOworCQkJfQorCQl9CisJfQorCisJLyogUHJlcGFyZSB0aGUgdmFsdWUocykgdG8gYmUgd3JpdHRlbiBhY2NvcmRpbmcgdG8gY3VycmVudCBtb2RlLiAqLworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgSTJDX1NNQlVTX0JZVEVfREFUQToKKwkJdmFsID0geHN0cnRvdV9yYW5nZShhcmd2WzNdLCAwLCAwLCAweGZmKTsKKwkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfV09SRF9EQVRBOgorCQl2YWwgPSB4c3RydG91X3JhbmdlKGFyZ3ZbM10sIDAsIDAsIDB4ZmZmZik7CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX0JMT0NLX0RBVEE6CisJY2FzZSBJMkNfU01CVVNfSTJDX0JMT0NLX0RBVEE6CisJCWZvciAoYmxlbiA9IDM7IGJsZW4gPCAoYXJnYyAtIDEpOyBibGVuKyspCisJCQlibG9ja1tibGVuXSA9IHhzdHJ0b3VfcmFuZ2UoYXJndltibGVuXSwgMCwgMCwgMHhmZik7CisJCXZhbCA9IC0xOworCQlicmVhazsKKwlkZWZhdWx0OgorCQl2YWwgPSAtMTsKKwkJYnJlYWs7CisJfQorCisJaWYgKG9wdHMgJiBvcHRfbSkgeworCQltYXNrID0geHN0cnRvdV9yYW5nZShvcHRfbV9hcmcsIDAsIDAsCisJCQkJKG1vZGUgPT0gSTJDX1NNQlVTX0JZVEUgfHwKKwkJCQkgbW9kZSA9PSBJMkNfU01CVVNfQllURV9EQVRBKSA/IDB4ZmYgOiAweGZmZmYpOworCX0KKworCWZkID0gaTJjX2Rldl9vcGVuKGJ1c19udW0pOworCWNoZWNrX3dyaXRlX2Z1bmNzKGZkLCBtb2RlLCBwZWMpOworCWkyY19zZXRfc2xhdmVfYWRkcihmZCwgYnVzX2FkZHIsIG9wdHMgJiBvcHRfZik7CisKKwlpZiAoIShvcHRzICYgb3B0X3kpKQorCQljb25maXJtX2FjdGlvbihidXNfYWRkciwgbW9kZSwgZGF0YV9hZGRyLCBwZWMpOworCisJLyoKKwkgKiBJZiB3ZSdyZSB1c2luZyBtYXNrIC0gcmVhZCB0aGUgY3VycmVudCB2YWx1ZSBoZXJlIGFuZCBhZGp1c3QgdGhlCisJICogdmFsdWUgdG8gYmUgd3JpdHRlbi4KKwkgKi8KKwlpZiAob3B0cyAmIG9wdF9tKSB7CisJCWludCB0bXB2YWw7CisKKwkJc3dpdGNoIChtb2RlKSB7CisJCWNhc2UgSTJDX1NNQlVTX0JZVEU6CisJCQl0bXB2YWwgPSBpMmNfc21idXNfcmVhZF9ieXRlKGZkKTsKKwkJCWJyZWFrOworCQljYXNlIEkyQ19TTUJVU19XT1JEX0RBVEE6CisJCQl0bXB2YWwgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoZmQsIGRhdGFfYWRkcik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXRtcHZhbCA9IGkyY19zbWJ1c19yZWFkX2J5dGVfZGF0YShmZCwgZGF0YV9hZGRyKTsKKwkJfQorCisJCWlmICh0bXB2YWwgPCAwKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCByZWFkIG9sZCB2YWx1ZSIpOworCisJCXZhbCA9ICh2YWwgJiBtYXNrKSB8ICh0bXB2YWwgJiB+bWFzayk7CisKKwkJaWYgKCEob3B0cyAmIG9wdF95KSkgeworCQkJYmJfZXJyb3JfbXNnKCJvbGQgdmFsdWUgMHglMCp4LCB3cml0ZSBtYXNrICIKKwkJCQkiMHglMCp4LCB3aWxsIHdyaXRlIDB4JTAqeCB0byByZWdpc3RlciAiCisJCQkJIjB4JTAyeCIsCisJCQkJbW9kZSA9PSBJMkNfU01CVVNfV09SRF9EQVRBID8gNCA6IDIsIHRtcHZhbCwKKwkJCQltb2RlID09IEkyQ19TTUJVU19XT1JEX0RBVEEgPyA0IDogMiwgbWFzaywKKwkJCQltb2RlID09IEkyQ19TTUJVU19XT1JEX0RBVEEgPyA0IDogMiwgdmFsLAorCQkJCWRhdGFfYWRkcik7CisJCQljb25maXJtX29yX2Fib3J0KCk7CisJCX0KKwl9CisKKwlpZiAocGVjKQorCQlpMmNfc2V0X3BlYyhmZCwgMSk7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEkyQ19TTUJVU19CWVRFOgorCQlzdGF0dXMgPSBpMmNfc21idXNfd3JpdGVfYnl0ZShmZCwgZGF0YV9hZGRyKTsKKwkJYnJlYWs7CisJY2FzZSBJMkNfU01CVVNfV09SRF9EQVRBOgorCQlzdGF0dXMgPSBpMmNfc21idXNfd3JpdGVfd29yZF9kYXRhKGZkLCBkYXRhX2FkZHIsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgSTJDX1NNQlVTX0JMT0NLX0RBVEE6CisJCXN0YXR1cyA9IGkyY19zbWJ1c193cml0ZV9ibG9ja19kYXRhKGZkLCBkYXRhX2FkZHIsCisJCQkJCQkgICAgYmxlbiwgYmxvY2spOworCQlicmVhazsKKwljYXNlIEkyQ19TTUJVU19JMkNfQkxPQ0tfREFUQToKKwkJc3RhdHVzID0gaTJjX3NtYnVzX3dyaXRlX2kyY19ibG9ja19kYXRhKGZkLCBkYXRhX2FkZHIsCisJCQkJCQkJYmxlbiwgYmxvY2spOworCQlicmVhazsKKwlkZWZhdWx0OiAvKiBJMkNfU01CVVNfQllURV9EQVRBICovCisJCXN0YXR1cyA9IGkyY19zbWJ1c193cml0ZV9ieXRlX2RhdGEoZmQsIGRhdGFfYWRkciwgdmFsKTsKKwkJYnJlYWs7CisJfQorCWlmIChzdGF0dXMgPCAwKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIndyaXRlIGZhaWxlZCIpOworCisJaWYgKHBlYykKKwkJaTJjX3NldF9wZWMoZmQsIDApOyAvKiBDbGVhciBQRUMuICovCisKKwkvKiBObyByZWFkYmFjayByZXF1aXJlZCAtIHdlJ3JlIGRvbmUuICovCisJaWYgKCEob3B0cyAmIG9wdF9yKSkKKwkJcmV0dXJuIDA7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIEkyQ19TTUJVU19CWVRFOgorCQlzdGF0dXMgPSBpMmNfc21idXNfcmVhZF9ieXRlKGZkKTsKKwkJdmFsID0gZGF0YV9hZGRyOworCQlicmVhazsKKwljYXNlIEkyQ19TTUJVU19XT1JEX0RBVEE6CisJCXN0YXR1cyA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShmZCwgZGF0YV9hZGRyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDogLyogSTJDX1NNQlVTX0JZVEVfREFUQSAqLworCQlzdGF0dXMgPSBpMmNfc21idXNfcmVhZF9ieXRlX2RhdGEoZmQsIGRhdGFfYWRkcik7CisJfQorCisJaWYgKHN0YXR1cyA8IDApIHsKKwkJcHV0cygiV2FybmluZyAtIHJlYWRiYWNrIGZhaWxlZCIpOworCX0gZWxzZQorCWlmIChzdGF0dXMgIT0gdmFsKSB7CisJCXByaW50ZigiV2FybmluZyAtIGRhdGEgbWlzbWF0Y2ggLSB3cm90ZSAiCisJCSAgICAgICAiMHglMCp4LCByZWFkIGJhY2sgMHglMCp4XG4iLAorCQkgICAgICAgbW9kZSA9PSBJMkNfU01CVVNfV09SRF9EQVRBID8gNCA6IDIsIHZhbCwKKwkJICAgICAgIG1vZGUgPT0gSTJDX1NNQlVTX1dPUkRfREFUQSA/IDQgOiAyLCBzdGF0dXMpOworCX0gZWxzZSB7CisJCXByaW50ZigiVmFsdWUgMHglMCp4IHdyaXR0ZW4sIHJlYWRiYWNrIG1hdGNoZWRcbiIsCisJCSAgICAgICBtb2RlID09IEkyQ19TTUJVU19XT1JEX0RBVEEgPyA0IDogMiwgdmFsKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBFTkFCTEVfSTJDU0VUICovCisKKyNpZiBFTkFCTEVfSTJDRFVNUAorc3RhdGljIGludCByZWFkX2Jsb2NrX2RhdGEoaW50IGJ1Zl9mZCwgaW50IG1vZGUsIGludCAqYmxvY2spCit7CisJdWludDhfdCBjYmxvY2tbSTJDX1NNQlVTX0JMT0NLX01BWCArIEkyQ0RVTVBfTlVNX1JFR1NdOworCWludCByZXMsIGJsZW4gPSAwLCB0bXAsIGk7CisKKwlpZiAobW9kZSA9PSBJMkNfU01CVVNfQkxPQ0tfREFUQSB8fCBtb2RlID09IEkyQ19TTUJVU19JMkNfQkxPQ0tfREFUQSkgeworCQlyZXMgPSBpMmNfc21idXNfcmVhZF9ibG9ja19kYXRhKGJ1Zl9mZCwgMCwgY2Jsb2NrKTsKKwkJYmxlbiA9IHJlczsKKwl9IGVsc2UgeworCQlmb3IgKHJlcyA9IDA7IHJlcyA8IEkyQ0RVTVBfTlVNX1JFR1M7IHJlcyArPSB0bXApIHsKKwkJCXRtcCA9IGkyY19zbWJ1c19yZWFkX2kyY19ibG9ja19kYXRhKAorCQkJCQlidWZfZmQsIHJlcywgSTJDX1NNQlVTX0JMT0NLX01BWCwKKwkJCQkJY2Jsb2NrICsgcmVzKTsKKwkJCWlmICh0bXAgPCAwKSB7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJsb2NrIHJlYWQgZmFpbGVkIik7CisJCQl9CisJCX0KKworCQlpZiAocmVzID49IEkyQ0RVTVBfTlVNX1JFR1MpCisJCQlyZXMgPSBJMkNEVU1QX05VTV9SRUdTOworCisJCWZvciAoaSA9IDA7IGkgPCByZXM7IGkrKykKKwkJCWJsb2NrW2ldID0gY2Jsb2NrW2ldOworCisJCWlmIChtb2RlICE9IEkyQ19TTUJVU19CTE9DS19EQVRBKQorCQkJZm9yIChpID0gcmVzOyBpIDwgSTJDRFVNUF9OVU1fUkVHUzsgaSsrKQorCQkJCWJsb2NrW2ldID0gLTE7CisJfQorCisJcmV0dXJuIGJsZW47Cit9CisKKy8qIER1bXAgYWxsIGJ1dCB3b3JkIGRhdGEuICovCitzdGF0aWMgdm9pZCBkdW1wX2RhdGEoaW50IGJ1c19mZCwgaW50IG1vZGUsIHVuc2lnbmVkIGZpcnN0LAorCQkgICAgICB1bnNpZ25lZCBsYXN0LCBpbnQgKmJsb2NrLCBpbnQgYmxlbikKK3sKKwlpbnQgaSwgaiwgcmVzOworCisJcHV0cygiICAgICAwICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5ICBhICBiICBjICBkICBlICBmIgorCSAgICAgIiAgICAwMTIzNDU2Nzg5YWJjZGVmIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgSTJDRFVNUF9OVU1fUkVHUzsgaSArPSAweDEwKSB7CisJCWlmIChtb2RlID09IEkyQ19TTUJVU19CTE9DS19EQVRBICYmIGkgPj0gYmxlbikKKwkJCWJyZWFrOworCQlpZiAoaS8xNiA8IGZpcnN0LzE2KQorCQkJY29udGludWU7CisJCWlmIChpLzE2ID4gbGFzdC8xNikKKwkJCWJyZWFrOworCisJCXByaW50ZigiJTAyeDogIiwgaSk7CisJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CisJCQlmZmx1c2hfYWxsKCk7CisJCQkvKiBTa2lwIHVud2FudGVkIHJlZ2lzdGVycyAqLworCQkJaWYgKGkraiA8IGZpcnN0IHx8IGkraiA+IGxhc3QpIHsKKwkJCQlwcmludGYoIiAgICIpOworCQkJCWlmIChtb2RlID09IEkyQ19TTUJVU19XT1JEX0RBVEEpIHsKKwkJCQkJcHJpbnRmKCIgICAiKTsKKwkJCQkJaisrOworCQkJCX0KKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJc3dpdGNoIChtb2RlKSB7CisJCQljYXNlIEkyQ19TTUJVU19CWVRFX0RBVEE6CisJCQkJcmVzID0gaTJjX3NtYnVzX3JlYWRfYnl0ZV9kYXRhKGJ1c19mZCwgaStqKTsKKwkJCQlibG9ja1tpK2pdID0gcmVzOworCQkJCWJyZWFrOworCQkJY2FzZSBJMkNfU01CVVNfV09SRF9EQVRBOgorCQkJCXJlcyA9IGkyY19zbWJ1c19yZWFkX3dvcmRfZGF0YShidXNfZmQsIGkraik7CisJCQkJaWYgKHJlcyA8IDApIHsKKwkJCQkJYmxvY2tbaStqXSA9IHJlczsKKwkJCQkJYmxvY2tbaStqKzFdID0gcmVzOworCQkJCX0gZWxzZSB7CisJCQkJCWJsb2NrW2kral0gPSByZXMgJiAweGZmOworCQkJCQlibG9ja1tpK2orMV0gPSByZXMgPj4gODsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEkyQ19TTUJVU19CWVRFOgorCQkJCXJlcyA9IGkyY19zbWJ1c19yZWFkX2J5dGUoYnVzX2ZkKTsKKwkJCQlibG9ja1tpK2pdID0gcmVzOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlyZXMgPSBibG9ja1tpK2pdOworCQkJfQorCisJCQlpZiAobW9kZSA9PSBJMkNfU01CVVNfQkxPQ0tfREFUQSAmJgorCQkJICAgIGkraiA+PSBibGVuKSB7CisJCQkJcHJpbnRmKCIgICAiKTsKKwkJCX0gZWxzZSBpZiAocmVzIDwgMCkgeworCQkJCXByaW50ZigiWFggIik7CisJCQkJaWYgKG1vZGUgPT0gSTJDX1NNQlVTX1dPUkRfREFUQSkKKwkJCQkJcHJpbnRmKCJYWCAiKTsKKwkJCX0gZWxzZSB7CisJCQkJcHJpbnRmKCIlMDJ4ICIsIGJsb2NrW2kral0pOworCQkJCWlmIChtb2RlID09IEkyQ19TTUJVU19XT1JEX0RBVEEpCisJCQkJCXByaW50ZigiJTAyeCAiLCBibG9ja1tpK2orMV0pOworCQkJfQorCisJCQlpZiAobW9kZSA9PSBJMkNfU01CVVNfV09SRF9EQVRBKQorCQkJCWorKzsKKwkJfQorCQlwcmludGYoIiAgICIpOworCisJCWZvciAoaiA9IDA7IGogPCAxNjsgaisrKSB7CisJCQlpZiAobW9kZSA9PSBJMkNfU01CVVNfQkxPQ0tfREFUQSAmJiBpK2ogPj0gYmxlbikKKwkJCQlicmVhazsKKwkJCS8qIFNraXAgdW53YW50ZWQgcmVnaXN0ZXJzICovCisJCQlpZiAoaStqIDwgZmlyc3QgfHwgaStqID4gbGFzdCkgeworCQkJCWJiX3B1dGNoYXIoJyAnKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJcmVzID0gYmxvY2tbaStqXTsKKwkJCWlmIChyZXMgPCAwKSB7CisJCQkJYmJfcHV0Y2hhcignWCcpOworCQkJfSBlbHNlIGlmIChyZXMgPT0gMHgwMCB8fCByZXMgPT0gMHhmZikgeworCQkJCWJiX3B1dGNoYXIoJy4nKTsKKwkJCX0gZWxzZSBpZiAocmVzIDwgMzIgfHwgcmVzID49IDEyNykgeworCQkJCWJiX3B1dGNoYXIoJz8nKTsKKwkJCX0gZWxzZSB7CisJCQkJYmJfcHV0Y2hhcihyZXMpOworCQkJfQorCQl9CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkdW1wX3dvcmRfZGF0YShpbnQgYnVzX2ZkLCB1bnNpZ25lZCBmaXJzdCwgdW5zaWduZWQgbGFzdCkKK3sKKwlpbnQgaSwgaiwgcnY7CisKKwkvKiBXb3JkIGRhdGEuICovCisJcHV0cygiICAgICAwLDggIDEsOSAgMixhICAzLGIgIDQsYyAgNSxkICA2LGUgIDcsZiIpOworCWZvciAoaSA9IDA7IGkgPCAyNTY7IGkgKz0gOCkgeworCQlpZiAoaS84IDwgZmlyc3QvOCkKKwkJCWNvbnRpbnVlOworCQlpZiAoaS84ID4gbGFzdC84KQorCQkJYnJlYWs7CisKKwkJcHJpbnRmKCIlMDJ4OiAiLCBpKTsKKwkJZm9yIChqID0gMDsgaiA8IDg7IGorKykgeworCQkJLyogU2tpcCB1bndhbnRlZCByZWdpc3RlcnMuICovCisJCQlpZiAoaStqIDwgZmlyc3QgfHwgaStqID4gbGFzdCkgeworCQkJCXByaW50ZigiICAgICAiKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJcnYgPSBpMmNfc21idXNfcmVhZF93b3JkX2RhdGEoYnVzX2ZkLCBpK2opOworCQkJaWYgKHJ2IDwgMCkKKwkJCQlwcmludGYoIlhYWFggIik7CisJCQllbHNlCisJCQkJcHJpbnRmKCIlMDR4ICIsIHJ2ICYgMHhmZmZmKTsKKwkJfQorCQliYl9wdXRjaGFyKCdcbicpOworCX0KK30KKworLy91c2FnZTojZGVmaW5lIGkyY2R1bXBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZl0gWy1yIEZJUlNULUxBU1RdIFsteV0gQlVTIEFERFIgW01PREVdIgorLy91c2FnZTojZGVmaW5lIGkyY2R1bXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJFeGFtaW5lIEkyQyByZWdpc3RlcnNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JSTJDQlVTCWkyYyBidXMgbnVtYmVyIgorLy91c2FnZTogICAgICJcbglBRERSRVNTCTB4MDMgLSAweDc3IgorLy91c2FnZTogICAgICJcbk1PREUgaXM6IgorLy91c2FnZTogICAgICJcbgliCWJ5dGUgKGRlZmF1bHQpIgorLy91c2FnZTogICAgICJcbgl3CXdvcmQiCisvL3VzYWdlOiAgICAgIlxuCVcJd29yZCBvbiBldmVuIHJlZ2lzdGVyIGFkZHJlc3NlcyIKKy8vdXNhZ2U6ICAgICAiXG4JaQlJMkMgYmxvY2siCisvL3VzYWdlOiAgICAgIlxuCXMJU01CdXMgYmxvY2siCisvL3VzYWdlOiAgICAgIlxuCWMJY29uc2VjdXRpdmUgYnl0ZSIKKy8vdXNhZ2U6ICAgICAiXG4JQXBwZW5kIHAgZm9yIFNNQnVzIFBFQyIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuCS1mCWZvcmNlIGFjY2VzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXkJZGlzYWJsZSBpbnRlcmFjdGl2ZSBtb2RlIgorLy91c2FnZTogICAgICJcbgktcglsaW1pdCB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBiZWluZyBhY2Nlc3NlZCIKK2ludCBpMmNkdW1wX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBpMmNkdW1wX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljb25zdCB1bnNpZ25lZCBvcHRfZiA9ICgxIDw8IDApLCBvcHRfeSA9ICgxIDw8IDEpLAorCQkJICAgICAgb3B0X3IgPSAoMSA8PCAyKTsKKwljb25zdCBjaGFyICpjb25zdCBvcHRzdHIgPSAiZnlyOiI7CisKKwlpbnQgYnVzX251bSwgYnVzX2FkZHIsIG1vZGUgPSBJMkNfU01CVVNfQllURV9EQVRBLCBldmVuID0gMCwgcGVjID0gMDsKKwl1bnNpZ25lZCBmaXJzdCA9IDB4MDAsIGxhc3QgPSAweGZmLCBvcHRzOworCWludCAqYmxvY2sgPSAoaW50ICopYmJfY29tbW9uX2J1ZnNpejE7CisJY2hhciAqb3B0X3Jfc3RyLCAqZGFzaDsKKwlpbnQgZmQsIHJlcywgYmxlbjsKKworICAgICAgICBvcHRfY29tcGxlbWVudGFyeSA9ICItMjo/MyI7IC8qIGZyb20gMiB0byAzIGFyZ3MgKi8KKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgb3B0c3RyLCAmb3B0X3Jfc3RyKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWJ1c19udW0gPSBpMmNfYnVzX2xvb2t1cChhcmd2WzBdKTsKKwlidXNfYWRkciA9IGkyY19wYXJzZV9idXNfYWRkcihhcmd2WzFdKTsKKworCWlmIChhcmd2WzJdKSB7CisJCXN3aXRjaCAoYXJndlsyXVswXSkgeworCQljYXNlICdiJzogLyogQWxyZWFkeSBzZXQuICovCQkJYnJlYWs7CisJCWNhc2UgJ2MnOiBtb2RlID0gSTJDX1NNQlVTX0JZVEU7CQlicmVhazsKKwkJY2FzZSAndyc6IG1vZGUgPSBJMkNfU01CVVNfV09SRF9EQVRBOwkJYnJlYWs7CisJCWNhc2UgJ1cnOgorCQkJbW9kZSA9IEkyQ19TTUJVU19XT1JEX0RBVEE7CisJCQlldmVuID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdzJzogbW9kZSA9IEkyQ19TTUJVU19CTE9DS19EQVRBOwkJYnJlYWs7CisJCWNhc2UgJ2knOiBtb2RlID0gSTJDX1NNQlVTX0kyQ19CTE9DS19EQVRBOwlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIG1vZGUiKTsKKwkJfQorCisJCWlmIChhcmd2WzJdWzFdID09ICdwJykgeworCQkJaWYgKGFyZ3ZbMl1bMF0gPT0gJ1cnIHx8IGFyZ3ZbMl1bMF0gPT0gJ2knKSB7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoCisJCQkJCSJwZWMgbm90IHN1cHBvcnRlZCBmb3IgLVcgYW5kIC1pIik7CisJCQl9IGVsc2UgeworCQkJCXBlYyA9IDE7CisJCQl9CisJCX0KKwl9CisKKwlpZiAob3B0cyAmIG9wdF9yKSB7CisJCWZpcnN0ID0gc3RydG9sKG9wdF9yX3N0ciwgJmRhc2gsIDApOworCQlpZiAoZGFzaCA9PSBvcHRfcl9zdHIgfHwgKmRhc2ggIT0gJy0nIHx8IGZpcnN0ID4gMHhmZikKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIHJhbmdlIik7CisJCWxhc3QgPSB4c3RydG91X3JhbmdlKCsrZGFzaCwgMCwgZmlyc3QsIDB4ZmYpOworCisJCS8qIFJhbmdlIGlzIG5vdCBhdmFpbGFibGUgZm9yIGV2ZXJ5IG1vZGUuICovCisJCXN3aXRjaCAobW9kZSkgeworCQljYXNlIEkyQ19TTUJVU19CWVRFOgorCQljYXNlIEkyQ19TTUJVU19CWVRFX0RBVEE6CisJCQlicmVhazsKKwkJY2FzZSBJMkNfU01CVVNfV09SRF9EQVRBOgorCQkJaWYgKCFldmVuIHx8ICghKGZpcnN0ICUgMikgJiYgbGFzdCAlIDIpKQorCQkJCWJyZWFrOworCQkJLyogRmFsbCB0aHJvdWdoICovCisJCWRlZmF1bHQ6CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgKKwkJCQkicmFuZ2Ugbm90IGNvbXBhdGlibGUgd2l0aCBzZWxlY3RlZCBtb2RlIik7CisJCX0KKwl9CisKKwlmZCA9IGkyY19kZXZfb3BlbihidXNfbnVtKTsKKwljaGVja19yZWFkX2Z1bmNzKGZkLCBtb2RlLCAtMSAvKiBkYXRhX2FkZHIgKi8sIHBlYyk7CisJaTJjX3NldF9zbGF2ZV9hZGRyKGZkLCBidXNfYWRkciwgb3B0cyAmIG9wdF9mKTsKKworCWlmIChwZWMpCisJCWkyY19zZXRfcGVjKGZkLCAxKTsKKworCWlmICghKG9wdHMgJiBvcHRfeSkpCisJCWNvbmZpcm1fYWN0aW9uKGJ1c19hZGRyLCBtb2RlLCAtMSAvKiBkYXRhX2FkZHIgKi8sIHBlYyk7CisKKwkvKiBBbGwgYnV0IHdvcmQgZGF0YS4gKi8KKwlpZiAobW9kZSAhPSBJMkNfU01CVVNfV09SRF9EQVRBIHx8IGV2ZW4pIHsKKwkJYmxlbiA9IHJlYWRfYmxvY2tfZGF0YShmZCwgbW9kZSwgYmxvY2spOworCisJCWlmIChtb2RlID09IEkyQ19TTUJVU19CWVRFKSB7CisJCQlyZXMgPSBpMmNfc21idXNfd3JpdGVfYnl0ZShmZCwgZmlyc3QpOworCQkJaWYgKHJlcyA8IDApCisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJ3cml0ZSBzdGFydCBhZGRyZXNzIik7CisJCX0KKworCQlkdW1wX2RhdGEoZmQsIG1vZGUsIGZpcnN0LCBsYXN0LCBibG9jaywgYmxlbik7CisJfSBlbHNlIHsKKwkJZHVtcF93b3JkX2RhdGEoZmQsIGZpcnN0LCBsYXN0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBFTkFCTEVfSTJDRFVNUCAqLworCisjaWYgRU5BQkxFX0kyQ0RFVEVDVAorZW51bSBhZGFwdGVyX3R5cGUgeworCUFEVF9EVU1NWSA9IDAsCisJQURUX0lTQSwKKwlBRFRfSTJDLAorCUFEVF9TTUJVUywKK307CisKK3N0cnVjdCBhZGFwX2Rlc2MgeworCWNvbnN0IGNoYXIgKmZ1bmNzOworCWNvbnN0IGNoYXIgKmFsZ287Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFkYXBfZGVzYyBhZGFwX2Rlc2NzW10gPSB7CisJeyAuZnVuY3MJPSAiZHVtbXkiLAorCSAgLmFsZ28JCT0gIkR1bW15IGJ1cyIsIH0sCisJeyAuZnVuY3MJPSAiaXNhIiwKKwkgIC5hbGdvCQk9ICJJU0EgYnVzIiwgfSwKKwl7IC5mdW5jcwk9ICJpMmMiLAorCSAgLmFsZ28JCT0gIkkyQyBhZGFwdGVyIiwgfSwKKwl7IC5mdW5jcwk9ICJzbWJ1cyIsCisJICAuYWxnbwkJPSAiU01CdXMgYWRhcHRlciIsIH0sCit9OworCitzdHJ1Y3QgaTJjX2Z1bmMKK3sKKwlsb25nIHZhbHVlOworCWNvbnN0IGNoYXIqIG5hbWU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGkyY19mdW5jIGkyY19mdW5jc190YWJbXSA9IHsKKwl7IC52YWx1ZSA9IEkyQ19GVU5DX0kyQywKKwkgIC5uYW1lID0gIkkyQyIgfSwKKwl7IC52YWx1ZSA9IEkyQ19GVU5DX1NNQlVTX1FVSUNLLAorCSAgLm5hbWUgPSAiU01CdXMgcXVpY2sgY29tbWFuZCIgfSwKKwl7IC52YWx1ZSA9IEkyQ19GVU5DX1NNQlVTX1dSSVRFX0JZVEUsCisJICAubmFtZSA9ICJTTUJ1cyBzZW5kIGJ5dGUiIH0sCisJeyAudmFsdWUgPSBJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEUsCisJICAubmFtZSA9ICJTTUJ1cyByZWNlaXZlIGJ5dGUiIH0sCisJeyAudmFsdWUgPSBJMkNfRlVOQ19TTUJVU19XUklURV9CWVRFX0RBVEEsCisJICAubmFtZSA9ICJTTUJ1cyB3cml0ZSBieXRlIiB9LAorCXsgLnZhbHVlID0gSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFX0RBVEEsCisJICAubmFtZSA9ICJTTUJ1cyByZWFkIGJ5dGUiIH0sCisJeyAudmFsdWUgPSBJMkNfRlVOQ19TTUJVU19XUklURV9XT1JEX0RBVEEsCisJICAubmFtZSA9ICJTTUJ1cyB3cml0ZSB3b3JkIiB9LAorCXsgLnZhbHVlID0gSTJDX0ZVTkNfU01CVVNfUkVBRF9XT1JEX0RBVEEsCisJICAubmFtZSA9ICJTTUJ1cyByZWFkIHdvcmQiIH0sCisJeyAudmFsdWUgPSBJMkNfRlVOQ19TTUJVU19QUk9DX0NBTEwsCisJICAubmFtZSA9ICJTTUJ1cyBwcm9jZXNzIGNhbGwiIH0sCisJeyAudmFsdWUgPSBJMkNfRlVOQ19TTUJVU19XUklURV9CTE9DS19EQVRBLAorCSAgLm5hbWUgPSAiU01CdXMgYmxvY2sgd3JpdGUiIH0sCisJeyAudmFsdWUgPSBJMkNfRlVOQ19TTUJVU19SRUFEX0JMT0NLX0RBVEEsCisJICAubmFtZSA9ICJTTUJ1cyBibG9jayByZWFkIiB9LAorCXsgLnZhbHVlID0gSTJDX0ZVTkNfU01CVVNfQkxPQ0tfUFJPQ19DQUxMLAorCSAgLm5hbWUgPSAiU01CdXMgYmxvY2sgcHJvY2VzcyBjYWxsIiB9LAorCXsgLnZhbHVlID0gSTJDX0ZVTkNfU01CVVNfUEVDLAorCSAgLm5hbWUgPSAiU01CdXMgUEVDIiB9LAorCXsgLnZhbHVlID0gSTJDX0ZVTkNfU01CVVNfV1JJVEVfSTJDX0JMT0NLLAorCSAgLm5hbWUgPSAiSTJDIGJsb2NrIHdyaXRlIiB9LAorCXsgLnZhbHVlID0gSTJDX0ZVTkNfU01CVVNfUkVBRF9JMkNfQkxPQ0ssCisJICAubmFtZSA9ICJJMkMgYmxvY2sgcmVhZCIgfSwKKwl7IC52YWx1ZSA9IDAsIC5uYW1lID0gTlVMTCB9Cit9OworCitzdGF0aWMgZW51bSBhZGFwdGVyX3R5cGUgaTJjZGV0ZWN0X2dldF9mdW5jcyhpbnQgYnVzKQoreworCWVudW0gYWRhcHRlcl90eXBlIHJldDsKKwl1bnNpZ25lZCBsb25nIGZ1bmNzOworCWludCBmZDsKKworCWZkID0gaTJjX2Rldl9vcGVuKGJ1cyk7CisKKwlnZXRfZnVuY3NfbWF0cml4KGZkLCAmZnVuY3MpOworCWlmIChmdW5jcyAmIEkyQ19GVU5DX0kyQykKKwkJcmV0ID0gQURUX0kyQzsKKwllbHNlIGlmIChmdW5jcyAmIChJMkNfRlVOQ19TTUJVU19CWVRFIHwKKwkJCSAgSTJDX0ZVTkNfU01CVVNfQllURV9EQVRBIHwKKwkJCSAgSTJDX0ZVTkNfU01CVVNfV09SRF9EQVRBKSkKKwkJcmV0ID0gQURUX1NNQlVTOworCWVsc2UKKwkJcmV0ID0gQURUX0RVTU1ZOworCisJY2xvc2UoZmQpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgTk9SRVRVUk4gbGlzdF9pMmNfYnVzc2VzX2FuZF9leGl0KHZvaWQpCit7CisJY29uc3QgY2hhciAqY29uc3QgaTJjZGV2X3BhdGggPSAiL3N5cy9jbGFzcy9pMmMtZGV2IjsKKworCWNoYXIgcGF0aFtOQU1FX01BWF0sIG5hbWVbMTI4XTsKKwlzdHJ1Y3QgZGlyZW50ICpkZSwgKnN1YmRlOworCWVudW0gYWRhcHRlcl90eXBlIGFkdDsKKwlESVIgKmRpciwgKnN1YmRpcjsKKwlpbnQgcnYsIGJ1czsKKwljaGFyICpwb3M7CisJRklMRSAqZnA7CisKKwkvKgorCSAqIFhYWCBVcHN0cmVhbSBpMmNkZXRlY3QgYWxzbyBsb29rcyBmb3IgaTJjIGJ1cyBpbmZvIGluIC9wcm9jL2J1cy9pMmMsCisJICogYnV0IHdlIHdvbid0IGJvdGhlciBzaW5jZSBpdCdzIG9ubHkgdXNlZnVsIG9uIG9sZGVyIGtlcm5lbHMgKGJlZm9yZQorCSAqIDIuNi41KS4gV2UgZXhwZWN0IHN5c2ZzIHRvIGJlIHByZXNlbnQgYW5kIG1vdW50ZWQgYXQgL3N5cy8uCisJICovCisKKwlkaXIgPSB4b3BlbmRpcihpMmNkZXZfcGF0aCk7CisJd2hpbGUgKChkZSA9IHJlYWRkaXIoZGlyKSkpIHsKKwkJaWYgKGRlLT5kX25hbWVbMF0gPT0gJy4nKQorCQkJY29udGludWU7CisKKwkJLyogU2ltcGxlIHZlcnNpb24gZm9yIElTQSBjaGlwcy4gKi8KKwkJc25wcmludGYocGF0aCwgTkFNRV9NQVgsICIlcy8lcy9uYW1lIiwKKwkJCSBpMmNkZXZfcGF0aCwgZGUtPmRfbmFtZSk7CisJCWZwID0gZm9wZW4ocGF0aCwgInIiKTsKKwkJaWYgKGZwID09IE5VTEwpIHsKKwkJCXNucHJpbnRmKHBhdGgsIE5BTUVfTUFYLAorCQkJCSAiJXMvJXMvZGV2aWNlL25hbWUiLAorCQkJCSBpMmNkZXZfcGF0aCwgZGUtPmRfbmFtZSk7CisJCQlmcCA9IGZvcGVuKHBhdGgsICJyIik7CisJCX0KKworCQkvKiBOb24tSVNBIGNoaXBzIHJlcXVpcmUgdGhlIGhhcmQtd2F5LiAqLworCQlpZiAoZnAgPT0gTlVMTCkgeworCQkJc25wcmludGYocGF0aCwgTkFNRV9NQVgsCisJCQkJICIlcy8lcy9kZXZpY2UvbmFtZSIsCisJCQkJIGkyY2Rldl9wYXRoLCBkZS0+ZF9uYW1lKTsKKwkJCXN1YmRpciA9IG9wZW5kaXIocGF0aCk7CisJCQlpZiAoc3ViZGlyID09IE5VTEwpCisJCQkJY29udGludWU7CisKKwkJCXdoaWxlICgoc3ViZGUgPSByZWFkZGlyKHN1YmRpcikpKSB7CisJCQkJaWYgKHN1YmRlLT5kX25hbWVbMF0gPT0gJy4nKQorCQkJCQljb250aW51ZTsKKworCQkJCWlmIChpc19wcmVmaXhlZF93aXRoKHN1YmRlLT5kX25hbWUsICJpMmMtIikpIHsKKwkJCQkJc25wcmludGYocGF0aCwgTkFNRV9NQVgsCisJCQkJCQkgIiVzLyVzL2RldmljZS8lcy9uYW1lIiwKKwkJCQkJCSBpMmNkZXZfcGF0aCwgZGUtPmRfbmFtZSwKKwkJCQkJCSBzdWJkZS0+ZF9uYW1lKTsKKwkJCQkJZnAgPSBmb3BlbihwYXRoLCAiciIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKworCQlpZiAoZnAgIT0gTlVMTCkgeworCQkJLyoKKwkJCSAqIEdldCB0aGUgcmVzdCBvZiB0aGUgaW5mbyBhbmQgZGlzcGxheSBhIGxpbmUKKwkJCSAqIGZvciBhIHNpbmdsZSBidXMuCisJCQkgKi8KKwkJCW1lbXNldChuYW1lLCAwLCBzaXplb2YobmFtZSkpOworCQkJcG9zID0gZmdldHMobmFtZSwgc2l6ZW9mKG5hbWUpLCBmcCk7CisJCQlmY2xvc2UoZnApOworCQkJaWYgKHBvcyA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCisJCQlwb3MgPSBzdHJjaHIobmFtZSwgJ1xuJyk7CisJCQlpZiAocG9zICE9IE5VTEwpCisJCQkJKnBvcyA9ICdcMCc7CisKKwkJCXJ2ID0gc3NjYW5mKGRlLT5kX25hbWUsICJpMmMtJWQiLCAmYnVzKTsKKwkJCWlmIChydiAhPSAxKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAoaXNfcHJlZml4ZWRfd2l0aChuYW1lLCAiSVNBIikpCisJCQkJYWR0ID0gQURUX0lTQTsKKwkJCWVsc2UKKwkJCQlhZHQgPSBpMmNkZXRlY3RfZ2V0X2Z1bmNzKGJ1cyk7CisKKwkJCXByaW50ZigKKwkJCQkiaTJjLSVkXHQlLTEwc1x0JS0zMnNcdCVzXG4iLAorCQkJCWJ1cywgYWRhcF9kZXNjc1thZHRdLmZ1bmNzLAorCQkJCW5hbWUsIGFkYXBfZGVzY3NbYWR0XS5hbGdvKTsKKwkJfQorCX0KKworCWV4aXQoRVhJVF9TVUNDRVNTKTsKK30KKworc3RhdGljIHZvaWQgTk9SRVRVUk4gbm9fc3VwcG9ydChjb25zdCBjaGFyICpjbWQpCit7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJ1cyBkb2Vzbid0IHN1cHBvcnQgJXMiLCBjbWQpOworfQorCitzdGF0aWMgdm9pZCB3aWxsX3NraXAoY29uc3QgY2hhciAqY21kKQoreworCWJiX2Vycm9yX21zZygKKwkJIndhcm5pbmc6IGNhbid0IHVzZSAlcyBjb21tYW5kLCAiCisJCSJ3aWxsIHNraXAgc29tZSBhZGRyZXNzZXMiLCBjbWQpOworfQorCisvL3VzYWdlOiNkZWZpbmUgaTJjZGV0ZWN0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLUYgSTJDQlVTXSBbLWxdIFsteV0gWy1hXSBbLXF8LXJdIEkyQ0JVUyBbRklSU1QgTEFTVF0iCisvL3VzYWdlOiNkZWZpbmUgaTJjZGV0ZWN0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGV0ZWN0IEkyQyBjaGlwcy5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JSTJDQlVTCWkyYyBidXMgbnVtYmVyIgorLy91c2FnZTogICAgICJcbglGSVJTVCBhbmQgTEFTVCBsaW1pdCB0aGUgcHJvYmluZyByYW5nZSIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuCS1sCW91dHB1dCBsaXN0IG9mIGluc3RhbGxlZCBidXNzZXMiCisvL3VzYWdlOiAgICAgIlxuCS15CWRpc2FibGUgaW50ZXJhY3RpdmUgbW9kZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJZm9yY2Ugc2Nhbm5pbmcgb2Ygbm9uLXJlZ3VsYXIgYWRkcmVzc2VzIgorLy91c2FnZTogICAgICJcbgktcQl1c2Ugc21idXMgcXVpY2sgd3JpdGUgY29tbWFuZHMgZm9yIHByb2JpbmcgKGRlZmF1bHQpIgorLy91c2FnZTogICAgICJcbgktcgl1c2Ugc21idXMgcmVhZCBieXRlIGNvbW1hbmRzIGZvciBwcm9iaW5nIgorLy91c2FnZTogICAgICJcbgktRglkaXNwbGF5IGxpc3Qgb2YgZnVuY3Rpb25hbGl0aWVzIgoraW50IGkyY2RldGVjdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaTJjZGV0ZWN0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljb25zdCB1bnNpZ25lZCBvcHRfeSA9ICgxIDw8IDApLCBvcHRfYSA9ICgxIDw8IDEpLAorCQkJICAgICAgb3B0X3EgPSAoMSA8PCAyKSwgb3B0X3IgPSAoMSA8PCAzKSwKKwkJCSAgICAgIG9wdF9GID0gKDEgPDwgNCksIG9wdF9sID0gKDEgPDwgNSk7CisJY29uc3QgY2hhciAqY29uc3Qgb3B0c3RyID0gInlhcXJGbCI7CisKKwlpbnQgZmQsIGJ1c19udW0sIGksIGosIG1vZGUgPSBJMkNERVRFQ1RfTU9ERV9BVVRPLCBzdGF0dXM7CisJdW5zaWduZWQgZmlyc3QgPSAweDAzLCBsYXN0ID0gMHg3Nywgb3B0czsKKwl1bnNpZ25lZCBsb25nIGZ1bmNzOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAicS0tcjpyLS1xOiIgLyogbXV0dWFsbHkgZXhjbHVzaXZlICovCisJCQkiPzMiOyAvKiB1cCB0byAzIGFyZ3MgKi8KKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgb3B0c3RyKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChvcHRzICYgb3B0X2wpCisJCWxpc3RfaTJjX2J1c3Nlc19hbmRfZXhpdCgpOworCisJaWYgKCFhcmd2WzBdKQorCQliYl9zaG93X3VzYWdlKCk7CisKKwlidXNfbnVtID0gaTJjX2J1c19sb29rdXAoYXJndlswXSk7CisJZmQgPSBpMmNfZGV2X29wZW4oYnVzX251bSk7CisJZ2V0X2Z1bmNzX21hdHJpeChmZCwgJmZ1bmNzKTsKKworCWlmIChvcHRzICYgb3B0X0YpIHsKKwkJLyogT25seSBsaXN0IHRoZSBmdW5jdGlvbmFsaXRpZXMuICovCisJCXByaW50ZigiRnVuY3Rpb25hbGl0aWVzIGltcGxlbWVudGVkIGJ5IGJ1cyAjJWRcbiIsIGJ1c19udW0pOworCQlmb3IgKGkgPSAwOyBpMmNfZnVuY3NfdGFiW2ldLnZhbHVlOyBpKyspIHsKKwkJCXByaW50ZigiJS0zMnMgJXNcbiIsIGkyY19mdW5jc190YWJbaV0ubmFtZSwKKwkJCSAgICAgICBmdW5jcyAmIGkyY19mdW5jc190YWJbaV0udmFsdWUgPyAieWVzIiA6ICJubyIpOworCQl9CisKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwlpZiAob3B0cyAmIG9wdF9yKQorCQltb2RlID0gSTJDREVURUNUX01PREVfUkVBRDsKKwllbHNlIGlmIChvcHRzICYgb3B0X3EpCisJCW1vZGUgPSBJMkNERVRFQ1RfTU9ERV9RVUlDSzsKKworCWlmIChvcHRzICYgb3B0X2EpIHsKKwkJZmlyc3QgPSAweDAwOworCQlsYXN0ID0gMHg3ZjsKKwl9CisKKwkvKiBSZWFkIGFkZHJlc3MgcmFuZ2UuICovCisJaWYgKGFyZ3ZbMV0pIHsKKwkJZmlyc3QgPSB4c3RydG91X3JhbmdlKGFyZ3ZbMV0sIDE2LCBmaXJzdCwgbGFzdCk7CisJCWlmIChhcmd2WzJdKQorCQkJbGFzdCA9IHhzdHJ0b3VfcmFuZ2UoYXJndlsyXSwgMTYsIGZpcnN0LCBsYXN0KTsKKwl9CisKKwlpZiAoIShmdW5jcyAmIChJMkNfRlVOQ19TTUJVU19RVUlDSyB8IEkyQ19GVU5DX1NNQlVTX1JFQURfQllURSkpKSB7CisJCW5vX3N1cHBvcnQoImRldGVjdGlvbiBjb21tYW5kcyIpOworCX0gZWxzZQorCWlmIChtb2RlID09IEkyQ0RFVEVDVF9NT0RFX1FVSUNLICYmICEoZnVuY3MgJiBJMkNfRlVOQ19TTUJVU19RVUlDSykpIHsKKwkJbm9fc3VwcG9ydCgiU01CdXMgcXVpY2sgd3JpdGUiKTsKKwl9IGVsc2UKKwlpZiAobW9kZSA9PSBJMkNERVRFQ1RfTU9ERV9SRUFEICYmICEoZnVuY3MgJiBJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEUpKSB7CisJCW5vX3N1cHBvcnQoIlNNQnVzIHJlY2VpdmUgYnl0ZSIpOworCX0KKworCWlmIChtb2RlID09IEkyQ0RFVEVDVF9NT0RFX0FVVE8pIHsKKwkJaWYgKCEoZnVuY3MgJiBJMkNfRlVOQ19TTUJVU19RVUlDSykpCisJCQl3aWxsX3NraXAoIlNNQnVzIHF1aWNrIHdyaXRlIik7CisJCWlmICghKGZ1bmNzICYgSTJDX0ZVTkNfU01CVVNfUkVBRF9CWVRFKSkKKwkJCXdpbGxfc2tpcCgiU01CdXMgcmVjZWl2ZSBieXRlIik7CisJfQorCisJaWYgKCEob3B0cyAmIG9wdF95KSkKKwkJY29uZmlybV9hY3Rpb24oLTEsIC0xLCAtMSwgMCk7CisKKwlwdXRzKCIgICAgIDAgIDEgIDIgIDMgIDQgIDUgIDYgIDcgIDggIDkgIGEgIGIgIGMgIGQgIGUgIGYiKTsKKwlmb3IgKGkgPSAwOyBpIDwgMTI4OyBpICs9IDE2KSB7CisJCXByaW50ZigiJTAyeDogIiwgaSk7CisJCWZvcihqID0gMDsgaiA8IDE2OyBqKyspIHsKKwkJCWZmbHVzaF9hbGwoKTsKKworCQkJaWYgKG1vZGUgPT0gSTJDREVURUNUX01PREVfQVVUTykgeworCQkJCWlmICgoaStqID49IDB4MzAgJiYgaStqIDw9IDB4MzcpIHx8CisJCQkJICAgIChpK2ogPj0gMHg1MCAmJiBpK2ogPD0gMHg1RikpCisJCQkJCW1vZGUgPSBJMkNERVRFQ1RfTU9ERV9SRUFEOworCQkJCWVsc2UKKwkJCQkJbW9kZSA9IEkyQ0RFVEVDVF9NT0RFX1FVSUNLOworCQkJfQorCisJCQkvKiBTa2lwIHVud2FudGVkIGFkZHJlc3Nlcy4gKi8KKwkJCWlmIChpK2ogPCBmaXJzdAorCQkJIHx8IGkraiA+IGxhc3QKKwkJCSB8fCAobW9kZSA9PSBJMkNERVRFQ1RfTU9ERV9SRUFEICYmICEoZnVuY3MgJiBJMkNfRlVOQ19TTUJVU19SRUFEX0JZVEUpKQorCQkJIHx8IChtb2RlID09IEkyQ0RFVEVDVF9NT0RFX1FVSUNLICYmICEoZnVuY3MgJiBJMkNfRlVOQ19TTUJVU19RVUlDSykpKQorCQkJeworCQkJCXByaW50ZigiICAgIik7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCXN0YXR1cyA9IGlvY3RsKGZkLCBJMkNfU0xBVkUsIGl0b3B0cihpICsgaikpOworCQkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCQlpZiAoZXJybm8gPT0gRUJVU1kpIHsKKwkJCQkJcHJpbnRmKCJVVSAiKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKAorCQkJCQkiY2FuJ3Qgc2V0IGFkZHJlc3MgdG8gMHglMDJ4IiwgaSArIGopOworCQkJfQorCisJCQlzd2l0Y2ggKG1vZGUpIHsKKwkJCWNhc2UgSTJDREVURUNUX01PREVfUkVBRDoKKwkJCQkvKgorCQkJCSAqIFRoaXMgaXMga25vd24gdG8gbG9jayBTTUJ1cyBvbiB2YXJpb3VzCisJCQkJICogd3JpdGUtb25seSBjaGlwcyAobWFpbmx5IGNsb2NrIGNoaXBzKS4KKwkJCQkgKi8KKwkJCQlzdGF0dXMgPSBpMmNfc21idXNfcmVhZF9ieXRlKGZkKTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6IC8qIEkyQ0RFVEVDVF9NT0RFX1FVSUNLOiAqLworCQkJCS8qCisJCQkJICogVGhpcyBpcyBrbm93biB0byBjb3JydXB0IHRoZSBBdG1lbAorCQkJCSAqIEFUMjRSRjA4IEVFUFJPTS4KKwkJCQkgKi8KKwkJCQlzdGF0dXMgPSBpMmNfc21idXNfd3JpdGVfcXVpY2soZmQsCisJCQkJCQkJICAgICAgIEkyQ19TTUJVU19XUklURSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChzdGF0dXMgPCAwKQorCQkJCXByaW50ZigiLS0gIik7CisJCQllbHNlCisJCQkJcHJpbnRmKCIlMDJ4ICIsIGkraik7CisJCX0KKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBFTkFCTEVfSTJDREVURUNUICovCmRpZmYgLS1naXQgYS9taXNjdXRpbHMvaW5vdGlmeWQuYyBiL21pc2N1dGlscy9pbm90aWZ5ZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMWE2YTIKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvaW5vdGlmeWQuYwpAQCAtMCwwICsxLDIxMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogc2ltcGxlIGlub3RpZnkgZGFlbW9uCisgKiByZXBvcnRzIGZpbGVzeXN0ZW0gY2hhbmdlcyB2aWEgdXNlcnNwYWNlIGFnZW50CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qCisgKiBVc2UgYXMgZm9sbG93czoKKyAqICMgaW5vdGlmeWQgL3VzZXIvc3BhY2UvYWdlbnQgZGlyL29yL2ZpbGUvYmVpbmcvd2F0Y2hlZFs6bWFza10gLi4uCisgKgorICogV2hlbiBhIGZpbGVzeXN0ZW0gZXZlbnQgbWF0Y2hpbmcgdGhlIHNwZWNpZmllZCBtYXNrIGlzIG9jY3VyZWQgb24gc3BlY2lmaWVkIGZpbGUgKG9yIGRpcmVjdG9yeSkKKyAqIGEgdXNlcnNwYWNlIGFnZW50IGlzIHNwYXduZWQgYW5kIGdpdmVuIHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKyAqICQxLiBhY3R1YWwgZXZlbnQocykKKyAqICQyLiBmaWxlIChvciBkaXJlY3RvcnkpIG5hbWUKKyAqICQzLiBuYW1lIG9mIHN1YmZpbGUgKGlmIGFueSksIGluIGNhc2Ugb2Ygd2F0Y2hpbmcgYSBkaXJlY3RvcnkKKyAqCisgKiBFLmcuIGlub3RpZnlkIC4vZGV2LXdhdGNoZXIgL2RldjpuCisgKgorICogLi9kZXYtd2F0Y2hlciBjYW4gYmUsIHNheToKKyAqICMhL2Jpbi9zaAorICogZWNobyAiV2UgaGF2ZSBuZXcgZGV2aWNlIGluIGhlcmUhIEhlbGxvLCAkMyEiCisgKgorICogU2VlIGJlbG93IGZvciBtYXNrIG5hbWVzIGV4cGxhbmF0aW9uLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBpbm90aWZ5ZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiUFJPRyBGSUxFMVs6TUFTS10uLi4iCisvL3VzYWdlOiNkZWZpbmUgaW5vdGlmeWRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSdW4gUFJPRyBvbiBmaWxlc3lzdGVtIGNoYW5nZXMuIgorLy91c2FnZTogICAgICJcbldoZW4gYSBmaWxlc3lzdGVtIGV2ZW50IG1hdGNoaW5nIE1BU0sgb2NjdXJzIG9uIEZJTEVuLCIKKy8vdXNhZ2U6ICAgICAiXG5QUk9HIEFDVFVBTF9FVkVOVFMgRklMRW4gW1NVQkZJTEVdIGlzIHJ1bi4iCisvL3VzYWdlOiAgICAgIlxuSWYgUFJPRyBpcyAtLCBldmVudHMgYXJlIHNlbnQgdG8gc3Rkb3V0LiIKKy8vdXNhZ2U6ICAgICAiXG5FdmVudHM6IgorLy91c2FnZTogICAgICJcbglhCUZpbGUgaXMgYWNjZXNzZWQiCisvL3VzYWdlOiAgICAgIlxuCWMJRmlsZSBpcyBtb2RpZmllZCIKKy8vdXNhZ2U6ICAgICAiXG4JZQlNZXRhZGF0YSBjaGFuZ2VkIgorLy91c2FnZTogICAgICJcbgl3CVdyaXRhYmxlIGZpbGUgaXMgY2xvc2VkIgorLy91c2FnZTogICAgICJcbgkwCVVud3JpdGFibGUgZmlsZSBpcyBjbG9zZWQiCisvL3VzYWdlOiAgICAgIlxuCXIJRmlsZSBpcyBvcGVuZWQiCisvL3VzYWdlOiAgICAgIlxuCUQJRmlsZSBpcyBkZWxldGVkIgorLy91c2FnZTogICAgICJcbglNCUZpbGUgaXMgbW92ZWQiCisvL3VzYWdlOiAgICAgIlxuCXUJQmFja2luZyBmcyBpcyB1bm1vdW50ZWQiCisvL3VzYWdlOiAgICAgIlxuCW8JRXZlbnQgcXVldWUgb3ZlcmZsb3dlZCIKKy8vdXNhZ2U6ICAgICAiXG4JeAlGaWxlIGNhbid0IGJlIHdhdGNoZWQgYW55bW9yZSIKKy8vdXNhZ2U6ICAgICAiXG5JZiB3YXRjaGluZyBhIGRpcmVjdG9yeToiCisvL3VzYWdlOiAgICAgIlxuCW0JU3ViZmlsZSBpcyBtb3ZlZCBpbnRvIGRpciIKKy8vdXNhZ2U6ICAgICAiXG4JeQlTdWJmaWxlIGlzIG1vdmVkIG91dCBvZiBkaXIiCisvL3VzYWdlOiAgICAgIlxuCW4JU3ViZmlsZSBpcyBjcmVhdGVkIgorLy91c2FnZTogICAgICJcbglkCVN1YmZpbGUgaXMgZGVsZXRlZCIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuaW5vdGlmeWQgd2FpdHMgZm9yIFBST0cgdG8gZXhpdC4iCisvL3VzYWdlOiAgICAgIlxuV2hlbiB4IGV2ZW50IGhhcHBlbnMgZm9yIGFsbCBGSUxFcywgaW5vdGlmeWQgZXhpdHMuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXMvaW5vdGlmeS5oPgorCitzdGF0aWMgY29uc3QgY2hhciBtYXNrX25hbWVzW10gQUxJR04xID0KKwkiYSIJLy8gMHgwMDAwMDAwMQlGaWxlIHdhcyBhY2Nlc3NlZAorCSJjIgkvLyAweDAwMDAwMDAyCUZpbGUgd2FzIG1vZGlmaWVkCisJImUiCS8vIDB4MDAwMDAwMDQJTWV0YWRhdGEgY2hhbmdlZAorCSJ3IgkvLyAweDAwMDAwMDA4CVdyaXRhYmxlIGZpbGUgd2FzIGNsb3NlZAorCSIwIgkvLyAweDAwMDAwMDEwCVVud3JpdGFibGUgZmlsZSBjbG9zZWQKKwkiciIJLy8gMHgwMDAwMDAyMAlGaWxlIHdhcyBvcGVuZWQKKwkibSIJLy8gMHgwMDAwMDA0MAlGaWxlIHdhcyBtb3ZlZCBmcm9tIFgKKwkieSIJLy8gMHgwMDAwMDA4MAlGaWxlIHdhcyBtb3ZlZCB0byBZCisJIm4iCS8vIDB4MDAwMDAxMDAJU3ViZmlsZSB3YXMgY3JlYXRlZAorCSJkIgkvLyAweDAwMDAwMjAwCVN1YmZpbGUgd2FzIGRlbGV0ZWQKKwkiRCIJLy8gMHgwMDAwMDQwMAlTZWxmIHdhcyBkZWxldGVkCisJIk0iCS8vIDB4MDAwMDA4MDAJU2VsZiB3YXMgbW92ZWQKKwkiXDAiCS8vIDB4MDAwMDEwMDAgICAodW51c2VkKQorCS8vIEtlcm5lbCBldmVudHMsIGFsd2F5cyByZXBvcnRlZDoKKwkidSIJLy8gMHgwMDAwMjAwMCAgIEJhY2tpbmcgZnMgd2FzIHVubW91bnRlZAorCSJvIgkvLyAweDAwMDA0MDAwICAgRXZlbnQgcXVldWVkIG92ZXJmbG93ZWQKKwkieCIJLy8gMHgwMDAwODAwMCAgIEZpbGUgaXMgbm8gbG9uZ2VyIHdhdGNoZWQgKHVzdWFsbHkgZGVsZXRlZCkKKzsKK2VudW0geworCU1BU0tfQklUUyA9IHNpemVvZihtYXNrX25hbWVzKSAtIDEKK307CisKK2ludCBpbm90aWZ5ZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaW5vdGlmeWRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IG47CisJdW5zaWduZWQgbWFzazsKKwlzdHJ1Y3QgcG9sbGZkIHBmZDsKKwljaGFyICoqd2F0Y2hlczsgLy8gbmFtZXMgb2YgZmlsZXMgYmVpbmcgd2F0Y2hlZAorCWNvbnN0IGNoYXIgKmFyZ3NbNV07CisKKwkvLyBzYW5pdHkgY2hlY2s6IGFnZW50IGFuZCBhdCBsZWFzdCBvbmUgd2F0Y2ggbXVzdCBiZSBnaXZlbgorCWlmICghYXJndlsxXSB8fCAhYXJndlsyXSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJYXJndisrOworCS8vIGlub3RpZnlfYWRkX3dhdGNoIHdpbGwgbnVtYmVyIHdhdGNoZWQgZmlsZXMKKwkvLyBzdGFydGluZyBmcm9tIDEsIHRodXMgd2F0Y2hlc1swXSBpcyB1bmltcG9ydGFudCwKKwkvLyBhbmQgMXN0IGZpbGUgbmFtZSBpcyB3YXRjaGVzWzFdLgorCXdhdGNoZXMgPSBhcmd2OworCWFyZ3NbMF0gPSAqYXJndjsKKwlhcmdzWzRdID0gTlVMTDsKKwlhcmdjIC09IDI7IC8vIG51bWJlciBvZiBmaWxlcyB3ZSB3YXRjaAorCisJLy8gb3BlbiBpbm90aWZ5CisJcGZkLmZkID0gaW5vdGlmeV9pbml0KCk7CisJaWYgKHBmZC5mZCA8IDApCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgibm8ga2VybmVsIHN1cHBvcnQiKTsKKworCS8vIHNldHVwIHdhdGNoZXMKKwl3aGlsZSAoKisrYXJndikgeworCQljaGFyICpwYXRoID0gKmFyZ3Y7CisJCWNoYXIgKm1hc2tzID0gc3RyY2hyKHBhdGgsICc6Jyk7CisKKwkJbWFzayA9IDB4MGZmZjsgLy8gYXNzdW1pbmcgd2Ugd2FudCBhbGwgbm9uLWtlcm5lbCBldmVudHMKKwkJLy8gaWYgbWFzayBpcyBzcGVjaWZpZWQgLT4KKwkJaWYgKG1hc2tzKSB7CisJCQkqbWFza3MgPSAnXDAnOyAvLyBzcGxpdCBwYXRoIGFuZCBtYXNrCisJCQkvLyBjb252ZXJ0IG1hc2sgbmFtZXMgdG8gbWFzayBiaXRzZXQKKwkJCW1hc2sgPSAwOworCQkJd2hpbGUgKCorK21hc2tzKSB7CisJCQkJY29uc3QgY2hhciAqZm91bmQ7CisJCQkJZm91bmQgPSBtZW1jaHIobWFza19uYW1lcywgKm1hc2tzLCBNQVNLX0JJVFMpOworCQkJCWlmIChmb3VuZCkKKwkJCQkJbWFzayB8PSAoMSA8PCAoZm91bmQgLSBtYXNrX25hbWVzKSk7CisJCQl9CisJCX0KKwkJLy8gYWRkIHdhdGNoCisJCW4gPSBpbm90aWZ5X2FkZF93YXRjaChwZmQuZmQsIHBhdGgsIG1hc2spOworCQlpZiAobiA8IDApCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImFkZCB3YXRjaCAoJXMpIGZhaWxlZCIsIHBhdGgpOworCQkvL2JiX2Vycm9yX21zZygiYWRkZWQgJWQgWyVzXTolNFgiLCBuLCBwYXRoLCBtYXNrKTsKKwl9CisKKwkvLyBzZXR1cCBzaWduYWxzCisJYmJfc2lnbmFscyhCQl9GQVRBTF9TSUdTLCByZWNvcmRfc2lnbm8pOworCisJLy8gZG8gd2F0Y2gKKwlwZmQuZXZlbnRzID0gUE9MTElOOworCXdoaWxlICgxKSB7CisJCWludCBsZW47CisJCXZvaWQgKmJ1ZjsKKwkJc3RydWN0IGlub3RpZnlfZXZlbnQgKmllOworIGFnYWluOgorCQlpZiAoYmJfZ290X3NpZ25hbCkKKwkJCWJyZWFrOworCQluID0gcG9sbCgmcGZkLCAxLCAtMSk7CisJCS8vIFNpZ25hbCBpbnRlcnJ1cHRlZCB1cz8KKwkJaWYgKG4gPCAwICYmIGVycm5vID09IEVJTlRSKQorCQkJZ290byBhZ2FpbjsKKwkJLy8gVW5kZXIgTGludXgsIGFib3ZlIGlmKCkgaXMgbm90IG5lY2Vzc2FyeS4KKwkJLy8gTm9uLWZhdGFsIHNpZ25hbHMsIGUuZy4gU0lHQ0hMRCwgd2hlbiBzZXQgdG8gU0lHX0RGTCwKKwkJLy8gYXJlIG5vdCBpbnRlcnJ1cHRpbmcgcG9sbCgpLgorCQkvLyBUaHVzIHdlIGNhbiBqdXN0IGJyZWFrIGlmIG4gPD0gMCAoc2VlIGJlbG93KSwKKwkJLy8gYmVjYXVzZSBFSU5UUiB3aWxsIGhhcHBlbiBvbmx5IG9uIFNJR1RFUk0gZXQgYWwuCisJCS8vIEJ1dCB0aGlzIG1pZ2h0IGJlIG5vdCB0cnVlIHVuZGVyIG90aGVyIFVuaXhlcywKKwkJLy8gYW5kIGlzIGdlbmVyYWxseSB3YXkgdG9vIHN1YnRsZSB0byBkZXBlbmQgb24uCisJCWlmIChuIDw9IDApIC8vIHN0cmFuZ2UgZXJyb3I/CisJCQlicmVhazsKKworCQkvLyByZWFkIG91dCBhbGwgcGVuZGluZyBldmVudHMKKwkJLy8gKE5COiBsZW4gbXVzdCBiZSBpbnQsIG5vdCBzc2l6ZV90IG9yIGxvbmchKQorCQl4aW9jdGwocGZkLmZkLCBGSU9OUkVBRCwgJmxlbik7CisjZGVmaW5lIGV2ZW50YnVmIGJiX2NvbW1vbl9idWZzaXoxCisJCWllID0gYnVmID0gKGxlbiA8PSBzaXplb2YoZXZlbnRidWYpKSA/IGV2ZW50YnVmIDogeG1hbGxvYyhsZW4pOworCQlsZW4gPSBmdWxsX3JlYWQocGZkLmZkLCBidWYsIGxlbik7CisJCS8vIHByb2Nlc3MgZXZlbnRzLiBOLkIuIGV2ZW50cyBtYXkgdmFyeSBpbiBsZW5ndGgKKwkJd2hpbGUgKGxlbiA+IDApIHsKKwkJCWludCBpOworCQkJLy8gY2FjaGUgcmVsZXZhbnQgZXZlbnRzIG1hc2sKKwkJCXVuc2lnbmVkIG0gPSBpZS0+bWFzayAmICgoMSA8PCBNQVNLX0JJVFMpIC0gMSk7CisJCQlpZiAobSkgeworCQkJCWNoYXIgZXZlbnRzW01BU0tfQklUUyArIDFdOworCQkJCWNoYXIgKnMgPSBldmVudHM7CisJCQkJZm9yIChpID0gMDsgaSA8IE1BU0tfQklUUzsgKytpLCBtID4+PSAxKSB7CisJCQkJCWlmICgobSAmIDEpICYmIChtYXNrX25hbWVzW2ldICE9ICdcMCcpKQorCQkJCQkJKnMrKyA9IG1hc2tfbmFtZXNbaV07CisJCQkJfQorCQkJCSpzID0gJ1wwJzsKKwkJCQlpZiAoTE9ORV9DSEFSKGFyZ3NbMF0sICctJykpIHsKKwkJCQkJLyogImlub3RpZnlkIC0gRklMRSI6IGJ1aWx0LWluIGVjaG8gKi8KKwkJCQkJcHJpbnRmKGllLT5sZW4gPyAiJXNcdCVzXHQlc1xuIiA6ICIlc1x0JXNcbiIsIGV2ZW50cywKKwkJCQkJCQl3YXRjaGVzW2llLT53ZF0sCisJCQkJCQkJaWUtPm5hbWUpOworCQkJCQlmZmx1c2goc3Rkb3V0KTsKKwkJCQl9IGVsc2UgeworLy8JCQkJCWJiX2Vycm9yX21zZygiZXhlYyAlcyAlMDhYXHQlc1x0JXNcdCVzIiwgYXJnc1swXSwKKy8vCQkJCQkJaWUtPm1hc2ssIGV2ZW50cywgd2F0Y2hlc1tpZS0+d2RdLCBpZS0+bGVuID8gaWUtPm5hbWUgOiAiIik7CisJCQkJCWFyZ3NbMV0gPSBldmVudHM7CisJCQkJCWFyZ3NbMl0gPSB3YXRjaGVzW2llLT53ZF07CisJCQkJCWFyZ3NbM10gPSBpZS0+bGVuID8gaWUtPm5hbWUgOiBOVUxMOworCQkJCQlzcGF3bl9hbmRfd2FpdCgoY2hhciAqKilhcmdzKTsKKwkJCQl9CisJCQkJLy8gd2UgYXJlIGRvbmUgaWYgYWxsIGZpbGVzIGdvdCBmaW5hbCB4IGV2ZW50CisJCQkJaWYgKGllLT5tYXNrICYgMHg4MDAwKSB7CisJCQkJCWlmICgtLWFyZ2MgPD0gMCkKKwkJCQkJCWdvdG8gZG9uZTsKKwkJCQkJaW5vdGlmeV9ybV93YXRjaChwZmQuZmQsIGllLT53ZCk7CisJCQkJfQorCQkJfQorCQkJLy8gbmV4dCBldmVudAorCQkJaSA9IHNpemVvZihzdHJ1Y3QgaW5vdGlmeV9ldmVudCkgKyBpZS0+bGVuOworCQkJbGVuIC09IGk7CisJCQlpZSA9ICh2b2lkKikoKGNoYXIqKWllICsgaSk7CisJCX0KKwkJaWYgKGV2ZW50YnVmICE9IGJ1ZikKKwkJCWZyZWUoYnVmKTsKKwl9IC8vIHdoaWxlICgxKQorIGRvbmU6CisJcmV0dXJuIGJiX2dvdF9zaWduYWw7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvaW9uaWNlLmMgYi9taXNjdXRpbHMvaW9uaWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzMDA2MAotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9pb25pY2UuYwpAQCAtMCwwICsxLDEwNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaW9uaWNlIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94IGJhc2VkIG9uIGxpbnV4LXV0aWxzLW5nIDIuMTQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgIDx1MTczMDM0QGluZm9ybWF0aWsudW5pLW9sZGVuYnVyZy5kZT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBpb25pY2VfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIlstYyAxLTNdIFstbiAwLTddIFstcCBQSURdIFtQUk9HXSIKKy8vdXNhZ2U6I2RlZmluZSBpb25pY2VfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDaGFuZ2UgSS9PIHByaW9yaXR5IGFuZCBjbGFzc1xuIgorLy91c2FnZTogICAgICJcbgktYwlDbGFzcy4gMTpyZWFsdGltZSAyOmJlc3QtZWZmb3J0IDM6aWRsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JUHJpb3JpdHkiCisKKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdGF0aWMgaW50IGlvcHJpb19zZXQoaW50IHdoaWNoLCBpbnQgd2hvLCBpbnQgaW9wcmlvKQoreworCXJldHVybiBzeXNjYWxsKFNZU19pb3ByaW9fc2V0LCB3aGljaCwgd2hvLCBpb3ByaW8pOworfQorCitzdGF0aWMgaW50IGlvcHJpb19nZXQoaW50IHdoaWNoLCBpbnQgd2hvKQoreworCXJldHVybiBzeXNjYWxsKFNZU19pb3ByaW9fZ2V0LCB3aGljaCwgd2hvKTsKK30KKworZW51bSB7CisJSU9QUklPX1dIT19QUk9DRVNTID0gMSwKKwlJT1BSSU9fV0hPX1BHUlAsCisJSU9QUklPX1dIT19VU0VSCit9OworCitlbnVtIHsKKwlJT1BSSU9fQ0xBU1NfTk9ORSwKKwlJT1BSSU9fQ0xBU1NfUlQsCisJSU9QUklPX0NMQVNTX0JFLAorCUlPUFJJT19DTEFTU19JRExFCit9OworCitzdGF0aWMgY29uc3QgY2hhciB0b19wcmlvW10gPSAibm9uZVwwcmVhbHRpbWVcMGJlc3QtZWZmb3J0XDBpZGxlIjsKKworI2RlZmluZSBJT1BSSU9fQ0xBU1NfU0hJRlQgICAgICAxMworCitpbnQgaW9uaWNlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBpb25pY2VfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCS8qIERlZmF1bHRzICovCisJaW50IGlvY2xhc3MgPSAwOworCWludCBwcmkgPSAwOworCWludCBwaWQgPSAwOyAvKiBhZmZlY3Qgb3duIHBvcmNlc3MgKi8KKwlpbnQgb3B0OworCWVudW0geworCQlPUFRfbiA9IDEsCisJCU9QVF9jID0gMiwKKwkJT1BUX3AgPSA0LAorCX07CisKKwkvKiBOdW1lcmljIHBhcmFtcyAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIm4rOmMrOnArIjsKKwkvKiAnKyc6IHN0b3AgYXQgZmlyc3Qgbm9uLW9wdGlvbiAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICIrbjpjOnA6IiwgJnByaSwgJmlvY2xhc3MsICZwaWQpOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKG9wdCAmIE9QVF9jKSB7CisJCWlmIChpb2NsYXNzID4gMykKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgY2xhc3MgJWQiLCBpb2NsYXNzKTsKKy8vIERvIHdlIG5lZWQgdGhpcyAoY29tcGF0Pyk/CisvLwkJaWYgKGlvY2xhc3MgPT0gSU9QUklPX0NMQVNTX05PTkUpCisvLwkJCWlvY2xhc3MgPSBJT1BSSU9fQ0xBU1NfQkU7CisvLwkJaWYgKGlvY2xhc3MgPT0gSU9QUklPX0NMQVNTX0lETEUpIHsKKy8vCQkJLy9pZiAob3B0ICYgT1BUX24pCisvLwkJCS8vCWJiX2Vycm9yX21zZygiaWdub3JpbmcgcHJpb3JpdHkgZm9yIGlkbGUgY2xhc3MiKTsKKy8vCQkJcHJpID0gNzsKKy8vCQl9CisJfQorCisJaWYgKCEob3B0ICYgKE9QVF9ufE9QVF9jKSkpIHsKKwkJaWYgKCEob3B0ICYgT1BUX3ApICYmICphcmd2KQorCQkJcGlkID0geGF0b2lfcG9zaXRpdmUoKmFyZ3YpOworCisJCXByaSA9IGlvcHJpb19nZXQoSU9QUklPX1dIT19QUk9DRVNTLCBwaWQpOworCQlpZiAocHJpID09IC0xKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJpb3ByaW9fJWNldCIsICdnJyk7CisKKwkJaW9jbGFzcyA9IChwcmkgPj4gSU9QUklPX0NMQVNTX1NISUZUKSAmIDB4MzsKKwkJcHJpICY9IDB4ZmY7CisJCXByaW50ZigoaW9jbGFzcyA9PSBJT1BSSU9fQ0xBU1NfSURMRSkgPyAiJXNcbiIgOiAiJXM6IHByaW8gJWRcbiIsCisJCQkJbnRoX3N0cmluZyh0b19wcmlvLCBpb2NsYXNzKSwgcHJpKTsKKwl9IGVsc2UgeworLy9wcmludGYoInByaT0lZCBjbGFzcz0lZCB2YWw9JXhcbiIsCisvL3ByaSwgaW9jbGFzcywgcHJpIHwgKGlvY2xhc3MgPDwgSU9QUklPX0NMQVNTX1NISUZUKSk7CisJCXByaSB8PSAoaW9jbGFzcyA8PCBJT1BSSU9fQ0xBU1NfU0hJRlQpOworCQlpZiAoaW9wcmlvX3NldChJT1BSSU9fV0hPX1BST0NFU1MsIHBpZCwgcHJpKSA9PSAtMSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiaW9wcmlvXyVjZXQiLCAncycpOworCQlpZiAoYXJndlswXSkgeworCQkJQkJfRVhFQ1ZQX29yX2RpZShhcmd2KTsKKwkJfQorCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvbGFzdC5jIGIvbWlzY3V0aWxzL2xhc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGYzNDM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL2xhc3QuYwpAQCAtMCwwICsxLDE0NCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbGFzdCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBsYXN0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiSUZfRkVBVFVSRV9MQVNUX0ZBTkNZKCJbLUhXXSBbLWYgRklMRV0iKQorLy91c2FnZTojZGVmaW5lIGxhc3RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTaG93IGxpc3Rpbmcgb2YgdGhlIGxhc3QgdXNlcnMgdGhhdCBsb2dnZWQgaW50byB0aGUgc3lzdGVtIgorLy91c2FnZToJSUZfRkVBVFVSRV9MQVNUX0ZBTkNZKCAiXG4iCisvKiAvL3VzYWdlOiAgIlxuCS1ICVNob3cgaGVhZGVyIGxpbmUiICovCisvL3VzYWdlOiAgICAgIlxuCS1XCURpc3BsYXkgd2l0aCBubyBob3N0IGNvbHVtbiB0cnVuY2F0aW9uIgorLy91c2FnZTogICAgICJcbgktZiBGSUxFIFJlYWQgZnJvbSBGSUxFIGluc3RlYWQgb2YgL3Zhci9sb2cvd3RtcCIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIE5COiB1dF9uYW1lIGFuZCB1dF91c2VyIGFyZSB0aGUgc2FtZSBmaWVsZCwgdXNlIG9ubHkgb25lIG5hbWUgKHV0X3VzZXIpCisgKiB0byByZWR1Y2UgY29uZnVzaW9uICovCisKKyNpZm5kZWYgU0hVVERPV05fVElNRQorIyAgZGVmaW5lIFNIVVRET1dOX1RJTUUgMjU0CisjZW5kaWYKKworLyogR3JyLi4uIHV0bXAgY2hhcltdIG1lbWJlcnMgZG8gbm90IGhhdmUgdG8gYmUgbnVsLXRlcm1pbmF0ZWQuCisgKiBEbyB3aGF0IHdlIGNhbiB3aGlsZSBzdGlsbCBrZWVwaW5nIHRoaXMgcmVhc29uYWJseSBzbWFsbC4KKyAqIE5vdGU6IFdlIGFyZSBhc3N1bWluZyB0aGUgdXRfaWRbXSBzaXplIGlzIGZpeGVkIGF0IDQuICovCisKKyNpZiBkZWZpbmVkIFVUX0xJTkVTSVpFIFwKKwkmJiAoKFVUX0xJTkVTSVpFICE9IDMyKSB8fCAoVVRfTkFNRVNJWkUgIT0gMzIpIHx8IChVVF9IT1NUU0laRSAhPSAyNTYpKQorI2Vycm9yIHN0cnVjdCB1dG1weCBtZW1iZXIgY2hhcltdIHNpemUocykgaGF2ZSBjaGFuZ2VkIQorI2VsaWYgZGVmaW5lZCBfX1VUX0xJTkVTSVpFIFwKKwkmJiAoKF9fVVRfTElORVNJWkUgIT0gMzIpIHx8IChfX1VUX05BTUVTSVpFICE9IDMyKSB8fCAoX19VVF9IT1NUU0laRSAhPSAyNTYpKQorLyogX19VVF9OQU1FU0laRSB3YXMgY2hlY2tlZCB3aXRoIDY0IGFib3ZlLCBidXQgZ2xpYmMtMi4xMSBkZWZpbml0ZWx5IHVzZXMgMzIhICovCisjZXJyb3Igc3RydWN0IHV0bXB4IG1lbWJlciBjaGFyW10gc2l6ZShzKSBoYXZlIGNoYW5nZWQhCisjZW5kaWYKKworI2lmIEVNUFRZICE9IDAgfHwgUlVOX0xWTCAhPSAxIHx8IEJPT1RfVElNRSAhPSAyIHx8IE5FV19USU1FICE9IDMgfHwgXAorCU9MRF9USU1FICE9IDQKKyNlcnJvciBWYWx1ZXMgZm9yIHRoZSB1dF90eXBlIGZpZWxkIG9mIHN0cnVjdCB1dG1weCBjaGFuZ2VkCisjZW5kaWYKKworaW50IGxhc3RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGxhc3RfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlzdHJ1Y3QgdXRtcHggdXQ7CisJaW50IG4sIGZpbGUgPSBTVERJTl9GSUxFTk87CisJdGltZV90IHRfdG1wOworCW9mZl90IHBvczsKKwlzdGF0aWMgY29uc3QgY2hhciBfdXRfdXNyW10gQUxJR04xID0KKwkJCSJydW5sZXZlbFwwIiAicmVib290XDAiICJzaHV0ZG93blwwIjsKKwlzdGF0aWMgY29uc3QgY2hhciBfdXRfbGluW10gQUxJR04xID0KKwkJCSJ+XDAiICJ7XDAiICJ8XDAiIC8qICJMT0dJTlwwIiAiZGF0ZVwwIiAqLzsKKwllbnVtIHsKKwkJVFlQRV9SVU5fTFZMID0gUlVOX0xWTCwgICAgICAgICAvKiAxICovCisJCVRZUEVfQk9PVF9USU1FID0gQk9PVF9USU1FLCAgICAgLyogMiAqLworCQlUWVBFX1NIVVRET1dOX1RJTUUgPSBTSFVURE9XTl9USU1FCisJfTsKKwllbnVtIHsKKwkJX1RJTERFID0gRU1QVFksIC8qIDAgKi8KKwkJVFlQRV9ORVdfVElNRSwgIC8qIE5FV19USU1FLCAzICovCisJCVRZUEVfT0xEX1RJTUUgICAvKiBPTERfVElNRSwgNCAqLworCX07CisKKwlpZiAoYXJndlsxXSkgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCWZpbGUgPSB4b3BlbihiYl9wYXRoX3d0bXBfZmlsZSwgT19SRE9OTFkpOworCisJcHJpbnRmKCIlLTEwcyAlLTE0cyAlLTE4cyAlLTEyLjEycyAlc1xuIiwKKwkJIlVTRVIiLCAiVFRZIiwgIkhPU1QiLCAiTE9HSU4iLCAiVElNRSIpOworCS8qIHlpa2VzLiBXZSByZXZlcnNlIG92ZXIgdGhlIGZpbGUgYW5kIHRoYXQgaXMgYSBub3QgdG9vIGVsZWdhbnQgd2F5ICovCisJcG9zID0geGxzZWVrKGZpbGUsIDAsIFNFRUtfRU5EKTsKKwlwb3MgPSBsc2VlayhmaWxlLCBwb3MgLSBzaXplb2YodXQpLCBTRUVLX1NFVCk7CisJd2hpbGUgKChuID0gZnVsbF9yZWFkKGZpbGUsICZ1dCwgc2l6ZW9mKHV0KSkpID4gMCkgeworCQlpZiAobiAhPSBzaXplb2YodXQpKSB7CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNob3J0IHJlYWQiKTsKKwkJfQorCQluID0gaW5kZXhfaW5fc3RyaW5ncyhfdXRfbGluLCB1dC51dF9saW5lKTsKKwkJaWYgKG4gPT0gX1RJTERFKSB7IC8qICd+JyAqLworI2lmIDEKKy8qIGRvIHdlIHJlYWxseSBuZWVkIHRvIGJlIGNhdXRpb3VzIGhlcmU/ICovCisJCQluID0gaW5kZXhfaW5fc3RyaW5ncyhfdXRfdXNyLCB1dC51dF91c2VyKTsKKwkJCWlmICgrK24gPiAwKQorCQkJCXV0LnV0X3R5cGUgPSBuICE9IDMgPyBuIDogU0hVVERPV05fVElNRTsKKyNlbHNlCisJCQlpZiAoaXNfcHJlZml4ZWRfd2l0aCh1dC51dF91c2VyLCAic2h1dGRvd24iKSkKKwkJCQl1dC51dF90eXBlID0gU0hVVERPV05fVElNRTsKKwkJCWVsc2UgaWYgKGlzX3ByZWZpeGVkX3dpdGgodXQudXRfdXNlciwgInJlYm9vdCIpKQorCQkJCXV0LnV0X3R5cGUgPSBCT09UX1RJTUU7CisJCQllbHNlIGlmIChpc19wcmVmaXhlZF93aXRoKHV0LnV0X3VzZXIsICJydW5sZXZlbCIpKQorCQkJCXV0LnV0X3R5cGUgPSBSVU5fTFZMOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQlpZiAodXQudXRfdXNlclswXSA9PSAnXDAnIHx8IHN0cmNtcCh1dC51dF91c2VyLCAiTE9HSU4iKSA9PSAwKSB7CisJCQkJLyogRG9uJ3QgYm90aGVyLiAgVGhpcyBtZWFucyB3ZSBjYW4ndCBmaW5kIGhvdyBsb25nCisJCQkJICogc29tZW9uZSB3YXMgbG9nZ2VkIGluIGZvci4gIE9oIHdlbGwuICovCisJCQkJZ290byBuZXh0OworCQkJfQorCQkJaWYgKHV0LnV0X3R5cGUgIT0gREVBRF9QUk9DRVNTCisJCQkgJiYgdXQudXRfdXNlclswXQorCQkJICYmIHV0LnV0X2xpbmVbMF0KKwkJCSkgeworCQkJCXV0LnV0X3R5cGUgPSBVU0VSX1BST0NFU1M7CisJCQl9CisJCQlpZiAoc3RyY21wKHV0LnV0X3VzZXIsICJkYXRlIikgPT0gMCkgeworCQkJCWlmIChuID09IFRZUEVfT0xEX1RJTUUpIHsgLyogJ3wnICovCisJCQkJCXV0LnV0X3R5cGUgPSBPTERfVElNRTsKKwkJCQl9CisJCQkJaWYgKG4gPT0gVFlQRV9ORVdfVElNRSkgeyAvKiAneycgKi8KKwkJCQkJdXQudXRfdHlwZSA9IE5FV19USU1FOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmICh1dC51dF90eXBlICE9IFVTRVJfUFJPQ0VTUykgeworCQkJc3dpdGNoICh1dC51dF90eXBlKSB7CisJCQkJY2FzZSBPTERfVElNRToKKwkJCQljYXNlIE5FV19USU1FOgorCQkJCWNhc2UgUlVOX0xWTDoKKwkJCQljYXNlIFNIVVRET1dOX1RJTUU6CisJCQkJCWdvdG8gbmV4dDsKKwkJCQljYXNlIEJPT1RfVElNRToKKwkJCQkJc3RyY3B5KHV0LnV0X2xpbmUsICJzeXN0ZW0gYm9vdCIpOworCQkJfQorCQl9CisJCS8qIG1hbnBhZ2VzIHNheSB1dF90di50dl9zZWMgKmlzKiB0aW1lX3QsCisJCSAqIGJ1dCBzb21lIHN5c3RlbXMgaGF2ZSBpdCB3cm9uZyAqLworCQl0X3RtcCA9ICh0aW1lX3QpdXQudXRfdHYudHZfc2VjOworCQlwcmludGYoIiUtMTBzICUtMTRzICUtMThzICUtMTIuMTJzXG4iLAorCQkJdXQudXRfdXNlciwgdXQudXRfbGluZSwgdXQudXRfaG9zdCwgY3RpbWUoJnRfdG1wKSArIDQpOworIG5leHQ6CisJCXBvcyAtPSBzaXplb2YodXQpOworCQlpZiAocG9zIDw9IDApCisJCQlicmVhazsgLyogZG9uZS4gKi8KKwkJeGxzZWVrKGZpbGUsIHBvcywgU0VFS19TRVQpOworCX0KKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9sYXN0X2ZhbmN5LmMgYi9taXNjdXRpbHMvbGFzdF9mYW5jeS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NmUwYmEKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvbGFzdF9mYW5jeS5jCkBAIC0wLDAgKzEsMzAwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiAoc3lzdmluaXQgbGlrZSkgbGFzdCBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBQYXRyaWNpYSBNdXNjYWx1IDxwYXRyaWNpYS5tdXNjYWx1QGF4aXMuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIE5COiB1dF9uYW1lIGFuZCB1dF91c2VyIGFyZSB0aGUgc2FtZSBmaWVsZCwgdXNlIG9ubHkgb25lIG5hbWUgKHV0X3VzZXIpCisgKiB0byByZWR1Y2UgY29uZnVzaW9uICovCisKKyNpZm5kZWYgU0hVVERPV05fVElNRQorIyAgZGVmaW5lIFNIVVRET1dOX1RJTUUgMjU0CisjZW5kaWYKKworI2RlZmluZSBIRUFERVJfRk9STUFUICAgICAiJS04LjhzICUtMTIuMTJzICUtKi4qcyAlLTE2LjE2cyAlLTcuN3MgJXNcbiIKKyNkZWZpbmUgSEVBREVSX0xJTkUgICAgICAgIlVTRVIiLCAiVFRZIiwgXAorCUlORVRfQUREUlNUUkxFTiwgSU5FVF9BRERSU1RSTEVOLCAiSE9TVCIsICJMT0dJTiIsICIgIFRJTUUiLCAiIgorI2RlZmluZSBIRUFERVJfTElORV9XSURFICAiVVNFUiIsICJUVFkiLCBcCisJSU5FVDZfQUREUlNUUkxFTiwgSU5FVDZfQUREUlNUUkxFTiwgIkhPU1QiLCAiTE9HSU4iLCAiICBUSU1FIiwgIiIKKworI2lmICFkZWZpbmVkIF9fVVRfTElORVNJWkUgJiYgZGVmaW5lZCBVVF9MSU5FU0laRQorIyBkZWZpbmUgX19VVF9MSU5FU0laRSBVVF9MSU5FU0laRQorI2VuZGlmCisKK2VudW0geworCU5PUk1BTCwKKwlMT0dHRUQsCisJRE9XTiwKKwlSRUJPT1QsCisJQ1JBU0gsCisJR09ORQorfTsKKworZW51bSB7CisJTEFTVF9PUFRfVyA9ICgxIDw8IDApLCAgLyogLVcgd2lkZSAgICAgICAgICAgICovCisJTEFTVF9PUFRfZiA9ICgxIDw8IDEpLCAgLyogLWYgaW5wdXQgZmlsZSAgICAgICovCisJTEFTVF9PUFRfSCA9ICgxIDw8IDIpLCAgLyogLUggaGVhZGVyICAgICAgICAgICovCit9OworCisjZGVmaW5lIHNob3dfd2lkZSAob3B0aW9uX21hc2szMiAmIExBU1RfT1BUX1cpCisKK3N0YXRpYyB2b2lkIHNob3dfZW50cnkoc3RydWN0IHV0bXB4ICp1dCwgaW50IHN0YXRlLCB0aW1lX3QgZHVyX3NlY3MpCit7CisJdW5zaWduZWQgZGF5cywgaG91cnMsIG1pbnM7CisJY2hhciBkdXJhdGlvbltzaXplb2YoIigldSswMjowMikiKSArIHNpemVvZihpbnQpKjNdOworCWNoYXIgbG9naW5fdGltZVsxN107CisJY2hhciBsb2dvdXRfdGltZVs4XTsKKwljb25zdCBjaGFyICpsb2dvdXRfc3RyOworCWNvbnN0IGNoYXIgKmR1cmF0aW9uX3N0cjsKKwl0aW1lX3QgdG1wOworCisJLyogbWFucGFnZXMgc2F5IHV0X3R2LnR2X3NlYyAqaXMqIHRpbWVfdCwKKwkgKiBidXQgc29tZSBzeXN0ZW1zIGhhdmUgaXQgd3JvbmcgKi8KKwl0bXAgPSB1dC0+dXRfdHYudHZfc2VjOworCXNhZmVfc3RybmNweShsb2dpbl90aW1lLCBjdGltZSgmdG1wKSwgMTcpOworCXRtcCA9IGR1cl9zZWNzOworCXNucHJpbnRmKGxvZ291dF90aW1lLCA4LCAiLSAlcyIsIGN0aW1lKCZ0bXApICsgMTEpOworCisJZHVyX3NlY3MgPSBNQVgoZHVyX3NlY3MgLSAodGltZV90KXV0LT51dF90di50dl9zZWMsICh0aW1lX3QpMCk7CisJLyogdW5zaWduZWQgaW50IGlzIGVhc2llciB0byBkaXZpZGUgdGhhbiB0aW1lX3QgKHdoaWNoIG1heSBiZSBzaWduZWQgbG9uZykgKi8KKwltaW5zID0gZHVyX3NlY3MgLyA2MDsKKwlkYXlzID0gbWlucyAvICgyNCo2MCk7CisJbWlucyA9IG1pbnMgJSAoMjQqNjApOworCWhvdXJzID0gbWlucyAvIDYwOworCW1pbnMgPSBtaW5zICUgNjA7CisKKy8vCWlmIChkYXlzKSB7CisJCXNwcmludGYoZHVyYXRpb24sICIoJXUrJTAydTolMDJ1KSIsIGRheXMsIGhvdXJzLCBtaW5zKTsKKy8vCX0gZWxzZSB7CisvLwkJc3ByaW50ZihkdXJhdGlvbiwgIiAoJTAydTolMDJ1KSIsIGhvdXJzLCBtaW5zKTsKKy8vCX0KKworCWxvZ291dF9zdHIgPSBsb2dvdXRfdGltZTsKKwlkdXJhdGlvbl9zdHIgPSBkdXJhdGlvbjsKKwlzd2l0Y2ggKHN0YXRlKSB7CisJY2FzZSBOT1JNQUw6CisJCWJyZWFrOworCWNhc2UgTE9HR0VEOgorCQlsb2dvdXRfc3RyID0gIiAgc3RpbGwiOworCQlkdXJhdGlvbl9zdHIgPSAibG9nZ2VkIGluIjsKKwkJYnJlYWs7CisJY2FzZSBET1dOOgorCQlsb2dvdXRfc3RyID0gIi0gZG93biAiOworCQlicmVhazsKKwljYXNlIFJFQk9PVDoKKwkJYnJlYWs7CisJY2FzZSBDUkFTSDoKKwkJbG9nb3V0X3N0ciA9ICItIGNyYXNoIjsKKwkJYnJlYWs7CisJY2FzZSBHT05FOgorCQlsb2dvdXRfc3RyID0gIiAgIGdvbmUiOworCQlkdXJhdGlvbl9zdHIgPSAiLSBubyBsb2dvdXQiOworCQlicmVhazsKKwl9CisKKwlwcmludGYoSEVBREVSX0ZPUk1BVCwKKwkJdXQtPnV0X3VzZXIsCisJCXV0LT51dF9saW5lLAorCQlzaG93X3dpZGUgPyBJTkVUNl9BRERSU1RSTEVOIDogSU5FVF9BRERSU1RSTEVOLAorCQlzaG93X3dpZGUgPyBJTkVUNl9BRERSU1RSTEVOIDogSU5FVF9BRERSU1RSTEVOLAorCQl1dC0+dXRfaG9zdCwKKwkJbG9naW5fdGltZSwKKwkJbG9nb3V0X3N0ciwKKwkJZHVyYXRpb25fc3RyKTsKK30KKworc3RhdGljIGludCBnZXRfdXRfdHlwZShzdHJ1Y3QgdXRtcHggKnV0KQoreworCWlmICh1dC0+dXRfbGluZVswXSA9PSAnficpIHsKKwkJaWYgKHN0cmNtcCh1dC0+dXRfdXNlciwgInNodXRkb3duIikgPT0gMCkgeworCQkJcmV0dXJuIFNIVVRET1dOX1RJTUU7CisJCX0KKwkJaWYgKHN0cmNtcCh1dC0+dXRfdXNlciwgInJlYm9vdCIpID09IDApIHsKKwkJCXJldHVybiBCT09UX1RJTUU7CisJCX0KKwkJaWYgKHN0cmNtcCh1dC0+dXRfdXNlciwgInJ1bmxldmVsIikgPT0gMCkgeworCQkJcmV0dXJuIFJVTl9MVkw7CisJCX0KKwkJcmV0dXJuIHV0LT51dF90eXBlOworCX0KKworCWlmICh1dC0+dXRfdXNlclswXSA9PSAwKSB7CisJCXJldHVybiBERUFEX1BST0NFU1M7CisJfQorCisJaWYgKCh1dC0+dXRfdHlwZSAhPSBERUFEX1BST0NFU1MpCisJICYmIChzdHJjbXAodXQtPnV0X3VzZXIsICJMT0dJTiIpICE9IDApCisJICYmIHV0LT51dF91c2VyWzBdCisJICYmIHV0LT51dF9saW5lWzBdCisJKSB7CisJCXV0LT51dF90eXBlID0gVVNFUl9QUk9DRVNTOworCX0KKworCWlmIChzdHJjbXAodXQtPnV0X3VzZXIsICJkYXRlIikgPT0gMCkgeworCQlpZiAodXQtPnV0X2xpbmVbMF0gPT0gJ3wnKSB7CisJCQlyZXR1cm4gT0xEX1RJTUU7CisJCX0KKwkJaWYgKHV0LT51dF9saW5lWzBdID09ICd7JykgeworCQkJcmV0dXJuIE5FV19USU1FOworCQl9CisJfQorCXJldHVybiB1dC0+dXRfdHlwZTsKK30KKworc3RhdGljIGludCBpc19ydW5sZXZlbF9zaHV0ZG93bihzdHJ1Y3QgdXRtcHggKnV0KQoreworCWlmICgoKHV0LT51dF9waWQgJiAyNTUpID09ICcwJykgfHwgKCh1dC0+dXRfcGlkICYgMjU1KSA9PSAnNicpKSB7CisJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgbGFzdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbGFzdF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHV0bXB4IHV0OworCWNvbnN0IGNoYXIgKmZpbGVuYW1lID0gX1BBVEhfV1RNUDsKKwlsbGlzdF90ICp6bGlzdDsKKwlvZmZfdCBwb3M7CisJdGltZV90IHN0YXJ0X3RpbWU7CisJdGltZV90IGJvb3RfdGltZTsKKwl0aW1lX3QgZG93bl90aW1lOworCWludCBmaWxlOworCXNtYWxsaW50IGdvaW5nX2Rvd247CisJc21hbGxpbnQgYm9vdF9kb3duOworCisJLypvcHQgPSovIGdldG9wdDMyKGFyZ3YsICJXZjoiIC8qICJIIiAqLywgJmZpbGVuYW1lKTsKKyNpZmRlZiBCVVRfVVRJTF9MSU5VWF9MQVNUX0hBU19OT19TVUNIX09QVAorCWlmIChvcHQgJiBMQVNUX09QVF9IKSB7CisJCS8qIFByaW50IGhlYWRlciBsaW5lICovCisJCWlmIChvcHQgJiBMQVNUX09QVF9XKSB7CisJCQlwcmludGYoSEVBREVSX0ZPUk1BVCwgSEVBREVSX0xJTkVfV0lERSk7CisJCX0gZWxzZSB7CisJCQlwcmludGYoSEVBREVSX0ZPUk1BVCwgSEVBREVSX0xJTkUpOworCQl9CisJfQorI2VuZGlmCisKKwlmaWxlID0geG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwl7CisJCS8qIGluIGNhc2UgdGhlIGZpbGUgaXMgZW1wdHkuLi4gKi8KKwkJc3RydWN0IHN0YXQgc3Q7CisJCWZzdGF0KGZpbGUsICZzdCk7CisJCXN0YXJ0X3RpbWUgPSBzdC5zdF9jdGltZTsKKwl9CisKKwl0aW1lKCZkb3duX3RpbWUpOworCWdvaW5nX2Rvd24gPSAwOworCWJvb3RfZG93biA9IE5PUk1BTDsgLyogMCAqLworCXpsaXN0ID0gTlVMTDsKKwlib290X3RpbWUgPSAwOworCS8qIGdldCBmaWxlIHNpemUsIHJvdW5kaW5nIGRvd24gdG8gbGFzdCBmdWxsIHJlY29yZCAqLworCXBvcyA9IHhsc2VlayhmaWxlLCAwLCBTRUVLX0VORCkgLyBzaXplb2YodXQpICogc2l6ZW9mKHV0KTsKKwlmb3IgKDs7KSB7CisJCXBvcyAtPSAob2ZmX3Qpc2l6ZW9mKHV0KTsKKwkJaWYgKHBvcyA8IDApIHsKKwkJCS8qIEJleW9uZCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIGJvdW5kYXJ5ID0+CisJCQkgKiB0aGUgd2hvbGUgZmlsZSBoYXMgYmVlbiByZWFkLiAqLworCQkJYnJlYWs7CisJCX0KKwkJeGxzZWVrKGZpbGUsIHBvcywgU0VFS19TRVQpOworCQl4cmVhZChmaWxlLCAmdXQsIHNpemVvZih1dCkpOworCQkvKiByZXdyaXR0ZW4gYnkgZWFjaCByZWNvcmQsIGV2ZW50aWFsbHkgd2lsbCBoYXZlCisJCSAqIGZpcnN0IHJlY29yZCdzIHV0X3R2LnR2X3NlYzogKi8KKwkJc3RhcnRfdGltZSA9IHV0LnV0X3R2LnR2X3NlYzsKKworCQlzd2l0Y2ggKGdldF91dF90eXBlKCZ1dCkpIHsKKwkJY2FzZSBTSFVURE9XTl9USU1FOgorCQkJZG93bl90aW1lID0gdXQudXRfdHYudHZfc2VjOworCQkJYm9vdF9kb3duID0gRE9XTjsKKwkJCWdvaW5nX2Rvd24gPSAxOworCQkJYnJlYWs7CisJCWNhc2UgUlVOX0xWTDoKKwkJCWlmIChpc19ydW5sZXZlbF9zaHV0ZG93bigmdXQpKSB7CisJCQkJZG93bl90aW1lID0gdXQudXRfdHYudHZfc2VjOworCQkJCWdvaW5nX2Rvd24gPSAxOworCQkJCWJvb3RfZG93biA9IERPV047CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBCT09UX1RJTUU6CisJCQlzdHJjcHkodXQudXRfbGluZSwgInN5c3RlbSBib290Iik7CisJCQlzaG93X2VudHJ5KCZ1dCwgUkVCT09ULCBkb3duX3RpbWUpOworCQkJYm9vdF9kb3duID0gQ1JBU0g7CisJCQlnb2luZ19kb3duID0gMTsKKwkJCWJyZWFrOworCQljYXNlIERFQURfUFJPQ0VTUzoKKwkJCWlmICghdXQudXRfbGluZVswXSkgeworCQkJCWJyZWFrOworCQkJfQorCQkJLyogYWRkX2VudHJ5ICovCisJCQlsbGlzdF9hZGRfdG8oJnpsaXN0LCB4bWVtZHVwKCZ1dCwgc2l6ZW9mKHV0KSkpOworCQkJYnJlYWs7CisJCWNhc2UgVVNFUl9QUk9DRVNTOiB7CisJCQlpbnQgc2hvdzsKKworCQkJaWYgKCF1dC51dF9saW5lWzBdKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBmaW5kX2VudHJ5ICovCisJCQlzaG93ID0gMTsKKwkJCXsKKwkJCQlsbGlzdF90ICplbCwgKm5leHQ7CisJCQkJZm9yIChlbCA9IHpsaXN0OyBlbDsgZWwgPSBuZXh0KSB7CisJCQkJCXN0cnVjdCB1dG1weCAqdXAgPSAoc3RydWN0IHV0bXB4ICopZWwtPmRhdGE7CisJCQkJCW5leHQgPSBlbC0+bGluazsKKwkJCQkJaWYgKHN0cm5jbXAodXAtPnV0X2xpbmUsIHV0LnV0X2xpbmUsIF9fVVRfTElORVNJWkUpID09IDApIHsKKwkJCQkJCWlmIChzaG93KSB7CisJCQkJCQkJc2hvd19lbnRyeSgmdXQsIE5PUk1BTCwgdXAtPnV0X3R2LnR2X3NlYyk7CisJCQkJCQkJc2hvdyA9IDA7CisJCQkJCQl9CisJCQkJCQlsbGlzdF91bmxpbmsoJnpsaXN0LCBlbCk7CisJCQkJCQlmcmVlKGVsLT5kYXRhKTsKKwkJCQkJCWZyZWUoZWwpOworCQkJCQl9CisJCQkJfQorCQkJfQorCisJCQlpZiAoc2hvdykgeworCQkJCWludCBzdGF0ZSA9IGJvb3RfZG93bjsKKworCQkJCWlmIChib290X3RpbWUgPT0gMCkgeworCQkJCQlzdGF0ZSA9IExPR0dFRDsKKwkJCQkJLyogQ2hlY2sgaWYgdGhlIHByb2Nlc3MgaXMgYWxpdmUgKi8KKwkJCQkJaWYgKCh1dC51dF9waWQgPiAwKQorCQkJCQkgJiYgKGtpbGwodXQudXRfcGlkLCAwKSAhPSAwKQorCQkJCQkgJiYgKGVycm5vID09IEVTUkNIKSkgeworCQkJCQkJc3RhdGUgPSBHT05FOworCQkJCQl9CisJCQkJfQorCQkJCXNob3dfZW50cnkoJnV0LCBzdGF0ZSwgYm9vdF90aW1lKTsKKwkJCX0KKwkJCS8qIGFkZF9lbnRyeSAqLworCQkJbGxpc3RfYWRkX3RvKCZ6bGlzdCwgeG1lbWR1cCgmdXQsIHNpemVvZih1dCkpKTsKKwkJCWJyZWFrOworCQl9CisJCX0KKworCQlpZiAoZ29pbmdfZG93bikgeworCQkJYm9vdF90aW1lID0gdXQudXRfdHYudHZfc2VjOworCQkJbGxpc3RfZnJlZSh6bGlzdCwgZnJlZSk7CisJCQl6bGlzdCA9IE5VTEw7CisJCQlnb2luZ19kb3duID0gMDsKKwkJfQorCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlsbGlzdF9mcmVlKHpsaXN0LCBmcmVlKTsKKwl9CisKKwlwcmludGYoIlxud3RtcCBiZWdpbnMgJXMiLCBjdGltZSgmc3RhcnRfdGltZSkpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShmaWxlKTsKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KEVYSVRfU1VDQ0VTUyk7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvbGVzcy5jIGIvbWlzY3V0aWxzL2xlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2RiMTVmCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL2xlc3MuYwpAQCAtMCwwICsxLDIwNzUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgbGVzcyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBieSBSb2IgU3VsbGl2YW4gPGNvZ2l0by5lcmdvLmNvZ2l0b0BnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorICogVE9ETzoKKyAqIC0gQWRkIG1vcmUgcmVndWxhciBleHByZXNzaW9uIHN1cHBvcnQgLSBzZWFyY2ggbW9kaWZpZXJzLCBjZXJ0YWluIG1hdGNoZXMsIGV0Yy4KKyAqIC0gQWRkIG1vcmUgY29tcGxleCBicmFja2V0IHNlYXJjaGluZyAtIGN1cnJlbnRseSwgbmVzdGVkIGJyYWNrZXRzIGFyZQorICogICBub3QgY29uc2lkZXJlZC4KKyAqIC0gQWRkIHN1cHBvcnQgZm9yICJGIiBhcyBhbiBpbnB1dC4gVGhpcyBjYXVzZXMgbGVzcyB0byBhY3QgaW4KKyAqICAgYSBzaW1pbGFyIHdheSB0byB0YWlsIC1mLgorICogLSBBbGxvdyBob3Jpem9udGFsIHNjcm9sbGluZy4KKyAqCisgKiBOb3RlczoKKyAqIC0gdGhlIGlucCBmaWxlIHBvaW50ZXIgaXMgdXNlZCBzbyB0aGF0IGtleWJvYXJkIGlucHV0IHdvcmtzIGFmdGVyCisgKiAgIHJlZGlyZWN0ZWQgaW5wdXQgaGFzIGJlZW4gcmVhZCBmcm9tIHN0ZGluCisgKi8KKworLy9jb25maWc6Y29uZmlnIExFU1MKKy8vY29uZmlnOglib29sICJsZXNzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgICdsZXNzJyBpcyBhIHBhZ2VyLCBtZWFuaW5nIHRoYXQgaXQgZGlzcGxheXMgdGV4dCBmaWxlcy4gSXQgcG9zc2Vzc2VzCisvL2NvbmZpZzoJICBhIHdpZGUgYXJyYXkgb2YgZmVhdHVyZXMsIGFuZCBpcyBhbiBpbXByb3ZlbWVudCBvdmVyICdtb3JlJy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfTEVTU19NQVhMSU5FUworLy9jb25maWc6CWludCAiTWF4IG51bWJlciBvZiBpbnB1dCBsaW5lcyBsZXNzIHdpbGwgdHJ5IHRvIGVhdCIKKy8vY29uZmlnOglkZWZhdWx0IDk5OTk5OTkKKy8vY29uZmlnOglkZXBlbmRzIG9uIExFU1MKKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfTEVTU19CUkFDS0VUUworLy9jb25maWc6CWJvb2wgIkVuYWJsZSBicmFja2V0IHNlYXJjaGluZyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIExFU1MKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGlzIG9wdGlvbiBhZGRzIHRoZSBjYXBhYmlsaXR5IHRvIHNlYXJjaCBmb3IgbWF0Y2hpbmcgbGVmdCBhbmQgcmlnaHQKKy8vY29uZmlnOgkgIGJyYWNrZXRzLCBmYWNpbGl0YXRpbmcgcHJvZ3JhbW1pbmcuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0xFU1NfRkxBR1MKKy8vY29uZmlnOglib29sICJFbmFibGUgLW0vLU0iCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBMRVNTCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVGhlIC1NLy1tIGZsYWcgZW5hYmxlcyBhIG1vcmUgc29waGlzdGljYXRlZCBzdGF0dXMgbGluZS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfTEVTU19UUlVOQ0FURQorLy9jb25maWc6CWJvb2wgIkVuYWJsZSAtUyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIExFU1MKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGUgLVMgZmxhZyBjYXVzZXMgbG9uZyBsaW5lcyB0byBiZSB0cnVuY2F0ZWQgcmF0aGVyIHRoYW4KKy8vY29uZmlnOgkgIHdyYXBwZWQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX0xFU1NfTUFSS1MKKy8vY29uZmlnOglib29sICJFbmFibGUgbWFya3MiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBMRVNTCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgTWFya3MgZW5hYmxlIHBvc2l0aW9ucyBpbiBhIGZpbGUgdG8gYmUgc3RvcmVkIGZvciBlYXN5IHJlZmVyZW5jZS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfTEVTU19SRUdFWFAKKy8vY29uZmlnOglib29sICJFbmFibGUgcmVndWxhciBleHByZXNzaW9ucyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIExFU1MKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgcmVndWxhciBleHByZXNzaW9ucywgYWxsb3dpbmcgY29tcGxleCBmaWxlIHNlYXJjaGVzLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9MRVNTX1dJTkNICisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIGF1dG9tYXRpYyByZXNpemluZyBvbiB3aW5kb3cgc2l6ZSBjaGFuZ2VzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gTEVTUworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIE1ha2VzIGxlc3MgdHJhY2sgd2luZG93IHNpemUgY2hhbmdlcy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfTEVTU19BU0tfVEVSTUlOQUwKKy8vY29uZmlnOglib29sICJVc2UgJ3RlbGwgbWUgY3Vyc29yIHBvc2l0aW9uJyBFU0Mgc2VxdWVuY2UgdG8gbWVhc3VyZSB3aW5kb3ciCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGRUFUVVJFX0xFU1NfV0lOQ0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBNYWtlcyBsZXNzIHRyYWNrIHdpbmRvdyBzaXplIGNoYW5nZXMuCisvL2NvbmZpZzoJICBJZiB0ZXJtaW5hbCBzaXplIGNhbid0IGJlIHJldHJpZXZlZCBhbmQgJExJTkVTLyRDT0xVTU5TIGFyZSBub3Qgc2V0LAorLy9jb25maWc6CSAgdGhpcyBvcHRpb24gbWFrZXMgbGVzcyBwZXJmb3JtIGEgbGFzdC1kaXRjaCBlZmZvcnQgdG8gZmluZCBpdDoKKy8vY29uZmlnOgkgIHBvc2l0aW9uIGN1cnNvciB0byA5OTksOTk5IGFuZCBhc2sgdGVybWluYWwgdG8gcmVwb3J0IHJlYWwKKy8vY29uZmlnOgkgIGN1cnNvciBwb3NpdGlvbiB1c2luZyAiRVNDIFsgNiBuIiBlc2NhcGUgc2VxdWVuY2UsIHRoZW4gcmVhZCBzdGRpbi4KKy8vY29uZmlnOgorLy9jb25maWc6CSAgVGhpcyBpcyBub3QgY2xlYW4gYnV0IGhlbHBzIGEgbG90IG9uIHNlcmlhbCBsaW5lcyBhbmQgc3VjaC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfTEVTU19EQVNIQ01ECisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIGZsYWcgY2hhbmdlcyAoJy0nIGNvbW1hbmQpIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gTEVTUworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRoaXMgZW5hYmxlcyB0aGUgYWJpbGl0eSB0byBjaGFuZ2UgY29tbWFuZC1saW5lIGZsYWdzIHdpdGhpbgorLy9jb25maWc6CSAgbGVzcyBpdHNlbGYgKCctJyBrZXlib2FyZCBjb21tYW5kKS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfTEVTU19MSU5FTlVNUworLy9jb25maWc6CWJvb2wgIkVuYWJsZSBkeW5hbWljIHN3aXRjaGluZyBvZiBsaW5lIG51bWJlcnMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGRUFUVVJFX0xFU1NfREFTSENNRAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZXMgIi1OIiBjb21tYW5kLgorCisvL3VzYWdlOiNkZWZpbmUgbGVzc190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1FIiBJRl9GRUFUVVJFX0xFU1NfUkVHRVhQKCJJIilJRl9GRUFUVVJFX0xFU1NfRkxBR1MoIk1tIikKKy8vdXNhZ2U6ICAgICAgICJOIiBJRl9GRUFUVVJFX0xFU1NfVFJVTkNBVEUoIlMiKSAiaH5dIFtGSUxFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBsZXNzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVmlldyBGSUxFIChvciBzdGRpbikgb25lIHNjcmVlbmZ1bCBhdCBhIHRpbWVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLUUJUXVpdCBvbmNlIHRoZSBlbmQgb2YgYSBmaWxlIGlzIHJlYWNoZWQiCisvL3VzYWdlOglJRl9GRUFUVVJFX0xFU1NfUkVHRVhQKAorLy91c2FnZTogICAgICJcbgktSQlJZ25vcmUgY2FzZSBpbiBhbGwgc2VhcmNoZXMiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0xFU1NfRkxBR1MoCisvL3VzYWdlOiAgICAgIlxuCS1NLC1tCURpc3BsYXkgc3RhdHVzIGxpbmUgd2l0aCBsaW5lIG51bWJlcnMiCisvL3VzYWdlOiAgICAgIlxuCQlhbmQgcGVyY2VudGFnZSB0aHJvdWdoIHRoZSBmaWxlIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktTglQcmVmaXggbGluZSBudW1iZXIgdG8gZWFjaCBsaW5lIgorLy91c2FnZToJSUZfRkVBVFVSRV9MRVNTX1RSVU5DQVRFKAorLy91c2FnZTogICAgICJcbgktUwlUcnVuY2F0ZSBsb25nIGxpbmVzIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktfglTdXBwcmVzcyB+cyBkaXNwbGF5ZWQgcGFzdCBFT0YiCisKKyNpbmNsdWRlIDxzY2hlZC5oPiAgLyogc2NoZWRfeWllbGQoKSAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX1JFR0VYUAorI2luY2x1ZGUgInhyZWdleC5oIgorI2VuZGlmCisKKworI2RlZmluZSBFU0MgIlwwMzMiCisvKiBUaGUgZXNjYXBlIGNvZGVzIGZvciBoaWdobGlnaHRlZCBhbmQgbm9ybWFsIHRleHQgKi8KKyNkZWZpbmUgSElHSExJR0hUICAgRVNDIls3bSIKKyNkZWZpbmUgTk9STUFMICAgICAgRVNDIlswbSIKKy8qIFRoZSBlc2NhcGUgY29kZSB0byBob21lIGFuZCBjbGVhciB0byB0aGUgZW5kIG9mIHNjcmVlbiAqLworI2RlZmluZSBDTEVBUiAgICAgICBFU0MiW0hcMDMzW0oiCisvKiBUaGUgZXNjYXBlIGNvZGUgdG8gY2xlYXIgdG8gdGhlIGVuZCBvZiBsaW5lICovCisjZGVmaW5lIENMRUFSXzJfRU9MIEVTQyJbSyIKKworZW51bSB7CisvKiBBYnNvbHV0ZSBtYXggb2YgbGluZXMgZWF0ZW4gKi8KKwlNQVhMSU5FUyA9IENPTkZJR19GRUFUVVJFX0xFU1NfTUFYTElORVMsCisvKiBUaGlzIG1hbnkgImFmdGVyIHRoZSBlbmQiIGxpbmVzIHdlIHdpbGwgc2hvdyAoYXQgbWF4KSAqLworCVRJTERFUyA9IDEsCit9OworCisvKiBDb21tYW5kIGxpbmUgb3B0aW9ucyAqLworZW51bSB7CisJRkxBR19FID0gMSA8PCAwLAorCUZMQUdfTSA9IDEgPDwgMSwKKwlGTEFHX20gPSAxIDw8IDIsCisJRkxBR19OID0gMSA8PCAzLAorCUZMQUdfVElMREUgPSAxIDw8IDQsCisJRkxBR19JID0gMSA8PCA1LAorCUZMQUdfUyA9ICgxIDw8IDYpICogRU5BQkxFX0ZFQVRVUkVfTEVTU19UUlVOQ0FURSwKKy8qIGhpamFjayBjb21tYW5kIGxpbmUgb3B0aW9ucyB2YXJpYWJsZSBmb3IgaW50ZXJuYWwgc3RhdGUgdmFycyAqLworCUxFU1NfU1RBVEVfTUFUQ0hfQkFDS1dBUkRTID0gMSA8PCAxNSwKK307CisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfTEVTU19SRUdFWFAKK2VudW0geyBwYXR0ZXJuX3ZhbGlkID0gMCB9OworI2VuZGlmCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlpbnQgY3VyX2ZsaW5lOyAvKiBzaWduZWQgKi8KKwlpbnQga2JkX2ZkOyAgLyogZmQgdG8gZ2V0IGlucHV0IGZyb20gKi8KKwlpbnQgbGVzc19nZXRzX3BvczsKKy8qIGxhc3QgcG9zaXRpb24gaW4gbGFzdCBsaW5lLCB0YWtpbmcgaW50byBhY2NvdW50IHRhYnMgKi8KKwlzaXplX3QgbGFzdF9saW5lX3BvczsKKwl1bnNpZ25lZCBtYXhfZmxpbmU7CisJdW5zaWduZWQgbWF4X2xpbmVubzsgLyogdGhpcyBvbmUgdHJhY2tzIGxpbmV3cmFwICovCisJdW5zaWduZWQgbWF4X2Rpc3BsYXllZF9saW5lOworCXVuc2lnbmVkIHdpZHRoOworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfV0lOQ0gKKwl1bnNpZ25lZCB3aW5jaF9jb3VudGVyOworI2VuZGlmCisJc3NpemVfdCBlb2ZfZXJyb3I7IC8qIGVvZiBpZiAwLCBlcnJvciBpZiA8IDAgKi8KKwlzc2l6ZV90IHJlYWRwb3M7CisJc3NpemVfdCByZWFkZW9mOyAvKiBtdXN0IGJlIHNpZ25lZCAqLworCWNvbnN0IGNoYXIgKipidWZmZXI7CisJY29uc3QgY2hhciAqKmZsaW5lczsKKwljb25zdCBjaGFyICplbXB0eV9saW5lX21hcmtlcjsKKwl1bnNpZ25lZCBudW1fZmlsZXM7CisJdW5zaWduZWQgY3VycmVudF9maWxlOworCWNoYXIgKmZpbGVuYW1lOworCWNoYXIgKipmaWxlczsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX0ZMQUdTCisJaW50IG51bV9saW5lczsgLyogYSBmbGFnIGlmIDwgMCwgbGluZSBjb3VudCBpZiA+PSAwICovCisjIGRlZmluZSBSRU9QRU5fQU5EX0NPVU5UICgtMSkKKyMgZGVmaW5lIFJFT1BFTl9TVERJTiAgICAgKC0yKQorIyBkZWZpbmUgTk9UX1JFR1VMQVJfRklMRSAoLTMpCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX01BUktTCisJdW5zaWduZWQgbnVtX21hcmtzOworCXVuc2lnbmVkIG1hcmtfbGluZXNbMTVdWzJdOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19SRUdFWFAKKwl1bnNpZ25lZCAqbWF0Y2hfbGluZXM7CisJaW50IG1hdGNoX3BvczsgLyogc2lnbmVkISAqLworCWludCB3YW50ZWRfbWF0Y2g7IC8qIHNpZ25lZCEgKi8KKwlpbnQgbnVtX21hdGNoZXM7CisJcmVnZXhfdCBwYXR0ZXJuOworCXNtYWxsaW50IHBhdHRlcm5fdmFsaWQ7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX0FTS19URVJNSU5BTAorCXNtYWxsaW50IHdpbnNpemVfZXJyOworI2VuZGlmCisJc21hbGxpbnQgdGVybWluYXRlZDsKKwlzdHJ1Y3QgdGVybWlvcyB0ZXJtX29yaWcsIHRlcm1fbGVzczsKKwljaGFyIGtiZF9pbnB1dFtLRVlDT0RFX0JVRkZFUl9TSVpFXTsKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgY3VyX2ZsaW5lICAgICAgICAgICAoRy5jdXJfZmxpbmUgICAgICAgICApCisjZGVmaW5lIGtiZF9mZCAgICAgICAgICAgICAgKEcua2JkX2ZkICAgICAgICAgICAgKQorI2RlZmluZSBsZXNzX2dldHNfcG9zICAgICAgIChHLmxlc3NfZ2V0c19wb3MgICAgICkKKyNkZWZpbmUgbGFzdF9saW5lX3BvcyAgICAgICAoRy5sYXN0X2xpbmVfcG9zICAgICApCisjZGVmaW5lIG1heF9mbGluZSAgICAgICAgICAgKEcubWF4X2ZsaW5lICAgICAgICAgKQorI2RlZmluZSBtYXhfbGluZW5vICAgICAgICAgIChHLm1heF9saW5lbm8gICAgICAgICkKKyNkZWZpbmUgbWF4X2Rpc3BsYXllZF9saW5lICAoRy5tYXhfZGlzcGxheWVkX2xpbmUpCisjZGVmaW5lIHdpZHRoICAgICAgICAgICAgICAgKEcud2lkdGggICAgICAgICAgICAgKQorI2RlZmluZSB3aW5jaF9jb3VudGVyICAgICAgIChHLndpbmNoX2NvdW50ZXIgICAgICkKKy8qIFRoaXMgb25lIGlzIDEwMCUgbm90IGNhY2hlZCBieSBjb21waWxlciBvbiByZWFkIGFjY2VzcyAqLworI2RlZmluZSBXSU5DSF9DT1VOVEVSICgqKHZvbGF0aWxlIHVuc2lnbmVkICopJndpbmNoX2NvdW50ZXIpCisjZGVmaW5lIGVvZl9lcnJvciAgICAgICAgICAgKEcuZW9mX2Vycm9yICAgICAgICAgKQorI2RlZmluZSByZWFkcG9zICAgICAgICAgICAgIChHLnJlYWRwb3MgICAgICAgICAgICkKKyNkZWZpbmUgcmVhZGVvZiAgICAgICAgICAgICAoRy5yZWFkZW9mICAgICAgICAgICApCisjZGVmaW5lIGJ1ZmZlciAgICAgICAgICAgICAgKEcuYnVmZmVyICAgICAgICAgICAgKQorI2RlZmluZSBmbGluZXMgICAgICAgICAgICAgIChHLmZsaW5lcyAgICAgICAgICAgICkKKyNkZWZpbmUgZW1wdHlfbGluZV9tYXJrZXIgICAoRy5lbXB0eV9saW5lX21hcmtlciApCisjZGVmaW5lIG51bV9maWxlcyAgICAgICAgICAgKEcubnVtX2ZpbGVzICAgICAgICAgKQorI2RlZmluZSBjdXJyZW50X2ZpbGUgICAgICAgIChHLmN1cnJlbnRfZmlsZSAgICAgICkKKyNkZWZpbmUgZmlsZW5hbWUgICAgICAgICAgICAoRy5maWxlbmFtZSAgICAgICAgICApCisjZGVmaW5lIGZpbGVzICAgICAgICAgICAgICAgKEcuZmlsZXMgICAgICAgICAgICAgKQorI2RlZmluZSBudW1fbGluZXMgICAgICAgICAgIChHLm51bV9saW5lcyAgICAgICAgICkKKyNkZWZpbmUgbnVtX21hcmtzICAgICAgICAgICAoRy5udW1fbWFya3MgICAgICAgICApCisjZGVmaW5lIG1hcmtfbGluZXMgICAgICAgICAgKEcubWFya19saW5lcyAgICAgICAgKQorI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfUkVHRVhQCisjZGVmaW5lIG1hdGNoX2xpbmVzICAgICAgICAgKEcubWF0Y2hfbGluZXMgICAgICAgKQorI2RlZmluZSBtYXRjaF9wb3MgICAgICAgICAgIChHLm1hdGNoX3BvcyAgICAgICAgICkKKyNkZWZpbmUgbnVtX21hdGNoZXMgICAgICAgICAoRy5udW1fbWF0Y2hlcyAgICAgICApCisjZGVmaW5lIHdhbnRlZF9tYXRjaCAgICAgICAgKEcud2FudGVkX21hdGNoICAgICAgKQorI2RlZmluZSBwYXR0ZXJuICAgICAgICAgICAgIChHLnBhdHRlcm4gICAgICAgICAgICkKKyNkZWZpbmUgcGF0dGVybl92YWxpZCAgICAgICAoRy5wYXR0ZXJuX3ZhbGlkICAgICApCisjZW5kaWYKKyNkZWZpbmUgdGVybWluYXRlZCAgICAgICAgICAoRy50ZXJtaW5hdGVkICAgICAgICApCisjZGVmaW5lIHRlcm1fb3JpZyAgICAgICAgICAgKEcudGVybV9vcmlnICAgICAgICAgKQorI2RlZmluZSB0ZXJtX2xlc3MgICAgICAgICAgIChHLnRlcm1fbGVzcyAgICAgICAgICkKKyNkZWZpbmUga2JkX2lucHV0ICAgICAgICAgICAoRy5rYmRfaW5wdXQgICAgICAgICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCisJbGVzc19nZXRzX3BvcyA9IC0xOyBcCisJZW1wdHlfbGluZV9tYXJrZXIgPSAifiI7IFwKKwludW1fZmlsZXMgPSAxOyBcCisJY3VycmVudF9maWxlID0gMTsgXAorCWVvZl9lcnJvciA9IDE7IFwKKwl0ZXJtaW5hdGVkID0gMTsgXAorCUlGX0ZFQVRVUkVfTEVTU19SRUdFWFAod2FudGVkX21hdGNoID0gLTE7KSBcCit9IHdoaWxlICgwKQorCisvKiBmbGluZXNbXSBhcmUgbGluZXMgcmVhZCBmcm9tIHN0ZGluLCBlYWNoIGluIG1hbGxvYydlZCBidWZmZXIuCisgKiBMaW5lIG51bWJlcnMgYXJlIHN0b3JlZCBhcyB1aW50MzJfdCBwcmVwZW5kZWQgdG8gZWFjaCBsaW5lLgorICogUG9pbnRlciBpcyBhZGp1c3RlZCBzbyB0aGF0IGZsaW5lc1tpXSBwb2ludHMgZGlyZWN0bHkgcGFzdAorICogbGluZSBudW1iZXIuIEFjY2Vzb3I6ICovCisjZGVmaW5lIE1FTVBUUihwKSAoKGNoYXIqKShwKSAtIDQpCisjZGVmaW5lIExJTkVOTyhwKSAoKih1aW50MzJfdCopKChwKSAtIDQpKQorCisKKy8qIFJlc2V0IHRlcm1pbmFsIGlucHV0IHRvIG5vcm1hbCAqLworc3RhdGljIHZvaWQgc2V0X3R0eV9jb29rZWQodm9pZCkKK3sKKwlmZmx1c2hfYWxsKCk7CisJdGNzZXRhdHRyKGtiZF9mZCwgVENTQU5PVywgJnRlcm1fb3JpZyk7Cit9CisKKy8qIE1vdmUgdGhlIGN1cnNvciB0byBhIHBvc2l0aW9uICh4LHkpLCB3aGVyZSAoMCwwKSBpcyB0aGUKKyAgIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY29uc29sZSAqLworc3RhdGljIHZvaWQgbW92ZV9jdXJzb3IoaW50IGxpbmUsIGludCByb3cpCit7CisJcHJpbnRmKEVTQyJbJXU7JXVIIiwgbGluZSwgcm93KTsKK30KKworc3RhdGljIHZvaWQgY2xlYXJfbGluZSh2b2lkKQoreworCXByaW50ZihFU0MiWyV1OzBIIiBDTEVBUl8yX0VPTCwgbWF4X2Rpc3BsYXllZF9saW5lICsgMik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2hpbGl0ZShjb25zdCBjaGFyICpzdHIpCit7CisJcHJpbnRmKEhJR0hMSUdIVCIlcyJOT1JNQUwsIHN0cik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3N0YXR1c2xpbmUoY29uc3QgY2hhciAqc3RyKQoreworCWNsZWFyX2xpbmUoKTsKKwlwcmludGYoSElHSExJR0hUIiUuKnMiTk9STUFMLCB3aWR0aCAtIDEsIHN0cik7Cit9CisKKy8qIEV4aXQgdGhlIHByb2dyYW0gZ3JhY2VmdWxseSAqLworc3RhdGljIHZvaWQgbGVzc19leGl0KGludCBjb2RlKQoreworCXNldF90dHlfY29va2VkKCk7CisJY2xlYXJfbGluZSgpOworCWlmIChjb2RlIDwgMCkKKwkJa2lsbF9teXNlbGZfd2l0aF9zaWcoLSBjb2RlKTsgLyogZG9lcyBub3QgcmV0dXJuICovCisJZXhpdChjb2RlKTsKK30KKworI2lmIChFTkFCTEVfRkVBVFVSRV9MRVNTX0RBU0hDTUQgJiYgRU5BQkxFX0ZFQVRVUkVfTEVTU19MSU5FTlVNUykgXAorIHx8IEVOQUJMRV9GRUFUVVJFX0xFU1NfV0lOQ0gKK3N0YXRpYyB2b2lkIHJlX3dyYXAodm9pZCkKK3sKKwlpbnQgdyA9IHdpZHRoOworCWludCBuZXdfbGluZV9wb3M7CisJaW50IHNyY19pZHg7CisJaW50IGRzdF9pZHg7CisJaW50IG5ld19jdXJfZmxpbmUgPSAwOworCXVpbnQzMl90IGxpbmVubzsKKwljaGFyIGxpbmVidWZbdyArIDFdOworCWNvbnN0IGNoYXIgKipvbGRfZmxpbmVzID0gZmxpbmVzOworCWNvbnN0IGNoYXIgKnM7CisJY2hhciAqKm5ld19mbGluZXMgPSBOVUxMOworCWNoYXIgKmQ7CisKKwlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfTikKKwkJdyAtPSA4OworCisJc3JjX2lkeCA9IDA7CisJZHN0X2lkeCA9IDA7CisJcyA9IG9sZF9mbGluZXNbMF07CisJbGluZW5vID0gTElORU5PKHMpOworCWQgPSBsaW5lYnVmOworCW5ld19saW5lX3BvcyA9IDA7CisJd2hpbGUgKDEpIHsKKwkJKmQgPSAqczsKKwkJaWYgKCpkICE9ICdcMCcpIHsKKwkJCW5ld19saW5lX3BvcysrOworCQkJaWYgKCpkID09ICdcdCcpIHsgLyogdGFiICovCisJCQkJbmV3X2xpbmVfcG9zICs9IDc7CisJCQkJbmV3X2xpbmVfcG9zICY9ICh+Nyk7CisJCQl9CisJCQlzKys7CisJCQlkKys7CisJCQlpZiAobmV3X2xpbmVfcG9zID49IHcpIHsKKwkJCQlpbnQgc3o7CisJCQkJLyogbmV3IGxpbmUgaXMgZnVsbCwgY3JlYXRlIG5leHQgb25lICovCisJCQkJKmQgPSAnXDAnOworIG5leHRfbmV3OgorCQkJCXN6ID0gKGQgLSBsaW5lYnVmKSArIDE7IC8qICsgMTogTlVMICovCisJCQkJZCA9ICgoY2hhciopeG1hbGxvYyhzeiArIDQpKSArIDQ7CisJCQkJTElORU5PKGQpID0gbGluZW5vOworCQkJCW1lbWNweShkLCBsaW5lYnVmLCBzeik7CisJCQkJbmV3X2ZsaW5lcyA9IHhyZWFsbG9jX3ZlY3RvcihuZXdfZmxpbmVzLCA4LCBkc3RfaWR4KTsKKwkJCQluZXdfZmxpbmVzW2RzdF9pZHhdID0gZDsKKwkJCQlkc3RfaWR4Kys7CisJCQkJaWYgKG5ld19saW5lX3BvcyA8IHcpIHsKKwkJCQkJLyogaWYgd2UgY2FtZSBoZXJlIHRocnUgImdvdG8gbmV4dF9uZXciICovCisJCQkJCWlmIChzcmNfaWR4ID4gbWF4X2ZsaW5lKQorCQkJCQkJYnJlYWs7CisJCQkJCWxpbmVubyA9IExJTkVOTyhzKTsKKwkJCQl9CisJCQkJZCA9IGxpbmVidWY7CisJCQkJbmV3X2xpbmVfcG9zID0gMDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCS8qICpkID09IE5VTDogb2xkIGxpbmUgZW5kZWQsIGdvIHRvIG5leHQgb2xkIG9uZSAqLworCQlmcmVlKE1FTVBUUihvbGRfZmxpbmVzW3NyY19pZHhdKSk7CisJCS8qIGJ0dywgY29udmVydCBjdXJfZmxpbmUuLi4gKi8KKwkJaWYgKGN1cl9mbGluZSA9PSBzcmNfaWR4KQorCQkJbmV3X2N1cl9mbGluZSA9IGRzdF9pZHg7CisJCXNyY19pZHgrKzsKKwkJLyogbm8gbW9yZSBsaW5lcz8gZmluaXNoIGxhc3QgbmV3IGxpbmUgKGFuZCBleGl0IHRoZSBsb29wKSAqLworCQlpZiAoc3JjX2lkeCA+IG1heF9mbGluZSkKKwkJCWdvdG8gbmV4dF9uZXc7CisJCXMgPSBvbGRfZmxpbmVzW3NyY19pZHhdOworCQlpZiAobGluZW5vICE9IExJTkVOTyhzKSkgeworCQkJLyogdGhpcyBpcyBub3QgYSBjb250aW51YXRpb24gbGluZSEKKwkJCSAqIGNyZWF0ZSBuZXh0IF9uZXdfIGxpbmUgdG9vICovCisJCQlnb3RvIG5leHRfbmV3OworCQl9CisJfQorCisJZnJlZShvbGRfZmxpbmVzKTsKKwlmbGluZXMgPSAoY29uc3QgY2hhciAqKiluZXdfZmxpbmVzOworCisJbWF4X2ZsaW5lID0gZHN0X2lkeCAtIDE7CisJbGFzdF9saW5lX3BvcyA9IG5ld19saW5lX3BvczsKKwljdXJfZmxpbmUgPSBuZXdfY3VyX2ZsaW5lOworCS8qIG1heF9saW5lbm8gaXMgc2NyZWVuLXNpemUgaW5kZXBlbmRlbnQgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX1JFR0VYUAorCXBhdHRlcm5fdmFsaWQgPSAwOworI2VuZGlmCit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfUkVHRVhQCitzdGF0aWMgdm9pZCBmaWxsX21hdGNoX2xpbmVzKHVuc2lnbmVkIHBvcyk7CisjZWxzZQorI2RlZmluZSBmaWxsX21hdGNoX2xpbmVzKHBvcykgKCh2b2lkKTApCisjZW5kaWYKKworc3RhdGljIGludCBhdF9lbmQodm9pZCkKK3sKKwlyZXR1cm4gKG9wdGlvbl9tYXNrMzIgJiBGTEFHX1MpCisJCT8gIShjdXJfZmxpbmUgPD0gbWF4X2ZsaW5lICYmCisJCQltYXhfbGluZW5vID4gTElORU5PKGZsaW5lc1tjdXJfZmxpbmVdKSArIG1heF9kaXNwbGF5ZWRfbGluZSkKKwkJOiAhKG1heF9mbGluZSA+IGN1cl9mbGluZSArIG1heF9kaXNwbGF5ZWRfbGluZSk7Cit9CisKKy8qIERldmlsaXNobHkgY29tcGxleCByb3V0aW5lLgorICoKKyAqIEhhcyB0byBkZWFsIHdpdGggRU9GIGFuZCBFUElQRSBvbiBpbnB1dCwKKyAqIHdpdGggbGluZSB3cmFwcGluZywgd2l0aCBsYXN0IGxpbmUgbm90IGVuZGluZyBpbiAnXG4nCisgKiAocG9zc2libHkgbm90IGVuZGluZyBZRVQhKSwgd2l0aCBiYWNrc3BhY2UgYW5kIHRhYnMuCisgKiBJdCByZWFkcyBpbnB1dCBhZ2FpbiBpZiBsYXN0IHRpbWUgd2UgZ290IGFuIEVPRiAodGh1cyBzdXBwb3J0aW5nCisgKiBncm93aW5nIGZpbGVzKSBvciBFUElQRSAod2F0Y2hpbmcgb3V0cHV0IG9mIHNsb3cgcHJvY2VzcyBsaWtlIG1ha2UpLgorICoKKyAqIFZhcmlhYmxlcyB1c2VkOgorICogZmxpbmVzW10gLSBhcnJheSBvZiBsaW5lcyBhbHJlYWR5IHJlYWQuIExpbmV3cmFwIG1heSBjYXVzZQorICogICAgICBvbmUgc291cmNlIGZpbGUgbGluZSB0byBvY2N1cHkgc2V2ZXJhbCBmbGluZXNbbl0uCisgKiBmbGluZXNbbWF4X2ZsaW5lXSAtIGxhc3QgbGluZSwgcG9zc2libHkgaW5jb21wbGV0ZS4KKyAqIHRlcm1pbmF0ZWQgLSAxIGlmIGZsaW5lc1ttYXhfZmxpbmVdIGlzICd0ZXJtaW5hdGVkJworICogICAgICAoaWYgdGhlcmUgd2FzICdcbicgW3doaWNoIGlzbid0IHN0b3JlZCBpdHNlbGYsIHdlIGp1c3QgcmVtZW1iZXIKKyAqICAgICAgdGhhdCBpdCB3YXMgc2Vlbl0pCisgKiBtYXhfbGluZW5vIC0gbGFzdCBsaW5lJ3MgbnVtYmVyLCB0aGlzIG9uZSBkb2Vzbid0IGluY3JlbWVudAorICogICAgICBvbiBsaW5lIHdyYXAsIG9ubHkgb24gInJlYWwiIG5ldyBsaW5lcy4KKyAqIHJlYWRidWZbMC4ucmVhZGVvZi0xXSAtIHNtYWxsIHByZWxpbWluYXJ5IGJ1ZmZlci4KKyAqIHJlYWRidWZbcmVhZHBvc10gLSBuZXh0IGNoYXJhY3RlciB0byBhZGQgdG8gY3VycmVudCBsaW5lLgorICogbGFzdF9saW5lX3BvcyAtIHNjcmVlbiBsaW5lIHBvc2l0aW9uIG9mIG5leHQgY2hhciB0byBiZSByZWFkCisgKiAgICAgICh0YWtlcyBpbnRvIGFjY291bnQgdGFicyBhbmQgYmFja3NwYWNlcykKKyAqIGVvZl9lcnJvciAtIDwgMCBlcnJvciwgPT0gMCBFT0YsID4gMCBub3QgRU9GL2Vycm9yCisgKgorICogImdpdCBsb2cgLXAgfCBsZXNzIC1tIiBvbiB0aGUga2VybmVsIGdpdCB0cmVlIGlzIGEgZ29vZCB0ZXN0IGZvciBFQUdBSU5zLAorICogIi9zZWFyY2ggb24gdmVyeSBsb25nIGlucHV0IiBhbmQgInJlYWNoaW5nIG1heCBsaW5lIGNvdW50IiBjb3JuZXIgY2FzZXMuCisgKi8KK3N0YXRpYyB2b2lkIHJlYWRfbGluZXModm9pZCkKK3sKKyNkZWZpbmUgcmVhZGJ1ZiBiYl9jb21tb25fYnVmc2l6MQorCWNoYXIgKmN1cnJlbnRfbGluZSwgKnA7CisJaW50IHcgPSB3aWR0aDsKKwljaGFyIGxhc3RfdGVybWluYXRlZCA9IHRlcm1pbmF0ZWQ7CisJdGltZV90IGxhc3RfdGltZSA9IDA7CisJaW50IHJldHJ5X0VBR0FJTiA9IDI7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19SRUdFWFAKKwl1bnNpZ25lZCBvbGRfbWF4X2ZsaW5lID0gbWF4X2ZsaW5lOworI2VuZGlmCisKKwkvKiAoY2FyZWZ1bDogbWF4X2ZsaW5lIGNhbiBiZSAtMSkgKi8KKwlpZiAobWF4X2ZsaW5lICsgMSA+IE1BWExJTkVTKQorCQlyZXR1cm47CisKKwlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfTikKKwkJdyAtPSA4OworCisJcCA9IGN1cnJlbnRfbGluZSA9ICgoY2hhciopeG1hbGxvYyh3ICsgNSkpICsgNDsKKwlpZiAoIWxhc3RfdGVybWluYXRlZCkgeworCQljb25zdCBjaGFyICpjcCA9IGZsaW5lc1ttYXhfZmxpbmVdOworCQlwID0gc3RwY3B5KHAsIGNwKTsKKwkJZnJlZShNRU1QVFIoY3ApKTsKKwkJLyogbGFzdF9saW5lX3BvcyBpcyBzdGlsbCB2YWxpZCBmcm9tIHByZXZpb3VzIHJlYWRfbGluZXMoKSAqLworCX0gZWxzZSB7CisJCW1heF9mbGluZSsrOworCQlsYXN0X2xpbmVfcG9zID0gMDsKKwl9CisKKwl3aGlsZSAoMSkgeyAvKiByZWFkIGxpbmVzIHVudGlsIHdlIHJlYWNoIGN1cl9mbGluZSBvciB3YW50ZWRfbWF0Y2ggKi8KKwkJKnAgPSAnXDAnOworCQl0ZXJtaW5hdGVkID0gMDsKKwkJd2hpbGUgKDEpIHsgLyogcmVhZCBjaGFycyB1bnRpbCB3ZSBoYXZlIGEgbGluZSAqLworCQkJY2hhciBjOworCQkJLyogaWYgbm8gdW5wcm9jZXNzZWQgY2hhcnMgbGVmdCwgZWF0IG1vcmUgKi8KKwkJCWlmIChyZWFkcG9zID49IHJlYWRlb2YpIHsKKwkJCQlpbnQgZmxhZ3MgPSBuZGVsYXlfb24oMCk7CisKKwkJCQl3aGlsZSAoMSkgeworCQkJCQl0aW1lX3QgdDsKKworCQkJCQllcnJubyA9IDA7CisJCQkJCWVvZl9lcnJvciA9IHNhZmVfcmVhZChTVERJTl9GSUxFTk8sIHJlYWRidWYsIHNpemVvZihyZWFkYnVmKSk7CisJCQkJCWlmIChlcnJubyAhPSBFQUdBSU4pCisJCQkJCQlicmVhazsKKwkJCQkJdCA9IHRpbWUoTlVMTCk7CisJCQkJCWlmICh0ICE9IGxhc3RfdGltZSkgeworCQkJCQkJbGFzdF90aW1lID0gdDsKKwkJCQkJCWlmICgtLXJldHJ5X0VBR0FJTiA8IDApCisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJc2NoZWRfeWllbGQoKTsKKwkJCQl9CisJCQkJZmNudGwoMCwgRl9TRVRGTCwgZmxhZ3MpOyAvKiBuZGVsYXlfb2ZmKDApICovCisJCQkJcmVhZHBvcyA9IDA7CisJCQkJcmVhZGVvZiA9IGVvZl9lcnJvcjsKKwkJCQlpZiAoZW9mX2Vycm9yIDw9IDApCisJCQkJCWdvdG8gcmVhY2hlZF9lb2Y7CisJCQkJcmV0cnlfRUFHQUlOID0gMTsKKwkJCX0KKwkJCWMgPSByZWFkYnVmW3JlYWRwb3NdOworCQkJLyogYmFja3NwYWNlPyBbbmVlZGVkIGZvciBtYW5wYWdlc10gKi8KKwkJCS8qIDx0YWI+PGJzPiBpcyAoYSkgaW5zYW5lIGFuZCAqLworCQkJLyogKGIpIGhhcmRlciB0byBkbyBjb3JyZWN0bHksIHNvIHdlIHJlZnVzZSB0byBkbyBpdCAqLworCQkJaWYgKGMgPT0gJ1x4OCcgJiYgbGFzdF9saW5lX3BvcyAmJiBwWy0xXSAhPSAnXHQnKSB7CisJCQkJcmVhZHBvcysrOyAvKiBlYXQgaXQgKi8KKwkJCQlsYXN0X2xpbmVfcG9zLS07CisJCQkvKiB3YXMgYnVnZ3kgKHAgY291bGQgZW5kIHVwIDw9IGN1cnJlbnRfbGluZSkuLi4gKi8KKwkJCQkqLS1wID0gJ1wwJzsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXsKKwkJCQlzaXplX3QgbmV3X2xhc3RfbGluZV9wb3MgPSBsYXN0X2xpbmVfcG9zICsgMTsKKwkJCQlpZiAoYyA9PSAnXHQnKSB7CisJCQkJCW5ld19sYXN0X2xpbmVfcG9zICs9IDc7CisJCQkJCW5ld19sYXN0X2xpbmVfcG9zICY9ICh+Nyk7CisJCQkJfQorCQkJCWlmICgoaW50KW5ld19sYXN0X2xpbmVfcG9zID4gdykKKwkJCQkJYnJlYWs7CisJCQkJbGFzdF9saW5lX3BvcyA9IG5ld19sYXN0X2xpbmVfcG9zOworCQkJfQorCQkJLyogb2ssIHdlIHdpbGwgZWF0IHRoaXMgY2hhciAqLworCQkJcmVhZHBvcysrOworCQkJaWYgKGMgPT0gJ1xuJykgeworCQkJCXRlcm1pbmF0ZWQgPSAxOworCQkJCWxhc3RfbGluZV9wb3MgPSAwOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogTlVMIGlzIHN1YnN0aXR1dGVkIGJ5ICdcbichICovCisJCQlpZiAoYyA9PSAnXDAnKSBjID0gJ1xuJzsKKwkJCSpwKysgPSBjOworCQkJKnAgPSAnXDAnOworCQl9IC8qIGVuZCBvZiAicmVhZCBjaGFycyB1bnRpbCB3ZSBoYXZlIGEgbGluZSIgbG9vcCAqLworI2lmIDAKKy8vQlVHOiBhbHNvIHRyaWdnZXJzIG9uIHRoaXM6CisvLyB7IHByaW50ZiAiXG5mb29cbiI7IHNsZWVwIDE7IHByaW50ZiAiXG5iYXJcbiI7IH0gfCBsZXNzCisvLyAocmVzdWx0aW5nIGluIGxvc3QgZW1wdHkgbGluZSBiZXR3ZWVuICJmb28iIGFuZCAiYmFyIiBsaW5lcykKKy8vIHRoZSAidGVybWluYXRlZCIgbG9naWMgbmVlZHMgZml4aW5nIChvciBleHBsYWluaW5nKQorCQkvKiBDb3JuZXIgY2FzZTogbGluZXdyYXAgd2l0aCBvbmx5ICIiIHdyYXBwaW5nIHRvIG5leHQgbGluZSAqLworCQkvKiBMb29rcyB1Z2x5IG9uIHNjcmVlbiwgc28gd2UgZG8gbm90IHN0b3JlIHRoaXMgZW1wdHkgbGluZSAqLworCQlpZiAoIWxhc3RfdGVybWluYXRlZCAmJiAhY3VycmVudF9saW5lWzBdKSB7CisJCQlsYXN0X3Rlcm1pbmF0ZWQgPSAxOworCQkJbWF4X2xpbmVubysrOworCQkJY29udGludWU7CisJCX0KKyNlbmRpZgorIHJlYWNoZWRfZW9mOgorCQlsYXN0X3Rlcm1pbmF0ZWQgPSB0ZXJtaW5hdGVkOworCQlmbGluZXMgPSB4cmVhbGxvY192ZWN0b3IoZmxpbmVzLCA4LCBtYXhfZmxpbmUpOworCisJCWZsaW5lc1ttYXhfZmxpbmVdID0gKGNoYXIqKXhyZWFsbG9jKE1FTVBUUihjdXJyZW50X2xpbmUpLCBzdHJsZW4oY3VycmVudF9saW5lKSArIDEgKyA0KSArIDQ7CisJCUxJTkVOTyhmbGluZXNbbWF4X2ZsaW5lXSkgPSBtYXhfbGluZW5vOworCQlpZiAodGVybWluYXRlZCkKKwkJCW1heF9saW5lbm8rKzsKKworCQlpZiAobWF4X2ZsaW5lID49IE1BWExJTkVTKSB7CisJCQllb2ZfZXJyb3IgPSAwOyAvKiBQcmV0ZW5kIHdlIHNhdyBFT0YgKi8KKwkJCWJyZWFrOworCQl9CisJCWlmICghYXRfZW5kKCkpIHsKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfTEVTU19SRUdFWFAKKwkJCWJyZWFrOworI2Vsc2UKKwkJCWlmICh3YW50ZWRfbWF0Y2ggPj0gbnVtX21hdGNoZXMpIHsgLyogZ290b19tYXRjaCBjYWxsZWQgdXMgKi8KKwkJCQlmaWxsX21hdGNoX2xpbmVzKG9sZF9tYXhfZmxpbmUpOworCQkJCW9sZF9tYXhfZmxpbmUgPSBtYXhfZmxpbmU7CisJCQl9CisJCQlpZiAod2FudGVkX21hdGNoIDwgbnVtX21hdGNoZXMpCisJCQkJYnJlYWs7CisjZW5kaWYKKwkJfQorCQlpZiAoZW9mX2Vycm9yIDw9IDApIHsKKwkJCWJyZWFrOworCQl9CisJCW1heF9mbGluZSsrOworCQljdXJyZW50X2xpbmUgPSAoKGNoYXIqKXhtYWxsb2ModyArIDUpKSArIDQ7CisJCXAgPSBjdXJyZW50X2xpbmU7CisJCWxhc3RfbGluZV9wb3MgPSAwOworCX0gLyogZW5kIG9mICJyZWFkIGxpbmVzIHVudGlsIHdlIHJlYWNoIGN1cl9mbGluZSIgbG9vcCAqLworCisJaWYgKGVvZl9lcnJvciA8IDApIHsKKwkJaWYgKGVycm5vID09IEVBR0FJTikgeworCQkJZW9mX2Vycm9yID0gMTsKKwkJfSBlbHNlIHsKKwkJCXByaW50X3N0YXR1c2xpbmUoYmJfbXNnX3JlYWRfZXJyb3IpOworCQl9CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfRkxBR1MKKwllbHNlIGlmIChlb2ZfZXJyb3IgPT0gMCkKKwkJbnVtX2xpbmVzID0gbWF4X2xpbmVubzsKKyNlbmRpZgorCisJZmlsbF9tYXRjaF9saW5lcyhvbGRfbWF4X2ZsaW5lKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX1JFR0VYUAorCS8qIHByZXZlbnQgdXMgZnJvbSBiZWluZyBzdHVjayBpbiBzZWFyY2ggZm9yIGEgbWF0Y2ggKi8KKwl3YW50ZWRfbWF0Y2ggPSAtMTsKKyNlbmRpZgorI3VuZGVmIHJlYWRidWYKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfRkxBR1MKK3N0YXRpYyBpbnQgc2FmZV9saW5lbm8oaW50IGZsaW5lKQoreworCWlmIChmbGluZSA+PSBtYXhfZmxpbmUpCisJCWZsaW5lID0gbWF4X2ZsaW5lIC0gMTsKKworCS8qIGFsc28gY2F0Y2hlcyBlbXB0eSBmaWxlIChtYXhfZmxpbmUgPT0gMCkgKi8KKwlpZiAoZmxpbmUgPCAwKQorCQlyZXR1cm4gMDsKKworCXJldHVybiBMSU5FTk8oZmxpbmVzW2ZsaW5lXSkgKyAxOworfQorCisvKiBjb3VudCBudW1iZXIgb2YgbGluZXMgaW4gZmlsZSAqLworc3RhdGljIHZvaWQgdXBkYXRlX251bV9saW5lcyh2b2lkKQoreworCWludCBjb3VudCwgZmQ7CisJc3RydWN0IHN0YXQgc3RidWY7CisJc3NpemVfdCBsZW4sIGk7CisJY2hhciBidWZbNDA5Nl07CisKKwkvKiBvbmx5IGRvIHRoaXMgZm9yIHJlZ3VsYXIgZmlsZXMgKi8KKwlpZiAobnVtX2xpbmVzID09IFJFT1BFTl9BTkRfQ09VTlQgfHwgbnVtX2xpbmVzID09IFJFT1BFTl9TVERJTikgeworCQljb3VudCA9IDA7CisJCWZkID0gb3BlbigiL3Byb2Mvc2VsZi9mZC8wIiwgT19SRE9OTFkpOworCQlpZiAoZmQgPCAwICYmIG51bV9saW5lcyA9PSBSRU9QRU5fQU5EX0NPVU5UKSB7CisJCQkvKiAiZmlsZW5hbWUiIGlzIHZhbGlkIG9ubHkgaWYgUkVPUEVOX0FORF9DT1VOVCAqLworCQkJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJCX0KKwkJaWYgKGZkIDwgMCkgeworCQkJLyogc29tZWJvZHkgc3RvbGUgbXkgZmlsZSEgKi8KKwkJCW51bV9saW5lcyA9IE5PVF9SRUdVTEFSX0ZJTEU7CisJCQlyZXR1cm47CisJCX0KKwkJaWYgKGZzdGF0KGZkLCAmc3RidWYpICE9IDAgfHwgIVNfSVNSRUcoc3RidWYuc3RfbW9kZSkpIHsKKwkJCW51bV9saW5lcyA9IE5PVF9SRUdVTEFSX0ZJTEU7CisJCQlnb3RvIGRvX2Nsb3NlOworCQl9CisJCXdoaWxlICgobGVuID0gc2FmZV9yZWFkKGZkLCBidWYsIHNpemVvZihidWYpKSkgPiAwKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKwkJCQlpZiAoYnVmW2ldID09ICdcbicgJiYgKytjb3VudCA9PSBNQVhMSU5FUykKKwkJCQkJZ290byBkb25lOworCQkJfQorCQl9CisgZG9uZToKKwkJbnVtX2xpbmVzID0gY291bnQ7CisgZG9fY2xvc2U6CisJCWNsb3NlKGZkKTsKKwl9Cit9CisKKy8qIFByaW50IGEgc3RhdHVzIGxpbmUgaWYgLU0gd2FzIHNwZWNpZmllZCAqLworc3RhdGljIHZvaWQgbV9zdGF0dXNfcHJpbnQodm9pZCkKK3sKKwlpbnQgZmlyc3QsIGxhc3Q7CisJdW5zaWduZWQgcGVyY2VudDsKKworCWlmIChsZXNzX2dldHNfcG9zID49IDApIC8qIGRvbid0IHRvdWNoIHN0YXR1c2xpbmUgd2hpbGUgaW5wdXQgaXMgZG9uZSEgKi8KKwkJcmV0dXJuOworCisJY2xlYXJfbGluZSgpOworCXByaW50ZihISUdITElHSFQiJXMiLCBmaWxlbmFtZSk7CisJaWYgKG51bV9maWxlcyA+IDEpCisJCXByaW50ZigiIChmaWxlICVpIG9mICVpKSIsIGN1cnJlbnRfZmlsZSwgbnVtX2ZpbGVzKTsKKworCWZpcnN0ID0gc2FmZV9saW5lbm8oY3VyX2ZsaW5lKTsKKwlsYXN0ID0gKG9wdGlvbl9tYXNrMzIgJiBGTEFHX1MpCisJCQk/IE1JTihmaXJzdCArIG1heF9kaXNwbGF5ZWRfbGluZSwgbWF4X2xpbmVubykKKwkJCTogc2FmZV9saW5lbm8oY3VyX2ZsaW5lICsgbWF4X2Rpc3BsYXllZF9saW5lKTsKKwlwcmludGYoIiBsaW5lcyAlaS0laSIsIGZpcnN0LCBsYXN0KTsKKworCXVwZGF0ZV9udW1fbGluZXMoKTsKKwlpZiAobnVtX2xpbmVzID49IDApCisJCXByaW50ZigiLyVpIiwgbnVtX2xpbmVzKTsKKworCWlmIChhdF9lbmQoKSkgeworCQlwcmludGYoIiAoRU5EKSIpOworCQlpZiAobnVtX2ZpbGVzID4gMSAmJiBjdXJyZW50X2ZpbGUgIT0gbnVtX2ZpbGVzKQorCQkJcHJpbnRmKCIgLSBuZXh0OiAlcyIsIGZpbGVzW2N1cnJlbnRfZmlsZV0pOworCX0gZWxzZSBpZiAobnVtX2xpbmVzID4gMCkgeworCQlwZXJjZW50ID0gKDEwMCAqIGxhc3QgKyBudW1fbGluZXMvMikgLyBudW1fbGluZXM7CisJCXByaW50ZigiICVpJSUiLCBwZXJjZW50IDw9IDEwMCA/IHBlcmNlbnQgOiAxMDApOworCX0KKwlwcmludGYoTk9STUFMKTsKK30KKyNlbmRpZgorCisvKiBQcmludCB0aGUgc3RhdHVzIGxpbmUgKi8KK3N0YXRpYyB2b2lkIHN0YXR1c19wcmludCh2b2lkKQoreworCWNvbnN0IGNoYXIgKnA7CisKKwlpZiAobGVzc19nZXRzX3BvcyA+PSAwKSAvKiBkb24ndCB0b3VjaCBzdGF0dXNsaW5lIHdoaWxlIGlucHV0IGlzIGRvbmUhICovCisJCXJldHVybjsKKworCS8qIENoYW5nZSB0aGUgc3RhdHVzIGlmIGZsYWdzIGhhdmUgYmVlbiBzZXQgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX0ZMQUdTCisJaWYgKG9wdGlvbl9tYXNrMzIgJiAoRkxBR19NfEZMQUdfbSkpIHsKKwkJbV9zdGF0dXNfcHJpbnQoKTsKKwkJcmV0dXJuOworCX0KKwkvKiBObyBmbGFncyBzZXQgKi8KKyNlbmRpZgorCisJY2xlYXJfbGluZSgpOworCWlmIChjdXJfZmxpbmUgJiYgIWF0X2VuZCgpKSB7CisJCWJiX3B1dGNoYXIoJzonKTsKKwkJcmV0dXJuOworCX0KKwlwID0gIihFTkQpIjsKKwlpZiAoIWN1cl9mbGluZSkKKwkJcCA9IGZpbGVuYW1lOworCWlmIChudW1fZmlsZXMgPiAxKSB7CisJCXByaW50ZihISUdITElHSFQiJXMgKGZpbGUgJWkgb2YgJWkpIk5PUk1BTCwKKwkJCQlwLCBjdXJyZW50X2ZpbGUsIG51bV9maWxlcyk7CisJCXJldHVybjsKKwl9CisJcHJpbnRfaGlsaXRlKHApOworfQorCitzdGF0aWMgY29uc3QgY2hhciBjb250cm9sc1tdIEFMSUdOMSA9CisJLyogTlVMOiBuZXZlciBlbmNvdW50ZXJlZDsgVEFCOiBub3QgY29udmVydGVkICovCisJLyoqLyJceDAxXHgwMlx4MDNceDA0XHgwNVx4MDZceDA3XHgwOCIgICJceDBhXHgwYlx4MGNceDBkXHgwZVx4MGYiCisJIlx4MTBceDExXHgxMlx4MTNceDE0XHgxNVx4MTZceDE3XHgxOFx4MTlceDFhXHgxYlx4MWNceDFkXHgxZVx4MWYiCisJIlx4N2ZceDliIjsgLyogREVMIGFuZCBpbmZhbW91cyBNZXRhLUVTQyA6KCAqLworc3RhdGljIGNvbnN0IGNoYXIgY3RybGNvbnZbXSBBTElHTjEgPQorCS8qIHdoeSA0MCBpbnN0ZWFkIG9mIDRhIGJlbG93PyAtIGl0IGlzIGEgcmVwbGFjZW1lbnQgZm9yICdcbicuCisJICogJ1xuJyBpcyBhIGZvcm1lciBOVUwgLSB3ZSBzdWJzdCBpdCB3aXRoIEAsIG5vdCBKICovCisJIlx4NDBceDQxXHg0Mlx4NDNceDQ0XHg0NVx4NDZceDQ3XHg0OFx4NDlceDQwXHg0Ylx4NGNceDRkXHg0ZVx4NGYiCisJIlx4NTBceDUxXHg1Mlx4NTNceDU0XHg1NVx4NTZceDU3XHg1OFx4NTlceDVhXHg1Ylx4NWNceDVkXHg1ZVx4NWYiOworCitzdGF0aWMgdm9pZCBwcmludF9saW5lbm8oY29uc3QgY2hhciAqbGluZSkKK3sKKwljb25zdCBjaGFyICpmbXQgPSAiICAgICAgICAiOworCXVuc2lnbmVkIG4gPSBuOyAvKiBmb3IgY29tcGlsZXIgKi8KKworCWlmIChsaW5lICE9IGVtcHR5X2xpbmVfbWFya2VyKSB7CisJCS8qIFdpZHRoIG9mIDcgcHJlc2VydmVzIHRhYiBzcGFjaW5nIGluIHRoZSB0ZXh0ICovCisJCWZtdCA9ICIlN3UgIjsKKwkJbiA9IExJTkVOTyhsaW5lKSArIDE7CisJCWlmIChuID4gOTk5OTk5OSAmJiBNQVhMSU5FUyA+IDk5OTk5OTkpIHsKKwkJCW4gJT0gMTAwMDAwMDA7CisJCQlmbXQgPSAiJTA3dSAiOworCQl9CisJfQorCXByaW50ZihmbXQsIG4pOworfQorCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX1JFR0VYUAorc3RhdGljIHZvaWQgcHJpbnRfZm91bmQoY29uc3QgY2hhciAqbGluZSkKK3sKKwlpbnQgbWF0Y2hfc3RhdHVzOworCWludCBlZmxhZ3M7CisJY2hhciAqZ3Jvd2xpbmU7CisJcmVnbWF0Y2hfdCBtYXRjaF9zdHJ1Y3RzOworCisJY2hhciBidWZbd2lkdGgrMV07CisJY29uc3QgY2hhciAqc3RyID0gbGluZTsKKwljaGFyICpwID0gYnVmOworCXNpemVfdCBuOworCisJd2hpbGUgKCpzdHIpIHsKKwkJbiA9IHN0cmNzcG4oc3RyLCBjb250cm9scyk7CisJCWlmIChuKSB7CisJCQlpZiAoIXN0cltuXSkgYnJlYWs7CisJCQltZW1jcHkocCwgc3RyLCBuKTsKKwkJCXAgKz0gbjsKKwkJCXN0ciArPSBuOworCQl9CisJCW4gPSBzdHJzcG4oc3RyLCBjb250cm9scyk7CisJCW1lbXNldChwLCAnLicsIG4pOworCQlwICs9IG47CisJCXN0ciArPSBuOworCX0KKwlzdHJjcHkocCwgc3RyKTsKKworCS8qIGJ1ZltdIGhvbGRzIHF1YXJhbnRpbmVkIHZlcnNpb24gb2Ygc3RyICovCisKKwkvKiBFYWNoIHBhcnQgb2YgdGhlIGxpbmUgdGhhdCBtYXRjaGVzIGhhcyB0aGUgSElHSExJR0hUCisJICogYW5kIE5PUk1BTCBlc2NhcGUgc2VxdWVuY2VzIHBsYWNlZCBhcm91bmQgaXQuCisJICogTkI6IHdlIHJlZ2V4IGFnYWluc3QgbGluZSwgYnV0IGluc2VydCB0ZXh0CisJICogZnJvbSBxdWFyYW50aW5lZCBjb3B5IChidWZbXSkgKi8KKwlzdHIgPSBidWY7CisJZ3Jvd2xpbmUgPSBOVUxMOworCWVmbGFncyA9IDA7CisJZ290byBzdGFydDsKKworCXdoaWxlIChtYXRjaF9zdGF0dXMgPT0gMCkgeworCQljaGFyICpuZXcgPSB4YXNwcmludGYoIiVzJS4qcyJISUdITElHSFQiJS4qcyJOT1JNQUwsCisJCQkJZ3Jvd2xpbmUgPyBncm93bGluZSA6ICIiLAorCQkJCShpbnQpbWF0Y2hfc3RydWN0cy5ybV9zbywgc3RyLAorCQkJCShpbnQpKG1hdGNoX3N0cnVjdHMucm1fZW8gLSBtYXRjaF9zdHJ1Y3RzLnJtX3NvKSwKKwkJCQkJCXN0ciArIG1hdGNoX3N0cnVjdHMucm1fc28pOworCQlmcmVlKGdyb3dsaW5lKTsKKwkJZ3Jvd2xpbmUgPSBuZXc7CisJCXN0ciArPSBtYXRjaF9zdHJ1Y3RzLnJtX2VvOworCQlsaW5lICs9IG1hdGNoX3N0cnVjdHMucm1fZW87CisJCWVmbGFncyA9IFJFR19OT1RCT0w7Cisgc3RhcnQ6CisJCS8qIE1vc3Qgb2YgdGhlIHRpbWUgZG9lc24ndCBmaW5kIHRoZSByZWdleCwgb3B0aW1pemUgZm9yIHRoYXQgKi8KKwkJbWF0Y2hfc3RhdHVzID0gcmVnZXhlYygmcGF0dGVybiwgbGluZSwgMSwgJm1hdGNoX3N0cnVjdHMsIGVmbGFncyk7CisJCS8qIGlmIGV2ZW4gIiIgbWF0Y2hlcywgdHJlYXQgaXQgYXMgIm5vdCBhIG1hdGNoIiAqLworCQlpZiAobWF0Y2hfc3RydWN0cy5ybV9zbyA+PSBtYXRjaF9zdHJ1Y3RzLnJtX2VvKQorCQkJbWF0Y2hfc3RhdHVzID0gMTsKKwl9CisKKwlwcmludGYoIiVzJXNcbiIsIGdyb3dsaW5lID8gZ3Jvd2xpbmUgOiAiIiwgc3RyKTsKKwlmcmVlKGdyb3dsaW5lKTsKK30KKyNlbHNlCit2b2lkIHByaW50X2ZvdW5kKGNvbnN0IGNoYXIgKmxpbmUpOworI2VuZGlmCisKK3N0YXRpYyB2b2lkIHByaW50X2FzY2lpKGNvbnN0IGNoYXIgKnN0cikKK3sKKwljaGFyIGJ1Zlt3aWR0aCsxXTsKKwljaGFyICpwOworCXNpemVfdCBuOworCisJd2hpbGUgKCpzdHIpIHsKKwkJbiA9IHN0cmNzcG4oc3RyLCBjb250cm9scyk7CisJCWlmIChuKSB7CisJCQlpZiAoIXN0cltuXSkgYnJlYWs7CisJCQlwcmludGYoIiUuKnMiLCAoaW50KSBuLCBzdHIpOworCQkJc3RyICs9IG47CisJCX0KKwkJbiA9IHN0cnNwbihzdHIsIGNvbnRyb2xzKTsKKwkJcCA9IGJ1ZjsKKwkJZG8geworCQkJaWYgKCpzdHIgPT0gMHg3ZikKKwkJCQkqcCsrID0gJz8nOworCQkJZWxzZSBpZiAoKnN0ciA9PSAoY2hhcikweDliKQorCQkJLyogVlQxMDAncyBDU0ksIGFrYSBNZXRhLUVTQy4gV2hvJ3MgaW52ZW50b3I/ICovCisJCQkvKiBJIHdhbnQgdG8ga25vdyB3aG8gY29tbWl0dGVkIHRoaXMgc2luICovCisJCQkJKnArKyA9ICd7JzsKKwkJCWVsc2UKKwkJCQkqcCsrID0gY3RybGNvbnZbKHVuc2lnbmVkIGNoYXIpKnN0cl07CisJCQlzdHIrKzsKKwkJfSB3aGlsZSAoLS1uKTsKKwkJKnAgPSAnXDAnOworCQlwcmludF9oaWxpdGUoYnVmKTsKKwl9CisJcHV0cyhzdHIpOworfQorCisvKiBQcmludCB0aGUgYnVmZmVyICovCitzdGF0aWMgdm9pZCBidWZmZXJfcHJpbnQodm9pZCkKK3sKKwl1bnNpZ25lZCBpOworCisJbW92ZV9jdXJzb3IoMCwgMCk7CisJZm9yIChpID0gMDsgaSA8PSBtYXhfZGlzcGxheWVkX2xpbmU7IGkrKykgeworCQlwcmludGYoQ0xFQVJfMl9FT0wpOworCQlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfTikKKwkJCXByaW50X2xpbmVubyhidWZmZXJbaV0pOworCQlpZiAocGF0dGVybl92YWxpZCkKKwkJCXByaW50X2ZvdW5kKGJ1ZmZlcltpXSk7CisJCWVsc2UKKwkJCXByaW50X2FzY2lpKGJ1ZmZlcltpXSk7CisJfQorCWlmICgob3B0aW9uX21hc2szMiAmIEZMQUdfRSkKKwkgJiYgZW9mX2Vycm9yIDw9IDAKKwkgJiYgKG1heF9mbGluZSAtIGN1cl9mbGluZSkgPD0gbWF4X2Rpc3BsYXllZF9saW5lCisJKSB7CisJCWxlc3NfZXhpdChFWElUX1NVQ0NFU1MpOworCX0KKwlzdGF0dXNfcHJpbnQoKTsKK30KKworc3RhdGljIHZvaWQgYnVmZmVyX2ZpbGxfYW5kX3ByaW50KHZvaWQpCit7CisJdW5zaWduZWQgaTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX1RSVU5DQVRFCisJaW50IGZwb3MgPSBjdXJfZmxpbmU7CisKKwlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfUykgeworCQkvKiBHbyBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBsaW5lICovCisJCXdoaWxlIChmcG9zICYmIExJTkVOTyhmbGluZXNbZnBvc10pID09IExJTkVOTyhmbGluZXNbZnBvcy0xXSkpCisJCQlmcG9zLS07CisJfQorCisJaSA9IDA7CisJd2hpbGUgKGkgPD0gbWF4X2Rpc3BsYXllZF9saW5lICYmIGZwb3MgPD0gbWF4X2ZsaW5lKSB7CisJCWludCBsaW5lbm8gPSBMSU5FTk8oZmxpbmVzW2Zwb3NdKTsKKwkJYnVmZmVyW2ldID0gZmxpbmVzW2Zwb3NdOworCQlpKys7CisJCWRvIHsKKwkJCWZwb3MrKzsKKwkJfSB3aGlsZSAoKGZwb3MgPD0gbWF4X2ZsaW5lKQorCQkgICAgICAmJiAob3B0aW9uX21hc2szMiAmIEZMQUdfUykKKwkJICAgICAgJiYgbGluZW5vID09IExJTkVOTyhmbGluZXNbZnBvc10pCisJCSk7CisJfQorI2Vsc2UKKwlmb3IgKGkgPSAwOyBpIDw9IG1heF9kaXNwbGF5ZWRfbGluZSAmJiBjdXJfZmxpbmUgKyBpIDw9IG1heF9mbGluZTsgaSsrKSB7CisJCWJ1ZmZlcltpXSA9IGZsaW5lc1tjdXJfZmxpbmUgKyBpXTsKKwl9CisjZW5kaWYKKwlmb3IgKDsgaSA8PSBtYXhfZGlzcGxheWVkX2xpbmU7IGkrKykgeworCQlidWZmZXJbaV0gPSBlbXB0eV9saW5lX21hcmtlcjsKKwl9CisJYnVmZmVyX3ByaW50KCk7Cit9CisKKy8qIG1vdmUgY3VyX2ZsaW5lIHRvIGEgZ2l2ZW4gbGluZSBudW1iZXIsIHJlYWRpbmcgbGluZXMgaWYgbmVjZXNzYXJ5ICovCitzdGF0aWMgdm9pZCBnb3RvX2xpbmVubyhpbnQgdGFyZ2V0KQoreworCWlmICh0YXJnZXQgPD0gMCApIHsKKwkJY3VyX2ZsaW5lID0gMDsKKwl9CisJZWxzZSBpZiAodGFyZ2V0ID4gTElORU5PKGZsaW5lc1tjdXJfZmxpbmVdKSkgeworIHJldHJ5OgorCQl3aGlsZSAoTElORU5PKGZsaW5lc1tjdXJfZmxpbmVdKSAhPSB0YXJnZXQgJiYgY3VyX2ZsaW5lIDwgbWF4X2ZsaW5lKQorCQkJKytjdXJfZmxpbmU7CisJCS8qIHRhcmdldCBub3QgcmVhY2hlZCBidXQgbW9yZSBpbnB1dCBpcyBhdmFpbGFibGUgKi8KKwkJaWYgKExJTkVOTyhmbGluZXNbY3VyX2ZsaW5lXSkgIT0gdGFyZ2V0ICYmIGVvZl9lcnJvciA+IDApIHsKKwkJCXJlYWRfbGluZXMoKTsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwl9CisJZWxzZSB7CisJCS8qIHNlYXJjaCBiYWNrd2FyZHMgdGhyb3VnaCBhbHJlYWR5LXJlYWQgbGluZXMgKi8KKwkJd2hpbGUgKExJTkVOTyhmbGluZXNbY3VyX2ZsaW5lXSkgIT0gdGFyZ2V0ICYmIGN1cl9mbGluZSA+IDApCisJCQktLWN1cl9mbGluZTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNhcF9jdXJfZmxpbmUodm9pZCkKK3sKKwlpZiAoKG9wdGlvbl9tYXNrMzIgJiBGTEFHX1MpKSB7CisJCWlmIChjdXJfZmxpbmUgPiBtYXhfZmxpbmUpCisJCQljdXJfZmxpbmUgPSBtYXhfZmxpbmU7CisJCWlmIChMSU5FTk8oZmxpbmVzW2N1cl9mbGluZV0pICsgbWF4X2Rpc3BsYXllZF9saW5lID4gbWF4X2xpbmVubyArIFRJTERFUykgeworCQkJZ290b19saW5lbm8obWF4X2xpbmVubyAtIG1heF9kaXNwbGF5ZWRfbGluZSArIFRJTERFUyk7CisJCQlyZWFkX2xpbmVzKCk7CisJCX0KKwl9CisJZWxzZSB7CisJCWlmIChjdXJfZmxpbmUgKyBtYXhfZGlzcGxheWVkX2xpbmUgPiBtYXhfZmxpbmUgKyBUSUxERVMpCisJCQljdXJfZmxpbmUgPSBtYXhfZmxpbmUgLSBtYXhfZGlzcGxheWVkX2xpbmUgKyBUSUxERVM7CisJCWlmIChjdXJfZmxpbmUgPCAwKQorCQkJY3VyX2ZsaW5lID0gMDsKKwl9Cit9CisKKy8qIE1vdmUgdGhlIGJ1ZmZlciB1cCBhbmQgZG93biBpbiB0aGUgZmlsZSBpbiBvcmRlciB0byBzY3JvbGwgKi8KK3N0YXRpYyB2b2lkIGJ1ZmZlcl9kb3duKGludCBubGluZXMpCit7CisJaWYgKChvcHRpb25fbWFzazMyICYgRkxBR19TKSkKKwkJZ290b19saW5lbm8oTElORU5PKGZsaW5lc1tjdXJfZmxpbmVdKSArIG5saW5lcyk7CisJZWxzZQorCQljdXJfZmxpbmUgKz0gbmxpbmVzOworCXJlYWRfbGluZXMoKTsKKwljYXBfY3VyX2ZsaW5lKCk7CisJYnVmZmVyX2ZpbGxfYW5kX3ByaW50KCk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1ZmZlcl91cChpbnQgbmxpbmVzKQoreworCWlmICgob3B0aW9uX21hc2szMiAmIEZMQUdfUykpIHsKKwkJZ290b19saW5lbm8oTElORU5PKGZsaW5lc1tjdXJfZmxpbmVdKSAtIG5saW5lcyk7CisJfQorCWVsc2UgeworCQljdXJfZmxpbmUgLT0gbmxpbmVzOworCQlpZiAoY3VyX2ZsaW5lIDwgMCkKKwkJCWN1cl9mbGluZSA9IDA7CisJfQorCXJlYWRfbGluZXMoKTsKKwlidWZmZXJfZmlsbF9hbmRfcHJpbnQoKTsKK30KKworLyogZGlzcGxheSBhIGdpdmVuIGxpbmUgd2hlcmUgdGhlIGFyZ3VtZW50IGNhbiBiZSBlaXRoZXIgYW4gaW5kZXggaW50bworICogdGhlIGZsaW5lcyBhcnJheSBvciBhIGxpbmUgbnVtYmVyICovCitzdGF0aWMgdm9pZCBidWZmZXJfdG9fbGluZShpbnQgbGluZW51bSwgaW50IGlzX2xpbmVubykKK3sKKwlpZiAobGluZW51bSA8PSAwKQorCQljdXJfZmxpbmUgPSAwOworCWVsc2UgaWYgKGlzX2xpbmVubykKKwkJZ290b19saW5lbm8obGluZW51bSk7CisJZWxzZQorCQljdXJfZmxpbmUgPSBsaW5lbnVtOworCXJlYWRfbGluZXMoKTsKKwljYXBfY3VyX2ZsaW5lKCk7CisJYnVmZmVyX2ZpbGxfYW5kX3ByaW50KCk7Cit9CisKK3N0YXRpYyB2b2lkIGJ1ZmZlcl9saW5lKGludCBsaW5lbnVtKQoreworCWJ1ZmZlcl90b19saW5lKGxpbmVudW0sIEZBTFNFKTsKK30KKworc3RhdGljIHZvaWQgYnVmZmVyX2xpbmVubyhpbnQgbGluZW5vKQoreworCWJ1ZmZlcl90b19saW5lKGxpbmVubywgVFJVRSk7Cit9CisKK3N0YXRpYyB2b2lkIG9wZW5fZmlsZV9hbmRfcmVhZF9saW5lcyh2b2lkKQoreworCWlmIChmaWxlbmFtZSkgeworCQl4bW92ZV9mZCh4b3BlbihmaWxlbmFtZSwgT19SRE9OTFkpLCBTVERJTl9GSUxFTk8pOworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfRkxBR1MKKwkJbnVtX2xpbmVzID0gUkVPUEVOX0FORF9DT1VOVDsKKyNlbmRpZgorCX0gZWxzZSB7CisJCS8qICJsZXNzIiB3aXRoIG5vIGFyZ3VtZW50cyBpbiBhcmd2W10gKi8KKwkJLyogRm9yIHN0YXR1cyBsaW5lIG9ubHkgKi8KKwkJZmlsZW5hbWUgPSB4c3RyZHVwKGJiX21zZ19zdGFuZGFyZF9pbnB1dCk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19GTEFHUworCQludW1fbGluZXMgPSBSRU9QRU5fU1RESU47CisjZW5kaWYKKwl9CisJcmVhZHBvcyA9IDA7CisJcmVhZGVvZiA9IDA7CisJbGFzdF9saW5lX3BvcyA9IDA7CisJdGVybWluYXRlZCA9IDE7CisJcmVhZF9saW5lcygpOworfQorCisvKiBSZWluaXRpYWxpemUgZXZlcnl0aGluZyBmb3IgYSBuZXcgZmlsZSAtIGZyZWUgdGhlIG1lbW9yeSBhbmQgc3RhcnQgb3ZlciAqLworc3RhdGljIHZvaWQgcmVpbml0aWFsaXplKHZvaWQpCit7CisJdW5zaWduZWQgaTsKKworCWlmIChmbGluZXMpIHsKKwkJZm9yIChpID0gMDsgaSA8PSBtYXhfZmxpbmU7IGkrKykKKwkJCWZyZWUoTUVNUFRSKGZsaW5lc1tpXSkpOworCQlmcmVlKGZsaW5lcyk7CisJCWZsaW5lcyA9IE5VTEw7CisJfQorCisJbWF4X2ZsaW5lID0gLTE7CisJY3VyX2ZsaW5lID0gMDsKKwltYXhfbGluZW5vID0gMDsKKwlvcGVuX2ZpbGVfYW5kX3JlYWRfbGluZXMoKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX0FTS19URVJNSU5BTAorCWlmIChHLndpbnNpemVfZXJyKQorCQlwcmludGYoIlwwMzNbOTk5Ozk5OUgiICJcMDMzWzZuIik7CisjZW5kaWYKKwlidWZmZXJfZmlsbF9hbmRfcHJpbnQoKTsKK30KKworc3RhdGljIGludDY0X3QgZ2V0Y2hfbm93YWl0KHZvaWQpCit7CisJaW50IHJkOworCWludDY0X3Qga2V5NjQ7CisJc3RydWN0IHBvbGxmZCBwZmRbMl07CisKKwlwZmRbMF0uZmQgPSBTVERJTl9GSUxFTk87CisJcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKwlwZmRbMV0uZmQgPSBrYmRfZmQ7CisJcGZkWzFdLmV2ZW50cyA9IFBPTExJTjsKKyBhZ2FpbjoKKwl0Y3NldGF0dHIoa2JkX2ZkLCBUQ1NBTk9XLCAmdGVybV9sZXNzKTsKKwkvKiBOQjogc2VsZWN0L3BvbGwgcmV0dXJucyB3aGVuZXZlciByZWFkIHdpbGwgbm90IGJsb2NrLiBUaGVyZWZvcmU6CisJICogaWYgZW9mIGlzIHJlYWNoZWQsIHNlbGVjdC9wb2xsIHdpbGwgcmV0dXJuIGltbWVkaWF0ZWx5CisJICogYmVjYXVzZSByZWFkIHdpbGwgaW1tZWRpYXRlbHkgcmV0dXJuIDAgYnl0ZXMuCisJICogRXZlbiBpZiBzZWxlY3QvcG9sbCBzYXlzIHRoYXQgaW5wdXQgaXMgYXZhaWxhYmxlLCByZWFkIENBTiBibG9jaworCSAqIChzd2l0Y2ggZmQgaW50byBPX05PTkJMT0NLJ2VkIG1vZGUgdG8gYXZvaWQgaXQpCisJICovCisJcmQgPSAxOworCS8qIEFyZSB3ZSBpbnRlcmVzdGVkIGluIHN0ZGluPyAqLworCWlmIChhdF9lbmQoKSkgeworCQlpZiAoZW9mX2Vycm9yID4gMCkgLyogZGlkIE5PVCByZWFjaCBlb2YgeWV0ICovCisJCQlyZCA9IDA7IC8qIHllcywgd2UgYXJlIGludGVyZXN0ZWQgaW4gc3RkaW4gKi8KKwl9CisJLyogUG9zaXRpb24gY3Vyc29yIGlmIGxpbmUgaW5wdXQgaXMgZG9uZSAqLworCWlmIChsZXNzX2dldHNfcG9zID49IDApCisJCW1vdmVfY3Vyc29yKG1heF9kaXNwbGF5ZWRfbGluZSArIDIsIGxlc3NfZ2V0c19wb3MgKyAxKTsKKwlmZmx1c2hfYWxsKCk7CisKKwlpZiAoa2JkX2lucHV0WzBdID09IDApIHsgLyogaWYgbm90aGluZyBpcyBidWZmZXJlZCAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfV0lOQ0gKKwkJd2hpbGUgKDEpIHsKKwkJCWludCByOworCQkJLyogTkI6IFNJR1dJTkNIIGludGVycnVwdHMgcG9sbCgpICovCisJCQlyID0gcG9sbChwZmQgKyByZCwgMiAtIHJkLCAtMSk7CisJCQlpZiAoLypyIDwgMCAmJiBlcnJubyA9PSBFSU5UUiAmJiovIHdpbmNoX2NvdW50ZXIpCisJCQkJcmV0dXJuICdcXCc7IC8qIGFueXRoaW5nIHdoaWNoIGhhcyBubyBkZWZpbmVkIGZ1bmN0aW9uICovCisJCQlpZiAocikgYnJlYWs7CisJCX0KKyNlbHNlCisJCXNhZmVfcG9sbChwZmQgKyByZCwgMiAtIHJkLCAtMSk7CisjZW5kaWYKKwl9CisKKwkvKiBXZSBoYXZlIGtiZF9mZCBpbiBPX05PTkJMT0NLIG1vZGUsIHJlYWQgaW5zaWRlIHJlYWRfa2V5KCkKKwkgKiB3b3VsZCBub3QgYmxvY2sgZXZlbiBpZiB0aGVyZSBpcyBubyBpbnB1dCBhdmFpbGFibGUgKi8KKwlrZXk2NCA9IHJlYWRfa2V5KGtiZF9mZCwga2JkX2lucHV0LCAvKnRpbWVvdXQgb2ZmOiovIC0yKTsKKwlpZiAoKGludClrZXk2NCA9PSAtMSkgeworCQlpZiAoZXJybm8gPT0gRUFHQUlOKSB7CisJCQkvKiBObyBrZXlib2FyZCBpbnB1dCBhdmFpbGFibGUuIFNpbmNlIHBvbGwoKSBkaWQgcmV0dXJuLAorCQkJICogd2Ugc2hvdWxkIGhhdmUgaW5wdXQgb24gc3RkaW4gKi8KKwkJCXJlYWRfbGluZXMoKTsKKwkJCWJ1ZmZlcl9maWxsX2FuZF9wcmludCgpOworCQkJZ290byBhZ2FpbjsKKwkJfQorCQkvKiBFT0YvZXJyb3IgKHNzaCBzZXNzaW9uIGdvdCBraWxsZWQgZXRjKSAqLworCQlsZXNzX2V4aXQoMCk7CisJfQorCXNldF90dHlfY29va2VkKCk7CisJcmV0dXJuIGtleTY0OworfQorCisvKiBHcmFiIGEgY2hhcmFjdGVyIGZyb20gaW5wdXQgd2l0aG91dCByZXF1aXJpbmcgdGhlIHJldHVybiBrZXkuCisgKiBNYXkgcmV0dXJuIEtFWUNPREVfeHh4IHZhbHVlcy4KKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHdvcmtzIGJlc3Qgd2l0aCByYXcgaW5wdXQuICovCitzdGF0aWMgaW50NjRfdCBsZXNzX2dldGNoKGludCBwb3MpCit7CisJaW50NjRfdCBrZXk2NDsKKwlpbnQga2V5OworCisgYWdhaW46CisJbGVzc19nZXRzX3BvcyA9IHBvczsKKwlrZXkgPSBrZXk2NCA9IGdldGNoX25vd2FpdCgpOworCWxlc3NfZ2V0c19wb3MgPSAtMTsKKworCS8qIERpc2NhcmQgQ3RybC1zb21ldGhpbmcgY2hhcnMuCisJICogKGNoZWNraW5nIG9ubHkgbG93ZXIgMzIgYml0cyBpcyBhIHNpemUgb3B0aW1pemF0aW9uOgorCSAqIHVwcGVyIDMyIGJpdHMgYXJlIHVzZWQgb25seSBieSBLRVlDT0RFX0NVUlNPUl9QT1MpCisJICovCisJaWYgKGtleSA+PSAwICYmIGtleSA8ICcgJyAmJiBrZXkgIT0gMHgwZCAmJiBrZXkgIT0gOCkKKwkJZ290byBhZ2FpbjsKKworCXJldHVybiBrZXk2NDsKK30KKworc3RhdGljIGNoYXIqIGxlc3NfZ2V0cyhpbnQgc3opCit7CisJaW50IGM7CisJdW5zaWduZWQgaSA9IDA7CisJY2hhciAqcmVzdWx0ID0geHphbGxvYygxKTsKKworCXdoaWxlICgxKSB7CisJCWMgPSAnXDAnOworCQlsZXNzX2dldHNfcG9zID0gc3ogKyBpOworCQljID0gZ2V0Y2hfbm93YWl0KCk7CisJCWlmIChjID09IDB4MGQpIHsKKwkJCXJlc3VsdFtpXSA9ICdcMCc7CisJCQlsZXNzX2dldHNfcG9zID0gLTE7CisJCQlyZXR1cm4gcmVzdWx0OworCQl9CisJCWlmIChjID09IDB4N2YpCisJCQljID0gODsKKwkJaWYgKGMgPT0gOCAmJiBpKSB7CisJCQlwcmludGYoIlx4OCBceDgiKTsKKwkJCWktLTsKKwkJfQorCQlpZiAoYyA8ICcgJykgLyogZmlsdGVycyBvdXQgS0VZQ09ERV94eHggdG9vICg8MCkgKi8KKwkJCWNvbnRpbnVlOworCQlpZiAoaSA+PSB3aWR0aCAtIHN6IC0gMSkKKwkJCWNvbnRpbnVlOyAvKiBsZW4gbGltaXQgKi8KKwkJYmJfcHV0Y2hhcihjKTsKKwkJcmVzdWx0W2krK10gPSBjOworCQlyZXN1bHQgPSB4cmVhbGxvYyhyZXN1bHQsIGkrMSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBleGFtaW5lX2ZpbGUodm9pZCkKK3sKKwljaGFyICpuZXdfZm5hbWU7CisKKwlwcmludF9zdGF0dXNsaW5lKCJFeGFtaW5lOiAiKTsKKwluZXdfZm5hbWUgPSBsZXNzX2dldHMoc2l6ZW9mKCJFeGFtaW5lOiAiKSAtIDEpOworCWlmICghbmV3X2ZuYW1lWzBdKSB7CisJCXN0YXR1c19wcmludCgpOworIGVycjoKKwkJZnJlZShuZXdfZm5hbWUpOworCQlyZXR1cm47CisJfQorCWlmIChhY2Nlc3MobmV3X2ZuYW1lLCBSX09LKSAhPSAwKSB7CisJCXByaW50X3N0YXR1c2xpbmUoIkNhbm5vdCByZWFkIHRoaXMgZmlsZSIpOworCQlnb3RvIGVycjsKKwl9CisJZnJlZShmaWxlbmFtZSk7CisJZmlsZW5hbWUgPSBuZXdfZm5hbWU7CisJLyogZmlsZXMgc3RhcnQgYnkgPSBhcmd2LiB3aHkgd2UgYXNzdW1lIHRoYXQgYXJndiBpcyBpbmZpbml0ZWx5IGxvbmc/PworCWZpbGVzW251bV9maWxlc10gPSBmaWxlbmFtZTsKKwljdXJyZW50X2ZpbGUgPSBudW1fZmlsZXMgKyAxOworCW51bV9maWxlcysrOyAqLworCWZpbGVzWzBdID0gZmlsZW5hbWU7CisJbnVtX2ZpbGVzID0gY3VycmVudF9maWxlID0gMTsKKwlyZWluaXRpYWxpemUoKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBjaGFuZ2VzIHRoZSBmaWxlIGN1cnJlbnRseSBiZWluZyBwYWdlZC4gZGlyZWN0aW9uIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKyAqIC0xOiBnbyBiYWNrIG9uZSBmaWxlCisgKiAgMDogZ28gdG8gdGhlIGZpcnN0IGZpbGUKKyAqICAxOiBnbyBmb3J3YXJkIG9uZSBmaWxlICovCitzdGF0aWMgdm9pZCBjaGFuZ2VfZmlsZShpbnQgZGlyZWN0aW9uKQoreworCWlmIChjdXJyZW50X2ZpbGUgIT0gKChkaXJlY3Rpb24gPiAwKSA/IG51bV9maWxlcyA6IDEpKSB7CisJCWN1cnJlbnRfZmlsZSA9IGRpcmVjdGlvbiA/IGN1cnJlbnRfZmlsZSArIGRpcmVjdGlvbiA6IDE7CisJCWZyZWUoZmlsZW5hbWUpOworCQlmaWxlbmFtZSA9IHhzdHJkdXAoZmlsZXNbY3VycmVudF9maWxlIC0gMV0pOworCQlyZWluaXRpYWxpemUoKTsKKwl9IGVsc2UgeworCQlwcmludF9zdGF0dXNsaW5lKGRpcmVjdGlvbiA+IDAgPyAiTm8gbmV4dCBmaWxlIiA6ICJObyBwcmV2aW91cyBmaWxlIik7CisJfQorfQorCitzdGF0aWMgdm9pZCByZW1vdmVfY3VycmVudF9maWxlKHZvaWQpCit7CisJdW5zaWduZWQgaTsKKworCWlmIChudW1fZmlsZXMgPCAyKQorCQlyZXR1cm47CisKKwlpZiAoY3VycmVudF9maWxlICE9IDEpIHsKKwkJY2hhbmdlX2ZpbGUoLTEpOworCQlmb3IgKGkgPSAzOyBpIDw9IG51bV9maWxlczsgaSsrKQorCQkJZmlsZXNbaSAtIDJdID0gZmlsZXNbaSAtIDFdOworCQludW1fZmlsZXMtLTsKKwl9IGVsc2UgeworCQljaGFuZ2VfZmlsZSgxKTsKKwkJZm9yIChpID0gMjsgaSA8PSBudW1fZmlsZXM7IGkrKykKKwkJCWZpbGVzW2kgLSAyXSA9IGZpbGVzW2kgLSAxXTsKKwkJbnVtX2ZpbGVzLS07CisJCWN1cnJlbnRfZmlsZS0tOworCX0KK30KKworc3RhdGljIHZvaWQgY29sb25fcHJvY2Vzcyh2b2lkKQoreworCWludCBrZXlwcmVzczsKKworCS8qIENsZWFyIHRoZSBjdXJyZW50IGxpbmUgYW5kIHByaW50IGEgcHJvbXB0ICovCisJcHJpbnRfc3RhdHVzbGluZSgiIDoiKTsKKworCWtleXByZXNzID0gbGVzc19nZXRjaCgyKTsKKwlzd2l0Y2ggKGtleXByZXNzKSB7CisJY2FzZSAnZCc6CisJCXJlbW92ZV9jdXJyZW50X2ZpbGUoKTsKKwkJYnJlYWs7CisJY2FzZSAnZSc6CisJCWV4YW1pbmVfZmlsZSgpOworCQlicmVhazsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX0ZMQUdTCisJY2FzZSAnZic6CisJCW1fc3RhdHVzX3ByaW50KCk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSAnbic6CisJCWNoYW5nZV9maWxlKDEpOworCQlicmVhazsKKwljYXNlICdwJzoKKwkJY2hhbmdlX2ZpbGUoLTEpOworCQlicmVhazsKKwljYXNlICdxJzoKKwkJbGVzc19leGl0KEVYSVRfU1VDQ0VTUyk7CisJCWJyZWFrOworCWNhc2UgJ3gnOgorCQljaGFuZ2VfZmlsZSgwKTsKKwkJYnJlYWs7CisJfQorfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19SRUdFWFAKK3N0YXRpYyB2b2lkIG5vcm1hbGl6ZV9tYXRjaF9wb3MoaW50IG1hdGNoKQoreworCWlmIChtYXRjaCA+PSBudW1fbWF0Y2hlcykKKwkJbWF0Y2ggPSBudW1fbWF0Y2hlcyAtIDE7CisJaWYgKG1hdGNoIDwgMCkKKwkJbWF0Y2ggPSAwOworCW1hdGNoX3BvcyA9IG1hdGNoOworfQorCitzdGF0aWMgdm9pZCBnb3RvX21hdGNoKGludCBtYXRjaCkKK3sKKwlpZiAoIXBhdHRlcm5fdmFsaWQpCisJCXJldHVybjsKKwlpZiAobWF0Y2ggPCAwKQorCQltYXRjaCA9IDA7CisJLyogVHJ5IHRvIGZpbmQgbmV4dCBtYXRjaCBpZiBlb2YgaXNuJ3QgcmVhY2hlZCB5ZXQgKi8KKwlpZiAobWF0Y2ggPj0gbnVtX21hdGNoZXMgJiYgZW9mX2Vycm9yID4gMCkgeworCQl3YW50ZWRfbWF0Y2ggPSBtYXRjaDsgLyogIkkgd2FudCB0byByZWFkIHVudGlsIEkgc2VlIE4ndGggbWF0Y2giICovCisJCXJlYWRfbGluZXMoKTsKKwl9CisJaWYgKG51bV9tYXRjaGVzKSB7CisJCW5vcm1hbGl6ZV9tYXRjaF9wb3MobWF0Y2gpOworCQlidWZmZXJfbGluZShtYXRjaF9saW5lc1ttYXRjaF9wb3NdKTsKKwl9IGVsc2UgeworCQlwcmludF9zdGF0dXNsaW5lKCJObyBtYXRjaGVzIGZvdW5kIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBmaWxsX21hdGNoX2xpbmVzKHVuc2lnbmVkIHBvcykKK3sKKwlpZiAoIXBhdHRlcm5fdmFsaWQpCisJCXJldHVybjsKKwkvKiBSdW4gdGhlIHJlZ2V4IG9uIGVhY2ggbGluZSBvZiB0aGUgY3VycmVudCBmaWxlICovCisJd2hpbGUgKHBvcyA8PSBtYXhfZmxpbmUpIHsKKwkJLyogSWYgdGhpcyBsaW5lIG1hdGNoZXMgKi8KKwkJaWYgKHJlZ2V4ZWMoJnBhdHRlcm4sIGZsaW5lc1twb3NdLCAwLCBOVUxMLCAwKSA9PSAwCisJCS8qIGFuZCB3ZSBkaWRuJ3QgbWF0Y2ggaXQgbGFzdCB0aW1lICovCisJCSAmJiAhKG51bV9tYXRjaGVzICYmIG1hdGNoX2xpbmVzW251bV9tYXRjaGVzLTFdID09IHBvcykKKwkJKSB7CisJCQltYXRjaF9saW5lcyA9IHhyZWFsbG9jX3ZlY3RvcihtYXRjaF9saW5lcywgNCwgbnVtX21hdGNoZXMpOworCQkJbWF0Y2hfbGluZXNbbnVtX21hdGNoZXMrK10gPSBwb3M7CisJCX0KKwkJcG9zKys7CisJfQorfQorCitzdGF0aWMgdm9pZCByZWdleF9wcm9jZXNzKHZvaWQpCit7CisJY2hhciAqdW5jb21wX3JlZ2V4LCAqZXJyOworCisJLyogUmVzZXQgdmFyaWFibGVzICovCisJZnJlZShtYXRjaF9saW5lcyk7CisJbWF0Y2hfbGluZXMgPSBOVUxMOworCW1hdGNoX3BvcyA9IDA7CisJbnVtX21hdGNoZXMgPSAwOworCWlmIChwYXR0ZXJuX3ZhbGlkKSB7CisJCXJlZ2ZyZWUoJnBhdHRlcm4pOworCQlwYXR0ZXJuX3ZhbGlkID0gMDsKKwl9CisKKwkvKiBHZXQgdGhlIHVuY29tcGlsZWQgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIHVzZXIgKi8KKwljbGVhcl9saW5lKCk7CisJYmJfcHV0Y2hhcigob3B0aW9uX21hc2szMiAmIExFU1NfU1RBVEVfTUFUQ0hfQkFDS1dBUkRTKSA/ICc/JyA6ICcvJyk7CisJdW5jb21wX3JlZ2V4ID0gbGVzc19nZXRzKDEpOworCWlmICghdW5jb21wX3JlZ2V4WzBdKSB7CisJCWZyZWUodW5jb21wX3JlZ2V4KTsKKwkJYnVmZmVyX3ByaW50KCk7CisJCXJldHVybjsKKwl9CisKKwkvKiBDb21waWxlIHRoZSByZWdleCBhbmQgY2hlY2sgZm9yIGVycm9ycyAqLworCWVyciA9IHJlZ2NvbXBfb3JfZXJybXNnKCZwYXR0ZXJuLCB1bmNvbXBfcmVnZXgsCisJCQkJKG9wdGlvbl9tYXNrMzIgJiBGTEFHX0kpID8gUkVHX0lDQVNFIDogMCk7CisJZnJlZSh1bmNvbXBfcmVnZXgpOworCWlmIChlcnIpIHsKKwkJcHJpbnRfc3RhdHVzbGluZShlcnIpOworCQlmcmVlKGVycik7CisJCXJldHVybjsKKwl9CisKKwlwYXR0ZXJuX3ZhbGlkID0gMTsKKwltYXRjaF9wb3MgPSAwOworCWZpbGxfbWF0Y2hfbGluZXMoMCk7CisJd2hpbGUgKG1hdGNoX3BvcyA8IG51bV9tYXRjaGVzKSB7CisJCWlmICgoaW50KW1hdGNoX2xpbmVzW21hdGNoX3Bvc10gPiBjdXJfZmxpbmUpCisJCQlicmVhazsKKwkJbWF0Y2hfcG9zKys7CisJfQorCWlmIChvcHRpb25fbWFzazMyICYgTEVTU19TVEFURV9NQVRDSF9CQUNLV0FSRFMpCisJCW1hdGNoX3Bvcy0tOworCisJLyogSXQncyBwb3NzaWJsZSB0aGF0IG5vIG1hdGNoZXMgYXJlIGZvdW5kIHlldC4KKwkgKiBnb3RvX21hdGNoKCkgd2lsbCByZWFkIGlucHV0IGxvb2tpbmcgZm9yIG1hdGNoLAorCSAqIGlmIG5lZWRlZCAqLworCWdvdG9fbWF0Y2gobWF0Y2hfcG9zKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBudW1iZXJfcHJvY2VzcyhpbnQgZmlyc3RfZGlnaXQpCit7CisJdW5zaWduZWQgaTsKKwlpbnQgbnVtOworCWludCBrZXlwcmVzczsKKwljaGFyIG51bV9pbnB1dFtzaXplb2YoaW50KSo0XTsgLyogbW9yZSB0aGFuIGVub3VnaCAqLworCisJbnVtX2lucHV0WzBdID0gZmlyc3RfZGlnaXQ7CisKKwkvKiBDbGVhciB0aGUgY3VycmVudCBsaW5lLCBwcmludCBhIHByb21wdCwgYW5kIHRoZW4gcHJpbnQgdGhlIGRpZ2l0ICovCisJY2xlYXJfbGluZSgpOworCXByaW50ZigiOiVjIiwgZmlyc3RfZGlnaXQpOworCisJLyogUmVjZWl2ZSBpbnB1dCB1bnRpbCBhIGxldHRlciBpcyBnaXZlbiAqLworCWkgPSAxOworCXdoaWxlIChpIDwgc2l6ZW9mKG51bV9pbnB1dCktMSkgeworCQlrZXlwcmVzcyA9IGxlc3NfZ2V0Y2goaSArIDEpOworCQlpZiAoKHVuc2lnbmVkKWtleXByZXNzID4gMjU1IHx8ICFpc2RpZ2l0KGtleXByZXNzKSkKKwkJCWJyZWFrOworCQludW1faW5wdXRbaV0gPSBrZXlwcmVzczsKKwkJYmJfcHV0Y2hhcihrZXlwcmVzcyk7CisJCWkrKzsKKwl9CisKKwludW1faW5wdXRbaV0gPSAnXDAnOworCW51bSA9IGJiX3N0cnRvdShudW1faW5wdXQsIE5VTEwsIDEwKTsKKwkvKiBvbiBmb3JtYXQgZXJyb3IsIG51bSA9PSAtMSAqLworCWlmIChudW0gPCAxIHx8IG51bSA+IE1BWExJTkVTKSB7CisJCWJ1ZmZlcl9wcmludCgpOworCQlyZXR1cm47CisJfQorCisJLyogV2Ugbm93IGtub3cgdGhlIG51bWJlciBhbmQgdGhlIGxldHRlciBlbnRlcmVkLCBzbyB3ZSBwcm9jZXNzIHRoZW0gKi8KKwlzd2l0Y2ggKGtleXByZXNzKSB7CisJY2FzZSBLRVlDT0RFX0RPV046IGNhc2UgJ3onOiBjYXNlICdkJzogY2FzZSAnZSc6IGNhc2UgJyAnOiBjYXNlICdcMDE1JzoKKwkJYnVmZmVyX2Rvd24obnVtKTsKKwkJYnJlYWs7CisJY2FzZSBLRVlDT0RFX1VQOiBjYXNlICdiJzogY2FzZSAndyc6IGNhc2UgJ3knOiBjYXNlICd1JzoKKwkJYnVmZmVyX3VwKG51bSk7CisJCWJyZWFrOworCWNhc2UgJ2cnOiBjYXNlICc8JzogY2FzZSAnRyc6IGNhc2UgJz4nOgorCQlidWZmZXJfbGluZW5vKG51bSAtIDEpOworCQlicmVhazsKKwljYXNlICdwJzogY2FzZSAnJSc6CisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19GTEFHUworCQl1cGRhdGVfbnVtX2xpbmVzKCk7CisJCW51bSA9IG51bSAqIChudW1fbGluZXMgPiAwID8gbnVtX2xpbmVzIDogbWF4X2xpbmVubykgLyAxMDA7CisjZWxzZQorCQludW0gPSBudW0gKiBtYXhfbGluZW5vIC8gMTAwOworI2VuZGlmCisJCWJ1ZmZlcl9saW5lbm8obnVtKTsKKwkJYnJlYWs7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19SRUdFWFAKKwljYXNlICduJzoKKwkJZ290b19tYXRjaChtYXRjaF9wb3MgKyBudW0pOworCQlicmVhazsKKwljYXNlICcvJzoKKwkJb3B0aW9uX21hc2szMiAmPSB+TEVTU19TVEFURV9NQVRDSF9CQUNLV0FSRFM7CisJCXJlZ2V4X3Byb2Nlc3MoKTsKKwkJYnJlYWs7CisJY2FzZSAnPyc6CisJCW9wdGlvbl9tYXNrMzIgfD0gTEVTU19TVEFURV9NQVRDSF9CQUNLV0FSRFM7CisJCXJlZ2V4X3Byb2Nlc3MoKTsKKwkJYnJlYWs7CisjZW5kaWYKKwl9Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX0RBU0hDTUQKK3N0YXRpYyB2b2lkIGZsYWdfY2hhbmdlKHZvaWQpCit7CisJaW50IGtleXByZXNzOworCisJY2xlYXJfbGluZSgpOworCWJiX3B1dGNoYXIoJy0nKTsKKwlrZXlwcmVzcyA9IGxlc3NfZ2V0Y2goMSk7CisKKwlzd2l0Y2ggKGtleXByZXNzKSB7CisJY2FzZSAnTSc6CisJCW9wdGlvbl9tYXNrMzIgXj0gRkxBR19NOworCQlicmVhazsKKwljYXNlICdtJzoKKwkJb3B0aW9uX21hc2szMiBePSBGTEFHX207CisJCWJyZWFrOworCWNhc2UgJ0UnOgorCQlvcHRpb25fbWFzazMyIF49IEZMQUdfRTsKKwkJYnJlYWs7CisJY2FzZSAnfic6CisJCW9wdGlvbl9tYXNrMzIgXj0gRkxBR19USUxERTsKKwkJYnJlYWs7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19UUlVOQ0FURQorCWNhc2UgJ1MnOgorCQlvcHRpb25fbWFzazMyIF49IEZMQUdfUzsKKwkJYnVmZmVyX2ZpbGxfYW5kX3ByaW50KCk7CisJCWJyZWFrOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19MSU5FTlVNUworCWNhc2UgJ04nOgorCQlvcHRpb25fbWFzazMyIF49IEZMQUdfTjsKKwkJcmVfd3JhcCgpOworCQlidWZmZXJfZmlsbF9hbmRfcHJpbnQoKTsKKwkJYnJlYWs7CisjZW5kaWYKKwl9Cit9CisKKyNpZmRlZiBCTE9BVAorc3RhdGljIHZvaWQgc2hvd19mbGFnX3N0YXR1cyh2b2lkKQoreworCWludCBrZXlwcmVzczsKKwlpbnQgZmxhZ192YWw7CisKKwljbGVhcl9saW5lKCk7CisJYmJfcHV0Y2hhcignXycpOworCWtleXByZXNzID0gbGVzc19nZXRjaCgxKTsKKworCXN3aXRjaCAoa2V5cHJlc3MpIHsKKwljYXNlICdNJzoKKwkJZmxhZ192YWwgPSBvcHRpb25fbWFzazMyICYgRkxBR19NOworCQlicmVhazsKKwljYXNlICdtJzoKKwkJZmxhZ192YWwgPSBvcHRpb25fbWFzazMyICYgRkxBR19tOworCQlicmVhazsKKwljYXNlICd+JzoKKwkJZmxhZ192YWwgPSBvcHRpb25fbWFzazMyICYgRkxBR19USUxERTsKKwkJYnJlYWs7CisJY2FzZSAnTic6CisJCWZsYWdfdmFsID0gb3B0aW9uX21hc2szMiAmIEZMQUdfTjsKKwkJYnJlYWs7CisJY2FzZSAnRSc6CisJCWZsYWdfdmFsID0gb3B0aW9uX21hc2szMiAmIEZMQUdfRTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZmxhZ192YWwgPSAwOworCQlicmVhazsKKwl9CisKKwljbGVhcl9saW5lKCk7CisJcHJpbnRmKEhJR0hMSUdIVCJUaGUgc3RhdHVzIG9mIHRoZSBmbGFnIGlzOiAldSJOT1JNQUwsIGZsYWdfdmFsICE9IDApOworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBFTkFCTEVfRkVBVFVSRV9MRVNTX0RBU0hDTUQgKi8KKworc3RhdGljIHZvaWQgc2F2ZV9pbnB1dF90b19maWxlKHZvaWQpCit7CisJY29uc3QgY2hhciAqbXNnID0gIiI7CisJY2hhciAqY3VycmVudF9saW5lOworCXVuc2lnbmVkIGk7CisJRklMRSAqZnA7CisKKwlwcmludF9zdGF0dXNsaW5lKCJMb2cgZmlsZTogIik7CisJY3VycmVudF9saW5lID0gbGVzc19nZXRzKHNpemVvZigiTG9nIGZpbGU6ICIpLTEpOworCWlmIChjdXJyZW50X2xpbmVbMF0pIHsKKwkJZnAgPSBmb3Blbl9mb3Jfd3JpdGUoY3VycmVudF9saW5lKTsKKwkJaWYgKCFmcCkgeworCQkJbXNnID0gIkVycm9yIG9wZW5pbmcgbG9nIGZpbGUiOworCQkJZ290byByZXQ7CisJCX0KKwkJZm9yIChpID0gMDsgaSA8PSBtYXhfZmxpbmU7IGkrKykKKwkJCWZwcmludGYoZnAsICIlc1xuIiwgZmxpbmVzW2ldKTsKKwkJZmNsb3NlKGZwKTsKKwkJbXNnID0gIkRvbmUiOworCX0KKyByZXQ6CisJcHJpbnRfc3RhdHVzbGluZShtc2cpOworCWZyZWUoY3VycmVudF9saW5lKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfTUFSS1MKK3N0YXRpYyB2b2lkIGFkZF9tYXJrKHZvaWQpCit7CisJaW50IGxldHRlcjsKKworCXByaW50X3N0YXR1c2xpbmUoIk1hcms6ICIpOworCWxldHRlciA9IGxlc3NfZ2V0Y2goc2l6ZW9mKCJNYXJrOiAiKSAtIDEpOworCisJaWYgKGlzYWxwaGEobGV0dGVyKSkgeworCQkvKiBJZiB3ZSBleGNlZWQgMTUgbWFya3MsIHN0YXJ0IG92ZXJ3cml0aW5nIHByZXZpb3VzIG9uZXMgKi8KKwkJaWYgKG51bV9tYXJrcyA9PSAxNCkKKwkJCW51bV9tYXJrcyA9IDA7CisKKwkJbWFya19saW5lc1tudW1fbWFya3NdWzBdID0gbGV0dGVyOworCQltYXJrX2xpbmVzW251bV9tYXJrc11bMV0gPSBjdXJfZmxpbmU7CisJCW51bV9tYXJrcysrOworCX0gZWxzZSB7CisJCXByaW50X3N0YXR1c2xpbmUoIkludmFsaWQgbWFyayBsZXR0ZXIiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGdvdG9fbWFyayh2b2lkKQoreworCWludCBsZXR0ZXI7CisJaW50IGk7CisKKwlwcmludF9zdGF0dXNsaW5lKCJHbyB0byBtYXJrOiAiKTsKKwlsZXR0ZXIgPSBsZXNzX2dldGNoKHNpemVvZigiR28gdG8gbWFyazogIikgLSAxKTsKKwljbGVhcl9saW5lKCk7CisKKwlpZiAoaXNhbHBoYShsZXR0ZXIpKSB7CisJCWZvciAoaSA9IDA7IGkgPD0gbnVtX21hcmtzOyBpKyspCisJCQlpZiAobGV0dGVyID09IG1hcmtfbGluZXNbaV1bMF0pIHsKKwkJCQlidWZmZXJfbGluZShtYXJrX2xpbmVzW2ldWzFdKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJaWYgKG51bV9tYXJrcyA9PSAxNCAmJiBsZXR0ZXIgIT0gbWFya19saW5lc1sxNF1bMF0pCisJCQlwcmludF9zdGF0dXNsaW5lKCJNYXJrIG5vdCBzZXQiKTsKKwl9IGVsc2UKKwkJcHJpbnRfc3RhdHVzbGluZSgiSW52YWxpZCBtYXJrIGxldHRlciIpOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX0JSQUNLRVRTCitzdGF0aWMgY2hhciBvcHBfYnJhY2tldChjaGFyIGJyYWNrZXQpCit7CisJc3dpdGNoIChicmFja2V0KSB7CisJCWNhc2UgJ3snOiBjYXNlICdbJzogLyogJ30nID09ICd7JyArIDIuIFNhbWUgZm9yICdbJyAqLworCQkJYnJhY2tldCsrOworCQljYXNlICcoJzogICAgICAgICAgIC8qICcpJyA9PSAnKCcgKyAxICovCisJCQlicmFja2V0Kys7CisJCQlicmVhazsKKwkJY2FzZSAnfSc6IGNhc2UgJ10nOgorCQkJYnJhY2tldC0tOworCQljYXNlICcpJzoKKwkJCWJyYWNrZXQtLTsKKwkJCWJyZWFrOworCX07CisJcmV0dXJuIGJyYWNrZXQ7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoX3JpZ2h0X2JyYWNrZXQoY2hhciBicmFja2V0KQoreworCXVuc2lnbmVkIGk7CisKKwlpZiAoc3RyY2hyKGZsaW5lc1tjdXJfZmxpbmVdLCBicmFja2V0KSA9PSBOVUxMKSB7CisJCXByaW50X3N0YXR1c2xpbmUoIk5vIGJyYWNrZXQgaW4gdG9wIGxpbmUiKTsKKwkJcmV0dXJuOworCX0KKwlicmFja2V0ID0gb3BwX2JyYWNrZXQoYnJhY2tldCk7CisJZm9yIChpID0gY3VyX2ZsaW5lICsgMTsgaSA8IG1heF9mbGluZTsgaSsrKSB7CisJCWlmIChzdHJjaHIoZmxpbmVzW2ldLCBicmFja2V0KSAhPSBOVUxMKSB7CisJCQlidWZmZXJfbGluZShpKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlwcmludF9zdGF0dXNsaW5lKCJObyBtYXRjaGluZyBicmFja2V0IGZvdW5kIik7Cit9CisKK3N0YXRpYyB2b2lkIG1hdGNoX2xlZnRfYnJhY2tldChjaGFyIGJyYWNrZXQpCit7CisJaW50IGk7CisKKwlpZiAoc3RyY2hyKGZsaW5lc1tjdXJfZmxpbmUgKyBtYXhfZGlzcGxheWVkX2xpbmVdLCBicmFja2V0KSA9PSBOVUxMKSB7CisJCXByaW50X3N0YXR1c2xpbmUoIk5vIGJyYWNrZXQgaW4gYm90dG9tIGxpbmUiKTsKKwkJcmV0dXJuOworCX0KKworCWJyYWNrZXQgPSBvcHBfYnJhY2tldChicmFja2V0KTsKKwlmb3IgKGkgPSBjdXJfZmxpbmUgKyBtYXhfZGlzcGxheWVkX2xpbmU7IGkgPj0gMDsgaS0tKSB7CisJCWlmIChzdHJjaHIoZmxpbmVzW2ldLCBicmFja2V0KSAhPSBOVUxMKSB7CisJCQlidWZmZXJfbGluZShpKTsKKwkJCXJldHVybjsKKwkJfQorCX0KKwlwcmludF9zdGF0dXNsaW5lKCJObyBtYXRjaGluZyBicmFja2V0IGZvdW5kIik7Cit9CisjZW5kaWYgIC8qIEZFQVRVUkVfTEVTU19CUkFDS0VUUyAqLworCitzdGF0aWMgdm9pZCBrZXlwcmVzc19wcm9jZXNzKGludCBrZXlwcmVzcykKK3sKKwlzd2l0Y2ggKGtleXByZXNzKSB7CisJY2FzZSBLRVlDT0RFX0RPV046IGNhc2UgJ2UnOiBjYXNlICdqJzogY2FzZSAweDBkOgorCQlidWZmZXJfZG93bigxKTsKKwkJYnJlYWs7CisJY2FzZSBLRVlDT0RFX1VQOiBjYXNlICd5JzogY2FzZSAnayc6CisJCWJ1ZmZlcl91cCgxKTsKKwkJYnJlYWs7CisJY2FzZSBLRVlDT0RFX1BBR0VET1dOOiBjYXNlICcgJzogY2FzZSAneic6IGNhc2UgJ2YnOgorCQlidWZmZXJfZG93bihtYXhfZGlzcGxheWVkX2xpbmUgKyAxKTsKKwkJYnJlYWs7CisJY2FzZSBLRVlDT0RFX1BBR0VVUDogY2FzZSAndyc6IGNhc2UgJ2InOgorCQlidWZmZXJfdXAobWF4X2Rpc3BsYXllZF9saW5lICsgMSk7CisJCWJyZWFrOworCWNhc2UgJ2QnOgorCQlidWZmZXJfZG93bigobWF4X2Rpc3BsYXllZF9saW5lICsgMSkgLyAyKTsKKwkJYnJlYWs7CisJY2FzZSAndSc6CisJCWJ1ZmZlcl91cCgobWF4X2Rpc3BsYXllZF9saW5lICsgMSkgLyAyKTsKKwkJYnJlYWs7CisJY2FzZSBLRVlDT0RFX0hPTUU6IGNhc2UgJ2cnOiBjYXNlICdwJzogY2FzZSAnPCc6IGNhc2UgJyUnOgorCQlidWZmZXJfbGluZSgwKTsKKwkJYnJlYWs7CisJY2FzZSBLRVlDT0RFX0VORDogY2FzZSAnRyc6IGNhc2UgJz4nOgorCQljdXJfZmxpbmUgPSBNQVhMSU5FUzsKKwkJcmVhZF9saW5lcygpOworCQlidWZmZXJfbGluZShjdXJfZmxpbmUpOworCQlicmVhazsKKwljYXNlICdxJzogY2FzZSAnUSc6CisJCWxlc3NfZXhpdChFWElUX1NVQ0NFU1MpOworCQlicmVhazsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX01BUktTCisJY2FzZSAnbSc6CisJCWFkZF9tYXJrKCk7CisJCWJ1ZmZlcl9wcmludCgpOworCQlicmVhazsKKwljYXNlICdcJyc6CisJCWdvdG9fbWFyaygpOworCQlidWZmZXJfcHJpbnQoKTsKKwkJYnJlYWs7CisjZW5kaWYKKwljYXNlICdyJzogY2FzZSAnUic6CisJCS8qIFRPRE86ICgxKSBhbHNvIGJpbmQgXlIsIF5MIHRvIHRoaXM/CisJCSAqICgyKSByZS1tZWFzdXJlIHdpbmRvdyBzaXplPworCQkgKi8KKwkJYnVmZmVyX3ByaW50KCk7CisJCWJyZWFrOworCS8qY2FzZSAnUic6CisJCWZ1bGxfcmVwYWludCgpOworCQlicmVhazsqLworCWNhc2UgJ3MnOgorCQlzYXZlX2lucHV0X3RvX2ZpbGUoKTsKKwkJYnJlYWs7CisJY2FzZSAnRSc6CisJCWV4YW1pbmVfZmlsZSgpOworCQlicmVhazsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX0ZMQUdTCisJY2FzZSAnPSc6CisJCW1fc3RhdHVzX3ByaW50KCk7CisJCWJyZWFrOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19SRUdFWFAKKwljYXNlICcvJzoKKwkJb3B0aW9uX21hc2szMiAmPSB+TEVTU19TVEFURV9NQVRDSF9CQUNLV0FSRFM7CisJCXJlZ2V4X3Byb2Nlc3MoKTsKKwkJYnJlYWs7CisJY2FzZSAnbic6CisJCWdvdG9fbWF0Y2gobWF0Y2hfcG9zICsgMSk7CisJCWJyZWFrOworCWNhc2UgJ04nOgorCQlnb3RvX21hdGNoKG1hdGNoX3BvcyAtIDEpOworCQlicmVhazsKKwljYXNlICc/JzoKKwkJb3B0aW9uX21hc2szMiB8PSBMRVNTX1NUQVRFX01BVENIX0JBQ0tXQVJEUzsKKwkJcmVnZXhfcHJvY2VzcygpOworCQlicmVhazsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfREFTSENNRAorCWNhc2UgJy0nOgorCQlmbGFnX2NoYW5nZSgpOworCQlidWZmZXJfcHJpbnQoKTsKKwkJYnJlYWs7CisjaWZkZWYgQkxPQVQKKwljYXNlICdfJzoKKwkJc2hvd19mbGFnX3N0YXR1cygpOworCQlicmVhazsKKyNlbmRpZgorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfTEVTU19CUkFDS0VUUworCWNhc2UgJ3snOiBjYXNlICcoJzogY2FzZSAnWyc6CisJCW1hdGNoX3JpZ2h0X2JyYWNrZXQoa2V5cHJlc3MpOworCQlicmVhazsKKwljYXNlICd9JzogY2FzZSAnKSc6IGNhc2UgJ10nOgorCQltYXRjaF9sZWZ0X2JyYWNrZXQoa2V5cHJlc3MpOworCQlicmVhazsKKyNlbmRpZgorCWNhc2UgJzonOgorCQljb2xvbl9wcm9jZXNzKCk7CisJCWJyZWFrOworCX0KKworCWlmIChpc2RpZ2l0KGtleXByZXNzKSkKKwkJbnVtYmVyX3Byb2Nlc3Moa2V5cHJlc3MpOworfQorCitzdGF0aWMgdm9pZCBzaWdfY2F0Y2hlcihpbnQgc2lnKQoreworCWxlc3NfZXhpdCgtIHNpZyk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9MRVNTX1dJTkNICitzdGF0aWMgdm9pZCBzaWd3aW5jaF9oYW5kbGVyKGludCBzaWcgVU5VU0VEX1BBUkFNKQoreworCXdpbmNoX2NvdW50ZXIrKzsKK30KKyNlbmRpZgorCitpbnQgbGVzc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbGVzc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICp0dHlfbmFtZTsKKwlpbnQgdHR5X2ZkOworCisJSU5JVF9HKCk7CisKKwkvKiBUT0RPOiAteDogZG8gbm90IGludGVycHJldCBiYWNrc3BhY2UsIC14eDogdGFiIGFsc28KKwkgKiAteHh4OiBuZXdsaW5lIGFsc28KKwkgKiAtdyBOOiBhc3N1bWUgd2lkdGggTiAoLXh4eCAtdyAzMjogaGV4IHZpZXdlciBvZiBzb3J0cykKKwkgKiAtczogY29uZGVuc2UgbWFueSBlbXB0eSBsaW5lcyB0byBvbmUKKwkgKiAgICAgKHVzZWQgYnkgc29tZSBzZXR1cHMgZm9yIG1hbnBhZ2UgZGlzcGxheSkKKwkgKi8KKwlnZXRvcHQzMihhcmd2LCAiRU1tTn5JIiBJRl9GRUFUVVJFX0xFU1NfVFJVTkNBVEUoIlMiKSAvKmlnbm9yZWQ6Ki8icyIpOworCWFyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCW51bV9maWxlcyA9IGFyZ2M7CisJZmlsZXMgPSBhcmd2OworCisJLyogQW5vdGhlciBwb3B1bGFyIHBhZ2VyLCBtb3N0LCBkZXRlY3RzIHdoZW4gc3Rkb3V0CisJICogaXMgbm90IGEgdHR5IGFuZCB0dXJucyBpbnRvIGNhdC4gVGhpcyBtYWtlcyBzZW5zZS4gKi8KKwlpZiAoIWlzYXR0eShTVERPVVRfRklMRU5PKSkKKwkJcmV0dXJuIGJiX2NhdChhcmd2KTsKKworCWlmICghbnVtX2ZpbGVzKSB7CisJCWlmIChpc2F0dHkoU1RESU5fRklMRU5PKSkgeworCQkJLyogSnVzdCAibGVzcyI/IE5vIGFyZ3MgYW5kIG5vIHJlZGlyZWN0aW9uPyAqLworCQkJYmJfZXJyb3JfbXNnKCJtaXNzaW5nIGZpbGVuYW1lIik7CisJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKwl9IGVsc2UgeworCQlmaWxlbmFtZSA9IHhzdHJkdXAoZmlsZXNbMF0pOworCX0KKworCWlmIChvcHRpb25fbWFzazMyICYgRkxBR19USUxERSkKKwkJZW1wdHlfbGluZV9tYXJrZXIgPSAiIjsKKworCS8qIFNvbWUgdmVyc2lvbnMgb2YgbGVzcyBjYW4gc3Vydml2ZSB3L28gY29udHJvbGxpbmcgdHR5LAorCSAqIHRyeSB0byBkbyB0aGUgc2FtZS4gVGhpcyBhbHNvIGFsbG93cyB0byBzcGVjaWZ5IGFuIGFsdGVybmF0aXZlCisJICogdHR5IHZpYSAibGVzcyAxPD5UVFkiLgorCSAqIFdlIGRvbid0IHRyeSB0byB1c2UgU1RET1VUX0ZJTEVOTyBkaXJlY3RseSwKKwkgKiBzaW5jZSB3ZSB3YW50IHRvIHNldCB0aGlzIGZkIHRvIG5vbi1ibG9ja2luZyBtb2RlLAorCSAqIGFuZCBub3QgYm90aGVyIHdpdGggcmVzdG9yaW5nIGl0IG9uIGV4aXQuCisJICovCisJdHR5X25hbWUgPSB4bWFsbG9jX3R0eW5hbWUoU1RET1VUX0ZJTEVOTyk7CisJaWYgKHR0eV9uYW1lKSB7CisJCXR0eV9mZCA9IG9wZW4odHR5X25hbWUsIE9fUkRPTkxZKTsKKwkJZnJlZSh0dHlfbmFtZSk7CisJCWlmICh0dHlfZmQgPCAwKQorCQkJZ290byB0cnlfY3R0eTsKKwl9IGVsc2UgeworCQkvKiBUcnkgY29udHJvbGxpbmcgdHR5ICovCisgdHJ5X2N0dHk6CisJCXR0eV9mZCA9IG9wZW4oQ1VSUkVOVF9UVFksIE9fUkRPTkxZKTsKKwkJaWYgKHR0eV9mZCA8IDApCisJCQlyZXR1cm4gYmJfY2F0KGFyZ3YpOworCX0KKwluZGVsYXlfb24odHR5X2ZkKTsKKwlrYmRfZmQgPSB0dHlfZmQ7IC8qIHNhdmUgaW4gYSBnbG9iYWwgKi8KKworCXRjZ2V0YXR0cihrYmRfZmQsICZ0ZXJtX29yaWcpOworCXRlcm1fbGVzcyA9IHRlcm1fb3JpZzsKKwl0ZXJtX2xlc3MuY19sZmxhZyAmPSB+KElDQU5PTiB8IEVDSE8pOworCXRlcm1fbGVzcy5jX2lmbGFnICY9IH4oSVhPTiB8IElDUk5MKTsKKwkvKnRlcm1fbGVzcy5jX29mbGFnICY9IH5PTkxDUjsqLworCXRlcm1fbGVzcy5jX2NjW1ZNSU5dID0gMTsKKwl0ZXJtX2xlc3MuY19jY1tWVElNRV0gPSAwOworCisJSUZfRkVBVFVSRV9MRVNTX0FTS19URVJNSU5BTChHLndpbnNpemVfZXJyID0pIGdldF90ZXJtaW5hbF93aWR0aF9oZWlnaHQoa2JkX2ZkLCAmd2lkdGgsICZtYXhfZGlzcGxheWVkX2xpbmUpOworCS8qIDIwOiB0d28gdGFic3RvcHMgKyA0ICovCisJaWYgKHdpZHRoIDwgMjAgfHwgbWF4X2Rpc3BsYXllZF9saW5lIDwgMykKKwkJcmV0dXJuIGJiX2NhdChhcmd2KTsKKwltYXhfZGlzcGxheWVkX2xpbmUgLT0gMjsKKworCS8qIFdlIHdhbnQgdG8gcmVzdG9yZSB0ZXJtX29yaWcgb24gZXhpdCAqLworCWJiX3NpZ25hbHMoQkJfRkFUQUxfU0lHUywgc2lnX2NhdGNoZXIpOworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfV0lOQ0gKKwlzaWduYWwoU0lHV0lOQ0gsIHNpZ3dpbmNoX2hhbmRsZXIpOworI2VuZGlmCisKKwlidWZmZXIgPSB4bWFsbG9jKChtYXhfZGlzcGxheWVkX2xpbmUrMSkgKiBzaXplb2YoY2hhciAqKSk7CisJcmVpbml0aWFsaXplKCk7CisJd2hpbGUgKDEpIHsKKwkJaW50NjRfdCBrZXlwcmVzczsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0xFU1NfV0lOQ0gKKwkJd2hpbGUgKFdJTkNIX0NPVU5URVIpIHsKKyBhZ2FpbjoKKwkJCXdpbmNoX2NvdW50ZXItLTsKKwkJCUlGX0ZFQVRVUkVfTEVTU19BU0tfVEVSTUlOQUwoRy53aW5zaXplX2VyciA9KSBnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KGtiZF9mZCwgJndpZHRoLCAmbWF4X2Rpc3BsYXllZF9saW5lKTsKKyBJRl9GRUFUVVJFX0xFU1NfQVNLX1RFUk1JTkFMKGdvdF9zaXplOikKKwkJCS8qIDIwOiB0d28gdGFic3RvcHMgKyA0ICovCisJCQlpZiAod2lkdGggPCAyMCkKKwkJCQl3aWR0aCA9IDIwOworCQkJaWYgKG1heF9kaXNwbGF5ZWRfbGluZSA8IDMpCisJCQkJbWF4X2Rpc3BsYXllZF9saW5lID0gMzsKKwkJCW1heF9kaXNwbGF5ZWRfbGluZSAtPSAyOworCQkJZnJlZShidWZmZXIpOworCQkJYnVmZmVyID0geG1hbGxvYygobWF4X2Rpc3BsYXllZF9saW5lKzEpICogc2l6ZW9mKGNoYXIgKikpOworCQkJLyogQXZvaWQgcmUtd3JhcCBhbmQvb3IgcmVkcmF3IGlmIHdlIGFscmVhZHkga25vdworCQkJICogd2UgbmVlZCB0byBkbyBpdCBhZ2Fpbi4gVGhlc2Ugb3BzIGFyZSBleHBlbnNpdmUgKi8KKwkJCWlmIChXSU5DSF9DT1VOVEVSKQorCQkJCWdvdG8gYWdhaW47CisJCQlyZV93cmFwKCk7CisJCQlpZiAoV0lOQ0hfQ09VTlRFUikKKwkJCQlnb3RvIGFnYWluOworCQkJYnVmZmVyX2ZpbGxfYW5kX3ByaW50KCk7CisJCQkvKiBUaGlzIHRvb2sgc29tZSB0aW1lLiBMb29wIGJhY2sgYW5kIGNoZWNrLAorCQkJICogd2VyZSB0aGVyZSBhbm90aGVyIFNJR1dJTkNIPyAqLworCQl9CisJCWtleXByZXNzID0gbGVzc19nZXRjaCgtMSk7IC8qIC0xOiBkbyBub3QgcG9zaXRpb24gY3Vyc29yICovCisjIGlmIEVOQUJMRV9GRUFUVVJFX0xFU1NfQVNLX1RFUk1JTkFMCisJCWlmICgoaW50MzJfdClrZXlwcmVzcyA9PSBLRVlDT0RFX0NVUlNPUl9QT1MpIHsKKwkJCXVpbnQzMl90IHJjID0gKGtleXByZXNzID4+IDMyKTsKKwkJCXdpZHRoID0gKHJjICYgMHg3ZmZmKTsKKwkJCW1heF9kaXNwbGF5ZWRfbGluZSA9ICgocmMgPj4gMTYpICYgMHg3ZmZmKTsKKwkJCWdvdG8gZ290X3NpemU7CisJCX0KKyMgZW5kaWYKKyNlbHNlCisJCWtleXByZXNzID0gbGVzc19nZXRjaCgtMSk7IC8qIC0xOiBkbyBub3QgcG9zaXRpb24gY3Vyc29yICovCisjZW5kaWYKKwkJa2V5cHJlc3NfcHJvY2VzcyhrZXlwcmVzcyk7CisJfQorfQorCisvKgorSGVscCB0ZXh0IG9mIGxlc3MgdmVyc2lvbiA0MTggaXMgYmVsb3cuCitJZiB5b3UgYXJlIGltcGxlbWVudGluZyBzb21ldGhpbmcsIGtlZXBpbmcKK2tleSBhbmQvb3IgY29tbWFuZCBsaW5lIHN3aXRjaCBjb21wYXRpYmlsaXR5IGlzIGEgZ29vZCBpZGVhOgorCisKKyAgICAgICAgICAgICAgICAgICBTVU1NQVJZIE9GIExFU1MgQ09NTUFORFMKKworICAgICAgQ29tbWFuZHMgbWFya2VkIHdpdGggKiBtYXkgYmUgcHJlY2VkZWQgYnkgYSBudW1iZXIsIE4uCisgICAgICBOb3RlcyBpbiBwYXJlbnRoZXNlcyBpbmRpY2F0ZSB0aGUgYmVoYXZpb3IgaWYgTiBpcyBnaXZlbi4KKyAgaCAgSCAgICAgICAgICAgICAgICAgRGlzcGxheSB0aGlzIGhlbHAuCisgIHEgIDpxICBRICA6USAgWlogICAgIEV4aXQuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNT1ZJTkcKKyAgZSAgXkUgIGogIF5OICBDUiAgKiAgRm9yd2FyZCAgb25lIGxpbmUgICAob3IgTiBsaW5lcykuCisgIHkgIF5ZICBrICBeSyAgXlAgICogIEJhY2t3YXJkIG9uZSBsaW5lICAgKG9yIE4gbGluZXMpLgorICBmICBeRiAgXlYgIFNQQUNFICAqICBGb3J3YXJkICBvbmUgd2luZG93IChvciBOIGxpbmVzKS4KKyAgYiAgXkIgIEVTQy12ICAgICAgKiAgQmFja3dhcmQgb25lIHdpbmRvdyAob3IgTiBsaW5lcykuCisgIHogICAgICAgICAgICAgICAgICogIEZvcndhcmQgIG9uZSB3aW5kb3cgKGFuZCBzZXQgd2luZG93IHRvIE4pLgorICB3ICAgICAgICAgICAgICAgICAqICBCYWNrd2FyZCBvbmUgd2luZG93IChhbmQgc2V0IHdpbmRvdyB0byBOKS4KKyAgRVNDLVNQQUNFICAgICAgICAgKiAgRm9yd2FyZCAgb25lIHdpbmRvdywgYnV0IGRvbid0IHN0b3AgYXQgZW5kLW9mLWZpbGUuCisgIGQgIF5EICAgICAgICAgICAgICogIEZvcndhcmQgIG9uZSBoYWxmLXdpbmRvdyAoYW5kIHNldCBoYWxmLXdpbmRvdyB0byBOKS4KKyAgdSAgXlUgICAgICAgICAgICAgKiAgQmFja3dhcmQgb25lIGhhbGYtd2luZG93IChhbmQgc2V0IGhhbGYtd2luZG93IHRvIE4pLgorICBFU0MtKSAgUmlnaHRBcnJvdyAqICBMZWZ0ICBvbmUgaGFsZiBzY3JlZW4gd2lkdGggKG9yIE4gcG9zaXRpb25zKS4KKyAgRVNDLSggIExlZnRBcnJvdyAgKiAgUmlnaHQgb25lIGhhbGYgc2NyZWVuIHdpZHRoIChvciBOIHBvc2l0aW9ucykuCisgIEYgICAgICAgICAgICAgICAgICAgIEZvcndhcmQgZm9yZXZlcjsgbGlrZSAidGFpbCAtZiIuCisgIHIgIF5SICBeTCAgICAgICAgICAgIFJlcGFpbnQgc2NyZWVuLgorICBSICAgICAgICAgICAgICAgICAgICBSZXBhaW50IHNjcmVlbiwgZGlzY2FyZGluZyBidWZmZXJlZCBpbnB1dC4KKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIERlZmF1bHQgIndpbmRvdyIgaXMgdGhlIHNjcmVlbiBoZWlnaHQuCisgICAgICAgIERlZmF1bHQgImhhbGYtd2luZG93IiBpcyBoYWxmIG9mIHRoZSBzY3JlZW4gaGVpZ2h0LgorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICAgICAgICAgICAgICBTRUFSQ0hJTkcKKyAgL3BhdHRlcm4gICAgICAgICAgKiAgU2VhcmNoIGZvcndhcmQgZm9yIChOLXRoKSBtYXRjaGluZyBsaW5lLgorICA/cGF0dGVybiAgICAgICAgICAqICBTZWFyY2ggYmFja3dhcmQgZm9yIChOLXRoKSBtYXRjaGluZyBsaW5lLgorICBuICAgICAgICAgICAgICAgICAqICBSZXBlYXQgcHJldmlvdXMgc2VhcmNoIChmb3IgTi10aCBvY2N1cnJlbmNlKS4KKyAgTiAgICAgICAgICAgICAgICAgKiAgUmVwZWF0IHByZXZpb3VzIHNlYXJjaCBpbiByZXZlcnNlIGRpcmVjdGlvbi4KKyAgRVNDLW4gICAgICAgICAgICAgKiAgUmVwZWF0IHByZXZpb3VzIHNlYXJjaCwgc3Bhbm5pbmcgZmlsZXMuCisgIEVTQy1OICAgICAgICAgICAgICogIFJlcGVhdCBwcmV2aW91cyBzZWFyY2gsIHJldmVyc2UgZGlyLiAmIHNwYW5uaW5nIGZpbGVzLgorICBFU0MtdSAgICAgICAgICAgICAgICBVbmRvICh0b2dnbGUpIHNlYXJjaCBoaWdobGlnaHRpbmcuCisgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBTZWFyY2ggcGF0dGVybnMgbWF5IGJlIG1vZGlmaWVkIGJ5IG9uZSBvciBtb3JlIG9mOgorICAgICAgICBeTiBvciAhICBTZWFyY2ggZm9yIE5PTi1tYXRjaGluZyBsaW5lcy4KKyAgICAgICAgXkUgb3IgKiAgU2VhcmNoIG11bHRpcGxlIGZpbGVzIChwYXNzIHRocnUgRU5EIE9GIEZJTEUpLgorICAgICAgICBeRiBvciBAICBTdGFydCBzZWFyY2ggYXQgRklSU1QgZmlsZSAoZm9yIC8pIG9yIGxhc3QgZmlsZSAoZm9yID8pLgorICAgICAgICBeSyAgICAgICBIaWdobGlnaHQgbWF0Y2hlcywgYnV0IGRvbid0IG1vdmUgKEtFRVAgcG9zaXRpb24pLgorICAgICAgICBeUiAgICAgICBEb24ndCB1c2UgUkVHVUxBUiBFWFBSRVNTSU9OUy4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpVTVBJTkcKKyAgZyAgPCAgRVNDLTwgICAgICAgKiAgR28gdG8gZmlyc3QgbGluZSBpbiBmaWxlIChvciBsaW5lIE4pLgorICBHICA+ICBFU0MtPiAgICAgICAqICBHbyB0byBsYXN0IGxpbmUgaW4gZmlsZSAob3IgbGluZSBOKS4KKyAgcCAgJSAgICAgICAgICAgICAgKiAgR28gdG8gYmVnaW5uaW5nIG9mIGZpbGUgKG9yIE4gcGVyY2VudCBpbnRvIGZpbGUpLgorICB0ICAgICAgICAgICAgICAgICAqICBHbyB0byB0aGUgKE4tdGgpIG5leHQgdGFnLgorICBUICAgICAgICAgICAgICAgICAqICBHbyB0byB0aGUgKE4tdGgpIHByZXZpb3VzIHRhZy4KKyAgeyAgKCAgWyAgICAgICAgICAgKiAgRmluZCBjbG9zZSBicmFja2V0IH0gKSBdLgorICB9ICApICBdICAgICAgICAgICAqICBGaW5kIG9wZW4gYnJhY2tldCB7ICggWy4KKyAgRVNDLV5GIDxjMT4gPGMyPiAgKiAgRmluZCBjbG9zZSBicmFja2V0IDxjMj4uCisgIEVTQy1eQiA8YzE+IDxjMj4gICogIEZpbmQgb3BlbiBicmFja2V0IDxjMT4KKyAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIEVhY2ggImZpbmQgY2xvc2UgYnJhY2tldCIgY29tbWFuZCBnb2VzIGZvcndhcmQgdG8gdGhlIGNsb3NlIGJyYWNrZXQKKyAgICAgICAgICBtYXRjaGluZyB0aGUgKE4tdGgpIG9wZW4gYnJhY2tldCBpbiB0aGUgdG9wIGxpbmUuCisgICAgICAgIEVhY2ggImZpbmQgb3BlbiBicmFja2V0IiBjb21tYW5kIGdvZXMgYmFja3dhcmQgdG8gdGhlIG9wZW4gYnJhY2tldAorICAgICAgICAgIG1hdGNoaW5nIHRoZSAoTi10aCkgY2xvc2UgYnJhY2tldCBpbiB0aGUgYm90dG9tIGxpbmUuCisgIG08bGV0dGVyPiAgICAgICAgICAgIE1hcmsgdGhlIGN1cnJlbnQgcG9zaXRpb24gd2l0aCA8bGV0dGVyPi4KKyAgJzxsZXR0ZXI+ICAgICAgICAgICAgR28gdG8gYSBwcmV2aW91c2x5IG1hcmtlZCBwb3NpdGlvbi4KKyAgJycgICAgICAgICAgICAgICAgICAgR28gdG8gdGhlIHByZXZpb3VzIHBvc2l0aW9uLgorICBeWF5YICAgICAgICAgICAgICAgICBTYW1lIGFzICcuCisgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICBBIG1hcmsgaXMgYW55IHVwcGVyLWNhc2Ugb3IgbG93ZXItY2FzZSBsZXR0ZXIuCisgICAgICAgIENlcnRhaW4gbWFya3MgYXJlIHByZWRlZmluZWQ6CisgICAgICAgICAgICAgXiAgbWVhbnMgIGJlZ2lubmluZyBvZiB0aGUgZmlsZQorICAgICAgICAgICAgICQgIG1lYW5zICBlbmQgb2YgdGhlIGZpbGUKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgIENIQU5HSU5HIEZJTEVTCisgIDplIFtmaWxlXSAgICAgICAgICAgIEV4YW1pbmUgYSBuZXcgZmlsZS4KKyAgXlheViAgICAgICAgICAgICAgICAgU2FtZSBhcyA6ZS4KKyAgOm4gICAgICAgICAgICAgICAgKiAgRXhhbWluZSB0aGUgKE4tdGgpIG5leHQgZmlsZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCisgIDpwICAgICAgICAgICAgICAgICogIEV4YW1pbmUgdGhlIChOLXRoKSBwcmV2aW91cyBmaWxlIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KKyAgOnggICAgICAgICAgICAgICAgKiAgRXhhbWluZSB0aGUgZmlyc3QgKG9yIE4tdGgpIGZpbGUgZnJvbSB0aGUgY29tbWFuZCBsaW5lLgorICA6ZCAgICAgICAgICAgICAgICAgICBEZWxldGUgdGhlIGN1cnJlbnQgZmlsZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgbGlzdC4KKyAgPSAgXkcgIDpmICAgICAgICAgICAgUHJpbnQgY3VycmVudCBmaWxlIG5hbWUuCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgICAgICAgIE1JU0NFTExBTkVPVVMgQ09NTUFORFMKKyAgLTxmbGFnPiAgICAgICAgICAgICAgVG9nZ2xlIGEgY29tbWFuZCBsaW5lIG9wdGlvbiBbc2VlIE9QVElPTlMgYmVsb3ddLgorICAtLTxuYW1lPiAgICAgICAgICAgICBUb2dnbGUgYSBjb21tYW5kIGxpbmUgb3B0aW9uLCBieSBuYW1lLgorICBfPGZsYWc+ICAgICAgICAgICAgICBEaXNwbGF5IHRoZSBzZXR0aW5nIG9mIGEgY29tbWFuZCBsaW5lIG9wdGlvbi4KKyAgX188bmFtZT4gICAgICAgICAgICAgRGlzcGxheSB0aGUgc2V0dGluZyBvZiBhbiBvcHRpb24sIGJ5IG5hbWUuCisgICtjbWQgICAgICAgICAgICAgICAgIEV4ZWN1dGUgdGhlIGxlc3MgY21kIGVhY2ggdGltZSBhIG5ldyBmaWxlIGlzIGV4YW1pbmVkLgorICAhY29tbWFuZCAgICAgICAgICAgICBFeGVjdXRlIHRoZSBzaGVsbCBjb21tYW5kIHdpdGggJFNIRUxMLgorICB8WGNvbW1hbmQgICAgICAgICAgICBQaXBlIGZpbGUgYmV0d2VlbiBjdXJyZW50IHBvcyAmIG1hcmsgWCB0byBzaGVsbCBjb21tYW5kLgorICB2ICAgICAgICAgICAgICAgICAgICBFZGl0IHRoZSBjdXJyZW50IGZpbGUgd2l0aCAkVklTVUFMIG9yICRFRElUT1IuCisgIFYgICAgICAgICAgICAgICAgICAgIFByaW50IHZlcnNpb24gbnVtYmVyIG9mICJsZXNzIi4KKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVElPTlMKKyAgICAgICAgTW9zdCBvcHRpb25zIG1heSBiZSBjaGFuZ2VkIGVpdGhlciBvbiB0aGUgY29tbWFuZCBsaW5lLAorICAgICAgICBvciBmcm9tIHdpdGhpbiBsZXNzIGJ5IHVzaW5nIHRoZSAtIG9yIC0tIGNvbW1hbmQuCisgICAgICAgIE9wdGlvbnMgbWF5IGJlIGdpdmVuIGluIG9uZSBvZiB0d28gZm9ybXM6IGVpdGhlciBhIHNpbmdsZQorICAgICAgICBjaGFyYWN0ZXIgcHJlY2VkZWQgYnkgYSAtLCBvciBhIG5hbWUgcHJlY2VkZWQgYnkgLS0uCisgIC0/ICAuLi4uLi4uLiAgLS1oZWxwCisgICAgICAgICAgICAgICAgICBEaXNwbGF5IGhlbHAgKGZyb20gY29tbWFuZCBsaW5lKS4KKyAgLWEgIC4uLi4uLi4uICAtLXNlYXJjaC1za2lwLXNjcmVlbgorICAgICAgICAgICAgICAgICAgRm9yd2FyZCBzZWFyY2ggc2tpcHMgY3VycmVudCBzY3JlZW4uCisgIC1iIFtOXSAgLi4uLiAgLS1idWZmZXJzPVtOXQorICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGJ1ZmZlcnMuCisgIC1CICAuLi4uLi4uLiAgLS1hdXRvLWJ1ZmZlcnMKKyAgICAgICAgICAgICAgICAgIERvbid0IGF1dG9tYXRpY2FsbHkgYWxsb2NhdGUgYnVmZmVycyBmb3IgcGlwZXMuCisgIC1jICAuLi4uLi4uLiAgLS1jbGVhci1zY3JlZW4KKyAgICAgICAgICAgICAgICAgIFJlcGFpbnQgYnkgY2xlYXJpbmcgcmF0aGVyIHRoYW4gc2Nyb2xsaW5nLgorICAtZCAgLi4uLi4uLi4gIC0tZHVtYgorICAgICAgICAgICAgICAgICAgRHVtYiB0ZXJtaW5hbC4KKyAgLUQgW3huLm5dICAuICAtLWNvbG9yPXhuLm4KKyAgICAgICAgICAgICAgICAgIFNldCBzY3JlZW4gY29sb3JzLiAoTVMtRE9TIG9ubHkpCisgIC1lICAtRSAgLi4uLiAgLS1xdWl0LWF0LWVvZiAgLS1RVUlULUFULUVPRgorICAgICAgICAgICAgICAgICAgUXVpdCBhdCBlbmQgb2YgZmlsZS4KKyAgLWYgIC4uLi4uLi4uICAtLWZvcmNlCisgICAgICAgICAgICAgICAgICBGb3JjZSBvcGVuIG5vbi1yZWd1bGFyIGZpbGVzLgorICAtRiAgLi4uLi4uLi4gIC0tcXVpdC1pZi1vbmUtc2NyZWVuCisgICAgICAgICAgICAgICAgICBRdWl0IGlmIGVudGlyZSBmaWxlIGZpdHMgb24gZmlyc3Qgc2NyZWVuLgorICAtZyAgLi4uLi4uLi4gIC0taGlsaXRlLXNlYXJjaAorICAgICAgICAgICAgICAgICAgSGlnaGxpZ2h0IG9ubHkgbGFzdCBtYXRjaCBmb3Igc2VhcmNoZXMuCisgIC1HICAuLi4uLi4uLiAgLS1ISUxJVEUtU0VBUkNICisgICAgICAgICAgICAgICAgICBEb24ndCBoaWdobGlnaHQgYW55IG1hdGNoZXMgZm9yIHNlYXJjaGVzLgorICAtaCBbTl0gIC4uLi4gIC0tbWF4LWJhY2stc2Nyb2xsPVtOXQorICAgICAgICAgICAgICAgICAgQmFja3dhcmQgc2Nyb2xsIGxpbWl0LgorICAtaSAgLi4uLi4uLi4gIC0taWdub3JlLWNhc2UKKyAgICAgICAgICAgICAgICAgIElnbm9yZSBjYXNlIGluIHNlYXJjaGVzIHRoYXQgZG8gbm90IGNvbnRhaW4gdXBwZXJjYXNlLgorICAtSSAgLi4uLi4uLi4gIC0tSUdOT1JFLUNBU0UKKyAgICAgICAgICAgICAgICAgIElnbm9yZSBjYXNlIGluIGFsbCBzZWFyY2hlcy4KKyAgLWogW05dICAuLi4uICAtLWp1bXAtdGFyZ2V0PVtOXQorICAgICAgICAgICAgICAgICAgU2NyZWVuIHBvc2l0aW9uIG9mIHRhcmdldCBsaW5lcy4KKyAgLUogIC4uLi4uLi4uICAtLXN0YXR1cy1jb2x1bW4KKyAgICAgICAgICAgICAgICAgIERpc3BsYXkgYSBzdGF0dXMgY29sdW1uIGF0IGxlZnQgZWRnZSBvZiBzY3JlZW4uCisgIC1rIFtmaWxlXSAgLiAgLS1sZXNza2V5LWZpbGU9W2ZpbGVdCisgICAgICAgICAgICAgICAgICBVc2UgYSBsZXNza2V5IGZpbGUuCisgIC1MICAuLi4uLi4uLiAgLS1uby1sZXNzb3BlbgorICAgICAgICAgICAgICAgICAgSWdub3JlIHRoZSBMRVNTT1BFTiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKyAgLW0gIC1NICAuLi4uICAtLWxvbmctcHJvbXB0ICAtLUxPTkctUFJPTVBUCisgICAgICAgICAgICAgICAgICBTZXQgcHJvbXB0IHN0eWxlLgorICAtbiAgLU4gIC4uLi4gIC0tbGluZS1udW1iZXJzICAtLUxJTkUtTlVNQkVSUworICAgICAgICAgICAgICAgICAgRG9uJ3QgdXNlIGxpbmUgbnVtYmVycy4KKyAgLW8gW2ZpbGVdICAuICAtLWxvZy1maWxlPVtmaWxlXQorICAgICAgICAgICAgICAgICAgQ29weSB0byBsb2cgZmlsZSAoc3RhbmRhcmQgaW5wdXQgb25seSkuCisgIC1PIFtmaWxlXSAgLiAgLS1MT0ctRklMRT1bZmlsZV0KKyAgICAgICAgICAgICAgICAgIENvcHkgdG8gbG9nIGZpbGUgKHVuY29uZGl0aW9uYWxseSBvdmVyd3JpdGUpLgorICAtcCBbcGF0dGVybl0gIC0tcGF0dGVybj1bcGF0dGVybl0KKyAgICAgICAgICAgICAgICAgIFN0YXJ0IGF0IHBhdHRlcm4gKGZyb20gY29tbWFuZCBsaW5lKS4KKyAgLVAgW3Byb21wdF0gICAtLXByb21wdD1bcHJvbXB0XQorICAgICAgICAgICAgICAgICAgRGVmaW5lIG5ldyBwcm9tcHQuCisgIC1xICAtUSAgLi4uLiAgLS1xdWlldCAgLS1RVUlFVCAgLS1zaWxlbnQgLS1TSUxFTlQKKyAgICAgICAgICAgICAgICAgIFF1aWV0IHRoZSB0ZXJtaW5hbCBiZWxsLgorICAtciAgLVIgIC4uLi4gIC0tcmF3LWNvbnRyb2wtY2hhcnMgIC0tUkFXLUNPTlRST0wtQ0hBUlMKKyAgICAgICAgICAgICAgICAgIE91dHB1dCAicmF3IiBjb250cm9sIGNoYXJhY3RlcnMuCisgIC1zICAuLi4uLi4uLiAgLS1zcXVlZXplLWJsYW5rLWxpbmVzCisgICAgICAgICAgICAgICAgICBTcXVlZXplIG11bHRpcGxlIGJsYW5rIGxpbmVzLgorICAtUyAgLi4uLi4uLi4gIC0tY2hvcC1sb25nLWxpbmVzCisgICAgICAgICAgICAgICAgICBDaG9wIGxvbmcgbGluZXMuCisgIC10IFt0YWddICAuLiAgLS10YWc9W3RhZ10KKyAgICAgICAgICAgICAgICAgIEZpbmQgYSB0YWcuCisgIC1UIFt0YWdzZmlsZV0gLS10YWctZmlsZT1bdGFnc2ZpbGVdCisgICAgICAgICAgICAgICAgICBVc2UgYW4gYWx0ZXJuYXRlIHRhZ3MgZmlsZS4KKyAgLXUgIC1VICAuLi4uICAtLXVuZGVybGluZS1zcGVjaWFsICAtLVVOREVSTElORS1TUEVDSUFMCisgICAgICAgICAgICAgICAgICBDaGFuZ2UgaGFuZGxpbmcgb2YgYmFja3NwYWNlcy4KKyAgLVYgIC4uLi4uLi4uICAtLXZlcnNpb24KKyAgICAgICAgICAgICAgICAgIERpc3BsYXkgdGhlIHZlcnNpb24gbnVtYmVyIG9mICJsZXNzIi4KKyAgLXcgIC4uLi4uLi4uICAtLWhpbGl0ZS11bnJlYWQKKyAgICAgICAgICAgICAgICAgIEhpZ2hsaWdodCBmaXJzdCBuZXcgbGluZSBhZnRlciBmb3J3YXJkLXNjcmVlbi4KKyAgLVcgIC4uLi4uLi4uICAtLUhJTElURS1VTlJFQUQKKyAgICAgICAgICAgICAgICAgIEhpZ2hsaWdodCBmaXJzdCBuZXcgbGluZSBhZnRlciBhbnkgZm9yd2FyZCBtb3ZlbWVudC4KKyAgLXggW05bLC4uLl1dICAtLXRhYnM9W05bLC4uLl1dCisgICAgICAgICAgICAgICAgICBTZXQgdGFiIHN0b3BzLgorICAtWCAgLi4uLi4uLi4gIC0tbm8taW5pdAorICAgICAgICAgICAgICAgICAgRG9uJ3QgdXNlIHRlcm1jYXAgaW5pdC9kZWluaXQgc3RyaW5ncy4KKyAgICAgICAgICAgICAgICAtLW5vLWtleXBhZAorICAgICAgICAgICAgICAgICAgRG9uJ3QgdXNlIHRlcm1jYXAga2V5cGFkIGluaXQvZGVpbml0IHN0cmluZ3MuCisgIC15IFtOXSAgLi4uLiAgLS1tYXgtZm9ydy1zY3JvbGw9W05dCisgICAgICAgICAgICAgICAgICBGb3J3YXJkIHNjcm9sbCBsaW1pdC4KKyAgLXogW05dICAuLi4uICAtLXdpbmRvdz1bTl0KKyAgICAgICAgICAgICAgICAgIFNldCBzaXplIG9mIHdpbmRvdy4KKyAgLSIgW2NbY11dICAuICAtLXF1b3Rlcz1bY1tjXV0KKyAgICAgICAgICAgICAgICAgIFNldCBzaGVsbCBxdW90ZSBjaGFyYWN0ZXJzLgorICAtfiAgLi4uLi4uLi4gIC0tdGlsZGUKKyAgICAgICAgICAgICAgICAgIERvbid0IGRpc3BsYXkgdGlsZGVzIGFmdGVyIGVuZCBvZiBmaWxlLgorICAtIyBbTl0gIC4uLi4gIC0tc2hpZnQ9W05dCisgICAgICAgICAgICAgICAgICBIb3Jpem9udGFsIHNjcm9sbCBhbW91bnQgKDAgPSBvbmUgaGFsZiBzY3JlZW4gd2lkdGgpCisKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTElORSBFRElUSU5HCisgICAgICAgIFRoZXNlIGtleXMgY2FuIGJlIHVzZWQgdG8gZWRpdCB0ZXh0IGJlaW5nIGVudGVyZWQKKyAgICAgICAgb24gdGhlICJjb21tYW5kIGxpbmUiIGF0IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbi4KKyBSaWdodEFycm93ICAgICAgICAgICAgICAgICAgICAgICBFU0MtbCAgICAgTW92ZSBjdXJzb3IgcmlnaHQgb25lIGNoYXJhY3Rlci4KKyBMZWZ0QXJyb3cgICAgICAgICAgICAgICAgICAgICAgICBFU0MtaCAgICAgTW92ZSBjdXJzb3IgbGVmdCBvbmUgY2hhcmFjdGVyLgorIENOVEwtUmlnaHRBcnJvdyAgRVNDLVJpZ2h0QXJyb3cgIEVTQy13ICAgICBNb3ZlIGN1cnNvciByaWdodCBvbmUgd29yZC4KKyBDTlRMLUxlZnRBcnJvdyAgIEVTQy1MZWZ0QXJyb3cgICBFU0MtYiAgICAgTW92ZSBjdXJzb3IgbGVmdCBvbmUgd29yZC4KKyBIT01FICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU0MtMCAgICAgTW92ZSBjdXJzb3IgdG8gc3RhcnQgb2YgbGluZS4KKyBFTkQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFU0MtJCAgICAgTW92ZSBjdXJzb3IgdG8gZW5kIG9mIGxpbmUuCisgQkFDS1NQQUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbGV0ZSBjaGFyIHRvIGxlZnQgb2YgY3Vyc29yLgorIERFTEVURSAgICAgICAgICAgICAgICAgICAgICAgICAgIEVTQy14ICAgICBEZWxldGUgY2hhciB1bmRlciBjdXJzb3IuCisgQ05UTC1CQUNLU1BBQ0UgICBFU0MtQkFDS1NQQUNFICAgICAgICAgICAgIERlbGV0ZSB3b3JkIHRvIGxlZnQgb2YgY3Vyc29yLgorIENOVEwtREVMRVRFICAgICAgRVNDLURFTEVURSAgICAgIEVTQy1YICAgICBEZWxldGUgd29yZCB1bmRlciBjdXJzb3IuCisgQ05UTC1VICAgICAgICAgICBFU0MgKE1TLURPUyBvbmx5KSAgICAgICAgIERlbGV0ZSBlbnRpcmUgbGluZS4KKyBVcEFycm93ICAgICAgICAgICAgICAgICAgICAgICAgICBFU0MtayAgICAgUmV0cmlldmUgcHJldmlvdXMgY29tbWFuZCBsaW5lLgorIERvd25BcnJvdyAgICAgICAgICAgICAgICAgICAgICAgIEVTQy1qICAgICBSZXRyaWV2ZSBuZXh0IGNvbW1hbmQgbGluZS4KKyBUQUIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGUgZmlsZW5hbWUgJiBjeWNsZS4KKyBTSElGVC1UQUIgICAgICAgICAgICAgICAgICAgICAgICBFU0MtVEFCICAgQ29tcGxldGUgZmlsZW5hbWUgJiByZXZlcnNlIGN5Y2xlLgorIENOVEwtTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wbGV0ZSBmaWxlbmFtZSwgbGlzdCBhbGwuCisqLwpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL21ha2VkZXZzLmMgYi9taXNjdXRpbHMvbWFrZWRldnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTQ1YTEzCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL21ha2VkZXZzLmMKQEAgLTAsMCArMSwyNjkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHB1YmxpYyBkb21haW4gLS0gRGF2ZSAnS2lsbCBhIENvcCcgQ2luZWdlIDxkY2luZWdlQHBzeWNob3Npcy5jb20+CisgKgorICogbWFrZWRldnMKKyAqIE1ha2UgcmFuZ2VzIG9mIGRldmljZSBmaWxlcyBxdWlja2x5LgorICoga25vd24gYnVnczogY2FuJ3QgZGVhbCB3aXRoIGFscGhhIHJhbmdlcworICovCisKKy8vdXNhZ2U6I2lmIEVOQUJMRV9GRUFUVVJFX01BS0VERVZTX0xFQUYKKy8vdXNhZ2U6I2RlZmluZSBtYWtlZGV2c190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiTkFNRSBUWVBFIE1BSk9SIE1JTk9SIEZJUlNUIExBU1QgW3NdIgorLy91c2FnZTojZGVmaW5lIG1ha2VkZXZzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ3JlYXRlIGEgcmFuZ2Ugb2YgYmxvY2sgb3IgY2hhcmFjdGVyIHNwZWNpYWwgZmlsZXMiCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcblRZUEUgaXM6IgorLy91c2FnZTogICAgICJcbgliCUJsb2NrIGRldmljZSIKKy8vdXNhZ2U6ICAgICAiXG4JYwlDaGFyYWN0ZXIgZGV2aWNlIgorLy91c2FnZTogICAgICJcbglmCUZJRk8sIE1BSk9SIGFuZCBNSU5PUiBhcmUgaWdub3JlZCIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuRklSU1QuLkxBU1Qgc3BlY2lmeSBudW1iZXJzIGFwcGVuZGVkIHRvIE5BTUUuIgorLy91c2FnZTogICAgICJcbklmICdzJyBpcyB0aGUgbGFzdCBhcmd1bWVudCwgdGhlIGJhc2UgZGV2aWNlIGlzIGNyZWF0ZWQgYXMgd2VsbC4iCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbkV4YW1wbGVzOiIKKy8vdXNhZ2U6ICAgICAiXG4JbWFrZWRldnMgL2Rldi90dHlTIGMgNCA2NiAyIDYzICAgLT4gIHR0eVMyLXR0eVM2MyIKKy8vdXNhZ2U6ICAgICAiXG4JbWFrZWRldnMgL2Rldi9oZGEgYiAzIDAgMCA4IHMgICAgLT4gIGhkYSxoZGExLWhkYTgiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG1ha2VkZXZzX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIjIG1ha2VkZXZzIC9kZXYvdHR5UyBjIDQgNjYgMiA2M1xuIgorLy91c2FnZTogICAgICAgIltjcmVhdGVzIHR0eVMyLXR0eVM2M11cbiIKKy8vdXNhZ2U6ICAgICAgICIjIG1ha2VkZXZzIC9kZXYvaGRhIGIgMyAwIDAgOCBzXG4iCisvL3VzYWdlOiAgICAgICAiW2NyZWF0ZXMgaGRhLGhkYTEtaGRhOF1cbiIKKy8vdXNhZ2U6I2VuZGlmCisvL3VzYWdlOgorLy91c2FnZTojaWYgRU5BQkxFX0ZFQVRVUkVfTUFLRURFVlNfVEFCTEUKKy8vdXNhZ2U6I2RlZmluZSBtYWtlZGV2c190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1kIGRldmljZV90YWJsZV0gcm9vdGRpciIKKy8vdXNhZ2U6I2RlZmluZSBtYWtlZGV2c19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNyZWF0ZSBhIHJhbmdlIG9mIHNwZWNpYWwgZmlsZXMgYXMgc3BlY2lmaWVkIGluIGEgZGV2aWNlIHRhYmxlLlxuIgorLy91c2FnZTogICAgICAgIkRldmljZSB0YWJsZSBlbnRyaWVzIHRha2UgdGhlIGZvcm0gb2Y6XG4iCisvL3VzYWdlOiAgICAgICAiPG5hbWU+IDx0eXBlPiA8bW9kZT4gPHVpZD4gPGdpZD4gPG1ham9yPiA8bWlub3I+IDxzdGFydD4gPGluYz4gPGNvdW50PlxuIgorLy91c2FnZTogICAgICAgIldoZXJlIG5hbWUgaXMgdGhlIGZpbGUgbmFtZSwgdHlwZSBjYW4gYmUgb25lIG9mOlxuIgorLy91c2FnZTogICAgICAgIglmCVJlZ3VsYXIgZmlsZVxuIgorLy91c2FnZTogICAgICAgIglkCURpcmVjdG9yeVxuIgorLy91c2FnZTogICAgICAgIgljCUNoYXJhY3RlciBkZXZpY2VcbiIKKy8vdXNhZ2U6ICAgICAgICIJYglCbG9jayBkZXZpY2VcbiIKKy8vdXNhZ2U6ICAgICAgICIJcAlGaWZvIChuYW1lZCBwaXBlKVxuIgorLy91c2FnZTogICAgICAgInVpZCBpcyB0aGUgdXNlciBpZCBmb3IgdGhlIHRhcmdldCBmaWxlLCBnaWQgaXMgdGhlIGdyb3VwIGlkIGZvciB0aGVcbiIKKy8vdXNhZ2U6ICAgICAgICJ0YXJnZXQgZmlsZS4gVGhlIHJlc3Qgb2YgdGhlIGVudHJpZXMgKG1ham9yLCBtaW5vciwgZXRjKSBhcHBseSB0b1xuIgorLy91c2FnZTogICAgICAgInRvIGRldmljZSBzcGVjaWFsIGZpbGVzLiBBICctJyBtYXkgYmUgdXNlZCBmb3IgYmxhbmsgZW50cmllcy4iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG1ha2VkZXZzX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJGb3IgZXhhbXBsZTpcbiIKKy8vdXNhZ2U6ICAgICAgICI8bmFtZT4gICAgPHR5cGU+IDxtb2RlPjx1aWQ+PGdpZD48bWFqb3I+PG1pbm9yPjxzdGFydD48aW5jPjxjb3VudD5cbiIKKy8vdXNhZ2U6ICAgICAgICIvZGV2ICAgICAgICAgZCAgIDc1NSAgICAwICAgIDAgICAgLSAgICAgIC0gICAgICAtICAgICAgLSAgICAtXG4iCisvL3VzYWdlOiAgICAgICAiL2Rldi9jb25zb2xlIGMgICA2NjYgICAgMCAgICAwICAgIDUgICAgICAxICAgICAgLSAgICAgIC0gICAgLVxuIgorLy91c2FnZTogICAgICAgIi9kZXYvbnVsbCAgICBjICAgNjY2ICAgIDAgICAgMCAgICAxICAgICAgMyAgICAgIDAgICAgICAwICAgIC1cbiIKKy8vdXNhZ2U6ICAgICAgICIvZGV2L3plcm8gICAgYyAgIDY2NiAgICAwICAgIDAgICAgMSAgICAgIDUgICAgICAwICAgICAgMCAgICAtXG4iCisvL3VzYWdlOiAgICAgICAiL2Rldi9oZGEgICAgIGIgICA2NDAgICAgMCAgICAwICAgIDMgICAgICAwICAgICAgMCAgICAgIDAgICAgLVxuIgorLy91c2FnZTogICAgICAgIi9kZXYvaGRhICAgICBiICAgNjQwICAgIDAgICAgMCAgICAzICAgICAgMSAgICAgIDEgICAgICAxICAgIDE1XG5cbiIKKy8vdXNhZ2U6ICAgICAgICJXaWxsIFByb2R1Y2U6XG4iCisvL3VzYWdlOiAgICAgICAiL2RldlxuIgorLy91c2FnZTogICAgICAgIi9kZXYvY29uc29sZVxuIgorLy91c2FnZTogICAgICAgIi9kZXYvbnVsbFxuIgorLy91c2FnZTogICAgICAgIi9kZXYvemVyb1xuIgorLy91c2FnZTogICAgICAgIi9kZXYvaGRhXG4iCisvL3VzYWdlOiAgICAgICAiL2Rldi9oZGFbMC0xNV1cbiIKKy8vdXNhZ2U6I2VuZGlmCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTUFLRURFVlNfTEVBRgorLyoKK21ha2VkZXZzIE5BTUUgVFlQRSBNQUpPUiBNSU5PUiBGSVJTVCBMQVNUIFtzXQorVFlQRXM6CitiICAgICAgIEJsb2NrIGRldmljZQorYyAgICAgICBDaGFyYWN0ZXIgZGV2aWNlCitmICAgICAgIEZJRk8KKworRklSU1QuLkxBU1Qgc3BlY2lmeSBudW1iZXJzIGFwcGVuZGVkIHRvIE5BTUUuCitJZiAncycgaXMgdGhlIGxhc3QgYXJndW1lbnQsIHRoZSBiYXNlIGRldmljZSBpcyBjcmVhdGVkIGFzIHdlbGwuCitFeGFtcGxlczoKKyAgICAgICAgbWFrZWRldnMgL2Rldi90dHlTIGMgNCA2NiAyIDYzICAgLT4gIHR0eVMyLXR0eVM2MworICAgICAgICBtYWtlZGV2cyAvZGV2L2hkYSBiIDMgMCAwIDggcyAgICAtPiAgaGRhLGhkYTEtaGRhOAorKi8KK2ludCBtYWtlZGV2c19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbWFrZWRldnNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJbW9kZV90IG1vZGU7CisJY2hhciAqYmFzZWRldiwgKnR5cGUsICpub2RuYW1lLCAqYnVmOworCWludCBTbWFqb3IsIFNtaW5vciwgUywgRTsKKworCWlmIChhcmdjIDwgNyB8fCBhcmd2WzFdWzBdID09ICctJykKKwkJYmJfc2hvd191c2FnZSgpOworCisJYmFzZWRldiA9IGFyZ3ZbMV07CisJYnVmID0geGFzcHJpbnRmKCIlcyV1IiwgYXJndlsxXSwgKHVuc2lnbmVkKS0xKTsKKwl0eXBlID0gYXJndlsyXTsKKwlTbWFqb3IgPSB4YXRvaV9wb3NpdGl2ZShhcmd2WzNdKTsKKwlTbWlub3IgPSB4YXRvaV9wb3NpdGl2ZShhcmd2WzRdKTsKKwlTID0geGF0b2lfcG9zaXRpdmUoYXJndls1XSk7CisJRSA9IHhhdG9pX3Bvc2l0aXZlKGFyZ3ZbNl0pOworCW5vZG5hbWUgPSBhcmd2WzddID8gYmFzZWRldiA6IGJ1ZjsKKworCW1vZGUgPSAwNjYwOworCXN3aXRjaCAodHlwZVswXSkgeworCWNhc2UgJ2MnOgorCQltb2RlIHw9IFNfSUZDSFI7CisJCWJyZWFrOworCWNhc2UgJ2InOgorCQltb2RlIHw9IFNfSUZCTEs7CisJCWJyZWFrOworCWNhc2UgJ2YnOgorCQltb2RlIHw9IFNfSUZJRk87CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwl3aGlsZSAoUyA8PSBFKSB7CisJCXNwcmludGYoYnVmLCAiJXMldSIsIGJhc2VkZXYsIFMpOworCisJCS8qIGlmIG1vZGUgIT0gU19JRkNIUiBhbmQgIT0gU19JRkJMSywKKwkJICogdGhpcmQgcGFyYW0gaW4gbWtub2QoKSBpZ25vcmVkICovCisJCWlmIChta25vZChub2RuYW1lLCBtb2RlLCBtYWtlZGV2KFNtYWpvciwgU21pbm9yKSkpCisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjcmVhdGUgJyVzJyIsIG5vZG5hbWUpOworCisJCS8qaWYgKG5vZG5hbWUgPT0gYmFzZWRldikqLyAvKiBleC4gL2Rldi9oZGEgLSB0byAvZGV2L2hkYTEgLi4uICovCisJCQlub2RuYW1lID0gYnVmOworCQlTKys7CisJCVNtaW5vcisrOworCX0KKworCXJldHVybiAwOworfQorCisjZWxpZiBFTkFCTEVfRkVBVFVSRV9NQUtFREVWU19UQUJMRQorCisvKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLiAqLworCitpbnQgbWFrZWRldnNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1ha2VkZXZzX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlwYXJzZXJfdCAqcGFyc2VyOworCWNoYXIgKmxpbmUgPSAoY2hhciAqKSItIjsKKwlpbnQgcmV0ID0gRVhJVF9TVUNDRVNTOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTEiOyAvKiBleGFjdGx5IG9uZSBwYXJhbSAqLworCWdldG9wdDMyKGFyZ3YsICJkOiIsICZsaW5lKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCXhjaGRpcigqYXJndik7IC8qIGVuc3VyZSByb290IGRpciBleGlzdHMgKi8KKworCXVtYXNrKDApOworCisJcHJpbnRmKCJyb290ZGlyPSVzXG50YWJsZT0iLCAqYXJndik7CisJaWYgKE5PVF9MT05FX0RBU0gobGluZSkpIHsKKwkJcHJpbnRmKCInJXMnXG4iLCBsaW5lKTsKKwl9IGVsc2UgeworCQlwdXRzKCI8c3RkaW4+Iik7CisJfQorCisJcGFyc2VyID0gY29uZmlnX29wZW4obGluZSk7CisJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgJmxpbmUsIDEsIDEsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQlpbnQgbGluZW51bTsKKwkJY2hhciB0eXBlOworCQl1bnNpZ25lZCBtb2RlID0gMDc1NTsKKwkJdW5zaWduZWQgbWFqb3IgPSAwOworCQl1bnNpZ25lZCBtaW5vciA9IDA7CisJCXVuc2lnbmVkIGNvdW50ID0gMDsKKwkJdW5zaWduZWQgaW5jcmVtZW50ID0gMDsKKwkJdW5zaWduZWQgc3RhcnQgPSAwOworCQljaGFyIG5hbWVbNDFdOworCQljaGFyIHVzZXJbNDFdOworCQljaGFyIGdyb3VwWzQxXTsKKwkJY2hhciAqZnVsbF9uYW1lID0gbmFtZTsKKwkJdWlkX3QgdWlkOworCQlnaWRfdCBnaWQ7CisKKwkJbGluZW51bSA9IHBhcnNlci0+bGluZW5vOworCisJCWlmICgoMiA+IHNzY2FuZihsaW5lLCAiJTQwcyAlYyAlbyAlNDBzICU0MHMgJXUgJXUgJXUgJXUgJXUiLAorCQkJCQluYW1lLCAmdHlwZSwgJm1vZGUsIHVzZXIsIGdyb3VwLAorCQkJCQkmbWFqb3IsICZtaW5vciwgJnN0YXJ0LCAmaW5jcmVtZW50LCAmY291bnQpKQorCQkgfHwgKCh1bnNpZ25lZCkobWFqb3IgfCBtaW5vciB8IHN0YXJ0IHwgY291bnQgfCBpbmNyZW1lbnQpID4gMjU1KQorCQkpIHsKKwkJCWJiX2Vycm9yX21zZygiaW52YWxpZCBsaW5lICVkOiAnJXMnIiwgbGluZW51bSwgbGluZSk7CisJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQljb250aW51ZTsKKwkJfQorCisJCWdpZCA9ICgqZ3JvdXApID8gZ2V0X3VnX2lkKGdyb3VwLCB4Z3JvdXAyZ2lkKSA6IGdldGdpZCgpOworCQl1aWQgPSAoKnVzZXIpID8gZ2V0X3VnX2lkKHVzZXIsIHh1bmFtZTJ1aWQpIDogZ2V0dWlkKCk7CisJCS8qIFdlIGFyZSBhbHJlYWR5IGluIHRoZSByaWdodCByb290IGRpciwKKwkJICogc28gbWFrZSBhYnNvbHV0ZSBwYXRocyByZWxhdGl2ZSAqLworCQlpZiAoJy8nID09ICpmdWxsX25hbWUpCisJCQlmdWxsX25hbWUrKzsKKworCQlpZiAodHlwZSA9PSAnZCcpIHsKKwkJCWJiX21ha2VfZGlyZWN0b3J5KGZ1bGxfbmFtZSwgbW9kZSB8IFNfSUZESVIsIEZJTEVVVElMU19SRUNVUik7CisJCQlpZiAoY2hvd24oZnVsbF9uYW1lLCB1aWQsIGdpZCkgPT0gLTEpIHsKKyBjaG93bl9mYWlsOgorCQkJCWJiX3BlcnJvcl9tc2coImxpbmUgJWQ6IGNhbid0IGNob3duICVzIiwgbGluZW51bSwgZnVsbF9uYW1lKTsKKwkJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoY2htb2QoZnVsbF9uYW1lLCBtb2RlKSA8IDApIHsKKyBjaG1vZF9mYWlsOgorCQkJCWJiX3BlcnJvcl9tc2coImxpbmUgJWQ6IGNhbid0IGNobW9kICVzIiwgbGluZW51bSwgZnVsbF9uYW1lKTsKKwkJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQkJY29udGludWU7CisJCQl9CisJCX0gZWxzZSBpZiAodHlwZSA9PSAnZicpIHsKKwkJCXN0cnVjdCBzdGF0IHN0OworCQkJaWYgKChzdGF0KGZ1bGxfbmFtZSwgJnN0KSA8IDAgfHwgIVNfSVNSRUcoc3Quc3RfbW9kZSkpKSB7CisJCQkJYmJfcGVycm9yX21zZygibGluZSAlZDogcmVndWxhciBmaWxlICclcycgZG9lcyBub3QgZXhpc3QiLCBsaW5lbnVtLCBmdWxsX25hbWUpOworCQkJCXJldCA9IEVYSVRfRkFJTFVSRTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChjaG93bihmdWxsX25hbWUsIHVpZCwgZ2lkKSA8IDApCisJCQkJZ290byBjaG93bl9mYWlsOworCQkJaWYgKGNobW9kKGZ1bGxfbmFtZSwgbW9kZSkgPCAwKQorCQkJCWdvdG8gY2htb2RfZmFpbDsKKwkJfSBlbHNlIHsKKwkJCWRldl90IHJkZXY7CisJCQl1bnNpZ25lZCBpOworCQkJY2hhciAqZnVsbF9uYW1lX2luYzsKKworCQkJaWYgKHR5cGUgPT0gJ3AnKSB7CisJCQkJbW9kZSB8PSBTX0lGSUZPOworCQkJfSBlbHNlIGlmICh0eXBlID09ICdjJykgeworCQkJCW1vZGUgfD0gU19JRkNIUjsKKwkJCX0gZWxzZSBpZiAodHlwZSA9PSAnYicpIHsKKwkJCQltb2RlIHw9IFNfSUZCTEs7CisJCQl9IGVsc2UgeworCQkJCWJiX2Vycm9yX21zZygibGluZSAlZDogdW5zdXBwb3J0ZWQgZmlsZSB0eXBlICVjIiwgbGluZW51bSwgdHlwZSk7CisJCQkJcmV0ID0gRVhJVF9GQUlMVVJFOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlmdWxsX25hbWVfaW5jID0geG1hbGxvYyhzdHJsZW4oZnVsbF9uYW1lKSArIHNpemVvZihpbnQpKjMgKyAyKTsKKwkJCWlmIChjb3VudCkKKwkJCQljb3VudC0tOworCQkJZm9yIChpID0gc3RhcnQ7IGkgPD0gc3RhcnQgKyBjb3VudDsgaSsrKSB7CisJCQkJc3ByaW50ZihmdWxsX25hbWVfaW5jLCBjb3VudCA/ICIlcyV1IiA6ICIlcyIsIGZ1bGxfbmFtZSwgaSk7CisJCQkJcmRldiA9IG1ha2VkZXYobWFqb3IsIG1pbm9yICsgKGkgLSBzdGFydCkgKiBpbmNyZW1lbnQpOworCQkJCWlmIChta25vZChmdWxsX25hbWVfaW5jLCBtb2RlLCByZGV2KSA8IDApIHsKKwkJCQkJYmJfcGVycm9yX21zZygibGluZSAlZDogY2FuJ3QgY3JlYXRlIG5vZGUgJXMiLCBsaW5lbnVtLCBmdWxsX25hbWVfaW5jKTsKKwkJCQkJcmV0ID0gRVhJVF9GQUlMVVJFOworCQkJCX0gZWxzZSBpZiAoY2hvd24oZnVsbF9uYW1lX2luYywgdWlkLCBnaWQpIDwgMCkgeworCQkJCQliYl9wZXJyb3JfbXNnKCJsaW5lICVkOiBjYW4ndCBjaG93biAlcyIsIGxpbmVudW0sIGZ1bGxfbmFtZV9pbmMpOworCQkJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQkJfSBlbHNlIGlmIChjaG1vZChmdWxsX25hbWVfaW5jLCBtb2RlKSA8IDApIHsKKwkJCQkJYmJfcGVycm9yX21zZygibGluZSAlZDogY2FuJ3QgY2htb2QgJXMiLCBsaW5lbnVtLCBmdWxsX25hbWVfaW5jKTsKKwkJCQkJcmV0ID0gRVhJVF9GQUlMVVJFOworCQkJCX0KKwkJCX0KKwkJCWZyZWUoZnVsbF9uYW1lX2luYyk7CisJCX0KKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljb25maWdfY2xvc2UocGFyc2VyKTsKKworCXJldHVybiByZXQ7Cit9CisKKyNlbHNlCisjIGVycm9yIG1ha2VkZXZzIGNvbmZpZ3VyYXRpb24gZXJyb3IsIGVpdGhlciBsZWFmIG9yIHRhYmxlIG11c3QgYmUgc2VsZWN0ZWQKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL21hbi5jIGIvbWlzY3V0aWxzL21hbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ZWQ4MTkKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvbWFuLmMKQEAgLTAsMCArMSwzMDYgQEAKKy8qIG1pbmkgbWFuIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG1hbl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hd10gW01BTlBBR0VdLi4uIgorLy91c2FnZTojZGVmaW5lIG1hbl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkZvcm1hdCBhbmQgZGlzcGxheSBtYW51YWwgcGFnZVxuIgorLy91c2FnZTogICAgICJcbgktYQlEaXNwbGF5IGFsbCBwYWdlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXcJU2hvdyBwYWdlIGxvY2F0aW9ucyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2VudW0geworCU9QVF9hID0gMSwgLyogYWxsICovCisJT1BUX3cgPSAyLCAvKiBwcmludCBwYXRoICovCit9OworCisvKiBUaGlzIGlzIHdoYXQgSSBzZWUgb24gbXkgZGVza3RvcCBzeXN0ZW0gYmVpbmcgZXhlY3V0ZWQ6CisKKygKK2VjaG8gIi5sbCAxMi40aSIKK2VjaG8gIi5uciBMTCAxMi40aSIKK2VjaG8gIi5wbCAxMTAwaSIKK2d1bnppcCAtYyAnL3Vzci9tYW4vbWFuMS9iemlwMi4xLmd6JworZWNobyAiLlxcXCIiCitlY2hvICIucGwgXG4obmx1KzEwIgorKSB8IGd0YmwgfCBucm9mZiAtVGxhdGluMSAtbWFuZG9jIHwgbGVzcworCisqLworCitzdGF0aWMgaW50IHNob3dfbWFucGFnZShjb25zdCBjaGFyICpwYWdlciwgY2hhciAqbWFuX2ZpbGVuYW1lLCBpbnQgbWFuLCBpbnQgbGV2ZWwpOworCitzdGF0aWMgaW50IHJ1bl9waXBlKGNvbnN0IGNoYXIgKnBhZ2VyLCBjaGFyICptYW5fZmlsZW5hbWUsIGludCBtYW4sIGludCBsZXZlbCkKK3sKKwljaGFyICpjbWQ7CisKKwkvKiBQcmV2ZW50IG1hbiBwYWdlIGxpbmsgbG9vcHMgKi8KKwlpZiAobGV2ZWwgPiAxMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYWNjZXNzKG1hbl9maWxlbmFtZSwgUl9PSykgIT0gMCkKKwkJcmV0dXJuIDA7CisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF93KSB7CisJCXB1dHMobWFuX2ZpbGVuYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJaWYgKG1hbikgeyAvKiBtYW4gcGFnZSwgbm90IGNhdCBwYWdlICovCisJCS8qIElzIHRoaXMgYSBsaW5rIHRvIGFub3RoZXIgbWFucGFnZT8gKi8KKwkJLyogVGhlIGxpbmsgaGFzIHRoZSBmb2xsb3dpbmcgb24gdGhlIGZpcnN0IGxpbmU6ICovCisJCS8qICIuc28gYW5vdGhlcl9tYW5fcGFnZSIgKi8KKworCQlzdHJ1Y3Qgc3RhdCBzYjsKKwkJY2hhciAqbGluZTsKKwkJY2hhciAqbGlua25hbWUsICpwOworCisJCS8qIE9uIG15IHN5c3RlbToKKwkJICogbWFuMS9nZW5ob3N0aWQuMS5nejogMjAzIGJ5dGVzIC0gc21hbGxlc3QgcmVhbCBtYW5wYWdlCisJCSAqIG1hbjIvcGF0aF9yZXNvbHV0aW9uLjIuZ3o6IDExNCBieXRlcyAtIGxhcmdlc3QgbGluaworCQkgKi8KKwkJeHN0YXQobWFuX2ZpbGVuYW1lLCAmc2IpOworCQlpZiAoc2Iuc3Rfc2l6ZSA+IDMwMCkgLyogZXJyIG9uIHRoZSBzYWZlIHNpZGUgKi8KKwkJCWdvdG8gb3JkaW5hcnlfbWFucGFnZTsKKworCQlsaW5lID0geG1hbGxvY19vcGVuX3ppcHBlZF9yZWFkX2Nsb3NlKG1hbl9maWxlbmFtZSwgTlVMTCk7CisJCWlmICghbGluZSB8fCAhaXNfcHJlZml4ZWRfd2l0aChsaW5lLCAiLnNvICIpKSB7CisJCQlmcmVlKGxpbmUpOworCQkJZ290byBvcmRpbmFyeV9tYW5wYWdlOworCQl9CisJCS8qIEV4YW1wbGU6IG1hbjIvcGF0aF9yZXNvbHV0aW9uLjIuZ3ogY29udGFpbnMKKwkJICogIi5zbyBtYW43L3BhdGhfcmVzb2x1dGlvbi43XG48anVuaz4iCisJCSAqLworCQkqc3RyY2hybnVsKGxpbmUsICdcbicpID0gJ1wwJzsKKwkJbGlua25hbWUgPSBza2lwX3doaXRlc3BhY2UoJmxpbmVbNF0pOworCisJCS8qIElmIGxpbmsgaGFzIG5vIHNsYXNoZXMsIHdlIGp1c3QgcmVwbGFjZSBtYW4gcGFnZSBuYW1lLgorCQkgKiBJZiBsaW5rIGhhcyBzbGFzaGVzIChob3dldmVyIG1hbnkpLCB3ZSBnbyBiYWNrICpvbmNlKi4KKwkJICogIi5zbyB6enovZ2dnL3BhZ2UuMyIgZG9lcyBOT1QgZ28gYmFjayB0d28gbGV2ZWxzLiAqLworCQlwID0gc3RycmNocihtYW5fZmlsZW5hbWUsICcvJyk7CisJCWlmICghcCkKKwkJCWdvdG8gb3JkaW5hcnlfbWFucGFnZTsKKwkJKnAgPSAnXDAnOworCQlpZiAoc3RyY2hyKGxpbmtuYW1lLCAnLycpKSB7CisJCQlwID0gc3RycmNocihtYW5fZmlsZW5hbWUsICcvJyk7CisJCQlpZiAoIXApCisJCQkJZ290byBvcmRpbmFyeV9tYW5wYWdlOworCQkJKnAgPSAnXDAnOworCQl9CisKKwkJLyogTGlua3MgZG8gbm90IGhhdmUgLmd6IGV4dGVuc2lvbnMsIGV2ZW4gaWYgbWFucGFnZQorCQkgKiBpcyBjb21wcmVzc2VkICovCisJCW1hbl9maWxlbmFtZSA9IHhhc3ByaW50ZigiJXMvJXMiLCBtYW5fZmlsZW5hbWUsIGxpbmtuYW1lKTsKKwkJZnJlZShsaW5lKTsKKwkJLyogTm90ZTogd2UgbGVhayAibmV3IiBtYW5fZmlsZW5hbWUgc3RyaW5nIGFzIHdlbGwuLi4gKi8KKwkJaWYgKHNob3dfbWFucGFnZShwYWdlciwgbWFuX2ZpbGVuYW1lLCBtYW4sIGxldmVsICsgMSkpCisJCQlyZXR1cm4gMTsKKwkJLyogZWxzZTogc2hvdyB0aGUgbGluaywgaXQncyBiZXR0ZXIgdGhhbiBub3RoaW5nICovCisJfQorCisgb3JkaW5hcnlfbWFucGFnZToKKwljbG9zZShTVERJTl9GSUxFTk8pOworCW9wZW5femlwcGVkKG1hbl9maWxlbmFtZSwgLypmYWlsX2lmX25vdF9jb21wcmVzc2VkOiovIDApOyAvKiBndWFyYW50ZWVkIHRvIHVzZSBmZCAwIChTVERJTl9GSUxFTk8pICovCisJLyogIjI+JjEiIGlzIGFkZGVkIHNvIHRoYXQgbnJvZmYgZXJyb3JzIGFyZSBzaG93biBpbiBwYWdlciB0b28uCisJICogT3RoZXJ3aXNlIGl0IG1heSBzaG93IGp1c3QgZW1wdHkgc2NyZWVuICovCisJY21kID0geGFzcHJpbnRmKAorCQkvKiByZXBsYWNlZCAtVGxhdGluMSB3aXRoIC1UYXNjaWkgZm9yIG5vbi1VVEY4IGRpc3BsYXlzICovCisJCW1hbiA/ICJndGJsIHwgbnJvZmYgLVRhc2NpaSAtbWFuZG9jIDI+JjEgfCAlcyIKKwkJICAgIDogIiVzIiwKKwkJcGFnZXIpOworCXN5c3RlbShjbWQpOworCWZyZWUoY21kKTsKKwlyZXR1cm4gMTsKK30KKworLyogbWFuX2ZpbGVuYW1lIGlzIG9mIHRoZSBmb3JtICIvZGlyL2Rpci9kaXIvbmFtZS5zIiAqLworc3RhdGljIGludCBzaG93X21hbnBhZ2UoY29uc3QgY2hhciAqcGFnZXIsIGNoYXIgKm1hbl9maWxlbmFtZSwgaW50IG1hbiwgaW50IGxldmVsKQoreworI2lmIFNFQU1MRVNTX0NPTVBSRVNTSU9OCisJLyogV2UgbGVhayB0aGlzIGFsbG9jYXRpb24uLi4gKi8KKwljaGFyICpmaWxlbmFtZV93aXRoX3pleHQgPSB4YXNwcmludGYoIiVzLmx6bWEiLCBtYW5fZmlsZW5hbWUpOworCWNoYXIgKmV4dCA9IHN0cnJjaHIoZmlsZW5hbWVfd2l0aF96ZXh0LCAnLicpICsgMTsKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0VBTUxFU1NfTFpNQQorCWlmIChydW5fcGlwZShwYWdlciwgZmlsZW5hbWVfd2l0aF96ZXh0LCBtYW4sIGxldmVsKSkKKwkJcmV0dXJuIDE7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19YWgorCXN0cmNweShleHQsICJ4eiIpOworCWlmIChydW5fcGlwZShwYWdlciwgZmlsZW5hbWVfd2l0aF96ZXh0LCBtYW4sIGxldmVsKSkKKwkJcmV0dXJuIDE7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRUFNTEVTU19CWjIKKwlzdHJjcHkoZXh0LCAiYnoyIik7CisJaWYgKHJ1bl9waXBlKHBhZ2VyLCBmaWxlbmFtZV93aXRoX3pleHQsIG1hbiwgbGV2ZWwpKQorCQlyZXR1cm4gMTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1NFQU1MRVNTX0daCisJc3RyY3B5KGV4dCwgImd6Iik7CisJaWYgKHJ1bl9waXBlKHBhZ2VyLCBmaWxlbmFtZV93aXRoX3pleHQsIG1hbiwgbGV2ZWwpKQorCQlyZXR1cm4gMTsKKyNlbmRpZgorCisJcmV0dXJuIHJ1bl9waXBlKHBhZ2VyLCBtYW5fZmlsZW5hbWUsIG1hbiwgbGV2ZWwpOworfQorCitzdGF0aWMgY2hhciAqKmFkZF9NQU5QQVRIKGNoYXIgKiptYW5fcGF0aF9saXN0LCBpbnQgKmNvdW50X21wLCBjaGFyICpwYXRoKQoreworCWlmIChwYXRoKSB3aGlsZSAoKnBhdGgpIHsKKwkJY2hhciAqbmV4dF9wYXRoOworCQljaGFyICoqcGF0aF9lbGVtZW50OworCisJCW5leHRfcGF0aCA9IHN0cmNocihwYXRoLCAnOicpOworCQlpZiAobmV4dF9wYXRoKSB7CisJCQlpZiAobmV4dF9wYXRoID09IHBhdGgpIC8qICI6OiI/ICovCisJCQkJZ290byBuZXh0OworCQkJKm5leHRfcGF0aCA9ICdcMCc7CisJCX0KKwkJLyogRG8gd2UgYWxyZWFkeSBoYXZlIHBhdGg/ICovCisJCXBhdGhfZWxlbWVudCA9IG1hbl9wYXRoX2xpc3Q7CisJCWlmIChwYXRoX2VsZW1lbnQpIHdoaWxlICgqcGF0aF9lbGVtZW50KSB7CisJCQlpZiAoc3RyY21wKCpwYXRoX2VsZW1lbnQsIHBhdGgpID09IDApCisJCQkJZ290byBza2lwOworCQkJcGF0aF9lbGVtZW50Kys7CisJCX0KKwkJbWFuX3BhdGhfbGlzdCA9IHhyZWFsbG9jX3ZlY3RvcihtYW5fcGF0aF9saXN0LCA0LCAqY291bnRfbXApOworCQltYW5fcGF0aF9saXN0Wypjb3VudF9tcF0gPSB4c3RyZHVwKHBhdGgpOworCQkoKmNvdW50X21wKSsrOworCQkvKiBtYW5fcGF0aF9saXN0IGlzIE5VTEwgdGVybWluYXRlZCAqLworCQkvKiBtYW5fcGF0aF9saXN0Wypjb3VudF9tcF0gPSBOVUxMOyAtIHhyZWFsbG9jX3ZlY3RvciBkaWQgaXQgKi8KKyBza2lwOgorCQlpZiAoIW5leHRfcGF0aCkKKwkJCWJyZWFrOworCQkvKiAicGF0aCIgbWF5IGJlIGEgcmVzdWx0IG9mIGdldGVudigpLCBiZSBuaWNlIGFuZCBkb24ndCBtYW5nbGUgaXQgKi8KKwkJKm5leHRfcGF0aCA9ICc6JzsKKyBuZXh0OgorCQlwYXRoID0gbmV4dF9wYXRoICsgMTsKKwl9CisJcmV0dXJuIG1hbl9wYXRoX2xpc3Q7Cit9CisKK2ludCBtYW5fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1hbl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJcGFyc2VyX3QgKnBhcnNlcjsKKwljb25zdCBjaGFyICpwYWdlciA9IEVOQUJMRV9MRVNTID8gImxlc3MiIDogIm1vcmUiOworCWNoYXIgKnNlY19saXN0OworCWNoYXIgKmN1cl9wYXRoLCAqY3VyX3NlY3Q7CisJY2hhciAqKm1hbl9wYXRoX2xpc3Q7CisJaW50IGNvdW50X21wOworCWludCBjdXJfbXA7CisJaW50IG9wdCwgbm90X2ZvdW5kOworCWNoYXIgKnRva2VuWzJdOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiOyAvKiBhdCBsZWFzdCBvbmUgYXJndW1lbnQgKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiK2F3Iik7CisJYXJndiArPSBvcHRpbmQ7CisKKwlzZWNfbGlzdCA9IHhzdHJkdXAoIjBwOjE6MXA6MjozOjNwOjQ6NTo2Ojc6ODo5Iik7CisKKwljb3VudF9tcCA9IDA7CisJbWFuX3BhdGhfbGlzdCA9IGFkZF9NQU5QQVRIKE5VTEwsICZjb3VudF9tcCwKKwkJCWdldGVudigiTUFOREFUT1JZX01BTlBBVEgiKzEwKSAvKiAiTUFOUEFUSCIgKi8KKwkpOworCWlmICghbWFuX3BhdGhfbGlzdCkgeworCQkvKiBkZWZhdWx0LCBtYXkgYmUgb3ZlcnJpZGRlbiBieSAvZXRjL21hbi5jb25mICovCisJCW1hbl9wYXRoX2xpc3QgPSB4emFsbG9jKDIgKiBzaXplb2YobWFuX3BhdGhfbGlzdFswXSkpOworCQltYW5fcGF0aF9saXN0WzBdID0gKGNoYXIqKSIvdXNyL21hbiI7CisJCS8qIGNvdW50X21wIHN0YXlzIDAuCisJCSAqIFRodXMsIG1hbi5jb25mIHdpbGwgb3ZlcndyaXRlIG1hbl9wYXRoX2xpc3RbMF0KKwkJICogaWYgYSBwYXRoIGlzIGRlZmluZWQgdGhlcmUuCisJCSAqLworCX0KKworCS8qIFBhcnNlIG1hbi5jb25mW2lnXSBvciBtYW5fZGIuY29uZiAqLworCS8qIG1hbiB2ZXJzaW9uIDEuNmYgdXNlcyBtYW4uY29uZmlnICovCisJLyogbWFuLWRiIGltcGxlbWVudGF0aW9uIG9mIG1hbiB1c2VzIG1hbl9kYi5jb25mICovCisJcGFyc2VyID0gY29uZmlnX29wZW4yKCIvZXRjL21hbi5jb25maWciLCBmb3Blbl9mb3JfcmVhZCk7CisJaWYgKCFwYXJzZXIpCisJCXBhcnNlciA9IGNvbmZpZ19vcGVuMigiL2V0Yy9tYW4uY29uZiIsIGZvcGVuX2Zvcl9yZWFkKTsKKwlpZiAoIXBhcnNlcikKKwkJcGFyc2VyID0gY29uZmlnX29wZW4yKCIvZXRjL21hbl9kYi5jb25mIiwgZm9wZW5fZm9yX3JlYWQpOworCisJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW4sIDIsIDAsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQlpZiAoIXRva2VuWzFdKQorCQkJY29udGludWU7CisJCWlmIChzdHJjbXAoIkRFRklORSIsIHRva2VuWzBdKSA9PSAwKSB7CisJCQlpZiAoaXNfcHJlZml4ZWRfd2l0aCgicGFnZXIiLCB0b2tlblsxXSkpIHsKKwkJCQlwYWdlciA9IHhzdHJkdXAoc2tpcF93aGl0ZXNwYWNlKHRva2VuWzFdKSArIDUpOworCQkJfQorCQl9IGVsc2UKKwkJaWYgKHN0cmNtcCgiTUFOREFUT1JZX01BTlBBVEgiKzEwLCB0b2tlblswXSkgPT0gMCAvKiAiTUFOUEFUSCI/ICovCisJCSB8fCBzdHJjbXAoIk1BTkRBVE9SWV9NQU5QQVRIIiwgdG9rZW5bMF0pID09IDAKKwkJKSB7CisJCQltYW5fcGF0aF9saXN0ID0gYWRkX01BTlBBVEgobWFuX3BhdGhfbGlzdCwgJmNvdW50X21wLCB0b2tlblsxXSk7CisJCX0KKwkJaWYgKHN0cmNtcCgiTUFOU0VDVCIsIHRva2VuWzBdKSA9PSAwKSB7CisJCQlmcmVlKHNlY19saXN0KTsKKwkJCXNlY19saXN0ID0geHN0cmR1cCh0b2tlblsxXSk7CisJCX0KKwl9CisJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisKKwl7CisJCS8qIGVudmlyb25tZW50IG92ZXJyaWRlcyBzZXR0aW5nIGZyb20gbWFuLmNvbmZpZyAqLworCQljaGFyICplbnZfcGFnZXIgPSBnZXRlbnYoIk1BTlBBR0VSIik7CisJCWlmICghZW52X3BhZ2VyKQorCQkJZW52X3BhZ2VyID0gZ2V0ZW52KCJQQUdFUiIpOworCQlpZiAoZW52X3BhZ2VyKQorCQkJcGFnZXIgPSBlbnZfcGFnZXI7CisJfQorCisJbm90X2ZvdW5kID0gMDsKKwlkbyB7IC8qIGZvciBlYWNoIGFyZ3ZbXSAqLworCQlpbnQgZm91bmQgPSAwOworCQljdXJfbXAgPSAwOworCisJCWlmIChzdHJjaHIoKmFyZ3YsICcvJykpIHsKKwkJCWZvdW5kID0gc2hvd19tYW5wYWdlKHBhZ2VyLCAqYXJndiwgLyptYW46Ki8gMSwgMCk7CisJCQlnb3RvIGNoZWNrX2ZvdW5kOworCQl9CisJCXdoaWxlICgoY3VyX3BhdGggPSBtYW5fcGF0aF9saXN0W2N1cl9tcCsrXSkgIT0gTlVMTCkgeworCQkJLyogZm9yIGVhY2ggTUFOUEFUSCAqLworCQkJY3VyX3NlY3QgPSBzZWNfbGlzdDsKKwkJCWRvIHsgLyogZm9yIGVhY2ggc2VjdGlvbiAqLworCQkJCWNoYXIgKm5leHRfc2VjdCA9IHN0cmNocm51bChjdXJfc2VjdCwgJzonKTsKKwkJCQlpbnQgc2VjdF9sZW4gPSBuZXh0X3NlY3QgLSBjdXJfc2VjdDsKKwkJCQljaGFyICptYW5fZmlsZW5hbWU7CisJCQkJaW50IGNhdDBtYW4xID0gMDsKKworCQkJCS8qIFNlYXJjaCBmb3IgY2F0LCB0aGVuIG1hbiBwYWdlICovCisJCQkJd2hpbGUgKGNhdDBtYW4xIDwgMikgeworCQkJCQlpbnQgZm91bmRfaGVyZTsKKwkJCQkJbWFuX2ZpbGVuYW1lID0geGFzcHJpbnRmKCIlcy8lcyUuKnMvJXMuJS4qcyIsCisJCQkJCQkJY3VyX3BhdGgsCisJCQkJCQkJImNhdFwwbWFuIiArIChjYXQwbWFuMSAqIDQpLAorCQkJCQkJCXNlY3RfbGVuLCBjdXJfc2VjdCwKKwkJCQkJCQkqYXJndiwKKwkJCQkJCQlzZWN0X2xlbiwgY3VyX3NlY3QpOworCQkJCQlmb3VuZF9oZXJlID0gc2hvd19tYW5wYWdlKHBhZ2VyLCBtYW5fZmlsZW5hbWUsIGNhdDBtYW4xLCAwKTsKKwkJCQkJZm91bmQgfD0gZm91bmRfaGVyZTsKKwkJCQkJY2F0MG1hbjEgKz0gZm91bmRfaGVyZSArIDE7CisJCQkJCWZyZWUobWFuX2ZpbGVuYW1lKTsKKwkJCQl9CisKKwkJCQlpZiAoZm91bmQgJiYgIShvcHQgJiBPUFRfYSkpCisJCQkJCWdvdG8gbmV4dF9hcmc7CisJCQkJY3VyX3NlY3QgPSBuZXh0X3NlY3Q7CisJCQkJd2hpbGUgKCpjdXJfc2VjdCA9PSAnOicpCisJCQkJCWN1cl9zZWN0Kys7CisJCQl9IHdoaWxlICgqY3VyX3NlY3QpOworCQl9CisgY2hlY2tfZm91bmQ6CisJCWlmICghZm91bmQpIHsKKwkJCWJiX2Vycm9yX21zZygibm8gbWFudWFsIGVudHJ5IGZvciAnJXMnIiwgKmFyZ3YpOworCQkJbm90X2ZvdW5kID0gMTsKKwkJfQorIG5leHRfYXJnOgorCQlhcmd2Kys7CisJfSB3aGlsZSAoKmFyZ3YpOworCisJcmV0dXJuIG5vdF9mb3VuZDsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9taWNyb2NvbS5jIGIvbWlzY3V0aWxzL21pY3JvY29tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUyOWExYQotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9taWNyb2NvbS5jCkBAIC0wLDAgKzEsMTgzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBiYXJlIGJvbmVzICd0YWxrIHRvIG1vZGVtJyBwcm9ncmFtIC0gc2ltaWxhciB0byAnY3UgLWwgJGRldmljZScKKyAqIGluc3BpcmVkIGJ5IG1nZXR0eSdzIG1pY3JvY29tCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBtaWNyb2NvbV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1kIERFTEFZXSBbLXQgVElNRU9VVF0gWy1zIFNQRUVEXSBbLVhdIFRUWSIKKy8vdXNhZ2U6I2RlZmluZSBtaWNyb2NvbV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvcHkgYnl0ZXMgZm9yIHN0ZGluIHRvIFRUWSBhbmQgZnJvbSBUVFkgdG8gc3Rkb3V0XG4iCisvL3VzYWdlOiAgICAgIlxuCS1kCVdhaXQgdXAgdG8gREVMQVkgbXMgZm9yIFRUWSBvdXRwdXQgYmVmb3JlIHNlbmRpbmcgZXZlcnkiCisvL3VzYWdlOiAgICAgIlxuCQluZXh0IGJ5dGUgdG8gaXQiCisvL3VzYWdlOiAgICAgIlxuCS10CUV4aXQgaWYgYm90aCBzdGRpbiBhbmQgVFRZIGFyZSBzaWxlbnQgZm9yIFRJTUVPVVQgbXMiCisvL3VzYWdlOiAgICAgIlxuCS1zCVNldCBzZXJpYWwgbGluZSB0byBTUEVFRCIKKy8vdXNhZ2U6ICAgICAiXG4JLVgJRGlzYWJsZSBzcGVjaWFsIG1lYW5pbmcgb2YgTlVMIGFuZCBDdHJsLVggZnJvbSBzdGRpbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8vIHNldCByYXcgdHR5IG1vZGUKK3N0YXRpYyB2b2lkIHhnZXQxKGludCBmZCwgc3RydWN0IHRlcm1pb3MgKnQsIHN0cnVjdCB0ZXJtaW9zICpvbGR0KQoreworCXRjZ2V0YXR0cihmZCwgb2xkdCk7CisJKnQgPSAqb2xkdDsKKwljZm1ha2VyYXcodCk7CisvLwl0LT5jX2xmbGFnICY9IH4oSVNJR3xJQ0FOT058RUNIT3xJRVhURU4pOworLy8JdC0+Y19pZmxhZyAmPSB+KEJSS0lOVHxJWE9OfElDUk5MKTsKKy8vCXQtPmNfb2ZsYWcgJj0gfihPTkxDUik7CisvLwl0LT5jX2NjW1ZNSU5dICA9IDE7CisvLwl0LT5jX2NjW1ZUSU1FXSA9IDA7Cit9CisKK3N0YXRpYyBpbnQgeHNldDEoaW50IGZkLCBzdHJ1Y3QgdGVybWlvcyAqdGlvLCBjb25zdCBjaGFyICpkZXZpY2UpCit7CisJaW50IHJldCA9IHRjc2V0YXR0cihmZCwgVENTQUZMVVNILCB0aW8pOworCisJaWYgKHJldCkgeworCQliYl9wZXJyb3JfbXNnKCJjYW4ndCB0Y3NldGF0dHIgZm9yICVzIiwgZGV2aWNlKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworaW50IG1pY3JvY29tX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBtaWNyb2NvbV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHNmZDsKKwlpbnQgbmZkOworCXN0cnVjdCBwb2xsZmQgcGZkWzJdOworCXN0cnVjdCB0ZXJtaW9zIHRpbzAsIHRpb3NmZCwgdGlvOworCWNoYXIgKmRldmljZV9sb2NrX2ZpbGU7CisJZW51bSB7CisJCU9QVF9YID0gMSA8PCAwLCAvLyBkbyBub3QgcmVzcGVjdCBDdHJsLVgsIEN0cmwtQAorCQlPUFRfcyA9IDEgPDwgMSwgLy8gYmF1ZHJhdGUKKwkJT1BUX2QgPSAxIDw8IDIsIC8vIHdhaXQgZm9yIGRldmljZSByZXNwb25zZSwgbXMKKwkJT1BUX3QgPSAxIDw8IDMsIC8vIHRpbWVvdXQsIG1zCisJfTsKKwlzcGVlZF90IHNwZWVkID0gOTYwMDsKKwlpbnQgZGVsYXkgPSAtMTsKKwlpbnQgdGltZW91dCA9IC0xOworCXVuc2lnbmVkIG9wdHM7CisKKwkvLyBmZXRjaCBvcHRpb25zCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTE6cys6ZCs6dCsiOyAvLyBleGFjdGx5IG9uZSBhcmcsIG51bWVyaWMgb3B0aW9ucworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiWHM6ZDp0OiIsICZzcGVlZCwgJmRlbGF5LCAmdGltZW91dCk7CisvLwlhcmdjIC09IG9wdGluZDsKKwlhcmd2ICs9IG9wdGluZDsKKworCS8vIHRyeSB0byBjcmVhdGUgbG9jayBmaWxlIGluIC92YXIvbG9jaworCWRldmljZV9sb2NrX2ZpbGUgPSAoY2hhciAqKWJiX2Jhc2VuYW1lKGFyZ3ZbMF0pOworCWRldmljZV9sb2NrX2ZpbGUgPSB4YXNwcmludGYoIi92YXIvbG9jay9MQ0suLiVzIiwgZGV2aWNlX2xvY2tfZmlsZSk7CisJc2ZkID0gb3BlbihkZXZpY2VfbG9ja19maWxlLCBPX0NSRUFUIHwgT19XUk9OTFkgfCBPX1RSVU5DIHwgT19FWENMLCAwNjQ0KTsKKwlpZiAoc2ZkIDwgMCkgeworCQkvLyBkZXZpY2UgYWxyZWFkeSBsb2NrZWQgLT4gYmFpbCBvdXQKKwkJaWYgKGVycm5vID09IEVFWElTVCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgY3JlYXRlICclcyciLCBkZXZpY2VfbG9ja19maWxlKTsKKwkJLy8gY2FuJ3QgY3JlYXRlIGxvY2sgLT4gZG9uJ3QgY2FyZQorCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQlmcmVlKGRldmljZV9sb2NrX2ZpbGUpOworCQlkZXZpY2VfbG9ja19maWxlID0gTlVMTDsKKwl9IGVsc2UgeworCQkvLyAlNGQgdG8gbWFrZSBjb25jdXJyZW50IG1nZXR0eSAoaWYgYW55KSBoYXBweS4KKwkJLy8gTWdldHR5IHRyZWF0cyA0LWJ5dGVzIGxvY2sgZmlsZXMgYXMgYmluYXJ5LAorCQkvLyBub3QgdGV4dCwgUElELiBNYWtpbmcgNSsgY2hhciBmaWxlLiBCcnJyLi4uCisJCWZkcHJpbnRmKHNmZCwgIiU0ZFxuIiwgZ2V0cGlkKCkpOworCQljbG9zZShzZmQpOworCX0KKworCS8vIHNldHVwIHNpZ25hbHMKKwliYl9zaWduYWxzKDAKKwkJKyAoMSA8PCBTSUdIVVApCisJCSsgKDEgPDwgU0lHSU5UKQorCQkrICgxIDw8IFNJR1RFUk0pCisJCSsgKDEgPDwgU0lHUElQRSkKKwkJLCByZWNvcmRfc2lnbm8pOworCisJLy8gZXJyb3IgZXhpdCBjb2RlIGlmIHdlIGZhaWwgdG8gb3BlbiB0aGUgZGV2aWNlCisJYmJfZ290X3NpZ25hbCA9IDE7CisKKwkvLyBvcGVuIGRldmljZQorCXNmZCA9IG9wZW5fb3Jfd2Fybihhcmd2WzBdLCBPX1JEV1IgfCBPX05PQ1RUWSB8IE9fTk9OQkxPQ0spOworCWlmIChzZmQgPCAwKQorCQlnb3RvIGRvbmU7CisJZmNudGwoc2ZkLCBGX1NFVEZMLCBPX1JEV1IpOworCisJLy8gcHV0IGRldmljZSB0byAicmF3IG1vZGUiCisJeGdldDEoc2ZkLCAmdGlvLCAmdGlvc2ZkKTsKKwkvLyBzZXQgZGV2aWNlIHNwZWVkCisJY2ZzZXRzcGVlZCgmdGlvLCB0dHlfdmFsdWVfdG9fYmF1ZChzcGVlZCkpOworCWlmICh4c2V0MShzZmQsICZ0aW8sIGFyZ3ZbMF0pKQorCQlnb3RvIGRvbmU7CisKKwkvLyBwdXQgc3RkaW4gdG8gInJhdyBtb2RlIiAoaWYgc3RkaW4gaXMgYSBUVFkpLAorCS8vIGhhbmRsZSBvbmUgY2hhcmFjdGVyIGF0IGEgdGltZQorCWlmIChpc2F0dHkoU1RESU5fRklMRU5PKSkgeworCQl4Z2V0MShTVERJTl9GSUxFTk8sICZ0aW8sICZ0aW8wKTsKKwkJaWYgKHhzZXQxKFNURElOX0ZJTEVOTywgJnRpbywgInN0ZGluIikpCisJCQlnb3RvIGRvbmU7CisJfQorCisJLy8gbWFpbiBsb29wOiBjaGVjayB3aXRoIHBvbGwoKSwgdGhlbiByZWFkL3dyaXRlIGJ5dGVzIGFjcm9zcworCXBmZFswXS5mZCA9IHNmZDsKKwlwZmRbMF0uZXZlbnRzID0gUE9MTElOOworCXBmZFsxXS5mZCA9IFNURElOX0ZJTEVOTzsKKwlwZmRbMV0uZXZlbnRzID0gUE9MTElOOworCisJYmJfZ290X3NpZ25hbCA9IDA7CisJbmZkID0gMjsKKwkvLyBOb3Qgc2FmZV9wb2xsOiB3ZSB3YW50IHRvIGV4aXQgb24gc2lnbmFsCisJd2hpbGUgKCFiYl9nb3Rfc2lnbmFsICYmIHBvbGwocGZkLCBuZmQsIHRpbWVvdXQpID4gMCkgeworCQlpZiAobmZkID4gMSAmJiBwZmRbMV0ucmV2ZW50cykgeworCQkJY2hhciBjOworCQkJLy8gcmVhZCBmcm9tIHN0ZGluIC0+IHdyaXRlIHRvIGRldmljZQorCQkJaWYgKHNhZmVfcmVhZChTVERJTl9GSUxFTk8sICZjLCAxKSA8IDEpIHsKKwkJCQkvLyBkb24ndCBwb2xsIHN0ZGluIGFueW1vcmUgaWYgd2UgZ290IEVPRi9lcnJvcgorCQkJCW5mZC0tOworCQkJCWdvdG8gc2tpcF93cml0ZTsKKwkJCX0KKwkJCS8vIGRvIHdlIG5lZWQgc3BlY2lhbCBwcm9jZXNzaW5nPworCQkJaWYgKCEob3B0cyAmIE9QVF9YKSkgeworCQkJCS8vIF5AIHNlbmRzIEJyZWFrCisJCQkJaWYgKFZJTlRSID09IGMpIHsKKwkJCQkJdGNzZW5kYnJlYWsoc2ZkLCAwKTsKKwkJCQkJZ290byBza2lwX3dyaXRlOworCQkJCX0KKwkJCQkvLyBeWCBleGl0cworCQkJCWlmICgyNCA9PSBjKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCXdyaXRlKHNmZCwgJmMsIDEpOworCQkJaWYgKGRlbGF5ID49IDApCisJCQkJc2FmZV9wb2xsKHBmZCwgMSwgZGVsYXkpOworc2tpcF93cml0ZTogOworCQl9CisJCWlmIChwZmRbMF0ucmV2ZW50cykgeworI2RlZmluZSBpb2J1ZiBiYl9jb21tb25fYnVmc2l6MQorCQkJc3NpemVfdCBsZW47CisJCQkvLyByZWFkIGZyb20gZGV2aWNlIC0+IHdyaXRlIHRvIHN0ZG91dAorCQkJbGVuID0gc2FmZV9yZWFkKHNmZCwgaW9idWYsIHNpemVvZihpb2J1ZikpOworCQkJaWYgKGxlbiA+IDApCisJCQkJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBpb2J1ZiwgbGVuKTsKKwkJCWVsc2UgeworCQkJCS8vIEVPRi9lcnJvciAtPiBiYWlsIG91dAorCQkJCWJiX2dvdF9zaWduYWwgPSBTSUdIVVA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwkvLyByZXN0b3JlIGRldmljZSBtb2RlCisJdGNzZXRhdHRyKHNmZCwgVENTQUZMVVNILCAmdGlvc2ZkKTsKKworCWlmIChpc2F0dHkoU1RESU5fRklMRU5PKSkKKwkJdGNzZXRhdHRyKFNURElOX0ZJTEVOTywgVENTQUZMVVNILCAmdGlvMCk7CisKK2RvbmU6CisJaWYgKGRldmljZV9sb2NrX2ZpbGUpCisJCXVubGluayhkZXZpY2VfbG9ja19maWxlKTsKKworCXJldHVybiBiYl9nb3Rfc2lnbmFsOworfQpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL21vdW50cG9pbnQuYyBiL21pc2N1dGlscy9tb3VudHBvaW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA0MWY3YwotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9tb3VudHBvaW50LmMKQEAgLTAsMCArMSw5NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbW91bnRwb2ludCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIEJhc2VkIG9uIHN5c3Zpbml0J3MgbW91bnRwb2ludAorICovCisKKy8vdXNhZ2U6I2RlZmluZSBtb3VudHBvaW50X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXFdIDxbLWRuXSBESVIgfCAteCBERVZJQ0U+IgorLy91c2FnZTojZGVmaW5lIG1vdW50cG9pbnRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDaGVjayBpZiB0aGUgZGlyZWN0b3J5IGlzIGEgbW91bnRwb2ludFxuIgorLy91c2FnZTogICAgICJcbgktcQlRdWlldCIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJUHJpbnQgbWFqb3IvbWlub3IgZGV2aWNlIG51bWJlciBvZiB0aGUgZmlsZXN5c3RlbSIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JUHJpbnQgZGV2aWNlIG5hbWUgb2YgdGhlIGZpbGVzeXN0ZW0iCisvL3VzYWdlOiAgICAgIlxuCS14CVByaW50IG1ham9yL21pbm9yIGRldmljZSBudW1iZXIgb2YgdGhlIGJsb2NrZGV2aWNlIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBtb3VudHBvaW50X2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIG1vdW50cG9pbnQgL3Byb2NcbiIKKy8vdXNhZ2U6ICAgICAgICIvcHJvYyBpcyBub3QgYSBtb3VudHBvaW50XG4iCisvL3VzYWdlOiAgICAgICAiJCBtb3VudHBvaW50IC9zeXNcbiIKKy8vdXNhZ2U6ICAgICAgICIvc3lzIGlzIGEgbW91bnRwb2ludFxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IG1vdW50cG9pbnRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1vdW50cG9pbnRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBzdGF0IHN0OworCWNvbnN0IGNoYXIgKm1zZzsKKwljaGFyICphcmc7CisJaW50IHJjLCBvcHQ7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MSI7IC8qIG11c3QgaGF2ZSBvbmUgYXJndW1lbnQgKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAicWR4biIpOworI2RlZmluZSBPUFRfcSAoMSkKKyNkZWZpbmUgT1BUX2QgKDIpCisjZGVmaW5lIE9QVF94ICg0KQorI2RlZmluZSBPUFRfbiAoOCkKKwlhcmcgPSBhcmd2W29wdGluZF07CisJbXNnID0gIiVzIjsKKworCXJjID0gKG9wdCAmIE9QVF94KSA/IHN0YXQoYXJnLCAmc3QpIDogbHN0YXQoYXJnLCAmc3QpOworCWlmIChyYyAhPSAwKQorCQlnb3RvIGVycjsKKworCWlmIChvcHQgJiBPUFRfeCkgeworCQlpZiAoU19JU0JMSyhzdC5zdF9tb2RlKSkgeworCQkJcHJpbnRmKCIldToldVxuIiwgbWFqb3Ioc3Quc3RfcmRldiksCisJCQkJCQltaW5vcihzdC5zdF9yZGV2KSk7CisJCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCQl9CisJCWVycm5vID0gMDsgLyogbWFrZSBwZXJyb3JfbXNnIHdvcmsgYXMgZXJyb3JfbXNnICovCisJCW1zZyA9ICIlczogbm90IGEgYmxvY2sgZGV2aWNlIjsKKwkJZ290byBlcnI7CisJfQorCisJZXJybm8gPSBFTk9URElSOworCWlmIChTX0lTRElSKHN0LnN0X21vZGUpKSB7CisJCWRldl90IHN0X2RldiA9IHN0LnN0X2RldjsKKwkJaW5vX3Qgc3RfaW5vID0gc3Quc3RfaW5vOworCQljaGFyICpwID0geGFzcHJpbnRmKCIlcy8uLiIsIGFyZyk7CisKKwkJaWYgKHN0YXQocCwgJnN0KSA9PSAwKSB7CisJCQkvL2ludCBpc19tbnQgPSAoc3RfZGV2ICE9IHN0LnN0X2RldikgfHwgKHN0X2RldiA9PSBzdC5zdF9kZXYgJiYgc3RfaW5vID09IHN0LnN0X2lubyk7CisJCQlpbnQgaXNfbm90X21udCA9IChzdF9kZXYgPT0gc3Quc3RfZGV2KSAmJiAoc3RfaW5vICE9IHN0LnN0X2lubyk7CisKKwkJCWlmIChvcHQgJiBPUFRfZCkKKwkJCQlwcmludGYoIiV1OiV1XG4iLCBtYWpvcihzdF9kZXYpLCBtaW5vcihzdF9kZXYpKTsKKwkJCWlmIChvcHQgJiBPUFRfbikgeworCQkJCWNvbnN0IGNoYXIgKmQgPSBmaW5kX2Jsb2NrX2RldmljZShhcmcpOworCQkJCS8qIG5hbWUgaXMgdW5kZWZpbmVkLCBidXQgZGV2aWNlIGlzIG1vdW50ZWQgLT4gYW5vbnltb3VzIHN1cGVyYmxvY2shICovCisJCQkJLyogaGFwcGVucyB3aXRoIGJ0cmZzICovCisJCQkJaWYgKCFkKSB7CisJCQkJCWQgPSAiVU5LTk9XTiI7CisJCQkJCS8qIFRPRE86IGl0ZXJhdGUgL3Byb2MvbW91bnRzLCBvciAvcHJvYy9zZWxmL21vdW50aW5mbworCQkJCQkgKiB0byBmaW5kIG91dCB0aGUgZGV2aWNlIG5hbWUgKi8KKwkJCQl9CisJCQkJcHJpbnRmKCIlcyAlc1xuIiwgZCwgYXJnKTsKKwkJCX0KKwkJCWlmICghKG9wdCAmIChPUFRfcSB8IE9QVF9kIHwgT1BUX24pKSkKKwkJCQlwcmludGYoIiVzIGlzICVzYSBtb3VudHBvaW50XG4iLCBhcmcsIGlzX25vdF9tbnQgPyAibm90ICIgOiAiIik7CisJCQlyZXR1cm4gaXNfbm90X21udDsKKwkJfQorCQlhcmcgPSBwOworCQkvKiBlbHNlOiBzdGF0IGhhZCBzZXQgZXJybm8sIGp1c3QgZmFsbCB0aHJvdWdoICovCisJfQorCisgZXJyOgorCWlmICghKG9wdCAmIE9QVF9xKSkKKwkJYmJfcGVycm9yX21zZyhtc2csIGFyZyk7CisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9tdC5jIGIvbWlzY3V0aWxzL210LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBhZmQzYQotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9tdC5jCkBAIC0wLDAgKzEsMTUyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBtdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1mIGRldmljZV0gb3Bjb2RlIHZhbHVlIgorLy91c2FnZTojZGVmaW5lIG10X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ29udHJvbCBtYWduZXRpYyB0YXBlIGRyaXZlIG9wZXJhdGlvblxuIgorLy91c2FnZTogICAgICAgIlxuIgorLy91c2FnZTogICAgICAgIkF2YWlsYWJsZSBPcGNvZGVzOlxuIgorLy91c2FnZTogICAgICAgIlxuIgorLy91c2FnZTogICAgICAgImJzZiBic2ZtIGJzciBic3MgZGF0YWNvbXByZXNzaW9uIGRydmJ1ZmZlciBlb2YgZW9tIGVyYXNlXG4iCisvL3VzYWdlOiAgICAgICAiZnNmIGZzZm0gZnNyIGZzcyBsb2FkIGxvY2sgbWtwYXJ0IG5vcCBvZmZsaW5lIHJhczEgcmFzMlxuIgorLy91c2FnZTogICAgICAgInJhczMgcmVzZXQgcmV0ZW5zaW9uIHJld2luZCByZXdvZmZsaW5lIHNlZWsgc2V0YmxrIHNldGRlbnNpdHlcbiIKKy8vdXNhZ2U6ICAgICAgICJzZXRwYXJ0IHRlbGwgdW5sb2FkIHVubG9jayB3ZW9mIHdzZXQiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5cy9tdGlvLmg+CisKKy8qIG1pc3Npbmc6IGVvZC9zZW9kLCBzdG9wdGlvbnMsIHN0d3J0aHJlc2hvbGQsIGRlbnNpdGllcyAqLworc3RhdGljIGNvbnN0IHNob3J0IG9wY29kZV92YWx1ZVtdID0geworCU1UQlNGLAorCU1UQlNGTSwKKwlNVEJTUiwKKwlNVEJTUywKKwlNVENPTVBSRVNTSU9OLAorCU1URU9NLAorCU1URVJBU0UsCisJTVRGU0YsCisJTVRGU0ZNLAorCU1URlNSLAorCU1URlNTLAorCU1UTE9BRCwKKwlNVExPQ0ssCisJTVRNS1BBUlQsCisJTVROT1AsCisJTVRPRkZMLAorCU1UT0ZGTCwKKwlNVFJBUzEsCisJTVRSQVMyLAorCU1UUkFTMywKKwlNVFJFU0VULAorCU1UUkVURU4sCisJTVRSRVcsCisJTVRTRUVLLAorCU1UU0VUQkxLLAorCU1UU0VUREVOU0lUWSwKKwlNVFNFVERSVkJVRkZFUiwKKwlNVFNFVFBBUlQsCisJTVRURUxMLAorCU1UV1NNLAorCU1UVU5MT0FELAorCU1UVU5MT0NLLAorCU1UV0VPRiwKKwlNVFdFT0YKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIG9wY29kZV9uYW1lW10gQUxJR04xID0KKwkiYnNmIiAgICAgICAgICAgICAiXDAiCisJImJzZm0iICAgICAgICAgICAgIlwwIgorCSJic3IiICAgICAgICAgICAgICJcMCIKKwkiYnNzIiAgICAgICAgICAgICAiXDAiCisJImRhdGFjb21wcmVzc2lvbiIgIlwwIgorCSJlb20iICAgICAgICAgICAgICJcMCIKKwkiZXJhc2UiICAgICAgICAgICAiXDAiCisJImZzZiIgICAgICAgICAgICAgIlwwIgorCSJmc2ZtIiAgICAgICAgICAgICJcMCIKKwkiZnNyIiAgICAgICAgICAgICAiXDAiCisJImZzcyIgICAgICAgICAgICAgIlwwIgorCSJsb2FkIiAgICAgICAgICAgICJcMCIKKwkibG9jayIgICAgICAgICAgICAiXDAiCisJIm1rcGFydCIgICAgICAgICAgIlwwIgorCSJub3AiICAgICAgICAgICAgICJcMCIKKwkib2ZmbGluZSIgICAgICAgICAiXDAiCisJInJld29mZmxpbmUiICAgICAgIlwwIgorCSJyYXMxIiAgICAgICAgICAgICJcMCIKKwkicmFzMiIgICAgICAgICAgICAiXDAiCisJInJhczMiICAgICAgICAgICAgIlwwIgorCSJyZXNldCIgICAgICAgICAgICJcMCIKKwkicmV0ZW5zaW9uIiAgICAgICAiXDAiCisJInJld2luZCIgICAgICAgICAgIlwwIgorCSJzZWVrIiAgICAgICAgICAgICJcMCIKKwkic2V0YmxrIiAgICAgICAgICAiXDAiCisJInNldGRlbnNpdHkiICAgICAgIlwwIgorCSJkcnZidWZmZXIiICAgICAgICJcMCIKKwkic2V0cGFydCIgICAgICAgICAiXDAiCisJInRlbGwiICAgICAgICAgICAgIlwwIgorCSJ3c2V0IiAgICAgICAgICAgICJcMCIKKwkidW5sb2FkIiAgICAgICAgICAiXDAiCisJInVubG9jayIgICAgICAgICAgIlwwIgorCSJlb2YiICAgICAgICAgICAgICJcMCIKKwkid2VvZiIgICAgICAgICAgICAiXDAiOworCitpbnQgbXRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG10X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICpmaWxlID0gIi9kZXYvdGFwZSI7CisJc3RydWN0IG10b3Agb3A7CisJc3RydWN0IG10cG9zIHBvc2l0aW9uOworCWludCBmZCwgbW9kZSwgaWR4OworCisJaWYgKCFhcmd2WzFdKSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlpZiAoc3RyY21wKGFyZ3ZbMV0sICItZiIpID09IDApIHsKKwkJaWYgKCFhcmd2WzJdIHx8ICFhcmd2WzNdKQorCQkJYmJfc2hvd191c2FnZSgpOworCQlmaWxlID0gYXJndlsyXTsKKwkJYXJndiArPSAyOworCX0KKworCWlkeCA9IGluZGV4X2luX3N0cmluZ3Mob3Bjb2RlX25hbWUsIGFyZ3ZbMV0pOworCisJaWYgKGlkeCA8IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bnJlY29nbml6ZWQgb3Bjb2RlICVzIiwgYXJndlsxXSk7CisKKwlvcC5tdF9vcCA9IG9wY29kZV92YWx1ZVtpZHhdOworCWlmIChhcmd2WzJdKQorCQlvcC5tdF9jb3VudCA9IHhhdG9pX3Bvc2l0aXZlKGFyZ3ZbMl0pOworCWVsc2UKKwkJb3AubXRfY291bnQgPSAxOyAgLyogT25lLCBub3QgemVybywgcmlnaHQ/ICovCisKKwlzd2l0Y2ggKG9wY29kZV92YWx1ZVtpZHhdKSB7CisJCWNhc2UgTVRXRU9GOgorCQljYXNlIE1URVJBU0U6CisJCWNhc2UgTVRXU006CisJCWNhc2UgTVRTRVREUlZCVUZGRVI6CisJCQltb2RlID0gT19XUk9OTFk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJbW9kZSA9IE9fUkRPTkxZOworCQkJYnJlYWs7CisJfQorCisJZmQgPSB4b3BlbihmaWxlLCBtb2RlKTsKKworCXN3aXRjaCAob3Bjb2RlX3ZhbHVlW2lkeF0pIHsKKwkJY2FzZSBNVFRFTEw6CisJCQlpb2N0bF9vcl9wZXJyb3JfYW5kX2RpZShmZCwgTVRJT0NQT1MsICZwb3NpdGlvbiwgIiVzIiwgZmlsZSk7CisJCQlwcmludGYoIkF0IGJsb2NrICVkXG4iLCAoaW50KSBwb3NpdGlvbi5tdF9ibGtubyk7CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJaW9jdGxfb3JfcGVycm9yX2FuZF9kaWUoZmQsIE1USU9DVE9QLCAmb3AsICIlcyIsIGZpbGUpOworCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9uYW5kd3JpdGUuYyBiL21pc2N1dGlscy9uYW5kd3JpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDdmYzcyCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL25hbmR3cml0ZS5jCkBAIC0wLDAgKzEsMjc1IEBACisvKgorICogbmFuZHdyaXRlIGFuZCBuYW5kZHVtcCBwb3J0ZWQgdG8gYnVzeWJveCBmcm9tIG10ZC11dGlscworICoKKyAqIEF1dGhvcjogQmFydWNoIFNpYWNoIDxiYXJ1Y2hAdGtvcy5jby5pbD4sIE9yZXggQ29tcHV0ZWQgUmFkaW9ncmFwaHkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIFRPRE86IGFkZCBzdXBwb3J0IGZvciBsYXJnZSAoPjRHQikgTVREIGRldmljZXMKKyAqLworCisvL2NvbmZpZzpjb25maWcgTkFORFdSSVRFCisvL2NvbmZpZzoJYm9vbCAibmFuZHdyaXRlIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CXNlbGVjdCBQTEFURk9STV9MSU5VWAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFdyaXRlIHRvIHRoZSBzcGVjaWZpZWQgTVREIGRldmljZSwgd2l0aCBiYWQgYmxvY2tzIGF3YXJlbmVzcworLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgTkFORERVTVAKKy8vY29uZmlnOglib29sICJuYW5kZHVtcCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglzZWxlY3QgUExBVEZPUk1fTElOVVgKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBEdW1wIHRoZSBjb250ZW50IG9mIHJhdyBOQU5EIGNoaXAKKworLy9hcHBsZXQ6SUZfTkFORFdSSVRFKEFQUExFVChuYW5kd3JpdGUsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8vYXBwbGV0OklGX05BTkREVU1QKEFQUExFVF9PREROQU1FKG5hbmRkdW1wLCBuYW5kd3JpdGUsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QLCBuYW5kZHVtcCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19OQU5EV1JJVEUpICs9IG5hbmR3cml0ZS5vCisvL2tidWlsZDpsaWItJChDT05GSUdfTkFORERVTVApICs9IG5hbmR3cml0ZS5vCisKKy8vdXNhZ2U6I2RlZmluZSBuYW5kd3JpdGVfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIlstcF0gWy1zIEFERFJdIE1URF9ERVZJQ0UgW0ZJTEVdIgorLy91c2FnZTojZGVmaW5lIG5hbmR3cml0ZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZToJIldyaXRlIHRvIE1URF9ERVZJQ0VcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJUGFkIHRvIHBhZ2Ugc2l6ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgQUREUglTdGFydCBhZGRyZXNzIgorCisvL3VzYWdlOiNkZWZpbmUgbmFuZGR1bXBfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIlstb10iIElGX0xPTkdfT1BUUygiIFstLWJiPXBhZGJhZHxza2lwYmFkXSIpICIgWy1zIEFERFJdIFstbCBMRU5dIFstZiBGSUxFXSBNVERfREVWSUNFIgorLy91c2FnZTojZGVmaW5lIG5hbmRkdW1wX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOgkiRHVtcCBNVERfREVWSUNFXG4iCisvL3VzYWdlOiAgICAgIlxuCS1vCUR1bXAgb29iIGRhdGEiCisvL3VzYWdlOiAgICAgIlxuCS1zIEFERFIJU3RhcnQgYWRkcmVzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWwgTEVOCUxlbmd0aCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYgRklMRQlEdW1wIHRvIGZpbGUgKCctJyBmb3Igc3Rkb3V0KSIKKy8vdXNhZ2U6ICAgICBJRl9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgIlxuCS0tYmI9TUVUSE9EOiIKKy8vdXNhZ2U6ICAgICAiXG4JCXNraXBiYWQ6IHNraXAgYmFkIGJsb2NrcyIKKy8vdXNhZ2U6ICAgICAiXG4JCXBhZGJhZDogc3Vic3RpdHV0ZSBiYWQgYmxvY2tzIGJ5IDB4ZmYgKGRlZmF1bHQpIgorLy91c2FnZTogICAgICkKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bXRkL210ZC11c2VyLmg+CisKKyNkZWZpbmUgSVNfTkFORERVTVAgIChFTkFCTEVfTkFORERVTVAgJiYgKCFFTkFCTEVfTkFORFdSSVRFIHx8IChhcHBsZXRfbmFtZVs0XSA9PSAnZCcpKSkKKyNkZWZpbmUgSVNfTkFORFdSSVRFIChFTkFCTEVfTkFORFdSSVRFICYmICghRU5BQkxFX05BTkREVU1QIHx8IChhcHBsZXRfbmFtZVs0XSAhPSAnZCcpKSkKKworI2RlZmluZSBPUFRfcCAgKDEgPDwgMCkgLyogbmFuZHdyaXRlIG9ubHkgKi8KKyNkZWZpbmUgT1BUX28gICgxIDw8IDApIC8qIG5hbmRkdW1wIG9ubHkgKi8KKyNkZWZpbmUgT1BUX3MgICgxIDw8IDEpCisjZGVmaW5lIE9QVF9mICAoMSA8PCAyKQorI2RlZmluZSBPUFRfbCAgKDEgPDwgMykKKyNkZWZpbmUgT1BUX2JiICgxIDw8IDQpIC8qIG11c3QgYmUgdGhlIGxhc3Qgb25lIGluIHRoZSBsaXN0ICovCisKKyNkZWZpbmUgQkJfUEFEQkFEICgxIDw8IDApCisjZGVmaW5lIEJCX1NLSVBCQUQgKDEgPDwgMSkKKworLyogaGVscGVyIGZvciB3cml0aW5nIG91dCAweGZmIGZvciBiYWQgYmxvY2tzIHBhZCAqLworc3RhdGljIHZvaWQgZHVtcF9iYWQoc3RydWN0IG10ZF9pbmZvX3VzZXIgKm1lbWluZm8sIHVuc2lnbmVkIGxlbiwgaW50IG9vYikKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlttZW1pbmZvLT53cml0ZXNpemVdOworCXVuc2lnbmVkIGNvdW50OworCisJLyogcm91bmQgbGVuIHRvIHRoZSBuZXh0IHBhZ2Ugb25seSBpZiBsZW4gaXMgbm90IGFscmVhZHkgb24gYSBwYWdlICovCisJbGVuID0gKChsZW4gLSAxKSB8IChtZW1pbmZvLT53cml0ZXNpemUgLSAxKSkgKyAxOworCisJbWVtc2V0KGJ1ZiwgMHhmZiwgc2l6ZW9mKGJ1ZikpOworCWZvciAoY291bnQgPSAwOyBjb3VudCA8IGxlbjsgY291bnQgKz0gbWVtaW5mby0+d3JpdGVzaXplKSB7CisJCXh3cml0ZShTVERPVVRfRklMRU5PLCBidWYsIG1lbWluZm8tPndyaXRlc2l6ZSk7CisJCWlmIChvb2IpCisJCQl4d3JpdGUoU1RET1VUX0ZJTEVOTywgYnVmLCBtZW1pbmZvLT5vb2JzaXplKTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBuZXh0X2dvb2RfZXJhc2VibG9jayhpbnQgZmQsIHN0cnVjdCBtdGRfaW5mb191c2VyICptZW1pbmZvLAorCQl1bnNpZ25lZCBibG9ja19vZmZzZXQpCit7CisJd2hpbGUgKDEpIHsKKwkJbG9mZl90IG9mZnM7CisKKwkJaWYgKGJsb2NrX29mZnNldCA+PSBtZW1pbmZvLT5zaXplKSB7CisJCQlpZiAoSVNfTkFORFdSSVRFKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJub3QgZW5vdWdoIHNwYWNlIGluIE1URCBkZXZpY2UiKTsKKwkJCXJldHVybiBibG9ja19vZmZzZXQ7IC8qIGxldCB0aGUgY2FsbGVyIGV4aXQgKi8KKwkJfQorCQlvZmZzID0gYmxvY2tfb2Zmc2V0OworCQlpZiAoeGlvY3RsKGZkLCBNRU1HRVRCQURCTE9DSywgJm9mZnMpID09IDApCisJCQlyZXR1cm4gYmxvY2tfb2Zmc2V0OworCQkvKiBpb2N0bCByZXR1cm5lZCAxID0+ICJiYWQgYmxvY2siICovCisJCWlmIChJU19OQU5EV1JJVEUpCisJCQlwcmludGYoIlNraXBwaW5nIGJhZCBibG9jayBhdCAweCUwOHhcbiIsIGJsb2NrX29mZnNldCk7CisJCWJsb2NrX29mZnNldCArPSBtZW1pbmZvLT5lcmFzZXNpemU7CisJfQorfQorCitpbnQgbmFuZHdyaXRlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBuYW5kd3JpdGVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCS8qIEJ1ZmZlciBmb3IgT09CIGRhdGEgKi8KKwl1bnNpZ25lZCBjaGFyICpvb2JidWY7CisJdW5zaWduZWQgb3B0czsKKwl1bnNpZ25lZCBiYl9tZXRob2QgPSBCQl9TS0lQQkFEOworCWludCBmZDsKKwlzc2l6ZV90IGNudDsKKwl1bnNpZ25lZCBtdGRvZmZzZXQsIG1lbWluZm9fd3JpdGVzaXplLCBibG9ja3N0YXJ0LCBsaW1pdDsKKwl1bnNpZ25lZCBlbmRfYWRkciA9IH4wOworCXN0cnVjdCBtdGRfaW5mb191c2VyIG1lbWluZm87CisJc3RydWN0IG10ZF9vb2JfYnVmIG9vYjsKKwl1bnNpZ25lZCBjaGFyICpmaWxlYnVmOworCWNvbnN0IGNoYXIgKm9wdF9zID0gIjAiLCAqb3B0X2YgPSAiLSIsICpvcHRfbCwgKm9wdF9iYjsKKworCWlmIChJU19OQU5ERFVNUCkgeworCQlvcHRfY29tcGxlbWVudGFyeSA9ICI9MSI7CisjaWYgRU5BQkxFX0xPTkdfT1BUUworCQlhcHBsZXRfbG9uZ19vcHRpb25zID0KKwkJCSJiYlwwIiBSZXF1aXJlZF9hcmd1bWVudCAiXHhmZiI7IC8qIG5vIHNob3J0IGVxdWl2YWxlbnQgKi8KKyNlbmRpZgorCQlvcHRzID0gZ2V0b3B0MzIoYXJndiwgIm9zOmY6bDoiLCAmb3B0X3MsICZvcHRfZiwgJm9wdF9sLCAmb3B0X2JiKTsKKwl9IGVsc2UgeyAvKiBuYW5kd3JpdGUgKi8KKwkJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTE6PzIiOworCQlvcHRzID0gZ2V0b3B0MzIoYXJndiwgInBzOiIsICZvcHRfcyk7CisJfQorCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKElTX05BTkRXUklURSAmJiBhcmd2WzFdKQorCQlvcHRfZiA9IGFyZ3ZbMV07CisJaWYgKCFMT05FX0RBU0gob3B0X2YpKSB7CisJCWludCB0bXBfZmQgPSB4b3BlbihvcHRfZiwKKwkJCUlTX05BTkREVU1QID8gT19XUk9OTFkgfCBPX1RSVU5DIHwgT19DUkVBVCA6IE9fUkRPTkxZCisJCSk7CisJCXhtb3ZlX2ZkKHRtcF9mZCwgSVNfTkFORERVTVAgPyBTVERPVVRfRklMRU5PIDogU1RESU5fRklMRU5PKTsKKwl9CisKKwlmZCA9IHhvcGVuKGFyZ3ZbMF0sIElTX05BTkRXUklURSA/IE9fUkRXUiA6IE9fUkRPTkxZKTsKKwl4aW9jdGwoZmQsIE1FTUdFVElORk8sICZtZW1pbmZvKTsKKworCW10ZG9mZnNldCA9IHhzdHJ0b3Uob3B0X3MsIDApOworCWlmIChJU19OQU5ERFVNUCAmJiAob3B0cyAmIE9QVF9sKSkgeworCQl1bnNpZ25lZCBsZW5ndGggPSB4c3RydG91KG9wdF9sLCAwKTsKKwkJaWYgKGxlbmd0aCA8IG1lbWluZm8uc2l6ZSAtIG10ZG9mZnNldCkKKwkJCWVuZF9hZGRyID0gbXRkb2Zmc2V0ICsgbGVuZ3RoOworCX0KKwlpZiAoSVNfTkFORERVTVAgJiYgKG9wdHMgJiBPUFRfYmIpKSB7CisJCWlmIChzdHJjbXAoInNraXBiYWQiLCBvcHRfYmIpID09IDApCisJCQliYl9tZXRob2QgPSBCQl9TS0lQQkFEOworCQllbHNlIGlmIChzdHJjbXAoInBhZGJhZCIsIG9wdF9iYikgPT0gMCkKKwkJCWJiX21ldGhvZCA9IEJCX1BBREJBRDsKKwkJZWxzZQorCQkJYmJfc2hvd191c2FnZSgpOworCX0KKworCS8qIFB1bGwgaXQgaW50byBhIENQVSByZWdpc3RlciAoaG9wZWZ1bGx5KSAtIHNtYWxsZXIgY29kZSB0aGF0IHdheSAqLworCW1lbWluZm9fd3JpdGVzaXplID0gbWVtaW5mby53cml0ZXNpemU7CisKKwlpZiAobXRkb2Zmc2V0ICYgKG1lbWluZm9fd3JpdGVzaXplIC0gMSkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzdGFydCBhZGRyZXNzIGlzIG5vdCBwYWdlIGFsaWduZWQiKTsKKworCWZpbGVidWYgPSB4bWFsbG9jKG1lbWluZm9fd3JpdGVzaXplKTsKKwlvb2JidWYgPSB4bWFsbG9jKG1lbWluZm8ub29ic2l6ZSk7CisKKwlvb2Iuc3RhcnQgID0gMDsKKwlvb2IubGVuZ3RoID0gbWVtaW5mby5vb2JzaXplOworCW9vYi5wdHIgICAgPSBvb2JidWY7CisKKwlibG9ja3N0YXJ0ID0gbXRkb2Zmc2V0ICYgfihtZW1pbmZvLmVyYXNlc2l6ZSAtIDEpOworCWlmIChibG9ja3N0YXJ0ICE9IG10ZG9mZnNldCkgeworCQl1bnNpZ25lZCB0bXA7CisJCS8qIG10ZG9mZnNldCBpcyBpbiB0aGUgbWlkZGxlIG9mIGFuIGVyYXNlIGJsb2NrLCB2ZXJpZnkgdGhhdAorCQkgKiB0aGlzIGJsb2NrIGlzIE9LLiBBZHZhbmNlIG10ZG9mZnNldCBvbmx5IGlmIHRoaXMgYmxvY2sgaXMKKwkJICogYmFkLgorCQkgKi8KKwkJdG1wID0gbmV4dF9nb29kX2VyYXNlYmxvY2soZmQsICZtZW1pbmZvLCBibG9ja3N0YXJ0KTsKKwkJaWYgKHRtcCAhPSBibG9ja3N0YXJ0KSB7CisJCQkvKiBiYWQgYmxvY2socyksIGFkdmFuY2UgbXRkb2Zmc2V0ICovCisJCQlpZiAoSVNfTkFORERVTVApIHsKKwkJCQlpZiAoYmJfbWV0aG9kID09IEJCX1BBREJBRCkgeworCQkJCQlpbnQgYmFkX2xlbiA9IE1JTih0bXAsIGVuZF9hZGRyKSAtIG10ZG9mZnNldDsKKwkJCQkJZHVtcF9iYWQoJm1lbWluZm8sIGJhZF9sZW4sIG9wdHMgJiBPUFRfbyk7CisJCQkJfQorCQkJCS8qIHdpdGggb3B0aW9uIHNraXBiYWQsIGluY3JlYXNlIHRoZSB0b3RhbCBsZW5ndGggKi8KKwkJCQlpZiAoYmJfbWV0aG9kID09IEJCX1NLSVBCQUQpIHsKKwkJCQkJZW5kX2FkZHIgKz0gKHRtcCAtIGJsb2Nrc3RhcnQpOworCQkJCX0KKwkJCX0KKwkJCW10ZG9mZnNldCA9IHRtcDsKKwkJfQorCX0KKworCWNudCA9IC0xOworCWxpbWl0ID0gTUlOKG1lbWluZm8uc2l6ZSwgZW5kX2FkZHIpOworCXdoaWxlIChtdGRvZmZzZXQgPCBsaW1pdCkgeworCQlpbnQgaW5wdXRfZmQgPSBJU19OQU5EV1JJVEUgPyBTVERJTl9GSUxFTk8gOiBmZDsKKwkJaW50IG91dHB1dF9mZCA9IElTX05BTkRXUklURSA/IGZkIDogU1RET1VUX0ZJTEVOTzsKKworCQlibG9ja3N0YXJ0ID0gbXRkb2Zmc2V0ICYgfihtZW1pbmZvLmVyYXNlc2l6ZSAtIDEpOworCQlpZiAoYmxvY2tzdGFydCA9PSBtdGRvZmZzZXQpIHsKKwkJCS8qIHN0YXJ0aW5nIGEgbmV3IGVyYXNlYmxvY2sgKi8KKwkJCW10ZG9mZnNldCA9IG5leHRfZ29vZF9lcmFzZWJsb2NrKGZkLCAmbWVtaW5mbywgYmxvY2tzdGFydCk7CisJCQlpZiAoSVNfTkFORFdSSVRFKQorCQkJCXByaW50ZigiV3JpdGluZyBhdCAweCUwOHhcbiIsIG10ZG9mZnNldCk7CisJCQllbHNlIGlmIChtdGRvZmZzZXQgPiBibG9ja3N0YXJ0KSB7CisJCQkJaWYgKGJiX21ldGhvZCA9PSBCQl9QQURCQUQpIHsKKwkJCQkJLyogZHVtcCBGRiBwYWRkZWQgYmFkIGJsb2NrICovCisJCQkJCWludCBiYWRfbGVuID0gTUlOKG10ZG9mZnNldCwgbGltaXQpIC0gYmxvY2tzdGFydDsKKwkJCQkJZHVtcF9iYWQoJm1lbWluZm8sIGJhZF9sZW4sIG9wdHMgJiBPUFRfbyk7CisJCQkJfSBlbHNlIGlmIChiYl9tZXRob2QgPT0gQkJfU0tJUEJBRCkgeworCQkJCQkvKiBmb3Igc2tpcGJhZCwgaW5jcmVhc2UgdGhlIGxlbmd0aCAqLworCQkJCQlpZiAoKGVuZF9hZGRyICsgbXRkb2Zmc2V0IC0gYmxvY2tzdGFydCkgPiBlbmRfYWRkcikKKwkJCQkJCWVuZF9hZGRyICs9IChtdGRvZmZzZXQgLSBibG9ja3N0YXJ0KTsKKwkJCQkJZWxzZQorCQkJCQkJZW5kX2FkZHIgPSB+MDsKKwkJCQkJbGltaXQgPSBNSU4obWVtaW5mby5zaXplLCBlbmRfYWRkcik7CisJCQkJfQorCQkJfQorCQkJaWYgKG10ZG9mZnNldCA+PSBsaW1pdCkKKwkJCQlicmVhazsKKwkJfQorCQl4bHNlZWsoZmQsIG10ZG9mZnNldCwgU0VFS19TRVQpOworCisJCS8qIGdldCBzb21lIG1vcmUgZGF0YSBmcm9tIGlucHV0ICovCisJCWNudCA9IGZ1bGxfcmVhZChpbnB1dF9mZCwgZmlsZWJ1ZiwgbWVtaW5mb193cml0ZXNpemUpOworCQlpZiAoY250ID09IDApIHsKKwkJCS8qIGV2ZW4gd2l0aCAtcCwgd2UgZG8gbm90IHBhZCBwYXN0IHRoZSBlbmQgb2YgaW5wdXQKKwkJCSAqICgtcCBvbmx5IHplcm8tcGFkcyBsYXN0IGluY29tcGxldGUgcGFnZSkKKwkJCSAqLworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNudCA8IG1lbWluZm9fd3JpdGVzaXplKSB7CisJCQlpZiAoSVNfTkFORERVTVApCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInNob3J0IHJlYWQiKTsKKwkJCWlmICghKG9wdHMgJiBPUFRfcCkpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImlucHV0IHNpemUgaXMgbm90IHJvdW5kZWQgdXAgdG8gcGFnZSBzaXplLCAiCisJCQkJCQkidXNlIC1wIHRvIHplcm8gcGFkIik7CisJCQkvKiB6ZXJvIHBhZCB0byBlbmQgb2Ygd3JpdGUgYmxvY2sgKi8KKwkJCW1lbXNldChmaWxlYnVmICsgY250LCAwLCBtZW1pbmZvX3dyaXRlc2l6ZSAtIGNudCk7CisJCX0KKwkJeHdyaXRlKG91dHB1dF9mZCwgZmlsZWJ1ZiwgbWVtaW5mb193cml0ZXNpemUpOworCisJCWlmIChJU19OQU5ERFVNUCAmJiAob3B0cyAmIE9QVF9vKSkgeworCQkJLyogRHVtcCBPT0IgZGF0YSAqLworCQkJb29iLnN0YXJ0ID0gbXRkb2Zmc2V0OworCQkJeGlvY3RsKGZkLCBNRU1SRUFET09CLCAmb29iKTsKKwkJCXh3cml0ZShvdXRwdXRfZmQsIG9vYmJ1ZiwgbWVtaW5mby5vb2JzaXplKTsKKwkJfQorCisJCW10ZG9mZnNldCArPSBtZW1pbmZvX3dyaXRlc2l6ZTsKKwkJaWYgKGNudCA8IG1lbWluZm9fd3JpdGVzaXplKQorCQkJYnJlYWs7CisJfQorCisJaWYgKElTX05BTkRXUklURSAmJiBjbnQgIT0gMCkgeworCQkvKiBXZSBmaWxsZWQgZW50aXJlIE1URCwgYnV0IGRpZCB3ZSByZWFjaCBFT0Ygb24gaW5wdXQ/ICovCisJCWlmIChmdWxsX3JlYWQoU1RESU5fRklMRU5PLCBmaWxlYnVmLCBtZW1pbmZvX3dyaXRlc2l6ZSkgIT0gMCkgeworCQkJLyogbm8gKi8KKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJub3QgZW5vdWdoIHNwYWNlIGluIE1URCBkZXZpY2UiKTsKKwkJfQorCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlmcmVlKGZpbGVidWYpOworCQljbG9zZShmZCk7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9yYWlkYXV0b3J1bi5jIGIvbWlzY3V0aWxzL3JhaWRhdXRvcnVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyZDg5MAotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9yYWlkYXV0b3J1bi5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHJhaWRhdXRvcnVuIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICovCisKKy8vdXNhZ2U6I2RlZmluZSByYWlkYXV0b3J1bl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiREVWSUNFIgorLy91c2FnZTojZGVmaW5lIHJhaWRhdXRvcnVuX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVGVsbCB0aGUga2VybmVsIHRvIGF1dG9tYXRpY2FsbHkgc2VhcmNoIGFuZCBzdGFydCBSQUlEIGFycmF5cyIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgcmFpZGF1dG9ydW5fZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgcmFpZGF1dG9ydW4gL2Rldi9tZDAiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KKyNpbmNsdWRlIDxsaW51eC9yYWlkL21kX3UuaD4KKworaW50IHJhaWRhdXRvcnVuX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCByYWlkYXV0b3J1bl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJeGlvY3RsKHhvcGVuKHNpbmdsZV9hcmd2KGFyZ3YpLCBPX1JET05MWSksIFJBSURfQVVUT1JVTiwgTlVMTCk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9yZWFkYWhlYWQuYyBiL21pc2N1dGlscy9yZWFkYWhlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjJhYWE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL3JlYWRhaGVhZC5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHJlYWRhaGVhZCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIFByZWxvYWRzIHRoZSBnaXZlbiBmaWxlcyBpbiBSQU0sIHRvIHJlZHVjZSBhY2Nlc3MgdGltZS4KKyAqIERvZXMgdGhpcyBieSBjYWxsaW5nIHRoZSByZWFkYWhlYWQoMikgc3lzdGVtIGNhbGwuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA2ICBNaWNoYWVsIE9wZGVuYWNrZXIgPG1pY2hhZWxAZnJlZS1lbGVjdHJvbnMuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHJlYWRhaGVhZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHJlYWRhaGVhZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByZWxvYWQgRklMRXMgdG8gUkFNIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IHJlYWRhaGVhZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcmVhZGFoZWFkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmV0dmFsID0gRVhJVF9TVUNDRVNTOworCisJaWYgKCFhcmd2WzFdKSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwl3aGlsZSAoKisrYXJndikgeworCQlpbnQgZmQgPSBvcGVuX29yX3dhcm4oKmFyZ3YsIE9fUkRPTkxZKTsKKwkJaWYgKGZkID49IDApIHsKKwkJCW9mZl90IGxlbjsKKwkJCWludCByOworCisJCQkvKiBmZGxlbmd0aCB3YXMgcmVwb3J0ZWQgdG8gYmUgdW5yZWxpYWJsZSAtIHVzZSBzZWVrICovCisJCQlsZW4gPSB4bHNlZWsoZmQsIDAsIFNFRUtfRU5EKTsKKwkJCXhsc2VlayhmZCwgMCwgU0VFS19TRVQpOworCQkJciA9IHJlYWRhaGVhZChmZCwgMCwgbGVuKTsKKwkJCWNsb3NlKGZkKTsKKwkJCWlmIChyID49IDApCisJCQkJY29udGludWU7CisJCX0KKwkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvcmZraWxsLmMgYi9taXNjdXRpbHMvcmZraWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxMWI2ZgotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9yZmtpbGwuYwpAQCAtMCwwICsxLDE1MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorKiByZmtpbGwgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyoKKyogQ29weXJpZ2h0IChDKSAyMDEwICBNYWxlayBEZWdhY2hpIDxtYWxlay1kZWdhY2hpQGxhcG9zdGUubmV0PgorKgorKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorKi8KKworLy9jb25maWc6Y29uZmlnIFJGS0lMTAorLy9jb25maWc6CWJvb2wgInJma2lsbCIKKy8vY29uZmlnOglkZWZhdWx0IG4gIyBkb2Vzbid0IGJ1aWxkIG9uIFVidW50dSA5LjA0CisvL2NvbmZpZzoJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlL2Rpc2FibGUgd2lyZWxlc3MgZGV2aWNlcy4KKy8vY29uZmlnOgorLy9jb25maWc6CSAgcmZraWxsIGxpc3QgOiBsaXN0IGFsbCB3aXJlbGVzcyBkZXZpY2VzCisvL2NvbmZpZzoJICByZmtpbGwgbGlzdCBibHVldG9vdGggOiBsaXN0IGFsbCBibHVldG9vdGggZGV2aWNlcworLy9jb25maWc6CSAgcmZraWxsIGxpc3QgMSA6IGxpc3QgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGluZGV4CisvL2NvbmZpZzoJICByZmtpbGwgYmxvY2t8dW5ibG9jayB3bGFuIDogYmxvY2svdW5ibG9jayBhbGwgd2xhbih3aWZpKSBkZXZpY2VzCisvL2NvbmZpZzoKKworLy9hcHBsZXQ6SUZfUkZLSUxMKEFQUExFVChyZmtpbGwsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1JGS0lMTCkgKz0gcmZraWxsLm8KKworLy91c2FnZTojZGVmaW5lIHJma2lsbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiQ09NTUFORCBbSU5ERVh8VFlQRV0iCisvL3VzYWdlOiNkZWZpbmUgcmZraWxsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRW5hYmxlL2Rpc2FibGUgd2lyZWxlc3MgZGV2aWNlc1xuIgorLy91c2FnZTogICAgICAgIlxuQ29tbWFuZHM6IgorLy91c2FnZTogICAgICJcbglsaXN0IFtJTkRFWHxUWVBFXQlMaXN0IGN1cnJlbnQgc3RhdGUiCisvL3VzYWdlOiAgICAgIlxuCWJsb2NrIElOREVYfFRZUEUJRGlzYWJsZSBkZXZpY2UiCisvL3VzYWdlOiAgICAgIlxuCXVuYmxvY2sgSU5ERVh8VFlQRQlFbmFibGUgZGV2aWNlIgorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JVFlQRTogYWxsLCB3bGFuKHdpZmkpLCBibHVldG9vdGgsIHV3Yih1bHRyYXdpZGViYW5kKSwiCisvL3VzYWdlOiAgICAgIlxuCQl3aW1heCwgd3dhbiwgZ3BzLCBmbSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bGludXgvcmZraWxsLmg+CisKK2VudW0geworCU9QVF9iID0gKDEgPDwgMCksIC8qIG11c3QgYmUgPSAxICovCisJT1BUX3UgPSAoMSA8PCAxKSwKKwlPUFRfbCA9ICgxIDw8IDIpLAorfTsKKworaW50IHJma2lsbF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcmZraWxsX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgcmZraWxsX2V2ZW50IGV2ZW50OworCWNvbnN0IGNoYXIgKnJmX25hbWU7CisJaW50IHJmX2ZkOworCWludCBtb2RlOworCWludCByZl90eXBlOworCWludCByZl9pZHg7CisJdW5zaWduZWQgcmZfb3B0ID0gMDsKKworCWFyZ3YrKzsKKwkvKiBNdXN0IGhhdmUgb25lIG9yIHR3byBwYXJhbXMgKi8KKwlpZiAoIWFyZ3ZbMF0gfHwgKGFyZ3ZbMV0gJiYgYXJndlsyXSkpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCW1vZGUgPSBPX1JEV1IgfCBPX05PTkJMT0NLOworCXJmX25hbWUgPSBhcmd2WzFdOworCWlmIChzdHJjbXAoYXJndlswXSwgImxpc3QiKSA9PSAwKSB7CisJCXJmX29wdCB8PSBPUFRfbDsKKwkJbW9kZSA9IE9fUkRPTkxZIHwgT19OT05CTE9DSzsKKwl9IGVsc2UgaWYgKHN0cmNtcChhcmd2WzBdLCAiYmxvY2siKSA9PSAwICYmIHJmX25hbWUpIHsKKwkJcmZfb3B0IHw9IE9QVF9iOworCX0gZWxzZSBpZiAoc3RyY21wKGFyZ3ZbMF0sICJ1bmJsb2NrIikgPT0gMCAmJiByZl9uYW1lKSB7CisJCXJmX29wdCB8PSBPUFRfdTsKKwl9IGVsc2UKKwkJYmJfc2hvd191c2FnZSgpOworCisJcmZfdHlwZSA9IFJGS0lMTF9UWVBFX0FMTDsKKwlyZl9pZHggPSAtMTsKKwlpZiAocmZfbmFtZSkgeworCQlzdGF0aWMgY29uc3QgY2hhciByZmtpbGxfdHlwZXNbXSBBTElHTjEgPSAiYWxsXDB3bGFuXDBibHVldG9vdGhcMHV3Ylwwd2ltYXhcMHd3YW5cMGdwc1wwZm1cMCI7CisJCWlmIChzdHJjbXAocmZfbmFtZSwgIndpZmkiKSA9PSAwKQorCQkJcmZfbmFtZSA9ICJ3bGFuIjsKKwkJaWYgKHN0cmNtcChyZl9uYW1lLCAidWx0cmF3aWRlYmFuZCIpID09IDApCisJCQlyZl9uYW1lID0gInV3YiI7CisJCXJmX3R5cGUgPSBpbmRleF9pbl9zdHJpbmdzKHJma2lsbF90eXBlcywgcmZfbmFtZSk7CisJCWlmIChyZl90eXBlIDwgMCkgeworCQkJcmZfaWR4ID0geGF0b2lfcG9zaXRpdmUocmZfbmFtZSk7CisJCX0KKwl9CisKKwlyZl9mZCA9IGRldmljZV9vcGVuKCIvZGV2L3Jma2lsbCIsIG1vZGUpOworCWlmIChyZl9mZCA8IDApCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiL2Rldi9yZmtpbGwiKTsKKworCWlmIChyZl9vcHQgJiBPUFRfbCkgeworCQl3aGlsZSAoZnVsbF9yZWFkKHJmX2ZkLCAmZXZlbnQsIHNpemVvZihldmVudCkpID09IFJGS0lMTF9FVkVOVF9TSVpFX1YxKSB7CisJCQlwYXJzZXJfdCAqcGFyc2VyOworCQkJY2hhciAqdG9rZW5zWzJdOworCQkJY2hhciByZl9zeXNmc1tzaXplb2YoIi9zeXMvY2xhc3MvcmZraWxsL3Jma2lsbCV1L3VldmVudCIpICsgc2l6ZW9mKGludCkqM107CisJCQljaGFyICpuYW1lLCAqdHlwZTsKKworCQkJaWYgKHJmX3R5cGUgJiYgcmZfdHlwZSAhPSBldmVudC50eXBlICYmIHJmX2lkeCA8IDApIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKHJmX2lkeCA+PSAwICYmIGV2ZW50LmlkeCAhPSByZl9pZHgpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJbmFtZSA9IE5VTEw7CisJCQl0eXBlID0gTlVMTDsKKwkJCXNwcmludGYocmZfc3lzZnMsICIvc3lzL2NsYXNzL3Jma2lsbC9yZmtpbGwldS91ZXZlbnQiLCBldmVudC5pZHgpOworCQkJcGFyc2VyID0gY29uZmlnX29wZW4yKHJmX3N5c2ZzLCBmb3Blbl9mb3JfcmVhZCk7CisJCQl3aGlsZSAoY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbnMsIDIsIDIsICJcbj0iLCBQQVJTRV9OT1JNQUwpKSB7CisJCQkJaWYgKHN0cmNtcCh0b2tlbnNbMF0sICJSRktJTExfTkFNRSIpID09IDApIHsKKwkJCQkJbmFtZSA9IHhzdHJkdXAodG9rZW5zWzFdKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmIChzdHJjbXAodG9rZW5zWzBdLCAiUkZLSUxMX1RZUEUiKSA9PSAwKSB7CisJCQkJCXR5cGUgPSB4c3RyZHVwKHRva2Vuc1sxXSk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKwkJCWNvbmZpZ19jbG9zZShwYXJzZXIpOworCisJCQlwcmludGYoIiV1OiAlczogJXNcbiIsIGV2ZW50LmlkeCwgbmFtZSwgdHlwZSk7CisJCQlwcmludGYoIlx0U29mdCBibG9ja2VkOiAlc1xuIiwgZXZlbnQuc29mdCA/ICJ5ZXMiIDogIm5vIik7CisJCQlwcmludGYoIlx0SGFyZCBibG9ja2VkOiAlc1xuIiwgZXZlbnQuaGFyZCA/ICJ5ZXMiIDogIm5vIik7CisJCQlmcmVlKG5hbWUpOworCQkJZnJlZSh0eXBlKTsKKwkJfQorCX0gZWxzZSB7CisJCW1lbXNldCgmZXZlbnQsIDAsIHNpemVvZihldmVudCkpOworCQlpZiAocmZfdHlwZSA+PSAwKSB7CisJCQlldmVudC50eXBlID0gcmZfdHlwZTsKKwkJCWV2ZW50Lm9wID0gUkZLSUxMX09QX0NIQU5HRV9BTEw7CisJCX0KKworCQlpZiAocmZfaWR4ID49IDApIHsKKwkJCWV2ZW50LmlkeCA9IHJmX2lkeDsKKwkJCWV2ZW50Lm9wID0gUkZLSUxMX09QX0NIQU5HRTsKKwkJfQorCisJCS8qIE5vdGU6IE9QVF9iID09IDEgKi8KKwkJZXZlbnQuc29mdCA9IChyZl9vcHQgJiBPUFRfYik7CisKKwkJeHdyaXRlKHJmX2ZkLCAmZXZlbnQsIHNpemVvZihldmVudCkpOworCX0KKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvcnVubGV2ZWwuYyBiL21pc2N1dGlscy9ydW5sZXZlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NThkYjgKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvcnVubGV2ZWwuYwpAQCAtMCwwICsxLDU0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBQcmludHMgb3V0IHRoZSBwcmV2aW91cyBhbmQgdGhlIGN1cnJlbnQgcnVubGV2ZWwuCisgKgorICogVmVyc2lvbjogQCgjKXJ1bmxldmVsICAxLjIwICAxNi1BcHItMTk5NyAgTXZTCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIHN5c3Zpbml0IHN1aXRlLAorICogQ29weXJpZ2h0IDE5OTEtMTk5NyBNaXF1ZWwgdmFuIFNtb29yZW5idXJnLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogaW5pdGlhbGx5IGJ1c3lib3hpZmllZCBieSBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcnVubGV2ZWxfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltGSUxFXSIKKy8vdXNhZ2U6I2RlZmluZSBydW5sZXZlbF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkZpbmQgdGhlIGN1cnJlbnQgYW5kIHByZXZpb3VzIHN5c3RlbSBydW5sZXZlbFxuIgorLy91c2FnZTogICAgICAgIlxuIgorLy91c2FnZTogICAgICAgIklmIG5vIHV0bXAgRklMRSBleGlzdHMgb3IgaWYgbm8gcnVubGV2ZWwgcmVjb3JkIGNhbiBiZSBmb3VuZCxcbiIKKy8vdXNhZ2U6ICAgICAgICJwcmludCBcInVua25vd25cIiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgcnVubGV2ZWxfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgcnVubGV2ZWwgL3Zhci9ydW4vdXRtcFxuIgorLy91c2FnZTogICAgICAgIk4gMiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBydW5sZXZlbF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcnVubGV2ZWxfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB1dG1weCAqdXQ7CisJY2hhciBwcmV2OworCisJaWYgKGFyZ3ZbMV0pIHV0bXB4bmFtZShhcmd2WzFdKTsKKworCXNldHV0eGVudCgpOworCXdoaWxlICgodXQgPSBnZXR1dHhlbnQoKSkgIT0gTlVMTCkgeworCQlpZiAodXQtPnV0X3R5cGUgPT0gUlVOX0xWTCkgeworCQkJcHJldiA9IHV0LT51dF9waWQgLyAyNTY7CisJCQlpZiAocHJldiA9PSAwKSBwcmV2ID0gJ04nOworCQkJcHJpbnRmKCIlYyAlY1xuIiwgcHJldiwgdXQtPnV0X3BpZCAlIDI1Nik7CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJZW5kdXR4ZW50KCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXB1dHMoInVua25vd24iKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZW5kdXR4ZW50KCk7CisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvcnguYyBiL21pc2N1dGlscy9yeC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZmZiNTkKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvcnguYwpAQCAtMCwwICsxLDI3MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0OiAgICAgQ29weXJpZ2h0IChDKSAyMDAxLCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQorICogQXV0aG9yOiAgICAgICAgQ2hyaXN0b3BoZXIgSG9vdmVyIDxjaEBocGwuaHAuY29tPgorICogRGVzY3JpcHRpb246ICAgeG1vZGVtIGZ1bmN0aW9uYWxpdHkgZm9yIHVwbG9hZGluZyBvZiBrZXJuZWxzCisgKiAgICAgICAgICAgICAgICBhbmQgdGhlIGxpa2UKKyAqIENyZWF0ZWQgYXQ6ICAgIFRodSBEZWMgMjAgMDE6NTg6MDggUFNUIDIwMDEKKyAqCisgKiB4bW9kZW0gZnVuY3Rpb25hbGl0eSBmb3IgdXBsb2FkaW5nIG9mIGtlcm5lbHMgYW5kIHRoZSBsaWtlCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIEhld2xldHQtUGFja2FyZCBMYWJvcmF0b3JpZXMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIFRoaXMgd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBmb3IgYmxvYiBhbmQgdGhlbiBhZGFwdGVkIGZvciBidXN5Ym94LgorICovCisKKy8vdXNhZ2U6I2RlZmluZSByeF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiRklMRSIKKy8vdXNhZ2U6I2RlZmluZSByeF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJlY2VpdmUgYSBmaWxlIHVzaW5nIHRoZSB4bW9kZW0gcHJvdG9jb2wiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHJ4X2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHJ4IC90bXAvZm9vXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjZGVmaW5lIFNPSCAweDAxCisjZGVmaW5lIFNUWCAweDAyCisjZGVmaW5lIEVPVCAweDA0CisjZGVmaW5lIEFDSyAweDA2CisjZGVmaW5lIE5BSyAweDE1CisjZGVmaW5lIEJTICAweDA4CisjZGVmaW5lIFBBRCAweDFBCisKKy8qCitDZjoKKyAgaHR0cDovL3d3dy50ZXh0ZmlsZXMuY29tL2FwcGxlL3htb2RlbQorICBodHRwOi8vd3d3LnBoeXMud2FzaGluZ3Rvbi5lZHUvfmJlbG9uaXMveG1vZGVtL2RvY3htb2RlbS50eHQKKyAgaHR0cDovL3d3dy5waHlzLndhc2hpbmd0b24uZWR1L35iZWxvbmlzL3htb2RlbS9kb2N5bW9kZW0udHh0CisgIGh0dHA6Ly93d3cucGh5cy53YXNoaW5ndG9uLmVkdS9+YmVsb25pcy94bW9kZW0vbW9kbXByb3QuY29sCisqLworCisjZGVmaW5lIFRJTUVPVVQgMQorI2RlZmluZSBUSU1FT1VUX0xPTkcgMTAKKyNkZWZpbmUgTUFYRVJST1JTIDEwCisKKyNkZWZpbmUgcmVhZF9mZCAgU1RESU5fRklMRU5PCisjZGVmaW5lIHdyaXRlX2ZkIFNURE9VVF9GSUxFTk8KKworc3RhdGljIGludCByZWFkX2J5dGUodW5zaWduZWQgdGltZW91dCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZjsKKwlpbnQgbjsKKworCWFsYXJtKHRpbWVvdXQpOworCS8qIE5PVCBzYWZlX3JlYWQhIFdlIHdhbnQgQUxSTSB0byBpbnRlcnJ1cHQgdXMgKi8KKwluID0gcmVhZChyZWFkX2ZkLCAmYnVmLCAxKTsKKwlhbGFybSgwKTsKKwlpZiAobiA9PSAxKQorCQlyZXR1cm4gYnVmOworCXJldHVybiAtMTsKK30KKworc3RhdGljIGludCByZWNlaXZlKC8qaW50IHJlYWRfZmQsICovaW50IGZpbGVfZmQpCit7CisJdW5zaWduZWQgY2hhciBibG9ja0J1ZlsxMDI0XTsKKwl1bnNpZ25lZCBibG9ja0xlbmd0aCA9IDA7CisJdW5zaWduZWQgZXJyb3JzID0gMDsKKwl1bnNpZ25lZCB3YW50QmxvY2tObyA9IDE7CisJdW5zaWduZWQgbGVuZ3RoID0gMDsKKwlpbnQgZG9fY3JjID0gMTsKKwljaGFyIHJlcGx5X2NoYXI7CisJdW5zaWduZWQgdGltZW91dCA9IFRJTUVPVVRfTE9ORzsKKworCS8qIEZsdXNoIHBlbmRpbmcgaW5wdXQgKi8KKwl0Y2ZsdXNoKHJlYWRfZmQsIFRDSUZMVVNIKTsKKworCS8qIEFzayBmb3IgQ1JDOyBpZiB3ZSBnZXQgZXJyb3JzLCB3ZSB3aWxsIGdvIHdpdGggY2hlY2tzdW0gKi8KKwlyZXBseV9jaGFyID0gJ0MnOworCWZ1bGxfd3JpdGUod3JpdGVfZmQsICZyZXBseV9jaGFyLCAxKTsKKworCWZvciAoOzspIHsKKwkJaW50IGJsb2NrQmVnaW47CisJCWludCBibG9ja05vLCBibG9ja05vT25lc0NvbXBsOworCQlpbnQgY2tzdW1fb3JfY3JjOworCQlpbnQgZXhwZWN0ZWQ7CisJCWludCBpLCBqOworCisJCWJsb2NrQmVnaW4gPSByZWFkX2J5dGUodGltZW91dCk7CisJCWlmIChibG9ja0JlZ2luIDwgMCkKKwkJCWdvdG8gdGltZW91dDsKKworCQkvKiBJZiBsYXN0IGJsb2NrLCByZW1vdmUgcGFkZGluZyAqLworCQlpZiAoYmxvY2tCZWdpbiA9PSBFT1QpIHsKKwkJCS8qIERhdGEgYmxvY2tzIGNhbiBiZSBwYWRkZWQgd2l0aCBeWiBjaGFyYWN0ZXJzICovCisJCQkvKiBUaGlzIGNvZGUgdHJpZXMgdG8gZGV0ZWN0IGFuZCByZW1vdmUgdGhlbSAqLworCQkJaWYgKGJsb2NrTGVuZ3RoID49IDMKKwkJCSAmJiBibG9ja0J1ZltibG9ja0xlbmd0aCAtIDFdID09IFBBRAorCQkJICYmIGJsb2NrQnVmW2Jsb2NrTGVuZ3RoIC0gMl0gPT0gUEFECisJCQkgJiYgYmxvY2tCdWZbYmxvY2tMZW5ndGggLSAzXSA9PSBQQUQKKwkJCSkgeworCQkJCXdoaWxlIChibG9ja0xlbmd0aAorCQkJICAgICAgICAgICAmJiBibG9ja0J1ZltibG9ja0xlbmd0aCAtIDFdID09IFBBRAorCQkJCSkgeworCQkJCQlibG9ja0xlbmd0aC0tOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBXcml0ZSBwcmV2aW91c2x5IHJlY2VpdmVkIGJsb2NrICovCisJCWVycm5vID0gMDsKKwkJaWYgKGZ1bGxfd3JpdGUoZmlsZV9mZCwgYmxvY2tCdWYsIGJsb2NrTGVuZ3RoKSAhPSBibG9ja0xlbmd0aCkgeworCQkJYmJfcGVycm9yX21zZyhiYl9tc2dfd3JpdGVfZXJyb3IpOworCQkJZ290byBmYXRhbDsKKwkJfQorCisJCXRpbWVvdXQgPSBUSU1FT1VUOworCQlyZXBseV9jaGFyID0gTkFLOworCisJCXN3aXRjaCAoYmxvY2tCZWdpbikgeworCQljYXNlIFNPSDoKKwkJY2FzZSBTVFg6CisJCQlicmVhazsKKwkJY2FzZSBFT1Q6CisJCQlyZXBseV9jaGFyID0gQUNLOworCQkJZnVsbF93cml0ZSh3cml0ZV9mZCwgJnJlcGx5X2NoYXIsIDEpOworCQkJcmV0dXJuIGxlbmd0aDsKKwkJZGVmYXVsdDoKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQkvKiBCbG9jayBubyAqLworCQlibG9ja05vID0gcmVhZF9ieXRlKFRJTUVPVVQpOworCQlpZiAoYmxvY2tObyA8IDApCisJCQlnb3RvIHRpbWVvdXQ7CisKKwkJLyogQmxvY2sgbm8sIGluIG9uZSdzIGNvbXBsZW1lbnQgZm9ybSAqLworCQlibG9ja05vT25lc0NvbXBsID0gcmVhZF9ieXRlKFRJTUVPVVQpOworCQlpZiAoYmxvY2tOb09uZXNDb21wbCA8IDApCisJCQlnb3RvIHRpbWVvdXQ7CisKKwkJaWYgKGJsb2NrTm8gIT0gKDI1NSAtIGJsb2NrTm9PbmVzQ29tcGwpKSB7CisJCQliYl9lcnJvcl9tc2coImJhZCBibG9jayBvbmVzIGNvbXBsIik7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJYmxvY2tMZW5ndGggPSAoYmxvY2tCZWdpbiA9PSBTT0gpID8gMTI4IDogMTAyNDsKKworCQlmb3IgKGkgPSAwOyBpIDwgYmxvY2tMZW5ndGg7IGkrKykgeworCQkJaW50IGNjID0gcmVhZF9ieXRlKFRJTUVPVVQpOworCQkJaWYgKGNjIDwgMCkKKwkJCQlnb3RvIHRpbWVvdXQ7CisJCQlibG9ja0J1ZltpXSA9IGNjOworCQl9CisKKwkJY2tzdW1fb3JfY3JjID0gcmVhZF9ieXRlKFRJTUVPVVQpOworCQlpZiAoY2tzdW1fb3JfY3JjIDwgMCkKKwkJCWdvdG8gdGltZW91dDsKKwkJaWYgKGRvX2NyYykgeworCQkJY2tzdW1fb3JfY3JjID0gKGNrc3VtX29yX2NyYyA8PCA4KSB8IHJlYWRfYnl0ZShUSU1FT1VUKTsKKwkJCWlmIChja3N1bV9vcl9jcmMgPCAwKQorCQkJCWdvdG8gdGltZW91dDsKKwkJfQorCisJCWlmIChibG9ja05vID09ICgod2FudEJsb2NrTm8gLSAxKSAmIDB4ZmYpKSB7CisJCQkvKiBhIHJlcGVhdCBvZiB0aGUgbGFzdCBibG9jayBpcyBvaywganVzdCBpZ25vcmUgaXQuICovCisJCQkvKiB0aGlzIGFsc28gaWdub3JlcyB0aGUgaW5pdGlhbCBibG9jayAwIHdoaWNoIGlzICovCisJCQkvKiBtZXRhIGRhdGEuICovCisJCQlibG9ja0xlbmd0aCA9IDA7CisJCQlnb3RvIG5leHQ7CisJCX0KKwkJaWYgKGJsb2NrTm8gIT0gKHdhbnRCbG9ja05vICYgMHhmZikpIHsKKwkJCWJiX2Vycm9yX21zZygidW5leHBlY3RlZCBibG9jayBubywgMHglMDh4LCBleHBlY3RpbmcgMHglMDh4IiwgYmxvY2tObywgd2FudEJsb2NrTm8pOworCQkJZ290byBlcnJvcjsKKwkJfQorCisJCWV4cGVjdGVkID0gMDsKKwkJaWYgKGRvX2NyYykgeworCQkJZm9yIChpID0gMDsgaSA8IGJsb2NrTGVuZ3RoOyBpKyspIHsKKwkJCQlleHBlY3RlZCA9IGV4cGVjdGVkIF4gYmxvY2tCdWZbaV0gPDwgODsKKwkJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCQkJCWlmIChleHBlY3RlZCAmIDB4ODAwMCkKKwkJCQkJCWV4cGVjdGVkID0gKGV4cGVjdGVkIDw8IDEpIF4gMHgxMDIxOworCQkJCQllbHNlCisJCQkJCQlleHBlY3RlZCA9IChleHBlY3RlZCA8PCAxKTsKKwkJCQl9CisJCQl9CisJCQlleHBlY3RlZCAmPSAweGZmZmY7CisJCX0gZWxzZSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgYmxvY2tMZW5ndGg7IGkrKykKKwkJCQlleHBlY3RlZCArPSBibG9ja0J1ZltpXTsKKwkJCWV4cGVjdGVkICY9IDB4ZmY7CisJCX0KKwkJaWYgKGNrc3VtX29yX2NyYyAhPSBleHBlY3RlZCkgeworCQkJYmJfZXJyb3JfbXNnKGRvX2NyYyA/ICJjcmMgZXJyb3IsIGV4cGVjdGVkIDB4JTA0eCwgZ290IDB4JTA0eCIKKwkJCQkJOiAiY2hlY2tzdW0gZXJyb3IsIGV4cGVjdGVkIDB4JTAyeCwgZ290IDB4JTAyeCIsCisJCQkJZXhwZWN0ZWQsIGNrc3VtX29yX2NyYyk7CisJCQlnb3RvIGVycm9yOworCQl9CisKKwkJd2FudEJsb2NrTm8rKzsKKwkJbGVuZ3RoICs9IGJsb2NrTGVuZ3RoOworIG5leHQ6CisJCWVycm9ycyA9IDA7CisJCXJlcGx5X2NoYXIgPSBBQ0s7CisJCWZ1bGxfd3JpdGUod3JpdGVfZmQsICZyZXBseV9jaGFyLCAxKTsKKwkJY29udGludWU7CisgZXJyb3I6CisgdGltZW91dDoKKwkJYmxvY2tMZW5ndGggPSAwOworCQllcnJvcnMrKzsKKwkJaWYgKGVycm9ycyA9PSBNQVhFUlJPUlMpIHsKKwkJCS8qIEFib3J0ICovCisKKwkJCS8qIElmIHdlcmUgYXNraW5nIGZvciBjcmMsIHRyeSBhZ2FpbiB3L28gY3JjICovCisJCQlpZiAocmVwbHlfY2hhciA9PSAnQycpIHsKKwkJCQlyZXBseV9jaGFyID0gTkFLOworCQkJCWVycm9ycyA9IDA7CisJCQkJZG9fY3JjID0gMDsKKwkJCQlnb3RvIHRpbWVvdXQ7CisJCQl9CisJCQliYl9lcnJvcl9tc2coInRvbyBtYW55IGVycm9yczsgZ2l2aW5nIHVwIik7CisgZmF0YWw6CisJCQkvKiA1IENBTiBmb2xsb3dlZCBieSA1IEJTLiBEb24ndCB0cnkgdG9vIGhhcmQuLi4gKi8KKwkJCXNhZmVfd3JpdGUod3JpdGVfZmQsICJcMDMwXDAzMFwwMzBcMDMwXDAzMFwwMTBcMDEwXDAxMFwwMTBcMDEwIiwgMTApOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyogRmx1c2ggcGVuZGluZyBpbnB1dCAqLworCQl0Y2ZsdXNoKHJlYWRfZmQsIFRDSUZMVVNIKTsKKworCQlmdWxsX3dyaXRlKHdyaXRlX2ZkLCAmcmVwbHlfY2hhciwgMSk7CisJfSAvKiBmb3IgKDs7KSAqLworfQorCitzdGF0aWMgdm9pZCBzaWdhbHJtX2hhbmRsZXIoaW50IFVOVVNFRF9QQVJBTSBzaWdudW0pCit7Cit9CisKK2ludCByeF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcnhfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB0ZXJtaW9zIHR0eSwgb3JpZ190dHk7CisJaW50IHRlcm1pb3NfZXJyOworCWludCBmaWxlX2ZkOworCWludCBuOworCisJLyogRGlzYWJsZWQgYnkgdmRhOgorCSAqIHdoeSB3ZSBjYW4ndCByZWNlaXZlIGZyb20gc3RkaW4/IFdoeSB3ZSAqcmVxdWlyZSoKKwkgKiBjb250cm9sbGluZyB0dHk/PyAqLworCS8qcmVhZF9mZCA9IHhvcGVuKENVUlJFTlRfVFRZLCBPX1JEV1IpOyovCisJZmlsZV9mZCA9IHhvcGVuKHNpbmdsZV9hcmd2KGFyZ3YpLCBPX1JEV1J8T19DUkVBVHxPX1RSVU5DKTsKKworCXRlcm1pb3NfZXJyID0gdGNnZXRhdHRyKHJlYWRfZmQsICZ0dHkpOworCWlmICh0ZXJtaW9zX2VyciA9PSAwKSB7CisJCW9yaWdfdHR5ID0gdHR5OworCQljZm1ha2VyYXcoJnR0eSk7CisJCXRjc2V0YXR0cihyZWFkX2ZkLCBUQ1NBRkxVU0gsICZ0dHkpOworCX0KKworCS8qIE5vIFNBX1JFU1RBUlQ6IHdlIHdhbnQgQUxSTSB0byBpbnRlcnJ1cHQgcmVhZCgpICovCisJc2lnbmFsX25vX1NBX1JFU1RBUlRfZW1wdHlfbWFzayhTSUdBTFJNLCBzaWdhbHJtX2hhbmRsZXIpOworCisJbiA9IHJlY2VpdmUoZmlsZV9mZCk7CisKKwlpZiAodGVybWlvc19lcnIgPT0gMCkKKwkJdGNzZXRhdHRyKHJlYWRfZmQsIFRDU0FGTFVTSCwgJm9yaWdfdHR5KTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsb3NlKGZpbGVfZmQpOworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQobiA+PSAwKTsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy9zZXRzZXJpYWwuYyBiL21pc2N1dGlscy9zZXRzZXJpYWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmVkMzMwCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL3NldHNlcmlhbC5jCkBAIC0wLDAgKzEsNzYzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzZXRzZXJpYWwgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDExIE1hcmVrIEJlxI1rYSA8eXVlbkBrbGFjbm8uc2s+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2NvbmZpZzpjb25maWcgU0VUU0VSSUFMCisvL2NvbmZpZzoJYm9vbCAic2V0c2VyaWFsIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CXNlbGVjdCBQTEFURk9STV9MSU5VWAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFJldHJpZXZlIG9yIHNldCBMaW51eCBzZXJpYWwgcG9ydC4KKworLy9hcHBsZXQ6SUZfU0VUU0VSSUFMKEFQUExFVChzZXRzZXJpYWwsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19TRVRTRVJJQUwpICs9IHNldHNlcmlhbC5vCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaWZuZGVmIFBPUlRfVU5LTk9XTgorIyBkZWZpbmUgUE9SVF9VTktOT1dOICAgICAgICAgICAgMAorI2VuZGlmCisjaWZuZGVmIFBPUlRfODI1MAorIyBkZWZpbmUgUE9SVF84MjUwICAgICAgICAgICAgICAgMQorI2VuZGlmCisjaWZuZGVmIFBPUlRfMTY0NTAKKyMgZGVmaW5lIFBPUlRfMTY0NTAgICAgICAgICAgICAgIDIKKyNlbmRpZgorI2lmbmRlZiBQT1JUXzE2NTUwCisjIGRlZmluZSBQT1JUXzE2NTUwICAgICAgICAgICAgICAzCisjZW5kaWYKKyNpZm5kZWYgUE9SVF8xNjU1MEEKKyMgZGVmaW5lIFBPUlRfMTY1NTBBICAgICAgICAgICAgIDQKKyNlbmRpZgorI2lmbmRlZiBQT1JUX0NJUlJVUworIyBkZWZpbmUgUE9SVF9DSVJSVVMgICAgICAgICAgICAgNQorI2VuZGlmCisjaWZuZGVmIFBPUlRfMTY2NTAKKyMgZGVmaW5lIFBPUlRfMTY2NTAgICAgICAgICAgICAgIDYKKyNlbmRpZgorI2lmbmRlZiBQT1JUXzE2NjUwVjIKKyMgZGVmaW5lIFBPUlRfMTY2NTBWMiAgICAgICAgICAgIDcKKyNlbmRpZgorI2lmbmRlZiBQT1JUXzE2NzUwCisjIGRlZmluZSBQT1JUXzE2NzUwICAgICAgICAgICAgICA4CisjZW5kaWYKKyNpZm5kZWYgUE9SVF9TVEFSVEVDSAorIyBkZWZpbmUgUE9SVF9TVEFSVEVDSCAgICAgICAgICAgOQorI2VuZGlmCisjaWZuZGVmIFBPUlRfMTZDOTUwCisjIGRlZmluZSBQT1JUXzE2Qzk1MCAgICAgICAgICAgIDEwCisjZW5kaWYKKyNpZm5kZWYgUE9SVF8xNjY1NAorIyBkZWZpbmUgUE9SVF8xNjY1NCAgICAgICAgICAgICAxMQorI2VuZGlmCisjaWZuZGVmIFBPUlRfMTY4NTAKKyMgZGVmaW5lIFBPUlRfMTY4NTAgICAgICAgICAgICAgMTIKKyNlbmRpZgorI2lmbmRlZiBQT1JUX1JTQQorIyBkZWZpbmUgUE9SVF9SU0EgICAgICAgICAgICAgICAxMworI2VuZGlmCisjaWZuZGVmIFBPUlRfTlMxNjU1MEEKKyMgZGVmaW5lIFBPUlRfTlMxNjU1MEEgICAgICAgICAgMTQKKyNlbmRpZgorI2lmbmRlZiBQT1JUX1hTQ0FMRQorIyBkZWZpbmUgUE9SVF9YU0NBTEUgICAgICAgICAgICAxNQorI2VuZGlmCisjaWZuZGVmIFBPUlRfUk05MDAwCisjIGRlZmluZSBQT1JUX1JNOTAwMCAgICAgICAgICAgIDE2CisjZW5kaWYKKyNpZm5kZWYgUE9SVF9PQ1RFT04KKyMgZGVmaW5lIFBPUlRfT0NURU9OICAgICAgICAgICAgMTcKKyNlbmRpZgorI2lmbmRlZiBQT1JUX0FSNworIyBkZWZpbmUgUE9SVF9BUjcgICAgICAgICAgICAgICAxOAorI2VuZGlmCisjaWZuZGVmIFBPUlRfVTZfMTY1NTBBCisjIGRlZmluZSBQT1JUX1U2XzE2NTUwQSAgICAgICAgIDE5CisjZW5kaWYKKworI2lmbmRlZiBBU1lOQ0JfSFVQX05PVElGWQorIyBkZWZpbmUgQVNZTkNCX0hVUF9OT1RJRlkgICAgICAgMAorI2VuZGlmCisjaWZuZGVmIEFTWU5DQl9GT1VSUE9SVAorIyBkZWZpbmUgQVNZTkNCX0ZPVVJQT1JUICAgICAgICAgMQorI2VuZGlmCisjaWZuZGVmIEFTWU5DQl9TQUsKKyMgZGVmaW5lIEFTWU5DQl9TQUsgICAgICAgICAgICAgIDIKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ0JfU1BMSVRfVEVSTUlPUworIyBkZWZpbmUgQVNZTkNCX1NQTElUX1RFUk1JT1MgICAgMworI2VuZGlmCisjaWZuZGVmIEFTWU5DQl9TUERfSEkKKyMgZGVmaW5lIEFTWU5DQl9TUERfSEkgICAgICAgICAgIDQKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ0JfU1BEX1ZISQorIyBkZWZpbmUgQVNZTkNCX1NQRF9WSEkgICAgICAgICAgNQorI2VuZGlmCisjaWZuZGVmIEFTWU5DQl9TS0lQX1RFU1QKKyMgZGVmaW5lIEFTWU5DQl9TS0lQX1RFU1QgICAgICAgIDYKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ0JfQVVUT19JUlEKKyMgZGVmaW5lIEFTWU5DQl9BVVRPX0lSUSAgICAgICAgIDcKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ0JfU0VTU0lPTl9MT0NLT1VUCisjIGRlZmluZSBBU1lOQ0JfU0VTU0lPTl9MT0NLT1VUICA4CisjZW5kaWYKKyNpZm5kZWYgQVNZTkNCX1BHUlBfTE9DS09VVAorIyBkZWZpbmUgQVNZTkNCX1BHUlBfTE9DS09VVCAgICAgOQorI2VuZGlmCisjaWZuZGVmIEFTWU5DQl9DQUxMT1VUX05PSFVQCisjIGRlZmluZSBBU1lOQ0JfQ0FMTE9VVF9OT0hVUCAgIDEwCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNCX1NQRF9TSEkKKyMgZGVmaW5lIEFTWU5DQl9TUERfU0hJICAgICAgICAgMTIKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ0JfTE9XX0xBVEVOQ1kKKyMgZGVmaW5lIEFTWU5DQl9MT1dfTEFURU5DWSAgICAgMTMKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ0JfQlVHR1lfVUFSVAorIyBkZWZpbmUgQVNZTkNCX0JVR0dZX1VBUlQgICAgICAxNAorI2VuZGlmCisKKyNpZm5kZWYgQVNZTkNfSFVQX05PVElGWQorIyBkZWZpbmUgQVNZTkNfSFVQX05PVElGWSAgICAgICAoMVUgPDwgQVNZTkNCX0hVUF9OT1RJRlkpCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNfRk9VUlBPUlQKKyMgZGVmaW5lIEFTWU5DX0ZPVVJQT1JUICAgICAgICAgKDFVIDw8IEFTWU5DQl9GT1VSUE9SVCkKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ19TQUsKKyMgZGVmaW5lIEFTWU5DX1NBSyAgICAgICAgICAgICAgKDFVIDw8IEFTWU5DQl9TQUspCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNfU1BMSVRfVEVSTUlPUworIyBkZWZpbmUgQVNZTkNfU1BMSVRfVEVSTUlPUyAgICAoMVUgPDwgQVNZTkNCX1NQTElUX1RFUk1JT1MpCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNfU1BEX0hJCisjIGRlZmluZSBBU1lOQ19TUERfSEkgICAgICAgICAgICgxVSA8PCBBU1lOQ0JfU1BEX0hJKQorI2VuZGlmCisjaWZuZGVmIEFTWU5DX1NQRF9WSEkKKyMgZGVmaW5lIEFTWU5DX1NQRF9WSEkgICAgICAgICAgKDFVIDw8IEFTWU5DQl9TUERfVkhJKQorI2VuZGlmCisjaWZuZGVmIEFTWU5DX1NLSVBfVEVTVAorIyBkZWZpbmUgQVNZTkNfU0tJUF9URVNUICAgICAgICAoMVUgPDwgQVNZTkNCX1NLSVBfVEVTVCkKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ19BVVRPX0lSUQorIyBkZWZpbmUgQVNZTkNfQVVUT19JUlEgICAgICAgICAoMVUgPDwgQVNZTkNCX0FVVE9fSVJRKQorI2VuZGlmCisjaWZuZGVmIEFTWU5DX1NFU1NJT05fTE9DS09VVAorIyBkZWZpbmUgQVNZTkNfU0VTU0lPTl9MT0NLT1VUICAoMVUgPDwgQVNZTkNCX1NFU1NJT05fTE9DS09VVCkKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ19QR1JQX0xPQ0tPVVQKKyMgZGVmaW5lIEFTWU5DX1BHUlBfTE9DS09VVCAgICAgKDFVIDw8IEFTWU5DQl9QR1JQX0xPQ0tPVVQpCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNfQ0FMTE9VVF9OT0hVUAorIyBkZWZpbmUgQVNZTkNfQ0FMTE9VVF9OT0hVUCAgICAoMVUgPDwgQVNZTkNCX0NBTExPVVRfTk9IVVApCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNfU1BEX1NISQorIyBkZWZpbmUgQVNZTkNfU1BEX1NISSAgICAgICAgICAoMVUgPDwgQVNZTkNCX1NQRF9TSEkpCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNfTE9XX0xBVEVOQ1kKKyMgZGVmaW5lIEFTWU5DX0xPV19MQVRFTkNZICAgICAgKDFVIDw8IEFTWU5DQl9MT1dfTEFURU5DWSkKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ19CVUdHWV9VQVJUCisjIGRlZmluZSBBU1lOQ19CVUdHWV9VQVJUICAgICAgICgxVSA8PCBBU1lOQ0JfQlVHR1lfVUFSVCkKKyNlbmRpZgorCisjaWZuZGVmIEFTWU5DX1NQRF9DVVNUCisjIGRlZmluZSBBU1lOQ19TUERfQ1VTVCAgICAgICAgIChBU1lOQ19TUERfSEl8QVNZTkNfU1BEX1ZISSkKKyNlbmRpZgorI2lmbmRlZiBBU1lOQ19TUERfV0FSUAorIyBkZWZpbmUgQVNZTkNfU1BEX1dBUlAgICAgICAgICAoQVNZTkNfU1BEX0hJfEFTWU5DX1NQRF9TSEkpCisjZW5kaWYKKyNpZm5kZWYgQVNZTkNfU1BEX01BU0sKKyMgZGVmaW5lIEFTWU5DX1NQRF9NQVNLICAgICAgICAgKEFTWU5DX1NQRF9ISXxBU1lOQ19TUERfVkhJfEFTWU5DX1NQRF9TSEkpCisjZW5kaWYKKworI2lmbmRlZiBBU1lOQ19DTE9TSU5HX1dBSVRfSU5GCisjIGRlZmluZSBBU1lOQ19DTE9TSU5HX1dBSVRfSU5GICAgICAgICAgMAorI2VuZGlmCisjaWZuZGVmIEFTWU5DX0NMT1NJTkdfV0FJVF9OT05FCisjIGRlZmluZSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORSAgICAgICAgNjU1MzUKKyNlbmRpZgorCisjaWZuZGVmIF9MSU5VWF9TRVJJQUxfSAorc3RydWN0IHNlcmlhbF9zdHJ1Y3QgeworCWludAl0eXBlOworCWludAlsaW5lOworCXVuc2lnbmVkIGludAlwb3J0OworCWludAlpcnE7CisJaW50CWZsYWdzOworCWludAl4bWl0X2ZpZm9fc2l6ZTsKKwlpbnQJY3VzdG9tX2Rpdmlzb3I7CisJaW50CWJhdWRfYmFzZTsKKwl1bnNpZ25lZCBzaG9ydAljbG9zZV9kZWxheTsKKwljaGFyCWlvX3R5cGU7CisJY2hhcglyZXNlcnZlZF9jaGFyWzFdOworCWludAlodWI2OworCXVuc2lnbmVkIHNob3J0CWNsb3Npbmdfd2FpdDsgLyogdGltZSB0byB3YWl0IGJlZm9yZSBjbG9zaW5nICovCisJdW5zaWduZWQgc2hvcnQJY2xvc2luZ193YWl0MjsgLyogbm8gbG9uZ2VyIHVzZWQuLi4gKi8KKwl1bnNpZ25lZCBjaGFyCSppb21lbV9iYXNlOworCXVuc2lnbmVkIHNob3J0CWlvbWVtX3JlZ19zaGlmdDsKKwl1bnNpZ25lZCBpbnQJcG9ydF9oaWdoOworCXVuc2lnbmVkIGxvbmcJaW9tYXBfYmFzZTsJLyogY29va2llIHBhc3NlZCBpbnRvIGlvcmVtYXAgKi8KK307CisjZW5kaWYKKworLy91c2FnZTojZGVmaW5lIHNldHNlcmlhbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiWy1nYWJHdnpWXSBERVZJQ0UgW1BBUkFNRVRFUiBbQVJHXV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgc2V0c2VyaWFsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOgkiUmVxdWVzdCBvciBzZXQgTGludXggc2VyaWFsIHBvcnQgaW5mb3JtYXRpb25cbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIJLWcJSW50ZXJwcmV0IHBhcmFtZXRlcnMgYXMgbGlzdCBvZiBkZXZpY2VzIGZvciByZXBvcnRpbmdcbiIKKy8vdXNhZ2U6CSIJLWEJUHJpbnQgYWxsIGF2YWlsYWJsZSBpbmZvcm1hdGlvblxuIgorLy91c2FnZToJIgktYglQcmludCBzdW1tYXJ5IGluZm9ybWF0aW9uXG4iCisvL3VzYWdlOgkiCS1HCVByaW50IGluIGZvcm0gd2hpY2ggY2FuIGJlIGZlZCBiYWNrXG4iCisvL3VzYWdlOgkiCQl0byBzZXRzZXJpYWwgYXMgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnNcbiIKKy8vdXNhZ2U6CSIJLXoJWmVybyBvdXQgc2VyaWFsIGZsYWdzIGJlZm9yZSBzZXR0aW5nXG4iCisvL3VzYWdlOgkiCS12CVZlcmJvc2VcbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSJQYXJhbWV0ZXJzOiAoKiA9IHRha2VzIGFuIGFyZ3VtZW50LCBeID0gY2FuIGJlIHR1cm5lZCBvZmYgYnkgcHJlY2VkaW5nIF4pXG4iCisvL3VzYWdlOgkiCSpwb3J0LCAqaXJxLCAqZGl2aXNvciwgKnVhcnQsICpiYXVkX2Jhc2UsICpjbG9zZV9kZWxheSwgKmNsb3Npbmdfd2FpdCxcbiIKKy8vdXNhZ2U6CSIJXmZvdXJwb3J0LCBeYXV0b19pcnEsIF5za2lwX3Rlc3QsIF5zYWssIF5zZXNzaW9uX2xvY2tvdXQsIF5wZ3JwX2xvY2tvdXQsXG4iCisvL3VzYWdlOgkiCV5jYWxsb3V0X25vaHVwLCBec3BsaXRfdGVybWlvcywgXmh1cF9ub3RpZnksIF5sb3dfbGF0ZW5jeSwgYXV0b2NvbmZpZyxcbiIKKy8vdXNhZ2U6CSIJc3BkX25vcm1hbCwgc3BkX2hpLCBzcGRfdmhpLCBzcGRfc2hpLCBzcGRfd2FycCwgc3BkX2N1c3RcbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSJVQVJUIHR5cGVzOlxuIgorLy91c2FnZToJIgl1bmtub3duLCA4MjUwLCAxNjQ1MCwgMTY1NTAsIDE2NTUwQSwgQ2lycnVzLCAxNjY1MCwgMTY2NTBWMiwgMTY3NTAsXG4iCisvL3VzYWdlOgkiCTE2OTUwLCAxNjk1NCwgMTY2NTQsIDE2ODUwLCBSU0EsIE5TMTY1NTBBLCBYU0NBTEUsIFJNOTAwMCwgT0NURU9OLCBBUjcsXG4iCisvL3VzYWdlOgkiCVU2XzE2NTUwQSIKKworI2RlZmluZSBPUFRfUFJJTlRfU1VNTUFSWSAgICAgICAoMSA8PCAwKQorI2RlZmluZSBPUFRfUFJJTlRfRkVEQkFDSyAgICAgICAoMSA8PCAxKQorI2RlZmluZSBPUFRfUFJJTlRfQUxMICAgICAgICAgICAoMSA8PCAyKQorI2RlZmluZSBPUFRfVkVSQk9TRSAgICAgICAgICAgICAoMSA8PCAzKQorI2RlZmluZSBPUFRfWkVSTyAgICAgICAgICAgICAgICAoMSA8PCA0KQorI2RlZmluZSBPUFRfR0VUICAgICAgICAgICAgICAgICAoMSA8PCA1KQorCisjZGVmaW5lIE9QVF9NT0RFX01BU0sgXAorCShPUFRfUFJJTlRfQUxMIHwgT1BUX1BSSU5UX1NVTU1BUlkgfCBPUFRfUFJJTlRfRkVEQkFDSykKKworZW51bSBwcmludF9tb2RlCit7CisJUFJJTlRfTk9STUFMICA9IDAsCisJUFJJTlRfU1VNTUFSWSA9ICgxIDw8IDApLAorCVBSSU5UX0ZFREJBQ0sgPSAoMSA8PCAxKSwKKwlQUklOVF9BTEwgICAgID0gKDEgPDwgMiksCit9OworCisjZGVmaW5lIENUTF9TRVQgICAgICAgICAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIENUTF9DT05GSUcgICAgICAgICAgICAgICgxIDw8IDEpCisjZGVmaW5lIENUTF9HRVQgICAgICAgICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIENUTF9DTE9TRSAgICAgICAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIENUTF9OT0RJRSAgICAgICAgICAgICAgICgxIDw8IDQpCisKK3N0YXRpYyBjb25zdCBjaGFyIHNlcmlhbF90eXBlc1tdID0KKwkidW5rbm93blwwIgkJLyogMCAqLworCSI4MjUwXDAiCQkvKiAxICovCisJIjE2NDUwXDAiCQkvKiAyICovCisJIjE2NTUwXDAiCQkvKiAzICovCisJIjE2NTUwQVwwIgkJLyogNCAqLworCSJDaXJydXNcMCIJCS8qIDUgKi8KKwkiMTY2NTBcMCIJCS8qIDYgKi8KKwkiMTY2NTBWMlwwIgkJLyogNyAqLworCSIxNjc1MFwwIgkJLyogOCAqLworCSIxNjk1MFwwIgkJLyogOSBVTklNUExFTUVOVEVEOiBhbHNvIGtub3cgYXMgIjE2OTUwLzk1NCIgKi8KKwkiMTY5NTRcMCIJCS8qIDEwICovCisJIjE2NjU0XDAiCQkvKiAxMSAqLworCSIxNjg1MFwwIgkJLyogMTIgKi8KKwkiUlNBXDAiCQkJLyogMTMgKi8KKyNpZm5kZWYgU0VUU0VSSUFMX0JBU0UKKwkiTlMxNjU1MEFcMCIJCS8qIDE0ICovCisJIlhTQ0FMRVwwIgkJLyogMTUgKi8KKwkiUk05MDAwXDAiCQkvKiAxNiAqLworCSJPQ1RFT05cMCIJCS8qIDE3ICovCisJIkFSN1wwIgkJCS8qIDE4ICovCisJIlU2XzE2NTUwQVwwIgkJLyogMTkgKi8KKyNlbmRpZgorOworCisjaWZuZGVmIFNFVFNFUklBTF9CQVNFCisjIGRlZmluZSBNQVhfU0VSSUFMX1RZUEUJMTkKKyNlbHNlCisjIGRlZmluZSBNQVhfU0VSSUFMX1RZUEUJMTMKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciBjb21tYW5kc1tdID0KKwkic3BkX25vcm1hbFwwIgorCSJzcGRfaGlcMCIKKwkic3BkX3ZoaVwwIgorCSJzcGRfc2hpXDAiCisJInNwZF93YXJwXDAiCisJInNwZF9jdXN0XDAiCisKKwkic2FrXDAiCisJImZvdXJwb3J0XDAiCisJImh1cF9ub3RpZnlcMCIKKwkic2tpcF90ZXN0XDAiCisJImF1dG9faXJxXDAiCisJInNwbGl0X3Rlcm1pb3NcMCIKKwkic2Vzc2lvbl9sb2Nrb3V0XDAiCisJInBncnBfbG9ja291dFwwIgorCSJjYWxsb3V0X25vaHVwXDAiCisJImxvd19sYXRlbmN5XDAiCisKKwkicG9ydFwwIgorCSJpcnFcMCIKKwkiZGl2aXNvclwwIgorCSJ1YXJ0XDAiCisJImJhdWRfYmFzZVwwIgorCSJjbG9zZV9kZWxheVwwIgorCSJjbG9zaW5nX3dhaXRcMCIKKworCSJhdXRvY29uZmlnXDAiCis7CisKK2VudW0KK3sKKwlDTURfU1BEX05PUk1BTCA9IDAsCisJQ01EX1NQRF9ISSwKKwlDTURfU1BEX1ZISSwKKwlDTURfU1BEX1NISSwKKwlDTURfU1BEX1dBUlAsCisJQ01EX1NQRF9DVVNULAorCisJQ01EX0ZMQUdfU0FLLAorCUNNRF9GTEFHX0ZPVVJQT1JULAorCUNNRF9GTEFHX05VUF9OT1RJRlksCisJQ01EX0ZMQUdfU0tJUF9URVNULAorCUNNRF9GTEFHX0FVVE9fSVJRLAorCUNNRF9GTEFHX1NQTElUX1RFUk1JT1MsCisJQ01EX0ZMQUdfU0VTU0lPTl9MT0NLT1VULAorCUNNRF9GTEFHX1BHUlBfTE9DS09VVCwKKwlDTURfRkxBR19DQUxMT1VUX05PSFVQLAorCUNNRF9GTEFHX0xPV19MQVRFTkNZLAorCisJQ01EX1BPUlQsCisJQ01EX0lSUSwKKwlDTURfRElWSVNPUiwKKwlDTURfVUFSVCwKKwlDTURfQkFTRSwKKwlDTURfREVMQVksCisJQ01EX1dBSVQsCisKKwlDTURfQVVUT0NPTkZJRywKKworCUNNRF9GTEFHX0ZJUlNUID0gQ01EX0ZMQUdfU0FLLAorCUNNRF9GTEFHX0xBU1QgID0gQ01EX0ZMQUdfTE9XX0xBVEVOQ1ksCit9OworCitzdGF0aWMgYm9vbCBjbWRfbm9wcmludChpbnQgY21kKQoreworCXJldHVybiAoY21kID49IENNRF9GTEFHX1NLSVBfVEVTVCAmJiBjbWQgPD0gQ01EX0ZMQUdfQ0FMTE9VVF9OT0hVUCk7Cit9CisKK3N0YXRpYyBib29sIGNtZF9pc19mbGFnKGludCBjbWQpCit7CisJcmV0dXJuIChjbWQgPj0gQ01EX0ZMQUdfRklSU1QgJiYgY21kIDw9IENNRF9GTEFHX0xBU1QpOworfQorCitzdGF0aWMgYm9vbCBjbWRfbmVlZF9hcmcoaW50IGNtZCkKK3sKKwlyZXR1cm4gKGNtZCA+PSBDTURfUE9SVCAmJiBjbWQgPD0gQ01EX1dBSVQpOworfQorCisjZGVmaW5lIEFMTF9TUEQgKCBcCisJQVNZTkNfU1BEX0hJIHwgQVNZTkNfU1BEX1ZISSB8IEFTWU5DX1NQRF9TSEkgfCBcCisJQVNZTkNfU1BEX1dBUlAgfCBBU1lOQ19TUERfQ1VTVCBcCisJKQorCisjZGVmaW5lIEFMTF9GTEFHUyAoIFwKKwlBU1lOQ19TQUsgfCBBU1lOQ19GT1VSUE9SVCB8IEFTWU5DX0hVUF9OT1RJRlkgfCBcCisJQVNZTkNfU0tJUF9URVNUIHwgQVNZTkNfQVVUT19JUlEgfCBBU1lOQ19TUExJVF9URVJNSU9TIHwgXAorCUFTWU5DX1NFU1NJT05fTE9DS09VVCB8IEFTWU5DX1BHUlBfTE9DS09VVCB8IEFTWU5DX0NBTExPVVRfTk9IVVAgfCBcCisJQVNZTkNfTE9XX0xBVEVOQ1kgXAorCSkKKworI2lmIChBTExfU1BEIHwgQUxMX0ZMQUdTKSA+IDB4ZmZmZgorIyBlcnJvciAiVW5leHBlY3RlZCBmbGFncyBzaXplIgorI2VuZGlmCisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBzZXRiaXRzW0NNRF9GTEFHX0xBU1QgKyAxXSA9Cit7CisJMCwKKwlBU1lOQ19TUERfSEksCisJQVNZTkNfU1BEX1ZISSwKKwlBU1lOQ19TUERfU0hJLAorCUFTWU5DX1NQRF9XQVJQLAorCUFTWU5DX1NQRF9DVVNULAorCisJQVNZTkNfU0FLLAorCUFTWU5DX0ZPVVJQT1JULAorCUFTWU5DX0hVUF9OT1RJRlksCisJQVNZTkNfU0tJUF9URVNULAorCUFTWU5DX0FVVE9fSVJRLAorCUFTWU5DX1NQTElUX1RFUk1JT1MsCisJQVNZTkNfU0VTU0lPTl9MT0NLT1VULAorCUFTWU5DX1BHUlBfTE9DS09VVCwKKwlBU1lOQ19DQUxMT1VUX05PSFVQLAorCUFTWU5DX0xPV19MQVRFTkNZCit9OworCitzdGF0aWMgY29uc3QgY2hhciBTVFJfSU5GSU5JVEVbXSA9ICJpbmZpbml0ZSI7CitzdGF0aWMgY29uc3QgY2hhciBTVFJfTk9ORVtdID0gIm5vbmUiOworCitzdGF0aWMgY29uc3QgY2hhciAqdWFydF90eXBlKGludCB0eXBlKQoreworCWlmICh0eXBlID4gTUFYX1NFUklBTF9UWVBFKQorCQlyZXR1cm4gInVuZGVmaW5lZCI7CisKKwlyZXR1cm4gbnRoX3N0cmluZyhzZXJpYWxfdHlwZXMsIHR5cGUpOworfQorCisvKiBsaWJiYiBjYW5kaWRhdGUgKi8KK3N0YXRpYyBpbnQgaW5kZXhfaW5fc3RyaW5nc19jYXNlX2luc2Vuc2l0aXZlKGNvbnN0IGNoYXIgKnN0cmluZ3MsIGNvbnN0IGNoYXIgKmtleSkKK3sKKwlpbnQgaWR4ID0gMDsKKworCXdoaWxlICgqc3RyaW5ncykgeworCQlpZiAoc3RyY2FzZWNtcChzdHJpbmdzLCBrZXkpID09IDApIHsKKwkJCXJldHVybiBpZHg7CisJCX0KKwkJc3RyaW5ncyArPSBzdHJsZW4oc3RyaW5ncykgKyAxOyAvKiBza2lwIE5VTCAqLworCQlpZHgrKzsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHVhcnRfaWQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gaW5kZXhfaW5fc3RyaW5nc19jYXNlX2luc2Vuc2l0aXZlKHNlcmlhbF90eXBlcywgbmFtZSk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfc3BkKGludCBmbGFncywgZW51bSBwcmludF9tb2RlIG1vZGUpCit7CisJaW50IGlkeDsKKworCXN3aXRjaCAoZmxhZ3MgJiBBU1lOQ19TUERfTUFTSykgeworCWNhc2UgQVNZTkNfU1BEX0hJOgorCQlpZHggPSBDTURfU1BEX0hJOworCQlicmVhazsKKwljYXNlIEFTWU5DX1NQRF9WSEk6CisJCWlkeCA9IENNRF9TUERfVkhJOworCQlicmVhazsKKwljYXNlIEFTWU5DX1NQRF9TSEk6CisJCWlkeCA9IENNRF9TUERfU0hJOworCQlicmVhazsKKwljYXNlIEFTWU5DX1NQRF9XQVJQOgorCQlpZHggPSBDTURfU1BEX1dBUlA7CisJCWJyZWFrOworCWNhc2UgQVNZTkNfU1BEX0NVU1Q6CisJCWlkeCA9IENNRF9TUERfQ1VTVDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJaWYgKG1vZGUgPCBQUklOVF9GRURCQUNLKQorCQkJcmV0dXJuIE5VTEw7CisJCWlkeCA9IENNRF9TUERfTk9STUFMOworCX0KKworCXJldHVybiBudGhfc3RyaW5nKGNvbW1hbmRzLCBpZHgpOworfQorCitzdGF0aWMgaW50IGdldF9udW1lcmljKGNvbnN0IGNoYXIgKmFyZykKK3sKKwlyZXR1cm4gYmJfc3RydG9sKGFyZywgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3dhaXQoY29uc3QgY2hhciAqYXJnKQoreworCWlmIChzdHJjYXNlY21wKGFyZywgU1RSX05PTkUpID09IDApCisJCXJldHVybiBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORTsKKworCWlmIChzdHJjYXNlY21wKGFyZywgU1RSX0lORklOSVRFKSA9PSAwKQorCQlyZXR1cm4gQVNZTkNfQ0xPU0lOR19XQUlUX0lORjsKKworCXJldHVybiBnZXRfbnVtZXJpYyhhcmcpOworfQorCitzdGF0aWMgaW50IGdldF91YXJ0KGNvbnN0IGNoYXIgKmFyZykKK3sKKwlpbnQgdWFydCA9IHVhcnRfaWQoYXJnKTsKKworCWlmICh1YXJ0IDwgMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImlsbGVnYWwgVUFSVCB0eXBlOiAlcyIsIGFyZyk7CisKKwlyZXR1cm4gdWFydDsKK30KKworc3RhdGljIGludCBzZXJpYWxfb3Blbihjb25zdCBjaGFyICpkZXYsIGJvb2wgcXVpZXQpCit7CisJaW50IGZkOworCisJZmQgPSBkZXZpY2Vfb3BlbihkZXYsIE9fUkRXUiB8IE9fTk9OQkxPQ0spOworCWlmIChmZCA8IDAgJiYgIXF1aWV0KQorCQliYl9zaW1wbGVfcGVycm9yX21zZyhkZXYpOworCisJcmV0dXJuIGZkOworfQorCitzdGF0aWMgaW50IHNlcmlhbF9jdGwoaW50IGZkLCBpbnQgb3BzLCBzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCAqc2VyaW5mbykKK3sKKwlpbnQgcmV0ID0gMDsKKwljb25zdCBjaGFyICplcnI7CisKKwlpZiAob3BzICYgQ1RMX1NFVCkgeworCQlyZXQgPSBpb2N0bChmZCwgVElPQ1NTRVJJQUwsIHNlcmluZm8pOworCQlpZiAocmV0IDwgMCkgeworCQkJZXJyID0gImNhbid0IHNldCBzZXJpYWwgaW5mbyI7CisJCQlnb3RvIGZhaWw7CisJCX0KKwl9CisKKwlpZiAob3BzICYgQ1RMX0NPTkZJRykgeworCQlyZXQgPSBpb2N0bChmZCwgVElPQ1NFUkNPTkZJRyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQllcnIgPSAiY2FuJ3QgYXV0b2NvbmZpZ3VyZSBwb3J0IjsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKworCWlmIChvcHMgJiBDVExfR0VUKSB7CisJCXJldCA9IGlvY3RsKGZkLCBUSU9DR1NFUklBTCwgc2VyaW5mbyk7CisJCWlmIChyZXQgPCAwKSB7CisJCQllcnIgPSAiY2FuJ3QgZ2V0IHNlcmlhbCBpbmZvIjsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCX0KKyBub2RpZToKKwlpZiAob3BzICYgQ1RMX0NMT1NFKQorCQljbG9zZShmZCk7CisKKwlyZXR1cm4gcmV0OworIGZhaWw6CisJYmJfc2ltcGxlX3BlcnJvcl9tc2coZXJyKTsKKwlpZiAob3BzICYgQ1RMX05PRElFKQorCQlnb3RvIG5vZGllOworCWV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZmxhZyhjb25zdCBjaGFyICoqcHJlZml4LCBjb25zdCBjaGFyICpmbGFnKQoreworCXByaW50ZigiJXMlcyIsICpwcmVmaXgsIGZsYWcpOworCSpwcmVmaXggPSAiICI7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3NlcmlhbF9mbGFncyhpbnQgc2VyaWFsX2ZsYWdzLCBlbnVtIHByaW50X21vZGUgbW9kZSwKKwkJCQljb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKnBvc3RmaXgpCit7CisJaW50IGk7CisJY29uc3QgY2hhciAqc3BkLCAqcHI7CisKKwlwciA9IHByZWZpeDsKKworCXNwZCA9IGdldF9zcGQoc2VyaWFsX2ZsYWdzLCBtb2RlKTsKKwlpZiAoc3BkKQorCQlwcmludF9mbGFnKCZwciwgc3BkKTsKKworCWZvciAoaSA9IENNRF9GTEFHX0ZJUlNUOyBpIDw9IENNRF9GTEFHX0xBU1Q7IGkrKykgeworCQlpZiAoKHNlcmlhbF9mbGFncyAmIHNldGJpdHNbaV0pCisJCSAmJiAobW9kZSA+IFBSSU5UX1NVTU1BUlkgfHwgIWNtZF9ub3ByaW50KGkpKQorCQkpIHsKKwkJCXByaW50X2ZsYWcoJnByLCBudGhfc3RyaW5nKGNvbW1hbmRzLCBpKSk7CisJCX0KKwl9CisKKwlwdXRzKHByID09IHByZWZpeCA/ICIiIDogcG9zdGZpeCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2Nsb3Npbmdfd2FpdCh1bnNpZ25lZCBpbnQgY2xvc2luZ193YWl0KQoreworCXN3aXRjaCAoY2xvc2luZ193YWl0KSB7CisJY2FzZSBBU1lOQ19DTE9TSU5HX1dBSVRfTk9ORToKKwkJcHV0cyhTVFJfTk9ORSk7CisJCWJyZWFrOworCWNhc2UgQVNZTkNfQ0xPU0lOR19XQUlUX0lORjoKKwkJcHV0cyhTVFJfSU5GSU5JVEUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoIiV1XG4iLCBjbG9zaW5nX3dhaXQpOworCX0KK30KKworc3RhdGljIHZvaWQgc2VyaWFsX2dldChjb25zdCBjaGFyICpkZXZpY2UsIGVudW0gcHJpbnRfbW9kZSBtb2RlKQoreworCWludCBmZCwgcmV0OworCWNvbnN0IGNoYXIgKnVhcnQsICpwcmVmaXgsICpwb3N0Zml4OworCXN0cnVjdCBzZXJpYWxfc3RydWN0IHNlcmluZm87CisKKwlmZCA9IHNlcmlhbF9vcGVuKGRldmljZSwgLypxdWlldDoqLyBtb2RlID09IFBSSU5UX1NVTU1BUlkpOworCWlmIChmZCA8IDApCisJCXJldHVybjsKKworCXJldCA9IHNlcmlhbF9jdGwoZmQsIENUTF9HRVQgfCBDVExfQ0xPU0UgfCBDVExfTk9ESUUsICZzZXJpbmZvKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuOworCisJdWFydCA9IHVhcnRfdHlwZShzZXJpbmZvLnR5cGUpOworCXByZWZpeCA9ICIsIEZsYWdzOiAiOworCXBvc3RmaXggPSAiIjsKKworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgUFJJTlRfTk9STUFMOgorCQlwcmludGYoIiVzLCBVQVJUOiAlcywgUG9ydDogMHglLjR4LCBJUlE6ICVkIiwKKwkJCWRldmljZSwgdWFydCwgc2VyaW5mby5wb3J0LCBzZXJpbmZvLmlycSk7CisJCWJyZWFrOworCWNhc2UgUFJJTlRfU1VNTUFSWToKKwkJaWYgKCFzZXJpbmZvLnR5cGUpCisJCQlyZXR1cm47CisJCXByaW50ZigiJXMgYXQgMHglLjR4IChpcnEgPSAlZCkgaXMgYSAlcyIsCisJCQlkZXZpY2UsIHNlcmluZm8ucG9ydCwgc2VyaW5mby5pcnEsIHVhcnQpOworCQlwcmVmaXggPSAiICgiOworCQlwb3N0Zml4ID0gIikiOworCQlicmVhazsKKwljYXNlIFBSSU5UX0ZFREJBQ0s6CisJCXByaW50ZigiJXMgdWFydCAlcyBwb3J0IDB4JS40eCBpcnEgJWQgYmF1ZF9iYXNlICVkIiwgZGV2aWNlLAorCQkJdWFydCwgc2VyaW5mby5wb3J0LCBzZXJpbmZvLmlycSwgc2VyaW5mby5iYXVkX2Jhc2UpOworCQlwcmVmaXggPSAiICI7CisJCWJyZWFrOworCWNhc2UgUFJJTlRfQUxMOgorCQlwcmludGYoIiVzLCBMaW5lICVkLCBVQVJUOiAlcywgUG9ydDogMHglLjR4LCBJUlE6ICVkXG4iLAorCQkJZGV2aWNlLCBzZXJpbmZvLmxpbmUsIHVhcnQsIHNlcmluZm8ucG9ydCwgc2VyaW5mby5pcnEpOworCQlwcmludGYoIlx0QmF1ZF9iYXNlOiAlZCwgY2xvc2VfZGVsYXk6ICV1LCBkaXZpc29yOiAlZFxuIiwKKwkJCXNlcmluZm8uYmF1ZF9iYXNlLCBzZXJpbmZvLmNsb3NlX2RlbGF5LAorCQkJc2VyaW5mby5jdXN0b21fZGl2aXNvcik7CisJCXByaW50ZigiXHRjbG9zaW5nX3dhaXQ6ICIpOworCQlwcmludF9jbG9zaW5nX3dhaXQoc2VyaW5mby5jbG9zaW5nX3dhaXQpOworCQlwcmVmaXggPSAiXHRGbGFnczogIjsKKwkJcG9zdGZpeCA9ICJcbiI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFzc2VydCgwKTsKKwl9CisKKwlwcmludF9zZXJpYWxfZmxhZ3Moc2VyaW5mby5mbGFncywgbW9kZSwgcHJlZml4LCBwb3N0Zml4KTsKK30KKworc3RhdGljIGludCBmaW5kX2NtZChjb25zdCBjaGFyICpjbWQpCit7CisJaW50IGlkeDsKKworCWlkeCA9IGluZGV4X2luX3N0cmluZ3NfY2FzZV9pbnNlbnNpdGl2ZShjb21tYW5kcywgY21kKTsKKwlpZiAoaWR4IDwgMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgZmxhZzogJXMiLCBjbWQpOworCisJcmV0dXJuIGlkeDsKK30KKworc3RhdGljIHZvaWQgc2VyaWFsX3NldChjaGFyICoqYXJnLCBpbnQgb3B0cykKK3sKKwlzdHJ1Y3Qgc2VyaWFsX3N0cnVjdCBzZXJpbmZvOworCWludCBjbWQ7CisJY29uc3QgY2hhciAqd29yZDsKKwlpbnQgZmQ7CisKKwlmZCA9IHNlcmlhbF9vcGVuKCphcmcrKywgLypxdWlldDoqLyBmYWxzZSk7CisJaWYgKGZkIDwgMCkKKwkJZXhpdCgyMDEpOworCisJc2VyaWFsX2N0bChmZCwgQ1RMX0dFVCwgJnNlcmluZm8pOworCisJaWYgKG9wdHMgJiBPUFRfWkVSTykKKwkJc2VyaW5mby5mbGFncyA9IDA7CisKKwl3aGlsZSAoKmFyZykgeworCQlpbnQgaW52ZXJ0OworCisJCXdvcmQgPSAqYXJnKys7CisJCWludmVydCA9ICgqd29yZCA9PSAnXicpOworCQl3b3JkICs9IGludmVydDsKKworCQljbWQgPSBmaW5kX2NtZCh3b3JkKTsKKworCQlpZiAoKmFyZyA9PSBOVUxMICYmIGNtZF9uZWVkX2FyZyhjbWQpKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3JlcXVpcmVzX2FyZywgd29yZCk7CisKKwkJaWYgKGludmVydCAmJiAhY21kX2lzX2ZsYWcoY21kKSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBpbnZlcnQgJXMiLCB3b3JkKTsKKworCQlzd2l0Y2ggKGNtZCkgeworCQljYXNlIENNRF9TUERfTk9STUFMOgorCQljYXNlIENNRF9TUERfSEk6CisJCWNhc2UgQ01EX1NQRF9WSEk6CisJCWNhc2UgQ01EX1NQRF9TSEk6CisJCWNhc2UgQ01EX1NQRF9XQVJQOgorCQljYXNlIENNRF9TUERfQ1VTVDoKKwkJCXNlcmluZm8uZmxhZ3MgJj0gfkFTWU5DX1NQRF9NQVNLOworCQkJLyogZmFsbHRocm91Z2ggKi8KKwkJY2FzZSBDTURfRkxBR19TQUs6CisJCWNhc2UgQ01EX0ZMQUdfRk9VUlBPUlQ6CisJCWNhc2UgQ01EX0ZMQUdfTlVQX05PVElGWToKKwkJY2FzZSBDTURfRkxBR19TS0lQX1RFU1Q6CisJCWNhc2UgQ01EX0ZMQUdfQVVUT19JUlE6CisJCWNhc2UgQ01EX0ZMQUdfU1BMSVRfVEVSTUlPUzoKKwkJY2FzZSBDTURfRkxBR19TRVNTSU9OX0xPQ0tPVVQ6CisJCWNhc2UgQ01EX0ZMQUdfUEdSUF9MT0NLT1VUOgorCQljYXNlIENNRF9GTEFHX0NBTExPVVRfTk9IVVA6CisJCWNhc2UgQ01EX0ZMQUdfTE9XX0xBVEVOQ1k6CisJCQlpZiAoaW52ZXJ0KQorCQkJCXNlcmluZm8uZmxhZ3MgJj0gfnNldGJpdHNbY21kXTsKKwkJCWVsc2UKKwkJCQlzZXJpbmZvLmZsYWdzIHw9IHNldGJpdHNbY21kXTsKKwkJCWJyZWFrOworCQljYXNlIENNRF9QT1JUOgorCQkJc2VyaW5mby5wb3J0ID0gZ2V0X251bWVyaWMoKmFyZysrKTsKKwkJCWJyZWFrOworCQljYXNlIENNRF9JUlE6CisJCQlzZXJpbmZvLmlycSA9IGdldF9udW1lcmljKCphcmcrKyk7CisJCQlicmVhazsKKwkJY2FzZSBDTURfRElWSVNPUjoKKwkJCXNlcmluZm8uY3VzdG9tX2Rpdmlzb3IgPSBnZXRfbnVtZXJpYygqYXJnKyspOworCQkJYnJlYWs7CisJCWNhc2UgQ01EX1VBUlQ6CisJCQlzZXJpbmZvLnR5cGUgPSBnZXRfdWFydCgqYXJnKyspOworCQkJYnJlYWs7CisJCWNhc2UgQ01EX0JBU0U6CisJCQlzZXJpbmZvLmJhdWRfYmFzZSA9IGdldF9udW1lcmljKCphcmcrKyk7CisJCQlicmVhazsKKwkJY2FzZSBDTURfREVMQVk6CisJCQlzZXJpbmZvLmNsb3NlX2RlbGF5ID0gZ2V0X251bWVyaWMoKmFyZysrKTsKKwkJCWJyZWFrOworCQljYXNlIENNRF9XQUlUOgorCQkJc2VyaW5mby5jbG9zaW5nX3dhaXQgPSBnZXRfd2FpdCgqYXJnKyspOworCQkJYnJlYWs7CisJCWNhc2UgQ01EX0FVVE9DT05GSUc6CisJCQlzZXJpYWxfY3RsKGZkLCBDVExfU0VUIHwgQ1RMX0NPTkZJRyB8IENUTF9HRVQsICZzZXJpbmZvKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYXNzZXJ0KDApOworCQl9CisJfQorCisJc2VyaWFsX2N0bChmZCwgQ1RMX1NFVCB8IENUTF9DTE9TRSwgJnNlcmluZm8pOworfQorCitpbnQgc2V0c2VyaWFsX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZXRzZXJpYWxfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBvcHRzOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTE6Yi1hRzpHLWFiOmEtYkciOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiYkdhdnpnIik7CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoIWFyZ3ZbMV0pIC8qIG9uZSBhcmcgb25seT8gKi8KKwkJb3B0cyB8PSBPUFRfR0VUOworCisJaWYgKCEob3B0cyAmIE9QVF9HRVQpKSB7CisJCXNlcmlhbF9zZXQoYXJndiwgb3B0cyk7CisJCWFyZ3ZbMV0gPSBOVUxMOworCX0KKworCWlmIChvcHRzICYgKE9QVF9WRVJCT1NFIHwgT1BUX0dFVCkpIHsKKwkJZG8geworCQkJc2VyaWFsX2dldCgqYXJndisrLCBvcHRzICYgT1BUX01PREVfTUFTSyk7CisJCX0gd2hpbGUgKCphcmd2KTsKKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL3NldHNpZC5jIGIvbWlzY3V0aWxzL3NldHNpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNzA4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvc2V0c2lkLmMKQEAgLTAsMCArMSw2NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogc2V0c2lkLmMgLS0gZXhlY3V0ZSBhIGNvbW1hbmQgaW4gYSBuZXcgc2Vzc2lvbgorICogUmljayBTbGFka2V5IDxqcnNAd29ybGQuc3RkLmNvbT4KKyAqIEluIHRoZSBwdWJsaWMgZG9tYWluLgorICoKKyAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1pY2tpZXdpY3ogPG1pc2lla0BwbGQuT1JHLlBMPgorICogLSBhZGRlZCBOYXRpdmUgTGFuZ3VhZ2UgU3VwcG9ydAorICoKKyAqIDIwMDEtMDEtMTggSm9obiBGcmVtbGluIDx2aWlAcGVuZ3VpbnBvd2VyZWQuY29tPgorICogLSBmb3JrIGluIGNhc2Ugd2UgYXJlIHByb2Nlc3MgZ3JvdXAgbGVhZGVyCisgKgorICogMjAwNC0xMS0xMiBQYXVsIEZveAorICogLSBidXN5Ym94ZWQKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgc2V0c2lkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJQUk9HIEFSR1MiCisvL3VzYWdlOiNkZWZpbmUgc2V0c2lkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUnVuIFBST0cgaW4gYSBuZXcgc2Vzc2lvbi4gUFJPRyB3aWxsIGhhdmUgbm8gY29udHJvbGxpbmcgdGVybWluYWxcbiIKKy8vdXNhZ2U6ICAgICAgICJhbmQgd2lsbCBub3QgYmUgYWZmZWN0ZWQgYnkga2V5Ym9hcmQgc2lnbmFscyAoQ3RybC1DIGV0YykuXG4iCisvL3VzYWdlOiAgICAgICAiU2VlIHNldHNpZCgyKSBmb3IgZGV0YWlscy4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgc2V0c2lkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZXRzaWRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWlmICghYXJndlsxXSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJLyogc2V0c2lkKCkgaXMgYWxsb3dlZCBvbmx5IHdoZW4gd2UgYXJlIG5vdCBhIHByb2Nlc3MgZ3JvdXAgbGVhZGVyLgorCSAqIE90aGVyd2lzZSBvdXIgUElEIHNlcnZlcyBhcyBQR0lEIG9mIHNvbWUgZXhpc3RpbmcgcHJvY2VzcyBncm91cAorCSAqIGFuZCBjYW5ub3QgYmUgdXNlZCBhcyBQR0lEIG9mIGEgbmV3IHByb2Nlc3MgZ3JvdXAuCisJICoKKwkgKiBFeGFtcGxlOiBzZXRzaWQoKSBiZWxvdyBmYWlscyB3aGVuIHJ1biBhbG9uZSBpbiBpbnRlcmFjdGl2ZSBzaGVsbDoKKwkgKiAgJCBzZXRzaWQgUFJPRworCSAqIGJlY2F1c2Ugc2hlbGwncyBjaGlsZCAoc2V0c2lkKSBpcyBwdXQgaW4gYSBuZXcgcHJvY2VzcyBncm91cC4KKwkgKiBCdXQgZG9lc24ndCBmYWlsIGlmIHNoZWxsIGlzIG5vdCBpbnRlcmFjdGl2ZQorCSAqIChhbmQgdGhlcmVmb3JlIGRvZXNuJ3QgY3JlYXRlIHByb2Nlc3MgZ3JvdXBzIGZvciBwaXBlcyksCisJICogb3IgaWYgc2V0c2lkIGlzIG5vdCB0aGUgZmlyc3QgcHJvY2VzcyBpbiB0aGUgcHJvY2VzcyBncm91cDoKKwkgKiAgJCB0cnVlIHwgc2V0c2lkIFBST0cKKwkgKiBvciBpZiBzZXRzaWQgaXMgZXhlY3V0ZWQgaW4gYmFja3F1b3RlcyAoYHNldHNpZCBQUk9HYCkuLi4KKwkgKi8KKwlpZiAoc2V0c2lkKCkgPCAwKSB7CisJCXBpZF90IHBpZCA9IGZvcmtfb3JfcmV4ZWMoYXJndik7CisJCWlmIChwaWQgIT0gMCkgeworCQkJLyogcGFyZW50ICovCisJCQkvKiBUT0RPOgorCQkJICogd2UgY2FuIHdhaXRwaWQocGlkLCAmc3RhdHVzLCAwKSBhbmQgdGhlbiBldmVuCisJCQkgKiBlbXVsYXRlIGV4aXRjb2RlLCBtYWtpbmcgdGhlIGJlaGF2aW9yIGNvbnNpc3RlbnQKKwkJCSAqIGluIGJvdGggZm9ya2VkIGFuZCBub24gZm9ya2VkIGNhc2VzLgorCQkJICogSG93ZXZlciwgdGhlIGNvZGUgaXMgbGFyZ2VyIGFuZCB1cHN0cmVhbQorCQkJICogZG9lcyBub3QgZG8gc3VjaCB0cmljay4KKwkJCSAqLworCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJfQorCisJCS8qIGNoaWxkICovCisJCS8qIG5vdyB0aGVyZSBzaG91bGQgYmUgbm8gZXJyb3I6ICovCisJCXNldHNpZCgpOworCX0KKworCWFyZ3YrKzsKKwlCQl9FWEVDVlBfb3JfZGllKGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL3N0cmluZ3MuYyBiL21pc2N1dGlscy9zdHJpbmdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY1MDE4MgotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy9zdHJpbmdzLmMKQEAgLTAsMCArMSw5MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogc3RyaW5ncyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAyMDAzIFRpdG8gUmFndXNhIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzdHJpbmdzX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWFmb10gWy1uIExFTl0gW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHN0cmluZ3NfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEaXNwbGF5IHByaW50YWJsZSBzdHJpbmdzIGluIGEgYmluYXJ5IGZpbGVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJU2NhbiB3aG9sZSBmaWxlIChkZWZhdWx0KSIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJUHJlY2VkZSBzdHJpbmdzIHdpdGggZmlsZW5hbWVzIgorLy91c2FnZTogICAgICJcbgktbiBMRU4JQXQgbGVhc3QgTEVOIGNoYXJhY3RlcnMgZm9ybSBhIHN0cmluZyAoZGVmYXVsdCA0KSIKKy8vdXNhZ2U6ICAgICAiXG4JLW8JUHJlY2VkZSBzdHJpbmdzIHdpdGggZGVjaW1hbCBvZmZzZXRzIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2RlZmluZSBXSE9MRV9GSUxFICAgIDEKKyNkZWZpbmUgUFJJTlRfTkFNRSAgICAyCisjZGVmaW5lIFBSSU5UX09GRlNFVCAgNAorI2RlZmluZSBTSVpFICAgICAgICAgIDgKKworaW50IHN0cmluZ3NfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHN0cmluZ3NfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBuLCBjLCBzdGF0dXMgPSBFWElUX1NVQ0NFU1M7CisJdW5zaWduZWQgY291bnQ7CisJb2ZmX3Qgb2Zmc2V0OworCUZJTEUgKmZpbGU7CisJY2hhciAqc3RyaW5nOworCWNvbnN0IGNoYXIgKmZtdCA9ICIlczogIjsKKwljb25zdCBjaGFyICpuX2FyZyA9ICI0IjsKKworCWdldG9wdDMyKGFyZ3YsICJhZm9uOiIsICZuX2FyZyk7CisJLyogLWEgaXMgb3VyIGRlZmF1bHQgYmVoYXZpb3VyICovCisJLyphcmdjIC09IG9wdGluZDsqLworCWFyZ3YgKz0gb3B0aW5kOworCisJbiA9IHhhdG91X3JhbmdlKG5fYXJnLCAxLCBJTlRfTUFYKTsKKwlzdHJpbmcgPSB4emFsbG9jKG4gKyAxKTsKKwluLS07CisKKwlpZiAoISphcmd2KSB7CisJCWZtdCA9ICJ7JXN9OiAiOworCQkqLS1hcmd2ID0gKGNoYXIgKiliYl9tc2dfc3RhbmRhcmRfaW5wdXQ7CisJfQorCisJZG8geworCQlmaWxlID0gZm9wZW5fb3Jfd2Fybl9zdGRpbigqYXJndik7CisJCWlmICghZmlsZSkgeworCQkJc3RhdHVzID0gRVhJVF9GQUlMVVJFOworCQkJY29udGludWU7CisJCX0KKwkJb2Zmc2V0ID0gMDsKKwkJY291bnQgPSAwOworCQlkbyB7CisJCQljID0gZmdldGMoZmlsZSk7CisJCQlpZiAoaXNwcmludF9hc2NpaW9ubHkoYykgfHwgYyA9PSAnXHQnKSB7CisJCQkJaWYgKGNvdW50ID4gbikgeworCQkJCQliYl9wdXRjaGFyKGMpOworCQkJCX0gZWxzZSB7CisJCQkJCXN0cmluZ1tjb3VudF0gPSBjOworCQkJCQlpZiAoY291bnQgPT0gbikgeworCQkJCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiBQUklOVF9OQU1FKSB7CisJCQkJCQkJcHJpbnRmKGZtdCwgKmFyZ3YpOworCQkJCQkJfQorCQkJCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiBQUklOVF9PRkZTRVQpIHsKKwkJCQkJCQlwcmludGYoIiU3Ik9GRl9GTVQibyAiLCBvZmZzZXQgLSBuKTsKKwkJCQkJCX0KKwkJCQkJCWZwdXRzKHN0cmluZywgc3Rkb3V0KTsKKwkJCQkJfQorCQkJCQljb3VudCsrOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKGNvdW50ID4gbikgeworCQkJCQliYl9wdXRjaGFyKCdcbicpOworCQkJCX0KKwkJCQljb3VudCA9IDA7CisJCQl9CisJCQlvZmZzZXQrKzsKKwkJfSB3aGlsZSAoYyAhPSBFT0YpOworCQlmY2xvc2VfaWZfbm90X3N0ZGluKGZpbGUpOworCX0gd2hpbGUgKCorK2FyZ3YpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmcmVlKHN0cmluZyk7CisKKwlmZmx1c2hfc3Rkb3V0X2FuZF9leGl0KHN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvdGFza3NldC5jIGIvbWlzY3V0aWxzL3Rhc2tzZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjQ2ZTFkCi0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL3Rhc2tzZXQuYwpAQCAtMCwwICsxLDIyNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdGFza3NldCAtIHJldHJpZXZlIG9yIHNldCBhIHByb2Nlc3NlcycgQ1BVIGFmZmluaXR5CisgKiBDb3B5cmlnaHQgKGMpIDIwMDYgQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2NvbmZpZzpjb25maWcgVEFTS1NFVAorLy9jb25maWc6CWJvb2wgInRhc2tzZXQiCisvL2NvbmZpZzoJZGVmYXVsdCBuICAjIGRvZXNuJ3QgYnVpbGQgb24gc29tZSBub24teDg2IHRhcmdldHMgKG02OGspCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgUmV0cmlldmUgb3Igc2V0IGEgcHJvY2Vzc2VzJ3MgQ1BVIGFmZmluaXR5LgorLy9jb25maWc6CSAgVGhpcyByZXF1aXJlcyBzY2hlZF97ZyxzfWV0YWZmaW5pdHkgc3VwcG9ydCBpbiB5b3VyIGxpYmMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1RBU0tTRVRfRkFOQ1kKKy8vY29uZmlnOglib29sICJGYW5jeSBvdXRwdXQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBUQVNLU0VUCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQWRkIGNvZGUgZm9yIGZhbmN5IG91dHB1dC4gVGhpcyBtZXJlbHkgc2lsZW5jZXMgYSBjb21waWxlci13YXJuaW5nCisvL2NvbmZpZzoJICBhbmQgYWRkcyBhYm91dCAxMzUgQnl0ZXMuIE1heSBiZSBuZWVkZWQgZm9yIG1hY2hpbmVzIHdpdGggYWxvdAorLy9jb25maWc6CSAgb2YgQ1BVcy4KKworLy9hcHBsZXQ6SUZfVEFTS1NFVChBUFBMRVQodGFza3NldCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisvL2tidWlsZDpsaWItJChDT05GSUdfVEFTS1NFVCkgKz0gdGFza3NldC5vCisKKy8vdXNhZ2U6I2RlZmluZSB0YXNrc2V0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXBdIFtNQVNLXSBbUElEIHwgUFJPRyBBUkdTXSIKKy8vdXNhZ2U6I2RlZmluZSB0YXNrc2V0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2V0IG9yIGdldCBDUFUgYWZmaW5pdHlcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJT3BlcmF0ZSBvbiBhbiBleGlzdGluZyBQSUQiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHRhc2tzZXRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgdGFza3NldCAweDcgLi9kZ2VtbV90ZXN0JlxuIgorLy91c2FnZTogICAgICAgIiQgdGFza3NldCAtcCAweDEgJCFcbiIKKy8vdXNhZ2U6ICAgICAgICJwaWQgNDc5MCdzIGN1cnJlbnQgYWZmaW5pdHkgbWFzazogN1xuIgorLy91c2FnZTogICAgICAgInBpZCA0NzkwJ3MgbmV3IGFmZmluaXR5IG1hc2s6IDFcbiIKKy8vdXNhZ2U6ICAgICAgICIkIHRhc2tzZXQgMHg3IC9iaW4vc2ggLWMgJy4vdGFza3NldCAtcCAweDEgJCQnXG4iCisvL3VzYWdlOiAgICAgICAicGlkIDY2NzEncyBjdXJyZW50IGFmZmluaXR5IG1hc2s6IDFcbiIKKy8vdXNhZ2U6ICAgICAgICJwaWQgNjY3MSdzIG5ldyBhZmZpbml0eSBtYXNrOiAxXG4iCisvL3VzYWdlOiAgICAgICAiJCB0YXNrc2V0IC1wIDFcbiIKKy8vdXNhZ2U6ICAgICAgICJwaWQgMSdzIGN1cnJlbnQgYWZmaW5pdHkgbWFzazogM1xuIgorLyoKKyBOb3QgeWV0IGltcGxlbWVudGVkOgorICogLWEvLS1hbGwtdGFza3MgKGFmZmVjdCBhbGwgdGhyZWFkcykKKyAqIC1jLy0tY3B1LWxpc3QgIChzcGVjaWZ5IENQVXMgdmlhICIxLDMsNS03IikKKyAqLworCisjaW5jbHVkZSA8c2NoZWQuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEFTS1NFVF9GQU5DWQorI2RlZmluZSBUQVNLU0VUX1BSSU5URl9NQVNLICIlcyIKKy8qIGNyYWZ0IGEgc3RyaW5nIGZyb20gdGhlIG1hc2sgKi8KK3N0YXRpYyBjaGFyICpmcm9tX2NwdXNldChjcHVfc2V0X3QgKm1hc2spCit7CisJaW50IGk7CisJY2hhciAqcmV0ID0gTlVMTDsKKwljaGFyICpzdHIgPSB4emFsbG9jKChDUFVfU0VUU0laRSAvIDQpICsgMSk7IC8qIHdlIHdpbGwgbGVhayBpdCAqLworCisJZm9yIChpID0gQ1BVX1NFVFNJWkUgLSA0OyBpID49IDA7IGkgLT0gNCkgeworCQlpbnQgdmFsID0gMDsKKwkJaW50IG9mZjsKKwkJZm9yIChvZmYgPSAwOyBvZmYgPD0gMzsgKytvZmYpCisJCQlpZiAoQ1BVX0lTU0VUKGkgKyBvZmYsIG1hc2spKQorCQkJCXZhbCB8PSAxIDw8IG9mZjsKKwkJaWYgKCFyZXQgJiYgdmFsKQorCQkJcmV0ID0gc3RyOworCQkqc3RyKysgPSBiYl9oZXhkaWdpdHNfdXBjYXNlW3ZhbF0gfCAweDIwOworCX0KKwlyZXR1cm4gcmV0OworfQorI2Vsc2UKKyNkZWZpbmUgVEFTS1NFVF9QUklOVEZfTUFTSyAiJWxseCIKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgZnJvbV9jcHVzZXQoY3B1X3NldF90ICptYXNrKQoreworCXN0cnVjdCBCVUdfQ1BVX1NFVFNJWkVfaXNfdG9vX3NtYWxsIHsKKwkJY2hhciBCVUdfQ1BVX1NFVFNJWkVfaXNfdG9vX3NtYWxsWworCQkJQ1BVX1NFVFNJWkUgPCBzaXplb2YoaW50KSA/IC0xIDogMV07CisJfTsKKwljaGFyICpwID0gKHZvaWQqKW1hc2s7CisKKwkvKiBUYWtlIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzLiBDYXJlZnVsIQorCSAqIENvbnNpZGVyIGJvdGggQ1BVX1NFVFNJWkU9NCBhbmQgQ1BVX1NFVFNJWkU9MTAyNCBjYXNlcworCSAqLworI2lmIEJCX0JJR19FTkRJQU4KKwkvKiBGb3IgYmlnIGVuZGlhbiwgaXQgbWVhbnMgTEFTVCBiaXRzICovCisJaWYgKENQVV9TRVRTSVpFIDwgc2l6ZW9mKGxvbmcpKQorCQlwICs9IENQVV9TRVRTSVpFIC0gc2l6ZW9mKGludCk7CisJZWxzZSBpZiAoQ1BVX1NFVFNJWkUgPCBzaXplb2YobG9uZyBsb25nKSkKKwkJcCArPSBDUFVfU0VUU0laRSAtIHNpemVvZihsb25nKTsKKwllbHNlCisJCXAgKz0gQ1BVX1NFVFNJWkUgLSBzaXplb2YobG9uZyBsb25nKTsKKyNlbmRpZgorCWlmIChDUFVfU0VUU0laRSA8IHNpemVvZihsb25nKSkKKwkJcmV0dXJuICoodW5zaWduZWQqKXA7CisJaWYgKENQVV9TRVRTSVpFIDwgc2l6ZW9mKGxvbmcgbG9uZykpCisJCXJldHVybiAqKHVuc2lnbmVkIGxvbmcqKXA7CisJcmV0dXJuICoodW5zaWduZWQgbG9uZyBsb25nKilwOworfQorI2VuZGlmCisKKworaW50IHRhc2tzZXRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHRhc2tzZXRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNwdV9zZXRfdCBtYXNrOworCXBpZF90IHBpZCA9IDA7CisJdW5zaWduZWQgb3B0X3A7CisJY29uc3QgY2hhciAqY3VycmVudF9uZXc7CisJY2hhciAqcGlkX3N0cjsKKwljaGFyICphZmYgPSBhZmY7IC8qIGZvciBjb21waWxlciAqLworCisJLyogTkI6IHdlIG1pbWljIHV0aWwtbGludXgncyB0YXNrc2V0OiAtcCBkb2VzIG5vdCB0YWtlCisJICogYW4gYXJndW1lbnQsIGkuZS4sICItcE4iIGlzIE5PVCB2YWxpZCwgb25seSAiLXAgTiIhCisJICogSW5kZWVkLCB1dGlsLWxpbnV4LTIuMTMtcHJlNyB1c2VzOgorCSAqIGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICIrcGNoViIsIC4uLiksIG5vdCAiLi4ucDouLi4iICovCisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMSI7IC8qIGF0IGxlYXN0IDEgYXJnICovCisJb3B0X3AgPSBnZXRvcHQzMihhcmd2LCAiK3AiKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChvcHRfcCkgeworCQlwaWRfc3RyID0gKmFyZ3YrKzsKKwkJaWYgKCphcmd2KSB7IC8qICItcCA8YWZmPiA8cGlkPiAuLi5yZXN0LmlzLmlnbm9yZWQuLi4iICovCisJCQlhZmYgPSBwaWRfc3RyOworCQkJcGlkX3N0ciA9ICphcmd2OyAvKiBOQjogKmFyZ3YgIT0gTlVMTCBpbiB0aGlzIGNhc2UgKi8KKwkJfQorCQkvKiBlbHNlIGl0IHdhcyBqdXN0ICItcCA8cGlkPiIsIGFuZCAqYXJndiA9PSBOVUxMICovCisJCXBpZCA9IHhhdG91bF9yYW5nZShwaWRfc3RyLCAxLCAoKHVuc2lnbmVkKShwaWRfdClVTE9OR19NQVgpID4+IDEpOworCX0gZWxzZSB7CisJCWFmZiA9ICphcmd2Kys7IC8qIDxhZmY+IDxjbWQuLi4+ICovCisJCWlmICghKmFyZ3YpCisJCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJY3VycmVudF9uZXcgPSAiY3VycmVudFwwbmV3IjsKKwlpZiAob3B0X3ApIHsKKyBwcmludF9hZmY6CisJCWlmIChzY2hlZF9nZXRhZmZpbml0eShwaWQsIHNpemVvZihtYXNrKSwgJm1hc2spIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgJWNldCBwaWQgJWQncyBhZmZpbml0eSIsICdnJywgcGlkKTsKKwkJcHJpbnRmKCJwaWQgJWQncyAlcyBhZmZpbml0eSBtYXNrOiAiVEFTS1NFVF9QUklOVEZfTUFTSyJcbiIsCisJCQkJcGlkLCBjdXJyZW50X25ldywgZnJvbV9jcHVzZXQoJm1hc2spKTsKKwkJaWYgKCEqYXJndikgeworCQkJLyogRWl0aGVyIGl0IHdhcyBqdXN0ICItcCA8cGlkPiIsCisJCQkgKiBvciBpdCB3YXMgIi1wIDxhZmY+IDxwaWQ+IiBhbmQgd2UgY2FtZSBoZXJlCisJCQkgKiBmb3IgdGhlIHNlY29uZCB0aW1lIChzZWUgZ290byBiZWxvdykgKi8KKwkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCX0KKwkJKmFyZ3YgPSBOVUxMOworCQljdXJyZW50X25ldyArPSA4OyAvKiAibmV3IiAqLworCX0KKworCS8qIEFmZmluaXR5IHdhcyBzcGVjaWZpZWQsIHRyYW5zbGF0ZSBpdCBpbnRvIGNwdV9zZXRfdCAqLworCUNQVV9aRVJPKCZtYXNrKTsKKwlpZiAoIUVOQUJMRV9GRUFUVVJFX1RBU0tTRVRfRkFOQ1kpIHsKKwkJdW5zaWduZWQgaTsKKwkJdW5zaWduZWQgbG9uZyBsb25nIG07CisKKwkJLyogRG8gbm90IGFsbG93IHplcm8gbWFzazogKi8KKwkJbSA9IHhzdHJ0b3VsbF9yYW5nZShhZmYsIDAsIDEsIFVMTE9OR19NQVgpOworCQlpID0gMDsKKwkJZG8geworCQkJaWYgKG0gJiAxKQorCQkJCUNQVV9TRVQoaSwgJm1hc2spOworCQkJaSsrOworCQkJbSA+Pj0gMTsKKwkJfSB3aGlsZSAobSAhPSAwKTsKKwl9IGVsc2UgeworCQl1bnNpZ25lZCBpOworCQljaGFyICpsYXN0X2J5dGU7CisJCWNoYXIgKmJpbjsKKwkJdWludDhfdCBiaXRfaW5fYnl0ZTsKKworCQkvKiBDaGVhcCB3YXkgdG8gZ2V0ICJsb25nIGVub3VnaCIgYnVmZmVyICovCisJCWJpbiA9IHhzdHJkdXAoYWZmKTsKKworCQlpZiAoYWZmWzBdICE9ICcwJyB8fCAoYWZmWzFdfDB4MjApICE9ICd4JykgeworLyogVE9ETzogZGVjaW1hbC9vY3RhbCBtYXNrcyBhcmUgc3RpbGwgbGltaXRlZCB0byAyXjY0ICovCisJCQl1bnNpZ25lZCBsb25nIGxvbmcgbSA9IHhzdHJ0b3VsbF9yYW5nZShhZmYsIDAsIDEsIFVMTE9OR19NQVgpOworCQkJYmluICs9IHN0cmxlbihiaW4pOworCQkJbGFzdF9ieXRlID0gYmluIC0gMTsKKwkJCXdoaWxlIChtKSB7CisJCQkJKi0tYmluID0gbSAmIDB4ZmY7CisJCQkJbSA+Pj0gODsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIGFmZiBpcyAiMHguLi4uLiIsIHdlIGFjY2VwdCB2ZXJ5IGxvbmcgbWFza3MgaW4gdGhpcyBmb3JtICovCisJCQlsYXN0X2J5dGUgPSBoZXgyYmluKGJpbiwgYWZmICsgMiwgSU5UX01BWCk7CisJCQlpZiAoIWxhc3RfYnl0ZSkgeworIGJhZF9hZmY6CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBhZmZpbml0eSAnJXMnIiwgYWZmKTsKKwkJCX0KKwkJCWxhc3RfYnl0ZS0tOyAvKiBub3cgcG9pbnRzIHRvIHRoZSBsYXN0IGJ5dGUgKi8KKwkJfQorCisJCWkgPSAwOworCQliaXRfaW5fYnl0ZSA9IDE7CisJCXdoaWxlIChsYXN0X2J5dGUgPj0gYmluKSB7CisJCQlpZiAoYml0X2luX2J5dGUgJiAqbGFzdF9ieXRlKSB7CisJCQkJaWYgKGkgPj0gQ1BVX1NFVFNJWkUpCisJCQkJCWdvdG8gYmFkX2FmZjsKKwkJCQlDUFVfU0VUKGksICZtYXNrKTsKKwkJCQkvL2JiX2Vycm9yX21zZygiYml0ICVkIHNldCIsIGkpOworCQkJfQorCQkJaSsrOworCQkJLyogYml0X2luX2J5dGUgaXMgdWludDhfdCEgJiAweGZmIGlzIGltcGxpZWQgKi8KKwkJCWJpdF9pbl9ieXRlID0gKGJpdF9pbl9ieXRlIDw8IDEpOworCQkJaWYgKCFiaXRfaW5fYnl0ZSkgeworCQkJCWJpdF9pbl9ieXRlID0gMTsKKwkJCQlsYXN0X2J5dGUtLTsKKwkJCX0KKwkJfQorCX0KKworCS8qIFNldCBwaWQncyBvciBvdXIgb3duIChwaWQ9PTApIGFmZmluaXR5ICovCisJaWYgKHNjaGVkX3NldGFmZmluaXR5KHBpZCwgc2l6ZW9mKG1hc2spLCAmbWFzaykpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgJWNldCBwaWQgJWQncyBhZmZpbml0eSIsICdzJywgcGlkKTsKKworCWlmICghYXJndlswXSkgLyogIi1wIDxhZmY+IDxwaWQ+IFsuLi5pZ25vcmVkLi4uXSIgKi8KKwkJZ290byBwcmludF9hZmY7IC8qIHByaW50IG5ldyBhZmZpbml0eSBhbmQgZXhpdCAqLworCisJQkJfRVhFQ1ZQX29yX2RpZShhcmd2KTsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy90aW1lLmMgYi9taXNjdXRpbHMvdGltZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YjBiNDQKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvdGltZS5jCkBAIC0wLDAgKzEsNDI5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qICd0aW1lJyB1dGlsaXR5IHRvIGRpc3BsYXkgcmVzb3VyY2UgdXNhZ2Ugb2YgcHJvY2Vzc2VzLgorICAgQ29weXJpZ2h0IChDKSAxOTkwLCA5MSwgOTIsIDkzLCA5NiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyovCisvKiBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgRGF2aWQgS2VwcGVsIDxwYXJkb0Bjcy53YXNoaW5ndG9uLmVkdT4uCisgICBIZWF2aWx5IG1vZGlmaWVkIGJ5IERhdmlkIE1hY0tlbnppZSA8ZGptQGdudS5haS5taXQuZWR1Pi4KKyAgIEhlYXZpbHkgbW9kaWZpZWQgZm9yIGJ1c3lib3ggYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorKi8KKworLy91c2FnZTojZGVmaW5lIHRpbWVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstdl0gUFJPRyBBUkdTIgorLy91c2FnZTojZGVmaW5lIHRpbWVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSdW4gUFJPRywgZGlzcGxheSByZXNvdXJjZSB1c2FnZSB3aGVuIGl0IGV4aXRzXG4iCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPiAvKiBnZXRydXNhZ2UgKi8KKworLyogSW5mb3JtYXRpb24gb24gdGhlIHJlc291cmNlcyB1c2VkIGJ5IGEgY2hpbGQgcHJvY2Vzcy4gICovCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHdhaXRzdGF0dXM7CisJc3RydWN0IHJ1c2FnZSBydTsKKwl1bnNpZ25lZCBlbGFwc2VkX21zOwkvKiBXYWxsY2xvY2sgdGltZSBvZiBwcm9jZXNzLiAgKi8KK30gcmVzb3VyY2VfdDsKKworLyogbXNlYyA9IG1pbGxpc2Vjb25kcyA9IDEvMSwwMDAgKDEqMTBlLTMpIHNlY29uZC4KKyAgIHVzZWMgPSBtaWNyb3NlY29uZHMgPSAxLzEsMDAwLDAwMCAoMSoxMGUtNikgc2Vjb25kLiAgKi8KKworI2RlZmluZSBVTCB1bnNpZ25lZCBsb25nCisKK3N0YXRpYyBjb25zdCBjaGFyIGRlZmF1bHRfZm9ybWF0W10gQUxJR04xID0gInJlYWxcdCVFXG51c2VyXHQldVxuc3lzXHQlVCI7CisKKy8qIFRoZSBvdXRwdXQgZm9ybWF0IGZvciB0aGUgLXAgb3B0aW9uIC4qLworc3RhdGljIGNvbnN0IGNoYXIgcG9zaXhfZm9ybWF0W10gQUxJR04xID0gInJlYWwgJWVcbnVzZXIgJVVcbnN5cyAlUyI7CisKKy8qIEZvcm1hdCBzdHJpbmcgZm9yIHByaW50aW5nIGFsbCBzdGF0aXN0aWNzIHZlcmJvc2VseS4KKyAgIEtlZXAgdGhpcyBvdXRwdXQgdG8gMjQgbGluZXMgc28gdXNlcnMgb24gdGVybWluYWxzIGNhbiBzZWUgaXQgYWxsLiovCitzdGF0aWMgY29uc3QgY2hhciBsb25nX2Zvcm1hdFtdIEFMSUdOMSA9CisJIlx0Q29tbWFuZCBiZWluZyB0aW1lZDogXCIlQ1wiXG4iCisJIlx0VXNlciB0aW1lIChzZWNvbmRzKTogJVVcbiIKKwkiXHRTeXN0ZW0gdGltZSAoc2Vjb25kcyk6ICVTXG4iCisJIlx0UGVyY2VudCBvZiBDUFUgdGhpcyBqb2IgZ290OiAlUFxuIgorCSJcdEVsYXBzZWQgKHdhbGwgY2xvY2spIHRpbWUgKGg6bW06c3Mgb3IgbTpzcyk6ICVFXG4iCisJIlx0QXZlcmFnZSBzaGFyZWQgdGV4dCBzaXplIChrYnl0ZXMpOiAlWFxuIgorCSJcdEF2ZXJhZ2UgdW5zaGFyZWQgZGF0YSBzaXplIChrYnl0ZXMpOiAlRFxuIgorCSJcdEF2ZXJhZ2Ugc3RhY2sgc2l6ZSAoa2J5dGVzKTogJXBcbiIKKwkiXHRBdmVyYWdlIHRvdGFsIHNpemUgKGtieXRlcyk6ICVLXG4iCisJIlx0TWF4aW11bSByZXNpZGVudCBzZXQgc2l6ZSAoa2J5dGVzKTogJU1cbiIKKwkiXHRBdmVyYWdlIHJlc2lkZW50IHNldCBzaXplIChrYnl0ZXMpOiAldFxuIgorCSJcdE1ham9yIChyZXF1aXJpbmcgSS9PKSBwYWdlIGZhdWx0czogJUZcbiIKKwkiXHRNaW5vciAocmVjbGFpbWluZyBhIGZyYW1lKSBwYWdlIGZhdWx0czogJVJcbiIKKwkiXHRWb2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlczogJXdcbiIKKwkiXHRJbnZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzOiAlY1xuIgorCSJcdFN3YXBzOiAlV1xuIgorCSJcdEZpbGUgc3lzdGVtIGlucHV0czogJUlcbiIKKwkiXHRGaWxlIHN5c3RlbSBvdXRwdXRzOiAlT1xuIgorCSJcdFNvY2tldCBtZXNzYWdlcyBzZW50OiAlc1xuIgorCSJcdFNvY2tldCBtZXNzYWdlcyByZWNlaXZlZDogJXJcbiIKKwkiXHRTaWduYWxzIGRlbGl2ZXJlZDogJWtcbiIKKwkiXHRQYWdlIHNpemUgKGJ5dGVzKTogJVpcbiIKKwkiXHRFeGl0IHN0YXR1czogJXgiOworCisvKiBXYWl0IGZvciBhbmQgZmlsbCBpbiBkYXRhIG9uIGNoaWxkIHByb2Nlc3MgUElELgorICAgUmV0dXJuIDAgb24gZXJyb3IsIDEgaWYgb2suICAqLworLyogcGlkX3QgaXMgc2hvcnQgb24gQlNESSwgc28gZG9uJ3QgdHJ5IHRvIHByb21vdGUgaXQuICAqLworc3RhdGljIHZvaWQgcmVzdXNlX2VuZChwaWRfdCBwaWQsIHJlc291cmNlX3QgKnJlc3ApCit7CisJcGlkX3QgY2F1Z2h0OworCisJLyogSWdub3JlIHNpZ25hbHMsIGJ1dCBkb24ndCBpZ25vcmUgdGhlIGNoaWxkcmVuLiAgV2hlbiB3YWl0MworCSAqIHJldHVybnMgdGhlIGNoaWxkIHByb2Nlc3MsIHNldCB0aGUgdGltZSB0aGUgY29tbWFuZCBmaW5pc2hlZC4gKi8KKwl3aGlsZSAoKGNhdWdodCA9IHdhaXQzKCZyZXNwLT53YWl0c3RhdHVzLCAwLCAmcmVzcC0+cnUpKSAhPSBwaWQpIHsKKwkJaWYgKGNhdWdodCA9PSAtMSAmJiBlcnJubyAhPSBFSU5UUikgeworCQkJYmJfcGVycm9yX21zZygid2FpdCIpOworCQkJcmV0dXJuOworCQl9CisJfQorCXJlc3AtPmVsYXBzZWRfbXMgPSBtb25vdG9uaWNfbXMoKSAtIHJlc3AtPmVsYXBzZWRfbXM7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50YXJndihjaGFyICpjb25zdCAqYXJndikKK3sKKwljb25zdCBjaGFyICpmbXQgPSAiICVzIiArIDE7CisJZG8geworCQlwcmludGYoZm10LCAqYXJndik7CisJCWZtdCA9ICIgJXMiOworCX0gd2hpbGUgKCorK2FyZ3YpOworfQorCisvKiBSZXR1cm4gdGhlIG51bWJlciBvZiBraWxvYnl0ZXMgY29ycmVzcG9uZGluZyB0byBhIG51bWJlciBvZiBwYWdlcyBQQUdFUy4KKyAgIChBY3R1YWxseSwgd2UgdXNlIGl0IHRvIGNvbnZlcnQgcGFnZXMqdGlja3MgaW50byBraWxvYnl0ZXMqdGlja3MuKQorCisgICBUcnkgdG8gZG8gYXJpdGhtZXRpYyBzbyB0aGF0IHRoZSByaXNrIG9mIG92ZXJmbG93IGVycm9ycyBpcyBtaW5pbWl6ZWQuCisgICBUaGlzIGlzIGZ1bmt5IHNpbmNlIHRoZSBwYWdlc2l6ZSBjb3VsZCBiZSBsZXNzIHRoYW4gMUsuCisgICBOb3RlOiBTb21lIG1hY2hpbmVzIGV4cHJlc3MgZ2V0cnVzYWdlIHN0YXRpc3RpY3MgaW4gdGVybXMgb2YgSywKKyAgIG90aGVycyBpbiB0ZXJtcyBvZiBwYWdlcy4gICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwdG9rKGNvbnN0IHVuc2lnbmVkIHBhZ2VzaXplLCBjb25zdCB1bnNpZ25lZCBsb25nIHBhZ2VzKQoreworCXVuc2lnbmVkIGxvbmcgdG1wOworCisJLyogQ29udmVyc2lvbi4gICovCisJaWYgKHBhZ2VzID4gKExPTkdfTUFYIC8gcGFnZXNpemUpKSB7IC8qIENvdWxkIG92ZXJmbG93LiAgKi8KKwkJdG1wID0gcGFnZXMgLyAxMDI0OyAgICAgLyogU21hbGxlciBmaXJzdCwgKi8KKwkJcmV0dXJuIHRtcCAqIHBhZ2VzaXplOyAgLyogdGhlbiBsYXJnZXIuICAqLworCX0KKwkvKiBDb3VsZCB1bmRlcmZsb3cuICAqLworCXRtcCA9IHBhZ2VzICogcGFnZXNpemU7IC8qIExhcmdlciBmaXJzdCwgKi8KKwlyZXR1cm4gdG1wIC8gMTAyNDsgICAgICAvKiB0aGVuIHNtYWxsZXIuICAqLworfQorCisvKiBzdW1tYXJpemU6IFJlcG9ydCBvbiB0aGUgc3lzdGVtIHVzZSBvZiBhIGNvbW1hbmQuCisKKyAgIFByaW50IHRoZSBGTVQgYXJndW1lbnQgZXhjZXB0IHRoYXQgYCUnIHNlcXVlbmNlcworICAgaGF2ZSBzcGVjaWFsIG1lYW5pbmcsIGFuZCBgXG4nIGFuZCBgXHQnIGFyZSB0cmFuc2xhdGVkIGludG8KKyAgIG5ld2xpbmUgYW5kIHRhYiwgcmVzcGVjdGl2ZWx5LCBhbmQgYFxcJyBpcyB0cmFuc2xhdGVkIGludG8gYFwnLgorCisgICBUaGUgY2hhcmFjdGVyIGZvbGxvd2luZyBhIGAlJyBjYW4gYmU6CisgICAoKiBtZWFucyB0aGUgdGNzaCB0aW1lIGJ1aWx0aW4gYWxzbyByZWNvZ25pemVzIGl0KQorICAgJSA9PSBhIGxpdGVyYWwgYCUnCisgICBDID09IGNvbW1hbmQgbmFtZSBhbmQgYXJndW1lbnRzCisqICBEID09IGF2ZXJhZ2UgdW5zaGFyZWQgZGF0YSBzaXplIGluIEsgKHJ1X2lkcnNzK3J1X2lzcnNzKQorKiAgRSA9PSBlbGFwc2VkIHJlYWwgKHdhbGwgY2xvY2spIHRpbWUgaW4gW2hvdXI6XW1pbjpzZWMKKyogIEYgPT0gbWFqb3IgcGFnZSBmYXVsdHMgKHJlcXVpcmVkIHBoeXNpY2FsIEkvTykgKHJ1X21hamZsdCkKKyogIEkgPT0gZmlsZSBzeXN0ZW0gaW5wdXRzIChydV9pbmJsb2NrKQorKiAgSyA9PSBhdmVyYWdlIHRvdGFsIG1lbSB1c2FnZSAocnVfaWRyc3MrcnVfaXNyc3MrcnVfaXhyc3MpCisqICBNID09IG1heGltdW0gcmVzaWRlbnQgc2V0IHNpemUgaW4gSyAocnVfbWF4cnNzKQorKiAgTyA9PSBmaWxlIHN5c3RlbSBvdXRwdXRzIChydV9vdWJsb2NrKQorKiAgUCA9PSBwZXJjZW50IG9mIENQVSB0aGlzIGpvYiBnb3QgKHRvdGFsIGNwdSB0aW1lIC8gZWxhcHNlZCB0aW1lKQorKiAgUiA9PSBtaW5vciBwYWdlIGZhdWx0cyAocmVjbGFpbXM7IG5vIHBoeXNpY2FsIEkvTyBpbnZvbHZlZCkgKHJ1X21pbmZsdCkKKyogIFMgPT0gc3lzdGVtIChrZXJuZWwpIHRpbWUgKHNlY29uZHMpIChydV9zdGltZSkKKyogIFQgPT0gc3lzdGVtIHRpbWUgaW4gW2hvdXI6XW1pbjpzZWMKKyogIFUgPT0gdXNlciB0aW1lIChzZWNvbmRzKSAocnVfdXRpbWUpCisqICB1ID09IHVzZXIgdGltZSBpbiBbaG91cjpdbWluOnNlYworKiAgVyA9PSB0aW1lcyBzd2FwcGVkIG91dCAocnVfbnN3YXApCisqICBYID09IGF2ZXJhZ2UgYW1vdW50IG9mIHNoYXJlZCB0ZXh0IGluIEsgKHJ1X2l4cnNzKQorICAgWiA9PSBwYWdlIHNpemUKKyogIGMgPT0gaW52b2x1bnRhcnkgY29udGV4dCBzd2l0Y2hlcyAocnVfbml2Y3N3KQorICAgZSA9PSBlbGFwc2VkIHJlYWwgdGltZSBpbiBzZWNvbmRzCisqICBrID09IHNpZ25hbHMgZGVsaXZlcmVkIChydV9uc2lnbmFscykKKyAgIHAgPT0gYXZlcmFnZSB1bnNoYXJlZCBzdGFjayBzaXplIGluIEsgKHJ1X2lzcnNzKQorKiAgciA9PSBzb2NrZXQgbWVzc2FnZXMgcmVjZWl2ZWQgKHJ1X21zZ3JjdikKKyogIHMgPT0gc29ja2V0IG1lc3NhZ2VzIHNlbnQgKHJ1X21zZ3NuZCkKKyAgIHQgPT0gYXZlcmFnZSByZXNpZGVudCBzZXQgc2l6ZSBpbiBLIChydV9pZHJzcykKKyogIHcgPT0gdm9sdW50YXJ5IGNvbnRleHQgc3dpdGNoZXMgKHJ1X252Y3N3KQorICAgeCA9PSBleGl0IHN0YXR1cyBvZiBjb21tYW5kCisKKyAgIFZhcmlvdXMgbWVtb3J5IHVzYWdlcyBhcmUgZm91bmQgYnkgY29udmVydGluZyBmcm9tIHBhZ2Utc2Vjb25kcworICAgdG8ga2J5dGVzIGJ5IG11bHRpcGx5aW5nIGJ5IHRoZSBwYWdlIHNpemUsIGRpdmlkaW5nIGJ5IDEwMjQsCisgICBhbmQgZGl2aWRpbmcgYnkgZWxhcHNlZCByZWFsIHRpbWUuCisKKyAgIEZNVCBpcyB0aGUgZm9ybWF0IHN0cmluZywgaW50ZXJwcmV0ZWQgYXMgZGVzY3JpYmVkIGFib3ZlLgorICAgQ09NTUFORCBpcyB0aGUgY29tbWFuZCBhbmQgYXJncyB0aGF0IGFyZSBiZWluZyBzdW1tYXJpemVkLgorICAgUkVTUCBpcyByZXNvdXJjZSBpbmZvcm1hdGlvbiBvbiB0aGUgY29tbWFuZC4gICovCisKKyNpZm5kZWYgVElDS1NfUEVSX1NFQworI2RlZmluZSBUSUNLU19QRVJfU0VDIDEwMAorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHN1bW1hcml6ZShjb25zdCBjaGFyICpmbXQsIGNoYXIgKipjb21tYW5kLCByZXNvdXJjZV90ICpyZXNwKQoreworCXVuc2lnbmVkIHZ2X21zOyAgICAgLyogRWxhcHNlZCB2aXJ0dWFsIChDUFUpIG1pbGxpc2Vjb25kcyAqLworCXVuc2lnbmVkIGNwdV90aWNrczsgLyogU2FtZSwgaW4gIkNQVSB0aWNrcyIgKi8KKwl1bnNpZ25lZCBwYWdlc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisKKwkvKiBJbXBvc3NpYmxlOiB3ZSBkbyBub3QgdXNlIFdVTlRSQUNFRCBmbGFnIGluIHdhaXQoKS4uLgorCWlmIChXSUZTVE9QUEVEKHJlc3AtPndhaXRzdGF0dXMpKQorCQlwcmludGYoIkNvbW1hbmQgc3RvcHBlZCBieSBzaWduYWwgJXVcbiIsCisJCQkJV1NUT1BTSUcocmVzcC0+d2FpdHN0YXR1cykpOworCWVsc2UgKi8KKwlpZiAoV0lGU0lHTkFMRUQocmVzcC0+d2FpdHN0YXR1cykpCisJCXByaW50ZigiQ29tbWFuZCB0ZXJtaW5hdGVkIGJ5IHNpZ25hbCAldVxuIiwKKwkJCQlXVEVSTVNJRyhyZXNwLT53YWl0c3RhdHVzKSk7CisJZWxzZSBpZiAoV0lGRVhJVEVEKHJlc3AtPndhaXRzdGF0dXMpICYmIFdFWElUU1RBVFVTKHJlc3AtPndhaXRzdGF0dXMpKQorCQlwcmludGYoIkNvbW1hbmQgZXhpdGVkIHdpdGggbm9uLXplcm8gc3RhdHVzICV1XG4iLAorCQkJCVdFWElUU1RBVFVTKHJlc3AtPndhaXRzdGF0dXMpKTsKKworCXZ2X21zID0gKHJlc3AtPnJ1LnJ1X3V0aW1lLnR2X3NlYyArIHJlc3AtPnJ1LnJ1X3N0aW1lLnR2X3NlYykgKiAxMDAwCisJICAgICAgKyAocmVzcC0+cnUucnVfdXRpbWUudHZfdXNlYyArIHJlc3AtPnJ1LnJ1X3N0aW1lLnR2X3VzZWMpIC8gMTAwMDsKKworI2lmICgxMDAwIC8gVElDS1NfUEVSX1NFQykgKiBUSUNLU19QRVJfU0VDID09IDEwMDAKKwkvKiAxMDAwIGlzIGV4YWN0bHkgZGl2aXNpYmxlIGJ5IFRJQ0tTX1BFUl9TRUMgKHR5cGljYWwpICovCisJY3B1X3RpY2tzID0gdnZfbXMgLyAoMTAwMCAvIFRJQ0tTX1BFUl9TRUMpOworI2Vsc2UKKwljcHVfdGlja3MgPSB2dl9tcyAqICh1bnNpZ25lZCBsb25nIGxvbmcpVElDS1NfUEVSX1NFQyAvIDEwMDA7CisjZW5kaWYKKwlpZiAoIWNwdV90aWNrcykgY3B1X3RpY2tzID0gMTsgLyogd2UgZGl2aWRlIGJ5IGl0LCBtdXN0IGJlIG5vbnplcm8gKi8KKworCXdoaWxlICgqZm10KSB7CisJCS8qIEhhbmRsZSBsZWFkaW5nIGxpdGVyYWwgcGFydCAqLworCQlpbnQgbiA9IHN0cmNzcG4oZm10LCAiJVxcIik7CisJCWlmIChuKSB7CisJCQlwcmludGYoIiUuKnMiLCBuLCBmbXQpOworCQkJZm10ICs9IG47CisJCQljb250aW51ZTsKKwkJfQorCisJCXN3aXRjaCAoKmZtdCkgeworI2lmZGVmIE5PVF9ORUVERUQKKwkJLyogSGFuZGxlIGxpdGVyYWwgY2hhciAqLworCQkvKiBVc3VhbGx5IHdlIG9wdGltaXplIGZvciBzaXplLCBidXQgdGhlcmUgaXMgYSBsaW1pdAorCQkgKiBmb3IgZXZlcnl0aGluZy4gV2l0aCB0aGlzIHdlIGRvIGEgbG90IG9mIDEtYnl0ZSB3cml0ZXMgKi8KKwkJZGVmYXVsdDoKKwkJCWJiX3B1dGNoYXIoKmZtdCk7CisJCQlicmVhazsKKyNlbmRpZgorCisJCWNhc2UgJyUnOgorCQkJc3dpdGNoICgqKytmbXQpIHsKKyNpZmRlZiBOT1RfTkVFREVEX1lFVAorCQkvKiBPdXIgZm9ybWF0IHN0cmluZ3MgZG8gbm90IGhhdmUgdGhlc2UgKi8KKwkJLyogYW5kIHdlIGRvIG5vdCB0YWtlIGZvcm1hdCBzdHIgZnJvbSB1c2VyICovCisJCQlkZWZhdWx0OgorCQkJCWJiX3B1dGNoYXIoJyUnKTsKKwkJCQkvKkZBTExUSFJPVUdIKi8KKwkJCWNhc2UgJyUnOgorCQkJCWlmICghKmZtdCkgZ290byByZXQ7CisJCQkJYmJfcHV0Y2hhcigqZm10KTsKKwkJCQlicmVhazsKKyNlbmRpZgorCQkJY2FzZSAnQyc6CS8qIFRoZSBjb21tYW5kIHRoYXQgZ290IHRpbWVkLiAgKi8KKwkJCQlwcmludGFyZ3YoY29tbWFuZCk7CisJCQkJYnJlYWs7CisJCQljYXNlICdEJzoJLyogQXZlcmFnZSB1bnNoYXJlZCBkYXRhIHNpemUuICAqLworCQkJCXByaW50ZigiJWx1IiwKKwkJCQkJKHB0b2socGFnZXNpemUsIChVTCkgcmVzcC0+cnUucnVfaWRyc3MpICsKKwkJCQkJIHB0b2socGFnZXNpemUsIChVTCkgcmVzcC0+cnUucnVfaXNyc3MpKSAvIGNwdV90aWNrcyk7CisJCQkJYnJlYWs7CisJCQljYXNlICdFJzogewkvKiBFbGFwc2VkIHJlYWwgKHdhbGwgY2xvY2spIHRpbWUuICAqLworCQkJCXVuc2lnbmVkIHNlY29uZHMgPSByZXNwLT5lbGFwc2VkX21zIC8gMTAwMDsKKwkJCQlpZiAoc2Vjb25kcyA+PSAzNjAwKQkvKiBPbmUgaG91ciAtPiBoOm06cy4gICovCisJCQkJCXByaW50ZigiJXVoICV1bSAlMDJ1cyIsCisJCQkJCQkJc2Vjb25kcyAvIDM2MDAsCisJCQkJCQkJKHNlY29uZHMgJSAzNjAwKSAvIDYwLAorCQkJCQkJCXNlY29uZHMgJSA2MCk7CisJCQkJZWxzZQorCQkJCQlwcmludGYoIiV1bSAldS4lMDJ1cyIsCS8qIC0+IG06cy4gICovCisJCQkJCQkJc2Vjb25kcyAvIDYwLAorCQkJCQkJCXNlY29uZHMgJSA2MCwKKwkJCQkJCQkodW5zaWduZWQpKHJlc3AtPmVsYXBzZWRfbXMgLyAxMCkgJSAxMDApOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSAnRic6CS8qIE1ham9yIHBhZ2UgZmF1bHRzLiAgKi8KKwkJCQlwcmludGYoIiVsdSIsIHJlc3AtPnJ1LnJ1X21hamZsdCk7CisJCQkJYnJlYWs7CisJCQljYXNlICdJJzoJLyogSW5wdXRzLiAgKi8KKwkJCQlwcmludGYoIiVsdSIsIHJlc3AtPnJ1LnJ1X2luYmxvY2spOworCQkJCWJyZWFrOworCQkJY2FzZSAnSyc6CS8qIEF2ZXJhZ2UgbWVtIHVzYWdlID09IGRhdGErc3RhY2srdGV4dC4gICovCisJCQkJcHJpbnRmKCIlbHUiLAorCQkJCQkocHRvayhwYWdlc2l6ZSwgKFVMKSByZXNwLT5ydS5ydV9pZHJzcykgKworCQkJCQkgcHRvayhwYWdlc2l6ZSwgKFVMKSByZXNwLT5ydS5ydV9pc3JzcykgKworCQkJCQkgcHRvayhwYWdlc2l6ZSwgKFVMKSByZXNwLT5ydS5ydV9peHJzcykpIC8gY3B1X3RpY2tzKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ00nOgkvKiBNYXhpbXVtIHJlc2lkZW50IHNldCBzaXplLiAgKi8KKwkJCQlwcmludGYoIiVsdSIsIHB0b2socGFnZXNpemUsIChVTCkgcmVzcC0+cnUucnVfbWF4cnNzKSk7CisJCQkJYnJlYWs7CisJCQljYXNlICdPJzoJLyogT3V0cHV0cy4gICovCisJCQkJcHJpbnRmKCIlbHUiLCByZXNwLT5ydS5ydV9vdWJsb2NrKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1AnOgkvKiBQZXJjZW50IG9mIENQVSB0aGlzIGpvYiBnb3QuICAqLworCQkJCS8qICUgY3B1IGlzICh0b3RhbCBjcHUgdGltZSkvKGVsYXBzZWQgdGltZSkuICAqLworCQkJCWlmIChyZXNwLT5lbGFwc2VkX21zID4gMCkKKwkJCQkJcHJpbnRmKCIldSUlIiwgKHVuc2lnbmVkKSh2dl9tcyAqIDEwMCAvIHJlc3AtPmVsYXBzZWRfbXMpKTsKKwkJCQllbHNlCisJCQkJCXByaW50ZigiPyUlIik7CisJCQkJYnJlYWs7CisJCQljYXNlICdSJzoJLyogTWlub3IgcGFnZSBmYXVsdHMgKHJlY2xhaW1zKS4gICovCisJCQkJcHJpbnRmKCIlbHUiLCByZXNwLT5ydS5ydV9taW5mbHQpOworCQkJCWJyZWFrOworCQkJY2FzZSAnUyc6CS8qIFN5c3RlbSB0aW1lLiAgKi8KKwkJCQlwcmludGYoIiV1LiUwMnUiLAorCQkJCQkJKHVuc2lnbmVkKXJlc3AtPnJ1LnJ1X3N0aW1lLnR2X3NlYywKKwkJCQkJCSh1bnNpZ25lZCkocmVzcC0+cnUucnVfc3RpbWUudHZfdXNlYyAvIDEwMDAwKSk7CisJCQkJYnJlYWs7CisJCQljYXNlICdUJzoJLyogU3lzdGVtIHRpbWUuICAqLworCQkJCWlmIChyZXNwLT5ydS5ydV9zdGltZS50dl9zZWMgPj0gMzYwMCkgLyogT25lIGhvdXIgLT4gaDptOnMuICAqLworCQkJCQlwcmludGYoIiV1aCAldW0gJTAydXMiLAorCQkJCQkJCSh1bnNpZ25lZCkocmVzcC0+cnUucnVfc3RpbWUudHZfc2VjIC8gMzYwMCksCisJCQkJCQkJKHVuc2lnbmVkKShyZXNwLT5ydS5ydV9zdGltZS50dl9zZWMgJSAzNjAwKSAvIDYwLAorCQkJCQkJCSh1bnNpZ25lZCkocmVzcC0+cnUucnVfc3RpbWUudHZfc2VjICUgNjApKTsKKwkJCQllbHNlCisJCQkJCXByaW50ZigiJXVtICV1LiUwMnVzIiwJLyogLT4gbTpzLiAgKi8KKwkJCQkJCQkodW5zaWduZWQpKHJlc3AtPnJ1LnJ1X3N0aW1lLnR2X3NlYyAvIDYwKSwKKwkJCQkJCQkodW5zaWduZWQpKHJlc3AtPnJ1LnJ1X3N0aW1lLnR2X3NlYyAlIDYwKSwKKwkJCQkJCQkodW5zaWduZWQpKHJlc3AtPnJ1LnJ1X3N0aW1lLnR2X3VzZWMgLyAxMDAwMCkpOworCQkJCWJyZWFrOworCQkJY2FzZSAnVSc6CS8qIFVzZXIgdGltZS4gICovCisJCQkJcHJpbnRmKCIldS4lMDJ1IiwKKwkJCQkJCSh1bnNpZ25lZClyZXNwLT5ydS5ydV91dGltZS50dl9zZWMsCisJCQkJCQkodW5zaWduZWQpKHJlc3AtPnJ1LnJ1X3V0aW1lLnR2X3VzZWMgLyAxMDAwMCkpOworCQkJCWJyZWFrOworCQkJY2FzZSAndSc6CS8qIFVzZXIgdGltZS4gICovCisJCQkJaWYgKHJlc3AtPnJ1LnJ1X3V0aW1lLnR2X3NlYyA+PSAzNjAwKSAvKiBPbmUgaG91ciAtPiBoOm06cy4gICovCisJCQkJCXByaW50ZigiJXVoICV1bSAlMDJ1cyIsCisJCQkJCQkJKHVuc2lnbmVkKShyZXNwLT5ydS5ydV91dGltZS50dl9zZWMgLyAzNjAwKSwKKwkJCQkJCQkodW5zaWduZWQpKHJlc3AtPnJ1LnJ1X3V0aW1lLnR2X3NlYyAlIDM2MDApIC8gNjAsCisJCQkJCQkJKHVuc2lnbmVkKShyZXNwLT5ydS5ydV91dGltZS50dl9zZWMgJSA2MCkpOworCQkJCWVsc2UKKwkJCQkJcHJpbnRmKCIldW0gJXUuJTAydXMiLAkvKiAtPiBtOnMuICAqLworCQkJCQkJCSh1bnNpZ25lZCkocmVzcC0+cnUucnVfdXRpbWUudHZfc2VjIC8gNjApLAorCQkJCQkJCSh1bnNpZ25lZCkocmVzcC0+cnUucnVfdXRpbWUudHZfc2VjICUgNjApLAorCQkJCQkJCSh1bnNpZ25lZCkocmVzcC0+cnUucnVfdXRpbWUudHZfdXNlYyAvIDEwMDAwKSk7CisJCQkJYnJlYWs7CisJCQljYXNlICdXJzoJLyogVGltZXMgc3dhcHBlZCBvdXQuICAqLworCQkJCXByaW50ZigiJWx1IiwgcmVzcC0+cnUucnVfbnN3YXApOworCQkJCWJyZWFrOworCQkJY2FzZSAnWCc6CS8qIEF2ZXJhZ2Ugc2hhcmVkIHRleHQgc2l6ZS4gICovCisJCQkJcHJpbnRmKCIlbHUiLCBwdG9rKHBhZ2VzaXplLCAoVUwpIHJlc3AtPnJ1LnJ1X2l4cnNzKSAvIGNwdV90aWNrcyk7CisJCQkJYnJlYWs7CisJCQljYXNlICdaJzoJLyogUGFnZSBzaXplLiAgKi8KKwkJCQlwcmludGYoIiV1IiwgcGFnZXNpemUpOworCQkJCWJyZWFrOworCQkJY2FzZSAnYyc6CS8qIEludm9sdW50YXJ5IGNvbnRleHQgc3dpdGNoZXMuICAqLworCQkJCXByaW50ZigiJWx1IiwgcmVzcC0+cnUucnVfbml2Y3N3KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2UnOgkvKiBFbGFwc2VkIHJlYWwgdGltZSBpbiBzZWNvbmRzLiAgKi8KKwkJCQlwcmludGYoIiV1LiUwMnUiLAorCQkJCQkJKHVuc2lnbmVkKXJlc3AtPmVsYXBzZWRfbXMgLyAxMDAwLAorCQkJCQkJKHVuc2lnbmVkKShyZXNwLT5lbGFwc2VkX21zIC8gMTApICUgMTAwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2snOgkvKiBTaWduYWxzIGRlbGl2ZXJlZC4gICovCisJCQkJcHJpbnRmKCIlbHUiLCByZXNwLT5ydS5ydV9uc2lnbmFscyk7CisJCQkJYnJlYWs7CisJCQljYXNlICdwJzoJLyogQXZlcmFnZSBzdGFjayBzZWdtZW50LiAgKi8KKwkJCQlwcmludGYoIiVsdSIsIHB0b2socGFnZXNpemUsIChVTCkgcmVzcC0+cnUucnVfaXNyc3MpIC8gY3B1X3RpY2tzKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3InOgkvKiBJbmNvbWluZyBzb2NrZXQgbWVzc2FnZXMgcmVjZWl2ZWQuICAqLworCQkJCXByaW50ZigiJWx1IiwgcmVzcC0+cnUucnVfbXNncmN2KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3MnOgkvKiBPdXRnb2luZyBzb2NrZXQgbWVzc2FnZXMgc2VudC4gICovCisJCQkJcHJpbnRmKCIlbHUiLCByZXNwLT5ydS5ydV9tc2dzbmQpOworCQkJCWJyZWFrOworCQkJY2FzZSAndCc6CS8qIEF2ZXJhZ2UgcmVzaWRlbnQgc2V0IHNpemUuICAqLworCQkJCXByaW50ZigiJWx1IiwgcHRvayhwYWdlc2l6ZSwgKFVMKSByZXNwLT5ydS5ydV9pZHJzcykgLyBjcHVfdGlja3MpOworCQkJCWJyZWFrOworCQkJY2FzZSAndyc6CS8qIFZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzLiAgKi8KKwkJCQlwcmludGYoIiVsdSIsIHJlc3AtPnJ1LnJ1X252Y3N3KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3gnOgkvKiBFeGl0IHN0YXR1cy4gICovCisJCQkJcHJpbnRmKCIldSIsIFdFWElUU1RBVFVTKHJlc3AtPndhaXRzdGF0dXMpKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCisjaWZkZWYgTk9UX05FRURFRF9ZRVQKKwkJY2FzZSAnXFwnOgkJLyogRm9ybWF0IGVzY2FwZS4gICovCisJCQlzd2l0Y2ggKCorK2ZtdCkgeworCQkJZGVmYXVsdDoKKwkJCQliYl9wdXRjaGFyKCdcXCcpOworCQkJCS8qRkFMTFRIUk9VR0gqLworCQkJY2FzZSAnXFwnOgorCQkJCWlmICghKmZtdCkgZ290byByZXQ7CisJCQkJYmJfcHV0Y2hhcigqZm10KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3QnOgorCQkJCWJiX3B1dGNoYXIoJ1x0Jyk7CisJCQkJYnJlYWs7CisJCQljYXNlICduJzoKKwkJCQliYl9wdXRjaGFyKCdcbicpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisjZW5kaWYKKwkJfQorCQkrK2ZtdDsKKwl9CisgLyogcmV0OiAqLworCWJiX3B1dGNoYXIoJ1xuJyk7Cit9CisKKy8qIFJ1biBjb21tYW5kIENNRCBhbmQgcmV0dXJuIHN0YXRpc3RpY3Mgb24gaXQuCisgICBQdXQgdGhlIHN0YXRpc3RpY3MgaW4gKlJFU1AuICAqLworc3RhdGljIHZvaWQgcnVuX2NvbW1hbmQoY2hhciAqY29uc3QgKmNtZCwgcmVzb3VyY2VfdCAqcmVzcCkKK3sKKwlwaWRfdCBwaWQ7CisJdm9pZCAoKmludGVycnVwdF9zaWduYWwpKGludCk7CisJdm9pZCAoKnF1aXRfc2lnbmFsKShpbnQpOworCisJcmVzcC0+ZWxhcHNlZF9tcyA9IG1vbm90b25pY19tcygpOworCXBpZCA9IHh2Zm9yaygpOworCWlmIChwaWQgPT0gMCkgeworCQkvKiBDaGlsZCAqLworCQlCQl9FWEVDVlBfb3JfZGllKChjaGFyKiopY21kKTsKKwl9CisKKwkvKiBIYXZlIHNpZ25hbHMga2lsbCB0aGUgY2hpbGQgYnV0IG5vdCBzZWxmIChpZiBwb3NzaWJsZSkuICAqLworLy9UT0RPOiBqdXN0IGJsb2NrIGFsbCBzaWdzPyBhbmQgcmVlbmFibGUgdGhlbSBpbiB0aGUgdmVyeSBlbmQgaW4gbWFpbj8KKwlpbnRlcnJ1cHRfc2lnbmFsID0gc2lnbmFsKFNJR0lOVCwgU0lHX0lHTik7CisJcXVpdF9zaWduYWwgPSBzaWduYWwoU0lHUVVJVCwgU0lHX0lHTik7CisKKwlyZXN1c2VfZW5kKHBpZCwgcmVzcCk7CisKKwkvKiBSZS1lbmFibGUgc2lnbmFscy4gICovCisJc2lnbmFsKFNJR0lOVCwgaW50ZXJydXB0X3NpZ25hbCk7CisJc2lnbmFsKFNJR1FVSVQsIHF1aXRfc2lnbmFsKTsKK30KKworaW50IHRpbWVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHRpbWVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXJlc291cmNlX3QgcmVzOworCWNvbnN0IGNoYXIgKm91dHB1dF9mb3JtYXQgPSBkZWZhdWx0X2Zvcm1hdDsKKwlpbnQgb3B0OworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiOyAvKiBhdCBsZWFzdCBvbmUgYXJnICovCisJLyogIisiOiBzdG9wIG9uIGZpcnN0IG5vbi1vcHRpb24gKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiK3ZwIik7CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKG9wdCAmIDEpCisJCW91dHB1dF9mb3JtYXQgPSBsb25nX2Zvcm1hdDsKKwlpZiAob3B0ICYgMikKKwkJb3V0cHV0X2Zvcm1hdCA9IHBvc2l4X2Zvcm1hdDsKKworCXJ1bl9jb21tYW5kKGFyZ3YsICZyZXMpOworCisJLyogQ2hlYXQuIHByaW50ZidzIGFyZSBzaG9ydGVyIDopICovCisJeGR1cDIoU1RERVJSX0ZJTEVOTywgU1RET1VUX0ZJTEVOTyk7CisJc3VtbWFyaXplKG91dHB1dF9mb3JtYXQsIGFyZ3YsICZyZXMpOworCisJaWYgKFdJRlNUT1BQRUQocmVzLndhaXRzdGF0dXMpKQorCQlyZXR1cm4gV1NUT1BTSUcocmVzLndhaXRzdGF0dXMpOworCWlmIChXSUZTSUdOQUxFRChyZXMud2FpdHN0YXR1cykpCisJCXJldHVybiBXVEVSTVNJRyhyZXMud2FpdHN0YXR1cyk7CisJaWYgKFdJRkVYSVRFRChyZXMud2FpdHN0YXR1cykpCisJCXJldHVybiBXRVhJVFNUQVRVUyhyZXMud2FpdHN0YXR1cyk7CisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChFWElUX1NVQ0NFU1MpOworfQpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL3RpbWVvdXQuYyBiL21pc2N1dGlscy90aW1lb3V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1NjU5MwotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy90aW1lb3V0LmMKQEAgLTAsMCArMSwxMTggQEAKKy8qICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKgorICogQ09QWUlORyBOT1RFUworICoKKyAqIHRpbWVvdXQuYyAtLSBhIHRpbWVvdXQgaGFuZGxlciBmb3Igc2hlbGwgY29tbWFuZHMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtNiwgUm9iZXJ0byBBLiBGb2dsaWV0dGEgPG1lQHJvYmVydG8uZm9nbGlldHRhLm5hbWU+CisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UuCisgKgorICogICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisvKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICogKiAqICoKKyAqIFJFVklTSU9OIE5PVEVTOgorICogcmVsZWFzZWQgMTctMTEtMjAwNSBieSBSb2JlcnRvIEEuIEZvZ2xpZXR0YQorICogdGFsYXJtICAgMDQtMTItMjAwNSBieSBSb2JlcnRvIEEuIEZvZ2xpZXR0YQorICogbW9kaWZpZWQgMDUtMTItMjAwNSBieSBSb2JlcnRvIEEuIEZvZ2xpZXR0YQorICogc2l6ZXJkY3QgMDYtMTItMjAwNSBieSBSb2JlcnRvIEEuIEZvZ2xpZXR0YQorICogc3BsaXRzemYgMTItMDUtMjAwNiBieSBSb2JlcnRvIEEuIEZvZ2xpZXR0YQorICogcmV3cml0ZSAgMTQtMTEtMjAwOCB2ZGEKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgdGltZW91dF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy10IFNFQ1NdIFstcyBTSUddIFBST0cgQVJHUyIKKy8vdXNhZ2U6I2RlZmluZSB0aW1lb3V0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUnVucyBQUk9HLiBTZW5kcyBTSUcgdG8gaXQgaWYgaXQgaXMgbm90IGdvbmUgaW4gU0VDUyBzZWNvbmRzLlxuIgorLy91c2FnZTogICAgICAgIkRlZmF1bHRzOiBTRUNTOiAxMCwgU0lHOiBURVJNLiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCB0aW1lb3V0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0aW1lb3V0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgc2lnbm87CisJaW50IHN0YXR1czsKKwlpbnQgcGFyZW50ID0gMDsKKwlpbnQgdGltZW91dCA9IDEwOworCXBpZF90IHBpZDsKKyNpZiAhQkJfTU1VCisJY2hhciAqc3YxLCAqc3YyOworI2VuZGlmCisJY29uc3QgY2hhciAqb3B0X3MgPSAiVEVSTSI7CisKKwkvKiAtcCBvcHRpb24gaXMgbm90IGRvY3VtZW50ZWQsIGl0IGlzIG5lZWRlZCB0byBzdXBwb3J0IE5PTU1VLiAqLworCisJLyogLXQgU0VDT05EUzsgLXAgUEFSRU5UX1BJRCAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gInQrIiBVU0VfRk9SX05PTU1VKCI6cCsiKTsKKwkvKiAnKyc6IHN0b3AgYXQgZmlyc3Qgbm9uLW9wdGlvbiAqLworCWdldG9wdDMyKGFyZ3YsICIrczp0OiIgVVNFX0ZPUl9OT01NVSgicDoiKSwgJm9wdF9zLCAmdGltZW91dCwgJnBhcmVudCk7CisJLyphcmd2ICs9IG9wdGluZDsgLSBubywgd2FpdCBmb3IgYmJfZGFlbW9uaXplX29yX3JleGVjISAqLworCXNpZ25vID0gZ2V0X3NpZ251bShvcHRfcyk7CisJaWYgKHNpZ25vIDwgMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gc2lnbmFsICclcyciLCBvcHRfcyk7CisKKwkvKiBXZSB3YW50IHRvIGNyZWF0ZSBhIGdyYW5kY2hpbGQgd2hpY2ggd2lsbCB3YXRjaAorCSAqIGFuZCBraWxsIHRoZSBncmFuZHBhcmVudC4gT3RoZXIgbWV0aG9kczoKKwkgKiBtYWtpbmcgcGFyZW50IHdhdGNoIGNoaWxkIGRpc3J1cHRzIHBhcmVudDwtPmNoaWxkIGxpbmsKKwkgKiAoZXhhbXBsZTogInRjcHN2ZCAwLjAuMC4wIDEyMzQgdGltZW91dCBzZXJ2aWNlX3Byb2ciIC0KKwkgKiBpdCdzIGJldHRlciBpZiBzZXJ2aWNlX3Byb2cgaXMgYSBjaGlsZCBvZiB0Y3BzdmQhKSwKKwkgKiBtYWtpbmcgY2hpbGQgd2F0Y2ggcGFyZW50IHJlc3VsdHMgaW4gcHJvZ3JhbXMgaGF2aW5nCisJICogdW5leHBlY3RlZCBjaGlsZHJlbi4gKi8KKworCWlmIChwYXJlbnQpIC8qIHdlIHdlcmUgcmUtZXhlY2VkLCBhbHJlYWR5IGdyYW5kY2hpbGQgKi8KKwkJZ290byBncmFuZGNoaWxkOworCWlmICghYXJndltvcHRpbmRdKSAvKiBubyBQUk9HPyAqLworCQliYl9zaG93X3VzYWdlKCk7CisKKyNpZiAhQkJfTU1VCisJc3YxID0gYXJndltvcHRpbmRdOworCXN2MiA9IGFyZ3Zbb3B0aW5kICsgMV07CisjZW5kaWYKKwlwaWQgPSB4dmZvcmsoKTsKKwlpZiAocGlkID09IDApIHsKKwkJLyogQ2hpbGQ6IHNwYXduIGdyYW5kY2hpbGQgYW5kIGV4aXQgKi8KKwkJcGFyZW50ID0gZ2V0cHBpZCgpOworI2lmICFCQl9NTVUKKwkJYXJndltvcHRpbmRdID0geGFzcHJpbnRmKCItcCV1IiwgcGFyZW50KTsKKwkJYXJndltvcHRpbmQgKyAxXSA9IE5VTEw7CisjZW5kaWYKKwkJLyogTkI6IGV4aXRzIHdpdGggbm9uemVybyBvbiBlcnJvcjogKi8KKwkJYmJfZGFlbW9uaXplX29yX3JleGVjKDAsIGFyZ3YpOworCQkvKiBIZXJlIHdlIGFyZSBncmFuZGNoaWxkLiBTbGVlcCwgdGhlbiBraWxsIGdyYW5kcGFyZW50ICovCisgZ3JhbmRjaGlsZDoKKwkJLyogSnVzdCBzbGVlcChIVUdFX05VTSk7IGtpbGwocGFyZW50KSBtYXkga2lsbCB3cm9uZyBwcm9jZXNzISAqLworCQl3aGlsZSAoMSkgeworCQkJc2xlZXAoMSk7CisJCQlpZiAoLS10aW1lb3V0IDw9IDApCisJCQkJYnJlYWs7CisJCQlpZiAoa2lsbChwYXJlbnQsIDApKSB7CisJCQkJLyogcHJvY2VzcyBpcyBnb25lICovCisJCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJCX0KKwkJfQorCQlraWxsKHBhcmVudCwgc2lnbm8pOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCS8qIFBhcmVudCAqLworCXdhaXQoJnN0YXR1cyk7IC8qIHdhaXQgZm9yIGNoaWxkIHRvIGRpZSAqLworCS8qIERpZCBpbnRlcm1lZGlhdGUgW3ZdZm9yayBvciBleGVjIGZhaWw/ICovCisJaWYgKCFXSUZFWElURUQoc3RhdHVzKSB8fCBXRVhJVFNUQVRVUyhzdGF0dXMpICE9IDApCisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJLyogT2ssIGV4ZWMgYSBwcm9ncmFtIGFzIHJlcXVlc3RlZCAqLworCWFyZ3YgKz0gb3B0aW5kOworI2lmICFCQl9NTVUKKwlhcmd2WzBdID0gc3YxOworCWFyZ3ZbMV0gPSBzdjI7CisjZW5kaWYKKwlCQl9FWEVDVlBfb3JfZGllKGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL3R0eXNpemUuYyBiL21pc2N1dGlscy90dHlzaXplLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJkNDhkMAotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy90dHlzaXplLmMKQEAgLTAsMCArMSw1MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogUmVwbGFjZW1lbnQgZm9yICJzdHR5IHNpemUiLCB3aGljaCBpcyBhd2t3YXJkIGZvciBzaGVsbCBzY3JpcHQgdXNlLgorICogLSBBbGxvd3MgdG8gcmVxdWVzdCB3aWR0aCwgaGVpZ2h0LCBvciBib3RoLCBpbiBhbnkgb3JkZXIuCisgKiAtIERvZXMgbm90IGNvbXBsYWluIG9uIGVycm9yLCBidXQgcmV0dXJucyB3aWR0aCA4MCwgaGVpZ2h0IDI0LgorICogLSBTaXplOiBsZXNzIHRoYW4gMjAwIGJ5dGVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgdHR5c2l6ZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW3ddIFtoXSIKKy8vdXNhZ2U6I2RlZmluZSB0dHlzaXplX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgZGltZW5zaW9uKHMpIG9mIHN0ZGluJ3MgdGVybWluYWwsIG9uIGVycm9yIHJldHVybiA4MHgyNSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCB0dHlzaXplX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0dHlzaXplX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCB3LCBoOworCXN0cnVjdCB3aW5zaXplIHdzejsKKworCXcgPSA4MDsKKwloID0gMjQ7CisJaWYgKCFpb2N0bCgwLCBUSU9DR1dJTlNaLCAmd3N6KSkgeworCQl3ID0gd3N6LndzX2NvbDsKKwkJaCA9IHdzei53c19yb3c7CisJfQorCisJaWYgKCFhcmd2WzFdKSB7CisJCXByaW50ZigiJXUgJXUiLCB3LCBoKTsKKwl9IGVsc2UgeworCQljb25zdCBjaGFyICpmbXQsICphcmc7CisKKwkJZm10ID0gIiV1ICV1IiArIDM7IC8qICIldSIgKi8KKwkJd2hpbGUgKChhcmcgPSAqKythcmd2KSAhPSBOVUxMKSB7CisJCQljaGFyIGMgPSBhcmdbMF07CisJCQlpZiAoYyA9PSAndycpCisJCQkJcHJpbnRmKGZtdCwgdyk7CisJCQlpZiAoYyA9PSAnaCcpCisJCQkJcHJpbnRmKGZtdCwgaCk7CisJCQlmbXQgPSAiJXUgJXUiICsgMjsgLyogIiAldSIgKi8KKwkJfQorCX0KKwliYl9wdXRjaGFyKCdcbicpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWlzY3V0aWxzL3ViaV90b29scy5jIGIvbWlzY3V0aWxzL3ViaV90b29scy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMWJkYTMKLS0tIC9kZXYvbnVsbAorKysgYi9taXNjdXRpbHMvdWJpX3Rvb2xzLmMKQEAgLTAsMCArMSwzMzYgQEAKKy8qIFBvcnRlZCB0byBidXN5Ym94IGZyb20gbXRkLXV0aWxzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9jb25maWc6Y29uZmlnIFVCSUFUVEFDSAorLy9jb25maWc6CWJvb2wgInViaWF0dGFjaCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglzZWxlY3QgUExBVEZPUk1fTElOVVgKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBBdHRhY2ggTVREIGRldmljZSB0byBhbiBVQkkgZGV2aWNlLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgVUJJREVUQUNICisvL2NvbmZpZzoJYm9vbCAidWJpZGV0YWNoIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CXNlbGVjdCBQTEFURk9STV9MSU5VWAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIERldGFjaCBNVEQgZGV2aWNlIGZyb20gYW4gVUJJIGRldmljZS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIFVCSU1LVk9MCisvL2NvbmZpZzoJYm9vbCAidWJpbWt2b2wiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQ3JlYXRlIGEgVUJJIHZvbHVtZS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIFVCSVJNVk9MCisvL2NvbmZpZzoJYm9vbCAidWJpcm12b2wiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRGVsZXRlIGEgVUJJIHZvbHVtZS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIFVCSVJTVk9MCisvL2NvbmZpZzoJYm9vbCAidWJpcnN2b2wiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgUmVzaXplIGEgVUJJIHZvbHVtZS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIFVCSVVQREFURVZPTAorLy9jb25maWc6CWJvb2wgInViaXVwZGF0ZXZvbCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglzZWxlY3QgUExBVEZPUk1fTElOVVgKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBVcGRhdGUgYSBVQkkgdm9sdW1lLgorCisvL2FwcGxldDpJRl9VQklBVFRBQ0goQVBQTEVUX09ERE5BTUUodWJpYXR0YWNoLCB1YmlfdG9vbHMsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QLCB1YmlhdHRhY2gpKQorLy9hcHBsZXQ6SUZfVUJJREVUQUNIKEFQUExFVF9PREROQU1FKHViaWRldGFjaCwgdWJpX3Rvb2xzLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCwgdWJpZGV0YWNoKSkKKy8vYXBwbGV0OklGX1VCSU1LVk9MKEFQUExFVF9PREROQU1FKHViaW1rdm9sLCB1YmlfdG9vbHMsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QLCB1Ymlta3ZvbCkpCisvL2FwcGxldDpJRl9VQklSTVZPTChBUFBMRVRfT0RETkFNRSh1YmlybXZvbCwgdWJpX3Rvb2xzLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCwgdWJpcm12b2wpKQorLy9hcHBsZXQ6SUZfVUJJUlNWT0woQVBQTEVUX09ERE5BTUUodWJpcnN2b2wsIHViaV90b29scywgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1AsIHViaXJzdm9sKSkKKy8vYXBwbGV0OklGX1VCSVVQREFURVZPTChBUFBMRVRfT0RETkFNRSh1Yml1cGRhdGV2b2wsIHViaV90b29scywgQkJfRElSX1VTUl9TQklOLCBCQl9TVUlEX0RST1AsIHViaXVwZGF0ZXZvbCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19VQklBVFRBQ0gpICs9IHViaV90b29scy5vCisvL2tidWlsZDpsaWItJChDT05GSUdfVUJJREVUQUNIKSArPSB1YmlfdG9vbHMubworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1VCSU1LVk9MKSAgKz0gdWJpX3Rvb2xzLm8KKy8va2J1aWxkOmxpYi0kKENPTkZJR19VQklSTVZPTCkgICs9IHViaV90b29scy5vCisvL2tidWlsZDpsaWItJChDT05GSUdfVUJJUlNWT0wpICArPSB1YmlfdG9vbHMubworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1VCSVVQREFURVZPTCkgKz0gdWJpX3Rvb2xzLm8KKworI2luY2x1ZGUgImxpYmJiLmgiCisvKiBTb21lIHZlcnNpb25zIG9mIGtlcm5lbCBoYXZlIGJyb2tlbiBoZWFkZXJzLCBuZWVkIHRoaXMgaGFjayAqLworI2lmbmRlZiBfX3BhY2tlZAorIyBkZWZpbmUgX19wYWNrZWQgX19hdHRyaWJ1dGVfXygocGFja2VkKSkKKyNlbmRpZgorI2luY2x1ZGUgPG10ZC91YmktdXNlci5oPgorCisjZGVmaW5lIGRvX2F0dGFjaCAoRU5BQkxFX1VCSUFUVEFDSCAmJiBhcHBsZXRfbmFtZVszXSA9PSAnYScpCisjZGVmaW5lIGRvX2RldGFjaCAoRU5BQkxFX1VCSURFVEFDSCAmJiBhcHBsZXRfbmFtZVszXSA9PSAnZCcpCisjZGVmaW5lIGRvX21rdm9sICAoRU5BQkxFX1VCSU1LVk9MICAmJiBhcHBsZXRfbmFtZVszXSA9PSAnbScpCisjZGVmaW5lIGRvX3Jtdm9sICAoRU5BQkxFX1VCSVJNVk9MICAmJiBhcHBsZXRfbmFtZVs0XSA9PSAnbScpCisjZGVmaW5lIGRvX3Jzdm9sICAoRU5BQkxFX1VCSVJTVk9MICAmJiBhcHBsZXRfbmFtZVs0XSA9PSAncycpCisjZGVmaW5lIGRvX3VwZGF0ZSAoRU5BQkxFX1VCSVVQREFURVZPTCAmJiBhcHBsZXRfbmFtZVszXSA9PSAndScpCisKK3N0YXRpYyB1bnNpZ25lZCBnZXRfbnVtX2Zyb21fZmlsZShjb25zdCBjaGFyICpwYXRoLCB1bnNpZ25lZCBtYXgsIGNvbnN0IGNoYXIgKmVycm1zZykKK3sKKwljaGFyIGJ1ZltzaXplb2YobG9uZyBsb25nKSozXTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgbnVtOworCisJaWYgKG9wZW5fcmVhZF9jbG9zZShwYXRoLCBidWYsIHNpemVvZihidWYpKSA8IDApCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZShlcnJtc2csIHBhdGgpOworCS8qIEl0IGNhbiBiZSBcbiB0ZXJtaW5hdGVkLCB4YXRvdWxsIHdvbid0IHdvcmsgd2VsbCAqLworCWlmIChzc2NhbmYoYnVmLCAiJWxsdSIsICZudW0pICE9IDEgfHwgbnVtID4gbWF4KQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShlcnJtc2csIHBhdGgpOworCXJldHVybiBudW07Cit9CisKKy8qIFRvIHByZXZlbnQgbWFsbG9jKDFHKSBhY2NpZGVudHMgKi8KKyNkZWZpbmUgTUFYX1NBTkVfRVJBU0VCTE9DSyAoMTYqMTAyNCoxMDI0KQorCitpbnQgdWJpX3Rvb2xzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB1YmlfdG9vbHNfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgc2l6ZV9zdWZmaXhlc1tdID0geworCQl7ICJLaUIiLCAxMDI0IH0sCisJCXsgIk1pQiIsIDEwMjQqMTAyNCB9LAorCQl7ICJHaUIiLCAxMDI0KjEwMjQqMTAyNCB9LAorCQl7ICIiLCAwIH0KKwl9OworCisJdW5zaWduZWQgb3B0czsKKwljaGFyICp1YmlfY3RybDsKKwlpbnQgZmQ7CisJaW50IG10ZF9udW07CisJaW50IGRldl9udW0gPSBVQklfREVWX05VTV9BVVRPOworCWludCB2b2xfaWQgPSBVQklfVk9MX05VTV9BVVRPOworCWludCB2aWRfaGRyX29mZnNldCA9IDA7CisJY2hhciAqdm9sX25hbWU7CisJdW5zaWduZWQgbG9uZyBsb25nIHNpemVfYnl0ZXMgPSBzaXplX2J5dGVzOyAvKiBmb3IgY29tcGlsZXIgKi8KKwljaGFyICpzaXplX2J5dGVzX3N0cjsKKwlpbnQgYWxpZ25tZW50ID0gMTsKKwljaGFyICp0eXBlOworCXVuaW9uIHsKKwkJc3RydWN0IHViaV9hdHRhY2hfcmVxIGF0dGFjaF9yZXE7CisJCXN0cnVjdCB1YmlfbWt2b2xfcmVxICBta3ZvbF9yZXE7CisJCXN0cnVjdCB1YmlfcnN2b2xfcmVxICByc3ZvbF9yZXE7CisJfSByZXFfc3RydWN0czsKKyNkZWZpbmUgYXR0YWNoX3JlcSByZXFfc3RydWN0cy5hdHRhY2hfcmVxCisjZGVmaW5lIG1rdm9sX3JlcSAgcmVxX3N0cnVjdHMubWt2b2xfcmVxCisjZGVmaW5lIHJzdm9sX3JlcSAgcmVxX3N0cnVjdHMucnN2b2xfcmVxCisJY2hhciBwYXRoW3NpemVvZigiL3N5cy9jbGFzcy91YmkvdWJpJWRfJWQvdXNhYmxlX2ViX3NpemUiKQorCQkJCSsgMiAqIHNpemVvZihpbnQpKjMgKyAvKmp1c3QgaW4gY2FzZToqLyAxNl07CisjZGVmaW5lIHBhdGhfc3lzX2NsYXNzX3ViaV91YmkgKHBhdGggKyBzaXplb2YoIi9zeXMvY2xhc3MvdWJpL3ViaSIpLTEpCisKKwlzdHJjcHkocGF0aCwgIi9zeXMvY2xhc3MvdWJpL3ViaSIpOworCW1lbXNldCgmcmVxX3N0cnVjdHMsIDAsIHNpemVvZihyZXFfc3RydWN0cykpOworCisjZGVmaW5lIE9QVElPTl9tICAoMSA8PCAwKQorI2RlZmluZSBPUFRJT05fZCAgKDEgPDwgMSkKKyNkZWZpbmUgT1BUSU9OX24gICgxIDw8IDIpCisjZGVmaW5lIE9QVElPTl9OICAoMSA8PCAzKQorI2RlZmluZSBPUFRJT05fcyAgKDEgPDwgNCkKKyNkZWZpbmUgT1BUSU9OX2EgICgxIDw8IDUpCisjZGVmaW5lIE9QVElPTl90ICAoMSA8PCA2KQorCWlmIChkb19ta3ZvbCkgeworCQlvcHRfY29tcGxlbWVudGFyeSA9ICItMTpkKzpuKzphKzpPKyI7CisJCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAibWQ6bjpOOnM6YTp0Ok86IiwKKwkJCQkmZGV2X251bSwgJnZvbF9pZCwKKwkJCQkmdm9sX25hbWUsICZzaXplX2J5dGVzX3N0ciwgJmFsaWdubWVudCwgJnR5cGUsCisJCQkJJnZpZF9oZHJfb2Zmc2V0CisJCQkpOworCX0gZWxzZQorCWlmIChkb191cGRhdGUpIHsKKwkJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiOworCQlvcHRzID0gZ2V0b3B0MzIoYXJndiwgInM6YXQiLCAmc2l6ZV9ieXRlc19zdHIpOworCQlvcHRzICo9IE9QVElPTl9zOworCX0gZWxzZSB7CisJCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xOm0rOmQrOm4rOmErIjsKKwkJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJtOmQ6bjpOOnM6YTp0OiIsCisJCQkJJm10ZF9udW0sICZkZXZfbnVtLCAmdm9sX2lkLAorCQkJCSZ2b2xfbmFtZSwgJnNpemVfYnl0ZXNfc3RyLCAmYWxpZ25tZW50LCAmdHlwZQorCQkpOworCX0KKworCWlmIChvcHRzICYgT1BUSU9OX3MpCisJCXNpemVfYnl0ZXMgPSB4YXRvdWxsX3NmeChzaXplX2J5dGVzX3N0ciwgc2l6ZV9zdWZmaXhlcyk7CisJYXJndiArPSBvcHRpbmQ7CisJdWJpX2N0cmwgPSAqYXJndisrOworCisJZmQgPSB4b3Blbih1YmlfY3RybCwgT19SRFdSKTsKKwkvL3hmc3RhdChmZCwgJnN0LCB1YmlfY3RybCk7CisJLy9pZiAoIVNfSVNDSFIoc3Quc3RfbW9kZSkpCisJLy8JYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiBub3QgYSBjaGFyIGRldmljZSIsIHViaV9jdHJsKTsKKworLy91c2FnZTojZGVmaW5lIHViaWF0dGFjaF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiLW0gTVREX05VTSBbLWQgVUJJX05VTV0gWy1PIFZJRF9IRFJfT0ZGXSBVQklfQ1RSTF9ERVYiCisvL3VzYWdlOiNkZWZpbmUgdWJpYXR0YWNoX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQXR0YWNoIE1URCBkZXZpY2UgdG8gVUJJXG4iCisvL3VzYWdlOiAgICAgIlxuCS1tIE1URF9OVU0JTVREIGRldmljZSBudW1iZXIgdG8gYXR0YWNoIgorLy91c2FnZTogICAgICJcbgktZCBVQklfTlVNCVVCSSBkZXZpY2UgbnVtYmVyIHRvIGFzc2lnbiIKKy8vdXNhZ2U6ICAgICAiXG4JLU8gVklEX0hEUl9PRkYJVklEIGhlYWRlciBvZmZzZXQiCisJaWYgKGRvX2F0dGFjaCkgeworCQlpZiAoIShvcHRzICYgT1BUSU9OX20pKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIGRldmljZSBub3Qgc3BlY2lmaWVkIiwgIk1URCIpOworCisJCWF0dGFjaF9yZXEubXRkX251bSA9IG10ZF9udW07CisJCWF0dGFjaF9yZXEudWJpX251bSA9IGRldl9udW07CisJCWF0dGFjaF9yZXEudmlkX2hkcl9vZmZzZXQgPSB2aWRfaGRyX29mZnNldDsKKworCQl4aW9jdGwoZmQsIFVCSV9JT0NBVFQsICZhdHRhY2hfcmVxKTsKKwl9IGVsc2UKKworLy91c2FnZTojZGVmaW5lIHViaWRldGFjaF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiLWQgVUJJX05VTSBVQklfQ1RSTF9ERVYiCisvL3VzYWdlOiNkZWZpbmUgdWJpZGV0YWNoX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGV0YWNoIE1URCBkZXZpY2UgZnJvbSBVQklcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWQgVUJJX05VTQlVQkkgZGV2aWNlIG51bWJlciIKKwlpZiAoZG9fZGV0YWNoKSB7CisJCWlmICghKG9wdHMgJiBPUFRJT05fZCkpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgZGV2aWNlIG5vdCBzcGVjaWZpZWQiLCAiVUJJIik7CisKKwkJLyogRklYTUU/IGtlcm5lbCBleHBlY3RzIGludDMyX3QqIGhlcmU6ICovCisJCXhpb2N0bChmZCwgVUJJX0lPQ0RFVCwgJmRldl9udW0pOworCX0gZWxzZQorCisvL3VzYWdlOiNkZWZpbmUgdWJpbWt2b2xfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlVCSV9ERVZJQ0UgLU4gTkFNRSBbLXMgU0laRSB8IC1tXSIKKy8vdXNhZ2U6I2RlZmluZSB1Ymlta3ZvbF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNyZWF0ZSBVQkkgdm9sdW1lXG4iCisvL3VzYWdlOiAgICAgIlxuCS1hIEFMSUdOTUVOVAlWb2x1bWUgYWxpZ25tZW50IChkZWZhdWx0IDEpIgorLy91c2FnZTogICAgICJcbgktbQkJU2V0IHZvbHVtZSBzaXplIHRvIG1heGltdW0gYXZhaWxhYmxlIgorLy91c2FnZTogICAgICJcbgktbiBWT0xJRAlWb2x1bWUgSUQuIElmIG5vdCBzcGVjaWZpZWQsIgorLy91c2FnZTogICAgICJcbgkJCWFzc2lnbmVkIGF1dG9tYXRpY2FsbHkiCisvL3VzYWdlOiAgICAgIlxuCS1OIE5BTUUJCVZvbHVtZSBuYW1lIgorLy91c2FnZTogICAgICJcbgktcyBTSVpFCQlTaXplIGluIGJ5dGVzIgorLy91c2FnZTogICAgICJcbgktdCBUWVBFCQlWb2x1bWUgdHlwZSAoc3RhdGljfGR5bmFtaWMpIgorCWlmIChkb19ta3ZvbCkgeworCQlpZiAob3B0cyAmIE9QVElPTl9tKSB7CisJCQl1bnNpZ25lZCBsZWJfYXZhaWw7CisJCQl1bnNpZ25lZCBsZWJfc2l6ZTsKKwkJCXVuc2lnbmVkIG51bTsKKwkJCWNoYXIgKnA7CisKKwkJCWlmIChzc2NhbmYodWJpX2N0cmwsICIvZGV2L3ViaSV1IiwgJm51bSkgIT0gMSkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgid3JvbmcgZm9ybWF0IG9mIFVCSSBkZXZpY2UgbmFtZSIpOworCisJCQlwID0gcGF0aF9zeXNfY2xhc3NfdWJpX3ViaSArIHNwcmludGYocGF0aF9zeXNfY2xhc3NfdWJpX3ViaSwgIiV1LyIsIG51bSk7CisKKwkJCXN0cmNweShwLCAiYXZhaWxfZXJhc2VibG9ja3MiKTsKKwkJCWxlYl9hdmFpbCA9IGdldF9udW1fZnJvbV9maWxlKHBhdGgsIFVJTlRfTUFYLCAiQ2FuJ3QgZ2V0IGF2YWlsYWJsZSBlcmFzZWJsb2NrcyBmcm9tICclcyciKTsKKworCQkJc3RyY3B5KHAsICJlcmFzZWJsb2NrX3NpemUiKTsKKwkJCWxlYl9zaXplID0gZ2V0X251bV9mcm9tX2ZpbGUocGF0aCwgTUFYX1NBTkVfRVJBU0VCTE9DSywgIkNhbid0IGdldCBlcmFzZWJsb2NrIHNpemUgZnJvbSAnJXMnIik7CisKKwkJCXNpemVfYnl0ZXMgPSBsZWJfYXZhaWwgKiAodW5zaWduZWQgbG9uZyBsb25nKWxlYl9zaXplOworCQkJLy9pZiAoc2l6ZV9ieXRlcyA8PSAwKQorCQkJLy8JYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIGludmFsaWQgbWF4aW11bSBzaXplIGNhbGN1bGF0ZWQiLCAiVUJJIik7CisJCX0gZWxzZQorCQlpZiAoIShvcHRzICYgT1BUSU9OX3MpKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInNpemUgbm90IHNwZWNpZmllZCIpOworCisJCWlmICghKG9wdHMgJiBPUFRJT05fTikpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibmFtZSBub3Qgc3BlY2lmaWVkIik7CisKKwkJbWt2b2xfcmVxLnZvbF9pZCA9IHZvbF9pZDsKKwkJbWt2b2xfcmVxLnZvbF90eXBlID0gVUJJX0RZTkFNSUNfVk9MVU1FOworCQlpZiAoKG9wdHMgJiBPUFRJT05fdCkgJiYgdHlwZVswXSA9PSAncycpCisJCQlta3ZvbF9yZXEudm9sX3R5cGUgPSBVQklfU1RBVElDX1ZPTFVNRTsKKwkJbWt2b2xfcmVxLmFsaWdubWVudCA9IGFsaWdubWVudDsKKwkJbWt2b2xfcmVxLmJ5dGVzID0gc2l6ZV9ieXRlczsgLyogc2lnbmVkIGludDY0X3QgKi8KKwkJc3RybmNweShta3ZvbF9yZXEubmFtZSwgdm9sX25hbWUsIFVCSV9NQVhfVk9MVU1FX05BTUUpOworCQlta3ZvbF9yZXEubmFtZV9sZW4gPSBzdHJsZW4odm9sX25hbWUpOworCQlpZiAobWt2b2xfcmVxLm5hbWVfbGVuID4gVUJJX01BWF9WT0xVTUVfTkFNRSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ2b2x1bWUgbmFtZSB0b28gbG9uZzogJyVzJyIsIHZvbF9uYW1lKTsKKworCQl4aW9jdGwoZmQsIFVCSV9JT0NNS1ZPTCwgJm1rdm9sX3JlcSk7CisJfSBlbHNlCisKKy8vdXNhZ2U6I2RlZmluZSB1YmlybXZvbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiVUJJX0RFVklDRSAtbiBWT0xJRCIKKy8vdXNhZ2U6I2RlZmluZSB1YmlybXZvbF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJlbW92ZSBVQkkgdm9sdW1lXG4iCisvL3VzYWdlOiAgICAgIlxuCS1uIFZPTElECVZvbHVtZSBJRCIKKwlpZiAoZG9fcm12b2wpIHsKKwkJaWYgKCEob3B0cyAmIE9QVElPTl9uKSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ2b2x1bWUgaWQgbm90IHNwZWNpZmllZCIpOworCisJCS8qIEZJWE1FPyBrZXJuZWwgZXhwZWN0cyBpbnQzMl90KiBoZXJlOiAqLworCQl4aW9jdGwoZmQsIFVCSV9JT0NSTVZPTCwgJnZvbF9pZCk7CisJfSBlbHNlCisKKy8vdXNhZ2U6I2RlZmluZSB1Ymlyc3ZvbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiVUJJX0RFVklDRSAtbiBWT0xJRCAtcyBTSVpFIgorLy91c2FnZTojZGVmaW5lIHViaXJzdm9sX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVzaXplIFVCSSB2b2x1bWVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW4gVk9MSUQJVm9sdW1lIElEIgorLy91c2FnZTogICAgICJcbgktcyBTSVpFCQlTaXplIGluIGJ5dGVzIgorCWlmIChkb19yc3ZvbCkgeworCQlpZiAoIShvcHRzICYgT1BUSU9OX3MpKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInNpemUgbm90IHNwZWNpZmllZCIpOworCQlpZiAoIShvcHRzICYgT1BUSU9OX24pKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInZvbHVtZSBpZCBub3Qgc3BlY2lmaWVkIik7CisKKwkJcnN2b2xfcmVxLmJ5dGVzID0gc2l6ZV9ieXRlczsgLyogc2lnbmVkIGludDY0X3QgKi8KKwkJcnN2b2xfcmVxLnZvbF9pZCA9IHZvbF9pZDsKKworCQl4aW9jdGwoZmQsIFVCSV9JT0NSU1ZPTCwgJnJzdm9sX3JlcSk7CisJfSBlbHNlCisKKy8vdXNhZ2U6I2RlZmluZSB1Yml1cGRhdGV2b2xfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlVCSV9ERVZJQ0UgWy10IHwgWy1zIFNJWkVdIElNR19GSUxFXSIKKy8vdXNhZ2U6I2RlZmluZSB1Yml1cGRhdGV2b2xfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJVcGRhdGUgVUJJIHZvbHVtZVxuIgorLy91c2FnZTogICAgICJcbgktdAlUcnVuY2F0ZSB0byB6ZXJvIHNpemUiCisvL3VzYWdlOiAgICAgIlxuCS1zIFNJWkUJU2l6ZSBpbiBieXRlcyB0byByZXNpemUgdG8iCisJaWYgKGRvX3VwZGF0ZSkgeworCQlpbnQ2NF90IGJ5dGVzNjQ7CisKKwkJaWYgKG9wdHMgJiBPUFRJT05fdCkgeworCQkJLyogdHJ1bmNhdGUgdGhlIHZvbHVtZSBieSBzdGFydGluZyBhbiB1cGRhdGUgZm9yIHNpemUgMCAqLworCQkJYnl0ZXM2NCA9IDA7CisJCQkvKiB0aGlzIGlvY3RsIGV4cGVjdHMgaW50NjRfdCogcGFyYW1ldGVyICovCisJCQl4aW9jdGwoZmQsIFVCSV9JT0NWT0xVUCwgJmJ5dGVzNjQpOworCQl9CisJCWVsc2UgeworCQkJc3RydWN0IHN0YXQgc3Q7CisJCQl1bnNpZ25lZCB1YmludW0sIHZvbG51bTsKKwkJCXVuc2lnbmVkIGxlYl9zaXplOworCQkJc3NpemVfdCBsZW47CisJCQljaGFyICppbnB1dF9kYXRhOworCisJCQkvKiBBc3N1bWUgdGhhdCBkZXZpY2UgaXMgaW4gbm9ybWFsIGZvcm1hdC4gKi8KKwkJCS8qIFJlbW92ZXMgbmVlZCBmb3Igc2Nhbm5pbmcgc3lzZnMgdHJlZSBhcyBmdWxsIGxpYnViaSBkb2VzLiAqLworCQkJaWYgKHNzY2FuZih1YmlfY3RybCwgIi9kZXYvdWJpJXVfJXUiLCAmdWJpbnVtLCAmdm9sbnVtKSAhPSAyKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ3cm9uZyBmb3JtYXQgb2YgVUJJIGRldmljZSBuYW1lIik7CisKKwkJCXNwcmludGYocGF0aF9zeXNfY2xhc3NfdWJpX3ViaSwgIiV1XyV1L3VzYWJsZV9lYl9zaXplIiwgdWJpbnVtLCB2b2xudW0pOworCQkJbGViX3NpemUgPSBnZXRfbnVtX2Zyb21fZmlsZShwYXRoLCBNQVhfU0FORV9FUkFTRUJMT0NLLCAiQ2FuJ3QgZ2V0IHVzYWJsZSBlcmFzZWJsb2NrIHNpemUgZnJvbSAnJXMnIik7CisKKwkJCWlmICghKG9wdHMgJiBPUFRJT05fcykpIHsKKwkJCQlpZiAoISphcmd2KQorCQkJCQliYl9zaG93X3VzYWdlKCk7CisJCQkJeG1vdmVfZmQoeG9wZW4oKmFyZ3YsIE9fUkRPTkxZKSwgU1RESU5fRklMRU5PKTsKKwkJCQl4ZnN0YXQoU1RESU5fRklMRU5PLCAmc3QsICphcmd2KTsKKwkJCQlzaXplX2J5dGVzID0gc3Quc3Rfc2l6ZTsKKwkJCX0KKworCQkJYnl0ZXM2NCA9IHNpemVfYnl0ZXM7CisJCQkvKiB0aGlzIGlvY3RsIGV4cGVjdHMgc2lnbmVkIGludDY0X3QqIHBhcmFtZXRlciAqLworCQkJeGlvY3RsKGZkLCBVQklfSU9DVk9MVVAsICZieXRlczY0KTsKKworCQkJaW5wdXRfZGF0YSA9IHhtYWxsb2MobGViX3NpemUpOworCQkJd2hpbGUgKChsZW4gPSBmdWxsX3JlYWQoU1RESU5fRklMRU5PLCBpbnB1dF9kYXRhLCBsZWJfc2l6ZSkpID4gMCkgeworCQkJCXh3cml0ZShmZCwgaW5wdXRfZGF0YSwgbGVuKTsKKwkJCX0KKwkJCWlmIChsZW4gPCAwKQorCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiVUJJIHZvbHVtZSB1cGRhdGUgZmFpbGVkIik7CisJCX0KKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsb3NlKGZkKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvdm9sbmFtZS5jIGIvbWlzY3V0aWxzL3ZvbG5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTBlNzk1Ci0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL3ZvbG5hbWUuYwpAQCAtMCwwICsxLDYwIEBACisvKgorICogUmVhZHMgYW5kIGRpc3BsYXlzIENELVJPTSB2b2x1bWUgbmFtZQorICoKKyAqIFNldmVyYWwgcGVvcGxlIGhhdmUgYXNrZWQgaG93IHRvIHJlYWQgQ0Qgdm9sdW1lIG5hbWVzIHNvIEkgd3JvdGUgdGhpcworICogc21hbGwgcHJvZ3JhbSB0byBkbyBpdC4KKyAqCisgKiB1c2FnZTogdm9sbmFtZSBbPGRldmljZS1maWxlPl0KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAtMjAwMSBKZWZmIFRyYW50ZXIgKHRyYW50ZXJAcG9ib3guY29tKQorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLyoKKyAqIG1vZHMgZnJvbSBkaXN0cmlidXRlZCBzb3VyY2UgKGVqZWN0LTIuMC4xMykgYXJlIGJ5CisgKiBNYXR0aGV3IFN0b2x0ZW5iZXJnIDxkM21hdHRAZ21haWwuY29tPgorICovCisKKy8vdXNhZ2U6I2RlZmluZSB2b2xuYW1lX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbREVWSUNFXSIKKy8vdXNhZ2U6I2RlZmluZSB2b2xuYW1lX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2hvdyBDRCB2b2x1bWUgbmFtZSBvZiB0aGUgREVWSUNFIChkZWZhdWx0IC9kZXYvY2Ryb20pIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IHZvbG5hbWVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHZvbG5hbWVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBmZDsKKwljaGFyIGJ1ZmZlclszMl07CisJY29uc3QgY2hhciAqZGV2aWNlOworCisJZGV2aWNlID0gIi9kZXYvY2Ryb20iOworCWlmIChhcmd2WzFdKSB7CisJCWRldmljZSA9IGFyZ3ZbMV07CisJCWlmIChhcmd2WzJdKQorCQkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWZkID0geG9wZW4oZGV2aWNlLCBPX1JET05MWSk7CisJeGxzZWVrKGZkLCAzMjgwOCwgU0VFS19TRVQpOworCXhyZWFkKGZkLCBidWZmZXIsIDMyKTsKKwlwcmludGYoIiUzMi4zMnNcbiIsIGJ1ZmZlcik7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWNsb3NlKGZkKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9taXNjdXRpbHMvd2FsbC5jIGIvbWlzY3V0aWxzL3dhbGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDY1OGY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWlzY3V0aWxzL3dhbGwuYwpAQCAtMCwwICsxLDYzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB3YWxsIC0gd3JpdGUgYSBtZXNzYWdlIHRvIGFsbCBsb2dnZWQtaW4gdXNlcnMKKyAqIENvcHlyaWdodCAoYykgMjAwOSBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vY29uZmlnOmNvbmZpZyBXQUxMCisvL2NvbmZpZzoJYm9vbCAid2FsbCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZFQVRVUkVfVVRNUAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFdyaXRlIGEgbWVzc2FnZSB0byBhbGwgdXNlcnMgdGhhdCBhcmUgbG9nZ2VkIGluLgorCisvKiBOZWVkcyB0byBiZSBydW4gYnkgcm9vdCBvciBiZSBzdWlkIHJvb3QgLSBuZWVkcyB0byB3cml0ZSB0byAvZGV2L1RUWTogKi8KKy8vYXBwbGV0OklGX1dBTEwoQVBQTEVUKHdhbGwsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX1JFUVVJUkUpKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfV0FMTCkgKz0gd2FsbC5vCisKKy8vdXNhZ2U6I2RlZmluZSB3YWxsX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSJbRklMRV0iCisvL3VzYWdlOiNkZWZpbmUgd2FsbF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZToJIldyaXRlIGNvbnRlbnQgb2YgRklMRSBvciBzdGRpbiB0byBhbGwgbG9nZ2VkLWluIHVzZXJzIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB3YWxsX3NhbXBsZV91c2FnZQorLy91c2FnZToJImVjaG8gZm9vIHwgd2FsbFxuIgorLy91c2FnZToJIndhbGwgLi9teW1lc3NhZ2UiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgd2FsbF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgd2FsbF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHV0bXB4ICp1dDsKKwljaGFyICptc2c7CisJaW50IGZkOworCisJZmQgPSBTVERJTl9GSUxFTk87CisJaWYgKGFyZ3ZbMV0pIHsKKwkJLyogVGhlIGFwcGxldCBpcyBzZXR1aWQuCisJCSAqIEFjY2VzcyB0byB0aGUgZmlsZSBtdXN0IGJlIHVuZGVyIHVzZXIncyB1aWQvZ2lkLgorCQkgKi8KKwkJZmQgPSB4b3Blbl9hc191aWRfZ2lkKGFyZ3ZbMV0sIE9fUkRPTkxZLCBnZXR1aWQoKSwgZ2V0Z2lkKCkpOworCX0KKwltc2cgPSB4bWFsbG9jX3JlYWQoZmQsIE5VTEwpOworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCAmJiBhcmd2WzFdKQorCQljbG9zZShmZCk7CisJc2V0dXR4ZW50KCk7CisJd2hpbGUgKCh1dCA9IGdldHV0eGVudCgpKSAhPSBOVUxMKSB7CisJCWNoYXIgKmxpbmU7CisJCWlmICh1dC0+dXRfdHlwZSAhPSBVU0VSX1BST0NFU1MpCisJCQljb250aW51ZTsKKwkJbGluZSA9IGNvbmNhdF9wYXRoX2ZpbGUoIi9kZXYiLCB1dC0+dXRfbGluZSk7CisJCXhvcGVuX3h3cml0ZV9jbG9zZShsaW5lLCBtc2cpOworCQlmcmVlKGxpbmUpOworCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZW5kdXR4ZW50KCk7CisJCWZyZWUobXNnKTsKKwl9CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL21pc2N1dGlscy93YXRjaGRvZy5jIGIvbWlzY3V0aWxzL3dhdGNoZG9nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNhNzZlZAotLS0gL2Rldi9udWxsCisrKyBiL21pc2N1dGlscy93YXRjaGRvZy5jCkBAIC0wLDAgKzEsMTEwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHdhdGNoZG9nIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzICBQYXVsIE11bmR0IDxsZXRoYWxAbGludXgtc2gub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA2ICBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIgPGJ1c3lib3hAYnVzeWJveC5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggIERhcml1cyBBdWd1bGlzIDxhdWd1bGlzLmRhcml1c0BnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgd2F0Y2hkb2dfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstdCBOW21zXV0gWy1UIE5bbXNdXSBbLUZdIERFViIKKy8vdXNhZ2U6I2RlZmluZSB3YXRjaGRvZ19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlBlcmlvZGljYWxseSB3cml0ZSB0byB3YXRjaGRvZyBkZXZpY2UgREVWXG4iCisvL3VzYWdlOiAgICAgIlxuCS1UIE4JUmVib290IGFmdGVyIE4gc2Vjb25kcyBpZiBub3QgcmVzZXQgKGRlZmF1bHQgNjApIgorLy91c2FnZTogICAgICJcbgktdCBOCVJlc2V0IGV2ZXJ5IE4gc2Vjb25kcyAoZGVmYXVsdCAzMCkiCisvL3VzYWdlOiAgICAgIlxuCS1GCVJ1biBpbiBmb3JlZ3JvdW5kIgorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG5Vc2UgNTAwbXMgdG8gc3BlY2lmeSBwZXJpb2QgaW4gbWlsbGlzZWNvbmRzIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJsaW51eC90eXBlcy5oIiAvKiBmb3IgX191MzIgKi8KKyNpbmNsdWRlICJsaW51eC93YXRjaGRvZy5oIgorCisjZGVmaW5lIE9QVF9GT1JFR1JPVU5EICAoMSA8PCAwKQorI2RlZmluZSBPUFRfU1RJTUVSICAgICAgKDEgPDwgMSkKKyNkZWZpbmUgT1BUX0hUSU1FUiAgICAgICgxIDw8IDIpCisKK3N0YXRpYyB2b2lkIHdhdGNoZG9nX3NodXRkb3duKGludCBzaWcgVU5VU0VEX1BBUkFNKQoreworCXN0YXRpYyBjb25zdCBjaGFyIFYgPSAnVic7CisKKwlyZW1vdmVfcGlkZmlsZShDT05GSUdfUElEX0ZJTEVfUEFUSCAiL3dhdGNoZG9nLnBpZCIpOworCXdyaXRlKDMsICZWLCAxKTsgIC8qIE1hZ2ljLCBzZWUgd2F0Y2hkb2ctYXBpLnR4dCBpbiBrZXJuZWwgKi8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsb3NlKDMpOworCV9leGl0KEVYSVRfU1VDQ0VTUyk7Cit9CisKK2ludCB3YXRjaGRvZ19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgd2F0Y2hkb2dfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCBzdWZmaXhlc1tdID0geworCQl7ICJtcyIsIDEgfSwKKwkJeyAiIiwgMTAwMCB9LAorCQl7ICIiLCAwIH0KKwl9OworCisJdW5zaWduZWQgb3B0czsKKwl1bnNpZ25lZCBzdGltZXJfZHVyYXRpb247IC8qIGhvdyBvZnRlbiB0byByZXN0YXJ0ICovCisJdW5zaWduZWQgaHRpbWVyX2R1cmF0aW9uID0gNjAwMDA7IC8qIHJlYm9vdHMgYWZ0ZXIgTiBtcyBpZiBub3QgcmVzdGFydGVkICovCisJY2hhciAqc3RfYXJnOworCWNoYXIgKmh0X2FyZzsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0xIjsgLyogbXVzdCBoYXZlIGV4YWN0bHkgMSBhcmd1bWVudCAqLworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiRnQ6VDoiLCAmc3RfYXJnLCAmaHRfYXJnKTsKKworCS8qIFdlIG5lZWQgdG8gZGFlbW9uaXplICpiZWZvcmUqIG9wZW5pbmcgdGhlIHdhdGNoZG9nIGFzIG1hbnkgZHJpdmVycworCSAqIHdpbGwgb25seSBhbGxvdyBvbmUgcHJvY2VzcyBhdCBhIHRpbWUgdG8gZG8gc28uICBTaW5jZSBkYWVtb25pemluZworCSAqIGlzIG5vdCBwZXJmZWN0IChjaGlsZCBtYXkgcnVuIGJlZm9yZSBwYXJlbnQgZmluaXNoZXMgZXhpdGluZyksIHdlCisJICogY2FuJ3QgcmVseSBvbiBwYXJlbnQgZXhpdGluZyBiZWZvcmUgdXMgKGxldCBhbG9uZSAqY2xlYW5seSogcmVsZWFzaW5nCisJICogdGhlIHdhdGNoZG9nIGZkIC0tIHNvbWV0aGluZyBlbHNlIHRoYXQgbWF5IG5vdCBldmVuIGJlIGFsbG93ZWQpLgorCSAqLworCWlmICghKG9wdHMgJiBPUFRfRk9SRUdST1VORCkpCisJCWJiX2RhZW1vbml6ZV9vcl9yZXhlYyhEQUVNT05fQ0hESVJfUk9PVCwgYXJndik7CisKKwlpZiAob3B0cyAmIE9QVF9IVElNRVIpCisJCWh0aW1lcl9kdXJhdGlvbiA9IHhhdG91X3NmeChodF9hcmcsIHN1ZmZpeGVzKTsKKwlzdGltZXJfZHVyYXRpb24gPSBodGltZXJfZHVyYXRpb24gLyAyOworCWlmIChvcHRzICYgT1BUX1NUSU1FUikKKwkJc3RpbWVyX2R1cmF0aW9uID0geGF0b3Vfc2Z4KHN0X2FyZywgc3VmZml4ZXMpOworCisJYmJfc2lnbmFscyhCQl9GQVRBTF9TSUdTLCB3YXRjaGRvZ19zaHV0ZG93bik7CisKKwkvKiBVc2Uga25vd24gZmQgIyAtIGF2b2lkIG5lZWRpbmcgZ2xvYmFsICdpbnQgZmQnICovCisJeG1vdmVfZmQoeG9wZW4oYXJndlthcmdjIC0gMV0sIE9fV1JPTkxZKSwgMyk7CisKKwkvKiBXRElPQ19TRVRUSU1FT1VUIHRha2VzIHNlY29uZHMsIG5vdCBtaWxsaXNlY29uZHMgKi8KKwlodGltZXJfZHVyYXRpb24gPSBodGltZXJfZHVyYXRpb24gLyAxMDAwOworI2lmbmRlZiBXRElPQ19TRVRUSU1FT1VUCisjIGVycm9yIFdESU9DX1NFVFRJTUVPVVQgaXMgbm90IGRlZmluZWQsIGNhbm5vdCBjb21waWxlIHdhdGNoZG9nIGFwcGxldAorI2Vsc2UKKyMgaWYgZGVmaW5lZCBXRElPQ19TRVRPUFRJT05TICYmIGRlZmluZWQgV0RJT1NfRU5BQkxFQ0FSRAorCXsKKwkJc3RhdGljIGNvbnN0IGludCBlbmFibGUgPSBXRElPU19FTkFCTEVDQVJEOworCQlpb2N0bF9vcl93YXJuKDMsIFdESU9DX1NFVE9QVElPTlMsICh2b2lkKikgJmVuYWJsZSk7CisJfQorIyBlbmRpZgorCWlvY3RsX29yX3dhcm4oMywgV0RJT0NfU0VUVElNRU9VVCwgJmh0aW1lcl9kdXJhdGlvbik7CisjZW5kaWYKKworI2lmIDAKKwlpb2N0bF9vcl93YXJuKDMsIFdESU9DX0dFVFRJTUVPVVQsICZodGltZXJfZHVyYXRpb24pOworCXByaW50Zigid2F0Y2hkb2c6IFNXIHRpbWVyIGlzICVkbXMsIEhXIHRpbWVyIGlzICVkc1xuIiwKKwkJc3RpbWVyX2R1cmF0aW9uLCBodGltZXJfZHVyYXRpb24gKiAxMDAwKTsKKyNlbmRpZgorCisJd3JpdGVfcGlkZmlsZShDT05GSUdfUElEX0ZJTEVfUEFUSCAiL3dhdGNoZG9nLnBpZCIpOworCisJd2hpbGUgKDEpIHsKKwkJLyoKKwkJICogTWFrZSBzdXJlIHdlIGNsZWFyIHRoZSBjb3VudGVyIGJlZm9yZSBzbGVlcGluZywKKwkJICogYXMgdGhlIGNvdW50ZXIgdmFsdWUgaXMgdW5kZWZpbmVkIGF0IHRoaXMgcG9pbnQgLS0gUEZNCisJCSAqLworCQl3cml0ZSgzLCAiIiwgMSk7IC8qIHdyaXRlIHplcm8gYnl0ZSAqLworCQl1c2xlZXAoc3RpbWVyX2R1cmF0aW9uICogMTAwMEwpOworCX0KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOyAvKiAtIG5vdCByZWFjaGVkLCBidXQgZ2NjIDQuMi4xIGlzIHRvbyBkdW1iISAqLworfQpkaWZmIC0tZ2l0IGEvbW9kdXRpbHMvQ29uZmlnLnNyYyBiL21vZHV0aWxzL0NvbmZpZy5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ5YWM2NQotLS0gL2Rldi9udWxsCisrKyBiL21vZHV0aWxzL0NvbmZpZy5zcmMKQEAgLTAsMCArMSwyNjMgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIkxpbnV4IE1vZHVsZSBVdGlsaXRpZXMiCisKK0lOU0VSVAorCitjb25maWcgTU9EUFJPQkVfU01BTEwKKwlib29sICJTaW1wbGlmaWVkIG1vZHV0aWxzIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFNpbXBsaWZpZWQgbW9kdXRpbHMuCisKKwkgIFdpdGggdGhpcyBvcHRpb24gbW9kcHJvYmUgZG9lcyBub3QgcmVxdWlyZSBtb2R1bGVzLmRlcCBmaWxlCisJICBhbmQgZG9lcyBub3QgdXNlIC9ldGMvbW9kdWxlcy5jb25mIGZpbGUuCisJICBJdCBzY2FucyBtb2R1bGUgZmlsZXMgaW4gL2xpYi9tb2R1bGVzL2B1bmFtZSAtcmAgYW5kCisJICBkZXRlcm1pbmVzIGRlcGVuZGVuY2llcyBhbmQgbW9kdWxlIGFsaWFzIG5hbWVzIG9uIHRoZSBmbHkuCisJICBUaGlzIG1heSBtYWtlIG1vZHVsZSBsb2FkaW5nIHNsb3dlciwgbW9zdCBub3RhYmx5CisJICB3aGVuIG9uZSBuZWVkcyB0byBsb2FkIG1vZHVsZSBieSBhbGlhcyAodGhpcyByZXF1aXJlcworCSAgc2Nhbm5pbmcgdGhyb3VnaCBtb2R1bGUgX2JvZGllc18pLgorCisJICBBdCB0aGUgZmlyc3QgYXR0ZW1wdCB0byBsb2FkIGEgbW9kdWxlIGJ5IGFsaWFzIG1vZHByb2JlCisJICB3aWxsIHRyeSB0byBnZW5lcmF0ZSBtb2R1bGVzLmRlcC5iYiBmaWxlIGluIG9yZGVyIHRvIHNwZWVkIHVwCisJICBmdXR1cmUgbG9hZHMgYnkgYWxpYXMuIEZhaWx1cmUgdG8gZG8gc28gKHJlYWQtb25seSAvbGliL21vZHVsZXMsCisJICBldGMpIGlzIG5vdCByZXBvcnRlZCwgYW5kIGZ1dHVyZSBtb2Rwcm9iZXMgd2lsbCBiZSBzbG93IHRvby4KKworCSAgTkI6IG1vZHVsZXMuZGVwLmJiIGZpbGUgZm9ybWF0IGlzIG5vdCBjb21wYXRpYmxlCisJICB3aXRoIG1vZHVsZXMuZGVwIGZpbGUgYXMgY3JlYXRlZC91c2VkIGJ5IHN0YW5kYXJkIG1vZHVsZSB0b29scy4KKworCSAgQWRkaXRpb25hbCBtb2R1bGUgcGFyYW1ldGVycyBjYW4gYmUgc3RvcmVkIGluCisJICAvZXRjL21vZHVsZXMvJG1vZHVsZV9uYW1lIGZpbGVzLgorCisJICBBcGFydCBmcm9tIG1vZHByb2JlLCBvdGhlciB1dGlsaXRpZXMgYXJlIGFsc28gcHJvdmlkZWQ6CisJICAtIGluc21vZCBpcyBhbiBhbGlhcyB0byBtb2Rwcm9iZQorCSAgLSBybW1vZCBpcyBhbiBhbGlhcyB0byBtb2Rwcm9iZSAtcgorCSAgLSBkZXBtb2QgZ2VuZXJhdGVzIG1vZHVsZXMuZGVwLmJiCisKKwkgIEFzIG9mIDIwMDgtMDcsIHRoaXMgY29kZSBpcyBleHBlcmltZW50YWwuIEl0IGlzIDE0a2Igc21hbGxlcgorCSAgdGhhbiAibm9uLXNtYWxsIiBtb2R1dGlscy4KKworY29uZmlnIEZFQVRVUkVfTU9EUFJPQkVfU01BTExfT1BUSU9OU19PTl9DTURMSU5FCisJYm9vbCAiQWNjZXB0IG1vZHVsZSBvcHRpb25zIG9uIG1vZHByb2JlIGNvbW1hbmQgbGluZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE1PRFBST0JFX1NNQUxMCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgQWxsb3cgaW5zbW9kIGFuZCBtb2Rwcm9iZSB0YWtlIG1vZHVsZSBvcHRpb25zIGZyb20gY29tbWFuZCBsaW5lLgorCitjb25maWcgRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9DSEVDS19BTFJFQURZX0xPQURFRAorCWJvb2wgIlNraXAgbG9hZGluZyBvZiBhbHJlYWR5IGxvYWRlZCBtb2R1bGVzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTU9EUFJPQkVfU01BTEwKKwloZWxwCisJICBDaGVjayBpZiB0aGUgbW9kdWxlIGlzIGFscmVhZHkgbG9hZGVkLgorCitjb25maWcgSU5TTU9ECisJYm9vbCAiaW5zbW9kIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gIU1PRFBST0JFX1NNQUxMCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgaW5zbW9kIGlzIHVzZWQgdG8gbG9hZCBzcGVjaWZpZWQgbW9kdWxlcyBpbiB0aGUgcnVubmluZyBrZXJuZWwuCisKK2NvbmZpZyBSTU1PRAorCWJvb2wgInJtbW9kIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gIU1PRFBST0JFX1NNQUxMCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgcm1tb2QgaXMgdXNlZCB0byB1bmxvYWQgc3BlY2lmaWVkIG1vZHVsZXMgZnJvbSB0aGUga2VybmVsLgorCitjb25maWcgTFNNT0QKKwlib29sICJsc21vZCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uICFNT0RQUk9CRV9TTUFMTAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIGxzbW9kIGlzIHVzZWQgdG8gZGlzcGxheSBhIGxpc3Qgb2YgbG9hZGVkIG1vZHVsZXMuCisKK2NvbmZpZyBGRUFUVVJFX0xTTU9EX1BSRVRUWV8yXzZfT1VUUFVUCisJYm9vbCAiUHJldHR5IG91dHB1dCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIExTTU9ECisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhpcyBvcHRpb24gbWFrZXMgb3V0cHV0IGZvcm1hdCBvZiBsc21vZCBhZGp1c3RlZCB0bworCSAgdGhlIGZvcm1hdCBvZiBtb2R1bGUtaW5pdC10b29scyBmb3IgTGludXgga2VybmVsIDIuNi4KKwkgIEluY3JlYXNlcyBzaXplIHNvbWV3aGF0LgorCitjb25maWcgTU9EUFJPQkUKKwlib29sICJtb2Rwcm9iZSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uICFNT0RQUk9CRV9TTUFMTAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIEhhbmRsZSB0aGUgbG9hZGluZyBvZiBtb2R1bGVzLCBhbmQgdGhlaXIgZGVwZW5kZW5jaWVzIG9uIGEgaGlnaAorCSAgbGV2ZWwuCisKK2NvbmZpZyBGRUFUVVJFX01PRFBST0JFX0JMQUNLTElTVAorCWJvb2wgIkJsYWNrbGlzdCBzdXBwb3J0IgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gTU9EUFJPQkUKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBTYXkgJ3knIGhlcmUgdG8gZW5hYmxlIHN1cHBvcnQgZm9yIHRoZSAnYmxhY2tsaXN0JyBjb21tYW5kIGluCisJICBtb2Rwcm9iZS5jb25mLiBUaGlzIHByZXZlbnRzIHRoZSBhbGlhcyByZXNvbHZlciB0byByZXNvbHZlCisJICBibGFja2xpc3RlZCBtb2R1bGVzLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byBwcmV2ZW50IHlvdXIKKwkgIGhhcmR3YXJlIGF1dG9kZXRlY3Rpb24gc2NyaXB0cyB0byBsb2FkIG1vZHVsZXMgbGlrZSBldmRldiwgZnJhbWUKKwkgIGJ1ZmZlciBkcml2ZXJzIGV0Yy4KKworY29uZmlnIERFUE1PRAorCWJvb2wgImRlcG1vZCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uICFNT0RQUk9CRV9TTUFMTAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIGRlcG1vZCBnZW5lcmF0ZXMgbW9kdWxlcy5kZXAgKGFuZCBwb3RlbnRpYWxseSBtb2R1bGVzLmFsaWFzCisJICBhbmQgbW9kdWxlcy5zeW1ib2xzKSB0aGF0IGNvbnRhaW4gZGVwZW5kZW5jeSBpbmZvcm1hdGlvbgorCSAgZm9yIG1vZHByb2JlLgorCitjb21tZW50ICJPcHRpb25zIGNvbW1vbiB0byBtdWx0aXBsZSBtb2R1dGlscyIKKworY29uZmlnIEZFQVRVUkVfMl80X01PRFVMRVMKKwlib29sICJTdXBwb3J0IHZlcnNpb24gMi4yLzIuNCBMaW51eCBrZXJuZWxzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gSU5TTU9EIHx8IFJNTU9EIHx8IExTTU9ECisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgU3VwcG9ydCBtb2R1bGUgbG9hZGluZyBmb3IgMi4yLnggYW5kIDIuNC54IExpbnV4IGtlcm5lbHMuCisJICBUaGlzIGluY3JlYXNlcyBzaXplIGNvbnNpZGVyYWJseS4gU2F5IE4gdW5sZXNzIHlvdSBwbGFuCisJICB0byBydW4gYW5jaWVudCBrZXJuZWxzLgorCitjb25maWcgRkVBVFVSRV9JTlNNT0RfVFJZX01NQVAKKwlib29sICJUcnkgdG8gbG9hZCBtb2R1bGUgZnJvbSBhIG1tYXAnZWQgYXJlYSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIElOU01PRCB8fCBNT0RQUk9CRV9TTUFMTAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGNhdXNlcyBtb2R1bGUgbG9hZGluZyBjb2RlIHRvIHRyeSB0byBtbWFwCisJICBtb2R1bGUgZmlyc3QuIElmIGl0IGRvZXMgbm90IHdvcmsgKGZvciBleGFtcGxlLAorCSAgaXQgZG9lcyBub3Qgd29yayBmb3IgY29tcHJlc3NlZCBtb2R1bGVzKSwgbW9kdWxlIHdpbGwgYmUgcmVhZAorCSAgKGFuZCB1bnBhY2tlZCBpZiBuZWVkZWQpIGludG8gYSBtZW1vcnkgYmxvY2sgYWxsb2NhdGVkIGJ5IG1hbGxvYy4KKworCSAgVGhlIG9ubHkgY2FzZSB3aGVuIG1tYXAgd29ya3MgYnV0IG1hbGxvYyBkb2VzIG5vdCBpcyB3aGVuCisJICB5b3UgYXJlIHRyeWluZyB0byBsb2FkIGEgYmlnIG1vZHVsZSBvbiBhIHZlcnkgbWVtb3J5LWNvbnN0cmFpbmVkCisJICBtYWNoaW5lLiBNYWxsb2Mgd2lsbCBtb21lbnRhcmlseSBuZWVkIDJ4IGFzIG11Y2ggbWVtb3J5IGFzIG1tYXAuCisKKwkgIENob29zaW5nIE4gc2F2ZXMgYWJvdXQgMjUwIGJ5dGVzIG9mIGNvZGUgKG9uIDMyLWJpdCB4ODYpLgorCitjb25maWcgRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORworCWJvb2wgIkVuYWJsZSBtb2R1bGUgdmVyc2lvbiBjaGVja2luZyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZFQVRVUkVfMl80X01PRFVMRVMgJiYgKElOU01PRCB8fCBNT0RQUk9CRSkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBTdXBwb3J0IGNoZWNraW5nIG9mIHZlcnNpb25zIGZvciBtb2R1bGVzLiBUaGlzIGlzIHVzZWQgdG8KKwkgIGVuc3VyZSB0aGF0IHRoZSBrZXJuZWwgYW5kIG1vZHVsZSBhcmUgbWFkZSBmb3IgZWFjaCBvdGhlci4KKworY29uZmlnIEZFQVRVUkVfSU5TTU9EX0tTWU1PT1BTX1NZTUJPTFMKKwlib29sICJBZGQgbW9kdWxlIHN5bWJvbHMgdG8ga2VybmVsIHN5bWJvbCB0YWJsZSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZFQVRVUkVfMl80X01PRFVMRVMgJiYgKElOU01PRCB8fCBNT0RQUk9CRSkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBCeSBhZGRpbmcgbW9kdWxlIHN5bWJvbHMgdG8gdGhlIGtlcm5lbCBzeW1ib2wgdGFibGUsIE9vcHMgbWVzc2FnZXMKKwkgIG9jY3VyaW5nIHdpdGhpbiBrZXJuZWwgbW9kdWxlcyBjYW4gYmUgcHJvcGVybHkgZGVidWdnZWQuIEJ5IGVuYWJsaW5nCisJICB0aGlzIGZlYXR1cmUsIG1vZHVsZSBzeW1ib2xzIHdpbGwgYWx3YXlzIGJlIGFkZGVkIHRvIHRoZSBrZXJuZWwgc3ltYm9sCisJICB0YWJsZSBmb3IgcHJvcGVyIGRlYnVnZ2luZyBzdXBwb3J0LiBJZiB5b3UgYXJlIG5vdCBpbnRlcmVzdGVkIGluCisJICBPb3BzIG1lc3NhZ2VzIGZyb20ga2VybmVsIG1vZHVsZXMsIHNheSBOLgorCitjb25maWcgRkVBVFVSRV9JTlNNT0RfTE9BRElOS01FTQorCWJvb2wgIkluIGtlcm5lbCBtZW1vcnkgb3B0aW1pemF0aW9uICh1Q2xpbnV4IG9ubHkpIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gRkVBVFVSRV8yXzRfTU9EVUxFUyAmJiAoSU5TTU9EIHx8IE1PRFBST0JFKQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgaXMgYSBzcGVjaWFsIHVDbGludXggb25seSBtZW1vcnkgb3B0aW1pemF0aW9uIHRoYXQgbGV0cyBpbnNtb2QKKwkgIGxvYWQgdGhlIHNwZWNpZmllZCBrZXJuZWwgbW9kdWxlIGRpcmVjdGx5IGludG8ga2VybmVsIHNwYWNlLCByZWR1Y2luZworCSAgbWVtb3J5IHVzYWdlIGJ5IHByZXZlbnRpbmcgdGhlIG5lZWQgZm9yIHR3byBjb3BpZXMgb2YgdGhlIG1vZHVsZQorCSAgYmVpbmcgbG9hZGVkIGludG8gbWVtb3J5LgorCitjb25maWcgRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVAKKwlib29sICJFbmFibGUgaW5zbW9kIGxvYWQgbWFwICgtbSkgb3B0aW9uIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gRkVBVFVSRV8yXzRfTU9EVUxFUyAmJiBJTlNNT0QKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBFbmFibGluZyB0aGlzLCBvbmUgd291bGQgYmUgYWJsZSB0byBnZXQgYSBsb2FkIG1hcAorCSAgb3V0cHV0IG9uIHN0ZG91dC4gVGhpcyBtYWtlcyBrZXJuZWwgbW9kdWxlIGRlYnVnZ2luZworCSAgZWFzaWVyLgorCSAgSWYgeW91IGRvbid0IHBsYW4gdG8gZGVidWcga2VybmVsIG1vZHVsZXMsIHlvdQorCSAgZG9uJ3QgbmVlZCB0aGlzIG9wdGlvbi4KKworY29uZmlnIEZFQVRVUkVfSU5TTU9EX0xPQURfTUFQX0ZVTEwKKwlib29sICJTeW1ib2xzIGluIGxvYWQgbWFwIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVAgJiYgIU1PRFBST0JFX1NNQUxMCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgV2l0aG91dCB0aGlzIG9wdGlvbiwgLW0gd2lsbCBvbmx5IG91dHB1dCBzZWN0aW9uCisJICBsb2FkIG1hcC4gV2l0aCB0aGlzIG9wdGlvbiwgLW0gd2lsbCBhbHNvIG91dHB1dAorCSAgc3ltYm9scyBsb2FkIG1hcC4KKworY29uZmlnIEZFQVRVUkVfQ0hFQ0tfVEFJTlRFRF9NT0RVTEUKKwlib29sICJTdXBwb3J0IHRhaW50ZWQgbW9kdWxlIGNoZWNraW5nIHdpdGggbmV3IGtlcm5lbHMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiAoTFNNT0QgfHwgRkVBVFVSRV8yXzRfTU9EVUxFUykgJiYgIU1PRFBST0JFX1NNQUxMCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgU3VwcG9ydCBjaGVja2luZyBmb3IgdGFpbnRlZCBtb2R1bGVzLiBUaGVzZSBhcmUgdXN1YWxseSBiaW5hcnkKKwkgIG9ubHkgbW9kdWxlcyB0aGF0IHdpbGwgbWFrZSB0aGUgbGludXgta2VybmVsIGxpc3QgaWdub3JlIHlvdXIKKwkgIHN1cHBvcnQgcmVxdWVzdC4KKwkgIFRoaXMgb3B0aW9uIGlzIHJlcXVpcmVkIHRvIHN1cHBvcnQgR1BMT05MWSBtb2R1bGVzLgorCitjb25maWcgRkVBVFVSRV9NT0RVVElMU19BTElBUworCWJvb2wgIlN1cHBvcnQgZm9yIG1vZHVsZS5hbGlhc2VzIGZpbGUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBERVBNT0QgfHwgTU9EUFJPQkUKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBHZW5lcmF0ZSBhbmQgcGFyc2UgbW9kdWxlcy5hbGlhcyBjb250YWluaW5nIGFsaWFzZXMgZm9yIGJ1cworCSAgaWRlbnRpZmllcnM6CisJICAgIGFsaWFzIHBjbWNpYTptKmMqZjAzZm4qcGZuKnBhKnBiKnBjKnBkKiBwYXJwb3J0X2NzCisKKwkgIGFuZCBhbGlhc2VzIGZvciBsb2dpY2FsIG1vZHVsZXMgbmFtZXMgZS5nLjoKKwkgICAgYWxpYXMgcGFkbG9ja19hZXMgYWVzCisJICAgIGFsaWFzIGFlc19pNTg2IGFlcworCSAgICBhbGlhcyBhZXNfZ2VuZXJpYyBhZXMKKworCSAgU2F5IFkgaWYgdW5zdXJlLgorCitjb25maWcgRkVBVFVSRV9NT0RVVElMU19TWU1CT0xTCisJYm9vbCAiU3VwcG9ydCBmb3IgbW9kdWxlLnN5bWJvbHMgZmlsZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIERFUE1PRCB8fCBNT0RQUk9CRQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIEdlbmVyYXRlIGFuZCBwYXJzZSBtb2R1bGVzLnN5bWJvbHMgY29udGFpbmluZyBhbGlhc2VzIGZvcgorCSAgc3ltYm9sX3JlcXVlc3QoKSBrZXJuZWwgY2FsbHMsIHN1Y2ggYXM6CisJICAgIGFsaWFzIHN5bWJvbDp1c2Jfc2dfaW5pdCB1c2Jjb3JlCisKKwkgIFNheSBZIGlmIHVuc3VyZS4KKworY29uZmlnIERFRkFVTFRfTU9EVUxFU19ESVIKKwlzdHJpbmcgIkRlZmF1bHQgZGlyZWN0b3J5IGNvbnRhaW5pbmcgbW9kdWxlcyIKKwlkZWZhdWx0ICIvbGliL21vZHVsZXMiCisJZGVwZW5kcyBvbiBERVBNT0QgfHwgTU9EUFJPQkUgfHwgTU9EUFJPQkVfU01BTEwgfHwgTU9ESU5GTworCWhlbHAKKwkgIERpcmVjdG9yeSB0aGF0IGNvbnRhaW5zIGtlcm5lbCBtb2R1bGVzLgorCSAgRGVmYXVsdHMgdG8gIi9saWIvbW9kdWxlcyIKKworY29uZmlnIERFRkFVTFRfREVQTU9EX0ZJTEUKKwlzdHJpbmcgIkRlZmF1bHQgbmFtZSBvZiBtb2R1bGVzLmRlcCIKKwlkZWZhdWx0ICJtb2R1bGVzLmRlcCIKKwlkZXBlbmRzIG9uIERFUE1PRCB8fCBNT0RQUk9CRSB8fCBNT0RQUk9CRV9TTUFMTCB8fCBNT0RJTkZPCisJaGVscAorCSAgRmlsZW5hbWUgdGhhdCBjb250YWlucyBrZXJuZWwgbW9kdWxlcyBkZXBlbmRlbmNpZXMuCisJICBEZWZhdWx0cyB0byAibW9kdWxlcy5kZXAiCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL21vZHV0aWxzL0tidWlsZC5zcmMgYi9tb2R1dGlscy9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhN2FjODcKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1dGlscy9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsMTYgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitsaWIteTo9CisKK0lOU0VSVAorbGliLSQoQ09ORklHX01PRFBST0JFX1NNQUxMKSAgICAgICs9IG1vZHByb2JlLXNtYWxsLm8KK2xpYi0kKENPTkZJR19ERVBNT0QpICAgICAgICAgICAgICArPSBkZXBtb2QubyBtb2R1dGlscy5vCitsaWItJChDT05GSUdfSU5TTU9EKSAgICAgICAgICAgICAgKz0gaW5zbW9kLm8gbW9kdXRpbHMubworbGliLSQoQ09ORklHX0xTTU9EKSAgICAgICAgICAgICAgICs9IGxzbW9kLm8gbW9kdXRpbHMubworbGliLSQoQ09ORklHX01PRFBST0JFKSAgICAgICAgICAgICs9IG1vZHByb2JlLm8gbW9kdXRpbHMubworbGliLSQoQ09ORklHX1JNTU9EKSAgICAgICAgICAgICAgICs9IHJtbW9kLm8gbW9kdXRpbHMubworbGliLSQoQ09ORklHX0ZFQVRVUkVfMl80X01PRFVMRVMpICs9IG1vZHV0aWxzLTI0Lm8KZGlmZiAtLWdpdCBhL21vZHV0aWxzL2RlcG1vZC5jIGIvbW9kdXRpbHMvZGVwbW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcxM2FlZgotLS0gL2Rldi9udWxsCisrKyBiL21vZHV0aWxzL2RlcG1vZC5jCkBAIC0wLDAgKzEsMjg5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBkZXBtb2QgLSBnZW5lcmF0ZSBtb2R1bGVzLmRlcAorICogQ29weXJpZ2h0IChjKSAyMDA4IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorICogQ29weXJpaGd0IChjKSAyMDA4IFRpbW8gVGVyYXMgPHRpbW8udGVyYXNAaWtpLmZpPgorICogQ29weXJpZ2h0IChjKSAyMDA4IFZsYWRpbWlyIERyb25uaWtvdgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9hcHBsZXQ6SUZfREVQTU9EKEFQUExFVChkZXBtb2QsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJtb2R1dGlscy5oIgorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+IC8qIHVuYW1lKCkgKi8KKworLyoKKyAqIFRoZW9yeSBvZiBvcGVyYXRpb246CisgKiAtIGl0ZXJhdGUgb3ZlciBhbGwgbW9kdWxlcyBhbmQgcmVjb3JkIHRoZWlyIGZ1bGwgcGF0aAorICogLSBpdGVyYXRlIG92ZXIgYWxsIG1vZHVsZXMgbG9va2luZyBmb3IgImRlcGVuZHM9IiBlbnRyaWVzCisgKiAgIGZvciBlYWNoIGRlcGVuZHMsIGxvb2sgdGhyb3VnaCBvdXIgbGlzdCBvZiBmdWxsIHBhdGhzIGFuZCBlbWl0IGlmIGZvdW5kCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgbW9kdWxlX2luZm8geworCXN0cnVjdCBtb2R1bGVfaW5mbyAqbmV4dDsKKwljaGFyICpuYW1lLCAqbW9kbmFtZTsKKwlsbGlzdF90ICpkZXBlbmRlbmNpZXM7CisJbGxpc3RfdCAqYWxpYXNlczsKKwlsbGlzdF90ICpzeW1ib2xzOworCXN0cnVjdCBtb2R1bGVfaW5mbyAqZG5leHQsICpkcHJldjsKK30gbW9kdWxlX2luZm87CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHBhcnNlX21vZHVsZShjb25zdCBjaGFyICpmbmFtZSwgc3RydWN0IHN0YXQgKnNiIFVOVVNFRF9QQVJBTSwKKwkJCQl2b2lkICpkYXRhLCBpbnQgZGVwdGggVU5VU0VEX1BBUkFNKQoreworCW1vZHVsZV9pbmZvICoqZmlyc3QgPSAobW9kdWxlX2luZm8gKiopIGRhdGE7CisJY2hhciAqaW1hZ2UsICpwdHI7CisJbW9kdWxlX2luZm8gKmluZm87CisJLyogQXJiaXRyYXJ5LiBXYXMgc2ItPnN0X3NpemUsIGJ1dCB0aGF0IGJyZWFrcyAuZ3ogZXRjICovCisJc2l6ZV90IGxlbiA9ICg2NCoxMDI0KjEwMjQgLSA0MDk2KTsKKworCWlmIChzdHJyc3RyKGZuYW1lLCAiLmtvIikgPT0gTlVMTCkKKwkJcmV0dXJuIFRSVUU7CisKKwlpbWFnZSA9IHhtYWxsb2Nfb3Blbl96aXBwZWRfcmVhZF9jbG9zZShmbmFtZSwgJmxlbik7CisJaW5mbyA9IHh6YWxsb2Moc2l6ZW9mKCppbmZvKSk7CisKKwlpbmZvLT5uZXh0ID0gKmZpcnN0OworCSpmaXJzdCA9IGluZm87CisKKwlpbmZvLT5kbmV4dCA9IGluZm8tPmRwcmV2ID0gaW5mbzsKKwlpbmZvLT5uYW1lID0geHN0cmR1cChmbmFtZSArIDIpOyAvKiBza2lwICIuLyIgKi8KKwlpbmZvLT5tb2RuYW1lID0gZmlsZW5hbWUybW9kbmFtZSgKKwkJCWJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50X25vc3RyaXAoZm5hbWUpLAorCQkJTlVMTAorCSk7CisJZm9yIChwdHIgPSBpbWFnZTsgcHRyIDwgaW1hZ2UgKyBsZW4gLSAxMDsgcHRyKyspIHsKKwkJaWYgKGlzX3ByZWZpeGVkX3dpdGgocHRyLCAiZGVwZW5kcz0iKSkgeworCQkJY2hhciAqdTsKKworCQkJcHRyICs9IDg7CisJCQlmb3IgKHUgPSBwdHI7ICp1OyB1KyspCisJCQkJaWYgKCp1ID09ICctJykKKwkJCQkJKnUgPSAnXyc7CisJCQlwdHIgKz0gc3RyaW5nX3RvX2xsaXN0KHB0ciwgJmluZm8tPmRlcGVuZGVuY2llcywgIiwiKTsKKwkJfSBlbHNlIGlmIChFTkFCTEVfRkVBVFVSRV9NT0RVVElMU19BTElBUworCQkgJiYgaXNfcHJlZml4ZWRfd2l0aChwdHIsICJhbGlhcz0iKQorCQkpIHsKKwkJCWxsaXN0X2FkZF90bygmaW5mby0+YWxpYXNlcywgeHN0cmR1cChwdHIgKyA2KSk7CisJCQlwdHIgKz0gc3RybGVuKHB0cik7CisJCX0gZWxzZSBpZiAoRU5BQkxFX0ZFQVRVUkVfTU9EVVRJTFNfU1lNQk9MUworCQkgJiYgaXNfcHJlZml4ZWRfd2l0aChwdHIsICJfX2tzeW10YWJfIikKKwkJKSB7CisJCQlwdHIgKz0gMTA7CisJCQlpZiAoaXNfcHJlZml4ZWRfd2l0aChwdHIsICJncGwiKQorCQkJIHx8IHN0cmNtcChwdHIsICJzdHJpbmdzIikgPT0gMAorCQkJKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQlsbGlzdF9hZGRfdG8oJmluZm8tPnN5bWJvbHMsIHhzdHJkdXAocHRyKSk7CisJCQlwdHIgKz0gc3RybGVuKHB0cik7CisJCX0KKwl9CisJZnJlZShpbWFnZSk7CisKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIG1vZHVsZV9pbmZvICpmaW5kX21vZHVsZShtb2R1bGVfaW5mbyAqbW9kdWxlcywgY29uc3QgY2hhciAqbW9kbmFtZSkKK3sKKwltb2R1bGVfaW5mbyAqbTsKKworCWZvciAobSA9IG1vZHVsZXM7IG0gIT0gTlVMTDsgbSA9IG0tPm5leHQpCisJCWlmIChzdHJjbXAobS0+bW9kbmFtZSwgbW9kbmFtZSkgPT0gMCkKKwkJCXJldHVybiBtOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBvcmRlcl9kZXBfbGlzdChtb2R1bGVfaW5mbyAqbW9kdWxlcywgbW9kdWxlX2luZm8gKnN0YXJ0LAorCQkJbGxpc3RfdCAqYWRkKQoreworCW1vZHVsZV9pbmZvICptOworCWxsaXN0X3QgKm47CisKKwlmb3IgKG4gPSBhZGQ7IG4gIT0gTlVMTDsgbiA9IG4tPmxpbmspIHsKKwkJbSA9IGZpbmRfbW9kdWxlKG1vZHVsZXMsIG4tPmRhdGEpOworCQlpZiAobSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJLyogdW5saW5rIGN1cnJlbnQgZW50cnkgKi8KKwkJbS0+ZG5leHQtPmRwcmV2ID0gbS0+ZHByZXY7CisJCW0tPmRwcmV2LT5kbmV4dCA9IG0tPmRuZXh0OworCisJCS8qIGFuZCBhZGQgaXQgdG8gdGFpbCAqLworCQltLT5kbmV4dCA9IHN0YXJ0OworCQltLT5kcHJldiA9IHN0YXJ0LT5kcHJldjsKKwkJc3RhcnQtPmRwcmV2LT5kbmV4dCA9IG07CisJCXN0YXJ0LT5kcHJldiA9IG07CisKKwkJLyogcmVjdXJzZSAqLworCQlvcmRlcl9kZXBfbGlzdChtb2R1bGVzLCBzdGFydCwgbS0+ZGVwZW5kZW5jaWVzKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHhmcmVvcGVuX3dyaXRlKGNvbnN0IGNoYXIgKmZpbGUsIEZJTEUgKmYpCit7CisJaWYgKGZyZW9wZW4oZmlsZSwgInciLCBmKSA9PSBOVUxMKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IG9wZW4gJyVzJyIsIGZpbGUpOworfQorCisvL3VzYWdlOiNpZiAhRU5BQkxFX01PRFBST0JFX1NNQUxMCisvL3VzYWdlOiNkZWZpbmUgZGVwbW9kX3RyaXZpYWxfdXNhZ2UgIlstbl0gWy1iIEJBU0VdIFtWRVJTSU9OXSBbTU9ERklMRVNdLi4uIgorLy91c2FnZTojZGVmaW5lIGRlcG1vZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkdlbmVyYXRlIG1vZHVsZXMuZGVwLCBhbGlhcywgYW5kIHN5bWJvbHMgZmlsZXMiCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbgktYiBCQVNFCVVzZSBCQVNFL2xpYi9tb2R1bGVzL1ZFUlNJT04iCisvL3VzYWdlOiAgICAgIlxuCS1uCURyeSBydW46IHByaW50IGZpbGVzIHRvIHN0ZG91dCIKKy8vdXNhZ2U6I2VuZGlmCisKKy8qIFVwc3RyZWFtIHVzYWdlOgorICogWy1hQWVudl0gWy1DIEZJTEUgb3IgRElSXSBbLWIgQkFTRV0gWy1GIFN5c3RlbS5tYXBdIFtWRVJTSU9OXSBbTU9ERklMRVNdLi4uCisgKgktYSAtLWFsbAorICoJCVByb2JlIGFsbCBtb2R1bGVzLiBEZWZhdWx0IGlmIG5vIE1PREZJTEVTLgorICoJLUEgLS1xdWljaworICoJCUNoZWNrIG1vZHVsZXMuZGVwJ3MgbXRpbWUgYWdhaW5zdCBtb2R1bGUgZmlsZXMnIG10aW1lcy4KKyAqCS1iIC0tYmFzZWRpciBCQVNFCisgKgkJVXNlICRCQVNFL2xpYi9tb2R1bGVzL1ZFUlNJT04KKyAqCS1DIC0tY29uZmlnIEZJTEUgb3IgRElSCisgKgkJUGF0aCB0byAvZXRjL2RlcG1vZC5jb25mIG9yIC9ldGMvZGVwbW9kLmQvCisgKgktZSAtLWVycnN5bXMKKyAqCQlXaGVuIGNvbWJpbmVkIHdpdGggdGhlIC1GIG9wdGlvbiwgdGhpcyByZXBvcnRzIGFueSBzeW1ib2xzCisgKgkJd2hpY2ggYXJlIG5vdCBzdXBwbGllZCBieSBvdGhlciBtb2R1bGVzIG9yIGtlcm5lbC4KKyAqCS1GIC0tZmlsZXN5bXMgU3lzdGVtLm1hcAorICoJLW4gLS1kcnktcnVuCisgKgkJUHJpbnQgbW9kdWxlcy5kZXAgZXRjIHRvIHN0YW5kYXJkIG91dHB1dAorICoJLXYgLS12ZXJib3NlCisgKgkJUHJpbnQgdG8gc3Rkb3V0IGFsbCB0aGUgc3ltYm9scyBlYWNoIG1vZHVsZSBkZXBlbmRzIG9uCisgKgkJYW5kIHRoZSBtb2R1bGUncyBmaWxlIG5hbWUgd2hpY2ggcHJvdmlkZXMgdGhhdCBzeW1ib2wuCisgKgktcglOby1vcAorICoJLXUJTm8tb3AKKyAqCS1xCU5vLW9wCisgKgorICogU28gZmFyIHdlIG9ubHkgc3VwcG9ydDogWy1uXSBbLWIgQkFTRV0gW1ZFUlNJT05dIFtNT0RGSUxFU10uLi4KKyAqIEFjY2VwdGVkIGJ1dCBpZ25vcmVkOgorICogLWFBZQorICogLUYgU3lzdGVtLm1hcAorICogLUMgRklMRS9ESVIKKyAqCisgKiBOb3QgYWNjZXB0ZWQ6IC12CisgKi8KK2VudW0geworCS8vT1BUX2EgPSAoMSA8PCAwKSwgLyogQWxsIG1vZHVsZXMsIGlnbm9yZSBtb2RzIGluIGFyZ3YgKi8KKwkvL09QVF9BID0gKDEgPDwgMSksIC8qIE9ubHkgZW1pdCAua28gdGhhdCBhcmUgbmV3ZXIgdGhhbiBtb2R1bGVzLmRlcCBmaWxlICovCisJT1BUX2IgPSAoMSA8PCAyKSwgLyogYmFzZSBkaXJlY3Rvcnkgd2hlbiBtb2R1bGVzIGFyZSBpbiBzdGFnaW5nIGFyZWEgKi8KKwkvL09QVF9lID0gKDEgPDwgMyksIC8qIHdpdGggLUYsIHByaW50IHVucmVzb2x2ZWQgc3ltYm9scyAqLworCS8vT1BUX0YgPSAoMSA8PCA0KSwgLyogU3lzdGVtLm1hcCB0aGF0IGNvbnRhaW5zIHRoZSBzeW1ib2xzICovCisJT1BUX24gPSAoMSA8PCA1KSwgLyogZHJ5LXJ1biwgcHJpbnQgdG8gc3Rkb3V0IG9ubHkgKi8KKwlPUFRfciA9ICgxIDw8IDYpLCAvKiBDb21wYXQgZHVtbXkuIExpbnV4IE1ha2VmaWxlIHVzZXMgaXQgKi8KKwlPUFRfdSA9ICgxIDw8IDcpLCAvKiAtdSwtLXVucmVzb2x2ZWQtZXJyb3I6IGlnbm9yZWQgKi8KKwlPUFRfcSA9ICgxIDw8IDgpLCAvKiAtcSwtLXF1aWV0OiBpZ25vcmVkICovCisJT1BUX0MgPSAoMSA8PCA5KSwgLyogLUMsLS1jb25maWcgZXRjX21vZHVsZXNfY29uZjogaWdub3JlZCAqLworfTsKKworaW50IGRlcG1vZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZGVwbW9kX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwltb2R1bGVfaW5mbyAqbW9kdWxlcywgKm0sICpkZXA7CisJY29uc3QgY2hhciAqbW9kZGlyX2Jhc2UgPSAiLyI7CisJY2hhciAqbW9kZGlyLCAqdmVyc2lvbjsKKwlzdHJ1Y3QgdXRzbmFtZSB1dHM7CisJaW50IHRtcDsKKworCWdldG9wdDMyKGFyZ3YsICJhQWI6ZUY6bnJ1cUM6IiwgJm1vZGRpcl9iYXNlLCBOVUxMLCBOVUxMKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCS8qIGdvdG8gbW9kdWxlcyBsb2NhdGlvbiAqLworCXhjaGRpcihtb2RkaXJfYmFzZSk7CisKKwkvKiBJZiBhIHZlcnNpb24gaXMgcHJvdmlkZWQsIHRoZW4gdGhhdCBrZXJuZWwgdmVyc2lvbidzIG1vZHVsZSBkaXJlY3RvcnkKKwkgKiBpcyB1c2VkLCByYXRoZXIgdGhhbiB0aGUgY3VycmVudCBrZXJuZWwgdmVyc2lvbiAoYXMgcmV0dXJuZWQgYnkKKwkgKiAidW5hbWUgLXIiKS4gICovCisJaWYgKCphcmd2ICYmIHNzY2FuZigqYXJndiwgIiV1LiV1LiV1IiwgJnRtcCwgJnRtcCwgJnRtcCkgPT0gMykgeworCQl2ZXJzaW9uID0gKmFyZ3YrKzsKKwl9IGVsc2UgeworCQl1bmFtZSgmdXRzKTsKKwkJdmVyc2lvbiA9IHV0cy5yZWxlYXNlOworCX0KKwltb2RkaXIgPSBjb25jYXRfcGF0aF9maWxlKCZDT05GSUdfREVGQVVMVF9NT0RVTEVTX0RJUlsxXSwgdmVyc2lvbik7CisJeGNoZGlyKG1vZGRpcik7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmcmVlKG1vZGRpcik7CisKKwkvKiBTY2FuIG1vZHVsZXMgKi8KKwltb2R1bGVzID0gTlVMTDsKKwlpZiAoKmFyZ3YpIHsKKwkJZG8geworCQkJcGFyc2VfbW9kdWxlKCphcmd2LCAvKnNiICh1bnVzZWQpOiovIE5VTEwsICZtb2R1bGVzLCAwKTsKKwkJfSB3aGlsZSAoKisrYXJndik7CisJfSBlbHNlIHsKKwkJcmVjdXJzaXZlX2FjdGlvbigiLiIsIEFDVElPTl9SRUNVUlNFLAorCQkJCXBhcnNlX21vZHVsZSwgTlVMTCwgJm1vZHVsZXMsIDApOworCX0KKworCS8qIEdlbmVyYXRlIGRlcGVuZGVuY3kgYW5kIGFsaWFzIGZpbGVzICovCisJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9uKSkKKwkJeGZyZW9wZW5fd3JpdGUoQ09ORklHX0RFRkFVTFRfREVQTU9EX0ZJTEUsIHN0ZG91dCk7CisJZm9yIChtID0gbW9kdWxlczsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkgeworCQlwcmludGYoIiVzOiIsIG0tPm5hbWUpOworCisJCW9yZGVyX2RlcF9saXN0KG1vZHVsZXMsIG0sIG0tPmRlcGVuZGVuY2llcyk7CisJCXdoaWxlIChtLT5kbmV4dCAhPSBtKSB7CisJCQlkZXAgPSBtLT5kbmV4dDsKKwkJCXByaW50ZigiICVzIiwgZGVwLT5uYW1lKTsKKworCQkJLyogdW5saW5rIGN1cnJlbnQgZW50cnkgKi8KKwkJCWRlcC0+ZG5leHQtPmRwcmV2ID0gZGVwLT5kcHJldjsKKwkJCWRlcC0+ZHByZXYtPmRuZXh0ID0gZGVwLT5kbmV4dDsKKwkJCWRlcC0+ZG5leHQgPSBkZXAtPmRwcmV2ID0gZGVwOworCQl9CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTU9EVVRJTFNfQUxJQVMKKwlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX24pKQorCQl4ZnJlb3Blbl93cml0ZSgibW9kdWxlcy5hbGlhcyIsIHN0ZG91dCk7CisJZm9yIChtID0gbW9kdWxlczsgbSAhPSBOVUxMOyBtID0gbS0+bmV4dCkgeworCQljaGFyIG1vZG5hbWVbTU9EVUxFX05BTUVfTEVOXTsKKwkJY29uc3QgY2hhciAqZm5hbWUgPSBiYl9iYXNlbmFtZShtLT5uYW1lKTsKKwkJZmlsZW5hbWUybW9kbmFtZShmbmFtZSwgbW9kbmFtZSk7CisJCXdoaWxlIChtLT5hbGlhc2VzKSB7CisJCQkvKgorCQkJICogTGFzdCB3b3JkIHVzZWQgdG8gYmUgYSBiYXNlbmFtZQorCQkJICogKGZpbGVuYW1lIHdpdGggcGF0aCBhbmQgLmtvLiogc3RyaXBwZWQpCisJCQkgKiBhdCB0aGUgdGltZSBvZiBtb2R1bGUtaW5pdC10b29scyAzLjQuCisJCQkgKiBrbW9kIHYuMTIgdXNlcyBtb2R1bGUgbmFtZSwgaS5lLiwgcy8tL18vZy4KKwkJCSAqLworCQkJcHJpbnRmKCJhbGlhcyAlcyAlc1xuIiwKKwkJCQkoY2hhciopbGxpc3RfcG9wKCZtLT5hbGlhc2VzKSwKKwkJCQltb2RuYW1lKTsKKwkJfQorCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX01PRFVUSUxTX1NZTUJPTFMKKwlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX24pKQorCQl4ZnJlb3Blbl93cml0ZSgibW9kdWxlcy5zeW1ib2xzIiwgc3Rkb3V0KTsKKwlmb3IgKG0gPSBtb2R1bGVzOyBtICE9IE5VTEw7IG0gPSBtLT5uZXh0KSB7CisJCWNoYXIgbW9kbmFtZVtNT0RVTEVfTkFNRV9MRU5dOworCQljb25zdCBjaGFyICpmbmFtZSA9IGJiX2Jhc2VuYW1lKG0tPm5hbWUpOworCQlmaWxlbmFtZTJtb2RuYW1lKGZuYW1lLCBtb2RuYW1lKTsKKwkJd2hpbGUgKG0tPnN5bWJvbHMpIHsKKwkJCXByaW50ZigiYWxpYXMgc3ltYm9sOiVzICVzXG4iLAorCQkJCShjaGFyKilsbGlzdF9wb3AoJm0tPnN5bWJvbHMpLAorCQkJCW1vZG5hbWUpOworCQl9CisJfQorI2VuZGlmCisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJd2hpbGUgKG1vZHVsZXMpIHsKKwkJCW1vZHVsZV9pbmZvICpvbGQgPSBtb2R1bGVzOworCQkJbW9kdWxlcyA9IG1vZHVsZXMtPm5leHQ7CisJCQlmcmVlKG9sZC0+bmFtZSk7CisJCQlmcmVlKG9sZC0+bW9kbmFtZSk7CisJCQlmcmVlKG9sZCk7CisJCX0KKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbW9kdXRpbHMvZGVwbW9kX3Byb2Nlc3Muc2ggYi9tb2R1dGlscy9kZXBtb2RfcHJvY2Vzcy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mOTliMDkxCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdXRpbHMvZGVwbW9kX3Byb2Nlc3Muc2gKQEAgLTAsMCArMSwyMCBAQAorIyEvYmluL3NoCisKKyMgRGVwbW9kIG91dHB1dCBtYXkgYmUgaGFyZCB0byBkaWZmLgorIyBUaGlzIHNjcmlwdCBzb3J0cyBkZXBlbmRlbmNpZXMgd2l0aGluICJ4eC5rbzogeXkua28genoua28iIGxpbmVzLAorIyBhbmQgc29ydHMgYWxsIGxpbmVzIHRvby4KKyMgVXNhZ2U6CisjCisjIFsuL2J1c3lib3hdIGRlcG1vZCAtbiB8IC4vZGVwbW9kX3Byb2Nlc3Muc2ggfCBzb3J0ID5PVVRGSUxFCisjCisjIGFuZCB0aGVuIHlvdSBjYW4gZGlmZiBPVVRGSUxFcy4gVXNlZnVsIGZvciBjb21wYXJpbmcgYmJveCBkZXBtb2QKKyMgd2l0aCBtb2R1bGUtaW5pdC10b29scyBkZXBtb2QgYW5kIHN1Y2guCisKK3doaWxlIHJlYWQgLXIgd29yZCByZXN0OyBkbworICAgIGlmICEgdGVzdCAiJHt3b3JkLyo6L30iOyB0aGVuCisJZWNobyAtbiAiJHdvcmQgIgorCWVjaG8gIiRyZXN0IiB8IHhhcmdzIC1uMSB8IHNvcnQgfCB4YXJncworICAgIGVsc2UKKwllY2hvICIkd29yZCAkcmVzdCI7CisgICAgZmkKK2RvbmUKZGlmZiAtLWdpdCBhL21vZHV0aWxzL2luc21vZC5jIGIvbW9kdXRpbHMvaW5zbW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMzYzk5MgotLS0gL2Rldi9udWxsCisrKyBiL21vZHV0aWxzL2luc21vZC5jCkBAIC0wLDAgKzEsNjYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgaW5zbW9kIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRpbW8gVGVyYXMgPHRpbW8udGVyYXNAaWtpLmZpPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9hcHBsZXQ6SUZfSU5TTU9EKEFQUExFVChpbnNtb2QsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJtb2R1dGlscy5oIgorCisvKiAyLjYgc3R5bGUgaW5zbW9kIGhhcyBubyBvcHRpb25zIGFuZCByZXF1aXJlZCBmaWxlbmFtZQorICogKG5vdCBtb2R1bGUgbmFtZSAtIC5rbyBjYW4ndCBiZSBvbWl0dGVkKSAqLworCisvL3VzYWdlOiNpZiAhRU5BQkxFX01PRFBST0JFX1NNQUxMCisvL3VzYWdlOiNkZWZpbmUgaW5zbW9kX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfMl80X01PRFVMRVMoIltPUFRJT05TXSBNT0RVTEUgIikKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFXzJfNF9NT0RVTEVTKCJGSUxFICIpCisvL3VzYWdlOgkiW1NZTUJPTD1WQUxVRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgaW5zbW9kX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTG9hZCBrZXJuZWwgbW9kdWxlIgorLy91c2FnZToJSUZfRkVBVFVSRV8yXzRfTU9EVUxFUyggIlxuIgorLy91c2FnZTogICAgICJcbgktZglGb3JjZSBtb2R1bGUgdG8gbG9hZCBpbnRvIHRoZSB3cm9uZyBrZXJuZWwgdmVyc2lvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWsJTWFrZSBtb2R1bGUgYXV0b2NsZWFuLWFibGUiCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS1xCVF1aWV0IgorLy91c2FnZTogICAgICJcbgktTAlMb2NrOiBwcmV2ZW50IHNpbXVsdGFuZW91cyBsb2FkcyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQKAorLy91c2FnZTogICAgICJcbgktbQlPdXRwdXQgbG9hZCBtYXAgdG8gc3Rkb3V0IgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgkteAlEb24ndCBleHBvcnQgZXh0ZXJucyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6I2VuZGlmCisKK2ludCBpbnNtb2RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGluc21vZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqZmlsZW5hbWU7CisJaW50IHJjOworCisJLyogQ29tcGF0IG5vdGU6CisJICogMi42IHN0eWxlIGluc21vZCBoYXMgbm8gb3B0aW9ucyBhbmQgcmVxdWlyZWQgZmlsZW5hbWUKKwkgKiAobm90IG1vZHVsZSBuYW1lIC0gLmtvIGNhbid0IGJlIG9taXR0ZWQpLgorCSAqIDIuNCBzdHlsZSBpbnNtb2QgY2FuIHRha2UgbW9kdWxlIG5hbWUgd2l0aG91dCAubworCSAqIGFuZCBwZXJmb3JtcyBtb2R1bGUgc2VhcmNoIGluIGRlZmF1bHQgZGlyZWN0b3JpZXMKKwkgKiBvciBpbiAkTU9EUEFUSC4KKwkgKi8KKworCUlGX0ZFQVRVUkVfMl80X01PRFVMRVMoCisJCWdldG9wdDMyKGFyZ3YsIElOU01PRF9PUFRTIElOU01PRF9BUkdTKTsKKwkJYXJndiArPSBvcHRpbmQgLSAxOworCSk7CisKKwlmaWxlbmFtZSA9ICorK2FyZ3Y7CisJaWYgKCFmaWxlbmFtZSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJcmMgPSBiYl9pbml0X21vZHVsZShmaWxlbmFtZSwgcGFyc2VfY21kbGluZV9tb2R1bGVfb3B0aW9ucyhhcmd2LCAvKnF1b3RlX3NwYWNlczoqLyAwKSk7CisJaWYgKHJjKQorCQliYl9lcnJvcl9tc2coImNhbid0IGluc2VydCAnJXMnOiAlcyIsIGZpbGVuYW1lLCBtb2RlcnJvcihyYykpOworCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvbW9kdXRpbHMvbHNtb2QuYyBiL21vZHV0aWxzL2xzbW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzYzE2NgotLS0gL2Rldi9udWxsCisrKyBiL21vZHV0aWxzL2xzbW9kLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgbHNtb2QgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9hcHBsZXQ6SUZfTFNNT0QoQVBQTEVUKGxzbW9kLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy91c2FnZTojaWYgIUVOQUJMRV9NT0RQUk9CRV9TTUFMTAorLy91c2FnZTojZGVmaW5lIGxzbW9kX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiCisvL3VzYWdlOiNkZWZpbmUgbHNtb2RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJMaXN0IHRoZSBjdXJyZW50bHkgbG9hZGVkIGtlcm5lbCBtb2R1bGVzIgorLy91c2FnZTojZW5kaWYKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAidW5pY29kZS5oIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hFQ0tfVEFJTlRFRF9NT0RVTEUKK2VudW0geworCVRBSU5UX1BST1BSSUVUT1JZX01PRFVMRSA9ICgxIDw8IDApLAorCVRBSU5UX0ZPUkNFRF9NT0RVTEUgICAgICA9ICgxIDw8IDEpLAorCVRBSU5UX1VOU0FGRV9TTVAgICAgICAgICA9ICgxIDw8IDIpLAorfTsKKworc3RhdGljIHZvaWQgY2hlY2tfdGFpbnRlZCh2b2lkKQoreworCWludCB0YWludGVkID0gMDsKKwljaGFyICpidWYgPSB4bWFsbG9jX29wZW5fcmVhZF9jbG9zZSgiL3Byb2Mvc3lzL2tlcm5lbC90YWludGVkIiwgTlVMTCk7CisJaWYgKGJ1ZikgeworCQl0YWludGVkID0gYXRvaShidWYpOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQlmcmVlKGJ1Zik7CisJfQorCisJaWYgKHRhaW50ZWQpIHsKKwkJcHJpbnRmKCIgICAgVGFpbnRlZDogJWMlYyVjXG4iLAorCQkJCXRhaW50ZWQgJiBUQUlOVF9QUk9QUklFVE9SWV9NT0RVTEUgICAgICA/ICdQJyA6ICdHJywKKwkJCQl0YWludGVkICYgVEFJTlRfRk9SQ0VEX01PRFVMRSAgICAgICAgICAgPyAnRicgOiAnICcsCisJCQkJdGFpbnRlZCAmIFRBSU5UX1VOU0FGRV9TTVAgICAgICAgICAgICAgID8gJ1MnIDogJyAnKTsKKwl9IGVsc2UgeworCQlwdXRzKCIgICAgTm90IHRhaW50ZWQiKTsKKwl9Cit9CisjZWxzZQorc3RhdGljIHZvaWQgY2hlY2tfdGFpbnRlZCh2b2lkKSB7IHB1dGNoYXIoJ1xuJyk7IH0KKyNlbmRpZgorCitpbnQgbHNtb2RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGxzbW9kX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTFNNT0RfUFJFVFRZXzJfNl9PVVRQVVQKKwljaGFyICp0b2tlbls0XTsKKwlwYXJzZXJfdCAqcGFyc2VyID0gY29uZmlnX29wZW4oIi9wcm9jL21vZHVsZXMiKTsKKwlpbml0X3VuaWNvZGUoKTsKKworCXByaW50ZigiJS0yNHNTaXplICBVc2VkIGJ5IiwgIk1vZHVsZSIpOworCWNoZWNrX3RhaW50ZWQoKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV8yXzRfTU9EVUxFUworCSAmJiBnZXRfbGludXhfdmVyc2lvbl9jb2RlKCkgPCBLRVJORUxfVkVSU0lPTigyLDYsMCkKKwkpIHsKKwkJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW4sIDQsIDMsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQkJaWYgKHRva2VuWzNdICE9IE5VTEwgJiYgdG9rZW5bM11bMF0gPT0gJ1snKSB7CisJCQkJdG9rZW5bM10rKzsKKwkJCQl0b2tlblszXVtzdHJsZW4odG9rZW5bM10pLTFdID0gJ1wwJzsKKwkJCX0gZWxzZQorCQkJCXRva2VuWzNdID0gKGNoYXIgKikgIiI7CisjIGlmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwkJCXsKKwkJCQl1bmlfc3RhdF90IHVuaV9zdGF0OworCQkJCWNoYXIgKnVuaV9uYW1lID0gdW5pY29kZV9jb252X3RvX3ByaW50YWJsZSgmdW5pX3N0YXQsIHRva2VuWzBdKTsKKwkJCQl1bnNpZ25lZCBwYWRfbGVuID0gKHVuaV9zdGF0LnVuaWNvZGVfd2lkdGggPiAxOSkgPyAwIDogMTkgLSB1bmlfc3RhdC51bmljb2RlX3dpZHRoOworCQkJCXByaW50ZigiJXMlKnMgJThzICUycyAlc1xuIiwgdW5pX25hbWUsIHBhZF9sZW4sICIiLCB0b2tlblsxXSwgdG9rZW5bMl0sIHRva2VuWzNdKTsKKwkJCQlmcmVlKHVuaV9uYW1lKTsKKwkJCX0KKyMgZWxzZQorCQkJcHJpbnRmKCIlLTE5cyAlOHMgJTJzICVzXG4iLCB0b2tlblswXSwgdG9rZW5bMV0sIHRva2VuWzJdLCB0b2tlblszXSk7CisjIGVuZGlmCisJCX0KKwl9IGVsc2UgeworCQl3aGlsZSAoY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbiwgNCwgNCwgIiMgXHQiLCBQQVJTRV9OT1JNQUwgJiB+UEFSU0VfR1JFRURZKSkgeworCQkJLy8gTi5CLiB0b2tlblszXSBpcyBlaXRoZXIgJy0nIChtb2R1bGUgaXMgbm90IHVzZWQgYnkgb3RoZXJzKQorCQkJLy8gb3IgY29tbWEtc2VwYXJhdGVkIGxpc3QgZW5kZWQgYnkgY29tbWEKKwkJCS8vIHNvIHRyaW1taW5nIHRoZSB0cmFpbGluZyBjaGFyIGlzIGp1c3Qgd2hhdCB3ZSBuZWVkIQorCQkJaWYgKHRva2VuWzNdWzBdKQorCQkJCXRva2VuWzNdW3N0cmxlbih0b2tlblszXSkgLSAxXSA9ICdcMCc7CisjIGlmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwkJCXsKKwkJCQl1bmlfc3RhdF90IHVuaV9zdGF0OworCQkJCWNoYXIgKnVuaV9uYW1lID0gdW5pY29kZV9jb252X3RvX3ByaW50YWJsZSgmdW5pX3N0YXQsIHRva2VuWzBdKTsKKwkJCQl1bnNpZ25lZCBwYWRfbGVuID0gKHVuaV9zdGF0LnVuaWNvZGVfd2lkdGggPiAxOSkgPyAwIDogMTkgLSB1bmlfc3RhdC51bmljb2RlX3dpZHRoOworCQkJCXByaW50ZigiJXMlKnMgJThzICUycyAlc1xuIiwgdW5pX25hbWUsIHBhZF9sZW4sICIiLCB0b2tlblsxXSwgdG9rZW5bMl0sIHRva2VuWzNdKTsKKwkJCQlmcmVlKHVuaV9uYW1lKTsKKwkJCX0KKyMgZWxzZQorCQkJcHJpbnRmKCIlLTE5cyAlOHMgJTJzICVzXG4iLCB0b2tlblswXSwgdG9rZW5bMV0sIHRva2VuWzJdLCB0b2tlblszXSk7CisjIGVuZGlmCisJCX0KKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljb25maWdfY2xvc2UocGFyc2VyKTsKKyNlbHNlCisJY2hlY2tfdGFpbnRlZCgpOworCXhwcmludF9hbmRfY2xvc2VfZmlsZSh4Zm9wZW5fZm9yX3JlYWQoIi9wcm9jL21vZHVsZXMiKSk7CisjZW5kaWYKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbW9kdXRpbHMvbW9kaW5mby5jIGIvbW9kdXRpbHMvbW9kaW5mby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNzRiNjQKLS0tIC9kZXYvbnVsbAorKysgYi9tb2R1dGlscy9tb2RpbmZvLmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIG1vZGluZm8gLSByZXRyaWV2ZSBtb2R1bGUgaW5mbworICogQ29weXJpZ2h0IChjKSAyMDA4IFBhc2NhbCBCZWxsYXJkCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2FwcGxldDpJRl9NT0RJTkZPKEFQUExFVChtb2RpbmZvLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX01PRElORk8pICs9IG1vZGluZm8ubyBtb2R1dGlscy5vCisKKy8vY29uZmlnOmNvbmZpZyBNT0RJTkZPCisvL2NvbmZpZzoJYm9vbCAibW9kaW5mbyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglzZWxlY3QgUExBVEZPUk1fTElOVVgKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTaG93IGluZm9ybWF0aW9uIGFib3V0IGEgTGludXggS2VybmVsIG1vZHVsZQorCisjaW5jbHVkZSA8Zm5tYXRjaC5oPgorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+IC8qIHVuYW1lKCkgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgIm1vZHV0aWxzLmgiCisKKworZW51bSB7CisJT1BUX1RBR1MgPSAoMSA8PCAxMikgLSAxLCAvKiBzaG9ydGN1dCBjb3VudCAqLworCU9QVF9GID0gKDEgPDwgMTIpLCAvKiBmaWVsZCBuYW1lICovCisJT1BUXzAgPSAoMSA8PCAxMyksIC8qIFwwIGFzIHNlcGFyYXRvciAqLworfTsKKworc3RydWN0IG1vZGluZm9fZW52IHsKKwljaGFyICpmaWVsZDsKKwlpbnQgdGFnczsKK307CisKK3N0YXRpYyB2b2lkIGRpc3BsYXkoY29uc3QgY2hhciAqZGF0YSwgY29uc3QgY2hhciAqcGF0dGVybiwgaW50IGZsYWcpCit7CisJaWYgKGZsYWcpIHsKKwkJaW50IG4gPSBwcmludGYoIiVzOiIsIHBhdHRlcm4pOworCQl3aGlsZSAobisrIDwgMTYpCisJCQliYl9wdXRjaGFyKCcgJyk7CisJfQorCXByaW50ZigiJXMlYyIsIGRhdGEsIChvcHRpb25fbWFzazMyICYgT1BUXzApID8gJ1wwJyA6ICdcbicpOworfQorCitzdGF0aWMgdm9pZCBtb2RpbmZvKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IGNoYXIgKnZlcnNpb24sCisJCQljb25zdCBzdHJ1Y3QgbW9kaW5mb19lbnYgKmVudikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc2hvcnRjdXRzW10gPSB7CisJCSJmaWxlbmFtZSIsCisJCSJsaWNlbnNlIiwKKwkJImF1dGhvciIsCisJCSJkZXNjcmlwdGlvbiIsCisJCSJ2ZXJzaW9uIiwKKwkJImFsaWFzIiwKKwkJInNyY3ZlcnNpb24iLAorCQkiZGVwZW5kcyIsCisJCSJ1dHNfcmVsZWFzZSIsCisJCSJ2ZXJtYWdpYyIsCisJCSJwYXJtIiwKKwkJImZpcm13YXJlIiwKKwl9OworCXNpemVfdCBsZW47CisJaW50IGo7CisJY2hhciAqcHRyLCAqdGhlX21vZHVsZTsKKwljb25zdCBjaGFyICpmaWVsZCA9IGVudi0+ZmllbGQ7CisJaW50IHRhZ3MgPSBlbnYtPnRhZ3M7CisKKwlpZiAodGFncyAmIDEpIHsgLyogZmlsZW5hbWUgKi8KKwkJZGlzcGxheShwYXRoLCBzaG9ydGN1dHNbMF0sIDEgIT0gdGFncyk7CisJfQorCisJbGVuID0gTUFYSU5UKHNzaXplX3QpOworCXRoZV9tb2R1bGUgPSB4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UocGF0aCwgJmxlbik7CisJaWYgKCF0aGVfbW9kdWxlKSB7CisJCWlmIChwYXRoWzBdID09ICcvJykKKwkJCXJldHVybjsKKwkJLyogTmV3ZXIgZGVwbW9kIHB1dHMgcmVsYXRpdmUgcGF0aHMgaW4gbW9kdWxlcy5kZXAgKi8KKwkJcGF0aCA9IHhhc3ByaW50ZigiJXMvJXMvJXMiLCBDT05GSUdfREVGQVVMVF9NT0RVTEVTX0RJUiwgdmVyc2lvbiwgcGF0aCk7CisJCXRoZV9tb2R1bGUgPSB4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UocGF0aCwgJmxlbik7CisJCWZyZWUoKGNoYXIqKXBhdGgpOworCQlpZiAoIXRoZV9tb2R1bGUpCisJCQlyZXR1cm47CisJfQorCisJaWYgKGZpZWxkKQorCQl0YWdzIHw9IE9QVF9GOworCWZvciAoaiA9IDE7ICgxPDxqKSAmIChPUFRfVEFHUyArIE9QVF9GKTsgaisrKSB7CisJCWNvbnN0IGNoYXIgKnBhdHRlcm47CisKKwkJaWYgKCEoKDE8PGopICYgdGFncykpCisJCQljb250aW51ZTsKKwkJcGF0dGVybiA9IGZpZWxkOworCQlpZiAoKDE8PGopICYgT1BUX1RBR1MpCisJCQlwYXR0ZXJuID0gc2hvcnRjdXRzW2pdOworCQlwdHIgPSB0aGVfbW9kdWxlOworCQl3aGlsZSAoMSkgeworCQkJY2hhciAqYWZ0ZXJfcGF0dGVybjsKKworCQkJcHRyID0gbWVtY2hyKHB0ciwgKnBhdHRlcm4sIGxlbiAtIChwdHIgLSAoY2hhciopdGhlX21vZHVsZSkpOworCQkJaWYgKHB0ciA9PSBOVUxMKSAvKiBubyBvY2N1cmFuY2UgbGVmdCwgZG9uZSAqLworCQkJCWJyZWFrOworCQkJYWZ0ZXJfcGF0dGVybiA9IGlzX3ByZWZpeGVkX3dpdGgocHRyLCBwYXR0ZXJuKTsKKwkJCWlmIChhZnRlcl9wYXR0ZXJuICYmICphZnRlcl9wYXR0ZXJuID09ICc9JykgeworCQkJCS8qIGZpZWxkIHByZWZpeGVzIGFyZSAweDgwIG9yIDB4MDAgKi8KKwkJCQlpZiAoKHB0clstMV0gJiAweDdGKSA9PSAweDAwKSB7CisJCQkJCXB0ciA9IGFmdGVyX3BhdHRlcm4gKyAxOworCQkJCQlkaXNwbGF5KHB0ciwgcGF0dGVybiwgKDE8PGopICE9IHRhZ3MpOworCQkJCQlwdHIgKz0gc3RybGVuKHB0cik7CisJCQkJfQorCQkJfQorCQkJKytwdHI7CisJCX0KKwl9CisJZnJlZSh0aGVfbW9kdWxlKTsKK30KKworLy91c2FnZTojZGVmaW5lIG1vZGluZm9fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYWRscDBdIFstRiBrZXl3b3JkXSBNT0RVTEUiCisvL3VzYWdlOiNkZWZpbmUgbW9kaW5mb19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgktYQkJU2hvcnRjdXQgZm9yICctRiBhdXRob3InIgorLy91c2FnZTogICAgICJcbgktZAkJU2hvcnRjdXQgZm9yICctRiBkZXNjcmlwdGlvbiciCisvL3VzYWdlOiAgICAgIlxuCS1sCQlTaG9ydGN1dCBmb3IgJy1GIGxpY2Vuc2UnIgorLy91c2FnZTogICAgICJcbgktcAkJU2hvcnRjdXQgZm9yICctRiBwYXJtJyIKKy8vdXNhZ2U6ICAgICAiXG4JLUYga2V5d29yZAlLZXl3b3JkIHRvIGxvb2sgZm9yIgorLy91c2FnZTogICAgICJcbgktMAkJU2VwYXJhdGUgb3V0cHV0IHdpdGggTlVMcyIKKy8vdXNhZ2U6I2RlZmluZSBtb2RpbmZvX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIG1vZGluZm8gLUYgdmVybWFnaWMgbG9vcFxuIgorCitpbnQgbW9kaW5mb19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbW9kaW5mb19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IG1vZGluZm9fZW52IGVudjsKKwljaGFyIG5hbWVbTU9EVUxFX05BTUVfTEVOXTsKKwlzdHJ1Y3QgdXRzbmFtZSB1dHM7CisJcGFyc2VyX3QgKnBhcnNlcjsKKwljaGFyICpjb2xvbiwgKnRva2Vuc1syXTsKKwl1bnNpZ25lZCBvcHRzOworCXVuc2lnbmVkIGk7CisKKwllbnYuZmllbGQgPSBOVUxMOworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIjsgLyogbWluaW11bSBvbmUgcGFyYW0gKi8KKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgIm5sYWR2QXNEdW1wRjowIiwgJmVudi5maWVsZCk7CisJZW52LnRhZ3MgPSBvcHRzICYgT1BUX1RBR1MgPyBvcHRzICYgT1BUX1RBR1MgOiBPUFRfVEFHUzsKKwlhcmd2ICs9IG9wdGluZDsKKworCXVuYW1lKCZ1dHMpOworCXBhcnNlciA9IGNvbmZpZ19vcGVuMigKKwkJeGFzcHJpbnRmKCIlcy8lcy8lcyIsIENPTkZJR19ERUZBVUxUX01PRFVMRVNfRElSLCB1dHMucmVsZWFzZSwgQ09ORklHX0RFRkFVTFRfREVQTU9EX0ZJTEUpLAorCQl4Zm9wZW5fZm9yX3JlYWQKKwkpOworCisJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW5zLCAyLCAxLCAiIyBcdCIsIFBBUlNFX05PUk1BTCkpIHsKKwkJY29sb24gPSBsYXN0X2NoYXJfaXModG9rZW5zWzBdLCAnOicpOworCQlpZiAoY29sb24gPT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQkqY29sb24gPSAnXDAnOworCQlmaWxlbmFtZTJtb2RuYW1lKGJiX2Jhc2VuYW1lKHRva2Vuc1swXSksIG5hbWUpOworCQlmb3IgKGkgPSAwOyBhcmd2W2ldOyBpKyspIHsKKwkJCWlmIChmbm1hdGNoKGFyZ3ZbaV0sIG5hbWUsIDApID09IDApIHsKKwkJCQltb2RpbmZvKHRva2Vuc1swXSwgdXRzLnJlbGVhc2UsICZlbnYpOworCQkJCWFyZ3ZbaV0gPSAoY2hhciAqKSAiIjsKKwkJCX0KKwkJfQorCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNvbmZpZ19jbG9zZShwYXJzZXIpOworCisJZm9yIChpID0gMDsgYXJndltpXTsgaSsrKSB7CisJCWlmIChhcmd2W2ldWzBdKSB7CisJCQltb2RpbmZvKGFyZ3ZbaV0sIHV0cy5yZWxlYXNlLCAmZW52KTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbW9kdXRpbHMvbW9kcHJvYmUtc21hbGwuYyBiL21vZHV0aWxzL21vZHByb2JlLXNtYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5NDEwNgotLS0gL2Rldi9udWxsCisrKyBiL21vZHV0aWxzL21vZHByb2JlLXNtYWxsLmMKQEAgLTAsMCArMSw5OTEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHNpbXBsaWZpZWQgbW9kcHJvYmUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVmxhZGltaXIgRHJvbm5pa292CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyIChpbml0aWFsIGRlcG1vZCBjb2RlKQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9hcHBsZXQ6SUZfTU9EUFJPQkVfU01BTEwoQVBQTEVUKG1vZHByb2JlLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8vYXBwbGV0OklGX01PRFBST0JFX1NNQUxMKEFQUExFVF9PREROQU1FKGRlcG1vZCwgbW9kcHJvYmUsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1AsIGRlcG1vZCkpCisvL2FwcGxldDpJRl9NT0RQUk9CRV9TTUFMTChBUFBMRVRfT0RETkFNRShpbnNtb2QsIG1vZHByb2JlLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBpbnNtb2QpKQorLy9hcHBsZXQ6SUZfTU9EUFJPQkVfU01BTEwoQVBQTEVUX09ERE5BTUUobHNtb2QsIG1vZHByb2JlLCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QLCBsc21vZCkpCisvL2FwcGxldDpJRl9NT0RQUk9CRV9TTUFMTChBUFBMRVRfT0RETkFNRShybW1vZCwgbW9kcHJvYmUsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1AsIHJtbW9kKSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisvKiBBZnRlciBsaWJiYi5oLCBzaW5jZSBpdCBuZWVkcyBzeXMvdHlwZXMuaCBvbiBzb21lIHN5c3RlbXMgKi8KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPiAvKiB1bmFtZSgpICovCisjaW5jbHVkZSA8Zm5tYXRjaC5oPgorCitleHRlcm4gaW50IGluaXRfbW9kdWxlKHZvaWQgKm1vZHVsZSwgdW5zaWduZWQgbG9uZyBsZW4sIGNvbnN0IGNoYXIgKm9wdGlvbnMpOworZXh0ZXJuIGludCBkZWxldGVfbW9kdWxlKGNvbnN0IGNoYXIgKm1vZHVsZSwgdW5zaWduZWQgZmxhZ3MpOworZXh0ZXJuIGludCBxdWVyeV9tb2R1bGUoY29uc3QgY2hhciAqbmFtZSwgaW50IHdoaWNoLCB2b2lkICpidWYsIHNpemVfdCBidWZzaXplLCBzaXplX3QgKnJldCk7CisvKiBsaW51eC9pbmNsdWRlL2xpbnV4L21vZHVsZS5oIGhhcyBsaW1pdCBvZiA2NCBjaGFycyBvbiBtb2R1bGUgbmFtZXMgKi8KKyN1bmRlZiBNT0RVTEVfTkFNRV9MRU4KKyNkZWZpbmUgTU9EVUxFX05BTUVfTEVOIDY0CisKKworI2lmIDEKKyMgZGVmaW5lIGRiZzFfZXJyb3JfbXNnKC4uLikgKCh2b2lkKTApCisjIGRlZmluZSBkYmcyX2Vycm9yX21zZyguLi4pICgodm9pZCkwKQorI2Vsc2UKKyMgZGVmaW5lIGRiZzFfZXJyb3JfbXNnKC4uLikgYmJfZXJyb3JfbXNnKF9fVkFfQVJHU19fKQorIyBkZWZpbmUgZGJnMl9lcnJvcl9tc2coLi4uKSBiYl9lcnJvcl9tc2coX19WQV9BUkdTX18pCisjZW5kaWYKKworI2RlZmluZSBERVBGSUxFX0JCIENPTkZJR19ERUZBVUxUX0RFUE1PRF9GSUxFIi5iYiIKKworZW51bSB7CisJT1BUX3EgPSAoMSA8PCAwKSwgLyogYmUgcXVpZXQgKi8KKwlPUFRfciA9ICgxIDw8IDEpLCAvKiBtb2R1bGUgcmVtb3ZhbCBpbnN0ZWFkIG9mIGxvYWRpbmcgKi8KK307CisKK3R5cGVkZWYgc3RydWN0IG1vZHVsZV9pbmZvIHsKKwljaGFyICpwYXRobmFtZTsKKwljaGFyICphbGlhc2VzOworCWNoYXIgKmRlcHM7Cit9IG1vZHVsZV9pbmZvOworCisvKgorICogR0xPQkFMUworICovCitzdHJ1Y3QgZ2xvYmFscyB7CisJbW9kdWxlX2luZm8gKm1vZGluZm87CisJY2hhciAqbW9kdWxlX2xvYWRfb3B0aW9uczsKKwlzbWFsbGludCBkZXBfYmJfc2VlbjsKKwlzbWFsbGludCB3cm90ZV9kZXBfYmJfb2s7CisJdW5zaWduZWQgbW9kdWxlX2NvdW50OworCWludCBtb2R1bGVfZm91bmRfaWR4OworCXVuc2lnbmVkIHN0cmluZ2J1Zl9pZHg7CisJdW5zaWduZWQgc3RyaW5nYnVmX3NpemU7CisJY2hhciAqc3RyaW5nYnVmOyAvKiBzb21lIG1vZHVsZXMgaGF2ZSBsb3RzIG9mIHN0dWZmICovCisJLyogZm9yIGV4YW1wbGUsIGRyaXZlcnMvbWVkaWEvdmlkZW8vc2FhNzEzNC9zYWE3MTM0LmtvICovCisJLyogdGhlcmVmb3JlIGhhdmluZyBhIGZpeGVkIGJpZ2dpc2ggYnVmZmVyIGlzIG5vdCB3aXNlICovCit9OworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIG1vZGluZm8gICAgICAgICAgICAgKEcubW9kaW5mbyAgICAgICAgICAgICkKKyNkZWZpbmUgZGVwX2JiX3NlZW4gICAgICAgICAoRy5kZXBfYmJfc2VlbiAgICAgICAgKQorI2RlZmluZSB3cm90ZV9kZXBfYmJfb2sgICAgIChHLndyb3RlX2RlcF9iYl9vayAgICApCisjZGVmaW5lIG1vZHVsZV9jb3VudCAgICAgICAgKEcubW9kdWxlX2NvdW50ICAgICAgICkKKyNkZWZpbmUgbW9kdWxlX2ZvdW5kX2lkeCAgICAoRy5tb2R1bGVfZm91bmRfaWR4ICAgKQorI2RlZmluZSBtb2R1bGVfbG9hZF9vcHRpb25zIChHLm1vZHVsZV9sb2FkX29wdGlvbnMpCisjZGVmaW5lIHN0cmluZ2J1Zl9pZHggICAgICAgKEcuc3RyaW5nYnVmX2lkeCAgICAgICkKKyNkZWZpbmUgc3RyaW5nYnVmX3NpemUgICAgICAoRy5zdHJpbmdidWZfc2l6ZSAgICAgKQorI2RlZmluZSBzdHJpbmdidWYgICAgICAgICAgIChHLnN0cmluZ2J1ZiAgICAgICAgICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBhcHBlbmQoY29uc3QgY2hhciAqcykKK3sKKwl1bnNpZ25lZCBsZW4gPSBzdHJsZW4ocyk7CisJaWYgKHN0cmluZ2J1Zl9pZHggKyBsZW4gKyAxNSA+IHN0cmluZ2J1Zl9zaXplKSB7CisJCXN0cmluZ2J1Zl9zaXplID0gc3RyaW5nYnVmX2lkeCArIGxlbiArIDEyNzsKKwkJZGJnMl9lcnJvcl9tc2coImdyb3cgc3RyaW5nYnVmIHRvICV1Iiwgc3RyaW5nYnVmX3NpemUpOworCQlzdHJpbmdidWYgPSB4cmVhbGxvYyhzdHJpbmdidWYsIHN0cmluZ2J1Zl9zaXplKTsKKwl9CisJbWVtY3B5KHN0cmluZ2J1ZiArIHN0cmluZ2J1Zl9pZHgsIHMsIGxlbik7CisJc3RyaW5nYnVmX2lkeCArPSBsZW47Cit9CisKK3N0YXRpYyB2b2lkIGFwcGVuZGMoY2hhciBjKQoreworCS8qIFdlIGFwcGVuZGMoKSBvbmx5IGFmdGVyIGFwcGVuZCgpLCArIDE1IHRyaWNrIGluIGFwcGVuZCgpCisJICogbWFrZXMgaXQgdW5uZWNlc3NhcnkgdG8gY2hlY2sgZm9yIG92ZXJmbG93IGhlcmUgKi8KKwlzdHJpbmdidWZbc3RyaW5nYnVmX2lkeCsrXSA9IGM7Cit9CisKK3N0YXRpYyB2b2lkIGJrc3Aodm9pZCkKK3sKKwlpZiAoc3RyaW5nYnVmX2lkeCkKKwkJc3RyaW5nYnVmX2lkeC0tOworfQorCitzdGF0aWMgdm9pZCByZXNldF9zdHJpbmdidWYodm9pZCkKK3sKKwlzdHJpbmdidWZfaWR4ID0gMDsKK30KKworc3RhdGljIGNoYXIqIGNvcHlfc3RyaW5nYnVmKHZvaWQpCit7CisJY2hhciAqY29weSA9IHh6YWxsb2Moc3RyaW5nYnVmX2lkeCArIDEpOyAvKiB0ZXJtaW5hdGluZyBOVUwgKi8KKwlyZXR1cm4gbWVtY3B5KGNvcHksIHN0cmluZ2J1Ziwgc3RyaW5nYnVmX2lkeCk7Cit9CisKK3N0YXRpYyBjaGFyKiBmaW5kX2tleXdvcmQoY2hhciAqcHRyLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICp3b3JkKQoreworCWlmICghcHRyKSAvKiBoYXBwZW5zIGlmIHhtYWxsb2Nfb3Blbl96aXBwZWRfcmVhZF9jbG9zZSBjYW5ub3QgcmVhZCBpdCAqLworCQlyZXR1cm4gTlVMTDsKKworCWxlbiAtPSBzdHJsZW4od29yZCkgLSAxOworCXdoaWxlICgoc3NpemVfdClsZW4gPiAwKSB7CisJCWNoYXIgKm9sZCA9IHB0cjsKKwkJY2hhciAqYWZ0ZXJfd29yZDsKKworCQkvKiBzZWFyY2ggZm9yIHRoZSBmaXJzdCBjaGFyIGluIHdvcmQgKi8KKwkJcHRyID0gbWVtY2hyKHB0ciwgd29yZFswXSwgbGVuKTsKKwkJaWYgKHB0ciA9PSBOVUxMKSAvKiBubyBvY2N1cmFuY2UgbGVmdCwgZG9uZSAqLworCQkJYnJlYWs7CisJCWFmdGVyX3dvcmQgPSBpc19wcmVmaXhlZF93aXRoKHB0ciwgd29yZCk7CisJCWlmIChhZnRlcl93b3JkKQorCQkJcmV0dXJuIGFmdGVyX3dvcmQ7IC8qIGZvdW5kLCByZXR1cm4gcHRyIHBhc3QgaXQgKi8KKwkJKytwdHI7CisJCWxlbiAtPSAocHRyIC0gb2xkKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHJlcGxhY2UoY2hhciAqcywgY2hhciB3aGF0LCBjaGFyIHdpdGgpCit7CisJd2hpbGUgKCpzKSB7CisJCWlmICh3aGF0ID09ICpzKQorCQkJKnMgPSB3aXRoOworCQkrK3M7CisJfQorfQorCitzdGF0aWMgY2hhciAqZmlsZW5hbWUybW9kbmFtZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY2hhciAqbW9kbmFtZSkKK3sKKwlpbnQgaTsKKwljb25zdCBjaGFyICpmcm9tOworCisJLy8gRGlzYWJsZWQgc2luY2Ugb3RoZXJ3aXNlICJtb2Rwcm9iZSBkaXIvbmFtZSIgd291bGQgd29yaworCS8vIGFzIGlmIGl0IGlzICJtb2Rwcm9iZSBuYW1lIi4gSXQgaXMgdW5jbGVhciB3aHkKKwkvLyAnYmFzZW5hbWl6YXRpb24nIHdhcyBoZXJlIGluIHRoZSBmaXJzdCBwbGFjZS4KKwkvL2Zyb20gPSBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9ub3N0cmlwKGZpbGVuYW1lKTsKKwlmcm9tID0gZmlsZW5hbWU7CisJZm9yIChpID0gMDsgaSA8IChNT0RVTEVfTkFNRV9MRU4tMSkgJiYgZnJvbVtpXSAhPSAnXDAnICYmIGZyb21baV0gIT0gJy4nOyBpKyspCisJCW1vZG5hbWVbaV0gPSAoZnJvbVtpXSA9PSAnLScpID8gJ18nIDogZnJvbVtpXTsKKwltb2RuYW1lW2ldID0gJ1wwJzsKKworCXJldHVybiBtb2RuYW1lOworfQorCitzdGF0aWMgaW50IHBhdGhuYW1lX21hdGNoZXNfbW9kbmFtZShjb25zdCBjaGFyICpwYXRobmFtZSwgY29uc3QgY2hhciAqbW9kbmFtZSkKK3sKKwlpbnQgcjsKKwljaGFyIG5hbWVbTU9EVUxFX05BTUVfTEVOXTsKKwlmaWxlbmFtZTJtb2RuYW1lKGJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50X25vc3RyaXAocGF0aG5hbWUpLCBuYW1lKTsKKwlyID0gKHN0cmNtcChuYW1lLCBtb2RuYW1lKSA9PSAwKTsKKwlyZXR1cm4gcjsKK30KKworLyogVGFrZSAid29yZCB3b3JkIiwgcmV0dXJuIG1hbGxvY2VkICJ3b3JkIixOVUwsIndvcmQiLE5VTCxOVUwgKi8KK3N0YXRpYyBjaGFyKiBzdHJfMl9saXN0KGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgbGVuID0gc3RybGVuKHN0cikgKyAxOworCWNoYXIgKmRzdCA9IHhtYWxsb2MobGVuICsgMSk7CisKKwlkc3RbbGVuXSA9ICdcMCc7CisJbWVtY3B5KGRzdCwgc3RyLCBsZW4pOworLy9UT0RPOiBwcm90ZWN0IGFnYWluc3QgMisgc3BhY2VzOiAid29yZCAgd29yZCIKKwlyZXBsYWNlKGRzdCwgJyAnLCAnXDAnKTsKKwlyZXR1cm4gZHN0OworfQorCisvKiBXZSB1c2UgZXJyb3IgbnVtYmVycyBpbiBhIGxvb3NlIHRyYW5zbGF0aW9uLi4uICovCitzdGF0aWMgY29uc3QgY2hhciAqbW9kZXJyb3IoaW50IGVycikKK3sKKwlzd2l0Y2ggKGVycikgeworCWNhc2UgRU5PRVhFQzoKKwkJcmV0dXJuICJpbnZhbGlkIG1vZHVsZSBmb3JtYXQiOworCWNhc2UgRU5PRU5UOgorCQlyZXR1cm4gInVua25vd24gc3ltYm9sIGluIG1vZHVsZSBvciBpbnZhbGlkIHBhcmFtZXRlciI7CisJY2FzZSBFU1JDSDoKKwkJcmV0dXJuICJtb2R1bGUgaGFzIHdyb25nIHN5bWJvbCB2ZXJzaW9uIjsKKwljYXNlIEVJTlZBTDogLyogImludmFsaWQgcGFyYW1ldGVyIiAqLworCQlyZXR1cm4gInVua25vd24gc3ltYm9sIGluIG1vZHVsZSBvciBpbnZhbGlkIHBhcmFtZXRlciIKKwkJKyBzaXplb2YoInVua25vd24gc3ltYm9sIGluIG1vZHVsZSBvciIpOworCWRlZmF1bHQ6CisJCXJldHVybiBzdHJlcnJvcihlcnIpOworCX0KK30KKworc3RhdGljIGludCBsb2FkX21vZHVsZShjb25zdCBjaGFyICpmbmFtZSwgY29uc3QgY2hhciAqb3B0aW9ucykKK3sKKyNpZiAxCisJaW50IHI7CisJc2l6ZV90IGxlbiA9IE1BWElOVChzc2l6ZV90KTsKKwljaGFyICptb2R1bGVfaW1hZ2U7CisJZGJnMV9lcnJvcl9tc2coImxvYWRfbW9kdWxlKCclcycsJyVzJykiLCBmbmFtZSwgb3B0aW9ucyk7CisKKwltb2R1bGVfaW1hZ2UgPSB4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UoZm5hbWUsICZsZW4pOworCXIgPSAoIW1vZHVsZV9pbWFnZSB8fCBpbml0X21vZHVsZShtb2R1bGVfaW1hZ2UsIGxlbiwgb3B0aW9ucyA/IG9wdGlvbnMgOiAiIikgIT0gMCk7CisJZnJlZShtb2R1bGVfaW1hZ2UpOworCWRiZzFfZXJyb3JfbXNnKCJsb2FkX21vZHVsZTolZCIsIHIpOworCXJldHVybiByOyAvKiAwID0gc3VjY2VzcyAqLworI2Vsc2UKKwkvKiBGb3IgdGVzdGluZyAqLworCWRiZzFfZXJyb3JfbXNnKCJsb2FkX21vZHVsZSgnJXMnLCclcycpIiwgZm5hbWUsIG9wdGlvbnMpOworCXJldHVybiAxOworI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX21vZHVsZShtb2R1bGVfaW5mbyAqaW5mbywgY29uc3QgY2hhciAqcGF0aG5hbWUpCit7CisJY2hhciAqbW9kdWxlX2ltYWdlOworCWNoYXIgKnB0cjsKKwlzaXplX3QgbGVuOworCXNpemVfdCBwb3M7CisJZGJnMV9lcnJvcl9tc2coInBhcnNlX21vZHVsZSgnJXMnKSIsIHBhdGhuYW1lKTsKKworCS8qIFJlYWQgKHBvc3NpYmx5IGNvbXByZXNzZWQpIG1vZHVsZSAqLworCWxlbiA9IDY0ICogMTAyNCAqIDEwMjQ7IC8qIDY0IE1iIGF0IG1vc3QgKi8KKwltb2R1bGVfaW1hZ2UgPSB4bWFsbG9jX29wZW5femlwcGVkX3JlYWRfY2xvc2UocGF0aG5hbWUsICZsZW4pOworCS8qIG1vZHVsZV9pbWFnZSA9PSBOVUxMIGlzIG9rIGhlcmUsIGZpbmRfa2V5d29yZCBoYW5kbGVzIGl0ICovCisvL1RPRE86IG9wdGltaXplIHJlZHVuZGFudCBtb2R1bGUgYm9keSByZWFkcworCisJLyogImFsaWFzMSBzeW1ib2w6c3ltMSBhbGlhczIgc3ltYm9sOnN5bTIiICovCisJcmVzZXRfc3RyaW5nYnVmKCk7CisJcG9zID0gMDsKKwl3aGlsZSAoMSkgeworCQl1bnNpZ25lZCBzdGFydCA9IHN0cmluZ2J1Zl9pZHg7CisJCXB0ciA9IGZpbmRfa2V5d29yZChtb2R1bGVfaW1hZ2UgKyBwb3MsIGxlbiAtIHBvcywgImFsaWFzPSIpOworCQlpZiAoIXB0cikgeworCQkJcHRyID0gZmluZF9rZXl3b3JkKG1vZHVsZV9pbWFnZSArIHBvcywgbGVuIC0gcG9zLCAiX19rc3ltdGFiXyIpOworCQkJaWYgKCFwdHIpCisJCQkJYnJlYWs7CisJCQkvKiBET0NNRTogX19rc3ltdGFiX2dwbCBhbmQgX19rc3ltdGFiX3N0cmluZ3Mgb2NjdXIKKwkJCSAqIGluIG1hbnkgbW9kdWxlcy4gV2hhdCBkbyB0aGV5IG1lYW4/ICovCisJCQlpZiAoc3RyY21wKHB0ciwgImdwbCIpID09IDAgfHwgc3RyY21wKHB0ciwgInN0cmluZ3MiKSA9PSAwKQorCQkJCWdvdG8gc2tpcDsKKwkJCWRiZzJfZXJyb3JfbXNnKCJhbGlhczonc3ltYm9sOiVzJyIsIHB0cik7CisJCQlhcHBlbmQoInN5bWJvbDoiKTsKKwkJfSBlbHNlIHsKKwkJCWRiZzJfZXJyb3JfbXNnKCJhbGlhczonJXMnIiwgcHRyKTsKKwkJfQorCQlhcHBlbmQocHRyKTsKKwkJYXBwZW5kYygnICcpOworCQkvKgorCQkgKiBEb24ndCBhZGQgcmVkdW5kYW50IGFsaWFzZXMsIHN1Y2ggYXM6CisJCSAqIGxpYmNyYzMyYy5rbyBzeW1ib2w6Y3JjMzJjIHN5bWJvbDpjcmMzMmMKKwkJICovCisJCWlmIChzdGFydCkgeyAvKiAiaWYgd2UgYXJlbid0IHRoZSBmaXJzdCBhbGlhcyIgKi8KKwkJCWNoYXIgKmZvdW5kLCAqbGFzdDsKKwkJCXN0cmluZ2J1ZltzdHJpbmdidWZfaWR4XSA9ICdcMCc7CisJCQlsYXN0ID0gc3RyaW5nYnVmICsgc3RhcnQ7CisJCQkvKgorCQkJICogU3RyaW5nIGF0IGxhc3QtMSBpcyAiIHN5bWJvbDpjcmMzMmMgIgorCQkJICogKHdpdGggYm90aCBsZWFkaW5nIGFuZCB0cmFpbGluZyBzcGFjZXMpLgorCQkJICovCisJCQlpZiAoc3RybmNtcChzdHJpbmdidWYsIGxhc3QsIHN0cmluZ2J1Zl9pZHggLSBzdGFydCkgPT0gMCkKKwkJCQkvKiBGaXJzdCBhbGlhcyBtYXRjaGVzIHVzICovCisJCQkJZm91bmQgPSBzdHJpbmdidWY7CisJCQllbHNlCisJCQkJLyogRG9lcyBhbnkgb3RoZXIgYWxpYXMgbWF0Y2g/ICovCisJCQkJZm91bmQgPSBzdHJzdHIoc3RyaW5nYnVmLCBsYXN0LTEpOworCQkJaWYgKGZvdW5kIDwgbGFzdC0xKSB7CisJCQkJLyogVGhlcmUgaXMgYWJzb2x1dGVseSB0aGUgc2FtZSBzdHJpbmcgYmVmb3JlIHVzICovCisJCQkJZGJnMl9lcnJvcl9tc2coInJlZHVuZGFudDonJXMnIiwgbGFzdCk7CisJCQkJc3RyaW5nYnVmX2lkeCA9IHN0YXJ0OworCQkJCWdvdG8gc2tpcDsKKwkJCX0KKwkJfQorIHNraXA6CisJCXBvcyA9IChwdHIgLSBtb2R1bGVfaW1hZ2UpOworCX0KKwlia3NwKCk7IC8qIHJlbW92ZSBsYXN0ICcgJyAqLworCWluZm8tPmFsaWFzZXMgPSBjb3B5X3N0cmluZ2J1ZigpOworCXJlcGxhY2UoaW5mby0+YWxpYXNlcywgJy0nLCAnXycpOworCisJLyogImRlcGVuZGVuY3kxIGRlcGFuZGVuY3kyIiAqLworCXJlc2V0X3N0cmluZ2J1ZigpOworCXB0ciA9IGZpbmRfa2V5d29yZChtb2R1bGVfaW1hZ2UsIGxlbiwgImRlcGVuZHM9Iik7CisJaWYgKHB0ciAmJiAqcHRyKSB7CisJCXJlcGxhY2UocHRyLCAnLCcsICcgJyk7CisJCXJlcGxhY2UocHRyLCAnLScsICdfJyk7CisJCWRiZzJfZXJyb3JfbXNnKCJkZXA6JyVzJyIsIHB0cik7CisJCWFwcGVuZChwdHIpOworCX0KKwlpbmZvLT5kZXBzID0gY29weV9zdHJpbmdidWYoKTsKKworCWZyZWUobW9kdWxlX2ltYWdlKTsKK30KKworc3RhdGljIEZBU1RfRlVOQyBpbnQgZmlsZUFjdGlvbihjb25zdCBjaGFyICpwYXRobmFtZSwKKwkJc3RydWN0IHN0YXQgKnNiIFVOVVNFRF9QQVJBTSwKKwkJdm9pZCAqbW9kbmFtZV90b19tYXRjaCwKKwkJaW50IGRlcHRoIFVOVVNFRF9QQVJBTSkKK3sKKwlpbnQgY3VyOworCWNvbnN0IGNoYXIgKmZuYW1lOworCisJcGF0aG5hbWUgKz0gMjsgLyogc2tpcCAiLi8iICovCisJZm5hbWUgPSBiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9ub3N0cmlwKHBhdGhuYW1lKTsKKwlpZiAoIXN0cnJzdHIoZm5hbWUsICIua28iKSkgeworCQlkYmcxX2Vycm9yX21zZygiJyVzJyBpcyBub3QgYSBtb2R1bGUiLCBwYXRobmFtZSk7CisJCXJldHVybiBUUlVFOyAvKiBub3QgYSBtb2R1bGUsIGNvbnRpbnVlIHNlYXJjaCAqLworCX0KKworCWN1ciA9IG1vZHVsZV9jb3VudCsrOworCW1vZGluZm8gPSB4cmVhbGxvY192ZWN0b3IobW9kaW5mbywgMTIsIGN1cik7CisJbW9kaW5mb1tjdXJdLnBhdGhuYW1lID0geHN0cmR1cChwYXRobmFtZSk7CisJLyptb2RpbmZvW2N1cl0uYWxpYXNlcyA9IE5VTEw7IC0geHJlYWxsb2NfdmVjdG9yIGRpZCBpdCAqLworCS8qbW9kaW5mb1tjdXIrMV0ucGF0aG5hbWUgPSBOVUxMOyovCisKKwlpZiAoIXBhdGhuYW1lX21hdGNoZXNfbW9kbmFtZShmbmFtZSwgbW9kbmFtZV90b19tYXRjaCkpIHsKKwkJZGJnMV9lcnJvcl9tc2coIiclcycgbW9kdWxlIG5hbWUgZG9lc24ndCBtYXRjaCIsIHBhdGhuYW1lKTsKKwkJcmV0dXJuIFRSVUU7IC8qIG1vZHVsZSBuYW1lIGRvZXNuJ3QgbWF0Y2gsIGNvbnRpbnVlIHNlYXJjaCAqLworCX0KKworCWRiZzFfZXJyb3JfbXNnKCInJXMnIG1vZHVsZSBuYW1lIG1hdGNoZXMiLCBwYXRobmFtZSk7CisJbW9kdWxlX2ZvdW5kX2lkeCA9IGN1cjsKKwlwYXJzZV9tb2R1bGUoJm1vZGluZm9bY3VyXSwgcGF0aG5hbWUpOworCisJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9yKSkgeworCQlpZiAobG9hZF9tb2R1bGUocGF0aG5hbWUsIG1vZHVsZV9sb2FkX29wdGlvbnMpID09IDApIHsKKwkJCS8qIExvYWQgd2FzIHN1Y2Nlc3NmdWwsIHRoZXJlIGlzIG5vdGhpbmcgZWxzZSB0byBkby4KKwkJCSAqIFRoaXMgY2FuIGhhcHBlbiBPTkxZIGZvciAidG9wLWxldmVsIiBtb2R1bGUgbG9hZCwKKwkJCSAqIG5vdCBhIGRlcCwgYmVjYXVzZSBkZXBzIGRvbnQgZG8gZGlyc2Nhbi4gKi8KKwkJCWV4aXQoRVhJVF9TVUNDRVNTKTsKKwkJfQorCX0KKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGxvYWRfZGVwX2JiKHZvaWQpCit7CisJY2hhciAqbGluZTsKKwlGSUxFICpmcCA9IGZvcGVuX2Zvcl9yZWFkKERFUEZJTEVfQkIpOworCisJaWYgKCFmcCkKKwkJcmV0dXJuIDA7CisKKwlkZXBfYmJfc2VlbiA9IDE7CisJZGJnMV9lcnJvcl9tc2coImxvYWRpbmcgIkRFUEZJTEVfQkIpOworCisJLyogV2h5PyBUaGVyZSBpcyBhIHJhcmUgc2NlbmFyaW86IHdlIGRpZCBub3QgZmluZCBtb2Rwcm9iZS5kZXAuYmIsCisJICogd2Ugc2Nhbm5lZCB0aGUgZGlyIGFuZCBmb3VuZCBubyBtb2R1bGUgYnkgbmFtZSwgdGhlbiB3ZSBzZWFyY2gKKwkgKiBmb3IgYWxpYXMgKGZ1bGwgc2NhbiksIGFuZCB3ZSBkZWNpZGVkIHRvIGdlbmVyYXRlIG1vZHByb2JlLmRlcC5iYi4KKwkgKiBCdXQgd2Ugc2VlIG1vZHByb2JlLmRlcC5iYi5uZXchIE90aGVyIG1vZHByb2JlIGlzIGF0IHdvcmshCisJICogV2Ugd2FpdCBhbmQgb3RoZXIgbW9kcHJvYmUgcmVuYW1lcyBpdCB0byBtb2Rwcm9iZS5kZXAuYmIuCisJICogTm93IHdlIGNhbiB1c2UgaXQuCisJICogQnV0IHdlIGFscmVhZHkgaGF2ZSBtb2RpbmZvW10gZmlsbGVkLCBhbmQgIm1vZHVsZV9jb3VudCA9IDAiCisJICogbWFrZXMgdXMgc3RhcnQgYW5ldy4gWWVzLCB3ZSBsZWFrIG1vZGluZm9bXS54eHggcG9pbnRlcnMgLQorCSAqIHRoZXJlIGlzIG5vdCBtdWNoIG9mIGRhdGEgdGhlcmUgYW55d2F5LiAqLworCW1vZHVsZV9jb3VudCA9IDA7CisJbWVtc2V0KCZtb2RpbmZvWzBdLCAwLCBzaXplb2YobW9kaW5mb1swXSkpOworCisJd2hpbGUgKChsaW5lID0geG1hbGxvY19mZ2V0bGluZShmcCkpICE9IE5VTEwpIHsKKwkJY2hhciogc3BhY2U7CisJCWNoYXIqIGxpbmVidWY7CisJCWludCBjdXI7CisKKwkJaWYgKCFsaW5lWzBdKSB7CisJCQlmcmVlKGxpbmUpOworCQkJY29udGludWU7CisJCX0KKwkJc3BhY2UgPSBzdHJjaHJudWwobGluZSwgJyAnKTsKKwkJY3VyID0gbW9kdWxlX2NvdW50Kys7CisJCW1vZGluZm8gPSB4cmVhbGxvY192ZWN0b3IobW9kaW5mbywgMTIsIGN1cik7CisJCS8qbW9kaW5mb1tjdXIrMV0ucGF0aG5hbWUgPSBOVUxMOyAtIHhyZWFsbG9jX3ZlY3RvciBkaWQgaXQgKi8KKwkJbW9kaW5mb1tjdXJdLnBhdGhuYW1lID0gbGluZTsgLyogd2UgdGFrZSBvd25lcnNoaXAgb2YgbWFsbG9jZWQgYmxvY2sgaGVyZSAqLworCQlpZiAoKnNwYWNlKQorCQkJKnNwYWNlKysgPSAnXDAnOworCQltb2RpbmZvW2N1cl0uYWxpYXNlcyA9IHNwYWNlOworCQlsaW5lYnVmID0geG1hbGxvY19mZ2V0bGluZShmcCk7CisJCW1vZGluZm9bY3VyXS5kZXBzID0gbGluZWJ1ZiA/IGxpbmVidWYgOiB4emFsbG9jKDEpOworCQlpZiAobW9kaW5mb1tjdXJdLmRlcHNbMF0pIHsKKwkJCS8qIGRlcHMgYXJlIG5vdCAiIiwgc28gbmV4dCBsaW5lIG11c3QgYmUgZW1wdHkgKi8KKwkJCWxpbmUgPSB4bWFsbG9jX2ZnZXRsaW5lKGZwKTsKKwkJCS8qIFJlZnVzZSB0byB3b3JrIHdpdGggZGFtYWdlZCBjb25maWcgZmlsZSAqLworCQkJaWYgKGxpbmUgJiYgbGluZVswXSkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3IgaW4gJXMgYXQgJyVzJyIsIERFUEZJTEVfQkIsIGxpbmUpOworCQkJZnJlZShsaW5lKTsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBzdGFydF9kZXBfYmJfd3JpdGVvdXQodm9pZCkKK3sKKwlpbnQgZmQ7CisKKwkvKiBkZXBtb2QgLW46IHdyaXRlIHJlc3VsdCB0byBzdGRvdXQgKi8KKwlpZiAoYXBwbGV0X25hbWVbMF0gPT0gJ2QnICYmIChvcHRpb25fbWFzazMyICYgMSkpCisJCXJldHVybiBTVERPVVRfRklMRU5POworCisJZmQgPSBvcGVuKERFUEZJTEVfQkIiLm5ldyIsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0VYQ0wsIDA2NDQpOworCWlmIChmZCA8IDApIHsKKwkJaWYgKGVycm5vID09IEVFWElTVCkgeworCQkJaW50IGNvdW50ID0gNSAqIDIwOworCQkJZGJnMV9lcnJvcl9tc2coREVQRklMRV9CQiIubmV3IGV4aXN0cywgd2FpdGluZyBmb3IgIkRFUEZJTEVfQkIpOworCQkJd2hpbGUgKDEpIHsKKwkJCQl1c2xlZXAoMTAwMCoxMDAwIC8gMjApOworCQkJCWlmIChsb2FkX2RlcF9iYigpKSB7CisJCQkJCWRiZzFfZXJyb3JfbXNnKERFUEZJTEVfQkIiIGFwcGVhcmVkIik7CisJCQkJCXJldHVybiAtMjsgLyogbWFnaWMgbnVtYmVyICovCisJCQkJfQorCQkJCWlmICghLS1jb3VudCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQliYl9lcnJvcl9tc2coImRlbGV0aW5nIHN0YWxlICVzIiwgREVQRklMRV9CQiIubmV3Iik7CisJCQlmZCA9IG9wZW5fb3Jfd2FybihERVBGSUxFX0JCIi5uZXciLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DKTsKKwkJfQorCX0KKwlkYmcxX2Vycm9yX21zZygib3BlbmVkICJERVBGSUxFX0JCIi5uZXc6JWQiLCBmZCk7CisJcmV0dXJuIGZkOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9vdXRfZGVwX2JiKGludCBmZCkKK3sKKwlpbnQgaTsKKwlGSUxFICpmcDsKKworCS8qIFdlIHdhbnQgZ29vZCBlcnJvciByZXBvcnRpbmcuIGZkcHJpbnRmIGlzIG5vdCBnb29kIGVub3VnaC4gKi8KKwlmcCA9IHhmZG9wZW5fZm9yX3dyaXRlKGZkKTsKKwlpID0gMDsKKwl3aGlsZSAobW9kaW5mb1tpXS5wYXRobmFtZSkgeworCQlmcHJpbnRmKGZwLCAiJXMlcyVzXG4iICIlcyVzXG4iLAorCQkJbW9kaW5mb1tpXS5wYXRobmFtZSwgbW9kaW5mb1tpXS5hbGlhc2VzWzBdID8gIiAiIDogIiIsIG1vZGluZm9baV0uYWxpYXNlcywKKwkJCW1vZGluZm9baV0uZGVwcywgbW9kaW5mb1tpXS5kZXBzWzBdID8gIlxuIiA6ICIiKTsKKwkJaSsrOworCX0KKwkvKiBCYWRseSBmb3JtYXR0ZWQgZGVwZmlsZSBpcyBhIG5vLW5vLiBCZSBwYXJhbm9pZC4gKi8KKwllcnJubyA9IDA7CisJaWYgKGZlcnJvcihmcCkgfCBmY2xvc2UoZnApKSAvKiB8IGluc3RlYWQgb2YgfHwgaXMgaW50ZW5kZWQgKi8KKwkJZ290byBlcnI7CisKKwlpZiAoZmQgPT0gU1RET1VUX0ZJTEVOTykgLyogaXQgd2FzIGRlcG1vZCAtbiAqLworCQlnb3RvIG9rOworCisJaWYgKHJlbmFtZShERVBGSUxFX0JCIi5uZXciLCBERVBGSUxFX0JCKSAhPSAwKSB7CisgZXJyOgorCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBjcmVhdGUgJyVzJyIsIERFUEZJTEVfQkIpOworCQl1bmxpbmsoREVQRklMRV9CQiIubmV3Iik7CisJfSBlbHNlIHsKKyBvazoKKwkJd3JvdGVfZGVwX2JiX29rID0gMTsKKwkJZGJnMV9lcnJvcl9tc2coImNyZWF0ZWQgIkRFUEZJTEVfQkIpOworCX0KK30KKworc3RhdGljIG1vZHVsZV9pbmZvKiogZmluZF9hbGlhcyhjb25zdCBjaGFyICphbGlhcykKK3sKKwlpbnQgaTsKKwlpbnQgZGVwX2JiX2ZkOworCWludCBpbmZvaWR4OworCW1vZHVsZV9pbmZvICoqaW5mb3ZlYzsKKwlkYmcxX2Vycm9yX21zZygiZmluZF9hbGlhcygnJXMnKSIsIGFsaWFzKTsKKworIHRyeV9hZ2FpbjoKKwkvKiBGaXJzdCB0cnkgdG8gZmluZCBieSBuYW1lIChjaGVhcGVyKSAqLworCWkgPSAwOworCXdoaWxlIChtb2RpbmZvW2ldLnBhdGhuYW1lKSB7CisJCWlmIChwYXRobmFtZV9tYXRjaGVzX21vZG5hbWUobW9kaW5mb1tpXS5wYXRobmFtZSwgYWxpYXMpKSB7CisJCQlkYmcxX2Vycm9yX21zZygiZm91bmQgJyVzJyBpbiBtb2R1bGUgJyVzJyIsCisJCQkJCWFsaWFzLCBtb2RpbmZvW2ldLnBhdGhuYW1lKTsKKwkJCWlmICghbW9kaW5mb1tpXS5hbGlhc2VzKSB7CisJCQkJcGFyc2VfbW9kdWxlKCZtb2RpbmZvW2ldLCBtb2RpbmZvW2ldLnBhdGhuYW1lKTsKKwkJCX0KKwkJCWluZm92ZWMgPSB4emFsbG9jKDIgKiBzaXplb2YoaW5mb3ZlY1swXSkpOworCQkJaW5mb3ZlY1swXSA9ICZtb2RpbmZvW2ldOworCQkJcmV0dXJuIGluZm92ZWM7CisJCX0KKwkJaSsrOworCX0KKworCS8qIE9rLCB3ZSBkZWZpbml0ZWx5IGhhdmUgdG8gc2NhbiBtb2R1bGUgYm9kaWVzLiBUaGlzIGlzIGEgZ29vZAorCSAqIG1vbWVudCB0byBnZW5lcmF0ZSBtb2Rwcm9iZS5kZXAuYmIsIGlmIGl0IGRvZXMgbm90IGV4aXN0IHlldCAqLworCWRlcF9iYl9mZCA9IGRlcF9iYl9zZWVuID8gLTEgOiBzdGFydF9kZXBfYmJfd3JpdGVvdXQoKTsKKwlpZiAoZGVwX2JiX2ZkID09IC0yKSAvKiBtb2Rwcm9iZS5kZXAuYmIgYXBwZWFyZWQ/ICovCisJCWdvdG8gdHJ5X2FnYWluOworCisJLyogU2NhbiBhbGwgbW9kdWxlIGJvZGllcywgZXh0cmFjdCBtb2RpbmZvIChpdCBjb250YWlucyBhbGlhc2VzKSAqLworCWkgPSAwOworCWluZm9pZHggPSAwOworCWluZm92ZWMgPSBOVUxMOworCXdoaWxlIChtb2RpbmZvW2ldLnBhdGhuYW1lKSB7CisJCWNoYXIgKmRlc2MsICpzOworCQlpZiAoIW1vZGluZm9baV0uYWxpYXNlcykgeworCQkJcGFyc2VfbW9kdWxlKCZtb2RpbmZvW2ldLCBtb2RpbmZvW2ldLnBhdGhuYW1lKTsKKwkJfQorCQkvKiAiYWxpYXMxIHN5bWJvbDpzeW0xIGFsaWFzMiBzeW1ib2w6c3ltMiIgKi8KKwkJZGVzYyA9IHN0cl8yX2xpc3QobW9kaW5mb1tpXS5hbGlhc2VzKTsKKwkJLyogRG9lcyBtYXRjaGluZyBzdWJzdHJpbmcgZXhpc3Q/ICovCisJCWZvciAocyA9IGRlc2M7ICpzOyBzICs9IHN0cmxlbihzKSArIDEpIHsKKwkJCS8qIEFsaWFzZXMgaW4gbW9kdWxlIGJvZGllcyBjYW4gYmUgZGVmaW5lZCB3aXRoCisJCQkgKiBzaGVsbCBwYXR0ZXJucy4gRXhhbXBsZToKKwkJCSAqICJwY2k6djAwMDAxMERFZDAwMDAwMEQ5c3Yqc2QqYmMqc2MqaSoiLgorCQkJICogUGxhaW4gc3RyY21wKCkgd29uJ3QgY2F0Y2ggdGhhdCAqLworCQkJaWYgKGZubWF0Y2gocywgYWxpYXMsIDApID09IDApIHsKKwkJCQlkYmcxX2Vycm9yX21zZygiZm91bmQgYWxpYXMgJyVzJyBpbiBtb2R1bGUgJyVzJyIsCisJCQkJCQlhbGlhcywgbW9kaW5mb1tpXS5wYXRobmFtZSk7CisJCQkJaW5mb3ZlYyA9IHhyZWFsbG9jX3ZlY3RvcihpbmZvdmVjLCAxLCBpbmZvaWR4KTsKKwkJCQlpbmZvdmVjW2luZm9pZHgrK10gPSAmbW9kaW5mb1tpXTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlmcmVlKGRlc2MpOworCQlpKys7CisJfQorCisJLyogQ3JlYXRlIG1vZHVsZS5kZXAuYmIgaWYgbmVlZGVkICovCisJaWYgKGRlcF9iYl9mZCA+PSAwKSB7CisJCXdyaXRlX291dF9kZXBfYmIoZGVwX2JiX2ZkKTsKKwl9CisKKwlkYmcxX2Vycm9yX21zZygiZmluZF9hbGlhcyAnJXMnIHJldHVybnMgJWQgcmVzdWx0cyIsIGFsaWFzLCBpbmZvaWR4KTsKKwlyZXR1cm4gaW5mb3ZlYzsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX01PRFBST0JFX1NNQUxMX0NIRUNLX0FMUkVBRFlfTE9BREVECisvLyBUT0RPOiBvcGVuIG9ubHkgb25jZSwgaW52ZW50IGNvbmZpZ19yZXdpbmQoKQorc3RhdGljIGludCBhbHJlYWR5X2xvYWRlZChjb25zdCBjaGFyICpuYW1lKQoreworCWludCByZXQ7CisJY2hhciAqbGluZTsKKwlGSUxFICpmcDsKKworCXJldCA9IDUgKiAyOworIGFnYWluOgorCWZwID0gZm9wZW5fZm9yX3JlYWQoIi9wcm9jL21vZHVsZXMiKTsKKwlpZiAoIWZwKQorCQlyZXR1cm4gMDsKKwl3aGlsZSAoKGxpbmUgPSB4bWFsbG9jX2ZnZXRsaW5lKGZwKSkgIT0gTlVMTCkgeworCQljaGFyICpsaXZlOworCQljaGFyICphZnRlcl9uYW1lOworCisJCS8vIEV4YW1wbGVzIGZyb20ga2VybmVsIDMuMTQuNjoKKwkJLy9wY3Nwa3IgMTI3MTggMCAtIExpdmUgMHhmZmZmZmZmZmEwMTdlMDAwCisJCS8vc25kX3RpbWVyIDI4NjkwIDIgc25kX3NlcSxzbmRfcGNtLCBMaXZlIDB4ZmZmZmZmZmZhMDI1ZTAwMAorCQkvL2k5MTUgODAxNDA1IDIgLSBMaXZlIDB4ZmZmZmZmZmZhMDA5NjAwMAorCQlhZnRlcl9uYW1lID0gaXNfcHJlZml4ZWRfd2l0aChsaW5lLCBuYW1lKTsKKwkJaWYgKCFhZnRlcl9uYW1lIHx8ICphZnRlcl9uYW1lICE9ICcgJykgeworCQkJZnJlZShsaW5lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWxpdmUgPSBzdHJzdHIobGluZSwgIiBMaXZlIik7CisJCWZyZWUobGluZSk7CisJCWlmICghbGl2ZSkgeworCQkJLyogU3RhdGUgY2FuIGJlIFVubG9hZGluZywgTG9hZGluZywgb3IgTGl2ZS4KKwkJCSAqIG1vZHByb2JlIG11c3Qgbm90IHJldHVybiBwcmVtYXR1cmVseSBpZiB3ZSBzZWUgIkxvYWRpbmciOgorCQkJICogaXQgY2FuIGNhdXNlIGZ1cnRoZXIgcHJvZ3JhbXMgdG8gYXNzdW1lIGxvYWQgY29tcGxldGVkLAorCQkJICogYnV0IGl0IGRpZCBub3QgKHlldCkhCisJCQkgKiBXYWl0IHVwIHRvIDUqMjAgbXMgZm9yIGl0IHRvIHJlc29sdmUuCisJCQkgKi8KKwkJCXJldCAtPSAyOworCQkJaWYgKHJldCA9PSAwKQorCQkJCWJyZWFrOyAgLyogaHVoPyByZXBvcnQgYXMgIm5vdCBsb2FkZWQiICovCisJCQlmY2xvc2UoZnApOworCQkJdXNsZWVwKDIwKjEwMDApOworCQkJZ290byBhZ2FpbjsKKwkJfQorCQlyZXQgPSAxOworCQlicmVhazsKKwl9CisJZmNsb3NlKGZwKTsKKworCXJldHVybiByZXQgJiAxOworfQorI2Vsc2UKKyNkZWZpbmUgYWxyZWFkeV9sb2FkZWQobmFtZSkgMAorI2VuZGlmCisKK3N0YXRpYyBpbnQgcm1tb2QoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaW50IHI7CisJY2hhciBtb2RuYW1lW01PRFVMRV9OQU1FX0xFTl07CisKKwlmaWxlbmFtZTJtb2RuYW1lKGZpbGVuYW1lLCBtb2RuYW1lKTsKKwlyID0gZGVsZXRlX21vZHVsZShtb2RuYW1lLCBPX05PTkJMT0NLIHwgT19FWENMKTsKKwlkYmcxX2Vycm9yX21zZygiZGVsZXRlX21vZHVsZSgnJXMnLCBPX05PTkJMT0NLIHwgT19FWENMKTolZCIsIG1vZG5hbWUsIHIpOworCWlmIChyICE9IDAgJiYgIShvcHRpb25fbWFzazMyICYgT1BUX3EpKSB7CisJCWJiX3BlcnJvcl9tc2coInJlbW92ZSAnJXMnIiwgbW9kbmFtZSk7CisJfQorCXJldHVybiByOworfQorCisvKgorICogR2l2ZW4gbW9kdWxlcyBkZWZpbml0aW9uIGFuZCBtb2R1bGUgbmFtZSAob3IgYWxpYXMsIG9yIHN5bWJvbCkKKyAqIGxvYWQvcmVtb3ZlIHRoZSBtb2R1bGUgcmVzcGVjdGluZyBkZXBlbmRlbmNpZXMuCisgKiBOQjogYWxzbyBjYWxsZWQgYnkgZGVwbW9kIHdpdGggYm9ndXMgbmFtZSAiLyIsCisgKiBqdXN0IGluIG9yZGVyIHRvIGZvcmNlIG1vZHByb2JlLmRlcC5iYiBjcmVhdGlvbi4KKyovCisjaWYgIUVOQUJMRV9GRUFUVVJFX01PRFBST0JFX1NNQUxMX09QVElPTlNfT05fQ01ETElORQorI2RlZmluZSBwcm9jZXNzX21vZHVsZShhLGIpIHByb2Nlc3NfbW9kdWxlKGEpCisjZGVmaW5lIGNtZGxpbmVfb3B0aW9ucyAiIgorI2VuZGlmCitzdGF0aWMgdm9pZCBwcm9jZXNzX21vZHVsZShjaGFyICpuYW1lLCBjb25zdCBjaGFyICpjbWRsaW5lX29wdGlvbnMpCit7CisJY2hhciAqcywgKmRlcHMsICpvcHRpb25zOworCW1vZHVsZV9pbmZvICoqaW5mb3ZlYzsKKwltb2R1bGVfaW5mbyAqaW5mbzsKKwlpbnQgaW5mb2lkeDsKKwlpbnQgaXNfcmVtb3ZlID0gKG9wdGlvbl9tYXNrMzIgJiBPUFRfcikgIT0gMDsKKworCWRiZzFfZXJyb3JfbXNnKCJwcm9jZXNzX21vZHVsZSgnJXMnLCclcycpIiwgbmFtZSwgY21kbGluZV9vcHRpb25zKTsKKworCXJlcGxhY2UobmFtZSwgJy0nLCAnXycpOworCisJZGJnMV9lcnJvcl9tc2coImFscmVhZHlfbG9hZGVkOiVkIGlzX3JlbW92ZTolZCIsIGFscmVhZHlfbG9hZGVkKG5hbWUpLCBpc19yZW1vdmUpOworCisJaWYgKGFwcGxldF9uYW1lWzBdID09ICdyJykgeworCQkvKiBybW1vZC4KKwkJICogRG9lcyBub3QgcmVtb3ZlIGRlcGVuZGVuY2llcywgbm8gbmVlZCB0byBzY2FuLCBqdXN0IHJlbW92ZS4KKwkJICogKGNvbXBhdCBub3RlOiB0aGlzIGFsbG93cyBhbmQgc3RyaXBzIC5rbyBzdWZmaXgpCisJCSAqLworCQlybW1vZChuYW1lKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogV2UgdXNlZCB0byBoYXZlICJpc19yZW1vdmUgIT0gYWxyZWFkeV9sb2FkZWQobmFtZSkiIGNoZWNrIGhlcmUsIGJ1dAorCSAqICBtb2Rwcm9iZSAtciBwY2k6djAwMDA4MDg2ZDAwMDA3MDEwc3YwMDAwMDAwMHNkMDAwMDAwMDBiYzAxc2MwMWk4MAorCSAqIHdvbid0IHVubG9hZCBtb2R1bGVzICh0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSkKKwkgKiB3aGljaCBoYXZlIHRoaXMgYWxpYXMuCisJICovCisJaWYgKCFpc19yZW1vdmUgJiYgYWxyZWFkeV9sb2FkZWQobmFtZSkpIHsKKwkJZGJnMV9lcnJvcl9tc2coIm5vdGhpbmcgdG8gZG8gZm9yICclcyciLCBuYW1lKTsKKwkJcmV0dXJuOworCX0KKworCW9wdGlvbnMgPSBOVUxMOworCWlmICghaXNfcmVtb3ZlKSB7CisJCWNoYXIgKm9wdF9maWxlbmFtZSA9IHhhc3ByaW50ZigiL2V0Yy9tb2R1bGVzLyVzIiwgbmFtZSk7CisJCW9wdGlvbnMgPSB4bWFsbG9jX29wZW5fcmVhZF9jbG9zZShvcHRfZmlsZW5hbWUsIE5VTEwpOworCQlpZiAob3B0aW9ucykKKwkJCXJlcGxhY2Uob3B0aW9ucywgJ1xuJywgJyAnKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9PUFRJT05TX09OX0NNRExJTkUKKwkJaWYgKGNtZGxpbmVfb3B0aW9ucykgeworCQkJLyogTkI6IGNtZGxpbmVfb3B0aW9ucyBhbHdheXMgaGF2ZSBvbmUgbGVhZGluZyAnICcKKwkJCSAqIChzZWUgbWFpbigpKSwgd2UgcmVtb3ZlIGl0IGhlcmUgKi8KKwkJCWNoYXIgKm9wID0geGFzcHJpbnRmKG9wdGlvbnMgPyAiJXMgJXMiIDogIiVzICVzIiArIDMsCisJCQkJCQljbWRsaW5lX29wdGlvbnMgKyAxLCBvcHRpb25zKTsKKwkJCWZyZWUob3B0aW9ucyk7CisJCQlvcHRpb25zID0gb3A7CisJCX0KKyNlbmRpZgorCQlmcmVlKG9wdF9maWxlbmFtZSk7CisJCW1vZHVsZV9sb2FkX29wdGlvbnMgPSBvcHRpb25zOworCQlkYmcxX2Vycm9yX21zZygicHJvY2Vzc19tb2R1bGUoJyVzJyk6IG9wdGlvbnM6JyVzJyIsIG5hbWUsIG9wdGlvbnMpOworCX0KKworCWlmICghbW9kdWxlX2NvdW50KSB7CisJCS8qIFNjYW4gbW9kdWxlIGRpcmVjdG9yeS4gVGhpcyBpcyBkb25lIG9ubHkgb25jZS4KKwkJICogSXQgd2lsbCBhdHRlbXB0IG1vZHVsZSBsb2FkLCBhbmQgd2lsbCBleGl0KEVYSVRfU1VDQ0VTUykKKwkJICogb24gc3VjY2Vzcy4KKwkJICovCisJCW1vZHVsZV9mb3VuZF9pZHggPSAtMTsKKwkJcmVjdXJzaXZlX2FjdGlvbigiLiIsCisJCQlBQ1RJT05fUkVDVVJTRSwgLyogZmxhZ3MgKi8KKwkJCWZpbGVBY3Rpb24sIC8qIGZpbGUgYWN0aW9uICovCisJCQlOVUxMLCAvKiBkaXIgYWN0aW9uICovCisJCQluYW1lLCAvKiB1c2VyIGRhdGEgKi8KKwkJCTAgLyogZGVwdGggKi8KKwkJKTsKKwkJZGJnMV9lcnJvcl9tc2coImRpcnNjYW4gY29tcGxldGUiKTsKKwkJLyogTW9kdWxlIHdhcyBub3QgZm91bmQsIG9yIGxvYWQgZmFpbGVkLCBvciBpc19yZW1vdmUgKi8KKwkJaWYgKG1vZHVsZV9mb3VuZF9pZHggPj0gMCkgeyAvKiBtb2R1bGUgd2FzIGZvdW5kICovCisJCQlpbmZvdmVjID0geHphbGxvYygyICogc2l6ZW9mKGluZm92ZWNbMF0pKTsKKwkJCWluZm92ZWNbMF0gPSAmbW9kaW5mb1ttb2R1bGVfZm91bmRfaWR4XTsKKwkJfSBlbHNlIHsgLyogc2VhcmNoIGZvciBhbGlhcywgbm90IGEgcGxhaW4gbW9kdWxlIG5hbWUgKi8KKwkJCWluZm92ZWMgPSBmaW5kX2FsaWFzKG5hbWUpOworCQl9CisJfSBlbHNlIHsKKwkJaW5mb3ZlYyA9IGZpbmRfYWxpYXMobmFtZSk7CisJfQorCisJaWYgKCFpbmZvdmVjKSB7CisJCS8qIGJvdGggZGlyc2NhbiBhbmQgZmluZF9hbGlhcyBmb3VuZCBub3RoaW5nICovCisJCWlmICghaXNfcmVtb3ZlICYmIGFwcGxldF9uYW1lWzBdICE9ICdkJykgLyogaXQgd2Fzbid0IHJtbW9kIG9yIGRlcG1vZCAqLworCQkJYmJfZXJyb3JfbXNnKCJtb2R1bGUgJyVzJyBub3QgZm91bmQiLCBuYW1lKTsKKy8vVE9ETzogX2FuZF9kaWUoKT8gb3Igc2hvdWxkIHdlIGNvbnRpbnVlICh1bilsb2FkaW5nIG1vZHVsZXMgbGlzdGVkIG9uIGNtZGxpbmU/CisJCWdvdG8gcmV0OworCX0KKworCS8qIFRoZXJlIGNhbiBiZSBtb3JlIHRoYW4gb25lIG1vZHVsZSBmb3IgdGhlIGdpdmVuIGFsaWFzLiBGb3IgZXhhbXBsZSwKKwkgKiAicGNpOnYwMDAwODA4NmQwMDAwNzAxMHN2MDAwMDAwMDBzZDAwMDAwMDAwYmMwMXNjMDFpODAiIG1hdGNoZXMKKwkgKiBhdGFfcGlpeCBiZWNhdXNlIGl0IGhhcyBhbGlhcyAicGNpOnYwMDAwODA4NmQwMDAwNzAxMHN2KnNkKmJjKnNjKmkqIgorCSAqIGFuZCBhdGFfZ2VuZXJpYywgaXQgaGFzIGFsaWFzICJwY2k6dipkKnN2KnNkKmJjMDFzYzAxaSoiCisJICogU3RhbmRhcmQgbW9kcHJvYmUgbG9hZHMgdGhlbSBib3RoLiBXZSBhY2hpZXZlIGl0IGJ5IHJldHVybmluZworCSAqIGEgKmxpc3QqIG9mIG1vZGluZm8gcG9pbnRlcnMgZnJvbSBmaW5kX2FsaWFzKCkuCisJICovCisKKwkvKiBtb2Rwcm9iZSAtcj8gdW5sb2FkIG1vZHVsZShzKSAqLworCWlmIChpc19yZW1vdmUpIHsKKwkJaW5mb2lkeCA9IDA7CisJCXdoaWxlICgoaW5mbyA9IGluZm92ZWNbaW5mb2lkeCsrXSkgIT0gTlVMTCkgeworCQkJaW50IHIgPSBybW1vZChiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9ub3N0cmlwKGluZm8tPnBhdGhuYW1lKSk7CisJCQlpZiAociAhPSAwKSB7CisJCQkJZ290byByZXQ7IC8qIGVycm9yICovCisJCQl9CisJCX0KKwkJLyogbW9kcHJvYmUgLXI6IHdlIGRvIG5vdCBzdG9wIGhlcmUgLQorCQkgKiBjb250aW51ZSB0byB1bmxvYWQgbW9kdWxlcyBvbiB3aGljaCB0aGUgbW9kdWxlIGRlcGVuZHM6CisJCSAqICItciAtLXJlbW92ZTogb3B0aW9uIGNhdXNlcyBtb2Rwcm9iZSB0byByZW1vdmUgYSBtb2R1bGUuCisJCSAqIElmIHRoZSBtb2R1bGVzIGl0IGRlcGVuZHMgb24gYXJlIGFsc28gdW51c2VkLCBtb2Rwcm9iZQorCQkgKiB3aWxsIHRyeSB0byByZW1vdmUgdGhlbSwgdG9vLiIKKwkJICovCisJfQorCisJaW5mb2lkeCA9IDA7CisJd2hpbGUgKChpbmZvID0gaW5mb3ZlY1tpbmZvaWR4KytdKSAhPSBOVUxMKSB7CisJCS8qIEl0ZXJhdGUgdGhydSBkZXBlbmRlbmNpZXMsIHRyeWluZyB0byAodW4pbG9hZCB0aGVtICovCisJCWRlcHMgPSBzdHJfMl9saXN0KGluZm8tPmRlcHMpOworCQlmb3IgKHMgPSBkZXBzOyAqczsgcyArPSBzdHJsZW4ocykgKyAxKSB7CisJCQkvL2lmIChzdHJjbXAobmFtZSwgcykgIT0gMCkgLy8gTi5CLiBkbyBsb29wcyBleGlzdD8KKwkJCWRiZzFfZXJyb3JfbXNnKCJyZWN1cnNlIG9uIGRlcCAnJXMnIiwgcyk7CisJCQlwcm9jZXNzX21vZHVsZShzLCBOVUxMKTsKKwkJCWRiZzFfZXJyb3JfbXNnKCJyZWN1cnNlIG9uIGRlcCAnJXMnIGRvbmUiLCBzKTsKKwkJfQorCQlmcmVlKGRlcHMpOworCisJCWlmIChpc19yZW1vdmUpCisJCQljb250aW51ZTsKKworCQkvKiBXZSBhcmUgbW9kcHJvYmU6IGxvYWQgaXQgKi8KKwkJaWYgKG9wdGlvbnMgJiYgc3Ryc3RyKG9wdGlvbnMsICJibGFja2xpc3QiKSkgeworCQkJZGJnMV9lcnJvcl9tc2coIiclcyc6IGJsYWNrbGlzdGVkIiwgaW5mby0+cGF0aG5hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJZXJybm8gPSAwOworCQlpZiAobG9hZF9tb2R1bGUoaW5mby0+cGF0aG5hbWUsIG9wdGlvbnMpICE9IDApIHsKKwkJCWlmIChFRVhJU1QgIT0gZXJybm8pIHsKKwkJCQliYl9lcnJvcl9tc2coIiclcyc6ICVzIiwKKwkJCQkJaW5mby0+cGF0aG5hbWUsCisJCQkJCW1vZGVycm9yKGVycm5vKSk7CisJCQl9IGVsc2UgeworCQkJCWRiZzFfZXJyb3JfbXNnKCInJXMnOiAlcyIsCisJCQkJCWluZm8tPnBhdGhuYW1lLAorCQkJCQltb2RlcnJvcihlcnJubykpOworCQkJfQorCQl9CisJfQorIHJldDoKKwlmcmVlKGluZm92ZWMpOworCWZyZWUob3B0aW9ucyk7CisvL1RPRE86IHJldHVybiBsb2FkIGF0dGVtcHQgcmVzdWx0IGZyb20gcHJvY2Vzc19tb2R1bGUuCisvL0lmIGRlcCBkaWRuJ3QgbG9hZCBvaywgY29udGludWluZyBtYWtlcyBsaXR0bGUgc2Vuc2UuCit9CisjdW5kZWYgY21kbGluZV9vcHRpb25zCisKKworLyogRm9yIHJlZmVyZW5jZSwgbW9kdWxlLWluaXQtdG9vbHMgdjMuNCBvcHRpb25zOgorCisjIGluc21vZAorVXNhZ2U6IGluc21vZCBmaWxlbmFtZSBbYXJnc10KKworIyBybW1vZCAtLWhlbHAKK1VzYWdlOiBybW1vZCBbLWZoc3d2Vl0gbW9kdWxlbmFtZSAuLi4KKyAtZiAob3IgLS1mb3JjZSkgZm9yY2VzIGEgbW9kdWxlIHVubG9hZCwgYW5kIG1heSBjcmFzaCB5b3VyCisgICAgbWFjaGluZS4gVGhpcyByZXF1aXJlcyB0aGUgRm9yY2VkIE1vZHVsZSBSZW1vdmFsIG9wdGlvbgorICAgIHdoZW4gdGhlIGtlcm5lbCB3YXMgY29tcGlsZWQuCisgLWggKG9yIC0taGVscCkgcHJpbnRzIHRoaXMgaGVscCB0ZXh0CisgLXMgKG9yIC0tc3lzbG9nKSBzYXlzIHVzZSBzeXNsb2csIG5vdCBzdGRlcnIKKyAtdiAob3IgLS12ZXJib3NlKSBlbmFibGVzIG1vcmUgbWVzc2FnZXMKKyAtViAob3IgLS12ZXJzaW9uKSBwcmludHMgdGhlIHZlcnNpb24gY29kZQorIC13IChvciAtLXdhaXQpIGJlZ2lucyBtb2R1bGUgcmVtb3ZhbCBldmVuIGlmIGl0IGlzIHVzZWQKKyAgICBhbmQgd2lsbCBzdG9wIG5ldyB1c2VycyBmcm9tIGFjY2Vzc2luZyB0aGUgbW9kdWxlIChzbyBpdAorICAgIHNob3VsZCBldmVudHVhbGx5IGZhbGwgdG8gemVybykuCisKKyMgbW9kcHJvYmUKK1VzYWdlOiBtb2Rwcm9iZSBbLXZdIFstVl0gWy1DIGNvbmZpZy1maWxlXSBbLW5dIFstaV0gWy1xXSBbLWJdCisgICAgWy1vIDxtb2RuYW1lPl0gWyAtLWR1bXAtbW9kdmVyc2lvbnMgXSA8bW9kbmFtZT4gW3BhcmFtZXRlcnMuLi5dCittb2Rwcm9iZSAtciBbLW5dIFstaV0gWy12XSA8bW9kdWxlbmFtZT4gLi4uCittb2Rwcm9iZSAtbCAtdCA8ZGlybmFtZT4gWyAtYSA8bW9kdWxlbmFtZT4gLi4uXQorCisjIGRlcG1vZCAtLWhlbHAKK2RlcG1vZCAzLjQgLS0gcGFydCBvZiBtb2R1bGUtaW5pdC10b29scworZGVwbW9kIC1bYUFdIFstbiAtZSAtdiAtcSAtViAtciAtdV0KKyAgICAgIFstYiBiYXNlZGlyZWN0b3J5XSBbZm9yY2VkX3ZlcnNpb25dCitkZXBtb2QgWy1uIC1lIC12IC1xIC1yIC11XSBbLUYga2VybmVsc3ltc10gbW9kdWxlMS5rbyBtb2R1bGUyLmtvIC4uLgorSWYgbm8gYXJndW1lbnRzIChleGNlcHQgb3B0aW9ucykgYXJlIGdpdmVuLCAiZGVwbW9kIC1hIiBpcyBhc3N1bWVkLgorZGVwbW9kIHdpbGwgb3V0cHV0IGEgZGVwZW5kZW5jeSBsaXN0IHN1aXRhYmxlIGZvciB0aGUgbW9kcHJvYmUgdXRpbGl0eS4KK09wdGlvbnM6CisgICAgLWEsIC0tYWxsICAgICAgICAgICBQcm9iZSBhbGwgbW9kdWxlcworICAgIC1BLCAtLXF1aWNrICAgICAgICAgT25seSBkb2VzIHRoZSB3b3JrIGlmIHRoZXJlJ3MgYSBuZXcgbW9kdWxlCisgICAgLW4sIC0tc2hvdyAgICAgICAgICBXcml0ZSB0aGUgZGVwZW5kZW5jeSBmaWxlIG9uIHN0ZG91dCBvbmx5CisgICAgLWUsIC0tZXJyc3ltcyAgICAgICBSZXBvcnQgbm90IHN1cHBsaWVkIHN5bWJvbHMKKyAgICAtViwgLS12ZXJzaW9uICAgICAgIFByaW50IHRoZSByZWxlYXNlIHZlcnNpb24KKyAgICAtdiwgLS12ZXJib3NlICAgICAgIEVuYWJsZSB2ZXJib3NlIG1vZGUKKyAgICAtaCwgLS1oZWxwICAgICAgICAgIFByaW50IHRoaXMgdXNhZ2UgbWVzc2FnZQorVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSB1c2VmdWwgZm9yIHBlb3BsZSBtYW5hZ2luZyBkaXN0cmlidXRpb25zOgorICAgIC1iIGJhc2VkaXJlY3RvcnkKKyAgICAtLWJhc2VkaXIgYmFzZWRpcmVjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgVXNlIGFuIGltYWdlIG9mIGEgbW9kdWxlIHRyZWUKKyAgICAtRiBrZXJuZWxzeW1zCisgICAgLS1maWxlc3ltcyBrZXJuZWxzeW1zCisgICAgICAgICAgICAgICAgICAgICAgICBVc2UgdGhlIGZpbGUgaW5zdGVhZCBvZiB0aGUgY3VycmVudCBrZXJuZWwgc3ltYm9scworKi8KKworLy91c2FnZTojaWYgRU5BQkxFX01PRFBST0JFX1NNQUxMCisKKy8vdXNhZ2U6I2RlZmluZSBkZXBtb2RfdHJpdmlhbF91c2FnZSBOT1VTQUdFX1NUUgorLy91c2FnZTojZGVmaW5lIGRlcG1vZF9mdWxsX3VzYWdlICIiCisKKy8vdXNhZ2U6I2RlZmluZSBsc21vZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIGxzbW9kX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTGlzdCB0aGUgY3VycmVudGx5IGxvYWRlZCBrZXJuZWwgbW9kdWxlcyIKKworLy91c2FnZTojZGVmaW5lIGluc21vZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOglJRl9GRUFUVVJFXzJfNF9NT0RVTEVTKCJbT1BUSU9OU10gTU9EVUxFICIpCisvL3VzYWdlOglJRl9OT1RfRkVBVFVSRV8yXzRfTU9EVUxFUygiRklMRSAiKQorLy91c2FnZToJIltTWU1CT0w9VkFMVUVdLi4uIgorLy91c2FnZTojZGVmaW5lIGluc21vZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkxvYWQga2VybmVsIG1vZHVsZSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfMl80X01PRFVMRVMoICJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgbW9kdWxlIHRvIGxvYWQgaW50byB0aGUgd3Jvbmcga2VybmVsIHZlcnNpb24iCisvL3VzYWdlOiAgICAgIlxuCS1rCU1ha2UgbW9kdWxlIGF1dG9jbGVhbi1hYmxlIgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktcQlRdWlldCIKKy8vdXNhZ2U6ICAgICAiXG4JLUwJTG9jazogcHJldmVudCBzaW11bHRhbmVvdXMgbG9hZHMiCisvL3VzYWdlOglJRl9GRUFUVVJFX0lOU01PRF9MT0FEX01BUCgKKy8vdXNhZ2U6ICAgICAiXG4JLW0JT3V0cHV0IGxvYWQgbWFwIHRvIHN0ZG91dCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXgJRG9uJ3QgZXhwb3J0IGV4dGVybnMiCisvL3VzYWdlOgkpCisKKy8vdXNhZ2U6I2RlZmluZSBybW1vZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy13ZmFdIFtNT0RVTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHJtbW9kX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVW5sb2FkIGtlcm5lbCBtb2R1bGVzXG4iCisvL3VzYWdlOiAgICAgIlxuCS13CVdhaXQgdW50aWwgdGhlIG1vZHVsZSBpcyBubyBsb25nZXIgdXNlZCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgdW5sb2FkIgorLy91c2FnZTogICAgICJcbgktYQlSZW1vdmUgYWxsIHVudXNlZCBtb2R1bGVzIChyZWN1cnNpdmVseSkiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHJtbW9kX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHJtbW9kIHR1bGlwXG4iCisKKy8vdXNhZ2U6I2RlZmluZSBtb2Rwcm9iZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiWy1xZndyc3ZdIE1PRFVMRSBbU1lNQk9MPVZBTFVFXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBtb2Rwcm9iZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgktcglSZW1vdmUgTU9EVUxFIChzdGFja3MpIG9yIGRvIGF1dG9jbGVhbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJUXVpZXQiCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIgorLy91c2FnZTogICAgICJcbgktdwlXYWl0IGZvciB1bmxvYWQiCisvL3VzYWdlOiAgICAgIlxuCS1zCVJlcG9ydCB2aWEgc3lzbG9nIGluc3RlYWQgb2Ygc3RkZXJyIgorCisvL3VzYWdlOiNlbmRpZgorCitpbnQgbW9kcHJvYmVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1vZHByb2JlX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgdXRzbmFtZSB1dHM7CisJY2hhciBhcHBsZXQwID0gYXBwbGV0X25hbWVbMF07CisJSUZfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9PUFRJT05TX09OX0NNRExJTkUoY2hhciAqb3B0aW9uczspCisKKwkvKiBhcmUgd2UgbHNtb2Q/IC0+IGp1c3QgZHVtcCAvcHJvYy9tb2R1bGVzICovCisJaWYgKCdsJyA9PSBhcHBsZXQwKSB7CisJCXhwcmludF9hbmRfY2xvc2VfZmlsZSh4Zm9wZW5fZm9yX3JlYWQoIi9wcm9jL21vZHVsZXMiKSk7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJSU5JVF9HKCk7CisKKwkvKiBQcmV2ZW50IHVnbHkgY29ybmVyIGNhc2VzIHdpdGggbm8gbW9kdWxlcyBhdCBhbGwgKi8KKwltb2RpbmZvID0geHphbGxvYyhzaXplb2YobW9kaW5mb1swXSkpOworCisJaWYgKCdpJyAhPSBhcHBsZXQwKSB7IC8qIG5vdCBpbnNtb2QgKi8KKwkJLyogR290byBtb2R1bGVzIGRpcmVjdG9yeSAqLworCQl4Y2hkaXIoQ09ORklHX0RFRkFVTFRfTU9EVUxFU19ESVIpOworCX0KKwl1bmFtZSgmdXRzKTsgLyogbmV2ZXIgZmFpbHMgKi8KKworCS8qIGRlcG1vZD8gKi8KKwlpZiAoJ2QnID09IGFwcGxldDApIHsKKwkJLyogU3VwcG9ydGVkOgorCQkgKiAtbjogcHJpbnQgcmVzdWx0IHRvIHN0ZG91dAorCQkgKiAtYTogcHJvY2VzcyBhbGwgbW9kdWxlcyAoZGVmYXVsdCkKKwkJICogb3B0aW9uYWwgVkVSU0lPTiBwYXJhbWV0ZXIKKwkJICogSWdub3JlZDoKKwkJICogLUE6IGRvIHdvcmsgb25seSBpZiBhIG1vZHVsZSBpcyBuZXdlciB0aGFuIGRlcGZpbGUKKwkJICogLWU6IHJlcG9ydCBhbnkgc3ltYm9scyB3aGljaCBhIG1vZHVsZSBuZWVkcworCQkgKiAgd2hpY2ggYXJlIG5vdCBzdXBwbGllZCBieSBvdGhlciBtb2R1bGVzIG9yIHRoZSBrZXJuZWwKKwkJICogLUYgRklMRTogU3lzdGVtLm1hcCAoc3ltYm9scyBmb3IgLWUpCisJCSAqIC1xLCAtciwgLXU6IG5vb3A/CisJCSAqIE5vdCBzdXBwb3J0ZWQ6CisJCSAqIC1iIEJBU0VESVI6IChUT0RPISkgbW9kdWxlcyBhcmUgaW4KKwkJICogICRCQVNFRElSL2xpYi9tb2R1bGVzLyRWRVJTSU9OCisJCSAqIC12OiBodW1hbiByZWFkYWJsZSBkZXBzIHRvIHN0ZG91dAorCQkgKiAtVjogdmVyc2lvbiAoZG9uJ3Qgd2FudCB0byBzdXBwb3J0IGl0IC0gcGVvcGxlIG1heSBkZXBlbmQKKwkJICogIG9uIGl0IGFzIGFuIGluZGljYXRvciBvZiAic3RhbmRhcmQiIGRlcG1vZCkKKwkJICogLWg6IGhlbHAgKHdlbGwgZHVoKQorCQkgKiBtb2R1bGUxLm8gbW9kdWxlMi5vIHBhcmFtZXRlcnMgKGp1c3QgaWdub3JlZCBmb3Igbm93KQorCQkgKi8KKwkJZ2V0b3B0MzIoYXJndiwgIm5hIiAiQWVGOnFydSIgLyogImI6dlYiLCBOVUxMICovLCBOVUxMKTsKKwkJYXJndiArPSBvcHRpbmQ7CisJCS8qIGlmIChhcmd2WzBdICYmIGFyZ3ZbMV0pIGJiX3Nob3dfdXNhZ2UoKTsgKi8KKwkJLyogR290byAkVkVSU0lPTiBkaXJlY3RvcnkgKi8KKwkJeGNoZGlyKGFyZ3ZbMF0gPyBhcmd2WzBdIDogdXRzLnJlbGVhc2UpOworCQkvKiBGb3JjZSBmdWxsIG1vZHVsZSBzY2FuIGJ5IGFza2luZyB0byBmaW5kIGEgYm9ndXMgbW9kdWxlLgorCQkgKiBUaGlzIHdpbGwgZ2VuZXJhdGUgbW9kdWxlcy5kZXAuYmIgYXMgYSBzaWRlIGVmZmVjdC4gKi8KKwkJcHJvY2Vzc19tb2R1bGUoKGNoYXIqKSIvIiwgTlVMTCk7CisJCXJldHVybiAhd3JvdGVfZGVwX2JiX29rOworCX0KKworCS8qIGluc21vZCwgbW9kcHJvYmUsIHJtbW9kIHJlcXVpcmUgYXQgbGVhc3Qgb25lIGFyZ3VtZW50ICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiOworCS8qIG9ubHkgLXEgKHF1aWV0KSBhbmQgLXIgKHJtbW9kKSwKKwkgKiB0aGUgcmVzdCBhcmUgYWNjZXB0ZWQgYW5kIGlnbm9yZWQgKGNvbXBhdCkgKi8KKwlnZXRvcHQzMihhcmd2LCAicXJmc3Z3YiIpOworCWFyZ3YgKz0gb3B0aW5kOworCisJLyogYXJlIHdlIHJtbW9kPyAtPiBzaW11bGF0ZSBtb2Rwcm9iZSAtciAqLworCWlmICgncicgPT0gYXBwbGV0MCkgeworCQlvcHRpb25fbWFzazMyIHw9IE9QVF9yOworCX0KKworCWlmICgnaScgIT0gYXBwbGV0MCkgeyAvKiBub3QgaW5zbW9kICovCisJCS8qIEdvdG8gJFZFUlNJT04gZGlyZWN0b3J5ICovCisJCXhjaGRpcih1dHMucmVsZWFzZSk7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTU9EUFJPQkVfU01BTExfT1BUSU9OU19PTl9DTURMSU5FCisJLyogSWYgbm90IHJtbW9kLy1yLCBwYXJzZSBwb3NzaWJsZSBtb2R1bGUgb3B0aW9ucyBnaXZlbiBvbiBjb21tYW5kIGxpbmUuCisJICogaW5zbW9kL21vZHByb2JlIHRha2VzIG9uZSBtb2R1bGUgbmFtZSwgdGhlIHJlc3QgYXJlIHBhcmFtZXRlcnMuICovCisJb3B0aW9ucyA9IE5VTEw7CisJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9yKSkgeworCQljaGFyICoqYXJnID0gYXJndjsKKwkJd2hpbGUgKCorK2FyZykgeworCQkJLyogRW5jbG9zZSBvcHRpb25zIGluIHF1b3RlcyAqLworCQkJY2hhciAqcyA9IG9wdGlvbnM7CisJCQlvcHRpb25zID0geGFzcHJpbnRmKCIlcyBcIiVzXCIiLCBzID8gcyA6ICIiLCAqYXJnKTsKKwkJCWZyZWUocyk7CisJCQkqYXJnID0gTlVMTDsKKwkJfQorCX0KKyNlbHNlCisJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9yKSkKKwkJYXJndlsxXSA9IE5VTEw7CisjZW5kaWYKKworCWlmICgnaScgPT0gYXBwbGV0MCkgeyAvKiBpbnNtb2QgKi8KKwkJc2l6ZV90IGxlbjsKKwkJdm9pZCAqbWFwOworCisJCWxlbiA9IE1BWElOVChzc2l6ZV90KTsKKwkJbWFwID0geG1hbGxvY19vcGVuX3ppcHBlZF9yZWFkX2Nsb3NlKCphcmd2LCAmbGVuKTsKKwkJaWYgKCFtYXApCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJlYWQgJyVzJyIsICphcmd2KTsKKwkJaWYgKGluaXRfbW9kdWxlKG1hcCwgbGVuLAorCQkJSUZfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9PUFRJT05TX09OX0NNRExJTkUob3B0aW9ucyA/IG9wdGlvbnMgOiAiIikKKwkJCUlGX05PVF9GRUFUVVJFX01PRFBST0JFX1NNQUxMX09QVElPTlNfT05fQ01ETElORSgiIikKKwkJCSkgIT0gMAorCQkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBpbnNlcnQgJyVzJzogJXMiLAorCQkJCQkqYXJndiwgbW9kZXJyb3IoZXJybm8pKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBUcnkgdG8gbG9hZCBtb2Rwcm9iZS5kZXAuYmIgKi8KKwlpZiAoJ3InICE9IGFwcGxldDApIC8qIG5vdCBybW1vZCAqLworCQlsb2FkX2RlcF9iYigpOworCisJLyogTG9hZC9yZW1vdmUgbW9kdWxlcy4KKwkgKiBPbmx5IHJtbW9kL21vZHByb2JlIC1yIGxvb3BzIGhlcmUsIGluc21vZC9tb2Rwcm9iZSBoYXMgb25seSBhcmd2WzBdICovCisJZG8geworCQlwcm9jZXNzX21vZHVsZSgqYXJndiwgb3B0aW9ucyk7CisJfSB3aGlsZSAoKisrYXJndik7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJSUZfRkVBVFVSRV9NT0RQUk9CRV9TTUFMTF9PUFRJT05TX09OX0NNRExJTkUoZnJlZShvcHRpb25zKTspCisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9tb2R1dGlscy9tb2Rwcm9iZS5jIGIvbW9kdXRpbHMvbW9kcHJvYmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTRhN2ExCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdXRpbHMvbW9kcHJvYmUuYwpAQCAtMCwwICsxLDcwMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTW9kcHJvYmUgd3JpdHRlbiBmcm9tIHNjcmF0Y2ggZm9yIEJ1c3lCb3gKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVGltbyBUZXJhcyA8dGltby50ZXJhc0Bpa2kuZmk+CisgKiBDb3B5cmlnaHQgKGMpIDIwMDggVmxhZGltaXIgRHJvbm5pa292CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2FwcGxldDpJRl9NT0RQUk9CRShBUFBMRVQobW9kcHJvYmUsIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJtb2R1dGlscy5oIgorI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjaW5jbHVkZSA8Zm5tYXRjaC5oPgorCisjaWYgMQorI2RlZmluZSBEQkcoLi4uKSAoKHZvaWQpMCkKKyNlbHNlCisjZGVmaW5lIERCRyhmbXQsIC4uLikgYmJfZXJyb3JfbXNnKCIlczogIiBmbXQsIF9fZnVuY19fLCAjIyBfX1ZBX0FSR1NfXykKKyNlbmRpZgorCisvKiBOb3RlIHRoYXQgdW5saWtlIG9sZGVyIHZlcnNpb25zIG9mIG1vZHVsZXMuZGVwL2RlcG1vZCAoYnVzeWJveCBhbmQgbS1pLXQpLAorICogd2UgZXhwZWN0IHRoZSBmdWxsIGRlcGVuZGVuY3kgbGlzdCB0byBiZSBzcGVjaWZpZWQgaW4gbW9kdWxlcy5kZXAuCisgKiBPbGRlciB2ZXJzaW9ucyB3b3VsZCBvbmx5IGV4cG9ydCB0aGUgZGlyZWN0IGRlcGVuZGVuY3kgbGlzdC4KKyAqLworCisKKy8vdXNhZ2U6I2lmICFFTkFCTEVfTU9EUFJPQkVfU01BTEwKKy8vdXNhZ2U6I2RlZmluZSBtb2Rwcm9iZV9ub3Rlc191c2FnZQorLy91c2FnZToJIm1vZHByb2JlIGNhbiAodW4pbG9hZCBhIHN0YWNrIG9mIG1vZHVsZXMsIHBhc3NpbmcgZWFjaCBtb2R1bGUgb3B0aW9ucyAod2hlblxuIgorLy91c2FnZToJImxvYWRpbmcpLiBtb2Rwcm9iZSB1c2VzIGEgY29uZmlndXJhdGlvbiBmaWxlIHRvIGRldGVybWluZSB3aGF0IG9wdGlvbihzKSB0b1xuIgorLy91c2FnZToJInBhc3MgZWFjaCBtb2R1bGUgaXQgbG9hZHMuXG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBzZWFyY2hlZCAoaW4gdGhpcyBvcmRlcik6XG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiICAgIC9ldGMvbW9kcHJvYmUuY29uZiAoMi42IG9ubHkpXG4iCisvL3VzYWdlOgkiICAgIC9ldGMvbW9kdWxlcy5jb25mXG4iCisvL3VzYWdlOgkiICAgIC9ldGMvY29uZi5tb2R1bGVzIChkZXByZWNhdGVkKVxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIlRoZXkgYWxsIGhhdmUgdGhlIHNhbWUgc3ludGF4IChzZWUgYmVsb3cpLiBJZiBub25lIGlzIHByZXNlbnQsIGl0IGlzXG4iCisvL3VzYWdlOgkiX25vdF8gYW4gZXJyb3I7IGVhY2ggbG9hZGVkIG1vZHVsZSBpcyB0aGVuIGV4cGVjdGVkIHRvIGxvYWQgd2l0aG91dFxuIgorLy91c2FnZToJIm9wdGlvbnMuIE9uY2UgYSBmaWxlIGlzIGZvdW5kLCB0aGUgb3RoZXJzIGFyZSB0ZXN0ZWQgZm9yLlxuIgorLy91c2FnZToJIlxuIgorLy91c2FnZToJIi9ldGMvbW9kdWxlcy5jb25mIGVudHJ5IGZvcm1hdDpcbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIgIGFsaWFzIDxhbGlhc19uYW1lPiA8bW9kX25hbWU+XG4iCisvL3VzYWdlOgkiICAgIE1ha2VzIGl0IHBvc3NpYmxlIHRvIG1vZHByb2JlIGFsaWFzX25hbWUsIHdoZW4gdGhlcmUgaXMgbm8gc3VjaCBtb2R1bGUuXG4iCisvL3VzYWdlOgkiICAgIEl0IG1ha2VzIHNlbnNlIGlmIHlvdXIgbW9kX25hbWUgaXMgbG9uZywgb3IgeW91IHdhbnQgYSBtb3JlIHJlcHJlc2VudGF0aXZlXG4iCisvL3VzYWdlOgkiICAgIG5hbWUgZm9yIHRoYXQgbW9kdWxlIChlZy4gJ3Njc2knIGluIHBsYWNlIG9mICdhaGE3eHh4JykuXG4iCisvL3VzYWdlOgkiICAgIFRoaXMgbWFrZXMgaXQgYWxzbyBwb3NzaWJsZSB0byB1c2UgYSBkaWZmZXJlbnQgc2V0IG9mIG9wdGlvbnMgKGJlbG93KSBmb3JcbiIKKy8vdXNhZ2U6CSIgICAgdGhlIG1vZHVsZSBhbmQgdGhlIGFsaWFzLlxuIgorLy91c2FnZToJIiAgICBBIG1vZHVsZSBjYW4gYmUgYWxpYXNlZCBtb3JlIHRoYW4gb25jZS5cbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSIgIG9wdGlvbnMgPG1vZF9uYW1lfGFsaWFzX25hbWU+IDxzeW1ib2w9dmFsdWUuLi4+XG4iCisvL3VzYWdlOgkiICAgIFdoZW4gbG9hZGluZyBtb2R1bGUgbW9kX25hbWUgKG9yIHRoZSBtb2R1bGUgYWxpYXNlZCBieSBhbGlhc19uYW1lKSwgcGFzc1xuIgorLy91c2FnZToJIiAgICB0aGUgXCJzeW1ib2w9dmFsdWVcIiBwYWlycyBhcyBvcHRpb24gdG8gdGhhdCBtb2R1bGUuXG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiU2FtcGxlIC9ldGMvbW9kdWxlcy5jb25mIGZpbGU6XG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiICBvcHRpb25zIHR1bGlwIGlycT0zXG4iCisvL3VzYWdlOgkiICBhbGlhcyB0dWxpcCB0dWxpcDJcbiIKKy8vdXNhZ2U6CSIgIG9wdGlvbnMgdHVsaXAyIGlycT00IGlvPTB4MzA4XG4iCisvL3VzYWdlOgkiXG4iCisvL3VzYWdlOgkiT3RoZXIgZnVuY3Rpb25hbGl0eSBvZmZlcmVkIGJ5ICdjbGFzc2ljJyBtb2Rwcm9iZSBpcyBub3QgYXZhaWxhYmxlIGluXG4iCisvL3VzYWdlOgkidGhpcyBpbXBsZW1lbnRhdGlvbi5cbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSJJZiBtb2R1bGUgb3B0aW9ucyBhcmUgcHJlc2VudCBib3RoIGluIHRoZSBjb25maWcgZmlsZSwgYW5kIG9uIHRoZSBjb21tYW5kIGxpbmUsXG4iCisvL3VzYWdlOgkidGhlbiB0aGUgb3B0aW9ucyBmcm9tIHRoZSBjb21tYW5kIGxpbmUgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIG1vZHVsZSBfYWZ0ZXJfXG4iCisvL3VzYWdlOgkidGhlIG9wdGlvbnMgZnJvbSB0aGUgY29uZmlnIGZpbGUuIFRoYXQgd2F5LCB5b3UgY2FuIGhhdmUgZGVmYXVsdHMgaW4gdGhlIGNvbmZpZ1xuIgorLy91c2FnZToJImZpbGUsIGFuZCBvdmVycmlkZSB0aGVtIGZvciBhIHNwZWNpZmljIHVzYWdlIGZyb20gdGhlIGNvbW1hbmQgbGluZS5cbiIKKy8vdXNhZ2U6I2RlZmluZSBtb2Rwcm9iZV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiKHdpdGggdGhlIGFib3ZlIC9ldGMvbW9kdWxlcy5jb25mKTpcblxuIgorLy91c2FnZTogICAgICAgIiQgbW9kcHJvYmUgdHVsaXBcbiIKKy8vdXNhZ2U6ICAgICAgICIgICB3aWxsIGxvYWQgdGhlIG1vZHVsZSAndHVsaXAnIHdpdGggZGVmYXVsdCBvcHRpb24gJ2lycT0zJ1xuXG4iCisvL3VzYWdlOiAgICAgICAiJCBtb2Rwcm9iZSB0dWxpcCBpcnE9NVxuIgorLy91c2FnZTogICAgICAgIiAgIHdpbGwgbG9hZCB0aGUgbW9kdWxlICd0dWxpcCcgd2l0aCBvcHRpb24gJ2lycT01JywgdGh1cyBvdmVycmlkaW5nIHRoZSBkZWZhdWx0XG5cbiIKKy8vdXNhZ2U6ICAgICAgICIkIG1vZHByb2JlIHR1bGlwMlxuIgorLy91c2FnZTogICAgICAgIiAgIHdpbGwgbG9hZCB0aGUgbW9kdWxlICd0dWxpcCcgd2l0aCBkZWZhdWx0IG9wdGlvbnMgJ2lycT00IGlvPTB4MzA4JyxcbiIKKy8vdXNhZ2U6ICAgICAgICIgICB3aGljaCBhcmUgdGhlIGRlZmF1bHQgZm9yIGFsaWFzICd0dWxpcDInXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIkIG1vZHByb2JlIHR1bGlwMiBpcnE9OFxuIgorLy91c2FnZTogICAgICAgIiAgIHdpbGwgbG9hZCB0aGUgbW9kdWxlICd0dWxpcCcgd2l0aCBkZWZhdWx0IG9wdGlvbnMgJ2lycT00IGlvPTB4MzA4IGlycT04JyxcbiIKKy8vdXNhZ2U6ICAgICAgICIgICB3aGljaCBhcmUgdGhlIGRlZmF1bHQgZm9yIGFsaWFzICd0dWxpcDInIG92ZXJyaWRkZW4gYnkgdGhlIG9wdGlvbiAnaXJxPTgnXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIgICBmcm9tIHRoZSBjb21tYW5kIGxpbmVcblxuIgorLy91c2FnZTogICAgICAgIiQgbW9kcHJvYmUgdHVsaXAyIGlycT0yIGlvPTB4MjEwXG4iCisvL3VzYWdlOiAgICAgICAiICAgd2lsbCBsb2FkIHRoZSBtb2R1bGUgJ3R1bGlwJyB3aXRoIGRlZmF1bHQgb3B0aW9ucyAnaXJxPTQgaW89MHgzMDggaXJxPTQgaW89MHgyMTAnLFxuIgorLy91c2FnZTogICAgICAgIiAgIHdoaWNoIGFyZSB0aGUgZGVmYXVsdCBmb3IgYWxpYXMgJ3R1bGlwMicgb3ZlcnJpZGRlbiBieSB0aGUgb3B0aW9ucyAnaXJxPTIgaW89MHgyMTAnXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIgICBmcm9tIHRoZSBjb21tYW5kIGxpbmVcbiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbW9kcHJvYmVfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIlstYWxycXZzRCIgSUZfRkVBVFVSRV9NT0RQUk9CRV9CTEFDS0xJU1QoImIiKSAiXSIKKy8vdXNhZ2U6CSIgTU9EVUxFIFtTWU1CT0w9VkFMVUVdLi4uIgorLy91c2FnZTojZGVmaW5lIG1vZHByb2JlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1hCUxvYWQgbXVsdGlwbGUgTU9EVUxFcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGlzdCAoTU9EVUxFIGlzIGEgcGF0dGVybikiCisvL3VzYWdlOiAgICAgIlxuCS1yCVJlbW92ZSBNT0RVTEUgKHN0YWNrcykgb3IgZG8gYXV0b2NsZWFuIgorLy91c2FnZTogICAgICJcbgktcQlRdWlldCIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJTG9nIHRvIHN5c2xvZyIKKy8vdXNhZ2U6ICAgICAiXG4JLUQJU2hvdyBkZXBlbmRlbmNpZXMiCisvL3VzYWdlOglJRl9GRUFUVVJFX01PRFBST0JFX0JMQUNLTElTVCgKKy8vdXNhZ2U6ICAgICAiXG4JLWIJQXBwbHkgYmxhY2tsaXN0IHRvIG1vZHVsZSBuYW1lcyB0b28iCisvL3VzYWdlOgkpCisvL3VzYWdlOiNlbmRpZiAvKiAhRU5BQkxFX01PRFBST0JFX1NNQUxMICovCisKKy8qIE5vdGU6IHVzYWdlIHRleHQgZG9lc24ndCBkb2N1bWVudCB2YXJpb3VzIDIuNCBvcHRpb25zCisgKiB3ZSBwdWxsIGluIHRocm91Z2ggSU5TTU9EX09QVFMgZGVmaW5lCisgKiBOb3RlMjogLWIgaXMgYWx3YXlzIGFjY2VwdGVkLCBidXQgaWYgIUZFQVRVUkVfTU9EUFJPQkVfQkxBQ0tMSVNULAorICogaXQgaXMgYSBuby1vcC4KKyAqLworI2RlZmluZSBNT0RQUk9CRV9PUFRTICAiYWxyRGIiCisvKiAtYSBhbmQgLUQgX2FyZV8gaW4gZmFjdCBjb21wYXRpYmxlICovCisjZGVmaW5lIE1PRFBST0JFX0NPTVBMRU1FTlRBUlkgKCJxLXY6di1xOmwtLWFyRDpyLS1hbEQ6YS0tbHI6RC0tcmwiKQorLy8jZGVmaW5lIE1PRFBST0JFX09QVFMgICJhY2Q6bG5ydDpDOmIiCisvLyNkZWZpbmUgTU9EUFJPQkVfQ09NUExFTUVOVEFSWSAicS12OnYtcTpsLS1hY3I6YS0tbHI6ci0tYWwiCitlbnVtIHsKKwlPUFRfSU5TRVJUX0FMTCAgID0gKElOU01PRF9PUFRfVU5VU0VEIDw8IDApLCAvKiBhICovCisJLy9PUFRfRFVNUF9PTkxZICA9IChJTlNNT0RfT1BUX1VOVVNFRCA8PCB4KSwgLyogYyAqLworCS8vT1BUX0RJUk5BTUUgICAgPSAoSU5TTU9EX09QVF9VTlVTRUQgPDwgeCksIC8qIGQgKi8KKwlPUFRfTElTVF9PTkxZICAgID0gKElOU01PRF9PUFRfVU5VU0VEIDw8IDEpLCAvKiBsICovCisJLy9PUFRfU0hPV19PTkxZICA9IChJTlNNT0RfT1BUX1VOVVNFRCA8PCB4KSwgLyogbiAqLworCU9QVF9SRU1PVkUgICAgICAgPSAoSU5TTU9EX09QVF9VTlVTRUQgPDwgMiksIC8qIHIgKi8KKwkvL09QVF9SRVNUUklDVCAgID0gKElOU01PRF9PUFRfVU5VU0VEIDw8IHgpLCAvKiB0ICovCisJLy9PUFRfVkVST05MWSAgICA9IChJTlNNT0RfT1BUX1VOVVNFRCA8PCB4KSwgLyogViAqLworCS8vT1BUX0NPTkZJR0ZJTEUgPSAoSU5TTU9EX09QVF9VTlVTRUQgPDwgeCksIC8qIEMgKi8KKwlPUFRfU0hPV19ERVBTICAgID0gKElOU01PRF9PUFRfVU5VU0VEIDw8IDMpLCAvKiBEICovCisJT1BUX0JMQUNLTElTVCAgICA9IChJTlNNT0RfT1BUX1VOVVNFRCA8PCA0KSAqIEVOQUJMRV9GRUFUVVJFX01PRFBST0JFX0JMQUNLTElTVCwKK307CisjaWYgRU5BQkxFX0xPTkdfT1BUUworc3RhdGljIGNvbnN0IGNoYXIgbW9kcHJvYmVfbG9uZ29wdHNbXSBBTElHTjEgPQorCS8qIG5vYm9keSBhc2tlZCBmb3IgbG9uZyBvcHRzICh5ZXQpICovCisJLy8gImFsbFwwIiAgICAgICAgICBOb19hcmd1bWVudCAiYSIKKwkvLyAibGlzdFwwIiAgICAgICAgIE5vX2FyZ3VtZW50ICJsIgorCS8vICJyZW1vdmVcMCIgICAgICAgTm9fYXJndW1lbnQgInIiCisJLy8gInF1aWV0XDAiICAgICAgICBOb19hcmd1bWVudCAicSIKKwkvLyAidmVyYm9zZVwwIiAgICAgIE5vX2FyZ3VtZW50ICJ2IgorCS8vICJzeXNsb2dcMCIgICAgICAgTm9fYXJndW1lbnQgInMiCisJLyogbW9kdWxlLWluaXQtdG9vbHMgMy4xMS4xIGhhcyBvbmx5IGxvbmcgb3B0IC0tc2hvdy1kZXBlbmRzCisJICogYnV0IG5vIHNob3J0IC1ELCB3ZSBwcm92aWRlIGxvbmcgb3B0IGZvciBzY3JpcHRzIHdoaWNoCisJICogd2VyZSB3cml0dGVuIGZvciAzLjExLjE6ICovCisJInNob3ctZGVwZW5kc1wwIiAgICAgTm9fYXJndW1lbnQgIkQiCisJLy8gInVzZS1ibGFja2xpc3RcMCIgTm9fYXJndW1lbnQgImIiCisJOworI2VuZGlmCisKKyNkZWZpbmUgTU9EVUxFX0ZMQUdfTE9BREVEICAgICAgICAgICAgICAweDAwMDEKKyNkZWZpbmUgTU9EVUxFX0ZMQUdfTkVFRF9ERVBTICAgICAgICAgICAweDAwMDIKKy8qICJ3YXMgc2VlbiBpbiBtb2R1bGVzLmRlcCI6ICovCisjZGVmaW5lIE1PRFVMRV9GTEFHX0ZPVU5EX0lOX01PRERFUCAgICAgMHgwMDA0CisjZGVmaW5lIE1PRFVMRV9GTEFHX0JMQUNLTElTVEVEICAgICAgICAgMHgwMDA4CisKK3N0cnVjdCBtb2R1bGVfZW50cnkgeyAvKiBJJ2xsIGNhbGwgaXQgTUUuICovCisJdW5zaWduZWQgZmxhZ3M7CisJY2hhciAqbW9kbmFtZTsgLyogc3RyaXBwZWQgb2YgL3BhdGgvLCAuZXh0IGFuZCBzLy0vXy9nICovCisJY29uc3QgY2hhciAqcHJvYmVkX25hbWU7IC8qIHZlcmJhdGltIGFzIHNlZW4gb24gY21kbGluZSAqLworCWNoYXIgKm9wdGlvbnM7IC8qIG9wdGlvbnMgZnJvbSBjb25maWcgZmlsZXMgKi8KKwlsbGlzdF90ICpyZWFsbmFtZXM7IC8qIHN0cmluZ3MuIGlmIHRoaXMgbW9kdWxlIGlzIGFuIGFsaWFzLCAqLworCS8qIHJlYWwgbW9kdWxlIG5hbWUgaXMgb25lIG9mIHRoZXNlLiAqLworLy9DYW4gdGhlcmUgcmVhbGx5IGJlIG1vcmUgdGhhbiBvbmU/IEV4YW1wbGUgZnJvbSByZWFsIGtlcm5lbD8KKwlsbGlzdF90ICpkZXBzOyAvKiBzdHJpbmdzLiBtb2R1bGVzIHdlIGRlcGVuZCBvbiAqLworfTsKKworI2RlZmluZSBEQl9IQVNIX1NJWkUgMjU2CisKK3N0cnVjdCBnbG9iYWxzIHsKKwlsbGlzdF90ICpwcm9iZXM7IC8qIE1FcyBvZiBtb2R1bGUocykgcmVxdWVzdGVkIG9uIGNtZGxpbmUgKi8KKwljaGFyICpjbWRsaW5lX21vcHRzOyAvKiBtb2R1bGUgb3B0aW9ucyBmcm9tIGNtZGxpbmUgKi8KKwlpbnQgbnVtX3VucmVzb2x2ZWRfZGVwczsKKwkvKiBib29sLiAiRGlkIHdlIGhhdmUgJ3N5bWJvbDpGT08nIHJlcXVlc3RlZCBvbiBjbWRsaW5lPyIgKi8KKwlzbWFsbGludCBuZWVkX3N5bWJvbHM7CisJc3RydWN0IHV0c25hbWUgdXRzOworCWxsaXN0X3QgKmRiW0RCX0hBU0hfU0laRV07IC8qIE1FcyBvZiBhbGwgbW9kdWxlcyBldmVyIHNlZW4gKGNhY2hpbmcgZm9yIHNwZWVkKSAqLworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKK30gd2hpbGUgKDApCisKKworc3RhdGljIGludCByZWFkX2NvbmZpZyhjb25zdCBjaGFyICpwYXRoKTsKKworc3RhdGljIGNoYXIgKmdhdGhlcl9vcHRpb25zX3N0cihjaGFyICpvcHRzLCBjb25zdCBjaGFyICphcHBlbmQpCit7CisJLyogU3BlZWQtb3B0aW1pemVkLiBXZSBjYWxsIGdhdGhlcl9vcHRpb25zX3N0ciBtYW55IHRpbWVzLiAqLworCWlmIChhcHBlbmQpIHsKKwkJaWYgKG9wdHMgPT0gTlVMTCkgeworCQkJb3B0cyA9IHhzdHJkdXAoYXBwZW5kKTsKKwkJfSBlbHNlIHsKKwkJCWludCBvcHRsZW4gPSBzdHJsZW4ob3B0cyk7CisJCQlvcHRzID0geHJlYWxsb2Mob3B0cywgb3B0bGVuICsgc3RybGVuKGFwcGVuZCkgKyAyKTsKKwkJCXNwcmludGYob3B0cyArIG9wdGxlbiwgIiAlcyIsIGFwcGVuZCk7CisJCX0KKwl9CisJcmV0dXJuIG9wdHM7Cit9CisKKy8qIFRoZXNlIHRocmVlIGZ1bmN0aW9ucyBjYWxsZWQgbWFueSB0aW1lcywgb3B0aW1pemluZyBmb3Igc3BlZWQuCisgKiBVc2VycyByZXBvcnRlZCBtaW51dGUtbG9uZyBkZWxheXMgd2hlbiB0aGV5IHJ1bm4gaXB0YWJsZXMgcmVwZWF0ZWRseQorICogKGlwdGFibGVzIHVzZSBtb2Rwcm9iZSB0byBpbnN0YWxsIG5lZWRlZCBrZXJuZWwgbW9kdWxlcykuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgbW9kdWxlX2VudHJ5ICpoZWxwZXJfZ2V0X21vZHVsZShjb25zdCBjaGFyICptb2R1bGUsIGludCBjcmVhdGUpCit7CisJY2hhciBtb2RuYW1lW01PRFVMRV9OQU1FX0xFTl07CisJc3RydWN0IG1vZHVsZV9lbnRyeSAqZTsKKwlsbGlzdF90ICpsOworCXVuc2lnbmVkIGk7CisJdW5zaWduZWQgaGFzaDsKKworCWZpbGVuYW1lMm1vZG5hbWUobW9kdWxlLCBtb2RuYW1lKTsKKworCWhhc2ggPSAwOworCWZvciAoaSA9IDA7IG1vZG5hbWVbaV07IGkrKykKKwkJaGFzaCA9ICgoaGFzaCA8PCA1KSArIGhhc2gpICsgbW9kbmFtZVtpXTsKKwloYXNoICU9IERCX0hBU0hfU0laRTsKKworCWZvciAobCA9IEcuZGJbaGFzaF07IGw7IGwgPSBsLT5saW5rKSB7CisJCWUgPSAoc3RydWN0IG1vZHVsZV9lbnRyeSAqKSBsLT5kYXRhOworCQlpZiAoc3RyY21wKGUtPm1vZG5hbWUsIG1vZG5hbWUpID09IDApCisJCQlyZXR1cm4gZTsKKwl9CisJaWYgKCFjcmVhdGUpCisJCXJldHVybiBOVUxMOworCisJZSA9IHh6YWxsb2Moc2l6ZW9mKCplKSk7CisJZS0+bW9kbmFtZSA9IHhzdHJkdXAobW9kbmFtZSk7CisJbGxpc3RfYWRkX3RvKCZHLmRiW2hhc2hdLCBlKTsKKworCXJldHVybiBlOworfQorc3RhdGljIEFMV0FZU19JTkxJTkUgc3RydWN0IG1vZHVsZV9lbnRyeSAqZ2V0X29yX2FkZF9tb2RlbnRyeShjb25zdCBjaGFyICptb2R1bGUpCit7CisJcmV0dXJuIGhlbHBlcl9nZXRfbW9kdWxlKG1vZHVsZSwgMSk7Cit9CisvKiBTbyBmYXIgdGhpcyBmdW5jdGlvbiBhbHdheXMgZ2V0cyBhIG1vZHVsZSBwYXRobmFtZSwgbmV2ZXIgYW4gYWxpYXMgbmFtZS4KKyAqIFRoZSBjcnVjaWFsIGRpZmZlcmVuY2UgaXMgdGhhdCBwYXRobmFtZSBuZWVkcyBkaXJuYW1lIHN0cmlwcGluZywKKyAqIHdoaWxlIGFsaWFzIG5hbWUgbXVzdCBOT1QgZG8gaXQhCisgKiBUZXN0Y2FzZSB3aGVyZSBkaXJuYW1lIHN0cmlwcGluZyBpcyBsaWtlbHkgdG8gZ28gd3Jvbmc6ICJtb2Rwcm9iZSBkZXZuYW1lOnNuZC90aW1lciIKKyAqLworc3RhdGljIEFMV0FZU19JTkxJTkUgc3RydWN0IG1vZHVsZV9lbnRyeSAqZ2V0X21vZGVudHJ5KGNvbnN0IGNoYXIgKnBhdGhuYW1lKQoreworCXJldHVybiBoZWxwZXJfZ2V0X21vZHVsZShiYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9ub3N0cmlwKHBhdGhuYW1lKSwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9wcm9iZShjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBtb2R1bGVfZW50cnkgKm07CisKKwltID0gZ2V0X29yX2FkZF9tb2RlbnRyeShuYW1lKTsKKwlpZiAoIShvcHRpb25fbWFzazMyICYgKE9QVF9SRU1PVkUgfCBPUFRfU0hPV19ERVBTKSkKKwkgJiYgKG0tPmZsYWdzICYgTU9EVUxFX0ZMQUdfTE9BREVEKQorCSkgeworCQlEQkcoInNraXBwaW5nICVzLCBpdCBpcyBhbHJlYWR5IGxvYWRlZCIsIG5hbWUpOworCQlyZXR1cm47CisJfQorCisJREJHKCJxdWV1aW5nICVzIiwgbmFtZSk7CisJbS0+cHJvYmVkX25hbWUgPSBuYW1lOworCW0tPmZsYWdzIHw9IE1PRFVMRV9GTEFHX05FRURfREVQUzsKKwlsbGlzdF9hZGRfdG9fZW5kKCZHLnByb2JlcywgbSk7CisJRy5udW1fdW5yZXNvbHZlZF9kZXBzKys7CisJaWYgKEVOQUJMRV9GRUFUVVJFX01PRFVUSUxTX1NZTUJPTFMKKwkgJiYgaXNfcHJlZml4ZWRfd2l0aChtLT5tb2RuYW1lLCAic3ltYm9sOiIpCisJKSB7CisJCUcubmVlZF9zeW1ib2xzID0gMTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGNvbmZpZ19maWxlX2FjdGlvbihjb25zdCBjaGFyICpmaWxlbmFtZSwKKwkJCQkJc3RydWN0IHN0YXQgKnN0YXRidWYgVU5VU0VEX1BBUkFNLAorCQkJCQl2b2lkICp1c2VyZGF0YSBVTlVTRURfUEFSQU0sCisJCQkJCWludCBkZXB0aCBVTlVTRURfUEFSQU0pCit7CisJY2hhciAqdG9rZW5zWzNdOworCXBhcnNlcl90ICpwOworCXN0cnVjdCBtb2R1bGVfZW50cnkgKm07CisJaW50IHJjID0gVFJVRTsKKworCWlmIChiYl9iYXNlbmFtZShmaWxlbmFtZSlbMF0gPT0gJy4nKQorCQlnb3RvIGVycm9yOworCisJcCA9IGNvbmZpZ19vcGVuMihmaWxlbmFtZSwgZm9wZW5fZm9yX3JlYWQpOworCWlmIChwID09IE5VTEwpIHsKKwkJcmMgPSBGQUxTRTsKKwkJZ290byBlcnJvcjsKKwl9CisKKwl3aGlsZSAoY29uZmlnX3JlYWQocCwgdG9rZW5zLCAzLCAyLCAiIyBcdCIsIFBBUlNFX05PUk1BTCkpIHsKKy8vVXNlIGluZGV4X2luX3N0cmluZ3M/CisJCWlmIChzdHJjbXAodG9rZW5zWzBdLCAiYWxpYXMiKSA9PSAwKSB7CisJCQkvKiBhbGlhcyA8d2lsZGNhcmQ+IDxtb2R1bGVuYW1lPiAqLworCQkJbGxpc3RfdCAqbDsKKwkJCWNoYXIgd2lsZGNhcmRbTU9EVUxFX05BTUVfTEVOXTsKKwkJCWNoYXIgKnJtb2Q7CisKKwkJCWlmICh0b2tlbnNbMl0gPT0gTlVMTCkKKwkJCQljb250aW51ZTsKKwkJCWZpbGVuYW1lMm1vZG5hbWUodG9rZW5zWzFdLCB3aWxkY2FyZCk7CisKKwkJCWZvciAobCA9IEcucHJvYmVzOyBsOyBsID0gbC0+bGluaykgeworCQkJCW0gPSAoc3RydWN0IG1vZHVsZV9lbnRyeSAqKSBsLT5kYXRhOworCQkJCWlmIChmbm1hdGNoKHdpbGRjYXJkLCBtLT5tb2RuYW1lLCAwKSAhPSAwKQorCQkJCQljb250aW51ZTsKKwkJCQlybW9kID0gZmlsZW5hbWUybW9kbmFtZSh0b2tlbnNbMl0sIE5VTEwpOworCQkJCWxsaXN0X2FkZF90bygmbS0+cmVhbG5hbWVzLCBybW9kKTsKKworCQkJCWlmIChtLT5mbGFncyAmIE1PRFVMRV9GTEFHX05FRURfREVQUykgeworCQkJCQltLT5mbGFncyAmPSB+TU9EVUxFX0ZMQUdfTkVFRF9ERVBTOworCQkJCQlHLm51bV91bnJlc29sdmVkX2RlcHMtLTsKKwkJCQl9CisKKwkJCQltID0gZ2V0X29yX2FkZF9tb2RlbnRyeShybW9kKTsKKwkJCQlpZiAoIShtLT5mbGFncyAmIE1PRFVMRV9GTEFHX05FRURfREVQUykpIHsKKwkJCQkJbS0+ZmxhZ3MgfD0gTU9EVUxFX0ZMQUdfTkVFRF9ERVBTOworCQkJCQlHLm51bV91bnJlc29sdmVkX2RlcHMrKzsKKwkJCQl9CisJCQl9CisJCX0gZWxzZSBpZiAoc3RyY21wKHRva2Vuc1swXSwgIm9wdGlvbnMiKSA9PSAwKSB7CisJCQkvKiBvcHRpb25zIDxtb2R1bGVuYW1lPiA8b3B0aW9uLi4uPiAqLworCQkJaWYgKHRva2Vuc1syXSA9PSBOVUxMKQorCQkJCWNvbnRpbnVlOworCQkJbSA9IGdldF9vcl9hZGRfbW9kZW50cnkodG9rZW5zWzFdKTsKKwkJCW0tPm9wdGlvbnMgPSBnYXRoZXJfb3B0aW9uc19zdHIobS0+b3B0aW9ucywgdG9rZW5zWzJdKTsKKwkJfSBlbHNlIGlmIChzdHJjbXAodG9rZW5zWzBdLCAiaW5jbHVkZSIpID09IDApIHsKKwkJCS8qIGluY2x1ZGUgPGZpbGVuYW1lPiAqLworCQkJcmVhZF9jb25maWcodG9rZW5zWzFdKTsKKwkJfSBlbHNlIGlmIChFTkFCTEVfRkVBVFVSRV9NT0RQUk9CRV9CTEFDS0xJU1QKKwkJICYmIHN0cmNtcCh0b2tlbnNbMF0sICJibGFja2xpc3QiKSA9PSAwCisJCSkgeworCQkJLyogYmxhY2tsaXN0IDxtb2R1bGVuYW1lPiAqLworCQkJZ2V0X29yX2FkZF9tb2RlbnRyeSh0b2tlbnNbMV0pLT5mbGFncyB8PSBNT0RVTEVfRkxBR19CTEFDS0xJU1RFRDsKKwkJfQorCX0KKwljb25maWdfY2xvc2UocCk7CisgZXJyb3I6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHJlYWRfY29uZmlnKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJcmV0dXJuIHJlY3Vyc2l2ZV9hY3Rpb24ocGF0aCwgQUNUSU9OX1JFQ1VSU0UgfCBBQ1RJT05fUVVJRVQsCisJCQkJY29uZmlnX2ZpbGVfYWN0aW9uLCBOVUxMLCBOVUxMLCAxKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmh1bWFubHlfcmVhZGFibGVfbmFtZShzdHJ1Y3QgbW9kdWxlX2VudHJ5ICptKQoreworCS8qIHByb2JlZF9uYW1lIG1heSBiZSBOVUxMLiBtb2RuYW1lIGFsd2F5cyBleGlzdHMuICovCisJcmV0dXJuIG0tPnByb2JlZF9uYW1lID8gbS0+cHJvYmVkX25hbWUgOiBtLT5tb2RuYW1lOworfQorCisvKiBMaWtlIHN0cnNlcCgmc3RyaW5ncCwgIlxuXHQgIikgYnV0IHF1b3RlZCB0ZXh0IGdvZXMgdG8gc2luZ2xlIHRva2VuCisgKiBldmVuIGlmIGl0IGNvbnRhaW5zIHdoaXRlc3BhY2UuCisgKi8KK3N0YXRpYyBjaGFyICpzdHJzZXBfcXVvdGVzKGNoYXIgKipzdHJpbmdwKQoreworCWNoYXIgKnMsICpzdGFydCA9ICpzdHJpbmdwOworCisJaWYgKCFzdGFydCkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKHMgPSBzdGFydDsgOyBzKyspIHsKKwkJc3dpdGNoICgqcykgeworCQljYXNlICciJzoKKwkJCXMgPSBzdHJjaHJudWwocyArIDEsICciJyk7IC8qIGZpbmQgdHJhaWxpbmcgcXVvdGUgKi8KKwkJCWlmICgqcyAhPSAnXDAnKQorCQkJCXMrKzsgLyogc2tpcCB0cmFpbGluZyBxdW90ZSAqLworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWNhc2UgJ1wwJzoKKwkJY2FzZSAnXG4nOgorCQljYXNlICdcdCc6CisJCWNhc2UgJyAnOgorCQkJaWYgKCpzICE9ICdcMCcpIHsKKwkJCQkqcyA9ICdcMCc7CisJCQkJKnN0cmluZ3AgPSBzICsgMTsKKwkJCX0gZWxzZSB7CisJCQkJKnN0cmluZ3AgPSBOVUxMOworCQkJfQorCQkJcmV0dXJuIHN0YXJ0OworCQl9CisJfQorfQorCitzdGF0aWMgY2hhciAqcGFyc2VfYW5kX2FkZF9rY21kbGluZV9tb2R1bGVfb3B0aW9ucyhjaGFyICpvcHRpb25zLCBjb25zdCBjaGFyICptb2R1bGVuYW1lKQoreworCWNoYXIgKmtjbWRsaW5lX2J1ZjsKKwljaGFyICprY21kbGluZTsKKwljaGFyICprcHRyOworCisJa2NtZGxpbmVfYnVmID0geG1hbGxvY19vcGVuX3JlYWRfY2xvc2UoIi9wcm9jL2NtZGxpbmUiLCBOVUxMKTsKKwlpZiAoIWtjbWRsaW5lX2J1ZikKKwkJcmV0dXJuIG9wdGlvbnM7CisKKwlrY21kbGluZSA9IGtjbWRsaW5lX2J1ZjsKKwl3aGlsZSAoKGtwdHIgPSBzdHJzZXBfcXVvdGVzKCZrY21kbGluZSkpICE9IE5VTEwpIHsKKwkJY2hhciAqYWZ0ZXJfbW9kdWxlbmFtZSA9IGlzX3ByZWZpeGVkX3dpdGgoa3B0ciwgbW9kdWxlbmFtZSk7CisJCWlmICghYWZ0ZXJfbW9kdWxlbmFtZSB8fCAqYWZ0ZXJfbW9kdWxlbmFtZSAhPSAnLicpCisJCQljb250aW51ZTsKKwkJLyogSXQgaXMgIm1vZHVsZW5hbWUueHh4eCIgKi8KKwkJa3B0ciA9IGFmdGVyX21vZHVsZW5hbWUgKyAxOworCQlpZiAoc3RyY2hyKGtwdHIsICc9JykgIT0gTlVMTCkgeworCQkJLyogSXQgaXMgIm1vZHVsZW5hbWUub3B0PVt2YWxdIiAqLworCQkJb3B0aW9ucyA9IGdhdGhlcl9vcHRpb25zX3N0cihvcHRpb25zLCBrcHRyKTsKKwkJfQorCX0KKwlmcmVlKGtjbWRsaW5lX2J1Zik7CisKKwlyZXR1cm4gb3B0aW9uczsKK30KKworLyogUmV0dXJuOiBzaW1pbGFyIHRvIGJiX2luaXRfbW9kdWxlOgorICogMCBvbiBzdWNjZXNzLAorICogLWVycm5vIG9uIG9wZW4vcmVhZCBlcnJvciwKKyAqIGVycm5vIG9uIGluaXRfbW9kdWxlKCkgZXJyb3IKKyAqLworLyogTkI6IElOU01PRF9PUFRfU0lMRU5UIGJpdCBzdXBwcmVzc2VzIE9OTFkgbm9uLWV4aXN0ZW50IG1vZHVsZXMsCisgKiBub3QgZGVsZXRlZCBvbmVzICh0aG9zZSBhcmUgc3RpbGwgbGlzdGVkIGluIG1vZHVsZXMuZGVwKS4KKyAqIG1vZHVsZS1pbml0LXRvb2xzIHZlcnNpb24gMy40OgorICogIyBtb2Rwcm9iZSBib2d1cworICogRkFUQUw6IE1vZHVsZSBib2d1cyBub3QgZm91bmQuIFtleGl0Y29kZSAxXQorICogIyBtb2Rwcm9iZSAtcSBib2d1cyAgICAgICAgICAgIFtzaWxlbnQsIGV4aXRjb2RlIHN0aWxsIDFdCisgKiBidXQ6CisgKiAjIHJtIGtlcm5lbC9kcml2ZXJzL25ldC9kdW1teS5rbworICogIyBtb2Rwcm9iZSAtcSBkdW1teQorICogRkFUQUw6IENvdWxkIG5vdCBvcGVuICcvbGliL21vZHVsZXMveHh4L2tlcm5lbC9kcml2ZXJzL25ldC9kdW1teS5rbyc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKyAqIFtleGl0Y29kZSAxXQorICovCitzdGF0aWMgaW50IGRvX21vZHByb2JlKHN0cnVjdCBtb2R1bGVfZW50cnkgKm0pCit7CisJaW50IHJjLCBmaXJzdDsKKworCWlmICghKG0tPmZsYWdzICYgTU9EVUxFX0ZMQUdfRk9VTkRfSU5fTU9EREVQKSkgeworCQlpZiAoIShvcHRpb25fbWFzazMyICYgSU5TTU9EX09QVF9TSUxFTlQpKQorCQkJYmJfZXJyb3JfbXNnKCJtb2R1bGUgJXMgbm90IGZvdW5kIGluIG1vZHVsZXMuZGVwIiwKKwkJCQlodW1hbmx5X3JlYWRhYmxlX25hbWUobSkpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisJREJHKCJkb19tb2Rwcm9iJ2luZyAlcyIsIG0tPm1vZG5hbWUpOworCisJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9SRU1PVkUpKQorCQltLT5kZXBzID0gbGxpc3RfcmV2KG0tPmRlcHMpOworCisJaWYgKDApIHsKKwkJbGxpc3RfdCAqbDsKKwkJZm9yIChsID0gbS0+ZGVwczsgbDsgbCA9IGwtPmxpbmspCisJCQlEQkcoImRlcDogJXMiLCBsLT5kYXRhKTsKKwl9CisKKwlmaXJzdCA9IDE7CisJcmMgPSAwOworCXdoaWxlIChtLT5kZXBzKSB7CisJCXN0cnVjdCBtb2R1bGVfZW50cnkgKm0yOworCQljaGFyICpmbiwgKm9wdGlvbnM7CisKKwkJcmMgPSAwOworCQlmbiA9IGxsaXN0X3BvcCgmbS0+ZGVwcyk7IC8qIHdlIGxlYWsgaXQgKi8KKwkJbTIgPSBnZXRfb3JfYWRkX21vZGVudHJ5KGJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50X25vc3RyaXAoZm4pKTsKKworCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9SRU1PVkUpIHsKKwkJCS8qIG1vZHByb2JlIC1yICovCisJCQlpZiAobTItPmZsYWdzICYgTU9EVUxFX0ZMQUdfTE9BREVEKSB7CisJCQkJcmMgPSBiYl9kZWxldGVfbW9kdWxlKG0yLT5tb2RuYW1lLCBPX0VYQ0wpOworCQkJCWlmIChyYykgeworCQkJCQlpZiAoZmlyc3QpIHsKKwkJCQkJCWJiX2Vycm9yX21zZygiY2FuJ3QgdW5sb2FkIG1vZHVsZSAlczogJXMiLAorCQkJCQkJCWh1bWFubHlfcmVhZGFibGVfbmFtZShtMiksCisJCQkJCQkJbW9kZXJyb3IocmMpKTsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJbTItPmZsYWdzICY9IH5NT0RVTEVfRkxBR19MT0FERUQ7CisJCQkJfQorCQkJfQorCQkJLyogZG8gbm90IGVycm9yIG91dCBpZiAqZGVwcyogZmFpbCB0byB1bmxvYWQgKi8KKwkJCWZpcnN0ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJb3B0aW9ucyA9IG0yLT5vcHRpb25zOworCQltMi0+b3B0aW9ucyA9IE5VTEw7CisJCW9wdGlvbnMgPSBwYXJzZV9hbmRfYWRkX2tjbWRsaW5lX21vZHVsZV9vcHRpb25zKG9wdGlvbnMsIG0yLT5tb2RuYW1lKTsKKwkJaWYgKG0gPT0gbTIpCisJCQlvcHRpb25zID0gZ2F0aGVyX29wdGlvbnNfc3RyKG9wdGlvbnMsIEcuY21kbGluZV9tb3B0cyk7CisKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfU0hPV19ERVBTKSB7CisJCQlwcmludGYob3B0aW9ucyA/ICJpbnNtb2QgJXMvJXMvJXMgJXNcbiIKKwkJCQkJOiAiaW5zbW9kICVzLyVzLyVzXG4iLAorCQkJCUNPTkZJR19ERUZBVUxUX01PRFVMRVNfRElSLCBHLnV0cy5yZWxlYXNlLCBmbiwKKwkJCQlvcHRpb25zKTsKKwkJCWZyZWUob3B0aW9ucyk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChtMi0+ZmxhZ3MgJiBNT0RVTEVfRkxBR19MT0FERUQpIHsKKwkJCURCRygiJXMgaXMgYWxyZWFkeSBsb2FkZWQsIHNraXBwaW5nIiwgZm4pOworCQkJZnJlZShvcHRpb25zKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcmMgPSBiYl9pbml0X21vZHVsZShmbiwgb3B0aW9ucyk7CisJCURCRygibG9hZGVkICVzICclcycsIHJjOiVkIiwgZm4sIG9wdGlvbnMsIHJjKTsKKwkJaWYgKHJjID09IEVFWElTVCkKKwkJCXJjID0gMDsKKwkJZnJlZShvcHRpb25zKTsKKwkJaWYgKHJjKSB7CisJCQliYl9lcnJvcl9tc2coImNhbid0IGxvYWQgbW9kdWxlICVzICglcyk6ICVzIiwKKwkJCQlodW1hbmx5X3JlYWRhYmxlX25hbWUobTIpLAorCQkJCWZuLAorCQkJCW1vZGVycm9yKHJjKQorCQkJKTsKKwkJCWJyZWFrOworCQl9CisJCW0yLT5mbGFncyB8PSBNT0RVTEVfRkxBR19MT0FERUQ7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdm9pZCBsb2FkX21vZHVsZXNfZGVwKHZvaWQpCit7CisJc3RydWN0IG1vZHVsZV9lbnRyeSAqbTsKKwljaGFyICpjb2xvbiwgKnRva2Vuc1syXTsKKwlwYXJzZXJfdCAqcDsKKworCS8qIE1vZHByb2JlIGRvZXMgbm90IHdvcmsgYXQgYWxsIHdpdGhvdXQgbW9kdWxlcy5kZXAsCisJICogZXZlbiBpZiB0aGUgZnVsbCBtb2R1bGUgbmFtZSBpcyBnaXZlbi4gUmV0dXJuaW5nIGVycm9yIGhlcmUKKwkgKiB3YXMgbWFraW5nIHVzIGxhdGVyIGNvbmZ1c2UgdXNlciB3aXRoIHRoaXMgbWVzc2FnZToKKwkgKiAibW9kdWxlIC9mdWxsL3BhdGgvdG8vZXhpc3RpbmcvZmlsZS9tb2R1bGUua28gbm90IGZvdW5kIi4KKwkgKiBJdCdzIGJldHRlciB0byBkaWUgaW1tZWRpYXRlbHksIHdpdGggZ29vZCBtZXNzYWdlLgorCSAqIHhmb3Blbl9mb3JfcmVhZCBwcm92aWRlcyB0aGF0LiAqLworCXAgPSBjb25maWdfb3BlbjIoQ09ORklHX0RFRkFVTFRfREVQTU9EX0ZJTEUsIHhmb3Blbl9mb3JfcmVhZCk7CisKKwl3aGlsZSAoRy5udW1fdW5yZXNvbHZlZF9kZXBzCisJICYmIGNvbmZpZ19yZWFkKHAsIHRva2VucywgMiwgMSwgIiMgXHQiLCBQQVJTRV9OT1JNQUwpCisJKSB7CisJCWNvbG9uID0gbGFzdF9jaGFyX2lzKHRva2Vuc1swXSwgJzonKTsKKwkJaWYgKGNvbG9uID09IE5VTEwpCisJCQljb250aW51ZTsKKwkJKmNvbG9uID0gJ1wwJzsKKworCQltID0gZ2V0X21vZGVudHJ5KHRva2Vuc1swXSk7CisJCWlmIChtID09IE5VTEwpCisJCQljb250aW51ZTsKKworCQkvKiBPcHRpbWl6YXRpb24uLi4gKi8KKwkJaWYgKChtLT5mbGFncyAmIE1PRFVMRV9GTEFHX0xPQURFRCkKKwkJICYmICEob3B0aW9uX21hc2szMiAmIChPUFRfUkVNT1ZFIHwgT1BUX1NIT1dfREVQUykpCisJCSkgeworCQkJREJHKCJza2lwIGRlcHMgb2YgJXMsIGl0J3MgYWxyZWFkeSBsb2FkZWQiLCB0b2tlbnNbMF0pOworCQkJY29udGludWU7CisJCX0KKworCQltLT5mbGFncyB8PSBNT0RVTEVfRkxBR19GT1VORF9JTl9NT0RERVA7CisJCWlmICgobS0+ZmxhZ3MgJiBNT0RVTEVfRkxBR19ORUVEX0RFUFMpICYmIChtLT5kZXBzID09IE5VTEwpKSB7CisJCQlHLm51bV91bnJlc29sdmVkX2RlcHMtLTsKKwkJCWxsaXN0X2FkZF90bygmbS0+ZGVwcywgeHN0cmR1cCh0b2tlbnNbMF0pKTsKKwkJCWlmICh0b2tlbnNbMV0pCisJCQkJc3RyaW5nX3RvX2xsaXN0KHRva2Vuc1sxXSwgJm0tPmRlcHMsICIgXHQiKTsKKwkJfSBlbHNlCisJCQlEQkcoInNraXBwaW5nIGRlcCBsaW5lIik7CisJfQorCWNvbmZpZ19jbG9zZShwKTsKK30KKworaW50IG1vZHByb2JlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBtb2Rwcm9iZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHJjOworCXVuc2lnbmVkIG9wdDsKKwlzdHJ1Y3QgbW9kdWxlX2VudHJ5ICptZTsKKworCUlOSVRfRygpOworCisJSUZfTE9OR19PUFRTKGFwcGxldF9sb25nX29wdGlvbnMgPSBtb2Rwcm9iZV9sb25nb3B0czspCisJb3B0X2NvbXBsZW1lbnRhcnkgPSBNT0RQUk9CRV9DT01QTEVNRU5UQVJZOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsIElOU01PRF9PUFRTIE1PRFBST0JFX09QVFMgSU5TTU9EX0FSR1MpOworCWFyZ3YgKz0gb3B0aW5kOworCisJLyogR290byBtb2R1bGVzIGxvY2F0aW9uICovCisJeGNoZGlyKENPTkZJR19ERUZBVUxUX01PRFVMRVNfRElSKTsKKwl1bmFtZSgmRy51dHMpOworCXhjaGRpcihHLnV0cy5yZWxlYXNlKTsKKworCWlmIChvcHQgJiBPUFRfTElTVF9PTkxZKSB7CisJCWludCBpOworCQljaGFyICpjb2xvbiwgKnRva2Vuc1syXTsKKwkJcGFyc2VyX3QgKnAgPSBjb25maWdfb3BlbjIoQ09ORklHX0RFRkFVTFRfREVQTU9EX0ZJTEUsIHhmb3Blbl9mb3JfcmVhZCk7CisKKwkJZm9yIChpID0gMDsgYXJndltpXTsgaSsrKQorCQkJcmVwbGFjZShhcmd2W2ldLCAnLScsICdfJyk7CisKKwkJd2hpbGUgKGNvbmZpZ19yZWFkKHAsIHRva2VucywgMiwgMSwgIiMgXHQiLCBQQVJTRV9OT1JNQUwpKSB7CisJCQljb2xvbiA9IGxhc3RfY2hhcl9pcyh0b2tlbnNbMF0sICc6Jyk7CisJCQlpZiAoIWNvbG9uKQorCQkJCWNvbnRpbnVlOworCQkJKmNvbG9uID0gJ1wwJzsKKwkJCWlmICghYXJndlswXSkKKwkJCQlwdXRzKHRva2Vuc1swXSk7CisJCQllbHNlIHsKKwkJCQljaGFyIG5hbWVbTU9EVUxFX05BTUVfTEVOXTsKKwkJCQlmaWxlbmFtZTJtb2RuYW1lKAorCQkJCQliYl9nZXRfbGFzdF9wYXRoX2NvbXBvbmVudF9ub3N0cmlwKHRva2Vuc1swXSksCisJCQkJCW5hbWUKKwkJCQkpOworCQkJCWZvciAoaSA9IDA7IGFyZ3ZbaV07IGkrKykgeworCQkJCQlpZiAoZm5tYXRjaChhcmd2W2ldLCBuYW1lLCAwKSA9PSAwKSB7CisJCQkJCQlwdXRzKHRva2Vuc1swXSk7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwkvKiBZZXMsIGZvciBzb21lIHJlYXNvbiAtbCBpZ25vcmVzIC1zLi4uICovCisJaWYgKG9wdCAmIElOU01PRF9PUFRfU1lTTE9HKQorCQlsb2dtb2RlID0gTE9HTU9ERV9TWVNMT0c7CisKKwlpZiAoIWFyZ3ZbMF0pIHsKKwkJaWYgKG9wdCAmIE9QVF9SRU1PVkUpIHsKKwkJCS8qICJtb2Rwcm9iZSAtciIgKHcvbyBwYXJhbXMpLgorCQkJICogIklmIG5hbWUgaXMgTlVMTCwgYWxsIHVudXNlZCBtb2R1bGVzIG1hcmtlZAorCQkJICogYXV0b2NsZWFuIHdpbGwgYmUgcmVtb3ZlZCIuCisJCQkgKi8KKwkJCWlmIChiYl9kZWxldGVfbW9kdWxlKE5VTEwsIE9fTk9OQkxPQ0sgfCBPX0VYQ0wpICE9IDApCisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJybW1vZCIpOworCQl9CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJLyogUmV0cmlldmUgbW9kdWxlIG5hbWVzIG9mIGFscmVhZHkgbG9hZGVkIG1vZHVsZXMgKi8KKwl7CisJCWNoYXIgKnM7CisJCXBhcnNlcl90ICpwYXJzZXIgPSBjb25maWdfb3BlbjIoIi9wcm9jL21vZHVsZXMiLCBmb3Blbl9mb3JfcmVhZCk7CisJCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsICZzLCAxLCAxLCAiIyBcdCIsIFBBUlNFX05PUk1BTCAmIH5QQVJTRV9HUkVFRFkpKQorCQkJZ2V0X29yX2FkZF9tb2RlbnRyeShzKS0+ZmxhZ3MgfD0gTU9EVUxFX0ZMQUdfTE9BREVEOworCQljb25maWdfY2xvc2UocGFyc2VyKTsKKwl9CisKKwlpZiAob3B0ICYgKE9QVF9JTlNFUlRfQUxMIHwgT1BUX1JFTU9WRSkpIHsKKwkJLyogRWFjaCBhcmd1bWVudCBpcyBhIG1vZHVsZSBuYW1lICovCisJCWRvIHsKKwkJCURCRygiYWRkaW5nIG1vZHVsZSAlcyIsICphcmd2KTsKKwkJCWFkZF9wcm9iZSgqYXJndisrKTsKKwkJfSB3aGlsZSAoKmFyZ3YpOworCX0gZWxzZSB7CisJCS8qIEZpcnN0IGFyZ3VtZW50IGlzIG1vZHVsZSBuYW1lLCByZXN0IGFyZSBwYXJhbWV0ZXJzICovCisJCURCRygicHJvYmluZyBqdXN0IG1vZHVsZSAlcyIsICphcmd2KTsKKwkJYWRkX3Byb2JlKGFyZ3ZbMF0pOworCQlHLmNtZGxpbmVfbW9wdHMgPSBwYXJzZV9jbWRsaW5lX21vZHVsZV9vcHRpb25zKGFyZ3YsIC8qcXVvdGVfc3BhY2VzOiovIDEpOworCX0KKworCS8qIEhhcHBlbnMgaWYgYWxsIHJlcXVlc3RlZCBtb2R1bGVzIGFyZSBhbHJlYWR5IGxvYWRlZCAqLworCWlmIChHLnByb2JlcyA9PSBOVUxMKQorCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCisJcmVhZF9jb25maWcoIi9ldGMvbW9kcHJvYmUuY29uZiIpOworCXJlYWRfY29uZmlnKCIvZXRjL21vZHByb2JlLmQiKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfTU9EVVRJTFNfU1lNQk9MUyAmJiBHLm5lZWRfc3ltYm9scykKKwkJcmVhZF9jb25maWcoIm1vZHVsZXMuc3ltYm9scyIpOworCWxvYWRfbW9kdWxlc19kZXAoKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfTU9EVVRJTFNfQUxJQVMgJiYgRy5udW1fdW5yZXNvbHZlZF9kZXBzKSB7CisJCXJlYWRfY29uZmlnKCJtb2R1bGVzLmFsaWFzIik7CisJCWxvYWRfbW9kdWxlc19kZXAoKTsKKwl9CisKKwlyYyA9IDA7CisJd2hpbGUgKChtZSA9IGxsaXN0X3BvcCgmRy5wcm9iZXMpKSAhPSBOVUxMKSB7CisJCWlmIChtZS0+cmVhbG5hbWVzID09IE5VTEwpIHsKKwkJCURCRygicHJvYmluZyBieSBtb2R1bGUgbmFtZSIpOworCQkJLyogVGhpcyBpcyBub3QgYW4gYWxpYXMuIExpdGVyYWwgbmFtZXMgYXJlIGJsYWNrbGlzdGVkCisJCQkgKiBvbmx5IGlmICctYicgaXMgZ2l2ZW4uCisJCQkgKi8KKwkJCWlmICghKG9wdCAmIE9QVF9CTEFDS0xJU1QpCisJCQkgfHwgIShtZS0+ZmxhZ3MgJiBNT0RVTEVfRkxBR19CTEFDS0xJU1RFRCkKKwkJCSkgeworCQkJCXJjIHw9IGRvX21vZHByb2JlKG1lKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogUHJvYmUgYWxsIHJlYWwgbmFtZXMgZm9yIHRoZSBhbGlhcyAqLworCQlkbyB7CisJCQljaGFyICpyZWFsbmFtZSA9IGxsaXN0X3BvcCgmbWUtPnJlYWxuYW1lcyk7CisJCQlzdHJ1Y3QgbW9kdWxlX2VudHJ5ICptMjsKKworCQkJREJHKCJwcm9iaW5nIGFsaWFzICVzIGJ5IHJlYWxuYW1lICVzIiwgbWUtPm1vZG5hbWUsIHJlYWxuYW1lKTsKKwkJCW0yID0gZ2V0X29yX2FkZF9tb2RlbnRyeShyZWFsbmFtZSk7CisJCQlpZiAoIShtMi0+ZmxhZ3MgJiBNT0RVTEVfRkxBR19CTEFDS0xJU1RFRCkKKwkJCSAmJiAoIShtMi0+ZmxhZ3MgJiBNT0RVTEVfRkxBR19MT0FERUQpCisJCQkgICAgfHwgKG9wdCAmIChPUFRfUkVNT1ZFIHwgT1BUX1NIT1dfREVQUykpKQorCQkJKSB7CisvL1RPRE86IHdlIGNhbiBwYXNzICJtZSIgYXMgMm5kIHBhcmFtIHRvIGRvX21vZHByb2JlLAorLy9hbmQgbWFrZSBkb19tb2Rwcm9iZSBlbWl0IG1vcmUgbWVhbmluZ2Z1bCBlcnJvciBtZXNzYWdlcworLy93aXRoIGFsaWFzIG5hbWUgaW5jbHVkZWQsIG5vdCBqdXN0IG1vZHVsZSBuYW1lIGFsaWFzIHJlc29sdmVzIHRvLgorCQkJCXJjIHw9IGRvX21vZHByb2JlKG0yKTsKKwkJCX0KKwkJCWZyZWUocmVhbG5hbWUpOworCQl9IHdoaWxlIChtZS0+cmVhbG5hbWVzICE9IE5VTEwpOworCX0KKworCXJldHVybiAocmMgIT0gMCk7Cit9CmRpZmYgLS1naXQgYS9tb2R1dGlscy9tb2R1dGlscy0yNC5jIGIvbW9kdXRpbHMvbW9kdXRpbHMtMjQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTQ2ZmMzCi0tLSAvZGV2L251bGwKKysrIGIvbW9kdXRpbHMvbW9kdXRpbHMtMjQuYwpAQCAtMCwwICsxLDM5NDggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgaW5zbW9kIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogVGhpcyB2ZXJzaW9uIG9mIGluc21vZCBzdXBwb3J0cyBBUk0sIENSSVMsIEg4LzMwMCwgeDg2LCBpYTY0LCB4ODZfNjQsCisgKiBtNjhrLCBNSVBTLCBQb3dlclBDLCBTMzkwLCBTSDMvNC81LCBTcGFyYywgdjg1MGUsIGFuZCB4ODZfNjQuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogYW5kIFJvbiBBbGRlciA8YWxkZXJAbGluZW8uY29tPgorICoKKyAqIFJvZG5leSBSYWRmb3JkIDxycmFkZm9yZEBtaW5kc3ByaW5nLmNvbT4gMTctQXVnLTIwMDQuCisgKiAgIEFkZGVkIHg4Nl82NCBzdXBwb3J0LgorICoKKyAqIE1pbGVzIEJhZGVyIDxtaWxlc0BnbnUub3JnPiBhZGRlZCBORUMgVjg1MEUgc3VwcG9ydC4KKyAqCisgKiBNb2RpZmllZCBieSBCcnlhbiBSaXR0bWV5ZXIgPGJyeWFuQGl4aWFjb20uY29tPiB0byBzdXBwb3J0IFNINAorICogYW5kICh0aGVvcmV0aWNhbGx5KSBTSDMuIEkgaGF2ZSBvbmx5IHRlc3RlZCBTSDQgaW4gbGl0dGxlIGVuZGlhbiBtb2RlLgorICoKKyAqIE1vZGlmaWVkIGJ5IEFsY292ZSwgSnVsaWVuIEdhdWxtaW4gPGp1bGllbi5nYXVsbWluQGFsY292ZS5mcj4gYW5kCisgKiBOaWNvbGFzIEZlcnJlIDxuaWNvbGFzLmZlcnJlQGFsY292ZS5mcj4gdG8gc3VwcG9ydCBBUk03VERNSS4gIE9ubHkKKyAqIHZlcnkgbWlub3IgY2hhbmdlcyByZXF1aXJlZCB0byBhbHNvIHdvcmsgd2l0aCBTdHJvbmdBcm0gYW5kIHByZXN1bWFibHkKKyAqIGFsbCBBUk0gYmFzZWQgc3lzdGVtcy4KKyAqCisgKiBZb3NoaW5vcmkgU2F0byA8eXNhdG9AdXNlcnMuc291cmNlZm9yZ2UuanA+IDE5LU1heS0yMDA0LgorICogICBhZGRlZCBSZW5lc2FzIEg4LzMwMCBzdXBwb3J0LgorICoKKyAqIFBhdWwgTXVuZHQgPGxldGhhbEBsaW51eC1zaC5vcmc+IDA4LUF1Zy0yMDAzLgorICogICBJbnRlZ3JhdGVkIHN1cHBvcnQgZm9yIHNoNjQgKFNILTUpLCBmcm9tIHByZWxpbWluYXJ5IG1vZHV0aWxzCisgKiAgIHBhdGNoZXMgZnJvbSBCZW5lZGljdCBHYXN0ZXIgPGJlbmVkaWN0Lmdhc3RlckBzdXBlcmguY29tPi4KKyAqICAgQ3VycmVudGx5IGxpbWl0ZWQgdG8gc3VwcG9ydCBmb3IgMzJiaXQgQUJJLgorICoKKyAqIE1hZ251cyBEYW1tIDxkYW1tQG9wZW5zb3VyY2Uuc2U+IDIyLU1heS0yMDAyLgorICogICBUaGUgcGx0IGFuZCBnb3QgY29kZSBhcmUgbm93IHVzaW5nIHRoZSBzYW1lIHN0cnVjdHMuCisgKiAgIEFkZGVkIGdlbmVyaWMgbGlua2VkIGxpc3QgY29kZSB0byBmdWxseSBzdXBwb3J0IFBvd2VyUEMuCisgKiAgIFJlcGxhY2VkIHRoZSBtZXNzIGluIGFyY2hfYXBwbHlfcmVsb2NhdGlvbigpIHdpdGggYXJjaGl0ZWN0dXJlIGJsb2Nrcy4KKyAqICAgVGhlIGFyY2hfY3JlYXRlX2dvdCgpIGZ1bmN0aW9uIGdvdCBjbGVhbmVkIHVwIHdpdGggYXJjaGl0ZWN0dXJlIGJsb2Nrcy4KKyAqICAgVGhlc2UgYmxvY2tzIHNob3VsZCBiZSBlYXN5IG1haW50YWluIGFuZCBzeW5jIHdpdGggb2JqX3h4eC5jIGluIG1vZHV0aWxzLgorICoKKyAqIE1hZ251cyBEYW1tIDxkYW1tQG9wZW5zb3VyY2Uuc2U+IGFkZGVkIFBvd2VyUEMgc3VwcG9ydCAyMC1GZWItMjAwMS4KKyAqICAgUG93ZXJQQyBzcGVjaWZpYyBjb2RlIHN0b2xlbiBmcm9tIG1vZHV0aWxzLTIuMy4xNiwKKyAqICAgd3JpdHRlbiBieSBQYXVsIE1hY2tlcnJhcywgQ29weXJpZ2h0IDE5OTYsIDE5OTcgTGludXggSW50ZXJuYXRpb25hbC4KKyAqICAgSSd2ZSBvbmx5IHRlc3RlZCB0aGUgY29kZSBvbiBtcGM4eHggcGxhdGZvcm1zIGluIGJpZy1lbmRpYW4gbW9kZS4KKyAqICAgRGlkIHNvbWUgY2xlYW51cCBhbmQgYWRkZWQgVVNFX3h4eF9FTlRSSUVTLi4uCisgKgorICogUXVpbm4gSmVuc2VuIDxqZW5zZW5xQGxpbmVvLmNvbT4gYWRkZWQgTUlQUyBzdXBwb3J0IDIzLUZlYi0yMDAxLgorICogICBiYXNlZCBvbiBtb2R1dGlscy0yLjQuMgorICogICBNSVBTIHNwZWNpZmljIHN1cHBvcnQgZm9yIEVsZiBsb2FkaW5nIGFuZCByZWxvY2F0aW9uLgorICogICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBMaW51eCBJbnRlcm5hdGlvbmFsLgorICogICBDb250cmlidXRlZCBieSBSYWxmIEJhZWNobGUgPHJhbGZAZ251LmFpLm1pdC5lZHU+CisgKgorICogQmFzZWQgYWxtb3N0IGVudGlyZWx5IG9uIHRoZSBMaW51eCBtb2R1dGlscy0yLjMuMTEgaW1wbGVtZW50YXRpb24uCisgKiAgIENvcHlyaWdodCAxOTk2LCAxOTk3IExpbnV4IEludGVybmF0aW9uYWwuCisgKiAgIE5ldyBpbXBsZW1lbnRhdGlvbiBjb250cmlidXRlZCBieSBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQHRhbXUuZWR1PgorICogICBCYXNlZCBvbiBvcmlnaW5hbCB3b3JrIGJ5IEJqb3JuIEVrd2FsbCA8Ymowcm5AYmxveC5zZT4KKyAqICAgUmVzdHJ1Y3R1cmVkIChhbmQgcGFydGx5IHJld3JpdHRlbikgYnk6CisgKiAgIEJq9nJuIEVrd2FsbCA8Ymowcm5AYmxveC5zZT4gRmVicnVhcnkgMTk5OQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibW9kdXRpbHMuaCIKKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5TTU9EX0xPQURJTktNRU0KKyNkZWZpbmUgTE9BREJJVFMgMAorI2Vsc2UKKyNkZWZpbmUgTE9BREJJVFMgMQorI2VuZGlmCisKKy8qIEFscGhhICovCisjaWYgZGVmaW5lZChfX2FscGhhX18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fQUxQSEEpCisjZGVmaW5lIFNIVF9SRUxNICAgICAgIFNIVF9SRUxBCisjZGVmaW5lIEVsZjY0X1JlbE0gICAgIEVsZjY0X1JlbGEKKyNkZWZpbmUgRUxGQ0xBU1NNICAgICAgRUxGQ0xBU1M2NAorI2VuZGlmCisKKy8qIEFSTSBzdXBwb3J0ICovCisjaWYgZGVmaW5lZChfX2FybV9fKQorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX0FSTSkKKyNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTAorI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbAorI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1MzMgorI2RlZmluZSBVU0VfUExUX0VOVFJJRVMKKyNkZWZpbmUgUExUX0VOVFJZX1NJWkUgOAorI2RlZmluZSBVU0VfR09UX0VOVFJJRVMKKyNkZWZpbmUgR09UX0VOVFJZX1NJWkUgOAorI2RlZmluZSBVU0VfU0lOR0xFCisjZW5kaWYKKworLyogTkRTMzIgc3VwcG9ydCAqLworI2lmIGRlZmluZWQoX19uZHMzMl9fKSB8fCBkZWZpbmVkKF9fTkRTMzJfXykKKyNkZWZpbmUgQ09ORklHX1VTRV9HT1RfRU5UUklFUworI2RlZmluZSBDT05GSUdfR09UX0VOVFJZX1NJWkUgNAorI2RlZmluZSBDT05GSUdfVVNFX1NJTkdMRQorCisjaWYgZGVmaW5lZChfX05EUzMyX0VCX18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fTkRTMzIpCisjZGVmaW5lIFNIVF9SRUxNICAgIFNIVF9SRUxBCisjZGVmaW5lIEVsZjMyX1JlbE0gIEVsZjMyX1JlbGEKKyNkZWZpbmUgRUxGQ0xBU1NNICAgRUxGQ0xBU1MzMgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fTkRTMzJfRUxfXykKKyNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9ORFMzMikKKyNkZWZpbmUgU0hUX1JFTE0gICAgU0hUX1JFTEEKKyNkZWZpbmUgRWxmMzJfUmVsTSAgRWxmMzJfUmVsYQorI2RlZmluZSBFTEZDTEFTU00gICBFTEZDTEFTUzMyCisjZW5kaWYKKyNlbmRpZgorCisvKiBibGFja2ZpbiAqLworI2lmIGRlZmluZWQoQkZJTikKKyNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9CTEFDS0ZJTikKKyNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKKyNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCisjZW5kaWYKKworLyogQ1JJUyAqLworI2lmIGRlZmluZWQoX19jcmlzX18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fQ1JJUykKKyNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKKyNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCisjaWZuZGVmIEVNX0NSSVMKKyNkZWZpbmUgRU1fQ1JJUyA3NgorI2RlZmluZSBSX0NSSVNfTk9ORSAwCisjZGVmaW5lIFJfQ1JJU18zMiAgIDMKKyNlbmRpZgorI2VuZGlmCisKKy8qIEg4LzMwMCAqLworI2lmIGRlZmluZWQoX19IODMwMEhfXykgfHwgZGVmaW5lZChfX0g4MzAwU19fKQorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX0g4XzMwMCkKKyNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKKyNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCisjZGVmaW5lIFVTRV9TSU5HTEUKKyNkZWZpbmUgU1lNQk9MX1BSRUZJWAkiXyIKKyNlbmRpZgorCisvKiBQQS1SSVNDIC8gSFAtUEEgKi8KKyNpZiBkZWZpbmVkKF9faHBwYV9fKQorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX1BBUklTQykKKyNkZWZpbmUgU0hUX1JFTE0gICAgICAgU0hUX1JFTEEKKyNpZiBkZWZpbmVkKF9fTFA2NF9fKQorI2RlZmluZSBFbGY2NF9SZWxNICAgICBFbGY2NF9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTSAgICAgIEVMRkNMQVNTNjQKKyNlbHNlCisjZGVmaW5lIEVsZjMyX1JlbE0gICAgIEVsZjMyX1JlbGEKKyNkZWZpbmUgRUxGQ0xBU1NNICAgICAgRUxGQ0xBU1MzMgorI2VuZGlmCisjZW5kaWYKKworLyogeDg2ICovCisjaWYgZGVmaW5lZChfX2kzODZfXykKKyNpZm5kZWYgRU1fNDg2CisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fMzg2KQorI2Vsc2UKKyNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV8zODYgfHwgeCA9PSBFTV80ODYpCisjZW5kaWYKKyNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTAorI2RlZmluZSBFbGYzMl9SZWxNCUVsZjMyX1JlbAorI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1MzMgorI2RlZmluZSBVU0VfR09UX0VOVFJJRVMKKyNkZWZpbmUgR09UX0VOVFJZX1NJWkUgNAorI2RlZmluZSBVU0VfU0lOR0xFCisjZW5kaWYKKworLyogSUE2NCwgYWthIEl0YW5pdW0gKi8KKyNpZiBkZWZpbmVkKF9faWE2NF9fKQorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX0lBXzY0KQorI2RlZmluZSBTSFRfUkVMTSAgICAgICBTSFRfUkVMQQorI2RlZmluZSBFbGY2NF9SZWxNICAgICBFbGY2NF9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTSAgICAgIEVMRkNMQVNTNjQKKyNlbmRpZgorCisvKiBtNjhrICovCisjaWYgZGVmaW5lZChfX21jNjgwMDBfXykKKyNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV82OEspCisjZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUxBCisjZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsYQorI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1MzMgorI2RlZmluZSBVU0VfR09UX0VOVFJJRVMKKyNkZWZpbmUgR09UX0VOVFJZX1NJWkUgNAorI2RlZmluZSBVU0VfU0lOR0xFCisjZW5kaWYKKworLyogTWljcm9ibGF6ZSAqLworI2lmIGRlZmluZWQoX19taWNyb2JsYXplX18pCisjZGVmaW5lIFVTRV9TSU5HTEUKKyNpbmNsdWRlIDxsaW51eC9lbGYtZW0uaD4KKyNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9YSUxJTlhfTUlDUk9CTEFaRSkKKyNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKKyNkZWZpbmUgRWxmMzJfUmVsTQlFbGYzMl9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCisjZW5kaWYKKworLyogTUlQUyAqLworI2lmIGRlZmluZWQoX19taXBzX18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fTUlQUyB8fCB4ID09IEVNX01JUFNfUlMzX0xFKQorI2RlZmluZSBTSFRfUkVMTQlTSFRfUkVMCisjZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsCisjZGVmaW5lIEVMRkNMQVNTTQlFTEZDTEFTUzMyCisvKiBBY2NvdW50IGZvciBFTEYgc3BlYyBjaGFuZ2VzLiAgKi8KKyNpZm5kZWYgRU1fTUlQU19SUzNfTEUKKyNpZmRlZiBFTV9NSVBTX1JTNF9CRQorI2RlZmluZSBFTV9NSVBTX1JTM19MRQlFTV9NSVBTX1JTNF9CRQorI2Vsc2UKKyNkZWZpbmUgRU1fTUlQU19SUzNfTEUJMTAKKyNlbmRpZgorI2VuZGlmIC8qICFFTV9NSVBTX1JTM19MRSAqLworI2RlZmluZSBBUkNIREFUQU0gICAgICAgIl9fZGJlX3RhYmxlIgorI2VuZGlmCisKKy8qIE5pb3MgSUkgKi8KKyNpZiBkZWZpbmVkKF9fbmlvczJfXykKKyNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9BTFRFUkFfTklPUzIpCisjZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUxBCisjZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsYQorI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1MzMgorI2VuZGlmCisKKy8qIFBvd2VyUEMgKi8KKyNpZiBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fUFBDNjQpCisjZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUxBCisjZGVmaW5lIEVsZjY0X1JlbE0JRWxmNjRfUmVsYQorI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1M2NAorI2VsaWYgZGVmaW5lZChfX3Bvd2VycGNfXykKKyNkZWZpbmUgTUFUQ0hfTUFDSElORSh4KSAoeCA9PSBFTV9QUEMpCisjZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUxBCisjZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsYQorI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1MzMgorI2RlZmluZSBVU0VfUExUX0VOVFJJRVMKKyNkZWZpbmUgUExUX0VOVFJZX1NJWkUgMTYKKyNkZWZpbmUgVVNFX1BMVF9MSVNUCisjZGVmaW5lIExJU1RfQVJDSFRZUEUgRWxmVyhBZGRyKQorI2RlZmluZSBVU0VfTElTVAorI2RlZmluZSBBUkNIREFUQU0gICAgICAgIl9fZnRyX2ZpeHVwIgorI2VuZGlmCisKKy8qIFMzOTAgKi8KKyNpZiBkZWZpbmVkKF9fczM5MF9fKQorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX1MzOTApCisjZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUxBCisjZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsYQorI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1MzMgorI2RlZmluZSBVU0VfUExUX0VOVFJJRVMKKyNkZWZpbmUgUExUX0VOVFJZX1NJWkUgOAorI2RlZmluZSBVU0VfR09UX0VOVFJJRVMKKyNkZWZpbmUgR09UX0VOVFJZX1NJWkUgOAorI2RlZmluZSBVU0VfU0lOR0xFCisjZW5kaWYKKworLyogU3VwZXJIICovCisjaWYgZGVmaW5lZChfX3NoX18pCisjZGVmaW5lIE1BVENIX01BQ0hJTkUoeCkgKHggPT0gRU1fU0gpCisjZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUxBCisjZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsYQorI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1MzMgorI2RlZmluZSBVU0VfR09UX0VOVFJJRVMKKyNkZWZpbmUgR09UX0VOVFJZX1NJWkUgNAorI2RlZmluZSBVU0VfU0lOR0xFCisvKiB0aGUgU0ggY2hhbmdlcyBoYXZlIG9ubHkgYmVlbiB0ZXN0ZWQgaW4gPWxpdHRsZSBlbmRpYW49IG1vZGUgKi8KKy8qIEknbSBub3Qgc3VyZSBhYm91dCBiaWcgZW5kaWFuLCBzbyBsZXQncyB3YXJuOiAqLworI2lmIGRlZmluZWQoX19zaF9fKSAmJiBCQl9CSUdfRU5ESUFOCisjIGVycm9yIGluc21vZC5jIG1heSByZXF1aXJlIGNoYW5nZXMgZm9yIHVzZSBvbiBiaWcgZW5kaWFuIFNICisjZW5kaWYKKy8qIGl0IG1heSBvciBtYXkgbm90IHdvcmsgb24gdGhlIFNIMS9TSDIuLi4gRXJyb3Igb24gdGhvc2UgYWxzbyAqLworI2lmICgoIShkZWZpbmVkKF9fU0gzX18pIHx8IGRlZmluZWQoX19TSDRfXykgfHwgZGVmaW5lZChfX1NINV9fKSkpKSAmJiAoZGVmaW5lZChfX3NoX18pKQorI2Vycm9yIGluc21vZC5jIG1heSByZXF1aXJlIGNoYW5nZXMgZm9yIFNIMSBvciBTSDIgdXNlCisjZW5kaWYKKyNlbmRpZgorCisvKiBTcGFyYyAqLworI2lmIGRlZmluZWQoX19zcGFyY19fKQorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX1NQQVJDKQorI2RlZmluZSBTSFRfUkVMTSAgICAgICBTSFRfUkVMQQorI2RlZmluZSBFbGYzMl9SZWxNICAgICBFbGYzMl9SZWxhCisjZGVmaW5lIEVMRkNMQVNTTSAgICAgIEVMRkNMQVNTMzIKKyNlbmRpZgorCisvKiB2ODUwZSAqLworI2lmIGRlZmluZWQoX192ODUwZV9fKQorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICgoeCkgPT0gRU1fVjg1MCB8fCAoeCkgPT0gRU1fQ1lHTlVTX1Y4NTApCisjZGVmaW5lIFNIVF9SRUxNCVNIVF9SRUxBCisjZGVmaW5lIEVsZjMyX1JlbE0JRWxmMzJfUmVsYQorI2RlZmluZSBFTEZDTEFTU00JRUxGQ0xBU1MzMgorI2RlZmluZSBVU0VfUExUX0VOVFJJRVMKKyNkZWZpbmUgUExUX0VOVFJZX1NJWkUgOAorI2RlZmluZSBVU0VfU0lOR0xFCisjaWZuZGVmIEVNX0NZR05VU19WODUwCS8qIGdydW1ibGUgKi8KKyNkZWZpbmUgRU1fQ1lHTlVTX1Y4NTAJMHg5MDgwCisjZW5kaWYKKyNkZWZpbmUgU1lNQk9MX1BSRUZJWAkiXyIKKyNlbmRpZgorCisvKiBYODZfNjQgICovCisjaWYgZGVmaW5lZChfX3g4Nl82NF9fKQorI2RlZmluZSBNQVRDSF9NQUNISU5FKHgpICh4ID09IEVNX1g4Nl82NCkKKyNkZWZpbmUgU0hUX1JFTE0JU0hUX1JFTEEKKyNkZWZpbmUgVVNFX0dPVF9FTlRSSUVTCisjZGVmaW5lIEdPVF9FTlRSWV9TSVpFIDgKKyNkZWZpbmUgVVNFX1NJTkdMRQorI2RlZmluZSBFbGY2NF9SZWxNCUVsZjY0X1JlbGEKKyNkZWZpbmUgRUxGQ0xBU1NNCUVMRkNMQVNTNjQKKyNlbmRpZgorCisjaWZuZGVmIFNIVF9SRUxNCisjZXJyb3IgU29ycnksIGJ1dCBpbnNtb2QuYyBkb2VzIG5vdCB5ZXQgc3VwcG9ydCB0aGlzIGFyY2hpdGVjdHVyZS4uLgorI2VuZGlmCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy0tLS0tLS0tbW9kdXRpbHMgbW9kdWxlLmgsIGxpbmVzIDQ1LTI0MgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qIERlZmluaXRpb25zIGZvciB0aGUgTGludXggbW9kdWxlIHN5c2NhbGwgaW50ZXJmYWNlLgorICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgTGludXggSW50ZXJuYXRpb25hbC4KKworICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IG1vZHV0aWxzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKyNpZm5kZWYgTU9EVVRJTFNfTU9EVUxFX0gKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIEZvciBzaXplb2YoKSB3aGljaCBhcmUgcmVsYXRlZCB0byB0aGUgbW9kdWxlIHBsYXRmb3JtIGFuZCBub3QgdG8gdGhlCisgICBlbnZpcm9ubWVudCBpc25tb2QgaXMgcnVubmluZyBpbiwgdXNlIHNpemVvZl94eCBpbnN0ZWFkIG9mIHNpemVvZih4eCkuICAqLworCisjZGVmaW5lIHRndF9zaXplb2ZfY2hhcgkJc2l6ZW9mKGNoYXIpCisjZGVmaW5lIHRndF9zaXplb2Zfc2hvcnQJc2l6ZW9mKHNob3J0KQorI2RlZmluZSB0Z3Rfc2l6ZW9mX2ludAkJc2l6ZW9mKGludCkKKyNkZWZpbmUgdGd0X3NpemVvZl9sb25nCQlzaXplb2YobG9uZykKKyNkZWZpbmUgdGd0X3NpemVvZl9jaGFyX3AJc2l6ZW9mKGNoYXIgKikKKyNkZWZpbmUgdGd0X3NpemVvZl92b2lkX3AJc2l6ZW9mKHZvaWQgKikKKyNkZWZpbmUgdGd0X2xvbmcJCWxvbmcKKworI2lmIGRlZmluZWQoX19zcGFyY19fKSAmJiAhZGVmaW5lZChfX3NwYXJjX3Y5X18pICYmIGRlZmluZWQoQVJDSF9zcGFyYzY0KQorI3VuZGVmIHRndF9zaXplb2ZfbG9uZworI3VuZGVmIHRndF9zaXplb2ZfY2hhcl9wCisjdW5kZWYgdGd0X3NpemVvZl92b2lkX3AKKyN1bmRlZiB0Z3RfbG9uZworZW51bSB7CisJdGd0X3NpemVvZl9sb25nID0gOCwKKwl0Z3Rfc2l6ZW9mX2NoYXJfcCA9IDgsCisJdGd0X3NpemVvZl92b2lkX3AgPSA4Cit9OworI2RlZmluZSB0Z3RfbG9uZwkJbG9uZyBsb25nCisjZW5kaWYKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKy8qIFRoZSBzdHJ1Y3R1cmVzIHVzZWQgaW4gTGludXggMi4xLiAgKi8KKworLyogTm90ZTogbmV3X21vZHVsZV9zeW1ib2wgZG9lcyBub3QgdXNlIHRndF9sb25nIGludGVudGlvbmFsbHkgKi8KK3N0cnVjdCBuZXdfbW9kdWxlX3N5bWJvbCB7CisJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKwl1bnNpZ25lZCBsb25nIG5hbWU7Cit9OworCitzdHJ1Y3QgbmV3X21vZHVsZV9wZXJzaXN0OworCitzdHJ1Y3QgbmV3X21vZHVsZV9yZWYgeworCXVuc2lnbmVkIHRndF9sb25nIGRlcDsJCS8qIGtlcm5lbCBhZGRyZXNzZXMgKi8KKwl1bnNpZ25lZCB0Z3RfbG9uZyByZWY7CisJdW5zaWduZWQgdGd0X2xvbmcgbmV4dF9yZWY7Cit9OworCitzdHJ1Y3QgbmV3X21vZHVsZSB7CisJdW5zaWduZWQgdGd0X2xvbmcgc2l6ZV9vZl9zdHJ1Y3Q7CS8qID09IHNpemVvZihtb2R1bGUpICovCisJdW5zaWduZWQgdGd0X2xvbmcgbmV4dDsKKwl1bnNpZ25lZCB0Z3RfbG9uZyBuYW1lOworCXVuc2lnbmVkIHRndF9sb25nIHNpemU7CisKKwl0Z3RfbG9uZyB1c2Vjb3VudDsKKwl1bnNpZ25lZCB0Z3RfbG9uZyBmbGFnczsJCS8qIEFVVE9DTEVBTiBldCBhbCAqLworCisJdW5zaWduZWQgbnN5bXM7CisJdW5zaWduZWQgbmRlcHM7CisKKwl1bnNpZ25lZCB0Z3RfbG9uZyBzeW1zOworCXVuc2lnbmVkIHRndF9sb25nIGRlcHM7CisJdW5zaWduZWQgdGd0X2xvbmcgcmVmczsKKwl1bnNpZ25lZCB0Z3RfbG9uZyBpbml0OworCXVuc2lnbmVkIHRndF9sb25nIGNsZWFudXA7CisJdW5zaWduZWQgdGd0X2xvbmcgZXhfdGFibGVfc3RhcnQ7CisJdW5zaWduZWQgdGd0X2xvbmcgZXhfdGFibGVfZW5kOworI2lmZGVmIF9fYWxwaGFfXworCXVuc2lnbmVkIHRndF9sb25nIGdwOworI2VuZGlmCisJLyogRXZlcnl0aGluZyBhZnRlciBoZXJlIGlzIGV4dGVuc2lvbi4gICovCisJdW5zaWduZWQgdGd0X2xvbmcgcGVyc2lzdF9zdGFydDsKKwl1bnNpZ25lZCB0Z3RfbG9uZyBwZXJzaXN0X2VuZDsKKwl1bnNpZ25lZCB0Z3RfbG9uZyBjYW5fdW5sb2FkOworCXVuc2lnbmVkIHRndF9sb25nIHJ1bnNpemU7CisJY29uc3QgY2hhciAqa2FsbHN5bXNfc3RhcnQ7ICAgICAvKiBBbGwgc3ltYm9scyBmb3Iga2VybmVsIGRlYnVnZ2luZyAqLworCWNvbnN0IGNoYXIgKmthbGxzeW1zX2VuZDsKKwljb25zdCBjaGFyICphcmNoZGF0YV9zdGFydDsgICAgIC8qIGFyY2ggc3BlY2lmaWMgZGF0YSBmb3IgbW9kdWxlICovCisJY29uc3QgY2hhciAqYXJjaGRhdGFfZW5kOworCWNvbnN0IGNoYXIgKmtlcm5lbF9kYXRhOyAgICAgICAgLyogUmVzZXJ2ZWQgZm9yIGtlcm5lbCBpbnRlcm5hbCB1c2UgKi8KK307CisKKyNpZmRlZiBBUkNIREFUQU0KKyNkZWZpbmUgQVJDSERBVEFfU0VDX05BTUUgQVJDSERBVEFNCisjZWxzZQorI2RlZmluZSBBUkNIREFUQV9TRUNfTkFNRSAiX19hcmNoZGF0YSIKKyNlbmRpZgorI2RlZmluZSBLQUxMU1lNU19TRUNfTkFNRSAiX19rYWxsc3ltcyIKKworCitzdHJ1Y3QgbmV3X21vZHVsZV9pbmZvIHsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJbG9uZyB1c2Vjb3VudDsKK307CisKKy8qIEJpdHMgb2YgbW9kdWxlLmZsYWdzLiAgKi8KK2VudW0geworCU5FV19NT0RfUlVOTklORyA9IDEsCisJTkVXX01PRF9ERUxFVEVEID0gMiwKKwlORVdfTU9EX0FVVE9DTEVBTiA9IDQsCisJTkVXX01PRF9WSVNJVEVEID0gOCwKKwlORVdfTU9EX1VTRURfT05DRSA9IDE2Cit9OworCitpbnQgaW5pdF9tb2R1bGUoY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3RydWN0IG5ld19tb2R1bGUgKik7CitpbnQgcXVlcnlfbW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUsIGludCB3aGljaCwgdm9pZCAqYnVmLAorCQlzaXplX3QgYnVmc2l6ZSwgc2l6ZV90ICpyZXQpOworCisvKiBWYWx1ZXMgZm9yIHF1ZXJ5X21vZHVsZSdzIHdoaWNoLiAgKi8KK2VudW0geworCVFNX01PRFVMRVMgPSAxLAorCVFNX0RFUFMgPSAyLAorCVFNX1JFRlMgPSAzLAorCVFNX1NZTUJPTFMgPSA0LAorCVFNX0lORk8gPSA1Cit9OworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogVGhlIHN5c3RlbSBjYWxscyB1bmNoYW5nZWQgYmV0d2VlbiAyLjAgYW5kIDIuMS4gICovCisKK3Vuc2lnbmVkIGxvbmcgY3JlYXRlX21vZHVsZShjb25zdCBjaGFyICosIHNpemVfdCk7CitpbnQgZGVsZXRlX21vZHVsZShjb25zdCBjaGFyICptb2R1bGUsIHVuc2lnbmVkIGludCBmbGFncyk7CisKKworI2VuZGlmIC8qIG1vZHVsZS5oICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8tLS0tLS0tLWVuZCBvZiBtb2R1dGlscyBtb2R1bGUuaAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLS0tLS0tLS1tb2R1dGlscyBvYmouaCwgbGluZXMgMjUzLTQ2MgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qIEVsZiBvYmplY3QgZmlsZSBsb2FkaW5nIGFuZCByZWxvY2F0aW9uIHJvdXRpbmVzLgorICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgTGludXggSW50ZXJuYXRpb25hbC4KKworICAgQ29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IG1vZHV0aWxzLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICAgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyCisgICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0CisgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQorICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwKKyAgIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisKKyNpZm5kZWYgTU9EVVRJTFNfT0JKX0gKKworLyogVGhlIHJlbG9jYXRhYmxlIG9iamVjdCBpcyBtYW5pcHVsYXRlZCB1c2luZyBlbGZpbiB0eXBlcy4gICovCisKKyNpbmNsdWRlIDxlbGYuaD4KKyNpbmNsdWRlIDxlbmRpYW4uaD4KKworI2lmbmRlZiBFbGZXCisjIGlmIEVMRkNMQVNTTSA9PSBFTEZDTEFTUzMyCisjICBkZWZpbmUgRWxmVyh4KSAgRWxmMzJfICMjIHgKKyMgIGRlZmluZSBFTEZXKHgpICBFTEYzMl8gIyMgeAorIyBlbHNlCisjICBkZWZpbmUgRWxmVyh4KSAgRWxmNjRfICMjIHgKKyMgIGRlZmluZSBFTEZXKHgpICBFTEY2NF8gIyMgeAorIyBlbmRpZgorI2VuZGlmCisKKy8qIEZvciBzb21lIHJlYXNvbiB0aGlzIGlzIG1pc3NpbmcgZnJvbSBzb21lIGFuY2llbnQgQyBsaWJyYXJpZXMuLi4uICAqLworI2lmbmRlZiBFTEYzMl9TVF9JTkZPCisjIGRlZmluZSBFTEYzMl9TVF9JTkZPKGJpbmQsIHR5cGUpICAgICAgICgoKGJpbmQpIDw8IDQpICsgKCh0eXBlKSAmIDB4ZikpCisjZW5kaWYKKworI2lmbmRlZiBFTEY2NF9TVF9JTkZPCisjIGRlZmluZSBFTEY2NF9TVF9JTkZPKGJpbmQsIHR5cGUpICAgICAgICgoKGJpbmQpIDw8IDQpICsgKCh0eXBlKSAmIDB4ZikpCisjZW5kaWYKKworI2RlZmluZSBFTEZfU1RfQklORChpbmZvKSBFTEZXKFNUX0JJTkQpKGluZm8pCisjZGVmaW5lIEVMRl9TVF9UWVBFKGluZm8pIEVMRlcoU1RfVFlQRSkoaW5mbykKKyNkZWZpbmUgRUxGX1NUX0lORk8oYmluZCwgdHlwZSkgRUxGVyhTVF9JTkZPKShiaW5kLCB0eXBlKQorI2RlZmluZSBFTEZfUl9UWVBFKHZhbCkgRUxGVyhSX1RZUEUpKHZhbCkKKyNkZWZpbmUgRUxGX1JfU1lNKHZhbCkgRUxGVyhSX1NZTSkodmFsKQorCitzdHJ1Y3Qgb2JqX3N0cmluZ19wYXRjaDsKK3N0cnVjdCBvYmpfc3ltYm9sX3BhdGNoOworCitzdHJ1Y3Qgb2JqX3NlY3Rpb24geworCUVsZlcoU2hkcikgaGVhZGVyOworCWNvbnN0IGNoYXIgKm5hbWU7CisJY2hhciAqY29udGVudHM7CisJc3RydWN0IG9ial9zZWN0aW9uICpsb2FkX25leHQ7CisJaW50IGlkeDsKK307CisKK3N0cnVjdCBvYmpfc3ltYm9sIHsKKwlzdHJ1Y3Qgb2JqX3N5bWJvbCAqbmV4dDsJLyogaGFzaCB0YWJsZSBsaW5rICovCisJY29uc3QgY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgc2VjaWR4OwkJCS8qIHRoZSBkZWZpbmluZyBzZWN0aW9uIGluZGV4L21vZHVsZSAqLworCWludCBpbmZvOworCWludCBrc3ltaWR4OwkJCS8qIGZvciBleHBvcnQgdG8gdGhlIGtlcm5lbCBzeW10YWIgKi8KKwlpbnQgcmVmZXJlbmNlZDsJCS8qIGFjdHVhbGx5IHVzZWQgaW4gdGhlIGxpbmsgKi8KK307CisKKy8qIEhhcmRjb2RlIHRoZSBoYXNoIHRhYmxlIHNpemUuICBXZSBzaG91bGRuJ3QgYmUgbmVlZGluZyBzbyBtYW55CisgICBzeW1ib2xzIHRoYXQgd2UgYmVnaW4gdG8gZGVncmFkZSBwZXJmb3JtYW5jZSwgYW5kIHdlIGdldCBhIGJpZyB3aW4KKyAgIGJ5IGdpdmluZyB0aGUgY29tcGlsZXIgYSBjb25zdGFudCBkaXZpc29yLiAgKi8KKworI2RlZmluZSBIQVNIX0JVQ0tFVFMgIDUyMQorCitzdHJ1Y3Qgb2JqX2ZpbGUgeworCUVsZlcoRWhkcikgaGVhZGVyOworCUVsZlcoQWRkcikgYmFzZWFkZHI7CisJc3RydWN0IG9ial9zZWN0aW9uICoqc2VjdGlvbnM7CisJc3RydWN0IG9ial9zZWN0aW9uICpsb2FkX29yZGVyOworCXN0cnVjdCBvYmpfc2VjdGlvbiAqKmxvYWRfb3JkZXJfc2VhcmNoX3N0YXJ0OworCXN0cnVjdCBvYmpfc3RyaW5nX3BhdGNoICpzdHJpbmdfcGF0Y2hlczsKKwlzdHJ1Y3Qgb2JqX3N5bWJvbF9wYXRjaCAqc3ltYm9sX3BhdGNoZXM7CisJaW50ICgqc3ltYm9sX2NtcCkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOyAvKiBjYW50IGJlIEZBU1RfRlVOQyAqLworCXVuc2lnbmVkIGxvbmcgKCpzeW1ib2xfaGFzaCkoY29uc3QgY2hhciAqKSBGQVNUX0ZVTkM7CisJdW5zaWduZWQgbG9uZyBsb2NhbF9zeW10YWJfc2l6ZTsKKwlzdHJ1Y3Qgb2JqX3N5bWJvbCAqKmxvY2FsX3N5bXRhYjsKKwlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltdGFiW0hBU0hfQlVDS0VUU107Cit9OworCitlbnVtIG9ial9yZWxvYyB7CisJb2JqX3JlbG9jX29rLAorCW9ial9yZWxvY19vdmVyZmxvdywKKwlvYmpfcmVsb2NfZGFuZ2Vyb3VzLAorCW9ial9yZWxvY191bmhhbmRsZWQKK307CisKK3N0cnVjdCBvYmpfc3RyaW5nX3BhdGNoIHsKKwlzdHJ1Y3Qgb2JqX3N0cmluZ19wYXRjaCAqbmV4dDsKKwlpbnQgcmVsb2Nfc2VjaWR4OworCUVsZlcoQWRkcikgcmVsb2Nfb2Zmc2V0OworCUVsZlcoQWRkcikgc3RyaW5nX29mZnNldDsKK307CisKK3N0cnVjdCBvYmpfc3ltYm9sX3BhdGNoIHsKKwlzdHJ1Y3Qgb2JqX3N5bWJvbF9wYXRjaCAqbmV4dDsKKwlpbnQgcmVsb2Nfc2VjaWR4OworCUVsZlcoQWRkcikgcmVsb2Nfb2Zmc2V0OworCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07Cit9OworCisKKy8qIEdlbmVyaWMgb2JqZWN0IG1hbmlwdWxhdGlvbiByb3V0aW5lcy4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIEZBU1RfRlVOQyBvYmpfZWxmX2hhc2goY29uc3QgY2hhciAqKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgb2JqX2VsZl9oYXNoX24oY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nIGxlbik7CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqX3N5bWJvbCAqb2JqX2ZpbmRfc3ltYm9sKHN0cnVjdCBvYmpfZmlsZSAqZiwKKwkJY29uc3QgY2hhciAqbmFtZSk7CisKK3N0YXRpYyBFbGZXKEFkZHIpIG9ial9zeW1ib2xfZmluYWxfdmFsdWUoc3RydWN0IG9ial9maWxlICpmLAorCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCitzdGF0aWMgdm9pZCBvYmpfc2V0X3N5bWJvbF9jb21wYXJlKHN0cnVjdCBvYmpfZmlsZSAqZiwKKwkJaW50ICgqY21wKShjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiksCisJCXVuc2lnbmVkIGxvbmcgKCpoYXNoKShjb25zdCBjaGFyICopIEZBU1RfRlVOQyk7CisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqb2JqX2ZpbmRfc2VjdGlvbihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCisJCWNvbnN0IGNoYXIgKm5hbWUpOworCitzdGF0aWMgdm9pZCBvYmpfaW5zZXJ0X3NlY3Rpb25fbG9hZF9vcmRlcihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCisJCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjKTsKKworc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb24oc3RydWN0IG9ial9maWxlICpmLAorCQljb25zdCBjaGFyICpuYW1lLAorCQl1bnNpZ25lZCBsb25nIGFsaWduLAorCQl1bnNpZ25lZCBsb25nIHNpemUpOworCitzdGF0aWMgc3RydWN0IG9ial9zZWN0aW9uICpvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbl9maXJzdChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCisJCWNvbnN0IGNoYXIgKm5hbWUsCisJCXVuc2lnbmVkIGxvbmcgYWxpZ24sCisJCXVuc2lnbmVkIGxvbmcgc2l6ZSk7CisKK3N0YXRpYyB2b2lkICpvYmpfZXh0ZW5kX3NlY3Rpb24oc3RydWN0IG9ial9zZWN0aW9uICpzZWMsIHVuc2lnbmVkIGxvbmcgbW9yZSk7CisKK3N0YXRpYyB2b2lkIG9ial9zdHJpbmdfcGF0Y2goc3RydWN0IG9ial9maWxlICpmLCBpbnQgc2VjaWR4LCBFbGZXKEFkZHIpIG9mZnNldCwKKwkJY29uc3QgY2hhciAqc3RyaW5nKTsKKworc3RhdGljIHZvaWQgb2JqX3N5bWJvbF9wYXRjaChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGludCBzZWNpZHgsIEVsZlcoQWRkcikgb2Zmc2V0LAorCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltKTsKKworc3RhdGljIHZvaWQgb2JqX2NoZWNrX3VuZGVmaW5lZHMoc3RydWN0IG9ial9maWxlICpmKTsKKworc3RhdGljIHZvaWQgb2JqX2FsbG9jYXRlX2NvbW1vbnMoc3RydWN0IG9ial9maWxlICpmKTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgb2JqX2xvYWRfc2l6ZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYpOworCitzdGF0aWMgaW50IG9ial9yZWxvY2F0ZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIEVsZlcoQWRkcikgYmFzZSk7CisKKyNpZiAhTE9BREJJVFMKKyNkZWZpbmUgb2JqX2xvYWQoaW1hZ2UsIGltYWdlX3NpemUsIGxvYWRwcm9nYml0cykgXAorCW9ial9sb2FkKGltYWdlLCBpbWFnZV9zaXplKQorI2VuZGlmCitzdGF0aWMgc3RydWN0IG9ial9maWxlICpvYmpfbG9hZChjaGFyICppbWFnZSwgc2l6ZV90IGltYWdlX3NpemUsIGludCBsb2FkcHJvZ2JpdHMpOworCitzdGF0aWMgaW50IG9ial9jcmVhdGVfaW1hZ2Uoc3RydWN0IG9ial9maWxlICpmLCBjaGFyICppbWFnZSk7CisKKy8qIEFyY2hpdGVjdHVyZSBzcGVjaWZpYyBtYW5pcHVsYXRpb24gcm91dGluZXMuICAqLworCitzdGF0aWMgc3RydWN0IG9ial9maWxlICphcmNoX25ld19maWxlKHZvaWQpOworCitzdGF0aWMgc3RydWN0IG9ial9zZWN0aW9uICphcmNoX25ld19zZWN0aW9uKHZvaWQpOworCitzdGF0aWMgc3RydWN0IG9ial9zeW1ib2wgKmFyY2hfbmV3X3N5bWJvbCh2b2lkKTsKKworc3RhdGljIGVudW0gb2JqX3JlbG9jIGFyY2hfYXBwbHlfcmVsb2NhdGlvbihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCisJCXN0cnVjdCBvYmpfc2VjdGlvbiAqdGFyZ3NlYywKKwkJLypzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnN5bXNlYywqLworCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltLAorCQlFbGZXKFJlbE0pICpyZWwsIEVsZlcoQWRkcikgdmFsdWUpOworCitzdGF0aWMgdm9pZCBhcmNoX2NyZWF0ZV9nb3Qoc3RydWN0IG9ial9maWxlICpmKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSEVDS19UQUlOVEVEX01PRFVMRQorc3RhdGljIGludCBvYmpfZ3BsX2xpY2Vuc2Uoc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICoqbGljZW5zZSk7CisjZW5kaWYKKyNlbmRpZiAvKiBvYmouaCAqLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy0tLS0tLS0tZW5kIG9mIG1vZHV0aWxzIG9iai5oCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisvKiBTUEZYIGlzIGFsd2F5cyBhIHN0cmluZywgc28gaXQgY2FuIGJlIGNvbmNhdGVuYXRlZCB0byBzdHJpbmcgY29uc3RhbnRzLiAgKi8KKyNpZmRlZiBTWU1CT0xfUFJFRklYCisjZGVmaW5lIFNQRlgJU1lNQk9MX1BSRUZJWAorI2Vsc2UKKyNkZWZpbmUgU1BGWAkiIgorI2VuZGlmCisKK2VudW0geyBTVFJWRVJTSU9OTEVOID0gNjQgfTsKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworI2RlZmluZSBmbGFnX2ZvcmNlX2xvYWQgKG9wdGlvbl9tYXNrMzIgJiBJTlNNT0RfT1BUX0ZPUkNFKQorI2RlZmluZSBmbGFnX2F1dG9jbGVhbiAob3B0aW9uX21hc2szMiAmIElOU01PRF9PUFRfS0VSTkVMRCkKKyNkZWZpbmUgZmxhZ192ZXJib3NlIChvcHRpb25fbWFzazMyICYgSU5TTU9EX09QVF9WRVJCT1NFKQorI2RlZmluZSBmbGFnX3F1aWV0IChvcHRpb25fbWFzazMyICYgSU5TTU9EX09QVF9TSUxFTlQpCisjZGVmaW5lIGZsYWdfbm9leHBvcnQgKG9wdGlvbl9tYXNrMzIgJiBJTlNNT0RfT1BUX05PX0VYUE9SVCkKKyNkZWZpbmUgZmxhZ19wcmludF9sb2FkX21hcCAob3B0aW9uX21hc2szMiAmIElOU01PRF9PUFRfUFJJTlRfTUFQKQorCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaWYgZGVmaW5lZChVU0VfTElTVCkKKworc3RydWN0IGFyY2hfbGlzdF9lbnRyeSB7CisJc3RydWN0IGFyY2hfbGlzdF9lbnRyeSAqbmV4dDsKKwlMSVNUX0FSQ0hUWVBFIGFkZGVuZDsKKwlpbnQgb2Zmc2V0OworCWludCBpbml0ZWQgOiAxOworfTsKKworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFVTRV9TSU5HTEUpCisKK3N0cnVjdCBhcmNoX3NpbmdsZV9lbnRyeSB7CisJaW50IG9mZnNldDsKKwlpbnQgaW5pdGVkIDogMTsKKwlpbnQgYWxsb2NhdGVkIDogMTsKK307CisKKyNlbmRpZgorCisjaWYgZGVmaW5lZChfX21pcHNfXykKK3N0cnVjdCBtaXBzX2hpMTYgeworCXN0cnVjdCBtaXBzX2hpMTYgKm5leHQ7CisJRWxmVyhBZGRyKSAqYWRkcjsKKwlFbGZXKEFkZHIpIHZhbHVlOworfTsKKyNlbmRpZgorCitzdHJ1Y3QgYXJjaF9maWxlIHsKKwlzdHJ1Y3Qgb2JqX2ZpbGUgcm9vdDsKKyNpZiBkZWZpbmVkKFVTRV9QTFRfRU5UUklFUykKKwlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnBsdDsKKyNlbmRpZgorI2lmIGRlZmluZWQoVVNFX0dPVF9FTlRSSUVTKQorCXN0cnVjdCBvYmpfc2VjdGlvbiAqZ290OworI2VuZGlmCisjaWYgZGVmaW5lZChfX21pcHNfXykKKwlzdHJ1Y3QgbWlwc19oaTE2ICptaXBzX2hpMTZfbGlzdDsKKyNlbmRpZgorfTsKKworc3RydWN0IGFyY2hfc3ltYm9sIHsKKwlzdHJ1Y3Qgb2JqX3N5bWJvbCByb290OworI2lmIGRlZmluZWQoVVNFX1BMVF9FTlRSSUVTKQorI2lmIGRlZmluZWQoVVNFX1BMVF9MSVNUKQorCXN0cnVjdCBhcmNoX2xpc3RfZW50cnkgKnBsdGVudDsKKyNlbHNlCisJc3RydWN0IGFyY2hfc2luZ2xlX2VudHJ5IHBsdGVudDsKKyNlbmRpZgorI2VuZGlmCisjaWYgZGVmaW5lZChVU0VfR09UX0VOVFJJRVMpCisJc3RydWN0IGFyY2hfc2luZ2xlX2VudHJ5IGdvdGVudDsKKyNlbmRpZgorfTsKKworCitzdHJ1Y3QgZXh0ZXJuYWxfbW9kdWxlIHsKKwljb25zdCBjaGFyICpuYW1lOworCUVsZlcoQWRkcikgYWRkcjsKKwlpbnQgdXNlZDsKKwlzaXplX3QgbnN5bXM7CisJc3RydWN0IG5ld19tb2R1bGVfc3ltYm9sICpzeW1zOworfTsKKworc3RhdGljIHN0cnVjdCBuZXdfbW9kdWxlX3N5bWJvbCAqa3N5bXM7CitzdGF0aWMgc2l6ZV90IG5rc3ltczsKKworc3RhdGljIHN0cnVjdCBleHRlcm5hbF9tb2R1bGUgKmV4dF9tb2R1bGVzOworc3RhdGljIGludCBuX2V4dF9tb2R1bGVzOworc3RhdGljIGludCBuX2V4dF9tb2R1bGVzX3VzZWQ7CisKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCisKKworc3RhdGljIHN0cnVjdCBvYmpfZmlsZSAqYXJjaF9uZXdfZmlsZSh2b2lkKQoreworCXN0cnVjdCBhcmNoX2ZpbGUgKmY7CisJZiA9IHh6YWxsb2Moc2l6ZW9mKCpmKSk7CisJcmV0dXJuICZmLT5yb290OyAvKiBpdCdzIGEgZmlyc3QgbWVtYmVyICovCit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKmFyY2hfbmV3X3NlY3Rpb24odm9pZCkKK3sKKwlyZXR1cm4geHphbGxvYyhzaXplb2Yoc3RydWN0IG9ial9zZWN0aW9uKSk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgb2JqX3N5bWJvbCAqYXJjaF9uZXdfc3ltYm9sKHZvaWQpCit7CisJc3RydWN0IGFyY2hfc3ltYm9sICpzeW07CisJc3ltID0geHphbGxvYyhzaXplb2YoKnN5bSkpOworCXJldHVybiAmc3ltLT5yb290OworfQorCitzdGF0aWMgZW51bSBvYmpfcmVsb2MKK2FyY2hfYXBwbHlfcmVsb2NhdGlvbihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCisJCXN0cnVjdCBvYmpfc2VjdGlvbiAqdGFyZ3NlYywKKwkJLypzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnN5bXNlYywqLworCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltLAorCQlFbGZXKFJlbE0pICpyZWwsIEVsZlcoQWRkcikgdikKK3sKKyNpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19tYzY4MDAwX18pIFwKKyB8fCBkZWZpbmVkKF9fc2hfXykgfHwgZGVmaW5lZChfX3MzOTBfXykgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSBcCisgfHwgZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgZGVmaW5lZChfX21pcHNfXykKKwlzdHJ1Y3QgYXJjaF9maWxlICppZmlsZSA9IChzdHJ1Y3QgYXJjaF9maWxlICopIGY7CisjZW5kaWYKKwllbnVtIG9ial9yZWxvYyByZXQgPSBvYmpfcmVsb2Nfb2s7CisJRWxmVyhBZGRyKSAqbG9jID0gKEVsZlcoQWRkcikgKikgKHRhcmdzZWMtPmNvbnRlbnRzICsgcmVsLT5yX29mZnNldCk7CisjaWYgZGVmaW5lZChfX2FybV9fKSB8fCBkZWZpbmVkKF9fSDgzMDBIX18pIHx8IGRlZmluZWQoX19IODMwMFNfXykgXAorIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19tYzY4MDAwX18pIHx8IGRlZmluZWQoX19taWNyb2JsYXplX18pIFwKKyB8fCBkZWZpbmVkKF9fbWlwc19fKSB8fCBkZWZpbmVkKF9fbmlvczJfXykgfHwgZGVmaW5lZChfX3Bvd2VycGNfXykgXAorIHx8IGRlZmluZWQoX19zMzkwX18pIHx8IGRlZmluZWQoX19zaF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCisJRWxmVyhBZGRyKSBkb3QgPSB0YXJnc2VjLT5oZWFkZXIuc2hfYWRkciArIHJlbC0+cl9vZmZzZXQ7CisjZW5kaWYKKyNpZiBkZWZpbmVkKFVTRV9HT1RfRU5UUklFUykgfHwgZGVmaW5lZChVU0VfUExUX0VOVFJJRVMpCisJc3RydWN0IGFyY2hfc3ltYm9sICppc3ltID0gKHN0cnVjdCBhcmNoX3N5bWJvbCAqKSBzeW07CisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19tYzY4MDAwX18pIFwKKyB8fCBkZWZpbmVkKF9fc2hfXykgfHwgZGVmaW5lZChfX3MzOTBfXykKKyNpZiBkZWZpbmVkKFVTRV9HT1RfRU5UUklFUykKKwlFbGZXKEFkZHIpIGdvdCA9IGlmaWxlLT5nb3QgPyBpZmlsZS0+Z290LT5oZWFkZXIuc2hfYWRkciA6IDA7CisjZW5kaWYKKyNlbmRpZgorI2lmIGRlZmluZWQoVVNFX1BMVF9FTlRSSUVTKQorCUVsZlcoQWRkcikgcGx0ID0gaWZpbGUtPnBsdCA/IGlmaWxlLT5wbHQtPmhlYWRlci5zaF9hZGRyIDogMDsKKwl1bnNpZ25lZCBsb25nICppcDsKKyMgaWYgZGVmaW5lZChVU0VfUExUX0xJU1QpCisJc3RydWN0IGFyY2hfbGlzdF9lbnRyeSAqcGU7CisjIGVsc2UKKwlzdHJ1Y3QgYXJjaF9zaW5nbGVfZW50cnkgKnBlOworIyBlbmRpZgorI2VuZGlmCisKKwlzd2l0Y2ggKEVMRl9SX1RZUEUocmVsLT5yX2luZm8pKSB7CisKKyNpZiBkZWZpbmVkKF9fYXJtX18pCisKKwkJY2FzZSBSX0FSTV9OT05FOgorCQkJYnJlYWs7CisKKwkJY2FzZSBSX0FSTV9BQlMzMjoKKwkJCSpsb2MgKz0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9BUk1fR09UMzI6CisJCQlnb3RvIGJiX3VzZV9nb3Q7CisKKwkJY2FzZSBSX0FSTV9HT1RQQzoKKwkJCS8qIHJlbGF0aXZlIHJlbG9jLCBhbHdheXMgdG8gX0dMT0JBTF9PRkZTRVRfVEFCTEVfCisJCQkgKiAod2hpY2ggaXMgLmdvdCkgc2ltaWxhciB0byBicmFuY2gsCisJCQkgKiBidXQgaXMgZnVsbCAzMiBiaXRzIHJlbGF0aXZlICovCisKKwkJCSpsb2MgKz0gZ290IC0gZG90OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX0FSTV9QQzI0OgorCQljYXNlIFJfQVJNX1BMVDMyOgorCQkJZ290byBiYl91c2VfcGx0OworCisJCWNhc2UgUl9BUk1fR09UT0ZGOiAvKiBhZGRyZXNzIHJlbGF0aXZlIHRvIHRoZSBnb3QgKi8KKwkJCSpsb2MgKz0gdiAtIGdvdDsKKwkJCWJyZWFrOworCisjZWxpZiBkZWZpbmVkKF9fY3Jpc19fKQorCisJCWNhc2UgUl9DUklTX05PTkU6CisJCQlicmVhazsKKworCQljYXNlIFJfQ1JJU18zMjoKKwkJCS8qIENSSVMga2VlcHMgdGhlIHJlbG9jYXRpb24gdmFsdWUgaW4gdGhlIHJfYWRkZW5kIGZpZWxkIGFuZAorCQkJICogc2hvdWxkIG5vdCB1c2Ugd2hhdHMgaW4gKmxvYyBhdCBhbGwKKwkJCSAqLworCQkJKmxvYyA9IHY7CisJCQlicmVhazsKKworI2VsaWYgZGVmaW5lZChfX0g4MzAwSF9fKSB8fCBkZWZpbmVkKF9fSDgzMDBTX18pCisKKwkJY2FzZSBSX0g4X0RJUjI0Ujg6CisJCQlsb2MgPSAoRWxmVyhBZGRyKSAqKSgoRWxmVyhBZGRyKSlsb2MgLSAxKTsKKwkJCSpsb2MgPSAoKmxvYyAmIDB4ZmYwMDAwMDApIHwgKCgqbG9jICYgMHhmZmZmZmYpICsgdik7CisJCQlicmVhazsKKwkJY2FzZSBSX0g4X0RJUjI0QTg6CisJCQkqbG9jICs9IHY7CisJCQlicmVhazsKKwkJY2FzZSBSX0g4X0RJUjMyOgorCQljYXNlIFJfSDhfRElSMzJBMTY6CisJCQkqbG9jICs9IHY7CisJCQlicmVhazsKKwkJY2FzZSBSX0g4X1BDUkVMMTY6CisJCQl2IC09IGRvdCArIDI7CisJCQlpZiAoKEVsZlcoU3dvcmQpKXYgPiAweDdmZmYKKwkJCSB8fCAoRWxmVyhTd29yZCkpdiA8IC0oRWxmVyhTd29yZCkpMHg4MDAwCisJCQkpIHsKKwkJCQlyZXQgPSBvYmpfcmVsb2Nfb3ZlcmZsb3c7CisJCQl9IGVsc2UgeworCQkJCSoodW5zaWduZWQgc2hvcnQgKilsb2MgPSB2OworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUl9IOF9QQ1JFTDg6CisJCQl2IC09IGRvdCArIDE7CisJCQlpZiAoKEVsZlcoU3dvcmQpKXYgPiAweDdmCisJCQkgfHwgKEVsZlcoU3dvcmQpKXYgPCAtKEVsZlcoU3dvcmQpKTB4ODAKKwkJCSkgeworCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKKwkJCX0gZWxzZSB7CisJCQkJKih1bnNpZ25lZCBjaGFyICopbG9jID0gdjsKKwkJCX0KKwkJCWJyZWFrOworCisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQorCisJCWNhc2UgUl8zODZfTk9ORToKKwkJCWJyZWFrOworCisJCWNhc2UgUl8zODZfMzI6CisJCQkqbG9jICs9IHY7CisJCQlicmVhazsKKworCQljYXNlIFJfMzg2X1BMVDMyOgorCQljYXNlIFJfMzg2X1BDMzI6CisJCWNhc2UgUl8zODZfR09UT0ZGOgorCQkJKmxvYyArPSB2IC0gZG90OworCQkJYnJlYWs7CisKKwkJY2FzZSBSXzM4Nl9HTE9CX0RBVDoKKwkJY2FzZSBSXzM4Nl9KTVBfU0xPVDoKKwkJCSpsb2MgPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSXzM4Nl9SRUxBVElWRToKKwkJCSpsb2MgKz0gZi0+YmFzZWFkZHI7CisJCQlicmVhazsKKworCQljYXNlIFJfMzg2X0dPVFBDOgorCQkJKmxvYyArPSBnb3QgLSBkb3Q7CisJCQlicmVhazsKKworCQljYXNlIFJfMzg2X0dPVDMyOgorCQkJZ290byBiYl91c2VfZ290OworCQkJYnJlYWs7CisKKyNlbGlmIGRlZmluZWQoX19taWNyb2JsYXplX18pCisJCWNhc2UgUl9NSUNST0JMQVpFX05PTkU6CisJCWNhc2UgUl9NSUNST0JMQVpFXzY0X05PTkU6CisJCWNhc2UgUl9NSUNST0JMQVpFXzMyX1NZTV9PUF9TWU06CisJCWNhc2UgUl9NSUNST0JMQVpFXzMyX1BDUkVMOgorCQkJYnJlYWs7CisKKwkJY2FzZSBSX01JQ1JPQkxBWkVfNjRfUENSRUw6IHsKKwkJCS8qIGRvdCBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4KKwkJCSAqIHYgaXMgdGhlIHRhcmdldCBzeW1ib2wgYWRkcmVzcy4KKwkJCSAqIFNvIHdlIG5lZWQgdG8gZXh0cmFjdCB0aGUgb2Zmc2V0IGluIHRoZSBjb2RlLAorCQkJICogYWRkaW5nIHYsIHRoZW4gc3VidHJhdGluZyB0aGUgY3VycmVudCBhZGRyZXNzCisJCQkgKiBvZiB0aGlzIGluc3RydWN0aW9uLgorCQkJICogRXg6ICJJTU0gMHhGRkZFICBicmFsaWQgMHgwMDAwIiA9ICJicmFsaWQgMHhGRkZFMDAwMCIKKwkJCSAqLworCisJCQkvKiBHZXQgc3BsaXQgb2Zmc2V0IHN0b3JlZCBpbiBjb2RlICovCisJCQl1bnNpZ25lZCBpbnQgdGVtcCA9IChsb2NbMF0gJiAweEZGRkYpIDw8IDE2IHwKKwkJCQkJCShsb2NbMV0gJiAweEZGRkYpOworCisJCQkvKiBBZGp1c3QgcmVsYXRpdmUgb2Zmc2V0LiAtNCBhZGp1c3RtZW50IHJlcXVpcmVkCisJCQkgKiBiZWNhdXNlIGRvdCBwb2ludHMgdG8gdGhlIElNTSBpbnNuLCBidXQgYnJhbmNoCisJCQkgKiBpcyBjb21wdXRlZCByZWxhdGl2ZSB0byB0aGUgYnJhbmNoIGluc3RydWN0aW9uIGl0c2VsZi4KKwkJCSAqLworCQkJdGVtcCArPSB2IC0gZG90IC0gNDsKKworCQkJLyogU3RvcmUgYmFjayBpbnRvIGNvZGUgKi8KKwkJCWxvY1swXSA9IChsb2NbMF0gJiAweEZGRkYwMDAwKSB8IHRlbXAgPj4gMTY7CisJCQlsb2NbMV0gPSAobG9jWzFdICYgMHhGRkZGMDAwMCkgfCAodGVtcCAmIDB4RkZGRik7CisKKwkJCWJyZWFrOworCQl9CisKKwkJY2FzZSBSX01JQ1JPQkxBWkVfMzI6CisJCQkqbG9jICs9IHY7CisJCQlicmVhazsKKworCQljYXNlIFJfTUlDUk9CTEFaRV82NDogeworCQkJLyogR2V0IHNwbGl0IHBvaW50ZXIgc3RvcmVkIGluIGNvZGUgKi8KKwkJCXVuc2lnbmVkIGludCB0ZW1wMSA9IChsb2NbMF0gJiAweEZGRkYpIDw8IDE2IHwKKwkJCQkJCShsb2NbMV0gJiAweEZGRkYpOworCisJCQkvKiBBZGQgcmVsb2Mgb2Zmc2V0ICovCisJCQl0ZW1wMSs9djsKKworCQkJLyogU3RvcmUgYmFjayBpbnRvIGNvZGUgKi8KKwkJCWxvY1swXSA9IChsb2NbMF0gJiAweEZGRkYwMDAwKSB8IHRlbXAxID4+IDE2OworCQkJbG9jWzFdID0gKGxvY1sxXSAmIDB4RkZGRjAwMDApIHwgKHRlbXAxICYgMHhGRkZGKTsKKworCQkJYnJlYWs7CisJCX0KKworCQljYXNlIFJfTUlDUk9CTEFaRV8zMl9QQ1JFTF9MTzoKKwkJY2FzZSBSX01JQ1JPQkxBWkVfMzJfTE86CisJCWNhc2UgUl9NSUNST0JMQVpFX1NSTzMyOgorCQljYXNlIFJfTUlDUk9CTEFaRV9TUlczMjoKKwkJCXJldCA9IG9ial9yZWxvY191bmhhbmRsZWQ7CisJCQlicmVhazsKKworI2VsaWYgZGVmaW5lZChfX21jNjgwMDBfXykKKworCQljYXNlIFJfNjhLX05PTkU6CisJCQlicmVhazsKKworCQljYXNlIFJfNjhLXzMyOgorCQkJKmxvYyArPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSXzY4S184OgorCQkJaWYgKHYgPiAweGZmKSB7CisJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJfQorCQkJKihjaGFyICopbG9jID0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl82OEtfMTY6CisJCQlpZiAodiA+IDB4ZmZmZikgeworCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKKwkJCX0KKwkJCSooc2hvcnQgKilsb2MgPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSXzY4S19QQzg6CisJCQl2IC09IGRvdDsKKwkJCWlmICgoRWxmVyhTd29yZCkpdiA+IDB4N2YKKwkJCSB8fCAoRWxmVyhTd29yZCkpdiA8IC0oRWxmVyhTd29yZCkpMHg4MAorCQkJKSB7CisJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJfQorCQkJKihjaGFyICopbG9jID0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl82OEtfUEMxNjoKKwkJCXYgLT0gZG90OworCQkJaWYgKChFbGZXKFN3b3JkKSl2ID4gMHg3ZmZmCisJCQkgfHwgKEVsZlcoU3dvcmQpKXYgPCAtKEVsZlcoU3dvcmQpKTB4ODAwMAorCQkJKSB7CisJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJfQorCQkJKihzaG9ydCAqKWxvYyA9IHY7CisJCQlicmVhazsKKworCQljYXNlIFJfNjhLX1BDMzI6CisJCQkqKGludCAqKWxvYyA9IHYgLSBkb3Q7CisJCQlicmVhazsKKworCQljYXNlIFJfNjhLX0dMT0JfREFUOgorCQljYXNlIFJfNjhLX0pNUF9TTE9UOgorCQkJKmxvYyA9IHY7CisJCQlicmVhazsKKworCQljYXNlIFJfNjhLX1JFTEFUSVZFOgorCQkJKihpbnQgKilsb2MgKz0gZi0+YmFzZWFkZHI7CisJCQlicmVhazsKKworCQljYXNlIFJfNjhLX0dPVDMyOgorCQkJZ290byBiYl91c2VfZ290OworCisjIGlmZGVmIFJfNjhLX0dPVE9GRgorCQljYXNlIFJfNjhLX0dPVE9GRjoKKwkJCSpsb2MgKz0gdiAtIGdvdDsKKwkJCWJyZWFrOworIyBlbmRpZgorCisjZWxpZiBkZWZpbmVkKF9fbWlwc19fKQorCisJCWNhc2UgUl9NSVBTX05PTkU6CisJCQlicmVhazsKKworCQljYXNlIFJfTUlQU18zMjoKKwkJCSpsb2MgKz0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9NSVBTXzI2OgorCQkJaWYgKHYgJSA0KQorCQkJCXJldCA9IG9ial9yZWxvY19kYW5nZXJvdXM7CisJCQlpZiAoKHYgJiAweGYwMDAwMDAwKSAhPSAoKGRvdCArIDQpICYgMHhmMDAwMDAwMCkpCisJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJKmxvYyA9CisJCQkJKCpsb2MgJiB+MHgwM2ZmZmZmZikgfCAoKCpsb2MgKyAodiA+PiAyKSkgJgorCQkJCQkJCQkJCTB4MDNmZmZmZmYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSX01JUFNfSEkxNjoKKwkJCXsKKwkJCQlzdHJ1Y3QgbWlwc19oaTE2ICpuOworCisJCQkJLyogV2UgY2Fubm90IHJlbG9jYXRlIHRoaXMgb25lIG5vdyBiZWNhdXNlIHdlIGRvbid0IGtub3cgdGhlIHZhbHVlCisJCQkJICAgb2YgdGhlIGNhcnJ5IHdlIG5lZWQgdG8gYWRkLiAgU2F2ZSB0aGUgaW5mb3JtYXRpb24sIGFuZCBsZXQgTE8xNgorCQkJCSAgIGRvIHRoZSBhY3R1YWwgcmVsb2NhdGlvbi4gICovCisJCQkJbiA9IHhtYWxsb2Moc2l6ZW9mICpuKTsKKwkJCQluLT5hZGRyID0gbG9jOworCQkJCW4tPnZhbHVlID0gdjsKKwkJCQluLT5uZXh0ID0gaWZpbGUtPm1pcHNfaGkxNl9saXN0OworCQkJCWlmaWxlLT5taXBzX2hpMTZfbGlzdCA9IG47CisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBSX01JUFNfTE8xNjoKKwkJCXsKKwkJCQl1bnNpZ25lZCBsb25nIGluc25sbyA9ICpsb2M7CisJCQkJRWxmVyhBZGRyKSB2YWwsIHZhbGxvOworCisJCQkJLyogU2lnbiBleHRlbmQgdGhlIGFkZGVuZCB3ZSBleHRyYWN0IGZyb20gdGhlIGxvIGluc24uICAqLworCQkJCXZhbGxvID0gKChpbnNubG8gJiAweGZmZmYpIF4gMHg4MDAwKSAtIDB4ODAwMDsKKworCQkJCWlmIChpZmlsZS0+bWlwc19oaTE2X2xpc3QgIT0gTlVMTCkgeworCQkJCQlzdHJ1Y3QgbWlwc19oaTE2ICpsOworCisJCQkJCWwgPSBpZmlsZS0+bWlwc19oaTE2X2xpc3Q7CisJCQkJCXdoaWxlIChsICE9IE5VTEwpIHsKKwkJCQkJCXN0cnVjdCBtaXBzX2hpMTYgKm5leHQ7CisJCQkJCQl1bnNpZ25lZCBsb25nIGluc247CisKKwkJCQkJCS8qIERvIHRoZSBISTE2IHJlbG9jYXRpb24uICBOb3RlIHRoYXQgd2UgYWN0dWFsbHkgZG9uJ3QKKwkJCQkJCSAgIG5lZWQgdG8ga25vdyBhbnl0aGluZyBhYm91dCB0aGUgTE8xNiBpdHNlbGYsIGV4Y2VwdCB3aGVyZQorCQkJCQkJICAgdG8gZmluZCB0aGUgbG93IDE2IGJpdHMgb2YgdGhlIGFkZGVuZCBuZWVkZWQgYnkgdGhlIExPMTYuICAqLworCQkJCQkJaW5zbiA9ICpsLT5hZGRyOworCQkJCQkJdmFsID0KKwkJCQkJCQkoKGluc24gJiAweGZmZmYpIDw8IDE2KSArCisJCQkJCQkJdmFsbG87CisJCQkJCQl2YWwgKz0gdjsKKworCQkJCQkJLyogQWNjb3VudCBmb3IgdGhlIHNpZ24gZXh0ZW5zaW9uIHRoYXQgd2lsbCBoYXBwZW4gaW4gdGhlCisJCQkJCQkgICBsb3cgYml0cy4gICovCisJCQkJCQl2YWwgPQorCQkJCQkJCSgodmFsID4+IDE2KSArCisJCQkJCQkJICgodmFsICYgMHg4MDAwKSAhPQorCQkJCQkJCSAgMCkpICYgMHhmZmZmOworCisJCQkJCQlpbnNuID0gKGluc24gJiB+MHhmZmZmKSB8IHZhbDsKKwkJCQkJCSpsLT5hZGRyID0gaW5zbjsKKworCQkJCQkJbmV4dCA9IGwtPm5leHQ7CisJCQkJCQlmcmVlKGwpOworCQkJCQkJbCA9IG5leHQ7CisJCQkJCX0KKworCQkJCQlpZmlsZS0+bWlwc19oaTE2X2xpc3QgPSBOVUxMOworCQkJCX0KKworCQkJCS8qIE9rLCB3ZSdyZSBkb25lIHdpdGggdGhlIEhJMTYgcmVsb2NzLiAgTm93IGRlYWwgd2l0aCB0aGUgTE8xNi4gICovCisJCQkJdmFsID0gdiArIHZhbGxvOworCQkJCWluc25sbyA9IChpbnNubG8gJiB+MHhmZmZmKSB8ICh2YWwgJiAweGZmZmYpOworCQkJCSpsb2MgPSBpbnNubG87CisJCQkJYnJlYWs7CisJCQl9CisKKyNlbGlmIGRlZmluZWQoX19uaW9zMl9fKQorCisJCWNhc2UgUl9OSU9TMl9OT05FOgorCQkJYnJlYWs7CisKKwkJY2FzZSBSX05JT1MyX0JGRF9SRUxPQ18zMjoKKwkJCSpsb2MgKz0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9OSU9TMl9CRkRfUkVMT0NfMTY6CisJCQlpZiAodiA+IDB4ZmZmZikgeworCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKKwkJCX0KKwkJCSooc2hvcnQgKilsb2MgPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX05JT1MyX0JGRF9SRUxPQ184OgorCQkJaWYgKHYgPiAweGZmKSB7CisJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJfQorCQkJKihjaGFyICopbG9jID0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9OSU9TMl9TMTY6CisJCQl7CisJCQkJRWxmMzJfQWRkciB3b3JkOworCisJCQkJaWYgKChFbGYzMl9Td29yZCl2ID4gMHg3ZmZmCisJCQkJIHx8IChFbGYzMl9Td29yZCl2IDwgLShFbGYzMl9Td29yZCkweDgwMDAKKwkJCQkpIHsKKwkJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJCX0KKworCQkJCXdvcmQgPSAqbG9jOworCQkJCSpsb2MgPSAoKCgod29yZCA+PiAyMikgPDwgMTYpIHwgKHYgJiAweGZmZmYpKSA8PCA2KSB8CisJCQkJICAgICAgICh3b3JkICYgMHgzZik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJfTklPUzJfVTE2OgorCQkJeworCQkJCUVsZjMyX0FkZHIgd29yZDsKKworCQkJCWlmICh2ID4gMHhmZmZmKSB7CisJCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKKwkJCQl9CisKKwkJCQl3b3JkID0gKmxvYzsKKwkJCQkqbG9jID0gKCgoKHdvcmQgPj4gMjIpIDw8IDE2KSB8ICh2ICYgMHhmZmZmKSkgPDwgNikgfAorCQkJCSAgICAgICAod29yZCAmIDB4M2YpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSX05JT1MyX1BDUkVMMTY6CisJCQl7CisJCQkJRWxmMzJfQWRkciB3b3JkOworCisJCQkJdiAtPSBkb3QgKyA0OworCQkJCWlmICgoRWxmMzJfU3dvcmQpdiA+IDB4N2ZmZgorCQkJCSB8fCAoRWxmMzJfU3dvcmQpdiA8IC0oRWxmMzJfU3dvcmQpMHg4MDAwCisJCQkJKSB7CisJCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKKwkJCQl9CisKKwkJCQl3b3JkID0gKmxvYzsKKwkJCQkqbG9jID0gKCgoKHdvcmQgPj4gMjIpIDw8IDE2KSB8ICh2ICYgMHhmZmZmKSkgPDwgNikgfCAod29yZCAmIDB4M2YpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSX05JT1MyX0dQUkVMOgorCQkJeworCQkJCUVsZjMyX0FkZHIgd29yZCwgZ3A7CisJCQkJLyogZ2V0IF9ncCAqLworCQkJCWdwID0gb2JqX3N5bWJvbF9maW5hbF92YWx1ZShmLCBvYmpfZmluZF9zeW1ib2woZiwgU1BGWCAiX2dwIikpOworCQkJCXYgLT0gZ3A7CisJCQkJaWYgKChFbGYzMl9Td29yZCl2ID4gMHg3ZmZmCisJCQkJIHx8IChFbGYzMl9Td29yZCl2IDwgLShFbGYzMl9Td29yZCkweDgwMDAKKwkJCQkpIHsKKwkJCQkJcmV0ID0gb2JqX3JlbG9jX292ZXJmbG93OworCQkJCX0KKworCQkJCXdvcmQgPSAqbG9jOworCQkJCSpsb2MgPSAoKCgod29yZCA+PiAyMikgPDwgMTYpIHwgKHYgJiAweGZmZmYpKSA8PCA2KSB8ICh3b3JkICYgMHgzZik7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFJfTklPUzJfQ0FMTDI2OgorCQkJaWYgKHYgJiAzKQorCQkJCXJldCA9IG9ial9yZWxvY19kYW5nZXJvdXM7CisJCQlpZiAoKHYgPj4gMjgpICE9IChkb3QgPj4gMjgpKQorCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKKwkJCSpsb2MgPSAoKmxvYyAmIDB4M2YpIHwgKCh2ID4+IDIpIDw8IDYpOworCQkJYnJlYWs7CisKKwkJY2FzZSBSX05JT1MyX0lNTTU6CisJCQl7CisJCQkJRWxmMzJfQWRkciB3b3JkOworCisJCQkJaWYgKHYgPiAweDFmKSB7CisJCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKKwkJCQl9CisKKwkJCQl3b3JkID0gKmxvYyAmIH4weDdjMDsKKwkJCQkqbG9jID0gd29yZCB8ICgodiAmIDB4MWYpIDw8IDYpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSX05JT1MyX0lNTTY6CisJCQl7CisJCQkJRWxmMzJfQWRkciB3b3JkOworCisJCQkJaWYgKHYgPiAweDNmKSB7CisJCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKKwkJCQl9CisKKwkJCQl3b3JkID0gKmxvYyAmIH4weGZjMDsKKwkJCQkqbG9jID0gd29yZCB8ICgodiAmIDB4M2YpIDw8IDYpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSX05JT1MyX0lNTTg6CisJCQl7CisJCQkJRWxmMzJfQWRkciB3b3JkOworCisJCQkJaWYgKHYgPiAweGZmKSB7CisJCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsKKwkJCQl9CisKKwkJCQl3b3JkID0gKmxvYyAmIH4weDNmYzA7CisJCQkJKmxvYyA9IHdvcmQgfCAoKHYgJiAweGZmKSA8PCA2KTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUl9OSU9TMl9ISTE2OgorCQkJeworCQkJCUVsZjMyX0FkZHIgd29yZDsKKworCQkJCXdvcmQgPSAqbG9jOworCQkJCSpsb2MgPSAoKCgod29yZCA+PiAyMikgPDwgMTYpIHwgKCh2ID4+MTYpICYgMHhmZmZmKSkgPDwgNikgfAorCQkJCSAgICAgICAod29yZCAmIDB4M2YpOworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSX05JT1MyX0xPMTY6CisJCQl7CisJCQkJRWxmMzJfQWRkciB3b3JkOworCisJCQkJd29yZCA9ICpsb2M7CisJCQkJKmxvYyA9ICgoKCh3b3JkID4+IDIyKSA8PCAxNikgfCAodiAmIDB4ZmZmZikpIDw8IDYpIHwKKwkJCQkgICAgICAgKHdvcmQgJiAweDNmKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgUl9OSU9TMl9ISUFESjE2OgorCQkJeworCQkJCUVsZjMyX0FkZHIgd29yZDEsIHdvcmQyOworCisJCQkJd29yZDEgPSAqbG9jOworCQkJCXdvcmQyID0gKCh2ID4+IDE2KSArICgodiA+PiAxNSkgJiAxKSkgJiAweGZmZmY7CisJCQkJKmxvYyA9ICgoKCh3b3JkMSA+PiAyMikgPDwgMTYpIHwgd29yZDIpIDw8IDYpIHwKKwkJCQkgICAgICAgKHdvcmQxICYgMHgzZik7CisJCQl9CisJCQlicmVhazsKKworI2VsaWYgZGVmaW5lZChfX3Bvd2VycGM2NF9fKQorCQkvKiBQUEM2NCBuZWVkcyBhIDIuNiBrZXJuZWwsIDIuNCBtb2R1bGUgcmVsb2NhdGlvbiBpcnJlbGV2YW50ICovCisKKyNlbGlmIGRlZmluZWQoX19wb3dlcnBjX18pCisKKwkJY2FzZSBSX1BQQ19BRERSMTZfSEE6CisJCQkqKHVuc2lnbmVkIHNob3J0ICopbG9jID0gKHYgKyAweDgwMDApID4+IDE2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1BQQ19BRERSMTZfSEk6CisJCQkqKHVuc2lnbmVkIHNob3J0ICopbG9jID0gdiA+PiAxNjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9QUENfQUREUjE2X0xPOgorCQkJKih1bnNpZ25lZCBzaG9ydCAqKWxvYyA9IHY7CisJCQlicmVhazsKKworCQljYXNlIFJfUFBDX1JFTDI0OgorCQkJZ290byBiYl91c2VfcGx0OworCisJCWNhc2UgUl9QUENfUkVMMzI6CisJCQkqbG9jID0gdiAtIGRvdDsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9QUENfQUREUjMyOgorCQkJKmxvYyA9IHY7CisJCQlicmVhazsKKworI2VsaWYgZGVmaW5lZChfX3MzOTBfXykKKworCQljYXNlIFJfMzkwXzMyOgorCQkJKih1bnNpZ25lZCBpbnQgKikgbG9jICs9IHY7CisJCQlicmVhazsKKwkJY2FzZSBSXzM5MF8xNjoKKwkJCSoodW5zaWduZWQgc2hvcnQgKikgbG9jICs9IHY7CisJCQlicmVhazsKKwkJY2FzZSBSXzM5MF84OgorCQkJKih1bnNpZ25lZCBjaGFyICopIGxvYyArPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSXzM5MF9QQzMyOgorCQkJKih1bnNpZ25lZCBpbnQgKikgbG9jICs9IHYgLSBkb3Q7CisJCQlicmVhazsKKwkJY2FzZSBSXzM5MF9QQzE2REJMOgorCQkJKih1bnNpZ25lZCBzaG9ydCAqKSBsb2MgKz0gKHYgLSBkb3QpID4+IDE7CisJCQlicmVhazsKKwkJY2FzZSBSXzM5MF9QQzE2OgorCQkJKih1bnNpZ25lZCBzaG9ydCAqKSBsb2MgKz0gdiAtIGRvdDsKKwkJCWJyZWFrOworCisJCWNhc2UgUl8zOTBfUExUMzI6CisJCWNhc2UgUl8zOTBfUExUMTZEQkw6CisJCQkvKiBmaW5kIHRoZSBwbHQgZW50cnkgYW5kIGluaXRpYWxpemUgaXQuICAqLworCQkJcGUgPSAoc3RydWN0IGFyY2hfc2luZ2xlX2VudHJ5ICopICZpc3ltLT5wbHRlbnQ7CisJCQlpZiAocGUtPmluaXRlZCA9PSAwKSB7CisJCQkJaXAgPSAodW5zaWduZWQgbG9uZyAqKShpZmlsZS0+cGx0LT5jb250ZW50cyArIHBlLT5vZmZzZXQpOworCQkJCWlwWzBdID0gMHgwZDEwNTgxMDsgLyogYmFzciAxLDA7IGxnIDEsMTAoMSk7IGJyIDEgKi8KKwkJCQlpcFsxXSA9IDB4MTAwNjA3ZjE7CisJCQkJaWYgKEVMRl9SX1RZUEUocmVsLT5yX2luZm8pID09IFJfMzkwX1BMVDE2REJMKQorCQkJCQlpcFsyXSA9IHYgLSAyOworCQkJCWVsc2UKKwkJCQkJaXBbMl0gPSB2OworCQkJCXBlLT5pbml0ZWQgPSAxOworCQkJfQorCisJCQkvKiBJbnNlcnQgcmVsYXRpdmUgZGlzdGFuY2UgdG8gdGFyZ2V0LiAgKi8KKwkJCXYgPSBwbHQgKyBwZS0+b2Zmc2V0IC0gZG90OworCQkJaWYgKEVMRl9SX1RZUEUocmVsLT5yX2luZm8pID09IFJfMzkwX1BMVDMyKQorCQkJCSoodW5zaWduZWQgaW50ICopIGxvYyA9ICh1bnNpZ25lZCBpbnQpIHY7CisJCQllbHNlIGlmIChFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSA9PSBSXzM5MF9QTFQxNkRCTCkKKwkJCQkqKHVuc2lnbmVkIHNob3J0ICopIGxvYyA9ICh1bnNpZ25lZCBzaG9ydCkgKCh2ICsgMikgPj4gMSk7CisJCQlicmVhazsKKworCQljYXNlIFJfMzkwX0dMT0JfREFUOgorCQljYXNlIFJfMzkwX0pNUF9TTE9UOgorCQkJKmxvYyA9IHY7CisJCQlicmVhazsKKworCQljYXNlIFJfMzkwX1JFTEFUSVZFOgorCQkJKmxvYyArPSBmLT5iYXNlYWRkcjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl8zOTBfR09UUEM6CisJCQkqKHVuc2lnbmVkIGxvbmcgKikgbG9jICs9IGdvdCAtIGRvdDsKKwkJCWJyZWFrOworCisJCWNhc2UgUl8zOTBfR09UMTI6CisJCWNhc2UgUl8zOTBfR09UMTY6CisJCWNhc2UgUl8zOTBfR09UMzI6CisJCQlpZiAoIWlzeW0tPmdvdGVudC5pbml0ZWQpCisJCQl7CisJCQkJaXN5bS0+Z290ZW50LmluaXRlZCA9IDE7CisJCQkJKihFbGZXKEFkZHIpICopKGlmaWxlLT5nb3QtPmNvbnRlbnRzICsgaXN5bS0+Z290ZW50Lm9mZnNldCkgPSB2OworCQkJfQorCQkJaWYgKEVMRl9SX1RZUEUocmVsLT5yX2luZm8pID09IFJfMzkwX0dPVDEyKQorCQkJCSoodW5zaWduZWQgc2hvcnQgKikgbG9jIHw9ICgqKHVuc2lnbmVkIHNob3J0ICopIGxvYyArIGlzeW0tPmdvdGVudC5vZmZzZXQpICYgMHhmZmY7CisJCQllbHNlIGlmIChFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSA9PSBSXzM5MF9HT1QxNikKKwkJCQkqKHVuc2lnbmVkIHNob3J0ICopIGxvYyArPSBpc3ltLT5nb3RlbnQub2Zmc2V0OworCQkJZWxzZSBpZiAoRUxGX1JfVFlQRShyZWwtPnJfaW5mbykgPT0gUl8zOTBfR09UMzIpCisJCQkJKih1bnNpZ25lZCBpbnQgKikgbG9jICs9IGlzeW0tPmdvdGVudC5vZmZzZXQ7CisJCQlicmVhazsKKworIyBpZm5kZWYgUl8zOTBfR09UT0ZGMzIKKyMgIGRlZmluZSBSXzM5MF9HT1RPRkYzMiBSXzM5MF9HT1RPRkYKKyMgZW5kaWYKKwkJY2FzZSBSXzM5MF9HT1RPRkYzMjoKKwkJCSpsb2MgKz0gdiAtIGdvdDsKKwkJCWJyZWFrOworCisjZWxpZiBkZWZpbmVkKF9fc2hfXykKKworCQljYXNlIFJfU0hfTk9ORToKKwkJCWJyZWFrOworCisJCWNhc2UgUl9TSF9ESVIzMjoKKwkJCSpsb2MgKz0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9TSF9SRUwzMjoKKwkJCSpsb2MgKz0gdiAtIGRvdDsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9TSF9QTFQzMjoKKwkJCSpsb2MgPSB2IC0gZG90OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1NIX0dMT0JfREFUOgorCQljYXNlIFJfU0hfSk1QX1NMT1Q6CisJCQkqbG9jID0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9TSF9SRUxBVElWRToKKwkJCSpsb2MgPSBmLT5iYXNlYWRkciArIHJlbC0+cl9hZGRlbmQ7CisJCQlicmVhazsKKworCQljYXNlIFJfU0hfR09UUEM6CisJCQkqbG9jID0gZ290IC0gZG90ICsgcmVsLT5yX2FkZGVuZDsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9TSF9HT1QzMjoKKwkJCWdvdG8gYmJfdXNlX2dvdDsKKworCQljYXNlIFJfU0hfR09UT0ZGOgorCQkJKmxvYyA9IHYgLSBnb3Q7CisJCQlicmVhazsKKworIyBpZiBkZWZpbmVkKF9fU0g1X18pCisJCWNhc2UgUl9TSF9JTU1fTUVETE9XMTY6CisJCWNhc2UgUl9TSF9JTU1fTE9XMTY6CisJCQl7CisJCQkJRWxmVyhBZGRyKSB3b3JkOworCisJCQkJaWYgKEVMRl9SX1RZUEUocmVsLT5yX2luZm8pID09IFJfU0hfSU1NX01FRExPVzE2KQorCQkJCQl2ID4+PSAxNjsKKworCQkJCS8qCisJCQkJICogIG1vdmkgYW5kIHNob3JpIGhhdmUgdGhlIGZvcm1hdDoKKwkJCQkgKgorCQkJCSAqICB8ICBvcCAgfCBpbW0gIHwgcmVnIHwgcmVzZXJ2ZWQgfAorCQkJCSAqICAgMzEuLjI2IDI1Li4xMCA5Li4gNCAzICAgLi4gICAwCisJCQkJICoKKwkJCQkgKiBzbyB3ZSBzaW1wbHkgbWFzayBhbmQgb3IgaW4gaW1tLgorCQkJCSAqLworCQkJCXdvcmQgPSAqbG9jICYgfjB4M2ZmZmMwMDsKKwkJCQl3b3JkIHw9ICh2ICYgMHhmZmZmKSA8PCAxMDsKKworCQkJCSpsb2MgPSB3b3JkOworCisJCQkJYnJlYWs7CisJCQl9CisKKwkJY2FzZSBSX1NIX0lNTV9NRURMT1cxNl9QQ1JFTDoKKwkJY2FzZSBSX1NIX0lNTV9MT1cxNl9QQ1JFTDoKKwkJCXsKKwkJCQlFbGZXKEFkZHIpIHdvcmQ7CisKKwkJCQl3b3JkID0gKmxvYyAmIH4weDNmZmZjMDA7CisKKwkJCQl2IC09IGRvdDsKKworCQkJCWlmIChFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSA9PSBSX1NIX0lNTV9NRURMT1cxNl9QQ1JFTCkKKwkJCQkJdiA+Pj0gMTY7CisKKwkJCQl3b3JkIHw9ICh2ICYgMHhmZmZmKSA8PCAxMDsKKworCQkJCSpsb2MgPSB3b3JkOworCisJCQkJYnJlYWs7CisJCQl9CisjIGVuZGlmIC8qIF9fU0g1X18gKi8KKworI2VsaWYgZGVmaW5lZChfX3Y4NTBlX18pCisKKwkJY2FzZSBSX1Y4NTBfTk9ORToKKwkJCWJyZWFrOworCisJCWNhc2UgUl9WODUwXzMyOgorCQkJLyogV2Ugd3JpdGUgdHdvIHNob3J0cyBpbnN0ZWFkIG9mIGEgbG9uZyBiZWNhdXNlIGV2ZW4KKwkJCSAgIDMyLWJpdCBpbnNucyBvbmx5IG5lZWQgaGFsZi13b3JkIGFsaWdubWVudCwgYnV0CisJCQkgICAzMi1iaXQgZGF0YSBuZWVkcyB0byBiZSBsb25nLXdvcmQgYWxpZ25lZC4gICovCisJCQl2ICs9ICgodW5zaWduZWQgc2hvcnQgKilsb2MpWzBdOworCQkJdiArPSAoKHVuc2lnbmVkIHNob3J0ICopbG9jKVsxXSA8PCAxNjsKKwkJCSgodW5zaWduZWQgc2hvcnQgKilsb2MpWzBdID0gdiAmIDB4ZmZmZjsKKwkJCSgodW5zaWduZWQgc2hvcnQgKilsb2MpWzFdID0gKHYgPj4gMTYpICYgMHhmZmZmOworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1Y4NTBfMjJfUENSRUw6CisJCQlnb3RvIGJiX3VzZV9wbHQ7CisKKyNlbGlmIGRlZmluZWQoX194ODZfNjRfXykKKworCQljYXNlIFJfWDg2XzY0X05PTkU6CisJCQlicmVhazsKKworCQljYXNlIFJfWDg2XzY0XzY0OgorCQkJKmxvYyArPSB2OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1g4Nl82NF8zMjoKKwkJCSoodW5zaWduZWQgaW50ICopIGxvYyArPSB2OworCQkJaWYgKHYgPiAweGZmZmZmZmZmKQorCQkJeworCQkJCXJldCA9IG9ial9yZWxvY19vdmVyZmxvdzsgLyogS2VybmVsIG1vZHVsZSBjb21waWxlZCB3aXRob3V0IC1tY21vZGVsPWtlcm5lbC4gKi8KKwkJCQkvKiBlcnJvcigiUG9zc2libHkgaXMgbW9kdWxlIGNvbXBpbGVkIHdpdGhvdXQgLW1jbW9kZWw9a2VybmVsISIpOyAqLworCQkJfQorCQkJYnJlYWs7CisKKwkJY2FzZSBSX1g4Nl82NF8zMlM6CisJCQkqKHNpZ25lZCBpbnQgKikgbG9jICs9IHY7CisJCQlicmVhazsKKworCQljYXNlIFJfWDg2XzY0XzE2OgorCQkJKih1bnNpZ25lZCBzaG9ydCAqKSBsb2MgKz0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9YODZfNjRfODoKKwkJCSoodW5zaWduZWQgY2hhciAqKSBsb2MgKz0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9YODZfNjRfUEMzMjoKKwkJCSoodW5zaWduZWQgaW50ICopIGxvYyArPSB2IC0gZG90OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1g4Nl82NF9QQzE2OgorCQkJKih1bnNpZ25lZCBzaG9ydCAqKSBsb2MgKz0gdiAtIGRvdDsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9YODZfNjRfUEM4OgorCQkJKih1bnNpZ25lZCBjaGFyICopIGxvYyArPSB2IC0gZG90OworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1g4Nl82NF9HTE9CX0RBVDoKKwkJY2FzZSBSX1g4Nl82NF9KVU1QX1NMT1Q6CisJCQkqbG9jID0gdjsKKwkJCWJyZWFrOworCisJCWNhc2UgUl9YODZfNjRfUkVMQVRJVkU6CisJCQkqbG9jICs9IGYtPmJhc2VhZGRyOworCQkJYnJlYWs7CisKKwkJY2FzZSBSX1g4Nl82NF9HT1QzMjoKKwkJY2FzZSBSX1g4Nl82NF9HT1RQQ1JFTDoKKwkJCWdvdG8gYmJfdXNlX2dvdDsKKyMgaWYgMAorCQkJaWYgKCFpc3ltLT5nb3RlbnQucmVsb2NfZG9uZSkKKwkJCXsKKwkJCQlpc3ltLT5nb3RlbnQucmVsb2NfZG9uZSA9IDE7CisJCQkJKihFbGY2NF9BZGRyICopKGlmaWxlLT5nb3QtPmNvbnRlbnRzICsgaXN5bS0+Z290ZW50Lm9mZnNldCkgPSB2OworCQkJfQorCQkJLyogWFhYIGFyZSB0aGVzZSByZWFsbHkgY29ycmVjdD8gICovCisJCQlpZiAoRUxGNjRfUl9UWVBFKHJlbC0+cl9pbmZvKSA9PSBSX1g4Nl82NF9HT1RQQ1JFTCkKKwkJCQkqKHVuc2lnbmVkIGludCAqKSBsb2MgKz0gdiArIGlzeW0tPmdvdGVudC5vZmZzZXQ7CisJCQllbHNlCisJCQkJKmxvYyArPSBpc3ltLT5nb3RlbnQub2Zmc2V0OworCQkJYnJlYWs7CisjIGVuZGlmCisKKyNlbHNlCisjIHdhcm5pbmcgIm5vIGlkZWEgaG93IHRvIGhhbmRsZSByZWxvY2F0aW9ucyBvbiB5b3VyIGFyY2giCisjZW5kaWYKKworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCJXYXJuaW5nOiB1bmhhbmRsZWQgcmVsb2MgJWRcbiIsIChpbnQpRUxGX1JfVFlQRShyZWwtPnJfaW5mbykpOworCQkJcmV0ID0gb2JqX3JlbG9jX3VuaGFuZGxlZDsKKwkJCWJyZWFrOworCisjaWYgZGVmaW5lZChVU0VfUExUX0VOVFJJRVMpCisKK2JiX3VzZV9wbHQ6CisKKwkJCS8qIGZpbmQgdGhlIHBsdCBlbnRyeSBhbmQgaW5pdGlhbGl6ZSBpdCBpZiBuZWNlc3NhcnkgKi8KKworI2lmIGRlZmluZWQoVVNFX1BMVF9MSVNUKQorCQkJZm9yIChwZSA9IGlzeW0tPnBsdGVudDsgcGUgIT0gTlVMTCAmJiBwZS0+YWRkZW5kICE9IHJlbC0+cl9hZGRlbmQ7KQorCQkJCXBlID0gcGUtPm5leHQ7CisjZWxzZQorCQkJcGUgPSAmaXN5bS0+cGx0ZW50OworI2VuZGlmCisKKwkJCWlmICghIHBlLT5pbml0ZWQpIHsKKwkJCQlpcCA9ICh1bnNpZ25lZCBsb25nICopIChpZmlsZS0+cGx0LT5jb250ZW50cyArIHBlLT5vZmZzZXQpOworCisJCQkJLyogZ2VuZXJhdGUgc29tZSBtYWNoaW5lIGNvZGUgKi8KKworI2lmIGRlZmluZWQoX19hcm1fXykKKwkJCQlpcFswXSA9IDB4ZTUxZmYwMDQ7CQkJLyogbGRyIHBjLFtwYywjLTRdICovCisJCQkJaXBbMV0gPSB2OwkJCQkvKiBzeW1AICovCisjZW5kaWYKKyNpZiBkZWZpbmVkKF9fcG93ZXJwY19fKQorCQkJCWlwWzBdID0gMHgzZDYwMDAwMCArICgodiArIDB4ODAwMCkgPj4gMTYpOyAgLyogbGlzIHIxMSxzeW1AaGEgKi8KKwkJCQlpcFsxXSA9IDB4Mzk2YjAwMDAgKyAodiAmIDB4ZmZmZik7ICAgICAgICAgIC8qIGFkZGkgcjExLHIxMSxzeW1AbCAqLworCQkJCWlwWzJdID0gMHg3ZDY5MDNhNjsJCQkgICAgICAvKiBtdGN0ciByMTEgKi8KKwkJCQlpcFszXSA9IDB4NGU4MDA0MjA7CQkJICAgICAgLyogYmN0ciAqLworI2VuZGlmCisjaWYgZGVmaW5lZChfX3Y4NTBlX18pCisJCQkJLyogV2UgaGF2ZSB0byB0cmFzaCBhIHJlZ2lzdGVyLCBzbyB3ZSBhc3N1bWUgdGhhdCBhbnkgY29udHJvbAorCQkJCSAgIHRyYW5zZmVyIG1vcmUgdGhhbiAyMS1iaXRzIGF3YXkgbXVzdCBiZSBhIGZ1bmN0aW9uIGNhbGwKKwkJCQkgICAoc28gd2UgY2FuIHVzZSBhIGNhbGwtY2xvYmJlcmVkIHJlZ2lzdGVyKS4gICovCisJCQkJaXBbMF0gPSAweDA2MjEgKyAoKHYgJiAweGZmZmYpIDw8IDE2KTsgICAvKiBtb3Ygc3ltLCByMSAuLi4gKi8KKwkJCQlpcFsxXSA9ICgodiA+PiAxNikgJiAweGZmZmYpICsgMHg2MTAwMDA7IC8qIC4uLjsgam1wIHIxICovCisjZW5kaWYKKwkJCQlwZS0+aW5pdGVkID0gMTsKKwkJCX0KKworCQkJLyogcmVsYXRpdmUgZGlzdGFuY2UgdG8gdGFyZ2V0ICovCisJCQl2IC09IGRvdDsKKwkJCS8qIGlmIHRoZSB0YXJnZXQgaXMgdG9vIGZhciBhd2F5Li4uLiAqLworI2lmIGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX3Bvd2VycGNfXykKKwkJCWlmICgoaW50KXYgPCAtMHgwMjAwMDAwMCB8fCAoaW50KXYgPj0gMHgwMjAwMDAwMCkKKyNlbGlmIGRlZmluZWQoX192ODUwZV9fKQorCQkJCWlmICgoRWxmVyhTd29yZCkpdiA+IDB4MWZmZmZmIHx8IChFbGZXKFN3b3JkKSl2IDwgKEVsZlcoU3dvcmQpKS0weDIwMDAwMCkKKyNlbmRpZgorCQkJCQkvKiBnbyB2aWEgdGhlIHBsdCAqLworCQkJCQl2ID0gcGx0ICsgcGUtPm9mZnNldCAtIGRvdDsKKworI2lmIGRlZmluZWQoX192ODUwZV9fKQorCQkJaWYgKHYgJiAxKQorI2Vsc2UKKwkJCQlpZiAodiAmIDMpCisjZW5kaWYKKwkJCQkJcmV0ID0gb2JqX3JlbG9jX2Rhbmdlcm91czsKKworCQkJLyogbWVyZ2UgdGhlIG9mZnNldCBpbnRvIHRoZSBpbnN0cnVjdGlvbi4gKi8KKyNpZiBkZWZpbmVkKF9fYXJtX18pCisJCQkvKiBDb252ZXJ0IHRvIHdvcmRzLiAqLworCQkJdiA+Pj0gMjsKKworCQkJKmxvYyA9ICgqbG9jICYgfjB4MDBmZmZmZmYpIHwgKCh2ICsgKmxvYykgJiAweDAwZmZmZmZmKTsKKyNlbmRpZgorI2lmIGRlZmluZWQoX19wb3dlcnBjX18pCisJCQkqbG9jID0gKCpsb2MgJiB+MHgwM2ZmZmZmYykgfCAodiAmIDB4MDNmZmZmZmMpOworI2VuZGlmCisjaWYgZGVmaW5lZChfX3Y4NTBlX18pCisJCQkvKiBXZSB3cml0ZSB0d28gc2hvcnRzIGluc3RlYWQgb2YgYSBsb25nIGJlY2F1c2UgZXZlbiAzMi1iaXQgaW5zbnMKKwkJCSAgIG9ubHkgbmVlZCBoYWxmLXdvcmQgYWxpZ25tZW50LCBidXQgdGhlIDMyLWJpdCBkYXRhIHdyaXRlIG5lZWRzCisJCQkgICB0byBiZSBsb25nLXdvcmQgYWxpZ25lZC4gICovCisJCQkoKHVuc2lnbmVkIHNob3J0ICopbG9jKVswXSA9CisJCQkJKCoodW5zaWduZWQgc2hvcnQgKilsb2MgJiAweGZmYzApIC8qIG9wY29kZSArIHJlZyAqLworCQkJCXwgKCh2ID4+IDE2KSAmIDB4M2YpOyAgICAgICAgICAgICAvKiBvZmZzIGhpZ2ggcGFydCAqLworCQkJKCh1bnNpZ25lZCBzaG9ydCAqKWxvYylbMV0gPQorCQkJCSh2ICYgMHhmZmZmKTsgICAgICAgICAgICAgICAgICAgIC8qIG9mZnMgbG93IHBhcnQgKi8KKyNlbmRpZgorCQkJYnJlYWs7CisjZW5kaWYgLyogVVNFX1BMVF9FTlRSSUVTICovCisKKyNpZiBkZWZpbmVkKFVTRV9HT1RfRU5UUklFUykKK2JiX3VzZV9nb3Q6CisKKwkJCS8qIG5lZWRzIGFuIGVudHJ5IGluIHRoZSAuZ290OiBzZXQgaXQsIG9uY2UgKi8KKwkJCWlmICghaXN5bS0+Z290ZW50LmluaXRlZCkgeworCQkJCWlzeW0tPmdvdGVudC5pbml0ZWQgPSAxOworCQkJCSooRWxmVyhBZGRyKSAqKSAoaWZpbGUtPmdvdC0+Y29udGVudHMgKyBpc3ltLT5nb3RlbnQub2Zmc2V0KSA9IHY7CisJCQl9CisJCQkvKiBtYWtlIHRoZSByZWxvYyB3aXRoX3Jlc3BlY3RfdG9fLmdvdCAqLworI2lmIGRlZmluZWQoX19zaF9fKQorCQkJKmxvYyArPSBpc3ltLT5nb3RlbnQub2Zmc2V0ICsgcmVsLT5yX2FkZGVuZDsKKyNlbGlmIGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19hcm1fXykgfHwgZGVmaW5lZChfX21jNjgwMDBfXykKKwkJCSpsb2MgKz0gaXN5bS0+Z290ZW50Lm9mZnNldDsKKyNlbmRpZgorCQkJYnJlYWs7CisKKyNlbmRpZiAvKiBVU0VfR09UX0VOVFJJRVMgKi8KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisKKyNpZiBkZWZpbmVkKFVTRV9MSVNUKQorCitzdGF0aWMgaW50IGFyY2hfbGlzdF9hZGQoRWxmVyhSZWxNKSAqcmVsLCBzdHJ1Y3QgYXJjaF9saXN0X2VudHJ5ICoqbGlzdCwKKwkJCSAgaW50IG9mZnNldCwgaW50IHNpemUpCit7CisJc3RydWN0IGFyY2hfbGlzdF9lbnRyeSAqcGU7CisKKwlmb3IgKHBlID0gKmxpc3Q7IHBlICE9IE5VTEw7IHBlID0gcGUtPm5leHQpIHsKKwkJaWYgKHBlLT5hZGRlbmQgPT0gcmVsLT5yX2FkZGVuZCkgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAocGUgPT0gTlVMTCkgeworCQlwZSA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhcmNoX2xpc3RfZW50cnkpKTsKKwkJcGUtPm5leHQgPSAqbGlzdDsKKwkJcGUtPmFkZGVuZCA9IHJlbC0+cl9hZGRlbmQ7CisJCXBlLT5vZmZzZXQgPSBvZmZzZXQ7CisJCS8qcGUtPmluaXRlZCA9IDA7Ki8KKwkJKmxpc3QgPSBwZTsKKwkJcmV0dXJuIHNpemU7CisJfQorCXJldHVybiAwOworfQorCisjZW5kaWYKKworI2lmIGRlZmluZWQoVVNFX1NJTkdMRSkKKworc3RhdGljIGludCBhcmNoX3NpbmdsZV9pbml0KC8qRWxmVyhSZWxNKSAqcmVsLCovIHN0cnVjdCBhcmNoX3NpbmdsZV9lbnRyeSAqc2luZ2xlLAorCQlpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkKK3sKKwlpZiAoc2luZ2xlLT5hbGxvY2F0ZWQgPT0gMCkgeworCQlzaW5nbGUtPmFsbG9jYXRlZCA9IDE7CisJCXNpbmdsZS0+b2Zmc2V0ID0gb2Zmc2V0OworCQlzaW5nbGUtPmluaXRlZCA9IDA7CisJCXJldHVybiBzaXplOworCX0KKwlyZXR1cm4gMDsKK30KKworI2VuZGlmCisKKyNpZiBkZWZpbmVkKFVTRV9HT1RfRU5UUklFUykgfHwgZGVmaW5lZChVU0VfUExUX0VOVFJJRVMpCisKK3N0YXRpYyBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKmFyY2hfeHNlY3RfaW5pdChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNvbnN0IGNoYXIgKm5hbWUsCisJCWludCBvZmZzZXQsIGludCBzaXplKQoreworCXN0cnVjdCBvYmpfc2VjdGlvbiAqbXlyZWxzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsIG5hbWUpOworCisJaWYgKG9mZnNldCA9PSAwKSB7CisJCW9mZnNldCArPSBzaXplOworCX0KKworCWlmIChteXJlbHNlYykgeworCQlvYmpfZXh0ZW5kX3NlY3Rpb24obXlyZWxzZWMsIG9mZnNldCk7CisJfSBlbHNlIHsKKwkJbXlyZWxzZWMgPSBvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbihmLCBuYW1lLAorCQkJCXNpemUsIG9mZnNldCk7CisJfQorCisJcmV0dXJuIG15cmVsc2VjOworfQorCisjZW5kaWYKKworc3RhdGljIHZvaWQgYXJjaF9jcmVhdGVfZ290KHN0cnVjdCBvYmpfZmlsZSAqZikKK3sKKyNpZiBkZWZpbmVkKFVTRV9HT1RfRU5UUklFUykgfHwgZGVmaW5lZChVU0VfUExUX0VOVFJJRVMpCisJc3RydWN0IGFyY2hfZmlsZSAqaWZpbGUgPSAoc3RydWN0IGFyY2hfZmlsZSAqKSBmOworCWludCBpOworI2lmIGRlZmluZWQoVVNFX0dPVF9FTlRSSUVTKQorCWludCBnb3Rfb2Zmc2V0ID0gMCwgZ290X25lZWRlZCA9IDAsIGdvdF9hbGxvY2F0ZTsKKyNlbmRpZgorI2lmIGRlZmluZWQoVVNFX1BMVF9FTlRSSUVTKQorCWludCBwbHRfb2Zmc2V0ID0gMCwgcGx0X25lZWRlZCA9IDAsIHBsdF9hbGxvY2F0ZTsKKyNlbmRpZgorCXN0cnVjdCBvYmpfc2VjdGlvbiAqcmVsc2VjLCAqc3ltc2VjLCAqc3Ryc2VjOworCUVsZlcoUmVsTSkgKnJlbCwgKnJlbGVuZDsKKwlFbGZXKFN5bSkgKnN5bXRhYiwgKmV4dHN5bTsKKwljb25zdCBjaGFyICpzdHJ0YWIsICpuYW1lOworCXN0cnVjdCBhcmNoX3N5bWJvbCAqaW50c3ltOworCisJZm9yIChpID0gMDsgaSA8IGYtPmhlYWRlci5lX3NobnVtOyArK2kpIHsKKwkJcmVsc2VjID0gZi0+c2VjdGlvbnNbaV07CisJCWlmIChyZWxzZWMtPmhlYWRlci5zaF90eXBlICE9IFNIVF9SRUxNKQorCQkJY29udGludWU7CisKKwkJc3ltc2VjID0gZi0+c2VjdGlvbnNbcmVsc2VjLT5oZWFkZXIuc2hfbGlua107CisJCXN0cnNlYyA9IGYtPnNlY3Rpb25zW3N5bXNlYy0+aGVhZGVyLnNoX2xpbmtdOworCisJCXJlbCA9IChFbGZXKFJlbE0pICopIHJlbHNlYy0+Y29udGVudHM7CisJCXJlbGVuZCA9IHJlbCArIChyZWxzZWMtPmhlYWRlci5zaF9zaXplIC8gc2l6ZW9mKEVsZlcoUmVsTSkpKTsKKwkJc3ltdGFiID0gKEVsZlcoU3ltKSAqKSBzeW1zZWMtPmNvbnRlbnRzOworCQlzdHJ0YWIgPSAoY29uc3QgY2hhciAqKSBzdHJzZWMtPmNvbnRlbnRzOworCisJCWZvciAoOyByZWwgPCByZWxlbmQ7ICsrcmVsKSB7CisJCQlleHRzeW0gPSAmc3ltdGFiW0VMRl9SX1NZTShyZWwtPnJfaW5mbyldOworCisjaWYgZGVmaW5lZChVU0VfR09UX0VOVFJJRVMpCisJCQlnb3RfYWxsb2NhdGUgPSAwOworI2VuZGlmCisjaWYgZGVmaW5lZChVU0VfUExUX0VOVFJJRVMpCisJCQlwbHRfYWxsb2NhdGUgPSAwOworI2VuZGlmCisKKwkJCXN3aXRjaCAoRUxGX1JfVFlQRShyZWwtPnJfaW5mbykpIHsKKyNpZiBkZWZpbmVkKF9fYXJtX18pCisJCQljYXNlIFJfQVJNX1BDMjQ6CisJCQljYXNlIFJfQVJNX1BMVDMyOgorCQkJCXBsdF9hbGxvY2F0ZSA9IDE7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUl9BUk1fR09UT0ZGOgorCQkJY2FzZSBSX0FSTV9HT1RQQzoKKwkJCQlnb3RfbmVlZGVkID0gMTsKKwkJCQljb250aW51ZTsKKworCQkJY2FzZSBSX0FSTV9HT1QzMjoKKwkJCQlnb3RfYWxsb2NhdGUgPSAxOworCQkJCWJyZWFrOworCisjZWxpZiBkZWZpbmVkKF9faTM4Nl9fKQorCQkJY2FzZSBSXzM4Nl9HT1RQQzoKKwkJCWNhc2UgUl8zODZfR09UT0ZGOgorCQkJCWdvdF9uZWVkZWQgPSAxOworCQkJCWNvbnRpbnVlOworCisJCQljYXNlIFJfMzg2X0dPVDMyOgorCQkJCWdvdF9hbGxvY2F0ZSA9IDE7CisJCQkJYnJlYWs7CisKKyNlbGlmIGRlZmluZWQoX19wb3dlcnBjX18pCisJCQljYXNlIFJfUFBDX1JFTDI0OgorCQkJCXBsdF9hbGxvY2F0ZSA9IDE7CisJCQkJYnJlYWs7CisKKyNlbGlmIGRlZmluZWQoX19tYzY4MDAwX18pCisJCQljYXNlIFJfNjhLX0dPVDMyOgorCQkJCWdvdF9hbGxvY2F0ZSA9IDE7CisJCQkJYnJlYWs7CisKKyNpZmRlZiBSXzY4S19HT1RPRkYKKwkJCWNhc2UgUl82OEtfR09UT0ZGOgorCQkJCWdvdF9uZWVkZWQgPSAxOworCQkJCWNvbnRpbnVlOworI2VuZGlmCisKKyNlbGlmIGRlZmluZWQoX19zaF9fKQorCQkJY2FzZSBSX1NIX0dPVDMyOgorCQkJCWdvdF9hbGxvY2F0ZSA9IDE7CisJCQkJYnJlYWs7CisKKwkJCWNhc2UgUl9TSF9HT1RQQzoKKwkJCWNhc2UgUl9TSF9HT1RPRkY6CisJCQkJZ290X25lZWRlZCA9IDE7CisJCQkJY29udGludWU7CisKKyNlbGlmIGRlZmluZWQoX192ODUwZV9fKQorCQkJY2FzZSBSX1Y4NTBfMjJfUENSRUw6CisJCQkJcGx0X25lZWRlZCA9IDE7CisJCQkJYnJlYWs7CisKKyNlbmRpZgorCQkJZGVmYXVsdDoKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKGV4dHN5bS0+c3RfbmFtZSAhPSAwKSB7CisJCQkJbmFtZSA9IHN0cnRhYiArIGV4dHN5bS0+c3RfbmFtZTsKKwkJCX0gZWxzZSB7CisJCQkJbmFtZSA9IGYtPnNlY3Rpb25zW2V4dHN5bS0+c3Rfc2huZHhdLT5uYW1lOworCQkJfQorCQkJaW50c3ltID0gKHN0cnVjdCBhcmNoX3N5bWJvbCAqKSBvYmpfZmluZF9zeW1ib2woZiwgbmFtZSk7CisjaWYgZGVmaW5lZChVU0VfR09UX0VOVFJJRVMpCisJCQlpZiAoZ290X2FsbG9jYXRlKSB7CisJCQkJZ290X29mZnNldCArPSBhcmNoX3NpbmdsZV9pbml0KAorCQkJCQkJLypyZWwsKi8gJmludHN5bS0+Z290ZW50LAorCQkJCQkJZ290X29mZnNldCwgR09UX0VOVFJZX1NJWkUpOworCisJCQkJZ290X25lZWRlZCA9IDE7CisJCQl9CisjZW5kaWYKKyNpZiBkZWZpbmVkKFVTRV9QTFRfRU5UUklFUykKKwkJCWlmIChwbHRfYWxsb2NhdGUpIHsKKyNpZiBkZWZpbmVkKFVTRV9QTFRfTElTVCkKKwkJCQlwbHRfb2Zmc2V0ICs9IGFyY2hfbGlzdF9hZGQoCisJCQkJCQlyZWwsICZpbnRzeW0tPnBsdGVudCwKKwkJCQkJCXBsdF9vZmZzZXQsIFBMVF9FTlRSWV9TSVpFKTsKKyNlbHNlCisJCQkJcGx0X29mZnNldCArPSBhcmNoX3NpbmdsZV9pbml0KAorCQkJCQkJLypyZWwsKi8gJmludHN5bS0+cGx0ZW50LAorCQkJCQkJcGx0X29mZnNldCwgUExUX0VOVFJZX1NJWkUpOworI2VuZGlmCisJCQkJcGx0X25lZWRlZCA9IDE7CisJCQl9CisjZW5kaWYKKwkJfQorCX0KKworI2lmIGRlZmluZWQoVVNFX0dPVF9FTlRSSUVTKQorCWlmIChnb3RfbmVlZGVkKSB7CisJCWlmaWxlLT5nb3QgPSBhcmNoX3hzZWN0X2luaXQoZiwgIi5nb3QiLCBnb3Rfb2Zmc2V0LAorCQkJCUdPVF9FTlRSWV9TSVpFKTsKKwl9CisjZW5kaWYKKworI2lmIGRlZmluZWQoVVNFX1BMVF9FTlRSSUVTKQorCWlmIChwbHRfbmVlZGVkKSB7CisJCWlmaWxlLT5wbHQgPSBhcmNoX3hzZWN0X2luaXQoZiwgIi5wbHQiLCBwbHRfb2Zmc2V0LAorCQkJCVBMVF9FTlRSWV9TSVpFKTsKKwl9CisjZW5kaWYKKworI2VuZGlmIC8qIGRlZmluZWQoVVNFX0dPVF9FTlRSSUVTKSB8fCBkZWZpbmVkKFVTRV9QTFRfRU5UUklFUykgKi8KK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworLyogU3RhbmRhcmQgRUxGIGhhc2ggZnVuY3Rpb24uICAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgb2JqX2VsZl9oYXNoX24oY29uc3QgY2hhciAqbmFtZSwgdW5zaWduZWQgbG9uZyBuKQoreworCXVuc2lnbmVkIGxvbmcgaCA9IDA7CisJdW5zaWduZWQgbG9uZyBnOworCXVuc2lnbmVkIGNoYXIgY2g7CisKKwl3aGlsZSAobiA+IDApIHsKKwkJY2ggPSAqbmFtZSsrOworCQloID0gKGggPDwgNCkgKyBjaDsKKwkJZyA9IChoICYgMHhmMDAwMDAwMCk7CisJCWlmIChnICE9IDApIHsKKwkJCWggXj0gZyA+PiAyNDsKKwkJCWggJj0gfmc7CisJCX0KKwkJbi0tOworCX0KKwlyZXR1cm4gaDsKK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgRkFTVF9GVU5DIG9ial9lbGZfaGFzaChjb25zdCBjaGFyICpuYW1lKQoreworCXJldHVybiBvYmpfZWxmX2hhc2hfbihuYW1lLCBzdHJsZW4obmFtZSkpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcKKy8qIFN0cmluZyBjb21wYXJpc29uIGZvciBub24tY28tdmVyc2lvbmVkIGtlcm5lbCBhbmQgbW9kdWxlLiAgKi8KKworc3RhdGljIGludCBuY3Zfc3RyY21wKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIpCit7CisJc2l6ZV90IGFsZW4gPSBzdHJsZW4oYSksIGJsZW4gPSBzdHJsZW4oYik7CisKKwlpZiAoYmxlbiA9PSBhbGVuICsgMTAgJiYgYlthbGVuXSA9PSAnXycgJiYgYlthbGVuICsgMV0gPT0gJ1InKQorCQlyZXR1cm4gc3RybmNtcChhLCBiLCBhbGVuKTsKKwllbHNlIGlmIChhbGVuID09IGJsZW4gKyAxMCAmJiBhW2JsZW5dID09ICdfJyAmJiBhW2JsZW4gKyAxXSA9PSAnUicpCisJCXJldHVybiBzdHJuY21wKGEsIGIsIGJsZW4pOworCWVsc2UKKwkJcmV0dXJuIHN0cmNtcChhLCBiKTsKK30KKworLyogU3RyaW5nIGhhc2hpbmcgZm9yIG5vbi1jby12ZXJzaW9uZWQga2VybmVsIGFuZCBtb2R1bGUuICBIZXJlCisgICB3ZSBhcmUgc2ltcGx5IGZvcmNlZCB0byBkcm9wIHRoZSBjcmMgZnJvbSB0aGUgaGFzaC4gICovCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIEZBU1RfRlVOQyBuY3Zfc3ltYm9sX2hhc2goY29uc3QgY2hhciAqc3RyKQoreworCXNpemVfdCBsZW4gPSBzdHJsZW4oc3RyKTsKKwlpZiAobGVuID4gMTAgJiYgc3RyW2xlbiAtIDEwXSA9PSAnXycgJiYgc3RyW2xlbiAtIDldID09ICdSJykKKwkJbGVuIC09IDEwOworCXJldHVybiBvYmpfZWxmX2hhc2hfbihzdHIsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkCitvYmpfc2V0X3N5bWJvbF9jb21wYXJlKHN0cnVjdCBvYmpfZmlsZSAqZiwKKwkJaW50ICgqY21wKSAoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopLAorCQl1bnNpZ25lZCBsb25nICgqaGFzaCkgKGNvbnN0IGNoYXIgKikgRkFTVF9GVU5DKQoreworCWlmIChjbXApCisJCWYtPnN5bWJvbF9jbXAgPSBjbXA7CisJaWYgKGhhc2gpIHsKKwkJc3RydWN0IG9ial9zeW1ib2wgKnRtcHRhYltIQVNIX0JVQ0tFVFNdLCAqc3ltLCAqbmV4dDsKKwkJaW50IGk7CisKKwkJZi0+c3ltYm9sX2hhc2ggPSBoYXNoOworCisJCW1lbWNweSh0bXB0YWIsIGYtPnN5bXRhYiwgc2l6ZW9mKHRtcHRhYikpOworCQltZW1zZXQoZi0+c3ltdGFiLCAwLCBzaXplb2YoZi0+c3ltdGFiKSk7CisKKwkJZm9yIChpID0gMDsgaSA8IEhBU0hfQlVDS0VUUzsgKytpKSB7CisJCQlmb3IgKHN5bSA9IHRtcHRhYltpXTsgc3ltOyBzeW0gPSBuZXh0KSB7CisJCQkJdW5zaWduZWQgbG9uZyBoID0gaGFzaChzeW0tPm5hbWUpICUgSEFTSF9CVUNLRVRTOworCQkJCW5leHQgPSBzeW0tPm5leHQ7CisJCQkJc3ltLT5uZXh0ID0gZi0+c3ltdGFiW2hdOworCQkJCWYtPnN5bXRhYltoXSA9IHN5bTsKKwkJCX0KKwkJfQorCX0KK30KKworI2VuZGlmIC8qIEZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcgKi8KKworc3RhdGljIHN0cnVjdCBvYmpfc3ltYm9sICoKK29ial9hZGRfc3ltYm9sKHN0cnVjdCBvYmpfZmlsZSAqZiwgY29uc3QgY2hhciAqbmFtZSwKKwkJdW5zaWduZWQgbG9uZyBzeW1pZHgsIGludCBpbmZvLAorCQlpbnQgc2VjaWR4LCBFbGZXKEFkZHIpIHZhbHVlLAorCQl1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKKwl1bnNpZ25lZCBsb25nIGhhc2ggPSBmLT5zeW1ib2xfaGFzaChuYW1lKSAlIEhBU0hfQlVDS0VUUzsKKwlpbnQgbl90eXBlID0gRUxGX1NUX1RZUEUoaW5mbyk7CisJaW50IG5fYmluZGluZyA9IEVMRl9TVF9CSU5EKGluZm8pOworCisJZm9yIChzeW0gPSBmLT5zeW10YWJbaGFzaF07IHN5bTsgc3ltID0gc3ltLT5uZXh0KSB7CisJCWlmIChmLT5zeW1ib2xfY21wKHN5bS0+bmFtZSwgbmFtZSkgPT0gMCkgeworCQkJaW50IG9fc2VjaWR4ID0gc3ltLT5zZWNpZHg7CisJCQlpbnQgb19pbmZvID0gc3ltLT5pbmZvOworCQkJaW50IG9fdHlwZSA9IEVMRl9TVF9UWVBFKG9faW5mbyk7CisJCQlpbnQgb19iaW5kaW5nID0gRUxGX1NUX0JJTkQob19pbmZvKTsKKworCQkJLyogQSByZWRlZmluaXRpb24hICBJcyBpdCBsZWdhbD8gICovCisKKwkJCWlmIChzZWNpZHggPT0gU0hOX1VOREVGKQorCQkJCXJldHVybiBzeW07CisJCQllbHNlIGlmIChvX3NlY2lkeCA9PSBTSE5fVU5ERUYpCisJCQkJZ290byBmb3VuZDsKKwkJCWVsc2UgaWYgKG5fYmluZGluZyA9PSBTVEJfR0xPQkFMICYmIG9fYmluZGluZyA9PSBTVEJfTE9DQUwpIHsKKwkJCQkvKiBDb3BlIHdpdGggbG9jYWwgYW5kIGdsb2JhbCBzeW1ib2xzIG9mIHRoZSBzYW1lIG5hbWUKKwkJCQkgICBpbiB0aGUgc2FtZSBvYmplY3QgZmlsZSwgYXMgbWlnaHQgaGF2ZSBiZWVuIGNyZWF0ZWQKKwkJCQkgICBieSBsZCAtci4gIFRoZSBvbmx5IHJlYXNvbiBsb2NhbHMgYXJlIG5vdyBzZWVuIGF0IHRoaXMKKwkJCQkgICBsZXZlbCBhdCBhbGwgaXMgc28gdGhhdCB3ZSBjYW4gZG8gc2VtaS1zZW5zaWJsZSB0aGluZ3MKKwkJCQkgICB3aXRoIHBhcmFtZXRlcnMuICAqLworCisJCQkJc3RydWN0IG9ial9zeW1ib2wgKm5zeW0sICoqcDsKKworCQkJCW5zeW0gPSBhcmNoX25ld19zeW1ib2woKTsKKwkJCQluc3ltLT5uZXh0ID0gc3ltLT5uZXh0OworCQkJCW5zeW0tPmtzeW1pZHggPSAtMTsKKworCQkJCS8qIEV4Y2lzZSB0aGUgb2xkIChsb2NhbCkgc3ltYm9sIGZyb20gdGhlIGhhc2ggY2hhaW4uICAqLworCQkJCWZvciAocCA9ICZmLT5zeW10YWJbaGFzaF07ICpwICE9IHN5bTsgcCA9ICYoKnApLT5uZXh0KQorCQkJCQljb250aW51ZTsKKwkJCQkqcCA9IHN5bSA9IG5zeW07CisJCQkJZ290byBmb3VuZDsKKwkJCX0gZWxzZSBpZiAobl9iaW5kaW5nID09IFNUQl9MT0NBTCkgeworCQkJCS8qIEFub3RoZXIgc3ltYm9sIG9mIHRoZSBzYW1lIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBkZWZpbmVkLgorCQkJCSAgIEp1c3QgYWRkIHRoaXMgdG8gdGhlIGxvY2FsIHRhYmxlLiAgKi8KKwkJCQlzeW0gPSBhcmNoX25ld19zeW1ib2woKTsKKwkJCQlzeW0tPm5leHQgPSBOVUxMOworCQkJCXN5bS0+a3N5bWlkeCA9IC0xOworCQkJCWYtPmxvY2FsX3N5bXRhYltzeW1pZHhdID0gc3ltOworCQkJCWdvdG8gZm91bmQ7CisJCQl9IGVsc2UgaWYgKG5fYmluZGluZyA9PSBTVEJfV0VBSykKKwkJCQlyZXR1cm4gc3ltOworCQkJZWxzZSBpZiAob19iaW5kaW5nID09IFNUQl9XRUFLKQorCQkJCWdvdG8gZm91bmQ7CisJCQkvKiBEb24ndCB1bmlmeSBDT01NT04gc3ltYm9scyB3aXRoIG9iamVjdCB0eXBlcyB0aGUgcHJvZ3JhbW1lcgorCQkJICAgZG9lc24ndCBleHBlY3QuICAqLworCQkJZWxzZSBpZiAoc2VjaWR4ID09IFNITl9DT01NT04KKwkJCQkJJiYgKG9fdHlwZSA9PSBTVFRfTk9UWVBFIHx8IG9fdHlwZSA9PSBTVFRfT0JKRUNUKSkKKwkJCQlyZXR1cm4gc3ltOworCQkJZWxzZSBpZiAob19zZWNpZHggPT0gU0hOX0NPTU1PTgorCQkJCQkmJiAobl90eXBlID09IFNUVF9OT1RZUEUgfHwgbl90eXBlID09IFNUVF9PQkpFQ1QpKQorCQkJCWdvdG8gZm91bmQ7CisJCQllbHNlIHsKKwkJCQkvKiBEb24ndCByZXBvcnQgYW4gZXJyb3IgaWYgdGhlIHN5bWJvbCBpcyBjb21pbmcgZnJvbQorCQkJCSAgIHRoZSBrZXJuZWwgb3Igc29tZSBleHRlcm5hbCBtb2R1bGUuICAqLworCQkJCWlmIChzZWNpZHggPD0gU0hOX0hJUkVTRVJWRSkKKwkJCQkJYmJfZXJyb3JfbXNnKCIlcyBtdWx0aXBseSBkZWZpbmVkIiwgbmFtZSk7CisJCQkJcmV0dXJuIHN5bTsKKwkJCX0KKwkJfQorCX0KKworCS8qIENvbXBsZXRlbHkgbmV3IHN5bWJvbC4gICovCisJc3ltID0gYXJjaF9uZXdfc3ltYm9sKCk7CisJc3ltLT5uZXh0ID0gZi0+c3ltdGFiW2hhc2hdOworCWYtPnN5bXRhYltoYXNoXSA9IHN5bTsKKwlzeW0tPmtzeW1pZHggPSAtMTsKKwlpZiAoRUxGX1NUX0JJTkQoaW5mbykgPT0gU1RCX0xPQ0FMICYmIHN5bWlkeCAhPSAodW5zaWduZWQgbG9uZykoLTEpKSB7CisJCWlmIChzeW1pZHggPj0gZi0+bG9jYWxfc3ltdGFiX3NpemUpCisJCQliYl9lcnJvcl9tc2coImxvY2FsIHN5bWJvbCAlcyB3aXRoIGluZGV4ICVsZCBleGNlZWRzIGxvY2FsX3N5bXRhYl9zaXplICVsZCIsCisJCQkJCW5hbWUsIChsb25nKSBzeW1pZHgsIChsb25nKSBmLT5sb2NhbF9zeW10YWJfc2l6ZSk7CisJCWVsc2UKKwkJCWYtPmxvY2FsX3N5bXRhYltzeW1pZHhdID0gc3ltOworCX0KKworZm91bmQ6CisJc3ltLT5uYW1lID0gbmFtZTsKKwlzeW0tPnZhbHVlID0gdmFsdWU7CisJc3ltLT5zaXplID0gc2l6ZTsKKwlzeW0tPnNlY2lkeCA9IHNlY2lkeDsKKwlzeW0tPmluZm8gPSBpbmZvOworCisJcmV0dXJuIHN5bTsKK30KKworc3RhdGljIHN0cnVjdCBvYmpfc3ltYm9sICoKK29ial9maW5kX3N5bWJvbChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKKwl1bnNpZ25lZCBsb25nIGhhc2ggPSBmLT5zeW1ib2xfaGFzaChuYW1lKSAlIEhBU0hfQlVDS0VUUzsKKworCWZvciAoc3ltID0gZi0+c3ltdGFiW2hhc2hdOyBzeW07IHN5bSA9IHN5bS0+bmV4dCkKKwkJaWYgKGYtPnN5bWJvbF9jbXAoc3ltLT5uYW1lLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuIHN5bTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIEVsZlcoQWRkcikgb2JqX3N5bWJvbF9maW5hbF92YWx1ZShzdHJ1Y3Qgb2JqX2ZpbGUgKiBmLCBzdHJ1Y3Qgb2JqX3N5bWJvbCAqIHN5bSkKK3sKKwlpZiAoc3ltKSB7CisJCWlmIChzeW0tPnNlY2lkeCA+PSBTSE5fTE9SRVNFUlZFKQorCQkJcmV0dXJuIHN5bS0+dmFsdWU7CisJCXJldHVybiBzeW0tPnZhbHVlICsgZi0+c2VjdGlvbnNbc3ltLT5zZWNpZHhdLT5oZWFkZXIuc2hfYWRkcjsKKwl9CisJLyogQXMgYSBzcGVjaWFsIGNhc2UsIGEgTlVMTCBzeW0gaGFzIHZhbHVlIHplcm8uICAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG9ial9zZWN0aW9uICpvYmpfZmluZF9zZWN0aW9uKHN0cnVjdCBvYmpfZmlsZSAqZiwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgaSwgbiA9IGYtPmhlYWRlci5lX3NobnVtOworCisJZm9yIChpID0gMDsgaSA8IG47ICsraSkKKwkJaWYgKHN0cmNtcChmLT5zZWN0aW9uc1tpXS0+bmFtZSwgbmFtZSkgPT0gMCkKKwkJCXJldHVybiBmLT5zZWN0aW9uc1tpXTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBvYmpfbG9hZF9vcmRlcl9wcmlvKHN0cnVjdCBvYmpfc2VjdGlvbiAqYSkKK3sKKwl1bnNpZ25lZCBsb25nIGFmLCBhYzsKKworCWFmID0gYS0+aGVhZGVyLnNoX2ZsYWdzOworCisJYWMgPSAwOworCWlmIChhLT5uYW1lWzBdICE9ICcuJyB8fCBzdHJsZW4oYS0+bmFtZSkgIT0gMTAKKwkgfHwgc3RyY21wKGEtPm5hbWUgKyA1LCAiLmluaXQiKSAhPSAwCisJKSB7CisJCWFjIHw9IDMyOworCX0KKwlpZiAoYWYgJiBTSEZfQUxMT0MpCisJCWFjIHw9IDE2OworCWlmICghKGFmICYgU0hGX1dSSVRFKSkKKwkJYWMgfD0gODsKKwlpZiAoYWYgJiBTSEZfRVhFQ0lOU1RSKQorCQlhYyB8PSA0OworCWlmIChhLT5oZWFkZXIuc2hfdHlwZSAhPSBTSFRfTk9CSVRTKQorCQlhYyB8PSAyOworCisJcmV0dXJuIGFjOworfQorCitzdGF0aWMgdm9pZAorb2JqX2luc2VydF9zZWN0aW9uX2xvYWRfb3JkZXIoc3RydWN0IG9ial9maWxlICpmLCBzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYykKK3sKKwlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKipwOworCWludCBwcmlvID0gb2JqX2xvYWRfb3JkZXJfcHJpbyhzZWMpOworCWZvciAocCA9IGYtPmxvYWRfb3JkZXJfc2VhcmNoX3N0YXJ0OyAqcDsgcCA9ICYoKnApLT5sb2FkX25leHQpCisJCWlmIChvYmpfbG9hZF9vcmRlcl9wcmlvKCpwKSA8IHByaW8pCisJCQlicmVhazsKKwlzZWMtPmxvYWRfbmV4dCA9ICpwOworCSpwID0gc2VjOworfQorCitzdGF0aWMgc3RydWN0IG9ial9zZWN0aW9uICpoZWxwZXJfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCisJCWNvbnN0IGNoYXIgKm5hbWUsCisJCXVuc2lnbmVkIGxvbmcgYWxpZ24sCisJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlpbnQgbmV3aWR4ID0gZi0+aGVhZGVyLmVfc2hudW0rKzsKKwlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKKworCWYtPnNlY3Rpb25zID0geHJlYWxsb2NfdmVjdG9yKGYtPnNlY3Rpb25zLCAyLCBuZXdpZHgpOworCWYtPnNlY3Rpb25zW25ld2lkeF0gPSBzZWMgPSBhcmNoX25ld19zZWN0aW9uKCk7CisKKwlzZWMtPmhlYWRlci5zaF90eXBlID0gU0hUX1BST0dCSVRTOworCXNlYy0+aGVhZGVyLnNoX2ZsYWdzID0gU0hGX1dSSVRFIHwgU0hGX0FMTE9DOworCXNlYy0+aGVhZGVyLnNoX3NpemUgPSBzaXplOworCXNlYy0+aGVhZGVyLnNoX2FkZHJhbGlnbiA9IGFsaWduOworCXNlYy0+bmFtZSA9IG5hbWU7CisJc2VjLT5pZHggPSBuZXdpZHg7CisJaWYgKHNpemUpCisJCXNlYy0+Y29udGVudHMgPSB4emFsbG9jKHNpemUpOworCisJcmV0dXJuIHNlYzsKK30KKworc3RhdGljIHN0cnVjdCBvYmpfc2VjdGlvbiAqb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb24oc3RydWN0IG9ial9maWxlICpmLAorCQljb25zdCBjaGFyICpuYW1lLAorCQl1bnNpZ25lZCBsb25nIGFsaWduLAorCQl1bnNpZ25lZCBsb25nIHNpemUpCit7CisJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CisKKwlzZWMgPSBoZWxwZXJfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbihmLCBuYW1lLCBhbGlnbiwgc2l6ZSk7CisJb2JqX2luc2VydF9zZWN0aW9uX2xvYWRfb3JkZXIoZiwgc2VjKTsKKwlyZXR1cm4gc2VjOworfQorCitzdGF0aWMgc3RydWN0IG9ial9zZWN0aW9uICpvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbl9maXJzdChzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCisJCWNvbnN0IGNoYXIgKm5hbWUsCisJCXVuc2lnbmVkIGxvbmcgYWxpZ24sCisJCXVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKKworCXNlYyA9IGhlbHBlcl9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uKGYsIG5hbWUsIGFsaWduLCBzaXplKTsKKwlzZWMtPmxvYWRfbmV4dCA9IGYtPmxvYWRfb3JkZXI7CisJZi0+bG9hZF9vcmRlciA9IHNlYzsKKwlpZiAoZi0+bG9hZF9vcmRlcl9zZWFyY2hfc3RhcnQgPT0gJmYtPmxvYWRfb3JkZXIpCisJCWYtPmxvYWRfb3JkZXJfc2VhcmNoX3N0YXJ0ID0gJnNlYy0+bG9hZF9uZXh0OworCisJcmV0dXJuIHNlYzsKK30KKworc3RhdGljIHZvaWQgKm9ial9leHRlbmRfc2VjdGlvbihzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYywgdW5zaWduZWQgbG9uZyBtb3JlKQoreworCXVuc2lnbmVkIGxvbmcgb2xkc2l6ZSA9IHNlYy0+aGVhZGVyLnNoX3NpemU7CisJaWYgKG1vcmUpIHsKKwkJc2VjLT5oZWFkZXIuc2hfc2l6ZSArPSBtb3JlOworCQlzZWMtPmNvbnRlbnRzID0geHJlYWxsb2Moc2VjLT5jb250ZW50cywgc2VjLT5oZWFkZXIuc2hfc2l6ZSk7CisJfQorCXJldHVybiBzZWMtPmNvbnRlbnRzICsgb2xkc2l6ZTsKK30KKworCisvKiBDb25kaXRpb25hbGx5IGFkZCB0aGUgc3ltYm9scyBmcm9tIHRoZSBnaXZlbiBzeW1ib2wgc2V0IHRvIHRoZQorICAgbmV3IG1vZHVsZS4gICovCisKK3N0YXRpYyBpbnQgYWRkX3N5bWJvbHNfZnJvbShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsCisJCWludCBpZHgsCisJCXN0cnVjdCBuZXdfbW9kdWxlX3N5bWJvbCAqc3ltcywKKwkJc2l6ZV90IG5zeW1zKQoreworCXN0cnVjdCBuZXdfbW9kdWxlX3N5bWJvbCAqczsKKwlzaXplX3QgaTsKKwlpbnQgdXNlZCA9IDA7CisjaWZkZWYgU1lNQk9MX1BSRUZJWAorCWNoYXIgKm5hbWVfYnVmID0gTlVMTDsKKwlzaXplX3QgbmFtZV9hbGxvY2VkX3NpemUgPSAwOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hFQ0tfVEFJTlRFRF9NT0RVTEUKKwlpbnQgZ3BsOworCisJZ3BsID0gb2JqX2dwbF9saWNlbnNlKGYsIE5VTEwpID09IDA7CisjZW5kaWYKKwlmb3IgKGkgPSAwLCBzID0gc3ltczsgaSA8IG5zeW1zOyArK2ksICsrcykgeworCQkvKiBPbmx5IGFkZCBzeW1ib2xzIHRoYXQgYXJlIGFscmVhZHkgbWFya2VkIGV4dGVybmFsLgorCQkgICBJZiB3ZSBvdmVycmlkZSBsb2NhbHMgd2UgbWF5IGNhdXNlIHByb2JsZW1zIGZvcgorCQkgICBhcmd1bWVudCBpbml0aWFsaXphdGlvbi4gIFdlIHdpbGwgYWxzbyBjcmVhdGUgYSBmYWxzZQorCQkgICBkZXBlbmRlbmN5IG9uIHRoZSBtb2R1bGUuICAqLworCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOworCQljaGFyICpuYW1lOworCisJCS8qIEdQTCBsaWNlbnNlZCBtb2R1bGVzIGNhbiB1c2Ugc3ltYm9scyBleHBvcnRlZCB3aXRoCisJCSAqIEVYUE9SVF9TWU1CT0xfR1BMLCBzbyBpZ25vcmUgYW55IEdQTE9OTFlfIHByZWZpeCBvbiB0aGUKKwkJICogZXhwb3J0ZWQgbmFtZXMuICBOb24tR1BMIG1vZHVsZXMgbmV2ZXIgc2VlIGFueSBHUExPTkxZXworCQkgKiBzeW1ib2xzIHNvIHRoZXkgY2Fubm90IGZ1ZGdlIGl0IGJ5IGFkZGluZyB0aGUgcHJlZml4IG9uCisJCSAqIHRoZWlyIHJlZmVyZW5jZXMuCisJCSAqLworCQlpZiAoaXNfcHJlZml4ZWRfd2l0aCgoY2hhciAqKXMtPm5hbWUsICJHUExPTkxZXyIpKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hFQ0tfVEFJTlRFRF9NT0RVTEUKKwkJCWlmIChncGwpCisJCQkJcy0+bmFtZSArPSA4OworCQkJZWxzZQorI2VuZGlmCisJCQkJY29udGludWU7CisJCX0KKwkJbmFtZSA9IChjaGFyICopcy0+bmFtZTsKKworI2lmZGVmIFNZTUJPTF9QUkVGSVgKKwkJLyogUHJlcGVuZCBTWU1CT0xfUFJFRklYIHRvIHRoZSBzeW1ib2wncyBuYW1lICh0aGUKKwkJICAga2VybmVsIGV4cG9ydHMgYEMgbmFtZXMnLCBidXQgbW9kdWxlIG9iamVjdCBmaWxlcworCQkgICByZWZlcmVuY2UgYGxpbmtlciBuYW1lcycpLiAgKi8KKwkJc2l6ZV90IGV4dHJhID0gc2l6ZW9mIFNZTUJPTF9QUkVGSVg7CisJCXNpemVfdCBuYW1lX3NpemUgPSBzdHJsZW4obmFtZSkgKyBleHRyYTsKKwkJaWYgKG5hbWVfc2l6ZSA+IG5hbWVfYWxsb2NlZF9zaXplKSB7CisJCQluYW1lX2FsbG9jZWRfc2l6ZSA9IG5hbWVfc2l6ZSAqIDI7CisJCQluYW1lX2J1ZiA9IGFsbG9jYShuYW1lX2FsbG9jZWRfc2l6ZSk7CisJCX0KKwkJc3RyY3B5KG5hbWVfYnVmLCBTWU1CT0xfUFJFRklYKTsKKwkJc3RyY3B5KG5hbWVfYnVmICsgZXh0cmEgLSAxLCBuYW1lKTsKKwkJbmFtZSA9IG5hbWVfYnVmOworI2VuZGlmCisKKwkJc3ltID0gb2JqX2ZpbmRfc3ltYm9sKGYsIG5hbWUpOworCQlpZiAoc3ltICYmICEoRUxGX1NUX0JJTkQoc3ltLT5pbmZvKSA9PSBTVEJfTE9DQUwpKSB7CisjaWZkZWYgU1lNQk9MX1BSRUZJWAorCQkJLyogUHV0IE5BTUVfQlVGIGludG8gbW9yZSBwZXJtYW5lbnQgc3RvcmFnZS4gICovCisJCQluYW1lID0geG1hbGxvYyhuYW1lX3NpemUpOworCQkJc3RyY3B5KG5hbWUsIG5hbWVfYnVmKTsKKyNlbmRpZgorCQkJc3ltID0gb2JqX2FkZF9zeW1ib2woZiwgbmFtZSwgLTEsCisJCQkJCUVMRl9TVF9JTkZPKFNUQl9HTE9CQUwsCisJCQkJCQlTVFRfTk9UWVBFKSwKKwkJCQkJaWR4LCBzLT52YWx1ZSwgMCk7CisJCQkvKiBEaWQgb3VyIHN5bWJvbCBqdXN0IGdldCBpbnN0YWxsZWQ/ICBJZiBzbywgbWFyayB0aGUKKwkJCSAgIG1vZHVsZSBhcyAidXNlZCIuICAqLworCQkJaWYgKHN5bS0+c2VjaWR4ID09IGlkeCkKKwkJCQl1c2VkID0gMTsKKwkJfQorCX0KKworCXJldHVybiB1c2VkOworfQorCitzdGF0aWMgdm9pZCBhZGRfa2VybmVsX3N5bWJvbHMoc3RydWN0IG9ial9maWxlICpmKQoreworCXN0cnVjdCBleHRlcm5hbF9tb2R1bGUgKm07CisJaW50IGksIG51c2VkID0gMDsKKworCS8qIEFkZCBtb2R1bGUgc3ltYm9scyBmaXJzdC4gICovCisKKwlmb3IgKGkgPSAwLCBtID0gZXh0X21vZHVsZXM7IGkgPCBuX2V4dF9tb2R1bGVzOyArK2ksICsrbSkgeworCQlpZiAobS0+bnN5bXMKKwkJICYmIGFkZF9zeW1ib2xzX2Zyb20oZiwgU0hOX0hJUkVTRVJWRSArIDIgKyBpLCBtLT5zeW1zLCBtLT5uc3ltcykKKwkJKSB7CisJCQltLT51c2VkID0gMTsKKwkJCSsrbnVzZWQ7CisJCX0KKwl9CisKKwluX2V4dF9tb2R1bGVzX3VzZWQgPSBudXNlZDsKKworCS8qIEFuZCBmaW5hbGx5IHRoZSBzeW1ib2xzIGZyb20gdGhlIGtlcm5lbCBwcm9wZXIuICAqLworCisJaWYgKG5rc3ltcykKKwkJYWRkX3N5bWJvbHNfZnJvbShmLCBTSE5fSElSRVNFUlZFICsgMSwga3N5bXMsIG5rc3ltcyk7Cit9CisKK3N0YXRpYyBjaGFyICpnZXRfbW9kaW5mb192YWx1ZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNvbnN0IGNoYXIgKmtleSkKK3sKKwlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKKwljaGFyICpwLCAqdiwgKm4sICplcDsKKwlzaXplX3Qga2xlbiA9IHN0cmxlbihrZXkpOworCisJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiLm1vZGluZm8iKTsKKwlpZiAoc2VjID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCXAgPSBzZWMtPmNvbnRlbnRzOworCWVwID0gcCArIHNlYy0+aGVhZGVyLnNoX3NpemU7CisJd2hpbGUgKHAgPCBlcCkgeworCQl2ID0gc3RyY2hyKHAsICc9Jyk7CisJCW4gPSBzdHJjaHIocCwgJ1wwJyk7CisJCWlmICh2KSB7CisJCQlpZiAocCArIGtsZW4gPT0gdiAmJiBzdHJuY21wKHAsIGtleSwga2xlbikgPT0gMCkKKwkJCQlyZXR1cm4gdiArIDE7CisJCX0gZWxzZSB7CisJCQlpZiAocCArIGtsZW4gPT0gbiAmJiBzdHJjbXAocCwga2V5KSA9PSAwKQorCQkJCXJldHVybiBuOworCQl9CisJCXAgPSBuICsgMTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworLyogRnVuY3Rpb25zIHJlbGF0aW5nIHRvIG1vZHVsZSBsb2FkaW5nIGFmdGVyIDIuMS4xOC4gICovCisKKy8qIEZyb20gTGludXgtMi42IHNvdXJjZXMgKi8KKy8qIFlvdSBjYW4gdXNlICIgYXJvdW5kIHNwYWNlcywgYnV0IGNhbid0IGVzY2FwZSAiLiAqLworLyogSHlwaGVucyBhbmQgdW5kZXJzY29yZXMgZXF1aXZhbGVudCBpbiBwYXJhbWV0ZXIgbmFtZXMuICovCitzdGF0aWMgY2hhciAqbmV4dF9hcmcoY2hhciAqYXJncywgY2hhciAqKnBhcmFtLCBjaGFyICoqdmFsKQoreworCXVuc2lnbmVkIGludCBpLCBlcXVhbHMgPSAwOworCWludCBpbl9xdW90ZSA9IDAsIHF1b3RlZCA9IDA7CisJY2hhciAqbmV4dDsKKworCWlmICgqYXJncyA9PSAnIicpIHsKKwkJYXJncysrOworCQlpbl9xdW90ZSA9IDE7CisJCXF1b3RlZCA9IDE7CisJfQorCisJZm9yIChpID0gMDsgYXJnc1tpXTsgaSsrKSB7CisJCWlmIChhcmdzW2ldID09ICcgJyAmJiAhaW5fcXVvdGUpCisJCQlicmVhazsKKwkJaWYgKGVxdWFscyA9PSAwKSB7CisJCQlpZiAoYXJnc1tpXSA9PSAnPScpCisJCQkJZXF1YWxzID0gaTsKKwkJfQorCQlpZiAoYXJnc1tpXSA9PSAnIicpCisJCQlpbl9xdW90ZSA9ICFpbl9xdW90ZTsKKwl9CisKKwkqcGFyYW0gPSBhcmdzOworCWlmICghZXF1YWxzKQorCQkqdmFsID0gTlVMTDsKKwllbHNlIHsKKwkJYXJnc1tlcXVhbHNdID0gJ1wwJzsKKwkJKnZhbCA9IGFyZ3MgKyBlcXVhbHMgKyAxOworCisJCS8qIERvbid0IGluY2x1ZGUgcXVvdGVzIGluIHZhbHVlLiAqLworCQlpZiAoKip2YWwgPT0gJyInKSB7CisJCQkoKnZhbCkrKzsKKwkJCWlmIChhcmdzW2ktMV0gPT0gJyInKQorCQkJCWFyZ3NbaS0xXSA9ICdcMCc7CisJCX0KKwkJaWYgKHF1b3RlZCAmJiBhcmdzW2ktMV0gPT0gJyInKQorCQkJYXJnc1tpLTFdID0gJ1wwJzsKKwl9CisKKwlpZiAoYXJnc1tpXSkgeworCQlhcmdzW2ldID0gJ1wwJzsKKwkJbmV4dCA9IGFyZ3MgKyBpICsgMTsKKwl9IGVsc2UKKwkJbmV4dCA9IGFyZ3MgKyBpOworCisJLyogQ2hldyB1cCB0cmFpbGluZyBzcGFjZXMuICovCisJcmV0dXJuIHNraXBfd2hpdGVzcGFjZShuZXh0KTsKK30KKworc3RhdGljIHZvaWQKK25ld19wcm9jZXNzX21vZHVsZV9hcmd1bWVudHMoc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICpvcHRpb25zKQoreworCWNoYXIgKnhvcHRpb25zLCAqcG9zOworCWNoYXIgKnBhcmFtLCAqdmFsOworCisJeG9wdGlvbnMgPSBwb3MgPSB4c3RyZHVwKHNraXBfd2hpdGVzcGFjZShvcHRpb25zKSk7CisJd2hpbGUgKCpwb3MpIHsKKwkJdW5zaWduZWQgbG9uZyBjaGFyc3NpemUgPSAwOworCQljaGFyICp0bXAsICpjb250ZW50cywgKmxvYywgKnBpbmZvLCAqcDsKKwkJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKKwkJaW50IG1pbiwgbWF4LCBuLCBsZW47CisKKwkJcG9zID0gbmV4dF9hcmcocG9zLCAmcGFyYW0sICZ2YWwpOworCisJCXRtcCA9IHhhc3ByaW50ZigicGFybV8lcyIsIHBhcmFtKTsKKwkJcGluZm8gPSBnZXRfbW9kaW5mb192YWx1ZShmLCB0bXApOworCQlmcmVlKHRtcCk7CisJCWlmIChwaW5mbyA9PSBOVUxMKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgcGFyYW1ldGVyICVzIiwgcGFyYW0pOworCisjaWZkZWYgU1lNQk9MX1BSRUZJWAorCQl0bXAgPSB4YXNwcmludGYoU1lNQk9MX1BSRUZJWCAiJXMiLCBwYXJhbSk7CisJCXN5bSA9IG9ial9maW5kX3N5bWJvbChmLCB0bXApOworCQlmcmVlKHRtcCk7CisjZWxzZQorCQlzeW0gPSBvYmpfZmluZF9zeW1ib2woZiwgcGFyYW0pOworI2VuZGlmCisKKwkJLyogQWxzbyBjaGVjayB0aGF0IHRoZSBwYXJhbWV0ZXIgd2FzIG5vdCByZXNvbHZlZCBmcm9tIHRoZSBrZXJuZWwuICAqLworCQlpZiAoc3ltID09IE5VTEwgfHwgc3ltLT5zZWNpZHggPiBTSE5fSElSRVNFUlZFKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN5bWJvbCBmb3IgcGFyYW1ldGVyICVzIG5vdCBmb3VuZCIsIHBhcmFtKTsKKworCQkvKiBOdW1iZXIgb2YgcGFyYW1ldGVycyAqLworCQltaW4gPSBtYXggPSAxOworCQlpZiAoaXNkaWdpdCgqcGluZm8pKSB7CisJCQltaW4gPSBtYXggPSBzdHJ0b3VsKHBpbmZvLCAmcGluZm8sIDEwKTsKKwkJCWlmICgqcGluZm8gPT0gJy0nKQorCQkJCW1heCA9IHN0cnRvdWwocGluZm8gKyAxLCAmcGluZm8sIDEwKTsKKwkJfQorCisJCWNvbnRlbnRzID0gZi0+c2VjdGlvbnNbc3ltLT5zZWNpZHhdLT5jb250ZW50czsKKwkJbG9jID0gY29udGVudHMgKyBzeW0tPnZhbHVlOworCisJCWlmICgqcGluZm8gPT0gJ2MnKSB7CisJCQlpZiAoIWlzZGlnaXQocGluZm9bMV0pKSB7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInBhcmFtZXRlciB0eXBlICdjJyBmb3IgJXMgbXVzdCBiZSBmb2xsb3dlZCBieSIKKwkJCQkJCSAgICAgIiB0aGUgbWF4aW11bSBzaXplIiwgcGFyYW0pOworCQkJfQorCQkJY2hhcnNzaXplID0gc3RydG91bChwaW5mbyArIDEsIE5VTEwsIDEwKTsKKwkJfQorCisJCWlmICh2YWwgPT0gTlVMTCkgeworCQkJaWYgKCpwaW5mbyAhPSAnYicpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImFyZ3VtZW50IGV4cGVjdGVkIGZvciBwYXJhbWV0ZXIgJXMiLCBwYXJhbSk7CisJCQl2YWwgPSAoY2hhciAqKSAiMSI7CisJCX0KKworCQkvKiBQYXJzZSBwYXJhbWV0ZXIgdmFsdWVzICovCisJCW4gPSAwOworCQlwID0gdmFsOworCQl3aGlsZSAoKnApIHsKKwkJCWNoYXIgc3ZfY2g7CisJCQljaGFyICplbmRwOworCisJCQlpZiAoKytuID4gbWF4KQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0b28gbWFueSB2YWx1ZXMgZm9yICVzIChtYXggJWQpIiwgcGFyYW0sIG1heCk7CisKKwkJCXN3aXRjaCAoKnBpbmZvKSB7CisJCQljYXNlICdzJzoKKwkJCQlsZW4gPSBzdHJjc3BuKHAsICIsIik7CisJCQkJc3ZfY2ggPSBwW2xlbl07CisJCQkJcFtsZW5dID0gJ1wwJzsKKwkJCQlvYmpfc3RyaW5nX3BhdGNoKGYsIHN5bS0+c2VjaWR4LAorCQkJCQkJIGxvYyAtIGNvbnRlbnRzLCBwKTsKKwkJCQlsb2MgKz0gdGd0X3NpemVvZl9jaGFyX3A7CisJCQkJcCArPSBsZW47CisJCQkJKnAgPSBzdl9jaDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2MnOgorCQkJCWxlbiA9IHN0cmNzcG4ocCwgIiwiKTsKKwkJCQlzdl9jaCA9IHBbbGVuXTsKKwkJCQlwW2xlbl0gPSAnXDAnOworCQkJCWlmIChsZW4gPj0gY2hhcnNzaXplKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic3RyaW5nIHRvbyBsb25nIGZvciAlcyAobWF4ICVsZCkiLCBwYXJhbSwKKwkJCQkJCQkgICAgIGNoYXJzc2l6ZSAtIDEpOworCQkJCXN0cmNweSgoY2hhciAqKSBsb2MsIHApOworCQkJCWxvYyArPSBjaGFyc3NpemU7CisJCQkJcCArPSBsZW47CisJCQkJKnAgPSBzdl9jaDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2InOgorCQkJCSpsb2MrKyA9IHN0cnRvdWwocCwgJmVuZHAsIDApOworCQkJCXAgPSBlbmRwOyAvKiBnY2MgbGlrZXMgdGVtcCB2YXIgZm9yICZlbmRwICovCisJCQkJYnJlYWs7CisJCQljYXNlICdoJzoKKwkJCQkqKHNob3J0ICopIGxvYyA9IHN0cnRvdWwocCwgJmVuZHAsIDApOworCQkJCWxvYyArPSB0Z3Rfc2l6ZW9mX3Nob3J0OworCQkJCXAgPSBlbmRwOworCQkJCWJyZWFrOworCQkJY2FzZSAnaSc6CisJCQkJKihpbnQgKikgbG9jID0gc3RydG91bChwLCAmZW5kcCwgMCk7CisJCQkJbG9jICs9IHRndF9zaXplb2ZfaW50OworCQkJCXAgPSBlbmRwOworCQkJCWJyZWFrOworCQkJY2FzZSAnbCc6CisJCQkJKihsb25nICopIGxvYyA9IHN0cnRvdWwocCwgJmVuZHAsIDApOworCQkJCWxvYyArPSB0Z3Rfc2l6ZW9mX2xvbmc7CisJCQkJcCA9IGVuZHA7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duIHBhcmFtZXRlciB0eXBlICclYycgZm9yICVzIiwKKwkJCQkJCSAgICAgKnBpbmZvLCBwYXJhbSk7CisJCQl9CisKKwkJCXAgPSBza2lwX3doaXRlc3BhY2UocCk7CisJCQlpZiAoKnAgIT0gJywnKQorCQkJCWJyZWFrOworCQkJcCA9IHNraXBfd2hpdGVzcGFjZShwICsgMSk7CisJCX0KKworCQlpZiAobiA8IG1pbikKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJwYXJhbWV0ZXIgJXMgcmVxdWlyZXMgYXQgbGVhc3QgJWQgYXJndW1lbnRzIiwgcGFyYW0sIG1pbik7CisJCWlmICgqcCAhPSAnXDAnKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgYXJndW1lbnQgc3ludGF4IGZvciAlcyIsIHBhcmFtKTsKKwl9CisKKwlmcmVlKHhvcHRpb25zKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCitzdGF0aWMgaW50IG5ld19pc19tb2R1bGVfY2hlY2tzdW1tZWQoc3RydWN0IG9ial9maWxlICpmKQoreworCWNvbnN0IGNoYXIgKnAgPSBnZXRfbW9kaW5mb192YWx1ZShmLCAidXNpbmdfY2hlY2tzdW1zIik7CisJaWYgKHApCisJCXJldHVybiB4YXRvaShwKTsKKwlyZXR1cm4gMDsKK30KKworLyogR2V0IHRoZSBtb2R1bGUncyBrZXJuZWwgdmVyc2lvbiBpbiB0aGUgY2Fub25pY2FsIGludGVnZXIgZm9ybS4gICovCisKK3N0YXRpYyBpbnQKK25ld19nZXRfbW9kdWxlX3ZlcnNpb24oc3RydWN0IG9ial9maWxlICpmLCBjaGFyIHN0cltTVFJWRVJTSU9OTEVOXSkKK3sKKwljaGFyICpwLCAqcTsKKwlpbnQgYSwgYiwgYzsKKworCXAgPSBnZXRfbW9kaW5mb192YWx1ZShmLCAia2VybmVsX3ZlcnNpb24iKTsKKwlpZiAocCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisJc2FmZV9zdHJuY3B5KHN0ciwgcCwgU1RSVkVSU0lPTkxFTik7CisKKwlhID0gc3RydG91bChwLCAmcCwgMTApOworCWlmICgqcCAhPSAnLicpCisJCXJldHVybiAtMTsKKwliID0gc3RydG91bChwICsgMSwgJnAsIDEwKTsKKwlpZiAoKnAgIT0gJy4nKQorCQlyZXR1cm4gLTE7CisJYyA9IHN0cnRvdWwocCArIDEsICZxLCAxMCk7CisJaWYgKHAgKyAxID09IHEpCisJCXJldHVybiAtMTsKKworCXJldHVybiBhIDw8IDE2IHwgYiA8PCA4IHwgYzsKK30KKworI2VuZGlmICAgLyogRkVBVFVSRV9JTlNNT0RfVkVSU0lPTl9DSEVDS0lORyAqLworCisKKy8qIEZldGNoIHRoZSBsb2FkZWQgbW9kdWxlcywgYW5kIGFsbCBjdXJyZW50bHkgZXhwb3J0ZWQgc3ltYm9scy4gICovCisKK3N0YXRpYyB2b2lkIG5ld19nZXRfa2VybmVsX3N5bWJvbHModm9pZCkKK3sKKwljaGFyICptb2R1bGVfbmFtZXMsICptbjsKKwlzdHJ1Y3QgZXh0ZXJuYWxfbW9kdWxlICptb2R1bGVzLCAqbTsKKwlzdHJ1Y3QgbmV3X21vZHVsZV9zeW1ib2wgKnN5bXMsICpzOworCXNpemVfdCByZXQsIGJ1ZnNpemUsIG5tb2QsIG5zeW1zLCBpLCBqOworCisJLyogQ29sbGVjdCB0aGUgbG9hZGVkIG1vZHVsZXMuICAqLworCisJYnVmc2l6ZSA9IDI1NjsKKwltb2R1bGVfbmFtZXMgPSB4bWFsbG9jKGJ1ZnNpemUpOworCisgcmV0cnlfbW9kdWxlc19sb2FkOgorCWlmIChxdWVyeV9tb2R1bGUoTlVMTCwgUU1fTU9EVUxFUywgbW9kdWxlX25hbWVzLCBidWZzaXplLCAmcmV0KSkgeworCQlpZiAoZXJybm8gPT0gRU5PU1BDICYmIGJ1ZnNpemUgPCByZXQpIHsKKwkJCWJ1ZnNpemUgPSByZXQ7CisJCQltb2R1bGVfbmFtZXMgPSB4cmVhbGxvYyhtb2R1bGVfbmFtZXMsIGJ1ZnNpemUpOworCQkJZ290byByZXRyeV9tb2R1bGVzX2xvYWQ7CisJCX0KKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJRTV9NT0RVTEVTIik7CisJfQorCisJbl9leHRfbW9kdWxlcyA9IG5tb2QgPSByZXQ7CisKKwkvKiBDb2xsZWN0IHRoZSBtb2R1bGVzJyBzeW1ib2xzLiAgKi8KKworCWlmIChubW9kKSB7CisJCWV4dF9tb2R1bGVzID0gbW9kdWxlcyA9IHh6YWxsb2Mobm1vZCAqIHNpemVvZigqbW9kdWxlcykpOworCQlmb3IgKGkgPSAwLCBtbiA9IG1vZHVsZV9uYW1lcywgbSA9IG1vZHVsZXM7CisJCQkJaSA8IG5tb2Q7ICsraSwgKyttLCBtbiArPSBzdHJsZW4obW4pICsgMSkgeworCQkJc3RydWN0IG5ld19tb2R1bGVfaW5mbyBpbmZvOworCisJCQlpZiAocXVlcnlfbW9kdWxlKG1uLCBRTV9JTkZPLCAmaW5mbywgc2l6ZW9mKGluZm8pLCAmcmV0KSkgeworCQkJCWlmIChlcnJubyA9PSBFTk9FTlQpIHsKKwkJCQkJLyogVGhlIG1vZHVsZSB3YXMgcmVtb3ZlZCBvdXQgZnJvbSB1bmRlcm5lYXRoIHVzLiAgKi8KKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgicXVlcnlfbW9kdWxlOiBRTV9JTkZPOiAlcyIsIG1uKTsKKwkJCX0KKworCQkJYnVmc2l6ZSA9IDEwMjQ7CisJCQlzeW1zID0geG1hbGxvYyhidWZzaXplKTsKKyByZXRyeV9tb2Rfc3ltX2xvYWQ6CisJCQlpZiAocXVlcnlfbW9kdWxlKG1uLCBRTV9TWU1CT0xTLCBzeW1zLCBidWZzaXplLCAmcmV0KSkgeworCQkJCXN3aXRjaCAoZXJybm8pIHsKKwkJCQkJY2FzZSBFTk9TUEM6CisJCQkJCQlidWZzaXplID0gcmV0OworCQkJCQkJc3ltcyA9IHhyZWFsbG9jKHN5bXMsIGJ1ZnNpemUpOworCQkJCQkJZ290byByZXRyeV9tb2Rfc3ltX2xvYWQ7CisJCQkJCWNhc2UgRU5PRU5UOgorCQkJCQkJLyogVGhlIG1vZHVsZSB3YXMgcmVtb3ZlZCBvdXQgZnJvbSB1bmRlcm5lYXRoIHVzLiAgKi8KKwkJCQkJCWNvbnRpbnVlOworCQkJCQlkZWZhdWx0OgorCQkJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJxdWVyeV9tb2R1bGU6IFFNX1NZTUJPTFM6ICVzIiwgbW4pOworCQkJCX0KKwkJCX0KKwkJCW5zeW1zID0gcmV0OworCisJCQltLT5uYW1lID0gbW47CisJCQltLT5hZGRyID0gaW5mby5hZGRyOworCQkJbS0+bnN5bXMgPSBuc3ltczsKKwkJCW0tPnN5bXMgPSBzeW1zOworCisJCQlmb3IgKGogPSAwLCBzID0gc3ltczsgaiA8IG5zeW1zOyArK2osICsrcykgeworCQkJCXMtPm5hbWUgKz0gKHVuc2lnbmVkIGxvbmcpIHN5bXM7CisJCQl9CisJCX0KKwl9CisKKwkvKiBDb2xsZWN0IHRoZSBrZXJuZWwncyBzeW1ib2xzLiAgKi8KKworCWJ1ZnNpemUgPSAxNiAqIDEwMjQ7CisJc3ltcyA9IHhtYWxsb2MoYnVmc2l6ZSk7CisgcmV0cnlfa2Vybl9zeW1fbG9hZDoKKwlpZiAocXVlcnlfbW9kdWxlKE5VTEwsIFFNX1NZTUJPTFMsIHN5bXMsIGJ1ZnNpemUsICZyZXQpKSB7CisJCWlmIChlcnJubyA9PSBFTk9TUEMgJiYgYnVmc2l6ZSA8IHJldCkgeworCQkJYnVmc2l6ZSA9IHJldDsKKwkJCXN5bXMgPSB4cmVhbGxvYyhzeW1zLCBidWZzaXplKTsKKwkJCWdvdG8gcmV0cnlfa2Vybl9zeW1fbG9hZDsKKwkJfQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImtlcm5lbDogUU1fU1lNQk9MUyIpOworCX0KKwlua3N5bXMgPSBuc3ltcyA9IHJldDsKKwlrc3ltcyA9IHN5bXM7CisKKwlmb3IgKGogPSAwLCBzID0gc3ltczsgaiA8IG5zeW1zOyArK2osICsrcykgeworCQlzLT5uYW1lICs9ICh1bnNpZ25lZCBsb25nKSBzeW1zOworCX0KK30KKworCisvKiBSZXR1cm4gdGhlIGtlcm5lbCBzeW1ib2wgY2hlY2tzdW0gdmVyc2lvbiwgb3IgemVybyBpZiBub3QgdXNlZC4gICovCisKK3N0YXRpYyBpbnQgbmV3X2lzX2tlcm5lbF9jaGVja3N1bW1lZCh2b2lkKQoreworCXN0cnVjdCBuZXdfbW9kdWxlX3N5bWJvbCAqczsKKwlzaXplX3QgaTsKKworCS8qIFVzaW5nX1ZlcnNpb25zIGlzIG5vdCB0aGUgZmlyc3Qgc3ltYm9sLCBidXQgaXQgc2hvdWxkIGJlIGluIHRoZXJlLiAgKi8KKworCWZvciAoaSA9IDAsIHMgPSBrc3ltczsgaSA8IG5rc3ltczsgKytpLCArK3MpCisJCWlmIChzdHJjbXAoKGNoYXIgKikgcy0+bmFtZSwgIlVzaW5nX1ZlcnNpb25zIikgPT0gMCkKKwkJCXJldHVybiBzLT52YWx1ZTsKKworCXJldHVybiAwOworfQorCisKK3N0YXRpYyB2b2lkIG5ld19jcmVhdGVfdGhpc19tb2R1bGUoc3RydWN0IG9ial9maWxlICpmLCBjb25zdCBjaGFyICptX25hbWUpCit7CisJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CisKKwlzZWMgPSBvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbl9maXJzdChmLCAiLnRoaXMiLCB0Z3Rfc2l6ZW9mX2xvbmcsCisJCQlzaXplb2Yoc3RydWN0IG5ld19tb2R1bGUpKTsKKwkvKiBkb25lIGJ5IG9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uX2ZpcnN0OiAqLworCS8qbWVtc2V0KHNlYy0+Y29udGVudHMsIDAsIHNpemVvZihzdHJ1Y3QgbmV3X21vZHVsZSkpOyovCisKKwlvYmpfYWRkX3N5bWJvbChmLCBTUEZYICJfX3RoaXNfbW9kdWxlIiwgLTEsCisJCQlFTEZfU1RfSU5GTyhTVEJfTE9DQUwsIFNUVF9PQkpFQ1QpLCBzZWMtPmlkeCwgMCwKKwkJCXNpemVvZihzdHJ1Y3QgbmV3X21vZHVsZSkpOworCisJb2JqX3N0cmluZ19wYXRjaChmLCBzZWMtPmlkeCwgb2Zmc2V0b2Yoc3RydWN0IG5ld19tb2R1bGUsIG5hbWUpLAorCQkJbV9uYW1lKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTCisvKiBhZGQgYW4gZW50cnkgdG8gdGhlIF9fa3N5bXRhYiBzZWN0aW9uLCBjcmVhdGluZyBpdCBpZiBuZWNlc3NhcnkgKi8KK3N0YXRpYyB2b2lkIG5ld19hZGRfa3N5bXRhYihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIHN0cnVjdCBvYmpfc3ltYm9sICpzeW0pCit7CisJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CisJRWxmVyhBZGRyKSBvZnM7CisKKwkvKiBlbnN1cmUgX19rc3ltdGFiIGlzIGFsbG9jYXRlZCwgRVhQT1JUX05PU1lNQk9MUyBjcmVhdGVzIGEgbm9uLWFsbG9jIHNlY3Rpb24uCisJICogSWYgX19rc3ltdGFiIGlzIGRlZmluZWQgYnV0IG5vdCBtYXJrZWQgYWxsb2MsIHggb3V0IHRoZSBmaXJzdCBjaGFyYWN0ZXIKKwkgKiAobm8gb2JqX2RlbGV0ZSByb3V0aW5lKSBhbmQgY3JlYXRlIGEgbmV3IF9fa3N5bXRhYiB3aXRoIHRoZSBjb3JyZWN0CisJICogY2hhcmFjdGVyaXN0aWNzLgorCSAqLworCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIl9fa3N5bXRhYiIpOworCWlmIChzZWMgJiYgIShzZWMtPmhlYWRlci5zaF9mbGFncyAmIFNIRl9BTExPQykpIHsKKwkJKigoY2hhciAqKShzZWMtPm5hbWUpKSA9ICd4JzsJLyogb3ZlcnJpZGUgY29uc3QgKi8KKwkJc2VjID0gTlVMTDsKKwl9CisJaWYgKCFzZWMpCisJCXNlYyA9IG9ial9jcmVhdGVfYWxsb2NlZF9zZWN0aW9uKGYsICJfX2tzeW10YWIiLAorCQkJCXRndF9zaXplb2Zfdm9pZF9wLCAwKTsKKwlpZiAoIXNlYykKKwkJcmV0dXJuOworCXNlYy0+aGVhZGVyLnNoX2ZsYWdzIHw9IFNIRl9BTExPQzsKKwkvKiBFbXB0eSBzZWN0aW9uIG1pZ2h0IGJlIGJ5dGUtYWxpZ25lZCAqLworCXNlYy0+aGVhZGVyLnNoX2FkZHJhbGlnbiA9IHRndF9zaXplb2Zfdm9pZF9wOworCW9mcyA9IHNlYy0+aGVhZGVyLnNoX3NpemU7CisJb2JqX3N5bWJvbF9wYXRjaChmLCBzZWMtPmlkeCwgb2ZzLCBzeW0pOworCW9ial9zdHJpbmdfcGF0Y2goZiwgc2VjLT5pZHgsIG9mcyArIHRndF9zaXplb2Zfdm9pZF9wLCBzeW0tPm5hbWUpOworCW9ial9leHRlbmRfc2VjdGlvbihzZWMsIDIgKiB0Z3Rfc2l6ZW9mX2NoYXJfcCk7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9JTlNNT0RfS1NZTU9PUFNfU1lNQk9MUyAqLworCitzdGF0aWMgaW50IG5ld19jcmVhdGVfbW9kdWxlX2tzeW10YWIoc3RydWN0IG9ial9maWxlICpmKQoreworCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOworCWludCBpOworCisJLyogV2UgbXVzdCBhbHdheXMgYWRkIHRoZSBtb2R1bGUgcmVmZXJlbmNlcy4gICovCisKKwlpZiAobl9leHRfbW9kdWxlc191c2VkKSB7CisJCXN0cnVjdCBuZXdfbW9kdWxlX3JlZiAqZGVwOworCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqdG07CisKKwkJc2VjID0gb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb24oZiwgIi5rbW9kdGFiIiwgdGd0X3NpemVvZl92b2lkX3AsCisJCQkJKHNpemVvZihzdHJ1Y3QgbmV3X21vZHVsZV9yZWYpCisJCQkJICogbl9leHRfbW9kdWxlc191c2VkKSk7CisJCWlmICghc2VjKQorCQkJcmV0dXJuIDA7CisKKwkJdG0gPSBvYmpfZmluZF9zeW1ib2woZiwgU1BGWCAiX190aGlzX21vZHVsZSIpOworCQlkZXAgPSAoc3RydWN0IG5ld19tb2R1bGVfcmVmICopIHNlYy0+Y29udGVudHM7CisJCWZvciAoaSA9IDA7IGkgPCBuX2V4dF9tb2R1bGVzOyArK2kpCisJCQlpZiAoZXh0X21vZHVsZXNbaV0udXNlZCkgeworCQkJCWRlcC0+ZGVwID0gZXh0X21vZHVsZXNbaV0uYWRkcjsKKwkJCQlvYmpfc3ltYm9sX3BhdGNoKGYsIHNlYy0+aWR4LAorCQkJCQkJKGNoYXIgKikgJmRlcC0+cmVmIC0gc2VjLT5jb250ZW50cywgdG0pOworCQkJCWRlcC0+bmV4dF9yZWYgPSAwOworCQkJCSsrZGVwOworCQkJfQorCX0KKworCWlmICghZmxhZ19ub2V4cG9ydCAmJiAhb2JqX2ZpbmRfc2VjdGlvbihmLCAiX19rc3ltdGFiIikpIHsKKwkJc2l6ZV90IG5zeW1zOworCQlpbnQgKmxvYWRlZDsKKworCQlzZWMgPSBvYmpfY3JlYXRlX2FsbG9jZWRfc2VjdGlvbihmLCAiX19rc3ltdGFiIiwgdGd0X3NpemVvZl92b2lkX3AsIDApOworCisJCS8qIFdlIGRvbid0IHdhbnQgdG8gZXhwb3J0IHN5bWJvbHMgcmVzaWRpbmcgaW4gc2VjdGlvbnMgdGhhdAorCQkgICBhcmVuJ3QgbG9hZGVkLiAgVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRoZXNlIGNyZWF0ZWQgc28gdGhhdAorCQkgICB3ZSBtYWtlIHN1cmUgY2VydGFpbiBtb2R1bGUgb3B0aW9ucyBkb24ndCBhcHBlYXIgdHdpY2UuICAqLworCQlpID0gZi0+aGVhZGVyLmVfc2hudW07CisJCWxvYWRlZCA9IGFsbG9jYShzaXplb2YoaW50KSAqIGkpOworCQl3aGlsZSAoLS1pID49IDApCisJCQlsb2FkZWRbaV0gPSAoZi0+c2VjdGlvbnNbaV0tPmhlYWRlci5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMDsKKworCQlmb3IgKG5zeW1zID0gaSA9IDA7IGkgPCBIQVNIX0JVQ0tFVFM7ICsraSkgeworCQkJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKKwkJCWZvciAoc3ltID0gZi0+c3ltdGFiW2ldOyBzeW07IHN5bSA9IHN5bS0+bmV4dCkgeworCQkJCWlmIChFTEZfU1RfQklORChzeW0tPmluZm8pICE9IFNUQl9MT0NBTAorCQkJCSAmJiBzeW0tPnNlY2lkeCA8PSBTSE5fSElSRVNFUlZFCisJCQkJICYmIChzeW0tPnNlY2lkeCA+PSBTSE5fTE9SRVNFUlZFIHx8IGxvYWRlZFtzeW0tPnNlY2lkeF0pCisJCQkJKSB7CisJCQkJCUVsZlcoQWRkcikgb2ZzID0gbnN5bXMgKiAyICogdGd0X3NpemVvZl92b2lkX3A7CisKKwkJCQkJb2JqX3N5bWJvbF9wYXRjaChmLCBzZWMtPmlkeCwgb2ZzLCBzeW0pOworCQkJCQlvYmpfc3RyaW5nX3BhdGNoKGYsIHNlYy0+aWR4LCBvZnMgKyB0Z3Rfc2l6ZW9mX3ZvaWRfcCwKKwkJCQkJCQlzeW0tPm5hbWUpOworCQkJCQluc3ltcysrOworCQkJCX0KKwkJCX0KKwkJfQorCisJCW9ial9leHRlbmRfc2VjdGlvbihzZWMsIG5zeW1zICogMiAqIHRndF9zaXplb2ZfY2hhcl9wKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworCitzdGF0aWMgaW50CituZXdfaW5pdF9tb2R1bGUoY29uc3QgY2hhciAqbV9uYW1lLCBzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIHVuc2lnbmVkIGxvbmcgbV9zaXplKQoreworCXN0cnVjdCBuZXdfbW9kdWxlICptb2R1bGU7CisJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CisJdm9pZCAqaW1hZ2U7CisJaW50IHJldDsKKwl0Z3RfbG9uZyBtX2FkZHI7CisKKwlzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICIudGhpcyIpOworCWlmICghc2VjIHx8ICFzZWMtPmNvbnRlbnRzKSB7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY29ycnVwdCBtb2R1bGUgJXM/IiwgbV9uYW1lKTsKKwl9CisJbW9kdWxlID0gKHN0cnVjdCBuZXdfbW9kdWxlICopIHNlYy0+Y29udGVudHM7CisJbV9hZGRyID0gc2VjLT5oZWFkZXIuc2hfYWRkcjsKKworCW1vZHVsZS0+c2l6ZV9vZl9zdHJ1Y3QgPSBzaXplb2YoKm1vZHVsZSk7CisJbW9kdWxlLT5zaXplID0gbV9zaXplOworCW1vZHVsZS0+ZmxhZ3MgPSBmbGFnX2F1dG9jbGVhbiA/IE5FV19NT0RfQVVUT0NMRUFOIDogMDsKKworCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIl9fa3N5bXRhYiIpOworCWlmIChzZWMgJiYgc2VjLT5oZWFkZXIuc2hfc2l6ZSkgeworCQltb2R1bGUtPnN5bXMgPSBzZWMtPmhlYWRlci5zaF9hZGRyOworCQltb2R1bGUtPm5zeW1zID0gc2VjLT5oZWFkZXIuc2hfc2l6ZSAvICgyICogdGd0X3NpemVvZl9jaGFyX3ApOworCX0KKworCWlmIChuX2V4dF9tb2R1bGVzX3VzZWQpIHsKKwkJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiLmttb2R0YWIiKTsKKwkJbW9kdWxlLT5kZXBzID0gc2VjLT5oZWFkZXIuc2hfYWRkcjsKKwkJbW9kdWxlLT5uZGVwcyA9IG5fZXh0X21vZHVsZXNfdXNlZDsKKwl9CisKKwltb2R1bGUtPmluaXQgPSBvYmpfc3ltYm9sX2ZpbmFsX3ZhbHVlKGYsIG9ial9maW5kX3N5bWJvbChmLCBTUEZYICJpbml0X21vZHVsZSIpKTsKKwltb2R1bGUtPmNsZWFudXAgPSBvYmpfc3ltYm9sX2ZpbmFsX3ZhbHVlKGYsIG9ial9maW5kX3N5bWJvbChmLCBTUEZYICJjbGVhbnVwX21vZHVsZSIpKTsKKworCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIl9fZXhfdGFibGUiKTsKKwlpZiAoc2VjKSB7CisJCW1vZHVsZS0+ZXhfdGFibGVfc3RhcnQgPSBzZWMtPmhlYWRlci5zaF9hZGRyOworCQltb2R1bGUtPmV4X3RhYmxlX2VuZCA9IHNlYy0+aGVhZGVyLnNoX2FkZHIgKyBzZWMtPmhlYWRlci5zaF9zaXplOworCX0KKworCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi50ZXh0LmluaXQiKTsKKwlpZiAoc2VjKSB7CisJCW1vZHVsZS0+cnVuc2l6ZSA9IHNlYy0+aGVhZGVyLnNoX2FkZHIgLSBtX2FkZHI7CisJfQorCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgIi5kYXRhLmluaXQiKTsKKwlpZiAoc2VjKSB7CisJCWlmICghbW9kdWxlLT5ydW5zaXplCisJCSB8fCBtb2R1bGUtPnJ1bnNpemUgPiBzZWMtPmhlYWRlci5zaF9hZGRyIC0gbV9hZGRyCisJCSkgeworCQkJbW9kdWxlLT5ydW5zaXplID0gc2VjLT5oZWFkZXIuc2hfYWRkciAtIG1fYWRkcjsKKwkJfQorCX0KKwlzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsIEFSQ0hEQVRBX1NFQ19OQU1FKTsKKwlpZiAoc2VjICYmIHNlYy0+aGVhZGVyLnNoX3NpemUpIHsKKwkJbW9kdWxlLT5hcmNoZGF0YV9zdGFydCA9ICh2b2lkKilzZWMtPmhlYWRlci5zaF9hZGRyOworCQltb2R1bGUtPmFyY2hkYXRhX2VuZCA9IG1vZHVsZS0+YXJjaGRhdGFfc3RhcnQgKyBzZWMtPmhlYWRlci5zaF9zaXplOworCX0KKwlzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsIEtBTExTWU1TX1NFQ19OQU1FKTsKKwlpZiAoc2VjICYmIHNlYy0+aGVhZGVyLnNoX3NpemUpIHsKKwkJbW9kdWxlLT5rYWxsc3ltc19zdGFydCA9ICh2b2lkKilzZWMtPmhlYWRlci5zaF9hZGRyOworCQltb2R1bGUtPmthbGxzeW1zX2VuZCA9IG1vZHVsZS0+a2FsbHN5bXNfc3RhcnQgKyBzZWMtPmhlYWRlci5zaF9zaXplOworCX0KKworCS8qIFdoZXchICBBbGwgb2YgdGhlIGluaXRpYWxpemF0aW9uIGlzIGNvbXBsZXRlLiAgQ29sbGVjdCB0aGUgZmluYWwKKwkgICBtb2R1bGUgaW1hZ2UgYW5kIGdpdmUgaXQgdG8gdGhlIGtlcm5lbC4gICovCisKKwlpbWFnZSA9IHhtYWxsb2MobV9zaXplKTsKKwlvYmpfY3JlYXRlX2ltYWdlKGYsIGltYWdlKTsKKworCXJldCA9IGluaXRfbW9kdWxlKG1fbmFtZSwgKHN0cnVjdCBuZXdfbW9kdWxlICopIGltYWdlKTsKKwlpZiAocmV0KQorCQliYl9wZXJyb3JfbXNnKCJpbml0X21vZHVsZTogJXMiLCBtX25hbWUpOworCisJZnJlZShpbWFnZSk7CisKKwlyZXR1cm4gcmV0ID09IDA7Cit9CisKKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHZvaWQKK29ial9zdHJpbmdfcGF0Y2goc3RydWN0IG9ial9maWxlICpmLCBpbnQgc2VjaWR4LCBFbGZXKEFkZHIpIG9mZnNldCwKKwkJCQkgY29uc3QgY2hhciAqc3RyaW5nKQoreworCXN0cnVjdCBvYmpfc3RyaW5nX3BhdGNoICpwOworCXN0cnVjdCBvYmpfc2VjdGlvbiAqc3Ryc2VjOworCXNpemVfdCBsZW4gPSBzdHJsZW4oc3RyaW5nKSArIDE7CisJY2hhciAqbG9jOworCisJcCA9IHh6YWxsb2Moc2l6ZW9mKCpwKSk7CisJcC0+bmV4dCA9IGYtPnN0cmluZ19wYXRjaGVzOworCXAtPnJlbG9jX3NlY2lkeCA9IHNlY2lkeDsKKwlwLT5yZWxvY19vZmZzZXQgPSBvZmZzZXQ7CisJZi0+c3RyaW5nX3BhdGNoZXMgPSBwOworCisJc3Ryc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiLmtzdHJ0YWIiKTsKKwlpZiAoc3Ryc2VjID09IE5VTEwpIHsKKwkJc3Ryc2VjID0gb2JqX2NyZWF0ZV9hbGxvY2VkX3NlY3Rpb24oZiwgIi5rc3RydGFiIiwgMSwgbGVuKTsKKwkJLypwLT5zdHJpbmdfb2Zmc2V0ID0gMDsqLworCQlsb2MgPSBzdHJzZWMtPmNvbnRlbnRzOworCX0gZWxzZSB7CisJCXAtPnN0cmluZ19vZmZzZXQgPSBzdHJzZWMtPmhlYWRlci5zaF9zaXplOworCQlsb2MgPSBvYmpfZXh0ZW5kX3NlY3Rpb24oc3Ryc2VjLCBsZW4pOworCX0KKwltZW1jcHkobG9jLCBzdHJpbmcsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkCitvYmpfc3ltYm9sX3BhdGNoKHN0cnVjdCBvYmpfZmlsZSAqZiwgaW50IHNlY2lkeCwgRWxmVyhBZGRyKSBvZmZzZXQsCisJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW0pCit7CisJc3RydWN0IG9ial9zeW1ib2xfcGF0Y2ggKnA7CisKKwlwID0geG1hbGxvYyhzaXplb2YoKnApKTsKKwlwLT5uZXh0ID0gZi0+c3ltYm9sX3BhdGNoZXM7CisJcC0+cmVsb2Nfc2VjaWR4ID0gc2VjaWR4OworCXAtPnJlbG9jX29mZnNldCA9IG9mZnNldDsKKwlwLT5zeW0gPSBzeW07CisJZi0+c3ltYm9sX3BhdGNoZXMgPSBwOworfQorCitzdGF0aWMgdm9pZCBvYmpfY2hlY2tfdW5kZWZpbmVkcyhzdHJ1Y3Qgb2JqX2ZpbGUgKmYpCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBIQVNIX0JVQ0tFVFM7ICsraSkgeworCQlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOworCQlmb3IgKHN5bSA9IGYtPnN5bXRhYltpXTsgc3ltOyBzeW0gPSBzeW0tPm5leHQpIHsKKwkJCWlmIChzeW0tPnNlY2lkeCA9PSBTSE5fVU5ERUYpIHsKKwkJCQlpZiAoRUxGX1NUX0JJTkQoc3ltLT5pbmZvKSA9PSBTVEJfV0VBSykgeworCQkJCQlzeW0tPnNlY2lkeCA9IFNITl9BQlM7CisJCQkJCXN5bS0+dmFsdWUgPSAwOworCQkJCX0gZWxzZSB7CisJCQkJCWlmICghZmxhZ19xdWlldCkKKwkJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bnJlc29sdmVkIHN5bWJvbCAlcyIsIHN5bS0+bmFtZSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBvYmpfYWxsb2NhdGVfY29tbW9ucyhzdHJ1Y3Qgb2JqX2ZpbGUgKmYpCit7CisJc3RydWN0IGNvbW1vbl9lbnRyeSB7CisJCXN0cnVjdCBjb21tb25fZW50cnkgKm5leHQ7CisJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CisJfSAqY29tbW9uX2hlYWQgPSBOVUxMOworCisJdW5zaWduZWQgbG9uZyBpOworCisJZm9yIChpID0gMDsgaSA8IEhBU0hfQlVDS0VUUzsgKytpKSB7CisJCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CisJCWZvciAoc3ltID0gZi0+c3ltdGFiW2ldOyBzeW07IHN5bSA9IHN5bS0+bmV4dCkgeworCQkJaWYgKHN5bS0+c2VjaWR4ID09IFNITl9DT01NT04pIHsKKwkJCQkvKiBDb2xsZWN0IGFsbCBDT01NT04gc3ltYm9scyBhbmQgc29ydCB0aGVtIGJ5IHNpemUgc28gYXMgdG8KKwkJCQkgICBtaW5pbWl6ZSBzcGFjZSB3YXN0ZWQgYnkgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4gICovCisJCQkJc3RydWN0IGNvbW1vbl9lbnRyeSAqKnAsICpuOworCQkJCWZvciAocCA9ICZjb21tb25faGVhZDsgKnA7IHAgPSAmKCpwKS0+bmV4dCkKKwkJCQkJaWYgKHN5bS0+c2l6ZSA8PSAoKnApLT5zeW0tPnNpemUpCisJCQkJCQlicmVhazsKKwkJCQluID0gYWxsb2NhKHNpemVvZigqbikpOworCQkJCW4tPm5leHQgPSAqcDsKKwkJCQluLT5zeW0gPSBzeW07CisJCQkJKnAgPSBuOworCQkJfQorCQl9CisJfQorCisJZm9yIChpID0gMTsgaSA8IGYtPmxvY2FsX3N5bXRhYl9zaXplOyArK2kpIHsKKwkJc3RydWN0IG9ial9zeW1ib2wgKnN5bSA9IGYtPmxvY2FsX3N5bXRhYltpXTsKKwkJaWYgKHN5bSAmJiBzeW0tPnNlY2lkeCA9PSBTSE5fQ09NTU9OKSB7CisJCQlzdHJ1Y3QgY29tbW9uX2VudHJ5ICoqcCwgKm47CisJCQlmb3IgKHAgPSAmY29tbW9uX2hlYWQ7ICpwOyBwID0gJigqcCktPm5leHQpIHsKKwkJCQlpZiAoc3ltID09ICgqcCktPnN5bSkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKHN5bS0+c2l6ZSA8ICgqcCktPnN5bS0+c2l6ZSkgeworCQkJCQluID0gYWxsb2NhKHNpemVvZigqbikpOworCQkJCQluLT5uZXh0ID0gKnA7CisJCQkJCW4tPnN5bSA9IHN5bTsKKwkJCQkJKnAgPSBuOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiAoY29tbW9uX2hlYWQpIHsKKwkJLyogRmluZCB0aGUgYnNzIHNlY3Rpb24uICAqLworCQlmb3IgKGkgPSAwOyBpIDwgZi0+aGVhZGVyLmVfc2hudW07ICsraSkKKwkJCWlmIChmLT5zZWN0aW9uc1tpXS0+aGVhZGVyLnNoX3R5cGUgPT0gU0hUX05PQklUUykKKwkJCQlicmVhazsKKworCQkvKiBJZiBmb3Igc29tZSByZWFzb24gdGhlcmUgaGFkbid0IGJlZW4gb25lLCBjcmVhdGUgb25lLiAgKi8KKwkJaWYgKGkgPT0gZi0+aGVhZGVyLmVfc2hudW0pIHsKKwkJCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOworCisJCQlmLT5oZWFkZXIuZV9zaG51bSsrOworCQkJZi0+c2VjdGlvbnMgPSB4cmVhbGxvY192ZWN0b3IoZi0+c2VjdGlvbnMsIDIsIGkpOworCQkJZi0+c2VjdGlvbnNbaV0gPSBzZWMgPSBhcmNoX25ld19zZWN0aW9uKCk7CisKKwkJCXNlYy0+aGVhZGVyLnNoX3R5cGUgPSBTSFRfUFJPR0JJVFM7CisJCQlzZWMtPmhlYWRlci5zaF9mbGFncyA9IFNIRl9XUklURSB8IFNIRl9BTExPQzsKKwkJCXNlYy0+bmFtZSA9ICIuYnNzIjsKKwkJCXNlYy0+aWR4ID0gaTsKKwkJfQorCisJCS8qIEFsbG9jYXRlIHRoZSBDT01NT05TLiAgKi8KKwkJeworCQkJRWxmVyhBZGRyKSBic3Nfc2l6ZSA9IGYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfc2l6ZTsKKwkJCUVsZlcoQWRkcikgbWF4X2FsaWduID0gZi0+c2VjdGlvbnNbaV0tPmhlYWRlci5zaF9hZGRyYWxpZ247CisJCQlzdHJ1Y3QgY29tbW9uX2VudHJ5ICpjOworCisJCQlmb3IgKGMgPSBjb21tb25faGVhZDsgYzsgYyA9IGMtPm5leHQpIHsKKwkJCQlFbGZXKEFkZHIpIGFsaWduID0gYy0+c3ltLT52YWx1ZTsKKworCQkJCWlmIChhbGlnbiA+IG1heF9hbGlnbikKKwkJCQkJbWF4X2FsaWduID0gYWxpZ247CisJCQkJaWYgKGJzc19zaXplICYgKGFsaWduIC0gMSkpCisJCQkJCWJzc19zaXplID0gKGJzc19zaXplIHwgKGFsaWduIC0gMSkpICsgMTsKKworCQkJCWMtPnN5bS0+c2VjaWR4ID0gaTsKKwkJCQljLT5zeW0tPnZhbHVlID0gYnNzX3NpemU7CisKKwkJCQlic3Nfc2l6ZSArPSBjLT5zeW0tPnNpemU7CisJCQl9CisKKwkJCWYtPnNlY3Rpb25zW2ldLT5oZWFkZXIuc2hfc2l6ZSA9IGJzc19zaXplOworCQkJZi0+c2VjdGlvbnNbaV0tPmhlYWRlci5zaF9hZGRyYWxpZ24gPSBtYXhfYWxpZ247CisJCX0KKwl9CisKKwkvKiBGb3IgdGhlIHNha2Ugb2YgcGF0Y2ggcmVsb2NhdGlvbiBhbmQgcGFyYW1ldGVyIGluaXRpYWxpemF0aW9uLAorCSAgIGFsbG9jYXRlIHplcm9lZCBkYXRhIGZvciBOT0JJVFMgc2VjdGlvbnMgbm93LiAgTm90ZSB0aGF0IGFmdGVyCisJICAgdGhpcyB3ZSBjYW5ub3QgYXNzdW1lIE5PQklUUyBhcmUgcmVhbGx5IGVtcHR5LiAgKi8KKwlmb3IgKGkgPSAwOyBpIDwgZi0+aGVhZGVyLmVfc2hudW07ICsraSkgeworCQlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnMgPSBmLT5zZWN0aW9uc1tpXTsKKwkJaWYgKHMtPmhlYWRlci5zaF90eXBlID09IFNIVF9OT0JJVFMpIHsKKwkJCXMtPmNvbnRlbnRzID0gTlVMTDsKKwkJCWlmIChzLT5oZWFkZXIuc2hfc2l6ZSAhPSAwKQorCQkJCXMtPmNvbnRlbnRzID0geHphbGxvYyhzLT5oZWFkZXIuc2hfc2l6ZSk7CisJCQlzLT5oZWFkZXIuc2hfdHlwZSA9IFNIVF9QUk9HQklUUzsKKwkJfQorCX0KK30KKworc3RhdGljIHVuc2lnbmVkIGxvbmcgb2JqX2xvYWRfc2l6ZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYpCit7CisJdW5zaWduZWQgbG9uZyBkb3QgPSAwOworCXN0cnVjdCBvYmpfc2VjdGlvbiAqc2VjOworCisJLyogRmluYWxpemUgdGhlIHBvc2l0aW9ucyBvZiB0aGUgc2VjdGlvbnMgcmVsYXRpdmUgdG8gb25lIGFub3RoZXIuICAqLworCisJZm9yIChzZWMgPSBmLT5sb2FkX29yZGVyOyBzZWM7IHNlYyA9IHNlYy0+bG9hZF9uZXh0KSB7CisJCUVsZlcoQWRkcikgYWxpZ247CisKKwkJYWxpZ24gPSBzZWMtPmhlYWRlci5zaF9hZGRyYWxpZ247CisJCWlmIChhbGlnbiAmJiAoZG90ICYgKGFsaWduIC0gMSkpKQorCQkJZG90ID0gKGRvdCB8IChhbGlnbiAtIDEpKSArIDE7CisKKwkJc2VjLT5oZWFkZXIuc2hfYWRkciA9IGRvdDsKKwkJZG90ICs9IHNlYy0+aGVhZGVyLnNoX3NpemU7CisJfQorCisJcmV0dXJuIGRvdDsKK30KKworc3RhdGljIGludCBvYmpfcmVsb2NhdGUoc3RydWN0IG9ial9maWxlICpmLCBFbGZXKEFkZHIpIGJhc2UpCit7CisJaW50IGksIG4gPSBmLT5oZWFkZXIuZV9zaG51bTsKKwlpbnQgcmV0ID0gMTsKKworCS8qIEZpbmFsaXplIHRoZSBhZGRyZXNzZXMgb2YgdGhlIHNlY3Rpb25zLiAgKi8KKworCWYtPmJhc2VhZGRyID0gYmFzZTsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKQorCQlmLT5zZWN0aW9uc1tpXS0+aGVhZGVyLnNoX2FkZHIgKz0gYmFzZTsKKworCS8qIEFuZCBpdGVyYXRlIG92ZXIgYWxsIG9mIHRoZSByZWxvY2F0aW9ucy4gICovCisKKwlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisJCXN0cnVjdCBvYmpfc2VjdGlvbiAqcmVsc2VjLCAqc3ltc2VjLCAqdGFyZ3NlYywgKnN0cnNlYzsKKwkJRWxmVyhSZWxNKSAqIHJlbCwgKnJlbGVuZDsKKwkJRWxmVyhTeW0pICogc3ltdGFiOworCQljb25zdCBjaGFyICpzdHJ0YWI7CisKKwkJcmVsc2VjID0gZi0+c2VjdGlvbnNbaV07CisJCWlmIChyZWxzZWMtPmhlYWRlci5zaF90eXBlICE9IFNIVF9SRUxNKQorCQkJY29udGludWU7CisKKwkJc3ltc2VjID0gZi0+c2VjdGlvbnNbcmVsc2VjLT5oZWFkZXIuc2hfbGlua107CisJCXRhcmdzZWMgPSBmLT5zZWN0aW9uc1tyZWxzZWMtPmhlYWRlci5zaF9pbmZvXTsKKwkJc3Ryc2VjID0gZi0+c2VjdGlvbnNbc3ltc2VjLT5oZWFkZXIuc2hfbGlua107CisKKwkJcmVsID0gKEVsZlcoUmVsTSkgKikgcmVsc2VjLT5jb250ZW50czsKKwkJcmVsZW5kID0gcmVsICsgKHJlbHNlYy0+aGVhZGVyLnNoX3NpemUgLyBzaXplb2YoRWxmVyhSZWxNKSkpOworCQlzeW10YWIgPSAoRWxmVyhTeW0pICopIHN5bXNlYy0+Y29udGVudHM7CisJCXN0cnRhYiA9IChjb25zdCBjaGFyICopIHN0cnNlYy0+Y29udGVudHM7CisKKwkJZm9yICg7IHJlbCA8IHJlbGVuZDsgKytyZWwpIHsKKwkJCUVsZlcoQWRkcikgdmFsdWUgPSAwOworCQkJc3RydWN0IG9ial9zeW1ib2wgKmludHN5bSA9IE5VTEw7CisJCQl1bnNpZ25lZCBsb25nIHN5bW5keDsKKwkJCUVsZlcoU3ltKSAqZXh0c3ltID0gTlVMTDsKKwkJCWNvbnN0IGNoYXIgKmVycm1zZzsKKworCQkJLyogQXR0ZW1wdCB0byBmaW5kIGEgdmFsdWUgdG8gdXNlIGZvciB0aGlzIHJlbG9jYXRpb24uICAqLworCisJCQlzeW1uZHggPSBFTEZfUl9TWU0ocmVsLT5yX2luZm8pOworCQkJaWYgKHN5bW5keCkgeworCQkJCS8qIE5vdGUgd2UndmUgYWxyZWFkeSBjaGVja2VkIGZvciB1bmRlZmluZWQgc3ltYm9scy4gICovCisKKwkJCQlleHRzeW0gPSAmc3ltdGFiW3N5bW5keF07CisJCQkJaWYgKEVMRl9TVF9CSU5EKGV4dHN5bS0+c3RfaW5mbykgPT0gU1RCX0xPQ0FMKSB7CisJCQkJCS8qIExvY2FsIHN5bWJvbHMgd2UgbG9vayB1cCBpbiB0aGUgbG9jYWwgdGFibGUgdG8gYmUgc3VyZQorCQkJCQkgICB3ZSBnZXQgdGhlIG9uZSB0aGF0IGlzIHJlYWxseSBpbnRlbmRlZC4gICovCisJCQkJCWludHN5bSA9IGYtPmxvY2FsX3N5bXRhYltzeW1uZHhdOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIE90aGVycyB3ZSBsb29rIHVwIGluIHRoZSBoYXNoIHRhYmxlLiAgKi8KKwkJCQkJY29uc3QgY2hhciAqbmFtZTsKKwkJCQkJaWYgKGV4dHN5bS0+c3RfbmFtZSkKKwkJCQkJCW5hbWUgPSBzdHJ0YWIgKyBleHRzeW0tPnN0X25hbWU7CisJCQkJCWVsc2UKKwkJCQkJCW5hbWUgPSBmLT5zZWN0aW9uc1tleHRzeW0tPnN0X3NobmR4XS0+bmFtZTsKKwkJCQkJaW50c3ltID0gb2JqX2ZpbmRfc3ltYm9sKGYsIG5hbWUpOworCQkJCX0KKworCQkJCXZhbHVlID0gb2JqX3N5bWJvbF9maW5hbF92YWx1ZShmLCBpbnRzeW0pOworCQkJCWludHN5bS0+cmVmZXJlbmNlZCA9IDE7CisJCQl9CisjaWYgU0hUX1JFTE0gPT0gU0hUX1JFTEEKKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykgJiYgZGVmaW5lZChBWFBfQlJPS0VOX0dBUykKKwkJCS8qIFdvcmsgYXJvdW5kIGEgbmFzdHkgR0FTIGJ1ZywgdGhhdCBpcyBmaXhlZCBhcyBvZiAyLjcuMC45LiAgKi8KKwkJCWlmICghZXh0c3ltIHx8ICFleHRzeW0tPnN0X25hbWUKKwkJCSB8fCBFTEZfU1RfQklORChleHRzeW0tPnN0X2luZm8pICE9IFNUQl9MT0NBTCkKKyNlbmRpZgorCQkJCXZhbHVlICs9IHJlbC0+cl9hZGRlbmQ7CisjZW5kaWYKKworCQkJLyogRG8gaXQhICovCisJCQlzd2l0Y2ggKGFyY2hfYXBwbHlfcmVsb2NhdGlvbgorCQkJCQkoZiwgdGFyZ3NlYywgLypzeW1zZWMsKi8gaW50c3ltLCByZWwsIHZhbHVlKQorCQkJKSB7CisJCQljYXNlIG9ial9yZWxvY19vazoKKwkJCQlicmVhazsKKworCQkJY2FzZSBvYmpfcmVsb2Nfb3ZlcmZsb3c6CisJCQkJZXJybXNnID0gIlJlbG9jYXRpb24gb3ZlcmZsb3ciOworCQkJCWdvdG8gYmFkX3JlbG9jOworCQkJY2FzZSBvYmpfcmVsb2NfZGFuZ2Vyb3VzOgorCQkJCWVycm1zZyA9ICJEYW5nZXJvdXMgcmVsb2NhdGlvbiI7CisJCQkJZ290byBiYWRfcmVsb2M7CisJCQljYXNlIG9ial9yZWxvY191bmhhbmRsZWQ6CisJCQkJZXJybXNnID0gIlVuaGFuZGxlZCByZWxvY2F0aW9uIjsKK2JhZF9yZWxvYzoKKwkJCQlpZiAoZXh0c3ltKSB7CisJCQkJCWJiX2Vycm9yX21zZygiJXMgb2YgdHlwZSAlbGQgZm9yICVzIiwgZXJybXNnLAorCQkJCQkJCShsb25nKSBFTEZfUl9UWVBFKHJlbC0+cl9pbmZvKSwKKwkJCQkJCQlzdHJ0YWIgKyBleHRzeW0tPnN0X25hbWUpOworCQkJCX0gZWxzZSB7CisJCQkJCWJiX2Vycm9yX21zZygiJXMgb2YgdHlwZSAlbGQiLCBlcnJtc2csCisJCQkJCQkJKGxvbmcpIEVMRl9SX1RZUEUocmVsLT5yX2luZm8pKTsKKwkJCQl9CisJCQkJcmV0ID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8qIEZpbmFsbHksIHRha2UgY2FyZSBvZiB0aGUgcGF0Y2hlcy4gICovCisKKwlpZiAoZi0+c3RyaW5nX3BhdGNoZXMpIHsKKwkJc3RydWN0IG9ial9zdHJpbmdfcGF0Y2ggKnA7CisJCXN0cnVjdCBvYmpfc2VjdGlvbiAqc3Ryc2VjOworCQlFbGZXKEFkZHIpIHN0cnNlY19iYXNlOworCQlzdHJzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICIua3N0cnRhYiIpOworCQlzdHJzZWNfYmFzZSA9IHN0cnNlYy0+aGVhZGVyLnNoX2FkZHI7CisKKwkJZm9yIChwID0gZi0+c3RyaW5nX3BhdGNoZXM7IHA7IHAgPSBwLT5uZXh0KSB7CisJCQlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnRhcmdzZWMgPSBmLT5zZWN0aW9uc1twLT5yZWxvY19zZWNpZHhdOworCQkJKihFbGZXKEFkZHIpICopICh0YXJnc2VjLT5jb250ZW50cyArIHAtPnJlbG9jX29mZnNldCkKKwkJCQk9IHN0cnNlY19iYXNlICsgcC0+c3RyaW5nX29mZnNldDsKKwkJfQorCX0KKworCWlmIChmLT5zeW1ib2xfcGF0Y2hlcykgeworCQlzdHJ1Y3Qgb2JqX3N5bWJvbF9wYXRjaCAqcDsKKworCQlmb3IgKHAgPSBmLT5zeW1ib2xfcGF0Y2hlczsgcDsgcCA9IHAtPm5leHQpIHsKKwkJCXN0cnVjdCBvYmpfc2VjdGlvbiAqdGFyZ3NlYyA9IGYtPnNlY3Rpb25zW3AtPnJlbG9jX3NlY2lkeF07CisJCQkqKEVsZlcoQWRkcikgKikgKHRhcmdzZWMtPmNvbnRlbnRzICsgcC0+cmVsb2Nfb2Zmc2V0KQorCQkJCT0gb2JqX3N5bWJvbF9maW5hbF92YWx1ZShmLCBwLT5zeW0pOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBvYmpfY3JlYXRlX2ltYWdlKHN0cnVjdCBvYmpfZmlsZSAqZiwgY2hhciAqaW1hZ2UpCit7CisJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CisJRWxmVyhBZGRyKSBiYXNlID0gZi0+YmFzZWFkZHI7CisKKwlmb3IgKHNlYyA9IGYtPmxvYWRfb3JkZXI7IHNlYzsgc2VjID0gc2VjLT5sb2FkX25leHQpIHsKKwkJY2hhciAqc2VjaW1nOworCisJCWlmIChzZWMtPmNvbnRlbnRzID09IDAgfHwgc2VjLT5oZWFkZXIuc2hfc2l6ZSA9PSAwKQorCQkJY29udGludWU7CisKKwkJc2VjaW1nID0gaW1hZ2UgKyAoc2VjLT5oZWFkZXIuc2hfYWRkciAtIGJhc2UpOworCisJCS8qIE5vdGUgdGhhdCB3ZSBhbGxvY2F0ZWQgZGF0YSBmb3IgTk9CSVRTIHNlY3Rpb25zIGVhcmxpZXIuICAqLworCQltZW1jcHkoc2VjaW1nLCBzZWMtPmNvbnRlbnRzLCBzZWMtPmhlYWRlci5zaF9zaXplKTsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KKworc3RhdGljIHN0cnVjdCBvYmpfZmlsZSAqb2JqX2xvYWQoY2hhciAqaW1hZ2UsIHNpemVfdCBpbWFnZV9zaXplLCBpbnQgbG9hZHByb2diaXRzKQoreworCXR5cGVkZWYgdWludDMyX3QgYWxpYXNlZF91aW50MzJfdCBGSVhfQUxJQVNJTkc7CisjaWYgQkJfTElUVExFX0VORElBTgorIyBkZWZpbmUgRUxGTUFHX1UzMiAoKHVpbnQzMl90KShFTEZNQUcwICsgMHgxMDAgKiAoRUxGTUFHMSArICgweDEwMCAqIChFTEZNQUcyICsgMHgxMDAgKiBFTEZNQUczKSkpKSkKKyNlbHNlCisjIGRlZmluZSBFTEZNQUdfVTMyICgodWludDMyX3QpKCgoKEVMRk1BRzAgKiAweDEwMCkgKyBFTEZNQUcxKSAqIDB4MTAwICsgRUxGTUFHMikgKiAweDEwMCArIEVMRk1BRzMpKQorI2VuZGlmCisJc3RydWN0IG9ial9maWxlICpmOworCUVsZlcoU2hkcikgKiBzZWN0aW9uX2hlYWRlcnM7CisJc2l6ZV90IHNobnVtLCBpOworCWNoYXIgKnNoc3RydGFiOworCisJLyogUmVhZCB0aGUgZmlsZSBoZWFkZXIuICAqLworCisJZiA9IGFyY2hfbmV3X2ZpbGUoKTsKKwlmLT5zeW1ib2xfY21wID0gc3RyY21wOworCWYtPnN5bWJvbF9oYXNoID0gb2JqX2VsZl9oYXNoOworCWYtPmxvYWRfb3JkZXJfc2VhcmNoX3N0YXJ0ID0gJmYtPmxvYWRfb3JkZXI7CisKKwlpZiAoaW1hZ2Vfc2l6ZSA8IHNpemVvZihmLT5oZWFkZXIpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3Igd2hpbGUgbG9hZGluZyBFTEYgaGVhZGVyIik7CisJbWVtY3B5KCZmLT5oZWFkZXIsIGltYWdlLCBzaXplb2YoZi0+aGVhZGVyKSk7CisKKwlpZiAoKihhbGlhc2VkX3VpbnQzMl90KikoJmYtPmhlYWRlci5lX2lkZW50KSAhPSBFTEZNQUdfVTMyKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJub3QgYW4gRUxGIGZpbGUiKTsKKwl9CisJaWYgKGYtPmhlYWRlci5lX2lkZW50W0VJX0NMQVNTXSAhPSBFTEZDTEFTU00KKwkgfHwgZi0+aGVhZGVyLmVfaWRlbnRbRUlfREFUQV0gIT0gKEJCX0JJR19FTkRJQU4gPyBFTEZEQVRBMk1TQiA6IEVMRkRBVEEyTFNCKQorCSB8fCBmLT5oZWFkZXIuZV9pZGVudFtFSV9WRVJTSU9OXSAhPSBFVl9DVVJSRU5UCisJIHx8ICFNQVRDSF9NQUNISU5FKGYtPmhlYWRlci5lX21hY2hpbmUpCisJKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJFTEYgZmlsZSBub3QgZm9yIHRoaXMgYXJjaGl0ZWN0dXJlIik7CisJfQorCWlmIChmLT5oZWFkZXIuZV90eXBlICE9IEVUX1JFTCkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiRUxGIGZpbGUgbm90IGEgcmVsb2NhdGFibGUgb2JqZWN0Iik7CisJfQorCisJLyogUmVhZCB0aGUgc2VjdGlvbiBoZWFkZXJzLiAgKi8KKworCWlmIChmLT5oZWFkZXIuZV9zaGVudHNpemUgIT0gc2l6ZW9mKEVsZlcoU2hkcikpKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzZWN0aW9uIGhlYWRlciBzaXplIG1pc21hdGNoOiAlbHUgIT0gJWx1IiwKKwkJCQkodW5zaWduZWQgbG9uZykgZi0+aGVhZGVyLmVfc2hlbnRzaXplLAorCQkJCSh1bnNpZ25lZCBsb25nKSBzaXplb2YoRWxmVyhTaGRyKSkpOworCX0KKworCXNobnVtID0gZi0+aGVhZGVyLmVfc2hudW07CisJLyogR3Jvd3RoIG9mIC0+c2VjdGlvbnMgdmVjdG9yIHdpbGwgYmUgZG9uZSBieQorCSAqIHhyZWFsbG9jX3ZlY3RvciguLi4sIDIsIC4uLiksIHRoZXJlZm9yZSB3ZSBtdXN0IGFsbG9jYXRlCisJICogYXQgbGVhc3QgMl4yID0gNCBleHRyYSBlbGVtZW50cyBoZXJlLiAqLworCWYtPnNlY3Rpb25zID0geHphbGxvYyhzaXplb2YoZi0+c2VjdGlvbnNbMF0pICogKHNobnVtICsgNCkpOworCisJc2VjdGlvbl9oZWFkZXJzID0gYWxsb2NhKHNpemVvZihFbGZXKFNoZHIpKSAqIHNobnVtKTsKKwlpZiAoaW1hZ2Vfc2l6ZSA8IGYtPmhlYWRlci5lX3Nob2ZmICsgc2l6ZW9mKEVsZlcoU2hkcikpICogc2hudW0pCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJlcnJvciB3aGlsZSBsb2FkaW5nIHNlY3Rpb24gaGVhZGVycyIpOworCW1lbWNweShzZWN0aW9uX2hlYWRlcnMsIGltYWdlICsgZi0+aGVhZGVyLmVfc2hvZmYsIHNpemVvZihFbGZXKFNoZHIpKSAqIHNobnVtKTsKKworCS8qIFJlYWQgdGhlIHNlY3Rpb24gZGF0YS4gICovCisKKwlmb3IgKGkgPSAwOyBpIDwgc2hudW07ICsraSkgeworCQlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKKworCQlmLT5zZWN0aW9uc1tpXSA9IHNlYyA9IGFyY2hfbmV3X3NlY3Rpb24oKTsKKworCQlzZWMtPmhlYWRlciA9IHNlY3Rpb25faGVhZGVyc1tpXTsKKwkJc2VjLT5pZHggPSBpOworCisJCWlmIChzZWMtPmhlYWRlci5zaF9zaXplKSB7CisJCQlzd2l0Y2ggKHNlYy0+aGVhZGVyLnNoX3R5cGUpIHsKKwkJCWNhc2UgU0hUX05VTEw6CisJCQljYXNlIFNIVF9OT1RFOgorCQkJY2FzZSBTSFRfTk9CSVRTOgorCQkJCS8qIGlnbm9yZSAqLworCQkJCWJyZWFrOworCQkJY2FzZSBTSFRfUFJPR0JJVFM6CisjaWYgTE9BREJJVFMKKwkJCQlpZiAoIWxvYWRwcm9nYml0cykgeworCQkJCQlzZWMtPmNvbnRlbnRzID0gTlVMTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorI2VuZGlmCisJCQljYXNlIFNIVF9TWU1UQUI6CisJCQljYXNlIFNIVF9TVFJUQUI6CisJCQljYXNlIFNIVF9SRUxNOgorI2lmIGRlZmluZWQoX19taXBzX18pCisJCQljYXNlIFNIVF9NSVBTX0RXQVJGOgorI2VuZGlmCisJCQkJc2VjLT5jb250ZW50cyA9IE5VTEw7CisJCQkJaWYgKHNlYy0+aGVhZGVyLnNoX3NpemUgPiAwKSB7CisJCQkJCXNlYy0+Y29udGVudHMgPSB4bWFsbG9jKHNlYy0+aGVhZGVyLnNoX3NpemUpOworCQkJCQlpZiAoaW1hZ2Vfc2l6ZSA8IChzZWMtPmhlYWRlci5zaF9vZmZzZXQgKyBzZWMtPmhlYWRlci5zaF9zaXplKSkKKwkJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJlcnJvciB3aGlsZSBsb2FkaW5nIHNlY3Rpb24gZGF0YSIpOworCQkJCQltZW1jcHkoc2VjLT5jb250ZW50cywgaW1hZ2UgKyBzZWMtPmhlYWRlci5zaF9vZmZzZXQsIHNlYy0+aGVhZGVyLnNoX3NpemUpOworCQkJCX0KKwkJCQlicmVhazsKKyNpZiBTSFRfUkVMTSA9PSBTSFRfUkVMCisJCQljYXNlIFNIVF9SRUxBOgorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJSRUxBIHJlbG9jYXRpb25zIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBhcmNoaXRlY3R1cmUiKTsKKyNlbHNlCisJCQljYXNlIFNIVF9SRUw6CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIlJFTCByZWxvY2F0aW9ucyBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgYXJjaGl0ZWN0dXJlIik7CisjZW5kaWYKKwkJCWRlZmF1bHQ6CisJCQkJaWYgKHNlYy0+aGVhZGVyLnNoX3R5cGUgPj0gU0hUX0xPUFJPQykgeworCQkJCQkvKiBBc3N1bWUgcHJvY2Vzc29yIHNwZWNpZmljIHNlY3Rpb24gdHlwZXMgYXJlIGRlYnVnCisJCQkJCSAgIGluZm8gYW5kIGNhbiBzYWZlbHkgYmUgaWdub3JlZC4gIElmIHRoaXMgaXMgZXZlciBub3QKKwkJCQkJICAgdGhlIGNhc2UgKEhlbGxvIE1JUFM/KSwgZG9uJ3QgcHV0IGlmZGVmcyBoZXJlIGJ1dAorCQkJCQkgICBjcmVhdGUgYW4gYXJjaF9sb2FkX3Byb2Nfc2VjdGlvbigpLiAgKi8KKwkJCQkJYnJlYWs7CisJCQkJfQorCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGhhbmRsZSBzZWN0aW9ucyBvZiB0eXBlICVsZCIsCisJCQkJCQkobG9uZykgc2VjLT5oZWFkZXIuc2hfdHlwZSk7CisJCQl9CisJCX0KKwl9CisKKwkvKiBEbyB3aGF0IHNvcnQgb2YgaW50ZXJwcmV0YXRpb24gYXMgbmVlZGVkIGJ5IGVhY2ggc2VjdGlvbi4gICovCisKKwlzaHN0cnRhYiA9IGYtPnNlY3Rpb25zW2YtPmhlYWRlci5lX3Noc3RybmR4XS0+Y29udGVudHM7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2hudW07ICsraSkgeworCQlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYyA9IGYtPnNlY3Rpb25zW2ldOworCQlzZWMtPm5hbWUgPSBzaHN0cnRhYiArIHNlYy0+aGVhZGVyLnNoX25hbWU7CisJfQorCisJZm9yIChpID0gMDsgaSA8IHNobnVtOyArK2kpIHsKKwkJc3RydWN0IG9ial9zZWN0aW9uICpzZWMgPSBmLT5zZWN0aW9uc1tpXTsKKworCQkvKiAubW9kaW5mbyBzaG91bGQgYmUgY29udGVudHMgb25seSBidXQgZ2NjIGhhcyBubyBhdHRyaWJ1dGUgZm9yIHRoYXQuCisJCSAqIFRoZSBrZXJuZWwgbWF5IGhhdmUgbWFya2VkIC5tb2RpbmZvIGFzIEFMTE9DLCBpZ25vcmUgdGhpcyBiaXQuCisJCSAqLworCQlpZiAoc3RyY21wKHNlYy0+bmFtZSwgIi5tb2RpbmZvIikgPT0gMCkKKwkJCXNlYy0+aGVhZGVyLnNoX2ZsYWdzICY9IH5TSEZfQUxMT0M7CisKKwkJaWYgKHNlYy0+aGVhZGVyLnNoX2ZsYWdzICYgU0hGX0FMTE9DKQorCQkJb2JqX2luc2VydF9zZWN0aW9uX2xvYWRfb3JkZXIoZiwgc2VjKTsKKworCQlzd2l0Y2ggKHNlYy0+aGVhZGVyLnNoX3R5cGUpIHsKKwkJY2FzZSBTSFRfU1lNVEFCOgorCQkJeworCQkJCXVuc2lnbmVkIGxvbmcgbnN5bSwgajsKKwkJCQljaGFyICpzdHJ0YWI7CisJCQkJRWxmVyhTeW0pICogc3ltOworCisJCQkJaWYgKHNlYy0+aGVhZGVyLnNoX2VudHNpemUgIT0gc2l6ZW9mKEVsZlcoU3ltKSkpIHsKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN5bWJvbCBzaXplIG1pc21hdGNoOiAlbHUgIT0gJWx1IiwKKwkJCQkJCQkodW5zaWduZWQgbG9uZykgc2VjLT5oZWFkZXIuc2hfZW50c2l6ZSwKKwkJCQkJCQkodW5zaWduZWQgbG9uZykgc2l6ZW9mKEVsZlcoU3ltKSkpOworCQkJCX0KKworCQkJCW5zeW0gPSBzZWMtPmhlYWRlci5zaF9zaXplIC8gc2l6ZW9mKEVsZlcoU3ltKSk7CisJCQkJc3RydGFiID0gZi0+c2VjdGlvbnNbc2VjLT5oZWFkZXIuc2hfbGlua10tPmNvbnRlbnRzOworCQkJCXN5bSA9IChFbGZXKFN5bSkgKikgc2VjLT5jb250ZW50czsKKworCQkJCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBhIHRhYmxlIG9mIGxvY2FsIHN5bWJvbHMuICAqLworCQkJCWogPSBmLT5sb2NhbF9zeW10YWJfc2l6ZSA9IHNlYy0+aGVhZGVyLnNoX2luZm87CisJCQkJZi0+bG9jYWxfc3ltdGFiID0geHphbGxvYyhqICogc2l6ZW9mKHN0cnVjdCBvYmpfc3ltYm9sICopKTsKKworCQkJCS8qIEluc2VydCBhbGwgc3ltYm9scyBpbnRvIHRoZSBoYXNoIHRhYmxlLiAgKi8KKwkJCQlmb3IgKGogPSAxLCArK3N5bTsgaiA8IG5zeW07ICsraiwgKytzeW0pIHsKKwkJCQkJRWxmVyhBZGRyKSB2YWwgPSBzeW0tPnN0X3ZhbHVlOworCQkJCQljb25zdCBjaGFyICpuYW1lOworCQkJCQlpZiAoc3ltLT5zdF9uYW1lKQorCQkJCQkJbmFtZSA9IHN0cnRhYiArIHN5bS0+c3RfbmFtZTsKKwkJCQkJZWxzZSBpZiAoc3ltLT5zdF9zaG5keCA8IHNobnVtKQorCQkJCQkJbmFtZSA9IGYtPnNlY3Rpb25zW3N5bS0+c3Rfc2huZHhdLT5uYW1lOworCQkJCQllbHNlCisJCQkJCQljb250aW51ZTsKKyNpZiBkZWZpbmVkKF9fU0g1X18pCisJCQkJCS8qCisJCQkJCSAqIEZvciBzaDY0IGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHRhcmdldCBvZiBhIGJyYW5jaAorCQkJCQkgKiByZXF1aXJlcyBhIG1vZGUgc3dpdGNoICgzMiB0byAxNiBhbmQgYmFjayBhZ2FpbikuCisJCQkJCSAqCisJCQkJCSAqIFRoaXMgaXMgaW1wbGllZCBieSB0aGUgbHNiIGJlaW5nIHNldCBpbiB0aGUgdGFyZ2V0CisJCQkJCSAqIGFkZHJlc3MgZm9yIFNIbWVkaWEgbW9kZSBhbmQgY2xlYXIgZm9yIFNIY29tcGFjdC4KKwkJCQkJICovCisJCQkJCXZhbCB8PSBzeW0tPnN0X290aGVyICYgNDsKKyNlbmRpZgorCQkJCQlvYmpfYWRkX3N5bWJvbChmLCBuYW1lLCBqLCBzeW0tPnN0X2luZm8sIHN5bS0+c3Rfc2huZHgsCisJCQkJCQkJdmFsLCBzeW0tPnN0X3NpemUpOworCQkJCX0KKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgU0hUX1JFTE06CisJCQlpZiAoc2VjLT5oZWFkZXIuc2hfZW50c2l6ZSAhPSBzaXplb2YoRWxmVyhSZWxNKSkpIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicmVsb2NhdGlvbiBlbnRyeSBzaXplIG1pc21hdGNoOiAlbHUgIT0gJWx1IiwKKwkJCQkJCSh1bnNpZ25lZCBsb25nKSBzZWMtPmhlYWRlci5zaF9lbnRzaXplLAorCQkJCQkJKHVuc2lnbmVkIGxvbmcpIHNpemVvZihFbGZXKFJlbE0pKSk7CisJCQl9CisJCQlicmVhazsKKwkJCS8qIFhYWCAgUmVsb2NhdGlvbiBjb2RlIGZyb20gbW9kdXRpbHMtMi4zLjE5IGlzIG5vdCBoZXJlLgorCQkJICogV2h5PyAgVGhhdCdzIGFib3V0IDIwIGxpbmVzIG9mIGNvZGUgZnJvbSBvYmovb2JqX2xvYWQuYywKKwkJCSAqIHdoaWNoIGdldHMgZG9uZSBpbiBhIHNlY29uZCBwYXNzIHRocm91Z2ggdGhlIHNlY3Rpb25zLgorCQkJICogVGhpcyBCdXN5Qm94IGluc21vZCBkb2VzIHNpbWlsYXIgd29yayBpbiBvYmpfcmVsb2NhdGUoKS4gKi8KKwkJfQorCX0KKworCXJldHVybiBmOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5TTU9EX0xPQURJTktNRU0KKy8qCisgKiBsb2FkIHRoZSB1bmxvYWRlZCBzZWN0aW9ucyBkaXJlY3RseSBpbnRvIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGJ5CisgKiBrZXJuZWwgZm9yIHRoZSBtb2R1bGUKKyAqLworCitzdGF0aWMgaW50IG9ial9sb2FkX3Byb2diaXRzKGNoYXIgKmltYWdlLCBzaXplX3QgaW1hZ2Vfc2l6ZSwgc3RydWN0IG9ial9maWxlICpmLCBjaGFyICppbWFnZWJhc2UpCit7CisJRWxmVyhBZGRyKSBiYXNlID0gZi0+YmFzZWFkZHI7CisJc3RydWN0IG9ial9zZWN0aW9uKiBzZWM7CisKKwlmb3IgKHNlYyA9IGYtPmxvYWRfb3JkZXI7IHNlYzsgc2VjID0gc2VjLT5sb2FkX25leHQpIHsKKwkJLyogc2VjdGlvbiBhbHJlYWR5IGxvYWRlZD8gKi8KKwkJaWYgKHNlYy0+Y29udGVudHMgIT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlpZiAoc2VjLT5oZWFkZXIuc2hfc2l6ZSA9PSAwKQorCQkJY29udGludWU7CisJCXNlYy0+Y29udGVudHMgPSBpbWFnZWJhc2UgKyAoc2VjLT5oZWFkZXIuc2hfYWRkciAtIGJhc2UpOworCQlpZiAoaW1hZ2Vfc2l6ZSA8IChzZWMtPmhlYWRlci5zaF9vZmZzZXQgKyBzZWMtPmhlYWRlci5zaF9zaXplKSkgeworCQkJYmJfZXJyb3JfbXNnKCJlcnJvciByZWFkaW5nIEVMRiBzZWN0aW9uIGRhdGEiKTsKKwkJCXJldHVybiAwOyAvKiBuZWVkIHRvIGRlbGV0ZSBoYWxmLWxvYWRlZCBtb2R1bGUhICovCisJCX0KKwkJbWVtY3B5KHNlYy0+Y29udGVudHMsIGltYWdlICsgc2VjLT5oZWFkZXIuc2hfb2Zmc2V0LCBzZWMtPmhlYWRlci5zaF9zaXplKTsKKwl9CisJcmV0dXJuIDE7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgaGlkZV9zcGVjaWFsX3N5bWJvbHMoc3RydWN0IG9ial9maWxlICpmKQoreworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzcGVjaWFsc1tdID0geworCQlTUEZYICJjbGVhbnVwX21vZHVsZSIsCisJCVNQRlggImluaXRfbW9kdWxlIiwKKwkJU1BGWCAia2VybmVsX3ZlcnNpb24iLAorCQlOVUxMCisJfTsKKworCXN0cnVjdCBvYmpfc3ltYm9sICpzeW07CisJY29uc3QgY2hhciAqY29uc3QgKnA7CisKKwlmb3IgKHAgPSBzcGVjaWFsczsgKnA7ICsrcCkgeworCQlzeW0gPSBvYmpfZmluZF9zeW1ib2woZiwgKnApOworCQlpZiAoc3ltICE9IE5VTEwpCisJCQlzeW0tPmluZm8gPSBFTEZfU1RfSU5GTyhTVEJfTE9DQUwsIEVMRl9TVF9UWVBFKHN5bS0+aW5mbykpOworCX0KK30KKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hFQ0tfVEFJTlRFRF9NT0RVTEUKK3N0YXRpYyBpbnQgb2JqX2dwbF9saWNlbnNlKHN0cnVjdCBvYmpfZmlsZSAqZiwgY29uc3QgY2hhciAqKmxpY2Vuc2UpCit7CisJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CisJLyogVGhpcyBsaXN0IG11c3QgbWF0Y2ggKmV4YWN0bHkqIHRoZSBsaXN0IG9mIGFsbG93YWJsZSBsaWNlbnNlcyBpbgorCSAqIGxpbnV4L2luY2x1ZGUvbGludXgvbW9kdWxlLmguICBDaGVja2luZyBmb3IgbGVhZGluZyAiR1BMIiB3aWxsIG5vdAorCSAqIHdvcmssIHNvbWVib2R5IHdpbGwgdXNlICJHUEwgc3Vja3MsIHRoaXMgaXMgcHJvcHJpZXRhcnkiLgorCSAqLworCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBncGxfbGljZW5zZXNbXSA9IHsKKwkJIkdQTCIsCisJCSJHUEwgdjIiLAorCQkiR1BMIGFuZCBhZGRpdGlvbmFsIHJpZ2h0cyIsCisJCSJEdWFsIEJTRC9HUEwiLAorCQkiRHVhbCBNUEwvR1BMIgorCX07CisKKwlzZWMgPSBvYmpfZmluZF9zZWN0aW9uKGYsICIubW9kaW5mbyIpOworCWlmIChzZWMpIHsKKwkJY29uc3QgY2hhciAqdmFsdWUsICpwdHIsICplbmRwdHI7CisJCXB0ciA9IHNlYy0+Y29udGVudHM7CisJCWVuZHB0ciA9IHB0ciArIHNlYy0+aGVhZGVyLnNoX3NpemU7CisJCXdoaWxlIChwdHIgPCBlbmRwdHIpIHsKKwkJCXZhbHVlID0gc3RyY2hyKHB0ciwgJz0nKTsKKwkJCWlmICh2YWx1ZSAmJiBzdHJuY21wKHB0ciwgImxpY2Vuc2UiLCB2YWx1ZS1wdHIpID09IDApIHsKKwkJCQl1bnNpZ25lZCBpOworCQkJCWlmIChsaWNlbnNlKQorCQkJCQkqbGljZW5zZSA9IHZhbHVlKzE7CisJCQkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ3BsX2xpY2Vuc2VzKTsgKytpKSB7CisJCQkJCWlmIChzdHJjbXAodmFsdWUrMSwgZ3BsX2xpY2Vuc2VzW2ldKSA9PSAwKQorCQkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJCXJldHVybiAyOworCQkJfQorCQkJcHRyID0gc3RyY2hyKHB0ciwgJ1wwJyk7CisJCQlpZiAocHRyKQorCQkJCXB0cisrOworCQkJZWxzZQorCQkJCXB0ciA9IGVuZHB0cjsKKwkJfQorCX0KKwlyZXR1cm4gMTsKK30KKworI2RlZmluZSBUQUlOVF9GSUxFTkFNRSAgICAgICAgICAgICAgICAgICIvcHJvYy9zeXMva2VybmVsL3RhaW50ZWQiCisjZGVmaW5lIFRBSU5UX1BST1BSSUVUT1JZX01PRFVMRSAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgVEFJTlRfRk9SQ0VEX01PRFVMRSAgICAgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBUQUlOVF9VTlNBRkVfU01QICAgICAgICAgICAgICAgICgxIDw8IDIpCisjZGVmaW5lIFRBSU5UX1VSTCAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly93d3cudHV4Lm9yZy9sa21sLyNleHBvcnQtdGFpbnRlZCIKKworc3RhdGljIHZvaWQgc2V0X3RhaW50ZWQoaW50IGZkLCBjb25zdCBjaGFyICptX25hbWUsCisJCWludCBrZXJuZWxfaGFzX3RhaW50ZWQsIGludCB0YWludCwKKwkJY29uc3QgY2hhciAqdGV4dDEsIGNvbnN0IGNoYXIgKnRleHQyKQoreworCXN0YXRpYyBzbWFsbGludCBwcmludGVkX2luZm87CisKKwljaGFyIGJ1Zls4MF07CisJaW50IG9sZHZhbDsKKworCWlmIChmZCA8IDAgJiYgIWtlcm5lbF9oYXNfdGFpbnRlZCkKKwkJcmV0dXJuOwkJLyogTmV3IG1vZHV0aWxzIG9uIG9sZCBrZXJuZWwgKi8KKwlwcmludGYoIldhcm5pbmc6IGxvYWRpbmcgJXMgd2lsbCB0YWludCB0aGUga2VybmVsOiAlcyVzXG4iLAorCQkJbV9uYW1lLCB0ZXh0MSwgdGV4dDIpOworCWlmICghcHJpbnRlZF9pbmZvKSB7CisJCXByaW50ZigiICBTZWUgJXMgZm9yIGluZm9ybWF0aW9uIGFib3V0IHRhaW50ZWQgbW9kdWxlc1xuIiwgVEFJTlRfVVJMKTsKKwkJcHJpbnRlZF9pbmZvID0gMTsKKwl9CisJaWYgKGZkID49IDApIHsKKwkJcmVhZChmZCwgYnVmLCBzaXplb2YoYnVmKS0xKTsKKwkJYnVmW3NpemVvZihidWYpLTFdID0gJ1wwJzsKKwkJb2xkdmFsID0gc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwkJc3ByaW50ZihidWYsICIlZFxuIiwgb2xkdmFsIHwgdGFpbnQpOworCQl4d3JpdGVfc3RyKGZkLCBidWYpOworCX0KK30KKworLyogQ2hlY2sgaWYgbG9hZGluZyB0aGlzIG1vZHVsZSB3aWxsIHRhaW50IHRoZSBrZXJuZWwuICovCitzdGF0aWMgdm9pZCBjaGVja190YWludGVkX21vZHVsZShzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNvbnN0IGNoYXIgKm1fbmFtZSkKK3sKKwlpbnQgZmQsIGtlcm5lbF9oYXNfdGFpbnRlZDsKKwljb25zdCBjaGFyICpwdHI7CisKKwlrZXJuZWxfaGFzX3RhaW50ZWQgPSAxOworCWZkID0gb3BlbihUQUlOVF9GSUxFTkFNRSwgT19SRFdSKTsKKwlpZiAoZmQgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFTk9FTlQpCisJCQlrZXJuZWxfaGFzX3RhaW50ZWQgPSAwOworCQllbHNlIGlmIChlcnJubyA9PSBFQUNDRVMpCisJCQlrZXJuZWxfaGFzX3RhaW50ZWQgPSAxOworCQllbHNlIHsKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKFRBSU5UX0ZJTEVOQU1FKTsKKwkJCWtlcm5lbF9oYXNfdGFpbnRlZCA9IDA7CisJCX0KKwl9CisKKwlzd2l0Y2ggKG9ial9ncGxfbGljZW5zZShmLCAmcHRyKSkgeworCQljYXNlIDA6CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJc2V0X3RhaW50ZWQoZmQsIG1fbmFtZSwga2VybmVsX2hhc190YWludGVkLCBUQUlOVF9QUk9QUklFVE9SWV9NT0RVTEUsICJubyBsaWNlbnNlIiwgIiIpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8qIGNhc2UgMjogKi8KKwkJCS8qIFRoZSBtb2R1bGUgaGFzIGEgbm9uLUdQTCBsaWNlbnNlIHNvIHdlIHByZXRlbmQgdGhhdCB0aGUKKwkJCSAqIGtlcm5lbCBhbHdheXMgaGFzIGEgdGFpbnQgZmxhZyB0byBnZXQgYSB3YXJuaW5nIGV2ZW4gb24KKwkJCSAqIGtlcm5lbHMgd2l0aG91dCB0aGUgcHJvYyBmbGFnLgorCQkJICovCisJCQlzZXRfdGFpbnRlZChmZCwgbV9uYW1lLCAxLCBUQUlOVF9QUk9QUklFVE9SWV9NT0RVTEUsICJub24tR1BMIGxpY2Vuc2UgLSAiLCBwdHIpOworCQkJYnJlYWs7CisJfQorCisJaWYgKGZsYWdfZm9yY2VfbG9hZCkKKwkJc2V0X3RhaW50ZWQoZmQsIG1fbmFtZSwgMSwgVEFJTlRfRk9SQ0VEX01PRFVMRSwgImZvcmNlZCBsb2FkIiwgIiIpOworCisJaWYgKGZkID49IDApCisJCWNsb3NlKGZkKTsKK30KKyNlbHNlIC8qICFGRUFUVVJFX0NIRUNLX1RBSU5URURfTU9EVUxFICovCisjZGVmaW5lIGNoZWNrX3RhaW50ZWRfbW9kdWxlKHgsIHkpIGRvIHsgfSB3aGlsZSAoMCk7CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9LU1lNT09QU19TWU1CT0xTCisvKiBhZGQgbW9kdWxlIHNvdXJjZSwgdGltZXN0YW1wLCBrZXJuZWwgdmVyc2lvbiBhbmQgYSBzeW1ib2wgZm9yIHRoZQorICogc3RhcnQgb2Ygc29tZSBzZWN0aW9ucy4gIHRoaXMgaW5mbyBpcyB1c2VkIGJ5IGtzeW1vb3BzIHRvIGRvIGJldHRlcgorICogZGVidWdnaW5nLgorICovCisjaWYgIUVOQUJMRV9GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCisjZGVmaW5lIGdldF9tb2R1bGVfdmVyc2lvbihmLCBzdHIpIGdldF9tb2R1bGVfdmVyc2lvbihzdHIpCisjZW5kaWYKK3N0YXRpYyBpbnQKK2dldF9tb2R1bGVfdmVyc2lvbihzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNoYXIgc3RyW1NUUlZFUlNJT05MRU5dKQoreworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCisJcmV0dXJuIG5ld19nZXRfbW9kdWxlX3ZlcnNpb24oZiwgc3RyKTsKKyNlbHNlCisJc3RybmNweShzdHIsICI/Pz8iLCBzaXplb2Yoc3RyKSk7CisJcmV0dXJuIC0xOworI2VuZGlmCit9CisKKy8qIGFkZCBtb2R1bGUgc291cmNlLCB0aW1lc3RhbXAsIGtlcm5lbCB2ZXJzaW9uIGFuZCBhIHN5bWJvbCBmb3IgdGhlCisgKiBzdGFydCBvZiBzb21lIHNlY3Rpb25zLiAgdGhpcyBpbmZvIGlzIHVzZWQgYnkga3N5bW9vcHMgdG8gZG8gYmV0dGVyCisgKiBkZWJ1Z2dpbmcuCisgKi8KK3N0YXRpYyB2b2lkCithZGRfa3N5bW9vcHNfc3ltYm9scyhzdHJ1Y3Qgb2JqX2ZpbGUgKmYsIGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQljb25zdCBjaGFyICptX25hbWUpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgc3ltcHJlZml4W10gQUxJR04xID0gIl9faW5zbW9kXyI7CisJc3RhdGljIGNvbnN0IGNoYXIgc2VjdGlvbl9uYW1lc1tdWzhdID0geworCQkiLnRleHQiLAorCQkiLnJvZGF0YSIsCisJCSIuZGF0YSIsCisJCSIuYnNzIiwKKwkJIi5zYnNzIgorCX07CisKKwlzdHJ1Y3Qgb2JqX3NlY3Rpb24gKnNlYzsKKwlzdHJ1Y3Qgb2JqX3N5bWJvbCAqc3ltOworCWNoYXIgKm5hbWUsICphYnNvbHV0ZV9maWxlbmFtZTsKKwljaGFyIHN0cltTVFJWRVJTSU9OTEVOXTsKKwl1bnNpZ25lZCBpOworCWludCBsbV9uYW1lLCBsZmlsZW5hbWUsIHVzZV9rc3ltdGFiLCB2ZXJzaW9uOworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisKKwkvKiBXQVJOSU5HOiB3YXMgdXNpbmcgcmVhbHBhdGgsIGJ1dCByZXBsYWNlZCBieSByZWFkbGluayB0byBzdG9wIHVzaW5nCisJICogbG90cyBvZiBzdGFjay4gQnV0IGhlcmUgaXQgc2VlbXMgdG8gYmUgYWJsZSB0byBjYXVzZSBwcm9ibGVtcz8gKi8KKwlhYnNvbHV0ZV9maWxlbmFtZSA9IHhtYWxsb2NfcmVhZGxpbmsoZmlsZW5hbWUpOworCWlmICghYWJzb2x1dGVfZmlsZW5hbWUpCisJCWFic29sdXRlX2ZpbGVuYW1lID0geHN0cmR1cChmaWxlbmFtZSk7CisKKwlsbV9uYW1lID0gc3RybGVuKG1fbmFtZSk7CisJbGZpbGVuYW1lID0gc3RybGVuKGFic29sdXRlX2ZpbGVuYW1lKTsKKworCS8qIGFkZCB0byBrc3ltdGFiIGlmIGl0IGFscmVhZHkgZXhpc3RzIG9yIHRoZXJlIGlzIG5vIGtzeW10YWIgYW5kIG90aGVyIHN5bWJvbHMKKwkgKiBhcmUgbm90IHRvIGJlIGV4cG9ydGVkLiAgb3RoZXJ3aXNlIGxlYXZlIGtzeW10YWIgYWxvbmUgZm9yIG5vdywgdGhlCisJICogImV4cG9ydCBhbGwgc3ltYm9scyIgY29tcGF0aWJpbGl0eSBjb2RlIHdpbGwgZXhwb3J0IHRoZXNlIHN5bWJvbHMgbGF0ZXIuCisJICovCisJdXNlX2tzeW10YWIgPSBvYmpfZmluZF9zZWN0aW9uKGYsICJfX2tzeW10YWIiKSB8fCBmbGFnX25vZXhwb3J0OworCisJc2VjID0gb2JqX2ZpbmRfc2VjdGlvbihmLCAiLnRoaXMiKTsKKwlpZiAoc2VjKSB7CisJCS8qIHRhZyB0aGUgbW9kdWxlIGhlYWRlciB3aXRoIHRoZSBvYmplY3QgbmFtZSwgbGFzdCBtb2RpZmllZAorCQkgKiB0aW1lc3RhbXAgYW5kIG1vZHVsZSB2ZXJzaW9uLiAgd29yc3QgY2FzZSBmb3IgbW9kdWxlIHZlcnNpb24KKwkJICogaXMgMHhmZmZmZmYsIGRlY2ltYWwgMTY3NzcyMTUuICBwdXR0aW5nIGFsbCB0aHJlZSBmaWVsZHMgaW4KKwkJICogb25lIHN5bWJvbCBpcyBsZXNzIHJlYWRhYmxlIGJ1dCBzYXZlcyBrZXJuZWwgc3BhY2UuCisJCSAqLworCQlpZiAoc3RhdChhYnNvbHV0ZV9maWxlbmFtZSwgJnN0YXRidWYpICE9IDApCisJCQlzdGF0YnVmLnN0X210aW1lID0gMDsKKwkJdmVyc2lvbiA9IGdldF9tb2R1bGVfdmVyc2lvbihmLCBzdHIpOwkvKiAtMSBpZiBub3QgZm91bmQgKi8KKwkJbmFtZSA9IHhhc3ByaW50ZigiJXMlc19PJXNfTSUwKmxYX1YlZCIsCisJCQkJc3ltcHJlZml4LCBtX25hbWUsIGFic29sdXRlX2ZpbGVuYW1lLAorCQkJCShpbnQpKDIgKiBzaXplb2Yoc3RhdGJ1Zi5zdF9tdGltZSkpLAorCQkJCShsb25nKXN0YXRidWYuc3RfbXRpbWUsCisJCQkJdmVyc2lvbik7CisJCXN5bSA9IG9ial9hZGRfc3ltYm9sKGYsIG5hbWUsIC0xLAorCQkJCUVMRl9TVF9JTkZPKFNUQl9HTE9CQUwsIFNUVF9OT1RZUEUpLAorCQkJCXNlYy0+aWR4LCBzZWMtPmhlYWRlci5zaF9hZGRyLCAwKTsKKwkJaWYgKHVzZV9rc3ltdGFiKQorCQkJbmV3X2FkZF9rc3ltdGFiKGYsIHN5bSk7CisJfQorCWZyZWUoYWJzb2x1dGVfZmlsZW5hbWUpOworI2lmZGVmIF9OT1RfU1VQUE9SVEVEXworCS8qIHJlY29yZCB3aGVyZSB0aGUgcGVyc2lzdGVudCBkYXRhIGlzIGdvaW5nLCBzYW1lIGFkZHJlc3MgYXMgcHJldmlvdXMgc3ltYm9sICovCisJaWYgKGYtPnBlcnNpc3QpIHsKKwkJbmFtZSA9IHhhc3ByaW50ZigiJXMlc19QJXMiLAorCQkJCXN5bXByZWZpeCwgbV9uYW1lLCBmLT5wZXJzaXN0KTsKKwkJc3ltID0gb2JqX2FkZF9zeW1ib2woZiwgbmFtZSwgLTEsIEVMRl9TVF9JTkZPKFNUQl9HTE9CQUwsIFNUVF9OT1RZUEUpLAorCQkJCXNlYy0+aWR4LCBzZWMtPmhlYWRlci5zaF9hZGRyLCAwKTsKKwkJaWYgKHVzZV9rc3ltdGFiKQorCQkJbmV3X2FkZF9rc3ltdGFiKGYsIHN5bSk7CisJfQorI2VuZGlmCisJLyogdGFnIHRoZSBkZXNpcmVkIHNlY3Rpb25zIGlmIHNpemUgaXMgbm9uLXplcm8gKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzZWN0aW9uX25hbWVzKTsgKytpKSB7CisJCXNlYyA9IG9ial9maW5kX3NlY3Rpb24oZiwgc2VjdGlvbl9uYW1lc1tpXSk7CisJCWlmIChzZWMgJiYgc2VjLT5oZWFkZXIuc2hfc2l6ZSkgeworCQkJbmFtZSA9IHhhc3ByaW50ZigiJXMlc19TJXNfTCVsZCIsCisJCQkJCXN5bXByZWZpeCwgbV9uYW1lLCBzZWMtPm5hbWUsCisJCQkJCShsb25nKXNlYy0+aGVhZGVyLnNoX3NpemUpOworCQkJc3ltID0gb2JqX2FkZF9zeW1ib2woZiwgbmFtZSwgLTEsIEVMRl9TVF9JTkZPKFNUQl9HTE9CQUwsIFNUVF9OT1RZUEUpLAorCQkJCQlzZWMtPmlkeCwgc2VjLT5oZWFkZXIuc2hfYWRkciwgMCk7CisJCQlpZiAodXNlX2tzeW10YWIpCisJCQkJbmV3X2FkZF9rc3ltdGFiKGYsIHN5bSk7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogRkVBVFVSRV9JTlNNT0RfS1NZTU9PUFNfU1lNQk9MUyAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQCitzdGF0aWMgdm9pZCBwcmludF9sb2FkX21hcChzdHJ1Y3Qgb2JqX2ZpbGUgKmYpCit7CisJc3RydWN0IG9ial9zZWN0aW9uICpzZWM7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQX0ZVTEwKKwlzdHJ1Y3Qgb2JqX3N5bWJvbCAqKmFsbCwgKipwOworCWludCBpLCBuc3ltczsKKwljaGFyICpsb2FkZWQ7IC8qIGFycmF5IG9mIGJvb2xlYW5zICovCisJc3RydWN0IG9ial9zeW1ib2wgKnN5bTsKKyNlbmRpZgorCS8qIFJlcG9ydCBvbiB0aGUgc2VjdGlvbiBsYXlvdXQuICAqLworCXByaW50ZigiU2VjdGlvbnM6ICAgICAgIFNpemUgICAgICAlLSpzICBBbGlnblxuIiwKKwkJCShpbnQpICgyICogc2l6ZW9mKHZvaWQgKikpLCAiQWRkcmVzcyIpOworCisJZm9yIChzZWMgPSBmLT5sb2FkX29yZGVyOyBzZWM7IHNlYyA9IHNlYy0+bG9hZF9uZXh0KSB7CisJCWludCBhOworCQl1bnNpZ25lZCBsb25nIHRtcDsKKworCQlmb3IgKGEgPSAtMSwgdG1wID0gc2VjLT5oZWFkZXIuc2hfYWRkcmFsaWduOyB0bXA7ICsrYSkKKwkJCXRtcCA+Pj0gMTsKKwkJaWYgKGEgPT0gLTEpCisJCQlhID0gMDsKKworCQlwcmludGYoIiUtMTVzICUwOGx4ICAlMCpseCAgMioqJWRcbiIsCisJCQkJc2VjLT5uYW1lLAorCQkJCShsb25nKXNlYy0+aGVhZGVyLnNoX3NpemUsCisJCQkJKGludCkgKDIgKiBzaXplb2Yodm9pZCAqKSksCisJCQkJKGxvbmcpc2VjLT5oZWFkZXIuc2hfYWRkciwKKwkJCQlhKTsKKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5TTU9EX0xPQURfTUFQX0ZVTEwKKwkvKiBRdWljayByZWZlcmVuY2Ugd2hpY2ggc2VjdGlvbiBpbmRpY2VzIGFyZSBsb2FkZWQuICAqLworCWkgPSBmLT5oZWFkZXIuZV9zaG51bTsKKwlsb2FkZWQgPSBhbGxvY2EoaSAqIHNpemVvZihsb2FkZWRbMF0pKTsKKwl3aGlsZSAoLS1pID49IDApCisJCWxvYWRlZFtpXSA9ICgoZi0+c2VjdGlvbnNbaV0tPmhlYWRlci5zaF9mbGFncyAmIFNIRl9BTExPQykgIT0gMCk7CisKKwkvKiBDb2xsZWN0IHRoZSBzeW1ib2xzIHdlJ2xsIGJlIGxpc3RpbmcuICAqLworCWZvciAobnN5bXMgPSBpID0gMDsgaSA8IEhBU0hfQlVDS0VUUzsgKytpKQorCQlmb3IgKHN5bSA9IGYtPnN5bXRhYltpXTsgc3ltOyBzeW0gPSBzeW0tPm5leHQpCisJCQlpZiAoc3ltLT5zZWNpZHggPD0gU0hOX0hJUkVTRVJWRQorCQkJICYmIChzeW0tPnNlY2lkeCA+PSBTSE5fTE9SRVNFUlZFIHx8IGxvYWRlZFtzeW0tPnNlY2lkeF0pCisJCQkpIHsKKwkJCQkrK25zeW1zOworCQkJfQorCisJYWxsID0gYWxsb2NhKG5zeW1zICogc2l6ZW9mKGFsbFswXSkpOworCisJZm9yIChpID0gMCwgcCA9IGFsbDsgaSA8IEhBU0hfQlVDS0VUUzsgKytpKQorCQlmb3IgKHN5bSA9IGYtPnN5bXRhYltpXTsgc3ltOyBzeW0gPSBzeW0tPm5leHQpCisJCQlpZiAoc3ltLT5zZWNpZHggPD0gU0hOX0hJUkVTRVJWRQorCQkJICYmIChzeW0tPnNlY2lkeCA+PSBTSE5fTE9SRVNFUlZFIHx8IGxvYWRlZFtzeW0tPnNlY2lkeF0pCisJCQkpIHsKKwkJCQkqcCsrID0gc3ltOworCQkJfQorCisJLyogQW5kIGxpc3QgdGhlbS4gICovCisJcHJpbnRmKCJcblN5bWJvbHM6XG4iKTsKKwlmb3IgKHAgPSBhbGw7IHAgPCBhbGwgKyBuc3ltczsgKytwKSB7CisJCWNoYXIgdHlwZSA9ICc/JzsKKwkJdW5zaWduZWQgbG9uZyB2YWx1ZTsKKworCQlzeW0gPSAqcDsKKwkJaWYgKHN5bS0+c2VjaWR4ID09IFNITl9BQlMpIHsKKwkJCXR5cGUgPSAnQSc7CisJCQl2YWx1ZSA9IHN5bS0+dmFsdWU7CisJCX0gZWxzZSBpZiAoc3ltLT5zZWNpZHggPT0gU0hOX1VOREVGKSB7CisJCQl0eXBlID0gJ1UnOworCQkJdmFsdWUgPSAwOworCQl9IGVsc2UgeworCQkJc2VjID0gZi0+c2VjdGlvbnNbc3ltLT5zZWNpZHhdOworCisJCQlpZiAoc2VjLT5oZWFkZXIuc2hfdHlwZSA9PSBTSFRfTk9CSVRTKQorCQkJCXR5cGUgPSAnQic7CisJCQllbHNlIGlmIChzZWMtPmhlYWRlci5zaF9mbGFncyAmIFNIRl9BTExPQykgeworCQkJCWlmIChzZWMtPmhlYWRlci5zaF9mbGFncyAmIFNIRl9FWEVDSU5TVFIpCisJCQkJCXR5cGUgPSAnVCc7CisJCQkJZWxzZSBpZiAoc2VjLT5oZWFkZXIuc2hfZmxhZ3MgJiBTSEZfV1JJVEUpCisJCQkJCXR5cGUgPSAnRCc7CisJCQkJZWxzZQorCQkJCQl0eXBlID0gJ1InOworCQkJfQorCQkJdmFsdWUgPSBzeW0tPnZhbHVlICsgc2VjLT5oZWFkZXIuc2hfYWRkcjsKKwkJfQorCisJCWlmIChFTEZfU1RfQklORChzeW0tPmluZm8pID09IFNUQl9MT0NBTCkKKwkJCXR5cGUgfD0gMHgyMDsgLyogdG9sb3dlci4gc2FmZSBmb3IgJz8nIHRvbyAqLworCisJCXByaW50ZigiJTAqbHggJWMgJXNcbiIsIChpbnQpICgyICogc2l6ZW9mKHZvaWQgKikpLCB2YWx1ZSwKKwkJCQl0eXBlLCBzeW0tPm5hbWUpOworCX0KKyNlbmRpZgorfQorI2Vsc2UgLyogIUZFQVRVUkVfSU5TTU9EX0xPQURfTUFQICovCitzdGF0aWMgdm9pZCBwcmludF9sb2FkX21hcChzdHJ1Y3Qgb2JqX2ZpbGUgKmYgVU5VU0VEX1BBUkFNKQoreworfQorI2VuZGlmCisKK2ludCBGQVNUX0ZVTkMgYmJfaW5pdF9tb2R1bGVfMjQoY29uc3QgY2hhciAqbV9maWxlbmFtZSwgY29uc3QgY2hhciAqb3B0aW9ucykKK3sKKwlpbnQga19jcmNzOworCXVuc2lnbmVkIGxvbmcgbV9zaXplOworCUVsZlcoQWRkcikgbV9hZGRyOworCXN0cnVjdCBvYmpfZmlsZSAqZjsKKwlpbnQgZXhpdF9zdGF0dXMgPSBFWElUX0ZBSUxVUkU7CisJY2hhciAqbV9uYW1lOworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCisJaW50IG1faGFzX21vZGluZm87CisjZW5kaWYKKwljaGFyICppbWFnZTsKKwlzaXplX3QgaW1hZ2Vfc2l6ZTsKKwlib29sIG1tYXBlZDsKKworCWltYWdlX3NpemUgPSBJTlRfTUFYIC0gNDA5NTsKKwltbWFwZWQgPSAwOworCWltYWdlID0gdHJ5X3RvX21tYXBfbW9kdWxlKG1fZmlsZW5hbWUsICZpbWFnZV9zaXplKTsKKwlpZiAoaW1hZ2UpIHsKKwkJbW1hcGVkID0gMTsKKwl9IGVsc2UgeworCQkvKiBMb2FkIG1vZHVsZSBpbnRvIG1lbW9yeSBhbmQgdW56aXAgaWYgY29tcHJlc3NlZCAqLworCQlpbWFnZSA9IHhtYWxsb2Nfb3Blbl96aXBwZWRfcmVhZF9jbG9zZShtX2ZpbGVuYW1lLCAmaW1hZ2Vfc2l6ZSk7CisJCWlmICghaW1hZ2UpCisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKworCW1fbmFtZSA9IHhzdHJkdXAoYmJfYmFzZW5hbWUobV9maWxlbmFtZSkpOworCS8qICJtb2R1bGUub1suZ3pdIiAtPiAibW9kdWxlIiAqLworCSpzdHJjaHJudWwobV9uYW1lLCAnLicpID0gJ1wwJzsKKworCWYgPSBvYmpfbG9hZChpbWFnZSwgaW1hZ2Vfc2l6ZSwgTE9BREJJVFMpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5TTU9EX1ZFUlNJT05fQ0hFQ0tJTkcKKwkvKiBWZXJzaW9uIGNvcnJlc3BvbmRlbmNlPyAgKi8KKwltX2hhc19tb2RpbmZvID0gKGdldF9tb2RpbmZvX3ZhbHVlKGYsICJrZXJuZWxfdmVyc2lvbiIpICE9IE5VTEwpOworCWlmICghZmxhZ19xdWlldCkgeworCQljaGFyIG1fc3RydmVyc2lvbltTVFJWRVJTSU9OTEVOXTsKKwkJc3RydWN0IHV0c25hbWUgdXRzOworCisJCWlmIChtX2hhc19tb2RpbmZvKSB7CisJCQlpbnQgbV92ZXJzaW9uID0gbmV3X2dldF9tb2R1bGVfdmVyc2lvbihmLCBtX3N0cnZlcnNpb24pOworCQkJaWYgKG1fdmVyc2lvbiA9PSAtMSkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBmaW5kIHRoZSBrZXJuZWwgdmVyc2lvbiAiCisJCQkJCSJ0aGUgbW9kdWxlIHdhcyBjb21waWxlZCBmb3IiKTsKKwkJCX0KKwkJfQorCisJCXVuYW1lKCZ1dHMpOworCQlpZiAoc3RybmNtcCh1dHMucmVsZWFzZSwgbV9zdHJ2ZXJzaW9uLCBTVFJWRVJTSU9OTEVOKSAhPSAwKSB7CisJCQliYl9lcnJvcl9tc2coIiVza2VybmVsLW1vZHVsZSB2ZXJzaW9uIG1pc21hdGNoXG4iCisJCQkJIlx0JXMgd2FzIGNvbXBpbGVkIGZvciBrZXJuZWwgdmVyc2lvbiAlc1xuIgorCQkJCSJcdHdoaWxlIHRoaXMga2VybmVsIGlzIHZlcnNpb24gJXMiLAorCQkJCWZsYWdfZm9yY2VfbG9hZCA/ICJ3YXJuaW5nOiAiIDogIiIsCisJCQkJbV9uYW1lLCBtX3N0cnZlcnNpb24sIHV0cy5yZWxlYXNlKTsKKwkJCWlmICghZmxhZ19mb3JjZV9sb2FkKQorCQkJCWdvdG8gb3V0OworCQl9CisJfQorI2VuZGlmCisKKwlpZiAocXVlcnlfbW9kdWxlKE5VTEwsIDAsIE5VTEwsIDAsIE5VTEwpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgib2xkICh1bnN1cHBvcnRlZCkga2VybmVsIik7CisJbmV3X2dldF9rZXJuZWxfc3ltYm9scygpOworCWtfY3JjcyA9IG5ld19pc19rZXJuZWxfY2hlY2tzdW1tZWQoKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9WRVJTSU9OX0NIRUNLSU5HCisJeworCQlpbnQgbV9jcmNzID0gMDsKKwkJaWYgKG1faGFzX21vZGluZm8pCisJCQltX2NyY3MgPSBuZXdfaXNfbW9kdWxlX2NoZWNrc3VtbWVkKGYpOworCQlpZiAobV9jcmNzICE9IGtfY3JjcykKKwkJCW9ial9zZXRfc3ltYm9sX2NvbXBhcmUoZiwgbmN2X3N0cmNtcCwgbmN2X3N5bWJvbF9oYXNoKTsKKwl9CisjZW5kaWYKKworCS8qIExldCB0aGUgbW9kdWxlIGtub3cgYWJvdXQgdGhlIGtlcm5lbCBzeW1ib2xzLiAgKi8KKwlhZGRfa2VybmVsX3N5bWJvbHMoZik7CisKKwkvKiBBbGxvY2F0ZSBjb21tb24gc3ltYm9scywgc3ltYm9sIHRhYmxlcywgYW5kIHN0cmluZyB0YWJsZXMuICAqLworCW5ld19jcmVhdGVfdGhpc19tb2R1bGUoZiwgbV9uYW1lKTsKKwlvYmpfY2hlY2tfdW5kZWZpbmVkcyhmKTsKKwlvYmpfYWxsb2NhdGVfY29tbW9ucyhmKTsKKwljaGVja190YWludGVkX21vZHVsZShmLCBtX25hbWUpOworCisJLyogRG9uZSB3aXRoIHRoZSBtb2R1bGUgbmFtZSwgb24gdG8gdGhlIG9wdGlvbmFsIHZhcj12YWx1ZSBhcmd1bWVudHMgKi8KKwluZXdfcHJvY2Vzc19tb2R1bGVfYXJndW1lbnRzKGYsIG9wdGlvbnMpOworCisJYXJjaF9jcmVhdGVfZ290KGYpOworCWhpZGVfc3BlY2lhbF9zeW1ib2xzKGYpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5TTU9EX0tTWU1PT1BTX1NZTUJPTFMKKwlhZGRfa3N5bW9vcHNfc3ltYm9scyhmLCBtX2ZpbGVuYW1lLCBtX25hbWUpOworI2VuZGlmCisKKwluZXdfY3JlYXRlX21vZHVsZV9rc3ltdGFiKGYpOworCisJLyogRmluZCBjdXJyZW50IHNpemUgb2YgdGhlIG1vZHVsZSAqLworCW1fc2l6ZSA9IG9ial9sb2FkX3NpemUoZik7CisKKwltX2FkZHIgPSBjcmVhdGVfbW9kdWxlKG1fbmFtZSwgbV9zaXplKTsKKwlpZiAobV9hZGRyID09IChFbGZXKEFkZHIpKSgtMSkpIHN3aXRjaCAoZXJybm8pIHsKKwljYXNlIEVFWElTVDoKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImEgbW9kdWxlIG5hbWVkICVzIGFscmVhZHkgZXhpc3RzIiwgbV9uYW1lKTsKKwljYXNlIEVOT01FTToKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGFsbG9jYXRlIGtlcm5lbCBtZW1vcnkgZm9yIG1vZHVsZTsgbmVlZGVkICVsdSBieXRlcyIsCisJCQkJbV9zaXplKTsKKwlkZWZhdWx0OgorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNyZWF0ZV9tb2R1bGU6ICVzIiwgbV9uYW1lKTsKKwl9CisKKyNpZiAhTE9BREJJVFMKKwkvKgorCSAqIHRoZSBQUk9HQklUUyBzZWN0aW9uIHdhcyBub3QgbG9hZGVkIGJ5IHRoZSBvYmpfbG9hZAorCSAqIG5vdyB3ZSBjYW4gbG9hZCB0aGVtIGRpcmVjdGx5IGludG8gdGhlIGtlcm5lbCBtZW1vcnkKKwkgKi8KKwlpZiAoIW9ial9sb2FkX3Byb2diaXRzKGltYWdlLCBpbWFnZV9zaXplLCBmLCAoY2hhciopbV9hZGRyKSkgeworCQlkZWxldGVfbW9kdWxlKG1fbmFtZSwgMCk7CisJCWdvdG8gb3V0OworCX0KKyNlbmRpZgorCisJaWYgKCFvYmpfcmVsb2NhdGUoZiwgbV9hZGRyKSkgeworCQlkZWxldGVfbW9kdWxlKG1fbmFtZSwgMCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghbmV3X2luaXRfbW9kdWxlKG1fbmFtZSwgZiwgbV9zaXplKSkgeworCQlkZWxldGVfbW9kdWxlKG1fbmFtZSwgMCk7CisJCWdvdG8gb3V0OworCX0KKworCWlmIChmbGFnX3ByaW50X2xvYWRfbWFwKQorCQlwcmludF9sb2FkX21hcChmKTsKKworCWV4aXRfc3RhdHVzID0gRVhJVF9TVUNDRVNTOworCisgb3V0OgorCWlmIChtbWFwZWQpCisJCW11bm1hcChpbWFnZSwgaW1hZ2Vfc2l6ZSk7CisJZWxzZQorCQlmcmVlKGltYWdlKTsKKwlmcmVlKG1fbmFtZSk7CisKKwlyZXR1cm4gZXhpdF9zdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tb2R1dGlscy9tb2R1dGlscy5jIGIvbW9kdXRpbHMvbW9kdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDMwMGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdXRpbHMvbW9kdXRpbHMuYwpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvbW1vbiBtb2R1dGlscyByZWxhdGVkIGZ1bmN0aW9ucyBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBUaW1vIFRlcmFzIDx0aW1vLnRlcmFzQGlraS5maT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibW9kdXRpbHMuaCIKKworI2lmZGVmIF9fVUNMSUJDX18KK2V4dGVybiBpbnQgaW5pdF9tb2R1bGUodm9pZCAqbW9kdWxlLCB1bnNpZ25lZCBsb25nIGxlbiwgY29uc3QgY2hhciAqb3B0aW9ucyk7CitleHRlcm4gaW50IGRlbGV0ZV9tb2R1bGUoY29uc3QgY2hhciAqbW9kdWxlLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOworI2Vsc2UKKyMgaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyMgZGVmaW5lIGluaXRfbW9kdWxlKG1vZCwgbGVuLCBvcHRzKSBzeXNjYWxsKF9fTlJfaW5pdF9tb2R1bGUsIG1vZCwgbGVuLCBvcHRzKQorIyBkZWZpbmUgZGVsZXRlX21vZHVsZShtb2QsIGZsYWdzKSBzeXNjYWxsKF9fTlJfZGVsZXRlX21vZHVsZSwgbW9kLCBmbGFncykKKyNlbmRpZgorCit2b2lkIEZBU1RfRlVOQyByZXBsYWNlKGNoYXIgKnMsIGNoYXIgd2hhdCwgY2hhciB3aXRoKQoreworCXdoaWxlICgqcykgeworCQlpZiAod2hhdCA9PSAqcykKKwkJCSpzID0gd2l0aDsKKwkJKytzOworCX0KK30KKworY2hhciogRkFTVF9GVU5DIHJlcGxhY2VfdW5kZXJzY29yZXMoY2hhciAqcykKK3sKKwlyZXBsYWNlKHMsICctJywgJ18nKTsKKwlyZXR1cm4gczsKK30KKworaW50IEZBU1RfRlVOQyBzdHJpbmdfdG9fbGxpc3QoY2hhciAqc3RyaW5nLCBsbGlzdF90ICoqbGxpc3QsIGNvbnN0IGNoYXIgKmRlbGltKQoreworCWNoYXIgKnRvazsKKwlpbnQgbGVuID0gMDsKKworCXdoaWxlICgodG9rID0gc3Ryc2VwKCZzdHJpbmcsIGRlbGltKSkgIT0gTlVMTCkgeworCQlpZiAodG9rWzBdID09ICdcMCcpCisJCQljb250aW51ZTsKKwkJbGxpc3RfYWRkX3RvX2VuZChsbGlzdCwgeHN0cmR1cCh0b2spKTsKKwkJbGVuICs9IHN0cmxlbih0b2spOworCX0KKwlyZXR1cm4gbGVuOworfQorCitjaGFyKiBGQVNUX0ZVTkMgZmlsZW5hbWUybW9kbmFtZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY2hhciAqbW9kbmFtZSkKK3sKKwljaGFyIGxvY2FsX21vZG5hbWVbTU9EVUxFX05BTUVfTEVOXTsKKwlpbnQgaTsKKwljb25zdCBjaGFyICpmcm9tOworCisJaWYgKGZpbGVuYW1lID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCWlmIChtb2RuYW1lID09IE5VTEwpCisJCW1vZG5hbWUgPSBsb2NhbF9tb2RuYW1lOworCS8vIERpc2FibGVkIHNpbmNlIG90aGVyd2lzZSAibW9kcHJvYmUgZGlyL25hbWUiIHdvdWxkIHdvcmsKKwkvLyBhcyBpZiBpdCBpcyAibW9kcHJvYmUgbmFtZSIuIEl0IGlzIHVuY2xlYXIgd2h5CisJLy8gJ2Jhc2VuYW1pemF0aW9uJyB3YXMgaGVyZSBpbiB0aGUgZmlyc3QgcGxhY2UuCisJLy9mcm9tID0gYmJfZ2V0X2xhc3RfcGF0aF9jb21wb25lbnRfbm9zdHJpcChmaWxlbmFtZSk7CisJZnJvbSA9IGZpbGVuYW1lOworCWZvciAoaSA9IDA7IGkgPCAoTU9EVUxFX05BTUVfTEVOLTEpICYmIGZyb21baV0gIT0gJ1wwJyAmJiBmcm9tW2ldICE9ICcuJzsgaSsrKQorCQltb2RuYW1lW2ldID0gKGZyb21baV0gPT0gJy0nKSA/ICdfJyA6IGZyb21baV07CisJbW9kbmFtZVtpXSA9ICdcMCc7CisKKwlpZiAobW9kbmFtZSA9PSBsb2NhbF9tb2RuYW1lKQorCQlyZXR1cm4geHN0cmR1cChtb2RuYW1lKTsKKworCXJldHVybiBtb2RuYW1lOworfQorCitjaGFyKiBGQVNUX0ZVTkMgcGFyc2VfY21kbGluZV9tb2R1bGVfb3B0aW9ucyhjaGFyICoqYXJndiwgaW50IHF1b3RlX3NwYWNlcykKK3sKKwljaGFyICpvcHRpb25zOworCWludCBvcHRsZW47CisKKwlvcHRpb25zID0geHphbGxvYygxKTsKKwlvcHRsZW4gPSAwOworCXdoaWxlICgqKythcmd2KSB7CisJCWNvbnN0IGNoYXIgKmZtdDsKKwkJY29uc3QgY2hhciAqdmFyOworCQljb25zdCBjaGFyICp2YWw7CisKKwkJdmFyID0gKmFyZ3Y7CisJCW9wdGlvbnMgPSB4cmVhbGxvYyhvcHRpb25zLCBvcHRsZW4gKyAyICsgc3RybGVuKHZhcikgKyAyKTsKKwkJZm10ID0gIiUuKnMlcyAiOworCQl2YWwgPSBzdHJjaHJudWwodmFyLCAnPScpOworCQlpZiAocXVvdGVfc3BhY2VzKSB7CisJCQkvKgorCQkJICogbW9kcHJvYmUgKG1vZHVsZS1pbml0LXRvb2xzIHZlcnNpb24gMy4xMS4xKSBjb21wYXQ6CisJCQkgKiBxdW90ZSBvbmx5IHZhbHVlOgorCQkJICogdmFyPSJ2YWwgd2l0aCBzcGFjZXMiLCBub3QgInZhcj12YWwgd2l0aCBzcGFjZXMiCisJCQkgKiAobm90ZTogdmFyICpuYW1lKiBpcyBub3QgY2hlY2tlZCBmb3Igc3BhY2VzISkKKwkJCSAqLworCQkJaWYgKCp2YWwpIHsgLyogaGFzIHZhcj12YWwgZm9ybWF0LiBza2lwICc9JyAqLworCQkJCXZhbCsrOworCQkJCWlmIChzdHJjaHIodmFsLCAnICcpKQorCQkJCQlmbXQgPSAiJS4qc1wiJXNcIiAiOworCQkJfQorCQl9CisJCW9wdGxlbiArPSBzcHJpbnRmKG9wdGlvbnMgKyBvcHRsZW4sIGZtdCwgKGludCkodmFsIC0gdmFyKSwgdmFyLCB2YWwpOworCX0KKwkvKiBSZW1vdmUgdHJhaWxpbmcgc3BhY2UuIERpc2FibGVkICovCisJLyogaWYgKG9wdGxlbiAhPSAwKSBvcHRpb25zW29wdGxlbi0xXSA9ICdcMCc7ICovCisJcmV0dXJuIG9wdGlvbnM7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTlNNT0RfVFJZX01NQVAKK3ZvaWQqIEZBU1RfRlVOQyB0cnlfdG9fbW1hcF9tb2R1bGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIHNpemVfdCAqaW1hZ2Vfc2l6ZV9wKQoreworCS8qIFdlIGhhdmUgdXNlciByZXBvcnRzIG9mIGZhaWx1cmUgdG8gbG9hZCAzTUIgbW9kdWxlCisJICogb24gYSAxNk1CIFJBTSBtYWNoaW5lLiBBcHBhcmVudGx5IGV2ZW4gYSB0cmFuc2llbnQKKwkgKiBtZW1vcnkgc3Bpa2UgdG8gNk1CIGR1cmluZyBtb2R1bGUgbG9hZAorCSAqIGlzIHRvbyBiaWcgZm9yIHRoYXQgc3lzdGVtLiAqLworCXZvaWQgKmltYWdlOworCXN0cnVjdCBzdGF0IHN0OworCWludCBmZDsKKworCWZkID0geG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlmc3RhdChmZCwgJnN0KTsKKwlpbWFnZSA9IE5VTEw7CisJLyogc3Quc3Rfc2l6ZSBpcyBvZmZfdCwgd2UgY2FuJ3QganVzdCBwYXNzIGl0IHRvIG1tYXAgKi8KKwlpZiAoc3Quc3Rfc2l6ZSA8PSAqaW1hZ2Vfc2l6ZV9wKSB7CisJCXNpemVfdCBpbWFnZV9zaXplID0gc3Quc3Rfc2l6ZTsKKwkJaW1hZ2UgPSBtbWFwKE5VTEwsIGltYWdlX3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwkJaWYgKGltYWdlID09IE1BUF9GQUlMRUQpIHsKKwkJCWltYWdlID0gTlVMTDsKKwkJfSBlbHNlIGlmICgqKHVpbnQzMl90KilpbWFnZSAhPSBTV0FQX0JFMzIoMHg3ZjQ1NEM0NikpIHsKKwkJCS8qIE5vIEVMRiBzaWduYXR1cmUuIENvbXByZXNzZWQgbW9kdWxlPyAqLworCQkJbXVubWFwKGltYWdlLCBpbWFnZV9zaXplKTsKKwkJCWltYWdlID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCS8qIFN1Y2Nlc3MuIFJlcG9ydCB0aGUgc2l6ZSAqLworCQkJKmltYWdlX3NpemVfcCA9IGltYWdlX3NpemU7CisJCX0KKwl9CisJY2xvc2UoZmQpOworCXJldHVybiBpbWFnZTsKK30KKyNlbmRpZgorCisvKiBSZXR1cm46CisgKiAwIG9uIHN1Y2Nlc3MsCisgKiAtZXJybm8gb24gb3Blbi9yZWFkIGVycm9yLAorICogZXJybm8gb24gaW5pdF9tb2R1bGUoKSBlcnJvcgorICovCitpbnQgRkFTVF9GVU5DIGJiX2luaXRfbW9kdWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICpvcHRpb25zKQoreworCXNpemVfdCBpbWFnZV9zaXplOworCWNoYXIgKmltYWdlOworCWludCByYzsKKwlib29sIG1tYXBlZDsKKworCWlmICghb3B0aW9ucykKKwkJb3B0aW9ucyA9ICIiOworCisvL1RPRE86IGF1ZGl0IGJiX2luaXRfbW9kdWxlXzI0IHRvIG1hdGNoIGVycm9yIGNvZGUgY29udmVudGlvbgorI2lmIEVOQUJMRV9GRUFUVVJFXzJfNF9NT0RVTEVTCisJaWYgKGdldF9saW51eF92ZXJzaW9uX2NvZGUoKSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwwKSkKKwkJcmV0dXJuIGJiX2luaXRfbW9kdWxlXzI0KGZpbGVuYW1lLCBvcHRpb25zKTsKKyNlbmRpZgorCisJaW1hZ2Vfc2l6ZSA9IElOVF9NQVggLSA0MDk1OworCW1tYXBlZCA9IDA7CisJaW1hZ2UgPSB0cnlfdG9fbW1hcF9tb2R1bGUoZmlsZW5hbWUsICZpbWFnZV9zaXplKTsKKwlpZiAoaW1hZ2UpIHsKKwkJbW1hcGVkID0gMTsKKwl9IGVsc2UgeworCQllcnJubyA9IEVOT01FTTsgLyogbWF5IGJlIGNoYW5nZWQgYnkgZS5nLiBvcGVuIGVycm9ycyBiZWxvdyAqLworCQlpbWFnZSA9IHhtYWxsb2Nfb3Blbl96aXBwZWRfcmVhZF9jbG9zZShmaWxlbmFtZSwgJmltYWdlX3NpemUpOworCQlpZiAoIWltYWdlKQorCQkJcmV0dXJuIC1lcnJubzsKKwl9CisKKwllcnJubyA9IDA7CisJaW5pdF9tb2R1bGUoaW1hZ2UsIGltYWdlX3NpemUsIG9wdGlvbnMpOworCXJjID0gZXJybm87CisJaWYgKG1tYXBlZCkKKwkJbXVubWFwKGltYWdlLCBpbWFnZV9zaXplKTsKKwllbHNlCisJCWZyZWUoaW1hZ2UpOworCXJldHVybiByYzsKK30KKworaW50IEZBU1RfRlVOQyBiYl9kZWxldGVfbW9kdWxlKGNvbnN0IGNoYXIgKm1vZHVsZSwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCWVycm5vID0gMDsKKwlkZWxldGVfbW9kdWxlKG1vZHVsZSwgZmxhZ3MpOworCXJldHVybiBlcnJubzsKK30KKworY29uc3QgY2hhciogRkFTVF9GVU5DIG1vZGVycm9yKGludCBlcnIpCit7CisJc3dpdGNoIChlcnIpIHsKKwljYXNlIC0xOiAvKiBidHc6IGl0J3MgLUVQRVJNICovCisJCXJldHVybiAibm8gc3VjaCBtb2R1bGUiOworCWNhc2UgRU5PRVhFQzoKKwkJcmV0dXJuICJpbnZhbGlkIG1vZHVsZSBmb3JtYXQiOworCWNhc2UgRU5PRU5UOgorCQlyZXR1cm4gInVua25vd24gc3ltYm9sIGluIG1vZHVsZSwgb3IgdW5rbm93biBwYXJhbWV0ZXIiOworCWNhc2UgRVNSQ0g6CisJCXJldHVybiAibW9kdWxlIGhhcyB3cm9uZyBzeW1ib2wgdmVyc2lvbiI7CisJY2FzZSBFTk9TWVM6CisJCXJldHVybiAia2VybmVsIGRvZXMgbm90IHN1cHBvcnQgcmVxdWVzdGVkIG9wZXJhdGlvbiI7CisJfQorCWlmIChlcnIgPCAwKSAvKiBzaG91bGQgYWx3YXlzIGJlICovCisJCWVyciA9IC1lcnI7CisJcmV0dXJuIHN0cmVycm9yKGVycik7Cit9CmRpZmYgLS1naXQgYS9tb2R1dGlscy9tb2R1dGlscy5oIGIvbW9kdXRpbHMvbW9kdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjA1OWM3Ci0tLSAvZGV2L251bGwKKysrIGIvbW9kdXRpbHMvbW9kdXRpbHMuaApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29tbW9uIG1vZHV0aWxzIHJlbGF0ZWQgZnVuY3Rpb25zIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IGJ5IFRpbW8gVGVyYXMgPHRpbW8udGVyYXNAaWtpLmZpPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2lmbmRlZiBNT0RVVElMU19ICisjZGVmaW5lIE1PRFVUSUxTX0ggMQorCisjaW5jbHVkZSAibGliYmIuaCIKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKKy8qIGxpbnV4L2luY2x1ZGUvbGludXgvbW9kdWxlLmggaGFzIDY0LCBidXQgdGhpcyBpcyBhbHNvIHVzZWQKKyAqIGludGVybmFsbHkgZm9yIHRoZSBtYXhpbXVtIGFsaWFzIG5hbWUgbGVuZ3RoLCB3aGljaCBjYW4gYmUgcXVpdGUgbG9uZyAqLworI2RlZmluZSBNT0RVTEVfTkFNRV9MRU4gMjU2CisKK3ZvaWQgcmVwbGFjZShjaGFyICpzLCBjaGFyIHdoYXQsIGNoYXIgd2l0aCkgRkFTVF9GVU5DOworY2hhciAqcmVwbGFjZV91bmRlcnNjb3JlcyhjaGFyICpzKSBGQVNUX0ZVTkM7CitpbnQgc3RyaW5nX3RvX2xsaXN0KGNoYXIgKnN0cmluZywgbGxpc3RfdCAqKmxsaXN0LCBjb25zdCBjaGFyICpkZWxpbSkgRkFTVF9GVU5DOworY2hhciAqZmlsZW5hbWUybW9kbmFtZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY2hhciAqbW9kbmFtZSkgRkFTVF9GVU5DOworY2hhciAqcGFyc2VfY21kbGluZV9tb2R1bGVfb3B0aW9ucyhjaGFyICoqYXJndiwgaW50IHF1b3RlX3NwYWNlcykgRkFTVF9GVU5DOworCisvKiBpbnNtb2QgZm9yIDIuNCBhbmQgbW9kcHJvYmUncyBvcHRpb25zIChpbnNtb2QgMi42IGhhcyBubyBvcHRpb25zIGF0IGFsbCk6ICovCisjZGVmaW5lIElOU01PRF9PUFRTIFwKKwkidnFzIiBcCisJSUZfRkVBVFVSRV8yXzRfTU9EVUxFUygiTGZreCIgSUZfRkVBVFVSRV9JTlNNT0RfTE9BRF9NQVAoIm0iKSkKKyNkZWZpbmUgSU5TTU9EX0FSR1MgLyogKHdhcyBtZWFudCB0byBzdXBwb3J0IC1vIE5BTUUpICwgTlVMTCAqLworCitlbnVtIHsKKwlJTlNNT0RfT1BUX1ZFUkJPU0UgICAgICA9ICgxIDw8IDApLAorCUlOU01PRF9PUFRfU0lMRU5UICAgICAgID0gKDEgPDwgMSksCisJSU5TTU9EX09QVF9TWVNMT0cgICAgICAgPSAoMSA8PCAyKSwKKwkvL0lOU01PRF9PUFRfT1VUUFVUTkFNRSA9ICgxIDw8IHgpIC0gbm90IHN1cHBvcnRlZCB5ZXQKKwlJTlNNT0RfT1BUX0xPQ0sgICAgICAgICA9ICgxIDw8IDMpICogRU5BQkxFX0ZFQVRVUkVfMl80X01PRFVMRVMsCisJSU5TTU9EX09QVF9GT1JDRSAgICAgICAgPSAoMSA8PCA0KSAqIEVOQUJMRV9GRUFUVVJFXzJfNF9NT0RVTEVTLAorCUlOU01PRF9PUFRfS0VSTkVMRCAgICAgID0gKDEgPDwgNSkgKiBFTkFCTEVfRkVBVFVSRV8yXzRfTU9EVUxFUywKKwlJTlNNT0RfT1BUX05PX0VYUE9SVCAgICA9ICgxIDw8IDYpICogRU5BQkxFX0ZFQVRVUkVfMl80X01PRFVMRVMsCisJSU5TTU9EX09QVF9QUklOVF9NQVAgICAgPSAoMSA8PCA3KSAqIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9MT0FEX01BUCwKKwlJTlNNT0RfT1BUX1VOVVNFRCAgICAgICA9CisJCShJTlNNT0RfT1BUX1BSSU5UX01BUCA/IElOU01PRF9PUFRfUFJJTlRfTUFQCisJCTogSU5TTU9EX09QVF9OT19FWFBPUlQgPyBJTlNNT0RfT1BUX05PX0VYUE9SVAorCQk6IElOU01PRF9PUFRfU1lTTE9HCisJCSkgPDwgMQorfTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lOU01PRF9UUllfTU1BUAordm9pZCogRkFTVF9GVU5DIHRyeV90b19tbWFwX21vZHVsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgc2l6ZV90ICppbWFnZV9zaXplX3ApOworI2Vsc2UKKyMgZGVmaW5lIHRyeV90b19tbWFwX21vZHVsZShmaWxlbmFtZSwgaW1hZ2Vfc2l6ZSkgTlVMTAorI2VuZGlmCisKKy8qIFJldHVybjoKKyAqIDAgb24gc3VjY2VzcywKKyAqIC1lcnJubyBvbiBvcGVuL3JlYWQgZXJyb3IsCisgKiBlcnJubyBvbiBpbml0X21vZHVsZSgpIGVycm9yCisgKi8KK2ludCBGQVNUX0ZVTkMgYmJfaW5pdF9tb2R1bGUoY29uc3QgY2hhciAqbW9kdWxlLCBjb25zdCBjaGFyICpvcHRpb25zKTsKKy8qIFJldHVybjoKKyAqIDAgb24gc3VjY2VzcywKKyAqIGVycm5vIG9uIGluaXRfbW9kdWxlKCkgZXJyb3IKKyAqLworaW50IEZBU1RfRlVOQyBiYl9kZWxldGVfbW9kdWxlKGNvbnN0IGNoYXIgKm1vZHVsZSwgdW5zaWduZWQgaW50IGZsYWdzKTsKKy8qIFRyYW5zbGF0ZXMgZXJyb3IgcmV0dXJuIHRvIGEgc3RyaW5nICovCitjb25zdCBjaGFyICptb2RlcnJvcihpbnQgZXJyKSBGQVNUX0ZVTkM7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV8yXzRfTU9EVUxFUworaW50IEZBU1RfRlVOQyBiYl9pbml0X21vZHVsZV8yNChjb25zdCBjaGFyICptb2R1bGUsIGNvbnN0IGNoYXIgKm9wdGlvbnMpOworI2VuZGlmCisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbW9kdXRpbHMvcm1tb2QuYyBiL21vZHV0aWxzL3JtbW9kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjEzZmY5ZQotLS0gL2Rldi9udWxsCisrKyBiL21vZHV0aWxzL3JtbW9kLmMKQEAgLTAsMCArMSw2NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBybW1vZCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaW1vIFRlcmFzIDx0aW1vLnRlcmFzQGlraS5maT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vYXBwbGV0OklGX1JNTU9EKEFQUExFVChybW1vZCwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisKKy8vdXNhZ2U6I2lmICFFTkFCTEVfTU9EUFJPQkVfU01BTEwKKy8vdXNhZ2U6I2RlZmluZSBybW1vZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy13ZmFdIFtNT0RVTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHJtbW9kX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVW5sb2FkIGtlcm5lbCBtb2R1bGVzXG4iCisvL3VzYWdlOiAgICAgIlxuCS13CVdhaXQgdW50aWwgdGhlIG1vZHVsZSBpcyBubyBsb25nZXIgdXNlZCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgdW5sb2FkIgorLy91c2FnZTogICAgICJcbgktYQlSZW1vdmUgYWxsIHVudXNlZCBtb2R1bGVzIChyZWN1cnNpdmVseSkiCisvL3VzYWdlOiNkZWZpbmUgcm1tb2RfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgcm1tb2QgdHVsaXBcbiIKKy8vdXNhZ2U6I2VuZGlmCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgIm1vZHV0aWxzLmgiCisKK2ludCBybW1vZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcm1tb2RfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBuOworCXVuc2lnbmVkIGZsYWdzID0gT19OT05CTE9DSyB8IE9fRVhDTDsKKworCS8qIFBhcnNlIGNvbW1hbmQgbGluZS4gKi8KKwluID0gZ2V0b3B0MzIoYXJndiwgIndmYXMiKTsgLy8gLXMgaWdub3JlZAorCWFyZ3YgKz0gb3B0aW5kOworCWlmIChuICYgMSkgIC8vIC0td2FpdAorCQlmbGFncyAmPSB+T19OT05CTE9DSzsKKwlpZiAobiAmIDIpICAvLyAtLWZvcmNlCisJCWZsYWdzIHw9IE9fVFJVTkM7CisJaWYgKG4gJiA0KSB7CisJCS8qIFVubG9hZCBfYWxsXyB1bnVzZWQgbW9kdWxlcyB2aWEgTlVMTCBkZWxldGVfbW9kdWxlKCkgY2FsbCAqLworCQlpZiAoYmJfZGVsZXRlX21vZHVsZShOVUxMLCBmbGFncykgIT0gMCAmJiBlcnJubyAhPSBFRkFVTFQpCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInJtbW9kIik7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJaWYgKCEqYXJndikKKwkJYmJfc2hvd191c2FnZSgpOworCisJbiA9IEVOQUJMRV9GRUFUVVJFXzJfNF9NT0RVTEVTICYmIGdldF9saW51eF92ZXJzaW9uX2NvZGUoKSA8IEtFUk5FTF9WRVJTSU9OKDIsNiwwKTsKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJY2hhciBtb2RuYW1lW01PRFVMRV9OQU1FX0xFTl07CisJCWNvbnN0IGNoYXIgKmJuYW1lOworCisJCWJuYW1lID0gYmJfYmFzZW5hbWUoKmFyZ3YrKyk7CisJCWlmIChuKQorCQkJc2FmZV9zdHJuY3B5KG1vZG5hbWUsIGJuYW1lLCBNT0RVTEVfTkFNRV9MRU4pOworCQllbHNlCisJCQlmaWxlbmFtZTJtb2RuYW1lKGJuYW1lLCBtb2RuYW1lKTsKKwkJaWYgKGJiX2RlbGV0ZV9tb2R1bGUobW9kbmFtZSwgZmxhZ3MpKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHVubG9hZCAnJXMnOiAlcyIsCisJCQkJCW1vZG5hbWUsIG1vZGVycm9yKGVycm5vKSk7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvQ29uZmlnLnNyYyBiL25ldHdvcmtpbmcvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2NjYmYzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9Db25maWcuc3JjCkBAIC0wLDAgKzEsOTcwIEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJOZXR3b3JraW5nIFV0aWxpdGllcyIKKworSU5TRVJUCisKK2NvbmZpZyBGRUFUVVJFX0lQVjYKKwlib29sICJFbmFibGUgSVB2NiBzdXBwb3J0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEVuYWJsZSBJUHY2IHN1cHBvcnQgaW4gYnVzeWJveC4KKwkgIFRoaXMgYWRkcyBJUHY2IHN1cHBvcnQgaW4gdGhlIG5ldHdvcmtpbmcgYXBwbGV0cy4KKworY29uZmlnIEZFQVRVUkVfVU5JWF9MT0NBTAorCWJvb2wgIkVuYWJsZSBVbml4IGRvbWFpbiBzb2NrZXQgc3VwcG9ydCAodXN1YWxseSBub3QgbmVlZGVkKSIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBFbmFibGUgVW5peCBkb21haW4gc29ja2V0IHN1cHBvcnQgaW4gYWxsIGJ1c3lib3ggbmV0d29ya2luZworCSAgYXBwbGV0cy4gIEFkZHJlc3Mgb2YgdGhlIGZvcm0gbG9jYWw6L3BhdGgvdG8vdW5peC9zb2NrZXQKKwkgIHdpbGwgYmUgcmVjb2duaXplZC4KKworCSAgVGhpcyBleHRlbnNpb24gaXMgYWxtb3N0IG5ldmVyIHVzZWQgaW4gcmVhbCB3b3JsZCB1c2FnZS4KKwkgIFlvdSBtb3N0IGxpa2VseSB3YW50IHRvIHNheSBOLgorCitjb25maWcgRkVBVFVSRV9QUkVGRVJfSVBWNF9BRERSRVNTCisJYm9vbCAiUHJlZmVyIElQdjQgYWRkcmVzc2VzIGZyb20gRE5TIHF1ZXJpZXMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0lQVjYKKwloZWxwCisJICBVc2UgSVB2NCBhZGRyZXNzIG9mIG5ldHdvcmsgaG9zdCBpZiBpdCBoYXMgb25lLgorCisJICBJZiB0aGlzIG9wdGlvbiBpcyBvZmYsIHRoZSBmaXJzdCByZXR1cm5lZCBhZGRyZXNzIHdpbGwgYmUgdXNlZC4KKwkgIFRoaXMgbWF5IGNhdXNlIHByb2JsZW1zIHdoZW4geW91ciBETlMgc2VydmVyIGlzIElQdjYtY2FwYWJsZSBhbmQKKwkgIGlzIHJldHVybmluZyBJUHY2IGhvc3QgYWRkcmVzc2VzIHRvby4gSWYgSVB2NiBhZGRyZXNzCisJICBwcmVjZWRlcyBJUHY0IG9uZSBpbiBETlMgcmVwbHksIGJ1c3lib3ggbmV0d29yayBhcHBsZXRzCisJICAoZS5nLiB3Z2V0KSB3aWxsIHVzZSBJUHY2IGFkZHJlc3MuIE9uIGFuIElQdjYtaW5jYXBhYmxlIGhvc3QKKwkgIG9yIG5ldHdvcmsgYXBwbGV0cyB3aWxsIGZhaWwgdG8gY29ubmVjdCB0byB0aGUgaG9zdAorCSAgdXNpbmcgSVB2NiBhZGRyZXNzLgorCitjb25maWcgVkVSQk9TRV9SRVNPTFVUSU9OX0VSUk9SUworCWJvb2wgIlZlcmJvc2UgcmVzb2x1dGlvbiBlcnJvcnMiCisJZGVmYXVsdCBuCisJaGVscAorCSAgRW5hYmxlIGlmIHlvdSBhcmUgbm90IHNhdGlzZmllZCB3aXRoIHNpbXBsaXN0aWMKKwkgICJjYW4ndCByZXNvbHZlICdob3N0bmFtZS5jb20nIiBhbmQgd2FudCB0byBrbm93IG1vcmUuCisJICBUaGlzIG1heSBpbmNyZWFzZSBzaXplIG9mIHlvdXIgZXhlY3V0YWJsZSBhIGJpdC4KKworY29uZmlnIEFSUAorCWJvb2wgImFycCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBNYW5pcHVsYXRlIHRoZSBzeXN0ZW0gQVJQIGNhY2hlLgorCitjb25maWcgQVJQSU5HCisJYm9vbCAiYXJwaW5nIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFBpbmcgaG9zdHMgYnkgQVJQIHBhY2tldHMuCisKK2NvbmZpZyBCUkNUTAorCWJvb2wgImJyY3RsIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIE1hbmFnZSBldGhlcm5ldCBicmlkZ2VzLgorCSAgU3VwcG9ydHMgYWRkYnIvZGVsYnIgYW5kIGFkZGlmL2RlbGlmLgorCitjb25maWcgRkVBVFVSRV9CUkNUTF9GQU5DWQorCWJvb2wgIkZhbmN5IG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBCUkNUTAorCWhlbHAKKwkgIEFkZCBzdXBwb3J0IGZvciBleHRlbmRlZCBvcHRpb24gbGlrZToKKwkgICAgc2V0YWdlaW5nLCBzZXRmZCwgc2V0aGVsbG8sIHNldG1heGFnZSwKKwkgICAgc2V0cGF0aGNvc3QsIHNldHBvcnRwcmlvLCBzZXRicmlkZ2VwcmlvLAorCSAgICBzdHAKKwkgIFRoaXMgYWRkcyBhYm91dCA2MDAgYnl0ZXMuCisKK2NvbmZpZyBGRUFUVVJFX0JSQ1RMX1NIT1cKKwlib29sICJTdXBwb3J0IHNob3ciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBCUkNUTCAmJiBGRUFUVVJFX0JSQ1RMX0ZBTkNZCisJaGVscAorCSAgQWRkIHN1cHBvcnQgZm9yIG9wdGlvbiB3aGljaCBwcmludHMgdGhlIGN1cnJlbnQgY29uZmlnOgorCSAgICBzaG93CisKK2NvbmZpZyBETlNECisJYm9vbCAiZG5zZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTbWFsbCBhbmQgc3RhdGljIEROUyBzZXJ2ZXIgZGFlbW9uLgorCitjb25maWcgRVRIRVJfV0FLRQorCWJvb2wgImV0aGVyLXdha2UiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgU2VuZCBhIG1hZ2ljIHBhY2tldCB0byB3YWtlIHVwIHNsZWVwaW5nIG1hY2hpbmVzLgorCitjb25maWcgRkFLRUlERU5URAorCWJvb2wgImZha2VpZGVudGQiCisJZGVmYXVsdCB5CisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgZmFrZWlkZW50ZCBsaXN0ZW5zIG9uIHRoZSBpZGVudCBwb3J0IGFuZCByZXR1cm5zIGEgcHJlZGVmaW5lZAorCSAgZmFrZSB2YWx1ZSBvbiBhbnkgcXVlcnkuCisKK2NvbmZpZyBGVFBECisJYm9vbCAiZnRwZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBzaW1wbGUgRlRQIGRhZW1vbi4gWW91IGhhdmUgdG8gcnVuIGl0IHZpYSBpbmV0ZC4KKworY29uZmlnIEZFQVRVUkVfRlRQX1dSSVRFCisJYm9vbCAiRW5hYmxlIHVwbG9hZCBjb21tYW5kcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZUUEQKKwloZWxwCisJICBFbmFibGUgYWxsIGtpbmRzIG9mIEZUUCB1cGxvYWQgY29tbWFuZHMgKC13IG9wdGlvbikKKworY29uZmlnIEZFQVRVUkVfRlRQRF9BQ0NFUFRfQlJPS0VOX0xJU1QKKwlib29sICJFbmFibGUgd29ya2Fyb3VuZCBmb3IgUkZDLXZpb2xhdGluZyBjbGllbnRzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRlRQRAorCWhlbHAKKwkgIFNvbWUgZnRwIGNsaWVudHMgKGFtb25nIHRoZW0gS0RFJ3MgS29ucXVlcm9yKSBpc3N1ZSBpbGxlZ2FsCisJICAiTElTVCAtbCIgcmVxdWVzdHMuIFRoaXMgb3B0aW9uIHdvcmtzIGFyb3VuZCBzdWNoIHByb2JsZW1zLgorCSAgSXQgbWlnaHQgcHJldmVudCB5b3UgZnJvbSBsaXN0aW5nIGZpbGVzIHN0YXJ0aW5nIHdpdGggIi0iIGFuZAorCSAgaXQgaW5jcmVhc2VzIHRoZSBjb2RlIHNpemUgYnkgfjQwIGJ5dGVzLgorCSAgTW9zdCBvdGhlciBmdHAgc2VydmVycyBzZWVtIHRvIGJlaGF2ZSBzaW1pbGFyIHRvIHRoaXMuCisKK2NvbmZpZyBGRUFUVVJFX0ZUUF9BVVRIRU5USUNBVElPTgorCWJvb2wgIkVuYWJsZSBhdXRoZW50aWNhdGlvbiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZUUEQKKwloZWxwCisJICBFbmFibGUgYmFzaWMgc3lzdGVtIGxvZ2luIGFzIHNlZW4gaW4gdGVsbmV0IGV0Yy4KKworY29uZmlnIEZUUEdFVAorCWJvb2wgImZ0cGdldCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBSZXRyaWV2ZSBhIHJlbW90ZSBmaWxlIHZpYSBGVFAuCisKK2NvbmZpZyBGVFBQVVQKKwlib29sICJmdHBwdXQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgU3RvcmUgYSByZW1vdGUgZmlsZSB2aWEgRlRQLgorCitjb25maWcgRkVBVFVSRV9GVFBHRVRQVVRfTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyBpbiBmdHBnZXQvZnRwcHV0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTE9OR19PUFRTICYmIChGVFBHRVQgfHwgRlRQUFVUKQorCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgZnRwZ2V0L2Z0cHB1dCBhcHBsZXQuCisKK2NvbmZpZyBIT1NUTkFNRQorCWJvb2wgImhvc3RuYW1lIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNob3cgb3Igc2V0IHRoZSBzeXN0ZW0ncyBob3N0IG5hbWUuCisKK2NvbmZpZyBIVFRQRAorCWJvb2wgImh0dHBkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNlcnZlIHdlYiBwYWdlcyB2aWEgYW4gSFRUUCBzZXJ2ZXIuCisKK2NvbmZpZyBGRUFUVVJFX0hUVFBEX1JBTkdFUworCWJvb2wgIlN1cHBvcnQgJ1JhbmdlczonIGhlYWRlciIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhUVFBECisJaGVscAorCSAgTWFrZXMgaHR0cGQgZW1pdCAiQWNjZXB0LVJhbmdlczogYnl0ZXMiIGhlYWRlciBhbmQgdW5kZXJzdGFuZAorCSAgIlJhbmdlOiBieXRlcz1OTk4tW01NTV0iIGhlYWRlci4gQWxsb3dzIGZvciByZXN1bWluZyBpbnRlcnJ1cHRlZAorCSAgZG93bmxvYWRzLCBzZWVraW5nIGluIG11bHRpbWVkaWEgcGxheWVycyBldGMuCisKK2NvbmZpZyBGRUFUVVJFX0hUVFBEX1NFVFVJRAorCWJvb2wgIkVuYWJsZSAtdSA8dXNlcj4gb3B0aW9uIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSFRUUEQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhbGxvd3MgdGhlIHNlcnZlciB0byBydW4gYXMgYSBzcGVjaWZpYyB1c2VyCisJICByYXRoZXIgdGhhbiBkZWZhdWx0aW5nIHRvIHRoZSB1c2VyIHRoYXQgc3RhcnRzIHRoZSBzZXJ2ZXIuCisJICBVc2Ugb2YgdGhpcyBvcHRpb24gcmVxdWlyZXMgc3BlY2lhbCBwcml2aWxlZ2VzIHRvIGNoYW5nZSB0byBhCisJICBkaWZmZXJlbnQgdXNlci4KKworY29uZmlnIEZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSAorCWJvb2wgIkVuYWJsZSBCYXNpYyBodHRwIEF1dGhlbnRpY2F0aW9uIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSFRUUEQKKwloZWxwCisJICBVdGlsaXplcyBwYXNzd29yZCBzZXR0aW5ncyBmcm9tIC9ldGMvaHR0cGQuY29uZiBmb3IgYmFzaWMKKwkgIGF1dGhlbnRpY2F0aW9uIG9uIGEgcGVyIHVybCBiYXNpcy4KKwkgIEV4YW1wbGUgZm9yIGh0dHBkLmNvbmYgZmlsZToKKwkgIC9hZG06dG9vcjpQYVNzV2QKKworY29uZmlnIEZFQVRVUkVfSFRUUERfQVVUSF9NRDUKKwlib29sICJTdXBwb3J0IE1ENSBjcnlwdGVkIHBhc3N3b3JkcyBmb3IgaHR0cCBBdXRoZW50aWNhdGlvbiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSAorCWhlbHAKKwkgIEVuYWJsZXMgZW5jcnlwdGVkIHBhc3N3b3JkcywgYW5kIHdpbGRjYXJkIHVzZXIvcGFzc3dvcmRzCisJICBpbiBodHRwZC5jb25mIGZpbGUuCisJICBVc2VyICcqJyBtZWFucyAnYW55IHN5c3RlbSB1c2VyIG5hbWUgaXMgb2snLAorCSAgcGFzc3dvcmQgb2YgJyonIG1lYW5zICd1c2Ugc3lzdGVtIHBhc3N3b3JkIGZvciB0aGlzIHVzZXInCisJICBFeGFtcGxlczoKKwkgIC9hZG06dG9vcjokMSRQL2VLbldYUyRhSTFhUEd4VC5kSkQ1U3pxQUtXckYwCisJICAvYWRtOnJvb3Q6KgorCSAgL3dpa2k6KjoqCisKK2NvbmZpZyBGRUFUVVJFX0hUVFBEX0NHSQorCWJvb2wgIlN1cHBvcnQgQ29tbW9uIEdhdGV3YXkgSW50ZXJmYWNlIChDR0kpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSFRUUEQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhbGxvd3Mgc2NyaXB0cyBhbmQgZXhlY3V0YWJsZXMgdG8gYmUgaW52b2tlZAorCSAgd2hlbiBzcGVjaWZpYyBVUkxzIGFyZSByZXF1ZXN0ZWQuCisKK2NvbmZpZyBGRUFUVVJFX0hUVFBEX0NPTkZJR19XSVRIX1NDUklQVF9JTlRFUlBSCisJYm9vbCAiU3VwcG9ydCBmb3IgcnVubmluZyBzY3JpcHRzIHRocm91Z2ggYW4gaW50ZXJwcmV0ZXIiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0hUVFBEX0NHSQorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGVuYWJsZXMgc3VwcG9ydCBmb3IgcnVubmluZyBzY3JpcHRzIHRocm91Z2ggYW4KKwkgIGludGVycHJldGVyLiBUdXJuIHRoaXMgb24gaWYgeW91IHdhbnQgUEhQIHNjcmlwdHMgdG8gd29yaworCSAgcHJvcGVybHkuIFlvdSBuZWVkIHRvIHN1cHBseSBhbiBhZGRpdGlvbmFsIGxpbmUgaW4geW91cgorCSAgaHR0cGQuY29uZiBmaWxlOgorCSAgKi5waHA6L3BhdGgvdG8veW91ci9waHAKKworY29uZmlnIEZFQVRVUkVfSFRUUERfU0VUX1JFTU9URV9QT1JUX1RPX0VOVgorCWJvb2wgIlNldCBSRU1PVEVfUE9SVCBlbnZpcm9ubWVudCB2YXJpYWJsZSBmb3IgQ0dJIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9IVFRQRF9DR0kKKwloZWxwCisJICBVc2Ugb2YgdGhpcyBvcHRpb24gY2FuIGFzc2lzdCBzY3JpcHRzIGluIGdlbmVyYXRpbmcKKwkgIHJlZmVyZW5jZXMgdGhhdCBjb250YWluIGEgdW5pcXVlIHBvcnQgbnVtYmVyLgorCitjb25maWcgRkVBVFVSRV9IVFRQRF9FTkNPREVfVVJMX1NUUgorCWJvb2wgIkVuYWJsZSAtZSBvcHRpb24gKHVzZWZ1bCBmb3IgQ0dJcyB3cml0dGVuIGFzIHNoZWxsIHNjcmlwdHMpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSFRUUEQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhbGxvd3MgaHRtbCBlbmNvZGluZyBvZiBhcmJpdHJhcnkgc3RyaW5ncyBmb3IgZGlzcGxheQorCSAgYnkgdGhlIGJyb3dzZXIuIE91dHB1dCBnb2VzIHRvIHN0ZG91dC4KKwkgIEZvciBleGFtcGxlLCBodHRwZCAtZSAiPEhlbGxvIFdvcmxkPiIgcHJvZHVjZXMKKwkgICImIzYwSGVsbG8mIzMyV29ybGQmIzYyIi4KKworY29uZmlnIEZFQVRVUkVfSFRUUERfRVJST1JfUEFHRVMKKwlib29sICJTdXBwb3J0IGZvciBjdXN0b20gZXJyb3IgcGFnZXMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVFRQRAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gZGVmaW5lIGN1c3RvbSBlcnJvciBwYWdlcyBpbgorCSAgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IEhUVFAgc3RhdHVzCisJICBlcnJvciBwYWdlcy4gRm9yIGluc3RhbmNlLCBpZiB5b3UgYWRkIHRoZSBsaW5lOgorCSAgICAgICAgRTQwNDovcGF0aC9lNDA0Lmh0bWwKKwkgIGluIHRoZSBjb25maWcgZmlsZSwgdGhlIHNlcnZlciB3aWxsIHJlc3BvbmQgdGhlIHNwZWNpZmllZAorCSAgJy9wYXRoL2U0MDQuaHRtbCcgZmlsZSBpbnN0ZWFkIG9mIHRoZSB0ZXJzZSAnNDA0IE5PVCBGT1VORCcKKwkgIG1lc3NhZ2UuCisKK2NvbmZpZyBGRUFUVVJFX0hUVFBEX1BST1hZCisJYm9vbCAiU3VwcG9ydCBmb3IgcmV2ZXJzZSBwcm94eSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhUVFBECisJaGVscAorCSAgVGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBkZWZpbmUgVVJMcyB0aGF0IHdpbGwgYmUgZm9yd2FyZGVkCisJICB0byBhbm90aGVyIEhUVFAgc2VydmVyLiBUbyBzZXR1cCBhZGQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHRoZQorCSAgY29uZmlndXJhdGlvbiBmaWxlCisJICAgICAgICBQOi91cmwvOmh0dHA6Ly9ob3N0bmFtZVs6cG9ydF0vbmV3L3BhdGgvCisJICBUaGVuIGEgcmVxdWVzdCB0byAvdXJsL215ZmlsZSB3aWxsIGJlIGZvcndhcmRlZCB0bworCSAgaHR0cDovL2hvc3RuYW1lWzpwb3J0XS9uZXcvcGF0aC9teWZpbGUuCisKK2NvbmZpZyBGRUFUVVJFX0hUVFBEX0daSVAKKwlib29sICJTdXBwb3J0IGZvciBHWklQIGNvbnRlbnQgZW5jb2RpbmciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVFRQRAorCWhlbHAKKwkgIE1ha2VzIGh0dHBkIHNlbmQgZmlsZXMgdXNpbmcgR1pJUCBjb250ZW50IGVuY29kaW5nIGlmIHRoZQorCSAgY2xpZW50IHN1cHBvcnRzIGl0IGFuZCBhIHByZS1jb21wcmVzc2VkIDxmaWxlPi5neiBleGlzdHMuCisKK2NvbmZpZyBJRkNPTkZJRworCWJvb2wgImlmY29uZmlnIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIElmY29uZmlnIGlzIHVzZWQgdG8gY29uZmlndXJlIHRoZSBrZXJuZWwtcmVzaWRlbnQgbmV0d29yayBpbnRlcmZhY2VzLgorCitjb25maWcgRkVBVFVSRV9JRkNPTkZJR19TVEFUVVMKKwlib29sICJFbmFibGUgc3RhdHVzIHJlcG9ydGluZyBvdXRwdXQgKCs3aykiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJRkNPTkZJRworCWhlbHAKKwkgIElmIGlmY29uZmlnIGlzIGNhbGxlZCB3aXRoIG5vIGFyZ3VtZW50cyBpdCB3aWxsIGRpc3BsYXkgdGhlIHN0YXR1cworCSAgb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgaW50ZXJmYWNlcy4KKworY29uZmlnIEZFQVRVUkVfSUZDT05GSUdfU0xJUAorCWJvb2wgIkVuYWJsZSBzbGlwLXNwZWNpZmljIG9wdGlvbnMgXCJrZWVwYWxpdmVcIiBhbmQgXCJvdXRmaWxsXCIiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJRkNPTkZJRworCWhlbHAKKwkgIEFsbG93ICJrZWVwYWxpdmUiIGFuZCAib3V0ZmlsbCIgc3VwcG9ydCBmb3IgU0xJUC4gSWYgeW91J3JlIG5vdAorCSAgcGxhbm5pbmcgb24gdXNpbmcgc2VyaWFsIGxpbmVzLCBsZWF2ZSB0aGlzIHVuY2hlY2tlZC4KKworY29uZmlnIEZFQVRVUkVfSUZDT05GSUdfTUVNU1RBUlRfSU9BRERSX0lSUQorCWJvb2wgIkVuYWJsZSBvcHRpb25zIFwibWVtX3N0YXJ0XCIsIFwiaW9fYWRkclwiLCBhbmQgXCJpcnFcIiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElGQ09ORklHCisJaGVscAorCSAgQWxsb3cgdGhlIHN0YXJ0IGFkZHJlc3MgZm9yIHNoYXJlZCBtZW1vcnksIHN0YXJ0IGFkZHJlc3MgZm9yIEkvTywKKwkgIGFuZC9vciB0aGUgaW50ZXJydXB0IGxpbmUgdXNlZCBieSB0aGUgc3BlY2lmaWVkIGRldmljZS4KKworY29uZmlnIEZFQVRVUkVfSUZDT05GSUdfSFcKKwlib29sICJFbmFibGUgb3B0aW9uIFwiaHdcIiAoZXRoZXIgb25seSkiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJRkNPTkZJRworCWhlbHAKKwkgIFNldCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBvZiB0aGlzIGludGVyZmFjZSwgaWYgdGhlIGRldmljZSBkcml2ZXIKKwkgIHN1cHBvcnRzICB0aGlzICBvcGVyYXRpb24uIEN1cnJlbnRseSwgd2Ugb25seSBzdXBwb3J0IHRoZSAnZXRoZXInCisJICBjbGFzcy4KKworY29uZmlnIEZFQVRVUkVfSUZDT05GSUdfQlJPQURDQVNUX1BMVVMKKwlib29sICJTZXQgdGhlIGJyb2FkY2FzdCBhdXRvbWF0aWNhbGx5IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSUZDT05GSUcKKwloZWxwCisJICBTZXR0aW5nIHRoaXMgd2lsbCBtYWtlIGlmY29uZmlnIGF0dGVtcHQgdG8gZmluZCB0aGUgYnJvYWRjYXN0CisJICBhdXRvbWF0aWNhbGx5IGlmIHRoZSB2YWx1ZSAnKycgaXMgdXNlZC4KKworY29uZmlnIElGRU5TTEFWRQorCWJvb2wgImlmZW5zbGF2ZSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBVc2Vyc3BhY2UgYXBwbGljYXRpb24gdG8gYmluZCBzZXZlcmFsIGludGVyZmFjZXMKKwkgIHRvIGEgbG9naWNhbCBpbnRlcmZhY2UgKHVzZSB3aXRoIGtlcm5lbCBib25kaW5nIGRyaXZlcikuCisKK2NvbmZpZyBJRlBMVUdECisJYm9vbCAiaWZwbHVnZCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBOZXR3b3JrIGludGVyZmFjZSBwbHVnIGRldGVjdGlvbiBkYWVtb24uCisKK2NvbmZpZyBJRlVQRE9XTgorCWJvb2wgImlmdXBkb3duIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIEFjdGl2YXRlIG9yIGRlYWN0aXZhdGUgdGhlIHNwZWNpZmllZCBpbnRlcmZhY2VzLiBUaGlzIGFwcGxldCBtYWtlcworCSAgdXNlIG9mIGVpdGhlciAiaWZjb25maWciIGFuZCAicm91dGUiIG9yIHRoZSAiaXAiIGNvbW1hbmQgdG8gYWN0dWFsbHkKKwkgIGNvbmZpZ3VyZSBuZXR3b3JrIGludGVyZmFjZXMuIFRoZXJlZm9yZSwgeW91IHdpbGwgcHJvYmFibHkgYWxzbyB3YW50CisJICB0byBlbmFibGUgZWl0aGVyIElGQ09ORklHIGFuZCBST1VURSwgb3IgZW5hYmxlCisJICBGRUFUVVJFX0lGVVBET1dOX0lQIGFuZCB0aGUgdmFyaW91cyBJUCBvcHRpb25zLiBPZgorCSAgY291cnNlIHlvdSBjb3VsZCB1c2Ugbm9uLWJ1c3lib3ggdmVyc2lvbnMgb2YgdGhlc2UgcHJvZ3JhbXMsIHNvCisJICBhZ2FpbnN0IG15IGJldHRlciBqdWRnZW1lbnQgKHNpbmNlIHRoaXMgd2lsbCBzdXJlbHkgcmVzdWx0IGluIHBsZW50eQorCSAgb2Ygc3VwcG9ydCBxdWVzdGlvbnMgb24gdGhlIG1haWxpbmcgbGlzdCksIEkgZG8gbm90IGZvcmNlIHlvdSB0bworCSAgZW5hYmxlIHRoZXNlIGFkZGl0aW9uYWwgb3B0aW9ucy4gSXQgaXMgdXAgdG8geW91IHRvIHN1cHBseSBlaXRoZXIKKwkgICJpZmNvbmZpZyIsICJyb3V0ZSIgYW5kICJydW4tcGFydHMiIG9yIHRoZSAiaXAiIGNvbW1hbmQsIGVpdGhlcgorCSAgdmlhIGJ1c3lib3ggb3IgdmlhIHN0YW5kYWxvbmUgdXRpbGl0aWVzLgorCitjb25maWcgSUZVUERPV05fSUZTVEFURV9QQVRICisJc3RyaW5nICJBYnNvbHV0ZSBwYXRoIHRvIGlmc3RhdGUgZmlsZSIKKwlkZWZhdWx0ICIvdmFyL3J1bi9pZnN0YXRlIgorCWRlcGVuZHMgb24gSUZVUERPV04KKwloZWxwCisJICBpZnVwZG93biBrZWVwcyBzdGF0ZSBpbmZvcm1hdGlvbiBpbiBhIGZpbGUgY2FsbGVkIGlmc3RhdGUuCisJICBUeXBpY2FsbHkgaXQgaXMgbG9jYXRlZCBpbiAvdmFyL3J1bi9pZnN0YXRlLCBob3dldmVyCisJICBzb21lIGRpc3RyaWJ1dGlvbnMgdGVuZCB0byBwdXQgaXQgaW4gb3RoZXIgcGxhY2VzCisJICAoZGViaWFuLCBmb3IgZXhhbXBsZSwgdXNlcyAvZXRjL25ldHdvcmsvcnVuL2lmc3RhdGUpLgorCSAgVGhpcyBjb25maWcgb3B0aW9uIGRlZmluZXMgbG9jYXRpb24gb2YgaWZzdGF0ZS4KKworY29uZmlnIEZFQVRVUkVfSUZVUERPV05fSVAKKwlib29sICJVc2UgaXAgYXBwbGV0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSUZVUERPV04KKwloZWxwCisJICBVc2UgdGhlIGlwcm91dGUgImlwIiBjb21tYW5kIHRvIGltcGxlbWVudCAiaWZ1cCIgYW5kICJpZmRvd24iLCByYXRoZXIKKwkgIHRoYW4gdGhlIGRlZmF1bHQgb2YgdXNpbmcgdGhlIG9sZGVyICdpZmNvbmZpZycgYW5kICdyb3V0ZScgdXRpbGl0aWVzLgorCitjb25maWcgRkVBVFVSRV9JRlVQRE9XTl9JUF9CVUlMVElOCisJYm9vbCAiVXNlIGJ1c3lib3ggaXAgYXBwbGV0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9JRlVQRE9XTl9JUAorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCXNlbGVjdCBJUAorCXNlbGVjdCBGRUFUVVJFX0lQX0FERFJFU1MKKwlzZWxlY3QgRkVBVFVSRV9JUF9MSU5LCisJc2VsZWN0IEZFQVRVUkVfSVBfUk9VVEUKKwloZWxwCisJICBVc2UgdGhlIGJ1c3lib3ggaXByb3V0ZSAiaXAiIGFwcGxldCB0byBpbXBsZW1lbnQgImlmdXBkb3duIi4KKworCSAgSWYgbGVmdCBkaXNhYmxlZCwgeW91IG11c3QgaW5zdGFsbCB0aGUgZnVsbC1ibG93biBpcHJvdXRlMgorCSAgdXRpbGl0eSBvciB0aGUgICJpZnVwIiBhbmQgImlmZG93biIgYXBwbGV0cyB3aWxsIG5vdCB3b3JrLgorCitjb25maWcgRkVBVFVSRV9JRlVQRE9XTl9JRkNPTkZJR19CVUlMVElOCisJYm9vbCAiVXNlIGJ1c3lib3ggaWZjb25maWcgYW5kIHJvdXRlIGFwcGxldHMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBJRlVQRE9XTiAmJiAhRkVBVFVSRV9JRlVQRE9XTl9JUAorCXNlbGVjdCBJRkNPTkZJRworCXNlbGVjdCBST1VURQorCWhlbHAKKwkgIFVzZSB0aGUgYnVzeWJveCBpcHJvdXRlICJpZmNvbmZpZyIgYW5kICJyb3V0ZSIgYXBwbGV0cyB0bworCSAgaW1wbGVtZW50IHRoZSAiaWZ1cCIgYW5kICJpZmRvd24iIHV0aWxpdGllcy4KKworCSAgSWYgbGVmdCBkaXNhYmxlZCwgeW91IG11c3QgaW5zdGFsbCB0aGUgZnVsbC1ibG93biBpZmNvbmZpZworCSAgYW5kIHJvdXRlIHV0aWxpdGllcywgb3IgdGhlICAiaWZ1cCIgYW5kICJpZmRvd24iIGFwcGxldHMgd2lsbCBub3QKKwkgIHdvcmsuCisKK2NvbmZpZyBGRUFUVVJFX0lGVVBET1dOX0lQVjQKKwlib29sICJTdXBwb3J0IGZvciBJUHY0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSUZVUERPV04KKwloZWxwCisJICBJZiB5b3Ugd2FudCBpZnVwL2lmZG93biB0byB0YWxrIElQdjQsIGxlYXZlIHRoaXMgb24uCisKK2NvbmZpZyBGRUFUVVJFX0lGVVBET1dOX0lQVjYKKwlib29sICJTdXBwb3J0IGZvciBJUHY2IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSUZVUERPV04gJiYgRkVBVFVSRV9JUFY2CisJaGVscAorCSAgSWYgeW91IG5lZWQgc3VwcG9ydCBmb3IgSVB2NiwgdHVybiB0aGlzIG9wdGlvbiBvbi4KKworIyMjIFVOVVNFRAorIyMjY29uZmlnIEZFQVRVUkVfSUZVUERPV05fSVBYCisjIyMJYm9vbCAiU3VwcG9ydCBmb3IgSVBYIgorIyMjCWRlZmF1bHQgeQorIyMjCWRlcGVuZHMgb24gSUZVUERPV04KKyMjIwloZWxwCisjIyMJICBJZiB0aGlzIG9wdGlvbiBpcyBzZWxlY3RlZCB5b3UgY2FuIHVzZSBidXN5Ym94IHRvIHdvcmsgd2l0aCBJUFgKKyMjIwkgIG5ldHdvcmtzLgorCitjb25maWcgRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HCisJYm9vbCAiRW5hYmxlIG1hcHBpbmcgc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElGVVBET1dOCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSAibWFwcGluZyIgc3RhbnphLCB1bmxlc3MgeW91IGhhdmUKKwkgIGEgd2VpcmQgbmV0d29yayBzZXR1cCB5b3UgZG9uJ3QgbmVlZCBpdC4KKworY29uZmlnIEZFQVRVUkVfSUZVUERPV05fRVhURVJOQUxfREhDUAorCWJvb2wgIlN1cHBvcnQgZm9yIGV4dGVybmFsIGRoY3AgY2xpZW50cyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIElGVVBET1dOCisJaGVscAorCSAgVGhpcyBlbmFibGVzIHN1cHBvcnQgZm9yIHRoZSBleHRlcm5hbCBkaGNwIGNsaWVudHMuIENsaWVudHMgYXJlCisJICB0cmllZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOiBkaGNwY2QsIGRoY2xpZW50LCBwdW1wIGFuZCB1ZGhjcGMuCisJICBPdGhlcndpc2UsIGlmIHVkaGNwYyBhcHBsZXQgaXMgZW5hYmxlZCwgaXQgaXMgdXNlZC4KKwkgIE90aGVyd2lzZSwgaWZ1cC9pZmRvd24gd2lsbCBoYXZlIG5vIHN1cHBvcnQgZm9yIERIQ1AuCisKK2NvbmZpZyBJTkVURAorCWJvb2wgImluZXRkIgorCWRlZmF1bHQgeQorCXNlbGVjdCBGRUFUVVJFX1NZU0xPRworCWhlbHAKKwkgIEludGVybmV0IHN1cGVyc2VydmVyIGRhZW1vbgorCitjb25maWcgRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRUNITworCWJvb2wgIlN1cHBvcnQgZWNobyBzZXJ2aWNlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSU5FVEQKKwloZWxwCisJICBFY2hvIHJlY2VpdmVkIGRhdGEgaW50ZXJuYWwgaW5ldGQgc2VydmljZQorCitjb25maWcgRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRElTQ0FSRAorCWJvb2wgIlN1cHBvcnQgZGlzY2FyZCBzZXJ2aWNlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSU5FVEQKKwloZWxwCisJICBJbnRlcm5ldCAvZGV2L251bGwgaW50ZXJuYWwgaW5ldGQgc2VydmljZQorCitjb25maWcgRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fVElNRQorCWJvb2wgIlN1cHBvcnQgdGltZSBzZXJ2aWNlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSU5FVEQKKwloZWxwCisJICBSZXR1cm4gMzIgYml0IHRpbWUgc2luY2UgMTkwMCBpbnRlcm5hbCBpbmV0ZCBzZXJ2aWNlCisKK2NvbmZpZyBGRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9EQVlUSU1FCisJYm9vbCAiU3VwcG9ydCBkYXl0aW1lIHNlcnZpY2UiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJTkVURAorCWhlbHAKKwkgIFJldHVybiBodW1hbi1yZWFkYWJsZSB0aW1lIGludGVybmFsIGluZXRkIHNlcnZpY2UKKworY29uZmlnIEZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0NIQVJHRU4KKwlib29sICJTdXBwb3J0IGNoYXJnZW4gc2VydmljZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElORVRECisJaGVscAorCSAgRmFtaWxpYXIgY2hhcmFjdGVyIGdlbmVyYXRvciBpbnRlcm5hbCBpbmV0ZCBzZXJ2aWNlCisKK2NvbmZpZyBGRUFUVVJFX0lORVREX1JQQworCWJvb2wgIlN1cHBvcnQgUlBDIHNlcnZpY2VzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSU5FVEQKKwlzZWxlY3QgRkVBVFVSRV9IQVZFX1JQQworCWhlbHAKKwkgIFN1cHBvcnQgU3VuLVJQQyBiYXNlZCBzZXJ2aWNlcworCitjb25maWcgSVAKKwlib29sICJpcCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGUgImlwIiBhcHBsZXQgaXMgYSBUQ1AvSVAgaW50ZXJmYWNlIGNvbmZpZ3VyYXRpb24gYW5kIHJvdXRpbmcKKwkgIHV0aWxpdHkuIFlvdSBnZW5lcmFsbHkgZG9uJ3QgbmVlZCAiaXAiIHRvIHVzZSBidXN5Ym94IHdpdGgKKwkgIFRDUC9JUC4KKworY29uZmlnIEZFQVRVUkVfSVBfQUREUkVTUworCWJvb2wgImlwIGFkZHJlc3MiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJUAorCWhlbHAKKwkgIEFkZHJlc3MgbWFuaXB1bGF0aW9uIHN1cHBvcnQgZm9yIHRoZSAiaXAiIGFwcGxldC4KKworY29uZmlnIEZFQVRVUkVfSVBfTElOSworCWJvb2wgImlwIGxpbmsiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJUAorCWhlbHAKKwkgIENvbmZpZ3VyZSBuZXR3b3JrIGRldmljZXMgd2l0aCAiaXAiLgorCitjb25maWcgRkVBVFVSRV9JUF9ST1VURQorCWJvb2wgImlwIHJvdXRlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSVAKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3Igcm91dGluZyB0YWJsZSBtYW5hZ2VtZW50IHRvICJpcCIuCisKK2NvbmZpZyBGRUFUVVJFX0lQX1JPVVRFX0RJUgorCXN0cmluZyAiaXAgcm91dGUgY29uZmlndXJhdGlvbiBkaXJlY3RvcnkiCisJZGVmYXVsdCAiL2V0Yy9pcHJvdXRlMiIKKwlkZXBlbmRzIG9uIEZFQVRVUkVfSVBfUk9VVEUKKwloZWxwCisJICBMb2NhdGlvbiBvZiB0aGUgImlwIiBhcHBsZXQgcm91dGluZyBjb25maWd1cmF0aW9uLgorCitjb25maWcgRkVBVFVSRV9JUF9UVU5ORUwKKwlib29sICJpcCB0dW5uZWwiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJUAorCWhlbHAKKwkgIEFkZCBzdXBwb3J0IGZvciB0dW5uZWxpbmcgY29tbWFuZHMgdG8gImlwIi4KKworY29uZmlnIEZFQVRVUkVfSVBfUlVMRQorCWJvb2wgImlwIHJ1bGUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBJUAorCWhlbHAKKwkgIEFkZCBzdXBwb3J0IGZvciBydWxlIGNvbW1hbmRzIHRvICJpcCIuCisKK2NvbmZpZyBGRUFUVVJFX0lQX1NIT1JUX0ZPUk1TCisJYm9vbCAiU3VwcG9ydCBzaG9ydCBmb3JtcyBvZiBpcCBjb21tYW5kcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIElQCisJaGVscAorCSAgQWxzbyBzdXBwb3J0IHNob3J0LWZvcm0gb2YgaXAgPE9CSkVDVD4gY29tbWFuZHM6CisJICBpcCBhZGRyICAgLT4gaXBhZGRyCisJICBpcCBsaW5rICAgLT4gaXBsaW5rCisJICBpcCByb3V0ZSAgLT4gaXByb3V0ZQorCSAgaXAgdHVubmVsIC0+IGlwdHVubmVsCisJICBpcCBydWxlICAgLT4gaXBydWxlCisKKwkgIFNheSBOIHVubGVzcyB5b3UgZGVzcGFyYXRlbHkgbmVlZCB0aGUgc2hvcnQgZm9ybSBvZiB0aGUgaXAKKwkgIG9iamVjdCBjb21tYW5kcy4KKworY29uZmlnIEZFQVRVUkVfSVBfUkFSRV9QUk9UT0NPTFMKKwlib29sICJTdXBwb3J0IGRpc3BsYXlpbmcgcmFyZWx5IHVzZWQgbGluayB0eXBlcyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIElQCisJaGVscAorCSAgSWYgeW91IGFyZSBub3QgZ29pbmcgdG8gdXNlIGxpbmtzIG9mIHR5cGUgImZyYWQiLCAiZWNvbmV0IiwKKwkgICJiaWYiIGV0YywgeW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gZW5hYmxlIHRoaXMuCisJICBFdGhlcm5ldCwgd2lyZWxlc3MsIGluZnJhcmVkLCBwcHAvc2xpcCwgaXAgdHVubmVsbGluZworCSAgbGluayB0eXBlcyBhcmUgc3VwcG9ydGVkIHdpdGhvdXQgdGhpcyBvcHRpb24gc2VsZWN0ZWQuCisKK2NvbmZpZyBJUEFERFIKKwlib29sCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0lQX1NIT1JUX0ZPUk1TICYmIEZFQVRVUkVfSVBfQUREUkVTUworCitjb25maWcgSVBMSU5LCisJYm9vbAorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9JUF9TSE9SVF9GT1JNUyAmJiBGRUFUVVJFX0lQX0xJTksKKworY29uZmlnIElQUk9VVEUKKwlib29sCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRUFUVVJFX0lQX1NIT1JUX0ZPUk1TICYmIEZFQVRVUkVfSVBfUk9VVEUKKworY29uZmlnIElQVFVOTkVMCisJYm9vbAorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9JUF9TSE9SVF9GT1JNUyAmJiBGRUFUVVJFX0lQX1RVTk5FTAorCitjb25maWcgSVBSVUxFCisJYm9vbAorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9JUF9TSE9SVF9GT1JNUyAmJiBGRUFUVVJFX0lQX1JVTEUKKworY29uZmlnIElQQ0FMQworCWJvb2wgImlwY2FsYyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBpcGNhbGMgdGFrZXMgYW4gSVAgYWRkcmVzcyBhbmQgbmV0bWFzayBhbmQgY2FsY3VsYXRlcyB0aGUKKwkgIHJlc3VsdGluZyBicm9hZGNhc3QsIG5ldHdvcmssIGFuZCBob3N0IHJhbmdlLgorCitjb25maWcgRkVBVFVSRV9JUENBTENfRkFOQ1kKKwlib29sICJGYW5jeSBJUENBTEMsIG1vcmUgb3B0aW9ucywgYWRkcyAxIGtieXRlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSVBDQUxDCisJaGVscAorCSAgQWRkcyB0aGUgb3B0aW9ucyBob3N0bmFtZSwgcHJlZml4IGFuZCBzaWxlbnQgdG8gdGhlIG91dHB1dCBvZgorCSAgImlwY2FsYyIuCisKK2NvbmZpZyBGRUFUVVJFX0lQQ0FMQ19MT05HX09QVElPTlMKKwlib29sICJFbmFibGUgbG9uZyBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSVBDQUxDICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgaXBjYWxjIGFwcGxldC4KKworY29uZmlnIE5FVFNUQVQKKwlib29sICJuZXRzdGF0IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIG5ldHN0YXQgcHJpbnRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBMaW51eCBuZXR3b3JraW5nIHN1YnN5c3RlbS4KKworY29uZmlnIEZFQVRVUkVfTkVUU1RBVF9XSURFCisJYm9vbCAiRW5hYmxlIHdpZGUgbmV0c3RhdCBvdXRwdXQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBORVRTVEFUCisJaGVscAorCSAgQWRkIHN1cHBvcnQgZm9yIHdpZGUgY29sdW1ucy4gVXNlZnVsIHdoZW4gZGlzcGxheWluZyBJUHY2IGFkZHJlc3NlcworCSAgKC1XIG9wdGlvbikuCisKK2NvbmZpZyBGRUFUVVJFX05FVFNUQVRfUFJHCisJYm9vbCAiRW5hYmxlIFBJRC9Qcm9ncmFtIG5hbWUgb3V0cHV0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTkVUU1RBVAorCWhlbHAKKwkgIEFkZCBzdXBwb3J0IGZvciAtcCBmbGFnIHRvIHByaW50IG91dCBQSUQgYW5kIHByb2dyYW0gbmFtZS4KKwkgICs3MDAgYnl0ZXMgb2YgY29kZS4KKworY29uZmlnIE5TTE9PS1VQCisJYm9vbCAibnNsb29rdXAiCisJZGVmYXVsdCB5CisJaGVscAorCSAgbnNsb29rdXAgaXMgYSB0b29sIHRvIHF1ZXJ5IEludGVybmV0IG5hbWUgc2VydmVycy4KKworY29uZmlnIE5UUEQKKwlib29sICJudHBkIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoZSBOVFAgY2xpZW50L3NlcnZlciBkYWVtb24uCisKK2NvbmZpZyBGRUFUVVJFX05UUERfU0VSVkVSCisJYm9vbCAiTWFrZSBudHBkIHVzYWJsZSBhcyBhIE5UUCBzZXJ2ZXIiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBOVFBECisJaGVscAorCSAgTWFrZSBudHBkIHVzYWJsZSBhcyBhIE5UUCBzZXJ2ZXIuIElmIHlvdSBkaXNhYmxlIHRoaXMgb3B0aW9uCisJICBudHBkIHdpbGwgYmUgdXNhYmxlIG9ubHkgYXMgYSBOVFAgY2xpZW50LgorCitjb25maWcgRkVBVFVSRV9OVFBEX0NPTkYKKwlib29sICJNYWtlIG50cGQgdW5kZXJzdGFuZCAvZXRjL250cC5jb25mIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTlRQRAorCWhlbHAKKwkgIE1ha2UgbnRwZCBsb29rIGluIC9ldGMvbnRwLmNvbmYgZm9yIHBlZXJzLiBPbmx5ICJzZXJ2ZXIgYWRkcmVzcyIKKwkgIGlzIHN1cHBvcnRlZC4KKworY29uZmlnIFBTQ0FOCisJYm9vbCAicHNjYW4iCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2ltcGxlIG5ldHdvcmsgcG9ydCBzY2FubmVyLgorCitjb25maWcgUk9VVEUKKwlib29sICJyb3V0ZSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBSb3V0ZSBkaXNwbGF5cyBvciBtYW5pcHVsYXRlcyB0aGUga2VybmVsJ3MgSVAgcm91dGluZyB0YWJsZXMuCisKK2NvbmZpZyBTTEFUVEFDSAorCWJvb2wgInNsYXR0YWNoIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIHNsYXR0YWNoIGlzIGEgc21hbGwgdXRpbGl0eSB0byBhdHRhY2ggbmV0d29yayBpbnRlcmZhY2VzIHRvIHNlcmlhbAorCSAgbGluZXMuCisKKyNjb25maWcgVEMKKyMJYm9vbCAidGMiCisjCWRlZmF1bHQgeQorIwloZWxwCisjCSAgc2hvdyAvIG1hbmlwdWxhdGUgdHJhZmZpYyBjb250cm9sIHNldHRpbmdzCisjCisjY29uZmlnIEZFQVRVUkVfVENfSU5HUkVTUworIwlkZWZfYm9vbCBuCisjCWRlcGVuZHMgb24gVEMKKworY29uZmlnIFRDUFNWRAorCWJvb2wgInRjcHN2ZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICB0Y3BzdmQgbGlzdGVucyBvbiBhIFRDUCBwb3J0IGFuZCBydW5zIGEgcHJvZ3JhbSBmb3IgZWFjaCBuZXcKKwkgIGNvbm5lY3Rpb24uCisKK2NvbmZpZyBURUxORVQKKwlib29sICJ0ZWxuZXQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGVsbmV0IGlzIGFuIGludGVyZmFjZSB0byB0aGUgVEVMTkVUIHByb3RvY29sLCBidXQgaXMgYWxzbyBjb21tb25seQorCSAgdXNlZCB0byB0ZXN0IG90aGVyIHNpbXBsZSBwcm90b2NvbHMuCisKK2NvbmZpZyBGRUFUVVJFX1RFTE5FVF9UVFlQRQorCWJvb2wgIlBhc3MgVEVSTSB0eXBlIHRvIHJlbW90ZSBob3N0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEVMTkVUCisJaGVscAorCSAgU2V0dGluZyB0aGlzIG9wdGlvbiB3aWxsIGZvcndhcmQgdGhlIFRFUk0gZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlCisJICByZW1vdGUgaG9zdCB5b3UgYXJlIGNvbm5lY3RpbmcgdG8uIFRoaXMgaXMgdXNlZnVsIHRvIG1ha2Ugc3VyZSB0aGF0CisJICB0aGluZ3MgbGlrZSBBTlNJIGNvbG9ycyBhbmQgb3RoZXIgY29udHJvbCBzZXF1ZW5jZXMgYmVoYXZlLgorCitjb25maWcgRkVBVFVSRV9URUxORVRfQVVUT0xPR0lOCisJYm9vbCAiUGFzcyBVU0VSIHR5cGUgdG8gcmVtb3RlIGhvc3QiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBURUxORVQKKwloZWxwCisJICBTZXR0aW5nIHRoaXMgb3B0aW9uIHdpbGwgZm9yd2FyZCB0aGUgVVNFUiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0aGUKKwkgIHJlbW90ZSBob3N0IHlvdSBhcmUgY29ubmVjdGluZyB0by4gVGhpcyBpcyB1c2VmdWwgd2hlbiB5b3UgbmVlZCB0bworCSAgbG9nIGludG8gYSBtYWNoaW5lIHdpdGhvdXQgdGVsbGluZyB0aGUgdXNlcm5hbWUgKGF1dG9sb2dpbikuIFRoaXMKKwkgIG9wdGlvbiBlbmFibGVzIGAtYScgYW5kIGAtbCBVU0VSJyBhcmd1bWVudHMuCisKK2NvbmZpZyBURUxORVRECisJYm9vbCAidGVsbmV0ZCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgRkVBVFVSRV9TWVNMT0cKKwloZWxwCisJICBBIGRhZW1vbiBmb3IgdGhlIFRFTE5FVCBwcm90b2NvbCwgYWxsb3dpbmcgeW91IHRvIGxvZyBvbnRvIHRoZSBob3N0CisJICBydW5uaW5nIHRoZSBkYWVtb24uIFBsZWFzZSBrZWVwIGluIG1pbmQgdGhhdCB0aGUgVEVMTkVUIHByb3RvY29sCisJICBzZW5kcyBwYXNzd29yZHMgaW4gcGxhaW4gdGV4dC4gSWYgeW91IGNhbid0IGFmZm9yZCB0aGUgc3BhY2UgZm9yIGFuCisJICBTU0ggZGFlbW9uIGFuZCB5b3UgdHJ1c3QgeW91ciBuZXR3b3JrLCB5b3UgbWF5IHNheSAneScgaGVyZS4gQXMgYQorCSAgbW9yZSBzZWN1cmUgYWx0ZXJuYXRpdmUsIHlvdSBzaG91bGQgc2VyaW91c2x5IGNvbnNpZGVyIGluc3RhbGxpbmcgdGhlCisJICB2ZXJ5IHNtYWxsIERyb3BiZWFyIFNTSCBkYWVtb24gaW5zdGVhZDoKKwkJaHR0cDovL21hdHQudWNjLmFzbi5hdS9kcm9wYmVhci9kcm9wYmVhci5odG1sCisKKwkgIE5vdGUgdGhhdCBmb3IgYnVzeWJveCB0ZWxuZXRkIHRvIHdvcmsgeW91IG5lZWQgc2V2ZXJhbCB0aGluZ3M6CisJICBGaXJzdCBvZiBhbGwsIHlvdXIga2VybmVsIG5lZWRzOgorCQkgIENPTkZJR19VTklYOThfUFRZUz15CisKKwkgIE5leHQsIHlvdSBuZWVkIGEgL2Rldi9wdHMgZGlyZWN0b3J5IG9uIHlvdXIgcm9vdCBmaWxlc3lzdGVtOgorCisJCSAgJCBscyAtbGQgL2Rldi9wdHMKKwkJICBkcnd4ci14ci14ICAyIHJvb3Qgcm9vdCAwIFNlcCAyMyAxMzoyMSAvZGV2L3B0cy8KKworCSAgTmV4dCB5b3UgbmVlZCB0aGUgcHNldWRvIHRlcm1pbmFsIG1hc3RlciBtdWx0aXBsZXhlciAvZGV2L3B0bXg6CisKKwkJICAkIGxzIC1sYSAvZGV2L3B0bXgKKwkJICBjcnctcnctcnctICAxIHJvb3QgdHR5IDUsIDIgU2VwIDIzIDEzOjU1IC9kZXYvcHRteAorCisJICBBbnkgL2Rldi90dHlwWzAtOV0qIGZpbGVzIHlvdSBtYXkgaGF2ZSBjYW4gYmUgcmVtb3ZlZC4KKwkgIE5leHQsIHlvdSBuZWVkIHRvIG1vdW50IHRoZSBkZXZwdHMgZmlsZXN5c3RlbSBvbiAvZGV2L3B0cyB1c2luZzoKKworCQkgIG1vdW50IC10IGRldnB0cyBkZXZwdHMgL2Rldi9wdHMKKworCSAgWW91IG5lZWQgdG8gYmUgc3VyZSB0aGF0IGJ1c3lib3ggaGFzIExPR0lOIGFuZAorCSAgRkVBVFVSRV9TVUlEIGVuYWJsZWQuIEFuZCBmaW5hbGx5LCB5b3Ugc2hvdWxkIG1ha2UKKwkgIGNlcnRhaW4gdGhhdCBCdXN5Ym94IGhhcyBiZWVuIGluc3RhbGxlZCBzZXR1aWQgcm9vdDoKKworCQljaG93biByb290LnJvb3QgL2Jpbi9idXN5Ym94CisJCWNobW9kIDQ3NTUgL2Jpbi9idXN5Ym94CisKKwkgIHdpdGggYWxsIHRoYXQgZG9uZSwgdGVsbmV0ZCBfc2hvdWxkXyB3b3JrLi4uLgorCisKK2NvbmZpZyBGRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORQorCWJvb2wgIlN1cHBvcnQgc3RhbmRhbG9uZSB0ZWxuZXRkIChub3QgaW5ldGQgb25seSkiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBURUxORVRECisJaGVscAorCSAgU2VsZWN0aW5nIHRoaXMgd2lsbCBtYWtlIHRlbG5ldGQgYWJsZSB0byBydW4gc3RhbmRhbG9uZS4KKworY29uZmlnIEZFQVRVUkVfVEVMTkVURF9JTkVURF9XQUlUCisJYm9vbCAiU3VwcG9ydCAtdyBTRUMgb3B0aW9uIChpbmV0ZCB3YWl0IG1vZGUpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIHJ1biB0ZWxuZXRkIGluICJpbmV0IHdhaXQiIG1vZGUuCisJICBFeGFtcGxlIGluZXRkLmNvbmYgbGluZSAobm90ZSAid2FpdCIsIG5vdCB1c3VhbCAibm93YWl0Iik6CisKKwkgIHRlbG5ldCBzdHJlYW0gdGNwIHdhaXQgcm9vdCAvYmluL3RlbG5ldGQgdGVsbmV0ZCAtdzEwCisKKwkgIEluIHRoaXMgZXhhbXBsZSwgaW5ldGQgcGFzc2VzIF9saXN0ZW5pbmdfIHNvY2tldF8gYXMgZmQgMAorCSAgdG8gdGVsbmV0ZCB3aGVuIGNvbm5lY3Rpb24gYXBwZWFycy4KKwkgIHRlbG5ldGQgd2lsbCB3YWl0IGZvciBjb25uZWN0aW9ucyB1bnRpbCBhbGwgZXhpc3RpbmcKKwkgIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWQsIGFuZCBubyBuZXcgY29ubmVjdGlvbnMKKwkgIGFwcGVhciBkdXJpbmcgMTAgc2Vjb25kcy4gVGhlbiBpdCBleGl0cywgYW5kIGluZXRkIGNvbnRpbnVlcworCSAgdG8gbGlzdGVuIGZvciBuZXcgY29ubmVjdGlvbnMuCisKKwkgIFRoaXMgb3B0aW9uIGlzIHJhcmVseSB1c2VkLiAidGNwIG5vd2FpdCIgaXMgbXVjaCBtb3JlIHVzdWFsCisJICB3YXkgb2YgcnVubmluZyB0Y3Agc2VydmljZXMsIGluY2x1ZGluZyB0ZWxuZXRkLgorCSAgWW91IG1vc3QgcHJvYmFibHkgd2FudCB0byBzYXkgTiBoZXJlLgorCitjb25maWcgVEZUUAorCWJvb2wgInRmdHAiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBlbmFibGVzIHRoZSBUcml2aWFsIEZpbGUgVHJhbnNmZXIgUHJvdG9jb2wgY2xpZW50IHByb2dyYW0uIFRGVFAKKwkgIGlzIHVzdWFsbHkgdXNlZCBmb3Igc2ltcGxlLCBzbWFsbCB0cmFuc2ZlcnMgc3VjaCBhcyBhIHJvb3QgaW1hZ2UKKwkgIGZvciBhIG5ldHdvcmstZW5hYmxlZCBib290bG9hZGVyLgorCitjb25maWcgVEZUUEQKKwlib29sICJ0ZnRwZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGlzIGVuYWJsZXMgdGhlIFRyaXZpYWwgRmlsZSBUcmFuc2ZlciBQcm90b2NvbCBzZXJ2ZXIgcHJvZ3JhbS4KKwkgIEl0IGV4cGVjdHMgdGhhdCBzdGRpbiBpcyBhIGRhdGFncmFtIHNvY2tldCBhbmQgYSBwYWNrZXQKKwkgIGlzIGFscmVhZHkgcGVuZGluZyBvbiBpdC4gSXQgd2lsbCBleGl0IGFmdGVyIG9uZSB0cmFuc2Zlci4KKwkgIEluIG90aGVyIHdvcmRzOiBpdCBzaG91bGQgYmUgcnVuIGZyb20gaW5ldGQgaW4gbm93YWl0IG1vZGUsCisJICBvciBmcm9tIHVkcHN2ZC4gRXhhbXBsZTogInVkcHN2ZCAtRSAwIDY5IHRmdHBkIERJUiIKKworY29tbWVudCAiQ29tbW9uIG9wdGlvbnMgZm9yIHRmdHAvdGZ0cGQiCisJZGVwZW5kcyBvbiBURlRQIHx8IFRGVFBECisKK2NvbmZpZyBGRUFUVVJFX1RGVFBfR0VUCisJYm9vbCAiRW5hYmxlICd0ZnRwIGdldCcgYW5kL29yIHRmdHBkIHVwbG9hZCBjb2RlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEZUUCB8fCBURlRQRAorCWhlbHAKKwkgIEFkZCBzdXBwb3J0IGZvciB0aGUgR0VUIGNvbW1hbmQgd2l0aGluIHRoZSBURlRQIGNsaWVudC4gVGhpcyBhbGxvd3MKKwkgIGEgY2xpZW50IHRvIHJldHJpZXZlIGEgZmlsZSBmcm9tIGEgVEZUUCBzZXJ2ZXIuCisJICBBbHNvIGVuYWJsZSB1cGxvYWQgc3VwcG9ydCBpbiB0ZnRwZCwgaWYgdGZ0cGQgaXMgc2VsZWN0ZWQuCisKKwkgIE5vdGU6IHRoaXMgb3B0aW9uIGRvZXMgX25vdF8gbWFrZSB0ZnRwZCBjYXBhYmxlIG9mIGRvd25sb2FkCisJICAodGhlIHVzdWFsIG9wZXJhdGlvbiBwZW9wbGUgbmVlZCBmcm9tIGl0KSEKKworY29uZmlnIEZFQVRVUkVfVEZUUF9QVVQKKwlib29sICJFbmFibGUgJ3RmdHAgcHV0JyBhbmQvb3IgdGZ0cGQgZG93bmxvYWQgY29kZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRGVFAgfHwgVEZUUEQKKwloZWxwCisJICBBZGQgc3VwcG9ydCBmb3IgdGhlIFBVVCBjb21tYW5kIHdpdGhpbiB0aGUgVEZUUCBjbGllbnQuIFRoaXMgYWxsb3dzCisJICBhIGNsaWVudCB0byB0cmFuc2ZlciBhIGZpbGUgdG8gYSBURlRQIHNlcnZlci4KKwkgIEFsc28gZW5hYmxlIGRvd25sb2FkIHN1cHBvcnQgaW4gdGZ0cGQsIGlmIHRmdHBkIGlzIHNlbGVjdGVkLgorCitjb25maWcgRkVBVFVSRV9URlRQX0JMT0NLU0laRQorCWJvb2wgIkVuYWJsZSAnYmxrc2l6ZScgYW5kICd0c2l6ZScgcHJvdG9jb2wgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRGVFAgfHwgVEZUUEQKKwloZWxwCisJICBBbGxvdyB0ZnRwIHRvIHNwZWNpZnkgYmxvY2sgc2l6ZSwgYW5kIHRmdHBkIHRvIHVuZGVyc3RhbmQKKwkgICJibGtzaXplIiBhbmQgInRzaXplIiBvcHRpb25zLgorCitjb25maWcgRkVBVFVSRV9URlRQX1BST0dSRVNTX0JBUgorCWJvb2wgIkVuYWJsZSB0ZnRwIHByb2dyZXNzIG1ldGVyIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVEZUUCAmJiBGRUFUVVJFX1RGVFBfQkxPQ0tTSVpFCisJaGVscAorCSAgU2hvdyBwcm9ncmVzcyBiYXIuCisKK2NvbmZpZyBURlRQX0RFQlVHCisJYm9vbCAiRW5hYmxlIGRlYnVnIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gVEZUUCB8fCBURlRQRAorCWhlbHAKKwkgIE1ha2UgdGZ0cFtkXSBwcmludCBkZWJ1Z2dpbmcgbWVzc2FnZXMgb24gc3RkZXJyLgorCSAgVGhpcyBpcyB1c2VmdWwgaWYgeW91IGFyZSBkaWFnbm9zaW5nIGEgYnVnIGluIHRmdHBbZF0uCisKK2NvbmZpZyBUUkFDRVJPVVRFCisJYm9vbCAidHJhY2Vyb3V0ZSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBVdGlsaXR5IHRvIHRyYWNlIHRoZSByb3V0ZSBvZiBJUCBwYWNrZXRzLgorCitjb25maWcgVFJBQ0VST1VURTYKKwlib29sICJ0cmFjZXJvdXRlNiIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfSVBWNiAmJiBUUkFDRVJPVVRFCisJaGVscAorCSAgVXRpbGl0eSB0byB0cmFjZSB0aGUgcm91dGUgb2YgSVB2NiBwYWNrZXRzLgorCitjb25maWcgRkVBVFVSRV9UUkFDRVJPVVRFX1ZFUkJPU0UKKwlib29sICJFbmFibGUgdmVyYm9zZSBvdXRwdXQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBUUkFDRVJPVVRFCisJaGVscAorCSAgQWRkIHNvbWUgdmVyYm9zaXR5IHRvIHRyYWNlcm91dGUuIFRoaXMgaW5jbHVkZXMgYW1vbmcgb3RoZXIgdGhpbmdzCisJICBob3N0bmFtZXMgYW5kIElDTVAgcmVzcG9uc2UgdHlwZXMuCisKK2NvbmZpZyBGRUFUVVJFX1RSQUNFUk9VVEVfU09VUkNFX1JPVVRFCisJYm9vbCAiRW5hYmxlIGxvb3NlIHNvdXJjZSByb3V0ZSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFRSQUNFUk9VVEUKKwloZWxwCisJICBBZGQgb3B0aW9uIHRvIHNwZWNpZnkgYSBsb29zZSBzb3VyY2Ugcm91dGUgZ2F0ZXdheQorCSAgKDggbWF4aW11bSkuCisKK2NvbmZpZyBGRUFUVVJFX1RSQUNFUk9VVEVfVVNFX0lDTVAKKwlib29sICJVc2UgSUNNUCBpbnN0ZWFkIG9mIFVEUCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFRSQUNFUk9VVEUKKwloZWxwCisJICBBZGQgb3B0aW9uIC1JIHRvIHVzZSBJQ01QIEVDSE8gaW5zdGVhZCBvZiBVRFAgZGF0YWdyYW1zLgorCitjb25maWcgVFVOQ1RMCisJYm9vbCAidHVuY3RsIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIHR1bmN0bCBjcmVhdGVzIG9yIGRlbGV0ZXMgdHVuIGRldmljZXMuCisKK2NvbmZpZyBGRUFUVVJFX1RVTkNUTF9VRworCWJvb2wgIlN1cHBvcnQgb3duZXI6Z3JvdXAgYXNzaWdubWVudCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFRVTkNUTAorCWhlbHAKKwkgIEFsbG93IHRvIHNwZWNpZnkgb3duZXIgYW5kIGdyb3VwIG9mIG5ld2x5IGNyZWF0ZWQgaW50ZXJmYWNlLgorCSAgMzQwIGJ5dGVzIG9mIHB1cmUgYmxvYXQuIFNheSBubyBoZXJlLgorCitzb3VyY2UgbmV0d29ya2luZy91ZGhjcC9Db25maWcuaW4KKworY29uZmlnIElGVVBET1dOX1VESENQQ19DTURfT1BUSU9OUworCXN0cmluZyAiaWZ1cCB1ZGhjcGMgY29tbWFuZCBsaW5lIG9wdGlvbnMiCisJZGVmYXVsdCAiLVIgLW4iCisJZGVwZW5kcyBvbiBJRlVQRE9XTiAmJiBVREhDUEMKKwloZWxwCisJICBDb21tYW5kIGxpbmUgb3B0aW9ucyB0byBwYXNzIHRvIHVkaGNwYyBmcm9tIGlmdXAuCisJICBJbnRlbmRlZCB0byBhbHRlciBvcHRpb25zIG5vdCBhdmFpbGFibGUgaW4gL2V0Yy9uZXR3b3JrL2ludGVyZmFjZXMuCisJICAoSUU6IC0tc3lzbG9nIC0tYmFja2dyb3VuZCBldGMuLi4pCisKK2NvbmZpZyBVRFBTVkQKKwlib29sICJ1ZHBzdmQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgdWRwc3ZkIGxpc3RlbnMgb24gYW4gVURQIHBvcnQgYW5kIHJ1bnMgYSBwcm9ncmFtIGZvciBlYWNoIG5ldworCSAgY29ubmVjdGlvbi4KKworY29uZmlnIFZDT05GSUcKKwlib29sICJ2Y29uZmlnIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIENyZWF0ZXMsIHJlbW92ZXMsIGFuZCBjb25maWd1cmVzIFZMQU4gaW50ZXJmYWNlcworCitjb25maWcgWkNJUAorCWJvb2wgInpjaXAiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJc2VsZWN0IEZFQVRVUkVfU1lTTE9HCisJaGVscAorCSAgWkNJUCBwcm92aWRlcyBaZXJvQ29uZiBJUHY0IGFkZHJlc3Mgc2VsZWN0aW9uLCBhY2NvcmRpbmcgdG8gUkZDIDM5MjcuCisJICBJdCdzIGEgZGFlbW9uIHRoYXQgYWxsb2NhdGVzIGFuZCBkZWZlbmRzIGEgZHluYW1pY2FsbHkgYXNzaWduZWQKKwkgIGFkZHJlc3Mgb24gdGhlIDE2OS4yNTQvMTYgbmV0d29yaywgcmVxdWlyaW5nIG5vIHN5c3RlbSBhZG1pbmlzdHJhdG9yLgorCisJICBTZWUgaHR0cDovL3d3dy56ZXJvY29uZi5vcmcgZm9yIGZ1cnRoZXIgZGV0YWlscywgYW5kICJ6Y2lwLnNjcmlwdCIKKwkgIGluIHRoZSBidXN5Ym94IGV4YW1wbGVzLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL0tidWlsZC5zcmMgYi9uZXR3b3JraW5nL0tidWlsZC5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmNTQ4MgotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDQ3IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKK2xpYi0kKENPTkZJR19BUlApICAgICAgICAgICs9IGFycC5vIGludGVyZmFjZS5vCitsaWItJChDT05GSUdfQVJQSU5HKSAgICAgICArPSBhcnBpbmcubworbGliLSQoQ09ORklHX0JSQ1RMKSAgICAgICAgKz0gYnJjdGwubworbGliLSQoQ09ORklHX0ROU0QpICAgICAgICAgKz0gZG5zZC5vCitsaWItJChDT05GSUdfRVRIRVJfV0FLRSkgICArPSBldGhlci13YWtlLm8KK2xpYi0kKENPTkZJR19GQUtFSURFTlREKSAgICs9IGlzcnZfaWRlbnRkLm8gaXNydi5vCitsaWItJChDT05GSUdfRlRQRCkgICAgICAgICArPSBmdHBkLm8KK2xpYi0kKENPTkZJR19GVFBHRVQpICAgICAgICs9IGZ0cGdldHB1dC5vCitsaWItJChDT05GSUdfRlRQUFVUKSAgICAgICArPSBmdHBnZXRwdXQubworbGliLSQoQ09ORklHX0hPU1ROQU1FKSAgICAgKz0gaG9zdG5hbWUubworbGliLSQoQ09ORklHX0hUVFBEKSAgICAgICAgKz0gaHR0cGQubworbGliLSQoQ09ORklHX0lGQ09ORklHKSAgICAgKz0gaWZjb25maWcubyBpbnRlcmZhY2UubworbGliLSQoQ09ORklHX0lGRU5TTEFWRSkgICAgKz0gaWZlbnNsYXZlLm8gaW50ZXJmYWNlLm8KK2xpYi0kKENPTkZJR19JRlBMVUdEKSAgICAgICs9IGlmcGx1Z2QubworbGliLSQoQ09ORklHX0lGVVBET1dOKSAgICAgKz0gaWZ1cGRvd24ubworbGliLSQoQ09ORklHX0lORVREKSAgICAgICAgKz0gaW5ldGQubworbGliLSQoQ09ORklHX0lQKSAgICAgICAgICAgKz0gaXAubworbGliLSQoQ09ORklHX0lQQ0FMQykgICAgICAgKz0gaXBjYWxjLm8KK2xpYi0kKENPTkZJR19OQU1FSUYpICAgICAgICs9IG5hbWVpZi5vCitsaWItJChDT05GSUdfTkMpICAgICAgICAgICArPSBuYy5vCitsaWItJChDT05GSUdfTkVUU1RBVCkgICAgICArPSBuZXRzdGF0Lm8KK2xpYi0kKENPTkZJR19OU0xPT0tVUCkgICAgICs9IG5zbG9va3VwLm8KK2xpYi0kKENPTkZJR19OVFBEKSAgICAgICAgICs9IG50cGQubworbGliLSQoQ09ORklHX1BTQ0FOKSAgICAgICAgKz0gcHNjYW4ubworbGliLSQoQ09ORklHX1JPVVRFKSAgICAgICAgKz0gcm91dGUubworbGliLSQoQ09ORklHX1NMQVRUQUNIKSAgICAgKz0gc2xhdHRhY2gubworbGliLSQoQ09ORklHX1RDKSAgICAgICAgICAgKz0gdGMubworbGliLSQoQ09ORklHX1RFTE5FVCkgICAgICAgKz0gdGVsbmV0Lm8KK2xpYi0kKENPTkZJR19URUxORVREKSAgICAgICs9IHRlbG5ldGQubworbGliLSQoQ09ORklHX1RGVFApICAgICAgICAgKz0gdGZ0cC5vCitsaWItJChDT05GSUdfVEZUUEQpICAgICAgICArPSB0ZnRwLm8KK2xpYi0kKENPTkZJR19UUkFDRVJPVVRFKSAgICs9IHRyYWNlcm91dGUubworbGliLSQoQ09ORklHX1RVTkNUTCkgICAgICAgKz0gdHVuY3RsLm8KK2xpYi0kKENPTkZJR19WQ09ORklHKSAgICAgICs9IHZjb25maWcubworbGliLSQoQ09ORklHX1pDSVApICAgICAgICAgKz0gemNpcC5vCisKK2xpYi0kKENPTkZJR19UQ1BTVkQpICAgICAgICs9IHRjcHVkcC5vIHRjcHVkcF9wZXJob3N0Lm8KK2xpYi0kKENPTkZJR19VRFBTVkQpICAgICAgICs9IHRjcHVkcC5vIHRjcHVkcF9wZXJob3N0Lm8KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvYXJwLmMgYi9uZXR3b3JraW5nL2FycC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwOTlhYTUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL2FycC5jCkBAIC0wLDAgKzEsNTI5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBhcnAuYyAtIE1hbmlwdWxhdGUgdGhlIHN5c3RlbSBBUlAgY2FjaGUKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcjogRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplIGF0IHV3YWx0Lm5sLm11Z25ldC5vcmc+CisgKiBCdXN5Ym94IHBvcnQ6IFBhdWwgdmFuIEdvb2wgPHB2YW5nb29sIGF0IG1pbW90ZWNoLmNvbT4KKyAqCisgKiBtb2RpZmllZCBmb3IgZ2V0b3B0MzIgYnkgQXJuZSBCZXJuaW4gPGFybmUgW2F0XSBhbGFtdXQuZGU+CisgKi8KKworLy91c2FnZTojZGVmaW5lIGFycF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgIlxuWy12bl0JWy1IIEhXVFlQRV0gWy1pIElGXSAtYSBbSE9TVE5BTUVdIgorLy91c2FnZTogICAgICJcblstdl0JCSAgICBbLWkgSUZdIC1kIEhPU1ROQU1FIFtwdWJdIgorLy91c2FnZTogICAgICJcblstdl0JWy1IIEhXVFlQRV0gWy1pIElGXSAtcyBIT1NUTkFNRSBIV0FERFIgW3RlbXBdIgorLy91c2FnZTogICAgICJcblstdl0JWy1IIEhXVFlQRV0gWy1pIElGXSAtcyBIT1NUTkFNRSBIV0FERFIgW25ldG1hc2sgTUFTS10gcHViIgorLy91c2FnZTogICAgICJcblstdl0JWy1IIEhXVFlQRV0gWy1pIElGXSAtRHMgSE9TVE5BTUUgSUZBQ0UgW25ldG1hc2sgTUFTS10gcHViIgorLy91c2FnZTojZGVmaW5lIGFycF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIk1hbmlwdWxhdGUgQVJQIGNhY2hlXG4iCisvL3VzYWdlOiAgICAgICAiXG4JLWEJCURpc3BsYXkgKGFsbCkgaG9zdHMiCisvL3VzYWdlOiAgICAgICAiXG4JLWQJCURlbGV0ZSBBUlAgZW50cnkiCisvL3VzYWdlOiAgICAgICAiXG4JLXMJCVNldCBuZXcgZW50cnkiCisvL3VzYWdlOiAgICAgICAiXG4JLXYJCVZlcmJvc2UiCisvL3VzYWdlOiAgICAgICAiXG4JLW4JCURvbid0IHJlc29sdmUgbmFtZXMiCisvL3VzYWdlOiAgICAgICAiXG4JLWkgSUYJCU5ldHdvcmsgaW50ZXJmYWNlIgorLy91c2FnZTogICAgICAgIlxuCS1ECQlSZWFkIEhXQUREUiBmcm9tIElGQUNFIgorLy91c2FnZTogICAgICAgIlxuCS1BLC1wIEFGCVByb3RvY29sIGZhbWlseSIKKy8vdXNhZ2U6ICAgICAgICJcbgktSCBIV1RZUEUJSGFyZHdhcmUgYWRkcmVzcyB0eXBlIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJpbmV0X2NvbW1vbi5oIgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0L2lmX2FycC5oPgorI2luY2x1ZGUgPG5ldGluZXQvZXRoZXIuaD4KKyNpbmNsdWRlIDxuZXRwYWNrZXQvcGFja2V0Lmg+CisKKyNkZWZpbmUgREVCVUcgMAorCisjZGVmaW5lIERGTFRfQUYgImluZXQiCisjZGVmaW5lIERGTFRfSFcgImV0aGVyIgorCitlbnVtIHsKKwlBUlBfT1BUX0EgPSAoMSA8PCAwKSwKKwlBUlBfT1BUX3AgPSAoMSA8PCAxKSwKKwlBUlBfT1BUX0ggPSAoMSA8PCAyKSwKKwlBUlBfT1BUX3QgPSAoMSA8PCAzKSwKKwlBUlBfT1BUX2kgPSAoMSA8PCA0KSwKKwlBUlBfT1BUX2EgPSAoMSA8PCA1KSwKKwlBUlBfT1BUX2QgPSAoMSA8PCA2KSwKKwlBUlBfT1BUX24gPSAoMSA8PCA3KSwgLyogZG8gbm90IHJlc29sdmUgYWRkcmVzc2VzICovCisJQVJQX09QVF9EID0gKDEgPDwgOCksIC8qIEhXLWFkZHJlc3MgaXMgZGV2aWNlbmFtZSAqLworCUFSUF9PUFRfcyA9ICgxIDw8IDkpLAorCUFSUF9PUFRfdiA9ICgxIDw8IDEwKSAqIERFQlVHLCAvKiBkZWJ1Z2dpbmcgb3V0cHV0IGZsYWcgKi8KK307CisKK2VudW0geworCXNvY2tmZCA9IDMsIC8qIGFjdGl2ZSBzb2NrZXQgZGVzY3JpcHRvciAqLworfTsKKworc3RydWN0IGdsb2JhbHMgeworCWNvbnN0IHN0cnVjdCBhZnR5cGUgKmFwOyAvKiBjdXJyZW50IGFkZHJlc3MgZmFtaWx5ICovCisJY29uc3Qgc3RydWN0IGh3dHlwZSAqaHc7IC8qIGN1cnJlbnQgaGFyZHdhcmUgdHlwZSAqLworCWNvbnN0IGNoYXIgKmRldmljZTsgICAgICAvKiBjdXJyZW50IGRldmljZSAqLworCXNtYWxsaW50IGh3X3NldDsgICAgICAgICAvKiBmbGFnIGlmIGh3LXR5cGUgd2FzIHNldCAoLUgpICovCit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBhcCAgICAgICAgIChHLmFwICAgICAgICApCisjZGVmaW5lIGh3ICAgICAgICAgKEcuaHcgICAgICAgICkKKyNkZWZpbmUgZGV2aWNlICAgICAoRy5kZXZpY2UgICAgKQorI2RlZmluZSBod19zZXQgICAgIChHLmh3X3NldCAgICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCWRldmljZSA9ICIiOyBcCit9IHdoaWxlICgwKQorCisKK3N0YXRpYyBjb25zdCBjaGFyIG9wdGlvbnNbXSBBTElHTjEgPQorCSJwdWJcMCIKKwkicHJpdlwwIgorCSJ0ZW1wXDAiCisJInRyYWlsXDAiCisJImRvbnRwdWJcMCIKKwkiYXV0b1wwIgorCSJkZXZcMCIKKwkibmV0bWFza1wwIjsKKworLyogRGVsZXRlIGFuIGVudHJ5IGZyb20gdGhlIEFSUCBjYWNoZS4gKi8KKy8qIENhbGxlZCBvbmx5IGZyb20gbWFpbiwgb25jZSAqLworc3RhdGljIGludCBhcnBfZGVsKGNoYXIgKiphcmdzKQoreworCWNoYXIgKmhvc3Q7CisJc3RydWN0IGFycHJlcSByZXE7CisJc3RydWN0IHNvY2thZGRyIHNhOworCWludCBmbGFncyA9IDA7CisJaW50IGVycjsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwkvKiBSZXNvbHZlIHRoZSBob3N0IG5hbWUuICovCisJaG9zdCA9ICphcmdzOworCWlmIChhcC0+aW5wdXQoaG9zdCwgJnNhKSA8IDApIHsKKwkJYmJfaGVycm9yX21zZ19hbmRfZGllKCIlcyIsIGhvc3QpOworCX0KKworCS8qIElmIGEgaG9zdCBoYXMgbW9yZSB0aGFuIG9uZSBhZGRyZXNzLCB1c2UgdGhlIGNvcnJlY3Qgb25lISAqLworCW1lbWNweSgmcmVxLmFycF9wYSwgJnNhLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyKSk7CisKKwlpZiAoaHdfc2V0KQorCQlyZXEuYXJwX2hhLnNhX2ZhbWlseSA9IGh3LT50eXBlOworCisJcmVxLmFycF9mbGFncyA9IEFURl9QRVJNOworCWFyZ3MrKzsKKwl3aGlsZSAoKmFyZ3MgIT0gTlVMTCkgeworCQlzd2l0Y2ggKGluZGV4X2luX3N0cmluZ3Mob3B0aW9ucywgKmFyZ3MpKSB7CisJCWNhc2UgMDogLyogInB1YiIgKi8KKwkJCWZsYWdzIHw9IDE7CisJCQlhcmdzKys7CisJCQlicmVhazsKKwkJY2FzZSAxOiAvKiAicHJpdiIgKi8KKwkJCWZsYWdzIHw9IDI7CisJCQlhcmdzKys7CisJCQlicmVhazsKKwkJY2FzZSAyOiAvKiAidGVtcCIgKi8KKwkJCXJlcS5hcnBfZmxhZ3MgJj0gfkFURl9QRVJNOworCQkJYXJncysrOworCQkJYnJlYWs7CisJCWNhc2UgMzogLyogInRyYWlsIiAqLworCQkJcmVxLmFycF9mbGFncyB8PSBBVEZfVVNFVFJBSUxFUlM7CisJCQlhcmdzKys7CisJCQlicmVhazsKKwkJY2FzZSA0OiAvKiAiZG9udHB1YiIgKi8KKyNpZmRlZiBIQVZFX0FURl9ET05UUFVCCisJCQlyZXEuYXJwX2ZsYWdzIHw9IEFURl9ET05UUFVCOworI2Vsc2UKKwkJCWJiX2Vycm9yX21zZygiZmVhdHVyZSBBVEZfRE9OVFBVQiBpcyBub3Qgc3VwcG9ydGVkIik7CisjZW5kaWYKKwkJCWFyZ3MrKzsKKwkJCWJyZWFrOworCQljYXNlIDU6IC8qICJhdXRvIiAqLworI2lmZGVmIEhBVkVfQVRGX01BR0lDCisJCQlyZXEuYXJwX2ZsYWdzIHw9IEFURl9NQUdJQzsKKyNlbHNlCisJCQliYl9lcnJvcl9tc2coImZlYXR1cmUgQVRGX01BR0lDIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorCQkJYXJncysrOworCQkJYnJlYWs7CisJCWNhc2UgNjogLyogImRldiIgKi8KKwkJCWlmICgqKythcmdzID09IE5VTEwpCisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJZGV2aWNlID0gKmFyZ3M7CisJCQlhcmdzKys7CisJCQlicmVhazsKKwkJY2FzZSA3OiAvKiAibmV0bWFzayIgKi8KKwkJCWlmICgqKythcmdzID09IE5VTEwpCisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJaWYgKHN0cmNtcCgqYXJncywgIjI1NS4yNTUuMjU1LjI1NSIpICE9IDApIHsKKwkJCQlob3N0ID0gKmFyZ3M7CisJCQkJaWYgKGFwLT5pbnB1dChob3N0LCAmc2EpIDwgMCkgeworCQkJCQliYl9oZXJyb3JfbXNnX2FuZF9kaWUoIiVzIiwgaG9zdCk7CisJCQkJfQorCQkJCW1lbWNweSgmcmVxLmFycF9uZXRtYXNrLCAmc2EsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKTsKKwkJCQlyZXEuYXJwX2ZsYWdzIHw9IEFURl9ORVRNQVNLOworCQkJfQorCQkJYXJncysrOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQliYl9zaG93X3VzYWdlKCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoZmxhZ3MgPT0gMCkKKwkJZmxhZ3MgPSAzOworCisJc3RybmNweShyZXEuYXJwX2RldiwgZGV2aWNlLCBzaXplb2YocmVxLmFycF9kZXYpKTsKKworCWVyciA9IC0xOworCisJLyogQ2FsbCB0aGUga2VybmVsLiAqLworCWlmIChmbGFncyAmIDIpIHsKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBBUlBfT1BUX3YpCisJCQliYl9lcnJvcl9tc2coIlNJT0NEQVJQKG5vcHViKSIpOworCQllcnIgPSBpb2N0bChzb2NrZmQsIFNJT0NEQVJQLCAmcmVxKTsKKwkJaWYgKGVyciA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFTlhJTykgeworCQkJCWlmIChmbGFncyAmIDEpCisJCQkJCWdvdG8gbm9wdWI7CisJCQkJcHJpbnRmKCJObyBBUlAgZW50cnkgZm9yICVzXG4iLCBob3N0KTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIlNJT0NEQVJQKHByaXYpIik7CisJCX0KKwl9CisJaWYgKChmbGFncyAmIDEpICYmIGVycikgeworIG5vcHViOgorCQlyZXEuYXJwX2ZsYWdzIHw9IEFURl9QVUJMOworCQlpZiAob3B0aW9uX21hc2szMiAmIEFSUF9PUFRfdikKKwkJCWJiX2Vycm9yX21zZygiU0lPQ0RBUlAocHViKSIpOworCQlpZiAoaW9jdGwoc29ja2ZkLCBTSU9DREFSUCwgJnJlcSkgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRU5YSU8pIHsKKwkJCQlwcmludGYoIk5vIEFSUCBlbnRyeSBmb3IgJXNcbiIsIGhvc3QpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiU0lPQ0RBUlAocHViKSIpOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKiBHZXQgdGhlIGhhcmR3YXJlIGFkZHJlc3MgdG8gYSBzcGVjaWZpZWQgaW50ZXJmYWNlIG5hbWUgKi8KK3N0YXRpYyB2b2lkIGFycF9nZXRkZXZodyhjaGFyICppZm5hbWUsIHN0cnVjdCBzb2NrYWRkciAqc2EpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwljb25zdCBzdHJ1Y3QgaHd0eXBlICp4aHc7CisKKwlzdHJjcHkoaWZyLmlmcl9uYW1lLCBpZm5hbWUpOworCWlvY3RsX29yX3BlcnJvcl9hbmRfZGllKHNvY2tmZCwgU0lPQ0dJRkhXQUREUiwgJmlmciwKKwkJCQkJImNhbid0IGdldCBIVy1BZGRyZXNzIGZvciAnJXMnIiwgaWZuYW1lKTsKKwlpZiAoaHdfc2V0ICYmIChpZnIuaWZyX2h3YWRkci5zYV9mYW1pbHkgIT0gaHctPnR5cGUpKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJwcm90b2NvbCB0eXBlIG1pc21hdGNoIik7CisJfQorCW1lbWNweShzYSwgJihpZnIuaWZyX2h3YWRkciksIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKTsKKworCWlmIChvcHRpb25fbWFzazMyICYgQVJQX09QVF92KSB7CisJCXhodyA9IGdldF9od250eXBlKGlmci5pZnJfaHdhZGRyLnNhX2ZhbWlseSk7CisJCWlmICgheGh3IHx8ICF4aHctPnByaW50KSB7CisJCQl4aHcgPSBnZXRfaHdudHlwZSgtMSk7CisJCX0KKwkJYmJfZXJyb3JfbXNnKCJkZXZpY2UgJyVzJyBoYXMgSFcgYWRkcmVzcyAlcyAnJXMnIiwKKwkJCQlpZm5hbWUsIHhody0+bmFtZSwKKwkJCQl4aHctPnByaW50KCh1bnNpZ25lZCBjaGFyICopICZpZnIuaWZyX2h3YWRkci5zYV9kYXRhKSk7CisJfQorfQorCisvKiBTZXQgYW4gZW50cnkgaW4gdGhlIEFSUCBjYWNoZS4gKi8KKy8qIENhbGxlZCBvbmx5IGZyb20gbWFpbiwgb25jZSAqLworc3RhdGljIGludCBhcnBfc2V0KGNoYXIgKiphcmdzKQoreworCWNoYXIgKmhvc3Q7CisJc3RydWN0IGFycHJlcSByZXE7CisJc3RydWN0IHNvY2thZGRyIHNhOworCWludCBmbGFnczsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwlob3N0ID0gKmFyZ3MrKzsKKwlpZiAoYXAtPmlucHV0KGhvc3QsICZzYSkgPCAwKSB7CisJCWJiX2hlcnJvcl9tc2dfYW5kX2RpZSgiJXMiLCBob3N0KTsKKwl9CisJLyogSWYgYSBob3N0IGhhcyBtb3JlIHRoYW4gb25lIGFkZHJlc3MsIHVzZSB0aGUgY29ycmVjdCBvbmUhICovCisJbWVtY3B5KCZyZXEuYXJwX3BhLCAmc2EsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKTsKKworCS8qIEZldGNoIHRoZSBoYXJkd2FyZSBhZGRyZXNzLiAqLworCWlmICgqYXJncyA9PSBOVUxMKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJuZWVkIGhhcmR3YXJlIGFkZHJlc3MiKTsKKwl9CisJaWYgKG9wdGlvbl9tYXNrMzIgJiBBUlBfT1BUX0QpIHsKKwkJYXJwX2dldGRldmh3KCphcmdzKyssICZyZXEuYXJwX2hhKTsKKwl9IGVsc2UgeworCQlpZiAoaHctPmlucHV0KCphcmdzKyssICZyZXEuYXJwX2hhKSA8IDApIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIGhhcmR3YXJlIGFkZHJlc3MiKTsKKwkJfQorCX0KKworCS8qIENoZWNrIG91dCBhbnkgbW9kaWZpZXJzLiAqLworCWZsYWdzID0gQVRGX1BFUk0gfCBBVEZfQ09NOworCXdoaWxlICgqYXJncyAhPSBOVUxMKSB7CisJCXN3aXRjaCAoaW5kZXhfaW5fc3RyaW5ncyhvcHRpb25zLCAqYXJncykpIHsKKwkJY2FzZSAwOiAvKiAicHViIiAqLworCQkJZmxhZ3MgfD0gQVRGX1BVQkw7CisJCQlhcmdzKys7CisJCQlicmVhazsKKwkJY2FzZSAxOiAvKiAicHJpdiIgKi8KKwkJCWZsYWdzICY9IH5BVEZfUFVCTDsKKwkJCWFyZ3MrKzsKKwkJCWJyZWFrOworCQljYXNlIDI6IC8qICJ0ZW1wIiAqLworCQkJZmxhZ3MgJj0gfkFURl9QRVJNOworCQkJYXJncysrOworCQkJYnJlYWs7CisJCWNhc2UgMzogLyogInRyYWlsIiAqLworCQkJZmxhZ3MgfD0gQVRGX1VTRVRSQUlMRVJTOworCQkJYXJncysrOworCQkJYnJlYWs7CisJCWNhc2UgNDogLyogImRvbnRwdWIiICovCisjaWZkZWYgSEFWRV9BVEZfRE9OVFBVQgorCQkJZmxhZ3MgfD0gQVRGX0RPTlRQVUI7CisjZWxzZQorCQkJYmJfZXJyb3JfbXNnKCJmZWF0dXJlIEFURl9ET05UUFVCIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorCQkJYXJncysrOworCQkJYnJlYWs7CisJCWNhc2UgNTogLyogImF1dG8iICovCisjaWZkZWYgSEFWRV9BVEZfTUFHSUMKKwkJCWZsYWdzIHw9IEFURl9NQUdJQzsKKyNlbHNlCisJCQliYl9lcnJvcl9tc2coImZlYXR1cmUgQVRGX01BR0lDIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyNlbmRpZgorCQkJYXJncysrOworCQkJYnJlYWs7CisJCWNhc2UgNjogLyogImRldiIgKi8KKwkJCWlmICgqKythcmdzID09IE5VTEwpCisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJZGV2aWNlID0gKmFyZ3M7CisJCQlhcmdzKys7CisJCQlicmVhazsKKwkJY2FzZSA3OiAvKiAibmV0bWFzayIgKi8KKwkJCWlmICgqKythcmdzID09IE5VTEwpCisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJaWYgKHN0cmNtcCgqYXJncywgIjI1NS4yNTUuMjU1LjI1NSIpICE9IDApIHsKKwkJCQlob3N0ID0gKmFyZ3M7CisJCQkJaWYgKGFwLT5pbnB1dChob3N0LCAmc2EpIDwgMCkgeworCQkJCQliYl9oZXJyb3JfbXNnX2FuZF9kaWUoIiVzIiwgaG9zdCk7CisJCQkJfQorCQkJCW1lbWNweSgmcmVxLmFycF9uZXRtYXNrLCAmc2EsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKTsKKwkJCQlmbGFncyB8PSBBVEZfTkVUTUFTSzsKKwkJCX0KKwkJCWFyZ3MrKzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYmJfc2hvd191c2FnZSgpOworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBGaWxsIGluIHRoZSByZW1haW5kZXIgb2YgdGhlIHJlcXVlc3QuICovCisJcmVxLmFycF9mbGFncyA9IGZsYWdzOworCisJc3RybmNweShyZXEuYXJwX2RldiwgZGV2aWNlLCBzaXplb2YocmVxLmFycF9kZXYpKTsKKworCS8qIENhbGwgdGhlIGtlcm5lbC4gKi8KKwlpZiAob3B0aW9uX21hc2szMiAmIEFSUF9PUFRfdikKKwkJYmJfZXJyb3JfbXNnKCJTSU9DU0FSUCgpIik7CisJeGlvY3RsKHNvY2tmZCwgU0lPQ1NBUlAsICZyZXEpOworCXJldHVybiAwOworfQorCisKKy8qIFByaW50IHRoZSBjb250ZW50cyBvZiBhbiBBUlAgcmVxdWVzdCBibG9jay4gKi8KK3N0YXRpYyB2b2lkCithcnBfZGlzcChjb25zdCBjaGFyICpuYW1lLCBjaGFyICppcCwgaW50IHR5cGUsIGludCBhcnBfZmxhZ3MsCisJCWNoYXIgKmh3YSwgY2hhciAqbWFzaywgY2hhciAqZGV2KQoreworCXN0YXRpYyBjb25zdCBpbnQgYXJwX21hc2tzW10gPSB7CisJCUFURl9QRVJNLCBBVEZfUFVCTCwKKyNpZmRlZiBIQVZFX0FURl9NQUdJQworCQlBVEZfTUFHSUMsCisjZW5kaWYKKyNpZmRlZiBIQVZFX0FURl9ET05UUFVCCisJCUFURl9ET05UUFVCLAorI2VuZGlmCisJCUFURl9VU0VUUkFJTEVSUywKKwl9OworCXN0YXRpYyBjb25zdCBjaGFyIGFycF9sYWJlbHNbXSBBTElHTjEgPSAiUEVSTVwwIiJQVVBcMCIKKyNpZmRlZiBIQVZFX0FURl9NQUdJQworCQkiQVVUT1wwIgorI2VuZGlmCisjaWZkZWYgSEFWRV9BVEZfRE9OVFBVQgorCQkiRE9OVFBVQlwwIgorI2VuZGlmCisJCSJUUkFJTFwwIgorCTsKKworCWNvbnN0IHN0cnVjdCBod3R5cGUgKnhodzsKKworCXhodyA9IGdldF9od250eXBlKHR5cGUpOworCWlmICh4aHcgPT0gTlVMTCkKKwkJeGh3ID0gZ2V0X2h3dHlwZShERkxUX0hXKTsKKworCXByaW50ZigiJXMgKCVzKSBhdCAiLCBuYW1lLCBpcCk7CisKKwlpZiAoIShhcnBfZmxhZ3MgJiBBVEZfQ09NKSkgeworCQlpZiAoYXJwX2ZsYWdzICYgQVRGX1BVQkwpCisJCQlwcmludGYoIiogIik7CisJCWVsc2UKKwkJCXByaW50ZigiPGluY29tcGxldGU+ICIpOworCX0gZWxzZSB7CisJCXByaW50ZigiJXMgWyVzXSAiLCBod2EsIHhody0+bmFtZSk7CisJfQorCisJaWYgKGFycF9mbGFncyAmIEFURl9ORVRNQVNLKQorCQlwcmludGYoIm5ldG1hc2sgJXMgIiwgbWFzayk7CisKKwlwcmludF9mbGFnc19zZXBhcmF0ZWQoYXJwX21hc2tzLCBhcnBfbGFiZWxzLCBhcnBfZmxhZ3MsICIgIik7CisJcHJpbnRmKCIgb24gJXNcbiIsIGRldik7Cit9CisKKy8qIERpc3BsYXkgdGhlIGNvbnRlbnRzIG9mIHRoZSBBUlAgY2FjaGUgaW4gdGhlIGtlcm5lbC4gKi8KKy8qIENhbGxlZCBvbmx5IGZyb20gbWFpbiwgb25jZSAqLworc3RhdGljIGludCBhcnBfc2hvdyhjaGFyICpuYW1lKQoreworCWNvbnN0IGNoYXIgKmhvc3Q7CisJY29uc3QgY2hhciAqaG9zdG5hbWU7CisJRklMRSAqZnA7CisJc3RydWN0IHNvY2thZGRyIHNhOworCWludCB0eXBlLCBmbGFnczsKKwlpbnQgbnVtOworCXVuc2lnbmVkIGVudHJpZXMgPSAwLCBzaG93biA9IDA7CisJY2hhciBpcFsxMjhdOworCWNoYXIgaHdhWzEyOF07CisJY2hhciBtYXNrWzEyOF07CisJY2hhciBsaW5lWzEyOF07CisJY2hhciBkZXZbMTI4XTsKKworCWhvc3QgPSBOVUxMOworCWlmIChuYW1lICE9IE5VTEwpIHsKKwkJLyogUmVzb2x2ZSB0aGUgaG9zdCBuYW1lLiAqLworCQlpZiAoYXAtPmlucHV0KG5hbWUsICZzYSkgPCAwKSB7CisJCQliYl9oZXJyb3JfbXNnX2FuZF9kaWUoIiVzIiwgbmFtZSk7CisJCX0KKwkJaG9zdCA9IHhzdHJkdXAoYXAtPnNwcmludCgmc2EsIDEpKTsKKwl9CisJZnAgPSB4Zm9wZW5fZm9yX3JlYWQoIi9wcm9jL25ldC9hcnAiKTsKKwkvKiBCeXBhc3MgaGVhZGVyIC0tIHJlYWQgb25lIGxpbmUgKi8KKwlmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKTsKKworCS8qIFJlYWQgdGhlIEFSUCBjYWNoZSBlbnRyaWVzLiAqLworCXdoaWxlIChmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGZwKSkgeworCisJCW1hc2tbMF0gPSAnLSc7IG1hc2tbMV0gPSAnXDAnOworCQlkZXZbMF0gPSAnLSc7IGRldlsxXSA9ICdcMCc7CisJCS8qIEFsbCB0aGVzZSBzdHJpbmdzIGNhbid0IG92ZXJmbG93CisJCSAqIGJlY2F1c2UgZmdldHMgYWJvdmUgcmVhZHMgbGltaXRlZCBhbW91bnQgb2YgZGF0YSAqLworCQludW0gPSBzc2NhbmYobGluZSwgIiVzIDB4JXggMHgleCAlcyAlcyAlc1xuIiwKKwkJCQkJaXAsICZ0eXBlLCAmZmxhZ3MsIGh3YSwgbWFzaywgZGV2KTsKKwkJaWYgKG51bSA8IDQpCisJCQlicmVhazsKKworCQllbnRyaWVzKys7CisJCS8qIGlmIHRoZSB1c2VyIHNwZWNpZmllZCBody10eXBlIGRpZmZlcnMsIHNraXAgaXQgKi8KKwkJaWYgKGh3X3NldCAmJiAodHlwZSAhPSBody0+dHlwZSkpCisJCQljb250aW51ZTsKKworCQkvKiBpZiB0aGUgdXNlciBzcGVjaWZpZWQgYWRkcmVzcyBkaWZmZXJzLCBza2lwIGl0ICovCisJCWlmIChob3N0ICYmIHN0cmNtcChpcCwgaG9zdCkgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIGlmIHRoZSB1c2VyIHNwZWNpZmllZCBkZXZpY2UgZGlmZmVycywgc2tpcCBpdCAqLworCQlpZiAoZGV2aWNlWzBdICYmIHN0cmNtcChkZXYsIGRldmljZSkgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXNob3duKys7CisJCS8qIFRoaXMgSVMgdWdseSBidXQgaXQgd29ya3MgLWJlICovCisJCWhvc3RuYW1lID0gIj8iOworCQlpZiAoIShvcHRpb25fbWFzazMyICYgQVJQX09QVF9uKSkgeworCQkJaWYgKGFwLT5pbnB1dChpcCwgJnNhKSA8IDApCisJCQkJaG9zdG5hbWUgPSBpcDsKKwkJCWVsc2UKKwkJCQlob3N0bmFtZSA9IGFwLT5zcHJpbnQoJnNhLCAob3B0aW9uX21hc2szMiAmIEFSUF9PUFRfbikgfCAweDgwMDApOworCQkJaWYgKHN0cmNtcChob3N0bmFtZSwgaXApID09IDApCisJCQkJaG9zdG5hbWUgPSAiPyI7CisJCX0KKworCQlhcnBfZGlzcChob3N0bmFtZSwgaXAsIHR5cGUsIGZsYWdzLCBod2EsIG1hc2ssIGRldik7CisJfQorCWlmIChvcHRpb25fbWFzazMyICYgQVJQX09QVF92KQorCQlwcmludGYoIkVudHJpZXM6ICV1XHRTa2lwcGVkOiAldVx0Rm91bmQ6ICV1XG4iLAorCQkJCWVudHJpZXMsIGVudHJpZXMgLSBzaG93biwgc2hvd24pOworCisJaWYgKCFzaG93bikgeworCQlpZiAoaHdfc2V0IHx8IGhvc3QgfHwgZGV2aWNlWzBdKQorCQkJcHJpbnRmKCJObyBtYXRjaCBmb3VuZCBpbiAldSBlbnRyaWVzXG4iLCBlbnRyaWVzKTsKKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZyZWUoKGNoYXIqKWhvc3QpOworCQlmY2xvc2UoZnApOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGFycF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgYXJwX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICpod190eXBlOworCWNvbnN0IGNoYXIgKnByb3RvY29sOworCXVuc2lnbmVkIG9wdHM7CisKKwlJTklUX0coKTsKKworCXhtb3ZlX2ZkKHhzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCksIHNvY2tmZCk7CisKKwlhcCA9IGdldF9hZnR5cGUoREZMVF9BRik7CisJLyogRGVmYXVsdHMgYXJlIGFsd2F5cyBzdXBwb3J0ZWQgKi8KKwkvL2lmICghYXApCisJLy8JYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiAlcyBub3Qgc3VwcG9ydGVkIiwgREZMVF9BRiwgImFkZHJlc3MgZmFtaWx5Iik7CisJaHcgPSBnZXRfaHd0eXBlKERGTFRfSFcpOworCS8vaWYgKCFodykKKwkvLwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6ICVzIG5vdCBzdXBwb3J0ZWQiLCBERkxUX0hXLCAiaGFyZHdhcmUgdHlwZSIpOworCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJBOnA6SDp0Omk6YWRuRHN2IiwgJnByb3RvY29sLCAmcHJvdG9jb2wsCisJCQkJICZod190eXBlLCAmaHdfdHlwZSwgJmRldmljZSk7CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKG9wdHMgJiAoQVJQX09QVF9BIHwgQVJQX09QVF9wKSkgeworCQlhcCA9IGdldF9hZnR5cGUocHJvdG9jb2wpOworCQlpZiAoIWFwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiB1bmtub3duICVzIiwgcHJvdG9jb2wsICJhZGRyZXNzIGZhbWlseSIpOworCX0KKwlpZiAob3B0cyAmIChBUlBfT1BUX0ggfCBBUlBfT1BUX3QpKSB7CisJCWh3ID0gZ2V0X2h3dHlwZShod190eXBlKTsKKwkJaWYgKCFodykKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlczogdW5rbm93biAlcyIsIGh3X3R5cGUsICJoYXJkd2FyZSB0eXBlIik7CisJCWh3X3NldCA9IDE7CisJfQorCS8vaWYgKG9wdHMgJiBBUlBfT1BUX2kpLi4uIC1pCisKKwlpZiAoYXAtPmFmICE9IEFGX0lORVQpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiBrZXJuZWwgb25seSBzdXBwb3J0cyAnaW5ldCciLCBhcC0+bmFtZSk7CisJfQorCWlmIChody0+YWxlbiA8PSAwKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlczogJXMgd2l0aG91dCBBUlAgc3VwcG9ydCIsCisJCQkJaHctPm5hbWUsICJoYXJkd2FyZSB0eXBlIik7CisJfQorCisJLyogTm93IHNlZSB3aGF0IHdlIGhhdmUgdG8gZG8gaGVyZS4uLiAqLworCWlmIChvcHRzICYgKEFSUF9PUFRfZCB8IEFSUF9PUFRfcykpIHsKKwkJaWYgKGFyZ3ZbMF0gPT0gTlVMTCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJuZWVkIGhvc3QgbmFtZSIpOworCQlpZiAob3B0cyAmIEFSUF9PUFRfcykKKwkJCXJldHVybiBhcnBfc2V0KGFyZ3YpOworCQlyZXR1cm4gYXJwX2RlbChhcmd2KTsKKwl9CisKKwkvL2lmIChvcHRzICYgQVJQX09QVF9hKSAtIGRlZmF1bHQKKwlyZXR1cm4gYXJwX3Nob3coYXJndlswXSk7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2FycGluZy5jIGIvbmV0d29ya2luZy9hcnBpbmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjIwNWU1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9hcnBpbmcuYwpAQCAtMCwwICsxLDQyMyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBBdXRob3I6IEFsZXhleSBLdXpuZXRzb3YgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICogQnVzeWJveCBwb3J0OiBOaWNrIEZlZGNoaWsgPG5pY2tAZmVkY2hpay5vcmcudWE+CisgKi8KKworLy91c2FnZTojZGVmaW5lIGFycGluZ190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1mcWJEVUFdIFstYyBDTlRdIFstdyBUSU1FT1VUXSBbLUkgSUZBQ0VdIFstcyBTUkNfSVBdIERTVF9JUCIKKy8vdXNhZ2U6I2RlZmluZSBhcnBpbmdfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZW5kIEFSUCByZXF1ZXN0cy9yZXBsaWVzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1mCQlRdWl0IG9uIGZpcnN0IEFSUCByZXBseSIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJCVF1aWV0IgorLy91c2FnZTogICAgICJcbgktYgkJS2VlcCBicm9hZGNhc3RpbmcsIGRvbid0IGdvIHVuaWNhc3QiCisvL3VzYWdlOiAgICAgIlxuCS1ECQlFeGl0IHdpdGggMSBpZiBEU1RfSVAgcmVwbGllcyIKKy8vdXNhZ2U6ICAgICAiXG4JLVUJCVVuc29saWNpdGVkIEFSUCBtb2RlLCB1cGRhdGUgeW91ciBuZWlnaGJvcnMiCisvL3VzYWdlOiAgICAgIlxuCS1BCQlBUlAgYW5zd2VyIG1vZGUsIHVwZGF0ZSB5b3VyIG5laWdoYm9ycyIKKy8vdXNhZ2U6ICAgICAiXG4JLWMgTgkJU3RvcCBhZnRlciBzZW5kaW5nIE4gQVJQIHJlcXVlc3RzIgorLy91c2FnZTogICAgICJcbgktdyBUSU1FT1VUCVNlY29uZHMgdG8gd2FpdCBmb3IgQVJQIHJlcGx5IgorLy91c2FnZTogICAgICJcbgktSSBJRkFDRQlJbnRlcmZhY2UgdG8gdXNlIChkZWZhdWx0IGV0aDApIgorLy91c2FnZTogICAgICJcbgktcyBTUkNfSVAJU2VuZGVyIElQIGFkZHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCURTVF9JUAkJVGFyZ2V0IElQIGFkZHJlc3MiCisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2V0aGVyLmg+CisjaW5jbHVkZSA8bmV0cGFja2V0L3BhY2tldC5oPgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogV2UgZG9uJ3QgZXhwZWN0IHRvIHNlZSAxMDAwKyBzZWNvbmRzIGRlbGF5LCB1bnNpZ25lZCBpcyBlbm91Z2ggKi8KKyNkZWZpbmUgTU9OT1RPTklDX1VTKCkgKCh1bnNpZ25lZCltb25vdG9uaWNfdXMoKSkKKworZW51bSB7CisJREFEID0gMSwKKwlVTlNPTElDSVRFRCA9IDIsCisJQURWRVJUID0gNCwKKwlRVUlFVCA9IDgsCisJUVVJVF9PTl9SRVBMWSA9IDE2LAorCUJDQVNUX09OTFkgPSAzMiwKKwlVTklDQVNUSU5HID0gNjQKK307CisKK3N0cnVjdCBnbG9iYWxzIHsKKwlzdHJ1Y3QgaW5fYWRkciBzcmM7CisJc3RydWN0IGluX2FkZHIgZHN0OworCXN0cnVjdCBzb2NrYWRkcl9sbCBtZTsKKwlzdHJ1Y3Qgc29ja2FkZHJfbGwgaGU7CisJaW50IHNvY2tfZmQ7CisKKwlpbnQgY291bnQ7IC8vID0gLTE7CisJdW5zaWduZWQgbGFzdDsKKwl1bnNpZ25lZCB0aW1lb3V0X3VzOworCXVuc2lnbmVkIHN0YXJ0OworCisJdW5zaWduZWQgc2VudDsKKwl1bnNpZ25lZCBicmRfc2VudDsKKwl1bnNpZ25lZCByZWNlaXZlZDsKKwl1bnNpZ25lZCBicmRfcmVjdjsKKwl1bnNpZ25lZCByZXFfcmVjdjsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIHNyYyAgICAgICAgKEcuc3JjICAgICAgICkKKyNkZWZpbmUgZHN0ICAgICAgICAoRy5kc3QgICAgICAgKQorI2RlZmluZSBtZSAgICAgICAgIChHLm1lICAgICAgICApCisjZGVmaW5lIGhlICAgICAgICAgKEcuaGUgICAgICAgICkKKyNkZWZpbmUgc29ja19mZCAgICAoRy5zb2NrX2ZkICAgKQorI2RlZmluZSBjb3VudCAgICAgIChHLmNvdW50ICAgICApCisjZGVmaW5lIGxhc3QgICAgICAgKEcubGFzdCAgICAgICkKKyNkZWZpbmUgdGltZW91dF91cyAoRy50aW1lb3V0X3VzKQorI2RlZmluZSBzdGFydCAgICAgIChHLnN0YXJ0ICAgICApCisjZGVmaW5lIHNlbnQgICAgICAgKEcuc2VudCAgICAgICkKKyNkZWZpbmUgYnJkX3NlbnQgICAoRy5icmRfc2VudCAgKQorI2RlZmluZSByZWNlaXZlZCAgIChHLnJlY2VpdmVkICApCisjZGVmaW5lIGJyZF9yZWN2ICAgKEcuYnJkX3JlY3YgICkKKyNkZWZpbmUgcmVxX3JlY3YgICAoRy5yZXFfcmVjdiAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwljb3VudCA9IC0xOyBcCit9IHdoaWxlICgwKQorCisvLyBJZiBHTlVpc21zIGFyZSBub3QgYXZhaWxhYmxlLi4uCisvL3N0YXRpYyB2b2lkICptZW1wY3B5KHZvaWQgKl9kc3QsIGNvbnN0IHZvaWQgKl9zcmMsIGludCBuKQorLy97CisvLwltZW1jcHkoX2RzdCwgX3NyYywgbik7CisvLwlyZXR1cm4gKGNoYXIqKV9kc3QgKyBuOworLy99CisKK3N0YXRpYyBpbnQgc2VuZF9wYWNrKHN0cnVjdCBpbl9hZGRyICpzcmNfYWRkciwKKwkJCXN0cnVjdCBpbl9hZGRyICpkc3RfYWRkciwgc3RydWN0IHNvY2thZGRyX2xsICpNRSwKKwkJCXN0cnVjdCBzb2NrYWRkcl9sbCAqSEUpCit7CisJaW50IGVycjsKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsyNTZdOworCXN0cnVjdCBhcnBoZHIgKmFoID0gKHN0cnVjdCBhcnBoZHIgKikgYnVmOworCXVuc2lnbmVkIGNoYXIgKnAgPSAodW5zaWduZWQgY2hhciAqKSAoYWggKyAxKTsKKworCWFoLT5hcl9ocmQgPSBodG9ucyhBUlBIUkRfRVRIRVIpOworCWFoLT5hcl9wcm8gPSBodG9ucyhFVEhfUF9JUCk7CisJYWgtPmFyX2hsbiA9IE1FLT5zbGxfaGFsZW47CisJYWgtPmFyX3BsbiA9IDQ7CisJYWgtPmFyX29wID0gb3B0aW9uX21hc2szMiAmIEFEVkVSVCA/IGh0b25zKEFSUE9QX1JFUExZKSA6IGh0b25zKEFSUE9QX1JFUVVFU1QpOworCisJcCA9IG1lbXBjcHkocCwgJk1FLT5zbGxfYWRkciwgYWgtPmFyX2hsbik7CisJcCA9IG1lbXBjcHkocCwgc3JjX2FkZHIsIDQpOworCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBBRFZFUlQpCisJCXAgPSBtZW1wY3B5KHAsICZNRS0+c2xsX2FkZHIsIGFoLT5hcl9obG4pOworCWVsc2UKKwkJcCA9IG1lbXBjcHkocCwgJkhFLT5zbGxfYWRkciwgYWgtPmFyX2hsbik7CisKKwlwID0gbWVtcGNweShwLCBkc3RfYWRkciwgNCk7CisKKwllcnIgPSBzZW5kdG8oc29ja19mZCwgYnVmLCBwIC0gYnVmLCAwLCAoc3RydWN0IHNvY2thZGRyICopIEhFLCBzaXplb2YoKkhFKSk7CisJaWYgKGVyciA9PSBwIC0gYnVmKSB7CisJCWxhc3QgPSBNT05PVE9OSUNfVVMoKTsKKwkJc2VudCsrOworCQlpZiAoIShvcHRpb25fbWFzazMyICYgVU5JQ0FTVElORykpCisJCQlicmRfc2VudCsrOworCX0KKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBmaW5pc2godm9pZCkgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBmaW5pc2godm9pZCkKK3sKKwlpZiAoIShvcHRpb25fbWFzazMyICYgUVVJRVQpKSB7CisJCXByaW50ZigiU2VudCAldSBwcm9iZShzKSAoJXUgYnJvYWRjYXN0KHMpKVxuIgorCQkJIlJlY2VpdmVkICV1IHJlcGwlcyIKKwkJCSIgKCV1IHJlcXVlc3QocyksICV1IGJyb2FkY2FzdChzKSlcbiIsCisJCQlzZW50LCBicmRfc2VudCwKKwkJCXJlY2VpdmVkLCAocmVjZWl2ZWQgPT0gMSkgPyAiaWVzIiA6ICJ5IiwKKwkJCXJlcV9yZWN2LCBicmRfcmVjdik7CisJfQorCWlmIChvcHRpb25fbWFzazMyICYgREFEKQorCQlleGl0KCEhcmVjZWl2ZWQpOworCWlmIChvcHRpb25fbWFzazMyICYgVU5TT0xJQ0lURUQpCisJCWV4aXQoRVhJVF9TVUNDRVNTKTsKKwlleGl0KCFyZWNlaXZlZCk7Cit9CisKK3N0YXRpYyB2b2lkIGNhdGNoZXIodm9pZCkKK3sKKwl1bnNpZ25lZCBub3c7CisKKwlub3cgPSBNT05PVE9OSUNfVVMoKTsKKwlpZiAoc3RhcnQgPT0gMCkKKwkJc3RhcnQgPSBub3c7CisKKwlpZiAoY291bnQgPT0gMCB8fCAodGltZW91dF91cyAmJiAobm93IC0gc3RhcnQpID4gdGltZW91dF91cykpCisJCWZpbmlzaCgpOworCisJLyogY291bnQgPCAwIG1lYW5zICJpbmZpbml0ZSBjb3VudCIgKi8KKwlpZiAoY291bnQgPiAwKQorCQljb3VudC0tOworCisJaWYgKGxhc3QgPT0gMCB8fCAobm93IC0gbGFzdCkgPiA1MDAwMDApIHsKKwkJc2VuZF9wYWNrKCZzcmMsICZkc3QsICZtZSwgJmhlKTsKKwkJaWYgKGNvdW50ID09IDAgJiYgKG9wdGlvbl9tYXNrMzIgJiBVTlNPTElDSVRFRCkpCisJCQlmaW5pc2goKTsKKwl9CisJYWxhcm0oMSk7Cit9CisKK3N0YXRpYyB2b2lkIHJlY3ZfcGFjayh1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4sIHN0cnVjdCBzb2NrYWRkcl9sbCAqRlJPTSkKK3sKKwlzdHJ1Y3QgYXJwaGRyICphaCA9IChzdHJ1Y3QgYXJwaGRyICopIGJ1ZjsKKwl1bnNpZ25lZCBjaGFyICpwID0gKHVuc2lnbmVkIGNoYXIgKikgKGFoICsgMSk7CisJc3RydWN0IGluX2FkZHIgc3JjX2lwLCBkc3RfaXA7CisJLyogbW92ZXMgYmVsb3cgYXNzdW1lIGluX2FkZHIgaXMgNCBieXRlcyBiaWcsIGVuc3VyZSB0aGF0ICovCisJc3RydWN0IEJVR19pbl9hZGRyX211c3RfYmVfNCB7CisJCWNoYXIgQlVHX2luX2FkZHJfbXVzdF9iZV80WworCQkJc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSA9PSA0ID8gMSA6IC0xCisJCV07CisJCWNoYXIgQlVHX3NfYWRkcl9tdXN0X2JlXzRbCisJCQlzaXplb2Yoc3JjX2lwLnNfYWRkcikgPT0gNCA/IDEgOiAtMQorCQldOworCX07CisKKwkvKiBGaWx0ZXIgb3V0IHdpbGQgcGFja2V0cyAqLworCWlmIChGUk9NLT5zbGxfcGt0dHlwZSAhPSBQQUNLRVRfSE9TVAorCSAmJiBGUk9NLT5zbGxfcGt0dHlwZSAhPSBQQUNLRVRfQlJPQURDQVNUCisJICYmIEZST00tPnNsbF9wa3R0eXBlICE9IFBBQ0tFVF9NVUxUSUNBU1QpCisJCXJldHVybjsKKworCS8qIE9ubHkgdGhlc2UgdHlwZXMgYXJlIHJlY29nbml6ZWQgKi8KKwlpZiAoYWgtPmFyX29wICE9IGh0b25zKEFSUE9QX1JFUVVFU1QpICYmIGFoLT5hcl9vcCAhPSBodG9ucyhBUlBPUF9SRVBMWSkpCisJCXJldHVybjsKKworCS8qIEFSUEhSRCBjaGVjayBhbmQgdGhpcyBkYXJuZWQgRkRESSBoYWNrIGhlcmUgOi0oICovCisJaWYgKGFoLT5hcl9ocmQgIT0gaHRvbnMoRlJPTS0+c2xsX2hhdHlwZSkKKwkgJiYgKEZST00tPnNsbF9oYXR5cGUgIT0gQVJQSFJEX0ZEREkgfHwgYWgtPmFyX2hyZCAhPSBodG9ucyhBUlBIUkRfRVRIRVIpKSkKKwkJcmV0dXJuOworCisJLyogUHJvdG9jb2wgbXVzdCBiZSBJUC4gKi8KKwlpZiAoYWgtPmFyX3BybyAhPSBodG9ucyhFVEhfUF9JUCkKKwkgfHwgKGFoLT5hcl9wbG4gIT0gNCkKKwkgfHwgKGFoLT5hcl9obG4gIT0gbWUuc2xsX2hhbGVuKQorCSB8fCAobGVuIDwgKGludCkoc2l6ZW9mKCphaCkgKyAyICogKDQgKyBhaC0+YXJfaGxuKSkpKQorCQlyZXR1cm47CisKKwltb3ZlX2Zyb21fdW5hbGlnbmVkMzIoc3JjX2lwLnNfYWRkciwgcCArIGFoLT5hcl9obG4pOworCW1vdmVfZnJvbV91bmFsaWduZWQzMihkc3RfaXAuc19hZGRyLCBwICsgYWgtPmFyX2hsbiArIDQgKyBhaC0+YXJfaGxuKTsKKworCWlmIChkc3Quc19hZGRyICE9IHNyY19pcC5zX2FkZHIpCisJCXJldHVybjsKKwlpZiAoIShvcHRpb25fbWFzazMyICYgREFEKSkgeworCQlpZiAoKHNyYy5zX2FkZHIgIT0gZHN0X2lwLnNfYWRkcikKKwkJIHx8IChtZW1jbXAocCArIGFoLT5hcl9obG4gKyA0LCAmbWUuc2xsX2FkZHIsIGFoLT5hcl9obG4pKSkKKwkJCXJldHVybjsKKwl9IGVsc2UgeworCQkvKiBEQUQgcGFja2V0IHdhczoKKwkJICAgc3JjX2lwID0gMCAob3Igc29tZSBzcmMpCisJCSAgIHNyY19odyA9IE1FCisJCSAgIGRzdF9pcCA9IHRlc3RlZCBhZGRyZXNzCisJCSAgIGRzdF9odyA9IDx1bnNwZWM+CisKKwkJICAgV2UgZmFpbCwgaWYgcmVjZWl2ZSByZXF1ZXN0L3JlcGx5IHdpdGg6CisJCSAgIHNyY19pcCA9IHRlc3RlZF9hZGRyZXNzCisJCSAgIHNyY19odyAhPSBNRQorCQkgICBpZiBzcmNfaXAgaW4gcmVxdWVzdCB3YXMgbm90IHplcm8sIGNoZWNrCisJCSAgIGFsc28gdGhhdCBpdCBtYXRjaGVzIHRvIGRzdF9pcCwgb3RoZXJ3aXNlCisJCSAgIGRzdF9pcC9kc3RfaHcgZG8gbm90IG1hdHRlci4KKwkJICovCisJCWlmICgobWVtY21wKHAsICZtZS5zbGxfYWRkciwgbWUuc2xsX2hhbGVuKSA9PSAwKQorCQkgfHwgKHNyYy5zX2FkZHIgJiYgc3JjLnNfYWRkciAhPSBkc3RfaXAuc19hZGRyKSkKKwkJCXJldHVybjsKKwl9CisJaWYgKCEob3B0aW9uX21hc2szMiAmIFFVSUVUKSkgeworCQlpbnQgc19wcmludGVkID0gMDsKKworCQlwcmludGYoIiVzY2FzdCByZSVzIGZyb20gJXMgWyVzXSIsCisJCQlGUk9NLT5zbGxfcGt0dHlwZSA9PSBQQUNLRVRfSE9TVCA/ICJVbmkiIDogIkJyb2FkIiwKKwkJCWFoLT5hcl9vcCA9PSBodG9ucyhBUlBPUF9SRVBMWSkgPyAicGx5IiA6ICJxdWVzdCIsCisJCQlpbmV0X250b2Eoc3JjX2lwKSwKKwkJCWV0aGVyX250b2EoKHN0cnVjdCBldGhlcl9hZGRyICopIHApKTsKKwkJaWYgKGRzdF9pcC5zX2FkZHIgIT0gc3JjLnNfYWRkcikgeworCQkJcHJpbnRmKCJmb3IgJXMgIiwgaW5ldF9udG9hKGRzdF9pcCkpOworCQkJc19wcmludGVkID0gMTsKKwkJfQorCQlpZiAobWVtY21wKHAgKyBhaC0+YXJfaGxuICsgNCwgbWUuc2xsX2FkZHIsIGFoLT5hcl9obG4pKSB7CisJCQlpZiAoIXNfcHJpbnRlZCkKKwkJCQlwcmludGYoImZvciAiKTsKKwkJCXByaW50ZigiWyVzXSIsCisJCQkJZXRoZXJfbnRvYSgoc3RydWN0IGV0aGVyX2FkZHIgKikgcCArIGFoLT5hcl9obG4gKyA0KSk7CisJCX0KKworCQlpZiAobGFzdCkgeworCQkJdW5zaWduZWQgZGlmZiA9IE1PTk9UT05JQ19VUygpIC0gbGFzdDsKKwkJCXByaW50ZigiICV1LiUwM3Vtc1xuIiwgZGlmZiAvIDEwMDAsIGRpZmYgJSAxMDAwKTsKKwkJfSBlbHNlIHsKKwkJCXB1dHMoIiBVTlNPTElDSVRFRD8iKTsKKwkJfQorCQlmZmx1c2hfYWxsKCk7CisJfQorCXJlY2VpdmVkKys7CisJaWYgKEZST00tPnNsbF9wa3R0eXBlICE9IFBBQ0tFVF9IT1NUKQorCQlicmRfcmVjdisrOworCWlmIChhaC0+YXJfb3AgPT0gaHRvbnMoQVJQT1BfUkVRVUVTVCkpCisJCXJlcV9yZWN2Kys7CisJaWYgKG9wdGlvbl9tYXNrMzIgJiBRVUlUX09OX1JFUExZKQorCQlmaW5pc2goKTsKKwlpZiAoIShvcHRpb25fbWFzazMyICYgQkNBU1RfT05MWSkpIHsKKwkJbWVtY3B5KGhlLnNsbF9hZGRyLCBwLCBtZS5zbGxfaGFsZW4pOworCQlvcHRpb25fbWFzazMyIHw9IFVOSUNBU1RJTkc7CisJfQorfQorCitpbnQgYXJwaW5nX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBhcnBpbmdfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKmRldmljZSA9ICJldGgwIjsKKwljaGFyICpzb3VyY2UgPSBOVUxMOworCWNoYXIgKnRhcmdldDsKKwl1bnNpZ25lZCBjaGFyICpwYWNrZXQ7CisJY2hhciAqZXJyX3N0cjsKKworCUlOSVRfRygpOworCisJc29ja19mZCA9IHhzb2NrZXQoQUZfUEFDS0VULCBTT0NLX0RHUkFNLCAwKTsKKworCS8vIERyb3Agc3VpZCByb290IHByaXZpbGVnZXMKKwkvLyBOZWVkIHRvIHJlbW92ZSBTVUlEX05FVkVSIGZyb20gYXBwbGV0cy5oIGZvciB0aGlzIHRvIHdvcmsKKwkvL3hzZXR1aWQoZ2V0dWlkKCkpOworCisJeworCQl1bnNpZ25lZCBvcHQ7CisJCWNoYXIgKnN0cl90aW1lb3V0OworCisJCS8qIERhZCBhbHNvIHNldHMgcXVpdF9vbl9yZXBseS4KKwkJICogQWR2ZXJ0IGFsc28gc2V0cyB1bnNvbGljaXRlZC4KKwkJICovCisJCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0xOkRmOkFVOmMrIjsKKwkJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIkRVQXFmYmM6dzpJOnM6IiwKKwkJCQkmY291bnQsICZzdHJfdGltZW91dCwgJmRldmljZSwgJnNvdXJjZSk7CisJCWlmIChvcHQgJiAweDgwKSAvKiAtdzogdGltZW91dCAqLworCQkJdGltZW91dF91cyA9IHhhdG91X3JhbmdlKHN0cl90aW1lb3V0LCAwLCBJTlRfTUFYLzIwMDAwMDApICogMTAwMDAwMCArIDUwMDAwMDsKKwkJLy9pZiAob3B0ICYgMHgyMDApIC8qIC1zOiBzb3VyY2UgKi8KKwkJb3B0aW9uX21hc2szMiAmPSAweDNmOyAvKiBzZXQgcmVzcGVjdGl2ZSBmbGFncyAqLworCX0KKworCXRhcmdldCA9IGFyZ3Zbb3B0aW5kXTsKKwllcnJfc3RyID0geGFzcHJpbnRmKCJpbnRlcmZhY2UgJXMgJSVzIiwgZGV2aWNlKTsKKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSAyOworCisJeworCQlzdHJ1Y3QgaWZyZXEgaWZyOworCisJCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBkZXZpY2UpOworCQkvKiBXZSB1c2UgaWZyLmlmcl9uYW1lIGluIGVycm9yIG1zZyBzbyB0aGF0IHByb2JsZW0KKwkJICogd2l0aCB0cnVuY2F0ZWQgbmFtZSB3aWxsIGJlIHZpc2libGUgKi8KKwkJaW9jdGxfb3JfcGVycm9yX2FuZF9kaWUoc29ja19mZCwgU0lPQ0dJRklOREVYLCAmaWZyLCBlcnJfc3RyLCAibm90IGZvdW5kIik7CisJCW1lLnNsbF9pZmluZGV4ID0gaWZyLmlmcl9pZmluZGV4OworCisJCXhpb2N0bChzb2NrX2ZkLCBTSU9DR0lGRkxBR1MsIChjaGFyICopICZpZnIpOworCisJCWlmICghKGlmci5pZnJfZmxhZ3MgJiBJRkZfVVApKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShlcnJfc3RyLCAiaXMgZG93biIpOworCQl9CisJCWlmIChpZnIuaWZyX2ZsYWdzICYgKElGRl9OT0FSUCB8IElGRl9MT09QQkFDSykpIHsKKwkJCWJiX2Vycm9yX21zZyhlcnJfc3RyLCAiaXMgbm90IEFSUGFibGUiKTsKKwkJCXJldHVybiAob3B0aW9uX21hc2szMiAmIERBRCA/IDAgOiAyKTsKKwkJfQorCX0KKworCS8qIGlmICghaW5ldF9hdG9uKHRhcmdldCwgJmRzdCkpIC0gbm90IG5lZWRlZCAqLyB7CisJCWxlbl9hbmRfc29ja2FkZHIgKmxzYTsKKwkJbHNhID0geGhvc3RfYW5kX2FmMnNvY2thZGRyKHRhcmdldCwgMCwgQUZfSU5FVCk7CisJCWRzdCA9IGxzYS0+dS5zaW4uc2luX2FkZHI7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZyZWUobHNhKTsKKwl9CisKKwlpZiAoc291cmNlICYmICFpbmV0X2F0b24oc291cmNlLCAmc3JjKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBzb3VyY2UgYWRkcmVzcyAlcyIsIHNvdXJjZSk7CisJfQorCisJaWYgKChvcHRpb25fbWFzazMyICYgKERBRHxVTlNPTElDSVRFRCkpID09IFVOU09MSUNJVEVEICYmIHNyYy5zX2FkZHIgPT0gMCkKKwkJc3JjID0gZHN0OworCisJaWYgKCEob3B0aW9uX21hc2szMiAmIERBRCkgfHwgc3JjLnNfYWRkcikgeworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2FkZHI7CisJCWludCBwcm9iZV9mZCA9IHhzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisKKwkJc2V0c29ja29wdF9iaW5kdG9kZXZpY2UocHJvYmVfZmQsIGRldmljZSk7CisJCW1lbXNldCgmc2FkZHIsIDAsIHNpemVvZihzYWRkcikpOworCQlzYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJaWYgKHNyYy5zX2FkZHIpIHsKKwkJCS8qIENoZWNrIHRoYXQgdGhpcyBpcyBpbmRlZWQgb3VyIElQICovCisJCQlzYWRkci5zaW5fYWRkciA9IHNyYzsKKwkJCXhiaW5kKHByb2JlX2ZkLCAoc3RydWN0IHNvY2thZGRyICopICZzYWRkciwgc2l6ZW9mKHNhZGRyKSk7CisJCX0gZWxzZSB7IC8qICEob3B0aW9uX21hc2szMiAmIERBRCkgY2FzZSAqLworCQkJLyogRmluZCBJUCBhZGRyZXNzIG9uIHRoaXMgaWZhY2UgKi8KKwkJCXNvY2tsZW5fdCBhbGVuID0gc2l6ZW9mKHNhZGRyKTsKKworCQkJc2FkZHIuc2luX3BvcnQgPSBodG9ucygxMDI1KTsKKwkJCXNhZGRyLnNpbl9hZGRyID0gZHN0OworCisJCQlpZiAoc2V0c29ja29wdF9TT0xfU09DS0VUXzEocHJvYmVfZmQsIFNPX0RPTlRST1VURSkgIT0gMCkKKwkJCQliYl9wZXJyb3JfbXNnKCJzZXRzb2Nrb3B0KCVzKSIsICJTT19ET05UUk9VVEUiKTsKKwkJCXhjb25uZWN0KHByb2JlX2ZkLCAoc3RydWN0IHNvY2thZGRyICopICZzYWRkciwgc2l6ZW9mKHNhZGRyKSk7CisJCQlnZXRzb2NrbmFtZShwcm9iZV9mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2FkZHIsICZhbGVuKTsKKwkJCS8vbmV2ZXIgaGFwcGVuczoKKwkJCS8vaWYgKGdldHNvY2tuYW1lKHByb2JlX2ZkLCAoc3RydWN0IHNvY2thZGRyICopICZzYWRkciwgJmFsZW4pID09IC0xKQorCQkJLy8JYmJfcGVycm9yX21zZ19hbmRfZGllKCJnZXRzb2NrbmFtZSIpOworCQkJaWYgKHNhZGRyLnNpbl9mYW1pbHkgIT0gQUZfSU5FVCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm8gSVAgYWRkcmVzcyBjb25maWd1cmVkIik7CisJCQlzcmMgPSBzYWRkci5zaW5fYWRkcjsKKwkJfQorCQljbG9zZShwcm9iZV9mZCk7CisJfQorCisJbWUuc2xsX2ZhbWlseSA9IEFGX1BBQ0tFVDsKKwkvL21lLnNsbF9pZmluZGV4ID0gaWZpbmRleDsgLSBkb25lIGJlZm9yZQorCW1lLnNsbF9wcm90b2NvbCA9IGh0b25zKEVUSF9QX0FSUCk7CisJeGJpbmQoc29ja19mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmbWUsIHNpemVvZihtZSkpOworCisJeworCQlzb2NrbGVuX3QgYWxlbiA9IHNpemVvZihtZSk7CisJCWdldHNvY2tuYW1lKHNvY2tfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJm1lLCAmYWxlbik7CisJCS8vbmV2ZXIgaGFwcGVuczoKKwkJLy9pZiAoZ2V0c29ja25hbWUoc29ja19mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmbWUsICZhbGVuKSA9PSAtMSkKKwkJLy8JYmJfcGVycm9yX21zZ19hbmRfZGllKCJnZXRzb2NrbmFtZSIpOworCX0KKwlpZiAobWUuc2xsX2hhbGVuID09IDApIHsKKwkJYmJfZXJyb3JfbXNnKGVycl9zdHIsICJpcyBub3QgQVJQYWJsZSAobm8gbGwgYWRkcmVzcykiKTsKKwkJcmV0dXJuIChvcHRpb25fbWFzazMyICYgREFEID8gMCA6IDIpOworCX0KKwloZSA9IG1lOworCW1lbXNldChoZS5zbGxfYWRkciwgLTEsIGhlLnNsbF9oYWxlbik7CisKKwlpZiAoIShvcHRpb25fbWFzazMyICYgUVVJRVQpKSB7CisJCS8qIGluZXRfbnRvYSB1c2VzIHN0YXRpYyBzdG9yYWdlLCBjYW4ndCB1c2UgaW4gc2FtZSBwcmludGYgKi8KKwkJcHJpbnRmKCJBUlBJTkcgdG8gJXMiLCBpbmV0X250b2EoZHN0KSk7CisJCXByaW50ZigiIGZyb20gJXMgdmlhICVzXG4iLCBpbmV0X250b2Eoc3JjKSwgZGV2aWNlKTsKKwl9CisKKwlzaWduYWxfU0FfUkVTVEFSVF9lbXB0eV9tYXNrKFNJR0lOVCwgICh2b2lkICgqKShpbnQpKWZpbmlzaCk7CisJc2lnbmFsX1NBX1JFU1RBUlRfZW1wdHlfbWFzayhTSUdBTFJNLCAodm9pZCAoKikoaW50KSljYXRjaGVyKTsKKworCWNhdGNoZXIoKTsKKworCXBhY2tldCA9IHhtYWxsb2MoNDA5Nik7CisJd2hpbGUgKDEpIHsKKwkJc2lnc2V0X3Qgc3NldCwgb3NzZXQ7CisJCXN0cnVjdCBzb2NrYWRkcl9sbCBmcm9tOworCQlzb2NrbGVuX3QgYWxlbiA9IHNpemVvZihmcm9tKTsKKwkJaW50IGNjOworCisJCWNjID0gcmVjdmZyb20oc29ja19mZCwgcGFja2V0LCA0MDk2LCAwLCAoc3RydWN0IHNvY2thZGRyICopICZmcm9tLCAmYWxlbik7CisJCWlmIChjYyA8IDApIHsKKwkJCWJiX3BlcnJvcl9tc2coInJlY3Zmcm9tIik7CisJCQljb250aW51ZTsKKwkJfQorCQlzaWdlbXB0eXNldCgmc3NldCk7CisJCXNpZ2FkZHNldCgmc3NldCwgU0lHQUxSTSk7CisJCXNpZ2FkZHNldCgmc3NldCwgU0lHSU5UKTsKKwkJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc3NldCwgJm9zc2V0KTsKKwkJcmVjdl9wYWNrKHBhY2tldCwgY2MsICZmcm9tKTsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvc3NldCwgTlVMTCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9icmN0bC5jIGIvbmV0d29ya2luZy9icmN0bC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwMWE4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL2JyY3RsLmMKQEAgLTAsMCArMSwzNjYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFNtYWxsIGltcGxlbWVudGF0aW9uIG9mIGJyY3RsIGZvciBidXN5Ym94LgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqCisgKiBTb21lIGhlbHBlciBmdW5jdGlvbnMgZnJvbSBicmlkZ2UtdXRpbHMgYXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgTGVubmVydCBCdXl0ZW5oZWsKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisvKiBUaGlzIGFwcGxldCBjdXJyZW50bHkgdXNlcyBvbmx5IHRoZSBpb2N0bCBpbnRlcmZhY2UgYW5kIG5vIHN5c2ZzIGF0IGFsbC4KKyAqIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZyB0aGlzIHdhcyBjb25zaWRlcmVkIGEgZmVhdHVyZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgYnJjdGxfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkNPTU1BTkQgW0JSSURHRSBbSU5URVJGQUNFXV0iCisvL3VzYWdlOiNkZWZpbmUgYnJjdGxfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJNYW5hZ2UgZXRoZXJuZXQgYnJpZGdlc1xuIgorLy91c2FnZTogICAgICJcbkNvbW1hbmRzOiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfQlJDVExfU0hPVygKKy8vdXNhZ2U6ICAgICAiXG4Jc2hvdwkJCVNob3cgYSBsaXN0IG9mIGJyaWRnZXMiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCWFkZGJyIEJSSURHRQkJQ3JlYXRlIEJSSURHRSIKKy8vdXNhZ2U6ICAgICAiXG4JZGVsYnIgQlJJREdFCQlEZWxldGUgQlJJREdFIgorLy91c2FnZTogICAgICJcbglhZGRpZiBCUklER0UgSUZBQ0UJQWRkIElGQUNFIHRvIEJSSURHRSIKKy8vdXNhZ2U6ICAgICAiXG4JZGVsaWYgQlJJREdFIElGQUNFCURlbGV0ZSBJRkFDRSBmcm9tIEJSSURHRSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfQlJDVExfRkFOQ1koCisvL3VzYWdlOiAgICAgIlxuCXNldGFnZWluZyBCUklER0UgVElNRQkJU2V0IGFnZWluZyB0aW1lIgorLy91c2FnZTogICAgICJcbglzZXRmZCBCUklER0UgVElNRQkJU2V0IGJyaWRnZSBmb3J3YXJkIGRlbGF5IgorLy91c2FnZTogICAgICJcbglzZXRoZWxsbyBCUklER0UgVElNRQkJU2V0IGhlbGxvIHRpbWUiCisvL3VzYWdlOiAgICAgIlxuCXNldG1heGFnZSBCUklER0UgVElNRQkJU2V0IG1heCBtZXNzYWdlIGFnZSIKKy8vdXNhZ2U6ICAgICAiXG4Jc2V0cGF0aGNvc3QgQlJJREdFIENPU1QJCVNldCBwYXRoIGNvc3QiCisvL3VzYWdlOiAgICAgIlxuCXNldHBvcnRwcmlvIEJSSURHRSBQUklPCQlTZXQgcG9ydCBwcmlvcml0eSIKKy8vdXNhZ2U6ICAgICAiXG4Jc2V0YnJpZGdlcHJpbyBCUklER0UgUFJJTwlTZXQgYnJpZGdlIHByaW9yaXR5IgorLy91c2FnZTogICAgICJcbglzdHAgQlJJREdFIFsxL3llcy9vbnwwL25vL29mZl0JU1RQIG9uL29mZiIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorCisjaWZuZGVmIFNJT0NCUkFEREJSCisjIGRlZmluZSBTSU9DQlJBRERCUiBCUkNUTF9BRERfQlJJREdFCisjZW5kaWYKKyNpZm5kZWYgU0lPQ0JSREVMQlIKKyMgZGVmaW5lIFNJT0NCUkRFTEJSIEJSQ1RMX0RFTF9CUklER0UKKyNlbmRpZgorI2lmbmRlZiBTSU9DQlJBRERJRgorIyBkZWZpbmUgU0lPQ0JSQURESUYgQlJDVExfQUREX0lGCisjZW5kaWYKKyNpZm5kZWYgU0lPQ0JSREVMSUYKKyMgZGVmaW5lIFNJT0NCUkRFTElGIEJSQ1RMX0RFTF9JRgorI2VuZGlmCisKKworLyogTWF4aW11bSBudW1iZXIgb2YgcG9ydHMgc3VwcG9ydGVkIHBlciBicmlkZ2UgaW50ZXJmYWNlLiAgKi8KKyNpZm5kZWYgTUFYX1BPUlRTCisjIGRlZmluZSBNQVhfUE9SVFMgMzIKKyNlbmRpZgorCisvKiBVc2UgaW50ZXJuYWwgbnVtYmVyIHBhcnNpbmcgYW5kIG5vdCB0aGUgImV4YWN0IiBjb252ZXJzaW9uLiAgKi8KKy8qICNkZWZpbmUgQlJDVExfVVNFX0lOVEVSTkFMIDAgKi8gLyogdXNlIGV4YWN0IGNvbnZlcnNpb24gKi8KKyNkZWZpbmUgQlJDVExfVVNFX0lOVEVSTkFMIDEKKworI2lmIEVOQUJMRV9GRUFUVVJFX0JSQ1RMX0ZBTkNZCisvKiAjaW5jbHVkZSA8bGludXgvaWZfYnJpZGdlLmg+CisgKiBicmVha3Mgb24gbXVzbDogd2UgYWxyZWFkeSBpbmNsdWRlZCBuZXRpbmV0L2luLmggaW4gbGliYmIuaCwKKyAqIGlmIHdlIGluY2x1ZGUgPGxpbnV4L2lmX2JyaWRnZS5oPiBoZXJlLCB3ZSBnZXQgdGhpczoKKyAqIEluIGZpbGUgaW5jbHVkZWQgZnJvbSAvdXNyL2luY2x1ZGUvbGludXgvaWZfYnJpZGdlLmg6MTgsCisgKiAgICAgICAgICAgICAgICAgIGZyb20gbmV0d29ya2luZy9icmN0bC5jOjY3OgorICogL3Vzci9pbmNsdWRlL2xpbnV4L2luNi5oOjMyOiBlcnJvcjogcmVkZWZpbml0aW9uIG9mICdzdHJ1Y3QgaW42X2FkZHInCisgKiAvdXNyL2luY2x1ZGUvbGludXgvaW42Lmg6NDk6IGVycm9yOiByZWRlZmluaXRpb24gb2YgJ3N0cnVjdCBzb2NrYWRkcl9pbjYnCisgKiAvdXNyL2luY2x1ZGUvbGludXgvaW42Lmg6NTk6IGVycm9yOiByZWRlZmluaXRpb24gb2YgJ3N0cnVjdCBpcHY2X21yZXEnCisgKi8KKy8qIEZyb20gPGxpbnV4L2lmX2JyaWRnZS5oPiAqLworI2RlZmluZSBCUkNUTF9HRVRfVkVSU0lPTiAwCisjZGVmaW5lIEJSQ1RMX0dFVF9CUklER0VTIDEKKyNkZWZpbmUgQlJDVExfQUREX0JSSURHRSAyCisjZGVmaW5lIEJSQ1RMX0RFTF9CUklER0UgMworI2RlZmluZSBCUkNUTF9BRERfSUYgNAorI2RlZmluZSBCUkNUTF9ERUxfSUYgNQorI2RlZmluZSBCUkNUTF9HRVRfQlJJREdFX0lORk8gNgorI2RlZmluZSBCUkNUTF9HRVRfUE9SVF9MSVNUIDcKKyNkZWZpbmUgQlJDVExfU0VUX0JSSURHRV9GT1JXQVJEX0RFTEFZIDgKKyNkZWZpbmUgQlJDVExfU0VUX0JSSURHRV9IRUxMT19USU1FIDkKKyNkZWZpbmUgQlJDVExfU0VUX0JSSURHRV9NQVhfQUdFIDEwCisjZGVmaW5lIEJSQ1RMX1NFVF9BR0VJTkdfVElNRSAxMQorI2RlZmluZSBCUkNUTF9TRVRfR0NfSU5URVJWQUwgMTIKKyNkZWZpbmUgQlJDVExfR0VUX1BPUlRfSU5GTyAxMworI2RlZmluZSBCUkNUTF9TRVRfQlJJREdFX1NUUF9TVEFURSAxNAorI2RlZmluZSBCUkNUTF9TRVRfQlJJREdFX1BSSU9SSVRZIDE1CisjZGVmaW5lIEJSQ1RMX1NFVF9QT1JUX1BSSU9SSVRZIDE2CisjZGVmaW5lIEJSQ1RMX1NFVF9QQVRIX0NPU1QgMTcKKyNkZWZpbmUgQlJDVExfR0VUX0ZEQl9FTlRSSUVTIDE4CitzdHJ1Y3QgX19icmlkZ2VfaW5mbyB7CisJdWludDY0X3QgZGVzaWduYXRlZF9yb290OworCXVpbnQ2NF90IGJyaWRnZV9pZDsKKwl1aW50MzJfdCByb290X3BhdGhfY29zdDsKKwl1aW50MzJfdCBtYXhfYWdlOworCXVpbnQzMl90IGhlbGxvX3RpbWU7CisJdWludDMyX3QgZm9yd2FyZF9kZWxheTsKKwl1aW50MzJfdCBicmlkZ2VfbWF4X2FnZTsKKwl1aW50MzJfdCBicmlkZ2VfaGVsbG9fdGltZTsKKwl1aW50MzJfdCBicmlkZ2VfZm9yd2FyZF9kZWxheTsKKwl1aW50OF90ICB0b3BvbG9neV9jaGFuZ2U7CisJdWludDhfdCAgdG9wb2xvZ3lfY2hhbmdlX2RldGVjdGVkOworCXVpbnQ4X3QgIHJvb3RfcG9ydDsKKwl1aW50OF90ICBzdHBfZW5hYmxlZDsKKwl1aW50MzJfdCBhZ2VpbmdfdGltZTsKKwl1aW50MzJfdCBnY19pbnRlcnZhbDsKKwl1aW50MzJfdCBoZWxsb190aW1lcl92YWx1ZTsKKwl1aW50MzJfdCB0Y25fdGltZXJfdmFsdWU7CisJdWludDMyX3QgdG9wb2xvZ3lfY2hhbmdlX3RpbWVyX3ZhbHVlOworCXVpbnQzMl90IGdjX3RpbWVyX3ZhbHVlOworfTsKKy8qIGVuZCA8bGludXgvaWZfYnJpZGdlLmg+ICovCisKKy8qIEZJWE1FOiBUaGVzZSA0IGZ1bmNzIGFyZSBub3QgcmVhbGx5IGNsZWFuIGFuZCBjb3VsZCBiZSBpbXByb3ZlZCAqLworc3RhdGljIEFMV0FZU19JTkxJTkUgdm9pZCBiYl9zdHJ0b3RpbWV2YWwoc3RydWN0IHRpbWV2YWwgKnR2LAorCQljb25zdCBjaGFyICp0aW1lX3N0cikKK3sKKwlkb3VibGUgc2VjczsKKyMgaWYgQlJDVExfVVNFX0lOVEVSTkFMCisJY2hhciAqZW5kcHRyOworCXNlY3MgPSAvKmJiXyovc3RydG9kKHRpbWVfc3RyLCAmZW5kcHRyKTsKKwlpZiAoZW5kcHRyID09IHRpbWVfc3RyKQorIyBlbHNlCisJaWYgKHNzY2FuZih0aW1lX3N0ciwgIiVsZiIsICZzZWNzKSAhPSAxKQorIyBlbmRpZgorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfaW52YWxpZF9hcmcsIHRpbWVfc3RyLCAidGltZXNwZWMiKTsKKwl0di0+dHZfc2VjID0gc2VjczsKKwl0di0+dHZfdXNlYyA9IDEwMDAwMDAgKiAoc2VjcyAtIHR2LT50dl9zZWMpOworfQorCitzdGF0aWMgQUxXQVlTX0lOTElORSB1bnNpZ25lZCBsb25nIHR2X3RvX2ppZmZpZXMoY29uc3Qgc3RydWN0IHRpbWV2YWwgKnR2KQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBqaWY7CisKKwlqaWYgPSAxMDAwMDAwVUxMICogdHYtPnR2X3NlYyArIHR2LT50dl91c2VjOworCisJcmV0dXJuIGppZi8xMDAwMDsKK30KKyMgaWYgMAorc3RhdGljIHZvaWQgamlmZmllc190b190dihzdHJ1Y3QgdGltZXZhbCAqdHYsIHVuc2lnbmVkIGxvbmcgamlmZmllcykKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgdHZ1c2VjOworCisJdHZ1c2VjID0gMTAwMDBVTEwqamlmZmllczsKKwl0di0+dHZfc2VjID0gdHZ1c2VjLzEwMDAwMDA7CisJdHYtPnR2X3VzZWMgPSB0dnVzZWMgLSAxMDAwMDAwICogdHYtPnR2X3NlYzsKK30KKyMgZW5kaWYKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHN0cl90b19qaWZmaWVzKGNvbnN0IGNoYXIgKnRpbWVfc3RyKQoreworCXN0cnVjdCB0aW1ldmFsIHR2OworCWJiX3N0cnRvdGltZXZhbCgmdHYsIHRpbWVfc3RyKTsKKwlyZXR1cm4gdHZfdG9famlmZmllcygmdHYpOworfQorCitzdGF0aWMgdm9pZCBhcm1faW9jdGwodW5zaWduZWQgbG9uZyAqYXJncywKKwkJdW5zaWduZWQgbG9uZyBhcmcwLCB1bnNpZ25lZCBsb25nIGFyZzEsIHVuc2lnbmVkIGxvbmcgYXJnMikKK3sKKwlhcmdzWzBdID0gYXJnMDsKKwlhcmdzWzFdID0gYXJnMTsKKwlhcmdzWzJdID0gYXJnMjsKKwlhcmdzWzNdID0gMDsKK30KKyNlbmRpZgorCisKK2ludCBicmN0bF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgYnJjdGxfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0YXRpYyBjb25zdCBjaGFyIGtleXdvcmRzW10gQUxJR04xID0KKwkJImFkZGJyXDAiICJkZWxiclwwIiAiYWRkaWZcMCIgImRlbGlmXDAiCisJSUZfRkVBVFVSRV9CUkNUTF9GQU5DWSgKKwkJInN0cFwwIgorCQkic2V0YWdlaW5nXDAiICJzZXRmZFwwIiAic2V0aGVsbG9cMCIgInNldG1heGFnZVwwIgorCQkic2V0cGF0aGNvc3RcMCIgInNldHBvcnRwcmlvXDAiICJzZXRicmlkZ2VwcmlvXDAiCisJKQorCUlGX0ZFQVRVUkVfQlJDVExfU0hPVygic2hvd1wwIik7CisKKwllbnVtIHsgQVJHX2FkZGJyID0gMCwgQVJHX2RlbGJyLCBBUkdfYWRkaWYsIEFSR19kZWxpZgorCQlJRl9GRUFUVVJFX0JSQ1RMX0ZBTkNZKCwKKwkJCUFSR19zdHAsCisJCQlBUkdfc2V0YWdlaW5nLCBBUkdfc2V0ZmQsIEFSR19zZXRoZWxsbywgQVJHX3NldG1heGFnZSwKKwkJCUFSR19zZXRwYXRoY29zdCwgQVJHX3NldHBvcnRwcmlvLCBBUkdfc2V0YnJpZGdlcHJpbworCQkpCisJCUlGX0ZFQVRVUkVfQlJDVExfU0hPVygsIEFSR19zaG93KQorCX07CisKKwlpbnQgZmQ7CisJc21hbGxpbnQga2V5OworCXN0cnVjdCBpZnJlcSBpZnI7CisJY2hhciAqYnIsICpicmlmOworCisJYXJndisrOworCXdoaWxlICgqYXJndikgeworI2lmIEVOQUJMRV9GRUFUVVJFX0JSQ1RMX0ZBTkNZCisJCWludCBpZmlkeFtNQVhfUE9SVFNdOworCQl1bnNpZ25lZCBsb25nIGFyZ3NbNF07CisJCWlmci5pZnJfZGF0YSA9IChjaGFyICopICZhcmdzOworI2VuZGlmCisKKwkJa2V5ID0gaW5kZXhfaW5fc3RyaW5ncyhrZXl3b3JkcywgKmFyZ3YpOworCQlpZiAoa2V5ID09IC0xKSAvKiBubyBtYXRjaCBmb3VuZCBpbiBrZXl3b3JkcyBhcnJheSwgYmFpbCBvdXQuICovCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfaW52YWxpZF9hcmcsICphcmd2LCBhcHBsZXRfbmFtZSk7CisJCWFyZ3YrKzsKKwkJZmQgPSB4c29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCAwKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0JSQ1RMX1NIT1cKKwkJaWYgKGtleSA9PSBBUkdfc2hvdykgeyAvKiBzaG93ICovCisJCQljaGFyIGJybmFtZVtJRk5BTVNJWl07CisJCQlpbnQgYnJpZHhbTUFYX1BPUlRTXTsKKwkJCWludCBpLCBudW07CisJCQlhcm1faW9jdGwoYXJncywgQlJDVExfR0VUX0JSSURHRVMsCisJCQkJCQkodW5zaWduZWQgbG9uZykgYnJpZHgsIE1BWF9QT1JUUyk7CisJCQludW0gPSB4aW9jdGwoZmQsIFNJT0NHSUZCUiwgYXJncyk7CisJCQlwdXRzKCJicmlkZ2UgbmFtZVx0YnJpZGdlIGlkXHRcdFNUUCBlbmFibGVkXHRpbnRlcmZhY2VzIik7CisJCQlmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKwkJCQljaGFyIGlmbmFtZVtJRk5BTVNJWl07CisJCQkJaW50IGosIHRhYnM7CisJCQkJc3RydWN0IF9fYnJpZGdlX2luZm8gYmk7CisJCQkJdW5zaWduZWQgY2hhciAqeDsKKworCQkJCWlmICghaWZfaW5kZXh0b25hbWUoYnJpZHhbaV0sIGJybmFtZSkpCisJCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZ2V0IGJyaWRnZSBuYW1lIGZvciBpbmRleCAlZCIsIGkpOworCQkJCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBicm5hbWUpOworCisJCQkJYXJtX2lvY3RsKGFyZ3MsIEJSQ1RMX0dFVF9CUklER0VfSU5GTywKKwkJCQkJCQkodW5zaWduZWQgbG9uZykgJmJpLCAwKTsKKwkJCQl4aW9jdGwoZmQsIFNJT0NERVZQUklWQVRFLCAmaWZyKTsKKwkJCQlwcmludGYoIiVzXHRcdCIsIGJybmFtZSk7CisKKwkJCQkvKiBwcmludCBicmlkZ2UgaWQgKi8KKwkJCQl4ID0gKHVuc2lnbmVkIGNoYXIgKikgJmJpLmJyaWRnZV9pZDsKKwkJCQlmb3IgKGogPSAwOyBqIDwgODsgaisrKSB7CisJCQkJCXByaW50ZigiJTAyeCIsIHhbal0pOworCQkJCQlpZiAoaiA9PSAxKQorCQkJCQkJYmJfcHV0Y2hhcignLicpOworCQkJCX0KKwkJCQlwcmludGYoYmkuc3RwX2VuYWJsZWQgPyAiXHR5ZXMiIDogIlx0bm8iKTsKKworCQkJCS8qIHByaW50IGludGVyZmFjZSBsaXN0ICovCisJCQkJYXJtX2lvY3RsKGFyZ3MsIEJSQ1RMX0dFVF9QT1JUX0xJU1QsCisJCQkJCQkJKHVuc2lnbmVkIGxvbmcpIGlmaWR4LCBNQVhfUE9SVFMpOworCQkJCXhpb2N0bChmZCwgU0lPQ0RFVlBSSVZBVEUsICZpZnIpOworCQkJCXRhYnMgPSAwOworCQkJCWZvciAoaiA9IDA7IGogPCBNQVhfUE9SVFM7IGorKykgeworCQkJCQlpZiAoIWlmaWR4W2pdKQorCQkJCQkJY29udGludWU7CisJCQkJCWlmICghaWZfaW5kZXh0b25hbWUoaWZpZHhbal0sIGlmbmFtZSkpCisJCQkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGdldCBpbnRlcmZhY2UgbmFtZSBmb3IgaW5kZXggJWQiLCBqKTsKKwkJCQkJaWYgKHRhYnMpCisJCQkJCQlwcmludGYoIlx0XHRcdFx0XHQiKTsKKwkJCQkJZWxzZQorCQkJCQkJdGFicyA9IDE7CisJCQkJCXByaW50ZigiXHRcdCVzXG4iLCBpZm5hbWUpOworCQkJCX0KKwkJCQlpZiAoIXRhYnMpICAvKiBicmlkZ2UgaGFzIG5vIGludGVyZmFjZXMgKi8KKwkJCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJCX0KKwkJCWdvdG8gZG9uZTsKKwkJfQorI2VuZGlmCisKKwkJaWYgKCEqYXJndikgLyogYWxsIGJ1dCAnc2hvdycgbmVlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQgKi8KKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKworCQliciA9ICphcmd2Kys7CisKKwkJaWYgKGtleSA9PSBBUkdfYWRkYnIgfHwga2V5ID09IEFSR19kZWxicikgeyAvKiBhZGRiciBvciBkZWxiciAqLworCQkJaW9jdGxfb3JfcGVycm9yX2FuZF9kaWUoZmQsCisJCQkJCWtleSA9PSBBUkdfYWRkYnIgPyBTSU9DQlJBRERCUiA6IFNJT0NCUkRFTEJSLAorCQkJCQliciwgImJyaWRnZSAlcyIsIGJyKTsKKwkJCWdvdG8gZG9uZTsKKwkJfQorCisJCWlmICghKmFyZ3YpIC8qIGFsbCBidXQgJ2FkZGJyL2RlbGJyJyBuZWVkIGF0IGxlYXN0IHR3byBhcmd1bWVudHMgKi8KKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKworCQlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgYnIpOworCQlpZiAoa2V5ID09IEFSR19hZGRpZiB8fCBrZXkgPT0gQVJHX2RlbGlmKSB7IC8qIGFkZGlmIG9yIGRlbGlmICovCisJCQlicmlmID0gKmFyZ3Y7CisJCQlpZnIuaWZyX2lmaW5kZXggPSBpZl9uYW1ldG9pbmRleChicmlmKTsKKwkJCWlmICghaWZyLmlmcl9pZmluZGV4KSB7CisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJpZmFjZSAlcyIsIGJyaWYpOworCQkJfQorCQkJaW9jdGxfb3JfcGVycm9yX2FuZF9kaWUoZmQsCisJCQkJCWtleSA9PSBBUkdfYWRkaWYgPyBTSU9DQlJBRERJRiA6IFNJT0NCUkRFTElGLAorCQkJCQkmaWZyLCAiYnJpZGdlICVzIiwgYnIpOworCQkJZ290byBkb25lX25leHRfYXJndjsKKwkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0JSQ1RMX0ZBTkNZCisJCWlmIChrZXkgPT0gQVJHX3N0cCkgeyAvKiBzdHAgKi8KKwkJCXN0YXRpYyBjb25zdCBjaGFyIG5vX3llc1tdIEFMSUdOMSA9CisJCQkJIjBcMCIgIm9mZlwwIiAiblwwIiAibm9cMCIgICAvKiAwIC4uIDMgKi8KKwkJCQkiMVwwIiAib25cMCIgICJ5XDAiICJ5ZXNcMCI7IC8qIDQgLi4gNyAqLworCQkJaW50IG9ub2ZmID0gaW5kZXhfaW5fc3RyaW5ncyhub195ZXMsICphcmd2KTsKKwkJCWlmIChvbm9mZiA8IDApCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2ludmFsaWRfYXJnLCAqYXJndiwgYXBwbGV0X25hbWUpOworCQkJb25vZmYgPSAodW5zaWduZWQpb25vZmYgLyA0OworCQkJYXJtX2lvY3RsKGFyZ3MsIEJSQ1RMX1NFVF9CUklER0VfU1RQX1NUQVRFLCBvbm9mZiwgMCk7CisJCQlnb3RvIGZpcmU7CisJCX0KKwkJaWYgKCh1bnNpZ25lZCkoa2V5IC0gQVJHX3NldGFnZWluZykgPCA0KSB7IC8qIHRpbWUgcmVsYXRlZCBvcHMgKi8KKwkJCXN0YXRpYyBjb25zdCB1aW50OF90IG9wc1tdIEFMSUdOMSA9IHsKKwkJCQlCUkNUTF9TRVRfQUdFSU5HX1RJTUUsICAgICAgICAgIC8qIEFSR19zZXRhZ2VpbmcgKi8KKwkJCQlCUkNUTF9TRVRfQlJJREdFX0ZPUldBUkRfREVMQVksIC8qIEFSR19zZXRmZCAgICAgKi8KKwkJCQlCUkNUTF9TRVRfQlJJREdFX0hFTExPX1RJTUUsICAgIC8qIEFSR19zZXRoZWxsbyAgKi8KKwkJCQlCUkNUTF9TRVRfQlJJREdFX01BWF9BR0UgICAgICAgIC8qIEFSR19zZXRtYXhhZ2UgKi8KKwkJCX07CisJCQlhcm1faW9jdGwoYXJncywgb3BzW2tleSAtIEFSR19zZXRhZ2VpbmddLCBzdHJfdG9famlmZmllcygqYXJndiksIDApOworCQkJZ290byBmaXJlOworCQl9CisJCWlmIChrZXkgPT0gQVJHX3NldHBhdGhjb3N0CisJCSB8fCBrZXkgPT0gQVJHX3NldHBvcnRwcmlvCisJCSB8fCBrZXkgPT0gQVJHX3NldGJyaWRnZXByaW8KKwkJKSB7CisJCQlzdGF0aWMgY29uc3QgdWludDhfdCBvcHNbXSBBTElHTjEgPSB7CisJCQkJQlJDVExfU0VUX1BBVEhfQ09TVCwgICAgICAvKiBBUkdfc2V0cGF0aGNvc3QgICAqLworCQkJCUJSQ1RMX1NFVF9QT1JUX1BSSU9SSVRZLCAgLyogQVJHX3NldHBvcnRwcmlvICAgKi8KKwkJCQlCUkNUTF9TRVRfQlJJREdFX1BSSU9SSVRZIC8qIEFSR19zZXRicmlkZ2VwcmlvICovCisJCQl9OworCQkJaW50IHBvcnQgPSAtMTsKKwkJCXVuc2lnbmVkIGFyZzEsIGFyZzI7CisKKwkJCWlmIChrZXkgIT0gQVJHX3NldGJyaWRnZXByaW8pIHsKKwkJCQkvKiBnZXQgcG9ydG51bSAqLworCQkJCXVuc2lnbmVkIGk7CisKKwkJCQlwb3J0ID0gaWZfbmFtZXRvaW5kZXgoKmFyZ3YrKyk7CisJCQkJaWYgKCFwb3J0KQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfaW52YWxpZF9hcmcsICphcmd2LCAicG9ydCIpOworCQkJCW1lbXNldChpZmlkeCwgMCwgc2l6ZW9mIGlmaWR4KTsKKwkJCQlhcm1faW9jdGwoYXJncywgQlJDVExfR0VUX1BPUlRfTElTVCwgKHVuc2lnbmVkIGxvbmcpaWZpZHgsCisJCQkJCQlNQVhfUE9SVFMpOworCQkJCXhpb2N0bChmZCwgU0lPQ0RFVlBSSVZBVEUsICZpZnIpOworCQkJCWZvciAoaSA9IDA7IGkgPCBNQVhfUE9SVFM7IGkrKykgeworCQkJCQlpZiAoaWZpZHhbaV0gPT0gcG9ydCkgeworCQkJCQkJcG9ydCA9IGk7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWFyZzEgPSBwb3J0OworCQkJYXJnMiA9IHhhdG9pX3Bvc2l0aXZlKCphcmd2KTsKKwkJCWlmIChrZXkgPT0gQVJHX3NldGJyaWRnZXByaW8pIHsKKwkJCQlhcmcxID0gYXJnMjsKKwkJCQlhcmcyID0gMDsKKwkJCX0KKwkJCWFybV9pb2N0bChhcmdzLCBvcHNba2V5IC0gQVJHX3NldHBhdGhjb3N0XSwgYXJnMSwgYXJnMik7CisJCX0KKyBmaXJlOgorCQkvKiBFeGVjdXRlIHRoZSBwcmV2aW91c2x5IHNldCBjb21tYW5kICovCisJCXhpb2N0bChmZCwgU0lPQ0RFVlBSSVZBVEUsICZpZnIpOworI2VuZGlmCisgZG9uZV9uZXh0X2FyZ3Y6CisJCWFyZ3YrKzsKKyBkb25lOgorCQljbG9zZShmZCk7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvZG5zZC5jIGIvbmV0d29ya2luZy9kbnNkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTIzYWQ2YgotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvZG5zZC5jCkBAIC0wLDAgKzEsNTU5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIEROUyBzZXJ2ZXIgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgUm9iZXJ0byBBLiBGb2dsaWV0dGEgKG1lQHJvYmVydG8uZm9nbGlldHRhLm5hbWUpCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgT2RkIEFyaWxkIE9sc2VuIChvYW8gYXQgZmlidWxhIGRvdCBubykKKyAqIENvcHlyaWdodCAoQykgMjAwMyBQYXVsIFNoZWVyCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBPZGQgQXJpbGQgT2xzZW4gc3RhcnRlZCBvdXQgd2l0aCB0aGUgc2hlZXJkbnMgWzFdIG9mIFBhdWwgU2hlZXIgYW5kIHJld3JvdGUKKyAqIGl0IGludG8gYSBzaGFwZSB3aGljaCBJIGJlbGlldmUgaXMgYm90aCBlYXNpZXIgdG8gdW5kZXJzdGFuZCBhbmQgbWFpbnRhaW4uCisgKiBJIGFsc28gcmV1c2VkIHRoZSBpbnB1dCBidWZmZXIgZm9yIG91dHB1dCBhbmQgcmVtb3ZlZCBzZXJ2aWNlcyBoZSBkaWQgbm90CisgKiBuZWVkLiAgWzFdIGh0dHA6Ly90aHJlYWRpbmcuMjAzOGJ1Zy5jb20vc2hlZXJkbnMvCisgKgorICogU29tZSBidWdmaXggYW5kIG1pbm9yIGNoYW5nZXMgd2FzIGFwcGxpZWQgYnkgUm9iZXJ0byBBLiBGb2dsaWV0dGEgd2hvIG1hZGUKKyAqIHRoZSBmaXJzdCBwb3J0aW5nIG9mIG9hbycgc2NkbnMgdG8gYnVzeWJveCBhbHNvLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBkbnNkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWR2c10gWy1jIENPTkZGSUxFXSBbLXQgVFRMX1NFQ10gWy1wIFBPUlRdIFstaSBBRERSXSIKKy8vdXNhZ2U6I2RlZmluZSBkbnNkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU21hbGwgc3RhdGljIEROUyBzZXJ2ZXIgZGFlbW9uXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jIEZJTEUJQ29uZmlnIGZpbGUiCisvL3VzYWdlOiAgICAgIlxuCS10IFNFQwlUVEwiCisvL3VzYWdlOiAgICAgIlxuCS1wIFBPUlQJTGlzdGVuIG9uIFBPUlQiCisvL3VzYWdlOiAgICAgIlxuCS1pIEFERFIJTGlzdGVuIG9uIEFERFIiCisvL3VzYWdlOiAgICAgIlxuCS1kCURhZW1vbml6ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJU2VuZCBzdWNjZXNzZnVsIHJlcGxpZXMgb25seS4gVXNlIHRoaXMgaWYgeW91IHdhbnQiCisvL3VzYWdlOiAgICAgIlxuCQl0byB1c2UgL2V0Yy9yZXNvbHYuY29uZiB3aXRoIHR3byBuYW1lc2VydmVyIGxpbmVzOiIKKy8vdXNhZ2U6ICAgICAiXG4JCQluYW1lc2VydmVyIEROU0RfU0VSVkVSIgorLy91c2FnZTogICAgICJcbgkJCW5hbWVzZXJ2ZXIgTk9STUFMX0ROU19TRVJWRVIiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5c2xvZy5oPgorCisvLyNkZWZpbmUgREVCVUcgMQorI2RlZmluZSBERUJVRyAwCisKK2VudW0geworCS8qIGNhbiB0d2VhayB0aGlzICovCisJREVGQVVMVF9UVEwgPSAxMjAsCisKKwkvKiBjYW5ub3QgZ2V0IGJpZ2dlciBwYWNrZXRzIHRoYW4gNTEyIHBlciBSRkMxMDM1LiAqLworCU1BWF9QQUNLX0xFTiA9IDUxMiwKKwlJUF9TVFJJTkdfTEVOID0gc2l6ZW9mKCIueHh4Lnh4eC54eHgueHh4IiksCisJTUFYX05BTUVfTEVOID0gSVBfU1RSSU5HX0xFTiAtIDEgKyBzaXplb2YoIi5pbi1hZGRyLmFycGEiKSwKKwlSRVFfQSA9IDEsCisJUkVRX1BUUiA9IDEyLAorfTsKKworLyogdGhlIG1lc3NhZ2UgZnJvbSBjbGllbnQgYW5kIGZpcnN0IHBhcnQgb2YgcmVzcG9uc2UgbXNnICovCitzdHJ1Y3QgZG5zX2hlYWQgeworCXVpbnQxNl90IGlkOworCXVpbnQxNl90IGZsYWdzOworCXVpbnQxNl90IG5xdWVyOworCXVpbnQxNl90IG5hbnN3OworCXVpbnQxNl90IG5hdXRoOworCXVpbnQxNl90IG5hZGQ7Cit9OworLyogU3RydWN0dXJlIHVzZWQgdG8gYWNjZXNzIHR5cGUgYW5kIGNsYXNzIGZpZWxkcy4KKyAqIFRoZXkgYXJlIHRvdGFsbHkgdW5hbGlnbmVkLCBidXQgZ2NjIDQuMy40IHRoaW5rcyB0aGF0IHBvaW50ZXIgb2YgdHlwZSB1aW50MTZfdCoKKyAqIGlzIDE2LWJpdCBhbGlnbmVkIGFuZCByZXBsYWNlcyAxNi1iaXQgbWVtY3B5IChpbiBtb3ZlX2Zyb21fdW5hbGlnbmVkMTYgbWFjcm8pCisgKiB3aXRoIGFsaWduZWQgaGFsZndvcmQgYWNjZXNzIG9uIGFybTkyMHQhCisgKiBPaCB3ZWxsLiBTbGFwcGluZyBQQUNLRUQgZXZlcnl3aGVyZSBzZWVtcyB0byBoZWxwOiAqLworc3RydWN0IHR5cGVfYW5kX2NsYXNzIHsKKwl1aW50MTZfdCB0eXBlIFBBQ0tFRDsKKwl1aW50MTZfdCBjbGFzcyBQQUNLRUQ7Cit9IFBBQ0tFRDsKKy8qIGVsZW1lbnQgb2Yga25vd24gbmFtZSwgaXAgYWRkcmVzcyBhbmQgcmV2ZXJzZWQgaXAgYWRkcmVzcyAqLworc3RydWN0IGRuc19lbnRyeSB7CisJc3RydWN0IGRuc19lbnRyeSAqbmV4dDsKKwl1aW50MzJfdCBpcDsKKwljaGFyIHJpcFtJUF9TVFJJTkdfTEVOXTsgLyogbGVuZ3RoIGRlY2ltYWwgcmV2ZXJzZWQgSVAgKi8KKwljaGFyIG5hbWVbMV07Cit9OworCisjZGVmaW5lIE9QVF92ZXJib3NlIChvcHRpb25fbWFzazMyICYgMSkKKyNkZWZpbmUgT1BUX3NpbGVudCAgKG9wdGlvbl9tYXNrMzIgJiAyKQorCisKKy8qCisgKiBJbnNlcnQgbGVuZ3RoIG9mIHN1YnN0cmluZ3MgaW5zdGVhZCBvZiBkb3RzCisgKi8KK3N0YXRpYyB2b2lkIHVuZG90KGNoYXIgKnJpcCkKK3sKKwlpbnQgaSA9IDA7CisJaW50IHMgPSAwOworCisJd2hpbGUgKHJpcFtpXSkKKwkJaSsrOworCWZvciAoLS1pOyBpID49IDA7IGktLSkgeworCQlpZiAocmlwW2ldID09ICcuJykgeworCQkJcmlwW2ldID0gczsKKwkJCXMgPSAwOworCQl9IGVsc2UgeworCQkJcysrOworCQl9CisJfQorfQorCisvKgorICogUmVhZCBob3N0bmFtZS9JUCByZWNvcmRzIGZyb20gZmlsZQorICovCitzdGF0aWMgc3RydWN0IGRuc19lbnRyeSAqcGFyc2VfY29uZl9maWxlKGNvbnN0IGNoYXIgKmZpbGVjb25mKQoreworCWNoYXIgKnRva2VuWzJdOworCXBhcnNlcl90ICpwYXJzZXI7CisJc3RydWN0IGRuc19lbnRyeSAqbSwgKmNvbmZfZGF0YTsKKwlzdHJ1Y3QgZG5zX2VudHJ5ICoqbmV4dHA7CisKKwljb25mX2RhdGEgPSBOVUxMOworCW5leHRwID0gJmNvbmZfZGF0YTsKKworCXBhcnNlciA9IGNvbmZpZ19vcGVuKGZpbGVjb25mKTsKKwl3aGlsZSAoY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbiwgMiwgMiwgIiMgXHQiLCBQQVJTRV9OT1JNQUwpKSB7CisJCXN0cnVjdCBpbl9hZGRyIGlwOworCQl1aW50MzJfdCB2MzI7CisKKwkJaWYgKGluZXRfYXRvbih0b2tlblsxXSwgJmlwKSA9PSAwKSB7CisJCQliYl9lcnJvcl9tc2coImVycm9yIGF0IGxpbmUgJXUsIHNraXBwaW5nIiwgcGFyc2VyLT5saW5lbm8pOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoT1BUX3ZlcmJvc2UpCisJCQliYl9lcnJvcl9tc2coIm5hbWU6JXMsIGlwOiVzIiwgdG9rZW5bMF0sIHRva2VuWzFdKTsKKworCQkvKiBzaXplb2YoKm0pIGluY2x1ZGVzIDEgYnl0ZSBmb3IgbS0+bmFtZVswXSAqLworCQltID0geHphbGxvYyhzaXplb2YoKm0pICsgc3RybGVuKHRva2VuWzBdKSArIDEpOworCQkvKm0tPm5leHQgPSBOVUxMOyovCisJCSpuZXh0cCA9IG07CisJCW5leHRwID0gJm0tPm5leHQ7CisKKwkJbS0+bmFtZVswXSA9ICcuJzsKKwkJc3RyY3B5KG0tPm5hbWUgKyAxLCB0b2tlblswXSk7CisJCXVuZG90KG0tPm5hbWUpOworCQltLT5pcCA9IGlwLnNfYWRkcjsgLyogaW4gbmV0d29yayBvcmRlciAqLworCQl2MzIgPSBudG9obChtLT5pcCk7CisJCS8qIGludmVydGVkIG9yZGVyICovCisJCXNwcmludGYobS0+cmlwLCAiLiV1LiV1LiV1LiV1IiwKKwkJCSh1aW50OF90KSh2MzIpLAorCQkJKHVpbnQ4X3QpKHYzMiA+PiA4KSwKKwkJCSh1aW50OF90KSh2MzIgPj4gMTYpLAorCQkJKHYzMiA+PiAyNCkKKwkJKTsKKwkJdW5kb3QobS0+cmlwKTsKKwl9CisJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisJcmV0dXJuIGNvbmZfZGF0YTsKK30KKworLyoKKyAqIExvb2sgcXVlcnkgdXAgaW4gZG5zIHJlY29yZHMgYW5kIHJldHVybiBhbnN3ZXIgaWYgZm91bmQuCisgKi8KK3N0YXRpYyBjaGFyICp0YWJsZV9sb29rdXAoc3RydWN0IGRuc19lbnRyeSAqZCwKKwkJdWludDE2X3QgdHlwZSwKKwkJY2hhciogcXVlcnlfc3RyaW5nKQoreworCXdoaWxlIChkKSB7CisJCXVuc2lnbmVkIGxlbiA9IGQtPm5hbWVbMF07CisJCS8qIGQtPm5hbWVbbGVuXSBpcyB0aGUgbGFzdCAobm9uIE5VTCkgY2hhciAqLworI2lmIERFQlVHCisJCWNoYXIgKnAsICpxOworCQlxID0gcXVlcnlfc3RyaW5nICsgMTsKKwkJcCA9IGQtPm5hbWUgKyAxOworCQlmcHJpbnRmKHN0ZGVyciwgIiVkLyVkIHA6JXMgcTolcyAlZFxuIiwKKwkJCShpbnQpc3RybGVuKHApLCBsZW4sCisJCQlwLCBxLCAoaW50KXN0cmxlbihxKQorCQkpOworI2VuZGlmCisJCWlmICh0eXBlID09IGh0b25zKFJFUV9BKSkgeworCQkJLyogc2VhcmNoIGJ5IGhvc3QgbmFtZSAqLworCQkJaWYgKGxlbiAhPSAxIHx8IGQtPm5hbWVbMV0gIT0gJyonKSB7CisvKiB3ZSBhcmUgbGF4LCBob3BlIG5vIG5hbWUgY29tcG9uZW50IGlzIGV2ZXIgPjY0IHNvIHRoYXQgbGVuZ3RoCisgKiAod2hpY2ggd2lsbCBiZSByZXByZXNlbnRlZCBhcyAnQScsJ0InLi4uKSBtYXRjaGVzIGEgbG93ZXJjYXNlIGxldHRlci4KKyAqIEFjdHVhbGx5LCBJIHRoaW5rIGZhbHNlIG1hdGNoZXMgYXJlIGhhcmQgdG8gY29uc3RydWN0LgorICogRXhhbXBsZS4KKyAqIFszMV0gbGVuIGlzIHJlcHJlc2VudGVkIGFzICcxJywgWzY1XSBhcyAnQScsIFs2NSszMl0gYXMgJ2EnLgorICogWzY1XSAgIDw2NSBzYW1lIGNoYXJzPlszMV08MzEgc2FtZSBjaGFycz5OVUwKKyAqIFs2NSszMl08NjUgc2FtZSBjaGFycz4xICAgPDMxIHNhbWUgY2hhcnM+TlVMCisgKiBUaGlzIGV4YW1wbGUgc2VlbXMgdG8gYmUgdGhlIG1pbmltYWwgY2FzZSB3aGVuIGZhbHNlIG1hdGNoIG9jY3Vycy4KKyAqLworCQkJCWlmIChzdHJjYXNlY21wKGQtPm5hbWUsIHF1ZXJ5X3N0cmluZykgIT0gMCkKKwkJCQkJZ290byBuZXh0OworCQkJfQorCQkJcmV0dXJuIChjaGFyICopJmQtPmlwOworI2lmIERFQlVHCisJCQlmcHJpbnRmKHN0ZGVyciwgIkZvdW5kIElQOiV4XG4iLCAoaW50KWQtPmlwKTsKKyNlbmRpZgorCQkJcmV0dXJuIDA7CisJCX0KKwkJLyogc2VhcmNoIGJ5IElQLWFkZHJlc3MgKi8KKwkJaWYgKChsZW4gIT0gMSB8fCBkLT5uYW1lWzFdICE9ICcqJykKKwkJLyogd2UgYXNzdW1lIChkbyBub3QgY2hlY2spIHRoYXQgcXVlcnlfc3RyaW5nCisJCSAqIGVuZHMgaW4gIi5pbi1hZGRyLmFycGEiICovCisJCSAmJiBpc19wcmVmaXhlZF93aXRoKHF1ZXJ5X3N0cmluZywgZC0+cmlwKQorCQkpIHsKKyNpZiBERUJVRworCQkJZnByaW50ZihzdGRlcnIsICJGb3VuZCBuYW1lOiVzXG4iLCBkLT5uYW1lKTsKKyNlbmRpZgorCQkJcmV0dXJuIGQtPm5hbWU7CisJCX0KKyBuZXh0OgorCQlkID0gZC0+bmV4dDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIERlY29kZSBtZXNzYWdlIGFuZCBnZW5lcmF0ZSBhbnN3ZXIKKyAqLworLyogUkZDIDEwMzUKKy4uLgorV2hlbmV2ZXIgYW4gb2N0ZXQgcmVwcmVzZW50cyBhIG51bWVyaWMgcXVhbnRpdHksIHRoZSBsZWZ0IG1vc3QgYml0CitpbiB0aGUgZGlhZ3JhbSBpcyB0aGUgaGlnaCBvcmRlciBvciBtb3N0IHNpZ25pZmljYW50IGJpdC4KK1RoYXQgaXMsIHRoZSBiaXQgbGFiZWxlZCAwIGlzIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdC4KKy4uLgorCis0LjEuMS4gSGVhZGVyIHNlY3Rpb24gZm9ybWF0CisgICAgICAwICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5IDEwIDExIDEyIDEzIDE0IDE1CisgICAgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgSUQgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rCisgICAgfFFSfCAgIE9QQ09ERSAgfEFBfFRDfFJEfFJBfCAwICAwICAwfCAgIFJDT0RFICAgfAorICAgICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICBRRENPVU5UICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworICAgIHwgICAgICAgICAgICAgICAgICAgIEFOQ09VTlQgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgTlNDT1VOVCAgICAgICAgICAgICAgICAgICAgfAorICAgICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICBBUkNPVU5UICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworSUQgICAgICAxNiBiaXQgcmFuZG9tIGlkZW50aWZpZXIgYXNzaWduZWQgYnkgcXVlcnlpbmcgcGVlci4KKyAgICAgICAgVXNlZCB0byBtYXRjaCBxdWVyeS9yZXNwb25zZS4KK1FSICAgICAgbWVzc2FnZSBpcyBhIHF1ZXJ5ICgwKSwgb3IgYSByZXNwb25zZSAoMSkuCitPUENPREUgIDAgICBzdGFuZGFyZCBxdWVyeSAoUVVFUlkpCisgICAgICAgIDEgICBpbnZlcnNlIHF1ZXJ5IChJUVVFUlkpCisgICAgICAgIDIgICBzZXJ2ZXIgc3RhdHVzIHJlcXVlc3QgKFNUQVRVUykKK0FBICAgICAgQXV0aG9yaXRhdGl2ZSBBbnN3ZXIgLSB0aGlzIGJpdCBpcyB2YWxpZCBpbiByZXNwb25zZXMuCisgICAgICAgIFJlc3BvbmRpbmcgbmFtZSBzZXJ2ZXIgaXMgYW4gYXV0aG9yaXR5IGZvciB0aGUgZG9tYWluIG5hbWUKKyAgICAgICAgaW4gcXVlc3Rpb24gc2VjdGlvbi4gQW5zd2VyIHNlY3Rpb24gbWF5IGhhdmUgbXVsdGlwbGUgb3duZXIgbmFtZXMKKyAgICAgICAgYmVjYXVzZSBvZiBhbGlhc2VzLiAgVGhlIEFBIGJpdCBjb3JyZXNwb25kcyB0byB0aGUgbmFtZSB3aGljaCBtYXRjaGVzCisgICAgICAgIHRoZSBxdWVyeSBuYW1lLCBvciB0aGUgZmlyc3Qgb3duZXIgbmFtZSBpbiB0aGUgYW5zd2VyIHNlY3Rpb24uCitUQyAgICAgIFRydW5DYXRpb24gLSB0aGlzIG1lc3NhZ2Ugd2FzIHRydW5jYXRlZC4KK1JEICAgICAgUmVjdXJzaW9uIERlc2lyZWQgLSB0aGlzIGJpdCBtYXkgYmUgc2V0IGluIGEgcXVlcnkgYW5kCisgICAgICAgIGlzIGNvcGllZCBpbnRvIHRoZSByZXNwb25zZS4gIElmIFJEIGlzIHNldCwgaXQgZGlyZWN0cworICAgICAgICB0aGUgbmFtZSBzZXJ2ZXIgdG8gcHVyc3VlIHRoZSBxdWVyeSByZWN1cnNpdmVseS4KKyAgICAgICAgUmVjdXJzaXZlIHF1ZXJ5IHN1cHBvcnQgaXMgb3B0aW9uYWwuCitSQSAgICAgIFJlY3Vyc2lvbiBBdmFpbGFibGUgLSB0aGlzIGJlIGlzIHNldCBvciBjbGVhcmVkIGluIGEKKyAgICAgICAgcmVzcG9uc2UsIGFuZCBkZW5vdGVzIHdoZXRoZXIgcmVjdXJzaXZlIHF1ZXJ5IHN1cHBvcnQgaXMKKyAgICAgICAgYXZhaWxhYmxlIGluIHRoZSBuYW1lIHNlcnZlci4KK1JDT0RFICAgUmVzcG9uc2UgY29kZS4KKyAgICAgICAgMCAgIE5vIGVycm9yIGNvbmRpdGlvbgorICAgICAgICAxICAgRm9ybWF0IGVycm9yCisgICAgICAgIDIgICBTZXJ2ZXIgZmFpbHVyZSAtIHNlcnZlciB3YXMgdW5hYmxlIHRvIHByb2Nlc3MgdGhlIHF1ZXJ5CisgICAgICAgICAgICBkdWUgdG8gYSBwcm9ibGVtIHdpdGggdGhlIG5hbWUgc2VydmVyLgorICAgICAgICAzICAgTmFtZSBFcnJvciAtIG1lYW5pbmdmdWwgb25seSBmb3IgcmVzcG9uc2VzIGZyb20KKyAgICAgICAgICAgIGFuIGF1dGhvcml0YXRpdmUgbmFtZSBzZXJ2ZXIuIFRoZSByZWZlcmVuY2VkIGRvbWFpbiBuYW1lCisgICAgICAgICAgICBkb2VzIG5vdCBleGlzdC4KKyAgICAgICAgNCAgIE5vdCBJbXBsZW1lbnRlZC4KKyAgICAgICAgNSAgIFJlZnVzZWQuCitRRENPVU5UIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBxdWVzdGlvbiBzZWN0aW9uLgorQU5DT1VOVCBudW1iZXIgb2YgcmVjb3JkcyBpbiB0aGUgYW5zd2VyIHNlY3Rpb24uCitOU0NPVU5UIG51bWJlciBvZiByZWNvcmRzIGluIHRoZSBhdXRob3JpdHkgcmVjb3JkcyBzZWN0aW9uLgorQVJDT1VOVCBudW1iZXIgb2YgcmVjb3JkcyBpbiB0aGUgYWRkaXRpb25hbCByZWNvcmRzIHNlY3Rpb24uCisKKzQuMS4yLiBRdWVzdGlvbiBzZWN0aW9uIGZvcm1hdAorCitUaGUgc2VjdGlvbiBjb250YWlucyBRRENPVU5UICh1c3VhbGx5IDEpIGVudHJpZXMsIGVhY2ggb2YgdGhpcyBmb3JtYXQ6CisgICAgICAwICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5IDEwIDExIDEyIDEzIDE0IDE1CisgICAgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworICAgIC8gICAgICAgICAgICAgICAgICAgICBRTkFNRSAgICAgICAgICAgICAgICAgICAgIC8KKyAgICAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvCisgICAgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworICAgIHwgICAgICAgICAgICAgICAgICAgICBRVFlQRSAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgIFFDTEFTUyAgICAgICAgICAgICAgICAgICAgfAorICAgICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKK1FOQU1FICAgYSBkb21haW4gbmFtZSByZXByZXNlbnRlZCBhcyBhIHNlcXVlbmNlIG9mIGxhYmVscywgd2hlcmUKKyAgICAgICAgZWFjaCBsYWJlbCBjb25zaXN0cyBvZiBhIGxlbmd0aCBvY3RldCBmb2xsb3dlZCBieSB0aGF0CisgICAgICAgIG51bWJlciBvZiBvY3RldHMuIFRoZSBkb21haW4gbmFtZSB0ZXJtaW5hdGVzIHdpdGggdGhlCisgICAgICAgIHplcm8gbGVuZ3RoIG9jdGV0IGZvciB0aGUgbnVsbCBsYWJlbCBvZiB0aGUgcm9vdC4gTm90ZQorICAgICAgICB0aGF0IHRoaXMgZmllbGQgbWF5IGJlIGFuIG9kZCBudW1iZXIgb2Ygb2N0ZXRzOyBubworICAgICAgICBwYWRkaW5nIGlzIHVzZWQuCitRVFlQRSAgIGEgdHdvIG9jdGV0IHR5cGUgb2YgdGhlIHF1ZXJ5LgorICAgICAgICAgIDEgYSBob3N0IGFkZHJlc3MgW1JFUV9BIGNvbnN0XQorICAgICAgICAgIDIgYW4gYXV0aG9yaXRhdGl2ZSBuYW1lIHNlcnZlcgorICAgICAgICAgIDMgYSBtYWlsIGRlc3RpbmF0aW9uIChPYnNvbGV0ZSAtIHVzZSBNWCkKKyAgICAgICAgICA0IGEgbWFpbCBmb3J3YXJkZXIgKE9ic29sZXRlIC0gdXNlIE1YKQorICAgICAgICAgIDUgdGhlIGNhbm9uaWNhbCBuYW1lIGZvciBhbiBhbGlhcworICAgICAgICAgIDYgbWFya3MgdGhlIHN0YXJ0IG9mIGEgem9uZSBvZiBhdXRob3JpdHkKKyAgICAgICAgICA3IGEgbWFpbGJveCBkb21haW4gbmFtZSAoRVhQRVJJTUVOVEFMKQorICAgICAgICAgIDggYSBtYWlsIGdyb3VwIG1lbWJlciAoRVhQRVJJTUVOVEFMKQorICAgICAgICAgIDkgYSBtYWlsIHJlbmFtZSBkb21haW4gbmFtZSAoRVhQRVJJTUVOVEFMKQorICAgICAgICAgMTAgYSBudWxsIFJSIChFWFBFUklNRU5UQUwpCisgICAgICAgICAxMSBhIHdlbGwga25vd24gc2VydmljZSBkZXNjcmlwdGlvbgorICAgICAgICAgMTIgYSBkb21haW4gbmFtZSBwb2ludGVyIFtSRVFfUFRSIGNvbnN0XQorICAgICAgICAgMTMgaG9zdCBpbmZvcm1hdGlvbgorICAgICAgICAgMTQgbWFpbGJveCBvciBtYWlsIGxpc3QgaW5mb3JtYXRpb24KKyAgICAgICAgIDE1IG1haWwgZXhjaGFuZ2UKKyAgICAgICAgIDE2IHRleHQgc3RyaW5ncworICAgICAgIDB4MWMgSVB2Nj8KKyAgICAgICAgMjUyIGEgcmVxdWVzdCBmb3IgYSB0cmFuc2ZlciBvZiBhbiBlbnRpcmUgem9uZQorICAgICAgICAyNTMgYSByZXF1ZXN0IGZvciBtYWlsYm94LXJlbGF0ZWQgcmVjb3JkcyAoTUIsIE1HIG9yIE1SKQorICAgICAgICAyNTQgYSByZXF1ZXN0IGZvciBtYWlsIGFnZW50IFJScyAoT2Jzb2xldGUgLSBzZWUgTVgpCisgICAgICAgIDI1NSBhIHJlcXVlc3QgZm9yIGFsbCByZWNvcmRzCitRQ0xBU1MgIGEgdHdvIG9jdGV0IGNvZGUgdGhhdCBzcGVjaWZpZXMgdGhlIGNsYXNzIG9mIHRoZSBxdWVyeS4KKyAgICAgICAgICAxIHRoZSBJbnRlcm5ldAorICAgICAgICAob3RoZXJzIGFyZSBoaXN0b3JpYyBvbmx5KQorICAgICAgICAyNTUgYW55IGNsYXNzCisKKzQuMS4zLiBSZXNvdXJjZSBSZWNvcmQgZm9ybWF0CisKK1RoZSBhbnN3ZXIsIGF1dGhvcml0eSwgYW5kIGFkZGl0aW9uYWwgc2VjdGlvbnMgYWxsIHNoYXJlIHRoZSBzYW1lIGZvcm1hdDoKK2EgdmFyaWFibGUgbnVtYmVyIG9mIHJlc291cmNlIHJlY29yZHMsIHdoZXJlIHRoZSBudW1iZXIgb2YgcmVjb3JkcworaXMgc3BlY2lmaWVkIGluIHRoZSBjb3JyZXNwb25kaW5nIGNvdW50IGZpZWxkIGluIHRoZSBoZWFkZXIuCitFYWNoIHJlc291cmNlIHJlY29yZCBoYXMgdGhpcyBmb3JtYXQ6CisgICAgICAwICAxICAyICAzICA0ICA1ICA2ICA3ICA4ICA5IDEwIDExIDEyIDEzIDE0IDE1CisgICAgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworICAgIC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8KKyAgICAvICAgICAgICAgICAgICAgICAgICAgIE5BTUUgICAgICAgICAgICAgICAgICAgICAvCisgICAgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworICAgIHwgICAgICAgICAgICAgICAgICAgICAgVFlQRSAgICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rCisgICAgfCAgICAgICAgICAgICAgICAgICAgIENMQVNTICAgICAgICAgICAgICAgICAgICAgfAorICAgICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgICAgIFRUTCAgICAgICAgICAgICAgICAgICAgICB8CisgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSstLSsKKyAgICB8ICAgICAgICAgICAgICAgICAgIFJETEVOR1RIICAgICAgICAgICAgICAgICAgICB8CisgICAgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tfAorICAgIC8gICAgICAgICAgICAgICAgICAgICBSREFUQSAgICAgICAgICAgICAgICAgICAgIC8KKyAgICAvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvCisgICAgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworTkFNRSAgICBhIGRvbWFpbiBuYW1lIHRvIHdoaWNoIHRoaXMgcmVzb3VyY2UgcmVjb3JkIHBlcnRhaW5zLgorVFlQRSAgICB0d28gb2N0ZXRzIGNvbnRhaW5pbmcgb25lIG9mIHRoZSBSUiB0eXBlIGNvZGVzLiAgVGhpcworICAgICAgICBmaWVsZCBzcGVjaWZpZXMgdGhlIG1lYW5pbmcgb2YgdGhlIGRhdGEgaW4gdGhlIFJEQVRBIGZpZWxkLgorQ0xBU1MgICB0d28gb2N0ZXRzIHdoaWNoIHNwZWNpZnkgdGhlIGNsYXNzIG9mIHRoZSBkYXRhIGluIHRoZSBSREFUQSBmaWVsZC4KK1RUTCAgICAgYSAzMiBiaXQgdW5zaWduZWQgaW50ZWdlciB0aGF0IHNwZWNpZmllcyB0aGUgdGltZSBpbnRlcnZhbAorICAgICAgICAoaW4gc2Vjb25kcykgdGhhdCB0aGUgcmVjb3JkIG1heSBiZSBjYWNoZWQuCitSRExFTkdUSCBhIDE2IGJpdCBpbnRlZ2VyLCBsZW5ndGggaW4gb2N0ZXRzIG9mIHRoZSBSREFUQSBmaWVsZC4KK1JEQVRBICAgYSB2YXJpYWJsZSBsZW5ndGggc3RyaW5nIG9mIG9jdGV0cyB0aGF0IGRlc2NyaWJlcyB0aGUgcmVzb3VyY2UuCisgICAgICAgIFRoZSBmb3JtYXQgb2YgdGhpcyBpbmZvcm1hdGlvbiB2YXJpZXMgYWNjb3JkaW5nIHRvIHRoZSBUWVBFCisgICAgICAgIGFuZCBDTEFTUyBvZiB0aGUgcmVzb3VyY2UgcmVjb3JkLgorICAgICAgICBJZiB0aGUgVFlQRSBpcyBBIGFuZCB0aGUgQ0xBU1MgaXMgSU4sIGl0J3MgYSA0IG9jdGV0IElQIGFkZHJlc3MuCisKKzQuMS40LiBNZXNzYWdlIGNvbXByZXNzaW9uCisKK0luIG9yZGVyIHRvIHJlZHVjZSB0aGUgc2l6ZSBvZiBtZXNzYWdlcywgZG9tYWluIG5hbWVzIGNvYW4gYmUgY29tcHJlc3NlZC4KK0FuIGVudGlyZSBkb21haW4gbmFtZSBvciBhIGxpc3Qgb2YgbGFiZWxzIGF0IHRoZSBlbmQgb2YgYSBkb21haW4gbmFtZQoraXMgcmVwbGFjZWQgd2l0aCBhIHBvaW50ZXIgdG8gYSBwcmlvciBvY2N1cmFuY2Ugb2YgdGhlIHNhbWUgbmFtZS4KKworVGhlIHBvaW50ZXIgdGFrZXMgdGhlIGZvcm0gb2YgYSB0d28gb2N0ZXQgc2VxdWVuY2U6CisgICAgKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKy0tKworICAgIHwgMSAgMXwgICAgICAgICAgICAgICAgT0ZGU0VUICAgICAgICAgICAgICAgICAgIHwKKyAgICArLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rLS0rCitUaGUgZmlyc3QgdHdvIGJpdHMgYXJlIG9uZXMuICBUaGlzIGFsbG93cyBhIHBvaW50ZXIgdG8gYmUgZGlzdGluZ3Vpc2hlZAorZnJvbSBhIGxhYmVsLCBzaW5jZSB0aGUgbGFiZWwgbXVzdCBiZWdpbiB3aXRoIHR3byB6ZXJvIGJpdHMgYmVjYXVzZQorbGFiZWxzIGFyZSByZXN0cmljdGVkIHRvIDYzIG9jdGV0cyBvciBsZXNzLiAgVGhlIE9GRlNFVCBmaWVsZCBzcGVjaWZpZXMKK2FuIG9mZnNldCBmcm9tIHRoZSBzdGFydCBvZiB0aGUgbWVzc2FnZSAoaS5lLiwgdGhlIGZpcnN0IG9jdGV0CitvZiB0aGUgSUQgZmllbGQgaW4gdGhlIGRvbWFpbiBoZWFkZXIpLgorQSB6ZXJvIG9mZnNldCBzcGVjaWZpZXMgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIElEIGZpZWxkLCBldGMuCitEb21haW4gbmFtZSBpbiBhIG1lc3NhZ2UgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGVpdGhlcjoKKyAgIC0gYSBzZXF1ZW5jZSBvZiBsYWJlbHMgZW5kaW5nIGluIGEgemVybyBvY3RldAorICAgLSBhIHBvaW50ZXIKKyAgIC0gYSBzZXF1ZW5jZSBvZiBsYWJlbHMgZW5kaW5nIHdpdGggYSBwb2ludGVyCisgKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19wYWNrZXQoc3RydWN0IGRuc19lbnRyeSAqY29uZl9kYXRhLAorCQl1aW50MzJfdCBjb25mX3R0bCwKKwkJdWludDhfdCAqYnVmKQoreworCXN0cnVjdCBkbnNfaGVhZCAqaGVhZDsKKwlzdHJ1Y3QgdHlwZV9hbmRfY2xhc3MgKnVuYWxpZ25lZF90eXBlX2NsYXNzOworCWNvbnN0IGNoYXIgKmVycl9tc2c7CisJY2hhciAqcXVlcnlfc3RyaW5nOworCWNoYXIgKmFuc3dzdHI7CisJdWludDhfdCAqYW5zd2I7CisJdWludDE2X3Qgb3V0cl9ybGVuOworCXVpbnQxNl90IG91dHJfZmxhZ3M7CisJdWludDE2X3QgdHlwZTsKKwl1aW50MTZfdCBjbGFzczsKKwlpbnQgcXVlcnlfbGVuOworCisJaGVhZCA9IChzdHJ1Y3QgZG5zX2hlYWQgKilidWY7CisJaWYgKGhlYWQtPm5xdWVyID09IDApIHsKKwkJYmJfZXJyb3JfbXNnKCJwYWNrZXQgaGFzIDAgcXVlcmllcywgaWdub3JlZCIpOworCQlyZXR1cm4gMDsgLyogZG9uJ3QgcmVwbHkgKi8KKwl9CisJaWYgKGhlYWQtPmZsYWdzICYgaHRvbnMoMHg4MDAwKSkgeyAvKiBRUiBiaXQgKi8KKwkJYmJfZXJyb3JfbXNnKCJyZXNwb25zZSBwYWNrZXQsIGlnbm9yZWQiKTsKKwkJcmV0dXJuIDA7IC8qIGRvbid0IHJlcGx5ICovCisJfQorCS8qIFFSID0gMSAicmVzcG9uc2UiLCBSQ09ERSA9IDQgIk5vdCBJbXBsZW1lbnRlZCIgKi8KKwlvdXRyX2ZsYWdzID0gaHRvbnMoMHg4MDAwIHwgNCk7CisJZXJyX21zZyA9IE5VTEw7CisKKwkvKiBzdGFydCBvZiBxdWVyeSBzdHJpbmcgKi8KKwlxdWVyeV9zdHJpbmcgPSAodm9pZCAqKShoZWFkICsgMSk7CisJLyogY2FsbGVyIGd1YXJhbnRlZXMgc3RybGVuIGlzIDw9IE1BWF9QQUNLX0xFTiAqLworCXF1ZXJ5X2xlbiA9IHN0cmxlbihxdWVyeV9zdHJpbmcpICsgMTsKKwkvKiBtYXkgYmUgdW5hbGlnbmVkISAqLworCXVuYWxpZ25lZF90eXBlX2NsYXNzID0gKHZvaWQgKikocXVlcnlfc3RyaW5nICsgcXVlcnlfbGVuKTsKKwlxdWVyeV9sZW4gKz0gc2l6ZW9mKCp1bmFsaWduZWRfdHlwZV9jbGFzcyk7CisJLyogd2hlcmUgdG8gYXBwZW5kIGFuc3dlciBibG9jayAqLworCWFuc3diID0gKHZvaWQgKikodW5hbGlnbmVkX3R5cGVfY2xhc3MgKyAxKTsKKworCS8qIE9QQ09ERSAhPSAwICJzdGFuZGFyZCBxdWVyeSI/ICovCisJaWYgKChoZWFkLT5mbGFncyAmIGh0b25zKDB4NzgwMCkpICE9IDApIHsKKwkJZXJyX21zZyA9ICJvcGNvZGUgIT0gMCI7CisJCWdvdG8gZW1wdHlfcGFja2V0OworCX0KKwltb3ZlX2Zyb21fdW5hbGlnbmVkMTYoY2xhc3MsICZ1bmFsaWduZWRfdHlwZV9jbGFzcy0+Y2xhc3MpOworCWlmIChjbGFzcyAhPSBodG9ucygxKSkgeyAvKiBub3QgY2xhc3MgSU5FVD8gKi8KKwkJZXJyX21zZyA9ICJjbGFzcyAhPSAxIjsKKwkJZ290byBlbXB0eV9wYWNrZXQ7CisJfQorCW1vdmVfZnJvbV91bmFsaWduZWQxNih0eXBlLCAmdW5hbGlnbmVkX3R5cGVfY2xhc3MtPnR5cGUpOworCWlmICh0eXBlICE9IGh0b25zKFJFUV9BKSAmJiB0eXBlICE9IGh0b25zKFJFUV9QVFIpKSB7CisJCS8qIHdlIGNhbid0IGhhbmRsZSB0aGlzIHF1ZXJ5IHR5cGUgKi8KKy8vVE9ETzogaGFwcGVucyBhbGwgdGhlIHRpbWUgd2l0aCBSRVFfQUFBQSAoMHgxYykgcmVxdWVzdHMgLSBpbXBsZW1lbnQgdGhvc2U/CisJCWVycl9tc2cgPSAidHlwZSBpcyAhUkVRX0EgYW5kICFSRVFfUFRSIjsKKwkJZ290byBlbXB0eV9wYWNrZXQ7CisJfQorCisJLyogbG9vayB1cCB0aGUgbmFtZSAqLworCWFuc3dzdHIgPSB0YWJsZV9sb29rdXAoY29uZl9kYXRhLCB0eXBlLCBxdWVyeV9zdHJpbmcpOworI2lmIERFQlVHCisJLyogU2hvd3MgbGVuZ3RocyBpbnN0ZWFkIG9mIGRvdHMsIHVudXNhYmxlIGZvciAhREVCVUcgKi8KKwliYl9lcnJvcl9tc2coIiclcyctPiclcyciLCBxdWVyeV9zdHJpbmcsIGFuc3dzdHIpOworI2VuZGlmCisJb3V0cl9ybGVuID0gNDsKKwlpZiAoYW5zd3N0ciAmJiB0eXBlID09IGh0b25zKFJFUV9QVFIpKSB7CisJCS8qIHJldHVybmluZyBhIGhvc3QgbmFtZSAqLworCQlvdXRyX3JsZW4gPSBzdHJsZW4oYW5zd3N0cikgKyAxOworCX0KKwlpZiAoIWFuc3dzdHIKKwkgfHwgKHVuc2lnbmVkKShhbnN3YiAtIGJ1ZikgKyBxdWVyeV9sZW4gKyA0ICsgMiArIG91dHJfcmxlbiA+IE1BWF9QQUNLX0xFTgorCSkgeworCQkvKiBRUiA9IDEgInJlc3BvbnNlIgorCQkgKiBBQSA9IDEgIkF1dGhvcml0YXRpdmUgQW5zd2VyIgorCQkgKiBSQ09ERSA9IDMgIk5hbWUgRXJyb3IiICovCisJCWVycl9tc2cgPSAibmFtZSBpcyBub3QgZm91bmQiOworCQlvdXRyX2ZsYWdzID0gaHRvbnMoMHg4MDAwIHwgMHgwNDAwIHwgMyk7CisJCWdvdG8gZW1wdHlfcGFja2V0OworCX0KKworCS8qIEFwcGVuZCBhbnN3ZXIgUmVzb3VyY2UgUmVjb3JkICovCisJbWVtY3B5KGFuc3diLCBxdWVyeV9zdHJpbmcsIHF1ZXJ5X2xlbik7IC8qIG5hbWUsIHR5cGUsIGNsYXNzICovCisJYW5zd2IgKz0gcXVlcnlfbGVuOworCW1vdmVfdG9fdW5hbGlnbmVkMzIoKHVpbnQzMl90ICopYW5zd2IsIGh0b25sKGNvbmZfdHRsKSk7CisJYW5zd2IgKz0gNDsKKwltb3ZlX3RvX3VuYWxpZ25lZDE2KCh1aW50MTZfdCAqKWFuc3diLCBodG9ucyhvdXRyX3JsZW4pKTsKKwlhbnN3YiArPSAyOworCW1lbWNweShhbnN3YiwgYW5zd3N0ciwgb3V0cl9ybGVuKTsKKwlhbnN3YiArPSBvdXRyX3JsZW47CisKKwkvKiBRUiA9IDEgInJlc3BvbnNlIiwKKwkgKiBBQSA9IDEgIkF1dGhvcml0YXRpdmUgQW5zd2VyIiwKKwkgKiBUT0RPOiBuZWVkIHRvIHNldCBSQSBiaXQgMHg4MD8gT25lIHVzZXIgc2F5cyBuc2xvb2t1cCBjb21wbGFpbnMKKwkgKiAiR290IHJlY3Vyc2lvbiBub3QgYXZhaWxhYmxlIGZyb20gU0VSVkVSLCB0cnlpbmcgbmV4dCBzZXJ2ZXIiCisJICogIioqIHNlcnZlciBjYW4ndCBmaW5kIEhPU1ROQU1FIgorCSAqIFJDT0RFID0gMCAic3VjY2VzcyIKKwkgKi8KKwlpZiAoT1BUX3ZlcmJvc2UpCisJCWJiX2Vycm9yX21zZygicmV0dXJuaW5nIHBvc2l0aXZlIHJlcGx5Iik7CisJb3V0cl9mbGFncyA9IGh0b25zKDB4ODAwMCB8IDB4MDQwMCB8IDApOworCS8qIHdlIGhhdmUgb25lIGFuc3dlciAqLworCWhlYWQtPm5hbnN3ID0gaHRvbnMoMSk7CisKKyBlbXB0eV9wYWNrZXQ6CisJaWYgKChvdXRyX2ZsYWdzICYgaHRvbnMoMHhmKSkgIT0gMCkgeyAvKiBub3QgYSBwb3NpdGl2ZSByZXNwb25zZSAqLworCQlpZiAoT1BUX3ZlcmJvc2UpIHsKKwkJCWJiX2Vycm9yX21zZygiJXMsICVzIiwKKwkJCQllcnJfbXNnLAorCQkJCU9QVF9zaWxlbnQgPyAiZHJvcHBpbmcgcXVlcnkiIDogInNlbmRpbmcgZXJyb3IgcmVwbHkiCisJCQkpOworCQl9CisJCWlmIChPUFRfc2lsZW50KQorCQkJcmV0dXJuIDA7CisJfQorCWhlYWQtPmZsYWdzIHw9IG91dHJfZmxhZ3M7CisJaGVhZC0+bmF1dGggPSBoZWFkLT5uYWRkID0gMDsKKwloZWFkLT5ucXVlciA9IGh0b25zKDEpOyAvLyB3aHk/Pz8KKworCXJldHVybiBhbnN3YiAtIGJ1ZjsKK30KKworaW50IGRuc2RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGRuc2RfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKmxpc3Rlbl9pbnRlcmZhY2UgPSAiMC4wLjAuMCI7CisJY29uc3QgY2hhciAqZmlsZWNvbmYgPSAiL2V0Yy9kbnNkLmNvbmYiOworCXN0cnVjdCBkbnNfZW50cnkgKmNvbmZfZGF0YTsKKwl1aW50MzJfdCBjb25mX3R0bCA9IERFRkFVTFRfVFRMOworCWNoYXIgKnN0dGwsICpzcG9ydDsKKwlsZW5fYW5kX3NvY2thZGRyICpsc2EsICpmcm9tLCAqdG87CisJdW5zaWduZWQgbHNhX3NpemU7CisJaW50IHVkcHMsIG9wdHM7CisJdWludDE2X3QgcG9ydCA9IDUzOworCS8qIEVuc3VyZSBidWYgaXMgMzJiaXQgYWxpZ25lZCAod2UgbmVlZCAxNmJpdCwgYnV0IDMyYml0IGNhbid0IGh1cnQpICovCisJdWludDhfdCBidWZbTUFYX1BBQ0tfTEVOICsgMV0gQUxJR040OworCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJ2c2k6Yzp0OnA6ZCIsICZsaXN0ZW5faW50ZXJmYWNlLCAmZmlsZWNvbmYsICZzdHRsLCAmc3BvcnQpOworCS8vaWYgKG9wdHMgJiAoMSA8PCAwKSkgLy8gLXYKKwkvL2lmIChvcHRzICYgKDEgPDwgMSkpIC8vIC1zCisJLy9pZiAob3B0cyAmICgxIDw8IDIpKSAvLyAtaQorCS8vaWYgKG9wdHMgJiAoMSA8PCAzKSkgLy8gLWMKKwlpZiAob3B0cyAmICgxIDw8IDQpKSAvLyAtdAorCQljb25mX3R0bCA9IHhhdG91X3JhbmdlKHN0dGwsIDEsIDB4ZmZmZmZmZmYpOworCWlmIChvcHRzICYgKDEgPDwgNSkpIC8vIC1wCisJCXBvcnQgPSB4YXRvdV9yYW5nZShzcG9ydCwgMSwgMHhmZmZmKTsKKwlpZiAob3B0cyAmICgxIDw8IDYpKSB7IC8vIC1kCisJCWJiX2RhZW1vbml6ZV9vcl9yZXhlYyhEQUVNT05fQ0xPU0VfRVhUUkFfRkRTLCBhcmd2KTsKKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgTE9HX1BJRCwgTE9HX0RBRU1PTik7CisJCWxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsKKwl9CisKKwljb25mX2RhdGEgPSBwYXJzZV9jb25mX2ZpbGUoZmlsZWNvbmYpOworCisJbHNhID0geGRvdHRlZDJzb2NrYWRkcihsaXN0ZW5faW50ZXJmYWNlLCBwb3J0KTsKKwl1ZHBzID0geHNvY2tldChsc2EtPnUuc2Euc2FfZmFtaWx5LCBTT0NLX0RHUkFNLCAwKTsKKwl4YmluZCh1ZHBzLCAmbHNhLT51LnNhLCBsc2EtPmxlbik7CisJc29ja2V0X3dhbnRfcGt0aW5mbyh1ZHBzKTsgLyogbmVlZGVkIGZvciByZWN2X2Zyb21fdG8gdG8gd29yayAqLworCWxzYV9zaXplID0gTFNBX0xFTl9TSVpFICsgbHNhLT5sZW47CisJZnJvbSA9IHh6YWxsb2MobHNhX3NpemUpOworCXRvID0geHphbGxvYyhsc2Ffc2l6ZSk7CisKKwl7CisJCWNoYXIgKnAgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZCgmbHNhLT51LnNhKTsKKwkJYmJfZXJyb3JfbXNnKCJhY2NlcHRpbmcgVURQIHBhY2tldHMgb24gJXMiLCBwKTsKKwkJZnJlZShwKTsKKwl9CisKKwl3aGlsZSAoMSkgeworCQlpbnQgcjsKKwkJLyogVHJ5IHRvIGdldCAqREVTVCogYWRkcmVzcyAodG8gd2hpY2ggb2Ygb3VyIGFkZHJlc3NlcworCQkgKiB0aGlzIHF1ZXJ5IHdhcyBkaXJlY3RlZCksIGFuZCByZXBseSBmcm9tIHRoZSBzYW1lIGFkZHJlc3MuCisJCSAqIE9yIGVsc2Ugd2UgY2FuIGV4aGliaXQgdXN1YWwgVURQIHVnbGluZXNzOgorCQkgKiBbaXAxLm11bHRpaG9tZWQuaXAyXSA8PSAgcXVlcnkgdG8gaXAxICA8PSBwZWVyCisJCSAqIFtpcDEubXVsdGlob21lZC5pcDJdID0+IHJlcGx5IGZyb20gaXAyID0+IHBlZXIgKGNvbmZ1c2VkKSAqLworCQltZW1jcHkodG8sIGxzYSwgbHNhX3NpemUpOworCQlyID0gcmVjdl9mcm9tX3RvKHVkcHMsIGJ1ZiwgTUFYX1BBQ0tfTEVOICsgMSwgMCwgJmZyb20tPnUuc2EsICZ0by0+dS5zYSwgbHNhLT5sZW4pOworCQlpZiAociA8IDEyIHx8IHIgPiBNQVhfUEFDS19MRU4pIHsKKwkJCWJiX2Vycm9yX21zZygicGFja2V0IHNpemUgJWQsIGlnbm9yZWQiLCByKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChPUFRfdmVyYm9zZSkKKwkJCWJiX2Vycm9yX21zZygiZ290IFVEUCBwYWNrZXQiKTsKKwkJYnVmW3JdID0gJ1wwJzsgLyogcGFyYW5vaWEgKi8KKwkJciA9IHByb2Nlc3NfcGFja2V0KGNvbmZfZGF0YSwgY29uZl90dGwsIGJ1Zik7CisJCWlmIChyIDw9IDApCisJCQljb250aW51ZTsKKwkJc2VuZF90b19mcm9tKHVkcHMsIGJ1ZiwgciwgMCwgJmZyb20tPnUuc2EsICZ0by0+dS5zYSwgbHNhLT5sZW4pOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvZXRoZXItd2FrZS5jIGIvbmV0d29ya2luZy9ldGhlci13YWtlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM4NTQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvZXRoZXItd2FrZS5jCkBAIC0wLDAgKzEsMjg0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBldGhlci13YWtlLmMgLSBTZW5kIGEgbWFnaWMgcGFja2V0IHRvIHdha2UgdXAgc2xlZXBpbmcgbWFjaGluZXMuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBBdXRob3I6ICAgICAgRG9uYWxkIEJlY2tlciwgaHR0cDovL3d3dy5zY3lsZC5jb20vIjsgaHR0cDovL3d3dy5zY3lsZC5jb20vd2FrZW9ubGFuLmh0bWwKKyAqIEJ1c3lib3ggcG9ydDogQ2hyaXN0aWFuIFZvbGttYW5uIDxoYXZlYW5pY2VkYXlAb25saW5lLmRlPgorICogICAgICAgICAgICAgICBVc2VkIHZlcnNpb24gb2YgZXRoZXItd2FrZS5jOiB2MS4wOSAxMS8xMi8yMDAzIERvbmFsZCBCZWNrZXIsIGh0dHA6Ly93d3cuc2N5bGQuY29tLyI7CisgKi8KKworLyogZnVsbCB1c2FnZSBhY2NvcmRpbmcgRG9uYWxkIEJlY2tlcgorICogdXNhZ2U6IGV0aGVyLXdha2UgWy1pIDxpZm5hbWU+XSBbLXAgYWE6YmI6Y2M6ZGRbOmVlOmZmXV0gMDA6MTE6MjI6MzM6NDQ6NTVcbiIKKyAqCisgKglUaGlzIHByb2dyYW0gZ2VuZXJhdGVzIGFuZCB0cmFuc21pdHMgYSBXYWtlLU9uLUxBTiAoV09MKVxuIgorICoJXCJNYWdpYyBQYWNrZXRcIiwgdXNlZCBmb3IgcmVzdGFydGluZyBtYWNoaW5lcyB0aGF0IGhhdmUgYmVlblxuIgorICoJc29mdC1wb3dlcmVkLWRvd24gKEFDUEkgRDMtd2FybSBzdGF0ZSkuXG4iCisgKglJdCBjdXJyZW50bHkgZ2VuZXJhdGVzIHRoZSBzdGFuZGFyZCBBTUQgTWFnaWMgUGFja2V0IGZvcm1hdCwgd2l0aFxuIgorICoJYW4gb3B0aW9uYWwgcGFzc3dvcmQgYXBwZW5kZWQuXG4iCisgKgorICoJVGhlIHNpbmdsZSByZXF1aXJlZCBwYXJhbWV0ZXIgaXMgdGhlIEV0aGVybmV0IE1BQyAoc3RhdGlvbikgYWRkcmVzc1xuIgorICoJb2YgdGhlIG1hY2hpbmUgdG8gd2FrZSBvciBhIGhvc3QgSUQgd2l0aCBrbm93biBOU1MgJ2V0aGVycycgZW50cnkuXG4iCisgKglUaGUgTUFDIGFkZHJlc3MgbWF5IGJlIGZvdW5kIHdpdGggdGhlICdhcnAnIHByb2dyYW0gd2hpbGUgdGhlIHRhcmdldFxuIgorICoJbWFjaGluZSBpcyBhd2FrZS5cbiIKKyAqCisgKglPcHRpb25zOlxuIgorICoJCS1iCVNlbmQgd2FrZS11cCBwYWNrZXQgdG8gdGhlIGJyb2FkY2FzdCBhZGRyZXNzLlxuIgorICoJCS1ECUluY3JlYXNlIHRoZSBkZWJ1ZyBsZXZlbC5cbiIKKyAqCQktaSBpZm5hbWUJVXNlIGludGVyZmFjZSBJRk5BTUUgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCAnZXRoMCcuXG4iCisgKgkJLXAgPHB3PgkJQXBwZW5kIHRoZSBmb3VyIG9yIHNpeCBieXRlIHBhc3N3b3JkIFBXIHRvIHRoZSBwYWNrZXQuXG4iCisgKgkJCQkJQSBwYXNzd29yZCBpcyBvbmx5IHJlcXVpcmVkIGZvciBhIGZldyBhZGFwdGVyIHR5cGVzLlxuIgorICoJCQkJCVRoZSBwYXNzd29yZCBtYXkgYmUgc3BlY2lmaWVkIGluIGV0aGVybmV0IGhleCBmb3JtYXRcbiIKKyAqCQkJCQlvciBkb3R0ZWQgZGVjaW1hbCAoSW50ZXJuZXQgYWRkcmVzcylcbiIKKyAqCQktcCAwMDoyMjo0NDo2Njo4ODphYVxuIgorICoJCS1wIDE5Mi4xNjguMS4xXG4iOworICoKKyAqCisgKglUaGlzIHByb2dyYW0gZ2VuZXJhdGVzIGFuZCB0cmFuc21pdHMgYSBXYWtlLU9uLUxBTiAoV09MKSAiTWFnaWMgUGFja2V0IiwKKyAqCXVzZWQgZm9yIHJlc3RhcnRpbmcgbWFjaGluZXMgdGhhdCBoYXZlIGJlZW4gc29mdC1wb3dlcmVkLWRvd24KKyAqCShBQ1BJIEQzLXdhcm0gc3RhdGUpLiAgSXQgY3VycmVudGx5IGdlbmVyYXRlcyB0aGUgc3RhbmRhcmQgQU1EIE1hZ2ljIFBhY2tldAorICoJZm9ybWF0LCB3aXRoIGFuIG9wdGlvbmFsIHBhc3N3b3JkIGFwcGVuZGVkLgorICoKKyAqCVRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqCW9mIHRoZSBHTlUgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoJQ29udGFjdCB0aGUgYXV0aG9yIGZvciB1c2UgdW5kZXIgb3RoZXIgdGVybXMuCisgKgorICoJVGhpcyBzb3VyY2UgZmlsZSB3YXMgb3JpZ2luYWxseSBwYXJ0IG9mIHRoZSBuZXR3b3JrIHRyaWNrcyBwYWNrYWdlLCBhbmQKKyAqCWlzIG5vdyBkaXN0cmlidXRlZCB0byBzdXBwb3J0IHRoZSBTY3lsZCBCZW93dWxmIHN5c3RlbS4KKyAqCUNvcHlyaWdodCAxOTk5LTIwMDMgRG9uYWxkIEJlY2tlciBhbmQgU2N5bGQgQ29tcHV0aW5nIENvcnBvcmF0aW9uLgorICoKKyAqCVRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQHNjeWxkLCBvciBDL08KKyAqCVNjeWxkIENvbXB1dGluZyBDb3Jwb3JhdGlvbgorICoJOTE0IEJheSBSaWRnZSBSb2FkLCBTdWl0ZSAyMjAKKyAqCUFubmFwb2xpcyBNRCAyMTQwMworICoKKyAqICAgTm90ZXM6CisgKiAgIE9uIHNvbWUgc3lzdGVtcyBkcm9wcGluZyByb290IGNhcGFiaWxpdHkgYWxsb3dzIHRoZSBwcm9jZXNzIHRvIGJlCisgKiAgIGR1bXBlZCwgdHJhY2VkIG9yIGRlYnVnZ2VkLgorICogICBJZiBzb21lb25lIHRyYWNlcyB0aGlzIHByb2dyYW0sIHRoZXkgZ2V0IGNvbnRyb2wgb2YgYSByYXcgc29ja2V0LgorICogICBMaW51eCBoYW5kbGVzIHRoaXMgc2FmZWx5LCBidXQgYmV3YXJlIHdoZW4gcG9ydGluZyB0aGlzIHByb2dyYW0uCisgKgorICogICBBbiBhbHRlcm5hdGl2ZSB0byBuZWVkaW5nICdyb290JyBpcyB1c2luZyBhIFVEUCBicm9hZGNhc3Qgc29ja2V0LCBob3dldmVyCisgKiAgIGRvaW5nIHNvIG9ubHkgd29ya3Mgd2l0aCBhZGFwdGVycyBjb25maWd1cmVkIGZvciB1bmljYXN0K2Jyb2FkY2FzdCBSeAorICogICBmaWx0ZXIuICBUaGF0IGNvbmZpZ3VyYXRpb24gY29uc3VtZXMgbW9yZSBwb3dlci4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZXRoZXJfd2FrZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1iXSBbLWkgSUZBQ0VdIFstcCBhYTpiYjpjYzpkZFs6ZWU6ZmZdL2EuYi5jLmRdIE1BQyIKKy8vdXNhZ2U6I2RlZmluZSBldGhlcl93YWtlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2VuZCBhIG1hZ2ljIHBhY2tldCB0byB3YWtlIHVwIHNsZWVwaW5nIG1hY2hpbmVzLlxuIgorLy91c2FnZTogICAgICAgIk1BQyBtdXN0IGJlIGEgc3RhdGlvbiBhZGRyZXNzICgwMDoxMToyMjozMzo0NDo1NSkgb3JcbiIKKy8vdXNhZ2U6ICAgICAgICJhIGhvc3RuYW1lIHdpdGggYSBrbm93biAnZXRoZXJzJyBlbnRyeS5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWIJCUJyb2FkY2FzdCB0aGUgcGFja2V0IgorLy91c2FnZTogICAgICJcbgktaSBJRkFDRQlJbnRlcmZhY2UgdG8gdXNlIChkZWZhdWx0IGV0aDApIgorLy91c2FnZTogICAgICJcbgktcCBQQVNTV09SRAlBcHBlbmQgZm91ciBvciBzaXggYnl0ZSBQQVNTV09SRCB0byB0aGUgcGFja2V0IgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxuZXRwYWNrZXQvcGFja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisKKy8qIE5vdGU6IFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQIHdvdWxkIGFsbG93IFNJT0NHSUZIV0FERFIgdG8KKyAqIHdvcmsgYXMgbm9uLXJvb3QsIGJ1dCB3ZSBuZWVkIFNPQ0tfUEFDS0VUIHRvIHNwZWNpZnkgdGhlIEV0aGVybmV0CisgKiBkZXN0aW5hdGlvbiBhZGRyZXNzLgorICovCisjaWZkZWYgUEZfUEFDS0VUCisjIGRlZmluZSB3aGVyZXRvX3Qgc29ja2FkZHJfbGwKKyMgZGVmaW5lIG1ha2Vfc29ja2V0KCkgeHNvY2tldChQRl9QQUNLRVQsIFNPQ0tfUkFXLCAwKQorI2Vsc2UKKyMgZGVmaW5lIHdoZXJldG9fdCBzb2NrYWRkcgorIyBkZWZpbmUgbWFrZV9zb2NrZXQoKSB4c29ja2V0KEFGX0lORVQsIFNPQ0tfUEFDS0VULCBTT0NLX1BBQ0tFVCkKKyNlbmRpZgorCisjaWZkZWYgREVCVUcKKyMgZGVmaW5lIGJiX2RlYnVnX21zZyhmbXQsIGFyZ3MuLi4pIGZwcmludGYoc3RkZXJyLCBmbXQsICMjIGFyZ3MpCit2b2lkIGJiX2RlYnVnX2R1bXBfcGFja2V0KHVuc2lnbmVkIGNoYXIgKm91dHBhY2ssIGludCBwa3RzaXplKQoreworCWludCBpOworCXByaW50ZigicGFja2V0IGR1bXA6XG4iKTsKKwlmb3IgKGkgPSAwOyBpIDwgcGt0c2l6ZTsgKytpKSB7CisJCXByaW50ZigiJTIuMnggIiwgb3V0cGFja1tpXSk7CisJCWlmIChpICUgMjAgPT0gMTkpIGJiX3B1dGNoYXIoJ1xuJyk7CisJfQorCXByaW50ZigiXG5cbiIpOworfQorI2Vsc2UKKyMgZGVmaW5lIGJiX2RlYnVnX21zZyhmbXQsIGFyZ3MuLi4pICAgICAgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgYmJfZGVidWdfZHVtcF9wYWNrZXQob3V0cGFjaywgcGt0c2l6ZSkgKCh2b2lkKTApCisjZW5kaWYKKworLyogQ29udmVydCB0aGUgaG9zdCBJRCBzdHJpbmcgdG8gYSBNQUMgYWRkcmVzcy4KKyAqIFRoZSBzdHJpbmcgbWF5IGJlIGE6CisgKiAgICBIb3N0IG5hbWUKKyAqICAgIElQIGFkZHJlc3Mgc3RyaW5nCisgKiAgICBNQUMgYWRkcmVzcyBzdHJpbmcKKyAqLworc3RhdGljIHZvaWQgZ2V0X2Rlc3RfYWRkcihjb25zdCBjaGFyICpob3N0aWQsIHN0cnVjdCBldGhlcl9hZGRyICplYWRkcikKK3sKKwlzdHJ1Y3QgZXRoZXJfYWRkciAqZWFwOworCisJZWFwID0gZXRoZXJfYXRvbl9yKGhvc3RpZCwgZWFkZHIpOworCWlmIChlYXApIHsKKwkJYmJfZGVidWdfbXNnKCJUaGUgdGFyZ2V0IHN0YXRpb24gYWRkcmVzcyBpcyAlc1xuXG4iLCBldGhlcl9udG9hKGVhcCkpOworI2lmICFkZWZpbmVkKF9fVUNMSUJDX18pIHx8IFVDTElCQ19WRVJTSU9OID49IEtFUk5FTF9WRVJTSU9OKDAsIDksIDMwKQorCX0gZWxzZSBpZiAoZXRoZXJfaG9zdHRvbihob3N0aWQsIGVhZGRyKSA9PSAwKSB7CisJCWJiX2RlYnVnX21zZygiU3RhdGlvbiBhZGRyZXNzIGZvciBob3N0bmFtZSAlcyBpcyAlc1xuXG4iLCBob3N0aWQsIGV0aGVyX250b2EoZWFkZHIpKTsKKyNlbmRpZgorCX0gZWxzZSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9Cit9CisKKyNkZWZpbmUgUEtUX0hFQURFUl9TSVpFICgyMCArIDE2KjYpCitzdGF0aWMgaW50IGZpbGxfcGt0X2hlYWRlcih1bnNpZ25lZCBjaGFyICpwa3QsIHN0cnVjdCBldGhlcl9hZGRyICplYWRkciwgaW50IGJyb2FkY2FzdCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjaGFyICpzdGF0aW9uX2FkZHIgPSBlYWRkci0+ZXRoZXJfYWRkcl9vY3RldDsKKworCW1lbXNldChwa3QsIDB4ZmYsIDYpOworCWlmICghYnJvYWRjYXN0KQorCQltZW1jcHkocGt0LCBzdGF0aW9uX2FkZHIsIDYpOworCXBrdCArPSA2OworCisJbWVtY3B5KHBrdCwgc3RhdGlvbl9hZGRyLCA2KTsgLyogNiAqLworCXBrdCArPSA2OworCisJKnBrdCsrID0gMHgwODsgLyogMTIgKi8gLyogT3IgMHgwODA2IGZvciBBUlAsIDB4ODAzNSBmb3IgUkFSUCAqLworCSpwa3QrKyA9IDB4NDI7IC8qIDEzICovCisKKwltZW1zZXQocGt0LCAweGZmLCA2KTsgLyogMTQgKi8KKworCWZvciAoaSA9IDA7IGkgPCAxNjsgKytpKSB7CisJCXBrdCArPSA2OworCQltZW1jcHkocGt0LCBzdGF0aW9uX2FkZHIsIDYpOyAvKiAyMCwyNiwzMiwuLi4gKi8KKwl9CisKKwlyZXR1cm4gUEtUX0hFQURFUl9TSVpFOyAvKiBsZW5ndGggb2YgcGFja2V0ICovCit9CisKK3N0YXRpYyBpbnQgZ2V0X3dvbF9wdyhjb25zdCBjaGFyICpldGhvcHRhcmcsIHVuc2lnbmVkIGNoYXIgKndvbF9wYXNzd2QpCit7CisJdW5zaWduZWQgcGFzc3dkWzZdOworCWludCBieXRlX2NudCwgaTsKKworCS8qIGhhbmRsZSBNQUMgZm9ybWF0ICovCisJYnl0ZV9jbnQgPSBzc2NhbmYoZXRob3B0YXJnLCAiJTJ4OiUyeDolMng6JTJ4OiUyeDolMngiLAorCSAgICAgICAgICAgICAgICAgICZwYXNzd2RbMF0sICZwYXNzd2RbMV0sICZwYXNzd2RbMl0sCisJICAgICAgICAgICAgICAgICAgJnBhc3N3ZFszXSwgJnBhc3N3ZFs0XSwgJnBhc3N3ZFs1XSk7CisJLyogaGFuZGxlIElQIGZvcm1hdCAqLworLy8gRklYTUU6IHdoeSA8IDQ/PyBzaG91bGQgaXQgYmUgPCA2PworCWlmIChieXRlX2NudCA8IDQpCisJCWJ5dGVfY250ID0gc3NjYW5mKGV0aG9wdGFyZywgIiV1LiV1LiV1LiV1IiwKKwkJICAgICAgICAgICAgICAgICAgJnBhc3N3ZFswXSwgJnBhc3N3ZFsxXSwgJnBhc3N3ZFsyXSwgJnBhc3N3ZFszXSk7CisJaWYgKGJ5dGVfY250IDwgNCkgeworCQliYl9lcnJvcl9tc2coImNhbid0IHJlYWQgV2FrZS1Pbi1MQU4gcGFzcyIpOworCQlyZXR1cm4gMDsKKwl9CisvLyBUT0RPOiBjaGVjayBpbnZhbGlkIG51bWJlcnMgPjI1NT8/CisJZm9yIChpID0gMDsgaSA8IGJ5dGVfY250OyArK2kpCisJCXdvbF9wYXNzd2RbaV0gPSBwYXNzd2RbaV07CisKKwliYl9kZWJ1Z19tc2coInBhc3N3b3JkOiAlMi4yeCAlMi4yeCAlMi4yeCAlMi4yeCAoJWQpXG5cbiIsCisJICAgICAgICAgICAgIHdvbF9wYXNzd2RbMF0sIHdvbF9wYXNzd2RbMV0sIHdvbF9wYXNzd2RbMl0sIHdvbF9wYXNzd2RbM10sCisJICAgICAgICAgICAgIGJ5dGVfY250KTsKKworCXJldHVybiBieXRlX2NudDsKK30KKworaW50IGV0aGVyX3dha2VfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGV0aGVyX3dha2VfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKmlmbmFtZSA9ICJldGgwIjsKKwljaGFyICpwYXNzOworCXVuc2lnbmVkIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgd29sX3Bhc3N3ZFs2XTsKKwlpbnQgd29sX3Bhc3N3ZF9zeiA9IDA7CisJaW50IHM7ICAvKiBSYXcgc29ja2V0ICovCisJaW50IHBrdHNpemU7CisJdW5zaWduZWQgY2hhciBvdXRwYWNrW1BLVF9IRUFERVJfU0laRSArIDYgLyogbWF4IHBhc3N3ZCBzaXplICovICsgMTYgLyogcGFyYW5vaWEgKi9dOworCisJc3RydWN0IGV0aGVyX2FkZHIgZWFkZHI7CisJc3RydWN0IHdoZXJldG9fdCB3aGVyZXRvOyAgLyogd2hvIHRvIHdha2UgdXAgKi8KKworCS8qIGhhbmRsZSBtaXNjIHVzZXIgb3B0aW9ucyAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0xIjsKKwlmbGFncyA9IGdldG9wdDMyKGFyZ3YsICJiaTpwOiIsICZpZm5hbWUsICZwYXNzKTsKKwlpZiAoZmxhZ3MgJiA0KSAvKiAtcCAqLworCQl3b2xfcGFzc3dkX3N6ID0gZ2V0X3dvbF9wdyhwYXNzLCB3b2xfcGFzc3dkKTsKKwlmbGFncyAmPSAxOyAvKiB3ZSBmdXJ0aGVyIGludGVyZXN0ZWQgb25seSBpbiAtYiBbYmNhc3RdIGZsYWcgKi8KKworCS8qIGNyZWF0ZSB0aGUgcmF3IHNvY2tldCAqLworCXMgPSBtYWtlX3NvY2tldCgpOworCisJLyogbm93IHRoYXQgd2UgaGF2ZSBhIHJhdyBzb2NrZXQgd2UgY2FuIGRyb3Agcm9vdCAqLworCS8qIHhzZXR1aWQoZ2V0dWlkKCkpOyAtIGJ1dCBzYXZlIG9uIGNvZGUgc2l6ZS4uLiAqLworCisJLyogbG9vayB1cCB0aGUgZGVzdCBtYWMgYWRkcmVzcyAqLworCWdldF9kZXN0X2FkZHIoYXJndltvcHRpbmRdLCAmZWFkZHIpOworCisJLyogZmlsbCBvdXQgdGhlIGhlYWRlciBvZiB0aGUgcGFja2V0ICovCisJcGt0c2l6ZSA9IGZpbGxfcGt0X2hlYWRlcihvdXRwYWNrLCAmZWFkZHIsIGZsYWdzIC8qICYgMSBPUFRfQlJPQURDQVNUICovKTsKKworCWJiX2RlYnVnX2R1bXBfcGFja2V0KG91dHBhY2ssIHBrdHNpemUpOworCisJLyogRmlsbCBpbiB0aGUgc291cmNlIGFkZHJlc3MsIGlmIHBvc3NpYmxlLiAqLworI2lmZGVmIF9fbGludXhfXworCXsKKwkJc3RydWN0IGlmcmVxIGlmX2h3YWRkcjsKKworCQlzdHJuY3B5X0lGTkFNU0laKGlmX2h3YWRkci5pZnJfbmFtZSwgaWZuYW1lKTsKKwkJaW9jdGxfb3JfcGVycm9yX2FuZF9kaWUocywgU0lPQ0dJRkhXQUREUiwgJmlmX2h3YWRkciwgIlNJT0NHSUZIV0FERFIgb24gJXMgZmFpbGVkIiwgaWZuYW1lKTsKKworCQltZW1jcHkob3V0cGFjays2LCBpZl9od2FkZHIuaWZyX2h3YWRkci5zYV9kYXRhLCA2KTsKKworIyBpZmRlZiBERUJVRworCQl7CisJCQl1bnNpZ25lZCBjaGFyICpod2FkZHIgPSBpZl9od2FkZHIuaWZyX2h3YWRkci5zYV9kYXRhOworCQkJcHJpbnRmKCJUaGUgaGFyZHdhcmUgYWRkcmVzcyAoU0lPQ0dJRkhXQUREUikgb2YgJXMgaXMgdHlwZSAlZCAgIgorCQkJCSIlMi4yeDolMi4yeDolMi4yeDolMi4yeDolMi4yeDolMi4yeFxuXG4iLCBpZm5hbWUsCisJCQkJaWZfaHdhZGRyLmlmcl9od2FkZHIuc2FfZmFtaWx5LCBod2FkZHJbMF0sIGh3YWRkclsxXSwKKwkJCQlod2FkZHJbMl0sIGh3YWRkclszXSwgaHdhZGRyWzRdLCBod2FkZHJbNV0pOworCQl9CisjIGVuZGlmCisJfQorI2VuZGlmIC8qIF9fbGludXhfXyAqLworCisJYmJfZGVidWdfZHVtcF9wYWNrZXQob3V0cGFjaywgcGt0c2l6ZSk7CisKKwkvKiBhcHBlbmQgdGhlIHBhc3N3b3JkIGlmIHNwZWNpZmllZCAqLworCWlmICh3b2xfcGFzc3dkX3N6ID4gMCkgeworCQltZW1jcHkob3V0cGFjaytwa3RzaXplLCB3b2xfcGFzc3dkLCB3b2xfcGFzc3dkX3N6KTsKKwkJcGt0c2l6ZSArPSB3b2xfcGFzc3dkX3N6OworCX0KKworCWJiX2RlYnVnX2R1bXBfcGFja2V0KG91dHBhY2ssIHBrdHNpemUpOworCisJLyogVGhpcyBpcyBuZWNlc3NhcnkgZm9yIGJyb2FkY2FzdHMgdG8gd29yayAqLworCWlmIChmbGFncyAvKiAmIDEgT1BUX0JST0FEQ0FTVCAqLykgeworCQlpZiAoc2V0c29ja29wdF9icm9hZGNhc3QocykgIT0gMCkKKwkJCWJiX3BlcnJvcl9tc2coIlNPX0JST0FEQ0FTVCIpOworCX0KKworI2lmIGRlZmluZWQoUEZfUEFDS0VUKQorCXsKKwkJc3RydWN0IGlmcmVxIGlmcjsKKwkJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGlmbmFtZSk7CisJCXhpb2N0bChzLCBTSU9DR0lGSU5ERVgsICZpZnIpOworCQltZW1zZXQoJndoZXJldG8sIDAsIHNpemVvZih3aGVyZXRvKSk7CisJCXdoZXJldG8uc2xsX2ZhbWlseSA9IEFGX1BBQ0tFVDsKKwkJd2hlcmV0by5zbGxfaWZpbmRleCA9IGlmci5pZnJfaWZpbmRleDsKKwkJLyogVGhlIG1hbnVhbCBwYWdlIGluY29ycmVjdGx5IGNsYWltcyB0aGUgYWRkcmVzcyBtdXN0IGJlIGZpbGxlZC4KKwkJICAgV2UgZG8gc28gYmVjYXVzZSB0aGUgY29kZSBtYXkgY2hhbmdlIHRvIG1hdGNoIHRoZSBkb2NzLiAqLworCQl3aGVyZXRvLnNsbF9oYWxlbiA9IEVUSF9BTEVOOworCQltZW1jcHkod2hlcmV0by5zbGxfYWRkciwgb3V0cGFjaywgRVRIX0FMRU4pOworCX0KKyNlbHNlCisJd2hlcmV0by5zYV9mYW1pbHkgPSAwOworCXN0cmNweSh3aGVyZXRvLnNhX2RhdGEsIGlmbmFtZSk7CisjZW5kaWYKKwl4c2VuZHRvKHMsIG91dHBhY2ssIHBrdHNpemUsIChzdHJ1Y3Qgc29ja2FkZHIgKikmd2hlcmV0bywgc2l6ZW9mKHdoZXJldG8pKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsb3NlKHMpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2Z0cGQuYyBiL25ldHdvcmtpbmcvZnRwZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNDVhZTYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL2Z0cGQuYwpAQCAtMCwwICsxLDE0MDEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFNpbXBsZSBGVFAgZGFlbW9uLCBiYXNlZCBvbiB2c2Z0cGQgMi4wLjcgKHdyaXR0ZW4gYnkgQ2hyaXMgRXZhbnMpCisgKgorICogQXV0aG9yOiBBZGFtIFRrYWMgPHZvbnNjaEBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBPbmx5IHN1YnNldCBvZiBGVFAgcHJvdG9jb2wgaXMgaW1wbGVtZW50ZWQgYnV0IHZhc3QgbWFqb3JpdHkgb2YgY2xpZW50cworICogc2hvdWxkIG5vdCBoYXZlIGFueSBwcm9ibGVtLgorICoKKyAqIFlvdSBoYXZlIHRvIHJ1biB0aGlzIGRhZW1vbiB2aWEgaW5ldGQuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGZ0cGRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstd3ZTXSBbLXQgTl0gWy1UIE5dIFtESVJdIgorLy91c2FnZTojZGVmaW5lIGZ0cGRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJBbm9ueW1vdXMgRlRQIHNlcnZlclxuIgorLy91c2FnZTogICAgICAgIlxuIgorLy91c2FnZTogICAgICAgImZ0cGQgc2hvdWxkIGJlIHVzZWQgYXMgYW4gaW5ldGQgc2VydmljZS5cbiIKKy8vdXNhZ2U6ICAgICAgICJmdHBkJ3MgbGluZSBmb3IgaW5ldGQuY29uZjpcbiIKKy8vdXNhZ2U6ICAgICAgICIJMjEgc3RyZWFtIHRjcCBub3dhaXQgcm9vdCBmdHBkIGZ0cGQgL2ZpbGVzL3RvL3NlcnZlXG4iCisvL3VzYWdlOiAgICAgICAiSXQgYWxzbyBjYW4gYmUgcmFuIGZyb20gdGNwc3ZkOlxuIgorLy91c2FnZTogICAgICAgIgl0Y3BzdmQgLXZFIDAuMC4wLjAgMjEgZnRwZCAvZmlsZXMvdG8vc2VydmVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXcJQWxsb3cgdXBsb2FkIgorLy91c2FnZTogICAgICJcbgktdglMb2cgZXJyb3JzIHRvIHN0ZGVyci4gLXZ2OiB2ZXJib3NlIGxvZyIKKy8vdXNhZ2U6ICAgICAiXG4JLVMJTG9nIGVycm9ycyB0byBzeXNsb2cuIC1TUzogdmVyYm9zZSBsb2ciCisvL3VzYWdlOiAgICAgIlxuCS10LC1UCUlkbGUgYW5kIGFic29sdXRlIHRpbWVvdXRzIgorLy91c2FnZTogICAgICJcbglESVIJQ2hhbmdlIHJvb3QgdG8gdGhpcyBkaXJlY3RvcnkiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5c2xvZy5oPgorI2luY2x1ZGUgPG5ldGluZXQvdGNwLmg+CisKKyNkZWZpbmUgRlRQX0RBVEFDT05OICAgICAgICAgICAgMTUwCisjZGVmaW5lIEZUUF9OT09QT0sgICAgICAgICAgICAgIDIwMAorI2RlZmluZSBGVFBfVFlQRU9LICAgICAgICAgICAgICAyMDAKKyNkZWZpbmUgRlRQX1BPUlRPSyAgICAgICAgICAgICAgMjAwCisjZGVmaW5lIEZUUF9TVFJVT0sgICAgICAgICAgICAgIDIwMAorI2RlZmluZSBGVFBfTU9ERU9LICAgICAgICAgICAgICAyMDAKKyNkZWZpbmUgRlRQX0FMTE9PSyAgICAgICAgICAgICAgMjAyCisjZGVmaW5lIEZUUF9TVEFUT0sgICAgICAgICAgICAgIDIxMQorI2RlZmluZSBGVFBfU1RBVEZJTEVfT0sgICAgICAgICAyMTMKKyNkZWZpbmUgRlRQX0hFTFAgICAgICAgICAgICAgICAgMjE0CisjZGVmaW5lIEZUUF9TWVNUT0sgICAgICAgICAgICAgIDIxNQorI2RlZmluZSBGVFBfR1JFRVQgICAgICAgICAgICAgICAyMjAKKyNkZWZpbmUgRlRQX0dPT0RCWUUgICAgICAgICAgICAgMjIxCisjZGVmaW5lIEZUUF9UUkFOU0ZFUk9LICAgICAgICAgIDIyNgorI2RlZmluZSBGVFBfUEFTVk9LICAgICAgICAgICAgICAyMjcKKy8qI2RlZmluZSBGVFBfRVBSVE9LICAgICAgICAgICAgICAyMjgqLworI2RlZmluZSBGVFBfRVBTVk9LICAgICAgICAgICAgICAyMjkKKyNkZWZpbmUgRlRQX0xPR0lOT0sgICAgICAgICAgICAgMjMwCisjZGVmaW5lIEZUUF9DV0RPSyAgICAgICAgICAgICAgIDI1MAorI2RlZmluZSBGVFBfUk1ESVJPSyAgICAgICAgICAgICAyNTAKKyNkZWZpbmUgRlRQX0RFTEVPSyAgICAgICAgICAgICAgMjUwCisjZGVmaW5lIEZUUF9SRU5BTUVPSyAgICAgICAgICAgIDI1MAorI2RlZmluZSBGVFBfUFdET0sgICAgICAgICAgICAgICAyNTcKKyNkZWZpbmUgRlRQX01LRElST0sgICAgICAgICAgICAgMjU3CisjZGVmaW5lIEZUUF9HSVZFUFdPUkQgICAgICAgICAgIDMzMQorI2RlZmluZSBGVFBfUkVTVE9LICAgICAgICAgICAgICAzNTAKKyNkZWZpbmUgRlRQX1JORlJPSyAgICAgICAgICAgICAgMzUwCisjZGVmaW5lIEZUUF9USU1FT1VUICAgICAgICAgICAgIDQyMQorI2RlZmluZSBGVFBfQkFEU0VORENPTk4gICAgICAgICA0MjUKKyNkZWZpbmUgRlRQX0JBRFNFTkRORVQgICAgICAgICAgNDI2CisjZGVmaW5lIEZUUF9CQURTRU5ERklMRSAgICAgICAgIDQ1MQorI2RlZmluZSBGVFBfQkFEQ01EICAgICAgICAgICAgICA1MDAKKyNkZWZpbmUgRlRQX0NPTU1BTkROT1RJTVBMICAgICAgNTAyCisjZGVmaW5lIEZUUF9ORUVEVVNFUiAgICAgICAgICAgIDUwMworI2RlZmluZSBGVFBfTkVFRFJORlIgICAgICAgICAgICA1MDMKKyNkZWZpbmUgRlRQX0JBRFNUUlUgICAgICAgICAgICAgNTA0CisjZGVmaW5lIEZUUF9CQURNT0RFICAgICAgICAgICAgIDUwNAorI2RlZmluZSBGVFBfTE9HSU5FUlIgICAgICAgICAgICA1MzAKKyNkZWZpbmUgRlRQX0ZJTEVGQUlMICAgICAgICAgICAgNTUwCisjZGVmaW5lIEZUUF9OT1BFUk0gICAgICAgICAgICAgIDU1MAorI2RlZmluZSBGVFBfVVBMT0FERkFJTCAgICAgICAgICA1NTMKKworI2RlZmluZSBTVFIxKHMpICNzCisjZGVmaW5lIFNUUihzKSBTVFIxKHMpCisKKy8qIENvbnZlcnQgYSBjb25zdGFudCB0byAzLWRpZ2l0IHN0cmluZywgcGFja2VkIGludG8gdWludDMyX3QgKi8KK2VudW0geworCS8qIFNoaWZ0IGZvciBOdGggZGVjaW1hbCBkaWdpdCAqLworCVNISUZUMiAgPSAgMCAqIEJCX0xJVFRMRV9FTkRJQU4gKyAyNCAqIEJCX0JJR19FTkRJQU4sCisJU0hJRlQxICA9ICA4ICogQkJfTElUVExFX0VORElBTiArIDE2ICogQkJfQklHX0VORElBTiwKKwlTSElGVDAgID0gMTYgKiBCQl9MSVRUTEVfRU5ESUFOICsgOCAqIEJCX0JJR19FTkRJQU4sCisJLyogQW5kIGZvciA0dGggcG9zaXRpb24gKHNwYWNlKSAqLworCVNISUZUc3AgPSAyNCAqIEJCX0xJVFRMRV9FTkRJQU4gKyAwICogQkJfQklHX0VORElBTiwKK307CisjZGVmaW5lIFNUUk5VTTMyKHMpICh1aW50MzJfdCkoMCBcCisJfCAoKCcwJyArICgocykgLyAxICUgMTApKSA8PCBTSElGVDApIFwKKwl8ICgoJzAnICsgKChzKSAvIDEwICUgMTApKSA8PCBTSElGVDEpIFwKKwl8ICgoJzAnICsgKChzKSAvIDEwMCAlIDEwKSkgPDwgU0hJRlQyKSBcCispCisjZGVmaW5lIFNUUk5VTTMyc3AocykgKHVpbnQzMl90KSgwIFwKKwl8ICgnICcgPDwgU0hJRlRzcCkgXAorCXwgKCgnMCcgKyAoKHMpIC8gMSAlIDEwKSkgPDwgU0hJRlQwKSBcCisJfCAoKCcwJyArICgocykgLyAxMCAlIDEwKSkgPDwgU0hJRlQxKSBcCisJfCAoKCcwJyArICgocykgLyAxMDAgJSAxMCkpIDw8IFNISUZUMikgXAorKQorCisjZGVmaW5lIE1TR19PSyAiT3BlcmF0aW9uIHN1Y2Nlc3NmdWxcclxuIgorI2RlZmluZSBNU0dfRVJSICJFcnJvclxyXG4iCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlpbnQgcGFzdl9saXN0ZW5fZmQ7CisjaWYgIUJCX01NVQorCWludCByb290X2ZkOworI2VuZGlmCisJaW50IGxvY2FsX2ZpbGVfZmQ7CisJdW5zaWduZWQgZW5kX3RpbWU7CisJdW5zaWduZWQgdGltZW91dDsKKwl1bnNpZ25lZCB2ZXJib3NlOworCW9mZl90IGxvY2FsX2ZpbGVfcG9zOworCW9mZl90IHJlc3RhcnRfcG9zOworCWxlbl9hbmRfc29ja2FkZHIgKmxvY2FsX2FkZHI7CisJbGVuX2FuZF9zb2NrYWRkciAqcG9ydF9hZGRyOworCWNoYXIgKmZ0cF9jbWQ7CisJY2hhciAqZnRwX2FyZzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9GVFBfV1JJVEUKKwljaGFyICpybmZyX2ZpbGVuYW1lOworI2VuZGlmCisJLyogV2UgbmVlZCB0aGVzZSBhbGlnbmVkIHRvIHVpbnQzMl90ICovCisJY2hhciBtc2dfb2sgWyhzaXplb2YoIk5OTiAiIE1TR19PSyApICsgMykgJiAweGZmZmNdOworCWNoYXIgbXNnX2Vyclsoc2l6ZW9mKCJOTk4gIiBNU0dfRVJSKSArIDMpICYgMHhmZmZjXTsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCS8qIE1vdmVkIHRvIG1haW4gKi8gXAorCS8qc3RyY3B5KEcubXNnX29rICArIDQsIE1TR19PSyApOyovIFwKKwkvKnN0cmNweShHLm1zZ19lcnIgKyA0LCBNU0dfRVJSKTsqLyBcCit9IHdoaWxlICgwKQorCisKK3N0YXRpYyBjaGFyICoKK2VzY2FwZV90ZXh0KGNvbnN0IGNoYXIgKnByZXBlbmQsIGNvbnN0IGNoYXIgKnN0ciwgdW5zaWduZWQgZXNjYXBlZSkKK3sKKwl1bnNpZ25lZCByZXRsZW4sIHJlbWFpbmxlbiwgY2h1bmtsZW47CisJY2hhciAqcmV0LCAqZm91bmQ7CisJY2hhciBhcHBlbmQ7CisKKwlhcHBlbmQgPSAoY2hhcillc2NhcGVlOworCWVzY2FwZWUgPj49IDg7CisKKwlyZW1haW5sZW4gPSBzdHJsZW4oc3RyKTsKKwlyZXRsZW4gPSBzdHJsZW4ocHJlcGVuZCk7CisJcmV0ID0geG1hbGxvYyhyZXRsZW4gKyByZW1haW5sZW4gKiAyICsgMSArIDEpOworCXN0cmNweShyZXQsIHByZXBlbmQpOworCisJZm9yICg7OykgeworCQlmb3VuZCA9IHN0cmNocm51bChzdHIsIGVzY2FwZWUpOworCQljaHVua2xlbiA9IGZvdW5kIC0gc3RyICsgMTsKKworCQkvKiBDb3B5IGNodW5rIHVwIHRvIGFuZCBpbmNsdWRpbmcgZXNjYXBlZSAob3IgTlVMKSB0byByZXQgKi8KKwkJbWVtY3B5KHJldCArIHJldGxlbiwgc3RyLCBjaHVua2xlbik7CisJCXJldGxlbiArPSBjaHVua2xlbjsKKworCQlpZiAoKmZvdW5kID09ICdcMCcpIHsKKwkJCS8qIEl0IHdhc24ndCBlc2NhcGVlLCBpdCB3YXMgTlVMISAqLworCQkJcmV0W3JldGxlbiAtIDFdID0gYXBwZW5kOyAvKiByZXBsYWNlIE5VTCAqLworCQkJcmV0W3JldGxlbl0gPSAnXDAnOyAvKiBhZGQgTlVMICovCisJCQlicmVhazsKKwkJfQorCQlyZXRbcmV0bGVuKytdID0gZXNjYXBlZTsgLyogZHVwbGljYXRlIGVzY2FwZWUgKi8KKwkJc3RyID0gZm91bmQgKyAxOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBSZXR1cm5zIHN0cmxlbiBhcyBhIGJvbnVzICovCitzdGF0aWMgdW5zaWduZWQKK3JlcGxhY2VfY2hhcihjaGFyICpzdHIsIGNoYXIgZnJvbSwgY2hhciB0bykKK3sKKwljaGFyICpwID0gc3RyOworCXdoaWxlICgqcCkgeworCQlpZiAoKnAgPT0gZnJvbSkKKwkJCSpwID0gdG87CisJCXArKzsKKwl9CisJcmV0dXJuIHAgLSBzdHI7Cit9CisKK3N0YXRpYyB2b2lkCit2ZXJib3NlX2xvZyhjb25zdCBjaGFyICpzdHIpCit7CisJYmJfZXJyb3JfbXNnKCIlLipzIiwgKGludClzdHJjc3BuKHN0ciwgIlxyXG4iKSwgc3RyKTsKK30KKworLyogTkI6IHN0YXR1c19zdHIgaXMgY2hhcls0XSBwYWNrZWQgaW50byB1aW50MzJfdCAqLworc3RhdGljIHZvaWQKK2NtZGlvX3dyaXRlKHVpbnQzMl90IHN0YXR1c19zdHIsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwljaGFyICpyZXNwb25zZTsKKwlpbnQgbGVuOworCisJLyogRlRQIHVzZXMgdGVsbmV0IHByb3RvY29sIGZvciBjb21tYW5kIGxpbmsuCisJICogSW4gdGVsbmV0LCAweGZmIGlzIGFuIGVzY2FwZSBjaGFyLCBhbmQgbmVlZHMgdG8gYmUgZXNjYXBlZDogKi8KKwlyZXNwb25zZSA9IGVzY2FwZV90ZXh0KChjaGFyICopICZzdGF0dXNfc3RyLCBzdHIsICgweGZmIDw8IDgpICsgJ1xyJyk7CisKKwkvKiBGVFAgc2VuZHMgZW1iZWRkZWQgTEZzIGFzIE5VTHMgKi8KKwlsZW4gPSByZXBsYWNlX2NoYXIocmVzcG9uc2UsICdcbicsICdcMCcpOworCisJcmVzcG9uc2VbbGVuKytdID0gJ1xuJzsgLyogdGFjayBvbiB0cmFpbGluZyAnXG4nICovCisJeHdyaXRlKFNURE9VVF9GSUxFTk8sIHJlc3BvbnNlLCBsZW4pOworCWlmIChHLnZlcmJvc2UgPiAxKQorCQl2ZXJib3NlX2xvZyhyZXNwb25zZSk7CisJZnJlZShyZXNwb25zZSk7Cit9CisKK3N0YXRpYyB2b2lkCitjbWRpb193cml0ZV9vayh1bnNpZ25lZCBzdGF0dXMpCit7CisJKih1aW50MzJfdCAqKSBHLm1zZ19vayA9IHN0YXR1czsKKwl4d3JpdGUoU1RET1VUX0ZJTEVOTywgRy5tc2dfb2ssIHNpemVvZigiTk5OICIgTVNHX09LKSAtIDEpOworCWlmIChHLnZlcmJvc2UgPiAxKQorCQl2ZXJib3NlX2xvZyhHLm1zZ19vayk7Cit9CisjZGVmaW5lIFdSSVRFX09LKGEpIGNtZGlvX3dyaXRlX29rKFNUUk5VTTMyc3AoYSkpCisKKy8qIFRPRE86IG91dHB1dCBzdHJlcnIoZXJybm8pIGlmIGVycm5vICE9IDA/ICovCitzdGF0aWMgdm9pZAorY21kaW9fd3JpdGVfZXJyb3IodW5zaWduZWQgc3RhdHVzKQoreworCSoodWludDMyX3QgKikgRy5tc2dfZXJyID0gc3RhdHVzOworCXh3cml0ZShTVERPVVRfRklMRU5PLCBHLm1zZ19lcnIsIHNpemVvZigiTk5OICIgTVNHX0VSUikgLSAxKTsKKwlpZiAoRy52ZXJib3NlID4gMCkKKwkJdmVyYm9zZV9sb2coRy5tc2dfZXJyKTsKK30KKyNkZWZpbmUgV1JJVEVfRVJSKGEpIGNtZGlvX3dyaXRlX2Vycm9yKFNUUk5VTTMyc3AoYSkpCisKK3N0YXRpYyB2b2lkCitjbWRpb193cml0ZV9yYXcoY29uc3QgY2hhciAqcF90ZXh0KQoreworCXh3cml0ZV9zdHIoU1RET1VUX0ZJTEVOTywgcF90ZXh0KTsKKwlpZiAoRy52ZXJib3NlID4gMSkKKwkJdmVyYm9zZV9sb2cocF90ZXh0KTsKK30KKworc3RhdGljIHZvaWQKK3RpbWVvdXRfaGFuZGxlcihpbnQgc2lnIFVOVVNFRF9QQVJBTSkKK3sKKwlvZmZfdCBwb3M7CisJaW50IHN2X2Vycm5vID0gZXJybm87CisKKwlpZiAoKGludCkobW9ub3RvbmljX3NlYygpIC0gRy5lbmRfdGltZSkgPj0gMCkKKwkJZ290byB0aW1lZF9vdXQ7CisKKwlpZiAoIUcubG9jYWxfZmlsZV9mZCkKKwkJZ290byB0aW1lZF9vdXQ7CisKKwlwb3MgPSB4bHNlZWsoRy5sb2NhbF9maWxlX2ZkLCAwLCBTRUVLX0NVUik7CisJaWYgKHBvcyA9PSBHLmxvY2FsX2ZpbGVfcG9zKQorCQlnb3RvIHRpbWVkX291dDsKKwlHLmxvY2FsX2ZpbGVfcG9zID0gcG9zOworCisJYWxhcm0oRy50aW1lb3V0KTsKKwllcnJubyA9IHN2X2Vycm5vOworCXJldHVybjsKKworIHRpbWVkX291dDoKKwljbWRpb193cml0ZV9yYXcoU1RSKEZUUF9USU1FT1VUKSIgVGltZW91dFxyXG4iKTsKKy8qIFRPRE86IGRvIHdlIG5lZWQgdG8gYWJvcnQgKGFzIG9wcG9zZWQgdG8gdXN1YWwgc2h1dGRvd24pIGRhdGEgdHJhbnNmZXI/ICovCisJZXhpdCgxKTsKK30KKworLyogU2ltcGxlIGNvbW1hbmRzICovCisKK3N0YXRpYyB2b2lkCitoYW5kbGVfcHdkKHZvaWQpCit7CisJY2hhciAqY3dkLCAqcmVzcG9uc2U7CisKKwljd2QgPSB4cmVhbGxvY19nZXRjd2Rfb3Jfd2FybihOVUxMKTsKKwlpZiAoY3dkID09IE5VTEwpCisJCWN3ZCA9IHhzdHJkdXAoIiIpOworCisJLyogV2UgaGF2ZSB0byBwcm9tb3RlIGVhY2ggIiB0byAiIiAqLworCXJlc3BvbnNlID0gZXNjYXBlX3RleHQoIiBcIiIsIGN3ZCwgKCciJyA8PCA4KSArICciJyk7CisJZnJlZShjd2QpOworCWNtZGlvX3dyaXRlKFNUUk5VTTMyKEZUUF9QV0RPSyksIHJlc3BvbnNlKTsKKwlmcmVlKHJlc3BvbnNlKTsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9jd2Qodm9pZCkKK3sKKwlpZiAoIUcuZnRwX2FyZyB8fCBjaGRpcihHLmZ0cF9hcmcpICE9IDApIHsKKwkJV1JJVEVfRVJSKEZUUF9GSUxFRkFJTCk7CisJCXJldHVybjsKKwl9CisJV1JJVEVfT0soRlRQX0NXRE9LKTsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9jZHVwKHZvaWQpCit7CisJRy5mdHBfYXJnID0gKGNoYXIqKSIuLiI7CisJaGFuZGxlX2N3ZCgpOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX3N0YXQodm9pZCkKK3sKKwljbWRpb193cml0ZV9yYXcoU1RSKEZUUF9TVEFUT0spIi1TZXJ2ZXIgc3RhdHVzOlxyXG4iCisJCQkiIFRZUEU6IEJJTkFSWVxyXG4iCisJCQlTVFIoRlRQX1NUQVRPSykiIE9rXHJcbiIpOworfQorCisvKiBFeGFtcGxlcyBvZiBIRUxQIGFuZCBGRUFUOgorIyBuYyAtdnZ2IGZ0cC5rZXJuZWwub3JnIDIxCitmdHAua2VybmVsLm9yZyAoMTMwLjIzOS4xNy40OjIxKSBvcGVuCisyMjAgV2VsY29tZSB0byBmdHAua2VybmVsLm9yZy4KK0ZFQVQKKzIxMS1GZWF0dXJlczoKKyBFUFJUCisgRVBTVgorIE1EVE0KKyBQQVNWCisgUkVTVCBTVFJFQU0KKyBTSVpFCisgVFZGUworIFVURjgKKzIxMSBFbmQKK0hFTFAKKzIxNC1UaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFyZSByZWNvZ25pemVkLgorIEFCT1IgQUNDVCBBTExPIEFQUEUgQ0RVUCBDV0QgIERFTEUgRVBSVCBFUFNWIEZFQVQgSEVMUCBMSVNUIE1EVE0gTUtECisgTU9ERSBOTFNUIE5PT1AgT1BUUyBQQVNTIFBBU1YgUE9SVCBQV0QgIFFVSVQgUkVJTiBSRVNUIFJFVFIgUk1EICBSTkZSCisgUk5UTyBTSVRFIFNJWkUgU01OVCBTVEFUIFNUT1IgU1RPVSBTVFJVIFNZU1QgVFlQRSBVU0VSIFhDVVAgWENXRCBYTUtECisgWFBXRCBYUk1ECisyMTQgSGVscCBPSy4KKyovCitzdGF0aWMgdm9pZAoraGFuZGxlX2ZlYXQodW5zaWduZWQgc3RhdHVzKQoreworCWNtZGlvX3dyaXRlKHN0YXR1cywgIi1GZWF0dXJlczoiKTsKKwljbWRpb193cml0ZV9yYXcoIiBFUFNWXHJcbiIKKwkJCSIgUEFTVlxyXG4iCisJCQkiIFJFU1QgU1RSRUFNXHJcbiIKKwkJCSIgTURUTVxyXG4iCisJCQkiIFNJWkVcclxuIik7CisJY21kaW9fd3JpdGUoc3RhdHVzLCAiIE9rIik7Cit9CisKKy8qIERvd25sb2FkIGNvbW1hbmRzICovCisKK3N0YXRpYyBpbmxpbmUgaW50Citwb3J0X2FjdGl2ZSh2b2lkKQoreworCXJldHVybiAoRy5wb3J0X2FkZHIgIT0gTlVMTCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitwYXN2X2FjdGl2ZSh2b2lkKQoreworCXJldHVybiAoRy5wYXN2X2xpc3Rlbl9mZCA+IFNURE9VVF9GSUxFTk8pOworfQorCitzdGF0aWMgdm9pZAorcG9ydF9wYXN2X2NsZWFudXAodm9pZCkKK3sKKwlmcmVlKEcucG9ydF9hZGRyKTsKKwlHLnBvcnRfYWRkciA9IE5VTEw7CisJaWYgKEcucGFzdl9saXN0ZW5fZmQgPiBTVERPVVRfRklMRU5PKQorCQljbG9zZShHLnBhc3ZfbGlzdGVuX2ZkKTsKKwlHLnBhc3ZfbGlzdGVuX2ZkID0gLTE7Cit9CisKKy8qIE9uIGVycm9yLCBlbWl0cyBlcnJvciBjb2RlIHRvIHRoZSBwZWVyICovCitzdGF0aWMgaW50CitmdHBkYXRhaW9fZ2V0X3Bhc3ZfZmQodm9pZCkKK3sKKwlpbnQgcmVtb3RlX2ZkOworCisJcmVtb3RlX2ZkID0gYWNjZXB0KEcucGFzdl9saXN0ZW5fZmQsIE5VTEwsIDApOworCisJaWYgKHJlbW90ZV9mZCA8IDApIHsKKwkJV1JJVEVfRVJSKEZUUF9CQURTRU5EQ09OTik7CisJCXJldHVybiByZW1vdGVfZmQ7CisJfQorCisJc2V0c29ja29wdF9rZWVwYWxpdmUocmVtb3RlX2ZkKTsKKwlyZXR1cm4gcmVtb3RlX2ZkOworfQorCisvKiBDbGVhcnMgcG9ydC9wYXN2IGRhdGEuCisgKiBUaGlzIG1lYW5zIHdlIGRvbnQgd2FzdGUgcmVzb3VyY2VzLCBmb3IgZXhhbXBsZSwga2VlcGluZworICogUEFTViBsaXN0ZW5pbmcgc29ja2V0IG9wZW4gd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgorICogT24gZXJyb3IsIGVtaXRzIGVycm9yIGNvZGUgdG8gdGhlIHBlZXIgKG9yIGV4aXRzKS4KKyAqIE9uIHN1Y2Nlc3MsIGVtaXRzIHBfc3RhdHVzX21zZyB0byB0aGUgcGVlci4KKyAqLworc3RhdGljIGludAorZ2V0X3JlbW90ZV90cmFuc2Zlcl9mZChjb25zdCBjaGFyICpwX3N0YXR1c19tc2cpCit7CisJaW50IHJlbW90ZV9mZDsKKworCWlmIChwYXN2X2FjdGl2ZSgpKQorCQkvKiBPbiBlcnJvciwgZW1pdHMgZXJyb3IgY29kZSB0byB0aGUgcGVlciAqLworCQlyZW1vdGVfZmQgPSBmdHBkYXRhaW9fZ2V0X3Bhc3ZfZmQoKTsKKwllbHNlCisJCS8qIEV4aXRzIG9uIGVycm9yICovCisJCXJlbW90ZV9mZCA9IHhjb25uZWN0X3N0cmVhbShHLnBvcnRfYWRkcik7CisKKwlwb3J0X3Bhc3ZfY2xlYW51cCgpOworCisJaWYgKHJlbW90ZV9mZCA8IDApCisJCXJldHVybiByZW1vdGVfZmQ7CisKKwljbWRpb193cml0ZShTVFJOVU0zMihGVFBfREFUQUNPTk4pLCBwX3N0YXR1c19tc2cpOworCXJldHVybiByZW1vdGVfZmQ7Cit9CisKKy8qIElmIHRoZXJlIHdlcmUgbmVpdGhlciBQQVNWIG5vciBQT1JULCBlbWl0cyBlcnJvciBjb2RlIHRvIHRoZSBwZWVyICovCitzdGF0aWMgaW50Citwb3J0X29yX3Bhc3Zfd2FzX3NlZW4odm9pZCkKK3sKKwlpZiAoIXBhc3ZfYWN0aXZlKCkgJiYgIXBvcnRfYWN0aXZlKCkpIHsKKwkJY21kaW9fd3JpdGVfcmF3KFNUUihGVFBfQkFEU0VORENPTk4pIiBVc2UgUE9SVC9QQVNWIGZpcnN0XHJcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworLyogRXhpdHMgb24gZXJyb3IgKi8KK3N0YXRpYyB1bnNpZ25lZAorYmluZF9mb3JfcGFzc2l2ZV9tb2RlKHZvaWQpCit7CisJaW50IGZkOworCXVuc2lnbmVkIHBvcnQ7CisKKwlwb3J0X3Bhc3ZfY2xlYW51cCgpOworCisJRy5wYXN2X2xpc3Rlbl9mZCA9IGZkID0geHNvY2tldChHLmxvY2FsX2FkZHItPnUuc2Euc2FfZmFtaWx5LCBTT0NLX1NUUkVBTSwgMCk7CisJc2V0c29ja29wdF9yZXVzZWFkZHIoZmQpOworCisJc2V0X25wb3J0KCZHLmxvY2FsX2FkZHItPnUuc2EsIDApOworCXhiaW5kKGZkLCAmRy5sb2NhbF9hZGRyLT51LnNhLCBHLmxvY2FsX2FkZHItPmxlbik7CisJeGxpc3RlbihmZCwgMSk7CisJZ2V0c29ja25hbWUoZmQsICZHLmxvY2FsX2FkZHItPnUuc2EsICZHLmxvY2FsX2FkZHItPmxlbik7CisKKwlwb3J0ID0gZ2V0X25wb3J0KCZHLmxvY2FsX2FkZHItPnUuc2EpOworCXBvcnQgPSBudG9ocyhwb3J0KTsKKwlyZXR1cm4gcG9ydDsKK30KKworLyogRXhpdHMgb24gZXJyb3IgKi8KK3N0YXRpYyB2b2lkCitoYW5kbGVfcGFzdih2b2lkKQoreworCXVuc2lnbmVkIHBvcnQ7CisJY2hhciAqYWRkciwgKnJlc3BvbnNlOworCisJcG9ydCA9IGJpbmRfZm9yX3Bhc3NpdmVfbW9kZSgpOworCisJaWYgKEcubG9jYWxfYWRkci0+dS5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVCkKKwkJYWRkciA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkX25vcG9ydCgmRy5sb2NhbF9hZGRyLT51LnNhKTsKKwllbHNlIC8qIHNlZW4gdGhpcyBpbiB0aGUgd2lsZCBkb25lIGJ5IG90aGVyIGZ0cCBzZXJ2ZXJzOiAqLworCQlhZGRyID0geHN0cmR1cCgiMC4wLjAuMCIpOworCXJlcGxhY2VfY2hhcihhZGRyLCAnLicsICcsJyk7CisKKwlyZXNwb25zZSA9IHhhc3ByaW50ZihTVFIoRlRQX1BBU1ZPSykiIFBBU1Ygb2sgKCVzLCV1LCV1KVxyXG4iLAorCQkJYWRkciwgKGludCkocG9ydCA+PiA4KSwgKGludCkocG9ydCAmIDI1NSkpOworCWZyZWUoYWRkcik7CisJY21kaW9fd3JpdGVfcmF3KHJlc3BvbnNlKTsKKwlmcmVlKHJlc3BvbnNlKTsKK30KKworLyogRXhpdHMgb24gZXJyb3IgKi8KK3N0YXRpYyB2b2lkCitoYW5kbGVfZXBzdih2b2lkKQoreworCXVuc2lnbmVkIHBvcnQ7CisJY2hhciAqcmVzcG9uc2U7CisKKwlwb3J0ID0gYmluZF9mb3JfcGFzc2l2ZV9tb2RlKCk7CisJcmVzcG9uc2UgPSB4YXNwcmludGYoU1RSKEZUUF9FUFNWT0spIiBFUFNWIG9rICh8fHwldXwpXHJcbiIsIHBvcnQpOworCWNtZGlvX3dyaXRlX3JhdyhyZXNwb25zZSk7CisJZnJlZShyZXNwb25zZSk7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfcG9ydCh2b2lkKQoreworCXVuc2lnbmVkIHBvcnQsIHBvcnRfaGk7CisJY2hhciAqcmF3LCAqY29tbWE7CisjaWZkZWYgV0hZX0JPVEhFUl9XRV9DQU5fQVNTVU1FX0lQX01BVENIRVMKKwlzb2NrbGVuX3QgcGVlcl9pcHY0X2xlbjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gcGVlcl9pcHY0OworCXN0cnVjdCBpbl9hZGRyIHBvcnRfaXB2NF9zaW5fYWRkcjsKKyNlbmRpZgorCisJcG9ydF9wYXN2X2NsZWFudXAoKTsKKworCXJhdyA9IEcuZnRwX2FyZzsKKworCS8qIFBPUlQgY29tbWFuZCBmb3JtYXQgbWFrZXMgc2Vuc2Ugb25seSBvdmVyIElQdjQgKi8KKwlpZiAoIXJhdworI2lmZGVmIFdIWV9CT1RIRVJfV0VfQ0FOX0FTU1VNRV9JUF9NQVRDSEVTCisJIHx8IEcubG9jYWxfYWRkci0+dS5zYS5zYV9mYW1pbHkgIT0gQUZfSU5FVAorI2VuZGlmCisJKSB7CisgYmFpbDoKKwkJV1JJVEVfRVJSKEZUUF9CQURDTUQpOworCQlyZXR1cm47CisJfQorCisJY29tbWEgPSBzdHJyY2hyKHJhdywgJywnKTsKKwlpZiAoY29tbWEgPT0gTlVMTCkKKwkJZ290byBiYWlsOworCSpjb21tYSA9ICdcMCc7CisJcG9ydCA9IGJiX3N0cnRvdSgmY29tbWFbMV0sIE5VTEwsIDEwKTsKKwlpZiAoZXJybm8gfHwgcG9ydCA+IDB4ZmYpCisJCWdvdG8gYmFpbDsKKworCWNvbW1hID0gc3RycmNocihyYXcsICcsJyk7CisJaWYgKGNvbW1hID09IE5VTEwpCisJCWdvdG8gYmFpbDsKKwkqY29tbWEgPSAnXDAnOworCXBvcnRfaGkgPSBiYl9zdHJ0b3UoJmNvbW1hWzFdLCBOVUxMLCAxMCk7CisJaWYgKGVycm5vIHx8IHBvcnRfaGkgPiAweGZmKQorCQlnb3RvIGJhaWw7CisJcG9ydCB8PSBwb3J0X2hpIDw8IDg7CisKKyNpZmRlZiBXSFlfQk9USEVSX1dFX0NBTl9BU1NVTUVfSVBfTUFUQ0hFUworCXJlcGxhY2VfY2hhcihyYXcsICcsJywgJy4nKTsKKworCS8qIFdlIGFyZSB2ZXJpZnlpbmcgdGhhdCBQT1JUJ3MgSVAgbWF0Y2hlcyBnZXRwZWVybmFtZSgpLgorCSAqIE90aGVyd2lzZSBwZWVyIGNhbiBtYWtlIHVzIG9wZW4gZGF0YSBjb25uZWN0aW9ucworCSAqIHRvIG90aGVyIGhvc3RzIChzZWN1cml0eSBwcm9ibGVtISkKKwkgKiBUaGlzIGNvZGUgd291bGQgYmUgdG9vIHNpbXBsaXN0aWM6CisJICogbHNhID0geGRvdHRlZDJzb2NrYWRkcihyYXcsIHBvcnQpOworCSAqIGlmIChsc2EgPT0gTlVMTCkgZ290byBiYWlsOworCSAqLworCWlmICghaW5ldF9hdG9uKHJhdywgJnBvcnRfaXB2NF9zaW5fYWRkcikpCisJCWdvdG8gYmFpbDsKKwlwZWVyX2lwdjRfbGVuID0gc2l6ZW9mKHBlZXJfaXB2NCk7CisJaWYgKGdldHBlZXJuYW1lKFNURElOX0ZJTEVOTywgJnBlZXJfaXB2NCwgJnBlZXJfaXB2NF9sZW4pICE9IDApCisJCWdvdG8gYmFpbDsKKwlpZiAobWVtY21wKCZwb3J0X2lwdjRfc2luX2FkZHIsICZwZWVyX2lwdjQuc2luX2FkZHIsIHNpemVvZihzdHJ1Y3QgaW5fYWRkcikpICE9IDApCisJCWdvdG8gYmFpbDsKKworCUcucG9ydF9hZGRyID0geGRvdHRlZDJzb2NrYWRkcihyYXcsIHBvcnQpOworI2Vsc2UKKwlHLnBvcnRfYWRkciA9IGdldF9wZWVyX2xzYShTVERJTl9GSUxFTk8pOworCXNldF9ucG9ydCgmRy5wb3J0X2FkZHItPnUuc2EsIGh0b25zKHBvcnQpKTsKKyNlbmRpZgorCVdSSVRFX09LKEZUUF9QT1JUT0spOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX3Jlc3Qodm9pZCkKK3sKKwkvKiBXaGVuIGZ0cF9hcmcgPT0gTlVMTCBzaW1wbHkgcmVzdGFydCBmcm9tIGJlZ2lubmluZyAqLworCUcucmVzdGFydF9wb3MgPSBHLmZ0cF9hcmcgPyB4YXRvaV9wb3NpdGl2ZShHLmZ0cF9hcmcpIDogMDsKKwlXUklURV9PSyhGVFBfUkVTVE9LKTsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9yZXRyKHZvaWQpCit7CisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwlvZmZfdCBieXRlc190cmFuc2ZlcnJlZDsKKwlpbnQgcmVtb3RlX2ZkOworCWludCBsb2NhbF9maWxlX2ZkOworCW9mZl90IG9mZnNldCA9IEcucmVzdGFydF9wb3M7CisJY2hhciAqcmVzcG9uc2U7CisKKwlHLnJlc3RhcnRfcG9zID0gMDsKKworCWlmICghcG9ydF9vcl9wYXN2X3dhc19zZWVuKCkpCisJCXJldHVybjsgLyogcG9ydF9vcl9wYXN2X3dhc19zZWVuIGVtaXR0ZWQgZXJyb3IgcmVzcG9uc2UgKi8KKworCS8qIE9fTk9OQkxPQ0sgaXMgdXNlZnVsIGlmIGZpbGUgaGFwcGVucyB0byBiZSBhIGRldmljZSBub2RlICovCisJbG9jYWxfZmlsZV9mZCA9IEcuZnRwX2FyZyA/IG9wZW4oRy5mdHBfYXJnLCBPX1JET05MWSB8IE9fTk9OQkxPQ0spIDogLTE7CisJaWYgKGxvY2FsX2ZpbGVfZmQgPCAwKSB7CisJCVdSSVRFX0VSUihGVFBfRklMRUZBSUwpOworCQlyZXR1cm47CisJfQorCisJaWYgKGZzdGF0KGxvY2FsX2ZpbGVfZmQsICZzdGF0YnVmKSAhPSAwIHx8ICFTX0lTUkVHKHN0YXRidWYuc3RfbW9kZSkpIHsKKwkJLyogTm90ZSAtIHByZXRlbmQgb3BlbiBmYWlsZWQgKi8KKwkJV1JJVEVfRVJSKEZUUF9GSUxFRkFJTCk7CisJCWdvdG8gZmlsZV9jbG9zZV9vdXQ7CisJfQorCUcubG9jYWxfZmlsZV9mZCA9IGxvY2FsX2ZpbGVfZmQ7CisKKwkvKiBOb3cgZGVhY3RpdmUgT19OT05CTE9DSywgb3RoZXJ3aXNlIHdlIGhhdmUgYSBwcm9ibGVtCisJICogb24gRE1BUEkgZmlsZXN5c3RlbXMgc3VjaCBhcyBYRlMgRE1BUEkuCisJICovCisJbmRlbGF5X29mZihsb2NhbF9maWxlX2ZkKTsKKworCS8qIFNldCB0aGUgZG93bmxvYWQgb2Zmc2V0IChmcm9tIFJFU1QpIGlmIGFueSAqLworCWlmIChvZmZzZXQgIT0gMCkKKwkJeGxzZWVrKGxvY2FsX2ZpbGVfZmQsIG9mZnNldCwgU0VFS19TRVQpOworCisJcmVzcG9uc2UgPSB4YXNwcmludGYoCisJCSIgT3BlbmluZyBCSU5BUlkgY29ubmVjdGlvbiBmb3IgJXMgKCUiT0ZGX0ZNVCJ1IGJ5dGVzKSIsCisJCUcuZnRwX2FyZywgc3RhdGJ1Zi5zdF9zaXplKTsKKwlyZW1vdGVfZmQgPSBnZXRfcmVtb3RlX3RyYW5zZmVyX2ZkKHJlc3BvbnNlKTsKKwlmcmVlKHJlc3BvbnNlKTsKKwlpZiAocmVtb3RlX2ZkIDwgMCkKKwkJZ290byBmaWxlX2Nsb3NlX291dDsKKworCWJ5dGVzX3RyYW5zZmVycmVkID0gYmJfY29weWZkX2VvZihsb2NhbF9maWxlX2ZkLCByZW1vdGVfZmQpOworCWNsb3NlKHJlbW90ZV9mZCk7CisJaWYgKGJ5dGVzX3RyYW5zZmVycmVkIDwgMCkKKwkJV1JJVEVfRVJSKEZUUF9CQURTRU5ERklMRSk7CisJZWxzZQorCQlXUklURV9PSyhGVFBfVFJBTlNGRVJPSyk7CisKKyBmaWxlX2Nsb3NlX291dDoKKwljbG9zZShsb2NhbF9maWxlX2ZkKTsKKwlHLmxvY2FsX2ZpbGVfZmQgPSAwOworfQorCisvKiBMaXN0IGNvbW1hbmRzICovCisKK3N0YXRpYyBpbnQKK3BvcGVuX2xzKGNvbnN0IGNoYXIgKm9wdCkKK3sKKwljb25zdCBjaGFyICphcmd2WzVdOworCXN0cnVjdCBmZF9wYWlyIG91dGZkOworCXBpZF90IHBpZDsKKworCWFyZ3ZbMF0gPSAiZnRwZCI7CisJYXJndlsxXSA9IG9wdDsgLyogIi1sQSIgb3IgIi0xQSIgKi8KKwlhcmd2WzJdID0gIi0tIjsKKwlhcmd2WzNdID0gRy5mdHBfYXJnOworCWFyZ3ZbNF0gPSBOVUxMOworCisJLyogSW1wcm92ZSBjb21wYXRpYmlsaXR5IHdpdGggbm9uLVJGQyBjb25mb3JtaW5nIEZUUCBjbGllbnRzCisJICogd2hpY2ggc2VuZCBlLmcuICJMSVNUIC1sIiwgIkxJU1QgLWxhIiwgIkxJU1QgLWFMIi4KKwkgKiBTZWUgaHR0cHM6Ly9idWdzLmtkZS5vcmcvc2hvd19idWcuY2dpP2lkPTE5NTU3OCAqLworCWlmIChFTkFCTEVfRkVBVFVSRV9GVFBEX0FDQ0VQVF9CUk9LRU5fTElTVAorCSAmJiBHLmZ0cF9hcmcgJiYgRy5mdHBfYXJnWzBdID09ICctJworCSkgeworCQljb25zdCBjaGFyICp0bXAgPSBzdHJjaHIoRy5mdHBfYXJnLCAnICcpOworCQlpZiAodG1wKSAvKiBza2lwIHRoZSBzcGFjZSAqLworCQkJdG1wKys7CisJCWFyZ3ZbM10gPSB0bXA7CisJfQorCisJeHBpcGVkX3BhaXIob3V0ZmQpOworCisJLypmZmx1c2hfYWxsKCk7IC0gc28gZmFyIHdlIGRvbnQgdXNlIHN0ZGlvIG9uIG91dHB1dCAqLworCXBpZCA9IEJCX01NVSA/IHhmb3JrKCkgOiB4dmZvcmsoKTsKKwlpZiAocGlkID09IDApIHsKKyNpZiAhQkJfTU1VCisJCWludCBjdXJfZmQ7CisjZW5kaWYKKwkJLyogY2hpbGQgKi8KKwkJLyogTkI6IGNsb3NlIF9maXJzdF8sIHRoZW4gbW92ZSBmZCEgKi8KKwkJY2xvc2Uob3V0ZmQucmQpOworCQl4bW92ZV9mZChvdXRmZC53ciwgU1RET1VUX0ZJTEVOTyk7CisJCS8qIE9wZW5pbmcgL2Rldi9udWxsIGluIGNocm9vdCBpcyBoYXJkLgorCQkgKiBKdXN0IG1ha2luZyBzdXJlIFNURElOX0ZJTEVOTyBpcyBvcGVuZWQKKwkJICogdG8gc29tZXRoaW5nIGhhcm1sZXNzLiBQYXJhbm9pYSwKKwkJICogbHMgd29uJ3QgcmVhZCBpdCBhbnl3YXkgKi8KKwkJY2xvc2UoU1RESU5fRklMRU5PKTsKKwkJZHVwKFNURE9VVF9GSUxFTk8pOyAvKiBjb3B5IHdpbGwgYmVjb21lIFNURElOX0ZJTEVOTyAqLworI2lmIEJCX01NVQorCQkvKiBtZW1zZXQoJkcsIDAsIHNpemVvZihHKSk7IC0gbHNfbWFpbiBkb2VzIGl0ICovCisJCWV4aXQobHNfbWFpbihBUlJBWV9TSVpFKGFyZ3YpIC0gMSwgKGNoYXIqKikgYXJndikpOworI2Vsc2UKKwkJY3VyX2ZkID0geG9wZW4oIi4iLCBPX1JET05MWSB8IE9fRElSRUNUT1JZKTsKKwkJLyogT24gTk9NTVUsIHdlIHdhbnQgdG8gZXhlY3V0ZSBhIGNoaWxkIC0gY29weSBvZiBvdXJzZWxmCisJCSAqIGluIG9yZGVyIHRvIHVuYmxvY2sgcGFyZW50IGFmdGVyIHZmb3JrLgorCQkgKiBJbiBjaHJvb3Qgd2UgdXN1YWxseSBjYW4ndCByZS1leGVjLiBUaHVzIHdlIGVzY2FwZQorCQkgKiBvdXQgb2YgdGhlIGNocm9vdCBiYWNrIHRvIG9yaWdpbmFsIHJvb3QuCisJCSAqLworCQlpZiAoRy5yb290X2ZkID49IDApIHsKKwkJCWlmIChmY2hkaXIoRy5yb290X2ZkKSAhPSAwIHx8IGNocm9vdCgiLiIpICE9IDApCisJCQkJX2V4aXQoMTI3KTsKKwkJCS8qY2xvc2UoRy5yb290X2ZkKTsgLSBjbG9zZV9vbl9leGVjX29uKCkgdG9vayBjYXJlIG9mIHRoaXMgKi8KKwkJfQorCQkvKiBDaGlsZCBleHBlY3RzIGRpcmVjdG9yeSB0byBsaXN0IG9uIGZkICMzICovCisJCXhtb3ZlX2ZkKGN1cl9mZCwgMyk7CisJCWV4ZWN2KGJiX2J1c3lib3hfZXhlY19wYXRoLCAoY2hhcioqKSBhcmd2KTsKKwkJX2V4aXQoMTI3KTsKKyNlbmRpZgorCX0KKworCS8qIHBhcmVudCAqLworCWNsb3NlKG91dGZkLndyKTsKKwlyZXR1cm4gb3V0ZmQucmQ7Cit9CisKK2VudW0geworCVVTRV9DVFJMX0NPTk4gPSAxLAorCUxPTkdfTElTVElORyA9IDIsCit9OworCitzdGF0aWMgdm9pZAoraGFuZGxlX2Rpcl9jb21tb24oaW50IG9wdHMpCit7CisJRklMRSAqbHNfZnA7CisJY2hhciAqbGluZTsKKwlpbnQgbHNfZmQ7CisKKwlpZiAoIShvcHRzICYgVVNFX0NUUkxfQ09OTikgJiYgIXBvcnRfb3JfcGFzdl93YXNfc2VlbigpKQorCQlyZXR1cm47IC8qIHBvcnRfb3JfcGFzdl93YXNfc2VlbiBlbWl0dGVkIGVycm9yIHJlc3BvbnNlICovCisKKwlsc19mZCA9IHBvcGVuX2xzKChvcHRzICYgTE9OR19MSVNUSU5HKSA/ICItbEEiIDogIi0xQSIpOworCWxzX2ZwID0geGZkb3Blbl9mb3JfcmVhZChsc19mZCk7CisvKiBGSVhNRTogZmlsZW5hbWVzIHdpdGggZW1iZWRkZWQgbmV3bGluZXMgYXJlIG1pc2hhbmRsZWQgKi8KKworCWlmIChvcHRzICYgVVNFX0NUUkxfQ09OTikgeworCQkvKiBTVEFUIDxmaWxlbmFtZT4gKi8KKwkJY21kaW9fd3JpdGVfcmF3KFNUUihGVFBfU1RBVEZJTEVfT0spIi1GaWxlIHN0YXR1czpcclxuIik7CisJCXdoaWxlICgxKSB7CisJCQlsaW5lID0geG1hbGxvY19mZ2V0bGluZShsc19mcCk7CisJCQlpZiAoIWxpbmUpCisJCQkJYnJlYWs7CisJCQkvKiBIYWNrOiAwIHJlc3VsdHMgaW4gbm8gc3RhdHVzIGF0IGFsbCAqLworCQkJLyogTm90ZTogaXQncyBvayB0aGF0IHdlIGRvbid0IHByZXBlbmQgc3BhY2UsCisJCQkgKiBmdHAua2VybmVsLm9yZyBkb2Vzbid0IGRvIHRoYXQgdG9vICovCisJCQljbWRpb193cml0ZSgwLCBsaW5lKTsKKwkJCWZyZWUobGluZSk7CisJCX0KKwkJV1JJVEVfT0soRlRQX1NUQVRGSUxFX09LKTsKKwl9IGVsc2UgeworCQkvKiBMSVNUL05MU1QgWzxmaWxlbmFtZT5dICovCisJCWludCByZW1vdGVfZmQgPSBnZXRfcmVtb3RlX3RyYW5zZmVyX2ZkKCIgRGlyZWN0b3J5IGxpc3RpbmciKTsKKwkJaWYgKHJlbW90ZV9mZCA+PSAwKSB7CisJCQl3aGlsZSAoMSkgeworCQkJCXVuc2lnbmVkIGxlbjsKKworCQkJCWxpbmUgPSB4bWFsbG9jX2ZnZXRzKGxzX2ZwKTsKKwkJCQlpZiAoIWxpbmUpCisJCQkJCWJyZWFrOworCQkJCS8qIEkndmUgc2VlbiBjbGllbnRzIGNvbXBsYWluaW5nIHdoZW4gdGhleQorCQkJCSAqIGFyZSBmZWQgd2l0aCBscyBvdXRwdXQgd2l0aCBiYXJlICdcbicuCisJCQkJICogUmVwbGFjZSB0cmFpbGluZyAiXG5cMCIgd2l0aCAiXHJcbiIuCisJCQkJICovCisJCQkJbGVuID0gc3RybGVuKGxpbmUpOworCQkJCWlmIChsZW4gIT0gMCkgLyogcGFyYW5vaWEgY2hlY2sgKi8KKwkJCQkJbGluZVtsZW4gLSAxXSA9ICdccic7CisJCQkJbGluZVtsZW5dID0gJ1xuJzsKKwkJCQl4d3JpdGUocmVtb3RlX2ZkLCBsaW5lLCBsZW4gKyAxKTsKKwkJCQlmcmVlKGxpbmUpOworCQkJfQorCQl9CisJCWNsb3NlKHJlbW90ZV9mZCk7CisJCVdSSVRFX09LKEZUUF9UUkFOU0ZFUk9LKTsKKwl9CisJZmNsb3NlKGxzX2ZwKTsgLyogY2xvc2VzIGxzX2ZkIHRvbyAqLworfQorc3RhdGljIHZvaWQKK2hhbmRsZV9saXN0KHZvaWQpCit7CisJaGFuZGxlX2Rpcl9jb21tb24oTE9OR19MSVNUSU5HKTsKK30KK3N0YXRpYyB2b2lkCitoYW5kbGVfbmxzdCh2b2lkKQoreworCS8qIE5MU1QgcmV0dXJucyBsaXN0IG9mIG5hbWVzLCAiXHJcbiIgdGVybWluYXRlZCB3aXRob3V0IHJlZ2FyZAorCSAqIHRvIHRoZSBjdXJyZW50IGJpbmFyeSBmbGFnLiBOYW1lcyBtYXkgc3RhcnQgd2l0aCAiLyIsCisJICogdGhlbiB0aGV5IHJlcHJlc2VudCBmdWxsIG5hbWVzICh3ZSBkb24ndCBwcm9kdWNlIHN1Y2ggbmFtZXMpLAorCSAqIG90aGVyd2lzZSBuYW1lcyBhcmUgcmVsYXRpdmUgdG8gY3VycmVudCBkaXJlY3RvcnkuCisJICogRW1iZWRkZWQgIlxuIiBhcmUgcmVwbGFjZWQgYnkgTlVMcy4gVGhpcyBpcyBzYWZlIHNpbmNlIG5hbWVzCisJICogY2FuIG5ldmVyIGNvbnRhaW4gTlVMLgorCSAqLworCWhhbmRsZV9kaXJfY29tbW9uKDApOworfQorc3RhdGljIHZvaWQKK2hhbmRsZV9zdGF0X2ZpbGUodm9pZCkKK3sKKwloYW5kbGVfZGlyX2NvbW1vbihMT05HX0xJU1RJTkcgKyBVU0VfQ1RSTF9DT05OKTsKK30KKworLyogVGhpcyBjYW4gYmUgZXh0ZW5kZWQgdG8gaGFuZGxlIE1MU1QsIGFzIGFsbCBpbmZvIGlzIGF2YWlsYWJsZQorICogaW4gc3RydWN0IHN0YXQgZm9yIHRoYXQ6CisgKiBNTFNUIGZpbGVfbmFtZQorICogMjUwLUxpc3RpbmcgZmlsZV9uYW1lCisgKiAgdHlwZT1maWxlO3NpemU9NDE2MTttb2RpZnk9MTk5NzAyMTQxNjU4MDA7IC9kaXIvZGlyL2ZpbGVfbmFtZQorICogMjUwIEVuZAorICogTmFuby1kb2M6CisgKiBNTFNUIFs8ZmlsZSBvciBkaXIgbmFtZSwgIi4iIGFzc3VtZWQgaWYgbm90IGdpdmVuPl0KKyAqIFJldHVybmVkIG5hbWUgc2hvdWxkIGJlIGVpdGhlciB0aGUgc2FtZSBhcyByZXF1ZXN0ZWQsIG9yIGZ1bGx5IHF1YWxpZmllZC4KKyAqIElmIHRoZXJlIHdhcyBubyBwYXJhbWV0ZXIsIHJldHVybiAiIiBvciAocHJlZmVycmVkKSBmdWxseS1xdWFsaWZpZWQgbmFtZS4KKyAqIFJldHVybmVkICJmYWN0cyIgKGNhc2UgaXMgbm90IGltcG9ydGFudCk6CisgKiAgc2l6ZSAgICAtIHNpemUgaW4gb2N0ZXRzCisgKiAgbW9kaWZ5ICAtIGxhc3QgbW9kaWZpY2F0aW9uIHRpbWUKKyAqICB0eXBlICAgIC0gZW50cnkgdHlwZSAoZmlsZSxkaXIsT1MudW5peD1ibG9jaykKKyAqICAgICAgICAgICAgKCsgY2RpciBhbmQgcGRpciB0eXBlcyBmb3IgTUxTRCkKKyAqICB1bmlxdWUgIC0gdW5pcXVlIGlkIG9mIGZpbGUvZGlyZWN0b3J5IChpbm9kZSMpCisgKiAgcGVybSAgICAtCisgKiAgICAgIGE6IGNhbiBiZSBhcHBlbmRlZCB0byAoQVBQRSkKKyAqICAgICAgZDogY2FuIGJlIGRlbGV0ZWQgKFJNRC9ERUxFKQorICogICAgICBmOiBjYW4gYmUgcmVuYW1lZCAoUk5GUikKKyAqICAgICAgcjogY2FuIGJlIHJlYWQgKFJFVFIpCisgKiAgICAgIHc6IGNhbiBiZSB3cml0dGVuIChTVE9SKQorICogICAgICBlOiBjYW4gQ1dEIGludG8gdGhpcyBkaXIKKyAqICAgICAgbDogdGhpcyBkaXIgY2FuIGJlIGxpc3RlZCAoZGlyIG9ubHkhKQorICogICAgICBjOiBjYW4gY3JlYXRlIGZpbGVzIGluIHRoaXMgZGlyCisgKiAgICAgIG06IGNhbiBjcmVhdGUgZGlycyBpbiB0aGlzIGRpciAoTUtEKQorICogICAgICBwOiBjYW4gZGVsZXRlIGZpbGVzIGluIHRoaXMgZGlyCisgKiAgVU5JWC5tb2RlIC0gdW5peCBmaWxlIG1vZGUKKyAqLworc3RhdGljIHZvaWQKK2hhbmRsZV9zaXplX29yX21kdG0oaW50IG5lZWRfc2l6ZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCXN0cnVjdCB0bSBicm9rZW5fb3V0OworCWNoYXIgYnVmWyhzaXplb2YoIk5OTiAlIk9GRl9GTVQidVxyXG4iKSArIHNpemVvZihvZmZfdCkgKiAzKQorCQl8IHNpemVvZigiTk5OIFlZWVlNTUREaGhtbXNzXHJcbiIpCisJXTsKKworCWlmICghRy5mdHBfYXJnCisJIHx8IHN0YXQoRy5mdHBfYXJnLCAmc3RhdGJ1ZikgIT0gMAorCSB8fCAhU19JU1JFRyhzdGF0YnVmLnN0X21vZGUpCisJKSB7CisJCVdSSVRFX0VSUihGVFBfRklMRUZBSUwpOworCQlyZXR1cm47CisJfQorCWlmIChuZWVkX3NpemUpIHsKKwkJc3ByaW50ZihidWYsIFNUUihGVFBfU1RBVEZJTEVfT0spIiAlIk9GRl9GTVQidVxyXG4iLCBzdGF0YnVmLnN0X3NpemUpOworCX0gZWxzZSB7CisJCWdtdGltZV9yKCZzdGF0YnVmLnN0X210aW1lLCAmYnJva2VuX291dCk7CisJCXNwcmludGYoYnVmLCBTVFIoRlRQX1NUQVRGSUxFX09LKSIgJTA0dSUwMnUlMDJ1JTAydSUwMnUlMDJ1XHJcbiIsCisJCQlicm9rZW5fb3V0LnRtX3llYXIgKyAxOTAwLAorCQkJYnJva2VuX291dC50bV9tb24gKyAxLAorCQkJYnJva2VuX291dC50bV9tZGF5LAorCQkJYnJva2VuX291dC50bV9ob3VyLAorCQkJYnJva2VuX291dC50bV9taW4sCisJCQlicm9rZW5fb3V0LnRtX3NlYyk7CisJfQorCWNtZGlvX3dyaXRlX3JhdyhidWYpOworfQorCisvKiBVcGxvYWQgY29tbWFuZHMgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZUUF9XUklURQorc3RhdGljIHZvaWQKK2hhbmRsZV9ta2Qodm9pZCkKK3sKKwlpZiAoIUcuZnRwX2FyZyB8fCBta2RpcihHLmZ0cF9hcmcsIDA3NzcpICE9IDApIHsKKwkJV1JJVEVfRVJSKEZUUF9GSUxFRkFJTCk7CisJCXJldHVybjsKKwl9CisJV1JJVEVfT0soRlRQX01LRElST0spOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX3JtZCh2b2lkKQoreworCWlmICghRy5mdHBfYXJnIHx8IHJtZGlyKEcuZnRwX2FyZykgIT0gMCkgeworCQlXUklURV9FUlIoRlRQX0ZJTEVGQUlMKTsKKwkJcmV0dXJuOworCX0KKwlXUklURV9PSyhGVFBfUk1ESVJPSyk7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfZGVsZSh2b2lkKQoreworCWlmICghRy5mdHBfYXJnIHx8IHVubGluayhHLmZ0cF9hcmcpICE9IDApIHsKKwkJV1JJVEVfRVJSKEZUUF9GSUxFRkFJTCk7CisJCXJldHVybjsKKwl9CisJV1JJVEVfT0soRlRQX0RFTEVPSyk7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfcm5mcih2b2lkKQoreworCWZyZWUoRy5ybmZyX2ZpbGVuYW1lKTsKKwlHLnJuZnJfZmlsZW5hbWUgPSB4c3RyZHVwKEcuZnRwX2FyZyk7CisJV1JJVEVfT0soRlRQX1JORlJPSyk7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfcm50byh2b2lkKQoreworCWludCByZXR2YWw7CisKKwkvKiBJZiB3ZSBkaWRuJ3QgZ2V0IGEgUk5GUiwgdGhyb3cgYSB3b2JibHkgKi8KKwlpZiAoRy5ybmZyX2ZpbGVuYW1lID09IE5VTEwgfHwgRy5mdHBfYXJnID09IE5VTEwpIHsKKwkJY21kaW9fd3JpdGVfcmF3KFNUUihGVFBfTkVFRFJORlIpIiBVc2UgUk5GUiBmaXJzdFxyXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXJldHZhbCA9IHJlbmFtZShHLnJuZnJfZmlsZW5hbWUsIEcuZnRwX2FyZyk7CisJZnJlZShHLnJuZnJfZmlsZW5hbWUpOworCUcucm5mcl9maWxlbmFtZSA9IE5VTEw7CisKKwlpZiAocmV0dmFsKSB7CisJCVdSSVRFX0VSUihGVFBfRklMRUZBSUwpOworCQlyZXR1cm47CisJfQorCVdSSVRFX09LKEZUUF9SRU5BTUVPSyk7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfdXBsb2FkX2NvbW1vbihpbnQgaXNfYXBwZW5kLCBpbnQgaXNfdW5pcXVlKQoreworCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJY2hhciAqdGVtcG5hbWU7CisJb2ZmX3QgYnl0ZXNfdHJhbnNmZXJyZWQ7CisJb2ZmX3Qgb2Zmc2V0OworCWludCBsb2NhbF9maWxlX2ZkOworCWludCByZW1vdGVfZmQ7CisKKwlvZmZzZXQgPSBHLnJlc3RhcnRfcG9zOworCUcucmVzdGFydF9wb3MgPSAwOworCisJaWYgKCFwb3J0X29yX3Bhc3Zfd2FzX3NlZW4oKSkKKwkJcmV0dXJuOyAvKiBwb3J0X29yX3Bhc3Zfd2FzX3NlZW4gZW1pdHRlZCBlcnJvciByZXNwb25zZSAqLworCisJdGVtcG5hbWUgPSBOVUxMOworCWxvY2FsX2ZpbGVfZmQgPSAtMTsKKwlpZiAoaXNfdW5pcXVlKSB7CisJCXRlbXBuYW1lID0geHN0cmR1cCgiIEZJTEU6IHVuaXEuWFhYWFhYIik7CisJCWxvY2FsX2ZpbGVfZmQgPSBta3N0ZW1wKHRlbXBuYW1lICsgNyk7CisJfSBlbHNlIGlmIChHLmZ0cF9hcmcpIHsKKwkJaW50IGZsYWdzID0gT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQzsKKwkJaWYgKGlzX2FwcGVuZCkKKwkJCWZsYWdzID0gT19XUk9OTFkgfCBPX0NSRUFUIHwgT19BUFBFTkQ7CisJCWlmIChvZmZzZXQpCisJCQlmbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVDsKKwkJbG9jYWxfZmlsZV9mZCA9IG9wZW4oRy5mdHBfYXJnLCBmbGFncywgMDY2Nik7CisJfQorCisJaWYgKGxvY2FsX2ZpbGVfZmQgPCAwCisJIHx8IGZzdGF0KGxvY2FsX2ZpbGVfZmQsICZzdGF0YnVmKSAhPSAwCisJIHx8ICFTX0lTUkVHKHN0YXRidWYuc3RfbW9kZSkKKwkpIHsKKwkJZnJlZSh0ZW1wbmFtZSk7CisJCVdSSVRFX0VSUihGVFBfVVBMT0FERkFJTCk7CisJCWlmIChsb2NhbF9maWxlX2ZkID49IDApCisJCQlnb3RvIGNsb3NlX2xvY2FsX2FuZF9iYWlsOworCQlyZXR1cm47CisJfQorCUcubG9jYWxfZmlsZV9mZCA9IGxvY2FsX2ZpbGVfZmQ7CisKKwlpZiAob2Zmc2V0KQorCQl4bHNlZWsobG9jYWxfZmlsZV9mZCwgb2Zmc2V0LCBTRUVLX1NFVCk7CisKKwlyZW1vdGVfZmQgPSBnZXRfcmVtb3RlX3RyYW5zZmVyX2ZkKHRlbXBuYW1lID8gdGVtcG5hbWUgOiAiIE9rIHRvIHNlbmQgZGF0YSIpOworCWZyZWUodGVtcG5hbWUpOworCisJaWYgKHJlbW90ZV9mZCA8IDApCisJCWdvdG8gY2xvc2VfbG9jYWxfYW5kX2JhaWw7CisKKwlieXRlc190cmFuc2ZlcnJlZCA9IGJiX2NvcHlmZF9lb2YocmVtb3RlX2ZkLCBsb2NhbF9maWxlX2ZkKTsKKwljbG9zZShyZW1vdGVfZmQpOworCWlmIChieXRlc190cmFuc2ZlcnJlZCA8IDApCisJCVdSSVRFX0VSUihGVFBfQkFEU0VOREZJTEUpOworCWVsc2UKKwkJV1JJVEVfT0soRlRQX1RSQU5TRkVST0spOworCisgY2xvc2VfbG9jYWxfYW5kX2JhaWw6CisJY2xvc2UobG9jYWxfZmlsZV9mZCk7CisJRy5sb2NhbF9maWxlX2ZkID0gMDsKK30KKworc3RhdGljIHZvaWQKK2hhbmRsZV9zdG9yKHZvaWQpCit7CisJaGFuZGxlX3VwbG9hZF9jb21tb24oMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitoYW5kbGVfYXBwZSh2b2lkKQoreworCUcucmVzdGFydF9wb3MgPSAwOworCWhhbmRsZV91cGxvYWRfY29tbW9uKDEsIDApOworfQorCitzdGF0aWMgdm9pZAoraGFuZGxlX3N0b3Uodm9pZCkKK3sKKwlHLnJlc3RhcnRfcG9zID0gMDsKKwloYW5kbGVfdXBsb2FkX2NvbW1vbigwLCAxKTsKK30KKyNlbmRpZiAvKiBFTkFCTEVfRkVBVFVSRV9GVFBfV1JJVEUgKi8KKworc3RhdGljIHVpbnQzMl90CitjbWRpb19nZXRfY21kX2FuZF9hcmcodm9pZCkKK3sKKwlpbnQgbGVuOworCXVpbnQzMl90IGNtZHZhbDsKKwljaGFyICpjbWQ7CisKKwlhbGFybShHLnRpbWVvdXQpOworCisJZnJlZShHLmZ0cF9jbWQpOworCXsKKwkJLyogUGFyYW5vaWEuIFBlZXIgbWF5IHNlbmQgMSBnaWdhYnl0ZSBsb25nIGNtZC4uLiAqLworCQkvKiBVc2luZyBzZXBhcmF0ZSBsZW5fb25fc3RrIGluc3RlYWQgb2YgbGVuIG9wdGltaXplcworCQkgKiBjb2RlIHNpemUgKGFsbG93cyBsZW4gdG8gYmUgaW4gQ1BVIHJlZ2lzdGVyKSAqLworCQlzaXplX3QgbGVuX29uX3N0ayA9IDggKiAxMDI0OworCQlHLmZ0cF9jbWQgPSBjbWQgPSB4bWFsbG9jX2ZnZXRzX3N0cl9sZW4oc3RkaW4sICJcclxuIiwgJmxlbl9vbl9zdGspOworCQlpZiAoIWNtZCkKKwkJCWV4aXQoMCk7CisJCWxlbiA9IGxlbl9vbl9zdGs7CisJfQorCisJLyogRGUtZXNjYXBlIHRlbG5ldDogMHhmZiwweGZmID0+IDB4ZmYgKi8KKwkvKiBSRkM5NTkgc2F5cyB0aGF0IEFCT1IsIFNUQVQsIFFVSVQgbWF5IGJlIHNlbnQgZXZlbiBkdXJpbmcKKwkgKiBkYXRhIHRyYW5zZmVyLCBhbmQgbWF5IGJlIHByZWNlZGVkIGJ5IHRlbG5ldCdzICJJbnRlcnJ1cHQgUHJvY2VzcyIKKwkgKiBjb2RlICh0d28tYnl0ZSBzZXF1ZW5jZSAyNTUsMjQ0KSBhbmQgdGhlbiBieSB0ZWxuZXQgIlN5bmNoIiBjb2RlCisJICogMjU1LDI0MiAoYnl0ZSAyNDIgaXMgc2VudCB3aXRoIFRDUCBVUkcgYml0IHVzaW5nIHNlbmQoTVNHX09PQikKKwkgKiBhbmQgbWF5IGdlbmVyYXRlIFNJR1VSRyBvbiBvdXIgc2lkZS4gU2VlIFJGQzg1NCkuCisJICogU28gZmFyIHdlIGRvbid0IHN1cHBvcnQgdGhhdCAobWF5IGluc3RhbGwgU0lHVVJHIGhhbmRsZXIgaWYgd2UnZCB3YW50IHRvKSwKKwkgKiBidXQgd2UgbmVlZCB0byBhdCBsZWFzdCByZW1vdmUgMjU1LHh4eCBwYWlycy4gbGZ0cCBzZW5kcyB0aG9zZS4gKi8KKwkvKiBUaGVuIGRlLWVzY2FwZSBGVFA6IE5VTCA9PiAnXG4nICovCisJLyogVGVzdGluZyBmb3IgXHhmZjoKKwkgKiBDcmVhdGUgZmlsZSBuYW1lZCAnXHhmZic6IGVjaG8gSGVsbG8gPmBlY2hvIC1uZSAiXHhmZiJgCisJICogVHJ5IHRvIGdldCBpdDogICAgICAgICAgICBmdHBnZXQgLXYgMTI3LjAuMC4xIEVmZiBgZWNobyAtbmUgIlx4ZmZceGZmImAKKwkgKiAobmVlZCAiXHhmZlx4ZmYiIHVudGlsIGZ0cGdldCBhcHBsZXQgaXMgZml4ZWQgdG8gZG8gZXNjYXBpbmcgOikKKwkgKiBUZXN0aW5nIGZvciBlbWJlZGRlZCBMRjoKKwkgKiBMRl9IRVJFPWBlY2hvIC1uZSAiTEZcbkhFUkUiYAorCSAqIGVjaG8gSGVsbG8gPiIkTEZfSEVSRSIKKwkgKiBmdHBnZXQgLXYgMTI3LjAuMC4xIExGX0hFUkUgIiRMRl9IRVJFIgorCSAqLworCXsKKwkJaW50IGRzdCwgc3JjOworCisJCS8qIFN0cmlwICJcclxuIiBpZiBpdCBpcyB0aGVyZSAqLworCQlpZiAobGVuICE9IDAgJiYgY21kW2xlbiAtIDFdID09ICdcbicpIHsKKwkJCWxlbi0tOworCQkJaWYgKGxlbiAhPSAwICYmIGNtZFtsZW4gLSAxXSA9PSAnXHInKQorCQkJCWxlbi0tOworCQkJY21kW2xlbl0gPSAnXDAnOworCQl9CisJCXNyYyA9IHN0cmNocm51bChjbWQsIDB4ZmYpIC0gY21kOworCQkvKiA5OSw5OSUgdGhlcmUgYXJlIG5laXRoZXIgTlVMcyBub3IgMjU1cyBhbmQgc3JjID09IGxlbiAqLworCQlpZiAoc3JjIDwgbGVuKSB7CisJCQlkc3QgPSBzcmM7CisJCQlkbyB7CisJCQkJaWYgKCh1bnNpZ25lZCBjaGFyKShjbWRbc3JjXSkgPT0gMjU1KSB7CisJCQkJCXNyYysrOworCQkJCQkvKiAyNTUseHh4IC0gc2tpcCAyNTUgKi8KKwkJCQkJaWYgKCh1bnNpZ25lZCBjaGFyKShjbWRbc3JjXSkgIT0gMjU1KSB7CisJCQkJCQkvKiAyNTUsITI1NSAtIHNraXAgYm90aCAqLworCQkJCQkJc3JjKys7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQkvKiAyNTUsMjU1IC0gcmV0YWluIG9uZSAyNTUgKi8KKwkJCQl9CisJCQkJLyogTlVMID0+ICdcbicgKi8KKwkJCQljbWRbZHN0KytdID0gY21kW3NyY10gPyBjbWRbc3JjXSA6ICdcbic7CisJCQkJc3JjKys7CisJCQl9IHdoaWxlIChzcmMgPCBsZW4pOworCQkJY21kW2RzdF0gPSAnXDAnOworCQl9CisJfQorCisJaWYgKEcudmVyYm9zZSA+IDEpCisJCXZlcmJvc2VfbG9nKGNtZCk7CisKKwlHLmZ0cF9hcmcgPSBzdHJjaHIoY21kLCAnICcpOworCWlmIChHLmZ0cF9hcmcgIT0gTlVMTCkKKwkJKkcuZnRwX2FyZysrID0gJ1wwJzsKKworCS8qIFVwcGVyY2FzZSBhbmQgcGFjayBpbnRvIHVpbnQzMl90IGZpcnN0IHdvcmQgb2YgdGhlIGNvbW1hbmQgKi8KKwljbWR2YWwgPSAwOworCXdoaWxlICgqY21kKQorCQljbWR2YWwgPSAoY21kdmFsIDw8IDgpICsgKCh1bnNpZ25lZCBjaGFyKSpjbWQrKyAmICh1bnNpZ25lZCBjaGFyKX4weDIwKTsKKworCXJldHVybiBjbWR2YWw7Cit9CisKKyNkZWZpbmUgbWtfY29uc3Q0KGEsYixjLGQpICgoKGEgKiAweDEwMCArIGIpICogMHgxMDAgKyBjKSAqIDB4MTAwICsgZCkKKyNkZWZpbmUgbWtfY29uc3QzKGEsYixjKSAgICAoKGEgKiAweDEwMCArIGIpICogMHgxMDAgKyBjKQorZW51bSB7CisJY29uc3RfQUxMTyA9IG1rX2NvbnN0NCgnQScsICdMJywgJ0wnLCAnTycpLAorCWNvbnN0X0FQUEUgPSBta19jb25zdDQoJ0EnLCAnUCcsICdQJywgJ0UnKSwKKwljb25zdF9DRFVQID0gbWtfY29uc3Q0KCdDJywgJ0QnLCAnVScsICdQJyksCisJY29uc3RfQ1dEICA9IG1rX2NvbnN0MygnQycsICdXJywgJ0QnKSwKKwljb25zdF9ERUxFID0gbWtfY29uc3Q0KCdEJywgJ0UnLCAnTCcsICdFJyksCisJY29uc3RfRVBTViA9IG1rX2NvbnN0NCgnRScsICdQJywgJ1MnLCAnVicpLAorCWNvbnN0X0ZFQVQgPSBta19jb25zdDQoJ0YnLCAnRScsICdBJywgJ1QnKSwKKwljb25zdF9IRUxQID0gbWtfY29uc3Q0KCdIJywgJ0UnLCAnTCcsICdQJyksCisJY29uc3RfTElTVCA9IG1rX2NvbnN0NCgnTCcsICdJJywgJ1MnLCAnVCcpLAorCWNvbnN0X01EVE0gPSBta19jb25zdDQoJ00nLCAnRCcsICdUJywgJ00nKSwKKwljb25zdF9NS0QgID0gbWtfY29uc3QzKCdNJywgJ0snLCAnRCcpLAorCWNvbnN0X01PREUgPSBta19jb25zdDQoJ00nLCAnTycsICdEJywgJ0UnKSwKKwljb25zdF9OTFNUID0gbWtfY29uc3Q0KCdOJywgJ0wnLCAnUycsICdUJyksCisJY29uc3RfTk9PUCA9IG1rX2NvbnN0NCgnTicsICdPJywgJ08nLCAnUCcpLAorCWNvbnN0X1BBU1MgPSBta19jb25zdDQoJ1AnLCAnQScsICdTJywgJ1MnKSwKKwljb25zdF9QQVNWID0gbWtfY29uc3Q0KCdQJywgJ0EnLCAnUycsICdWJyksCisJY29uc3RfUE9SVCA9IG1rX2NvbnN0NCgnUCcsICdPJywgJ1InLCAnVCcpLAorCWNvbnN0X1BXRCAgPSBta19jb25zdDMoJ1AnLCAnVycsICdEJyksCisJLyogU2FtZSBhcyBQV0QuIFJlcG9ydGVkbHkgdXNlZCBieSB3aW5kb3dzIGZ0cCBjbGllbnQgKi8KKwljb25zdF9YUFdEID0gbWtfY29uc3Q0KCdYJywgJ1AnLCAnVycsICdEJyksCisJY29uc3RfUVVJVCA9IG1rX2NvbnN0NCgnUScsICdVJywgJ0knLCAnVCcpLAorCWNvbnN0X1JFU1QgPSBta19jb25zdDQoJ1InLCAnRScsICdTJywgJ1QnKSwKKwljb25zdF9SRVRSID0gbWtfY29uc3Q0KCdSJywgJ0UnLCAnVCcsICdSJyksCisJY29uc3RfUk1EICA9IG1rX2NvbnN0MygnUicsICdNJywgJ0QnKSwKKwljb25zdF9STkZSID0gbWtfY29uc3Q0KCdSJywgJ04nLCAnRicsICdSJyksCisJY29uc3RfUk5UTyA9IG1rX2NvbnN0NCgnUicsICdOJywgJ1QnLCAnTycpLAorCWNvbnN0X1NJWkUgPSBta19jb25zdDQoJ1MnLCAnSScsICdaJywgJ0UnKSwKKwljb25zdF9TVEFUID0gbWtfY29uc3Q0KCdTJywgJ1QnLCAnQScsICdUJyksCisJY29uc3RfU1RPUiA9IG1rX2NvbnN0NCgnUycsICdUJywgJ08nLCAnUicpLAorCWNvbnN0X1NUT1UgPSBta19jb25zdDQoJ1MnLCAnVCcsICdPJywgJ1UnKSwKKwljb25zdF9TVFJVID0gbWtfY29uc3Q0KCdTJywgJ1QnLCAnUicsICdVJyksCisJY29uc3RfU1lTVCA9IG1rX2NvbnN0NCgnUycsICdZJywgJ1MnLCAnVCcpLAorCWNvbnN0X1RZUEUgPSBta19jb25zdDQoJ1QnLCAnWScsICdQJywgJ0UnKSwKKwljb25zdF9VU0VSID0gbWtfY29uc3Q0KCdVJywgJ1MnLCAnRScsICdSJyksCisKKyNpZiAhQkJfTU1VCisJT1BUX2wgPSAoMSA8PCAwKSwKKwlPUFRfMSA9ICgxIDw8IDEpLAorCU9QVF9BID0gKDEgPDwgMiksCisjZW5kaWYKKwlPUFRfdiA9ICgxIDw8ICgoIUJCX01NVSkgKiAzICsgMCkpLAorCU9QVF9TID0gKDEgPDwgKCghQkJfTU1VKSAqIDMgKyAxKSksCisJT1BUX3cgPSAoMSA8PCAoKCFCQl9NTVUpICogMyArIDIpKSAqIEVOQUJMRV9GRUFUVVJFX0ZUUF9XUklURSwKK307CisKK2ludCBmdHBkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKKyNpZiAhQkJfTU1VCitpbnQgZnRwZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKKyNlbHNlCitpbnQgZnRwZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCisjZW5kaWYKK3sKKyNpZiBFTkFCTEVfRkVBVFVSRV9GVFBfQVVUSEVOVElDQVRJT04KKwlzdHJ1Y3QgcGFzc3dkICpwdyA9IE5VTEw7CisjZW5kaWYKKwl1bnNpZ25lZCBhYnNfdGltZW91dDsKKwl1bnNpZ25lZCB2ZXJib3NlX1M7CisJc21hbGxpbnQgb3B0czsKKworCUlOSVRfRygpOworCisJYWJzX3RpbWVvdXQgPSAxICogNjAgKiA2MDsKKwl2ZXJib3NlX1MgPSAwOworCUcudGltZW91dCA9IDIgKiA2MDsKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJ0KzpUKzp2djpTUyI7CisjaWYgQkJfTU1VCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICAgICJ2UyIgSUZfRkVBVFVSRV9GVFBfV1JJVEUoInciKSAidDpUOiIsICZHLnRpbWVvdXQsICZhYnNfdGltZW91dCwgJkcudmVyYm9zZSwgJnZlcmJvc2VfUyk7CisjZWxzZQorCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAibDFBdlMiIElGX0ZFQVRVUkVfRlRQX1dSSVRFKCJ3IikgInQ6VDoiLCAmRy50aW1lb3V0LCAmYWJzX3RpbWVvdXQsICZHLnZlcmJvc2UsICZ2ZXJib3NlX1MpOworCWlmIChvcHRzICYgKE9QVF9sfE9QVF8xKSkgeworCQkvKiBPdXIgc2VjcmV0IGJhY2tkb29yIHRvIGxzICovCisvKiBUT0RPOiBwYXNzIC0tZ3JvdXAtZGlyZWN0b3JpZXMtZmlyc3Q/IHdvdWxkIGJlIG5pY2UsIGJ1dCBscyBkb2Vzbid0IGRvIHRoYXQgeWV0ICovCisJCWlmIChmY2hkaXIoMykgIT0gMCkKKwkJCV9leGl0KDEyNyk7CisJCS8qIG1lbXNldCgmRywgMCwgc2l6ZW9mKEcpKTsgLSBsc19tYWluIGRvZXMgaXQgKi8KKwkJcmV0dXJuIGxzX21haW4oYXJnYywgYXJndik7CisJfQorI2VuZGlmCisJaWYgKEcudmVyYm9zZSA8IHZlcmJvc2VfUykKKwkJRy52ZXJib3NlID0gdmVyYm9zZV9TOworCWlmIChhYnNfdGltZW91dCB8IEcudGltZW91dCkgeworCQlpZiAoYWJzX3RpbWVvdXQgPT0gMCkKKwkJCWFic190aW1lb3V0ID0gSU5UX01BWDsKKwkJRy5lbmRfdGltZSA9IG1vbm90b25pY19zZWMoKSArIGFic190aW1lb3V0OworCQlpZiAoRy50aW1lb3V0ID4gYWJzX3RpbWVvdXQpCisJCQlHLnRpbWVvdXQgPSBhYnNfdGltZW91dDsKKwl9CisJc3RyY3B5KEcubXNnX29rICArIDQsIE1TR19PSyApOworCXN0cmNweShHLm1zZ19lcnIgKyA0LCBNU0dfRVJSKTsKKworCUcubG9jYWxfYWRkciA9IGdldF9zb2NrX2xzYShTVERJTl9GSUxFTk8pOworCWlmICghRy5sb2NhbF9hZGRyKSB7CisJCS8qIFRoaXMgaXMgY29uZnVzaW5nOgorCQkgKiBiYl9lcnJvcl9tc2dfYW5kX2RpZSgic3RkaW4gaXMgbm90IGEgc29ja2V0Iik7CisJCSAqIEJldHRlcjogKi8KKwkJYmJfc2hvd191c2FnZSgpOworCQkvKiBIZWxwIHRleHQgc2F5cyB0aGF0IGZ0cGQgbXVzdCBiZSB1c2VkIGFzIGluZXRkIHNlcnZpY2UsCisJCSAqIHdoaWNoIGlzIGJ5IGZhciB0aGUgbW9zdCB1c3VhbCBjYXVzZSBvZiBnZXRfc29ja19sc2EKKwkJICogZmFpbHVyZSAqLworCX0KKworCWlmICghKG9wdHMgJiBPUFRfdikpCisJCWxvZ21vZGUgPSBMT0dNT0RFX05PTkU7CisJaWYgKG9wdHMgJiBPUFRfUykgeworCQkvKiBMT0dfTkRFTEFZIGlzIG5lZWRlZCBzaW5jZSB3ZSBtYXkgY2hyb290IGxhdGVyICovCisJCW9wZW5sb2coYXBwbGV0X25hbWUsIExPR19QSUQgfCBMT0dfTkRFTEFZLCBMT0dfREFFTU9OKTsKKwkJbG9nbW9kZSB8PSBMT0dNT0RFX1NZU0xPRzsKKwl9CisJaWYgKGxvZ21vZGUpCisJCWFwcGxldF9uYW1lID0geGFzcHJpbnRmKCIlc1sldV0iLCBhcHBsZXRfbmFtZSwgKGludClnZXRwaWQoKSk7CisKKwkvL3VtYXNrKDA3Nyk7IC0gYWRtaW4gY2FuIHNldCB1bWFzayBiZWZvcmUgc3RhcnRpbmcgdXMKKworCS8qIFNpZ25hbHMgKi8KKwliYl9zaWduYWxzKDAKKwkJLyogV2UnbGwgYWx3YXlzIHRha2UgRVBJUEUgcmF0aGVyIHRoYW4gYSBydWRlIHNpZ25hbCwgdGhhbmtzICovCisJCSsgKDEgPDwgU0lHUElQRSkKKwkJLyogTElTVCBjb21tYW5kIHNwYXducyBjaGlscmVuLiBQcmV2ZW50IHpvbWJpZXMgKi8KKwkJKyAoMSA8PCBTSUdDSExEKQorCQksIFNJR19JR04pOworCisJLyogU2V0IHVwIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQgc29ja2V0IChkbyB3ZSBuZWVkIHRoZXNlIGFsbD8gd2h5PykgKi8KKwlzZXRzb2Nrb3B0XzEoU1RESU5fRklMRU5PLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVkpOworCXNldHNvY2tvcHRfa2VlcGFsaXZlKFNURElOX0ZJTEVOTyk7CisJLyogVGVsbmV0IHByb3RvY29sIG92ZXIgY29tbWFuZCBsaW5rIG1heSBzZW5kICJ1cmdlbnQiIGRhdGEsCisJICogd2UgcHJlZmVyIGl0IHRvIGJlIHJlY2VpdmVkIGluIHRoZSAibm9ybWFsIiBkYXRhIHN0cmVhbTogKi8KKwlzZXRzb2Nrb3B0XzEoU1RESU5fRklMRU5PLCBTT0xfU09DS0VULCBTT19PT0JJTkxJTkUpOworCisJV1JJVEVfT0soRlRQX0dSRUVUKTsKKwlzaWduYWwoU0lHQUxSTSwgdGltZW91dF9oYW5kbGVyKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZUUF9BVVRIRU5USUNBVElPTgorCXdoaWxlICgxKSB7CisJCXVpbnQzMl90IGNtZHZhbCA9IGNtZGlvX2dldF9jbWRfYW5kX2FyZygpOworCQkJaWYgKGNtZHZhbCA9PSBjb25zdF9VU0VSKSB7CisJCQlwdyA9IGdldHB3bmFtKEcuZnRwX2FyZyk7CisJCQljbWRpb193cml0ZV9yYXcoU1RSKEZUUF9HSVZFUFdPUkQpIiBQbGVhc2Ugc3BlY2lmeSBwYXNzd29yZFxyXG4iKTsKKwkJfSBlbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfUEFTUykgeworCQkJaWYgKGNoZWNrX3Bhc3N3b3JkKHB3LCBHLmZ0cF9hcmcpID4gMCkgeworCQkJCWJyZWFrOwkvKiBsb2dpbiBzdWNjZXNzICovCisJCQl9CisJCQljbWRpb193cml0ZV9yYXcoU1RSKEZUUF9MT0dJTkVSUikiIExvZ2luIGZhaWxlZFxyXG4iKTsKKwkJCXB3ID0gTlVMTDsKKwkJfSBlbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfUVVJVCkgeworCQkJV1JJVEVfT0soRlRQX0dPT0RCWUUpOworCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQljbWRpb193cml0ZV9yYXcoU1RSKEZUUF9MT0dJTkVSUikiIExvZ2luIHdpdGggVVNFUiBhbmQgUEFTU1xyXG4iKTsKKwkJfQorCX0KKwlXUklURV9PSyhGVFBfTE9HSU5PSyk7CisjZW5kaWYKKworCS8qIERvIHRoaXMgYWZ0ZXIgYXV0aCwgZWxzZSAvZXRjL3Bhc3N3ZCBpcyBub3QgYWNjZXNzaWJsZSAqLworI2lmICFCQl9NTVUKKwlHLnJvb3RfZmQgPSAtMTsKKyNlbmRpZgorCWFyZ3YgKz0gb3B0aW5kOworCWlmIChhcmd2WzBdKSB7CisJCWNvbnN0IGNoYXIgKmJhc2VkaXIgPSBhcmd2WzBdOworI2lmICFCQl9NTVUKKwkJRy5yb290X2ZkID0geG9wZW4oIi8iLCBPX1JET05MWSB8IE9fRElSRUNUT1JZKTsKKwkJY2xvc2Vfb25fZXhlY19vbihHLnJvb3RfZmQpOworI2VuZGlmCisJCWlmIChjaHJvb3QoYmFzZWRpcikgPT0gMCkKKwkJCWJhc2VkaXIgPSAiLyI7CisjaWYgIUJCX01NVQorCQllbHNlIHsKKwkJCWNsb3NlKEcucm9vdF9mZCk7CisJCQlHLnJvb3RfZmQgPSAtMTsKKwkJfQorI2VuZGlmCisJCS8qCisJCSAqIElmIGNocm9vdCBmYWlsZWQsIGFzc3VtZSB0aGF0IHdlIGFyZW4ndCByb290LAorCQkgKiBhbmQgYXQgbGVhc3QgY2hkaXIgdG8gdGhlIHNwZWNpZmllZCBESVIKKwkJICogKG9sZGVyIHZlcnNpb25zIHdlcmUgZHlpbmcgd2l0aCBlcnJvciBtZXNzYWdlKS4KKwkJICogSWYgY2hyb290IHdvcmtlZCwgbW92ZSBjdXJyZW50IGRpciB0byBuZXcgIi8iOgorCQkgKi8KKwkJeGNoZGlyKGJhc2VkaXIpOworCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZUUF9BVVRIRU5USUNBVElPTgorCWNoYW5nZV9pZGVudGl0eShwdyk7CisjZW5kaWYKKworCS8qIFJGQy05NTkgU2VjdGlvbiA1LjEKKwkgKiBUaGUgZm9sbG93aW5nIGNvbW1hbmRzIGFuZCBvcHRpb25zIE1VU1QgYmUgc3VwcG9ydGVkIGJ5IGV2ZXJ5CisJICogc2VydmVyLUZUUCBhbmQgdXNlci1GVFAsIGV4Y2VwdCBpbiBjYXNlcyB3aGVyZSB0aGUgdW5kZXJseWluZworCSAqIGZpbGUgc3lzdGVtIG9yIG9wZXJhdGluZyBzeXN0ZW0gZG9lcyBub3QgYWxsb3cgb3Igc3VwcG9ydAorCSAqIGEgcGFydGljdWxhciBjb21tYW5kLgorCSAqIFR5cGU6IEFTQ0lJIE5vbi1wcmludCwgSU1BR0UsIExPQ0FMIDgKKwkgKiBNb2RlOiBTdHJlYW0KKwkgKiBTdHJ1Y3R1cmU6IEZpbGUsIFJlY29yZCoKKwkgKiAoUmVjb3JkIHN0cnVjdHVyZSBpcyBSRVFVSVJFRCBvbmx5IGZvciBob3N0cyB3aG9zZSBmaWxlCisJICogIHN5c3RlbXMgc3VwcG9ydCByZWNvcmQgc3RydWN0dXJlKS4KKwkgKiBDb21tYW5kczoKKwkgKiBVU0VSLCBQQVNTLCBBQ0NULCBbYmJveDogQUNDVCBub3Qgc3VwcG9ydGVkXQorCSAqIFBPUlQsIFBBU1YsCisJICogVFlQRSwgTU9ERSwgU1RSVSwKKwkgKiBSRVRSLCBTVE9SLCBBUFBFLAorCSAqIFJORlIsIFJOVE8sIERFTEUsCisJICogQ1dELCAgQ0RVUCwgUk1ELCAgTUtELCAgUFdELAorCSAqIExJU1QsIE5MU1QsCisJICogU1lTVCwgU1RBVCwKKwkgKiBIRUxQLCBOT09QLCBRVUlULgorCSAqLworCS8qIEFDQ09VTlQgKEFDQ1QpCisJICogIlRoZSBhcmd1bWVudCBmaWVsZCBpcyBhIFRlbG5ldCBzdHJpbmcgaWRlbnRpZnlpbmcgdGhlIHVzZXIncyBhY2NvdW50LgorCSAqIFRoZSBjb21tYW5kIGlzIG5vdCBuZWNlc3NhcmlseSByZWxhdGVkIHRvIHRoZSBVU0VSIGNvbW1hbmQsIGFzIHNvbWUKKwkgKiBzaXRlcyBtYXkgcmVxdWlyZSBhbiBhY2NvdW50IGZvciBsb2dpbiBhbmQgb3RoZXJzIG9ubHkgZm9yIHNwZWNpZmljCisJICogYWNjZXNzLCBzdWNoIGFzIHN0b3JpbmcgZmlsZXMuIEluIHRoZSBsYXR0ZXIgY2FzZSB0aGUgY29tbWFuZCBtYXkKKwkgKiBhcnJpdmUgYXQgYW55IHRpbWUuCisJICogVGhlcmUgYXJlIHJlcGx5IGNvZGVzIHRvIGRpZmZlcmVudGlhdGUgdGhlc2UgY2FzZXMgZm9yIHRoZSBhdXRvbWF0aW9uOgorCSAqIHdoZW4gYWNjb3VudCBpbmZvcm1hdGlvbiBpcyByZXF1aXJlZCBmb3IgbG9naW4sIHRoZSByZXNwb25zZSB0bworCSAqIGEgc3VjY2Vzc2Z1bCBQQVNTd29yZCBjb21tYW5kIGlzIHJlcGx5IGNvZGUgMzMyLiBPbiB0aGUgb3RoZXIgaGFuZCwKKwkgKiBpZiBhY2NvdW50IGluZm9ybWF0aW9uIGlzIE5PVCByZXF1aXJlZCBmb3IgbG9naW4sIHRoZSByZXBseSB0bworCSAqIGEgc3VjY2Vzc2Z1bCBQQVNTd29yZCBjb21tYW5kIGlzIDIzMDsgYW5kIGlmIHRoZSBhY2NvdW50IGluZm9ybWF0aW9uCisJICogaXMgbmVlZGVkIGZvciBhIGNvbW1hbmQgaXNzdWVkIGxhdGVyIGluIHRoZSBkaWFsb2d1ZSwgdGhlIHNlcnZlcgorCSAqIHNob3VsZCByZXR1cm4gYSAzMzIgb3IgNTMyIHJlcGx5IGRlcGVuZGluZyBvbiB3aGV0aGVyIGl0IHN0b3JlcworCSAqIChwZW5kaW5nIHJlY2VpcHQgb2YgdGhlIEFDQ291blQgY29tbWFuZCkgb3IgZGlzY2FyZHMgdGhlIGNvbW1hbmQsCisJICogcmVzcGVjdGl2ZWx5LiIKKwkgKi8KKworCXdoaWxlICgxKSB7CisJCXVpbnQzMl90IGNtZHZhbCA9IGNtZGlvX2dldF9jbWRfYW5kX2FyZygpOworCisJCWlmIChjbWR2YWwgPT0gY29uc3RfUVVJVCkgeworCQkJV1JJVEVfT0soRlRQX0dPT0RCWUUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X1VTRVIpCisJCQkvKiBUaGlzIHdvdWxkIG1lYW4gIm9rLCBub3cgZ2l2ZSBtZSBQQVNTIi4gKi8KKwkJCS8qV1JJVEVfT0soRlRQX0dJVkVQV09SRCk7Ki8KKwkJCS8qIHZzZnRwZCBjYW4gYmUgY29uZmlndXJlZCB0byBub3QgcmVxdWlyZSB0aGF0LAorCQkJICogYW5kIHRoaXMgYWxzbyBzYXZlcyBvbmUgcm91bmR0cmlwOgorCQkJICovCisJCQlXUklURV9PSyhGVFBfTE9HSU5PSyk7CisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9QQVNTKQorCQkJV1JJVEVfT0soRlRQX0xPR0lOT0spOworCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfTk9PUCkKKwkJCVdSSVRFX09LKEZUUF9OT09QT0spOworCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfVFlQRSkKKwkJCVdSSVRFX09LKEZUUF9UWVBFT0spOworCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfU1RSVSkKKwkJCVdSSVRFX09LKEZUUF9TVFJVT0spOworCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfTU9ERSkKKwkJCVdSSVRFX09LKEZUUF9NT0RFT0spOworCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfQUxMTykKKwkJCVdSSVRFX09LKEZUUF9BTExPT0spOworCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfU1lTVCkKKwkJCWNtZGlvX3dyaXRlX3JhdyhTVFIoRlRQX1NZU1RPSykiIFVOSVggVHlwZTogTDhcclxuIik7CisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9QV0QgfHwgY21kdmFsID09IGNvbnN0X1hQV0QpCisJCQloYW5kbGVfcHdkKCk7CisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9DV0QpCisJCQloYW5kbGVfY3dkKCk7CisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9DRFVQKSAvKiBjZCAuLiAqLworCQkJaGFuZGxlX2NkdXAoKTsKKwkJLyogSEVMUCBpcyBuZWFybHkgdXNlbGVzcywgYnV0IHdlIGNhbiByZXVzZSBGRUFUIGZvciBpdCAqLworCQkvKiBsZnRwIHVzZXMgRkVBVCAqLworCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfSEVMUCB8fCBjbWR2YWwgPT0gY29uc3RfRkVBVCkKKwkJCWhhbmRsZV9mZWF0KGNtZHZhbCA9PSBjb25zdF9IRUxQCisJCQkJCT8gU1RSTlVNMzIoRlRQX0hFTFApCisJCQkJCTogU1RSTlVNMzIoRlRQX1NUQVRPSykKKwkJCSk7CisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9MSVNUKSAvKiBscyAtbCAqLworCQkJaGFuZGxlX2xpc3QoKTsKKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X05MU1QpIC8qICJuYW1lIGxpc3QiLCBiYXJlIGxzICovCisJCQloYW5kbGVfbmxzdCgpOworCQkvKiBTSVpFIGlzIGNydWNpYWwgZm9yIHdnZXQncyBkb3dubG9hZCBpbmRpY2F0b3IgZXRjICovCisJCS8qIE1vemlsbGEsIGxmdHAgdXNlIE1EVE0gKHByZXN1bWFibHkgZm9yIGNhY2hpbmcpICovCisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9TSVpFIHx8IGNtZHZhbCA9PSBjb25zdF9NRFRNKQorCQkJaGFuZGxlX3NpemVfb3JfbWR0bShjbWR2YWwgPT0gY29uc3RfU0laRSk7CisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9TVEFUKSB7CisJCQlpZiAoRy5mdHBfYXJnID09IE5VTEwpCisJCQkJaGFuZGxlX3N0YXQoKTsKKwkJCWVsc2UKKwkJCQloYW5kbGVfc3RhdF9maWxlKCk7CisJCX0KKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X1BBU1YpCisJCQloYW5kbGVfcGFzdigpOworCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfRVBTVikKKwkJCWhhbmRsZV9lcHN2KCk7CisJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9SRVRSKQorCQkJaGFuZGxlX3JldHIoKTsKKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X1BPUlQpCisJCQloYW5kbGVfcG9ydCgpOworCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfUkVTVCkKKwkJCWhhbmRsZV9yZXN0KCk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRlRQX1dSSVRFCisJCWVsc2UgaWYgKG9wdHMgJiBPUFRfdykgeworCQkJaWYgKGNtZHZhbCA9PSBjb25zdF9TVE9SKQorCQkJCWhhbmRsZV9zdG9yKCk7CisJCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfTUtEKQorCQkJCWhhbmRsZV9ta2QoKTsKKwkJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9STUQpCisJCQkJaGFuZGxlX3JtZCgpOworCQkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X0RFTEUpCisJCQkJaGFuZGxlX2RlbGUoKTsKKwkJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9STkZSKSAvKiAicmVuYW1lIGZyb20iICovCisJCQkJaGFuZGxlX3JuZnIoKTsKKwkJCWVsc2UgaWYgKGNtZHZhbCA9PSBjb25zdF9STlRPKSAvKiAicmVuYW1lIHRvIiAqLworCQkJCWhhbmRsZV9ybnRvKCk7CisJCQllbHNlIGlmIChjbWR2YWwgPT0gY29uc3RfQVBQRSkKKwkJCQloYW5kbGVfYXBwZSgpOworCQkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X1NUT1UpIC8qICJzdG9yZSB1bmlxdWUiICovCisJCQkJaGFuZGxlX3N0b3UoKTsKKwkJCWVsc2UKKwkJCQlnb3RvIGJhZF9jbWQ7CisJCX0KKyNlbmRpZgorI2lmIDAKKwkJZWxzZSBpZiAoY21kdmFsID09IGNvbnN0X1NUT1IKKwkJIHx8IGNtZHZhbCA9PSBjb25zdF9NS0QKKwkJIHx8IGNtZHZhbCA9PSBjb25zdF9STUQKKwkJIHx8IGNtZHZhbCA9PSBjb25zdF9ERUxFCisJCSB8fCBjbWR2YWwgPT0gY29uc3RfUk5GUgorCQkgfHwgY21kdmFsID09IGNvbnN0X1JOVE8KKwkJIHx8IGNtZHZhbCA9PSBjb25zdF9BUFBFCisJCSB8fCBjbWR2YWwgPT0gY29uc3RfU1RPVQorCQkpIHsKKwkJCWNtZGlvX3dyaXRlX3JhdyhTVFIoRlRQX05PUEVSTSkiIFBlcm1pc3Npb24gZGVuaWVkXHJcbiIpOworCQl9CisjZW5kaWYKKwkJZWxzZSB7CisJCQkvKiBXaGljaCB1bnN1cHBvcnRlZCBjb21tYW5kcyB3ZXJlIHNlZW4gaW4gdGhlIHdpbGQ/CisJCQkgKiAoZG9lc24ndCBuZWNlc3NhcmlseSBtZWFuICJ3ZSBtdXN0IHN1cHBvcnQgdGhlbSIpCisJCQkgKiBmb28gMS4yLjM6IFhYWFggLSBjb21tZW50CisJCQkgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9GVFBfV1JJVEUKKyBiYWRfY21kOgorI2VuZGlmCisJCQljbWRpb193cml0ZV9yYXcoU1RSKEZUUF9CQURDTUQpIiBVbmtub3duIGNvbW1hbmRcclxuIik7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2Z0cGdldHB1dC5jIGIvbmV0d29ya2luZy9mdHBnZXRwdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjgzMzY2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9mdHBnZXRwdXQuYwpAQCAtMCwwICsxLDM2MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZnRwZ2V0CisgKgorICogTWluaSBpbXBsZW1lbnRhdGlvbiBvZiBGVFAgdG8gcmV0cmlldmUgYSByZW1vdGUgZmlsZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgSmVmZiBBbmdpZWxza2ksIFRoZSBQVFIgR3JvdXAgPGplZmZAdGhlcHRyZ3JvdXAuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDAyIEdsZW5uIE1jR3JhdGgKKyAqCisgKiBCYXNlZCBvbiB3Z2V0LmMgYnkgQ2hpcCBSb3NlbnRoYWwgQ292YWQgQ29tbXVuaWNhdGlvbnMKKyAqIDxjaGlwQGxhc2VybGluay5uZXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZnRwZ2V0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gSE9TVCBbTE9DQUxfRklMRV0gUkVNT1RFX0ZJTEUiCisvL3VzYWdlOiNkZWZpbmUgZnRwZ2V0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRG93bmxvYWQgYSBmaWxlIHZpYSBGVFBcbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfRlRQR0VUUFVUX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG4JLWMsLS1jb250aW51ZQkJQ29udGludWUgcHJldmlvdXMgdHJhbnNmZXIiCisvL3VzYWdlOiAgICAgIlxuCS12LC0tdmVyYm9zZQkJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUsLS11c2VybmFtZSBVU0VSCVVzZXJuYW1lIgorLy91c2FnZTogICAgICJcbgktcCwtLXBhc3N3b3JkIFBBU1MJUGFzc3dvcmQiCisvL3VzYWdlOiAgICAgIlxuCS1QLC0tcG9ydCBOVU0JCVBvcnQiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9OT1RfRkVBVFVSRV9GVFBHRVRQVVRfTE9OR19PUFRJT05TKAorLy91c2FnZTogICAgICJcbgktYwlDb250aW51ZSBwcmV2aW91cyB0cmFuc2ZlciIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUgVVNFUglVc2VybmFtZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAgUEFTUwlQYXNzd29yZCIKKy8vdXNhZ2U6ICAgICAiXG4JLVAgTlVNCVBvcnQiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGZ0cHB1dF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIEhPU1QgW1JFTU9URV9GSUxFXSBMT0NBTF9GSUxFIgorLy91c2FnZTojZGVmaW5lIGZ0cHB1dF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlVwbG9hZCBhIGZpbGUgdG8gYSBGVFAgc2VydmVyXG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX0ZUUEdFVFBVVF9MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgIlxuCS12LC0tdmVyYm9zZQkJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUsLS11c2VybmFtZSBVU0VSCVVzZXJuYW1lIgorLy91c2FnZTogICAgICJcbgktcCwtLXBhc3N3b3JkIFBBU1MJUGFzc3dvcmQiCisvL3VzYWdlOiAgICAgIlxuCS1QLC0tcG9ydCBOVU0JCVBvcnQiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9OT1RfRkVBVFVSRV9GVFBHRVRQVVRfTE9OR19PUFRJT05TKAorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktdSBVU0VSCVVzZXJuYW1lIgorLy91c2FnZTogICAgICJcbgktcCBQQVNTCVBhc3N3b3JkIgorLy91c2FnZTogICAgICJcbgktUCBOVU0JUG9ydCBudW1iZXIiCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdHJ1Y3QgZ2xvYmFscyB7CisJY29uc3QgY2hhciAqdXNlcjsKKwljb25zdCBjaGFyICpwYXNzd29yZDsKKwlzdHJ1Y3QgbGVuX2FuZF9zb2NrYWRkciAqbHNhOworCUZJTEUgKmNvbnRyb2xfc3RyZWFtOworCWludCB2ZXJib3NlX2ZsYWc7CisJaW50IGRvX2NvbnRpbnVlOworCWNoYXIgYnVmWzRdOyAvKiBhY3R1YWxseSBbQlVGU1pdICovCit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorZW51bSB7IEJVRlNaID0gQ09NTU9OX0JVRlNJWkUgLSBvZmZzZXRvZihzdHJ1Y3QgZ2xvYmFscywgYnVmKSB9Oworc3RydWN0IEJVR19HX3Rvb19iaWcgeworCWNoYXIgQlVHX0dfdG9vX2JpZ1tzaXplb2YoRykgPD0gQ09NTU9OX0JVRlNJWkUgPyAxIDogLTFdOworfTsKKyNkZWZpbmUgdXNlciAgICAgICAgICAgKEcudXNlciAgICAgICAgICApCisjZGVmaW5lIHBhc3N3b3JkICAgICAgIChHLnBhc3N3b3JkICAgICAgKQorI2RlZmluZSBsc2EgICAgICAgICAgICAoRy5sc2EgICAgICAgICAgICkKKyNkZWZpbmUgY29udHJvbF9zdHJlYW0gKEcuY29udHJvbF9zdHJlYW0pCisjZGVmaW5lIHZlcmJvc2VfZmxhZyAgIChHLnZlcmJvc2VfZmxhZyAgKQorI2RlZmluZSBkb19jb250aW51ZSAgICAoRy5kb19jb250aW51ZSAgICkKKyNkZWZpbmUgYnVmICAgICAgICAgICAgKEcuYnVmICAgICAgICAgICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgfSB3aGlsZSAoMCkKKworCitzdGF0aWMgdm9pZCBmdHBfZGllKGNvbnN0IGNoYXIgKm1zZykgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBmdHBfZGllKGNvbnN0IGNoYXIgKm1zZykKK3sKKwljaGFyICpjcCA9IGJ1ZjsgLyogYnVmIGhvbGRzIHBlZXIncyByZXNwb25zZSAqLworCisJLyogR3VhcmQgYWdhaW5zdCBnYXJiYWdlIGZyb20gcmVtb3RlIHNlcnZlciAqLworCXdoaWxlICgqY3AgPj0gJyAnICYmICpjcCA8ICdceDdmJykKKwkJY3ArKzsKKwkqY3AgPSAnXDAnOworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmV4cGVjdGVkIHNlcnZlciByZXNwb25zZSVzJXM6ICVzIiwKKwkJCShtc2cgPyAiIHRvICIgOiAiIiksIChtc2cgPyBtc2cgOiAiIiksIGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgZnRwY21kKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMikKK3sKKwl1bnNpZ25lZCBuOworCisJaWYgKHZlcmJvc2VfZmxhZykgeworCQliYl9lcnJvcl9tc2coImNtZCAlcyAlcyIsIHMxLCBzMik7CisJfQorCisJaWYgKHMxKSB7CisJCWZwcmludGYoY29udHJvbF9zdHJlYW0sIChzMiA/ICIlcyAlc1xyXG4iIDogIiVzICVzXHJcbiIrMyksCisJCQkJCQlzMSwgczIpOworCQlmZmx1c2goY29udHJvbF9zdHJlYW0pOworCX0KKworCWRvIHsKKwkJc3RyY3B5KGJ1ZiwgIkVPRiIpOyAvKiBmb3IgZnRwX2RpZSAqLworCQlpZiAoZmdldHMoYnVmLCBCVUZTWiAtIDIsIGNvbnRyb2xfc3RyZWFtKSA9PSBOVUxMKSB7CisJCQlmdHBfZGllKE5VTEwpOworCQl9CisJfSB3aGlsZSAoIWlzZGlnaXQoYnVmWzBdKSB8fCBidWZbM10gIT0gJyAnKTsKKworCWJ1ZlszXSA9ICdcMCc7CisJbiA9IHhhdG91KGJ1Zik7CisJYnVmWzNdID0gJyAnOworCXJldHVybiBuOworfQorCitzdGF0aWMgdm9pZCBmdHBfbG9naW4odm9pZCkKK3sKKwkvKiBDb25uZWN0IHRvIHRoZSBjb21tYW5kIHNvY2tldCAqLworCWNvbnRyb2xfc3RyZWFtID0gZmRvcGVuKHhjb25uZWN0X3N0cmVhbShsc2EpLCAicisiKTsKKwlpZiAoY29udHJvbF9zdHJlYW0gPT0gTlVMTCkgeworCQkvKiBmZG9wZW4gZmFpbGVkIC0gZXh0cmVtZWx5IHVubGlrZWx5ICovCisJCWJiX3BlcnJvcl9ub21zZ19hbmRfZGllKCk7CisJfQorCisJaWYgKGZ0cGNtZChOVUxMLCBOVUxMKSAhPSAyMjApIHsKKwkJZnRwX2RpZShOVUxMKTsKKwl9CisKKwkvKiAgTG9naW4gdG8gdGhlIHNlcnZlciAqLworCXN3aXRjaCAoZnRwY21kKCJVU0VSIiwgdXNlcikpIHsKKwljYXNlIDIzMDoKKwkJYnJlYWs7CisJY2FzZSAzMzE6CisJCWlmIChmdHBjbWQoIlBBU1MiLCBwYXNzd29yZCkgIT0gMjMwKSB7CisJCQlmdHBfZGllKCJQQVNTIik7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnRwX2RpZSgiVVNFUiIpOworCX0KKworCWZ0cGNtZCgiVFlQRSBJIiwgTlVMTCk7Cit9CisKK3N0YXRpYyBpbnQgeGNvbm5lY3RfZnRwZGF0YSh2b2lkKQoreworCWNoYXIgKmJ1Zl9wdHI7CisJdW5zaWduZWQgcG9ydF9udW07CisKKy8qCitUT0RPOiBQQVNWIGNvbW1hbmQgd2lsbCBub3Qgd29yayBmb3IgSVB2Ni4gUkZDMjQyOCBkZXNjcmliZXMKK0lQdjYtY2FwYWJsZSAiZXh0ZW5kZWQgUEFTViIgLSBFUFNWLgorCisiRVBTViBbcHJvdG9jb2xdIiBhc2tzIHNlcnZlciB0byBiaW5kIHRvIGFuZCBsaXN0ZW4gb24gYSBkYXRhIHBvcnQKK2luIHNwZWNpZmllZCBwcm90b2NvbC4gUHJvdG9jb2wgaXMgMSBmb3IgSVB2NCwgMiBmb3IgSVB2Ni4KK0lmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvICJzYW1lIGFzIHVzZWQgZm9yIGNvbnRyb2wgY29ubmVjdGlvbiIuCitJZiBzZXJ2ZXIgdW5kZXJzdG9vZCB5b3UsIGl0IHNob3VsZCBhbnN3ZXIgIjIyOSA8c29tZSB0ZXh0Pih8fHxwb3J0fCkiCit3aGVyZSAifCIgYXJlIGxpdGVyYWwgcGlwZSBjaGFycyBhbmQgInBvcnQiIGlzIEFTQ0lJIGRlY2ltYWwgcG9ydCMuCisKK1RoZXJlIGlzIGFsc28gYW4gSVB2Ni1jYXBhYmxlIHJlcGxhY2VtZW50IGZvciBQT1JUIChFUFJUKSwKK2J1dCB3ZSBkb24ndCBuZWVkIHRoYXQuCisKK05COiBQQVNWIG1heSBzdGlsbCB3b3JrIGZvciBzb21lIHNlcnZlcnMgZXZlbiBvdmVyIElQdjYuCitGb3IgZXhhbXBsZSwgdnNmdHAgaGFwcGlseSBhbnN3ZXJzCisiMjI3IEVudGVyaW5nIFBhc3NpdmUgTW9kZSAoMCwwLDAsMCxuLG4pIiBhbmQgcHJvY2VlZHMgYXMgdXN1YWwuCisKK1RPRE8yOiBuZWVkIHRvIHN0b3AgaWdub3JpbmcgSVAgYWRkcmVzcyBpbiBQQVNWIHJlc3BvbnNlLgorKi8KKworCWlmIChmdHBjbWQoIlBBU1YiLCBOVUxMKSAhPSAyMjcpIHsKKwkJZnRwX2RpZSgiUEFTViIpOworCX0KKworCS8qIFJlc3BvbnNlIGlzICJOTk4gZ2FyYmFnZU4xLE4yLE4zLE40LFAxLFAyWylnYXJiYWdlXQorCSAqIFNlcnZlcidzIElQIGlzIE4xLk4yLk4zLk40ICh3ZSBpZ25vcmUgaXQpCisJICogU2VydmVyJ3MgcG9ydCBmb3IgZGF0YSBjb25uZWN0aW9uIGlzIFAxKjI1NitQMiAqLworCWJ1Zl9wdHIgPSBzdHJyY2hyKGJ1ZiwgJyknKTsKKwlpZiAoYnVmX3B0cikgKmJ1Zl9wdHIgPSAnXDAnOworCisJYnVmX3B0ciA9IHN0cnJjaHIoYnVmLCAnLCcpOworCSpidWZfcHRyID0gJ1wwJzsKKwlwb3J0X251bSA9IHhhdG91bF9yYW5nZShidWZfcHRyICsgMSwgMCwgMjU1KTsKKworCWJ1Zl9wdHIgPSBzdHJyY2hyKGJ1ZiwgJywnKTsKKwkqYnVmX3B0ciA9ICdcMCc7CisJcG9ydF9udW0gKz0geGF0b3VsX3JhbmdlKGJ1Zl9wdHIgKyAxLCAwLCAyNTUpICogMjU2OworCisJc2V0X25wb3J0KCZsc2EtPnUuc2EsIGh0b25zKHBvcnRfbnVtKSk7CisJcmV0dXJuIHhjb25uZWN0X3N0cmVhbShsc2EpOworfQorCitzdGF0aWMgaW50IHB1bXBfZGF0YV9hbmRfUVVJVChpbnQgZnJvbSwgaW50IHRvKQoreworCS8qIGNvcHkgdGhlIGZpbGUgKi8KKwlpZiAoYmJfY29weWZkX2VvZihmcm9tLCB0bykgPT0gLTEpIHsKKwkJLyogZXJyb3IgbXNnIGlzIGFscmVhZHkgcHJpbnRlZCBieSBiYl9jb3B5ZmRfZW9mICovCisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCisJLyogY2xvc2UgZGF0YSBjb25uZWN0aW9uICovCisJY2xvc2UoZnJvbSk7IC8qIGRvbid0IGtub3cgd2hpY2ggb25lIGlzIHRoYXQsIHNvIHdlIGNsb3NlIGJvdGggKi8KKwljbG9zZSh0byk7CisKKwkvKiBkb2VzIHNlcnZlciBjb25maXJtIHRoYXQgdHJhbnNmZXIgaXMgZmluaXNoZWQ/ICovCisJaWYgKGZ0cGNtZChOVUxMLCBOVUxMKSAhPSAyMjYpIHsKKwkJZnRwX2RpZShOVUxMKTsKKwl9CisJZnRwY21kKCJRVUlUIiwgTlVMTCk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCisjaWYgIUVOQUJMRV9GVFBHRVQKK2ludCBmdHBfcmVjZWl2ZShjb25zdCBjaGFyICpsb2NhbF9wYXRoLCBjaGFyICpzZXJ2ZXJfcGF0aCk7CisjZWxzZQorc3RhdGljCitpbnQgZnRwX3JlY2VpdmUoY29uc3QgY2hhciAqbG9jYWxfcGF0aCwgY2hhciAqc2VydmVyX3BhdGgpCit7CisJaW50IGZkX2RhdGE7CisJaW50IGZkX2xvY2FsID0gLTE7CisJb2ZmX3QgYmVnX3JhbmdlID0gMDsKKworCS8qIGNvbm5lY3QgdG8gdGhlIGRhdGEgc29ja2V0ICovCisJZmRfZGF0YSA9IHhjb25uZWN0X2Z0cGRhdGEoKTsKKworCWlmIChmdHBjbWQoIlNJWkUiLCBzZXJ2ZXJfcGF0aCkgIT0gMjEzKSB7CisJCWRvX2NvbnRpbnVlID0gMDsKKwl9CisKKwlpZiAoTE9ORV9EQVNIKGxvY2FsX3BhdGgpKSB7CisJCWZkX2xvY2FsID0gU1RET1VUX0ZJTEVOTzsKKwkJZG9fY29udGludWUgPSAwOworCX0KKworCWlmIChkb19jb250aW51ZSkgeworCQlzdHJ1Y3Qgc3RhdCBzYnVmOworCQkvKiBsc3RhdCB3b3VsZCBiZSB3cm9uZyBoZXJlISAqLworCQlpZiAoc3RhdChsb2NhbF9wYXRoLCAmc2J1ZikgPCAwKSB7CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInN0YXQiKTsKKwkJfQorCQlpZiAoc2J1Zi5zdF9zaXplID4gMCkgeworCQkJYmVnX3JhbmdlID0gc2J1Zi5zdF9zaXplOworCQl9IGVsc2UgeworCQkJZG9fY29udGludWUgPSAwOworCQl9CisJfQorCisJaWYgKGRvX2NvbnRpbnVlKSB7CisJCXNwcmludGYoYnVmLCAiUkVTVCAlIk9GRl9GTVQidSIsIGJlZ19yYW5nZSk7CisJCWlmIChmdHBjbWQoYnVmLCBOVUxMKSAhPSAzNTApIHsKKwkJCWRvX2NvbnRpbnVlID0gMDsKKwkJfQorCX0KKworCWlmIChmdHBjbWQoIlJFVFIiLCBzZXJ2ZXJfcGF0aCkgPiAxNTApIHsKKwkJZnRwX2RpZSgiUkVUUiIpOworCX0KKworCS8qIGNyZWF0ZSBsb2NhbCBmaWxlIF9hZnRlcl8gd2Uga25vdyB0aGF0IHJlbW90ZSBmaWxlIGV4aXN0cyAqLworCWlmIChmZF9sb2NhbCA9PSAtMSkgeworCQlmZF9sb2NhbCA9IHhvcGVuKGxvY2FsX3BhdGgsCisJCQlkb19jb250aW51ZSA/IChPX0FQUEVORCB8IE9fV1JPTkxZKQorCQkJICAgICAgICAgICAgOiAoT19DUkVBVCB8IE9fVFJVTkMgfCBPX1dST05MWSkKKwkJKTsKKwl9CisKKwlyZXR1cm4gcHVtcF9kYXRhX2FuZF9RVUlUKGZkX2RhdGEsIGZkX2xvY2FsKTsKK30KKyNlbmRpZgorCisjaWYgIUVOQUJMRV9GVFBQVVQKK2ludCBmdHBfc2VuZChjb25zdCBjaGFyICpzZXJ2ZXJfcGF0aCwgY2hhciAqbG9jYWxfcGF0aCk7CisjZWxzZQorc3RhdGljCitpbnQgZnRwX3NlbmQoY29uc3QgY2hhciAqc2VydmVyX3BhdGgsIGNoYXIgKmxvY2FsX3BhdGgpCit7CisJaW50IGZkX2RhdGE7CisJaW50IGZkX2xvY2FsOworCWludCByZXNwb25zZTsKKworCS8qIGNvbm5lY3QgdG8gdGhlIGRhdGEgc29ja2V0ICovCisJZmRfZGF0YSA9IHhjb25uZWN0X2Z0cGRhdGEoKTsKKworCS8qIGdldCB0aGUgbG9jYWwgZmlsZSAqLworCWZkX2xvY2FsID0gU1RESU5fRklMRU5POworCWlmIChOT1RfTE9ORV9EQVNIKGxvY2FsX3BhdGgpKQorCQlmZF9sb2NhbCA9IHhvcGVuKGxvY2FsX3BhdGgsIE9fUkRPTkxZKTsKKworCXJlc3BvbnNlID0gZnRwY21kKCJTVE9SIiwgc2VydmVyX3BhdGgpOworCXN3aXRjaCAocmVzcG9uc2UpIHsKKwljYXNlIDEyNToKKwljYXNlIDE1MDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnRwX2RpZSgiU1RPUiIpOworCX0KKworCXJldHVybiBwdW1wX2RhdGFfYW5kX1FVSVQoZmRfbG9jYWwsIGZkX2RhdGEpOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GVFBHRVRQVVRfTE9OR19PUFRJT05TCitzdGF0aWMgY29uc3QgY2hhciBmdHBnZXRwdXRfbG9uZ29wdHNbXSBBTElHTjEgPQorCSJjb250aW51ZVwwIiBSZXF1aXJlZF9hcmd1bWVudCAiYyIKKwkidmVyYm9zZVwwIiAgTm9fYXJndW1lbnQgICAgICAgInYiCisJInVzZXJuYW1lXDAiIFJlcXVpcmVkX2FyZ3VtZW50ICJ1IgorCSJwYXNzd29yZFwwIiBSZXF1aXJlZF9hcmd1bWVudCAicCIKKwkicG9ydFwwIiAgICAgUmVxdWlyZWRfYXJndW1lbnQgIlAiCisJOworI2VuZGlmCisKK2ludCBmdHBnZXRwdXRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZ0cGdldHB1dF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqcG9ydCA9ICJmdHAiOworCS8qIHNvY2tldCB0byBmdHAgc2VydmVyICovCisKKyNpZiBFTkFCTEVfRlRQUFVUICYmICFFTkFCTEVfRlRQR0VUCisjIGRlZmluZSBmdHBfYWN0aW9uIGZ0cF9zZW5kCisjZWxpZiBFTkFCTEVfRlRQR0VUICYmICFFTkFCTEVfRlRQUFVUCisjIGRlZmluZSBmdHBfYWN0aW9uIGZ0cF9yZWNlaXZlCisjZWxzZQorCWludCAoKmZ0cF9hY3Rpb24pKGNvbnN0IGNoYXIgKiwgY2hhciAqKSA9IGZ0cF9zZW5kOworCisJLyogQ2hlY2sgdG8gc2VlIGlmIHRoZSBjb21tYW5kIGlzIGZ0cGdldCBvciBmdHB1dCAqLworCWlmIChhcHBsZXRfbmFtZVszXSA9PSAnZycpIHsKKwkJZnRwX2FjdGlvbiA9IGZ0cF9yZWNlaXZlOworCX0KKyNlbmRpZgorCisJSU5JVF9HKCk7CisJLyogU2V0IGRlZmF1bHQgdmFsdWVzICovCisJdXNlciA9ICJhbm9ueW1vdXMiOworCXBhc3N3b3JkID0gImJ1c3lib3hAIjsKKworCS8qCisJICogRGVjaXBoZXIgdGhlIGNvbW1hbmQgbGluZQorCSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0ZUUEdFVFBVVF9MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gZnRwZ2V0cHV0X2xvbmdvcHRzOworI2VuZGlmCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTI6dnY6Y2MiOyAvKiBtdXN0IGhhdmUgMiB0byAzIHBhcmFtczsgLXYgYW5kIC1jIGNvdW50ICovCisJZ2V0b3B0MzIoYXJndiwgImN2dTpwOlA6IiwgJnVzZXIsICZwYXNzd29yZCwgJnBvcnQsCisJCQkJCSZ2ZXJib3NlX2ZsYWcsICZkb19jb250aW51ZSk7CisJYXJndiArPSBvcHRpbmQ7CisKKwkvKiBXZSB3YW50IHRvIGRvIGV4YWN0bHkgX29uZV8gRE5TIGxvb2t1cCwgc2luY2Ugc29tZQorCSAqIHNpdGVzIChpLmUuIGZ0cC51cy5kZWJpYW4ub3JnKSB1c2Ugcm91bmQtcm9iaW4gRE5TCisJICogYW5kIHdlIHdhbnQgdG8gY29ubmVjdCB0byBvbmx5IG9uZSBJUC4uLiAqLworCWxzYSA9IHhob3N0MnNvY2thZGRyKGFyZ3ZbMF0sIGJiX2xvb2t1cF9wb3J0KHBvcnQsICJ0Y3AiLCAyMSkpOworCWlmICh2ZXJib3NlX2ZsYWcpIHsKKwkJcHJpbnRmKCJDb25uZWN0aW5nIHRvICVzICglcylcbiIsIGFyZ3ZbMF0sCisJCQl4bWFsbG9jX3NvY2thZGRyMmRvdHRlZCgmbHNhLT51LnNhKSk7CisJfQorCisJZnRwX2xvZ2luKCk7CisJcmV0dXJuIGZ0cF9hY3Rpb24oYXJndlsxXSwgYXJndlsyXSA/IGFyZ3ZbMl0gOiBhcmd2WzFdKTsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvaG9zdG5hbWUuYyBiL25ldHdvcmtpbmcvaG9zdG5hbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2UzNTIyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9ob3N0bmFtZS5jCkBAIC0wLDAgKzEsMTc5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGhvc3RuYW1lIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5IGJ5IFJhbmRvbHBoIENodW5nIDx0YXVzcUBkZWJpYW4ub3JnPgorICoKKyAqIEFkanVzdGVkIGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4gdG8gcmVtb3ZlCisgKiB1c2Ugb2YgbG9uZyBvcHRpb25zIGFuZCBHTlUgZ2V0b3B0LiAgSW1wcm92ZWQgdGhlIHVzYWdlIGluZm8uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgaG9zdG5hbWVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbSE9TVE5BTUUgfCAtRiBGSUxFXSIKKy8vdXNhZ2U6I2RlZmluZSBob3N0bmFtZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkdldCBvciBzZXQgaG9zdG5hbWUgb3IgRE5TIGRvbWFpbiBuYW1lXG4iCisvL3VzYWdlOiAgICAgIlxuCS1zCVNob3J0IgorLy91c2FnZTogICAgICJcbgktaQlBZGRyZXNzZXMgZm9yIHRoZSBob3N0bmFtZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJRE5TIGRvbWFpbiBuYW1lIgorLy91c2FnZTogICAgICJcbgktZglGdWxseSBxdWFsaWZpZWQgZG9tYWluIG5hbWUiCisvL3VzYWdlOiAgICAgIlxuCS1GIEZJTEUJVXNlIEZJTEUncyBjb250ZW50IGFzIGhvc3RuYW1lIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBob3N0bmFtZV9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBob3N0bmFtZVxuIgorLy91c2FnZTogICAgICAgInNhZ2VcbiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZG5zZG9tYWlubmFtZV90cml2aWFsX3VzYWdlIE5PVVNBR0VfU1RSCisvL3VzYWdlOiNkZWZpbmUgZG5zZG9tYWlubmFtZV9mdWxsX3VzYWdlICIiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdGF0aWMgdm9pZCBkb19zZXRob3N0bmFtZShjaGFyICpzLCBpbnQgaXNmaWxlKQoreworLy8JaWYgKCFzKQorLy8JCXJldHVybjsKKwlpZiAoaXNmaWxlKSB7CisJCXBhcnNlcl90ICpwYXJzZXIgPSBjb25maWdfb3BlbjIocywgeGZvcGVuX2Zvcl9yZWFkKTsKKwkJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgJnMsIDEsIDEsICIjIFx0IiwgUEFSU0VfTk9STUFMICYgflBBUlNFX0dSRUVEWSkpIHsKKwkJCWRvX3NldGhvc3RuYW1lKHMsIDApOworCQl9CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWNvbmZpZ19jbG9zZShwYXJzZXIpOworCX0gZWxzZSBpZiAoc2V0aG9zdG5hbWUocywgc3RybGVuKHMpKSkgeworLy8JCWlmIChlcnJubyA9PSBFUEVSTSkKKy8vCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3Blcm1fZGVuaWVkX2FyZV95b3Vfcm9vdCk7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0aG9zdG5hbWUiKTsKKwl9Cit9CisKKy8qIE1hbnBhZ2UgY2lyY2EgMjAwOToKKyAqCisgKiBob3N0bmFtZSBbLXZdIFstYV0gWy0tYWxpYXNdIFstZF0gWy0tZG9tYWluXSBbLWZdIFstLWZxZG5dIFstLWxvbmddCisgKiAgICAgIFstaV0gWy0taXAtYWRkcmVzc10gWy1zXSBbLS1zaG9ydF0gWy15XSBbLS15cF0gWy0tbmlzXQorICoKKyAqIGhvc3RuYW1lIFstdl0gWy1GIGZpbGVuYW1lXSBbLS1maWxlIGZpbGVuYW1lXSAvIFtob3N0bmFtZV0KKyAqCisgKiBkb21haW5uYW1lIFstdl0gWy1GIGZpbGVuYW1lXSBbLS1maWxlIGZpbGVuYW1lXSAgLyBbbmFtZV0KKyAqICB7IGJib3g6IG5vdCBzdXBwb3J0ZWQgfQorICoKKyAqIG5vZGVuYW1lIFstdl0gWy1GIGZpbGVuYW1lXSBbLS1maWxlIGZpbGVuYW1lXSAvIFtuYW1lXQorICogIHsgYmJveDogbm90IHN1cHBvcnRlZCB9CisgKgorICogZG5zZG9tYWlubmFtZSBbLXZdCisgKiAgeyBiYm94OiBzdXBwb3J0ZWQ6IExpbnV4IGtlcm5lbCBidWlsZCBuZWVkcyB0aGlzIH0KKyAqIG5pc2RvbWFpbm5hbWUgWy12XQorICogIHsgYmJveDogbm90IHN1cHBvcnRlZCB9CisgKiB5cGRvbWFpbm5hbWUgWy12XQorICogIHsgYmJveDogbm90IHN1cHBvcnRlZCB9CisgKgorICogLWEsIC0tYWxpYXMKKyAqICBEaXNwbGF5IHRoZSBhbGlhcyBuYW1lIG9mIHRoZSBob3N0IChpZiB1c2VkKS4KKyAqICB7IGJib3g6IG5vdCBzdXBwb3J0ZWQgfQorICogLWQsIC0tZG9tYWluCisgKiAgRGlzcGxheSB0aGUgbmFtZSBvZiB0aGUgRE5TIGRvbWFpbi4gRG9uJ3QgdXNlIHRoZSBjb21tYW5kCisgKiAgZG9tYWlubmFtZSB0byBnZXQgdGhlIEROUyBkb21haW4gbmFtZSBiZWNhdXNlIGl0IHdpbGwgc2hvdyB0aGUKKyAqICBOSVMgZG9tYWluIG5hbWUgYW5kIG5vdCB0aGUgRE5TIGRvbWFpbiBuYW1lLiBVc2UgZG5zZG9tYWlubmFtZQorICogIGluc3RlYWQuCisgKiAtZiwgLS1mcWRuLCAtLWxvbmcKKyAqICBEaXNwbGF5IHRoZSBGUUROIChGdWxseSBRdWFsaWZpZWQgRG9tYWluIE5hbWUpLiBBIEZRRE4gY29uc2lzdHMKKyAqICBvZiBhIHNob3J0IGhvc3QgbmFtZSBhbmQgdGhlIEROUyBkb21haW4gbmFtZS4gVW5sZXNzIHlvdSBhcmUKKyAqICB1c2luZyBiaW5kIG9yIE5JUyBmb3IgaG9zdCBsb29rdXBzIHlvdSBjYW4gY2hhbmdlIHRoZSBGUUROIGFuZAorICogIHRoZSBETlMgZG9tYWluIG5hbWUgKHdoaWNoIGlzIHBhcnQgb2YgdGhlIEZRRE4pIGluIHRoZQorICogIC9ldGMvaG9zdHMgZmlsZS4KKyAqIC1pLCAtLWlwLWFkZHJlc3MKKyAqICBEaXNwbGF5IHRoZSBJUCBhZGRyZXNzKGVzKSBvZiB0aGUgaG9zdC4KKyAqIC1zLCAtLXNob3J0CisgKiAgRGlzcGxheSB0aGUgc2hvcnQgaG9zdCBuYW1lLiBUaGlzIGlzIHRoZSBob3N0IG5hbWUgY3V0IGF0IHRoZQorICogIGZpcnN0IGRvdC4KKyAqIC12LCAtLXZlcmJvc2UKKyAqICBCZSB2ZXJib3NlIGFuZCB0ZWxsIHdoYXQncyBnb2luZyBvbi4KKyAqICB7IGJib3g6IHN1cHBvcnRlZCBidXQgaWdub3JlZCB9CisgKiAteSwgLS15cCwgLS1uaXMKKyAqICBEaXNwbGF5IHRoZSBOSVMgZG9tYWluIG5hbWUuIElmIGEgcGFyYW1ldGVyIGlzIGdpdmVuIChvciAtLWZpbGUKKyAqICBuYW1lICkgdGhlbiByb290IGNhbiBhbHNvIHNldCBhIG5ldyBOSVMgZG9tYWluLgorICogIHsgYmJveDogbm90IHN1cHBvcnRlZCB9CisgKiAtRiwgLS1maWxlIGZpbGVuYW1lCisgKiAgUmVhZCB0aGUgaG9zdCBuYW1lIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlLiBDb21tZW50cyAobGluZXMKKyAqICBzdGFydGluZyB3aXRoIGEgYCMnKSBhcmUgaWdub3JlZC4KKyAqLworaW50IGhvc3RuYW1lX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBob3N0bmFtZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJZW51bSB7CisJCU9QVF9kID0gMHgxLAorCQlPUFRfZiA9IDB4MiwKKwkJT1BUX2kgPSAweDQsCisJCU9QVF9zID0gMHg4LAorCQlPUFRfRiA9IDB4MTAsCisJCU9QVF9kZmkgPSAweDcsCisJfTsKKworCXVuc2lnbmVkIG9wdHM7CisJY2hhciAqYnVmOworCWNoYXIgKmhvc3RuYW1lX3N0cjsKKworI2lmIEVOQUJMRV9MT05HX09QVFMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0KKwkJImRvbWFpblwwIiAgICAgTm9fYXJndW1lbnQgImQiCisJCSJmcWRuXDAiICAgICAgIE5vX2FyZ3VtZW50ICJmIgorCS8vRW5hYmxlIGlmIHNlZW4gaW4gYWN0aXZlIHVzZSBpbiBzb21lIGRpc3RybzoKKwkvLwkibG9uZ1wwIiAgICAgICBOb19hcmd1bWVudCAiZiIKKwkvLwkiaXAtYWRkcmVzc1wwIiBOb19hcmd1bWVudCAiaSIKKwkvLwkic2hvcnRcMCIgICAgICBOb19hcmd1bWVudCAicyIKKwkvLwkidmVyYm9zZVwwIiAgICBOb19hcmd1bWVudCAidiIKKwkJImZpbGVcMCIgICAgICAgTm9fYXJndW1lbnQgIkYiCisJCTsKKworI2VuZGlmCisJLyogZG5zZG9tYWlubmFtZSBmcm9tIG5ldC10b29scyAxLjYwLCBob3N0bmFtZSAxLjEwMCAoMjAwMS0wNC0xNCksCisJICogc3VwcG9ydHMgaG9zdG5hbWUncyBvcHRpb25zIHRvbyAobm90IGp1c3QgLXYgYXMgbWFucGFnZSBzYXlzKSAqLworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiZGZpc0Y6diIsICZob3N0bmFtZV9zdHIpOworCWFyZ3YgKz0gb3B0aW5kOworCWJ1ZiA9IHNhZmVfZ2V0aG9zdG5hbWUoKTsKKwlpZiAoYXBwbGV0X25hbWVbMF0gPT0gJ2QnKSAvKiBkbnNkb21haW5uYW1lPyAqLworCQlvcHRzID0gT1BUX2Q7CisKKwlpZiAob3B0cyAmIE9QVF9kZmkpIHsKKwkJLyogQ2FzZXMgd2hlbiB3ZSBuZWVkIGZ1bGwgaG9zdG5hbWUgKG9yIGl0cyBwYXJ0KSAqLworCQlzdHJ1Y3QgaG9zdGVudCAqaHA7CisJCWNoYXIgKnA7CisKKwkJaHAgPSB4Z2V0aG9zdGJ5bmFtZShidWYpOworCQlwID0gc3RyY2hybnVsKGhwLT5oX25hbWUsICcuJyk7CisJCWlmIChvcHRzICYgT1BUX2YpIHsKKwkJCXB1dHMoaHAtPmhfbmFtZSk7CisJCX0gZWxzZSBpZiAob3B0cyAmIE9QVF9zKSB7CisJCQkqcCA9ICdcMCc7CisJCQlwdXRzKGhwLT5oX25hbWUpOworCQl9IGVsc2UgaWYgKG9wdHMgJiBPUFRfZCkgeworCQkJaWYgKCpwKQorCQkJCXB1dHMocCArIDEpOworCQl9IGVsc2UgLyppZiAob3B0cyAmIE9QVF9pKSovIHsKKwkJCWlmIChocC0+aF9sZW5ndGggPT0gc2l6ZW9mKHN0cnVjdCBpbl9hZGRyKSkgeworCQkJCXN0cnVjdCBpbl9hZGRyICoqaF9hZGRyX2xpc3QgPSAoc3RydWN0IGluX2FkZHIgKiopaHAtPmhfYWRkcl9saXN0OworCQkJCXdoaWxlICgqaF9hZGRyX2xpc3QpIHsKKwkJCQkJcHJpbnRmKGhfYWRkcl9saXN0WzFdID8gIiVzICIgOiAiJXMiLCBpbmV0X250b2EoKipoX2FkZHJfbGlzdCkpOworCQkJCQloX2FkZHJfbGlzdCsrOworCQkJCX0KKwkJCQliYl9wdXRjaGFyKCdcbicpOworCQkJfQorCQl9CisJfSBlbHNlIGlmIChvcHRzICYgT1BUX3MpIHsKKwkJc3RyY2hybnVsKGJ1ZiwgJy4nKVswXSA9ICdcMCc7CisJCXB1dHMoYnVmKTsKKwl9IGVsc2UgaWYgKG9wdHMgJiBPUFRfRikgeworCQkvKiBTZXQgdGhlIGhvc3RuYW1lICovCisJCWRvX3NldGhvc3RuYW1lKGhvc3RuYW1lX3N0ciwgMSk7CisJfSBlbHNlIGlmIChhcmd2WzBdKSB7CisJCS8qIFNldCB0aGUgaG9zdG5hbWUgKi8KKwkJZG9fc2V0aG9zdG5hbWUoYXJndlswXSwgMCk7CisJfSBlbHNlIHsKKwkJLyogSnVzdCBwcmludCB0aGUgY3VycmVudCBob3N0bmFtZSAqLworCQlwdXRzKGJ1Zik7CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmcmVlKGJ1Zik7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvaHR0cGQuYyBiL25ldHdvcmtpbmcvaHR0cGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDE1ZmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9odHRwZC5jCkBAIC0wLDAgKzEsMjYwMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaHR0cGQgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIsMjAwMyBHbGVubiBFbmdlbCA8Z2xlbm5lQGVuZ2VsLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMy0yMDA2IFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFR5cGljYWwgdXNhZ2U6CisgKiBGb3Igbm9uIHJvb3QgdXNlcjoKKyAqICAgICAgaHR0cGQgLXAgODA4MCAtaCAkSE9NRS9wdWJsaWNfaHRtbAorICogRm9yIGRhZW1vbiBzdGFydCBmcm9tIHJjIHNjcmlwdCB3aXRoIHVpZD0wOgorICogICAgICBodHRwZCAtdSB3d3cKKyAqIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gKGFzc3VtaW5nIHVzZXIgd3d3IGhhcyB1aWQgODApOgorICogICAgICBodHRwZCAtcCA4MCAtdSA4MCAtaCAkUFdEIC1jIC9ldGMvaHR0cGQuY29uZiAtciAiV2ViIFNlcnZlciBBdXRoZW50aWNhdGlvbiIKKyAqCisgKiBXaGVuIGFuIHVybCBzdGFydHMgd2l0aCAiL2NnaS1iaW4vIiBpdCBpcyBhc3N1bWVkIHRvIGJlIGEgY2dpIHNjcmlwdC4KKyAqIFRoZSBzZXJ2ZXIgY2hhbmdlcyBkaXJlY3RvcnkgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBzY3JpcHQgYW5kIGV4ZWN1dGVzIGl0CisgKiBhZnRlciBzZXR0aW5nIFFVRVJZX1NUUklORyBhbmQgb3RoZXIgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorICoKKyAqIElmIGRpcmVjdG9yeSBVUkwgaXMgZ2l2ZW4sIG5vIGluZGV4Lmh0bWwgaXMgZm91bmQgYW5kIENHSSBzdXBwb3J0IGlzIGVuYWJsZWQsCisgKiBjZ2ktYmluL2luZGV4LmNnaSB3aWxsIGJlIHJ1bi4gRGlyZWN0b3J5IHRvIGxpc3QgaXMgLi4vJFFVRVJZX1NUUklORy4KKyAqIFNlZSBodHRwZF9pbmRleGNnaS5jIGZvciBhbiBleGFtcGxlIEdDSSBjb2RlLgorICoKKyAqIERvYzoKKyAqICJDR0kgRW52aXJvbm1lbnQgVmFyaWFibGVzIjogaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS9lbnYuaHRtbAorICoKKyAqIFRoZSBhcHBsZXQgY2FuIGFsc28gYmUgaW52b2tlZCBhcyBhbiB1cmwgYXJnIGRlY29kZXIgYW5kIGh0bWwgdGV4dCBlbmNvZGVyCisgKiBhcyBmb2xsb3dzOgorICogICAgICBmb289YGh0dHBkIC1kICRmb29gICAgICAgICAgICAgICMgZGVjb2RlICJIZWxsbyUyMFdvcmxkIiBhcyAiSGVsbG8gV29ybGQiCisgKiAgICAgIGJhcj1gaHR0cGQgLWUgIjxIZWxsbyBXb3JsZD4iYCAgIyBlbmNvZGUgYXMgIiYjNjBIZWxsbyYjMzJXb3JsZCYjNjIiCisgKiBOb3RlIHRoYXQgdXJsIGVuY29kaW5nIGZvciBhcmd1bWVudHMgaXMgbm90IHRoZSBzYW1lIGFzIGh0bWwgZW5jb2RpbmcgZm9yCisgKiBwcmVzZW50YXRpb24uICAtZCBkZWNvZGVzIGFuIHVybC1lbmNvZGVkIGFyZ3VtZW50IHdoaWxlIC1lIGVuY29kZXMgaW4gaHRtbAorICogZm9yIHBhZ2UgZGlzcGxheS4KKyAqCisgKiBodHRwZC5jb25mIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDoKKyAqCisgKiBIOi9zZXJ2ZXJyb290ICAgICAjIGRlZmluZSB0aGUgc2VydmVyIHJvb3QuIEl0IHdpbGwgb3ZlcnJpZGUgLWgKKyAqIEE6MTcyLjIwLiAgICAgICAgICMgQWxsb3cgYWRkcmVzcyBmcm9tIDE3Mi4yMC4wLjAvMTYKKyAqIEE6MTAuMC4wLjAvMjUgICAgICMgQWxsb3cgYW55IGFkZHJlc3MgZnJvbSAxMC4wLjAuMC0xMC4wLjAuMTI3CisgKiBBOjEwLjAuMC4wLzI1NS4yNTUuMjU1LjEyOCAgIyBBbGxvdyBhbnkgYWRkcmVzcyB0aGF0IHByZXZpb3VzIHNldAorICogQToxMjcuMC4wLjEgICAgICAgIyBBbGxvdyBsb2NhbCBsb29wYmFjayBjb25uZWN0aW9ucworICogRDoqICAgICAgICAgICAgICAgIyBEZW55IGZyb20gb3RoZXIgSVAgY29ubmVjdGlvbnMKKyAqIEU0MDQ6L3BhdGgvZTQwNC5odG1sICMgL3BhdGgvZTQwNC5odG1sIGlzIHRoZSA0MDQgKG5vdCBmb3VuZCkgZXJyb3IgcGFnZQorICogSTppbmRleC5odG1sICAgICAgIyBTaG93IGluZGV4Lmh0bWwgd2hlbiBhIGRpcmVjdG9yeSBpcyByZXF1ZXN0ZWQKKyAqCisgKiBQOi91cmw6W2h0dHA6Ly9daG9zdG5hbWVbOnBvcnRdL25ldy9wYXRoCisgKiAgICAgICAgICAgICAgICAgICAjIFdoZW4gL3VybFhYWFhYWCBpcyByZXF1ZXN0ZWQsIHJldmVyc2UgcHJveHkKKyAqICAgICAgICAgICAgICAgICAgICMgaXQgdG8gaHR0cDovL2hvc3RuYW1lWzpwb3J0XS9uZXcvcGF0aFhYWFhYWAorICoKKyAqIC9jZ2ktYmluOmZvbzpiYXIgICMgUmVxdWlyZSB1c2VyIGZvbywgcHdkIGJhciBvbiB1cmxzIHN0YXJ0aW5nIHdpdGggL2NnaS1iaW4vCisgKiAvYWRtOmFkbWluOnNldHVwICAjIFJlcXVpcmUgdXNlciBhZG1pbiwgcHdkIHNldHVwIG9uIHVybHMgc3RhcnRpbmcgd2l0aCAvYWRtLworICogL2FkbTp0b29yOlBhU3NXZCAgIyBvciB1c2VyIHRvb3IsIHB3ZCBQYVNzV2Qgb24gdXJscyBzdGFydGluZyB3aXRoIC9hZG0vCisgKiAvYWRtOnJvb3Q6KiAgICAgICAjIG9yIHVzZXIgcm9vdCwgcHdkIGZyb20gL2V0Yy9wYXNzd2Qgb24gdXJscyBzdGFydGluZyB3aXRoIC9hZG0vCisgKiAvd2lraToqOiogICAgICAgICAjIG9yIGFueSB1c2VyIGZyb20gL2V0Yy9wYXNzd2Qgd2l0aCBhY2NvcmRpbmcgcHdkIG9uIHVybHMgc3RhcnRpbmcgd2l0aCAvd2lraS8KKyAqIC5hdTphdWRpby9iYXNpYyAgICMgYWRkaXRpb25hbCBtaW1lIHR5cGUgZm9yIGF1ZGlvLmF1IGZpbGVzCisgKiAqLnBocDovcGF0aC9waHAgICAjIHJ1biB4eHgucGhwIHRocm91Z2ggYW4gaW50ZXJwcmV0ZXIKKyAqCisgKiBBL0QgbWF5IGJlIGFzIGEvZCBvciBhbGxvdy9kZW55IC0gb25seSBmaXJzdCBjaGFyIG1hdHRlcnMuCisgKiBEZW55L0FsbG93IElQIGxvZ2ljOgorICogIC0gRGVmYXVsdCBpcyB0byBhbGxvdyBhbGwgKEFsbG93IGFsbCAoQToqKSBpcyBhIG5vLW9wKS4KKyAqICAtIERlbnkgcnVsZXMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgYWxsb3cgcnVsZXMuCisgKiAgLSAiRGVueSBhbGwiIHJ1bGUgKEQ6KikgaXMgYXBwbGllZCBsYXN0LgorICoKKyAqIEV4YW1wbGU6CisgKiAgIDEuIEFsbG93IG9ubHkgc3BlY2lmaWVkIGFkZHJlc3NlcworICogICAgIEE6MTcyLjIwICAgICAgICAgICMgQWxsb3cgYW55IGFkZHJlc3MgdGhhdCBiZWdpbnMgd2l0aCAxNzIuMjAuCisgKiAgICAgQToxMC4xMC4gICAgICAgICAgIyBBbGxvdyBhbnkgYWRkcmVzcyB0aGF0IGJlZ2lucyB3aXRoIDEwLjEwLgorICogICAgIEE6MTI3LjAuMC4xICAgICAgICMgQWxsb3cgbG9jYWwgbG9vcGJhY2sgY29ubmVjdGlvbnMKKyAqICAgICBEOiogICAgICAgICAgICAgICAjIERlbnkgZnJvbSBvdGhlciBJUCBjb25uZWN0aW9ucworICoKKyAqICAgMi4gT25seSBkZW55IHNwZWNpZmllZCBhZGRyZXNzZXMKKyAqICAgICBEOjEuMi4zLiAgICAgICAgIyBkZW55IGZyb20gMS4yLjMuMCAtIDEuMi4zLjI1NQorICogICAgIEQ6Mi4zLjQuICAgICAgICAjIGRlbnkgZnJvbSAyLjMuNC4wIC0gMi4zLjQuMjU1CisgKiAgICAgQToqICAgICAgICAgICAgICMgKG9wdGlvbmFsIGxpbmUgYWRkZWQgZm9yIGNsYXJpdHkpCisgKgorICogSWYgYSBzdWIgZGlyZWN0b3J5IGNvbnRhaW5zIGNvbmZpZyBmaWxlLCBpdCBpcyBwYXJzZWQgYW5kIG1lcmdlZCB3aXRoCisgKiBhbnkgZXhpc3Rpbmcgc2V0dGluZ3MgYXMgaWYgaXQgd2FzIGFwcGVuZGVkIHRvIHRoZSBvcmlnaW5hbCBjb25maWd1cmF0aW9uLgorICoKKyAqIHN1YmRpciBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIGNvbnRhaW5pbmcgc3ViZGlyIGFuZCB0aHVzIGNhbm5vdAorICogYWZmZWN0IHRoZSBwYXJlbnQgcnVsZXMuCisgKgorICogTm90ZSB0aGF0IHNpbmNlIHRoZSBzdWIgZGlyIGlzIHBhcnNlZCBpbiB0aGUgZm9ya2VkIHRocmVhZCBzZXJ2aWNpbmcgdGhlCisgKiBzdWJkaXIgaHR0cCByZXF1ZXN0LCBhbnkgbWVyZ2UgaXMgZGlzY2FyZGVkIHdoZW4gdGhlIHByb2Nlc3MgZXhpdHMuICBBcyBhCisgKiByZXN1bHQsIHRoZSBzdWJkaXIgc2V0dGluZ3Mgb25seSBoYXZlIGEgbGlmZXRpbWUgb2YgYSBzaW5nbGUgcmVxdWVzdC4KKyAqCisgKiBDdXN0b20gZXJyb3IgcGFnZXMgY2FuIGNvbnRhaW4gYW4gYWJzb2x1dGUgcGF0aCBvciBiZSByZWxhdGl2ZSB0bworICogJ2hvbWVfaHR0cGQnLiBFcnJvciBwYWdlcyBhcmUgdG8gYmUgc3RhdGljIGZpbGVzIChubyBDR0kgb3Igc2NyaXB0KS4gRXJyb3IKKyAqIHBhZ2UgY2FuIG9ubHkgYmUgZGVmaW5lZCBpbiB0aGUgcm9vdCBjb25maWd1cmF0aW9uIGZpbGUgYW5kIGFyZSBub3QgdGFrZW4KKyAqIGludG8gYWNjb3VudCBpbiBsb2NhbCAoZGlyZWN0b3JpZXMpIGNvbmZpZyBmaWxlcy4KKyAqCisgKiBJZiAtYyBpcyBub3Qgc2V0LCBhbiBhdHRlbXB0IHdpbGwgYmUgbWFkZSB0byBvcGVuIHRoZSBkZWZhdWx0CisgKiByb290IGNvbmZpZ3VyYXRpb24gZmlsZS4gIElmIC1jIGlzIHNldCBhbmQgdGhlIGZpbGUgaXMgbm90IGZvdW5kLCB0aGUKKyAqIHNlcnZlciBleGl0cyB3aXRoIGFuIGVycm9yLgorICoKKyAqLworIC8qIFRPRE86IHVzZSBUQ1BfQ09SSywgcGFyc2VfY29uZmlnKCkgKi8KKworLy91c2FnZTojZGVmaW5lIGh0dHBkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWlmdlt2XV0iCisvL3VzYWdlOiAgICAgICAiIFstYyBDT05GRklMRV0iCisvL3VzYWdlOiAgICAgICAiIFstcCBbSVA6XVBPUlRdIgorLy91c2FnZToJSUZfRkVBVFVSRV9IVFRQRF9TRVRVSUQoIiBbLXUgVVNFUls6R1JQXV0iKQorLy91c2FnZToJSUZfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRIKCIgWy1yIFJFQUxNXSIpCisvL3VzYWdlOiAgICAgICAiIFstaCBIT01FXVxuIgorLy91c2FnZTogICAgICAgIm9yIGh0dHBkIC1kLy1lIiBJRl9GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1KCIvLW0iKSAiIFNUUklORyIKKy8vdXNhZ2U6I2RlZmluZSBodHRwZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkxpc3RlbiBmb3IgaW5jb21pbmcgSFRUUCByZXF1ZXN0c1xuIgorLy91c2FnZTogICAgICJcbgktaQkJSW5ldGQgbW9kZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJCURvbid0IGRhZW1vbml6ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXZbdl0JCVZlcmJvc2UiCisvL3VzYWdlOiAgICAgIlxuCS1wIFtJUDpdUE9SVAlCaW5kIHRvIElQOlBPUlQgKGRlZmF1bHQgKjo4MCkiCisvL3VzYWdlOglJRl9GRUFUVVJFX0hUVFBEX1NFVFVJRCgKKy8vdXNhZ2U6ICAgICAiXG4JLXUgVVNFUls6R1JQXQlTZXQgdWlkL2dpZCBhZnRlciBiaW5kaW5nIHRvIHBvcnQiKQorLy91c2FnZToJSUZfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRIKAorLy91c2FnZTogICAgICJcbgktciBSRUFMTQlBdXRoZW50aWNhdGlvbiBSZWFsbSBmb3IgQmFzaWMgQXV0aGVudGljYXRpb24iKQorLy91c2FnZTogICAgICJcbgktaCBIT01FCQlIb21lIGRpcmVjdG9yeSAoZGVmYXVsdCAuKSIKKy8vdXNhZ2U6ICAgICAiXG4JLWMgRklMRQkJQ29uZmlndXJhdGlvbiBmaWxlIChkZWZhdWx0IHsvZXRjLEhPTUV9L2h0dHBkLmNvbmYpIgorLy91c2FnZToJSUZfRkVBVFVSRV9IVFRQRF9BVVRIX01ENSgKKy8vdXNhZ2U6ICAgICAiXG4JLW0gU1RSSU5HCU1ENSBjcnlwdCBTVFJJTkciKQorLy91c2FnZTogICAgICJcbgktZSBTVFJJTkcJSFRNTCBlbmNvZGUgU1RSSU5HIgorLy91c2FnZTogICAgICJcbgktZCBTVFJJTkcJVVJMIGRlY29kZSBTVFJJTkciCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2lmIEVOQUJMRV9QQU0KKy8qIFBBTSBtYXkgaW5jbHVkZSA8bG9jYWxlLmg+LiBXZSBtYXkgbmVlZCB0byB1bmRlZmluZSBiYm94J3Mgc3R1YiBkZWZpbmU6ICovCisjIHVuZGVmIHNldGxvY2FsZQorLyogRm9yIHNvbWUgb2JzY3VyZSByZWFzb24sIFBBTSBpcyBub3QgaW4gcGFtL3h4eCwgYnV0IGluIHNlY3VyaXR5L3h4eC4KKyAqIEFwcGFyZW50bHkgdGhleSBsaWtlIHRvIGNvbmZ1c2UgcGVvcGxlLiAqLworIyBpbmNsdWRlIDxzZWN1cml0eS9wYW1fYXBwbC5oPgorIyBpbmNsdWRlIDxzZWN1cml0eS9wYW1fbWlzYy5oPgorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX1NFTkRGSUxFCisjIGluY2x1ZGUgPHN5cy9zZW5kZmlsZS5oPgorI2VuZGlmCisvKiBhbW91bnQgb2YgYnVmZmVyaW5nIGluIGEgcGlwZSAqLworI2lmbmRlZiBQSVBFX0JVRgorIyBkZWZpbmUgUElQRV9CVUYgNDA5NgorI2VuZGlmCisKKyNkZWZpbmUgREVCVUcgMAorCisjZGVmaW5lIElPQlVGX1NJWkUgODE5MgorI2lmIFBJUEVfQlVGID49IElPQlVGX1NJWkUKKyMgZXJyb3IgIlBJUEVfQlVGID49IElPQlVGX1NJWkUiCisjZW5kaWYKKworI2RlZmluZSBIRUFERVJfUkVBRF9USU1FT1VUIDYwCisKK3N0YXRpYyBjb25zdCBjaGFyIERFRkFVTFRfUEFUSF9IVFRQRF9DT05GW10gQUxJR04xID0gIi9ldGMiOworc3RhdGljIGNvbnN0IGNoYXIgSFRUUERfQ09ORltdIEFMSUdOMSA9ICJodHRwZC5jb25mIjsKK3N0YXRpYyBjb25zdCBjaGFyIEhUVFBfMjAwW10gQUxJR04xID0gIkhUVFAvMS4wIDIwMCBPS1xyXG4iOworc3RhdGljIGNvbnN0IGNoYXIgaW5kZXhfaHRtbFtdIEFMSUdOMSA9ICJpbmRleC5odG1sIjsKKwordHlwZWRlZiBzdHJ1Y3QgaGFzX25leHRfcHRyIHsKKwlzdHJ1Y3QgaGFzX25leHRfcHRyICpuZXh0OworfSBoYXNfbmV4dF9wdHI7CisKKy8qIE11c3QgaGF2ZSAibmV4dCIgYXMgYSBmaXJzdCBtZW1iZXIgKi8KK3R5cGVkZWYgc3RydWN0IEh0YWNjZXNzIHsKKwlzdHJ1Y3QgSHRhY2Nlc3MgKm5leHQ7CisJY2hhciAqYWZ0ZXJfY29sb247CisJY2hhciBiZWZvcmVfY29sb25bMV07ICAvKiByZWFsbHkgYmlnZ2VyLCBtdXN0IGJlIGxhc3QgKi8KK30gSHRhY2Nlc3M7CisKKy8qIE11c3QgaGF2ZSAibmV4dCIgYXMgYSBmaXJzdCBtZW1iZXIgKi8KK3R5cGVkZWYgc3RydWN0IEh0YWNjZXNzX0lQIHsKKwlzdHJ1Y3QgSHRhY2Nlc3NfSVAgKm5leHQ7CisJdW5zaWduZWQgaXA7CisJdW5zaWduZWQgbWFzazsKKwlpbnQgYWxsb3dfZGVueTsKK30gSHRhY2Nlc3NfSVA7CisKKy8qIE11c3QgaGF2ZSAibmV4dCIgYXMgYSBmaXJzdCBtZW1iZXIgKi8KK3R5cGVkZWYgc3RydWN0IEh0YWNjZXNzX1Byb3h5IHsKKwlzdHJ1Y3QgSHRhY2Nlc3NfUHJveHkgKm5leHQ7CisJY2hhciAqdXJsX2Zyb207CisJY2hhciAqaG9zdF9wb3J0OworCWNoYXIgKnVybF90bzsKK30gSHRhY2Nlc3NfUHJveHk7CisKK2VudW0geworCUhUVFBfT0sgPSAyMDAsCisJSFRUUF9QQVJUSUFMX0NPTlRFTlQgPSAyMDYsCisJSFRUUF9NT1ZFRF9URU1QT1JBUklMWSA9IDMwMiwKKwlIVFRQX0JBRF9SRVFVRVNUID0gNDAwLCAgICAgICAvKiBtYWxmb3JtZWQgc3ludGF4ICovCisJSFRUUF9VTkFVVEhPUklaRUQgPSA0MDEsIC8qIGF1dGhlbnRpY2F0aW9uIG5lZWRlZCwgcmVzcG9uZCB3aXRoIGF1dGggaGRyICovCisJSFRUUF9OT1RfRk9VTkQgPSA0MDQsCisJSFRUUF9GT1JCSURERU4gPSA0MDMsCisJSFRUUF9SRVFVRVNUX1RJTUVPVVQgPSA0MDgsCisJSFRUUF9OT1RfSU1QTEVNRU5URUQgPSA1MDEsICAgLyogdXNlZCBmb3IgdW5yZWNvZ25pemVkIHJlcXVlc3RzICovCisJSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IgPSA1MDAsCisJSFRUUF9DT05USU5VRSA9IDEwMCwKKyNpZiAwICAgLyogZnV0dXJlIHVzZSAqLworCUhUVFBfU1dJVENISU5HX1BST1RPQ09MUyA9IDEwMSwKKwlIVFRQX0NSRUFURUQgPSAyMDEsCisJSFRUUF9BQ0NFUFRFRCA9IDIwMiwKKwlIVFRQX05PTl9BVVRIT1JJVEFUSVZFX0lORk8gPSAyMDMsCisJSFRUUF9OT19DT05URU5UID0gMjA0LAorCUhUVFBfTVVMVElQTEVfQ0hPSUNFUyA9IDMwMCwKKwlIVFRQX01PVkVEX1BFUk1BTkVOVExZID0gMzAxLAorCUhUVFBfTk9UX01PRElGSUVEID0gMzA0LAorCUhUVFBfUEFZTUVOVF9SRVFVSVJFRCA9IDQwMiwKKwlIVFRQX0JBRF9HQVRFV0FZID0gNTAyLAorCUhUVFBfU0VSVklDRV9VTkFWQUlMQUJMRSA9IDUwMywgLyogb3ZlcmxvYWQsIG1haW50ZW5hbmNlICovCisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCB1aW50MTZfdCBodHRwX3Jlc3BvbnNlX3R5cGVbXSBBTElHTjIgPSB7CisJSFRUUF9PSywKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9SQU5HRVMKKwlIVFRQX1BBUlRJQUxfQ09OVEVOVCwKKyNlbmRpZgorCUhUVFBfTU9WRURfVEVNUE9SQVJJTFksCisJSFRUUF9SRVFVRVNUX1RJTUVPVVQsCisJSFRUUF9OT1RfSU1QTEVNRU5URUQsCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSAorCUhUVFBfVU5BVVRIT1JJWkVELAorI2VuZGlmCisJSFRUUF9OT1RfRk9VTkQsCisJSFRUUF9CQURfUkVRVUVTVCwKKwlIVFRQX0ZPUkJJRERFTiwKKwlIVFRQX0lOVEVSTkFMX1NFUlZFUl9FUlJPUiwKKyNpZiAwICAgLyogbm90IGltcGxlbWVudGVkICovCisJSFRUUF9DUkVBVEVELAorCUhUVFBfQUNDRVBURUQsCisJSFRUUF9OT19DT05URU5ULAorCUhUVFBfTVVMVElQTEVfQ0hPSUNFUywKKwlIVFRQX01PVkVEX1BFUk1BTkVOVExZLAorCUhUVFBfTk9UX01PRElGSUVELAorCUhUVFBfQkFEX0dBVEVXQVksCisJSFRUUF9TRVJWSUNFX1VOQVZBSUxBQkxFLAorI2VuZGlmCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwljb25zdCBjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKmluZm87Cit9IGh0dHBfcmVzcG9uc2VbQVJSQVlfU0laRShodHRwX3Jlc3BvbnNlX3R5cGUpXSA9IHsKKwl7ICJPSyIsIE5VTEwgfSwKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9SQU5HRVMKKwl7ICJQYXJ0aWFsIENvbnRlbnQiLCBOVUxMIH0sCisjZW5kaWYKKwl7ICJGb3VuZCIsIE5VTEwgfSwKKwl7ICJSZXF1ZXN0IFRpbWVvdXQiLCAiTm8gcmVxdWVzdCBhcHBlYXJlZCB3aXRoaW4gNjAgc2Vjb25kcyIgfSwKKwl7ICJOb3QgSW1wbGVtZW50ZWQiLCAiVGhlIHJlcXVlc3RlZCBtZXRob2QgaXMgbm90IHJlY29nbml6ZWQiIH0sCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSAorCXsgIlVuYXV0aG9yaXplZCIsICIiIH0sCisjZW5kaWYKKwl7ICJOb3QgRm91bmQiLCAiVGhlIHJlcXVlc3RlZCBVUkwgd2FzIG5vdCBmb3VuZCIgfSwKKwl7ICJCYWQgUmVxdWVzdCIsICJVbnN1cHBvcnRlZCBtZXRob2QiIH0sCisJeyAiRm9yYmlkZGVuIiwgIiIgIH0sCisJeyAiSW50ZXJuYWwgU2VydmVyIEVycm9yIiwgIkludGVybmFsIFNlcnZlciBFcnJvciIgfSwKKyNpZiAwICAgLyogbm90IGltcGxlbWVudGVkICovCisJeyAiQ3JlYXRlZCIgfSwKKwl7ICJBY2NlcHRlZCIgfSwKKwl7ICJObyBDb250ZW50IiB9LAorCXsgIk11bHRpcGxlIENob2ljZXMiIH0sCisJeyAiTW92ZWQgUGVybWFuZW50bHkiIH0sCisJeyAiTm90IE1vZGlmaWVkIiB9LAorCXsgIkJhZCBHYXRld2F5IiwgIiIgfSwKKwl7ICJTZXJ2aWNlIFVuYXZhaWxhYmxlIiwgIiIgfSwKKyNlbmRpZgorfTsKKworc3RydWN0IGdsb2JhbHMgeworCWludCB2ZXJib3NlOyAgICAgICAgICAgIC8qIG11c3QgYmUgaW50ICh1c2VkIGJ5IGdldG9wdDMyKSAqLworCXNtYWxsaW50IGZsZ19kZW55X2FsbDsKKworCXVuc2lnbmVkIHJtdF9pcDsgICAgICAgIC8qIHVzZWQgZm9yIElQLWJhc2VkIGFsbG93L2RlbnkgcnVsZXMgKi8KKwl0aW1lX3QgbGFzdF9tb2Q7CisJY2hhciAqcm10X2lwX3N0cjsgICAgICAgLyogZm9yICRSRU1PVEVfQUREUiBhbmQgJFJFTU9URV9QT1JUICovCisJY29uc3QgY2hhciAqYmluZF9hZGRyX29yX3BvcnQ7CisKKwljb25zdCBjaGFyICpnX3F1ZXJ5OworCWNvbnN0IGNoYXIgKm9wdF9jX2NvbmZpZ0ZpbGU7CisJY29uc3QgY2hhciAqaG9tZV9odHRwZDsKKwljb25zdCBjaGFyICppbmRleF9wYWdlOworCisJY29uc3QgY2hhciAqZm91bmRfbWltZV90eXBlOworCWNvbnN0IGNoYXIgKmZvdW5kX21vdmVkX3RlbXBvcmFyaWx5OworCUh0YWNjZXNzX0lQICppcF9hX2Q7ICAgIC8qIGNvbmZpZyBhbGxvdy9kZW55IGxpbmVzICovCisKKwlJRl9GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgoY29uc3QgY2hhciAqZ19yZWFsbTspCisJSUZfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRIKGNoYXIgKnJlbW90ZXVzZXI7KQorCUlGX0ZFQVRVUkVfSFRUUERfQ0dJKGNoYXIgKnJlZmVyZXI7KQorCUlGX0ZFQVRVUkVfSFRUUERfQ0dJKGNoYXIgKnVzZXJfYWdlbnQ7KQorCUlGX0ZFQVRVUkVfSFRUUERfQ0dJKGNoYXIgKmhvc3Q7KQorCUlGX0ZFQVRVUkVfSFRUUERfQ0dJKGNoYXIgKmh0dHBfYWNjZXB0OykKKwlJRl9GRUFUVVJFX0hUVFBEX0NHSShjaGFyICpodHRwX2FjY2VwdF9sYW5ndWFnZTspCisKKwlvZmZfdCBmaWxlX3NpemU7ICAgICAgICAvKiAtMSAtIHVua25vd24gKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9SQU5HRVMKKwlvZmZfdCByYW5nZV9zdGFydDsKKwlvZmZfdCByYW5nZV9lbmQ7CisJb2ZmX3QgcmFuZ2VfbGVuOworI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRICisJSHRhY2Nlc3MgKmdfYXV0aDsgICAgICAgLyogY29uZmlnIHVzZXI6cGFzc3dvcmQgbGluZXMgKi8KKyNlbmRpZgorCUh0YWNjZXNzICptaW1lX2E7ICAgICAgIC8qIGNvbmZpZyBtaW1lIHR5cGVzICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQ09ORklHX1dJVEhfU0NSSVBUX0lOVEVSUFIKKwlIdGFjY2VzcyAqc2NyaXB0X2k7ICAgICAvKiBjb25maWcgc2NyaXB0IGludGVycHJldGVycyAqLworI2VuZGlmCisJY2hhciAqaW9idWY7ICAgICAgICAgICAgLyogW0lPQlVGX1NJWkVdICovCisjZGVmaW5lIGhkcl9idWYgYmJfY29tbW9uX2J1ZnNpejEKKwljaGFyICpoZHJfcHRyOworCWludCBoZHJfY250OworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0VSUk9SX1BBR0VTCisJY29uc3QgY2hhciAqaHR0cF9lcnJvcl9wYWdlW0FSUkFZX1NJWkUoaHR0cF9yZXNwb25zZV90eXBlKV07CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9QUk9YWQorCUh0YWNjZXNzX1Byb3h5ICpwcm94eTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0daSVAKKwkvKiBjbGllbnQgY2FuIGhhbmRsZSBnemlwIC8gd2UgYXJlIGdvaW5nIHRvIHNlbmQgZ3ppcCAqLworCXNtYWxsaW50IGNvbnRlbnRfZ3ppcDsKKyNlbmRpZgorfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSB2ZXJib3NlICAgICAgICAgICAoRy52ZXJib3NlICAgICAgICAgICkKKyNkZWZpbmUgZmxnX2RlbnlfYWxsICAgICAgKEcuZmxnX2RlbnlfYWxsICAgICApCisjZGVmaW5lIHJtdF9pcCAgICAgICAgICAgIChHLnJtdF9pcCAgICAgICAgICAgKQorI2RlZmluZSBiaW5kX2FkZHJfb3JfcG9ydCAoRy5iaW5kX2FkZHJfb3JfcG9ydCkKKyNkZWZpbmUgZ19xdWVyeSAgICAgICAgICAgKEcuZ19xdWVyeSAgICAgICAgICApCisjZGVmaW5lIG9wdF9jX2NvbmZpZ0ZpbGUgIChHLm9wdF9jX2NvbmZpZ0ZpbGUgKQorI2RlZmluZSBob21lX2h0dHBkICAgICAgICAoRy5ob21lX2h0dHBkICAgICAgICkKKyNkZWZpbmUgaW5kZXhfcGFnZSAgICAgICAgKEcuaW5kZXhfcGFnZSAgICAgICApCisjZGVmaW5lIGZvdW5kX21pbWVfdHlwZSAgIChHLmZvdW5kX21pbWVfdHlwZSAgKQorI2RlZmluZSBmb3VuZF9tb3ZlZF90ZW1wb3JhcmlseSAoRy5mb3VuZF9tb3ZlZF90ZW1wb3JhcmlseSkKKyNkZWZpbmUgbGFzdF9tb2QgICAgICAgICAgKEcubGFzdF9tb2QgICAgICAgICApCisjZGVmaW5lIGlwX2FfZCAgICAgICAgICAgIChHLmlwX2FfZCAgICAgICAgICAgKQorI2RlZmluZSBnX3JlYWxtICAgICAgICAgICAoRy5nX3JlYWxtICAgICAgICAgICkKKyNkZWZpbmUgcmVtb3RldXNlciAgICAgICAgKEcucmVtb3RldXNlciAgICAgICApCisjZGVmaW5lIHJlZmVyZXIgICAgICAgICAgIChHLnJlZmVyZXIgICAgICAgICAgKQorI2RlZmluZSB1c2VyX2FnZW50ICAgICAgICAoRy51c2VyX2FnZW50ICAgICAgICkKKyNkZWZpbmUgaG9zdCAgICAgICAgICAgICAgKEcuaG9zdCAgICAgICAgICAgICApCisjZGVmaW5lIGh0dHBfYWNjZXB0ICAgICAgIChHLmh0dHBfYWNjZXB0ICAgICAgKQorI2RlZmluZSBodHRwX2FjY2VwdF9sYW5ndWFnZSAoRy5odHRwX2FjY2VwdF9sYW5ndWFnZSkKKyNkZWZpbmUgZmlsZV9zaXplICAgICAgICAgKEcuZmlsZV9zaXplICAgICAgICApCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfUkFOR0VTCisjZGVmaW5lIHJhbmdlX3N0YXJ0ICAgICAgIChHLnJhbmdlX3N0YXJ0ICAgICAgKQorI2RlZmluZSByYW5nZV9lbmQgICAgICAgICAoRy5yYW5nZV9lbmQgICAgICAgICkKKyNkZWZpbmUgcmFuZ2VfbGVuICAgICAgICAgKEcucmFuZ2VfbGVuICAgICAgICApCisjZWxzZQorZW51bSB7CisJcmFuZ2Vfc3RhcnQgPSAtMSwKKwlyYW5nZV9lbmQgPSBNQVhJTlQob2ZmX3QpIC0gMSwKKwlyYW5nZV9sZW4gPSBNQVhJTlQob2ZmX3QpLAorfTsKKyNlbmRpZgorI2RlZmluZSBybXRfaXBfc3RyICAgICAgICAoRy5ybXRfaXBfc3RyICAgICAgICkKKyNkZWZpbmUgZ19hdXRoICAgICAgICAgICAgKEcuZ19hdXRoICAgICAgICAgICApCisjZGVmaW5lIG1pbWVfYSAgICAgICAgICAgIChHLm1pbWVfYSAgICAgICAgICAgKQorI2RlZmluZSBzY3JpcHRfaSAgICAgICAgICAoRy5zY3JpcHRfaSAgICAgICAgICkKKyNkZWZpbmUgaW9idWYgICAgICAgICAgICAgKEcuaW9idWYgICAgICAgICAgICApCisjZGVmaW5lIGhkcl9wdHIgICAgICAgICAgIChHLmhkcl9wdHIgICAgICAgICAgKQorI2RlZmluZSBoZHJfY250ICAgICAgICAgICAoRy5oZHJfY250ICAgICAgICAgICkKKyNkZWZpbmUgaHR0cF9lcnJvcl9wYWdlICAgKEcuaHR0cF9lcnJvcl9wYWdlICApCisjZGVmaW5lIHByb3h5ICAgICAgICAgICAgIChHLnByb3h5ICAgICAgICAgICAgKQorI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0daSVAKKyMgZGVmaW5lIGNvbnRlbnRfZ3ppcCAgICAgKEcuY29udGVudF9nemlwICAgICApCisjZWxzZQorIyBkZWZpbmUgY29udGVudF9nemlwICAgICAwCisjZW5kaWYKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKKwlJRl9GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgoZ19yZWFsbSA9ICJXZWIgU2VydmVyIEF1dGhlbnRpY2F0aW9uIjspIFwKKwlJRl9GRUFUVVJFX0hUVFBEX1JBTkdFUyhyYW5nZV9zdGFydCA9IC0xOykgXAorCWJpbmRfYWRkcl9vcl9wb3J0ID0gIjgwIjsgXAorCWluZGV4X3BhZ2UgPSBpbmRleF9odG1sOyBcCisJZmlsZV9zaXplID0gLTE7IFwKK30gd2hpbGUgKDApCisKKworI2RlZmluZSBTVFJOQ0FTRUNNUChhLCBzdHIpIHN0cm5jYXNlY21wKChhKSwgKHN0ciksIHNpemVvZihzdHIpLTEpCisKKy8qIFByb3RvdHlwZXMgKi8KK2VudW0geworCVNFTkRfSEVBREVSUyAgICAgPSAoMSA8PCAwKSwKKwlTRU5EX0JPRFkgICAgICAgID0gKDEgPDwgMSksCisJU0VORF9IRUFERVJTX0FORF9CT0RZID0gU0VORF9IRUFERVJTICsgU0VORF9CT0RZLAorfTsKK3N0YXRpYyB2b2lkIHNlbmRfZmlsZV9hbmRfZXhpdChjb25zdCBjaGFyICp1cmwsIGludCB3aGF0KSBOT1JFVFVSTjsKKworc3RhdGljIHZvaWQgZnJlZV9sbGlzdChoYXNfbmV4dF9wdHIgKipwcHRyKQoreworCWhhc19uZXh0X3B0ciAqY3VyID0gKnBwdHI7CisJd2hpbGUgKGN1cikgeworCQloYXNfbmV4dF9wdHIgKnQgPSBjdXI7CisJCWN1ciA9IGN1ci0+bmV4dDsKKwkJZnJlZSh0KTsKKwl9CisJKnBwdHIgPSBOVUxMOworfQorCitzdGF0aWMgQUxXQVlTX0lOTElORSB2b2lkIGZyZWVfSHRhY2Nlc3NfbGlzdChIdGFjY2VzcyAqKnBwdHIpCit7CisJZnJlZV9sbGlzdCgoaGFzX25leHRfcHRyKiopcHB0cik7Cit9CisKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHZvaWQgZnJlZV9IdGFjY2Vzc19JUF9saXN0KEh0YWNjZXNzX0lQICoqcHB0cikKK3sKKwlmcmVlX2xsaXN0KChoYXNfbmV4dF9wdHIqKilwcHRyKTsKK30KKworLyogUmV0dXJucyBwcmVzdW1lZCBtYXNrIHdpZHRoIGluIGJpdHMgb3IgPCAwIG9uIGVycm9yLgorICogVXBkYXRlcyBzdHJwLCBzdG9yZXMgSVAgYXQgcHJvdmlkZWQgcG9pbnRlciAqLworc3RhdGljIGludCBzY2FuX2lwKGNvbnN0IGNoYXIgKipzdHJwLCB1bnNpZ25lZCAqaXBwLCB1bnNpZ25lZCBjaGFyIGVuZGMpCit7CisJY29uc3QgY2hhciAqcCA9ICpzdHJwOworCWludCBhdXRvX21hc2sgPSA4OworCXVuc2lnbmVkIGlwID0gMDsKKwlpbnQgajsKKworCWlmICgqcCA9PSAnLycpCisJCXJldHVybiAtYXV0b19tYXNrOworCisJZm9yIChqID0gMDsgaiA8IDQ7IGorKykgeworCQl1bnNpZ25lZCBvY3RldDsKKworCQlpZiAoKCpwIDwgJzAnIHx8ICpwID4gJzknKSAmJiAqcCAhPSAnLycgJiYgKnApCisJCQlyZXR1cm4gLWF1dG9fbWFzazsKKwkJb2N0ZXQgPSAwOworCQl3aGlsZSAoKnAgPj0gJzAnICYmICpwIDw9ICc5JykgeworCQkJb2N0ZXQgKj0gMTA7CisJCQlvY3RldCArPSAqcCAtICcwJzsKKwkJCWlmIChvY3RldCA+IDI1NSkKKwkJCQlyZXR1cm4gLWF1dG9fbWFzazsKKwkJCXArKzsKKwkJfQorCQlpZiAoKnAgPT0gJy4nKQorCQkJcCsrOworCQlpZiAoKnAgIT0gJy8nICYmICpwKQorCQkJYXV0b19tYXNrICs9IDg7CisJCWlwID0gKGlwIDw8IDgpIHwgb2N0ZXQ7CisJfQorCWlmICgqcCkgeworCQlpZiAoKnAgIT0gZW5kYykKKwkJCXJldHVybiAtYXV0b19tYXNrOworCQlwKys7CisJCWlmICgqcCA9PSAnXDAnKQorCQkJcmV0dXJuIC1hdXRvX21hc2s7CisJfQorCSppcHAgPSBpcDsKKwkqc3RycCA9IHA7CisJcmV0dXJuIGF1dG9fbWFzazsKK30KKworLyogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuIFN0b3JlcyBJUCBhbmQgbWFzayBhdCBwcm92aWRlZCBwb2ludGVycyAqLworc3RhdGljIGludCBzY2FuX2lwX21hc2soY29uc3QgY2hhciAqc3RyLCB1bnNpZ25lZCAqaXBwLCB1bnNpZ25lZCAqbWFza3ApCit7CisJaW50IGk7CisJdW5zaWduZWQgbWFzazsKKwljaGFyICpwOworCisJaSA9IHNjYW5faXAoJnN0ciwgaXBwLCAnLycpOworCWlmIChpIDwgMCkKKwkJcmV0dXJuIGk7CisKKwlpZiAoKnN0cikgeworCQkvKiB0aGVyZSBpcyAveHh4IGFmdGVyIGRvdHRlZC1JUCBhZGRyZXNzICovCisJCWkgPSBiYl9zdHJ0b3Uoc3RyLCAmcCwgMTApOworCQlpZiAoKnAgPT0gJy4nKSB7CisJCQkvKiAneHh4JyBpdHNlbGYgaXMgZG90dGVkLUlQIG1hc2ssIHBhcnNlIGl0ICovCisJCQkvKiAocmV0dXJuIDAgKHN1Y2Nlc3MpIG9ubHkgaWYgaXQgaGFzIE4uTi5OLk4gZm9ybSkgKi8KKwkJCXJldHVybiBzY2FuX2lwKCZzdHIsIG1hc2twLCAnXDAnKSAtIDMyOworCQl9CisJCWlmICgqcCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoaSA+IDMyKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoc2l6ZW9mKHVuc2lnbmVkKSA9PSA0ICYmIGkgPT0gMzIpIHsKKwkJLyogbWFzayA+Pj0gMzIgYmVsb3cgbWF5IG5vdCB3b3JrICovCisJCW1hc2sgPSAwOworCX0gZWxzZSB7CisJCW1hc2sgPSAweGZmZmZmZmZmOworCQltYXNrID4+PSBpOworCX0KKwkvKiBpID09IDAgLT4gKm1hc2twID0gMHgwMDAwMDAwMAorCSAqIGkgPT0gMSAtPiAqbWFza3AgPSAweDgwMDAwMDAwCisJICogaSA9PSA0IC0+ICptYXNrcCA9IDB4ZjAwMDAwMDAKKwkgKiBpID09IDMxIC0+ICptYXNrcCA9IDB4ZmZmZmZmZmUKKwkgKiBpID09IDMyIC0+ICptYXNrcCA9IDB4ZmZmZmZmZmYgKi8KKwkqbWFza3AgPSAodWludDMyX3QpKH5tYXNrKTsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBhcnNlIGNvbmZpZ3VyYXRpb24gZmlsZSBpbnRvIGluLW1lbW9yeSBsaW5rZWQgbGlzdC4KKyAqCisgKiBBbnkgcHJldmlvdXMgSVAgcnVsZXMgYXJlIGRpc2NhcmRlZC4KKyAqIElmIHRoZSBmbGFnIGFyZ3VtZW50IGlzIG5vdCBTVUJESVJfUEFSU0UgdGhlbiBhbGwgL3BhdGggYW5kIG1pbWUgcnVsZXMKKyAqIGFyZSBhbHNvIGRpc2NhcmRlZC4gIFRoYXQgaXMsIHByZXZpb3VzIHNldHRpbmdzIGFyZSByZXRhaW5lZCBpZiBmbGFnIGlzCisgKiBTVUJESVJfUEFSU0UuCisgKiBFcnJvciBwYWdlcyBhcmUgb25seSBwYXJzZWQgb24gdGhlIG1haW4gY29uZmlnIGZpbGUuCisgKgorICogcGF0aCAgIFBhdGggd2hlcmUgdG8gbG9vayBmb3IgaHR0cGQuY29uZiAod2l0aG91dCBmaWxlbmFtZSkuCisgKiBmbGFnICAgVHlwZSBvZiB0aGUgcGFyc2UgcmVxdWVzdC4KKyAqLworLyogZmxhZyBwYXJhbTogKi8KK2VudW0geworCUZJUlNUX1BBUlNFICAgID0gMCwgLyogcGF0aCB3aWxsIGJlICIvZXRjIiAqLworCVNJR05BTEVEX1BBUlNFID0gMSwgLyogcGF0aCB3aWxsIGJlICIvZXRjIiAqLworCVNVQkRJUl9QQVJTRSAgID0gMiwgLyogcGF0aCB3aWxsIGJlIGRlcml2ZWQgZnJvbSBVUkwgKi8KK307CitzdGF0aWMgdm9pZCBwYXJzZV9jb25mKGNvbnN0IGNoYXIgKnBhdGgsIGludCBmbGFnKQoreworCS8qIGludGVybmFsbHkgdXNlZCBleHRyYSBmbGFnIHN0YXRlICovCisJZW51bSB7IFRSWV9DVVJESVJfUEFSU0UgPSAzIH07CisKKwlGSUxFICpmOworCWNvbnN0IGNoYXIgKmZpbGVuYW1lOworCWNoYXIgYnVmWzE2MF07CisKKwkvKiBkaXNjYXJkIG9sZCBydWxlcyAqLworCWZyZWVfSHRhY2Nlc3NfSVBfbGlzdCgmaXBfYV9kKTsKKwlmbGdfZGVueV9hbGwgPSAwOworCS8qIHJldGFpbiBwcmV2aW91cyBhdXRoIGFuZCBtaW1lIGNvbmZpZyBvbmx5IGZvciBzdWJkaXIgcGFyc2UgKi8KKwlpZiAoZmxhZyAhPSBTVUJESVJfUEFSU0UpIHsKKwkJZnJlZV9IdGFjY2Vzc19saXN0KCZtaW1lX2EpOworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgKKwkJZnJlZV9IdGFjY2Vzc19saXN0KCZnX2F1dGgpOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQ09ORklHX1dJVEhfU0NSSVBUX0lOVEVSUFIKKwkJZnJlZV9IdGFjY2Vzc19saXN0KCZzY3JpcHRfaSk7CisjZW5kaWYKKwl9CisKKwlmaWxlbmFtZSA9IG9wdF9jX2NvbmZpZ0ZpbGU7CisJaWYgKGZsYWcgPT0gU1VCRElSX1BBUlNFIHx8IGZpbGVuYW1lID09IE5VTEwpIHsKKwkJZmlsZW5hbWUgPSBhbGxvY2Eoc3RybGVuKHBhdGgpICsgc2l6ZW9mKEhUVFBEX0NPTkYpICsgMik7CisJCXNwcmludGYoKGNoYXIgKilmaWxlbmFtZSwgIiVzLyVzIiwgcGF0aCwgSFRUUERfQ09ORik7CisJfQorCisJd2hpbGUgKChmID0gZm9wZW5fZm9yX3JlYWQoZmlsZW5hbWUpKSA9PSBOVUxMKSB7CisJCWlmIChmbGFnID49IFNVQkRJUl9QQVJTRSkgeyAvKiBTVUJESVIgb3IgVFJZX0NVUkRJUiAqLworCQkJLyogY29uZmlnIGZpbGUgbm90IGZvdW5kLCBubyBjaGFuZ2VzIHRvIGNvbmZpZyAqLworCQkJcmV0dXJuOworCQl9CisJCWlmIChmbGFnID09IEZJUlNUX1BBUlNFKSB7CisJCQkvKiAtYyBDT05GRklMRSBnaXZlbiwgYnV0IENPTkZGSUxFIGRvZXNuJ3QgZXhpc3Q/ICovCisJCQlpZiAob3B0X2NfY29uZmlnRmlsZSkKKwkJCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKG9wdF9jX2NvbmZpZ0ZpbGUpOworCQkJLyogZWxzZTogbm8gLWMsIHRodXMgd2UgbG9va2VkIGF0IC9ldGMvaHR0cGQuY29uZiwKKwkJCSAqIGFuZCBpdCdzIG5vdCB0aGVyZS4gdHJ5IC4vaHR0cGQuY29uZjogKi8KKwkJfQorCQlmbGFnID0gVFJZX0NVUkRJUl9QQVJTRTsKKwkJZmlsZW5hbWUgPSBIVFRQRF9DT05GOworCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgKKwkvKiBpbiAiL2ZpbGU6dXNlcjpwYXNzIiBsaW5lcywgd2UgcHJlcGVuZCBwYXRoIGluIHN1YmRpcnMgKi8KKwlpZiAoZmxhZyAhPSBTVUJESVJfUEFSU0UpCisJCXBhdGggPSAiIjsKKyNlbmRpZgorCS8qIFRoZSBsaW5lcyBjYW4gYmU6CisJICoKKwkgKiBJOmRlZmF1bHRfaW5kZXhfZmlsZQorCSAqIEg6aHR0cF9ob21lCisJICogW0FEXTpJUFsvbWFza10gICAjIGFsbG93L2RlbnksICogZm9yIHdpbGRjYXJkCisJICogRW5ubjplcnJvci5odG1sICAjIGVycm9yIHBhZ2UgZm9yIHN0YXR1cyBubm4KKwkgKiBQOi91cmw6W2h0dHA6Ly9daG9zdG5hbWVbOnBvcnRdL25ldy9wYXRoICMgcmV2ZXJzZSBwcm94eQorCSAqIC5leHQ6bWltZS90eXBlICAgIyBtaW1lIHR5cGUKKwkgKiAqLnBocDovcGF0aC9waHAgICMgcnVuIHh4eC5waHAgdGhyb3VnaCBhbiBpbnRlcnByZXRlcgorCSAqIC9maWxlOnVzZXI6cGFzcyAgIyB1c2VybmFtZSBhbmQgcGFzc3dvcmQKKwkgKi8KKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZikgIT0gTlVMTCkgeworCQl1bnNpZ25lZCBzdHJsZW5fYnVmOworCQl1bnNpZ25lZCBjaGFyIGNoOworCQljaGFyICphZnRlcl9jb2xvbjsKKworCQl7IC8qIHJlbW92ZSBhbGwgd2hpdGVzcGFjZSwgYW5kICMgY29tbWVudHMgKi8KKwkJCWNoYXIgKnAsICpwMDsKKworCQkJcDAgPSBidWY7CisJCQkvKiBza2lwIG5vbi13aGl0ZXNwYWNlIGJlZ2lubmluZy4gT2Z0ZW4gdGhlIHdob2xlIGxpbmUKKwkJCSAqIGlzIG5vbi13aGl0ZXNwYWNlLiBXZSB3YW50IHRoaXMgY2FzZSB0byB3b3JrIGZhc3QsCisJCQkgKiB3aXRob3V0IG5lZWRsZXNzIGNvcHlpbmcsIHRoZXJlZm9yZSB3ZSBkb24ndCBtZXJnZQorCQkJICogdGhpcyBvcGVyYXRpb24gaW50byBuZXh0IHdoaWxlIGxvb3AuICovCisJCQl3aGlsZSAoKGNoID0gKnAwKSAhPSAnXDAnICYmIGNoICE9ICdcbicgJiYgY2ggIT0gJyMnCisJCQkgJiYgY2ggIT0gJyAnICYmIGNoICE9ICdcdCcKKwkJCSkgeworCQkJCXAwKys7CisJCQl9CisJCQlwID0gcDA7CisJCQkvKiBpZiB3ZSBlbnRlciB0aGlzIGxvb3AsIHdlIGhhdmUgc29tZSB3aGl0ZXNwYWNlLgorCQkJICogZGlzY2FyZCBpdCAqLworCQkJd2hpbGUgKGNoICE9ICdcMCcgJiYgY2ggIT0gJ1xuJyAmJiBjaCAhPSAnIycpIHsKKwkJCQlpZiAoY2ggIT0gJyAnICYmIGNoICE9ICdcdCcpIHsKKwkJCQkJKnArKyA9IGNoOworCQkJCX0KKwkJCQljaCA9ICorK3AwOworCQkJfQorCQkJKnAgPSAnXDAnOworCQkJc3RybGVuX2J1ZiA9IHAgLSBidWY7CisJCQlpZiAoc3RybGVuX2J1ZiA9PSAwKQorCQkJCWNvbnRpbnVlOyAvKiBlbXB0eSBsaW5lICovCisJCX0KKworCQlhZnRlcl9jb2xvbiA9IHN0cmNocihidWYsICc6Jyk7CisJCS8qIHN0cmFuZ2UgbGluZT8gKi8KKwkJaWYgKGFmdGVyX2NvbG9uID09IE5VTEwgfHwgKisrYWZ0ZXJfY29sb24gPT0gJ1wwJykKKwkJCWdvdG8gY29uZmlnX2Vycm9yOworCisJCWNoID0gKGJ1ZlswXSAmIH4weDIwKTsgLyogdG91cHBlciBpZiBpdCdzIGEgbGV0dGVyICovCisKKwkJaWYgKGNoID09ICdJJykgeworCQkJaWYgKGluZGV4X3BhZ2UgIT0gaW5kZXhfaHRtbCkKKwkJCQlmcmVlKChjaGFyKilpbmRleF9wYWdlKTsKKwkJCWluZGV4X3BhZ2UgPSB4c3RyZHVwKGFmdGVyX2NvbG9uKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogZG8gbm90IGFsbG93IGp1bXBpbmcgYXJvdW5kIHVzaW5nIEggaW4gc3ViZGlyJ3MgY29uZmlncyAqLworCQlpZiAoZmxhZyA9PSBGSVJTVF9QQVJTRSAmJiBjaCA9PSAnSCcpIHsKKwkJCWhvbWVfaHR0cGQgPSB4c3RyZHVwKGFmdGVyX2NvbG9uKTsKKwkJCXhjaGRpcihob21lX2h0dHBkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGNoID09ICdBJyB8fCBjaCA9PSAnRCcpIHsKKwkJCUh0YWNjZXNzX0lQICpwaXA7CisKKwkJCWlmICgqYWZ0ZXJfY29sb24gPT0gJyonKSB7CisJCQkJaWYgKGNoID09ICdEJykgeworCQkJCQkvKiBtZW1vcml6ZSAiZGVueSBhbGwiICovCisJCQkJCWZsZ19kZW55X2FsbCA9IDE7CisJCQkJfQorCQkJCS8qIHNraXAgYXNzdW1lZCAiQToqIiwgaXQgaXMgYSBkZWZhdWx0IGFueXdheSAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogc3RvcmUgImFsbG93L2RlbnkgSVAvbWFzayIgbGluZSAqLworCQkJcGlwID0geHphbGxvYyhzaXplb2YoKnBpcCkpOworCQkJaWYgKHNjYW5faXBfbWFzayhhZnRlcl9jb2xvbiwgJnBpcC0+aXAsICZwaXAtPm1hc2spKSB7CisJCQkJLyogSVB7L21hc2t9IHN5bnRheCBlcnJvciBkZXRlY3RlZCwgcHJvdGVjdCBhbGwgKi8KKwkJCQljaCA9ICdEJzsKKwkJCQlwaXAtPm1hc2sgPSAwOworCQkJfQorCQkJcGlwLT5hbGxvd19kZW55ID0gY2g7CisJCQlpZiAoY2ggPT0gJ0QnKSB7CisJCQkJLyogRGVueTpmcm9tX0lQIC0gcHJlcGVuZCAqLworCQkJCXBpcC0+bmV4dCA9IGlwX2FfZDsKKwkJCQlpcF9hX2QgPSBwaXA7CisJCQl9IGVsc2UgeworCQkJCS8qIEE6ZnJvbV9JUCAtIGFwcGVuZCAodGh1cyBhbGwgRCdzIHByZWNlZGVzIEEncykgKi8KKwkJCQlIdGFjY2Vzc19JUCAqcHJldl9JUCA9IGlwX2FfZDsKKwkJCQlpZiAocHJldl9JUCA9PSBOVUxMKSB7CisJCQkJCWlwX2FfZCA9IHBpcDsKKwkJCQl9IGVsc2UgeworCQkJCQl3aGlsZSAocHJldl9JUC0+bmV4dCkKKwkJCQkJCXByZXZfSVAgPSBwcmV2X0lQLT5uZXh0OworCQkJCQlwcmV2X0lQLT5uZXh0ID0gcGlwOworCQkJCX0KKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9FUlJPUl9QQUdFUworCQlpZiAoZmxhZyA9PSBGSVJTVF9QQVJTRSAmJiBjaCA9PSAnRScpIHsKKwkJCXVuc2lnbmVkIGk7CisJCQlpbnQgc3RhdHVzID0gYXRvaShidWYgKyAxKTsgLyogZXJyb3Igc3RhdHVzIGNvZGUgKi8KKworCQkJaWYgKHN0YXR1cyA8IEhUVFBfQ09OVElOVUUpIHsKKwkJCQlnb3RvIGNvbmZpZ19lcnJvcjsKKwkJCX0KKwkJCS8qIHRoZW4gZXJyb3IgcGFnZTsgZmluZCBtYXRjaGluZyBzdGF0dXMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGh0dHBfcmVzcG9uc2VfdHlwZSk7IGkrKykgeworCQkJCWlmIChodHRwX3Jlc3BvbnNlX3R5cGVbaV0gPT0gc3RhdHVzKSB7CisJCQkJCS8qIFdlIGNoZGlyIHRvIGhvbWVfaHR0cGQsIHRodXMgbm8gbmVlZCB0bworCQkJCQkgKiBjb25jYXRfcGF0aF9maWxlKGhvbWVfaHR0cGQsIGFmdGVyX2NvbG9uKQorCQkJCQkgKiBoZXJlICovCisJCQkJCWh0dHBfZXJyb3JfcGFnZVtpXSA9IHhzdHJkdXAoYWZ0ZXJfY29sb24pOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9QUk9YWQorCQlpZiAoZmxhZyA9PSBGSVJTVF9QQVJTRSAmJiBjaCA9PSAnUCcpIHsKKwkJCS8qIFA6L3VybDpbaHR0cDovL11ob3N0bmFtZVs6cG9ydF0vbmV3L3BhdGggKi8KKwkJCWNoYXIgKnVybF9mcm9tLCAqaG9zdF9wb3J0LCAqdXJsX3RvOworCQkJSHRhY2Nlc3NfUHJveHkgKnByb3h5X2VudHJ5OworCisJCQl1cmxfZnJvbSA9IGFmdGVyX2NvbG9uOworCQkJaG9zdF9wb3J0ID0gc3RyY2hyKGFmdGVyX2NvbG9uLCAnOicpOworCQkJaWYgKGhvc3RfcG9ydCA9PSBOVUxMKSB7CisJCQkJZ290byBjb25maWdfZXJyb3I7CisJCQl9CisJCQkqaG9zdF9wb3J0KysgPSAnXDAnOworCQkJaWYgKGlzX3ByZWZpeGVkX3dpdGgoaG9zdF9wb3J0LCAiaHR0cDovLyIpKQorCQkJCWhvc3RfcG9ydCArPSA3OworCQkJaWYgKCpob3N0X3BvcnQgPT0gJ1wwJykgeworCQkJCWdvdG8gY29uZmlnX2Vycm9yOworCQkJfQorCQkJdXJsX3RvID0gc3RyY2hyKGhvc3RfcG9ydCwgJy8nKTsKKwkJCWlmICh1cmxfdG8gPT0gTlVMTCkgeworCQkJCWdvdG8gY29uZmlnX2Vycm9yOworCQkJfQorCQkJKnVybF90byA9ICdcMCc7CisJCQlwcm94eV9lbnRyeSA9IHh6YWxsb2Moc2l6ZW9mKCpwcm94eV9lbnRyeSkpOworCQkJcHJveHlfZW50cnktPnVybF9mcm9tID0geHN0cmR1cCh1cmxfZnJvbSk7CisJCQlwcm94eV9lbnRyeS0+aG9zdF9wb3J0ID0geHN0cmR1cChob3N0X3BvcnQpOworCQkJKnVybF90byA9ICcvJzsKKwkJCXByb3h5X2VudHJ5LT51cmxfdG8gPSB4c3RyZHVwKHVybF90byk7CisJCQlwcm94eV9lbnRyeS0+bmV4dCA9IHByb3h5OworCQkJcHJveHkgPSBwcm94eV9lbnRyeTsKKwkJCWNvbnRpbnVlOworCQl9CisjZW5kaWYKKwkJLyogdGhlIHJlc3Qgb2YgZGlyZWN0aXZlcyBhcmUgbm9uLWFscGhhYmV0aWMsCisJCSAqIG11c3QgYXZvaWQgdXNpbmcgInRvdXBwZXInZWQiIGNoICovCisJCWNoID0gYnVmWzBdOworCisJCWlmIChjaCA9PSAnLicgLyogIi5leHQ6bWltZS90eXBlIiAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0NPTkZJR19XSVRIX1NDUklQVF9JTlRFUlBSCisJCSB8fCAoY2ggPT0gJyonICYmIGJ1ZlsxXSA9PSAnLicpIC8qICIqLnBocDovcGF0aC9waHAiICovCisjZW5kaWYKKwkJKSB7CisJCQljaGFyICpwOworCQkJSHRhY2Nlc3MgKmN1cjsKKworCQkJY3VyID0geHphbGxvYyhzaXplb2YoKmN1cikgLyogaW5jbHVkZXMgc3BhY2UgZm9yIE5VTCAqLyArIHN0cmxlbl9idWYpOworCQkJc3RyY3B5KGN1ci0+YmVmb3JlX2NvbG9uLCBidWYpOworCQkJcCA9IGN1ci0+YmVmb3JlX2NvbG9uICsgKGFmdGVyX2NvbG9uIC0gYnVmKTsKKwkJCXBbLTFdID0gJ1wwJzsKKwkJCWN1ci0+YWZ0ZXJfY29sb24gPSBwOworCQkJaWYgKGNoID09ICcuJykgeworCQkJCS8qIC5taW1lIGxpbmU6IHByZXBlbmQgdG8gbWltZV9hIGxpc3QgKi8KKwkJCQljdXItPm5leHQgPSBtaW1lX2E7CisJCQkJbWltZV9hID0gY3VyOworCQkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0NPTkZJR19XSVRIX1NDUklQVF9JTlRFUlBSCisJCQllbHNlIHsKKwkJCQkvKiBzY3JpcHQgaW50ZXJwcmV0ZXIgbGluZTogcHJlcGVuZCB0byBzY3JpcHRfaSBsaXN0ICovCisJCQkJY3VyLT5uZXh0ID0gc2NyaXB0X2k7CisJCQkJc2NyaXB0X2kgPSBjdXI7CisJCQl9CisjZW5kaWYKKwkJCWNvbnRpbnVlOworCQl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRICisJCWlmIChjaCA9PSAnLycpIHsgLyogIi9maWxlOnVzZXI6cGFzcyIgKi8KKwkJCWNoYXIgKnA7CisJCQlIdGFjY2VzcyAqY3VyOworCQkJdW5zaWduZWQgZmlsZV9sZW47CisKKwkJCS8qIG5vdGU6IHBhdGggaXMgIiIgdW5sZXNzIHdlIGFyZSBpbiBTVUJESVIgcGFyc2UsCisJCQkgKiBvdGhlcndpc2UgaXQgZG9lcyBOT1Qgc3RhcnQgd2l0aCAiLyIgKi8KKwkJCWN1ciA9IHh6YWxsb2Moc2l6ZW9mKCpjdXIpIC8qIGluY2x1ZGVzIHNwYWNlIGZvciBOVUwgKi8KKwkJCQkrIDEgKyBzdHJsZW4ocGF0aCkKKwkJCQkrIHN0cmxlbl9idWYKKwkJCQkpOworCQkJLyogZm9ybSAiL3BhdGgvZmlsZSIgKi8KKwkJCXNwcmludGYoY3VyLT5iZWZvcmVfY29sb24sICIvJXMlLipzIiwKKwkJCQlwYXRoLAorCQkJCShpbnQpIChhZnRlcl9jb2xvbiAtIGJ1ZiAtIDEpLCAvKiBpbmNsdWRlcyAiLyIsIGJ1dCBub3QgIjoiICovCisJCQkJYnVmKTsKKwkJCS8qIGNhbm9uaWNhbGl6ZSBpdCAqLworCQkJcCA9IGJiX3NpbXBsaWZ5X2Fic19wYXRoX2lucGxhY2UoY3VyLT5iZWZvcmVfY29sb24pOworCQkJZmlsZV9sZW4gPSBwIC0gY3VyLT5iZWZvcmVfY29sb247CisJCQkvKiBhZGQgInVzZXI6cGFzcyIgYWZ0ZXIgTlVMICovCisJCQlzdHJjcHkoKytwLCBhZnRlcl9jb2xvbik7CisJCQljdXItPmFmdGVyX2NvbG9uID0gcDsKKworCQkJLyogaW5zZXJ0IGN1ciBpbnRvIGdfYXV0aCAqLworCQkJLyogZ19hdXRoIGlzIHNvcnRlZCBieSBkZWNyZWFzZWQgZmlsZW5hbWUgbGVuZ3RoICovCisJCQl7CisJCQkJSHRhY2Nlc3MgKmF1dGgsICoqYXV0aHA7CisKKwkJCQlhdXRocCA9ICZnX2F1dGg7CisJCQkJd2hpbGUgKChhdXRoID0gKmF1dGhwKSAhPSBOVUxMKSB7CisJCQkJCWlmIChmaWxlX2xlbiA+PSBzdHJsZW4oYXV0aC0+YmVmb3JlX2NvbG9uKSkgeworCQkJCQkJLyogaW5zZXJ0IGN1ciBiZWZvcmUgYXV0aCAqLworCQkJCQkJY3VyLT5uZXh0ID0gYXV0aDsKKwkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCWF1dGhwID0gJmF1dGgtPm5leHQ7CisJCQkJfQorCQkJCSphdXRocCA9IGN1cjsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisjZW5kaWYgLyogQkFTSUNfQVVUSCAqLworCisJCS8qIHRoZSBsaW5lIGlzIG5vdCByZWNvZ25pemVkICovCisgY29uZmlnX2Vycm9yOgorCQliYl9lcnJvcl9tc2coImNvbmZpZyBlcnJvciAnJXMnIGluICclcyciLCBidWYsIGZpbGVuYW1lKTsKKwl9IC8qIHdoaWxlIChmZ2V0cykgKi8KKworCWZjbG9zZShmKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0VOQ09ERV9VUkxfU1RSCisvKgorICogR2l2ZW4gYSBzdHJpbmcsIGh0bWwtZW5jb2RlIHNwZWNpYWwgY2hhcmFjdGVycy4KKyAqIFRoaXMgaXMgdXNlZCBmb3IgdGhlIC1lIGNvbW1hbmQgbGluZSBvcHRpb24gdG8gcHJvdmlkZSBhbiBlYXN5IHdheQorICogZm9yIHNjcmlwdHMgdG8gZW5jb2RlIHJlc3VsdCBkYXRhIHdpdGhvdXQgY29uZnVzaW5nIGJyb3dzZXJzLiAgVGhlCisgKiByZXR1cm5lZCBzdHJpbmcgcG9pbnRlciBpcyBtZW1vcnkgYWxsb2NhdGVkIGJ5IG1hbGxvYygpLgorICoKKyAqIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBlbmNvZGVkIHN0cmluZyAobWFsbG9jZWQpLgorICovCitzdGF0aWMgY2hhciAqZW5jb2RlU3RyaW5nKGNvbnN0IGNoYXIgKnN0cmluZykKK3sKKwkvKiB0YWtlIHRoZSBzaW1wbGUgcm91dGUgYW5kIGVuY29kZSBldmVyeXRoaW5nICovCisJLyogY291bGQgcG9zc2libHkgc2NhbiBvbmNlIHRvIGdldCBsZW5ndGguICAgICAqLworCWludCBsZW4gPSBzdHJsZW4oc3RyaW5nKTsKKwljaGFyICpvdXQgPSB4bWFsbG9jKGxlbiAqIDYgKyAxKTsKKwljaGFyICpwID0gb3V0OworCWNoYXIgY2g7CisKKwl3aGlsZSAoKGNoID0gKnN0cmluZysrKSAhPSAnXDAnKSB7CisJCS8qIHZlcnkgc2ltcGxlIGNoZWNrIGZvciB3aGF0IHRvIGVuY29kZSAqLworCQlpZiAoaXNhbG51bShjaCkpCisJCQkqcCsrID0gY2g7CisJCWVsc2UKKwkJCXAgKz0gc3ByaW50ZihwLCAiJiMlZDsiLCAodW5zaWduZWQgY2hhcikgY2gpOworCX0KKwkqcCA9ICdcMCc7CisJcmV0dXJuIG91dDsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSAorLyoKKyAqIERlY29kZSBhIGJhc2U2NCBkYXRhIHN0cmVhbSBhcyBwZXIgcmZjMTUyMS4KKyAqIE5vdGUgdGhhdCB0aGUgcmZjIHN0YXRlcyB0aGF0IG5vbiBiYXNlNjQgY2hhcnMgYXJlIHRvIGJlIGlnbm9yZWQuCisgKiBTaW5jZSB0aGUgZGVjb2RlIGFsd2F5cyByZXN1bHRzIGluIGEgc2hvcnRlciBzaXplIHRoYW4gdGhlIGlucHV0LAorICogaXQgaXMgT0sgdG8gcGFzcyB0aGUgaW5wdXQgYXJnIGFzIGFuIG91dHB1dCBhcmcuCisgKiBQYXJhbWV0ZXI6IGEgcG9pbnRlciB0byBhIGJhc2U2NCBlbmNvZGVkIHN0cmluZy4KKyAqIERlY29kZWQgZGF0YSBpcyBzdG9yZWQgaW4tcGxhY2UuCisgKi8KK3N0YXRpYyB2b2lkIGRlY29kZUJhc2U2NChjaGFyICpEYXRhKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmluID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilEYXRhOworCS8qIFRoZSBkZWNvZGVkIHNpemUgd2lsbCBiZSBhdCBtb3N0IDMvNCB0aGUgc2l6ZSBvZiB0aGUgZW5jb2RlZCAqLworCXVuc2lnbmVkIGNoID0gMDsKKwlpbnQgaSA9IDA7CisKKwl3aGlsZSAoKmluKSB7CisJCWludCB0ID0gKmluKys7CisKKwkJaWYgKHQgPj0gJzAnICYmIHQgPD0gJzknKQorCQkJdCA9IHQgLSAnMCcgKyA1MjsKKwkJZWxzZSBpZiAodCA+PSAnQScgJiYgdCA8PSAnWicpCisJCQl0ID0gdCAtICdBJzsKKwkJZWxzZSBpZiAodCA+PSAnYScgJiYgdCA8PSAneicpCisJCQl0ID0gdCAtICdhJyArIDI2OworCQllbHNlIGlmICh0ID09ICcrJykKKwkJCXQgPSA2MjsKKwkJZWxzZSBpZiAodCA9PSAnLycpCisJCQl0ID0gNjM7CisJCWVsc2UgaWYgKHQgPT0gJz0nKQorCQkJdCA9IDA7CisJCWVsc2UKKwkJCWNvbnRpbnVlOworCisJCWNoID0gKGNoIDw8IDYpIHwgdDsKKwkJaSsrOworCQlpZiAoaSA9PSA0KSB7CisJCQkqRGF0YSsrID0gKGNoYXIpIChjaCA+PiAxNik7CisJCQkqRGF0YSsrID0gKGNoYXIpIChjaCA+PiA4KTsKKwkJCSpEYXRhKysgPSAoY2hhcikgY2g7CisJCQlpID0gMDsKKwkJfQorCX0KKwkqRGF0YSA9ICdcMCc7Cit9CisjZW5kaWYKKworLyoKKyAqIENyZWF0ZSBhIGxpc3RlbiBzZXJ2ZXIgc29ja2V0IG9uIHRoZSBkZXNpZ25hdGVkIHBvcnQuCisgKi8KK3N0YXRpYyBpbnQgb3BlblNlcnZlcih2b2lkKQoreworCXVuc2lnbmVkIG4gPSBiYl9zdHJ0b3UoYmluZF9hZGRyX29yX3BvcnQsIE5VTEwsIDEwKTsKKwlpZiAoIWVycm5vICYmIG4gJiYgbiA8PSAweGZmZmYpCisJCW4gPSBjcmVhdGVfYW5kX2JpbmRfc3RyZWFtX29yX2RpZShOVUxMLCBuKTsKKwllbHNlCisJCW4gPSBjcmVhdGVfYW5kX2JpbmRfc3RyZWFtX29yX2RpZShiaW5kX2FkZHJfb3JfcG9ydCwgODApOworCXhsaXN0ZW4obiwgOSk7CisJcmV0dXJuIG47Cit9CisKKy8qCisgKiBMb2cgdGhlIGNvbm5lY3Rpb24gY2xvc3VyZSBhbmQgZXhpdC4KKyAqLworc3RhdGljIHZvaWQgbG9nX2FuZF9leGl0KHZvaWQpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgbG9nX2FuZF9leGl0KHZvaWQpCit7CisJLyogUGFyYW5vaWEuIElFIHNhaWQgdG8gYmUgYnVnZ3kuIEl0IG1heSBzZW5kIHNvbWUgZXh0cmEgZGF0YQorCSAqIG9yIGJlIGNvbmZ1c2VkIGJ5IHVzIGp1c3QgZXhpdGluZyB3aXRob3V0IFNIVVRfV1IuIE9oIHdlbGwuICovCisJc2h1dGRvd24oMSwgU0hVVF9XUik7CisJLyogV2h5Pz8KKwkodGhpcyBhbHNvIG1lc3NlcyB1cCBzdGRpbiB3aGVuIHVzZXIgcnVucyBodHRwZCAtaSBmcm9tIHRlcm1pbmFsKQorCW5kZWxheV9vbigwKTsKKwl3aGlsZSAocmVhZChTVERJTl9GSUxFTk8sIGlvYnVmLCBJT0JVRl9TSVpFKSA+IDApCisJCWNvbnRpbnVlOworCSovCisKKwlpZiAodmVyYm9zZSA+IDIpCisJCWJiX2Vycm9yX21zZygiY2xvc2VkIik7CisJX2V4aXQoeGZ1bmNfZXJyb3JfcmV0dmFsKTsKK30KKworLyoKKyAqIENyZWF0ZSBhbmQgc2VuZCBIVFRQIHJlc3BvbnNlIGhlYWRlcnMuCisgKiBUaGUgYXJndW1lbnRzIGFyZSBjb21iaW5lZCBhbmQgc2VudCBhcyBvbmUgd3JpdGUgb3BlcmF0aW9uLiAgTm90ZSB0aGF0CisgKiBJRSB3aWxsIHB1a2UgYmlnLXRpbWUgaWYgdGhlIGhlYWRlcnMgYXJlIG5vdCBzZW50IGluIG9uZSBwYWNrZXQgYW5kIHRoZQorICogc2Vjb25kIHBhY2tldCBpcyBkZWxheWVkIGZvciBhbnkgcmVhc29uLgorICogcmVzcG9uc2VOdW0gLSB0aGUgcmVzdWx0IGNvZGUgdG8gc2VuZC4KKyAqLworc3RhdGljIHZvaWQgc2VuZF9oZWFkZXJzKGludCByZXNwb25zZU51bSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBSRkMxMTIzRk1UW10gQUxJR04xID0gIiVhLCAlZCAlYiAlWSAlSDolTTolUyBHTVQiOworCisJY29uc3QgY2hhciAqcmVzcG9uc2VTdHJpbmcgPSAiIjsKKwljb25zdCBjaGFyICppbmZvU3RyaW5nID0gTlVMTDsKKwljb25zdCBjaGFyICptaW1lX3R5cGU7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfRVJST1JfUEFHRVMKKwljb25zdCBjaGFyICplcnJvcl9wYWdlID0gTlVMTDsKKyNlbmRpZgorCXVuc2lnbmVkIGk7CisJdGltZV90IHRpbWVyID0gdGltZShOVUxMKTsKKwljaGFyIHRtcF9zdHJbODBdOworCWludCBsZW47CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShodHRwX3Jlc3BvbnNlX3R5cGUpOyBpKyspIHsKKwkJaWYgKGh0dHBfcmVzcG9uc2VfdHlwZVtpXSA9PSByZXNwb25zZU51bSkgeworCQkJcmVzcG9uc2VTdHJpbmcgPSBodHRwX3Jlc3BvbnNlW2ldLm5hbWU7CisJCQlpbmZvU3RyaW5nID0gaHR0cF9yZXNwb25zZVtpXS5pbmZvOworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0VSUk9SX1BBR0VTCisJCQllcnJvcl9wYWdlID0gaHR0cF9lcnJvcl9wYWdlW2ldOworI2VuZGlmCisJCQlicmVhazsKKwkJfQorCX0KKwkvKiBlcnJvciBtZXNzYWdlIGlzIEhUTUwgKi8KKwltaW1lX3R5cGUgPSByZXNwb25zZU51bSA9PSBIVFRQX09LID8KKwkJCQlmb3VuZF9taW1lX3R5cGUgOiAidGV4dC9odG1sIjsKKworCWlmICh2ZXJib3NlKQorCQliYl9lcnJvcl9tc2coInJlc3BvbnNlOiV1IiwgcmVzcG9uc2VOdW0pOworCisJLyogZW1pdCB0aGUgY3VycmVudCBkYXRlICovCisJc3RyZnRpbWUodG1wX3N0ciwgc2l6ZW9mKHRtcF9zdHIpLCBSRkMxMTIzRk1ULCBnbXRpbWUoJnRpbWVyKSk7CisJbGVuID0gc3ByaW50Zihpb2J1ZiwKKwkJCSJIVFRQLzEuMCAlZCAlc1xyXG5Db250ZW50LXR5cGU6ICVzXHJcbiIKKwkJCSJEYXRlOiAlc1xyXG5Db25uZWN0aW9uOiBjbG9zZVxyXG4iLAorCQkJcmVzcG9uc2VOdW0sIHJlc3BvbnNlU3RyaW5nLCBtaW1lX3R5cGUsIHRtcF9zdHIpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSAorCWlmIChyZXNwb25zZU51bSA9PSBIVFRQX1VOQVVUSE9SSVpFRCkgeworCQlsZW4gKz0gc3ByaW50Zihpb2J1ZiArIGxlbiwKKwkJCQkiV1dXLUF1dGhlbnRpY2F0ZTogQmFzaWMgcmVhbG09XCIlc1wiXHJcbiIsCisJCQkJZ19yZWFsbSk7CisJfQorI2VuZGlmCisJaWYgKHJlc3BvbnNlTnVtID09IEhUVFBfTU9WRURfVEVNUE9SQVJJTFkpIHsKKwkJLyogUmVzcG9uZGluZyB0byAiR0VUIC9kaXIiIHdpdGgKKwkJICogIkhUVFAvMS4wIDMwMiBGb3VuZCIgIkxvY2F0aW9uOiAvZGlyLyIKKwkJICogLSBJT1csIGFza2luZyB0aGVtIHRvIHJlcGVhdCB3aXRoIGEgc2xhc2guCisJCSAqIEhlcmUsIG92ZXJmbG93IElTIHBvc3NpYmxlLCBjYW4ndCB1c2Ugc3ByaW50ZjoKKwkJICogbWtkaXIgdGVzdAorCQkgKiBweXRob24gLWMgJ3ByaW50KCJnZXQgL3Rlc3Q/IiArICgieCIgKiA4MTkyKSknIHwgYnVzeWJveCBodHRwZCAtaSAtaCAuCisJCSAqLworCQlsZW4gKz0gc25wcmludGYoaW9idWYgKyBsZW4sIElPQlVGX1NJWkUtMyAtIGxlbiwKKwkJCQkiTG9jYXRpb246ICVzLyVzJXNcclxuIiwKKwkJCQlmb3VuZF9tb3ZlZF90ZW1wb3JhcmlseSwKKwkJCQkoZ19xdWVyeSA/ICI/IiA6ICIiKSwKKwkJCQkoZ19xdWVyeSA/IGdfcXVlcnkgOiAiIikpOworCQlpZiAobGVuID4gSU9CVUZfU0laRS0zKQorCQkJbGVuID0gSU9CVUZfU0laRS0zOworCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0VSUk9SX1BBR0VTCisJaWYgKGVycm9yX3BhZ2UgJiYgYWNjZXNzKGVycm9yX3BhZ2UsIFJfT0spID09IDApIHsKKwkJaW9idWZbbGVuKytdID0gJ1xyJzsKKwkJaW9idWZbbGVuKytdID0gJ1xuJzsKKwkJaWYgKERFQlVHKSB7CisJCQlpb2J1ZltsZW5dID0gJ1wwJzsKKwkJCWZwcmludGYoc3RkZXJyLCAiaGVhZGVyczogJyVzJ1xuIiwgaW9idWYpOworCQl9CisJCWZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgaW9idWYsIGxlbik7CisJCWlmIChERUJVRykKKwkJCWZwcmludGYoc3RkZXJyLCAid3JpdGluZyBlcnJvciBwYWdlOiAnJXMnXG4iLCBlcnJvcl9wYWdlKTsKKwkJcmV0dXJuIHNlbmRfZmlsZV9hbmRfZXhpdChlcnJvcl9wYWdlLCBTRU5EX0JPRFkpOworCX0KKyNlbmRpZgorCisJaWYgKGZpbGVfc2l6ZSAhPSAtMSkgeyAgICAvKiBmaWxlICovCisJCXN0cmZ0aW1lKHRtcF9zdHIsIHNpemVvZih0bXBfc3RyKSwgUkZDMTEyM0ZNVCwgZ210aW1lKCZsYXN0X21vZCkpOworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX1JBTkdFUworCQlpZiAocmVzcG9uc2VOdW0gPT0gSFRUUF9QQVJUSUFMX0NPTlRFTlQpIHsKKwkJCWxlbiArPSBzcHJpbnRmKGlvYnVmICsgbGVuLCAiQ29udGVudC1SYW5nZTogYnl0ZXMgJSJPRkZfRk1UInUtJSJPRkZfRk1UInUvJSJPRkZfRk1UInVcclxuIiwKKwkJCQkJcmFuZ2Vfc3RhcnQsCisJCQkJCXJhbmdlX2VuZCwKKwkJCQkJZmlsZV9zaXplKTsKKwkJCWZpbGVfc2l6ZSA9IHJhbmdlX2VuZCAtIHJhbmdlX3N0YXJ0ICsgMTsKKwkJfQorI2VuZGlmCisJCWxlbiArPSBzcHJpbnRmKGlvYnVmICsgbGVuLAorI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX1JBTkdFUworCQkJIkFjY2VwdC1SYW5nZXM6IGJ5dGVzXHJcbiIKKyNlbmRpZgorCQkJIkxhc3QtTW9kaWZpZWQ6ICVzXHJcbiVzICUiT0ZGX0ZNVCJ1XHJcbiIsCisJCQkJdG1wX3N0ciwKKwkJCQljb250ZW50X2d6aXAgPyAiVHJhbnNmZXItbGVuZ3RoOiIgOiAiQ29udGVudC1sZW5ndGg6IiwKKwkJCQlmaWxlX3NpemUKKwkJKTsKKwl9CisKKwlpZiAoY29udGVudF9nemlwKQorCQlsZW4gKz0gc3ByaW50Zihpb2J1ZiArIGxlbiwgIkNvbnRlbnQtRW5jb2Rpbmc6IGd6aXBcclxuIik7CisKKwlpb2J1ZltsZW4rK10gPSAnXHInOworCWlvYnVmW2xlbisrXSA9ICdcbic7CisJaWYgKGluZm9TdHJpbmcpIHsKKwkJbGVuICs9IHNwcmludGYoaW9idWYgKyBsZW4sCisJCQkJIjxIVE1MPjxIRUFEPjxUSVRMRT4lZCAlczwvVElUTEU+PC9IRUFEPlxuIgorCQkJCSI8Qk9EWT48SDE+JWQgJXM8L0gxPlxuJXNcbjwvQk9EWT48L0hUTUw+XG4iLAorCQkJCXJlc3BvbnNlTnVtLCByZXNwb25zZVN0cmluZywKKwkJCQlyZXNwb25zZU51bSwgcmVzcG9uc2VTdHJpbmcsIGluZm9TdHJpbmcpOworCX0KKwlpZiAoREVCVUcpIHsKKwkJaW9idWZbbGVuXSA9ICdcMCc7CisJCWZwcmludGYoc3RkZXJyLCAiaGVhZGVyczogJyVzJ1xuIiwgaW9idWYpOworCX0KKwlpZiAoZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBpb2J1ZiwgbGVuKSAhPSBsZW4pIHsKKwkJaWYgKHZlcmJvc2UgPiAxKQorCQkJYmJfcGVycm9yX21zZygiZXJyb3IiKTsKKwkJbG9nX2FuZF9leGl0KCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZW5kX2hlYWRlcnNfYW5kX2V4aXQoaW50IHJlc3BvbnNlTnVtKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIHNlbmRfaGVhZGVyc19hbmRfZXhpdChpbnQgcmVzcG9uc2VOdW0pCit7CisJSUZfRkVBVFVSRV9IVFRQRF9HWklQKGNvbnRlbnRfZ3ppcCA9IDA7KQorCXNlbmRfaGVhZGVycyhyZXNwb25zZU51bSk7CisJbG9nX2FuZF9leGl0KCk7Cit9CisKKy8qCisgKiBSZWFkIGZyb20gdGhlIHNvY2tldCB1bnRpbCAnXG4nIG9yIEVPRi4gJ1xyJyBjaGFycyBhcmUgcmVtb3ZlZC4KKyAqICdcbicgaXMgcmVwbGFjZWQgd2l0aCBOVUwuCisgKiBSZXR1cm4gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBvciAwIGlmIG5vdGhpbmcgaXMgcmVhZAorICogKCdccicgYW5kICdcbicgYXJlIG5vdCBjb3VudGVkKS4KKyAqIERhdGEgaXMgcmV0dXJuZWQgaW4gaW9idWYuCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2xpbmUodm9pZCkKK3sKKwlpbnQgY291bnQgPSAwOworCWNoYXIgYzsKKworCWFsYXJtKEhFQURFUl9SRUFEX1RJTUVPVVQpOworCXdoaWxlICgxKSB7CisJCWlmIChoZHJfY250IDw9IDApIHsKKwkJCWhkcl9jbnQgPSBzYWZlX3JlYWQoU1RESU5fRklMRU5PLCBoZHJfYnVmLCBzaXplb2YoaGRyX2J1ZikpOworCQkJaWYgKGhkcl9jbnQgPD0gMCkKKwkJCQlicmVhazsKKwkJCWhkcl9wdHIgPSBoZHJfYnVmOworCQl9CisJCWlvYnVmW2NvdW50XSA9IGMgPSAqaGRyX3B0cisrOworCQloZHJfY250LS07CisKKwkJaWYgKGMgPT0gJ1xyJykKKwkJCWNvbnRpbnVlOworCQlpZiAoYyA9PSAnXG4nKSB7CisJCQlpb2J1Zltjb3VudF0gPSAnXDAnOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGNvdW50IDwgKElPQlVGX1NJWkUgLSAxKSkgICAgICAvKiBjaGVjayBvdmVyZmxvdyAqLworCQkJY291bnQrKzsKKwl9CisJcmV0dXJuIGNvdW50OworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQ0dJIHx8IEVOQUJMRV9GRUFUVVJFX0hUVFBEX1BST1hZCisKKy8qIGdjYyA0LjIuMSBmYXJlcyBiZXR0ZXIgd2l0aCBOT0lOTElORSAqLworc3RhdGljIE5PSU5MSU5FIHZvaWQgY2dpX2lvX2xvb3BfYW5kX2V4aXQoaW50IGZyb21DZ2lfcmQsIGludCB0b0NnaV93ciwgaW50IHBvc3RfbGVuKSBOT1JFVFVSTjsKK3N0YXRpYyBOT0lOTElORSB2b2lkIGNnaV9pb19sb29wX2FuZF9leGl0KGludCBmcm9tQ2dpX3JkLCBpbnQgdG9DZ2lfd3IsIGludCBwb3N0X2xlbikKK3sKKwllbnVtIHsgRlJPTV9DR0kgPSAxLCBUT19DR0kgPSAyIH07IC8qIGluZGV4ZXMgaW4gcGZkW10gKi8KKwlzdHJ1Y3QgcG9sbGZkIHBmZFszXTsKKwlpbnQgb3V0X2NudDsgLyogd2UgYnVmZmVyIGEgYml0IG9mIGluaXRpYWwgQ0dJIG91dHB1dCAqLworCWludCBjb3VudDsKKworCS8qIGlvYnVmIGlzIHVzZWQgZm9yIENHSSAtPiBuZXR3b3JrIGRhdGEsCisJICogaGRyX2J1ZiBpcyBmb3IgbmV0d29yayAtPiBDR0kgZGF0YSAoUE9TVERBVEEpICovCisKKwkvKiBJZiBDR0kgZGllcywgd2Ugc3RpbGwgd2FudCB0byBjb3JyZWN0bHkgZmluaXNoIHJlYWRpbmcgaXRzIG91dHB1dAorCSAqIGFuZCBzZW5kIGl0IHRvIHRoZSBwZWVyLiBTbyBwbGVhc2Ugbm8gU0lHUElQRXMhICovCisJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisJLy8gV2UgaW5jb25zaXN0ZW50bHkgaGFuZGxlIGEgY2FzZSB3aGVuIG1vcmUgUE9TVERBVEEgZnJvbSBuZXR3b3JrCisJLy8gaXMgY29taW5nIHRoYW4gd2UgZXhwZWN0ZWQuIFdlIG1heSBnaXZlICpzb21lIHBhcnQqIG9mIHRoYXQKKwkvLyBleHRyYSBkYXRhIHRvIENHSS4KKworCS8vaWYgKGhkcl9jbnQgPiBwb3N0X2xlbikgeworCS8vCS8qIFdlIGdvdCBtb3JlIFBPU1REQVRBIGZyb20gbmV0d29yayB0aGFuIHdlIGV4cGVjdGVkICovCisJLy8JaGRyX2NudCA9IHBvc3RfbGVuOworCS8vfQorCXBvc3RfbGVuIC09IGhkcl9jbnQ7CisJLyogcG9zdF9sZW4gLSBudW1iZXIgb2YgUE9TVCBieXRlcyBub3QgeWV0IHJlYWQgZnJvbSBuZXR3b3JrICovCisKKwkvKiBOQjogYnJlYWtpbmcgb3V0IG9mIHRoaXMgbG9vcCBqdW1wcyB0byBsb2dfYW5kX2V4aXQoKSAqLworCW91dF9jbnQgPSAwOworCXBmZFtGUk9NX0NHSV0uZmQgPSBmcm9tQ2dpX3JkOworCXBmZFtGUk9NX0NHSV0uZXZlbnRzID0gUE9MTElOOworCXBmZFtUT19DR0ldLmZkID0gdG9DZ2lfd3I7CisJd2hpbGUgKDEpIHsKKwkJLyogTm90ZTogZXZlbiBwZmRbMF0uZXZlbnRzID09IDAgd29uJ3QgcHJldmVudAorCQkgKiByZXZlbnRzID09IFBPTExIVVB8UE9MTEVSUiByZXBvcnRzIGZyb20gY2xvc2VkIHN0ZGluLgorCQkgKiBTZXR0aW5nIGZkIHRvIC0xIHdvcmtzOiAqLworCQlwZmRbMF0uZmQgPSAtMTsKKwkJcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKwkJcGZkWzBdLnJldmVudHMgPSAwOyAvKiBwcm9iYWJseSBub3QgbmVlZGVkLCBwYXJhbm9pYSAqLworCisJCS8qIFdlIGFsd2F5cyBwb2xsIHRoaXMgZmQsIHRodXMga2VybmVsIGFsd2F5cyBzZXRzIHJldmVudHM6ICovCisJCS8qcGZkW0ZST01fQ0dJXS5ldmVudHMgPSBQT0xMSU47IC0gbW92ZWQgb3V0IG9mIGxvb3AgKi8KKwkJLypwZmRbRlJPTV9DR0ldLnJldmVudHMgPSAwOyAtIG5vdCBuZWVkZWQgKi8KKworCQkvKiBnY2MtNC44LjAgc3RpbGwgZG9lc250IGZpbGwgdHdvIHNob3J0cyB3aXRoIG9uZSBpbnNuIDooICovCisJCS8qIGh0dHA6Ly9nY2MuZ251Lm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9NDcwNTkgKi8KKwkJLyogaG9wZWZ1bGx5IG9uZSBkYXkgaXQgd2lsbC4uLiAqLworCQlwZmRbVE9fQ0dJXS5ldmVudHMgPSBQT0xMT1VUOworCQlwZmRbVE9fQ0dJXS5yZXZlbnRzID0gMDsgLyogbmVlZGVkISAqLworCisJCWlmICh0b0NnaV93ciAmJiBoZHJfY250IDw9IDApIHsKKwkJCWlmIChwb3N0X2xlbiA+IDApIHsKKwkJCQkvKiBFeHBlY3QgbW9yZSBQT1NUIGRhdGEgZnJvbSBuZXR3b3JrICovCisJCQkJcGZkWzBdLmZkID0gMDsKKwkJCX0gZWxzZSB7CisJCQkJLyogcG9zdF9sZW4gPD0gMCAmJiBoZHJfY250IDw9IDA6CisJCQkJICogbm8gbW9yZSBQT1NUIGRhdGEgdG8gQ0dJLAorCQkJCSAqIGxldCBDR0kgc2VlIEVPRiBvbiBDR0kncyBzdGRpbiAqLworCQkJCWlmICh0b0NnaV93ciAhPSBmcm9tQ2dpX3JkKQorCQkJCQljbG9zZSh0b0NnaV93cik7CisJCQkJdG9DZ2lfd3IgPSAwOworCQkJfQorCQl9CisKKwkJLyogTm93IHdhaXQgb24gdGhlIHNldCBvZiBzb2NrZXRzICovCisJCWNvdW50ID0gc2FmZV9wb2xsKHBmZCwgaGRyX2NudCA+IDAgPyBUT19DR0krMSA6IEZST01fQ0dJKzEsIC0xKTsKKwkJaWYgKGNvdW50IDw9IDApIHsKKyNpZiAwCisJCQlpZiAoc2FmZV93YWl0cGlkKHBpZCwgJnN0YXR1cywgV05PSEFORykgPD0gMCkgeworCQkJCS8qIFdlaXJkLiBDR0kgZGlkbid0IGV4aXQgYW5kIG5vIGZkJ3MKKwkJCQkgKiBhcmUgcmVhZHksIHlldCBwb2xsIHJldHVybmVkPyEgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChERUJVRyAmJiBXSUZFWElURUQoc3RhdHVzKSkKKwkJCQliYl9lcnJvcl9tc2coIkNHSSBleGl0ZWQsIHN0YXR1cz0lZCIsIFdFWElUU1RBVFVTKHN0YXR1cykpOworCQkJaWYgKERFQlVHICYmIFdJRlNJR05BTEVEKHN0YXR1cykpCisJCQkJYmJfZXJyb3JfbXNnKCJDR0kga2lsbGVkLCBzaWduYWw9JWQiLCBXVEVSTVNJRyhzdGF0dXMpKTsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworCQlpZiAocGZkW1RPX0NHSV0ucmV2ZW50cykgeworCQkJLyogaGRyX2NudCA+IDAgaGVyZSBkdWUgdG8gdGhlIHdheSBwb2xsKCkgY2FsbGVkICovCisJCQkvKiBIYXZlIGRhdGEgZnJvbSBwZWVyIGFuZCBjYW4gd3JpdGUgdG8gQ0dJICovCisJCQljb3VudCA9IHNhZmVfd3JpdGUodG9DZ2lfd3IsIGhkcl9wdHIsIGhkcl9jbnQpOworCQkJLyogRG9lc24ndCBoYXBwZW4sIHdlIGRvbnQgdXNlIG5vbmJsb2NraW5nIElPIGhlcmUKKwkJCSAqaWYgKGNvdW50IDwgMCAmJiBlcnJubyA9PSBFQUdBSU4pIHsKKwkJCSAqCS4uLgorCQkJICp9IGVsc2UgKi8KKwkJCWlmIChjb3VudCA+IDApIHsKKwkJCQloZHJfcHRyICs9IGNvdW50OworCQkJCWhkcl9jbnQgLT0gY291bnQ7CisJCQl9IGVsc2UgeworCQkJCS8qIEVPRi9icm9rZW4gcGlwZSB0byBDR0ksIHN0b3AgcGlwaW5nIFBPU1QgZGF0YSAqLworCQkJCWhkcl9jbnQgPSBwb3N0X2xlbiA9IDA7CisJCQl9CisJCX0KKworCQlpZiAocGZkWzBdLnJldmVudHMpIHsKKwkJCS8qIHBvc3RfbGVuID4gMCAmJiBoZHJfY250ID09IDAgaGVyZSAqLworCQkJLyogV2UgZXhwZWN0IGRhdGEsIHByZXYgZGF0YSBwb3J0aW9uIGlzIGVhdGVuIGJ5IENHSQorCQkJICogYW5kIHRoZXJlICppcyogZGF0YSB0byByZWFkIGZyb20gdGhlIHBlZXIKKwkJCSAqIChQT1NUREFUQSkgKi8KKwkJCS8vY291bnQgPSBwb3N0X2xlbiA+IChpbnQpc2l6ZW9mKGhkcl9idWYpID8gKGludClzaXplb2YoaGRyX2J1ZikgOiBwb3N0X2xlbjsKKwkJCS8vY291bnQgPSBzYWZlX3JlYWQoU1RESU5fRklMRU5PLCBoZHJfYnVmLCBjb3VudCk7CisJCQljb3VudCA9IHNhZmVfcmVhZChTVERJTl9GSUxFTk8sIGhkcl9idWYsIHNpemVvZihoZHJfYnVmKSk7CisJCQlpZiAoY291bnQgPiAwKSB7CisJCQkJaGRyX2NudCA9IGNvdW50OworCQkJCWhkcl9wdHIgPSBoZHJfYnVmOworCQkJCXBvc3RfbGVuIC09IGNvdW50OworCQkJfSBlbHNlIHsKKwkJCQkvKiBubyBtb3JlIFBPU1QgZGF0YSBjYW4gYmUgcmVhZCAqLworCQkJCXBvc3RfbGVuID0gMDsKKwkJCX0KKwkJfQorCisJCWlmIChwZmRbRlJPTV9DR0ldLnJldmVudHMpIHsKKwkJCS8qIFRoZXJlIGlzIHNvbWV0aGluZyB0byByZWFkIGZyb20gQ0dJICovCisJCQljaGFyICpyYnVmID0gaW9idWY7CisKKwkJCS8qIEFyZSB3ZSBzdGlsbCBidWZmZXJpbmcgQ0dJIG91dHB1dD8gKi8KKwkJCWlmIChvdXRfY250ID49IDApIHsKKwkJCQkvKiBIVFRQXzIwMFtdIGhhcyBzaW5nbGUgIlxyXG4iIGF0IHRoZSBlbmQuCisJCQkJICogQWNjb3JkaW5nIHRvIGh0dHA6Ly9ob29ob28ubmNzYS51aXVjLmVkdS9jZ2kvb3V0Lmh0bWwsCisJCQkJICogQ0dJIHNjcmlwdHMgTVVTVCBzZW5kIHRoZWlyIG93biBoZWFkZXIgdGVybWluYXRlZCBieQorCQkJCSAqIGVtcHR5IGxpbmUsIHRoZW4gZGF0YS4gVGhhdCdzIHdoeSB3ZSBoYXZlIG9ubHkgb25lCisJCQkJICogPGNyPjxsZj4gcGFpciBoZXJlLiBXZSB3aWxsIG91dHB1dCAiMjAwIE9LIiBsaW5lCisJCQkJICogaWYgbmVlZGVkLCBidXQgQ0dJIHN0aWxsIGhhcyB0byBwcm92aWRlIGJsYW5rIGxpbmUKKwkJCQkgKiBiZXR3ZWVuIGhlYWRlciBhbmQgYm9keSAqLworCisJCQkJLyogTXVzdCB1c2Ugc2FmZV9yZWFkLCBub3QgZnVsbF9yZWFkLCBiZWNhdXNlCisJCQkJICogQ0dJIG1heSBvdXRwdXQgYSBmZXcgZmlyc3QgYnl0ZXMgYW5kIHRoZW4gd2FpdAorCQkJCSAqIGZvciBQT1NUREFUQSB3aXRob3V0IGNsb3Npbmcgc3Rkb3V0LgorCQkJCSAqIFdpdGggZnVsbF9yZWFkIHdlIG1heSB3YWl0IGhlcmUgZm9yZXZlci4gKi8KKwkJCQljb3VudCA9IHNhZmVfcmVhZChmcm9tQ2dpX3JkLCByYnVmICsgb3V0X2NudCwgUElQRV9CVUYgLSA4KTsKKwkJCQlpZiAoY291bnQgPD0gMCkgeworCQkJCQkvKiBlb2YgKG9yIGVycm9yKSBhbmQgdGhlcmUgd2FzIG5vICJIVFRQIiwKKwkJCQkJICogc28gd3JpdGUgaXQsIHRoZW4gd3JpdGUgcmVjZWl2ZWQgZGF0YSAqLworCQkJCQlpZiAob3V0X2NudCkgeworCQkJCQkJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBIVFRQXzIwMCwgc2l6ZW9mKEhUVFBfMjAwKS0xKTsKKwkJCQkJCWZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgcmJ1Ziwgb3V0X2NudCk7CisJCQkJCX0KKwkJCQkJYnJlYWs7IC8qIENHSSBzdGRvdXQgaXMgY2xvc2VkLCBleGl0aW5nICovCisJCQkJfQorCQkJCW91dF9jbnQgKz0gY291bnQ7CisJCQkJY291bnQgPSAwOworCQkJCS8qICJTdGF0dXMiIGhlYWRlciBmb3JtYXQgaXM6ICJTdGF0dXM6IDMwMiBSZWRpcmVjdGVkXHJcbiIgKi8KKwkJCQlpZiAob3V0X2NudCA+PSA3ICYmIG1lbWNtcChyYnVmLCAiU3RhdHVzOiIsIDcpID09IDApIHsKKwkJCQkJLyogc2VuZCAiSFRUUC8xLjAgIiAqLworCQkJCQlpZiAoZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBIVFRQXzIwMCwgOSkgIT0gOSkKKwkJCQkJCWJyZWFrOworCQkJCQlyYnVmICs9IDc7IC8qIHNraXAgIlN0YXR1czoiICovCisJCQkJCWNvdW50ID0gb3V0X2NudCAtIDc7CisJCQkJCW91dF9jbnQgPSAtMTsgLyogYnVmZmVyaW5nIG9mZiAqLworCQkJCX0gZWxzZSBpZiAob3V0X2NudCA+PSA0KSB7CisJCQkJCS8qIERpZCBDR0kgYWRkICJIVFRQIj8gKi8KKwkJCQkJaWYgKG1lbWNtcChyYnVmLCBIVFRQXzIwMCwgNCkgIT0gMCkgeworCQkJCQkJLyogdGhlcmUgaXMgbm8gIkhUVFAiLCBkbyBpdCBvdXJzZWxmICovCisJCQkJCQlpZiAoZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBIVFRQXzIwMCwgc2l6ZW9mKEhUVFBfMjAwKS0xKSAhPSBzaXplb2YoSFRUUF8yMDApLTEpCisJCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJLyogQ29tbWVudGVkIG91dDoKKwkJCQkJaWYgKCFzdHJzdHIocmJ1ZiwgIm9udGVudC0iKSkgeworCQkJCQkJZnVsbF93cml0ZShzLCAiQ29udGVudC10eXBlOiB0ZXh0L3BsYWluXHJcblxyXG4iLCAyOCk7CisJCQkJCX0KKwkJCQkJICogQ291bnRlci1leGFtcGxlIG9mIHZhbGlkIENHSSB3aXRob3V0IENvbnRlbnQtdHlwZToKKwkJCQkJICogZWNobyAtZW4gIkhUVFAvMS4wIDMwMiBGb3VuZFxyXG4iCisJCQkJCSAqIGVjaG8gLWVuICJMb2NhdGlvbjogaHR0cDovL3d3dy5idXN5Ym94Lm5ldFxyXG4iCisJCQkJCSAqIGVjaG8gLWVuICJcclxuIgorCQkJCQkgKi8KKwkJCQkJY291bnQgPSBvdXRfY250OworCQkJCQlvdXRfY250ID0gLTE7IC8qIGJ1ZmZlcmluZyBvZmYgKi8KKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWNvdW50ID0gc2FmZV9yZWFkKGZyb21DZ2lfcmQsIHJidWYsIFBJUEVfQlVGKTsKKwkJCQlpZiAoY291bnQgPD0gMCkKKwkJCQkJYnJlYWs7ICAvKiBlb2YgKG9yIGVycm9yKSAqLworCQkJfQorCQkJaWYgKGZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgcmJ1ZiwgY291bnQpICE9IGNvdW50KQorCQkJCWJyZWFrOworCQkJaWYgKERFQlVHKQorCQkJCWZwcmludGYoc3RkZXJyLCAiY2dpIHJlYWQgJWQgYnl0ZXM6ICclLipzJ1xuIiwgY291bnQsIGNvdW50LCByYnVmKTsKKwkJfSAvKiBpZiAocGZkW0ZST01fQ0dJXS5yZXZlbnRzKSAqLworCX0gLyogd2hpbGUgKDEpICovCisJbG9nX2FuZF9leGl0KCk7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0NHSQorCitzdGF0aWMgdm9pZCBzZXRlbnYxKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCXNldGVudihuYW1lLCB2YWx1ZSA/IHZhbHVlIDogIiIsIDEpOworfQorCisvKgorICogU3Bhd24gQ0dJIHNjcmlwdCwgZm9yd2FyZCBDR0kncyBzdGRpbi9vdXQgPD0+IG5ldHdvcmsKKyAqCisgKiBFbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHNldCB1cCBhbmQgdGhlIHNjcmlwdCBpcyBpbnZva2VkIHdpdGggcGlwZXMKKyAqIGZvciBzdGRpbi9zdGRvdXQuICBJZiBhIFBPU1QgaXMgYmVpbmcgZG9uZSB0aGUgc2NyaXB0IGlzIGZlZCB0aGUgUE9TVAorICogZGF0YSBpbiBhZGRpdGlvbiB0byBzZXR0aW5nIHRoZSBRVUVSWV9TVFJJTkcgdmFyaWFibGUgKGZvciBHRVRzIG9yIFBPU1RzKS4KKyAqCisgKiBQYXJhbWV0ZXJzOgorICogY29uc3QgY2hhciAqdXJsICAgICAgICAgICAgICBUaGUgcmVxdWVzdGVkIFVSTCAod2l0aCBsZWFkaW5nIC8pLgorICogY29uc3QgY2hhciAqb3JpZ191cmkgICAgICAgICBUaGUgb3JpZ2luYWwgVVJJIGJlZm9yZSByZXdyaXRpbmcgKGlmIGFueSkKKyAqIGludCBwb3N0X2xlbiAgICAgICAgICAgICAgICAgTGVuZ3RoIG9mIHRoZSBQT1NUIGJvZHkuCisgKiBjb25zdCBjaGFyICpjb29raWUgICAgICAgICAgIEZvciBzZXQgSFRUUF9DT09LSUUuCisgKiBjb25zdCBjaGFyICpjb250ZW50X3R5cGUgICAgIEZvciBzZXQgQ09OVEVOVF9UWVBFLgorICovCitzdGF0aWMgdm9pZCBzZW5kX2NnaV9hbmRfZXhpdCgKKwkJY29uc3QgY2hhciAqdXJsLAorCQljb25zdCBjaGFyICpvcmlnX3VyaSwKKwkJY29uc3QgY2hhciAqcmVxdWVzdCwKKwkJaW50IHBvc3RfbGVuLAorCQljb25zdCBjaGFyICpjb29raWUsCisJCWNvbnN0IGNoYXIgKmNvbnRlbnRfdHlwZSkgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBzZW5kX2NnaV9hbmRfZXhpdCgKKwkJY29uc3QgY2hhciAqdXJsLAorCQljb25zdCBjaGFyICpvcmlnX3VyaSwKKwkJY29uc3QgY2hhciAqcmVxdWVzdCwKKwkJaW50IHBvc3RfbGVuLAorCQljb25zdCBjaGFyICpjb29raWUsCisJCWNvbnN0IGNoYXIgKmNvbnRlbnRfdHlwZSkKK3sKKwlzdHJ1Y3QgZmRfcGFpciBmcm9tQ2dpOyAgLyogQ0dJIC0+IGh0dHBkIHBpcGUgKi8KKwlzdHJ1Y3QgZmRfcGFpciB0b0NnaTsgICAgLyogaHR0cGQgLT4gQ0dJIHBpcGUgKi8KKwljaGFyICpzY3JpcHQsICpsYXN0X3NsYXNoOworCWludCBwaWQ7CisKKwkvKiBNYWtlIGEgY29weS4gTkI6IGNhbGxlciBndWFyYW50ZWVzOgorCSAqIHVybFswXSA9PSAnLycsIHVybFsxXSAhPSAnLycgKi8KKwl1cmwgPSB4c3RyZHVwKHVybCk7CisKKwkvKgorCSAqIFdlIGFyZSBtdWNraW5nIHdpdGggZW52aXJvbm1lbnQgX2ZpcnN0XyBhbmQgdGhlbiB2Zm9yay9leGVjLAorCSAqIHRoaXMgYWxsb3dzIHVzIHRvIHVzZSB2Zm9yayBzYWZlbHkuIFBhcmVudCBkb2Vzbid0IGNhcmUgYWJvdXQKKwkgKiB0aGVzZSBlbnZpcm9ubWVudCBjaGFuZ2VzIGFueXdheS4KKwkgKi8KKworCS8qIENoZWNrIGZvciBbZGlycy9dc2NyaXB0LmNnaS9QQVRIX0lORk8gKi8KKwlsYXN0X3NsYXNoID0gc2NyaXB0ID0gKGNoYXIqKXVybDsKKwl3aGlsZSAoKHNjcmlwdCA9IHN0cmNocihzY3JpcHQgKyAxLCAnLycpKSAhPSBOVUxMKSB7CisJCWludCBkaXI7CisJCSpzY3JpcHQgPSAnXDAnOworCQlkaXIgPSBpc19kaXJlY3RvcnkodXJsICsgMSwgLypmb2xsb3dsaW5rczoqLyAxKTsKKwkJKnNjcmlwdCA9ICcvJzsKKwkJaWYgKCFkaXIpIHsKKwkJCS8qIG5vdCBkaXJlY3RvcnksIGZvdW5kIHNjcmlwdC5jZ2kvUEFUSF9JTkZPICovCisJCQlicmVhazsKKwkJfQorCQkvKiBpcyBkaXJlY3RvcnksIGZpbmQgbmV4dCAnLycgKi8KKwkJbGFzdF9zbGFzaCA9IHNjcmlwdDsKKwl9CisJc2V0ZW52MSgiUEFUSF9JTkZPIiwgc2NyaXB0KTsgICAvKiBzZXQgdG8gL1BBVEhfSU5GTyBvciAiIiAqLworCXNldGVudjEoIlJFUVVFU1RfTUVUSE9EIiwgcmVxdWVzdCk7CisJaWYgKGdfcXVlcnkpIHsKKwkJcHV0ZW52KHhhc3ByaW50ZigiJXM9JXM/JXMiLCAiUkVRVUVTVF9VUkkiLCBvcmlnX3VyaSwgZ19xdWVyeSkpOworCX0gZWxzZSB7CisJCXNldGVudjEoIlJFUVVFU1RfVVJJIiwgb3JpZ191cmkpOworCX0KKwlpZiAoc2NyaXB0ICE9IE5VTEwpCisJCSpzY3JpcHQgPSAnXDAnOyAgICAgICAgIC8qIGN1dCBvZmYgL1BBVEhfSU5GTyAqLworCisJLyogU0NSSVBUX0ZJTEVOQU1FIGlzIHJlcXVpcmVkIGJ5IFBIUCBpbiBDR0kgbW9kZSAqLworCWlmIChob21lX2h0dHBkWzBdID09ICcvJykgeworCQljaGFyICpmdWxscGF0aCA9IGNvbmNhdF9wYXRoX2ZpbGUoaG9tZV9odHRwZCwgdXJsKTsKKwkJc2V0ZW52MSgiU0NSSVBUX0ZJTEVOQU1FIiwgZnVsbHBhdGgpOworCX0KKwkvKiBzZXQgU0NSSVBUX05BTUUgYXMgZnVsbCBwYXRoOiAvY2dpLWJpbi9kaXJzL3NjcmlwdC5jZ2kgKi8KKwlzZXRlbnYxKCJTQ1JJUFRfTkFNRSIsIHVybCk7CisJLyogaHR0cDovL2hvb2hvby5uY3NhLnVpdWMuZWR1L2NnaS9lbnYuaHRtbDoKKwkgKiBRVUVSWV9TVFJJTkc6IFRoZSBpbmZvcm1hdGlvbiB3aGljaCBmb2xsb3dzIHRoZSA/IGluIHRoZSBVUkwKKwkgKiB3aGljaCByZWZlcmVuY2VkIHRoaXMgc2NyaXB0LiBUaGlzIGlzIHRoZSBxdWVyeSBpbmZvcm1hdGlvbi4KKwkgKiBJdCBzaG91bGQgbm90IGJlIGRlY29kZWQgaW4gYW55IGZhc2hpb24uIFRoaXMgdmFyaWFibGUKKwkgKiBzaG91bGQgYWx3YXlzIGJlIHNldCB3aGVuIHRoZXJlIGlzIHF1ZXJ5IGluZm9ybWF0aW9uLAorCSAqIHJlZ2FyZGxlc3Mgb2YgY29tbWFuZCBsaW5lIGRlY29kaW5nLiAqLworCS8qIChPbGRlciB2ZXJzaW9ucyBvZiBiYm94IHNlZW0gdG8gZG8gc29tZSBkZWNvZGluZykgKi8KKwlzZXRlbnYxKCJRVUVSWV9TVFJJTkciLCBnX3F1ZXJ5KTsKKwlwdXRlbnYoKGNoYXIqKSJTRVJWRVJfU09GVFdBUkU9YnVzeWJveCBodHRwZC8iQkJfVkVSKTsKKwlwdXRlbnYoKGNoYXIqKSJTRVJWRVJfUFJPVE9DT0w9SFRUUC8xLjAiKTsKKwlwdXRlbnYoKGNoYXIqKSJHQVRFV0FZX0lOVEVSRkFDRT1DR0kvMS4xIik7CisJLyogSGF2aW5nIF9zZXBhcmF0ZV8gdmFyaWFibGVzIGZvciBJUCBhbmQgcG9ydCBkZWZlYXRzCisJICogdGhlIHB1cnBvc2Ugb2YgaGF2aW5nIHNvY2tldCBhYnN0cmFjdGlvbi4gV2hpY2ggInBvcnQiCisJICogYXJlIHlvdSB1c2luZyBvbiBVbml4IGRvbWFpbiBzb2NrZXQ/CisJICogSU9XIC0gUkVNT1RFX1BFRVI9IjEuMi4zLjQ6NTYiIG1ha2VzIG11Y2ggbW9yZSBzZW5zZS4KKwkgKiBPaCB3ZWxsLi4uICovCisJeworCQljaGFyICpwID0gcm10X2lwX3N0ciA/IHJtdF9pcF9zdHIgOiAoY2hhciopIiI7CisJCWNoYXIgKmNwID0gc3RycmNocihwLCAnOicpOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfSVBWNiAmJiBjcCAmJiBzdHJjaHIoY3AsICddJykpCisJCQljcCA9IE5VTEw7CisJCWlmIChjcCkgKmNwID0gJ1wwJzsgLyogZGVsZXRlIDpQT1JUICovCisJCXNldGVudjEoIlJFTU9URV9BRERSIiwgcCk7CisJCWlmIChjcCkgeworCQkJKmNwID0gJzonOworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX1NFVF9SRU1PVEVfUE9SVF9UT19FTlYKKwkJCXNldGVudjEoIlJFTU9URV9QT1JUIiwgY3AgKyAxKTsKKyNlbmRpZgorCQl9CisJfQorCXNldGVudjEoIkhUVFBfVVNFUl9BR0VOVCIsIHVzZXJfYWdlbnQpOworCWlmIChodHRwX2FjY2VwdCkKKwkJc2V0ZW52MSgiSFRUUF9BQ0NFUFQiLCBodHRwX2FjY2VwdCk7CisJaWYgKGh0dHBfYWNjZXB0X2xhbmd1YWdlKQorCQlzZXRlbnYxKCJIVFRQX0FDQ0VQVF9MQU5HVUFHRSIsIGh0dHBfYWNjZXB0X2xhbmd1YWdlKTsKKwlpZiAocG9zdF9sZW4pCisJCXB1dGVudih4YXNwcmludGYoIkNPTlRFTlRfTEVOR1RIPSVkIiwgcG9zdF9sZW4pKTsKKwlpZiAoY29va2llKQorCQlzZXRlbnYxKCJIVFRQX0NPT0tJRSIsIGNvb2tpZSk7CisJaWYgKGNvbnRlbnRfdHlwZSkKKwkJc2V0ZW52MSgiQ09OVEVOVF9UWVBFIiwgY29udGVudF90eXBlKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRICisJaWYgKHJlbW90ZXVzZXIpIHsKKwkJc2V0ZW52MSgiUkVNT1RFX1VTRVIiLCByZW1vdGV1c2VyKTsKKwkJcHV0ZW52KChjaGFyKikiQVVUSF9UWVBFPUJhc2ljIik7CisJfQorI2VuZGlmCisJaWYgKHJlZmVyZXIpCisJCXNldGVudjEoIkhUVFBfUkVGRVJFUiIsIHJlZmVyZXIpOworCXNldGVudjEoIkhUVFBfSE9TVCIsIGhvc3QpOyAvKiBzZXQgdG8gIiIgaWYgTlVMTCAqLworCS8qIHNldGVudjEoIlNFUlZFUl9OQU1FIiwgc2FmZV9nZXRob3N0bmFtZSgpKTsgLSBkb24ndCBkbyB0aGlzLAorCSAqIGp1c3QgcnVuICJlbnYgU0VSVkVSX05BTUU9eHl6IGh0dHBkIC4uLiIgaW5zdGVhZCAqLworCisJeHBpcGVkX3BhaXIoZnJvbUNnaSk7CisJeHBpcGVkX3BhaXIodG9DZ2kpOworCisJcGlkID0gdmZvcmsoKTsKKwlpZiAocGlkIDwgMCkgeworCQkvKiBUT0RPOiBsb2cgcGVycm9yPyAqLworCQlsb2dfYW5kX2V4aXQoKTsKKwl9CisKKwlpZiAocGlkID09IDApIHsKKwkJLyogQ2hpbGQgcHJvY2VzcyAqLworCQljaGFyICphcmd2WzNdOworCisJCXhmdW5jX2Vycm9yX3JldHZhbCA9IDI0MjsKKworCQkvKiBOQjogY2xvc2UgX2ZpcnN0XywgdGhlbiBtb3ZlIGZkcyEgKi8KKwkJY2xvc2UodG9DZ2kud3IpOworCQljbG9zZShmcm9tQ2dpLnJkKTsKKwkJeG1vdmVfZmQodG9DZ2kucmQsIDApOyAgLyogcmVwbGFjZSBzdGRpbiB3aXRoIHRoZSBwaXBlICovCisJCXhtb3ZlX2ZkKGZyb21DZ2kud3IsIDEpOyAgLyogcmVwbGFjZSBzdGRvdXQgd2l0aCB0aGUgcGlwZSAqLworCQkvKiBVc2VyIHNlZWluZyBzdGRlcnIgb3V0cHV0IGNhbiBiZSBhIHNlY3VyaXR5IHByb2JsZW0uCisJCSAqIElmIENHSSByZWFsbHkgd2FudHMgdGhhdCwgaXQgY2FuIGFsd2F5cyBkbyBkdXAgaXRzZWxmLiAqLworCQkvKiBkdXAyKDEsIDIpOyAqLworCisJCS8qIENoZGlyaW5nIHRvIHNjcmlwdCdzIGRpciAqLworCQlzY3JpcHQgPSBsYXN0X3NsYXNoOworCQlpZiAoc2NyaXB0ICE9IHVybCkgeyAvKiBwYXJhbm9pYSAqLworCQkJKnNjcmlwdCA9ICdcMCc7CisJCQlpZiAoY2hkaXIodXJsICsgMSkgIT0gMCkgeworCQkJCWJiX3BlcnJvcl9tc2coImNhbid0IGNoYW5nZSBkaXJlY3RvcnkgdG8gJyVzJyIsIHVybCArIDEpOworCQkJCWdvdG8gZXJyb3JfZXhlY2luZ19jZ2k7CisJCQl9CisJCQkvLyBub3QgbmVlZGVkOiAqc2NyaXB0ID0gJy8nOworCQl9CisJCXNjcmlwdCsrOworCisJCS8qIHNldCBhcmd2WzBdIHRvIG5hbWUgd2l0aG91dCBwYXRoICovCisJCWFyZ3ZbMF0gPSBzY3JpcHQ7CisJCWFyZ3ZbMV0gPSBOVUxMOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQ09ORklHX1dJVEhfU0NSSVBUX0lOVEVSUFIKKwkJeworCQkJY2hhciAqc3VmZml4ID0gc3RycmNocihzY3JpcHQsICcuJyk7CisKKwkJCWlmIChzdWZmaXgpIHsKKwkJCQlIdGFjY2VzcyAqY3VyOworCQkJCWZvciAoY3VyID0gc2NyaXB0X2k7IGN1cjsgY3VyID0gY3VyLT5uZXh0KSB7CisJCQkJCWlmIChzdHJjbXAoY3VyLT5iZWZvcmVfY29sb24gKyAxLCBzdWZmaXgpID09IDApIHsKKwkJCQkJCS8qIGZvdW5kIGludGVycHJldGVyIG5hbWUgKi8KKwkJCQkJCWFyZ3ZbMF0gPSBjdXItPmFmdGVyX2NvbG9uOworCQkJCQkJYXJndlsxXSA9IHNjcmlwdDsKKwkJCQkJCWFyZ3ZbMl0gPSBOVUxMOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZgorCQkvKiByZXN0b3JlIGRlZmF1bHQgc2lnbmFsIGRpc3Bvc2l0aW9ucyBmb3IgQ0dJIHByb2Nlc3MgKi8KKwkJYmJfc2lnbmFscygwCisJCQl8ICgxIDw8IFNJR0NITEQpCisJCQl8ICgxIDw8IFNJR1BJUEUpCisJCQl8ICgxIDw8IFNJR0hVUCkKKwkJCSwgU0lHX0RGTCk7CisKKwkJLyogX05PVF8gZXhlY3ZwLiBXZSBkbyBub3Qgc2VhcmNoIFBBVEguIGFyZ3ZbMF0gaXMgYSBmaWxlbmFtZQorCQkgKiB3aXRob3V0IGFueSBkaXIgY29tcG9uZW50cyBhbmQgd2lsbCBvbmx5IG1hdGNoIGEgZmlsZQorCQkgKiBpbiB0aGUgY3VycmVudCBkaXJlY3RvcnkgKi8KKwkJZXhlY3YoYXJndlswXSwgYXJndik7CisJCWlmICh2ZXJib3NlKQorCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgZXhlY3V0ZSAnJXMnIiwgYXJndlswXSk7CisgZXJyb3JfZXhlY2luZ19jZ2k6CisJCS8qIHNlbmQgdG8gc3Rkb3V0CisJCSAqICh3ZSBhcmUgQ0dJIGhlcmUsIG91ciBzdGRvdXQgaXMgcHVtcGVkIHRvIHRoZSBuZXQpICovCisJCXNlbmRfaGVhZGVyc19hbmRfZXhpdChIVFRQX05PVF9GT1VORCk7CisJfSAvKiBlbmQgY2hpbGQgKi8KKworCS8qIFBhcmVudCBwcm9jZXNzICovCisKKwkvKiBSZXN0b3JlIHZhcmlhYmxlcyBwb3NzaWJseSBjaGFuZ2VkIGJ5IGNoaWxkICovCisJeGZ1bmNfZXJyb3JfcmV0dmFsID0gMDsKKworCS8qIFB1bXAgZGF0YSAqLworCWNsb3NlKGZyb21DZ2kud3IpOworCWNsb3NlKHRvQ2dpLnJkKTsKKwljZ2lfaW9fbG9vcF9hbmRfZXhpdChmcm9tQ2dpLnJkLCB0b0NnaS53ciwgcG9zdF9sZW4pOworfQorCisjZW5kaWYgICAgICAgICAgLyogRkVBVFVSRV9IVFRQRF9DR0kgKi8KKworLyoKKyAqIFNlbmQgYSBmaWxlIHJlc3BvbnNlIHRvIGEgSFRUUCByZXF1ZXN0LCBhbmQgZXhpdAorICoKKyAqIFBhcmFtZXRlcnM6CisgKiBjb25zdCBjaGFyICp1cmwgIFRoZSByZXF1ZXN0ZWQgVVJMICh3aXRoIGxlYWRpbmcgLykuCisgKiB3aGF0ICAgICAgICAgICAgIFdoYXQgdG8gc2VuZCAoaGVhZGVycy9ib2R5L2JvdGgpLgorICovCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBzZW5kX2ZpbGVfYW5kX2V4aXQoY29uc3QgY2hhciAqdXJsLCBpbnQgd2hhdCkKK3sKKwljaGFyICpzdWZmaXg7CisJaW50IGZkOworCXNzaXplX3QgY291bnQ7CisKKwlpZiAoY29udGVudF9nemlwKSB7CisJCS8qIGRvZXMgPHVybD4uZ3ogZXhpc3Q/IFRoZW4gdXNlIGl0IGluc3RlYWQgKi8KKwkJY2hhciAqZ3p1cmwgPSB4YXNwcmludGYoIiVzLmd6IiwgdXJsKTsKKwkJZmQgPSBvcGVuKGd6dXJsLCBPX1JET05MWSk7CisJCWZyZWUoZ3p1cmwpOworCQlpZiAoZmQgIT0gLTEpIHsKKwkJCXN0cnVjdCBzdGF0IHNiOworCQkJZnN0YXQoZmQsICZzYik7CisJCQlmaWxlX3NpemUgPSBzYi5zdF9zaXplOworCQkJbGFzdF9tb2QgPSBzYi5zdF9tdGltZTsKKwkJfSBlbHNlIHsKKwkJCUlGX0ZFQVRVUkVfSFRUUERfR1pJUChjb250ZW50X2d6aXAgPSAwOykKKwkJCWZkID0gb3Blbih1cmwsIE9fUkRPTkxZKTsKKwkJfQorCX0gZWxzZSB7CisJCWZkID0gb3Blbih1cmwsIE9fUkRPTkxZKTsKKwl9CisJaWYgKGZkIDwgMCkgeworCQlpZiAoREVCVUcpCisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBvcGVuICclcyciLCB1cmwpOworCQkvKiBFcnJvciBwYWdlcyBhcmUgc2VudCBieSB1c2luZyBzZW5kX2ZpbGVfYW5kX2V4aXQoU0VORF9CT0RZKS4KKwkJICogSU9XOiBpdCBpcyB1bnNhZmUgdG8gY2FsbCBzZW5kX2hlYWRlcnNfYW5kX2V4aXQKKwkJICogaWYgd2hhdCBpcyBTRU5EX0JPRFkhIENhbiByZWN1cnNlISAqLworCQlpZiAod2hhdCAhPSBTRU5EX0JPRFkpCisJCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9OT1RfRk9VTkQpOworCQlsb2dfYW5kX2V4aXQoKTsKKwl9CisJLyogSWYgeW91IHdhbnQgdG8ga25vdyBhYm91dCBFUElQRSBiZWxvdworCSAqIChoYXBwZW5zIGlmIHlvdSBhYm9ydCBkb3dubG9hZHMgZnJvbSBsb2NhbCBodHRwZCk6ICovCisJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisJLyogSWYgbm90IGZvdW5kLCBkZWZhdWx0IGlzICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iICovCisJZm91bmRfbWltZV90eXBlID0gImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSI7CisJc3VmZml4ID0gc3RycmNocih1cmwsICcuJyk7CisJaWYgKHN1ZmZpeCkgeworCQlzdGF0aWMgY29uc3QgY2hhciBzdWZmaXhUYWJsZVtdIEFMSUdOMSA9CisJCQkvKiBTaG9ydGVyIHN1ZmZpeCBtdXN0IGJlIGZpcnN0OgorCQkJICogIi5odG1sLmh0bSIgd2lsbCBmYWlsIGZvciAiLmh0bSIKKwkJCSAqLworCQkJIi50eHQuaC5jLmNjLmNwcFwwIiAidGV4dC9wbGFpblwwIgorCQkJLyogLmh0bSBsaW5lIG11c3QgYmUgYWZ0ZXIgLmggbGluZSAqLworCQkJIi5odG0uaHRtbFwwIiAidGV4dC9odG1sXDAiCisJCQkiLmpwZy5qcGVnXDAiICJpbWFnZS9qcGVnXDAiCisJCQkiLmdpZlwwIiAgICAgICJpbWFnZS9naWZcMCIKKwkJCSIucG5nXDAiICAgICAgImltYWdlL3BuZ1wwIgorCQkJLyogLmNzcyBsaW5lIG11c3QgYmUgYWZ0ZXIgLmMgbGluZSAqLworCQkJIi5jc3NcMCIgICAgICAidGV4dC9jc3NcMCIKKwkJCSIud2F2XDAiICAgICAgImF1ZGlvL3dhdlwwIgorCQkJIi5hdmlcMCIgICAgICAidmlkZW8veC1tc3ZpZGVvXDAiCisJCQkiLnF0Lm1vdlwwIiAgICJ2aWRlby9xdWlja3RpbWVcMCIKKwkJCSIubXBlLm1wZWdcMCIgInZpZGVvL21wZWdcMCIKKwkJCSIubWlkLm1pZGlcMCIgImF1ZGlvL21pZGlcMCIKKwkJCSIubXAzXDAiICAgICAgImF1ZGlvL21wZWdcMCIKKyNpZiAwICAvKiB1bnBvcHVsYXIgKi8KKwkJCSIuYXVcMCIgICAgICAgImF1ZGlvL2Jhc2ljXDAiCisJCQkiLnBhY1wwIiAgICAgICJhcHBsaWNhdGlvbi94LW5zLXByb3h5LWF1dG9jb25maWdcMCIKKwkJCSIudnJtbC53cmxcMCIgIm1vZGVsL3ZybWxcMCIKKyNlbmRpZgorCQkJLyogY29tcGlsZXIgYWRkcyBhbm90aGVyICJcMCIgaGVyZSAqLworCQk7CisJCUh0YWNjZXNzICpjdXI7CisKKwkJLyogRXhhbWluZSBidWlsdC1pbiB0YWJsZSAqLworCQljb25zdCBjaGFyICp0YWJsZSA9IHN1ZmZpeFRhYmxlOworCQljb25zdCBjaGFyICp0YWJsZV9uZXh0OworCQlmb3IgKDsgKnRhYmxlOyB0YWJsZSA9IHRhYmxlX25leHQpIHsKKwkJCWNvbnN0IGNoYXIgKnRyeV9zdWZmaXg7CisJCQljb25zdCBjaGFyICptaW1lX3R5cGU7CisJCQltaW1lX3R5cGUgID0gdGFibGUgKyBzdHJsZW4odGFibGUpICsgMTsKKwkJCXRhYmxlX25leHQgPSBtaW1lX3R5cGUgKyBzdHJsZW4obWltZV90eXBlKSArIDE7CisJCQl0cnlfc3VmZml4ID0gc3Ryc3RyKHRhYmxlLCBzdWZmaXgpOworCQkJaWYgKCF0cnlfc3VmZml4KQorCQkJCWNvbnRpbnVlOworCQkJdHJ5X3N1ZmZpeCArPSBzdHJsZW4oc3VmZml4KTsKKwkJCWlmICgqdHJ5X3N1ZmZpeCA9PSAnXDAnIHx8ICp0cnlfc3VmZml4ID09ICcuJykgeworCQkJCWZvdW5kX21pbWVfdHlwZSA9IG1pbWVfdHlwZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIEV4YW1wbGU6IHN0cnN0cih0YWJsZSwgIi5hdiIpICE9IE5VTEwsIGJ1dCBpdAorCQkJICogZG9lcyBub3QgbWF0Y2ggIi5hdmkiIGFmdGVyIGFsbCBhbmQgd2UgZW5kIHVwIGhlcmUuCisJCQkgKiBUaGUgdGFibGUgaXMgYXJyYW5nZWQgc28gdGhhdCBpbiB0aGlzIGNhc2Ugd2Uga25vdworCQkJICogdGhhdCBpdCBjYW4ndCBtYXRjaCBhbnl0aGluZyBpbiB0aGUgZm9sbG93aW5nIGxpbmVzLAorCQkJICogYW5kIHdlIHN0b3AgdGhlIHNlYXJjaDogKi8KKwkJCWJyZWFrOworCQl9CisJCS8qIC4uLnRoZW4gdXNlcidzIHRhYmxlICovCisJCWZvciAoY3VyID0gbWltZV9hOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkgeworCQkJaWYgKHN0cmNtcChjdXItPmJlZm9yZV9jb2xvbiwgc3VmZml4KSA9PSAwKSB7CisJCQkJZm91bmRfbWltZV90eXBlID0gY3VyLT5hZnRlcl9jb2xvbjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmIChERUJVRykKKwkJYmJfZXJyb3JfbXNnKCJzZW5kaW5nIGZpbGUgJyVzJyBjb250ZW50LXR5cGU6ICVzIiwKKwkJCXVybCwgZm91bmRfbWltZV90eXBlKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX1JBTkdFUworCWlmICh3aGF0ID09IFNFTkRfQk9EWSAvKiBlcnIgcGFnZXMgYW5kIHJhbmdlcyBkb24ndCBtaXggKi8KKwkgfHwgY29udGVudF9nemlwIC8qIHdlIGFyZSBzZW5kaW5nIGNvbXByZXNzZWQgcGFnZTogY2FuJ3QgZG8gcmFuZ2VzICovICAvLy93aHk/CisJKSB7CisJCXJhbmdlX3N0YXJ0ID0gLTE7CisJfQorCXJhbmdlX2xlbiA9IE1BWElOVChvZmZfdCk7CisJaWYgKHJhbmdlX3N0YXJ0ID49IDApIHsKKwkJaWYgKCFyYW5nZV9lbmQgfHwgcmFuZ2VfZW5kID4gZmlsZV9zaXplIC0gMSkgeworCQkJcmFuZ2VfZW5kID0gZmlsZV9zaXplIC0gMTsKKwkJfQorCQlpZiAocmFuZ2VfZW5kIDwgcmFuZ2Vfc3RhcnQKKwkJIHx8IGxzZWVrKGZkLCByYW5nZV9zdGFydCwgU0VFS19TRVQpICE9IHJhbmdlX3N0YXJ0CisJCSkgeworCQkJbHNlZWsoZmQsIDAsIFNFRUtfU0VUKTsKKwkJCXJhbmdlX3N0YXJ0ID0gLTE7CisJCX0gZWxzZSB7CisJCQlyYW5nZV9sZW4gPSByYW5nZV9lbmQgLSByYW5nZV9zdGFydCArIDE7CisJCQlzZW5kX2hlYWRlcnMoSFRUUF9QQVJUSUFMX0NPTlRFTlQpOworCQkJd2hhdCA9IFNFTkRfQk9EWTsKKwkJfQorCX0KKyNlbmRpZgorCWlmICh3aGF0ICYgU0VORF9IRUFERVJTKQorCQlzZW5kX2hlYWRlcnMoSFRUUF9PSyk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX1NFTkRGSUxFCisJeworCQlvZmZfdCBvZmZzZXQgPSByYW5nZV9zdGFydDsKKwkJd2hpbGUgKDEpIHsKKwkJCS8qIHN6IGlzIHJvdW5kZWQgZG93biB0byA2NGsgKi8KKwkJCXNzaXplX3Qgc3ogPSBNQVhJTlQoc3NpemVfdCkgLSAweGZmZmY7CisJCQlJRl9GRUFUVVJFX0hUVFBEX1JBTkdFUyhpZiAoc3ogPiByYW5nZV9sZW4pIHN6ID0gcmFuZ2VfbGVuOykKKwkJCWNvdW50ID0gc2VuZGZpbGUoU1RET1VUX0ZJTEVOTywgZmQsICZvZmZzZXQsIHN6KTsKKwkJCWlmIChjb3VudCA8IDApIHsKKwkJCQlpZiAob2Zmc2V0ID09IHJhbmdlX3N0YXJ0KQorCQkJCQlicmVhazsgLyogZmFsbCBiYWNrIHRvIHJlYWQvd3JpdGUgbG9vcCAqLworCQkJCWdvdG8gZmluOworCQkJfQorCQkJSUZfRkVBVFVSRV9IVFRQRF9SQU5HRVMocmFuZ2VfbGVuIC09IGNvdW50OykKKwkJCWlmIChjb3VudCA9PSAwIHx8IHJhbmdlX2xlbiA9PSAwKQorCQkJCWxvZ19hbmRfZXhpdCgpOworCQl9CisJfQorI2VuZGlmCisJd2hpbGUgKChjb3VudCA9IHNhZmVfcmVhZChmZCwgaW9idWYsIElPQlVGX1NJWkUpKSA+IDApIHsKKwkJc3NpemVfdCBuOworCQlJRl9GRUFUVVJFX0hUVFBEX1JBTkdFUyhpZiAoY291bnQgPiByYW5nZV9sZW4pIGNvdW50ID0gcmFuZ2VfbGVuOykKKwkJbiA9IGZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgaW9idWYsIGNvdW50KTsKKwkJaWYgKGNvdW50ICE9IG4pCisJCQlicmVhazsKKwkJSUZfRkVBVFVSRV9IVFRQRF9SQU5HRVMocmFuZ2VfbGVuIC09IGNvdW50OykKKwkJaWYgKHJhbmdlX2xlbiA9PSAwKQorCQkJYnJlYWs7CisJfQorCWlmIChjb3VudCA8IDApIHsKKyBJRl9GRUFUVVJFX1VTRV9TRU5ERklMRShmaW46KQorCQlpZiAodmVyYm9zZSA+IDEpCisJCQliYl9wZXJyb3JfbXNnKCJlcnJvciIpOworCX0KKwlsb2dfYW5kX2V4aXQoKTsKK30KKworc3RhdGljIGludCBjaGVja1Blcm1JUCh2b2lkKQoreworCUh0YWNjZXNzX0lQICpjdXI7CisKKwlmb3IgKGN1ciA9IGlwX2FfZDsgY3VyOyBjdXIgPSBjdXItPm5leHQpIHsKKyNpZiBERUJVRworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJjaGVja1Blcm1JUDogJyVzJyA/ICcldS4ldS4ldS4ldS8ldS4ldS4ldS4ldSdcbiIsCisJCQlybXRfaXBfc3RyLAorCQkJKHVuc2lnbmVkIGNoYXIpKGN1ci0+aXAgPj4gMjQpLAorCQkJKHVuc2lnbmVkIGNoYXIpKGN1ci0+aXAgPj4gMTYpLAorCQkJKHVuc2lnbmVkIGNoYXIpKGN1ci0+aXAgPj4gOCksCisJCQkodW5zaWduZWQgY2hhcikoY3VyLT5pcCksCisJCQkodW5zaWduZWQgY2hhcikoY3VyLT5tYXNrID4+IDI0KSwKKwkJCSh1bnNpZ25lZCBjaGFyKShjdXItPm1hc2sgPj4gMTYpLAorCQkJKHVuc2lnbmVkIGNoYXIpKGN1ci0+bWFzayA+PiA4KSwKKwkJCSh1bnNpZ25lZCBjaGFyKShjdXItPm1hc2spCisJCSk7CisjZW5kaWYKKwkJaWYgKChybXRfaXAgJiBjdXItPm1hc2spID09IGN1ci0+aXApCisJCQlyZXR1cm4gKGN1ci0+YWxsb3dfZGVueSA9PSAnQScpOyAvKiBBIC0+IDEgKi8KKwl9CisKKwlyZXR1cm4gIWZsZ19kZW55X2FsbDsgLyogZGVwZW5kcyBvbiB3aGV0aGVyIHdlIHNhdyAiRDoqIiAqLworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSAorCisjIGlmIEVOQUJMRV9QQU0KK3N0cnVjdCBwYW1fdXNlcmluZm8geworCWNvbnN0IGNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqcHc7Cit9OworCitzdGF0aWMgaW50IHBhbV90YWxrZXIoaW50IG51bV9tc2csCisJCWNvbnN0IHN0cnVjdCBwYW1fbWVzc2FnZSAqKm1zZywKKwkJc3RydWN0IHBhbV9yZXNwb25zZSAqKnJlc3AsCisJCXZvaWQgKmFwcGRhdGFfcHRyKQoreworCWludCBpOworCXN0cnVjdCBwYW1fdXNlcmluZm8gKnVzZXJpbmZvID0gKHN0cnVjdCBwYW1fdXNlcmluZm8gKikgYXBwZGF0YV9wdHI7CisJc3RydWN0IHBhbV9yZXNwb25zZSAqcmVzcG9uc2U7CisKKwlpZiAoIXJlc3AgfHwgIW1zZyB8fCAhdXNlcmluZm8pCisJCXJldHVybiBQQU1fQ09OVl9FUlI7CisKKwkvKiBhbGxvY2F0ZSBtZW1vcnkgdG8gc3RvcmUgcmVzcG9uc2UgKi8KKwlyZXNwb25zZSA9IHh6YWxsb2MobnVtX21zZyAqIHNpemVvZigqcmVzcG9uc2UpKTsKKworCS8qIGNvcHkgdmFsdWVzICovCisJZm9yIChpID0gMDsgaSA8IG51bV9tc2c7IGkrKykgeworCQljb25zdCBjaGFyICpzOworCisJCXN3aXRjaCAobXNnW2ldLT5tc2dfc3R5bGUpIHsKKwkJY2FzZSBQQU1fUFJPTVBUX0VDSE9fT046CisJCQlzID0gdXNlcmluZm8tPm5hbWU7CisJCQlicmVhazsKKwkJY2FzZSBQQU1fUFJPTVBUX0VDSE9fT0ZGOgorCQkJcyA9IHVzZXJpbmZvLT5wdzsKKwkJCWJyZWFrOworCQljYXNlIFBBTV9FUlJPUl9NU0c6CisJCWNhc2UgUEFNX1RFWFRfSU5GTzoKKwkJCXMgPSAiIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZnJlZShyZXNwb25zZSk7CisJCQlyZXR1cm4gUEFNX0NPTlZfRVJSOworCQl9CisJCXJlc3BvbnNlW2ldLnJlc3AgPSB4c3RyZHVwKHMpOworCQlpZiAoUEFNX1NVQ0NFU1MgIT0gMCkKKwkJCXJlc3BvbnNlW2ldLnJlc3BfcmV0Y29kZSA9IFBBTV9TVUNDRVNTOworCX0KKwkqcmVzcCA9IHJlc3BvbnNlOworCXJldHVybiBQQU1fU1VDQ0VTUzsKK30KKyMgZW5kaWYKKworLyoKKyAqIENvbmZpZyBmaWxlIGVudHJpZXMgYXJlIG9mIHRoZSBmb3JtICIvPHBhdGg+Ojx1c2VyPjo8cGFzc3dkPiIuCisgKiBJZiBjb25maWcgZmlsZSBoYXMgbm8gcHJlZml4IG1hdGNoIGZvciBwYXRoLCBhY2Nlc3MgaXMgYWxsb3dlZC4KKyAqCisgKiBwYXRoICAgICAgICAgICAgICAgICBUaGUgZmlsZSBwYXRoCisgKiB1c2VyX2FuZF9wYXNzd2QgICAgICAidXNlcjpwYXNzd2QiIHRvIHZhbGlkYXRlCisgKgorICogUmV0dXJucyAxIGlmIHVzZXJfYW5kX3Bhc3N3ZCBpcyBPSy4KKyAqLworc3RhdGljIGludCBjaGVja191c2VyX3Bhc3N3ZChjb25zdCBjaGFyICpwYXRoLCBjaGFyICp1c2VyX2FuZF9wYXNzd2QpCit7CisJSHRhY2Nlc3MgKmN1cjsKKwljb25zdCBjaGFyICpwcmV2ID0gTlVMTDsKKworCWZvciAoY3VyID0gZ19hdXRoOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkgeworCQljb25zdCBjaGFyICpkaXJfcHJlZml4OworCQlzaXplX3QgbGVuOworCQlpbnQgcjsKKworCQlkaXJfcHJlZml4ID0gY3VyLT5iZWZvcmVfY29sb247CisKKwkJLyogV0hZPyAqLworCQkvKiBJZiBhbHJlYWR5IHNhdyBhIG1hdGNoLCBkb24ndCBhY2NlcHQgb3RoZXIgZGlmZmVyZW50IG1hdGNoZXMgKi8KKwkJaWYgKHByZXYgJiYgc3RyY21wKHByZXYsIGRpcl9wcmVmaXgpICE9IDApCisJCQljb250aW51ZTsKKworCQlpZiAoREVCVUcpCisJCQlmcHJpbnRmKHN0ZGVyciwgImNoZWNrUGVybTogJyVzJyA/ICclcydcbiIsIGRpcl9wcmVmaXgsIHVzZXJfYW5kX3Bhc3N3ZCk7CisKKwkJLyogSWYgaXQncyBub3QgYSBwcmVmaXggbWF0Y2gsIGNvbnRpbnVlIHNlYXJjaGluZyAqLworCQlsZW4gPSBzdHJsZW4oZGlyX3ByZWZpeCk7CisJCWlmIChsZW4gIT0gMSAvKiBkaXJfcHJlZml4ICIvIiBtYXRjaGVzIGFsbCwgZG9uJ3QgbmVlZCB0byBjaGVjayAqLworCQkgJiYgKHN0cm5jbXAoZGlyX3ByZWZpeCwgcGF0aCwgbGVuKSAhPSAwCisJCSAgICB8fCAocGF0aFtsZW5dICE9ICcvJyAmJiBwYXRoW2xlbl0gIT0gJ1wwJykKKwkJICAgICkKKwkJKSB7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFBhdGggbWF0Y2ggZm91bmQgKi8KKwkJcHJldiA9IGRpcl9wcmVmaXg7CisKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1KSB7CisJCQljaGFyICpjb2xvbl9hZnRlcl91c2VyOworCQkJY29uc3QgY2hhciAqcGFzc3dkOworIyBpZiBFTkFCTEVfRkVBVFVSRV9TSEFET1dQQVNTV0RTICYmICFFTkFCTEVfUEFNCisJCQljaGFyIHNwX2J1ZlsyNTZdOworIyBlbmRpZgorCisJCQljb2xvbl9hZnRlcl91c2VyID0gc3RyY2hyKHVzZXJfYW5kX3Bhc3N3ZCwgJzonKTsKKwkJCWlmICghY29sb25fYWZ0ZXJfdXNlcikKKwkJCQlnb3RvIGJhZF9pbnB1dDsKKworCQkJLyogY29tcGFyZSAidXNlcjoiICovCisJCQlpZiAoY3VyLT5hZnRlcl9jb2xvblswXSAhPSAnKicKKwkJCSAmJiBzdHJuY21wKGN1ci0+YWZ0ZXJfY29sb24sIHVzZXJfYW5kX3Bhc3N3ZCwKKwkJCQkJY29sb25fYWZ0ZXJfdXNlciAtIHVzZXJfYW5kX3Bhc3N3ZCArIDEpICE9IDAKKwkJCSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJLyogdGhpcyBjZmcgZW50cnkgaXMgJyonIG9yIG1hdGNoZXMgdXNlcm5hbWUgZnJvbSBwZWVyICovCisKKwkJCXBhc3N3ZCA9IHN0cmNocihjdXItPmFmdGVyX2NvbG9uLCAnOicpOworCQkJaWYgKCFwYXNzd2QpCisJCQkJZ290byBiYWRfaW5wdXQ7CisJCQlwYXNzd2QrKzsKKwkJCWlmIChwYXNzd2RbMF0gPT0gJyonKSB7CisjIGlmIEVOQUJMRV9QQU0KKwkJCQlzdHJ1Y3QgcGFtX3VzZXJpbmZvIHVzZXJpbmZvOworCQkJCXN0cnVjdCBwYW1fY29udiBjb252X2luZm8gPSB7ICZwYW1fdGFsa2VyLCAodm9pZCAqKSAmdXNlcmluZm8gfTsKKwkJCQlwYW1faGFuZGxlX3QgKnBhbWg7CisKKwkJCQkqY29sb25fYWZ0ZXJfdXNlciA9ICdcMCc7CisJCQkJdXNlcmluZm8ubmFtZSA9IHVzZXJfYW5kX3Bhc3N3ZDsKKwkJCQl1c2VyaW5mby5wdyA9IGNvbG9uX2FmdGVyX3VzZXIgKyAxOworCQkJCXIgPSBwYW1fc3RhcnQoImh0dHBkIiwgdXNlcl9hbmRfcGFzc3dkLCAmY29udl9pbmZvLCAmcGFtaCkgIT0gUEFNX1NVQ0NFU1M7CisJCQkJaWYgKHIgPT0gMCkgeworCQkJCQlyID0gcGFtX2F1dGhlbnRpY2F0ZShwYW1oLCBQQU1fRElTQUxMT1dfTlVMTF9BVVRIVE9LKSAhPSBQQU1fU1VDQ0VTUworCQkJCQkgfHwgcGFtX2FjY3RfbWdtdChwYW1oLCBQQU1fRElTQUxMT1dfTlVMTF9BVVRIVE9LKSAgICAhPSBQQU1fU1VDQ0VTUworCQkJCQk7CisJCQkJCXBhbV9lbmQocGFtaCwgUEFNX1NVQ0NFU1MpOworCQkJCX0KKwkJCQkqY29sb25fYWZ0ZXJfdXNlciA9ICc6JzsKKwkJCQlnb3RvIGVuZF9jaGVja19wYXNzd2Q7CisjIGVsc2UKKyMgIGlmIEVOQUJMRV9GRUFUVVJFX1NIQURPV1BBU1NXRFMKKwkJCQkvKiBVc2luZyBfciBmdW5jdGlvbiB0byBhdm9pZCBwdWxsaW5nIGluIHN0YXRpYyBidWZmZXJzICovCisJCQkJc3RydWN0IHNwd2Qgc3B3OworIyAgZW5kaWYKKwkJCQlzdHJ1Y3QgcGFzc3dkICpwdzsKKworCQkJCSpjb2xvbl9hZnRlcl91c2VyID0gJ1wwJzsKKwkJCQlwdyA9IGdldHB3bmFtKHVzZXJfYW5kX3Bhc3N3ZCk7CisJCQkJKmNvbG9uX2FmdGVyX3VzZXIgPSAnOic7CisJCQkJaWYgKCFwdyB8fCAhcHctPnB3X3Bhc3N3ZCkKKwkJCQkJY29udGludWU7CisJCQkJcGFzc3dkID0gcHctPnB3X3Bhc3N3ZDsKKyMgIGlmIEVOQUJMRV9GRUFUVVJFX1NIQURPV1BBU1NXRFMKKwkJCQlpZiAoKHBhc3N3ZFswXSA9PSAneCcgfHwgcGFzc3dkWzBdID09ICcqJykgJiYgIXBhc3N3ZFsxXSkgeworCQkJCQkvKiBnZXRzcG5hbV9yIG1heSByZXR1cm4gMCB5ZXQgc2V0IHJlc3VsdCB0byBOVUxMLgorCQkJCQkgKiBBdCBsZWFzdCBnbGliYyAyLjQgZG9lcyB0aGlzLiBCZSBleHRyYSBwYXJhbm9pZCBoZXJlLiAqLworCQkJCQlzdHJ1Y3Qgc3B3ZCAqcmVzdWx0ID0gTlVMTDsKKwkJCQkJciA9IGdldHNwbmFtX3IocHctPnB3X25hbWUsICZzcHcsIHNwX2J1Ziwgc2l6ZW9mKHNwX2J1ZiksICZyZXN1bHQpOworCQkJCQlpZiAociA9PSAwICYmIHJlc3VsdCkKKwkJCQkJCXBhc3N3ZCA9IHJlc3VsdC0+c3BfcHdkcDsKKwkJCQl9CisjICBlbmRpZgorCQkJCS8qIEluIHRoaXMgY2FzZSwgcGFzc3dkIGlzIEFMV0FZUyBlbmNyeXB0ZWQ6CisJCQkJICogaXQgY2FtZSBmcm9tIC9ldGMvcGFzc3dkIG9yIC9ldGMvc2hhZG93IQorCQkJCSAqLworCQkJCWdvdG8gY2hlY2tfZW5jcnlwdGVkOworIyBlbmRpZiAvKiBFTkFCTEVfUEFNICovCisJCQl9CisJCQkvKiBFbHNlOiBwYXNzd2QgaXMgZnJvbSBodHRwZC5jb25mLCBpdCBpcyBlaXRoZXIgcGxhaW50ZXh0IG9yIGVuY3J5cHRlZCAqLworCisJCQlpZiAocGFzc3dkWzBdID09ICckJyAmJiBpc2RpZ2l0KHBhc3N3ZFsxXSkpIHsKKwkJCQljaGFyICplbmNyeXB0ZWQ7CisjIGlmICFFTkFCTEVfUEFNCisgY2hlY2tfZW5jcnlwdGVkOgorIyBlbmRpZgorCQkJCS8qIGVuY3J5cHQgcHdkIGZyb20gcGVlciBhbmQgY2hlY2sgbWF0Y2ggd2l0aCBsb2NhbCBvbmUgKi8KKwkJCQllbmNyeXB0ZWQgPSBwd19lbmNyeXB0KAorCQkJCQkvKiBwd2QgKGZyb20gcGVlcik6ICovICBjb2xvbl9hZnRlcl91c2VyICsgMSwKKwkJCQkJLyogc2FsdDogKi8gcGFzc3dkLAorCQkJCQkvKiBjbGVhbnVwOiAqLyAwCisJCQkJKTsKKwkJCQlyID0gc3RyY21wKGVuY3J5cHRlZCwgcGFzc3dkKTsKKwkJCQlmcmVlKGVuY3J5cHRlZCk7CisJCQl9IGVsc2UgeworCQkJCS8qIGxvY2FsIHBhc3N3ZCBpcyBmcm9tIGh0dHBkLmNvbmYgYW5kIGl0J3MgcGxhaW50ZXh0ICovCisJCQkJciA9IHN0cmNtcChjb2xvbl9hZnRlcl91c2VyICsgMSwgcGFzc3dkKTsKKwkJCX0KKwkJCWdvdG8gZW5kX2NoZWNrX3Bhc3N3ZDsKKwkJfQorIGJhZF9pbnB1dDoKKwkJLyogQ29tcGFyaW5nIHBsYWludGV4dCAidXNlcjpwYXNzIiBpbiBvbmUgZ28gKi8KKwkJciA9IHN0cmNtcChjdXItPmFmdGVyX2NvbG9uLCB1c2VyX2FuZF9wYXNzd2QpOworIGVuZF9jaGVja19wYXNzd2Q6CisJCWlmIChyID09IDApIHsKKwkJCXJlbW90ZXVzZXIgPSB4c3RybmR1cCh1c2VyX2FuZF9wYXNzd2QsCisJCQkJc3RyY2hybnVsKHVzZXJfYW5kX3Bhc3N3ZCwgJzonKSAtIHVzZXJfYW5kX3Bhc3N3ZAorCQkJKTsKKwkJCXJldHVybiAxOyAvKiBPayAqLworCQl9CisJfSAvKiBmb3IgKi8KKworCS8qIDAoYmFkKSBpZiBwcmV2IGlzIHNldDogbWF0Y2hlcyB3ZXJlIGZvdW5kIGJ1dCBwYXNzd2Qgd2FzIHdyb25nICovCisJcmV0dXJuIChwcmV2ID09IE5VTEwpOworfQorI2VuZGlmICAvKiBGRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEggKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX1BST1hZCitzdGF0aWMgSHRhY2Nlc3NfUHJveHkgKmZpbmRfcHJveHlfZW50cnkoY29uc3QgY2hhciAqdXJsKQoreworCUh0YWNjZXNzX1Byb3h5ICpwOworCWZvciAocCA9IHByb3h5OyBwOyBwID0gcC0+bmV4dCkgeworCQlpZiAoaXNfcHJlZml4ZWRfd2l0aCh1cmwsIHAtPnVybF9mcm9tKSkKKwkJCXJldHVybiBwOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCisvKgorICogSGFuZGxlIHRpbWVvdXRzCisgKi8KK3N0YXRpYyB2b2lkIHNlbmRfUkVRVUVTVF9USU1FT1VUX2FuZF9leGl0KGludCBzaWcpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgc2VuZF9SRVFVRVNUX1RJTUVPVVRfYW5kX2V4aXQoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfUkVRVUVTVF9USU1FT1VUKTsKK30KKworLyoKKyAqIEhhbmRsZSBhbiBpbmNvbWluZyBodHRwIHJlcXVlc3QgYW5kIGV4aXQuCisgKi8KK3N0YXRpYyB2b2lkIGhhbmRsZV9pbmNvbWluZ19hbmRfZXhpdChjb25zdCBsZW5fYW5kX3NvY2thZGRyICpmcm9tQWRkcikgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBoYW5kbGVfaW5jb21pbmdfYW5kX2V4aXQoY29uc3QgbGVuX2FuZF9zb2NrYWRkciAqZnJvbUFkZHIpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgcmVxdWVzdF9HRVRbXSBBTElHTjEgPSAiR0VUIjsKKwlzdHJ1Y3Qgc3RhdCBzYjsKKwljaGFyICp1cmxjb3B5OworCWNoYXIgKnVybHA7CisJY2hhciAqdHB0cjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9DR0kKKwlzdGF0aWMgY29uc3QgY2hhciByZXF1ZXN0X0hFQURbXSBBTElHTjEgPSAiSEVBRCI7CisJY29uc3QgY2hhciAqcHJlcXVlc3Q7CisJY2hhciAqY29va2llID0gTlVMTDsKKwljaGFyICpjb250ZW50X3R5cGUgPSBOVUxMOworCXVuc2lnbmVkIGxvbmcgbGVuZ3RoID0gMDsKKyNlbGlmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX1BST1hZCisjZGVmaW5lIHByZXF1ZXN0IHJlcXVlc3RfR0VUCisJdW5zaWduZWQgbG9uZyBsZW5ndGggPSAwOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSAorCXNtYWxsaW50IGF1dGhvcml6ZWQgPSAtMTsKKyNlbmRpZgorCXNtYWxsaW50IGlwX2FsbG93ZWQ7CisJY2hhciBodHRwX21ham9yX3ZlcnNpb247CisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfUFJPWFkKKwljaGFyIGh0dHBfbWlub3JfdmVyc2lvbjsKKwljaGFyICpoZWFkZXJfYnVmID0gaGVhZGVyX2J1ZjsgLyogZm9yIGdjYyAqLworCWNoYXIgKmhlYWRlcl9wdHIgPSBoZWFkZXJfcHRyOworCUh0YWNjZXNzX1Byb3h5ICpwcm94eV9lbnRyeTsKKyNlbmRpZgorCisJLyogQWxsb2NhdGlvbiBvZiBpb2J1ZiBpcyBwb3N0cG9uZWQgdW50aWwgbm93CisJICogKElPVywgc2VydmVyIHByb2Nlc3MgZG9lc24ndCBuZWVkIHRvIHdhc3RlIDhrKSAqLworCWlvYnVmID0geG1hbGxvYyhJT0JVRl9TSVpFKTsKKworCXJtdF9pcCA9IDA7CisJaWYgKGZyb21BZGRyLT51LnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisJCXJtdF9pcCA9IG50b2hsKGZyb21BZGRyLT51LnNpbi5zaW5fYWRkci5zX2FkZHIpOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJaWYgKGZyb21BZGRyLT51LnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNgorCSAmJiBmcm9tQWRkci0+dS5zaW42LnNpbjZfYWRkci5zNl9hZGRyMzJbMF0gPT0gMAorCSAmJiBmcm9tQWRkci0+dS5zaW42LnNpbjZfYWRkci5zNl9hZGRyMzJbMV0gPT0gMAorCSAmJiBudG9obChmcm9tQWRkci0+dS5zaW42LnNpbjZfYWRkci5zNl9hZGRyMzJbMl0pID09IDB4ZmZmZikKKwkJcm10X2lwID0gbnRvaGwoZnJvbUFkZHItPnUuc2luNi5zaW42X2FkZHIuczZfYWRkcjMyWzNdKTsKKyNlbmRpZgorCWlmIChFTkFCTEVfRkVBVFVSRV9IVFRQRF9DR0kgfHwgREVCVUcgfHwgdmVyYm9zZSkgeworCQkvKiBOQjogY2FuIGJlIE5VTEwgKHVzZXIgcnVucyBodHRwZCAtaSBieSBoYW5kPykgKi8KKwkJcm10X2lwX3N0ciA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkKCZmcm9tQWRkci0+dS5zYSk7CisJfQorCWlmICh2ZXJib3NlKSB7CisJCS8qIHRoaXMgdHJpY2sgbWFrZXMgLXYgbG9nZ2luZyBtdWNoIHNpbXBsZXIgKi8KKwkJaWYgKHJtdF9pcF9zdHIpCisJCQlhcHBsZXRfbmFtZSA9IHJtdF9pcF9zdHI7CisJCWlmICh2ZXJib3NlID4gMikKKwkJCWJiX2Vycm9yX21zZygiY29ubmVjdGVkIik7CisJfQorCisJLyogSW5zdGFsbCB0aW1lb3V0IGhhbmRsZXIuIGdldF9saW5lKCkgbmVlZHMgaXQuICovCisJc2lnbmFsKFNJR0FMUk0sIHNlbmRfUkVRVUVTVF9USU1FT1VUX2FuZF9leGl0KTsKKworCWlmICghZ2V0X2xpbmUoKSkgLyogRU9GIG9yIGVycm9yIG9yIGVtcHR5IGxpbmUgKi8KKwkJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfQkFEX1JFUVVFU1QpOworCisJLyogRGV0ZXJtaW5lIHR5cGUgb2YgcmVxdWVzdCAoR0VUL1BPU1QpICovCisJLy8gcmZjMjYxNjogbWV0aG9kIGFuZCBVUkkgaXMgc2VwYXJhdGVkIGJ5IGV4YWN0bHkgb25lIHNwYWNlCisJLy91cmxwID0gc3RycGJyayhpb2J1ZiwgIiBcdCIpOyAtIG5vLCB0YWIgaXNuJ3QgYWxsb3dlZAorCXVybHAgPSBzdHJjaHIoaW9idWYsICcgJyk7CisJaWYgKHVybHAgPT0gTlVMTCkKKwkJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfQkFEX1JFUVVFU1QpOworCSp1cmxwKysgPSAnXDAnOworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0NHSQorCXByZXF1ZXN0ID0gcmVxdWVzdF9HRVQ7CisJaWYgKHN0cmNhc2VjbXAoaW9idWYsIHByZXF1ZXN0KSAhPSAwKSB7CisJCXByZXF1ZXN0ID0gcmVxdWVzdF9IRUFEOworCQlpZiAoc3RyY2FzZWNtcChpb2J1ZiwgcHJlcXVlc3QpICE9IDApIHsKKwkJCXByZXF1ZXN0ID0gIlBPU1QiOworCQkJaWYgKHN0cmNhc2VjbXAoaW9idWYsIHByZXF1ZXN0KSAhPSAwKQorCQkJCXNlbmRfaGVhZGVyc19hbmRfZXhpdChIVFRQX05PVF9JTVBMRU1FTlRFRCk7CisJCX0KKwl9CisjZWxzZQorCWlmIChzdHJjYXNlY21wKGlvYnVmLCByZXF1ZXN0X0dFVCkgIT0gMCkKKwkJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfTk9UX0lNUExFTUVOVEVEKTsKKyNlbmRpZgorCS8vIHJmYzI2MTY6IG1ldGhvZCBhbmQgVVJJIGlzIHNlcGFyYXRlZCBieSBleGFjdGx5IG9uZSBzcGFjZQorCS8vdXJscCA9IHNraXBfd2hpdGVzcGFjZSh1cmxwKTsgLSBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeQorCWlmICh1cmxwWzBdICE9ICcvJykKKwkJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfQkFEX1JFUVVFU1QpOworCisJLyogRmluZCBlbmQgb2YgVVJMIGFuZCBwYXJzZSBIVFRQIHZlcnNpb24sIGlmIGFueSAqLworCWh0dHBfbWFqb3JfdmVyc2lvbiA9ICcwJzsKKwlJRl9GRUFUVVJFX0hUVFBEX1BST1hZKGh0dHBfbWlub3JfdmVyc2lvbiA9ICcwJzspCisJdHB0ciA9IHN0cmNocm51bCh1cmxwLCAnICcpOworCS8qIElzIGl0ICIgSFRUUC8iPyAqLworCWlmICh0cHRyWzBdICYmIHN0cm5jbXAodHB0ciArIDEsIEhUVFBfMjAwLCA1KSA9PSAwKSB7CisJCWh0dHBfbWFqb3JfdmVyc2lvbiA9IHRwdHJbNl07CisJCUlGX0ZFQVRVUkVfSFRUUERfUFJPWFkoaHR0cF9taW5vcl92ZXJzaW9uID0gdHB0cls4XTspCisJfQorCSp0cHRyID0gJ1wwJzsKKworCS8qIENvcHkgVVJMIGZyb20gYWZ0ZXIgIkdFVCAiLyJQT1NUICIgdG8gc3RhY2stYWxsb2NhdGVkIGNoYXJbXSAqLworCXVybGNvcHkgPSBhbGxvY2EoKHRwdHIgLSB1cmxwKSArIDIgKyBzdHJsZW4oaW5kZXhfcGFnZSkpOworCS8qaWYgKHVybGNvcHkgPT0gTlVMTCkKKwkgKglzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOyovCisJc3RyY3B5KHVybGNvcHksIHVybHApOworCS8qIE5COiB1cmxjb3B5IHB0ciBpcyBuZXZlciBjaGFuZ2VkIGFmdGVyIHRoaXMgKi8KKworCS8qIEV4dHJhY3QgdXJsIGFyZ3MgaWYgcHJlc2VudCAqLworCS8qIGdfcXVlcnkgPSBOVUxMOyAtIGFscmVhZHkgaXMgKi8KKwl0cHRyID0gc3RyY2hyKHVybGNvcHksICc/Jyk7CisJaWYgKHRwdHIpIHsKKwkJKnRwdHIrKyA9ICdcMCc7CisJCWdfcXVlcnkgPSB0cHRyOworCX0KKworCS8qIERlY29kZSBVUkwgZXNjYXBlIHNlcXVlbmNlcyAqLworCXRwdHIgPSBwZXJjZW50X2RlY29kZV9pbl9wbGFjZSh1cmxjb3B5LCAvKnN0cmljdDoqLyAxKTsKKwlpZiAodHB0ciA9PSBOVUxMKQorCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9CQURfUkVRVUVTVCk7CisJaWYgKHRwdHIgPT0gdXJsY29weSArIDEpIHsKKwkJLyogJy8nIG9yIE5VTCBpcyBlbmNvZGVkICovCisJCXNlbmRfaGVhZGVyc19hbmRfZXhpdChIVFRQX05PVF9GT1VORCk7CisJfQorCisJLyogQ2Fub25pY2FsaXplIHBhdGggKi8KKwkvKiBBbGdvcml0aG0gc3RvbGVuIGZyb20gbGliYmIgYmJfc2ltcGxpZnlfcGF0aCgpLAorCSAqIGJ1dCBkb24ndCBzdHJkdXAsIHJldGFpbiB0cmFpbGluZyBzbGFzaCwgcHJvdGVjdCByb290ICovCisJdXJscCA9IHRwdHIgPSB1cmxjb3B5OworCWZvciAoOzspIHsKKwkJaWYgKCp1cmxwID09ICcvJykgeworCQkJLyogc2tpcCBkdXBsaWNhdGUgKG9yIGluaXRpYWwpIHNsYXNoICovCisJCQlpZiAoKnRwdHIgPT0gJy8nKSB7CisJCQkJZ290byBuZXh0X2NoYXI7CisJCQl9CisJCQlpZiAoKnRwdHIgPT0gJy4nKSB7CisJCQkJaWYgKHRwdHJbMV0gPT0gJy4nICYmICh0cHRyWzJdID09ICcvJyB8fCB0cHRyWzJdID09ICdcMCcpKSB7CisJCQkJCS8qICIuLiI6IGJlIGNhcmVmdWwgKi8KKwkJCQkJLyogcHJvdGVjdCByb290ICovCisJCQkJCWlmICh1cmxwID09IHVybGNvcHkpCisJCQkJCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9CQURfUkVRVUVTVCk7CisJCQkJCS8qIG9taXQgcHJldmlvdXMgZGlyICovCisJCQkJCXdoaWxlICgqLS11cmxwICE9ICcvJykKKwkJCQkJCWNvbnRpbnVlOworCQkJCQkvKiBza2lwIHRvICIuLyIgb3IgIi48TlVMPiIgKi8KKwkJCQkJdHB0cisrOworCQkJCX0KKwkJCQlpZiAodHB0clsxXSA9PSAnLycgfHwgdHB0clsxXSA9PSAnXDAnKSB7CisJCQkJCS8qIHNraXAgZXh0cmEgIi8uLyIgKi8KKwkJCQkJZ290byBuZXh0X2NoYXI7CisJCQkJfQorCQkJfQorCQl9CisJCSorK3VybHAgPSAqdHB0cjsKKwkJaWYgKCp1cmxwID09ICdcMCcpCisJCQlicmVhazsKKyBuZXh0X2NoYXI6CisJCXRwdHIrKzsKKwl9CisKKwkvKiBJZiBVUkwgaXMgYSBkaXJlY3RvcnksIGFkZCAnLycgKi8KKwlpZiAodXJscFstMV0gIT0gJy8nKSB7CisJCWlmIChpc19kaXJlY3RvcnkodXJsY29weSArIDEsIC8qZm9sbG93bGlua3M6Ki8gMSkpIHsKKwkJCWZvdW5kX21vdmVkX3RlbXBvcmFyaWx5ID0gdXJsY29weTsKKwkJfQorCX0KKworCS8qIExvZyBpdCAqLworCWlmICh2ZXJib3NlID4gMSkKKwkJYmJfZXJyb3JfbXNnKCJ1cmw6JXMiLCB1cmxjb3B5KTsKKworCXRwdHIgPSB1cmxjb3B5OworCWlwX2FsbG93ZWQgPSBjaGVja1Blcm1JUCgpOworCXdoaWxlIChpcF9hbGxvd2VkICYmICh0cHRyID0gc3RyY2hyKHRwdHIgKyAxLCAnLycpKSAhPSBOVUxMKSB7CisJCS8qIGhhdmUgcGF0aDEvcGF0aDIgKi8KKwkJKnRwdHIgPSAnXDAnOworCQlpZiAoaXNfZGlyZWN0b3J5KHVybGNvcHkgKyAxLCAvKmZvbGxvd2xpbmtzOiovIDEpKSB7CisJCQkvKiBtYXkgaGF2ZSBzdWJkaXIgY29uZmlnICovCisJCQlwYXJzZV9jb25mKHVybGNvcHkgKyAxLCBTVUJESVJfUEFSU0UpOworCQkJaXBfYWxsb3dlZCA9IGNoZWNrUGVybUlQKCk7CisJCX0KKwkJKnRwdHIgPSAnLyc7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfUFJPWFkKKwlwcm94eV9lbnRyeSA9IGZpbmRfcHJveHlfZW50cnkodXJsY29weSk7CisJaWYgKHByb3h5X2VudHJ5KQorCQloZWFkZXJfYnVmID0gaGVhZGVyX3B0ciA9IHhtYWxsb2MoSU9CVUZfU0laRSk7CisjZW5kaWYKKworCWlmIChodHRwX21ham9yX3ZlcnNpb24gPj0gJzAnKSB7CisJCS8qIFJlcXVlc3Qgd2FzIHdpdGggIi4uLiBIVFRQL25YWFgiLCBhbmQgbiA+PSAwICovCisKKwkJLyogUmVhZCB1bnRpbCBibGFuayBsaW5lICovCisJCXdoaWxlICgxKSB7CisJCQlpZiAoIWdldF9saW5lKCkpCisJCQkJYnJlYWs7IC8qIEVPRiBvciBlcnJvciBvciBlbXB0eSBsaW5lICovCisJCQlpZiAoREVCVUcpCisJCQkJYmJfZXJyb3JfbXNnKCJoZWFkZXI6ICclcyciLCBpb2J1Zik7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9QUk9YWQorCQkJLyogV2UgbmVlZCAyIG1vcmUgYnl0ZXMgZm9yIHlldCBhbm90aGVyICJcclxuIiAtCisJCQkgKiBzZWUgbmVhciBmZHByaW50Zihwcm94eV9mZC4uLikgZnVydGhlciBiZWxvdyAqLworCQkJaWYgKHByb3h5X2VudHJ5ICYmIChoZWFkZXJfcHRyIC0gaGVhZGVyX2J1ZikgPCBJT0JVRl9TSVpFIC0gMikgeworCQkJCWludCBsZW4gPSBzdHJsZW4oaW9idWYpOworCQkJCWlmIChsZW4gPiBJT0JVRl9TSVpFIC0gKGhlYWRlcl9wdHIgLSBoZWFkZXJfYnVmKSAtIDQpCisJCQkJCWxlbiA9IElPQlVGX1NJWkUgLSAoaGVhZGVyX3B0ciAtIGhlYWRlcl9idWYpIC0gNDsKKwkJCQltZW1jcHkoaGVhZGVyX3B0ciwgaW9idWYsIGxlbik7CisJCQkJaGVhZGVyX3B0ciArPSBsZW47CisJCQkJaGVhZGVyX3B0clswXSA9ICdccic7CisJCQkJaGVhZGVyX3B0clsxXSA9ICdcbic7CisJCQkJaGVhZGVyX3B0ciArPSAyOworCQkJfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9DR0kgfHwgRU5BQkxFX0ZFQVRVUkVfSFRUUERfUFJPWFkKKwkJCS8qIFRyeSBhbmQgZG8gb3VyIGJlc3QgdG8gcGFyc2UgbW9yZSBsaW5lcyAqLworCQkJaWYgKChTVFJOQ0FTRUNNUChpb2J1ZiwgIkNvbnRlbnQtbGVuZ3RoOiIpID09IDApKSB7CisJCQkJLyogZXh0cmEgcmVhZCBvbmx5IGZvciBQT1NUICovCisJCQkJaWYgKHByZXF1ZXN0ICE9IHJlcXVlc3RfR0VUCisjIGlmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0NHSQorCQkJCSAmJiBwcmVxdWVzdCAhPSByZXF1ZXN0X0hFQUQKKyMgZW5kaWYKKwkJCQkpIHsKKwkJCQkJdHB0ciA9IHNraXBfd2hpdGVzcGFjZShpb2J1ZiArIHNpemVvZigiQ29udGVudC1sZW5ndGg6IikgLSAxKTsKKwkJCQkJaWYgKCF0cHRyWzBdKQorCQkJCQkJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfQkFEX1JFUVVFU1QpOworCQkJCQkvKiBub3QgdXNpbmcgc3RydG91bDogaXQgaWdub3JlcyBsZWFkaW5nIG1pbnVzISAqLworCQkJCQlsZW5ndGggPSBiYl9zdHJ0b3UodHB0ciwgTlVMTCwgMTApOworCQkJCQkvKiBsZW5ndGggaXMgInVsb25nIiwgYnV0IHdlIG5lZWQgdG8gcGFzcyBpdCB0byBpbnQgbGF0ZXIgKi8KKwkJCQkJaWYgKGVycm5vIHx8IGxlbmd0aCA+IElOVF9NQVgpCisJCQkJCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9CQURfUkVRVUVTVCk7CisJCQkJfQorCQkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQ0dJCisJCQllbHNlIGlmIChTVFJOQ0FTRUNNUChpb2J1ZiwgIkNvb2tpZToiKSA9PSAwKSB7CisJCQkJY29va2llID0geHN0cmR1cChza2lwX3doaXRlc3BhY2UoaW9idWYgKyBzaXplb2YoIkNvb2tpZToiKS0xKSk7CisJCQl9IGVsc2UgaWYgKFNUUk5DQVNFQ01QKGlvYnVmLCAiQ29udGVudC1UeXBlOiIpID09IDApIHsKKwkJCQljb250ZW50X3R5cGUgPSB4c3RyZHVwKHNraXBfd2hpdGVzcGFjZShpb2J1ZiArIHNpemVvZigiQ29udGVudC1UeXBlOiIpLTEpKTsKKwkJCX0gZWxzZSBpZiAoU1RSTkNBU0VDTVAoaW9idWYsICJSZWZlcmVyOiIpID09IDApIHsKKwkJCQlyZWZlcmVyID0geHN0cmR1cChza2lwX3doaXRlc3BhY2UoaW9idWYgKyBzaXplb2YoIlJlZmVyZXI6IiktMSkpOworCQkJfSBlbHNlIGlmIChTVFJOQ0FTRUNNUChpb2J1ZiwgIlVzZXItQWdlbnQ6IikgPT0gMCkgeworCQkJCXVzZXJfYWdlbnQgPSB4c3RyZHVwKHNraXBfd2hpdGVzcGFjZShpb2J1ZiArIHNpemVvZigiVXNlci1BZ2VudDoiKS0xKSk7CisJCQl9IGVsc2UgaWYgKFNUUk5DQVNFQ01QKGlvYnVmLCAiSG9zdDoiKSA9PSAwKSB7CisJCQkJaG9zdCA9IHhzdHJkdXAoc2tpcF93aGl0ZXNwYWNlKGlvYnVmICsgc2l6ZW9mKCJIb3N0OiIpLTEpKTsKKwkJCX0gZWxzZSBpZiAoU1RSTkNBU0VDTVAoaW9idWYsICJBY2NlcHQ6IikgPT0gMCkgeworCQkJCWh0dHBfYWNjZXB0ID0geHN0cmR1cChza2lwX3doaXRlc3BhY2UoaW9idWYgKyBzaXplb2YoIkFjY2VwdDoiKS0xKSk7CisJCQl9IGVsc2UgaWYgKFNUUk5DQVNFQ01QKGlvYnVmLCAiQWNjZXB0LUxhbmd1YWdlOiIpID09IDApIHsKKwkJCQlodHRwX2FjY2VwdF9sYW5ndWFnZSA9IHhzdHJkdXAoc2tpcF93aGl0ZXNwYWNlKGlvYnVmICsgc2l6ZW9mKCJBY2NlcHQtTGFuZ3VhZ2U6IiktMSkpOworCQkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSAorCQkJaWYgKFNUUk5DQVNFQ01QKGlvYnVmLCAiQXV0aG9yaXphdGlvbjoiKSA9PSAwKSB7CisJCQkJLyogV2Ugb25seSBhbGxvdyBCYXNpYyBjcmVkZW50aWFscy4KKwkJCQkgKiBJdCBzaG93cyB1cCBhcyAiQXV0aG9yaXphdGlvbjogQmFzaWMgPHVzZXI+OjxwYXNzd2Q+IiB3aGVyZQorCQkJCSAqICI8dXNlcj46PHBhc3N3ZD4iIGlzIGJhc2U2NCBlbmNvZGVkLgorCQkJCSAqLworCQkJCXRwdHIgPSBza2lwX3doaXRlc3BhY2UoaW9idWYgKyBzaXplb2YoIkF1dGhvcml6YXRpb246IiktMSk7CisJCQkJaWYgKFNUUk5DQVNFQ01QKHRwdHIsICJCYXNpYyIpICE9IDApCisJCQkJCWNvbnRpbnVlOworCQkJCXRwdHIgKz0gc2l6ZW9mKCJCYXNpYyIpLTE7CisJCQkJLyogZGVjb2RlQmFzZTY0KCkgc2tpcHMgd2hpdGVzcGFjZSBpdHNlbGYgKi8KKwkJCQlkZWNvZGVCYXNlNjQodHB0cik7CisJCQkJYXV0aG9yaXplZCA9IGNoZWNrX3VzZXJfcGFzc3dkKHVybGNvcHksIHRwdHIpOworCQkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfUkFOR0VTCisJCQlpZiAoU1RSTkNBU0VDTVAoaW9idWYsICJSYW5nZToiKSA9PSAwKSB7CisJCQkJLyogV2Uga25vdyBvbmx5IGJ5dGVzPU5OTi1bTU1NXSAqLworCQkJCWNoYXIgKnMgPSBza2lwX3doaXRlc3BhY2UoaW9idWYgKyBzaXplb2YoIlJhbmdlOiIpLTEpOworCQkJCWlmIChpc19wcmVmaXhlZF93aXRoKHMsICJieXRlcz0iKSA9PSAwKSB7CisJCQkJCXMgKz0gc2l6ZW9mKCJieXRlcz0iKS0xOworCQkJCQlyYW5nZV9zdGFydCA9IEJCX1NUUlRPT0ZGKHMsICZzLCAxMCk7CisJCQkJCWlmIChzWzBdICE9ICctJyB8fCByYW5nZV9zdGFydCA8IDApIHsKKwkJCQkJCXJhbmdlX3N0YXJ0ID0gLTE7CisJCQkJCX0gZWxzZSBpZiAoc1sxXSkgeworCQkJCQkJcmFuZ2VfZW5kID0gQkJfU1RSVE9PRkYocysxLCBOVUxMLCAxMCk7CisJCQkJCQlpZiAoZXJybm8gfHwgcmFuZ2VfZW5kIDwgcmFuZ2Vfc3RhcnQpCisJCQkJCQkJcmFuZ2Vfc3RhcnQgPSAtMTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0daSVAKKwkJCWlmIChTVFJOQ0FTRUNNUChpb2J1ZiwgIkFjY2VwdC1FbmNvZGluZzoiKSA9PSAwKSB7CisJCQkJLyogTm90ZTogd2UgZG8gbm90IHN1cHBvcnQgImd6aXA7cT0wIgorCQkJCSAqIG1ldGhvZCBvZiBfZGlzYWJsaW5nXyBnemlwCisJCQkJICogZGVsaXZlcnkuIE5vIG9uZSB1c2VzIHRoYXQsIHRob3VnaCAqLworCQkJCWNvbnN0IGNoYXIgKnMgPSBzdHJzdHIoaW9idWYsICJnemlwIik7CisJCQkJaWYgKHMpIHsKKwkJCQkJLy8gd2FudCBtb3JlIHRob3JvdWdoIGNoZWNrcz8KKwkJCQkJLy9pZiAoc1stMV0gPT0gJyAnCisJCQkJCS8vIHx8IHNbLTFdID09ICcsJworCQkJCQkvLyB8fCBzWy0xXSA9PSAnOicKKwkJCQkJLy8pIHsKKwkJCQkJCWNvbnRlbnRfZ3ppcCA9IDE7CisJCQkJCS8vfQorCQkJCX0KKwkJCX0KKyNlbmRpZgorCQl9IC8qIHdoaWxlIGV4dHJhIGhlYWRlciByZWFkaW5nICovCisJfQorCisJLyogV2UgYXJlIGRvbmUgcmVhZGluZyBoZWFkZXJzLCBkaXNhYmxlIHBlZXIgdGltZW91dCAqLworCWFsYXJtKDApOworCisJaWYgKHN0cmNtcChiYl9iYXNlbmFtZSh1cmxjb3B5KSwgSFRUUERfQ09ORikgPT0gMCB8fCAhaXBfYWxsb3dlZCkgeworCQkvKiBwcm90ZWN0IGxpc3RpbmcgWy9wYXRoXS9odHRwZC5jb25mIG9yIElQIGRlbnkgKi8KKwkJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfRk9SQklEREVOKTsKKwl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRICisJLyogQ2FzZTogbm8gIkF1dGhvcml6YXRpb246IiB3YXMgc2VlbiwgYnV0IHBhZ2UgbWlnaHQgcmVxdWlyZSBwYXNzd2QuCisJICogQ2hlY2sgdGhhdCB3aXRoIGR1bW15IHVzZXI6cGFzcyAqLworCWlmIChhdXRob3JpemVkIDwgMCkKKwkJYXV0aG9yaXplZCA9IGNoZWNrX3VzZXJfcGFzc3dkKHVybGNvcHksIChjaGFyICopICIiKTsKKwlpZiAoIWF1dGhvcml6ZWQpCisJCXNlbmRfaGVhZGVyc19hbmRfZXhpdChIVFRQX1VOQVVUSE9SSVpFRCk7CisjZW5kaWYKKworCWlmIChmb3VuZF9tb3ZlZF90ZW1wb3JhcmlseSkgeworCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9NT1ZFRF9URU1QT1JBUklMWSk7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfUFJPWFkKKwlpZiAocHJveHlfZW50cnkgIT0gTlVMTCkgeworCQlpbnQgcHJveHlfZmQ7CisJCWxlbl9hbmRfc29ja2FkZHIgKmxzYTsKKworCQlwcm94eV9mZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisJCWlmIChwcm94eV9mZCA8IDApCisJCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworCQlsc2EgPSBob3N0MnNvY2thZGRyKHByb3h5X2VudHJ5LT5ob3N0X3BvcnQsIDgwKTsKKwkJaWYgKGxzYSA9PSBOVUxMKQorCQkJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfSU5URVJOQUxfU0VSVkVSX0VSUk9SKTsKKwkJaWYgKGNvbm5lY3QocHJveHlfZmQsICZsc2EtPnUuc2EsIGxzYS0+bGVuKSA8IDApCisJCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworCQlmZHByaW50Zihwcm94eV9mZCwgIiVzICVzJXMlcyVzIEhUVFAvJWMuJWNcclxuIiwKKwkJCQlwcmVxdWVzdCwgLyogR0VUIG9yIFBPU1QgKi8KKwkJCQlwcm94eV9lbnRyeS0+dXJsX3RvLCAvKiB1cmwgcGFydCAxICovCisJCQkJdXJsY29weSArIHN0cmxlbihwcm94eV9lbnRyeS0+dXJsX2Zyb20pLCAvKiB1cmwgcGFydCAyICovCisJCQkJKGdfcXVlcnkgPyAiPyIgOiAiIiksIC8qICI/IiAobWF5YmUpICovCisJCQkJKGdfcXVlcnkgPyBnX3F1ZXJ5IDogIiIpLCAvKiBxdWVyeSBzdHJpbmcgKG1heWJlKSAqLworCQkJCWh0dHBfbWFqb3JfdmVyc2lvbiwgaHR0cF9taW5vcl92ZXJzaW9uKTsKKwkJaGVhZGVyX3B0clswXSA9ICdccic7CisJCWhlYWRlcl9wdHJbMV0gPSAnXG4nOworCQloZWFkZXJfcHRyICs9IDI7CisJCXdyaXRlKHByb3h5X2ZkLCBoZWFkZXJfYnVmLCBoZWFkZXJfcHRyIC0gaGVhZGVyX2J1Zik7CisJCWZyZWUoaGVhZGVyX2J1Zik7IC8qIG9uIHRoZSBvcmRlciBvZiA4aywgZnJlZSBpdCAqLworCQljZ2lfaW9fbG9vcF9hbmRfZXhpdChwcm94eV9mZCwgcHJveHlfZmQsIGxlbmd0aCk7CisJfQorI2VuZGlmCisKKwl0cHRyID0gdXJsY29weSArIDE7ICAgICAgLyogc2tpcCBmaXJzdCAnLycgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0NHSQorCWlmIChpc19wcmVmaXhlZF93aXRoKHRwdHIsICJjZ2ktYmluLyIpKSB7CisJCWlmICh0cHRyWzhdID09ICdcMCcpIHsKKwkJCS8qIHByb3RlY3QgbGlzdGluZyAiY2dpLWJpbi8iICovCisJCQlzZW5kX2hlYWRlcnNfYW5kX2V4aXQoSFRUUF9GT1JCSURERU4pOworCQl9CisJCXNlbmRfY2dpX2FuZF9leGl0KHVybGNvcHksIHVybGNvcHksIHByZXF1ZXN0LCBsZW5ndGgsIGNvb2tpZSwgY29udGVudF90eXBlKTsKKwl9CisjZW5kaWYKKworCWlmICh1cmxwWy0xXSA9PSAnLycpIHsKKwkJLyogV2hlbiBpbmRleF9wYWdlIHN0cmluZyBpcyBhcHBlbmRlZCB0byA8ZGlyPi8gVVJMLCBpdCBvdmVyd3JpdGVzCisJCSAqIHRoZSBxdWVyeSBzdHJpbmcuIElmIHdlIGZhbGwgYmFjayB0byBjYWxsIC9jZ2ktYmluL2luZGV4LmNnaSwKKwkJICogcXVlcnkgc3RyaW5nIHdvdWxkIGJlIGxvc3QgYW5kIG5vdCBhdmFpbGFibGUgdG8gdGhlIENHSS4KKwkJICogV29yayBhcm91bmQgaXQgYnkgbWFraW5nIGEgZGVlcCBjb3B5LgorCQkgKi8KKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0hUVFBEX0NHSSkKKwkJCWdfcXVlcnkgPSB4c3RyZHVwKGdfcXVlcnkpOyAvKiBvayBmb3IgTlVMTCB0b28gKi8KKwkJc3RyY3B5KHVybHAsIGluZGV4X3BhZ2UpOworCX0KKwlpZiAoc3RhdCh0cHRyLCAmc2IpID09IDApIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9DT05GSUdfV0lUSF9TQ1JJUFRfSU5URVJQUgorCQljaGFyICpzdWZmaXggPSBzdHJyY2hyKHRwdHIsICcuJyk7CisJCWlmIChzdWZmaXgpIHsKKwkJCUh0YWNjZXNzICpjdXI7CisJCQlmb3IgKGN1ciA9IHNjcmlwdF9pOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkgeworCQkJCWlmIChzdHJjbXAoY3VyLT5iZWZvcmVfY29sb24gKyAxLCBzdWZmaXgpID09IDApIHsKKwkJCQkJc2VuZF9jZ2lfYW5kX2V4aXQodXJsY29weSwgdXJsY29weSwgcHJlcXVlc3QsIGxlbmd0aCwgY29va2llLCBjb250ZW50X3R5cGUpOworCQkJCX0KKwkJCX0KKwkJfQorI2VuZGlmCisJCWZpbGVfc2l6ZSA9IHNiLnN0X3NpemU7CisJCWxhc3RfbW9kID0gc2Iuc3RfbXRpbWU7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX0hUVFBEX0NHSQorCWVsc2UgaWYgKHVybHBbLTFdID09ICcvJykgeworCQkvKiBJdCdzIGEgZGlyIFVSTCBhbmQgdGhlcmUgaXMgbm8gaW5kZXguaHRtbAorCQkgKiBUcnkgY2dpLWJpbi9pbmRleC5jZ2kgKi8KKwkJaWYgKGFjY2VzcygiL2NnaS1iaW4vaW5kZXguY2dpIisxLCBYX09LKSA9PSAwKSB7CisJCQl1cmxwWzBdID0gJ1wwJzsgLyogcmVtb3ZlIGluZGV4X3BhZ2UgKi8KKwkJCXNlbmRfY2dpX2FuZF9leGl0KCIvY2dpLWJpbi9pbmRleC5jZ2kiLCB1cmxjb3B5LCBwcmVxdWVzdCwgbGVuZ3RoLCBjb29raWUsIGNvbnRlbnRfdHlwZSk7CisJCX0KKwl9CisJLyogZWxzZSBmYWxsIHRocm91Z2ggdG8gc2VuZF9maWxlLCBpdCBlcnJvcnMgb3V0IGlmIG9wZW4gZmFpbHM6ICovCisKKwlpZiAocHJlcXVlc3QgIT0gcmVxdWVzdF9HRVQgJiYgcHJlcXVlc3QgIT0gcmVxdWVzdF9IRUFEKSB7CisJCS8qIFBPU1QgZm9yIGZpbGVzIGRvZXMgbm90IG1ha2Ugc2Vuc2UgKi8KKwkJc2VuZF9oZWFkZXJzX2FuZF9leGl0KEhUVFBfTk9UX0lNUExFTUVOVEVEKTsKKwl9CisJc2VuZF9maWxlX2FuZF9leGl0KHRwdHIsCisJCShwcmVxdWVzdCAhPSByZXF1ZXN0X0hFQUQgPyBTRU5EX0hFQURFUlNfQU5EX0JPRFkgOiBTRU5EX0hFQURFUlMpCisJKTsKKyNlbHNlCisJc2VuZF9maWxlX2FuZF9leGl0KHRwdHIsIFNFTkRfSEVBREVSU19BTkRfQk9EWSk7CisjZW5kaWYKK30KKworLyoKKyAqIFRoZSBtYWluIGh0dHAgc2VydmVyIGZ1bmN0aW9uLgorICogR2l2ZW4gYSBzb2NrZXQsIGxpc3RlbiBmb3IgbmV3IGNvbm5lY3Rpb25zIGFuZCBmYXJtIG91dAorICogdGhlIHByb2Nlc3NpbmcgYXMgYSBbdl1mb3JrZWQgcHJvY2Vzcy4KKyAqIE5ldmVyIHJldHVybnMuCisgKi8KKyNpZiBCQl9NTVUKK3N0YXRpYyB2b2lkIG1pbmlfaHR0cGQoaW50IHNlcnZlcl9zb2NrZXQpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgbWluaV9odHRwZChpbnQgc2VydmVyX3NvY2tldCkKK3sKKwkvKiBOQjogaXQncyBiZXN0IHRvIG5vdCB1c2UgeGZ1bmNzIGluIHRoaXMgbG9vcCBiZWZvcmUgZm9yaygpLgorCSAqIE90aGVyd2lzZSBzZXJ2ZXIgbWF5IGRpZSBvbiB0cmFuc2llbnQgZXJyb3JzICh0ZW1wb3JhcnkKKwkgKiBvdXQtb2YtbWVtb3J5IGNvbmRpdGlvbiwgZXRjKSwgd2hpY2ggaXMgQmFkKHRtKS4KKwkgKiBUcnkgdG8gZG8gYW55IGRhbmdlcm91cyBjYWxscyBhZnRlciBmb3JrLgorCSAqLworCXdoaWxlICgxKSB7CisJCWludCBuOworCQlsZW5fYW5kX3NvY2thZGRyIGZyb21BZGRyOworCisJCS8qIFdhaXQgZm9yIGNvbm5lY3Rpb25zLi4uICovCisJCWZyb21BZGRyLmxlbiA9IExTQV9TSVpFT0ZfU0E7CisJCW4gPSBhY2NlcHQoc2VydmVyX3NvY2tldCwgJmZyb21BZGRyLnUuc2EsICZmcm9tQWRkci5sZW4pOworCQlpZiAobiA8IDApCisJCQljb250aW51ZTsKKworCQkvKiBzZXQgdGhlIEtFRVBBTElWRSBvcHRpb24gdG8gY3VsbCBkZWFkIGNvbm5lY3Rpb25zICovCisJCXNldHNvY2tvcHRfa2VlcGFsaXZlKG4pOworCisJCWlmIChmb3JrKCkgPT0gMCkgeworCQkJLyogY2hpbGQgKi8KKwkJCS8qIERvIG5vdCByZWxvYWQgY29uZmlnIG9uIEhVUCAqLworCQkJc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7CisJCQljbG9zZShzZXJ2ZXJfc29ja2V0KTsKKwkJCXhtb3ZlX2ZkKG4sIDApOworCQkJeGR1cDIoMCwgMSk7CisKKwkJCWhhbmRsZV9pbmNvbWluZ19hbmRfZXhpdCgmZnJvbUFkZHIpOworCQl9CisJCS8qIHBhcmVudCwgb3IgZm9yayBmYWlsZWQgKi8KKwkJY2xvc2Uobik7CisJfSAvKiB3aGlsZSAoMSkgKi8KKwkvKiBuZXZlciByZWFjaGVkICovCit9CisjZWxzZQorc3RhdGljIHZvaWQgbWluaV9odHRwZF9ub21tdShpbnQgc2VydmVyX3NvY2tldCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIG1pbmlfaHR0cGRfbm9tbXUoaW50IHNlcnZlcl9zb2NrZXQsIGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICphcmd2X2NvcHlbYXJnYyArIDJdOworCisJYXJndl9jb3B5WzBdID0gYXJndlswXTsKKwlhcmd2X2NvcHlbMV0gPSAoY2hhciopIi1pIjsKKwltZW1jcHkoJmFyZ3ZfY29weVsyXSwgJmFyZ3ZbMV0sIGFyZ2MgKiBzaXplb2YoYXJndlswXSkpOworCisJLyogTkI6IGl0J3MgYmVzdCB0byBub3QgdXNlIHhmdW5jcyBpbiB0aGlzIGxvb3AgYmVmb3JlIHZmb3JrKCkuCisJICogT3RoZXJ3aXNlIHNlcnZlciBtYXkgZGllIG9uIHRyYW5zaWVudCBlcnJvcnMgKHRlbXBvcmFyeQorCSAqIG91dC1vZi1tZW1vcnkgY29uZGl0aW9uLCBldGMpLCB3aGljaCBpcyBCYWQodG0pLgorCSAqIFRyeSB0byBkbyBhbnkgZGFuZ2Vyb3VzIGNhbGxzIGFmdGVyIGZvcmsuCisJICovCisJd2hpbGUgKDEpIHsKKwkJaW50IG47CisJCWxlbl9hbmRfc29ja2FkZHIgZnJvbUFkZHI7CisKKwkJLyogV2FpdCBmb3IgY29ubmVjdGlvbnMuLi4gKi8KKwkJZnJvbUFkZHIubGVuID0gTFNBX1NJWkVPRl9TQTsKKwkJbiA9IGFjY2VwdChzZXJ2ZXJfc29ja2V0LCAmZnJvbUFkZHIudS5zYSwgJmZyb21BZGRyLmxlbik7CisJCWlmIChuIDwgMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIHNldCB0aGUgS0VFUEFMSVZFIG9wdGlvbiB0byBjdWxsIGRlYWQgY29ubmVjdGlvbnMgKi8KKwkJc2V0c29ja29wdF9rZWVwYWxpdmUobik7CisKKwkJaWYgKHZmb3JrKCkgPT0gMCkgeworCQkJLyogY2hpbGQgKi8KKwkJCS8qIERvIG5vdCByZWxvYWQgY29uZmlnIG9uIEhVUCAqLworCQkJc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7CisJCQljbG9zZShzZXJ2ZXJfc29ja2V0KTsKKwkJCXhtb3ZlX2ZkKG4sIDApOworCQkJeGR1cDIoMCwgMSk7CisKKwkJCS8qIFJ1biBhIGNvcHkgb2Ygb3Vyc2VsZiBpbiBpbmV0ZCBtb2RlICovCisJCQlyZV9leGVjKGFyZ3ZfY29weSk7CisJCX0KKwkJYXJndl9jb3B5WzBdWzBdICY9IDB4N2Y7CisJCS8qIHBhcmVudCwgb3IgdmZvcmsgZmFpbGVkICovCisJCWNsb3NlKG4pOworCX0gLyogd2hpbGUgKDEpICovCisJLyogbmV2ZXIgcmVhY2hlZCAqLworfQorI2VuZGlmCisKKy8qCisgKiBQcm9jZXNzIGEgSFRUUCBjb25uZWN0aW9uIG9uIHN0ZGluL291dC4KKyAqIE5ldmVyIHJldHVybnMuCisgKi8KK3N0YXRpYyB2b2lkIG1pbmlfaHR0cGRfaW5ldGQodm9pZCkgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBtaW5pX2h0dHBkX2luZXRkKHZvaWQpCit7CisJbGVuX2FuZF9zb2NrYWRkciBmcm9tQWRkcjsKKworCW1lbXNldCgmZnJvbUFkZHIsIDAsIHNpemVvZihmcm9tQWRkcikpOworCWZyb21BZGRyLmxlbiA9IExTQV9TSVpFT0ZfU0E7CisJLyogTkI6IGNhbiBmYWlsIGlmIHVzZXIgcnVucyBpdCBieSBoYW5kIGFuZCB0eXBlcyBpbiBodHRwIGNtZHMgKi8KKwlnZXRwZWVybmFtZSgwLCAmZnJvbUFkZHIudS5zYSwgJmZyb21BZGRyLmxlbik7CisJaGFuZGxlX2luY29taW5nX2FuZF9leGl0KCZmcm9tQWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ2h1cF9oYW5kbGVyKGludCBzaWcgVU5VU0VEX1BBUkFNKQoreworCXBhcnNlX2NvbmYoREVGQVVMVF9QQVRIX0hUVFBEX0NPTkYsIFNJR05BTEVEX1BBUlNFKTsKK30KKworZW51bSB7CisJY19vcHRfY29uZmlnX2ZpbGUgPSAwLAorCWRfb3B0X2RlY29kZV91cmwsCisJaF9vcHRfaG9tZV9odHRwZCwKKwlJRl9GRUFUVVJFX0hUVFBEX0VOQ09ERV9VUkxfU1RSKGVfb3B0X2VuY29kZV91cmwsKQorCUlGX0ZFQVRVUkVfSFRUUERfQkFTSUNfQVVUSCggICAgcl9vcHRfcmVhbG0gICAgICwpCisJSUZfRkVBVFVSRV9IVFRQRF9BVVRIX01ENSggICAgICBtX29wdF9tZDUgICAgICAgLCkKKwlJRl9GRUFUVVJFX0hUVFBEX1NFVFVJRCggICAgICAgIHVfb3B0X3NldHVpZCAgICAsKQorCXBfb3B0X3BvcnQgICAgICAsCisJcF9vcHRfaW5ldGQgICAgICwKKwlwX29wdF9mb3JlZ3JvdW5kLAorCXBfb3B0X3ZlcmJvc2UgICAsCisJT1BUX0NPTkZJR19GSUxFID0gMSA8PCBjX29wdF9jb25maWdfZmlsZSwKKwlPUFRfREVDT0RFX1VSTCAgPSAxIDw8IGRfb3B0X2RlY29kZV91cmwsCisJT1BUX0hPTUVfSFRUUEQgID0gMSA8PCBoX29wdF9ob21lX2h0dHBkLAorCU9QVF9FTkNPREVfVVJMICA9IElGX0ZFQVRVUkVfSFRUUERfRU5DT0RFX1VSTF9TVFIoKDEgPDwgZV9vcHRfZW5jb2RlX3VybCkpICsgMCwKKwlPUFRfUkVBTE0gICAgICAgPSBJRl9GRUFUVVJFX0hUVFBEX0JBU0lDX0FVVEgoICAgICgxIDw8IHJfb3B0X3JlYWxtICAgICApKSArIDAsCisJT1BUX01ENSAgICAgICAgID0gSUZfRkVBVFVSRV9IVFRQRF9BVVRIX01ENSggICAgICAoMSA8PCBtX29wdF9tZDUgICAgICAgKSkgKyAwLAorCU9QVF9TRVRVSUQgICAgICA9IElGX0ZFQVRVUkVfSFRUUERfU0VUVUlEKCAgICAgICAgKDEgPDwgdV9vcHRfc2V0dWlkICAgICkpICsgMCwKKwlPUFRfUE9SVCAgICAgICAgPSAxIDw8IHBfb3B0X3BvcnQsCisJT1BUX0lORVREICAgICAgID0gMSA8PCBwX29wdF9pbmV0ZCwKKwlPUFRfRk9SRUdST1VORCAgPSAxIDw8IHBfb3B0X2ZvcmVncm91bmQsCisJT1BUX1ZFUkJPU0UgICAgID0gMSA8PCBwX29wdF92ZXJib3NlLAorfTsKKworCitpbnQgaHR0cGRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGh0dHBkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgc2VydmVyX3NvY2tldCA9IHNlcnZlcl9zb2NrZXQ7IC8qIGZvciBnY2MgKi8KKwl1bnNpZ25lZCBvcHQ7CisJY2hhciAqdXJsX2Zvcl9kZWNvZGU7CisJSUZfRkVBVFVSRV9IVFRQRF9FTkNPREVfVVJMX1NUUihjb25zdCBjaGFyICp1cmxfZm9yX2VuY29kZTspCisJSUZfRkVBVFVSRV9IVFRQRF9TRVRVSUQoY29uc3QgY2hhciAqc191Z2lkID0gTlVMTDspCisJSUZfRkVBVFVSRV9IVFRQRF9TRVRVSUQoc3RydWN0IGJiX3VpZGdpZF90IHVnaWQ7KQorCUlGX0ZFQVRVUkVfSFRUUERfQVVUSF9NRDUoY29uc3QgY2hhciAqcGFzczspCisKKwlJTklUX0coKTsKKworI2lmIEVOQUJMRV9MT0NBTEVfU1VQUE9SVAorCS8qIFVuZG8gYnVzeWJveC5jOiB3ZSB3YW50IHRvIHNwZWFrIEVuZ2xpc2ggaW4gaHR0cCAoZGF0ZXMgZXRjKSAqLworCXNldGxvY2FsZShMQ19USU1FLCAiQyIpOworI2VuZGlmCisKKwlob21lX2h0dHBkID0geHJlYWxsb2NfZ2V0Y3dkX29yX3dhcm4oTlVMTCk7CisJLyogLXYgY291bnRzLCAtaSBpbXBsaWVzIC1mICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAidnY6aWYiOworCS8qIFdlIGRvIG5vdCAiYWJzb2x1dGl6ZSIgcGF0aCBnaXZlbiBieSAtaCAoaG9tZSkgb3B0LgorCSAqIElmIHVzZXIgZ2l2ZXMgcmVsYXRpdmUgcGF0aCBpbiAtaCwKKwkgKiAkU0NSSVBUX0ZJTEVOQU1FIHdpbGwgbm90IGJlIHNldC4gKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiYzpkOmg6IgorCQkJSUZfRkVBVFVSRV9IVFRQRF9FTkNPREVfVVJMX1NUUigiZToiKQorCQkJSUZfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRIKCJyOiIpCisJCQlJRl9GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1KCJtOiIpCisJCQlJRl9GRUFUVVJFX0hUVFBEX1NFVFVJRCgidToiKQorCQkJInA6aWZ2IiwKKwkJCSZvcHRfY19jb25maWdGaWxlLCAmdXJsX2Zvcl9kZWNvZGUsICZob21lX2h0dHBkCisJCQlJRl9GRUFUVVJFX0hUVFBEX0VOQ09ERV9VUkxfU1RSKCwgJnVybF9mb3JfZW5jb2RlKQorCQkJSUZfRkVBVFVSRV9IVFRQRF9CQVNJQ19BVVRIKCwgJmdfcmVhbG0pCisJCQlJRl9GRUFUVVJFX0hUVFBEX0FVVEhfTUQ1KCwgJnBhc3MpCisJCQlJRl9GRUFUVVJFX0hUVFBEX1NFVFVJRCgsICZzX3VnaWQpCisJCQksICZiaW5kX2FkZHJfb3JfcG9ydAorCQkJLCAmdmVyYm9zZQorCQkpOworCWlmIChvcHQgJiBPUFRfREVDT0RFX1VSTCkgeworCQlmcHV0cyhwZXJjZW50X2RlY29kZV9pbl9wbGFjZSh1cmxfZm9yX2RlY29kZSwgLypzdHJpY3Q6Ki8gMCksIHN0ZG91dCk7CisJCXJldHVybiAwOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9FTkNPREVfVVJMX1NUUgorCWlmIChvcHQgJiBPUFRfRU5DT0RFX1VSTCkgeworCQlmcHV0cyhlbmNvZGVTdHJpbmcodXJsX2Zvcl9lbmNvZGUpLCBzdGRvdXQpOworCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9IVFRQRF9BVVRIX01ENQorCWlmIChvcHQgJiBPUFRfTUQ1KSB7CisJCWNoYXIgc2FsdFtzaXplb2YoIiQxJFhYWFhYWFhYIildOworCQlzYWx0WzBdID0gJyQnOworCQlzYWx0WzFdID0gJzEnOworCQlzYWx0WzJdID0gJyQnOworCQljcnlwdF9tYWtlX3NhbHQoc2FsdCArIDMsIDQpOworCQlwdXRzKHB3X2VuY3J5cHQocGFzcywgc2FsdCwgLypjbGVhbnVwOiovIDApKTsKKwkJcmV0dXJuIDA7CisJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfU0VUVUlECisJaWYgKG9wdCAmIE9QVF9TRVRVSUQpIHsKKwkJeGdldF91aWRnaWQoJnVnaWQsIHNfdWdpZCk7CisJfQorI2VuZGlmCisKKyNpZiAhQkJfTU1VCisJaWYgKCEob3B0ICYgT1BUX0ZPUkVHUk9VTkQpKSB7CisJCWJiX2RhZW1vbml6ZV9vcl9yZXhlYygwLCBhcmd2KTsgLyogZG9uJ3QgY2hhbmdlIGN1cnJlbnQgZGlyZWN0b3J5ICovCisJfQorI2VuZGlmCisKKwl4Y2hkaXIoaG9tZV9odHRwZCk7CisJaWYgKCEob3B0ICYgT1BUX0lORVREKSkgeworCQlzaWduYWwoU0lHQ0hMRCwgU0lHX0lHTik7CisJCXNlcnZlcl9zb2NrZXQgPSBvcGVuU2VydmVyKCk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSFRUUERfU0VUVUlECisJCS8qIGRyb3AgcHJpdmlsZWdlcyAqLworCQlpZiAob3B0ICYgT1BUX1NFVFVJRCkgeworCQkJaWYgKHVnaWQuZ2lkICE9IChnaWRfdCktMSkgeworCQkJCWlmIChzZXRncm91cHMoMSwgJnVnaWQuZ2lkKSA9PSAtMSkKKwkJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZXRncm91cHMiKTsKKwkJCQl4c2V0Z2lkKHVnaWQuZ2lkKTsKKwkJCX0KKwkJCXhzZXR1aWQodWdpZC51aWQpOworCQl9CisjZW5kaWYKKwl9CisKKyNpZiAwCisJLyogVXNlciBjYW4gZG8gaXQgaGltc2VsZjogJ2VudiAtIFBBVEg9IiRQQVRIIiBodHRwZCcKKwkgKiBXZSBkb24ndCBkbyBpdCBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gc2NyZXcgdXNlcnMKKwkgKiB3aGljaCB3YW50IHRvIGRvCisJICogJ2VudiAtIFZBUjE9dmFsMSBWQVIyPXZhbDIgaHR0cGQnCisJICogYW5kIGhhdmUgVkFSMSBhbmQgVkFSMiB2YWx1ZXMgdmlzaWJsZSBpbiB0aGVpciBDR0lzLgorCSAqIEJlc2lkZXMsIGl0IGlzIGFsc28gc21hbGxlci4gKi8KKwl7CisJCWNoYXIgKnAgPSBnZXRlbnYoIlBBVEgiKTsKKwkJLyogZW52IHN0cmluZ3MgdGhlbXNlbGYgYXJlIG5vdCBmcmVlZCwgbm8gbmVlZCB0byB4c3RyZHVwKHApOiAqLworCQljbGVhcmVudigpOworCQlpZiAocCkKKwkJCXB1dGVudihwIC0gNSk7CisvLwkJaWYgKCEob3B0ICYgT1BUX0lORVREKSkKKy8vCQkJc2V0ZW52X2xvbmcoIlNFUlZFUl9QT1JUIiwgPz8/KTsKKwl9CisjZW5kaWYKKworCXBhcnNlX2NvbmYoREVGQVVMVF9QQVRIX0hUVFBEX0NPTkYsIEZJUlNUX1BBUlNFKTsKKwlpZiAoIShvcHQgJiBPUFRfSU5FVEQpKQorCQlzaWduYWwoU0lHSFVQLCBzaWdodXBfaGFuZGxlcik7CisKKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSAwOworCWlmIChvcHQgJiBPUFRfSU5FVEQpCisJCW1pbmlfaHR0cGRfaW5ldGQoKTsKKyNpZiBCQl9NTVUKKwlpZiAoIShvcHQgJiBPUFRfRk9SRUdST1VORCkpCisJCWJiX2RhZW1vbml6ZSgwKTsgLyogZG9uJ3QgY2hhbmdlIGN1cnJlbnQgZGlyZWN0b3J5ICovCisJbWluaV9odHRwZChzZXJ2ZXJfc29ja2V0KTsgLyogbmV2ZXIgcmV0dXJucyAqLworI2Vsc2UKKwltaW5pX2h0dHBkX25vbW11KHNlcnZlcl9zb2NrZXQsIGFyZ2MsIGFyZ3YpOyAvKiBuZXZlciByZXR1cm5zICovCisjZW5kaWYKKwkvKiByZXR1cm4gMDsgKi8KK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvaHR0cGRfaW5kZXhjZ2kuYyBiL25ldHdvcmtpbmcvaHR0cGRfaW5kZXhjZ2kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjJjZDdmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9odHRwZF9pbmRleGNnaS5jCkBAIC0wLDAgKzEsMzUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA3IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGEgQ0dJIGFwcGxpY2F0aW9uLiBJdCBvdXRwdXRzIGRpcmVjdG9yeSBpbmRleCBwYWdlLgorICogUHV0IGl0IGludG8gY2dpLWJpbi9pbmRleC5jZ2kgYW5kIGNobW9kIDA3NTUuCisgKi8KKworLyogQnVpbGQgYS1sYQoraTQ4Ni1saW51eC11Y2xpYmMtZ2NjIFwKKy1zdGF0aWMgLXN0YXRpYy1saWJnY2MgXAorLURfTEFSR0VGSUxFX1NPVVJDRSAtRF9MQVJHRUZJTEU2NF9TT1VSQ0UgLURfRklMRV9PRkZTRVRfQklUUz02NCBcCistV2FsbCAtV3NoYWRvdyAtV3dyaXRlLXN0cmluZ3MgLVd1bmRlZiAtV3N0cmljdC1wcm90b3R5cGVzIC1XZXJyb3IgXAorLVdvbGQtc3R5bGUtZGVmaW5pdGlvbiAtV2RlY2xhcmF0aW9uLWFmdGVyLXN0YXRlbWVudCAtV25vLXBvaW50ZXItc2lnbiBcCistV21pc3NpbmctcHJvdG90eXBlcyAtV21pc3NpbmctZGVjbGFyYXRpb25zIFwKKy1PcyAtZm5vLWJ1aWx0aW4tc3RybGVuIC1maW5saW5lLWxpbWl0PTAgLWZvbWl0LWZyYW1lLXBvaW50ZXIgXAorLWZmdW5jdGlvbi1zZWN0aW9ucyAtZmRhdGEtc2VjdGlvbnMgLWZuby1ndWVzcy1icmFuY2gtcHJvYmFiaWxpdHkgXAorLWZ1bnNpZ25lZC1jaGFyIFwKKy1mYWxpZ24tZnVuY3Rpb25zPTEgLWZhbGlnbi1qdW1wcz0xIC1mYWxpZ24tbGFiZWxzPTEgLWZhbGlnbi1sb29wcz0xIFwKKy1tYXJjaD1pMzg2IC1tcHJlZmVycmVkLXN0YWNrLWJvdW5kYXJ5PTIgXAorLVdsLC1NYXAgLVdsLGxpbmsubWFwIC1XbCwtLXdhcm4tY29tbW9uIC1XbCwtLXNvcnQtY29tbW9uIC1XbCwtLWdjLXNlY3Rpb25zIFwKK2h0dHBkX2luZGV4Y2dpLmMgLW8gaW5kZXguY2dpCisqLworCisvKiBXZSBkb24ndCB1c2UgcHJpbnRmLCBhcyBpdCBwdWxscyBpbiA+MTIga2Igb2YgY29kZSBmcm9tIHVjbGliYyAoaTM4NikuICovCisvKiBDdXJyZW50bHkgbWFsbG9jIG1hY2hpbmVyeSBpcyB0aGUgYmlnZ2VzdCBwYXJ0IG9mIGxpYmMgd2UgcHVsbCBpbi4gKi8KKy8qIFdlIGhhdmUgb25seSBvbmUgcmVhbGxvYyBhbmQgb25lIHN0cmR1cCwgYW55IGlkZWEgaG93IHRvIGRvIHdpdGhvdXQ/ICovCisKKy8qIFNpemUgKGkzODYsIHN0YXRpYyB1Y2xpYmMsIGFwcHJveGltYXRlKToKKyAqICAgdGV4dCAgICBkYXRhICAgICBic3MgICAgIGRlYyAgICAgaGV4IGZpbGVuYW1lCisgKiAgMTMwMzYgICAgICA0NCAgICAzMDUyICAgMTYxMzIgICAgM2YwNCBpbmRleC5jZ2kKKyAqICAgMjU3NiAgICAgICA0ICAgIDIwNDggICAgNDYyOCAgICAxMjE0IGluZGV4LmNnaS5vCisgKi8KKworI2RlZmluZSBfR05VX1NPVVJDRSAxICAvKiBmb3Igc3RyY2hybnVsICovCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisvKiBBcHBlYXJhbmNlIG9mIHRoZSB0YWJsZSBpcyBjb250cm9sbGVkIGJ5IHN0eWxlIHNoZWV0ICpPTkxZKiwKKyAqIGZvcm1hdHRpbmcgY29kZSB1c2VzIDxUQUcgY2xhc3M9Q0xBU1M+IHRvIGFwcGx5IHN0eWxlCisgKiB0byBlbGVtZW50cy4gRWRpdCBzdHlsZXNoZWV0IHRvIHlvdXIgbGlraW5nIGFuZCByZWNvbXBpbGUuICovCisKKyNkZWZpbmUgU1RZTEVfU1RSIFwKKyI8c3R5bGU+IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ0YWJsZSB7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyAgIndpZHRoOjEwMCU7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyAgImJhY2tncm91bmQtY29sb3I6I2ZmZjVlZTsiICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyAgImJvcmRlci13aWR0aDoxcHg7IiAvKiAxcHggMXB4IDFweCAxcHg7ICovICAgICAgICAgICAgIlxuIlwKKyAgImJvcmRlci1zcGFjaW5nOjJweDsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyAgImJvcmRlci1zdHlsZTpzb2xpZDsiIC8qIHNvbGlkIHNvbGlkIHNvbGlkIHNvbGlkOyAqLyAgIlxuIlwKKyAgImJvcmRlci1jb2xvcjpibGFjazsiIC8qIGJsYWNrIGJsYWNrIGJsYWNrIGJsYWNrOyAqLyAgIlxuIlwKKyAgImJvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTsiICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ9IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ0aCB7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyAgImJvcmRlci13aWR0aDoxcHg7IiAvKiAxcHggMXB4IDFweCAxcHg7ICovICAgICAgICAgICAgIlxuIlwKKyAgInBhZGRpbmc6MXB4OyIgLyogMXB4IDFweCAxcHggMXB4OyAqLyAgICAgICAgICAgICAgICAgIlxuIlwKKyAgImJvcmRlci1zdHlsZTpzb2xpZDsiIC8qIHNvbGlkIHNvbGlkIHNvbGlkIHNvbGlkOyAqLyAgIlxuIlwKKyAgImJvcmRlci1jb2xvcjpibGFjazsiIC8qIGJsYWNrIGJsYWNrIGJsYWNrIGJsYWNrOyAqLyAgIlxuIlwKKyJ9IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ0ZCB7IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyAgICAgICAgICAgICAvKiB0b3AgcmlnaHQgYm90dG9tIGxlZnQgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgImJvcmRlci13aWR0aDowcHggMXB4IDBweCAxcHg7IiAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyAgInBhZGRpbmc6MXB4OyIgLyogMXB4IDFweCAxcHggMXB4OyAqLyAgICAgICAgICAgICAgICAgIlxuIlwKKyAgImJvcmRlci1zdHlsZTpzb2xpZDsiIC8qIHNvbGlkIHNvbGlkIHNvbGlkIHNvbGlkOyAqLyAgIlxuIlwKKyAgImJvcmRlci1jb2xvcjpibGFjazsiIC8qIGJsYWNrIGJsYWNrIGJsYWNrIGJsYWNrOyAqLyAgIlxuIlwKKyAgIndoaXRlLXNwYWNlOm5vd3JhcDsiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ9IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ0ci5oZHIgeyBiYWNrZ3JvdW5kLWNvbG9yOiNlZWU1ZGU7IH0iICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ0ci5vIHsgYmFja2dyb3VuZC1jb2xvcjojZmZmZmZmOyB9IiAgICAgICAgICAgICAgICAgICAgIlxuIlwKKy8qIHRyLmUgeyAuLi4gfSAtIGZvciBldmVuIHJvd3MgKGN1cnJlbnRseSBub25lKSAqLyAgICAgICAgIFwKKyJ0ci5mb290IHsgYmFja2dyb3VuZC1jb2xvcjojZWVlNWRlOyB9IiAgICAgICAgICAgICAgICAgIlxuIlwKKyJ0aC5jbnQgeyB0ZXh0LWFsaWduOmxlZnQ7IH0iICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ0aC5zeiB7IHRleHQtYWxpZ246cmlnaHQ7IH0iICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ0aC5kdCB7IHRleHQtYWxpZ246cmlnaHQ7IH0iICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ0ZC5zeiB7IHRleHQtYWxpZ246cmlnaHQ7IH0iICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJ0ZC5kdCB7IHRleHQtYWxpZ246cmlnaHQ7IH0iICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJjb2wubm0geyB3aWR0aDo5OCU7IH0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJjb2wuc3ogeyB3aWR0aDoxJTsgfSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyJjb2wuZHQgeyB3aWR0aDoxJTsgfSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKyI8L3N0eWxlPiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIlwKKwordHlwZWRlZiBzdHJ1Y3QgZGlyX2xpc3RfdCB7CisJY2hhciAgKmRsX25hbWU7CisJbW9kZV90IGRsX21vZGU7CisJb2ZmX3QgIGRsX3NpemU7CisJdGltZV90IGRsX210aW1lOworfSBkaXJfbGlzdF90OworCitzdGF0aWMgaW50IGNvbXBhcmVfZGwoZGlyX2xpc3RfdCAqYSwgZGlyX2xpc3RfdCAqYikKK3sKKwkvKiAiLi4iIGlzICdsZXNzIHRoYW4nIGFueSBvdGhlciBkaXIgZW50cnkgKi8KKwlpZiAoc3RyY21wKGEtPmRsX25hbWUsICIuLiIpID09IDApIHsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoc3RyY21wKGItPmRsX25hbWUsICIuLiIpID09IDApIHsKKwkJcmV0dXJuIDE7CisJfQorCWlmIChTX0lTRElSKGEtPmRsX21vZGUpICE9IFNfSVNESVIoYi0+ZGxfbW9kZSkpIHsKKwkJLyogMSBpZiBiIGlzIGEgZGlyIChhbmQgdGh1cyBhIGlzICdhZnRlcicgYiwgYSA+IGIpLAorCQkgKiBlbHNlIC0xIChhIDwgYikgKi8KKwkJcmV0dXJuIChTX0lTRElSKGItPmRsX21vZGUpICE9IDApID8gMSA6IC0xOworCX0KKwlyZXR1cm4gc3RyY21wKGEtPmRsX25hbWUsIGItPmRsX25hbWUpOworfQorCitzdGF0aWMgY2hhciBidWZmZXJbMioxMDI0ID4gc2l6ZW9mKFNUWUxFX1NUUikgPyAyKjEwMjQgOiBzaXplb2YoU1RZTEVfU1RSKV07CitzdGF0aWMgY2hhciAqZHN0ID0gYnVmZmVyOworZW51bSB7CisJQlVGRkVSX1NJWkUgPSBzaXplb2YoYnVmZmVyKSwKKwlIRUFEUk9PTSA9IDY0LAorfTsKKworLyogQWZ0ZXIgdGhpcyBjYWxsLCB5b3UgaGF2ZSBhdCBsZWFzdCBzaXplICsgSEVBRFJPT00gYnl0ZXMgYXZhaWxhYmxlCisgKiBhaGVhZCBvZiBkc3QgKi8KK3N0YXRpYyB2b2lkIGd1YXJhbnRlZShpbnQgc2l6ZSkKK3sKKwlpZiAoYnVmZmVyICsgKEJVRkZFUl9TSVpFLUhFQURST09NKSAtIGRzdCA+PSBzaXplKQorCQlyZXR1cm47CisJd3JpdGUoU1RET1VUX0ZJTEVOTywgYnVmZmVyLCBkc3QgLSBidWZmZXIpOworCWRzdCA9IGJ1ZmZlcjsKK30KKworLyogTkI6IGZvcm1hdHRlcnMgZG8gbm90IHN0b3JlIHRlcm1pbmF0aW5nIE5VTCEgKi8KKworLyogSEVBRFJPT00gYnl0ZXMgYXJlIGF2YWlsYWJsZSBhZnRlciBkc3QgYWZ0ZXIgdGhpcyBjYWxsICovCitzdGF0aWMgdm9pZCBmbXRfc3RyKC8qY2hhciAqZHN0LCovIGNvbnN0IGNoYXIgKnNyYykKK3sKKwl1bnNpZ25lZCBsZW4gPSBzdHJsZW4oc3JjKTsKKwlndWFyYW50ZWUobGVuKTsKKwltZW1jcHkoZHN0LCBzcmMsIGxlbik7CisJZHN0ICs9IGxlbjsKK30KKworLyogSEVBRFJPT00gYnl0ZXMgYWZ0ZXIgZHN0IGFyZSBhdmFpbGFibGUgYWZ0ZXIgdGhpcyBjYWxsICovCitzdGF0aWMgdm9pZCBmbXRfdXJsKC8qY2hhciAqZHN0LCovIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJd2hpbGUgKCpuYW1lKSB7CisJCXVuc2lnbmVkIGMgPSAqbmFtZSsrOworCQlndWFyYW50ZWUoMyk7CisJCSpkc3QgPSBjOworCQlpZiAoKGMgLSAnMCcpID4gOSAvKiBub3QgYSBkaWdpdCAqLworCQkgJiYgKChjfDB4MjApIC0gJ2EnKSA+ICgneicgLSAnYScpIC8qIG5vdCBBLVogb3IgYS16ICovCisJCSAmJiAhc3RyY2hyKCIuXy0rQCIsIGMpCisJCSkgeworCQkJKmRzdCsrID0gJyUnOworCQkJKmRzdCsrID0gIjAxMjM0NTY3ODlBQkNERUYiW2MgPj4gNF07CisJCQkqZHN0ID0gIjAxMjM0NTY3ODlBQkNERUYiW2MgJiAweGZdOworCQl9CisJCWRzdCsrOworCX0KK30KKworLyogSEVBRFJPT00gYnl0ZXMgYXJlIGF2YWlsYWJsZSBhZnRlciBkc3QgYWZ0ZXIgdGhpcyBjYWxsICovCitzdGF0aWMgdm9pZCBmbXRfaHRtbCgvKmNoYXIgKmRzdCwqLyBjb25zdCBjaGFyICpuYW1lKQoreworCXdoaWxlICgqbmFtZSkgeworCQljaGFyIGMgPSAqbmFtZSsrOworCQlpZiAoYyA9PSAnPCcpCisJCQlmbXRfc3RyKCImbHQ7Iik7CisJCWVsc2UgaWYgKGMgPT0gJz4nKQorCQkJZm10X3N0cigiJmd0OyIpOworCQllbHNlIGlmIChjID09ICcmJykgeworCQkJZm10X3N0cigiJmFtcDsiKTsKKwkJfSBlbHNlIHsKKwkJCWd1YXJhbnRlZSgxKTsKKwkJCSpkc3QrKyA9IGM7CisJCQljb250aW51ZTsKKwkJfQorCX0KK30KKworLyogSEVBRFJPT00gYnl0ZXMgYXJlIGF2YWlsYWJsZSBhZnRlciBkc3QgYWZ0ZXIgdGhpcyBjYWxsICovCitzdGF0aWMgdm9pZCBmbXRfdWxsKC8qY2hhciAqZHN0LCovIHVuc2lnbmVkIGxvbmcgbG9uZyBuKQoreworCWNoYXIgYnVmW3NpemVvZihuKSozICsgMl07CisJY2hhciAqcDsKKworCXAgPSBidWYgKyBzaXplb2YoYnVmKSAtIDE7CisJKnAgPSAnXDAnOworCWRvIHsKKwkJKi0tcCA9IChuICUgMTApICsgJzAnOworCQluIC89IDEwOworCX0gd2hpbGUgKG4pOworCWZtdF9zdHIoLypkc3QsKi8gcCk7Cit9CisKKy8qIERvZXMgbm90IGNhbGwgZ3VhcmFudGVlIC0gZWF0cyBpbnRvIGhlYWRyb29tIGluc3RlYWQgKi8KK3N0YXRpYyB2b2lkIGZtdF8wMnUoLypjaGFyICpkc3QsKi8gdW5zaWduZWQgbikKK3sKKwkvKiBuICU9IDEwMDsgLSBub3QgbmVlZGVkLCBjYWxsZXJzIGRvbid0IHBhc3MgYmlnIG4gKi8KKwlkc3RbMF0gPSAobiAvIDEwKSArICcwJzsKKwlkc3RbMV0gPSAobiAlIDEwKSArICcwJzsKKwlkc3QgKz0gMjsKK30KKworLyogRG9lcyBub3QgY2FsbCBndWFyYW50ZWUgLSBlYXRzIGludG8gaGVhZHJvb20gaW5zdGVhZCAqLworc3RhdGljIHZvaWQgZm10XzA0dSgvKmNoYXIgKmRzdCwqLyB1bnNpZ25lZCBuKQoreworCS8qIG4gJT0gMTAwMDA7IC0gbm90IG5lZWRlZCwgY2FsbGVycyBkb24ndCBwYXNzIGJpZyBuICovCisJZm10XzAydShuIC8gMTAwKTsKKwlmbXRfMDJ1KG4gJSAxMDApOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCWRpcl9saXN0X3QgKmRpcl9saXN0OworCWRpcl9saXN0X3QgKmNkaXI7CisJdW5zaWduZWQgZGlyX2xpc3RfY291bnQ7CisJdW5zaWduZWQgY291bnRfZGlyczsKKwl1bnNpZ25lZCBjb3VudF9maWxlczsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZV90b3RhbDsKKwlpbnQgb2RkOworCURJUiAqZGlycDsKKwljaGFyICpsb2NhdGlvbjsKKworCWxvY2F0aW9uID0gZ2V0ZW52KCJSRVFVRVNUX1VSSSIpOworCWlmICghbG9jYXRpb24pCisJCXJldHVybiAxOworCisJLyogZHJvcCBVUkwgYXJndW1lbnRzIGlmIGFueSAqLworCXN0cmNocm51bChsb2NhdGlvbiwgJz8nKVswXSA9ICdcMCc7CisKKwlpZiAobG9jYXRpb25bMF0gIT0gJy8nCisJIHx8IHN0cnN0cihsb2NhdGlvbiwgIi8vIikKKwkgfHwgc3Ryc3RyKGxvY2F0aW9uLCAiLy4uLyIpCisJIHx8IHN0cmNtcChzdHJyY2hyKGxvY2F0aW9uLCAnLycpLCAiLy4uIikgPT0gMAorCSkgeworCQlyZXR1cm4gMTsKKwl9CisKKwlpZiAoY2hkaXIoIi4uIikKKwkgfHwgKGxvY2F0aW9uWzFdICYmIGNoZGlyKGxvY2F0aW9uICsgMSkpCisJKSB7CisJCXJldHVybiAxOworCX0KKworCWRpcnAgPSBvcGVuZGlyKCIuIik7CisJaWYgKCFkaXJwKQorCQlyZXR1cm4gMTsKKwlkaXJfbGlzdCA9IE5VTEw7CisJZGlyX2xpc3RfY291bnQgPSAwOworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBkaXJlbnQgKmRwOworCQlzdHJ1Y3Qgc3RhdCBzYjsKKworCQlkcCA9IHJlYWRkaXIoZGlycCk7CisJCWlmICghZHApCisJCQlicmVhazsKKwkJaWYgKGRwLT5kX25hbWVbMF0gPT0gJy4nICYmICFkcC0+ZF9uYW1lWzFdKQorCQkJY29udGludWU7CisJCWlmIChzdGF0KGRwLT5kX25hbWUsICZzYikgIT0gMCkKKwkJCWNvbnRpbnVlOworCQlkaXJfbGlzdCA9IHJlYWxsb2MoZGlyX2xpc3QsIChkaXJfbGlzdF9jb3VudCArIDEpICogc2l6ZW9mKGRpcl9saXN0WzBdKSk7CisJCWRpcl9saXN0W2Rpcl9saXN0X2NvdW50XS5kbF9uYW1lID0gc3RyZHVwKGRwLT5kX25hbWUpOworCQlkaXJfbGlzdFtkaXJfbGlzdF9jb3VudF0uZGxfbW9kZSA9IHNiLnN0X21vZGU7CisJCWRpcl9saXN0W2Rpcl9saXN0X2NvdW50XS5kbF9zaXplID0gc2Iuc3Rfc2l6ZTsKKwkJZGlyX2xpc3RbZGlyX2xpc3RfY291bnRdLmRsX210aW1lID0gc2Iuc3RfbXRpbWU7CisJCWRpcl9saXN0X2NvdW50Kys7CisJfQorCWNsb3NlZGlyKGRpcnApOworCisJcXNvcnQoZGlyX2xpc3QsIGRpcl9saXN0X2NvdW50LCBzaXplb2YoZGlyX2xpc3RbMF0pLCAodm9pZCopY29tcGFyZV9kbCk7CisKKwlmbXRfc3RyKAorCQkiIiAvKiBBZGRpdGlvbmFsIGhlYWRlcnMgKGN1cnJlbnRseSBub25lKSAqLworCQkiXHJcbiIgLyogTWFuZGF0b3J5IGVtcHR5IGxpbmUgYWZ0ZXIgaGVhZGVycyAqLworCQkiPGh0bWw+PGhlYWQ+PHRpdGxlPkluZGV4IG9mICIpOworCS8qIEd1YXJkIGFnYWluc3QgZGlyZWN0b3JpZXMgd2l0aCAmLCA+IGV0YyAqLworCWZtdF9odG1sKGxvY2F0aW9uKTsKKwlmbXRfc3RyKAorCQkiPC90aXRsZT5cbiIKKwkJU1RZTEVfU1RSCisJCSI8L2hlYWQ+IiAiXG4iCisJCSI8Ym9keT4iICJcbiIKKwkJIjxoMT5JbmRleCBvZiAiKTsKKwlmbXRfaHRtbChsb2NhdGlvbik7CisJZm10X3N0cigKKwkJIjwvaDE+IiAiXG4iCisJCSI8dGFibGU+IiAiXG4iCisJCSI8Y29sIGNsYXNzPW5tPjxjb2wgY2xhc3M9c3o+PGNvbCBjbGFzcz1kdD4iICJcbiIKKwkJIjx0ciBjbGFzcz1oZHI+PHRoIGNsYXNzPWNudD5OYW1lPHRoIGNsYXNzPXN6PlNpemU8dGggY2xhc3M9ZHQ+TGFzdCBtb2RpZmllZCIgIlxuIik7CisKKwlvZGQgPSAwOworCWNvdW50X2RpcnMgPSAwOworCWNvdW50X2ZpbGVzID0gMDsKKwlzaXplX3RvdGFsID0gMDsKKwljZGlyID0gZGlyX2xpc3Q7CisJd2hpbGUgKGRpcl9saXN0X2NvdW50LS0pIHsKKwkJc3RydWN0IHRtICpwdG07CisKKwkJaWYgKFNfSVNESVIoY2Rpci0+ZGxfbW9kZSkpIHsKKwkJCWNvdW50X2RpcnMrKzsKKwkJfSBlbHNlIGlmIChTX0lTUkVHKGNkaXItPmRsX21vZGUpKSB7CisJCQljb3VudF9maWxlcysrOworCQkJc2l6ZV90b3RhbCArPSBjZGlyLT5kbF9zaXplOworCQl9IGVsc2UKKwkJCWdvdG8gbmV4dDsKKworCQlmbXRfc3RyKCI8dHIgY2xhc3M9Iik7CisJCSpkc3QrKyA9IChvZGQgPyAnbycgOiAnZScpOworCQlmbXRfc3RyKCI+PHRkIGNsYXNzPW5tPjxhIGhyZWY9JyIpOworCQlmbXRfdXJsKGNkaXItPmRsX25hbWUpOyAvKiAlMjAgZXRjICovCisJCWlmIChTX0lTRElSKGNkaXItPmRsX21vZGUpKQorCQkJKmRzdCsrID0gJy8nOworCQlmbXRfc3RyKCInPiIpOworCQlmbXRfaHRtbChjZGlyLT5kbF9uYW1lKTsgLyogJmx0OyBldGMgKi8KKwkJaWYgKFNfSVNESVIoY2Rpci0+ZGxfbW9kZSkpCisJCQkqZHN0KysgPSAnLyc7CisJCWZtdF9zdHIoIjwvYT48dGQgY2xhc3M9c3o+Iik7CisJCWlmIChTX0lTUkVHKGNkaXItPmRsX21vZGUpKQorCQkJZm10X3VsbChjZGlyLT5kbF9zaXplKTsKKwkJZm10X3N0cigiPHRkIGNsYXNzPWR0PiIpOworCQlwdG0gPSBnbXRpbWUoJmNkaXItPmRsX210aW1lKTsKKwkJZm10XzA0dSgxOTAwICsgcHRtLT50bV95ZWFyKTsgKmRzdCsrID0gJy0nOworCQlmbXRfMDJ1KHB0bS0+dG1fbW9uICsgMSk7ICpkc3QrKyA9ICctJzsKKwkJZm10XzAydShwdG0tPnRtX21kYXkpOyAqZHN0KysgPSAnICc7CisJCWZtdF8wMnUocHRtLT50bV9ob3VyKTsgKmRzdCsrID0gJzonOworCQlmbXRfMDJ1KHB0bS0+dG1fbWluKTsgKmRzdCsrID0gJzonOworCQlmbXRfMDJ1KHB0bS0+dG1fc2VjKTsKKwkJKmRzdCsrID0gJ1xuJzsKKworCQlvZGQgPSAxIC0gb2RkOworIG5leHQ6CisJCWNkaXIrKzsKKwl9CisKKwlmbXRfc3RyKCI8dHIgY2xhc3M9Zm9vdD48dGggY2xhc3M9Y250PkZpbGVzOiAiKTsKKwlmbXRfdWxsKGNvdW50X2ZpbGVzKTsKKwkvKiBjb3VudF9kaXJzIC0gMTogd2UgZG9uJ3Qgd2FudCB0byBjb3VudCAiLi4iICovCisJZm10X3N0cigiLCBkaXJlY3RvcmllczogIik7CisJZm10X3VsbChjb3VudF9kaXJzIC0gMSk7CisJZm10X3N0cigiPHRoIGNsYXNzPXN6PiIpOworCWZtdF91bGwoc2l6ZV90b3RhbCk7CisJZm10X3N0cigiPHRoIGNsYXNzPWR0PlxuIik7CisJLyogIjwvdGFibGU+PC9ib2R5PjwvaHRtbD4iIC0gd2h5IGJvdGhlcj8gKi8KKwlndWFyYW50ZWUoQlVGRkVSX1NJWkUgKiAyKTsgLyogZmx1c2ggKi8KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9odHRwZF9wb3N0X3VwbG9hZC50eHQgYi9uZXR3b3JraW5nL2h0dHBkX3Bvc3RfdXBsb2FkLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDUwNGY0Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9odHRwZF9wb3N0X3VwbG9hZC50eHQKQEAgLTAsMCArMSw2NSBAQAorUE9TVCB1cGxvYWQgZXhhbXBsZToKKworcG9zdF91cGxvYWQuaHRtCis9PT09PT09PT09PT09PT0KKzxodG1sPgorPGJvZHk+Cis8Zm9ybSBhY3Rpb249L2NnaS1iaW4vcG9zdF91cGxvYWQuY2dpIG1ldGhvZD1wb3N0IGVuY3R5cGU9bXVsdGlwYXJ0L2Zvcm0tZGF0YT4KK0ZpbGUgdG8gdXBsb2FkOiA8aW5wdXQgdHlwZT1maWxlIG5hbWU9ZmlsZTE+IDxpbnB1dCB0eXBlPXN1Ym1pdD4KKzwvZm9ybT4KKworCitwb3N0X3VwbG9hZC5jZ2kKKz09PT09PT09PT09PT09PQorIyEvYmluL3NoCisKKyMgUE9TVCB1cGxvYWQgZm9ybWF0OgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTI5OTk1ODA5MjE4MDkzNzQ5MjIxODU2NDQ2MDMyXk0KKyMgQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJmaWxlMSI7IGZpbGVuYW1lPSIuLi4iXk0KKyMgQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1eTQorIyBeTSAgICA8LS0tLS0tLS0tIGhlYWRlcnMgZW5kIHdpdGggZW1wdHkgbGluZQorIyBmaWxlIGNvbnRlbnRzCisjIGZpbGUgY29udGVudHMKKyMgZmlsZSBjb250ZW50cworIyBeTSAgICA8LS0tLS0tLS0tIGV4dHJhIGVtcHR5IGxpbmUKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0yOTk5NTgwOTIxODA5Mzc0OTIyMTg1NjQ0NjAzMi0tXk0KKworZmlsZT0vdG1wLyQkLSRSQU5ET00KKworQ1I9YHByaW50ZiAnXHInYAorCisjIENHSSBvdXRwdXQgbXVzdCBzdGFydCB3aXRoIGF0IGxlYXN0IGVtcHR5IGxpbmUgKG9yIGhlYWRlcnMpCitwcmludGYgJ1xyXG4nCisKK0lGUz0iJENSIgorcmVhZCAtciBkZWxpbV9saW5lCitJRlM9IiIKKword2hpbGUgcmVhZCAtciBsaW5lOyBkbworICAgIHRlc3QgeCIkbGluZSIgPSB4IiIgJiYgYnJlYWsKKyAgICB0ZXN0IHgiJGxpbmUiID0geCIkQ1IiICYmIGJyZWFrCitkb25lCisKK2NhdCA+IiRmaWxlIgorCisjIFdlIG5lZWQgdG8gZGVsZXRlIHRoZSB0YWlsIG9mICJcclxuZGVsaW1fbGluZS0tXHJcbiIKK3RhaWxfbGVuPSQoKCR7I2RlbGltX2xpbmV9ICsgNikpCisKKyMgR2V0IGFuZCBjaGVjayBmaWxlIHNpemUKK2ZpbGVzaXplPWBzdGF0IC1jIiVzIiAiJGZpbGUiYAordGVzdCAiJGZpbGVzaXplIiAtbHQgIiR0YWlsX2xlbiIgJiYgZXhpdCAxCisKKyMgQ2hlY2sgdGhhdCB0YWlsIGlzIGNvcnJlY3QKK2RkIGlmPSIkZmlsZSIgc2tpcD0kKChmaWxlc2l6ZSAtIHRhaWxfbGVuKSkgYnM9MSBjb3VudD0xMDAwID4iJGZpbGUudGFpbCIgMj4vZGV2L251bGwKK3ByaW50ZiAiXHJcbiVzLS1cclxuIiAiJGRlbGltX2xpbmUiID4iJGZpbGUudGFpbC5leHBlY3RlZCIKK2lmICEgZGlmZiAtcSAiJGZpbGUudGFpbCIgIiRmaWxlLnRhaWwuZXhwZWN0ZWQiID4vZGV2L251bGw7IHRoZW4KKyAgICBwcmludGYgIjxodG1sPlxuPGJvZHk+XG5NYWxmb3JtZWQgZmlsZSB1cGxvYWQiCisgICAgZXhpdCAxCitmaQorcm0gIiRmaWxlLnRhaWwiCitybSAiJGZpbGUudGFpbC5leHBlY3RlZCIKKworIyBUcnVuY2F0ZSB0aGUgZmlsZQorZGQgb2Y9IiRmaWxlIiBzZWVrPSQoKGZpbGVzaXplIC0gdGFpbF9sZW4pKSBicz0xIGNvdW50PTAgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbAorCitwcmludGYgIjxodG1sPlxuPGJvZHk+XG5GaWxlIHVwbG9hZCBoYXMgYmVlbiBhY2NlcHRlZCIKZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvaHR0cGRfc3NpLmMgYi9uZXR3b3JraW5nL2h0dHBkX3NzaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZDlhNmQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL2h0dHBkX3NzaS5jCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGEgQ0dJIGFwcGxpY2F0aW9uLiBJdCBwcm9jZXNzZXMgc2VydmVyLXNpZGUgaW5jbHVkZXM6CisgKiA8IS0tI2luY2x1ZGUgZmlsZT0iZmlsZS5odG1sIiAtLT4KKyAqCisgKiBVc2FnZTogcHV0IHRoZXNlIGxpbmVzIGluIGh0dHBkLmNvbmY6CisgKgorICogKi5odG1sOi9iaW4vaHR0cGRfc3NpCisgKiAqLmh0bTovYmluL2h0dHBkX3NzaQorICovCisKKy8qIEJ1aWxkIGEtbGEKK2k0ODYtbGludXgtdWNsaWJjLWdjYyBcCistc3RhdGljIC1zdGF0aWMtbGliZ2NjIFwKKy1EX0xBUkdFRklMRV9TT1VSQ0UgLURfTEFSR0VGSUxFNjRfU09VUkNFIC1EX0ZJTEVfT0ZGU0VUX0JJVFM9NjQgXAorLVdhbGwgLVdzaGFkb3cgLVd3cml0ZS1zdHJpbmdzIC1XdW5kZWYgLVdzdHJpY3QtcHJvdG90eXBlcyAtV2Vycm9yIFwKKy1Xb2xkLXN0eWxlLWRlZmluaXRpb24gLVdkZWNsYXJhdGlvbi1hZnRlci1zdGF0ZW1lbnQgLVduby1wb2ludGVyLXNpZ24gXAorLVdtaXNzaW5nLXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyBcCistT3MgLWZuby1idWlsdGluLXN0cmxlbiAtZmlubGluZS1saW1pdD0wIC1mb21pdC1mcmFtZS1wb2ludGVyIFwKKy1mZnVuY3Rpb24tc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zIC1mbm8tZ3Vlc3MtYnJhbmNoLXByb2JhYmlsaXR5IFwKKy1mdW5zaWduZWQtY2hhciBcCistZmFsaWduLWZ1bmN0aW9ucz0xIC1mYWxpZ24tanVtcHM9MSAtZmFsaWduLWxhYmVscz0xIC1mYWxpZ24tbG9vcHM9MSBcCistbWFyY2g9aTM4NiAtbXByZWZlcnJlZC1zdGFjay1ib3VuZGFyeT0yIFwKKy1XbCwtTWFwIC1XbCxsaW5rLm1hcCAtV2wsLS13YXJuLWNvbW1vbiAtV2wsLS1zb3J0LWNvbW1vbiAtV2wsLS1nYy1zZWN0aW9ucyBcCitodHRwZF9zc2kuYyAtbyBodHRwZF9zc2kKKyovCisKKy8qIFNpemUgKGkzODYsIHN0YXRpYyB1Y2xpYmMsIGFwcHJveGltYXRlKToKKyAqIHRleHQgICAgZGF0YSAgICAgYnNzICAgICBkZWMgICAgIGhleCBmaWxlbmFtZQorICogOTQ4NyAgICAgMTYwICAgNjg1NTIgICA3ODE5OSAgIDEzMTc3IGh0dHBkX3NzaQorICoKKyAqIE5vdGU6IGl0IHdvdWxkbid0IGJlIHRvbyBoYXJkIHRvIGdldCByaWQgb2Ygc3RkaW8gYW5kIHN0cmR1cCwKKyAqIChlc3BlY2lhbGx5IHRoYXQgZmdldHMoKSBtYW5nbGVzIE5VTHMuLi4pCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorCitzdGF0aWMgY2hhciogc2tpcF93aGl0ZXNwYWNlKGNoYXIgKnMpCit7CisJd2hpbGUgKCpzID09ICcgJyB8fCAqcyA9PSAnXHQnKSArK3M7CisKKwlyZXR1cm4gczsKK30KKworc3RhdGljIGNoYXIgbGluZVs2NCAqIDEwMjRdOworCitzdGF0aWMgdm9pZCBwcm9jZXNzX2luY2x1ZGVzKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWludCBjdXJkaXJfZmQ7CisJY2hhciAqZW5kOworCUZJTEUgKmZwID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisJaWYgKCFmcCkKKwkJZXhpdCgxKTsKKworCS8qIEVuc3VyZSB0aGF0IG5lc3RlZCBpbmNsdWRlcyBhcmUgcmVsYXRpdmU6CisJICogaWYgd2UgaW5jbHVkZSBhLzEuaHRtIGFuZCBpdCBpbmNsdWRlcyBiLzIuaHRtLAorCSAqIHdlIG5lZWQgdG8gaW5jbHVkZSBhL2IvMi5odG0sIG5vdCBiLzIuaHRtCisJICovCisJY3VyZGlyX2ZkID0gLTE7CisJZW5kID0gc3RycmNocihmaWxlbmFtZSwgJy8nKTsKKwlpZiAoZW5kKSB7CisJCWN1cmRpcl9mZCA9IG9wZW4oIi4iLCBPX1JET05MWSk7CisJCS8qICplbmQgPSAnXDAnIHdvdWxkIG1pc2hhbmRsZSAiL2ZpbGUuaHRtIiAqLworCQllbmRbMV0gPSAnXDAnOworCQljaGRpcihmaWxlbmFtZSk7CisJfQorCisjZGVmaW5lIElOQ0xVREUgIjwhLS0jaW5jbHVkZSIKKwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBmcCkpIHsKKwkJdW5zaWduZWQgcHJlY2VkaW5nX2xlbjsKKwkJY2hhciAqaW5jbHVkZV9kaXJlY3RpdmU7CisKKwkJaW5jbHVkZV9kaXJlY3RpdmUgPSBzdHJzdHIobGluZSwgSU5DTFVERSk7CisJCWlmICghaW5jbHVkZV9kaXJlY3RpdmUpIHsKKwkJCWZwdXRzKGxpbmUsIHN0ZG91dCk7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmVjZWRpbmdfbGVuID0gaW5jbHVkZV9kaXJlY3RpdmUgLSBsaW5lOworCQlpZiAobWVtY2hyKGxpbmUsICdcIicsIHByZWNlZGluZ19sZW4pCisJCSB8fCBtZW1jaHIobGluZSwgJ1wnJywgcHJlY2VkaW5nX2xlbikKKwkJKSB7CisJCQkvKiBJTkNMVURFIHN0cmluZyBtYXkgYmUgaW5zaWRlICJzdHIiIG9yICdzdHInLAorCQkJICogaWdub3JlIGl0ICovCisJCQlmcHV0cyhsaW5lLCBzdGRvdXQpOworCQkJY29udGludWU7CisJCX0KKwkJLyogU21hbGwgYnVnOiB3ZSBhY2NlcHQgI2luY2x1ZGVmaWxlPSJmaWxlIiB0b28gKi8KKwkJaW5jbHVkZV9kaXJlY3RpdmUgPSBza2lwX3doaXRlc3BhY2UoaW5jbHVkZV9kaXJlY3RpdmUgKyBzaXplb2YoSU5DTFVERSktMSk7CisJCWlmIChzdHJuY21wKGluY2x1ZGVfZGlyZWN0aXZlLCAiZmlsZT1cIiIsIDYpICE9IDApIHsKKwkJCS8qICI8IS0tI2luY2x1ZGUgdmlydHVhbD0uLi4iPyAtIG5vdCBzdXBwb3J0ZWQgKi8KKwkJCWZwdXRzKGxpbmUsIHN0ZG91dCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpbmNsdWRlX2RpcmVjdGl2ZSArPSA2OyAvKiBub3cgaXQgcG9pbnRzIHRvIGZpbGUgbmFtZSAqLworCQllbmQgPSBzdHJjaHIoaW5jbHVkZV9kaXJlY3RpdmUsICdcIicpOworCQlpZiAoIWVuZCkgeworCQkJZnB1dHMobGluZSwgc3Rkb3V0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIFdlIGNoZWNrZWQgdGhhdCB0aGlzIGlzIGEgdmFsaWQgaW5jbHVkZSBkaXJlY3RpdmUgKi8KKworCQkvKiBQcmludCBldmVyeXRoaW5nIGJlZm9yZSBkaXJlY3RpdmUgKi8KKwkJaWYgKHByZWNlZGluZ19sZW4pIHsKKwkJCWxpbmVbcHJlY2VkaW5nX2xlbl0gPSAnXDAnOworCQkJZnB1dHMobGluZSwgc3Rkb3V0KTsKKwkJfQorCQkvKiBTYXZlIGV2ZXJ5dGhpbmcgYWZ0ZXIgZGlyZWN0aXZlICovCisJCSplbmQrKyA9ICdcMCc7CisJCWVuZCA9IHN0cmNocihlbmQsICc+Jyk7CisJCWlmIChlbmQpCisJCQllbmQgPSBzdHJkdXAoZW5kICsgMSk7CisKKwkJLyogRklYTUU6CisJCSAqICgxKSBhcmUgcmVsYXRpdmUgcGF0aHMgd2l0aCAvLi4vIGV0YyBvaz8KKwkJICogKDIpIHdoYXQgdG8gZG8gd2l0aCBhYnNvbHV0ZSBwYXRocz8KKwkJICogYXJlIHRoZXkgcmVsYXRpdmUgdG8gZG9jIHJvb3Qgb3IgdG8gcmVhbCByb290PworCQkgKi8KKwkJcHJvY2Vzc19pbmNsdWRlcyhpbmNsdWRlX2RpcmVjdGl2ZSk7CisKKwkJLyogUHJpbnQgZXZlcnl0aGluZyBhZnRlciBkaXJlY3RpdmUgKi8KKwkJaWYgKGVuZCkgeworCQkJZnB1dHMoZW5kLCBzdGRvdXQpOworCQkJZnJlZShlbmQpOworCQl9CisJfQorCWlmIChjdXJkaXJfZmQgPj0gMCkKKwkJZmNoZGlyKGN1cmRpcl9mZCk7CisJZmNsb3NlKGZwKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlpZiAoIWFyZ3ZbMV0pCisJCXJldHVybiAxOworCisJLyogU2VlbiBmcm9tIGJ1c3lib3gubmV0J3MgQXBhY2hlOgorCSAqIEhUVFAvMS4xIDIwMCBPSworCSAqIERhdGU6IFRodSwgMTAgU2VwIDIwMDkgMTg6MjM6MjggR01UCisJICogU2VydmVyOiBBcGFjaGUKKwkgKiBBY2NlcHQtUmFuZ2VzOiBieXRlcworCSAqIENvbm5lY3Rpb246IGNsb3NlCisJICogQ29udGVudC1UeXBlOiB0ZXh0L2h0bWwKKwkgKi8KKwlmcHV0cygKKwkJLyogIkRhdGU6IFRodSwgMTAgU2VwIDIwMDkgMTg6MjM6MjggR01UXHJcbiIgKi8KKwkJLyogIlNlcnZlcjogQXBhY2hlXHJcbiIgKi8KKwkJLyogIkFjY2VwdC1SYW5nZXM6IGJ5dGVzXHJcbiIgLSBkbyB3ZSByZWFsbHkgYWNjZXB0IGJ5dGVzPyEgKi8KKwkJIkNvbm5lY3Rpb246IGNsb3NlXHJcbiIKKwkJIkNvbnRlbnQtVHlwZTogdGV4dC9odG1sXHJcbiIKKwkJIlxyXG4iLAorCQlzdGRvdXQKKwkpOworCXByb2Nlc3NfaW5jbHVkZXMoYXJndlsxXSk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2lmY29uZmlnLmMgYi9uZXR3b3JraW5nL2lmY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk4NGIwMgotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvaWZjb25maWcuYwpAQCAtMCwwICsxLDUwNCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBpZmNvbmZpZworICoKKyAqIFNpbWlsYXIgdG8gdGhlIHN0YW5kYXJkIFVuaXggaWZjb25maWcsIGJ1dCB3aXRoIG9ubHkgdGhlIG5lY2Vzc2FyeQorICogcGFydHMgZm9yIEFGX0lORVQsIGFuZCB3aXRob3V0IGFueSBwcmludGluZyBvZiBpZiBpbmZvIChmb3Igbm93KS4KKyAqCisgKiBCam9ybiBXZXNlbiwgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgorICoKKyAqCisgKiBBdXRob3JzIG9mIHRoZSBvcmlnaW5hbCBpZmNvbmZpZyB3YXM6CisgKiAgICAgICAgICAgICAgRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHV3YWx0Lm5sLm11Z25ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorICogSGVhdmlseSBtb2RpZmllZCBieSBNYW51ZWwgTm92b2EgSUlJICAgICAgIE1hciA2LCAyMDAxCisgKgorICogRnJvbSBpbml0aWFsIHBvcnQgdG8gYnVzeWJveCwgcmVtb3ZlZCBtb3N0IG9mIHRoZSByZWR1bmRhbmN5IGJ5CisgKiBjb252ZXJ0aW5nIHRvIGEgdGFibGUtZHJpdmVuIGFwcHJvYWNoLiAgQWRkZWQgc2V2ZXJhbCAob3B0aW9uYWwpCisgKiBhcmdzIG1pc3NpbmcgZnJvbSBpbml0aWFsIHBvcnQuCisgKgorICogU3RpbGwgbWlzc2luZzogIG1lZGlhLCB0dW5uZWwuCisgKgorICogMjAwMi0wNC0yMAorICogSVBWNiBzdXBwb3J0IGFkZGVkIGJ5IEJhcnQgVmlzc2NoZXIgPG1hZ2lja0BsaW51eC1mYW4uY29tPgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBpZmNvbmZpZ190cml2aWFsX3VzYWdlCisvL3VzYWdlOglJRl9GRUFUVVJFX0lGQ09ORklHX1NUQVRVUygiWy1hXSIpICIgaW50ZXJmYWNlIFthZGRyZXNzXSIKKy8vdXNhZ2U6I2RlZmluZSBpZmNvbmZpZ19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbmZpZ3VyZSBhIG5ldHdvcmsgaW50ZXJmYWNlXG4iCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9JUFY2KAorLy91c2FnZTogICAgICAgIglbYWRkIEFERFJFU1NbL1BSRUZJWExFTl1dXG4iKQorLy91c2FnZToJSUZfRkVBVFVSRV9JUFY2KAorLy91c2FnZTogICAgICAgIglbZGVsIEFERFJFU1NbL1BSRUZJWExFTl1dXG4iKQorLy91c2FnZTogICAgICAgIglbWy1dYnJvYWRjYXN0IFtBRERSRVNTXV0gW1stXXBvaW50b3BvaW50IFtBRERSRVNTXV1cbiIKKy8vdXNhZ2U6ICAgICAgICIJW25ldG1hc2sgQUREUkVTU10gW2RzdGFkZHIgQUREUkVTU11cbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSUZDT05GSUdfU0xJUCgKKy8vdXNhZ2U6ICAgICAgICIJW291dGZpbGwgTk5dIFtrZWVwYWxpdmUgTk5dXG4iKQorLy91c2FnZTogICAgICAgIgkiIElGX0ZFQVRVUkVfSUZDT05GSUdfSFcoIltodyBldGhlciIgSUZfRkVBVFVSRV9IV0lCKCJ8aW5maW5pYmFuZCIpIiBBRERSRVNTXSAiKSAiW21ldHJpYyBOTl0gW210dSBOTl1cbiIKKy8vdXNhZ2U6ICAgICAgICIJW1stXXRyYWlsZXJzXSBbWy1dYXJwXSBbWy1dYWxsbXVsdGldXG4iCisvL3VzYWdlOiAgICAgICAiCVttdWx0aWNhc3RdIFtbLV1wcm9taXNjXSBbdHhxdWV1ZWxlbiBOTl0gW1stXWR5bmFtaWNdXG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX0lGQ09ORklHX01FTVNUQVJUX0lPQUREUl9JUlEoCisvL3VzYWdlOiAgICAgICAiCVttZW1fc3RhcnQgTk5dIFtpb19hZGRyIE5OXSBbaXJxIE5OXVxuIikKKy8vdXNhZ2U6ICAgICAgICIJW3VwfGRvd25dIC4uLiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAiaW5ldF9jb21tb24uaCIKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXQvaWZfYXJwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2lmZGVmIEhBVkVfTkVUX0VUSEVSTkVUX0gKKyMgaW5jbHVkZSA8bmV0L2V0aGVybmV0Lmg+CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lGQ09ORklHX1NMSVAKKyMgaW5jbHVkZSA8bGludXgvaWZfc2xpcC5oPgorI2VuZGlmCisKKy8qIEkgZG9uJ3Qga25vdyBpZiB0aGlzIGlzIG5lZWRlZCBmb3IgYnVzeWJveCBvciBub3QuICBBbnlvbmU/ICovCisjZGVmaW5lIFFVRVNUSU9OQUJMRV9BTElBU19DQVNFCisKKworLyogRGVmaW5lcyBmb3IgZ2xpYmMyLjAgdXNlcnMuICovCisjaWZuZGVmIFNJT0NTSUZUWFFMRU4KKyMgZGVmaW5lIFNJT0NTSUZUWFFMRU4gICAgICAweDg5NDMKKyMgZGVmaW5lIFNJT0NHSUZUWFFMRU4gICAgICAweDg5NDIKKyNlbmRpZgorCisvKiBpZnJfcWxlbiBpcyBpZnJ1X2l2YWx1ZSwgYnV0IGl0IGlzbid0IHByZXNlbnQgaW4gMi4wIGtlcm5lbCBoZWFkZXJzICovCisjaWZuZGVmIGlmcl9xbGVuCisjIGRlZmluZSBpZnJfcWxlbiAgICAgICAgaWZyX2lmcnUuaWZydV9tdHUKKyNlbmRpZgorCisjaWZuZGVmIElGRl9EWU5BTUlDCisjIGRlZmluZSBJRkZfRFlOQU1JQyAgICAgMHg4MDAwCS8qIGRpYWx1cCBkZXZpY2Ugd2l0aCBjaGFuZ2luZyBhZGRyZXNzZXMgKi8KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorc3RydWN0IGluNl9pZnJlcSB7CisJc3RydWN0IGluNl9hZGRyIGlmcjZfYWRkcjsKKwl1aW50MzJfdCBpZnI2X3ByZWZpeGxlbjsKKwlpbnQgaWZyNl9pZmluZGV4OworfTsKKyNlbmRpZgorCisvKgorICogSGVyZSBhcmUgdGhlIGJpdCBtYXNrcyBmb3IgdGhlICJmbGFncyIgbWVtYmVyIG9mIHN0cnVjdCBvcHRpb25zIGJlbG93LgorICogTl8gc2lnbmlmaWVzIG5vIGFyZyBwcmVmaXg7IE1fIHNpZ25pZmllcyBhcmcgcHJlZml4ZWQgYnkgJy0nLgorICogQ0xSIGNsZWFycyB0aGUgZmxhZzsgU0VUIHNldHMgdGhlIGZsYWc7IEFSRyBzaWduaWZpZXMgKG9wdGlvbmFsKSBhcmcuCisgKi8KKyNkZWZpbmUgTl9DTFIgICAgICAgICAgICAweDAxCisjZGVmaW5lIE1fQ0xSICAgICAgICAgICAgMHgwMgorI2RlZmluZSBOX1NFVCAgICAgICAgICAgIDB4MDQKKyNkZWZpbmUgTV9TRVQgICAgICAgICAgICAweDA4CisjZGVmaW5lIE5fQVJHICAgICAgICAgICAgMHgxMAorI2RlZmluZSBNX0FSRyAgICAgICAgICAgIDB4MjAKKworI2RlZmluZSBNX01BU0sgICAgICAgICAgIChNX0NMUiB8IE1fU0VUIHwgTV9BUkcpCisjZGVmaW5lIE5fTUFTSyAgICAgICAgICAgKE5fQ0xSIHwgTl9TRVQgfCBOX0FSRykKKyNkZWZpbmUgU0VUX01BU0sgICAgICAgICAoTl9TRVQgfCBNX1NFVCkKKyNkZWZpbmUgQ0xSX01BU0sgICAgICAgICAoTl9DTFIgfCBNX0NMUikKKyNkZWZpbmUgU0VUX0NMUl9NQVNLICAgICAoU0VUX01BU0sgfCBDTFJfTUFTSykKKyNkZWZpbmUgQVJHX01BU0sgICAgICAgICAoTV9BUkcgfCBOX0FSRykKKworLyoKKyAqIEhlcmUgYXJlIHRoZSBiaXQgbWFza3MgZm9yIHRoZSAiYXJnX2ZsYWdzIiBtZW1iZXIgb2Ygc3RydWN0IG9wdGlvbnMgYmVsb3cuCisgKi8KKworLyoKKyAqIGNhc3QgdHlwZToKKyAqICAgMDAgaW50CisgKiAgIDAxIGNoYXIgKgorICogICAwMiBIT1NUX0NPUFkgaW5fZXRoZXIKKyAqICAgMDMgSE9TVF9DT1BZIElORVRfcmVzb2x2ZQorICovCisjZGVmaW5lIEFfQ0FTVF9UWVBFICAgICAgMHgwMworLyoKKyAqIG1hcCB0eXBlOgorICogICAwMCBub3QgYSBtYXAgdHlwZSAobWVtX3N0YXJ0LCBpb19hZGRyLCBpcnEpCisgKiAgIDA0IG1lbXN0YXJ0ICh1bnNpZ25lZCBsb25nKQorICogICAwOCBpb19hZGRyICAodW5zaWduZWQgc2hvcnQpCisgKiAgIDBDIGlycSAgICAgICh1bnNpZ25lZCBjaGFyKQorICovCisjZGVmaW5lIEFfTUFQX1RZUEUgICAgICAgMHgwQworI2RlZmluZSBBX0FSR19SRVEgICAgICAgIDB4MTAJLyogU2V0IGlmIGFuIGFyZyBpcyByZXF1aXJlZC4gKi8KKyNkZWZpbmUgQV9ORVRNQVNLICAgICAgICAweDIwCS8qIFNldCBpZiBuZXRtYXNrIChjaGVjayBmb3IgbXVsdGlwbGUgc2V0cykuICovCisjZGVmaW5lIEFfU0VUX0FGVEVSICAgICAgMHg0MAkvKiBTZXQgYSBmbGFnIGF0IHRoZSBlbmQuICovCisjZGVmaW5lIEFfQ09MT05fQ0hLICAgICAgMHg4MAkvKiBJcyB0aGlzIG5lZWRlZD8gIFNlZSBiZWxvdy4gKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9JRkNPTkZJR19CUk9BRENBU1RfUExVUworI2RlZmluZSBBX0hPU1ROQU1FICAgICAgMHgxMDAJLyogU2V0IGlmIGl0IGlzIGlwIGFkZHIuICovCisjZGVmaW5lIEFfQlJPQURDQVNUICAgICAweDIwMAkvKiBTZXQgaWYgaXQgaXMgYnJvYWRjYXN0IGFkZHIuICovCisjZWxzZQorI2RlZmluZSBBX0hPU1ROQU1FICAgICAgICAgIDAKKyNkZWZpbmUgQV9CUk9BRENBU1QgICAgICAgICAwCisjZW5kaWYKKworLyoKKyAqIFRoZXNlIGRlZmluZXMgYXJlIGZvciBkZWFsaW5nIHdpdGggdGhlIEFfQ0FTVF9UWVBFIGZpZWxkLgorICovCisjZGVmaW5lIEFfQ0FTVF9DSEFSX1BUUiAgMHgwMQorI2RlZmluZSBBX0NBU1RfUkVTT0xWRSAgIDB4MDEKKyNkZWZpbmUgQV9DQVNUX0hPU1RfQ09QWSAweDAyCisjZGVmaW5lIEFfQ0FTVF9IT1NUX0NPUFlfSU5fRVRIRVIgICAgQV9DQVNUX0hPU1RfQ09QWQorI2RlZmluZSBBX0NBU1RfSE9TVF9DT1BZX1JFU09MVkUgICAgIChBX0NBU1RfSE9TVF9DT1BZIHwgQV9DQVNUX1JFU09MVkUpCisKKy8qCisgKiBUaGVzZSBkZWZpbmVzIGFyZSBmb3IgZGVhbGluZyB3aXRoIHRoZSBBX01BUF9UWVBFIGZpZWxkLgorICovCisjZGVmaW5lIEFfTUFQX1VMT05HICAgICAgMHgwNAkvKiBtZW1zdGFydCAqLworI2RlZmluZSBBX01BUF9VU0hPUlQgICAgIDB4MDgJLyogaW9fYWRkciAqLworI2RlZmluZSBBX01BUF9VQ0hBUiAgICAgIDB4MEMJLyogaXJxICovCisKKy8qCisgKiBEZWZpbmUgdGhlIGJpdCBtYXNrcyBzaWduaWZ5aW5nIHdoaWNoIG9wZXJhdGlvbnMgdG8gcGVyZm9ybSBmb3IgZWFjaCBhcmcuCisgKi8KKworI2RlZmluZSBBUkdfTUVUUklDICAgICAgIChBX0FSR19SRVEgLyp8IEFfQ0FTVF9JTlQqLykKKyNkZWZpbmUgQVJHX01UVSAgICAgICAgICAoQV9BUkdfUkVRIC8qfCBBX0NBU1RfSU5UKi8pCisjZGVmaW5lIEFSR19UWFFVRVVFTEVOICAgKEFfQVJHX1JFUSAvKnwgQV9DQVNUX0lOVCovKQorI2RlZmluZSBBUkdfTUVNX1NUQVJUICAgIChBX0FSR19SRVEgfCBBX01BUF9VTE9ORykKKyNkZWZpbmUgQVJHX0lPX0FERFIgICAgICAoQV9BUkdfUkVRIHwgQV9NQVBfVUxPTkcpCisjZGVmaW5lIEFSR19JUlEgICAgICAgICAgKEFfQVJHX1JFUSB8IEFfTUFQX1VDSEFSKQorI2RlZmluZSBBUkdfRFNUQUREUiAgICAgIChBX0FSR19SRVEgfCBBX0NBU1RfSE9TVF9DT1BZX1JFU09MVkUpCisjZGVmaW5lIEFSR19ORVRNQVNLICAgICAgKEFfQVJHX1JFUSB8IEFfQ0FTVF9IT1NUX0NPUFlfUkVTT0xWRSB8IEFfTkVUTUFTSykKKyNkZWZpbmUgQVJHX0JST0FEQ0FTVCAgICAoQV9BUkdfUkVRIHwgQV9DQVNUX0hPU1RfQ09QWV9SRVNPTFZFIHwgQV9TRVRfQUZURVIgfCBBX0JST0FEQ0FTVCkKKyNkZWZpbmUgQVJHX0hXICAgICAgICAgICAoQV9BUkdfUkVRIHwgQV9DQVNUX0hPU1RfQ09QWV9JTl9FVEhFUikKKyNkZWZpbmUgQVJHX1BPSU5UT1BPSU5UICAoQV9BUkdfUkVRIHwgQV9DQVNUX0hPU1RfQ09QWV9SRVNPTFZFIHwgQV9TRVRfQUZURVIpCisjZGVmaW5lIEFSR19LRUVQQUxJVkUgICAgKEFfQVJHX1JFUSB8IEFfQ0FTVF9DSEFSX1BUUikKKyNkZWZpbmUgQVJHX09VVEZJTEwgICAgICAoQV9BUkdfUkVRIHwgQV9DQVNUX0NIQVJfUFRSKQorI2RlZmluZSBBUkdfSE9TVE5BTUUgICAgIChBX0NBU1RfSE9TVF9DT1BZX1JFU09MVkUgfCBBX1NFVF9BRlRFUiB8IEFfQ09MT05fQ0hLIHwgQV9IT1NUTkFNRSkKKyNkZWZpbmUgQVJHX0FERF9ERUwgICAgICAoQV9DQVNUX0hPU1RfQ09QWV9SRVNPTFZFIHwgQV9TRVRfQUZURVIpCisKKworc3RydWN0IGFyZzFvcHQgeworCWNvbnN0IGNoYXIgKm5hbWU7CisJdW5zaWduZWQgc2hvcnQgc2VsZWN0b3I7CisJdW5zaWduZWQgc2hvcnQgaWZyX29mZnNldDsKK307CisKK3N0cnVjdCBvcHRpb25zIHsKKwljb25zdCBjaGFyICpuYW1lOworI2lmIEVOQUJMRV9GRUFUVVJFX0lGQ09ORklHX0JST0FEQ0FTVF9QTFVTCisJY29uc3QgdW5zaWduZWQgaW50IGZsYWdzOjY7CisJY29uc3QgdW5zaWduZWQgaW50IGFyZ19mbGFnczoxMDsKKyNlbHNlCisJY29uc3QgdW5zaWduZWQgY2hhciBmbGFnczsKKwljb25zdCB1bnNpZ25lZCBjaGFyIGFyZ19mbGFnczsKKyNlbmRpZgorCWNvbnN0IHVuc2lnbmVkIHNob3J0IHNlbGVjdG9yOworfTsKKworI2RlZmluZSBpZnJlcV9vZmZzZXRvZih4KSAgb2Zmc2V0b2Yoc3RydWN0IGlmcmVxLCB4KQorCisvKgorICogU2V0IHVwIHRoZSB0YWJsZXMuICBXYXJuaW5nISAgVGhleSBtdXN0IGhhdmUgY29ycmVzcG9uZGluZyBvcmRlciEKKyAqLworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFyZzFvcHQgQXJnMU9wdFtdID0geworCXsgIlNJRk1FVFJJQyIsICBTSU9DU0lGTUVUUklDLCAgaWZyZXFfb2Zmc2V0b2YoaWZyX21ldHJpYykgfSwKKwl7ICJTSUZNVFUiLCAgICAgU0lPQ1NJRk1UVSwgICAgIGlmcmVxX29mZnNldG9mKGlmcl9tdHUpIH0sCisJeyAiU0lGVFhRTEVOIiwgIFNJT0NTSUZUWFFMRU4sICBpZnJlcV9vZmZzZXRvZihpZnJfcWxlbikgfSwKKwl7ICJTSUZEU1RBRERSIiwgU0lPQ1NJRkRTVEFERFIsIGlmcmVxX29mZnNldG9mKGlmcl9kc3RhZGRyKSB9LAorCXsgIlNJRk5FVE1BU0siLCBTSU9DU0lGTkVUTUFTSywgaWZyZXFfb2Zmc2V0b2YoaWZyX25ldG1hc2spIH0sCisJeyAiU0lGQlJEQUREUiIsIFNJT0NTSUZCUkRBRERSLCBpZnJlcV9vZmZzZXRvZihpZnJfYnJvYWRhZGRyKSB9LAorI2lmIEVOQUJMRV9GRUFUVVJFX0lGQ09ORklHX0hXCisJeyAiU0lGSFdBRERSIiwgIFNJT0NTSUZIV0FERFIsICBpZnJlcV9vZmZzZXRvZihpZnJfaHdhZGRyKSB9LAorI2VuZGlmCisJeyAiU0lGRFNUQUREUiIsIFNJT0NTSUZEU1RBRERSLCBpZnJlcV9vZmZzZXRvZihpZnJfZHN0YWRkcikgfSwKKyNpZmRlZiBTSU9DU0tFRVBBTElWRQorCXsgIlNLRUVQQUxJVkUiLCBTSU9DU0tFRVBBTElWRSwgaWZyZXFfb2Zmc2V0b2YoaWZyX2RhdGEpIH0sCisjZW5kaWYKKyNpZmRlZiBTSU9DU09VVEZJTEwKKwl7ICJTT1VURklMTCIsICAgU0lPQ1NPVVRGSUxMLCAgIGlmcmVxX29mZnNldG9mKGlmcl9kYXRhKSB9LAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZDT05GSUdfTUVNU1RBUlRfSU9BRERSX0lSUQorCXsgIlNJRk1BUCIsICAgICBTSU9DU0lGTUFQLCAgICAgaWZyZXFfb2Zmc2V0b2YoaWZyX21hcC5tZW1fc3RhcnQpIH0sCisJeyAiU0lGTUFQIiwgICAgIFNJT0NTSUZNQVAsICAgICBpZnJlcV9vZmZzZXRvZihpZnJfbWFwLmJhc2VfYWRkcikgfSwKKwl7ICJTSUZNQVAiLCAgICAgU0lPQ1NJRk1BUCwgICAgIGlmcmVxX29mZnNldG9mKGlmcl9tYXAuaXJxKSB9LAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCXsgIlNJRkFERFIiLCAgICBTSU9DU0lGQUREUiwgICAgaWZyZXFfb2Zmc2V0b2YoaWZyX2FkZHIpIH0sIC8qIElQdjYgdmVyc2lvbiBpZ25vcmVzIHRoZSBvZmZzZXQgKi8KKwl7ICJESUZBRERSIiwgICAgU0lPQ0RJRkFERFIsICAgIGlmcmVxX29mZnNldG9mKGlmcl9hZGRyKSB9LCAvKiBJUHY2IHZlcnNpb24gaWdub3JlcyB0aGUgb2Zmc2V0ICovCisjZW5kaWYKKwkvKiBMYXN0IGVudHJ5IGlzIGZvciB1bm1hdGNoZWQgKGFzc3VtZWQgdG8gYmUgaG9zdG5hbWUvYWRkcmVzcykgYXJnLiAqLworCXsgIlNJRkFERFIiLCAgICBTSU9DU0lGQUREUiwgICAgaWZyZXFfb2Zmc2V0b2YoaWZyX2FkZHIpIH0sCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbnMgT3B0QXJyYXlbXSA9IHsKKwl7ICJtZXRyaWMiLCAgICAgIE5fQVJHLCAgICAgICAgIEFSR19NRVRSSUMsICAgICAgMCB9LAorCXsgIm10dSIsICAgICAgICAgTl9BUkcsICAgICAgICAgQVJHX01UVSwgICAgICAgICAwIH0sCisJeyAidHhxdWV1ZWxlbiIsICBOX0FSRywgICAgICAgICBBUkdfVFhRVUVVRUxFTiwgIDAgfSwKKwl7ICJkc3RhZGRyIiwgICAgIE5fQVJHLCAgICAgICAgIEFSR19EU1RBRERSLCAgICAgMCB9LAorCXsgIm5ldG1hc2siLCAgICAgTl9BUkcsICAgICAgICAgQVJHX05FVE1BU0ssICAgICAwIH0sCisJeyAiYnJvYWRjYXN0IiwgICBOX0FSRyB8IE1fQ0xSLCBBUkdfQlJPQURDQVNULCAgIElGRl9CUk9BRENBU1QgfSwKKyNpZiBFTkFCTEVfRkVBVFVSRV9JRkNPTkZJR19IVworCXsgImh3IiwgICAgICAgICAgTl9BUkcsICAgICAgICAgQVJHX0hXLCAgICAgICAgICAwIH0sCisjZW5kaWYKKwl7ICJwb2ludG9wb2ludCIsIE5fQVJHIHwgTV9DTFIsIEFSR19QT0lOVE9QT0lOVCwgSUZGX1BPSU5UT1BPSU5UIH0sCisjaWZkZWYgU0lPQ1NLRUVQQUxJVkUKKwl7ICJrZWVwYWxpdmUiLCAgIE5fQVJHLCAgICAgICAgIEFSR19LRUVQQUxJVkUsICAgMCB9LAorI2VuZGlmCisjaWZkZWYgU0lPQ1NPVVRGSUxMCisJeyAib3V0ZmlsbCIsICAgICBOX0FSRywgICAgICAgICBBUkdfT1VURklMTCwgICAgIDAgfSwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0lGQ09ORklHX01FTVNUQVJUX0lPQUREUl9JUlEKKwl7ICJtZW1fc3RhcnQiLCAgIE5fQVJHLCAgICAgICAgIEFSR19NRU1fU1RBUlQsICAgMCB9LAorCXsgImlvX2FkZHIiLCAgICAgTl9BUkcsICAgICAgICAgQVJHX0lPX0FERFIsICAgICAwIH0sCisJeyAiaXJxIiwgICAgICAgICBOX0FSRywgICAgICAgICBBUkdfSVJRLCAgICAgICAgIDAgfSwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwl7ICJhZGQiLCAgICAgICAgIE5fQVJHLCAgICAgICAgIEFSR19BRERfREVMLCAgICAgMCB9LAorCXsgImRlbCIsICAgICAgICAgTl9BUkcsICAgICAgICAgQVJHX0FERF9ERUwsICAgICAwIH0sCisjZW5kaWYKKwl7ICJhcnAiLCAgICAgICAgIE5fQ0xSIHwgTV9TRVQsIDAsICAgICAgICAgICAgICAgSUZGX05PQVJQIH0sCisJeyAidHJhaWxlcnMiLCAgICBOX0NMUiB8IE1fU0VULCAwLCAgICAgICAgICAgICAgIElGRl9OT1RSQUlMRVJTIH0sCisJeyAicHJvbWlzYyIsICAgICBOX1NFVCB8IE1fQ0xSLCAwLCAgICAgICAgICAgICAgIElGRl9QUk9NSVNDIH0sCisJeyAibXVsdGljYXN0IiwgICBOX1NFVCB8IE1fQ0xSLCAwLCAgICAgICAgICAgICAgIElGRl9NVUxUSUNBU1QgfSwKKwl7ICJhbGxtdWx0aSIsICAgIE5fU0VUIHwgTV9DTFIsIDAsICAgICAgICAgICAgICAgSUZGX0FMTE1VTFRJIH0sCisJeyAiZHluYW1pYyIsICAgICBOX1NFVCB8IE1fQ0xSLCAwLCAgICAgICAgICAgICAgIElGRl9EWU5BTUlDIH0sCisJeyAidXAiLCAgICAgICAgICBOX1NFVCwgICAgICAgICAwLCAgICAgICAgICAgICAgIChJRkZfVVAgfCBJRkZfUlVOTklORykgfSwKKwl7ICJkb3duIiwgICAgICAgIE5fQ0xSLCAgICAgICAgIDAsICAgICAgICAgICAgICAgSUZGX1VQIH0sCisJeyBOVUxMLCAgICAgICAgICAwLCAgICAgICAgICAgICBBUkdfSE9TVE5BTUUsICAgIChJRkZfVVAgfCBJRkZfUlVOTklORykgfQorfTsKKworaW50IGlmY29uZmlnX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBpZmNvbmZpZ19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2FpOworI2lmIEVOQUJMRV9GRUFUVVJFX0lGQ09ORklHX0hXCisJc3RydWN0IHNvY2thZGRyIHNhOworI2VuZGlmCisJY29uc3Qgc3RydWN0IGFyZzFvcHQgKmExb3A7CisJY29uc3Qgc3RydWN0IG9wdGlvbnMgKm9wOworCWludCBzb2NrZmQ7CQkJLyogc29ja2V0IGZkIHdlIHVzZSB0byBtYW5pcHVsYXRlIHN0dWZmIHdpdGggKi8KKwlpbnQgc2VsZWN0b3I7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZDT05GSUdfQlJPQURDQVNUX1BMVVMKKwl1bnNpZ25lZCBpbnQgbWFzazsKKwl1bnNpZ25lZCBpbnQgZGlkX2ZsYWdzOworCXVuc2lnbmVkIGludCBzYWlfaG9zdG5hbWUsIHNhaV9uZXRtYXNrOworI2Vsc2UKKwl1bnNpZ25lZCBjaGFyIG1hc2s7CisJdW5zaWduZWQgY2hhciBkaWRfZmxhZ3M7CisjZW5kaWYKKwljaGFyICpwOworCS8qY2hhciBob3N0WzEyOF07Ki8KKwljb25zdCBjaGFyICpob3N0ID0gTlVMTDsgLyogbWFrZSBnY2MgaGFwcHkgKi8KKworCWRpZF9mbGFncyA9IDA7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZDT05GSUdfQlJPQURDQVNUX1BMVVMKKwlzYWlfaG9zdG5hbWUgPSAwOworCXNhaV9uZXRtYXNrID0gMDsKKyNlbmRpZgorCisJLyogc2tpcCBhcmd2WzBdICovCisJKythcmd2OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZDT05GSUdfU1RBVFVTCisJaWYgKGFyZ3ZbMF0gJiYgKGFyZ3ZbMF1bMF0gPT0gJy0nICYmIGFyZ3ZbMF1bMV0gPT0gJ2EnICYmICFhcmd2WzBdWzJdKSkgeworCQlpbnRlcmZhY2Vfb3B0X2EgPSAxOworCQkrK2FyZ3Y7CisJfQorI2VuZGlmCisKKwlpZiAoIWFyZ3ZbMF0gfHwgIWFyZ3ZbMV0pIHsgLyogb25lIG9yIG5vIGFyZ3MgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9JRkNPTkZJR19TVEFUVVMKKwkJcmV0dXJuIGRpc3BsYXlfaW50ZXJmYWNlcyhhcmd2WzBdIC8qIGNhbiBiZSBOVUxMICovKTsKKyNlbHNlCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyBzdXBwb3J0IGZvciBzdGF0dXMgZGlzcGxheSIpOworI2VuZGlmCisJfQorCisJLyogQ3JlYXRlIGEgY2hhbm5lbCB0byB0aGUgTkVUIGtlcm5lbC4gKi8KKwlzb2NrZmQgPSB4c29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCisJLyogZ2V0IGludGVyZmFjZSBuYW1lICovCisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsICphcmd2KTsKKworCS8qIFByb2Nlc3MgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMuICovCisJd2hpbGUgKCorK2FyZ3YgIT0gTlVMTCkgeworCQlwID0gKmFyZ3Y7CisJCW1hc2sgPSBOX01BU0s7CisJCWlmICgqcCA9PSAnLScpIHsJLyogSWYgdGhlIGFyZyBzdGFydHMgd2l0aCAnLScuLi4gKi8KKwkJCSsrcDsJCS8qICAgIGFkdmFuY2UgcGFzdCBpdCBhbmQgKi8KKwkJCW1hc2sgPSBNX01BU0s7CS8qICAgIHNldCB0aGUgYXBwcm9wcmlhdGUgbWFzay4gKi8KKwkJfQorCQlmb3IgKG9wID0gT3B0QXJyYXk7IG9wLT5uYW1lOyBvcCsrKSB7CS8qIEZpbmQgdGFibGUgZW50cnkuICovCisJCQlpZiAoc3RyY21wKHAsIG9wLT5uYW1lKSA9PSAwKSB7CS8qIElmIG5hbWUgbWF0Y2hlcy4uLiAqLworCQkJCW1hc2sgJj0gb3AtPmZsYWdzOworCQkJCWlmIChtYXNrKQkvKiBzZXQgdGhlIG1hc2sgYW5kIGdvLiAqLworCQkJCQlnb3RvIEZPVU5EX0FSRzsKKwkJCQkvKiBJZiB3ZSBnZXQgaGVyZSwgdGhlcmUgd2FzIGEgdmFsaWQgYXJnIHdpdGggYW4gKi8KKwkJCQkvKiBpbnZhbGlkICctJyBwcmVmaXguICovCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZDogJyVzJyIsIHAtMSk7CisJCQl9CisJCX0KKworCQkvKiBXZSBmZWxsIHRocm91Z2gsIHNvIHRyZWF0IGFzIHBvc3NpYmxlIGhvc3RuYW1lLiAqLworCQlhMW9wID0gQXJnMU9wdCArIEFSUkFZX1NJWkUoQXJnMU9wdCkgLSAxOworCQltYXNrID0gb3AtPmFyZ19mbGFnczsKKwkJZ290byBIT1NUTkFNRTsKKworIEZPVU5EX0FSRzoKKwkJaWYgKG1hc2sgJiBBUkdfTUFTSykgeworCQkJbWFzayA9IG9wLT5hcmdfZmxhZ3M7CisJCQlpZiAobWFzayAmIEFfTkVUTUFTSyAmIGRpZF9mbGFncykKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCQlhMW9wID0gQXJnMU9wdCArIChvcCAtIE9wdEFycmF5KTsKKwkJCWlmICgqKythcmd2ID09IE5VTEwpIHsKKwkJCQlpZiAobWFzayAmIEFfQVJHX1JFUSkKKwkJCQkJYmJfc2hvd191c2FnZSgpOworCQkJCS0tYXJndjsKKwkJCQltYXNrICY9IEFfU0VUX0FGVEVSOwkvKiBqdXN0IGZvciBicm9hZGNhc3QgKi8KKwkJCX0gZWxzZSB7CS8qIGdvdCBhbiBhcmcgc28gcHJvY2VzcyBpdCAqLworIEhPU1ROQU1FOgorCQkJCWRpZF9mbGFncyB8PSAobWFzayAmIChBX05FVE1BU0t8QV9IT1NUTkFNRSkpOworCQkJCWlmIChtYXNrICYgQV9DQVNUX0hPU1RfQ09QWSkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0lGQ09ORklHX0hXCisJCQkJCWlmIChtYXNrICYgQV9DQVNUX1JFU09MVkUpIHsKKyNlbmRpZgorCQkJCQkJaG9zdCA9ICphcmd2OworCQkJCQkJaWYgKHN0cmNtcChob3N0LCAiaW5ldCIpID09IDApCisJCQkJCQkJY29udGludWU7IC8qIGNvbXBhdCBzdHVmZiAqLworCQkJCQkJc2FpLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJCQkJc2FpLnNpbl9wb3J0ID0gMDsKKwkJCQkJCWlmIChzdHJjbXAoaG9zdCwgImRlZmF1bHQiKSA9PSAwKSB7CisJCQkJCQkJLyogRGVmYXVsdCBpcyBzcGVjaWFsLCBtZWFuaW5nIDAuMC4wLjAuICovCisJCQkJCQkJc2FpLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisJCQkJCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZDT05GSUdfQlJPQURDQVNUX1BMVVMKKwkJCQkJCWVsc2UgaWYgKChob3N0WzBdID09ICcrJyAmJiAhaG9zdFsxXSkKKwkJCQkJCSAmJiAobWFzayAmIEFfQlJPQURDQVNUKQorCQkJCQkJICYmIChkaWRfZmxhZ3MgJiAoQV9ORVRNQVNLfEFfSE9TVE5BTUUpKSA9PSAoQV9ORVRNQVNLfEFfSE9TVE5BTUUpCisJCQkJCQkpIHsKKwkJCQkJCQkvKiArIGlzIHNwZWNpYWwsIG1lYW5pbmcgYnJvYWRjYXN0IGlzIGRlcml2ZWQuICovCisJCQkJCQkJc2FpLnNpbl9hZGRyLnNfYWRkciA9ICh+c2FpX25ldG1hc2spIHwgKHNhaV9ob3N0bmFtZSAmIHNhaV9uZXRtYXNrKTsKKwkJCQkJCX0KKyNlbmRpZgorCQkJCQkJZWxzZSB7CisJCQkJCQkJbGVuX2FuZF9zb2NrYWRkciAqbHNhOworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkJCQkJCQljaGFyICpwcmVmaXg7CisJCQkJCQkJaW50IHByZWZpeF9sZW4gPSAwOworCQkJCQkJCXByZWZpeCA9IHN0cmNocihob3N0LCAnLycpOworCQkJCQkJCWlmIChwcmVmaXgpIHsKKwkJCQkJCQkJcHJlZml4X2xlbiA9IHhhdG91X3JhbmdlKHByZWZpeCArIDEsIDAsIDEyOCk7CisJCQkJCQkJCSpwcmVmaXggPSAnXDAnOworCQkJCQkJCX0KKyByZXNvbHZlOgorI2VuZGlmCisJCQkJCQkJbHNhID0geGhvc3Qyc29ja2FkZHIoaG9zdCwgMCk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCQkJCQkJCWlmIChsc2EtPnUuc2Euc2FfZmFtaWx5ICE9IEFGX0lORVQ2ICYmIHByZWZpeCkgeworLyogVE9ETzogd2UgZG8gbm90IHN1cHBvcnQgImlmY29uZmlnIGV0aDAgdXAgMS4yLjMuNC8xNyIuCisgKiBGb3Igbm93LCBqdXN0IG1ha2UgaXQgZmFpbCBpbnN0ZWFkIG9mIHNpbGVudGx5IGlnbm9yaW5nICIvMTciIHBhcnQ6CisgKi8KKwkJCQkJCQkJKnByZWZpeCA9ICcvJzsKKwkJCQkJCQkJZ290byByZXNvbHZlOworCQkJCQkJCX0KKwkJCQkJCQlpZiAobHNhLT51LnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQkJCQkJCQlpbnQgc29ja2ZkNjsKKwkJCQkJCQkJc3RydWN0IGluNl9pZnJlcSBpZnI2OworCisJCQkJCQkJCXNvY2tmZDYgPSB4c29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsKKwkJCQkJCQkJeGlvY3RsKHNvY2tmZDYsIFNJT0NHSUZJTkRFWCwgJmlmcik7CisJCQkJCQkJCWlmcjYuaWZyNl9pZmluZGV4ID0gaWZyLmlmcl9pZmluZGV4OworCQkJCQkJCQlpZnI2LmlmcjZfcHJlZml4bGVuID0gcHJlZml4X2xlbjsKKwkJCQkJCQkJbWVtY3B5KCZpZnI2LmlmcjZfYWRkciwKKwkJCQkJCQkJCQkmbHNhLT51LnNpbjYuc2luNl9hZGRyLAorCQkJCQkJCQkJCXNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKwkJCQkJCQkJaW9jdGxfb3JfcGVycm9yX2FuZF9kaWUoc29ja2ZkNiwgYTFvcC0+c2VsZWN0b3IsICZpZnI2LCAiU0lPQyVzIiwgYTFvcC0+bmFtZSk7CisJCQkJCQkJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCQkJCQkJCWZyZWUobHNhKTsKKwkJCQkJCQkJY29udGludWU7CisJCQkJCQkJfQorI2VuZGlmCisJCQkJCQkJc2FpLnNpbl9hZGRyID0gbHNhLT51LnNpbi5zaW5fYWRkcjsKKwkJCQkJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJCQkJCWZyZWUobHNhKTsKKwkJCQkJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9JRkNPTkZJR19CUk9BRENBU1RfUExVUworCQkJCQkJaWYgKG1hc2sgJiBBX0hPU1ROQU1FKQorCQkJCQkJCXNhaV9ob3N0bmFtZSA9IHNhaS5zaW5fYWRkci5zX2FkZHI7CisJCQkJCQlpZiAobWFzayAmIEFfTkVUTUFTSykKKwkJCQkJCQlzYWlfbmV0bWFzayA9IHNhaS5zaW5fYWRkci5zX2FkZHI7CisjZW5kaWYKKwkJCQkJCXAgPSAoY2hhciAqKSAmc2FpOworI2lmIEVOQUJMRV9GRUFUVVJFX0lGQ09ORklHX0hXCisJCQkJCX0gZWxzZSB7CS8qIEFfQ0FTVF9IT1NUX0NPUFlfSU5fRVRIRVIgKi8KKwkJCQkJCS8qIFRoaXMgaXMgdGhlICJodyIgYXJnIGNhc2UuICovCisJCQkJCQlzbWFsbHVpbnQgaHdfY2xhc3MgPSBpbmRleF9pbl9zdWJzdHJpbmdzKCJldGhlclwwIgorCQkJCQkJCQlJRl9GRUFUVVJFX0hXSUIoImluZmluaWJhbmRcMCIpLCAqYXJndikgKyAxOworCQkJCQkJaWYgKCFod19jbGFzcyB8fCAhKisrYXJndikKKwkJCQkJCQliYl9zaG93X3VzYWdlKCk7CisJCQkJCQlob3N0ID0gKmFyZ3Y7CisJCQkJCQlpZiAoaHdfY2xhc3MgPT0gMSA/IGluX2V0aGVyKGhvc3QsICZzYSkgOiBpbl9pYihob3N0LCAmc2EpKQorCQkJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIGh3LWFkZHIgJXMiLCBob3N0KTsKKwkJCQkJCXAgPSAoY2hhciAqKSAmc2E7CisJCQkJCX0KKyNlbmRpZgorCQkJCQltZW1jcHkoICgoY2hhciAqKSZpZnIpICsgYTFvcC0+aWZyX29mZnNldCwKKwkJCQkJCXAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBGSVhNRTogZXJyb3IgY2hlY2s/PyAqLworCQkJCQl1bnNpZ25lZCBsb25nIGkgPSBzdHJ0b3VsKCphcmd2LCBOVUxMLCAwKTsKKwkJCQkJcCA9ICgoY2hhciAqKSZpZnIpICsgYTFvcC0+aWZyX29mZnNldDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JRkNPTkZJR19NRU1TVEFSVF9JT0FERFJfSVJRCisJCQkJCWlmIChtYXNrICYgQV9NQVBfVFlQRSkgeworCQkJCQkJeGlvY3RsKHNvY2tmZCwgU0lPQ0dJRk1BUCwgJmlmcik7CisJCQkJCQlpZiAoKG1hc2sgJiBBX01BUF9VQ0hBUikgPT0gQV9NQVBfVUNIQVIpCisJCQkJCQkJKih1bnNpZ25lZCBjaGFyICopIHAgPSBpOworCQkJCQkJZWxzZSBpZiAobWFzayAmIEFfTUFQX1VTSE9SVCkKKwkJCQkJCQkqKHVuc2lnbmVkIHNob3J0ICopIHAgPSBpOworCQkJCQkJZWxzZQorCQkJCQkJCSoodW5zaWduZWQgbG9uZyAqKSBwID0gaTsKKwkJCQkJfSBlbHNlCisjZW5kaWYKKwkJCQkJaWYgKG1hc2sgJiBBX0NBU1RfQ0hBUl9QVFIpCisJCQkJCQkqKGNhZGRyX3QgKikgcCA9IChjYWRkcl90KSBpOworCQkJCQllbHNlCS8qIEFfQ0FTVF9JTlQgKi8KKwkJCQkJCSooaW50ICopIHAgPSBpOworCQkJCX0KKworCQkJCWlvY3RsX29yX3BlcnJvcl9hbmRfZGllKHNvY2tmZCwgYTFvcC0+c2VsZWN0b3IsICZpZnIsICJTSU9DJXMiLCBhMW9wLT5uYW1lKTsKKyNpZmRlZiBRVUVTVElPTkFCTEVfQUxJQVNfQ0FTRQorCQkJCWlmIChtYXNrICYgQV9DT0xPTl9DSEspIHsKKwkJCQkJLyoKKwkJCQkJICogRG9uJ3QgZG8gdGhlIHNldF9mbGFnKCkgaWYgdGhlIGFkZHJlc3MgaXMgYW4gYWxpYXMgd2l0aAorCQkJCQkgKiBhICctJyBhdCB0aGUgZW5kLCBzaW5jZSBpdCdzIGRlbGV0ZWQgYWxyZWFkeSEgLSBSb21hbgorCQkJCQkgKgorCQkJCQkgKiBTaG91bGQgcmVhbGx5IHVzZSByZWdleC5oIGhlcmUsIG5vdCBzdXJlIHRob3VnaCBob3cgd2VsbAorCQkJCQkgKiBpdCdsbCBnbyB3aXRoIHRoZSBjcm9zcy1wbGF0Zm9ybSBzdXBwb3J0IGV0Yy4KKwkJCQkJICovCisJCQkJCWNoYXIgKnB0cjsKKwkJCQkJc2hvcnQgaW50IGZvdW5kX2NvbG9uID0gMDsKKwkJCQkJZm9yIChwdHIgPSBpZnIuaWZyX25hbWU7ICpwdHI7IHB0cisrKQorCQkJCQkJaWYgKCpwdHIgPT0gJzonKQorCQkJCQkJCWZvdW5kX2NvbG9uKys7CisJCQkJCWlmIChmb3VuZF9jb2xvbiAmJiBwdHJbLTFdID09ICctJykKKwkJCQkJCWNvbnRpbnVlOworCQkJCX0KKyNlbmRpZgorCQkJfQorCQkJaWYgKCEobWFzayAmIEFfU0VUX0FGVEVSKSkKKwkJCQljb250aW51ZTsKKwkJCW1hc2sgPSBOX1NFVDsKKwkJfSAvKiBpZiAobWFzayAmIEFSR19NQVNLKSAqLworCisJCXhpb2N0bChzb2NrZmQsIFNJT0NHSUZGTEFHUywgJmlmcik7CisJCXNlbGVjdG9yID0gb3AtPnNlbGVjdG9yOworCQlpZiAobWFzayAmIFNFVF9NQVNLKQorCQkJaWZyLmlmcl9mbGFncyB8PSBzZWxlY3RvcjsKKwkJZWxzZQorCQkJaWZyLmlmcl9mbGFncyAmPSB+c2VsZWN0b3I7CisJCXhpb2N0bChzb2NrZmQsIFNJT0NTSUZGTEFHUywgJmlmcik7CisJfSAvKiB3aGlsZSAoKSAqLworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShzb2NrZmQpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9pZmVuc2xhdmUuYyBiL25ldHdvcmtpbmcvaWZlbnNsYXZlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyMzRhZAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvaWZlbnNsYXZlLmMKQEAgLTAsMCArMSw2MTcgQEAKKy8qIE1vZGU6IEM7CisgKgorICogTWluaSBpZmVuc2xhdmUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqIENvcHlyaWdodCAoQykgMjAwNSBieSBNYXJjIExlZW1hbiA8bWFyYy5sZWVtYW5AYmFyY28uY29tPgorICoKKyAqIGlmZW5zbGF2ZS5jOiBDb25maWd1cmUgbmV0d29yayBpbnRlcmZhY2VzIGZvciBwYXJhbGxlbCByb3V0aW5nLgorICoKKyAqICAgICAgVGhpcyBwcm9ncmFtIGNvbnRyb2xzIHRoZSBMaW51eCBpbXBsZW1lbnRhdGlvbiBvZiBydW5uaW5nIG11bHRpcGxlCisgKiAgICAgIG5ldHdvcmsgaW50ZXJmYWNlcyBpbiBwYXJhbGxlbC4KKyAqCisgKiBBdXRob3I6ICAgICAgRG9uYWxkIEJlY2tlciA8YmVja2VyQGNlc2Rpcy5nc2ZjLm5hc2EuZ292PgorICogICAgICAgICAgICAgIENvcHlyaWdodCAxOTk0LTE5OTYgRG9uYWxkIEJlY2tlcgorICoKKyAqICAgICAgICAgICAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQKKyAqICAgICAgICAgICAgICBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiAgICAgICAgICAgICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyAqCisgKiAgICAgIFRoZSBhdXRob3IgbWF5IGJlIHJlYWNoZWQgYXMgYmVja2VyQENFU0RJUy5nc2ZjLm5hc2EuZ292LCBvciBDL08KKyAqICAgICAgQ2VudGVyIG9mIEV4Y2VsbGVuY2UgaW4gU3BhY2UgRGF0YSBhbmQgSW5mb3JtYXRpb24gU2NpZW5jZXMKKyAqICAgICAgICAgQ29kZSA5MzAuNSwgR29kZGFyZCBTcGFjZSBGbGlnaHQgQ2VudGVyLCBHcmVlbmJlbHQgTUQgMjA3NzEKKyAqCisgKiAgQ2hhbmdlcyA6CisgKiAgICAtIDIwMDAvMTAvMDIgV2lsbHkgVGFycmVhdSA8d2lsbHkgYXQgbWV0YS14Lm9yZz4gOgorICogICAgICAgLSBmZXcgZml4ZXMuIE1hc3RlcidzIE1BQyBhZGRyZXNzIGlzIG5vdyBjb3JyZWN0bHkgdGFrZW4gZnJvbQorICogICAgICAgICB0aGUgZmlyc3QgZGV2aWNlIHdoZW4gbm90IHByZXZpb3VzbHkgc2V0IDsKKyAqICAgICAgIC0gZGV0YWNoIHN1cHBvcnQgOiBjYWxsIEJPTkRfUkVMRUFTRSB0byBkZXRhY2ggYW4gZW5zbGF2ZWQgaW50ZXJmYWNlLgorICogICAgICAgLSBnaXZlIGEgbWluaS1ob3d0byBmcm9tIGNvbW1hbmQtbGluZSBoZWxwIDogIyBpZmVuc2xhdmUgLWgKKyAqCisgKiAgICAtIDIwMDEvMDIvMTYgQ2hhZCBOLiBUaW5kZWwgPGN0aW5kZWwgYXQgaWVlZSBkb3Qgb3JnPiA6CisgKiAgICAgICAtIE1hc3RlciBpcyBub3cgYnJvdWdodCBkb3duIGJlZm9yZSBzZXR0aW5nIHRoZSBNQUMgYWRkcmVzcy4gIEluCisgKiAgICAgICAgIHRoZSAyLjQga2VybmVsIHlvdSBjYW4ndCBjaGFuZ2UgdGhlIE1BQyBhZGRyZXNzIHdoaWxlIHRoZSBkZXZpY2UgaXMKKyAqICAgICAgICAgdXAgYmVjYXVzZSB5b3UgZ2V0IEVCVVNZLgorICoKKyAqICAgIC0gMjAwMS8wOS8xMyBUYWthbyBJbmRvaCA8aW5kb3UgZG90IHRha2FvIGF0IGpwIGRvdCBmdWppdHN1IGRvdCBjb20+CisgKiAgICAgICAtIEFkZGVkIHRoZSBhYmlsaXR5IHRvIGNoYW5nZSB0aGUgYWN0aXZlIGludGVyZmFjZSBvbiBhIG1vZGUgMSBib25kCisgKiAgICAgICAgIGF0IHJ1bnRpbWUuCisgKgorICogICAgLSAyMDAxLzEwLzIzIENoYWQgTi4gVGluZGVsIDxjdGluZGVsIGF0IGllZWUgZG90IG9yZz4gOgorICogICAgICAgLSBObyBsb25nZXIgc2V0IHRoZSBNQUMgYWRkcmVzcyBvZiB0aGUgbWFzdGVyLiAgVGhlIGJvbmQgZGV2aWNlIHdpbGwKKyAqICAgICAgICAgdGFrZSBjYXJlIG9mIHRoaXMgaXRzZWxmCisgKiAgICAgICAtIFRyeSB0aGUgU0lPQyoqKiB2ZXJzaW9ucyBvZiB0aGUgYm9uZGluZyBpb2N0bHMgYmVmb3JlIHVzaW5nIHRoZQorICogICAgICAgICBvbGQgdmVyc2lvbnMKKyAqICAgIC0gMjAwMi8wMi8xOCBFcmlrIEhhYmJpbmdhIDxlcmlrX2hhYmJpbmdhIEAgaHAgZG90IGNvbT4gOgorICogICAgICAgLSBpZnIyLmlmcl9mbGFncyB3YXMgbm90IGluaXRpYWxpemVkIGluIHRoZSBod2FkZHJfbm90c2V0IGNhc2UsCisgKiAgICAgICAgIFNJT0NHSUZGTEFHUyBub3cgY2FsbGVkIGJlZm9yZSBod2FkZHJfbm90c2V0IHRlc3QKKyAqCisgKiAgICAtIDIwMDIvMTAvMzEgVG9ueSBDdXJlaW5ndG9uIDx0b255LmN1cmVpbmd0b24gKiBocF9jb20+IDoKKyAqICAgICAgIC0gSWYgdGhlIG1hc3RlciBkb2VzIG5vdCBoYXZlIGEgaGFyZHdhcmUgYWRkcmVzcyB3aGVuIHRoZSBmaXJzdCBzbGF2ZQorICogICAgICAgICBpcyBlbnNsYXZlZCwgdGhlIG1hc3RlciBpcyBhc3NpZ25lZCB0aGUgaGFyZHdhcmUgYWRkcmVzcyBvZiB0aGF0CisgKiAgICAgICAgIHNsYXZlIC0gdGhlcmUgaXMgYSBjb21tZW50IGluIGJvbmRpbmcuYyBzdGF0aW5nICJpZmVuc2xhdmUgdGFrZXMKKyAqICAgICAgICAgY2FyZSBvZiB0aGlzIG5vdy4iIFRoaXMgY29ycmVjdHMgdGhlIHByb2JsZW0gb2Ygc2xhdmVzIGhhdmluZworICogICAgICAgICBkaWZmZXJlbnQgaGFyZHdhcmUgYWRkcmVzc2VzIGluIGFjdGl2ZS1iYWNrdXAgbW9kZSB3aGVuCisgKiAgICAgICAgIG11bHRpcGxlIGludGVyZmFjZXMgYXJlIHNwZWNpZmllZCBvbiBhIHNpbmdsZSBpZmVuc2xhdmUgY29tbWFuZAorICogICAgICAgICAoaWZlbnNsYXZlIGJvbmQwIGV0aDAgZXRoMSkuCisgKgorICogICAgLSAyMDAzLzAzLzE4IC0gVHNpcHB5IE1lbmRlbHNvbiA8dHNpcHB5Lm1lbmRlbHNvbiBhdCBpbnRlbCBkb3QgY29tPiBhbmQKKyAqICAgICAgICAgICAgICAgICAgIFNobXVsaWsgSGVuIDxzaG11bGlrLmhlbiBhdCBpbnRlbCBkb3QgY29tPgorICogICAgICAgLSBNb3ZlZCBzZXR0aW5nIHRoZSBzbGF2ZSdzIG1hYyBhZGRyZXNzIGFuZCBvcGVubmluZyBpdCwgZnJvbQorICogICAgICAgICB0aGUgYXBwbGljYXRpb24gdG8gdGhlIGRyaXZlci4gVGhpcyBlbmFibGVzIHN1cHBvcnQgb2YgbW9kZXMKKyAqICAgICAgICAgdGhhdCBuZWVkIHRvIHVzZSB0aGUgdW5pcXVlIG1hYyBhZGRyZXNzIG9mIGVhY2ggc2xhdmUuCisgKiAgICAgICAgIFRoZSBkcml2ZXIgYWxzbyB0YWtlcyBjYXJlIG9mIGNsb3NpbmcgdGhlIHNsYXZlIGFuZCByZXN0b3JpbmcgaXRzCisgKiAgICAgICAgIG9yaWdpbmFsIG1hYyBhZGRyZXNzIHVwb24gcmVsZWFzZS4KKyAqICAgICAgICAgSW4gYWRkaXRpb24sIGJsb2NrIHBvc3NpYmlsaXR5IG9mIGVuc2xhdmluZyBiZWZvcmUgdGhlIG1hc3RlciBpcyB1cC4KKyAqICAgICAgICAgVGhpcyBwcmV2ZW50cyBwdXR0aW5nIHRoZSBzeXN0ZW0gaW4gYW4gdW5kZWZpbmVkIHN0YXRlLgorICoKKyAqICAgIC0gMjAwMy8wNS8wMSAtIEFtaXIgTm9hbSA8YW1pci5ub2FtIGF0IGludGVsIGRvdCBjb20+CisgKiAgICAgICAtIEFkZGVkIEFCSSB2ZXJzaW9uIGNvbnRyb2wgdG8gcmVzdG9yZSBjb21wYXRpYmlsaXR5IGJldHdlZW4KKyAqICAgICAgICAgbmV3L29sZCBpZmVuc2xhdmUgYW5kIG5ldy9vbGQgYm9uZGluZy4KKyAqICAgICAgIC0gUHJldmVudCBhZGRpbmcgYW4gYWRhcHRlciB0aGF0IGlzIGFscmVhZHkgYSBzbGF2ZS4KKyAqICAgICAgICAgRml4ZXMgdGhlIHByb2JsZW0gb2Ygc3RhbGxpbmcgdGhlIHRyYW5zbWlzc2lvbiBhbmQgbGVhdmluZworICogICAgICAgICB0aGUgc2xhdmUgaW4gYSBkb3duIHN0YXRlLgorICoKKyAqICAgIC0gMjAwMy8wNS8wMSAtIFNobXVsaWsgSGVuIDxzaG11bGlrLmhlbiBhdCBpbnRlbCBkb3QgY29tPgorICogICAgICAgLSBQcmV2ZW50IGVuc2xhdmluZyBpZiB0aGUgYm9uZCBkZXZpY2UgaXMgZG93bi4KKyAqICAgICAgICAgRml4ZXMgdGhlIHByb2JsZW0gb2YgbGVhdmluZyB0aGUgc3lzdGVtIGluIHVuc3RhYmxlIHN0YXRlIGFuZAorICogICAgICAgICBoYWx0aW5nIHdoZW4gdHJ5aW5nIHRvIHJlbW92ZSB0aGUgbW9kdWxlLgorICogICAgICAgLSBDbG9zZSBzb2NrZXQgb24gYWxsIGFibm9ybWFsIGV4aXN0cy4KKyAqICAgICAgIC0gQWRkIHZlcnNpb25pbmcgc2NoZW1lIHRoYXQgZm9sbG93cyB0aGF0IG9mIHRoZSBib25kaW5nIGRyaXZlci4KKyAqICAgICAgICAgY3VycmVudCB2ZXJzaW9uIGlzIDEuMC4wIGFzIGEgYmFzZSBsaW5lLgorICoKKyAqICAgIC0gMjAwMy8wNS8yMiAtIEpheSBWb3NidXJnaCA8ZnViYXIgYXQgdXMgZG90IGlibSBkb3QgY29tPgorICogICAgICAgLSBpZmVuc2xhdmUgLWMgd2FzIGJyb2tlbjsgaXQncyBub3cgZml4ZWQKKyAqICAgICAgIC0gRml4ZWQgcHJvYmxlbSB3aXRoIHJvdXRlcyB2YW5pc2hpbmcgZnJvbSBtYXN0ZXIgZHVyaW5nIGVuc2xhdmUKKyAqICAgICAgICAgcHJvY2Vzc2luZy4KKyAqCisgKiAgICAtIDIwMDMvMDUvMjcgLSBBbWlyIE5vYW0gPGFtaXIubm9hbSBhdCBpbnRlbCBkb3QgY29tPgorICogICAgICAgLSBGaXggYmFja3dhcmQgY29tcGF0aWJpbGl0eSBpc3N1ZXM6CisgKiAgICAgICAgIEZvciBkcml2ZXJzIG5vdCB1c2luZyBBQkkgdmVyc2lvbnMsIHNsYXZlIHdhcyBzZXQgZG93biB3aGlsZQorICogICAgICAgICBpdCBzaG91bGQgYmUgbGVmdCB1cCBiZWZvcmUgZW5zbGF2aW5nLgorICogICAgICAgICBBbHNvLCBtYXN0ZXIgd2FzIG5vdCBzZXQgZG93biBhbmQgdGhlIGRlZmF1bHQgc2V0X21hY19hZGRyZXNzKCkKKyAqICAgICAgICAgd291bGQgZmFpbCBhbmQgZ2VuZXJhdGUgYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGUgc3lzdGVtIGxvZy4KKyAqICAgICAgIC0gRm9yIG9wdF9jOiBzbGF2ZSBzaG91bGQgbm90IGJlIHNldCB0byB0aGUgbWFzdGVyJ3Mgc2V0dGluZworICogICAgICAgICB3aGlsZSBpdCBpcyBydW5uaW5nLiBJdCB3YXMgYWxyZWFkeSBzZXQgZHVyaW5nIGVuc2xhdmUuIFRvCisgKiAgICAgICAgIHNpbXBsaWZ5IHRoaW5ncywgaXQgaXMgbm93IGhhbmRlbGVkIHNlcGFyYXRlbHkuCisgKgorICogICAgLSAyMDAzLzEyLzAxIC0gU2htdWxpayBIZW4gPHNobXVsaWsuaGVuIGF0IGludGVsIGRvdCBjb20+CisgKiAgICAgICAtIENvZGUgY2xlYW51cCBhbmQgc3R5bGUgY2hhbmdlcworICogICAgICAgICBzZXQgdmVyc2lvbiB0byAxLjEuMAorICovCisKKy8vdXNhZ2U6I2RlZmluZSBpZmVuc2xhdmVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstY2RmXSBNQVNURVJfSUZBQ0UgU0xBVkVfSUZBQ0UuLi4iCisvL3VzYWdlOiNkZWZpbmUgaWZlbnNsYXZlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ29uZmlndXJlIG5ldHdvcmsgaW50ZXJmYWNlcyBmb3IgcGFyYWxsZWwgcm91dGluZ1xuIgorLy91c2FnZTogICAgICJcbgktYywtLWNoYW5nZS1hY3RpdmUJQ2hhbmdlIGFjdGl2ZSBzbGF2ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWQsLS1kZXRhY2gJCVJlbW92ZSBzbGF2ZSBpbnRlcmZhY2UgZnJvbSBib25kaW5nIGRldmljZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWYsLS1mb3JjZQkJRm9yY2UsIGV2ZW4gaWYgaW50ZXJmYWNlIGlzIG5vdCBFdGhlcm5ldCIKKy8qIC8vdXNhZ2U6ICAiXG4JLXIsLS1yZWNlaXZlLXNsYXZlCUNyZWF0ZSBhIHJlY2VpdmUtb25seSBzbGF2ZSIgKi8KKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgaWZlbnNsYXZlX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJUbyBjcmVhdGUgYSBib25kIGRldmljZSwgc2ltcGx5IGZvbGxvdyB0aGVzZSB0aHJlZSBzdGVwczpcbiIKKy8vdXNhZ2U6ICAgICAgICItIGVuc3VyZSB0aGF0IHRoZSByZXF1aXJlZCBkcml2ZXJzIGFyZSBwcm9wZXJseSBsb2FkZWQ6XG4iCisvL3VzYWdlOiAgICAgICAiICAjIG1vZHByb2JlIGJvbmRpbmcgOyBtb2Rwcm9iZSA8M2M1OXh8ZWVwcm8xMDB8cGNuZXQzMnx0dWxpcHwuLi4+XG4iCisvL3VzYWdlOiAgICAgICAiLSBhc3NpZ24gYW4gSVAgYWRkcmVzcyB0byB0aGUgYm9uZCBkZXZpY2U6XG4iCisvL3VzYWdlOiAgICAgICAiICAjIGlmY29uZmlnIGJvbmQwIDxhZGRyPiBuZXRtYXNrIDxtYXNrPiBicm9hZGNhc3QgPGJjYXN0PlxuIgorLy91c2FnZTogICAgICAgIi0gYXR0YWNoIGFsbCB0aGUgaW50ZXJmYWNlcyB5b3UgbmVlZCB0byB0aGUgYm9uZCBkZXZpY2U6XG4iCisvL3VzYWdlOiAgICAgICAiICAjIGlmZW5zbGF2ZSBib25kMCBldGgwIGV0aDEgZXRoMlxuIgorLy91c2FnZTogICAgICAgIiAgSWYgYm9uZDAgZGlkbid0IGhhdmUgYSBNQUMgYWRkcmVzcywgaXQgd2lsbCB0YWtlIGV0aDAncy4gVGhlbiwgYWxsXG4iCisvL3VzYWdlOiAgICAgICAiICBpbnRlcmZhY2VzIGF0dGFjaGVkIEFGVEVSIHRoaXMgYXNzaWdubWVudCB3aWxsIGdldCB0aGUgc2FtZSBNQUMgYWRkci5cblxuIgorLy91c2FnZTogICAgICAgIiAgVG8gZGV0YWNoIGEgZGVhZCBpbnRlcmZhY2Ugd2l0aG91dCBzZXR0aW5nIHRoZSBib25kIGRldmljZSBkb3duOlxuIgorLy91c2FnZTogICAgICAgIiAgIyBpZmVuc2xhdmUgLWQgYm9uZDAgZXRoMVxuXG4iCisvL3VzYWdlOiAgICAgICAiICBUbyBzZXQgdGhlIGJvbmQgZGV2aWNlIGRvd24gYW5kIGF1dG9tYXRpY2FsbHkgcmVsZWFzZSBhbGwgdGhlIHNsYXZlczpcbiIKKy8vdXNhZ2U6ICAgICAgICIgICMgaWZjb25maWcgYm9uZDAgZG93blxuXG4iCisvL3VzYWdlOiAgICAgICAiICBUbyBjaGFuZ2UgYWN0aXZlIHNsYXZlOlxuIgorLy91c2FnZTogICAgICAgIiAgIyBpZmVuc2xhdmUgLWMgYm9uZDAgZXRoMFxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogI2luY2x1ZGUgPG5ldC9pZi5oPiAtIG5vLiBsaW51eC9pZl9ib25kaW5nLmggcHVsbHMgaW4gbGludXgvaWYuaCAqLworI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisvLyNpbmNsdWRlIDxuZXQvaWZfYXJwLmg+IC0gbm90IG5lZWRlZD8KKyNpbmNsdWRlIDxsaW51eC9pZl9ib25kaW5nLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorI2luY2x1ZGUgImZpeF91MzIuaCIgLyogaGFjaywgc28gd2UgbWF5IGluY2x1ZGUga2VybmVsJ3MgZXRodG9vbC5oICovCisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2lmbmRlZiBCT05EX0FCSV9WRVJTSU9OCisjIGRlZmluZSBCT05EX0FCSV9WRVJTSU9OIDIKKyNlbmRpZgorI2lmbmRlZiBJRk5BTVNJWgorIyBkZWZpbmUgSUZOQU1TSVogMTYKKyNlbmRpZgorCisKK3N0cnVjdCBkZXZfZGF0YSB7CisJc3RydWN0IGlmcmVxIG10dSwgZmxhZ3MsIGh3YWRkcjsKK307CisKKworZW51bSB7IHNrZmQgPSAzIH07ICAgICAgLyogQUZfSU5FVCBzb2NrZXQgZm9yIGlvY3RsKCkgY2FsbHMuICovCitzdHJ1Y3QgZ2xvYmFscyB7CisJdW5zaWduZWQgYWJpX3ZlcjsgICAgICAgLyogdXNlcmxhbmQgLSBrZXJuZWwgQUJJIHZlcnNpb24gKi8KKwlzbWFsbGludCBod2FkZHJfc2V0OyAgICAvKiBNYXN0ZXIncyBod2FkZHIgaXMgc2V0ICovCisJc3RydWN0IGRldl9kYXRhIG1hc3RlcjsKKwlzdHJ1Y3QgZGV2X2RhdGEgc2xhdmU7Cit9OworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIGFiaV92ZXIgICAgKEcuYWJpX3ZlciAgICkKKyNkZWZpbmUgaHdhZGRyX3NldCAoRy5od2FkZHJfc2V0KQorI2RlZmluZSBtYXN0ZXIgICAgIChHLm1hc3RlciAgICApCisjZGVmaW5lIHNsYXZlICAgICAgKEcuc2xhdmUgICAgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKK30gd2hpbGUgKDApCisKKworLyogTk9JTkxJTkVzIGFyZSBwbGFjZWQgd2hlcmUgaXQgcmVzdWx0cyBpbiBzbWFsbGVyIGNvZGUgKGdjYyA0LjMuMSkgKi8KKworc3RhdGljIGludCBpb2N0bF9vbl9za2ZkKHVuc2lnbmVkIHJlcXVlc3QsIHN0cnVjdCBpZnJlcSAqaWZyKQoreworCXJldHVybiBpb2N0bChza2ZkLCByZXF1ZXN0LCBpZnIpOworfQorCitzdGF0aWMgaW50IHNldF9pZnJuYW1lX2FuZF9kb19pb2N0bCh1bnNpZ25lZCByZXF1ZXN0LCBzdHJ1Y3QgaWZyZXEgKmlmciwgY29uc3QgY2hhciAqaWZuYW1lKQoreworCXN0cm5jcHlfSUZOQU1TSVooaWZyLT5pZnJfbmFtZSwgaWZuYW1lKTsKKwlyZXR1cm4gaW9jdGxfb25fc2tmZChyZXF1ZXN0LCBpZnIpOworfQorCitzdGF0aWMgaW50IGdldF9pZl9zZXR0aW5ncyhjaGFyICppZm5hbWUsIHN0cnVjdCBkZXZfZGF0YSAqZGQpCit7CisJaW50IHJlczsKKworCXJlcyA9IHNldF9pZnJuYW1lX2FuZF9kb19pb2N0bChTSU9DR0lGTVRVLCAmZGQtPm10dSwgaWZuYW1lKTsKKwlyZXMgfD0gc2V0X2lmcm5hbWVfYW5kX2RvX2lvY3RsKFNJT0NHSUZGTEFHUywgJmRkLT5mbGFncywgaWZuYW1lKTsKKwlyZXMgfD0gc2V0X2lmcm5hbWVfYW5kX2RvX2lvY3RsKFNJT0NHSUZIV0FERFIsICZkZC0+aHdhZGRyLCBpZm5hbWUpOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIGludCBnZXRfc2xhdmVfZmxhZ3MoY2hhciAqc2xhdmVfaWZuYW1lKQoreworCXJldHVybiBzZXRfaWZybmFtZV9hbmRfZG9faW9jdGwoU0lPQ0dJRkZMQUdTLCAmc2xhdmUuZmxhZ3MsIHNsYXZlX2lmbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2h3YWRkcihjaGFyICppZm5hbWUsIHN0cnVjdCBzb2NrYWRkciAqaHdhZGRyKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisKKwltZW1jcHkoJihpZnIuaWZyX2h3YWRkciksIGh3YWRkciwgc2l6ZW9mKCpod2FkZHIpKTsKKwlyZXR1cm4gc2V0X2lmcm5hbWVfYW5kX2RvX2lvY3RsKFNJT0NTSUZIV0FERFIsICZpZnIsIGlmbmFtZSk7Cit9CisKK3N0YXRpYyBpbnQgc2V0X210dShjaGFyICppZm5hbWUsIGludCBtdHUpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKworCWlmci5pZnJfbXR1ID0gbXR1OworCXJldHVybiBzZXRfaWZybmFtZV9hbmRfZG9faW9jdGwoU0lPQ1NJRk1UVSwgJmlmciwgaWZuYW1lKTsKK30KKworc3RhdGljIGludCBzZXRfaWZfZmxhZ3MoY2hhciAqaWZuYW1lLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKworCWlmci5pZnJfZmxhZ3MgPSBmbGFnczsKKwlyZXR1cm4gc2V0X2lmcm5hbWVfYW5kX2RvX2lvY3RsKFNJT0NTSUZGTEFHUywgJmlmciwgaWZuYW1lKTsKK30KKworc3RhdGljIGludCBzZXRfaWZfdXAoY2hhciAqaWZuYW1lLCBpbnQgZmxhZ3MpCit7CisJaW50IHJlcyA9IHNldF9pZl9mbGFncyhpZm5hbWUsIGZsYWdzIHwgSUZGX1VQKTsKKwlpZiAocmVzKQorCQliYl9wZXJyb3JfbXNnKCIlczogY2FuJ3QgdXAiLCBpZm5hbWUpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgc2V0X2lmX2Rvd24oY2hhciAqaWZuYW1lLCBpbnQgZmxhZ3MpCit7CisJaW50IHJlcyA9IHNldF9pZl9mbGFncyhpZm5hbWUsIGZsYWdzICYgfklGRl9VUCk7CisJaWYgKHJlcykKKwkJYmJfcGVycm9yX21zZygiJXM6IGNhbid0IGRvd24iLCBpZm5hbWUpOworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgY2xlYXJfaWZfYWRkcihjaGFyICppZm5hbWUpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKworCWlmci5pZnJfYWRkci5zYV9mYW1pbHkgPSBBRl9JTkVUOworCW1lbXNldChpZnIuaWZyX2FkZHIuc2FfZGF0YSwgMCwgc2l6ZW9mKGlmci5pZnJfYWRkci5zYV9kYXRhKSk7CisJcmV0dXJuIHNldF9pZnJuYW1lX2FuZF9kb19pb2N0bChTSU9DU0lGQUREUiwgJmlmciwgaWZuYW1lKTsKK30KKworc3RhdGljIGludCBzZXRfaWZfYWRkcihjaGFyICptYXN0ZXJfaWZuYW1lLCBjaGFyICpzbGF2ZV9pZm5hbWUpCit7CisjaWYgKFNJT0NHSUZBRERSIHwgU0lPQ1NJRkFERFIgXAorICB8IFNJT0NHSUZEU1RBRERSIHwgU0lPQ1NJRkRTVEFERFIgXAorICB8IFNJT0NHSUZCUkRBRERSIHwgU0lPQ1NJRkJSREFERFIgXAorICB8IFNJT0NHSUZORVRNQVNLIHwgU0lPQ1NJRk5FVE1BU0spIDw9IDB4ZmZmZgorI2RlZmluZSBJTlQgdWludDE2X3QKKyNlbHNlCisjZGVmaW5lIElOVCBpbnQKKyNlbmRpZgorCXN0YXRpYyBjb25zdCBzdHJ1Y3QgeworCQlJTlQgZ19pb2N0bDsKKwkJSU5UIHNfaW9jdGw7CisJfSBpZnJhW10gPSB7CisJCXsgU0lPQ0dJRkFERFIsICAgIFNJT0NTSUZBRERSICAgIH0sCisJCXsgU0lPQ0dJRkRTVEFERFIsIFNJT0NTSUZEU1RBRERSIH0sCisJCXsgU0lPQ0dJRkJSREFERFIsIFNJT0NTSUZCUkRBRERSIH0sCisJCXsgU0lPQ0dJRk5FVE1BU0ssIFNJT0NTSUZORVRNQVNLIH0sCisJfTsKKworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IHJlczsKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaWZyYSk7IGkrKykgeworCQlyZXMgPSBzZXRfaWZybmFtZV9hbmRfZG9faW9jdGwoaWZyYVtpXS5nX2lvY3RsLCAmaWZyLCBtYXN0ZXJfaWZuYW1lKTsKKwkJaWYgKHJlcyA8IDApIHsKKwkJCWlmci5pZnJfYWRkci5zYV9mYW1pbHkgPSBBRl9JTkVUOworCQkJbWVtc2V0KGlmci5pZnJfYWRkci5zYV9kYXRhLCAwLAorCQkJCXNpemVvZihpZnIuaWZyX2FkZHIuc2FfZGF0YSkpOworCQl9CisKKwkJcmVzID0gc2V0X2lmcm5hbWVfYW5kX2RvX2lvY3RsKGlmcmFbaV0uc19pb2N0bCwgJmlmciwgc2xhdmVfaWZuYW1lKTsKKwkJaWYgKHJlcyA8IDApCisJCQlyZXR1cm4gcmVzOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjaGFuZ2VfYWN0aXZlKGNoYXIgKm1hc3Rlcl9pZm5hbWUsIGNoYXIgKnNsYXZlX2lmbmFtZSkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCisJaWYgKCEoc2xhdmUuZmxhZ3MuaWZyX2ZsYWdzICYgSUZGX1NMQVZFKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgaXMgbm90IGEgc2xhdmUiLCBzbGF2ZV9pZm5hbWUpOworCX0KKworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9zbGF2ZSwgc2xhdmVfaWZuYW1lKTsKKwlpZiAoc2V0X2lmcm5hbWVfYW5kX2RvX2lvY3RsKFNJT0NCT05EQ0hBTkdFQUNUSVZFLCAmaWZyLCBtYXN0ZXJfaWZuYW1lKQorCSAmJiBpb2N0bF9vbl9za2ZkKEJPTkRfQ0hBTkdFX0FDVElWRV9PTEQsICZpZnIpCisJKSB7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgKKwkJCSJtYXN0ZXIgJXMsIHNsYXZlICVzOiBjYW4ndCAiCisJCQkiY2hhbmdlIGFjdGl2ZSIsCisJCQltYXN0ZXJfaWZuYW1lLCBzbGF2ZV9pZm5hbWUpOworCX0KK30KKworc3RhdGljIE5PSU5MSU5FIGludCBlbnNsYXZlKGNoYXIgKm1hc3Rlcl9pZm5hbWUsIGNoYXIgKnNsYXZlX2lmbmFtZSkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCByZXM7CisKKwlpZiAoc2xhdmUuZmxhZ3MuaWZyX2ZsYWdzICYgSUZGX1NMQVZFKSB7CisJCWJiX2Vycm9yX21zZygKKwkJCSIlcyBpcyBhbHJlYWR5IGEgc2xhdmUiLAorCQkJc2xhdmVfaWZuYW1lKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcmVzID0gc2V0X2lmX2Rvd24oc2xhdmVfaWZuYW1lLCBzbGF2ZS5mbGFncy5pZnJfZmxhZ3MpOworCWlmIChyZXMpCisJCXJldHVybiByZXM7CisKKwlpZiAoYWJpX3ZlciA8IDIpIHsKKwkJLyogT2xkZXIgYm9uZGluZyB2ZXJzaW9ucyB3b3VsZCBwYW5pYyBpZiB0aGUgc2xhdmUgaGFzIG5vIElQCisJCSAqIGFkZHJlc3MsIHNvIGdldCB0aGUgSVAgc2V0dGluZyBmcm9tIHRoZSBtYXN0ZXIuCisJCSAqLworCQlyZXMgPSBzZXRfaWZfYWRkcihtYXN0ZXJfaWZuYW1lLCBzbGF2ZV9pZm5hbWUpOworCQlpZiAocmVzKSB7CisJCQliYl9wZXJyb3JfbXNnKCIlczogY2FuJ3Qgc2V0IGFkZHJlc3MiLCBzbGF2ZV9pZm5hbWUpOworCQkJcmV0dXJuIHJlczsKKwkJfQorCX0gZWxzZSB7CisJCXJlcyA9IGNsZWFyX2lmX2FkZHIoc2xhdmVfaWZuYW1lKTsKKwkJaWYgKHJlcykgeworCQkJYmJfcGVycm9yX21zZygiJXM6IGNhbid0IGNsZWFyIGFkZHJlc3MiLCBzbGF2ZV9pZm5hbWUpOworCQkJcmV0dXJuIHJlczsKKwkJfQorCX0KKworCWlmIChtYXN0ZXIubXR1Lmlmcl9tdHUgIT0gc2xhdmUubXR1Lmlmcl9tdHUpIHsKKwkJcmVzID0gc2V0X210dShzbGF2ZV9pZm5hbWUsIG1hc3Rlci5tdHUuaWZyX210dSk7CisJCWlmIChyZXMpIHsKKwkJCWJiX3BlcnJvcl9tc2coIiVzOiBjYW4ndCBzZXQgTVRVIiwgc2xhdmVfaWZuYW1lKTsKKwkJCXJldHVybiByZXM7CisJCX0KKwl9CisKKwlpZiAoaHdhZGRyX3NldCkgeworCQkvKiBNYXN0ZXIgYWxyZWFkeSBoYXMgYW4gaHdhZGRyCisJCSAqIHNvIHNldCBpdCdzIGh3YWRkciB0byB0aGUgc2xhdmUKKwkJICovCisJCWlmIChhYmlfdmVyIDwgMSkgeworCQkJLyogVGhlIGRyaXZlciBpcyB1c2luZyBhbiBvbGQgQUJJLCBzbworCQkJICogdGhlIGFwcGxpY2F0aW9uIHNldHMgdGhlIHNsYXZlJ3MKKwkJCSAqIGh3YWRkcgorCQkJICovCisJCQlpZiAoc2V0X2h3YWRkcihzbGF2ZV9pZm5hbWUsICYobWFzdGVyLmh3YWRkci5pZnJfaHdhZGRyKSkpIHsKKwkJCQliYl9wZXJyb3JfbXNnKCIlczogY2FuJ3Qgc2V0IGh3IGFkZHJlc3MiLAorCQkJCQkJc2xhdmVfaWZuYW1lKTsKKwkJCQlnb3RvIHVuZG9fbXR1OworCQkJfQorCisJCQkvKiBGb3Igb2xkIEFCSSB0aGUgYXBwbGljYXRpb24gbmVlZHMgdG8gYnJpbmcgdGhlCisJCQkgKiBzbGF2ZSBiYWNrIHVwCisJCQkgKi8KKwkJCWlmIChzZXRfaWZfdXAoc2xhdmVfaWZuYW1lLCBzbGF2ZS5mbGFncy5pZnJfZmxhZ3MpKQorCQkJCWdvdG8gdW5kb19zbGF2ZV9tYWM7CisJCX0KKwkJLyogVGhlIGRyaXZlciBpcyB1c2luZyBhIG5ldyBBQkksCisJCSAqIHNvIHRoZSBkcml2ZXIgdGFrZXMgY2FyZSBvZiBzZXR0aW5nCisJCSAqIHRoZSBzbGF2ZSdzIGh3YWRkciBhbmQgYnJpbmdpbmcKKwkJICogaXQgdXAgYWdhaW4KKwkJICovCisJfSBlbHNlIHsKKwkJLyogTm8gaHdhZGRyIGZvciBtYXN0ZXIgeWV0LCBzbworCQkgKiBzZXQgdGhlIHNsYXZlJ3MgaHdhZGRyIHRvIGl0CisJCSAqLworCQlpZiAoYWJpX3ZlciA8IDEpIHsKKwkJCS8qIEZvciBvbGQgQUJJLCB0aGUgbWFzdGVyIG5lZWRzIHRvIGJlCisJCQkgKiBkb3duIGJlZm9yZSBzZXR0aW5nIGl0J3MgaHdhZGRyCisJCQkgKi8KKwkJCWlmIChzZXRfaWZfZG93bihtYXN0ZXJfaWZuYW1lLCBtYXN0ZXIuZmxhZ3MuaWZyX2ZsYWdzKSkKKwkJCQlnb3RvIHVuZG9fbXR1OworCQl9CisKKwkJaWYgKHNldF9od2FkZHIobWFzdGVyX2lmbmFtZSwgJihzbGF2ZS5od2FkZHIuaWZyX2h3YWRkcikpKSB7CisJCQliYl9lcnJvcl9tc2coIiVzOiBjYW4ndCBzZXQgaHcgYWRkcmVzcyIsCisJCQkJbWFzdGVyX2lmbmFtZSk7CisJCQlnb3RvIHVuZG9fbXR1OworCQl9CisKKwkJaWYgKGFiaV92ZXIgPCAxKSB7CisJCQkvKiBGb3Igb2xkIEFCSSwgYnJpbmcgdGhlIG1hc3RlcgorCQkJICogYmFjayB1cAorCQkJICovCisJCQlpZiAoc2V0X2lmX3VwKG1hc3Rlcl9pZm5hbWUsIG1hc3Rlci5mbGFncy5pZnJfZmxhZ3MpKQorCQkJCWdvdG8gdW5kb19tYXN0ZXJfbWFjOworCQl9CisKKwkJaHdhZGRyX3NldCA9IDE7CisJfQorCisJLyogRG8gdGhlIHJlYWwgdGhpbmcgKi8KKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfc2xhdmUsIHNsYXZlX2lmbmFtZSk7CisJaWYgKHNldF9pZnJuYW1lX2FuZF9kb19pb2N0bChTSU9DQk9OREVOU0xBVkUsICZpZnIsIG1hc3Rlcl9pZm5hbWUpCisJICYmIGlvY3RsX29uX3NrZmQoQk9ORF9FTlNMQVZFX09MRCwgJmlmcikKKwkpIHsKKwkJZ290byB1bmRvX21hc3Rlcl9tYWM7CisJfQorCisJcmV0dXJuIDA7CisKKy8qIHJvbGxiYWNrIChiZXN0IGVmZm9ydCkgKi8KKyB1bmRvX21hc3Rlcl9tYWM6CisJc2V0X2h3YWRkcihtYXN0ZXJfaWZuYW1lLCAmKG1hc3Rlci5od2FkZHIuaWZyX2h3YWRkcikpOworCWh3YWRkcl9zZXQgPSAwOworCWdvdG8gdW5kb19tdHU7CisKKyB1bmRvX3NsYXZlX21hYzoKKwlzZXRfaHdhZGRyKHNsYXZlX2lmbmFtZSwgJihzbGF2ZS5od2FkZHIuaWZyX2h3YWRkcikpOworIHVuZG9fbXR1OgorCXNldF9tdHUoc2xhdmVfaWZuYW1lLCBzbGF2ZS5tdHUuaWZyX210dSk7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgcmVsZWFzZShjaGFyICptYXN0ZXJfaWZuYW1lLCBjaGFyICpzbGF2ZV9pZm5hbWUpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgcmVzID0gMDsKKworCWlmICghKHNsYXZlLmZsYWdzLmlmcl9mbGFncyAmIElGRl9TTEFWRSkpIHsKKwkJYmJfZXJyb3JfbXNnKCIlcyBpcyBub3QgYSBzbGF2ZSIsIHNsYXZlX2lmbmFtZSk7CisJCXJldHVybiAxOworCX0KKworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9zbGF2ZSwgc2xhdmVfaWZuYW1lKTsKKwlpZiAoc2V0X2lmcm5hbWVfYW5kX2RvX2lvY3RsKFNJT0NCT05EUkVMRUFTRSwgJmlmciwgbWFzdGVyX2lmbmFtZSkgPCAwCisJICYmIGlvY3RsX29uX3NrZmQoQk9ORF9SRUxFQVNFX09MRCwgJmlmcikgPCAwCisJKSB7CisJCXJldHVybiAxOworCX0KKwlpZiAoYWJpX3ZlciA8IDEpIHsKKwkJLyogVGhlIGRyaXZlciBpcyB1c2luZyBhbiBvbGQgQUJJLCBzbyB3ZSdsbCBzZXQgdGhlIGludGVyZmFjZQorCQkgKiBkb3duIHRvIGF2b2lkIGFueSBjb25mbGljdHMgZHVlIHRvIHNhbWUgTUFDL0lQCisJCSAqLworCQlyZXMgPSBzZXRfaWZfZG93bihzbGF2ZV9pZm5hbWUsIHNsYXZlLmZsYWdzLmlmcl9mbGFncyk7CisJfQorCisJLyogc2V0IHRvIGRlZmF1bHQgbXR1ICovCisJc2V0X210dShzbGF2ZV9pZm5hbWUsIDE1MDApOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIE5PSU5MSU5FIHZvaWQgZ2V0X2Rydl9pbmZvKGNoYXIgKm1hc3Rlcl9pZm5hbWUpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvIGluZm87CisKKwltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCWlmci5pZnJfZGF0YSA9IChjYWRkcl90KSZpbmZvOworCWluZm8uY21kID0gRVRIVE9PTF9HRFJWSU5GTzsKKwkvKiBib3RoIGZpZWxkcyBhcmUgMzIgYnl0ZXMgbG9uZyAobG9uZyBlbm91Z2gpICovCisJc3RyY3B5KGluZm8uZHJpdmVyLCAiaWZlbnNsYXZlIik7CisJc3RyY3B5KGluZm8uZndfdmVyc2lvbiwgdXRvYShCT05EX0FCSV9WRVJTSU9OKSk7CisJaWYgKHNldF9pZnJuYW1lX2FuZF9kb19pb2N0bChTSU9DRVRIVE9PTCwgJmlmciwgbWFzdGVyX2lmbmFtZSkgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFT1BOT1RTVVBQKQorCQkJcmV0dXJuOworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiBTSU9DRVRIVE9PTCBlcnJvciIsIG1hc3Rlcl9pZm5hbWUpOworCX0KKworCWFiaV92ZXIgPSBiYl9zdHJ0b3UoaW5mby5md192ZXJzaW9uLCBOVUxMLCAwKTsKKwlpZiAoZXJybm8pCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlczogU0lPQ0VUSFRPT0wgZXJyb3IiLCBtYXN0ZXJfaWZuYW1lKTsKK30KKworaW50IGlmZW5zbGF2ZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaWZlbnNsYXZlX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICptYXN0ZXJfaWZuYW1lLCAqc2xhdmVfaWZuYW1lOworCWludCBydjsKKwlpbnQgcmVzOworCXVuc2lnbmVkIG9wdDsKKwllbnVtIHsKKwkJT1BUX2MgPSAoMSA8PCAwKSwKKwkJT1BUX2QgPSAoMSA8PCAxKSwKKwkJT1BUX2YgPSAoMSA8PCAyKSwKKwl9OworI2lmIEVOQUJMRV9MT05HX09QVFMKKwlzdGF0aWMgY29uc3QgY2hhciBpZmVuc2xhdmVfbG9uZ29wdHNbXSBBTElHTjEgPQorCQkiY2hhbmdlLWFjdGl2ZVwwIiAgTm9fYXJndW1lbnQgImMiCisJCSJkZXRhY2hcMCIgICAgICAgICBOb19hcmd1bWVudCAiZCIKKwkJImZvcmNlXDAiICAgICAgICAgIE5vX2FyZ3VtZW50ICJmIgorCQkvKiAiYWxsLWludGVyZmFjZXNcMCIgTm9fYXJndW1lbnQgImEiICovCisJCTsKKworCWFwcGxldF9sb25nX29wdGlvbnMgPSBpZmVuc2xhdmVfbG9uZ29wdHM7CisjZW5kaWYKKwlJTklUX0coKTsKKworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJjZGZhIik7CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKG9wdCAmIChvcHQtMSkpIC8qIE9ubHkgb25lIG9wdGlvbiBjYW4gYmUgZ2l2ZW4gKi8KKwkJYmJfc2hvd191c2FnZSgpOworCisJbWFzdGVyX2lmbmFtZSA9ICphcmd2Kys7CisKKwkvKiBObyBpbnRlcmZhY2UgbmFtZXMgLSBzaG93IGFsbCBpbnRlcmZhY2VzLiAqLworCWlmICghbWFzdGVyX2lmbmFtZSkgeworCQlkaXNwbGF5X2ludGVyZmFjZXMoTlVMTCk7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJLyogT3BlbiBhIGJhc2ljIHNvY2tldCAqLworCXhtb3ZlX2ZkKHhzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCksIHNrZmQpOworCisJLyogRXhjaGFuZ2UgYWJpIHZlcnNpb24gd2l0aCBib25kaW5nIG1vZHVsZSAqLworCWdldF9kcnZfaW5mbyhtYXN0ZXJfaWZuYW1lKTsKKworCXNsYXZlX2lmbmFtZSA9ICphcmd2Kys7CisJaWYgKCFzbGF2ZV9pZm5hbWUpIHsKKwkJaWYgKG9wdCAmIChPUFRfZHxPUFRfYykpIHsKKwkJCS8qIC0tY2hhbmdlIG9yIC0tZGV0YWNoLCBhbmQgbm8gc2xhdmVzIGdpdmVuIC0KKwkJCSAqIHNob3cgYWxsIGludGVyZmFjZXMuICovCisJCQlkaXNwbGF5X2ludGVyZmFjZXMoc2xhdmVfaWZuYW1lIC8qID09IE5VTEwgKi8pOworCQkJcmV0dXJuIDI7IC8qIHdoeSAyPyAqLworCQl9CisJCS8qIEEgc2luZ2xlIGFyZyBtZWFucyBzaG93IHRoZQorCQkgKiBjb25maWd1cmF0aW9uIGZvciB0aGlzIGludGVyZmFjZQorCQkgKi8KKwkJZGlzcGxheV9pbnRlcmZhY2VzKG1hc3Rlcl9pZm5hbWUpOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCWlmIChnZXRfaWZfc2V0dGluZ3MobWFzdGVyX2lmbmFtZSwgJm1hc3RlcikpIHsKKwkJLyogUHJvYmFibHkgYSBnb29kIHJlYXNvbiBub3QgdG8gZ28gb24gKi8KKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCIlczogY2FuJ3QgZ2V0IHNldHRpbmdzIiwgbWFzdGVyX2lmbmFtZSk7CisJfQorCisJLyogQ2hlY2sgaWYgbWFzdGVyIGlzIGluZGVlZCBhIG1hc3RlcjsKKwkgKiBpZiBub3QgdGhlbiBmYWlsIGFueSBvcGVyYXRpb24KKwkgKi8KKwlpZiAoIShtYXN0ZXIuZmxhZ3MuaWZyX2ZsYWdzICYgSUZGX01BU1RFUikpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyBpcyBub3QgYSBtYXN0ZXIiLCBtYXN0ZXJfaWZuYW1lKTsKKworCS8qIENoZWNrIGlmIG1hc3RlciBpcyB1cDsgaWYgbm90IHRoZW4gZmFpbCBhbnkgb3BlcmF0aW9uICovCisJaWYgKCEobWFzdGVyLmZsYWdzLmlmcl9mbGFncyAmIElGRl9VUCkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyBpcyBub3QgdXAiLCBtYXN0ZXJfaWZuYW1lKTsKKworI2lmZGVmIFdIWV9CT1RIRVIKKwkvKiBOZWl0aGVyIC1jW2hhbmdlXSBub3IgLWRbZXRhY2hdIC0+IGl0J3MgImVuc2xhdmUiIHRoZW47CisJICogYW5kIC1mW29yY2VdIGlzIG5vdCB0aGVyZSB0b28uIENoZWNrIHRoYXQgaXQncyBldGhlcm5ldC4gKi8KKwlpZiAoIShvcHQgJiAoT1BUX2R8T1BUX2N8T1BUX2YpKSkgeworCQkvKiBUaGUgZmFtaWx5ICcxJyBpcyBBUlBIUkRfRVRIRVIgZm9yIGV0aGVybmV0LiAqLworCQlpZiAobWFzdGVyLmh3YWRkci5pZnJfaHdhZGRyLnNhX2ZhbWlseSAhPSAxKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgKKwkJCQkiJXMgaXMgbm90IGV0aGVybmV0LWxpa2UgKC1mIG92ZXJyaWRlcykiLAorCQkJCW1hc3Rlcl9pZm5hbWUpOworCQl9CisJfQorI2VuZGlmCisKKwkvKiBBY2NlcHRzIG9ubHkgb25lIHNsYXZlICovCisJaWYgKG9wdCAmIE9QVF9jKSB7CisJCS8qIENoYW5nZSBhY3RpdmUgc2xhdmUgKi8KKwkJaWYgKGdldF9zbGF2ZV9mbGFncyhzbGF2ZV9pZm5hbWUpKSB7CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoCisJCQkJIiVzOiBjYW4ndCBnZXQgZmxhZ3MiLCBzbGF2ZV9pZm5hbWUpOworCQl9CisJCWNoYW5nZV9hY3RpdmUobWFzdGVyX2lmbmFtZSwgc2xhdmVfaWZuYW1lKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwkvKiBBY2NlcHRzIG11bHRpcGxlIHNsYXZlcyAqLworCXJlcyA9IDA7CisJZG8geworCQlpZiAob3B0ICYgT1BUX2QpIHsKKwkJCS8qIERldGFjaCBhIHNsYXZlIGludGVyZmFjZSBmcm9tIHRoZSBtYXN0ZXIgKi8KKwkJCXJ2ID0gZ2V0X3NsYXZlX2ZsYWdzKHNsYXZlX2lmbmFtZSk7CisJCQlpZiAocnYpIHsKKwkJCQkvKiBDYW4ndCB3b3JrIHdpdGggdGhpcyBzbGF2ZSwgKi8KKwkJCQkvKiByZW1lbWJlciB0aGUgZXJyb3IgYW5kIHNraXAgaXQgKi8KKwkJCQliYl9wZXJyb3JfbXNnKAorCQkJCQkic2tpcHBpbmcgJXM6IGNhbid0IGdldCAlcyIsCisJCQkJCXNsYXZlX2lmbmFtZSwgImZsYWdzIik7CisJCQkJcmVzID0gcnY7CisJCQkJY29udGludWU7CisJCQl9CisJCQlydiA9IHJlbGVhc2UobWFzdGVyX2lmbmFtZSwgc2xhdmVfaWZuYW1lKTsKKwkJCWlmIChydikgeworCQkJCWJiX3BlcnJvcl9tc2coImNhbid0IHJlbGVhc2UgJXMgZnJvbSAlcyIsCisJCQkJCXNsYXZlX2lmbmFtZSwgbWFzdGVyX2lmbmFtZSk7CisJCQkJcmVzID0gcnY7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBBdHRhY2ggYSBzbGF2ZSBpbnRlcmZhY2UgdG8gdGhlIG1hc3RlciAqLworCQkJcnYgPSBnZXRfaWZfc2V0dGluZ3Moc2xhdmVfaWZuYW1lLCAmc2xhdmUpOworCQkJaWYgKHJ2KSB7CisJCQkJLyogQ2FuJ3Qgd29yayB3aXRoIHRoaXMgc2xhdmUsICovCisJCQkJLyogcmVtZW1iZXIgdGhlIGVycm9yIGFuZCBza2lwIGl0ICovCisJCQkJYmJfcGVycm9yX21zZygKKwkJCQkJInNraXBwaW5nICVzOiBjYW4ndCBnZXQgJXMiLAorCQkJCQlzbGF2ZV9pZm5hbWUsICJzZXR0aW5ncyIpOworCQkJCXJlcyA9IHJ2OworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJcnYgPSBlbnNsYXZlKG1hc3Rlcl9pZm5hbWUsIHNsYXZlX2lmbmFtZSk7CisJCQlpZiAocnYpIHsKKwkJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBlbnNsYXZlICVzIHRvICVzIiwKKwkJCQkJc2xhdmVfaWZuYW1lLCBtYXN0ZXJfaWZuYW1lKTsKKwkJCQlyZXMgPSBydjsKKwkJCX0KKwkJfQorCX0gd2hpbGUgKChzbGF2ZV9pZm5hbWUgPSAqYXJndisrKSAhPSBOVUxMKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQljbG9zZShza2ZkKTsKKwl9CisKKwlyZXR1cm4gcmVzOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9pZnBsdWdkLmMgYi9uZXR3b3JraW5nL2lmcGx1Z2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGRlZmI1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9pZnBsdWdkLmMKQEAgLTAsMCArMSw3NjIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGlmcGx1Z2QgZm9yIGJ1c3lib3gsIGJhc2VkIG9uIGlmcGx1Z2QgMC4yOCAod3JpdHRlbiBieSBMZW5uYXJ0IFBvZXR0ZXJpbmcpLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBNYWtzeW0gS3J5emhhbm92c2t5eSA8eG1ha3NAZW1haWwuY3o+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgaWZwbHVnZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIgorLy91c2FnZTojZGVmaW5lIGlmcGx1Z2RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJOZXR3b3JrIGludGVyZmFjZSBwbHVnIGRldGVjdGlvbiBkYWVtb25cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JCURvbid0IGRhZW1vbml6ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJCURvbid0IGxvZyB0byBzeXNsb2ciCisvL3VzYWdlOiAgICAgIlxuCS1pIElGQUNFCUludGVyZmFjZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWYvLUYJCVRyZWF0IGxpbmsgZGV0ZWN0aW9uIGVycm9yIGFzIGxpbmsgZG93bi9saW5rIHVwIgorLy91c2FnZTogICAgICJcbgkJCShvdGhlcndpc2UgZXhpdCBvbiBlcnJvcikiCisvL3VzYWdlOiAgICAgIlxuCS1hCQlEb24ndCB1cCBpbnRlcmZhY2UgYXQgZWFjaCBsaW5rIHByb2JlIgorLy91c2FnZTogICAgICJcbgktTQkJTW9uaXRvciBjcmVhdGlvbi9kZXN0cnVjdGlvbiBvZiBpbnRlcmZhY2UiCisvL3VzYWdlOiAgICAgIlxuCQkJKG90aGVyd2lzZSBpdCBtdXN0IGV4aXN0KSIKKy8vdXNhZ2U6ICAgICAiXG4JLXIgUFJPRwkJU2NyaXB0IHRvIHJ1biIKKy8vdXNhZ2U6ICAgICAiXG4JLXggQVJHCQlFeHRyYSBhcmd1bWVudCBmb3Igc2NyaXB0IgorLy91c2FnZTogICAgICJcbgktSQkJRG9uJ3QgZXhpdCBvbiBub256ZXJvIGV4aXQgY29kZSBmcm9tIHNjcmlwdCIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJCURvbid0IHJ1biBcInVwXCIgc2NyaXB0IG9uIHN0YXJ0dXAiCisvL3VzYWdlOiAgICAgIlxuCS1xCQlEb24ndCBydW4gXCJkb3duXCIgc2NyaXB0IG9uIGV4aXQiCisvL3VzYWdlOiAgICAgIlxuCS1sCQlBbHdheXMgcnVuIHNjcmlwdCBvbiBzdGFydHVwIgorLy91c2FnZTogICAgICJcbgktdCBTRUNTCQlQb2xsIHRpbWUgaW4gc2Vjb25kcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXUgU0VDUwkJRGVsYXkgYmVmb3JlIHJ1bm5pbmcgc2NyaXB0IGFmdGVyIGxpbmsgdXAiCisvL3VzYWdlOiAgICAgIlxuCS1kIFNFQ1MJCURlbGF5IGFmdGVyIGxpbmsgZG93biIKKy8vdXNhZ2U6ICAgICAiXG4JLW0gTU9ERQkJQVBJIG1vZGUgKG1paSwgcHJpdiwgZXRodG9vbCwgd2xhbiwgaWZmLCBhdXRvKSIKKy8vdXNhZ2U6ICAgICAiXG4JLWsJCUtpbGwgcnVubmluZyBkYWVtb24iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaW5jbHVkZSAiZml4X3UzMi5oIgorI2luY2x1ZGUgPGxpbnV4L2lmLmg+CisjaW5jbHVkZSA8bGludXgvbWlpLmg+CisjaW5jbHVkZSA8bGludXgvZXRodG9vbC5oPgorI2lmZGVmIEhBVkVfTkVUX0VUSEVSTkVUX0gKKy8qIG11c2wgYnJlYWthZ2U6CisgKiBJbiBmaWxlIGluY2x1ZGVkIGZyb20gL3Vzci9pbmNsdWRlL25ldC9ldGhlcm5ldC5oOjEwLAorICogICAgICAgICAgICAgICAgICBmcm9tIG5ldHdvcmtpbmcvaWZwbHVnZC5jOjQxOgorICogL3Vzci9pbmNsdWRlL25ldGluZXQvaWZfZXRoZXIuaDo5NjogZXJyb3I6IHJlZGVmaW5pdGlvbiBvZiAnc3RydWN0IGV0aGhkcicKKyAqCisgKiBCdWlsZCBzdWNjZWVkcyB3aXRob3V0IGl0IG9uIG11c2wuIENvbW1lbnRlZCBpdCBvdXQuCisgKiBJZiBvbiB5b3VyIHN5c3RlbSB5b3UgbmVlZCBpdCwgY29uc2lkZXIgcmVtb3ZpbmcgPGxpbnV4L2V0aHRvb2wuaD4KKyAqIGFuZCBjb3B5LXBhc3RpbmcgaXRzIGRlZmluaXRpb25zIGhlcmUgKDxsaW51eC9ldGh0b29sLmg+IGlzIHdoYXQgcHVsbHMgaW4KKyAqIGNvbmZsaWN0aW5nIGRlZmluaXRpb24gb2Ygc3RydWN0IGV0aGhkciBvbiBtdXNsKS4KKyAqLworLyogIyBpbmNsdWRlIDxuZXQvZXRoZXJuZXQuaD4gKi8KKyNlbmRpZgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9zb2NraW9zLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisKKyNkZWZpbmUgX191c2VyCisjaW5jbHVkZSA8bGludXgvd2lyZWxlc3MuaD4KKworI2lmbmRlZiBFVEhfQUxFTgorIyBkZWZpbmUgRVRIX0FMRU4gIDYKKyNlbmRpZgorCisvKgorRnJvbSBpbml0aWFsIHBvcnQgdG8gYnVzeWJveCwgcmVtb3ZlZCBtb3N0IG9mIHRoZSByZWR1bmRhbmN5IGJ5Citjb252ZXJ0aW5nIGltcGxlbWVudGF0aW9uIG9mIGEgcG9seW1vcnBoaWMgaW50ZXJmYWNlIHRvIHRoZSBzdHJpY3QKK2Z1bmN0aW9uYWwgc3R5bGUuIFRoZSBtYWluIHJvbGUgaXMgcnVuIGEgc2NyaXB0IHdoZW4gbGluayBzdGF0ZQorY2hhbmdlZCwgb3RoZXIgYWN0aXZpdGllcyBsaWtlIGF1ZGlvIHNpZ25hbCBvciBkZXRhaWxlZCByZXBvcnRzCithcmUgb24gdGhlIHNjcmlwdCBpdHNlbGYuCisKK09uZSBxdWVzdGlvbmFibGUgcG9pbnQgb2YgdGhlIGRlc2lnbiBpcyBuZXRsaW5rIHVzYWdlOgorCitXZSBoYXZlIDEgc2Vjb25kIHRpbWVvdXQgYnkgZGVmYXVsdCB0byBwb2xsIHRoZSBsaW5rIHN0YXR1cywKK2l0IGlzIHNob3J0IGVub3VnaCBzbyB0aGF0IHRoZXJlIGFyZSBubyByZWFsIGJlbmVmaXRzIGluCit1c2luZyBuZXRsaW5rIHRvIGdldCAiaW5zdGFudGFuZW91cyIgaW50ZXJmYWNlIGNyZWF0aW9uL2RlbGV0aW9uCitub3RpZmljYXRpb25zLiBXZSBjYW4gY2hlY2sgZm9yIGludGVyZmFjZSBleGlzdGVuY2UgYnkganVzdAorZG9pbmcgc29tZSBmYXN0IGlvY3RsIHVzaW5nIGl0cyBuYW1lLgorCitOZXRsaW5rIGNvZGUgdGhlbiBjYW4gYmUganVzdCBkcm9wcGVkICgxayBvciBtb3JlPykKKyovCisKKworI2RlZmluZSBJRlBMVUdEX0VOVl9QUkVWSU9VUyAiSUZQTFVHRF9QUkVWSU9VUyIKKyNkZWZpbmUgSUZQTFVHRF9FTlZfQ1VSUkVOVCAiSUZQTFVHRF9DVVJSRU5UIgorCitlbnVtIHsKKwlGTEFHX05PX0FVVE8JCQk9IDEgPDwgIDAsIC8vIC1hLCBEbyBub3QgZW5hYmxlIGludGVyZmFjZSBhdXRvbWF0aWNhbGx5CisJRkxBR19OT19EQUVNT04JCQk9IDEgPDwgIDEsIC8vIC1uLCBEbyBub3QgZGFlbW9uaXplCisJRkxBR19OT19TWVNMT0cJCQk9IDEgPDwgIDIsIC8vIC1zLCBEbyBub3QgdXNlIHN5c2xvZywgdXNlIHN0ZGVyciBpbnN0ZWFkCisJRkxBR19JR05PUkVfRkFJTAkJPSAxIDw8ICAzLCAvLyAtZiwgSWdub3JlIGRldGVjdGlvbiBmYWlsdXJlLCByZXRyeSBpbnN0ZWFkIChmYWlsdXJlIGlzIHRyZWF0ZWQgYXMgRE9XTikKKwlGTEFHX0lHTk9SRV9GQUlMX1BPU0lUSVZFCT0gMSA8PCAgNCwgLy8gLUYsIElnbm9yZSBkZXRlY3Rpb24gZmFpbHVyZSwgcmV0cnkgaW5zdGVhZCAoZmFpbHVyZSBpcyB0cmVhdGVkIGFzIFVQKQorCUZMQUdfSUZBQ0UJCQk9IDEgPDwgIDUsIC8vIC1pLCBTcGVjaWZ5IGV0aGVybmV0IGludGVyZmFjZQorCUZMQUdfUlVOCQkJPSAxIDw8ICA2LCAvLyAtciwgU3BlY2lmeSBwcm9ncmFtIHRvIGV4ZWN1dGUKKwlGTEFHX0lHTk9SRV9SRVRWQUwJCT0gMSA8PCAgNywgLy8gLUksIERvbid0IGV4aXQgb24gbm9uemVybyByZXR1cm4gdmFsdWUgb2YgcHJvZ3JhbSBleGVjdXRlZAorCUZMQUdfUE9MTF9USU1FCQkJPSAxIDw8ICA4LCAvLyAtdCwgU3BlY2lmeSBwb2xsIHRpbWUgaW4gc2Vjb25kcworCUZMQUdfREVMQVlfVVAJCQk9IDEgPDwgIDksIC8vIC11LCBTcGVjaWZ5IGRlbGF5IGZvciBjb25maWd1cmluZyBpbnRlcmZhY2UKKwlGTEFHX0RFTEFZX0RPV04JCQk9IDEgPDwgMTAsIC8vIC1kLCBTcGVjaWZ5IGRlbGF5IGZvciBkZWNvbmZpZ3VyaW5nIGludGVyZmFjZQorCUZMQUdfQVBJX01PREUJCQk9IDEgPDwgMTEsIC8vIC1tLCBGb3JjZSBBUEkgbW9kZSAobWlpLCBwcml2LCBldGh0b29sLCB3bGFuLCBhdXRvKQorCUZMQUdfTk9fU1RBUlRVUAkJCT0gMSA8PCAxMiwgLy8gLXAsIERvbid0IHJ1biBzY3JpcHQgb24gZGFlbW9uIHN0YXJ0dXAKKwlGTEFHX05PX1NIVVRET1dOCQk9IDEgPDwgMTMsIC8vIC1xLCBEb24ndCBydW4gc2NyaXB0IG9uIGRhZW1vbiBxdWl0CisJRkxBR19JTklUSUFMX0RPV04JCT0gMSA8PCAxNCwgLy8gLWwsIFJ1biAiZG93biIgc2NyaXB0IG9uIHN0YXJ0dXAgaWYgbm8gY2FibGUgaXMgZGV0ZWN0ZWQKKwlGTEFHX0VYVFJBX0FSRwkJCT0gMSA8PCAxNSwgLy8gLXgsIFNwZWNpZnkgYW4gZXh0cmEgYXJndW1lbnQgZm9yIGFjdGlvbiBzY3JpcHQKKwlGTEFHX01PTklUT1IJCQk9IDEgPDwgMTYsIC8vIC1NLCBVc2UgaW50ZXJmYWNlIG1vbml0b3JpbmcKKyNpZiBFTkFCTEVfRkVBVFVSRV9QSURGSUxFCisJRkxBR19LSUxMCQkJPSAxIDw8IDE3LCAvLyAtaywgS2lsbCBhIHJ1bm5pbmcgZGFlbW9uCisjZW5kaWYKK307CisjaWYgRU5BQkxFX0ZFQVRVUkVfUElERklMRQorIyBkZWZpbmUgT1BUSU9OX1NUUiAiK2Fuc2ZGaTpyOkl0OnU6ZDptOnBxbHg6TWsiCisjZWxzZQorIyBkZWZpbmUgT1BUSU9OX1NUUiAiK2Fuc2ZGaTpyOkl0OnU6ZDptOnBxbHg6TSIKKyNlbmRpZgorCitlbnVtIHsgLy8gaW50ZXJmYWNlIHN0YXR1cworCUlGU1RBVFVTX0VSUiA9IC0xLAorCUlGU1RBVFVTX0RPV04gPSAwLAorCUlGU1RBVFVTX1VQID0gMSwKK307CisKK2VudW0geyAvLyBjb25zdGFudCBmZHMKKwlpb2N0bF9mZCA9IDMsCisJbmV0bGlua19mZCA9IDQsCit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJc21hbGxpbnQgaWZhY2VfbGFzdF9zdGF0dXM7CisJc21hbGxpbnQgaWZhY2VfcHJldl9zdGF0dXM7CisJc21hbGxpbnQgaWZhY2VfZXhpc3RzOworCXNtYWxsaW50IGFwaV9tZXRob2RfbnVtOworCisJLyogVXNlZCBpbiBnZXRvcHQzMiwgbXVzdCBoYXZlIHNpemVvZiA9PSBzaXplb2YoaW50KSAqLworCXVuc2lnbmVkIHBvbGxfdGltZTsKKwl1bnNpZ25lZCBkZWxheV91cDsKKwl1bnNpZ25lZCBkZWxheV9kb3duOworCisJY29uc3QgY2hhciAqaWZhY2U7CisJY29uc3QgY2hhciAqYXBpX21vZGU7CisJY29uc3QgY2hhciAqc2NyaXB0X25hbWU7CisJY29uc3QgY2hhciAqZXh0cmFfYXJnOworfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorCUcuaWZhY2VfbGFzdF9zdGF0dXMgPSAtMTsgXAorCUcuaWZhY2VfZXhpc3RzICAgPSAxOyBcCisJRy5wb2xsX3RpbWUgICAgICA9IDE7IFwKKwlHLmRlbGF5X2Rvd24gICAgID0gNTsgXAorCUcuaWZhY2UgICAgICAgICAgPSAiZXRoMCI7IFwKKwlHLmFwaV9tb2RlICAgICAgID0gImEiOyBcCisJRy5zY3JpcHRfbmFtZSAgICA9ICIvZXRjL2lmcGx1Z2QvaWZwbHVnZC5hY3Rpb24iOyBcCit9IHdoaWxlICgwKQorCisKKy8qIFV0aWxpdHkgcm91dGluZXMgKi8KKworc3RhdGljIHZvaWQgc2V0X2lmcmVxX3RvX2lmbmFtZShzdHJ1Y3QgaWZyZXEgKmlmcmVxKQoreworCW1lbXNldChpZnJlcSwgMCwgc2l6ZW9mKHN0cnVjdCBpZnJlcSkpOworCXN0cm5jcHlfSUZOQU1TSVooaWZyZXEtPmlmcl9uYW1lLCBHLmlmYWNlKTsKK30KKworc3RhdGljIGludCBuZXR3b3JrX2lvY3RsKGludCByZXF1ZXN0LCB2b2lkKiBkYXRhLCBjb25zdCBjaGFyICplcnJtc2cpCit7CisJaW50IHIgPSBpb2N0bChpb2N0bF9mZCwgcmVxdWVzdCwgZGF0YSk7CisJaWYgKHIgPCAwICYmIGVycm1zZykKKwkJYmJfcGVycm9yX21zZygiJXMgZmFpbGVkIiwgZXJybXNnKTsKKwlyZXR1cm4gcjsKK30KKworLyogTGluayBkZXRlY3Rpb24gcm91dGluZXMgYW5kIHRhYmxlICovCisKK3N0YXRpYyBzbWFsbGludCBkZXRlY3RfbGlua19taWkodm9pZCkKK3sKKwkvKiBjaGFyIGJ1ZmZlciBpbnN0ZWFkIG9mIGJvbmEtZmlkZSBzdHJ1Y3QgYXZvaWRzIGFsaWFzaW5nIHdhcm5pbmcgKi8KKwljaGFyIGJ1ZltzaXplb2Yoc3RydWN0IGlmcmVxKV07CisJc3RydWN0IGlmcmVxICpjb25zdCBpZnJlcSA9ICh2b2lkICopYnVmOworCisJc3RydWN0IG1paV9pb2N0bF9kYXRhICptaWkgPSAodm9pZCAqKSZpZnJlcS0+aWZyX2RhdGE7CisKKwlzZXRfaWZyZXFfdG9faWZuYW1lKGlmcmVxKTsKKworCWlmIChuZXR3b3JrX2lvY3RsKFNJT0NHTUlJUEhZLCBpZnJlcSwgIlNJT0NHTUlJUEhZIikgPCAwKSB7CisJCXJldHVybiBJRlNUQVRVU19FUlI7CisJfQorCisJbWlpLT5yZWdfbnVtID0gMTsKKworCWlmIChuZXR3b3JrX2lvY3RsKFNJT0NHTUlJUkVHLCBpZnJlcSwgIlNJT0NHTUlJUkVHIikgPCAwKSB7CisJCXJldHVybiBJRlNUQVRVU19FUlI7CisJfQorCisJcmV0dXJuIChtaWktPnZhbF9vdXQgJiAweDAwMDQpID8gSUZTVEFUVVNfVVAgOiBJRlNUQVRVU19ET1dOOworfQorCitzdGF0aWMgc21hbGxpbnQgZGV0ZWN0X2xpbmtfcHJpdih2b2lkKQoreworCS8qIGNoYXIgYnVmZmVyIGluc3RlYWQgb2YgYm9uYS1maWRlIHN0cnVjdCBhdm9pZHMgYWxpYXNpbmcgd2FybmluZyAqLworCWNoYXIgYnVmW3NpemVvZihzdHJ1Y3QgaWZyZXEpXTsKKwlzdHJ1Y3QgaWZyZXEgKmNvbnN0IGlmcmVxID0gKHZvaWQgKilidWY7CisKKwlzdHJ1Y3QgbWlpX2lvY3RsX2RhdGEgKm1paSA9ICh2b2lkICopJmlmcmVxLT5pZnJfZGF0YTsKKworCXNldF9pZnJlcV90b19pZm5hbWUoaWZyZXEpOworCisJaWYgKG5ldHdvcmtfaW9jdGwoU0lPQ0RFVlBSSVZBVEUsIGlmcmVxLCAiU0lPQ0RFVlBSSVZBVEUiKSA8IDApIHsKKwkJcmV0dXJuIElGU1RBVFVTX0VSUjsKKwl9CisKKwltaWktPnJlZ19udW0gPSAxOworCisJaWYgKG5ldHdvcmtfaW9jdGwoU0lPQ0RFVlBSSVZBVEUrMSwgaWZyZXEsICJTSU9DREVWUFJJVkFURSsxIikgPCAwKSB7CisJCXJldHVybiBJRlNUQVRVU19FUlI7CisJfQorCisJcmV0dXJuIChtaWktPnZhbF9vdXQgJiAweDAwMDQpID8gSUZTVEFUVVNfVVAgOiBJRlNUQVRVU19ET1dOOworfQorCitzdGF0aWMgc21hbGxpbnQgZGV0ZWN0X2xpbmtfZXRodG9vbCh2b2lkKQoreworCXN0cnVjdCBpZnJlcSBpZnJlcTsKKwlzdHJ1Y3QgZXRodG9vbF92YWx1ZSBlZGF0YTsKKworCXNldF9pZnJlcV90b19pZm5hbWUoJmlmcmVxKTsKKworCWVkYXRhLmNtZCA9IEVUSFRPT0xfR0xJTks7CisJaWZyZXEuaWZyX2RhdGEgPSAodm9pZCopICZlZGF0YTsKKworCWlmIChuZXR3b3JrX2lvY3RsKFNJT0NFVEhUT09MLCAmaWZyZXEsICJFVEhUT09MX0dMSU5LIikgPCAwKSB7CisJCXJldHVybiBJRlNUQVRVU19FUlI7CisJfQorCisJcmV0dXJuIGVkYXRhLmRhdGEgPyBJRlNUQVRVU19VUCA6IElGU1RBVFVTX0RPV047Cit9CisKK3N0YXRpYyBzbWFsbGludCBkZXRlY3RfbGlua19pZmYodm9pZCkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyZXE7CisKKwlzZXRfaWZyZXFfdG9faWZuYW1lKCZpZnJlcSk7CisKKwlpZiAobmV0d29ya19pb2N0bChTSU9DR0lGRkxBR1MsICZpZnJlcSwgIlNJT0NHSUZGTEFHUyIpIDwgMCkgeworCQlyZXR1cm4gSUZTVEFUVVNfRVJSOworCX0KKworCS8qIElmIElGRl9VUCBpcyBub3Qgc2V0IChpbnRlcmZhY2UgaXMgZG93biksIElGRl9SVU5OSU5HIGlzIG5ldmVyIHNldAorCSAqIHJlZ2FyZGxlc3Mgb2YgbGluayBzdGF0dXMuIFNpbXBseSBjb250aW51ZSB0byByZXBvcnQgbGFzdCBzdGF0dXMgLQorCSAqIG5vIHBvaW50IGluIHJlcG9ydGluZyBzcHVyaW91cyBsaW5rIGRvd25zIGlmIGludGVyZmFjZSBpcyBkaXNhYmxlZAorCSAqIGJ5IGFkbWluLiBXaGVuL2lmIGl0IHdpbGwgYmUgYnJvdWdodCB1cCwKKwkgKiB3ZSdsbCByZXBvcnQgcmVhbCBsaW5rIHN0YXR1cy4KKwkgKi8KKwlpZiAoIShpZnJlcS5pZnJfZmxhZ3MgJiBJRkZfVVApICYmIEcuaWZhY2VfbGFzdF9zdGF0dXMgIT0gSUZTVEFUVVNfRVJSKQorCQlyZXR1cm4gRy5pZmFjZV9sYXN0X3N0YXR1czsKKworCXJldHVybiAoaWZyZXEuaWZyX2ZsYWdzICYgSUZGX1JVTk5JTkcpID8gSUZTVEFUVVNfVVAgOiBJRlNUQVRVU19ET1dOOworfQorCitzdGF0aWMgc21hbGxpbnQgZGV0ZWN0X2xpbmtfd2xhbih2b2lkKQoreworCWludCBpOworCXN0cnVjdCBpd3JlcSBpd3JlcXVlc3Q7CisJdWludDhfdCBtYWNbRVRIX0FMRU5dOworCisJbWVtc2V0KCZpd3JlcXVlc3QsIDAsIHNpemVvZihpd3JlcXVlc3QpKTsKKwlzdHJuY3B5X0lGTkFNU0laKGl3cmVxdWVzdC5pZnJfaWZybi5pZnJuX25hbWUsIEcuaWZhY2UpOworCisJaWYgKG5ldHdvcmtfaW9jdGwoU0lPQ0dJV0FQLCAmaXdyZXF1ZXN0LCAiU0lPQ0dJV0FQIikgPCAwKSB7CisJCXJldHVybiBJRlNUQVRVU19FUlI7CisJfQorCisJbWVtY3B5KG1hYywgJml3cmVxdWVzdC51LmFwX2FkZHIuc2FfZGF0YSwgRVRIX0FMRU4pOworCisJaWYgKG1hY1swXSA9PSAweEZGIHx8IG1hY1swXSA9PSAweDQ0IHx8IG1hY1swXSA9PSAweDAwKSB7CisJCWZvciAoaSA9IDE7IGkgPCBFVEhfQUxFTjsgKytpKSB7CisJCQlpZiAobWFjW2ldICE9IG1hY1swXSkKKwkJCQlyZXR1cm4gSUZTVEFUVVNfVVA7CisJCX0KKwkJcmV0dXJuIElGU1RBVFVTX0RPV047CisJfQorCisJcmV0dXJuIElGU1RBVFVTX1VQOworfQorCitlbnVtIHsgLy8gYXBpIG1vZGUKKwlBUElfRVRIVE9PTCwgLy8gJ2UnCisJQVBJX01JSSwgICAgIC8vICdtJworCUFQSV9QUklWQVRFLCAvLyAncCcKKwlBUElfV0xBTiwgICAgLy8gJ3cnCisJQVBJX0lGRiwgICAgIC8vICdpJworCUFQSV9BVVRPLCAgICAvLyAnYScKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIGFwaV9tb2Rlc1tdIEFMSUdOMSA9ICJlbXB3aWEiOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHsKKwljb25zdCBjaGFyICpuYW1lOworCXNtYWxsaW50ICgqZnVuYykodm9pZCk7Cit9IG1ldGhvZF90YWJsZVtdID0geworCXsgIlNJT0NFVEhUT09MIiAgICAgICAsICZkZXRlY3RfbGlua19ldGh0b29sIH0sCisJeyAiU0lPQ0dNSUlQSFkiICAgICAgICwgJmRldGVjdF9saW5rX21paSAgICAgfSwKKwl7ICJTSU9DREVWUFJJVkFURSIgICAgLCAmZGV0ZWN0X2xpbmtfcHJpdiAgICB9LAorCXsgIndpcmVsZXNzIGV4dGVuc2lvbiIsICZkZXRlY3RfbGlua193bGFuICAgIH0sCisJeyAiSUZGX1JVTk5JTkciICAgICAgICwgJmRldGVjdF9saW5rX2lmZiAgICAgfSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpzdHJzdGF0dXMoaW50IHN0YXR1cykKK3sKKwlpZiAoc3RhdHVzID09IElGU1RBVFVTX0VSUikKKwkJcmV0dXJuICJlcnJvciI7CisJcmV0dXJuICJkb3duXDB1cCIgKyAoc3RhdHVzICogNSk7Cit9CisKK3N0YXRpYyBpbnQgcnVuX3NjcmlwdChjb25zdCBjaGFyICphY3Rpb24pCit7CisJY2hhciAqZW52X1BSRVZJT1VTLCAqZW52X0NVUlJFTlQ7CisJY2hhciAqYXJndls1XTsKKwlpbnQgcjsKKworCWJiX2Vycm9yX21zZygiZXhlY3V0aW5nICclcyAlcyAlcyciLCBHLnNjcmlwdF9uYW1lLCBHLmlmYWNlLCBhY3Rpb24pOworCisJYXJndlswXSA9IChjaGFyKikgRy5zY3JpcHRfbmFtZTsKKwlhcmd2WzFdID0gKGNoYXIqKSBHLmlmYWNlOworCWFyZ3ZbMl0gPSAoY2hhciopIGFjdGlvbjsKKwlhcmd2WzNdID0gKGNoYXIqKSBHLmV4dHJhX2FyZzsKKwlhcmd2WzRdID0gTlVMTDsKKworCWVudl9QUkVWSU9VUyA9IHhhc3ByaW50ZigiJXM9JXMiLCBJRlBMVUdEX0VOVl9QUkVWSU9VUywgc3Ryc3RhdHVzKEcuaWZhY2VfcHJldl9zdGF0dXMpKTsKKwlwdXRlbnYoZW52X1BSRVZJT1VTKTsKKwllbnZfQ1VSUkVOVCA9IHhhc3ByaW50ZigiJXM9JXMiLCBJRlBMVUdEX0VOVl9DVVJSRU5ULCBzdHJzdGF0dXMoRy5pZmFjZV9sYXN0X3N0YXR1cykpOworCXB1dGVudihlbnZfQ1VSUkVOVCk7CisKKwkvKiByIDwgMCAtIGNhbid0IGV4ZWMsIDAgPD0gciA8IDB4MTgwIC0gZXhpdGVkLCA+PTB4MTgwIC0ga2lsbGVkIGJ5IHNpZyAoci0weDE4MCkgKi8KKwlyID0gc3Bhd25fYW5kX3dhaXQoYXJndik7CisKKwl1bnNldGVudihJRlBMVUdEX0VOVl9QUkVWSU9VUyk7CisJdW5zZXRlbnYoSUZQTFVHRF9FTlZfQ1VSUkVOVCk7CisJZnJlZShlbnZfUFJFVklPVVMpOworCWZyZWUoZW52X0NVUlJFTlQpOworCisJYmJfZXJyb3JfbXNnKCJleGl0IGNvZGU6ICVkIiwgciAmIDB4ZmYpOworCXJldHVybiAob3B0aW9uX21hc2szMiAmIEZMQUdfSUdOT1JFX1JFVFZBTCkgPyAwIDogcjsKK30KKworc3RhdGljIHZvaWQgdXBfaWZhY2Uodm9pZCkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyZXF1ZXN0OworCisJaWYgKCFHLmlmYWNlX2V4aXN0cykKKwkJcmV0dXJuOworCisJc2V0X2lmcmVxX3RvX2lmbmFtZSgmaWZyZXF1ZXN0KTsKKwlpZiAobmV0d29ya19pb2N0bChTSU9DR0lGRkxBR1MsICZpZnJlcXVlc3QsICJnZXR0aW5nIGludGVyZmFjZSBmbGFncyIpIDwgMCkgeworCQlHLmlmYWNlX2V4aXN0cyA9IDA7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIShpZnJlcXVlc3QuaWZyX2ZsYWdzICYgSUZGX1VQKSkgeworCQlpZnJlcXVlc3QuaWZyX2ZsYWdzIHw9IElGRl9VUDsKKwkJLyogTGV0IHVzZXIga25vdyB3ZSBtZXNzIHVwIHdpdGggaW50ZXJmYWNlICovCisJCWJiX2Vycm9yX21zZygidXBwaW5nIGludGVyZmFjZSIpOworCQlpZiAobmV0d29ya19pb2N0bChTSU9DU0lGRkxBR1MsICZpZnJlcXVlc3QsICJzZXR0aW5nIGludGVyZmFjZSBmbGFncyIpIDwgMCkKKwkJCXhmdW5jX2RpZSgpOworCX0KKworI2lmIDAgLyogd2h5IGRvIHdlIG1lc3Mgd2l0aCBJUCBhZGRyPyBJdCdzIG5vdCBvdXIgYnVzaW5lc3MgKi8KKwlpZiAobmV0d29ya19pb2N0bChTSU9DR0lGQUREUiwgJmlmcmVxdWVzdCwgImNhbid0IGdldCBpbnRlcmZhY2UgYWRkcmVzcyIpIDwgMCkgeworCX0gZWxzZSBpZiAoaWZyZXF1ZXN0Lmlmcl9hZGRyLnNhX2ZhbWlseSAhPSBBRl9JTkVUKSB7CisJCWJiX3BlcnJvcl9tc2coInRoZSBpbnRlcmZhY2UgaXMgbm90IElQLWJhc2VkIik7CisJfSBlbHNlIHsKKwkJKChzdHJ1Y3Qgc29ja2FkZHJfaW4qKSgmaWZyZXF1ZXN0Lmlmcl9hZGRyKSktPnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisJCW5ldHdvcmtfaW9jdGwoU0lPQ1NJRkFERFIsICZpZnJlcXVlc3QsICJjYW4ndCBzZXQgaW50ZXJmYWNlIGFkZHJlc3MiKTsKKwl9CisJbmV0d29ya19pb2N0bChTSU9DR0lGRkxBR1MsICZpZnJlcXVlc3QsICJjYW4ndCBnZXQgaW50ZXJmYWNlIGZsYWdzIik7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgbWF5YmVfdXBfbmV3X2lmYWNlKHZvaWQpCit7CisJaWYgKCEob3B0aW9uX21hc2szMiAmIEZMQUdfTk9fQVVUTykpCisJCXVwX2lmYWNlKCk7CisKKyNpZiAwIC8qIGJsb2F0ICovCisJc3RydWN0IGlmcmVxIGlmcmVxdWVzdDsKKwlzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvIGRyaXZlcl9pbmZvOworCisJc2V0X2lmcmVxX3RvX2lmbmFtZSgmaWZyZXF1ZXN0KTsKKwlkcml2ZXJfaW5mby5jbWQgPSBFVEhUT09MX0dEUlZJTkZPOworCWlmcmVxdWVzdC5pZnJfZGF0YSA9ICZkcml2ZXJfaW5mbzsKKwlpZiAobmV0d29ya19pb2N0bChTSU9DRVRIVE9PTCwgJmlmcmVxdWVzdCwgTlVMTCkgPT0gMCkgeworCQljaGFyIGJ1ZltzaXplb2YoIi94eDp4eDp4eDp4eDp4eDp4eCIpXTsKKworCQkvKiBHZXQgTUFDICovCisJCWJ1ZlswXSA9ICdcMCc7CisJCXNldF9pZnJlcV90b19pZm5hbWUoJmlmcmVxdWVzdCk7CisJCWlmIChuZXR3b3JrX2lvY3RsKFNJT0NHSUZIV0FERFIsICZpZnJlcXVlc3QsIE5VTEwpID09IDApIHsKKwkJCXNwcmludGYoYnVmLCAiLyUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKKwkJCQkodWludDhfdCkoaWZyZXF1ZXN0Lmlmcl9od2FkZHIuc2FfZGF0YVswXSksCisJCQkJKHVpbnQ4X3QpKGlmcmVxdWVzdC5pZnJfaHdhZGRyLnNhX2RhdGFbMV0pLAorCQkJCSh1aW50OF90KShpZnJlcXVlc3QuaWZyX2h3YWRkci5zYV9kYXRhWzJdKSwKKwkJCQkodWludDhfdCkoaWZyZXF1ZXN0Lmlmcl9od2FkZHIuc2FfZGF0YVszXSksCisJCQkJKHVpbnQ4X3QpKGlmcmVxdWVzdC5pZnJfaHdhZGRyLnNhX2RhdGFbNF0pLAorCQkJCSh1aW50OF90KShpZnJlcXVlc3QuaWZyX2h3YWRkci5zYV9kYXRhWzVdKSk7CisJCX0KKworCQliYl9lcnJvcl9tc2coInVzaW5nIGludGVyZmFjZSAlcyVzIHdpdGggZHJpdmVyPCVzPiAodmVyc2lvbjogJXMpIiwKKwkJCUcuaWZhY2UsIGJ1ZiwgZHJpdmVyX2luZm8uZHJpdmVyLCBkcml2ZXJfaW5mby52ZXJzaW9uKTsKKwl9CisjZW5kaWYKKwlpZiAoRy5hcGlfbW9kZVswXSA9PSAnYScpCisJCUcuYXBpX21ldGhvZF9udW0gPSBBUElfQVVUTzsKK30KKworc3RhdGljIHNtYWxsaW50IGRldGVjdF9saW5rKHZvaWQpCit7CisJc21hbGxpbnQgc3RhdHVzOworCisJaWYgKCFHLmlmYWNlX2V4aXN0cykKKwkJcmV0dXJuIChvcHRpb25fbWFzazMyICYgRkxBR19NT05JVE9SKSA/IElGU1RBVFVTX0RPV04gOiBJRlNUQVRVU19FUlI7CisKKwkvKiBTb21lIGRyaXZlcnMgY2FuJ3QgZGV0ZWN0IGxpbmsgc3RhdHVzIHdoZW4gdGhlIGludGVyZmFjZSBpcyBkb3duLgorCSAqIEkgaW1hZ2luZSBkZXRlY3RfbGlua19pZmYoKSBpcyB0aGUgbW9zdCB2dWxuZXJhYmxlLgorCSAqIFRoYXQncyB3aHkgLWEgIm5vYXV0byIgaW4gYW4gb3B0aW9uLCBub3QgYSBoYXJkd2lyZWQgYmVoYXZpb3IuCisJICovCisJaWYgKCEob3B0aW9uX21hc2szMiAmIEZMQUdfTk9fQVVUTykpCisJCXVwX2lmYWNlKCk7CisKKwlpZiAoRy5hcGlfbWV0aG9kX251bSA9PSBBUElfQVVUTykgeworCQlpbnQgaTsKKwkJc21hbGxpbnQgc3ZfbG9nbW9kZTsKKworCQlzdl9sb2dtb2RlID0gbG9nbW9kZTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWV0aG9kX3RhYmxlKTsgaSsrKSB7CisJCQlsb2dtb2RlID0gTE9HTU9ERV9OT05FOworCQkJc3RhdHVzID0gbWV0aG9kX3RhYmxlW2ldLmZ1bmMoKTsKKwkJCWxvZ21vZGUgPSBzdl9sb2dtb2RlOworCQkJaWYgKHN0YXR1cyAhPSBJRlNUQVRVU19FUlIpIHsKKwkJCQlHLmFwaV9tZXRob2RfbnVtID0gaTsKKwkJCQliYl9lcnJvcl9tc2coInVzaW5nICVzIGRldGVjdGlvbiBtb2RlIiwgbWV0aG9kX3RhYmxlW2ldLm5hbWUpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJc3RhdHVzID0gbWV0aG9kX3RhYmxlW0cuYXBpX21ldGhvZF9udW1dLmZ1bmMoKTsKKwl9CisKKwlpZiAoc3RhdHVzID09IElGU1RBVFVTX0VSUikgeworCQlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfSUdOT1JFX0ZBSUwpCisJCQlzdGF0dXMgPSBJRlNUQVRVU19ET1dOOworCQllbHNlIGlmIChvcHRpb25fbWFzazMyICYgRkxBR19JR05PUkVfRkFJTF9QT1NJVElWRSkKKwkJCXN0YXR1cyA9IElGU1RBVFVTX1VQOworCQllbHNlIGlmIChHLmFwaV9tb2RlWzBdID09ICdhJykKKwkJCWJiX2Vycm9yX21zZygiY2FuJ3QgZGV0ZWN0IGxpbmsgc3RhdHVzIik7CisJfQorCisJaWYgKHN0YXR1cyAhPSBHLmlmYWNlX2xhc3Rfc3RhdHVzKSB7CisJCUcuaWZhY2VfcHJldl9zdGF0dXMgPSBHLmlmYWNlX2xhc3Rfc3RhdHVzOworCQlHLmlmYWNlX2xhc3Rfc3RhdHVzID0gc3RhdHVzOworCX0KKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBOT0lOTElORSBpbnQgY2hlY2tfZXhpc3RlbmNlX3Rocm91Z2hfbmV0bGluayh2b2lkKQoreworCWludCBpZmFjZV9sZW47CisJLyogQnVmZmVyIHdhcyAxSywgYnV0IG9uIGxpbnV4LTMuOS45IGl0IHdhcyByZXBvcnRlZCB0byBiZSB0b28gc21hbGwuCisJICogbmV0bGluay5oOiAibGltaXQgdG8gOEsgdG8gYXZvaWQgTVNHX1RSVU5DIHdoZW4gUEFHRV9TSVpFIGlzIHZlcnkgbGFyZ2UiLgorCSAqIE5vdGU6IG9uIGVycm9yIHJldHVybnMgKC0xKSB3ZSBleGl0LCBubyBuZWVkIHRvIGZyZWUgcmVwbHlidWYuCisJICovCisJZW51bSB7IEJVRl9TSVpFID0gOCAqIDEwMjQgfTsKKwljaGFyICpyZXBseWJ1ZiA9IHhtYWxsb2MoQlVGX1NJWkUpOworCisJaWZhY2VfbGVuID0gc3RybGVuKEcuaWZhY2UpOworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBubG1zZ2hkciAqbWhkcjsKKwkJc3NpemVfdCBieXRlczsKKworCQlieXRlcyA9IHJlY3YobmV0bGlua19mZCwgcmVwbHlidWYsIEJVRl9TSVpFLCBNU0dfRE9OVFdBSVQpOworCQlpZiAoYnl0ZXMgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUFHQUlOKQorCQkJCWdvdG8gcmV0OworCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCWNvbnRpbnVlOworCQkJYmJfcGVycm9yX21zZygibmV0bGluazogcmVjdiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJbWhkciA9IChzdHJ1Y3Qgbmxtc2doZHIqKXJlcGx5YnVmOworCQl3aGlsZSAoYnl0ZXMgPiAwKSB7CisJCQlpZiAoIU5MTVNHX09LKG1oZHIsIGJ5dGVzKSkgeworCQkJCWJiX2Vycm9yX21zZygibmV0bGluayBwYWNrZXQgdG9vIHNtYWxsIG9yIHRydW5jYXRlZCIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKworCQkJaWYgKG1oZHItPm5sbXNnX3R5cGUgPT0gUlRNX05FV0xJTksgfHwgbWhkci0+bmxtc2dfdHlwZSA9PSBSVE1fREVMTElOSykgeworCQkJCXN0cnVjdCBydGF0dHIgKmF0dHI7CisJCQkJaW50IGF0dHJfbGVuOworCisJCQkJaWYgKG1oZHItPm5sbXNnX2xlbiA8IE5MTVNHX0xFTkdUSChzaXplb2Yoc3RydWN0IGlmaW5mb21zZykpKSB7CisJCQkJCWJiX2Vycm9yX21zZygibmV0bGluayBwYWNrZXQgdG9vIHNtYWxsIG9yIHRydW5jYXRlZCIpOworCQkJCQlyZXR1cm4gLTE7CisJCQkJfQorCisJCQkJYXR0ciA9IElGTEFfUlRBKE5MTVNHX0RBVEEobWhkcikpOworCQkJCWF0dHJfbGVuID0gSUZMQV9QQVlMT0FEKG1oZHIpOworCisJCQkJd2hpbGUgKFJUQV9PSyhhdHRyLCBhdHRyX2xlbikpIHsKKwkJCQkJaWYgKGF0dHItPnJ0YV90eXBlID09IElGTEFfSUZOQU1FKSB7CisJCQkJCQlpbnQgbGVuID0gUlRBX1BBWUxPQUQoYXR0cik7CisJCQkJCQlpZiAobGVuID4gSUZOQU1TSVopCisJCQkJCQkJbGVuID0gSUZOQU1TSVo7CisJCQkJCQlpZiAoaWZhY2VfbGVuIDw9IGxlbgorCQkJCQkJICYmIHN0cm5jbXAoRy5pZmFjZSwgUlRBX0RBVEEoYXR0ciksIGxlbikgPT0gMAorCQkJCQkJKSB7CisJCQkJCQkJRy5pZmFjZV9leGlzdHMgPSAobWhkci0+bmxtc2dfdHlwZSA9PSBSVE1fTkVXTElOSyk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYXR0ciA9IFJUQV9ORVhUKGF0dHIsIGF0dHJfbGVuKTsKKwkJCQl9CisJCQl9CisKKwkJCW1oZHIgPSBOTE1TR19ORVhUKG1oZHIsIGJ5dGVzKTsKKwkJfQorCX0KKworIHJldDoKKwlmcmVlKHJlcGx5YnVmKTsKKwlyZXR1cm4gRy5pZmFjZV9leGlzdHM7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9QSURGSUxFCitzdGF0aWMgTk9JTkxJTkUgcGlkX3QgcmVhZF9waWQoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaW50IGxlbjsKKwljaGFyIGJ1ZlsxMjhdOworCisJbGVuID0gb3Blbl9yZWFkX2Nsb3NlKGZpbGVuYW1lLCBidWYsIDEyNyk7CisJaWYgKGxlbiA+IDApIHsKKwkJYnVmW2xlbl0gPSAnXDAnOworCQkvKiByZXR1cm5zIFVMT05HX01BWCBvbiBlcnJvciA9PiAtMSAqLworCQlyZXR1cm4gYmJfc3RydG91bChidWYsIE5VTEwsIDEwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworaW50IGlmcGx1Z2RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGlmcGx1Z2RfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBpZmFjZV9zdGF0dXM7CisJaW50IGRlbGF5X3RpbWU7CisJY29uc3QgY2hhciAqaWZhY2Vfc3RhdHVzX3N0cjsKKwlzdHJ1Y3QgcG9sbGZkIG5ldGxpbmtfcG9sbGZkWzFdOworCXVuc2lnbmVkIG9wdHM7CisJY29uc3QgY2hhciAqYXBpX21vZGVfZm91bmQ7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUElERklMRQorCWNoYXIgKnBpZGZpbGVfbmFtZTsKKwlwaWRfdCBwaWRfZnJvbV9waWRmaWxlOworI2VuZGlmCisKKwlJTklUX0coKTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gInQrOnUrOmQrIjsKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgT1BUSU9OX1NUUiwKKwkJJkcuaWZhY2UsICZHLnNjcmlwdF9uYW1lLCAmRy5wb2xsX3RpbWUsICZHLmRlbGF5X3VwLAorCQkmRy5kZWxheV9kb3duLCAmRy5hcGlfbW9kZSwgJkcuZXh0cmFfYXJnKTsKKwlHLnBvbGxfdGltZSAqPSAxMDAwOworCisJYXBwbGV0X25hbWUgPSB4YXNwcmludGYoImlmcGx1Z2QoJXMpIiwgRy5pZmFjZSk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9QSURGSUxFCisJcGlkZmlsZV9uYW1lID0geGFzcHJpbnRmKENPTkZJR19QSURfRklMRV9QQVRIICIvaWZwbHVnZC4lcy5waWQiLCBHLmlmYWNlKTsKKwlwaWRfZnJvbV9waWRmaWxlID0gcmVhZF9waWQocGlkZmlsZV9uYW1lKTsKKworCWlmIChvcHRzICYgRkxBR19LSUxMKSB7CisJCWlmIChwaWRfZnJvbV9waWRmaWxlID4gMCkKKwkJCS8qIFVwc3RyZWFtIHRvb2wgdXNlIFNJR0lOVCBmb3IgLWsgKi8KKwkJCWtpbGwocGlkX2Zyb21fcGlkZmlsZSwgU0lHSU5UKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwlpZiAocGlkX2Zyb21fcGlkZmlsZSA+IDAgJiYga2lsbChwaWRfZnJvbV9waWRmaWxlLCAwKSA9PSAwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZGFlbW9uIGFscmVhZHkgcnVubmluZyIpOworI2VuZGlmCisKKwlhcGlfbW9kZV9mb3VuZCA9IHN0cmNocihhcGlfbW9kZXMsIEcuYXBpX21vZGVbMF0pOworCWlmICghYXBpX21vZGVfZm91bmQpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duIEFQSSBtb2RlICclcyciLCBHLmFwaV9tb2RlKTsKKwlHLmFwaV9tZXRob2RfbnVtID0gYXBpX21vZGVfZm91bmQgLSBhcGlfbW9kZXM7CisKKwlpZiAoIShvcHRzICYgRkxBR19OT19EQUVNT04pKQorCQliYl9kYWVtb25pemVfb3JfcmV4ZWMoREFFTU9OX0NIRElSX1JPT1QsIGFyZ3YpOworCisJeG1vdmVfZmQoeHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKSwgaW9jdGxfZmQpOworCWlmIChvcHRzICYgRkxBR19NT05JVE9SKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9ubCBhZGRyOworCQlpbnQgZmQgPSB4c29ja2V0KFBGX05FVExJTkssIFNPQ0tfREdSQU0sIE5FVExJTktfUk9VVEUpOworCisJCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwkJYWRkci5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LOworCQlhZGRyLm5sX2dyb3VwcyA9IFJUTUdSUF9MSU5LOworCQlhZGRyLm5sX3BpZCA9IGdldHBpZCgpOworCisJCXhiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyKikmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwkJeG1vdmVfZmQoZmQsIG5ldGxpbmtfZmQpOworCX0KKworCXdyaXRlX3BpZGZpbGUocGlkZmlsZV9uYW1lKTsKKworCS8qIHRoaXMgY2FuJ3QgYmUgbW92ZWQgYmVmb3JlIHNvY2tldCBjcmVhdGlvbiAqLworCWlmICghKG9wdHMgJiBGTEFHX05PX1NZU0xPRykpIHsKKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgMCwgTE9HX0RBRU1PTik7CisJCWxvZ21vZGUgfD0gTE9HTU9ERV9TWVNMT0c7CisJfQorCisJYmJfc2lnbmFscygwCisJCXwgKDEgPDwgU0lHSU5UICkKKwkJfCAoMSA8PCBTSUdURVJNKQorCQl8ICgxIDw8IFNJR1FVSVQpCisJCXwgKDEgPDwgU0lHSFVQICkgLyogd2h5IHdlIGlnbm9yZSBpdD8gKi8KKwkJLyogfCAoMSA8PCBTSUdDSExEKSAtIHJ1bl9zY3JpcHQgZG9lcyBub3QgdXNlIGl0IGFueW1vcmUgKi8KKwkJLCByZWNvcmRfc2lnbm8pOworCisJYmJfZXJyb3JfbXNnKCJzdGFydGVkOiAlcyIsIGJiX2Jhbm5lcik7CisKKwlpZiAob3B0cyAmIEZMQUdfTU9OSVRPUikgeworCQlzdHJ1Y3QgaWZyZXEgaWZyZXF1ZXN0OworCQlzZXRfaWZyZXFfdG9faWZuYW1lKCZpZnJlcXVlc3QpOworCQlHLmlmYWNlX2V4aXN0cyA9IChuZXR3b3JrX2lvY3RsKFNJT0NHSUZJTkRFWCwgJmlmcmVxdWVzdCwgTlVMTCkgPT0gMCk7CisJfQorCisJaWYgKEcuaWZhY2VfZXhpc3RzKQorCQltYXliZV91cF9uZXdfaWZhY2UoKTsKKworCWlmYWNlX3N0YXR1cyA9IGRldGVjdF9saW5rKCk7CisJaWYgKGlmYWNlX3N0YXR1cyA9PSBJRlNUQVRVU19FUlIpCisJCWdvdG8gZXhpdGluZzsKKwlpZmFjZV9zdGF0dXNfc3RyID0gc3Ryc3RhdHVzKGlmYWNlX3N0YXR1cyk7CisKKwlpZiAob3B0cyAmIEZMQUdfTU9OSVRPUikgeworCQliYl9lcnJvcl9tc2coImludGVyZmFjZSAlcyIsCisJCQlHLmlmYWNlX2V4aXN0cyA/ICJleGlzdHMiCisJCQk6ICJkb2Vzbid0IGV4aXN0LCB3YWl0aW5nIik7CisJfQorCS8qIGVsc2Ugd2UgYXNzdW1lIGl0IGFsd2F5cyBleGlzdHMsIGJ1dCBkb24ndCBtaXNsZWFkIHVzZXIKKwkgKiBieSBwb3RlbnRpYWxseSBseWluZyB0aGF0IGl0IHJlYWxseSBleGlzdHMgKi8KKworCWlmIChHLmlmYWNlX2V4aXN0cykgeworCQliYl9lcnJvcl9tc2coImxpbmsgaXMgJXMiLCBpZmFjZV9zdGF0dXNfc3RyKTsKKwl9CisKKwlpZiAoKCEob3B0cyAmIEZMQUdfTk9fU1RBUlRVUCkKKwkgICAgICYmIGlmYWNlX3N0YXR1cyA9PSBJRlNUQVRVU19VUAorCSAgICApCisJIHx8IChvcHRzICYgRkxBR19JTklUSUFMX0RPV04pCisJKSB7CisJCWlmIChydW5fc2NyaXB0KGlmYWNlX3N0YXR1c19zdHIpICE9IDApCisJCQlnb3RvIGV4aXRpbmc7CisJfQorCisJLyogTWFpbiBsb29wICovCisJbmV0bGlua19wb2xsZmRbMF0uZmQgPSBuZXRsaW5rX2ZkOworCW5ldGxpbmtfcG9sbGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKwlkZWxheV90aW1lID0gMDsKKwl3aGlsZSAoMSkgeworCQlpbnQgaWZhY2Vfc3RhdHVzX29sZDsKKworCQlzd2l0Y2ggKGJiX2dvdF9zaWduYWwpIHsKKwkJY2FzZSBTSUdJTlQ6CisJCWNhc2UgU0lHVEVSTToKKwkJCWJiX2dvdF9zaWduYWwgPSAwOworCQkJZ290byBjbGVhbnVwOworCQljYXNlIFNJR1FVSVQ6CisJCQliYl9nb3Rfc2lnbmFsID0gMDsKKwkJCWdvdG8gZXhpdGluZzsKKwkJZGVmYXVsdDoKKwkJCWJiX2dvdF9zaWduYWwgPSAwOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocG9sbChuZXRsaW5rX3BvbGxmZCwKKwkJCQkob3B0cyAmIEZMQUdfTU9OSVRPUikgPyAxIDogMCwKKwkJCQlHLnBvbGxfdGltZQorCQkJKSA8IDAKKwkJKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CisJCQliYl9wZXJyb3JfbXNnKCJwb2xsIik7CisJCQlnb3RvIGV4aXRpbmc7CisJCX0KKworCQlpZiAoKG9wdHMgJiBGTEFHX01PTklUT1IpCisJCSAmJiAobmV0bGlua19wb2xsZmRbMF0ucmV2ZW50cyAmIFBPTExJTikKKwkJKSB7CisJCQlpbnQgaWZhY2VfZXhpc3RzX29sZDsKKworCQkJaWZhY2VfZXhpc3RzX29sZCA9IEcuaWZhY2VfZXhpc3RzOworCQkJRy5pZmFjZV9leGlzdHMgPSBjaGVja19leGlzdGVuY2VfdGhyb3VnaF9uZXRsaW5rKCk7CisJCQlpZiAoRy5pZmFjZV9leGlzdHMgPCAwKSAvKiBlcnJvciAqLworCQkJCWdvdG8gZXhpdGluZzsKKwkJCWlmIChpZmFjZV9leGlzdHNfb2xkICE9IEcuaWZhY2VfZXhpc3RzKSB7CisJCQkJYmJfZXJyb3JfbXNnKCJpbnRlcmZhY2UgJXNhcHBlYXJlZCIsCisJCQkJCQlHLmlmYWNlX2V4aXN0cyA/ICIiIDogImRpcyIpOworCQkJCWlmIChHLmlmYWNlX2V4aXN0cykKKwkJCQkJbWF5YmVfdXBfbmV3X2lmYWNlKCk7CisJCQl9CisJCX0KKworCQkvKiBub3RlOiBpZiAhRy5pZmFjZV9leGlzdHMsIHJldHVybnMgRE9XTiAqLworCQlpZmFjZV9zdGF0dXNfb2xkID0gaWZhY2Vfc3RhdHVzOworCQlpZmFjZV9zdGF0dXMgPSBkZXRlY3RfbGluaygpOworCQlpZiAoaWZhY2Vfc3RhdHVzID09IElGU1RBVFVTX0VSUikgeworCQkJaWYgKCEob3B0cyAmIEZMQUdfTU9OSVRPUikpCisJCQkJZ290byBleGl0aW5nOworCQkJaWZhY2Vfc3RhdHVzID0gSUZTVEFUVVNfRE9XTjsKKwkJfQorCQlpZmFjZV9zdGF0dXNfc3RyID0gc3Ryc3RhdHVzKGlmYWNlX3N0YXR1cyk7CisKKwkJaWYgKGlmYWNlX3N0YXR1c19vbGQgIT0gaWZhY2Vfc3RhdHVzKSB7CisJCQliYl9lcnJvcl9tc2coImxpbmsgaXMgJXMiLCBpZmFjZV9zdGF0dXNfc3RyKTsKKworCQkJaWYgKGRlbGF5X3RpbWUpIHsKKwkJCQkvKiBsaW5rIHJlc3RvcmVkIGl0cyBvbGQgc3RhdHVzIGJlZm9yZQorCQkJCSAqIHdlIHJhbiBzY3JpcHQuIGRvbid0IHJ1biB0aGUgc2NyaXB0OiAqLworCQkJCWRlbGF5X3RpbWUgPSAwOworCQkJfSBlbHNlIHsKKwkJCQlkZWxheV90aW1lID0gbW9ub3RvbmljX3NlYygpOworCQkJCWlmIChpZmFjZV9zdGF0dXMgPT0gSUZTVEFUVVNfVVApCisJCQkJCWRlbGF5X3RpbWUgKz0gRy5kZWxheV91cDsKKwkJCQlpZiAoaWZhY2Vfc3RhdHVzID09IElGU1RBVFVTX0RPV04pCisJCQkJCWRlbGF5X3RpbWUgKz0gRy5kZWxheV9kb3duOworI2lmIDAgIC8qIGlmIHlvdSBhcmUgYmFjayBpbiAxOTcwLi4uICovCisJCQkJaWYgKGRlbGF5X3RpbWUgPT0gMCkgeworCQkJCQlzbGVlcCgxKTsKKwkJCQkJZGVsYXlfdGltZSA9IDE7CisJCQkJfQorI2VuZGlmCisJCQl9CisJCX0KKworCQlpZiAoZGVsYXlfdGltZSAmJiAoaW50KShtb25vdG9uaWNfc2VjKCkgLSBkZWxheV90aW1lKSA+PSAwKSB7CisJCQlpZiAocnVuX3NjcmlwdChpZmFjZV9zdGF0dXNfc3RyKSAhPSAwKQorCQkJCWdvdG8gZXhpdGluZzsKKwkJCWRlbGF5X3RpbWUgPSAwOworCQl9CisJfSAvKiB3aGlsZSAoMSkgKi8KKworIGNsZWFudXA6CisJaWYgKCEob3B0cyAmIEZMQUdfTk9fU0hVVERPV04pCisJICYmIChpZmFjZV9zdGF0dXMgPT0gSUZTVEFUVVNfVVAKKwkgICAgIHx8IChpZmFjZV9zdGF0dXMgPT0gSUZTVEFUVVNfRE9XTiAmJiBkZWxheV90aW1lKQorCSAgICApCisJKSB7CisJCXNldGVudihJRlBMVUdEX0VOVl9QUkVWSU9VUywgc3Ryc3RhdHVzKGlmYWNlX3N0YXR1cyksIDEpOworCQlzZXRlbnYoSUZQTFVHRF9FTlZfQ1VSUkVOVCwgc3Ryc3RhdHVzKC0xKSwgMSk7CisJCXJ1bl9zY3JpcHQoImRvd25cMHVwIik7IC8qIHJldXNpbmcgc3RyaW5nICovCisJfQorCisgZXhpdGluZzoKKwlyZW1vdmVfcGlkZmlsZShwaWRmaWxlX25hbWUpOworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJleGl0aW5nIik7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2lmdXBkb3duLmMgYi9uZXR3b3JraW5nL2lmdXBkb3duLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0NWU4OQotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvaWZ1cGRvd24uYwpAQCAtMCwwICsxLDEzNjUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqICBpZnVwZG93biBmb3IgYnVzeWJveAorICogIENvcHlyaWdodCAoYykgMjAwMiBHbGVubiBNY0dyYXRoCisgKiAgQ29weXJpZ2h0IChjKSAyMDAzLTIwMDQgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqICBCYXNlZCBvbiBpZnVwZG93biB2IDAuNi40IGJ5IEFudGhvbnkgVG93bnMKKyAqICBDb3B5cmlnaHQgKGMpIDE5OTkgQW50aG9ueSBUb3ducyA8YWpAYXp1cmUuaHVtYnVnLm9yZy5hdT4KKyAqCisgKiAgQ2hhbmdlcyB0byB1cHN0cmVhbSB2ZXJzaW9uCisgKiAgUmVtb3ZlIGNoZWNrcyBmb3Iga2VybmVsIHZlcnNpb24sIGFzc3VtZSBrZXJuZWwgdmVyc2lvbiAyLjIuMCBvciBiZXR0ZXIuCisgKiAgTGluZXMgaW4gdGhlIGludGVyZmFjZXMgZmlsZSBjYW5ub3Qgd3JhcC4KKyAqICBUbyBhZGhlcmUgdG8gdGhlIEZIUywgdGhlIGRlZmF1bHQgc3RhdGUgZmlsZSBpcyAvdmFyL3J1bi9pZnN0YXRlCisgKiAgKGRlZmluZWQgdmlhIENPTkZJR19JRlVQRE9XTl9JRlNUQVRFX1BBVEgpIGFuZCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBidWlsZAorICogIGNvbmZpZ3VyYXRpb24uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgaWZ1cF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1hbiJJRl9GRUFUVVJFX0lGVVBET1dOX01BUFBJTkcoIm0iKSJ2Zl0gWy1pIEZJTEVdIElGQUNFLi4uIgorLy91c2FnZTojZGVmaW5lIGlmdXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLWEJRGUvY29uZmlndXJlIGFsbCBpbnRlcmZhY2VzIGF1dG9tYXRpY2FsbHkiCisvL3VzYWdlOiAgICAgIlxuCS1pIEZJTEUJVXNlIEZJTEUgZm9yIGludGVyZmFjZSBkZWZpbml0aW9ucyIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JUHJpbnQgb3V0IHdoYXQgd291bGQgaGFwcGVuLCBidXQgZG9uJ3QgZG8gaXQiCisvL3VzYWdlOglJRl9GRUFUVVJFX0lGVVBET1dOX01BUFBJTkcoCisvL3VzYWdlOiAgICAgIlxuCQkobm90ZTogZG9lc24ndCBkaXNhYmxlIG1hcHBpbmdzKSIKKy8vdXNhZ2U6ICAgICAiXG4JLW0JRG9uJ3QgcnVuIGFueSBtYXBwaW5ncyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXYJUHJpbnQgb3V0IHdoYXQgd291bGQgaGFwcGVuIGJlZm9yZSBkb2luZyBpdCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgZGUvY29uZmlndXJhdGlvbiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgaWZkb3duX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWFuIklGX0ZFQVRVUkVfSUZVUERPV05fTUFQUElORygibSIpInZmXSBbLWkgRklMRV0gSUZBQ0UuLi4iCisvL3VzYWdlOiNkZWZpbmUgaWZkb3duX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1hCURlL2NvbmZpZ3VyZSBhbGwgaW50ZXJmYWNlcyBhdXRvbWF0aWNhbGx5IgorLy91c2FnZTogICAgICJcbgktaSBGSUxFCVVzZSBGSUxFIGZvciBpbnRlcmZhY2UgZGVmaW5pdGlvbnMiCisvL3VzYWdlOiAgICAgIlxuCS1uCVByaW50IG91dCB3aGF0IHdvdWxkIGhhcHBlbiwgYnV0IGRvbid0IGRvIGl0IgorLy91c2FnZToJSUZfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HKAorLy91c2FnZTogICAgICJcbgkJKG5vdGU6IGRvZXNuJ3QgZGlzYWJsZSBtYXBwaW5ncykiCisvL3VzYWdlOiAgICAgIlxuCS1tCURvbid0IHJ1biBhbnkgbWFwcGluZ3MiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS12CVByaW50IG91dCB3aGF0IHdvdWxkIGhhcHBlbiBiZWZvcmUgZG9pbmcgaXQiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIGRlL2NvbmZpZ3VyYXRpb24iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorLyogQWZ0ZXIgbGliYmIuaCwgc2luY2UgaXQgbmVlZHMgc3lzL3R5cGVzLmggb24gc29tZSBzeXN0ZW1zICovCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNpbmNsdWRlIDxmbm1hdGNoLmg+CisKKyNkZWZpbmUgTUFYX09QVF9ERVBUSCAxMAorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fTUFQUElORworI2RlZmluZSBNQVhfSU5URVJGQUNFX0xFTkdUSCAxMAorI2VuZGlmCisKKyNkZWZpbmUgVURIQ1BDX0NNRF9PUFRJT05TIENPTkZJR19JRlVQRE9XTl9VREhDUENfQ01EX09QVElPTlMKKworI2RlZmluZSBkZWJ1Z19ub2lzZShhcmdzLi4uKSAvKmZwcmludGYoc3RkZXJyLCBhcmdzKSovCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb24gKi8KK3N0cnVjdCBpbnRlcmZhY2VfZGVmbl90OworCit0eXBlZGVmIGludCBleGVjZm4oY2hhciAqY29tbWFuZCk7CisKK3N0cnVjdCBtZXRob2RfdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCp1cCkoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICplKSBGQVNUX0ZVTkM7CisJaW50ICgqZG93bikoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICplKSBGQVNUX0ZVTkM7Cit9OworCitzdHJ1Y3QgYWRkcmVzc19mYW1pbHlfdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgbl9tZXRob2RzOworCWNvbnN0IHN0cnVjdCBtZXRob2RfdCAqbWV0aG9kOworfTsKKworc3RydWN0IG1hcHBpbmdfZGVmbl90IHsKKwlzdHJ1Y3QgbWFwcGluZ19kZWZuX3QgKm5leHQ7CisKKwlpbnQgbWF4X21hdGNoZXM7CisJaW50IG5fbWF0Y2hlczsKKwljaGFyICoqbWF0Y2g7CisKKwljaGFyICpzY3JpcHQ7CisKKwlpbnQgbl9tYXBwaW5nczsKKwljaGFyICoqbWFwcGluZzsKK307CisKK3N0cnVjdCB2YXJpYWJsZV90IHsKKwljaGFyICpuYW1lOworCWNoYXIgKnZhbHVlOworfTsKKworc3RydWN0IGludGVyZmFjZV9kZWZuX3QgeworCWNvbnN0IHN0cnVjdCBhZGRyZXNzX2ZhbWlseV90ICphZGRyZXNzX2ZhbWlseTsKKwljb25zdCBzdHJ1Y3QgbWV0aG9kX3QgKm1ldGhvZDsKKworCWNoYXIgKmlmYWNlOworCWludCBuX29wdGlvbnM7CisJc3RydWN0IHZhcmlhYmxlX3QgKm9wdGlvbjsKK307CisKK3N0cnVjdCBpbnRlcmZhY2VzX2ZpbGVfdCB7CisJbGxpc3RfdCAqYXV0b2ludGVyZmFjZXM7CisJbGxpc3RfdCAqaWZhY2VzOworCXN0cnVjdCBtYXBwaW5nX2RlZm5fdCAqbWFwcGluZ3M7Cit9OworCisKKyNkZWZpbmUgT1BUSU9OX1NUUiAiYW52ZiIgSUZfRkVBVFVSRV9JRlVQRE9XTl9NQVBQSU5HKCJtIikgImk6IgorZW51bSB7CisJT1BUX2RvX2FsbCAgICAgID0gMHgxLAorCU9QVF9ub19hY3QgICAgICA9IDB4MiwKKwlPUFRfdmVyYm9zZSAgICAgPSAweDQsCisJT1BUX2ZvcmNlICAgICAgID0gMHg4LAorCU9QVF9ub19tYXBwaW5ncyA9IDB4MTAsCit9OworI2RlZmluZSBET19BTEwgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9kb19hbGwpCisjZGVmaW5lIE5PX0FDVCAgICAgIChvcHRpb25fbWFzazMyICYgT1BUX25vX2FjdCkKKyNkZWZpbmUgVkVSQk9TRSAgICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfdmVyYm9zZSkKKyNkZWZpbmUgRk9SQ0UgICAgICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfZm9yY2UpCisjZGVmaW5lIE5PX01BUFBJTkdTIChvcHRpb25fbWFzazMyICYgT1BUX25vX21hcHBpbmdzKQorCisKK3N0cnVjdCBnbG9iYWxzIHsKKwljaGFyICoqbXlfZW52aXJvbjsKKwljb25zdCBjaGFyICpzdGFydHVwX1BBVEg7CisJY2hhciAqc2hlbGw7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBJTklUX0coKSBkbyB7IH0gd2hpbGUgKDApCisKKworc3RhdGljIGNvbnN0IGNoYXIga2V5d29yZHNfdXBfZG93bltdIEFMSUdOMSA9CisJInVwXDAiCisJImRvd25cMCIKKwkicHJlLXVwXDAiCisJInBvc3QtZG93blwwIgorOworCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9JUFY0IHx8IEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQVjYKKworc3RhdGljIHZvaWQgYWRkc3RyKGNoYXIgKipidWZwLCBjb25zdCBjaGFyICpzdHIsIHNpemVfdCBzdHJfbGVuZ3RoKQoreworCS8qIHhhc3ByaW50ZiB0cmljayB3aWxsIGJlIHNtYWxsZXIsIGJ1dCB3ZSBhcmUgb2Z0ZW4KKwkgKiBjYWxsZWQgd2l0aCBzdHJfbGVuZ3RoID09IDEgLSBkb24ndCB3YW50IHRvIGhhdmUKKwkgKiBUSEFUIG11Y2ggb2YgbWFsbG9jL2ZyZWVpbmchICovCisJY2hhciAqYnVmID0gKmJ1ZnA7CisJaW50IGxlbiA9IChidWYgPyBzdHJsZW4oYnVmKSA6IDApOworCXN0cl9sZW5ndGgrKzsKKwlidWYgPSB4cmVhbGxvYyhidWYsIGxlbiArIHN0cl9sZW5ndGgpOworCS8qIGNvcGllcyBhdCBtb3N0IHN0cl9sZW5ndGgtMSBjaGFycyEgKi8KKwlzYWZlX3N0cm5jcHkoYnVmICsgbGVuLCBzdHIsIHN0cl9sZW5ndGgpOworCSpidWZwID0gYnVmOworfQorCitzdGF0aWMgaW50IHN0cm5jbXB6KGNvbnN0IGNoYXIgKmwsIGNvbnN0IGNoYXIgKnIsIHNpemVfdCBsbGVuKQoreworCWludCBpID0gc3RybmNtcChsLCByLCBsbGVuKTsKKworCWlmIChpID09IDApCisJCXJldHVybiAtICh1bnNpZ25lZCBjaGFyKXJbbGxlbl07CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBjaGFyICpnZXRfdmFyKGNvbnN0IGNoYXIgKmlkLCBzaXplX3QgaWRsZW4sIHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQpCit7CisJaW50IGk7CisKKwlpZiAoc3RybmNtcHooaWQsICJpZmFjZSIsIGlkbGVuKSA9PSAwKSB7CisJCS8vIHVidW50dSdzIGlmdXAgZG9lc24ndCBkbyB0aGlzOgorCQkvL3N0YXRpYyBjaGFyICpsYWJlbF9idWY7CisJCS8vY2hhciAqcmVzdWx0OworCQkvL2ZyZWUobGFiZWxfYnVmKTsKKwkJLy9sYWJlbF9idWYgPSB4c3RyZHVwKGlmZC0+aWZhY2UpOworCQkvLyBSZW1vdmUgdmlydHVhbCBpZmFjZSBzdWZmaXgKKwkJLy9yZXN1bHQgPSBzdHJjaHJudWwobGFiZWxfYnVmLCAnOicpOworCQkvLypyZXN1bHQgPSAnXDAnOworCQkvL3JldHVybiBsYWJlbF9idWY7CisKKwkJcmV0dXJuIGlmZC0+aWZhY2U7CisJfQorCWlmIChzdHJuY21weihpZCwgImxhYmVsIiwgaWRsZW4pID09IDApIHsKKwkJcmV0dXJuIGlmZC0+aWZhY2U7CisJfQorCWZvciAoaSA9IDA7IGkgPCBpZmQtPm5fb3B0aW9uczsgaSsrKSB7CisJCWlmIChzdHJuY21weihpZCwgaWZkLT5vcHRpb25baV0ubmFtZSwgaWRsZW4pID09IDApIHsKKwkJCXJldHVybiBpZmQtPm9wdGlvbltpXS52YWx1ZTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworIyBpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9JUAorc3RhdGljIGludCBjb3VudF9uZXRtYXNrX2JpdHMoY29uc3QgY2hhciAqZG90dGVkX3F1YWQpCit7CisvLwlpbnQgcmVzdWx0OworLy8JdW5zaWduZWQgYSwgYiwgYywgZDsKKy8vCS8qIEZvdW5kIGEgbmV0bWFzay4uLiAgQ2hlY2sgaWYgaXQgaXMgZG90dGVkIHF1YWQgKi8KKy8vCWlmIChzc2NhbmYoZG90dGVkX3F1YWQsICIldS4ldS4ldS4ldSIsICZhLCAmYiwgJmMsICZkKSAhPSA0KQorLy8JCXJldHVybiAtMTsKKy8vCWlmICgoYXxifGN8ZCkgPj4gOCkKKy8vCQlyZXR1cm4gLTE7IC8qIG9uZSBvZiBudW1iZXJzIGlzID49IDI1NiAqLworLy8JZCB8PSAoYSA8PCAyNCkgfCAoYiA8PCAxNikgfCAoYyA8PCA4KTsgLyogSVAgKi8KKy8vCWQgPSB+ZDsgLyogMTExMTAwMDAgLT4gMDAwMDExMTEgKi8KKworCS8qIFNob3J0ZXIgdmVyc2lvbiAqLworCWludCByZXN1bHQ7CisJc3RydWN0IGluX2FkZHIgaXA7CisJdW5zaWduZWQgZDsKKworCWlmIChpbmV0X2F0b24oZG90dGVkX3F1YWQsICZpcCkgPT0gMCkKKwkJcmV0dXJuIC0xOyAvKiBtYWxmb3JtZWQgZG90dGVkIElQICovCisJZCA9IG50b2hsKGlwLnNfYWRkcik7IC8qIElQIGluIGhvc3Qgb3JkZXIgKi8KKwlkID0gfmQ7IC8qIDExMTEwMDAwIC0+IDAwMDAxMTExICovCisJaWYgKGQgJiAoZCsxKSkgLyogY2hlY2sgdGhhdCBpdCBpcyBpbiAwMDAwMTExMSBmb3JtICovCisJCXJldHVybiAtMTsgLyogbm8gaXQgaXMgbm90ICovCisJcmVzdWx0ID0gMzI7CisJd2hpbGUgKGQpIHsKKwkJZCA+Pj0gMTsKKwkJcmVzdWx0LS07CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisjIGVuZGlmCisKK3N0YXRpYyBjaGFyICpwYXJzZShjb25zdCBjaGFyICpjb21tYW5kLCBzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkKQoreworCXNpemVfdCBvbGRfcG9zW01BWF9PUFRfREVQVEhdID0geyAwIH07CisJc21hbGxpbnQgb2theVtNQVhfT1BUX0RFUFRIXSA9IHsgMSB9OworCWludCBvcHRfZGVwdGggPSAxOworCWNoYXIgKnJlc3VsdCA9IE5VTEw7CisKKwl3aGlsZSAoKmNvbW1hbmQpIHsKKwkJc3dpdGNoICgqY29tbWFuZCkgeworCQlkZWZhdWx0OgorCQkJYWRkc3RyKCZyZXN1bHQsIGNvbW1hbmQsIDEpOworCQkJY29tbWFuZCsrOworCQkJYnJlYWs7CisJCWNhc2UgJ1xcJzoKKwkJCWlmIChjb21tYW5kWzFdKQorCQkJCWNvbW1hbmQrKzsKKwkJCWFkZHN0cigmcmVzdWx0LCBjb21tYW5kLCAxKTsKKwkJCWNvbW1hbmQrKzsKKwkJCWJyZWFrOworCQljYXNlICdbJzoKKwkJCWlmIChjb21tYW5kWzFdID09ICdbJyAmJiBvcHRfZGVwdGggPCBNQVhfT1BUX0RFUFRIKSB7CisJCQkJb2xkX3Bvc1tvcHRfZGVwdGhdID0gcmVzdWx0ID8gc3RybGVuKHJlc3VsdCkgOiAwOworCQkJCW9rYXlbb3B0X2RlcHRoXSA9IDE7CisJCQkJb3B0X2RlcHRoKys7CisJCQkJY29tbWFuZCArPSAyOworCQkJfSBlbHNlIHsKKwkJCQlhZGRzdHIoJnJlc3VsdCwgY29tbWFuZCwgMSk7CisJCQkJY29tbWFuZCsrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ10nOgorCQkJaWYgKGNvbW1hbmRbMV0gPT0gJ10nICYmIG9wdF9kZXB0aCA+IDEpIHsKKwkJCQlvcHRfZGVwdGgtLTsKKwkJCQlpZiAoIW9rYXlbb3B0X2RlcHRoXSkgeworCQkJCQlyZXN1bHRbb2xkX3Bvc1tvcHRfZGVwdGhdXSA9ICdcMCc7CisJCQkJfQorCQkJCWNvbW1hbmQgKz0gMjsKKwkJCX0gZWxzZSB7CisJCQkJYWRkc3RyKCZyZXN1bHQsIGNvbW1hbmQsIDEpOworCQkJCWNvbW1hbmQrKzsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICclJzoKKwkJCXsKKwkJCQljaGFyICpuZXh0cGVyY2VudDsKKwkJCQljaGFyICp2YXJ2YWx1ZTsKKworCQkJCWNvbW1hbmQrKzsKKwkJCQluZXh0cGVyY2VudCA9IHN0cmNocihjb21tYW5kLCAnJScpOworCQkJCWlmICghbmV4dHBlcmNlbnQpIHsKKwkJCQkJLyogVW50ZXJtaW5hdGVkICV2YXIlICovCisJCQkJCWZyZWUocmVzdWx0KTsKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQkJfQorCisJCQkJdmFydmFsdWUgPSBnZXRfdmFyKGNvbW1hbmQsIG5leHRwZXJjZW50IC0gY29tbWFuZCwgaWZkKTsKKworCQkJCWlmICh2YXJ2YWx1ZSkgeworIyBpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9JUAorCQkJCQkvKiAiaHdhZGRyZXNzIDxjbGFzcz4gPGFkZHJlc3M+IjoKKwkJCQkJICogdW5saWtlIGlmY29uZmlnLCBpcCBkb2VzbnQgd2FudCA8Y2xhc3M+CisJCQkJCSAqICh1c3VhbGx5ICJldGhlciIga2V5d29yZCkuIFNraXAgaXQuICovCisJCQkJCWlmIChpc19wcmVmaXhlZF93aXRoKGNvbW1hbmQsICJod2FkZHJlc3MiKSkgeworCQkJCQkJdmFydmFsdWUgPSBza2lwX3doaXRlc3BhY2Uoc2tpcF9ub25fd2hpdGVzcGFjZSh2YXJ2YWx1ZSkpOworCQkJCQl9CisjIGVuZGlmCisJCQkJCWFkZHN0cigmcmVzdWx0LCB2YXJ2YWx1ZSwgc3RybGVuKHZhcnZhbHVlKSk7CisJCQkJfSBlbHNlIHsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fSVAKKwkJCQkJLyogU2lnaC4uLiAgQWRkIGEgc3BlY2lhbCBjYXNlIGZvciAnaXAnIHRvIGNvbnZlcnQgZnJvbQorCQkJCQkgKiBkb3R0ZWQgcXVhZCB0byBiaXQgY291bnQgc3R5bGUgbmV0bWFza3MuICAqLworCQkJCQlpZiAoaXNfcHJlZml4ZWRfd2l0aChjb21tYW5kLCAiYm5tYXNrIikpIHsKKwkJCQkJCXVuc2lnbmVkIHJlczsKKwkJCQkJCXZhcnZhbHVlID0gZ2V0X3ZhcigibmV0bWFzayIsIDcsIGlmZCk7CisJCQkJCQlpZiAodmFydmFsdWUpIHsKKwkJCQkJCQlyZXMgPSBjb3VudF9uZXRtYXNrX2JpdHModmFydmFsdWUpOworCQkJCQkJCWlmIChyZXMgPiAwKSB7CisJCQkJCQkJCWNvbnN0IGNoYXIgKmFyZ3VtZW50ID0gdXRvYShyZXMpOworCQkJCQkJCQlhZGRzdHIoJnJlc3VsdCwgYXJndW1lbnQsIHN0cmxlbihhcmd1bWVudCkpOworCQkJCQkJCQljb21tYW5kID0gbmV4dHBlcmNlbnQgKyAxOworCQkJCQkJCQlicmVhazsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKyMgZW5kaWYKKwkJCQkJb2theVtvcHRfZGVwdGggLSAxXSA9IDA7CisJCQkJfQorCisJCQkJY29tbWFuZCA9IG5leHRwZXJjZW50ICsgMTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKG9wdF9kZXB0aCA+IDEpIHsKKwkJLyogVW5iYWxhbmNlZCBicmFja2V0ICovCisJCWZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKCFva2F5WzBdKSB7CisJCS8qIFVuZGVmaW5lZCB2YXJpYWJsZSBhbmQgd2UgYXJlbid0IGluIGEgYnJhY2tldCAqLworCQlmcmVlKHJlc3VsdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIGV4ZWN1dGUoKSByZXR1cm5zIDEgZm9yIHN1Y2Nlc3MgYW5kIDAgZm9yIGZhaWx1cmUgKi8KK3N0YXRpYyBpbnQgZXhlY3V0ZShjb25zdCBjaGFyICpjb21tYW5kLCBzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkLCBleGVjZm4gKmV4ZWMpCit7CisJY2hhciAqb3V0OworCWludCByZXQ7CisKKwlvdXQgPSBwYXJzZShjb21tYW5kLCBpZmQpOworCWlmICghb3V0KSB7CisJCS8qIHBhcnNlIGVycm9yPyAqLworCQlyZXR1cm4gMDsKKwl9CisJLyogb3V0ID09ICIiOiBwYXJzZWQgb2sgYnV0IG5vdCBhbGwgbmVlZGVkIHZhcmlhYmxlcyBrbm93biwgc2tpcCAqLworCXJldCA9IG91dFswXSA/ICgqZXhlYykob3V0KSA6IDE7CisKKwlmcmVlKG91dCk7CisJaWYgKHJldCAhPSAxKSB7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworI2VuZGlmIC8qIEZFQVRVUkVfSUZVUERPV05fSVBWNCB8fCBGRUFUVVJFX0lGVVBET1dOX0lQVjYgKi8KKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fSVBWNgorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBsb29wYmFja191cDYoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworIyBpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9JUAorCWludCByZXN1bHQ7CisJcmVzdWx0ID0gZXhlY3V0ZSgiaXAgYWRkciBhZGQgOjoxIGRldiAlaWZhY2UlIiwgaWZkLCBleGVjKTsKKwlyZXN1bHQgKz0gZXhlY3V0ZSgiaXAgbGluayBzZXQgJWlmYWNlJSB1cCIsIGlmZCwgZXhlYyk7CisJcmV0dXJuICgocmVzdWx0ID09IDIpID8gMiA6IDApOworIyBlbHNlCisJcmV0dXJuIGV4ZWN1dGUoImlmY29uZmlnICVpZmFjZSUgYWRkIDo6MSIsIGlmZCwgZXhlYyk7CisjIGVuZGlmCit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGxvb3BiYWNrX2Rvd242KHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQsIGV4ZWNmbiAqZXhlYykKK3sKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fSVAKKwlyZXR1cm4gZXhlY3V0ZSgiaXAgbGluayBzZXQgJWlmYWNlJSBkb3duIiwgaWZkLCBleGVjKTsKKyMgZWxzZQorCXJldHVybiBleGVjdXRlKCJpZmNvbmZpZyAlaWZhY2UlIGRlbCA6OjEiLCBpZmQsIGV4ZWMpOworIyBlbmRpZgorfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBtYW51YWxfdXBfZG93bjYoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCBVTlVTRURfUEFSQU0sIGV4ZWNmbiAqZXhlYyBVTlVTRURfUEFSQU0pCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHN0YXRpY191cDYoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworCWludCByZXN1bHQ7CisjIGlmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQCisJcmVzdWx0ID0gZXhlY3V0ZSgiaXAgYWRkciBhZGQgJWFkZHJlc3MlLyVuZXRtYXNrJSBkZXYgJWlmYWNlJVtbIGxhYmVsICVsYWJlbCVdXSIsIGlmZCwgZXhlYyk7CisJcmVzdWx0ICs9IGV4ZWN1dGUoImlwIGxpbmsgc2V0W1sgbXR1ICVtdHUlXV1bWyBhZGRyICVod2FkZHJlc3MlXV0gJWlmYWNlJSB1cCIsIGlmZCwgZXhlYyk7CisJLyogV2FzOiAiW1sgaXAgLi4uLiVnYXRld2F5JSBdXSIuIFJlbW92ZWQgZXh0cmEgc3BhY2VzIHcvbyBjaGVja2luZyAqLworCXJlc3VsdCArPSBleGVjdXRlKCJbW2lwIHJvdXRlIGFkZCA6Oi8wIHZpYSAlZ2F0ZXdheSVdXVtbIG1ldHJpYyAlbWV0cmljJV1dIiwgaWZkLCBleGVjKTsKKyMgZWxzZQorCXJlc3VsdCA9IGV4ZWN1dGUoImlmY29uZmlnICVpZmFjZSVbWyBtZWRpYSAlbWVkaWElXV1bWyBodyAlaHdhZGRyZXNzJV1dW1sgbXR1ICVtdHUlXV0gdXAiLCBpZmQsIGV4ZWMpOworCXJlc3VsdCArPSBleGVjdXRlKCJpZmNvbmZpZyAlaWZhY2UlIGFkZCAlYWRkcmVzcyUvJW5ldG1hc2slIiwgaWZkLCBleGVjKTsKKwlyZXN1bHQgKz0gZXhlY3V0ZSgiW1tyb3V0ZSAtQSBpbmV0NiBhZGQgOjovMCBndyAlZ2F0ZXdheSVbWyBtZXRyaWMgJW1ldHJpYyVdXV1dIiwgaWZkLCBleGVjKTsKKyMgZW5kaWYKKwlyZXR1cm4gKChyZXN1bHQgPT0gMykgPyAzIDogMCk7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHN0YXRpY19kb3duNihzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkLCBleGVjZm4gKmV4ZWMpCit7CisjIGlmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQCisJcmV0dXJuIGV4ZWN1dGUoImlwIGxpbmsgc2V0ICVpZmFjZSUgZG93biIsIGlmZCwgZXhlYyk7CisjIGVsc2UKKwlyZXR1cm4gZXhlY3V0ZSgiaWZjb25maWcgJWlmYWNlJSBkb3duIiwgaWZkLCBleGVjKTsKKyMgZW5kaWYKK30KKworIyBpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9JUAorc3RhdGljIGludCBGQVNUX0ZVTkMgdjR0dW5uZWxfdXAoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworCWludCByZXN1bHQ7CisJcmVzdWx0ID0gZXhlY3V0ZSgiaXAgdHVubmVsIGFkZCAlaWZhY2UlIG1vZGUgc2l0IHJlbW90ZSAiCisJCQkiJWVuZHBvaW50JVtbIGxvY2FsICVsb2NhbCVdXVtbIHR0bCAldHRsJV1dIiwgaWZkLCBleGVjKTsKKwlyZXN1bHQgKz0gZXhlY3V0ZSgiaXAgbGluayBzZXQgJWlmYWNlJSB1cCIsIGlmZCwgZXhlYyk7CisJcmVzdWx0ICs9IGV4ZWN1dGUoImlwIGFkZHIgYWRkICVhZGRyZXNzJS8lbmV0bWFzayUgZGV2ICVpZmFjZSUiLCBpZmQsIGV4ZWMpOworCXJlc3VsdCArPSBleGVjdXRlKCJbW2lwIHJvdXRlIGFkZCA6Oi8wIHZpYSAlZ2F0ZXdheSVdXSIsIGlmZCwgZXhlYyk7CisJcmV0dXJuICgocmVzdWx0ID09IDQpID8gNCA6IDApOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyB2NHR1bm5lbF9kb3duKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICogaWZkLCBleGVjZm4gKiBleGVjKQoreworCXJldHVybiBleGVjdXRlKCJpcCB0dW5uZWwgZGVsICVpZmFjZSUiLCBpZmQsIGV4ZWMpOworfQorIyBlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IG1ldGhvZF90IG1ldGhvZHM2W10gPSB7CisjIGlmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQCisJeyAidjR0dW5uZWwiICwgdjR0dW5uZWxfdXAgICAgICwgdjR0dW5uZWxfZG93biAgICwgfSwKKyMgZW5kaWYKKwl7ICJzdGF0aWMiICAgLCBzdGF0aWNfdXA2ICAgICAgLCBzdGF0aWNfZG93bjYgICAgLCB9LAorCXsgIm1hbnVhbCIgICAsIG1hbnVhbF91cF9kb3duNiAsIG1hbnVhbF91cF9kb3duNiAsIH0sCisJeyAibG9vcGJhY2siICwgbG9vcGJhY2tfdXA2ICAgICwgbG9vcGJhY2tfZG93bjYgICwgfSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWRkcmVzc19mYW1pbHlfdCBhZGRyX2luZXQ2ID0geworCSJpbmV0NiIsCisJQVJSQVlfU0laRShtZXRob2RzNiksCisJbWV0aG9kczYKK307CisKKyNlbmRpZiAvKiBGRUFUVVJFX0lGVVBET1dOX0lQVjYgKi8KKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fSVBWNAorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBsb29wYmFja191cChzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkLCBleGVjZm4gKmV4ZWMpCit7CisjIGlmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQCisJaW50IHJlc3VsdDsKKwlyZXN1bHQgPSBleGVjdXRlKCJpcCBhZGRyIGFkZCAxMjcuMC4wLjEvOCBkZXYgJWlmYWNlJSIsIGlmZCwgZXhlYyk7CisJcmVzdWx0ICs9IGV4ZWN1dGUoImlwIGxpbmsgc2V0ICVpZmFjZSUgdXAiLCBpZmQsIGV4ZWMpOworCXJldHVybiAoKHJlc3VsdCA9PSAyKSA/IDIgOiAwKTsKKyMgZWxzZQorCXJldHVybiBleGVjdXRlKCJpZmNvbmZpZyAlaWZhY2UlIDEyNy4wLjAuMSB1cCIsIGlmZCwgZXhlYyk7CisjIGVuZGlmCit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGxvb3BiYWNrX2Rvd24oc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworIyBpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9JUAorCWludCByZXN1bHQ7CisJcmVzdWx0ID0gZXhlY3V0ZSgiaXAgYWRkciBmbHVzaCBkZXYgJWlmYWNlJSIsIGlmZCwgZXhlYyk7CisJcmVzdWx0ICs9IGV4ZWN1dGUoImlwIGxpbmsgc2V0ICVpZmFjZSUgZG93biIsIGlmZCwgZXhlYyk7CisJcmV0dXJuICgocmVzdWx0ID09IDIpID8gMiA6IDApOworIyBlbHNlCisJcmV0dXJuIGV4ZWN1dGUoImlmY29uZmlnICVpZmFjZSUgMTI3LjAuMC4xIGRvd24iLCBpZmQsIGV4ZWMpOworIyBlbmRpZgorfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBzdGF0aWNfdXAoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworCWludCByZXN1bHQ7CisjIGlmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQCisJcmVzdWx0ID0gZXhlY3V0ZSgiaXAgYWRkciBhZGQgJWFkZHJlc3MlLyVibm1hc2slW1sgYnJvYWRjYXN0ICVicm9hZGNhc3QlXV0gIgorCQkJImRldiAlaWZhY2UlW1sgcGVlciAlcG9pbnRvcG9pbnQlXV1bWyBsYWJlbCAlbGFiZWwlXV0iLCBpZmQsIGV4ZWMpOworCXJlc3VsdCArPSBleGVjdXRlKCJpcCBsaW5rIHNldFtbIG10dSAlbXR1JV1dW1sgYWRkciAlaHdhZGRyZXNzJV1dICVpZmFjZSUgdXAiLCBpZmQsIGV4ZWMpOworCXJlc3VsdCArPSBleGVjdXRlKCJbW2lwIHJvdXRlIGFkZCBkZWZhdWx0IHZpYSAlZ2F0ZXdheSUgZGV2ICVpZmFjZSVbWyBtZXRyaWMgJW1ldHJpYyVdXV1dIiwgaWZkLCBleGVjKTsKKwlyZXR1cm4gKChyZXN1bHQgPT0gMykgPyAzIDogMCk7CisjIGVsc2UKKwkvKiBpZmNvbmZpZyBzYWlkIHRvIHNldCBpZmFjZSB1cCBiZWZvcmUgaXQgcHJvY2Vzc2VzIGh3ICVod2FkZHJlc3MlLAorCSAqIHdoaWNoIHRoZW4gb2YgY291cnNlIGZhaWxzLiBUaHVzIHdlIHJ1biB0d28gc2VwYXJhdGUgaWZjb25maWcgKi8KKwlyZXN1bHQgPSBleGVjdXRlKCJpZmNvbmZpZyAlaWZhY2UlW1sgaHcgJWh3YWRkcmVzcyVdXVtbIG1lZGlhICVtZWRpYSVdXVtbIG10dSAlbXR1JV1dIHVwIiwKKwkJCQlpZmQsIGV4ZWMpOworCXJlc3VsdCArPSBleGVjdXRlKCJpZmNvbmZpZyAlaWZhY2UlICVhZGRyZXNzJSBuZXRtYXNrICVuZXRtYXNrJSIKKwkJCQkiW1sgYnJvYWRjYXN0ICVicm9hZGNhc3QlXV1bWyBwb2ludG9wb2ludCAlcG9pbnRvcG9pbnQlXV0gIiwKKwkJCQlpZmQsIGV4ZWMpOworCXJlc3VsdCArPSBleGVjdXRlKCJbW3JvdXRlIGFkZCBkZWZhdWx0IGd3ICVnYXRld2F5JVtbIG1ldHJpYyAlbWV0cmljJV1dICVpZmFjZSVdXSIsIGlmZCwgZXhlYyk7CisJcmV0dXJuICgocmVzdWx0ID09IDMpID8gMyA6IDApOworIyBlbmRpZgorfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBzdGF0aWNfZG93bihzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkLCBleGVjZm4gKmV4ZWMpCit7CisJaW50IHJlc3VsdDsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fSVAKKwlyZXN1bHQgPSBleGVjdXRlKCJpcCBhZGRyIGZsdXNoIGRldiAlaWZhY2UlIiwgaWZkLCBleGVjKTsKKwlyZXN1bHQgKz0gZXhlY3V0ZSgiaXAgbGluayBzZXQgJWlmYWNlJSBkb3duIiwgaWZkLCBleGVjKTsKKyMgZWxzZQorCS8qIHJlc3VsdCA9IGV4ZWN1dGUoIltbcm91dGUgZGVsIGRlZmF1bHQgZ3cgJWdhdGV3YXklICVpZmFjZSVdXSIsIGlmZCwgZXhlYyk7ICovCisJLyogQnJpbmdpbmcgdGhlIGludGVyZmFjZSBkb3duIGRlbGV0ZXMgdGhlIHJvdXRlcyBpbiBpdHNlbGYuCisJICAgT3RoZXJ3aXNlIHRoaXMgZmFpbHMgaWYgd2UgcmVmZXJlbmNlICdnYXRld2F5JyB3aGVuIHVzaW5nIHRoaXMgZnJvbSBkaGNwX2Rvd24gKi8KKwlyZXN1bHQgPSAxOworCXJlc3VsdCArPSBleGVjdXRlKCJpZmNvbmZpZyAlaWZhY2UlIGRvd24iLCBpZmQsIGV4ZWMpOworIyBlbmRpZgorCXJldHVybiAoKHJlc3VsdCA9PSAyKSA/IDIgOiAwKTsKK30KKworIyBpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9FWFRFUk5BTF9ESENQCitzdHJ1Y3QgZGhjcF9jbGllbnRfdCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpzdGFydGNtZDsKKwljb25zdCBjaGFyICpzdG9wY21kOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkaGNwX2NsaWVudF90IGV4dF9kaGNwX2NsaWVudHNbXSA9IHsKKwl7ICJkaGNwY2QiLAorCQkiZGhjcGNkW1sgLWggJWhvc3RuYW1lJV1dW1sgLWkgJXZlbmRvciVdXVtbIC1JICVjbGllbnQlXV1bWyAtbCAlbGVhc2V0aW1lJV1dICVpZmFjZSUiLAorCQkiZGhjcGNkIC1rICVpZmFjZSUiLAorCX0sCisJeyAiZGhjbGllbnQiLAorCQkiZGhjbGllbnQgLXBmIC92YXIvcnVuL2RoY2xpZW50LiVpZmFjZSUucGlkICVpZmFjZSUiLAorCQkia2lsbCAtOSBgY2F0IC92YXIvcnVuL2RoY2xpZW50LiVpZmFjZSUucGlkYCAyPi9kZXYvbnVsbCIsCisJfSwKKwl7ICJwdW1wIiwKKwkJInB1bXAgLWkgJWlmYWNlJVtbIC1oICVob3N0bmFtZSVdXVtbIC1sICVsZWFzZWhvdXJzJV1dIiwKKwkJInB1bXAgLWkgJWlmYWNlJSAtayIsCisJfSwKKwl7ICJ1ZGhjcGMiLAorCQkidWRoY3BjICIgVURIQ1BDX0NNRF9PUFRJT05TICIgLXAgL3Zhci9ydW4vdWRoY3BjLiVpZmFjZSUucGlkIC1pICVpZmFjZSVbWyAtSCAlaG9zdG5hbWUlXV1bWyAtYyAlY2xpZW50JV1dIgorCQkJCSJbWyAtcyAlc2NyaXB0JV1dW1sgJXVkaGNwY19vcHRzJV1dIiwKKwkJImtpbGwgYGNhdCAvdmFyL3J1bi91ZGhjcGMuJWlmYWNlJS5waWRgIDI+L2Rldi9udWxsIiwKKwl9LAorfTsKKyMgZW5kaWYgLyogRkVBVFVSRV9JRlVQRE9XTl9FWFRFUk5BTF9ESENQQyAqLworCisjIGlmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0VYVEVSTkFMX0RIQ1AKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGRoY3BfdXAoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworCXVuc2lnbmVkIGk7CisjICBpZiBFTkFCTEVfRkVBVFVSRV9JRlVQRE9XTl9JUAorCS8qIGlwIGRvZXNuJ3QgdXAgaWZhY2Ugd2hlbiBpdCBjb25maWd1cmVzIGl0ICh1bmxpa2UgaWZjb25maWcpICovCisJaWYgKCFleGVjdXRlKCJpcCBsaW5rIHNldFtbIGFkZHIgJWh3YWRkcmVzcyVdXSAlaWZhY2UlIHVwIiwgaWZkLCBleGVjKSkKKwkJcmV0dXJuIDA7CisjICBlbHNlCisJLyogbmVlZGVkIGlmIHdlIGhhdmUgaHdhZGRyZXNzIG9uIGRoY3AgaWZhY2UgKi8KKwlpZiAoIWV4ZWN1dGUoImlmY29uZmlnICVpZmFjZSVbWyBodyAlaHdhZGRyZXNzJV1dIHVwIiwgaWZkLCBleGVjKSkKKwkJcmV0dXJuIDA7CisjICBlbmRpZgorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGV4dF9kaGNwX2NsaWVudHMpOyBpKyspIHsKKwkJaWYgKGV4ZWN1dGFibGVfZXhpc3RzKGV4dF9kaGNwX2NsaWVudHNbaV0ubmFtZSkpCisJCQlyZXR1cm4gZXhlY3V0ZShleHRfZGhjcF9jbGllbnRzW2ldLnN0YXJ0Y21kLCBpZmQsIGV4ZWMpOworCX0KKwliYl9lcnJvcl9tc2coIm5vIGRoY3AgY2xpZW50cyBmb3VuZCIpOworCXJldHVybiAwOworfQorIyBlbGlmIEVOQUJMRV9VREhDUEMKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGRoY3BfdXAoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworIyAgaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fSVAKKwkvKiBpcCBkb2Vzbid0IHVwIGlmYWNlIHdoZW4gaXQgY29uZmlndXJlcyBpdCAodW5saWtlIGlmY29uZmlnKSAqLworCWlmICghZXhlY3V0ZSgiaXAgbGluayBzZXRbWyBhZGRyICVod2FkZHJlc3MlXV0gJWlmYWNlJSB1cCIsIGlmZCwgZXhlYykpCisJCXJldHVybiAwOworIyAgZWxzZQorCS8qIG5lZWRlZCBpZiB3ZSBoYXZlIGh3YWRkcmVzcyBvbiBkaGNwIGlmYWNlICovCisJaWYgKCFleGVjdXRlKCJpZmNvbmZpZyAlaWZhY2UlW1sgaHcgJWh3YWRkcmVzcyVdXSB1cCIsIGlmZCwgZXhlYykpCisJCXJldHVybiAwOworIyAgZW5kaWYKKwlyZXR1cm4gZXhlY3V0ZSgidWRoY3BjICIgVURIQ1BDX0NNRF9PUFRJT05TICIgLXAgL3Zhci9ydW4vdWRoY3BjLiVpZmFjZSUucGlkICIKKwkJCSItaSAlaWZhY2UlW1sgLUggJWhvc3RuYW1lJV1dW1sgLWMgJWNsaWVudCVdXVtbIC1zICVzY3JpcHQlXV1bWyAldWRoY3BjX29wdHMlXV0iLAorCQkJaWZkLCBleGVjKTsKK30KKyMgZWxzZQorc3RhdGljIGludCBGQVNUX0ZVTkMgZGhjcF91cChzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkIFVOVVNFRF9QQVJBTSwKKwkJZXhlY2ZuICpleGVjIFVOVVNFRF9QQVJBTSkKK3sKKwlyZXR1cm4gMDsgLyogbm8gZGhjcCBzdXBwb3J0ICovCit9CisjIGVuZGlmCisKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fRVhURVJOQUxfREhDUAorc3RhdGljIGludCBGQVNUX0ZVTkMgZGhjcF9kb3duKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQsIGV4ZWNmbiAqZXhlYykKK3sKKwlpbnQgcmVzdWx0ID0gMDsKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZXh0X2RoY3BfY2xpZW50cyk7IGkrKykgeworCQlpZiAoZXhlY3V0YWJsZV9leGlzdHMoZXh0X2RoY3BfY2xpZW50c1tpXS5uYW1lKSkgeworCQkJcmVzdWx0ID0gZXhlY3V0ZShleHRfZGhjcF9jbGllbnRzW2ldLnN0b3BjbWQsIGlmZCwgZXhlYyk7CisJCQlpZiAocmVzdWx0KQorCQkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKCFyZXN1bHQpCisJCWJiX2Vycm9yX21zZygid2FybmluZzogbm8gZGhjcCBjbGllbnRzIGZvdW5kIGFuZCBzdG9wcGVkIik7CisKKwkvKiBTbGVlcCBhIGJpdCwgb3RoZXJ3aXNlIHN0YXRpY19kb3duIHRyaWVzIHRvIGJyaW5nIGRvd24gaW50ZXJmYWNlIHRvbyBzb29uLAorCSAgIGFuZCBpdCBtYXkgY29tZSBiYWNrIHVwIGJlY2F1c2UgdWRoY3BjIGlzIHN0aWxsIHNodXR0aW5nIGRvd24gKi8KKwl1c2xlZXAoMTAwMDAwKTsKKwlyZXN1bHQgKz0gc3RhdGljX2Rvd24oaWZkLCBleGVjKTsKKwlyZXR1cm4gKChyZXN1bHQgPT0gMykgPyAzIDogMCk7Cit9CisjIGVsaWYgRU5BQkxFX1VESENQQworc3RhdGljIGludCBGQVNUX0ZVTkMgZGhjcF9kb3duKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQsIGV4ZWNmbiAqZXhlYykKK3sKKwlpbnQgcmVzdWx0OworCXJlc3VsdCA9IGV4ZWN1dGUoCisJCSJ0ZXN0IC1mIC92YXIvcnVuL3VkaGNwYy4laWZhY2UlLnBpZCAmJiAiCisJCSJraWxsIGBjYXQgL3Zhci9ydW4vdWRoY3BjLiVpZmFjZSUucGlkYCAyPi9kZXYvbnVsbCIsCisJCWlmZCwgZXhlYyk7CisJLyogQWxzbyBicmluZyB0aGUgaGFyZHdhcmUgaW50ZXJmYWNlIGRvd24gc2luY2UKKwkgICBraWxsaW5nIHRoZSBkaGNwIGNsaWVudCBhbG9uZSBkb2Vzbid0IGRvIGl0LgorCSAgIFRoaXMgZW5hYmxlcyBjb25zZWN1dGl2ZSBpZnVwLT5pZmRvd24tPmlmdXAgKi8KKwkvKiBTbGVlcCBhIGJpdCwgb3RoZXJ3aXNlIHN0YXRpY19kb3duIHRyaWVzIHRvIGJyaW5nIGRvd24gaW50ZXJmYWNlIHRvbyBzb29uLAorCSAgIGFuZCBpdCBtYXkgY29tZSBiYWNrIHVwIGJlY2F1c2UgdWRoY3BjIGlzIHN0aWxsIHNodXR0aW5nIGRvd24gKi8KKwl1c2xlZXAoMTAwMDAwKTsKKwlyZXN1bHQgKz0gc3RhdGljX2Rvd24oaWZkLCBleGVjKTsKKwlyZXR1cm4gKChyZXN1bHQgPT0gMykgPyAzIDogMCk7Cit9CisjIGVsc2UKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGRoY3BfZG93bihzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkIFVOVVNFRF9QQVJBTSwKKwkJZXhlY2ZuICpleGVjIFVOVVNFRF9QQVJBTSkKK3sKKwlyZXR1cm4gMDsgLyogbm8gZGhjcCBzdXBwb3J0ICovCit9CisjIGVuZGlmCisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIG1hbnVhbF91cF9kb3duKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQgVU5VU0VEX1BBUkFNLCBleGVjZm4gKmV4ZWMgVU5VU0VEX1BBUkFNKQoreworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBib290cF91cChzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkLCBleGVjZm4gKmV4ZWMpCit7CisJcmV0dXJuIGV4ZWN1dGUoImJvb3RwY1tbIC0tYm9vdGZpbGUgJWJvb3RmaWxlJV1dIC0tZGV2ICVpZmFjZSUiCisJCQkiW1sgLS1zZXJ2ZXIgJXNlcnZlciVdXVtbIC0taHdhZGRyICVod2FkZHIlXV0iCisJCQkiIC0tcmV0dXJuaWZmYWlsIC0tc2VydmVyYmNhc3QiLCBpZmQsIGV4ZWMpOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBwcHBfdXAoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworCXJldHVybiBleGVjdXRlKCJwb25bWyAlcHJvdmlkZXIlXV0iLCBpZmQsIGV4ZWMpOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBwcHBfZG93bihzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZkLCBleGVjZm4gKmV4ZWMpCit7CisJcmV0dXJuIGV4ZWN1dGUoInBvZmZbWyAlcHJvdmlkZXIlXV0iLCBpZmQsIGV4ZWMpOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyB3dmRpYWxfdXAoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCwgZXhlY2ZuICpleGVjKQoreworCXJldHVybiBleGVjdXRlKCJzdGFydC1zdG9wLWRhZW1vbiAtLXN0YXJ0IC14IHd2ZGlhbCAiCisJCSItcCAvdmFyL3J1bi93dmRpYWwuJWlmYWNlJSAtYiAtbSAtLVtbICVwcm92aWRlciVdXSIsIGlmZCwgZXhlYyk7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHd2ZGlhbF9kb3duKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQsIGV4ZWNmbiAqZXhlYykKK3sKKwlyZXR1cm4gZXhlY3V0ZSgic3RhcnQtc3RvcC1kYWVtb24gLS1zdG9wIC14IHd2ZGlhbCAiCisJCQkiLXAgL3Zhci9ydW4vd3ZkaWFsLiVpZmFjZSUgLXMgMiIsIGlmZCwgZXhlYyk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWV0aG9kX3QgbWV0aG9kc1tdID0geworCXsgIm1hbnVhbCIgICwgbWFudWFsX3VwX2Rvd24sIG1hbnVhbF91cF9kb3duLCB9LAorCXsgInd2ZGlhbCIgICwgd3ZkaWFsX3VwICAgICAsIHd2ZGlhbF9kb3duICAgLCB9LAorCXsgInBwcCIgICAgICwgcHBwX3VwICAgICAgICAsIHBwcF9kb3duICAgICAgLCB9LAorCXsgInN0YXRpYyIgICwgc3RhdGljX3VwICAgICAsIHN0YXRpY19kb3duICAgLCB9LAorCXsgImJvb3RwIiAgICwgYm9vdHBfdXAgICAgICAsIHN0YXRpY19kb3duICAgLCB9LAorCXsgImRoY3AiICAgICwgZGhjcF91cCAgICAgICAsIGRoY3BfZG93biAgICAgLCB9LAorCXsgImxvb3BiYWNrIiwgbG9vcGJhY2tfdXAgICAsIGxvb3BiYWNrX2Rvd24gLCB9LAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhZGRyZXNzX2ZhbWlseV90IGFkZHJfaW5ldCA9IHsKKwkiaW5ldCIsCisJQVJSQVlfU0laRShtZXRob2RzKSwKKwltZXRob2RzCit9OworCisjZW5kaWYgIC8qIEZFQVRVUkVfSUZVUERPV05fSVBWNCAqLworCitzdGF0aWMgaW50IEZBU1RfRlVOQyBsaW5rX3VwX2Rvd24oc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmZCBVTlVTRURfUEFSQU0sIGV4ZWNmbiAqZXhlYyBVTlVTRURfUEFSQU0pCit7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWV0aG9kX3QgbGlua19tZXRob2RzW10gPSB7CisJeyAibm9uZSIsIGxpbmtfdXBfZG93biwgbGlua191cF9kb3duIH0KK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWRkcmVzc19mYW1pbHlfdCBhZGRyX2xpbmsgPSB7CisJImxpbmsiLCBBUlJBWV9TSVpFKGxpbmtfbWV0aG9kcyksIGxpbmtfbWV0aG9kcworfTsKKworLyogUmV0dXJucyBwb2ludGVyIHRvIHRoZSBuZXh0IHdvcmQsIG9yIE5VTEwuCisgKiBJbiAxc3QgY2FzZSwgYWR2YW5jZXMgKmJ1ZiB0byB0aGUgd29yZCBhZnRlciB0aGlzIG9uZS4KKyAqLworc3RhdGljIGNoYXIgKm5leHRfd29yZChjaGFyICoqYnVmKQoreworCXVuc2lnbmVkIGxlbmd0aDsKKwljaGFyICp3b3JkOworCisJLyogU2tpcCBvdmVyIGxlYWRpbmcgd2hpdGVzcGFjZSAqLworCXdvcmQgPSBza2lwX3doaXRlc3BhY2UoKmJ1Zik7CisKKwkvKiBTdG9wIG9uIEVPTCAqLworCWlmICgqd29yZCA9PSAnXDAnKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIEZpbmQgdGhlIGxlbmd0aCBvZiB0aGlzIHdvcmQgKGNhbid0IGJlIDApICovCisJbGVuZ3RoID0gc3RyY3Nwbih3b3JkLCAiIFx0XG4iKTsKKworCS8qIFVubGVzcyB3ZSBhcmUgYWxyZWFkeSBhdCBOVUwsIHN0b3JlIE5VTCBhbmQgYWR2YW5jZSAqLworCWlmICh3b3JkW2xlbmd0aF0gIT0gJ1wwJykKKwkJd29yZFtsZW5ndGgrK10gPSAnXDAnOworCisJKmJ1ZiA9IHNraXBfd2hpdGVzcGFjZSh3b3JkICsgbGVuZ3RoKTsKKworCXJldHVybiB3b3JkOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFkZHJlc3NfZmFtaWx5X3QgKmdldF9hZGRyZXNzX2ZhbWlseShjb25zdCBzdHJ1Y3QgYWRkcmVzc19mYW1pbHlfdCAqY29uc3QgYWZbXSwgY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSAwOyBhZltpXTsgaSsrKSB7CisJCWlmIChzdHJjbXAoYWZbaV0tPm5hbWUsIG5hbWUpID09IDApIHsKKwkJCXJldHVybiBhZltpXTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBtZXRob2RfdCAqZ2V0X21ldGhvZChjb25zdCBzdHJ1Y3QgYWRkcmVzc19mYW1pbHlfdCAqYWYsIGNoYXIgKm5hbWUpCit7CisJaW50IGk7CisKKwlpZiAoIW5hbWUpCisJCXJldHVybiBOVUxMOworCS8qIFRPRE86IHVzZSBpbmRleF9pbl9zdHJfYXJyYXkoKSAqLworCWZvciAoaSA9IDA7IGkgPCBhZi0+bl9tZXRob2RzOyBpKyspIHsKKwkJaWYgKHN0cmNtcChhZi0+bWV0aG9kW2ldLm5hbWUsIG5hbWUpID09IDApIHsKKwkJCXJldHVybiAmYWYtPm1ldGhvZFtpXTsKKwkJfQorCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cnVjdCBpbnRlcmZhY2VzX2ZpbGVfdCAqcmVhZF9pbnRlcmZhY2VzKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBzdHJ1Y3QgaW50ZXJmYWNlc19maWxlX3QgKmRlZm4pCit7CisJLyogTGV0J3MgdHJ5IHRvIGJlIGNvbXBhdGlibGUuCisJICoKKwkgKiAibWFuIDUgaW50ZXJmYWNlcyIgc2F5czoKKwkgKiBMaW5lcyBzdGFydGluZyB3aXRoICIjIiBhcmUgaWdub3JlZC4gTm90ZSB0aGF0IGVuZC1vZi1saW5lCisJICogY29tbWVudHMgYXJlIE5PVCBzdXBwb3J0ZWQsIGNvbW1lbnRzIG11c3QgYmUgb24gYSBsaW5lIG9mIHRoZWlyIG93bi4KKwkgKiBBIGxpbmUgbWF5IGJlIGV4dGVuZGVkIGFjcm9zcyBtdWx0aXBsZSBsaW5lcyBieSBtYWtpbmcKKwkgKiB0aGUgbGFzdCBjaGFyYWN0ZXIgYSBiYWNrc2xhc2guCisJICoKKwkgKiBTZWVuIGVsc2V3aGVyZSBpbiBleGFtcGxlIGNvbmZpZyBmaWxlOgorCSAqIEEgZmlyc3Qgbm9uLWJsYW5rICIjIiBjaGFyYWN0ZXIgbWFrZXMgdGhlIHJlc3Qgb2YgdGhlIGxpbmUKKwkgKiBiZSBpZ25vcmVkLiBCbGFuayBsaW5lcyBhcmUgaWdub3JlZC4gTGluZXMgbWF5IGJlIGluZGVudGVkIGZyZWVseS4KKwkgKiBBICJcIiBjaGFyYWN0ZXIgYXQgdGhlIHZlcnkgZW5kIG9mIHRoZSBsaW5lIGluZGljYXRlcyB0aGUgbmV4dCBsaW5lCisJICogc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYSBjb250aW51YXRpb24gb2YgdGhlIGN1cnJlbnQgb25lLgorCSAqCisJICogTGluZXMgIGJlZ2lubmluZyB3aXRoICJzb3VyY2UiIGFyZSB1c2VkIHRvIGluY2x1ZGUgc3RhbnphcyBmcm9tCisJICogb3RoZXIgZmlsZXMsIHNvIGNvbmZpZ3VyYXRpb24gY2FuIGJlIHNwbGl0IGludG8gbWFueSBmaWxlcy4KKwkgKiBUaGUgd29yZCAic291cmNlIiBpcyBmb2xsb3dlZCBieSB0aGUgcGF0aCBvZiBmaWxlIHRvIGJlIHNvdXJjZWQuCisJICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fTUFQUElORworCXN0cnVjdCBtYXBwaW5nX2RlZm5fdCAqY3Vycm1hcCA9IE5VTEw7CisjZW5kaWYKKwlzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqY3VycmlmID0gTlVMTDsKKwlGSUxFICpmOworCWNoYXIgKmJ1ZjsKKwljaGFyICpmaXJzdF93b3JkOworCWNoYXIgKnJlc3Rfb2ZfbGluZTsKKwllbnVtIHsgTk9ORSwgSUZBQ0UsIE1BUFBJTkcgfSBjdXJyZW50bHlfcHJvY2Vzc2luZyA9IE5PTkU7CisKKwlpZiAoIWRlZm4pCisJCWRlZm4gPSB4emFsbG9jKHNpemVvZigqZGVmbikpOworCisJZGVidWdfbm9pc2UoInJlYWRpbmcgJXMgZmlsZTpcbiIsIGZpbGVuYW1lKTsKKwlmID0geGZvcGVuX2Zvcl9yZWFkKGZpbGVuYW1lKTsKKworCXdoaWxlICgoYnVmID0geG1hbGxvY19mZ2V0bGluZShmKSkgIT0gTlVMTCkgeworI2lmIEVOQUJMRV9ERVNLVE9QCisJCS8qIFRyYWlsaW5nICJcIiBjb25jYXRlbmF0ZXMgbGluZXMgKi8KKwkJY2hhciAqcDsKKwkJd2hpbGUgKChwID0gbGFzdF9jaGFyX2lzKGJ1ZiwgJ1xcJykpICE9IE5VTEwpIHsKKwkJCSpwID0gJ1wwJzsKKwkJCXJlc3Rfb2ZfbGluZSA9IHhtYWxsb2NfZmdldGxpbmUoZik7CisJCQlpZiAoIXJlc3Rfb2ZfbGluZSkKKwkJCQlicmVhazsKKwkJCXAgPSB4YXNwcmludGYoIiVzJXMiLCBidWYsIHJlc3Rfb2ZfbGluZSk7CisJCQlmcmVlKGJ1Zik7CisJCQlmcmVlKHJlc3Rfb2ZfbGluZSk7CisJCQlidWYgPSBwOworCQl9CisjZW5kaWYKKwkJcmVzdF9vZl9saW5lID0gYnVmOworCQlmaXJzdF93b3JkID0gbmV4dF93b3JkKCZyZXN0X29mX2xpbmUpOworCQlpZiAoIWZpcnN0X3dvcmQgfHwgKmZpcnN0X3dvcmQgPT0gJyMnKSB7CisJCQlmcmVlKGJ1Zik7CisJCQljb250aW51ZTsgLyogYmxhbmsvY29tbWVudCBsaW5lICovCisJCX0KKworCQlpZiAoc3RyY21wKGZpcnN0X3dvcmQsICJtYXBwaW5nIikgPT0gMCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX01BUFBJTkcKKwkJCWN1cnJtYXAgPSB4emFsbG9jKHNpemVvZigqY3Vycm1hcCkpOworCisJCQl3aGlsZSAoKGZpcnN0X3dvcmQgPSBuZXh0X3dvcmQoJnJlc3Rfb2ZfbGluZSkpICE9IE5VTEwpIHsKKwkJCQljdXJybWFwLT5tYXRjaCA9IHhyZWFsbG9jX3ZlY3RvcihjdXJybWFwLT5tYXRjaCwgNCwgY3Vycm1hcC0+bl9tYXRjaGVzKTsKKwkJCQljdXJybWFwLT5tYXRjaFtjdXJybWFwLT5uX21hdGNoZXMrK10gPSB4c3RyZHVwKGZpcnN0X3dvcmQpOworCQkJfQorCQkJLypjdXJybWFwLT5uX21hcHBpbmdzID0gMDsqLworCQkJLypjdXJybWFwLT5tYXBwaW5nID0gTlVMTDsqLworCQkJLypjdXJybWFwLT5zY3JpcHQgPSBOVUxMOyovCisJCQl7CisJCQkJc3RydWN0IG1hcHBpbmdfZGVmbl90ICoqd2hlcmUgPSAmZGVmbi0+bWFwcGluZ3M7CisJCQkJd2hpbGUgKCp3aGVyZSAhPSBOVUxMKSB7CisJCQkJCXdoZXJlID0gJigqd2hlcmUpLT5uZXh0OworCQkJCX0KKwkJCQkqd2hlcmUgPSBjdXJybWFwOworCQkJCS8qY3Vycm1hcC0+bmV4dCA9IE5VTEw7Ki8KKwkJCX0KKwkJCWRlYnVnX25vaXNlKCJBZGRlZCBtYXBwaW5nXG4iKTsKKyNlbmRpZgorCQkJY3VycmVudGx5X3Byb2Nlc3NpbmcgPSBNQVBQSU5HOworCQl9IGVsc2UgaWYgKHN0cmNtcChmaXJzdF93b3JkLCAiaWZhY2UiKSA9PSAwKSB7CisJCQlzdGF0aWMgY29uc3Qgc3RydWN0IGFkZHJlc3NfZmFtaWx5X3QgKmNvbnN0IGFkZHJfZmFtc1tdID0geworI2lmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX0lQVjQKKwkJCQkmYWRkcl9pbmV0LAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fSVBWNgorCQkJCSZhZGRyX2luZXQ2LAorI2VuZGlmCisJCQkJJmFkZHJfbGluaywKKwkJCQlOVUxMCisJCQl9OworCQkJY2hhciAqaWZhY2VfbmFtZTsKKwkJCWNoYXIgKmFkZHJlc3NfZmFtaWx5X25hbWU7CisJCQljaGFyICptZXRob2RfbmFtZTsKKwkJCWxsaXN0X3QgKmlmYWNlX2xpc3Q7CisKKwkJCWN1cnJpZiA9IHh6YWxsb2Moc2l6ZW9mKCpjdXJyaWYpKTsKKwkJCWlmYWNlX25hbWUgPSBuZXh0X3dvcmQoJnJlc3Rfb2ZfbGluZSk7CisJCQlhZGRyZXNzX2ZhbWlseV9uYW1lID0gbmV4dF93b3JkKCZyZXN0X29mX2xpbmUpOworCQkJbWV0aG9kX25hbWUgPSBuZXh0X3dvcmQoJnJlc3Rfb2ZfbGluZSk7CisKKwkJCWlmIChtZXRob2RfbmFtZSA9PSBOVUxMKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0b28gZmV3IHBhcmFtZXRlcnMgZm9yIGxpbmUgXCIlc1wiIiwgYnVmKTsKKworCQkJLyogc2hpcCBhbnkgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLworCQkJcmVzdF9vZl9saW5lID0gc2tpcF93aGl0ZXNwYWNlKHJlc3Rfb2ZfbGluZSk7CisKKwkJCWlmIChyZXN0X29mX2xpbmVbMF0gIT0gJ1wwJyAvKiAmJiByZXN0X29mX2xpbmVbMF0gIT0gJyMnICovKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0b28gbWFueSBwYXJhbWV0ZXJzIFwiJXNcIiIsIGJ1Zik7CisKKwkJCWN1cnJpZi0+aWZhY2UgPSB4c3RyZHVwKGlmYWNlX25hbWUpOworCisJCQljdXJyaWYtPmFkZHJlc3NfZmFtaWx5ID0gZ2V0X2FkZHJlc3NfZmFtaWx5KGFkZHJfZmFtcywgYWRkcmVzc19mYW1pbHlfbmFtZSk7CisJCQlpZiAoIWN1cnJpZi0+YWRkcmVzc19mYW1pbHkpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gYWRkcmVzcyB0eXBlIFwiJXNcIiIsIGFkZHJlc3NfZmFtaWx5X25hbWUpOworCisJCQljdXJyaWYtPm1ldGhvZCA9IGdldF9tZXRob2QoY3VycmlmLT5hZGRyZXNzX2ZhbWlseSwgbWV0aG9kX25hbWUpOworCQkJaWYgKCFjdXJyaWYtPm1ldGhvZCkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biBtZXRob2QgXCIlc1wiIiwgbWV0aG9kX25hbWUpOworCisJCQlmb3IgKGlmYWNlX2xpc3QgPSBkZWZuLT5pZmFjZXM7IGlmYWNlX2xpc3Q7IGlmYWNlX2xpc3QgPSBpZmFjZV9saXN0LT5saW5rKSB7CisJCQkJc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKnRtcCA9IChzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqKSBpZmFjZV9saXN0LT5kYXRhOworCQkJCWlmICgoc3RyY21wKHRtcC0+aWZhY2UsIGN1cnJpZi0+aWZhY2UpID09IDApCisJCQkJICYmICh0bXAtPmFkZHJlc3NfZmFtaWx5ID09IGN1cnJpZi0+YWRkcmVzc19mYW1pbHkpCisJCQkJKSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJkdXBsaWNhdGUgaW50ZXJmYWNlIFwiJXNcIiIsIHRtcC0+aWZhY2UpOworCQkJCX0KKwkJCX0KKwkJCWxsaXN0X2FkZF90b19lbmQoJihkZWZuLT5pZmFjZXMpLCAoY2hhciopY3VycmlmKTsKKworCQkJZGVidWdfbm9pc2UoImlmYWNlICVzICVzICVzXG4iLCBjdXJyaWYtPmlmYWNlLCBhZGRyZXNzX2ZhbWlseV9uYW1lLCBtZXRob2RfbmFtZSk7CisJCQljdXJyZW50bHlfcHJvY2Vzc2luZyA9IElGQUNFOworCQl9IGVsc2UgaWYgKHN0cmNtcChmaXJzdF93b3JkLCAiYXV0byIpID09IDApIHsKKwkJCXdoaWxlICgoZmlyc3Rfd29yZCA9IG5leHRfd29yZCgmcmVzdF9vZl9saW5lKSkgIT0gTlVMTCkgeworCisJCQkJLyogQ2hlY2sgdGhlIGludGVyZmFjZSBpc250IGFscmVhZHkgbGlzdGVkICovCisJCQkJaWYgKGxsaXN0X2ZpbmRfc3RyKGRlZm4tPmF1dG9pbnRlcmZhY2VzLCBmaXJzdF93b3JkKSkgeworCQkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImludGVyZmFjZSBkZWNsYXJlZCBhdXRvIHR3aWNlIFwiJXNcIiIsIGJ1Zik7CisJCQkJfQorCisJCQkJLyogQWRkIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGxpc3QgKi8KKwkJCQlsbGlzdF9hZGRfdG9fZW5kKCYoZGVmbi0+YXV0b2ludGVyZmFjZXMpLCB4c3RyZHVwKGZpcnN0X3dvcmQpKTsKKwkJCQlkZWJ1Z19ub2lzZSgiXG5hdXRvICVzXG4iLCBmaXJzdF93b3JkKTsKKwkJCX0KKwkJCWN1cnJlbnRseV9wcm9jZXNzaW5nID0gTk9ORTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoZmlyc3Rfd29yZCwgInNvdXJjZSIpID09IDApIHsKKwkJCXJlYWRfaW50ZXJmYWNlcyhuZXh0X3dvcmQoJnJlc3Rfb2ZfbGluZSksIGRlZm4pOworCQl9IGVsc2UgeworCQkJc3dpdGNoIChjdXJyZW50bHlfcHJvY2Vzc2luZykgeworCQkJY2FzZSBJRkFDRToKKwkJCQlpZiAocmVzdF9vZl9saW5lWzBdID09ICdcMCcpCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJvcHRpb24gd2l0aCBlbXB0eSB2YWx1ZSBcIiVzXCIiLCBidWYpOworCisJCQkJaWYgKHN0cmNtcChmaXJzdF93b3JkLCAicG9zdC11cCIpID09IDApCisJCQkJCWZpcnN0X3dvcmQgKz0gNTsgLyogInVwIiAqLworCQkJCWVsc2UgaWYgKHN0cmNtcChmaXJzdF93b3JkLCAicHJlLWRvd24iKSA9PSAwKQorCQkJCQlmaXJzdF93b3JkICs9IDQ7IC8qICJkb3duIiAqLworCisJCQkJLyogSWYgbm90IG9uZSBvZiAidXAiLCAiZG93biIsLi4uIHdvcmRzLi4uICovCisJCQkJaWYgKGluZGV4X2luX3N0cmluZ3Moa2V5d29yZHNfdXBfZG93biwgZmlyc3Rfd29yZCkgPCAwKSB7CisJCQkJCWludCBpOworCQkJCQlmb3IgKGkgPSAwOyBpIDwgY3VycmlmLT5uX29wdGlvbnM7IGkrKykgeworCQkJCQkJaWYgKHN0cmNtcChjdXJyaWYtPm9wdGlvbltpXS5uYW1lLCBmaXJzdF93b3JkKSA9PSAwKQorCQkJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJkdXBsaWNhdGUgb3B0aW9uIFwiJXNcIiIsIGJ1Zik7CisJCQkJCX0KKwkJCQl9CisJCQkJZGVidWdfbm9pc2UoIlx0JXM9JXNcbiIsIGZpcnN0X3dvcmQsIHJlc3Rfb2ZfbGluZSk7CisJCQkJY3VycmlmLT5vcHRpb24gPSB4cmVhbGxvY192ZWN0b3IoY3VycmlmLT5vcHRpb24sIDQsIGN1cnJpZi0+bl9vcHRpb25zKTsKKwkJCQljdXJyaWYtPm9wdGlvbltjdXJyaWYtPm5fb3B0aW9uc10ubmFtZSA9IHhzdHJkdXAoZmlyc3Rfd29yZCk7CisJCQkJY3VycmlmLT5vcHRpb25bY3VycmlmLT5uX29wdGlvbnNdLnZhbHVlID0geHN0cmR1cChyZXN0X29mX2xpbmUpOworCQkJCWN1cnJpZi0+bl9vcHRpb25zKys7CisJCQkJYnJlYWs7CisJCQljYXNlIE1BUFBJTkc6CisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fTUFQUElORworCQkJCWlmIChzdHJjbXAoZmlyc3Rfd29yZCwgInNjcmlwdCIpID09IDApIHsKKwkJCQkJaWYgKGN1cnJtYXAtPnNjcmlwdCAhPSBOVUxMKQorCQkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImR1cGxpY2F0ZSBzY3JpcHQgaW4gbWFwcGluZyBcIiVzXCIiLCBidWYpOworCQkJCQljdXJybWFwLT5zY3JpcHQgPSB4c3RyZHVwKG5leHRfd29yZCgmcmVzdF9vZl9saW5lKSk7CisJCQkJfSBlbHNlIGlmIChzdHJjbXAoZmlyc3Rfd29yZCwgIm1hcCIpID09IDApIHsKKwkJCQkJY3Vycm1hcC0+bWFwcGluZyA9IHhyZWFsbG9jX3ZlY3RvcihjdXJybWFwLT5tYXBwaW5nLCAyLCBjdXJybWFwLT5uX21hcHBpbmdzKTsKKwkJCQkJY3Vycm1hcC0+bWFwcGluZ1tjdXJybWFwLT5uX21hcHBpbmdzXSA9IHhzdHJkdXAobmV4dF93b3JkKCZyZXN0X29mX2xpbmUpKTsKKwkJCQkJY3Vycm1hcC0+bl9tYXBwaW5ncysrOworCQkJCX0gZWxzZSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtaXNwbGFjZWQgb3B0aW9uIFwiJXNcIiIsIGJ1Zik7CisJCQkJfQorI2VuZGlmCisJCQkJYnJlYWs7CisJCQljYXNlIE5PTkU6CisJCQlkZWZhdWx0OgorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtaXNwbGFjZWQgb3B0aW9uIFwiJXNcIiIsIGJ1Zik7CisJCQl9CisJCX0KKwkJZnJlZShidWYpOworCX0gLyogd2hpbGUgKGZnZXRzKSAqLworCisJaWYgKGZlcnJvcihmKSAhPSAwKSB7CisJCS8qIGZlcnJvciBkb2VzIE5PVCBzZXQgZXJybm8hICovCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlczogSS9PIGVycm9yIiwgZmlsZW5hbWUpOworCX0KKwlmY2xvc2UoZik7CisJZGVidWdfbm9pc2UoIlxuZG9uZSByZWFkaW5nICVzXG5cbiIsIGZpbGVuYW1lKTsKKworCXJldHVybiBkZWZuOworfQorCitzdGF0aWMgY2hhciAqc2V0bG9jYWxlbnYoY29uc3QgY2hhciAqZm9ybWF0LCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwljaGFyICpyZXN1bHQ7CisJY2hhciAqZHN0OworCWNoYXIgKnNyYzsKKwljaGFyIGM7CisKKwlyZXN1bHQgPSB4YXNwcmludGYoZm9ybWF0LCBuYW1lLCB2YWx1ZSk7CisKKwlmb3IgKGRzdCA9IHNyYyA9IHJlc3VsdDsgKGMgPSAqc3JjKSAhPSAnPScgJiYgYzsgc3JjKyspIHsKKwkJaWYgKGMgPT0gJy0nKQorCQkJYyA9ICdfJzsKKwkJaWYgKGMgPj0gJ2EnICYmIGMgPD0gJ3onKQorCQkJYyAtPSAoJ2EnIC0gJ0EnKTsKKwkJaWYgKGlzYWxudW0oYykgfHwgYyA9PSAnXycpCisJCQkqZHN0KysgPSBjOworCX0KKwlvdmVybGFwcGluZ19zdHJjcHkoZHN0LCBzcmMpOworCisJcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIHZvaWQgc2V0X2Vudmlyb24oc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKmlmYWNlLCBjb25zdCBjaGFyICptb2RlLCBjb25zdCBjaGFyICpvcHQpCit7CisJaW50IGk7CisJY2hhciAqKnBwOworCisJaWYgKEcubXlfZW52aXJvbiAhPSBOVUxMKSB7CisJCWZvciAocHAgPSBHLm15X2Vudmlyb247ICpwcDsgcHArKykgeworCQkJZnJlZSgqcHApOworCQl9CisJCWZyZWUoRy5teV9lbnZpcm9uKTsKKwl9CisKKwkvKiBub3RlOiBsYXN0IGVsZW1lbnQgd2lsbCBzdGF5IE5VTEw6ICovCisJRy5teV9lbnZpcm9uID0geHphbGxvYyhzaXplb2YoY2hhciAqKSAqIChpZmFjZS0+bl9vcHRpb25zICsgNykpOworCXBwID0gRy5teV9lbnZpcm9uOworCisJZm9yIChpID0gMDsgaSA8IGlmYWNlLT5uX29wdGlvbnM7IGkrKykgeworCQlpZiAoaW5kZXhfaW5fc3RyaW5ncyhrZXl3b3Jkc191cF9kb3duLCBpZmFjZS0+b3B0aW9uW2ldLm5hbWUpID49IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCSpwcCsrID0gc2V0bG9jYWxlbnYoIklGXyVzPSVzIiwgaWZhY2UtPm9wdGlvbltpXS5uYW1lLCBpZmFjZS0+b3B0aW9uW2ldLnZhbHVlKTsKKwl9CisKKwkqcHArKyA9IHNldGxvY2FsZW52KCIlcz0lcyIsICJJRkFDRSIsIGlmYWNlLT5pZmFjZSk7CisJKnBwKysgPSBzZXRsb2NhbGVudigiJXM9JXMiLCAiQUREUkZBTSIsIGlmYWNlLT5hZGRyZXNzX2ZhbWlseS0+bmFtZSk7CisJKnBwKysgPSBzZXRsb2NhbGVudigiJXM9JXMiLCAiTUVUSE9EIiwgaWZhY2UtPm1ldGhvZC0+bmFtZSk7CisJKnBwKysgPSBzZXRsb2NhbGVudigiJXM9JXMiLCAiTU9ERSIsIG1vZGUpOworCSpwcCsrID0gc2V0bG9jYWxlbnYoIiVzPSVzIiwgIlBIQVNFIiwgb3B0KTsKKwlpZiAoRy5zdGFydHVwX1BBVEgpCisJCSpwcCsrID0gc2V0bG9jYWxlbnYoIiVzPSVzIiwgIlBBVEgiLCBHLnN0YXJ0dXBfUEFUSCk7Cit9CisKK3N0YXRpYyBpbnQgZG9pdChjaGFyICpzdHIpCit7CisJaWYgKG9wdGlvbl9tYXNrMzIgJiAoT1BUX25vX2FjdHxPUFRfdmVyYm9zZSkpIHsKKwkJcHV0cyhzdHIpOworCX0KKwlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX25vX2FjdCkpIHsKKwkJcGlkX3QgY2hpbGQ7CisJCWludCBzdGF0dXM7CisKKwkJZmZsdXNoX2FsbCgpOworCQljaGlsZCA9IHZmb3JrKCk7CisJCWlmIChjaGlsZCA8IDApIC8qIGZhaWx1cmUgKi8KKwkJCXJldHVybiAwOworCQlpZiAoY2hpbGQgPT0gMCkgeyAvKiBjaGlsZCAqLworCQkJZXhlY2xlKEcuc2hlbGwsIEcuc2hlbGwsICItYyIsIHN0ciwgKGNoYXIgKikgTlVMTCwgRy5teV9lbnZpcm9uKTsKKwkJCV9leGl0KDEyNyk7CisJCX0KKwkJc2FmZV93YWl0cGlkKGNoaWxkLCAmc3RhdHVzLCAwKTsKKwkJaWYgKCFXSUZFWElURUQoc3RhdHVzKSB8fCBXRVhJVFNUQVRVUyhzdGF0dXMpICE9IDApIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IGV4ZWN1dGVfYWxsKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICppZmQsIGNvbnN0IGNoYXIgKm9wdCkKK3sKKwlpbnQgaTsKKwljaGFyICpidWY7CisJZm9yIChpID0gMDsgaSA8IGlmZC0+bl9vcHRpb25zOyBpKyspIHsKKwkJaWYgKHN0cmNtcChpZmQtPm9wdGlvbltpXS5uYW1lLCBvcHQpID09IDApIHsKKwkJCWlmICghZG9pdChpZmQtPm9wdGlvbltpXS52YWx1ZSkpIHsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCX0KKworCWJ1ZiA9IHhhc3ByaW50ZigicnVuLXBhcnRzIC9ldGMvbmV0d29yay9pZi0lcy5kIiwgb3B0KTsKKwkvKiBoZWgsIHdlIGRvbid0IGJvdGhlciBmcmVlJ2luZyBpdCAqLworCXJldHVybiBkb2l0KGJ1Zik7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2soY2hhciAqc3RyKQoreworCXJldHVybiBzdHIgIT0gTlVMTDsKK30KKworc3RhdGljIGludCBpZmFjZV91cChzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZhY2UpCit7CisJaWYgKCFpZmFjZS0+bWV0aG9kLT51cChpZmFjZSwgY2hlY2spKSByZXR1cm4gLTE7CisJc2V0X2Vudmlyb24oaWZhY2UsICJzdGFydCIsICJwcmUtdXAiKTsKKwlpZiAoIWV4ZWN1dGVfYWxsKGlmYWNlLCAicHJlLXVwIikpIHJldHVybiAwOworCWlmICghaWZhY2UtPm1ldGhvZC0+dXAoaWZhY2UsIGRvaXQpKSByZXR1cm4gMDsKKwlzZXRfZW52aXJvbihpZmFjZSwgInN0YXJ0IiwgInBvc3QtdXAiKTsKKwlpZiAoIWV4ZWN1dGVfYWxsKGlmYWNlLCAidXAiKSkgcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgaWZhY2VfZG93bihzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqaWZhY2UpCit7CisJaWYgKCFpZmFjZS0+bWV0aG9kLT5kb3duKGlmYWNlLCBjaGVjaykpIHJldHVybiAtMTsKKwlzZXRfZW52aXJvbihpZmFjZSwgInN0b3AiLCAicHJlLWRvd24iKTsKKwlpZiAoIWV4ZWN1dGVfYWxsKGlmYWNlLCAiZG93biIpKSByZXR1cm4gMDsKKwlpZiAoIWlmYWNlLT5tZXRob2QtPmRvd24oaWZhY2UsIGRvaXQpKSByZXR1cm4gMDsKKwlzZXRfZW52aXJvbihpZmFjZSwgInN0b3AiLCAicG9zdC1kb3duIik7CisJaWYgKCFleGVjdXRlX2FsbChpZmFjZSwgInBvc3QtZG93biIpKSByZXR1cm4gMDsKKwlyZXR1cm4gMTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0lGVVBET1dOX01BUFBJTkcKK3N0YXRpYyBpbnQgcG9wZW4yKEZJTEUgKippbiwgRklMRSAqKm91dCwgY2hhciAqY29tbWFuZCwgY2hhciAqcGFyYW0pCit7CisJY2hhciAqYXJndlszXSA9IHsgY29tbWFuZCwgcGFyYW0sIE5VTEwgfTsKKwlzdHJ1Y3QgZmRfcGFpciBpbmZkLCBvdXRmZDsKKwlwaWRfdCBwaWQ7CisKKwl4cGlwZWRfcGFpcihpbmZkKTsKKwl4cGlwZWRfcGFpcihvdXRmZCk7CisKKwlmZmx1c2hfYWxsKCk7CisJcGlkID0geHZmb3JrKCk7CisKKwlpZiAocGlkID09IDApIHsKKwkJLyogQ2hpbGQgKi8KKwkJLyogTkI6IGNsb3NlIF9maXJzdF8sIHRoZW4gbW92ZSBmZHMhICovCisJCWNsb3NlKGluZmQud3IpOworCQljbG9zZShvdXRmZC5yZCk7CisJCXhtb3ZlX2ZkKGluZmQucmQsIDApOworCQl4bW92ZV9mZChvdXRmZC53ciwgMSk7CisJCUJCX0VYRUNWUF9vcl9kaWUoYXJndik7CisJfQorCS8qIHBhcmVudCAqLworCWNsb3NlKGluZmQucmQpOworCWNsb3NlKG91dGZkLndyKTsKKwkqaW4gPSB4ZmRvcGVuX2Zvcl93cml0ZShpbmZkLndyKTsKKwkqb3V0ID0geGZkb3Blbl9mb3JfcmVhZChvdXRmZC5yZCk7CisJcmV0dXJuIHBpZDsKK30KKworc3RhdGljIGNoYXIgKnJ1bl9tYXBwaW5nKGNoYXIgKnBoeXNpY2FsLCBzdHJ1Y3QgbWFwcGluZ19kZWZuX3QgKm1hcCkKK3sKKwlGSUxFICppbiwgKm91dDsKKwlpbnQgaSwgc3RhdHVzOworCXBpZF90IHBpZDsKKworCWNoYXIgKmxvZ2ljYWwgPSB4c3RyZHVwKHBoeXNpY2FsKTsKKworCS8qIFJ1biB0aGUgbWFwcGluZyBzY3JpcHQuIE5ldmVyIGZhaWxzLiAqLworCXBpZCA9IHBvcGVuMigmaW4sICZvdXQsIG1hcC0+c2NyaXB0LCBwaHlzaWNhbCk7CisKKwkvKiBXcml0ZSBtYXBwaW5ncyB0byBzdGRpbiBvZiBtYXBwaW5nIHNjcmlwdC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbWFwLT5uX21hcHBpbmdzOyBpKyspIHsKKwkJZnByaW50ZihpbiwgIiVzXG4iLCBtYXAtPm1hcHBpbmdbaV0pOworCX0KKwlmY2xvc2UoaW4pOworCXNhZmVfd2FpdHBpZChwaWQsICZzdGF0dXMsIDApOworCisJaWYgKFdJRkVYSVRFRChzdGF0dXMpICYmIFdFWElUU1RBVFVTKHN0YXR1cykgPT0gMCkgeworCQkvKiBJZiB0aGUgbWFwcGluZyBzY3JpcHQgZXhpdGVkIHN1Y2Nlc3NmdWxseSwgdHJ5IHRvCisJCSAqIGdyYWIgYSBsaW5lIG9mIG91dHB1dCBhbmQgdXNlIHRoYXQgYXMgdGhlIG5hbWUgb2YgdGhlCisJCSAqIGxvZ2ljYWwgaW50ZXJmYWNlLiAqLworCQljaGFyICpuZXdfbG9naWNhbCA9IHhtYWxsb2NfZmdldGxpbmUob3V0KTsKKworCQlpZiAobmV3X2xvZ2ljYWwpIHsKKwkJCS8qIElmIHdlIGFyZSBhYmxlIHRvIHJlYWQgYSBsaW5lIG9mIG91dHB1dCBmcm9tIHRoZSBzY3JpcHQsCisJCQkgKiByZW1vdmUgYW55IHRyYWlsaW5nIHdoaXRlc3BhY2UgYW5kIHVzZSB0aGlzIHZhbHVlCisJCQkgKiBhcyB0aGUgbmFtZSBvZiB0aGUgbG9naWNhbCBpbnRlcmZhY2UuICovCisJCQljaGFyICpwY2ggPSBuZXdfbG9naWNhbCArIHN0cmxlbihuZXdfbG9naWNhbCkgLSAxOworCisJCQl3aGlsZSAocGNoID49IG5ld19sb2dpY2FsICYmIGlzc3BhY2UoKnBjaCkpCisJCQkJKihwY2gtLSkgPSAnXDAnOworCisJCQlmcmVlKGxvZ2ljYWwpOworCQkJbG9naWNhbCA9IG5ld19sb2dpY2FsOworCQl9CisJfQorCisJZmNsb3NlKG91dCk7CisKKwlyZXR1cm4gbG9naWNhbDsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX0lGVVBET1dOX01BUFBJTkcgKi8KKworc3RhdGljIGxsaXN0X3QgKmZpbmRfaWZhY2Vfc3RhdGUobGxpc3RfdCAqc3RhdGVfbGlzdCwgY29uc3QgY2hhciAqaWZhY2UpCit7CisJbGxpc3RfdCAqc2VhcmNoID0gc3RhdGVfbGlzdDsKKworCXdoaWxlIChzZWFyY2gpIHsKKwkJY2hhciAqYWZ0ZXJfaWZhY2UgPSBpc19wcmVmaXhlZF93aXRoKHNlYXJjaC0+ZGF0YSwgaWZhY2UpOworCQlpZiAoYWZ0ZXJfaWZhY2UKKwkJICYmICphZnRlcl9pZmFjZSA9PSAnPScKKwkJKSB7CisJCQlyZXR1cm4gc2VhcmNoOworCQl9CisJCXNlYXJjaCA9IHNlYXJjaC0+bGluazsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIHJlYWQgdGhlIHByZXZpb3VzIHN0YXRlIGZyb20gdGhlIHN0YXRlIGZpbGUgKi8KK3N0YXRpYyBsbGlzdF90ICpyZWFkX2lmYWNlX3N0YXRlKHZvaWQpCit7CisJbGxpc3RfdCAqc3RhdGVfbGlzdCA9IE5VTEw7CisJRklMRSAqc3RhdGVfZnAgPSBmb3Blbl9mb3JfcmVhZChDT05GSUdfSUZVUERPV05fSUZTVEFURV9QQVRIKTsKKworCWlmIChzdGF0ZV9mcCkgeworCQljaGFyICpzdGFydCwgKmVuZF9wdHI7CisJCXdoaWxlICgoc3RhcnQgPSB4bWFsbG9jX2ZnZXRzKHN0YXRlX2ZwKSkgIT0gTlVMTCkgeworCQkJLyogV2Ugc2hvdWxkIG9ubHkgbmVlZCB0byBjaGVjayBmb3IgYSBzaW5nbGUgY2hhcmFjdGVyICovCisJCQllbmRfcHRyID0gc3RhcnQgKyBzdHJjc3BuKHN0YXJ0LCAiIFx0XG4iKTsKKwkJCSplbmRfcHRyID0gJ1wwJzsKKwkJCWxsaXN0X2FkZF90bygmc3RhdGVfbGlzdCwgc3RhcnQpOworCQl9CisJCWZjbG9zZShzdGF0ZV9mcCk7CisJfQorCXJldHVybiBzdGF0ZV9saXN0OworfQorCisKK2ludCBpZnVwZG93bl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaWZ1cGRvd25fbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCAoKmNtZHMpKHN0cnVjdCBpbnRlcmZhY2VfZGVmbl90ICopOworCXN0cnVjdCBpbnRlcmZhY2VzX2ZpbGVfdCAqZGVmbjsKKwlsbGlzdF90ICp0YXJnZXRfbGlzdCA9IE5VTEw7CisJY29uc3QgY2hhciAqaW50ZXJmYWNlcyA9ICIvZXRjL25ldHdvcmsvaW50ZXJmYWNlcyI7CisJYm9vbCBhbnlfZmFpbHVyZXMgPSAwOworCisJSU5JVF9HKCk7CisKKwlHLnN0YXJ0dXBfUEFUSCA9IGdldGVudigiUEFUSCIpOworCUcuc2hlbGwgPSB4c3RyZHVwKGdldF9zaGVsbF9uYW1lKCkpOworCisJY21kcyA9IGlmYWNlX2Rvd247CisJaWYgKGFwcGxldF9uYW1lWzJdID09ICd1JykgeworCQkvKiBpZnVwIGNvbW1hbmQgKi8KKwkJY21kcyA9IGlmYWNlX3VwOworCX0KKworCWdldG9wdDMyKGFyZ3YsIE9QVElPTl9TVFIsICZpbnRlcmZhY2VzKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAoYXJndlswXSkgeworCQlpZiAoRE9fQUxMKSBiYl9zaG93X3VzYWdlKCk7CisJfSBlbHNlIHsKKwkJaWYgKCFET19BTEwpIGJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlkZWZuID0gcmVhZF9pbnRlcmZhY2VzKGludGVyZmFjZXMsIE5VTEwpOworCisJLyogQ3JlYXRlIGEgbGlzdCBvZiBpbnRlcmZhY2VzIHRvIHdvcmsgb24gKi8KKwlpZiAoRE9fQUxMKSB7CisJCXRhcmdldF9saXN0ID0gZGVmbi0+YXV0b2ludGVyZmFjZXM7CisJfSBlbHNlIHsKKwkJbGxpc3RfYWRkX3RvX2VuZCgmdGFyZ2V0X2xpc3QsIGFyZ3ZbMF0pOworCX0KKworCS8qIFVwZGF0ZSB0aGUgaW50ZXJmYWNlcyAqLworCXdoaWxlICh0YXJnZXRfbGlzdCkgeworCQlsbGlzdF90ICppZmFjZV9saXN0OworCQlzdHJ1Y3QgaW50ZXJmYWNlX2RlZm5fdCAqY3VycmlmOworCQljaGFyICppZmFjZTsKKwkJY2hhciAqbGlmYWNlOworCQljaGFyICpwY2g7CisJCWJvb2wgb2theSA9IDA7CisJCWludCBjbWRzX3JldDsKKwkJYm9vbCBjdXJyX2ZhaWx1cmUgPSAwOworCisJCWlmYWNlID0geHN0cmR1cCh0YXJnZXRfbGlzdC0+ZGF0YSk7CisJCXRhcmdldF9saXN0ID0gdGFyZ2V0X2xpc3QtPmxpbms7CisKKwkJcGNoID0gc3RyY2hyKGlmYWNlLCAnPScpOworCQlpZiAocGNoKSB7CisJCQkqcGNoID0gJ1wwJzsKKwkJCWxpZmFjZSA9IHhzdHJkdXAocGNoICsgMSk7CisJCX0gZWxzZSB7CisJCQlsaWZhY2UgPSB4c3RyZHVwKGlmYWNlKTsKKwkJfQorCisJCWlmICghRk9SQ0UpIHsKKwkJCWxsaXN0X3QgKnN0YXRlX2xpc3QgPSByZWFkX2lmYWNlX3N0YXRlKCk7CisJCQljb25zdCBsbGlzdF90ICppZmFjZV9zdGF0ZSA9IGZpbmRfaWZhY2Vfc3RhdGUoc3RhdGVfbGlzdCwgaWZhY2UpOworCisJCQlpZiAoY21kcyA9PSBpZmFjZV91cCkgeworCQkJCS8qIGlmdXAgKi8KKwkJCQlpZiAoaWZhY2Vfc3RhdGUpIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJpbnRlcmZhY2UgJXMgYWxyZWFkeSBjb25maWd1cmVkIiwgaWZhY2UpOworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQkvKiBpZmRvd24gKi8KKwkJCQlpZiAoIWlmYWNlX3N0YXRlKSB7CisJCQkJCWJiX2Vycm9yX21zZygiaW50ZXJmYWNlICVzIG5vdCBjb25maWd1cmVkIiwgaWZhY2UpOworCQkJCQlnb3RvIG5leHQ7CisJCQkJfQorCQkJfQorCQkJbGxpc3RfZnJlZShzdGF0ZV9saXN0LCBmcmVlKTsKKwkJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSUZVUERPV05fTUFQUElORworCQlpZiAoKGNtZHMgPT0gaWZhY2VfdXApICYmICFOT19NQVBQSU5HUykgeworCQkJc3RydWN0IG1hcHBpbmdfZGVmbl90ICpjdXJybWFwOworCisJCQlmb3IgKGN1cnJtYXAgPSBkZWZuLT5tYXBwaW5nczsgY3Vycm1hcDsgY3Vycm1hcCA9IGN1cnJtYXAtPm5leHQpIHsKKwkJCQlpbnQgaTsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgY3Vycm1hcC0+bl9tYXRjaGVzOyBpKyspIHsKKwkJCQkJaWYgKGZubWF0Y2goY3Vycm1hcC0+bWF0Y2hbaV0sIGxpZmFjZSwgMCkgIT0gMCkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlpZiAoVkVSQk9TRSkgeworCQkJCQkJcHJpbnRmKCJSdW5uaW5nIG1hcHBpbmcgc2NyaXB0ICVzIG9uICVzXG4iLCBjdXJybWFwLT5zY3JpcHQsIGxpZmFjZSk7CisJCQkJCX0KKwkJCQkJbGlmYWNlID0gcnVuX21hcHBpbmcoaWZhY2UsIGN1cnJtYXApOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZgorCisJCWlmYWNlX2xpc3QgPSBkZWZuLT5pZmFjZXM7CisJCXdoaWxlIChpZmFjZV9saXN0KSB7CisJCQljdXJyaWYgPSAoc3RydWN0IGludGVyZmFjZV9kZWZuX3QgKikgaWZhY2VfbGlzdC0+ZGF0YTsKKwkJCWlmIChzdHJjbXAobGlmYWNlLCBjdXJyaWYtPmlmYWNlKSA9PSAwKSB7CisJCQkJY2hhciAqb2xkaWZhY2UgPSBjdXJyaWYtPmlmYWNlOworCisJCQkJb2theSA9IDE7CisJCQkJY3VycmlmLT5pZmFjZSA9IGlmYWNlOworCisJCQkJZGVidWdfbm9pc2UoIlxuQ29uZmlndXJpbmcgaW50ZXJmYWNlICVzICglcylcbiIsIGxpZmFjZSwgY3VycmlmLT5hZGRyZXNzX2ZhbWlseS0+bmFtZSk7CisKKwkJCQkvKiBDYWxsIHRoZSBjbWRzIGZ1bmN0aW9uIHBvaW50ZXIsIGRvZXMgZWl0aGVyIGlmYWNlX3VwKCkgb3IgaWZhY2VfZG93bigpICovCisJCQkJY21kc19yZXQgPSBjbWRzKGN1cnJpZik7CisJCQkJaWYgKGNtZHNfcmV0ID09IC0xKSB7CisJCQkJCWJiX2Vycm9yX21zZygiZG9uJ3QgaGF2ZSBhbGwgdmFyaWFibGVzIGZvciAlcy8lcyIsCisJCQkJCQkJbGlmYWNlLCBjdXJyaWYtPmFkZHJlc3NfZmFtaWx5LT5uYW1lKTsKKwkJCQkJYW55X2ZhaWx1cmVzID0gY3Vycl9mYWlsdXJlID0gMTsKKwkJCQl9IGVsc2UgaWYgKGNtZHNfcmV0ID09IDApIHsKKwkJCQkJYW55X2ZhaWx1cmVzID0gY3Vycl9mYWlsdXJlID0gMTsKKwkJCQl9CisKKwkJCQljdXJyaWYtPmlmYWNlID0gb2xkaWZhY2U7CisJCQl9CisJCQlpZmFjZV9saXN0ID0gaWZhY2VfbGlzdC0+bGluazsKKwkJfQorCQlpZiAoVkVSQk9TRSkgeworCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJfQorCisJCWlmICghb2theSAmJiAhRk9SQ0UpIHsKKwkJCWJiX2Vycm9yX21zZygiaWdub3JpbmcgdW5rbm93biBpbnRlcmZhY2UgJXMiLCBsaWZhY2UpOworCQkJYW55X2ZhaWx1cmVzID0gMTsKKwkJfSBlbHNlIGlmICghTk9fQUNUKSB7CisJCQkvKiB1cGRhdGUgdGhlIHN0YXRlIGZpbGUgKi8KKwkJCUZJTEUgKnN0YXRlX2ZwOworCQkJbGxpc3RfdCAqc3RhdGU7CisJCQlsbGlzdF90ICpzdGF0ZV9saXN0ID0gcmVhZF9pZmFjZV9zdGF0ZSgpOworCQkJbGxpc3RfdCAqaWZhY2Vfc3RhdGUgPSBmaW5kX2lmYWNlX3N0YXRlKHN0YXRlX2xpc3QsIGlmYWNlKTsKKworCQkJaWYgKGNtZHMgPT0gaWZhY2VfdXAgJiYgIWN1cnJfZmFpbHVyZSkgeworCQkJCWNoYXIgKm5ld2lmYWNlID0geGFzcHJpbnRmKCIlcz0lcyIsIGlmYWNlLCBsaWZhY2UpOworCQkJCWlmICghaWZhY2Vfc3RhdGUpIHsKKwkJCQkJbGxpc3RfYWRkX3RvX2VuZCgmc3RhdGVfbGlzdCwgbmV3aWZhY2UpOworCQkJCX0gZWxzZSB7CisJCQkJCWZyZWUoaWZhY2Vfc3RhdGUtPmRhdGEpOworCQkJCQlpZmFjZV9zdGF0ZS0+ZGF0YSA9IG5ld2lmYWNlOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLyogUmVtb3ZlIGFuIGludGVyZmFjZSBmcm9tIHN0YXRlX2xpc3QgKi8KKwkJCQlsbGlzdF91bmxpbmsoJnN0YXRlX2xpc3QsIGlmYWNlX3N0YXRlKTsKKwkJCQlmcmVlKGxsaXN0X3BvcCgmaWZhY2Vfc3RhdGUpKTsKKwkJCX0KKworCQkJLyogQWN0dWFsbHkgd3JpdGUgdGhlIG5ldyBzdGF0ZSAqLworCQkJc3RhdGVfZnAgPSB4Zm9wZW5fZm9yX3dyaXRlKENPTkZJR19JRlVQRE9XTl9JRlNUQVRFX1BBVEgpOworCQkJc3RhdGUgPSBzdGF0ZV9saXN0OworCQkJd2hpbGUgKHN0YXRlKSB7CisJCQkJaWYgKHN0YXRlLT5kYXRhKSB7CisJCQkJCWZwcmludGYoc3RhdGVfZnAsICIlc1xuIiwgc3RhdGUtPmRhdGEpOworCQkJCX0KKwkJCQlzdGF0ZSA9IHN0YXRlLT5saW5rOworCQkJfQorCQkJZmNsb3NlKHN0YXRlX2ZwKTsKKwkJCWxsaXN0X2ZyZWUoc3RhdGVfbGlzdCwgZnJlZSk7CisJCX0KKyBuZXh0OgorCQlmcmVlKGlmYWNlKTsKKwkJZnJlZShsaWZhY2UpOworCX0KKworCXJldHVybiBhbnlfZmFpbHVyZXM7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2luZXRkLmMgYi9uZXR3b3JraW5nL2luZXRkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNlNWEwOAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvaW5ldGQuYwpAQCAtMCwwICsxLDE2NzUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogICAgICAkU2xhY2t3YXJlOiBpbmV0ZC5jIDEuNzlzIDIwMDEvMDIvMDYgMTM6MTg6MDAgdm9sa2VyZGkgRXhwICQgICAgKi8KKy8qICAgICAgJE9wZW5CU0Q6IGluZXRkLmMsdiAxLjc5IDIwMDEvMDEvMzAgMDg6MzA6NTcgZGVyYWFkdCBFeHAgJCAgICAgICovCisvKiAgICAgICROZXRCU0Q6IGluZXRkLmMsdiAxLjExIDE5OTYvMDIvMjIgMTE6MTQ6NDEgbXljcm9mdCBFeHAgJCAgICAgICAqLworLyogQnVzeWJveCBwb3J0IGJ5IFZsYWRpbWlyIE9sZXluaWsgKEMpIDIwMDEtMjAwNSA8ZHpvQHNpbXRyZWFzLnJ1PiAgICAgKi8KKy8qIElQdjYgc3VwcG9ydCwgbWFueSBidWcgZml4ZXMgYnkgRGVueXMgVmxhc2Vua28gKGMpIDIwMDggKi8KKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODMsMTk5MSBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ2VtZW50OgorICogICAgICBUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZSBVbml2ZXJzaXR5IG9mCisgKiAgICAgIENhbGlmb3JuaWEsIEJlcmtlbGV5IGFuZCBpdHMgY29udHJpYnV0b3JzLgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KKworLyogSW5ldGQgLSBJbnRlcm5ldCBzdXBlci1zZXJ2ZXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaW52b2tlcyBjb25maWd1cmVkIHNlcnZpY2VzIHdoZW4gYSBjb25uZWN0aW9uCisgKiBmcm9tIGEgcGVlciBpcyBlc3RhYmxpc2hlZCBvciBhIGRhdGFncmFtIGFycml2ZXMuCisgKiBDb25uZWN0aW9uLW9yaWVudGVkIHNlcnZpY2VzIGFyZSBpbnZva2VkIGVhY2ggdGltZSBhCisgKiBjb25uZWN0aW9uIGlzIG1hZGUsIGJ5IGNyZWF0aW5nIGEgcHJvY2Vzcy4gIFRoaXMgcHJvY2VzcworICogaXMgcGFzc2VkIHRoZSBjb25uZWN0aW9uIGFzIGZpbGUgZGVzY3JpcHRvciAwIGFuZCBpcworICogZXhwZWN0ZWQgdG8gZG8gYSBnZXRwZWVybmFtZSB0byBmaW5kIG91dCBwZWVyJ3MgaG9zdAorICogYW5kIHBvcnQuCisgKiBEYXRhZ3JhbSBvcmllbnRlZCBzZXJ2aWNlcyBhcmUgaW52b2tlZCB3aGVuIGEgZGF0YWdyYW0KKyAqIGFycml2ZXM7IGEgcHJvY2VzcyBpcyBjcmVhdGVkIGFuZCBwYXNzZWQgYSBwZW5kaW5nIG1lc3NhZ2UKKyAqIG9uIGZpbGUgZGVzY3JpcHRvciAwLiBwZWVyJ3MgYWRkcmVzcyBjYW4gYmUgb2J0YWluZWQKKyAqIHVzaW5nIHJlY3Zmcm9tLgorICoKKyAqIEluZXRkIHVzZXMgYSBjb25maWd1cmF0aW9uIGZpbGUgd2hpY2ggaXMgcmVhZCBhdCBzdGFydHVwCisgKiBhbmQsIHBvc3NpYmx5LCBhdCBzb21lIGxhdGVyIHRpbWUgaW4gcmVzcG9uc2UgdG8gYSBoYW5ndXAgc2lnbmFsLgorICogVGhlIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyAiZnJlZSBmb3JtYXQiIHdpdGggZmllbGRzIGdpdmVuIGluIHRoZQorICogb3JkZXIgc2hvd24gYmVsb3cuICBDb250aW51YXRpb24gbGluZXMgZm9yIGFuIGVudHJ5IG11c3QgYmVnaW4gd2l0aAorICogYSBzcGFjZSBvciB0YWIuICBBbGwgZmllbGRzIG11c3QgYmUgcHJlc2VudCBpbiBlYWNoIGVudHJ5LgorICoKKyAqICAgICAgc2VydmljZV9uYW1lICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGluIC9ldGMvc2VydmljZXMKKyAqICAgICAgc29ja2V0X3R5cGUgICAgICAgICAgICAgICAgICAgICBzdHJlYW0vZGdyYW0vcmF3L3JkbS9zZXFwYWNrZXQKKyAqICAgICAgcHJvdG9jb2wgICAgICAgICAgICAgICAgICAgICAgICBtdXN0IGJlIGluIC9ldGMvcHJvdG9jb2xzCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzdWFsbHkgInRjcCIgb3IgInVkcCIpCisgKiAgICAgIHdhaXQvbm93YWl0Wy5tYXhdICAgICAgICAgICAgICAgc2luZ2xlLXRocmVhZGVkL211bHRpLXRocmVhZGVkLCBtYXggIworICogICAgICB1c2VyWy5ncm91cF0gb3IgdXNlcls6Z3JvdXBdICAgIHVzZXIvZ3JvdXAgdG8gcnVuIGRhZW1vbiBhcworICogICAgICBzZXJ2ZXJfcHJvZ3JhbSAgICAgICAgICAgICAgICAgIGZ1bGwgcGF0aCBuYW1lCisgKiAgICAgIHNlcnZlcl9wcm9ncmFtX2FyZ3VtZW50cyAgICAgICAgbWF4aW11bSBvZiBNQVhBUkdTICgyMCkKKyAqCisgKiBGb3IgUlBDIHNlcnZpY2VzCisgKiAgICAgIHNlcnZpY2VfbmFtZS92ZXJzaW9uICAgICAgICAgICAgbXVzdCBiZSBpbiAvZXRjL3JwYworICogICAgICBzb2NrZXRfdHlwZSAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS9kZ3JhbS9yYXcvcmRtL3NlcXBhY2tldAorICogICAgICBycGMvcHJvdG9jb2wgICAgICAgICAgICAgICAgICAgICJycGMvdGNwIiBldGMKKyAqICAgICAgd2FpdC9ub3dhaXRbLm1heF0gICAgICAgICAgICAgICBzaW5nbGUtdGhyZWFkZWQvbXVsdGktdGhyZWFkZWQKKyAqICAgICAgdXNlclsuZ3JvdXBdIG9yIHVzZXJbOmdyb3VwXSAgICB1c2VyIHRvIHJ1biBkYWVtb24gYXMKKyAqICAgICAgc2VydmVyX3Byb2dyYW0gICAgICAgICAgICAgICAgICBmdWxsIHBhdGggbmFtZQorICogICAgICBzZXJ2ZXJfcHJvZ3JhbV9hcmd1bWVudHMgICAgICAgIG1heGltdW0gb2YgTUFYQVJHUyAoMjApCisgKgorICogRm9yIG5vbi1SUEMgc2VydmljZXMsIHRoZSAic2VydmljZSBuYW1lIiBjYW4gYmUgb2YgdGhlIGZvcm0KKyAqIGhvc3RhZGRyZXNzOnNlcnZpY2VuYW1lLCBpbiB3aGljaCBjYXNlIHRoZSBob3N0YWRkcmVzcyBpcyB1c2VkCisgKiBhcyB0aGUgaG9zdCBwb3J0aW9uIG9mIHRoZSBhZGRyZXNzIHRvIGxpc3RlbiBvbi4gIElmIGhvc3RhZGRyZXNzCisgKiBjb25zaXN0cyBvZiBhIHNpbmdsZSAnKicgY2hhcmFjdGVyLCBJTkFERFJfQU5ZIGlzIHVzZWQuCisgKgorICogQSBsaW5lIGNhbiBhbHNvIGNvbnNpc3Qgb2YganVzdAorICogICAgICBob3N0YWRkcmVzczoKKyAqIHdoZXJlIGhvc3RhZGRyZXNzIGlzIGFzIGluIHRoZSBwcmVjZWRpbmcgcGFyYWdyYXBoLiAgU3VjaCBhIGxpbmUgbXVzdAorICogaGF2ZSBubyBmdXJ0aGVyIGZpZWxkczsgdGhlIHNwZWNpZmllZCBob3N0YWRkcmVzcyBpcyByZW1lbWJlcmVkIGFuZAorICogdXNlZCBmb3IgYWxsIGZ1cnRoZXIgbGluZXMgdGhhdCBoYXZlIG5vIGhvc3RhZGRyZXNzIHNwZWNpZmllZCwKKyAqIHVudGlsIHRoZSBuZXh0IHN1Y2ggbGluZSAob3IgRU9GKS4gIChUaGlzIGlzIHdoeSAqIGlzIHByb3ZpZGVkIHRvCisgKiBhbGxvdyBleHBsaWNpdCBzcGVjaWZpY2F0aW9uIG9mIElOQUREUl9BTlkuKSAgQSBsaW5lCisgKiAgICAgICo6CisgKiBpcyBpbXBsaWNpdGx5IGluIGVmZmVjdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlLgorICoKKyAqIFRoZSBob3N0YWRkcmVzcyBzcGVjaWZpZXIgbWF5IChhbmQgb2Z0ZW4gd2lsbCkgY29udGFpbiBkb3RzOworICogdGhlIHNlcnZpY2UgbmFtZSBtdXN0IG5vdC4KKyAqCisgKiBGb3IgUlBDIHNlcnZpY2VzLCBob3N0LWFkZHJlc3Mgc3BlY2lmaWVycyBhcmUgYWNjZXB0ZWQgYW5kIHdpbGwKKyAqIHdvcmsgdG8gc29tZSBleHRlbnQ7IGhvd2V2ZXIsIGJlY2F1c2Ugb2YgbGltaXRhdGlvbnMgaW4gdGhlCisgKiBwb3J0bWFwcGVyIGludGVyZmFjZSwgaXQgd2lsbCBub3Qgd29yayB0byB0cnkgdG8gZ2l2ZSBtb3JlIHRoYW4KKyAqIG9uZSBsaW5lIGZvciBhbnkgZ2l2ZW4gUlBDIHNlcnZpY2UsIGV2ZW4gaWYgdGhlIGhvc3QtYWRkcmVzcworICogc3BlY2lmaWVycyBhcmUgZGlmZmVyZW50LgorICoKKyAqIENvbW1lbnQgbGluZXMgYXJlIGluZGljYXRlZCBieSBhICcjJyBpbiBjb2x1bW4gMS4KKyAqLworCisvKiBpbmV0ZCBydWxlcyBmb3IgcGFzc2luZyBmaWxlIGRlc2NyaXB0b3JzIHRvIGNoaWxkcmVuCisgKiAoaHR0cDovL3d3dy5mcmVlYnNkLm9yZy9jZ2kvbWFuLmNnaT9xdWVyeT1pbmV0ZCk6CisgKgorICogVGhlIHdhaXQvbm93YWl0IGVudHJ5IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBzZXJ2ZXIgdGhhdCBpcyBpbnZva2VkIGJ5CisgKiBpbmV0ZCB3aWxsIHRha2Ugb3ZlciB0aGUgc29ja2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc2VydmljZSBhY2Nlc3MgcG9pbnQsCisgKiBhbmQgdGh1cyB3aGV0aGVyIGluZXRkIHNob3VsZCB3YWl0IGZvciB0aGUgc2VydmVyIHRvIGV4aXQgYmVmb3JlIGxpc3Rlbi0KKyAqIGluZyBmb3IgbmV3IHNlcnZpY2UgcmVxdWVzdHMuICBEYXRhZ3JhbSBzZXJ2ZXJzIG11c3QgdXNlICJ3YWl0IiwgYXMKKyAqIHRoZXkgYXJlIGFsd2F5cyBpbnZva2VkIHdpdGggdGhlIG9yaWdpbmFsIGRhdGFncmFtIHNvY2tldCBib3VuZCB0byB0aGUKKyAqIHNwZWNpZmllZCBzZXJ2aWNlIGFkZHJlc3MuICBUaGVzZSBzZXJ2ZXJzIG11c3QgcmVhZCBhdCBsZWFzdCBvbmUgZGF0YWdyYW0KKyAqIGZyb20gdGhlIHNvY2tldCBiZWZvcmUgZXhpdGluZy4gIElmIGEgZGF0YWdyYW0gc2VydmVyIGNvbm5lY3RzIHRvIGl0cworICogcGVlciwgZnJlZWluZyB0aGUgc29ja2V0IHNvIGluZXRkIGNhbiByZWNlaXZlIGZ1cnRoZXIgbWVzc2FnZXMgb24gdGhlCisgKiBzb2NrZXQsIGl0IGlzIHNhaWQgdG8gYmUgYSAibXVsdGktdGhyZWFkZWQiIHNlcnZlcjsgaXQgc2hvdWxkIHJlYWQgb25lCisgKiBkYXRhZ3JhbSBmcm9tIHRoZSBzb2NrZXQgYW5kIGNyZWF0ZSBhIG5ldyBzb2NrZXQgY29ubmVjdGVkIHRvIHRoZSBwZWVyLgorICogSXQgc2hvdWxkIGZvcmssIGFuZCB0aGUgcGFyZW50IHNob3VsZCB0aGVuIGV4aXQgdG8gYWxsb3cgaW5ldGQgdG8gY2hlY2sKKyAqIGZvciBuZXcgc2VydmljZSByZXF1ZXN0cyB0byBzcGF3biBuZXcgc2VydmVycy4gIERhdGFncmFtIHNlcnZlcnMgd2hpY2gKKyAqIHByb2Nlc3MgYWxsIGluY29taW5nIGRhdGFncmFtcyBvbiBhIHNvY2tldCBhbmQgZXZlbnR1YWxseSB0aW1lIG91dCBhcmUKKyAqIHNhaWQgdG8gYmUgInNpbmdsZS10aHJlYWRlZCIuICBUaGUgY29tc2F0KDgpLCBiaWZmKDEpIGFuZCB0YWxrZCg4KQorICogdXRpbGl0aWVzIGFyZSBib3RoIGV4YW1wbGVzIG9mIHRoZSBsYXR0ZXIgdHlwZSBvZiBkYXRhZ3JhbSBzZXJ2ZXIuICBUaGUKKyAqIHRmdHBkKDgpIHV0aWxpdHkgaXMgYW4gZXhhbXBsZSBvZiBhIG11bHRpLXRocmVhZGVkIGRhdGFncmFtIHNlcnZlci4KKyAqCisgKiBTZXJ2ZXJzIHVzaW5nIHN0cmVhbSBzb2NrZXRzIGdlbmVyYWxseSBhcmUgbXVsdGktdGhyZWFkZWQgYW5kIHVzZSB0aGUKKyAqICJub3dhaXQiIGVudHJ5LiBDb25uZWN0aW9uIHJlcXVlc3RzIGZvciB0aGVzZSBzZXJ2aWNlcyBhcmUgYWNjZXB0ZWQgYnkKKyAqIGluZXRkLCBhbmQgdGhlIHNlcnZlciBpcyBnaXZlbiBvbmx5IHRoZSBuZXdseS1hY2NlcHRlZCBzb2NrZXQgY29ubmVjdGVkCisgKiB0byBhIGNsaWVudCBvZiB0aGUgc2VydmljZS4gIE1vc3Qgc3RyZWFtLWJhc2VkIHNlcnZpY2VzIG9wZXJhdGUgaW4gdGhpcworICogbWFubmVyLiAgU3RyZWFtLWJhc2VkIHNlcnZlcnMgdGhhdCB1c2UgIndhaXQiIGFyZSBzdGFydGVkIHdpdGggdGhlIGxpcy0KKyAqIHRlbmluZyBzZXJ2aWNlIHNvY2tldCwgYW5kIG11c3QgYWNjZXB0IGF0IGxlYXN0IG9uZSBjb25uZWN0aW9uIHJlcXVlc3QKKyAqIGJlZm9yZSBleGl0aW5nLiAgU3VjaCBhIHNlcnZlciB3b3VsZCBub3JtYWxseSBhY2NlcHQgYW5kIHByb2Nlc3MgaW5jb21pbmcKKyAqIGNvbm5lY3Rpb24gcmVxdWVzdHMgdW50aWwgYSB0aW1lb3V0LgorICovCisKKy8qIERlc3BpdGUgb2YgYWJvdmUgZG9jIHNheWluZyB0aGF0IGRncmFtIHNlcnZpY2VzIG11c3QgdXNlICJ3YWl0IiwKKyAqICJ1ZHAgbm93YWl0IiBzZXJ2ZXJzIGFyZSBpbXBsZW1lbnRlZCBpbiBidXN5Ym94ZWQgaW5ldGQuCisgKiBJUHY2IGFkZHJlc3NlcyBhcmUgYWxzbyBpbXBsZW1lbnRlZC4gSG93ZXZlciwgdGhleSBtYXkgbG9vayB1Z2x5IC0KKyAqICI6OjpzZXJ2aWNlLi4uIiBtZWFucyAiYWRkcmVzcyAnOjonIChJUHY2IHdpbGRjYXJkIGFkZHIpIjoic2VydmljZSIuLi4KKyAqIFlvdSBoYXZlIHRvIHB1dCAidGNwNiIvInVkcDYiIGluIHByb3RvY29sIGZpZWxkIHRvIHNlbGVjdCBJUHY2LgorICovCisKKy8qIEhlcmUncyB0aGUgc2Nvb3AgY29uY2VybmluZyB0aGUgdXNlcls6Z3JvdXBdIGZlYXR1cmU6CisgKiAxKSBncm91cCBpcyBub3Qgc3BlY2lmaWVkOgorICogICAgICBhKSB1c2VyID0gcm9vdDogTk8gc2V0dWlkKCkgb3Igc2V0Z2lkKCkgaXMgZG9uZQorICogICAgICBiKSBvdGhlcjogICAgICAgaW5pdGdyb3VwcyhuYW1lLCBwcmltYXJ5IGdyb3VwKQorICogICAgICAgICAgICAgICAgICAgICAgc2V0Z2lkKHByaW1hcnkgZ3JvdXAgYXMgZm91bmQgaW4gcGFzc3dkKQorICogICAgICAgICAgICAgICAgICAgICAgc2V0dWlkKCkKKyAqIDIpIGdyb3VwIGlzIHNwZWNpZmllZDoKKyAqICAgICAgYSkgdXNlciA9IHJvb3Q6IHNldGdpZChzcGVjaWZpZWQgZ3JvdXApCisgKiAgICAgICAgICAgICAgICAgICAgICBOTyBpbml0Z3JvdXBzKCkKKyAqICAgICAgICAgICAgICAgICAgICAgIE5PIHNldHVpZCgpCisgKiAgICAgIGIpIG90aGVyOiAgICAgICBpbml0Z3JvdXBzKG5hbWUsIHNwZWNpZmllZCBncm91cCkKKyAqICAgICAgICAgICAgICAgICAgICAgIHNldGdpZChzcGVjaWZpZWQgZ3JvdXApCisgKiAgICAgICAgICAgICAgICAgICAgICBzZXR1aWQoKQorICovCisKKy8vdXNhZ2U6I2RlZmluZSBpbmV0ZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1mZV0gWy1xIE5dIFstUiBOXSBbQ09ORkZJTEVdIgorLy91c2FnZTojZGVmaW5lIGluZXRkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTGlzdGVuIGZvciBuZXR3b3JrIGNvbm5lY3Rpb25zIGFuZCBsYXVuY2ggcHJvZ3JhbXNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJUnVuIGluIGZvcmVncm91bmQiCisvL3VzYWdlOiAgICAgIlxuCS1lCUxvZyB0byBzdGRlcnIiCisvL3VzYWdlOiAgICAgIlxuCS1xIE4JU29ja2V0IGxpc3RlbiBxdWV1ZSAoZGVmYXVsdDogMTI4KSIKKy8vdXNhZ2U6ICAgICAiXG4JLVIgTglQYXVzZSBzZXJ2aWNlcyBhZnRlciBOIGNvbm5lY3RzL21pbiIKKy8vdXNhZ2U6ICAgICAiXG4JCShkZWZhdWx0OiAwIC0gZGlzYWJsZWQpIgorCisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+IC8qIHNldHJsaW1pdCAqLworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4gLyogdW4uaCBtYXkgbmVlZCB0aGlzICovCisjaW5jbHVkZSA8c3lzL3VuLmg+CisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfUlBDCisjIGlmIGRlZmluZWQoX19VQ0xJQkNfXykgJiYgISBkZWZpbmVkKF9fVUNMSUJDX0hBU19SUENfXykKKyMgIGVycm9yICJZb3UgbmVlZCB0byBidWlsZCB1Q2xpYmMgd2l0aCBVQ0xJQkNfSEFTX1JQQyBmb3IgTkZTIHN1cHBvcnQiCisjIGVuZGlmCisjIGluY2x1ZGUgPHJwYy9ycGMuaD4KKyMgaW5jbHVkZSA8cnBjL3BtYXBfY2xudC5oPgorI2VuZGlmCisKKyNpZiAhQkJfTU1VCisvKiBzdHJlYW0gdmVyc2lvbiBvZiBjaGFyZ2VuIGlzIGZvcmtpbmcgYnV0IG5vdCBleGVjaW5nLAorICogY2FuJ3QgZG8gdGhhdCAoZWFzaWx5KSBvbiBOT01NVSAqLworI3VuZGVmICBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fQ0hBUkdFTgorI2RlZmluZSBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fQ0hBUkdFTiAwCisjZW5kaWYKKworI2RlZmluZSBDTlRfSU5URVJWQUwgICAgNjAgICAgICAvKiBzZXJ2ZXJzIGluIENOVF9JTlRFUlZBTCBzZWMuICovCisjZGVmaW5lIFJFVFJZVElNRSAgICAgICA2MCAgICAgIC8qIHJldHJ5IGFmdGVyIGJpbmQgb3Igc2VydmVyIGZhaWwgKi8KKworLy8gVE9ETzogZXhwbGFpbiwgb3IgZ2V0IHJpZCBvZiBzZXRybGltaXQgZ2FtZXMKKworI2lmbmRlZiBSTElNSVRfTk9GSUxFCisjZGVmaW5lIFJMSU1JVF9OT0ZJTEUgICBSTElNSVRfT0ZJTEUKKyNlbmRpZgorCisjaWZuZGVmIE9QRU5fTUFYCisjZGVmaW5lIE9QRU5fTUFYICAgICAgICA2NAorI2VuZGlmCisKKy8qIFJlc2VydmUgc29tZSBkZXNjcmlwdG9ycywgMyBzdGRpbyArIGF0IGxlYXN0OiAxIGxvZywgMSBjb25mLiBmaWxlICovCisjZGVmaW5lIEZEX01BUkdJTiAgICAgICA4CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRElTQ0FSRCBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0VDSE8gICAgXAorIHx8IEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9DSEFSR0VOIFwKKyB8fCBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fVElNRSAgICBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RBWVRJTUUKKyMgZGVmaW5lIElORVREX0JVSUxUSU5TX0VOQUJMRUQKKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBzZXJ2dGFiX3QgeworCS8qIFRoZSBtb3N0IGZyZXF1ZW50bHkgcmVmZXJlbmNlZCBvbmU6ICovCisJaW50IHNlX2ZkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvcGVuIGRlc2NyaXB0b3IgKi8KKwkvKiBOQjogJ2JpZ2dlc3QgZmllbGRzIGxhc3QnIHNhdmVzIG9uIGNvZGUgc2l6ZSAofjI1MCBieXRlcykgKi8KKwkvKiBbYWRkcjpdc2VydmljZSBzb2NrdHlwZSBwcm90byB3YWl0IHVzZXJbOmdyb3VwXSBwcm9nIFthcmdzXSAqLworCWNoYXIgKnNlX2xvY2FsX2hvc3RuYW1lOyAgICAgICAgICAgICAgLyogYWRkciB0byBsaXN0ZW4gb24gKi8KKwljaGFyICpzZV9zZXJ2aWNlOyAgICAgICAgICAgICAgICAgICAgIC8qICI4MCIgb3IgInd3dyIgb3IgIm1vdW50LzJbLTNdIiAqLworCS8qIHNvY2t0eXBlIGlzIGluIHNlX3NvY2t0eXBlICovICAgICAgLyogInN0cmVhbSIgImRncmFtIiAicmF3IiAicmRtIiAic2VxcGFja2V0IiAqLworCWNoYXIgKnNlX3Byb3RvOyAgICAgICAgICAgICAgICAgICAgICAgLyogInVuaXgiIG9yICJbcnBjL110Y3BbNl0iICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfUlBDCisJaW50IHNlX3JwY3Byb2c7ICAgICAgICAgICAgICAgICAgICAgICAvKiBycGMgcHJvZ3JhbSBudW1iZXIgKi8KKwlpbnQgc2VfcnBjdmVyX2xvOyAgICAgICAgICAgICAgICAgICAgIC8qIHJwYyBwcm9ncmFtIGxvd2VzdCB2ZXJzaW9uICovCisJaW50IHNlX3JwY3Zlcl9oaTsgICAgICAgICAgICAgICAgICAgICAvKiBycGMgcHJvZ3JhbSBoaWdoZXN0IHZlcnNpb24gKi8KKyNkZWZpbmUgaXNfcnBjX3NlcnZpY2Uoc2VwKSAgICAgICAoKHNlcCktPnNlX3JwY3Zlcl9sbyAhPSAwKQorI2Vsc2UKKyNkZWZpbmUgaXNfcnBjX3NlcnZpY2Uoc2VwKSAgICAgICAwCisjZW5kaWYKKwlwaWRfdCBzZV93YWl0OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIDA6Im5vd2FpdCIsIDE6IndhaXQiLCA+MToid2FpdCIgKi8KKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGFuZCB3YWl0aW5nIGZvciB0aGlzIHBpZCAqLworCXNvY2t0eXBlX3Qgc2Vfc29ja3R5cGU7ICAgICAgICAgICAgICAgLyogU09DS19TVFJFQU0vREdSQU0vUkRNLy4uLiAqLworCWZhbWlseV90IHNlX2ZhbWlseTsgICAgICAgICAgICAgICAgICAgLyogQUZfVU5JWC9JTkVUWzZdICovCisJLyogc2VfcHJvdG9fbm8gaXMgdXNlZCBieSBSUEMgY29kZSBvbmx5Li4uIGhtbSAqLworCXNtYWxsaW50IHNlX3Byb3RvX25vOyAgICAgICAgICAgICAgICAgLyogSVBQUk9UT19UQ1AvVURQLCBuL2EgZm9yIEFGX1VOSVggKi8KKwlzbWFsbGludCBzZV9jaGVja2VkOyAgICAgICAgICAgICAgICAgIC8qIGxvb2tlZCBhdCBkdXJpbmcgbWVyZ2UgKi8KKwl1bnNpZ25lZCBzZV9tYXg7ICAgICAgICAgICAgICAgICAgICAgIC8qIGFsbG93ZWQgaW5zdGFuY2VzIHBlciBtaW51dGUgKi8KKwl1bnNpZ25lZCBzZV9jb3VudDsgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBzdGFydGVkIHNpbmNlIHNlX3RpbWUgKi8KKwl1bnNpZ25lZCBzZV90aW1lOyAgICAgICAgICAgICAgICAgICAgIC8qIHdoZW4gd2Ugc3RhcnRlZCBjb3VudGluZyAqLworCWNoYXIgKnNlX3VzZXI7ICAgICAgICAgICAgICAgICAgICAgICAgLyogdXNlciBuYW1lIHRvIHJ1biBhcyAqLworCWNoYXIgKnNlX2dyb3VwOyAgICAgICAgICAgICAgICAgICAgICAgLyogZ3JvdXAgbmFtZSB0byBydW4gYXMsIGNhbiBiZSBOVUxMICovCisjaWZkZWYgSU5FVERfQlVJTFRJTlNfRU5BQkxFRAorCWNvbnN0IHN0cnVjdCBidWlsdGluICpzZV9idWlsdGluOyAgICAgLyogaWYgYnVpbHQtaW4sIGRlc2NyaXB0aW9uICovCisjZW5kaWYKKwlzdHJ1Y3Qgc2VydnRhYl90ICpzZV9uZXh0OworCWxlbl9hbmRfc29ja2FkZHIgKnNlX2xzYTsKKwljaGFyICpzZV9wcm9ncmFtOyAgICAgICAgICAgICAgICAgICAgIC8qIHNlcnZlciBwcm9ncmFtICovCisjZGVmaW5lIE1BWEFSR1YgMjAKKwljaGFyICpzZV9hcmd2W01BWEFSR1YgKyAxXTsgICAgICAgICAgIC8qIHByb2dyYW0gYXJndW1lbnRzICovCit9IHNlcnZ0YWJfdDsKKworI2lmZGVmIElORVREX0JVSUxUSU5TX0VOQUJMRUQKKy8qIEVjaG8gcmVjZWl2ZWQgZGF0YSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9FQ0hPCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgZWNob19zdHJlYW0oaW50LCBzZXJ2dGFiX3QgKik7CitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgZWNob19kZyhpbnQsIHNlcnZ0YWJfdCAqKTsKKyNlbmRpZgorLyogSW50ZXJuZXQgL2Rldi9udWxsICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RJU0NBUkQKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBkaXNjYXJkX3N0cmVhbShpbnQsIHNlcnZ0YWJfdCAqKTsKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBkaXNjYXJkX2RnKGludCwgc2VydnRhYl90ICopOworI2VuZGlmCisvKiBSZXR1cm4gMzIgYml0IHRpbWUgc2luY2UgMTkwMCAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9USU1FCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgbWFjaHRpbWVfc3RyZWFtKGludCwgc2VydnRhYl90ICopOworc3RhdGljIHZvaWQgRkFTVF9GVU5DIG1hY2h0aW1lX2RnKGludCwgc2VydnRhYl90ICopOworI2VuZGlmCisvKiBSZXR1cm4gaHVtYW4tcmVhZGFibGUgdGltZSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9EQVlUSU1FCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgZGF5dGltZV9zdHJlYW0oaW50LCBzZXJ2dGFiX3QgKik7CitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgZGF5dGltZV9kZyhpbnQsIHNlcnZ0YWJfdCAqKTsKKyNlbmRpZgorLyogRmFtaWxpYXIgY2hhcmFjdGVyIGdlbmVyYXRvciAqLworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9DSEFSR0VOCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY2hhcmdlbl9zdHJlYW0oaW50LCBzZXJ2dGFiX3QgKik7CitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY2hhcmdlbl9kZyhpbnQsIHNlcnZ0YWJfdCAqKTsKKyNlbmRpZgorCitzdHJ1Y3QgYnVpbHRpbiB7CisJLyogTkI6IG5vdCBuZWNlc3NhcmlseSBOVUwgdGVybWluYXRlZCAqLworCWNoYXIgYmlfc2VydmljZTdbN107ICAgICAgLyogaW50ZXJuYWxseSBwcm92aWRlZCBzZXJ2aWNlIG5hbWUgKi8KKwl1aW50OF90IGJpX2Zvcms7ICAgICAgICAgIC8qIDEgaWYgc3RyZWFtIGZuIHNob3VsZCBydW4gaW4gY2hpbGQgKi8KKwl2b2lkICgqYmlfc3RyZWFtX2ZuKShpbnQsIHNlcnZ0YWJfdCAqKSBGQVNUX0ZVTkM7CisJdm9pZCAoKmJpX2RncmFtX2ZuKShpbnQsIHNlcnZ0YWJfdCAqKSBGQVNUX0ZVTkM7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGJ1aWx0aW4gYnVpbHRpbnNbXSA9IHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRUNITworCXsgImVjaG8iLCAxLCBlY2hvX3N0cmVhbSwgZWNob19kZyB9LAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0RJU0NBUkQKKwl7ICJkaXNjYXJkIiwgMSwgZGlzY2FyZF9zdHJlYW0sIGRpc2NhcmRfZGcgfSwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9DSEFSR0VOCisJeyAiY2hhcmdlbiIsIDEsIGNoYXJnZW5fc3RyZWFtLCBjaGFyZ2VuX2RnIH0sCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fVElNRQorCXsgInRpbWUiLCAwLCBtYWNodGltZV9zdHJlYW0sIG1hY2h0aW1lX2RnIH0sCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fREFZVElNRQorCXsgImRheXRpbWUiLCAwLCBkYXl0aW1lX3N0cmVhbSwgZGF5dGltZV9kZyB9LAorI2VuZGlmCit9OworI2VuZGlmIC8qIElORVREX0JVSUxUSU5TX0VOQUJMRUQgKi8KKworc3RydWN0IGdsb2JhbHMgeworCXJsaW1fdCBybGltX29maWxlX2N1cjsKKwlzdHJ1Y3QgcmxpbWl0IHJsaW1fb2ZpbGU7CisJc2VydnRhYl90ICpzZXJ2X2xpc3Q7CisJaW50IGdsb2JhbF9xdWV1ZWxlbjsKKwlpbnQgbWF4c29jazsgICAgICAgICAvKiBtYXggZmQjIGluIGFsbHNvY2ssIC0xOiB1bmtub3duICovCisJLyogd2hlbmV2ZXIgbWF4c29jayBncm93cywgcHJldl9tYXhzb2NrIGlzIHNldCB0byBuZXcgbWF4c29jaywKKwkgKiBidXQgaWYgbWF4c29jayBpcyBzZXQgdG8gLTEsIHByZXZfbWF4c29jayBpcyBub3QgY2hhbmdlZCAqLworCWludCBwcmV2X21heHNvY2s7CisJdW5zaWduZWQgbWF4X2NvbmN1cnJlbmN5OworCXNtYWxsaW50IGFsYXJtX2FybWVkOworCXVpZF90IHJlYWxfdWlkOyAvKiB1c2VyIElEIHdobyByYW4gdXMgKi8KKwljb25zdCBjaGFyICpjb25maWdfZmlsZW5hbWU7CisJcGFyc2VyX3QgKnBhcnNlcjsKKwljaGFyICpkZWZhdWx0X2xvY2FsX2hvc3RuYW1lOworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9DSEFSR0VOCisJY2hhciAqZW5kX3Jpbmc7CisJY2hhciAqcmluZ19wb3M7CisJY2hhciByaW5nWzEyOF07CisjZW5kaWYKKwlmZF9zZXQgYWxsc29jazsKKwkvKiBVc2VkIGluIG5leHRfbGluZSgpLCBhbmQgYXMgc2NyYXRjaCByZWFkIGJ1ZmZlciAqLworCWNoYXIgbGluZVsyNTZdOyAgICAgICAgICAvKiBfYXQgbGVhc3RfIDI1Niwgc2VlIExJTkVfU0laRSAqLworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKK2VudW0geyBMSU5FX1NJWkUgPSBDT01NT05fQlVGU0laRSAtIG9mZnNldG9mKHN0cnVjdCBnbG9iYWxzLCBsaW5lKSB9Oworc3RydWN0IEJVR19HX3Rvb19iaWcgeworCWNoYXIgQlVHX0dfdG9vX2JpZ1tzaXplb2YoRykgPD0gQ09NTU9OX0JVRlNJWkUgPyAxIDogLTFdOworfTsKKyNkZWZpbmUgcmxpbV9vZmlsZV9jdXIgIChHLnJsaW1fb2ZpbGVfY3VyICkKKyNkZWZpbmUgcmxpbV9vZmlsZSAgICAgIChHLnJsaW1fb2ZpbGUgICAgICkKKyNkZWZpbmUgc2Vydl9saXN0ICAgICAgIChHLnNlcnZfbGlzdCAgICAgICkKKyNkZWZpbmUgZ2xvYmFsX3F1ZXVlbGVuIChHLmdsb2JhbF9xdWV1ZWxlbikKKyNkZWZpbmUgbWF4c29jayAgICAgICAgIChHLm1heHNvY2sgICAgICAgICkKKyNkZWZpbmUgcHJldl9tYXhzb2NrICAgIChHLnByZXZfbWF4c29jayAgICkKKyNkZWZpbmUgbWF4X2NvbmN1cnJlbmN5IChHLm1heF9jb25jdXJyZW5jeSkKKyNkZWZpbmUgYWxhcm1fYXJtZWQgICAgIChHLmFsYXJtX2FybWVkICAgICkKKyNkZWZpbmUgcmVhbF91aWQgICAgICAgIChHLnJlYWxfdWlkICAgICAgICkKKyNkZWZpbmUgY29uZmlnX2ZpbGVuYW1lIChHLmNvbmZpZ19maWxlbmFtZSkKKyNkZWZpbmUgcGFyc2VyICAgICAgICAgIChHLnBhcnNlciAgICAgICAgICkKKyNkZWZpbmUgZGVmYXVsdF9sb2NhbF9ob3N0bmFtZSAoRy5kZWZhdWx0X2xvY2FsX2hvc3RuYW1lKQorI2RlZmluZSBmaXJzdF9wc19ieXRlICAgKEcuZmlyc3RfcHNfYnl0ZSAgKQorI2RlZmluZSBsYXN0X3BzX2J5dGUgICAgKEcubGFzdF9wc19ieXRlICAgKQorI2RlZmluZSBlbmRfcmluZyAgICAgICAgKEcuZW5kX3JpbmcgICAgICAgKQorI2RlZmluZSByaW5nX3BvcyAgICAgICAgKEcucmluZ19wb3MgICAgICAgKQorI2RlZmluZSByaW5nICAgICAgICAgICAgKEcucmluZyAgICAgICAgICAgKQorI2RlZmluZSBhbGxzb2NrICAgICAgICAgKEcuYWxsc29jayAgICAgICAgKQorI2RlZmluZSBsaW5lICAgICAgICAgICAgKEcubGluZSAgICAgICAgICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlybGltX29maWxlX2N1ciA9IE9QRU5fTUFYOyBcCisJZ2xvYmFsX3F1ZXVlbGVuID0gMTI4OyBcCisJY29uZmlnX2ZpbGVuYW1lID0gIi9ldGMvaW5ldGQuY29uZiI7IFwKK30gd2hpbGUgKDApCisKKyNpZiAxCisjIGRlZmluZSBkYmcoLi4uKSAoKHZvaWQpMCkKKyNlbHNlCisjIGRlZmluZSBkYmcoLi4uKSBcCitkbyB7IFwKKwlpbnQgZGJnX2ZkID0gb3BlbigiaW5ldGRfZGVidWcubG9nIiwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19BUFBFTkQsIDA2NjYpOyBcCisJaWYgKGRiZ19mZCA+PSAwKSB7IFwKKwkJZmRwcmludGYoZGJnX2ZkLCAiJWQ6ICIsIGdldHBpZCgpKTsgXAorCQlmZHByaW50ZihkYmdfZmQsIF9fVkFfQVJHU19fKTsgXAorCQljbG9zZShkYmdfZmQpOyBcCisJfSBcCit9IHdoaWxlICgwKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIG1heWJlX2Nsb3NlKGludCBmZCkKK3sKKwlpZiAoZmQgPj0gMCkgeworCQljbG9zZShmZCk7CisJCWRiZygiY2xvc2VkIGZkOiVkXG4iLCBmZCk7CisJfQorfQorCisvLyBUT0RPOiBtb3ZlIHRvIGxpYmJiPworc3RhdGljIGxlbl9hbmRfc29ja2FkZHIgKnh6YWxsb2NfbHNhKGludCBmYW1pbHkpCit7CisJbGVuX2FuZF9zb2NrYWRkciAqbHNhOworCWludCBzejsKKworCXN6ID0gc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcl9pbik7CisJaWYgKGZhbWlseSA9PSBBRl9VTklYKQorCQlzeiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfdW4pOworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwlpZiAoZmFtaWx5ID09IEFGX0lORVQ2KQorCQlzeiA9IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHJfaW42KTsKKyNlbmRpZgorCWxzYSA9IHh6YWxsb2MoTFNBX0xFTl9TSVpFICsgc3opOworCWxzYS0+bGVuID0gc3o7CisJbHNhLT51LnNhLnNhX2ZhbWlseSA9IGZhbWlseTsKKwlyZXR1cm4gbHNhOworfQorCitzdGF0aWMgdm9pZCByZWFybV9hbGFybSh2b2lkKQoreworCWlmICghYWxhcm1fYXJtZWQpIHsKKwkJYWxhcm1fYXJtZWQgPSAxOworCQlhbGFybShSRVRSWVRJTUUpOworCX0KK30KKworc3RhdGljIHZvaWQgYmxvY2tfQ0hMRF9IVVBfQUxSTShzaWdzZXRfdCAqbSkKK3sKKwlzaWdlbXB0eXNldChtKTsKKwlzaWdhZGRzZXQobSwgU0lHQ0hMRCk7CisJc2lnYWRkc2V0KG0sIFNJR0hVUCk7CisJc2lnYWRkc2V0KG0sIFNJR0FMUk0pOworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgbSwgbSk7IC8qIG9sZCBzaWdtYXNrIGlzIHN0b3JlZCBpbiBtICovCit9CisKK3N0YXRpYyB2b2lkIHJlc3RvcmVfc2lnbWFzayhzaWdzZXRfdCAqbSkKK3sKKwlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgbSwgTlVMTCk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9SUEMKK3N0YXRpYyB2b2lkIHJlZ2lzdGVyX3JwYyhzZXJ2dGFiX3QgKnNlcCkKK3sKKwlpbnQgbjsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gaXJfc2luOworCXNvY2tsZW5fdCBzaXplOworCisJc2l6ZSA9IHNpemVvZihpcl9zaW4pOworCWlmIChnZXRzb2NrbmFtZShzZXAtPnNlX2ZkLCAoc3RydWN0IHNvY2thZGRyICopICZpcl9zaW4sICZzaXplKSA8IDApIHsKKwkJYmJfcGVycm9yX21zZygiZ2V0c29ja25hbWUiKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAobiA9IHNlcC0+c2VfcnBjdmVyX2xvOyBuIDw9IHNlcC0+c2VfcnBjdmVyX2hpOyBuKyspIHsKKwkJcG1hcF91bnNldChzZXAtPnNlX3JwY3Byb2csIG4pOworCQlpZiAoIXBtYXBfc2V0KHNlcC0+c2VfcnBjcHJvZywgbiwgc2VwLT5zZV9wcm90b19ubywgbnRvaHMoaXJfc2luLnNpbl9wb3J0KSkpCisJCQliYl9wZXJyb3JfbXNnKCIlcyAlczogcG1hcF9zZXQoJXUsJXUsJXUsJXUpIiwKKwkJCQlzZXAtPnNlX3NlcnZpY2UsIHNlcC0+c2VfcHJvdG8sCisJCQkJc2VwLT5zZV9ycGNwcm9nLCBuLCBzZXAtPnNlX3Byb3RvX25vLCBudG9ocyhpcl9zaW4uc2luX3BvcnQpKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHVucmVnaXN0ZXJfcnBjKHNlcnZ0YWJfdCAqc2VwKQoreworCWludCBuOworCisJZm9yIChuID0gc2VwLT5zZV9ycGN2ZXJfbG87IG4gPD0gc2VwLT5zZV9ycGN2ZXJfaGk7IG4rKykgeworCQlpZiAoIXBtYXBfdW5zZXQoc2VwLT5zZV9ycGNwcm9nLCBuKSkKKwkJCWJiX3BlcnJvcl9tc2coInBtYXBfdW5zZXQoJXUsJXUpIiwgc2VwLT5zZV9ycGNwcm9nLCBuKTsKKwl9Cit9CisjZW5kaWYgLyogRkVBVFVSRV9JTkVURF9SUEMgKi8KKworc3RhdGljIHZvaWQgYnVtcF9ub2ZpbGUodm9pZCkKK3sKKwllbnVtIHsgRkRfQ0hVTksgPSAzMiB9OworCXN0cnVjdCBybGltaXQgcmw7CisKKwkvKiBOZXZlciBmYWlscyB1bmRlciBMaW51eCAoZXhjZXB0IGlmIHlvdSBwYXNzIGl0IGJhZCBhcmd1bWVudHMpICovCisJZ2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUsICZybCk7CisJcmwucmxpbV9jdXIgPSBNSU4ocmwucmxpbV9tYXgsIHJsLnJsaW1fY3VyICsgRkRfQ0hVTkspOworCXJsLnJsaW1fY3VyID0gTUlOKEZEX1NFVFNJWkUsIHJsLnJsaW1fY3VyICsgRkRfQ0hVTkspOworCWlmIChybC5ybGltX2N1ciA8PSBybGltX29maWxlX2N1cikgeworCQliYl9lcnJvcl9tc2coImNhbid0IGV4dGVuZCBmaWxlIGxpbWl0LCBtYXggPSAlZCIsCisJCQkJCQkoaW50KSBybC5ybGltX2N1cik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc2V0cmxpbWl0KFJMSU1JVF9OT0ZJTEUsICZybCkgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2coInNldHJsaW1pdCIpOworCQlyZXR1cm47CisJfQorCisJcmxpbV9vZmlsZV9jdXIgPSBybC5ybGltX2N1cjsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2ZkX2Zyb21fc2V0KGludCBmZCkKK3sKKwlpZiAoZmQgPj0gMCkgeworCQlGRF9DTFIoZmQsICZhbGxzb2NrKTsKKwkJZGJnKCJzdG9wcGVkIGxpc3RlbmluZyBvbiBmZDolZFxuIiwgZmQpOworCQltYXhzb2NrID0gLTE7CisJCWRiZygibWF4c29jazolZFxuIiwgbWF4c29jayk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhZGRfZmRfdG9fc2V0KGludCBmZCkKK3sKKwlpZiAoZmQgPj0gMCkgeworCQlGRF9TRVQoZmQsICZhbGxzb2NrKTsKKwkJZGJnKCJzdGFydGVkIGxpc3RlbmluZyBvbiBmZDolZFxuIiwgZmQpOworCQlpZiAobWF4c29jayA+PSAwICYmIGZkID4gbWF4c29jaykgeworCQkJcHJldl9tYXhzb2NrID0gbWF4c29jayA9IGZkOworCQkJZGJnKCJtYXhzb2NrOiVkXG4iLCBtYXhzb2NrKTsKKwkJCWlmICgocmxpbV90KWZkID4gcmxpbV9vZmlsZV9jdXIgLSBGRF9NQVJHSU4pCisJCQkJYnVtcF9ub2ZpbGUoKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgcmVjYWxjdWxhdGVfbWF4c29jayh2b2lkKQoreworCWludCBmZCA9IDA7CisKKwkvKiBXZSBtYXkgaGF2ZSBubyBzZXJ2aWNlcywgaW4gdGhpcyBjYXNlIG1heHNvY2sgc2hvdWxkIHN0aWxsIGJlID49IDAKKwkgKiAoY29kZSBlbHNld2hlcmUgaXMgbm90IGhhcHB5IHdpdGggbWF4c29jayA9PSAtMSkgKi8KKwltYXhzb2NrID0gMDsKKwl3aGlsZSAoZmQgPD0gcHJldl9tYXhzb2NrKSB7CisJCWlmIChGRF9JU1NFVChmZCwgJmFsbHNvY2spKQorCQkJbWF4c29jayA9IGZkOworCQlmZCsrOworCX0KKwlkYmcoInJlY2FsY3VsYXRlZCBtYXhzb2NrOiVkXG4iLCBtYXhzb2NrKTsKKwlwcmV2X21heHNvY2sgPSBtYXhzb2NrOworCWlmICgocmxpbV90KW1heHNvY2sgPiBybGltX29maWxlX2N1ciAtIEZEX01BUkdJTikKKwkJYnVtcF9ub2ZpbGUoKTsKK30KKworc3RhdGljIHZvaWQgcHJlcGFyZV9zb2NrZXRfZmQoc2VydnRhYl90ICpzZXApCit7CisJaW50IHIsIGZkOworCisJZmQgPSBzb2NrZXQoc2VwLT5zZV9mYW1pbHksIHNlcC0+c2Vfc29ja3R5cGUsIDApOworCWlmIChmZCA8IDApIHsKKwkJYmJfcGVycm9yX21zZygic29ja2V0Iik7CisJCXJldHVybjsKKwl9CisJc2V0c29ja29wdF9yZXVzZWFkZHIoZmQpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfUlBDCisJaWYgKGlzX3JwY19zZXJ2aWNlKHNlcCkpIHsKKwkJc3RydWN0IHBhc3N3ZCAqcHdkOworCisJCS8qIHplcm8gb3V0IHRoZSBwb3J0IGZvciBhbGwgUlBDIHNlcnZpY2VzOyBsZXQgYmluZCgpCisJCSAqIGZpbmQgb25lLiAqLworCQlzZXRfbnBvcnQoJnNlcC0+c2VfbHNhLT51LnNhLCAwKTsKKworCQkvKiBmb3IgUlBDIHNlcnZpY2VzLCBhdHRlbXB0IHRvIHVzZSBhIHJlc2VydmVkIHBvcnQKKwkJICogaWYgdGhleSBhcmUgZ29pbmcgdG8gYmUgcnVubmluZyBhcyByb290LiAqLworCQlpZiAocmVhbF91aWQgPT0gMCAmJiBzZXAtPnNlX2ZhbWlseSA9PSBBRl9JTkVUCisJCSAmJiAocHdkID0gZ2V0cHduYW0oc2VwLT5zZV91c2VyKSkgIT0gTlVMTAorCQkgJiYgcHdkLT5wd191aWQgPT0gMAorCQkpIHsKKwkJCXIgPSBiaW5kcmVzdnBvcnQoZmQsICZzZXAtPnNlX2xzYS0+dS5zaW4pOworCQl9IGVsc2UgeworCQkJciA9IGJpbmQoZmQsICZzZXAtPnNlX2xzYS0+dS5zYSwgc2VwLT5zZV9sc2EtPmxlbik7CisJCX0KKwkJaWYgKHIgPT0gMCkgeworCQkJaW50IHNhdmVlcnJubyA9IGVycm5vOworCQkJLyogdXBkYXRlIGxzYSB3aXRoIHBvcnQjICovCisJCQlnZXRzb2NrbmFtZShmZCwgJnNlcC0+c2VfbHNhLT51LnNhLCAmc2VwLT5zZV9sc2EtPmxlbik7CisJCQllcnJubyA9IHNhdmVlcnJubzsKKwkJfQorCX0gZWxzZQorI2VuZGlmCisJeworCQlpZiAoc2VwLT5zZV9mYW1pbHkgPT0gQUZfVU5JWCkgeworCQkJc3RydWN0IHNvY2thZGRyX3VuICpzdW47CisJCQlzdW4gPSAoc3RydWN0IHNvY2thZGRyX3VuKikmKHNlcC0+c2VfbHNhLT51LnNhKTsKKwkJCXVubGluayhzdW4tPnN1bl9wYXRoKTsKKwkJfQorCQlyID0gYmluZChmZCwgJnNlcC0+c2VfbHNhLT51LnNhLCBzZXAtPnNlX2xzYS0+bGVuKTsKKwl9CisJaWYgKHIgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2coIiVzLyVzOiBiaW5kIiwKKwkJCQlzZXAtPnNlX3NlcnZpY2UsIHNlcC0+c2VfcHJvdG8pOworCQljbG9zZShmZCk7CisJCXJlYXJtX2FsYXJtKCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoc2VwLT5zZV9zb2NrdHlwZSA9PSBTT0NLX1NUUkVBTSkgeworCQlsaXN0ZW4oZmQsIGdsb2JhbF9xdWV1ZWxlbik7CisJCWRiZygibmV3IHNlcC0+c2VfZmQ6JWQgKHN0cmVhbSlcbiIsIGZkKTsKKwl9IGVsc2UgeworCQlkYmcoIm5ldyBzZXAtPnNlX2ZkOiVkICghc3RyZWFtKVxuIiwgZmQpOworCX0KKworCWFkZF9mZF90b19zZXQoZmQpOworCXNlcC0+c2VfZmQgPSBmZDsKK30KKworc3RhdGljIGludCByZW9wZW5fY29uZmlnX2ZpbGUodm9pZCkKK3sKKwlmcmVlKGRlZmF1bHRfbG9jYWxfaG9zdG5hbWUpOworCWRlZmF1bHRfbG9jYWxfaG9zdG5hbWUgPSB4c3RyZHVwKCIqIik7CisJaWYgKHBhcnNlciAhPSBOVUxMKQorCQljb25maWdfY2xvc2UocGFyc2VyKTsKKwlwYXJzZXIgPSBjb25maWdfb3Blbihjb25maWdfZmlsZW5hbWUpOworCXJldHVybiAocGFyc2VyICE9IE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBjbG9zZV9jb25maWdfZmlsZSh2b2lkKQoreworCWlmIChwYXJzZXIpIHsKKwkJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisJCXBhcnNlciA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBmcmVlX3NlcnZ0YWJfc3RyaW5ncyhzZXJ2dGFiX3QgKmNwKQoreworCWludCBpOworCisJZnJlZShjcC0+c2VfbG9jYWxfaG9zdG5hbWUpOworCWZyZWUoY3AtPnNlX3NlcnZpY2UpOworCWZyZWUoY3AtPnNlX3Byb3RvKTsKKwlmcmVlKGNwLT5zZV91c2VyKTsKKwlmcmVlKGNwLT5zZV9ncm91cCk7CisJZnJlZShjcC0+c2VfbHNhKTsgLyogbm90IGEgc3RyaW5nIGluIGZhY3QgKi8KKwlmcmVlKGNwLT5zZV9wcm9ncmFtKTsKKwlmb3IgKGkgPSAwOyBpIDwgTUFYQVJHVjsgaSsrKQorCQlmcmVlKGNwLT5zZV9hcmd2W2ldKTsKK30KKworc3RhdGljIHNlcnZ0YWJfdCAqbmV3X3NlcnZ0YWIodm9pZCkKK3sKKwlzZXJ2dGFiX3QgKm5ld3RhYiA9IHh6YWxsb2Moc2l6ZW9mKHNlcnZ0YWJfdCkpOworCW5ld3RhYi0+c2VfZmQgPSAtMTsgLyogcGFyYW5vaWEgKi8KKwlyZXR1cm4gbmV3dGFiOworfQorCitzdGF0aWMgc2VydnRhYl90ICpkdXBfc2VydnRhYihzZXJ2dGFiX3QgKnNlcCkKK3sKKwlzZXJ2dGFiX3QgKm5ld3RhYjsKKwlpbnQgYXJnYzsKKworCW5ld3RhYiA9IG5ld19zZXJ2dGFiKCk7CisJKm5ld3RhYiA9ICpzZXA7IC8qIHN0cnVjdCBjb3B5ICovCisJLyogZGVlcC1jb3B5aW5nIHN0cmluZ3MgKi8KKwluZXd0YWItPnNlX3NlcnZpY2UgPSB4c3RyZHVwKG5ld3RhYi0+c2Vfc2VydmljZSk7CisJbmV3dGFiLT5zZV9wcm90byA9IHhzdHJkdXAobmV3dGFiLT5zZV9wcm90byk7CisJbmV3dGFiLT5zZV91c2VyID0geHN0cmR1cChuZXd0YWItPnNlX3VzZXIpOworCW5ld3RhYi0+c2VfZ3JvdXAgPSB4c3RyZHVwKG5ld3RhYi0+c2VfZ3JvdXApOworCW5ld3RhYi0+c2VfcHJvZ3JhbSA9IHhzdHJkdXAobmV3dGFiLT5zZV9wcm9ncmFtKTsKKwlmb3IgKGFyZ2MgPSAwOyBhcmdjIDw9IE1BWEFSR1Y7IGFyZ2MrKykKKwkJbmV3dGFiLT5zZV9hcmd2W2FyZ2NdID0geHN0cmR1cChuZXd0YWItPnNlX2FyZ3ZbYXJnY10pOworCS8qIE5COiBzZV9mZCwgc2VfaG9zdGFkZHIgYW5kIHNlX25leHQgYXJlIGFsd2F5cworCSAqIG92ZXJ3cml0dGVuZCBieSBjYWxsZXJzLCBzbyB3ZSBkb24ndCBib3RoZXIgcmVzZXR0aW5nIHRoZW0KKwkgKiB0byBOVUxMLzAvLTEgZXRjICovCisKKwlyZXR1cm4gbmV3dGFiOworfQorCisvKiBnY2MgZ2VuZXJhdGVzIG11Y2ggbW9yZSBjb2RlIGlmIHRoaXMgaXMgaW5saW5lZCAqLworc3RhdGljIE5PSU5MSU5FIHNlcnZ0YWJfdCAqcGFyc2Vfb25lX2xpbmUodm9pZCkKK3sKKwlpbnQgYXJnYzsKKwljaGFyICp0b2tlbls2K01BWEFSR1ZdOworCWNoYXIgKnAsICphcmc7CisJY2hhciAqaG9zdGRlbGltOworCXNlcnZ0YWJfdCAqc2VwOworCXNlcnZ0YWJfdCAqbnNlcDsKKyBuZXc6CisJc2VwID0gbmV3X3NlcnZ0YWIoKTsKKyBtb3JlOgorCWFyZ2MgPSBjb25maWdfcmVhZChwYXJzZXIsIHRva2VuLCA2K01BWEFSR1YsIDEsICIjIFx0IiwgUEFSU0VfTk9STUFMKTsKKwlpZiAoIWFyZ2MpIHsKKwkJZnJlZShzZXApOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBbaG9zdDpdc2VydmljZSBzb2NrdHlwZSBwcm90byB3YWl0IHVzZXJbOmdyb3VwXSBwcm9nIFthcmdzXSAqLworCS8qIENoZWNrIGZvciAiaG9zdDouLi4uIiBsaW5lICovCisJYXJnID0gdG9rZW5bMF07CisJaG9zdGRlbGltID0gc3RycmNocihhcmcsICc6Jyk7CisJaWYgKGhvc3RkZWxpbSkgeworCQkqaG9zdGRlbGltID0gJ1wwJzsKKwkJc2VwLT5zZV9sb2NhbF9ob3N0bmFtZSA9IHhzdHJkdXAoYXJnKTsKKwkJYXJnID0gaG9zdGRlbGltICsgMTsKKwkJaWYgKCphcmcgPT0gJ1wwJyAmJiBhcmdjID09IDEpIHsKKwkJCS8qIExpbmUgaGFzIGp1c3QgImhvc3Q6IiwgY2hhbmdlIHRoZQorCQkJICogZGVmYXVsdCBob3N0IGZvciB0aGUgZm9sbG93aW5nIGxpbmVzLiAqLworCQkJZnJlZShkZWZhdWx0X2xvY2FsX2hvc3RuYW1lKTsKKwkJCWRlZmF1bHRfbG9jYWxfaG9zdG5hbWUgPSBzZXAtPnNlX2xvY2FsX2hvc3RuYW1lOworCQkJLypzZXAtPnNlX2xvY2FsX2hvc3RuYW1lID0gTlVMTDsgLSByZWR1bmRhbnQgKi8KKwkJCS8qICh3ZSdsbCBvdmVyd3JpdGUgdGhpcyBmaWVsZCBhbnl3YXkpICovCisJCQlnb3RvIG1vcmU7CisJCX0KKwl9IGVsc2UKKwkJc2VwLT5zZV9sb2NhbF9ob3N0bmFtZSA9IHhzdHJkdXAoZGVmYXVsdF9sb2NhbF9ob3N0bmFtZSk7CisKKwkvKiBzZXJ2aWNlIHNvY2t0eXBlIHByb3RvIHdhaXQgdXNlcls6Z3JvdXBdIHByb2cgW2FyZ3NdICovCisJc2VwLT5zZV9zZXJ2aWNlID0geHN0cmR1cChhcmcpOworCisJLyogc29ja3R5cGUgcHJvdG8gd2FpdCB1c2VyWzpncm91cF0gcHJvZyBbYXJnc10gKi8KKwlpZiAoYXJnYyA8IDYpIHsKKyBwYXJzZV9lcnI6CisJCWJiX2Vycm9yX21zZygicGFyc2UgZXJyb3Igb24gbGluZSAldSwgbGluZSBpcyBpZ25vcmVkIiwKKwkJCQlwYXJzZXItPmxpbmVubyk7CisJCS8qIEp1c3QgImdvdG8gbW9yZSIgY2FuIG1ha2Ugc2VwIHRvIGNhcnJ5IG92ZXIgZS5nLgorCQkgKiAicnBjIi1uZXNzIChieSBoYXZpbmcgc2VfcnBjdmVyX2xvICE9IDApLgorCQkgKiBXZSB3aWxsIGJlIG1vcmUgcGFyYW5vaWQ6ICovCisJCWZyZWVfc2VydnRhYl9zdHJpbmdzKHNlcCk7CisJCWZyZWUoc2VwKTsKKwkJZ290byBuZXc7CisJfQorCisJeworCQlzdGF0aWMgY29uc3QgaW50OF90IFNPQ0tfeHh4W10gQUxJR04xID0geworCQkJLTEsCisJCQlTT0NLX1NUUkVBTSwgU09DS19ER1JBTSwgU09DS19SRE0sCisJCQlTT0NLX1NFUVBBQ0tFVCwgU09DS19SQVcKKwkJfTsKKwkJc2VwLT5zZV9zb2NrdHlwZSA9IFNPQ0tfeHh4WzEgKyBpbmRleF9pbl9zdHJpbmdzKAorCQkJInN0cmVhbSIiXDAiICJkZ3JhbSIiXDAiICJyZG0iIlwwIgorCQkJInNlcXBhY2tldCIiXDAiICJyYXciIlwwIgorCQkJLCB0b2tlblsxXSldOworCX0KKworCS8qIHt1bml4LFtycGMvXXt0Y3AsdWRwfVs2XX0gd2FpdCB1c2VyWzpncm91cF0gcHJvZyBbYXJnc10gKi8KKwlzZXAtPnNlX3Byb3RvID0gYXJnID0geHN0cmR1cCh0b2tlblsyXSk7CisJaWYgKHN0cmNtcChhcmcsICJ1bml4IikgPT0gMCkgeworCQlzZXAtPnNlX2ZhbWlseSA9IEFGX1VOSVg7CisJfSBlbHNlIHsKKwkJY2hhciAqc2l4OworCQlzZXAtPnNlX2ZhbWlseSA9IEFGX0lORVQ7CisJCXNpeCA9IGxhc3RfY2hhcl9pcyhhcmcsICc2Jyk7CisJCWlmIChzaXgpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJCQkqc2l4ID0gJ1wwJzsKKwkJCXNlcC0+c2VfZmFtaWx5ID0gQUZfSU5FVDY7CisjZWxzZQorCQkJYmJfZXJyb3JfbXNnKCIlczogbm8gc3VwcG9ydCBmb3IgSVB2NiIsIHNlcC0+c2VfcHJvdG8pOworCQkJZ290byBwYXJzZV9lcnI7CisjZW5kaWYKKwkJfQorCQlpZiAoaXNfcHJlZml4ZWRfd2l0aChhcmcsICJycGMvIikpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9SUEMKKwkJCXVuc2lnbmVkIG47CisJCQlhcmcgKz0gNDsKKwkJCXAgPSBzdHJjaHIoc2VwLT5zZV9zZXJ2aWNlLCAnLycpOworCQkJaWYgKHAgPT0gTlVMTCkgeworCQkJCWJiX2Vycm9yX21zZygibm8gcnBjIHZlcnNpb246ICclcyciLCBzZXAtPnNlX3NlcnZpY2UpOworCQkJCWdvdG8gcGFyc2VfZXJyOworCQkJfQorCQkJKnArKyA9ICdcMCc7CisJCQluID0gYmJfc3RydG91KHAsICZwLCAxMCk7CisJCQlpZiAobiA+IElOVF9NQVgpIHsKKyBiYWRfdmVyX3NwZWM6CisJCQkJYmJfZXJyb3JfbXNnKCJiYWQgcnBjIHZlcnNpb24iKTsKKwkJCQlnb3RvIHBhcnNlX2VycjsKKwkJCX0KKwkJCXNlcC0+c2VfcnBjdmVyX2xvID0gc2VwLT5zZV9ycGN2ZXJfaGkgPSBuOworCQkJaWYgKCpwID09ICctJykgeworCQkJCXArKzsKKwkJCQluID0gYmJfc3RydG91KHAsICZwLCAxMCk7CisJCQkJaWYgKG4gPiBJTlRfTUFYIHx8IChpbnQpbiA8IHNlcC0+c2VfcnBjdmVyX2xvKQorCQkJCQlnb3RvIGJhZF92ZXJfc3BlYzsKKwkJCQlzZXAtPnNlX3JwY3Zlcl9oaSA9IG47CisJCQl9CisJCQlpZiAoKnAgIT0gJ1wwJykKKwkJCQlnb3RvIGJhZF92ZXJfc3BlYzsKKyNlbHNlCisJCQliYl9lcnJvcl9tc2coIm5vIHN1cHBvcnQgZm9yIHJwYyBzZXJ2aWNlcyIpOworCQkJZ290byBwYXJzZV9lcnI7CisjZW5kaWYKKwkJfQorCQkvKiB3ZSBkb24ndCByZWFsbHkgbmVlZCBnZXRwcm90b2J5bmFtZSgpISAqLworCQlpZiAoc3RyY21wKGFyZywgInRjcCIpID09IDApCisJCQlzZXAtPnNlX3Byb3RvX25vID0gSVBQUk9UT19UQ1A7IC8qID0gNiAqLworCQlpZiAoc3RyY21wKGFyZywgInVkcCIpID09IDApCisJCQlzZXAtPnNlX3Byb3RvX25vID0gSVBQUk9UT19VRFA7IC8qID0gMTcgKi8KKwkJaWYgKHNpeCkKKwkJCSpzaXggPSAnNic7CisJCWlmICghc2VwLT5zZV9wcm90b19ubykgLyogbm90IHRjcC91ZHA/PyAqLworCQkJZ290byBwYXJzZV9lcnI7CisJfQorCisJLyogW25vXXdhaXRbLm1heF0gdXNlcls6Z3JvdXBdIHByb2cgW2FyZ3NdICovCisJYXJnID0gdG9rZW5bM107CisJc2VwLT5zZV9tYXggPSBtYXhfY29uY3VycmVuY3k7CisJcCA9IHN0cmNocihhcmcsICcuJyk7CisJaWYgKHApIHsKKwkJKnArKyA9ICdcMCc7CisJCXNlcC0+c2VfbWF4ID0gYmJfc3RydG91KHAsIE5VTEwsIDEwKTsKKwkJaWYgKGVycm5vKQorCQkJZ290byBwYXJzZV9lcnI7CisJfQorCXNlcC0+c2Vfd2FpdCA9IChhcmdbMF0gIT0gJ24nIHx8IGFyZ1sxXSAhPSAnbycpOworCWlmICghc2VwLT5zZV93YWl0KSAvKiAibm8iIHNlZW4gKi8KKwkJYXJnICs9IDI7CisJaWYgKHN0cmNtcChhcmcsICJ3YWl0IikgIT0gMCkKKwkJZ290byBwYXJzZV9lcnI7CisKKwkvKiB1c2VyWzpncm91cF0gcHJvZyBbYXJnc10gKi8KKwlzZXAtPnNlX3VzZXIgPSB4c3RyZHVwKHRva2VuWzRdKTsKKwlhcmcgPSBzdHJjaHIoc2VwLT5zZV91c2VyLCAnLicpOworCWlmIChhcmcgPT0gTlVMTCkKKwkJYXJnID0gc3RyY2hyKHNlcC0+c2VfdXNlciwgJzonKTsKKwlpZiAoYXJnKSB7CisJCSphcmcrKyA9ICdcMCc7CisJCXNlcC0+c2VfZ3JvdXAgPSB4c3RyZHVwKGFyZyk7CisJfQorCisJLyogcHJvZyBbYXJnc10gKi8KKwlzZXAtPnNlX3Byb2dyYW0gPSB4c3RyZHVwKHRva2VuWzVdKTsKKyNpZmRlZiBJTkVURF9CVUlMVElOU19FTkFCTEVECisJaWYgKHN0cmNtcChzZXAtPnNlX3Byb2dyYW0sICJpbnRlcm5hbCIpID09IDAKKwkgJiYgc3RybGVuKHNlcC0+c2Vfc2VydmljZSkgPD0gNworCSAmJiAoc2VwLT5zZV9zb2NrdHlwZSA9PSBTT0NLX1NUUkVBTQorCSAgICAgfHwgc2VwLT5zZV9zb2NrdHlwZSA9PSBTT0NLX0RHUkFNKQorCSkgeworCQl1bnNpZ25lZCBpOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidWlsdGlucyk7IGkrKykKKwkJCWlmIChzdHJuY21wKGJ1aWx0aW5zW2ldLmJpX3NlcnZpY2U3LCBzZXAtPnNlX3NlcnZpY2UsIDcpID09IDApCisJCQkJZ290byBmb3VuZF9iaTsKKwkJYmJfZXJyb3JfbXNnKCJ1bmtub3duIGludGVybmFsIHNlcnZpY2UgJXMiLCBzZXAtPnNlX3NlcnZpY2UpOworCQlnb3RvIHBhcnNlX2VycjsKKyBmb3VuZF9iaToKKwkJc2VwLT5zZV9idWlsdGluID0gJmJ1aWx0aW5zW2ldOworCQkvKiBzdHJlYW0gYnVpbHRpbnMgbXVzdCBiZSAibm93YWl0IiwgZGdyYW0gbXVzdCBiZSAid2FpdCIgKi8KKwkJaWYgKHNlcC0+c2Vfd2FpdCAhPSAoc2VwLT5zZV9zb2NrdHlwZSA9PSBTT0NLX0RHUkFNKSkKKwkJCWdvdG8gcGFyc2VfZXJyOworCX0KKyNlbmRpZgorCWFyZ2MgPSAwOworCXdoaWxlIChhcmdjIDwgTUFYQVJHViAmJiAoYXJnID0gdG9rZW5bNithcmdjXSkgIT0gTlVMTCkKKwkJc2VwLT5zZV9hcmd2W2FyZ2MrK10gPSB4c3RyZHVwKGFyZyk7CisJLyogU29tZSBpbmV0ZC5jb25mIGZpbGVzIGhhdmUgbm8gYXJndidzLCBub3QgZXZlbiBhcmd2WzBdLgorCSAqIEZpeCB0aGVtIHVwLgorCSAqIChUZWNobmljYWxseSwgcHJvZ3JhbXMgY2FuIGJlIGV4ZWNlZCB3aXRoIGFyZ3ZbMF0gPSBOVUxMLAorCSAqIGJ1dCBtYW55IHByb2dyYW1zIGRvIG5vdCBsaWtlIHRoYXQgYXQgYWxsKSAqLworCWlmIChhcmdjID09IDApCisJCXNlcC0+c2VfYXJndlswXSA9IHhzdHJkdXAoc2VwLT5zZV9wcm9ncmFtKTsKKworCS8qIGNhdGNoIG1peHVwcy4gIjxzZXJ2aWNlPiBzdHJlYW0gdWRwIC4uLiIgPT0gd3RmICovCisJaWYgKHNlcC0+c2Vfc29ja3R5cGUgPT0gU09DS19TVFJFQU0pIHsKKwkJaWYgKHNlcC0+c2VfcHJvdG9fbm8gPT0gSVBQUk9UT19VRFApCisJCQlnb3RvIHBhcnNlX2VycjsKKwl9CisJaWYgKHNlcC0+c2Vfc29ja3R5cGUgPT0gU09DS19ER1JBTSkgeworCQlpZiAoc2VwLT5zZV9wcm90b19ubyA9PSBJUFBST1RPX1RDUCkKKwkJCWdvdG8gcGFyc2VfZXJyOworCX0KKworLy8JYmJfaW5mb19tc2coCisvLwkJIkVOVFJZWyVzXVslc11bJXNdWyVkXVslZF1bJWRdWyVkXVslZF1bJXNdWyVzXVslc10iLAorLy8JCXNlcC0+c2VfbG9jYWxfaG9zdG5hbWUsIHNlcC0+c2Vfc2VydmljZSwgc2VwLT5zZV9wcm90bywgc2VwLT5zZV93YWl0LCBzZXAtPnNlX3Byb3RvX25vLAorLy8JCXNlcC0+c2VfbWF4LCBzZXAtPnNlX2NvdW50LCBzZXAtPnNlX3RpbWUsIHNlcC0+c2VfdXNlciwgc2VwLT5zZV9ncm91cCwgc2VwLT5zZV9wcm9ncmFtKTsKKworCS8qIGNoZWNrIGlmIHRoZSBob3N0bmFtZSBzcGVjaWZpZXIgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdAorCSAqIG9mIGhvc3RuYW1lcy4gd2UnbGwgbWFrZSBuZXcgZW50cmllcyBmb3IgZWFjaCBhZGRyZXNzLiAqLworCXdoaWxlICgoaG9zdGRlbGltID0gc3RycmNocihzZXAtPnNlX2xvY2FsX2hvc3RuYW1lLCAnLCcpKSAhPSBOVUxMKSB7CisJCW5zZXAgPSBkdXBfc2VydnRhYihzZXApOworCQkvKiBOVUwgdGVybWluYXRlIHRoZSBob3N0bmFtZSBmaWVsZCBvZiB0aGUgZXhpc3RpbmcgZW50cnksCisJCSAqIGFuZCBtYWtlIGEgZHVwIGZvciB0aGUgbmV3IGVudHJ5LiAqLworCQkqaG9zdGRlbGltKysgPSAnXDAnOworCQluc2VwLT5zZV9sb2NhbF9ob3N0bmFtZSA9IHhzdHJkdXAoaG9zdGRlbGltKTsKKwkJbnNlcC0+c2VfbmV4dCA9IHNlcC0+c2VfbmV4dDsKKwkJc2VwLT5zZV9uZXh0ID0gbnNlcDsKKwl9CisKKwkvKiB3YXMgZG9pbmcgaXQgaGVyZTogKi8KKwkvKiBETlMgcmVzb2x1dGlvbiwgY3JlYXRlIGNvcGllcyBmb3IgZWFjaCBJUCBhZGRyZXNzICovCisJLyogSVB2Ni1pemF0aW9uIGRlc3Ryb3llZCBpdCA6KCAqLworCisJcmV0dXJuIHNlcDsKK30KKworc3RhdGljIHNlcnZ0YWJfdCAqaW5zZXJ0X2luX3NlcnZsaXN0KHNlcnZ0YWJfdCAqY3ApCit7CisJc2VydnRhYl90ICpzZXA7CisJc2lnc2V0X3Qgb21hc2s7CisKKwlzZXAgPSBuZXdfc2VydnRhYigpOworCSpzZXAgPSAqY3A7IC8qIHN0cnVjdCBjb3B5ICovCisJc2VwLT5zZV9mZCA9IC0xOworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1JQQworCXNlcC0+c2VfcnBjcHJvZyA9IC0xOworI2VuZGlmCisJYmxvY2tfQ0hMRF9IVVBfQUxSTSgmb21hc2spOworCXNlcC0+c2VfbmV4dCA9IHNlcnZfbGlzdDsKKwlzZXJ2X2xpc3QgPSBzZXA7CisJcmVzdG9yZV9zaWdtYXNrKCZvbWFzayk7CisJcmV0dXJuIHNlcDsKK30KKworc3RhdGljIGludCBzYW1lX3NlcnZfYWRkcl9wcm90byhzZXJ2dGFiX3QgKm9sZCwgc2VydnRhYl90ICpuZXcpCit7CisJaWYgKHN0cmNtcChvbGQtPnNlX2xvY2FsX2hvc3RuYW1lLCBuZXctPnNlX2xvY2FsX2hvc3RuYW1lKSAhPSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoc3RyY21wKG9sZC0+c2Vfc2VydmljZSwgbmV3LT5zZV9zZXJ2aWNlKSAhPSAwKQorCQlyZXR1cm4gMDsKKwlpZiAoc3RyY21wKG9sZC0+c2VfcHJvdG8sIG5ldy0+c2VfcHJvdG8pICE9IDApCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCByZXJlYWRfY29uZmlnX2ZpbGUoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJc2VydnRhYl90ICpzZXAsICpjcCwgKipzZXBwOworCWxlbl9hbmRfc29ja2FkZHIgKmxzYTsKKwlzaWdzZXRfdCBvbWFzazsKKwl1bnNpZ25lZCBuOworCXVpbnQxNl90IHBvcnQ7CisJaW50IHNhdmVfZXJybm8gPSBlcnJubzsKKworCWlmICghcmVvcGVuX2NvbmZpZ19maWxlKCkpCisJCWdvdG8gcmV0OworCWZvciAoc2VwID0gc2Vydl9saXN0OyBzZXA7IHNlcCA9IHNlcC0+c2VfbmV4dCkKKwkJc2VwLT5zZV9jaGVja2VkID0gMDsKKworCWdvdG8gZmlyc3RfbGluZTsKKwl3aGlsZSAoMSkgeworCQlpZiAoY3AgPT0gTlVMTCkgeworIGZpcnN0X2xpbmU6CisJCQljcCA9IHBhcnNlX29uZV9saW5lKCk7CisJCQlpZiAoY3AgPT0gTlVMTCkKKwkJCQlicmVhazsKKwkJfQorCQlmb3IgKHNlcCA9IHNlcnZfbGlzdDsgc2VwOyBzZXAgPSBzZXAtPnNlX25leHQpCisJCQlpZiAoc2FtZV9zZXJ2X2FkZHJfcHJvdG8oc2VwLCBjcCkpCisJCQkJZ290byBlcXVhbF9zZXJ2dGFiOworCQkvKiBub3QgYW4gImVxdWFsIiBzZXJ2dGFiICovCisJCXNlcCA9IGluc2VydF9pbl9zZXJ2bGlzdChjcCk7CisJCWdvdG8gYWZ0ZXJfY2hlY2s7CisgZXF1YWxfc2VydnRhYjoKKwkJeworCQkJaW50IGk7CisKKwkJCWJsb2NrX0NITERfSFVQX0FMUk0oJm9tYXNrKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9SUEMKKwkJCWlmIChpc19ycGNfc2VydmljZShzZXApKQorCQkJCXVucmVnaXN0ZXJfcnBjKHNlcCk7CisJCQlzZXAtPnNlX3JwY3Zlcl9sbyA9IGNwLT5zZV9ycGN2ZXJfbG87CisJCQlzZXAtPnNlX3JwY3Zlcl9oaSA9IGNwLT5zZV9ycGN2ZXJfaGk7CisjZW5kaWYKKwkJCWlmIChjcC0+c2Vfd2FpdCA9PSAwKSB7CisJCQkJLyogTmV3IGNvbmZpZyBzYXlzICJub3dhaXQiLiBJZiBvbGQgb25lCisJCQkJICogd2FzICJ3YWl0Iiwgd2UgY3VycmVudGx5IG1heSBiZSB3YWl0aW5nCisJCQkJICogZm9yIGEgY2hpbGQgKGFuZCBub3QgYWNjZXB0aW5nIGNvbm5lY3RzKS4KKwkJCQkgKiBTdG9wIHdhaXRpbmcsIHN0YXJ0IGxpc3RlbmluZyBhZ2Fpbi4KKwkJCQkgKiAoaWYgaXQncyBub3QgdHJ1ZSwgdGhpcyBvcCBpcyBoYXJtbGVzcykgKi8KKwkJCQlhZGRfZmRfdG9fc2V0KHNlcC0+c2VfZmQpOworCQkJfQorCQkJc2VwLT5zZV93YWl0ID0gY3AtPnNlX3dhaXQ7CisJCQlzZXAtPnNlX21heCA9IGNwLT5zZV9tYXg7CisJCQkvKiBzdHJpbmcgZmllbGRzIG5lZWQgbW9yZSBsb3ZlIC0gd2UgZG9uJ3Qgd2FudCB0byBsZWFrIHRoZW0gKi8KKyNkZWZpbmUgU1dBUCh0eXBlLCBhLCBiKSBkbyB7IHR5cGUgYyA9ICh0eXBlKWE7IGEgPSAodHlwZSliOyBiID0gKHR5cGUpYzsgfSB3aGlsZSAoMCkKKwkJCVNXQVAoY2hhciosIHNlcC0+c2VfdXNlciwgY3AtPnNlX3VzZXIpOworCQkJU1dBUChjaGFyKiwgc2VwLT5zZV9ncm91cCwgY3AtPnNlX2dyb3VwKTsKKwkJCVNXQVAoY2hhciosIHNlcC0+c2VfcHJvZ3JhbSwgY3AtPnNlX3Byb2dyYW0pOworCQkJZm9yIChpID0gMDsgaSA8IE1BWEFSR1Y7IGkrKykKKwkJCQlTV0FQKGNoYXIqLCBzZXAtPnNlX2FyZ3ZbaV0sIGNwLT5zZV9hcmd2W2ldKTsKKyN1bmRlZiBTV0FQCisJCQlyZXN0b3JlX3NpZ21hc2soJm9tYXNrKTsKKwkJCWZyZWVfc2VydnRhYl9zdHJpbmdzKGNwKTsKKwkJfQorIGFmdGVyX2NoZWNrOgorCQkvKiBjcC0+c3RyaW5nX2ZpZWxkcyBhcmUgY29uc3VtZWQgYnkgaW5zZXJ0X2luX3NlcnZsaXN0KCkKKwkJICogb3IgZnJlZWQgYXQgdGhpcyBwb2ludCwgY3AgaXRzZWxmIGlzIG5vdCB5ZXQgZnJlZWQuICovCisJCXNlcC0+c2VfY2hlY2tlZCA9IDE7CisKKwkJLyogY3JlYXRlIG5ldyBsZW5fYW5kX3NvY2thZGRyICovCisJCXN3aXRjaCAoc2VwLT5zZV9mYW1pbHkpIHsKKwkJCXN0cnVjdCBzb2NrYWRkcl91biAqc3VuOworCQljYXNlIEFGX1VOSVg6CisJCQlsc2EgPSB4emFsbG9jX2xzYShBRl9VTklYKTsKKwkJCXN1biA9IChzdHJ1Y3Qgc29ja2FkZHJfdW4qKSZsc2EtPnUuc2E7CisJCQlzYWZlX3N0cm5jcHkoc3VuLT5zdW5fcGF0aCwgc2VwLT5zZV9zZXJ2aWNlLCBzaXplb2Yoc3VuLT5zdW5fcGF0aCkpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDogLyogY2FzZSBBRl9JTkVULCBjYXNlIEFGX0lORVQ2ICovCisJCQluID0gYmJfc3RydG91KHNlcC0+c2Vfc2VydmljZSwgTlVMTCwgMTApOworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1JQQworCQkJaWYgKGlzX3JwY19zZXJ2aWNlKHNlcCkpIHsKKwkJCQlzZXAtPnNlX3JwY3Byb2cgPSBuOworCQkJCWlmIChlcnJubykgeyAvKiBzZV9zZXJ2aWNlIGlzIG5vdCBudW1lcmljICovCisJCQkJCXN0cnVjdCBycGNlbnQgKnJwID0gZ2V0cnBjYnluYW1lKHNlcC0+c2Vfc2VydmljZSk7CisJCQkJCWlmIChycCA9PSBOVUxMKSB7CisJCQkJCQliYl9lcnJvcl9tc2coIiVzOiB1bmtub3duIHJwYyBzZXJ2aWNlIiwgc2VwLT5zZV9zZXJ2aWNlKTsKKwkJCQkJCWdvdG8gbmV4dF9jcDsKKwkJCQkJfQorCQkJCQlzZXAtPnNlX3JwY3Byb2cgPSBycC0+cl9udW1iZXI7CisJCQkJfQorCQkJCWlmIChzZXAtPnNlX2ZkID09IC0xKQorCQkJCQlwcmVwYXJlX3NvY2tldF9mZChzZXApOworCQkJCWlmIChzZXAtPnNlX2ZkICE9IC0xKQorCQkJCQlyZWdpc3Rlcl9ycGMoc2VwKTsKKwkJCQlnb3RvIG5leHRfY3A7CisJCQl9CisjZW5kaWYKKwkJCS8qIHdoYXQgcG9ydCB0byBsaXN0ZW4gb24/ICovCisJCQlwb3J0ID0gaHRvbnMobik7CisJCQlpZiAoZXJybm8gfHwgbiA+IDB4ZmZmZikgeyAvKiBzZV9zZXJ2aWNlIGlzIG5vdCBudW1lcmljICovCisJCQkJY2hhciBwcm90b25hbWVbNF07CisJCQkJc3RydWN0IHNlcnZlbnQgKnNwOworCQkJCS8qIGNhbiByZXN1bHQgb25seSBpbiAidGNwIiBvciAidWRwIjogKi8KKwkJCQlzYWZlX3N0cm5jcHkocHJvdG9uYW1lLCBzZXAtPnNlX3Byb3RvLCA0KTsKKwkJCQlzcCA9IGdldHNlcnZieW5hbWUoc2VwLT5zZV9zZXJ2aWNlLCBwcm90b25hbWUpOworCQkJCWlmIChzcCA9PSBOVUxMKSB7CisJCQkJCWJiX2Vycm9yX21zZygiJXMvJXM6IHVua25vd24gc2VydmljZSIsCisJCQkJCQkJc2VwLT5zZV9zZXJ2aWNlLCBzZXAtPnNlX3Byb3RvKTsKKwkJCQkJZ290byBuZXh0X2NwOworCQkJCX0KKwkJCQlwb3J0ID0gc3AtPnNfcG9ydDsKKwkJCX0KKwkJCWlmIChMT05FX0NIQVIoc2VwLT5zZV9sb2NhbF9ob3N0bmFtZSwgJyonKSkgeworCQkJCWxzYSA9IHh6YWxsb2NfbHNhKHNlcC0+c2VfZmFtaWx5KTsKKwkJCQlzZXRfbnBvcnQoJmxzYS0+dS5zYSwgcG9ydCk7CisJCQl9IGVsc2UgeworCQkJCWxzYSA9IGhvc3RfYW5kX2FmMnNvY2thZGRyKHNlcC0+c2VfbG9jYWxfaG9zdG5hbWUsCisJCQkJCQludG9ocyhwb3J0KSwgc2VwLT5zZV9mYW1pbHkpOworCQkJCWlmICghbHNhKSB7CisJCQkJCWJiX2Vycm9yX21zZygiJXMvJXM6IHVua25vd24gaG9zdCAnJXMnIiwKKwkJCQkJCXNlcC0+c2Vfc2VydmljZSwgc2VwLT5zZV9wcm90bywKKwkJCQkJCXNlcC0+c2VfbG9jYWxfaG9zdG5hbWUpOworCQkJCQlnb3RvIG5leHRfY3A7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCX0gLyogZW5kIG9mICJzd2l0Y2ggKHNlcC0+c2VfZmFtaWx5KSIgKi8KKworCQkvKiBkaWQgbHNhIGNoYW5nZT8gVGhlbiBjbG9zZS9vcGVuICovCisJCWlmIChzZXAtPnNlX2xzYSA9PSBOVUxMCisJCSB8fCBsc2EtPmxlbiAhPSBzZXAtPnNlX2xzYS0+bGVuCisJCSB8fCBtZW1jbXAoJmxzYS0+dS5zYSwgJnNlcC0+c2VfbHNhLT51LnNhLCBsc2EtPmxlbikgIT0gMAorCQkpIHsKKwkJCXJlbW92ZV9mZF9mcm9tX3NldChzZXAtPnNlX2ZkKTsKKwkJCW1heWJlX2Nsb3NlKHNlcC0+c2VfZmQpOworCQkJZnJlZShzZXAtPnNlX2xzYSk7CisJCQlzZXAtPnNlX2xzYSA9IGxzYTsKKwkJCXNlcC0+c2VfZmQgPSAtMTsKKwkJfSBlbHNlIHsKKwkJCWZyZWUobHNhKTsKKwkJfQorCQlpZiAoc2VwLT5zZV9mZCA9PSAtMSkKKwkJCXByZXBhcmVfc29ja2V0X2ZkKHNlcCk7CisgbmV4dF9jcDoKKwkJc2VwID0gY3AtPnNlX25leHQ7CisJCWZyZWUoY3ApOworCQljcCA9IHNlcDsKKwl9IC8qIGVuZCBvZiAid2hpbGUgKDEpIHBhcnNlIGxpbmVzIiAqLworCWNsb3NlX2NvbmZpZ19maWxlKCk7CisKKwkvKiBQdXJnZSBhbnl0aGluZyBub3QgbG9va2VkIGF0IGFib3ZlIC0gdGhlc2UgYXJlIHN0YWxlIGVudHJpZXMsCisJICogbmV3IGNvbmZpZyBmaWxlIGRvZXNudCBoYXZlIHRoZW0uICovCisJYmxvY2tfQ0hMRF9IVVBfQUxSTSgmb21hc2spOworCXNlcHAgPSAmc2Vydl9saXN0OworCXdoaWxlICgoc2VwID0gKnNlcHApICE9IE5VTEwpIHsKKwkJaWYgKHNlcC0+c2VfY2hlY2tlZCkgeworCQkJc2VwcCA9ICZzZXAtPnNlX25leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQkqc2VwcCA9IHNlcC0+c2VfbmV4dDsKKwkJcmVtb3ZlX2ZkX2Zyb21fc2V0KHNlcC0+c2VfZmQpOworCQltYXliZV9jbG9zZShzZXAtPnNlX2ZkKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9SUEMKKwkJaWYgKGlzX3JwY19zZXJ2aWNlKHNlcCkpCisJCQl1bnJlZ2lzdGVyX3JwYyhzZXApOworI2VuZGlmCisJCWlmIChzZXAtPnNlX2ZhbWlseSA9PSBBRl9VTklYKQorCQkJdW5saW5rKHNlcC0+c2Vfc2VydmljZSk7CisJCWZyZWVfc2VydnRhYl9zdHJpbmdzKHNlcCk7CisJCWZyZWUoc2VwKTsKKwl9CisJcmVzdG9yZV9zaWdtYXNrKCZvbWFzayk7CisgcmV0OgorCWVycm5vID0gc2F2ZV9lcnJubzsKK30KKworc3RhdGljIHZvaWQgcmVhcF9jaGlsZChpbnQgc2lnIFVOVVNFRF9QQVJBTSkKK3sKKwlwaWRfdCBwaWQ7CisJaW50IHN0YXR1czsKKwlzZXJ2dGFiX3QgKnNlcDsKKwlpbnQgc2F2ZV9lcnJubyA9IGVycm5vOworCisJZm9yICg7OykgeworCQlwaWQgPSB3YWl0X2FueV9ub2hhbmcoJnN0YXR1cyk7CisJCWlmIChwaWQgPD0gMCkKKwkJCWJyZWFrOworCQlmb3IgKHNlcCA9IHNlcnZfbGlzdDsgc2VwOyBzZXAgPSBzZXAtPnNlX25leHQpIHsKKwkJCWlmIChzZXAtPnNlX3dhaXQgIT0gcGlkKQorCQkJCWNvbnRpbnVlOworCQkJLyogT25lIG9mIG91ciAid2FpdCIgc2VydmljZXMgKi8KKwkJCWlmIChXSUZFWElURUQoc3RhdHVzKSAmJiBXRVhJVFNUQVRVUyhzdGF0dXMpKQorCQkJCWJiX2Vycm9yX21zZygiJXM6IGV4aXQgc3RhdHVzICV1IiwKKwkJCQkJCXNlcC0+c2VfcHJvZ3JhbSwgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CisJCQllbHNlIGlmIChXSUZTSUdOQUxFRChzdGF0dXMpKQorCQkJCWJiX2Vycm9yX21zZygiJXM6IGV4aXQgc2lnbmFsICV1IiwKKwkJCQkJCXNlcC0+c2VfcHJvZ3JhbSwgV1RFUk1TSUcoc3RhdHVzKSk7CisJCQlzZXAtPnNlX3dhaXQgPSAxOworCQkJYWRkX2ZkX3RvX3NldChzZXAtPnNlX2ZkKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWVycm5vID0gc2F2ZV9lcnJubzsKK30KKworc3RhdGljIHZvaWQgcmV0cnlfbmV0d29ya19zZXR1cChpbnQgc2lnIFVOVVNFRF9QQVJBTSkKK3sKKwlpbnQgc2F2ZV9lcnJubyA9IGVycm5vOworCXNlcnZ0YWJfdCAqc2VwOworCisJYWxhcm1fYXJtZWQgPSAwOworCWZvciAoc2VwID0gc2Vydl9saXN0OyBzZXA7IHNlcCA9IHNlcC0+c2VfbmV4dCkgeworCQlpZiAoc2VwLT5zZV9mZCA9PSAtMSkgeworCQkJcHJlcGFyZV9zb2NrZXRfZmQoc2VwKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9SUEMKKwkJCWlmIChzZXAtPnNlX2ZkICE9IC0xICYmIGlzX3JwY19zZXJ2aWNlKHNlcCkpCisJCQkJcmVnaXN0ZXJfcnBjKHNlcCk7CisjZW5kaWYKKwkJfQorCX0KKwllcnJubyA9IHNhdmVfZXJybm87Cit9CisKK3N0YXRpYyB2b2lkIGNsZWFuX3VwX2FuZF9leGl0KGludCBzaWcgVU5VU0VEX1BBUkFNKQoreworCXNlcnZ0YWJfdCAqc2VwOworCisJLyogWFhYIHNpZ25hbCByYWNlIHdhbGtpbmcgc2VwIGxpc3QgKi8KKwlmb3IgKHNlcCA9IHNlcnZfbGlzdDsgc2VwOyBzZXAgPSBzZXAtPnNlX25leHQpIHsKKwkJaWYgKHNlcC0+c2VfZmQgPT0gLTEpCisJCQljb250aW51ZTsKKworCQlzd2l0Y2ggKHNlcC0+c2VfZmFtaWx5KSB7CisJCWNhc2UgQUZfVU5JWDoKKwkJCXVubGluayhzZXAtPnNlX3NlcnZpY2UpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8qIGNhc2UgQUZfSU5FVCwgQUZfSU5FVDYgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9SUEMKKwkJCWlmIChzZXAtPnNlX3dhaXQgPT0gMSAmJiBpc19ycGNfc2VydmljZShzZXApKQorCQkJCXVucmVnaXN0ZXJfcnBjKHNlcCk7ICAgLyogWFhYIHNpZ25hbCByYWNlICovCisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWNsb3NlKHNlcC0+c2VfZmQpOworCX0KKwlyZW1vdmVfcGlkZmlsZShDT05GSUdfUElEX0ZJTEVfUEFUSCAiL2luZXRkLnBpZCIpOworCWV4aXQoRVhJVF9TVUNDRVNTKTsKK30KKworaW50IGluZXRkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBpbmV0ZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHNpZ2FjdGlvbiBzYSwgc2F2ZWRfcGlwZV9oYW5kbGVyOworCXNlcnZ0YWJfdCAqc2VwLCAqc2VwMjsKKwlzdHJ1Y3QgcGFzc3dkICpwd2Q7CisJc3RydWN0IGdyb3VwICpncnAgPSBncnA7IC8qIGZvciBjb21waWxlciAqLworCWludCBvcHQ7CisJcGlkX3QgcGlkOworCXNpZ3NldF90IG9tYXNrOworCisJSU5JVF9HKCk7CisKKwlyZWFsX3VpZCA9IGdldHVpZCgpOworCWlmIChyZWFsX3VpZCAhPSAwKSAvKiBydW4gYnkgbm9uLXJvb3QgdXNlciAqLworCQljb25maWdfZmlsZW5hbWUgPSBOVUxMOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiUis6cSsiOyAvKiAtcSBOLCAtUiBOICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIlI6ZmVxOiIsICZtYXhfY29uY3VycmVuY3ksICZnbG9iYWxfcXVldWVsZW4pOworCWFyZ3YgKz0gb3B0aW5kOworCS8vYXJnYyAtPSBvcHRpbmQ7CisJaWYgKGFyZ3ZbMF0pCisJCWNvbmZpZ19maWxlbmFtZSA9IGFyZ3ZbMF07CisJaWYgKGNvbmZpZ19maWxlbmFtZSA9PSBOVUxMKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm9uLXJvb3QgbXVzdCBzcGVjaWZ5IGNvbmZpZyBmaWxlIik7CisJaWYgKCEob3B0ICYgMikpCisJCWJiX2RhZW1vbml6ZV9vcl9yZXhlYygwLCBhcmd2IC0gb3B0aW5kKTsKKwllbHNlCisJCWJiX3Nhbml0aXplX3N0ZGlvKCk7CisJaWYgKCEob3B0ICYgNCkpIHsKKwkJLyogTE9HX05ERUxBWTogY29ubmVjdCB0byBzeXNsb2cgZGFlbW9uIE5PVy4KKwkJICogT3RoZXJ3aXNlLCB3ZSBtYXkgb3BlbiBzeXNsb2cgc29ja2V0CisJCSAqIGluIHZmb3JrZWQgY2hpbGQsIG1ha2luZyBvcGVuZWQgZmRzIGFuZCBzeXNsb2coKQorCQkgKiBpbnRlcm5hbCBzdGF0ZSBpbmNvbnNpc3RlbnQuCisJCSAqIFRoaXMgd2FzIG9ic2VydmVkIHRvIGxlYWsgZmlsZSBkZXNjcmlwdG9ycy4gKi8KKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgTE9HX1BJRCB8IExPR19OREVMQVksIExPR19EQUVNT04pOworCQlsb2dtb2RlID0gTE9HTU9ERV9TWVNMT0c7CisJfQorCisJaWYgKHJlYWxfdWlkID09IDApIHsKKwkJLyogcnVuIGJ5IHJvb3QsIGVuc3VyZSBncm91cHMgdmVjdG9yIGdldHMgdHJhc2hlZCAqLworCQlnaWRfdCBnaWQgPSBnZXRnaWQoKTsKKwkJc2V0Z3JvdXBzKDEsICZnaWQpOworCX0KKworCXdyaXRlX3BpZGZpbGUoQ09ORklHX1BJRF9GSUxFX1BBVEggIi9pbmV0ZC5waWQiKTsKKworCS8qIG5ldmVyIGZhaWxzIHVuZGVyIExpbnV4IChleGNlcHQgaWYgeW91IHBhc3MgaXQgYmFkIGFyZ3VtZW50cykgKi8KKwlnZXRybGltaXQoUkxJTUlUX05PRklMRSwgJnJsaW1fb2ZpbGUpOworCXJsaW1fb2ZpbGVfY3VyID0gcmxpbV9vZmlsZS5ybGltX2N1cjsKKwlpZiAocmxpbV9vZmlsZV9jdXIgPT0gUkxJTV9JTkZJTklUWSkgICAgLyogISAqLworCQlybGltX29maWxlX2N1ciA9IE9QRU5fTUFYOworCisJbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7CisJLypzaWdlbXB0eXNldCgmc2Euc2FfbWFzayk7IC0gbWVtc2V0IGRpZCBpdCAqLworCXNpZ2FkZHNldCgmc2Euc2FfbWFzaywgU0lHQUxSTSk7CisJc2lnYWRkc2V0KCZzYS5zYV9tYXNrLCBTSUdDSExEKTsKKwlzaWdhZGRzZXQoJnNhLnNhX21hc2ssIFNJR0hVUCk7CisvL0ZJWE1FOiBleHBsYWluIHdoeSBubyBTQV9SRVNUQVJUCisvL0ZJWE1FOiByZXRyeV9uZXR3b3JrX3NldHVwIGlzIHVuc2FmZSB0byBydW4gaW4gc2lnbmFsIGhhbmRsZXIgKG1hbnkgcmVhc29ucykhCisJc2Euc2FfaGFuZGxlciA9IHJldHJ5X25ldHdvcmtfc2V0dXA7CisJc2lnYWN0aW9uX3NldChTSUdBTFJNLCAmc2EpOworLy9GSVhNRTogcmVyZWFkX2NvbmZpZ19maWxlIGlzIHVuc2FmZSB0byBydW4gaW4gc2lnbmFsIGhhbmRsZXIobWFueSByZWFzb25zKSEKKwlzYS5zYV9oYW5kbGVyID0gcmVyZWFkX2NvbmZpZ19maWxlOworCXNpZ2FjdGlvbl9zZXQoU0lHSFVQLCAmc2EpOworLy9GSVhNRTogcmVhcF9jaGlsZCBpcyB1bnNhZmUgdG8gcnVuIGluIHNpZ25hbCBoYW5kbGVyICh1c2VzIHN0ZGlvKSEKKwlzYS5zYV9oYW5kbGVyID0gcmVhcF9jaGlsZDsKKwlzaWdhY3Rpb25fc2V0KFNJR0NITEQsICZzYSk7CisvL0ZJWE1FOiBjbGVhbl91cF9hbmRfZXhpdCBpcyB1bnNhZmUgdG8gcnVuIGluIHNpZ25hbCBoYW5kbGVyICh1c2VzIHN0ZGlvKSEKKwlzYS5zYV9oYW5kbGVyID0gY2xlYW5fdXBfYW5kX2V4aXQ7CisJc2lnYWN0aW9uX3NldChTSUdURVJNLCAmc2EpOworCXNhLnNhX2hhbmRsZXIgPSBjbGVhbl91cF9hbmRfZXhpdDsKKwlzaWdhY3Rpb25fc2V0KFNJR0lOVCwgJnNhKTsKKwlzYS5zYV9oYW5kbGVyID0gU0lHX0lHTjsKKwlzaWdhY3Rpb24oU0lHUElQRSwgJnNhLCAmc2F2ZWRfcGlwZV9oYW5kbGVyKTsKKworCXJlcmVhZF9jb25maWdfZmlsZShTSUdIVVApOyAvKiBsb2FkIGNvbmZpZyBmcm9tIGZpbGUgKi8KKworCWZvciAoOzspIHsKKwkJaW50IHJlYWR5X2ZkX2NudDsKKwkJaW50IGN0cmwsIGFjY2VwdGVkX2ZkLCBuZXdfdWRwX2ZkOworCQlmZF9zZXQgcmVhZGFibGU7CisKKwkJaWYgKG1heHNvY2sgPCAwKQorCQkJcmVjYWxjdWxhdGVfbWF4c29jaygpOworCisJCXJlYWRhYmxlID0gYWxsc29jazsgLyogc3RydWN0IGNvcHkgKi8KKwkJLyogaWYgdGhlcmUgYXJlIG5vIGZkcyB0byB3YWl0IG9uLCB3ZSB3aWxsIGJsb2NrCisJCSAqIHVudGlsIHNpZ25hbCB3YWtlcyB1cyB1cCAobWF4c29jayA9PSAwLCBidXQgcmVhZGFibGUKKwkJICogbmV2ZXIgY29udGFpbnMgZmRzIDAgYW5kIDEuLi4pICovCisJCXJlYWR5X2ZkX2NudCA9IHNlbGVjdChtYXhzb2NrICsgMSwgJnJlYWRhYmxlLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJaWYgKHJlYWR5X2ZkX2NudCA8IDApIHsKKwkJCWlmIChlcnJubyAhPSBFSU5UUikgeworCQkJCWJiX3BlcnJvcl9tc2coInNlbGVjdCIpOworCQkJCXNsZWVwKDEpOworCQkJfQorCQkJY29udGludWU7CisJCX0KKwkJZGJnKCJyZWFkeV9mZF9jbnQ6JWRcbiIsIHJlYWR5X2ZkX2NudCk7CisKKwkJZm9yIChzZXAgPSBzZXJ2X2xpc3Q7IHJlYWR5X2ZkX2NudCAmJiBzZXA7IHNlcCA9IHNlcC0+c2VfbmV4dCkgeworCQkJaWYgKHNlcC0+c2VfZmQgPT0gLTEgfHwgIUZEX0lTU0VUKHNlcC0+c2VfZmQsICZyZWFkYWJsZSkpCisJCQkJY29udGludWU7CisKKwkJCWRiZygicmVhZHkgZmQ6JWRcbiIsIHNlcC0+c2VfZmQpOworCQkJcmVhZHlfZmRfY250LS07CisJCQljdHJsID0gc2VwLT5zZV9mZDsKKwkJCWFjY2VwdGVkX2ZkID0gLTE7CisJCQluZXdfdWRwX2ZkID0gLTE7CisJCQlpZiAoIXNlcC0+c2Vfd2FpdCkgeworCQkJCWlmIChzZXAtPnNlX3NvY2t0eXBlID09IFNPQ0tfU1RSRUFNKSB7CisJCQkJCWN0cmwgPSBhY2NlcHRlZF9mZCA9IGFjY2VwdChzZXAtPnNlX2ZkLCBOVUxMLCBOVUxMKTsKKwkJCQkJZGJnKCJhY2NlcHRlZF9mZDolZFxuIiwgYWNjZXB0ZWRfZmQpOworCQkJCQlpZiAoY3RybCA8IDApIHsKKwkJCQkJCWlmIChlcnJubyAhPSBFSU5UUikKKwkJCQkJCQliYl9wZXJyb3JfbXNnKCJhY2NlcHQgKGZvciAlcykiLCBzZXAtPnNlX3NlcnZpY2UpOworCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9CisJCQkJLyogIm5vd2FpdCIgdWRwICovCisJCQkJaWYgKHNlcC0+c2Vfc29ja3R5cGUgPT0gU09DS19ER1JBTQorCQkJCSAmJiBzZXAtPnNlX2ZhbWlseSAhPSBBRl9VTklYCisJCQkJKSB7CisvKiBIb3cgdWRwICJub3dhaXQiIHdvcmtzOgorICogY2hpbGQgcGVla3MgYXQgKHJlY2VpdmVkIGFuZCBidWZmZXJlZCBieSBrZXJuZWwpIFVEUCBwYWNrZXQsCisgKiBwZXJmb3JtcyBjb25uZWN0KCkgb24gdGhlIHNvY2tldCBzbyB0aGF0IGl0IGlzIGxpbmtlZCBvbmx5CisgKiB0byB0aGlzIHBlZXIuIEJ1dCB0aGlzIGFsc28gYWZmZWN0cyBwYXJlbnQsIGJlY2F1c2UgZGVzY3JpcHRvcnMKKyAqIGFyZSBzaGFyZWQgYWZ0ZXIgZm9yaygpIGEtbGEgZHVwKCkuIFdoZW4gcGFyZW50IHBlcmZvcm1zCisgKiBzZWxlY3QoKSwgaXQgd2lsbCBzZWUgdGhpcyBkZXNjcmlwdG9yIGNvbm5lY3RlZCB0byB0aGUgcGVlciAoISkKKyAqIGFuZCBzdGlsbCByZWFkYWJsZSwgd2lsbCBhY3Qgb24gaXQgYW5kIG1lc3MgdGhpbmdzIHVwCisgKiAoY2FuIGNyZWF0ZSBtYW55IGNvcGllcyBvZiBzYW1lIGNoaWxkLCBldGMpLgorICogUGFyZW50IG11c3QgY3JlYXRlIGFuZCB1c2UgbmV3IHNvY2tldCBpbnN0ZWFkLiAqLworCQkJCQluZXdfdWRwX2ZkID0gc29ja2V0KHNlcC0+c2VfZmFtaWx5LCBTT0NLX0RHUkFNLCAwKTsKKwkJCQkJZGJnKCJuZXdfdWRwX2ZkOiVkXG4iLCBuZXdfdWRwX2ZkKTsKKwkJCQkJaWYgKG5ld191ZHBfZmQgPCAwKSB7IC8qIGVycm9yOiBlYXQgcGFja2V0LCBmb3JnZXQgYWJvdXQgaXQgKi8KKyB1ZHBfZXJyOgorCQkJCQkJcmVjdihzZXAtPnNlX2ZkLCBsaW5lLCBMSU5FX1NJWkUsIE1TR19ET05UV0FJVCk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlzZXRzb2Nrb3B0X3JldXNlYWRkcihuZXdfdWRwX2ZkKTsKKwkJCQkJLyogVE9ETzogYmV0dGVyIGRvIGJpbmQgYWZ0ZXIgZm9yayBpbiBwYXJlbnQsCisJCQkJCSAqIHNvIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0d28gd2lsZGNhcmQgYm91bmQgc29ja2V0cworCQkJCQkgKiBldmVuIGZvciBhIGJyaWVmIG1vbWVudD8gKi8KKwkJCQkJaWYgKGJpbmQobmV3X3VkcF9mZCwgJnNlcC0+c2VfbHNhLT51LnNhLCBzZXAtPnNlX2xzYS0+bGVuKSA8IDApIHsKKwkJCQkJCWRiZygiYmluZChuZXdfdWRwX2ZkKSBmYWlsZWRcbiIpOworCQkJCQkJY2xvc2UobmV3X3VkcF9mZCk7CisJCQkJCQlnb3RvIHVkcF9lcnI7CisJCQkJCX0KKwkJCQkJZGJnKCJiaW5kKG5ld191ZHBfZmQpIHN1Y2NlZWRlZFxuIik7CisJCQkJfQorCQkJfQorCisJCQlibG9ja19DSExEX0hVUF9BTFJNKCZvbWFzayk7CisJCQlwaWQgPSAwOworI2lmZGVmIElORVREX0JVSUxUSU5TX0VOQUJMRUQKKwkJCS8qIGRvIHdlIG5lZWQgdG8gZm9yaz8gKi8KKwkJCWlmIChzZXAtPnNlX2J1aWx0aW4gPT0gTlVMTAorCQkJIHx8IChzZXAtPnNlX3NvY2t0eXBlID09IFNPQ0tfU1RSRUFNCisJCQkgICAgICYmIHNlcC0+c2VfYnVpbHRpbi0+YmlfZm9yaykpCisjZW5kaWYKKwkJCXsKKwkJCQlpZiAoc2VwLT5zZV9tYXggIT0gMCkgeworCQkJCQlpZiAoKytzZXAtPnNlX2NvdW50ID09IDEpCisJCQkJCQlzZXAtPnNlX3RpbWUgPSBtb25vdG9uaWNfc2VjKCk7CisJCQkJCWVsc2UgaWYgKHNlcC0+c2VfY291bnQgPj0gc2VwLT5zZV9tYXgpIHsKKwkJCQkJCXVuc2lnbmVkIG5vdyA9IG1vbm90b25pY19zZWMoKTsKKwkJCQkJCS8qIGRpZCB3ZSBhY2N1bXVsYXRlIHNlX21heCBjb25uZWN0cyB0b28gcXVpY2tseT8gKi8KKwkJCQkJCWlmIChub3cgLSBzZXAtPnNlX3RpbWUgPD0gQ05UX0lOVEVSVkFMKSB7CisJCQkJCQkJYmJfZXJyb3JfbXNnKCIlcy8lczogdG9vIG1hbnkgY29ubmVjdGlvbnMsIHBhdXNpbmciLAorCQkJCQkJCQkJc2VwLT5zZV9zZXJ2aWNlLCBzZXAtPnNlX3Byb3RvKTsKKwkJCQkJCQlyZW1vdmVfZmRfZnJvbV9zZXQoc2VwLT5zZV9mZCk7CisJCQkJCQkJY2xvc2Uoc2VwLT5zZV9mZCk7CisJCQkJCQkJc2VwLT5zZV9mZCA9IC0xOworCQkJCQkJCXNlcC0+c2VfY291bnQgPSAwOworCQkJCQkJCXJlYXJtX2FsYXJtKCk7IC8qIHdpbGwgcmV2aXZlIGl0IGluIFJFVFJZVElNRSBzZWMgKi8KKwkJCQkJCQlyZXN0b3JlX3NpZ21hc2soJm9tYXNrKTsKKwkJCQkJCQltYXliZV9jbG9zZShuZXdfdWRwX2ZkKTsKKwkJCQkJCQltYXliZV9jbG9zZShhY2NlcHRlZF9mZCk7CisJCQkJCQkJY29udGludWU7IC8qIC0+IGNoZWNrIG5leHQgZmQgaW4gZmQgc2V0ICovCisJCQkJCQl9CisJCQkJCQlzZXAtPnNlX2NvdW50ID0gMDsKKwkJCQkJfQorCQkJCX0KKwkJCQkvKiBvbiBOT01NVSwgc3RyZWFtZWQgY2hhcmdlbgorCQkJCSAqIGJ1aWx0aW4gd291bGRuJ3Qgd29yaywgYnV0IGl0IGlzCisJCQkJICogbm90IGFsbG93ZWQgb24gTk9NTVUgKGlmZGVmZWQgb3V0KSAqLworI2lmZGVmIElORVREX0JVSUxUSU5TX0VOQUJMRUQKKwkJCQlpZiAoQkJfTU1VICYmIHNlcC0+c2VfYnVpbHRpbikKKwkJCQkJcGlkID0gZm9yaygpOworCQkJCWVsc2UKKyNlbmRpZgorCQkJCQlwaWQgPSB2Zm9yaygpOworCisJCQkJaWYgKHBpZCA8IDApIHsgLyogZm9yayBlcnJvciAqLworCQkJCQliYl9wZXJyb3JfbXNnKCJ2Zm9yayIrMSk7CisJCQkJCXNsZWVwKDEpOworCQkJCQlyZXN0b3JlX3NpZ21hc2soJm9tYXNrKTsKKwkJCQkJbWF5YmVfY2xvc2UobmV3X3VkcF9mZCk7CisJCQkJCW1heWJlX2Nsb3NlKGFjY2VwdGVkX2ZkKTsKKwkJCQkJY29udGludWU7IC8qIC0+IGNoZWNrIG5leHQgZmQgaW4gZmQgc2V0ICovCisJCQkJfQorCQkJCWlmIChwaWQgPT0gMCkKKwkJCQkJcGlkLS07IC8qIC0xOiAid2UgZGlkIGZvcmsgYW5kIHdlIGFyZSBjaGlsZCIgKi8KKwkJCX0KKwkJCS8qIGlmIHBpZCA9PSAwIGhlcmUsIHdlIGRpZG4ndCBmb3JrICovCisKKwkJCWlmIChwaWQgPiAwKSB7IC8qIHBhcmVudCAqLworCQkJCWlmIChzZXAtPnNlX3dhaXQpIHsKKwkJCQkJLyogd2FpdDogd2UgcGFzc2VkIHNvY2tldCB0byBjaGlsZCwKKwkJCQkJICogd2lsbCB3YWl0IGZvciBjaGlsZCB0byB0ZXJtaW5hdGUgKi8KKwkJCQkJc2VwLT5zZV93YWl0ID0gcGlkOworCQkJCQlyZW1vdmVfZmRfZnJvbV9zZXQoc2VwLT5zZV9mZCk7CisJCQkJfQorCQkJCWlmIChuZXdfdWRwX2ZkID49IDApIHsKKwkJCQkJLyogdWRwIG5vd2FpdDogY2hpbGQgY29ubmVjdGVkIHRoZSBzb2NrZXQsCisJCQkJCSAqIHdlIGNyZWF0ZWQgYW5kIHdpbGwgdXNlIG5ldywgdW5jb25uZWN0ZWQgb25lICovCisJCQkJCXhtb3ZlX2ZkKG5ld191ZHBfZmQsIHNlcC0+c2VfZmQpOworCQkJCQlkYmcoIm1vdmVkIG5ld191ZHBfZmQ6JWQgdG8gc2VwLT5zZV9mZDolZFxuIiwgbmV3X3VkcF9mZCwgc2VwLT5zZV9mZCk7CisJCQkJfQorCQkJCXJlc3RvcmVfc2lnbWFzaygmb21hc2spOworCQkJCW1heWJlX2Nsb3NlKGFjY2VwdGVkX2ZkKTsKKwkJCQljb250aW51ZTsgLyogLT4gY2hlY2sgbmV4dCBmZCBpbiBmZCBzZXQgKi8KKwkJCX0KKworCQkJLyogd2UgYXJlIGVpdGhlciBjaGlsZCBvciBkaWRuJ3QgZm9yayBhdCBhbGwgKi8KKyNpZmRlZiBJTkVURF9CVUlMVElOU19FTkFCTEVECisJCQlpZiAoc2VwLT5zZV9idWlsdGluKSB7CisJCQkJaWYgKHBpZCkgeyAvKiAicGlkIiBpcyAtMTogd2UgZGlkIGZvcmsgKi8KKwkJCQkJY2xvc2Uoc2VwLT5zZV9mZCk7IC8qIGxpc3RlbmluZyBzb2NrZXQgKi8KKwkJCQkJZGJnKCJjbG9zZWQgc2VwLT5zZV9mZDolZFxuIiwgc2VwLT5zZV9mZCk7CisJCQkJCWxvZ21vZGUgPSBMT0dNT0RFX05PTkU7IC8qIG1ha2UgeHdyaXRlIGV0YyBzaWxlbnQgKi8KKwkJCQl9CisJCQkJcmVzdG9yZV9zaWdtYXNrKCZvbWFzayk7CisJCQkJaWYgKHNlcC0+c2Vfc29ja3R5cGUgPT0gU09DS19TVFJFQU0pCisJCQkJCXNlcC0+c2VfYnVpbHRpbi0+Ymlfc3RyZWFtX2ZuKGN0cmwsIHNlcCk7CisJCQkJZWxzZQorCQkJCQlzZXAtPnNlX2J1aWx0aW4tPmJpX2RncmFtX2ZuKGN0cmwsIHNlcCk7CisJCQkJaWYgKHBpZCkgLyogd2UgZGlkIGZvcmsgKi8KKwkJCQkJX2V4aXQoRVhJVF9GQUlMVVJFKTsKKwkJCQltYXliZV9jbG9zZShhY2NlcHRlZF9mZCk7CisJCQkJY29udGludWU7IC8qIC0+IGNoZWNrIG5leHQgZmQgaW4gZmQgc2V0ICovCisJCQl9CisjZW5kaWYKKwkJCS8qIGNoaWxkICovCisJCQlzZXRzaWQoKTsKKwkJCS8qICJub3dhaXQiIHVkcCAqLworCQkJaWYgKG5ld191ZHBfZmQgPj0gMCkgeworCQkJCWxlbl9hbmRfc29ja2FkZHIgKmxzYTsKKwkJCQlpbnQgcjsKKworCQkJCWNsb3NlKG5ld191ZHBfZmQpOworCQkJCWRiZygiY2xvc2VkIG5ld191ZHBfZmQ6JWRcbiIsIG5ld191ZHBfZmQpOworCQkJCWxzYSA9IHh6YWxsb2NfbHNhKHNlcC0+c2VfZmFtaWx5KTsKKwkJCQkvKiBwZWVrIGF0IHRoZSBwYWNrZXQgYW5kIHJlbWVtYmVyIHBlZXIgYWRkciAqLworCQkJCXIgPSByZWN2ZnJvbShjdHJsLCBOVUxMLCAwLCBNU0dfUEVFS3xNU0dfRE9OVFdBSVQsCisJCQkJCSZsc2EtPnUuc2EsICZsc2EtPmxlbik7CisJCQkJaWYgKHIgPCAwKQorCQkJCQlnb3RvIGRvX2V4aXQxOworCQkJCS8qIG1ha2UgdGhpcyBzb2NrZXQgImNvbm5lY3RlZCIgdG8gcGVlciBhZGRyOgorCQkJCSAqIG9ubHkgcGFja2V0cyBmcm9tIHRoaXMgcGVlciB3aWxsIGJlIHJlY3YnZWQsCisJCQkJICogYW5kIGJhcmUgd3JpdGUoKS9zZW5kKCkgd2lsbCB3b3JrIG9uIGl0ICovCisJCQkJY29ubmVjdChjdHJsLCAmbHNhLT51LnNhLCBsc2EtPmxlbik7CisJCQkJZGJnKCJjb25uZWN0ZWQgY3RybDolZCB0byByZW1vdGUgcGVlclxuIiwgY3RybCk7CisJCQkJZnJlZShsc2EpOworCQkJfQorCQkJLyogcHJlcGFyZSBlbnYgYW5kIGV4ZWMgcHJvZ3JhbSAqLworCQkJcHdkID0gZ2V0cHduYW0oc2VwLT5zZV91c2VyKTsKKwkJCWlmIChwd2QgPT0gTlVMTCkgeworCQkJCWJiX2Vycm9yX21zZygiJXM6IG5vIHN1Y2ggJXMiLCBzZXAtPnNlX3VzZXIsICJ1c2VyIik7CisJCQkJZ290byBkb19leGl0MTsKKwkJCX0KKwkJCWlmIChzZXAtPnNlX2dyb3VwICYmIChncnAgPSBnZXRncm5hbShzZXAtPnNlX2dyb3VwKSkgPT0gTlVMTCkgeworCQkJCWJiX2Vycm9yX21zZygiJXM6IG5vIHN1Y2ggJXMiLCBzZXAtPnNlX2dyb3VwLCAiZ3JvdXAiKTsKKwkJCQlnb3RvIGRvX2V4aXQxOworCQkJfQorCQkJaWYgKHJlYWxfdWlkICE9IDAgJiYgcmVhbF91aWQgIT0gcHdkLT5wd191aWQpIHsKKwkJCQkvKiBhIHVzZXIgcnVubmluZyBwcml2YXRlIGluZXRkICovCisJCQkJYmJfZXJyb3JfbXNnKCJub24tcm9vdCBtdXN0IHJ1biBzZXJ2aWNlcyBhcyBoaW1zZWxmIik7CisJCQkJZ290byBkb19leGl0MTsKKwkJCX0KKwkJCWlmIChwd2QtPnB3X3VpZCAhPSAwKSB7CisJCQkJaWYgKHNlcC0+c2VfZ3JvdXApCisJCQkJCXB3ZC0+cHdfZ2lkID0gZ3JwLT5ncl9naWQ7CisJCQkJLyogaW5pdGdyb3Vwcywgc2V0Z2lkLCBzZXR1aWQ6ICovCisJCQkJY2hhbmdlX2lkZW50aXR5KHB3ZCk7CisJCQl9IGVsc2UgaWYgKHNlcC0+c2VfZ3JvdXApIHsKKwkJCQl4c2V0Z2lkKGdycC0+Z3JfZ2lkKTsKKwkJCQlzZXRncm91cHMoMSwgJmdycC0+Z3JfZ2lkKTsKKwkJCX0KKwkJCWlmIChybGltX29maWxlLnJsaW1fY3VyICE9IHJsaW1fb2ZpbGVfY3VyKQorCQkJCWlmIChzZXRybGltaXQoUkxJTUlUX05PRklMRSwgJnJsaW1fb2ZpbGUpIDwgMCkKKwkJCQkJYmJfcGVycm9yX21zZygic2V0cmxpbWl0Iik7CisKKwkJCS8qIGNsb3NlbG9nKCk7IC0gV1JPTkcuIHdlIGFyZSBhZnRlciB2Zm9yaywKKwkJCSAqIHRoaXMgbWF5IGNvbmZ1c2Ugc3lzbG9nKCkgaW50ZXJuYWwgc3RhdGUuCisJCQkgKiBMZXQncyBob3BlIGxpYmMgc2V0cyBzeXNsb2cgZmQgdG8gQ0xPRVhFQy4uLgorCQkJICovCisJCQl4bW92ZV9mZChjdHJsLCBTVERJTl9GSUxFTk8pOworCQkJeGR1cDIoU1RESU5fRklMRU5PLCBTVERPVVRfRklMRU5PKTsKKwkJCWRiZygibW92ZWQgY3RybDolZCB0byBmZCAwLDFbLDJdXG4iLCBjdHJsKTsKKwkJCS8qIG1hbnBhZ2VzIG9mIGluZXRkIEkgbWFuYWdlZCB0byBmaW5kIGVpdGhlciBzYXkKKwkJCSAqIHRoYXQgc3RkZXJyIGlzIGFsc28gcmVkaXJlY3RlZCB0byB0aGUgbmV0d29yaywKKwkJCSAqIG9yIGRvIG5vdCB0YWxrIGFib3V0IHJlZGlyZWN0aW9uIGF0IGFsbCAoISkgKi8KKwkJCWlmICghc2VwLT5zZV93YWl0KSAvKiBvbmx5IGZvciB1c3VhbCAidGNwIG5vd2FpdCIgKi8KKwkJCQl4ZHVwMihTVERJTl9GSUxFTk8sIFNUREVSUl9GSUxFTk8pOworCQkJLyogTkI6IGFtb25nIG90aGVycywgdGhpcyBsb29wIGNsb3NlcyBsaXN0ZW5pbmcgc29ja2V0cworCQkJICogZm9yIG5vd2FpdCBzdHJlYW0gY2hpbGRyZW4gKi8KKwkJCWZvciAoc2VwMiA9IHNlcnZfbGlzdDsgc2VwMjsgc2VwMiA9IHNlcDItPnNlX25leHQpCisJCQkJaWYgKHNlcDItPnNlX2ZkICE9IGN0cmwpCisJCQkJCW1heWJlX2Nsb3NlKHNlcDItPnNlX2ZkKTsKKwkJCXNpZ2FjdGlvbl9zZXQoU0lHUElQRSwgJnNhdmVkX3BpcGVfaGFuZGxlcik7CisJCQlyZXN0b3JlX3NpZ21hc2soJm9tYXNrKTsKKwkJCWRiZygiZXhlY2luZzonJXMnXG4iLCBzZXAtPnNlX3Byb2dyYW0pOworCQkJQkJfRVhFQ1ZQKHNlcC0+c2VfcHJvZ3JhbSwgc2VwLT5zZV9hcmd2KTsKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IGV4ZWN1dGUgJyVzJyIsIHNlcC0+c2VfcHJvZ3JhbSk7CisgZG9fZXhpdDE6CisJCQkvKiBlYXQgcGFja2V0IGluIHVkcCBjYXNlICovCisJCQlpZiAoc2VwLT5zZV9zb2NrdHlwZSAhPSBTT0NLX1NUUkVBTSkKKwkJCQlyZWN2KDAsIGxpbmUsIExJTkVfU0laRSwgTVNHX0RPTlRXQUlUKTsKKwkJCV9leGl0KEVYSVRfRkFJTFVSRSk7CisJCX0gLyogZm9yIChzZXAgPSBzZXJ2dGFiLi4uKSAqLworCX0gLyogZm9yICg7OykgKi8KK30KKworI2lmICFCQl9NTVUKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjYXRfYXJnc1tdID0geyAiY2F0IiwgTlVMTCB9OworI2VuZGlmCisKKy8qCisgKiBJbnRlcm5ldCBzZXJ2aWNlcyBwcm92aWRlZCBpbnRlcm5hbGx5IGJ5IGluZXRkOgorICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0VDSE8KKy8qIEVjaG8gc2VydmljZSAtLSBlY2hvIGRhdGEgYmFjay4gKi8KKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgZWNob19zdHJlYW0oaW50IHMsIHNlcnZ0YWJfdCAqc2VwIFVOVVNFRF9QQVJBTSkKK3sKKyNpZiBCQl9NTVUKKwl3aGlsZSAoMSkgeworCQlzc2l6ZV90IHN6ID0gc2FmZV9yZWFkKHMsIGxpbmUsIExJTkVfU0laRSk7CisJCWlmIChzeiA8PSAwKQorCQkJYnJlYWs7CisJCXh3cml0ZShzLCBsaW5lLCBzeik7CisJfQorI2Vsc2UKKwkvKiBXZSBhcmUgYWZ0ZXIgdmZvcmsgaGVyZSEgKi8KKwkvKiBtb3ZlIG5ldHdvcmsgc29ja2V0IHRvIHN0ZGluL3N0ZG91dCAqLworCXhtb3ZlX2ZkKHMsIFNURElOX0ZJTEVOTyk7CisJeGR1cDIoU1RESU5fRklMRU5PLCBTVERPVVRfRklMRU5PKTsKKwkvKiBubyBlcnJvciBtZXNzYWdlcyBwbGVhc2UuLi4gKi8KKwljbG9zZShTVERFUlJfRklMRU5PKTsKKwl4b3BlbihiYl9kZXZfbnVsbCwgT19XUk9OTFkpOworCUJCX0VYRUNWUCgiY2F0IiwgKGNoYXIqKiljYXRfYXJncyk7CisJLyogb24gZmFpbHVyZSB3ZSByZXR1cm4gdG8gbWFpbiwgd2hpY2ggZG9lcyBleGl0KEVYSVRfRkFJTFVSRSkgKi8KKyNlbmRpZgorfQorc3RhdGljIHZvaWQgRkFTVF9GVU5DIGVjaG9fZGcoaW50IHMsIHNlcnZ0YWJfdCAqc2VwKQoreworCWVudW0geyBCVUZTSVpFID0gMTIqMTAyNCB9OyAvKiBmb3IganVtYm8gc2l6ZWQgcGFja2V0cyEgOikgKi8KKwljaGFyICpidWYgPSB4bWFsbG9jKEJVRlNJWkUpOyAvKiB0b28gYmlnIGZvciBzdGFjayAqLworCWludCBzejsKKwlsZW5fYW5kX3NvY2thZGRyICpsc2EgPSBhbGxvY2EoTFNBX0xFTl9TSVpFICsgc2VwLT5zZV9sc2EtPmxlbik7CisKKwlsc2EtPmxlbiA9IHNlcC0+c2VfbHNhLT5sZW47CisJLyogZGdyYW0gYnVpbHRpbnMgYXJlIG5vbi1mb3JraW5nIC0gRE9OVCBCTE9DSyEgKi8KKwlzeiA9IHJlY3Zmcm9tKHMsIGJ1ZiwgQlVGU0laRSwgTVNHX0RPTlRXQUlULCAmbHNhLT51LnNhLCAmbHNhLT5sZW4pOworCWlmIChzeiA+IDApCisJCXNlbmR0byhzLCBidWYsIHN6LCAwLCAmbHNhLT51LnNhLCBsc2EtPmxlbik7CisJZnJlZShidWYpOworfQorI2VuZGlmICAvKiBGRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9FQ0hPICovCisKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9ESVNDQVJECisvKiBEaXNjYXJkIHNlcnZpY2UgLS0gaWdub3JlIGRhdGEuICovCisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGRpc2NhcmRfc3RyZWFtKGludCBzLCBzZXJ2dGFiX3QgKnNlcCBVTlVTRURfUEFSQU0pCit7CisjaWYgQkJfTU1VCisJd2hpbGUgKHNhZmVfcmVhZChzLCBsaW5lLCBMSU5FX1NJWkUpID4gMCkKKwkJY29udGludWU7CisjZWxzZQorCS8qIFdlIGFyZSBhZnRlciB2Zm9yayBoZXJlISAqLworCS8qIG1vdmUgbmV0d29yayBzb2NrZXQgdG8gc3RkaW4gKi8KKwl4bW92ZV9mZChzLCBTVERJTl9GSUxFTk8pOworCS8qIGRpc2NhcmQgb3V0cHV0ICovCisJY2xvc2UoU1RET1VUX0ZJTEVOTyk7CisJeG9wZW4oYmJfZGV2X251bGwsIE9fV1JPTkxZKTsKKwkvKiBubyBlcnJvciBtZXNzYWdlcyBwbGVhc2UuLi4gKi8KKwl4ZHVwMihTVERPVVRfRklMRU5PLCBTVERFUlJfRklMRU5PKTsKKwlCQl9FWEVDVlAoImNhdCIsIChjaGFyKiopY2F0X2FyZ3MpOworCS8qIG9uIGZhaWx1cmUgd2UgcmV0dXJuIHRvIG1haW4sIHdoaWNoIGRvZXMgZXhpdChFWElUX0ZBSUxVUkUpICovCisjZW5kaWYKK30KKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgZGlzY2FyZF9kZyhpbnQgcywgc2VydnRhYl90ICpzZXAgVU5VU0VEX1BBUkFNKQoreworCS8qIGRncmFtIGJ1aWx0aW5zIGFyZSBub24tZm9ya2luZyAtIERPTlQgQkxPQ0shICovCisJcmVjdihzLCBsaW5lLCBMSU5FX1NJWkUsIE1TR19ET05UV0FJVCk7Cit9CisjZW5kaWYgLyogRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fRElTQ0FSRCAqLworCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JTkVURF9TVVBQT1JUX0JVSUxUSU5fQ0hBUkdFTgorI2RlZmluZSBMSU5FU0laIDcyCitzdGF0aWMgdm9pZCBpbml0X3Jpbmcodm9pZCkKK3sKKwlpbnQgaTsKKworCWVuZF9yaW5nID0gcmluZzsKKwlmb3IgKGkgPSAnICc7IGkgPCAxMjc7IGkrKykKKwkJKmVuZF9yaW5nKysgPSBpOworfQorLyogQ2hhcmFjdGVyIGdlbmVyYXRvci4gTU1VIGFyY2hlcyBvbmx5LiAqLworLyogQVJHU1VTRUQgKi8KK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjaGFyZ2VuX3N0cmVhbShpbnQgcywgc2VydnRhYl90ICpzZXAgVU5VU0VEX1BBUkFNKQoreworCWNoYXIgKnJzOworCWludCBsZW47CisJY2hhciB0ZXh0W0xJTkVTSVogKyAyXTsKKworCWlmICghZW5kX3JpbmcpIHsKKwkJaW5pdF9yaW5nKCk7CisJCXJzID0gcmluZzsKKwl9CisKKwl0ZXh0W0xJTkVTSVpdID0gJ1xyJzsKKwl0ZXh0W0xJTkVTSVogKyAxXSA9ICdcbic7CisJcnMgPSByaW5nOworCWZvciAoOzspIHsKKwkJbGVuID0gZW5kX3JpbmcgLSByczsKKwkJaWYgKGxlbiA+PSBMSU5FU0laKQorCQkJbWVtbW92ZSh0ZXh0LCBycywgTElORVNJWik7CisJCWVsc2UgeworCQkJbWVtbW92ZSh0ZXh0LCBycywgbGVuKTsKKwkJCW1lbW1vdmUodGV4dCArIGxlbiwgcmluZywgTElORVNJWiAtIGxlbik7CisJCX0KKwkJaWYgKCsrcnMgPT0gZW5kX3JpbmcpCisJCQlycyA9IHJpbmc7CisJCXh3cml0ZShzLCB0ZXh0LCBzaXplb2YodGV4dCkpOworCX0KK30KKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY2hhcmdlbl9kZyhpbnQgcywgc2VydnRhYl90ICpzZXApCit7CisJaW50IGxlbjsKKwljaGFyIHRleHRbTElORVNJWiArIDJdOworCWxlbl9hbmRfc29ja2FkZHIgKmxzYSA9IGFsbG9jYShMU0FfTEVOX1NJWkUgKyBzZXAtPnNlX2xzYS0+bGVuKTsKKworCS8qIEVhdCBVRFAgcGFja2V0IHdoaWNoIHN0YXJ0ZWQgaXQgYWxsICovCisJLyogZGdyYW0gYnVpbHRpbnMgYXJlIG5vbi1mb3JraW5nIC0gRE9OVCBCTE9DSyEgKi8KKwlsc2EtPmxlbiA9IHNlcC0+c2VfbHNhLT5sZW47CisJaWYgKHJlY3Zmcm9tKHMsIHRleHQsIHNpemVvZih0ZXh0KSwgTVNHX0RPTlRXQUlULCAmbHNhLT51LnNhLCAmbHNhLT5sZW4pIDwgMCkKKwkJcmV0dXJuOworCisJaWYgKCFlbmRfcmluZykgeworCQlpbml0X3JpbmcoKTsKKwkJcmluZ19wb3MgPSByaW5nOworCX0KKworCWxlbiA9IGVuZF9yaW5nIC0gcmluZ19wb3M7CisJaWYgKGxlbiA+PSBMSU5FU0laKQorCQltZW1tb3ZlKHRleHQsIHJpbmdfcG9zLCBMSU5FU0laKTsKKwllbHNlIHsKKwkJbWVtbW92ZSh0ZXh0LCByaW5nX3BvcywgbGVuKTsKKwkJbWVtbW92ZSh0ZXh0ICsgbGVuLCByaW5nLCBMSU5FU0laIC0gbGVuKTsKKwl9CisJaWYgKCsrcmluZ19wb3MgPT0gZW5kX3JpbmcpCisJCXJpbmdfcG9zID0gcmluZzsKKwl0ZXh0W0xJTkVTSVpdID0gJ1xyJzsKKwl0ZXh0W0xJTkVTSVogKyAxXSA9ICdcbic7CisJc2VuZHRvKHMsIHRleHQsIHNpemVvZih0ZXh0KSwgMCwgJmxzYS0+dS5zYSwgbHNhLT5sZW4pOworfQorI2VuZGlmIC8qIEZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX0NIQVJHRU4gKi8KKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSU5FVERfU1VQUE9SVF9CVUlMVElOX1RJTUUKKy8qCisgKiBSZXR1cm4gYSBtYWNoaW5lIHJlYWRhYmxlIGRhdGUgYW5kIHRpbWUsIGluIHRoZSBmb3JtIG9mIHRoZQorICogbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgbWlkbmlnaHQsIEphbiAxLCAxOTAwLiAgU2luY2UgZ2V0dGltZW9mZGF5CisgKiByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBtaWRuaWdodCwgSmFuIDEsIDE5NzAsCisgKiB3ZSBtdXN0IGFkZCAyMjA4OTg4ODAwIHNlY29uZHMgdG8gdGhpcyBmaWd1cmUgdG8gbWFrZSB1cCBmb3IKKyAqIHNvbWUgc2V2ZW50eSB5ZWFycyBCZWxsIExhYnMgd2FzIGFzbGVlcC4KKyAqLworc3RhdGljIHVpbnQzMl90IG1hY2h0aW1lKHZvaWQpCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwlyZXR1cm4gaHRvbmwoKHVpbnQzMl90KSh0di50dl9zZWMgKyAyMjA4OTg4ODAwKSk7Cit9CisvKiBBUkdTVVNFRCAqLworc3RhdGljIHZvaWQgRkFTVF9GVU5DIG1hY2h0aW1lX3N0cmVhbShpbnQgcywgc2VydnRhYl90ICpzZXAgVU5VU0VEX1BBUkFNKQoreworCXVpbnQzMl90IHJlc3VsdDsKKworCXJlc3VsdCA9IG1hY2h0aW1lKCk7CisJZnVsbF93cml0ZShzLCAmcmVzdWx0LCBzaXplb2YocmVzdWx0KSk7Cit9CitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgbWFjaHRpbWVfZGcoaW50IHMsIHNlcnZ0YWJfdCAqc2VwKQoreworCXVpbnQzMl90IHJlc3VsdDsKKwlsZW5fYW5kX3NvY2thZGRyICpsc2EgPSBhbGxvY2EoTFNBX0xFTl9TSVpFICsgc2VwLT5zZV9sc2EtPmxlbik7CisKKwlsc2EtPmxlbiA9IHNlcC0+c2VfbHNhLT5sZW47CisJaWYgKHJlY3Zmcm9tKHMsIGxpbmUsIExJTkVfU0laRSwgTVNHX0RPTlRXQUlULCAmbHNhLT51LnNhLCAmbHNhLT5sZW4pIDwgMCkKKwkJcmV0dXJuOworCisJcmVzdWx0ID0gbWFjaHRpbWUoKTsKKwlzZW5kdG8ocywgJnJlc3VsdCwgc2l6ZW9mKHJlc3VsdCksIDAsICZsc2EtPnUuc2EsIGxzYS0+bGVuKTsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9USU1FICovCisKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9EQVlUSU1FCisvKiBSZXR1cm4gaHVtYW4tcmVhZGFibGUgdGltZSBvZiBkYXkgKi8KKy8qIEFSR1NVU0VEICovCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgZGF5dGltZV9zdHJlYW0oaW50IHMsIHNlcnZ0YWJfdCAqc2VwIFVOVVNFRF9QQVJBTSkKK3sKKwl0aW1lX3QgdDsKKworCXRpbWUoJnQpOworCWZkcHJpbnRmKHMsICIlLjI0c1xyXG4iLCBjdGltZSgmdCkpOworfQorc3RhdGljIHZvaWQgRkFTVF9GVU5DIGRheXRpbWVfZGcoaW50IHMsIHNlcnZ0YWJfdCAqc2VwKQoreworCXRpbWVfdCB0OworCWxlbl9hbmRfc29ja2FkZHIgKmxzYSA9IGFsbG9jYShMU0FfTEVOX1NJWkUgKyBzZXAtPnNlX2xzYS0+bGVuKTsKKworCWxzYS0+bGVuID0gc2VwLT5zZV9sc2EtPmxlbjsKKwlpZiAocmVjdmZyb20ocywgbGluZSwgTElORV9TSVpFLCBNU0dfRE9OVFdBSVQsICZsc2EtPnUuc2EsICZsc2EtPmxlbikgPCAwKQorCQlyZXR1cm47CisKKwl0ID0gdGltZShOVUxMKTsKKwlzcHJpbnRmKGxpbmUsICIlLjI0c1xyXG4iLCBjdGltZSgmdCkpOworCXNlbmR0byhzLCBsaW5lLCBzdHJsZW4obGluZSksIDAsICZsc2EtPnUuc2EsIGxzYS0+bGVuKTsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX0lORVREX1NVUFBPUlRfQlVJTFRJTl9EQVlUSU1FICovCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2ludGVyZmFjZS5jIGIvbmV0d29ya2luZy9pbnRlcmZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGJkMTNjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9pbnRlcmZhY2UuYwpAQCAtMCwwICsxLDExNjUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHN0b2xlbiBmcm9tIG5ldC10b29scy0xLjU5IGFuZCBzdHJpcHBlZCBkb3duIGZvciBidXN5Ym94IGJ5CisgKgkJCUVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBIZWF2aWx5IG1vZGlmaWVkIGJ5IE1hbnVlbCBOb3ZvYSBJSUkgICAgICAgTWFyIDEyLCAyMDAxCisgKgorICogQWRkZWQgcHJpbnRfYnl0ZXNfc2NhbGVkIGZ1bmN0aW9uIHRvIHJlZHVjZSBjb2RlIHNpemUuCisgKiBBZGRlZCBzb21lIChwb3RlbnRpYWxseSkgbWlzc2luZyBkZWZpbmVzLgorICogSW1wcm92ZWQgZGlzcGxheSBzdXBwb3J0IGZvciAtYSBhbmQgZm9yIGEgbmFtZWQgaW50ZXJmYWNlLgorICoKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogaWZjb25maWcgICBUaGlzIGZpbGUgY29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGNvbW1hbmQKKyAqICAgICAgICAgICAgICB0aGF0IGVpdGhlciBkaXNwbGF5cyBvciBzZXRzIHRoZSBjaGFyYWN0ZXJpc3RpY3Mgb2YKKyAqICAgICAgICAgICAgICBvbmUgb3IgbW9yZSBvZiB0aGUgc3lzdGVtJ3MgbmV0d29ya2luZyBpbnRlcmZhY2VzLgorICoKKyAqCisgKiBBdXRob3I6ICAgICAgRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHV3YWx0Lm5sLm11Z25ldC5vcmc+CisgKiAgICAgICAgICAgICAgYW5kIG90aGVycy4gIENvcHlyaWdodCAxOTkzIE1pY3JvV2FsdCBDb3Jwb3JhdGlvbgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogUGF0Y2hlZCB0byBzdXBwb3J0ICdhZGQnIGFuZCAnZGVsJyBrZXl3b3JkcyBmb3IgSU5FVCg0KSBhZGRyZXNzZXMKKyAqIGJ5IE1ycy4gQnJpc2J5IDxtcnMuYnJpc2J5QG5pbWgub3JnPgorICoKKyAqIHsxLjM0fSAtIDE5OTgwNjMwIC0gQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgKiAgICAgICAgICAgICAgICAgICAgIC0gZ2V0dGV4dCBpbnN0ZWFkIG9mIGNhdGdldHMgZm9yIGkxOG4KKyAqICAgICAgICAgIDEwLzE5OTggIC0gQW5kaSBLbGVlbi4gVXNlIGludGVyZmFjZSBsaXN0IHByaW1pdGl2ZXMuCisgKiAgICAgICAgICAyMDAwMTAwOCAtIEJlcm5kIEVja2VuZmVscywgUGF0Y2ggZnJvbSBSSCBmb3Igc2V0dGluZyBtdHUKKyAqCQkJKGRlZmF1bHQgQUYgd2FzIHdyb25nKQorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImluZXRfY29tbW9uLmgiCisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0L2lmX2FycC5oPgorI2lmZGVmIEhBVkVfTkVUX0VUSEVSTkVUX0gKKyMgaW5jbHVkZSA8bmV0L2V0aGVybmV0Lmg+CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0hXSUIKKy8qICNpbmNsdWRlIDxsaW51eC9pZl9pbmZpbmliYW5kLmg+ICovCisjIHVuZGVmIElORklOSUJBTkRfQUxFTgorIyBkZWZpbmUgSU5GSU5JQkFORF9BTEVOIDIwCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKyMgZGVmaW5lIEhBVkVfQUZJTkVUNiAxCisjZWxzZQorIyB1bmRlZiBIQVZFX0FGSU5FVDYKKyNlbmRpZgorCisjZGVmaW5lIF9QQVRIX1BST0NORVRfREVWICAgICAgICAgICAgICAgIi9wcm9jL25ldC9kZXYiCisjZGVmaW5lIF9QQVRIX1BST0NORVRfSUZJTkVUNiAgICAgICAgICAgIi9wcm9jL25ldC9pZl9pbmV0NiIKKworI2lmZGVmIEhBVkVfQUZJTkVUNgorIyBpZm5kZWYgX0xJTlVYX0lONl9ICisvKgorICogVGhpcyBpcyBmcm9tIGxpbnV4L2luY2x1ZGUvbmV0L2lwdjYuaAorICovCitzdHJ1Y3QgaW42X2lmcmVxIHsKKwlzdHJ1Y3QgaW42X2FkZHIgaWZyNl9hZGRyOworCXVpbnQzMl90IGlmcjZfcHJlZml4bGVuOworCXVuc2lnbmVkIGludCBpZnI2X2lmaW5kZXg7Cit9OworIyBlbmRpZgorI2VuZGlmIC8qIEhBVkVfQUZJTkVUNiAqLworCisvKiBEZWZpbmVzIGZvciBnbGliYzIuMCB1c2Vycy4gKi8KKyNpZm5kZWYgU0lPQ1NJRlRYUUxFTgorIyBkZWZpbmUgU0lPQ1NJRlRYUUxFTiAgICAgIDB4ODk0MworIyBkZWZpbmUgU0lPQ0dJRlRYUUxFTiAgICAgIDB4ODk0MgorI2VuZGlmCisKKy8qIGlmcl9xbGVuIGlzIGlmcnVfaXZhbHVlLCBidXQgaXQgaXNuJ3QgcHJlc2VudCBpbiAyLjAga2VybmVsIGhlYWRlcnMgKi8KKyNpZm5kZWYgaWZyX3FsZW4KKyMgZGVmaW5lIGlmcl9xbGVuICAgICAgICBpZnJfaWZydS5pZnJ1X210dQorI2VuZGlmCisKKyNpZm5kZWYgSEFWRV9UWFFVRVVFTEVOCisjIGRlZmluZSBIQVZFX1RYUVVFVUVMRU4gMQorI2VuZGlmCisKKyNpZm5kZWYgSUZGX0RZTkFNSUMKKyMgZGVmaW5lIElGRl9EWU5BTUlDICAgICAweDgwMDAgLyogZGlhbHVwIGRldmljZSB3aXRoIGNoYW5naW5nIGFkZHJlc3NlcyAqLworI2VuZGlmCisKKy8qIERpc3BsYXkgYW4gSW50ZXJuZXQgc29ja2V0IGFkZHJlc3MuICovCitzdGF0aWMgY29uc3QgY2hhciogRkFTVF9GVU5DIElORVRfc3ByaW50KHN0cnVjdCBzb2NrYWRkciAqc2FwLCBpbnQgbnVtZXJpYykKK3sKKwlpZiAoc2FwLT5zYV9mYW1pbHkgPT0gMHhGRkZGIHx8IHNhcC0+c2FfZmFtaWx5ID09IDApCisJCXJldHVybiAiW05PTkUgU0VUXSI7CisJcmV0dXJuIGF1dG9fc3RyaW5nKElORVRfcnJlc29sdmUoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBzYXAsIG51bWVyaWMsIDB4ZmZmZmZmMDApKTsKK30KKworI2lmZGVmIFVOVVNFRF9BTkRfQlVHR1kKK3N0YXRpYyBpbnQgSU5FVF9nZXRzb2NrKGNoYXIgKmJ1ZnAsIHN0cnVjdCBzb2NrYWRkciAqc2FwKQoreworCWNoYXIgKnNwID0gYnVmcCwgKmJwOworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIHZhbDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNvY2tfaW47CisKKwlzb2NrX2luID0gKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBzYXA7CisJc29ja19pbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc29ja19pbi0+c2luX3BvcnQgPSAwOworCisJdmFsID0gMDsKKwlicCA9IChjaGFyICopICZ2YWw7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzb2NrX2luLT5zaW5fYWRkci5zX2FkZHIpOyBpKyspIHsKKwkJKnNwID0gdG91cHBlcigqc3ApOworCisJCWlmICgodW5zaWduZWQpKCpzcCAtICdBJykgPD0gNSkKKwkJCWJwW2ldIHw9IChpbnQpICgqc3AgLSAoJ0EnIC0gMTApKTsKKwkJZWxzZSBpZiAoaXNkaWdpdCgqc3ApKQorCQkJYnBbaV0gfD0gKGludCkgKCpzcCAtICcwJyk7CisJCWVsc2UKKwkJCXJldHVybiAtMTsKKworCQlicFtpXSA8PD0gNDsKKwkJc3ArKzsKKwkJKnNwID0gdG91cHBlcigqc3ApOworCisJCWlmICgodW5zaWduZWQpKCpzcCAtICdBJykgPD0gNSkKKwkJCWJwW2ldIHw9IChpbnQpICgqc3AgLSAoJ0EnIC0gMTApKTsKKwkJZWxzZSBpZiAoaXNkaWdpdCgqc3ApKQorCQkJYnBbaV0gfD0gKGludCkgKCpzcCAtICcwJyk7CisJCWVsc2UKKwkJCXJldHVybiAtMTsKKworCQlzcCsrOworCX0KKwlzb2NrX2luLT5zaW5fYWRkci5zX2FkZHIgPSBodG9ubCh2YWwpOworCisJcmV0dXJuIChzcCAtIGJ1ZnApOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIElORVRfaW5wdXQoLyppbnQgdHlwZSwqLyBjb25zdCBjaGFyICpidWZwLCBzdHJ1Y3Qgc29ja2FkZHIgKnNhcCkKK3sKKwlyZXR1cm4gSU5FVF9yZXNvbHZlKGJ1ZnAsIChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgc2FwLCAwKTsKKy8qCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSAxOgorCQlyZXR1cm4gKElORVRfZ2V0c29jayhidWZwLCBzYXApKTsKKwljYXNlIDI1NjoKKwkJcmV0dXJuIChJTkVUX3Jlc29sdmUoYnVmcCwgKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSBzYXAsIDEpKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gKElORVRfcmVzb2x2ZShidWZwLCAoc3RydWN0IHNvY2thZGRyX2luICopIHNhcCwgMCkpOworCX0KKyovCit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZ0eXBlIGluZXRfYWZ0eXBlID0geworCS5uYW1lICAgPSAiaW5ldCIsCisJLnRpdGxlICA9ICJEQVJQQSBJbnRlcm5ldCIsCisJLmFmICAgICA9IEFGX0lORVQsCisJLmFsZW4gICA9IDQsCisJLnNwcmludCA9IElORVRfc3ByaW50LAorCS5pbnB1dCAgPSBJTkVUX2lucHV0LAorfTsKKworI2lmZGVmIEhBVkVfQUZJTkVUNgorCisvKiBEaXNwbGF5IGFuIEludGVybmV0IHNvY2tldCBhZGRyZXNzLiAqLworLyogZGlydHkhIHN0cnVjdCBzb2NrYWRkciB1c3VhbGx5IGRvZXNuJ3Qgc3VmZmVyIGZvciBpbmV0NiBhZGRyZXNzZXMsIGZzdC4gKi8KK3N0YXRpYyBjb25zdCBjaGFyKiBGQVNUX0ZVTkMgSU5FVDZfc3ByaW50KHN0cnVjdCBzb2NrYWRkciAqc2FwLCBpbnQgbnVtZXJpYykKK3sKKwlpZiAoc2FwLT5zYV9mYW1pbHkgPT0gMHhGRkZGIHx8IHNhcC0+c2FfZmFtaWx5ID09IDApCisJCXJldHVybiAiW05PTkUgU0VUXSI7CisJcmV0dXJuIGF1dG9fc3RyaW5nKElORVQ2X3JyZXNvbHZlKChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIHNhcCwgbnVtZXJpYykpOworfQorCisjaWZkZWYgVU5VU0VECitzdGF0aWMgaW50IElORVQ2X2dldHNvY2soY2hhciAqYnVmcCwgc3RydWN0IHNvY2thZGRyICpzYXApCit7CisJc3RydWN0IHNvY2thZGRyX2luNiAqc2luNjsKKworCXNpbjYgPSAoc3RydWN0IHNvY2thZGRyX2luNiAqKSBzYXA7CisJc2luNi0+c2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKwlzaW42LT5zaW42X3BvcnQgPSAwOworCisJaWYgKGluZXRfcHRvbihBRl9JTkVUNiwgYnVmcCwgc2luNi0+c2luNl9hZGRyLnM2X2FkZHIpIDw9IDApCisJCXJldHVybiAtMTsKKworCXJldHVybiAxNjsJCQkvKiA/OykgKi8KK30KKyNlbmRpZgorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBJTkVUNl9pbnB1dCgvKmludCB0eXBlLCovIGNvbnN0IGNoYXIgKmJ1ZnAsIHN0cnVjdCBzb2NrYWRkciAqc2FwKQoreworCXJldHVybiBJTkVUNl9yZXNvbHZlKGJ1ZnAsIChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopIHNhcCk7CisvKgorCXN3aXRjaCAodHlwZSkgeworCWNhc2UgMToKKwkJcmV0dXJuIChJTkVUNl9nZXRzb2NrKGJ1ZnAsIHNhcCkpOworCWRlZmF1bHQ6CisJCXJldHVybiAoSU5FVDZfcmVzb2x2ZShidWZwLCAoc3RydWN0IHNvY2thZGRyX2luNiAqKSBzYXApKTsKKwl9CisqLworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGFmdHlwZSBpbmV0Nl9hZnR5cGUgPSB7CisJLm5hbWUgICA9ICJpbmV0NiIsCisJLnRpdGxlICA9ICJJUHY2IiwKKwkuYWYgICAgID0gQUZfSU5FVDYsCisJLmFsZW4gICA9IHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpLAorCS5zcHJpbnQgPSBJTkVUNl9zcHJpbnQsCisJLmlucHV0ICA9IElORVQ2X2lucHV0LAorfTsKKworI2VuZGlmIC8qIEhBVkVfQUZJTkVUNiAqLworCisvKiBEaXNwbGF5IGFuIFVOU1BFQyBhZGRyZXNzLiAqLworc3RhdGljIGNoYXIqIEZBU1RfRlVOQyBVTlNQRUNfcHJpbnQodW5zaWduZWQgY2hhciAqcHRyKQoreworCWNoYXIgKmJ1ZmY7CisJY2hhciAqcG9zOworCXVuc2lnbmVkIGludCBpOworCisJYnVmZiA9IGF1dG9fc3RyaW5nKHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikgKiAzICsgMSkpOworCXBvcyA9IGJ1ZmY7CisJZm9yIChpID0gMDsgaSA8IHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpOyBpKyspIHsKKwkJLyogY2FyZWZ1bCAtLSBub3QgZXZlcnkgbGliYydzIHNwcmludGYgcmV0dXJucyAjIGJ5dGVzIHdyaXR0ZW4gKi8KKwkJc3ByaW50Zihwb3MsICIlMDJYLSIsICgqcHRyKysgJiAwMzc3KSk7CisJCXBvcyArPSAzOworCX0KKwkvKiBFcmFzZSB0cmFpbGluZyAiLSIuICBXb3JrcyBhcyBsb25nIGFzIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpICE9IDAgKi8KKwkqLS1wb3MgPSAnXDAnOworCXJldHVybiBidWZmOworfQorCisvKiBEaXNwbGF5IGFuIFVOU1BFQyBzb2NrZXQgYWRkcmVzcy4gKi8KK3N0YXRpYyBjb25zdCBjaGFyKiBGQVNUX0ZVTkMgVU5TUEVDX3NwcmludChzdHJ1Y3Qgc29ja2FkZHIgKnNhcCwgaW50IG51bWVyaWMgVU5VU0VEX1BBUkFNKQoreworCWlmIChzYXAtPnNhX2ZhbWlseSA9PSAweEZGRkYgfHwgc2FwLT5zYV9mYW1pbHkgPT0gMCkKKwkJcmV0dXJuICJbTk9ORSBTRVRdIjsKKwlyZXR1cm4gVU5TUEVDX3ByaW50KCh1bnNpZ25lZCBjaGFyICopc2FwLT5zYV9kYXRhKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBhZnR5cGUgdW5zcGVjX2FmdHlwZSA9IHsKKwkubmFtZSAgID0gInVuc3BlYyIsCisJLnRpdGxlICA9ICJVTlNQRUMiLAorCS5hZiAgICAgPSBBRl9VTlNQRUMsCisJLmFsZW4gICA9IDAsCisJLnByaW50ICA9IFVOU1BFQ19wcmludCwKKwkuc3ByaW50ID0gVU5TUEVDX3NwcmludCwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZ0eXBlICpjb25zdCBhZnR5cGVzW10gPSB7CisJJmluZXRfYWZ0eXBlLAorI2lmZGVmIEhBVkVfQUZJTkVUNgorCSZpbmV0Nl9hZnR5cGUsCisjZW5kaWYKKwkmdW5zcGVjX2FmdHlwZSwKKwlOVUxMCit9OworCisvKiBDaGVjayBvdXIgcHJvdG9jb2wgZmFtaWx5IHRhYmxlIGZvciB0aGlzIGZhbWlseS4gKi8KK2NvbnN0IHN0cnVjdCBhZnR5cGUqIEZBU1RfRlVOQyBnZXRfYWZ0eXBlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY29uc3Qgc3RydWN0IGFmdHlwZSAqY29uc3QgKmFmcDsKKworCWFmcCA9IGFmdHlwZXM7CisJd2hpbGUgKCphZnAgIT0gTlVMTCkgeworCQlpZiAoIXN0cmNtcCgoKmFmcCktPm5hbWUsIG5hbWUpKQorCQkJcmV0dXJuICgqYWZwKTsKKwkJYWZwKys7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBDaGVjayBvdXIgcHJvdG9jb2wgZmFtaWx5IHRhYmxlIGZvciB0aGlzIGZhbWlseS4gKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgYWZ0eXBlICpnZXRfYWZudHlwZShpbnQgYWYpCit7CisJY29uc3Qgc3RydWN0IGFmdHlwZSAqY29uc3QgKmFmcDsKKworCWFmcCA9IGFmdHlwZXM7CisJd2hpbGUgKCphZnAgIT0gTlVMTCkgeworCQlpZiAoKCphZnApLT5hZiA9PSBhZikKKwkJCXJldHVybiAqYWZwOworCQlhZnArKzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCB1c2VyX25ldF9kZXZpY2Vfc3RhdHMgeworCXVuc2lnbmVkIGxvbmcgbG9uZyByeF9wYWNrZXRzOwkvKiB0b3RhbCBwYWNrZXRzIHJlY2VpdmVkICAgICAgICovCisJdW5zaWduZWQgbG9uZyBsb25nIHR4X3BhY2tldHM7CS8qIHRvdGFsIHBhY2tldHMgdHJhbnNtaXR0ZWQgICAgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgcnhfYnl0ZXM7CS8qIHRvdGFsIGJ5dGVzIHJlY2VpdmVkICAgICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgdHhfYnl0ZXM7CS8qIHRvdGFsIGJ5dGVzIHRyYW5zbWl0dGVkICAgICAgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2Vycm9yczsJLyogYmFkIHBhY2tldHMgcmVjZWl2ZWQgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgdHhfZXJyb3JzOwkvKiBwYWNrZXQgdHJhbnNtaXQgcHJvYmxlbXMgICAgICovCisJdW5zaWduZWQgbG9uZyByeF9kcm9wcGVkOwkvKiBubyBzcGFjZSBpbiBsaW51eCBidWZmZXJzICAgICovCisJdW5zaWduZWQgbG9uZyB0eF9kcm9wcGVkOwkvKiBubyBzcGFjZSBhdmFpbGFibGUgaW4gbGludXggICovCisJdW5zaWduZWQgbG9uZyByeF9tdWx0aWNhc3Q7CS8qIG11bHRpY2FzdCBwYWNrZXRzIHJlY2VpdmVkICAgKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2NvbXByZXNzZWQ7CisJdW5zaWduZWQgbG9uZyB0eF9jb21wcmVzc2VkOworCXVuc2lnbmVkIGxvbmcgY29sbGlzaW9uczsKKworCS8qIGRldGFpbGVkIHJ4X2Vycm9yczogKi8KKwl1bnNpZ25lZCBsb25nIHJ4X2xlbmd0aF9lcnJvcnM7CisJdW5zaWduZWQgbG9uZyByeF9vdmVyX2Vycm9yczsJLyogcmVjZWl2ZXIgcmluZyBidWZmIG92ZXJmbG93ICAqLworCXVuc2lnbmVkIGxvbmcgcnhfY3JjX2Vycm9yczsJLyogcmVjdmVkIHBrdCB3aXRoIGNyYyBlcnJvciAgICAqLworCXVuc2lnbmVkIGxvbmcgcnhfZnJhbWVfZXJyb3JzOwkvKiByZWN2J2QgZnJhbWUgYWxpZ25tZW50IGVycm9yICovCisJdW5zaWduZWQgbG9uZyByeF9maWZvX2Vycm9yczsJLyogcmVjdidyIGZpZm8gb3ZlcnJ1biAgICAgICAgICAqLworCXVuc2lnbmVkIGxvbmcgcnhfbWlzc2VkX2Vycm9yczsJLyogcmVjZWl2ZXIgbWlzc2VkIHBhY2tldCAgICAgKi8KKwkvKiBkZXRhaWxlZCB0eF9lcnJvcnMgKi8KKwl1bnNpZ25lZCBsb25nIHR4X2Fib3J0ZWRfZXJyb3JzOworCXVuc2lnbmVkIGxvbmcgdHhfY2Fycmllcl9lcnJvcnM7CisJdW5zaWduZWQgbG9uZyB0eF9maWZvX2Vycm9yczsKKwl1bnNpZ25lZCBsb25nIHR4X2hlYXJ0YmVhdF9lcnJvcnM7CisJdW5zaWduZWQgbG9uZyB0eF93aW5kb3dfZXJyb3JzOworfTsKKworc3RydWN0IGludGVyZmFjZSB7CisJc3RydWN0IGludGVyZmFjZSAqbmV4dCwgKnByZXY7CisJY2hhciBuYW1lW0lGTkFNU0laXTsgICAgICAgICAgICAgICAgICAgIC8qIGludGVyZmFjZSBuYW1lICAgICAgICAqLworCXNob3J0IHR5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpZiB0eXBlICAgICAgICAgICAgICAgKi8KKwlzaG9ydCBmbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdmFyaW91cyBmbGFncyAgICAgICAgICovCisJaW50IG1ldHJpYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHJvdXRpbmcgbWV0cmljICAgICAgICAqLworCWludCBtdHU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNVFUgdmFsdWUgICAgICAgICAgICAgKi8KKwlpbnQgdHhfcXVldWVfbGVuOyAgICAgICAgICAgICAgICAgICAgICAgLyogdHJhbnNtaXQgcXVldWUgbGVuZ3RoICovCisJc3RydWN0IGlmbWFwIG1hcDsgICAgICAgICAgICAgICAgICAgICAgIC8qIGhhcmR3YXJlIHNldHVwICAgICAgICAqLworCXN0cnVjdCBzb2NrYWRkciBhZGRyOyAgICAgICAgICAgICAgICAgICAvKiBJUCBhZGRyZXNzICAgICAgICAgICAgKi8KKwlzdHJ1Y3Qgc29ja2FkZHIgZHN0YWRkcjsgICAgICAgICAgICAgICAgLyogUC1QIElQIGFkZHJlc3MgICAgICAgICovCisJc3RydWN0IHNvY2thZGRyIGJyb2FkYWRkcjsgICAgICAgICAgICAgIC8qIElQIGJyb2FkY2FzdCBhZGRyZXNzICAqLworCXN0cnVjdCBzb2NrYWRkciBuZXRtYXNrOyAgICAgICAgICAgICAgICAvKiBJUCBuZXR3b3JrIG1hc2sgICAgICAgKi8KKwlpbnQgaGFzX2lwOworCWNoYXIgaHdhZGRyWzMyXTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBIVyBhZGRyZXNzICAgICAgICAgICAgKi8KKwlpbnQgc3RhdGlzdGljc192YWxpZDsKKwlzdHJ1Y3QgdXNlcl9uZXRfZGV2aWNlX3N0YXRzIHN0YXRzOyAgICAgLyogc3RhdGlzdGljcyAgICAgICAgICAgICovCisJaW50IGtlZXBhbGl2ZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGtlZXBhbGl2ZSB2YWx1ZSBmb3IgU0xJUCAqLworCWludCBvdXRmaWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXRmaWxsIHZhbHVlIGZvciBTTElQICovCit9OworCisKK3NtYWxsaW50IGludGVyZmFjZV9vcHRfYTsJLyogc2hvdyBhbGwgaW50ZXJmYWNlcyAqLworCitzdGF0aWMgc3RydWN0IGludGVyZmFjZSAqaW50X2xpc3QsICppbnRfbGFzdDsKKworCisjaWYgMAorLyogbGlrZSBzdHJjbXAoKSwgYnV0IGtub3dzIGFib3V0IG51bWJlcnMgKi8KK2V4Y2VwdCB0aGF0IHRoZSBmcmVzaGx5IGFkZGVkIGNhbGxzIHRvIHhhdG91bCgpIGJyZiBvbiBldGhlcm5ldCBhbGlhc2VzIHdpdGgKK3VDbGliYyB3aXRoIGUuZy46IGlmZS0+bmFtZT0nbG8nICBuYW1lPSdldGgwOjEnCitzdGF0aWMgaW50IG5zdHJjbXAoY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYikKK3sKKwljb25zdCBjaGFyICphX3B0ciA9IGE7CisJY29uc3QgY2hhciAqYl9wdHIgPSBiOworCisJd2hpbGUgKCphID09ICpiKSB7CisJCWlmICgqYSA9PSAnXDAnKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIWlzZGlnaXQoKmEpICYmIGlzZGlnaXQoKihhKzEpKSkgeworCQkJYV9wdHIgPSBhKzE7CisJCQliX3B0ciA9IGIrMTsKKwkJfQorCQlhKys7CisJCWIrKzsKKwl9CisKKwlpZiAoaXNkaWdpdCgqYSkgJiYgaXNkaWdpdCgqYikpIHsKKwkJcmV0dXJuIHhhdG91bChhX3B0cikgPiB4YXRvdWwoYl9wdHIpID8gMSA6IC0xOworCX0KKwlyZXR1cm4gKmEgLSAqYjsKK30KKyNlbmRpZgorCitzdGF0aWMgc3RydWN0IGludGVyZmFjZSAqYWRkX2ludGVyZmFjZShjaGFyICpuYW1lKQoreworCXN0cnVjdCBpbnRlcmZhY2UgKmlmZSwgKipuZXh0cCwgKm5ldzsKKworCWZvciAoaWZlID0gaW50X2xhc3Q7IGlmZTsgaWZlID0gaWZlLT5wcmV2KSB7CisJCWludCBuID0gLypuKi9zdHJjbXAoaWZlLT5uYW1lLCBuYW1lKTsKKworCQlpZiAobiA9PSAwKQorCQkJcmV0dXJuIGlmZTsKKwkJaWYgKG4gPCAwKQorCQkJYnJlYWs7CisJfQorCisJbmV3ID0geHphbGxvYyhzaXplb2YoKm5ldykpOworCXN0cm5jcHlfSUZOQU1TSVoobmV3LT5uYW1lLCBuYW1lKTsKKwluZXh0cCA9IGlmZSA/ICZpZmUtPm5leHQgOiAmaW50X2xpc3Q7CisJbmV3LT5wcmV2ID0gaWZlOworCW5ldy0+bmV4dCA9ICpuZXh0cDsKKwlpZiAobmV3LT5uZXh0KQorCQluZXctPm5leHQtPnByZXYgPSBuZXc7CisJZWxzZQorCQlpbnRfbGFzdCA9IG5ldzsKKwkqbmV4dHAgPSBuZXc7CisJcmV0dXJuIG5ldzsKK30KKworc3RhdGljIGNoYXIgKmdldF9uYW1lKGNoYXIgKm5hbWUsIGNoYXIgKnApCit7CisJLyogRXh0cmFjdCA8bmFtZT4gZnJvbSBudWwtdGVybWluYXRlZCBwIHdoZXJlIHAgbWF0Y2hlcworCSAqIDxuYW1lPjogYWZ0ZXIgbGVhZGluZyB3aGl0ZXNwYWNlLgorCSAqIElmIG1hdGNoIGlzIG5vdCBtYWRlLCBzZXQgbmFtZSBlbXB0eSBhbmQgcmV0dXJuIHVuY2hhbmdlZCBwCisJICovCisJY2hhciAqbmFtZWVuZDsKKwljaGFyICpuYW1lc3RhcnQgPSBza2lwX3doaXRlc3BhY2UocCk7CisKKwluYW1lZW5kID0gbmFtZXN0YXJ0OworCXdoaWxlICgqbmFtZWVuZCAmJiAqbmFtZWVuZCAhPSAnOicgJiYgIWlzc3BhY2UoKm5hbWVlbmQpKQorCQluYW1lZW5kKys7CisJaWYgKCpuYW1lZW5kID09ICc6JykgeworCQlpZiAoKG5hbWVlbmQgLSBuYW1lc3RhcnQpIDwgSUZOQU1TSVopIHsKKwkJCW1lbWNweShuYW1lLCBuYW1lc3RhcnQsIG5hbWVlbmQgLSBuYW1lc3RhcnQpOworCQkJbmFtZVtuYW1lZW5kIC0gbmFtZXN0YXJ0XSA9ICdcMCc7CisJCQlwID0gbmFtZWVuZDsKKwkJfSBlbHNlIHsKKwkJCS8qIEludGVyZmFjZSBuYW1lIHRvbyBsYXJnZSAqLworCQkJbmFtZVswXSA9ICdcMCc7CisJCX0KKwl9IGVsc2UgeworCQkvKiB0cmFpbGluZyAnOicgbm90IGZvdW5kIC0gcmV0dXJuIGVtcHR5ICovCisJCW5hbWVbMF0gPSAnXDAnOworCX0KKwlyZXR1cm4gcCArIDE7Cit9CisKKy8qIElmIHNjYW5mIHN1cHBvcnRzIHNpemUgcXVhbGlmaWVycyBmb3IgJW4gY29udmVyc2lvbnMsIHRoZW4gd2UgY2FuCisgKiB1c2UgYSBtb2RpZmllZCBmbXQgdGhhdCBzaW1wbHkgc3RvcmVzIHRoZSBwb3NpdGlvbiBpbiB0aGUgZmllbGRzCisgKiBoYXZpbmcgbm8gYXNzb2NpYXRlZCBmaWVsZHMgaW4gdGhlIHByb2Mgc3RyaW5nLiAgT2YgY291cnNlLCB3ZSBuZWVkCisgKiB0byB6ZXJvIHRoZW0gYWdhaW4gd2hlbiB3ZSdyZSBkb25lLiAgQnV0IHRoYXQgaXMgc21hbGxlciB0aGFuIHRoZQorICogb2xkIGFwcHJvYWNoIG9mIG11bHRpcGxlIHNjYW5mIG9jY3VycmVuY2VzIHdpdGggbGFyZ2UgbnVtYmVycyBvZgorICogYXJncy4gKi8KKworLyogc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNzX2ZtdFtdID0geyAqLworLyoJIiVsbG4lbGx1JWx1JWx1JWx1JWx1JWxuJWxuJWxsbiVsbHUlbHUlbHUlbHUlbHUlbHUiLCAqLworLyoJIiVsbHUlbGx1JWx1JWx1JWx1JWx1JWxuJWxuJWxsdSVsbHUlbHUlbHUlbHUlbHUlbHUiLCAqLworLyoJIiVsbHUlbGx1JWx1JWx1JWx1JWx1JWx1JWx1JWxsdSVsbHUlbHUlbHUlbHUlbHUlbHUlbHUiICovCisvKiB9OyAqLworCisJLyogTGllIGFib3V0IHRoZSBzaXplIG9mIHRoZSBpbnQgcG9pbnRlZCB0byBmb3IgJW4uICovCisjaWYgSU5UX01BWCA9PSBMT05HX01BWAorc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNzX2ZtdFtdID0geworCSIlbiVsbHUldSV1JXUldSVuJW4lbiVsbHUldSV1JXUldSV1IiwKKwkiJWxsdSVsbHUldSV1JXUldSVuJW4lbGx1JWxsdSV1JXUldSV1JXUiLAorCSIlbGx1JWxsdSV1JXUldSV1JXUldSVsbHUlbGx1JXUldSV1JXUldSV1IgorfTsKKyNlbHNlCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc3NfZm10W10gPSB7CisJIiVuJWxsdSVsdSVsdSVsdSVsdSVuJW4lbiVsbHUlbHUlbHUlbHUlbHUlbHUiLAorCSIlbGx1JWxsdSVsdSVsdSVsdSVsdSVuJW4lbGx1JWxsdSVsdSVsdSVsdSVsdSVsdSIsCisJIiVsbHUlbGx1JWx1JWx1JWx1JWx1JWx1JWx1JWxsdSVsbHUlbHUlbHUlbHUlbHUlbHUlbHUiCit9OworCisjZW5kaWYKKworc3RhdGljIHZvaWQgZ2V0X2Rldl9maWVsZHMoY2hhciAqYnAsIHN0cnVjdCBpbnRlcmZhY2UgKmlmZSwgaW50IHByb2NuZXRkZXZfdnNuKQoreworCW1lbXNldCgmaWZlLT5zdGF0cywgMCwgc2l6ZW9mKHN0cnVjdCB1c2VyX25ldF9kZXZpY2Vfc3RhdHMpKTsKKworCXNzY2FuZihicCwgc3NfZm10W3Byb2NuZXRkZXZfdnNuXSwKKwkJICAgJmlmZS0+c3RhdHMucnhfYnl0ZXMsIC8qIG1pc3NpbmcgZm9yIDAgKi8KKwkJICAgJmlmZS0+c3RhdHMucnhfcGFja2V0cywKKwkJICAgJmlmZS0+c3RhdHMucnhfZXJyb3JzLAorCQkgICAmaWZlLT5zdGF0cy5yeF9kcm9wcGVkLAorCQkgICAmaWZlLT5zdGF0cy5yeF9maWZvX2Vycm9ycywKKwkJICAgJmlmZS0+c3RhdHMucnhfZnJhbWVfZXJyb3JzLAorCQkgICAmaWZlLT5zdGF0cy5yeF9jb21wcmVzc2VkLCAvKiBtaXNzaW5nIGZvciA8PSAxICovCisJCSAgICZpZmUtPnN0YXRzLnJ4X211bHRpY2FzdCwgLyogbWlzc2luZyBmb3IgPD0gMSAqLworCQkgICAmaWZlLT5zdGF0cy50eF9ieXRlcywgLyogbWlzc2luZyBmb3IgMCAqLworCQkgICAmaWZlLT5zdGF0cy50eF9wYWNrZXRzLAorCQkgICAmaWZlLT5zdGF0cy50eF9lcnJvcnMsCisJCSAgICZpZmUtPnN0YXRzLnR4X2Ryb3BwZWQsCisJCSAgICZpZmUtPnN0YXRzLnR4X2ZpZm9fZXJyb3JzLAorCQkgICAmaWZlLT5zdGF0cy5jb2xsaXNpb25zLAorCQkgICAmaWZlLT5zdGF0cy50eF9jYXJyaWVyX2Vycm9ycywKKwkJICAgJmlmZS0+c3RhdHMudHhfY29tcHJlc3NlZCAvKiBtaXNzaW5nIGZvciA8PSAxICovCisJCSAgICk7CisKKwlpZiAocHJvY25ldGRldl92c24gPD0gMSkgeworCQlpZiAocHJvY25ldGRldl92c24gPT0gMCkgeworCQkJaWZlLT5zdGF0cy5yeF9ieXRlcyA9IDA7CisJCQlpZmUtPnN0YXRzLnR4X2J5dGVzID0gMDsKKwkJfQorCQlpZmUtPnN0YXRzLnJ4X211bHRpY2FzdCA9IDA7CisJCWlmZS0+c3RhdHMucnhfY29tcHJlc3NlZCA9IDA7CisJCWlmZS0+c3RhdHMudHhfY29tcHJlc3NlZCA9IDA7CisJfQorfQorCitzdGF0aWMgaW50IHByb2NuZXRkZXZfdmVyc2lvbihjaGFyICpidWYpCit7CisJaWYgKHN0cnN0cihidWYsICJjb21wcmVzc2VkIikpCisJCXJldHVybiAyOworCWlmIChzdHJzdHIoYnVmLCAiYnl0ZXMiKSkKKwkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaWZfcmVhZGNvbmYodm9pZCkKK3sKKwlpbnQgbnVtcmVxcyA9IDMwOworCXN0cnVjdCBpZmNvbmYgaWZjOworCXN0cnVjdCBpZnJlcSAqaWZyOworCWludCBuLCBlcnIgPSAtMTsKKwlpbnQgc2tmZDsKKworCWlmYy5pZmNfYnVmID0gTlVMTDsKKworCS8qIFNJT0NHSUZDT05GIGN1cnJlbnRseSBzZWVtcyB0byBvbmx5IHdvcmsgcHJvcGVybHkgb24gQUZfSU5FVCBzb2NrZXRzCisJICAgKGFzIG9mIDIuMS4xMjgpICovCisJc2tmZCA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwlpZiAoc2tmZCA8IDApIHsKKwkJYmJfcGVycm9yX21zZygiZXJyb3I6IG5vIGluZXQgc29ja2V0IGF2YWlsYWJsZSIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm9yICg7OykgeworCQlpZmMuaWZjX2xlbiA9IHNpemVvZihzdHJ1Y3QgaWZyZXEpICogbnVtcmVxczsKKwkJaWZjLmlmY19idWYgPSB4cmVhbGxvYyhpZmMuaWZjX2J1ZiwgaWZjLmlmY19sZW4pOworCisJCWlmIChpb2N0bF9vcl93YXJuKHNrZmQsIFNJT0NHSUZDT05GLCAmaWZjKSA8IDApIHsKKwkJCWdvdG8gb3V0OworCQl9CisJCWlmIChpZmMuaWZjX2xlbiA9PSAoaW50KShzaXplb2Yoc3RydWN0IGlmcmVxKSAqIG51bXJlcXMpKSB7CisJCQkvKiBhc3N1bWUgaXQgb3ZlcmZsb3dlZCBhbmQgdHJ5IGFnYWluICovCisJCQludW1yZXFzICs9IDEwOworCQkJY29udGludWU7CisJCX0KKwkJYnJlYWs7CisJfQorCisJaWZyID0gaWZjLmlmY19yZXE7CisJZm9yIChuID0gMDsgbiA8IGlmYy5pZmNfbGVuOyBuICs9IHNpemVvZihzdHJ1Y3QgaWZyZXEpKSB7CisJCWFkZF9pbnRlcmZhY2UoaWZyLT5pZnJfbmFtZSk7CisJCWlmcisrOworCX0KKwllcnIgPSAwOworCisgb3V0OgorCWNsb3NlKHNrZmQpOworCWZyZWUoaWZjLmlmY19idWYpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaWZfcmVhZGxpc3RfcHJvYyhjaGFyICp0YXJnZXQpCit7CisJc3RhdGljIHNtYWxsaW50IHByb2NfcmVhZDsKKworCUZJTEUgKmZoOworCWNoYXIgYnVmWzUxMl07CisJc3RydWN0IGludGVyZmFjZSAqaWZlOworCWludCBlcnIsIHByb2NuZXRkZXZfdnNuOworCisJaWYgKHByb2NfcmVhZCkKKwkJcmV0dXJuIDA7CisJaWYgKCF0YXJnZXQpCisJCXByb2NfcmVhZCA9IDE7CisKKwlmaCA9IGZvcGVuX29yX3dhcm4oX1BBVEhfUFJPQ05FVF9ERVYsICJyIik7CisJaWYgKCFmaCkgeworCQlyZXR1cm4gaWZfcmVhZGNvbmYoKTsKKwl9CisJZmdldHMoYnVmLCBzaXplb2YgYnVmLCBmaCk7CS8qIGVhdCBsaW5lICovCisJZmdldHMoYnVmLCBzaXplb2YgYnVmLCBmaCk7CisKKwlwcm9jbmV0ZGV2X3ZzbiA9IHByb2NuZXRkZXZfdmVyc2lvbihidWYpOworCisJZXJyID0gMDsKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YgYnVmLCBmaCkpIHsKKwkJY2hhciAqcywgbmFtZVsxMjhdOworCisJCXMgPSBnZXRfbmFtZShuYW1lLCBidWYpOworCQlpZmUgPSBhZGRfaW50ZXJmYWNlKG5hbWUpOworCQlnZXRfZGV2X2ZpZWxkcyhzLCBpZmUsIHByb2NuZXRkZXZfdnNuKTsKKwkJaWZlLT5zdGF0aXN0aWNzX3ZhbGlkID0gMTsKKwkJaWYgKHRhcmdldCAmJiAhc3RyY21wKHRhcmdldCwgbmFtZSkpCisJCQlicmVhazsKKwl9CisJaWYgKGZlcnJvcihmaCkpIHsKKwkJYmJfcGVycm9yX21zZyhfUEFUSF9QUk9DTkVUX0RFVik7CisJCWVyciA9IC0xOworCQlwcm9jX3JlYWQgPSAwOworCX0KKwlmY2xvc2UoZmgpOworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgaWZfcmVhZGxpc3Qodm9pZCkKK3sKKwlpbnQgZXJyID0gaWZfcmVhZGxpc3RfcHJvYyhOVUxMKTsKKwkvKiBOZWVkZWQgaW4gb3JkZXIgdG8gZ2V0IGV0aE46TSBhbGlhc2VzICovCisJaWYgKCFlcnIpCisJCWVyciA9IGlmX3JlYWRjb25mKCk7CisJcmV0dXJuIGVycjsKK30KKworLyogRmV0Y2ggdGhlIGludGVyZmFjZSBjb25maWd1cmF0aW9uIGZyb20gdGhlIGtlcm5lbC4gKi8KK3N0YXRpYyBpbnQgaWZfZmV0Y2goc3RydWN0IGludGVyZmFjZSAqaWZlKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJY2hhciAqaWZuYW1lID0gaWZlLT5uYW1lOworCWludCBza2ZkOworCisJc2tmZCA9IHhzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisKKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgaWZuYW1lKTsKKwlpZiAoaW9jdGwoc2tmZCwgU0lPQ0dJRkZMQUdTLCAmaWZyKSA8IDApIHsKKwkJY2xvc2Uoc2tmZCk7CisJCXJldHVybiAtMTsKKwl9CisJaWZlLT5mbGFncyA9IGlmci5pZnJfZmxhZ3M7CisKKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgaWZuYW1lKTsKKwltZW1zZXQoaWZlLT5od2FkZHIsIDAsIDMyKTsKKwlpZiAoaW9jdGwoc2tmZCwgU0lPQ0dJRkhXQUREUiwgJmlmcikgPj0gMCkKKwkJbWVtY3B5KGlmZS0+aHdhZGRyLCBpZnIuaWZyX2h3YWRkci5zYV9kYXRhLCA4KTsKKworCWlmZS0+dHlwZSA9IGlmci5pZnJfaHdhZGRyLnNhX2ZhbWlseTsKKworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBpZm5hbWUpOworCWlmZS0+bWV0cmljID0gMDsKKwlpZiAoaW9jdGwoc2tmZCwgU0lPQ0dJRk1FVFJJQywgJmlmcikgPj0gMCkKKwkJaWZlLT5tZXRyaWMgPSBpZnIuaWZyX21ldHJpYzsKKworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBpZm5hbWUpOworCWlmZS0+bXR1ID0gMDsKKwlpZiAoaW9jdGwoc2tmZCwgU0lPQ0dJRk1UVSwgJmlmcikgPj0gMCkKKwkJaWZlLT5tdHUgPSBpZnIuaWZyX210dTsKKworCW1lbXNldCgmaWZlLT5tYXAsIDAsIHNpemVvZihzdHJ1Y3QgaWZtYXApKTsKKyNpZmRlZiBTSU9DR0lGTUFQCisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGlmbmFtZSk7CisJaWYgKGlvY3RsKHNrZmQsIFNJT0NHSUZNQVAsICZpZnIpID09IDApCisJCWlmZS0+bWFwID0gaWZyLmlmcl9tYXA7CisjZW5kaWYKKworI2lmZGVmIEhBVkVfVFhRVUVVRUxFTgorCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBpZm5hbWUpOworCWlmZS0+dHhfcXVldWVfbGVuID0gLTE7CS8qIHVua25vd24gdmFsdWUgKi8KKwlpZiAoaW9jdGwoc2tmZCwgU0lPQ0dJRlRYUUxFTiwgJmlmcikgPj0gMCkKKwkJaWZlLT50eF9xdWV1ZV9sZW4gPSBpZnIuaWZyX3FsZW47CisjZWxzZQorCWlmZS0+dHhfcXVldWVfbGVuID0gLTE7CS8qIHVua25vd24gdmFsdWUgKi8KKyNlbmRpZgorCisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGlmbmFtZSk7CisJaWZyLmlmcl9hZGRyLnNhX2ZhbWlseSA9IEFGX0lORVQ7CisJbWVtc2V0KCZpZmUtPmFkZHIsIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKTsKKwlpZiAoaW9jdGwoc2tmZCwgU0lPQ0dJRkFERFIsICZpZnIpID09IDApIHsKKwkJaWZlLT5oYXNfaXAgPSAxOworCQlpZmUtPmFkZHIgPSBpZnIuaWZyX2FkZHI7CisJCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBpZm5hbWUpOworCQltZW1zZXQoJmlmZS0+ZHN0YWRkciwgMCwgc2l6ZW9mKHN0cnVjdCBzb2NrYWRkcikpOworCQlpZiAoaW9jdGwoc2tmZCwgU0lPQ0dJRkRTVEFERFIsICZpZnIpID49IDApCisJCQlpZmUtPmRzdGFkZHIgPSBpZnIuaWZyX2RzdGFkZHI7CisKKwkJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGlmbmFtZSk7CisJCW1lbXNldCgmaWZlLT5icm9hZGFkZHIsIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKTsKKwkJaWYgKGlvY3RsKHNrZmQsIFNJT0NHSUZCUkRBRERSLCAmaWZyKSA+PSAwKQorCQkJaWZlLT5icm9hZGFkZHIgPSBpZnIuaWZyX2Jyb2FkYWRkcjsKKworCQlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgaWZuYW1lKTsKKwkJbWVtc2V0KCZpZmUtPm5ldG1hc2ssIDAsIHNpemVvZihzdHJ1Y3Qgc29ja2FkZHIpKTsKKwkJaWYgKGlvY3RsKHNrZmQsIFNJT0NHSUZORVRNQVNLLCAmaWZyKSA+PSAwKQorCQkJaWZlLT5uZXRtYXNrID0gaWZyLmlmcl9uZXRtYXNrOworCX0KKworCWNsb3NlKHNrZmQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGRvX2lmX2ZldGNoKHN0cnVjdCBpbnRlcmZhY2UgKmlmZSkKK3sKKwlpZiAoaWZfZmV0Y2goaWZlKSA8IDApIHsKKwkJY29uc3QgY2hhciAqZXJybXNnOworCisJCWlmIChlcnJubyA9PSBFTk9ERVYpIHsKKwkJCS8qIEdpdmUgYmV0dGVyIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgY2FzZS4gKi8KKwkJCWVycm1zZyA9ICJEZXZpY2Ugbm90IGZvdW5kIjsKKwkJfSBlbHNlIHsKKwkJCWVycm1zZyA9IHN0cmVycm9yKGVycm5vKTsKKwkJfQorCQliYl9lcnJvcl9tc2coIiVzOiBlcnJvciBmZXRjaGluZyBpbnRlcmZhY2UgaW5mb3JtYXRpb246ICVzIiwKKwkJCQlpZmUtPm5hbWUsIGVycm1zZyk7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHd0eXBlIHVuc3BlY19od3R5cGUgPSB7CisJLm5hbWUgPQkJInVuc3BlYyIsCisJLnRpdGxlID0JIlVOU1BFQyIsCisJLnR5cGUgPQkJLTEsCisJLnByaW50ID0JVU5TUEVDX3ByaW50Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3dHlwZSBsb29wX2h3dHlwZSA9IHsKKwkubmFtZSA9CQkibG9vcCIsCisJLnRpdGxlID0JIkxvY2FsIExvb3BiYWNrIiwKKwkudHlwZSA9CQlBUlBIUkRfTE9PUEJBQ0sKK307CisKKy8qIERpc3BsYXkgYW4gRXRoZXJuZXQgYWRkcmVzcyBpbiByZWFkYWJsZSBmb3JtYXQuICovCitzdGF0aWMgY2hhciogRkFTVF9GVU5DIGV0aGVyX3ByaW50KHVuc2lnbmVkIGNoYXIgKnB0cikKK3sKKwljaGFyICpidWZmOworCWJ1ZmYgPSB4YXNwcmludGYoIiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWDolMDJYIiwKKwkJCSAocHRyWzBdICYgMDM3NyksIChwdHJbMV0gJiAwMzc3KSwgKHB0clsyXSAmIDAzNzcpLAorCQkJIChwdHJbM10gJiAwMzc3KSwgKHB0cls0XSAmIDAzNzcpLCAocHRyWzVdICYgMDM3NykKKwkJKTsKKwlyZXR1cm4gYXV0b19zdHJpbmcoYnVmZik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHd0eXBlIGV0aGVyX2h3dHlwZSA9IHsKKwkubmFtZSAgPSAiZXRoZXIiLAorCS50aXRsZSA9ICJFdGhlcm5ldCIsCisJLnR5cGUgID0gQVJQSFJEX0VUSEVSLAorCS5hbGVuICA9IEVUSF9BTEVOLAorCS5wcmludCA9IGV0aGVyX3ByaW50LAorCS5pbnB1dCA9IGluX2V0aGVyCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3dHlwZSBwcHBfaHd0eXBlID0geworCS5uYW1lID0JCSJwcHAiLAorCS50aXRsZSA9CSJQb2ludC10by1Qb2ludCBQcm90b2NvbCIsCisJLnR5cGUgPQkJQVJQSFJEX1BQUAorfTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgaHd0eXBlIHNpdF9od3R5cGUgPSB7CisJLm5hbWUgPQkJCSJzaXQiLAorCS50aXRsZSA9CQkiSVB2Ni1pbi1JUHY0IiwKKwkudHlwZSA9CQkJQVJQSFJEX1NJVCwKKwkucHJpbnQgPQkJVU5TUEVDX3ByaW50LAorCS5zdXBwcmVzc19udWxsX2FkZHIgPQkxCit9OworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfSFdJQgorc3RhdGljIGNvbnN0IHN0cnVjdCBod3R5cGUgaWJfaHd0eXBlID0geworCS5uYW1lICA9ICJpbmZpbmliYW5kIiwKKwkudGl0bGUgPSAiSW5maW5pQmFuZCIsCisJLnR5cGUgID0gQVJQSFJEX0lORklOSUJBTkQsCisJLmFsZW4gID0gSU5GSU5JQkFORF9BTEVOLAorCS5wcmludCA9IFVOU1BFQ19wcmludCwKKwkuaW5wdXQgPSBpbl9pYiwKK307CisjZW5kaWYKKworCitzdGF0aWMgY29uc3Qgc3RydWN0IGh3dHlwZSAqY29uc3QgaHd0eXBlc1tdID0geworCSZsb29wX2h3dHlwZSwKKwkmZXRoZXJfaHd0eXBlLAorCSZwcHBfaHd0eXBlLAorCSZ1bnNwZWNfaHd0eXBlLAorI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkmc2l0X2h3dHlwZSwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0hXSUIKKwkmaWJfaHd0eXBlLAorI2VuZGlmCisJTlVMTAorfTsKKworI2lmZGVmIElGRl9QT1JUU0VMCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgaWZfcG9ydF90ZXh0W10gPSB7CisJLyogS2VlcCBpbiBzdGVwIHdpdGggPGxpbnV4L25ldGRldmljZS5oPiAqLworCSJ1bmtub3duIiwKKwkiMTBiYXNlMiIsCisJIjEwYmFzZVQiLAorCSJBVUkiLAorCSIxMDBiYXNlVCIsCisJIjEwMGJhc2VUWCIsCisJIjEwMGJhc2VGWCIsCisJTlVMTAorfTsKKyNlbmRpZgorCisvKiBDaGVjayBvdXIgaGFyZHdhcmUgdHlwZSB0YWJsZSBmb3IgdGhpcyB0eXBlLiAqLworY29uc3Qgc3RydWN0IGh3dHlwZSogRkFTVF9GVU5DIGdldF9od3R5cGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwljb25zdCBzdHJ1Y3QgaHd0eXBlICpjb25zdCAqaHdwOworCisJaHdwID0gaHd0eXBlczsKKwl3aGlsZSAoKmh3cCAhPSBOVUxMKSB7CisJCWlmICghc3RyY21wKCgqaHdwKS0+bmFtZSwgbmFtZSkpCisJCQlyZXR1cm4gKCpod3ApOworCQlod3ArKzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIENoZWNrIG91ciBoYXJkd2FyZSB0eXBlIHRhYmxlIGZvciB0aGlzIHR5cGUuICovCitjb25zdCBzdHJ1Y3QgaHd0eXBlKiBGQVNUX0ZVTkMgZ2V0X2h3bnR5cGUoaW50IHR5cGUpCit7CisJY29uc3Qgc3RydWN0IGh3dHlwZSAqY29uc3QgKmh3cDsKKworCWh3cCA9IGh3dHlwZXM7CisJd2hpbGUgKCpod3AgIT0gTlVMTCkgeworCQlpZiAoKCpod3ApLT50eXBlID09IHR5cGUpCisJCQlyZXR1cm4gKmh3cDsKKwkJaHdwKys7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiByZXR1cm4gMSBpZiBhZGRyZXNzIGlzIGFsbCB6ZXJvcyAqLworc3RhdGljIGludCBod19udWxsX2FkZHJlc3MoY29uc3Qgc3RydWN0IGh3dHlwZSAqaHcsIHZvaWQgKmFwKQoreworCWludCBpOworCXVuc2lnbmVkIGNoYXIgKmFkZHJlc3MgPSAodW5zaWduZWQgY2hhciAqKSBhcDsKKworCWZvciAoaSA9IDA7IGkgPCBody0+YWxlbjsgaSsrKQorCQlpZiAoYWRkcmVzc1tpXSkKKwkJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitzdGF0aWMgY29uc3QgY2hhciBUUmV4dFtdIEFMSUdOMSA9ICJcMFwwXDBLaVwwTWlcMEdpXDBUaSI7CisKK3N0YXRpYyB2b2lkIHByaW50X2J5dGVzX3NjYWxlZCh1bnNpZ25lZCBsb25nIGxvbmcgdWxsLCBjb25zdCBjaGFyICplbmQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGludF9wYXJ0OworCWNvbnN0IGNoYXIgKmV4dDsKKwl1bnNpZ25lZCBpbnQgZnJhY19wYXJ0OworCWludCBpOworCisJZnJhY19wYXJ0ID0gMDsKKwlleHQgPSBUUmV4dDsKKwlpbnRfcGFydCA9IHVsbDsKKwlpID0gNDsKKwlkbyB7CisJCWlmIChpbnRfcGFydCA+PSAxMDI0KSB7CisJCQlmcmFjX3BhcnQgPSAoKCgodW5zaWduZWQgaW50KSBpbnRfcGFydCkgJiAoMTAyNC0xKSkgKiAxMCkgLyAxMDI0OworCQkJaW50X3BhcnQgLz0gMTAyNDsKKwkJCWV4dCArPSAzOwkvKiBLaUIsIE1pQiwgR2lCLCBUaUIgKi8KKwkJfQorCQktLWk7CisJfSB3aGlsZSAoaSk7CisKKwlwcmludGYoIlggYnl0ZXM6JWxsdSAoJWxsdS4ldSAlc0IpJXMiLCB1bGwsIGludF9wYXJ0LCBmcmFjX3BhcnQsIGV4dCwgZW5kKTsKK30KKworCisjaWZkZWYgSEFWRV9BRklORVQ2CisjZGVmaW5lIElQVjZfQUREUl9BTlkgICAgICAgICAgIDB4MDAwMFUKKworI2RlZmluZSBJUFY2X0FERFJfVU5JQ0FTVCAgICAgICAweDAwMDFVCisjZGVmaW5lIElQVjZfQUREUl9NVUxUSUNBU1QgICAgIDB4MDAwMlUKKyNkZWZpbmUgSVBWNl9BRERSX0FOWUNBU1QgICAgICAgMHgwMDA0VQorCisjZGVmaW5lIElQVjZfQUREUl9MT09QQkFDSyAgICAgIDB4MDAxMFUKKyNkZWZpbmUgSVBWNl9BRERSX0xJTktMT0NBTCAgICAgMHgwMDIwVQorI2RlZmluZSBJUFY2X0FERFJfU0lURUxPQ0FMICAgICAweDAwNDBVCisKKyNkZWZpbmUgSVBWNl9BRERSX0NPTVBBVHY0ICAgICAgMHgwMDgwVQorCisjZGVmaW5lIElQVjZfQUREUl9TQ09QRV9NQVNLICAgIDB4MDBmMFUKKworI2RlZmluZSBJUFY2X0FERFJfTUFQUEVEICAgICAgICAweDEwMDBVCisjZGVmaW5lIElQVjZfQUREUl9SRVNFUlZFRCAgICAgIDB4MjAwMFUJLyogcmVzZXJ2ZWQgYWRkcmVzcyBzcGFjZSAqLworCisKK3N0YXRpYyB2b2lkIGlmZV9wcmludDYoc3RydWN0IGludGVyZmFjZSAqcHRyKQoreworCUZJTEUgKmY7CisJY2hhciBhZGRyNls0MF0sIGRldm5hbWVbMjFdOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2FwOworCWludCBwbGVuLCBzY29wZSwgZGFkX3N0YXR1cywgaWZfaWR4OworCWNoYXIgYWRkcjZwWzhdWzVdOworCisJZiA9IGZvcGVuX2Zvcl9yZWFkKF9QQVRIX1BST0NORVRfSUZJTkVUNik7CisJaWYgKGYgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJd2hpbGUgKGZzY2FuZgorCQkgICAoZiwgIiU0cyU0cyU0cyU0cyU0cyU0cyU0cyU0cyAlMDh4ICUwMnggJTAyeCAlMDJ4ICUyMHNcbiIsCisJCQlhZGRyNnBbMF0sIGFkZHI2cFsxXSwgYWRkcjZwWzJdLCBhZGRyNnBbM10sIGFkZHI2cFs0XSwKKwkJCWFkZHI2cFs1XSwgYWRkcjZwWzZdLCBhZGRyNnBbN10sICZpZl9pZHgsICZwbGVuLCAmc2NvcGUsCisJCQkmZGFkX3N0YXR1cywgZGV2bmFtZSkgIT0gRU9GCisJKSB7CisJCWlmICghc3RyY21wKGRldm5hbWUsIHB0ci0+bmFtZSkpIHsKKwkJCXNwcmludGYoYWRkcjYsICIlczolczolczolczolczolczolczolcyIsCisJCQkJCWFkZHI2cFswXSwgYWRkcjZwWzFdLCBhZGRyNnBbMl0sIGFkZHI2cFszXSwKKwkJCQkJYWRkcjZwWzRdLCBhZGRyNnBbNV0sIGFkZHI2cFs2XSwgYWRkcjZwWzddKTsKKwkJCWluZXRfcHRvbihBRl9JTkVUNiwgYWRkcjYsCisJCQkJCSAgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2FwLnNpbjZfYWRkcik7CisJCQlzYXAuc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKwkJCXByaW50ZigiICAgICAgICAgIGluZXQ2IGFkZHI6ICVzLyVkIiwKKwkJCQlJTkVUNl9zcHJpbnQoKHN0cnVjdCBzb2NrYWRkciAqKSAmc2FwLCAxKSwKKwkJCQlwbGVuKTsKKwkJCXByaW50ZigiIFNjb3BlOiIpOworCQkJc3dpdGNoIChzY29wZSAmIElQVjZfQUREUl9TQ09QRV9NQVNLKSB7CisJCQljYXNlIDA6CisJCQkJcHV0cygiR2xvYmFsIik7CisJCQkJYnJlYWs7CisJCQljYXNlIElQVjZfQUREUl9MSU5LTE9DQUw6CisJCQkJcHV0cygiTGluayIpOworCQkJCWJyZWFrOworCQkJY2FzZSBJUFY2X0FERFJfU0lURUxPQ0FMOgorCQkJCXB1dHMoIlNpdGUiKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgSVBWNl9BRERSX0NPTVBBVHY0OgorCQkJCXB1dHMoIkNvbXBhdCIpOworCQkJCWJyZWFrOworCQkJY2FzZSBJUFY2X0FERFJfTE9PUEJBQ0s6CisJCQkJcHV0cygiSG9zdCIpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwdXRzKCJVbmtub3duIik7CisJCQl9CisJCX0KKwl9CisJZmNsb3NlKGYpOworfQorI2Vsc2UKKyNkZWZpbmUgaWZlX3ByaW50NihhKSAoKHZvaWQpMCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBpZmVfcHJpbnQoc3RydWN0IGludGVyZmFjZSAqcHRyKQoreworCWNvbnN0IHN0cnVjdCBhZnR5cGUgKmFwOworCWNvbnN0IHN0cnVjdCBod3R5cGUgKmh3OworCWludCBoZjsKKwlpbnQgY2FuX2NvbXByZXNzID0gMDsKKworCWFwID0gZ2V0X2FmbnR5cGUocHRyLT5hZGRyLnNhX2ZhbWlseSk7CisJaWYgKGFwID09IE5VTEwpCisJCWFwID0gZ2V0X2FmbnR5cGUoMCk7CisKKwloZiA9IHB0ci0+dHlwZTsKKworCWlmIChoZiA9PSBBUlBIUkRfQ1NMSVAgfHwgaGYgPT0gQVJQSFJEX0NTTElQNikKKwkJY2FuX2NvbXByZXNzID0gMTsKKworCWh3ID0gZ2V0X2h3bnR5cGUoaGYpOworCWlmIChodyA9PSBOVUxMKQorCQlodyA9IGdldF9od250eXBlKC0xKTsKKworCXByaW50ZigiJS05cyBMaW5rIGVuY2FwOiVzICAiLCBwdHItPm5hbWUsIGh3LT50aXRsZSk7CisJLyogRm9yIHNvbWUgaGFyZHdhcmUgdHlwZXMgKGVnIEFzaCwgQVRNKSB3ZSBkb24ndCBwcmludCB0aGUKKwkgICBoYXJkd2FyZSBhZGRyZXNzIGlmIGl0J3MgbnVsbC4gICovCisJaWYgKGh3LT5wcmludCAhPSBOVUxMCisJICYmICEoaHdfbnVsbF9hZGRyZXNzKGh3LCBwdHItPmh3YWRkcikgJiYgaHctPnN1cHByZXNzX251bGxfYWRkcikKKwkpIHsKKwkJcHJpbnRmKCJIV2FkZHIgJXMgICIsIGh3LT5wcmludCgodW5zaWduZWQgY2hhciAqKXB0ci0+aHdhZGRyKSk7CisJfQorI2lmZGVmIElGRl9QT1JUU0VMCisJaWYgKHB0ci0+ZmxhZ3MgJiBJRkZfUE9SVFNFTCkgeworCQlwcmludGYoIk1lZGlhOiVzIiwgaWZfcG9ydF90ZXh0W3B0ci0+bWFwLnBvcnRdIC8qIFswXSAqLyk7CisJCWlmIChwdHItPmZsYWdzICYgSUZGX0FVVE9NRURJQSkKKwkJCXByaW50ZigiKGF1dG8pIik7CisJfQorI2VuZGlmCisJYmJfcHV0Y2hhcignXG4nKTsKKworCWlmIChwdHItPmhhc19pcCkgeworCQlwcmludGYoIiAgICAgICAgICAlcyBhZGRyOiVzICIsIGFwLT5uYW1lLAorCQkJYXAtPnNwcmludCgmcHRyLT5hZGRyLCAxKSk7CisJCWlmIChwdHItPmZsYWdzICYgSUZGX1BPSU5UT1BPSU5UKSB7CisJCQlwcmludGYoIiBQLXQtUDolcyAiLCBhcC0+c3ByaW50KCZwdHItPmRzdGFkZHIsIDEpKTsKKwkJfQorCQlpZiAocHRyLT5mbGFncyAmIElGRl9CUk9BRENBU1QpIHsKKwkJCXByaW50ZigiIEJjYXN0OiVzICIsIGFwLT5zcHJpbnQoJnB0ci0+YnJvYWRhZGRyLCAxKSk7CisJCX0KKwkJcHJpbnRmKCIgTWFzazolc1xuIiwgYXAtPnNwcmludCgmcHRyLT5uZXRtYXNrLCAxKSk7CisJfQorCisJaWZlX3ByaW50NihwdHIpOworCisJcHJpbnRmKCIgICAgICAgICAgIik7CisJLyogRE9OVCBGT1JHRVQgVE8gQUREIFRIRSBGTEFHUyBJTiBpZmVfcHJpbnRfc2hvcnQsIHRvbyAqLworCisJaWYgKHB0ci0+ZmxhZ3MgPT0gMCkgeworCQlwcmludGYoIltOTyBGTEFHU10gIik7CisJfSBlbHNlIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgaWZlX3ByaW50X2ZsYWdzX3N0cnNbXSBBTElHTjEgPQorCQkJIlVQXDAiCisJCQkiQlJPQURDQVNUXDAiCisJCQkiREVCVUdcMCIKKwkJCSJMT09QQkFDS1wwIgorCQkJIlBPSU5UT1BPSU5UXDAiCisJCQkiTk9UUkFJTEVSU1wwIgorCQkJIlJVTk5JTkdcMCIKKwkJCSJOT0FSUFwwIgorCQkJIlBST01JU0NcMCIKKwkJCSJBTExNVUxUSVwwIgorCQkJIlNMQVZFXDAiCisJCQkiTUFTVEVSXDAiCisJCQkiTVVMVElDQVNUXDAiCisjaWZkZWYgSEFWRV9EWU5BTUlDCisJCQkiRFlOQU1JQ1wwIgorI2VuZGlmCisJCQk7CisJCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBpZmVfcHJpbnRfZmxhZ3NfbWFza1tdIEFMSUdOMiA9IHsKKwkJCUlGRl9VUCwKKwkJCUlGRl9CUk9BRENBU1QsCisJCQlJRkZfREVCVUcsCisJCQlJRkZfTE9PUEJBQ0ssCisJCQlJRkZfUE9JTlRPUE9JTlQsCisJCQlJRkZfTk9UUkFJTEVSUywKKwkJCUlGRl9SVU5OSU5HLAorCQkJSUZGX05PQVJQLAorCQkJSUZGX1BST01JU0MsCisJCQlJRkZfQUxMTVVMVEksCisJCQlJRkZfU0xBVkUsCisJCQlJRkZfTUFTVEVSLAorCQkJSUZGX01VTFRJQ0FTVAorI2lmZGVmIEhBVkVfRFlOQU1JQworCQkJLElGRl9EWU5BTUlDCisjZW5kaWYKKwkJfTsKKwkJY29uc3QgdW5zaWduZWQgc2hvcnQgKm1hc2sgPSBpZmVfcHJpbnRfZmxhZ3NfbWFzazsKKwkJY29uc3QgY2hhciAqc3RyID0gaWZlX3ByaW50X2ZsYWdzX3N0cnM7CisJCWRvIHsKKwkJCWlmIChwdHItPmZsYWdzICYgKm1hc2spIHsKKwkJCQlwcmludGYoIiVzICIsIHN0cik7CisJCQl9CisJCQltYXNrKys7CisJCQlzdHIgKz0gc3RybGVuKHN0cikgKyAxOworCQl9IHdoaWxlICgqc3RyKTsKKwl9CisKKwkvKiBET05UIEZPUkdFVCBUTyBBREQgVEhFIEZMQUdTIElOIGlmZV9wcmludF9zaG9ydCAqLworCXByaW50ZigiIE1UVTolZCAgTWV0cmljOiVkIiwgcHRyLT5tdHUsIHB0ci0+bWV0cmljID8gcHRyLT5tZXRyaWMgOiAxKTsKKyNpZmRlZiBTSU9DU0tFRVBBTElWRQorCWlmIChwdHItPm91dGZpbGwgfHwgcHRyLT5rZWVwYWxpdmUpCisJCXByaW50ZigiICBPdXRmaWxsOiVkICBLZWVwYWxpdmU6JWQiLCBwdHItPm91dGZpbGwsIHB0ci0+a2VlcGFsaXZlKTsKKyNlbmRpZgorCWJiX3B1dGNoYXIoJ1xuJyk7CisKKwkvKiBJZiBuZWVkZWQsIGRpc3BsYXkgdGhlIGludGVyZmFjZSBzdGF0aXN0aWNzLiAqLworCisJaWYgKHB0ci0+c3RhdGlzdGljc192YWxpZCkgeworCQkvKiBYWFg6IHN0YXRpc3RpY3MgYXJlIGN1cnJlbnRseSBvbmx5IHByaW50ZWQgZm9yIHRoZSBwcmltYXJ5IGFkZHJlc3MsCisJCSAqICAgICAgbm90IGZvciB0aGUgYWxpYXNlcywgYWx0aG91Z2ggc3RyaWN0bHkgc3BlYWtpbmcgdGhleSdyZSBzaGFyZWQKKwkJICogICAgICBieSBhbGwgYWRkcmVzc2VzLgorCQkgKi8KKwkJcHJpbnRmKCIgICAgICAgICAgIik7CisKKwkJcHJpbnRmKCJSWCBwYWNrZXRzOiVsbHUgZXJyb3JzOiVsdSBkcm9wcGVkOiVsdSBvdmVycnVuczolbHUgZnJhbWU6JWx1XG4iLAorCQkJcHRyLT5zdGF0cy5yeF9wYWNrZXRzLCBwdHItPnN0YXRzLnJ4X2Vycm9ycywKKwkJCXB0ci0+c3RhdHMucnhfZHJvcHBlZCwgcHRyLT5zdGF0cy5yeF9maWZvX2Vycm9ycywKKwkJCXB0ci0+c3RhdHMucnhfZnJhbWVfZXJyb3JzKTsKKwkJaWYgKGNhbl9jb21wcmVzcykKKwkJCXByaW50ZigiICAgICAgICAgICAgIGNvbXByZXNzZWQ6JWx1XG4iLAorCQkJCXB0ci0+c3RhdHMucnhfY29tcHJlc3NlZCk7CisJCXByaW50ZigiICAgICAgICAgICIpOworCQlwcmludGYoIlRYIHBhY2tldHM6JWxsdSBlcnJvcnM6JWx1IGRyb3BwZWQ6JWx1IG92ZXJydW5zOiVsdSBjYXJyaWVyOiVsdVxuIiwKKwkJCXB0ci0+c3RhdHMudHhfcGFja2V0cywgcHRyLT5zdGF0cy50eF9lcnJvcnMsCisJCQlwdHItPnN0YXRzLnR4X2Ryb3BwZWQsIHB0ci0+c3RhdHMudHhfZmlmb19lcnJvcnMsCisJCQlwdHItPnN0YXRzLnR4X2NhcnJpZXJfZXJyb3JzKTsKKwkJcHJpbnRmKCIgICAgICAgICAgY29sbGlzaW9uczolbHUgIiwgcHRyLT5zdGF0cy5jb2xsaXNpb25zKTsKKwkJaWYgKGNhbl9jb21wcmVzcykKKwkJCXByaW50ZigiY29tcHJlc3NlZDolbHUgIiwgcHRyLT5zdGF0cy50eF9jb21wcmVzc2VkKTsKKwkJaWYgKHB0ci0+dHhfcXVldWVfbGVuICE9IC0xKQorCQkJcHJpbnRmKCJ0eHF1ZXVlbGVuOiVkICIsIHB0ci0+dHhfcXVldWVfbGVuKTsKKwkJcHJpbnRmKCJcbiAgICAgICAgICBSIik7CisJCXByaW50X2J5dGVzX3NjYWxlZChwdHItPnN0YXRzLnJ4X2J5dGVzLCAiICBUIik7CisJCXByaW50X2J5dGVzX3NjYWxlZChwdHItPnN0YXRzLnR4X2J5dGVzLCAiXG4iKTsKKwl9CisKKwlpZiAocHRyLT5tYXAuaXJxIHx8IHB0ci0+bWFwLm1lbV9zdGFydAorCSB8fCBwdHItPm1hcC5kbWEgfHwgcHRyLT5tYXAuYmFzZV9hZGRyCisJKSB7CisJCXByaW50ZigiICAgICAgICAgICIpOworCQlpZiAocHRyLT5tYXAuaXJxKQorCQkJcHJpbnRmKCJJbnRlcnJ1cHQ6JWQgIiwgcHRyLT5tYXAuaXJxKTsKKwkJaWYgKHB0ci0+bWFwLmJhc2VfYWRkciA+PSAweDEwMCkgLyogT25seSBwcmludCBkZXZpY2VzIHVzaW5nIGl0IGZvciBJL08gbWFwcyAqLworCQkJcHJpbnRmKCJCYXNlIGFkZHJlc3M6MHglbHggIiwKKwkJCQkodW5zaWduZWQgbG9uZykgcHRyLT5tYXAuYmFzZV9hZGRyKTsKKwkJaWYgKHB0ci0+bWFwLm1lbV9zdGFydCkgeworCQkJcHJpbnRmKCJNZW1vcnk6JWx4LSVseCAiLCBwdHItPm1hcC5tZW1fc3RhcnQsCisJCQkJcHRyLT5tYXAubWVtX2VuZCk7CisJCX0KKwkJaWYgKHB0ci0+bWFwLmRtYSkKKwkJCXByaW50ZigiRE1BIGNoYW46JXggIiwgcHRyLT5tYXAuZG1hKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9CisJYmJfcHV0Y2hhcignXG4nKTsKK30KKworc3RhdGljIGludCBkb19pZl9wcmludChzdHJ1Y3QgaW50ZXJmYWNlICppZmUpIC8qLCBpbnQgKm9wdF9hKSovCit7CisJaW50IHJlczsKKworCXJlcyA9IGRvX2lmX2ZldGNoKGlmZSk7CisJaWYgKHJlcyA+PSAwKSB7CisJCWlmICgoaWZlLT5mbGFncyAmIElGRl9VUCkgfHwgaW50ZXJmYWNlX29wdF9hKQorCQkJaWZlX3ByaW50KGlmZSk7CisJfQorCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaW50ZXJmYWNlICpsb29rdXBfaW50ZXJmYWNlKGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGludGVyZmFjZSAqaWZlID0gTlVMTDsKKworCWlmIChpZl9yZWFkbGlzdF9wcm9jKG5hbWUpIDwgMCkKKwkJcmV0dXJuIE5VTEw7CisJaWZlID0gYWRkX2ludGVyZmFjZShuYW1lKTsKKwlyZXR1cm4gaWZlOworfQorCisjaWZkZWYgVU5VU0VECitzdGF0aWMgaW50IGZvcl9hbGxfaW50ZXJmYWNlcyhpbnQgKCpkb2l0KSAoc3RydWN0IGludGVyZmFjZSAqLCB2b2lkICopLAorCQkJCQkJCXZvaWQgKmNvb2tpZSkKK3sKKwlzdHJ1Y3QgaW50ZXJmYWNlICppZmU7CisKKwlpZiAoIWludF9saXN0ICYmIChpZl9yZWFkbGlzdCgpIDwgMCkpCisJCXJldHVybiAtMTsKKwlmb3IgKGlmZSA9IGludF9saXN0OyBpZmU7IGlmZSA9IGlmZS0+bmV4dCkgeworCQlpbnQgZXJyID0gZG9pdChpZmUsIGNvb2tpZSk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBmb3IgaXB2NCBhZGQvZGVsIG1vZGVzICovCitzdGF0aWMgaW50IGlmX3ByaW50KGNoYXIgKmlmbmFtZSkKK3sKKwlzdHJ1Y3QgaW50ZXJmYWNlICppZmU7CisJaW50IHJlczsKKworCWlmICghaWZuYW1lKSB7CisJCS8qcmVzID0gZm9yX2FsbF9pbnRlcmZhY2VzKGRvX2lmX3ByaW50LCAmaW50ZXJmYWNlX29wdF9hKTsqLworCQlpZiAoIWludF9saXN0ICYmIChpZl9yZWFkbGlzdCgpIDwgMCkpCisJCQlyZXR1cm4gLTE7CisJCWZvciAoaWZlID0gaW50X2xpc3Q7IGlmZTsgaWZlID0gaWZlLT5uZXh0KSB7CisJCQlpbnQgZXJyID0gZG9faWZfcHJpbnQoaWZlKTsgLyosICZpbnRlcmZhY2Vfb3B0X2EpOyovCisJCQlpZiAoZXJyKQorCQkJCXJldHVybiBlcnI7CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCWlmZSA9IGxvb2t1cF9pbnRlcmZhY2UoaWZuYW1lKTsKKwlyZXMgPSBkb19pZl9mZXRjaChpZmUpOworCWlmIChyZXMgPj0gMCkKKwkJaWZlX3ByaW50KGlmZSk7CisJcmV0dXJuIHJlczsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0hXSUIKKy8qIElucHV0IGFuIEluZmluaWJhbmQgYWRkcmVzcyBhbmQgY29udmVydCB0byBiaW5hcnkuICovCitpbnQgRkFTVF9GVU5DIGluX2liKGNvbnN0IGNoYXIgKmJ1ZnAsIHN0cnVjdCBzb2NrYWRkciAqc2FwKQoreworCXNhcC0+c2FfZmFtaWx5ID0gaWJfaHd0eXBlLnR5cGU7CisvL1RPRE86IGVycm9yIGNoZWNrPworCWhleDJiaW4oKGNoYXIqKXNhcC0+c2FfZGF0YSwgYnVmcCwgSU5GSU5JQkFORF9BTEVOKTsKKyMgaWZkZWYgSFdJQl9ERUJVRworCWZwcmludGYoc3RkZXJyLCAiaW5faWIoJXMpOiAlc1xuIiwgYnVmcCwgVU5TUEVDX3ByaW50KHNhcC0+c2FfZGF0YSkpOworIyBlbmRpZgorCXJldHVybiAwOworfQorI2VuZGlmCisKK2ludCBGQVNUX0ZVTkMgZGlzcGxheV9pbnRlcmZhY2VzKGNoYXIgKmlmbmFtZSkKK3sKKwlpbnQgc3RhdHVzOworCisJc3RhdHVzID0gaWZfcHJpbnQoaWZuYW1lKTsKKworCXJldHVybiAoc3RhdHVzIDwgMCk7IC8qIHN0YXR1cyA8IDAgPT0gMSAtLSBlcnJvciAqLworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9pcC5jIGIvbmV0d29ya2luZy9pcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNTM0NWMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL2lwLmMKQEAgLTAsMCArMSwxNzcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQXV0aG9yczogQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqIENoYW5nZXM6CisgKiBSYW5pIEFzc2FmIDxyYW5pQG1hZ2ljLm1ldGF3aXJlLmNvbT4gOTgwOTI5OiByZXNvbHZlIGFkZHJlc3NlcworICogQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyIHJld3JvdGUgdG8gdXNlIGluZGV4X2luX3N1YnN0cl9hcnJheQorICovCisKKy8qIHdvdWxkIG5lZWQgdG8gbWFrZSB0aGUgIiB8ICIgb3B0aW9uYWwgZGVwZW5kaW5nIG9uIG1vcmUgdGhhbiBvbmUgc2VsZWN0ZWQ6ICovCisvL3VzYWdlOiNkZWZpbmUgaXBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSB7IgorLy91c2FnZToJSUZfRkVBVFVSRV9JUF9BRERSRVNTKCJhZGRyZXNzIHwgIikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSVBfUk9VVEUoInJvdXRlIHwgIikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSVBfTElOSygibGluayB8ICIpCisvL3VzYWdlOglJRl9GRUFUVVJFX0lQX1RVTk5FTCgidHVubmVsIHwgIikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSVBfUlVMRSgicnVsZSIpCisvL3VzYWdlOiAgICAgICAifSB7Q09NTUFORH0iCisvL3VzYWdlOiNkZWZpbmUgaXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJpcCBbT1BUSU9OU10gT0JKRUNUIHtDT01NQU5EfVxuIgorLy91c2FnZTogICAgICAgIndoZXJlIE9CSkVDVCA6PSB7IgorLy91c2FnZToJSUZfRkVBVFVSRV9JUF9BRERSRVNTKCJhZGRyZXNzIHwgIikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSVBfUk9VVEUoInJvdXRlIHwgIikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSVBfTElOSygibGluayB8ICIpCisvL3VzYWdlOglJRl9GRUFUVVJFX0lQX1RVTk5FTCgidHVubmVsIHwgIikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSVBfUlVMRSgicnVsZSIpCisvL3VzYWdlOiAgICAgICAifVxuIgorLy91c2FnZTogICAgICAgIk9QVElPTlMgOj0geyAtZlthbWlseV0geyBpbmV0IHwgaW5ldDYgfCBsaW5rIH0gfCAtb1tuZWxpbmVdIH0iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGlwYWRkcl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAieyB7YWRkfGRlbH0gSUZBRERSIGRldiBTVFJJTkcgfCB7c2hvd3xmbHVzaH1cbiIKKy8vdXNhZ2U6ICAgICAgICIJCVtkZXYgU1RSSU5HXSBbdG8gUFJFRklYXSB9IgorLy91c2FnZTojZGVmaW5lIGlwYWRkcl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgImlwYWRkciB7YWRkfGNoYW5nZXxyZXBsYWNlfGRlbGV0ZX0gSUZBRERSIGRldiBTVFJJTkdcbiIKKy8vdXNhZ2U6ICAgICAgICJpcGFkZHIge3Nob3d8Zmx1c2h9IFtkZXYgU1RSSU5HXSBbc2NvcGUgU0NPUEUtSURdXG4iCisvL3VzYWdlOiAgICAgICAiCVt0byBQUkVGSVhdIFtsYWJlbCBQQVRURVJOXVxuIgorLy91c2FnZTogICAgICAgIglJRkFERFIgOj0gUFJFRklYIHwgQUREUiBwZWVyIFBSRUZJWFxuIgorLy91c2FnZTogICAgICAgIglbYnJvYWRjYXN0IEFERFJdIFthbnljYXN0IEFERFJdXG4iCisvL3VzYWdlOiAgICAgICAiCVtsYWJlbCBTVFJJTkddIFtzY29wZSBTQ09QRS1JRF1cbiIKKy8vdXNhZ2U6ICAgICAgICIJU0NPUEUtSUQgOj0gW2hvc3QgfCBsaW5rIHwgZ2xvYmFsIHwgTlVNQkVSXSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgaXBsaW5rX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJ7IHNldCBERVZJQ0UgeyB1cCB8IGRvd24gfCBhcnAgeyBvbiB8IG9mZiB9IHwgc2hvdyBbREVWSUNFXSB9IgorLy91c2FnZTojZGVmaW5lIGlwbGlua19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgImlwbGluayBzZXQgREVWSUNFIHsgdXAgfCBkb3duIHwgYXJwIHwgbXVsdGljYXN0IHsgb24gfCBvZmYgfSB8XG4iCisvL3VzYWdlOiAgICAgICAiCQkJZHluYW1pYyB7IG9uIHwgb2ZmIH0gfFxuIgorLy91c2FnZTogICAgICAgIgkJCW10dSBNVFUgfVxuIgorLy91c2FnZTogICAgICAgImlwbGluayBzaG93IFtERVZJQ0VdIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBpcHJvdXRlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJ7IGxpc3QgfCBmbHVzaCB8IGFkZCB8IGRlbCB8IGNoYW5nZSB8IGFwcGVuZCB8XG4iCisvL3VzYWdlOiAgICAgICAiCQlyZXBsYWNlIHwgdGVzdCB9IFJPVVRFIgorLy91c2FnZTojZGVmaW5lIGlwcm91dGVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJpcHJvdXRlIHsgbGlzdCB8IGZsdXNoIH0gU0VMRUNUT1JcbiIKKy8vdXNhZ2U6ICAgICAgICJpcHJvdXRlIGdldCBBRERSRVNTIFtmcm9tIEFERFJFU1MgaWlmIFNUUklOR11cbiIKKy8vdXNhZ2U6ICAgICAgICIJW29pZiBTVFJJTkddIFt0b3MgVE9TXVxuIgorLy91c2FnZTogICAgICAgImlwcm91dGUgeyBhZGQgfCBkZWwgfCBjaGFuZ2UgfCBhcHBlbmQgfCByZXBsYWNlIHwgdGVzdCB9IFJPVVRFXG4iCisvL3VzYWdlOiAgICAgICAiCVNFTEVDVE9SIDo9IFtyb290IFBSRUZJWF0gW21hdGNoIFBSRUZJWF0gW3Byb3RvIFJUUFJPVE9dXG4iCisvL3VzYWdlOiAgICAgICAiCVJPVVRFIDo9IFtUWVBFXSBQUkVGSVggW3RvcyBUT1NdIFtwcm90byBSVFBST1RPXSBbbWV0cmljIE1FVFJJQ10iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGlwcnVsZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAie1tsaXN0IHwgYWRkIHwgZGVsXSBSVUxFfSIKKy8vdXNhZ2U6I2RlZmluZSBpcHJ1bGVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJpcHJ1bGUgW2xpc3QgfCBhZGQgfCBkZWxdIFNFTEVDVE9SIEFDVElPTlxuIgorLy91c2FnZTogICAgICAgIglTRUxFQ1RPUiA6PSBbZnJvbSBQUkVGSVhdIFt0byBQUkVGSVhdIFt0b3MgVE9TXSBbZndtYXJrIEZXTUFSS11cbiIKKy8vdXNhZ2U6ICAgICAgICIJCQlbZGV2IFNUUklOR10gW3ByZWYgTlVNQkVSXVxuIgorLy91c2FnZTogICAgICAgIglBQ1RJT04gOj0gW3RhYmxlIFRBQkxFX0lEXSBbbmF0IEFERFJFU1NdXG4iCisvL3VzYWdlOiAgICAgICAiCQkJW3Byb2hpYml0IHwgcmVqZWN0IHwgdW5yZWFjaGFibGVdXG4iCisvL3VzYWdlOiAgICAgICAiCQkJW3JlYWxtcyBbU1JDUkVBTE0vXURTVFJFQUxNXVxuIgorLy91c2FnZTogICAgICAgIglUQUJMRV9JRCA6PSBbbG9jYWwgfCBtYWluIHwgZGVmYXVsdCB8IE5VTUJFUl0iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGlwdHVubmVsX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJ7IGFkZCB8IGNoYW5nZSB8IGRlbCB8IHNob3cgfSBbTkFNRV1cbiIKKy8vdXNhZ2U6ICAgICAgICIJW21vZGUgeyBpcGlwIHwgZ3JlIHwgc2l0IH1dXG4iCisvL3VzYWdlOiAgICAgICAiCVtyZW1vdGUgQUREUl0gW2xvY2FsIEFERFJdIFt0dGwgVFRMXSIKKy8vdXNhZ2U6I2RlZmluZSBpcHR1bm5lbF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgImlwdHVubmVsIHsgYWRkIHwgY2hhbmdlIHwgZGVsIHwgc2hvdyB9IFtOQU1FXVxuIgorLy91c2FnZTogICAgICAgIglbbW9kZSB7IGlwaXAgfCBncmUgfCBzaXQgfV0gW3JlbW90ZSBBRERSXSBbbG9jYWwgQUREUl1cbiIKKy8vdXNhZ2U6ICAgICAgICIJW1tpfG9dc2VxXSBbW2l8b11rZXkgS0VZXSBbW2l8b11jc3VtXVxuIgorLy91c2FnZTogICAgICAgIglbdHRsIFRUTF0gW3RvcyBUT1NdIFtbbm9dcG10dWRpc2NdIFtkZXYgUEhZU19ERVZdIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2luY2x1ZGUgImxpYmlwcm91dGUvdXRpbHMuaCIKKyNpbmNsdWRlICJsaWJpcHJvdXRlL2lwX2NvbW1vbi5oIgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBfQUREUkVTUyBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfSVBfUk9VVEUgXAorIHx8IEVOQUJMRV9GRUFUVVJFX0lQX0xJTksgXAorIHx8IEVOQUJMRV9GRUFUVVJFX0lQX1RVTk5FTCBcCisgfHwgRU5BQkxFX0ZFQVRVUkVfSVBfUlVMRQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBpcF9wcmludF9oZWxwKGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwliYl9zaG93X3VzYWdlKCk7Cit9CisKK3R5cGVkZWYgaW50IEZBU1RfRlVOQyAoKmlwX2Z1bmNfcHRyX3QpKGNoYXIqKik7CisKK3N0YXRpYyBpbnQgaXBfZG8oaXBfZnVuY19wdHJfdCBpcF9mdW5jLCBjaGFyICoqYXJndikKK3sKKwlhcmd2ID0gaXBfcGFyc2VfY29tbW9uX2FyZ3MoYXJndiArIDEpOworCXJldHVybiBpcF9mdW5jKGFyZ3YpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBfQUREUkVTUworaW50IGlwYWRkcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaXBhZGRyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlyZXR1cm4gaXBfZG8oZG9faXBhZGRyLCBhcmd2KTsKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0lQX0xJTksKK2ludCBpcGxpbmtfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGlwbGlua19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIGlwX2RvKGRvX2lwbGluaywgYXJndik7Cit9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUF9ST1VURQoraW50IGlwcm91dGVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGlwcm91dGVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXJldHVybiBpcF9kbyhkb19pcHJvdXRlLCBhcmd2KTsKK30KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0lQX1JVTEUKK2ludCBpcHJ1bGVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGlwcnVsZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIGlwX2RvKGRvX2lwcnVsZSwgYXJndik7Cit9CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUF9UVU5ORUwKK2ludCBpcHR1bm5lbF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaXB0dW5uZWxfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXJldHVybiBpcF9kbyhkb19pcHR1bm5lbCwgYXJndik7Cit9CisjZW5kaWYKKworCitpbnQgaXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGlwX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBrZXl3b3Jkc1tdIEFMSUdOMSA9CisJCUlGX0ZFQVRVUkVfSVBfQUREUkVTUygiYWRkcmVzc1wwIikKKwkJSUZfRkVBVFVSRV9JUF9ST1VURSgicm91dGVcMCIpCisJCUlGX0ZFQVRVUkVfSVBfUk9VVEUoInJcMCIpCisJCUlGX0ZFQVRVUkVfSVBfTElOSygibGlua1wwIikKKwkJSUZfRkVBVFVSRV9JUF9UVU5ORUwoInR1bm5lbFwwIikKKwkJSUZfRkVBVFVSRV9JUF9UVU5ORUwoInR1bmxcMCIpCisJCUlGX0ZFQVRVUkVfSVBfUlVMRSgicnVsZVwwIikKKwkJOworCXN0YXRpYyBjb25zdCBpcF9mdW5jX3B0cl90IGlwX2Z1bmNfcHRyc1tdID0geworCQlpcF9wcmludF9oZWxwLAorCQlJRl9GRUFUVVJFX0lQX0FERFJFU1MoZG9faXBhZGRyLCkKKwkJSUZfRkVBVFVSRV9JUF9ST1VURShkb19pcHJvdXRlLCkKKwkJSUZfRkVBVFVSRV9JUF9ST1VURShkb19pcHJvdXRlLCkKKwkJSUZfRkVBVFVSRV9JUF9MSU5LKGRvX2lwbGluaywpCisJCUlGX0ZFQVRVUkVfSVBfVFVOTkVMKGRvX2lwdHVubmVsLCkKKwkJSUZfRkVBVFVSRV9JUF9UVU5ORUwoZG9faXB0dW5uZWwsKQorCQlJRl9GRUFUVVJFX0lQX1JVTEUoZG9faXBydWxlLCkKKwl9OworCWlwX2Z1bmNfcHRyX3QgaXBfZnVuYzsKKwlpbnQga2V5OworCisJYXJndiA9IGlwX3BhcnNlX2NvbW1vbl9hcmdzKGFyZ3YgKyAxKTsKKwlrZXkgPSAqYXJndiA/IGluZGV4X2luX3N1YnN0cmluZ3Moa2V5d29yZHMsICphcmd2KyspIDogLTE7CisJaXBfZnVuYyA9IGlwX2Z1bmNfcHRyc1trZXkgKyAxXTsKKworCXJldHVybiBpcF9mdW5jKGFyZ3YpOworfQorCisjZW5kaWYgLyogYW55IG9mIEVOQUJMRV9GRUFUVVJFX0lQX3h4eCBpcyAxICovCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2lwY2FsYy5jIGIvbmV0d29ya2luZy9pcGNhbGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGJhY2Q3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9pcGNhbGMuYwpAQCAtMCwwICsxLDIxNCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBpcGNhbGMgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBCeSBKb3JkYW4gQ3JvdXNlIDxqb3JkYW5AY29zbWljcGVuZ3Vpbi5uZXQ+CisgKiAgICBTdGVwaGFuIExpbnogIDxsaW56QGxpLXByby5uZXQ+CisgKgorICogVGhpcyBpcyBhIGNvbXBsZXRlIHJlaW1wbGVtZW50YXRpb24gb2YgdGhlIGlwY2FsYyBwcm9ncmFtCisgKiBmcm9tIFJlZCBIYXQuICBJIGRpZG4ndCBsb29rIGF0IHRoZWlyIHNvdXJjZSBjb2RlLCBidXQgdGhlcmUKKyAqIGlzIG5vIGRlbnlpbmcgdGhhdCB0aGlzIGlzIGEgbG92aW5nIHJlaW1wbGVtZW50YXRpb24KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBpcGNhbGNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBBRERSRVNTIgorLy91c2FnZTogICAgICAgSUZfRkVBVFVSRV9JUENBTENfRkFOQ1koIlsvUFJFRklYXSIpICIgW05FVE1BU0tdIgorLy91c2FnZTojZGVmaW5lIGlwY2FsY19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNhbGN1bGF0ZSBJUCBuZXR3b3JrIHNldHRpbmdzIGZyb20gYSBJUCBhZGRyZXNzXG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX0lQQ0FMQ19MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgIlxuCS1iLC0tYnJvYWRjYXN0CURpc3BsYXkgY2FsY3VsYXRlZCBicm9hZGNhc3QgYWRkcmVzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLW4sLS1uZXR3b3JrCURpc3BsYXkgY2FsY3VsYXRlZCBuZXR3b3JrIGFkZHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCS1tLC0tbmV0bWFzawlEaXNwbGF5IGRlZmF1bHQgbmV0bWFzayBmb3IgSVAiCisvL3VzYWdlOglJRl9GRUFUVVJFX0lQQ0FMQ19GQU5DWSgKKy8vdXNhZ2U6ICAgICAiXG4JLXAsLS1wcmVmaXgJRGlzcGxheSB0aGUgcHJlZml4IGZvciBJUC9ORVRNQVNLIgorLy91c2FnZTogICAgICJcbgktaCwtLWhvc3RuYW1lCURpc3BsYXkgZmlyc3QgcmVzb2x2ZWQgaG9zdCBuYW1lIgorLy91c2FnZTogICAgICJcbgktcywtLXNpbGVudAlEb24ndCBldmVyIGRpc3BsYXkgZXJyb3IgbWVzc2FnZXMiCisvL3VzYWdlOgkpCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9OT1RfRkVBVFVSRV9JUENBTENfTE9OR19PUFRJT05TKAorLy91c2FnZTogICAgICJcbgktYglEaXNwbGF5IGNhbGN1bGF0ZWQgYnJvYWRjYXN0IGFkZHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCS1uCURpc3BsYXkgY2FsY3VsYXRlZCBuZXR3b3JrIGFkZHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCS1tCURpc3BsYXkgZGVmYXVsdCBuZXRtYXNrIGZvciBJUCIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfSVBDQUxDX0ZBTkNZKAorLy91c2FnZTogICAgICJcbgktcAlEaXNwbGF5IHRoZSBwcmVmaXggZm9yIElQL05FVE1BU0siCisvL3VzYWdlOiAgICAgIlxuCS1oCURpc3BsYXkgZmlyc3QgcmVzb2x2ZWQgaG9zdCBuYW1lIgorLy91c2FnZTogICAgICJcbgktcwlEb24ndCBldmVyIGRpc3BsYXkgZXJyb3IgbWVzc2FnZXMiCisvL3VzYWdlOgkpCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorLyogQWZ0ZXIgbGliYmIuaCwgYmVjYXVzZSBvbiBzb21lIHN5c3RlbXMgaXQgbmVlZHMgb3RoZXIgaW5jbHVkZXMgKi8KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2RlZmluZSBDTEFTU19BX05FVE1BU0sgbnRvaGwoMHhGRjAwMDAwMCkKKyNkZWZpbmUgQ0xBU1NfQl9ORVRNQVNLIG50b2hsKDB4RkZGRjAwMDApCisjZGVmaW5lIENMQVNTX0NfTkVUTUFTSyBudG9obCgweEZGRkZGRjAwKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfbmV0bWFzayh1bnNpZ25lZCBsb25nIGlwYWRkcikKK3sKKwlpcGFkZHIgPSBodG9ubChpcGFkZHIpOworCisJaWYgKChpcGFkZHIgJiAweEMwMDAwMDAwKSA9PSAweEMwMDAwMDAwKQorCQlyZXR1cm4gQ0xBU1NfQ19ORVRNQVNLOworCWVsc2UgaWYgKChpcGFkZHIgJiAweDgwMDAwMDAwKSA9PSAweDgwMDAwMDAwKQorCQlyZXR1cm4gQ0xBU1NfQl9ORVRNQVNLOworCWVsc2UgaWYgKChpcGFkZHIgJiAweDgwMDAwMDAwKSA9PSAwKQorCQlyZXR1cm4gQ0xBU1NfQV9ORVRNQVNLOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUENBTENfRkFOQ1kKK3N0YXRpYyBpbnQgZ2V0X3ByZWZpeCh1bnNpZ25lZCBsb25nIG5ldG1hc2spCit7CisJdW5zaWduZWQgbG9uZyBtc2sgPSAweDgwMDAwMDAwOworCWludCByZXQgPSAwOworCisJbmV0bWFzayA9IGh0b25sKG5ldG1hc2spOworCXdoaWxlIChtc2spIHsKKwkJaWYgKG5ldG1hc2sgJiBtc2spCisJCQlyZXQrKzsKKwkJbXNrID4+PSAxOworCX0KKwlyZXR1cm4gcmV0OworfQorI2Vsc2UKK2ludCBnZXRfcHJlZml4KHVuc2lnbmVkIGxvbmcgbmV0bWFzayk7CisjZW5kaWYKKworCisjZGVmaW5lIE5FVE1BU0sgICAweDAxCisjZGVmaW5lIEJST0FEQ0FTVCAweDAyCisjZGVmaW5lIE5FVFdPUksgICAweDA0CisjZGVmaW5lIE5FVFBSRUZJWCAweDA4CisjZGVmaW5lIEhPU1ROQU1FICAweDEwCisjZGVmaW5lIFNJTEVOVCAgICAweDIwCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUENBTENfTE9OR19PUFRJT05TCisJc3RhdGljIGNvbnN0IGNoYXIgaXBjYWxjX2xvbmdvcHRzW10gQUxJR04xID0KKwkJIm5ldG1hc2tcMCIgICBOb19hcmd1bWVudCAibSIgLy8gbmV0bWFzayBmcm9tIElQIChhc3N1bWluZyBjb21wbGV0ZSBjbGFzcyBBLCBCLCBvciBDIG5ldHdvcmspCisJCSJicm9hZGNhc3RcMCIgTm9fYXJndW1lbnQgImIiIC8vIGJyb2FkY2FzdCBmcm9tIElQIFtuZXRtYXNrXQorCQkibmV0d29ya1wwIiAgIE5vX2FyZ3VtZW50ICJuIiAvLyBuZXR3b3JrIGZyb20gSVAgW25ldG1hc2tdCisjIGlmIEVOQUJMRV9GRUFUVVJFX0lQQ0FMQ19GQU5DWQorCQkicHJlZml4XDAiICAgIE5vX2FyZ3VtZW50ICJwIiAvLyBwcmVmaXggZnJvbSBJUFsvcHJlZml4XSBbbmV0bWFza10KKwkJImhvc3RuYW1lXDAiICBOb19hcmd1bWVudCAiaCIgLy8gaG9zdG5hbWUgZnJvbSBJUAorCQkic2lsZW50XDAiICAgIE5vX2FyZ3VtZW50ICJzIiAvLyBkb27igJl0IGV2ZXIgZGlzcGxheSBlcnJvciBtZXNzYWdlcworIyBlbmRpZgorCQk7CisjZW5kaWYKKworaW50IGlwY2FsY19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaXBjYWxjX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHQ7CisJYm9vbCBoYXZlX25ldG1hc2sgPSAwOworCXN0cnVjdCBpbl9hZGRyIHNfbmV0bWFzaywgc19icm9hZGNhc3QsIHNfbmV0d29yaywgc19pcGFkZHI7CisJLyogc3RydWN0IGluX2FkZHIgeyBpbl9hZGRyX3Qgc19hZGRyOyB9ICBhbmQgIGluX2FkZHJfdAorCSAqICh3aGljaCBpbiB0dXJuIGlzIGp1c3QgYSB0eXBlZGVmIHRvIHVpbnQzMl90KQorCSAqIGFyZSBlc3NlbnRpYWxseSB0aGUgc2FtZSB0eXBlLiBBIGZldyBtYWNyb3MgZm9yIGxlc3MgdmVyYm9zaXR5OiAqLworI2RlZmluZSBuZXRtYXNrICAgKHNfbmV0bWFzay5zX2FkZHIpCisjZGVmaW5lIGJyb2FkY2FzdCAoc19icm9hZGNhc3Quc19hZGRyKQorI2RlZmluZSBuZXR3b3JrICAgKHNfbmV0d29yay5zX2FkZHIpCisjZGVmaW5lIGlwYWRkciAgICAoc19pcGFkZHIuc19hZGRyKQorCWNoYXIgKmlwc3RyOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBDQUxDX0xPTkdfT1BUSU9OUworCWFwcGxldF9sb25nX29wdGlvbnMgPSBpcGNhbGNfbG9uZ29wdHM7CisjZW5kaWYKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMTo/MiI7IC8qIG1pbmltdW0gMSBhcmcsIG1heGltdW0gMiBhcmdzICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIm1ibiIgSUZfRkVBVFVSRV9JUENBTENfRkFOQ1koInBocyIpKTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAob3B0ICYgU0lMRU5UKQorCQlsb2dtb2RlID0gTE9HTU9ERV9OT05FOyAvKiBzdXBwcmVzcyBlcnJvcl9tc2coKSBvdXRwdXQgKi8KKwlvcHQgJj0gflNJTEVOVDsKKwlpZiAoIShvcHQgJiAoQlJPQURDQVNUIHwgTkVUV09SSyB8IE5FVFBSRUZJWCkpKSB7CisJCS8qIGlmIG5vIG9wdGlvbnMgYXQgYWxsIG9yCisJCSAqIChubyBicm9hZGNhc3QsbmV0d29yayxwcmVmaXgpIGFuZCAodHdvIGFyZ3MpLi4uICovCisJCWlmICghb3B0IHx8IGFyZ3ZbMV0pCisJCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJaXBzdHIgPSBhcmd2WzBdOworCWlmIChFTkFCTEVfRkVBVFVSRV9JUENBTENfRkFOQ1kpIHsKKwkJdW5zaWduZWQgbG9uZyBuZXRwcmVmaXggPSAwOworCQljaGFyICpwcmVmaXhzdHI7CisKKwkJcHJlZml4c3RyID0gaXBzdHI7CisKKwkJd2hpbGUgKCpwcmVmaXhzdHIpIHsKKwkJCWlmICgqcHJlZml4c3RyID09ICcvJykgeworCQkJCSpwcmVmaXhzdHIrKyA9ICdcMCc7CisJCQkJaWYgKCpwcmVmaXhzdHIpIHsKKwkJCQkJdW5zaWduZWQgbXNrOworCQkJCQluZXRwcmVmaXggPSB4YXRvdWxfcmFuZ2UocHJlZml4c3RyLCAwLCAzMik7CisJCQkJCW5ldG1hc2sgPSAwOworCQkJCQltc2sgPSAweDgwMDAwMDAwOworCQkJCQl3aGlsZSAobmV0cHJlZml4ID4gMCkgeworCQkJCQkJbmV0bWFzayB8PSBtc2s7CisJCQkJCQltc2sgPj49IDE7CisJCQkJCQluZXRwcmVmaXgtLTsKKwkJCQkJfQorCQkJCQluZXRtYXNrID0gaHRvbmwobmV0bWFzayk7CisJCQkJCS8qIEV2ZW4gaWYgaXQgd2FzIDAsIHdlIHdpbGwgc2lnbmlmeSB0aGF0IHdlIGhhdmUgYSBuZXRtYXNrLiBUaGlzIGFsbG93cyAqLworCQkJCQkvKiBmb3Igc3BlY2lmaWNhdGlvbiBvZiBkZWZhdWx0IHJvdXRlcywgZXRjIHdoaWNoIGhhdmUgYSAwIG5ldG1hc2svcHJlZml4ICovCisJCQkJCWhhdmVfbmV0bWFzayA9IDE7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJcHJlZml4c3RyKys7CisJCX0KKwl9CisKKwlpZiAoaW5ldF9hdG9uKGlwc3RyLCAmc19pcGFkZHIpID09IDApIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBJUCBhZGRyZXNzOiAlcyIsIGFyZ3ZbMF0pOworCX0KKworCWlmIChhcmd2WzFdKSB7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9JUENBTENfRkFOQ1kgJiYgaGF2ZV9uZXRtYXNrKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidXNlIHByZWZpeCBvciBuZXRtYXNrLCBub3QgYm90aCIpOworCQl9CisJCWlmIChpbmV0X2F0b24oYXJndlsxXSwgJnNfbmV0bWFzaykgPT0gMCkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBuZXRtYXNrOiAlcyIsIGFyZ3ZbMV0pOworCQl9CisJfSBlbHNlIHsKKwkJLyogSkhDIC0gSWYgdGhlIG5ldG1hc2sgd2Fzbid0IHByb3ZpZGVkIHRoZW4gY2FsY3VsYXRlIGl0ICovCisJCWlmICghRU5BQkxFX0ZFQVRVUkVfSVBDQUxDX0ZBTkNZIHx8ICFoYXZlX25ldG1hc2spCisJCQluZXRtYXNrID0gZ2V0X25ldG1hc2soaXBhZGRyKTsKKwl9CisKKwlpZiAob3B0ICYgTkVUTUFTSykgeworCQlwcmludGYoIk5FVE1BU0s9JXNcbiIsIGluZXRfbnRvYShzX25ldG1hc2spKTsKKwl9CisKKwlpZiAob3B0ICYgQlJPQURDQVNUKSB7CisJCWJyb2FkY2FzdCA9IChpcGFkZHIgJiBuZXRtYXNrKSB8IH5uZXRtYXNrOworCQlwcmludGYoIkJST0FEQ0FTVD0lc1xuIiwgaW5ldF9udG9hKHNfYnJvYWRjYXN0KSk7CisJfQorCisJaWYgKG9wdCAmIE5FVFdPUkspIHsKKwkJbmV0d29yayA9IGlwYWRkciAmIG5ldG1hc2s7CisJCXByaW50ZigiTkVUV09SSz0lc1xuIiwgaW5ldF9udG9hKHNfbmV0d29yaykpOworCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9JUENBTENfRkFOQ1kpIHsKKwkJaWYgKG9wdCAmIE5FVFBSRUZJWCkgeworCQkJcHJpbnRmKCJQUkVGSVg9JWlcbiIsIGdldF9wcmVmaXgobmV0bWFzaykpOworCQl9CisKKwkJaWYgKG9wdCAmIEhPU1ROQU1FKSB7CisJCQlzdHJ1Y3QgaG9zdGVudCAqaG9zdGluZm87CisKKwkJCWhvc3RpbmZvID0gZ2V0aG9zdGJ5YWRkcigoY2hhciAqKSAmaXBhZGRyLCBzaXplb2YoaXBhZGRyKSwgQUZfSU5FVCk7CisJCQlpZiAoIWhvc3RpbmZvKSB7CisJCQkJYmJfaGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBmaW5kIGhvc3RuYW1lIGZvciAlcyIsIGFyZ3ZbMF0pOworCQkJfQorCQkJc3RyX3RvbG93ZXIoaG9zdGluZm8tPmhfbmFtZSk7CisKKwkJCXByaW50ZigiSE9TVE5BTUU9JXNcbiIsIGhvc3RpbmZvLT5oX25hbWUpOworCQl9CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvaXNydi5jIGIvbmV0d29ya2luZy9pc3J2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM2NDkxZQotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvaXNydi5jCkBAIC0wLDAgKzEsMzM4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBHZW5lcmljIG5vbi1mb3JraW5nIHNlcnZlciBpbmZyYXN0cnVjdHVyZS4KKyAqIEludGVuZGVkIHRvIG1ha2Ugd3JpdGluZyB0ZWxuZXRkLXR5cGUgc2VydmVycyBlYXNpZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJpc3J2LmgiCisKKyNkZWZpbmUgREVCVUcgMAorCisjaWYgREVCVUcKKyNkZWZpbmUgRFBSSU5URihhcmdzLi4uKSBiYl9lcnJvcl9tc2coYXJncykKKyNlbHNlCisjZGVmaW5lIERQUklOVEYoYXJncy4uLikgKCh2b2lkKTApCisjZW5kaWYKKworLyogSGVscGVycyAqLworCisvKiBPcGFxdWUgc3RydWN0dXJlICovCisKK3N0cnVjdCBpc3J2X3N0YXRlX3QgeworCXNob3J0ICAqZmQycGVlcjsgLyogb25lIHBlciByZWdpc3RlcmVkIGZkICovCisJdm9pZCAgKipwYXJhbV90Ymw7IC8qIG9uZSBwZXIgcmVnaXN0ZXJlZCBwZWVyICovCisJLyogb25lIHBlciByZWdpc3RlcmVkIHBlZXI7IGRvZXNuJ3QgZXhpc3QgaWYgIXRpbWVvdXQgKi8KKwl0aW1lX3QgKnRpbWVvX3RibDsKKwlpbnQgICAoKm5ld19wZWVyKShpc3J2X3N0YXRlX3QgKnN0YXRlLCBpbnQgZmQpOworCXRpbWVfdCAgY3VydGltZTsKKwlpbnQgICAgIHRpbWVvdXQ7CisJaW50ICAgICBmZF9jb3VudDsKKwlpbnQgICAgIHBlZXJfY291bnQ7CisJaW50ICAgICB3cl9jb3VudDsKKwlmZF9zZXQgIHJkOworCWZkX3NldCAgd3I7Cit9OworI2RlZmluZSBGRDJQRUVSICAgIChzdGF0ZS0+ZmQycGVlcikKKyNkZWZpbmUgUEFSQU1fVEJMICAoc3RhdGUtPnBhcmFtX3RibCkKKyNkZWZpbmUgVElNRU9fVEJMICAoc3RhdGUtPnRpbWVvX3RibCkKKyNkZWZpbmUgQ1VSVElNRSAgICAoc3RhdGUtPmN1cnRpbWUpCisjZGVmaW5lIFRJTUVPVVQgICAgKHN0YXRlLT50aW1lb3V0KQorI2RlZmluZSBGRF9DT1VOVCAgIChzdGF0ZS0+ZmRfY291bnQpCisjZGVmaW5lIFBFRVJfQ09VTlQgKHN0YXRlLT5wZWVyX2NvdW50KQorI2RlZmluZSBXUl9DT1VOVCAgIChzdGF0ZS0+d3JfY291bnQpCisKKy8qIGNhbGxiYWNrICovCit2b2lkIGlzcnZfd2FudF9yZChpc3J2X3N0YXRlX3QgKnN0YXRlLCBpbnQgZmQpCit7CisJRkRfU0VUKGZkLCAmc3RhdGUtPnJkKTsKK30KKworLyogY2FsbGJhY2sgKi8KK3ZvaWQgaXNydl93YW50X3dyKGlzcnZfc3RhdGVfdCAqc3RhdGUsIGludCBmZCkKK3sKKwlpZiAoIUZEX0lTU0VUKGZkLCAmc3RhdGUtPndyKSkgeworCQlXUl9DT1VOVCsrOworCQlGRF9TRVQoZmQsICZzdGF0ZS0+d3IpOworCX0KK30KKworLyogY2FsbGJhY2sgKi8KK3ZvaWQgaXNydl9kb250X3dhbnRfcmQoaXNydl9zdGF0ZV90ICpzdGF0ZSwgaW50IGZkKQoreworCUZEX0NMUihmZCwgJnN0YXRlLT5yZCk7Cit9CisKKy8qIGNhbGxiYWNrICovCit2b2lkIGlzcnZfZG9udF93YW50X3dyKGlzcnZfc3RhdGVfdCAqc3RhdGUsIGludCBmZCkKK3sKKwlpZiAoRkRfSVNTRVQoZmQsICZzdGF0ZS0+d3IpKSB7CisJCVdSX0NPVU5ULS07CisJCUZEX0NMUihmZCwgJnN0YXRlLT53cik7CisJfQorfQorCisvKiBjYWxsYmFjayAqLworaW50IGlzcnZfcmVnaXN0ZXJfZmQoaXNydl9zdGF0ZV90ICpzdGF0ZSwgaW50IHBlZXIsIGludCBmZCkKK3sKKwlpbnQgbjsKKworCURQUklOVEYoInJlZ2lzdGVyX2ZkKHBlZXI6JWQsZmQ6JWQpIiwgcGVlciwgZmQpOworCisJaWYgKEZEX0NPVU5UID49IEZEX1NFVFNJWkUpIHJldHVybiAtMTsKKwlpZiAoRkRfQ09VTlQgPD0gZmQpIHsKKwkJbiA9IEZEX0NPVU5UOworCQlGRF9DT1VOVCA9IGZkICsgMTsKKworCQlEUFJJTlRGKCJyZWdpc3Rlcl9mZDogRkRfQ09VTlQgJWQiLCBGRF9DT1VOVCk7CisKKwkJRkQyUEVFUiA9IHhyZWFsbG9jKEZEMlBFRVIsIEZEX0NPVU5UICogc2l6ZW9mKEZEMlBFRVJbMF0pKTsKKwkJd2hpbGUgKG4gPCBmZCkgRkQyUEVFUltuKytdID0gLTE7CisJfQorCisJRFBSSU5URigicmVnaXN0ZXJfZmQ6IEZEMlBFRVJbJWRdID0gJWQiLCBmZCwgcGVlcik7CisKKwlGRDJQRUVSW2ZkXSA9IHBlZXI7CisJcmV0dXJuIDA7Cit9CisKKy8qIGNhbGxiYWNrICovCit2b2lkIGlzcnZfY2xvc2VfZmQoaXNydl9zdGF0ZV90ICpzdGF0ZSwgaW50IGZkKQoreworCURQUklOVEYoImNsb3NlX2ZkKCVkKSIsIGZkKTsKKworCWNsb3NlKGZkKTsKKwlpc3J2X2RvbnRfd2FudF9yZChzdGF0ZSwgZmQpOworCWlmIChXUl9DT1VOVCkgaXNydl9kb250X3dhbnRfd3Ioc3RhdGUsIGZkKTsKKworCUZEMlBFRVJbZmRdID0gLTE7CisJaWYgKGZkID09IEZEX0NPVU5ULTEpIHsKKwkJZG8gZmQtLTsgd2hpbGUgKGZkID49IDAgJiYgRkQyUEVFUltmZF0gPT0gLTEpOworCQlGRF9DT1VOVCA9IGZkICsgMTsKKworCQlEUFJJTlRGKCJjbG9zZV9mZDogRkRfQ09VTlQgJWQiLCBGRF9DT1VOVCk7CisKKwkJRkQyUEVFUiA9IHhyZWFsbG9jKEZEMlBFRVIsIEZEX0NPVU5UICogc2l6ZW9mKEZEMlBFRVJbMF0pKTsKKwl9Cit9CisKKy8qIGNhbGxiYWNrICovCitpbnQgaXNydl9yZWdpc3Rlcl9wZWVyKGlzcnZfc3RhdGVfdCAqc3RhdGUsIHZvaWQgKnBhcmFtKQoreworCWludCBuOworCisJaWYgKFBFRVJfQ09VTlQgPj0gRkRfU0VUU0laRSkgcmV0dXJuIC0xOworCW4gPSBQRUVSX0NPVU5UKys7CisKKwlEUFJJTlRGKCJyZWdpc3Rlcl9wZWVyOiBQRUVSX0NPVU5UICVkIiwgUEVFUl9DT1VOVCk7CisKKwlQQVJBTV9UQkwgPSB4cmVhbGxvYyhQQVJBTV9UQkwsIFBFRVJfQ09VTlQgKiBzaXplb2YoUEFSQU1fVEJMWzBdKSk7CisJUEFSQU1fVEJMW25dID0gcGFyYW07CisJaWYgKFRJTUVPVVQpIHsKKwkJVElNRU9fVEJMID0geHJlYWxsb2MoVElNRU9fVEJMLCBQRUVSX0NPVU5UICogc2l6ZW9mKFRJTUVPX1RCTFswXSkpOworCQlUSU1FT19UQkxbbl0gPSBDVVJUSU1FOworCX0KKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX3BlZXIoaXNydl9zdGF0ZV90ICpzdGF0ZSwgaW50IHBlZXIpCit7CisJaW50IG1vdmVzaXplOworCWludCBmZDsKKworCURQUklOVEYoInJlbW92ZV9wZWVyKCVkKSIsIHBlZXIpOworCisJZmQgPSBGRF9DT1VOVCAtIDE7CisJd2hpbGUgKGZkID49IDApIHsKKwkJaWYgKEZEMlBFRVJbZmRdID09IHBlZXIpIHsKKwkJCWlzcnZfY2xvc2VfZmQoc3RhdGUsIGZkKTsKKwkJCWZkLS07CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoRkQyUEVFUltmZF0gPiBwZWVyKQorCQkJRkQyUEVFUltmZF0tLTsKKwkJZmQtLTsKKwl9CisKKwlQRUVSX0NPVU5ULS07CisJRFBSSU5URigicmVtb3ZlX3BlZXI6IFBFRVJfQ09VTlQgJWQiLCBQRUVSX0NPVU5UKTsKKworCW1vdmVzaXplID0gKFBFRVJfQ09VTlQgLSBwZWVyKSAqIHNpemVvZih2b2lkKik7CisJaWYgKG1vdmVzaXplID4gMCkgeworCQltZW1jcHkoJlBBUkFNX1RCTFtwZWVyXSwgJlBBUkFNX1RCTFtwZWVyKzFdLCBtb3Zlc2l6ZSk7CisJCWlmIChUSU1FT1VUKQorCQkJbWVtY3B5KCZUSU1FT19UQkxbcGVlcl0sICZUSU1FT19UQkxbcGVlcisxXSwgbW92ZXNpemUpOworCX0KKwlQQVJBTV9UQkwgPSB4cmVhbGxvYyhQQVJBTV9UQkwsIFBFRVJfQ09VTlQgKiBzaXplb2YoUEFSQU1fVEJMWzBdKSk7CisJaWYgKFRJTUVPVVQpCisJCVRJTUVPX1RCTCA9IHhyZWFsbG9jKFRJTUVPX1RCTCwgUEVFUl9DT1VOVCAqIHNpemVvZihUSU1FT19UQkxbMF0pKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2FjY2VwdChpc3J2X3N0YXRlX3QgKnN0YXRlLCBpbnQgZmQpCit7CisJaW50IG4sIG5ld2ZkOworCisJLyogc3VwcHJlc3MgZ2NjIHdhcm5pbmcgImNhc3QgZnJvbSBwdHIgdG8gaW50IG9mIGRpZmZlcmVudCBzaXplIiAqLworCWZjbnRsKGZkLCBGX1NFVEZMLCAoaW50KShwdHJkaWZmX3QpKFBBUkFNX1RCTFswXSkgfCBPX05PTkJMT0NLKTsKKwluZXdmZCA9IGFjY2VwdChmZCwgTlVMTCwgMCk7CisJZmNudGwoZmQsIEZfU0VURkwsIChpbnQpKHB0cmRpZmZfdCkoUEFSQU1fVEJMWzBdKSk7CisJaWYgKG5ld2ZkIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRUFHQUlOKSByZXR1cm47CisJCS8qIE1vc3QgcHJvYmFibHkgc29tZW9uZSBnYXZlIHVzIHdyb25nIGZkIHR5cGUKKwkJICogKGZvciBleGFtcGxlLCBub24tc29ja2V0KS4gRG9uJ3Qgd2FudAorCQkgKiB0byBsb29wIGZvcmV2ZXIuICovCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiYWNjZXB0Iik7CisJfQorCisJRFBSSU5URigibmV3X3BlZXIoJWQpIiwgbmV3ZmQpOworCW4gPSBzdGF0ZS0+bmV3X3BlZXIoc3RhdGUsIG5ld2ZkKTsKKwlpZiAobikKKwkJcmVtb3ZlX3BlZXIoc3RhdGUsIG4pOyAvKiB1bnN1Y2Nlc2Z1bCBwZWVyIHN0YXJ0ICovCit9CisKK3ZvaWQgQlVHX3NpemVvZl9mZF9zZXRfaXNfc3RyYW5nZSh2b2lkKTsKK3N0YXRpYyB2b2lkIGhhbmRsZV9mZF9zZXQoaXNydl9zdGF0ZV90ICpzdGF0ZSwgZmRfc2V0ICpmZHMsIGludCAoKmgpKGludCwgdm9pZCAqKikpCit7CisJZW51bSB7IExPTkdfQ05UID0gc2l6ZW9mKGZkX3NldCkgLyBzaXplb2YobG9uZykgfTsKKwlpbnQgZmRzX3BvczsKKwlpbnQgZmQsIHBlZXI7CisJLyogbmVlZCB0byBrbm93IHZhbHVlIGF0IF90aGUgYmVnaW5uaW5nXyBvZiB0aGlzIHJvdXRpbmUgKi8KKwlpbnQgZmRfY250ID0gRkRfQ09VTlQ7CisKKwlpZiAoTE9OR19DTlQgKiBzaXplb2YobG9uZykgIT0gc2l6ZW9mKGZkX3NldCkpCisJCUJVR19zaXplb2ZfZmRfc2V0X2lzX3N0cmFuZ2UoKTsKKworCWZkc19wb3MgPSAwOworCXdoaWxlICgxKSB7CisJCS8qIEZpbmQgbmV4dCBub256ZXJvIGJpdCAqLworCQl3aGlsZSAoZmRzX3BvcyA8IExPTkdfQ05UKSB7CisJCQlpZiAoKChsb25nKilmZHMpW2Zkc19wb3NdID09IDApIHsKKwkJCQlmZHNfcG9zKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBGb3VuZCBub24temVybyB3b3JkICovCisJCQlmZCA9IGZkc19wb3MgKiBzaXplb2YobG9uZykqODsgLyogd29yZCMgLT4gYml0IyAqLworCQkJd2hpbGUgKDEpIHsKKwkJCQlpZiAoRkRfSVNTRVQoZmQsIGZkcykpIHsKKwkJCQkJRkRfQ0xSKGZkLCBmZHMpOworCQkJCQlnb3RvIGZvdW5kX2ZkOworCQkJCX0KKwkJCQlmZCsrOworCQkJfQorCQl9CisJCWJyZWFrOyAvKiBhbGwgd29yZHMgYXJlIHplcm8gKi8KKyBmb3VuZF9mZDoKKwkJaWYgKGZkID49IGZkX2NudCkgeyAvKiBwYXJhbm9pYSAqLworCQkJRFBSSU5URigiaGFuZGxlX2ZkX3NldDogZmQgPiBmZF9jbnQ/PyAoJWQgPiAlZCkiLAorCQkJCQlmZCwgZmRfY250KTsKKwkJCWJyZWFrOworCQl9CisJCURQUklOVEYoImhhbmRsZV9mZF9zZXQ6IGZkICVkIGlzIGFjdGl2ZSIsIGZkKTsKKwkJcGVlciA9IEZEMlBFRVJbZmRdOworCQlpZiAocGVlciA8IDApCisJCQljb250aW51ZTsgLyogcGVlciBpcyBhbHJlYWR5IGdvbmUgKi8KKwkJaWYgKHBlZXIgPT0gMCkgeworCQkJaGFuZGxlX2FjY2VwdChzdGF0ZSwgZmQpOworCQkJY29udGludWU7CisJCX0KKwkJRFBSSU5URigiaChmZDolZCkiLCBmZCk7CisJCWlmIChoKGZkLCAmUEFSQU1fVEJMW3BlZXJdKSkgeworCQkJLyogdGhpcyBwZWVyIGlzIGdvbmUgKi8KKwkJCXJlbW92ZV9wZWVyKHN0YXRlLCBwZWVyKTsKKwkJfSBlbHNlIGlmIChUSU1FT1VUKSB7CisJCQlUSU1FT19UQkxbcGVlcl0gPSBtb25vdG9uaWNfc2VjKCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGhhbmRsZV90aW1lb3V0KGlzcnZfc3RhdGVfdCAqc3RhdGUsIGludCAoKmRvX3RpbWVvdXQpKHZvaWQgKiopKQoreworCWludCBuLCBwZWVyOworCXBlZXIgPSBQRUVSX0NPVU5ULTE7CisJLyogcGVlciAwIGlzIG5vdCBjaGVja2VkICovCisJd2hpbGUgKHBlZXIgPiAwKSB7CisJCURQUklOVEYoInBlZXIgJWQ6IHRpbWUgZGlmZiAlZCIsIHBlZXIsCisJCQkJKGludCkoQ1VSVElNRSAtIFRJTUVPX1RCTFtwZWVyXSkpOworCQlpZiAoKENVUlRJTUUgLSBUSU1FT19UQkxbcGVlcl0pID49IFRJTUVPVVQpIHsKKwkJCURQUklOVEYoInBlZXIgJWQ6IGRvX3RpbWVvdXQoKSIsIHBlZXIpOworCQkJbiA9IGRvX3RpbWVvdXQoJlBBUkFNX1RCTFtwZWVyXSk7CisJCQlpZiAobikKKwkJCQlyZW1vdmVfcGVlcihzdGF0ZSwgcGVlcik7CisJCX0KKwkJcGVlci0tOworCX0KK30KKworLyogRHJpdmVyICovCit2b2lkIGlzcnZfcnVuKAorCWludCBsaXN0ZW5fZmQsCisJaW50ICgqbmV3X3BlZXIpKGlzcnZfc3RhdGVfdCAqc3RhdGUsIGludCBmZCksCisJaW50ICgqZG9fcmQpKGludCBmZCwgdm9pZCAqKiksCisJaW50ICgqZG9fd3IpKGludCBmZCwgdm9pZCAqKiksCisJaW50ICgqZG9fdGltZW91dCkodm9pZCAqKiksCisJaW50IHRpbWVvdXQsCisJaW50IGxpbmdlcl90aW1lb3V0KQoreworCWlzcnZfc3RhdGVfdCAqc3RhdGUgPSB4emFsbG9jKHNpemVvZigqc3RhdGUpKTsKKwlzdGF0ZS0+bmV3X3BlZXIgPSBuZXdfcGVlcjsKKwlzdGF0ZS0+dGltZW91dCAgPSB0aW1lb3V0OworCisJLyogcmVnaXN0ZXIgInBlZXIiICMwIC0gaXQgd2lsbCBhY2NlcHQgbmV3IGNvbm5lY3Rpb25zICovCisJaXNydl9yZWdpc3Rlcl9wZWVyKHN0YXRlLCBOVUxMKTsKKwlpc3J2X3JlZ2lzdGVyX2ZkKHN0YXRlLCAvKnBlZXI6Ki8gMCwgbGlzdGVuX2ZkKTsKKwlpc3J2X3dhbnRfcmQoc3RhdGUsIGxpc3Rlbl9mZCk7CisJLyogcmVtZW1iZXIgZmxhZ3MgdG8gbWFrZSBibG9ja2luZzwtPm5vbmJsb2NraW5nIHN3aXRjaCBmYXN0ZXIgKi8KKwkvKiAoc3VwcHJlc3MgZ2NjIHdhcm5pbmcgImNhc3QgZnJvbSBwdHIgdG8gaW50IG9mIGRpZmZlcmVudCBzaXplIikgKi8KKwlQQVJBTV9UQkxbMF0gPSAodm9pZCopKHB0cmRpZmZfdCkoZmNudGwobGlzdGVuX2ZkLCBGX0dFVEZMKSk7CisKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgdGltZXZhbCB0djsKKwkJZmRfc2V0IHJkOworCQlmZF9zZXQgd3I7CisJCWZkX3NldCAqd3JwID0gTlVMTDsKKwkJaW50IG47CisKKwkJdHYudHZfc2VjID0gdGltZW91dDsKKwkJaWYgKFBFRVJfQ09VTlQgPD0gMSkKKwkJCXR2LnR2X3NlYyA9IGxpbmdlcl90aW1lb3V0OworCQl0di50dl91c2VjID0gMDsKKwkJcmQgPSBzdGF0ZS0+cmQ7CisJCWlmIChXUl9DT1VOVCkgeworCQkJd3IgPSBzdGF0ZS0+d3I7CisJCQl3cnAgPSAmd3I7CisJCX0KKworCQlEUFJJTlRGKCJydW46IHNlbGVjdChGRF9DT1VOVDolZCx0aW1lb3V0OiVkKS4uLiIsCisJCQkJRkRfQ09VTlQsIChpbnQpdHYudHZfc2VjKTsKKwkJbiA9IHNlbGVjdChGRF9DT1VOVCwgJnJkLCB3cnAsIE5VTEwsIHR2LnR2X3NlYyA/ICZ0diA6IE5VTEwpOworCQlEUFJJTlRGKCJydW46IC4uLnNlbGVjdDolZCIsIG4pOworCisJCWlmIChuIDwgMCkgeworCQkJaWYgKGVycm5vICE9IEVJTlRSKQorCQkJCWJiX3BlcnJvcl9tc2coInNlbGVjdCIpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAobiA9PSAwICYmIGxpbmdlcl90aW1lb3V0ICYmIFBFRVJfQ09VTlQgPD0gMSkKKwkJCWJyZWFrOworCisJCWlmICh0aW1lb3V0KSB7CisJCQl0aW1lX3QgdCA9IG1vbm90b25pY19zZWMoKTsKKwkJCWlmICh0ICE9IENVUlRJTUUpIHsKKwkJCQlDVVJUSU1FID0gdDsKKwkJCQloYW5kbGVfdGltZW91dChzdGF0ZSwgZG9fdGltZW91dCk7CisJCQl9CisJCX0KKwkJaWYgKG4gPiAwKSB7CisJCQloYW5kbGVfZmRfc2V0KHN0YXRlLCAmcmQsIGRvX3JkKTsKKwkJCWlmICh3cnApCisJCQkJaGFuZGxlX2ZkX3NldChzdGF0ZSwgd3JwLCBkb193cik7CisJCX0KKwl9CisJRFBSSU5URigicnVuOiBiYWlsb3V0Iik7CisJLyogTkI6IGFjY2VwdCBzb2NrZXQgaXMgbm90IGNsb3NlZC4gQ2FsbGVyIGlzIHRvIGRlY2lkZSB3aGF0IHRvIGRvICovCit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2lzcnYuaCBiL25ldHdvcmtpbmcvaXNydi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMTJlMGUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL2lzcnYuaApAQCAtMCwwICsxLDYxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBHZW5lcmljIG5vbi1mb3JraW5nIHNlcnZlciBpbmZyYXN0cnVjdHVyZS4KKyAqIEludGVuZGVkIHRvIG1ha2Ugd3JpdGluZyB0ZWxuZXRkLXR5cGUgc2VydmVycyBlYXNpZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworLyogb3BhcXVlIHN0cnVjdHVyZSAqLworc3RydWN0IGlzcnZfc3RhdGVfdDsKK3R5cGVkZWYgc3RydWN0IGlzcnZfc3RhdGVfdCBpc3J2X3N0YXRlX3Q7CisKKy8qIGNhbGxiYWNrcyAqLwordm9pZCBpc3J2X3dhbnRfcmQoaXNydl9zdGF0ZV90ICpzdGF0ZSwgaW50IGZkKTsKK3ZvaWQgaXNydl93YW50X3dyKGlzcnZfc3RhdGVfdCAqc3RhdGUsIGludCBmZCk7Cit2b2lkIGlzcnZfZG9udF93YW50X3JkKGlzcnZfc3RhdGVfdCAqc3RhdGUsIGludCBmZCk7Cit2b2lkIGlzcnZfZG9udF93YW50X3dyKGlzcnZfc3RhdGVfdCAqc3RhdGUsIGludCBmZCk7CitpbnQgaXNydl9yZWdpc3Rlcl9mZChpc3J2X3N0YXRlX3QgKnN0YXRlLCBpbnQgcGVlciwgaW50IGZkKTsKK3ZvaWQgaXNydl9jbG9zZV9mZChpc3J2X3N0YXRlX3QgKnN0YXRlLCBpbnQgZmQpOworaW50IGlzcnZfcmVnaXN0ZXJfcGVlcihpc3J2X3N0YXRlX3QgKnN0YXRlLCB2b2lkICpwYXJhbSk7CisKKy8qIERyaXZlcjoKKyAqCisgKiBTZWxlY3Qgb24gbGlzdGVuX2ZkIGZvciA8bGluZ2VyX3RpbWVvdXQ+IChvciBmb3JldmVyIGlmIDApLgorICoKKyAqIElmIHdlIHRpbWUgb3V0IGFuZCB3ZSBoYXZlIG5vIHBlZXJzLCBleGl0LgorICogSWYgd2UgaGF2ZSBwZWVycywgY2FsbCBkb190aW1lb3V0KHBlZXJfcGFyYW0pLAorICogaWYgaXQgcmV0dXJucyAhMCwgcGVlciBpcyByZW1vdmVkLgorICoKKyAqIElmIGxpc3Rlbl9mZCBpcyBhY3RpdmUsIGFjY2VwdCBuZXcgY29ubmVjdGlvbiAoInBlZXIiKSwKKyAqIGNhbGwgbmV3X3BlZXIoKSBvbiBpdCwgYW5kIGlmIGl0IHJldHVybnMgMCwKKyAqIGFkZCBpdCB0byBmZHMgdG8gc2VsZWN0IG9uLgorICogTm93LCBzZWxlY3Qgd2lsbCB3YWl0IGZvciA8dGltZW91dD4sIG5vdCA8bGluZ2VyX3RpbWVvdXQ+CisgKiAoYXMgbG9uZyBhcyB3ZSBoYXZlIG1vcmUgdGhhbiB6ZXJvIHBlZXJzKS4KKyAqCisgKiBJZiBhIHBlZXIncyBmZCBpcyBhY3RpdmUsIHdlIGNhbGwgZG9fcmQoKSBvbiBpdCBpZiByZWFkCisgKiBiaXQgd2FzIHNldCwgYW5kIHRoZW4gZG9fd3IoKSBpZiB3cml0ZSBiaXQgd2FzIGFsc28gc2V0LgorICogSWYgZWl0aGVyIHJldHVybnMgITAsIHBlZXIgaXMgcmVtb3ZlZC4KKyAqIFJlYWNoaW5nIHRoaXMgcGxhY2UgYWxzbyByZXNldHMgdGltZW91dCBjb3VudGVyIGZvciB0aGlzIHBlZXIuCisgKgorICogTm90ZSB0aGF0IHBlZXIgbXVzdCBpbmRpY2F0ZSB0aGF0IGhlIHdhbnRzIHRvIGJlIHNlbGVjdGVkCisgKiBmb3IgcmVhZCBhbmQvb3Igd3JpdGUgdXNpbmcgaXNydl93YW50X3JkKCkvaXNydl93YW50X3dyKCkKKyAqIFtjYW4gYmUgY2FsbGVkIGluIG5ld19wZWVyKCkgb3IgaW4gZG9fcmQoKS9kb193cigpXS4KKyAqIElmIGl0IG5ldmVyIHdhbnRzIHRvIGJlIHNlbGVjdGVkIGZvciB3cml0ZSwgZG9fd3IoKQorICogd2lsbCBuZXZlciBiZSBjYWxsZWQgKGNhbiBiZSBOVUxMKS4KKyAqLwordm9pZCBpc3J2X3J1bigKKwlpbnQgbGlzdGVuX2ZkLAorCWludCAoKm5ld19wZWVyKShpc3J2X3N0YXRlX3QgKnN0YXRlLCBpbnQgZmQpLAorCWludCAoKmRvX3JkKShpbnQgZmQsIHZvaWQgKiopLAorCWludCAoKmRvX3dyKShpbnQgZmQsIHZvaWQgKiopLAorCWludCAoKmRvX3RpbWVvdXQpKHZvaWQgKiopLAorCWludCB0aW1lb3V0LAorCWludCBsaW5nZXJfdGltZW91dAorKTsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvaXNydl9pZGVudGQuYyBiL25ldHdvcmtpbmcvaXNydl9pZGVudGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTJjOGFiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9pc3J2X2lkZW50ZC5jCkBAIC0wLDAgKzEsMTU1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBGYWtlIGlkZW50ZCBzZXJ2ZXIuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZmFrZWlkZW50ZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1maXddIFstYiBBRERSXSBbU1RSSU5HXSIKKy8vdXNhZ2U6I2RlZmluZSBmYWtlaWRlbnRkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJvdmlkZSBmYWtlIGlkZW50IChhdXRoKSBzZXJ2aWNlXG4iCisvL3VzYWdlOiAgICAgIlxuCS1mCVJ1biBpbiBmb3JlZ3JvdW5kIgorLy91c2FnZTogICAgICJcbgktaQlJbmV0ZCBtb2RlIgorLy91c2FnZTogICAgICJcbgktdwlJbmV0ZCAnd2FpdCcgbW9kZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWIgQUREUglCaW5kIHRvIHNwZWNpZmllZCBhZGRyZXNzIgorLy91c2FnZTogICAgICJcbglTVFJJTkcJSWRlbnQgYW5zd2VyIHN0cmluZyAoZGVmYXVsdDogbm9ib2R5KSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSAiaXNydi5oIgorCitlbnVtIHsgVElNRU9VVCA9IDIwIH07CisKK3R5cGVkZWYgc3RydWN0IGlkZW50ZF9idWZfdCB7CisJaW50IHBvczsKKwljaGFyIGJ1Zls2NCAtIHNpemVvZihpbnQpXTsKK30gaWRlbnRkX2J1Zl90OworCisjZGVmaW5lIGJvZ291c2VyIGJiX2NvbW1vbl9idWZzaXoxCisKK3N0YXRpYyBpbnQgbmV3X3BlZXIoaXNydl9zdGF0ZV90ICpzdGF0ZSwgaW50IGZkKQoreworCWludCBwZWVyOworCWlkZW50ZF9idWZfdCAqYnVmID0geHphbGxvYyhzaXplb2YoKmJ1ZikpOworCisJcGVlciA9IGlzcnZfcmVnaXN0ZXJfcGVlcihzdGF0ZSwgYnVmKTsKKwlpZiAocGVlciA8IDApCisJCXJldHVybiAwOyAvKiBmYWlsdXJlICovCisJaWYgKGlzcnZfcmVnaXN0ZXJfZmQoc3RhdGUsIHBlZXIsIGZkKSA8IDApCisJCXJldHVybiBwZWVyOyAvKiBmYWlsdXJlLCB1bnJlZ2lzdGVyIHBlZXIgKi8KKworCW5kZWxheV9vbihmZCk7CisJaXNydl93YW50X3JkKHN0YXRlLCBmZCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZG9fcmQoaW50IGZkLCB2b2lkICoqcGFyYW1wKQoreworCWlkZW50ZF9idWZfdCAqYnVmID0gKnBhcmFtcDsKKwljaGFyICpjdXIsICpwOworCWludCBzejsKKworCWN1ciA9IGJ1Zi0+YnVmICsgYnVmLT5wb3M7CisKKwlzeiA9IHNhZmVfcmVhZChmZCwgY3VyLCBzaXplb2YoYnVmLT5idWYpIC0gMSAtIGJ1Zi0+cG9zKTsKKworCWlmIChzeiA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVBR0FJTikKKwkJCWdvdG8gdGVybTsKKwkJcmV0dXJuIDA7IC8qICJzZXNzaW9uIGlzIG9rIiAqLworCX0KKworCWJ1Zi0+cG9zICs9IHN6OworCWJ1Zi0+YnVmW2J1Zi0+cG9zXSA9ICdcMCc7CisJcCA9IHN0cnBicmsoY3VyLCAiXHJcbiIpOworCWlmIChwKQorCQkqcCA9ICdcMCc7CisJaWYgKCFwICYmIHN6KQorCQlyZXR1cm4gMDsgIC8qICJzZXNzaW9uIGlzIG9rIiAqLworCisJLyogVGVybWluYXRlIHNlc3Npb24uIElmIHdlIGFyZSBpbiBzZXJ2ZXIgbW9kZSwgdGhlbgorCSAqIGZkIGlzIHN0aWxsIGluIG5vbmJsb2NraW5nIG1vZGUgLSB3ZSBuZXZlciBibG9jayBoZXJlICovCisJaWYgKGZkID09IDApCisJCWZkKys7IC8qIGluZXRkIG1vZGU/IHRoZW4gd3JpdGUgdG8gZmQgMSAqLworCWZkcHJpbnRmKGZkLCAiJXMgOiBVU0VSSUQgOiBVTklYIDogJXNcclxuIiwgYnVmLT5idWYsIGJvZ291c2VyKTsKKwkvKgorCSAqIFdoeSBib3RoZXIgaWYgd2UgYXJlIGdvaW5nIHRvIGNsb3NlIGZkIG5vdyBhbnl3YXk/CisJICogaWYgKHNlcnZlcikKKwkgKgluZGVsYXlfb2ZmKGZkKTsKKwkgKi8KKyB0ZXJtOgorCWZyZWUoYnVmKTsKKwlyZXR1cm4gMTsgLyogInRlcm1pbmF0ZSIgKi8KK30KKworc3RhdGljIGludCBkb190aW1lb3V0KHZvaWQgKipwYXJhbXAgVU5VU0VEX1BBUkFNKQoreworCXJldHVybiAxOyAvKiB0ZXJtaW5hdGUgc2Vzc2lvbiAqLworfQorCitzdGF0aWMgdm9pZCBpbmV0ZF9tb2RlKHZvaWQpCit7CisJaWRlbnRkX2J1Zl90ICpidWYgPSB4emFsbG9jKHNpemVvZigqYnVmKSk7CisJLyogYnVmLT5wb3MgPSAwOyAtIHh6YWxsb2MgZGlkIGl0ICovCisJZG8KKwkJYWxhcm0oVElNRU9VVCk7CisJCS8qIE5vdGU6IHdlIGRvIE5PVCB3YW50IG5vbmJsb2NraW5nIEkvTyBoZXJlISAqLworCXdoaWxlIChkb19yZCgwLCAodm9pZCopJmJ1ZikgPT0gMCk7Cit9CisKK2ludCBmYWtlaWRlbnRkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBmYWtlaWRlbnRkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwllbnVtIHsKKwkJT1BUX2ZvcmVncm91bmQgPSAweDEsCisJCU9QVF9pbmV0ZCAgICAgID0gMHgyLAorCQlPUFRfaW5ldGR3YWl0ICA9IDB4NCwKKwkJT1BUX2ZpdyAgICAgICAgPSAweDcsCisJCU9QVF9iaW5kYWRkciAgID0gMHg4LAorCX07CisKKwljb25zdCBjaGFyICpiaW5kX2FkZHJlc3MgPSBOVUxMOworCXVuc2lnbmVkIG9wdDsKKwlpbnQgZmQ7CisKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiZml3YjoiLCAmYmluZF9hZGRyZXNzKTsKKwlzdHJjcHkoYm9nb3VzZXIsICJub2JvZHkiKTsKKwlpZiAoYXJndltvcHRpbmRdKQorCQlzdHJuY3B5KGJvZ291c2VyLCBhcmd2W29wdGluZF0sIHNpemVvZihib2dvdXNlcikgLSAxKTsKKworCS8qIERhZW1vbml6ZSBpZiBubyAtZiBhbmQgbm8gLWkgYW5kIG5vIC13ICovCisJaWYgKCEob3B0ICYgT1BUX2ZpdykpCisJCWJiX2RhZW1vbml6ZV9vcl9yZXhlYygwLCBhcmd2KTsKKworCS8qIFdoZXJlIHRvIGxvZyBpbiBpbmV0ZCBtb2Rlcz8gIkNsYXNzaWMiIGluZXRkCisJICogcHJvYmFibHkgaGFzIGl0cyBzdGRlcnIgL2Rldi9udWxsJ2VkICh3ZSBuZWVkIGxvZyB0byBzeXNsb2c/KSwKKwkgKiBidXQgZGFlbW9udG9vbHMtbGlrZSB1dGlsaXRpZXMgdXN1YWxseSBleHBlY3QgdGhhdCBjaGlsZHJlbgorCSAqIGxvZyB0byBzdGRlcnIuIEkgbGlrZSBkYWVtb250b29scyBtb3JlLiBHbyB0aGVpciB3YXkuCisJICogKE9yIG1heWJlIHdlIG5lZWQgeWV0IGFub3RoZXIgb3B0aW9uICJsb2cgdG8gc3lzbG9nIikgKi8KKwlpZiAoIShvcHQgJiBPUFRfZml3KSAvKiB8fCAob3B0ICYgT1BUX3N5c2xvZykgKi8pIHsKKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgTE9HX1BJRCwgTE9HX0RBRU1PTik7CisJCWxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsKKwl9CisKKwlpZiAob3B0ICYgT1BUX2luZXRkKSB7CisJCWluZXRkX21vZGUoKTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyogSWdub3JlIGNsb3NlZCBjb25uZWN0aW9ucyB3aGVuIHdyaXRpbmcgKi8KKwlzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisKKwlmZCA9IDA7CisJaWYgKCEob3B0ICYgT1BUX2luZXRkd2FpdCkpIHsKKwkJZmQgPSBjcmVhdGVfYW5kX2JpbmRfc3RyZWFtX29yX2RpZShiaW5kX2FkZHJlc3MsCisJCQkJYmJfbG9va3VwX3BvcnQoImlkZW50ZCIsICJ0Y3AiLCAxMTMpKTsKKwkJeGxpc3RlbihmZCwgNSk7CisJfQorCisJaXNydl9ydW4oZmQsIG5ld19wZWVyLCBkb19yZCwgLypkb193cjoqLyBOVUxMLCBkb190aW1lb3V0LAorCQkJVElNRU9VVCwgKG9wdCAmIE9QVF9pbmV0ZHdhaXQpID8gVElNRU9VVCA6IDApOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9saWJpcHJvdXRlL0tidWlsZC5zcmMgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzc4ZjNjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL0tidWlsZC5zcmMKQEAgLTAsMCArMSw2NiBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisjCisKK2xpYi15Oj0KKworSU5TRVJUCisKK2xpYi0kKENPTkZJR19TTEFUVEFDSCkgKz0gXAorCXV0aWxzLm8KKworbGliLSQoQ09ORklHX0lQKSArPSBcCisJaXBfcGFyc2VfY29tbW9uX2FyZ3MubyBcCisJbGlibmV0bGluay5vIFwKKwlsbF9hZGRyLm8gXAorCWxsX21hcC5vIFwKKwlsbF9wcm90by5vIFwKKwlsbF90eXBlcy5vIFwKKwlydF9uYW1lcy5vIFwKKwlydG1fbWFwLm8gXAorCXV0aWxzLm8KKworbGliLSQoQ09ORklHX0ZFQVRVUkVfSVBfQUREUkVTUykgKz0gXAorCWlwX3BhcnNlX2NvbW1vbl9hcmdzLm8gXAorCWlwYWRkcmVzcy5vIFwKKwlsaWJuZXRsaW5rLm8gXAorCWxsX2FkZHIubyBcCisJbGxfbWFwLm8gXAorCWxsX3R5cGVzLm8gXAorCXJ0X25hbWVzLm8gXAorCXV0aWxzLm8KKworbGliLSQoQ09ORklHX0ZFQVRVUkVfSVBfTElOSykgKz0gXAorCWlwX3BhcnNlX2NvbW1vbl9hcmdzLm8gXAorCWlwYWRkcmVzcy5vIFwKKwlpcGxpbmsubyBcCisJbGlibmV0bGluay5vIFwKKwlsbF9hZGRyLm8gXAorCWxsX21hcC5vIFwKKwlsbF90eXBlcy5vIFwKKwlydF9uYW1lcy5vIFwKKwl1dGlscy5vCisKK2xpYi0kKENPTkZJR19GRUFUVVJFX0lQX1JPVVRFKSArPSBcCisJaXBfcGFyc2VfY29tbW9uX2FyZ3MubyBcCisJaXByb3V0ZS5vIFwKKwlsaWJuZXRsaW5rLm8gXAorCWxsX21hcC5vIFwKKwlydF9uYW1lcy5vIFwKKwlydG1fbWFwLm8gXAorCXV0aWxzLm8KKworbGliLSQoQ09ORklHX0ZFQVRVUkVfSVBfVFVOTkVMKSArPSBcCisJaXBfcGFyc2VfY29tbW9uX2FyZ3MubyBcCisJaXB0dW5uZWwubyBcCisJcnRfbmFtZXMubyBcCisJdXRpbHMubworCitsaWItJChDT05GSUdfRkVBVFVSRV9JUF9SVUxFKSArPSBcCisJaXBfcGFyc2VfY29tbW9uX2FyZ3MubyBcCisJaXBydWxlLm8gXAorCXJ0X25hbWVzLm8gXAorCXV0aWxzLm8KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcF9jb21tb24uaCBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGM3ZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL2lwX2NvbW1vbi5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworI2lmbmRlZiBJUF9DT01NT05fSAorI2RlZmluZSBJUF9DT01NT05fSCAxCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPGFzbS90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L25ldGxpbmsuaD4KKyNpbmNsdWRlIDxsaW51eC9ydG5ldGxpbmsuaD4KKyNpZiAhZGVmaW5lZCBJRkFfUlRBCisjaW5jbHVkZSA8bGludXgvaWZfYWRkci5oPgorI2VuZGlmCisjaWYgIWRlZmluZWQgSUZMQV9SVEEKKyNpbmNsdWRlIDxsaW51eC9pZl9saW5rLmg+CisjZW5kaWYKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKK2NoYXIgRkFTVF9GVU5DICoqaXBfcGFyc2VfY29tbW9uX2FyZ3MoY2hhciAqKmFyZ3YpOworLy9pbnQgRkFTVF9GVU5DIHByaW50X25laWdoKHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZyk7CitpbnQgRkFTVF9GVU5DIGlwYWRkcl9saXN0X29yX2ZsdXNoKGNoYXIgKiphcmd2LCBpbnQgZmx1c2gpOworLy9pbnQgRkFTVF9GVU5DIGlwcm91dGVfbW9uaXRvcihjaGFyICoqYXJndik7CisvL3ZvaWQgRkFTVF9GVU5DIGlwbmVpZ2hfcmVzZXRfZmlsdGVyKHZvaWQpOworCitpbnQgRkFTVF9GVU5DIGRvX2lwYWRkcihjaGFyICoqYXJndik7CitpbnQgRkFTVF9GVU5DIGRvX2lwcm91dGUoY2hhciAqKmFyZ3YpOworaW50IEZBU1RfRlVOQyBkb19pcHJ1bGUoY2hhciAqKmFyZ3YpOworLy9pbnQgRkFTVF9GVU5DIGRvX2lwbmVpZ2goY2hhciAqKmFyZ3YpOworaW50IEZBU1RfRlVOQyBkb19pcHR1bm5lbChjaGFyICoqYXJndik7CitpbnQgRkFTVF9GVU5DIGRvX2lwbGluayhjaGFyICoqYXJndik7CisvL2ludCBGQVNUX0ZVTkMgZG9faXBtb25pdG9yKGNoYXIgKiphcmd2KTsKKy8vaW50IEZBU1RfRlVOQyBkb19tdWx0aWFkZHIoY2hhciAqKmFyZ3YpOworLy9pbnQgRkFTVF9GVU5DIGRvX211bHRpcm91dGUoY2hhciAqKmFyZ3YpOworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcF9wYXJzZV9jb21tb25fYXJncy5jIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL2lwX3BhcnNlX2NvbW1vbl9hcmdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljNzU5YgotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcF9wYXJzZV9jb21tb25fYXJncy5jCkBAIC0wLDAgKzEsODEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczogQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqIENoYW5nZXM6CisgKgorICogUmFuaSBBc3NhZiA8cmFuaUBtYWdpYy5tZXRhd2lyZS5jb20+IDk4MDkyOTogcmVzb2x2ZSBhZGRyZXNzZXMKKyAqLworCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiICAvKiAjaW5jbHVkZSAibGliYmIuaCIgaXMgaW5zaWRlICovCisjaW5jbHVkZSAidXRpbHMuaCIKKworZmFtaWx5X3QgcHJlZmVycmVkX2ZhbWlseSA9IEFGX1VOU1BFQzsKK3NtYWxsaW50IG9uZWxpbmU7CitjaGFyIF9TTF87CisKK2NoYXIqKiBGQVNUX0ZVTkMgaXBfcGFyc2VfY29tbW9uX2FyZ3MoY2hhciAqKmFyZ3YpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgaXBfY29tbW9uX2NvbW1hbmRzW10gQUxJR04xID0KKwkJIm9uZWxpbmUiICJcMCIKKwkJImZhbWlseSIgIlwwIgorCQkiNCIgIlwwIgorCQkiNiIgIlwwIgorCQkiMCIgIlwwIgorCQk7CisJZW51bSB7CisJCUFSR19vbmVsaW5lLAorCQlBUkdfZmFtaWx5LAorCQlBUkdfSVB2NCwKKwkJQVJHX0lQdjYsCisJCUFSR19wYWNrZXQsCisJfTsKKwlzdGF0aWMgY29uc3QgZmFtaWx5X3QgYWZfbnVtYmVyc1tdID0geyBBRl9JTkVULCBBRl9JTkVUNiwgQUZfUEFDS0VUIH07CisJaW50IGFyZzsKKworCXdoaWxlICgqYXJndikgeworCQljaGFyICpvcHQgPSAqYXJndjsKKworCQlpZiAob3B0WzBdICE9ICctJykKKwkJCWJyZWFrOworCQlvcHQrKzsKKwkJaWYgKG9wdFswXSA9PSAnLScpIHsKKwkJCW9wdCsrOworCQkJaWYgKCFvcHRbMF0pIHsgLyogIi0tIiAqLworCQkJCWFyZ3YrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlhcmcgPSBpbmRleF9pbl9zdWJzdHJpbmdzKGlwX2NvbW1vbl9jb21tYW5kcywgb3B0KTsKKwkJaWYgKGFyZyA8IDApCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWlmIChhcmcgPT0gQVJHX29uZWxpbmUpIHsKKwkJCW9uZWxpbmUgPSAxOworCQkJYXJndisrOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGFyZyA9PSBBUkdfZmFtaWx5KSB7CisJCQlzdGF0aWMgY29uc3QgY2hhciBmYW1pbGllc1tdIEFMSUdOMSA9CisJCQkJImluZXQiICJcMCIgImluZXQ2IiAiXDAiICJsaW5rIiAiXDAiOworCQkJYXJndisrOworCQkJaWYgKCEqYXJndikKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCQlhcmcgPSBpbmRleF9pbl9zdHJpbmdzKGZhbWlsaWVzLCAqYXJndik7CisJCQlpZiAoYXJnIDwgMCkKKwkJCQlpbnZhcmcoKmFyZ3YsICJwcm90b2NvbCBmYW1pbHkiKTsKKwkJCS8qIG5vdyBhcmcgPT0gMCwgMSBvciAyICovCisJCX0gZWxzZSB7CisJCQlhcmcgLT0gQVJHX0lQdjQ7CisJCQkvKiBub3cgYXJnID09IDAsIDEgb3IgMiAqLworCQl9CisJCXByZWZlcnJlZF9mYW1pbHkgPSBhZl9udW1iZXJzW2FyZ107CisJCWFyZ3YrKzsKKwl9CisJX1NMXyA9IG9uZWxpbmUgPyAnXFwnIDogJ1xuJzsKKwlyZXR1cm4gYXJndjsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcGFkZHJlc3MuYyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcGFkZHJlc3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODQ1Y2FiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL2lwYWRkcmVzcy5jCkBAIC0wLDAgKzEsNzY4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIEF1dGhvcnM6IEFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKiBDaGFuZ2VzOgorICogTGFzemxvIFZhbGtvIDx2YWxrb0BsaW51eC5rYXJpbnRoeS5odT4gOTkwMjIzOiBhZGRyZXNzIGxhYmVsIG11c3QgYmUgemVybyB0ZXJtaW5hdGVkCisgKi8KKworI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXQvaWZfYXJwLmg+CisKKyNpbmNsdWRlICJpcF9jb21tb24uaCIgIC8qICNpbmNsdWRlICJsaWJiYi5oIiBpcyBpbnNpZGUgKi8KKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKKyNpZm5kZWYgSUZGX0xPV0VSX1VQCisvKiBmcm9tIGxpbnV4L2lmLmggKi8KKyNkZWZpbmUgSUZGX0xPV0VSX1VQICAweDEwMDAwICAvKiBkcml2ZXIgc2lnbmFscyBMMSB1cCAqLworI2VuZGlmCisKK3N0cnVjdCBmaWx0ZXJfdCB7CisJY2hhciAqbGFiZWw7CisJY2hhciAqZmx1c2hiOworCXN0cnVjdCBydG5sX2hhbmRsZSAqcnRoOworCWludCBzY29wZSwgc2NvcGVtYXNrOworCWludCBmbGFncywgZmxhZ21hc2s7CisJaW50IGZsdXNocDsKKwlpbnQgZmx1c2hlOworCWludCBpZmluZGV4OworCWZhbWlseV90IGZhbWlseTsKKwlzbWFsbGludCBzaG93cXVldWU7CisJc21hbGxpbnQgb25lbGluZTsKKwlzbWFsbGludCB1cDsKKwlzbWFsbGludCBmbHVzaGVkOworCWluZXRfcHJlZml4IHBmeDsKK30gRklYX0FMSUFTSU5HOwordHlwZWRlZiBzdHJ1Y3QgZmlsdGVyX3QgZmlsdGVyX3Q7CisKKyNkZWZpbmUgR19maWx0ZXIgKCooZmlsdGVyX3QqKSZiYl9jb21tb25fYnVmc2l6MSkKKworCitzdGF0aWMgdm9pZCBwcmludF9saW5rX2ZsYWdzKHVuc2lnbmVkIGZsYWdzLCB1bnNpZ25lZCBtZG93bikKK3sKKwlzdGF0aWMgY29uc3QgaW50IGZsYWdfbWFza3NbXSA9IHsKKwkJSUZGX0xPT1BCQUNLLCBJRkZfQlJPQURDQVNULCBJRkZfUE9JTlRPUE9JTlQsCisJCUlGRl9NVUxUSUNBU1QsIElGRl9OT0FSUCwgSUZGX1VQLCBJRkZfTE9XRVJfVVAgfTsKKwlzdGF0aWMgY29uc3QgY2hhciBmbGFnX2xhYmVsc1tdIEFMSUdOMSA9CisJCSJMT09QQkFDS1wwIiJCUk9BRENBU1RcMCIiUE9JTlRPUE9JTlRcMCIKKwkJIk1VTFRJQ0FTVFwwIiJOT0FSUFwwIiJVUFwwIiJMT1dFUl9VUFwwIjsKKworCWJiX3B1dGNoYXIoJzwnKTsKKwlpZiAoZmxhZ3MgJiBJRkZfVVAgJiYgIShmbGFncyAmIElGRl9SVU5OSU5HKSkKKwkJcHJpbnRmKCJOTy1DQVJSSUVSLCIpOworCWZsYWdzICY9IH5JRkZfUlVOTklORzsKKyNpZiAwCisJX1BGKEFMTE1VTFRJKTsKKwlfUEYoUFJPTUlTQyk7CisJX1BGKE1BU1RFUik7CisJX1BGKFNMQVZFKTsKKwlfUEYoREVCVUcpOworCV9QRihEWU5BTUlDKTsKKwlfUEYoQVVUT01FRElBKTsKKwlfUEYoUE9SVFNFTCk7CisJX1BGKE5PVFJBSUxFUlMpOworI2VuZGlmCisJZmxhZ3MgPSBwcmludF9mbGFnc19zZXBhcmF0ZWQoZmxhZ19tYXNrcywgZmxhZ19sYWJlbHMsIGZsYWdzLCAiLCIpOworCWlmIChmbGFncykKKwkJcHJpbnRmKCIleCIsIGZsYWdzKTsKKwlpZiAobWRvd24pCisJCXByaW50ZigiLE0tRE9XTiIpOworCXByaW50ZigiPiAiKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcXVldWVsZW4oY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBzOworCisJcyA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisJaWYgKHMgPCAwKQorCQlyZXR1cm47CisKKwltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBuYW1lKTsKKwlpZiAoaW9jdGxfb3Jfd2FybihzLCBTSU9DR0lGVFhRTEVOLCAmaWZyKSA8IDApIHsKKwkJY2xvc2Uocyk7CisJCXJldHVybjsKKwl9CisJY2xvc2Uocyk7CisKKwlpZiAoaWZyLmlmcl9xbGVuKQorCQlwcmludGYoInFsZW4gJWQiLCBpZnIuaWZyX3FsZW4pOworfQorCitzdGF0aWMgTk9JTkxJTkUgaW50IHByaW50X2xpbmtpbmZvKGNvbnN0IHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlzdHJ1Y3QgaWZpbmZvbXNnICppZmkgPSBOTE1TR19EQVRBKG4pOworCXN0cnVjdCBydGF0dHIgKnRiW0lGTEFfTUFYKzFdOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisKKwlpZiAobi0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXTElOSyAmJiBuLT5ubG1zZ190eXBlICE9IFJUTV9ERUxMSU5LKQorCQlyZXR1cm4gMDsKKworCWxlbiAtPSBOTE1TR19MRU5HVEgoc2l6ZW9mKCppZmkpKTsKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKEdfZmlsdGVyLmlmaW5kZXggJiYgaWZpLT5pZmlfaW5kZXggIT0gR19maWx0ZXIuaWZpbmRleCkKKwkJcmV0dXJuIDA7CisJaWYgKEdfZmlsdGVyLnVwICYmICEoaWZpLT5pZmlfZmxhZ3MgJiBJRkZfVVApKQorCQlyZXR1cm4gMDsKKworCW1lbXNldCh0YiwgMCwgc2l6ZW9mKHRiKSk7CisJcGFyc2VfcnRhdHRyKHRiLCBJRkxBX01BWCwgSUZMQV9SVEEoaWZpKSwgbGVuKTsKKwlpZiAodGJbSUZMQV9JRk5BTUVdID09IE5VTEwpIHsKKwkJYmJfZXJyb3JfbXNnKCJuaWwgaWZuYW1lIik7CisJCXJldHVybiAtMTsKKwl9CisJaWYgKEdfZmlsdGVyLmxhYmVsCisJICYmICghR19maWx0ZXIuZmFtaWx5IHx8IEdfZmlsdGVyLmZhbWlseSA9PSBBRl9QQUNLRVQpCisJICYmIGZubWF0Y2goR19maWx0ZXIubGFiZWwsIFJUQV9EQVRBKHRiW0lGTEFfSUZOQU1FXSksIDApCisJKSB7CisJCXJldHVybiAwOworCX0KKworCWlmIChuLT5ubG1zZ190eXBlID09IFJUTV9ERUxMSU5LKQorCQlwcmludGYoIkRlbGV0ZWQgIik7CisKKwlwcmludGYoIiVkOiAlcyIsIGlmaS0+aWZpX2luZGV4LAorCQkvKnRiW0lGTEFfSUZOQU1FXSA/IChjaGFyKilSVEFfREFUQSh0YltJRkxBX0lGTkFNRV0pIDogIjxuaWw+IiAtIHdlIGNoZWNrZWQgdGJbSUZMQV9JRk5BTUVdIGFib3ZlKi8KKwkJKGNoYXIqKVJUQV9EQVRBKHRiW0lGTEFfSUZOQU1FXSkKKwkpOworCisJeworCQl1bnNpZ25lZCBtX2ZsYWcgPSAwOworCQlpZiAodGJbSUZMQV9MSU5LXSkgeworCQkJaW50IGlmbGluayA9ICooaW50KilSVEFfREFUQSh0YltJRkxBX0xJTktdKTsKKwkJCWlmIChpZmxpbmsgPT0gMCkKKwkJCQlwcmludGYoIkBOT05FOiAiKTsKKwkJCWVsc2UgeworCQkJCXByaW50ZigiQCVzOiAiLCBsbF9pbmRleF90b19uYW1lKGlmbGluaykpOworCQkJCW1fZmxhZyA9IGxsX2luZGV4X3RvX2ZsYWdzKGlmbGluayk7CisJCQkJbV9mbGFnID0gIShtX2ZsYWcgJiBJRkZfVVApOworCQkJfQorCQl9IGVsc2UgeworCQkJcHJpbnRmKCI6ICIpOworCQl9CisJCXByaW50X2xpbmtfZmxhZ3MoaWZpLT5pZmlfZmxhZ3MsIG1fZmxhZyk7CisJfQorCisJaWYgKHRiW0lGTEFfTVRVXSkKKwkJcHJpbnRmKCJtdHUgJXUgIiwgKihpbnQqKVJUQV9EQVRBKHRiW0lGTEFfTVRVXSkpOworCWlmICh0YltJRkxBX1FESVNDXSkKKwkJcHJpbnRmKCJxZGlzYyAlcyAiLCAoY2hhciopUlRBX0RBVEEodGJbSUZMQV9RRElTQ10pKTsKKyNpZmRlZiBJRkxBX01BU1RFUgorCWlmICh0YltJRkxBX01BU1RFUl0pIHsKKwkJcHJpbnRmKCJtYXN0ZXIgJXMgIiwgbGxfaW5kZXhfdG9fbmFtZSgqKGludCopUlRBX0RBVEEodGJbSUZMQV9NQVNURVJdKSkpOworCX0KKyNlbmRpZgorLyogSUZMQV9PUEVSU1RBVEUgd2FzIGFkZGVkIHRvIGtlcm5lbCB3aXRoIHRoZSBzYW1lIGNvbW1pdCBhcyBJRkZfRE9STUFOVCAqLworI2lmZGVmIElGRl9ET1JNQU5UCisJaWYgKHRiW0lGTEFfT1BFUlNUQVRFXSkgeworCQlzdGF0aWMgY29uc3QgY2hhciBvcGVyc3RhdGVfbGFiZWxzW10gQUxJR04xID0KKwkJCSJVTktOT1dOXDAiIk5PVFBSRVNFTlRcMCIiRE9XTlwwIiJMT1dFUkxBWUVSRE9XTlwwIgorCQkJIlRFU1RJTkdcMCIiRE9STUFOVFwwIiJVUFwwIjsKKwkJcHJpbnRmKCJzdGF0ZSAlcyAiLCBudGhfc3RyaW5nKG9wZXJzdGF0ZV9sYWJlbHMsCisJCQkJCSoodWludDhfdCAqKVJUQV9EQVRBKHRiW0lGTEFfT1BFUlNUQVRFXSkpKTsKKwl9CisjZW5kaWYKKwlpZiAoR19maWx0ZXIuc2hvd3F1ZXVlKQorCQlwcmludF9xdWV1ZWxlbigoY2hhciopUlRBX0RBVEEodGJbSUZMQV9JRk5BTUVdKSk7CisKKwlpZiAoIUdfZmlsdGVyLmZhbWlseSB8fCBHX2ZpbHRlci5mYW1pbHkgPT0gQUZfUEFDS0VUKSB7CisJCVNQUklOVF9CVUYoYjEpOworCQlwcmludGYoIiVjICAgIGxpbmsvJXMgIiwgX1NMXywgbGxfdHlwZV9uMmEoaWZpLT5pZmlfdHlwZSwgYjEpKTsKKworCQlpZiAodGJbSUZMQV9BRERSRVNTXSkgeworCQkJZnB1dHMobGxfYWRkcl9uMmEoUlRBX0RBVEEodGJbSUZMQV9BRERSRVNTXSksCisJCQkJCQkgICAgICBSVEFfUEFZTE9BRCh0YltJRkxBX0FERFJFU1NdKSwKKwkJCQkJCSAgICAgIGlmaS0+aWZpX3R5cGUsCisJCQkJCQkgICAgICBiMSwgc2l6ZW9mKGIxKSksIHN0ZG91dCk7CisJCX0KKwkJaWYgKHRiW0lGTEFfQlJPQURDQVNUXSkgeworCQkJaWYgKGlmaS0+aWZpX2ZsYWdzICYgSUZGX1BPSU5UT1BPSU5UKQorCQkJCXByaW50ZigiIHBlZXIgIik7CisJCQllbHNlCisJCQkJcHJpbnRmKCIgYnJkICIpOworCQkJZnB1dHMobGxfYWRkcl9uMmEoUlRBX0RBVEEodGJbSUZMQV9CUk9BRENBU1RdKSwKKwkJCQkJCSAgICAgIFJUQV9QQVlMT0FEKHRiW0lGTEFfQlJPQURDQVNUXSksCisJCQkJCQkgICAgICBpZmktPmlmaV90eXBlLAorCQkJCQkJICAgICAgYjEsIHNpemVvZihiMSkpLCBzdGRvdXQpOworCQl9CisJfQorCWJiX3B1dGNoYXIoJ1xuJyk7CisJLypmZmx1c2hfYWxsKCk7Ki8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmbHVzaF91cGRhdGUodm9pZCkKK3sKKwlpZiAocnRubF9zZW5kKEdfZmlsdGVyLnJ0aCwgR19maWx0ZXIuZmx1c2hiLCBHX2ZpbHRlci5mbHVzaHApIDwgMCkgeworCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBzZW5kIGZsdXNoIHJlcXVlc3QiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlHX2ZpbHRlci5mbHVzaHAgPSAwOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBwcmludF9hZGRyaW5mbyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobyBVTlVTRURfUEFSQU0sCisJCXN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnIFVOVVNFRF9QQVJBTSkKK3sKKwlzdHJ1Y3QgaWZhZGRybXNnICppZmEgPSBOTE1TR19EQVRBKG4pOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisJc3RydWN0IHJ0YXR0ciAqIHJ0YV90YltJRkFfTUFYKzFdOworCWNoYXIgYWJ1ZlsyNTZdOworCisJaWYgKG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV0FERFIgJiYgbi0+bmxtc2dfdHlwZSAhPSBSVE1fREVMQUREUikKKwkJcmV0dXJuIDA7CisJbGVuIC09IE5MTVNHX0xFTkdUSChzaXplb2YoKmlmYSkpOworCWlmIChsZW4gPCAwKSB7CisJCWJiX2Vycm9yX21zZygid3Jvbmcgbmxtc2cgbGVuICVkIiwgbGVuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChHX2ZpbHRlci5mbHVzaGIgJiYgbi0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXQUREUikKKwkJcmV0dXJuIDA7CisKKwltZW1zZXQocnRhX3RiLCAwLCBzaXplb2YocnRhX3RiKSk7CisJcGFyc2VfcnRhdHRyKHJ0YV90YiwgSUZBX01BWCwgSUZBX1JUQShpZmEpLCBuLT5ubG1zZ19sZW4gLSBOTE1TR19MRU5HVEgoc2l6ZW9mKCppZmEpKSk7CisKKwlpZiAoIXJ0YV90YltJRkFfTE9DQUxdKQorCQlydGFfdGJbSUZBX0xPQ0FMXSA9IHJ0YV90YltJRkFfQUREUkVTU107CisJaWYgKCFydGFfdGJbSUZBX0FERFJFU1NdKQorCQlydGFfdGJbSUZBX0FERFJFU1NdID0gcnRhX3RiW0lGQV9MT0NBTF07CisKKwlpZiAoR19maWx0ZXIuaWZpbmRleCAmJiBHX2ZpbHRlci5pZmluZGV4ICE9IGlmYS0+aWZhX2luZGV4KQorCQlyZXR1cm4gMDsKKwlpZiAoKEdfZmlsdGVyLnNjb3BlIF4gaWZhLT5pZmFfc2NvcGUpICYgR19maWx0ZXIuc2NvcGVtYXNrKQorCQlyZXR1cm4gMDsKKwlpZiAoKEdfZmlsdGVyLmZsYWdzIF4gaWZhLT5pZmFfZmxhZ3MpICYgR19maWx0ZXIuZmxhZ21hc2spCisJCXJldHVybiAwOworCWlmIChHX2ZpbHRlci5sYWJlbCkgeworCQljb25zdCBjaGFyICpsYWJlbDsKKwkJaWYgKHJ0YV90YltJRkFfTEFCRUxdKQorCQkJbGFiZWwgPSBSVEFfREFUQShydGFfdGJbSUZBX0xBQkVMXSk7CisJCWVsc2UKKwkJCWxhYmVsID0gbGxfaW5kZXhfdG9fbmFtZShpZmEtPmlmYV9pbmRleCk7CisJCWlmIChmbm1hdGNoKEdfZmlsdGVyLmxhYmVsLCBsYWJlbCwgMCkgIT0gMCkKKwkJCXJldHVybiAwOworCX0KKwlpZiAoR19maWx0ZXIucGZ4LmZhbWlseSkgeworCQlpZiAocnRhX3RiW0lGQV9MT0NBTF0pIHsKKwkJCWluZXRfcHJlZml4IGRzdDsKKwkJCW1lbXNldCgmZHN0LCAwLCBzaXplb2YoZHN0KSk7CisJCQlkc3QuZmFtaWx5ID0gaWZhLT5pZmFfZmFtaWx5OworCQkJbWVtY3B5KCZkc3QuZGF0YSwgUlRBX0RBVEEocnRhX3RiW0lGQV9MT0NBTF0pLCBSVEFfUEFZTE9BRChydGFfdGJbSUZBX0xPQ0FMXSkpOworCQkJaWYgKGluZXRfYWRkcl9tYXRjaCgmZHN0LCAmR19maWx0ZXIucGZ4LCBHX2ZpbHRlci5wZnguYml0bGVuKSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCWlmIChHX2ZpbHRlci5mbHVzaGIpIHsKKwkJc3RydWN0IG5sbXNnaGRyICpmbjsKKwkJaWYgKE5MTVNHX0FMSUdOKEdfZmlsdGVyLmZsdXNocCkgKyBuLT5ubG1zZ19sZW4gPiBHX2ZpbHRlci5mbHVzaGUpIHsKKwkJCWlmIChmbHVzaF91cGRhdGUoKSkKKwkJCQlyZXR1cm4gLTE7CisJCX0KKwkJZm4gPSAoc3RydWN0IG5sbXNnaGRyKikoR19maWx0ZXIuZmx1c2hiICsgTkxNU0dfQUxJR04oR19maWx0ZXIuZmx1c2hwKSk7CisJCW1lbWNweShmbiwgbiwgbi0+bmxtc2dfbGVuKTsKKwkJZm4tPm5sbXNnX3R5cGUgPSBSVE1fREVMQUREUjsKKwkJZm4tPm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVDsKKwkJZm4tPm5sbXNnX3NlcSA9ICsrR19maWx0ZXIucnRoLT5zZXE7CisJCUdfZmlsdGVyLmZsdXNocCA9ICgoKGNoYXIqKWZuKSArIG4tPm5sbXNnX2xlbikgLSBHX2ZpbHRlci5mbHVzaGI7CisJCUdfZmlsdGVyLmZsdXNoZWQgPSAxOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobi0+bmxtc2dfdHlwZSA9PSBSVE1fREVMQUREUikKKwkJcHJpbnRmKCJEZWxldGVkICIpOworCisJaWYgKEdfZmlsdGVyLm9uZWxpbmUpCisJCXByaW50ZigiJXU6ICVzIiwgaWZhLT5pZmFfaW5kZXgsIGxsX2luZGV4X3RvX25hbWUoaWZhLT5pZmFfaW5kZXgpKTsKKwlpZiAoaWZhLT5pZmFfZmFtaWx5ID09IEFGX0lORVQpCisJCXByaW50ZigiICAgIGluZXQgIik7CisJZWxzZSBpZiAoaWZhLT5pZmFfZmFtaWx5ID09IEFGX0lORVQ2KQorCQlwcmludGYoIiAgICBpbmV0NiAiKTsKKwllbHNlCisJCXByaW50ZigiICAgIGZhbWlseSAlZCAiLCBpZmEtPmlmYV9mYW1pbHkpOworCisJaWYgKHJ0YV90YltJRkFfTE9DQUxdKSB7CisJCWZwdXRzKHJ0X2FkZHJfbjJhKGlmYS0+aWZhX2ZhbWlseSwKKwkJCQkJICAgICAgUlRBX0RBVEEocnRhX3RiW0lGQV9MT0NBTF0pLAorCQkJCQkgICAgICBhYnVmLCBzaXplb2YoYWJ1ZikpLCBzdGRvdXQpOworCisJCWlmIChydGFfdGJbSUZBX0FERFJFU1NdID09IE5VTEwKKwkJIHx8IG1lbWNtcChSVEFfREFUQShydGFfdGJbSUZBX0FERFJFU1NdKSwgUlRBX0RBVEEocnRhX3RiW0lGQV9MT0NBTF0pLCA0KSA9PSAwCisJCSkgeworCQkJcHJpbnRmKCIvJWQgIiwgaWZhLT5pZmFfcHJlZml4bGVuKTsKKwkJfSBlbHNlIHsKKwkJCXByaW50ZigiIHBlZXIgJXMvJWQgIiwKKwkJCQlydF9hZGRyX24yYShpZmEtPmlmYV9mYW1pbHksCisJCQkJCSAgICBSVEFfREFUQShydGFfdGJbSUZBX0FERFJFU1NdKSwKKwkJCQkJICAgIGFidWYsIHNpemVvZihhYnVmKSksCisJCQkJaWZhLT5pZmFfcHJlZml4bGVuKTsKKwkJfQorCX0KKworCWlmIChydGFfdGJbSUZBX0JST0FEQ0FTVF0pIHsKKwkJcHJpbnRmKCJicmQgJXMgIiwKKwkJCXJ0X2FkZHJfbjJhKGlmYS0+aWZhX2ZhbWlseSwKKwkJCQkJUlRBX0RBVEEocnRhX3RiW0lGQV9CUk9BRENBU1RdKSwKKwkJCQkJYWJ1Ziwgc2l6ZW9mKGFidWYpKQorCQkpOworCX0KKwlpZiAocnRhX3RiW0lGQV9BTllDQVNUXSkgeworCQlwcmludGYoImFueSAlcyAiLAorCQkJcnRfYWRkcl9uMmEoaWZhLT5pZmFfZmFtaWx5LAorCQkJCQlSVEFfREFUQShydGFfdGJbSUZBX0FOWUNBU1RdKSwKKwkJCQkJYWJ1Ziwgc2l6ZW9mKGFidWYpKQorCQkpOworCX0KKwlwcmludGYoInNjb3BlICVzICIsIHJ0bmxfcnRzY29wZV9uMmEoaWZhLT5pZmFfc2NvcGUpKTsKKwlpZiAoaWZhLT5pZmFfZmxhZ3MgJiBJRkFfRl9TRUNPTkRBUlkpIHsKKwkJaWZhLT5pZmFfZmxhZ3MgJj0gfklGQV9GX1NFQ09OREFSWTsKKwkJcHJpbnRmKCJzZWNvbmRhcnkgIik7CisJfQorCWlmIChpZmEtPmlmYV9mbGFncyAmIElGQV9GX1RFTlRBVElWRSkgeworCQlpZmEtPmlmYV9mbGFncyAmPSB+SUZBX0ZfVEVOVEFUSVZFOworCQlwcmludGYoInRlbnRhdGl2ZSAiKTsKKwl9CisJaWYgKGlmYS0+aWZhX2ZsYWdzICYgSUZBX0ZfREVQUkVDQVRFRCkgeworCQlpZmEtPmlmYV9mbGFncyAmPSB+SUZBX0ZfREVQUkVDQVRFRDsKKwkJcHJpbnRmKCJkZXByZWNhdGVkICIpOworCX0KKwlpZiAoIShpZmEtPmlmYV9mbGFncyAmIElGQV9GX1BFUk1BTkVOVCkpIHsKKwkJcHJpbnRmKCJkeW5hbWljICIpOworCX0gZWxzZQorCQlpZmEtPmlmYV9mbGFncyAmPSB+SUZBX0ZfUEVSTUFORU5UOworCWlmIChpZmEtPmlmYV9mbGFncykKKwkJcHJpbnRmKCJmbGFncyAlMDJ4ICIsIGlmYS0+aWZhX2ZsYWdzKTsKKwlpZiAocnRhX3RiW0lGQV9MQUJFTF0pCisJCWZwdXRzKChjaGFyKilSVEFfREFUQShydGFfdGJbSUZBX0xBQkVMXSksIHN0ZG91dCk7CisJaWYgKHJ0YV90YltJRkFfQ0FDSEVJTkZPXSkgeworCQlzdHJ1Y3QgaWZhX2NhY2hlaW5mbyAqY2kgPSBSVEFfREFUQShydGFfdGJbSUZBX0NBQ0hFSU5GT10pOworCQljaGFyIGJ1ZlsxMjhdOworCQliYl9wdXRjaGFyKF9TTF8pOworCQlpZiAoY2ktPmlmYV92YWxpZCA9PSAweEZGRkZGRkZGVSkKKwkJCXNwcmludGYoYnVmLCAidmFsaWRfbGZ0IGZvcmV2ZXIiKTsKKwkJZWxzZQorCQkJc3ByaW50ZihidWYsICJ2YWxpZF9sZnQgJWRzZWMiLCBjaS0+aWZhX3ZhbGlkKTsKKwkJaWYgKGNpLT5pZmFfcHJlZmVyZWQgPT0gMHhGRkZGRkZGRlUpCisJCQlzcHJpbnRmKGJ1ZitzdHJsZW4oYnVmKSwgIiBwcmVmZXJyZWRfbGZ0IGZvcmV2ZXIiKTsKKwkJZWxzZQorCQkJc3ByaW50ZihidWYrc3RybGVuKGJ1ZiksICIgcHJlZmVycmVkX2xmdCAlZHNlYyIsIGNpLT5pZmFfcHJlZmVyZWQpOworCQlwcmludGYoIiAgICAgICAlcyIsIGJ1Zik7CisJfQorCWJiX3B1dGNoYXIoJ1xuJyk7CisJLypmZmx1c2hfYWxsKCk7Ki8KKwlyZXR1cm4gMDsKK30KKworCitzdHJ1Y3Qgbmxtc2dfbGlzdCB7CisJc3RydWN0IG5sbXNnX2xpc3QgKm5leHQ7CisJc3RydWN0IG5sbXNnaGRyICAgaDsKK307CisKK3N0YXRpYyBpbnQgcHJpbnRfc2VsZWN0ZWRfYWRkcmluZm8oaW50IGlmaW5kZXgsIHN0cnVjdCBubG1zZ19saXN0ICphaW5mbykKK3sKKwlmb3IgKDsgYWluZm87IGFpbmZvID0gYWluZm8tPm5leHQpIHsKKwkJc3RydWN0IG5sbXNnaGRyICpuID0gJmFpbmZvLT5oOworCQlzdHJ1Y3QgaWZhZGRybXNnICppZmEgPSBOTE1TR19EQVRBKG4pOworCisJCWlmIChuLT5ubG1zZ190eXBlICE9IFJUTV9ORVdBRERSKQorCQkJY29udGludWU7CisJCWlmIChuLT5ubG1zZ19sZW4gPCBOTE1TR19MRU5HVEgoc2l6ZW9mKGlmYSkpKQorCQkJcmV0dXJuIC0xOworCQlpZiAoaWZhLT5pZmFfaW5kZXggIT0gaWZpbmRleAorCQkgfHwgKEdfZmlsdGVyLmZhbWlseSAmJiBHX2ZpbHRlci5mYW1pbHkgIT0gaWZhLT5pZmFfZmFtaWx5KQorCQkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisJCXByaW50X2FkZHJpbmZvKE5VTEwsIG4sIE5VTEwpOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IEZBU1RfRlVOQyBzdG9yZV9ubG1zZyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobywgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICphcmcpCit7CisJc3RydWN0IG5sbXNnX2xpc3QgKipsaW5mbyA9IChzdHJ1Y3Qgbmxtc2dfbGlzdCoqKWFyZzsKKwlzdHJ1Y3Qgbmxtc2dfbGlzdCAqaDsKKwlzdHJ1Y3Qgbmxtc2dfbGlzdCAqKmxwOworCisJaCA9IHh6YWxsb2Mobi0+bmxtc2dfbGVuICsgc2l6ZW9mKHZvaWQqKSk7CisKKwltZW1jcHkoJmgtPmgsIG4sIG4tPm5sbXNnX2xlbik7CisJLypoLT5uZXh0ID0gTlVMTDsgLSB4emFsbG9jIGRpZCBpdCAqLworCisJZm9yIChscCA9IGxpbmZvOyAqbHA7IGxwID0gJigqbHApLT5uZXh0KQorCQljb250aW51ZTsKKwkqbHAgPSBoOworCisJbGxfcmVtZW1iZXJfaW5kZXgod2hvLCBuLCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaXBhZGRyX3Jlc2V0X2ZpbHRlcihpbnQgX29uZWxpbmUpCit7CisJbWVtc2V0KCZHX2ZpbHRlciwgMCwgc2l6ZW9mKEdfZmlsdGVyKSk7CisJR19maWx0ZXIub25lbGluZSA9IF9vbmVsaW5lOworfQorCisvKiBSZXR1cm4gdmFsdWUgYmVjb21lcyBleGl0Y29kZS4gSXQncyBva2F5IHRvIG5vdCByZXR1cm4gYXQgYWxsICovCitpbnQgRkFTVF9GVU5DIGlwYWRkcl9saXN0X29yX2ZsdXNoKGNoYXIgKiphcmd2LCBpbnQgZmx1c2gpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgb3B0aW9uW10gQUxJR04xID0gInRvXDAiInNjb3BlXDAiInVwXDAiImxhYmVsXDAiImRldlwwIjsKKworCXN0cnVjdCBubG1zZ19saXN0ICpsaW5mbyA9IE5VTEw7CisJc3RydWN0IG5sbXNnX2xpc3QgKmFpbmZvID0gTlVMTDsKKwlzdHJ1Y3Qgbmxtc2dfbGlzdCAqbDsKKwlzdHJ1Y3QgcnRubF9oYW5kbGUgcnRoOworCWNoYXIgKmZpbHRlcl9kZXYgPSBOVUxMOworCWludCBub19saW5rID0gMDsKKworCWlwYWRkcl9yZXNldF9maWx0ZXIob25lbGluZSk7CisJR19maWx0ZXIuc2hvd3F1ZXVlID0gMTsKKworCWlmIChHX2ZpbHRlci5mYW1pbHkgPT0gQUZfVU5TUEVDKQorCQlHX2ZpbHRlci5mYW1pbHkgPSBwcmVmZXJyZWRfZmFtaWx5OworCisJaWYgKGZsdXNoKSB7CisJCWlmICghKmFyZ3YpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZXF1aXJlc19hcmcsICJmbHVzaCIpOworCQl9CisJCWlmIChHX2ZpbHRlci5mYW1pbHkgPT0gQUZfUEFDS0VUKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZmx1c2ggbGluayBhZGRyZXNzZXMiKTsKKwkJfQorCX0KKworCXdoaWxlICgqYXJndikgeworCQljb25zdCBzbWFsbHVpbnQga2V5ID0gaW5kZXhfaW5fc3RyaW5ncyhvcHRpb24sICphcmd2KTsKKwkJaWYgKGtleSA9PSAwKSB7IC8qIHRvICovCisJCQlORVhUX0FSRygpOworCQkJZ2V0X3ByZWZpeCgmR19maWx0ZXIucGZ4LCAqYXJndiwgR19maWx0ZXIuZmFtaWx5KTsKKwkJCWlmIChHX2ZpbHRlci5mYW1pbHkgPT0gQUZfVU5TUEVDKSB7CisJCQkJR19maWx0ZXIuZmFtaWx5ID0gR19maWx0ZXIucGZ4LmZhbWlseTsKKwkJCX0KKwkJfSBlbHNlIGlmIChrZXkgPT0gMSkgeyAvKiBzY29wZSAqLworCQkJdWludDMyX3Qgc2NvcGUgPSAwOworCQkJTkVYVF9BUkcoKTsKKwkJCUdfZmlsdGVyLnNjb3BlbWFzayA9IC0xOworCQkJaWYgKHJ0bmxfcnRzY29wZV9hMm4oJnNjb3BlLCAqYXJndikpIHsKKwkJCQlpZiAoc3RyY21wKCphcmd2LCAiYWxsIikgIT0gMCkgeworCQkJCQlpbnZhcmcoKmFyZ3YsICJzY29wZSIpOworCQkJCX0KKwkJCQlzY29wZSA9IFJUX1NDT1BFX05PV0hFUkU7CisJCQkJR19maWx0ZXIuc2NvcGVtYXNrID0gMDsKKwkJCX0KKwkJCUdfZmlsdGVyLnNjb3BlID0gc2NvcGU7CisJCX0gZWxzZSBpZiAoa2V5ID09IDIpIHsgLyogdXAgKi8KKwkJCUdfZmlsdGVyLnVwID0gMTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gMykgeyAvKiBsYWJlbCAqLworCQkJTkVYVF9BUkcoKTsKKwkJCUdfZmlsdGVyLmxhYmVsID0gKmFyZ3Y7CisJCX0gZWxzZSB7CisJCQlpZiAoa2V5ID09IDQpIC8qIGRldiAqLworCQkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZmlsdGVyX2RldikKKwkJCQlkdXBhcmcyKCJkZXYiLCAqYXJndik7CisJCQlmaWx0ZXJfZGV2ID0gKmFyZ3Y7CisJCX0KKwkJYXJndisrOworCX0KKworCXhydG5sX29wZW4oJnJ0aCk7CisKKwl4cnRubF93aWxkZHVtcF9yZXF1ZXN0KCZydGgsIHByZWZlcnJlZF9mYW1pbHksIFJUTV9HRVRMSU5LKTsKKwl4cnRubF9kdW1wX2ZpbHRlcigmcnRoLCBzdG9yZV9ubG1zZywgJmxpbmZvKTsKKworCWlmIChmaWx0ZXJfZGV2KSB7CisJCUdfZmlsdGVyLmlmaW5kZXggPSB4bGxfbmFtZV90b19pbmRleChmaWx0ZXJfZGV2KTsKKwl9CisKKwlpZiAoZmx1c2gpIHsKKwkJY2hhciBmbHVzaGJbNDA5Ni01MTJdOworCisJCUdfZmlsdGVyLmZsdXNoYiA9IGZsdXNoYjsKKwkJR19maWx0ZXIuZmx1c2hwID0gMDsKKwkJR19maWx0ZXIuZmx1c2hlID0gc2l6ZW9mKGZsdXNoYik7CisJCUdfZmlsdGVyLnJ0aCA9ICZydGg7CisKKwkJZm9yICg7OykgeworCQkJeHJ0bmxfd2lsZGR1bXBfcmVxdWVzdCgmcnRoLCBHX2ZpbHRlci5mYW1pbHksIFJUTV9HRVRBRERSKTsKKwkJCUdfZmlsdGVyLmZsdXNoZWQgPSAwOworCQkJeHJ0bmxfZHVtcF9maWx0ZXIoJnJ0aCwgcHJpbnRfYWRkcmluZm8sIE5VTEwpOworCQkJaWYgKEdfZmlsdGVyLmZsdXNoZWQgPT0gMCkgeworCQkJCXJldHVybiAwOworCQkJfQorCQkJaWYgKGZsdXNoX3VwZGF0ZSgpIDwgMCkgeworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorCisJaWYgKEdfZmlsdGVyLmZhbWlseSAhPSBBRl9QQUNLRVQpIHsKKwkJeHJ0bmxfd2lsZGR1bXBfcmVxdWVzdCgmcnRoLCBHX2ZpbHRlci5mYW1pbHksIFJUTV9HRVRBRERSKTsKKwkJeHJ0bmxfZHVtcF9maWx0ZXIoJnJ0aCwgc3RvcmVfbmxtc2csICZhaW5mbyk7CisJfQorCisKKwlpZiAoR19maWx0ZXIuZmFtaWx5ICYmIEdfZmlsdGVyLmZhbWlseSAhPSBBRl9QQUNLRVQpIHsKKwkJc3RydWN0IG5sbXNnX2xpc3QgKipscDsKKwkJbHAgPSAmbGluZm87CisKKwkJaWYgKEdfZmlsdGVyLm9uZWxpbmUpCisJCQlub19saW5rID0gMTsKKworCQl3aGlsZSAoKGwgPSAqbHApICE9IE5VTEwpIHsKKwkJCWludCBvayA9IDA7CisJCQlzdHJ1Y3QgaWZpbmZvbXNnICppZmkgPSBOTE1TR19EQVRBKCZsLT5oKTsKKwkJCXN0cnVjdCBubG1zZ19saXN0ICphOworCisJCQlmb3IgKGEgPSBhaW5mbzsgYTsgYSA9IGEtPm5leHQpIHsKKwkJCQlzdHJ1Y3Qgbmxtc2doZHIgKm4gPSAmYS0+aDsKKwkJCQlzdHJ1Y3QgaWZhZGRybXNnICppZmEgPSBOTE1TR19EQVRBKG4pOworCisJCQkJaWYgKGlmYS0+aWZhX2luZGV4ICE9IGlmaS0+aWZpX2luZGV4CisJCQkJIHx8IChHX2ZpbHRlci5mYW1pbHkgJiYgR19maWx0ZXIuZmFtaWx5ICE9IGlmYS0+aWZhX2ZhbWlseSkKKwkJCQkpIHsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmICgoR19maWx0ZXIuc2NvcGUgXiBpZmEtPmlmYV9zY29wZSkgJiBHX2ZpbHRlci5zY29wZW1hc2spCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICgoR19maWx0ZXIuZmxhZ3MgXiBpZmEtPmlmYV9mbGFncykgJiBHX2ZpbHRlci5mbGFnbWFzaykKKwkJCQkJY29udGludWU7CisJCQkJaWYgKEdfZmlsdGVyLnBmeC5mYW1pbHkgfHwgR19maWx0ZXIubGFiZWwpIHsKKwkJCQkJc3RydWN0IHJ0YXR0ciAqdGJbSUZBX01BWCsxXTsKKwkJCQkJbWVtc2V0KHRiLCAwLCBzaXplb2YodGIpKTsKKwkJCQkJcGFyc2VfcnRhdHRyKHRiLCBJRkFfTUFYLCBJRkFfUlRBKGlmYSksIElGQV9QQVlMT0FEKG4pKTsKKwkJCQkJaWYgKCF0YltJRkFfTE9DQUxdKQorCQkJCQkJdGJbSUZBX0xPQ0FMXSA9IHRiW0lGQV9BRERSRVNTXTsKKworCQkJCQlpZiAoR19maWx0ZXIucGZ4LmZhbWlseSAmJiB0YltJRkFfTE9DQUxdKSB7CisJCQkJCQlpbmV0X3ByZWZpeCBkc3Q7CisJCQkJCQltZW1zZXQoJmRzdCwgMCwgc2l6ZW9mKGRzdCkpOworCQkJCQkJZHN0LmZhbWlseSA9IGlmYS0+aWZhX2ZhbWlseTsKKwkJCQkJCW1lbWNweSgmZHN0LmRhdGEsIFJUQV9EQVRBKHRiW0lGQV9MT0NBTF0pLCBSVEFfUEFZTE9BRCh0YltJRkFfTE9DQUxdKSk7CisJCQkJCQlpZiAoaW5ldF9hZGRyX21hdGNoKCZkc3QsICZHX2ZpbHRlci5wZngsIEdfZmlsdGVyLnBmeC5iaXRsZW4pKQorCQkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJCWlmIChHX2ZpbHRlci5sYWJlbCkgeworCQkJCQkJY29uc3QgY2hhciAqbGFiZWw7CisJCQkJCQlpZiAodGJbSUZBX0xBQkVMXSkKKwkJCQkJCQlsYWJlbCA9IFJUQV9EQVRBKHRiW0lGQV9MQUJFTF0pOworCQkJCQkJZWxzZQorCQkJCQkJCWxhYmVsID0gbGxfaW5kZXhfdG9fbmFtZShpZmEtPmlmYV9pbmRleCk7CisJCQkJCQlpZiAoZm5tYXRjaChHX2ZpbHRlci5sYWJlbCwgbGFiZWwsIDApICE9IDApCisJCQkJCQkJY29udGludWU7CisJCQkJCX0KKwkJCQl9CisKKwkJCQlvayA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoIW9rKQorCQkJCSpscCA9IGwtPm5leHQ7CisJCQllbHNlCisJCQkJbHAgPSAmbC0+bmV4dDsKKwkJfQorCX0KKworCWZvciAobCA9IGxpbmZvOyBsOyBsID0gbC0+bmV4dCkgeworCQlpZiAobm9fbGluayB8fCBwcmludF9saW5raW5mbygmbC0+aCkgPT0gMCkgeworCQkJc3RydWN0IGlmaW5mb21zZyAqaWZpID0gTkxNU0dfREFUQSgmbC0+aCk7CisJCQlpZiAoR19maWx0ZXIuZmFtaWx5ICE9IEFGX1BBQ0tFVCkKKwkJCQlwcmludF9zZWxlY3RlZF9hZGRyaW5mbyhpZmktPmlmaV9pbmRleCwgYWluZm8pOworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZGVmYXVsdF9zY29wZShpbmV0X3ByZWZpeCAqbGNsKQoreworCWlmIChsY2wtPmZhbWlseSA9PSBBRl9JTkVUKSB7CisJCWlmIChsY2wtPmJ5dGVsZW4gPj0gMSAmJiAqKHVpbnQ4X3QqKSZsY2wtPmRhdGEgPT0gMTI3KQorCQkJcmV0dXJuIFJUX1NDT1BFX0hPU1Q7CisJfQorCXJldHVybiAwOworfQorCisvKiBSZXR1cm4gdmFsdWUgYmVjb21lcyBleGl0Y29kZS4gSXQncyBva2F5IHRvIG5vdCByZXR1cm4gYXQgYWxsICovCitzdGF0aWMgaW50IGlwYWRkcl9tb2RpZnkoaW50IGNtZCwgaW50IGZsYWdzLCBjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBvcHRpb25bXSBBTElHTjEgPQorCQkicGVlclwwIiJyZW1vdGVcMCIiYnJvYWRjYXN0XDAiImJyZFwwIgorCQkiYW55Y2FzdFwwIiJzY29wZVwwIiJkZXZcMCIibGFiZWxcMCIibG9jYWxcMCI7CisJc3RydWN0IHJ0bmxfaGFuZGxlIHJ0aDsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3Qgbmxtc2doZHIgIG47CisJCXN0cnVjdCBpZmFkZHJtc2cgaWZhOworCQljaGFyICAgICAgICAgICAgIGJ1ZlsyNTZdOworCX0gcmVxOworCWNoYXIgKmQgPSBOVUxMOworCWNoYXIgKmwgPSBOVUxMOworCWluZXRfcHJlZml4IGxjbDsKKwlpbmV0X3ByZWZpeCBwZWVyOworCWludCBsb2NhbF9sZW4gPSAwOworCWludCBwZWVyX2xlbiA9IDA7CisJaW50IGJyZF9sZW4gPSAwOworCWludCBhbnlfbGVuID0gMDsKKwlib29sIHNjb3BlZCA9IDA7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCisJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgaWZhZGRybXNnKSk7CisJcmVxLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUIHwgZmxhZ3M7CisJcmVxLm4ubmxtc2dfdHlwZSA9IGNtZDsKKwlyZXEuaWZhLmlmYV9mYW1pbHkgPSBwcmVmZXJyZWRfZmFtaWx5OworCisJd2hpbGUgKCphcmd2KSB7CisJCXVuc2lnbmVkIGFyZyA9IGluZGV4X2luX3N0cmluZ3Mob3B0aW9uLCAqYXJndik7CisJCS8qIGlmIHNlYXJjaCBmYWlscywgImxvY2FsIiBpcyBhc3N1bWVkICovCisJCWlmICgoaW50KWFyZyA+PSAwKQorCQkJTkVYVF9BUkcoKTsKKworCQlpZiAoYXJnIDw9IDEpIHsgLyogcGVlciwgcmVtb3RlICovCisJCQlpZiAocGVlcl9sZW4pIHsKKwkJCQlkdXBhcmcoInBlZXIiLCAqYXJndik7CisJCQl9CisJCQlnZXRfcHJlZml4KCZwZWVyLCAqYXJndiwgcmVxLmlmYS5pZmFfZmFtaWx5KTsKKwkJCXBlZXJfbGVuID0gcGVlci5ieXRlbGVuOworCQkJaWYgKHJlcS5pZmEuaWZhX2ZhbWlseSA9PSBBRl9VTlNQRUMpIHsKKwkJCQlyZXEuaWZhLmlmYV9mYW1pbHkgPSBwZWVyLmZhbWlseTsKKwkJCX0KKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBJRkFfQUREUkVTUywgJnBlZXIuZGF0YSwgcGVlci5ieXRlbGVuKTsKKwkJCXJlcS5pZmEuaWZhX3ByZWZpeGxlbiA9IHBlZXIuYml0bGVuOworCQl9IGVsc2UgaWYgKGFyZyA8PSAzKSB7IC8qIGJyb2FkY2FzdCwgYnJkICovCisJCQlpbmV0X3ByZWZpeCBhZGRyOworCQkJaWYgKGJyZF9sZW4pIHsKKwkJCQlkdXBhcmcoImJyb2FkY2FzdCIsICphcmd2KTsKKwkJCX0KKwkJCWlmIChMT05FX0NIQVIoKmFyZ3YsICcrJykpIHsKKwkJCQlicmRfbGVuID0gLTE7CisJCQl9IGVsc2UgaWYgKExPTkVfREFTSCgqYXJndikpIHsKKwkJCQlicmRfbGVuID0gLTI7CisJCQl9IGVsc2UgeworCQkJCWdldF9hZGRyKCZhZGRyLCAqYXJndiwgcmVxLmlmYS5pZmFfZmFtaWx5KTsKKwkJCQlpZiAocmVxLmlmYS5pZmFfZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJCQkJcmVxLmlmYS5pZmFfZmFtaWx5ID0gYWRkci5mYW1pbHk7CisJCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIElGQV9CUk9BRENBU1QsICZhZGRyLmRhdGEsIGFkZHIuYnl0ZWxlbik7CisJCQkJYnJkX2xlbiA9IGFkZHIuYnl0ZWxlbjsKKwkJCX0KKwkJfSBlbHNlIGlmIChhcmcgPT0gNCkgeyAvKiBhbnljYXN0ICovCisJCQlpbmV0X3ByZWZpeCBhZGRyOworCQkJaWYgKGFueV9sZW4pIHsKKwkJCQlkdXBhcmcoImFueWNhc3QiLCAqYXJndik7CisJCQl9CisJCQlnZXRfYWRkcigmYWRkciwgKmFyZ3YsIHJlcS5pZmEuaWZhX2ZhbWlseSk7CisJCQlpZiAocmVxLmlmYS5pZmFfZmFtaWx5ID09IEFGX1VOU1BFQykgeworCQkJCXJlcS5pZmEuaWZhX2ZhbWlseSA9IGFkZHIuZmFtaWx5OworCQkJfQorCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIElGQV9BTllDQVNULCAmYWRkci5kYXRhLCBhZGRyLmJ5dGVsZW4pOworCQkJYW55X2xlbiA9IGFkZHIuYnl0ZWxlbjsKKwkJfSBlbHNlIGlmIChhcmcgPT0gNSkgeyAvKiBzY29wZSAqLworCQkJdWludDMyX3Qgc2NvcGUgPSAwOworCQkJaWYgKHJ0bmxfcnRzY29wZV9hMm4oJnNjb3BlLCAqYXJndikpIHsKKwkJCQlpbnZhcmcoKmFyZ3YsICJzY29wZSIpOworCQkJfQorCQkJcmVxLmlmYS5pZmFfc2NvcGUgPSBzY29wZTsKKwkJCXNjb3BlZCA9IDE7CisJCX0gZWxzZSBpZiAoYXJnID09IDYpIHsgLyogZGV2ICovCisJCQlkID0gKmFyZ3Y7CisJCX0gZWxzZSBpZiAoYXJnID09IDcpIHsgLyogbGFiZWwgKi8KKwkJCWwgPSAqYXJndjsKKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBJRkFfTEFCRUwsIGwsIHN0cmxlbihsKSArIDEpOworCQl9IGVsc2UgeworCQkJLyogbG9jYWwgKHNwZWNpZmllZCBvciBhc3N1bWVkKSAqLworCQkJaWYgKGxvY2FsX2xlbikgeworCQkJCWR1cGFyZzIoImxvY2FsIiwgKmFyZ3YpOworCQkJfQorCQkJZ2V0X3ByZWZpeCgmbGNsLCAqYXJndiwgcmVxLmlmYS5pZmFfZmFtaWx5KTsKKwkJCWlmIChyZXEuaWZhLmlmYV9mYW1pbHkgPT0gQUZfVU5TUEVDKSB7CisJCQkJcmVxLmlmYS5pZmFfZmFtaWx5ID0gbGNsLmZhbWlseTsKKwkJCX0KKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBJRkFfTE9DQUwsICZsY2wuZGF0YSwgbGNsLmJ5dGVsZW4pOworCQkJbG9jYWxfbGVuID0gbGNsLmJ5dGVsZW47CisJCX0KKwkJYXJndisrOworCX0KKworCWlmICghZCkgeworCQkvKiBUaGVyZSB3YXMgbm8gImRldiBJRkFDRSIsIGJ1dCB3ZSBuZWVkIHRoYXQgKi8KKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5lZWQgXCJkZXYgSUZBQ0VcIiIpOworCX0KKwlpZiAobCAmJiAhaXNfcHJlZml4ZWRfd2l0aChsLCBkKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiXCJkZXZcIiAoJXMpIG11c3QgbWF0Y2ggXCJsYWJlbFwiICglcykiLCBkLCBsKTsKKwl9CisKKwlpZiAocGVlcl9sZW4gPT0gMCAmJiBsb2NhbF9sZW4gJiYgY21kICE9IFJUTV9ERUxBRERSKSB7CisJCXBlZXIgPSBsY2w7CisJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBJRkFfQUREUkVTUywgJmxjbC5kYXRhLCBsY2wuYnl0ZWxlbik7CisJfQorCWlmIChyZXEuaWZhLmlmYV9wcmVmaXhsZW4gPT0gMCkKKwkJcmVxLmlmYS5pZmFfcHJlZml4bGVuID0gbGNsLmJpdGxlbjsKKworCWlmIChicmRfbGVuIDwgMCAmJiBjbWQgIT0gUlRNX0RFTEFERFIpIHsKKwkJaW5ldF9wcmVmaXggYnJkOworCQlpbnQgaTsKKwkJaWYgKHJlcS5pZmEuaWZhX2ZhbWlseSAhPSBBRl9JTkVUKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYnJvYWRjYXN0IGNhbiBiZSBzZXQgb25seSBmb3IgSVB2NCBhZGRyZXNzZXMiKTsKKwkJfQorCQlicmQgPSBwZWVyOworCQlpZiAoYnJkLmJpdGxlbiA8PSAzMCkgeworCQkJZm9yIChpID0gMzE7IGkgPj0gYnJkLmJpdGxlbjsgaS0tKSB7CisJCQkJaWYgKGJyZF9sZW4gPT0gLTEpCisJCQkJCWJyZC5kYXRhWzBdIHw9IGh0b25sKDE8PCgzMS1pKSk7CisJCQkJZWxzZQorCQkJCQlicmQuZGF0YVswXSAmPSB+aHRvbmwoMTw8KDMxLWkpKTsKKwkJCX0KKwkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBJRkFfQlJPQURDQVNULCAmYnJkLmRhdGEsIGJyZC5ieXRlbGVuKTsKKwkJCWJyZF9sZW4gPSBicmQuYnl0ZWxlbjsKKwkJfQorCX0KKwlpZiAoIXNjb3BlZCAmJiBjbWQgIT0gUlRNX0RFTEFERFIpCisJCXJlcS5pZmEuaWZhX3Njb3BlID0gZGVmYXVsdF9zY29wZSgmbGNsKTsKKworCXhydG5sX29wZW4oJnJ0aCk7CisKKwlsbF9pbml0X21hcCgmcnRoKTsKKworCXJlcS5pZmEuaWZhX2luZGV4ID0geGxsX25hbWVfdG9faW5kZXgoZCk7CisKKwlpZiAocnRubF90YWxrKCZydGgsICZyZXEubiwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCkgPCAwKQorCQlyZXR1cm4gMjsKKworCXJldHVybiAwOworfQorCisvKiBSZXR1cm4gdmFsdWUgYmVjb21lcyBleGl0Y29kZS4gSXQncyBva2F5IHRvIG5vdCByZXR1cm4gYXQgYWxsICovCitpbnQgRkFTVF9GVU5DIGRvX2lwYWRkcihjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBjb21tYW5kc1tdIEFMSUdOMSA9CisJCS8qIDAgICAgMSAgICAgICAgIDIgICAgICAzICAgICAgICAgIDQgICAgICAgICA1ICAgICAgIDYgICAgICAgNyAgICAgIDggKi8KKwkJImFkZFwwIiJjaGFuZ2VcMCIiY2hnXDAiInJlcGxhY2VcMCIiZGVsZXRlXDAiImxpc3RcMCIic2hvd1wwIiJsc3RcMCIiZmx1c2hcMCI7CisJaW50IGNtZCA9IDI7CisJaWYgKCphcmd2KSB7CisJCWNtZCA9IGluZGV4X2luX3N1YnN0cmluZ3MoY29tbWFuZHMsICphcmd2KTsKKwkJaWYgKGNtZCA8IDApCisJCQlpbnZhcmcoKmFyZ3YsIGFwcGxldF9uYW1lKTsKKwkJYXJndisrOworCQlpZiAoY21kIDw9IDQpIHsKKwkJCXJldHVybiBpcGFkZHJfbW9kaWZ5KAorCQkJCS8qY21kOiovIGNtZCA9PSA0ID8gUlRNX0RFTEFERFIgOiBSVE1fTkVXQUREUiwKKwkJCQkvKmZsYWdzOiovCisJCQkJCWNtZCA9PSAwID8gTkxNX0ZfQ1JFQVRFfE5MTV9GX0VYQ0wgOiAvKiBhZGQgKi8KKwkJCQkJY21kID09IDEgfHwgY21kID09IDIgPyBOTE1fRl9SRVBMQUNFIDogLyogY2hhbmdlICovCisJCQkJCWNtZCA9PSAzID8gTkxNX0ZfQ1JFQVRFfE5MTV9GX1JFUExBQ0UgOiAvKiByZXBsYWNlICovCisJCQkJCTAgLyogZGVsZXRlICovCisJCQksIGFyZ3YpOworCQl9CisJfQorCXJldHVybiBpcGFkZHJfbGlzdF9vcl9mbHVzaChhcmd2LCBjbWQgPT0gOCk7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2xpYmlwcm91dGUvaXBsaW5rLmMgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvaXBsaW5rLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyN2MyZAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcGxpbmsuYwpAQCAtMCwwICsxLDY5OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQXV0aG9yczogQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICogCQkJUGF0cmljayBNY0hhcmR5IDxrYWJlckB0cmFzaC5uZXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgPG5ldC9pZi5oPgorLyojaW5jbHVkZSA8bmV0L2lmX3BhY2tldC5oPiAtIG5vdCBuZWVkZWQ/ICovCisjaW5jbHVkZSA8bmV0cGFja2V0L3BhY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KKworI2luY2x1ZGUgPGxpbnV4L2lmX3ZsYW4uaD4KKyNpbmNsdWRlICJpcF9jb21tb24uaCIgIC8qICNpbmNsdWRlICJsaWJiYi5oIiBpcyBpbnNpZGUgKi8KKyNpbmNsdWRlICJydF9uYW1lcy5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKKyN1bmRlZiAgRVRIX1BfODAyMUFECisjZGVmaW5lIEVUSF9QXzgwMjFBRCAgICAgICAgICAgIDB4ODhBOAorI3VuZGVmICBWTEFOX0ZMQUdfUkVPUkRFUl9IRFIKKyNkZWZpbmUgVkxBTl9GTEFHX1JFT1JERVJfSERSICAgMHgxCisjdW5kZWYgIFZMQU5fRkxBR19HVlJQCisjZGVmaW5lIFZMQU5fRkxBR19HVlJQICAgICAgICAgIDB4MgorI3VuZGVmICBWTEFOX0ZMQUdfTE9PU0VfQklORElORworI2RlZmluZSBWTEFOX0ZMQUdfTE9PU0VfQklORElORyAweDQKKyN1bmRlZiAgVkxBTl9GTEFHX01WUlAKKyNkZWZpbmUgVkxBTl9GTEFHX01WUlAgICAgICAgICAgMHg4CisjdW5kZWYgIElGTEFfVkxBTl9QUk9UT0NPTAorI2RlZmluZSBJRkxBX1ZMQU5fUFJPVE9DT0wgICAgICA1CisKKyNpZm5kZWYgSUZMQV9MSU5LSU5GTworIyBkZWZpbmUgSUZMQV9MSU5LSU5GTyAxOAorIyBkZWZpbmUgSUZMQV9JTkZPX0tJTkQgMQorIyBkZWZpbmUgSUZMQV9JTkZPX0RBVEEgMgorI2VuZGlmCisKKyNpZm5kZWYgSUZMQV9WTEFOX01BWAorIyBkZWZpbmUgSUZMQV9WTEFOX0lEIDEKKyMgZGVmaW5lIElGTEFfVkxBTl9GTEFHUyAyCitzdHJ1Y3QgaWZsYV92bGFuX2ZsYWdzIHsKKwl1aW50MzJfdAlmbGFnczsKKwl1aW50MzJfdAltYXNrOworfTsKKyNlbmRpZgorCisvKiB0YWtlbiBmcm9tIGxpbnV4L3NvY2tpb3MuaCAqLworI2RlZmluZSBTSU9DU0lGTkFNRSAgMHg4OTIzICAvKiBzZXQgaW50ZXJmYWNlIG5hbWUgKi8KKworI2lmIDAKKyMgZGVmaW5lIGRiZyguLi4pIGJiX2Vycm9yX21zZyhfX1ZBX0FSR1NfXykKKyNlbHNlCisjIGRlZmluZSBkYmcoLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorCisvKiBFeGl0cyBvbiBlcnJvciAqLworc3RhdGljIGludCBnZXRfY3RsX2ZkKHZvaWQpCit7CisJaW50IGZkOworCisJZmQgPSBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJaWYgKGZkID49IDApCisJCXJldHVybiBmZDsKKwlmZCA9IHNvY2tldChQRl9QQUNLRVQsIFNPQ0tfREdSQU0sIDApOworCWlmIChmZCA+PSAwKQorCQlyZXR1cm4gZmQ7CisJcmV0dXJuIHhzb2NrZXQoUEZfSU5FVDYsIFNPQ0tfREdSQU0sIDApOworfQorCisvKiBFeGl0cyBvbiBlcnJvciAqLworc3RhdGljIHZvaWQgZG9fY2hmbGFncyhjaGFyICpkZXYsIHVpbnQzMl90IGZsYWdzLCB1aW50MzJfdCBtYXNrKQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IGZkOworCisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGRldik7CisJZmQgPSBnZXRfY3RsX2ZkKCk7CisJeGlvY3RsKGZkLCBTSU9DR0lGRkxBR1MsICZpZnIpOworCWlmICgoaWZyLmlmcl9mbGFncyBeIGZsYWdzKSAmIG1hc2spIHsKKwkJaWZyLmlmcl9mbGFncyAmPSB+bWFzazsKKwkJaWZyLmlmcl9mbGFncyB8PSBtYXNrICYgZmxhZ3M7CisJCXhpb2N0bChmZCwgU0lPQ1NJRkZMQUdTLCAmaWZyKTsKKwl9CisJY2xvc2UoZmQpOworfQorCisvKiBFeGl0cyBvbiBlcnJvciAqLworc3RhdGljIHZvaWQgZG9fY2hhbmdlbmFtZShjaGFyICpkZXYsIGNoYXIgKm5ld2RldikKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBmZDsKKworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBkZXYpOworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uZXduYW1lLCBuZXdkZXYpOworCWZkID0gZ2V0X2N0bF9mZCgpOworCXhpb2N0bChmZCwgU0lPQ1NJRk5BTUUsICZpZnIpOworCWNsb3NlKGZkKTsKK30KKworLyogRXhpdHMgb24gZXJyb3IgKi8KK3N0YXRpYyB2b2lkIHNldF9xbGVuKGNoYXIgKmRldiwgaW50IHFsZW4pCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgczsKKworCXMgPSBnZXRfY3RsX2ZkKCk7CisJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgZGV2KTsKKwlpZnIuaWZyX3FsZW4gPSBxbGVuOworCXhpb2N0bChzLCBTSU9DU0lGVFhRTEVOLCAmaWZyKTsKKwljbG9zZShzKTsKK30KKworLyogRXhpdHMgb24gZXJyb3IgKi8KK3N0YXRpYyB2b2lkIHNldF9tdHUoY2hhciAqZGV2LCBpbnQgbXR1KQoreworCXN0cnVjdCBpZnJlcSBpZnI7CisJaW50IHM7CisKKwlzID0gZ2V0X2N0bF9mZCgpOworCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGRldik7CisJaWZyLmlmcl9tdHUgPSBtdHU7CisJeGlvY3RsKHMsIFNJT0NTSUZNVFUsICZpZnIpOworCWNsb3NlKHMpOworfQorCisvKiBFeGl0cyBvbiBlcnJvciAqLworc3RhdGljIGludCBnZXRfYWRkcmVzcyhjaGFyICpkZXYsIGludCAqaHR5cGUpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlzdHJ1Y3Qgc29ja2FkZHJfbGwgbWU7CisJc29ja2xlbl90IGFsZW47CisJaW50IHM7CisKKwlzID0geHNvY2tldChQRl9QQUNLRVQsIFNPQ0tfREdSQU0sIDApOworCisJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgZGV2KTsKKwl4aW9jdGwocywgU0lPQ0dJRklOREVYLCAmaWZyKTsKKworCW1lbXNldCgmbWUsIDAsIHNpemVvZihtZSkpOworCW1lLnNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7CisJbWUuc2xsX2lmaW5kZXggPSBpZnIuaWZyX2lmaW5kZXg7CisJbWUuc2xsX3Byb3RvY29sID0gaHRvbnMoRVRIX1BfTE9PUCk7CisJeGJpbmQocywgKHN0cnVjdCBzb2NrYWRkciopJm1lLCBzaXplb2YobWUpKTsKKwlhbGVuID0gc2l6ZW9mKG1lKTsKKwlnZXRzb2NrbmFtZShzLCAoc3RydWN0IHNvY2thZGRyKikmbWUsICZhbGVuKTsKKwkvL25ldmVyIGhhcHBlbnM6CisJLy9pZiAoZ2V0c29ja25hbWUocywgKHN0cnVjdCBzb2NrYWRkciopJm1lLCAmYWxlbikgPT0gLTEpCisJLy8JYmJfcGVycm9yX21zZ19hbmRfZGllKCJnZXRzb2NrbmFtZSIpOworCWNsb3NlKHMpOworCSpodHlwZSA9IG1lLnNsbF9oYXR5cGU7CisJcmV0dXJuIG1lLnNsbF9oYWxlbjsKK30KKworLyogRXhpdHMgb24gZXJyb3IgKi8KK3N0YXRpYyB2b2lkIHBhcnNlX2FkZHJlc3MoY2hhciAqZGV2LCBpbnQgaGF0eXBlLCBpbnQgaGFsZW4sIGNoYXIgKmxsYSwgc3RydWN0IGlmcmVxICppZnIpCit7CisJaW50IGFsZW47CisKKwltZW1zZXQoaWZyLCAwLCBzaXplb2YoKmlmcikpOworCXN0cm5jcHlfSUZOQU1TSVooaWZyLT5pZnJfbmFtZSwgZGV2KTsKKwlpZnItPmlmcl9od2FkZHIuc2FfZmFtaWx5ID0gaGF0eXBlOworCisJYWxlbiA9IGhhdHlwZSA9PSAxLypBUlBIUkRfRVRIRVIqLyA/IDE0LypFVEhfSExFTiovIDogMTkvKklORklOSUJBTkRfSExFTiovOworCWFsZW4gPSBsbF9hZGRyX2EybigodW5zaWduZWQgY2hhciAqKShpZnItPmlmcl9od2FkZHIuc2FfZGF0YSksIGFsZW4sIGxsYSk7CisJaWYgKGFsZW4gPCAwKQorCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJaWYgKGFsZW4gIT0gaGFsZW4pIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIndyb25nIGFkZHJlc3MgKCVzKSBsZW5ndGg6IGV4cGVjdGVkICVkIGJ5dGVzIiwgbGxhLCBoYWxlbik7CisJfQorfQorCisvKiBFeGl0cyBvbiBlcnJvciAqLworc3RhdGljIHZvaWQgc2V0X2FkZHJlc3Moc3RydWN0IGlmcmVxICppZnIsIGludCBicmQpCit7CisJaW50IHM7CisKKwlzID0gZ2V0X2N0bF9mZCgpOworCWlmIChicmQpCisJCXhpb2N0bChzLCBTSU9DU0lGSFdCUk9BRENBU1QsIGlmcik7CisJZWxzZQorCQl4aW9jdGwocywgU0lPQ1NJRkhXQUREUiwgaWZyKTsKKwljbG9zZShzKTsKK30KKworCitzdGF0aWMgdm9pZCBkaWVfbXVzdF9iZV9vbl9vZmYoY29uc3QgY2hhciAqbXNnKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGRpZV9tdXN0X2JlX29uX29mZihjb25zdCBjaGFyICptc2cpCit7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImFyZ3VtZW50IG9mIFwiJXNcIiBtdXN0IGJlIFwib25cIiBvciBcIm9mZlwiIiwgbXNnKTsKK30KKworLyogUmV0dXJuIHZhbHVlIGJlY29tZXMgZXhpdGNvZGUuIEl0J3Mgb2theSB0byBub3QgcmV0dXJuIGF0IGFsbCAqLworc3RhdGljIGludCBkb19zZXQoY2hhciAqKmFyZ3YpCit7CisJY2hhciAqZGV2ID0gTlVMTDsKKwl1aW50MzJfdCBtYXNrID0gMDsKKwl1aW50MzJfdCBmbGFncyA9IDA7CisJaW50IHFsZW4gPSAtMTsKKwlpbnQgbXR1ID0gLTE7CisJY2hhciAqbmV3YWRkciA9IE5VTEw7CisJY2hhciAqbmV3YnJkID0gTlVMTDsKKwlzdHJ1Y3QgaWZyZXEgaWZyMCwgaWZyMTsKKwljaGFyICpuZXduYW1lID0gTlVMTDsKKwlpbnQgaHR5cGUsIGhhbGVuOworCXN0YXRpYyBjb25zdCBjaGFyIGtleXdvcmRzW10gQUxJR04xID0KKwkJInVwXDAiImRvd25cMCIibmFtZVwwIiJtdHVcMCIicWxlblwwIiJtdWx0aWNhc3RcMCIKKwkJImFycFwwIiJhZGRyZXNzXDAiImRldlwwIjsKKwllbnVtIHsgQVJHX3VwID0gMCwgQVJHX2Rvd24sIEFSR19uYW1lLCBBUkdfbXR1LCBBUkdfcWxlbiwgQVJHX211bHRpY2FzdCwKKwkJQVJHX2FycCwgQVJHX2FkZHIsIEFSR19kZXYgfTsKKwlzdGF0aWMgY29uc3QgY2hhciBzdHJfb25fb2ZmW10gQUxJR04xID0gIm9uXDAiIm9mZlwwIjsKKwllbnVtIHsgUEFSTV9vbiA9IDAsIFBBUk1fb2ZmIH07CisJc21hbGx1aW50IGtleTsKKworCXdoaWxlICgqYXJndikgeworCQkvKiBzdWJzdHJpbmcgc2VhcmNoIGVuc3VyZXMgdGhhdCBlLmcuICJhZGRyIiBhbmQgImFkZHJlc3MiCisJCSAqIGFyZSBib3RoIGFjY2VwdGVkICovCisJCWtleSA9IGluZGV4X2luX3N1YnN0cmluZ3Moa2V5d29yZHMsICphcmd2KTsKKwkJaWYgKGtleSA9PSBBUkdfdXApIHsKKwkJCW1hc2sgfD0gSUZGX1VQOworCQkJZmxhZ3MgfD0gSUZGX1VQOworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfZG93bikgeworCQkJbWFzayB8PSBJRkZfVVA7CisJCQlmbGFncyAmPSB+SUZGX1VQOworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfbmFtZSkgeworCQkJTkVYVF9BUkcoKTsKKwkJCW5ld25hbWUgPSAqYXJndjsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX210dSkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChtdHUgIT0gLTEpCisJCQkJZHVwYXJnKCJtdHUiLCAqYXJndik7CisJCQltdHUgPSBnZXRfdW5zaWduZWQoKmFyZ3YsICJtdHUiKTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX3FsZW4pIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocWxlbiAhPSAtMSkKKwkJCQlkdXBhcmcoInFsZW4iLCAqYXJndik7CisJCQlxbGVuID0gZ2V0X3Vuc2lnbmVkKCphcmd2LCAicWxlbiIpOworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfYWRkcikgeworCQkJTkVYVF9BUkcoKTsKKwkJCW5ld2FkZHIgPSAqYXJndjsKKwkJfSBlbHNlIGlmIChrZXkgPj0gQVJHX2RldikgeworCQkJaWYgKGtleSA9PSBBUkdfZGV2KSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCX0KKwkJCWlmIChkZXYpCisJCQkJZHVwYXJnMigiZGV2IiwgKmFyZ3YpOworCQkJZGV2ID0gKmFyZ3Y7CisJCX0gZWxzZSB7CisJCQlpbnQgcGFyYW07CisJCQlORVhUX0FSRygpOworCQkJcGFyYW0gPSBpbmRleF9pbl9zdHJpbmdzKHN0cl9vbl9vZmYsICphcmd2KTsKKwkJCWlmIChrZXkgPT0gQVJHX211bHRpY2FzdCkgeworCQkJCWlmIChwYXJhbSA8IDApCisJCQkJCWRpZV9tdXN0X2JlX29uX29mZigibXVsdGljYXN0Iik7CisJCQkJbWFzayB8PSBJRkZfTVVMVElDQVNUOworCQkJCWlmIChwYXJhbSA9PSBQQVJNX29uKQorCQkJCQlmbGFncyB8PSBJRkZfTVVMVElDQVNUOworCQkJCWVsc2UKKwkJCQkJZmxhZ3MgJj0gfklGRl9NVUxUSUNBU1Q7CisJCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfYXJwKSB7CisJCQkJaWYgKHBhcmFtIDwgMCkKKwkJCQkJZGllX211c3RfYmVfb25fb2ZmKCJhcnAiKTsKKwkJCQltYXNrIHw9IElGRl9OT0FSUDsKKwkJCQlpZiAocGFyYW0gPT0gUEFSTV9vbikKKwkJCQkJZmxhZ3MgJj0gfklGRl9OT0FSUDsKKwkJCQllbHNlCisJCQkJCWZsYWdzIHw9IElGRl9OT0FSUDsKKwkJCX0KKwkJfQorCQlhcmd2Kys7CisJfQorCisJaWYgKCFkZXYpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3JlcXVpcmVzX2FyZywgIlwiZGV2XCIiKTsKKwl9CisKKwlpZiAobmV3YWRkciB8fCBuZXdicmQpIHsKKwkJaGFsZW4gPSBnZXRfYWRkcmVzcyhkZXYsICZodHlwZSk7CisJCWlmIChuZXdhZGRyKSB7CisJCQlwYXJzZV9hZGRyZXNzKGRldiwgaHR5cGUsIGhhbGVuLCBuZXdhZGRyLCAmaWZyMCk7CisJCQlzZXRfYWRkcmVzcygmaWZyMCwgMCk7CisJCX0KKwkJaWYgKG5ld2JyZCkgeworCQkJcGFyc2VfYWRkcmVzcyhkZXYsIGh0eXBlLCBoYWxlbiwgbmV3YnJkLCAmaWZyMSk7CisJCQlzZXRfYWRkcmVzcygmaWZyMSwgMSk7CisJCX0KKwl9CisKKwlpZiAobmV3bmFtZSAmJiBzdHJjbXAoZGV2LCBuZXduYW1lKSkgeworCQlkb19jaGFuZ2VuYW1lKGRldiwgbmV3bmFtZSk7CisJCWRldiA9IG5ld25hbWU7CisJfQorCWlmIChxbGVuICE9IC0xKSB7CisJCXNldF9xbGVuKGRldiwgcWxlbik7CisJfQorCWlmIChtdHUgIT0gLTEpIHsKKwkJc2V0X210dShkZXYsIG10dSk7CisJfQorCWlmIChtYXNrKQorCQlkb19jaGZsYWdzKGRldiwgZmxhZ3MsIG1hc2spOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwYWRkcl9saXN0X2xpbmsoY2hhciAqKmFyZ3YpCit7CisJcHJlZmVycmVkX2ZhbWlseSA9IEFGX1BBQ0tFVDsKKwlyZXR1cm4gaXBhZGRyX2xpc3Rfb3JfZmx1c2goYXJndiwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHZsYW5fcGFyc2Vfb3B0KGNoYXIgKiphcmd2LCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHVuc2lnbmVkIGludCBzaXplKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGtleXdvcmRzW10gQUxJR04xID0KKwkJImlkXDAiCisJCSJwcm90b2NvbFwwIgorCQkicmVvcmRlcl9oZHJcMCIKKwkJImd2cnBcMCIKKwkJIm12cnBcMCIKKwkJImxvb3NlX2JpbmRpbmdcMCIKKwk7CisJc3RhdGljIGNvbnN0IGNoYXIgcHJvdG9jb2xzW10gQUxJR04xID0KKwkJIjgwMi4xcVwwIgorCQkiODAyLjFhZFwwIgorCTsKKwlzdGF0aWMgY29uc3QgY2hhciBzdHJfb25fb2ZmW10gQUxJR04xID0KKwkJIm9uXDAiCisJCSJvZmZcMCIKKwk7CisJZW51bSB7CisJCUFSR19pZCA9IDAsCisJCUFSR19yZW9yZGVyX2hkciwKKwkJQVJHX2d2cnAsCisJCUFSR19tdnJwLAorCQlBUkdfbG9vc2VfYmluZGluZywKKwkJQVJHX3Byb3RvY29sLAorCX07CisJZW51bSB7CisJCVBST1RPXzgwMjFRID0gMCwKKwkJUFJPVE9fODAyMUFELAorCX07CisJZW51bSB7CisJCVBBUk1fb24gPSAwLAorCQlQQVJNX29mZgorCX07CisJaW50IGFyZzsKKwl1aW50MTZfdCBpZCwgcHJvdG87CisJc3RydWN0IGlmbGFfdmxhbl9mbGFncyBmbGFncyA9IHt9OworCisJd2hpbGUgKCphcmd2KSB7CisJCWFyZyA9IGluZGV4X2luX3N1YnN0cmluZ3Moa2V5d29yZHMsICphcmd2KTsKKwkJaWYgKGFyZyA8IDApCisJCQlpbnZhcmcoKmFyZ3YsICJ0eXBlIHZsYW4iKTsKKworCQlORVhUX0FSRygpOworCQlpZiAoYXJnID09IEFSR19pZCkgeworCQkJaWQgPSBnZXRfdTE2KCphcmd2LCAiaWQiKTsKKwkJCWFkZGF0dHJfbChuLCBzaXplLCBJRkxBX1ZMQU5fSUQsICZpZCwgc2l6ZW9mKGlkKSk7CisJCX0gZWxzZSBpZiAoYXJnID09IEFSR19wcm90b2NvbCkgeworCQkJYXJnID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhwcm90b2NvbHMsICphcmd2KTsKKwkJCWlmIChhcmcgPT0gUFJPVE9fODAyMVEpCisJCQkJcHJvdG8gPSBFVEhfUF84MDIxUTsKKwkJCWVsc2UgaWYgKGFyZyA9PSBQUk9UT184MDIxQUQpCisJCQkJcHJvdG8gPSBFVEhfUF84MDIxQUQ7CisJCQllbHNlCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gVkxBTiBlbmNhcHN1bGF0aW9uIHByb3RvY29sICclcyciLAorCQkJCQkJCQkgICAgICphcmd2KTsKKwkJCWFkZGF0dHJfbChuLCBzaXplLCBJRkxBX1ZMQU5fUFJPVE9DT0wsICZwcm90bywgc2l6ZW9mKHByb3RvKSk7CisJCX0gZWxzZSB7CisJCQlpbnQgcGFyYW0gPSBpbmRleF9pbl9zdHJpbmdzKHN0cl9vbl9vZmYsICphcmd2KTsKKwkJCWlmIChwYXJhbSA8IDApCisJCQkJZGllX211c3RfYmVfb25fb2ZmKG50aF9zdHJpbmcoa2V5d29yZHMsIGFyZykpOworCisJCQlpZiAoYXJnID09IEFSR19yZW9yZGVyX2hkcikgeworCQkJCWZsYWdzLm1hc2sgfD0gVkxBTl9GTEFHX1JFT1JERVJfSERSOworCQkJCWZsYWdzLmZsYWdzICY9IH5WTEFOX0ZMQUdfUkVPUkRFUl9IRFI7CisJCQkJaWYgKHBhcmFtID09IFBBUk1fb24pCisJCQkJCWZsYWdzLmZsYWdzIHw9IFZMQU5fRkxBR19SRU9SREVSX0hEUjsKKwkJCX0gZWxzZSBpZiAoYXJnID09IEFSR19ndnJwKSB7CisJCQkJZmxhZ3MubWFzayB8PSBWTEFOX0ZMQUdfR1ZSUDsKKwkJCQlmbGFncy5mbGFncyAmPSB+VkxBTl9GTEFHX0dWUlA7CisJCQkJaWYgKHBhcmFtID09IFBBUk1fb24pCisJCQkJCWZsYWdzLmZsYWdzIHw9IFZMQU5fRkxBR19HVlJQOworCQkJfSBlbHNlIGlmIChhcmcgPT0gQVJHX212cnApIHsKKwkJCQlmbGFncy5tYXNrIHw9IFZMQU5fRkxBR19NVlJQOworCQkJCWZsYWdzLmZsYWdzICY9IH5WTEFOX0ZMQUdfTVZSUDsKKwkJCQlpZiAocGFyYW0gPT0gUEFSTV9vbikKKwkJCQkJZmxhZ3MuZmxhZ3MgfD0gVkxBTl9GTEFHX01WUlA7CisJCQl9IGVsc2UgeyAvKmlmIChhcmcgPT0gQVJHX2xvb3NlX2JpbmRpbmcpICovCisJCQkJZmxhZ3MubWFzayB8PSBWTEFOX0ZMQUdfTE9PU0VfQklORElORzsKKwkJCQlmbGFncy5mbGFncyAmPSB+VkxBTl9GTEFHX0xPT1NFX0JJTkRJTkc7CisJCQkJaWYgKHBhcmFtID09IFBBUk1fb24pCisJCQkJCWZsYWdzLmZsYWdzIHw9IFZMQU5fRkxBR19MT09TRV9CSU5ESU5HOworCQkJfQorCQl9CisJCWFyZ3YrKzsKKwl9CisKKwlpZiAoZmxhZ3MubWFzaykKKwkJYWRkYXR0cl9sKG4sIHNpemUsIElGTEFfVkxBTl9GTEFHUywgJmZsYWdzLCBzaXplb2YoZmxhZ3MpKTsKK30KKworI2lmbmRlZiBOTE1TR19UQUlMCisjZGVmaW5lIE5MTVNHX1RBSUwobm1zZykgXAorCSgoc3RydWN0IHJ0YXR0ciAqKSAoKCh2b2lkICopIChubXNnKSkgKyBOTE1TR19BTElHTigobm1zZyktPm5sbXNnX2xlbikpKQorI2VuZGlmCisvKiBSZXR1cm4gdmFsdWUgYmVjb21lcyBleGl0Y29kZS4gSXQncyBva2F5IHRvIG5vdCByZXR1cm4gYXQgYWxsICovCitzdGF0aWMgaW50IGRvX2FkZF9vcl9kZWxldGUoY2hhciAqKmFyZ3YsIGNvbnN0IHVuc2lnbmVkIHJ0bSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBrZXl3b3Jkc1tdIEFMSUdOMSA9CisJCSJsaW5rXDAiIm5hbWVcMCIidHlwZVwwIiJkZXZcMCIiYWRkcmVzc1wwIjsKKwllbnVtIHsKKwkJQVJHX2xpbmssCisJCUFSR19uYW1lLAorCQlBUkdfdHlwZSwKKwkJQVJHX2RldiwKKwkJQVJHX2FkZHJlc3MsCisJfTsKKwlzdHJ1Y3QgcnRubF9oYW5kbGUgcnRoOworCXN0cnVjdCB7CisJCXN0cnVjdCBubG1zZ2hkciAgbjsKKwkJc3RydWN0IGlmaW5mb21zZyBpOworCQljaGFyICAgICAgICAgICAgIGJ1ZlsxMDI0XTsKKwl9IHJlcTsKKwlzbWFsbHVpbnQgYXJnOworCWNoYXIgKm5hbWVfc3RyID0gTlVMTDsKKwljaGFyICpsaW5rX3N0ciA9IE5VTEw7CisJY2hhciAqdHlwZV9zdHIgPSBOVUxMOworCWNoYXIgKmRldl9zdHIgPSBOVUxMOworCWNoYXIgKmFkZHJlc3Nfc3RyID0gTlVMTDsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwlyZXEubi5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBpZmluZm9tc2cpKTsKKwlyZXEubi5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7CisJcmVxLm4ubmxtc2dfdHlwZSA9IHJ0bTsKKwlyZXEuaS5pZmlfZmFtaWx5ID0gcHJlZmVycmVkX2ZhbWlseTsKKwlpZiAocnRtID09IFJUTV9ORVdMSU5LKQorCQlyZXEubi5ubG1zZ19mbGFncyB8PSBOTE1fRl9DUkVBVEV8TkxNX0ZfRVhDTDsKKworCXdoaWxlICgqYXJndikgeworCQlhcmcgPSBpbmRleF9pbl9zdWJzdHJpbmdzKGtleXdvcmRzLCAqYXJndik7CisJCWlmIChhcmcgPT0gQVJHX3R5cGUpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQl0eXBlX3N0ciA9ICphcmd2Kys7CisJCQlkYmcoInR5cGVfc3RyOiclcyciLCB0eXBlX3N0cik7CisJCQlicmVhazsKKwkJfQorCQlpZiAoYXJnID09IEFSR19saW5rKSB7CisJCQlORVhUX0FSRygpOworCQkJbGlua19zdHIgPSAqYXJndjsKKwkJCWRiZygibGlua19zdHI6JyVzJyIsIGxpbmtfc3RyKTsKKwkJfSBlbHNlIGlmIChhcmcgPT0gQVJHX25hbWUpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQluYW1lX3N0ciA9ICphcmd2OworCQkJZGJnKCJuYW1lX3N0cjonJXMnIiwgbmFtZV9zdHIpOworCQl9IGVsc2UgaWYgKGFyZyA9PSBBUkdfYWRkcmVzcykgeworCQkJTkVYVF9BUkcoKTsKKwkJCWFkZHJlc3Nfc3RyID0gKmFyZ3Y7CisJCQlkYmcoImFkZHJlc3Nfc3RyOiclcyciLCBuYW1lX3N0cik7CisJCX0gZWxzZSB7CisJCQlpZiAoYXJnID09IEFSR19kZXYpIHsKKwkJCQlpZiAoZGV2X3N0cikKKwkJCQkJZHVwYXJnKCphcmd2LCAiZGV2Iik7CisJCQkJTkVYVF9BUkcoKTsKKwkJCX0KKwkJCWRldl9zdHIgPSAqYXJndjsKKwkJCWRiZygiZGV2X3N0cjonJXMnIiwgZGV2X3N0cik7CisJCX0KKwkJYXJndisrOworCX0KKwl4cnRubF9vcGVuKCZydGgpOworCWxsX2luaXRfbWFwKCZydGgpOworCWlmICh0eXBlX3N0cikgeworCQlzdHJ1Y3QgcnRhdHRyICpsaW5raW5mbyA9IE5MTVNHX1RBSUwoJnJlcS5uKTsKKworCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgSUZMQV9MSU5LSU5GTywgTlVMTCwgMCk7CisJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBJRkxBX0lORk9fS0lORCwgdHlwZV9zdHIsCisJCQkJc3RybGVuKHR5cGVfc3RyKSk7CisKKwkJaWYgKCphcmd2KSB7CisJCQlzdHJ1Y3QgcnRhdHRyICpkYXRhID0gTkxNU0dfVEFJTCgmcmVxLm4pOworCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIElGTEFfSU5GT19EQVRBLCBOVUxMLCAwKTsKKworCQkJaWYgKHN0cmNtcCh0eXBlX3N0ciwgInZsYW4iKSA9PSAwKQorCQkJCXZsYW5fcGFyc2Vfb3B0KGFyZ3YsICZyZXEubiwgc2l6ZW9mKHJlcSkpOworCisJCQlkYXRhLT5ydGFfbGVuID0gKHZvaWQgKilOTE1TR19UQUlMKCZyZXEubikgLSAodm9pZCAqKWRhdGE7CisJCX0KKworCQlsaW5raW5mby0+cnRhX2xlbiA9ICh2b2lkICopTkxNU0dfVEFJTCgmcmVxLm4pIC0gKHZvaWQgKilsaW5raW5mbzsKKwl9CisJaWYgKHJ0bSAhPSBSVE1fTkVXTElOSykgeworCQlpZiAoIWRldl9zdHIpCisJCQlyZXR1cm4gMTsgLyogTmVlZCBhIGRldmljZSB0byBkZWxldGUgKi8KKwkJcmVxLmkuaWZpX2luZGV4ID0geGxsX25hbWVfdG9faW5kZXgoZGV2X3N0cik7CisJfSBlbHNlIHsKKwkJaWYgKCFuYW1lX3N0cikKKwkJCW5hbWVfc3RyID0gZGV2X3N0cjsKKwkJaWYgKGxpbmtfc3RyKSB7CisJCQlpbnQgaWR4ID0geGxsX25hbWVfdG9faW5kZXgobGlua19zdHIpOworCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIElGTEFfTElOSywgJmlkeCwgNCk7CisJCX0KKwkJaWYgKGFkZHJlc3Nfc3RyKSB7CisJCQl1bnNpZ25lZCBjaGFyIGFidWZbMzJdOworCQkJaW50IGxlbiA9IGxsX2FkZHJfYTJuKGFidWYsIHNpemVvZihhYnVmKSwgYWRkcmVzc19zdHIpOworCQkJZGJnKCJhZGRyZXNzIGxlbjolZCIsIGxlbik7CisJCQlpZiAobGVuIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgSUZMQV9BRERSRVNTLCBhYnVmLCBsZW4pOworCQl9CisJfQorCWlmIChuYW1lX3N0cikgeworCQljb25zdCBzaXplX3QgbmFtZV9sZW4gPSBzdHJsZW4obmFtZV9zdHIpICsgMTsKKwkJaWYgKG5hbWVfbGVuIDwgMiB8fCBuYW1lX2xlbiA+IElGTkFNU0laKQorCQkJaW52YXJnKG5hbWVfc3RyLCAibmFtZSIpOworCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgSUZMQV9JRk5BTUUsIG5hbWVfc3RyLCBuYW1lX2xlbik7CisJfQorCWlmIChydG5sX3RhbGsoJnJ0aCwgJnJlcS5uLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMKSA8IDApCisJCXJldHVybiAyOworCXJldHVybiAwOworfQorCisvKiBPdGhlciBrZXl3b3JkcyByZWNvZ25pemVkIGJ5IGlwcm91dGUyLTMuMTIuMDogKi8KKyNpZiAwCisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgImJyb2FkY2FzdCIpID09IDAgfHwKKwkJCQlzdHJjbXAoKmFyZ3YsICJicmQiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJbGVuID0gbGxfYWRkcl9hMm4oYWJ1Ziwgc2l6ZW9mKGFidWYpLCAqYXJndik7CisJCQlpZiAobGVuIDwgMCkKKwkJCQlyZXR1cm4gLTE7CisJCQlhZGRhdHRyX2woJnJlcS0+biwgc2l6ZW9mKCpyZXEpLCBJRkxBX0JST0FEQ0FTVCwgYWJ1ZiwgbGVuKTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAidHhxdWV1ZWxlbiIpID09IDAgfHwKKwkJCQlzdHJjbXAoKmFyZ3YsICJxbGVuIikgPT0gMCB8fAorCQkJCW1hdGNoZXMoKmFyZ3YsICJ0eHFsZW4iKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHFsZW4gIT0gLTEpCisJCQkJZHVwYXJnKCJ0eHF1ZXVlbGVuIiwgKmFyZ3YpOworCQkJaWYgKGdldF9pbnRlZ2VyKCZxbGVuLCAgKmFyZ3YsIDApKQorCQkJCWludmFyZygiSW52YWxpZCBcInR4cXVldWVsZW5cIiB2YWx1ZVxuIiwgKmFyZ3YpOworCQkJYWRkYXR0cl9sKCZyZXEtPm4sIHNpemVvZigqcmVxKSwgSUZMQV9UWFFMRU4sICZxbGVuLCA0KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJtdHUiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJaWYgKG10dSAhPSAtMSkKKwkJCQlkdXBhcmcoIm10dSIsICphcmd2KTsKKwkJCWlmIChnZXRfaW50ZWdlcigmbXR1LCAqYXJndiwgMCkpCisJCQkJaW52YXJnKCJJbnZhbGlkIFwibXR1XCIgdmFsdWVcbiIsICphcmd2KTsKKwkJCWFkZGF0dHJfbCgmcmVxLT5uLCBzaXplb2YoKnJlcSksIElGTEFfTVRVLCAmbXR1LCA0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm5ldG5zIikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTkVYVF9BUkcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXRucyAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVwYXJnKCJuZXRucyIsICphcmd2KTsKKwkJCWlmICgobmV0bnMgPSBnZXRfbmV0bnNfZmQoKmFyZ3YpKSA+PSAwKQorCQkJCWFkZGF0dHJfbCgmcmVxLT5uLCBzaXplb2YoKnJlcSksIElGTEFfTkVUX05TX0ZELCAmbmV0bnMsIDQpOworCQkJZWxzZSBpZiAoZ2V0X2ludGVnZXIoJm5ldG5zLCAqYXJndiwgMCkgPT0gMCkKKwkJCQlhZGRhdHRyX2woJnJlcS0+biwgc2l6ZW9mKCpyZXEpLCBJRkxBX05FVF9OU19QSUQsICZuZXRucywgNCk7CisJCQllbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFyZygiSW52YWxpZCBcIm5ldG5zXCIgdmFsdWVcbiIsICphcmd2KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJtdWx0aWNhc3QiKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJcmVxLT5pLmlmaV9jaGFuZ2UgfD0gSUZGX01VTFRJQ0FTVDsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJvbiIpID09IDApIHsKKwkJCQlyZXEtPmkuaWZpX2ZsYWdzIHw9IElGRl9NVUxUSUNBU1Q7CisJCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm9mZiIpID09IDApIHsKKwkJCQlyZXEtPmkuaWZpX2ZsYWdzICY9IH5JRkZfTVVMVElDQVNUOworCQkJfSBlbHNlCisJCQkJcmV0dXJuIG9uX29mZigibXVsdGljYXN0IiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImFsbG11bHRpY2FzdCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlyZXEtPmkuaWZpX2NoYW5nZSB8PSBJRkZfQUxMTVVMVEk7CisJCQlpZiAoc3RyY21wKCphcmd2LCAib24iKSA9PSAwKSB7CisJCQkJcmVxLT5pLmlmaV9mbGFncyB8PSBJRkZfQUxMTVVMVEk7CisJCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgIm9mZiIpID09IDApIHsKKwkJCQlyZXEtPmkuaWZpX2ZsYWdzICY9IH5JRkZfQUxMTVVMVEk7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gb25fb2ZmKCJhbGxtdWx0aWNhc3QiLCAqYXJndik7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAicHJvbWlzYyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlyZXEtPmkuaWZpX2NoYW5nZSB8PSBJRkZfUFJPTUlTQzsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJvbiIpID09IDApIHsKKwkJCQlyZXEtPmkuaWZpX2ZsYWdzIHw9IElGRl9QUk9NSVNDOworCQkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJvZmYiKSA9PSAwKSB7CisJCQkJcmVxLT5pLmlmaV9mbGFncyAmPSB+SUZGX1BST01JU0M7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gb25fb2ZmKCJwcm9taXNjIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgInRyYWlsZXJzIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXJlcS0+aS5pZmlfY2hhbmdlIHw9IElGRl9OT1RSQUlMRVJTOworCQkJaWYgKHN0cmNtcCgqYXJndiwgIm9mZiIpID09IDApIHsKKwkJCQlyZXEtPmkuaWZpX2ZsYWdzIHw9IElGRl9OT1RSQUlMRVJTOworCQkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJvbiIpID09IDApIHsKKwkJCQlyZXEtPmkuaWZpX2ZsYWdzICY9IH5JRkZfTk9UUkFJTEVSUzsKKwkJCX0gZWxzZQorCQkJCXJldHVybiBvbl9vZmYoInRyYWlsZXJzIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImFycCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlyZXEtPmkuaWZpX2NoYW5nZSB8PSBJRkZfTk9BUlA7CisJCQlpZiAoc3RyY21wKCphcmd2LCAib24iKSA9PSAwKSB7CisJCQkJcmVxLT5pLmlmaV9mbGFncyAmPSB+SUZGX05PQVJQOworCQkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJvZmYiKSA9PSAwKSB7CisJCQkJcmVxLT5pLmlmaV9mbGFncyB8PSBJRkZfTk9BUlA7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gb25fb2ZmKCJub2FycCIsICphcmd2KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJ2ZiIpID09IDApIHsKKwkJCXN0cnVjdCBydGF0dHIgKnZmbGlzdDsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZ2V0X2ludGVnZXIoJnZmLCAgKmFyZ3YsIDApKSB7CisJCQkJaW52YXJnKCJJbnZhbGlkIFwidmZcIiB2YWx1ZVxuIiwgKmFyZ3YpOworCQkJfQorCQkJdmZsaXN0ID0gYWRkYXR0cl9uZXN0KCZyZXEtPm4sIHNpemVvZigqcmVxKSwKKwkJCQkJICAgICAgSUZMQV9WRklORk9fTElTVCk7CisJCQlsZW4gPSBpcGxpbmtfcGFyc2VfdmYodmYsICZhcmdjLCAmYXJndiwgcmVxKTsKKwkJCWlmIChsZW4gPCAwKQorCQkJCXJldHVybiAtMTsKKwkJCWFkZGF0dHJfbmVzdF9lbmQoJnJlcS0+biwgdmZsaXN0KTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibWFzdGVyIikgPT0gMCkgeworCQkJaW50IGlmaW5kZXg7CisJCQlORVhUX0FSRygpOworCQkJaWZpbmRleCA9IGxsX25hbWVfdG9faW5kZXgoKmFyZ3YpOworCQkJaWYgKCFpZmluZGV4KQorCQkJCWludmFyZygiRGV2aWNlIGRvZXMgbm90IGV4aXN0XG4iLCAqYXJndik7CisJCQlhZGRhdHRyX2woJnJlcS0+biwgc2l6ZW9mKCpyZXEpLCBJRkxBX01BU1RFUiwKKwkJCQkgICZpZmluZGV4LCA0KTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAibm9tYXN0ZXIiKSA9PSAwKSB7CisJCQlpbnQgaWZpbmRleCA9IDA7CisJCQlhZGRhdHRyX2woJnJlcS0+biwgc2l6ZW9mKCpyZXEpLCBJRkxBX01BU1RFUiwKKwkJCQkgICZpZmluZGV4LCA0KTsKKwkJfSBlbHNlIGlmIChtYXRjaGVzKCphcmd2LCAiZHluYW1pYyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlyZXEtPmkuaWZpX2NoYW5nZSB8PSBJRkZfRFlOQU1JQzsKKwkJCWlmIChzdHJjbXAoKmFyZ3YsICJvbiIpID09IDApIHsKKwkJCQlyZXEtPmkuaWZpX2ZsYWdzIHw9IElGRl9EWU5BTUlDOworCQkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJvZmYiKSA9PSAwKSB7CisJCQkJcmVxLT5pLmlmaV9mbGFncyAmPSB+SUZGX0RZTkFNSUM7CisJCQl9IGVsc2UKKwkJCQlyZXR1cm4gb25fb2ZmKCJkeW5hbWljIiwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKG1hdGNoZXMoKmFyZ3YsICJhbGlhcyIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlhZGRhdHRyX2woJnJlcS0+biwgc2l6ZW9mKCpyZXEpLCBJRkxBX0lGQUxJQVMsCisJCQkJICAqYXJndiwgc3RybGVuKCphcmd2KSk7CisJCQlhcmdjLS07IGFyZ3YrKzsKKwkJCWJyZWFrOworCQl9IGVsc2UgaWYgKHN0cmNtcCgqYXJndiwgImdyb3VwIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmICgqZ3JvdXAgIT0gLTEpCisJCQkJZHVwYXJnKCJncm91cCIsICphcmd2KTsKKwkJCWlmIChydG5sX2dyb3VwX2Eybihncm91cCwgKmFyZ3YpKQorCQkJCWludmFyZygiSW52YWxpZCBcImdyb3VwXCIgdmFsdWVcbiIsICphcmd2KTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJtb2RlIikgPT0gMCkgeworCQkJaW50IG1vZGU7CisJCQlORVhUX0FSRygpOworCQkJbW9kZSA9IGdldF9saW5rX21vZGUoKmFyZ3YpOworCQkJaWYgKG1vZGUgPCAwKQorCQkJCWludmFyZygiSW52YWxpZCBsaW5rIG1vZGVcbiIsICphcmd2KTsKKwkJCWFkZGF0dHI4KCZyZXEtPm4sIHNpemVvZigqcmVxKSwgSUZMQV9MSU5LTU9ERSwgbW9kZSk7CisJCX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAic3RhdGUiKSA9PSAwKSB7CisJCQlpbnQgc3RhdGU7CisJCQlORVhUX0FSRygpOworCQkJc3RhdGUgPSBnZXRfb3BlcnN0YXRlKCphcmd2KTsKKwkJCWlmIChzdGF0ZSA8IDApCisJCQkJaW52YXJnKCJJbnZhbGlkIG9wZXJzdGF0ZVxuIiwgKmFyZ3YpOworCisJCQlhZGRhdHRyOCgmcmVxLT5uLCBzaXplb2YoKnJlcSksIElGTEFfT1BFUlNUQVRFLCBzdGF0ZSk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm51bXR4cXVldWVzIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChudW10eHF1ZXVlcyAhPSAtMSkKKwkJCQlkdXBhcmcoIm51bXR4cXVldWVzIiwgKmFyZ3YpOworCQkJaWYgKGdldF9pbnRlZ2VyKCZudW10eHF1ZXVlcywgKmFyZ3YsIDApKQorCQkJCWludmFyZygiSW52YWxpZCBcIm51bXR4cXVldWVzXCIgdmFsdWVcbiIsICphcmd2KTsKKwkJCWFkZGF0dHJfbCgmcmVxLT5uLCBzaXplb2YoKnJlcSksIElGTEFfTlVNX1RYX1FVRVVFUywKKwkJCQkgICZudW10eHF1ZXVlcywgNCk7CisJCX0gZWxzZSBpZiAobWF0Y2hlcygqYXJndiwgIm51bXJ4cXVldWVzIikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChudW1yeHF1ZXVlcyAhPSAtMSkKKwkJCQlkdXBhcmcoIm51bXJ4cXVldWVzIiwgKmFyZ3YpOworCQkJaWYgKGdldF9pbnRlZ2VyKCZudW1yeHF1ZXVlcywgKmFyZ3YsIDApKQorCQkJCWludmFyZygiSW52YWxpZCBcIm51bXJ4cXVldWVzXCIgdmFsdWVcbiIsICphcmd2KTsKKwkJCWFkZGF0dHJfbCgmcmVxLT5uLCBzaXplb2YoKnJlcSksIElGTEFfTlVNX1JYX1FVRVVFUywKKwkJCQkgICZudW1yeHF1ZXVlcywgNCk7CisJCX0KKyNlbmRpZgorCisvKiBSZXR1cm4gdmFsdWUgYmVjb21lcyBleGl0Y29kZS4gSXQncyBva2F5IHRvIG5vdCByZXR1cm4gYXQgYWxsICovCitpbnQgRkFTVF9GVU5DIGRvX2lwbGluayhjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBrZXl3b3Jkc1tdIEFMSUdOMSA9CisJCSJhZGRcMCIiZGVsZXRlXDAiInNldFwwIiJzaG93XDAiImxzdFwwIiJsaXN0XDAiOworCWlmICgqYXJndikgeworCQlpbnQga2V5ID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhrZXl3b3JkcywgKmFyZ3YpOworCQlpZiAoa2V5IDwgMCkgLyogaW52YWxpZCBhcmd1bWVudCAqLworCQkJaW52YXJnKCphcmd2LCBhcHBsZXRfbmFtZSk7CisJCWFyZ3YrKzsKKwkJaWYgKGtleSA8PSAxKSAvKiBhZGQvZGVsZXRlICovCisJCQlyZXR1cm4gZG9fYWRkX29yX2RlbGV0ZShhcmd2LCBrZXkgPyBSVE1fREVMTElOSyA6IFJUTV9ORVdMSU5LKTsKKwkJaWYgKGtleSA9PSAyKSAvKiBzZXQgKi8KKwkJCXJldHVybiBkb19zZXQoYXJndik7CisJfQorCS8qIHNob3csIGxzdCwgbGlzdCAqLworCXJldHVybiBpcGFkZHJfbGlzdF9saW5rKGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9saWJpcHJvdXRlL2lwcm91dGUuYyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcHJvdXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVjZDVmNwotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcHJvdXRlLmMKQEAgLTAsMCArMSw5NjEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQXV0aG9yczogQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqIENoYW5nZXM6CisgKgorICogUmFuaSBBc3NhZiA8cmFuaUBtYWdpYy5tZXRhd2lyZS5jb20+IDk4MDkyOTogcmVzb2x2ZSBhZGRyZXNzZXMKKyAqIEt1bmloaXJvIElzaGlndXJvIDxrdW5paGlyb0B6ZWJyYS5vcmc+IDAwMTEwMjogcnRuaF9pZmluZGV4IHdhcyBub3QgaW5pdGlhbGl6ZWQKKyAqLworCisjaW5jbHVkZSAiaXBfY29tbW9uLmgiICAvKiAjaW5jbHVkZSAibGliYmIuaCIgaXMgaW5zaWRlICovCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisjaWZuZGVmIFJUQVhfUlRUVkFSCisjZGVmaW5lIFJUQVhfUlRUVkFSIFJUQVhfSE9QUworI2VuZGlmCisKKworc3RydWN0IGZpbHRlcl90IHsKKwlpbnQgdGI7CisJc21hbGxpbnQgZmx1c2hlZDsKKwljaGFyICpmbHVzaGI7CisJaW50IGZsdXNocDsKKwlpbnQgZmx1c2hlOworCXN0cnVjdCBydG5sX2hhbmRsZSAqcnRoOworCS8vaW50IHByb3RvY29sLCBwcm90b2NvbG1hc2s7IC0gd3JpdGUtb25seSBmaWVsZHM/IQorCS8vaW50IHNjb3BlLCBzY29wZW1hc2s7IC0gdW51c2VkCisJLy9pbnQgdHlwZTsgLSByZWFkLW9ubHkKKwkvL2ludCB0eXBlbWFzazsgLSB1bnVzZWQKKwkvL2ludCB0b3MsIHRvc21hc2s7IC0gdW51c2VkCisJaW50IGlpZjsKKwlpbnQgb2lmOworCS8vaW50IHJlYWxtLCByZWFsbW1hc2s7IC0gdW51c2VkCisJLy9pbmV0X3ByZWZpeCBycHJlZnNyYzsgLSByZWFkLW9ubHkKKwlpbmV0X3ByZWZpeCBydmlhOworCWluZXRfcHJlZml4IHJkc3Q7CisJaW5ldF9wcmVmaXggbWRzdDsKKwlpbmV0X3ByZWZpeCByc3JjOworCWluZXRfcHJlZml4IG1zcmM7Cit9IEZJWF9BTElBU0lORzsKK3R5cGVkZWYgc3RydWN0IGZpbHRlcl90IGZpbHRlcl90OworCisjZGVmaW5lIEdfZmlsdGVyICgqKGZpbHRlcl90KikmYmJfY29tbW9uX2J1ZnNpejEpCisKK3N0YXRpYyBpbnQgZmx1c2hfdXBkYXRlKHZvaWQpCit7CisJaWYgKHJ0bmxfc2VuZChHX2ZpbHRlci5ydGgsIEdfZmlsdGVyLmZsdXNoYiwgR19maWx0ZXIuZmx1c2hwKSA8IDApIHsKKwkJYmJfcGVycm9yX21zZygiY2FuJ3Qgc2VuZCBmbHVzaCByZXF1ZXN0Iik7CisJCXJldHVybiAtMTsKKwl9CisJR19maWx0ZXIuZmx1c2hwID0gMDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHVuc2lnbmVkIGdldF9oeih2b2lkKQoreworCXN0YXRpYyB1bnNpZ25lZCBoel9pbnRlcm5hbDsKKwlGSUxFICpmcDsKKworCWlmIChoel9pbnRlcm5hbCkKKwkJcmV0dXJuIGh6X2ludGVybmFsOworCisJZnAgPSBmb3Blbl9mb3JfcmVhZCgiL3Byb2MvbmV0L3BzY2hlZCIpOworCWlmIChmcCkgeworCQl1bnNpZ25lZCBub20sIGRlbm9tOworCisJCWlmIChmc2NhbmYoZnAsICIlKjA4eCUqMDh4JTA4eCUwOHgiLCAmbm9tLCAmZGVub20pID09IDIpCisJCQlpZiAobm9tID09IDEwMDAwMDApCisJCQkJaHpfaW50ZXJuYWwgPSBkZW5vbTsKKwkJZmNsb3NlKGZwKTsKKwl9CisJaWYgKCFoel9pbnRlcm5hbCkKKwkJaHpfaW50ZXJuYWwgPSBiYl9jbGtfdGNrKCk7CisJcmV0dXJuIGh6X2ludGVybmFsOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBwcmludF9yb3V0ZShjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobyBVTlVTRURfUEFSQU0sCisJCXN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnIFVOVVNFRF9QQVJBTSkKK3sKKwlzdHJ1Y3QgcnRtc2cgKnIgPSBOTE1TR19EQVRBKG4pOworCWludCBsZW4gPSBuLT5ubG1zZ19sZW47CisJc3RydWN0IHJ0YXR0ciAqdGJbUlRBX01BWCsxXTsKKwljaGFyIGFidWZbMjU2XTsKKwlpbmV0X3ByZWZpeCBkc3Q7CisJaW5ldF9wcmVmaXggc3JjOworCWludCBob3N0X2xlbiA9IC0xOworCisJaWYgKG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV1JPVVRFICYmIG4tPm5sbXNnX3R5cGUgIT0gUlRNX0RFTFJPVVRFKSB7CisJCWZwcmludGYoc3RkZXJyLCAiTm90IGEgcm91dGU6ICUwOHggJTA4eCAlMDh4XG4iLAorCQkJbi0+bmxtc2dfbGVuLCBuLT5ubG1zZ190eXBlLCBuLT5ubG1zZ19mbGFncyk7CisJCXJldHVybiAwOworCX0KKwlpZiAoR19maWx0ZXIuZmx1c2hiICYmIG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV1JPVVRFKQorCQlyZXR1cm4gMDsKKwlsZW4gLT0gTkxNU0dfTEVOR1RIKHNpemVvZigqcikpOworCWlmIChsZW4gPCAwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgid3Jvbmcgbmxtc2cgbGVuICVkIiwgbGVuKTsKKworCWlmIChyLT5ydG1fZmFtaWx5ID09IEFGX0lORVQ2KQorCQlob3N0X2xlbiA9IDEyODsKKwllbHNlIGlmIChyLT5ydG1fZmFtaWx5ID09IEFGX0lORVQpCisJCWhvc3RfbGVuID0gMzI7CisKKwlpZiAoci0+cnRtX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQlpZiAoR19maWx0ZXIudGIpIHsKKwkJCWlmIChHX2ZpbHRlci50YiA8IDApIHsKKwkJCQlpZiAoIShyLT5ydG1fZmxhZ3MgJiBSVE1fRl9DTE9ORUQpKSB7CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJaWYgKHItPnJ0bV9mbGFncyAmIFJUTV9GX0NMT05FRCkgeworCQkJCQlyZXR1cm4gMDsKKwkJCQl9CisJCQkJaWYgKEdfZmlsdGVyLnRiID09IFJUX1RBQkxFX0xPQ0FMKSB7CisJCQkJCWlmIChyLT5ydG1fdHlwZSAhPSBSVE5fTE9DQUwpIHsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJfSBlbHNlIGlmIChHX2ZpbHRlci50YiA9PSBSVF9UQUJMRV9NQUlOKSB7CisJCQkJCWlmIChyLT5ydG1fdHlwZSA9PSBSVE5fTE9DQUwpIHsKKwkJCQkJCXJldHVybiAwOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJcmV0dXJuIDA7CisJCQkJfQorCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJaWYgKEdfZmlsdGVyLnRiID4gMCAmJiBHX2ZpbHRlci50YiAhPSByLT5ydG1fdGFibGUpIHsKKwkJCXJldHVybiAwOworCQl9CisJfQorCWlmIChHX2ZpbHRlci5yZHN0LmZhbWlseQorCSAmJiAoci0+cnRtX2ZhbWlseSAhPSBHX2ZpbHRlci5yZHN0LmZhbWlseSB8fCBHX2ZpbHRlci5yZHN0LmJpdGxlbiA+IHItPnJ0bV9kc3RfbGVuKQorCSkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKEdfZmlsdGVyLm1kc3QuZmFtaWx5CisJICYmIChyLT5ydG1fZmFtaWx5ICE9IEdfZmlsdGVyLm1kc3QuZmFtaWx5CisJICAgIHx8IChHX2ZpbHRlci5tZHN0LmJpdGxlbiA+PSAwICYmIEdfZmlsdGVyLm1kc3QuYml0bGVuIDwgci0+cnRtX2RzdF9sZW4pCisJICAgICkKKwkpIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChHX2ZpbHRlci5yc3JjLmZhbWlseQorCSAmJiAoci0+cnRtX2ZhbWlseSAhPSBHX2ZpbHRlci5yc3JjLmZhbWlseSB8fCBHX2ZpbHRlci5yc3JjLmJpdGxlbiA+IHItPnJ0bV9zcmNfbGVuKQorCSkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKEdfZmlsdGVyLm1zcmMuZmFtaWx5CisJICYmIChyLT5ydG1fZmFtaWx5ICE9IEdfZmlsdGVyLm1zcmMuZmFtaWx5CisJICAgIHx8IChHX2ZpbHRlci5tc3JjLmJpdGxlbiA+PSAwICYmIEdfZmlsdGVyLm1zcmMuYml0bGVuIDwgci0+cnRtX3NyY19sZW4pCisJICAgICkKKwkpIHsKKwkJcmV0dXJuIDA7CisJfQorCisJbWVtc2V0KHRiLCAwLCBzaXplb2YodGIpKTsKKwltZW1zZXQoJnNyYywgMCwgc2l6ZW9mKHNyYykpOworCW1lbXNldCgmZHN0LCAwLCBzaXplb2YoZHN0KSk7CisJcGFyc2VfcnRhdHRyKHRiLCBSVEFfTUFYLCBSVE1fUlRBKHIpLCBsZW4pOworCisJaWYgKHRiW1JUQV9TUkNdKSB7CisJCXNyYy5iaXRsZW4gPSByLT5ydG1fc3JjX2xlbjsKKwkJc3JjLmJ5dGVsZW4gPSAoci0+cnRtX2ZhbWlseSA9PSBBRl9JTkVUNiA/IDE2IDogNCk7CisJCW1lbWNweShzcmMuZGF0YSwgUlRBX0RBVEEodGJbUlRBX1NSQ10pLCBzcmMuYnl0ZWxlbik7CisJfQorCWlmICh0YltSVEFfRFNUXSkgeworCQlkc3QuYml0bGVuID0gci0+cnRtX2RzdF9sZW47CisJCWRzdC5ieXRlbGVuID0gKHItPnJ0bV9mYW1pbHkgPT0gQUZfSU5FVDYgPyAxNiA6IDQpOworCQltZW1jcHkoZHN0LmRhdGEsIFJUQV9EQVRBKHRiW1JUQV9EU1RdKSwgZHN0LmJ5dGVsZW4pOworCX0KKworCWlmIChHX2ZpbHRlci5yZHN0LmZhbWlseQorCSAmJiBpbmV0X2FkZHJfbWF0Y2goJmRzdCwgJkdfZmlsdGVyLnJkc3QsIEdfZmlsdGVyLnJkc3QuYml0bGVuKQorCSkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKEdfZmlsdGVyLm1kc3QuZmFtaWx5CisJICYmIEdfZmlsdGVyLm1kc3QuYml0bGVuID49IDAKKwkgJiYgaW5ldF9hZGRyX21hdGNoKCZkc3QsICZHX2ZpbHRlci5tZHN0LCByLT5ydG1fZHN0X2xlbikKKwkpIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChHX2ZpbHRlci5yc3JjLmZhbWlseQorCSAmJiBpbmV0X2FkZHJfbWF0Y2goJnNyYywgJkdfZmlsdGVyLnJzcmMsIEdfZmlsdGVyLnJzcmMuYml0bGVuKQorCSkgeworCQlyZXR1cm4gMDsKKwl9CisJaWYgKEdfZmlsdGVyLm1zcmMuZmFtaWx5ICYmIEdfZmlsdGVyLm1zcmMuYml0bGVuID49IDAKKwkgJiYgaW5ldF9hZGRyX21hdGNoKCZzcmMsICZHX2ZpbHRlci5tc3JjLCByLT5ydG1fc3JjX2xlbikKKwkpIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChHX2ZpbHRlci5vaWYgIT0gMCkgeworCQlpZiAoIXRiW1JUQV9PSUZdKQorCQkJcmV0dXJuIDA7CisJCWlmIChHX2ZpbHRlci5vaWYgIT0gKihpbnQqKVJUQV9EQVRBKHRiW1JUQV9PSUZdKSkKKwkJCXJldHVybiAwOworCX0KKworCWlmIChHX2ZpbHRlci5mbHVzaGIpIHsKKwkJc3RydWN0IG5sbXNnaGRyICpmbjsKKworCQkvKiBXZSBhcmUgY3JlYXRpbmcgcm91dGUgZmx1c2ggY29tbWFuZHMgKi8KKworCQlpZiAoci0+cnRtX2ZhbWlseSA9PSBBRl9JTkVUNgorCQkgJiYgci0+cnRtX2RzdF9sZW4gPT0gMAorCQkgJiYgci0+cnRtX3R5cGUgPT0gUlROX1VOUkVBQ0hBQkxFCisJCSAmJiB0YltSVEFfUFJJT1JJVFldCisJCSAmJiAqKGludCopUlRBX0RBVEEodGJbUlRBX1BSSU9SSVRZXSkgPT0gLTEKKwkJKSB7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmIChOTE1TR19BTElHTihHX2ZpbHRlci5mbHVzaHApICsgbi0+bmxtc2dfbGVuID4gR19maWx0ZXIuZmx1c2hlKSB7CisJCQlpZiAoZmx1c2hfdXBkYXRlKCkpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImZsdXNoIik7CisJCX0KKwkJZm4gPSAodm9pZCopKEdfZmlsdGVyLmZsdXNoYiArIE5MTVNHX0FMSUdOKEdfZmlsdGVyLmZsdXNocCkpOworCQltZW1jcHkoZm4sIG4sIG4tPm5sbXNnX2xlbik7CisJCWZuLT5ubG1zZ190eXBlID0gUlRNX0RFTFJPVVRFOworCQlmbi0+bmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUOworCQlmbi0+bmxtc2dfc2VxID0gKytHX2ZpbHRlci5ydGgtPnNlcTsKKwkJR19maWx0ZXIuZmx1c2hwID0gKCgoY2hhciopZm4pICsgbi0+bmxtc2dfbGVuKSAtIEdfZmlsdGVyLmZsdXNoYjsKKwkJR19maWx0ZXIuZmx1c2hlZCA9IDE7CisJCXJldHVybiAwOworCX0KKworCS8qIFdlIGFyZSBwcmludGluZyByb3V0ZXMgKi8KKworCWlmIChuLT5ubG1zZ190eXBlID09IFJUTV9ERUxST1VURSkgeworCQlwcmludGYoIkRlbGV0ZWQgIik7CisJfQorCWlmIChyLT5ydG1fdHlwZSAhPSBSVE5fVU5JQ0FTVCAvKiAmJiAhR19maWx0ZXIudHlwZSAtIGFsd2F5cyAwICovKSB7CisJCXByaW50ZigiJXMgIiwgcnRubF9ydG50eXBlX24yYShyLT5ydG1fdHlwZSkpOworCX0KKworCWlmICh0YltSVEFfRFNUXSkgeworCQlpZiAoci0+cnRtX2RzdF9sZW4gIT0gaG9zdF9sZW4pIHsKKwkJCXByaW50ZigiJXMvJXUgIiwgcnRfYWRkcl9uMmEoci0+cnRtX2ZhbWlseSwKKwkJCQkJCVJUQV9EQVRBKHRiW1JUQV9EU1RdKSwKKwkJCQkJCWFidWYsIHNpemVvZihhYnVmKSksCisJCQkJCXItPnJ0bV9kc3RfbGVuCisJCQkJCSk7CisJCX0gZWxzZSB7CisJCQlwcmludGYoIiVzICIsIGZvcm1hdF9ob3N0KHItPnJ0bV9mYW1pbHksCisJCQkJCQlSVEFfUEFZTE9BRCh0YltSVEFfRFNUXSksCisJCQkJCQlSVEFfREFUQSh0YltSVEFfRFNUXSksCisJCQkJCQlhYnVmLCBzaXplb2YoYWJ1ZikpCisJCQkJCSk7CisJCX0KKwl9IGVsc2UgaWYgKHItPnJ0bV9kc3RfbGVuKSB7CisJCXByaW50ZigiMC8lZCAiLCByLT5ydG1fZHN0X2xlbik7CisJfSBlbHNlIHsKKwkJcHJpbnRmKCJkZWZhdWx0ICIpOworCX0KKwlpZiAodGJbUlRBX1NSQ10pIHsKKwkJaWYgKHItPnJ0bV9zcmNfbGVuICE9IGhvc3RfbGVuKSB7CisJCQlwcmludGYoImZyb20gJXMvJXUgIiwgcnRfYWRkcl9uMmEoci0+cnRtX2ZhbWlseSwKKwkJCQkJCVJUQV9EQVRBKHRiW1JUQV9TUkNdKSwKKwkJCQkJCWFidWYsIHNpemVvZihhYnVmKSksCisJCQkJCXItPnJ0bV9zcmNfbGVuCisJCQkJCSk7CisJCX0gZWxzZSB7CisJCQlwcmludGYoImZyb20gJXMgIiwgZm9ybWF0X2hvc3Qoci0+cnRtX2ZhbWlseSwKKwkJCQkJCVJUQV9QQVlMT0FEKHRiW1JUQV9TUkNdKSwKKwkJCQkJCVJUQV9EQVRBKHRiW1JUQV9TUkNdKSwKKwkJCQkJCWFidWYsIHNpemVvZihhYnVmKSkKKwkJCQkJKTsKKwkJfQorCX0gZWxzZSBpZiAoci0+cnRtX3NyY19sZW4pIHsKKwkJcHJpbnRmKCJmcm9tIDAvJXUgIiwgci0+cnRtX3NyY19sZW4pOworCX0KKwlpZiAodGJbUlRBX0dBVEVXQVldICYmIEdfZmlsdGVyLnJ2aWEuYml0bGVuICE9IGhvc3RfbGVuKSB7CisJCXByaW50ZigidmlhICVzICIsIGZvcm1hdF9ob3N0KHItPnJ0bV9mYW1pbHksCisJCQkJCVJUQV9QQVlMT0FEKHRiW1JUQV9HQVRFV0FZXSksCisJCQkJCVJUQV9EQVRBKHRiW1JUQV9HQVRFV0FZXSksCisJCQkJCWFidWYsIHNpemVvZihhYnVmKSkpOworCX0KKwlpZiAodGJbUlRBX09JRl0pIHsKKwkJcHJpbnRmKCJkZXYgJXMgIiwgbGxfaW5kZXhfdG9fbmFtZSgqKGludCopUlRBX0RBVEEodGJbUlRBX09JRl0pKSk7CisJfQorCisJLyogVG9kbzogcGFyc2UgJiBzaG93ICJwcm90byBrZXJuZWwiLCAic2NvcGUgbGluayIgaGVyZSAqLworCisJaWYgKHRiW1JUQV9QUkVGU1JDXSAmJiAvKkdfZmlsdGVyLnJwcmVmc3JjLmJpdGxlbiAtIGFsd2F5cyAwKi8gMCAhPSBob3N0X2xlbikgeworCQkvKiBEbyBub3QgdXNlIGZvcm1hdF9ob3N0KCkuIEl0IGlzIG91ciBsb2NhbCBhZGRyCisJCSAgIGFuZCBzeW1ib2xpYyBuYW1lIHdpbGwgbm90IGJlIHVzZWZ1bC4KKwkJICovCisJCXByaW50ZigiIHNyYyAlcyAiLCBydF9hZGRyX24yYShyLT5ydG1fZmFtaWx5LAorCQkJCQlSVEFfREFUQSh0YltSVEFfUFJFRlNSQ10pLAorCQkJCQlhYnVmLCBzaXplb2YoYWJ1ZikpKTsKKwl9CisJaWYgKHRiW1JUQV9QUklPUklUWV0pIHsKKwkJcHJpbnRmKCIgbWV0cmljICVkICIsICoodWludDMyX3QqKVJUQV9EQVRBKHRiW1JUQV9QUklPUklUWV0pKTsKKwl9CisJaWYgKHItPnJ0bV9mbGFncyAmIFJUTkhfRl9ERUFEKSB7CisJCXByaW50ZigiZGVhZCAiKTsKKwl9CisJaWYgKHItPnJ0bV9mbGFncyAmIFJUTkhfRl9PTkxJTkspIHsKKwkJcHJpbnRmKCJvbmxpbmsgIik7CisJfQorCWlmIChyLT5ydG1fZmxhZ3MgJiBSVE5IX0ZfUEVSVkFTSVZFKSB7CisJCXByaW50ZigicGVydmFzaXZlICIpOworCX0KKwlpZiAoci0+cnRtX2ZsYWdzICYgUlRNX0ZfTk9USUZZKSB7CisJCXByaW50Zigibm90aWZ5ICIpOworCX0KKworCWlmIChyLT5ydG1fZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCXN0cnVjdCBydGFfY2FjaGVpbmZvICpjaSA9IE5VTEw7CisJCWlmICh0YltSVEFfQ0FDSEVJTkZPXSkgeworCQkJY2kgPSBSVEFfREFUQSh0YltSVEFfQ0FDSEVJTkZPXSk7CisJCX0KKwkJaWYgKChyLT5ydG1fZmxhZ3MgJiBSVE1fRl9DTE9ORUQpIHx8IChjaSAmJiBjaS0+cnRhX2V4cGlyZXMpKSB7CisJCQlpZiAoci0+cnRtX2ZsYWdzICYgUlRNX0ZfQ0xPTkVEKSB7CisJCQkJcHJpbnRmKCIlYyAgICBjYWNoZSAiLCBfU0xfKTsKKwkJCX0KKwkJCWlmIChjaS0+cnRhX2V4cGlyZXMpIHsKKwkJCQlwcmludGYoIiBleHBpcmVzICVkc2VjIiwgY2ktPnJ0YV9leHBpcmVzIC8gZ2V0X2h6KCkpOworCQkJfQorCQkJaWYgKGNpLT5ydGFfZXJyb3IgIT0gMCkgeworCQkJCXByaW50ZigiIGVycm9yICVkIiwgY2ktPnJ0YV9lcnJvcik7CisJCQl9CisJCX0gZWxzZSBpZiAoY2kpIHsKKwkJCWlmIChjaS0+cnRhX2Vycm9yICE9IDApCisJCQkJcHJpbnRmKCIgZXJyb3IgJWQiLCBjaS0+cnRhX2Vycm9yKTsKKwkJfQorCX0KKwlpZiAodGJbUlRBX0lJRl0gJiYgR19maWx0ZXIuaWlmID09IDApIHsKKwkJcHJpbnRmKCIgaWlmICVzIiwgbGxfaW5kZXhfdG9fbmFtZSgqKGludCopUlRBX0RBVEEodGJbUlRBX0lJRl0pKSk7CisJfQorCWJiX3B1dGNoYXIoJ1xuJyk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiB2YWx1ZSBiZWNvbWVzIGV4aXRjb2RlLiBJdCdzIG9rYXkgdG8gbm90IHJldHVybiBhdCBhbGwgKi8KK3N0YXRpYyBpbnQgaXByb3V0ZV9tb2RpZnkoaW50IGNtZCwgdW5zaWduZWQgZmxhZ3MsIGNoYXIgKiphcmd2KQoreworCXN0YXRpYyBjb25zdCBjaGFyIGtleXdvcmRzW10gQUxJR04xID0KKwkJInNyY1wwIiJ2aWFcMCIibXR1XDAiImxvY2tcMCIicHJvdG9jb2xcMCJJRl9GRUFUVVJFX0lQX1JVTEUoInRhYmxlXDAiKQorCQkiZGV2XDAiIm9pZlwwIiJ0b1wwIiJtZXRyaWNcMCIib25saW5rXDAiOworCWVudW0geworCQlBUkdfc3JjLAorCQlBUkdfdmlhLAorCQlBUkdfbXR1LCBQQVJNX2xvY2ssCisJCUFSR19wcm90b2NvbCwKK0lGX0ZFQVRVUkVfSVBfUlVMRShBUkdfdGFibGUsKQorCQlBUkdfZGV2LAorCQlBUkdfb2lmLAorCQlBUkdfdG8sCisJCUFSR19tZXRyaWMsCisJCUFSR19vbmxpbmssCisJfTsKKwllbnVtIHsKKwkJZ3dfb2sgPSAxIDw8IDAsCisJCWRzdF9vayA9IDEgPDwgMSwKKwkJcHJvdG9fb2sgPSAxIDw8IDIsCisJCXR5cGVfb2sgPSAxIDw8IDMKKwl9OworCXN0cnVjdCBydG5sX2hhbmRsZSBydGg7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyIG47CisJCXN0cnVjdCBydG1zZyAgICByOworCQljaGFyICAgICAgICAgICAgYnVmWzEwMjRdOworCX0gcmVxOworCWNoYXIgbXhidWZbMjU2XTsKKwlzdHJ1Y3QgcnRhdHRyICogbXhydGEgPSAodm9pZCopbXhidWY7CisJdW5zaWduZWQgbXhsb2NrID0gMDsKKwljaGFyICpkID0gTlVMTDsKKwlzbWFsbHVpbnQgb2sgPSAwOworCWludCBhcmc7CisKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCisJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgcnRtc2cpKTsKKwlyZXEubi5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1QgfCBmbGFnczsKKwlyZXEubi5ubG1zZ190eXBlID0gY21kOworCXJlcS5yLnJ0bV9mYW1pbHkgPSBwcmVmZXJyZWRfZmFtaWx5OworCWlmIChSVF9UQUJMRV9NQUlOKSAvKiBpZiBpdCBpcyB6ZXJvLCBtZW1zZXQgYWxyZWFkeSBkaWQgaXQgKi8KKwkJcmVxLnIucnRtX3RhYmxlID0gUlRfVEFCTEVfTUFJTjsKKwlpZiAoUlRfU0NPUEVfTk9XSEVSRSkKKwkJcmVxLnIucnRtX3Njb3BlID0gUlRfU0NPUEVfTk9XSEVSRTsKKworCWlmIChjbWQgIT0gUlRNX0RFTFJPVVRFKSB7CisJCXJlcS5yLnJ0bV9wcm90b2NvbCA9IFJUUFJPVF9CT09UOworCQlyZXEuci5ydG1fc2NvcGUgPSBSVF9TQ09QRV9VTklWRVJTRTsKKwkJcmVxLnIucnRtX3R5cGUgPSBSVE5fVU5JQ0FTVDsKKwl9CisKKwlteHJ0YS0+cnRhX3R5cGUgPSBSVEFfTUVUUklDUzsKKwlteHJ0YS0+cnRhX2xlbiA9IFJUQV9MRU5HVEgoMCk7CisKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJYXJnID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhrZXl3b3JkcywgKmFyZ3YpOworCQlpZiAoYXJnID09IEFSR19zcmMpIHsKKwkJCWluZXRfcHJlZml4IGFkZHI7CisJCQlORVhUX0FSRygpOworCQkJZ2V0X2FkZHIoJmFkZHIsICphcmd2LCByZXEuci5ydG1fZmFtaWx5KTsKKwkJCWlmIChyZXEuci5ydG1fZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJCQlyZXEuci5ydG1fZmFtaWx5ID0gYWRkci5mYW1pbHk7CisJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX1BSRUZTUkMsICZhZGRyLmRhdGEsIGFkZHIuYnl0ZWxlbik7CisJCX0gZWxzZSBpZiAoYXJnID09IEFSR192aWEpIHsKKwkJCWluZXRfcHJlZml4IGFkZHI7CisJCQlvayB8PSBnd19vazsKKwkJCU5FWFRfQVJHKCk7CisJCQlnZXRfYWRkcigmYWRkciwgKmFyZ3YsIHJlcS5yLnJ0bV9mYW1pbHkpOworCQkJaWYgKHJlcS5yLnJ0bV9mYW1pbHkgPT0gQUZfVU5TUEVDKSB7CisJCQkJcmVxLnIucnRtX2ZhbWlseSA9IGFkZHIuZmFtaWx5OworCQkJfQorCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9HQVRFV0FZLCAmYWRkci5kYXRhLCBhZGRyLmJ5dGVsZW4pOworCQl9IGVsc2UgaWYgKGFyZyA9PSBBUkdfbXR1KSB7CisJCQl1bnNpZ25lZCBtdHU7CisJCQlORVhUX0FSRygpOworCQkJaWYgKGluZGV4X2luX3N0cmluZ3Moa2V5d29yZHMsICphcmd2KSA9PSBQQVJNX2xvY2spIHsKKwkJCQlteGxvY2sgfD0gKDEgPDwgUlRBWF9NVFUpOworCQkJCU5FWFRfQVJHKCk7CisJCQl9CisJCQltdHUgPSBnZXRfdW5zaWduZWQoKmFyZ3YsICJtdHUiKTsKKwkJCXJ0YV9hZGRhdHRyMzIobXhydGEsIHNpemVvZihteGJ1ZiksIFJUQVhfTVRVLCBtdHUpOworCQl9IGVsc2UgaWYgKGFyZyA9PSBBUkdfcHJvdG9jb2wpIHsKKwkJCXVpbnQzMl90IHByb3Q7CisJCQlORVhUX0FSRygpOworCQkJaWYgKHJ0bmxfcnRwcm90X2EybigmcHJvdCwgKmFyZ3YpKQorCQkJCWludmFyZygqYXJndiwgInByb3RvY29sIik7CisJCQlyZXEuci5ydG1fcHJvdG9jb2wgPSBwcm90OworCQkJb2sgfD0gcHJvdG9fb2s7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBfUlVMRQorCQl9IGVsc2UgaWYgKGFyZyA9PSBBUkdfdGFibGUpIHsKKwkJCXVpbnQzMl90IHRpZDsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocnRubF9ydHRhYmxlX2EybigmdGlkLCAqYXJndikpCisJCQkJaW52YXJnKCphcmd2LCAidGFibGUiKTsKKwkJCXJlcS5yLnJ0bV90YWJsZSA9IHRpZDsKKyNlbmRpZgorCQl9IGVsc2UgaWYgKGFyZyA9PSBBUkdfZGV2IHx8IGFyZyA9PSBBUkdfb2lmKSB7CisJCQlORVhUX0FSRygpOworCQkJZCA9ICphcmd2OworCQl9IGVsc2UgaWYgKGFyZyA9PSBBUkdfbWV0cmljKSB7CisJCQl1aW50MzJfdCBtZXRyaWM7CisJCQlORVhUX0FSRygpOworCQkJbWV0cmljID0gZ2V0X3UzMigqYXJndiwgIm1ldHJpYyIpOworCQkJYWRkYXR0cjMyKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9QUklPUklUWSwgbWV0cmljKTsKKwkJfSBlbHNlIGlmIChhcmcgPT0gQVJHX29ubGluaykgeworCQkJcmVxLnIucnRtX2ZsYWdzIHw9IFJUTkhfRl9PTkxJTks7CisJCX0gZWxzZSB7CisJCQlpbnQgdHlwZTsKKwkJCWluZXRfcHJlZml4IGRzdDsKKworCQkJaWYgKGFyZyA9PSBBUkdfdG8pIHsKKwkJCQlORVhUX0FSRygpOworCQkJfQorCQkJaWYgKCgqKmFyZ3YgPCAnMCcgfHwgKiphcmd2ID4gJzknKQorCQkJICYmIHJ0bmxfcnRudHlwZV9hMm4oJnR5cGUsICphcmd2KSA9PSAwCisJCQkpIHsKKwkJCQlORVhUX0FSRygpOworCQkJCXJlcS5yLnJ0bV90eXBlID0gdHlwZTsKKwkJCQlvayB8PSB0eXBlX29rOworCQkJfQorCisJCQlpZiAob2sgJiBkc3Rfb2spIHsKKwkJCQlkdXBhcmcyKCJ0byIsICphcmd2KTsKKwkJCX0KKwkJCWdldF9wcmVmaXgoJmRzdCwgKmFyZ3YsIHJlcS5yLnJ0bV9mYW1pbHkpOworCQkJaWYgKHJlcS5yLnJ0bV9mYW1pbHkgPT0gQUZfVU5TUEVDKSB7CisJCQkJcmVxLnIucnRtX2ZhbWlseSA9IGRzdC5mYW1pbHk7CisJCQl9CisJCQlyZXEuci5ydG1fZHN0X2xlbiA9IGRzdC5iaXRsZW47CisJCQlvayB8PSBkc3Rfb2s7CisJCQlpZiAoZHN0LmJ5dGVsZW4pIHsKKwkJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX0RTVCwgJmRzdC5kYXRhLCBkc3QuYnl0ZWxlbik7CisJCQl9CisJCX0KKwkJYXJndisrOworCX0KKworCXhydG5sX29wZW4oJnJ0aCk7CisKKwlpZiAoZCkgIHsKKwkJaW50IGlkeDsKKworCQlsbF9pbml0X21hcCgmcnRoKTsKKworCQlpZiAoZCkgeworCQkJaWR4ID0geGxsX25hbWVfdG9faW5kZXgoZCk7CisJCQlhZGRhdHRyMzIoJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX09JRiwgaWR4KTsKKwkJfQorCX0KKworCWlmIChteHJ0YS0+cnRhX2xlbiA+IFJUQV9MRU5HVEgoMCkpIHsKKwkJaWYgKG14bG9jaykgeworCQkJcnRhX2FkZGF0dHIzMihteHJ0YSwgc2l6ZW9mKG14YnVmKSwgUlRBWF9MT0NLLCBteGxvY2spOworCQl9CisJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBSVEFfTUVUUklDUywgUlRBX0RBVEEobXhydGEpLCBSVEFfUEFZTE9BRChteHJ0YSkpOworCX0KKworCWlmIChyZXEuci5ydG1fdHlwZSA9PSBSVE5fTE9DQUwgfHwgcmVxLnIucnRtX3R5cGUgPT0gUlROX05BVCkKKwkJcmVxLnIucnRtX3Njb3BlID0gUlRfU0NPUEVfSE9TVDsKKwllbHNlCisJaWYgKHJlcS5yLnJ0bV90eXBlID09IFJUTl9CUk9BRENBU1QKKwkgfHwgcmVxLnIucnRtX3R5cGUgPT0gUlROX01VTFRJQ0FTVAorCSB8fCByZXEuci5ydG1fdHlwZSA9PSBSVE5fQU5ZQ0FTVAorCSkgeworCQlyZXEuci5ydG1fc2NvcGUgPSBSVF9TQ09QRV9MSU5LOworCX0KKwllbHNlIGlmIChyZXEuci5ydG1fdHlwZSA9PSBSVE5fVU5JQ0FTVCB8fCByZXEuci5ydG1fdHlwZSA9PSBSVE5fVU5TUEVDKSB7CisJCWlmIChjbWQgPT0gUlRNX0RFTFJPVVRFKQorCQkJcmVxLnIucnRtX3Njb3BlID0gUlRfU0NPUEVfTk9XSEVSRTsKKwkJZWxzZSBpZiAoIShvayAmIGd3X29rKSkKKwkJCXJlcS5yLnJ0bV9zY29wZSA9IFJUX1NDT1BFX0xJTks7CisJfQorCisJaWYgKHJlcS5yLnJ0bV9mYW1pbHkgPT0gQUZfVU5TUEVDKSB7CisJCXJlcS5yLnJ0bV9mYW1pbHkgPSBBRl9JTkVUOworCX0KKworCWlmIChydG5sX3RhbGsoJnJ0aCwgJnJlcS5uLCAwLCAwLCBOVUxMLCBOVUxMLCBOVUxMKSA8IDApIHsKKwkJcmV0dXJuIDI7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnRubF9ydGNhY2hlX3JlcXVlc3Qoc3RydWN0IHJ0bmxfaGFuZGxlICpydGgsIGludCBmYW1pbHkpCit7CisJc3RydWN0IHsKKwkJc3RydWN0IG5sbXNnaGRyIG5saDsKKwkJc3RydWN0IHJ0bXNnIHJ0bTsKKwl9IHJlcTsKKwlzdHJ1Y3Qgc29ja2FkZHJfbmwgbmxhZGRyOworCisJbWVtc2V0KCZubGFkZHIsIDAsIHNpemVvZihubGFkZHIpKTsKKwltZW1zZXQoJnJlcSwgMCwgc2l6ZW9mKHJlcSkpOworCW5sYWRkci5ubF9mYW1pbHkgPSBBRl9ORVRMSU5LOworCisJcmVxLm5saC5ubG1zZ19sZW4gPSBzaXplb2YocmVxKTsKKwlpZiAoUlRNX0dFVFJPVVRFKQorCQlyZXEubmxoLm5sbXNnX3R5cGUgPSBSVE1fR0VUUk9VVEU7CisJaWYgKE5MTV9GX1JPT1QgfCBOTE1fRl9SRVFVRVNUKQorCQlyZXEubmxoLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUk9PVCB8IE5MTV9GX1JFUVVFU1Q7CisJLypyZXEubmxoLm5sbXNnX3BpZCA9IDA7IC0gbWVtc2V0IGRpZCBpdCBhbHJlYWR5ICovCisJcmVxLm5saC5ubG1zZ19zZXEgPSBydGgtPmR1bXAgPSArK3J0aC0+c2VxOworCXJlcS5ydG0ucnRtX2ZhbWlseSA9IGZhbWlseTsKKwlpZiAoUlRNX0ZfQ0xPTkVEKQorCQlyZXEucnRtLnJ0bV9mbGFncyA9IFJUTV9GX0NMT05FRDsKKworCXJldHVybiB4c2VuZHRvKHJ0aC0+ZmQsICh2b2lkKikmcmVxLCBzaXplb2YocmVxKSwgKHN0cnVjdCBzb2NrYWRkciopJm5sYWRkciwgc2l6ZW9mKG5sYWRkcikpOworfQorCitzdGF0aWMgdm9pZCBpcHJvdXRlX2ZsdXNoX2NhY2hlKHZvaWQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgZm5bXSBBTElHTjEgPSAiL3Byb2Mvc3lzL25ldC9pcHY0L3JvdXRlL2ZsdXNoIjsKKwlpbnQgZmx1c2hfZmQgPSBvcGVuX29yX3dhcm4oZm4sIE9fV1JPTkxZKTsKKworCWlmIChmbHVzaF9mZCA8IDApIHsKKwkJcmV0dXJuOworCX0KKworCWlmICh3cml0ZShmbHVzaF9mZCwgIi0xIiwgMikgPCAyKSB7CisJCWJiX3BlcnJvcl9tc2coImNhbid0IGZsdXNoIHJvdXRpbmcgY2FjaGUiKTsKKwkJcmV0dXJuOworCX0KKwljbG9zZShmbHVzaF9mZCk7Cit9CisKK3N0YXRpYyB2b2lkIGlwcm91dGVfcmVzZXRfZmlsdGVyKHZvaWQpCit7CisJbWVtc2V0KCZHX2ZpbHRlciwgMCwgc2l6ZW9mKEdfZmlsdGVyKSk7CisJR19maWx0ZXIubWRzdC5iaXRsZW4gPSAtMTsKKwlHX2ZpbHRlci5tc3JjLmJpdGxlbiA9IC0xOworfQorCisvKiBSZXR1cm4gdmFsdWUgYmVjb21lcyBleGl0Y29kZS4gSXQncyBva2F5IHRvIG5vdCByZXR1cm4gYXQgYWxsICovCitzdGF0aWMgaW50IGlwcm91dGVfbGlzdF9vcl9mbHVzaChjaGFyICoqYXJndiwgaW50IGZsdXNoKQoreworCWludCBkb19pcHY2ID0gcHJlZmVycmVkX2ZhbWlseTsKKwlzdHJ1Y3QgcnRubF9oYW5kbGUgcnRoOworCWNoYXIgKmlkID0gTlVMTDsKKwljaGFyICpvZCA9IE5VTEw7CisJc3RhdGljIGNvbnN0IGNoYXIga2V5d29yZHNbXSBBTElHTjEgPQorCQkvKiAiaXAgcm91dGUgbGlzdC9mbHVzaCIgcGFyYW1ldGVyczogKi8KKwkJInByb3RvY29sXDAiICJkZXZcMCIgICAib2lmXDAiICAgImlpZlwwIgorCQkidmlhXDAiICAgICAgInRhYmxlXDAiICJjYWNoZVwwIgorCQkiZnJvbVwwIiAgICAgInRvXDAiCisJCS8qIGFuZCBwb3NzaWJsZSBmdXJ0aGVyIGtleXdvcmRzICovCisJCSJhbGxcMCIKKwkJInJvb3RcMCIKKwkJIm1hdGNoXDAiCisJCSJleGFjdFwwIgorCQkibWFpblwwIgorCQk7CisJZW51bSB7CisJCUtXX3Byb3RvLCBLV19kZXYsICAgS1dfb2lmLCAgS1dfaWlmLAorCQlLV192aWEsICAgS1dfdGFibGUsIEtXX2NhY2hlLAorCQlLV19mcm9tLCAgS1dfdG8sCisJCS8qICovCisJCUtXX2FsbCwKKwkJS1dfcm9vdCwKKwkJS1dfbWF0Y2gsCisJCUtXX2V4YWN0LAorCQlLV19tYWluLAorCX07CisJaW50IGFyZywgcGFybTsKKworCWlwcm91dGVfcmVzZXRfZmlsdGVyKCk7CisJR19maWx0ZXIudGIgPSBSVF9UQUJMRV9NQUlOOworCisJaWYgKGZsdXNoICYmICEqYXJndikKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3JlcXVpcmVzX2FyZywgIlwiaXAgcm91dGUgZmx1c2hcIiIpOworCisJd2hpbGUgKCphcmd2KSB7CisJCWFyZyA9IGluZGV4X2luX3N1YnN0cmluZ3Moa2V5d29yZHMsICphcmd2KTsKKwkJaWYgKGFyZyA9PSBLV19wcm90bykgeworCQkJdWludDMyX3QgcHJvdCA9IDA7CisJCQlORVhUX0FSRygpOworCQkJLy9HX2ZpbHRlci5wcm90b2NvbG1hc2sgPSAtMTsKKwkJCWlmIChydG5sX3J0cHJvdF9hMm4oJnByb3QsICphcmd2KSkgeworCQkJCWlmIChpbmRleF9pbl9zdHJpbmdzKGtleXdvcmRzLCAqYXJndikgIT0gS1dfYWxsKQorCQkJCQlpbnZhcmcoKmFyZ3YsICJwcm90b2NvbCIpOworCQkJCXByb3QgPSAwOworCQkJCS8vR19maWx0ZXIucHJvdG9jb2xtYXNrID0gMDsKKwkJCX0KKwkJCS8vR19maWx0ZXIucHJvdG9jb2wgPSBwcm90OworCQl9IGVsc2UgaWYgKGFyZyA9PSBLV19kZXYgfHwgYXJnID09IEtXX29pZikgeworCQkJTkVYVF9BUkcoKTsKKwkJCW9kID0gKmFyZ3Y7CisJCX0gZWxzZSBpZiAoYXJnID09IEtXX2lpZikgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlkID0gKmFyZ3Y7CisJCX0gZWxzZSBpZiAoYXJnID09IEtXX3ZpYSkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWdldF9wcmVmaXgoJkdfZmlsdGVyLnJ2aWEsICphcmd2LCBkb19pcHY2KTsKKwkJfSBlbHNlIGlmIChhcmcgPT0gS1dfdGFibGUpIHsgLyogdGFibGUgYWxsL2NhY2hlL21haW4gKi8KKwkJCU5FWFRfQVJHKCk7CisJCQlwYXJtID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhrZXl3b3JkcywgKmFyZ3YpOworCQkJaWYgKHBhcm0gPT0gS1dfY2FjaGUpCisJCQkJR19maWx0ZXIudGIgPSAtMTsKKwkJCWVsc2UgaWYgKHBhcm0gPT0gS1dfYWxsKQorCQkJCUdfZmlsdGVyLnRiID0gMDsKKwkJCWVsc2UgaWYgKHBhcm0gIT0gS1dfbWFpbikgeworI2lmIEVOQUJMRV9GRUFUVVJFX0lQX1JVTEUKKwkJCQl1aW50MzJfdCB0aWQ7CisJCQkJaWYgKHJ0bmxfcnR0YWJsZV9hMm4oJnRpZCwgKmFyZ3YpKQorCQkJCQlpbnZhcmcoKmFyZ3YsICJ0YWJsZSIpOworCQkJCUdfZmlsdGVyLnRiID0gdGlkOworI2Vsc2UKKwkJCQlpbnZhcmcoKmFyZ3YsICJ0YWJsZSIpOworI2VuZGlmCisJCQl9CisJCX0gZWxzZSBpZiAoYXJnID09IEtXX2NhY2hlKSB7CisJCQkvKiBUaGUgY29tbWFuZCAnaXAgcm91dGUgZmx1c2ggY2FjaGUnIGlzIHVzZWQgYnkgT3BlblNXQU4uCisJCQkgKiBBc3N1bWluZyBpdCdzIGEgc3lub255bSBmb3IgJ2lwIHJvdXRlIGZsdXNoIHRhYmxlIGNhY2hlJyAqLworCQkJR19maWx0ZXIudGIgPSAtMTsKKwkJfSBlbHNlIGlmIChhcmcgPT0gS1dfZnJvbSkgeworCQkJTkVYVF9BUkcoKTsKKwkJCXBhcm0gPSBpbmRleF9pbl9zdWJzdHJpbmdzKGtleXdvcmRzLCAqYXJndik7CisJCQlpZiAocGFybSA9PSBLV19yb290KSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlnZXRfcHJlZml4KCZHX2ZpbHRlci5yc3JjLCAqYXJndiwgZG9faXB2Nik7CisJCQl9IGVsc2UgaWYgKHBhcm0gPT0gS1dfbWF0Y2gpIHsKKwkJCQlORVhUX0FSRygpOworCQkJCWdldF9wcmVmaXgoJkdfZmlsdGVyLm1zcmMsICphcmd2LCBkb19pcHY2KTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHBhcm0gPT0gS1dfZXhhY3QpCisJCQkJCU5FWFRfQVJHKCk7CisJCQkJZ2V0X3ByZWZpeCgmR19maWx0ZXIubXNyYywgKmFyZ3YsIGRvX2lwdjYpOworCQkJCUdfZmlsdGVyLnJzcmMgPSBHX2ZpbHRlci5tc3JjOworCQkJfQorCQl9IGVsc2UgeyAvKiAidG8iIGlzIHRoZSBkZWZhdWx0IHBhcmFtZXRlciAqLworCQkJaWYgKGFyZyA9PSBLV190bykgeworCQkJCU5FWFRfQVJHKCk7CisJCQkJYXJnID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhrZXl3b3JkcywgKmFyZ3YpOworCQkJfQorCQkJLyogcGFybSA9IGFyZzsgLSB3b3VsZCBiZSBtb3JlIHBsYXVzaWJsZSwgYnV0IHdlIHJldXNlICdhcmcnIGhlcmUgKi8KKwkJCWlmIChhcmcgPT0gS1dfcm9vdCkgeworCQkJCU5FWFRfQVJHKCk7CisJCQkJZ2V0X3ByZWZpeCgmR19maWx0ZXIucmRzdCwgKmFyZ3YsIGRvX2lwdjYpOworCQkJfSBlbHNlIGlmIChhcmcgPT0gS1dfbWF0Y2gpIHsKKwkJCQlORVhUX0FSRygpOworCQkJCWdldF9wcmVmaXgoJkdfZmlsdGVyLm1kc3QsICphcmd2LCBkb19pcHY2KTsKKwkJCX0gZWxzZSB7IC8qICJ0byBleGFjdCIgaXMgdGhlIGRlZmF1bHQgKi8KKwkJCQlpZiAoYXJnID09IEtXX2V4YWN0KQorCQkJCQlORVhUX0FSRygpOworCQkJCWdldF9wcmVmaXgoJkdfZmlsdGVyLm1kc3QsICphcmd2LCBkb19pcHY2KTsKKwkJCQlHX2ZpbHRlci5yZHN0ID0gR19maWx0ZXIubWRzdDsKKwkJCX0KKwkJfQorCQlhcmd2Kys7CisJfQorCisJaWYgKGRvX2lwdjYgPT0gQUZfVU5TUEVDICYmIEdfZmlsdGVyLnRiKSB7CisJCWRvX2lwdjYgPSBBRl9JTkVUOworCX0KKworCXhydG5sX29wZW4oJnJ0aCk7CisJbGxfaW5pdF9tYXAoJnJ0aCk7CisKKwlpZiAoaWQgfHwgb2QpICB7CisJCWludCBpZHg7CisKKwkJaWYgKGlkKSB7CisJCQlpZHggPSB4bGxfbmFtZV90b19pbmRleChpZCk7CisJCQlHX2ZpbHRlci5paWYgPSBpZHg7CisJCX0KKwkJaWYgKG9kKSB7CisJCQlpZHggPSB4bGxfbmFtZV90b19pbmRleChvZCk7CisJCQlHX2ZpbHRlci5vaWYgPSBpZHg7CisJCX0KKwl9CisKKwlpZiAoZmx1c2gpIHsKKwkJY2hhciBmbHVzaGJbNDA5Ni01MTJdOworCisJCWlmIChHX2ZpbHRlci50YiA9PSAtMSkgeyAvKiAiZmx1c2ggdGFibGUgY2FjaGUiICovCisJCQlpZiAoZG9faXB2NiAhPSBBRl9JTkVUNikKKwkJCQlpcHJvdXRlX2ZsdXNoX2NhY2hlKCk7CisJCQlpZiAoZG9faXB2NiA9PSBBRl9JTkVUKQorCQkJCXJldHVybiAwOworCQl9CisKKwkJR19maWx0ZXIuZmx1c2hiID0gZmx1c2hiOworCQlHX2ZpbHRlci5mbHVzaHAgPSAwOworCQlHX2ZpbHRlci5mbHVzaGUgPSBzaXplb2YoZmx1c2hiKTsKKwkJR19maWx0ZXIucnRoID0gJnJ0aDsKKworCQlmb3IgKDs7KSB7CisJCQl4cnRubF93aWxkZHVtcF9yZXF1ZXN0KCZydGgsIGRvX2lwdjYsIFJUTV9HRVRST1VURSk7CisJCQlHX2ZpbHRlci5mbHVzaGVkID0gMDsKKwkJCXhydG5sX2R1bXBfZmlsdGVyKCZydGgsIHByaW50X3JvdXRlLCBOVUxMKTsKKwkJCWlmIChHX2ZpbHRlci5mbHVzaGVkID09IDApCisJCQkJcmV0dXJuIDA7CisJCQlpZiAoZmx1c2hfdXBkYXRlKCkpCisJCQkJcmV0dXJuIDE7CisJCX0KKwl9CisKKwlpZiAoR19maWx0ZXIudGIgIT0gLTEpIHsKKwkJeHJ0bmxfd2lsZGR1bXBfcmVxdWVzdCgmcnRoLCBkb19pcHY2LCBSVE1fR0VUUk9VVEUpOworCX0gZWxzZSBpZiAocnRubF9ydGNhY2hlX3JlcXVlc3QoJnJ0aCwgZG9faXB2NikgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc2VuZCBkdW1wIHJlcXVlc3QiKTsKKwl9CisJeHJ0bmxfZHVtcF9maWx0ZXIoJnJ0aCwgcHJpbnRfcm91dGUsIE5VTEwpOworCisJcmV0dXJuIDA7Cit9CisKKworLyogUmV0dXJuIHZhbHVlIGJlY29tZXMgZXhpdGNvZGUuIEl0J3Mgb2theSB0byBub3QgcmV0dXJuIGF0IGFsbCAqLworc3RhdGljIGludCBpcHJvdXRlX2dldChjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgcnRubF9oYW5kbGUgcnRoOworCXN0cnVjdCB7CisJCXN0cnVjdCBubG1zZ2hkciBuOworCQlzdHJ1Y3QgcnRtc2cgICAgcjsKKwkJY2hhciAgICAgICAgICAgIGJ1ZlsxMDI0XTsKKwl9IHJlcTsKKwljaGFyICppZGV2ID0gTlVMTDsKKwljaGFyICpvZGV2ID0gTlVMTDsKKwlib29sIGNvbm5lY3RlZCA9IDA7CisJYm9vbCBmcm9tX29rID0gMDsKKwlzdGF0aWMgY29uc3QgY2hhciBvcHRpb25zW10gQUxJR04xID0KKwkJImZyb21cMCIiaWlmXDAiIm9pZlwwIiJkZXZcMCIibm90aWZ5XDAiImNvbm5lY3RlZFwwIiJ0b1wwIjsKKworCW1lbXNldCgmcmVxLCAwLCBzaXplb2YocmVxKSk7CisKKwlpcHJvdXRlX3Jlc2V0X2ZpbHRlcigpOworCisJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgcnRtc2cpKTsKKwlpZiAoTkxNX0ZfUkVRVUVTVCkKKwkJcmVxLm4ubmxtc2dfZmxhZ3MgPSBOTE1fRl9SRVFVRVNUOworCWlmIChSVE1fR0VUUk9VVEUpCisJCXJlcS5uLm5sbXNnX3R5cGUgPSBSVE1fR0VUUk9VVEU7CisJcmVxLnIucnRtX2ZhbWlseSA9IHByZWZlcnJlZF9mYW1pbHk7CisJLypyZXEuci5ydG1fdGFibGUgPSAwOyAtIG1lbXNldCBkaWQgdGhpcyBhbHJlYWR5ICovCisJLypyZXEuci5ydG1fcHJvdG9jb2wgPSAwOyovCisJLypyZXEuci5ydG1fc2NvcGUgPSAwOyovCisJLypyZXEuci5ydG1fdHlwZSA9IDA7Ki8KKwkvKnJlcS5yLnJ0bV9zcmNfbGVuID0gMDsqLworCS8qcmVxLnIucnRtX2RzdF9sZW4gPSAwOyovCisJLypyZXEuci5ydG1fdG9zID0gMDsqLworCisJd2hpbGUgKCphcmd2KSB7CisJCXN3aXRjaCAoaW5kZXhfaW5fc3RyaW5ncyhvcHRpb25zLCAqYXJndikpIHsKKwkJCWNhc2UgMDogLyogZnJvbSAqLworCQkJeworCQkJCWluZXRfcHJlZml4IGFkZHI7CisJCQkJTkVYVF9BUkcoKTsKKwkJCQlmcm9tX29rID0gMTsKKwkJCQlnZXRfcHJlZml4KCZhZGRyLCAqYXJndiwgcmVxLnIucnRtX2ZhbWlseSk7CisJCQkJaWYgKHJlcS5yLnJ0bV9mYW1pbHkgPT0gQUZfVU5TUEVDKSB7CisJCQkJCXJlcS5yLnJ0bV9mYW1pbHkgPSBhZGRyLmZhbWlseTsKKwkJCQl9CisJCQkJaWYgKGFkZHIuYnl0ZWxlbikgeworCQkJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX1NSQywgJmFkZHIuZGF0YSwgYWRkci5ieXRlbGVuKTsKKwkJCQl9CisJCQkJcmVxLnIucnRtX3NyY19sZW4gPSBhZGRyLmJpdGxlbjsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgMTogLyogaWlmICovCisJCQkJTkVYVF9BUkcoKTsKKwkJCQlpZGV2ID0gKmFyZ3Y7CisJCQkJYnJlYWs7CisJCQljYXNlIDI6IC8qIG9pZiAqLworCQkJY2FzZSAzOiAvKiBkZXYgKi8KKwkJCQlORVhUX0FSRygpOworCQkJCW9kZXYgPSAqYXJndjsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDogLyogbm90aWZ5ICovCisJCQkJcmVxLnIucnRtX2ZsYWdzIHw9IFJUTV9GX05PVElGWTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNTogLyogY29ubmVjdGVkICovCisJCQkJY29ubmVjdGVkID0gMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgNjogLyogdG8gKi8KKwkJCQlORVhUX0FSRygpOworCQkJZGVmYXVsdDoKKwkJCXsKKwkJCQlpbmV0X3ByZWZpeCBhZGRyOworCQkJCWdldF9wcmVmaXgoJmFkZHIsICphcmd2LCByZXEuci5ydG1fZmFtaWx5KTsKKwkJCQlpZiAocmVxLnIucnRtX2ZhbWlseSA9PSBBRl9VTlNQRUMpIHsKKwkJCQkJcmVxLnIucnRtX2ZhbWlseSA9IGFkZHIuZmFtaWx5OworCQkJCX0KKwkJCQlpZiAoYWRkci5ieXRlbGVuKSB7CisJCQkJCWFkZGF0dHJfbCgmcmVxLm4sIHNpemVvZihyZXEpLCBSVEFfRFNULCAmYWRkci5kYXRhLCBhZGRyLmJ5dGVsZW4pOworCQkJCX0KKwkJCQlyZXEuci5ydG1fZHN0X2xlbiA9IGFkZHIuYml0bGVuOworCQkJfQorCQl9CisJCWFyZ3YrKzsKKwl9CisKKwlpZiAocmVxLnIucnRtX2RzdF9sZW4gPT0gMCkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibmVlZCBhdCBsZWFzdCBkZXN0aW5hdGlvbiBhZGRyZXNzIik7CisJfQorCisJeHJ0bmxfb3BlbigmcnRoKTsKKworCWxsX2luaXRfbWFwKCZydGgpOworCisJaWYgKGlkZXYgfHwgb2RldikgIHsKKwkJaW50IGlkeDsKKworCQlpZiAoaWRldikgeworCQkJaWR4ID0geGxsX25hbWVfdG9faW5kZXgoaWRldik7CisJCQlhZGRhdHRyMzIoJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX0lJRiwgaWR4KTsKKwkJfQorCQlpZiAob2RldikgeworCQkJaWR4ID0geGxsX25hbWVfdG9faW5kZXgob2Rldik7CisJCQlhZGRhdHRyMzIoJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX09JRiwgaWR4KTsKKwkJfQorCX0KKworCWlmIChyZXEuci5ydG1fZmFtaWx5ID09IEFGX1VOU1BFQykgeworCQlyZXEuci5ydG1fZmFtaWx5ID0gQUZfSU5FVDsKKwl9CisKKwlpZiAocnRubF90YWxrKCZydGgsICZyZXEubiwgMCwgMCwgJnJlcS5uLCBOVUxMLCBOVUxMKSA8IDApIHsKKwkJcmV0dXJuIDI7CisJfQorCisJaWYgKGNvbm5lY3RlZCAmJiAhZnJvbV9vaykgeworCQlzdHJ1Y3QgcnRtc2cgKnIgPSBOTE1TR19EQVRBKCZyZXEubik7CisJCWludCBsZW4gPSByZXEubi5ubG1zZ19sZW47CisJCXN0cnVjdCBydGF0dHIgKiB0YltSVEFfTUFYKzFdOworCisJCXByaW50X3JvdXRlKE5VTEwsICZyZXEubiwgTlVMTCk7CisKKwkJaWYgKHJlcS5uLm5sbXNnX3R5cGUgIT0gUlRNX05FV1JPVVRFKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm90IGEgcm91dGU/Iik7CisJCX0KKwkJbGVuIC09IE5MTVNHX0xFTkdUSChzaXplb2YoKnIpKTsKKwkJaWYgKGxlbiA8IDApIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ3cm9uZyBsZW4gJWQiLCBsZW4pOworCQl9CisKKwkJbWVtc2V0KHRiLCAwLCBzaXplb2YodGIpKTsKKwkJcGFyc2VfcnRhdHRyKHRiLCBSVEFfTUFYLCBSVE1fUlRBKHIpLCBsZW4pOworCisJCWlmICh0YltSVEFfUFJFRlNSQ10pIHsKKwkJCXRiW1JUQV9QUkVGU1JDXS0+cnRhX3R5cGUgPSBSVEFfU1JDOworCQkJci0+cnRtX3NyY19sZW4gPSA4KlJUQV9QQVlMT0FEKHRiW1JUQV9QUkVGU1JDXSk7CisJCX0gZWxzZSBpZiAoIXRiW1JUQV9TUkNdKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgY29ubmVjdCB0aGUgcm91dGUiKTsKKwkJfQorCQlpZiAoIW9kZXYgJiYgdGJbUlRBX09JRl0pIHsKKwkJCXRiW1JUQV9PSUZdLT5ydGFfdHlwZSA9IDA7CisJCX0KKwkJaWYgKHRiW1JUQV9HQVRFV0FZXSkgeworCQkJdGJbUlRBX0dBVEVXQVldLT5ydGFfdHlwZSA9IDA7CisJCX0KKwkJaWYgKCFpZGV2ICYmIHRiW1JUQV9JSUZdKSB7CisJCQl0YltSVEFfSUlGXS0+cnRhX3R5cGUgPSAwOworCQl9CisJCXJlcS5uLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUkVRVUVTVDsKKwkJcmVxLm4ubmxtc2dfdHlwZSA9IFJUTV9HRVRST1VURTsKKworCQlpZiAocnRubF90YWxrKCZydGgsICZyZXEubiwgMCwgMCwgJnJlcS5uLCBOVUxMLCBOVUxMKSA8IDApIHsKKwkJCXJldHVybiAyOworCQl9CisJfQorCXByaW50X3JvdXRlKE5VTEwsICZyZXEubiwgTlVMTCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiB2YWx1ZSBiZWNvbWVzIGV4aXRjb2RlLiBJdCdzIG9rYXkgdG8gbm90IHJldHVybiBhdCBhbGwgKi8KK2ludCBGQVNUX0ZVTkMgZG9faXByb3V0ZShjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBpcF9yb3V0ZV9jb21tYW5kc1tdIEFMSUdOMSA9CisJLyowLTMqLwkiYWRkXDAiImFwcGVuZFwwIiJjaGFuZ2VcMCIiY2hnXDAiCisJLyo0LTcqLwkiZGVsZXRlXDAiImdldFwwIiJsaXN0XDAiInNob3dcMCIKKwkvKjguLiovCSJwcmVwZW5kXDAiInJlcGxhY2VcMCIidGVzdFwwIiJmbHVzaFwwIjsKKwlpbnQgY29tbWFuZF9udW07CisJdW5zaWduZWQgZmxhZ3MgPSAwOworCWludCBjbWQgPSBSVE1fTkVXUk9VVEU7CisKKwlpZiAoISphcmd2KQorCQlyZXR1cm4gaXByb3V0ZV9saXN0X29yX2ZsdXNoKGFyZ3YsIDApOworCisJLyogIlN0YW5kYXJkIiAnaXAgciBhJyB0cmVhdHMgJ2EnIGFzICdhZGQnLCBub3QgJ2FwcGVuZCcgKi8KKwkvKiBJdCBwcm9iYWJseSBtZWFucyB0aGF0IGl0IGlzIHVzaW5nICJmaXJzdCBtYXRjaCIgcnVsZSAqLworCWNvbW1hbmRfbnVtID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhpcF9yb3V0ZV9jb21tYW5kcywgKmFyZ3YpOworCisJc3dpdGNoIChjb21tYW5kX251bSkgeworCQljYXNlIDA6IC8qIGFkZCAqLworCQkJZmxhZ3MgPSBOTE1fRl9DUkVBVEV8TkxNX0ZfRVhDTDsKKwkJCWJyZWFrOworCQljYXNlIDE6IC8qIGFwcGVuZCAqLworCQkJZmxhZ3MgPSBOTE1fRl9DUkVBVEV8TkxNX0ZfQVBQRU5EOworCQkJYnJlYWs7CisJCWNhc2UgMjogLyogY2hhbmdlICovCisJCWNhc2UgMzogLyogY2hnICovCisJCQlmbGFncyA9IE5MTV9GX1JFUExBQ0U7CisJCQlicmVhazsKKwkJY2FzZSA0OiAvKiBkZWxldGUgKi8KKwkJCWNtZCA9IFJUTV9ERUxST1VURTsKKwkJCWJyZWFrOworCQljYXNlIDU6IC8qIGdldCAqLworCQkJcmV0dXJuIGlwcm91dGVfZ2V0KGFyZ3YrMSk7CisJCWNhc2UgNjogLyogbGlzdCAqLworCQljYXNlIDc6IC8qIHNob3cgKi8KKwkJCXJldHVybiBpcHJvdXRlX2xpc3Rfb3JfZmx1c2goYXJndisxLCAwKTsKKwkJY2FzZSA4OiAvKiBwcmVwZW5kICovCisJCQlmbGFncyA9IE5MTV9GX0NSRUFURTsKKwkJCWJyZWFrOworCQljYXNlIDk6IC8qIHJlcGxhY2UgKi8KKwkJCWZsYWdzID0gTkxNX0ZfQ1JFQVRFfE5MTV9GX1JFUExBQ0U7CisJCQlicmVhazsKKwkJY2FzZSAxMDogLyogdGVzdCAqLworCQkJZmxhZ3MgPSBOTE1fRl9FWENMOworCQkJYnJlYWs7CisJCWNhc2UgMTE6IC8qIGZsdXNoICovCisJCQlyZXR1cm4gaXByb3V0ZV9saXN0X29yX2ZsdXNoKGFyZ3YrMSwgMSk7CisJCWRlZmF1bHQ6CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biBjb21tYW5kICVzIiwgKmFyZ3YpOworCX0KKworCXJldHVybiBpcHJvdXRlX21vZGlmeShjbWQsIGZsYWdzLCBhcmd2KzEpOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9saWJpcHJvdXRlL2lwcnVsZS5jIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL2lwcnVsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NGEzZTIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvaXBydWxlLmMKQEAgLTAsMCArMSwzMTggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczogQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqIENoYW5nZXM6CisgKgorICogUmFuaSBBc3NhZiA8cmFuaUBtYWdpYy5tZXRhd2lyZS5jb20+IDk4MDkyOTogcmVzb2x2ZSBhZGRyZXNzZXMKKyAqIGluaXRpYWxseSBpbnRlZ3JhdGVkIGludG8gYnVzeWJveCBieSBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyAqLworCisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgImlwX2NvbW1vbi5oIiAgLyogI2luY2x1ZGUgImxpYmJiLmgiIGlzIGluc2lkZSAqLworI2luY2x1ZGUgInJ0X25hbWVzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworLyoKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpIF9fYXR0cmlidXRlX18oKG5vcmV0dXJuKSk7CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogaXAgcnVsZSBbIGxpc3QgfCBhZGQgfCBkZWwgXSBTRUxFQ1RPUiBBQ1RJT05cbiIpOworCWZwcmludGYoc3RkZXJyLCAiU0VMRUNUT1IgOj0gWyBmcm9tIFBSRUZJWCBdIFsgdG8gUFJFRklYIF0gWyB0b3MgVE9TIF0gWyBmd21hcmsgRldNQVJLIF1cbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAgICAgICAgICAgWyBkZXYgU1RSSU5HIF0gWyBwcmVmIE5VTUJFUiBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIkFDVElPTiA6PSBbIHRhYmxlIFRBQkxFX0lEIF0gWyBuYXQgQUREUkVTUyBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAgICBbIHByb2hpYml0IHwgcmVqZWN0IHwgdW5yZWFjaGFibGUgXVxuIik7CisJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgWyByZWFsbXMgW1NSQ1JFQUxNL11EU1RSRUFMTSBdXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlRBQkxFX0lEIDo9IFsgbG9jYWwgfCBtYWluIHwgZGVmYXVsdCB8IE5VTUJFUiBdXG4iKTsKKwlleGl0KC0xKTsKK30KKyovCisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHByaW50X3J1bGUoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8gVU5VU0VEX1BBUkFNLAorCQkJCQlzdHJ1Y3Qgbmxtc2doZHIgKm4sIHZvaWQgKmFyZyBVTlVTRURfUEFSQU0pCit7CisJc3RydWN0IHJ0bXNnICpyID0gTkxNU0dfREFUQShuKTsKKwlpbnQgbGVuID0gbi0+bmxtc2dfbGVuOworCWludCBob3N0X2xlbiA9IC0xOworCXN0cnVjdCBydGF0dHIgKiB0YltSVEFfTUFYKzFdOworCWNoYXIgYWJ1ZlsyNTZdOworCisJaWYgKG4tPm5sbXNnX3R5cGUgIT0gUlRNX05FV1JVTEUpCisJCXJldHVybiAwOworCisJbGVuIC09IE5MTVNHX0xFTkdUSChzaXplb2YoKnIpKTsKKwlpZiAobGVuIDwgMCkKKwkJcmV0dXJuIC0xOworCisJbWVtc2V0KHRiLCAwLCBzaXplb2YodGIpKTsKKwlwYXJzZV9ydGF0dHIodGIsIFJUQV9NQVgsIFJUTV9SVEEociksIGxlbik7CisKKwlpZiAoci0+cnRtX2ZhbWlseSA9PSBBRl9JTkVUKQorCQlob3N0X2xlbiA9IDMyOworCWVsc2UgaWYgKHItPnJ0bV9mYW1pbHkgPT0gQUZfSU5FVDYpCisJCWhvc3RfbGVuID0gMTI4OworLyoJZWxzZSBpZiAoci0+cnRtX2ZhbWlseSA9PSBBRl9ERUNuZXQpCisJCWhvc3RfbGVuID0gMTY7CisJZWxzZSBpZiAoci0+cnRtX2ZhbWlseSA9PSBBRl9JUFgpCisJCWhvc3RfbGVuID0gODA7CisqLworCXByaW50ZigiJXU6XHQiLCB0YltSVEFfUFJJT1JJVFldID8KKwkJCQkJKih1bnNpZ25lZCopUlRBX0RBVEEodGJbUlRBX1BSSU9SSVRZXSkKKwkJCQkJOiAwKTsKKwlwcmludGYoImZyb20gIik7CisJaWYgKHRiW1JUQV9TUkNdKSB7CisJCWlmIChyLT5ydG1fc3JjX2xlbiAhPSBob3N0X2xlbikgeworCQkJcHJpbnRmKCIlcy8ldSIsIHJ0X2FkZHJfbjJhKHItPnJ0bV9mYW1pbHksCisJCQkJCQkJUlRBX0RBVEEodGJbUlRBX1NSQ10pLAorCQkJCQkJCWFidWYsIHNpemVvZihhYnVmKSksCisJCQkJci0+cnRtX3NyY19sZW4KKwkJCSk7CisJCX0gZWxzZSB7CisJCQlmcHV0cyhmb3JtYXRfaG9zdChyLT5ydG1fZmFtaWx5LAorCQkJCQkJUlRBX1BBWUxPQUQodGJbUlRBX1NSQ10pLAorCQkJCQkJUlRBX0RBVEEodGJbUlRBX1NSQ10pLAorCQkJCQkJYWJ1Ziwgc2l6ZW9mKGFidWYpKSwKKwkJCQlzdGRvdXQKKwkJCSk7CisJCX0KKwl9IGVsc2UgaWYgKHItPnJ0bV9zcmNfbGVuKSB7CisJCXByaW50ZigiMC8lZCIsIHItPnJ0bV9zcmNfbGVuKTsKKwl9IGVsc2UgeworCQlwcmludGYoImFsbCIpOworCX0KKwliYl9wdXRjaGFyKCcgJyk7CisKKwlpZiAodGJbUlRBX0RTVF0pIHsKKwkJaWYgKHItPnJ0bV9kc3RfbGVuICE9IGhvc3RfbGVuKSB7CisJCQlwcmludGYoInRvICVzLyV1ICIsIHJ0X2FkZHJfbjJhKHItPnJ0bV9mYW1pbHksCisJCQkJCQkJIFJUQV9EQVRBKHRiW1JUQV9EU1RdKSwKKwkJCQkJCQkgYWJ1Ziwgc2l6ZW9mKGFidWYpKSwKKwkJCQlyLT5ydG1fZHN0X2xlbgorCQkJCSk7CisJCX0gZWxzZSB7CisJCQlwcmludGYoInRvICVzICIsIGZvcm1hdF9ob3N0KHItPnJ0bV9mYW1pbHksCisJCQkJCQkgICAgICAgUlRBX1BBWUxPQUQodGJbUlRBX0RTVF0pLAorCQkJCQkJICAgICAgIFJUQV9EQVRBKHRiW1JUQV9EU1RdKSwKKwkJCQkJCSAgICAgICBhYnVmLCBzaXplb2YoYWJ1ZikpKTsKKwkJfQorCX0gZWxzZSBpZiAoci0+cnRtX2RzdF9sZW4pIHsKKwkJcHJpbnRmKCJ0byAwLyVkICIsIHItPnJ0bV9kc3RfbGVuKTsKKwl9CisKKwlpZiAoci0+cnRtX3RvcykgeworCQlwcmludGYoInRvcyAlcyAiLCBydG5sX2RzZmllbGRfbjJhKHItPnJ0bV90b3MpKTsKKwl9CisJaWYgKHRiW1JUQV9QUk9UT0lORk9dKSB7CisJCXByaW50ZigiZndtYXJrICUjeCAiLCAqKHVpbnQzMl90KilSVEFfREFUQSh0YltSVEFfUFJPVE9JTkZPXSkpOworCX0KKworCWlmICh0YltSVEFfSUlGXSkgeworCQlwcmludGYoImlpZiAlcyAiLCAoY2hhciopUlRBX0RBVEEodGJbUlRBX0lJRl0pKTsKKwl9CisKKwlpZiAoci0+cnRtX3RhYmxlKQorCQlwcmludGYoImxvb2t1cCAlcyAiLCBydG5sX3J0dGFibGVfbjJhKHItPnJ0bV90YWJsZSkpOworCisJaWYgKHRiW1JUQV9GTE9XXSkgeworCQl1aW50MzJfdCB0byA9ICoodWludDMyX3QqKVJUQV9EQVRBKHRiW1JUQV9GTE9XXSk7CisJCXVpbnQzMl90IGZyb20gPSB0bz4+MTY7CisJCXRvICY9IDB4RkZGRjsKKwkJaWYgKGZyb20pIHsKKwkJCXByaW50ZigicmVhbG1zICVzLyIsCisJCQkJcnRubF9ydHJlYWxtX24yYShmcm9tKSk7CisJCX0KKwkJcHJpbnRmKCIlcyAiLAorCQkJcnRubF9ydHJlYWxtX24yYSh0bykpOworCX0KKworCWlmIChyLT5ydG1fdHlwZSA9PSBSVE5fTkFUKSB7CisJCWlmICh0YltSVEFfR0FURVdBWV0pIHsKKwkJCXByaW50ZigibWFwLXRvICVzICIsCisJCQkJZm9ybWF0X2hvc3Qoci0+cnRtX2ZhbWlseSwKKwkJCQkJICAgIFJUQV9QQVlMT0FEKHRiW1JUQV9HQVRFV0FZXSksCisJCQkJCSAgICBSVEFfREFUQSh0YltSVEFfR0FURVdBWV0pLAorCQkJCQkgICAgYWJ1Ziwgc2l6ZW9mKGFidWYpKSk7CisJCX0gZWxzZQorCQkJcHJpbnRmKCJtYXNxdWVyYWRlIik7CisJfSBlbHNlIGlmIChyLT5ydG1fdHlwZSAhPSBSVE5fVU5JQ0FTVCkKKwkJZnB1dHMocnRubF9ydG50eXBlX24yYShyLT5ydG1fdHlwZSksIHN0ZG91dCk7CisKKwliYl9wdXRjaGFyKCdcbicpOworCS8qZmZsdXNoX2FsbCgpOyovCisJcmV0dXJuIDA7Cit9CisKKy8qIFJldHVybiB2YWx1ZSBiZWNvbWVzIGV4aXRjb2RlLiBJdCdzIG9rYXkgdG8gbm90IHJldHVybiBhdCBhbGwgKi8KK3N0YXRpYyBpbnQgaXBydWxlX2xpc3QoY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHJ0bmxfaGFuZGxlIHJ0aDsKKwlpbnQgYWYgPSBwcmVmZXJyZWRfZmFtaWx5OworCisJaWYgKGFmID09IEFGX1VOU1BFQykKKwkJYWYgPSBBRl9JTkVUOworCisJaWYgKCphcmd2KSB7CisJCS8vYmJfZXJyb3JfbXNnKCJcInJ1bGUgc2hvd1wiIG5lZWRzIG5vIGFyZ3VtZW50cyIpOworCQliYl93YXJuX2lnbm9yaW5nX2FyZ3MoKmFyZ3YpOworCQlyZXR1cm4gLTE7CisJfQorCisJeHJ0bmxfb3BlbigmcnRoKTsKKworCXhydG5sX3dpbGRkdW1wX3JlcXVlc3QoJnJ0aCwgYWYsIFJUTV9HRVRSVUxFKTsKKwl4cnRubF9kdW1wX2ZpbHRlcigmcnRoLCBwcmludF9ydWxlLCBOVUxMKTsKKworCXJldHVybiAwOworfQorCisvKiBSZXR1cm4gdmFsdWUgYmVjb21lcyBleGl0Y29kZS4gSXQncyBva2F5IHRvIG5vdCByZXR1cm4gYXQgYWxsICovCitzdGF0aWMgaW50IGlwcnVsZV9tb2RpZnkoaW50IGNtZCwgY2hhciAqKmFyZ3YpCit7CisJc3RhdGljIGNvbnN0IGNoYXIga2V5d29yZHNbXSBBTElHTjEgPQorCQkiZnJvbVwwIiJ0b1wwIiJwcmVmZXJlbmNlXDAiIm9yZGVyXDAiInByaW9yaXR5XDAiCisJCSJ0b3NcMCIiZndtYXJrXDAiInJlYWxtc1wwIiJ0YWJsZVwwIiJsb29rdXBcMCIiZGV2XDAiCisJCSJpaWZcMCIibmF0XDAiIm1hcC10b1wwIiJ0eXBlXDAiImhlbHBcMCI7CisJZW51bSB7CisJCUFSR19mcm9tID0gMSwgQVJHX3RvLCBBUkdfcHJlZmVyZW5jZSwgQVJHX29yZGVyLCBBUkdfcHJpb3JpdHksCisJCUFSR190b3MsIEFSR19md21hcmssIEFSR19yZWFsbXMsIEFSR190YWJsZSwgQVJHX2xvb2t1cCwgQVJHX2RldiwKKwkJQVJHX2lpZiwgQVJHX25hdCwgQVJHX21hcF90bywgQVJHX3R5cGUsIEFSR19oZWxwCisJfTsKKwlib29sIHRhYmxlX29rID0gMDsKKwlzdHJ1Y3QgcnRubF9oYW5kbGUgcnRoOworCXN0cnVjdCB7CisJCXN0cnVjdCBubG1zZ2hkciBuOworCQlzdHJ1Y3QgcnRtc2cgICAgcjsKKwkJY2hhciAgICAgICAgICAgIGJ1ZlsxMDI0XTsKKwl9IHJlcTsKKwlzbWFsbHVpbnQga2V5OworCisJbWVtc2V0KCZyZXEsIDAsIHNpemVvZihyZXEpKTsKKworCXJlcS5uLm5sbXNnX3R5cGUgPSBjbWQ7CisJcmVxLm4ubmxtc2dfbGVuID0gTkxNU0dfTEVOR1RIKHNpemVvZihzdHJ1Y3QgcnRtc2cpKTsKKwlyZXEubi5ubG1zZ19mbGFncyA9IE5MTV9GX1JFUVVFU1Q7CisJcmVxLnIucnRtX2ZhbWlseSA9IHByZWZlcnJlZF9mYW1pbHk7CisJcmVxLnIucnRtX3Byb3RvY29sID0gUlRQUk9UX0JPT1Q7CisJcmVxLnIucnRtX3Njb3BlID0gUlRfU0NPUEVfVU5JVkVSU0U7CisJcmVxLnIucnRtX3RhYmxlID0gMDsKKwlyZXEuci5ydG1fdHlwZSA9IFJUTl9VTlNQRUM7CisKKwlpZiAoY21kID09IFJUTV9ORVdSVUxFKSB7CisJCXJlcS5uLm5sbXNnX2ZsYWdzIHw9IE5MTV9GX0NSRUFURXxOTE1fRl9FWENMOworCQlyZXEuci5ydG1fdHlwZSA9IFJUTl9VTklDQVNUOworCX0KKworCXdoaWxlICgqYXJndikgeworCQlrZXkgPSBpbmRleF9pbl9zdWJzdHJpbmdzKGtleXdvcmRzLCAqYXJndikgKyAxOworCQlpZiAoa2V5ID09IDApIC8qIG5vIG1hdGNoIGZvdW5kIGluIGtleXdvcmRzIGFycmF5LCBiYWlsIG91dC4gKi8KKwkJCWludmFyZygqYXJndiwgYXBwbGV0X25hbWUpOworCQlpZiAoa2V5ID09IEFSR19mcm9tKSB7CisJCQlpbmV0X3ByZWZpeCBkc3Q7CisJCQlORVhUX0FSRygpOworCQkJZ2V0X3ByZWZpeCgmZHN0LCAqYXJndiwgcmVxLnIucnRtX2ZhbWlseSk7CisJCQlyZXEuci5ydG1fc3JjX2xlbiA9IGRzdC5iaXRsZW47CisJCQlhZGRhdHRyX2woJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX1NSQywgJmRzdC5kYXRhLCBkc3QuYnl0ZWxlbik7CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR190bykgeworCQkJaW5ldF9wcmVmaXggZHN0OworCQkJTkVYVF9BUkcoKTsKKwkJCWdldF9wcmVmaXgoJmRzdCwgKmFyZ3YsIHJlcS5yLnJ0bV9mYW1pbHkpOworCQkJcmVxLnIucnRtX2RzdF9sZW4gPSBkc3QuYml0bGVuOworCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9EU1QsICZkc3QuZGF0YSwgZHN0LmJ5dGVsZW4pOworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfcHJlZmVyZW5jZSB8fAorCQkJICAga2V5ID09IEFSR19vcmRlciB8fAorCQkJICAga2V5ID09IEFSR19wcmlvcml0eQorCQkpIHsKKwkJCXVpbnQzMl90IHByZWY7CisJCQlORVhUX0FSRygpOworCQkJcHJlZiA9IGdldF91MzIoKmFyZ3YsICJwcmVmZXJlbmNlIik7CisJCQlhZGRhdHRyMzIoJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX1BSSU9SSVRZLCBwcmVmKTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX3RvcykgeworCQkJdWludDMyX3QgdG9zOworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChydG5sX2RzZmllbGRfYTJuKCZ0b3MsICphcmd2KSkKKwkJCQlpbnZhcmcoKmFyZ3YsICJUT1MiKTsKKwkJCXJlcS5yLnJ0bV90b3MgPSB0b3M7CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19md21hcmspIHsKKwkJCXVpbnQzMl90IGZ3bWFyazsKKwkJCU5FWFRfQVJHKCk7CisJCQlmd21hcmsgPSBnZXRfdTMyKCphcmd2LCAiZndtYXJrIik7CisJCQlhZGRhdHRyMzIoJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX1BST1RPSU5GTywgZndtYXJrKTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX3JlYWxtcykgeworCQkJdWludDMyX3QgcmVhbG07CisJCQlORVhUX0FSRygpOworCQkJaWYgKGdldF9ydF9yZWFsbXMoJnJlYWxtLCAqYXJndikpCisJCQkJaW52YXJnKCphcmd2LCAicmVhbG1zIik7CisJCQlhZGRhdHRyMzIoJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX0ZMT1csIHJlYWxtKTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX3RhYmxlIHx8CisJCQkgICBrZXkgPT0gQVJHX2xvb2t1cAorCQkpIHsKKwkJCXVpbnQzMl90IHRpZDsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAocnRubF9ydHRhYmxlX2EybigmdGlkLCAqYXJndikpCisJCQkJaW52YXJnKCphcmd2LCAidGFibGUgSUQiKTsKKwkJCXJlcS5yLnJ0bV90YWJsZSA9IHRpZDsKKwkJCXRhYmxlX29rID0gMTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX2RldiB8fAorCQkJICAga2V5ID09IEFSR19paWYKKwkJKSB7CisJCQlORVhUX0FSRygpOworCQkJYWRkYXR0cl9sKCZyZXEubiwgc2l6ZW9mKHJlcSksIFJUQV9JSUYsICphcmd2LCBzdHJsZW4oKmFyZ3YpKzEpOworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfbmF0IHx8CisJCQkgICBrZXkgPT0gQVJHX21hcF90bworCQkpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlhZGRhdHRyMzIoJnJlcS5uLCBzaXplb2YocmVxKSwgUlRBX0dBVEVXQVksIGdldF9hZGRyMzIoKmFyZ3YpKTsKKwkJCXJlcS5yLnJ0bV90eXBlID0gUlROX05BVDsKKwkJfSBlbHNlIHsKKwkJCWludCB0eXBlOworCisJCQlpZiAoa2V5ID09IEFSR190eXBlKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCX0KKwkJCWlmIChrZXkgPT0gQVJHX2hlbHApCisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJaWYgKHJ0bmxfcnRudHlwZV9hMm4oJnR5cGUsICphcmd2KSkKKwkJCQlpbnZhcmcoKmFyZ3YsICJ0eXBlIik7CisJCQlyZXEuci5ydG1fdHlwZSA9IHR5cGU7CisJCX0KKwkJYXJndisrOworCX0KKworCWlmIChyZXEuci5ydG1fZmFtaWx5ID09IEFGX1VOU1BFQykKKwkJcmVxLnIucnRtX2ZhbWlseSA9IEFGX0lORVQ7CisKKwlpZiAoIXRhYmxlX29rICYmIGNtZCA9PSBSVE1fTkVXUlVMRSkKKwkJcmVxLnIucnRtX3RhYmxlID0gUlRfVEFCTEVfTUFJTjsKKworCXhydG5sX29wZW4oJnJ0aCk7CisKKwlpZiAocnRubF90YWxrKCZydGgsICZyZXEubiwgMCwgMCwgTlVMTCwgTlVMTCwgTlVMTCkgPCAwKQorCQlyZXR1cm4gMjsKKworCXJldHVybiAwOworfQorCisvKiBSZXR1cm4gdmFsdWUgYmVjb21lcyBleGl0Y29kZS4gSXQncyBva2F5IHRvIG5vdCByZXR1cm4gYXQgYWxsICovCitpbnQgRkFTVF9GVU5DIGRvX2lwcnVsZShjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBpcF9ydWxlX2NvbW1hbmRzW10gQUxJR04xID0KKwkJImFkZFwwIiJkZWxldGVcMCIibGlzdFwwIiJzaG93XDAiOworCWlmICgqYXJndikgeworCQlpbnQgY21kID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhpcF9ydWxlX2NvbW1hbmRzLCAqYXJndik7CisJCWlmIChjbWQgPCAwKQorCQkJaW52YXJnKCphcmd2LCBhcHBsZXRfbmFtZSk7CisJCWFyZ3YrKzsKKwkJaWYgKGNtZCA8IDIpCisJCQlyZXR1cm4gaXBydWxlX21vZGlmeSgoY21kID09IDApID8gUlRNX05FV1JVTEUgOiBSVE1fREVMUlVMRSwgYXJndik7CisJfQorCXJldHVybiBpcHJ1bGVfbGlzdChhcmd2KTsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcHR1bm5lbC5jIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL2lwdHVubmVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY1ZDVlNQotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9pcHR1bm5lbC5jCkBAIC0wLDAgKzEsNTc1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIEF1dGhvcnM6IEFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqCisgKiBDaGFuZ2VzOgorICoKKyAqIFJhbmkgQXNzYWYgPHJhbmlAbWFnaWMubWV0YXdpcmUuY29tPiA5ODA5Mjk6IHJlc29sdmUgYWRkcmVzc2VzCisgKiBSYW5pIEFzc2FmIDxyYW5pQG1hZ2ljLm1ldGF3aXJlLmNvbT4gOTgwOTMwOiBkbyBub3QgYWxsb3cga2V5IGZvciBpcGlwL3NpdAorICogUGhpbCBLYXJuIDxrYXJuQGthOXEuYW1wci5vcmc+ICAgICAgIDk5MDQwODogInBtdHVkaXNjIiBmbGFnCisgKi8KKworI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXQvaWZfYXJwLmg+CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisKKyNpZm5kZWYgX19jb25zdGFudF9odG9ucworI2RlZmluZSBfX2NvbnN0YW50X2h0b25zIGh0b25zCisjZW5kaWYKKworLy8gRllJOiAjZGVmaW5lIFNJT0NERVZQUklWQVRFIDB4ODlGMAorCisvKiBGcm9tIGxpbnV4L2lmX3R1bm5lbC5oLiAjaW5jbHVkaW5nIGl0IHByb3ZlZCB0cm91Ymxlc29tZQorICogKHJlZGVmaW5pdG9uIGVycm9ycyBkdWUgdG8gbmFtZSBjb2xsaXNpb25zIGluIGxpbnV4LyBhbmQgbmV0W2luZXRdLykgKi8KKyNkZWZpbmUgU0lPQ0dFVFRVTk5FTCAgIChTSU9DREVWUFJJVkFURSArIDApCisjZGVmaW5lIFNJT0NBRERUVU5ORUwgICAoU0lPQ0RFVlBSSVZBVEUgKyAxKQorI2RlZmluZSBTSU9DREVMVFVOTkVMICAgKFNJT0NERVZQUklWQVRFICsgMikKKyNkZWZpbmUgU0lPQ0NIR1RVTk5FTCAgIChTSU9DREVWUFJJVkFURSArIDMpCisvLyNkZWZpbmUgU0lPQ0dFVFBSTCAgICAgIChTSU9DREVWUFJJVkFURSArIDQpCisvLyNkZWZpbmUgU0lPQ0FERFBSTCAgICAgIChTSU9DREVWUFJJVkFURSArIDUpCisvLyNkZWZpbmUgU0lPQ0RFTFBSTCAgICAgIChTSU9DREVWUFJJVkFURSArIDYpCisvLyNkZWZpbmUgU0lPQ0NIR1BSTCAgICAgIChTSU9DREVWUFJJVkFURSArIDcpCisjZGVmaW5lIEdSRV9DU1VNICAgICAgICBfX2NvbnN0YW50X2h0b25zKDB4ODAwMCkKKy8vI2RlZmluZSBHUkVfUk9VVElORyAgICAgX19jb25zdGFudF9odG9ucygweDQwMDApCisjZGVmaW5lIEdSRV9LRVkgICAgICAgICBfX2NvbnN0YW50X2h0b25zKDB4MjAwMCkKKyNkZWZpbmUgR1JFX1NFUSAgICAgICAgIF9fY29uc3RhbnRfaHRvbnMoMHgxMDAwKQorLy8jZGVmaW5lIEdSRV9TVFJJQ1QgICAgICBfX2NvbnN0YW50X2h0b25zKDB4MDgwMCkKKy8vI2RlZmluZSBHUkVfUkVDICAgICAgICAgX19jb25zdGFudF9odG9ucygweDA3MDApCisvLyNkZWZpbmUgR1JFX0ZMQUdTICAgICAgIF9fY29uc3RhbnRfaHRvbnMoMHgwMEY4KQorLy8jZGVmaW5lIEdSRV9WRVJTSU9OICAgICBfX2NvbnN0YW50X2h0b25zKDB4MDAwNykKK3N0cnVjdCBpcF90dW5uZWxfcGFybSB7CisJY2hhciAgICAgICAgICAgIG5hbWVbSUZOQU1TSVpdOworCWludCAgICAgICAgICAgICBsaW5rOworCXVpbnQxNl90ICAgICAgICBpX2ZsYWdzOworCXVpbnQxNl90ICAgICAgICBvX2ZsYWdzOworCXVpbnQzMl90ICAgICAgICBpX2tleTsKKwl1aW50MzJfdCAgICAgICAgb19rZXk7CisJc3RydWN0IGlwaGRyICAgIGlwaDsKK307CisvKiBTSVQtbW9kZSBpX2ZsYWdzICovCisvLyNkZWZpbmUgU0lUX0lTQVRBUCAweDAwMDEKKy8vc3RydWN0IGlwX3R1bm5lbF9wcmwgeworLy8JdWludDMyX3QgICAgICAgICAgYWRkcjsKKy8vCXVpbnQxNl90ICAgICAgICAgIGZsYWdzOworLy8JdWludDE2X3QgICAgICAgICAgX19yZXNlcnZlZDsKKy8vCXVpbnQzMl90ICAgICAgICAgIGRhdGFsZW47CisvLwl1aW50MzJfdCAgICAgICAgICBfX3Jlc2VydmVkMjsKKy8vCS8qIGRhdGEgZm9sbG93cyAqLworLy99OworLy8vKiBQUkwgZmxhZ3MgKi8KKy8vI2RlZmluZSBQUkxfREVGQVVMVCAweDAwMDEKKworI2luY2x1ZGUgImlwX2NvbW1vbi5oIiAgLyogI2luY2x1ZGUgImxpYmJiLmgiIGlzIGluc2lkZSAqLworI2luY2x1ZGUgInJ0X25hbWVzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworCisvKiBEaWVzIG9uIGVycm9yICovCitzdGF0aWMgaW50IGRvX2lvY3RsX2dldF9pZmluZGV4KGNoYXIgKmRldikKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBmZDsKKworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBkZXYpOworCWZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwl4aW9jdGwoZmQsIFNJT0NHSUZJTkRFWCwgJmlmcik7CisJY2xvc2UoZmQpOworCXJldHVybiBpZnIuaWZyX2lmaW5kZXg7Cit9CisKK3N0YXRpYyBpbnQgZG9faW9jdGxfZ2V0X2lmdHlwZShjaGFyICpkZXYpCit7CisJc3RydWN0IGlmcmVxIGlmcjsKKwlpbnQgZmQ7CisJaW50IGVycjsKKworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBkZXYpOworCWZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwllcnIgPSBpb2N0bF9vcl93YXJuKGZkLCBTSU9DR0lGSFdBRERSLCAmaWZyKTsKKwljbG9zZShmZCk7CisJcmV0dXJuIGVyciA/IC0xIDogaWZyLmlmcl9hZGRyLnNhX2ZhbWlseTsKK30KKworc3RhdGljIGNoYXIgKmRvX2lvY3RsX2dldF9pZm5hbWUoaW50IGlkeCkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBmZDsKKwlpbnQgZXJyOworCisJaWZyLmlmcl9pZmluZGV4ID0gaWR4OworCWZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKwllcnIgPSBpb2N0bF9vcl93YXJuKGZkLCBTSU9DR0lGTkFNRSwgJmlmcik7CisJY2xvc2UoZmQpOworCXJldHVybiBlcnIgPyBOVUxMIDogeHN0cm5kdXAoaWZyLmlmcl9uYW1lLCBzaXplb2YoaWZyLmlmcl9uYW1lKSk7Cit9CisKK3N0YXRpYyBpbnQgZG9fZ2V0X2lvY3RsKGNvbnN0IGNoYXIgKmJhc2VkZXYsIHN0cnVjdCBpcF90dW5uZWxfcGFybSAqcCkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBmZDsKKwlpbnQgZXJyOworCisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGJhc2VkZXYpOworCWlmci5pZnJfaWZydS5pZnJ1X2RhdGEgPSAodm9pZCopcDsKKwlmZCA9IHhzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJZXJyID0gaW9jdGxfb3Jfd2FybihmZCwgU0lPQ0dFVFRVTk5FTCwgJmlmcik7CisJY2xvc2UoZmQpOworCXJldHVybiBlcnI7Cit9CisKKy8qIERpZXMgb24gZXJyb3IsIG90aGVyd2lzZSByZXR1cm5zIDAgKi8KK3N0YXRpYyBpbnQgZG9fYWRkX2lvY3RsKGludCBjbWQsIGNvbnN0IGNoYXIgKmJhc2VkZXYsIHN0cnVjdCBpcF90dW5uZWxfcGFybSAqcCkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBmZDsKKworCWlmIChjbWQgPT0gU0lPQ0NIR1RVTk5FTCAmJiBwLT5uYW1lWzBdKSB7CisJCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBwLT5uYW1lKTsKKwl9IGVsc2UgeworCQlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgYmFzZWRldik7CisJfQorCWlmci5pZnJfaWZydS5pZnJ1X2RhdGEgPSAodm9pZCopcDsKKwlmZCA9IHhzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisjaWYgRU5BQkxFX0lPQ1RMX0hFWDJTVFJfRVJST1IKKwkvKiAjZGVmaW5lIG1hZ2ljIHdpbGwgdHVybiBpb2N0bCMgaW50byBzdHJpbmcgKi8KKwlpZiAoY21kID09IFNJT0NDSEdUVU5ORUwpCisJCXhpb2N0bChmZCwgU0lPQ0NIR1RVTk5FTCwgJmlmcik7CisJZWxzZQorCQl4aW9jdGwoZmQsIFNJT0NBRERUVU5ORUwsICZpZnIpOworI2Vsc2UKKwl4aW9jdGwoZmQsIGNtZCwgJmlmcik7CisjZW5kaWYKKwljbG9zZShmZCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIERpZXMgb24gZXJyb3IsIG90aGVyd2lzZSByZXR1cm5zIDAgKi8KK3N0YXRpYyBpbnQgZG9fZGVsX2lvY3RsKGNvbnN0IGNoYXIgKmJhc2VkZXYsIHN0cnVjdCBpcF90dW5uZWxfcGFybSAqcCkKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBmZDsKKworCWlmIChwLT5uYW1lWzBdKSB7CisJCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBwLT5uYW1lKTsKKwl9IGVsc2UgeworCQlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgYmFzZWRldik7CisJfQorCWlmci5pZnJfaWZydS5pZnJ1X2RhdGEgPSAodm9pZCopcDsKKwlmZCA9IHhzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJeGlvY3RsKGZkLCBTSU9DREVMVFVOTkVMLCAmaWZyKTsKKwljbG9zZShmZCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIERpZXMgb24gZXJyb3IgKi8KK3N0YXRpYyB2b2lkIHBhcnNlX2FyZ3MoY2hhciAqKmFyZ3YsIGludCBjbWQsIHN0cnVjdCBpcF90dW5uZWxfcGFybSAqcCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBrZXl3b3Jkc1tdIEFMSUdOMSA9CisJCSJtb2RlXDAiImlwaXBcMCIiaXAvaXBcMCIiZ3JlXDAiImdyZS9pcFwwIiJzaXRcMCIiaXB2Ni9pcFwwIgorCQkia2V5XDAiImlrZXlcMCIib2tleVwwIiJzZXFcMCIiaXNlcVwwIiJvc2VxXDAiCisJCSJjc3VtXDAiImljc3VtXDAiIm9jc3VtXDAiIm5vcG10dWRpc2NcMCIicG10dWRpc2NcMCIKKwkJInJlbW90ZVwwIiJhbnlcMCIibG9jYWxcMCIiZGV2XDAiCisJCSJ0dGxcMCIiaW5oZXJpdFwwIiJ0b3NcMCIiZHNmaWVsZFwwIgorCQkibmFtZVwwIjsKKwllbnVtIHsKKwkJQVJHX21vZGUsIEFSR19pcGlwLCBBUkdfaXBfaXAsIEFSR19ncmUsIEFSR19ncmVfaXAsIEFSR19zaXQsIEFSR19pcDZfaXAsCisJCUFSR19rZXksIEFSR19pa2V5LCBBUkdfb2tleSwgQVJHX3NlcSwgQVJHX2lzZXEsIEFSR19vc2VxLAorCQlBUkdfY3N1bSwgQVJHX2ljc3VtLCBBUkdfb2NzdW0sIEFSR19ub3BtdHVkaXNjLCBBUkdfcG10dWRpc2MsCisJCUFSR19yZW1vdGUsIEFSR19hbnksIEFSR19sb2NhbCwgQVJHX2RldiwKKwkJQVJHX3R0bCwgQVJHX2luaGVyaXQsIEFSR190b3MsIEFSR19kc2ZpZWxkLAorCQlBUkdfbmFtZQorCX07CisJaW50IGNvdW50ID0gMDsKKwljaGFyIG1lZGl1bVtJRk5BTVNJWl07CisJaW50IGtleTsKKworCW1lbXNldChwLCAwLCBzaXplb2YoKnApKTsKKwltZWRpdW1bMF0gPSAnXDAnOworCisJcC0+aXBoLnZlcnNpb24gPSA0OworCXAtPmlwaC5paGwgPSA1OworI2lmbmRlZiBJUF9ERgorI2RlZmluZSBJUF9ERiAweDQwMDAgIC8qIEZsYWc6ICJEb24ndCBGcmFnbWVudCIgKi8KKyNlbmRpZgorCXAtPmlwaC5mcmFnX29mZiA9IGh0b25zKElQX0RGKTsKKworCXdoaWxlICgqYXJndikgeworCQlrZXkgPSBpbmRleF9pbl9zdHJpbmdzKGtleXdvcmRzLCAqYXJndik7CisJCWlmIChrZXkgPT0gQVJHX21vZGUpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlrZXkgPSBpbmRleF9pbl9zdHJpbmdzKGtleXdvcmRzLCAqYXJndik7CisJCQlpZiAoa2V5ID09IEFSR19pcGlwIHx8CisJCQkgICAga2V5ID09IEFSR19pcF9pcAorCQkJKSB7CisJCQkJaWYgKHAtPmlwaC5wcm90b2NvbCAmJiBwLT5pcGgucHJvdG9jb2wgIT0gSVBQUk9UT19JUElQKSB7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyB0dW5uZWwgbW9kZSIsICJ5b3UgbWFuYWdlZCB0byBhc2sgZm9yIG1vcmUgdGhhbiBvbmUiKTsKKwkJCQl9CisJCQkJcC0+aXBoLnByb3RvY29sID0gSVBQUk9UT19JUElQOworCQkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX2dyZSB8fAorCQkJCSAgIGtleSA9PSBBUkdfZ3JlX2lwCisJCQkpIHsKKwkJCQlpZiAocC0+aXBoLnByb3RvY29sICYmIHAtPmlwaC5wcm90b2NvbCAhPSBJUFBST1RPX0dSRSkgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMgdHVubmVsIG1vZGUiLCAieW91IG1hbmFnZWQgdG8gYXNrIGZvciBtb3JlIHRoYW4gb25lIik7CisJCQkJfQorCQkJCXAtPmlwaC5wcm90b2NvbCA9IElQUFJPVE9fR1JFOworCQkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX3NpdCB8fAorCQkJCSAgIGtleSA9PSBBUkdfaXA2X2lwCisJCQkpIHsKKwkJCQlpZiAocC0+aXBoLnByb3RvY29sICYmIHAtPmlwaC5wcm90b2NvbCAhPSBJUFBST1RPX0lQVjYpIHsKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIHR1bm5lbCBtb2RlIiwgInlvdSBtYW5hZ2VkIHRvIGFzayBmb3IgbW9yZSB0aGFuIG9uZSIpOworCQkJCX0KKwkJCQlwLT5pcGgucHJvdG9jb2wgPSBJUFBST1RPX0lQVjY7CisJCQl9IGVsc2UgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyB0dW5uZWwgbW9kZSIsICJjYW4ndCBndWVzcyIpOworCQkJfQorCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfa2V5KSB7CisJCQl1bnNpZ25lZCB1dmFsOworCQkJTkVYVF9BUkcoKTsKKwkJCXAtPmlfZmxhZ3MgfD0gR1JFX0tFWTsKKwkJCXAtPm9fZmxhZ3MgfD0gR1JFX0tFWTsKKwkJCWlmIChzdHJjaHIoKmFyZ3YsICcuJykpCisJCQkJcC0+aV9rZXkgPSBwLT5vX2tleSA9IGdldF9hZGRyMzIoKmFyZ3YpOworCQkJZWxzZSB7CisJCQkJdXZhbCA9IGdldF91bnNpZ25lZCgqYXJndiwgImtleSIpOworCQkJCXAtPmlfa2V5ID0gcC0+b19rZXkgPSBodG9ubCh1dmFsKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX2lrZXkpIHsKKwkJCXVuc2lnbmVkIHV2YWw7CisJCQlORVhUX0FSRygpOworCQkJcC0+aV9mbGFncyB8PSBHUkVfS0VZOworCQkJaWYgKHN0cmNocigqYXJndiwgJy4nKSkKKwkJCQlwLT5vX2tleSA9IGdldF9hZGRyMzIoKmFyZ3YpOworCQkJZWxzZSB7CisJCQkJdXZhbCA9IGdldF91bnNpZ25lZCgqYXJndiwgImlrZXkiKTsKKwkJCQlwLT5pX2tleSA9IGh0b25sKHV2YWwpOworCQkJfQorCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfb2tleSkgeworCQkJdW5zaWduZWQgdXZhbDsKKwkJCU5FWFRfQVJHKCk7CisJCQlwLT5vX2ZsYWdzIHw9IEdSRV9LRVk7CisJCQlpZiAoc3RyY2hyKCphcmd2LCAnLicpKQorCQkJCXAtPm9fa2V5ID0gZ2V0X2FkZHIzMigqYXJndik7CisJCQllbHNlIHsKKwkJCQl1dmFsID0gZ2V0X3Vuc2lnbmVkKCphcmd2LCAib2tleSIpOworCQkJCXAtPm9fa2V5ID0gaHRvbmwodXZhbCk7CisJCQl9CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19zZXEpIHsKKwkJCXAtPmlfZmxhZ3MgfD0gR1JFX1NFUTsKKwkJCXAtPm9fZmxhZ3MgfD0gR1JFX1NFUTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX2lzZXEpIHsKKwkJCXAtPmlfZmxhZ3MgfD0gR1JFX1NFUTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX29zZXEpIHsKKwkJCXAtPm9fZmxhZ3MgfD0gR1JFX1NFUTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX2NzdW0pIHsKKwkJCXAtPmlfZmxhZ3MgfD0gR1JFX0NTVU07CisJCQlwLT5vX2ZsYWdzIHw9IEdSRV9DU1VNOworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfaWNzdW0pIHsKKwkJCXAtPmlfZmxhZ3MgfD0gR1JFX0NTVU07CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19vY3N1bSkgeworCQkJcC0+b19mbGFncyB8PSBHUkVfQ1NVTTsKKwkJfSBlbHNlIGlmIChrZXkgPT0gQVJHX25vcG10dWRpc2MpIHsKKwkJCXAtPmlwaC5mcmFnX29mZiA9IDA7CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19wbXR1ZGlzYykgeworCQkJcC0+aXBoLmZyYWdfb2ZmID0gaHRvbnMoSVBfREYpOworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfcmVtb3RlKSB7CisJCQlORVhUX0FSRygpOworCQkJa2V5ID0gaW5kZXhfaW5fc3RyaW5ncyhrZXl3b3JkcywgKmFyZ3YpOworCQkJaWYgKGtleSAhPSBBUkdfYW55KQorCQkJCXAtPmlwaC5kYWRkciA9IGdldF9hZGRyMzIoKmFyZ3YpOworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfbG9jYWwpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlrZXkgPSBpbmRleF9pbl9zdHJpbmdzKGtleXdvcmRzLCAqYXJndik7CisJCQlpZiAoa2V5ICE9IEFSR19hbnkpCisJCQkJcC0+aXBoLnNhZGRyID0gZ2V0X2FkZHIzMigqYXJndik7CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR19kZXYpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlzdHJuY3B5X0lGTkFNU0laKG1lZGl1bSwgKmFyZ3YpOworCQl9IGVsc2UgaWYgKGtleSA9PSBBUkdfdHRsKSB7CisJCQl1bnNpZ25lZCB1dmFsOworCQkJTkVYVF9BUkcoKTsKKwkJCWtleSA9IGluZGV4X2luX3N0cmluZ3Moa2V5d29yZHMsICphcmd2KTsKKwkJCWlmIChrZXkgIT0gQVJHX2luaGVyaXQpIHsKKwkJCQl1dmFsID0gZ2V0X3Vuc2lnbmVkKCphcmd2LCAiVFRMIik7CisJCQkJaWYgKHV2YWwgPiAyNTUpCisJCQkJCWludmFyZygqYXJndiwgIlRUTCBtdXN0IGJlIDw9MjU1Iik7CisJCQkJcC0+aXBoLnR0bCA9IHV2YWw7CisJCQl9CisJCX0gZWxzZSBpZiAoa2V5ID09IEFSR190b3MgfHwKKwkJCSAgIGtleSA9PSBBUkdfZHNmaWVsZAorCQkpIHsKKwkJCXVpbnQzMl90IHV2YWw7CisJCQlORVhUX0FSRygpOworCQkJa2V5ID0gaW5kZXhfaW5fc3RyaW5ncyhrZXl3b3JkcywgKmFyZ3YpOworCQkJaWYgKGtleSAhPSBBUkdfaW5oZXJpdCkgeworCQkJCWlmIChydG5sX2RzZmllbGRfYTJuKCZ1dmFsLCAqYXJndikpCisJCQkJCWludmFyZygqYXJndiwgIlRPUyIpOworCQkJCXAtPmlwaC50b3MgPSB1dmFsOworCQkJfSBlbHNlCisJCQkJcC0+aXBoLnRvcyA9IDE7CisJCX0gZWxzZSB7CisJCQlpZiAoa2V5ID09IEFSR19uYW1lKSB7CisJCQkJTkVYVF9BUkcoKTsKKwkJCX0KKwkJCWlmIChwLT5uYW1lWzBdKQorCQkJCWR1cGFyZzIoIm5hbWUiLCAqYXJndik7CisJCQlzdHJuY3B5X0lGTkFNU0laKHAtPm5hbWUsICphcmd2KTsKKwkJCWlmIChjbWQgPT0gU0lPQ0NIR1RVTk5FTCAmJiBjb3VudCA9PSAwKSB7CisJCQkJc3RydWN0IGlwX3R1bm5lbF9wYXJtIG9sZF9wOworCQkJCW1lbXNldCgmb2xkX3AsIDAsIHNpemVvZihvbGRfcCkpOworCQkJCWlmIChkb19nZXRfaW9jdGwoKmFyZ3YsICZvbGRfcCkpCisJCQkJCWV4aXQoRVhJVF9GQUlMVVJFKTsKKwkJCQkqcCA9IG9sZF9wOworCQkJfQorCQl9CisJCWNvdW50Kys7CisJCWFyZ3YrKzsKKwl9CisKKwlpZiAocC0+aXBoLnByb3RvY29sID09IDApIHsKKwkJaWYgKG1lbWNtcChwLT5uYW1lLCAiZ3JlIiwgMykgPT0gMCkKKwkJCXAtPmlwaC5wcm90b2NvbCA9IElQUFJPVE9fR1JFOworCQllbHNlIGlmIChtZW1jbXAocC0+bmFtZSwgImlwaXAiLCA0KSA9PSAwKQorCQkJcC0+aXBoLnByb3RvY29sID0gSVBQUk9UT19JUElQOworCQllbHNlIGlmIChtZW1jbXAocC0+bmFtZSwgInNpdCIsIDMpID09IDApCisJCQlwLT5pcGgucHJvdG9jb2wgPSBJUFBST1RPX0lQVjY7CisJfQorCisJaWYgKHAtPmlwaC5wcm90b2NvbCA9PSBJUFBST1RPX0lQSVAgfHwgcC0+aXBoLnByb3RvY29sID09IElQUFJPVE9fSVBWNikgeworCQlpZiAoKHAtPmlfZmxhZ3MgJiBHUkVfS0VZKSB8fCAocC0+b19mbGFncyAmIEdSRV9LRVkpKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgia2V5cyBhcmUgbm90IGFsbG93ZWQgd2l0aCBpcGlwIGFuZCBzaXQiKTsKKwkJfQorCX0KKworCWlmIChtZWRpdW1bMF0pIHsKKwkJcC0+bGluayA9IGRvX2lvY3RsX2dldF9pZmluZGV4KG1lZGl1bSk7CisJfQorCisJaWYgKHAtPmlfa2V5ID09IDAgJiYgSU5fTVVMVElDQVNUKG50b2hsKHAtPmlwaC5kYWRkcikpKSB7CisJCXAtPmlfa2V5ID0gcC0+aXBoLmRhZGRyOworCQlwLT5pX2ZsYWdzIHw9IEdSRV9LRVk7CisJfQorCWlmIChwLT5vX2tleSA9PSAwICYmIElOX01VTFRJQ0FTVChudG9obChwLT5pcGguZGFkZHIpKSkgeworCQlwLT5vX2tleSA9IHAtPmlwaC5kYWRkcjsKKwkJcC0+b19mbGFncyB8PSBHUkVfS0VZOworCX0KKwlpZiAoSU5fTVVMVElDQVNUKG50b2hsKHAtPmlwaC5kYWRkcikpICYmICFwLT5pcGguc2FkZHIpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJyb2FkY2FzdCB0dW5uZWwgcmVxdWlyZXMgYSBzb3VyY2UgYWRkcmVzcyIpOworCX0KK30KKworLyogUmV0dXJuIHZhbHVlIGJlY29tZXMgZXhpdGNvZGUuIEl0J3Mgb2theSB0byBub3QgcmV0dXJuIGF0IGFsbCAqLworc3RhdGljIGludCBkb19hZGQoaW50IGNtZCwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGlwX3R1bm5lbF9wYXJtIHA7CisKKwlwYXJzZV9hcmdzKGFyZ3YsIGNtZCwgJnApOworCisJaWYgKHAuaXBoLnR0bCAmJiBwLmlwaC5mcmFnX29mZiA9PSAwKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0dGwgIT0gMCBhbmQgbm9wdG11ZGlzYyBhcmUgaW5jb21wYXRpYmxlIik7CisJfQorCisJc3dpdGNoIChwLmlwaC5wcm90b2NvbCkgeworCWNhc2UgSVBQUk9UT19JUElQOgorCQlyZXR1cm4gZG9fYWRkX2lvY3RsKGNtZCwgInR1bmwwIiwgJnApOworCWNhc2UgSVBQUk9UT19HUkU6CisJCXJldHVybiBkb19hZGRfaW9jdGwoY21kLCAiZ3JlMCIsICZwKTsKKwljYXNlIElQUFJPVE9fSVBWNjoKKwkJcmV0dXJuIGRvX2FkZF9pb2N0bChjbWQsICJzaXQwIiwgJnApOworCWRlZmF1bHQ6CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBkZXRlcm1pbmUgdHVubmVsIG1vZGUgKGlwaXAsIGdyZSBvciBzaXQpIik7CisJfQorfQorCisvKiBSZXR1cm4gdmFsdWUgYmVjb21lcyBleGl0Y29kZS4gSXQncyBva2F5IHRvIG5vdCByZXR1cm4gYXQgYWxsICovCitzdGF0aWMgaW50IGRvX2RlbChjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gcDsKKworCXBhcnNlX2FyZ3MoYXJndiwgU0lPQ0RFTFRVTk5FTCwgJnApOworCisJc3dpdGNoIChwLmlwaC5wcm90b2NvbCkgeworCWNhc2UgSVBQUk9UT19JUElQOgorCQlyZXR1cm4gZG9fZGVsX2lvY3RsKCJ0dW5sMCIsICZwKTsKKwljYXNlIElQUFJPVE9fR1JFOgorCQlyZXR1cm4gZG9fZGVsX2lvY3RsKCJncmUwIiwgJnApOworCWNhc2UgSVBQUk9UT19JUFY2OgorCQlyZXR1cm4gZG9fZGVsX2lvY3RsKCJzaXQwIiwgJnApOworCWRlZmF1bHQ6CisJCXJldHVybiBkb19kZWxfaW9jdGwocC5uYW1lLCAmcCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBwcmludF90dW5uZWwoc3RydWN0IGlwX3R1bm5lbF9wYXJtICpwKQoreworCWNoYXIgczFbMjU2XTsKKwljaGFyIHMyWzI1Nl07CisJY2hhciBzM1s2NF07CisJY2hhciBzNFs2NF07CisKKwlmb3JtYXRfaG9zdChBRl9JTkVULCA0LCAmcC0+aXBoLmRhZGRyLCBzMSwgc2l6ZW9mKHMxKSk7CisJZm9ybWF0X2hvc3QoQUZfSU5FVCwgNCwgJnAtPmlwaC5zYWRkciwgczIsIHNpemVvZihzMikpOworCWluZXRfbnRvcChBRl9JTkVULCAmcC0+aV9rZXksIHMzLCBzaXplb2YoczMpKTsKKwlpbmV0X250b3AoQUZfSU5FVCwgJnAtPm9fa2V5LCBzNCwgc2l6ZW9mKHM0KSk7CisKKwlwcmludGYoIiVzOiAlcy9pcCAgcmVtb3RlICVzICBsb2NhbCAlcyAiLAorCSAgICAgICBwLT5uYW1lLAorCSAgICAgICBwLT5pcGgucHJvdG9jb2wgPT0gSVBQUk9UT19JUElQID8gImlwIiA6CisJICAgICAgIChwLT5pcGgucHJvdG9jb2wgPT0gSVBQUk9UT19HUkUgPyAiZ3JlIiA6CisJCShwLT5pcGgucHJvdG9jb2wgPT0gSVBQUk9UT19JUFY2ID8gImlwdjYiIDogInVua25vd24iKSksCisJICAgICAgIHAtPmlwaC5kYWRkciA/IHMxIDogImFueSIsIHAtPmlwaC5zYWRkciA/IHMyIDogImFueSIpOworCWlmIChwLT5saW5rKSB7CisJCWNoYXIgKm4gPSBkb19pb2N0bF9nZXRfaWZuYW1lKHAtPmxpbmspOworCQlpZiAobikgeworCQkJcHJpbnRmKCIgZGV2ICVzICIsIG4pOworCQkJZnJlZShuKTsKKwkJfQorCX0KKwlpZiAocC0+aXBoLnR0bCkKKwkJcHJpbnRmKCIgdHRsICVkICIsIHAtPmlwaC50dGwpOworCWVsc2UKKwkJcHJpbnRmKCIgdHRsIGluaGVyaXQgIik7CisJaWYgKHAtPmlwaC50b3MpIHsKKwkJcHJpbnRmKCIgdG9zIik7CisJCWlmIChwLT5pcGgudG9zICYgMSkKKwkJCXByaW50ZigiIGluaGVyaXQiKTsKKwkJaWYgKHAtPmlwaC50b3MgJiB+MSkKKwkJCXByaW50ZigiJWMlcyAiLCBwLT5pcGgudG9zICYgMSA/ICcvJyA6ICcgJywKKwkJCQlydG5sX2RzZmllbGRfbjJhKHAtPmlwaC50b3MgJiB+MSkpOworCX0KKwlpZiAoIShwLT5pcGguZnJhZ19vZmYgJiBodG9ucyhJUF9ERikpKQorCQlwcmludGYoIiBub3BtdHVkaXNjIik7CisKKwlpZiAoKHAtPmlfZmxhZ3MgJiBHUkVfS0VZKSAmJiAocC0+b19mbGFncyAmIEdSRV9LRVkpICYmIHAtPm9fa2V5ID09IHAtPmlfa2V5KQorCQlwcmludGYoIiBrZXkgJXMiLCBzMyk7CisJZWxzZSBpZiAoKHAtPmlfZmxhZ3MgfCBwLT5vX2ZsYWdzKSAmIEdSRV9LRVkpIHsKKwkJaWYgKHAtPmlfZmxhZ3MgJiBHUkVfS0VZKQorCQkJcHJpbnRmKCIgaWtleSAlcyAiLCBzMyk7CisJCWlmIChwLT5vX2ZsYWdzICYgR1JFX0tFWSkKKwkJCXByaW50ZigiIG9rZXkgJXMgIiwgczQpOworCX0KKworCWlmIChwLT5pX2ZsYWdzICYgR1JFX1NFUSkKKwkJcHJpbnRmKCIlYyAgRHJvcCBwYWNrZXRzIG91dCBvZiBzZXF1ZW5jZS5cbiIsIF9TTF8pOworCWlmIChwLT5pX2ZsYWdzICYgR1JFX0NTVU0pCisJCXByaW50ZigiJWMgIENoZWNrc3VtIGluIHJlY2VpdmVkIHBhY2tldCBpcyByZXF1aXJlZC4iLCBfU0xfKTsKKwlpZiAocC0+b19mbGFncyAmIEdSRV9TRVEpCisJCXByaW50ZigiJWMgIFNlcXVlbmNlIHBhY2tldHMgb24gb3V0cHV0LiIsIF9TTF8pOworCWlmIChwLT5vX2ZsYWdzICYgR1JFX0NTVU0pCisJCXByaW50ZigiJWMgIENoZWNrc3VtIG91dHB1dCBwYWNrZXRzLiIsIF9TTF8pOworfQorCitzdGF0aWMgdm9pZCBkb190dW5uZWxzX2xpc3Qoc3RydWN0IGlwX3R1bm5lbF9wYXJtICpwKQoreworCWNoYXIgbmFtZVtJRk5BTVNJWl07CisJdW5zaWduZWQgbG9uZyByeF9ieXRlcywgcnhfcGFja2V0cywgcnhfZXJycywgcnhfZHJvcHMsCisJCXJ4X2ZpZm8sIHJ4X2ZyYW1lLAorCQl0eF9ieXRlcywgdHhfcGFja2V0cywgdHhfZXJycywgdHhfZHJvcHMsCisJCXR4X2ZpZm8sIHR4X2NvbGxzLCB0eF9jYXJyaWVyLCByeF9tdWx0aTsKKwlpbnQgdHlwZTsKKwlzdHJ1Y3QgaXBfdHVubmVsX3Bhcm0gcDE7CisJY2hhciBidWZbNTEyXTsKKwlGSUxFICpmcCA9IGZvcGVuX29yX3dhcm4oIi9wcm9jL25ldC9kZXYiLCAiciIpOworCisJaWYgKGZwID09IE5VTEwpIHsKKwkJcmV0dXJuOworCX0KKwkvKiBza2lwIGhlYWRlcnMgKi8KKwlmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCk7CisJZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApOworCisJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSAhPSBOVUxMKSB7CisJCWNoYXIgKnB0cjsKKworCQkvKmJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMDsgLSBmZ2V0cyBpcyBzYWZlIGFueXdheSAqLworCQlwdHIgPSBzdHJjaHIoYnVmLCAnOicpOworCQlpZiAocHRyID09IE5VTEwgfHwKKwkJICAgICgqcHRyKysgPSAwLCBzc2NhbmYoYnVmLCAiJXMiLCBuYW1lKSAhPSAxKQorCQkpIHsKKwkJCWJiX2Vycm9yX21zZygid3JvbmcgZm9ybWF0IG9mIC9wcm9jL25ldC9kZXYiKTsKKwkJCXJldHVybjsKKwkJfQorCQlpZiAoc3NjYW5mKHB0ciwgIiVsdSVsdSVsdSVsdSVsdSVsdSVsdSUqZCVsdSVsdSVsdSVsdSVsdSVsdSVsdSIsCisJCQkgICAmcnhfYnl0ZXMsICZyeF9wYWNrZXRzLCAmcnhfZXJycywgJnJ4X2Ryb3BzLAorCQkJICAgJnJ4X2ZpZm8sICZyeF9mcmFtZSwgJnJ4X211bHRpLAorCQkJICAgJnR4X2J5dGVzLCAmdHhfcGFja2V0cywgJnR4X2VycnMsICZ0eF9kcm9wcywKKwkJCSAgICZ0eF9maWZvLCAmdHhfY29sbHMsICZ0eF9jYXJyaWVyKSAhPSAxNCkKKwkJCWNvbnRpbnVlOworCQlpZiAocC0+bmFtZVswXSAmJiBzdHJjbXAocC0+bmFtZSwgbmFtZSkpCisJCQljb250aW51ZTsKKwkJdHlwZSA9IGRvX2lvY3RsX2dldF9pZnR5cGUobmFtZSk7CisJCWlmICh0eXBlID09IC0xKSB7CisJCQliYl9lcnJvcl9tc2coImNhbid0IGdldCB0eXBlIG9mIFslc10iLCBuYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICh0eXBlICE9IEFSUEhSRF9UVU5ORUwgJiYgdHlwZSAhPSBBUlBIUkRfSVBHUkUgJiYgdHlwZSAhPSBBUlBIUkRfU0lUKQorCQkJY29udGludWU7CisJCW1lbXNldCgmcDEsIDAsIHNpemVvZihwMSkpOworCQlpZiAoZG9fZ2V0X2lvY3RsKG5hbWUsICZwMSkpCisJCQljb250aW51ZTsKKwkJaWYgKChwLT5saW5rICYmIHAxLmxpbmsgIT0gcC0+bGluaykgfHwKKwkJICAgIChwLT5uYW1lWzBdICYmIHN0cmNtcChwMS5uYW1lLCBwLT5uYW1lKSkgfHwKKwkJICAgIChwLT5pcGguZGFkZHIgJiYgcDEuaXBoLmRhZGRyICE9IHAtPmlwaC5kYWRkcikgfHwKKwkJICAgIChwLT5pcGguc2FkZHIgJiYgcDEuaXBoLnNhZGRyICE9IHAtPmlwaC5zYWRkcikgfHwKKwkJICAgIChwLT5pX2tleSAmJiBwMS5pX2tleSAhPSBwLT5pX2tleSkKKwkJKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlwcmludF90dW5uZWwoJnAxKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9Cit9CisKKy8qIFJldHVybiB2YWx1ZSBiZWNvbWVzIGV4aXRjb2RlLiBJdCdzIG9rYXkgdG8gbm90IHJldHVybiBhdCBhbGwgKi8KK3N0YXRpYyBpbnQgZG9fc2hvdyhjaGFyICoqYXJndikKK3sKKwlpbnQgZXJyOworCXN0cnVjdCBpcF90dW5uZWxfcGFybSBwOworCisJcGFyc2VfYXJncyhhcmd2LCBTSU9DR0VUVFVOTkVMLCAmcCk7CisKKwlzd2l0Y2ggKHAuaXBoLnByb3RvY29sKSB7CisJY2FzZSBJUFBST1RPX0lQSVA6CisJCWVyciA9IGRvX2dldF9pb2N0bChwLm5hbWVbMF0gPyBwLm5hbWUgOiAidHVubDAiLCAmcCk7CisJCWJyZWFrOworCWNhc2UgSVBQUk9UT19HUkU6CisJCWVyciA9IGRvX2dldF9pb2N0bChwLm5hbWVbMF0gPyBwLm5hbWUgOiAiZ3JlMCIsICZwKTsKKwkJYnJlYWs7CisJY2FzZSBJUFBST1RPX0lQVjY6CisJCWVyciA9IGRvX2dldF9pb2N0bChwLm5hbWVbMF0gPyBwLm5hbWUgOiAic2l0MCIsICZwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZG9fdHVubmVsc19saXN0KCZwKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChlcnIpCisJCXJldHVybiAtMTsKKworCXByaW50X3R1bm5lbCgmcCk7CisJYmJfcHV0Y2hhcignXG4nKTsKKwlyZXR1cm4gMDsKK30KKworLyogUmV0dXJuIHZhbHVlIGJlY29tZXMgZXhpdGNvZGUuIEl0J3Mgb2theSB0byBub3QgcmV0dXJuIGF0IGFsbCAqLworaW50IEZBU1RfRlVOQyBkb19pcHR1bm5lbChjaGFyICoqYXJndikKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBrZXl3b3Jkc1tdIEFMSUdOMSA9CisJCSJhZGRcMCIiY2hhbmdlXDAiImRlbGV0ZVwwIiJzaG93XDAiImxpc3RcMCIibHN0XDAiOworCWVudW0geyBBUkdfYWRkID0gMCwgQVJHX2NoYW5nZSwgQVJHX2RlbCwgQVJHX3Nob3csIEFSR19saXN0LCBBUkdfbHN0IH07CisKKwlpZiAoKmFyZ3YpIHsKKwkJaW50IGtleSA9IGluZGV4X2luX3N1YnN0cmluZ3Moa2V5d29yZHMsICphcmd2KTsKKwkJaWYgKGtleSA8IDApCisJCQlpbnZhcmcoKmFyZ3YsIGFwcGxldF9uYW1lKTsKKwkJYXJndisrOworCQlpZiAoa2V5ID09IEFSR19hZGQpCisJCQlyZXR1cm4gZG9fYWRkKFNJT0NBRERUVU5ORUwsIGFyZ3YpOworCQlpZiAoa2V5ID09IEFSR19jaGFuZ2UpCisJCQlyZXR1cm4gZG9fYWRkKFNJT0NDSEdUVU5ORUwsIGFyZ3YpOworCQlpZiAoa2V5ID09IEFSR19kZWwpCisJCQlyZXR1cm4gZG9fZGVsKGFyZ3YpOworCX0KKwlyZXR1cm4gZG9fc2hvdyhhcmd2KTsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvbGliaXByb3V0ZS9saWJuZXRsaW5rLmMgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGlibmV0bGluay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NTMzYTQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGlibmV0bGluay5jCkBAIC0wLDAgKzEsNDAxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEF1dGhvcnM6IEFsZXhleSBLdXpuZXRzb3YsIDxrdXpuZXRAbXMyLmluci5hYy5ydT4KKyAqLworCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAibGlibmV0bGluay5oIgorCit2b2lkIEZBU1RfRlVOQyB4cnRubF9vcGVuKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoLyosIHVuc2lnbmVkIHN1YnNjcmlwdGlvbnMqLykKK3sKKwlzb2NrbGVuX3QgYWRkcl9sZW47CisKKwltZW1zZXQocnRoLCAwLCBzaXplb2YoKnJ0aCkpOworCXJ0aC0+ZmQgPSB4c29ja2V0KEFGX05FVExJTkssIFNPQ0tfUkFXLCBORVRMSU5LX1JPVVRFKTsKKwlydGgtPmxvY2FsLm5sX2ZhbWlseSA9IEFGX05FVExJTks7CisJLypydGgtPmxvY2FsLm5sX2dyb3VwcyA9IHN1YnNjcmlwdGlvbnM7Ki8KKworCXhiaW5kKHJ0aC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZydGgtPmxvY2FsLCBzaXplb2YocnRoLT5sb2NhbCkpOworCWFkZHJfbGVuID0gc2l6ZW9mKHJ0aC0+bG9jYWwpOworCWdldHNvY2tuYW1lKHJ0aC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIqKSZydGgtPmxvY2FsLCAmYWRkcl9sZW4pOworCisvKiB0b28gbXVjaCBwYXJhbm9pYQorCWlmIChnZXRzb2NrbmFtZShydGgtPmZkLCAoc3RydWN0IHNvY2thZGRyKikmcnRoLT5sb2NhbCwgJmFkZHJfbGVuKSA8IDApCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZ2V0c29ja25hbWUiKTsKKwlpZiAoYWRkcl9sZW4gIT0gc2l6ZW9mKHJ0aC0+bG9jYWwpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgid3JvbmcgYWRkcmVzcyBsZW5ndGggJWQiLCBhZGRyX2xlbik7CisJaWYgKHJ0aC0+bG9jYWwubmxfZmFtaWx5ICE9IEFGX05FVExJTkspCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ3cm9uZyBhZGRyZXNzIGZhbWlseSAlZCIsIHJ0aC0+bG9jYWwubmxfZmFtaWx5KTsKKyovCisJcnRoLT5zZXEgPSB0aW1lKE5VTEwpOworfQorCitpbnQgRkFTVF9GVU5DIHhydG5sX3dpbGRkdW1wX3JlcXVlc3Qoc3RydWN0IHJ0bmxfaGFuZGxlICpydGgsIGludCBmYW1pbHksIGludCB0eXBlKQoreworCXN0cnVjdCB7CisJCXN0cnVjdCBubG1zZ2hkciBubGg7CisJCXN0cnVjdCBydGdlbm1zZyBnOworCX0gcmVxOworCisJcmVxLm5saC5ubG1zZ19sZW4gPSBzaXplb2YocmVxKTsKKwlyZXEubmxoLm5sbXNnX3R5cGUgPSB0eXBlOworCXJlcS5ubGgubmxtc2dfZmxhZ3MgPSBOTE1fRl9ST09UfE5MTV9GX01BVENIfE5MTV9GX1JFUVVFU1Q7CisJcmVxLm5saC5ubG1zZ19waWQgPSAwOworCXJlcS5ubGgubmxtc2dfc2VxID0gcnRoLT5kdW1wID0gKytydGgtPnNlcTsKKwlyZXEuZy5ydGdlbl9mYW1pbHkgPSBmYW1pbHk7CisKKwlyZXR1cm4gcnRubF9zZW5kKHJ0aCwgKHZvaWQqKSZyZXEsIHNpemVvZihyZXEpKTsKK30KKworLy9UT0RPOiBwYXNzIHJ0aC0+ZmQgaW5zdGVhZCBvZiBmdWxsIHJ0aD8KK2ludCBGQVNUX0ZVTkMgcnRubF9zZW5kKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoLCBjaGFyICpidWYsIGludCBsZW4pCit7CisJc3RydWN0IHNvY2thZGRyX25sIG5sYWRkcjsKKworCW1lbXNldCgmbmxhZGRyLCAwLCBzaXplb2YobmxhZGRyKSk7CisJbmxhZGRyLm5sX2ZhbWlseSA9IEFGX05FVExJTks7CisKKwlyZXR1cm4geHNlbmR0byhydGgtPmZkLCBidWYsIGxlbiwgKHN0cnVjdCBzb2NrYWRkciopJm5sYWRkciwgc2l6ZW9mKG5sYWRkcikpOworfQorCitpbnQgRkFTVF9GVU5DIHJ0bmxfZHVtcF9yZXF1ZXN0KHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoLCBpbnQgdHlwZSwgdm9pZCAqcmVxLCBpbnQgbGVuKQoreworCXN0cnVjdCBubG1zZ2hkciBubGg7CisJc3RydWN0IHNvY2thZGRyX25sIG5sYWRkcjsKKwlzdHJ1Y3QgaW92ZWMgaW92WzJdID0geyB7ICZubGgsIHNpemVvZihubGgpIH0sIHsgcmVxLCBsZW4gfSB9OworCXN0cnVjdCBtc2doZHIgbXNnID0geworCQkodm9pZCopJm5sYWRkciwgc2l6ZW9mKG5sYWRkciksCisJCWlvdiwgIDIsCisJCU5VTEwsIDAsCisJCTAKKwl9OworCisJbWVtc2V0KCZubGFkZHIsIDAsIHNpemVvZihubGFkZHIpKTsKKwlubGFkZHIubmxfZmFtaWx5ID0gQUZfTkVUTElOSzsKKworCW5saC5ubG1zZ19sZW4gPSBOTE1TR19MRU5HVEgobGVuKTsKKwlubGgubmxtc2dfdHlwZSA9IHR5cGU7CisJbmxoLm5sbXNnX2ZsYWdzID0gTkxNX0ZfUk9PVHxOTE1fRl9NQVRDSHxOTE1fRl9SRVFVRVNUOworCW5saC5ubG1zZ19waWQgPSAwOworCW5saC5ubG1zZ19zZXEgPSBydGgtPmR1bXAgPSArK3J0aC0+c2VxOworCisJcmV0dXJuIHNlbmRtc2cocnRoLT5mZCwgJm1zZywgMCk7Cit9CisKK3N0YXRpYyBpbnQgcnRubF9kdW1wX2ZpbHRlcihzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCwKKwkJaW50ICgqZmlsdGVyKShjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKiwgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICopIEZBU1RfRlVOQywKKwkJdm9pZCAqYXJnMS8qLAorCQlpbnQgKCpqdW5rKShzdHJ1Y3Qgc29ja2FkZHJfbmwgKiwgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkICopLAorCQl2b2lkICphcmcyKi8pCit7CisJaW50IHJldHZhbCA9IC0xOworCWNoYXIgKmJ1ZiA9IHhtYWxsb2MoOCoxMDI0KTsgLyogYXZvaWQgYmlnIHN0YWNrIGJ1ZmZlciAqLworCXN0cnVjdCBzb2NrYWRkcl9ubCBubGFkZHI7CisJc3RydWN0IGlvdmVjIGlvdiA9IHsgYnVmLCA4KjEwMjQgfTsKKworCXdoaWxlICgxKSB7CisJCWludCBzdGF0dXM7CisJCXN0cnVjdCBubG1zZ2hkciAqaDsKKworCQlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsKKwkJCSh2b2lkKikmbmxhZGRyLCBzaXplb2YobmxhZGRyKSwKKwkJCSZpb3YsIDEsCisJCQlOVUxMLCAwLAorCQkJMAorCQl9OworCisJCXN0YXR1cyA9IHJlY3Ztc2cocnRoLT5mZCwgJm1zZywgMCk7CisKKwkJaWYgKHN0YXR1cyA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCQljb250aW51ZTsKKwkJCWJiX3BlcnJvcl9tc2coIk9WRVJSVU4iKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdGF0dXMgPT0gMCkgeworCQkJYmJfZXJyb3JfbXNnKCJFT0Ygb24gbmV0bGluayIpOworCQkJZ290byByZXQ7CisJCX0KKwkJaWYgKG1zZy5tc2dfbmFtZWxlbiAhPSBzaXplb2YobmxhZGRyKSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInNlbmRlciBhZGRyZXNzIGxlbmd0aCA9PSAlZCIsIG1zZy5tc2dfbmFtZWxlbik7CisJCX0KKworCQloID0gKHN0cnVjdCBubG1zZ2hkciopYnVmOworCQl3aGlsZSAoTkxNU0dfT0soaCwgc3RhdHVzKSkgeworCQkJaW50IGVycjsKKworCQkJaWYgKG5sYWRkci5ubF9waWQgIT0gMCB8fAorCQkJICAgIGgtPm5sbXNnX3BpZCAhPSBydGgtPmxvY2FsLm5sX3BpZCB8fAorCQkJICAgIGgtPm5sbXNnX3NlcSAhPSBydGgtPmR1bXAKKwkJCSkgeworLy8JCQkJaWYgKGp1bmspIHsKKy8vCQkJCQllcnIgPSBqdW5rKCZubGFkZHIsIGgsIGFyZzIpOworLy8JCQkJCWlmIChlcnIgPCAwKSB7CisvLwkJCQkJCXJldHZhbCA9IGVycjsKKy8vCQkJCQkJZ290byByZXQ7CisvLwkJCQkJfQorLy8JCQkJfQorCQkJCWdvdG8gc2tpcF9pdDsKKwkJCX0KKworCQkJaWYgKGgtPm5sbXNnX3R5cGUgPT0gTkxNU0dfRE9ORSkgeworCQkJCWdvdG8gcmV0XzA7CisJCQl9CisJCQlpZiAoaC0+bmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUikgeworCQkJCXN0cnVjdCBubG1zZ2VyciAqbF9lcnIgPSAoc3RydWN0IG5sbXNnZXJyKilOTE1TR19EQVRBKGgpOworCQkJCWlmIChoLT5ubG1zZ19sZW4gPCBOTE1TR19MRU5HVEgoc2l6ZW9mKHN0cnVjdCBubG1zZ2VycikpKSB7CisJCQkJCWJiX2Vycm9yX21zZygiRVJST1IgdHJ1bmNhdGVkIik7CisJCQkJfSBlbHNlIHsKKwkJCQkJZXJybm8gPSAtbF9lcnItPmVycm9yOworCQkJCQliYl9wZXJyb3JfbXNnKCJSVE5FVExJTksgYW5zd2VycyIpOworCQkJCX0KKwkJCQlnb3RvIHJldDsKKwkJCX0KKwkJCWVyciA9IGZpbHRlcigmbmxhZGRyLCBoLCBhcmcxKTsKKwkJCWlmIChlcnIgPCAwKSB7CisJCQkJcmV0dmFsID0gZXJyOworCQkJCWdvdG8gcmV0OworCQkJfQorCisgc2tpcF9pdDoKKwkJCWggPSBOTE1TR19ORVhUKGgsIHN0YXR1cyk7CisJCX0KKwkJaWYgKG1zZy5tc2dfZmxhZ3MgJiBNU0dfVFJVTkMpIHsKKwkJCWJiX2Vycm9yX21zZygibWVzc2FnZSB0cnVuY2F0ZWQiKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdGF0dXMpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJyZW1uYW50IG9mIHNpemUgJWQhIiwgc3RhdHVzKTsKKwkJfQorCX0gLyogd2hpbGUgKDEpICovCisgcmV0XzA6CisJcmV0dmFsKys7IC8qID0gMCAqLworIHJldDoKKwlmcmVlKGJ1Zik7CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IEZBU1RfRlVOQyB4cnRubF9kdW1wX2ZpbHRlcihzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCwKKwkJaW50ICgqZmlsdGVyKShjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKiwgc3RydWN0IG5sbXNnaGRyICosIHZvaWQgKikgRkFTVF9GVU5DLAorCQl2b2lkICphcmcxKQoreworCWludCByZXQgPSBydG5sX2R1bXBfZmlsdGVyKHJ0aCwgZmlsdGVyLCBhcmcxLyosIE5VTEwsIE5VTEwqLyk7CisJaWYgKHJldCA8IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJkdW1wIHRlcm1pbmF0ZWQiKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgRkFTVF9GVU5DIHJ0bmxfdGFsayhzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0bmwsIHN0cnVjdCBubG1zZ2hkciAqbiwKKwkJcGlkX3QgcGVlciwgdW5zaWduZWQgZ3JvdXBzLAorCQlzdHJ1Y3Qgbmxtc2doZHIgKmFuc3dlciwKKwkJaW50ICgqanVuaykoc3RydWN0IHNvY2thZGRyX25sICosIHN0cnVjdCBubG1zZ2hkciAqLCB2b2lkICopLAorCQl2b2lkICpqYXJnKQoreworLyogYmJveCBkb2Vzbid0IHVzZSBwYXJhbWV0ZXJzIG5vLiAzLCA0LCA2LCA3LCB0aGV5IGFyZSBzdHViYmVkIG91dCAqLworI2RlZmluZSBwZWVyICAgMAorI2RlZmluZSBncm91cHMgMAorI2RlZmluZSBqdW5rICAgTlVMTAorI2RlZmluZSBqYXJnICAgTlVMTAorCWludCByZXR2YWwgPSAtMTsKKwlpbnQgc3RhdHVzOworCXVuc2lnbmVkIHNlcTsKKwlzdHJ1Y3Qgbmxtc2doZHIgKmg7CisJc3RydWN0IHNvY2thZGRyX25sIG5sYWRkcjsKKwlzdHJ1Y3QgaW92ZWMgaW92ID0geyAodm9pZCopbiwgbi0+bmxtc2dfbGVuIH07CisJY2hhciAgICpidWYgPSB4bWFsbG9jKDgqMTAyNCk7IC8qIGF2b2lkIGJpZyBzdGFjayBidWZmZXIgKi8KKwlzdHJ1Y3QgbXNnaGRyIG1zZyA9IHsKKwkJKHZvaWQqKSZubGFkZHIsIHNpemVvZihubGFkZHIpLAorCQkmaW92LCAxLAorCQlOVUxMLCAwLAorCQkwCisJfTsKKworCW1lbXNldCgmbmxhZGRyLCAwLCBzaXplb2YobmxhZGRyKSk7CisJbmxhZGRyLm5sX2ZhbWlseSA9IEFGX05FVExJTks7CisvLwlubGFkZHIubmxfcGlkID0gcGVlcjsKKy8vCW5sYWRkci5ubF9ncm91cHMgPSBncm91cHM7CisKKwluLT5ubG1zZ19zZXEgPSBzZXEgPSArK3J0bmwtPnNlcTsKKwlpZiAoYW5zd2VyID09IE5VTEwpIHsKKwkJbi0+bmxtc2dfZmxhZ3MgfD0gTkxNX0ZfQUNLOworCX0KKwlzdGF0dXMgPSBzZW5kbXNnKHJ0bmwtPmZkLCAmbXNnLCAwKTsKKworCWlmIChzdGF0dXMgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2coImNhbid0IHRhbGsgdG8gcnRuZXRsaW5rIik7CisJCWdvdG8gcmV0OworCX0KKworCWlvdi5pb3ZfYmFzZSA9IGJ1ZjsKKworCXdoaWxlICgxKSB7CisJCWlvdi5pb3ZfbGVuID0gOCoxMDI0OworCQlzdGF0dXMgPSByZWN2bXNnKHJ0bmwtPmZkLCAmbXNnLCAwKTsKKworCQlpZiAoc3RhdHVzIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVJTlRSKSB7CisJCQkJY29udGludWU7CisJCQl9CisJCQliYl9wZXJyb3JfbXNnKCJPVkVSUlVOIik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3RhdHVzID09IDApIHsKKwkJCWJiX2Vycm9yX21zZygiRU9GIG9uIG5ldGxpbmsiKTsKKwkJCWdvdG8gcmV0OworCQl9CisJCWlmIChtc2cubXNnX25hbWVsZW4gIT0gc2l6ZW9mKG5sYWRkcikpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzZW5kZXIgYWRkcmVzcyBsZW5ndGggPT0gJWQiLCBtc2cubXNnX25hbWVsZW4pOworCQl9CisJCWZvciAoaCA9IChzdHJ1Y3Qgbmxtc2doZHIqKWJ1Zjsgc3RhdHVzID49IChpbnQpc2l6ZW9mKCpoKTsgKSB7CisvLwkJCWludCBsX2VycjsKKwkJCWludCBsZW4gPSBoLT5ubG1zZ19sZW47CisJCQlpbnQgbCA9IGxlbiAtIHNpemVvZigqaCk7CisKKwkJCWlmIChsIDwgMCB8fCBsZW4gPiBzdGF0dXMpIHsKKwkJCQlpZiAobXNnLm1zZ19mbGFncyAmIE1TR19UUlVOQykgeworCQkJCQliYl9lcnJvcl9tc2coInRydW5jYXRlZCBtZXNzYWdlIik7CisJCQkJCWdvdG8gcmV0OworCQkJCX0KKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibWFsZm9ybWVkIG1lc3NhZ2U6IGxlbj0lZCEiLCBsZW4pOworCQkJfQorCisJCQlpZiAobmxhZGRyLm5sX3BpZCAhPSBwZWVyIHx8CisJCQkgICAgaC0+bmxtc2dfcGlkICE9IHJ0bmwtPmxvY2FsLm5sX3BpZCB8fAorCQkJICAgIGgtPm5sbXNnX3NlcSAhPSBzZXEKKwkJCSkgeworLy8JCQkJaWYgKGp1bmspIHsKKy8vCQkJCQlsX2VyciA9IGp1bmsoJm5sYWRkciwgaCwgamFyZyk7CisvLwkJCQkJaWYgKGxfZXJyIDwgMCkgeworLy8JCQkJCQlyZXR2YWwgPSBsX2VycjsKKy8vCQkJCQkJZ290byByZXQ7CisvLwkJCQkJfQorLy8JCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlpZiAoaC0+bmxtc2dfdHlwZSA9PSBOTE1TR19FUlJPUikgeworCQkJCXN0cnVjdCBubG1zZ2VyciAqZXJyID0gKHN0cnVjdCBubG1zZ2VyciopTkxNU0dfREFUQShoKTsKKwkJCQlpZiAobCA8IChpbnQpc2l6ZW9mKHN0cnVjdCBubG1zZ2VycikpIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJFUlJPUiB0cnVuY2F0ZWQiKTsKKwkJCQl9IGVsc2UgeworCQkJCQllcnJubyA9IC0gZXJyLT5lcnJvcjsKKwkJCQkJaWYgKGVycm5vID09IDApIHsKKwkJCQkJCWlmIChhbnN3ZXIpIHsKKwkJCQkJCQltZW1jcHkoYW5zd2VyLCBoLCBoLT5ubG1zZ19sZW4pOworCQkJCQkJfQorCQkJCQkJZ290byByZXRfMDsKKwkJCQkJfQorCQkJCQliYl9wZXJyb3JfbXNnKCJSVE5FVExJTksgYW5zd2VycyIpOworCQkJCX0KKwkJCQlnb3RvIHJldDsKKwkJCX0KKwkJCWlmIChhbnN3ZXIpIHsKKwkJCQltZW1jcHkoYW5zd2VyLCBoLCBoLT5ubG1zZ19sZW4pOworCQkJCWdvdG8gcmV0XzA7CisJCQl9CisKKwkJCWJiX2Vycm9yX21zZygidW5leHBlY3RlZCByZXBseSEiKTsKKworCQkJc3RhdHVzIC09IE5MTVNHX0FMSUdOKGxlbik7CisJCQloID0gKHN0cnVjdCBubG1zZ2hkciopKChjaGFyKiloICsgTkxNU0dfQUxJR04obGVuKSk7CisJCX0KKwkJaWYgKG1zZy5tc2dfZmxhZ3MgJiBNU0dfVFJVTkMpIHsKKwkJCWJiX2Vycm9yX21zZygibWVzc2FnZSB0cnVuY2F0ZWQiKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzdGF0dXMpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJyZW1uYW50IG9mIHNpemUgJWQhIiwgc3RhdHVzKTsKKwkJfQorCX0gLyogd2hpbGUgKDEpICovCisgcmV0XzA6CisJcmV0dmFsKys7IC8qID0gMCAqLworIHJldDoKKwlmcmVlKGJ1Zik7CisJcmV0dXJuIHJldHZhbDsKK30KKworaW50IEZBU1RfRlVOQyBhZGRhdHRyMzIoc3RydWN0IG5sbXNnaGRyICpuLCBpbnQgbWF4bGVuLCBpbnQgdHlwZSwgdWludDMyX3QgZGF0YSkKK3sKKwlpbnQgbGVuID0gUlRBX0xFTkdUSCg0KTsKKwlzdHJ1Y3QgcnRhdHRyICpydGE7CisKKwlpZiAoKGludCkoTkxNU0dfQUxJR04obi0+bmxtc2dfbGVuKSArIGxlbikgPiBtYXhsZW4pIHsKKwkJcmV0dXJuIC0xOworCX0KKwlydGEgPSAoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopbikgKyBOTE1TR19BTElHTihuLT5ubG1zZ19sZW4pKTsKKwlydGEtPnJ0YV90eXBlID0gdHlwZTsKKwlydGEtPnJ0YV9sZW4gPSBsZW47CisJbW92ZV90b191bmFsaWduZWQzMihSVEFfREFUQShydGEpLCBkYXRhKTsKKwluLT5ubG1zZ19sZW4gPSBOTE1TR19BTElHTihuLT5ubG1zZ19sZW4pICsgbGVuOworCXJldHVybiAwOworfQorCitpbnQgRkFTVF9GVU5DIGFkZGF0dHJfbChzdHJ1Y3Qgbmxtc2doZHIgKm4sIGludCBtYXhsZW4sIGludCB0eXBlLCB2b2lkICpkYXRhLCBpbnQgYWxlbikKK3sKKwlpbnQgbGVuID0gUlRBX0xFTkdUSChhbGVuKTsKKwlzdHJ1Y3QgcnRhdHRyICpydGE7CisKKwlpZiAoKGludCkoTkxNU0dfQUxJR04obi0+bmxtc2dfbGVuKSArIGxlbikgPiBtYXhsZW4pIHsKKwkJcmV0dXJuIC0xOworCX0KKwlydGEgPSAoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopbikgKyBOTE1TR19BTElHTihuLT5ubG1zZ19sZW4pKTsKKwlydGEtPnJ0YV90eXBlID0gdHlwZTsKKwlydGEtPnJ0YV9sZW4gPSBsZW47CisJbWVtY3B5KFJUQV9EQVRBKHJ0YSksIGRhdGEsIGFsZW4pOworCW4tPm5sbXNnX2xlbiA9IE5MTVNHX0FMSUdOKG4tPm5sbXNnX2xlbikgKyBsZW47CisJcmV0dXJuIDA7Cit9CisKK2ludCBGQVNUX0ZVTkMgcnRhX2FkZGF0dHIzMihzdHJ1Y3QgcnRhdHRyICpydGEsIGludCBtYXhsZW4sIGludCB0eXBlLCB1aW50MzJfdCBkYXRhKQoreworCWludCBsZW4gPSBSVEFfTEVOR1RIKDQpOworCXN0cnVjdCBydGF0dHIgKnN1YnJ0YTsKKworCWlmIChSVEFfQUxJR04ocnRhLT5ydGFfbGVuKSArIGxlbiA+IG1heGxlbikgeworCQlyZXR1cm4gLTE7CisJfQorCXN1YnJ0YSA9IChzdHJ1Y3QgcnRhdHRyKikoKChjaGFyKilydGEpICsgUlRBX0FMSUdOKHJ0YS0+cnRhX2xlbikpOworCXN1YnJ0YS0+cnRhX3R5cGUgPSB0eXBlOworCXN1YnJ0YS0+cnRhX2xlbiA9IGxlbjsKKwltb3ZlX3RvX3VuYWxpZ25lZDMyKFJUQV9EQVRBKHN1YnJ0YSksIGRhdGEpOworCXJ0YS0+cnRhX2xlbiA9IE5MTVNHX0FMSUdOKHJ0YS0+cnRhX2xlbikgKyBsZW47CisJcmV0dXJuIDA7Cit9CisKK2ludCBGQVNUX0ZVTkMgcnRhX2FkZGF0dHJfbChzdHJ1Y3QgcnRhdHRyICpydGEsIGludCBtYXhsZW4sIGludCB0eXBlLCB2b2lkICpkYXRhLCBpbnQgYWxlbikKK3sKKwlzdHJ1Y3QgcnRhdHRyICpzdWJydGE7CisJaW50IGxlbiA9IFJUQV9MRU5HVEgoYWxlbik7CisKKwlpZiAoUlRBX0FMSUdOKHJ0YS0+cnRhX2xlbikgKyBsZW4gPiBtYXhsZW4pIHsKKwkJcmV0dXJuIC0xOworCX0KKwlzdWJydGEgPSAoc3RydWN0IHJ0YXR0ciopKCgoY2hhciopcnRhKSArIFJUQV9BTElHTihydGEtPnJ0YV9sZW4pKTsKKwlzdWJydGEtPnJ0YV90eXBlID0gdHlwZTsKKwlzdWJydGEtPnJ0YV9sZW4gPSBsZW47CisJbWVtY3B5KFJUQV9EQVRBKHN1YnJ0YSksIGRhdGEsIGFsZW4pOworCXJ0YS0+cnRhX2xlbiA9IE5MTVNHX0FMSUdOKHJ0YS0+cnRhX2xlbikgKyBsZW47CisJcmV0dXJuIDA7Cit9CisKKwordm9pZCBGQVNUX0ZVTkMgcGFyc2VfcnRhdHRyKHN0cnVjdCBydGF0dHIgKnRiW10sIGludCBtYXgsIHN0cnVjdCBydGF0dHIgKnJ0YSwgaW50IGxlbikKK3sKKwl3aGlsZSAoUlRBX09LKHJ0YSwgbGVuKSkgeworCQlpZiAocnRhLT5ydGFfdHlwZSA8PSBtYXgpIHsKKwkJCXRiW3J0YS0+cnRhX3R5cGVdID0gcnRhOworCQl9CisJCXJ0YSA9IFJUQV9ORVhUKHJ0YSwgbGVuKTsKKwl9CisJaWYgKGxlbikgeworCQliYl9lcnJvcl9tc2coImRlZmljaXQgJWQsIHJ0YV9sZW49JWQhIiwgbGVuLCBydGEtPnJ0YV9sZW4pOworCX0KK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvbGliaXByb3V0ZS9saWJuZXRsaW5rLmggYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGlibmV0bGluay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYmVlMmQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGlibmV0bGluay5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworI2lmbmRlZiBMSUJORVRMSU5LX0gKKyNkZWZpbmUgTElCTkVUTElOS19IIDEKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisvKiBXZSBuZWVkIGxpbnV4L3R5cGVzLmggYmVjYXVzZSBvbGRlciBrZXJuZWxzIHVzZSBfX3UzMiBldGMKKyAqIGluIGxpbnV4L1tydF1uZXRsaW5rLmguIDIuNi4xOSBzZWVtcyB0byBiZSBvaywgdGhvdWdoICovCisjaW5jbHVkZSA8bGludXgvbmV0bGluay5oPgorI2luY2x1ZGUgPGxpbnV4L3J0bmV0bGluay5oPgorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworc3RydWN0IHJ0bmxfaGFuZGxlIHsKKwlpbnQgICAgICAgICAgICAgICAgZmQ7CisJc3RydWN0IHNvY2thZGRyX25sIGxvY2FsOworCXN0cnVjdCBzb2NrYWRkcl9ubCBwZWVyOworCXVpbnQzMl90ICAgICAgICAgICBzZXE7CisJdWludDMyX3QgICAgICAgICAgIGR1bXA7Cit9OworCitleHRlcm4gdm9pZCB4cnRubF9vcGVuKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoKSBGQVNUX0ZVTkM7CisjZGVmaW5lIHJ0bmxfY2xvc2UocnRoKSAoY2xvc2UoKHJ0aCktPmZkKSkKK2V4dGVybiBpbnQgeHJ0bmxfd2lsZGR1bXBfcmVxdWVzdChzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCwgaW50IGZhbSwgaW50IHR5cGUpIEZBU1RfRlVOQzsKK2V4dGVybiBpbnQgcnRubF9kdW1wX3JlcXVlc3Qoc3RydWN0IHJ0bmxfaGFuZGxlICpydGgsIGludCB0eXBlLCB2b2lkICpyZXEsIGludCBsZW4pIEZBU1RfRlVOQzsKK2V4dGVybiBpbnQgeHJ0bmxfZHVtcF9maWx0ZXIoc3RydWN0IHJ0bmxfaGFuZGxlICpydGgsCisJCWludCAoKmZpbHRlcikoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sKiwgc3RydWN0IG5sbXNnaGRyICpuLCB2b2lkKikgRkFTVF9GVU5DLAorCQl2b2lkICphcmcxKSBGQVNUX0ZVTkM7CisKKy8qIGJib3ggZG9lc24ndCB1c2UgcGFyYW1ldGVycyBuby4gMywgNCwgNiwgNywgc3R1YiB0aGVtIG91dCAqLworI2RlZmluZSBydG5sX3RhbGsocnRubCwgbiwgcGVlciwgZ3JvdXBzLCBhbnN3ZXIsIGp1bmssIGphcmcpIFwKKwlydG5sX3RhbGsocnRubCwgbiwgYW5zd2VyKQorZXh0ZXJuIGludCBydG5sX3RhbGsoc3RydWN0IHJ0bmxfaGFuZGxlICpydG5sLCBzdHJ1Y3Qgbmxtc2doZHIgKm4sIHBpZF90IHBlZXIsCisJCXVuc2lnbmVkIGdyb3Vwcywgc3RydWN0IG5sbXNnaGRyICphbnN3ZXIsCisJCWludCAoKmp1bmspKHN0cnVjdCBzb2NrYWRkcl9ubCAqLHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqKSwKKwkJdm9pZCAqamFyZykgRkFTVF9GVU5DOworCitleHRlcm4gaW50IHJ0bmxfc2VuZChzdHJ1Y3QgcnRubF9oYW5kbGUgKnJ0aCwgY2hhciAqYnVmLCBpbnQpIEZBU1RfRlVOQzsKKworCitleHRlcm4gaW50IGFkZGF0dHIzMihzdHJ1Y3Qgbmxtc2doZHIgKm4sIGludCBtYXhsZW4sIGludCB0eXBlLCB1aW50MzJfdCBkYXRhKSBGQVNUX0ZVTkM7CitleHRlcm4gaW50IGFkZGF0dHJfbChzdHJ1Y3Qgbmxtc2doZHIgKm4sIGludCBtYXhsZW4sIGludCB0eXBlLCB2b2lkICpkYXRhLCBpbnQgYWxlbikgRkFTVF9GVU5DOworZXh0ZXJuIGludCBydGFfYWRkYXR0cjMyKHN0cnVjdCBydGF0dHIgKnJ0YSwgaW50IG1heGxlbiwgaW50IHR5cGUsIHVpbnQzMl90IGRhdGEpIEZBU1RfRlVOQzsKK2V4dGVybiBpbnQgcnRhX2FkZGF0dHJfbChzdHJ1Y3QgcnRhdHRyICpydGEsIGludCBtYXhsZW4sIGludCB0eXBlLCB2b2lkICpkYXRhLCBpbnQgYWxlbikgRkFTVF9GVU5DOworCitleHRlcm4gdm9pZCBwYXJzZV9ydGF0dHIoc3RydWN0IHJ0YXR0ciAqdGJbXSwgaW50IG1heCwgc3RydWN0IHJ0YXR0ciAqcnRhLCBpbnQgbGVuKSBGQVNUX0ZVTkM7CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9saWJpcHJvdXRlL2xsX2FkZHIuYyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9sbF9hZGRyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNhNTRlYQotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9sbF9hZGRyLmMKQEAgLTAsMCArMSw3OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOiBBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKi8KKworI2luY2x1ZGUgPG5ldC9pZl9hcnAuaD4KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBsbF9hZGRyX24yYSh1bnNpZ25lZCBjaGFyICphZGRyLCBpbnQgYWxlbiwgaW50IHR5cGUsIGNoYXIgKmJ1ZiwgaW50IGJsZW4pCit7CisJaW50IGk7CisJaW50IGw7CisKKwlpZiAoYWxlbiA9PSA0CisJICYmICh0eXBlID09IEFSUEhSRF9UVU5ORUwgfHwgdHlwZSA9PSBBUlBIUkRfU0lUIHx8IHR5cGUgPT0gQVJQSFJEX0lQR1JFKQorCSkgeworCQlyZXR1cm4gaW5ldF9udG9wKEFGX0lORVQsIGFkZHIsIGJ1ZiwgYmxlbik7CisJfQorCWwgPSAwOworCWZvciAoaSA9IDA7IGkgPCBhbGVuOyBpKyspIHsKKwkJaWYgKGkgPT0gMCkgeworCQkJc25wcmludGYoYnVmICsgbCwgYmxlbiwgIjolMDJ4IisxLCBhZGRyW2ldKTsKKwkJCWJsZW4gLT0gMjsKKwkJCWwgKz0gMjsKKwkJfSBlbHNlIHsKKwkJCXNucHJpbnRmKGJ1ZiArIGwsIGJsZW4sICI6JTAyeCIsIGFkZHJbaV0pOworCQkJYmxlbiAtPSAzOworCQkJbCArPSAzOworCQl9CisJfQorCXJldHVybiBidWY7Cit9CisKK2ludCBGQVNUX0ZVTkMgbGxfYWRkcl9hMm4odW5zaWduZWQgY2hhciAqbGxhZGRyLCBpbnQgbGVuLCBjaGFyICphcmcpCit7CisJaW50IGk7CisKKwlpZiAoc3RyY2hyKGFyZywgJy4nKSkgeworCQlpbmV0X3ByZWZpeCBwZng7CisJCWlmIChnZXRfYWRkcl8xKCZwZngsIGFyZywgQUZfSU5FVCkpIHsKKwkJCWJiX2Vycm9yX21zZygiXCIlc1wiIGlzIGludmFsaWQgbGxhZGRyIiwgYXJnKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAobGVuIDwgNCkgeworCQkJcmV0dXJuIC0xOworCQl9CisJCW1lbWNweShsbGFkZHIsIHBmeC5kYXRhLCA0KTsKKwkJcmV0dXJuIDQ7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisJCWludCB0ZW1wOworCQljaGFyICpjcCA9IHN0cmNocihhcmcsICc6Jyk7CisJCWlmIChjcCkgeworCQkJKmNwID0gMDsKKwkJCWNwKys7CisJCX0KKwkJaWYgKHNzY2FuZihhcmcsICIleCIsICZ0ZW1wKSAhPSAxIHx8ICh0ZW1wIDwgMCB8fCB0ZW1wID4gMjU1KSkgeworCQkJYmJfZXJyb3JfbXNnKCJcIiVzXCIgaXMgaW52YWxpZCBsbGFkZHIiLCBhcmcpOworCQkJcmV0dXJuIC0xOworCQl9CisJCWxsYWRkcltpXSA9IHRlbXA7CisJCWlmICghY3ApIHsKKwkJCWJyZWFrOworCQl9CisJCWFyZyA9IGNwOworCX0KKwlyZXR1cm4gaSsxOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9saWJpcHJvdXRlL2xsX21hcC5jIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL2xsX21hcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYjg1ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGxfbWFwLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczogQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICovCisKKyNpbmNsdWRlIDxuZXQvaWYuaD4gIC8qIHN0cnVjdCBpZnJlcSBhbmQgY28uICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImxpYm5ldGxpbmsuaCIKKyNpbmNsdWRlICJsbF9tYXAuaCIKKworc3RydWN0IGlkeG1hcCB7CisJc3RydWN0IGlkeG1hcCAqbmV4dDsKKwlpbnQgICAgICAgICAgICBpbmRleDsKKwlpbnQgICAgICAgICAgICB0eXBlOworCWludCAgICAgICAgICAgIGFsZW47CisJdW5zaWduZWQgICAgICAgZmxhZ3M7CisJdW5zaWduZWQgY2hhciAgYWRkcls4XTsKKwljaGFyICAgICAgICAgICBuYW1lWzE2XTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWR4bWFwICoqaWR4bWFwOyAvKiB0cmVhdCBhcyAqaWR4bWFwWzE2XSAqLworCitzdGF0aWMgc3RydWN0IGlkeG1hcCAqZmluZF9ieV9pbmRleChpbnQgaWR4KQoreworCXN0cnVjdCBpZHhtYXAgKmltOworCisJaWYgKGlkeG1hcCkKKwkJZm9yIChpbSA9IGlkeG1hcFtpZHggJiAweEZdOyBpbTsgaW0gPSBpbS0+bmV4dCkKKwkJCWlmIChpbS0+aW5kZXggPT0gaWR4KQorCQkJCXJldHVybiBpbTsKKwlyZXR1cm4gTlVMTDsKK30KKworaW50IEZBU1RfRlVOQyBsbF9yZW1lbWJlcl9pbmRleChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobyBVTlVTRURfUEFSQU0sCisJCXN0cnVjdCBubG1zZ2hkciAqbiwKKwkJdm9pZCAqYXJnIFVOVVNFRF9QQVJBTSkKK3sKKwlpbnQgaDsKKwlzdHJ1Y3QgaWZpbmZvbXNnICppZmkgPSBOTE1TR19EQVRBKG4pOworCXN0cnVjdCBpZHhtYXAgKmltLCAqKmltcDsKKwlzdHJ1Y3QgcnRhdHRyICp0YltJRkxBX01BWCsxXTsKKworCWlmIChuLT5ubG1zZ190eXBlICE9IFJUTV9ORVdMSU5LKQorCQlyZXR1cm4gMDsKKworCWlmIChuLT5ubG1zZ19sZW4gPCBOTE1TR19MRU5HVEgoc2l6ZW9mKGlmaSkpKQorCQlyZXR1cm4gLTE7CisKKwltZW1zZXQodGIsIDAsIHNpemVvZih0YikpOworCXBhcnNlX3J0YXR0cih0YiwgSUZMQV9NQVgsIElGTEFfUlRBKGlmaSksIElGTEFfUEFZTE9BRChuKSk7CisJaWYgKHRiW0lGTEFfSUZOQU1FXSA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCWlmICghaWR4bWFwKQorCQlpZHhtYXAgPSB4emFsbG9jKHNpemVvZihpZHhtYXBbMF0pICogMTYpOworCisJaCA9IGlmaS0+aWZpX2luZGV4ICYgMHhGOworCWZvciAoaW1wID0gJmlkeG1hcFtoXTsgKGltID0gKmltcCkgIT0gTlVMTDsgaW1wID0gJmltLT5uZXh0KQorCQlpZiAoaW0tPmluZGV4ID09IGlmaS0+aWZpX2luZGV4KQorCQkJZ290byBmb3VuZDsKKworCWltID0geG1hbGxvYyhzaXplb2YoKmltKSk7CisJaW0tPm5leHQgPSAqaW1wOworCWltLT5pbmRleCA9IGlmaS0+aWZpX2luZGV4OworCSppbXAgPSBpbTsKKyBmb3VuZDoKKwlpbS0+dHlwZSA9IGlmaS0+aWZpX3R5cGU7CisJaW0tPmZsYWdzID0gaWZpLT5pZmlfZmxhZ3M7CisJaWYgKHRiW0lGTEFfQUREUkVTU10pIHsKKwkJaW50IGFsZW47CisJCWltLT5hbGVuID0gYWxlbiA9IFJUQV9QQVlMT0FEKHRiW0lGTEFfQUREUkVTU10pOworCQlpZiAoYWxlbiA+IChpbnQpc2l6ZW9mKGltLT5hZGRyKSkKKwkJCWFsZW4gPSBzaXplb2YoaW0tPmFkZHIpOworCQltZW1jcHkoaW0tPmFkZHIsIFJUQV9EQVRBKHRiW0lGTEFfQUREUkVTU10pLCBhbGVuKTsKKwl9IGVsc2UgeworCQlpbS0+YWxlbiA9IDA7CisJCW1lbXNldChpbS0+YWRkciwgMCwgc2l6ZW9mKGltLT5hZGRyKSk7CisJfQorCXN0cmNweShpbS0+bmFtZSwgUlRBX0RBVEEodGJbSUZMQV9JRk5BTUVdKSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYworY29uc3QgY2hhciBGQVNUX0ZVTkMgKmxsX2lkeF9uMmEoaW50IGlkeC8qLCBjaGFyICpidWYqLykKK3sKKwlzdHJ1Y3QgaWR4bWFwICppbTsKKworCWlmIChpZHggPT0gMCkKKwkJcmV0dXJuICIqIjsKKwlpbSA9IGZpbmRfYnlfaW5kZXgoaWR4KTsKKwlpZiAoaW0pCisJCXJldHVybiBpbS0+bmFtZTsKKwkvL3NucHJpbnRmKGJ1ZiwgMTYsICJpZiVkIiwgaWR4KTsKKwkvL3JldHVybiBidWY7CisJcmV0dXJuIGF1dG9fc3RyaW5nKHhhc3ByaW50ZigiaWYlZCIsIGlkeCkpOworfQorCitjb25zdCBjaGFyIEZBU1RfRlVOQyAqbGxfaW5kZXhfdG9fbmFtZShpbnQgaWR4KQoreworCS8vc3RhdGljIGNoYXIgbmJ1ZlsxNl07CisJcmV0dXJuIGxsX2lkeF9uMmEoaWR4LyosIG5idWYqLyk7Cit9CisKKyNpZmRlZiBVTlVTRUQKK2ludCBsbF9pbmRleF90b190eXBlKGludCBpZHgpCit7CisJc3RydWN0IGlkeG1hcCAqaW07CisKKwlpZiAoaWR4ID09IDApCisJCXJldHVybiAtMTsKKwlpbSA9IGZpbmRfYnlfaW5kZXgoaWR4KTsKKwlpZiAoaW0pCisJCXJldHVybiBpbS0+dHlwZTsKKwlyZXR1cm4gLTE7Cit9CisjZW5kaWYKKwordW5zaWduZWQgRkFTVF9GVU5DIGxsX2luZGV4X3RvX2ZsYWdzKGludCBpZHgpCit7CisJc3RydWN0IGlkeG1hcCAqaW07CisKKwlpZiAoaWR4ID09IDApCisJCXJldHVybiAwOworCWltID0gZmluZF9ieV9pbmRleChpZHgpOworCWlmIChpbSkKKwkJcmV0dXJuIGltLT5mbGFnczsKKwlyZXR1cm4gMDsKK30KKworaW50IEZBU1RfRlVOQyB4bGxfbmFtZV90b19pbmRleChjb25zdCBjaGFyICpuYW1lKQoreworCWludCByZXQgPSAwOworCWludCBzb2NrX2ZkOworCisvKiBjYWNoaW5nIGlzIG5vdCB3YXJyYW50ZWQgLSBubyB1c2VycyB3aGljaCByZXBlYXRlZGx5IGNhbGwgaXQgKi8KKyNpZmRlZiBVTlVTRUQKKwlzdGF0aWMgY2hhciBuY2FjaGVbMTZdOworCXN0YXRpYyBpbnQgaWNhY2hlOworCisJc3RydWN0IGlkeG1hcCAqaW07CisJaW50IGk7CisKKwlpZiAobmFtZSA9PSBOVUxMKQorCQlnb3RvIG91dDsKKwlpZiAoaWNhY2hlICYmIHN0cmNtcChuYW1lLCBuY2FjaGUpID09IDApIHsKKwkJcmV0ID0gaWNhY2hlOworCQlnb3RvIG91dDsKKwl9CisJaWYgKGlkeG1hcCkgeworCQlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworCQkJZm9yIChpbSA9IGlkeG1hcFtpXTsgaW07IGltID0gaW0tPm5leHQpIHsKKwkJCQlpZiAoc3RyY21wKGltLT5uYW1lLCBuYW1lKSA9PSAwKSB7CisJCQkJCWljYWNoZSA9IGltLT5pbmRleDsKKwkJCQkJc3RyY3B5KG5jYWNoZSwgbmFtZSk7CisJCQkJCXJldCA9IGltLT5pbmRleDsKKwkJCQkJZ290byBvdXQ7CisJCQkJfQorCQkJfQorCQl9CisJfQorCS8qIFdlIGhhdmUgbm90IGZvdW5kIHRoZSBpbnRlcmZhY2UgaW4gb3VyIGNhY2hlLCBidXQgdGhlIGtlcm5lbAorCSAqIG1heSBzdGlsbCBrbm93IGFib3V0IGl0LiBPbmUgcmVhc29uIGlzIHRoYXQgd2UgbWF5IGJlIHVzaW5nCisJICogbW9kdWxlIG9uLWRlbWFuZCBsb2FkaW5nLCB3aGljaCBtZWFucyB0aGF0IHRoZSBrZXJuZWwgd2lsbAorCSAqIGxvYWQgdGhlIG1vZHVsZSBhbmQgbWFrZSB0aGUgaW50ZXJmYWNlIGV4aXN0IG9ubHkgd2hlbgorCSAqIHdlIGV4cGxpY2l0ZWx5IHJlcXVlc3QgaXQgKGNoZWNrIGZvciBkZXZfbG9hZCgpIGluIG5ldC9jb3JlL2Rldi5jKS4KKwkgKiBJIGNhbiB0aGluayBvZiBvdGhlciBzaW1pbGFyIHNjZW5hcmlvLCBidXQgdGhleSBhcmUgbGVzcyBjb21tb24uLi4KKwkgKiBKZWFuIElJICovCisjZW5kaWYKKworCXNvY2tfZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJaWYgKHNvY2tfZmQgPj0gMCkgeworCQlzdHJ1Y3QgaWZyZXEgaWZyOworCQlpbnQgdG1wOworCisJCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBuYW1lKTsKKwkJaWZyLmlmcl9pZmluZGV4ID0gLTE7CisJCXRtcCA9IGlvY3RsKHNvY2tfZmQsIFNJT0NHSUZJTkRFWCwgJmlmcik7CisJCWNsb3NlKHNvY2tfZmQpOworCQlpZiAodG1wID49IDApCisJCQkvKiBJbiB0aGVvcnksIHdlIHNob3VsZCByZWR1bXAgdGhlIGludGVyZmFjZSBsaXN0CisJCQkgKiB0byB1cGRhdGUgb3VyIGNhY2hlLCB0aGlzIGlzIGxlZnQgYXMgYW4gZXhlcmNpc2UKKwkJCSAqIHRvIHRoZSByZWFkZXIuLi4gSmVhbiBJSSAqLworCQkJcmV0ID0gaWZyLmlmcl9pZmluZGV4OworCX0KKy8qIG91dDoqLworCWlmIChyZXQgPD0gMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGZpbmQgZGV2aWNlICclcyciLCBuYW1lKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgRkFTVF9GVU5DIGxsX2luaXRfbWFwKHN0cnVjdCBydG5sX2hhbmRsZSAqcnRoKQoreworCXhydG5sX3dpbGRkdW1wX3JlcXVlc3QocnRoLCBBRl9VTlNQRUMsIFJUTV9HRVRMSU5LKTsKKwl4cnRubF9kdW1wX2ZpbHRlcihydGgsIGxsX3JlbWVtYmVyX2luZGV4LCBOVUxMKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvbGliaXByb3V0ZS9sbF9tYXAuaCBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9sbF9tYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWEzODNjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL2xsX21hcC5oCkBAIC0wLDAgKzEsMTcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworI2lmbmRlZiBMTF9NQVBfSAorI2RlZmluZSBMTF9NQVBfSCAxCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCitpbnQgbGxfcmVtZW1iZXJfaW5kZXgoY29uc3Qgc3RydWN0IHNvY2thZGRyX25sICp3aG8sIHN0cnVjdCBubG1zZ2hkciAqbiwgdm9pZCAqYXJnKSBGQVNUX0ZVTkM7CitpbnQgbGxfaW5pdF9tYXAoc3RydWN0IHJ0bmxfaGFuZGxlICpydGgpIEZBU1RfRlVOQzsKK2ludCB4bGxfbmFtZV90b19pbmRleChjb25zdCBjaGFyICpuYW1lKSBGQVNUX0ZVTkM7CisvL3N0YXRpYzogY29uc3QgY2hhciAqbGxfaWR4X24yYShpbnQgaWR4LCBjaGFyICpidWYpIEZBU1RfRlVOQzsKK2NvbnN0IGNoYXIgKmxsX2luZGV4X3RvX25hbWUoaW50IGlkeCkgRkFTVF9GVU5DOworLyogaW50IGxsX2luZGV4X3RvX3R5cGUoaW50IGlkeCk7ICovCit1bnNpZ25lZCBsbF9pbmRleF90b19mbGFncyhpbnQgaWR4KSBGQVNUX0ZVTkM7CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9saWJpcHJvdXRlL2xsX3Byb3RvLmMgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGxfcHJvdG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTJiNTNjCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL2xsX3Byb3RvLmMKQEAgLTAsMCArMSwxODQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczogQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInJ0X25hbWVzLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KKworLyogUGxlYXNlIGNvbmRpdGlvbmFsaXplIGV4b3RpYyBwcm90b2NvbHMgb24gQ09ORklHX3NvbWV0aGluZyAqLworCitzdGF0aWMgY29uc3QgdWludDE2X3QgbGxwcm90b19pZHNbXSA9IHsKKyNkZWZpbmUgX19QRihmLG4pIEVUSF9QXyMjZiwKK19fUEYoTE9PUCxsb29wKQorX19QRihQVVAscHVwKQorI2lmZGVmIEVUSF9QX1BVUEFUCitfX1BGKFBVUEFULHB1cGF0KQorI2VuZGlmCitfX1BGKElQLGlwKQorX19QRihYMjUseDI1KQorX19QRihBUlAsYXJwKQorX19QRihCUFEsYnBxKQorI2lmZGVmIEVUSF9QX0lFRUVQVVAKK19fUEYoSUVFRVBVUCxpZWVlcHVwKQorI2VuZGlmCisjaWZkZWYgRVRIX1BfSUVFRVBVUEFUCitfX1BGKElFRUVQVVBBVCxpZWVlcHVwYXQpCisjZW5kaWYKK19fUEYoREVDLGRlYykKK19fUEYoRE5BX0RMLGRuYV9kbCkKK19fUEYoRE5BX1JDLGRuYV9yYykKK19fUEYoRE5BX1JULGRuYV9ydCkKK19fUEYoTEFULGxhdCkKK19fUEYoRElBRyxkaWFnKQorX19QRihDVVNULGN1c3QpCitfX1BGKFNDQSxzY2EpCitfX1BGKFJBUlAscmFycCkKK19fUEYoQVRBTEssYXRhbGspCitfX1BGKEFBUlAsYWFycCkKK19fUEYoSVBYLGlweCkKK19fUEYoSVBWNixpcHY2KQorI2lmZGVmIEVUSF9QX1BQUF9ESVNDCitfX1BGKFBQUF9ESVNDLHBwcF9kaXNjKQorI2VuZGlmCisjaWZkZWYgRVRIX1BfUFBQX1NFUworX19QRihQUFBfU0VTLHBwcF9zZXMpCisjZW5kaWYKKyNpZmRlZiBFVEhfUF9BVE1NUE9BCitfX1BGKEFUTU1QT0EsYXRtbXBvYSkKKyNlbmRpZgorI2lmZGVmIEVUSF9QX0FUTUZBVEUKK19fUEYoQVRNRkFURSxhdG1mYXRlKQorI2VuZGlmCisKK19fUEYoODAyXzMsODAyXzMpCitfX1BGKEFYMjUsYXgyNSkKK19fUEYoQUxMLGFsbCkKK19fUEYoODAyXzIsODAyXzIpCitfX1BGKFNOQVAsc25hcCkKK19fUEYoRERDTVAsZGRjbXApCitfX1BGKFdBTl9QUFAsd2FuX3BwcCkKK19fUEYoUFBQX01QLHBwcF9tcCkKK19fUEYoTE9DQUxUQUxLLGxvY2FsdGFsaykKK19fUEYoUFBQVEFMSyxwcHB0YWxrKQorX19QRihUUl84MDJfMix0cl84MDJfMikKK19fUEYoTU9CSVRFWCxtb2JpdGV4KQorX19QRihDT05UUk9MLGNvbnRyb2wpCitfX1BGKElSREEsaXJkYSkKKyNpZmRlZiBFVEhfUF9FQ09ORVQKK19fUEYoRUNPTkVULGVjb25ldCkKKyNlbmRpZgorCisweDgxMDAsCitFVEhfUF9JUAorfTsKKyN1bmRlZiBfX1BGCisKKy8qIEtlZXAgZGVjbGFyYXRpb25zIGFib3ZlIGFuZCBiZWxvdyBpbiBzeW5jISAqLworCitzdGF0aWMgY29uc3QgY2hhciBsbHByb3RvX25hbWVzW10gPQorI2RlZmluZSBfX1BGKGYsbikgI24gIlwwIgorX19QRihMT09QLGxvb3ApCitfX1BGKFBVUCxwdXApCisjaWZkZWYgRVRIX1BfUFVQQVQKK19fUEYoUFVQQVQscHVwYXQpCisjZW5kaWYKK19fUEYoSVAsaXApCitfX1BGKFgyNSx4MjUpCitfX1BGKEFSUCxhcnApCitfX1BGKEJQUSxicHEpCisjaWZkZWYgRVRIX1BfSUVFRVBVUAorX19QRihJRUVFUFVQLGllZWVwdXApCisjZW5kaWYKKyNpZmRlZiBFVEhfUF9JRUVFUFVQQVQKK19fUEYoSUVFRVBVUEFULGllZWVwdXBhdCkKKyNlbmRpZgorX19QRihERUMsZGVjKQorX19QRihETkFfREwsZG5hX2RsKQorX19QRihETkFfUkMsZG5hX3JjKQorX19QRihETkFfUlQsZG5hX3J0KQorX19QRihMQVQsbGF0KQorX19QRihESUFHLGRpYWcpCitfX1BGKENVU1QsY3VzdCkKK19fUEYoU0NBLHNjYSkKK19fUEYoUkFSUCxyYXJwKQorX19QRihBVEFMSyxhdGFsaykKK19fUEYoQUFSUCxhYXJwKQorX19QRihJUFgsaXB4KQorX19QRihJUFY2LGlwdjYpCisjaWZkZWYgRVRIX1BfUFBQX0RJU0MKK19fUEYoUFBQX0RJU0MscHBwX2Rpc2MpCisjZW5kaWYKKyNpZmRlZiBFVEhfUF9QUFBfU0VTCitfX1BGKFBQUF9TRVMscHBwX3NlcykKKyNlbmRpZgorI2lmZGVmIEVUSF9QX0FUTU1QT0EKK19fUEYoQVRNTVBPQSxhdG1tcG9hKQorI2VuZGlmCisjaWZkZWYgRVRIX1BfQVRNRkFURQorX19QRihBVE1GQVRFLGF0bWZhdGUpCisjZW5kaWYKKworX19QRig4MDJfMyw4MDJfMykKK19fUEYoQVgyNSxheDI1KQorX19QRihBTEwsYWxsKQorX19QRig4MDJfMiw4MDJfMikKK19fUEYoU05BUCxzbmFwKQorX19QRihERENNUCxkZGNtcCkKK19fUEYoV0FOX1BQUCx3YW5fcHBwKQorX19QRihQUFBfTVAscHBwX21wKQorX19QRihMT0NBTFRBTEssbG9jYWx0YWxrKQorX19QRihQUFBUQUxLLHBwcHRhbGspCitfX1BGKFRSXzgwMl8yLHRyXzgwMl8yKQorX19QRihNT0JJVEVYLG1vYml0ZXgpCitfX1BGKENPTlRST0wsY29udHJvbCkKK19fUEYoSVJEQSxpcmRhKQorI2lmZGVmIEVUSF9QX0VDT05FVAorX19QRihFQ09ORVQsZWNvbmV0KQorI2VuZGlmCisKKyI4MDIuMVEiICJcMCIKKyJpcHY0IiAiXDAiCis7CisjdW5kZWYgX19QRgorCisKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQyBsbF9wcm90b19uMmEodW5zaWduZWQgc2hvcnQgaWQsIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBpOworCWlkID0gbnRvaHMoaWQpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxscHJvdG9faWRzKTsgaSsrKSB7CisJCWlmIChsbHByb3RvX2lkc1tpXSA9PSBpZCkKKwkJCXJldHVybiBudGhfc3RyaW5nKGxscHJvdG9fbmFtZXMsIGkpOworCX0KKwlzbnByaW50ZihidWYsIGxlbiwgIlsldV0iLCBpZCk7CisJcmV0dXJuIGJ1ZjsKK30KKworaW50IEZBU1RfRlVOQyBsbF9wcm90b19hMm4odW5zaWduZWQgc2hvcnQgKmlkLCBjaGFyICpidWYpCit7CisJdW5zaWduZWQgaTsKKwljb25zdCBjaGFyICpuYW1lID0gbGxwcm90b19uYW1lczsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShsbHByb3RvX2lkcyk7IGkrKykgeworCQlpZiAoc3RyY2FzZWNtcChuYW1lLCBidWYpID09IDApIHsKKwkJCWkgPSBsbHByb3RvX2lkc1tpXTsKKwkJCWdvdG8gZ29vZDsKKwkJfQorCQluYW1lICs9IHN0cmxlbihuYW1lKSArIDE7CisJfQorCWVycm5vID0gMDsKKwlpID0gYmJfc3RydG91KGJ1ZiwgTlVMTCwgMCk7CisJaWYgKGVycm5vIHx8IGkgPiAweGZmZmYpCisJCXJldHVybiAtMTsKKyBnb29kOgorCSppZCA9IGh0b25zKGkpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9saWJpcHJvdXRlL2xsX3R5cGVzLmMgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvbGxfdHlwZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjQyZTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL2xsX3R5cGVzLmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogQXV0aG9yczogQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICovCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPiAvKiBsaW51eC9pZl9hcnAuaCBuZWVkcyBpdCBvbiBzb21lIHN5c3RlbXMgKi8KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9hcnAuaD4KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKworY29uc3QgY2hhciogRkFTVF9GVU5DIGxsX3R5cGVfbjJhKGludCB0eXBlLCBjaGFyICpidWYpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgYXJwaHJkX25hbWVbXSA9CisJLyogMCwgICAgICAgICAgICAgICAgICAqLyAiZ2VuZXJpYyIgIlwwIgorCS8qIEFSUEhSRF9MT09QQkFDSywgICAgKi8gImxvb3BiYWNrIiAiXDAiCisJLyogQVJQSFJEX0VUSEVSLCAgICAgICAqLyAiZXRoZXIiICJcMCIKKyNpZmRlZiBBUlBIUkRfSU5GSU5JQkFORAorCS8qIEFSUEhSRF9JTkZJTklCQU5ELCAgKi8gImluZmluaWJhbmQiICJcMCIKKyNlbmRpZgorI2lmZGVmIEFSUEhSRF9JRUVFODAyX1RSCisJLyogQVJQSFJEX0lFRUU4MDIsICAgICAqLyAiaWVlZTgwMiIgIlwwIgorCS8qIEFSUEhSRF9JRUVFODAyX1RSLCAgKi8gInRyIiAiXDAiCisjZWxzZQorCS8qIEFSUEhSRF9JRUVFODAyLCAgICAgKi8gInRyIiAiXDAiCisjZW5kaWYKKyNpZmRlZiBBUlBIUkRfSUVFRTgwMjExCisJLyogQVJQSFJEX0lFRUU4MDIxMSwgICAqLyAiaWVlZTgwMi4xMSIgIlwwIgorI2VuZGlmCisjaWZkZWYgQVJQSFJEX0lFRUUxMzk0CisJLyogQVJQSFJEX0lFRUUxMzk0LCAgICAqLyAiaWVlZTEzOTQiICJcMCIKKyNlbmRpZgorCS8qIEFSUEhSRF9JUkRBLCAgICAgICAgKi8gImlyZGEiICJcMCIKKwkvKiBBUlBIUkRfU0xJUCwgICAgICAgICovICJzbGlwIiAiXDAiCisJLyogQVJQSFJEX0NTTElQLCAgICAgICAqLyAiY3NsaXAiICJcMCIKKwkvKiBBUlBIUkRfU0xJUDYsICAgICAgICovICJzbGlwNiIgIlwwIgorCS8qIEFSUEhSRF9DU0xJUDYsICAgICAgKi8gImNzbGlwNiIgIlwwIgorCS8qIEFSUEhSRF9QUFAsICAgICAgICAgKi8gInBwcCIgIlwwIgorCS8qIEFSUEhSRF9UVU5ORUwsICAgICAgKi8gImlwaXAiICJcMCIKKwkvKiBBUlBIUkRfVFVOTkVMNiwgICAgICovICJ0dW5uZWw2IiAiXDAiCisJLyogQVJQSFJEX1NJVCwgICAgICAgICAqLyAic2l0IiAiXDAiCisJLyogQVJQSFJEX0lQR1JFLCAgICAgICAqLyAiZ3JlIiAiXDAiCisjaWZkZWYgQVJQSFJEX1ZPSUQKKwkvKiBBUlBIUkRfVk9JRCwgICAgICAgICovICJ2b2lkIiAiXDAiCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQX1JBUkVfUFJPVE9DT0xTCisJLyogQVJQSFJEX0VFVEhFUiwgICAgICAqLyAiZWV0aGVyIiAiXDAiCisJLyogQVJQSFJEX0FYMjUsICAgICAgICAqLyAiYXgyNSIgIlwwIgorCS8qIEFSUEhSRF9QUk9ORVQsICAgICAgKi8gInByb25ldCIgIlwwIgorCS8qIEFSUEhSRF9DSEFPUywgICAgICAgKi8gImNoYW9zIiAiXDAiCisJLyogQVJQSFJEX0FSQ05FVCwgICAgICAqLyAiYXJjbmV0IiAiXDAiCisJLyogQVJQSFJEX0FQUExFVExLLCAgICAqLyAiYXRhbGsiICJcMCIKKwkvKiBBUlBIUkRfRExDSSwgICAgICAgICovICJkbGNpIiAiXDAiCisjaWZkZWYgQVJQSFJEX0FUTQorCS8qIEFSUEhSRF9BVE0sICAgICAgICAgKi8gImF0bSIgIlwwIgorI2VuZGlmCisJLyogQVJQSFJEX01FVFJJQ09NLCAgICAqLyAibWV0cmljb20iICJcMCIKKwkvKiBBUlBIUkRfUlNSVkQsICAgICAgICovICJyc3J2ZCIgIlwwIgorCS8qIEFSUEhSRF9BREFQVCwgICAgICAgKi8gImFkYXB0IiAiXDAiCisJLyogQVJQSFJEX1JPU0UsICAgICAgICAqLyAicm9zZSIgIlwwIgorCS8qIEFSUEhSRF9YMjUsICAgICAgICAgKi8gIngyNSIgIlwwIgorI2lmZGVmIEFSUEhSRF9IV1gyNQorCS8qIEFSUEhSRF9IV1gyNSwgICAgICAgKi8gImh3eDI1IiAiXDAiCisjZW5kaWYKKwkvKiBBUlBIUkRfSERMQywgICAgICAgICovICJoZGxjIiAiXDAiCisJLyogQVJQSFJEX0xBUEIsICAgICAgICAqLyAibGFwYiIgIlwwIgorI2lmZGVmIEFSUEhSRF9ERENNUAorCS8qIEFSUEhSRF9ERENNUCwgICAgICAgKi8gImRkY21wIiAiXDAiCisJLyogQVJQSFJEX1JBV0hETEMsICAgICAqLyAicmF3aGRsYyIgIlwwIgorI2VuZGlmCisJLyogQVJQSFJEX0ZSQUQsICAgICAgICAqLyAiZnJhZCIgIlwwIgorCS8qIEFSUEhSRF9TS0lQLCAgICAgICAgKi8gInNraXAiICJcMCIKKwkvKiBBUlBIUkRfTE9DQUxUTEssICAgICovICJsdGFsayIgIlwwIgorCS8qIEFSUEhSRF9GRERJLCAgICAgICAgKi8gImZkZGkiICJcMCIKKwkvKiBBUlBIUkRfQklGLCAgICAgICAgICovICJiaWYiICJcMCIKKwkvKiBBUlBIUkRfSVBERFAsICAgICAgICovICJpcC9kZHAiICJcMCIKKwkvKiBBUlBIUkRfUElNUkVHLCAgICAgICovICJwaW1yZWciICJcMCIKKwkvKiBBUlBIUkRfSElQUEksICAgICAgICovICJoaXBwaSIgIlwwIgorCS8qIEFSUEhSRF9BU0gsICAgICAgICAgKi8gImFzaCIgIlwwIgorCS8qIEFSUEhSRF9FQ09ORVQsICAgICAgKi8gImVjb25ldCIgIlwwIgorCS8qIEFSUEhSRF9GQ1BQLCAgICAgICAgKi8gImZjcHAiICJcMCIKKwkvKiBBUlBIUkRfRkNBTCwgICAgICAgICovICJmY2FsIiAiXDAiCisJLyogQVJQSFJEX0ZDUEwsICAgICAgICAqLyAiZmNwbCIgIlwwIgorCS8qIEFSUEhSRF9GQ0ZBQlJJQywgICAgKi8gImZjZmIwIiAiXDAiCisJLyogQVJQSFJEX0ZDRkFCUklDKzEsICAqLyAiZmNmYjEiICJcMCIKKwkvKiBBUlBIUkRfRkNGQUJSSUMrMiwgICovICJmY2ZiMiIgIlwwIgorCS8qIEFSUEhSRF9GQ0ZBQlJJQyszLCAgKi8gImZjZmIzIiAiXDAiCisJLyogQVJQSFJEX0ZDRkFCUklDKzQsICAqLyAiZmNmYjQiICJcMCIKKwkvKiBBUlBIUkRfRkNGQUJSSUMrNSwgICovICJmY2ZiNSIgIlwwIgorCS8qIEFSUEhSRF9GQ0ZBQlJJQys2LCAgKi8gImZjZmI2IiAiXDAiCisJLyogQVJQSFJEX0ZDRkFCUklDKzcsICAqLyAiZmNmYjciICJcMCIKKwkvKiBBUlBIUkRfRkNGQUJSSUMrOCwgICovICJmY2ZiOCIgIlwwIgorCS8qIEFSUEhSRF9GQ0ZBQlJJQys5LCAgKi8gImZjZmI5IiAiXDAiCisJLyogQVJQSFJEX0ZDRkFCUklDKzEwLCAqLyAiZmNmYjEwIiAiXDAiCisJLyogQVJQSFJEX0ZDRkFCUklDKzExLCAqLyAiZmNmYjExIiAiXDAiCisJLyogQVJQSFJEX0ZDRkFCUklDKzEyLCAqLyAiZmNmYjEyIiAiXDAiCisjZW5kaWYgLyogRkVBVFVSRV9JUF9SQVJFX1BST1RPQ09MUyAqLworCTsKKworCS8qIEtlZXAgdGhlc2UgYXJyYXlzIGluIHN5bmMhICovCisKKwlzdGF0aWMgY29uc3QgdWludDE2X3QgYXJwaHJkX3R5cGVbXSA9IHsKKwkwLCAgICAgICAgICAgICAgICAgIC8qICJnZW5lcmljIiAiXDAiICovCisJQVJQSFJEX0xPT1BCQUNLLCAgICAvKiAibG9vcGJhY2siICJcMCIgKi8KKwlBUlBIUkRfRVRIRVIsICAgICAgIC8qICJldGhlciIgIlwwIiAqLworI2lmZGVmIEFSUEhSRF9JTkZJTklCQU5ECisJQVJQSFJEX0lORklOSUJBTkQsICAvKiAiaW5maW5pYmFuZCIgIlwwIiAqLworI2VuZGlmCisjaWZkZWYgQVJQSFJEX0lFRUU4MDJfVFIKKwlBUlBIUkRfSUVFRTgwMiwgICAgIC8qICJpZWVlODAyIiAiXDAiICovCisJQVJQSFJEX0lFRUU4MDJfVFIsICAvKiAidHIiICJcMCIgKi8KKyNlbHNlCisJQVJQSFJEX0lFRUU4MDIsICAgICAvKiAidHIiICJcMCIgKi8KKyNlbmRpZgorI2lmZGVmIEFSUEhSRF9JRUVFODAyMTEKKwlBUlBIUkRfSUVFRTgwMjExLCAgIC8qICJpZWVlODAyLjExIiAiXDAiICovCisjZW5kaWYKKyNpZmRlZiBBUlBIUkRfSUVFRTEzOTQKKwlBUlBIUkRfSUVFRTEzOTQsICAgIC8qICJpZWVlMTM5NCIgIlwwIiAqLworI2VuZGlmCisJQVJQSFJEX0lSREEsICAgICAgICAvKiAiaXJkYSIgIlwwIiAqLworCUFSUEhSRF9TTElQLCAgICAgICAgLyogInNsaXAiICJcMCIgKi8KKwlBUlBIUkRfQ1NMSVAsICAgICAgIC8qICJjc2xpcCIgIlwwIiAqLworCUFSUEhSRF9TTElQNiwgICAgICAgLyogInNsaXA2IiAiXDAiICovCisJQVJQSFJEX0NTTElQNiwgICAgICAvKiAiY3NsaXA2IiAiXDAiICovCisJQVJQSFJEX1BQUCwgICAgICAgICAvKiAicHBwIiAiXDAiICovCisJQVJQSFJEX1RVTk5FTCwgICAgICAvKiAiaXBpcCIgIlwwIiAqLworCUFSUEhSRF9UVU5ORUw2LCAgICAgLyogInR1bm5lbDYiICJcMCIgKi8KKwlBUlBIUkRfU0lULCAgICAgICAgIC8qICJzaXQiICJcMCIgKi8KKwlBUlBIUkRfSVBHUkUsICAgICAgIC8qICJncmUiICJcMCIgKi8KKyNpZmRlZiBBUlBIUkRfVk9JRAorCUFSUEhSRF9WT0lELCAgICAgICAgLyogInZvaWQiICJcMCIgKi8KKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBfUkFSRV9QUk9UT0NPTFMKKwlBUlBIUkRfRUVUSEVSLCAgICAgIC8qICJlZXRoZXIiICJcMCIgKi8KKwlBUlBIUkRfQVgyNSwgICAgICAgIC8qICJheDI1IiAiXDAiICovCisJQVJQSFJEX1BST05FVCwgICAgICAvKiAicHJvbmV0IiAiXDAiICovCisJQVJQSFJEX0NIQU9TLCAgICAgICAvKiAiY2hhb3MiICJcMCIgKi8KKwlBUlBIUkRfQVJDTkVULCAgICAgIC8qICJhcmNuZXQiICJcMCIgKi8KKwlBUlBIUkRfQVBQTEVUTEssICAgIC8qICJhdGFsayIgIlwwIiAqLworCUFSUEhSRF9ETENJLCAgICAgICAgLyogImRsY2kiICJcMCIgKi8KKyNpZmRlZiBBUlBIUkRfQVRNCisJQVJQSFJEX0FUTSwgICAgICAgICAvKiAiYXRtIiAiXDAiICovCisjZW5kaWYKKwlBUlBIUkRfTUVUUklDT00sICAgIC8qICJtZXRyaWNvbSIgIlwwIiAqLworCUFSUEhSRF9SU1JWRCwgICAgICAgLyogInJzcnZkIiAiXDAiICovCisJQVJQSFJEX0FEQVBULCAgICAgICAvKiAiYWRhcHQiICJcMCIgKi8KKwlBUlBIUkRfUk9TRSwgICAgICAgIC8qICJyb3NlIiAiXDAiICovCisJQVJQSFJEX1gyNSwgICAgICAgICAvKiAieDI1IiAiXDAiICovCisjaWZkZWYgQVJQSFJEX0hXWDI1CisJQVJQSFJEX0hXWDI1LCAgICAgICAvKiAiaHd4MjUiICJcMCIgKi8KKyNlbmRpZgorCUFSUEhSRF9IRExDLCAgICAgICAgLyogImhkbGMiICJcMCIgKi8KKwlBUlBIUkRfTEFQQiwgICAgICAgIC8qICJsYXBiIiAiXDAiICovCisjaWZkZWYgQVJQSFJEX0REQ01QCisJQVJQSFJEX0REQ01QLCAgICAgICAvKiAiZGRjbXAiICJcMCIgKi8KKwlBUlBIUkRfUkFXSERMQywgICAgIC8qICJyYXdoZGxjIiAiXDAiICovCisjZW5kaWYKKwlBUlBIUkRfRlJBRCwgICAgICAgIC8qICJmcmFkIiAiXDAiICovCisJQVJQSFJEX1NLSVAsICAgICAgICAvKiAic2tpcCIgIlwwIiAqLworCUFSUEhSRF9MT0NBTFRMSywgICAgLyogImx0YWxrIiAiXDAiICovCisJQVJQSFJEX0ZEREksICAgICAgICAvKiAiZmRkaSIgIlwwIiAqLworCUFSUEhSRF9CSUYsICAgICAgICAgLyogImJpZiIgIlwwIiAqLworCUFSUEhSRF9JUEREUCwgICAgICAgLyogImlwL2RkcCIgIlwwIiAqLworCUFSUEhSRF9QSU1SRUcsICAgICAgLyogInBpbXJlZyIgIlwwIiAqLworCUFSUEhSRF9ISVBQSSwgICAgICAgLyogImhpcHBpIiAiXDAiICovCisJQVJQSFJEX0FTSCwgICAgICAgICAvKiAiYXNoIiAiXDAiICovCisJQVJQSFJEX0VDT05FVCwgICAgICAvKiAiZWNvbmV0IiAiXDAiICovCisJQVJQSFJEX0ZDUFAsICAgICAgICAvKiAiZmNwcCIgIlwwIiAqLworCUFSUEhSRF9GQ0FMLCAgICAgICAgLyogImZjYWwiICJcMCIgKi8KKwlBUlBIUkRfRkNQTCwgICAgICAgIC8qICJmY3BsIiAiXDAiICovCisJQVJQSFJEX0ZDRkFCUklDLCAgICAvKiAiZmNmYjAiICJcMCIgKi8KKwlBUlBIUkRfRkNGQUJSSUMrMSwgIC8qICJmY2ZiMSIgIlwwIiAqLworCUFSUEhSRF9GQ0ZBQlJJQysyLCAgLyogImZjZmIyIiAiXDAiICovCisJQVJQSFJEX0ZDRkFCUklDKzMsICAvKiAiZmNmYjMiICJcMCIgKi8KKwlBUlBIUkRfRkNGQUJSSUMrNCwgIC8qICJmY2ZiNCIgIlwwIiAqLworCUFSUEhSRF9GQ0ZBQlJJQys1LCAgLyogImZjZmI1IiAiXDAiICovCisJQVJQSFJEX0ZDRkFCUklDKzYsICAvKiAiZmNmYjYiICJcMCIgKi8KKwlBUlBIUkRfRkNGQUJSSUMrNywgIC8qICJmY2ZiNyIgIlwwIiAqLworCUFSUEhSRF9GQ0ZBQlJJQys4LCAgLyogImZjZmI4IiAiXDAiICovCisJQVJQSFJEX0ZDRkFCUklDKzksICAvKiAiZmNmYjkiICJcMCIgKi8KKwlBUlBIUkRfRkNGQUJSSUMrMTAsIC8qICJmY2ZiMTAiICJcMCIgKi8KKwlBUlBIUkRfRkNGQUJSSUMrMTEsIC8qICJmY2ZiMTEiICJcMCIgKi8KKwlBUlBIUkRfRkNGQUJSSUMrMTIsIC8qICJmY2ZiMTIiICJcMCIgKi8KKyNlbmRpZiAvKiBGRUFUVVJFX0lQX1JBUkVfUFJPVE9DT0xTICovCisJfTsKKworCXVuc2lnbmVkIGk7CisJY29uc3QgY2hhciAqYW5hbWUgPSBhcnBocmRfbmFtZTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShhcnBocmRfdHlwZSk7IGkrKykgeworCQlpZiAoYXJwaHJkX3R5cGVbaV0gPT0gdHlwZSkKKwkJCXJldHVybiBhbmFtZTsKKwkJYW5hbWUgKz0gc3RybGVuKGFuYW1lKSArIDE7CisJfQorCXNwcmludGYoYnVmLCAiWyVkXSIsIHR5cGUpOworCXJldHVybiBidWY7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2xpYmlwcm91dGUvcnRfbmFtZXMuYyBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9ydF9uYW1lcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZjJlOWIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvcnRfbmFtZXMuYwpAQCAtMCwwICsxLDI1NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOiBBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInJ0X25hbWVzLmgiCisKKyNkZWZpbmUgQ09ORkRJUiAgICAgICAgICBDT05GSUdfRkVBVFVSRV9JUF9ST1VURV9ESVIKKwordHlwZWRlZiBzdHJ1Y3QgcnRubF90YWJfdCB7CisJY29uc3QgY2hhciAqY2FjaGVkX3N0cjsKKwl1bnNpZ25lZCBjYWNoZWRfcmVzdWx0OworCS8qIHVwc3RyZWFtIHZlcnNpb24gc3dpdGNoZWQgdG8gYSBoYXNoIHRhYmxlIGFuZCByZW1vdmVkCisJICogaWQgPCAyNTYgbGltaXQuIEZvciBub3cgYmJveCBidW1wcyB0aGlzIGFycmF5IHNpemUgZnJvbSAyNTYKKwkgKiB0byAxMDI0LiBJZiB5b3UgcGxhbiB0byBjaGFuZ2UgdGhpcyB0byBhIGhhc2ggdGFibGUsCisJICogY29uc2lkZXIgbWVyZ2luZyBzZXZlcmFsIGhhc2ggdGFibGVzIHdlIGhhdmUgKGZvciBleGFtcGxlLAorCSAqIGF3ayBoYXMgcmVzaXphYmxlIG9uZSEKKwkgKi8KKyNkZWZpbmUgUlRfVEFCTEVfTUFYIDEwMjMKKwljb25zdCBjaGFyICp0YWJbUlRfVEFCTEVfTUFYKzFdOworfSBydG5sX3RhYl90OworCitzdGF0aWMgdm9pZCBydG5sX3RhYl9pbml0aWFsaXplKGNvbnN0IGNoYXIgKmZpbGUsIGNvbnN0IGNoYXIgKip0YWIpCit7CisJY2hhciAqdG9rZW5bMl07CisJY2hhciBmdWxsbmFtZVtzaXplb2YoQ09ORkRJUiIvcnRfZHNmaWVsZCIpICsgOF07CisJcGFyc2VyX3QgKnBhcnNlcjsKKworCXNwcmludGYoZnVsbG5hbWUsIENPTkZESVIiL3J0XyVzIiwgZmlsZSk7CisJcGFyc2VyID0gY29uZmlnX29wZW4yKGZ1bGxuYW1lLCBmb3Blbl9mb3JfcmVhZCk7CisJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW4sIDIsIDIsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQl1bnNpZ25lZCBpZCA9IGJiX3N0cnRvdSh0b2tlblswXSwgTlVMTCwgMCk7CisJCWlmIChpZCA+IFJUX1RBQkxFX01BWCkgeworCQkJYmJfZXJyb3JfbXNnKCJkYXRhYmFzZSAlcyBpcyBjb3JydXB0ZWQgYXQgbGluZSAlZCIsCisJCQkJZmlsZSwgcGFyc2VyLT5saW5lbm8pOworCQkJYnJlYWs7CisJCX0KKwkJdGFiW2lkXSA9IHhzdHJkdXAodG9rZW5bMV0pOworCX0KKwljb25maWdfY2xvc2UocGFyc2VyKTsKK30KKworc3RhdGljIGludCBydG5sX2EybihydG5sX3RhYl90ICp0YWIsIHVpbnQzMl90ICppZCwgY29uc3QgY2hhciAqYXJnLCBpbnQgYmFzZSkKK3sKKwl1bnNpZ25lZCBpOworCisJaWYgKHRhYi0+Y2FjaGVkX3N0ciAmJiBzdHJjbXAodGFiLT5jYWNoZWRfc3RyLCBhcmcpID09IDApIHsKKwkJKmlkID0gdGFiLT5jYWNoZWRfcmVzdWx0OworCQlyZXR1cm4gMDsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDw9IFJUX1RBQkxFX01BWDsgaSsrKSB7CisJCWlmICh0YWItPnRhYltpXQorCQkgJiYgc3RyY21wKHRhYi0+dGFiW2ldLCBhcmcpID09IDAKKwkJKSB7CisJCQl0YWItPmNhY2hlZF9zdHIgPSB0YWItPnRhYltpXTsKKwkJCXRhYi0+Y2FjaGVkX3Jlc3VsdCA9IGk7CisJCQkqaWQgPSBpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpID0gYmJfc3RydG91KGFyZywgTlVMTCwgYmFzZSk7CisJaWYgKGkgPiBSVF9UQUJMRV9NQVgpCisJCXJldHVybiAtMTsKKwkqaWQgPSBpOworCXJldHVybiAwOworfQorCisKK3N0YXRpYyBydG5sX3RhYl90ICpydG5sX3J0cHJvdF90YWI7CisKK3N0YXRpYyB2b2lkIHJ0bmxfcnRwcm90X2luaXRpYWxpemUodm9pZCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgaW5pdF90YWJbXSA9IHsKKwkJIm5vbmUiLAorCQkicmVkaXJlY3QiLAorCQkia2VybmVsIiwKKwkJImJvb3QiLAorCQkic3RhdGljIiwKKwkJTlVMTCwKKwkJTlVMTCwKKwkJTlVMTCwKKwkJImdhdGVkIiwKKwkJInJhIiwKKwkJIm1ydCIsCisJCSJ6ZWJyYSIsCisJCSJiaXJkIiwKKwl9OworCisJaWYgKHJ0bmxfcnRwcm90X3RhYikKKwkJcmV0dXJuOworCXJ0bmxfcnRwcm90X3RhYiA9IHh6YWxsb2Moc2l6ZW9mKCpydG5sX3J0cHJvdF90YWIpKTsKKwltZW1jcHkocnRubF9ydHByb3RfdGFiLT50YWIsIGluaXRfdGFiLCBzaXplb2YoaW5pdF90YWIpKTsKKwlydG5sX3RhYl9pbml0aWFsaXplKCJwcm90b3MiLCBydG5sX3J0cHJvdF90YWItPnRhYik7Cit9CisKKyNpZiAwIC8qIFVOVVNFRCAqLworY29uc3QgY2hhciogRkFTVF9GVU5DIHJ0bmxfcnRwcm90X24yYShpbnQgaWQpCit7CisJaWYgKGlkIDwgMCB8fCBpZCA+IFJUX1RBQkxFX01BWCkgeworCQlyZXR1cm4gaXRvYShpZCk7CisJfQorCisJcnRubF9ydHByb3RfaW5pdGlhbGl6ZSgpOworCisJaWYgKHJ0bmxfcnRwcm90X3RhYi0+dGFiW2lkXSkKKwkJcmV0dXJuIHJ0bmxfcnRwcm90X3RhYi0+dGFiW2lkXTsKKwlyZXR1cm4gaXRvYShpZCk7Cit9CisjZW5kaWYKKworaW50IEZBU1RfRlVOQyBydG5sX3J0cHJvdF9hMm4odWludDMyX3QgKmlkLCBjaGFyICphcmcpCit7CisJcnRubF9ydHByb3RfaW5pdGlhbGl6ZSgpOworCXJldHVybiBydG5sX2EybihydG5sX3J0cHJvdF90YWIsIGlkLCBhcmcsIDApOworfQorCisKK3N0YXRpYyBydG5sX3RhYl90ICpydG5sX3J0c2NvcGVfdGFiOworCitzdGF0aWMgdm9pZCBydG5sX3J0c2NvcGVfaW5pdGlhbGl6ZSh2b2lkKQoreworCWlmIChydG5sX3J0c2NvcGVfdGFiKQorCQlyZXR1cm47CisJcnRubF9ydHNjb3BlX3RhYiA9IHh6YWxsb2Moc2l6ZW9mKCpydG5sX3J0c2NvcGVfdGFiKSk7CisJcnRubF9ydHNjb3BlX3RhYi0+dGFiWzBdID0gImdsb2JhbCI7CisJcnRubF9ydHNjb3BlX3RhYi0+dGFiWzI1NV0gPSAibm93aGVyZSI7CisJcnRubF9ydHNjb3BlX3RhYi0+dGFiWzI1NF0gPSAiaG9zdCI7CisJcnRubF9ydHNjb3BlX3RhYi0+dGFiWzI1M10gPSAibGluayI7CisJcnRubF9ydHNjb3BlX3RhYi0+dGFiWzIwMF0gPSAic2l0ZSI7CisJcnRubF90YWJfaW5pdGlhbGl6ZSgic2NvcGVzIiwgcnRubF9ydHNjb3BlX3RhYi0+dGFiKTsKK30KKworY29uc3QgY2hhciogRkFTVF9GVU5DIHJ0bmxfcnRzY29wZV9uMmEoaW50IGlkKQoreworCWlmIChpZCA8IDAgfHwgaWQgPiBSVF9UQUJMRV9NQVgpIHsKKwkJcmV0dXJuIGl0b2EoaWQpOworCX0KKworCXJ0bmxfcnRzY29wZV9pbml0aWFsaXplKCk7CisKKwlpZiAocnRubF9ydHNjb3BlX3RhYi0+dGFiW2lkXSkKKwkJcmV0dXJuIHJ0bmxfcnRzY29wZV90YWItPnRhYltpZF07CisJcmV0dXJuIGl0b2EoaWQpOworfQorCitpbnQgRkFTVF9GVU5DIHJ0bmxfcnRzY29wZV9hMm4odWludDMyX3QgKmlkLCBjaGFyICphcmcpCit7CisJcnRubF9ydHNjb3BlX2luaXRpYWxpemUoKTsKKwlyZXR1cm4gcnRubF9hMm4ocnRubF9ydHNjb3BlX3RhYiwgaWQsIGFyZywgMCk7Cit9CisKKworc3RhdGljIHJ0bmxfdGFiX3QgKnJ0bmxfcnRyZWFsbV90YWI7CisKK3N0YXRpYyB2b2lkIHJ0bmxfcnRyZWFsbV9pbml0aWFsaXplKHZvaWQpCit7CisJaWYgKHJ0bmxfcnRyZWFsbV90YWIpIHJldHVybjsKKwlydG5sX3J0cmVhbG1fdGFiID0geHphbGxvYyhzaXplb2YoKnJ0bmxfcnRyZWFsbV90YWIpKTsKKwlydG5sX3J0cmVhbG1fdGFiLT50YWJbMF0gPSAidW5rbm93biI7CisJcnRubF90YWJfaW5pdGlhbGl6ZSgicmVhbG1zIiwgcnRubF9ydHJlYWxtX3RhYi0+dGFiKTsKK30KKworaW50IEZBU1RfRlVOQyBydG5sX3J0cmVhbG1fYTJuKHVpbnQzMl90ICppZCwgY2hhciAqYXJnKQoreworCXJ0bmxfcnRyZWFsbV9pbml0aWFsaXplKCk7CisJcmV0dXJuIHJ0bmxfYTJuKHJ0bmxfcnRyZWFsbV90YWIsIGlkLCBhcmcsIDApOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBfUlVMRQorY29uc3QgY2hhciogRkFTVF9GVU5DIHJ0bmxfcnRyZWFsbV9uMmEoaW50IGlkKQoreworCWlmIChpZCA8IDAgfHwgaWQgPiBSVF9UQUJMRV9NQVgpIHsKKwkJcmV0dXJuIGl0b2EoaWQpOworCX0KKworCXJ0bmxfcnRyZWFsbV9pbml0aWFsaXplKCk7CisKKwlpZiAocnRubF9ydHJlYWxtX3RhYi0+dGFiW2lkXSkKKwkJcmV0dXJuIHJ0bmxfcnRyZWFsbV90YWItPnRhYltpZF07CisJcmV0dXJuIGl0b2EoaWQpOworfQorI2VuZGlmCisKKworc3RhdGljIHJ0bmxfdGFiX3QgKnJ0bmxfcnRkc2ZpZWxkX3RhYjsKKworc3RhdGljIHZvaWQgcnRubF9ydGRzZmllbGRfaW5pdGlhbGl6ZSh2b2lkKQoreworCWlmIChydG5sX3J0ZHNmaWVsZF90YWIpIHJldHVybjsKKwlydG5sX3J0ZHNmaWVsZF90YWIgPSB4emFsbG9jKHNpemVvZigqcnRubF9ydGRzZmllbGRfdGFiKSk7CisJcnRubF9ydGRzZmllbGRfdGFiLT50YWJbMF0gPSAiMCI7CisJcnRubF90YWJfaW5pdGlhbGl6ZSgiZHNmaWVsZCIsIHJ0bmxfcnRkc2ZpZWxkX3RhYi0+dGFiKTsKK30KKworY29uc3QgY2hhciogRkFTVF9GVU5DIHJ0bmxfZHNmaWVsZF9uMmEoaW50IGlkKQoreworCWlmIChpZCA8IDAgfHwgaWQgPiBSVF9UQUJMRV9NQVgpIHsKKwkJcmV0dXJuIGl0b2EoaWQpOworCX0KKworCXJ0bmxfcnRkc2ZpZWxkX2luaXRpYWxpemUoKTsKKworCWlmIChydG5sX3J0ZHNmaWVsZF90YWItPnRhYltpZF0pCisJCXJldHVybiBydG5sX3J0ZHNmaWVsZF90YWItPnRhYltpZF07CisJcmV0dXJuIGl0b2EoaWQpOworfQorCitpbnQgRkFTVF9GVU5DIHJ0bmxfZHNmaWVsZF9hMm4odWludDMyX3QgKmlkLCBjaGFyICphcmcpCit7CisJcnRubF9ydGRzZmllbGRfaW5pdGlhbGl6ZSgpOworCXJldHVybiBydG5sX2EybihydG5sX3J0ZHNmaWVsZF90YWIsIGlkLCBhcmcsIDE2KTsKK30KKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBfUlVMRQorc3RhdGljIHJ0bmxfdGFiX3QgKnJ0bmxfcnR0YWJsZV90YWI7CisKK3N0YXRpYyB2b2lkIHJ0bmxfcnR0YWJsZV9pbml0aWFsaXplKHZvaWQpCit7CisJaWYgKHJ0bmxfcnR0YWJsZV90YWIpCisJCXJldHVybjsKKworCXJ0bmxfcnR0YWJsZV90YWIgPSB4emFsbG9jKHNpemVvZigqcnRubF9ydHRhYmxlX3RhYikpOworCXJ0bmxfcnR0YWJsZV90YWItPnRhYlswXSA9ICJ1bnNwZWMiOworCXJ0bmxfcnR0YWJsZV90YWItPnRhYlsyNTVdID0gImxvY2FsIjsKKwlydG5sX3J0dGFibGVfdGFiLT50YWJbMjU0XSA9ICJtYWluIjsKKwlydG5sX3J0dGFibGVfdGFiLT50YWJbMjUzXSA9ICJkZWZhdWx0IjsKKwlydG5sX3RhYl9pbml0aWFsaXplKCJ0YWJsZXMiLCBydG5sX3J0dGFibGVfdGFiLT50YWIpOworfQorCitjb25zdCBjaGFyKiBGQVNUX0ZVTkMgcnRubF9ydHRhYmxlX24yYShpbnQgaWQpCit7CisJaWYgKGlkIDwgMCB8fCBpZCA+IFJUX1RBQkxFX01BWCkgeworCQlyZXR1cm4gaXRvYShpZCk7CisJfQorCisJcnRubF9ydHRhYmxlX2luaXRpYWxpemUoKTsKKworCWlmIChydG5sX3J0dGFibGVfdGFiLT50YWJbaWRdKQorCQlyZXR1cm4gcnRubF9ydHRhYmxlX3RhYi0+dGFiW2lkXTsKKwlyZXR1cm4gaXRvYShpZCk7Cit9CisKK2ludCBGQVNUX0ZVTkMgcnRubF9ydHRhYmxlX2Eybih1aW50MzJfdCAqaWQsIGNoYXIgKmFyZykKK3sKKwlydG5sX3J0dGFibGVfaW5pdGlhbGl6ZSgpOworCXJldHVybiBydG5sX2EybihydG5sX3J0dGFibGVfdGFiLCBpZCwgYXJnLCAwKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2xpYmlwcm91dGUvcnRfbmFtZXMuaCBiL25ldHdvcmtpbmcvbGliaXByb3V0ZS9ydF9uYW1lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OTMyZDYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvcnRfbmFtZXMuaApAQCAtMCwwICsxLDI5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKyNpZm5kZWYgUlRfTkFNRVNfSAorI2RlZmluZSBSVF9OQU1FU19IIDEKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKK2V4dGVybiBjb25zdCBjaGFyKiBydG5sX3J0cHJvdF9uMmEoaW50IGlkKSBGQVNUX0ZVTkM7CitleHRlcm4gY29uc3QgY2hhciogcnRubF9ydHNjb3BlX24yYShpbnQgaWQpIEZBU1RfRlVOQzsKK2V4dGVybiBjb25zdCBjaGFyKiBydG5sX3J0cmVhbG1fbjJhKGludCBpZCkgRkFTVF9GVU5DOworZXh0ZXJuIGNvbnN0IGNoYXIqIHJ0bmxfZHNmaWVsZF9uMmEoaW50IGlkKSBGQVNUX0ZVTkM7CitleHRlcm4gY29uc3QgY2hhciogcnRubF9ydHRhYmxlX24yYShpbnQgaWQpIEZBU1RfRlVOQzsKK2V4dGVybiBpbnQgcnRubF9ydHByb3RfYTJuKHVpbnQzMl90ICppZCwgY2hhciAqYXJnKSBGQVNUX0ZVTkM7CitleHRlcm4gaW50IHJ0bmxfcnRzY29wZV9hMm4odWludDMyX3QgKmlkLCBjaGFyICphcmcpIEZBU1RfRlVOQzsKK2V4dGVybiBpbnQgcnRubF9ydHJlYWxtX2Eybih1aW50MzJfdCAqaWQsIGNoYXIgKmFyZykgRkFTVF9GVU5DOworZXh0ZXJuIGludCBydG5sX2RzZmllbGRfYTJuKHVpbnQzMl90ICppZCwgY2hhciAqYXJnKSBGQVNUX0ZVTkM7CitleHRlcm4gaW50IHJ0bmxfcnR0YWJsZV9hMm4odWludDMyX3QgKmlkLCBjaGFyICphcmcpIEZBU1RfRlVOQzsKKworZXh0ZXJuIGNvbnN0IGNoYXIqIGxsX3R5cGVfbjJhKGludCB0eXBlLCBjaGFyICpidWYpIEZBU1RfRlVOQzsKKworZXh0ZXJuIGNvbnN0IGNoYXIqIGxsX2FkZHJfbjJhKHVuc2lnbmVkIGNoYXIgKmFkZHIsIGludCBhbGVuLCBpbnQgdHlwZSwKKwkJCQljaGFyICpidWYsIGludCBibGVuKSBGQVNUX0ZVTkM7CitleHRlcm4gaW50IGxsX2FkZHJfYTJuKHVuc2lnbmVkIGNoYXIgKmxsYWRkciwgaW50IGxlbiwgY2hhciAqYXJnKSBGQVNUX0ZVTkM7CisKK2V4dGVybiBjb25zdCBjaGFyKiBsbF9wcm90b19uMmEodW5zaWduZWQgc2hvcnQgaWQsIGNoYXIgKmJ1ZiwgaW50IGxlbikgRkFTVF9GVU5DOworZXh0ZXJuIGludCBsbF9wcm90b19hMm4odW5zaWduZWQgc2hvcnQgKmlkLCBjaGFyICpidWYpIEZBU1RfRlVOQzsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL2xpYmlwcm91dGUvcnRtX21hcC5jIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL3J0bV9tYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzYzZGEwCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL3J0bV9tYXAuYwpAQCAtMCwwICsxLDExNCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOiBBbGV4ZXkgS3V6bmV0c292LCA8a3V6bmV0QG1zMi5pbnIuYWMucnU+CisgKi8KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAicnRfbmFtZXMuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCitjb25zdCBjaGFyKiBGQVNUX0ZVTkMgcnRubF9ydG50eXBlX24yYShpbnQgaWQpCit7CisJc3dpdGNoIChpZCkgeworCWNhc2UgUlROX1VOU1BFQzoKKwkJcmV0dXJuICJub25lIjsKKwljYXNlIFJUTl9VTklDQVNUOgorCQlyZXR1cm4gInVuaWNhc3QiOworCWNhc2UgUlROX0xPQ0FMOgorCQlyZXR1cm4gImxvY2FsIjsKKwljYXNlIFJUTl9CUk9BRENBU1Q6CisJCXJldHVybiAiYnJvYWRjYXN0IjsKKwljYXNlIFJUTl9BTllDQVNUOgorCQlyZXR1cm4gImFueWNhc3QiOworCWNhc2UgUlROX01VTFRJQ0FTVDoKKwkJcmV0dXJuICJtdWx0aWNhc3QiOworCWNhc2UgUlROX0JMQUNLSE9MRToKKwkJcmV0dXJuICJibGFja2hvbGUiOworCWNhc2UgUlROX1VOUkVBQ0hBQkxFOgorCQlyZXR1cm4gInVucmVhY2hhYmxlIjsKKwljYXNlIFJUTl9QUk9ISUJJVDoKKwkJcmV0dXJuICJwcm9oaWJpdCI7CisJY2FzZSBSVE5fVEhST1c6CisJCXJldHVybiAidGhyb3ciOworCWNhc2UgUlROX05BVDoKKwkJcmV0dXJuICJuYXQiOworCWNhc2UgUlROX1hSRVNPTFZFOgorCQlyZXR1cm4gInhyZXNvbHZlIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gaXRvYShpZCk7CisJfQorfQorCisKK2ludCBGQVNUX0ZVTkMgcnRubF9ydG50eXBlX2EybihpbnQgKmlkLCBjaGFyICphcmcpCit7CisJc3RhdGljIGNvbnN0IGNoYXIga2V5d29yZHNbXSBBTElHTjEgPQorCQkibG9jYWxcMCIibmF0XDAiImJyb2FkY2FzdFwwIiJicmRcMCIiYW55Y2FzdFwwIgorCQkibXVsdGljYXN0XDAiInByb2hpYml0XDAiInVucmVhY2hhYmxlXDAiImJsYWNraG9sZVwwIgorCQkieHJlc29sdmVcMCIidW5pY2FzdFwwIiJ0aHJvd1wwIjsKKwllbnVtIHsKKwkJQVJHX2xvY2FsID0gMSwgQVJHX25hdCwgQVJHX2Jyb2FkY2FzdCwgQVJHX2JyZCwgQVJHX2FueWNhc3QsCisJCUFSR19tdWx0aWNhc3QsIEFSR19wcm9oaWJpdCwgQVJHX3VucmVhY2hhYmxlLCBBUkdfYmxhY2tob2xlLAorCQlBUkdfeHJlc29sdmUsIEFSR191bmljYXN0LCBBUkdfdGhyb3cKKwl9OworCWNvbnN0IHNtYWxsdWludCBrZXkgPSBpbmRleF9pbl9zdWJzdHJpbmdzKGtleXdvcmRzLCBhcmcpICsgMTsKKwljaGFyICplbmQ7CisJdW5zaWduZWQgbG9uZyByZXM7CisKKwlpZiAoa2V5ID09IEFSR19sb2NhbCkKKwkJcmVzID0gUlROX0xPQ0FMOworCWVsc2UgaWYgKGtleSA9PSBBUkdfbmF0KQorCQlyZXMgPSBSVE5fTkFUOworCWVsc2UgaWYgKGtleSA9PSBBUkdfYnJvYWRjYXN0IHx8IGtleSA9PSBBUkdfYnJkKQorCQlyZXMgPSBSVE5fQlJPQURDQVNUOworCWVsc2UgaWYgKGtleSA9PSBBUkdfYW55Y2FzdCkKKwkJcmVzID0gUlROX0FOWUNBU1Q7CisJZWxzZSBpZiAoa2V5ID09IEFSR19tdWx0aWNhc3QpCisJCXJlcyA9IFJUTl9NVUxUSUNBU1Q7CisJZWxzZSBpZiAoa2V5ID09IEFSR19wcm9oaWJpdCkKKwkJcmVzID0gUlROX1BST0hJQklUOworCWVsc2UgaWYgKGtleSA9PSBBUkdfdW5yZWFjaGFibGUpCisJCXJlcyA9IFJUTl9VTlJFQUNIQUJMRTsKKwllbHNlIGlmIChrZXkgPT0gQVJHX2JsYWNraG9sZSkKKwkJcmVzID0gUlROX0JMQUNLSE9MRTsKKwllbHNlIGlmIChrZXkgPT0gQVJHX3hyZXNvbHZlKQorCQlyZXMgPSBSVE5fWFJFU09MVkU7CisJZWxzZSBpZiAoa2V5ID09IEFSR191bmljYXN0KQorCQlyZXMgPSBSVE5fVU5JQ0FTVDsKKwllbHNlIGlmIChrZXkgPT0gQVJHX3Rocm93KQorCQlyZXMgPSBSVE5fVEhST1c7CisJZWxzZSB7CisJCXJlcyA9IHN0cnRvdWwoYXJnLCAmZW5kLCAwKTsKKwkJaWYgKGVuZCA9PSBhcmcgfHwgKmVuZCB8fCByZXMgPiAyNTUpCisJCQlyZXR1cm4gLTE7CisJfQorCSppZCA9IHJlczsKKwlyZXR1cm4gMDsKK30KKworaW50IEZBU1RfRlVOQyBnZXRfcnRfcmVhbG1zKHVpbnQzMl90ICpyZWFsbXMsIGNoYXIgKmFyZykKK3sKKwl1aW50MzJfdCByZWFsbSA9IDA7CisJY2hhciAqcCA9IHN0cmNocihhcmcsICcvJyk7CisKKwkqcmVhbG1zID0gMDsKKwlpZiAocCkgeworCQkqcCA9IDA7CisJCWlmIChydG5sX3J0cmVhbG1fYTJuKHJlYWxtcywgYXJnKSkgeworCQkJKnAgPSAnLyc7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJKnJlYWxtcyA8PD0gMTY7CisJCSpwID0gJy8nOworCQlhcmcgPSBwKzE7CisJfQorCWlmICgqYXJnICYmIHJ0bmxfcnRyZWFsbV9hMm4oJnJlYWxtLCBhcmcpKQorCQlyZXR1cm4gLTE7CisJKnJlYWxtcyB8PSByZWFsbTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvbGliaXByb3V0ZS9ydG1fbWFwLmggYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvcnRtX21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYjY2NTEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvcnRtX21hcC5oCkBAIC0wLDAgKzEsMTQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworI2lmbmRlZiBSVE1fTUFQX0gKKyNkZWZpbmUgUlRNX01BUF9IIDEKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKK2NvbnN0IGNoYXIgKnJ0bmxfcnRudHlwZV9uMmEoaW50IGlkKSBGQVNUX0ZVTkM7CitpbnQgcnRubF9ydG50eXBlX2EybihpbnQgKmlkLCBjaGFyICphcmcpIEZBU1RfRlVOQzsKKworaW50IGdldF9ydF9yZWFsbXModWludDMyX3QgKnJlYWxtcywgY2hhciAqYXJnKSBGQVNUX0ZVTkM7CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9saWJpcHJvdXRlL3V0aWxzLmMgYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvdXRpbHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGZlMzA2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL3V0aWxzLmMKQEAgLTAsMCArMSwyOTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQXV0aG9yczogQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqIENoYW5nZXM6CisgKgorICogUmFuaSBBc3NhZiA8cmFuaUBtYWdpYy5tZXRhd2lyZS5jb20+IDk4MDkyOTogcmVzb2x2ZSBhZGRyZXNzZXMKKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgImluZXRfY29tbW9uLmgiCisKK3Vuc2lnbmVkIGdldF91bnNpZ25lZChjaGFyICphcmcsIGNvbnN0IGNoYXIgKmVycm1zZykKK3sKKwl1bnNpZ25lZCBsb25nIHJlczsKKwljaGFyICpwdHI7CisKKwlpZiAoKmFyZykgeworCQlyZXMgPSBzdHJ0b3VsKGFyZywgJnB0ciwgMCk7CisvL0ZJWE1FOiAiIiB3aWxsIGJlIGFjY2VwdGVkIHRvbywgaXMgaXQgY29ycmVjdD8hCisJCWlmICghKnB0ciAmJiByZXMgPD0gVUlOVF9NQVgpIHsKKwkJCXJldHVybiByZXM7CisJCX0KKwl9CisJaW52YXJnKGFyZywgZXJybXNnKTsgLyogZG9lcyBub3QgcmV0dXJuICovCit9CisKK3VpbnQzMl90IGdldF91MzIoY2hhciAqYXJnLCBjb25zdCBjaGFyICplcnJtc2cpCit7CisJdW5zaWduZWQgbG9uZyByZXM7CisJY2hhciAqcHRyOworCisJaWYgKCphcmcpIHsKKwkJcmVzID0gc3RydG91bChhcmcsICZwdHIsIDApOworLy9GSVhNRTogIiIgd2lsbCBiZSBhY2NlcHRlZCB0b28sIGlzIGl0IGNvcnJlY3Q/IQorCQlpZiAoISpwdHIgJiYgcmVzIDw9IDB4RkZGRkZGRkZVTCkgeworCQkJcmV0dXJuIHJlczsKKwkJfQorCX0KKwlpbnZhcmcoYXJnLCBlcnJtc2cpOyAvKiBkb2VzIG5vdCByZXR1cm4gKi8KK30KKwordWludDE2X3QgZ2V0X3UxNihjaGFyICphcmcsIGNvbnN0IGNoYXIgKmVycm1zZykKK3sKKwl1bnNpZ25lZCBsb25nIHJlczsKKwljaGFyICpwdHI7CisKKwlpZiAoKmFyZykgeworCQlyZXMgPSBzdHJ0b3VsKGFyZywgJnB0ciwgMCk7CisvL0ZJWE1FOiAiIiB3aWxsIGJlIGFjY2VwdGVkIHRvbywgaXMgaXQgY29ycmVjdD8hCisJCWlmICghKnB0ciAmJiByZXMgPD0gMHhGRkZGKSB7CisJCQlyZXR1cm4gcmVzOworCQl9CisJfQorCWludmFyZyhhcmcsIGVycm1zZyk7IC8qIGRvZXMgbm90IHJldHVybiAqLworfQorCitpbnQgZ2V0X2FkZHJfMShpbmV0X3ByZWZpeCAqYWRkciwgY2hhciAqbmFtZSwgaW50IGZhbWlseSkKK3sKKwltZW1zZXQoYWRkciwgMCwgc2l6ZW9mKCphZGRyKSk7CisKKwlpZiAoc3RyY21wKG5hbWUsICJkZWZhdWx0IikgPT0gMAorCSB8fCBzdHJjbXAobmFtZSwgImFsbCIpID09IDAKKwkgfHwgc3RyY21wKG5hbWUsICJhbnkiKSA9PSAwCisJKSB7CisJCWFkZHItPmZhbWlseSA9IGZhbWlseTsKKwkJYWRkci0+Ynl0ZWxlbiA9IChmYW1pbHkgPT0gQUZfSU5FVDYgPyAxNiA6IDQpOworCQlhZGRyLT5iaXRsZW4gPSAtMTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKHN0cmNocihuYW1lLCAnOicpKSB7CisJCWFkZHItPmZhbWlseSA9IEFGX0lORVQ2OworCQlpZiAoZmFtaWx5ICE9IEFGX1VOU1BFQyAmJiBmYW1pbHkgIT0gQUZfSU5FVDYpCisJCQlyZXR1cm4gLTE7CisJCWlmIChpbmV0X3B0b24oQUZfSU5FVDYsIG5hbWUsIGFkZHItPmRhdGEpIDw9IDApCisJCQlyZXR1cm4gLTE7CisJCWFkZHItPmJ5dGVsZW4gPSAxNjsKKwkJYWRkci0+Yml0bGVuID0gLTE7CisJCXJldHVybiAwOworCX0KKworCWlmIChmYW1pbHkgIT0gQUZfVU5TUEVDICYmIGZhbWlseSAhPSBBRl9JTkVUKQorCQlyZXR1cm4gLTE7CisKKwkvKiBUcnkgdG8gcGFyc2UgaXQgYXMgSVB2NCAqLworCWFkZHItPmZhbWlseSA9IEFGX0lORVQ7CisjaWYgMCAvKiBEb2Vzbid0IGhhbmRsZSBlLmcuICIxMC4xMCIsIGZvciBleGFtcGxlLCAiaXAgciBsIHJvb3QgMTAuMTAvMTYiICovCisJaWYgKGluZXRfcHRvbihBRl9JTkVULCBuYW1lLCBhZGRyLT5kYXRhKSA8PSAwKQorCQlyZXR1cm4gLTE7CisjZWxzZQorCXsKKwkJdW5zaWduZWQgaSA9IDA7CisJCXVuc2lnbmVkIG4gPSAwOworCQljb25zdCBjaGFyICpjcCA9IG5hbWUgLSAxOworCQl3aGlsZSAoKisrY3ApIHsKKwkJCWlmICgodW5zaWduZWQgY2hhcikoKmNwIC0gJzAnKSA8PSA5KSB7CisJCQkJbiA9IDEwICogbiArICh1bnNpZ25lZCBjaGFyKSgqY3AgLSAnMCcpOworCQkJCWlmIChuID49IDI1NikKKwkJCQkJcmV0dXJuIC0xOworCQkJCSgodWludDhfdCopYWRkci0+ZGF0YSlbaV0gPSBuOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCpjcCA9PSAnLicgJiYgKytpIDw9IDMpIHsKKwkJCQluID0gMDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKyNlbmRpZgorCWFkZHItPmJ5dGVsZW4gPSA0OworCWFkZHItPmJpdGxlbiA9IC0xOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9wcmVmaXhfMShpbmV0X3ByZWZpeCAqZHN0LCBjaGFyICphcmcsIGludCBmYW1pbHkpCit7CisJY2hhciAqc2xhc2g7CisKKwltZW1zZXQoZHN0LCAwLCBzaXplb2YoKmRzdCkpOworCisJaWYgKHN0cmNtcChhcmcsICJkZWZhdWx0IikgPT0gMAorCSB8fCBzdHJjbXAoYXJnLCAiYWxsIikgPT0gMAorCSB8fCBzdHJjbXAoYXJnLCAiYW55IikgPT0gMAorCSkgeworCQlkc3QtPmZhbWlseSA9IGZhbWlseTsKKwkJLypkc3QtPmJ5dGVsZW4gPSAwOyAtIGRvbmUgYnkgbWVtc2V0ICovCisJCS8qZHN0LT5iaXRsZW4gPSAwOyovCisJCXJldHVybjsKKwl9CisKKwlzbGFzaCA9IHN0cmNocihhcmcsICcvJyk7CisJaWYgKHNsYXNoKQorCQkqc2xhc2ggPSAnXDAnOworCisJaWYgKGdldF9hZGRyXzEoZHN0LCBhcmcsIGZhbWlseSkgPT0gMCkgeworCQlkc3QtPmJpdGxlbiA9IChkc3QtPmZhbWlseSA9PSBBRl9JTkVUNikgPyAxMjggOiAzMjsKKwkJaWYgKHNsYXNoKSB7CisJCQl1bnNpZ25lZCBwbGVuOworCQkJaW5ldF9wcmVmaXggbmV0bWFza19wZng7CisKKwkJCW5ldG1hc2tfcGZ4LmZhbWlseSA9IEFGX1VOU1BFQzsKKwkJCXBsZW4gPSBiYl9zdHJ0b3Uoc2xhc2ggKyAxLCBOVUxMLCAwKTsKKwkJCWlmICgoZXJybm8gfHwgcGxlbiA+IGRzdC0+Yml0bGVuKQorCQkJICYmIGdldF9hZGRyXzEoJm5ldG1hc2tfcGZ4LCBzbGFzaCArIDEsIGZhbWlseSkgIT0gMAorCQkJKSB7CisJCQkJZ290byBiYWQ7CisJCQl9CisJCQlpZiAobmV0bWFza19wZnguZmFtaWx5ID09IEFGX0lORVQpIHsKKwkJCQkvKiBmaWxsIGluIHByZWZpeCBsZW5ndGggb2YgZG90dGVkIHF1YWQgKi8KKwkJCQl1aW50MzJfdCBtYXNrID0gbnRvaGwobmV0bWFza19wZnguZGF0YVswXSk7CisJCQkJdWludDMyX3QgaG9zdCA9IH5tYXNrOworCisJCQkJLyogYSB2YWxpZCBuZXRtYXNrIG11c3QgYmUgMl5uIC0gMSAqLworCQkJCWlmIChob3N0ICYgKGhvc3QgKyAxKSkKKwkJCQkJZ290byBiYWQ7CisKKwkJCQlmb3IgKHBsZW4gPSAwOyBtYXNrOyBtYXNrIDw8PSAxKQorCQkJCQkrK3BsZW47CisJCQkJaWYgKHBsZW4gPiBkc3QtPmJpdGxlbikKKwkJCQkJZ290byBiYWQ7CisJCQkJLyogZHN0LT5mbGFncyB8PSBQUkVGSVhMRU5fU1BFQ0lGSUVEOyAqLworCQkJfQorCQkJZHN0LT5iaXRsZW4gPSBwbGVuOworCQl9CisJfQorCisJaWYgKHNsYXNoKQorCQkqc2xhc2ggPSAnLyc7CisJcmV0dXJuOworIGJhZDoKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYW4gJXMgJXMgaXMgZXhwZWN0ZWQgcmF0aGVyIHRoYW4gXCIlc1wiIiwgImluZXQiLCAicHJlZml4IiwgYXJnKTsKK30KKworaW50IGdldF9hZGRyKGluZXRfcHJlZml4ICpkc3QsIGNoYXIgKmFyZywgaW50IGZhbWlseSkKK3sKKwlpZiAoZmFtaWx5ID09IEFGX1BBQ0tFVCkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiXCIlc1wiIG1heSBiZSBpbmV0ICVzLCBidXQgaXQgaXMgbm90IGFsbG93ZWQgaW4gdGhpcyBjb250ZXh0IiwgYXJnLCAiYWRkcmVzcyIpOworCX0KKwlpZiAoZ2V0X2FkZHJfMShkc3QsIGFyZywgZmFtaWx5KSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYW4gJXMgJXMgaXMgZXhwZWN0ZWQgcmF0aGVyIHRoYW4gXCIlc1wiIiwgImluZXQiLCAiYWRkcmVzcyIsIGFyZyk7CisJfQorCXJldHVybiAwOworfQorCit2b2lkIGdldF9wcmVmaXgoaW5ldF9wcmVmaXggKmRzdCwgY2hhciAqYXJnLCBpbnQgZmFtaWx5KQoreworCWlmIChmYW1pbHkgPT0gQUZfUEFDS0VUKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJcIiVzXCIgbWF5IGJlIGluZXQgJXMsIGJ1dCBpdCBpcyBub3QgYWxsb3dlZCBpbiB0aGlzIGNvbnRleHQiLCBhcmcsICJwcmVmaXgiKTsKKwl9CisJZ2V0X3ByZWZpeF8xKGRzdCwgYXJnLCBmYW1pbHkpOworfQorCit1aW50MzJfdCBnZXRfYWRkcjMyKGNoYXIgKm5hbWUpCit7CisJaW5ldF9wcmVmaXggYWRkcjsKKworCWlmIChnZXRfYWRkcl8xKCZhZGRyLCBuYW1lLCBBRl9JTkVUKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYW4gJXMgJXMgaXMgZXhwZWN0ZWQgcmF0aGVyIHRoYW4gXCIlc1wiIiwgIklQIiwgImFkZHJlc3MiLCBuYW1lKTsKKwl9CisJcmV0dXJuIGFkZHIuZGF0YVswXTsKK30KKwordm9pZCBpbmNvbXBsZXRlX2NvbW1hbmQodm9pZCkKK3sKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY29tbWFuZCBsaW5lIGlzIG5vdCBjb21wbGV0ZSwgdHJ5IG9wdGlvbiBcImhlbHBcIiIpOworfQorCit2b2lkIGludmFyZyhjb25zdCBjaGFyICphcmcsIGNvbnN0IGNoYXIgKm9wdCkKK3sKKwliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfaW52YWxpZF9hcmcsIGFyZywgb3B0KTsKK30KKwordm9pZCBkdXBhcmcoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICphcmcpCit7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImR1cGxpY2F0ZSBcIiVzXCI6IFwiJXNcIiBpcyB0aGUgc2Vjb25kIHZhbHVlIiwga2V5LCBhcmcpOworfQorCit2b2lkIGR1cGFyZzIoY29uc3QgY2hhciAqa2V5LCBjb25zdCBjaGFyICphcmcpCit7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImVpdGhlciBcIiVzXCIgaXMgZHVwbGljYXRlLCBvciBcIiVzXCIgaXMgZ2FyYmFnZSIsIGtleSwgYXJnKTsKK30KKworaW50IGluZXRfYWRkcl9tYXRjaChjb25zdCBpbmV0X3ByZWZpeCAqYSwgY29uc3QgaW5ldF9wcmVmaXggKmIsIGludCBiaXRzKQoreworCWNvbnN0IHVpbnQzMl90ICphMSA9IGEtPmRhdGE7CisJY29uc3QgdWludDMyX3QgKmEyID0gYi0+ZGF0YTsKKwlpbnQgd29yZHMgPSBiaXRzID4+IDU7CisKKwliaXRzICY9IDB4MWY7CisKKwlpZiAod29yZHMpCisJCWlmIChtZW1jbXAoYTEsIGEyLCB3b3JkcyA8PCAyKSkKKwkJCXJldHVybiAtMTsKKworCWlmIChiaXRzKSB7CisJCXVpbnQzMl90IHcxLCB3MjsKKwkJdWludDMyX3QgbWFzazsKKworCQl3MSA9IGExW3dvcmRzXTsKKwkJdzIgPSBhMlt3b3Jkc107CisKKwkJbWFzayA9IGh0b25sKCgweGZmZmZmZmZmKSA8PCAoMHgyMCAtIGJpdHMpKTsKKworCQlpZiAoKHcxIF4gdzIpICYgbWFzaykKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitjb25zdCBjaGFyICpydF9hZGRyX24yYShpbnQgYWYsCisJCXZvaWQgKmFkZHIsIGNoYXIgKmJ1ZiwgaW50IGJ1ZmxlbikKK3sKKwlzd2l0Y2ggKGFmKSB7CisJY2FzZSBBRl9JTkVUOgorCWNhc2UgQUZfSU5FVDY6CisJCXJldHVybiBpbmV0X250b3AoYWYsIGFkZHIsIGJ1ZiwgYnVmbGVuKTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIj8/PyI7CisJfQorfQorCisjaWZkZWYgUkVTT0xWRV9IT1NUTkFNRVMKK2NvbnN0IGNoYXIgKmZvcm1hdF9ob3N0KGludCBhZiwgaW50IGxlbiwgdm9pZCAqYWRkciwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKQoreworCWlmIChyZXNvbHZlX2hvc3RzKSB7CisJCXN0cnVjdCBob3N0ZW50ICpoX2VudDsKKworCQlpZiAobGVuIDw9IDApIHsKKwkJCXN3aXRjaCAoYWYpIHsKKwkJCWNhc2UgQUZfSU5FVDoKKwkJCQlsZW4gPSA0OworCQkJCWJyZWFrOworCQkJY2FzZSBBRl9JTkVUNjoKKwkJCQlsZW4gPSAxNjsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6OworCQkJfQorCQl9CisJCWlmIChsZW4gPiAwKSB7CisJCQloX2VudCA9IGdldGhvc3RieWFkZHIoYWRkciwgbGVuLCBhZik7CisJCQlpZiAoaF9lbnQgIT0gTlVMTCkgeworCQkJCXNhZmVfc3RybmNweShidWYsIGhfZW50LT5oX25hbWUsIGJ1Zmxlbik7CisJCQkJcmV0dXJuIGJ1ZjsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcnRfYWRkcl9uMmEoYWYsIGFkZHIsIGJ1ZiwgYnVmbGVuKTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9saWJpcHJvdXRlL3V0aWxzLmggYi9uZXR3b3JraW5nL2xpYmlwcm91dGUvdXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmI0YTg2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9saWJpcHJvdXRlL3V0aWxzLmgKQEAgLTAsMCArMSw5MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisjaWZuZGVmIFVUSUxTX0gKKyNkZWZpbmUgVVRJTFNfSCAxCisKKyNpbmNsdWRlICJsaWJuZXRsaW5rLmgiCisjaW5jbHVkZSAibGxfbWFwLmgiCisjaW5jbHVkZSAicnRtX21hcC5oIgorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworZXh0ZXJuIGZhbWlseV90IHByZWZlcnJlZF9mYW1pbHk7CitleHRlcm4gc21hbGxpbnQgc2hvd19zdGF0czsgICAgLyogVU5VU0VEICovCitleHRlcm4gc21hbGxpbnQgc2hvd19kZXRhaWxzOyAgLyogVU5VU0VEICovCitleHRlcm4gc21hbGxpbnQgc2hvd19yYXc7ICAgICAgLyogVU5VU0VEICovCitleHRlcm4gc21hbGxpbnQgcmVzb2x2ZV9ob3N0czsgLyogVU5VU0VEICovCitleHRlcm4gc21hbGxpbnQgb25lbGluZTsKK2V4dGVybiBjaGFyIF9TTF87CisKKyNpZm5kZWYgSVBQUk9UT19FU1AKKyNkZWZpbmUgSVBQUk9UT19FU1AgIDUwCisjZW5kaWYKKyNpZm5kZWYgSVBQUk9UT19BSAorI2RlZmluZSBJUFBST1RPX0FIICA1MQorI2VuZGlmCisKKyNkZWZpbmUgU1BSSU5UX0JTSVpFIDY0CisjZGVmaW5lIFNQUklOVF9CVUYoeCkgIGNoYXIgeFtTUFJJTlRfQlNJWkVdCisKK2V4dGVybiB2b2lkIGluY29tcGxldGVfY29tbWFuZCh2b2lkKSBOT1JFVFVSTjsKKworI2RlZmluZSBORVhUX0FSRygpIGRvIHsgaWYgKCEqKythcmd2KSBpbmNvbXBsZXRlX2NvbW1hbmQoKTsgfSB3aGlsZSAoMCkKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgZmFtaWx5OworCXVpbnQ4X3QgYnl0ZWxlbjsKKwlpbnQxNl90IGJpdGxlbjsKKwl1aW50MzJfdCBkYXRhWzRdOworfSBpbmV0X3ByZWZpeDsKKworI2RlZmluZSBQUkVGSVhMRU5fU1BFQ0lGSUVEIDEKKworI2RlZmluZSBETl9NQVhBRERMIDIwCisjaWZuZGVmIEFGX0RFQ25ldAorI2RlZmluZSBBRl9ERUNuZXQgMTIKKyNlbmRpZgorCitzdHJ1Y3QgZG5fbmFkZHIgeworCXVuc2lnbmVkIHNob3J0IGFfbGVuOworCXVuc2lnbmVkIGNoYXIgIGFfYWRkcltETl9NQVhBRERMXTsKK307CisKKyNkZWZpbmUgSVBYX05PREVfTEVOIDYKKworc3RydWN0IGlweF9hZGRyIHsKKwl1aW50MzJfdCBpcHhfbmV0OworCXVpbnQ4X3QgIGlweF9ub2RlW0lQWF9OT0RFX0xFTl07Cit9OworCitleHRlcm4gdWludDMyX3QgZ2V0X2FkZHIzMihjaGFyICpuYW1lKTsKK2V4dGVybiBpbnQgZ2V0X2FkZHJfMShpbmV0X3ByZWZpeCAqZHN0LCBjaGFyICphcmcsIGludCBmYW1pbHkpOworLypleHRlcm4gdm9pZCBnZXRfcHJlZml4XzEoaW5ldF9wcmVmaXggKmRzdCwgY2hhciAqYXJnLCBpbnQgZmFtaWx5KTsqLworZXh0ZXJuIGludCBnZXRfYWRkcihpbmV0X3ByZWZpeCAqZHN0LCBjaGFyICphcmcsIGludCBmYW1pbHkpOworZXh0ZXJuIHZvaWQgZ2V0X3ByZWZpeChpbmV0X3ByZWZpeCAqZHN0LCBjaGFyICphcmcsIGludCBmYW1pbHkpOworCitleHRlcm4gdW5zaWduZWQgZ2V0X3Vuc2lnbmVkKGNoYXIgKmFyZywgY29uc3QgY2hhciAqZXJybXNnKTsKK2V4dGVybiB1aW50MzJfdCBnZXRfdTMyKGNoYXIgKmFyZywgY29uc3QgY2hhciAqZXJybXNnKTsKK2V4dGVybiB1aW50MTZfdCBnZXRfdTE2KGNoYXIgKmFyZywgY29uc3QgY2hhciAqZXJybXNnKTsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKnJ0X2FkZHJfbjJhKGludCBhZiwgdm9pZCAqYWRkciwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKKyNpZmRlZiBSRVNPTFZFX0hPU1ROQU1FUworZXh0ZXJuIGNvbnN0IGNoYXIgKmZvcm1hdF9ob3N0KGludCBhZiwgaW50IGxlbiwgdm9pZCAqYWRkciwgY2hhciAqYnVmLCBpbnQgYnVmbGVuKTsKKyNlbHNlCisjZGVmaW5lIGZvcm1hdF9ob3N0KGFmLCBsZW4sIGFkZHIsIGJ1ZiwgYnVmbGVuKSBcCisJcnRfYWRkcl9uMmEoYWYsIGFkZHIsIGJ1ZiwgYnVmbGVuKQorI2VuZGlmCisKK3ZvaWQgaW52YXJnKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSBOT1JFVFVSTjsKK3ZvaWQgZHVwYXJnKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKSBOT1JFVFVSTjsKK3ZvaWQgZHVwYXJnMihjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKikgTk9SRVRVUk47CitpbnQgaW5ldF9hZGRyX21hdGNoKGNvbnN0IGluZXRfcHJlZml4ICphLCBjb25zdCBpbmV0X3ByZWZpeCAqYiwgaW50IGJpdHMpOworCitjb25zdCBjaGFyICpkbmV0X250b3AoaW50IGFmLCBjb25zdCB2b2lkICphZGRyLCBjaGFyICpzdHIsIHNpemVfdCBsZW4pOworaW50IGRuZXRfcHRvbihpbnQgYWYsIGNvbnN0IGNoYXIgKnNyYywgdm9pZCAqYWRkcik7CisKK2NvbnN0IGNoYXIgKmlweF9udG9wKGludCBhZiwgY29uc3Qgdm9pZCAqYWRkciwgY2hhciAqc3RyLCBzaXplX3QgbGVuKTsKK2ludCBpcHhfcHRvbihpbnQgYWYsIGNvbnN0IGNoYXIgKnNyYywgdm9pZCAqYWRkcik7CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9uYW1laWYuYyBiL25ldHdvcmtpbmcvbmFtZWlmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIxOGE2ZAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbmFtZWlmLmMKQEAgLTAsMCArMSwzMjcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIG5hbWVpZi5jIC0gTmFtaW5nIEludGVyZmFjZXMgYmFzZWQgb24gTUFDIGFkZHJlc3MgZm9yIGJ1c3lib3guCisgKgorICogV3JpdHRlbiAyMDAwIGJ5IEFuZGkgS2xlZW4uCisgKiBCdXN5Ym94IHBvcnQgMjAwMiBieSBOaWNrIEZlZGNoaWsgPG5pY2tAZmVkY2hpay5vcmcudWE+CisgKgkJCUdsZW5uIE1jR3JhdGgKKyAqIEV4dGVuZGVkIG1hdGNoaW5nIHN1cHBvcnQgMjAwOCBieSBOaWNvIEVyZnVydGggPG1hc3RhQHBlcmxnb2xmLmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9jb25maWc6Y29uZmlnIE5BTUVJRgorLy9jb25maWc6CWJvb2wgIm5hbWVpZiIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglzZWxlY3QgUExBVEZPUk1fTElOVVgKKy8vY29uZmlnOglzZWxlY3QgRkVBVFVSRV9TWVNMT0cKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBuYW1laWYgaXMgdXNlZCB0byByZW5hbWUgbmV0d29yayBpbnRlcmZhY2UgYnkgaXRzIE1BQyBhZGRyZXNzLgorLy9jb25maWc6CSAgUmVuYW1lZCBpbnRlcmZhY2VzIE1VU1QgYmUgaW4gdGhlIGRvd24gc3RhdGUuCisvL2NvbmZpZzoJICBJdCBpcyBwb3NzaWJsZSB0byB1c2UgYSBmaWxlIChkZWZhdWx0OiAvZXRjL21hY3RhYikKKy8vY29uZmlnOgkgIHdpdGggbGlzdCBvZiBuZXcgaW50ZXJmYWNlIG5hbWVzIGFuZCBNQUNzLgorLy9jb25maWc6CSAgTWF4aW11bSBpbnRlcmZhY2UgbmFtZSBsZW5ndGg6IElGTkFNU0laID0gMTYKKy8vY29uZmlnOgkgIEZpbGUgZmllbGRzIGFyZSBzZXBhcmF0ZWQgYnkgc3BhY2Ugb3IgdGFiLgorLy9jb25maWc6CSAgRmlsZSBmb3JtYXQ6CisvL2NvbmZpZzoJICAjIENvbW1lbnQKKy8vY29uZmlnOgkgIG5ld19pbnRlcmZhY2VfbmFtZSAgICBYWDpYWDpYWDpYWDpYWDpYWAorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQKKy8vY29uZmlnOglib29sICJFeHRlbmRlZCBuYW1laWYiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBOQU1FSUYKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGlzIGV4dGVuZHMgdGhlIG5hbWVpZiBzeW50YXggdG8gc3VwcG9ydCB0aGUgYnVzX2luZm8sIGRyaXZlciwKKy8vY29uZmlnOgkgIHBoeWFkZHIgc2VsZWN0b3JzLiBUaGUgc3ludGF4IGlzIGNvbXBhdGlibGUgdG8gdGhlIG5vcm1hbCBuYW1laWYuCisvL2NvbmZpZzoJICBGaWxlIGZvcm1hdDoKKy8vY29uZmlnOgkgICAgbmV3X2ludGVyZmFjZV9uYW1lICBkcml2ZXI9YXNpeCBidXM9dXNiLTAwMDA6MDA6MDguMi0zCisvL2NvbmZpZzoJICAgIG5ld19pbnRlcmZhY2VfbmFtZSAgYnVzPXVzYi0wMDAwOjAwOjA4LjItMyAwMDo4MDpDODozODo5MTpCNQorLy9jb25maWc6CSAgICBuZXdfaW50ZXJmYWNlX25hbWUgIHBoeV9hZGRyZXNzPTIgMDA6ODA6Qzg6Mzg6OTE6QjUKKy8vY29uZmlnOgkgICAgbmV3X2ludGVyZmFjZV9uYW1lICBtYWM9MDA6ODA6Qzg6Mzg6OTE6QjUKKy8vY29uZmlnOgkgICAgbmV3X2ludGVyZmFjZV9uYW1lICAwMDo4MDpDODozODo5MTpCNQorCisvL3VzYWdlOiNkZWZpbmUgbmFtZWlmX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFX05BTUVJRl9FWFRFTkRFRCgKKy8vdXNhZ2U6CQkiWy1zXSBbLWMgRklMRV0gW0lGTkFNRSBIV0FERFJdLi4uIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQoCisvL3VzYWdlOgkJIlstc10gWy1jIEZJTEVdIFtJRk5BTUUgU0VMRUNUT1JdLi4uIgorLy91c2FnZToJKQorLy91c2FnZTojZGVmaW5lIG5hbWVpZl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZToJIlJlbmFtZSBuZXR3b3JrIGludGVyZmFjZSB3aGlsZSBpdCBpbiB0aGUgZG93biBzdGF0ZS4iCisvL3VzYWdlOglJRl9OT1RfRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQoCisvL3VzYWdlOiAgICAgIlxuVGhlIGRldmljZSB3aXRoIGFkZHJlc3MgSFdBRERSIGlzIHJlbmFtZWQgdG8gSUZBQ0UuIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQoCisvL3VzYWdlOiAgICAgIlxuVGhlIGRldmljZSBtYXRjaGVkIGJ5IFNFTEVDVE9SIGlzIHJlbmFtZWQgdG8gSUZBQ0UuIgorLy91c2FnZTogICAgICJcblNFTEVDVE9SIGNhbiBiZSBhIGNvbWJpbmF0aW9uIG9mOiIKKy8vdXNhZ2U6ICAgICAiXG4JZHJpdmVyPVNUUklORyIKKy8vdXNhZ2U6ICAgICAiXG4JYnVzPVNUUklORyIKKy8vdXNhZ2U6ICAgICAiXG4JcGh5X2FkZHJlc3M9TlVNIgorLy91c2FnZTogICAgICJcbglbbWFjPV1YWDpYWDpYWDpYWDpYWDpYWCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jIEZJTEUJQ29uZmlndXJhdGlvbiBmaWxlIChkZWZhdWx0OiAvZXRjL21hY3RhYikiCisvL3VzYWdlOiAgICAgIlxuCS1zCUxvZyB0byBzeXNsb2ciCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG5hbWVpZl9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBuYW1laWYgLXMgZG16MCAwMDpBMDpDOTo4QzpGNjozRlxuIgorLy91c2FnZTogICAgICAgIiBvclxuIgorLy91c2FnZTogICAgICAgIiQgbmFtZWlmIC1jIC9ldGMvbXlfbWFjdGFiX2ZpbGVcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8bmV0L2lmLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9ldGhlci5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tpb3MuaD4KKworI2lmbmRlZiBJRk5BTVNJWgorI2RlZmluZSBJRk5BTVNJWiAxNgorI2VuZGlmCisKKy8qIFRha2VuIGZyb20gbGludXgvc29ja2lvcy5oICovCisjZGVmaW5lIFNJT0NTSUZOQU1FICAweDg5MjMgIC8qIHNldCBpbnRlcmZhY2UgbmFtZSAqLworCisvKiBPY3RldHMgaW4gb25lIEV0aGVybmV0IGFkZHIsIGZyb20gPGxpbnV4L2lmX2V0aGVyLmg+ICovCisjZGVmaW5lIEVUSF9BTEVOICAgICA2CisKKyNpZm5kZWYgaWZyX25ld25hbWUKKyNkZWZpbmUgaWZyX25ld25hbWUgaWZyX2lmcnUuaWZydV9zbGF2ZQorI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGV0aHRhYmxlX3MgeworCXN0cnVjdCBldGh0YWJsZV9zICpuZXh0OworCXN0cnVjdCBldGh0YWJsZV9zICpwcmV2OworCWNoYXIgKmlmbmFtZTsKKwlzdHJ1Y3QgZXRoZXJfYWRkciAqbWFjOworI2lmIEVOQUJMRV9GRUFUVVJFX05BTUVJRl9FWFRFTkRFRAorCWNoYXIgKmJ1c19pbmZvOworCWNoYXIgKmRyaXZlcjsKKwlpbnQzMl90IHBoeV9hZGRyZXNzOworI2VuZGlmCit9IGV0aHRhYmxlX3Q7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQKKy8qIEN1dCduJ3Bhc3RlIGZyb20gZXRodG9vbC5oICovCisjZGVmaW5lIEVUSFRPT0xfQlVTSU5GT19MRU4gMzIKKy8qIHRoZXNlIHN0cmluZ3MgYXJlIHNldCB0byB3aGF0ZXZlciB0aGUgZHJpdmVyIGF1dGhvciBkZWNpZGVzLi4uICovCitzdHJ1Y3QgZXRodG9vbF9kcnZpbmZvIHsKKwl1aW50MzJfdCBjbWQ7CisJY2hhciAgZHJpdmVyWzMyXTsgLyogZHJpdmVyIHNob3J0IG5hbWUsICJ0dWxpcCIsICJlZXBybzEwMCIgKi8KKwljaGFyICB2ZXJzaW9uWzMyXTsgIC8qIGRyaXZlciB2ZXJzaW9uIHN0cmluZyAqLworCWNoYXIgIGZ3X3ZlcnNpb25bMzJdOyAvKiBmaXJtd2FyZSB2ZXJzaW9uIHN0cmluZywgaWYgYXBwbGljYWJsZSAqLworCWNoYXIgIGJ1c19pbmZvW0VUSFRPT0xfQlVTSU5GT19MRU5dOyAgLyogQnVzIGluZm8gZm9yIHRoaXMgSUYuICovCisJLyogRm9yIFBDSSBkZXZpY2VzLCB1c2UgcGNpX2Rldi0+c2xvdF9uYW1lLiAqLworCWNoYXIgIHJlc2VydmVkMVszMl07CisJY2hhciAgcmVzZXJ2ZWQyWzE2XTsKKwl1aW50MzJfdCBuX3N0YXRzOyAgLyogbnVtYmVyIG9mIHU2NCdzIGZyb20gRVRIVE9PTF9HU1RBVFMgKi8KKwl1aW50MzJfdCB0ZXN0aW5mb19sZW47CisJdWludDMyX3QgZWVkdW1wX2xlbjsgLyogU2l6ZSBvZiBkYXRhIGZyb20gRVRIVE9PTF9HRUVQUk9NIChieXRlcykgKi8KKwl1aW50MzJfdCByZWdkdW1wX2xlbjsgIC8qIFNpemUgb2YgZGF0YSBmcm9tIEVUSFRPT0xfR1JFR1MgKGJ5dGVzKSAqLworfTsKKworc3RydWN0IGV0aHRvb2xfY21kIHsKKwl1aW50MzJfdCAgIGNtZDsKKwl1aW50MzJfdCAgIHN1cHBvcnRlZDsgICAgICAvKiBGZWF0dXJlcyB0aGlzIGludGVyZmFjZSBzdXBwb3J0cyAqLworCXVpbnQzMl90ICAgYWR2ZXJ0aXNpbmc7ICAgIC8qIEZlYXR1cmVzIHRoaXMgaW50ZXJmYWNlIGFkdmVydGlzZXMgKi8KKwl1aW50MTZfdCAgIHNwZWVkOyAgICAgICAgICAvKiBUaGUgZm9yY2VkIHNwZWVkLCAxME1iLCAxMDBNYiwgZ2lnYWJpdCAqLworCXVpbnQ4X3QgICAgZHVwbGV4OyAgICAgICAgIC8qIER1cGxleCwgaGFsZiBvciBmdWxsICovCisJdWludDhfdCAgICBwb3J0OyAgICAgICAgICAgLyogV2hpY2ggY29ubmVjdG9yIHBvcnQgKi8KKwl1aW50OF90ICAgIHBoeV9hZGRyZXNzOworCXVpbnQ4X3QgICAgdHJhbnNjZWl2ZXI7ICAgIC8qIFdoaWNoIHRyYW5zY2VpdmVyIHRvIHVzZSAqLworCXVpbnQ4X3QgICAgYXV0b25lZzsgICAgICAgIC8qIEVuYWJsZSBvciBkaXNhYmxlIGF1dG9uZWdvdGlhdGlvbiAqLworCXVpbnQzMl90ICAgbWF4dHhwa3Q7ICAgICAgIC8qIFR4IHBrdHMgYmVmb3JlIGdlbmVyYXRpbmcgdHggaW50ICovCisJdWludDMyX3QgICBtYXhyeHBrdDsgICAgICAgLyogUnggcGt0cyBiZWZvcmUgZ2VuZXJhdGluZyByeCBpbnQgKi8KKwl1aW50MTZfdCAgIHNwZWVkX2hpOworCXVpbnQxNl90ICAgcmVzZXJ2ZWQyOworCXVpbnQzMl90ICAgcmVzZXJ2ZWRbM107Cit9OworCisjZGVmaW5lIEVUSFRPT0xfR1NFVCAgICAgIDB4MDAwMDAwMDEgLyogR2V0IHNldHRpbmdzLiAqLworI2RlZmluZSBFVEhUT09MX0dEUlZJTkZPICAweDAwMDAwMDAzIC8qIEdldCBkcml2ZXIgaW5mby4gKi8KKyNlbmRpZgorCisKK3N0YXRpYyB2b2lkIG5hbWVpZl9wYXJzZV9zZWxlY3RvcihldGh0YWJsZV90ICpjaCwgY2hhciAqc2VsZWN0b3IpCit7CisJc3RydWN0IGV0aGVyX2FkZHIgKmxtYWM7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVECisJaW50IGZvdW5kX3NlbGVjdG9yID0gMDsKKworCXdoaWxlICgqc2VsZWN0b3IpIHsKKwkJY2hhciAqbmV4dDsKKyNlbmRpZgorCQlzZWxlY3RvciA9IHNraXBfd2hpdGVzcGFjZShzZWxlY3Rvcik7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVECisJCWNoLT5waHlfYWRkcmVzcyA9IC0xOworCQlpZiAoKnNlbGVjdG9yID09ICdcMCcpCisJCQlicmVhazsKKwkJLyogU2VhcmNoIGZvciB0aGUgZW5kIC4uLi4gKi8KKwkJbmV4dCA9IHNraXBfbm9uX3doaXRlc3BhY2Uoc2VsZWN0b3IpOworCQlpZiAoKm5leHQpCisJCQkqbmV4dCsrID0gJ1wwJzsKKwkJLyogQ2hlY2sgZm9yIHNlbGVjdG9ycywgbWFjPSBpcyBhc3N1bWVkICovCisJCWlmIChpc19wcmVmaXhlZF93aXRoKHNlbGVjdG9yLCAiYnVzPSIpKSB7CisJCQljaC0+YnVzX2luZm8gPSB4c3RyZHVwKHNlbGVjdG9yICsgNCk7CisJCQlmb3VuZF9zZWxlY3RvcisrOworCQl9IGVsc2UgaWYgKGlzX3ByZWZpeGVkX3dpdGgoc2VsZWN0b3IsICJkcml2ZXI9IikpIHsKKwkJCWNoLT5kcml2ZXIgPSB4c3RyZHVwKHNlbGVjdG9yICsgNyk7CisJCQlmb3VuZF9zZWxlY3RvcisrOworCQl9IGVsc2UgaWYgKGlzX3ByZWZpeGVkX3dpdGgoc2VsZWN0b3IsICJwaHlhZGRyPSIpKSB7CisJCQljaC0+cGh5X2FkZHJlc3MgPSB4YXRvaV9wb3NpdGl2ZShzZWxlY3RvciArIDgpOworCQkJZm91bmRfc2VsZWN0b3IrKzsKKwkJfSBlbHNlIHsKKyNlbmRpZgorCQkJbG1hYyA9IHhtYWxsb2MoRVRIX0FMRU4pOworCQkJY2gtPm1hYyA9IGV0aGVyX2F0b25fcihzZWxlY3RvciArIChpc19wcmVmaXhlZF93aXRoKHNlbGVjdG9yLCAibWFjPSIpID8gNCA6IDApLCBsbWFjKTsKKwkJCWlmIChjaC0+bWFjID09IE5VTEwpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHBhcnNlICVzIiwgc2VsZWN0b3IpOworI2lmICBFTkFCTEVfRkVBVFVSRV9OQU1FSUZfRVhURU5ERUQKKwkJCWZvdW5kX3NlbGVjdG9yKys7CisJCX07CisJCXNlbGVjdG9yID0gbmV4dDsKKwl9CisJaWYgKGZvdW5kX3NlbGVjdG9yID09IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyBzZWxlY3RvcnMgZm91bmQgZm9yICVzIiwgY2gtPmlmbmFtZSk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgcHJlcGVuZF9uZXdfZXRoX3RhYmxlKGV0aHRhYmxlX3QgKipjbGlzdCwgY2hhciAqaWZuYW1lLCBjaGFyICpzZWxlY3RvcikKK3sKKwlldGh0YWJsZV90ICpjaDsKKwlpZiAoc3RybGVuKGlmbmFtZSkgPj0gSUZOQU1TSVopCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnRlcmZhY2UgbmFtZSAnJXMnIHRvbyBsb25nIiwgaWZuYW1lKTsKKwljaCA9IHh6YWxsb2Moc2l6ZW9mKCpjaCkpOworCWNoLT5pZm5hbWUgPSB4c3RyZHVwKGlmbmFtZSk7CisJbmFtZWlmX3BhcnNlX3NlbGVjdG9yKGNoLCBzZWxlY3Rvcik7CisJY2gtPm5leHQgPSAqY2xpc3Q7CisJaWYgKCpjbGlzdCkKKwkJKCpjbGlzdCktPnByZXYgPSBjaDsKKwkqY2xpc3QgPSBjaDsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQCitzdGF0aWMgdm9pZCBkZWxldGVfZXRoX3RhYmxlKGV0aHRhYmxlX3QgKmNoKQoreworCWZyZWUoY2gtPmlmbmFtZSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVECisJZnJlZShjaC0+YnVzX2luZm8pOworCWZyZWUoY2gtPmRyaXZlcik7CisjZW5kaWYKKwlmcmVlKGNoLT5tYWMpOworCWZyZWUoY2gpOworfTsKKyNlbHNlCit2b2lkIGRlbGV0ZV9ldGhfdGFibGUoZXRodGFibGVfdCAqY2gpOworI2VuZGlmCisKK2ludCBuYW1laWZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG5hbWVpZl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJZXRodGFibGVfdCAqY2xpc3QgPSBOVUxMOworCWNvbnN0IGNoYXIgKmZuYW1lID0gIi9ldGMvbWFjdGFiIjsKKwlpbnQgY3RsX3NrOworCWV0aHRhYmxlX3QgKmNoOworCXBhcnNlcl90ICpwYXJzZXI7CisJY2hhciAqdG9rZW5bMl07CisKKwlpZiAoMSAmIGdldG9wdDMyKGFyZ3YsICJzYzoiLCAmZm5hbWUpKSB7CisJCW9wZW5sb2coYXBwbGV0X25hbWUsIDAsIExPR19MT0NBTDApOworCQkvKiBXaHkgbm90IGp1c3QgIj0iPyBJIGFzc3VtZSBsb2dnaW5nIHRvIHN0ZGVycgorCQkgKiBjYW4ndCBodXJ0LiAyPi9kZXYvbnVsbCBpZiB5b3UgZG9uJ3QgbGlrZSBpdDogKi8KKwkJbG9nbW9kZSB8PSBMT0dNT0RFX1NZU0xPRzsKKwl9CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoYXJndlswXSkgeworCQlkbyB7CisJCQlpZiAoIWFyZ3ZbMV0pCisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJcHJlcGVuZF9uZXdfZXRoX3RhYmxlKCZjbGlzdCwgYXJndlswXSwgYXJndlsxXSk7CisJCQlhcmd2ICs9IDI7CisJCX0gd2hpbGUgKCphcmd2KTsKKwl9IGVsc2UgeworCQlwYXJzZXIgPSBjb25maWdfb3BlbihmbmFtZSk7CisJCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRva2VuLCAyLCAyLCAiIyBcdCIsIFBBUlNFX05PUk1BTCkpCisJCQlwcmVwZW5kX25ld19ldGhfdGFibGUoJmNsaXN0LCB0b2tlblswXSwgdG9rZW5bMV0pOworCQljb25maWdfY2xvc2UocGFyc2VyKTsKKwl9CisKKwljdGxfc2sgPSB4c29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCXBhcnNlciA9IGNvbmZpZ19vcGVuMigiL3Byb2MvbmV0L2RldiIsIHhmb3Blbl9mb3JfcmVhZCk7CisKKwl3aGlsZSAoY2xpc3QgJiYgY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbiwgMiwgMiwgIlwwOiBcdCIsIFBBUlNFX05PUk1BTCkpIHsKKwkJc3RydWN0IGlmcmVxIGlmcjsKKyNpZiAgRU5BQkxFX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVECisJCXN0cnVjdCBldGh0b29sX2RydmluZm8gZHJ2aW5mbzsKKwkJc3RydWN0IGV0aHRvb2xfY21kIGV0aF9zZXR0aW5nczsKKyNlbmRpZgorCQlpZiAocGFyc2VyLT5saW5lbm8gPD0gMikKKwkJCWNvbnRpbnVlOyAvKiBTa2lwIHRoZSBmaXJzdCB0d28gbGluZXMgKi8KKworCQkvKiBGaW5kIHRoZSBjdXJyZW50IGludGVyZmFjZSBuYW1lIGFuZCBjb3B5IGl0IHRvIGlmci5pZnJfbmFtZSAqLworCQltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKHN0cnVjdCBpZnJlcSkpOworCQlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgdG9rZW5bMF0pOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfTkFNRUlGX0VYVEVOREVECisJCS8qIENoZWNrIGZvciBwaHkgYWRkcmVzcyAqLworCQltZW1zZXQoJmV0aF9zZXR0aW5ncywgMCwgc2l6ZW9mKGV0aF9zZXR0aW5ncykpOworCQlldGhfc2V0dGluZ3MuY21kID0gRVRIVE9PTF9HU0VUOworCQlpZnIuaWZyX2RhdGEgPSAoY2FkZHJfdCkgJmV0aF9zZXR0aW5nczsKKwkJaW9jdGwoY3RsX3NrLCBTSU9DRVRIVE9PTCwgJmlmcik7CisKKwkJLyogQ2hlY2sgZm9yIGRyaXZlciBldGMuICovCisJCW1lbXNldCgmZHJ2aW5mbywgMCwgc2l6ZW9mKGRydmluZm8pKTsKKwkJZHJ2aW5mby5jbWQgPSBFVEhUT09MX0dEUlZJTkZPOworCQlpZnIuaWZyX2RhdGEgPSAoY2FkZHJfdCkgJmRydmluZm87CisJCS8qIEdldCBkcml2ZXIgYW5kIGJ1c2luZm8gZmlyc3QsIHNvIHdlIGhhdmUgaXQgaW4gZHJ2aW5mbyAqLworCQlpb2N0bChjdGxfc2ssIFNJT0NFVEhUT09MLCAmaWZyKTsKKyNlbmRpZgorCQlpb2N0bChjdGxfc2ssIFNJT0NHSUZIV0FERFIsICZpZnIpOworCisJCS8qIFNlYXJjaCB0aGUgbGlzdCBmb3IgYSBtYXRjaGluZyBkZXZpY2UgKi8KKwkJZm9yIChjaCA9IGNsaXN0OyBjaDsgY2ggPSBjaC0+bmV4dCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX05BTUVJRl9FWFRFTkRFRAorCQkJaWYgKGNoLT5idXNfaW5mbyAmJiBzdHJjbXAoY2gtPmJ1c19pbmZvLCBkcnZpbmZvLmJ1c19pbmZvKSAhPSAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGNoLT5kcml2ZXIgJiYgc3RyY21wKGNoLT5kcml2ZXIsIGRydmluZm8uZHJpdmVyKSAhPSAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGNoLT5waHlfYWRkcmVzcyAhPSAtMSAmJiBjaC0+cGh5X2FkZHJlc3MgIT0gZXRoX3NldHRpbmdzLnBoeV9hZGRyZXNzKQorCQkJCWNvbnRpbnVlOworI2VuZGlmCisJCQlpZiAoY2gtPm1hYyAmJiBtZW1jbXAoY2gtPm1hYywgaWZyLmlmcl9od2FkZHIuc2FfZGF0YSwgRVRIX0FMRU4pICE9IDApCisJCQkJY29udGludWU7CisJCQkvKiBpZiB3ZSBjYW1lIGhlcmUsIGFsbCBzZWxlY3RvcnMgaGF2ZSBtYXRjaGVkICovCisJCQlnb3RvIGZvdW5kOworCQl9CisJCS8qIE5vdGhpbmcgZm91bmQgZm9yIGN1cnJlbnQgaW50ZXJmYWNlICovCisJCWNvbnRpbnVlOworIGZvdW5kOgorCQlpZiAoc3RyY21wKGlmci5pZnJfbmFtZSwgY2gtPmlmbmFtZSkgIT0gMCkgeworCQkJc3RyY3B5KGlmci5pZnJfbmV3bmFtZSwgY2gtPmlmbmFtZSk7CisJCQlpb2N0bF9vcl9wZXJyb3JfYW5kX2RpZShjdGxfc2ssIFNJT0NTSUZOQU1FLCAmaWZyLAorCQkJCQkiY2FuJ3QgY2hhbmdlIGlmbmFtZSAlcyB0byAlcyIsCisJCQkJCWlmci5pZnJfbmFtZSwgY2gtPmlmbmFtZSk7CisJCX0KKwkJLyogUmVtb3ZlIGxpc3QgZW50cnkgb2YgcmVuYW1lZCBpbnRlcmZhY2UgKi8KKwkJaWYgKGNoLT5wcmV2ICE9IE5VTEwpCisJCQljaC0+cHJldi0+bmV4dCA9IGNoLT5uZXh0OworCQllbHNlCisJCQljbGlzdCA9IGNoLT5uZXh0OworCQlpZiAoY2gtPm5leHQgIT0gTlVMTCkKKwkJCWNoLT5uZXh0LT5wcmV2ID0gY2gtPnByZXY7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWRlbGV0ZV9ldGhfdGFibGUoY2gpOworCX0gLyogd2hpbGUgKi8KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlldGh0YWJsZV90ICpuZXh0OworCQlmb3IgKGNoID0gY2xpc3Q7IGNoOyBjaCA9IG5leHQpIHsKKwkJCW5leHQgPSBjaC0+bmV4dDsKKwkJCWRlbGV0ZV9ldGhfdGFibGUoY2gpOworCQl9CisJCWNvbmZpZ19jbG9zZShwYXJzZXIpOworCX07CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvbmJkLWNsaWVudC5jIGIvbmV0d29ya2luZy9uYmQtY2xpZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwMTQzMAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbmJkLWNsaWVudC5jCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTAgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxuZXRpbmV0L3RjcC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKy8vYXBwbGV0OklGX05CRENMSUVOVChBUFBMRVRfT0RETkFNRShuYmQtY2xpZW50LCBuYmRjbGllbnQsIEJCX0RJUl9VU1JfU0JJTiwgQkJfU1VJRF9EUk9QLCBuYmRjbGllbnQpKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfTkJEQ0xJRU5UKSArPSBuYmQtY2xpZW50Lm8KKworLy9jb25maWc6Y29uZmlnIE5CRENMSUVOVAorLy9jb25maWc6CWJvb2wgIm5iZC1jbGllbnQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgTmV0d29yayBibG9jayBkZXZpY2UgY2xpZW50CisKKyNkZWZpbmUgTkJEX1NFVF9TT0NLICAgICAgICAgIF9JTygweGFiLCAwKQorI2RlZmluZSBOQkRfU0VUX0JMS1NJWkUgICAgICAgX0lPKDB4YWIsIDEpCisjZGVmaW5lIE5CRF9TRVRfU0laRSAgICAgICAgICBfSU8oMHhhYiwgMikKKyNkZWZpbmUgTkJEX0RPX0lUICAgICAgICAgICAgIF9JTygweGFiLCAzKQorI2RlZmluZSBOQkRfQ0xFQVJfU09DSyAgICAgICAgX0lPKDB4YWIsIDQpCisjZGVmaW5lIE5CRF9DTEVBUl9RVUVVRSAgICAgICBfSU8oMHhhYiwgNSkKKyNkZWZpbmUgTkJEX1BSSU5UX0RFQlVHICAgICAgIF9JTygweGFiLCA2KQorI2RlZmluZSBOQkRfU0VUX1NJWkVfQkxPQ0tTICAgX0lPKDB4YWIsIDcpCisjZGVmaW5lIE5CRF9ESVNDT05ORUNUICAgICAgICBfSU8oMHhhYiwgOCkKKyNkZWZpbmUgTkJEX1NFVF9USU1FT1VUICAgICAgIF9JTygweGFiLCA5KQorCisvL3VzYWdlOiNkZWZpbmUgbmJkY2xpZW50X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJIT1NUIFBPUlQgQkxPQ0tERVYiCisvL3VzYWdlOiNkZWZpbmUgbmJkY2xpZW50X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ29ubmVjdCB0byBIT1NUIGFuZCBwcm92aWRlIGEgbmV0d29yayBibG9jayBkZXZpY2Ugb24gQkxPQ0tERVYiCisKKy8vVE9ETzogbW9yZSBjb21wYXQgd2l0aCBuYmQtY2xpZW50IHZlcnNpb24gMi45LjEzIC0KKy8vVXNhZ2U6IG5iZC1jbGllbnQgW2JzPWJsb2Nrc2l6ZV0gW3RpbWVvdXQ9c2VjXSBob3N0IHBvcnQgbmJkX2RldmljZSBbLXN3YXBdIFstcGVyc2lzdF0gWy1ub2ZvcmtdCisvL09yICAgOiBuYmQtY2xpZW50IC1kIG5iZF9kZXZpY2UKKy8vT3IgICA6IG5iZC1jbGllbnQgLWMgbmJkX2RldmljZQorLy9EZWZhdWx0IHZhbHVlIGZvciBibG9ja3NpemUgaXMgMTAyNCAocmVjb21tZW5kZWQgZm9yIGV0aGVybmV0KQorLy9BbGxvd2VkIHZhbHVlcyBmb3IgYmxvY2tzaXplIGFyZSA1MTIsMTAyNCwyMDQ4LDQwOTYKKy8vTm90ZSwgdGhhdCBrZXJuZWwgMi40LjIgYW5kIG9sZGVyIG9uZXMgZG8gbm90IHdvcmsgY29ycmVjdGx5IHdpdGgKKy8vYmxvY2tzaXplcyBvdGhlciB0aGFuIDEwMjQgd2l0aG91dCBwYXRjaGVzCisKK2ludCBuYmRjbGllbnRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG5iZGNsaWVudF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBsb25nIHRpbWVvdXQgPSAwOworI2lmIEJCX01NVQorCWludCBub2ZvcmsgPSAwOworI2VuZGlmCisJY2hhciAqaG9zdCwgKnBvcnQsICpkZXZpY2U7CisJc3RydWN0IG5iZF9oZWFkZXJfdCB7CisJCXVpbnQ2NF90IG1hZ2ljMTsgLy8gIk5CRE1BR0lDIgorCQl1aW50NjRfdCBtYWdpYzI7IC8vIDB4NDIwMjgxODYxMjUzIGJpZyBlbmRpYW4KKwkJdWludDY0X3QgZGV2c2l6ZTsKKwkJdWludDMyX3QgZmxhZ3M7CisJCWNoYXIgZGF0YVsxMjRdOworCX0gbmJkX2hlYWRlcjsKKwlzdHJ1Y3QgYnVnX2NoZWNrIHsKKwkJY2hhciBjW29mZnNldG9mKHN0cnVjdCBuYmRfaGVhZGVyX3QsIGRhdGEpID09IDgrOCs4KzQgPyAxIDogLTFdOworCX07CisKKwkvLyBQYXJzZSBjb21tYW5kIGxpbmUgc3R1ZmYgKGp1c3QgYSBzdHViIG5vdykKKwlpZiAoYXJnYyAhPSA0KQorCQliYl9zaG93X3VzYWdlKCk7CisKKyNpZiAhQkJfTU1VCisJYmJfZGFlbW9uaXplX29yX3JleGVjKERBRU1PTl9DTE9TRV9FWFRSQV9GRFMsIGFyZ3YpOworI2VuZGlmCisKKwlob3N0ID0gYXJndlsxXTsKKwlwb3J0ID0gYXJndlsyXTsKKwlkZXZpY2UgPSBhcmd2WzNdOworCisJLy8gUmVwZWF0IHVudGlsIHNwYW5rZWQgKC1wZXJzaXN0IGJlaGF2aW9yKQorCWZvciAoOzspIHsKKwkJaW50IHNvY2ssIG5iZDsKKwkJaW50IHJvOworCisJCS8vIE1ha2Ugc3VyZSB0aGUgL2Rldi9uYmQgZXhpc3RzCisJCW5iZCA9IHhvcGVuKGRldmljZSwgT19SRFdSKTsKKworCQkvLyBGaW5kIGFuZCBjb25uZWN0IHRvIHNlcnZlcgorCQlzb2NrID0gY3JlYXRlX2FuZF9jb25uZWN0X3N0cmVhbV9vcl9kaWUoaG9zdCwgeGF0b3UxNihwb3J0KSk7CisJCXNldHNvY2tvcHRfMShzb2NrLCBJUFBST1RPX1RDUCwgVENQX05PREVMQVkpOworCisJCS8vIExvZyBvbiB0byB0aGUgc2VydmVyCisJCXhyZWFkKHNvY2ssICZuYmRfaGVhZGVyLCA4KzgrOCs0ICsgMTI0KTsKKwkJaWYgKG1lbWNtcCgmbmJkX2hlYWRlci5tYWdpYzEsICJOQkRNQUdJQyIiXHgwMFx4MDBceDQyXHgwMlx4ODFceDg2XHgxMlx4NTMiLCAxNikgIT0gMCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJsb2dpbiBmYWlsZWQiKTsKKworCQkvLyBTZXQgNGsgYmxvY2sgc2l6ZS4gIEV2ZXJ5dGhpbmcgdXNlcyB0aGF0IHRoZXNlIGRheXMKKwkJaW9jdGwobmJkLCBOQkRfU0VUX0JMS1NJWkUsIDQwOTYpOworCQlpb2N0bChuYmQsIE5CRF9TRVRfU0laRV9CTE9DS1MsIFNXQVBfQkU2NChuYmRfaGVhZGVyLmRldnNpemUpIC8gNDA5Nik7CisJCWlvY3RsKG5iZCwgTkJEX0NMRUFSX1NPQ0spOworCisJCS8vIElmIHRoZSBzdWNrZXIgd2FzIGV4cG9ydGVkIHJlYWQgb25seSwgcmVzcGVjdCB0aGF0IGxvY2FsbHkKKwkJcm8gPSAobmJkX2hlYWRlci5mbGFncyAmIFNXQVBfQkUzMigyKSkgLyBTV0FQX0JFMzIoMik7CisJCWlmIChpb2N0bChuYmQsIEJMS1JPU0VULCAmcm8pIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiQkxLUk9TRVQiKTsKKworCQlpZiAodGltZW91dCkKKwkJCWlmIChpb2N0bChuYmQsIE5CRF9TRVRfVElNRU9VVCwgdGltZW91dCkpCisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJOQkRfU0VUX1RJTUVPVVQiKTsKKwkJaWYgKGlvY3RsKG5iZCwgTkJEX1NFVF9TT0NLLCBzb2NrKSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiTkJEX1NFVF9TT0NLIik7CisKKwkJLy8gaWYgKHN3YXApIG1sb2NrYWxsKE1DTF9DVVJSRU5UfE1DTF9GVVRVUkUpOworCisjaWYgQkJfTU1VCisJCS8vIE9wZW4gdGhlIGRldmljZSB0byBmb3JjZSByZXJlYWQgb2YgdGhlIHBhcnRpdGlvbiB0YWJsZS4KKwkJLy8gTmVlZCB0byBkbyBpdCBpbiBhIHNlcGFyYXRlIHByb2Nlc3MsIHNpbmNlIG9wZW4oZGV2aWNlKQorCQkvLyBuZWVkcyBzb21lIG90aGVyIHByb2Nlc3MgdG8gc2l0IGluIGlvY3RsKG5iZCwgTkJEX0RPX0lUKS4KKwkJaWYgKGZvcmsoKSA9PSAwKSB7CisJCQljaGFyICpzID0gc3RycmNocihkZXZpY2UsICcvJyk7CisJCQlzcHJpbnRmKG5iZF9oZWFkZXIuZGF0YSwgIi9zeXMvYmxvY2svJS4zMnMvcGlkIiwgcyA/IHMgKyAxIDogZGV2aWNlKTsKKwkJCS8vIElzIGl0IHVwIHlldD8KKwkJCWZvciAoOzspIHsKKwkJCQlpbnQgZmQgPSBvcGVuKG5iZF9oZWFkZXIuZGF0YSwgT19SRE9OTFkpOworCQkJCWlmIChmZCA+PSAwKSB7CisJCQkJCS8vY2xvc2UoZmQpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJc2xlZXAoMSk7CisJCQl9CisJCQlvcGVuKGRldmljZSwgT19SRE9OTFkpOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvLyBEYWVtb25pemUgaGVyZQorCQlpZiAoIW5vZm9yaykgeworCQkJZGFlbW9uKDAsIDApOworCQkJbm9mb3JrID0gMTsKKwkJfQorI2VuZGlmCisKKwkJLy8gVGhpcyB0dXJucyB1cyAodGhlIHByb2Nlc3MgdGhhdCBjYWxscyB0aGlzIGlvY3RsKQorCQkvLyBpbnRvIGEgZGVkaWNhdGVkIE5CRCByZXF1ZXN0IGhhbmRsZXIuCisJCS8vIFdlIGJsb2NrIGhlcmUgZm9yIGEgbG9uZyB0aW1lLgorCQkvLyBXaGVuIGV4YWN0bHkgaW9jdGwgcmV0dXJucz8gT24gYSBzaWduYWwsCisJCS8vIG9yIGlmIHNvbWVvbmUgZG9lcyBpb2N0bChOQkRfRElTQ09OTkVDVCkgW25iZC1jbGllbnQgLWRdLgorCQlpZiAoaW9jdGwobmJkLCBOQkRfRE9fSVQpID49IDAgfHwgZXJybm8gPT0gRUJBRFIpIHsKKwkJCS8vIEZsdXNoIHF1ZXVlIGFuZCBleGl0CisJCQlpb2N0bChuYmQsIE5CRF9DTEVBUl9RVUVVRSk7CisJCQlpb2N0bChuYmQsIE5CRF9DTEVBUl9TT0NLKTsKKwkJCWJyZWFrOworCQl9CisKKwkJY2xvc2Uoc29jayk7CisJCWNsb3NlKG5iZCk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL25jLmMgYi9uZXR3b3JraW5nL25jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY5ZTE3NAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbmMuYwpAQCAtMCwwICsxLDI3OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBuYzogbWluaS1uZXRjYXQgLSBidWlsdCBmcm9tIHRoZSBncm91bmQgdXAgZm9yIExSUAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OCwgMTk5OSAgQ2hhcmxlcyBQLiBXcmlnaHQKKyAqIENvcHlyaWdodCAoQykgMTk5OCAgRGF2ZSBDaW5lZ2UKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvL2NvbmZpZzpjb25maWcgTkMKKy8vY29uZmlnOglib29sICJuYyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBBIHNpbXBsZSBVbml4IHV0aWxpdHkgd2hpY2ggcmVhZHMgYW5kIHdyaXRlcyBkYXRhIGFjcm9zcyBuZXR3b3JrCisvL2NvbmZpZzoJICBjb25uZWN0aW9ucy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIE5DX1NFUlZFUgorLy9jb25maWc6CWJvb2wgIk5ldGNhdCBzZXJ2ZXIgb3B0aW9ucyAoLWwpIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gTkMKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBBbGxvdyBuZXRjYXQgdG8gYWN0IGFzIGEgc2VydmVyLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgTkNfRVhUUkEKKy8vY29uZmlnOglib29sICJOZXRjYXQgZXh0ZW5zaW9ucyAoLWVpdyBhbmQgLWYgRklMRSkiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBOQworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEFkZCAtZSAoc3VwcG9ydCBmb3IgZXhlY3V0aW5nIHRoZSByZXN0IG9mIHRoZSBjb21tYW5kIGxpbmUgYWZ0ZXIKKy8vY29uZmlnOgkgIG1ha2luZyBvciByZWNlaXZpbmcgYSBzdWNjZXNzZnVsIGNvbm5lY3Rpb24pLCAtaSAoZGVsYXkgaW50ZXJ2YWwgZm9yCisvL2NvbmZpZzoJICBsaW5lcyBzZW50KSwgLXcgKHRpbWVvdXQgZm9yIGluaXRpYWwgY29ubmVjdGlvbikuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBOQ18xMTBfQ09NUEFUCisvL2NvbmZpZzoJYm9vbCAiTmV0Y2F0IDEuMTAgY29tcGF0aWJpbGl0eSAoKzIuNWspIgorLy9jb25maWc6CWRlZmF1bHQgbiAgIyBvZmYgc3BlY2lhbGx5IGZvciBSb2IKKy8vY29uZmlnOglkZXBlbmRzIG9uIE5DCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVGhpcyBvcHRpb24gbWFrZXMgbmMgY2xvc2VseSBmb2xsb3cgb3JpZ2luYWwgbmMtMS4xMC4KKy8vY29uZmlnOgkgIFRoZSBjb2RlIGlzIGFib3V0IDIuNWsgYmlnZ2VyLiBJdCBlbmFibGVzCisvL2NvbmZpZzoJICAtcyBBRERSLCAtbiwgLXUsIC12LCAtbyBGSUxFLCAteiBvcHRpb25zLCBidXQgbG9zZXMKKy8vY29uZmlnOgkgIGJ1c3lib3gtc3BlY2lmaWMgZXh0ZW5zaW9uczogLWYgRklMRS4KKworI2lmIEVOQUJMRV9OQ18xMTBfQ09NUEFUCisjIGluY2x1ZGUgIm5jX2Jsb2F0eS5jIgorI2Vsc2UKKworLy91c2FnZTojaWYgIUVOQUJMRV9OQ18xMTBfQ09NUEFUCisvL3VzYWdlOgorLy91c2FnZTojaWYgRU5BQkxFX05DX1NFUlZFUiB8fCBFTkFCTEVfTkNfRVhUUkEKKy8vdXNhZ2U6I2RlZmluZSBOQ19PUFRJT05TX1NUUiAiXG4iCisvL3VzYWdlOiNlbHNlCisvL3VzYWdlOiNkZWZpbmUgTkNfT1BUSU9OU19TVFIKKy8vdXNhZ2U6I2VuZGlmCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG5jX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CUlGX05DX0VYVFJBKCJbLWlOXSBbLXdOXSAiKUlGX05DX1NFUlZFUigiWy1sXSBbLXAgUE9SVF0gIikKKy8vdXNhZ2U6ICAgICAgICJbIklGX05DX0VYVFJBKCItZiBGSUxFfCIpIklQQUREUiBQT1JUXSJJRl9OQ19FWFRSQSgiIFstZSBQUk9HXSIpCisvL3VzYWdlOiNkZWZpbmUgbmNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJPcGVuIGEgcGlwZSB0byBJUDpQT1JUIiBJRl9OQ19FWFRSQSgiIG9yIEZJTEUiKQorLy91c2FnZToJTkNfT1BUSU9OU19TVFIKKy8vdXNhZ2U6CUlGX05DX1NFUlZFUigKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGlzdGVuIG1vZGUsIGZvciBpbmJvdW5kIGNvbm5lY3RzIgorLy91c2FnZToJSUZfTkNfRVhUUkEoCisvL3VzYWdlOiAgICAgIlxuCQkodXNlIC1sbCB3aXRoIC1lIGZvciBwZXJzaXN0ZW50IHNlcnZlcikiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1wIFBPUlQJTG9jYWwgcG9ydCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05DX0VYVFJBKAorLy91c2FnZTogICAgICJcbgktdyBTRUMJQ29ubmVjdCB0aW1lb3V0IgorLy91c2FnZTogICAgICJcbgktaSBTRUMJRGVsYXkgaW50ZXJ2YWwgZm9yIGxpbmVzIHNlbnQiCisvL3VzYWdlOiAgICAgIlxuCS1mIEZJTEUJVXNlIGZpbGUgKGFsYSAvZGV2L3R0eVMwKSBpbnN0ZWFkIG9mIG5ldHdvcmsiCisvL3VzYWdlOiAgICAgIlxuCS1lIFBST0cJUnVuIFBST0cgYWZ0ZXIgY29ubmVjdCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbmNfbm90ZXNfdXNhZ2UgIiIKKy8vdXNhZ2U6CUlGX05DX0VYVFJBKAorLy91c2FnZTogICAgICAgIlRvIHVzZSBuZXRjYXQgYXMgYSB0ZXJtaW5hbCBlbXVsYXRvciBvbiBhIHNlcmlhbCBwb3J0OlxuXG4iCisvL3VzYWdlOiAgICAgICAiJCBzdHR5IDExNTIwMCAtRiAvZGV2L3R0eVMwXG4iCisvL3VzYWdlOiAgICAgICAiJCBzdHR5IHJhdyAtZWNobyAtY3RsZWNobyAmJiBuYyAtZiAvZGV2L3R0eVMwXG4iCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG5jX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIG5jIGZvb2Jhci5zb21lZG9tYWluLmNvbSAyNVxuIgorLy91c2FnZTogICAgICAgIjIyMCBmb29iYXIgRVNNVFAgRXhpbSAzLjEyICMxIFNhdCwgMTUgQXByIDIwMDAgMDA6MDM6MDIgLTA2MDBcbiIKKy8vdXNhZ2U6ICAgICAgICJoZWxwXG4iCisvL3VzYWdlOiAgICAgICAiMjE0LUNvbW1hbmRzIHN1cHBvcnRlZDpcbiIKKy8vdXNhZ2U6ICAgICAgICIyMTQtICAgIEhFTE8gRUhMTyBNQUlMIFJDUFQgREFUQSBBVVRIXG4iCisvL3VzYWdlOiAgICAgICAiMjE0ICAgICBOT09QIFFVSVQgUlNFVCBIRUxQXG4iCisvL3VzYWdlOiAgICAgICAicXVpdFxuIgorLy91c2FnZTogICAgICAgIjIyMSBmb29iYXIgY2xvc2luZyBjb25uZWN0aW9uXG4iCisvL3VzYWdlOgorLy91c2FnZTojZW5kaWYKKworLyogTG90cyBvZiBzbWFsbCBkaWZmZXJlbmNlcyBpbiBmZWF0dXJlcworICogd2hlbiBjb21wYXJlZCB0byAic3RhbmRhcmQiIG5jCisgKi8KKworc3RhdGljIHZvaWQgdGltZW91dChpbnQgc2lnbnVtIFVOVVNFRF9QQVJBTSkKK3sKKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgidGltZWQgb3V0Iik7Cit9CisKK2ludCBuY19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbmNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJLyogc2ZkIHNpdHMgX2hlcmVfIG9ubHkgYmVjYXVzZSBvZiAicmVwZWF0IiBvcHRpb24gKC1sIC1sKS4gKi8KKwlpbnQgc2ZkID0gc2ZkOyAvKiBmb3IgZ2NjICovCisJaW50IGNmZCA9IDA7CisJdW5zaWduZWQgbHBvcnQgPSAwOworCUlGX05PVF9OQ19TRVJWRVIoY29uc3QpIHVuc2lnbmVkIGRvX2xpc3RlbiA9IDA7CisJSUZfTk9UX05DX0VYVFJBIChjb25zdCkgdW5zaWduZWQgd3NlY3MgPSAwOworCUlGX05PVF9OQ19FWFRSQSAoY29uc3QpIHVuc2lnbmVkIGRlbGF5ID0gMDsKKwlJRl9OT1RfTkNfRVhUUkEgKGNvbnN0IGludCBleGVjcGFyYW0gPSAwOykKKwlJRl9OQ19FWFRSQSAgICAgKGNoYXIgKipleGVjcGFyYW0gPSBOVUxMOykKKwlmZF9zZXQgcmVhZGZkcywgdGVzdGZkczsKKwlpbnQgb3B0OyAvKiBtdXN0IGJlIHNpZ25lZCAoZ2V0b3B0IHJldHVybnMgLTEpICovCisKKwlpZiAoRU5BQkxFX05DX1NFUlZFUiB8fCBFTkFCTEVfTkNfRVhUUkEpIHsKKwkJLyogZ2V0b3B0MzIgaXMgX2FsbW9zdF8gdXNhYmxlOgorCQkqKiBpdCBjYW5ub3QgaGFuZGxlICIuLi4gLWUgUFJPRyAtcHJvZy1vcHQiICovCisJCXdoaWxlICgob3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsCisJCQkiIiBJRl9OQ19TRVJWRVIoImxwOiIpIElGX05DX0VYVFJBKCJ3Omk6ZjplOiIpICkpID4gMAorCQkpIHsKKwkJCWlmIChFTkFCTEVfTkNfU0VSVkVSICYmIG9wdCA9PSAnbCcpCisJCQkJSUZfTkNfU0VSVkVSKGRvX2xpc3RlbisrKTsKKwkJCWVsc2UgaWYgKEVOQUJMRV9OQ19TRVJWRVIgJiYgb3B0ID09ICdwJykKKwkJCQlJRl9OQ19TRVJWRVIobHBvcnQgPSBiYl9sb29rdXBfcG9ydChvcHRhcmcsICJ0Y3AiLCAwKSk7CisJCQllbHNlIGlmIChFTkFCTEVfTkNfRVhUUkEgJiYgb3B0ID09ICd3JykKKwkJCQlJRl9OQ19FWFRSQSggd3NlY3MgPSB4YXRvdShvcHRhcmcpKTsKKwkJCWVsc2UgaWYgKEVOQUJMRV9OQ19FWFRSQSAmJiBvcHQgPT0gJ2knKQorCQkJCUlGX05DX0VYVFJBKCBkZWxheSA9IHhhdG91KG9wdGFyZykpOworCQkJZWxzZSBpZiAoRU5BQkxFX05DX0VYVFJBICYmIG9wdCA9PSAnZicpCisJCQkJSUZfTkNfRVhUUkEoIGNmZCA9IHhvcGVuKG9wdGFyZywgT19SRFdSKSk7CisJCQllbHNlIGlmIChFTkFCTEVfTkNfRVhUUkEgJiYgb3B0ID09ICdlJyAmJiBvcHRpbmQgPD0gYXJnYykgeworCQkJCS8qIFdlIGNhbm5vdCBqdXN0ICdicmVhaycuIFdlIHNob3VsZCBsZXQgZ2V0b3B0IGZpbmlzaC4KKwkJCQkqKiBPciBlbHNlIHdlIHdvbid0IGJlIGFibGUgdG8gZmluZCB3aGVyZQorCQkJCSoqICdob3N0JyBhbmQgJ3BvcnQnIHBhcmFtcyBhcmUKKwkJCQkqKiAodGhpbmsgIm5jIC13IDYwIGhvc3QgcG9ydCAtZSBQUk9HIikuICovCisJCQkJSUZfTkNfRVhUUkEoCisJCQkJCWNoYXIgKipwOworCQkJCQkvLyArMjogb25lIGZvciBwcm9nbmFtZSAob3B0YXJnKSBhbmQgb25lIGZvciBOVUxMCisJCQkJCWV4ZWNwYXJhbSA9IHh6YWxsb2Moc2l6ZW9mKGNoYXIqKSAqIChhcmdjIC0gb3B0aW5kICsgMikpOworCQkJCQlwID0gZXhlY3BhcmFtOworCQkJCQkqcCsrID0gb3B0YXJnOworCQkJCQl3aGlsZSAob3B0aW5kIDwgYXJnYykgeworCQkJCQkJKnArKyA9IGFyZ3Zbb3B0aW5kKytdOworCQkJCQl9CisJCQkJKQorCQkJCS8qIG9wdGluZCBwb2ludHMgdG8gYXJndlthcmdjXSAoTlVMTCkgbm93LgorCQkJCSoqIEZJWE1FOiB3ZSBhc3N1bWUgdGhhdCBnZXRvcHQgd2lsbCBub3QgY291bnQgb3B0aW9ucworCQkJCSoqIHBvc3NpYmx5IHByZXNlbnQgb24gIi1lIFBST0cgQVJHUyIgYW5kIHdpbGwgbm90CisJCQkJKiogaW5jbHVkZSB0aGVtIGludG8gZmluYWwgdmFsdWUgb2Ygb3B0aW5kCisJCQkJKiogd2hpY2ggaXMgdG8gYmUgdXNlZCAuLi4gICovCisJCQl9IGVsc2UgYmJfc2hvd191c2FnZSgpOworCQl9CisJCWFyZ3YgKz0gb3B0aW5kOyAvKiAuLi4gaGVyZSEgKi8KKwkJYXJnYyAtPSBvcHRpbmQ7CisJCS8vIC1sIGFuZCAtZiBkb24ndCBtaXgKKwkJaWYgKGRvX2xpc3RlbiAmJiBjZmQpIGJiX3Nob3dfdXNhZ2UoKTsKKwkJLy8gRmlsZSBtb2RlIG5lZWRzIG5lZWQgemVybyBhcmd1bWVudHMsIGxpc3RlbiBtb2RlIG5lZWRzIHplcm8gb3Igb25lLAorCQkvLyBjbGllbnQgbW9kZSBuZWVkcyBvbmUgb3IgdHdvCisJCWlmIChjZmQpIHsKKwkJCWlmIChhcmdjKSBiYl9zaG93X3VzYWdlKCk7CisJCX0gZWxzZSBpZiAoZG9fbGlzdGVuKSB7CisJCQlpZiAoYXJnYyA+IDEpIGJiX3Nob3dfdXNhZ2UoKTsKKwkJfSBlbHNlIHsKKwkJCWlmICghYXJnYyB8fCBhcmdjID4gMikgYmJfc2hvd191c2FnZSgpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGFyZ2MgIT0gMykgYmJfc2hvd191c2FnZSgpOworCQlhcmdjLS07CisJCWFyZ3YrKzsKKwl9CisKKwlpZiAod3NlY3MpIHsKKwkJc2lnbmFsKFNJR0FMUk0sIHRpbWVvdXQpOworCQlhbGFybSh3c2Vjcyk7CisJfQorCisJaWYgKCFjZmQpIHsKKwkJaWYgKGRvX2xpc3RlbikgeworCQkJc2ZkID0gY3JlYXRlX2FuZF9iaW5kX3N0cmVhbV9vcl9kaWUoYXJndlswXSwgbHBvcnQpOworCQkJeGxpc3RlbihzZmQsIGRvX2xpc3Rlbik7IC8qIGNhbiBiZSA+IDEgKi8KKyNpZiAwICAvKiBuYy0xLjEwIGRvZXMgbm90IGRvIHRoaXMgKHdpdGhvdXQgLXYpICovCisJCQkvKiBJZiB3ZSBkaWRuJ3Qgc3BlY2lmeSBhIHBvcnQgbnVtYmVyLAorCQkJICogcXVlcnkgYW5kIHByaW50IGl0IGFmdGVyIGxpc3RlbigpICovCisJCQlpZiAoIWxwb3J0KSB7CisJCQkJbGVuX2FuZF9zb2NrYWRkciBsc2E7CisJCQkJbHNhLmxlbiA9IExTQV9TSVpFT0ZfU0E7CisJCQkJZ2V0c29ja25hbWUoc2ZkLCAmbHNhLnUuc2EsICZsc2EubGVuKTsKKwkJCQlscG9ydCA9IGdldF9ucG9ydCgmbHNhLnUuc2EpOworCQkJCWZkcHJpbnRmKDIsICIlZFxuIiwgbnRvaHMobHBvcnQpKTsKKwkJCX0KKyNlbmRpZgorCQkJY2xvc2Vfb25fZXhlY19vbihzZmQpOworIGFjY2VwdF9hZ2FpbjoKKwkJCWNmZCA9IGFjY2VwdChzZmQsIE5VTEwsIDApOworCQkJaWYgKGNmZCA8IDApCisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJhY2NlcHQiKTsKKwkJCWlmICghZXhlY3BhcmFtKQorCQkJCWNsb3NlKHNmZCk7CisJCX0gZWxzZSB7CisJCQljZmQgPSBjcmVhdGVfYW5kX2Nvbm5lY3Rfc3RyZWFtX29yX2RpZShhcmd2WzBdLAorCQkJCWFyZ3ZbMV0gPyBiYl9sb29rdXBfcG9ydChhcmd2WzFdLCAidGNwIiwgMCkgOiAwKTsKKwkJfQorCX0KKworCWlmICh3c2VjcykgeworCQlhbGFybSgwKTsKKwkJLyogTm9uLWlnbm9yZWQgc2lnbmFscyByZXZlcnQgdG8gU0lHX0RGTCBvbiBleGVjIGFueXdheSAqLworCQkvKnNpZ25hbChTSUdBTFJNLCBTSUdfREZMKTsqLworCX0KKworCS8qIC1lIGdpdmVuPyAqLworCWlmIChleGVjcGFyYW0pIHsKKwkJcGlkX3QgcGlkOworCQkvKiBXaXRoIG1vcmUgdGhhbiBvbmUgLWwsIHJlcGVhdGVkbHkgYWN0IGFzIHNlcnZlciAqLworCQlpZiAoZG9fbGlzdGVuID4gMSAmJiAocGlkID0geHZmb3JrKCkpICE9IDApIHsKKwkJCS8qIHBhcmVudCAqLworCQkJLyogcHJldmVudCB6b21iaWVzICovCisJCQlzaWduYWwoU0lHQ0hMRCwgU0lHX0lHTik7CisJCQljbG9zZShjZmQpOworCQkJZ290byBhY2NlcHRfYWdhaW47CisJCX0KKwkJLyogY2hpbGQsIG9yIG1haW4gdGhyZWFkIGlmIG9ubHkgb25lIC1sICovCisJCXhtb3ZlX2ZkKGNmZCwgMCk7CisJCXhkdXAyKDAsIDEpOworCQkvKnhkdXAyKDAsIDIpOyAtIG9yaWdpbmFsIG5jIDEuMTAgZG9lcyB0aGlzLCB3ZSBkb24ndCAqLworCQlJRl9OQ19FWFRSQShCQl9FWEVDVlAoZXhlY3BhcmFtWzBdLCBleGVjcGFyYW0pOykKKwkJSUZfTkNfRVhUUkEoYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBleGVjdXRlICclcyciLCBleGVjcGFyYW1bMF0pOykKKwl9CisKKwkvKiBTZWxlY3QgbG9vcCBjb3B5aW5nIHN0ZGluIHRvIGNmZCwgYW5kIGNmZCB0byBzdGRvdXQgKi8KKworCUZEX1pFUk8oJnJlYWRmZHMpOworCUZEX1NFVChjZmQsICZyZWFkZmRzKTsKKwlGRF9TRVQoU1RESU5fRklMRU5PLCAmcmVhZGZkcyk7CisKKwlmb3IgKDs7KSB7CisJCWludCBmZDsKKwkJaW50IG9mZDsKKwkJaW50IG5yZWFkOworCisJCXRlc3RmZHMgPSByZWFkZmRzOworCisJCWlmIChzZWxlY3QoY2ZkICsgMSwgJnRlc3RmZHMsIE5VTEwsIE5VTEwsIE5VTEwpIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2VsZWN0Iik7CisKKyNkZWZpbmUgaW9idWYgYmJfY29tbW9uX2J1ZnNpejEKKwkJZmQgPSBTVERJTl9GSUxFTk87CisJCXdoaWxlICgxKSB7CisJCQlpZiAoRkRfSVNTRVQoZmQsICZ0ZXN0ZmRzKSkgeworCQkJCW5yZWFkID0gc2FmZV9yZWFkKGZkLCBpb2J1Ziwgc2l6ZW9mKGlvYnVmKSk7CisJCQkJaWYgKGZkID09IGNmZCkgeworCQkJCQlpZiAobnJlYWQgPCAxKQorCQkJCQkJZXhpdChFWElUX1NVQ0NFU1MpOworCQkJCQlvZmQgPSBTVERPVVRfRklMRU5POworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChucmVhZCA8IDEpIHsKKwkJCQkJCS8qIENsb3NlIG91dGdvaW5nIGhhbGYtY29ubmVjdGlvbiBzbyB0aGV5IGdldCBFT0YsCisJCQkJCQkgKiBidXQgbGVhdmUgaW5jb21pbmcgYWxvbmUgc28gd2UgY2FuIHNlZSByZXNwb25zZSAqLworCQkJCQkJc2h1dGRvd24oY2ZkLCBTSFVUX1dSKTsKKwkJCQkJCUZEX0NMUihTVERJTl9GSUxFTk8sICZyZWFkZmRzKTsKKwkJCQkJfQorCQkJCQlvZmQgPSBjZmQ7CisJCQkJfQorCQkJCXh3cml0ZShvZmQsIGlvYnVmLCBucmVhZCk7CisJCQkJaWYgKGRlbGF5ID4gMCkKKwkJCQkJc2xlZXAoZGVsYXkpOworCQkJfQorCQkJaWYgKGZkID09IGNmZCkKKwkJCQlicmVhazsKKwkJCWZkID0gY2ZkOworCQl9CisJfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL25jX2Jsb2F0eS5jIGIvbmV0d29ya2luZy9uY19ibG9hdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzFhZTFhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9uY19ibG9hdHkuYwpAQCAtMCwwICsxLDkyMiBAQAorLyogQmFzZWQgb24gbmV0Y2F0IDEuMTAgUkVMRUFTRSA5NjAzMjAgd3JpdHRlbiBieSBob2JiaXRAYXZpYW4ub3JnLgorICogUmVsZWFzZWQgaW50byBwdWJsaWMgZG9tYWluIGJ5IHRoZSBhdXRob3IuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IERlbnlzIFZsYXNlbmtvLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQXV0aG9yJ3MgY29tbWVudHMgZnJvbSBuYyAxLjEwOgorICogPT09PT09PT09PT09PT09PT09PT09CisgKiBOZXRjYXQgaXMgZW50aXJlbHkgbXkgb3duIGNyZWF0aW9uLCBhbHRob3VnaCBwbGVudHkgb2Ygb3RoZXIgY29kZSB3YXMgdXNlZCBhcworICogZXhhbXBsZXMuICBJdCBpcyBmcmVlbHkgZ2l2ZW4gYXdheSB0byB0aGUgSW50ZXJuZXQgY29tbXVuaXR5IGluIHRoZSBob3BlIHRoYXQKKyAqIGl0IHdpbGwgYmUgdXNlZnVsLCB3aXRoIG5vIHJlc3RyaWN0aW9ucyBleGNlcHQgZ2l2aW5nIGNyZWRpdCB3aGVyZSBpdCBpcyBkdWUuCisgKiBObyBHUExzLCBCZXJrZWxleSBjb3B5cmlnaHRzIG9yIGFueSBvZiB0aGF0IG5vbnNlbnNlLiAgVGhlIGF1dGhvciBhc3N1bWVzIE5PCisgKiByZXNwb25zaWJpbGl0eSBmb3IgaG93IGFueW9uZSB1c2VzIGl0LiAgSWYgbmV0Y2F0IG1ha2VzIHlvdSByaWNoIHNvbWVob3cgYW5kCisgKiB5b3UncmUgZmVlbGluZyBnZW5lcm91cywgbWFpbCBtZSBhIGNoZWNrLiAgSWYgeW91IGFyZSBhZmZpbGlhdGVkIGluIGFueSB3YXkKKyAqIHdpdGggTWljcm9zb2Z0IE5ldHdvcmssIGdldCBhIGxpZmUuICBBbHdheXMgc2tpIGluIGNvbnRyb2wuICBDb21tZW50cywKKyAqIHF1ZXN0aW9ucywgYW5kIHBhdGNoZXMgdG8gaG9iYml0QGF2aWFuLm9yZy4KKyAqIC4uLgorICogTmV0Y2F0IGFuZCB0aGUgYXNzb2NpYXRlZCBwYWNrYWdlIGlzIGEgcHJvZHVjdCBvZiBBdmlhbiBSZXNlYXJjaCwgYW5kIGlzIGZyZWVseQorICogYXZhaWxhYmxlIGluIGZ1bGwgc291cmNlIGZvcm0gd2l0aCBubyByZXN0cmljdGlvbnMgc2F2ZSBhbiBvYmxpZ2F0aW9uIHRvIGdpdmUKKyAqIGNyZWRpdCB3aGVyZSBkdWUuCisgKiAuLi4KKyAqIEEgZGFtbiB1c2VmdWwgbGl0dGxlICJiYWNrZW5kIiB1dGlsaXR5IGJlZ3VuIDk1MDkxNSBvciB0aGVyZWFib3V0cywKKyAqIGFzICpIb2JiaXQqJ3MgZmlyc3QgcmVhbCBzdGFiIGF0IHNvbWUgc29ja2V0cyBwcm9ncmFtbWluZy4gIFNvbWV0aGluZyB0aGF0CisgKiBzaG91bGQgaGF2ZSBhbmQgaW5kZWVkIG1heSBoYXZlIGV4aXN0ZWQgdGVuIHllYXJzIGFnbywgYnV0IG5ldmVyIGJlY2FtZSBhCisgKiBzdGFuZGFyZCBVbml4IHV0aWxpdHkuICBJTUhPLCAibmMiIGNvdWxkIHRha2UgaXRzIHBsYWNlIHJpZ2h0IG5leHQgdG8gY2F0LAorICogY3AsIHJtLCBtdiwgZGQsIGxzLCBhbmQgYWxsIHRob3NlIG90aGVyIGNyeXB0aWMgYW5kIFVuaXgtbGlrZSB0aGluZ3MuCisgKiA9PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBNdWNoIG9mIGF1dGhvcidzIGNvbW1lbnRzIGFyZSBzdGlsbCByZXRhaW5lZCBpbiB0aGUgY29kZS4KKyAqCisgKiBGdW5jdGlvbmFsaXR5IHJlbW92ZWQgKHJhdGlvbmFsZSk6CisgKiAtIG1pbHRpcGxlLXBvcnQgcmFuZ2VzLCByYW5kb21pemVkIHBvcnQgc2Nhbm5pbmcgKHVzZSBubWFwKQorICogLSB0ZWxuZXQgc3VwcG9ydCAodXNlIHRlbG5ldCkKKyAqIC0gc291cmNlIHJvdXRpbmcKKyAqIC0gbXVsdGlwbGUgRE5TIGNoZWNrcworICogRnVuY3Rpb25hbHR5IHdoaWNoIGlzIGRpZmZlcmVudCBmcm9tIG5jIDEuMTA6CisgKiAtIFBST0cgaW4gJy1lIFBST0cnIGNhbiBoYXZlIEFSR1MgKGFuZCBvcHRpb25zKS4KKyAqICAgQmVjYXVzZSBvZiB0aGlzIC1lIG9wdGlvbiBtdXN0IGJlIGxhc3QuCisvL1RPRE86IHJlbW92ZSAtZSBpbmNvbXBhdGliaWxpdHk/CisgKiAtIHdlIGRvbid0IHJlZGlyZWN0IHN0ZGVyciB0byB0aGUgbmV0d29yayBzb2NrZXQgZm9yIHRoZSAtZSBQUk9HLgorICogICAoUFJPRyBjYW4gZG8gaXQgaXRzZWxmIGlmIG5lZWRlZCwgYnV0IHNvbWV0aW1lcyBpdCBpcyBOT1Qgd2FudGVkISkKKyAqIC0gbnVtZXJpYyBhZGRyZXNzZXMgYXJlIHByaW50ZWQgaW4gKCksIG5vdCBbXSAoSVB2NiBsb29rcyBiZXR0ZXIpLAorICogICBwb3J0IG51bWJlcnMgYXJlIGluc2lkZSAoKTogKDEuMi4zLjQ6NTY3OCkKKyAqIC0gbmV0d29yayByZWFkIGVycm9ycyBhcmUgcmVwb3J0ZWQgb24gdmVyYm9zZSBsZXZlbHMgPiAxCisgKiAgIChuYyAxLjEwIHRyZWF0cyB0aGVtIGFzIEVPRikKKyAqIC0gVENQIGNvbm5lY3RzIGZyb20gd3JvbmcgaXAvcG9ydHMgKGlmIHBlZXIgaXA6cG9ydCBpcyBzcGVjaWZpZWQKKyAqICAgb24gdGhlIGNvbW1hbmQgbGluZSwgYnV0IGFjY2VwdCgpIHNheXMgdGhhdCBpdCBjYW1lIGZyb20gZGlmZmVyZW50IGFkZHIpCisgKiAgIGFyZSBjbG9zZWQsIGJ1dCB3ZSBkb24ndCBleGl0IC0gd2UgY29udGludWUgdG8gbGlzdGVuL2FjY2VwdC4KKyAqIFNpbmNlIGJib3ggMS4yMjoKKyAqIC0gbmMgZXhpdHMgd2hlbiBfYm90aF8gc3RkaW4gYW5kIG5ldHdvcmsgYXJlIGNsb3NlZC4KKyAqICAgVGhpcyBtYWtlcyB0aGVzZSB0d28gY29tbWFuZHM6CisgKiAgICBlY2hvICJZZXMiIHwgbmMgMTI3LjAuMC4xIDEyMzQKKyAqICAgIGVjaG8gIm5vIiB8IG5jIC1scCAxMjM0CisgKiAgIGV4Y2hhbmdlIHRoZWlyIGRhdGEgX2FuZCBleGl0XyBpbnN0ZWFkIG9mIGJlaW5nIHN0dWNrLgorICovCisKKy8qIGRvbmUgaW4gbmMuYzogI2luY2x1ZGUgImxpYmJiLmgiICovCisKKy8vdXNhZ2U6I2lmIEVOQUJMRV9OQ18xMTBfQ09NUEFUCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG5jX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gSE9TVCBQT1JUICAtIGNvbm5lY3QiCisvL3VzYWdlOglJRl9OQ19TRVJWRVIoIlxuIgorLy91c2FnZTogICAgICAgIm5jIFtPUFRJT05TXSAtbCAtcCBQT1JUIFtIT1NUXSBbUE9SVF0gIC0gbGlzdGVuIgorLy91c2FnZToJKQorLy91c2FnZTojZGVmaW5lIG5jX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1lIFBST0cJUnVuIFBST0cgYWZ0ZXIgY29ubmVjdCAobXVzdCBiZSBsYXN0KSIKKy8vdXNhZ2U6CUlGX05DX1NFUlZFUigKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGlzdGVuIG1vZGUsIGZvciBpbmJvdW5kIGNvbm5lY3RzIgorLy91c2FnZTogICAgICJcbgktbGsJV2l0aCAtZSwgcHJvdmlkZXMgcGVyc2lzdGVudCBzZXJ2ZXIiCisvKiAtbGwgZG9lcyB0aGUgc2FtZSBhcyAtbGssIGJ1dCBpdHMgb3VyIGV4dGVuc2lvbiwgd2hpbGUgLWsgaXMgQlNEJ2QsCisgKiBwcmVzdW1hYmx5IG1vcmUgd2lkZWx5IGtub3duLiBUaGVyZWZvcmUgd2UgYWR2ZXJ0aXNlIGl0LCBub3QgLWxsLgorICogSSB3b3VsZCBsaWtlIHRvIGRyb3AgLWxsIHN1cHBvcnQsIGJ1dCBvdXIgInNtYWxsIiBuYyBzdXBwb3J0cyBpdCwKKyAqIGFuZCBSb2IgdXNlcyBpdC4KKyAqLworLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktcCBQT1JUCUxvY2FsIHBvcnQiCisvL3VzYWdlOiAgICAgIlxuCS1zIEFERFIJTG9jYWwgYWRkcmVzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXcgU0VDCVRpbWVvdXQgZm9yIGNvbm5lY3RzIGFuZCBmaW5hbCBuZXQgcmVhZHMiCisvL3VzYWdlOglJRl9OQ19FWFRSQSgKKy8vdXNhZ2U6ICAgICAiXG4JLWkgU0VDCURlbGF5IGludGVydmFsIGZvciBsaW5lcyBzZW50IiAvKiAiLCBwb3J0cyBzY2FubmVkIiAqLworLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktbglEb24ndCBkbyBETlMgcmVzb2x1dGlvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXUJVURQIG1vZGUiCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisvL3VzYWdlOglJRl9OQ19FWFRSQSgKKy8vdXNhZ2U6ICAgICAiXG4JLW8gRklMRQlIZXggZHVtcCB0cmFmZmljIgorLy91c2FnZTogICAgICJcbgkteglaZXJvLUkvTyBtb2RlIChzY2FubmluZykiCisvL3VzYWdlOgkpCisvL3VzYWdlOiNlbmRpZgorCisvKiAgICJcbgktcgkJUmFuZG9taXplIGxvY2FsIGFuZCByZW1vdGUgcG9ydHMiICovCisvKiAgICJcbgktZyBnYXRld2F5CVNvdXJjZS1yb3V0aW5nIGhvcCBwb2ludFtzXSwgdXAgdG8gOCIgKi8KKy8qICAgIlxuCS1HIG51bQkJU291cmNlLXJvdXRpbmcgcG9pbnRlcjogNCwgOCwgMTIsIC4uLiIgKi8KKy8qICAgIlxucG9ydCBudW1iZXJzIGNhbiBiZSBpbmRpdmlkdWFsIG9yIHJhbmdlczogbG8taGkgW2luY2x1c2l2ZV0iICovCisKKy8qIC1lIFBST0cgY2FuIHRha2UgQVJHUyB0b286ICJuYyAuLi4gLWUgbHMgLWwiLCBidXQgd2UgZG9uJ3QgZG9jdW1lbnQgaXQKKyAqIGluIGhlbHAgdGV4dDogbmMgMS4xMCBkb2VzIG5vdCBhbGxvdyB0aGF0LiBXZSBkb24ndCB3YW50IHRvIGVudGljZQorICogdXNlcnMgdG8gdXNlIHRoaXMgaW5jb21wYXRpYmlsaXR5ICovCisKK2VudW0geworCVNMRUFaRV9QT1JUID0gMzEzMzcsICAgICAgICAgICAgICAgLyogZm9yIFVEUC1zY2FuIFJUVCB0cmljaywgY2hhbmdlIGlmIHlhIHdhbnQgKi8KKwlCSUdTSVogPSA4MTkyLCAgICAgICAgICAgICAgICAgICAgIC8qIGJpZyBidWZmZXJzICovCisKKwluZXRmZCA9IDMsCisJb2ZkID0gNCwKK307CisKK3N0cnVjdCBnbG9iYWxzIHsKKwkvKiBnbG9iYWwgY21kIGZsYWdzOiAqLworCXVuc2lnbmVkIG9fdmVyYm9zZTsKKwl1bnNpZ25lZCBvX3dhaXQ7CisjaWYgRU5BQkxFX05DX0VYVFJBCisJdW5zaWduZWQgb19pbnRlcnZhbDsKKyNlbmRpZgorCisJLyppbnQgbmV0ZmQ7Ki8KKwkvKmludCBvZmQ7Ki8gICAgICAgICAgICAgICAgICAgICAvKiBoZXhkdW1wIG91dHB1dCBmZCAqLworI2lmIEVOQUJMRV9MRlMKKyNkZWZpbmUgU0VOVF9OX1JFQ1ZfTSAic2VudCAlbGx1LCByY3ZkICVsbHVcbiIKKwl1bnNpZ25lZCBsb25nIGxvbmcgd3JvdGVfb3V0OyAgICAgICAgICAvKiB0b3RhbCBzdGRvdXQgYnl0ZXMgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgd3JvdGVfbmV0OyAgICAgICAgICAvKiB0b3RhbCBuZXQgYnl0ZXMgKi8KKyNlbHNlCisjZGVmaW5lIFNFTlRfTl9SRUNWX00gInNlbnQgJXUsIHJjdmQgJXVcbiIKKwl1bnNpZ25lZCB3cm90ZV9vdXQ7ICAgICAgICAgIC8qIHRvdGFsIHN0ZG91dCBieXRlcyAqLworCXVuc2lnbmVkIHdyb3RlX25ldDsgICAgICAgICAgLyogdG90YWwgbmV0IGJ5dGVzICovCisjZW5kaWYKKwljaGFyICpwcm9nZ2llMHNhdmVkOworCS8qIG91cmFkZHIgaXMgbmV2ZXIgTlVMTCBhbmQgZ29lcyB0aHJvdWdoIHRocmVlIHN0YXRlcyBhcyB3ZSBwcm9ncmVzczoKKwkgMSAtIGxvY2FsIGFkZHJlc3MgYmVmb3JlIGJpbmQgKElQL3BvcnQgcG9zc2libHkgemVybykKKwkgMiAtIGxvY2FsIGFkZHJlc3MgYWZ0ZXIgYmluZCAocG9ydCBpcyBub256ZXJvKQorCSAzIC0gbG9jYWwgYWRkcmVzcyBhZnRlciBjb25uZWN0Pz8vcmVjdi9hY2NlcHQgKElQIGFuZCBwb3J0IGFyZSBub256ZXJvKSAqLworCXN0cnVjdCBsZW5fYW5kX3NvY2thZGRyICpvdXJhZGRyOworCS8qIHRoZW1hZGRyIGlzIE5VTEwgaWYgbm8gcGVlciBob3N0bmFtZVs6cG9ydF0gc3BlY2lmaWVkIG9uIGNvbW1hbmQgbGluZSAqLworCXN0cnVjdCBsZW5fYW5kX3NvY2thZGRyICp0aGVtYWRkcjsKKwkvKiByZW1lbmQgaXMgc2V0IGFmdGVyIGNvbm5lY3QvcmVjdi9hY2NlcHQgdG8gdGhlIGFjdHVhbCBpcDpwb3J0IG9mIHBlZXIgKi8KKwlzdHJ1Y3QgbGVuX2FuZF9zb2NrYWRkciByZW1lbmQ7CisKKwlqbXBfYnVmIGpidWY7ICAgICAgICAgICAgICAgIC8qIHRpbWVyIGNydWQgKi8KKworCWNoYXIgYmlnYnVmX2luW0JJR1NJWl07ICAgICAgLyogZGF0YSBidWZmZXJzICovCisJY2hhciBiaWdidWZfbmV0W0JJR1NJWl07Cit9OworCisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgd3JvdGVfb3V0ICAoRy53cm90ZV9vdXQgKQorI2RlZmluZSB3cm90ZV9uZXQgIChHLndyb3RlX25ldCApCisjZGVmaW5lIG91cmFkZHIgICAgKEcub3VyYWRkciAgICkKKyNkZWZpbmUgdGhlbWFkZHIgICAoRy50aGVtYWRkciAgKQorI2RlZmluZSByZW1lbmQgICAgIChHLnJlbWVuZCAgICApCisjZGVmaW5lIGpidWYgICAgICAgKEcuamJ1ZiAgICAgICkKKyNkZWZpbmUgYmlnYnVmX2luICAoRy5iaWdidWZfaW4gKQorI2RlZmluZSBiaWdidWZfbmV0IChHLmJpZ2J1Zl9uZXQpCisjZGVmaW5lIG9fdmVyYm9zZSAgKEcub192ZXJib3NlICkKKyNkZWZpbmUgb193YWl0ICAgICAoRy5vX3dhaXQgICAgKQorI2lmIEVOQUJMRV9OQ19FWFRSQQorI2RlZmluZSBvX2ludGVydmFsIChHLm9faW50ZXJ2YWwpCisjZWxzZQorI2RlZmluZSBvX2ludGVydmFsIDAKKyNlbmRpZgorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorfSB3aGlsZSAoMCkKKworCisvKiBNdXN0IG1hdGNoIGdldG9wdDMyIGNhbGwhICovCitlbnVtIHsKKwlPUFRfbiA9ICgxIDw8IDApLAorCU9QVF9wID0gKDEgPDwgMSksCisJT1BUX3MgPSAoMSA8PCAyKSwKKwlPUFRfdSA9ICgxIDw8IDMpLAorCU9QVF92ID0gKDEgPDwgNCksCisJT1BUX3cgPSAoMSA8PCA1KSwKKwlPUFRfbCA9ICgxIDw8IDYpICogRU5BQkxFX05DX1NFUlZFUiwKKwlPUFRfayA9ICgxIDw8IDcpICogRU5BQkxFX05DX1NFUlZFUiwKKwlPUFRfaSA9ICgxIDw8ICg2KzIqRU5BQkxFX05DX1NFUlZFUikpICogRU5BQkxFX05DX0VYVFJBLAorCU9QVF9vID0gKDEgPDwgKDcrMipFTkFCTEVfTkNfU0VSVkVSKSkgKiBFTkFCTEVfTkNfRVhUUkEsCisJT1BUX3ogPSAoMSA8PCAoOCsyKkVOQUJMRV9OQ19TRVJWRVIpKSAqIEVOQUJMRV9OQ19FWFRSQSwKK307CisKKyNkZWZpbmUgb19uZmxhZyAgIChvcHRpb25fbWFzazMyICYgT1BUX24pCisjZGVmaW5lIG9fdWRwbW9kZSAob3B0aW9uX21hc2szMiAmIE9QVF91KQorI2lmIEVOQUJMRV9OQ19FWFRSQQorI2RlZmluZSBvX29maWxlICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfbykKKyNkZWZpbmUgb196ZXJvICAgIChvcHRpb25fbWFzazMyICYgT1BUX3opCisjZWxzZQorI2RlZmluZSBvX29maWxlICAgMAorI2RlZmluZSBvX3plcm8gICAgMAorI2VuZGlmCisKKy8qIERlYnVnOiBzcXVpcnQgd2hhdGV2ZXIgbWVzc2FnZSBhbmQgc2xlZXAgYSBiaXQgc28gd2UgY2FuIHNlZSBpdCBnbyBieS4gKi8KKy8qIEJld2FyZTogd3JpdGVzIHRvIHN0ZE9VVC4uLiAqLworI2lmIDAKKyNkZWZpbmUgRGVidWcoLi4uKSBkbyB7IHByaW50ZihfX1ZBX0FSR1NfXyk7IHByaW50ZigiXG4iKTsgZmZsdXNoX2FsbCgpOyBzbGVlcCgxKTsgfSB3aGlsZSAoMCkKKyNlbHNlCisjZGVmaW5lIERlYnVnKC4uLikgZG8geyB9IHdoaWxlICgwKQorI2VuZGlmCisKKyNkZWZpbmUgaG9sbGVyX2Vycm9yKC4uLikgIGRvIHsgaWYgKG9fdmVyYm9zZSkgYmJfZXJyb3JfbXNnKF9fVkFfQVJHU19fKTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgaG9sbGVyX3BlcnJvciguLi4pIGRvIHsgaWYgKG9fdmVyYm9zZSkgYmJfcGVycm9yX21zZyhfX1ZBX0FSR1NfXyk7IH0gd2hpbGUgKDApCisKKy8qIGNhdGNoOiBuby1icmFpbmVyIGludGVycnVwdCBoYW5kbGVyICovCitzdGF0aWMgdm9pZCBjYXRjaChpbnQgc2lnKQoreworCWlmIChvX3ZlcmJvc2UgPiAxKSAgICAgICAgICAgICAgICAvKiBub3JtYWxseSB3ZSBkb24ndCBjYXJlICovCisJCWZwcmludGYoc3RkZXJyLCBTRU5UX05fUkVDVl9NLCB3cm90ZV9uZXQsIHdyb3RlX291dCk7CisJZnByaW50ZihzdGRlcnIsICJwdW50IVxuIik7CisJa2lsbF9teXNlbGZfd2l0aF9zaWcoc2lnKTsKK30KKworLyogdW5hcm0gICovCitzdGF0aWMgdm9pZCB1bmFybSh2b2lkKQoreworCXNpZ25hbChTSUdBTFJNLCBTSUdfSUdOKTsKKwlhbGFybSgwKTsKK30KKworLyogdGltZW91dCBhbmQgb3RoZXIgc2lnbmFsIGhhbmRsaW5nIGNydWZ0ICovCitzdGF0aWMgdm9pZCB0bXRyYXZlbChpbnQgc2lnIFVOVVNFRF9QQVJBTSkKK3sKKwl1bmFybSgpOworCWxvbmdqbXAoamJ1ZiwgMSk7Cit9CisKKy8qIGFybTogc2V0IHRoZSB0aW1lci4gICovCitzdGF0aWMgdm9pZCBhcm0odW5zaWduZWQgc2VjcykKK3sKKwlzaWduYWwoU0lHQUxSTSwgdG10cmF2ZWwpOworCWFsYXJtKHNlY3MpOworfQorCisvKiBmaW5kbGluZToKKyBmaW5kIHRoZSBuZXh0IG5ld2xpbmUgaW4gYSBidWZmZXI7IHJldHVybiBpbmNsdXNpdmUgc2l6ZSBvZiB0aGF0ICJsaW5lIiwKKyBvciB0aGUgZW50aXJlIGJ1ZmZlciBzaXplLCBzbyB0aGUgY2FsbGVyIGtub3dzIGhvdyBtdWNoIHRvIHRoZW4gd3JpdGUoKS4KKyBOb3QgZGlzdGluZ3Vpc2hpbmcgXG4gdnMgXHJcbiBmb3IgdGhlIG5vbmNlOyBpdCBqdXN0IHdvcmtzIGFzIGlzLi4uICovCitzdGF0aWMgdW5zaWduZWQgZmluZGxpbmUoY2hhciAqYnVmLCB1bnNpZ25lZCBzaXopCit7CisJY2hhciAqIHA7CisJaW50IHg7CisJaWYgKCFidWYpICAgICAgICAgICAgICAgICAgICAgICAgLyogdmFyaW91cyBzYW5pdHkgY2hlY2tzLi4uICovCisJCXJldHVybiAwOworCWlmIChzaXogPiBCSUdTSVopCisJCXJldHVybiAwOworCXggPSBzaXo7CisJZm9yIChwID0gYnVmOyB4ID4gMDsgeC0tKSB7CisJCWlmICgqcCA9PSAnXG4nKSB7CisJCQl4ID0gKGludCkgKHAgLSBidWYpOworCQkJeCsrOyAgICAgICAgICAgICAgICAgICAgICAgIC8qICdzb2theSBpZiBpdCBwb2ludHMganVzdCBwYXN0IHRoZSBlbmQhICovCitEZWJ1ZygiZmluZGxpbmUgcmV0dXJuaW5nICVkIiwgeCk7CisJCQlyZXR1cm4geDsKKwkJfQorCQlwKys7CisJfSAvKiBmb3IgKi8KK0RlYnVnKCJmaW5kbGluZSByZXR1cm5pbmcgd2hvbGUgdGhpbmc6ICVkIiwgc2l6KTsKKwlyZXR1cm4gc2l6OworfSAvKiBmaW5kbGluZSAqLworCisvKiBkb2V4ZWM6CisgZmlkZGxlIGFsbCB0aGUgZmlsZSBkZXNjcmlwdG9ycyBhcm91bmQsIGFuZCBoYW5kIG9mZiB0byBhbm90aGVyIHByb2cuICBTb3J0Cisgb2YgbGlrZSBhIG9uZS1vZmYgInBvb3IgbWFuJ3MgaW5ldGQiLiAgVGhpcyBpcyB0aGUgb25seSBzZWN0aW9uIG9mIGNvZGUKKyB0aGF0IHdvdWxkIGJlIHNlY3VyaXR5LWNyaXRpY2FsLCB3aGljaCBpcyB3aHkgaXQncyBpZmRlZmVkIG91dCBieSBkZWZhdWx0LgorIFVzZSBhdCB5b3VyIG93biBoYWlyeSByaXNrOyBpZiB5b3UgbGVhdmUgc2hlbGxzIGx5aW5nIGFyb3VuZCBiZWhpbmQgb3BlbgorIGxpc3RlbmluZyBwb3J0cyB5b3UgZGVzZXJ2ZSB0byBsb3NlISEgKi8KK3N0YXRpYyBpbnQgZG9leGVjKGNoYXIgKipwcm9nZ2llKSBOT1JFVFVSTjsKK3N0YXRpYyBpbnQgZG9leGVjKGNoYXIgKipwcm9nZ2llKQoreworCWlmIChHLnByb2dnaWUwc2F2ZWQpCisJCXByb2dnaWVbMF0gPSBHLnByb2dnaWUwc2F2ZWQ7CisJeG1vdmVfZmQobmV0ZmQsIDApOworCWR1cDIoMCwgMSk7CisJLyogZHVwMigwLCAyKTsgLSBkbyB3ZSAqcmVhbGx5KiB3YW50IHRoaXM/IE5PIQorCSAqIGV4ZWMnZWQgcHJvZyBjYW4gZG8gaXQgeW91cnNlbGYsIGlmIG5lZWRlZCAqLworCUJCX0VYRUNWUF9vcl9kaWUocHJvZ2dpZSk7Cit9CisKKy8qIGNvbm5lY3Rfd190aW1lb3V0OgorIHJldHVybiBhbiBmZCBmb3Igb25lIG9mCisgYW4gb3BlbiBvdXRib3VuZCBUQ1AgY29ubmVjdGlvbiwgYSBVRFAgc3R1Yi1zb2NrZXQgdGhpbmdpZSwgb3IKKyBhbiB1bmNvbm5lY3RlZCBUQ1Agb3IgVURQIHNvY2tldCB0byBsaXN0ZW4gb24uCisgRXhhbWluZXMgdmFyaW91cyBnbG9iYWwgb19ibGFoIGZsYWdzIHRvIGZpZ3VyZSBvdXQgd2hhdCB0byBkby4KKyBsYWQgY2FuIGJlIE5VTEwsIHRoZW4gc29ja2V0IGlzIG5vdCBib3VuZCB0byBhbnkgbG9jYWwgaXBbOnBvcnRdICovCitzdGF0aWMgaW50IGNvbm5lY3Rfd190aW1lb3V0KGludCBmZCkKK3sKKwlpbnQgcnI7CisKKwkvKiB3cmFwIGNvbm5lY3QgaW5zaWRlIGEgdGltZXIsIGFuZCBoaXQgaXQgKi8KKwlhcm0ob193YWl0KTsKKwlpZiAoc2V0am1wKGpidWYpID09IDApIHsKKwkJcnIgPSBjb25uZWN0KGZkLCAmdGhlbWFkZHItPnUuc2EsIHRoZW1hZGRyLT5sZW4pOworCQl1bmFybSgpOworCX0gZWxzZSB7IC8qIHNldGptcDogY29ubmVjdCBmYWlsZWQuLi4gKi8KKwkJcnIgPSAtMTsKKwkJZXJybm8gPSBFVElNRURPVVQ7IC8qIGZha2UgaXQgKi8KKwl9CisJcmV0dXJuIHJyOworfQorCisvKiBkb2xpc3RlbjoKKyBsaXN0ZW5zIGZvcgorIGluY29taW5nIGFuZCByZXR1cm5zIGFuIG9wZW4gY29ubmVjdGlvbiAqZnJvbSogc29tZXBsYWNlLiAgSWYgd2Ugd2VyZQorIGdpdmVuIGhvc3QvcG9ydCBhcmdzLCBhbnkgY29ubmVjdGlvbnMgZnJvbSBlbHNld2hlcmUgYXJlIHJlamVjdGVkLiAgVGhpcworIGluIGNvbmp1bmN0aW9uIHdpdGggbG9jYWwtYWRkcmVzcyBiaW5kaW5nIHNob3VsZCBsaW1pdCB0aGluZ3MgbmljZWx5Li4uICovCitzdGF0aWMgdm9pZCBkb2xpc3RlbihpbnQgaXNfcGVyc2lzdGVudCwgY2hhciAqKnByb2dnaWUpCit7CisJaW50IHJyOworCisJaWYgKCFvX3VkcG1vZGUpCisJCXhsaXN0ZW4obmV0ZmQsIDEpOyAvKiBUQ1A6IGdvdHRhIGxpc3RlbigpIGJlZm9yZSB3ZSBjYW4gZ2V0ICovCisKKwkvKiBWYXJpb3VzIHRoaW5ncyB0aGF0IGZvbGxvdyB0ZW1wb3JhcmlseSB0cmFzaCBiaWdidWZfbmV0LCB3aGljaCBtaWdodCBjb250YWluCisJIGEgY29weSBvZiBhbnkgcmVjdmZyb20oKWVkIHBhY2tldCwgYnV0IHdlJ2xsIHJlYWQoKSBhbm90aGVyIGNvcHkgbGF0ZXIuICovCisKKwkvKiBJIGNhbid0IGJlbGlldmUgSSBoYXZlIHRvIGRvIGFsbCB0aGlzIHRvIGdldCBteSBvd24gZ29kZGFtbiBib3VuZCBhZGRyZXNzCisJIGFuZCBwb3J0IG51bWJlci4gIEl0IHNob3VsZCBqdXN0IGdldCBmaWxsZWQgaW4gZHVyaW5nIGJpbmQoKSBvciBzb21ldGhpbmcuCisJIEFsbCB0aGlzIGlzIG9ubHkgdXNlZnVsIGlmIHdlIGRpZG4ndCBzYXkgLXAgZm9yIGxpc3RlbmluZywgc2luY2UgaWYgd2UKKwkgc2FpZCAtcCB3ZSAqa25vdyogd2hhdCBwb3J0IHdlJ3JlIGxpc3RlbmluZyBvbi4gIEF0IGFueSByYXRlIHdlIHdvbid0IGJvdGhlcgorCSB3aXRoIGl0IGFsbCB1bmxlc3Mgd2Ugd2FudGVkIHRvIHNlZSBpdCwgYWx0aG91Z2ggbGlzdGVuaW5nIHF1aWV0bHkgb24gYQorCSByYW5kb20gdW5rbm93biBwb3J0IGlzIHByb2JhYmx5IG5vdCB2ZXJ5IHVzZWZ1bCB3aXRob3V0ICJuZXRzdGF0Ii4gKi8KKwlpZiAob192ZXJib3NlKSB7CisJCWNoYXIgKmFkZHI7CisJCWdldHNvY2tuYW1lKG5ldGZkLCAmb3VyYWRkci0+dS5zYSwgJm91cmFkZHItPmxlbik7CisJCS8vaWYgKHJyIDwgMCkKKwkJLy8JYmJfcGVycm9yX21zZ19hbmRfZGllKCJnZXRzb2NrbmFtZSBhZnRlciBiaW5kIik7CisJCWFkZHIgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZCgmb3VyYWRkci0+dS5zYSk7CisJCWZwcmludGYoc3RkZXJyLCAibGlzdGVuaW5nIG9uICVzIC4uLlxuIiwgYWRkcik7CisJCWZyZWUoYWRkcik7CisJfQorCisJaWYgKG9fdWRwbW9kZSkgeworCQkvKiBVRFAgaXMgYSBzcGVlZWVlY2lhbCBjYXNlIC0tIHdlIGhhdmUgdG8gZG8gSS9PICphbmQqIGdldCB0aGUgY2FsbGluZworCQkgcGFydHkncyBwYXJ0aWN1bGFycyBhbGwgYXQgb25jZSwgbGlzdGVuKCkgYW5kIGFjY2VwdCgpIGRvbid0IGFwcGx5LgorCQkgQXQgbGVhc3QgaW4gdGhlIEJTRCB1bml2ZXJzZSwgaG93ZXZlciwgcmVjdmZyb20vUEVFSyBpcyBlbm91Z2ggdG8gdGVsbAorCQkgdXMgc29tZXRoaW5nIGNhbWUgaW4sIGFuZCB3ZSBjYW4gc2V0IHRoaW5ncyB1cCBzbyBzdHJhaWdodCByZWFkL3dyaXRlCisJCSBhY3R1YWxseSBkb2VzIHdvcmsgYWZ0ZXIgYWxsLiAgWW93LiAgWU1NViBvbiBzdHJhbmdlIHBsYXRmb3JtcyEgICovCisKKwkJLyogSSdtIG5vdCBjb21wbGV0ZWx5IGNsZWFyIG9uIGhvdyB0aGlzIHdvcmtzIC0tIEJTRCBzZWVtcyB0byBtYWtlIFVEUAorCQkganVzdCBtYWdpY2FsbHkgd29yayBpbiBhIGNvbm5lY3QoKWVkIGNvbnRleHQsIGJ1dCB3ZSdsbCB1bmRvdWJ0ZWRseSBydW4KKwkJIGludG8gc3lzdGVtcyB0aGlzIGRlYWwgZG9lc24ndCB3b3JrIG9uLiAgRm9yIG5vdywgd2UgYXBwYXJlbnRseSBoYXZlIHRvCisJCSBpc3N1ZSBhIGNvbm5lY3QoKSBvbiBvdXIganVzdC10aWNrbGVkIHNvY2tldCBzbyB3ZSBjYW4gd3JpdGUoKSBiYWNrLgorCQkgQWdhaW4sIHdoeSB0aGUgZnVjayBkb2Vzbid0IGl0IGp1c3QgZ2V0IGZpbGxlZCBpbiBhbmQgdGFrZW4gY2FyZSBvZj8hCisJCSBUaGlzIGhhY2sgaXMgYW55dGhpbmcgYnV0IG9wdGltYWwuICBCYXNpY2FsbHksIGlmIHlvdSB3YW50IHlvdXIgbGlzdGVuZXIKKwkJIHRvIGFsc28gYmUgYWJsZSB0byBzZW5kIGRhdGEgYmFjaywgeW91IG5lZWQgdGhpcyBjb25uZWN0KCkgbGluZSwgd2hpY2gKKwkJIGFsc28gaGFzIHRoZSBzaWRlIGVmZmVjdCB0aGF0IG5vdyBhbnl0aGluZyBmcm9tIGEgZGlmZmVyZW50IHNvdXJjZSBvciBldmVuIGEKKwkJIGRpZmZlcmVudCBwb3J0IG9uIHRoZSBvdGhlciBlbmQgd29uJ3Qgc2hvdyB1cCBhbmQgd2lsbCBjYXVzZSBJQ01QIGVycm9ycy4KKwkJIEkgZ3Vlc3MgdGhhdCdzIHdoYXQgdGhleSBtZWFudCBieSAiY29ubmVjdCIuCisJCSBMZXQncyB0cnkgdG8gcmVtZW1iZXIgd2hhdCB0aGUgIlUiIGlzICpyZWFsbHkqIGZvciwgZWg/ICovCisKKwkJLyogSWYgcGVlciBhZGRyZXNzIGlzIHNwZWNpZmllZCwgY29ubmVjdCB0byBpdCAqLworCQlyZW1lbmQubGVuID0gTFNBX1NJWkVPRl9TQTsKKwkJaWYgKHRoZW1hZGRyKSB7CisJCQlyZW1lbmQgPSAqdGhlbWFkZHI7CisJCQl4Y29ubmVjdChuZXRmZCwgJnRoZW1hZGRyLT51LnNhLCB0aGVtYWRkci0+bGVuKTsKKwkJfQorCQkvKiBwZWVrIGZpcnN0IHBhY2tldCBhbmQgcmVtZW1iZXIgcGVlciBhZGRyICovCisJCWFybShvX3dhaXQpOyAgICAgICAgICAgICAgICAvKiBtaWdodCBhcyB3ZWxsIHRpbWVvdXQgdGhpcywgdG9vICovCisJCWlmIChzZXRqbXAoamJ1ZikgPT0gMCkgeyAgICAgICAvKiBkbyB0aW1lb3V0IGZvciBpbml0aWFsIGNvbm5lY3QgKi8KKwkJCS8qICgqb3VyYWRkcikgaXMgcHJlZmlsbGVkIHdpdGggImRlZmF1bHQiIGFkZHJlc3MgKi8KKwkJCS8qIGFuZCBoZXJlIHdlIGJsb2NrLi4uICovCisJCQlyciA9IHJlY3ZfZnJvbV90byhuZXRmZCwgTlVMTCwgMCwgTVNHX1BFRUssIC8qd2FzIGJpZ2J1Zl9uZXQsIEJJR1NJWiovCisJCQkJJnJlbWVuZC51LnNhLCAmb3VyYWRkci0+dS5zYSwgb3VyYWRkci0+bGVuKTsKKwkJCWlmIChyciA8IDApCisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJyZWN2ZnJvbSIpOworCQkJdW5hcm0oKTsKKwkJfSBlbHNlCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidGltZW91dCIpOworLyogTm93IHdlIGxlYXJuZWQgKnRvIHdoaWNoIElQKiBwZWVyIGhhcyBjb25uZWN0ZWQsIGFuZCB3ZSB3YW50IHRvIGFuY2hvcgorb3VyIHNvY2tldCBvbiBpdCwgc28gdGhhdCBvdXIgb3V0Ym91bmQgcGFja2V0cyB3aWxsIGhhdmUgY29ycmVjdCBsb2NhbCBJUC4KK1VuZm9ydHVuYXRlbHksIGJpbmQoKSBvbiBhbHJlYWR5IGJvdW5kIHNvY2tldCB3aWxsIGZhaWwgbm93IChFSU5WQUwpOgorCXhiaW5kKG5ldGZkLCAmb3VyYWRkci0+dS5zYSwgb3VyYWRkci0+bGVuKTsKK05lZWQgdG8gcmVhZCB0aGUgcGFja2V0LCBzYXZlIGRhdGEsIGNsb3NlIHRoaXMgc29ja2V0IGFuZAorY3JlYXRlIG5ldyBvbmUsIGFuZCBiaW5kKCkgaXQuIFRPRE8gKi8KKwkJaWYgKCF0aGVtYWRkcikKKwkJCXhjb25uZWN0KG5ldGZkLCAmcmVtZW5kLnUuc2EsIG91cmFkZHItPmxlbik7CisJfSBlbHNlIHsKKwkJLyogVENQICovCisgYW5vdGhlcjoKKwkJYXJtKG9fd2FpdCk7IC8qIHdyYXAgdGhpcyBpbiBhIHRpbWVyLCB0b287IDAgPSBmb3JldmVyICovCisJCWlmIChzZXRqbXAoamJ1ZikgPT0gMCkgeworIGFnYWluOgorCQkJcmVtZW5kLmxlbiA9IExTQV9TSVpFT0ZfU0E7CisJCQlyciA9IGFjY2VwdChuZXRmZCwgJnJlbWVuZC51LnNhLCAmcmVtZW5kLmxlbik7CisJCQlpZiAocnIgPCAwKQorCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiYWNjZXB0Iik7CisJCQlpZiAodGhlbWFkZHIpIHsKKwkJCQlpbnQgc3ZfcG9ydCwgcG9ydCwgcjsKKworCQkJCXN2X3BvcnQgPSBnZXRfbnBvcnQoJnJlbWVuZC51LnNhKTsgLyogc2F2ZSAqLworCQkJCXBvcnQgPSBnZXRfbnBvcnQoJnRoZW1hZGRyLT51LnNhKTsKKwkJCQlpZiAocG9ydCA9PSAwKSB7CisJCQkJCS8qICJuYyAtbmwgLXAgTFBPUlQgUkhPU1QiICh3L28gUlBPUlQhKToKKwkJCQkJICogd2Ugc2hvdWxkIGFjY2VwdCBhbnkgcmVtb3RlIHBvcnQgKi8KKwkJCQkJc2V0X25wb3J0KCZyZW1lbmQudS5zYSwgMCk7IC8qIGJsb3Qgb3V0IHJlbW90ZSBwb3J0IyAqLworCQkJCX0KKwkJCQlyID0gbWVtY21wKCZyZW1lbmQudS5zYSwgJnRoZW1hZGRyLT51LnNhLCByZW1lbmQubGVuKTsKKwkJCQlzZXRfbnBvcnQoJnJlbWVuZC51LnNhLCBzdl9wb3J0KTsgLyogcmVzdG9yZSAqLworCQkJCWlmIChyICE9IDApIHsKKwkJCQkJLyogbmMgMS4xMCBiYWlscyBvdXQgaW5zdGVhZCwgYW5kIGl0cyBlcnJvciBtZXNzYWdlCisJCQkJCSAqIGlzIG5vdCBzdXBwcmVzc2VkIGJ5IG9fdmVyYm9zZSAqLworCQkJCQlpZiAob192ZXJib3NlKSB7CisJCQkJCQljaGFyICpyZW1hZGRyID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWQoJnJlbWVuZC51LnNhKTsKKwkJCQkJCWJiX2Vycm9yX21zZygiY29ubmVjdCBmcm9tIHdyb25nIGlwL3BvcnQgJXMgaWdub3JlZCIsIHJlbWFkZHIpOworCQkJCQkJZnJlZShyZW1hZGRyKTsKKwkJCQkJfQorCQkJCQljbG9zZShycik7CisJCQkJCWdvdG8gYWdhaW47CisJCQkJfQorCQkJfQorCQkJdW5hcm0oKTsKKwkJfSBlbHNlCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidGltZW91dCIpOworCisJCWlmIChpc19wZXJzaXN0ZW50ICYmIHByb2dnaWUpIHsKKwkJCS8qIC1sIC1rIC1lIFBST0cgKi8KKwkJCXNpZ25hbChTSUdDSExELCBTSUdfSUdOKTsgLyogbm8gem9tYmllcyBwbGVhc2UgKi8KKwkJCWlmICh4dmZvcmsoKSAhPSAwKSB7CisJCQkJLyogcGFyZW50OiBnbyBiYWNrIGFuZCBhY2NlcHQgbW9yZSBjb25uZWN0aW9ucyAqLworCQkJCWNsb3NlKHJyKTsKKwkJCQlnb3RvIGFub3RoZXI7CisJCQl9CisJCQkvKiBjaGlsZCAqLworCQkJc2lnbmFsKFNJR0NITEQsIFNJR19ERkwpOworCQl9CisKKwkJeG1vdmVfZmQocnIsIG5ldGZkKTsgLyogZHVtcCB0aGUgb2xkIHNvY2tldCwgaGVyZSdzIG91ciBuZXcgb25lICovCisJCS8qIGZpbmQgb3V0IHdoYXQgYWRkcmVzcyB0aGUgY29ubmVjdGlvbiB3YXMgKnRvKiBvbiBvdXIgZW5kLCBpbiBjYXNlIHdlJ3JlCisJCSBkb2luZyBhIGxpc3Rlbi1vbi1hbnkgb24gYSBtdWx0aWhvbWVkIG1hY2hpbmUuICBUaGlzIGFsbG93cyBvbmUgdG8KKwkJIG9mZmVyIGRpZmZlcmVudCBzZXJ2aWNlcyB2aWEgZGlmZmVyZW50IGFsaWFzIGFkZHJlc3Nlcywgc3VjaCBhcyB0aGUKKwkJICJ2aXJ0dWFsIHdlYiBzaXRlIiBoYWNrLiAqLworCQlnZXRzb2NrbmFtZShuZXRmZCwgJm91cmFkZHItPnUuc2EsICZvdXJhZGRyLT5sZW4pOworCQkvL2lmIChyciA8IDApCisJCS8vCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZ2V0c29ja25hbWUgYWZ0ZXIgYWNjZXB0Iik7CisJfQorCisJaWYgKG9fdmVyYm9zZSkgeworCQljaGFyICpsY2xhZGRyLCAqcmVtYWRkciwgKnJlbWhvc3RuYW1lOworCisjaWYgRU5BQkxFX05DX0VYVFJBICYmIGRlZmluZWQoSVBfT1BUSU9OUykKKwkvKiBJZiB3ZSBjYW4sIGxvb2sgZm9yIGFueSBJUCBvcHRpb25zLiAgVXNlZnVsIGZvciB0ZXN0aW5nIHRoZSByZWNlaXZpbmcgZW5kIG9mCisJIHN1Y2ggdGhpbmdzLCBhbmQgaXMgYSBnb29kIGV4ZXJjaXNlIGluIGRlYWxpbmcgd2l0aCBpdC4gIFdlIGRvIHRoaXMgYmVmb3JlCisJIHRoZSBjb25uZWN0IG1lc3NhZ2UsIHRvIGVuc3VyZSB0aGF0IHRoZSBjb25uZWN0IG1zZyBpcyB1bmlmb3JtbHkgdGhlIExBU1QKKwkgdGhpbmcgdG8gZW1lcmdlIGFmdGVyIGFsbCB0aGUgaW50ZXJ2ZW5pbmcgY3J1ZC4gIERvZXNuJ3Qgd29yayBmb3IgVURQIG9uCisJIGFueSBtYWNoaW5lcyBJJ3ZlIHRlc3RlZCwgYnV0IGZlZWwgZnJlZSB0byBzdXJwcmlzZSBtZS4gKi8KKwkJY2hhciBvcHRidWZbNDBdOworCQlzb2NrbGVuX3QgeCA9IHNpemVvZihvcHRidWYpOworCisJCXJyID0gZ2V0c29ja29wdChuZXRmZCwgSVBQUk9UT19JUCwgSVBfT1BUSU9OUywgb3B0YnVmLCAmeCk7CisJCWlmIChyciA+PSAwICYmIHgpIHsgICAgLyogd2UndmUgZ290IG9wdGlvbnMsIGxlc3NlZSBlbS4uLiAqLworCQkJKmJpbjJoZXgoYmlnYnVmX25ldCwgb3B0YnVmLCB4KSA9ICdcMCc7CisJCQlmcHJpbnRmKHN0ZGVyciwgIklQIG9wdGlvbnM6ICVzXG4iLCBiaWdidWZfbmV0KTsKKwkJfQorI2VuZGlmCisKKwkvKiBub3cgY2hlY2sgb3V0IHdobyBpdCBpcy4gIFdlIGRvbid0IGNhcmUgYWJvdXQgbWlzbWF0Y2hlZCBETlMgbmFtZXMgaGVyZSwKKwkgYnV0IGFueSBBRERSIGFuZCBQT1JUIHdlIHNwZWNpZmllZCBoYWQgYmV0dGVyIGZ1Y2tpbmcgd2VsbCBtYXRjaCB0aGUgY2FsbGVyLgorCSBDb252ZXJ0aW5nIGZyb20gYWRkciB0byBpbmV0X250b2EgYW5kIGJhY2sgYWdhaW4gaXMgYSBiaXQgb2YgYSBrbHVkZ2UsIGJ1dAorCSBnZXRob3N0cG9vcCB3YW50cyBhIHN0cmluZyBhbmQgdGhlcmUncyBtdWNoIGduYXJsaWVyIGNvZGUgb3V0IHRoZXJlIGFscmVhZHksCisJIHNvIEkgZG9uJ3QgZmVlbCBiYWQuCisJIFRoZSAqcmVhbCogcXVlc3Rpb24gaXMgd2h5IEJGRCBzb2NrZXRzIHdhc24ndCBkZXNpZ25lZCB0byBhbGxvdyBsaXN0ZW5zIGZvcgorCSBjb25uZWN0aW9ucyAqZnJvbSogc3BlY2lmaWMgaG9zdHMvcG9ydHMsIGluc3RlYWQgb2YgcmVxdWlyaW5nIHRoZSBjYWxsZXIgdG8KKwkgYWNjZXB0IHRoZSBjb25uZWN0aW9uIGFuZCB0aGVuIHJlamVjdCB1bmRlc2lyZWFibGUgb25lcyBieSBjbG9zaW5nLgorCSBJbiBvdGhlciB3b3Jkcywgd2UgbmVlZCBhIFRDUCBNU0dfUEVFSy4gKi8KKwkvKiBiYm94OiByZW1vdmVkIG1vc3Qgb2YgaXQgKi8KKwkJbGNsYWRkciA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkKCZvdXJhZGRyLT51LnNhKTsKKwkJcmVtYWRkciA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkKCZyZW1lbmQudS5zYSk7CisJCXJlbWhvc3RuYW1lID0gb19uZmxhZyA/IHJlbWFkZHIgOiB4bWFsbG9jX3NvY2thZGRyMmhvc3QoJnJlbWVuZC51LnNhKTsKKwkJZnByaW50ZihzdGRlcnIsICJjb25uZWN0IHRvICVzIGZyb20gJXMgKCVzKVxuIiwKKwkJCQlsY2xhZGRyLCByZW1ob3N0bmFtZSwgcmVtYWRkcik7CisJCWZyZWUobGNsYWRkcik7CisJCWZyZWUocmVtYWRkcik7CisJCWlmICghb19uZmxhZykKKwkJCWZyZWUocmVtaG9zdG5hbWUpOworCX0KKworCWlmIChwcm9nZ2llKQorCQlkb2V4ZWMocHJvZ2dpZSk7Cit9CisKKy8qIHVkcHRlc3Q6CisgZmlyZSBhIGNvdXBsZSBvZiBwYWNrZXRzIGF0IGEgVURQIHRhcmdldCBwb3J0LCBqdXN0IHRvIHNlZSBpZiBpdCdzIHJlYWxseQorIHRoZXJlLiAgT24gQlNEIGtlcm5lbHMsIElDTVAgaG9zdC9wb3J0LXVucmVhY2hhYmxlIGVycm9ycyBnZXQgZGVsaXZlcmVkIHRvCisgb3VyIHNvY2tldCBhcyBFQ09OTlJFRlVTRUQgd3JpdGUgZXJyb3JzLiAgT24gU1Yga2VybmVscywgd2UgbG9zZTsgd2UnbGwgaGF2ZQorIHRvIGNvbGxlY3QgYW5kIGFuYWx5emUgcmF3IElDTVAgb3Vyc2VsdmVzIGEgbGEgc2F0YW4ncyBwcm9iZV91ZHBfcG9ydHMKKyBiYWNrZW5kLiAgR3Vlc3Mgd2hlcmUgb25lIGNvdWxkIHN3aXBlIHRoZSBhcHByb3ByaWF0ZSBjb2RlIGZyb20uLi4KKworIFVzZSB0aGUgdGltZSBkZWxheSBiZXR3ZWVuIHdyaXRlcyBpZiBnaXZlbiwgb3RoZXJ3aXNlIHVzZSB0aGUgInRjcCBwaW5nIgorIHRyaWNrIGZvciBnZXR0aW5nIHRoZSBSVFQuICBbSSBnb3QgdGhhdCBpZGVhIGZyb20gcGx1dml1cywgYW5kIHdhcnBlZCBpdC5dCisgUmV0dXJuIGVpdGhlciB0aGUgb3JpZ2luYWwgZmQsIG9yIGNsZWFuIHVwIGFuZCByZXR1cm4gLTEuICovCisjaWYgRU5BQkxFX05DX0VYVFJBCitzdGF0aWMgaW50IHVkcHRlc3Qodm9pZCkKK3sKKwlpbnQgcnI7CisKKwlyciA9IHdyaXRlKG5ldGZkLCBiaWdidWZfaW4sIDEpOworCWlmIChyciAhPSAxKQorCQliYl9wZXJyb3JfbXNnKCJ1ZHB0ZXN0IGZpcnN0IHdyaXRlIik7CisKKwlpZiAob193YWl0KQorCQlzbGVlcChvX3dhaXQpOyAvLyBjYW4gYmUgaW50ZXJydXB0ZWQhIHdoaWxlICh0KSBuYW5vc2xlZXAoJnQpPworCWVsc2UgeworCS8qIHVzZSB0aGUgdGNwLXBpbmcgdHJpY2s6IHRyeSBjb25uZWN0aW5nIHRvIGEgbm9ybWFsbHkgcmVmdXNlZCBwb3J0LCB3aGljaAorCSBjYXVzZXMgdXMgdG8gYmxvY2sgZm9yIHRoZSB0aW1lIHRoYXQgU1lOIGdldHMgdGhlcmUgYW5kIFJTVCBnZXRzIGJhY2suCisJIE5vdCBjb21wbGV0ZWx5IHJlbGlhYmxlLCBidXQgaXQgKmRvZXMqIG1vc3RseSB3b3JrLiAqLworCS8qIFNldCBhIHRlbXBvcmFyeSBjb25uZWN0IHRpbWVvdXQsIHNvIHBhY2tldCBmaWx0cmF0aW9uIGRvZXNudCBjYXVzZQorCSB1cyB0byBoYW5nIGZvcmV2ZXIsIGFuZCBoaXQgaXQgKi8KKwkJb193YWl0ID0gNTsgICAgICAgICAgICAgICAgICAgICAvKiBlbm91Z2ggdGhhdCB3ZSdsbCBub3RpY2U/PyAqLworCQlyciA9IHhzb2NrZXQob3VyYWRkci0+dS5zYS5zYV9mYW1pbHksIFNPQ0tfU1RSRUFNLCAwKTsKKwkJc2V0X25wb3J0KCZ0aGVtYWRkci0+dS5zYSwgaHRvbnMoU0xFQVpFX1BPUlQpKTsKKwkJY29ubmVjdF93X3RpbWVvdXQocnIpOworCQkvKiBkb24ndCBuZWVkIHRvIHJlc3RvcmUgdGhlbWFkZHIncyBwb3J0LCBpdCdzIG5vdCB1c2VkIGFueW1vcmUgKi8KKwkJY2xvc2UocnIpOworCQlvX3dhaXQgPSAwOyAvKiByZXN0b3JlICovCisJfQorCisJcnIgPSB3cml0ZShuZXRmZCwgYmlnYnVmX2luLCAxKTsKKwlyZXR1cm4gKHJyICE9IDEpOyAvKiBpZiByciA9PSAxLCByZXR1cm4gMCAoc3VjY2VzcykgKi8KK30KKyNlbHNlCitpbnQgdWRwdGVzdCh2b2lkKTsKKyNlbmRpZgorCisvKiBvcHJpbnQ6CisgSGV4ZHVtcCBieXRlcyBzaG92ZWxlZCBlaXRoZXIgd2F5IHRvIGEgcnVubmluZyBsb2dmaWxlLCBpbiB0aGUgZm9ybWF0OgorIEQgb2Zmc2V0ICAgICAgIC0gIC0gLSAtIC0tLSAxNiBieXRlcyAtLS0gLSAtIC0gIC0gICAgICMgLi4uLiBhc2NpaSAuLi4uLgorIHdoZXJlICJ3aGljaCIgc2V0cyB0aGUgZGlyZWN0aW9uIGluZGljYXRvciwgRDoKKyAwIC0tIHNlbnQgdG8gbmV0d29yaywgb3IgIj4iCisgMSAtLSByY3ZkIGFuZCBwcmludGVkIHRvIHN0ZG91dCwgb3IgIjwiCisgYW5kICJidWYiIGFuZCAibiIgYXJlIGRhdGEtYmxvY2sgYW5kIGxlbmd0aC4gIElmIHRoZSBjdXJyZW50IGJsb2NrIGdlbmVyYXRlcworIGEgcGFydGlhbCBsaW5lLCBzbyBiZSBpdDsgd2UgKndhbnQqIHRoYXQgbG9ja3N0ZXAgaW5kaWNhdGlvbiBvZiB3aG8gc2VudAorIHdoYXQgd2hlbi4gIEFkYXB0ZWQgZnJvbSBkZ2F1ZGV0J3Mgb3JpZ2luYWwgZXhhbXBsZSAtLSBidXQgbXVzdCBiZSByaXBwaW5nCisgKmZhc3QqLCBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIGJlIHRvbyBkaXNrLWJvdW5kLi4uICovCisjaWYgRU5BQkxFX05DX0VYVFJBCitzdGF0aWMgdm9pZCBvcHJpbnQoaW50IGRpcmVjdGlvbiwgdW5zaWduZWQgY2hhciAqcCwgdW5zaWduZWQgYmMpCit7CisJdW5zaWduZWQgb2JjOyAgICAgICAgICAgLyogY3VycmVudCAiZ2xvYmFsIiBvZmZzZXQgKi8KKwl1bnNpZ25lZCB4OworCXVuc2lnbmVkIGNoYXIgKm9wOyAgICAgIC8qIG91dCBoZXhkdW1wIHB0ciAqLworCXVuc2lnbmVkIGNoYXIgKmFwOyAgICAgIC8qIG91dCBhc2MtZHVtcCBwdHIgKi8KKwl1bnNpZ25lZCBjaGFyIHN0YWdlWzEwMF07CisKKwlpZiAoYmMgPT0gMCkKKwkJcmV0dXJuOworCisJb2JjID0gd3JvdGVfbmV0OyAvKiB1c2UgdGhlIGdsb2JhbHMhICovCisJaWYgKGRpcmVjdGlvbiA9PSAnPCcpCisJCW9iYyA9IHdyb3RlX291dDsKKwlzdGFnZVswXSA9IGRpcmVjdGlvbjsKKwlzdGFnZVs1OV0gPSAnIyc7IC8qIHByZWxvYWQgc2VwYXJhdG9yICovCisJc3RhZ2VbNjBdID0gJyAnOworCisJZG8geyAgICAvKiBmb3IgY2h1bmstby1kYXRhIC4uLiAqLworCQl4ID0gMTY7CisJCWlmIChiYyA8IDE2KSB7CisJCQkvKiBtZW1zZXQoJnN0YWdlW2JjKjMgKyAxMV0sICcgJywgMTYqMyAtIGJjKjMpOyAqLworCQkJbWVtc2V0KCZzdGFnZVsxMV0sICcgJywgMTYqMyk7CisJCQl4ID0gYmM7CisJCX0KKwkJc3ByaW50ZigoY2hhciAqKSZzdGFnZVsxXSwgIiAlOC44eCAiLCBvYmMpOyAgLyogeHh4OiBzdGlsbCBzbG93PyAqLworCQliYyAtPSB4OyAgICAgICAgICAvKiBmaXggY3VycmVudCBjb3VudCAqLworCQlvYmMgKz0geDsgICAgICAgICAvKiBmaXggY3VycmVudCBvZmZzZXQgKi8KKwkJb3AgPSAmc3RhZ2VbMTFdOyAgLyogd2hlcmUgaGV4IHN0YXJ0cyAqLworCQlhcCA9ICZzdGFnZVs2MV07ICAvKiB3aGVyZSBhc2NpaSBzdGFydHMgKi8KKworCQlkbyB7ICAvKiBmb3IgbGluZSBvZiBkdW1wLCBob3dldmVyIGxvbmcgLi4uICovCisJCQkqb3ArKyA9IDB4MjAgfCBiYl9oZXhkaWdpdHNfdXBjYXNlWypwID4+IDRdOworCQkJKm9wKysgPSAweDIwIHwgYmJfaGV4ZGlnaXRzX3VwY2FzZVsqcCAmIDB4MGZdOworCQkJKm9wKysgPSAnICc7CisJCQlpZiAoKCpwID4gMzEpICYmICgqcCA8IDEyNykpCisJCQkJKmFwID0gKnA7ICAgLyogcHJpbnRpbmcgKi8KKwkJCWVsc2UKKwkJCQkqYXAgPSAnLic7ICAvKiBub25wcmludGluZywgbG9vc2UgZGVmICovCisJCQlhcCsrOworCQkJcCsrOworCQl9IHdoaWxlICgtLXgpOworCQkqYXArKyA9ICdcbic7ICAvKiBmaW5pc2ggdGhlIGxpbmUgKi8KKwkJeHdyaXRlKG9mZCwgc3RhZ2UsIGFwIC0gc3RhZ2UpOworCX0gd2hpbGUgKGJjKTsKK30KKyNlbHNlCit2b2lkIG9wcmludChpbnQgZGlyZWN0aW9uLCB1bnNpZ25lZCBjaGFyICpwLCB1bnNpZ25lZCBiYyk7CisjZW5kaWYKKworLyogcmVhZHdyaXRlOgorIGhhbmRsZSBzdGRpbi9zdGRvdXQvbmV0d29yayBJL08uICBCd2FoYWhhISEgLS0gdGhlIHNlbGVjdCBsb29wIGZyb20gaGVsbC4KKyBJbiB0aGlzIGluc3RhbmNlLCByZXR1cm4gd2hhdCBtaWdodCBiZWNvbWUgb3VyIGV4aXQgc3RhdHVzLiAqLworc3RhdGljIGludCByZWFkd3JpdGUodm9pZCkKK3sKKwlpbnQgcnI7CisJY2hhciAqenAgPSB6cDsgLyogZ2NjICovICAvKiBzdGRpbiBidWYgcHRyICovCisJY2hhciAqbnAgPSBucDsgICAgICAgICAgICAvKiBuZXQtaW4gYnVmIHB0ciAqLworCXVuc2lnbmVkIHJ6bGVmdDsKKwl1bnNpZ25lZCBybmxlZnQ7CisJdW5zaWduZWQgbmV0cmV0cnk7ICAgICAgICAgICAgICAvKiBuZXQtcmVhZCByZXRyeSBjb3VudGVyICovCisJdW5zaWduZWQgZmRzX29wZW47CisKKwkvKiBpZiB5b3UgZG9uJ3QgaGF2ZSBhbGwgdGhpcyBGRF8qIG1hY3JvIGhhaXIgaW4gc3lzL3R5cGVzLmgsIHlvdSdsbCBoYXZlIHRvCisJIGVpdGhlciBmaW5kIGl0IG9yIGRvIHlvdXIgb3duIGJpdC1iYXNoaW5nOiAqZGluZzEgfD0gKDEgPDwgZmQpLCBldGMuLi4gKi8KKwlmZF9zZXQgZGluZzE7ICAgICAgICAgICAgICAgICAgIC8qIGZvciBzZWxlY3QgbG9vcCAqLworCWZkX3NldCBkaW5nMjsKKwlGRF9aRVJPKCZkaW5nMSk7CisJRkRfU0VUKG5ldGZkLCAmZGluZzEpOworCUZEX1NFVChTVERJTl9GSUxFTk8sICZkaW5nMSk7CisJZmRzX29wZW4gPSAyOworCisJbmV0cmV0cnkgPSAyOworCXJ6bGVmdCA9IHJubGVmdCA9IDA7CisJaWYgKG9faW50ZXJ2YWwpCisJCXNsZWVwKG9faW50ZXJ2YWwpOyAgICAgICAgICAgICAgICAvKiBwYXVzZSAqYmVmb3JlKiBzZW5kaW5nIHN0dWZmLCB0b28gKi8KKworCS8qIGFuZCBub3cgdGhlIGJpZyBvbCcgc2VsZWN0IHNob3ZlbGluZyBsb29wIC4uLiAqLworCS8qIG5jIDEuMTAgaGFzICJ3aGlsZSAoRkRfSVNTRVQobmV0ZmQpIiBoZXJlICovCisJd2hpbGUgKGZkc19vcGVuKSB7CisJCXVuc2lnbmVkIHdyZXRyeSA9IDgyMDA7ICAgICAgICAgICAgICAgLyogbmV0LXdyaXRlIHNhbml0eSBjb3VudGVyICovCisKKwkJZGluZzIgPSBkaW5nMTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBGRF9DT1BZIGFpbid0IHBvcnRhYmxlLi4uICovCisJLyogc29tZSBzeXN0ZW1zLCBub3RhYmx5IGxpbnV4LCBjcmFwIGludG8gdGhlaXIgc2VsZWN0IHRpbWVycyBvbiByZXR1cm4sIHNvCisJIHdlIGNyZWF0ZSBhIGV4cGVuZGFibGUgY29weSBhbmQgZ2l2ZSAqdGhhdCogdG8gc2VsZWN0LiAgKi8KKwkJaWYgKG9fd2FpdCkgeworCQkJc3RydWN0IHRpbWV2YWwgdG1wX3RpbWVyOworCQkJdG1wX3RpbWVyLnR2X3NlYyA9IG9fd2FpdDsKKwkJCXRtcF90aW1lci50dl91c2VjID0gMDsKKwkJLyogaGlnaGVzdCBwb3NzaWJsZSBmZCBpcyBuZXRmZCAoMykgKi8KKwkJCXJyID0gc2VsZWN0KG5ldGZkKzEsICZkaW5nMiwgTlVMTCwgTlVMTCwgJnRtcF90aW1lcik7CisJCX0gZWxzZQorCQkJcnIgPSBzZWxlY3QobmV0ZmQrMSwgJmRpbmcyLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwkJaWYgKHJyIDwgMCAmJiBlcnJubyAhPSBFSU5UUikgeyAgICAgICAgICAgICAgICAvKiBtaWdodCBoYXZlIGdvdHRlbiBeWmVkLCBldGMgKi8KKwkJCWhvbGxlcl9wZXJyb3IoInNlbGVjdCIpOworCQkJY2xvc2UobmV0ZmQpOworCQkJcmV0dXJuIDE7CisJCX0KKwkvKiBpZiB3ZSBoYXZlIGEgdGltZW91dCBBTkQgc3RkaW4gaXMgY2xvc2VkIEFORCB3ZSBoYXZlbid0IGhlYXJkIGFueXRoaW5nCisJIGZyb20gdGhlIG5ldCBkdXJpbmcgdGhhdCB0aW1lLCBhc3N1bWUgaXQncyBkZWFkIGFuZCBjbG9zZSBpdCB0b28uICovCisJCWlmIChyciA9PSAwKSB7CisJCQlpZiAoIUZEX0lTU0VUKFNURElOX0ZJTEVOTywgJmRpbmcxKSkgeworCQkJCW5ldHJldHJ5LS07ICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgYWN0dWFsbHkgdHJ5IGEgY291cGxhIHRpbWVzLiAqLworCQkJCWlmICghbmV0cmV0cnkpIHsKKwkJCQkJaWYgKG9fdmVyYm9zZSA+IDEpICAgICAgICAgLyogbm9ybWFsbHkgd2UgZG9uJ3QgY2FyZSAqLworCQkJCQkJZnByaW50ZihzdGRlcnIsICJuZXQgdGltZW91dFxuIik7CisJCQkJCS8qY2xvc2UobmV0ZmQpOyAtIHJlZHVuZGFudCwgZXhpdCB3aWxsIGRvIGl0ICovCisJCQkJCXJldHVybiAwOyAgICAgICAgICAgICAgICAgIC8qIG5vdCBhbiBlcnJvciEgKi8KKwkJCQl9CisJCQl9CisJCX0gLyogc2VsZWN0IHRpbWVvdXQgKi8KKwkvKiB4eHg6IHNob3VsZCB3ZSBjaGVjayB0aGUgZXhjZXB0aW9uIGZkcyB0b28/ICBUaGUgcmVhZCBmZHMgc2VlbSB0byBnaXZlCisJIHVzIHRoZSByaWdodCBpbmZvLCBhbmQgbm9uZSBvZiB0aGUgZXhhbXBsZXMgSSBmb3VuZCBib3RoZXJlZC4gKi8KKworCS8qIERpbmchISAgU29tZXRoaW5nIGFycml2ZWQsIGdvIGNoZWNrIGFsbCB0aGUgaW5jb21pbmcgaG9wcGVycywgbmV0IGZpcnN0ICovCisJCWlmIChGRF9JU1NFVChuZXRmZCwgJmRpbmcyKSkgeyAgICAgICAgICAgICAgICAvKiBuZXQ6IGRpbmchICovCisJCQlyciA9IHJlYWQobmV0ZmQsIGJpZ2J1Zl9uZXQsIEJJR1NJWik7CisJCQlpZiAocnIgPD0gMCkgeworCQkJCWlmIChyciA8IDAgJiYgb192ZXJib3NlID4gMSkgeworCQkJCQkvKiBuYyAxLjEwIGRvZXNuJ3QgZG8gdGhpcyAqLworCQkJCQliYl9wZXJyb3JfbXNnKCJuZXQgcmVhZCIpOworCQkJCX0KKwkJCQlGRF9DTFIobmV0ZmQsICZkaW5nMSk7ICAgICAgICAgICAgICAgIC8qIG5ldCBjbG9zZWQgKi8KKwkJCQlmZHNfb3Blbi0tOworCQkJCXJ6bGVmdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgLyogY2FuJ3Qgd3JpdGUgYW55bW9yZTogYnJva2VuIHBpcGUgKi8KKwkJCX0gZWxzZSB7CisJCQkJcm5sZWZ0ID0gcnI7CisJCQkJbnAgPSBiaWdidWZfbmV0OworCQkJfQorRGVidWcoImdvdCAlZCBmcm9tIHRoZSBuZXQsIGVycm5vICVkIiwgcnIsIGVycm5vKTsKKwkJfSAvKiBuZXQ6ZGluZyAqLworCisJLyogaWYgd2UncmUgaW4gInNsb3dseSIgbW9kZSB0aGVyZSdzIHByb2JhYmx5IHN0aWxsIHN0dWZmIGluIHRoZSBzdGRpbgorCSBidWZmZXIsIHNvIGRvbid0IHJlYWQgdW5sZXNzIHdlIHJlYWxseSBuZWVkIE1PUkUgSU5QVVQhICBNT1JFIElOUFVUISAqLworCQlpZiAocnpsZWZ0KQorCQkJZ290byBzaG92ZWw7CisKKwkvKiBva2F5LCBzdWNrIG1vcmUgc3RkaW4gKi8KKwkJaWYgKEZEX0lTU0VUKFNURElOX0ZJTEVOTywgJmRpbmcyKSkgeyAgICAgICAgICAgICAgICAvKiBzdGRpbjogZGluZyEgKi8KKwkJCXJyID0gcmVhZChTVERJTl9GSUxFTk8sIGJpZ2J1Zl9pbiwgQklHU0laKTsKKwkvKiBDb25zaWRlcmVkIG1ha2luZyByZWFkcyBoZXJlIHNtYWxsZXIgZm9yIFVEUCBtb2RlLCBidXQgODE5Mi1ieXRlCisJIG1vYnlncmFtcyBhcmUga2luZGEgZnVuIGFuZCBleGVyY2lzZSB0aGUgcmVhc3NlbWJsZXIuICovCisJCQlpZiAocnIgPD0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGF0IGVuZCwgb3IgZnVrdCwgb3IgLi4uICovCisJCQkJRkRfQ0xSKFNURElOX0ZJTEVOTywgJmRpbmcxKTsgLyogZGlzYWJsZSBzdGRpbiAqLworCQkJCS8qY2xvc2UoU1RESU5fRklMRU5PKTsgLSBub3QgcmVhbGx5IG5lY2Vzc2FyeSAqLworCQkJCS8qIExldCBwZWVyIGtub3cgd2UgaGF2ZSBubyBtb3JlIGRhdGEgKi8KKwkJCQkvKiBuYyAxLjEwIGRvZXNuJ3QgZG8gdGhpczogKi8KKwkJCQlzaHV0ZG93bihuZXRmZCwgU0hVVF9XUik7CisJCQkJZmRzX29wZW4tLTsKKwkJCX0gZWxzZSB7CisJCQkJcnpsZWZ0ID0gcnI7CisJCQkJenAgPSBiaWdidWZfaW47CisJCQl9CisJCX0gLyogc3RkaW46ZGluZyAqLworIHNob3ZlbDoKKwkvKiBub3cgdGhhdCB3ZSd2ZSBkaW5nZG9uZ2VkIGFsbCBvdXIgdGhpbmdkaW5ncywgc2VuZCBvZmYgdGhlIHJlc3VsdHMuCisJIEdlZXosIHdoeSBkb2VzIHRoaXMgbG9vayBhbiBhd2Z1bCBsb3QgbGlrZSB0aGUgYmlnIGxvb3AgaW4gInJzaCI/IC4uLgorCSBub3Qgc3VyZSBpZiB0aGUgb3JkZXIgb2YgdGhpcyBtYXR0ZXJzLCBidXQgd3JpdGUgbmV0IC0+IHN0ZG91dCBmaXJzdC4gKi8KKworCQlpZiAocm5sZWZ0KSB7CisJCQlyciA9IHdyaXRlKFNURE9VVF9GSUxFTk8sIG5wLCBybmxlZnQpOworCQkJaWYgKHJyID4gMCkgeworCQkJCWlmIChvX29maWxlKSAvKiBsb2cgdGhlIHN0ZG91dCAqLworCQkJCQlvcHJpbnQoJzwnLCAodW5zaWduZWQgY2hhciAqKW5wLCBycik7CisJCQkJbnAgKz0gcnI7CisJCQkJcm5sZWZ0IC09IHJyOworCQkJCXdyb3RlX291dCArPSBycjsgLyogZ2xvYmFsIGNvdW50ICovCisJCQl9CitEZWJ1Zygid3JvdGUgJWQgdG8gc3Rkb3V0LCBlcnJubyAlZCIsIHJyLCBlcnJubyk7CisJCX0gLyogcm5sZWZ0ICovCisJCWlmIChyemxlZnQpIHsKKwkJCWlmIChvX2ludGVydmFsKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluICJzbG93bHkiIG1vZGUgPz8gKi8KKwkJCQlyciA9IGZpbmRsaW5lKHpwLCByemxlZnQpOworCQkJZWxzZQorCQkJCXJyID0gcnpsZWZ0OworCQkJcnIgPSB3cml0ZShuZXRmZCwgenAsIHJyKTsgICAgICAgIC8qIG9uZSBsaW5lLCBvciB0aGUgd2hvbGUgYnVmZmVyICovCisJCQlpZiAocnIgPiAwKSB7CisJCQkJaWYgKG9fb2ZpbGUpIC8qIGxvZyB3aGF0IGdvdCBzZW50ICovCisJCQkJCW9wcmludCgnPicsICh1bnNpZ25lZCBjaGFyICopenAsIHJyKTsKKwkJCQl6cCArPSBycjsKKwkJCQlyemxlZnQgLT0gcnI7CisJCQkJd3JvdGVfbmV0ICs9IHJyOyAvKiBnbG9iYWwgY291bnQgKi8KKwkJCX0KK0RlYnVnKCJ3cm90ZSAlZCB0byBuZXQsIGVycm5vICVkIiwgcnIsIGVycm5vKTsKKwkJfSAvKiByemxlZnQgKi8KKwkJaWYgKG9faW50ZXJ2YWwpIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBjeWNsZSBiZXR3ZWVuIHNsb3cgbGluZXMsIG9yIC4uLiAqLworCQkJc2xlZXAob19pbnRlcnZhbCk7CisJCQljb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAvKiAuLi53aXRoIGhhaXJ5IHNlbGVjdCBsb29wLi4uICovCisJCX0KKwkJaWYgKHJ6bGVmdCB8fCBybmxlZnQpIHsgICAgICAgICAgICAgICAgICAvKiBzaG92ZWwgdGhhdCBzaGl0IHRpbGwgdGhleSBhaW4ndCAqLworCQkJd3JldHJ5LS07ICAgICAgICAgICAgICAgICAgICAgICAgLyogbm9uZSBsZWZ0LCBhbmQgZ2V0IGFub3RoZXIgbG9hZCAqLworCS8qIG5ldCB3cml0ZSByZXRyaWVzIHNvbWV0aW1lcyBoYXBwZW4gb24gVURQIGNvbm5lY3Rpb25zICovCisJCQlpZiAoIXdyZXRyeSkgeyAgICAgICAgICAgICAgICAgICAvKiBpcyBzb21ldGhpbmcgaHVuZz8gKi8KKwkJCQlob2xsZXJfZXJyb3IoInRvbyBtYW55IG91dHB1dCByZXRyaWVzIik7CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCQlnb3RvIHNob3ZlbDsKKwkJfQorCX0gLyogd2hpbGUgKGZkc19vcGVuKSAqLworCisJLyogWFhYOiBtYXliZSB3YW50IGEgbW9yZSBncmFjZWZ1bCBzaHV0ZG93bigpIGhlcmUsIG9yIHNjcmV3IGFyb3VuZCB3aXRoCisJIGxpbmdlciB0aW1lcz8/ICBJIHN1c3BlY3QgdGhhdCBJIGRvbid0IG5lZWQgdG8gc2luY2UgSSdtIGFsd2F5cyBkb2luZworCSBibG9ja2luZyByZWFkcyBhbmQgd3JpdGVzIGFuZCBteSBvd24gbWFudWFsICJsYXN0IGRpdGNoIiBlZmZvcnRzIHRvIHJlYWQKKwkgdGhlIG5ldCBhZ2FpbiBhZnRlciBhIHRpbWVvdXQuICBJIGhhdmVuJ3Qgc2VlbiBhbnkgc2NyZXd1cHMgeWV0LCBidXQgaXQncworCSBub3QgbGlrZSBteSB0ZXN0IG5ldHdvcmsgaXMgcGFydGljdWxhcmx5IGJ1c3kuLi4gKi8KKwljbG9zZShuZXRmZCk7CisJcmV0dXJuIDA7Cit9IC8qIHJlYWR3cml0ZSAqLworCisvKiBtYWluOiBub3cgd2UgcHVsbCBpdCBhbGwgdG9nZXRoZXIuLi4gKi8KK2ludCBuY19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbmNfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKnN0cl9wLCAqc3RyX3M7CisJSUZfTkNfRVhUUkEoY2hhciAqc3RyX2ksICpzdHJfbzspCisJY2hhciAqdGhlbWRvdHRlZCA9IHRoZW1kb3R0ZWQ7IC8qIGZvciBjb21waWxlciAqLworCWNoYXIgKipwcm9nZ2llOworCWludCB4OworCXVuc2lnbmVkIGNudF9sID0gMDsKKwl1bnNpZ25lZCBvX2xwb3J0ID0gMDsKKworCUlOSVRfRygpOworCisJLyogY2F0Y2ggYSBzaWduYWwgb3IgdHdvIGZvciBjbGVhbnVwICovCisJYmJfc2lnbmFscygwCisJCSsgKDEgPDwgU0lHSU5UKQorCQkrICgxIDw8IFNJR1FVSVQpCisJCSsgKDEgPDwgU0lHVEVSTSkKKwkJLCBjYXRjaCk7CisJLyogYW5kIHN1cHByZXNzIG90aGVycy4uLiAqLworCWJiX3NpZ25hbHMoMAorI2lmZGVmIFNJR1VSRworCQkrICgxIDw8IFNJR1VSRykKKyNlbmRpZgorCQkrICgxIDw8IFNJR1BJUEUpIC8qIGltcG9ydGFudCEgKi8KKwkJLCBTSUdfSUdOKTsKKworCXByb2dnaWUgPSBhcmd2OworCXdoaWxlICgqKytwcm9nZ2llKSB7CisJCWlmIChzdHJjbXAoKnByb2dnaWUsICItZSIpID09IDApIHsKKwkJCSpwcm9nZ2llID0gTlVMTDsKKwkJCXByb2dnaWUrKzsKKwkJCWdvdG8gZV9mb3VuZDsKKwkJfQorCQkvKiAtPG90aGVyX29wdHM+ZSBQUk9HIFtBUkdTXSA/ICovCisJCS8qIChhYm9yaWdpbmFsIGxpbnV4IHVzZXMgdGhpcyBmb3JtKSAqLworCQlpZiAocHJvZ2dpZVswXVswXSA9PSAnLScpIHsKKwkJCWNoYXIgKm9wdHBvcyA9ICpwcm9nZ2llICsgMTsKKwkJCS8qIFNraXAgYWxsIHZhbGlkIG9wdHMgdy9vIHBhcmFtcyAqLworCQkJb3B0cG9zID0gb3B0cG9zICsgc3Ryc3BuKG9wdHBvcywgIm51diJJRl9OQ19TRVJWRVIoImxrIilJRl9OQ19FWFRSQSgieiIpKTsKKwkJCWlmICgqb3B0cG9zID09ICdlJyAmJiAhb3B0cG9zWzFdKSB7CisJCQkJKm9wdHBvcyA9ICdcMCc7CisJCQkJcHJvZ2dpZSsrOworCQkJCUcucHJvZ2dpZTBzYXZlZCA9ICpwcm9nZ2llOworCQkJCSpwcm9nZ2llID0gTlVMTDsgLyogdGVybWluYXRlIGFyZ3YgZm9yIGdldG9wdDMyICovCisJCQkJZ290byBlX2ZvdW5kOworCQkJfQorCQl9CisJfQorCXByb2dnaWUgPSBOVUxMOworIGVfZm91bmQ6CisKKwkvLyAtZyAtRyAtdCAtciBkZWxldGVkLCB1bmltcGxlbWVudGVkIC1hIGRlbGV0ZWQgdG9vCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPzI6dnY6bGw6dysiOyAvKiBtYXggMiBwYXJhbXM7IC12IGFuZCAtbCBhcmUgY291bnRlcnM7IC13IE4gKi8KKwlnZXRvcHQzMihhcmd2LCAibnA6czp1dnc6IiBJRl9OQ19TRVJWRVIoImxrIikKKwkJCUlGX05DX0VYVFJBKCJpOm86eiIpLAorCQkJJnN0cl9wLCAmc3RyX3MsICZvX3dhaXQKKwkJCUlGX05DX0VYVFJBKCwgJnN0cl9pLCAmc3RyX28pLCAmb192ZXJib3NlIElGX05DX1NFUlZFUigsICZjbnRfbCkpOworCWFyZ3YgKz0gb3B0aW5kOworI2lmIEVOQUJMRV9OQ19FWFRSQQorCWlmIChvcHRpb25fbWFzazMyICYgT1BUX2kpIC8qIGxpbmUtaW50ZXJ2YWwgdGltZSAqLworCQlvX2ludGVydmFsID0geGF0b3VfcmFuZ2Uoc3RyX2ksIDEsIDB4ZmZmZik7CisjZW5kaWYKKyNpZiBFTkFCTEVfTkNfU0VSVkVSCisJLy9pZiAob3B0aW9uX21hc2szMiAmIE9QVF9sKSAvKiBsaXN0ZW4gbW9kZSAqLworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX2spIC8qIHBlcnNpc3RlbnQgc2VydmVyIG1vZGUgKi8KKwkJY250X2wgPSAyOworI2VuZGlmCisJLy9pZiAob3B0aW9uX21hc2szMiAmIE9QVF9uKSAvKiBudW1lcmljLW9ubHksIG5vIEROUyBsb29rdXBzICovCisJLy9pZiAob3B0aW9uX21hc2szMiAmIE9QVF9vKSAvKiBoZXhkdW1wIGxvZyAqLworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX3ApIHsgLyogbG9jYWwgc291cmNlIHBvcnQgKi8KKwkJb19scG9ydCA9IGJiX2xvb2t1cF9wb3J0KHN0cl9wLCBvX3VkcG1vZGUgPyAidWRwIiA6ICJ0Y3AiLCAwKTsKKwkJaWYgKCFvX2xwb3J0KQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBsb2NhbCBwb3J0ICclcyciLCBzdHJfcCk7CisJfQorCS8vaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfcikgLyogcmFuZG9taXplIHZhcmlvdXMgdGhpbmdzICovCisJLy9pZiAob3B0aW9uX21hc2szMiAmIE9QVF91KSAvKiB1c2UgVURQICovCisJLy9pZiAob3B0aW9uX21hc2szMiAmIE9QVF92KSAvKiB2ZXJib3NlICovCisJLy9pZiAob3B0aW9uX21hc2szMiAmIE9QVF93KSAvKiB3YWl0IHRpbWUgKi8KKwkvL2lmIChvcHRpb25fbWFzazMyICYgT1BUX3opIC8qIGxpdHRsZSBvciBubyBkYXRhIHhmZXIgKi8KKworCS8qIFdlIG1hbmFnZSBvdXIgZmQncyBzbyB0aGF0IHRoZXkgYXJlIG5ldmVyIDAsMSwyICovCisJLypiYl9zYW5pdGl6ZV9zdGRpbygpOyAtIG5vdCBuZWVkZWQgKi8KKworCWlmIChhcmd2WzBdKSB7CisJCXRoZW1hZGRyID0geGhvc3Qyc29ja2FkZHIoYXJndlswXSwKKwkJCWFyZ3ZbMV0KKwkJCT8gYmJfbG9va3VwX3BvcnQoYXJndlsxXSwgb191ZHBtb2RlID8gInVkcCIgOiAidGNwIiwgMCkKKwkJCTogMCk7CisJfQorCisJLyogY3JlYXRlICYgYmluZCBuZXR3b3JrIHNvY2tldCAqLworCXggPSAob191ZHBtb2RlID8gU09DS19ER1JBTSA6IFNPQ0tfU1RSRUFNKTsKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9zKSB7IC8qIGxvY2FsIGFkZHJlc3MgKi8KKwkJLyogaWYgb19scG9ydCBpcyBzdGlsbCAwLCB0aGVuIHdlIHdpbGwgdXNlIHJhbmRvbSBwb3J0ICovCisJCW91cmFkZHIgPSB4aG9zdDJzb2NrYWRkcihzdHJfcywgb19scG9ydCk7CisjaWZkZWYgQkxPQVQKKwkJLyogcHJldmVudCBzcHVyaW91cyAiVURQIGxpc3RlbiBuZWVkcyAhMCBwb3J0IiAqLworCQlvX2xwb3J0ID0gZ2V0X25wb3J0KG91cmFkZHIpOworCQlvX2xwb3J0ID0gbnRvaHMob19scG9ydCk7CisjZW5kaWYKKwkJeCA9IHhzb2NrZXQob3VyYWRkci0+dS5zYS5zYV9mYW1pbHksIHgsIDApOworCX0gZWxzZSB7CisJCS8qIFdlIHRyeSBJUHY2LCB0aGVuIElQdjQsIHVubGVzcyBhZGRyIGZhbWlseSBpcworCQkgKiBpbXBsaWNpdGx5IHNldCBieSB3YXkgb2YgcmVtb3RlIGFkZHIvcG9ydCBzcGVjICovCisJCXggPSB4c29ja2V0X3R5cGUoJm91cmFkZHIsCisJCQkJKHRoZW1hZGRyID8gdGhlbWFkZHItPnUuc2Euc2FfZmFtaWx5IDogQUZfVU5TUEVDKSwKKwkJCQl4KTsKKwkJaWYgKG9fbHBvcnQpCisJCQlzZXRfbnBvcnQoJm91cmFkZHItPnUuc2EsIGh0b25zKG9fbHBvcnQpKTsKKwl9CisJeG1vdmVfZmQoeCwgbmV0ZmQpOworCXNldHNvY2tvcHRfcmV1c2VhZGRyKG5ldGZkKTsKKwlpZiAob191ZHBtb2RlKQorCQlzb2NrZXRfd2FudF9wa3RpbmZvKG5ldGZkKTsKKwlpZiAoIUVOQUJMRV9GRUFUVVJFX1VOSVhfTE9DQUwKKwkgfHwgY250X2wgIT0gMCAvKiBsaXN0ZW4gKi8KKwkgfHwgb3VyYWRkci0+dS5zYS5zYV9mYW1pbHkgIT0gQUZfVU5JWAorCSkgeworCQl4YmluZChuZXRmZCwgJm91cmFkZHItPnUuc2EsIG91cmFkZHItPmxlbik7CisJfQorI2lmIDAKKwlzZXRzb2Nrb3B0X1NPTF9TT0NLRVRfaW50KG5ldGZkLCBTT19SQ1ZCVUYsIG9fcmN2YnVmKTsKKwlzZXRzb2Nrb3B0X1NPTF9TT0NLRVRfaW50KG5ldGZkLCBTT19TTkRCVUYsIG9fc25kYnVmKTsKKyNlbmRpZgorCisjaWZkZWYgQkxPQVQKKwlpZiAoT1BUX2wgJiYgKG9wdGlvbl9tYXNrMzIgJiAoT1BUX3V8T1BUX2wpKSA9PSAoT1BUX3V8T1BUX2wpKSB7CisJCS8qIGFwcGFyZW50bHkgVURQIGNhbiBsaXN0ZW4gT04gInBvcnQgMCIsCisJCSBidXQgdGhhdCdzIG5vdCB1c2VmdWwgKi8KKwkJaWYgKCFvX2xwb3J0KQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIlVEUCBsaXN0ZW4gbmVlZHMgbm9uemVybyAtcCBwb3J0Iik7CisJfQorI2VuZGlmCisKKwlpZiAocHJvZ2dpZSkgeworCQljbG9zZShTVERJTl9GSUxFTk8pOyAvKiB3b24ndCBuZWVkIHN0ZGluICovCisJCW9wdGlvbl9tYXNrMzIgJj0gfk9QVF9vOyAvKiAtbyB3aXRoIC1lIGlzIG1lYW5pbmdsZXNzISAqLworCX0KKyNpZiBFTkFCTEVfTkNfRVhUUkEKKwlpZiAob19vZmlsZSkKKwkJeG1vdmVfZmQoeG9wZW4oc3RyX28sIE9fV1JPTkxZfE9fQ1JFQVR8T19UUlVOQyksIG9mZCk7CisjZW5kaWYKKworCWlmIChjbnRfbCAhPSAwKSB7CisJCWRvbGlzdGVuKChjbnRfbCAtIDEpLCBwcm9nZ2llKTsKKwkJLyogZG9saXN0ZW4gZG9lcyBpdHMgb3duIGNvbm5lY3QgcmVwb3J0aW5nICovCisJCXggPSByZWFkd3JpdGUoKTsgLyogaXQgZXZlbiB3b3JrcyB3aXRoIFVEUCEgKi8KKwl9IGVsc2UgeworCQkvKiBPdXRib3VuZCBjb25uZWN0cy4gIE5vdyB3ZSdyZSBtb3JlIHBpY2t5IGFib3V0IGFyZ3MuLi4gKi8KKwkJaWYgKCF0aGVtYWRkcikKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKworCQlyZW1lbmQgPSAqdGhlbWFkZHI7CisJCWlmIChvX3ZlcmJvc2UpCisJCQl0aGVtZG90dGVkID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWQoJnRoZW1hZGRyLT51LnNhKTsKKworCQl4ID0gY29ubmVjdF93X3RpbWVvdXQobmV0ZmQpOworCQlpZiAob196ZXJvICYmIHggPT0gMCAmJiBvX3VkcG1vZGUpICAgICAgICAvKiBpZiBVRFAgc2Nhbm5pbmcuLi4gKi8KKwkJCXggPSB1ZHB0ZXN0KCk7CisJCWlmICh4ID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAvKiBZb3csIGFyZSB3ZSBPUEVOIFlFVD8hICovCisJCQlpZiAob192ZXJib3NlKQorCQkJCWZwcmludGYoc3RkZXJyLCAiJXMgKCVzKSBvcGVuXG4iLCBhcmd2WzBdLCB0aGVtZG90dGVkKTsKKwkJCWlmIChwcm9nZ2llKSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4ZWMgaXMgdmFsaWQgZm9yIG91dGJvdW5kLCB0b28gKi8KKwkJCQlkb2V4ZWMocHJvZ2dpZSk7CisJCQlpZiAoIW9femVybykKKwkJCQl4ID0gcmVhZHdyaXRlKCk7CisJCX0gZWxzZSB7IC8qIGNvbm5lY3Qgb3IgdWRwdGVzdCB3YXNuJ3Qgc3VjY2Vzc2Z1bCAqLworCQkJeCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleGl0IHN0YXR1cyAqLworCQkJLyogaWYgd2UncmUgc2Nhbm5pbmcgYXQgYSAib25lIC12IiB2ZXJib3NpdHkgbGV2ZWwsIGRvbid0IHByaW50IHJlZnVzYWxzLgorCQkJIEdpdmUgaXQgYW5vdGhlciAtdiBpZiB5b3Ugd2FudCB0byBzZWUgZXZlcnl0aGluZy4gKi8KKwkJCWlmIChvX3ZlcmJvc2UgPiAxIHx8IChvX3ZlcmJvc2UgJiYgZXJybm8gIT0gRUNPTk5SRUZVU0VEKSkKKwkJCQliYl9wZXJyb3JfbXNnKCIlcyAoJXMpIiwgYXJndlswXSwgdGhlbWRvdHRlZCk7CisJCX0KKwl9CisJaWYgKG9fdmVyYm9zZSA+IDEpICAgICAgICAgICAgICAgIC8qIG5vcm1hbGx5IHdlIGRvbid0IGNhcmUgKi8KKwkJZnByaW50ZihzdGRlcnIsIFNFTlRfTl9SRUNWX00sIHdyb3RlX25ldCwgd3JvdGVfb3V0KTsKKwlyZXR1cm4geDsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvbmV0c3RhdC5jIGIvbmV0d29ya2luZy9uZXRzdGF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE5NmQ0MgotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvbmV0c3RhdC5jCkBAIC0wLDAgKzEsNzQ2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIG5ldHN0YXQgaW1wbGVtZW50YXRpb24ocykgZm9yIGJ1c3lib3gKKyAqIGJhc2VkIGluIHBhcnQgb24gdGhlIG5ldHN0YXQgaW1wbGVtZW50YXRpb24gZnJvbSBuZXQtdG9vbHMuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAyIGJ5IEJhcnQgVmlzc2NoZXIgPG1hZ2lja0BsaW51eC1mYW4uY29tPgorICoKKyAqIDIwMDItMDQtMjAKKyAqIElQVjYgc3VwcG9ydCBhZGRlZCBieSBCYXJ0IFZpc3NjaGVyIDxtYWdpY2tAbGludXgtZmFuLmNvbT4KKyAqCisgKiAyMDA4LTA3LTEwCisgKiBvcHRpb25hbCAnLXAnIGZsYWcgc3VwcG9ydCBwb3J0ZWQgZnJvbSBuZXQtdG9vbHMgYnkgRy4gU29tbG8gPHNvbWxvQGNtdS5lZHU+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJpbmV0X2NvbW1vbi5oIgorCisvL3VzYWdlOiNkZWZpbmUgbmV0c3RhdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy0iSUZfUk9VVEUoInIiKSJhbF0gWy10dXd4XSBbLWVuIklGX0ZFQVRVUkVfTkVUU1RBVF9XSURFKCJXIilJRl9GRUFUVVJFX05FVFNUQVRfUFJHKCJwIikiXSIKKy8vdXNhZ2U6I2RlZmluZSBuZXRzdGF0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRGlzcGxheSBuZXR3b3JraW5nIGluZm9ybWF0aW9uXG4iCisvL3VzYWdlOglJRl9ST1VURSgKKy8vdXNhZ2U6ICAgICAiXG4JLXIJUm91dGluZyB0YWJsZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLWEJQWxsIHNvY2tldHMiCisvL3VzYWdlOiAgICAgIlxuCS1sCUxpc3RlbmluZyBzb2NrZXRzIgorLy91c2FnZTogICAgICJcbgkJRWxzZTogY29ubmVjdGVkIHNvY2tldHMiCisvL3VzYWdlOiAgICAgIlxuCS10CVRDUCBzb2NrZXRzIgorLy91c2FnZTogICAgICJcbgktdQlVRFAgc29ja2V0cyIKKy8vdXNhZ2U6ICAgICAiXG4JLXcJUmF3IHNvY2tldHMiCisvL3VzYWdlOiAgICAgIlxuCS14CVVuaXggc29ja2V0cyIKKy8vdXNhZ2U6ICAgICAiXG4JCUVsc2U6IGFsbCBzb2NrZXQgdHlwZXMiCisvL3VzYWdlOiAgICAgIlxuCS1lCU90aGVyL21vcmUgaW5mb3JtYXRpb24iCisvL3VzYWdlOiAgICAgIlxuCS1uCURvbid0IHJlc29sdmUgbmFtZXMiCisvL3VzYWdlOglJRl9GRUFUVVJFX05FVFNUQVRfV0lERSgKKy8vdXNhZ2U6ICAgICAiXG4JLVcJV2lkZSBkaXNwbGF5IgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9ORVRTVEFUX1BSRygKKy8vdXNhZ2U6ICAgICAiXG4JLXAJU2hvdyBQSUQvcHJvZ3JhbSBuYW1lIGZvciBzb2NrZXRzIgorLy91c2FnZToJKQorCisjZGVmaW5lIE5FVFNUQVRfT1BUUyAibGFlbnR1d3giIFwKKwlJRl9ST1VURSggICAgICAgICAgICAgICAiciIpIFwKKwlJRl9GRUFUVVJFX05FVFNUQVRfV0lERSgiVyIpIFwKKwlJRl9GRUFUVVJFX05FVFNUQVRfUFJHKCAicCIpCisKK2VudW0geworCU9QVF9zb2NrX2xpc3RlbiA9IDEgPDwgMCwgLy8gbAorCU9QVF9zb2NrX2FsbCAgICA9IDEgPDwgMSwgLy8gYQorCU9QVF9leHRlbmRlZCAgICA9IDEgPDwgMiwgLy8gZQorCU9QVF9ub3Jlc29sdmUgICA9IDEgPDwgMywgLy8gbgorCU9QVF9zb2NrX3RjcCAgICA9IDEgPDwgNCwgLy8gdAorCU9QVF9zb2NrX3VkcCAgICA9IDEgPDwgNSwgLy8gdQorCU9QVF9zb2NrX3JhdyAgICA9IDEgPDwgNiwgLy8gdworCU9QVF9zb2NrX3VuaXggICA9IDEgPDwgNywgLy8geAorCU9QVEJJVF94ICAgICAgICA9IDcsCisJSUZfUk9VVEUoICAgICAgICAgICAgICAgT1BUQklUX1JPVVRFLCkKKwlJRl9GRUFUVVJFX05FVFNUQVRfV0lERShPUFRCSVRfV0lERSAsKQorCUlGX0ZFQVRVUkVfTkVUU1RBVF9QUkcoIE9QVEJJVF9QUkcgICwpCisJT1BUX3JvdXRlICAgICAgID0gSUZfUk9VVEUoICAgICAgICAgICAgICAgKDEgPDwgT1BUQklUX1JPVVRFKSkgKyAwLCAvLyByCisJT1BUX3dpZGUgICAgICAgID0gSUZfRkVBVFVSRV9ORVRTVEFUX1dJREUoKDEgPDwgT1BUQklUX1dJREUgKSkgKyAwLCAvLyBXCisJT1BUX3ByZyAgICAgICAgID0gSUZfRkVBVFVSRV9ORVRTVEFUX1BSRyggKDEgPDwgT1BUQklUX1BSRyAgKSkgKyAwLCAvLyBwCit9OworCisjZGVmaW5lIE5FVFNUQVRfQ09OTkVDVEVEIDB4MDEKKyNkZWZpbmUgTkVUU1RBVF9MSVNURU5JTkcgMHgwMgorI2RlZmluZSBORVRTVEFUX05VTUVSSUMgICAweDA0CisvKiBNdXN0IG1hdGNoIGdldG9wdDMyIG9wdGlvbiBzdHJpbmcgKi8KKyNkZWZpbmUgTkVUU1RBVF9UQ1AgICAgICAgMHgxMAorI2RlZmluZSBORVRTVEFUX1VEUCAgICAgICAweDIwCisjZGVmaW5lIE5FVFNUQVRfUkFXICAgICAgIDB4NDAKKyNkZWZpbmUgTkVUU1RBVF9VTklYICAgICAgMHg4MAorI2RlZmluZSBORVRTVEFUX0FMTFBST1RPICAoTkVUU1RBVF9UQ1B8TkVUU1RBVF9VRFB8TkVUU1RBVF9SQVd8TkVUU1RBVF9VTklYKQorCisKK2VudW0geworCVRDUF9FU1RBQkxJU0hFRCA9IDEsCisJVENQX1NZTl9TRU5ULAorCVRDUF9TWU5fUkVDViwKKwlUQ1BfRklOX1dBSVQxLAorCVRDUF9GSU5fV0FJVDIsCisJVENQX1RJTUVfV0FJVCwKKwlUQ1BfQ0xPU0UsCisJVENQX0NMT1NFX1dBSVQsCisJVENQX0xBU1RfQUNLLAorCVRDUF9MSVNURU4sCisJVENQX0NMT1NJTkcsIC8qIG5vdyBhIHZhbGlkIHN0YXRlICovCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGNwX3N0YXRlW10gPSB7CisJIiIsCisJIkVTVEFCTElTSEVEIiwKKwkiU1lOX1NFTlQiLAorCSJTWU5fUkVDViIsCisJIkZJTl9XQUlUMSIsCisJIkZJTl9XQUlUMiIsCisJIlRJTUVfV0FJVCIsCisJIkNMT1NFIiwKKwkiQ0xPU0VfV0FJVCIsCisJIkxBU1RfQUNLIiwKKwkiTElTVEVOIiwKKwkiQ0xPU0lORyIKK307CisKK3R5cGVkZWYgZW51bSB7CisJU1NfRlJFRSA9IDAsICAgICAvKiBub3QgYWxsb2NhdGVkICAgICAgICAgICAgICAgICovCisJU1NfVU5DT05ORUNURUQsICAvKiB1bmNvbm5lY3RlZCB0byBhbnkgc29ja2V0ICAgICovCisJU1NfQ09OTkVDVElORywgICAvKiBpbiBwcm9jZXNzIG9mIGNvbm5lY3RpbmcgICAgICovCisJU1NfQ09OTkVDVEVELCAgICAvKiBjb25uZWN0ZWQgdG8gc29ja2V0ICAgICAgICAgICovCisJU1NfRElTQ09OTkVDVElORyAvKiBpbiBwcm9jZXNzIG9mIGRpc2Nvbm5lY3RpbmcgICovCit9IHNvY2tldF9zdGF0ZTsKKworI2RlZmluZSBTT19BQ0NFUFRDT04gKDE8PDE2KSAgLyogcGVyZm9ybWVkIGEgbGlzdGVuICAgICAgICAgICAqLworI2RlZmluZSBTT19XQUlUREFUQSAgKDE8PDE3KSAgLyogd2FpdCBkYXRhIHRvIHJlYWQgICAgICAgICAgICAqLworI2RlZmluZSBTT19OT1NQQUNFICAgKDE8PDE4KSAgLyogbm8gc3BhY2UgdG8gd3JpdGUgICAgICAgICAgICAqLworCisjZGVmaW5lIEFERFJfTk9STUFMX1dJRFRIICAgICAgICAyMworLyogV2hlbiB0aGVyZSBhcmUgSVB2NiBjb25uZWN0aW9ucyB0aGUgSVB2NiBhZGRyZXNzZXMgd2lsbCBiZQorICogdHJ1bmNhdGVkIHRvIG5vbmUtcmVjb2duaXRpb24uIFRoZSAnLVcnIG9wdGlvbiBtYWtlcyB0aGUKKyAqIGFkZHJlc3MgY29sdW1ucyB3aWRlIGVub3VnaCB0byBhY2NvbW1vZGF0ZSBmb3IgbG9uZ2VzdCBwb3NzaWJsZQorICogSVB2NiBhZGRyZXNzZXMsIGkuZS4gYWRkcmVzc2VzIG9mIHRoZSBmb3JtCisgKiB4eHh4Onh4eHg6eHh4eDp4eHh4Onh4eHg6eHh4eDpkZGQuZGRkLmRkZC5kZGQKKyAqLworI2RlZmluZSBBRERSX1dJREUgICAgICAgICAgICAgICAgNTEgIC8qIElORVQ2X0FERFJTVFJMRU4gKyA1IGZvciB0aGUgcG9ydCBudW1iZXIgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9ORVRTVEFUX1dJREUKKyMgZGVmaW5lIEZNVF9ORVRfQ09OTl9EQVRBICAgICAgICIlcyAgICU2bHUgJTZsdSAlLSpzICUtKnMgJS0xMnMiCisjIGRlZmluZSBGTVRfTkVUX0NPTk5fSEVBREVSICAgICAiXG5Qcm90byBSZWN2LVEgU2VuZC1RICUtKnMgJS0qcyBTdGF0ZSAgICAgICAlc1xuIgorI2Vsc2UKKyMgZGVmaW5lIEZNVF9ORVRfQ09OTl9EQVRBICAgICAgICIlcyAgICU2bHUgJTZsdSAlLTIzcyAlLTIzcyAlLTEycyIKKyMgZGVmaW5lIEZNVF9ORVRfQ09OTl9IRUFERVIgICAgICJcblByb3RvIFJlY3YtUSBTZW5kLVEgJS0yM3MgJS0yM3MgU3RhdGUgICAgICAgJXNcbiIKKyNlbmRpZgorCisjZGVmaW5lIFBST0dOQU1FX1dJRFRIICAgICAyMAorI2RlZmluZSBQUk9HTkFNRV9XSURUSF9TVFIgIjIwIgorLyogUFJPR05BTUVfV0lEVEggY2hhcnM6IDEyMzQ1Njc4OTAxMjM0NTY3ODkwICovCisjZGVmaW5lIFBST0dOQU1FX0JBTk5FUiAiUElEL1Byb2dyYW0gbmFtZSAgICAiCisKK3N0cnVjdCBwcmdfbm9kZSB7CisJc3RydWN0IHByZ19ub2RlICpuZXh0OworCWxvbmcgaW5vZGU7CisJY2hhciBuYW1lW1BST0dOQU1FX1dJRFRIXTsKK307CisKKyNkZWZpbmUgUFJHX0hBU0hfU0laRSAyMTEKKworc3RydWN0IGdsb2JhbHMgeworCXNtYWxsaW50IGZsYWdzOworI2lmIEVOQUJMRV9GRUFUVVJFX05FVFNUQVRfUFJHCisJc21hbGxpbnQgcHJnX2NhY2hlX2xvYWRlZDsKKwlzdHJ1Y3QgcHJnX25vZGUgKnByZ19oYXNoW1BSR19IQVNIX1NJWkVdOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfTkVUU1RBVF9QUkcKKwljb25zdCBjaGFyICpwcm9nbmFtZV9iYW5uZXI7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9ORVRTVEFUX1dJREUKKwl1bnNpZ25lZCBhZGRyX3dpZHRoOworI2VuZGlmCit9OworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIGZsYWdzICAgICAgICAgICAgKEcuZmxhZ3MgICAgICAgICAgICkKKyNkZWZpbmUgcHJnX2NhY2hlX2xvYWRlZCAoRy5wcmdfY2FjaGVfbG9hZGVkKQorI2RlZmluZSBwcmdfaGFzaCAgICAgICAgIChHLnByZ19oYXNoICAgICAgICApCisjaWYgRU5BQkxFX0ZFQVRVUkVfTkVUU1RBVF9QUkcKKyMgZGVmaW5lIHByb2duYW1lX2Jhbm5lciAoRy5wcm9nbmFtZV9iYW5uZXIgKQorI2Vsc2UKKyMgZGVmaW5lIHByb2duYW1lX2Jhbm5lciAiIgorI2VuZGlmCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCisJZmxhZ3MgPSBORVRTVEFUX0NPTk5FQ1RFRCB8IE5FVFNUQVRfQUxMUFJPVE87IFwKK30gd2hpbGUgKDApCisKKworI2lmIEVOQUJMRV9GRUFUVVJFX05FVFNUQVRfUFJHCisKKy8qIERlbGliZXJhdGVseSB0cnVuY2F0aW5nIGxvbmcgdG8gdW5zaWduZWQgKmludCogKi8KKyNkZWZpbmUgUFJHX0hBU0hJVCh4KSAoKHVuc2lnbmVkKSh4KSAlIFBSR19IQVNIX1NJWkUpCisKK3N0YXRpYyB2b2lkIHByZ19jYWNoZV9hZGQobG9uZyBpbm9kZSwgY2hhciAqbmFtZSkKK3sKKwl1bnNpZ25lZCBoaSA9IFBSR19IQVNISVQoaW5vZGUpOworCXN0cnVjdCBwcmdfbm9kZSAqKnBucCwgKnBuOworCisJcHJnX2NhY2hlX2xvYWRlZCA9IDI7CisJZm9yIChwbnAgPSBwcmdfaGFzaCArIGhpOyAocG4gPSAqcG5wKSAhPSBOVUxMOyBwbnAgPSAmcG4tPm5leHQpIHsKKwkJaWYgKHBuLT5pbm9kZSA9PSBpbm9kZSkgeworCQkJLyogU29tZSB3YXJuaW5nIHNob3VsZCBiZSBhcHByb3ByaWF0ZSBoZXJlCisJCQkgKiBhcyB3ZSBnb3QgbXVsdGlwbGUgcHJvY2Vzc2VzIGZvciBvbmUgaS1ub2RlICovCisJCQlyZXR1cm47CisJCX0KKwl9CisJKnBucCA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwcmdfbm9kZSkpOworCXBuID0gKnBucDsKKwlwbi0+aW5vZGUgPSBpbm9kZTsKKwlzYWZlX3N0cm5jcHkocG4tPm5hbWUsIG5hbWUsIFBST0dOQU1FX1dJRFRIKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnByZ19jYWNoZV9nZXQobG9uZyBpbm9kZSkKK3sKKwl1bnNpZ25lZCBoaSA9IFBSR19IQVNISVQoaW5vZGUpOworCXN0cnVjdCBwcmdfbm9kZSAqcG47CisKKwlmb3IgKHBuID0gcHJnX2hhc2hbaGldOyBwbjsgcG4gPSBwbi0+bmV4dCkKKwkJaWYgKHBuLT5pbm9kZSA9PSBpbm9kZSkKKwkJCXJldHVybiBwbi0+bmFtZTsKKwlyZXR1cm4gIi0iOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAKK3N0YXRpYyB2b2lkIHByZ19jYWNoZV9jbGVhcih2b2lkKQoreworCXN0cnVjdCBwcmdfbm9kZSAqKnBucCwgKnBuOworCisJZm9yIChwbnAgPSBwcmdfaGFzaDsgcG5wIDwgcHJnX2hhc2ggKyBQUkdfSEFTSF9TSVpFOyBwbnArKykgeworCQl3aGlsZSAoKHBuID0gKnBucCkgIT0gTlVMTCkgeworCQkJKnBucCA9IHBuLT5uZXh0OworCQkJZnJlZShwbik7CisJCX0KKwl9Cit9CisjZWxzZQorI2RlZmluZSBwcmdfY2FjaGVfY2xlYXIoKSAoKHZvaWQpMCkKKyNlbmRpZgorCitzdGF0aWMgbG9uZyBleHRyYWN0X3NvY2tldF9pbm9kZShjb25zdCBjaGFyICpsbmFtZSkKK3sKKwlsb25nIGlub2RlID0gLTE7CisKKwlpZiAoaXNfcHJlZml4ZWRfd2l0aChsbmFtZSwgInNvY2tldDpbIikpIHsKKwkJLyogInNvY2tldDpbMTIzNDVdIiwgZXh0cmFjdCB0aGUgIjEyMzQ1IiBhcyBpbm9kZSAqLworCQlpbm9kZSA9IGJiX3N0cnRvdWwobG5hbWUgKyBzaXplb2YoInNvY2tldDpbIiktMSwgKGNoYXIqKikmbG5hbWUsIDApOworCQlpZiAoKmxuYW1lICE9ICddJykKKwkJCWlub2RlID0gLTE7CisJfSBlbHNlIGlmIChpc19wcmVmaXhlZF93aXRoKGxuYW1lLCAiWzAwMDBdOiIpKSB7CisJCS8qICJbMDAwMF06MTIzNDUiLCBleHRyYWN0IHRoZSAiMTIzNDUiIGFzIGlub2RlICovCisJCWlub2RlID0gYmJfc3RydG91bChsbmFtZSArIHNpemVvZigiWzAwMDBdOiIpLTEsIE5VTEwsIDApOworCQlpZiAoZXJybm8pIC8qIG5vdCBOVUwgdGVybWluYXRlZD8gKi8KKwkJCWlub2RlID0gLTE7CisJfQorCisjaWYgMCAvKiBiYl9zdHJ0b2wgcmV0dXJucyBhbGwtb25lcyBiaXQgcGF0dGVybiBvbiBFUkFOR0UgYW55d2F5ICovCisJaWYgKGVycm5vID09IEVSQU5HRSkKKwkJaW5vZGUgPSAtMTsKKyNlbmRpZgorCXJldHVybiBpbm9kZTsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgYWRkX3RvX3ByZ19jYWNoZV9pZl9zb2NrZXQoY29uc3QgY2hhciAqZmlsZU5hbWUsCisJCXN0cnVjdCBzdGF0ICpzdGF0YnVmIFVOVVNFRF9QQVJBTSwKKwkJdm9pZCAqcGlkX3NsYXNoX3Byb2duYW1lLAorCQlpbnQgZGVwdGggVU5VU0VEX1BBUkFNKQoreworCWNoYXIgKmxpbmtuYW1lOworCWxvbmcgaW5vZGU7CisKKwlsaW5rbmFtZSA9IHhtYWxsb2NfcmVhZGxpbmsoZmlsZU5hbWUpOworCWlmIChsaW5rbmFtZSAhPSBOVUxMKSB7CisJCWlub2RlID0gZXh0cmFjdF9zb2NrZXRfaW5vZGUobGlua25hbWUpOworCQlmcmVlKGxpbmtuYW1lKTsKKwkJaWYgKGlub2RlID49IDApCisJCQlwcmdfY2FjaGVfYWRkKGlub2RlLCAoY2hhciAqKXBpZF9zbGFzaF9wcm9nbmFtZSk7CisJfQorCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBkaXJfYWN0KGNvbnN0IGNoYXIgKmZpbGVOYW1lLAorCQlzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZiBVTlVTRURfUEFSQU0sCisJCXZvaWQgKnVzZXJEYXRhIFVOVVNFRF9QQVJBTSwKKwkJaW50IGRlcHRoKQoreworCWNvbnN0IGNoYXIgKnBpZDsKKwljaGFyICpwaWRfc2xhc2hfcHJvZ25hbWU7CisJY2hhciBwcm9jX3BpZF9mbmFtZVtzaXplb2YoIi9wcm9jLyV1L2NtZGxpbmUiKSArIHNpemVvZihsb25nKSozXTsKKwljaGFyIGNtZGxpbmVfYnVmWzUxMl07CisJaW50IG4sIGxlbjsKKworCWlmIChkZXB0aCA9PSAwKSAvKiAiL3Byb2MiIGl0c2VsZiAqLworCQlyZXR1cm4gVFJVRTsgLyogY29udGludWUgbG9va2luZyBvbmUgbGV2ZWwgYmVsb3cgL3Byb2MgKi8KKworCXBpZCA9IGZpbGVOYW1lICsgc2l6ZW9mKCIvcHJvYy8iKS0xOyAvKiBwb2ludCBhZnRlciAiL3Byb2MvIiAqLworCWlmICghaXNkaWdpdChwaWRbMF0pKSAvKiBza2lwIC9wcm9jIGVudHJpZXMgd2hpY2ggYXJlbid0IHByb2Nlc3NlcyAqLworCQlyZXR1cm4gU0tJUDsKKworCWxlbiA9IHNucHJpbnRmKHByb2NfcGlkX2ZuYW1lLCBzaXplb2YocHJvY19waWRfZm5hbWUpLCAiJXMvY21kbGluZSIsIGZpbGVOYW1lKTsKKwluID0gb3Blbl9yZWFkX2Nsb3NlKHByb2NfcGlkX2ZuYW1lLCBjbWRsaW5lX2J1Ziwgc2l6ZW9mKGNtZGxpbmVfYnVmKSAtIDEpOworCWlmIChuIDwgMCkKKwkJcmV0dXJuIEZBTFNFOworCWNtZGxpbmVfYnVmW25dID0gJ1wwJzsKKworCS8qIGdvIHRocm91Z2ggYWxsIGZpbGVzIGluIC9wcm9jL1BJRC9mZCBhbmQgY2hlY2sgd2hldGhlciB0aGV5IGFyZSBzb2NrZXRzICovCisJc3RyY3B5KHByb2NfcGlkX2ZuYW1lICsgbGVuIC0gKHNpemVvZigiY21kbGluZSIpLTEpLCAiZmQiKTsKKwlwaWRfc2xhc2hfcHJvZ25hbWUgPSBjb25jYXRfcGF0aF9maWxlKHBpZCwgYmJfYmFzZW5hbWUoY21kbGluZV9idWYpKTsgLyogIlBJRC9hcmd2MCIgKi8KKwluID0gcmVjdXJzaXZlX2FjdGlvbihwcm9jX3BpZF9mbmFtZSwKKwkJCUFDVElPTl9SRUNVUlNFIHwgQUNUSU9OX1FVSUVULAorCQkJYWRkX3RvX3ByZ19jYWNoZV9pZl9zb2NrZXQsCisJCQlOVUxMLAorCQkJKHZvaWQgKilwaWRfc2xhc2hfcHJvZ25hbWUsCisJCQkwKTsKKwlmcmVlKHBpZF9zbGFzaF9wcm9nbmFtZSk7CisKKwlpZiAoIW4pCisJCXJldHVybiBGQUxTRTsgLyogc2lnbmFsIHBlcm1pc3Npb25zIGVycm9yIHRvIGNhbGxlciAqLworCisJcmV0dXJuIFNLSVA7IC8qIGNhbGxlciBzaG91bGQgbm90IHJlY3Vyc2UgZnVydGhlciBpbnRvIHRoaXMgZGlyICovCit9CisKK3N0YXRpYyB2b2lkIHByZ19jYWNoZV9sb2FkKHZvaWQpCit7CisJaW50IGxvYWRfb2s7CisKKwlwcmdfY2FjaGVfbG9hZGVkID0gMTsKKwlsb2FkX29rID0gcmVjdXJzaXZlX2FjdGlvbigiL3Byb2MiLCBBQ1RJT05fUkVDVVJTRSB8IEFDVElPTl9RVUlFVCwKKwkJCQlOVUxMLCBkaXJfYWN0LCBOVUxMLCAwKTsKKwlpZiAobG9hZF9vaykKKwkJcmV0dXJuOworCisJaWYgKHByZ19jYWNoZV9sb2FkZWQgPT0gMSkKKwkJYmJfZXJyb3JfbXNnKCJjYW4ndCBzY2FuIC9wcm9jIC0gYXJlIHlvdSByb290PyIpOworCWVsc2UKKwkJYmJfZXJyb3JfbXNnKCJzaG93aW5nIG9ubHkgcHJvY2Vzc2VzIHdpdGggeW91ciB1c2VyIElEIik7Cit9CisKKyNlbHNlCisKKyNkZWZpbmUgcHJnX2NhY2hlX2NsZWFyKCkgICAgICAgKCh2b2lkKTApCisKKyNlbmRpZiAvL0VOQUJMRV9GRUFUVVJFX05FVFNUQVRfUFJHCisKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKK3N0YXRpYyB2b2lkIGJ1aWxkX2lwdjZfYWRkcihjaGFyKiBsb2NhbF9hZGRyLCBzdHJ1Y3Qgc29ja2FkZHJfaW42KiBsb2NhbGFkZHIpCit7CisJY2hhciBhZGRyNltJTkVUNl9BRERSU1RSTEVOXTsKKwlzdHJ1Y3QgaW42X2FkZHIgaW42OworCisJc3NjYW5mKGxvY2FsX2FkZHIsICIlMDhYJTA4WCUwOFglMDhYIiwKKwkJICAgJmluNi5zNl9hZGRyMzJbMF0sICZpbjYuczZfYWRkcjMyWzFdLAorCQkgICAmaW42LnM2X2FkZHIzMlsyXSwgJmluNi5zNl9hZGRyMzJbM10pOworCWluZXRfbnRvcChBRl9JTkVUNiwgJmluNiwgYWRkcjYsIHNpemVvZihhZGRyNikpOworCWluZXRfcHRvbihBRl9JTkVUNiwgYWRkcjYsICZsb2NhbGFkZHItPnNpbjZfYWRkcik7CisKKwlsb2NhbGFkZHItPnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgYnVpbGRfaXB2NF9hZGRyKGNoYXIqIGxvY2FsX2FkZHIsIHN0cnVjdCBzb2NrYWRkcl9pbiogbG9jYWxhZGRyKQoreworCXNzY2FuZihsb2NhbF9hZGRyLCAiJVgiLCAmbG9jYWxhZGRyLT5zaW5fYWRkci5zX2FkZHIpOworCWxvY2FsYWRkci0+c2luX2ZhbWlseSA9IEFGX0lORVQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfc25hbWUoaW50IHBvcnQsIGNvbnN0IGNoYXIgKnByb3RvLCBpbnQgbnVtZXJpYykKK3sKKwlpZiAoIXBvcnQpCisJCXJldHVybiAiKiI7CisJaWYgKCFudW1lcmljKSB7CisJCXN0cnVjdCBzZXJ2ZW50ICpzZSA9IGdldHNlcnZieXBvcnQocG9ydCwgcHJvdG8pOworCQlpZiAoc2UpCisJCQlyZXR1cm4gc2UtPnNfbmFtZTsKKwl9CisJLyogaHVtbW0sIHdlIG1heSByZXR1cm4gc3RhdGljIGJ1ZmZlciBoZXJlISEgKi8KKwlyZXR1cm4gaXRvYShudG9ocyhwb3J0KSk7Cit9CisKK3N0YXRpYyBjaGFyICppcF9wb3J0X3N0cihzdHJ1Y3Qgc29ja2FkZHIgKmFkZHIsIGludCBwb3J0LCBjb25zdCBjaGFyICpwcm90bywgaW50IG51bWVyaWMpCit7CisJY2hhciAqaG9zdCwgKmhvc3RfcG9ydDsKKworCS8qIENvZGUgd2hpY2ggdXNlZCAiKiIgZm9yIElOQUREUl9BTlkgaXMgcmVtb3ZlZDogaXQncyBhbWJpZ3VvdXMKKwkgKiBpbiBJUHY2LCB3aGlsZSAiMC4wLjAuMCIgaXMgbm90LiAqLworCisJaG9zdCA9IG51bWVyaWMgPyB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZF9ub3BvcnQoYWRkcikKKwkgICAgICAgICAgICAgICA6IHhtYWxsb2Nfc29ja2FkZHIyaG9zdF9ub3BvcnQoYWRkcik7CisKKwlob3N0X3BvcnQgPSB4YXNwcmludGYoIiVzOiVzIiwgaG9zdCwgZ2V0X3NuYW1lKGh0b25zKHBvcnQpLCBwcm90bywgbnVtZXJpYykpOworCWZyZWUoaG9zdCk7CisJcmV0dXJuIGhvc3RfcG9ydDsKK30KKworc3RydWN0IGluZXRfcGFyYW1zIHsKKwlpbnQgbG9jYWxfcG9ydCwgcmVtX3BvcnQsIHN0YXRlLCB1aWQ7CisJdW5pb24geworCQlzdHJ1Y3Qgc29ja2FkZHIgICAgIHNhOworCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gIHNpbjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2luNjsKKyNlbmRpZgorCX0gbG9jYWxhZGRyLCByZW1hZGRyOworCXVuc2lnbmVkIGxvbmcgcnhxLCB0eHEsIGlub2RlOworfTsKKworc3RhdGljIGludCBzY2FuX2luZXRfcHJvY19saW5lKHN0cnVjdCBpbmV0X3BhcmFtcyAqcGFyYW0sIGNoYXIgKmxpbmUpCit7CisJaW50IG51bTsKKwkvKiBJUHY2IC9wcm9jIGZpbGVzIHVzZSAzMi1jaGFyIGhleCByZXByZXNlbnRhdGlvbgorCSAqIG9mIElQdjYgYWRkcmVzcywgZm9sbG93ZWQgYnkgOlBPUlRfSU5fSEVYCisJICovCisJY2hhciBsb2NhbF9hZGRyWzMzXSwgcmVtX2FkZHJbMzNdOyAvKiAzMiArIDEgZm9yIE5VTCAqLworCisJbnVtID0gc3NjYW5mKGxpbmUsCisJCQkiJSpkOiAlMzJbMC05QS1GYS1mXTolWCAiCisJCQkiJTMyWzAtOUEtRmEtZl06JVggJVggIgorCQkJIiVsWDolbFggJSpYOiUqWCAiCisJCQkiJSpYICVkICUqZCAlbHUgIiwKKwkJCWxvY2FsX2FkZHIsICZwYXJhbS0+bG9jYWxfcG9ydCwKKwkJCXJlbV9hZGRyLCAmcGFyYW0tPnJlbV9wb3J0LCAmcGFyYW0tPnN0YXRlLAorCQkJJnBhcmFtLT50eHEsICZwYXJhbS0+cnhxLAorCQkJJnBhcmFtLT51aWQsICZwYXJhbS0+aW5vZGUpOworCWlmIChudW0gPCA5KSB7CisJCXJldHVybiAxOyAvKiBlcnJvciAqLworCX0KKworCWlmIChzdHJsZW4obG9jYWxfYWRkcikgPiA4KSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCQlidWlsZF9pcHY2X2FkZHIobG9jYWxfYWRkciwgJnBhcmFtLT5sb2NhbGFkZHIuc2luNik7CisJCWJ1aWxkX2lwdjZfYWRkcihyZW1fYWRkciwgJnBhcmFtLT5yZW1hZGRyLnNpbjYpOworI2VuZGlmCisJfSBlbHNlIHsKKwkJYnVpbGRfaXB2NF9hZGRyKGxvY2FsX2FkZHIsICZwYXJhbS0+bG9jYWxhZGRyLnNpbik7CisJCWJ1aWxkX2lwdjRfYWRkcihyZW1fYWRkciwgJnBhcmFtLT5yZW1hZGRyLnNpbik7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwcmludF9pbmV0X2xpbmUoc3RydWN0IGluZXRfcGFyYW1zICpwYXJhbSwKKwkJY29uc3QgY2hhciAqc3RhdGVfc3RyLCBjb25zdCBjaGFyICpwcm90bywgaW50IGlzX2Nvbm5lY3RlZCkKK3sKKwlpZiAoKGlzX2Nvbm5lY3RlZCAmJiAoZmxhZ3MgJiBORVRTVEFUX0NPTk5FQ1RFRCkpCisJIHx8ICghaXNfY29ubmVjdGVkICYmIChmbGFncyAmIE5FVFNUQVRfTElTVEVOSU5HKSkKKwkpIHsKKwkJY2hhciAqbCA9IGlwX3BvcnRfc3RyKAorCQkJCSZwYXJhbS0+bG9jYWxhZGRyLnNhLCBwYXJhbS0+bG9jYWxfcG9ydCwKKwkJCQlwcm90bywgZmxhZ3MgJiBORVRTVEFUX05VTUVSSUMpOworCQljaGFyICpyID0gaXBfcG9ydF9zdHIoCisJCQkJJnBhcmFtLT5yZW1hZGRyLnNhLCBwYXJhbS0+cmVtX3BvcnQsCisJCQkJcHJvdG8sIGZsYWdzICYgTkVUU1RBVF9OVU1FUklDKTsKKwkJcHJpbnRmKEZNVF9ORVRfQ09OTl9EQVRBLAorCQkJcHJvdG8sIHBhcmFtLT5yeHEsIHBhcmFtLT50eHEsCisJCQlJRl9GRUFUVVJFX05FVFNUQVRfV0lERShHLmFkZHJfd2lkdGgsKSBsLAorCQkJSUZfRkVBVFVSRV9ORVRTVEFUX1dJREUoRy5hZGRyX3dpZHRoLCkgciwKKwkJCXN0YXRlX3N0cik7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTkVUU1RBVF9QUkcKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfcHJnKQorCQkJcHJpbnRmKCIlLiJQUk9HTkFNRV9XSURUSF9TVFIicyIsIHByZ19jYWNoZV9nZXQocGFyYW0tPmlub2RlKSk7CisjZW5kaWYKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwkJZnJlZShsKTsKKwkJZnJlZShyKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHRjcF9kb19vbmUoY2hhciAqbGluZSkKK3sKKwlzdHJ1Y3QgaW5ldF9wYXJhbXMgcGFyYW07CisKKwltZW1zZXQoJnBhcmFtLCAwLCBzaXplb2YocGFyYW0pKTsKKwlpZiAoc2Nhbl9pbmV0X3Byb2NfbGluZSgmcGFyYW0sIGxpbmUpKQorCQlyZXR1cm4gMTsKKworCXByaW50X2luZXRfbGluZSgmcGFyYW0sIHRjcF9zdGF0ZVtwYXJhbS5zdGF0ZV0sICJ0Y3AiLCBwYXJhbS5yZW1fcG9ydCk7CisJcmV0dXJuIDA7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisjIGRlZmluZSBOT1RfTlVMTF9BRERSKEEpICggXAorCSggKEEuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KSBcCisJICAmJiAoQS5zaW42LnNpbjZfYWRkci5zNl9hZGRyMzJbMF0gfCBBLnNpbjYuc2luNl9hZGRyLnM2X2FkZHIzMlsxXSB8IFwKKwkgICAgICBBLnNpbjYuc2luNl9hZGRyLnM2X2FkZHIzMlsyXSB8IEEuc2luNi5zaW42X2FkZHIuczZfYWRkcjMyWzNdKSAgXAorCSkgfHwgKCBcCisJICAoQS5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVCkgXAorCSAgJiYgQS5zaW4uc2luX2FkZHIuc19hZGRyICE9IDAgXAorCSkgXAorKQorI2Vsc2UKKyMgZGVmaW5lIE5PVF9OVUxMX0FERFIoQSkgKEEuc2luLnNpbl9hZGRyLnNfYWRkcikKKyNlbmRpZgorCitzdGF0aWMgaW50IEZBU1RfRlVOQyB1ZHBfZG9fb25lKGNoYXIgKmxpbmUpCit7CisJaW50IGhhdmVfcmVtYWRkcjsKKwljb25zdCBjaGFyICpzdGF0ZV9zdHI7CisJc3RydWN0IGluZXRfcGFyYW1zIHBhcmFtOworCisJbWVtc2V0KCZwYXJhbSwgMCwgc2l6ZW9mKHBhcmFtKSk7IC8qIG90aGVyd2lzZSB3ZSBkaXNwbGF5IGdhcmJhZ2UgSVB2NiBzY29wZV9pZHMgKi8KKwlpZiAoc2Nhbl9pbmV0X3Byb2NfbGluZSgmcGFyYW0sIGxpbmUpKQorCQlyZXR1cm4gMTsKKworCXN0YXRlX3N0ciA9ICJVTktOT1dOIjsKKwlzd2l0Y2ggKHBhcmFtLnN0YXRlKSB7CisJY2FzZSBUQ1BfRVNUQUJMSVNIRUQ6CisJCXN0YXRlX3N0ciA9ICJFU1RBQkxJU0hFRCI7CisJCWJyZWFrOworCWNhc2UgVENQX0NMT1NFOgorCQlzdGF0ZV9zdHIgPSAiIjsKKwkJYnJlYWs7CisJfQorCisJaGF2ZV9yZW1hZGRyID0gTk9UX05VTExfQUREUihwYXJhbS5yZW1hZGRyKTsKKwlwcmludF9pbmV0X2xpbmUoJnBhcmFtLCBzdGF0ZV9zdHIsICJ1ZHAiLCBoYXZlX3JlbWFkZHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyByYXdfZG9fb25lKGNoYXIgKmxpbmUpCit7CisJaW50IGhhdmVfcmVtYWRkcjsKKwlzdHJ1Y3QgaW5ldF9wYXJhbXMgcGFyYW07CisKKwlpZiAoc2Nhbl9pbmV0X3Byb2NfbGluZSgmcGFyYW0sIGxpbmUpKQorCQlyZXR1cm4gMTsKKworCWhhdmVfcmVtYWRkciA9IE5PVF9OVUxMX0FERFIocGFyYW0ucmVtYWRkcik7CisJcHJpbnRfaW5ldF9saW5lKCZwYXJhbSwgaXRvYShwYXJhbS5zdGF0ZSksICJyYXciLCBoYXZlX3JlbWFkZHIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyB1bml4X2RvX29uZShjaGFyICpsaW5lKQoreworCXVuc2lnbmVkIGxvbmcgcmVmY250LCBwcm90bywgdW5peF9mbGFnczsKKwl1bnNpZ25lZCBsb25nIGlub2RlOworCWludCB0eXBlLCBzdGF0ZTsKKwlpbnQgbnVtLCBwYXRoX29mczsKKwljb25zdCBjaGFyICpzc19wcm90bywgKnNzX3N0YXRlLCAqc3NfdHlwZTsKKwljaGFyIHNzX2ZsYWdzWzMyXTsKKworCS8qIDIuNi4xNSBtYXkgcmVwb3J0IGxpbmVzIGxpa2UgIi4uLiBAL3RtcC9mYW0tdXNlci1eQF5AXkBeQF5AXkBeQC4uLiIKKwkgKiBPdGhlciB1c2VycyByZXBvcnQgbG9uZyBsaW5lcyBmaWxsZWQgYnkgTlVMIGJ5dGVzLgorCSAqICh0aG9zZSBeQCBhcmUgTlVMIGJ5dGVzIHRvbykuIFdlIHNlZSB0aGVtIGFzIGVtcHR5IGxpbmVzLiAqLworCWlmICghbGluZVswXSkKKwkJcmV0dXJuIDA7CisKKwlwYXRoX29mcyA9IDA7IC8qIHBhcmFub2lhICovCisJbnVtID0gc3NjYW5mKGxpbmUsICIlKnA6ICVsWCAlbFggJWxYICVYICVYICVsdSAlbiIsCisJCQkmcmVmY250LCAmcHJvdG8sICZ1bml4X2ZsYWdzLCAmdHlwZSwgJnN0YXRlLCAmaW5vZGUsICZwYXRoX29mcyk7CisJaWYgKG51bSA8IDYpIHsKKwkJcmV0dXJuIDE7IC8qIGVycm9yICovCisJfQorCWlmICgoZmxhZ3MgJiAoTkVUU1RBVF9MSVNURU5JTkd8TkVUU1RBVF9DT05ORUNURUQpKSAhPSAoTkVUU1RBVF9MSVNURU5JTkd8TkVUU1RBVF9DT05ORUNURUQpKSB7CisJCWlmICgoc3RhdGUgPT0gU1NfVU5DT05ORUNURUQpICYmICh1bml4X2ZsYWdzICYgU09fQUNDRVBUQ09OKSkgeworCQkJaWYgKCEoZmxhZ3MgJiBORVRTVEFUX0xJU1RFTklORykpCisJCQkJcmV0dXJuIDA7CisJCX0gZWxzZSB7CisJCQlpZiAoIShmbGFncyAmIE5FVFNUQVRfQ09OTkVDVEVEKSkKKwkJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXN3aXRjaCAocHJvdG8pIHsKKwkJY2FzZSAwOgorCQkJc3NfcHJvdG8gPSAidW5peCI7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXNzX3Byb3RvID0gIj8/IjsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBTT0NLX1NUUkVBTToKKwkJCXNzX3R5cGUgPSAiU1RSRUFNIjsKKwkJCWJyZWFrOworCQljYXNlIFNPQ0tfREdSQU06CisJCQlzc190eXBlID0gIkRHUkFNIjsKKwkJCWJyZWFrOworCQljYXNlIFNPQ0tfUkFXOgorCQkJc3NfdHlwZSA9ICJSQVciOworCQkJYnJlYWs7CisJCWNhc2UgU09DS19SRE06CisJCQlzc190eXBlID0gIlJETSI7CisJCQlicmVhazsKKwkJY2FzZSBTT0NLX1NFUVBBQ0tFVDoKKwkJCXNzX3R5cGUgPSAiU0VRUEFDS0VUIjsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJc3NfdHlwZSA9ICJVTktOT1dOIjsKKwl9CisKKwlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgU1NfRlJFRToKKwkJCXNzX3N0YXRlID0gIkZSRUUiOworCQkJYnJlYWs7CisJCWNhc2UgU1NfVU5DT05ORUNURUQ6CisJCQkvKgorCQkJICogVW5jb25uZWN0ZWQgc29ja2V0cyBtYXkgYmUgbGlzdGVuaW5nCisJCQkgKiBmb3Igc29tZXRoaW5nLgorCQkJICovCisJCQlpZiAodW5peF9mbGFncyAmIFNPX0FDQ0VQVENPTikgeworCQkJCXNzX3N0YXRlID0gIkxJU1RFTklORyI7CisJCQl9IGVsc2UgeworCQkJCXNzX3N0YXRlID0gIiI7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBTU19DT05ORUNUSU5HOgorCQkJc3Nfc3RhdGUgPSAiQ09OTkVDVElORyI7CisJCQlicmVhazsKKwkJY2FzZSBTU19DT05ORUNURUQ6CisJCQlzc19zdGF0ZSA9ICJDT05ORUNURUQiOworCQkJYnJlYWs7CisJCWNhc2UgU1NfRElTQ09OTkVDVElORzoKKwkJCXNzX3N0YXRlID0gIkRJU0NPTk5FQ1RJTkciOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlzc19zdGF0ZSA9ICJVTktOT1dOIjsKKwl9CisKKwlzdHJjcHkoc3NfZmxhZ3MsICJbICIpOworCWlmICh1bml4X2ZsYWdzICYgU09fQUNDRVBUQ09OKQorCQlzdHJjYXQoc3NfZmxhZ3MsICJBQ0MgIik7CisJaWYgKHVuaXhfZmxhZ3MgJiBTT19XQUlUREFUQSkKKwkJc3RyY2F0KHNzX2ZsYWdzLCAiVyAiKTsKKwlpZiAodW5peF9mbGFncyAmIFNPX05PU1BBQ0UpCisJCXN0cmNhdChzc19mbGFncywgIk4gIik7CisJc3RyY2F0KHNzX2ZsYWdzLCAiXSIpOworCisJcHJpbnRmKCIlLTVzICUtNmx1ICUtMTFzICUtMTBzICUtMTNzICU2bHUgIiwKKwkJc3NfcHJvdG8sIHJlZmNudCwgc3NfZmxhZ3MsIHNzX3R5cGUsIHNzX3N0YXRlLCBpbm9kZQorCQkpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfTkVUU1RBVF9QUkcKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9wcmcpCisJCXByaW50ZigiJS0iUFJPR05BTUVfV0lEVEhfU1RSInMiLCBwcmdfY2FjaGVfZ2V0KGlub2RlKSk7CisjZW5kaWYKKworCS8qIFRPRE86IGN1cnJlbnRseSB3ZSBzdG9wIGF0IGZpcnN0IE5VTCBieXRlLiBJcyBpdCBhIHByb2JsZW0/ICovCisJbGluZSArPSBwYXRoX29mczsKKwljaG9tcChsaW5lKTsKKwl3aGlsZSAoKmxpbmUpCisJCWZwdXRjX3ByaW50YWJsZSgqbGluZSsrLCBzdGRvdXQpOworCWJiX3B1dGNoYXIoJ1xuJyk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2luZm8oY29uc3QgY2hhciAqZmlsZSwgaW50IEZBU1RfRlVOQyAoKnByb2MpKGNoYXIgKikpCit7CisJaW50IGxucjsKKwlGSUxFICpwcm9jaW5mbzsKKwljaGFyICpidWZmZXI7CisKKwkvKiBfc3RkaW4gaXMganVzdCB0byBzYXZlICJyIiBwYXJhbSAqLworCXByb2NpbmZvID0gZm9wZW5fb3Jfd2Fybl9zdGRpbihmaWxlKTsKKwlpZiAocHJvY2luZm8gPT0gTlVMTCkgeworCQlyZXR1cm47CisJfQorCWxuciA9IDA7CisJLyogV2h5IHhtYWxsb2NfZmdldHNfc3RyPyBiZWNhdXNlIGl0IGRvZXNuJ3Qgc3RvcCBvbiBOVUxzICovCisJd2hpbGUgKChidWZmZXIgPSB4bWFsbG9jX2ZnZXRzX3N0cihwcm9jaW5mbywgIlxuIikpICE9IE5VTEwpIHsKKwkJLyogbGluZSAwIGlzIHNraXBwZWQgKi8KKwkJaWYgKGxuciAmJiBwcm9jKGJ1ZmZlcikpCisJCQliYl9lcnJvcl9tc2coIiVzOiBib2d1cyBkYXRhIG9uIGxpbmUgJWQiLCBmaWxlLCBsbnIgKyAxKTsKKwkJbG5yKys7CisJCWZyZWUoYnVmZmVyKTsKKwl9CisJZmNsb3NlKHByb2NpbmZvKTsKK30KKworaW50IG5ldHN0YXRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG5ldHN0YXRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIG9wdDsKKworCUlOSVRfRygpOworCisJLyogT3B0aW9uIHN0cmluZyBtdXN0IG1hdGNoIE5FVFNUQVRfeHh4IGNvbnN0YW50cyAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsIE5FVFNUQVRfT1BUUyk7CisJaWYgKG9wdCAmIE9QVF9zb2NrX2xpc3RlbikgeyAvLyAtbAorCQlmbGFncyAmPSB+TkVUU1RBVF9DT05ORUNURUQ7CisJCWZsYWdzIHw9IE5FVFNUQVRfTElTVEVOSU5HOworCX0KKwlpZiAob3B0ICYgT1BUX3NvY2tfYWxsKSBmbGFncyB8PSBORVRTVEFUX0xJU1RFTklORyB8IE5FVFNUQVRfQ09OTkVDVEVEOyAvLyAtYQorCS8vaWYgKG9wdCAmIE9QVF9leHRlbmRlZCkgLy8gLWUKKwlpZiAob3B0ICYgT1BUX25vcmVzb2x2ZSkgZmxhZ3MgfD0gTkVUU1RBVF9OVU1FUklDOyAvLyAtbgorCS8vaWYgKG9wdCAmIE9QVF9zb2NrX3RjcCkgLy8gLXQ6IE5FVFNUQVRfVENQCisJLy9pZiAob3B0ICYgT1BUX3NvY2tfdWRwKSAvLyAtdTogTkVUU1RBVF9VRFAKKwkvL2lmIChvcHQgJiBPUFRfc29ja19yYXcpIC8vIC13OiBORVRTVEFUX1JBVworCS8vaWYgKG9wdCAmIE9QVF9zb2NrX3VuaXgpIC8vIC14OiBORVRTVEFUX1VOSVgKKyNpZiBFTkFCTEVfUk9VVEUKKwlpZiAob3B0ICYgT1BUX3JvdXRlKSB7IC8vIC1yCisJCWJiX2Rpc3BsYXlyb3V0ZXMoZmxhZ3MgJiBORVRTVEFUX05VTUVSSUMsICEob3B0ICYgT1BUX2V4dGVuZGVkKSk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX05FVFNUQVRfV0lERQorCUcuYWRkcl93aWR0aCA9IEFERFJfTk9STUFMX1dJRFRIOworCWlmIChvcHQgJiBPUFRfd2lkZSkgeyAvLyAtVworCQlHLmFkZHJfd2lkdGggPSBBRERSX1dJREU7CisJfQorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfTkVUU1RBVF9QUkcKKwlwcm9nbmFtZV9iYW5uZXIgPSAiIjsKKwlpZiAob3B0ICYgT1BUX3ByZykgeyAvLyAtcAorCQlwcm9nbmFtZV9iYW5uZXIgPSBQUk9HTkFNRV9CQU5ORVI7CisJCXByZ19jYWNoZV9sb2FkKCk7CisJfQorI2VuZGlmCisKKwlvcHQgJj0gTkVUU1RBVF9BTExQUk9UTzsKKwlpZiAob3B0KSB7CisJCWZsYWdzICY9IH5ORVRTVEFUX0FMTFBST1RPOworCQlmbGFncyB8PSBvcHQ7CisJfQorCWlmIChmbGFncyAmIChORVRTVEFUX1RDUHxORVRTVEFUX1VEUHxORVRTVEFUX1JBVykpIHsKKwkJcHJpbnRmKCJBY3RpdmUgSW50ZXJuZXQgY29ubmVjdGlvbnMgIik7IC8qIHh4eCAqLworCisJCWlmICgoZmxhZ3MgJiAoTkVUU1RBVF9MSVNURU5JTkd8TkVUU1RBVF9DT05ORUNURUQpKSA9PSAoTkVUU1RBVF9MSVNURU5JTkd8TkVUU1RBVF9DT05ORUNURUQpKQorCQkJcHJpbnRmKCIoc2VydmVycyBhbmQgZXN0YWJsaXNoZWQpIik7CisJCWVsc2UgaWYgKGZsYWdzICYgTkVUU1RBVF9MSVNURU5JTkcpCisJCQlwcmludGYoIihvbmx5IHNlcnZlcnMpIik7CisJCWVsc2UKKwkJCXByaW50ZigiKHcvbyBzZXJ2ZXJzKSIpOworCQlwcmludGYoRk1UX05FVF9DT05OX0hFQURFUiwKKwkJCQlJRl9GRUFUVVJFX05FVFNUQVRfV0lERShHLmFkZHJfd2lkdGgsKSAiTG9jYWwgQWRkcmVzcyIsCisJCQkJSUZfRkVBVFVSRV9ORVRTVEFUX1dJREUoRy5hZGRyX3dpZHRoLCkgIkZvcmVpZ24gQWRkcmVzcyIsCisJCQkJcHJvZ25hbWVfYmFubmVyCisJCSk7CisJfQorCWlmIChmbGFncyAmIE5FVFNUQVRfVENQKSB7CisJCWRvX2luZm8oIi9wcm9jL25ldC90Y3AiLCB0Y3BfZG9fb25lKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJCWRvX2luZm8oIi9wcm9jL25ldC90Y3A2IiwgdGNwX2RvX29uZSk7CisjZW5kaWYKKwl9CisJaWYgKGZsYWdzICYgTkVUU1RBVF9VRFApIHsKKwkJZG9faW5mbygiL3Byb2MvbmV0L3VkcCIsIHVkcF9kb19vbmUpOworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkJZG9faW5mbygiL3Byb2MvbmV0L3VkcDYiLCB1ZHBfZG9fb25lKTsKKyNlbmRpZgorCX0KKwlpZiAoZmxhZ3MgJiBORVRTVEFUX1JBVykgeworCQlkb19pbmZvKCIvcHJvYy9uZXQvcmF3IiwgcmF3X2RvX29uZSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCQlkb19pbmZvKCIvcHJvYy9uZXQvcmF3NiIsIHJhd19kb19vbmUpOworI2VuZGlmCisJfQorCWlmIChmbGFncyAmIE5FVFNUQVRfVU5JWCkgeworCQlwcmludGYoIkFjdGl2ZSBVTklYIGRvbWFpbiBzb2NrZXRzICIpOworCQlpZiAoKGZsYWdzICYgKE5FVFNUQVRfTElTVEVOSU5HfE5FVFNUQVRfQ09OTkVDVEVEKSkgPT0gKE5FVFNUQVRfTElTVEVOSU5HfE5FVFNUQVRfQ09OTkVDVEVEKSkKKwkJCXByaW50ZigiKHNlcnZlcnMgYW5kIGVzdGFibGlzaGVkKSIpOworCQllbHNlIGlmIChmbGFncyAmIE5FVFNUQVRfTElTVEVOSU5HKQorCQkJcHJpbnRmKCIob25seSBzZXJ2ZXJzKSIpOworCQllbHNlCisJCQlwcmludGYoIih3L28gc2VydmVycykiKTsKKwkJcHJpbnRmKCJcblByb3RvIFJlZkNudCBGbGFncyAgICAgICBUeXBlICAgICAgIFN0YXRlICAgICAgICAgSS1Ob2RlICVzUGF0aFxuIiwgcHJvZ25hbWVfYmFubmVyKTsKKwkJZG9faW5mbygiL3Byb2MvbmV0L3VuaXgiLCB1bml4X2RvX29uZSk7CisJfQorCXByZ19jYWNoZV9jbGVhcigpOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9uc2xvb2t1cC5jIGIvbmV0d29ya2luZy9uc2xvb2t1cC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNGIxZmYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL25zbG9va3VwLmMKQEAgLTAsMCArMSwyMDAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgbnNsb29rdXAgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTksMjAwMCBieSBMaW5lbywgaW5jLiBhbmQgSm9obiBCZXBwdQorICogQ29weXJpZ2h0IChDKSAxOTk5LDIwMDAsMjAwMSBieSBKb2huIEJlcHB1IDxiZXBwdUBjb2RlcG9ldC5vcmc+CisgKgorICogQ29ycmVjdCBkZWZhdWx0IG5hbWUgc2VydmVyIGRpc3BsYXkgYW5kIGV4cGxpY2l0IG5hbWUgc2VydmVyIG9wdGlvbgorICogYWRkZWQgYnkgQmVuIFplY2tlbCA8YnplY2tlbEBobWMuZWR1PiBKdW5lIDIwMDEKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBuc2xvb2t1cF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW0hPU1RdIFtTRVJWRVJdIgorLy91c2FnZTojZGVmaW5lIG5zbG9va3VwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUXVlcnkgdGhlIG5hbWVzZXJ2ZXIgZm9yIHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBnaXZlbiBIT1NUXG4iCisvL3VzYWdlOiAgICAgICAib3B0aW9uYWxseSB1c2luZyBhIHNwZWNpZmllZCBETlMgc2VydmVyIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBuc2xvb2t1cF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBuc2xvb2t1cCBsb2NhbGhvc3RcbiIKKy8vdXNhZ2U6ICAgICAgICJTZXJ2ZXI6ICAgICBkZWZhdWx0XG4iCisvL3VzYWdlOiAgICAgICAiQWRkcmVzczogICAgZGVmYXVsdFxuIgorLy91c2FnZTogICAgICAgIlxuIgorLy91c2FnZTogICAgICAgIk5hbWU6ICAgICAgIGRlYmlhblxuIgorLy91c2FnZTogICAgICAgIkFkZHJlc3M6ICAgIDEyNy4wLjAuMVxuIgorCisjaW5jbHVkZSA8cmVzb2x2Lmg+CisjaW5jbHVkZSAibGliYmIuaCIKKworLyoKKyAqIEknbSBvbmx5IGltcGxlbWVudGluZyBub24taW50ZXJhY3RpdmUgbW9kZTsKKyAqIEkgdG90YWxseSBmb3Jnb3QgbnNsb29rdXAgZXZlbiBoYWQgYW4gaW50ZXJhY3RpdmUgbW9kZS4KKyAqCisgKiBUaGlzIGFwcGxldCBpcyB0aGUgb25seSB1c2VyIG9mIHJlc19pbml0KCkuIFdpdGhvdXQgaXQsCisgKiB5b3UgbWF5IGF2b2lkIHB1bGxpbmcgaW4gX3JlcyBnbG9iYWwgZnJvbSBsaWJjLgorICovCisKKy8qIEV4YW1wbGVzIG9mICdzdGFuZGFyZCcgbnNsb29rdXAgb3V0cHV0CisgKiAkIG5zbG9va3VwIHlhaG9vLmNvbQorICogU2VydmVyOiAgICAgICAgIDEyOC4xOTMuMC4xMAorICogQWRkcmVzczogICAgICAgIDEyOC4xOTMuMC4xMCM1MworICoKKyAqIE5vbi1hdXRob3JpdGF0aXZlIGFuc3dlcjoKKyAqIE5hbWU6ICAgeWFob28uY29tCisgKiBBZGRyZXNzOiAyMTYuMTA5LjExMi4xMzUKKyAqIE5hbWU6ICAgeWFob28uY29tCisgKiBBZGRyZXNzOiA2Ni45NC4yMzQuMTMKKyAqCisgKiAkIG5zbG9va3VwIDIwNC4xNTIuMTkxLjM3CisgKiBTZXJ2ZXI6ICAgICAgICAgMTI4LjE5My40LjIwCisgKiBBZGRyZXNzOiAgICAgICAgMTI4LjE5My40LjIwIzUzCisgKgorICogTm9uLWF1dGhvcml0YXRpdmUgYW5zd2VyOgorICogMzcuMTkxLjE1Mi4yMDQuaW4tYWRkci5hcnBhICAgICBjYW5vbmljYWwgbmFtZSA9IDM3LjMyLTI3LjE5MS4xNTIuMjA0LmluLWFkZHIuYXJwYS4KKyAqIDM3LjMyLTI3LjE5MS4xNTIuMjA0LmluLWFkZHIuYXJwYSAgICAgICBuYW1lID0gemV1cy1wdWIyLmtlcm5lbC5vcmcuCisgKgorICogQXV0aG9yaXRhdGl2ZSBhbnN3ZXJzIGNhbiBiZSBmb3VuZCBmcm9tOgorICogMzItMjcuMTkxLjE1Mi4yMDQuaW4tYWRkci5hcnBhICBuYW1lc2VydmVyID0gbnMxLmtlcm5lbC5vcmcuCisgKiAzMi0yNy4xOTEuMTUyLjIwNC5pbi1hZGRyLmFycGEgIG5hbWVzZXJ2ZXIgPSBuczIua2VybmVsLm9yZy4KKyAqIDMyLTI3LjE5MS4xNTIuMjA0LmluLWFkZHIuYXJwYSAgbmFtZXNlcnZlciA9IG5zMy5rZXJuZWwub3JnLgorICogbnMxLmtlcm5lbC5vcmcgIGludGVybmV0IGFkZHJlc3MgPSAxNDAuMjExLjE2Ny4zNAorICogbnMyLmtlcm5lbC5vcmcgIGludGVybmV0IGFkZHJlc3MgPSAyMDQuMTUyLjE5MS40CisgKiBuczMua2VybmVsLm9yZyAgaW50ZXJuZXQgYWRkcmVzcyA9IDIwNC4xNTIuMTkxLjM2CisgKi8KKworc3RhdGljIGludCBwcmludF9ob3N0KGNvbnN0IGNoYXIgKmhvc3RuYW1lLCBjb25zdCBjaGFyICpoZWFkZXIpCit7CisJLyogV2UgY2FuJ3QgdXNlIHhob3N0MnNvY2thZGRyKCkgLSB3ZSB3YW50IHRvIGdldCBBTEwgYWRkcmVzc2VzLAorCSAqIG5vdCBqdXN0IG9uZSAqLworCXN0cnVjdCBhZGRyaW5mbyAqcmVzdWx0ID0gTlVMTDsKKwlpbnQgcmM7CisJc3RydWN0IGFkZHJpbmZvIGhpbnQ7CisKKwltZW1zZXQoJmhpbnQsIDAgLCBzaXplb2YoaGludCkpOworCS8qIGhpbnQuYWlfZmFtaWx5ID0gQUZfVU5TUEVDOyAtIHplcm8gYW55d2F5ICovCisJLyogTmVlZGVkLiBPciBlbHNlIHdlIHdpbGwgZ2V0IGVhY2ggYWRkcmVzcyB0aHJpY2UgKG9yIG1vcmUpCisJICogZm9yIGVhY2ggcG9zc2libGUgc29ja2V0IHR5cGUgKHRjcCx1ZHAscmF3Li4uKTogKi8KKwloaW50LmFpX3NvY2t0eXBlID0gU09DS19TVFJFQU07CisJLy8gaGludC5haV9mbGFncyA9IEFJX0NBTk9OTkFNRTsKKwlyYyA9IGdldGFkZHJpbmZvKGhvc3RuYW1lLCBOVUxMIC8qc2VydmljZSovLCAmaGludCwgJnJlc3VsdCk7CisKKwlpZiAocmMgPT0gMCkgeworCQlzdHJ1Y3QgYWRkcmluZm8gKmN1ciA9IHJlc3VsdDsKKwkJdW5zaWduZWQgY250ID0gMDsKKworCQlwcmludGYoIiUtMTBzICVzXG4iLCBoZWFkZXIsIGhvc3RuYW1lKTsKKwkJLy8gcHV0cyhjdXItPmFpX2Nhbm9ubmFtZSk7ID8KKwkJd2hpbGUgKGN1cikgeworCQkJY2hhciAqZG90dGVkLCAqcmV2aG9zdDsKKwkJCWRvdHRlZCA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkX25vcG9ydChjdXItPmFpX2FkZHIpOworCQkJcmV2aG9zdCA9IHhtYWxsb2Nfc29ja2FkZHIyaG9zdG9ubHlfbm9wb3J0KGN1ci0+YWlfYWRkcik7CisKKwkJCXByaW50ZigiQWRkcmVzcyAldTogJXMlYyIsICsrY250LCBkb3R0ZWQsIHJldmhvc3QgPyAnICcgOiAnXG4nKTsKKwkJCWlmIChyZXZob3N0KSB7CisJCQkJcHV0cyhyZXZob3N0KTsKKwkJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJCWZyZWUocmV2aG9zdCk7CisJCQl9CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJZnJlZShkb3R0ZWQpOworCQkJY3VyID0gY3VyLT5haV9uZXh0OworCQl9CisJfSBlbHNlIHsKKyNpZiBFTkFCTEVfVkVSQk9TRV9SRVNPTFVUSU9OX0VSUk9SUworCQliYl9lcnJvcl9tc2coImNhbid0IHJlc29sdmUgJyVzJzogJXMiLCBob3N0bmFtZSwgZ2FpX3N0cmVycm9yKHJjKSk7CisjZWxzZQorCQliYl9lcnJvcl9tc2coImNhbid0IHJlc29sdmUgJyVzJyIsIGhvc3RuYW1lKTsKKyNlbmRpZgorCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAgJiYgcmVzdWx0KQorCQlmcmVlYWRkcmluZm8ocmVzdWx0KTsKKwlyZXR1cm4gKHJjICE9IDApOworfQorCisvKiBsb29rdXAgdGhlIGRlZmF1bHQgbmFtZXNlcnZlciBhbmQgZGlzcGxheSBpdCAqLworc3RhdGljIHZvaWQgc2VydmVyX3ByaW50KHZvaWQpCit7CisJY2hhciAqc2VydmVyOworCXN0cnVjdCBzb2NrYWRkciAqc2E7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJc2EgPSAoc3RydWN0IHNvY2thZGRyKilfcmVzLl91Ll9leHQubnNhZGRyc1swXTsKKwlpZiAoIXNhKQorI2VuZGlmCisJCXNhID0gKHN0cnVjdCBzb2NrYWRkciopJl9yZXMubnNhZGRyX2xpc3RbMF07CisJc2VydmVyID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWRfbm9wb3J0KHNhKTsKKworCXByaW50X2hvc3Qoc2VydmVyLCAiU2VydmVyOiIpOworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZShzZXJ2ZXIpOworCWJiX3B1dGNoYXIoJ1xuJyk7Cit9CisKKy8qIGFsdGVyIHRoZSBnbG9iYWwgX3JlcyBuYW1lc2VydmVyIHN0cnVjdHVyZSB0byB1c2UKKyAgIGFuIGV4cGxpY2l0IGRucyBzZXJ2ZXIgaW5zdGVhZCBvZiB3aGF0IGlzIGluIC9ldGMvcmVzb2x2LmNvbmYgKi8KK3N0YXRpYyB2b2lkIHNldF9kZWZhdWx0X2Rucyhjb25zdCBjaGFyICpzZXJ2ZXIpCit7CisJbGVuX2FuZF9zb2NrYWRkciAqbHNhOworCisJaWYgKCFzZXJ2ZXIpCisJCXJldHVybjsKKworCS8qIE5COiB0aGlzIHdvcmtzIGV2ZW4gd2l0aCwgc2F5LCAiWzo6MV06NTM1MyIhIDopICovCisJbHNhID0geGhvc3Qyc29ja2FkZHIoc2VydmVyLCA1Myk7CisKKwlpZiAobHNhLT51LnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUKSB7CisJCV9yZXMubnNjb3VudCA9IDE7CisJCS8qIHN0cnVjdCBjb3B5ICovCisJCV9yZXMubnNhZGRyX2xpc3RbMF0gPSBsc2EtPnUuc2luOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJLyogSG9wZWQgbGliYyBjYW4gY29wZSB3aXRoIElQdjQgYWRkcmVzcyB0aGVyZSB0b28uCisJICogTm8gc3VjaCBsdWNrLCBnbGliYyAyLjQgc2VnZmF1bHRzIGV2ZW4gd2l0aCBJUHY2LAorCSAqIG1heWJlIEkgbWlzdW5kZXJzdGFuZCBob3cgdG8gbWFrZSBnbGliYyB1c2UgSVB2NiBhZGRyPworCSAqICh1Y2xpYmMgMC45LjMxKyBzaG91bGQgd29yaykgKi8KKwlpZiAobHNhLT51LnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQkvLyBnbGliYyBuZWl0aGVyIFNFR1ZzIG5vciBzZW5kcyBhbnkgZGdyYW1zIHdpdGggdGhpcworCQkvLyAoc3RyYWNlIHNob3dzIG5vIHNvY2tldCBvcHMpOgorCQkvL19yZXMubnNjb3VudCA9IDA7CisJCV9yZXMuX3UuX2V4dC5uc2NvdW50ID0gMTsKKwkJLyogc3RvcmUgYSBwb2ludGVyIHRvIHBhcnQgb2YgbWFsbG9jJ2VkIGxzYSAqLworCQlfcmVzLl91Ll9leHQubnNhZGRyc1swXSA9ICZsc2EtPnUuc2luNjsKKwkJLyogbXVzdCBub3QgZnJlZShsc2EpISAqLworCX0KKyNlbmRpZgorfQorCitpbnQgbnNsb29rdXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG5zbG9va3VwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCS8qIFdlIGFsbG93IDEgb3IgMiBhcmd1bWVudHMuCisJICogVGhlIGZpcnN0IGlzIHRoZSBuYW1lIHRvIGJlIGxvb2tlZCB1cCBhbmQgdGhlIHNlY29uZCBpcyBhbgorCSAqIG9wdGlvbmFsIEROUyBzZXJ2ZXIgd2l0aCB3aGljaCB0byBkbyB0aGUgbG9va3VwLgorCSAqIE1vcmUgdGhhbiAzIGFyZ3VtZW50cyBpcyBhbiBlcnJvciB0byBmb2xsb3cgdGhlIHBhdHRlcm4gb2YgdGhlCisJICogc3RhbmRhcmQgbnNsb29rdXAgKi8KKwlpZiAoIWFyZ3ZbMV0gfHwgYXJndlsxXVswXSA9PSAnLScgfHwgYXJnYyA+IDMpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCS8qIGluaXRpYWxpemUgRE5TIHN0cnVjdHVyZSBfcmVzIHVzZWQgaW4gcHJpbnRpbmcgdGhlIGRlZmF1bHQKKwkgKiBuYW1lIHNlcnZlciBhbmQgaW4gdGhlIGV4cGxpY2l0IG5hbWUgc2VydmVyIG9wdGlvbiBmZWF0dXJlLiAqLworCXJlc19pbml0KCk7CisJLyogcmZjMjEzMyBzYXlzIHRoaXMgZW5hYmxlcyBJUHY2IGxvb2t1cHMgKi8KKwkvKiAoYnV0IGl0IGFsc28gc2F5cyAibWF5IGJlIGVuYWJsZWQgaW4gL2V0Yy9yZXNvbHYuY29uZiIpICovCisJLypfcmVzLm9wdGlvbnMgfD0gUkVTX1VTRV9JTkVUNjsqLworCisJc2V0X2RlZmF1bHRfZG5zKGFyZ3ZbMl0pOworCisJc2VydmVyX3ByaW50KCk7CisKKwkvKiBnZXRhZGRyaW5mbyBhbmQgZnJpZW5kcyBhcmUgZnJlZSB0byByZXF1ZXN0IGEgcmVzb2x2ZXIKKwkgKiByZWluaXRpYWxpemF0aW9uLiBKdXN0IGluIGNhc2UsIHNldF9kZWZhdWx0X2RucygpIGFnYWluCisJICogYWZ0ZXIgZ2V0YWRkcmluZm8gKGluIHNlcnZlcl9wcmludCkuIFRoaXMgcmVwb3J0ZWRseSBoZWxwcworCSAqIHdpdGggYnVnIDY3NSAibnNsb29rdXAgZG9lcyBub3QgcHJvcGVybHkgdXNlIHNlY29uZCBhcmd1bWVudCIKKwkgKiBhdCBsZWFzdCBvbiBEZWJpYW4gV2hlZXp5IGFuZCBPcGVud3J0IEFBIChlZ2xpYmMgYmFzZWQpLgorCSAqLworCXNldF9kZWZhdWx0X2Rucyhhcmd2WzJdKTsKKworCXJldHVybiBwcmludF9ob3N0KGFyZ3ZbMV0sICJOYW1lOiIpOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9udHBkLmMgYi9uZXR3b3JraW5nL250cGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzMyYzliCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9udHBkLmMKQEAgLTAsMCArMSwyNTc3IEBACisvKgorICogTlRQIGNsaWVudC9zZXJ2ZXIsIGJhc2VkIG9uIE9wZW5OVFBEIDMuOXAxCisgKgorICogQnVzeWJveCBwb3J0IGF1dGhvcjogQWRhbSBUa2FjIChDKSAyMDA5IDx2b25zY2hAZ21haWwuY29tPgorICoKKyAqIE9wZW5OVFBkIDMuOXAxIGNvcHlyaWdodCBob2xkZXJzOgorICogICBDb3B5cmlnaHQgKGMpIDIwMDMsIDIwMDQgSGVubmluZyBCcmF1ZXIgPGhlbm5pbmdAb3BlbmJzZC5vcmc+CisgKiAgIENvcHlyaWdodCAoYykgMjAwNCBBbGV4YW5kZXIgR3V5IDxhbGV4YW5kZXIuZ3V5QGFuZGVybi5vcmc+CisgKgorICogT3Blbk5UUGQgY29kZSBpcyBsaWNlbnNlZCB1bmRlciBJU0Mtc3R5bGUgbGljZW5jZToKKyAqCisgKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgcHJvdmlkZWQgdGhhdCB0aGUgYWJvdmUKKyAqIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTCisgKiBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GCisgKiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUgorICogQU5ZIFNQRUNJQUwsIERJUkVDVCwgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUworICogV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIE1JTkQsIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSCisgKiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1IgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HCisgKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBVU0UgT1IgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIFBhcnRzIG9mIE9wZW5OVFBEIGNsb2NrIHN5bmNyb25pemF0aW9uIGNvZGUgaXMgcmVwbGFjZWQgYnkKKyAqIGNvZGUgd2hpY2ggaXMgYmFzZWQgb24gbnRwLTQuMi42LCB3aGljaCBjYXJyaWVzIHRoZSBmb2xsb3dpbmcKKyAqIGNvcHlyaWdodCBub3RpY2U6CisgKgorICogQ29weXJpZ2h0IChjKSBVbml2ZXJzaXR5IG9mIERlbGF3YXJlIDE5OTItMjAwOQorICoKKyAqIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZCBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgYW5kCisgKiBpdHMgZG9jdW1lbnRhdGlvbiBmb3IgYW55IHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkKKyAqIGdyYW50ZWQsIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFycyBpbiBhbGwKKyAqIGNvcGllcyBhbmQgdGhhdCBib3RoIHRoZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24KKyAqIG5vdGljZSBhcHBlYXIgaW4gc3VwcG9ydGluZyBkb2N1bWVudGF0aW9uLCBhbmQgdGhhdCB0aGUgbmFtZQorICogVW5pdmVyc2l0eSBvZiBEZWxhd2FyZSBub3QgYmUgdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkKKyAqIHBlcnRhaW5pbmcgdG8gZGlzdHJpYnV0aW9uIG9mIHRoZSBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljLAorICogd3JpdHRlbiBwcmlvciBwZXJtaXNzaW9uLiBUaGUgVW5pdmVyc2l0eSBvZiBEZWxhd2FyZSBtYWtlcyBubworICogcmVwcmVzZW50YXRpb25zIGFib3V0IHRoZSBzdWl0YWJpbGl0eSB0aGlzIHNvZnR3YXJlIGZvciBhbnkKKyAqIHB1cnBvc2UuIEl0IGlzIHByb3ZpZGVkICJhcyBpcyIgd2l0aG91dCBleHByZXNzIG9yIGltcGxpZWQgd2FycmFudHkuCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbnRwZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiWy1kbnFOdyJJRl9GRUFUVVJFX05UUERfU0VSVkVSKCJsIC1JIElGQUNFIikiXSBbLVMgUFJPR10gWy1wIFBFRVJdLi4uIgorLy91c2FnZTojZGVmaW5lIG50cGRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJOVFAgY2xpZW50L3NlcnZlclxuIgorLy91c2FnZTogICAgICJcbgktZAlWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktbglEbyBub3QgZGFlbW9uaXplIgorLy91c2FnZTogICAgICJcbgktcQlRdWl0IGFmdGVyIGNsb2NrIGlzIHNldCIKKy8vdXNhZ2U6ICAgICAiXG4JLU4JUnVuIGF0IGhpZ2ggcHJpb3JpdHkiCisvL3VzYWdlOiAgICAgIlxuCS13CURvIG5vdCBzZXQgdGltZSAob25seSBxdWVyeSBwZWVycyksIGltcGxpZXMgLW4iCisvL3VzYWdlOiAgICAgIlxuCS1TIFBST0cJUnVuIFBST0cgYWZ0ZXIgc3RlcHBpbmcgdGltZSwgc3RyYXR1bSBjaGFuZ2UsIGFuZCBldmVyeSAxMSBtaW5zIgorLy91c2FnZTogICAgICJcbgktcCBQRUVSCU9idGFpbiB0aW1lIGZyb20gUEVFUiAobWF5IGJlIHJlcGVhdGVkKSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTlRQRF9DT05GKAorLy91c2FnZTogICAgICJcbgkJSWYgLXAgaXMgbm90IGdpdmVuLCAnc2VydmVyIEhPU1QnIGxpbmVzIgorLy91c2FnZTogICAgICJcbgkJZnJvbSAvZXRjL250cC5jb25mIGFyZSB1c2VkIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9OVFBEX1NFUlZFUigKKy8vdXNhZ2U6ICAgICAiXG4JLWwJQWxzbyBydW4gYXMgc2VydmVyIG9uIHBvcnQgMTIzIgorLy91c2FnZTogICAgICJcbgktSSBJRkFDRSBCaW5kIHNlcnZlciB0byBJRkFDRSwgaW1wbGllcyAtbCIKKy8vdXNhZ2U6CSkKKworLy8gLWwgYW5kIC1wIG9wdGlvbnMgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggInN0YW5kYXJkIiBudHBkOgorLy8gaXQgaGFzIHRoZW0gYXMgIi1sIGxvZ2ZpbGUiIGFuZCAiLXAgcGlkZmlsZSIuCisvLyAtUyBhbmQgLXcgYXJlIG5vdCBjb21wYXQgZWl0aGVyLCAic3RhbmRhcmQiIG50cGQgaGFzIG5vIHN1Y2ggb3B0cy4KKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4gLyogRm9yIElQVE9TX0xPV0RFTEFZIGRlZmluaXRpb24gKi8KKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4gLyogc2V0cHJpb3JpdHkgKi8KKyNpbmNsdWRlIDxzeXMvdGltZXguaD4KKyNpZm5kZWYgSVBUT1NfTE9XREVMQVkKKyMgZGVmaW5lIElQVE9TX0xPV0RFTEFZIDB4MTAKKyNlbmRpZgorCisKKy8qIFZlcmJvc2l0eSBjb250cm9sIChtYXggbGV2ZWwgb2YgLWRkZGQgb3B0aW9ucyBhY2NlcHRlZCkuCisgKiBtYXggNiBpcyB2ZXJ5IHRhbGthdGl2ZSAoYW5kIGJsb2F0ZWQpLiAzIGlzIG5vbi1ibG9hdGVkLAorICogcHJvZHVjdGlvbiBsZXZlbCBzZXR0aW5nLgorICovCisjZGVmaW5lIE1BWF9WRVJCT1NFICAgICAzCisKKworLyogSGlnaC1sZXZlbCBkZXNjcmlwdGlvbiBvZiB0aGUgYWxnb3JpdGhtOgorICoKKyAqIFdlIHN0YXJ0IHJ1bm5pbmcgd2l0aCB2ZXJ5IHNtYWxsIHBvbGxfZXhwLCBCVVJTVFBPTEwsCisgKiBpbiBvcmRlciB0byBxdWlja2x5IGFjY3VtdWxhdGUgSU5JVElBTF9TQU1QTEVTIGRhdGFwb2ludHMKKyAqIGZvciBlYWNoIHBlZXIuIFRoZW4sIHRpbWUgaXMgc3RlcHBlZCBpZiB0aGUgb2Zmc2V0IGlzIGxhcmdlcgorICogdGhhbiBTVEVQX1RIUkVTSE9MRCwgb3RoZXJ3aXNlIGl0IGlzbid0OyBhbnl3YXksIHdlIGVubGFyZ2UKKyAqIHBvbGxfZXhwIHRvIE1JTlBPTEwgYW5kIGVudGVyIGZyZXF1ZW5jeSBtZWFzdXJlbWVudCBzdGVwOgorICogd2UgY29sbGVjdCBuZXcgZGF0YXBvaW50cyBidXQgaWdub3JlIHRoZW0gZm9yIFdBVENIX1RIUkVTSE9MRAorICogc2Vjb25kcy4gQWZ0ZXIgV0FUQ0hfVEhSRVNIT0xEIHNlY29uZHMgd2UgbG9vayBhdCBhY2N1bXVsYXRlZAorICogb2Zmc2V0IGFuZCBlc3RpbWF0ZSBmcmVxdWVuY3kgZHJpZnQuCisgKgorICogKGZyZXF1ZW5jeSBtZWFzdXJlbWVudCBzdGVwIHNlZW1zIHRvIG5vdCBiZSBzdHJpY3RseSBuZWVkZWQsCisgKiBpdCBpcyBjb25kaXRpb25hbGx5IGRpc2FibGVkIHdpdGggVVNJTkdfSU5JVElBTF9GUkVRX0VTVElNQVRJT04KKyAqIGRlZmluZSBzZXQgdG8gMCkKKyAqCisgKiBBZnRlciB0aGlzLCB3ZSBlbnRlciAic3RlYWR5IHN0YXRlIjogd2UgY29sbGVjdCBhIGRhdGFwb2ludCwKKyAqIHdlIHNlbGVjdCB0aGUgYmVzdCBwZWVyLCBpZiB0aGlzIGRhdGFwb2ludCBpcyBub3QgYSBuZXcgb25lCisgKiAoSU9XOiBpZiB0aGlzIGRhdGFwb2ludCBpc24ndCBmb3Igc2VsZWN0ZWQgcGVlciksIHNsZWVwCisgKiBhbmQgY29sbGVjdCBhbm90aGVyIG9uZTsgb3RoZXJ3aXNlLCB1c2UgaXRzIG9mZnNldCB0byB1cGRhdGUKKyAqIGZyZXF1ZW5jeSBkcmlmdCwgaWYgb2Zmc2V0IGlzIHNvbWV3aGF0IGxhcmdlLCByZWR1Y2UgcG9sbF9leHAsCisgKiBvdGhlcndpc2UgaW5jcmVhc2UgcG9sbF9leHAuCisgKgorICogSWYgb2Zmc2V0IGlzIGxhcmdlciB0aGFuIFNURVBfVEhSRVNIT0xELCB3aGljaCBzaG91bGRuJ3Qgbm9ybWFsbHkKKyAqIGhhcHBlbiwgd2UgYXNzdW1lIHRoYXQgc29tZXRoaW5nICJiYWQiIGhhcHBlbmVkIChjb21wdXRlcgorICogd2FzIGhpYmVybmF0ZWQsIHNvbWVvbmUgc2V0IHRvdGFsbHkgd3JvbmcgZGF0ZSwgZXRjKSwKKyAqIHRoZW4gdGhlIHRpbWUgaXMgc3RlcHBlZCwgYWxsIGRhdGFwb2ludHMgYXJlIGRpc2NhcmRlZCwKKyAqIGFuZCB3ZSBnbyBiYWNrIHRvIHN0ZWFkeSBzdGF0ZS4KKyAqCisgKiBNYWRlIHNvbWUgY2hhbmdlcyB0byBzcGVlZCB1cCByZS1zeW5jaW5nIGFmdGVyIG91ciBjbG9jayBnb2VzIGJhZAorICogKHRlc3RlZCB3aXRoIHN1c3BlbmRpbmcgbXkgbGFwdG9wKToKKyAqIC0gaWYgbGFyZ2lzaCBvZmZzZXQgKD49IFNURVBfVEhSRVNIT0xEICogOCA9PSAxIHNlYykgaXMgc2VlbgorICogICBmcm9tIGEgcGVlciwgc2NoZWR1bGUgbmV4dCBxdWVyeSBmb3IgdGhpcyBwZWVyIHNvb24KKyAqICAgd2l0aG91dCBkcmFzdGljYWxseSBsb3dlcmluZyBwb2xsIGludGVydmFsIGZvciBldmVyeWJvZHkuCisgKiAgIFRoaXMgbWFrZXMgdXMgY29sbGVjdCBlbm91Z2ggZGF0YSBmb3Igc3RlcCBtdWNoIGZhc3RlcjoKKyAqICAgZS5nLiBhdCBwb2xsID0gMTAgKDEwMjQgc2VjcyksIHN0ZXAgd2FzIGRvbmUgd2l0aGluIDUgbWludXRlcworICogICBhZnRlciBmaXJzdCByZXBseSB3aGljaCBpbmRpY2F0ZWQgdGhhdCBvdXIgY2xvY2sgaXMgMTQgc2Vjb25kcyBvZmYuCisgKiAtIG9uIHN0ZXAsIGRvIG5vdCBkaXNjYXJkIGRfZGlzcGVyc2lvbiBkYXRhIG9mIHRoZSBleGlzdGluZyBkYXRhcG9pbnRzLAorICogICBkbyBub3QgY2xlYXIgcmVhY2hhYmxlX2JpdHMuIFRoaXMgcHJldmVudHMgZGlzY2FyZGluZyBmaXJzdCB+OAorICogICBkYXRhcG9pbnRzIGFmdGVyIHRoZSBzdGVwLgorICovCisKKyNkZWZpbmUgSU5JVElBTF9TQU1QTEVTICAgIDQgICAgLyogaG93IG1hbnkgc2FtcGxlcyBkbyB3ZSB3YW50IGZvciBpbml0ICovCisjZGVmaW5lIEJBRF9ERUxBWV9HUk9XVEggICA0ICAgIC8qIGRyb3AgcGFja2V0IGlmIGl0cyBkZWxheSBncmV3IGJ5IG1vcmUgdGhhbiB0aGlzICovCisKKyNkZWZpbmUgUkVUUllfSU5URVJWQUwgICAgMzIgICAgLyogb24gc2VuZC9yZWN2IGVycm9yLCByZXRyeSBpbiBOIHNlY3MgKG5lZWQgdG8gYmUgcG93ZXIgb2YgMikgKi8KKyNkZWZpbmUgTk9SRVBMWV9JTlRFUlZBTCA1MTIgICAgLyogc2VudCwgYnV0IGdvdCBubyByZXBseTogY2FwIG5leHQgcXVlcnkgYnkgdGhpcyBtYW55IHNlY29uZHMgKi8KKyNkZWZpbmUgUkVTUE9OU0VfSU5URVJWQUwgMTYgICAgLyogd2FpdCBmb3IgcmVwbHkgdXAgdG8gTiBzZWNzICovCisKKy8qIFN0ZXAgdGhyZXNob2xkIChzZWMpLiBzdGQgbnRwZCB1c2VzIDAuMTI4LgorICogVXNpbmcgZXhhY3QgcG93ZXIgb2YgMiAoMS84KSByZXN1bHRzIGluIHNtYWxsZXIgY29kZQorICovCisjZGVmaW5lIFNURVBfVEhSRVNIT0xEICAwLjEyNQorLyogU3RlcG91dCB0aHJlc2hvbGQgKHNlYykuIHN0ZCBudHBkIHVzZXMgOTAwICgxMSBtaW5zICghKSkgKi8KKyNkZWZpbmUgV0FUQ0hfVEhSRVNIT0xEIDEyOAorLyogTkI6IHNldCBXQVRDSF9USFJFU0hPTEQgdG8gfjYwIHdoZW4gZGVidWdnaW5nIHRvIHNhdmUgdGltZSkgKi8KKy8vVU5VU0VEOiAjZGVmaW5lIFBBTklDX1RIUkVTSE9MRCAxMDAwICAgIC8qIHBhbmljIHRocmVzaG9sZCAoc2VjKSAqLworCisvKgorICogSWYgd2UgZ290IHxvZmZzZXR8ID4gQklHT0ZGIGZyb20gYSBwZWVyLCBjYXAgbmV4dCBxdWVyeSBpbnRlcnZhbAorICogZm9yIHRoaXMgcGVlciBieSB0aGlzIG1hbnkgc2Vjb25kczoKKyAqLworI2RlZmluZSBCSUdPRkYgICAgICAgICAgKFNURVBfVEhSRVNIT0xEICogOCkKKyNkZWZpbmUgQklHT0ZGX0lOVEVSVkFMICgxIDw8IDcpIC8qIDEyOCBzICovCisKKyNkZWZpbmUgRlJFUV9UT0xFUkFOQ0UgIDAuMDAwMDE1IC8qIGZyZXF1ZW5jeSB0b2xlcmFuY2UgKDE1IFBQTSkgKi8KKyNkZWZpbmUgQlVSU1RQT0xMICAgICAgIDAgICAgICAgLyogaW5pdGlhbCBwb2xsICovCisjZGVmaW5lIE1JTlBPTEwgICAgICAgICA1ICAgICAgIC8qIG1pbmltdW0gcG9sbCBpbnRlcnZhbC4gc3RkIG50cGQgdXNlcyA2ICg2OiA2NCBzZWMpICovCisvKgorICogSWYgb2Zmc2V0ID4gZGlzY2lwbGluZV9qaXR0ZXIgKiBQT0xMQURKX0dBVEUsIGFuZCBwb2xsIGludGVydmFsIGlzID4gMl5CSUdQT0xMLAorICogdGhlbiBpdCBpcyBkZWNyZWFzZWQgX2F0IG9uY2VfLiAoSWYgPD0gMl5CSUdQT0xMLCBpdCB3aWxsIGJlIGRlY3JlYXNlZCBfZXZlbnR1YWxseV8pLgorICovCisjZGVmaW5lIEJJR1BPTEwgICAgICAgICA5ICAgICAgIC8qIDJeOSBzZWMgfj0gOC41IG1pbiAqLworI2RlZmluZSBNQVhQT0xMICAgICAgICAgMTIgICAgICAvKiBtYXhpbXVtIHBvbGwgaW50ZXJ2YWwgKDEyOiAxLjFoLCAxNzogMzYuNGgpLiBzdGQgbnRwZCB1c2VzIDE3ICovCisvKgorICogQWN0aXZlbHkgbG93ZXIgcG9sbCB3aGVuIHdlIHNlZSBzdWNoIGJpZyBvZmZzZXRzLgorICogV2l0aCBTVEVQX1RIUkVTSE9MRCA9IDAuMTI1LCBpdCBtZWFucyB3ZSB0cnkgdG8gc3luYyBtb3JlIGFnZ3Jlc3NpdmVseQorICogaWYgb2Zmc2V0IGluY3JlYXNlcyBvdmVyIH4wLjA0IHNlYworICovCisvLyNkZWZpbmUgUE9MTERPV05fT0ZGU0VUIChTVEVQX1RIUkVTSE9MRCAvIDMpCisjZGVmaW5lIE1JTkRJU1AgICAgICAgICAwLjAxICAgIC8qIG1pbmltdW0gZGlzcGVyc2lvbiAoc2VjKSAqLworI2RlZmluZSBNQVhESVNQICAgICAgICAgMTYgICAgICAvKiBtYXhpbXVtIGRpc3BlcnNpb24gKHNlYykgKi8KKyNkZWZpbmUgTUFYU1RSQVQgICAgICAgIDE2ICAgICAgLyogbWF4aW11bSBzdHJhdHVtIChpbmZpbml0eSBtZXRyaWMpICovCisjZGVmaW5lIE1BWERJU1QgICAgICAgICAxICAgICAgIC8qIGRpc3RhbmNlIHRocmVzaG9sZCAoc2VjKSAqLworI2RlZmluZSBNSU5fU0VMRUNURUQgICAgMSAgICAgICAvKiBtaW5pbXVtIGludGVyc2VjdGlvbiBzdXJ2aXZvcnMgKi8KKyNkZWZpbmUgTUlOX0NMVVNURVJFRCAgIDMgICAgICAgLyogbWluaW11bSBjbHVzdGVyIHN1cnZpdm9ycyAqLworCisjZGVmaW5lIE1BWERSSUZUICAgICAgICAwLjAwMDUwMCAvKiBmcmVxdWVuY3kgZHJpZnQgd2UgY2FuIGNvcnJlY3QgKDUwMCBQUE0pICovCisKKy8qIFBvbGwtYWRqdXN0IHRocmVzaG9sZC4KKyAqIFdoZW4gd2Ugc2VlIHRoYXQgb2Zmc2V0IGlzIHNtYWxsIGVub3VnaCBjb21wYXJlZCB0byBkaXNjaXBsaW5lIGppdHRlciwKKyAqIHdlIGdyb3cgYSBjb3VudGVyOiArPSBNSU5QT0xMLiBXaGVuIGNvdW50ZXIgZ29lcyBvdmVyIFBPTExBREpfTElNSVQsCisgKiB3ZSBwb2xsX2V4cCsrLiBJZiBvZmZzZXQgaXNuJ3Qgc21hbGwsIGNvdW50ZXIgLT0gcG9sbF9leHAqMiwKKyAqIGFuZCB3aGVuIGl0IGdvZXMgYmVsb3cgLVBPTExBREpfTElNSVQsIHdlIHBvbGxfZXhwLS0uCisgKiAoQnVtcGVkIGZyb20gMzAgdG8gNDAgc2luY2Ugb3RoZXJ3aXNlIEkgb2Z0ZW4gc2VlIHBvbGxfZXhwIGdvaW5nICoyKiBzdGVwcyBkb3duKQorICovCisjZGVmaW5lIFBPTExBREpfTElNSVQgICA0MAorLyogSWYgb2Zmc2V0IDwgZGlzY2lwbGluZV9qaXR0ZXIgKiBQT0xMQURKX0dBVEUsIHRoZW4gd2UgZGVjaWRlIHRvIGluY3JlYXNlCisgKiBwb2xsIGludGVydmFsICh3ZSB0aGluayB3ZSBjYW4ndCBpbXByb3ZlIHRpbWVrZWVwaW5nCisgKiBieSBzdGF5aW5nIGF0IHNtYWxsZXIgcG9sbCkuCisgKi8KKyNkZWZpbmUgUE9MTEFESl9HQVRFICAgIDQKKyNkZWZpbmUgVElNRUNPTlNUX0hBQ0tfR0FURSAyCisvKiBDb21wcm9taXNlIEFsbGFuIGludGVyY2VwdCAoc2VjKS4gZG9jIHVzZXMgMTUwMCwgc3RkIG50cGQgdXNlcyA1MTIgKi8KKyNkZWZpbmUgQUxMQU4gICAgICAgICAgIDUxMgorLyogUExMIGxvb3AgZ2FpbiAqLworI2RlZmluZSBQTEwgICAgICAgICAgICAgNjU1MzYKKy8qIEZMTCBsb29wIGdhaW4gW3doeSBpdCBkZXBlbmRzIG9uIE1BWFBPTEw/P10gKi8KKyNkZWZpbmUgRkxMICAgICAgICAgICAgIChNQVhQT0xMICsgMSkKKy8qIFBhcmFtZXRlciBhdmVyYWdpbmcgY29uc3RhbnQgKi8KKyNkZWZpbmUgQVZHICAgICAgICAgICAgIDQKKworCitlbnVtIHsKKwlOVFBfVkVSU0lPTiAgICAgPSA0LAorCU5UUF9NQVhTVFJBVFVNICA9IDE1LAorCisJTlRQX0RJR0VTVFNJWkUgICAgID0gMTYsCisJTlRQX01TR1NJWkVfTk9BVVRIID0gNDgsCisJTlRQX01TR1NJWkUgICAgICAgID0gKE5UUF9NU0dTSVpFX05PQVVUSCArIDQgKyBOVFBfRElHRVNUU0laRSksCisKKwkvKiBTdGF0dXMgTWFza3MgKi8KKwlNT0RFX01BU0sgICAgICAgPSAoNyA8PCAwKSwKKwlWRVJTSU9OX01BU0sgICAgPSAoNyA8PCAzKSwKKwlWRVJTSU9OX1NISUZUICAgPSAzLAorCUxJX01BU0sgICAgICAgICA9ICgzIDw8IDYpLAorCisJLyogTGVhcCBTZWNvbmQgQ29kZXMgKGhpZ2ggb3JkZXIgdHdvIGJpdHMgb2YgbV9zdGF0dXMpICovCisJTElfTk9XQVJOSU5HICAgID0gKDAgPDwgNiksICAgIC8qIG5vIHdhcm5pbmcgKi8KKwlMSV9QTFVTU0VDICAgICAgPSAoMSA8PCA2KSwgICAgLyogYWRkIGEgc2Vjb25kICg2MSBzZWNvbmRzKSAqLworCUxJX01JTlVTU0VDICAgICA9ICgyIDw8IDYpLCAgICAvKiBtaW51cyBhIHNlY29uZCAoNTkgc2Vjb25kcykgKi8KKwlMSV9BTEFSTSAgICAgICAgPSAoMyA8PCA2KSwgICAgLyogYWxhcm0gY29uZGl0aW9uICovCisKKwkvKiBNb2RlIHZhbHVlcyAqLworCU1PREVfUkVTMCAgICAgICA9IDAsICAgIC8qIHJlc2VydmVkICovCisJTU9ERV9TWU1fQUNUICAgID0gMSwgICAgLyogc3ltbWV0cmljIGFjdGl2ZSAqLworCU1PREVfU1lNX1BBUyAgICA9IDIsICAgIC8qIHN5bW1ldHJpYyBwYXNzaXZlICovCisJTU9ERV9DTElFTlQgICAgID0gMywgICAgLyogY2xpZW50ICovCisJTU9ERV9TRVJWRVIgICAgID0gNCwgICAgLyogc2VydmVyICovCisJTU9ERV9CUk9BRENBU1QgID0gNSwgICAgLyogYnJvYWRjYXN0ICovCisJTU9ERV9SRVMxICAgICAgID0gNiwgICAgLyogcmVzZXJ2ZWQgZm9yIE5UUCBjb250cm9sIG1lc3NhZ2UgKi8KKwlNT0RFX1JFUzIgICAgICAgPSA3LCAgICAvKiByZXNlcnZlZCBmb3IgcHJpdmF0ZSB1c2UgKi8KK307CisKKy8vVE9ETzogYmV0dGVyIGJhc2Ugc2VsZWN0aW9uCisjZGVmaW5lIE9GRlNFVF8xOTAwXzE5NzAgMjIwODk4ODgwMFVMICAvKiAxOTcwIC0gMTkwMCBpbiBzZWNvbmRzICovCisKKyNkZWZpbmUgTlVNX0RBVEFQT0lOVFMgIDgKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQzMl90IGludF9wYXJ0bDsKKwl1aW50MzJfdCBmcmFjdGlvbmw7Cit9IGxfZml4ZWRwdF90OworCit0eXBlZGVmIHN0cnVjdCB7CisJdWludDE2X3QgaW50X3BhcnRzOworCXVpbnQxNl90IGZyYWN0aW9uczsKK30gc19maXhlZHB0X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50OF90ICAgICBtX3N0YXR1czsgICAgIC8qIHN0YXR1cyBvZiBsb2NhbCBjbG9jayBhbmQgbGVhcCBpbmZvICovCisJdWludDhfdCAgICAgbV9zdHJhdHVtOworCXVpbnQ4X3QgICAgIG1fcHBvbGw7ICAgICAgLyogcG9sbCB2YWx1ZSAqLworCWludDhfdCAgICAgIG1fcHJlY2lzaW9uX2V4cDsKKwlzX2ZpeGVkcHRfdCBtX3Jvb3RkZWxheTsKKwlzX2ZpeGVkcHRfdCBtX3Jvb3RkaXNwOworCXVpbnQzMl90ICAgIG1fcmVmaWQ7CisJbF9maXhlZHB0X3QgbV9yZWZ0aW1lOworCWxfZml4ZWRwdF90IG1fb3JndGltZTsKKwlsX2ZpeGVkcHRfdCBtX3JlY3RpbWU7CisJbF9maXhlZHB0X3QgbV94bXR0aW1lOworCXVpbnQzMl90ICAgIG1fa2V5aWQ7CisJdWludDhfdCAgICAgbV9kaWdlc3RbTlRQX0RJR0VTVFNJWkVdOworfSBtc2dfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCWRvdWJsZSBkX29mZnNldDsKKwlkb3VibGUgZF9yZWN2X3RpbWU7CisJZG91YmxlIGRfZGlzcGVyc2lvbjsKK30gZGF0YXBvaW50X3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKwlsZW5fYW5kX3NvY2thZGRyICpwX2xzYTsKKwljaGFyICAgICAgICAgICAgICpwX2RvdHRlZDsKKwlpbnQgICAgICAgICAgICAgIHBfZmQ7CisJaW50ICAgICAgICAgICAgICBkYXRhcG9pbnRfaWR4OworCXVpbnQzMl90ICAgICAgICAgbGFzdHBrdF9yZWZpZDsKKwl1aW50OF90ICAgICAgICAgIGxhc3Rwa3Rfc3RhdHVzOworCXVpbnQ4X3QgICAgICAgICAgbGFzdHBrdF9zdHJhdHVtOworCXVpbnQ4X3QgICAgICAgICAgcmVhY2hhYmxlX2JpdHM7CisJLyogd2hlbiB0byBzZW5kIG5ldyBxdWVyeSAoaWYgcF9mZCA9PSAtMSkKKwkgKiBvciB3aGVuIHJlY2VpdmUgdGltZXMgb3V0IChpZiBwX2ZkID49IDApOiAqLworCWRvdWJsZSAgICAgICAgICAgbmV4dF9hY3Rpb25fdGltZTsKKwlkb3VibGUgICAgICAgICAgIHBfeG10dGltZTsKKwlkb3VibGUgICAgICAgICAgIHBfcmF3X2RlbGF5OworCS8qIHBfcmF3X2RlbGF5IGlzIHNldCBldmVuIGJ5ICJoaWdoIGRlbGF5IiBwYWNrZXRzICovCisJLyogbGFzdHBrdF9kZWxheSBpc24ndCAqLworCWRvdWJsZSAgICAgICAgICAgbGFzdHBrdF9yZWN2X3RpbWU7CisJZG91YmxlICAgICAgICAgICBsYXN0cGt0X2RlbGF5OworCWRvdWJsZSAgICAgICAgICAgbGFzdHBrdF9yb290ZGVsYXk7CisJZG91YmxlICAgICAgICAgICBsYXN0cGt0X3Jvb3RkaXNwOworCS8qIHByb2R1Y2VkIGJ5IGZpbHRlciBhbGdvcml0aG06ICovCisJZG91YmxlICAgICAgICAgICBmaWx0ZXJfb2Zmc2V0OworCWRvdWJsZSAgICAgICAgICAgZmlsdGVyX2Rpc3BlcnNpb247CisJZG91YmxlICAgICAgICAgICBmaWx0ZXJfaml0dGVyOworCWRhdGFwb2ludF90ICAgICAgZmlsdGVyX2RhdGFwb2ludFtOVU1fREFUQVBPSU5UU107CisJLyogbGFzdCBzZW50IHBhY2tldDogKi8KKwltc2dfdCAgICAgICAgICAgIHBfeG10X21zZzsKK30gcGVlcl90OworCisKKyNkZWZpbmUgVVNJTkdfS0VSTkVMX1BMTF9MT09QICAgICAgICAgIDEKKyNkZWZpbmUgVVNJTkdfSU5JVElBTF9GUkVRX0VTVElNQVRJT04gIDAKKworZW51bSB7CisJT1BUX24gPSAoMSA8PCAwKSwKKwlPUFRfcSA9ICgxIDw8IDEpLAorCU9QVF9OID0gKDEgPDwgMiksCisJT1BUX3ggPSAoMSA8PCAzKSwKKwkvKiBJbnNlcnQgbmV3IG9wdGlvbnMgYWJvdmUgdGhpcyBsaW5lLiAqLworCS8qIE5vbi1jb21wYXQgb3B0aW9uczogKi8KKwlPUFRfdyA9ICgxIDw8IDQpLAorCU9QVF9wID0gKDEgPDwgNSksCisJT1BUX1MgPSAoMSA8PCA2KSwKKwlPUFRfbCA9ICgxIDw8IDcpICogRU5BQkxFX0ZFQVRVUkVfTlRQRF9TRVJWRVIsCisJT1BUX0kgPSAoMSA8PCA4KSAqIEVOQUJMRV9GRUFUVVJFX05UUERfU0VSVkVSLAorCS8qIFdlIGhpamFjayBzb21lIGJpdHMgZm9yIG90aGVyIHB1cnBvc2VzICovCisJT1BUX3FxID0gKDEgPDwgMzEpLAorfTsKKworc3RydWN0IGdsb2JhbHMgeworCWRvdWJsZSAgIGN1cl90aW1lOworCS8qIHRvdGFsIHJvdW5kIHRyaXAgZGVsYXkgdG8gY3VycmVudGx5IHNlbGVjdGVkIHJlZmVyZW5jZSBjbG9jayAqLworCWRvdWJsZSAgIHJvb3RkZWxheTsKKwkvKiByZWZlcmVuY2UgdGltZXN0YW1wOiB0aW1lIHdoZW4gdGhlIHN5c3RlbSBjbG9jayB3YXMgbGFzdCBzZXQgb3IgY29ycmVjdGVkICovCisJZG91YmxlICAgcmVmdGltZTsKKwkvKiB0b3RhbCBkaXNwZXJzaW9uIHRvIGN1cnJlbnRseSBzZWxlY3RlZCByZWZlcmVuY2UgY2xvY2sgKi8KKwlkb3VibGUgICByb290ZGlzcDsKKworCWRvdWJsZSAgIGxhc3Rfc2NyaXB0X3J1bjsKKwljaGFyICAgICAqc2NyaXB0X25hbWU7CisJbGxpc3RfdCAgKm50cF9wZWVyczsKKyNpZiBFTkFCTEVfRkVBVFVSRV9OVFBEX1NFUlZFUgorCWludCAgICAgIGxpc3Rlbl9mZDsKKwljaGFyICAgICAqaWZfbmFtZTsKKyMgZGVmaW5lIEdfbGlzdGVuX2ZkIChHLmxpc3Rlbl9mZCkKKyNlbHNlCisjIGRlZmluZSBHX2xpc3Rlbl9mZCAoLTEpCisjZW5kaWYKKwl1bnNpZ25lZCB2ZXJib3NlOworCXVuc2lnbmVkIHBlZXJfY250OworCS8qIHJlZmlkOiAzMi1iaXQgY29kZSBpZGVudGlmeWluZyB0aGUgcGFydGljdWxhciBzZXJ2ZXIgb3IgcmVmZXJlbmNlIGNsb2NrCisJICogaW4gc3RyYXR1bSAwIHBhY2tldHMgdGhpcyBpcyBhIGZvdXItY2hhcmFjdGVyIEFTQ0lJIHN0cmluZywKKwkgKiBjYWxsZWQgdGhlIGtpc3MgY29kZSwgdXNlZCBmb3IgZGVidWdnaW5nIGFuZCBtb25pdG9yaW5nCisJICogaW4gc3RyYXR1bSAxIHBhY2tldHMgdGhpcyBpcyBhIGZvdXItY2hhcmFjdGVyIEFTQ0lJIHN0cmluZworCSAqIGFzc2lnbmVkIHRvIHRoZSByZWZlcmVuY2UgY2xvY2sgYnkgSUFOQS4gRXhhbXBsZTogIkdQUyAiCisJICogaW4gc3RyYXR1bSAyKyBwYWNrZXRzLCBpdCdzIElQdjQgYWRkcmVzcyBvciA0IGZpcnN0IGJ5dGVzCisJICogb2YgTUQ1IGhhc2ggb2YgSVB2NgorCSAqLworCXVpbnQzMl90IHJlZmlkOworCXVpbnQ4X3QgIG50cF9zdGF0dXM7CisJLyogcHJlY2lzaW9uIGlzIGRlZmluZWQgYXMgdGhlIGxhcmdlciBvZiB0aGUgcmVzb2x1dGlvbiBhbmQgdGltZSB0bworCSAqIHJlYWQgdGhlIGNsb2NrLCBpbiBsb2cyIHVuaXRzLiAgRm9yIGluc3RhbmNlLCB0aGUgcHJlY2lzaW9uIG9mIGEKKwkgKiBtYWlucy1mcmVxdWVuY3kgY2xvY2sgaW5jcmVtZW50aW5nIGF0IDYwIEh6IGlzIDE2IG1zLCBldmVuIHdoZW4gdGhlCisJICogc3lzdGVtIGNsb2NrIGhhcmR3YXJlIHJlcHJlc2VudGF0aW9uIGlzIHRvIHRoZSBuYW5vc2Vjb25kLgorCSAqCisJICogRGVsYXlzLCBqaXR0ZXJzIG9mIHZhcmlvdXMga2luZHMgYXJlIGNsYW1wZWQgZG93biB0byBwcmVjaXNpb24uCisJICoKKwkgKiBJZiBwcmVjaXNpb25fc2VjIGlzIHRvbyBsYXJnZSwgZGlzY2lwbGluZV9qaXR0ZXIgZ2V0cyBjbGFtcGVkIHRvIGl0CisJICogYW5kIGlmIG9mZnNldCBpcyBzbWFsbGVyIHRoYW4gZGlzY2lwbGluZV9qaXR0ZXIgKiBQT0xMQURKX0dBVEUsIHBvbGwKKwkgKiBpbnRlcnZhbCBncm93cyBldmVuIHRob3VnaCB3ZSByZWFsbHkgY2FuIGJlbmVmaXQgZnJvbSBzdGF5aW5nIGF0CisJICogc21hbGxlciBvbmUsIGNvbGxlY3Rpbmcgbm9uLWxhZ2dlZCBkYXRhcG9pdHMgYW5kIGNvcnJlY3Rpbmcgb2Zmc2V0LgorCSAqIChMYWdnZWQgZGF0YXBvaXRzIGV4aXN0IHdoZW4gcG9sbF9leHAgaXMgbGFyZ2UgYnV0IHdlIHN0aWxsIGhhdmUKKwkgKiBzeXN0ZW1hdGljIG9mZnNldCBlcnJvciAtIHRoZSB0aW1lIGRpc3RhbmNlIGJldHdlZW4gZGF0YXBvaW50cworCSAqIGlzIHNpZ25pZmljYW50IGFuZCBvbGRlciBkYXRhcG9pbnRzIGhhdmUgc21hbGxlciBvZmZzZXRzLgorCSAqIFRoaXMgbWFrZXMgb3VyIG9mZnNldCBlc3RpbWF0aW9uIGEgYml0IHNtYWxsZXIgdGhhbiByZWFsaXR5KQorCSAqIER1ZSB0byB0aGlzIGVmZmVjdCwgc2V0dGluZyBHX3ByZWNpc2lvbl9zZWMgY2xvc2UgdG8KKwkgKiBTVEVQX1RIUkVTSE9MRCBpc24ndCBzdWNoIGEgZ29vZCBpZGVhIC0gb2Zmc2V0cyBtYXkgZ3JvdworCSAqIHRvbyBiaWcgYW5kIHdlIHdpbGwgc3RlcC4gSSBvYnNlcnZlZCBpdCB3aXRoIC02LgorCSAqCisJICogT1RPSCwgc2V0dGluZyBwcmVjaXNpb25fc2VjIGZhciB0b28gc21hbGwgd291bGQgcmVzdWx0IGluIGZ1dGlsZQorCSAqIGF0dGVtcHRzIHRvIHN5bmNyb25pemUgdG8gYW4gdW5hY2hpZXZhYmxlIHByZWNpc2lvbi4KKwkgKgorCSAqIC02IGlzIDEvNjQgc2VjLCAtNyBpcyAxLzEyOCBzZWMgYW5kIHNvIG9uLgorCSAqIC04IGlzIDEvMjU2IH49IDAuMDAzOTA2ICh3b3JrZWQgd2VsbCBmb3IgbWUgLS12ZGEpCisJICogLTkgaXMgMS81MTIgfj0gMC4wMDE5NTMgKGxldCdzIHRyeSB0aGlzIGZvciBzb21lIHRpbWUpCisJICovCisjZGVmaW5lIEdfcHJlY2lzaW9uX2V4cCAgLTkKKwkvKgorCSAqIEdfcHJlY2lzaW9uX2V4cCBpcyB1c2VkIG9ubHkgZm9yIGNvbnN0cnVjdGlvbiBvdXRnb2luZyBwYWNrZXRzLgorCSAqIEl0J3Mgb2sgdG8gc2V0IEdfcHJlY2lzaW9uX3NlYyB0byBhIHNsaWdodGx5IGRpZmZlcmVudCB2YWx1ZQorCSAqIChPbmUgd2hpY2ggaXMgIm5pY2VyIGxvb2tpbmciIGluIGxvZ3MpLgorCSAqIEV4YWN0IHZhbHVlIHdvdWxkIGJlICgxLjAgLyAoMSA8PCAoLSBHX3ByZWNpc2lvbl9leHApKSk6CisJICovCisjZGVmaW5lIEdfcHJlY2lzaW9uX3NlYyAgMC4wMDIKKwl1aW50OF90ICBzdHJhdHVtOworCisjZGVmaW5lIFNUQVRFX05TRVQgICAgICAwICAgICAgIC8qIGluaXRpYWwgc3RhdGUsICJub3RoaW5nIGlzIHNldCIgKi8KKy8vI2RlZmluZSBTVEFURV9GU0VUICAgIDEgICAgICAgLyogZnJlcXVlbmN5IHNldCBmcm9tIGZpbGUgKi8KKy8vI2RlZmluZSBTVEFURV9TUElLICAgIDIgICAgICAgLyogc3Bpa2UgZGV0ZWN0ZWQgKi8KKy8vI2RlZmluZSBTVEFURV9GUkVRICAgIDMgICAgICAgLyogaW5pdGlhbCBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgU1RBVEVfU1lOQyAgICAgIDQgICAgICAgLyogY2xvY2sgc3luY2hyb25pemVkIChub3JtYWwgb3BlcmF0aW9uKSAqLworCXVpbnQ4X3QgIGRpc2NpcGxpbmVfc3RhdGU7ICAgICAgLy8gZG9jIGNhbGxzIGl0IGMuc3RhdGUKKwl1aW50OF90ICBwb2xsX2V4cDsgICAgICAgICAgICAgIC8vIHMucG9sbAorCWludCAgICAgIHBvbGxhZGpfY291bnQ7ICAgICAgICAgLy8gYy5jb3VudAorCWxvbmcgICAgIGtlcm5lbF9mcmVxX2RyaWZ0OworCXBlZXJfdCAgICpsYXN0X3VwZGF0ZV9wZWVyOworCWRvdWJsZSAgIGxhc3RfdXBkYXRlX29mZnNldDsgICAgLy8gYy5sYXN0CisJZG91YmxlICAgbGFzdF91cGRhdGVfcmVjdl90aW1lOyAvLyBzLnQKKwlkb3VibGUgICBkaXNjaXBsaW5lX2ppdHRlcjsgICAgIC8vIGMuaml0dGVyCisJLyogU2luY2Ugd2Ugb25seSBjb21wYXJlIGl0IHdpdGggaW50cywgY2FuIHNpbXBsaWZ5IGNvZGUKKwkgKiBieSBub3QgbWFraW5nIHRoaXMgdmFyaWFibGUgZmxvYXRpbmcgcG9pbnQ6CisJICovCisJdW5zaWduZWQgb2Zmc2V0X3RvX2ppdHRlcl9yYXRpbzsKKwkvL2RvdWJsZSAgIGNsdXN0ZXJfb2Zmc2V0OyAgICAgICAgLy8gcy5vZmZzZXQKKwkvL2RvdWJsZSAgIGNsdXN0ZXJfaml0dGVyOyAgICAgICAgLy8gcy5qaXR0ZXIKKyNpZiAhVVNJTkdfS0VSTkVMX1BMTF9MT09QCisJZG91YmxlICAgZGlzY2lwbGluZV9mcmVxX2RyaWZ0OyAvLyBjLmZyZXEKKwkvKiBNYXliZSBjb25kaXRpb25hbGx5IGNhbGN1bGF0ZSB3YW5kZXI/IGl0J3MgdXNlZCBvbmx5IGZvciBsb2dnaW5nICovCisJZG91YmxlICAgZGlzY2lwbGluZV93YW5kZXI7ICAgICAvLyBjLndhbmRlcgorI2VuZGlmCit9OworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisKKworI2RlZmluZSBWRVJCMSBpZiAoTUFYX1ZFUkJPU0UgJiYgRy52ZXJib3NlKQorI2RlZmluZSBWRVJCMiBpZiAoTUFYX1ZFUkJPU0UgPj0gMiAmJiBHLnZlcmJvc2UgPj0gMikKKyNkZWZpbmUgVkVSQjMgaWYgKE1BWF9WRVJCT1NFID49IDMgJiYgRy52ZXJib3NlID49IDMpCisjZGVmaW5lIFZFUkI0IGlmIChNQVhfVkVSQk9TRSA+PSA0ICYmIEcudmVyYm9zZSA+PSA0KQorI2RlZmluZSBWRVJCNSBpZiAoTUFYX1ZFUkJPU0UgPj0gNSAmJiBHLnZlcmJvc2UgPj0gNSkKKyNkZWZpbmUgVkVSQjYgaWYgKE1BWF9WRVJCT1NFID49IDYgJiYgRy52ZXJib3NlID49IDYpCisKKworc3RhdGljIGRvdWJsZSBMT0cyRChpbnQgYSkKK3sKKwlpZiAoYSA8IDApCisJCXJldHVybiAxLjAgLyAoMVVMIDw8IC1hKTsKKwlyZXR1cm4gMVVMIDw8IGE7Cit9CitzdGF0aWMgQUxXQVlTX0lOTElORSBkb3VibGUgU1FVQVJFKGRvdWJsZSB4KQoreworCXJldHVybiB4ICogeDsKK30KK3N0YXRpYyBBTFdBWVNfSU5MSU5FIGRvdWJsZSBNQVhEKGRvdWJsZSBhLCBkb3VibGUgYikKK3sKKwlpZiAoYSA+IGIpCisJCXJldHVybiBhOworCXJldHVybiBiOworfQorc3RhdGljIEFMV0FZU19JTkxJTkUgZG91YmxlIE1JTkQoZG91YmxlIGEsIGRvdWJsZSBiKQoreworCWlmIChhIDwgYikKKwkJcmV0dXJuIGE7CisJcmV0dXJuIGI7Cit9CitzdGF0aWMgTk9JTkxJTkUgZG91YmxlIG15X1NRUlQoZG91YmxlIFgpCit7CisJdW5pb24geworCQlmbG9hdCAgIGY7CisJCWludDMyX3QgaTsKKwl9IHY7CisJZG91YmxlIGludnNxcnQ7CisJZG91YmxlIFhoYWxmID0gWCAqIDAuNTsKKworCS8qIEZhc3QgYW5kIGdvb2QgYXBwcm94aW1hdGlvbiB0byAxL3NxcnQoWCksIGJsYWNrIG1hZ2ljICovCisJdi5mID0gWDsKKwkvKnYuaSA9IDB4NWYzNzU5ZGYgLSAodi5pID4+IDEpOyovCisJdi5pID0gMHg1ZjM3NWE4NiAtICh2LmkgPj4gMSk7IC8qIC0gdGhpcyBjb25zdGFudCBpcyBzbGlnaHRseSBiZXR0ZXIgKi8KKwlpbnZzcXJ0ID0gdi5mOyAvKiBiZXR0ZXIgdGhhbiAwLjIlIGFjY3VyYWN5ICovCisKKwkvKiBSZWZpbmluZyBpdCB1c2luZyBOZXd0b24ncyBtZXRob2Q6IHgxID0geDAgLSBmKHgwKS9mJyh4MCkKKwkgKiBmKHgpID0gMS8oeCp4KSAtIFggIChmPT0wIHdoZW4geCA9IDEvc3FydChYKSkKKwkgKiBmJyh4KSA9IC0yLyh4KngqeCkKKwkgKiBmKHgpL2YnKHgpID0gKFggLSAxLyh4KngpKSAvICgyLyh4KngqeCkpID0gWCp4KngqeC8yIC0geC8yCisJICogeDEgPSB4MCAtIChYKngwKngwKngwLzIgLSB4MC8yKSA9IDEuNSp4MCAtIFgqeDAqeDAqeDAvMiA9IHgwKigxLjUgLSAoWC8yKSp4MCp4MCkKKwkgKi8KKwlpbnZzcXJ0ID0gaW52c3FydCAqICgxLjUgLSBYaGFsZiAqIGludnNxcnQgKiBpbnZzcXJ0KTsgLyogfjAuMDUlIGFjY3VyYWN5ICovCisJLyogaW52c3FydCA9IGludnNxcnQgKiAoMS41IC0gWGhhbGYgKiBpbnZzcXJ0ICogaW52c3FydCk7IDJuZCBpdGVyOiB+MC4wMDAxJSBhY2N1cmFjeSAqLworCS8qIFdpdGggNCBpdGVyYXRpb25zLCBtb3JlIHRoYW4gaGFsZiByZXN1bHRzIHdpbGwgYmUgZXhhY3QsCisJICogYXQgNnRoIGl0ZXJhdGlvbnMgcmVzdWx0IHN0YWJpbGl6ZXMgd2l0aCBhYm91dCA3MiUgcmVzdWx0cyBleGFjdC4KKwkgKiBXZSBhcmUgd2VsbCBzYXRpc2ZpZWQgd2l0aCAwLjA1JSBhY2N1cmFjeS4KKwkgKi8KKworCXJldHVybiBYICogaW52c3FydDsgLyogWCAqIDEvc3FydChYKSB+PSBzcXJ0KFgpICovCit9CitzdGF0aWMgQUxXQVlTX0lOTElORSBkb3VibGUgU1FSVChkb3VibGUgWCkKK3sKKwkvKiBJZiB0aGlzIGFyY2ggZG9lc24ndCB1c2UgSUVFRSA3NTQgZmxvYXRzLCBmYWxsIGJhY2sgdG8gdXNpbmcgbGlibSAqLworCWlmIChzaXplb2YoZmxvYXQpICE9IDQpCisJCXJldHVybiBzcXJ0KFgpOworCisJLyogVGhpcyBhdm9pZHMgbmVlZGluZyBsaWJtLCBzYXZlcyBhYm91dCAwLjVrIG9uIHg4Ni0zMiAqLworCXJldHVybiBteV9TUVJUKFgpOworfQorCitzdGF0aWMgZG91YmxlCitnZXR0aW1lMTkwMGQodm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsgLyogbmV2ZXIgZmFpbHMgKi8KKwlHLmN1cl90aW1lID0gdHYudHZfc2VjICsgKDEuMGUtNiAqIHR2LnR2X3VzZWMpICsgT0ZGU0VUXzE5MDBfMTk3MDsKKwlyZXR1cm4gRy5jdXJfdGltZTsKK30KKworc3RhdGljIHZvaWQKK2RfdG9fdHYoZG91YmxlIGQsIHN0cnVjdCB0aW1ldmFsICp0dikKK3sKKwl0di0+dHZfc2VjID0gKGxvbmcpZDsKKwl0di0+dHZfdXNlYyA9IChkIC0gdHYtPnR2X3NlYykgKiAxMDAwMDAwOworfQorCitzdGF0aWMgZG91YmxlCitsZnBfdG9fZChsX2ZpeGVkcHRfdCBsZnApCit7CisJZG91YmxlIHJldDsKKwlsZnAuaW50X3BhcnRsID0gbnRvaGwobGZwLmludF9wYXJ0bCk7CisJbGZwLmZyYWN0aW9ubCA9IG50b2hsKGxmcC5mcmFjdGlvbmwpOworCXJldCA9IChkb3VibGUpbGZwLmludF9wYXJ0bCArICgoZG91YmxlKWxmcC5mcmFjdGlvbmwgLyBVSU5UX01BWCk7CisJcmV0dXJuIHJldDsKK30KK3N0YXRpYyBkb3VibGUKK3NmcF90b19kKHNfZml4ZWRwdF90IHNmcCkKK3sKKwlkb3VibGUgcmV0OworCXNmcC5pbnRfcGFydHMgPSBudG9ocyhzZnAuaW50X3BhcnRzKTsKKwlzZnAuZnJhY3Rpb25zID0gbnRvaHMoc2ZwLmZyYWN0aW9ucyk7CisJcmV0ID0gKGRvdWJsZSlzZnAuaW50X3BhcnRzICsgKChkb3VibGUpc2ZwLmZyYWN0aW9ucyAvIFVTSFJUX01BWCk7CisJcmV0dXJuIHJldDsKK30KKyNpZiBFTkFCTEVfRkVBVFVSRV9OVFBEX1NFUlZFUgorc3RhdGljIGxfZml4ZWRwdF90CitkX3RvX2xmcChkb3VibGUgZCkKK3sKKwlsX2ZpeGVkcHRfdCBsZnA7CisJbGZwLmludF9wYXJ0bCA9ICh1aW50MzJfdClkOworCWxmcC5mcmFjdGlvbmwgPSAodWludDMyX3QpKChkIC0gbGZwLmludF9wYXJ0bCkgKiBVSU5UX01BWCk7CisJbGZwLmludF9wYXJ0bCA9IGh0b25sKGxmcC5pbnRfcGFydGwpOworCWxmcC5mcmFjdGlvbmwgPSBodG9ubChsZnAuZnJhY3Rpb25sKTsKKwlyZXR1cm4gbGZwOworfQorc3RhdGljIHNfZml4ZWRwdF90CitkX3RvX3NmcChkb3VibGUgZCkKK3sKKwlzX2ZpeGVkcHRfdCBzZnA7CisJc2ZwLmludF9wYXJ0cyA9ICh1aW50MTZfdClkOworCXNmcC5mcmFjdGlvbnMgPSAodWludDE2X3QpKChkIC0gc2ZwLmludF9wYXJ0cykgKiBVU0hSVF9NQVgpOworCXNmcC5pbnRfcGFydHMgPSBodG9ucyhzZnAuaW50X3BhcnRzKTsKKwlzZnAuZnJhY3Rpb25zID0gaHRvbnMoc2ZwLmZyYWN0aW9ucyk7CisJcmV0dXJuIHNmcDsKK30KKyNlbmRpZgorCitzdGF0aWMgZG91YmxlCitkaXNwZXJzaW9uKGNvbnN0IGRhdGFwb2ludF90ICpkcCkKK3sKKwlyZXR1cm4gZHAtPmRfZGlzcGVyc2lvbiArIEZSRVFfVE9MRVJBTkNFICogKEcuY3VyX3RpbWUgLSBkcC0+ZF9yZWN2X3RpbWUpOworfQorCitzdGF0aWMgZG91YmxlCityb290X2Rpc3RhbmNlKHBlZXJfdCAqcCkKK3sKKwkvKiBUaGUgcm9vdCBzeW5jaHJvbml6YXRpb24gZGlzdGFuY2UgaXMgdGhlIG1heGltdW0gZXJyb3IgZHVlIHRvCisJICogYWxsIGNhdXNlcyBvZiB0aGUgbG9jYWwgY2xvY2sgcmVsYXRpdmUgdG8gdGhlIHByaW1hcnkgc2VydmVyLgorCSAqIEl0IGlzIGRlZmluZWQgYXMgaGFsZiB0aGUgdG90YWwgZGVsYXkgcGx1cyB0b3RhbCBkaXNwZXJzaW9uCisJICogcGx1cyBwZWVyIGppdHRlci4KKwkgKi8KKwlyZXR1cm4gTUFYRChNSU5ESVNQLCBwLT5sYXN0cGt0X3Jvb3RkZWxheSArIHAtPmxhc3Rwa3RfZGVsYXkpIC8gMgorCQkrIHAtPmxhc3Rwa3Rfcm9vdGRpc3AKKwkJKyBwLT5maWx0ZXJfZGlzcGVyc2lvbgorCQkrIEZSRVFfVE9MRVJBTkNFICogKEcuY3VyX3RpbWUgLSBwLT5sYXN0cGt0X3JlY3ZfdGltZSkKKwkJKyBwLT5maWx0ZXJfaml0dGVyOworfQorCitzdGF0aWMgdm9pZAorc2V0X25leHQocGVlcl90ICpwLCB1bnNpZ25lZCB0KQoreworCXAtPm5leHRfYWN0aW9uX3RpbWUgPSBHLmN1cl90aW1lICsgdDsKK30KKworLyoKKyAqIFBlZXIgY2xvY2sgZmlsdGVyIGFuZCBpdHMgaGVscGVycworICovCitzdGF0aWMgdm9pZAorZmlsdGVyX2RhdGFwb2ludHMocGVlcl90ICpwKQoreworCWludCBpLCBpZHg7CisJZG91YmxlIHN1bSwgd2F2ZzsKKwlkYXRhcG9pbnRfdCAqZmRwOworCisjaWYgMAorLyogU2ltdWxhdGlvbnMgaGF2ZSBzaG93biB0aGF0IHVzZSBvZiAqYXZlcmFnZWQqIG9mZnNldCBmb3IgcC0+ZmlsdGVyX29mZnNldAorICogaXMgaW4gZmFjdCB3b3JzZSB0aGFuIHNpbXBseSB1c2luZyBsYXN0IHJlY2VpdmVkIG9uZTogd2l0aCBsYXJnZSBwb2xsIGludGVydmFscworICogKD49IDIwNDgpIGF2ZXJhZ2luZyBjb2RlIHVzZXMgb2Zmc2V0IHZhbHVlcyB3aGljaCBhcmUgb3V0ZGF0ZWQgYnkgaG91cnMsCisgKiBhbmQgdGltZS9mcmVxdWVuY3kgY29ycmVjdGlvbiBnb2VzIHRvdGFsbHkgd3Jvbmcgd2hlbiBmZWQgZXNzZW50aWFsbHkgYm9ndXMgb2Zmc2V0cy4KKyAqLworCWludCBnb3RfbmV3ZXN0OworCWRvdWJsZSBtaW5vZmYsIG1heG9mZiwgdzsKKwlkb3VibGUgeCA9IHg7IC8qIGZvciBjb21waWxlciAqLworCWRvdWJsZSBvbGRlc3Rfb2ZmID0gb2xkZXN0X29mZjsKKwlkb3VibGUgb2xkZXN0X2FnZSA9IG9sZGVzdF9hZ2U7CisJZG91YmxlIG5ld2VzdF9vZmYgPSBuZXdlc3Rfb2ZmOworCWRvdWJsZSBuZXdlc3RfYWdlID0gbmV3ZXN0X2FnZTsKKworCWZkcCA9IHAtPmZpbHRlcl9kYXRhcG9pbnQ7CisKKwltaW5vZmYgPSBtYXhvZmYgPSBmZHBbMF0uZF9vZmZzZXQ7CisJZm9yIChpID0gMTsgaSA8IE5VTV9EQVRBUE9JTlRTOyBpKyspIHsKKwkJaWYgKG1pbm9mZiA+IGZkcFtpXS5kX29mZnNldCkKKwkJCW1pbm9mZiA9IGZkcFtpXS5kX29mZnNldDsKKwkJaWYgKG1heG9mZiA8IGZkcFtpXS5kX29mZnNldCkKKwkJCW1heG9mZiA9IGZkcFtpXS5kX29mZnNldDsKKwl9CisKKwlpZHggPSBwLT5kYXRhcG9pbnRfaWR4OyAvKiBtb3N0IHJlY2VudCBkYXRhcG9pbnQncyBpbmRleCAqLworCS8qIEF2ZXJhZ2Ugb2Zmc2V0OgorCSAqIERyb3AgdHdvIG91dGxpZXJzIGFuZCB0YWtlIHdlaWdodGVkIGF2ZXJhZ2Ugb2YgdGhlIHJlc3Q6CisJICogbW9zdF9yZWNlbnQvMiArIG9sZGVyMS80ICsgb2xkZXIyLzggLi4uICsgb2xkZXI1LzMyICsgb2xkZXI2LzMyCisJICogd2UgdXNlIG9sZGVyNi8zMiwgbm90IG9sZGVyNi82NCBzaW5jZSBzdW0gb2Ygd2VpZ2h0cyBzaG91bGQgYmUgMToKKwkgKiAxLzIgKyAxLzQgKyAxLzggKyAxLzE2ICsgMS8zMiArIDEvMzIgPSAxCisJICovCisJd2F2ZyA9IDA7CisJdyA9IDAuNTsKKwkvKiAgICAgICAgICAgICAgICAgICAgIG4tMQorCSAqICAgICAgICAgICAgICAgICAgICAgLS0tICAgIGRpc3BlcnNpb24oaSkKKwkgKiBmaWx0ZXJfZGlzcGVyc2lvbiA9ICBcICAgICAtLS0tLS0tLS0tLS0tCisJICogICAgICAgICAgICAgICAgICAgICAgLyAgICAgICAoaSsxKQorCSAqICAgICAgICAgICAgICAgICAgICAgLS0tICAgICAyCisJICogICAgICAgICAgICAgICAgICAgICBpPTAKKwkgKi8KKwlnb3RfbmV3ZXN0ID0gMDsKKwlzdW0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBOVU1fREFUQVBPSU5UUzsgaSsrKSB7CisJCVZFUkI1IHsKKwkJCWJiX2Vycm9yX21zZygiZGF0YXBvaW50WyVkXTogb2ZmOiVmIGRpc3A6JWYoJWYpIGFnZTolZiVzIiwKKwkJCQlpLAorCQkJCWZkcFtpZHhdLmRfb2Zmc2V0LAorCQkJCWZkcFtpZHhdLmRfZGlzcGVyc2lvbiwgZGlzcGVyc2lvbigmZmRwW2lkeF0pLAorCQkJCUcuY3VyX3RpbWUgLSBmZHBbaWR4XS5kX3JlY3ZfdGltZSwKKwkJCQkobWlub2ZmID09IGZkcFtpZHhdLmRfb2Zmc2V0IHx8IG1heG9mZiA9PSBmZHBbaWR4XS5kX29mZnNldCkKKwkJCQkJPyAiIChvdXRsaWVyIGJ5IG9mZnNldCkiIDogIiIKKwkJCSk7CisJCX0KKworCQlzdW0gKz0gZGlzcGVyc2lvbigmZmRwW2lkeF0pIC8gKDIgPDwgaSk7CisKKwkJaWYgKG1pbm9mZiA9PSBmZHBbaWR4XS5kX29mZnNldCkgeworCQkJbWlub2ZmIC09IDE7IC8qIHNvIHRoYXQgd2UgZG9uJ3QgbWF0Y2ggaXQgZXZlciBhZ2FpbiAqLworCQl9IGVsc2UKKwkJaWYgKG1heG9mZiA9PSBmZHBbaWR4XS5kX29mZnNldCkgeworCQkJbWF4b2ZmICs9IDE7CisJCX0gZWxzZSB7CisJCQlvbGRlc3Rfb2ZmID0gZmRwW2lkeF0uZF9vZmZzZXQ7CisJCQlvbGRlc3RfYWdlID0gRy5jdXJfdGltZSAtIGZkcFtpZHhdLmRfcmVjdl90aW1lOworCQkJaWYgKCFnb3RfbmV3ZXN0KSB7CisJCQkJZ290X25ld2VzdCA9IDE7CisJCQkJbmV3ZXN0X29mZiA9IG9sZGVzdF9vZmY7CisJCQkJbmV3ZXN0X2FnZSA9IG9sZGVzdF9hZ2U7CisJCQl9CisJCQl4ID0gb2xkZXN0X29mZiAqIHc7CisJCQl3YXZnICs9IHg7CisJCQl3IC89IDI7CisJCX0KKworCQlpZHggPSAoaWR4IC0gMSkgJiAoTlVNX0RBVEFQT0lOVFMgLSAxKTsKKwl9CisJcC0+ZmlsdGVyX2Rpc3BlcnNpb24gPSBzdW07CisJd2F2ZyArPSB4OyAvKiBhZGQgYW5vdGhlciBvbGRlcjYvNjQgdG8gZm9ybSBvbGRlcjYvMzIgKi8KKwkvKiBGaXggc3lzdGVtYXRpYyB1bmRlcmVzdGltYXRpb24gd2l0aCBsYXJnZSBwb2xsIGludGVydmFscy4KKwkgKiBJbWFnaW5lIHRoYXQgd2Ugc3RpbGwgaGF2ZSBhIGJpdCBvZiB1bmNvcnJlY3RlZCBkcmlmdCwKKwkgKiBhbmQgcG9sbCBpbnRlcnZhbCBpcyBiaWcgKHNheSwgMTAwIHNlYykuIE9mZnNldHMgZm9ybSBhIHByb2dyZXNzaW9uOgorCSAqIDAuMCAwLjEgMC4yIDAuMyAwLjQgMC41IDAuNiAwLjcgLSAwLjcgaXMgbW9zdCByZWNlbnQuCisJICogVGhlIGFsZ29yaXRobSBhYm92ZSBkcm9wcyAwLjAgYW5kIDAuNyBhcyBvdXRsaWVycywKKwkgKiBhbmQgdGhlbiB3ZSBoYXZlIHRoaXMgZXN0aW1hdGlvbiwgfjI1JSBvZmYgZnJvbSAwLjc6CisJICogMC4xLzMyICsgMC4yLzMyICsgMC4zLzE2ICsgMC40LzggKyAwLjUvNCArIDAuNi8yID0gMC41MDMxMjUKKwkgKi8KKwl4ID0gb2xkZXN0X2FnZSAtIG5ld2VzdF9hZ2U7CisJaWYgKHggIT0gMCkgeworCQl4ID0gbmV3ZXN0X2FnZSAvIHg7IC8qIGluIGFib3ZlIGV4YW1wbGUsIDEwMCAvICg2MDAgLSAxMDApICovCisJCWlmICh4IDwgMSkgeyAvKiBwYXJhbm9pYSBjaGVjayAqLworCQkJeCA9IChuZXdlc3Rfb2ZmIC0gb2xkZXN0X29mZikgKiB4OyAvKiAwLjUgKiAxMDAvNTAwID0gMC4xICovCisJCQl3YXZnICs9IHg7CisJCX0KKwl9CisJcC0+ZmlsdGVyX29mZnNldCA9IHdhdmc7CisKKyNlbHNlCisKKwlmZHAgPSBwLT5maWx0ZXJfZGF0YXBvaW50OworCWlkeCA9IHAtPmRhdGFwb2ludF9pZHg7IC8qIG1vc3QgcmVjZW50IGRhdGFwb2ludCdzIGluZGV4ICovCisKKwkvKiBmaWx0ZXJfb2Zmc2V0OiBzaW1wbHkgdXNlIHRoZSBtb3N0IHJlY2VudCB2YWx1ZSAqLworCXAtPmZpbHRlcl9vZmZzZXQgPSBmZHBbaWR4XS5kX29mZnNldDsKKworCS8qICAgICAgICAgICAgICAgICAgICAgbi0xCisJICogICAgICAgICAgICAgICAgICAgICAtLS0gICAgZGlzcGVyc2lvbihpKQorCSAqIGZpbHRlcl9kaXNwZXJzaW9uID0gIFwgICAgIC0tLS0tLS0tLS0tLS0KKwkgKiAgICAgICAgICAgICAgICAgICAgICAvICAgICAgIChpKzEpCisJICogICAgICAgICAgICAgICAgICAgICAtLS0gICAgIDIKKwkgKiAgICAgICAgICAgICAgICAgICAgIGk9MAorCSAqLworCXdhdmcgPSAwOworCXN1bSA9IDA7CisJZm9yIChpID0gMDsgaSA8IE5VTV9EQVRBUE9JTlRTOyBpKyspIHsKKwkJc3VtICs9IGRpc3BlcnNpb24oJmZkcFtpZHhdKSAvICgyIDw8IGkpOworCQl3YXZnICs9IGZkcFtpZHhdLmRfb2Zmc2V0OworCQlpZHggPSAoaWR4IC0gMSkgJiAoTlVNX0RBVEFQT0lOVFMgLSAxKTsKKwl9CisJd2F2ZyAvPSBOVU1fREFUQVBPSU5UUzsKKwlwLT5maWx0ZXJfZGlzcGVyc2lvbiA9IHN1bTsKKyNlbmRpZgorCisJLyogICAgICAgICAgICAgICAgICArLS0tLS0gICAgICAgICAgICAgICAgIC0tLS0tKyBeIDEvMgorCSAqICAgICAgICAgICAgICAgICAgfCAgICAgICBuLTEgICAgICAgICAgICAgICAgIHwKKwkgKiAgICAgICAgICAgICAgICAgIHwgICAgICAgLS0tICAgICAgICAgICAgICAgICB8CisJICogICAgICAgICAgICAgICAgICB8ICAxICAgIFwgICAgICAgICAgICAgICAgMiAgfAorCSAqIGZpbHRlcl9qaXR0ZXIgPSAgfCAtLS0gKiAvICAoYXZnLW9mZnNldF9qKSAgIHwKKwkgKiAgICAgICAgICAgICAgICAgIHwgIG4gICAgLS0tICAgICAgICAgICAgICAgICB8CisJICogICAgICAgICAgICAgICAgICB8ICAgICAgIGo9MCAgICAgICAgICAgICAgICAgfAorCSAqICAgICAgICAgICAgICAgICAgKy0tLS0tICAgICAgICAgICAgICAgICAtLS0tLSsKKwkgKiB3aGVyZSBuIGlzIHRoZSBudW1iZXIgb2YgdmFsaWQgZGF0YXBvaW50cyBpbiB0aGUgZmlsdGVyIChuID4gMSk7CisJICogaWYgZmlsdGVyX2ppdHRlciA8IHByZWNpc2lvbiB0aGVuIGZpbHRlcl9qaXR0ZXIgPSBwcmVjaXNpb24KKwkgKi8KKwlzdW0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBOVU1fREFUQVBPSU5UUzsgaSsrKSB7CisJCXN1bSArPSBTUVVBUkUod2F2ZyAtIGZkcFtpXS5kX29mZnNldCk7CisJfQorCXN1bSA9IFNRUlQoc3VtIC8gTlVNX0RBVEFQT0lOVFMpOworCXAtPmZpbHRlcl9qaXR0ZXIgPSBzdW0gPiBHX3ByZWNpc2lvbl9zZWMgPyBzdW0gOiBHX3ByZWNpc2lvbl9zZWM7CisKKwlWRVJCNCBiYl9lcnJvcl9tc2coImZpbHRlciBvZmZzZXQ6JStmIGRpc3A6JWYgaml0dGVyOiVmIiwKKwkJCXAtPmZpbHRlcl9vZmZzZXQsCisJCQlwLT5maWx0ZXJfZGlzcGVyc2lvbiwKKwkJCXAtPmZpbHRlcl9qaXR0ZXIpOworfQorCitzdGF0aWMgdm9pZAorcmVzZXRfcGVlcl9zdGF0cyhwZWVyX3QgKnAsIGRvdWJsZSBvZmZzZXQpCit7CisJaW50IGk7CisJYm9vbCBzbWFsbF9vZnMgPSBmYWJzKG9mZnNldCkgPCAxNiAqIFNURVBfVEhSRVNIT0xEOworCisJLyogVXNlZCB0byBzZXQgcC0+ZmlsdGVyX2RhdGFwb2ludFtpXS5kX2Rpc3BlcnNpb24gPSBNQVhESVNQCisJICogYW5kIGNsZWFyIHJlYWNoYWJsZSBiaXRzLCBidXQgdGhpcyBwcm92ZWQgdG8gYmUgdG9vIGFncmVzc2l2ZToKKwkgKiBhZnRlciBzdGVwICh0ZXN0ZWQgd2l0aCBzdXNwaW5kaW5nIGxhcHRvcCBmb3IgfjMwIHNlY3MpLAorCSAqIHRoaXMgY2F1c2VkIGFsbCBwcmV2aW91cyBkYXRhIHRvIGJlIGNvbnNpZGVyZWQgaW52YWxpZCwKKwkgKiBtYWtpbmcgdXMgbmVlZGluZyB0byBjb2xsZWN0IGZ1bGwgfjggZGF0YXBvaW5zIHBlciBwZWVyCisJICogYWZ0ZXIgc3RlcCBpbiBvcmRlciB0byBzdGFydCB0cnVzdGluZyB0aGVtLgorCSAqIEluIHR1cm4sIHRoaXMgd2FzIG1ha2luZyBwb2xsIGludGVydmFsIGRlY3JlYXNlIGV2ZW4gYWZ0ZXIKKwkgKiBzdGVwIHdhcyBkb25lLiAoUG9sbCBpbnRlcnZhbCBkZWNyZWFzZXMgYWxyZWFkeSBiZWZvcmUgc3RlcAorCSAqIGluIHRoaXMgc2NlbmFyaW8sIGJlY2F1c2Ugd2Ugc2VlIGxhcmdlIG9mZnNldHMgYW5kIGVuZCB1cCB3aXRoCisJICogbm8gZ29vZCBwZWVyIHRvIHNlbGVjdCkuCisJICovCisKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0RBVEFQT0lOVFM7IGkrKykgeworCQlpZiAoc21hbGxfb2ZzKSB7CisJCQlwLT5maWx0ZXJfZGF0YXBvaW50W2ldLmRfcmVjdl90aW1lICs9IG9mZnNldDsKKwkJCWlmIChwLT5maWx0ZXJfZGF0YXBvaW50W2ldLmRfb2Zmc2V0ICE9IDApIHsKKwkJCQlwLT5maWx0ZXJfZGF0YXBvaW50W2ldLmRfb2Zmc2V0IC09IG9mZnNldDsKKwkJCQkvL2JiX2Vycm9yX21zZygicC0+ZmlsdGVyX2RhdGFwb2ludFslZF0uZF9vZmZzZXQgJWYgLT4gJWYiLAorCQkJCS8vCWksCisJCQkJLy8JcC0+ZmlsdGVyX2RhdGFwb2ludFtpXS5kX29mZnNldCArIG9mZnNldCwKKwkJCQkvLwlwLT5maWx0ZXJfZGF0YXBvaW50W2ldLmRfb2Zmc2V0KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXAtPmZpbHRlcl9kYXRhcG9pbnRbaV0uZF9yZWN2X3RpbWUgID0gRy5jdXJfdGltZTsKKwkJCXAtPmZpbHRlcl9kYXRhcG9pbnRbaV0uZF9vZmZzZXQgICAgID0gMDsKKwkJCS8qcC0+ZmlsdGVyX2RhdGFwb2ludFtpXS5kX2Rpc3BlcnNpb24gPSBNQVhESVNQOyovCisJCX0KKwl9CisJaWYgKHNtYWxsX29mcykgeworCQlwLT5sYXN0cGt0X3JlY3ZfdGltZSArPSBvZmZzZXQ7CisJfSBlbHNlIHsKKwkJLypwLT5yZWFjaGFibGVfYml0cyA9IDA7Ki8KKwkJcC0+bGFzdHBrdF9yZWN2X3RpbWUgPSBHLmN1cl90aW1lOworCX0KKwlmaWx0ZXJfZGF0YXBvaW50cyhwKTsgLyogcmVjYWxjIHAtPmZpbHRlcl94eHggKi8KKwlWRVJCNiBiYl9lcnJvcl9tc2coIiVzLT5sYXN0cGt0X3JlY3ZfdGltZT0lZiIsIHAtPnBfZG90dGVkLCBwLT5sYXN0cGt0X3JlY3ZfdGltZSk7Cit9CisKK3N0YXRpYyB2b2lkCithZGRfcGVlcnMoY29uc3QgY2hhciAqcykKK3sKKwlwZWVyX3QgKnA7CisKKwlwID0geHphbGxvYyhzaXplb2YoKnApKTsKKwlwLT5wX2xzYSA9IHhob3N0MnNvY2thZGRyKHMsIDEyMyk7CisJcC0+cF9kb3R0ZWQgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZF9ub3BvcnQoJnAtPnBfbHNhLT51LnNhKTsKKwlwLT5wX2ZkID0gLTE7CisJcC0+cF94bXRfbXNnLm1fc3RhdHVzID0gTU9ERV9DTElFTlQgfCAoTlRQX1ZFUlNJT04gPDwgMyk7CisJcC0+bmV4dF9hY3Rpb25fdGltZSA9IEcuY3VyX3RpbWU7IC8qID0gc2V0X25leHQocCwgMCk7ICovCisJcmVzZXRfcGVlcl9zdGF0cyhwLCAxNiAqIFNURVBfVEhSRVNIT0xEKTsKKworCWxsaXN0X2FkZF90bygmRy5udHBfcGVlcnMsIHApOworCUcucGVlcl9jbnQrKzsKK30KKworc3RhdGljIGludAorZG9fc2VuZHRvKGludCBmZCwKKwkJY29uc3Qgc3RydWN0IHNvY2thZGRyICpmcm9tLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKnRvLCBzb2NrbGVuX3QgYWRkcmxlbiwKKwkJbXNnX3QgKm1zZywgc3NpemVfdCBsZW4pCit7CisJc3NpemVfdCByZXQ7CisKKwllcnJubyA9IDA7CisJaWYgKCFmcm9tKSB7CisJCXJldCA9IHNlbmR0byhmZCwgbXNnLCBsZW4sIE1TR19ET05UV0FJVCwgdG8sIGFkZHJsZW4pOworCX0gZWxzZSB7CisJCXJldCA9IHNlbmRfdG9fZnJvbShmZCwgbXNnLCBsZW4sIE1TR19ET05UV0FJVCwgdG8sIGZyb20sIGFkZHJsZW4pOworCX0KKwlpZiAocmV0ICE9IGxlbikgeworCQliYl9wZXJyb3JfbXNnKCJzZW5kIGZhaWxlZCIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZAorc2VuZF9xdWVyeV90b19wZWVyKHBlZXJfdCAqcCkKK3sKKwkvKiBXaHkgZG8gd2UgbmVlZCB0byBiaW5kKCk/CisJICogU2VlIHdoYXQgaGFwcGVucyB3aGVuIHdlIGRvbid0IGJpbmQ6CisJICoKKwkgKiBzb2NrZXQoUEZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19JUCkgPSAzCisJICogc2V0c29ja29wdCgzLCBTT0xfSVAsIElQX1RPUywgWzE2XSwgNCkgPSAwCisJICogZ2V0dGltZW9mZGF5KHsxMjU5MDcxMjY2LCAzMjc4ODV9LCBOVUxMKSA9IDAKKwkgKiBzZW5kdG8oMywgInh4eCIsIDQ4LCBNU0dfRE9OVFdBSVQsIHtzYV9mYW1pbHk9QUZfSU5FVCwgc2luX3BvcnQ9aHRvbnMoMTIzKSwgc2luX2FkZHI9aW5ldF9hZGRyKCIxMC4zNC4zMi4xMjUiKX0sIDE2KSA9IDQ4CisJICogXl5eIHdlIHNlbnQgaXQgZnJvbSBzb21lIHNvdXJjZSBwb3J0IHBpY2tlZCBieSBrZXJuZWwuCisJICogdGltZShOVUxMKSAgICAgICAgICAgICAgPSAxMjU5MDcxMjY2CisJICogd3JpdGUoMiwgIm50cGQ6IGVudGVyaW5nIHBvbGwgMTUgc2Vjc1xuIiwgMjgpID0gMjgKKwkgKiBwb2xsKFt7ZmQ9MywgZXZlbnRzPVBPTExJTn1dLCAxLCAxNTAwMCkgPSAxIChbe2ZkPTMsIHJldmVudHM9UE9MTElOfV0pCisJICogcmVjdigzLCAieXl5IiwgNjgsIE1TR19ET05UV0FJVCkgPSA0OAorCSAqIF5eXiB0aGlzIHJlY3Ygd2lsbCByZWNlaXZlIHBhY2tldHMgdG8gYW55IGxvY2FsIHBvcnQhCisJICoKKwkgKiBVbmNvbW1lbnQgdGhpcyBhbmQgdXNlIHN0cmFjZSB0byBzZWUgaXQgaW4gYWN0aW9uOgorCSAqLworI2RlZmluZSBQUk9CRV9MT0NBTF9BRERSIC8qIHsgbGVuX2FuZF9zb2NrYWRkciBsc2E7IGxzYS5sZW4gPSBMU0FfU0laRU9GX1NBOyBnZXRzb2NrbmFtZShwLT5xdWVyeS5mZCwgJmxzYS51LnNhLCAmbHNhLmxlbik7IH0gKi8KKworCWlmIChwLT5wX2ZkID09IC0xKSB7CisJCWludCBmZCwgZmFtaWx5OworCQlsZW5fYW5kX3NvY2thZGRyICpsb2NhbF9sc2E7CisKKwkJZmFtaWx5ID0gcC0+cF9sc2EtPnUuc2Euc2FfZmFtaWx5OworCQlwLT5wX2ZkID0gZmQgPSB4c29ja2V0X3R5cGUoJmxvY2FsX2xzYSwgZmFtaWx5LCBTT0NLX0RHUkFNKTsKKwkJLyogbG9jYWxfbHNhIGhhcyAibnVsbCIgYWRkcmVzcyBhbmQgcG9ydCAwIG5vdy4KKwkJICogYmluZCgpIGVuc3VyZXMgd2UgaGF2ZSBhICpwYXJ0aWN1bGFyIHBvcnQqIHNlbGVjdGVkIGJ5IGtlcm5lbAorCQkgKiBhbmQgcmVtZW1iZXJlZCBpbiBwLT5wX2ZkLCB0aHVzIGxhdGVyIHJlY3YocC0+cF9mZCkKKwkJICogcmVjZWl2ZXMgb25seSBwYWNrZXRzIHNlbnQgdG8gdGhpcyBwb3J0LgorCQkgKi8KKwkJUFJPQkVfTE9DQUxfQUREUgorCQl4YmluZChmZCwgJmxvY2FsX2xzYS0+dS5zYSwgbG9jYWxfbHNhLT5sZW4pOworCQlQUk9CRV9MT0NBTF9BRERSCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCQlpZiAoZmFtaWx5ID09IEFGX0lORVQpCisjZW5kaWYKKwkJCXNldHNvY2tvcHRfaW50KGZkLCBJUFBST1RPX0lQLCBJUF9UT1MsIElQVE9TX0xPV0RFTEFZKTsKKwkJZnJlZShsb2NhbF9sc2EpOworCX0KKworCS8qIEVtaXQgbWVzc2FnZSBfYmVmb3JlXyBhdHRlbXB0ZWQgc2VuZC4gVGhpbmsgb2YgYSB2ZXJ5IHNob3J0CisJICogcm91bmR0cmlwIG5ldHdvcmtzOiB3ZSBuZWVkIHRvIGdvIGJhY2sgdG8gcmVjdiBsb29wIEFTQVAsCisJICogdG8gcmVkdWNlIGRlbGF5LiBQcmludGluZyBtZXNzYWdlcyBhZnRlciBzZW5kIHdvcmtzIGFnYWluc3QgdGhhdC4KKwkgKi8KKwlWRVJCMSBiYl9lcnJvcl9tc2coInNlbmRpbmcgcXVlcnkgdG8gJXMiLCBwLT5wX2RvdHRlZCk7CisKKwkvKgorCSAqIFNlbmQgb3V0IGEgcmFuZG9tIDY0LWJpdCBudW1iZXIgYXMgb3VyIHRyYW5zbWl0IHRpbWUuICBUaGUgTlRQCisJICogc2VydmVyIHdpbGwgY29weSBzYWlkIG51bWJlciBpbnRvIHRoZSBvcmlnaW5hdGUgZmllbGQgb24gdGhlCisJICogcmVzcG9uc2UgdGhhdCBpdCBzZW5kcyB1cy4gIFRoaXMgaXMgdG90YWxseSBsZWdhbCBwZXIgdGhlIFNOVFAgc3BlYy4KKwkgKgorCSAqIFRoZSBpbXBhY3Qgb2YgdGhpcyBpcyB0d28gZm9sZDogd2Ugbm8gbG9uZ2VyIHNlbmQgb3V0IHRoZSBjdXJyZW50CisJICogc3lzdGVtIHRpbWUgZm9yIHRoZSB3b3JsZCB0byBzZWUgKHdoaWNoIG1heSBhaWQgYW4gYXR0YWNrZXIpLCBhbmQKKwkgKiBpdCBnaXZlcyB1cyBhIChub3QgdmVyeSBzZWN1cmUpIHdheSBvZiBrbm93aW5nIHRoYXQgd2UncmUgbm90CisJICogZ2V0dGluZyBzcG9vZmVkIGJ5IGFuIGF0dGFja2VyIHRoYXQgY2FuJ3QgY2FwdHVyZSBvdXIgdHJhZmZpYworCSAqIGJ1dCBjYW4gc3Bvb2YgcGFja2V0cyBmcm9tIHRoZSBOVFAgc2VydmVyIHdlJ3JlIGNvbW11bmljYXRpbmcgd2l0aC4KKwkgKgorCSAqIFNhdmUgdGhlIHJlYWwgdHJhbnNtaXQgdGltZXN0YW1wIGxvY2FsbHkuCisJICovCisJcC0+cF94bXRfbXNnLm1feG10dGltZS5pbnRfcGFydGwgPSByYW5kKCk7CisJcC0+cF94bXRfbXNnLm1feG10dGltZS5mcmFjdGlvbmwgPSByYW5kKCk7CisJcC0+cF94bXR0aW1lID0gZ2V0dGltZTE5MDBkKCk7CisKKwkvKiBXZXJlIGRvaW5nIGl0IG9ubHkgaWYgc2VuZHRvIHdvcmtlZCwgYnV0CisJICogbG9zcyBvZiBzeW5jIGRldGVjdGlvbiBuZWVkcyByZWFjaGFibGVfYml0cyB1cGRhdGVkCisJICogZXZlbiBpZiBzZW5kaW5nIGZhaWxzICpsb2NhbGx5KjoKKwkgKiAibmV0d29yayBpcyB1bnJlYWNoYWJsZSIgYmVjYXVzZSBjYWJsZSB3YXMgcHVsbGVkPworCSAqIFdlIHN0aWxsIG5lZWQgdG8gZGVjbGFyZSAidW5zeW5jIiBpZiB0aGlzIGNvbmRpdGlvbiBwZXJzaXN0cy4KKwkgKi8KKwlwLT5yZWFjaGFibGVfYml0cyA8PD0gMTsKKworCWlmIChkb19zZW5kdG8ocC0+cF9mZCwgLypmcm9tOiovIE5VTEwsIC8qdG86Ki8gJnAtPnBfbHNhLT51LnNhLCAvKmFkZHJsZW46Ki8gcC0+cF9sc2EtPmxlbiwKKwkJCSZwLT5wX3htdF9tc2csIE5UUF9NU0dTSVpFX05PQVVUSCkgPT0gLTEKKwkpIHsKKwkJY2xvc2UocC0+cF9mZCk7CisJCXAtPnBfZmQgPSAtMTsKKwkJLyoKKwkJICogV2Uga25vdyB0aGF0IHdlIHNlbnQgbm90aGluZy4KKwkJICogV2UgY2FuIHJldHJ5ICpzb29uKiB3aXRob3V0IGZlYXJpbmcKKwkJICogdGhhdCB3ZSBhcmUgZmxvb2RpbmcgdGhlIHBlZXIuCisJCSAqLworCQlzZXRfbmV4dChwLCBSRVRSWV9JTlRFUlZBTCk7CisJCXJldHVybjsKKwl9CisKKwlzZXRfbmV4dChwLCBSRVNQT05TRV9JTlRFUlZBTCk7Cit9CisKKworLyogTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHByb3Zpc2lvbiB0byBwcmV2ZW50IHNldmVyYWwgcnVuX3NjcmlwdHMKKyAqIHRvIGJlIHN0YXJ0ZWQgaW4gcXVpY2sgc3VjY2Vzc2lvbi4gSW4gZmFjdCwgaXQgaGFwcGVucyByYXRoZXIgb2Z0ZW4KKyAqIGlmIGluaXRpYWwgc3luY3Jvbml6YXRpb24gcmVzdWx0cyBpbiBhIHN0ZXAuCisgKiBZb3Ugd2lsbCBzZWUgInN0ZXAiIGFuZCB0aGVuICJzdHJhdHVtIiBzY3JpcHQgcnVucywgc29tZXRpbWVzCisgKiBhcyBjbG9zZSBhcyBvbmx5IDAuMDAyIHNlY29uZHMgYXBhcnQuCisgKiBTY3JpcHQgc2hvdWxkIGJlIHJlYWR5IHRvIGRlYWwgd2l0aCB0aGlzLgorICovCitzdGF0aWMgdm9pZCBydW5fc2NyaXB0KGNvbnN0IGNoYXIgKmFjdGlvbiwgZG91YmxlIG9mZnNldCkKK3sKKwljaGFyICphcmd2WzNdOworCWNoYXIgKmVudjEsICplbnYyLCAqZW52MywgKmVudjQ7CisKKwlHLmxhc3Rfc2NyaXB0X3J1biA9IEcuY3VyX3RpbWU7CisKKwlpZiAoIUcuc2NyaXB0X25hbWUpCisJCXJldHVybjsKKworCWFyZ3ZbMF0gPSAoY2hhciopIEcuc2NyaXB0X25hbWU7CisJYXJndlsxXSA9IChjaGFyKikgYWN0aW9uOworCWFyZ3ZbMl0gPSBOVUxMOworCisJVkVSQjEgYmJfZXJyb3JfbXNnKCJleGVjdXRpbmcgJyVzICVzJyIsIEcuc2NyaXB0X25hbWUsIGFjdGlvbik7CisKKwllbnYxID0geGFzcHJpbnRmKCIlcz0ldSIsICJzdHJhdHVtIiwgRy5zdHJhdHVtKTsKKwlwdXRlbnYoZW52MSk7CisJZW52MiA9IHhhc3ByaW50ZigiJXM9JWxkIiwgImZyZXFfZHJpZnRfcHBtIiwgRy5rZXJuZWxfZnJlcV9kcmlmdCk7CisJcHV0ZW52KGVudjIpOworCWVudjMgPSB4YXNwcmludGYoIiVzPSV1IiwgInBvbGxfaW50ZXJ2YWwiLCAxIDw8IEcucG9sbF9leHApOworCXB1dGVudihlbnYzKTsKKwllbnY0ID0geGFzcHJpbnRmKCIlcz0lZiIsICJvZmZzZXQiLCBvZmZzZXQpOworCXB1dGVudihlbnY0KTsKKwkvKiBPdGhlciBpdGVtcyBvZiBwb3RlbnRpYWwgaW50ZXJlc3Q6IHNlbGVjdGVkIHBlZXIsCisJICogcm9vdGRlbGF5LCByZWZ0aW1lLCByb290ZGlzcCwgcmVmaWQsIG50cF9zdGF0dXMsCisJICogbGFzdF91cGRhdGVfb2Zmc2V0LCBsYXN0X3VwZGF0ZV9yZWN2X3RpbWUsIGRpc2NpcGxpbmVfaml0dGVyLAorCSAqIGhvdyBtYW55IHBlZXJzIGhhdmUgcmVhY2hhYmxlX2JpdHMgPSAwPworCSAqLworCisJLyogRG9uJ3Qgd2FudCB0byB3YWl0OiBpdCBtYXkgcnVuIGh3Y2xvY2sgLS1zeXN0b2hjLCBhbmQgdGhhdAorCSAqIG1heSB0YWtlIHNvbWUgdGltZSAoc2Vjb25kcyk6ICovCisJLypzcGF3bl9hbmRfd2FpdChhcmd2KTsqLworCXNwYXduKGFyZ3YpOworCisJdW5zZXRlbnYoInN0cmF0dW0iKTsKKwl1bnNldGVudigiZnJlcV9kcmlmdF9wcG0iKTsKKwl1bnNldGVudigicG9sbF9pbnRlcnZhbCIpOworCXVuc2V0ZW52KCJvZmZzZXQiKTsKKwlmcmVlKGVudjEpOworCWZyZWUoZW52Mik7CisJZnJlZShlbnYzKTsKKwlmcmVlKGVudjQpOworfQorCitzdGF0aWMgTk9JTkxJTkUgdm9pZAorc3RlcF90aW1lKGRvdWJsZSBvZmZzZXQpCit7CisJbGxpc3RfdCAqaXRlbTsKKwlkb3VibGUgZHRpbWU7CisJc3RydWN0IHRpbWV2YWwgdHZjLCB0dm47CisJY2hhciBidWZbc2l6ZW9mKCJ5eXl5LW1tLWRkIGhoOm1tOnNzIikgKyAvKnBhcmFub2lhOiovIDRdOworCXRpbWVfdCB0dmFsOworCisJZ2V0dGltZW9mZGF5KCZ0dmMsIE5VTEwpOyAvKiBuZXZlciBmYWlscyAqLworCWR0aW1lID0gdHZjLnR2X3NlYyArICgxLjBlLTYgKiB0dmMudHZfdXNlYykgKyBvZmZzZXQ7CisJZF90b190dihkdGltZSwgJnR2bik7CisJaWYgKHNldHRpbWVvZmRheSgmdHZuLCBOVUxMKSA9PSAtMSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZXR0aW1lb2ZkYXkiKTsKKworCVZFUkIyIHsKKwkJdHZhbCA9IHR2Yy50dl9zZWM7CisJCXN0cmZ0aW1lX1lZWVlNTURESEhNTVNTKGJ1Ziwgc2l6ZW9mKGJ1ZiksICZ0dmFsKTsKKwkJYmJfZXJyb3JfbXNnKCJjdXJyZW50IHRpbWUgaXMgJXMuJTA2dSIsIGJ1ZiwgKHVuc2lnbmVkKXR2Yy50dl91c2VjKTsKKwl9CisJdHZhbCA9IHR2bi50dl9zZWM7CisJc3RyZnRpbWVfWVlZWU1NRERISE1NU1MoYnVmLCBzaXplb2YoYnVmKSwgJnR2YWwpOworCWJiX2Vycm9yX21zZygic2V0dGluZyB0aW1lIHRvICVzLiUwNnUgKG9mZnNldCAlK2ZzKSIsIGJ1ZiwgKHVuc2lnbmVkKXR2bi50dl91c2VjLCBvZmZzZXQpOworCisJLyogQ29ycmVjdCB2YXJpb3VzIGZpZWxkcyB3aGljaCBjb250YWluIHRpbWUtcmVsYXRpdmUgdmFsdWVzOiAqLworCisJLyogR2xvYmFsczogKi8KKwlHLmN1cl90aW1lICs9IG9mZnNldDsKKwlHLmxhc3RfdXBkYXRlX3JlY3ZfdGltZSArPSBvZmZzZXQ7CisJRy5sYXN0X3NjcmlwdF9ydW4gKz0gb2Zmc2V0OworCisJLyogcC0+bGFzdHBrdF9yZWN2X3RpbWUsIHAtPm5leHRfYWN0aW9uX3RpbWUgYW5kIHN1Y2g6ICovCisJZm9yIChpdGVtID0gRy5udHBfcGVlcnM7IGl0ZW0gIT0gTlVMTDsgaXRlbSA9IGl0ZW0tPmxpbmspIHsKKwkJcGVlcl90ICpwcCA9IChwZWVyX3QgKikgaXRlbS0+ZGF0YTsKKwkJcmVzZXRfcGVlcl9zdGF0cyhwcCwgb2Zmc2V0KTsKKwkJLy9iYl9lcnJvcl9tc2coIm9mZnNldDolK2YgcHAtPm5leHRfYWN0aW9uX3RpbWU6JWYgLT4gJWYiLAorCQkvLwlvZmZzZXQsIHBwLT5uZXh0X2FjdGlvbl90aW1lLCBwcC0+bmV4dF9hY3Rpb25fdGltZSArIG9mZnNldCk7CisJCXBwLT5uZXh0X2FjdGlvbl90aW1lICs9IG9mZnNldDsKKwkJaWYgKHBwLT5wX2ZkID49IDApIHsKKwkJCS8qIFdlIHdhaXQgZm9yIHJlcGx5IGZyb20gdGhpcyBwZWVyIHRvby4KKwkJCSAqIEJ1dCBkdWUgdG8gc3RlcCB3ZSBhcmUgZG9pbmcsIHJlcGx5J3MgZGF0YSBpcyBubyBsb25nZXIKKwkJCSAqIHVzZWZ1bCAoaW4gZmFjdCwgaXQnbGwgYmUgYm9ndXMpLiBTdG9wIHdhaXRpbmcgZm9yIGl0LgorCQkJICovCisJCQljbG9zZShwcC0+cF9mZCk7CisJCQlwcC0+cF9mZCA9IC0xOworCQkJc2V0X25leHQocHAsIFJFVFJZX0lOVEVSVkFMKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgY2xhbXBfcG9sbGV4cF9hbmRfc2V0X01BWFNUUkFUKHZvaWQpCit7CisJaWYgKEcucG9sbF9leHAgPCBNSU5QT0xMKQorCQlHLnBvbGxfZXhwID0gTUlOUE9MTDsKKwlpZiAoRy5wb2xsX2V4cCA+IEJJR1BPTEwpCisJCUcucG9sbF9leHAgPSBCSUdQT0xMOworCUcucG9sbGFkal9jb3VudCA9IDA7CisJRy5zdHJhdHVtID0gTUFYU1RSQVQ7Cit9CisKKworLyoKKyAqIFNlbGVjdGlvbiBhbmQgY2x1c3RlcmluZywgYW5kIHRoZWlyIGhlbHBlcnMKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXBlZXJfdCAqcDsKKwlpbnQgICAgdHlwZTsKKwlkb3VibGUgZWRnZTsKKwlkb3VibGUgb3B0X3JkOyAvKiBvcHRpbWl6YXRpb24gKi8KK30gcG9pbnRfdDsKK3N0YXRpYyBpbnQKK2NvbXBhcmVfcG9pbnRfZWRnZShjb25zdCB2b2lkICphYSwgY29uc3Qgdm9pZCAqYmIpCit7CisJY29uc3QgcG9pbnRfdCAqYSA9IGFhOworCWNvbnN0IHBvaW50X3QgKmIgPSBiYjsKKwlpZiAoYS0+ZWRnZSA8IGItPmVkZ2UpIHsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gKGEtPmVkZ2UgPiBiLT5lZGdlKTsKK30KK3R5cGVkZWYgc3RydWN0IHsKKwlwZWVyX3QgKnA7CisJZG91YmxlIG1ldHJpYzsKK30gc3Vydml2b3JfdDsKK3N0YXRpYyBpbnQKK2NvbXBhcmVfc3Vydml2b3JfbWV0cmljKGNvbnN0IHZvaWQgKmFhLCBjb25zdCB2b2lkICpiYikKK3sKKwljb25zdCBzdXJ2aXZvcl90ICphID0gYWE7CisJY29uc3Qgc3Vydml2b3JfdCAqYiA9IGJiOworCWlmIChhLT5tZXRyaWMgPCBiLT5tZXRyaWMpIHsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gKGEtPm1ldHJpYyA+IGItPm1ldHJpYyk7Cit9CitzdGF0aWMgaW50CitmaXQocGVlcl90ICpwLCBkb3VibGUgcmQpCit7CisJaWYgKChwLT5yZWFjaGFibGVfYml0cyAmIChwLT5yZWFjaGFibGVfYml0cy0xKSkgPT0gMCkgeworCQkvKiBPbmUgb3IgemVybyBiaXRzIGluIHJlYWNoYWJsZV9iaXRzICovCisJCVZFUkI0IGJiX2Vycm9yX21zZygicGVlciAlcyB1bmZpdCBmb3Igc2VsZWN0aW9uOiB1bnJlYWNoYWJsZSIsIHAtPnBfZG90dGVkKTsKKwkJcmV0dXJuIDA7CisJfQorI2lmIDAgLyogd2UgZmlsdGVyIG91dCBzdWNoIHBhY2tldHMgZWFybGllciAqLworCWlmICgocC0+bGFzdHBrdF9zdGF0dXMgJiBMSV9BTEFSTSkgPT0gTElfQUxBUk0KKwkgfHwgcC0+bGFzdHBrdF9zdHJhdHVtID49IE1BWFNUUkFUCisJKSB7CisJCVZFUkI0IGJiX2Vycm9yX21zZygicGVlciAlcyB1bmZpdCBmb3Igc2VsZWN0aW9uOiBiYWQgc3RhdHVzL3N0cmF0dW0iLCBwLT5wX2RvdHRlZCk7CisJCXJldHVybiAwOworCX0KKyNlbmRpZgorCS8qIHJkIGlzIHJvb3RfZGlzdGFuY2UocCkgKi8KKwlpZiAocmQgPiBNQVhESVNUICsgRlJFUV9UT0xFUkFOQ0UgKiAoMSA8PCBHLnBvbGxfZXhwKSkgeworCQlWRVJCNCBiYl9lcnJvcl9tc2coInBlZXIgJXMgdW5maXQgZm9yIHNlbGVjdGlvbjogcm9vdCBkaXN0YW5jZSB0b28gaGlnaCIsIHAtPnBfZG90dGVkKTsKKwkJcmV0dXJuIDA7CisJfQorLy9UT0RPCisvLwkvKiBEbyB3ZSBoYXZlIGEgbG9vcD8gKi8KKy8vCWlmIChwLT5yZWZpZCA9PSBwLT5kc3RhZGRyIHx8IHAtPnJlZmlkID09IHMucmVmaWQpCisvLwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CitzdGF0aWMgcGVlcl90Kgorc2VsZWN0X2FuZF9jbHVzdGVyKHZvaWQpCit7CisJcGVlcl90ICAgICAqcDsKKwlsbGlzdF90ICAgICppdGVtOworCWludCAgICAgICAgaSwgajsKKwlpbnQgICAgICAgIHNpemUgPSAzICogRy5wZWVyX2NudDsKKwkvKiBmb3Igc2VsZWN0aW9uIGFsZ29yaXRobSAqLworCXBvaW50X3QgICAgcG9pbnRbc2l6ZV07CisJdW5zaWduZWQgICBudW1fcG9pbnRzLCBudW1fY2FuZGlkYXRlczsKKwlkb3VibGUgICAgIGxvdywgaGlnaDsKKwl1bnNpZ25lZCAgIG51bV9mYWxzZXRpY2tlcnM7CisJLyogZm9yIGNsdXN0ZXIgYWxnb3JpdGhtICovCisJc3Vydml2b3JfdCBzdXJ2aXZvcltzaXplXTsKKwl1bnNpZ25lZCAgIG51bV9zdXJ2aXZvcnM7CisKKwkvKiBTZWxlY3Rpb24gKi8KKworCW51bV9wb2ludHMgPSAwOworCWl0ZW0gPSBHLm50cF9wZWVyczsKKwl3aGlsZSAoaXRlbSAhPSBOVUxMKSB7CisJCWRvdWJsZSByZCwgb2Zmc2V0OworCisJCXAgPSAocGVlcl90ICopIGl0ZW0tPmRhdGE7CisJCXJkID0gcm9vdF9kaXN0YW5jZShwKTsKKwkJb2Zmc2V0ID0gcC0+ZmlsdGVyX29mZnNldDsKKwkJaWYgKCFmaXQocCwgcmQpKSB7CisJCQlpdGVtID0gaXRlbS0+bGluazsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJVkVSQjUgYmJfZXJyb3JfbXNnKCJpbnRlcnZhbDogWyVmICVmICVmXSAlcyIsCisJCQkJb2Zmc2V0IC0gcmQsCisJCQkJb2Zmc2V0LAorCQkJCW9mZnNldCArIHJkLAorCQkJCXAtPnBfZG90dGVkCisJCSk7CisJCXBvaW50W251bV9wb2ludHNdLnAgPSBwOworCQlwb2ludFtudW1fcG9pbnRzXS50eXBlID0gLTE7CisJCXBvaW50W251bV9wb2ludHNdLmVkZ2UgPSBvZmZzZXQgLSByZDsKKwkJcG9pbnRbbnVtX3BvaW50c10ub3B0X3JkID0gcmQ7CisJCW51bV9wb2ludHMrKzsKKwkJcG9pbnRbbnVtX3BvaW50c10ucCA9IHA7CisJCXBvaW50W251bV9wb2ludHNdLnR5cGUgPSAwOworCQlwb2ludFtudW1fcG9pbnRzXS5lZGdlID0gb2Zmc2V0OworCQlwb2ludFtudW1fcG9pbnRzXS5vcHRfcmQgPSByZDsKKwkJbnVtX3BvaW50cysrOworCQlwb2ludFtudW1fcG9pbnRzXS5wID0gcDsKKwkJcG9pbnRbbnVtX3BvaW50c10udHlwZSA9IDE7CisJCXBvaW50W251bV9wb2ludHNdLmVkZ2UgPSBvZmZzZXQgKyByZDsKKwkJcG9pbnRbbnVtX3BvaW50c10ub3B0X3JkID0gcmQ7CisJCW51bV9wb2ludHMrKzsKKwkJaXRlbSA9IGl0ZW0tPmxpbms7CisJfQorCW51bV9jYW5kaWRhdGVzID0gbnVtX3BvaW50cyAvIDM7CisJaWYgKG51bV9jYW5kaWRhdGVzID09IDApIHsKKwkJVkVSQjMgYmJfZXJyb3JfbXNnKCJubyB2YWxpZCBkYXRhcG9pbnRzJXMiLCAiLCBubyBwZWVyIHNlbGVjdGVkIik7CisJCXJldHVybiBOVUxMOworCX0KKy8vVE9ETzogc29ydGluZyBkb2VzIG5vdCBzZWVtIHRvIGJlIGRvbmUgaW4gcmVmZXJlbmNlIGNvZGUKKwlxc29ydChwb2ludCwgbnVtX3BvaW50cywgc2l6ZW9mKHBvaW50WzBdKSwgY29tcGFyZV9wb2ludF9lZGdlKTsKKworCS8qIFN0YXJ0IHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGVyZSBhcmUgbm8gZmFsc2V0aWNrZXJzLgorCSAqIEF0dGVtcHQgdG8gZmluZCBhIG5vbmVtcHR5IGludGVyc2VjdGlvbiBpbnRlcnZhbCBjb250YWluaW5nCisJICogdGhlIG1pZHBvaW50cyBvZiBhbGwgdHJ1ZWNoaW1lcnMuCisJICogSWYgYSBub25lbXB0eSBpbnRlcnZhbCBjYW5ub3QgYmUgZm91bmQsIGluY3JlYXNlIHRoZSBudW1iZXIKKwkgKiBvZiBhc3N1bWVkIGZhbHNldGlja2VycyBieSBvbmUgYW5kIHRyeSBhZ2Fpbi4KKwkgKiBJZiBhIG5vbmVtcHR5IGludGVydmFsIGlzIGZvdW5kIGFuZCB0aGUgbnVtYmVyIG9mIGZhbHNldGlja2VycworCSAqIGlzIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHRydWVjaGltZXJzLCBhIG1ham9yaXR5IGhhcyBiZWVuIGZvdW5kCisJICogYW5kIHRoZSBtaWRwb2ludCBvZiBlYWNoIHRydWVjaGltZXIgcmVwcmVzZW50cworCSAqIHRoZSBjYW5kaWRhdGVzIGF2YWlsYWJsZSB0byB0aGUgY2x1c3RlciBhbGdvcml0aG0uCisJICovCisJbnVtX2ZhbHNldGlja2VycyA9IDA7CisJd2hpbGUgKDEpIHsKKwkJaW50IGM7CisJCXVuc2lnbmVkIG51bV9taWRwb2ludHMgPSAwOworCisJCWxvdyA9IDEgPDwgOTsKKwkJaGlnaCA9IC0gKDEgPDwgOSk7CisJCWMgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3BvaW50czsgaSsrKSB7CisJCQkvKiBXZSB3YW50IHRvIGRvOgorCQkJICogaWYgKHBvaW50W2ldLnR5cGUgPT0gLTEpIGMrKzsKKwkJCSAqIGlmIChwb2ludFtpXS50eXBlID09IDEpIGMtLTsKKwkJCSAqIGFuZCBpdCdzIHNpbXBsZXIgdG8gZG8gaXQgdGhpcyB3YXk6CisJCQkgKi8KKwkJCWMgLT0gcG9pbnRbaV0udHlwZTsKKwkJCWlmIChjID49IG51bV9jYW5kaWRhdGVzIC0gbnVtX2ZhbHNldGlja2VycykgeworCQkJCS8qIElmIGl0IHdhcyBjKysgYW5kIGl0IGdvdCBiaWcgZW5vdWdoLi4uICovCisJCQkJbG93ID0gcG9pbnRbaV0uZWRnZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChwb2ludFtpXS50eXBlID09IDApCisJCQkJbnVtX21pZHBvaW50cysrOworCQl9CisJCWMgPSAwOworCQlmb3IgKGkgPSBudW1fcG9pbnRzLTE7IGkgPj0gMDsgaS0tKSB7CisJCQljICs9IHBvaW50W2ldLnR5cGU7CisJCQlpZiAoYyA+PSBudW1fY2FuZGlkYXRlcyAtIG51bV9mYWxzZXRpY2tlcnMpIHsKKwkJCQloaWdoID0gcG9pbnRbaV0uZWRnZTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChwb2ludFtpXS50eXBlID09IDApCisJCQkJbnVtX21pZHBvaW50cysrOworCQl9CisJCS8qIElmIHRoZSBudW1iZXIgb2YgbWlkcG9pbnRzIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyCisJCSAqIG9mIGFsbG93ZWQgZmFsc2V0aWNrZXJzLCB0aGUgaW50ZXJzZWN0aW9uIGNvbnRhaW5zIGF0CisJCSAqIGxlYXN0IG9uZSB0cnVlY2hpbWVyIHdpdGggbm8gbWlkcG9pbnQgLSBiYWQuCisJCSAqIEFsc28sIGludGVydmFsIHNob3VsZCBiZSBub25lbXB0eS4KKwkJICovCisJCWlmIChudW1fbWlkcG9pbnRzIDw9IG51bV9mYWxzZXRpY2tlcnMgJiYgbG93IDwgaGlnaCkKKwkJCWJyZWFrOworCQludW1fZmFsc2V0aWNrZXJzKys7CisJCWlmIChudW1fZmFsc2V0aWNrZXJzICogMiA+PSBudW1fY2FuZGlkYXRlcykgeworCQkJVkVSQjMgYmJfZXJyb3JfbXNnKCJmYWxzZXRpY2tlcnM6JWQsIGNhbmRpZGF0ZXM6JWQlcyIsCisJCQkJCW51bV9mYWxzZXRpY2tlcnMsIG51bV9jYW5kaWRhdGVzLAorCQkJCQkiLCBubyBwZWVyIHNlbGVjdGVkIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCX0KKwlWRVJCNCBiYl9lcnJvcl9tc2coInNlbGVjdGVkIGludGVydmFsOiBbJWYsICVmXTsgY2FuZGlkYXRlczolZCBmYWxzZXRpY2tlcnM6JWQiLAorCQkJbG93LCBoaWdoLCBudW1fY2FuZGlkYXRlcywgbnVtX2ZhbHNldGlja2Vycyk7CisKKwkvKiBDbHVzdGVyaW5nICovCisKKwkvKiBDb25zdHJ1Y3QgYSBsaXN0IG9mIHN1cnZpdm9ycyAocCwgbWV0cmljKQorCSAqIGZyb20gdGhlIGNoaW1lIGxpc3QsIHdoZXJlIG1ldHJpYyBpcyBkb21pbmF0ZWQKKwkgKiBmaXJzdCBieSBzdHJhdHVtIGFuZCB0aGVuIGJ5IHJvb3QgZGlzdGFuY2UuCisJICogQWxsIG90aGVyIHRoaW5ncyBiZWluZyBlcXVhbCwgdGhpcyBpcyB0aGUgb3JkZXIgb2YgcHJlZmVyZW5jZS4KKwkgKi8KKwludW1fc3Vydml2b3JzID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX3BvaW50czsgaSsrKSB7CisJCWlmIChwb2ludFtpXS5lZGdlIDwgbG93IHx8IHBvaW50W2ldLmVkZ2UgPiBoaWdoKQorCQkJY29udGludWU7CisJCXAgPSBwb2ludFtpXS5wOworCQlzdXJ2aXZvcltudW1fc3Vydml2b3JzXS5wID0gcDsKKwkJLyogeC5vcHRfcmQgPT0gcm9vdF9kaXN0YW5jZShwKTsgKi8KKwkJc3Vydml2b3JbbnVtX3N1cnZpdm9yc10ubWV0cmljID0gTUFYRElTVCAqIHAtPmxhc3Rwa3Rfc3RyYXR1bSArIHBvaW50W2ldLm9wdF9yZDsKKwkJVkVSQjUgYmJfZXJyb3JfbXNnKCJzdXJ2aXZvclslZF0gbWV0cmljOiVmIHBlZXI6JXMiLAorCQkJbnVtX3N1cnZpdm9ycywgc3Vydml2b3JbbnVtX3N1cnZpdm9yc10ubWV0cmljLCBwLT5wX2RvdHRlZCk7CisJCW51bV9zdXJ2aXZvcnMrKzsKKwl9CisJLyogVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBNSU5fU0VMRUNURUQgc3Vydml2b3JzIHRvIHNhdGlzZnkgdGhlCisJICogY29ycmVjdG5lc3MgYXNzZXJ0aW9ucy4gT3JkaW5hcmlseSwgdGhlIEJ5emFudGluZSBjcml0ZXJpYQorCSAqIHJlcXVpcmUgZm91ciBzdXJ2aXZvcnMsIGJ1dCBmb3IgdGhlIGRlbW9uc3RyYXRpb24gaGVyZSwgb25lCisJICogaXMgYWNjZXB0YWJsZS4KKwkgKi8KKwlpZiAobnVtX3N1cnZpdm9ycyA8IE1JTl9TRUxFQ1RFRCkgeworCQlWRVJCMyBiYl9lcnJvcl9tc2coInN1cnZpdm9yczolZCVzIiwKKwkJCQludW1fc3Vydml2b3JzLAorCQkJCSIsIG5vIHBlZXIgc2VsZWN0ZWQiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisvL2xvb2tzIGxpa2UgdGhpcyBpcyBPTkxZIHVzZWQgYnkgdGhlIGZhY3QgdGhhdCBsYXRlciB3ZSBwaWNrIHN1cnZpdm9yWzBdLgorLy93ZSBjYW4gYXZvaWQgc29ydGluZyB0aGVuLCBqdXN0IGZpbmQgdGhlIG1pbmltdW0gb25jZSEKKwlxc29ydChzdXJ2aXZvciwgbnVtX3N1cnZpdm9ycywgc2l6ZW9mKHN1cnZpdm9yWzBdKSwgY29tcGFyZV9zdXJ2aXZvcl9tZXRyaWMpOworCisJLyogRm9yIGVhY2ggYXNzb2NpYXRpb24gcCBpbiB0dXJuLCBjYWxjdWxhdGUgdGhlIHNlbGVjdGlvbgorCSAqIGppdHRlciBwLT5zaml0dGVyIGFzIHRoZSBzcXVhcmUgcm9vdCBvZiB0aGUgc3VtIG9mIHNxdWFyZXMKKwkgKiAocC0+b2Zmc2V0IC0gcS0+b2Zmc2V0KSBvdmVyIGFsbCBxIGFzc29jaWF0aW9ucy4gVGhlIGlkZWEgaXMKKwkgKiB0byByZXBlYXRlZGx5IGRpc2NhcmQgdGhlIHN1cnZpdm9yIHdpdGggbWF4aW11bSBzZWxlY3Rpb24KKwkgKiBqaXR0ZXIgdW50aWwgYSB0ZXJtaW5hdGlvbiBjb25kaXRpb24gaXMgbWV0LgorCSAqLworCXdoaWxlICgxKSB7CisJCXVuc2lnbmVkIG1heF9pZHggPSBtYXhfaWR4OworCQlkb3VibGUgbWF4X3NlbGVjdGlvbl9qaXR0ZXIgPSBtYXhfc2VsZWN0aW9uX2ppdHRlcjsKKwkJZG91YmxlIG1pbl9qaXR0ZXIgPSBtaW5faml0dGVyOworCisJCWlmIChudW1fc3Vydml2b3JzIDw9IE1JTl9DTFVTVEVSRUQpIHsKKwkJCVZFUkI0IGJiX2Vycm9yX21zZygibnVtX3N1cnZpdm9ycyAlZCA8PSAlZCwgbm90IGRpc2NhcmRpbmcgbW9yZSIsCisJCQkJCW51bV9zdXJ2aXZvcnMsIE1JTl9DTFVTVEVSRUQpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBUbyBtYWtlIHN1cmUgYSBmZXcgc3Vydml2b3JzIGFyZSBsZWZ0CisJCSAqIGZvciB0aGUgY2x1c3RlcmluZyBhbGdvcml0aG0gdG8gY2hldyBvbiwKKwkJICogd2Ugc3RvcCBpZiB0aGUgbnVtYmVyIG9mIHN1cnZpdm9ycworCQkgKiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gTUlOX0NMVVNURVJFRCAoMykuCisJCSAqLworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3N1cnZpdm9yczsgaSsrKSB7CisJCQlkb3VibGUgc2VsZWN0aW9uX2ppdHRlcl9zcTsKKworCQkJcCA9IHN1cnZpdm9yW2ldLnA7CisJCQlpZiAoaSA9PSAwIHx8IHAtPmZpbHRlcl9qaXR0ZXIgPCBtaW5faml0dGVyKQorCQkJCW1pbl9qaXR0ZXIgPSBwLT5maWx0ZXJfaml0dGVyOworCisJCQlzZWxlY3Rpb25faml0dGVyX3NxID0gMDsKKwkJCWZvciAoaiA9IDA7IGogPCBudW1fc3Vydml2b3JzOyBqKyspIHsKKwkJCQlwZWVyX3QgKnEgPSBzdXJ2aXZvcltqXS5wOworCQkJCXNlbGVjdGlvbl9qaXR0ZXJfc3EgKz0gU1FVQVJFKHAtPmZpbHRlcl9vZmZzZXQgLSBxLT5maWx0ZXJfb2Zmc2V0KTsKKwkJCX0KKwkJCWlmIChpID09IDAgfHwgc2VsZWN0aW9uX2ppdHRlcl9zcSA+IG1heF9zZWxlY3Rpb25faml0dGVyKSB7CisJCQkJbWF4X3NlbGVjdGlvbl9qaXR0ZXIgPSBzZWxlY3Rpb25faml0dGVyX3NxOworCQkJCW1heF9pZHggPSBpOworCQkJfQorCQkJVkVSQjYgYmJfZXJyb3JfbXNnKCJzdXJ2aXZvciAlZCBzZWxlY3Rpb25faml0dGVyXjI6JWYiLAorCQkJCQlpLCBzZWxlY3Rpb25faml0dGVyX3NxKTsKKwkJfQorCQltYXhfc2VsZWN0aW9uX2ppdHRlciA9IFNRUlQobWF4X3NlbGVjdGlvbl9qaXR0ZXIgLyBudW1fc3Vydml2b3JzKTsKKwkJVkVSQjUgYmJfZXJyb3JfbXNnKCJtYXhfc2VsZWN0aW9uX2ppdHRlciAoYXQgJWQpOiVmIG1pbl9qaXR0ZXI6JWYiLAorCQkJCW1heF9pZHgsIG1heF9zZWxlY3Rpb25faml0dGVyLCBtaW5faml0dGVyKTsKKworCQkvKiBJZiB0aGUgbWF4aW11bSBzZWxlY3Rpb24gaml0dGVyIGlzIGxlc3MgdGhhbiB0aGUKKwkJICogbWluaW11bSBwZWVyIGppdHRlciwgdGhlbiB0b3NzaW5nIG91dCBtb3JlIHN1cnZpdm9ycworCQkgKiB3aWxsIG5vdCBsb3dlciB0aGUgbWluaW11bSBwZWVyIGppdHRlciwgc28gd2UgbWlnaHQKKwkJICogYXMgd2VsbCBzdG9wLgorCQkgKi8KKwkJaWYgKG1heF9zZWxlY3Rpb25faml0dGVyIDwgbWluX2ppdHRlcikgeworCQkJVkVSQjQgYmJfZXJyb3JfbXNnKCJtYXhfc2VsZWN0aW9uX2ppdHRlcjolZiA8IG1pbl9qaXR0ZXI6JWYsIG51bV9zdXJ2aXZvcnM6JWQsIG5vdCBkaXNjYXJkaW5nIG1vcmUiLAorCQkJCQltYXhfc2VsZWN0aW9uX2ppdHRlciwgbWluX2ppdHRlciwgbnVtX3N1cnZpdm9ycyk7CisJCQlicmVhazsKKwkJfQorCisJCS8qIERlbGV0ZSBzdXJ2aXZvclttYXhfaWR4XSBmcm9tIHRoZSBsaXN0CisJCSAqIGFuZCBnbyBhcm91bmQgYWdhaW4uCisJCSAqLworCQlWRVJCNiBiYl9lcnJvcl9tc2coImRyb3BwaW5nIHN1cnZpdm9yICVkIiwgbWF4X2lkeCk7CisJCW51bV9zdXJ2aXZvcnMtLTsKKwkJd2hpbGUgKG1heF9pZHggPCBudW1fc3Vydml2b3JzKSB7CisJCQlzdXJ2aXZvclttYXhfaWR4XSA9IHN1cnZpdm9yW21heF9pZHggKyAxXTsKKwkJCW1heF9pZHgrKzsKKwkJfQorCX0KKworCWlmICgwKSB7CisJCS8qIENvbWJpbmUgdGhlIG9mZnNldHMgb2YgdGhlIGNsdXN0ZXJpbmcgYWxnb3JpdGhtIHN1cnZpdm9ycworCQkgKiB1c2luZyBhIHdlaWdodGVkIGF2ZXJhZ2Ugd2l0aCB3ZWlnaHQgZGV0ZXJtaW5lZCBieSB0aGUgcm9vdAorCQkgKiBkaXN0YW5jZS4gQ29tcHV0ZSB0aGUgc2VsZWN0aW9uIGppdHRlciBhcyB0aGUgd2VpZ2h0ZWQgUk1TCisJCSAqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZmlyc3Qgc3Vydml2b3IgYW5kIHRoZSByZW1haW5pbmcKKwkJICogc3Vydml2b3JzLiBJbiBzb21lIGNhc2VzIHRoZSBpbmhlcmVudCBjbG9jayBqaXR0ZXIgY2FuIGJlCisJCSAqIHJlZHVjZWQgYnkgbm90IHVzaW5nIHRoaXMgYWxnb3JpdGhtLCBlc3BlY2lhbGx5IHdoZW4gZnJlcXVlbnQKKwkJICogY2xvY2tob3BwaW5nIGlzIGludm9sdmVkLiBiYm94OiB0aHVzIHdlIGRvbid0IGRvIGl0LgorCQkgKi8KKwkJZG91YmxlIHgsIHksIHosIHc7CisJCXkgPSB6ID0gdyA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBudW1fc3Vydml2b3JzOyBpKyspIHsKKwkJCXAgPSBzdXJ2aXZvcltpXS5wOworCQkJeCA9IHJvb3RfZGlzdGFuY2UocCk7CisJCQl5ICs9IDEgLyB4OworCQkJeiArPSBwLT5maWx0ZXJfb2Zmc2V0IC8geDsKKwkJCXcgKz0gU1FVQVJFKHAtPmZpbHRlcl9vZmZzZXQgLSBzdXJ2aXZvclswXS5wLT5maWx0ZXJfb2Zmc2V0KSAvIHg7CisJCX0KKwkJLy9HLmNsdXN0ZXJfb2Zmc2V0ID0geiAvIHk7CisJCS8vRy5jbHVzdGVyX2ppdHRlciA9IFNRUlQodyAvIHkpOworCX0KKworCS8qIFBpY2sgdGhlIGJlc3QgY2xvY2suIElmIHRoZSBvbGQgc3lzdGVtIHBlZXIgaXMgb24gdGhlIGxpc3QKKwkgKiBhbmQgYXQgdGhlIHNhbWUgc3RyYXR1bSBhcyB0aGUgZmlyc3Qgc3Vydml2b3Igb24gdGhlIGxpc3QsCisJICogdGhlbiBkb24ndCBkbyBhIGNsb2NrIGhvcC4gT3RoZXJ3aXNlLCBzZWxlY3QgdGhlIGZpcnN0CisJICogc3Vydml2b3Igb24gdGhlIGxpc3QgYXMgdGhlIG5ldyBzeXN0ZW0gcGVlci4KKwkgKi8KKwlwID0gc3Vydml2b3JbMF0ucDsKKwlpZiAoRy5sYXN0X3VwZGF0ZV9wZWVyCisJICYmIEcubGFzdF91cGRhdGVfcGVlci0+bGFzdHBrdF9zdHJhdHVtIDw9IHAtPmxhc3Rwa3Rfc3RyYXR1bQorCSkgeworCQkvKiBTdGFydGluZyBmcm9tIDEgaXMgb2sgaGVyZSAqLworCQlmb3IgKGkgPSAxOyBpIDwgbnVtX3N1cnZpdm9yczsgaSsrKSB7CisJCQlpZiAoRy5sYXN0X3VwZGF0ZV9wZWVyID09IHN1cnZpdm9yW2ldLnApIHsKKwkJCQlWRVJCNSBiYl9lcnJvcl9tc2coImtlZXBpbmcgb2xkIHN5bmNlZCBwZWVyIik7CisJCQkJcCA9IEcubGFzdF91cGRhdGVfcGVlcjsKKwkJCQlnb3RvIGtlZXBfb2xkOworCQkJfQorCQl9CisJfQorCUcubGFzdF91cGRhdGVfcGVlciA9IHA7Cisga2VlcF9vbGQ6CisJVkVSQjQgYmJfZXJyb3JfbXNnKCJzZWxlY3RlZCBwZWVyICVzIGZpbHRlcl9vZmZzZXQ6JStmIGFnZTolZiIsCisJCQlwLT5wX2RvdHRlZCwKKwkJCXAtPmZpbHRlcl9vZmZzZXQsCisJCQlHLmN1cl90aW1lIC0gcC0+bGFzdHBrdF9yZWN2X3RpbWUKKwkpOworCXJldHVybiBwOworfQorCisKKy8qCisgKiBMb2NhbCBjbG9jayBkaXNjaXBsaW5lIGFuZCBpdHMgaGVscGVycworICovCitzdGF0aWMgdm9pZAorc2V0X25ld192YWx1ZXMoaW50IGRpc2Nfc3RhdGUsIGRvdWJsZSBvZmZzZXQsIGRvdWJsZSByZWN2X3RpbWUpCit7CisJLyogRW50ZXIgbmV3IHN0YXRlIGFuZCBzZXQgc3RhdGUgdmFyaWFibGVzLiBOb3RlIHdlIHVzZSB0aGUgdGltZQorCSAqIG9mIHRoZSBsYXN0IGNsb2NrIGZpbHRlciBzYW1wbGUsIHdoaWNoIG11c3QgYmUgZWFybGllciB0aGFuCisJICogdGhlIGN1cnJlbnQgdGltZS4KKwkgKi8KKwlWRVJCNCBiYl9lcnJvcl9tc2coImRpc2Nfc3RhdGU9JWQgbGFzdCB1cGRhdGUgb2Zmc2V0PSVmIHJlY3ZfdGltZT0lZiIsCisJCQlkaXNjX3N0YXRlLCBvZmZzZXQsIHJlY3ZfdGltZSk7CisJRy5kaXNjaXBsaW5lX3N0YXRlID0gZGlzY19zdGF0ZTsKKwlHLmxhc3RfdXBkYXRlX29mZnNldCA9IG9mZnNldDsKKwlHLmxhc3RfdXBkYXRlX3JlY3ZfdGltZSA9IHJlY3ZfdGltZTsKK30KKy8qIFJldHVybjogLTE6IGRlY3JlYXNlIHBvbGwgaW50ZXJ2YWwsIDA6IGxlYXZlIGFzIGlzLCAxOiBpbmNyZWFzZSAqLworc3RhdGljIE5PSU5MSU5FIGludAordXBkYXRlX2xvY2FsX2Nsb2NrKHBlZXJfdCAqcCkKK3sKKwlpbnQgcmM7CisJc3RydWN0IHRpbWV4IHRteDsKKwkvKiBOb3RlOiBjYW4gdXNlIEcuY2x1c3Rlcl9vZmZzZXQgaW5zdGVhZDogKi8KKwlkb3VibGUgb2Zmc2V0ID0gcC0+ZmlsdGVyX29mZnNldDsKKwlkb3VibGUgcmVjdl90aW1lID0gcC0+bGFzdHBrdF9yZWN2X3RpbWU7CisJZG91YmxlIGFic19vZmZzZXQ7CisjaWYgIVVTSU5HX0tFUk5FTF9QTExfTE9PUAorCWRvdWJsZSBmcmVxX2RyaWZ0OworI2VuZGlmCisjaWYgIVVTSU5HX0tFUk5FTF9QTExfTE9PUCB8fCBVU0lOR19JTklUSUFMX0ZSRVFfRVNUSU1BVElPTgorCWRvdWJsZSBzaW5jZV9sYXN0X3VwZGF0ZTsKKyNlbmRpZgorCWRvdWJsZSBldGVtcCwgZHRlbXA7CisKKwlhYnNfb2Zmc2V0ID0gZmFicyhvZmZzZXQpOworCisjaWYgMAorCS8qIElmIG5lZWRlZCwgLVMgc2NyaXB0IGNhbiBkbyBpdCBieSBsb29raW5nIGF0ICRvZmZzZXQKKwkgKiBlbnYgdmFyIGFuZCBraWxsaW5nIHBhcmVudCAqLworCS8qIElmIHRoZSBvZmZzZXQgaXMgdG9vIGxhcmdlLCBnaXZlIHVwIGFuZCBnbyBob21lICovCisJaWYgKGFic19vZmZzZXQgPiBQQU5JQ19USFJFU0hPTEQpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm9mZnNldCAlZiBmYXIgdG9vIGJpZywgZXhpdGluZyIsIG9mZnNldCk7CisJfQorI2VuZGlmCisKKwkvKiBJZiB0aGlzIGlzIGFuIG9sZCB1cGRhdGUsIGZvciBpbnN0YW5jZSBhcyB0aGUgcmVzdWx0CisJICogb2YgYSBzeXN0ZW0gcGVlciBjaGFuZ2UsIGF2b2lkIGl0LiBXZSBuZXZlciB1c2UKKwkgKiBhbiBvbGQgc2FtcGxlIG9yIHRoZSBzYW1lIHNhbXBsZSB0d2ljZS4KKwkgKi8KKwlpZiAocmVjdl90aW1lIDw9IEcubGFzdF91cGRhdGVfcmVjdl90aW1lKSB7CisJCVZFUkIzIGJiX2Vycm9yX21zZygidXBkYXRlIGZyb20gJXM6IHNhbWUgb3Igb2xkZXIgZGF0YXBvaW50LCBub3QgdXNpbmcgaXQiLAorCQkJcC0+cF9kb3R0ZWQpOworCQlyZXR1cm4gMDsgLyogImxlYXZlIHBvbGwgaW50ZXJ2YWwgYXMgaXMiICovCisJfQorCisJLyogQ2xvY2sgc3RhdGUgbWFjaGluZSB0cmFuc2l0aW9uIGZ1bmN0aW9uLiBUaGlzIGlzIHdoZXJlIHRoZQorCSAqIGFjdGlvbiBpcyBhbmQgZGVmaW5lcyBob3cgdGhlIHN5c3RlbSByZWFjdHMgdG8gbGFyZ2UgdGltZQorCSAqIGFuZCBmcmVxdWVuY3kgZXJyb3JzLgorCSAqLworI2lmICFVU0lOR19LRVJORUxfUExMX0xPT1AgfHwgVVNJTkdfSU5JVElBTF9GUkVRX0VTVElNQVRJT04KKwlzaW5jZV9sYXN0X3VwZGF0ZSA9IHJlY3ZfdGltZSAtIEcucmVmdGltZTsKKyNlbmRpZgorI2lmICFVU0lOR19LRVJORUxfUExMX0xPT1AKKwlmcmVxX2RyaWZ0ID0gMDsKKyNlbmRpZgorI2lmIFVTSU5HX0lOSVRJQUxfRlJFUV9FU1RJTUFUSU9OCisJaWYgKEcuZGlzY2lwbGluZV9zdGF0ZSA9PSBTVEFURV9GUkVRKSB7CisJCS8qIElnbm9yZSB1cGRhdGVzIHVudGlsIHRoZSBzdGVwb3V0IHRocmVzaG9sZCAqLworCQlpZiAoc2luY2VfbGFzdF91cGRhdGUgPCBXQVRDSF9USFJFU0hPTEQpIHsKKwkJCVZFUkI0IGJiX2Vycm9yX21zZygibWVhc3VyaW5nIGRyaWZ0LCBkYXRhcG9pbnQgaWdub3JlZCwgJWYgc2VjIHJlbWFpbnMiLAorCQkJCQlXQVRDSF9USFJFU0hPTEQgLSBzaW5jZV9sYXN0X3VwZGF0ZSk7CisJCQlyZXR1cm4gMDsgLyogImxlYXZlIHBvbGwgaW50ZXJ2YWwgYXMgaXMiICovCisJCX0KKyMgaWYgIVVTSU5HX0tFUk5FTF9QTExfTE9PUAorCQlmcmVxX2RyaWZ0ID0gKG9mZnNldCAtIEcubGFzdF91cGRhdGVfb2Zmc2V0KSAvIHNpbmNlX2xhc3RfdXBkYXRlOworIyBlbmRpZgorCX0KKyNlbmRpZgorCisJLyogVGhlcmUgYXJlIHR3byBtYWluIHJlZ2ltZXM6IHdoZW4gdGhlCisJICogb2Zmc2V0IGV4Y2VlZHMgdGhlIHN0ZXAgdGhyZXNob2xkIGFuZCB3aGVuIGl0IGRvZXMgbm90LgorCSAqLworCWlmIChhYnNfb2Zmc2V0ID4gU1RFUF9USFJFU0hPTEQpIHsKKyNpZiAwCisJCWRvdWJsZSByZW1haW5zOworCisvLyBUaGlzICJzcGlrZSBzdGF0ZSIgc2VlbXMgdG8gYmUgdXNlbGVzcywgcGVlciBzZWxlY3Rpb24gYWxyZWFkeSBkcm9wcworLy8gb2NjYXNzaW9uYWwgImJhZCIgZGF0YXBvaW50cy4gSWYgd2UgYXJlIGhlcmUsIHRoZXJlIHdlcmUgX21hbnlfCisvLyBsYXJnZSBvZmZzZXRzLiBXaGVuIGEgZmV3IGZpcnN0IGxhcmdlIG9mZnNldHMgYXJlIHNlZW4sCisvLyB3ZSBlbmQgdXAgaW4gIm5vIHZhbGlkIGRhdGFwb2ludHMsIG5vIHBlZXIgc2VsZWN0ZWQiIHN0YXRlLgorLy8gT25seSB3aGVuIGVub3VnaCBvZiB0aGVtIGFyZSBzZWVuICh3aGljaCBtZWFucyBpdCdzIG5vdCBhIGZsdWtlKSwKKy8vIHdlIGVuZCB1cCBoZXJlLiBMb29rcyBsaWtlIF9vdXJfIGNsb2NrIGlzIG9mZi4KKwkJc3dpdGNoIChHLmRpc2NpcGxpbmVfc3RhdGUpIHsKKwkJY2FzZSBTVEFURV9TWU5DOgorCQkJLyogVGhlIGZpcnN0IG91dGx5ZXI6IGlnbm9yZSBpdCwgc3dpdGNoIHRvIFNQSUsgc3RhdGUgKi8KKwkJCVZFUkIzIGJiX2Vycm9yX21zZygidXBkYXRlIGZyb20gJXM6IG9mZnNldDolK2YsIHNwaWtlJXMiLAorCQkJCXAtPnBfZG90dGVkLCBvZmZzZXQsCisJCQkJIiIpOworCQkJRy5kaXNjaXBsaW5lX3N0YXRlID0gU1RBVEVfU1BJSzsKKwkJCXJldHVybiAtMTsgLyogImRlY3JlYXNlIHBvbGwgaW50ZXJ2YWwiICovCisKKwkJY2FzZSBTVEFURV9TUElLOgorCQkJLyogSWdub3JlIHN1Y2NlZWRpbmcgb3V0bHllcnMgdW50aWwgZWl0aGVyIGFuIGlubHllcgorCQkJICogaXMgZm91bmQgb3IgdGhlIHN0ZXBvdXQgdGhyZXNob2xkIGlzIGV4Y2VlZGVkLgorCQkJICovCisJCQlyZW1haW5zID0gV0FUQ0hfVEhSRVNIT0xEIC0gc2luY2VfbGFzdF91cGRhdGU7CisJCQlpZiAocmVtYWlucyA+IDApIHsKKwkJCQlWRVJCMyBiYl9lcnJvcl9tc2coInVwZGF0ZSBmcm9tICVzOiBvZmZzZXQ6JStmLCBzcGlrZSVzIiwKKwkJCQkJcC0+cF9kb3R0ZWQsIG9mZnNldCwKKwkJCQkJIiwgZGF0YXBvaW50IGlnbm9yZWQiKTsKKwkJCQlyZXR1cm4gLTE7IC8qICJkZWNyZWFzZSBwb2xsIGludGVydmFsIiAqLworCQkJfQorCQkJLyogZmFsbCB0aHJvdWdoOiB3ZSBuZWVkIHRvIHN0ZXAgKi8KKwkJfSAvKiBzd2l0Y2ggKi8KKyNlbmRpZgorCisJCS8qIFN0ZXAgdGhlIHRpbWUgYW5kIGNsYW1wIGRvd24gdGhlIHBvbGwgaW50ZXJ2YWwuCisJCSAqCisJCSAqIEluIE5TRVQgc3RhdGUgYW4gaW5pdGlhbCBmcmVxdWVuY3kgY29ycmVjdGlvbiBpcworCQkgKiBub3QgYXZhaWxhYmxlLCB1c3VhbGx5IGJlY2F1c2UgdGhlIGZyZXF1ZW5jeSBmaWxlIGhhcworCQkgKiBub3QgeWV0IGJlZW4gd3JpdHRlbi4gU2luY2UgdGhlIHRpbWUgaXMgb3V0c2lkZSB0aGUKKwkJICogY2FwdHVyZSByYW5nZSwgdGhlIGNsb2NrIGlzIHN0ZXBwZWQuIFRoZSBmcmVxdWVuY3kKKwkJICogd2lsbCBiZSBzZXQgZGlyZWN0bHkgZm9sbG93aW5nIHRoZSBzdGVwb3V0IGludGVydmFsLgorCQkgKgorCQkgKiBJbiBGU0VUIHN0YXRlIHRoZSBpbml0aWFsIGZyZXF1ZW5jeSBoYXMgYmVlbiBzZXQKKwkJICogZnJvbSB0aGUgZnJlcXVlbmN5IGZpbGUuIFNpbmNlIHRoZSB0aW1lIGlzIG91dHNpZGUKKwkJICogdGhlIGNhcHR1cmUgcmFuZ2UsIHRoZSBjbG9jayBpcyBzdGVwcGVkIGltbWVkaWF0ZWx5LAorCQkgKiByYXRoZXIgdGhhbiBhZnRlciB0aGUgc3RlcG91dCBpbnRlcnZhbC4gR3V5cyBnZXQKKwkJICogbmVydm91cyBpZiBpdCB0YWtlcyAxNyBtaW51dGVzIHRvIHNldCB0aGUgY2xvY2sgZm9yCisJCSAqIHRoZSBmaXJzdCB0aW1lLgorCQkgKgorCQkgKiBJbiBTUElLIHN0YXRlIHRoZSBzdGVwb3V0IHRocmVzaG9sZCBoYXMgZXhwaXJlZCBhbmQKKwkJICogdGhlIHBoYXNlIGlzIHN0aWxsIGFib3ZlIHRoZSBzdGVwIHRocmVzaG9sZC4gTm90ZQorCQkgKiB0aGF0IGEgc2luZ2xlIHNwaWtlIGdyZWF0ZXIgdGhhbiB0aGUgc3RlcCB0aHJlc2hvbGQKKwkJICogaXMgYWx3YXlzIHN1cHByZXNzZWQsIGV2ZW4gYXQgdGhlIGxvbmdlciBwb2xsCisJCSAqIGludGVydmFscy4KKwkJICovCisJCVZFUkI0IGJiX2Vycm9yX21zZygic3RlcHBpbmcgdGltZSBieSAlK2Y7IHBvbGxfZXhwPU1JTlBPTEwiLCBvZmZzZXQpOworCQlzdGVwX3RpbWUob2Zmc2V0KTsKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfcSkgeworCQkJLyogV2Ugd2VyZSBvbmx5IGFza2VkIHRvIHNldCB0aW1lIG9uY2UuIERvbmUuICovCisJCQlleGl0KDApOworCQl9CisKKwkJY2xhbXBfcG9sbGV4cF9hbmRfc2V0X01BWFNUUkFUKCk7CisKKwkJcnVuX3NjcmlwdCgic3RlcCIsIG9mZnNldCk7CisKKwkJcmVjdl90aW1lICs9IG9mZnNldDsKKworI2lmIFVTSU5HX0lOSVRJQUxfRlJFUV9FU1RJTUFUSU9OCisJCWlmIChHLmRpc2NpcGxpbmVfc3RhdGUgPT0gU1RBVEVfTlNFVCkgeworCQkJc2V0X25ld192YWx1ZXMoU1RBVEVfRlJFUSwgLypvZmZzZXQ6Ki8gMCwgcmVjdl90aW1lKTsKKwkJCXJldHVybiAxOyAvKiAib2sgdG8gaW5jcmVhc2UgcG9sbCBpbnRlcnZhbCIgKi8KKwkJfQorI2VuZGlmCisJCWFic19vZmZzZXQgPSBvZmZzZXQgPSAwOworCQlzZXRfbmV3X3ZhbHVlcyhTVEFURV9TWU5DLCBvZmZzZXQsIHJlY3ZfdGltZSk7CisJfSBlbHNlIHsgLyogYWJzX29mZnNldCA8PSBTVEVQX1RIUkVTSE9MRCAqLworCisJCS8qIFRoZSByYXRpbyBpcyBjYWxjdWxhdGVkIGJlZm9yZSBqaXR0ZXIgaXMgdXBkYXRlZCB0byBtYWtlCisJCSAqIHBvbGwgYWRqdXN0IGNvZGUgbW9yZSBzZW5zaXRpdmUgdG8gbGFyZ2Ugb2Zmc2V0cy4KKwkJICovCisJCUcub2Zmc2V0X3RvX2ppdHRlcl9yYXRpbyA9IGFic19vZmZzZXQgLyBHLmRpc2NpcGxpbmVfaml0dGVyOworCisJCS8qIENvbXB1dGUgdGhlIGNsb2NrIGppdHRlciBhcyB0aGUgUk1TIG9mIGV4cG9uZW50aWFsbHkKKwkJICogd2VpZ2h0ZWQgb2Zmc2V0IGRpZmZlcmVuY2VzLiBVc2VkIGJ5IHRoZSBwb2xsIGFkanVzdCBjb2RlLgorCQkgKi8KKwkJZXRlbXAgPSBTUVVBUkUoRy5kaXNjaXBsaW5lX2ppdHRlcik7CisJCWR0ZW1wID0gU1FVQVJFKG9mZnNldCAtIEcubGFzdF91cGRhdGVfb2Zmc2V0KTsKKwkJRy5kaXNjaXBsaW5lX2ppdHRlciA9IFNRUlQoZXRlbXAgKyAoZHRlbXAgLSBldGVtcCkgLyBBVkcpOworCQlpZiAoRy5kaXNjaXBsaW5lX2ppdHRlciA8IEdfcHJlY2lzaW9uX3NlYykKKwkJCUcuZGlzY2lwbGluZV9qaXR0ZXIgPSBHX3ByZWNpc2lvbl9zZWM7CisKKwkJc3dpdGNoIChHLmRpc2NpcGxpbmVfc3RhdGUpIHsKKwkJY2FzZSBTVEFURV9OU0VUOgorCQkJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfcSkgeworCQkJCS8qIFdlIHdlcmUgb25seSBhc2tlZCB0byBzZXQgdGltZSBvbmNlLgorCQkJCSAqIFRoZSBjbG9jayBpcyBwcmVjaXNlIGVub3VnaCwgbm8gbmVlZCB0byBzdGVwLgorCQkJCSAqLworCQkJCWV4aXQoMCk7CisJCQl9CisjaWYgVVNJTkdfSU5JVElBTF9GUkVRX0VTVElNQVRJT04KKwkJCS8qIFRoaXMgaXMgdGhlIGZpcnN0IHVwZGF0ZSByZWNlaXZlZCBhbmQgdGhlIGZyZXF1ZW5jeQorCQkJICogaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkLiBUaGUgZmlyc3QgdGhpbmcgdG8gZG8KKwkJCSAqIGlzIGRpcmVjdGx5IG1lYXN1cmUgdGhlIG9zY2lsbGF0b3IgZnJlcXVlbmN5LgorCQkJICovCisJCQlzZXRfbmV3X3ZhbHVlcyhTVEFURV9GUkVRLCBvZmZzZXQsIHJlY3ZfdGltZSk7CisjZWxzZQorCQkJc2V0X25ld192YWx1ZXMoU1RBVEVfU1lOQywgb2Zmc2V0LCByZWN2X3RpbWUpOworI2VuZGlmCisJCQlWRVJCNCBiYl9lcnJvcl9tc2coInRyYW5zaXRpb25pbmcgdG8gRlJFUSwgZGF0YXBvaW50IGlnbm9yZWQiKTsKKwkJCXJldHVybiAwOyAvKiAibGVhdmUgcG9sbCBpbnRlcnZhbCBhcyBpcyIgKi8KKworI2lmIDAgLyogdGhpcyBpcyBkZWFkIGNvZGUgZm9yIG5vdyAqLworCQljYXNlIFNUQVRFX0ZTRVQ6CisJCQkvKiBUaGlzIGlzIHRoZSBmaXJzdCB1cGRhdGUgYW5kIHRoZSBmcmVxdWVuY3kKKwkJCSAqIGhhcyBiZWVuIGluaXRpYWxpemVkLiBBZGp1c3QgdGhlIHBoYXNlLCBidXQKKwkJCSAqIGRvbid0IGFkanVzdCB0aGUgZnJlcXVlbmN5IHVudGlsIHRoZSBuZXh0IHVwZGF0ZS4KKwkJCSAqLworCQkJc2V0X25ld192YWx1ZXMoU1RBVEVfU1lOQywgb2Zmc2V0LCByZWN2X3RpbWUpOworCQkJLyogZnJlcV9kcmlmdCByZW1haW5zIDAgKi8KKwkJCWJyZWFrOworI2VuZGlmCisKKyNpZiBVU0lOR19JTklUSUFMX0ZSRVFfRVNUSU1BVElPTgorCQljYXNlIFNUQVRFX0ZSRVE6CisJCQkvKiBzaW5jZV9sYXN0X3VwZGF0ZSA+PSBXQVRDSF9USFJFU0hPTEQsIHdlIHdhaXRlZCBlbm91Z2guCisJCQkgKiBDb3JyZWN0IHRoZSBwaGFzZSBhbmQgZnJlcXVlbmN5IGFuZCBzd2l0Y2ggdG8gU1lOQyBzdGF0ZS4KKwkJCSAqIGZyZXFfZHJpZnQgd2FzIGFscmVhZHkgZXN0aW1hdGVkIChzZWUgY29kZSBhYm92ZSkKKwkJCSAqLworCQkJc2V0X25ld192YWx1ZXMoU1RBVEVfU1lOQywgb2Zmc2V0LCByZWN2X3RpbWUpOworCQkJYnJlYWs7CisjZW5kaWYKKworCQlkZWZhdWx0OgorI2lmICFVU0lOR19LRVJORUxfUExMX0xPT1AKKwkJCS8qIENvbXB1dGUgZnJlcV9kcmlmdCBkdWUgdG8gUExMIGFuZCBGTEwgY29udHJpYnV0aW9ucy4KKwkJCSAqCisJCQkgKiBUaGUgRkxMIGFuZCBQTEwgZnJlcXVlbmN5IGdhaW4gY29uc3RhbnRzCisJCQkgKiBkZXBlbmQgb24gdGhlIHBvbGwgaW50ZXJ2YWwgYW5kIEFsbGFuCisJCQkgKiBpbnRlcmNlcHQuIFRoZSBGTEwgaXMgbm90IHVzZWQgYmVsb3cgb25lLWhhbGYKKwkJCSAqIHRoZSBBbGxhbiBpbnRlcmNlcHQuIEFib3ZlIHRoYXQgdGhlIGxvb3AgZ2FpbgorCQkJICogaW5jcmVhc2VzIGluIHN0ZXBzIHRvIDEgLyBBVkcuCisJCQkgKi8KKwkJCWlmICgoMSA8PCBHLnBvbGxfZXhwKSA+IEFMTEFOIC8gMikgeworCQkJCWV0ZW1wID0gRkxMIC0gRy5wb2xsX2V4cDsKKwkJCQlpZiAoZXRlbXAgPCBBVkcpCisJCQkJCWV0ZW1wID0gQVZHOworCQkJCWZyZXFfZHJpZnQgKz0gKG9mZnNldCAtIEcubGFzdF91cGRhdGVfb2Zmc2V0KSAvIChNQVhEKHNpbmNlX2xhc3RfdXBkYXRlLCBBTExBTikgKiBldGVtcCk7CisJCQl9CisJCQkvKiBGb3IgdGhlIFBMTCB0aGUgaW50ZWdyYXRpb24gaW50ZXJ2YWwKKwkJCSAqIChudW1lcmF0b3IpIGlzIHRoZSBtaW5pbXVtIG9mIHRoZSB1cGRhdGUKKwkJCSAqIGludGVydmFsIGFuZCBwb2xsIGludGVydmFsLiBUaGlzIGFsbG93cworCQkJICogb3ZlcnNhbXBsaW5nLCBidXQgbm90IHVuZGVyc2FtcGxpbmcuCisJCQkgKi8KKwkJCWV0ZW1wID0gTUlORChzaW5jZV9sYXN0X3VwZGF0ZSwgKDEgPDwgRy5wb2xsX2V4cCkpOworCQkJZHRlbXAgPSAoNCAqIFBMTCkgPDwgRy5wb2xsX2V4cDsKKwkJCWZyZXFfZHJpZnQgKz0gb2Zmc2V0ICogZXRlbXAgLyBTUVVBUkUoZHRlbXApOworI2VuZGlmCisJCQlzZXRfbmV3X3ZhbHVlcyhTVEFURV9TWU5DLCBvZmZzZXQsIHJlY3ZfdGltZSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoRy5zdHJhdHVtICE9IHAtPmxhc3Rwa3Rfc3RyYXR1bSArIDEpIHsKKwkJCUcuc3RyYXR1bSA9IHAtPmxhc3Rwa3Rfc3RyYXR1bSArIDE7CisJCQlydW5fc2NyaXB0KCJzdHJhdHVtIiwgb2Zmc2V0KTsKKwkJfQorCX0KKworCUcucmVmdGltZSA9IEcuY3VyX3RpbWU7CisJRy5udHBfc3RhdHVzID0gcC0+bGFzdHBrdF9zdGF0dXM7CisJRy5yZWZpZCA9IHAtPmxhc3Rwa3RfcmVmaWQ7CisJRy5yb290ZGVsYXkgPSBwLT5sYXN0cGt0X3Jvb3RkZWxheSArIHAtPmxhc3Rwa3RfZGVsYXk7CisJZHRlbXAgPSBwLT5maWx0ZXJfaml0dGVyOyAvLyBTUVJUKFNRVUFSRShwLT5maWx0ZXJfaml0dGVyKSArIFNRVUFSRShHLmNsdXN0ZXJfaml0dGVyKSk7CisJZHRlbXAgKz0gTUFYRChwLT5maWx0ZXJfZGlzcGVyc2lvbiArIEZSRVFfVE9MRVJBTkNFICogKEcuY3VyX3RpbWUgLSBwLT5sYXN0cGt0X3JlY3ZfdGltZSkgKyBhYnNfb2Zmc2V0LCBNSU5ESVNQKTsKKwlHLnJvb3RkaXNwID0gcC0+bGFzdHBrdF9yb290ZGlzcCArIGR0ZW1wOworCVZFUkI0IGJiX2Vycm9yX21zZygidXBkYXRpbmcgbGVhcC9yZWZpZC9yZWZ0aW1lL3Jvb3RkaXNwIGZyb20gcGVlciAlcyIsIHAtPnBfZG90dGVkKTsKKworCS8qIFdlIGFyZSBpbiBTVEFURV9TWU5DIG5vdywgYnV0IGRpZCBub3QgZG8gYWRqdGltZXggeWV0LgorCSAqIChBbnkgb3RoZXIgc3RhdGUgZG9lcyBub3QgcmVhY2ggdGhpcywgdGhleSBhbGwgcmV0dXJuIGVhcmxpZXIpCisJICogQnkgdGhpcyB0aW1lLCBmcmVxX2RyaWZ0IGFuZCBvZmZzZXQgYXJlIHNldAorCSAqIHRvIHZhbHVlcyBzdWl0YWJsZSBmb3IgYWRqdGltZXguCisJICovCisjaWYgIVVTSU5HX0tFUk5FTF9QTExfTE9PUAorCS8qIENhbGN1bGF0ZSB0aGUgbmV3IGZyZXF1ZW5jeSBkcmlmdCBhbmQgZnJlcXVlbmN5IHN0YWJpbGl0eSAod2FuZGVyKS4KKwkgKiBDb21wdXRlIHRoZSBjbG9jayB3YW5kZXIgYXMgdGhlIFJNUyBvZiBleHBvbmVudGlhbGx5IHdlaWdodGVkCisJICogZnJlcXVlbmN5IGRpZmZlcmVuY2VzLiBUaGlzIGlzIG5vdCB1c2VkIGRpcmVjdGx5LCBidXQgY2FuLAorCSAqIGFsb25nIHdpdGggdGhlIGppdHRlciwgYmUgYSBoaWdobHkgdXNlZnVsIG1vbml0b3JpbmcgYW5kCisJICogZGVidWdnaW5nIHRvb2wuCisJICovCisJZHRlbXAgPSBHLmRpc2NpcGxpbmVfZnJlcV9kcmlmdCArIGZyZXFfZHJpZnQ7CisJRy5kaXNjaXBsaW5lX2ZyZXFfZHJpZnQgPSBNQVhEKE1JTkQoTUFYRFJJRlQsIGR0ZW1wKSwgLU1BWERSSUZUKTsKKwlldGVtcCA9IFNRVUFSRShHLmRpc2NpcGxpbmVfd2FuZGVyKTsKKwlkdGVtcCA9IFNRVUFSRShkdGVtcCk7CisJRy5kaXNjaXBsaW5lX3dhbmRlciA9IFNRUlQoZXRlbXAgKyAoZHRlbXAgLSBldGVtcCkgLyBBVkcpOworCisJVkVSQjQgYmJfZXJyb3JfbXNnKCJkaXNjaXBsaW5lIGZyZXFfZHJpZnQ9JS45ZihpbnQ6JWxkIGNvcnI6JWUpIHdhbmRlcj0lZiIsCisJCQlHLmRpc2NpcGxpbmVfZnJlcV9kcmlmdCwKKwkJCShsb25nKShHLmRpc2NpcGxpbmVfZnJlcV9kcmlmdCAqIDY1NTM2ZTYpLAorCQkJZnJlcV9kcmlmdCwKKwkJCUcuZGlzY2lwbGluZV93YW5kZXIpOworI2VuZGlmCisJVkVSQjQgeworCQltZW1zZXQoJnRteCwgMCwgc2l6ZW9mKHRteCkpOworCQlpZiAoYWRqdGltZXgoJnRteCkgPCAwKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJhZGp0aW1leCIpOworCQliYl9lcnJvcl9tc2coInAgYWRqdGltZXggZnJlcTolbGQgb2Zmc2V0OiUrbGQgc3RhdHVzOjB4JXggdGM6JWxkIiwKKwkJCQl0bXguZnJlcSwgdG14Lm9mZnNldCwgdG14LnN0YXR1cywgdG14LmNvbnN0YW50KTsKKwl9CisKKwltZW1zZXQoJnRteCwgMCwgc2l6ZW9mKHRteCkpOworI2lmIDAKKy8vZG9lc24ndCB3b3JrLCBvZmZzZXQgcmVtYWlucyAwICghKSBpbiBrZXJuZWw6CisvL250cGQ6ICBzZXQgYWRqdGltZXggZnJlcToxNzg2MDk3IHRteC5vZmZzZXQ6Nzc0ODcKKy8vbnRwZDogcHJldiBhZGp0aW1leCBmcmVxOjE3ODYwOTcgdG14Lm9mZnNldDowCisvL250cGQ6ICBjdXIgYWRqdGltZXggZnJlcToxNzg2MDk3IHRteC5vZmZzZXQ6MAorCXRteC5tb2RlcyA9IEFESl9GUkVRVUVOQ1kgfCBBREpfT0ZGU0VUOworCS8qIDY1NTM2IGlzIG9uZSBwcG0gKi8KKwl0bXguZnJlcSA9IEcuZGlzY2lwbGluZV9mcmVxX2RyaWZ0ICogNjU1MzZlNjsKKyNlbmRpZgorCXRteC5tb2RlcyA9IEFESl9PRkZTRVQgfCBBREpfU1RBVFVTIHwgQURKX1RJTUVDT05TVDsvLyB8IEFESl9NQVhFUlJPUiB8IEFESl9FU1RFUlJPUjsKKwl0bXgub2Zmc2V0ID0gKG9mZnNldCAqIDEwMDAwMDApOyAvKiB1c2VjICovCisJdG14LnN0YXR1cyA9IFNUQV9QTEw7CisJaWYgKEcubnRwX3N0YXR1cyAmIExJX1BMVVNTRUMpCisJCXRteC5zdGF0dXMgfD0gU1RBX0lOUzsKKwlpZiAoRy5udHBfc3RhdHVzICYgTElfTUlOVVNTRUMpCisJCXRteC5zdGF0dXMgfD0gU1RBX0RFTDsKKworCXRteC5jb25zdGFudCA9IChpbnQpRy5wb2xsX2V4cCAtIDQgPiAwID8gKGludClHLnBvbGxfZXhwIC0gNCA6IDA7CisJLyogRVhQRVJJTUVOVEFMLgorCSAqIFRoZSBiZWxvdyBpZiBzdGF0ZW1lbnQgc2hvdWxkIGJlIHVubmVjZXNzYXJ5LCBidXQuLi4KKwkgKiBJdCBsb29rcyBsaWtlIExpbnV4IGtlcm5lbCdzIFBMTCBpcyBmYXIgdG9vIGdlbnRsZSBpbiBjaGFuZ2luZworCSAqIHRteC5mcmVxIGluIHJlc3BvbnNlIHRvIGNsb2NrIG9mZnNldC4gT2Zmc2V0IGtlZXBzIGdyb3dpbmcKKwkgKiBhbmQgZXZlbnR1YWxseSB3ZSBmYWxsIGJhY2sgdG8gc21hbGxlciBwb2xsIGludGVydmFscy4KKwkgKiBXZSBjYW4gbWFrZSBjb3JyZWN0aW9uIG1vcmUgYWdyZXNzaXZlIChhYm91dCB4MikgYnkgc3VwcGx5aW5nCisJICogUExMIHRpbWUgY29uc3RhbnQgd2hpY2ggaXMgb25lIGxlc3MgdGhhbiB0aGUgcmVhbCBvbmUuCisJICogVG8gYmUgb24gYSBzYWZlIHNpZGUsIGxldCdzIGRvIGl0IG9ubHkgaWYgb2Zmc2V0IGlzIHNpZ25pZmljYW50bHkKKwkgKiBsYXJnZXIgdGhhbiBqaXR0ZXIuCisJICovCisJaWYgKHRteC5jb25zdGFudCA+IDAgJiYgRy5vZmZzZXRfdG9faml0dGVyX3JhdGlvID49IFRJTUVDT05TVF9IQUNLX0dBVEUpCisJCXRteC5jb25zdGFudC0tOworCisJLy90bXguZXN0ZXJyb3IgPSAodWludDMyX3QpKGNsb2NrX2ppdHRlciAqIDFlNik7CisJLy90bXgubWF4ZXJyb3IgPSAodWludDMyX3QpKChzeXNfcm9vdGRlbGF5IC8gMiArIHN5c19yb290ZGlzcCkgKiAxZTYpOworCXJjID0gYWRqdGltZXgoJnRteCk7CisJaWYgKHJjIDwgMCkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJhZGp0aW1leCIpOworCS8qIE5COiBoZXJlIGtlcm5lbCByZXR1cm5zIGNvbnN0YW50ID09IEcucG9sbF9leHAsIG5vdCA9PSBHLnBvbGxfZXhwIC0gNC4KKwkgKiBOb3Qgc3VyZSB3aHkuIFBlcmhhcHMgaXQgaXMgbm9ybWFsLgorCSAqLworCVZFUkI0IGJiX2Vycm9yX21zZygiYWRqdGltZXg6JWQgZnJlcTolbGQgb2Zmc2V0OiUrbGQgc3RhdHVzOjB4JXgiLAorCQkJCXJjLCB0bXguZnJlcSwgdG14Lm9mZnNldCwgdG14LnN0YXR1cyk7CisJRy5rZXJuZWxfZnJlcV9kcmlmdCA9IHRteC5mcmVxIC8gNjU1MzY7CisJVkVSQjIgYmJfZXJyb3JfbXNnKCJ1cGRhdGUgZnJvbTolcyBvZmZzZXQ6JStmIGppdHRlcjolZiBjbG9jayBkcmlmdDolKy4zZnBwbSB0YzolZCIsCisJCQlwLT5wX2RvdHRlZCwgb2Zmc2V0LCBHLmRpc2NpcGxpbmVfaml0dGVyLCAoZG91YmxlKXRteC5mcmVxIC8gNjU1MzYsIChpbnQpdG14LmNvbnN0YW50KTsKKworCXJldHVybiAxOyAvKiAib2sgdG8gaW5jcmVhc2UgcG9sbCBpbnRlcnZhbCIgKi8KK30KKworCisvKgorICogV2UndmUgZ290IGEgbmV3IHJlcGx5IHBhY2tldCBmcm9tIGEgcGVlciwgcHJvY2VzcyBpdAorICogKGhlbHBlcnMgZmlyc3QpCisgKi8KK3N0YXRpYyB1bnNpZ25lZAorcG9sbF9pbnRlcnZhbChpbnQgdXBwZXJfYm91bmQpCit7CisJdW5zaWduZWQgaW50ZXJ2YWwsIHIsIG1hc2s7CisJaW50ZXJ2YWwgPSAxIDw8IEcucG9sbF9leHA7CisJaWYgKGludGVydmFsID4gdXBwZXJfYm91bmQpCisJCWludGVydmFsID0gdXBwZXJfYm91bmQ7CisJbWFzayA9ICgoaW50ZXJ2YWwtMSkgPj4gNCkgfCAxOworCXIgPSByYW5kKCk7CisJaW50ZXJ2YWwgKz0gciAmIG1hc2s7IC8qIH4gcmFuZG9tKDAuLjEpICogaW50ZXJ2YWwvMTYgKi8KKwlWRVJCNCBiYl9lcnJvcl9tc2coImNob3NlIHBvbGwgaW50ZXJ2YWw6JXUgKHBvbGxfZXhwOiVkKSIsIGludGVydmFsLCBHLnBvbGxfZXhwKTsKKwlyZXR1cm4gaW50ZXJ2YWw7Cit9CitzdGF0aWMgdm9pZAorYWRqdXN0X3BvbGwoaW50IGNvdW50KQoreworCUcucG9sbGFkal9jb3VudCArPSBjb3VudDsKKwlpZiAoRy5wb2xsYWRqX2NvdW50ID4gUE9MTEFESl9MSU1JVCkgeworCQlHLnBvbGxhZGpfY291bnQgPSAwOworCQlpZiAoRy5wb2xsX2V4cCA8IE1BWFBPTEwpIHsKKwkJCUcucG9sbF9leHArKzsKKwkJCVZFUkI0IGJiX2Vycm9yX21zZygicG9sbGFkajogZGlzY2lwbGluZV9qaXR0ZXI6JWYgKytwb2xsX2V4cD0lZCIsCisJCQkJCUcuZGlzY2lwbGluZV9qaXR0ZXIsIEcucG9sbF9leHApOworCQl9CisJfSBlbHNlIGlmIChHLnBvbGxhZGpfY291bnQgPCAtUE9MTEFESl9MSU1JVCB8fCAoY291bnQgPCAwICYmIEcucG9sbF9leHAgPiBCSUdQT0xMKSkgeworCQlHLnBvbGxhZGpfY291bnQgPSAwOworCQlpZiAoRy5wb2xsX2V4cCA+IE1JTlBPTEwpIHsKKwkJCWxsaXN0X3QgKml0ZW07CisKKwkJCUcucG9sbF9leHAtLTsKKwkJCS8qIENvcnJlY3QgcC0+bmV4dF9hY3Rpb25fdGltZSBpbiBlYWNoIHBlZXIKKwkJCSAqIHdoaWNoIHdhaXRzIGZvciBzZW5kaW5nLCBzbyB0aGF0IHRoZXkgc2VuZCBlYXJsaWVyLgorCQkJICogT2xkIHBwLT5uZXh0X2FjdGlvbl90aW1lIGFyZSBvbiB0aGUgb3JkZXIKKwkJCSAqIG9mIHQgKyAoMSA8PCBvbGRfcG9sbF9leHApICsgc21hbGxfcmFuZG9tLAorCQkJICogd2Ugc2ltcGx5IG5lZWQgdG8gc3VidHJhY3QgfmhhbGYgb2YgdGhhdC4KKwkJCSAqLworCQkJZm9yIChpdGVtID0gRy5udHBfcGVlcnM7IGl0ZW0gIT0gTlVMTDsgaXRlbSA9IGl0ZW0tPmxpbmspIHsKKwkJCQlwZWVyX3QgKnBwID0gKHBlZXJfdCAqKSBpdGVtLT5kYXRhOworCQkJCWlmIChwcC0+cF9mZCA8IDApCisJCQkJCXBwLT5uZXh0X2FjdGlvbl90aW1lIC09ICgxIDw8IEcucG9sbF9leHApOworCQkJfQorCQkJVkVSQjQgYmJfZXJyb3JfbXNnKCJwb2xsYWRqOiBkaXNjaXBsaW5lX2ppdHRlcjolZiAtLXBvbGxfZXhwPSVkIiwKKwkJCQkJRy5kaXNjaXBsaW5lX2ppdHRlciwgRy5wb2xsX2V4cCk7CisJCX0KKwl9IGVsc2UgeworCQlWRVJCNCBiYl9lcnJvcl9tc2coInBvbGxhZGo6IGNvdW50OiVkIiwgRy5wb2xsYWRqX2NvdW50KTsKKwl9Cit9CitzdGF0aWMgTk9JTkxJTkUgdm9pZAorcmVjdl9hbmRfcHJvY2Vzc19wZWVyX3BrdChwZWVyX3QgKnApCit7CisJaW50ICAgICAgICAgcmM7CisJc3NpemVfdCAgICAgc2l6ZTsKKwltc2dfdCAgICAgICBtc2c7CisJZG91YmxlICAgICAgVDEsIFQyLCBUMywgVDQ7CisJZG91YmxlICAgICAgb2Zmc2V0OworCWRvdWJsZSAgICAgIHByZXZfZGVsYXksIGRlbGF5OworCXVuc2lnbmVkICAgIGludGVydmFsOworCWRhdGFwb2ludF90ICpkYXRhcG9pbnQ7CisJcGVlcl90ICAgICAgKnE7CisKKwlvZmZzZXQgPSAwOworCisJLyogV2UgY2FuIHJlY3Zmcm9tIGhlcmUgYW5kIGNoZWNrIGZyb20uSVAsIGJ1dCBzb21lIG11bHRpaG9tZWQKKwkgKiBudHAgc2VydmVycyByZXBseSBmcm9tIHRoZWlyICpvdGhlciBJUCouCisJICogVE9ETzogbWF5YmUgd2Ugc2hvdWxkIGNoZWNrIGF0IGxlYXN0IHdoYXQgd2UgY2FuOiBmcm9tLnBvcnQgPT0gMTIzPworCSAqLworIHJlY3ZfYWdhaW46CisJc2l6ZSA9IHJlY3YocC0+cF9mZCwgJm1zZywgc2l6ZW9mKG1zZyksIE1TR19ET05UV0FJVCk7CisJaWYgKHNpemUgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCS8qIFNpZ25hbCBjYXVnaHQgKi8KKwkJCWdvdG8gcmVjdl9hZ2FpbjsKKwkJaWYgKGVycm5vID09IEVBR0FJTikKKwkJCS8qIFRoZXJlIHdhcyBubyBwYWNrZXQgYWZ0ZXIgYWxsCisJCQkgKiAocG9sbCgpIHJldHVybmluZyBQT0xMSU4gZm9yIGEgZmQKKwkJCSAqIGlzIG5vdCBhIGlyb25jbGFkIGd1YXJhbnRlZSB0aGF0IGRhdGEgaXMgdGhlcmUpCisJCQkgKi8KKwkJCXJldHVybjsKKwkJLyoKKwkJICogSWYgeW91IG5lZWQgYSBkaWZmZXJlbnQgaGFuZGxpbmcgZm9yIGEgc3BlY2lmaWMKKwkJICogZXJybm8sIGFsd2F5cyBleHBsYWluIGl0IGluIGNvbW1lbnQuCisJCSAqLworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInJlY3YoJXMpIGVycm9yIiwgcC0+cF9kb3R0ZWQpOworCX0KKworCWlmIChzaXplICE9IE5UUF9NU0dTSVpFX05PQVVUSCAmJiBzaXplICE9IE5UUF9NU0dTSVpFKSB7CisJCWJiX2Vycm9yX21zZygibWFsZm9ybWVkIHBhY2tldCByZWNlaXZlZCBmcm9tICVzIiwgcC0+cF9kb3R0ZWQpOworCQlyZXR1cm47CisJfQorCisJaWYgKG1zZy5tX29yZ3RpbWUuaW50X3BhcnRsICE9IHAtPnBfeG10X21zZy5tX3htdHRpbWUuaW50X3BhcnRsCisJIHx8IG1zZy5tX29yZ3RpbWUuZnJhY3Rpb25sICE9IHAtPnBfeG10X21zZy5tX3htdHRpbWUuZnJhY3Rpb25sCisJKSB7CisJCS8qIFNvbWVib2R5IGVsc2UncyBwYWNrZXQgKi8KKwkJcmV0dXJuOworCX0KKworCS8qIFdlIGRvIG5vdCBleHBlY3QgYW55IG1vcmUgcGFja2V0cyBmcm9tIHRoaXMgcGVlciBmb3Igbm93LgorCSAqIENsb3NpbmcgdGhlIHNvY2tldCBpbmZvcm1zIGtlcm5lbCBhYm91dCBpdC4KKwkgKiBXZSBvcGVuIGEgbmV3IHNvY2tldCB3aGVuIHdlIHNlbmQgYSBuZXcgcXVlcnkuCisJICovCisJY2xvc2UocC0+cF9mZCk7CisJcC0+cF9mZCA9IC0xOworCisJaWYgKChtc2cubV9zdGF0dXMgJiBMSV9BTEFSTSkgPT0gTElfQUxBUk0KKwkgfHwgbXNnLm1fc3RyYXR1bSA9PSAwCisJIHx8IG1zZy5tX3N0cmF0dW0gPiBOVFBfTUFYU1RSQVRVTQorCSkgeworCQliYl9lcnJvcl9tc2coInJlcGx5IGZyb20gJXM6IHBlZXIgaXMgdW5zeW5jZWQiLCBwLT5wX2RvdHRlZCk7CisJCS8qCisJCSAqIFN0cmF0dW0gMCByZXNwb25zZXMgbWF5IGhhdmUgY29tbWFuZHMgaW4gMzItYml0IG1fcmVmaWQgZmllbGQ6CisJCSAqICJERU5ZIiwgIlJTVFIiIC0gcGVlciBkb2VzIG5vdCBsaWtlIHVzIGF0IGFsbCwKKwkJICogIlJBVEUiIC0gcGVlciBpcyBvdmVybG9hZGVkLCByZWR1Y2UgcG9sbGluZyBmcmVxLgorCQkgKiBJZiBwb2xsIGludGVydmFsIGlzIHNtYWxsLCBpbmNyZWFzZSBpdC4KKwkJICovCisJCWlmIChHLnBvbGxfZXhwIDwgQklHUE9MTCkKKwkJCWdvdG8gaW5jcmVhc2VfaW50ZXJ2YWw7CisJCWdvdG8gcGlja19ub3JtYWxfaW50ZXJ2YWw7CisJfQorCisvLwkvKiBWZXJpZnkgdmFsaWQgcm9vdCBkaXN0YW5jZSAqLworLy8JaWYgKG1zZy5tX3Jvb3RkZWxheSAvIDIgKyBtc2cubV9yb290ZGlzcCA+PSBNQVhESVNQIHx8IHAtPmxhc3Rwa3RfcmVmdGltZSA+IG1zZy5tX3htdCkKKy8vCQlyZXR1cm47ICAgICAgICAgICAgICAgICAvKiBpbnZhbGlkIGhlYWRlciB2YWx1ZXMgKi8KKworCS8qCisJICogRnJvbSBSRkMgMjAzMCAod2l0aCBhIGNvcnJlY3Rpb24gdG8gdGhlIGRlbGF5IG1hdGgpOgorCSAqCisJICogVGltZXN0YW1wIE5hbWUgICAgICAgICAgSUQgICBXaGVuIEdlbmVyYXRlZAorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCSAqIE9yaWdpbmF0ZSBUaW1lc3RhbXAgICAgIFQxICAgdGltZSByZXF1ZXN0IHNlbnQgYnkgY2xpZW50CisJICogUmVjZWl2ZSBUaW1lc3RhbXAgICAgICAgVDIgICB0aW1lIHJlcXVlc3QgcmVjZWl2ZWQgYnkgc2VydmVyCisJICogVHJhbnNtaXQgVGltZXN0YW1wICAgICAgVDMgICB0aW1lIHJlcGx5IHNlbnQgYnkgc2VydmVyCisJICogRGVzdGluYXRpb24gVGltZXN0YW1wICAgVDQgICB0aW1lIHJlcGx5IHJlY2VpdmVkIGJ5IGNsaWVudAorCSAqCisJICogVGhlIHJvdW5kdHJpcCBkZWxheSBhbmQgbG9jYWwgY2xvY2sgb2Zmc2V0IGFyZSBkZWZpbmVkIGFzCisJICoKKwkgKiBkZWxheSA9IChUNCAtIFQxKSAtIChUMyAtIFQyKTsgb2Zmc2V0ID0gKChUMiAtIFQxKSArIChUMyAtIFQ0KSkgLyAyCisJICovCisJVDEgPSBwLT5wX3htdHRpbWU7CisJVDIgPSBsZnBfdG9fZChtc2cubV9yZWN0aW1lKTsKKwlUMyA9IGxmcF90b19kKG1zZy5tX3htdHRpbWUpOworCVQ0ID0gRy5jdXJfdGltZTsKKworCS8qIFRoZSBkZWxheSBjYWxjdWxhdGlvbiBpcyBhIHNwZWNpYWwgY2FzZS4gSW4gY2FzZXMgd2hlcmUgdGhlCisJICogc2VydmVyIGFuZCBjbGllbnQgY2xvY2tzIGFyZSBydW5uaW5nIGF0IGRpZmZlcmVudCByYXRlcyBhbmQKKwkgKiB3aXRoIHZlcnkgZmFzdCBuZXR3b3JrcywgdGhlIGRlbGF5IGNhbiBhcHBlYXIgbmVnYXRpdmUuIEluCisJICogb3JkZXIgdG8gYXZvaWQgdmlvbGF0aW5nIHRoZSBQcmluY2lwbGUgb2YgTGVhc3QgQXN0b25pc2htZW50LAorCSAqIHRoZSBkZWxheSBpcyBjbGFtcGVkIG5vdCBsZXNzIHRoYW4gdGhlIHN5c3RlbSBwcmVjaXNpb24uCisJICovCisJZGVsYXkgPSAoVDQgLSBUMSkgLSAoVDMgLSBUMik7CisJaWYgKGRlbGF5IDwgR19wcmVjaXNpb25fc2VjKQorCQlkZWxheSA9IEdfcHJlY2lzaW9uX3NlYzsKKwkvKgorCSAqIElmIHRoaXMgcGFja2V0J3MgZGVsYXkgaXMgbXVjaCBiaWdnZXIgdGhhbiB0aGUgbGFzdCBvbmUsCisJICogaXQncyBiZXR0ZXIgdG8ganVzdCBpZ25vcmUgaXQgdGhhbiB1c2UgaXRzIG11Y2ggbGVzcyBwcmVjaXNlIHZhbHVlLgorCSAqLworCXByZXZfZGVsYXkgPSBwLT5wX3Jhd19kZWxheTsKKwlwLT5wX3Jhd19kZWxheSA9IGRlbGF5OworCWlmIChwLT5yZWFjaGFibGVfYml0cyAmJiBkZWxheSA+IHByZXZfZGVsYXkgKiBCQURfREVMQVlfR1JPV1RIKSB7CisJCWJiX2Vycm9yX21zZygicmVwbHkgZnJvbSAlczogZGVsYXkgJWYgaXMgdG9vIGhpZ2gsIGlnbm9yaW5nIiwgcC0+cF9kb3R0ZWQsIGRlbGF5KTsKKwkJZ290byBwaWNrX25vcm1hbF9pbnRlcnZhbDsKKwl9CisKKwlwLT5sYXN0cGt0X2RlbGF5ID0gZGVsYXk7CisJcC0+bGFzdHBrdF9yZWN2X3RpbWUgPSBUNDsKKwlWRVJCNiBiYl9lcnJvcl9tc2coIiVzLT5sYXN0cGt0X3JlY3ZfdGltZT0lZiIsIHAtPnBfZG90dGVkLCBwLT5sYXN0cGt0X3JlY3ZfdGltZSk7CisJcC0+bGFzdHBrdF9zdGF0dXMgPSBtc2cubV9zdGF0dXM7CisJcC0+bGFzdHBrdF9zdHJhdHVtID0gbXNnLm1fc3RyYXR1bTsKKwlwLT5sYXN0cGt0X3Jvb3RkZWxheSA9IHNmcF90b19kKG1zZy5tX3Jvb3RkZWxheSk7CisJcC0+bGFzdHBrdF9yb290ZGlzcCA9IHNmcF90b19kKG1zZy5tX3Jvb3RkaXNwKTsKKwlwLT5sYXN0cGt0X3JlZmlkID0gbXNnLm1fcmVmaWQ7CisKKwlwLT5kYXRhcG9pbnRfaWR4ID0gcC0+cmVhY2hhYmxlX2JpdHMgPyAocC0+ZGF0YXBvaW50X2lkeCArIDEpICUgTlVNX0RBVEFQT0lOVFMgOiAwOworCWRhdGFwb2ludCA9ICZwLT5maWx0ZXJfZGF0YXBvaW50W3AtPmRhdGFwb2ludF9pZHhdOworCWRhdGFwb2ludC0+ZF9yZWN2X3RpbWUgPSBUNDsKKwlkYXRhcG9pbnQtPmRfb2Zmc2V0ICAgID0gb2Zmc2V0ID0gKChUMiAtIFQxKSArIChUMyAtIFQ0KSkgLyAyOworCWRhdGFwb2ludC0+ZF9kaXNwZXJzaW9uID0gTE9HMkQobXNnLm1fcHJlY2lzaW9uX2V4cCkgKyBHX3ByZWNpc2lvbl9zZWM7CisJaWYgKCFwLT5yZWFjaGFibGVfYml0cykgeworCQkvKiAxc3QgZGF0YXBvaW50IGV2ZXIgLSByZXBsaWNhdGUgb2Zmc2V0IGluIGV2ZXJ5IGVsZW1lbnQgKi8KKwkJaW50IGk7CisJCWZvciAoaSA9IDA7IGkgPCBOVU1fREFUQVBPSU5UUzsgaSsrKSB7CisJCQlwLT5maWx0ZXJfZGF0YXBvaW50W2ldLmRfb2Zmc2V0ID0gb2Zmc2V0OworCQl9CisJfQorCisJcC0+cmVhY2hhYmxlX2JpdHMgfD0gMTsKKwlpZiAoKE1BWF9WRVJCT1NFICYmIEcudmVyYm9zZSkgfHwgKG9wdGlvbl9tYXNrMzIgJiBPUFRfdykpIHsKKwkJYmJfZXJyb3JfbXNnKCJyZXBseSBmcm9tICVzOiBvZmZzZXQ6JStmIGRlbGF5OiVmIHN0YXR1czoweCUwMnggc3RyYXQ6JWQgcmVmaWQ6MHglMDh4IHJvb3RkZWxheTolZiByZWFjaDoweCUwMngiLAorCQkJcC0+cF9kb3R0ZWQsCisJCQlvZmZzZXQsCisJCQlwLT5sYXN0cGt0X2RlbGF5LAorCQkJcC0+bGFzdHBrdF9zdGF0dXMsCisJCQlwLT5sYXN0cGt0X3N0cmF0dW0sCisJCQlwLT5sYXN0cGt0X3JlZmlkLAorCQkJcC0+bGFzdHBrdF9yb290ZGVsYXksCisJCQlwLT5yZWFjaGFibGVfYml0cworCQkJLyogbm90IHNob3duOiBtX3Bwb2xsLCBtX3ByZWNpc2lvbl9leHAsIG1fcm9vdGRpc3AsCisJCQkgKiBtX3JlZnRpbWUsIG1fb3JndGltZSwgbV9yZWN0aW1lLCBtX3htdHRpbWUKKwkJCSAqLworCQkpOworCX0KKworCS8qIE11Y2sgd2l0aCBzdGF0aWN0aWNzIGFuZCB1cGRhdGUgdGhlIGNsb2NrICovCisJZmlsdGVyX2RhdGFwb2ludHMocCk7CisJcSA9IHNlbGVjdF9hbmRfY2x1c3RlcigpOworCXJjID0gMDsKKwlpZiAocSkgeworCQlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX3cpKSB7CisJCQlyYyA9IHVwZGF0ZV9sb2NhbF9jbG9jayhxKTsKKyNpZiAwCisvL0Rpc2FibGVkIHRoaXMgYmVjYXVzZSB0aGVyZSBpcyBhIGNhc2Ugd2hlcmUgbGFyZ2lzaCBvZmZzZXRzCisvL2FyZSB1bmF2b2lkYWJsZTogaWYgbmV0d29yayByb3VuZC10cmlwIGRlbGF5IGlzLCBzYXksIH4wLjZzLAorLy9lcnJvciBpbiBvZmZzZXQgZXN0aW1hdGlvbiB3b3VsZCBiZSB+ZGVsYXkvMiB+PSAwLjNzLgorLy9UaHVzLCBvZmZzZXRzIHdpbGwgYmUgdXN1YWxseSBpbiAtMC4zLi4uMC4zcyByYW5nZS4KKy8vSW4gdGhpcyBjYXNlLCB0aGlzIGNvZGUgd291bGQga2VlcCBwb2xsIGludGVydmFsIHNtYWxsLAorLy9idXQgaXQgd29uJ3QgYmUgaGVscGluZy4KKy8vQklHT0ZGIGNoZWNrIGJlbG93IGRlYWxzIHdpdGggYSBjYXNlIG9mIHNlZWluZyBtdWx0aS1zZWNvbmQgb2Zmc2V0cy4KKworCQkJLyogSWYgZHJpZnQgaXMgZGFuZ2Vyb3VzbHkgbGFyZ2UsIGltbWVkaWF0ZWx5CisJCQkgKiBkcm9wIHBvbGwgaW50ZXJ2YWwgb25lIHN0ZXAgZG93bi4KKwkJCSAqLworCQkJaWYgKGZhYnMocS0+ZmlsdGVyX29mZnNldCkgPj0gUE9MTERPV05fT0ZGU0VUKSB7CisJCQkJVkVSQjQgYmJfZXJyb3JfbXNnKCJvZmZzZXQ6JStmID4gUE9MTERPV05fT0ZGU0VUIiwgcS0+ZmlsdGVyX29mZnNldCk7CisJCQkJYWRqdXN0X3BvbGwoLVBPTExBREpfTElNSVQgKiAzKTsKKwkJCQlyYyA9IDA7CisJCQl9CisjZW5kaWYKKwkJfQorCX0gZWxzZSB7CisJCS8qIE5vIHBlZXIgc2VsZWN0ZWQuCisJCSAqIElmIHBvbGwgaW50ZXJ2YWwgaXMgc21hbGwsIGluY3JlYXNlIGl0LgorCQkgKi8KKwkJaWYgKEcucG9sbF9leHAgPCBCSUdQT0xMKQorCQkJZ290byBpbmNyZWFzZV9pbnRlcnZhbDsKKwl9CisKKwlpZiAocmMgIT0gMCkgeworCQkvKiBBZGp1c3QgdGhlIHBvbGwgaW50ZXJ2YWwgYnkgY29tcGFyaW5nIHRoZSBjdXJyZW50IG9mZnNldAorCQkgKiB3aXRoIHRoZSBjbG9jayBqaXR0ZXIuIElmIHRoZSBvZmZzZXQgaXMgbGVzcyB0aGFuCisJCSAqIHRoZSBjbG9jayBqaXR0ZXIgdGltZXMgYSBjb25zdGFudCwgdGhlbiB0aGUgYXZlcmFnaW5nIGludGVydmFsCisJCSAqIGlzIGluY3JlYXNlZCwgb3RoZXJ3aXNlIGl0IGlzIGRlY3JlYXNlZC4gQSBiaXQgb2YgaHlzdGVyZXNpcworCQkgKiBoZWxwcyBjYWxtIHRoZSBkYW5jZS4gV29ya3MgYmVzdCB1c2luZyBidXJzdCBtb2RlLgorCQkgKi8KKwkJaWYgKHJjID4gMCAmJiBHLm9mZnNldF90b19qaXR0ZXJfcmF0aW8gPD0gUE9MTEFESl9HQVRFKSB7CisJCQkvKiB3YXMgKz0gRy5wb2xsX2V4cCBidXQgaXQgaXMgYSBiaXQKKwkJCSAqIHRvbyBvcHRpbWlzdGljIGZvciBteSB0YXN0ZSBhdCBoaWdoIHBvbGxfZXhwJ3MgKi8KKyBpbmNyZWFzZV9pbnRlcnZhbDoKKwkJCWFkanVzdF9wb2xsKE1JTlBPTEwpOworCQl9IGVsc2UgeworCQkJYWRqdXN0X3BvbGwoLUcucG9sbF9leHAgKiAyKTsKKwkJfQorCX0KKworCS8qIERlY2lkZSB3aGVuIHRvIHNlbmQgbmV3IHF1ZXJ5IGZvciB0aGlzIHBlZXIgKi8KKyBwaWNrX25vcm1hbF9pbnRlcnZhbDoKKwlpbnRlcnZhbCA9IHBvbGxfaW50ZXJ2YWwoSU5UX01BWCk7CisJaWYgKGZhYnMob2Zmc2V0KSA+PSBCSUdPRkYgJiYgaW50ZXJ2YWwgPiBCSUdPRkZfSU5URVJWQUwpIHsKKwkJLyogSWYgd2UgYXJlIHN5bmNlZCwgb2Zmc2V0cyBhcmUgbGVzcyB0aGFuIFNURVBfVEhSRVNIT0xELAorCQkgKiBvciBhdCB0aGUgdmVyeSBsZWFzdCBub3QgbXVjaCBsYXJnZXIgdGhhbiBpdC4KKwkJICogTm93IHdlIHNlZSBhIGxhcmdpc2ggb25lLgorCQkgKiBFaXRoZXIgdGhpcyBwZWVyIGlzIGZlZWxpbmcgYmFkLCBvciBwYWNrZXQgZ290IGNvcnJ1cHRlZCwKKwkJICogb3IgX291cl8gY2xvY2sgaXMgd3Jvbmcgbm93IGFuZCBfYWxsXyBwZWVycyB3aWxsIHNob3cgc2ltaWxhcgorCQkgKiBsYXJnaXNoIG9mZnNldHMgdG9vLgorCQkgKiBJIG9ic2VydmVkIHRoaXMgd2l0aCBsYXB0b3Agc3VzcGVuZCBzdG9wcGluZyBjbG9jay4KKwkJICogSW4gYW55IGNhc2UsIGl0IG1ha2VzIHNlbnNlIHRvIG1ha2UgbmV4dCByZXF1ZXN0IHNvb25pc2g6CisJCSAqIGNhc2VzIDEgYW5kIDI6IGdldCBhIGJldHRlciBkYXRhcG9pbnQsCisJCSAqIGNhc2UgMzogYWxsb3dzIHRvIHJlc3luYyBmYXN0ZXIuCisJCSAqLworCQlpbnRlcnZhbCA9IEJJR09GRl9JTlRFUlZBTDsKKwl9CisKKwlzZXRfbmV4dChwLCBpbnRlcnZhbCk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9OVFBEX1NFUlZFUgorc3RhdGljIE5PSU5MSU5FIHZvaWQKK3JlY3ZfYW5kX3Byb2Nlc3NfY2xpZW50X3BrdCh2b2lkIC8qaW50IGZkKi8pCit7CisJc3NpemVfdCAgICAgICAgICBzaXplOworCS8vdWludDhfdCAgICAgICAgICB2ZXJzaW9uOworCWxlbl9hbmRfc29ja2FkZHIgKnRvOworCXN0cnVjdCBzb2NrYWRkciAgKmZyb207CisJbXNnX3QgICAgICAgICAgICBtc2c7CisJdWludDhfdCAgICAgICAgICBxdWVyeV9zdGF0dXM7CisJbF9maXhlZHB0X3QgICAgICBxdWVyeV94bXR0aW1lOworCisJdG8gPSBnZXRfc29ja19sc2EoR19saXN0ZW5fZmQpOworCWZyb20gPSB4emFsbG9jKHRvLT5sZW4pOworCisJc2l6ZSA9IHJlY3ZfZnJvbV90byhHX2xpc3Rlbl9mZCwgJm1zZywgc2l6ZW9mKG1zZyksIE1TR19ET05UV0FJVCwgZnJvbSwgJnRvLT51LnNhLCB0by0+bGVuKTsKKwlpZiAoc2l6ZSAhPSBOVFBfTVNHU0laRV9OT0FVVEggJiYgc2l6ZSAhPSBOVFBfTVNHU0laRSkgeworCQljaGFyICphZGRyOworCQlpZiAoc2l6ZSA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFQUdBSU4pCisJCQkJZ290byBiYWlsOworCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJyZWN2Iik7CisJCX0KKwkJYWRkciA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkX25vcG9ydChmcm9tKTsKKwkJYmJfZXJyb3JfbXNnKCJtYWxmb3JtZWQgcGFja2V0IHJlY2VpdmVkIGZyb20gJXM6IHNpemUgJXUiLCBhZGRyLCAoaW50KXNpemUpOworCQlmcmVlKGFkZHIpOworCQlnb3RvIGJhaWw7CisJfQorCisJcXVlcnlfc3RhdHVzID0gbXNnLm1fc3RhdHVzOworCXF1ZXJ5X3htdHRpbWUgPSBtc2cubV94bXR0aW1lOworCisJLyogQnVpbGQgYSByZXBseSBwYWNrZXQgKi8KKwltZW1zZXQoJm1zZywgMCwgc2l6ZW9mKG1zZykpOworCW1zZy5tX3N0YXR1cyA9IEcuc3RyYXR1bSA8IE1BWFNUUkFUID8gKEcubnRwX3N0YXR1cyAmIExJX01BU0spIDogTElfQUxBUk07CisJbXNnLm1fc3RhdHVzIHw9IChxdWVyeV9zdGF0dXMgJiBWRVJTSU9OX01BU0spOworCW1zZy5tX3N0YXR1cyB8PSAoKHF1ZXJ5X3N0YXR1cyAmIE1PREVfTUFTSykgPT0gTU9ERV9DTElFTlQpID8KKwkJCU1PREVfU0VSVkVSIDogTU9ERV9TWU1fUEFTOworCW1zZy5tX3N0cmF0dW0gPSBHLnN0cmF0dW07CisJbXNnLm1fcHBvbGwgPSBHLnBvbGxfZXhwOworCW1zZy5tX3ByZWNpc2lvbl9leHAgPSBHX3ByZWNpc2lvbl9leHA7CisJLyogdGhpcyB0aW1lIHdhcyBvYnRhaW5lZCBiZXR3ZWVuIHBvbGwoKSBhbmQgcmVjdigpICovCisJbXNnLm1fcmVjdGltZSA9IGRfdG9fbGZwKEcuY3VyX3RpbWUpOworCW1zZy5tX3htdHRpbWUgPSBkX3RvX2xmcChnZXR0aW1lMTkwMGQoKSk7IC8qIHRoaXMgaW5zdGFudCAqLworCWlmIChHLnBlZXJfY250ID09IDApIHsKKwkJLyogd2UgaGF2ZSBubyBwZWVyczogInN0cmF0dW0gMSBzZXJ2ZXIiIG1vZGUuIHJlZnRpbWUgPSBvdXIgb3duIHRpbWUgKi8KKwkJRy5yZWZ0aW1lID0gRy5jdXJfdGltZTsKKwl9CisJbXNnLm1fcmVmdGltZSA9IGRfdG9fbGZwKEcucmVmdGltZSk7CisJbXNnLm1fb3JndGltZSA9IHF1ZXJ5X3htdHRpbWU7CisJbXNnLm1fcm9vdGRlbGF5ID0gZF90b19zZnAoRy5yb290ZGVsYXkpOworLy9zaW1wbGUgY29kZSBkb2VzIG5vdCBkbyB0aGlzLCBmaXggc2ltcGxlIGNvZGUhCisJbXNnLm1fcm9vdGRpc3AgPSBkX3RvX3NmcChHLnJvb3RkaXNwKTsKKwkvL3ZlcnNpb24gPSAocXVlcnlfc3RhdHVzICYgVkVSU0lPTl9NQVNLKTsgLyogLi4uID4+IFZFUlNJT05fU0hJRlQgLSBkb25lIGJlbG93IGluc3RlYWQgKi8KKwltc2cubV9yZWZpZCA9IEcucmVmaWQ7IC8vICh2ZXJzaW9uID4gKDMgPDwgVkVSU0lPTl9TSElGVCkpID8gRy5yZWZpZCA6IEcucmVmaWQzOworCisJLyogV2UgcmVwbHkgZnJvbSB0aGUgbG9jYWwgYWRkcmVzcyBwYWNrZXQgd2FzIHNlbnQgdG8sCisJICogdGhpcyBtYWtlcyB0by9mcm9tIGxvb2sgc3dhcHBlZCBoZXJlOiAqLworCWRvX3NlbmR0byhHX2xpc3Rlbl9mZCwKKwkJLypmcm9tOiovICZ0by0+dS5zYSwgLyp0bzoqLyBmcm9tLCAvKmFkZHJsZW46Ki8gdG8tPmxlbiwKKwkJJm1zZywgc2l6ZSk7CisKKyBiYWlsOgorCWZyZWUodG8pOworCWZyZWUoZnJvbSk7Cit9CisjZW5kaWYKKworLyogVXBzdHJlYW0gbnRwZCdzIG9wdGlvbnM6CisgKgorICogLTQgICBGb3JjZSBETlMgcmVzb2x1dGlvbiBvZiBob3N0IG5hbWVzIHRvIHRoZSBJUHY0IG5hbWVzcGFjZS4KKyAqIC02ICAgRm9yY2UgRE5TIHJlc29sdXRpb24gb2YgaG9zdCBuYW1lcyB0byB0aGUgSVB2NiBuYW1lc3BhY2UuCisgKiAtYSAgIFJlcXVpcmUgY3J5cHRvZ3JhcGhpYyBhdXRoZW50aWNhdGlvbiBmb3IgYnJvYWRjYXN0IGNsaWVudCwKKyAqICAgICAgbXVsdGljYXN0IGNsaWVudCBhbmQgc3ltbWV0cmljIHBhc3NpdmUgYXNzb2NpYXRpb25zLgorICogICAgICBUaGlzIGlzIHRoZSBkZWZhdWx0LgorICogLUEgICBEbyBub3QgcmVxdWlyZSBjcnlwdG9ncmFwaGljIGF1dGhlbnRpY2F0aW9uIGZvciBicm9hZGNhc3QgY2xpZW50LAorICogICAgICBtdWx0aWNhc3QgY2xpZW50IGFuZCBzeW1tZXRyaWMgcGFzc2l2ZSBhc3NvY2lhdGlvbnMuCisgKiAgICAgIFRoaXMgaXMgYWxtb3N0IG5ldmVyIGEgZ29vZCBpZGVhLgorICogLWIgICBFbmFibGUgdGhlIGNsaWVudCB0byBzeW5jaHJvbml6ZSB0byBicm9hZGNhc3Qgc2VydmVycy4KKyAqIC1jIGNvbmZmaWxlCisgKiAgICAgIFNwZWNpZnkgdGhlIG5hbWUgYW5kIHBhdGggb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyAqICAgICAgZGVmYXVsdCAvZXRjL250cC5jb25mCisgKiAtZCAgIFNwZWNpZnkgZGVidWdnaW5nIG1vZGUuIFRoaXMgb3B0aW9uIG1heSBvY2N1ciBtb3JlIHRoYW4gb25jZSwKKyAqICAgICAgd2l0aCBlYWNoIG9jY3VycmVuY2UgaW5kaWNhdGluZyBncmVhdGVyIGRldGFpbCBvZiBkaXNwbGF5LgorICogLUQgbGV2ZWwKKyAqICAgICAgU3BlY2lmeSBkZWJ1Z2dpbmcgbGV2ZWwgZGlyZWN0bHkuCisgKiAtZiBkcmlmdGZpbGUKKyAqICAgICAgU3BlY2lmeSB0aGUgbmFtZSBhbmQgcGF0aCBvZiB0aGUgZnJlcXVlbmN5IGZpbGUuCisgKiAgICAgIFRoaXMgaXMgdGhlIHNhbWUgb3BlcmF0aW9uIGFzIHRoZSAiZHJpZnRmaWxlIEZJTEUiCisgKiAgICAgIGNvbmZpZ3VyYXRpb24gY29tbWFuZC4KKyAqIC1nICAgTm9ybWFsbHksIG50cGQgZXhpdHMgd2l0aCBhIG1lc3NhZ2UgdG8gdGhlIHN5c3RlbSBsb2cKKyAqICAgICAgaWYgdGhlIG9mZnNldCBleGNlZWRzIHRoZSBwYW5pYyB0aHJlc2hvbGQsIHdoaWNoIGlzIDEwMDAgcworICogICAgICBieSBkZWZhdWx0LiBUaGlzIG9wdGlvbiBhbGxvd3MgdGhlIHRpbWUgdG8gYmUgc2V0IHRvIGFueSB2YWx1ZQorICogICAgICB3aXRob3V0IHJlc3RyaWN0aW9uOyBob3dldmVyLCB0aGlzIGNhbiBoYXBwZW4gb25seSBvbmNlLgorICogICAgICBJZiB0aGUgdGhyZXNob2xkIGlzIGV4Y2VlZGVkIGFmdGVyIHRoYXQsIG50cGQgd2lsbCBleGl0CisgKiAgICAgIHdpdGggYSBtZXNzYWdlIHRvIHRoZSBzeXN0ZW0gbG9nLiBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZAorICogICAgICB3aXRoIHRoZSAtcSBhbmQgLXggb3B0aW9ucy4gU2VlIHRoZSB0aW5rZXIgY29tbWFuZCBmb3Igb3RoZXIgb3B0aW9ucy4KKyAqIC1pIGphaWxkaXIKKyAqICAgICAgQ2hyb290IHRoZSBzZXJ2ZXIgdG8gdGhlIGRpcmVjdG9yeSBqYWlsZGlyLiBUaGlzIG9wdGlvbiBhbHNvIGltcGxpZXMKKyAqICAgICAgdGhhdCB0aGUgc2VydmVyIGF0dGVtcHRzIHRvIGRyb3Agcm9vdCBwcml2aWxlZ2VzIGF0IHN0YXJ0dXAKKyAqICAgICAgKG90aGVyd2lzZSwgY2hyb290IGdpdmVzIHZlcnkgbGl0dGxlIGFkZGl0aW9uYWwgc2VjdXJpdHkpLgorICogICAgICBZb3UgbWF5IG5lZWQgdG8gYWxzbyBzcGVjaWZ5IGEgLXUgb3B0aW9uLgorICogLWsga2V5ZmlsZQorICogICAgICBTcGVjaWZ5IHRoZSBuYW1lIGFuZCBwYXRoIG9mIHRoZSBzeW1tZXRyaWMga2V5IGZpbGUsCisgKiAgICAgIGRlZmF1bHQgL2V0Yy9udHAva2V5cy4gVGhpcyBpcyB0aGUgc2FtZSBvcGVyYXRpb24KKyAqICAgICAgYXMgdGhlICJrZXlzIEZJTEUiIGNvbmZpZ3VyYXRpb24gY29tbWFuZC4KKyAqIC1sIGxvZ2ZpbGUKKyAqICAgICAgU3BlY2lmeSB0aGUgbmFtZSBhbmQgcGF0aCBvZiB0aGUgbG9nIGZpbGUuIFRoZSBkZWZhdWx0CisgKiAgICAgIGlzIHRoZSBzeXN0ZW0gbG9nIGZpbGUuIFRoaXMgaXMgdGhlIHNhbWUgb3BlcmF0aW9uIGFzCisgKiAgICAgIHRoZSAibG9nZmlsZSBGSUxFIiBjb25maWd1cmF0aW9uIGNvbW1hbmQuCisgKiAtTCAgIERvIG5vdCBsaXN0ZW4gdG8gdmlydHVhbCBJUHMuIFRoZSBkZWZhdWx0IGlzIHRvIGxpc3Rlbi4KKyAqIC1uICAgRG9uJ3QgZm9yay4KKyAqIC1OICAgVG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0sCisgKiAgICAgIHJ1biB0aGUgbnRwZCBhdCB0aGUgaGlnaGVzdCBwcmlvcml0eS4KKyAqIC1wIHBpZGZpbGUKKyAqICAgICAgU3BlY2lmeSB0aGUgbmFtZSBhbmQgcGF0aCBvZiB0aGUgZmlsZSB1c2VkIHRvIHJlY29yZCB0aGUgbnRwZAorICogICAgICBwcm9jZXNzIElELiBUaGlzIGlzIHRoZSBzYW1lIG9wZXJhdGlvbiBhcyB0aGUgInBpZGZpbGUgRklMRSIKKyAqICAgICAgY29uZmlndXJhdGlvbiBjb21tYW5kLgorICogLVAgcHJpb3JpdHkKKyAqICAgICAgVG8gdGhlIGV4dGVudCBwZXJtaXR0ZWQgYnkgdGhlIG9wZXJhdGluZyBzeXN0ZW0sCisgKiAgICAgIHJ1biB0aGUgbnRwZCBhdCB0aGUgc3BlY2lmaWVkIHByaW9yaXR5LgorICogLXEgICBFeGl0IHRoZSBudHBkIGp1c3QgYWZ0ZXIgdGhlIGZpcnN0IHRpbWUgdGhlIGNsb2NrIGlzIHNldC4KKyAqICAgICAgVGhpcyBiZWhhdmlvciBtaW1pY3MgdGhhdCBvZiB0aGUgbnRwZGF0ZSBwcm9ncmFtLCB3aGljaCBpcworICogICAgICB0byBiZSByZXRpcmVkLiBUaGUgLWcgYW5kIC14IG9wdGlvbnMgY2FuIGJlIHVzZWQgd2l0aCB0aGlzIG9wdGlvbi4KKyAqICAgICAgTm90ZTogVGhlIGtlcm5lbCB0aW1lIGRpc2NpcGxpbmUgaXMgZGlzYWJsZWQgd2l0aCB0aGlzIG9wdGlvbi4KKyAqIC1yIGJyb2FkY2FzdGRlbGF5CisgKiAgICAgIFNwZWNpZnkgdGhlIGRlZmF1bHQgcHJvcGFnYXRpb24gZGVsYXkgZnJvbSB0aGUgYnJvYWRjYXN0L211bHRpY2FzdAorICogICAgICBzZXJ2ZXIgdG8gdGhpcyBjbGllbnQuIFRoaXMgaXMgbmVjZXNzYXJ5IG9ubHkgaWYgdGhlIGRlbGF5CisgKiAgICAgIGNhbm5vdCBiZSBjb21wdXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBwcm90b2NvbC4KKyAqIC1zIHN0YXRzZGlyCisgKiAgICAgIFNwZWNpZnkgdGhlIGRpcmVjdG9yeSBwYXRoIGZvciBmaWxlcyBjcmVhdGVkIGJ5IHRoZSBzdGF0aXN0aWNzCisgKiAgICAgIGZhY2lsaXR5LiBUaGlzIGlzIHRoZSBzYW1lIG9wZXJhdGlvbiBhcyB0aGUgInN0YXRzZGlyIERJUiIKKyAqICAgICAgY29uZmlndXJhdGlvbiBjb21tYW5kLgorICogLXQga2V5CisgKiAgICAgIEFkZCBhIGtleSBudW1iZXIgdG8gdGhlIHRydXN0ZWQga2V5IGxpc3QuIFRoaXMgb3B0aW9uIGNhbiBvY2N1cgorICogICAgICBtb3JlIHRoYW4gb25jZS4KKyAqIC11IHVzZXJbOmdyb3VwXQorICogICAgICBTcGVjaWZ5IGEgdXNlciwgYW5kIG9wdGlvbmFsbHkgYSBncm91cCwgdG8gc3dpdGNoIHRvLgorICogLXYgdmFyaWFibGUKKyAqIC1WIHZhcmlhYmxlCisgKiAgICAgIEFkZCBhIHN5c3RlbSB2YXJpYWJsZSBsaXN0ZWQgYnkgZGVmYXVsdC4KKyAqIC14ICAgTm9ybWFsbHksIHRoZSB0aW1lIGlzIHNsZXdlZCBpZiB0aGUgb2Zmc2V0IGlzIGxlc3MgdGhhbiB0aGUgc3RlcAorICogICAgICB0aHJlc2hvbGQsIHdoaWNoIGlzIDEyOCBtcyBieSBkZWZhdWx0LCBhbmQgc3RlcHBlZCBpZiBhYm92ZQorICogICAgICB0aGUgdGhyZXNob2xkLiBUaGlzIG9wdGlvbiBzZXRzIHRoZSB0aHJlc2hvbGQgdG8gNjAwIHMsIHdoaWNoIGlzCisgKiAgICAgIHdlbGwgd2l0aGluIHRoZSBhY2N1cmFjeSB3aW5kb3cgdG8gc2V0IHRoZSBjbG9jayBtYW51YWxseS4KKyAqICAgICAgTm90ZTogc2luY2UgdGhlIHNsZXcgcmF0ZSBvZiB0eXBpY2FsIFVuaXgga2VybmVscyBpcyBsaW1pdGVkCisgKiAgICAgIHRvIDAuNSBtcy9zLCBlYWNoIHNlY29uZCBvZiBhZGp1c3RtZW50IHJlcXVpcmVzIGFuIGFtb3J0aXphdGlvbgorICogICAgICBpbnRlcnZhbCBvZiAyMDAwIHMuIFRodXMsIGFuIGFkanVzdG1lbnQgYXMgbXVjaCBhcyA2MDAgcworICogICAgICB3aWxsIHRha2UgYWxtb3N0IDE0IGRheXMgdG8gY29tcGxldGUuIFRoaXMgb3B0aW9uIGNhbiBiZSB1c2VkCisgKiAgICAgIHdpdGggdGhlIC1nIGFuZCAtcSBvcHRpb25zLiBTZWUgdGhlIHRpbmtlciBjb21tYW5kIGZvciBvdGhlciBvcHRpb25zLgorICogICAgICBOb3RlOiBUaGUga2VybmVsIHRpbWUgZGlzY2lwbGluZSBpcyBkaXNhYmxlZCB3aXRoIHRoaXMgb3B0aW9uLgorICovCisKKy8qIEJ5IGRvaW5nIGluaXQgaW4gYSBzZXBhcmF0ZSBmdW5jdGlvbiB3ZSBkZWNyZWFzZSBzdGFjayB1c2FnZQorICogaW4gbWFpbiBsb29wLgorICovCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBudHBfaW5pdChjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHRzOworCWxsaXN0X3QgKnBlZXJzOworCisJc3JhbmQoZ2V0cGlkKCkpOworCisJaWYgKGdldHVpZCgpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfeW91X211c3RfYmVfcm9vdCk7CisKKwkvKiBTZXQgc29tZSBnbG9iYWxzICovCisJRy5kaXNjaXBsaW5lX2ppdHRlciA9IEdfcHJlY2lzaW9uX3NlYzsKKwlHLnN0cmF0dW0gPSBNQVhTVFJBVDsKKwlpZiAoQlVSU1RQT0xMICE9IDApCisJCUcucG9sbF9leHAgPSBCVVJTVFBPTEw7IC8qIHNwZWVkcyB1cCBpbml0aWFsIHN5bmMgKi8KKwlHLmxhc3Rfc2NyaXB0X3J1biA9IEcucmVmdGltZSA9IEcubGFzdF91cGRhdGVfcmVjdl90aW1lID0gZ2V0dGltZTE5MDBkKCk7IC8qIHNldHMgRy5jdXJfdGltZSB0b28gKi8KKworCS8qIFBhcnNlIG9wdGlvbnMgKi8KKwlwZWVycyA9IE5VTEw7CisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiZGQ6cDo6d24iICAgICAgICAgLyogLWQ6IGNvdW50ZXI7IC1wOiBsaXN0OyAtdyBpbXBsaWVzIC1uICovCisJCUlGX0ZFQVRVUkVfTlRQRF9TRVJWRVIoIjpJbCIpOyAvKiAtSSBpbXBsaWVzIC1sICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsCisJCQkibnFOeCIgLyogY29tcGF0ICovCisJCQkid3A6UzoiSUZfRkVBVFVSRV9OVFBEX1NFUlZFUigibCIpIC8qIE5PVCBjb21wYXQgKi8KKwkJCUlGX0ZFQVRVUkVfTlRQRF9TRVJWRVIoIkk6IikgLyogY29tcGF0ICovCisJCQkiZCIgLyogY29tcGF0ICovCisJCQkiNDZhQWJnTCIsIC8qIGNvbXBhdCwgaWdub3JlZCAqLworCQkJJnBlZXJzLCZHLnNjcmlwdF9uYW1lLAorI2lmIEVOQUJMRV9GRUFUVVJFX05UUERfU0VSVkVSCisJCQkmRy5pZl9uYW1lLAorI2VuZGlmCisJCQkmRy52ZXJib3NlKTsKKworLy8JaWYgKG9wdHMgJiBPUFRfeCkgLyogZGlzYWJsZSBzdGVwcGluZywgb25seSBzbGV3IGlzIGFsbG93ZWQgKi8KKy8vCQlHLnRpbWVfd2FzX3N0ZXBwZWQgPSAxOworCWlmIChwZWVycykgeworCQl3aGlsZSAocGVlcnMpCisJCQlhZGRfcGVlcnMobGxpc3RfcG9wKCZwZWVycykpOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9OVFBEX0NPTkYKKwllbHNlIHsKKwkJcGFyc2VyX3QgKnBhcnNlcjsKKwkJY2hhciAqdG9rZW5bM107CisKKwkJcGFyc2VyID0gY29uZmlnX29wZW4oIi9ldGMvbnRwLmNvbmYiKTsKKwkJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW4sIDMsIDEsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQkJaWYgKHN0cmNtcCh0b2tlblswXSwgInNlcnZlciIpID09IDAgJiYgdG9rZW5bMV0pIHsKKwkJCQlhZGRfcGVlcnModG9rZW5bMV0pOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYmJfZXJyb3JfbXNnKCJza2lwcGluZyAlczoldTogdW5pbXBsZW1lbnRlZCBjb21tYW5kICclcyciLAorCQkJCSIvZXRjL250cC5jb25mIiwgcGFyc2VyLT5saW5lbm8sIHRva2VuWzBdCisJCQkpOworCQl9CisJCWNvbmZpZ19jbG9zZShwYXJzZXIpOworCX0KKyNlbmRpZgorCWlmIChHLnBlZXJfY250ID09IDApIHsKKwkJaWYgKCEob3B0cyAmIE9QVF9sKSkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJLyogLWwgYnV0IG5vIHBlZXJzOiAic3RyYXR1bSAxIHNlcnZlciIgbW9kZSAqLworCQlHLnN0cmF0dW0gPSAxOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9OVFBEX1NFUlZFUgorCUdfbGlzdGVuX2ZkID0gLTE7CisJaWYgKG9wdHMgJiBPUFRfbCkgeworCQlHX2xpc3Rlbl9mZCA9IGNyZWF0ZV9hbmRfYmluZF9kZ3JhbV9vcl9kaWUoTlVMTCwgMTIzKTsKKwkJaWYgKG9wdHMgJiBPUFRfSSkgeworCQkJaWYgKHNldHNvY2tvcHRfYmluZHRvZGV2aWNlKEdfbGlzdGVuX2ZkLCBHLmlmX25hbWUpKQorCQkJCXhmdW5jX2RpZSgpOworCQl9CisJCXNvY2tldF93YW50X3BrdGluZm8oR19saXN0ZW5fZmQpOworCQlzZXRzb2Nrb3B0X2ludChHX2xpc3Rlbl9mZCwgSVBQUk9UT19JUCwgSVBfVE9TLCBJUFRPU19MT1dERUxBWSk7CisJfQorI2VuZGlmCisJaWYgKCEob3B0cyAmIE9QVF9uKSkgeworCQliYl9kYWVtb25pemVfb3JfcmV4ZWMoREFFTU9OX0RFVk5VTExfU1RESU8sIGFyZ3YpOworCQlsb2dtb2RlID0gTE9HTU9ERV9OT05FOworCX0KKwkvKiBJIGhlc2l0YXRlIHRvIHNldCAtMjAgcHJpby4gLTE1IHNob3VsZCBiZSBoaWdoIGVub3VnaCBmb3IgdGltZWtlZXBpbmcgKi8KKwlpZiAob3B0cyAmIE9QVF9OKQorCQlzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIC0xNSk7CisKKwkvKiBJZiBuZXR3b3JrIGlzIHVwLCBzeW5jcm9uaXphdGlvbiBvY2N1cnMgaW4gfjEwIHNlY29uZHMuCisJICogV2UgZ2l2ZSAibnRwZCAtcSIgMTAgc2Vjb25kcyB0byBnZXQgZmlyc3QgcmVwbHksCisJICogdGhlbiBhbm90aGVyIDUwIHNlY29uZHMgdG8gZmluaXNoIHN5bmNpbmcuCisJICoKKwkgKiBJIHRlc3RlZCBudHBkIDQuMi42cDEgYW5kIGFwcGFyZW50bHkgaXQgbmV2ZXIgZXhpdHMKKwkgKiAod2lsbCB0cnkgZm9yZXZlciksIGJ1dCBpdCBkb2VzIG5vdCBmZWVsIHJpZ2h0LgorCSAqIFRoZSBnb2FsIG9mIC1xIGlzIHRvIGFjdCBsaWtlIG50cGRhdGU6IHNldCB0aW1lCisJICogYWZ0ZXIgYSByZWFzb25hYmx5IHNtYWxsIHBlcmlvZCBvZiBwb2xsaW5nLCBvciBmYWlsLgorCSAqLworCWlmIChvcHRzICYgT1BUX3EpIHsKKwkJb3B0aW9uX21hc2szMiB8PSBPUFRfcXE7CisJCWFsYXJtKDEwKTsKKwl9CisKKwliYl9zaWduYWxzKDAKKwkJfCAoMSA8PCBTSUdURVJNKQorCQl8ICgxIDw8IFNJR0lOVCkKKwkJfCAoMSA8PCBTSUdBTFJNKQorCQksIHJlY29yZF9zaWdubworCSk7CisJYmJfc2lnbmFscygwCisJCXwgKDEgPDwgU0lHUElQRSkKKwkJfCAoMSA8PCBTSUdDSExEKQorCQksIFNJR19JR04KKwkpOworfQorCitpbnQgbnRwZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG50cGRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworI3VuZGVmIEcKKwlzdHJ1Y3QgZ2xvYmFscyBHOworCXN0cnVjdCBwb2xsZmQgKnBmZDsKKwlwZWVyX3QgKippZHgycGVlcjsKKwl1bnNpZ25lZCBjbnQ7CisKKwltZW1zZXQoJkcsIDAsIHNpemVvZihHKSk7CisJU0VUX1BUUl9UT19HTE9CQUxTKCZHKTsKKworCW50cF9pbml0KGFyZ3YpOworCisJLyogSWYgRU5BQkxFX0ZFQVRVUkVfTlRQRF9TRVJWRVIsICsgMSBmb3IgbGlzdGVuX2ZkOiAqLworCWNudCA9IEcucGVlcl9jbnQgKyBFTkFCTEVfRkVBVFVSRV9OVFBEX1NFUlZFUjsKKwlpZHgycGVlciA9IHh6YWxsb2Moc2l6ZW9mKGlkeDJwZWVyWzBdKSAqIGNudCk7CisJcGZkID0geHphbGxvYyhzaXplb2YocGZkWzBdKSAqIGNudCk7CisKKwkvKiBDb3VudGRvd246IHdlIG5ldmVyIHN5bmMgYmVmb3JlIHdlIHNlbnQgSU5JVElBTF9TQU1QTEVTKzEKKwkgKiBwYWNrZXRzIHRvIGVhY2ggcGVlci4KKwkgKiBOQjogaWYgc29tZSBwZWVyIGlzIG5vdCByZXNwb25kaW5nLCB3ZSBtYXkgZW5kIHVwIHNlbmRpbmcKKwkgKiBmZXdlciBwYWNrZXRzIHRvIGl0IGFuZCBtb3JlIHRvIG90aGVyIHBlZXJzLgorCSAqIE5CMjogc3luYyB1c3VhbGx5IGhhcHBlbnMgdXNpbmcgSU5JVElBTF9TQU1QTEVTIHBhY2tldHMsCisJICogc2luY2UgbGFzdCByZXBseSBkb2VzIG5vdCBjb21lIGJhY2sgaW5zdGFudGFuZW91c2x5LgorCSAqLworCWNudCA9IEcucGVlcl9jbnQgKiAoSU5JVElBTF9TQU1QTEVTICsgMSk7CisKKwl3cml0ZV9waWRmaWxlKENPTkZJR19QSURfRklMRV9QQVRIICIvbnRwZC5waWQiKTsKKworCXdoaWxlICghYmJfZ290X3NpZ25hbCkgeworCQlsbGlzdF90ICppdGVtOworCQl1bnNpZ25lZCBpLCBqOworCQlpbnQgbmZkcywgdGltZW91dDsKKwkJZG91YmxlIG5leHRhY3Rpb247CisKKwkJLyogTm90aGluZyBiZXR3ZWVuIGhlcmUgYW5kIHBvbGwoKSBibG9ja3MgZm9yIGFueSBzaWduaWZpY2FudCB0aW1lICovCisKKwkJbmV4dGFjdGlvbiA9IEcuY3VyX3RpbWUgKyAzNjAwOworCisJCWkgPSAwOworI2lmIEVOQUJMRV9GRUFUVVJFX05UUERfU0VSVkVSCisJCWlmIChHX2xpc3Rlbl9mZCAhPSAtMSkgeworCQkJcGZkWzBdLmZkID0gR19saXN0ZW5fZmQ7CisJCQlwZmRbMF0uZXZlbnRzID0gUE9MTElOOworCQkJaSsrOworCQl9CisjZW5kaWYKKwkJLyogUGFzcyBvdmVyIHBlZXIgbGlzdCwgc2VuZCByZXF1ZXN0cywgdGltZSBvdXQgb24gcmVjZWl2ZXMgKi8KKwkJZm9yIChpdGVtID0gRy5udHBfcGVlcnM7IGl0ZW0gIT0gTlVMTDsgaXRlbSA9IGl0ZW0tPmxpbmspIHsKKwkJCXBlZXJfdCAqcCA9IChwZWVyX3QgKikgaXRlbS0+ZGF0YTsKKworCQkJaWYgKHAtPm5leHRfYWN0aW9uX3RpbWUgPD0gRy5jdXJfdGltZSkgeworCQkJCWlmIChwLT5wX2ZkID09IC0xKSB7CisJCQkJCS8qIFRpbWUgdG8gc2VuZCBuZXcgcmVxICovCisJCQkJCWlmICgtLWNudCA9PSAwKSB7CisJCQkJCQlWRVJCNCBiYl9lcnJvcl9tc2coImRpc2FibGluZyBidXJzdCBtb2RlIik7CisJCQkJCQlHLnBvbGxhZGpfY291bnQgPSAwOworCQkJCQkJRy5wb2xsX2V4cCA9IE1JTlBPTEw7CisJCQkJCX0KKwkJCQkJc2VuZF9xdWVyeV90b19wZWVyKHApOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIFRpbWVkIG91dCB3YWl0aW5nIGZvciByZXBseSAqLworCQkJCQljbG9zZShwLT5wX2ZkKTsKKwkJCQkJcC0+cF9mZCA9IC0xOworCQkJCQkvKiBJZiBwb2xsIGludGVydmFsIGlzIHNtYWxsLCBpbmNyZWFzZSBpdCAqLworCQkJCQlpZiAoRy5wb2xsX2V4cCA8IEJJR1BPTEwpCisJCQkJCQlhZGp1c3RfcG9sbChNSU5QT0xMKTsKKwkJCQkJdGltZW91dCA9IHBvbGxfaW50ZXJ2YWwoTk9SRVBMWV9JTlRFUlZBTCk7CisJCQkJCWJiX2Vycm9yX21zZygidGltZWQgb3V0IHdhaXRpbmcgZm9yICVzLCByZWFjaCAweCUwMngsIG5leHQgcXVlcnkgaW4gJXVzIiwKKwkJCQkJCQlwLT5wX2RvdHRlZCwgcC0+cmVhY2hhYmxlX2JpdHMsIHRpbWVvdXQpOworCQkJCQlzZXRfbmV4dChwLCB0aW1lb3V0KTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChwLT5uZXh0X2FjdGlvbl90aW1lIDwgbmV4dGFjdGlvbikKKwkJCQluZXh0YWN0aW9uID0gcC0+bmV4dF9hY3Rpb25fdGltZTsKKworCQkJaWYgKHAtPnBfZmQgPj0gMCkgeworCQkJCS8qIFdhaXQgZm9yIHJlcGx5IGZyb20gdGhpcyBwZWVyICovCisJCQkJcGZkW2ldLmZkID0gcC0+cF9mZDsKKwkJCQlwZmRbaV0uZXZlbnRzID0gUE9MTElOOworCQkJCWlkeDJwZWVyW2ldID0gcDsKKwkJCQlpKys7CisJCQl9CisJCX0KKworCQl0aW1lb3V0ID0gbmV4dGFjdGlvbiAtIEcuY3VyX3RpbWU7CisJCWlmICh0aW1lb3V0IDwgMCkKKwkJCXRpbWVvdXQgPSAwOworCQl0aW1lb3V0Kys7IC8qIChuZXh0YWN0aW9uIC0gRy5jdXJfdGltZSkgcm91bmRzIGRvd24sIGNvbXBlbnNhdGluZyAqLworCisJCS8qIEhlcmUgd2UgbWF5IGJsb2NrICovCisJCVZFUkIyIHsKKwkJCWlmIChpID4gKEVOQUJMRV9GRUFUVVJFX05UUERfU0VSVkVSICYmIEdfbGlzdGVuX2ZkICE9IC0xKSkgeworCQkJCS8qIFdlIHdhaXQgZm9yIGF0IGxlYXN0IG9uZSByZXBseS4KKwkJCQkgKiBQb2xsIGZvciBpdCwgd2l0aG91dCB3YXN0aW5nIHRpbWUgZm9yIG1lc3NhZ2UuCisJCQkJICogU2luY2UgcmVwbGllcyBvZnRlbiBjb21lIHVuZGVyIDEgc2Vjb25kLCB0aGlzIGFsc28KKwkJCQkgKiByZWR1Y2VzIGNsdXR0ZXIgaW4gbG9ncy4KKwkJCQkgKi8KKwkJCQluZmRzID0gcG9sbChwZmQsIGksIDEwMDApOworCQkJCWlmIChuZmRzICE9IDApCisJCQkJCWdvdG8gZGlkX3BvbGw7CisJCQkJaWYgKC0tdGltZW91dCA8PSAwKQorCQkJCQlnb3RvIGRpZF9wb2xsOworCQkJfQorCQkJYmJfZXJyb3JfbXNnKCJwb2xsOiV1cyBzb2NrZXRzOiV1IGludGVydmFsOiV1cyIsIHRpbWVvdXQsIGksIDEgPDwgRy5wb2xsX2V4cCk7CisJCX0KKwkJbmZkcyA9IHBvbGwocGZkLCBpLCB0aW1lb3V0ICogMTAwMCk7CisgZGlkX3BvbGw6CisJCWdldHRpbWUxOTAwZCgpOyAvKiBzZXRzIEcuY3VyX3RpbWUgKi8KKwkJaWYgKG5mZHMgPD0gMCkgeworCQkJaWYgKCFiYl9nb3Rfc2lnbmFsIC8qIHBvbGwgd2Fzbid0IGludGVycnVwdGVkIGJ5IGEgc2lnbmFsICovCisJCQkgJiYgRy5jdXJfdGltZSAtIEcubGFzdF9zY3JpcHRfcnVuID4gMTEqNjAKKwkJCSkgeworCQkJCS8qIFVzZWZ1bCBmb3IgdXBkYXRpbmcgYmF0dGVyeS1iYWNrZWQgUlRDIGFuZCBzdWNoICovCisJCQkJcnVuX3NjcmlwdCgicGVyaW9kaWMiLCBHLmxhc3RfdXBkYXRlX29mZnNldCk7CisJCQkJZ2V0dGltZTE5MDBkKCk7IC8qIHNldHMgRy5jdXJfdGltZSAqLworCQkJfQorCQkJZ290byBjaGVja191bnN5bmM7CisJCX0KKworCQkvKiBQcm9jZXNzIGFueSByZWNlaXZlZCBwYWNrZXRzICovCisJCWogPSAwOworI2lmIEVOQUJMRV9GRUFUVVJFX05UUERfU0VSVkVSCisJCWlmIChHLmxpc3Rlbl9mZCAhPSAtMSkgeworCQkJaWYgKHBmZFswXS5yZXZlbnRzIC8qICYgKFBPTExJTnxQT0xMRVJSKSovKSB7CisJCQkJbmZkcy0tOworCQkJCXJlY3ZfYW5kX3Byb2Nlc3NfY2xpZW50X3BrdCgvKkcubGlzdGVuX2ZkKi8pOworCQkJCWdldHRpbWUxOTAwZCgpOyAvKiBzZXRzIEcuY3VyX3RpbWUgKi8KKwkJCX0KKwkJCWogPSAxOworCQl9CisjZW5kaWYKKwkJZm9yICg7IG5mZHMgIT0gMCAmJiBqIDwgaTsgaisrKSB7CisJCQlpZiAocGZkW2pdLnJldmVudHMgLyogJiAoUE9MTElOfFBPTExFUlIpKi8pIHsKKwkJCQkvKgorCQkJCSAqIEF0IGluaXQsIGFsYXJtIHdhcyBzZXQgdG8gMTAgc2VjLgorCQkJCSAqIE5vdyB3ZSBkaWQgZ2V0IGEgcmVwbHkuCisJCQkJICogSW5jcmVhc2UgdGltZW91dCB0byA1MCBzZWNvbmRzIHRvIGZpbmlzaCBzeW5jaW5nLgorCQkJCSAqLworCQkJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX3FxKSB7CisJCQkJCW9wdGlvbl9tYXNrMzIgJj0gfk9QVF9xcTsKKwkJCQkJYWxhcm0oNTApOworCQkJCX0KKwkJCQluZmRzLS07CisJCQkJcmVjdl9hbmRfcHJvY2Vzc19wZWVyX3BrdChpZHgycGVlcltqXSk7CisJCQkJZ2V0dGltZTE5MDBkKCk7IC8qIHNldHMgRy5jdXJfdGltZSAqLworCQkJfQorCQl9CisKKyBjaGVja191bnN5bmM6CisJCWlmIChHLm50cF9wZWVycyAmJiBHLnN0cmF0dW0gIT0gTUFYU1RSQVQpIHsKKwkJCWZvciAoaXRlbSA9IEcubnRwX3BlZXJzOyBpdGVtICE9IE5VTEw7IGl0ZW0gPSBpdGVtLT5saW5rKSB7CisJCQkJcGVlcl90ICpwID0gKHBlZXJfdCAqKSBpdGVtLT5kYXRhOworCQkJCWlmIChwLT5yZWFjaGFibGVfYml0cykKKwkJCQkJZ290byBoYXZlX3JlYWNoYWJsZV9wZWVyOworCQkJfQorCQkJLyogTm8gcGVlciByZXNwb25kZWQgZm9yIGxhc3QgOCBwYWNrZXRzLCBwYW5pYyAqLworCQkJY2xhbXBfcG9sbGV4cF9hbmRfc2V0X01BWFNUUkFUKCk7CisJCQlydW5fc2NyaXB0KCJ1bnN5bmMiLCAwLjApOworIGhhdmVfcmVhY2hhYmxlX3BlZXI6IDsKKwkJfQorCX0gLyogd2hpbGUgKCFiYl9nb3Rfc2lnbmFsKSAqLworCisJcmVtb3ZlX3BpZGZpbGUoQ09ORklHX1BJRF9GSUxFX1BBVEggIi9udHBkLnBpZCIpOworCWtpbGxfbXlzZWxmX3dpdGhfc2lnKGJiX2dvdF9zaWduYWwpOworfQorCisKKworCisKKworLyoqKiBvcGVubnRwZC00LjYgdXNlcyBvbmx5IGFkanRpbWUsIG5vdCBhZGp0aW1leCAqKiovCisKKy8qKiogbnRwLTQuMi42L250cGQvbnRwX2xvb3BmaWx0ZXIuYyAtIGFkanRpbWV4IHVzYWdlICoqKi8KKworI2lmIDAKK3N0YXRpYyBkb3VibGUKK2RpcmVjdF9mcmVxKGRvdWJsZSBmcF9vZmZzZXQpCit7CisjaWZkZWYgS0VSTkVMX1BMTAorCS8qCisJICogSWYgdGhlIGtlcm5lbCBpcyBlbmFibGVkLCB3ZSBuZWVkIHRoZSByZXNpZHVhbCBvZmZzZXQgdG8KKwkgKiBjYWxjdWxhdGUgdGhlIGZyZXF1ZW5jeSBjb3JyZWN0aW9uLgorCSAqLworCWlmIChwbGxfY29udHJvbCAmJiBrZXJuX2VuYWJsZSkgeworCQltZW1zZXQoJm50diwgMCwgc2l6ZW9mKG50dikpOworCQludHBfYWRqdGltZSgmbnR2KTsKKyNpZmRlZiBTVEFfTkFOTworCQljbG9ja19vZmZzZXQgPSBudHYub2Zmc2V0IC8gMWU5OworI2Vsc2UgLyogU1RBX05BTk8gKi8KKwkJY2xvY2tfb2Zmc2V0ID0gbnR2Lm9mZnNldCAvIDFlNjsKKyNlbmRpZiAvKiBTVEFfTkFOTyAqLworCQlkcmlmdF9jb21wID0gRlJFUVRPRChudHYuZnJlcSk7CisJfQorI2VuZGlmIC8qIEtFUk5FTF9QTEwgKi8KKwlzZXRfZnJlcSgoZnBfb2Zmc2V0IC0gY2xvY2tfb2Zmc2V0KSAvIChjdXJyZW50X3RpbWUgLSBjbG9ja19lcG9jaCkgKyBkcmlmdF9jb21wKTsKKwl3YW5kZXJfcmVzaWQgPSAwOworCXJldHVybiBkcmlmdF9jb21wOworfQorCitzdGF0aWMgdm9pZAorc2V0X2ZyZXEoZG91YmxlIGZyZXEpIC8qIGZyZXF1ZW5jeSB1cGRhdGUgKi8KK3sKKwljaGFyIHRidWZbODBdOworCisJZHJpZnRfY29tcCA9IGZyZXE7CisKKyNpZmRlZiBLRVJORUxfUExMCisJLyoKKwkgKiBJZiB0aGUga2VybmVsIGlzIGVuYWJsZWQsIHVwZGF0ZSB0aGUga2VybmVsIGZyZXF1ZW5jeS4KKwkgKi8KKwlpZiAocGxsX2NvbnRyb2wgJiYga2Vybl9lbmFibGUpIHsKKwkJbWVtc2V0KCZudHYsIDAsIHNpemVvZihudHYpKTsKKwkJbnR2Lm1vZGVzID0gTU9EX0ZSRVFVRU5DWTsKKwkJbnR2LmZyZXEgPSBEVE9GUkVRKGRyaWZ0X2NvbXApOworCQludHBfYWRqdGltZSgmbnR2KTsKKwkJc25wcmludGYodGJ1Ziwgc2l6ZW9mKHRidWYpLCAia2VybmVsICUuM2YgUFBNIiwgZHJpZnRfY29tcCAqIDFlNik7CisJCXJlcG9ydF9ldmVudChFVk5UX0ZTRVQsIE5VTEwsIHRidWYpOworCX0gZWxzZSB7CisJCXNucHJpbnRmKHRidWYsIHNpemVvZih0YnVmKSwgIm50cGQgJS4zZiBQUE0iLCBkcmlmdF9jb21wICogMWU2KTsKKwkJcmVwb3J0X2V2ZW50KEVWTlRfRlNFVCwgTlVMTCwgdGJ1Zik7CisJfQorI2Vsc2UgLyogS0VSTkVMX1BMTCAqLworCXNucHJpbnRmKHRidWYsIHNpemVvZih0YnVmKSwgIm50cGQgJS4zZiBQUE0iLCBkcmlmdF9jb21wICogMWU2KTsKKwlyZXBvcnRfZXZlbnQoRVZOVF9GU0VULCBOVUxMLCB0YnVmKTsKKyNlbmRpZiAvKiBLRVJORUxfUExMICovCit9CisKKy4uLgorLi4uCisuLi4KKworI2lmZGVmIEtFUk5FTF9QTEwKKwkvKgorCSAqIFRoaXMgY29kZSBzZWdtZW50IHdvcmtzIHdoZW4gY2xvY2sgYWRqdXN0bWVudHMgYXJlIG1hZGUgdXNpbmcKKwkgKiBwcmVjaXNpb24gdGltZSBrZXJuZWwgc3VwcG9ydCBhbmQgdGhlIG50cF9hZGp0aW1lKCkgc3lzdGVtCisJICogY2FsbC4gVGhpcyBzdXBwb3J0IGlzIGF2YWlsYWJsZSBpbiBTb2xhcmlzIDIuNiBhbmQgbGF0ZXIsCisJICogRGlnaXRhbCBVbml4IDQuMCBhbmQgbGF0ZXIsIEZyZWVCU0QsIExpbnV4IGFuZCBzcGVjaWFsbHkKKwkgKiBtb2RpZmllZCBrZXJuZWxzIGZvciBIUC1VWCA5IGFuZCBVbHRyaXggNC4gSW4gdGhlIGNhc2Ugb2YgdGhlCisJICogREVDc3RhdGlvbiA1MDAwLzI0MCBhbmQgQWxwaGEgQVhQLCBhZGRpdGlvbmFsIGtlcm5lbAorCSAqIG1vZGlmaWNhdGlvbnMgcHJvdmlkZSBhIHRydWUgbWljcm9zZWNvbmQgY2xvY2sgYW5kIG5hbm9zZWNvbmQKKwkgKiBjbG9jaywgcmVzcGVjdGl2ZWx5LgorCSAqCisJICogSW1wb3J0YW50IG5vdGU6IFRoZSBrZXJuZWwgZGlzY2lwbGluZSBpcyB1c2VkIG9ubHkgaWYgdGhlCisJICogc3RlcCB0aHJlc2hvbGQgaXMgbGVzcyB0aGFuIDAuNSBzLCBhcyBhbnl0aGluZyBoaWdoZXIgY2FuCisJICogbGVhZCB0byBvdmVyZmxvdyBwcm9ibGVtcy4gVGhpcyBtaWdodCBvY2N1ciBpZiBzb21lIG1pc2d1aWRlZAorCSAqIGxhZCBzZXQgdGhlIHN0ZXAgdGhyZXNob2xkIHRvIHNvbWV0aGluZyByaWRpY3Vsb3VzLgorCSAqLworCWlmIChwbGxfY29udHJvbCAmJiBrZXJuX2VuYWJsZSkgeworCisjZGVmaW5lIE1PRF9CSVRTIChNT0RfT0ZGU0VUIHwgTU9EX01BWEVSUk9SIHwgTU9EX0VTVEVSUk9SIHwgTU9EX1NUQVRVUyB8IE1PRF9USU1FQ09OU1QpCisKKwkJLyoKKwkJICogV2UgaW5pdGlhbGl6ZSB0aGUgc3RydWN0dXJlIGZvciB0aGUgbnRwX2FkanRpbWUoKQorCQkgKiBzeXN0ZW0gY2FsbC4gV2UgaGF2ZSB0byBjb252ZXJ0IGV2ZXJ5dGhpbmcgdG8KKwkJICogbWljcm9zZWNvbmRzIG9yIG5hbm9zZWNvbmRzIGZpcnN0LiBEbyBub3QgdXBkYXRlIHRoZQorCQkgKiBzeXN0ZW0gdmFyaWFibGVzIGlmIHRoZSBleHRfZW5hYmxlIGZsYWcgaXMgc2V0LiBJbgorCQkgKiB0aGlzIGNhc2UsIHRoZSBleHRlcm5hbCBjbG9jayBkcml2ZXIgd2lsbCB1cGRhdGUgdGhlCisJCSAqIHZhcmlhYmxlcywgd2hpY2ggd2lsbCBiZSByZWFkIGxhdGVyIGJ5IHRoZSBsb2NhbAorCQkgKiBjbG9jayBkcml2ZXIuIEFmdGVyd2FyZHMsIHJlbWVtYmVyIHRoZSB0aW1lIGFuZAorCQkgKiBmcmVxdWVuY3kgb2Zmc2V0cyBmb3Igaml0dGVyIGFuZCBzdGFiaWxpdHkgdmFsdWVzIGFuZAorCQkgKiB0byB1cGRhdGUgdGhlIGZyZXF1ZW5jeSBmaWxlLgorCQkgKi8KKwkJbWVtc2V0KCZudHYsICAwLCBzaXplb2YobnR2KSk7CisJCWlmIChleHRfZW5hYmxlKSB7CisJCQludHYubW9kZXMgPSBNT0RfU1RBVFVTOworCQl9IGVsc2UgeworI2lmZGVmIFNUQV9OQU5PCisJCQludHYubW9kZXMgPSBNT0RfQklUUyB8IE1PRF9OQU5POworI2Vsc2UgLyogU1RBX05BTk8gKi8KKwkJCW50di5tb2RlcyA9IE1PRF9CSVRTOworI2VuZGlmIC8qIFNUQV9OQU5PICovCisJCQlpZiAoY2xvY2tfb2Zmc2V0IDwgMCkKKwkJCQlkdGVtcCA9IC0uNTsKKwkJCWVsc2UKKwkJCQlkdGVtcCA9IC41OworI2lmZGVmIFNUQV9OQU5PCisJCQludHYub2Zmc2V0ID0gKGludDMyKShjbG9ja19vZmZzZXQgKiAxZTkgKyBkdGVtcCk7CisJCQludHYuY29uc3RhbnQgPSBzeXNfcG9sbDsKKyNlbHNlIC8qIFNUQV9OQU5PICovCisJCQludHYub2Zmc2V0ID0gKGludDMyKShjbG9ja19vZmZzZXQgKiAxZTYgKyBkdGVtcCk7CisJCQludHYuY29uc3RhbnQgPSBzeXNfcG9sbCAtIDQ7CisjZW5kaWYgLyogU1RBX05BTk8gKi8KKwkJCW50di5lc3RlcnJvciA9ICh1X2ludDMyKShjbG9ja19qaXR0ZXIgKiAxZTYpOworCQkJbnR2Lm1heGVycm9yID0gKHVfaW50MzIpKChzeXNfcm9vdGRlbGF5IC8gMiArIHN5c19yb290ZGlzcCkgKiAxZTYpOworCQkJbnR2LnN0YXR1cyA9IFNUQV9QTEw7CisKKwkJCS8qCisJCQkgKiBFbmFibGUvZGlzYWJsZSB0aGUgUFBTIGlmIHJlcXVlc3RlZC4KKwkJCSAqLworCQkJaWYgKHBwc19lbmFibGUpIHsKKwkJCQlpZiAoIShwbGxfc3RhdHVzICYgU1RBX1BQU1RJTUUpKQorCQkJCQlyZXBvcnRfZXZlbnQoRVZOVF9LRVJOLAorCQkJCQkJTlVMTCwgIlBQUyBlbmFibGVkIik7CisJCQkJbnR2LnN0YXR1cyB8PSBTVEFfUFBTVElNRSB8IFNUQV9QUFNGUkVROworCQkJfSBlbHNlIHsKKwkJCQlpZiAocGxsX3N0YXR1cyAmIFNUQV9QUFNUSU1FKQorCQkJCQlyZXBvcnRfZXZlbnQoRVZOVF9LRVJOLAorCQkJCQkJTlVMTCwgIlBQUyBkaXNhYmxlZCIpOworCQkJCW50di5zdGF0dXMgJj0gfihTVEFfUFBTVElNRSB8IFNUQV9QUFNGUkVRKTsKKwkJCX0KKwkJCWlmIChzeXNfbGVhcCA9PSBMRUFQX0FERFNFQ09ORCkKKwkJCQludHYuc3RhdHVzIHw9IFNUQV9JTlM7CisJCQllbHNlIGlmIChzeXNfbGVhcCA9PSBMRUFQX0RFTFNFQ09ORCkKKwkJCQludHYuc3RhdHVzIHw9IFNUQV9ERUw7CisJCX0KKworCQkvKgorCQkgKiBQYXNzIHRoZSBzdHVmZiB0byB0aGUga2VybmVsLiBJZiBpdCBzcXVlYWxzLCB0dXJuIG9mZgorCQkgKiB0aGUgcHBzLiBJbiBhbnkgY2FzZSwgZmV0Y2ggdGhlIGtlcm5lbCBvZmZzZXQsCisJCSAqIGZyZXF1ZW5jeSBhbmQgaml0dGVyLgorCQkgKi8KKwkJaWYgKG50cF9hZGp0aW1lKCZudHYpID09IFRJTUVfRVJST1IpIHsKKwkJCWlmICghKG50di5zdGF0dXMgJiBTVEFfUFBTU0lHTkFMKSkKKwkJCQlyZXBvcnRfZXZlbnQoRVZOVF9LRVJOLCBOVUxMLAorCQkJCQkJIlBQUyBubyBzaWduYWwiKTsKKwkJfQorCQlwbGxfc3RhdHVzID0gbnR2LnN0YXR1czsKKyNpZmRlZiBTVEFfTkFOTworCQljbG9ja19vZmZzZXQgPSBudHYub2Zmc2V0IC8gMWU5OworI2Vsc2UgLyogU1RBX05BTk8gKi8KKwkJY2xvY2tfb2Zmc2V0ID0gbnR2Lm9mZnNldCAvIDFlNjsKKyNlbmRpZiAvKiBTVEFfTkFOTyAqLworCQljbG9ja19mcmVxdWVuY3kgPSBGUkVRVE9EKG50di5mcmVxKTsKKworCQkvKgorCQkgKiBJZiB0aGUga2VybmVsIFBQUyBpcyBsaXQsIG1vbml0b3IgaXRzIHBlcmZvcm1hbmNlLgorCQkgKi8KKwkJaWYgKG50di5zdGF0dXMgJiBTVEFfUFBTVElNRSkgeworI2lmZGVmIFNUQV9OQU5PCisJCQljbG9ja19qaXR0ZXIgPSBudHYuaml0dGVyIC8gMWU5OworI2Vsc2UgLyogU1RBX05BTk8gKi8KKwkJCWNsb2NrX2ppdHRlciA9IG50di5qaXR0ZXIgLyAxZTY7CisjZW5kaWYgLyogU1RBX05BTk8gKi8KKwkJfQorCisjaWYgZGVmaW5lZChTVEFfTkFOTykgJiYgTlRQX0FQSSA9PSA0CisJCS8qCisJCSAqIElmIHRoZSBUQUkgY2hhbmdlcywgdXBkYXRlIHRoZSBrZXJuZWwgVEFJLgorCQkgKi8KKwkJaWYgKGxvb3BfdGFpICE9IHN5c190YWkpIHsKKwkJCWxvb3BfdGFpID0gc3lzX3RhaTsKKwkJCW50di5tb2RlcyA9IE1PRF9UQUk7CisJCQludHYuY29uc3RhbnQgPSBzeXNfdGFpOworCQkJbnRwX2FkanRpbWUoJm50dik7CisJCX0KKyNlbmRpZiAvKiBTVEFfTkFOTyAqLworCX0KKyNlbmRpZiAvKiBLRVJORUxfUExMICovCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvcGluZy5jIGIvbmV0d29ya2luZy9waW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNiZjE5NgotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvcGluZy5jCkBAIC0wLDAgKzEsOTYwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHBpbmcgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgYnkgUmFuZG9scGggQ2h1bmcgPHRhdXNxQGRlYmlhbi5vcmc+CisgKgorICogQWRhcHRlZCBmcm9tIHRoZSBwaW5nIGluIG5ldGtpdC1iYXNlIDAuMTA6CisgKiBDb3B5cmlnaHQgKGMpIDE5ODkgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBjb2RlIGlzIGRlcml2ZWQgZnJvbSBzb2Z0d2FyZSBjb250cmlidXRlZCB0byBCZXJrZWxleSBieQorICogTWlrZSBNdXVzcy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisvKiBmcm9tIHBpbmc2LmM6CisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgYnkgUmFuZG9scGggQ2h1bmcgPHRhdXNxQGRlYmlhbi5vcmc+CisgKgorICogVGhpcyB2ZXJzaW9uIG9mIHBpbmcgaXMgYWRhcHRlZCBmcm9tIHRoZSBwaW5nIGluIG5ldGtpdC1iYXNlIDAuMTAsCisgKiB3aGljaCBpczoKKyAqCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgbm90aWNlIGlzIHJldGFpbmVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorICoKKyAqIFRoaXMgdmVyc2lvbiBpcyBhbiBhZGFwdGF0aW9uIG9mIHBpbmcuYyBmcm9tIGJ1c3lib3guCisgKiBUaGUgY29kZSB3YXMgbW9kaWZpZWQgYnkgQmFydCBWaXNzY2hlciA8bWFnaWNrQGxpbnV4LWZhbi5jb20+CisgKi8KKworI2luY2x1ZGUgPG5ldC9pZi5oPgorI2luY2x1ZGUgPG5ldGluZXQvaXBfaWNtcC5oPgorI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZmRlZiBfX0JJT05JQ19fCisvKiBzaG91bGQgYmUgaW4gbmV0aW5ldC9pcF9pY21wLmggKi8KKyMgZGVmaW5lIElDTVBfREVTVF9VTlJFQUNIICAgIDMgIC8qIERlc3RpbmF0aW9uIFVucmVhY2hhYmxlICAqLworIyBkZWZpbmUgSUNNUF9TT1VSQ0VfUVVFTkNIICAgNCAgLyogU291cmNlIFF1ZW5jaCAgICAqLworIyBkZWZpbmUgSUNNUF9SRURJUkVDVCAgICAgICAgNSAgLyogUmVkaXJlY3QgKGNoYW5nZSByb3V0ZSkgICovCisjIGRlZmluZSBJQ01QX0VDSE8gICAgICAgICAgICA4ICAvKiBFY2hvIFJlcXVlc3QgICAgICAqLworIyBkZWZpbmUgSUNNUF9USU1FX0VYQ0VFREVEICAxMSAgLyogVGltZSBFeGNlZWRlZCAgICAqLworIyBkZWZpbmUgSUNNUF9QQVJBTUVURVJQUk9CICAxMiAgLyogUGFyYW1ldGVyIFByb2JsZW0gICAgKi8KKyMgZGVmaW5lIElDTVBfVElNRVNUQU1QICAgICAgMTMgIC8qIFRpbWVzdGFtcCBSZXF1ZXN0ICAgICovCisjIGRlZmluZSBJQ01QX1RJTUVTVEFNUFJFUExZIDE0ICAvKiBUaW1lc3RhbXAgUmVwbHkgICAgKi8KKyMgZGVmaW5lIElDTVBfSU5GT19SRVFVRVNUICAgMTUgIC8qIEluZm9ybWF0aW9uIFJlcXVlc3QgICAgKi8KKyMgZGVmaW5lIElDTVBfSU5GT19SRVBMWSAgICAgMTYgIC8qIEluZm9ybWF0aW9uIFJlcGx5ICAgICovCisjIGRlZmluZSBJQ01QX0FERFJFU1MgICAgICAgIDE3ICAvKiBBZGRyZXNzIE1hc2sgUmVxdWVzdCAgICAqLworIyBkZWZpbmUgSUNNUF9BRERSRVNTUkVQTFkgICAxOCAgLyogQWRkcmVzcyBNYXNrIFJlcGx5ICAgICovCisjZW5kaWYKKworLy9jb25maWc6Y29uZmlnIFBJTkcKKy8vY29uZmlnOglib29sICJwaW5nIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CXNlbGVjdCBQTEFURk9STV9MSU5VWAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIHBpbmcgdXNlcyB0aGUgSUNNUCBwcm90b2NvbCdzIG1hbmRhdG9yeSBFQ0hPX1JFUVVFU1QgZGF0YWdyYW0gdG8KKy8vY29uZmlnOgkgIGVsaWNpdCBhbiBJQ01QIEVDSE9fUkVTUE9OU0UgZnJvbSBhIGhvc3Qgb3IgZ2F0ZXdheS4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIFBJTkc2CisvL2NvbmZpZzoJYm9vbCAicGluZzYiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGRUFUVVJFX0lQVjYgJiYgUElORworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRoaXMgd2lsbCBnaXZlIHlvdSBhIHBpbmcgdGhhdCBjYW4gdGFsayBJUHY2LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9GQU5DWV9QSU5HCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIGZhbmN5IHBpbmcgb3V0cHV0IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gUElORworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIE1ha2UgdGhlIG91dHB1dCBmcm9tIHRoZSBwaW5nIGFwcGxldCBpbmNsdWRlIHN0YXRpc3RpY3MsIGFuZCBhdCB0aGUKKy8vY29uZmlnOgkgIHNhbWUgdGltZSBwcm92aWRlIGZ1bGwgc3VwcG9ydCBmb3IgSUNNUCBwYWNrZXRzLgorCisvKiBOZWVkcyBzb2NrZXQoQUZfSU5FVCwgU09DS19SQVcsIElQUFJPVE9fSUNNUCksIHRoZXJlZm9yZSBCQl9TVUlEX01BWUJFOiAqLworLy9hcHBsZXQ6SUZfUElORyhBUFBMRVQocGluZywgQkJfRElSX0JJTiwgQkJfU1VJRF9NQVlCRSkpCisvL2FwcGxldDpJRl9QSU5HNihBUFBMRVQocGluZzYsIEJCX0RJUl9CSU4sIEJCX1NVSURfTUFZQkUpKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfUElORykgICs9IHBpbmcubworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1BJTkc2KSArPSBwaW5nLm8KKworLy91c2FnZTojaWYgIUVOQUJMRV9GRUFUVVJFX0ZBTkNZX1BJTkcKKy8vdXNhZ2U6IyBkZWZpbmUgcGluZ190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiSE9TVCIKKy8vdXNhZ2U6IyBkZWZpbmUgcGluZ19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNlbmQgSUNNUCBFQ0hPX1JFUVVFU1QgcGFja2V0cyB0byBuZXR3b3JrIGhvc3RzIgorLy91c2FnZTojIGRlZmluZSBwaW5nNl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiSE9TVCIKKy8vdXNhZ2U6IyBkZWZpbmUgcGluZzZfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZW5kIElDTVAgRUNIT19SRVFVRVNUIHBhY2tldHMgdG8gbmV0d29yayBob3N0cyIKKy8vdXNhZ2U6I2Vsc2UKKy8vdXNhZ2U6IyBkZWZpbmUgcGluZ190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIEhPU1QiCisvL3VzYWdlOiMgZGVmaW5lIHBpbmdfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZW5kIElDTVAgRUNIT19SRVFVRVNUIHBhY2tldHMgdG8gbmV0d29yayBob3N0c1xuIgorLy91c2FnZToJSUZfUElORzYoCisvL3VzYWdlOiAgICAgIlxuCS00LC02CQlGb3JjZSBJUCBvciBJUHY2IG5hbWUgcmVzb2x1dGlvbiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLWMgQ05UCQlTZW5kIG9ubHkgQ05UIHBpbmdzIgorLy91c2FnZTogICAgICJcbgktcyBTSVpFCQlTZW5kIFNJWkUgZGF0YSBieXRlcyBpbiBwYWNrZXRzIChkZWZhdWx0OjU2KSIKKy8vdXNhZ2U6ICAgICAiXG4JLXQgVFRMCQlTZXQgVFRMIgorLy91c2FnZTogICAgICJcbgktSSBJRkFDRS9JUAlVc2UgaW50ZXJmYWNlIG9yIElQIGFkZHJlc3MgYXMgc291cmNlIgorLy91c2FnZTogICAgICJcbgktVyBTRUMJCVNlY29uZHMgdG8gd2FpdCBmb3IgdGhlIGZpcnN0IHJlc3BvbnNlIChkZWZhdWx0OjEwKSIKKy8vdXNhZ2U6ICAgICAiXG4JCQkoYWZ0ZXIgYWxsIC1jIENOVCBwYWNrZXRzIGFyZSBzZW50KSIKKy8vdXNhZ2U6ICAgICAiXG4JLXcgU0VDCQlTZWNvbmRzIHVudGlsIHBpbmcgZXhpdHMgKGRlZmF1bHQ6aW5maW5pdGUpIgorLy91c2FnZTogICAgICJcbgkJCShjYW4gZXhpdCBlYXJsaWVyIHdpdGggLWMgQ05UKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJCVF1aWV0LCBvbmx5IGRpc3BsYXkgb3V0cHV0IGF0IHN0YXJ0IgorLy91c2FnZTogICAgICJcbgkJCWFuZCB3aGVuIGZpbmlzaGVkIgorLy91c2FnZTogICAgICJcbgktcAkJUGF0dGVybiB0byB1c2UgZm9yIHBheWxvYWQiCisvL3VzYWdlOgorLy91c2FnZTojIGRlZmluZSBwaW5nNl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIEhPU1QiCisvL3VzYWdlOiMgZGVmaW5lIHBpbmc2X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2VuZCBJQ01QIEVDSE9fUkVRVUVTVCBwYWNrZXRzIHRvIG5ldHdvcmsgaG9zdHNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMgQ05UCQlTZW5kIG9ubHkgQ05UIHBpbmdzIgorLy91c2FnZTogICAgICJcbgktcyBTSVpFCQlTZW5kIFNJWkUgZGF0YSBieXRlcyBpbiBwYWNrZXRzIChkZWZhdWx0OjU2KSIKKy8vdXNhZ2U6ICAgICAiXG4JLUkgSUZBQ0UvSVAJVXNlIGludGVyZmFjZSBvciBJUCBhZGRyZXNzIGFzIHNvdXJjZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJCVF1aWV0LCBvbmx5IGRpc3BsYXkgb3V0cHV0IGF0IHN0YXJ0IgorLy91c2FnZTogICAgICJcbgkJCWFuZCB3aGVuIGZpbmlzaGVkIgorLy91c2FnZTogICAgICJcbgktcAkJUGF0dGVybiB0byB1c2UgZm9yIHBheWxvYWQiCisvL3VzYWdlOgorLy91c2FnZTojZW5kaWYKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgcGluZ19leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBwaW5nIGxvY2FsaG9zdFxuIgorLy91c2FnZTogICAgICAgIlBJTkcgc2xhZyAoMTI3LjAuMC4xKTogNTYgZGF0YSBieXRlc1xuIgorLy91c2FnZTogICAgICAgIjY0IGJ5dGVzIGZyb20gMTI3LjAuMC4xOiBpY21wX3NlcT0wIHR0bD0yNTUgdGltZT0yMC4xIG1zXG4iCisvL3VzYWdlOiAgICAgICAiXG4iCisvL3VzYWdlOiAgICAgICAiLS0tIGRlYmlhbiBwaW5nIHN0YXRpc3RpY3MgLS0tXG4iCisvL3VzYWdlOiAgICAgICAiMSBwYWNrZXRzIHRyYW5zbWl0dGVkLCAxIHBhY2tldHMgcmVjZWl2ZWQsIDAlIHBhY2tldCBsb3NzXG4iCisvL3VzYWdlOiAgICAgICAicm91bmQtdHJpcCBtaW4vYXZnL21heCA9IDIwLjEvMjAuMS8yMC4xIG1zXG4iCisvL3VzYWdlOiNkZWZpbmUgcGluZzZfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgcGluZzYgaXA2LWxvY2FsaG9zdFxuIgorLy91c2FnZTogICAgICAgIlBJTkcgaXA2LWxvY2FsaG9zdCAoOjoxKTogNTYgZGF0YSBieXRlc1xuIgorLy91c2FnZTogICAgICAgIjY0IGJ5dGVzIGZyb20gOjoxOiBpY21wNl9zZXE9MCB0dGw9NjQgdGltZT0yMC4xIG1zXG4iCisvL3VzYWdlOiAgICAgICAiXG4iCisvL3VzYWdlOiAgICAgICAiLS0tIGlwNi1sb2NhbGhvc3QgcGluZyBzdGF0aXN0aWNzIC0tLVxuIgorLy91c2FnZTogICAgICAgIjEgcGFja2V0cyB0cmFuc21pdHRlZCwgMSBwYWNrZXRzIHJlY2VpdmVkLCAwJSBwYWNrZXQgbG9zc1xuIgorLy91c2FnZTogICAgICAgInJvdW5kLXRyaXAgbWluL2F2Zy9tYXggPSAyMC4xLzIwLjEvMjAuMSBtc1xuIgorCisjaWYgRU5BQkxFX1BJTkc2CisjIGluY2x1ZGUgPG5ldGluZXQvaWNtcDYuaD4KKy8qIEkgc2VlIFJFTlVNQkVSRUQgY29uc3RhbnRzIGluIGJpdHMvaW4uaCAtICEhPworICogV2hhdCBhIGZ1Y2sgaXMgZ29pbmcgb24gd2l0aCBsaWJjPyBJcyBpdCBhIGdsaWJjIGpva2U/ICovCisjIGlmZGVmIElQVjZfMjI5MkhPUExJTUlUCisjICB1bmRlZiBJUFY2X0hPUExJTUlUCisjICBkZWZpbmUgSVBWNl9IT1BMSU1JVCBJUFY2XzIyOTJIT1BMSU1JVAorIyBlbmRpZgorI2VuZGlmCisKK2VudW0geworCURFRkRBVEFMRU4gPSA1NiwKKwlNQVhJUExFTiA9IDYwLAorCU1BWElDTVBMRU4gPSA3NiwKKwlNQVhfRFVQX0NISyA9ICg4ICogMTI4KSwKKwlNQVhXQUlUID0gMTAsCisJUElOR0lOVEVSVkFMID0gMSwgLyogMSBzZWNvbmQgKi8KKwlwaW5nc29jayA9IDAsCit9OworCitzdGF0aWMgdm9pZAorI2lmIEVOQUJMRV9QSU5HNgorY3JlYXRlX2ljbXBfc29ja2V0KGxlbl9hbmRfc29ja2FkZHIgKmxzYSkKKyNlbHNlCitjcmVhdGVfaWNtcF9zb2NrZXQodm9pZCkKKyNkZWZpbmUgY3JlYXRlX2ljbXBfc29ja2V0KGxzYSkgY3JlYXRlX2ljbXBfc29ja2V0KCkKKyNlbmRpZgoreworCWludCBzb2NrOworI2lmIEVOQUJMRV9QSU5HNgorCWlmIChsc2EtPnUuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KQorCQlzb2NrID0gc29ja2V0KEFGX0lORVQ2LCBTT0NLX1JBVywgSVBQUk9UT19JQ01QVjYpOworCWVsc2UKKyNlbmRpZgorCQlzb2NrID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCAxKTsgLyogMSA9PSBJQ01QICovCisJaWYgKHNvY2sgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFUEVSTSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19wZXJtX2RlbmllZF9hcmVfeW91X3Jvb3QpOworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2Nhbl9ub3RfY3JlYXRlX3Jhd19zb2NrZXQpOworCX0KKworCXhtb3ZlX2ZkKHNvY2ssIHBpbmdzb2NrKTsKK30KKworI2lmICFFTkFCTEVfRkVBVFVSRV9GQU5DWV9QSU5HCisKKy8qIFNpbXBsZSB2ZXJzaW9uICovCisKK3N0cnVjdCBnbG9iYWxzIHsKKwljaGFyICpob3N0bmFtZTsKKwljaGFyIHBhY2tldFtERUZEQVRBTEVOICsgTUFYSVBMRU4gKyBNQVhJQ01QTEVOXTsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgfSB3aGlsZSAoMCkKKworc3RhdGljIHZvaWQgbm9yZXNwKGludCBpZ24gVU5VU0VEX1BBUkFNKQoreworCXByaW50ZigiTm8gcmVzcG9uc2UgZnJvbSAlc1xuIiwgRy5ob3N0bmFtZSk7CisJZXhpdChFWElUX0ZBSUxVUkUpOworfQorCitzdGF0aWMgdm9pZCBwaW5nNChsZW5fYW5kX3NvY2thZGRyICpsc2EpCit7CisJc3RydWN0IGljbXAgKnBrdDsKKwlpbnQgYzsKKworCXBrdCA9IChzdHJ1Y3QgaWNtcCAqKSBHLnBhY2tldDsKKwkvKm1lbXNldChwa3QsIDAsIHNpemVvZihHLnBhY2tldCkpOyBhbHJlYWR5IGlzICovCisJcGt0LT5pY21wX3R5cGUgPSBJQ01QX0VDSE87CisJcGt0LT5pY21wX2Nrc3VtID0gaW5ldF9ja3N1bSgodWludDE2X3QgKikgcGt0LCBzaXplb2YoRy5wYWNrZXQpKTsKKworCXhzZW5kdG8ocGluZ3NvY2ssIEcucGFja2V0LCBERUZEQVRBTEVOICsgSUNNUF9NSU5MRU4sICZsc2EtPnUuc2EsIGxzYS0+bGVuKTsKKworCS8qIGxpc3RlbiBmb3IgcmVwbGllcyAqLworCXdoaWxlICgxKSB7CisjaWYgMAorCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gZnJvbTsKKwkJc29ja2xlbl90IGZyb21sZW4gPSBzaXplb2YoZnJvbSk7CisKKwkJYyA9IHJlY3Zmcm9tKHBpbmdzb2NrLCBHLnBhY2tldCwgc2l6ZW9mKEcucGFja2V0KSwgMCwKKwkJCQkoc3RydWN0IHNvY2thZGRyICopICZmcm9tLCAmZnJvbWxlbik7CisjZWxzZQorCQljID0gcmVjdihwaW5nc29jaywgRy5wYWNrZXQsIHNpemVvZihHLnBhY2tldCksIDApOworI2VuZGlmCisJCWlmIChjIDwgMCkgeworCQkJaWYgKGVycm5vICE9IEVJTlRSKQorCQkJCWJiX3BlcnJvcl9tc2coInJlY3Zmcm9tIik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA+PSA3NikgewkJCS8qIGlwICsgaWNtcCAqLworCQkJc3RydWN0IGlwaGRyICppcGhkciA9IChzdHJ1Y3QgaXBoZHIgKikgRy5wYWNrZXQ7CisKKwkJCXBrdCA9IChzdHJ1Y3QgaWNtcCAqKSAoRy5wYWNrZXQgKyAoaXBoZHItPmlobCA8PCAyKSk7CS8qIHNraXAgaXAgaGRyICovCisJCQlpZiAocGt0LT5pY21wX3R5cGUgPT0gSUNNUF9FQ0hPUkVQTFkpCisJCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShwaW5nc29jayk7Cit9CisKKyNpZiBFTkFCTEVfUElORzYKK3N0YXRpYyB2b2lkIHBpbmc2KGxlbl9hbmRfc29ja2FkZHIgKmxzYSkKK3sKKwlzdHJ1Y3QgaWNtcDZfaGRyICpwa3Q7CisJaW50IGM7CisJaW50IHNvY2tvcHQ7CisKKwlwa3QgPSAoc3RydWN0IGljbXA2X2hkciAqKSBHLnBhY2tldDsKKwkvKm1lbXNldChwa3QsIDAsIHNpemVvZihHLnBhY2tldCkpOyBhbHJlYWR5IGlzICovCisJcGt0LT5pY21wNl90eXBlID0gSUNNUDZfRUNIT19SRVFVRVNUOworCisJc29ja29wdCA9IG9mZnNldG9mKHN0cnVjdCBpY21wNl9oZHIsIGljbXA2X2Nrc3VtKTsKKwlzZXRzb2Nrb3B0X2ludChwaW5nc29jaywgU09MX1JBVywgSVBWNl9DSEVDS1NVTSwgc29ja29wdCk7CisKKwl4c2VuZHRvKHBpbmdzb2NrLCBHLnBhY2tldCwgREVGREFUQUxFTiArIHNpemVvZihzdHJ1Y3QgaWNtcDZfaGRyKSwgJmxzYS0+dS5zYSwgbHNhLT5sZW4pOworCisJLyogbGlzdGVuIGZvciByZXBsaWVzICovCisJd2hpbGUgKDEpIHsKKyNpZiAwCisJCXN0cnVjdCBzb2NrYWRkcl9pbjYgZnJvbTsKKwkJc29ja2xlbl90IGZyb21sZW4gPSBzaXplb2YoZnJvbSk7CisKKwkJYyA9IHJlY3Zmcm9tKHBpbmdzb2NrLCBHLnBhY2tldCwgc2l6ZW9mKEcucGFja2V0KSwgMCwKKwkJCQkoc3RydWN0IHNvY2thZGRyICopICZmcm9tLCAmZnJvbWxlbik7CisjZWxzZQorCQljID0gcmVjdihwaW5nc29jaywgRy5wYWNrZXQsIHNpemVvZihHLnBhY2tldCksIDApOworI2VuZGlmCisJCWlmIChjIDwgMCkgeworCQkJaWYgKGVycm5vICE9IEVJTlRSKQorCQkJCWJiX3BlcnJvcl9tc2coInJlY3Zmcm9tIik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA+PSBJQ01QX01JTkxFTikgewkvKiBpY21wNl9oZHIgKi8KKwkJCWlmIChwa3QtPmljbXA2X3R5cGUgPT0gSUNNUDZfRUNIT19SRVBMWSkKKwkJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsb3NlKHBpbmdzb2NrKTsKK30KKyNlbmRpZgorCisjaWYgIUVOQUJMRV9QSU5HNgorIyBkZWZpbmUgY29tbW9uX3BpbmdfbWFpbihhZiwgYXJndikgY29tbW9uX3BpbmdfbWFpbihhcmd2KQorI2VuZGlmCitzdGF0aWMgaW50IGNvbW1vbl9waW5nX21haW4oc2FfZmFtaWx5X3QgYWYsIGNoYXIgKiphcmd2KQoreworCWxlbl9hbmRfc29ja2FkZHIgKmxzYTsKKworCUlOSVRfRygpOworCisjaWYgRU5BQkxFX1BJTkc2CisJd2hpbGUgKCgrK2FyZ3YpWzBdICYmIGFyZ3ZbMF1bMF0gPT0gJy0nKSB7CisJCWlmIChhcmd2WzBdWzFdID09ICc0JykgeworCQkJYWYgPSBBRl9JTkVUOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGFyZ3ZbMF1bMV0gPT0gJzYnKSB7CisJCQlhZiA9IEFGX0lORVQ2OworCQkJY29udGludWU7CisJCX0KKwkJYmJfc2hvd191c2FnZSgpOworCX0KKyNlbHNlCisJYXJndisrOworI2VuZGlmCisKKwlHLmhvc3RuYW1lID0gKmFyZ3Y7CisJaWYgKCFHLmhvc3RuYW1lKQorCQliYl9zaG93X3VzYWdlKCk7CisKKyNpZiBFTkFCTEVfUElORzYKKwlsc2EgPSB4aG9zdF9hbmRfYWYyc29ja2FkZHIoRy5ob3N0bmFtZSwgMCwgYWYpOworI2Vsc2UKKwlsc2EgPSB4aG9zdF9hbmRfYWYyc29ja2FkZHIoRy5ob3N0bmFtZSwgMCwgQUZfSU5FVCk7CisjZW5kaWYKKwkvKiBTZXQgdGltZXIgX2FmdGVyXyBETlMgcmVzb2x1dGlvbiAqLworCXNpZ25hbChTSUdBTFJNLCBub3Jlc3ApOworCWFsYXJtKDUpOyAvKiBnaXZlIHRoZSBob3N0IDUwMDBtcyB0byByZXNwb25kICovCisKKwljcmVhdGVfaWNtcF9zb2NrZXQobHNhKTsKKyNpZiBFTkFCTEVfUElORzYKKwlpZiAobHNhLT51LnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNikKKwkJcGluZzYobHNhKTsKKwllbHNlCisjZW5kaWYKKwkJcGluZzQobHNhKTsKKwlwcmludGYoIiVzIGlzIGFsaXZlIVxuIiwgRy5ob3N0bmFtZSk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworCisjZWxzZSAvKiBGRUFUVVJFX0ZBTkNZX1BJTkcgKi8KKworCisvKiBGdWxsKGVyKSB2ZXJzaW9uICovCisKKyNkZWZpbmUgT1BUX1NUUklORyAoInF2YzpzOnQ6dzpXOkk6bnA6NCIgSUZfUElORzYoIjYiKSkKK2VudW0geworCU9QVF9RVUlFVCA9IDEgPDwgMCwKKwlPUFRfVkVSQk9TRSA9IDEgPDwgMSwKKwlPUFRfYyA9IDEgPDwgMiwKKwlPUFRfcyA9IDEgPDwgMywKKwlPUFRfdCA9IDEgPDwgNCwKKwlPUFRfdyA9IDEgPDwgNSwKKwlPUFRfVyA9IDEgPDwgNiwKKwlPUFRfSSA9IDEgPDwgNywKKwkvKk9QVF9uID0gMSA8PCA4LCAtIGlnbm9yZWQgKi8KKwlPUFRfcCA9IDEgPDwgOSwKKwlPUFRfSVBWNCA9IDEgPDwgMTAsCisJT1BUX0lQVjYgPSAoMSA8PCAxMSkgKiBFTkFCTEVfUElORzYsCit9OworCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlpbnQgaWZfaW5kZXg7CisJY2hhciAqc3RyX0k7CisJbGVuX2FuZF9zb2NrYWRkciAqc291cmNlX2xzYTsKKwl1bnNpZ25lZCBkYXRhbGVuOworCXVuc2lnbmVkIHBpbmdjb3VudDsgLyogbXVzdCBiZSBpbnQtc2l6ZWQgKi8KKwl1bnNpZ25lZCBvcHRfdHRsOworCXVuc2lnbmVkIGxvbmcgbnRyYW5zbWl0dGVkLCBucmVjZWl2ZWQsIG5yZXBlYXRzOworCXVpbnQxNl90IG15aWQ7CisJdWludDhfdCBwYXR0ZXJuOworCXVuc2lnbmVkIHRtaW4sIHRtYXg7IC8qIGluIHVzICovCisJdW5zaWduZWQgbG9uZyBsb25nIHRzdW07IC8qIGluIHVzLCBzdW0gb2YgYWxsIHRpbWVzICovCisJdW5zaWduZWQgZGVhZGxpbmU7CisJdW5zaWduZWQgdGltZW91dDsKKwl1bnNpZ25lZCB0b3RhbF9zZWNzOworCXVuc2lnbmVkIHNpemVvZl9yY3ZfcGFja2V0OworCWNoYXIgKnJjdl9wYWNrZXQ7IC8qIFtkYXRhbGVuICsgTUFYSVBMRU4gKyBNQVhJQ01QTEVOXSAqLworCXZvaWQgKnNuZF9wYWNrZXQ7IC8qIFtkYXRhbGVuICsgaXB2NC9pcHY2X2NvbnN0XSAqLworCWNvbnN0IGNoYXIgKmhvc3RuYW1lOworCWNvbnN0IGNoYXIgKmRvdHRlZDsKKwl1bmlvbiB7CisJCXN0cnVjdCBzb2NrYWRkciBzYTsKKwkJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKyNpZiBFTkFCTEVfUElORzYKKwkJc3RydWN0IHNvY2thZGRyX2luNiBzaW42OworI2VuZGlmCisJfSBwaW5nYWRkcjsKKwl1bnNpZ25lZCBjaGFyIHJjdmRfdGJsW01BWF9EVVBfQ0hLIC8gOF07Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBpZl9pbmRleCAgICAgKEcuaWZfaW5kZXggICAgKQorI2RlZmluZSBzb3VyY2VfbHNhICAgKEcuc291cmNlX2xzYSAgKQorI2RlZmluZSBzdHJfSSAgICAgICAgKEcuc3RyX0kgICAgICAgKQorI2RlZmluZSBkYXRhbGVuICAgICAgKEcuZGF0YWxlbiAgICAgKQorI2RlZmluZSBwaW5nY291bnQgICAgKEcucGluZ2NvdW50ICAgKQorI2RlZmluZSBvcHRfdHRsICAgICAgKEcub3B0X3R0bCAgICAgKQorI2RlZmluZSBteWlkICAgICAgICAgKEcubXlpZCAgICAgICAgKQorI2RlZmluZSB0bWluICAgICAgICAgKEcudG1pbiAgICAgICAgKQorI2RlZmluZSB0bWF4ICAgICAgICAgKEcudG1heCAgICAgICAgKQorI2RlZmluZSB0c3VtICAgICAgICAgKEcudHN1bSAgICAgICAgKQorI2RlZmluZSBkZWFkbGluZSAgICAgKEcuZGVhZGxpbmUgICAgKQorI2RlZmluZSB0aW1lb3V0ICAgICAgKEcudGltZW91dCAgICAgKQorI2RlZmluZSB0b3RhbF9zZWNzICAgKEcudG90YWxfc2VjcyAgKQorI2RlZmluZSBob3N0bmFtZSAgICAgKEcuaG9zdG5hbWUgICAgKQorI2RlZmluZSBkb3R0ZWQgICAgICAgKEcuZG90dGVkICAgICAgKQorI2RlZmluZSBwaW5nYWRkciAgICAgKEcucGluZ2FkZHIgICAgKQorI2RlZmluZSByY3ZkX3RibCAgICAgKEcucmN2ZF90YmwgICAgKQordm9pZCBCVUdfcGluZ19nbG9iYWxzX3Rvb19iaWcodm9pZCk7CisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCWlmIChzaXplb2YoRykgPiBDT01NT05fQlVGU0laRSkgXAorCQlCVUdfcGluZ19nbG9iYWxzX3Rvb19iaWcoKTsgXAorCWRhdGFsZW4gPSBERUZEQVRBTEVOOyBcCisJdGltZW91dCA9IE1BWFdBSVQ7IFwKKwl0bWluID0gVUlOVF9NQVg7IFwKK30gd2hpbGUgKDApCisKKworI2RlZmluZSBCWVRFKGJpdCkJcmN2ZF90YmxbKGJpdCk+PjNdCisjZGVmaW5lIE1BU0soYml0KQkoMSA8PCAoKGJpdCkgJiA3KSkKKyNkZWZpbmUgU0VUKGJpdCkJKEJZVEUoYml0KSB8PSBNQVNLKGJpdCkpCisjZGVmaW5lIENMUihiaXQpCShCWVRFKGJpdCkgJj0gKH5NQVNLKGJpdCkpKQorI2RlZmluZSBUU1QoYml0KQkoQllURShiaXQpICYgTUFTSyhiaXQpKQorCitzdGF0aWMgdm9pZCBwcmludF9zdGF0c19hbmRfZXhpdChpbnQganVuaykgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBwcmludF9zdGF0c19hbmRfZXhpdChpbnQganVuayBVTlVTRURfUEFSQU0pCit7CisJdW5zaWduZWQgbG9uZyB1bDsKKwl1bnNpZ25lZCBsb25nIG5yZWN2OworCisJc2lnbmFsKFNJR0lOVCwgU0lHX0lHTik7CisKKwlucmVjdiA9IEcubnJlY2VpdmVkOworCXByaW50ZigiXG4tLS0gJXMgcGluZyBzdGF0aXN0aWNzIC0tLVxuIgorCQkiJWx1IHBhY2tldHMgdHJhbnNtaXR0ZWQsICIKKwkJIiVsdSBwYWNrZXRzIHJlY2VpdmVkLCAiLAorCQlob3N0bmFtZSwgRy5udHJhbnNtaXR0ZWQsIG5yZWN2CisJKTsKKwlpZiAoRy5ucmVwZWF0cykKKwkJcHJpbnRmKCIlbHUgZHVwbGljYXRlcywgIiwgRy5ucmVwZWF0cyk7CisJdWwgPSBHLm50cmFuc21pdHRlZDsKKwlpZiAodWwgIT0gMCkKKwkJdWwgPSAodWwgLSBucmVjdikgKiAxMDAgLyB1bDsKKwlwcmludGYoIiVsdSUlIHBhY2tldCBsb3NzXG4iLCB1bCk7CisJaWYgKHRtaW4gIT0gVUlOVF9NQVgpIHsKKwkJdW5zaWduZWQgdGF2ZyA9IHRzdW0gLyAobnJlY3YgKyBHLm5yZXBlYXRzKTsKKwkJcHJpbnRmKCJyb3VuZC10cmlwIG1pbi9hdmcvbWF4ID0gJXUuJTAzdS8ldS4lMDN1LyV1LiUwM3UgbXNcbiIsCisJCQl0bWluIC8gMTAwMCwgdG1pbiAlIDEwMDAsCisJCQl0YXZnIC8gMTAwMCwgdGF2ZyAlIDEwMDAsCisJCQl0bWF4IC8gMTAwMCwgdG1heCAlIDEwMDApOworCX0KKwkvKiBpZiBjb25kaXRpb24gaXMgdHJ1ZSwgZXhpdCB3aXRoIDEgLS0gJ2ZhaWx1cmUnICovCisJZXhpdChucmVjdiA9PSAwIHx8IChkZWFkbGluZSAmJiBucmVjdiA8IHBpbmdjb3VudCkpOworfQorCitzdGF0aWMgdm9pZCBzZW5kcGluZ190YWlsKHZvaWQgKCpzcCkoaW50KSwgaW50IHNpemVfcGt0KQoreworCWludCBzejsKKworCUNMUigodWludDE2X3QpRy5udHJhbnNtaXR0ZWQgJSBNQVhfRFVQX0NISyk7CisJRy5udHJhbnNtaXR0ZWQrKzsKKworCXNpemVfcGt0ICs9IGRhdGFsZW47CisKKwkvKiBzaXplb2YocGluZ2FkZHIpIGNhbiBiZSBsYXJnZXIgdGhhbiByZWFsIHNhIHNpemUsIGJ1dCBJIHRoaW5rCisJICogaXQgZG9lc24ndCBtYXR0ZXIgKi8KKwlzeiA9IHhzZW5kdG8ocGluZ3NvY2ssIEcuc25kX3BhY2tldCwgc2l6ZV9wa3QsICZwaW5nYWRkci5zYSwgc2l6ZW9mKHBpbmdhZGRyKSk7CisJaWYgKHN6ICE9IHNpemVfcGt0KQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfd3JpdGVfZXJyb3IpOworCisJaWYgKHBpbmdjb3VudCA9PSAwIHx8IGRlYWRsaW5lIHx8IEcubnRyYW5zbWl0dGVkIDwgcGluZ2NvdW50KSB7CisJCS8qIERpZG4ndCBzZW5kIGFsbCBwaW5ncyB5ZXQgLSBzY2hlZHVsZSBuZXh0IGluIDFzICovCisJCXNpZ25hbChTSUdBTFJNLCBzcCk7CisJCWlmIChkZWFkbGluZSkgeworCQkJdG90YWxfc2VjcyArPSBQSU5HSU5URVJWQUw7CisJCQlpZiAodG90YWxfc2VjcyA+PSBkZWFkbGluZSkKKwkJCQlzaWduYWwoU0lHQUxSTSwgcHJpbnRfc3RhdHNfYW5kX2V4aXQpOworCQl9CisJCWFsYXJtKFBJTkdJTlRFUlZBTCk7CisJfSBlbHNlIHsgLyogLWMgTk4sIGFuZCBhbGwgTk4gYXJlIHNlbnQgKGFuZCBubyBkZWFkbGluZSkgKi8KKwkJLyogV2FpdCBmb3IgdGhlIGxhc3QgcGluZyB0byBjb21lIGJhY2suCisJCSAqIC1XIHRpbWVvdXQ6IHdhaXQgZm9yIGEgcmVzcG9uc2UgaW4gc2Vjb25kcy4KKwkJICogQWZmZWN0cyBvbmx5IHRpbWVvdXQgaW4gYWJzZW5zZSBvZiBhbnkgcmVzcG9uc2VzLAorCQkgKiBvdGhlcndpc2UgcGluZyB3YWl0cyBmb3IgdHdvIFJUVHMuICovCisJCXVuc2lnbmVkIGV4cGlyZSA9IHRpbWVvdXQ7CisKKwkJaWYgKEcubnJlY2VpdmVkKSB7CisJCQkvKiBhcHByb3guIDIqdG1heCwgaW4gc2Vjb25kcyAoMiBSVFQpICovCisJCQlleHBpcmUgPSB0bWF4IC8gKDUxMioxMDI0KTsKKwkJCWlmIChleHBpcmUgPT0gMCkKKwkJCQlleHBpcmUgPSAxOworCQl9CisJCXNpZ25hbChTSUdBTFJNLCBwcmludF9zdGF0c19hbmRfZXhpdCk7CisJCWFsYXJtKGV4cGlyZSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBzZW5kcGluZzQoaW50IGp1bmsgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCBpY21wICpwa3QgPSBHLnNuZF9wYWNrZXQ7CisKKwltZW1zZXQocGt0LCBHLnBhdHRlcm4sIGRhdGFsZW4gKyBJQ01QX01JTkxFTiArIDQpOworCXBrdC0+aWNtcF90eXBlID0gSUNNUF9FQ0hPOworCS8qcGt0LT5pY21wX2NvZGUgPSAwOyovCisJcGt0LT5pY21wX2Nrc3VtID0gMDsgLyogY2tzdW0gaXMgY2FsY3VsYXRlZCB3aXRoIHRoaXMgZmllbGQgc2V0IHRvIDAgKi8KKwlwa3QtPmljbXBfc2VxID0gaHRvbnMoRy5udHJhbnNtaXR0ZWQpOyAvKiBkb24ndCArKyBoZXJlLCBpdCBjYW4gYmUgYSBtYWNybyAqLworCXBrdC0+aWNtcF9pZCA9IG15aWQ7CisKKwkvKiBJZiBkYXRhbGVuIDwgNCwgd2Ugc3RvcmUgdGltZXN0YW1wIF9wYXN0XyB0aGUgcGFja2V0LAorCSAqIGJ1dCBpdCdzIG9rIC0gd2UgYWxsb2NhdGVkIDQgZXh0cmEgYnl0ZXMgaW4geHphbGxvYygpIGp1c3QgaW4gY2FzZS4KKwkgKi8KKwkvKmlmIChkYXRhbGVuID49IDQpKi8KKwkJLyogTm8gaHRvbjogd2UnbGwgcmVhZCBpdCBiYWNrIG9uIHRoZSBzYW1lIG1hY2hpbmUgKi8KKwkJKih1aW50MzJfdCopJnBrdC0+aWNtcF9kdW4gPSBtb25vdG9uaWNfdXMoKTsKKworCXBrdC0+aWNtcF9ja3N1bSA9IGluZXRfY2tzdW0oKHVpbnQxNl90ICopIHBrdCwgZGF0YWxlbiArIElDTVBfTUlOTEVOKTsKKworCXNlbmRwaW5nX3RhaWwoc2VuZHBpbmc0LCBJQ01QX01JTkxFTik7Cit9CisjaWYgRU5BQkxFX1BJTkc2CitzdGF0aWMgdm9pZCBzZW5kcGluZzYoaW50IGp1bmsgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCBpY21wNl9oZHIgKnBrdCA9IEcuc25kX3BhY2tldDsKKworCW1lbXNldChwa3QsIEcucGF0dGVybiwgZGF0YWxlbiArIHNpemVvZihzdHJ1Y3QgaWNtcDZfaGRyKSArIDQpOworCXBrdC0+aWNtcDZfdHlwZSA9IElDTVA2X0VDSE9fUkVRVUVTVDsKKwkvKnBrdC0+aWNtcDZfY29kZSA9IDA7Ki8KKwkvKnBrdC0+aWNtcDZfY2tzdW0gPSAwOyovCisJcGt0LT5pY21wNl9zZXEgPSBodG9ucyhHLm50cmFuc21pdHRlZCk7IC8qIGRvbid0ICsrIGhlcmUsIGl0IGNhbiBiZSBhIG1hY3JvICovCisJcGt0LT5pY21wNl9pZCA9IG15aWQ7CisKKwkvKmlmIChkYXRhbGVuID49IDQpKi8KKwkJKihiYl9fYWxpYXNlZF91aW50MzJfdCopKCZwa3QtPmljbXA2X2RhdGE4WzRdKSA9IG1vbm90b25pY191cygpOworCisJLy9UT0RPPyBwa3QtPmljbXBfY2tzdW0gPSBpbmV0X2Nrc3VtKC4uLik7CisKKwlzZW5kcGluZ190YWlsKHNlbmRwaW5nNiwgc2l6ZW9mKHN0cnVjdCBpY21wNl9oZHIpKTsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciAqaWNtcF90eXBlX25hbWUoaW50IGlkKQoreworCXN3aXRjaCAoaWQpIHsKKwljYXNlIElDTVBfRUNIT1JFUExZOiAgICAgIHJldHVybiAiRWNobyBSZXBseSI7CisJY2FzZSBJQ01QX0RFU1RfVU5SRUFDSDogICByZXR1cm4gIkRlc3RpbmF0aW9uIFVucmVhY2hhYmxlIjsKKwljYXNlIElDTVBfU09VUkNFX1FVRU5DSDogIHJldHVybiAiU291cmNlIFF1ZW5jaCI7CisJY2FzZSBJQ01QX1JFRElSRUNUOiAgICAgICByZXR1cm4gIlJlZGlyZWN0IChjaGFuZ2Ugcm91dGUpIjsKKwljYXNlIElDTVBfRUNITzogICAgICAgICAgIHJldHVybiAiRWNobyBSZXF1ZXN0IjsKKwljYXNlIElDTVBfVElNRV9FWENFRURFRDogIHJldHVybiAiVGltZSBFeGNlZWRlZCI7CisJY2FzZSBJQ01QX1BBUkFNRVRFUlBST0I6ICByZXR1cm4gIlBhcmFtZXRlciBQcm9ibGVtIjsKKwljYXNlIElDTVBfVElNRVNUQU1QOiAgICAgIHJldHVybiAiVGltZXN0YW1wIFJlcXVlc3QiOworCWNhc2UgSUNNUF9USU1FU1RBTVBSRVBMWTogcmV0dXJuICJUaW1lc3RhbXAgUmVwbHkiOworCWNhc2UgSUNNUF9JTkZPX1JFUVVFU1Q6ICAgcmV0dXJuICJJbmZvcm1hdGlvbiBSZXF1ZXN0IjsKKwljYXNlIElDTVBfSU5GT19SRVBMWTogICAgIHJldHVybiAiSW5mb3JtYXRpb24gUmVwbHkiOworCWNhc2UgSUNNUF9BRERSRVNTOiAgICAgICAgcmV0dXJuICJBZGRyZXNzIE1hc2sgUmVxdWVzdCI7CisJY2FzZSBJQ01QX0FERFJFU1NSRVBMWTogICByZXR1cm4gIkFkZHJlc3MgTWFzayBSZXBseSI7CisJZGVmYXVsdDogICAgICAgICAgICAgICAgICByZXR1cm4gInVua25vd24gSUNNUCB0eXBlIjsKKwl9Cit9CisjaWYgRU5BQkxFX1BJTkc2CisvKiBSRkMzNTQyIGNoYW5nZWQgc29tZSBkZWZpbml0aW9ucyBmcm9tIFJGQzIyOTIgZm9yIG5vIGdvb2QgcmVhc29uLCB3aGVlIQorICogdGhlIG5ld2VyIDM1NDIgdXNlcyBhIE1MRF8gcHJlZml4IHdoZXJlIGFzIDIyOTIgdXNlcyBJQ01QNl8gcHJlZml4ICovCisjaWZuZGVmIE1MRF9MSVNURU5FUl9RVUVSWQorIyBkZWZpbmUgTUxEX0xJU1RFTkVSX1FVRVJZIElDTVA2X01FTUJFUlNISVBfUVVFUlkKKyNlbmRpZgorI2lmbmRlZiBNTERfTElTVEVORVJfUkVQT1JUCisjIGRlZmluZSBNTERfTElTVEVORVJfUkVQT1JUIElDTVA2X01FTUJFUlNISVBfUkVQT1JUCisjZW5kaWYKKyNpZm5kZWYgTUxEX0xJU1RFTkVSX1JFRFVDVElPTgorIyBkZWZpbmUgTUxEX0xJU1RFTkVSX1JFRFVDVElPTiBJQ01QNl9NRU1CRVJTSElQX1JFRFVDVElPTgorI2VuZGlmCitzdGF0aWMgY29uc3QgY2hhciAqaWNtcDZfdHlwZV9uYW1lKGludCBpZCkKK3sKKwlzd2l0Y2ggKGlkKSB7CisJY2FzZSBJQ01QNl9EU1RfVU5SRUFDSDogICAgICByZXR1cm4gIkRlc3RpbmF0aW9uIFVucmVhY2hhYmxlIjsKKwljYXNlIElDTVA2X1BBQ0tFVF9UT09fQklHOiAgIHJldHVybiAiUGFja2V0IHRvbyBiaWciOworCWNhc2UgSUNNUDZfVElNRV9FWENFRURFRDogICAgcmV0dXJuICJUaW1lIEV4Y2VlZGVkIjsKKwljYXNlIElDTVA2X1BBUkFNX1BST0I6ICAgICAgIHJldHVybiAiUGFyYW1ldGVyIFByb2JsZW0iOworCWNhc2UgSUNNUDZfRUNIT19SRVBMWTogICAgICAgcmV0dXJuICJFY2hvIFJlcGx5IjsKKwljYXNlIElDTVA2X0VDSE9fUkVRVUVTVDogICAgIHJldHVybiAiRWNobyBSZXF1ZXN0IjsKKwljYXNlIE1MRF9MSVNURU5FUl9RVUVSWTogICAgIHJldHVybiAiTGlzdGVuZXIgUXVlcnkiOworCWNhc2UgTUxEX0xJU1RFTkVSX1JFUE9SVDogICAgcmV0dXJuICJMaXN0ZW5lciBSZXBvcnQiOworCWNhc2UgTUxEX0xJU1RFTkVSX1JFRFVDVElPTjogcmV0dXJuICJMaXN0ZW5lciBSZWR1Y3Rpb24iOworCWRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIElDTVAgdHlwZSI7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHVucGFja190YWlsKGludCBzeiwgdWludDMyX3QgKnRwLAorCQljb25zdCBjaGFyICpmcm9tX3N0ciwKKwkJdWludDE2X3QgcmVjdl9zZXEsIGludCB0dGwpCit7CisJdW5zaWduZWQgY2hhciAqYiwgbTsKKwljb25zdCBjaGFyICpkdXBtc2cgPSAiIChEVVAhKSI7CisJdW5zaWduZWQgdHJpcHRpbWUgPSB0cmlwdGltZTsgLyogZm9yIGdjYyAqLworCisJaWYgKHRwKSB7CisJCS8qIChpbnQzMl90KSBjYXN0IGlzIGZvciBoeXBvdGhldGljYWwgNjQtYml0IHVuc2lnbmVkICovCisJCS8qIChkb2Vzbid0IGh1cnQgMzItYml0IHJlYWwtd29ybGQgYW55d2F5KSAqLworCQl0cmlwdGltZSA9IChpbnQzMl90KSAoKHVpbnQzMl90KW1vbm90b25pY191cygpIC0gKnRwKTsKKwkJdHN1bSArPSB0cmlwdGltZTsKKwkJaWYgKHRyaXB0aW1lIDwgdG1pbikKKwkJCXRtaW4gPSB0cmlwdGltZTsKKwkJaWYgKHRyaXB0aW1lID4gdG1heCkKKwkJCXRtYXggPSB0cmlwdGltZTsKKwl9CisKKwliID0gJkJZVEUocmVjdl9zZXEgJSBNQVhfRFVQX0NISyk7CisJbSA9IE1BU0socmVjdl9zZXEgJSBNQVhfRFVQX0NISyk7CisJLyppZiBUU1QocmVjdl9zZXEgJSBNQVhfRFVQX0NISyk6Ki8KKwlpZiAoKmIgJiBtKSB7CisJCSsrRy5ucmVwZWF0czsKKwl9IGVsc2UgeworCQkvKlNFVChyZWN2X3NlcSAlIE1BWF9EVVBfQ0hLKToqLworCQkqYiB8PSBtOworCQkrK0cubnJlY2VpdmVkOworCQlkdXBtc2cgKz0gNzsKKwl9CisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9RVUlFVCkKKwkJcmV0dXJuOworCisJcHJpbnRmKCIlZCBieXRlcyBmcm9tICVzOiBzZXE9JXUgdHRsPSVkIiwgc3osCisJCWZyb21fc3RyLCByZWN2X3NlcSwgdHRsKTsKKwlpZiAodHApCisJCXByaW50ZigiIHRpbWU9JXUuJTAzdSBtcyIsIHRyaXB0aW1lIC8gMTAwMCwgdHJpcHRpbWUgJSAxMDAwKTsKKwlwdXRzKGR1cG1zZyk7CisJZmZsdXNoX2FsbCgpOworfQorc3RhdGljIHZvaWQgdW5wYWNrNChjaGFyICpidWYsIGludCBzeiwgc3RydWN0IHNvY2thZGRyX2luICpmcm9tKQoreworCXN0cnVjdCBpY21wICppY21wcGt0OworCXN0cnVjdCBpcGhkciAqaXBoZHI7CisJaW50IGhsZW47CisKKwkvKiBkaXNjYXJkIGlmIHRvbyBzaG9ydCAqLworCWlmIChzeiA8IChkYXRhbGVuICsgSUNNUF9NSU5MRU4pKQorCQlyZXR1cm47CisKKwkvKiBjaGVjayBJUCBoZWFkZXIgKi8KKwlpcGhkciA9IChzdHJ1Y3QgaXBoZHIgKikgYnVmOworCWhsZW4gPSBpcGhkci0+aWhsIDw8IDI7CisJc3ogLT0gaGxlbjsKKwlpY21wcGt0ID0gKHN0cnVjdCBpY21wICopIChidWYgKyBobGVuKTsKKwlpZiAoaWNtcHBrdC0+aWNtcF9pZCAhPSBteWlkKQorCQlyZXR1cm47CQkJCS8qIG5vdCBvdXIgcGluZyAqLworCisJaWYgKGljbXBwa3QtPmljbXBfdHlwZSA9PSBJQ01QX0VDSE9SRVBMWSkgeworCQl1aW50MTZfdCByZWN2X3NlcSA9IG50b2hzKGljbXBwa3QtPmljbXBfc2VxKTsKKwkJdWludDMyX3QgKnRwID0gTlVMTDsKKworCQlpZiAoc3ogPj0gSUNNUF9NSU5MRU4gKyBzaXplb2YodWludDMyX3QpKQorCQkJdHAgPSAodWludDMyX3QgKikgaWNtcHBrdC0+aWNtcF9kYXRhOworCQl1bnBhY2tfdGFpbChzeiwgdHAsCisJCQlpbmV0X250b2EoKihzdHJ1Y3QgaW5fYWRkciAqKSAmZnJvbS0+c2luX2FkZHIuc19hZGRyKSwKKwkJCXJlY3Zfc2VxLCBpcGhkci0+dHRsKTsKKwl9IGVsc2UgaWYgKGljbXBwa3QtPmljbXBfdHlwZSAhPSBJQ01QX0VDSE8pIHsKKwkJYmJfZXJyb3JfbXNnKCJ3YXJuaW5nOiBnb3QgSUNNUCAlZCAoJXMpIiwKKwkJCQlpY21wcGt0LT5pY21wX3R5cGUsCisJCQkJaWNtcF90eXBlX25hbWUoaWNtcHBrdC0+aWNtcF90eXBlKSk7CisJfQorfQorI2lmIEVOQUJMRV9QSU5HNgorc3RhdGljIHZvaWQgdW5wYWNrNihjaGFyICpwYWNrZXQsIGludCBzeiwgc3RydWN0IHNvY2thZGRyX2luNiAqZnJvbSwgaW50IGhvcGxpbWl0KQoreworCXN0cnVjdCBpY21wNl9oZHIgKmljbXBwa3Q7CisJY2hhciBidWZbSU5FVDZfQUREUlNUUkxFTl07CisKKwkvKiBkaXNjYXJkIGlmIHRvbyBzaG9ydCAqLworCWlmIChzeiA8IChkYXRhbGVuICsgc2l6ZW9mKHN0cnVjdCBpY21wNl9oZHIpKSkKKwkJcmV0dXJuOworCisJaWNtcHBrdCA9IChzdHJ1Y3QgaWNtcDZfaGRyICopIHBhY2tldDsKKwlpZiAoaWNtcHBrdC0+aWNtcDZfaWQgIT0gbXlpZCkKKwkJcmV0dXJuOwkJCQkvKiBub3Qgb3VyIHBpbmcgKi8KKworCWlmIChpY21wcGt0LT5pY21wNl90eXBlID09IElDTVA2X0VDSE9fUkVQTFkpIHsKKwkJdWludDE2X3QgcmVjdl9zZXEgPSBudG9ocyhpY21wcGt0LT5pY21wNl9zZXEpOworCQl1aW50MzJfdCAqdHAgPSBOVUxMOworCisJCWlmIChzeiA+PSBzaXplb2Yoc3RydWN0IGljbXA2X2hkcikgKyBzaXplb2YodWludDMyX3QpKQorCQkJdHAgPSAodWludDMyX3QgKikgJmljbXBwa3QtPmljbXA2X2RhdGE4WzRdOworCQl1bnBhY2tfdGFpbChzeiwgdHAsCisJCQlpbmV0X250b3AoQUZfSU5FVDYsICZmcm9tLT5zaW42X2FkZHIsCisJCQkJCWJ1Ziwgc2l6ZW9mKGJ1ZikpLAorCQkJcmVjdl9zZXEsIGhvcGxpbWl0KTsKKwl9IGVsc2UgaWYgKGljbXBwa3QtPmljbXA2X3R5cGUgIT0gSUNNUDZfRUNIT19SRVFVRVNUKSB7CisJCWJiX2Vycm9yX21zZygid2FybmluZzogZ290IElDTVAgJWQgKCVzKSIsCisJCQkJaWNtcHBrdC0+aWNtcDZfdHlwZSwKKwkJCQlpY21wNl90eXBlX25hbWUoaWNtcHBrdC0+aWNtcDZfdHlwZSkpOworCX0KK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBwaW5nNChsZW5fYW5kX3NvY2thZGRyICpsc2EpCit7CisJaW50IHNvY2tvcHQ7CisKKwlwaW5nYWRkci5zaW4gPSBsc2EtPnUuc2luOworCWlmIChzb3VyY2VfbHNhKSB7CisJCWlmIChzZXRzb2Nrb3B0KHBpbmdzb2NrLCBJUFBST1RPX0lQLCBJUF9NVUxUSUNBU1RfSUYsCisJCQkJJnNvdXJjZV9sc2EtPnUuc2EsIHNvdXJjZV9sc2EtPmxlbikpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc2V0IG11bHRpY2FzdCBzb3VyY2UgaW50ZXJmYWNlIik7CisJCXhiaW5kKHBpbmdzb2NrLCAmc291cmNlX2xzYS0+dS5zYSwgc291cmNlX2xzYS0+bGVuKTsKKwl9CisKKwkvKiBlbmFibGUgYnJvYWRjYXN0IHBpbmdzICovCisJc2V0c29ja29wdF9icm9hZGNhc3QocGluZ3NvY2spOworCisJLyogc2V0IHJlY3YgYnVmIChuZWVkZWQgaWYgd2UgY2FuIGdldCBsb3RzIG9mIHJlc3BvbnNlczogZmxvb2QgcGluZywKKwkgKiBicm9hZGNhc3QgcGluZyBldGMpICovCisJc29ja29wdCA9IChkYXRhbGVuICogMikgKyA3ICogMTAyNDsgLyogZ2l2aW5nIGl0IGEgYml0IG9mIGV4dHJhIHJvb20gKi8KKwlzZXRzb2Nrb3B0X1NPTF9TT0NLRVRfaW50KHBpbmdzb2NrLCBTT19SQ1ZCVUYsIHNvY2tvcHQpOworCisJaWYgKG9wdF90dGwgIT0gMCkgeworCQlzZXRzb2Nrb3B0X2ludChwaW5nc29jaywgSVBQUk9UT19JUCwgSVBfVFRMLCBvcHRfdHRsKTsKKwkJLyogYWJvdmUgZG9lc250IGFmZmVjdCBwYWNrZXRzIHNlbnQgdG8gYmNhc3QgSVAsIHNvLi4uICovCisJCXNldHNvY2tvcHRfaW50KHBpbmdzb2NrLCBJUFBST1RPX0lQLCBJUF9NVUxUSUNBU1RfVFRMLCBvcHRfdHRsKTsKKwl9CisKKwlzaWduYWwoU0lHSU5ULCBwcmludF9zdGF0c19hbmRfZXhpdCk7CisKKwkvKiBzdGFydCB0aGUgcGluZydzIGdvaW5nIC4uLiAqLworCXNlbmRwaW5nNCgwKTsKKworCS8qIGxpc3RlbiBmb3IgcmVwbGllcyAqLworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBzb2NrYWRkcl9pbiBmcm9tOworCQlzb2NrbGVuX3QgZnJvbWxlbiA9IChzb2NrbGVuX3QpIHNpemVvZihmcm9tKTsKKwkJaW50IGM7CisKKwkJYyA9IHJlY3Zmcm9tKHBpbmdzb2NrLCBHLnJjdl9wYWNrZXQsIEcuc2l6ZW9mX3Jjdl9wYWNrZXQsIDAsCisJCQkJKHN0cnVjdCBzb2NrYWRkciAqKSAmZnJvbSwgJmZyb21sZW4pOworCQlpZiAoYyA8IDApIHsKKwkJCWlmIChlcnJubyAhPSBFSU5UUikKKwkJCQliYl9wZXJyb3JfbXNnKCJyZWN2ZnJvbSIpOworCQkJY29udGludWU7CisJCX0KKwkJdW5wYWNrNChHLnJjdl9wYWNrZXQsIGMsICZmcm9tKTsKKwkJaWYgKHBpbmdjb3VudCAmJiBHLm5yZWNlaXZlZCA+PSBwaW5nY291bnQpCisJCQlicmVhazsKKwl9Cit9CisjaWYgRU5BQkxFX1BJTkc2CitleHRlcm4gaW50IEJVR19iYWRfb2Zmc2V0b2ZfaWNtcDZfY2tzdW0odm9pZCk7CitzdGF0aWMgdm9pZCBwaW5nNihsZW5fYW5kX3NvY2thZGRyICpsc2EpCit7CisJaW50IHNvY2tvcHQ7CisJc3RydWN0IG1zZ2hkciBtc2c7CisJc3RydWN0IHNvY2thZGRyX2luNiBmcm9tOworCXN0cnVjdCBpb3ZlYyBpb3Y7CisJY2hhciBjb250cm9sX2J1ZltDTVNHX1NQQUNFKDM2KV07CisKKwlwaW5nYWRkci5zaW42ID0gbHNhLT51LnNpbjY7CisJaWYgKHNvdXJjZV9sc2EpCisJCXhiaW5kKHBpbmdzb2NrLCAmc291cmNlX2xzYS0+dS5zYSwgc291cmNlX2xzYS0+bGVuKTsKKworI2lmZGVmIElDTVA2X0ZJTFRFUgorCXsKKwkJc3RydWN0IGljbXA2X2ZpbHRlciBmaWx0OworCQlpZiAoIShvcHRpb25fbWFzazMyICYgT1BUX1ZFUkJPU0UpKSB7CisJCQlJQ01QNl9GSUxURVJfU0VUQkxPQ0tBTEwoJmZpbHQpOworCQkJSUNNUDZfRklMVEVSX1NFVFBBU1MoSUNNUDZfRUNIT19SRVBMWSwgJmZpbHQpOworCQl9IGVsc2UgeworCQkJSUNNUDZfRklMVEVSX1NFVFBBU1NBTEwoJmZpbHQpOworCQl9CisJCWlmIChzZXRzb2Nrb3B0KHBpbmdzb2NrLCBJUFBST1RPX0lDTVBWNiwgSUNNUDZfRklMVEVSLCAmZmlsdCwKKwkJCQkJc2l6ZW9mKGZpbHQpKSA8IDApCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgic2V0c29ja29wdCglcykiLCAiSUNNUDZfRklMVEVSIik7CisJfQorI2VuZGlmIC8qSUNNUDZfRklMVEVSKi8KKworCS8qIGVuYWJsZSBicm9hZGNhc3QgcGluZ3MgKi8KKwlzZXRzb2Nrb3B0X2Jyb2FkY2FzdChwaW5nc29jayk7CisKKwkvKiBzZXQgcmVjdiBidWYgKG5lZWRlZCBpZiB3ZSBjYW4gZ2V0IGxvdHMgb2YgcmVzcG9uc2VzOiBmbG9vZCBwaW5nLAorCSAqIGJyb2FkY2FzdCBwaW5nIGV0YykgKi8KKwlzb2Nrb3B0ID0gKGRhdGFsZW4gKiAyKSArIDcgKiAxMDI0OyAvKiBnaXZpbmcgaXQgYSBiaXQgb2YgZXh0cmEgcm9vbSAqLworCXNldHNvY2tvcHRfU09MX1NPQ0tFVF9pbnQocGluZ3NvY2ssIFNPX1JDVkJVRiwgc29ja29wdCk7CisKKwlzb2Nrb3B0ID0gb2Zmc2V0b2Yoc3RydWN0IGljbXA2X2hkciwgaWNtcDZfY2tzdW0pOworCWlmIChvZmZzZXRvZihzdHJ1Y3QgaWNtcDZfaGRyLCBpY21wNl9ja3N1bSkgIT0gMikKKwkJQlVHX2JhZF9vZmZzZXRvZl9pY21wNl9ja3N1bSgpOworCXNldHNvY2tvcHRfaW50KHBpbmdzb2NrLCBTT0xfUkFXLCBJUFY2X0NIRUNLU1VNLCBzb2Nrb3B0KTsKKworCS8qIHJlcXVlc3QgdHRsIGluZm8gdG8gYmUgcmV0dXJuZWQgaW4gYW5jaWxsYXJ5IGRhdGEgKi8KKwlzZXRzb2Nrb3B0XzEocGluZ3NvY2ssIFNPTF9JUFY2LCBJUFY2X0hPUExJTUlUKTsKKworCWlmIChpZl9pbmRleCkKKwkJcGluZ2FkZHIuc2luNi5zaW42X3Njb3BlX2lkID0gaWZfaW5kZXg7CisKKwlzaWduYWwoU0lHSU5ULCBwcmludF9zdGF0c19hbmRfZXhpdCk7CisKKwkvKiBzdGFydCB0aGUgcGluZydzIGdvaW5nIC4uLiAqLworCXNlbmRwaW5nNigwKTsKKworCS8qIGxpc3RlbiBmb3IgcmVwbGllcyAqLworCW1zZy5tc2dfbmFtZSA9ICZmcm9tOworCW1zZy5tc2dfbmFtZWxlbiA9IHNpemVvZihmcm9tKTsKKwltc2cubXNnX2lvdiA9ICZpb3Y7CisJbXNnLm1zZ19pb3ZsZW4gPSAxOworCW1zZy5tc2dfY29udHJvbCA9IGNvbnRyb2xfYnVmOworCWlvdi5pb3ZfYmFzZSA9IEcucmN2X3BhY2tldDsKKwlpb3YuaW92X2xlbiA9IEcuc2l6ZW9mX3Jjdl9wYWNrZXQ7CisJd2hpbGUgKDEpIHsKKwkJaW50IGM7CisJCXN0cnVjdCBjbXNnaGRyICptcDsKKwkJaW50IGhvcGxpbWl0ID0gLTE7CisJCW1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZihjb250cm9sX2J1Zik7CisKKwkJYyA9IHJlY3Ztc2cocGluZ3NvY2ssICZtc2csIDApOworCQlpZiAoYyA8IDApIHsKKwkJCWlmIChlcnJubyAhPSBFSU5UUikKKwkJCQliYl9wZXJyb3JfbXNnKCJyZWN2ZnJvbSIpOworCQkJY29udGludWU7CisJCX0KKwkJZm9yIChtcCA9IENNU0dfRklSU1RIRFIoJm1zZyk7IG1wOyBtcCA9IENNU0dfTlhUSERSKCZtc2csIG1wKSkgeworCQkJaWYgKG1wLT5jbXNnX2xldmVsID09IFNPTF9JUFY2CisJCQkgJiYgbXAtPmNtc2dfdHlwZSA9PSBJUFY2X0hPUExJTUlUCisJCQkgLyogZG9uJ3QgY2hlY2sgbGVuIC0gd2UgdHJ1c3QgdGhlIGtlcm5lbDogKi8KKwkJCSAvKiAmJiBtcC0+Y21zZ19sZW4gPj0gQ01TR19MRU4oc2l6ZW9mKGludCkpICovCisJCQkpIHsKKwkJCQkvKmhvcGxpbWl0ID0gKihpbnQqKUNNU0dfREFUQShtcCk7IC0gdW5hbGlnbmVkIGFjY2VzcyAqLworCQkJCW1vdmVfZnJvbV91bmFsaWduZWRfaW50KGhvcGxpbWl0LCBDTVNHX0RBVEEobXApKTsKKwkJCX0KKwkJfQorCQl1bnBhY2s2KEcucmN2X3BhY2tldCwgYywgJmZyb20sIGhvcGxpbWl0KTsKKwkJaWYgKHBpbmdjb3VudCAmJiBHLm5yZWNlaXZlZCA+PSBwaW5nY291bnQpCisJCQlicmVhazsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgcGluZyhsZW5fYW5kX3NvY2thZGRyICpsc2EpCit7CisJcHJpbnRmKCJQSU5HICVzICglcykiLCBob3N0bmFtZSwgZG90dGVkKTsKKwlpZiAoc291cmNlX2xzYSkgeworCQlwcmludGYoIiBmcm9tICVzIiwKKwkJCXhtYWxsb2Nfc29ja2FkZHIyZG90dGVkX25vcG9ydCgmc291cmNlX2xzYS0+dS5zYSkpOworCX0KKwlwcmludGYoIjogJWQgZGF0YSBieXRlc1xuIiwgZGF0YWxlbik7CisKKwljcmVhdGVfaWNtcF9zb2NrZXQobHNhKTsKKwkvKiB1bnRlc3RlZCB3aGV0aGVyICItSSBhZGRyIiByZWFsbHkgd29ya3MgZm9yIElQdjY6ICovCisJaWYgKHN0cl9JKQorCQlzZXRzb2Nrb3B0X2JpbmR0b2RldmljZShwaW5nc29jaywgc3RyX0kpOworCisJRy5zaXplb2ZfcmN2X3BhY2tldCA9IGRhdGFsZW4gKyBNQVhJUExFTiArIE1BWElDTVBMRU47CisJRy5yY3ZfcGFja2V0ID0geHphbGxvYyhHLnNpemVvZl9yY3ZfcGFja2V0KTsKKyNpZiBFTkFCTEVfUElORzYKKwlpZiAobHNhLT51LnNhLnNhX2ZhbWlseSA9PSBBRl9JTkVUNikgeworCQkvKiArNCByZXNlcnZlcyBhIHBsYWNlIGZvciB0aW1lc3RhbXAsIHdoaWNoIG1heSBlbmQgdXAgc2l0dGluZworCQkgKiBfYWZ0ZXJfIHBhY2tldC4gU2F2ZXMgb25lIGlmKCkgLSBzZWUgc2VuZHBpbmc0LzYoKSAqLworCQlHLnNuZF9wYWNrZXQgPSB4emFsbG9jKGRhdGFsZW4gKyBzaXplb2Yoc3RydWN0IGljbXA2X2hkcikgKyA0KTsKKwkJcGluZzYobHNhKTsKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJRy5zbmRfcGFja2V0ID0geHphbGxvYyhkYXRhbGVuICsgSUNNUF9NSU5MRU4gKyA0KTsKKwkJcGluZzQobHNhKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY29tbW9uX3BpbmdfbWFpbihpbnQgb3B0LCBjaGFyICoqYXJndikKK3sKKwlsZW5fYW5kX3NvY2thZGRyICpsc2E7CisJY2hhciAqc3RyX3MsICpzdHJfcDsKKworCUlOSVRfRygpOworCisJLyogZXhhY3RseSBvbmUgYXJndW1lbnQgbmVlZGVkOyAtdiBhbmQgLXEgZG9uJ3QgbWl4OyAtYyBOVU0sIC10IE5VTSwgLXcgTlVNLCAtVyBOVU0gKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MTpxLS12OnYtLXE6Yys6dCs6dys6VysiOworCW9wdCB8PSBnZXRvcHQzMihhcmd2LCBPUFRfU1RSSU5HLCAmcGluZ2NvdW50LCAmc3RyX3MsICZvcHRfdHRsLCAmZGVhZGxpbmUsICZ0aW1lb3V0LCAmc3RyX0ksICZzdHJfcCk7CisJaWYgKG9wdCAmIE9QVF9zKQorCQlkYXRhbGVuID0geGF0b3UxNihzdHJfcyk7IC8vIC1zCisJaWYgKG9wdCAmIE9QVF9JKSB7IC8vIC1JCisJCWlmX2luZGV4ID0gaWZfbmFtZXRvaW5kZXgoc3RyX0kpOworCQlpZiAoIWlmX2luZGV4KSB7CisJCQkvKiBUT0RPOiBJJ20gbm90IHN1cmUgaXQgdGFrZXMgSVB2NiB1bmxlc3MgaW4gW1hYOlhYLi5dIGZvcm1hdCAqLworCQkJc291cmNlX2xzYSA9IHhkb3R0ZWQyc29ja2FkZHIoc3RyX0ksIDApOworCQkJc3RyX0kgPSBOVUxMOyAvKiBkb24ndCB0cnkgdG8gYmluZCB0byBkZXZpY2UgbGF0ZXIgKi8KKwkJfQorCX0KKwlpZiAob3B0ICYgT1BUX3ApCisJCUcucGF0dGVybiA9IHhzdHJ0b3VfcmFuZ2Uoc3RyX3AsIDE2LCAwLCAyNTUpOworCisJbXlpZCA9ICh1aW50MTZfdCkgZ2V0cGlkKCk7CisJaG9zdG5hbWUgPSBhcmd2W29wdGluZF07CisjaWYgRU5BQkxFX1BJTkc2CisJeworCQlzYV9mYW1pbHlfdCBhZiA9IEFGX1VOU1BFQzsKKwkJaWYgKG9wdCAmIE9QVF9JUFY0KQorCQkJYWYgPSBBRl9JTkVUOworCQlpZiAob3B0ICYgT1BUX0lQVjYpCisJCQlhZiA9IEFGX0lORVQ2OworCQlsc2EgPSB4aG9zdF9hbmRfYWYyc29ja2FkZHIoaG9zdG5hbWUsIDAsIGFmKTsKKwl9CisjZWxzZQorCWxzYSA9IHhob3N0X2FuZF9hZjJzb2NrYWRkcihob3N0bmFtZSwgMCwgQUZfSU5FVCk7CisjZW5kaWYKKworCWlmIChzb3VyY2VfbHNhICYmIHNvdXJjZV9sc2EtPnUuc2Euc2FfZmFtaWx5ICE9IGxzYS0+dS5zYS5zYV9mYW1pbHkpCisJCS8qIGxlYWtpbmcgaXQgaGVyZS4uLiAqLworCQlzb3VyY2VfbHNhID0gTlVMTDsKKworCWRvdHRlZCA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkX25vcG9ydCgmbHNhLT51LnNhKTsKKwlwaW5nKGxzYSk7CisJcHJpbnRfc3RhdHNfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKKwkvKnJldHVybiBFWElUX1NVQ0NFU1M7Ki8KK30KKyNlbmRpZiAvKiBGRUFUVVJFX0ZBTkNZX1BJTkcgKi8KKworCitpbnQgcGluZ19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcGluZ19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisjaWYgIUVOQUJMRV9GRUFUVVJFX0ZBTkNZX1BJTkcKKwlyZXR1cm4gY29tbW9uX3BpbmdfbWFpbihBRl9VTlNQRUMsIGFyZ3YpOworI2Vsc2UKKwlyZXR1cm4gY29tbW9uX3BpbmdfbWFpbigwLCBhcmd2KTsKKyNlbmRpZgorfQorCisjaWYgRU5BQkxFX1BJTkc2CitpbnQgcGluZzZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHBpbmc2X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKyMgaWYgIUVOQUJMRV9GRUFUVVJFX0ZBTkNZX1BJTkcKKwlyZXR1cm4gY29tbW9uX3BpbmdfbWFpbihBRl9JTkVUNiwgYXJndik7CisjIGVsc2UKKwlyZXR1cm4gY29tbW9uX3BpbmdfbWFpbihPUFRfSVBWNiwgYXJndik7CisjIGVuZGlmCit9CisjZW5kaWYKKworLyogZnJvbSBwaW5nNi5jOgorICogQ29weXJpZ2h0IChjKSAxOTg5IFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIE1pa2UgTXV1c3MuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKgorICogMy4gPEJTRCBBZHZlcnRpc2luZyBDbGF1c2Ugb21pdHRlZCBwZXIgdGhlIEp1bHkgMjIsIDE5OTkgbGljZW5zaW5nIGNoYW5nZQorICoJCWZ0cDovL2Z0cC5jcy5iZXJrZWxleS5lZHUvcHViLzRic2QvUkVBRE1FLkltcHQuTGljZW5zZS5DaGFuZ2U+CisgKgorICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLwpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9wc2Nhbi5jIGIvbmV0d29ya2luZy9wc2Nhbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZWQ4Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3BzY2FuLmMKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBQc2NhbiBpcyBhIG1pbmkgcG9ydCBzY2FubmVyIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IDIwMDcgVGl0byBSYWd1c2EgPGZhcm1hdGl0b0B0aXNjYWxpLml0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHBzY2FuX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWNiXSBbLXAgTUlOX1BPUlRdIFstUCBNQVhfUE9SVF0gWy10IFRJTUVPVVRdIFstVCBNSU5fUlRUXSBIT1NUIgorLy91c2FnZTojZGVmaW5lIHBzY2FuX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2NhbiBhIGhvc3QsIHByaW50IGFsbCBvcGVuIHBvcnRzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jCVNob3cgY2xvc2VkIHBvcnRzIHRvbyIKKy8vdXNhZ2U6ICAgICAiXG4JLWIJU2hvdyBibG9ja2VkIHBvcnRzIHRvbyIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJU2NhbiBmcm9tIHRoaXMgcG9ydCAoZGVmYXVsdCAxKSIKKy8vdXNhZ2U6ICAgICAiXG4JLVAJU2NhbiB1cCB0byB0aGlzIHBvcnQgKGRlZmF1bHQgMTAyNCkiCisvL3VzYWdlOiAgICAgIlxuCS10CVRpbWVvdXQgKGRlZmF1bHQgNTAwMCBtcykiCisvL3VzYWdlOiAgICAgIlxuCS1UCU1pbmltdW0gcnR0IChkZWZhdWx0IDUgbXMsIGluY3JlYXNlIGZvciBjb25nZXN0ZWQgaG9zdHMpIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogZGVidWdnaW5nICovCisjaWZkZWYgREVCVUdfUFNDQU4KKyNkZWZpbmUgRE1TRyguLi4pIGJiX2Vycm9yX21zZyhfX1ZBX0FSR1NfXykKKyNkZWZpbmUgREVSUiguLi4pIGJiX3BlcnJvcl9tc2coX19WQV9BUkdTX18pCisjZWxzZQorI2RlZmluZSBETVNHKC4uLikgKCh2b2lkKTApCisjZGVmaW5lIERFUlIoLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciAqcG9ydF9uYW1lKHVuc2lnbmVkIHBvcnQpCit7CisJc3RydWN0IHNlcnZlbnQgKnNlcnZlcjsKKworCXNlcnZlciA9IGdldHNlcnZieXBvcnQoaHRvbnMocG9ydCksIE5VTEwpOworCWlmIChzZXJ2ZXIpCisJCXJldHVybiBzZXJ2ZXItPnNfbmFtZTsKKwlyZXR1cm4gInVua25vd24iOworfQorCisvKiBXZSBkb24ndCBleHBlY3QgdG8gc2VlIDEwMDArIHNlY29uZHMgZGVsYXksIHVuc2lnbmVkIGlzIGVub3VnaCAqLworI2RlZmluZSBNT05PVE9OSUNfVVMoKSAoKHVuc2lnbmVkKW1vbm90b25pY191cygpKQorCitpbnQgcHNjYW5fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHBzY2FuX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICpvcHRfbWF4X3BvcnQgPSAiMTAyNCI7ICAgICAgLyogLVA6IGRlZmF1bHQgbWF4IHBvcnQgKi8KKwljb25zdCBjaGFyICpvcHRfbWluX3BvcnQgPSAiMSI7ICAgICAgICAgLyogLXA6IGRlZmF1bHQgbWluIHBvcnQgKi8KKwljb25zdCBjaGFyICpvcHRfdGltZW91dCA9ICI1MDAwIjsgICAgICAgLyogLXQ6IGRlZmF1bHQgdGltZW91dCBpbiBtc2VjICovCisJLyogV2UgZXN0aW1hdGUgcnR0IGFuZCB3YWl0IHJ0dCo0IGJlZm9yZSBjb25jbHVkaW5nIHRoYXQgcG9ydCBpcworCSAqIHRvdGFsbHkgYmxvY2tlZC4gbWluIHJ0dCBvZiA1IG1zIG1heSBiZSB0b28gbG93IGlmIHlvdSBhcmUKKwkgKiBzY2FubmluZyBhbiBJbnRlcm5ldCBob3N0IGJlaGluZCBzYXR1cmF0ZWQvdHJhZmZpYyBzaGFwZWQgbGluay4KKwkgKiBSdWxlIG9mIHRodW1iOiB3aXRoIG1pbl9ydHQgb2YgTiBtc2VjLCBzY2FubmluZyAxMDAwIHBvcnRzCisJICogd2lsbCB0YWtlIE4gc2Vjb25kcyBhdCBhYnNvbHV0ZSBtaW5pbXVtICovCisJY29uc3QgY2hhciAqb3B0X21pbl9ydHQgPSAiNSI7ICAgICAgICAgIC8qIC1UOiBkZWZhdWx0IG1pbiBydHQgaW4gbXNlYyAqLworCWNvbnN0IGNoYXIgKnJlc3VsdF9zdHI7CisJbGVuX2FuZF9zb2NrYWRkciAqbHNhcDsKKwlpbnQgczsKKwl1bnNpZ25lZCBvcHQ7CisJdW5zaWduZWQgcG9ydCwgbWF4X3BvcnQsIG5wb3J0czsKKwl1bnNpZ25lZCBjbG9zZWRfcG9ydHMgPSAwOworCXVuc2lnbmVkIG9wZW5fcG9ydHMgPSAwOworCS8qIGFsbCBpbiB1c2VjICovCisJdW5zaWduZWQgdGltZW91dDsKKwl1bnNpZ25lZCBtaW5fcnR0OworCXVuc2lnbmVkIHJ0dF80OworCXVuc2lnbmVkIHN0YXJ0LCBkaWZmOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTEiOyAvKiBleGFjdGx5IG9uZSBub24tb3B0aW9uICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImNicDpQOnQ6VDoiLCAmb3B0X21pbl9wb3J0LCAmb3B0X21heF9wb3J0LCAmb3B0X3RpbWVvdXQsICZvcHRfbWluX3J0dCk7CisJYXJndiArPSBvcHRpbmQ7CisJbWF4X3BvcnQgPSB4YXRvdV9yYW5nZShvcHRfbWF4X3BvcnQsIDEsIDY1NTM1KTsKKwlwb3J0ID0geGF0b3VfcmFuZ2Uob3B0X21pbl9wb3J0LCAxLCBtYXhfcG9ydCk7CisJbnBvcnRzID0gbWF4X3BvcnQgLSBwb3J0ICsgMTsKKwltaW5fcnR0ID0geGF0b3VfcmFuZ2Uob3B0X21pbl9ydHQsIDEsIElOVF9NQVgvMTAwMCAvIDQpICogMTAwMDsKKwl0aW1lb3V0ID0geGF0b3VfcmFuZ2Uob3B0X3RpbWVvdXQsIDEsIElOVF9NQVgvMTAwMCAvIDQpICogMTAwMDsKKwkvKiBJbml0aWFsIHJ0dCBpcyBCSUc6ICovCisJcnR0XzQgPSB0aW1lb3V0OworCisJRE1TRygibWluX3J0dCAldSB0aW1lb3V0ICV1IiwgbWluX3J0dCwgdGltZW91dCk7CisKKwlsc2FwID0geGhvc3Qyc29ja2FkZHIoKmFyZ3YsIHBvcnQpOworCXByaW50ZigiU2Nhbm5pbmcgJXMgcG9ydHMgJXUgdG8gJXVcbiBQb3J0XHRQcm90b1x0U3RhdGVcdFNlcnZpY2VcbiIsCisJCQkqYXJndiwgcG9ydCwgbWF4X3BvcnQpOworCisJZm9yICg7IHBvcnQgPD0gbWF4X3BvcnQ7IHBvcnQrKykgeworCQlETVNHKCJydHQgJXUiLCBydHRfNCk7CisKKwkJLyogVGhlIFNPQ0tfU1RSRUFNIHNvY2tldCB0eXBlIGlzIGltcGxlbWVudGVkIG9uIHRoZSBUQ1AvSVAgcHJvdG9jb2wuICovCisJCXNldF9ucG9ydCgmbHNhcC0+dS5zYSwgaHRvbnMocG9ydCkpOworCQlzID0geHNvY2tldChsc2FwLT51LnNhLnNhX2ZhbWlseSwgU09DS19TVFJFQU0sIDApOworCQkvKiBXZSBuZWVkIHVuYmxvY2tpbmcgc29ja2V0IHNvIHdlIGRvbid0IG5lZWQgdG8gd2FpdCBmb3IgRVRJTUVPVVQuICovCisJCS8qIE5vbmJsb2NraW5nIGNvbm5lY3QgdHlwaWNhbGx5ICJmYWlscyIgd2l0aCBlcnJubyA9PSBFSU5QUk9HUkVTUyAqLworCQluZGVsYXlfb24ocyk7CisKKwkJRE1TRygiY29ubmVjdCB0byBwb3J0ICV1IiwgcG9ydCk7CisJCXJlc3VsdF9zdHIgPSBOVUxMOworCQlzdGFydCA9IE1PTk9UT05JQ19VUygpOworCQlpZiAoY29ubmVjdChzLCAmbHNhcC0+dS5zYSwgbHNhcC0+bGVuKSA9PSAwKSB7CisJCQkvKiBVbmxpa2VseSwgZm9yIG1lIGV2ZW4gbG9jYWxob3N0IGZhaWxzIDopICovCisJCQlETVNHKCJjb25uZWN0IHN1Y2NlZWRlZCIpOworCQkJZ290byBvcGVuOworCQl9CisJCS8qIENoZWNrIGZvciB1bnR5cGljYWwgZXJyb3JzLi4uICovCisJCWlmIChlcnJubyAhPSBFQUdBSU4gJiYgZXJybm8gIT0gRUlOUFJPR1JFU1MKKwkJICYmIGVycm5vICE9IEVDT05OUkVGVVNFRAorCQkpIHsKKwkJCWJiX3BlcnJvcl9ub21zZ19hbmRfZGllKCk7CisJCX0KKworCQlkaWZmID0gMDsKKwkJd2hpbGUgKDEpIHsKKwkJCWlmIChlcnJubyA9PSBFQ09OTlJFRlVTRUQpIHsKKwkJCQlpZiAob3B0ICYgMSkgLyogLWM6IHNob3cgY2xvc2VkIHRvbyAqLworCQkJCQlyZXN1bHRfc3RyID0gImNsb3NlZCI7CisJCQkJY2xvc2VkX3BvcnRzKys7CisJCQkJYnJlYWs7CisJCQl9CisJCQlERVJSKCJwb3J0ICV1IGVycm5vICVkIEAldSIsIHBvcnQsIGVycm5vLCBkaWZmKTsKKworCQkJaWYgKGRpZmYgPiBydHRfNCkgeworCQkJCWlmIChvcHQgJiAyKSAvKiAtYjogc2hvdyBibG9ja2VkIHRvbyAqLworCQkJCQlyZXN1bHRfc3RyID0gImJsb2NrZWQiOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogQ2FuIHNsZWVwIChtdWNoKSBsb25nZXIgdGhhbiBzcGVjaWZpZWQgZGVsYXkuCisJCQkgKiBXZSBjaGVjayBydHQgQkVGT1JFIHdlIHVzbGVlcCwgb3RoZXJ3aXNlCisJCQkgKiBvbiBsb2NhbGhvc3Qgd2UnbGwgaGF2ZSBubyB3cml0ZXMgZG9uZSAoISkKKwkJCSAqIGJlZm9yZSB3ZSBleGNlZWQgKHJhdGhlciBzbWFsbCkgcnR0ICovCisJCQl1c2xlZXAocnR0XzQvOCk7Cisgb3BlbjoKKwkJCWRpZmYgPSBNT05PVE9OSUNfVVMoKSAtIHN0YXJ0OworCQkJRE1TRygid3JpdGUgdG8gcG9ydCAldSBAJXUiLCBwb3J0LCBkaWZmIC0gc3RhcnQpOworCQkJaWYgKHdyaXRlKHMsICIgIiwgMSkgPj0gMCkgeyAvKiBXZSB3ZXJlIGFibGUgdG8gd3JpdGUgdG8gdGhlIHNvY2tldCAqLworCQkJCW9wZW5fcG9ydHMrKzsKKwkJCQlyZXN1bHRfc3RyID0gIm9wZW4iOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCURNU0coIm91dCBvZiBsb29wIEAldSIsIGRpZmYpOworCQlpZiAocmVzdWx0X3N0cikKKwkJCXByaW50ZigiJTV1IiAiXHQiICJ0Y3AiICJcdCIgIiVzIiAiXHQiICIlcyIgIlxuIiwKKwkJCQkJcG9ydCwgcmVzdWx0X3N0ciwgcG9ydF9uYW1lKHBvcnQpKTsKKworCQkvKiBFc3RpbWF0ZSBuZXcgcnR0IC0gd2UgZG9uJ3Qgd2FudCB0byB3YWl0IGVudGlyZSB0aW1lb3V0CisJCSAqIGZvciBlYWNoIHBvcnQuICo0IGFsbG93cyBmb3IgcmlzZSBpbiBuZXQgZGVsYXkuCisJCSAqIFdlIGluY3JlYXNlIHJ0dCBxdWlja2x5IChydHRfNCo0KSwgZGVjcmVhc2Ugc2xvd2x5CisJCSAqIChkaWZmIGlzIGF0IGxlYXN0IHJ0dF80LzgsICo0ID09IHJ0dF80LzIpCisJCSAqIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBhY2NpZGVudGFsbHkgbWlzcyBwb3J0cy4gKi8KKwkJcnR0XzQgPSBkaWZmICogNDsKKwkJaWYgKHJ0dF80IDwgbWluX3J0dCkKKwkJCXJ0dF80ID0gbWluX3J0dDsKKwkJaWYgKHJ0dF80ID4gdGltZW91dCkKKwkJCXJ0dF80ID0gdGltZW91dDsKKwkJLyogQ2xlYW4gdXAgKi8KKwkJY2xvc2Uocyk7CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgZnJlZShsc2FwKTsKKworCXByaW50ZigiJXUgY2xvc2VkLCAldSBvcGVuLCAldSB0aW1lZCBvdXQgKG9yIGJsb2NrZWQpIHBvcnRzXG4iLAorCQkJCQljbG9zZWRfcG9ydHMsCisJCQkJCW9wZW5fcG9ydHMsCisJCQkJCW5wb3J0cyAtIChjbG9zZWRfcG9ydHMgKyBvcGVuX3BvcnRzKSk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvcm91dGUuYyBiL25ldHdvcmtpbmcvcm91dGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWMyZmI3Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9yb3V0ZS5jCkBAIC0wLDAgKzEsNzE2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIHJvdXRlCisgKgorICogU2ltaWxhciB0byB0aGUgc3RhbmRhcmQgVW5peCByb3V0ZSwgYnV0IHdpdGggb25seSB0aGUgbmVjZXNzYXJ5CisgKiBwYXJ0cyBmb3IgQUZfSU5FVCBhbmQgQUZfSU5FVDYKKyAqCisgKiBCam9ybiBXZXNlbiwgQXhpcyBDb21tdW5pY2F0aW9ucyBBQgorICoKKyAqIEF1dGhvciBvZiB0aGUgb3JpZ2luYWwgcm91dGU6CisgKiAgICAgICAgICAgICAgRnJlZCBOLiB2YW4gS2VtcGVuLCA8d2FsdGplQHV3YWx0Lm5sLm11Z25ldC5vcmc+CisgKiAgICAgICAgICAgICAgKGRlcml2ZWQgZnJvbSBGdksncyAncm91dGUuYyAgICAgMS43MCAgICAwMS8wNC85NCcpCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKgorICogZGlzcGxheXJvdXRlKCkgY29kZSBhZGRlZCBieSBWbGFkaW1pciBOLiBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+CisgKiBhZGp1c3RtZW50cyBieSBMYXJyeSBEb29saXR0bGUgIDxMUkRvb2xpdHRsZUBsYmwuZ292PgorICoKKyAqIElQVjYgc3VwcG9ydCBhZGRlZCBieSBCYXJ0IFZpc3NjaGVyIDxtYWdpY2tAbGludXgtZmFuLmNvbT4KKyAqLworCisvKiAyMDA0LzAzLzA5ICBNYW51ZWwgTm92b2EgSUlJIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBSZXdyaXR0ZW4gdG8gZml4IHNldmVyYWwgYnVncywgYWRkIGFkZGl0aW9uYWwgZXJyb3IgY2hlY2tpbmcsIGFuZAorICogcmVtb3ZlIHJpZGljdWxvdXMgYW1vdW50cyBvZiBibG9hdC4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcm91dGVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlt7YWRkfGRlbHxkZWxldGV9XSIKKy8vdXNhZ2U6I2RlZmluZSByb3V0ZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkVkaXQga2VybmVsIHJvdXRpbmcgdGFibGVzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1uCURvbid0IHJlc29sdmUgbmFtZXMiCisvL3VzYWdlOiAgICAgIlxuCS1lCURpc3BsYXkgb3RoZXIvbW9yZSBpbmZvcm1hdGlvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLUEgaW5ldCIgSUZfRkVBVFVSRV9JUFY2KCJ7Nn0iKSAiCVNlbGVjdCBhZGRyZXNzIGZhbWlseSIKKworI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPG5ldC9pZi5oPgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJpbmV0X2NvbW1vbi5oIgorCisKKyNpZm5kZWYgUlRGX1VQCisvKiBLZWVwIHRoaXMgaW4gc3luYyB3aXRoIC91c3Ivc3JjL2xpbnV4L2luY2x1ZGUvbGludXgvcm91dGUuaCAqLworI2RlZmluZSBSVEZfVVAgICAgICAgICAgMHgwMDAxCS8qIHJvdXRlIHVzYWJsZSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUlRGX0dBVEVXQVkgICAgIDB4MDAwMgkvKiBkZXN0aW5hdGlvbiBpcyBhIGdhdGV3YXkgICAgICovCisjZGVmaW5lIFJURl9IT1NUICAgICAgICAweDAwMDQJLyogaG9zdCBlbnRyeSAobmV0IG90aGVyd2lzZSkgICAqLworI2RlZmluZSBSVEZfUkVJTlNUQVRFICAgMHgwMDA4CS8qIHJlaW5zdGF0ZSByb3V0ZSBhZnRlciB0bW91dCAgKi8KKyNkZWZpbmUgUlRGX0RZTkFNSUMgICAgIDB4MDAxMAkvKiBjcmVhdGVkIGR5bi4gKGJ5IHJlZGlyZWN0KSAgICovCisjZGVmaW5lIFJURl9NT0RJRklFRCAgICAweDAwMjAJLyogbW9kaWZpZWQgZHluLiAoYnkgcmVkaXJlY3QpICAqLworI2RlZmluZSBSVEZfTVRVICAgICAgICAgMHgwMDQwCS8qIHNwZWNpZmljIE1UVSBmb3IgdGhpcyByb3V0ZSAgKi8KKyNpZm5kZWYgUlRGX01TUworI2RlZmluZSBSVEZfTVNTICAgICAgICAgUlRGX01UVQkvKiBDb21wYXRpYmlsaXR5IDotKCAgICAgICAgICAgICovCisjZW5kaWYKKyNkZWZpbmUgUlRGX1dJTkRPVyAgICAgIDB4MDA4MAkvKiBwZXIgcm91dGUgd2luZG93IGNsYW1waW5nICAgICovCisjZGVmaW5lIFJURl9JUlRUICAgICAgICAweDAxMDAJLyogSW5pdGlhbCByb3VuZCB0cmlwIHRpbWUgICAgICAqLworI2RlZmluZSBSVEZfUkVKRUNUICAgICAgMHgwMjAwCS8qIFJlamVjdCByb3V0ZSAgICAgICAgICAgICAgICAgKi8KKyNkZWZpbmUgUlRGX05PTkVYVEhPUCAgIDB4MDAyMDAwMDAgLyogcm91dGUgd2l0aCBubyBuZXh0aG9wCSovCisjZW5kaWYKKworI2lmIGRlZmluZWQoU0lPQ0FERFJUT0xEKSB8fCBkZWZpbmVkKFJURl9JUlRUKQkvKiByb3V0ZSAqLworI2RlZmluZSBIQVZFX05FV19BRERSVCAxCisjZW5kaWYKKworI2lmIEhBVkVfTkVXX0FERFJUCisjZGVmaW5lIG1hc2tfaW5fYWRkcih4KSAoKChzdHJ1Y3Qgc29ja2FkZHJfaW4gKikmKCh4KS5ydF9nZW5tYXNrKSktPnNpbl9hZGRyLnNfYWRkcikKKyNkZWZpbmUgZnVsbF9tYXNrKHgpICh4KQorI2Vsc2UKKyNkZWZpbmUgbWFza19pbl9hZGRyKHgpICgoeCkucnRfZ2VubWFzaykKKyNkZWZpbmUgZnVsbF9tYXNrKHgpICgoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSYoeCkpLT5zaW5fYWRkci5zX2FkZHIpCisjZW5kaWYKKworLyogVGhlIFJUQUNUSU9OIGVudHJpZXMgbXVzdCBhZ3JlZSB3aXRoIHRibF92ZXJiW10gYmVsb3chICovCisjZGVmaW5lIFJUQUNUSU9OX0FERCAxCisjZGVmaW5lIFJUQUNUSU9OX0RFTCAyCisKKy8qIEZvciB0aGUgdmFyaW91cyB0YmxfKltdIGFycmF5cywgdGhlIDFzdCBieXRlIGlzIHRoZSBvZmZzZXQgdG8KKyAqIHRoZSBuZXh0IGVudHJ5IGFuZCB0aGUgMm5kIGJ5dGUgaXMgcmV0dXJuIHZhbHVlLiAqLworCisjZGVmaW5lIE5FVF9GTEFHICAxCisjZGVmaW5lIEhPU1RfRkxBRyAyCisKKy8qIFdlIHJlbWFwICctJyB0byAnIycgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBnZXRvcHQuICovCitzdGF0aWMgY29uc3QgY2hhciB0YmxfaGFzaF9uZXRfaG9zdFtdIEFMSUdOMSA9CisJIlwwMDdcMDAxI25ldFwwIgorLyoJIlwwMTBcMDAyI2hvc3RcMCIgKi8KKwkiXDAwN1wwMDIjaG9zdCIJCQkJLyogU2luY2UgbGFzdCwgd2UgY2FuIHNhdmUgYSBieXRlLiAqLworOworCisjZGVmaW5lIEtXX1RBS0VTX0FSRyAgICAgICAgICAgIDAyMAorI2RlZmluZSBLV19TRVRTX0ZMQUcgICAgICAgICAgICAwNDAKKworI2RlZmluZSBLV19JUFZ4X01FVFJJQyAgICAgICAgICAwMjAKKyNkZWZpbmUgS1dfSVBWeF9ORVRNQVNLICAgICAgICAgMDIxCisjZGVmaW5lIEtXX0lQVnhfR0FURVdBWSAgICAgICAgIDAyMgorI2RlZmluZSBLV19JUFZ4X01TUyAgICAgICAgICAgICAwMjMKKyNkZWZpbmUgS1dfSVBWeF9XSU5ET1cgICAgICAgICAgMDI0CisjZGVmaW5lIEtXX0lQVnhfSVJUVCAgICAgICAgICAgIDAyNQorI2RlZmluZSBLV19JUFZ4X0RFVklDRSAgICAgICAgICAwMjYKKworI2RlZmluZSBLV19JUFZ4X0ZMQUdfT05MWSAgICAgICAwNDAKKyNkZWZpbmUgS1dfSVBWeF9SRUpFQ1QgICAgICAgICAgMDQwCisjZGVmaW5lIEtXX0lQVnhfTU9EICAgICAgICAgICAgIDA0MQorI2RlZmluZSBLV19JUFZ4X0RZTiAgICAgICAgICAgICAwNDIKKyNkZWZpbmUgS1dfSVBWeF9SRUlOU1RBVEUgICAgICAgMDQzCisKK3N0YXRpYyBjb25zdCBjaGFyIHRibF9pcHZ4W10gQUxJR04xID0KKwkvKiAwMjAgaXMgdGhlICJ0YWtlcyBhbiBhcmciIGJpdCAqLworI2lmIEhBVkVfTkVXX0FERFJUCisJIlwwMTFcMDIwbWV0cmljXDAiCisjZW5kaWYKKwkiXDAxMlwwMjFuZXRtYXNrXDAiCisJIlwwMDVcMDIyZ3dcMCIKKwkiXDAxMlwwMjJnYXRld2F5XDAiCisJIlwwMDZcMDIzbXNzXDAiCisJIlwwMTFcMDI0d2luZG93XDAiCisjaWZkZWYgUlRGX0lSVFQKKwkiXDAwN1wwMjVpcnR0XDAiCisjZW5kaWYKKwkiXDAwNlwwMjZkZXZcMCIKKwkiXDAxMVwwMjZkZXZpY2VcMCIKKwkvKiAwNDAgaXMgdGhlICJzZXRzIGEgZmxhZyIgYml0IC0gTVVTVCBtYXRjaCBmbGFnc19pcHZ4W10gdmFsdWVzIGJlbG93LiAqLworI2lmZGVmIFJURl9SRUpFQ1QKKwkiXDAxMVwwNDByZWplY3RcMCIKKyNlbmRpZgorCSJcMDA2XDA0MW1vZFwwIgorCSJcMDA2XDA0MmR5blwwIgorLyoJIlwwMTRcMDQzcmVpbnN0YXRlXDAiICovCisJIlwwMTNcMDQzcmVpbnN0YXRlIgkJCS8qIFNpbmNlIGxhc3QsIHdlIGNhbiBzYXZlIGEgYnl0ZS4gKi8KKzsKKworc3RhdGljIGNvbnN0IHVpbnQxNl90IGZsYWdzX2lwdnhbXSA9IHsgLyogTVVTVCBtYXRjaCB0YmxfaXB2eFtdIHZhbHVlcyBhYm92ZS4gKi8KKyNpZmRlZiBSVEZfUkVKRUNUCisJUlRGX1JFSkVDVCwKKyNlbmRpZgorCVJURl9NT0RJRklFRCwKKwlSVEZfRFlOQU1JQywKKwlSVEZfUkVJTlNUQVRFCit9OworCitzdGF0aWMgaW50IGt3X2xvb2t1cChjb25zdCBjaGFyICprd3RibCwgY2hhciAqKipwYXJncykKK3sKKwlpZiAoKipwYXJncykgeworCQlkbyB7CisJCQlpZiAoc3RyY21wKGt3dGJsKzIsICoqcGFyZ3MpID09IDApIHsgLyogRm91bmQgYSBtYXRjaC4gKi8KKwkJCQkqcGFyZ3MgKz0gMTsKKwkJCQlpZiAoa3d0YmxbMV0gJiBLV19UQUtFU19BUkcpIHsKKwkJCQkJaWYgKCEqKnBhcmdzKSB7CS8qIE5vIG1vcmUgYXJncyEgKi8KKwkJCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCQkJfQorCQkJCQkqcGFyZ3MgKz0gMTsgLyogQ2FsbGluZyByb3V0aW5lIHdpbGwgdXNlIGFyZ3NbLTFdLiAqLworCQkJCX0KKwkJCQlyZXR1cm4ga3d0YmxbMV07CisJCQl9CisJCQlrd3RibCArPSAqa3d0Ymw7CisJCX0gd2hpbGUgKCprd3RibCk7CisJfQorCXJldHVybiAwOworfQorCisvKiBBZGQgb3IgZGVsZXRlIGEgcm91dGUsIGRlcGVuZGluZyBvbiBhY3Rpb24uICovCisKK3N0YXRpYyBOT0lOTElORSB2b2lkIElORVRfc2V0cm91dGUoaW50IGFjdGlvbiwgY2hhciAqKmFyZ3MpCit7CisJLyogY2hhciBidWZmZXIgaW5zdGVhZCBvZiBib25hLWZpZGUgc3RydWN0IGF2b2lkcyBhbGlhc2luZyB3YXJuaW5nICovCisJY2hhciBydF9idWZbc2l6ZW9mKHN0cnVjdCBydGVudHJ5KV07CisJc3RydWN0IHJ0ZW50cnkgKmNvbnN0IHJ0ID0gKHZvaWQgKilydF9idWY7CisKKwljb25zdCBjaGFyICpuZXRtYXNrID0gTlVMTDsKKwlpbnQgc2tmZCwgaXNuZXQsIHhmbGFnOworCisJLyogR3JhYiB0aGUgLW5ldCBvciAtaG9zdCBvcHRpb25zLiAgUmVtZW1iZXIgdGhleSB3ZXJlIHRyYW5zZm9ybWVkLiAqLworCXhmbGFnID0ga3dfbG9va3VwKHRibF9oYXNoX25ldF9ob3N0LCAmYXJncyk7CisKKwkvKiBJZiB3ZSBkaWQgZ3JhYiAtbmV0IG9yIC1ob3N0LCBtYWtlIHN1cmUgd2Ugc3RpbGwgaGF2ZSBhbiBhcmcgbGVmdC4gKi8KKwlpZiAoKmFyZ3MgPT0gTlVMTCkgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJLyogQ2xlYW4gb3V0IHRoZSBSVFJFUSBzdHJ1Y3R1cmUuICovCisJbWVtc2V0KHJ0LCAwLCBzaXplb2YoKnJ0KSk7CisKKwl7CisJCWNvbnN0IGNoYXIgKnRhcmdldCA9ICphcmdzKys7CisJCWNoYXIgKnByZWZpeDsKKworCQkvKiByZWNvZ25pemUgeC54LngueC9tYXNrIGZvcm1hdC4gKi8KKwkJcHJlZml4ID0gc3RyY2hyKHRhcmdldCwgJy8nKTsKKwkJaWYgKHByZWZpeCkgeworCQkJaW50IHByZWZpeF9sZW47CisKKwkJCXByZWZpeF9sZW4gPSB4YXRvdWxfcmFuZ2UocHJlZml4KzEsIDAsIDMyKTsKKwkJCW1hc2tfaW5fYWRkcigqcnQpID0gaHRvbmwoIH4oMHhmZmZmZmZmZlVMID4+IHByZWZpeF9sZW4pKTsKKwkJCSpwcmVmaXggPSAnXDAnOworI2lmIEhBVkVfTkVXX0FERFJUCisJCQlydC0+cnRfZ2VubWFzay5zYV9mYW1pbHkgPSBBRl9JTkVUOworI2VuZGlmCisJCX0gZWxzZSB7CisJCQkvKiBEZWZhdWx0IG5ldG1hc2suICovCisJCQluZXRtYXNrID0gImRlZmF1bHQiOworCQl9CisJCS8qIFByZWZlciBob3N0bmFtZSBsb29rdXAgaXMgLWhvc3QgZmxhZyAoeGZsYWc9PTEpIHdhcyBnaXZlbi4gKi8KKwkJaXNuZXQgPSBJTkVUX3Jlc29sdmUodGFyZ2V0LCAoc3RydWN0IHNvY2thZGRyX2luICopICZydC0+cnRfZHN0LAorCQkJCQkJCSAoeGZsYWcgJiBIT1NUX0ZMQUcpKTsKKwkJaWYgKGlzbmV0IDwgMCkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInJlc29sdmluZyAlcyIsIHRhcmdldCk7CisJCX0KKwkJaWYgKHByZWZpeCkgeworCQkJLyogZG8gbm90IGRlc3Ryb3kgcHJlZml4IGZvciBwcm9jZXNzIGFyZ3MgKi8KKwkJCSpwcmVmaXggPSAnLyc7CisJCX0KKwl9CisKKwlpZiAoeGZsYWcpIHsJCS8qIFJlaW5pdCBpc25ldCBpZiAtbmV0IG9yIC1ob3N0IHdhcyBzcGVjaWZpZWQuICovCisJCWlzbmV0ID0gKHhmbGFnICYgTkVUX0ZMQUcpOworCX0KKworCS8qIEZpbGwgaW4gdGhlIG90aGVyIGZpZWxkcy4gKi8KKwlydC0+cnRfZmxhZ3MgPSAoKGlzbmV0KSA/IFJURl9VUCA6IChSVEZfVVAgfCBSVEZfSE9TVCkpOworCisJd2hpbGUgKCphcmdzKSB7CisJCWludCBrID0ga3dfbG9va3VwKHRibF9pcHZ4LCAmYXJncyk7CisJCWNvbnN0IGNoYXIgKmFyZ3NfbTEgPSBhcmdzWy0xXTsKKworCQlpZiAoayAmIEtXX0lQVnhfRkxBR19PTkxZKSB7CisJCQlydC0+cnRfZmxhZ3MgfD0gZmxhZ3NfaXB2eFtrICYgM107CisJCQljb250aW51ZTsKKwkJfQorCisjaWYgSEFWRV9ORVdfQUREUlQKKwkJaWYgKGsgPT0gS1dfSVBWeF9NRVRSSUMpIHsKKwkJCXJ0LT5ydF9tZXRyaWMgPSB4YXRvdWwoYXJnc19tMSkgKyAxOworCQkJY29udGludWU7CisJCX0KKyNlbmRpZgorCisJCWlmIChrID09IEtXX0lQVnhfTkVUTUFTSykgeworCQkJc3RydWN0IHNvY2thZGRyIG1hc2s7CisKKwkJCWlmIChtYXNrX2luX2FkZHIoKnJ0KSkgeworCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCX0KKworCQkJbmV0bWFzayA9IGFyZ3NfbTE7CisJCQlpc25ldCA9IElORVRfcmVzb2x2ZShuZXRtYXNrLCAoc3RydWN0IHNvY2thZGRyX2luICopICZtYXNrLCAwKTsKKwkJCWlmIChpc25ldCA8IDApIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicmVzb2x2aW5nICVzIiwgbmV0bWFzayk7CisJCQl9CisJCQlydC0+cnRfZ2VubWFzayA9IGZ1bGxfbWFzayhtYXNrKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGsgPT0gS1dfSVBWeF9HQVRFV0FZKSB7CisJCQlpZiAocnQtPnJ0X2ZsYWdzICYgUlRGX0dBVEVXQVkpIHsKKwkJCQliYl9zaG93X3VzYWdlKCk7CisJCQl9CisKKwkJCWlzbmV0ID0gSU5FVF9yZXNvbHZlKGFyZ3NfbTEsCisJCQkJCQkoc3RydWN0IHNvY2thZGRyX2luICopICZydC0+cnRfZ2F0ZXdheSwgMSk7CisJCQlydC0+cnRfZmxhZ3MgfD0gUlRGX0dBVEVXQVk7CisKKwkJCWlmIChpc25ldCkgeworCQkJCWlmIChpc25ldCA8IDApIHsKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInJlc29sdmluZyAlcyIsIGFyZ3NfbTEpOworCQkJCX0KKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZ2F0ZXdheSAlcyBpcyBhIE5FVFdPUksiLCBhcmdzX20xKTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGsgPT0gS1dfSVBWeF9NU1MpIHsJLyogQ2hlY2sgdmFsaWQgTVNTIGJvdW5kcy4gKi8KKwkJCXJ0LT5ydF9mbGFncyB8PSBSVEZfTVNTOworCQkJcnQtPnJ0X21zcyA9IHhhdG91bF9yYW5nZShhcmdzX20xLCA2NCwgMzI3NjgpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoayA9PSBLV19JUFZ4X1dJTkRPVykgewkvKiBDaGVjayB2YWxpZCB3aW5kb3cgYm91bmRzLiAqLworCQkJcnQtPnJ0X2ZsYWdzIHw9IFJURl9XSU5ET1c7CisJCQlydC0+cnRfd2luZG93ID0geGF0b3VsX3JhbmdlKGFyZ3NfbTEsIDEyOCwgSU5UX01BWCk7CisJCQljb250aW51ZTsKKwkJfQorCisjaWZkZWYgUlRGX0lSVFQKKwkJaWYgKGsgPT0gS1dfSVBWeF9JUlRUKSB7CisJCQlydC0+cnRfZmxhZ3MgfD0gUlRGX0lSVFQ7CisJCQlydC0+cnRfaXJ0dCA9IHhhdG91bChhcmdzX20xKTsKKwkJCXJ0LT5ydF9pcnR0ICo9IChiYl9jbGtfdGNrKCkgLyAxMDApOwkvKiBGSVhNRSAqLworI2lmIDAJCQkJCS8qIEZJWE1FOiBkbyB3ZSBuZWVkIHRvIGNoZWNrIGFueXRoaW5nIG9mIHRoaXM/ICovCisJCQlpZiAocnQtPnJ0X2lydHQgPCAxIHx8IHJ0LT5ydF9pcnR0ID4gKDEyMCAqIEhaKSkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgaXJ0dCIpOworCQkJfQorI2VuZGlmCisJCQljb250aW51ZTsKKwkJfQorI2VuZGlmCisKKwkJLyogRGV2aWNlIGlzIHNwZWNpYWwgaW4gdGhhdCBpdCBjYW4gYmUgdGhlIGxhc3QgYXJnIHNwZWNpZmllZAorCQkgKiBhbmQgZG9lc24ndCByZXF1cmUgdGhlIGRldi9kZXZpY2Uga2V5d29yZCBpbiB0aGF0IGNhc2UuICovCisJCWlmICghcnQtPnJ0X2RldiAmJiAoKGsgPT0gS1dfSVBWeF9ERVZJQ0UpIHx8ICghayAmJiAhKisrYXJncykpKSB7CisJCQkvKiBEb24ndCB1c2UgYXJnc19tMSBoZXJlIHNpbmNlIGFyZ3MgbWF5IGhhdmUgY2hhbmdlZCEgKi8KKwkJCXJ0LT5ydF9kZXYgPSBhcmdzWy0xXTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogTm90aGluZyBtYXRjaGVkLiAqLworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisjaWZkZWYgUlRGX1JFSkVDVAorCWlmICgocnQtPnJ0X2ZsYWdzICYgUlRGX1JFSkVDVCkgJiYgIXJ0LT5ydF9kZXYpIHsKKwkJcnQtPnJ0X2RldiA9IChjaGFyKikibG8iOworCX0KKyNlbmRpZgorCisJLyogc2FuaXR5IGNoZWNrcy4uICovCisJaWYgKG1hc2tfaW5fYWRkcigqcnQpKSB7CisJCXVpbnQzMl90IG1hc2sgPSBtYXNrX2luX2FkZHIoKnJ0KTsKKworCQltYXNrID0gfm50b2hsKG1hc2spOworCQlpZiAoKHJ0LT5ydF9mbGFncyAmIFJURl9IT1NUKSAmJiBtYXNrICE9IDB4ZmZmZmZmZmYpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJuZXRtYXNrICUuOHggYW5kIGhvc3Qgcm91dGUgY29uZmxpY3QiLAorCQkJCQkJCQkgKHVuc2lnbmVkIGludCkgbWFzayk7CisJCX0KKwkJaWYgKG1hc2sgJiAobWFzayArIDEpKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYm9ndXMgbmV0bWFzayAlcyIsIG5ldG1hc2spOworCQl9CisJCW1hc2sgPSAoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmcnQtPnJ0X2RzdCktPnNpbl9hZGRyLnNfYWRkcjsKKwkJaWYgKG1hc2sgJiB+KHVpbnQzMl90KW1hc2tfaW5fYWRkcigqcnQpKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibmV0bWFzayBhbmQgcm91dGUgYWRkcmVzcyBjb25mbGljdCIpOworCQl9CisJfQorCisJLyogRmlsbCBvdXQgbmV0bWFzayBpZiBzdGlsbCB1bnNldCAqLworCWlmICgoYWN0aW9uID09IFJUQUNUSU9OX0FERCkgJiYgKHJ0LT5ydF9mbGFncyAmIFJURl9IT1NUKSkgeworCQltYXNrX2luX2FkZHIoKnJ0KSA9IDB4ZmZmZmZmZmY7CisJfQorCisJLyogQ3JlYXRlIGEgc29ja2V0IHRvIHRoZSBJTkVUIGtlcm5lbC4gKi8KKwlza2ZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCAwKTsKKworCWlmIChhY3Rpb24gPT0gUlRBQ1RJT05fQUREKQorCQl4aW9jdGwoc2tmZCwgU0lPQ0FERFJULCBydCk7CisJZWxzZQorCQl4aW9jdGwoc2tmZCwgU0lPQ0RFTFJULCBydCk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGNsb3NlKHNrZmQpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBJTkVUNl9zZXRyb3V0ZShpbnQgYWN0aW9uLCBjaGFyICoqYXJncykKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW42IHNhNjsKKwlzdHJ1Y3QgaW42X3J0bXNnIHJ0OworCWludCBwcmVmaXhfbGVuLCBza2ZkOworCWNvbnN0IGNoYXIgKmRldm5hbWU7CisKKwkJLyogV2Uga25vdyBhcmdzIGlzbid0IE5VTEwgZnJvbSB0aGUgY2hlY2sgaW4gcm91dGVfbWFpbi4gKi8KKwkJY29uc3QgY2hhciAqdGFyZ2V0ID0gKmFyZ3MrKzsKKworCQlpZiAoc3RyY21wKHRhcmdldCwgImRlZmF1bHQiKSA9PSAwKSB7CisJCQlwcmVmaXhfbGVuID0gMDsKKwkJCW1lbXNldCgmc2E2LCAwLCBzaXplb2Yoc2E2KSk7CisJCX0gZWxzZSB7CisJCQljaGFyICpjcDsKKwkJCWNwID0gc3RyY2hyKHRhcmdldCwgJy8nKTsgLyogWWVzLi4uIGNvbnN0IHRvIG5vbiBpcyBvay4gKi8KKwkJCWlmIChjcCkgeworCQkJCSpjcCA9ICdcMCc7CisJCQkJcHJlZml4X2xlbiA9IHhhdG91bF9yYW5nZShjcCArIDEsIDAsIDEyOCk7CisJCQl9IGVsc2UgeworCQkJCXByZWZpeF9sZW4gPSAxMjg7CisJCQl9CisJCQlpZiAoSU5FVDZfcmVzb2x2ZSh0YXJnZXQsIChzdHJ1Y3Qgc29ja2FkZHJfaW42ICopICZzYTYpIDwgMCkgeworCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJyZXNvbHZpbmcgJXMiLCB0YXJnZXQpOworCQkJfQorCQl9CisKKwkvKiBDbGVhbiBvdXQgdGhlIFJUUkVRIHN0cnVjdHVyZS4gKi8KKwltZW1zZXQoJnJ0LCAwLCBzaXplb2YocnQpKTsKKworCW1lbWNweSgmcnQucnRtc2dfZHN0LCBzYTYuc2luNl9hZGRyLnM2X2FkZHIsIHNpemVvZihzdHJ1Y3QgaW42X2FkZHIpKTsKKworCS8qIEZpbGwgaW4gdGhlIG90aGVyIGZpZWxkcy4gKi8KKwlydC5ydG1zZ19kc3RfbGVuID0gcHJlZml4X2xlbjsKKwlydC5ydG1zZ19mbGFncyA9ICgocHJlZml4X2xlbiA9PSAxMjgpID8gKFJURl9VUHxSVEZfSE9TVCkgOiBSVEZfVVApOworCXJ0LnJ0bXNnX21ldHJpYyA9IDE7CisKKwlkZXZuYW1lID0gTlVMTDsKKworCXdoaWxlICgqYXJncykgeworCQlpbnQgayA9IGt3X2xvb2t1cCh0YmxfaXB2eCwgJmFyZ3MpOworCQljb25zdCBjaGFyICphcmdzX20xID0gYXJnc1stMV07CisKKwkJaWYgKChrID09IEtXX0lQVnhfTU9EKSB8fCAoayA9PSBLV19JUFZ4X0RZTikpIHsKKwkJCXJ0LnJ0bXNnX2ZsYWdzIHw9IGZsYWdzX2lwdnhbayAmIDNdOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoayA9PSBLV19JUFZ4X01FVFJJQykgeworCQkJcnQucnRtc2dfbWV0cmljID0geGF0b3VsKGFyZ3NfbTEpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoayA9PSBLV19JUFZ4X0dBVEVXQVkpIHsKKwkJCWlmIChydC5ydG1zZ19mbGFncyAmIFJURl9HQVRFV0FZKSB7CisJCQkJYmJfc2hvd191c2FnZSgpOworCQkJfQorCisJCQlpZiAoSU5FVDZfcmVzb2x2ZShhcmdzX20xLCAoc3RydWN0IHNvY2thZGRyX2luNiAqKSAmc2E2KSA8IDApIHsKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicmVzb2x2aW5nICVzIiwgYXJnc19tMSk7CisJCQl9CisJCQltZW1jcHkoJnJ0LnJ0bXNnX2dhdGV3YXksIHNhNi5zaW42X2FkZHIuczZfYWRkciwKKwkJCQkJc2l6ZW9mKHN0cnVjdCBpbjZfYWRkcikpOworCQkJcnQucnRtc2dfZmxhZ3MgfD0gUlRGX0dBVEVXQVk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIERldmljZSBpcyBzcGVjaWFsIGluIHRoYXQgaXQgY2FuIGJlIHRoZSBsYXN0IGFyZyBzcGVjaWZpZWQKKwkJICogYW5kIGRvZXNuJ3QgcmVxdXJlIHRoZSBkZXYvZGV2aWNlIGtleXdvcmQgaW4gdGhhdCBjYXNlLiAqLworCQlpZiAoIWRldm5hbWUgJiYgKChrID09IEtXX0lQVnhfREVWSUNFKSB8fCAoIWsgJiYgISorK2FyZ3MpKSkgeworCQkJLyogRG9uJ3QgdXNlIGFyZ3NfbTEgaGVyZSBzaW5jZSBhcmdzIG1heSBoYXZlIGNoYW5nZWQhICovCisJCQlkZXZuYW1lID0gYXJnc1stMV07CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIE5vdGhpbmcgbWF0Y2hlZC4gKi8KKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCS8qIENyZWF0ZSBhIHNvY2tldCB0byB0aGUgSU5FVDYga2VybmVsLiAqLworCXNrZmQgPSB4c29ja2V0KEFGX0lORVQ2LCBTT0NLX0RHUkFNLCAwKTsKKworCXJ0LnJ0bXNnX2lmaW5kZXggPSAwOworCisJaWYgKGRldm5hbWUpIHsKKwkJc3RydWN0IGlmcmVxIGlmcjsKKwkJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKwkJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIGRldm5hbWUpOworCQl4aW9jdGwoc2tmZCwgU0lPQ0dJRklOREVYLCAmaWZyKTsKKwkJcnQucnRtc2dfaWZpbmRleCA9IGlmci5pZnJfaWZpbmRleDsKKwl9CisKKwkvKiBUZWxsIHRoZSBrZXJuZWwgdG8gYWNjZXB0IHRoaXMgcm91dGUuICovCisJaWYgKGFjdGlvbiA9PSBSVEFDVElPTl9BREQpCisJCXhpb2N0bChza2ZkLCBTSU9DQUREUlQsICZydCk7CisJZWxzZQorCQl4aW9jdGwoc2tmZCwgU0lPQ0RFTFJULCAmcnQpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBjbG9zZShza2ZkKTsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3QKK0lGX05PVF9GRUFUVVJFX0lQVjYodWludDE2X3QpCitJRl9GRUFUVVJFX0lQVjYodW5zaWduZWQpCitmbGFndmFsc1tdID0geyAvKiBNdXN0IGFncmVlIHdpdGggZmxhZ2NoYXJzW10uICovCisJUlRGX1VQLAorCVJURl9HQVRFV0FZLAorCVJURl9IT1NULAorCVJURl9SRUlOU1RBVEUsCisJUlRGX0RZTkFNSUMsCisJUlRGX01PRElGSUVELAorI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwlSVEZfREVGQVVMVCwKKwlSVEZfQUREUkNPTkYsCisJUlRGX0NBQ0hFLAorCVJURl9SRUpFQ1QsCisJUlRGX05PTkVYVEhPUCwgLyogdGhpcyBvbmUgZG9lc24ndCBmaXQgaW50byAxNiBiaXRzICovCisjZW5kaWYKK307CisvKiBNdXN0IGFncmVlIHdpdGggZmxhZ3ZhbHNbXS4gKi8KK3N0YXRpYyBjb25zdCBjaGFyIGZsYWdjaGFyc1tdIEFMSUdOMSA9CisJIlVHSFJETSIKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUFY2CisJIkRBQyFuIgorI2VuZGlmCis7CisjZGVmaW5lIElQVjRfTUFTSyAoUlRGX1VQfFJURl9HQVRFV0FZfFJURl9IT1NUfFJURl9SRUlOU1RBVEV8UlRGX0RZTkFNSUN8UlRGX01PRElGSUVEKQorI2RlZmluZSBJUFY2X01BU0sgKFJURl9VUHxSVEZfR0FURVdBWXxSVEZfSE9TVHxSVEZfREVGQVVMVHxSVEZfQUREUkNPTkZ8UlRGX0NBQ0hFfFJURl9SRUpFQ1R8UlRGX05PTkVYVEhPUCkKKworc3RhdGljIHZvaWQgc2V0X2ZsYWdzKGNoYXIgKmZsYWdzdHIsIGludCBmbGFncykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7ICgqZmxhZ3N0ciA9IGZsYWdjaGFyc1tpXSkgIT0gMDsgaSsrKSB7CisJCWlmIChmbGFncyAmIGZsYWd2YWxzW2ldKSB7CisJCQkrK2ZsYWdzdHI7CisJCX0KKwl9Cit9CisKKy8qIGFsc28gdXNlZCBpbiBuZXRzdGF0ICovCit2b2lkIEZBU1RfRlVOQyBiYl9kaXNwbGF5cm91dGVzKGludCBub3Jlc29sdmUsIGludCBuZXRzdGF0Zm10KQoreworCWNoYXIgZGV2bmFtZVs2NF0sIGZsYWdzWzE2XSwgKnNkZXN0LCAqc2d3OworCXVuc2lnbmVkIGxvbmcgZCwgZywgbTsKKwlpbnQgcjsKKwlpbnQgZmxncywgcmVmLCB1c2UsIG1ldHJpYywgbXR1LCB3aW4sIGlyOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzX2FkZHI7CisJc3RydWN0IGluX2FkZHIgbWFzazsKKworCUZJTEUgKmZwID0geGZvcGVuX2Zvcl9yZWFkKCIvcHJvYy9uZXQvcm91dGUiKTsKKworCXByaW50ZigiS2VybmVsIElQIHJvdXRpbmcgdGFibGVcbiIKKwkJIkRlc3RpbmF0aW9uICAgICBHYXRld2F5ICAgICAgICAgR2VubWFzayAgICAgICAgIEZsYWdzICVzIElmYWNlXG4iLAorCQkJbmV0c3RhdGZtdCA/ICIgIE1TUyBXaW5kb3cgIGlydHQiIDogIk1ldHJpYyBSZWYgICAgVXNlIik7CisKKwkvKiBTa2lwIHRoZSBmaXJzdCBsaW5lLiAqLworCXIgPSBmc2NhbmYoZnAsICIlKlteXG5dXG4iKTsKKwlpZiAociA8IDApIHsKKwkJLyogRW1wdHkgbGluZSwgcmVhZCBlcnJvciwgb3IgRU9GLiBZZXMsIGlmIHJvdXRpbmcgdGFibGUKKwkJICogaXMgY29tcGxldGVseSBlbXB0eSwgL3Byb2MvbmV0L3JvdXRlIGhhcyBubyBoZWFkZXIuCisJCSAqLworCQlnb3RvIEVSUk9SOworCX0KKwl3aGlsZSAoMSkgeworCQlyID0gZnNjYW5mKGZwLCAiJTYzcyVseCVseCVYJWQlZCVkJWx4JWQlZCVkXG4iLAorCQkJCWRldm5hbWUsICZkLCAmZywgJmZsZ3MsICZyZWYsICZ1c2UsICZtZXRyaWMsICZtLAorCQkJCSZtdHUsICZ3aW4sICZpcik7CisJCWlmIChyICE9IDExKSB7CisgRVJST1I6CisJCQlpZiAoKHIgPCAwKSAmJiBmZW9mKGZwKSkgeyAvKiBFT0Ygd2l0aCBubyAobm9uc3BhY2UpIGNoYXJzIHJlYWQuICovCisJCQkJYnJlYWs7CisJCQl9CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3JlYWRfZXJyb3IpOworCQl9CisKKwkJaWYgKCEoZmxncyAmIFJURl9VUCkpIHsgLyogU2tpcCBpbnRlcmZhY2VzIHRoYXQgYXJlIGRvd24uICovCisJCQljb250aW51ZTsKKwkJfQorCisJCXNldF9mbGFncyhmbGFncywgKGZsZ3MgJiBJUFY0X01BU0spKTsKKyNpZmRlZiBSVEZfUkVKRUNUCisJCWlmIChmbGdzICYgUlRGX1JFSkVDVCkgeworCQkJZmxhZ3NbMF0gPSAnISc7CisJCX0KKyNlbmRpZgorCisJCW1lbXNldCgmc19hZGRyLCAwLCBzaXplb2Yoc3RydWN0IHNvY2thZGRyX2luKSk7CisJCXNfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJc19hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGQ7CisJCXNkZXN0ID0gSU5FVF9ycmVzb2x2ZSgmc19hZGRyLCAobm9yZXNvbHZlIHwgMHg4MDAwKSwgbSk7IC8qICdkZWZhdWx0JyBpbnN0ZWFkIG9mICcqJyAqLworCQlzX2FkZHIuc2luX2FkZHIuc19hZGRyID0gZzsKKwkJc2d3ID0gSU5FVF9ycmVzb2x2ZSgmc19hZGRyLCAobm9yZXNvbHZlIHwgMHg0MDAwKSwgbSk7IC8qIEhvc3QgaW5zdGVhZCBvZiBuZXQgKi8KKwkJbWFzay5zX2FkZHIgPSBtOworCQkvKiAiJTE1LjE1cyIgdHJ1bmNhdGVzIGhvc3RuYW1lcywgZG8gd2UgcmVhbGx5IHdhbnQgdGhhdD8gKi8KKwkJcHJpbnRmKCIlLTE1LjE1cyAlLTE1LjE1cyAlLTE2cyUtNnMiLCBzZGVzdCwgc2d3LCBpbmV0X250b2EobWFzayksIGZsYWdzKTsKKwkJZnJlZShzZGVzdCk7CisJCWZyZWUoc2d3KTsKKwkJaWYgKG5ldHN0YXRmbXQpIHsKKwkJCXByaW50ZigiJTVkICUtNWQgJTZkICVzXG4iLCBtdHUsIHdpbiwgaXIsIGRldm5hbWUpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCIlLTZkICUtMmQgJTdkICVzXG4iLCBtZXRyaWMsIHJlZiwgdXNlLCBkZXZuYW1lKTsKKwkJfQorCX0KKwlmY2xvc2UoZnApOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCitzdGF0aWMgdm9pZCBJTkVUNl9kaXNwbGF5cm91dGVzKHZvaWQpCit7CisJY2hhciBhZGRyNlsxMjhdLCAqbmFkZHI2OworCS8qIEluIGFkZHI2eCwgd2Ugc3RvcmUgYm90aCA0MC1ieXRlICc6Jy1kZWxpbWl0ZWQgaXB2NiBhZGRyZXNzZXMuCisJICogV2UgcmVhZCB0aGUgbm9uLWRlbGltaXRlZCBzdHJpbmdzIGludG8gdGhlIHRhaWwgb2YgdGhlIGJ1ZmZlcgorCSAqIHVzaW5nIGZzY2FuZiBhbmQgdGhlbiBtb2RpZnkgdGhlIGJ1ZmZlciBieSBzaGlmdGluZyBmb3J3YXJkCisJICogd2hpbGUgaW5zZXJ0aW5nICc6J3MgYW5kIHRoZSBudWwgdGVybWluYXRvciBmb3IgdGhlIGZpcnN0IHN0cmluZy4KKwkgKiBIZW5jZSB0aGUgc3RyaW5ncyBhcmUgYXQgYWRkcjZ4IGFuZCBhZGRyNngrNDAuICBUaGlzIGdlbmVyYXRlcworCSAqIF9tdWNoXyBsZXNzIGNvZGUgdGhhbiB0aGUgcHJldmlvdXMgKHVwc3RyZWFtKSBhcHByb2FjaC4gKi8KKwljaGFyIGFkZHI2eFs4MF07CisJY2hhciBpZmFjZVsxNl0sIGZsYWdzWzE2XTsKKwlpbnQgaWZsYWdzLCBtZXRyaWMsIHJlZmNudCwgdXNlLCBwcmVmaXhfbGVuLCBzbGVuOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgc25hZGRyNjsKKworCUZJTEUgKmZwID0geGZvcGVuX2Zvcl9yZWFkKCIvcHJvYy9uZXQvaXB2Nl9yb3V0ZSIpOworCisJcHJpbnRmKCJLZXJuZWwgSVB2NiByb3V0aW5nIHRhYmxlXG4lLTQ0cyUtNDBzIgorCQkJIkZsYWdzIE1ldHJpYyBSZWYgICAgVXNlIElmYWNlXG4iLAorCQkJIkRlc3RpbmF0aW9uIiwgIk5leHQgSG9wIik7CisKKwl3aGlsZSAoMSkgeworCQlpbnQgcjsKKwkJciA9IGZzY2FuZihmcCwgIiUzMnMleCUqcyV4JTMycyV4JXgleCV4JXNcbiIsCisJCQkJYWRkcjZ4KzE0LCAmcHJlZml4X2xlbiwgJnNsZW4sIGFkZHI2eCs0MCs3LAorCQkJCSZtZXRyaWMsICZyZWZjbnQsICZ1c2UsICZpZmxhZ3MsIGlmYWNlKTsKKwkJaWYgKHIgIT0gOSkgeworCQkJaWYgKChyIDwgMCkgJiYgZmVvZihmcCkpIHsgLyogRU9GIHdpdGggbm8gKG5vbnNwYWNlKSBjaGFycyByZWFkLiAqLworCQkJCWJyZWFrOworCQkJfQorIEVSUk9SOgorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZWFkX2Vycm9yKTsKKwkJfQorCisJCS8qIERvIHRoZSBhZGRyNnggc2hpZnQtYW5kLWluc2VydCBjaGFuZ2VzIHRvICc6Jy1kZWxpbWl0IGFkZHJlc3Nlcy4KKwkJICogRm9yIG5vdywgYWx3YXlzIGRvIHRoaXMgdG8gdmFsaWRhdGUgdGhlIHByb2Mgcm91dGUgZm9ybWF0LCBldmVuCisJCSAqIGlmIHRoZSBpbnRlcmZhY2UgaXMgZG93bi4gKi8KKwkJeworCQkJaW50IGkgPSAwOworCQkJY2hhciAqcCA9IGFkZHI2eCsxNDsKKworCQkJZG8geworCQkJCWlmICghKnApIHsKKwkJCQkJaWYgKGkgPT0gNDApIHsgLyogbnVsIHRlcm1pbmF0b3IgZm9yIDFzdCBhZGRyZXNzPyAqLworCQkJCQkJYWRkcjZ4WzM5XSA9IDA7CS8qIEZpeHVwLi4uIG5lZWQgMCBpbnN0ZWFkIG9mICc6Jy4gKi8KKwkJCQkJCSsrcDsJLyogU2tpcCBhbmQgY29udGludWUuICovCisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQlnb3RvIEVSUk9SOworCQkJCX0KKwkJCQlhZGRyNnhbaSsrXSA9ICpwKys7CisJCQkJaWYgKCEoKGkrMSkgJSA1KSkgeworCQkJCQlhZGRyNnhbaSsrXSA9ICc6JzsKKwkJCQl9CisJCQl9IHdoaWxlIChpIDwgNDArMjgrNyk7CisJCX0KKworCQlzZXRfZmxhZ3MoZmxhZ3MsIChpZmxhZ3MgJiBJUFY2X01BU0spKTsKKworCQlyID0gMDsKKwkJd2hpbGUgKDEpIHsKKwkJCWluZXRfcHRvbihBRl9JTkVUNiwgYWRkcjZ4ICsgciwKKwkJCQkJICAoc3RydWN0IHNvY2thZGRyICopICZzbmFkZHI2LnNpbjZfYWRkcik7CisJCQlzbmFkZHI2LnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJCQluYWRkcjYgPSBJTkVUNl9ycmVzb2x2ZSgoc3RydWN0IHNvY2thZGRyX2luNiAqKSAmc25hZGRyNiwKKwkJCQkJCTB4MGZmZiAvKiBBcHBhcmVudGx5LCB1cHN0cmVhbSBuZXZlciByZXNvbHZlcy4gKi8KKwkJCQkJCSk7CisKKwkJCWlmICghcikgewkJCS8qIDFzdCBwYXNzICovCisJCQkJc25wcmludGYoYWRkcjYsIHNpemVvZihhZGRyNiksICIlcy8lZCIsIG5hZGRyNiwgcHJlZml4X2xlbik7CisJCQkJciArPSA0MDsKKwkJCQlmcmVlKG5hZGRyNik7CisJCQl9IGVsc2UgewkJCS8qIDJuZCBwYXNzICovCisJCQkJLyogUHJpbnQgdGhlIGluZm8uICovCisJCQkJcHJpbnRmKCIlLTQzcyAlLTM5cyAlLTVzICUtNmQgJS0yZCAlN2QgJS04c1xuIiwKKwkJCQkJCWFkZHI2LCBuYWRkcjYsIGZsYWdzLCBtZXRyaWMsIHJlZmNudCwgdXNlLCBpZmFjZSk7CisJCQkJZnJlZShuYWRkcjYpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWZjbG9zZShmcCk7Cit9CisKKyNlbmRpZgorCisjZGVmaW5lIFJPVVRFX09QVF9BICAgICAweDAxCisjZGVmaW5lIFJPVVRFX09QVF9uICAgICAweDAyCisjZGVmaW5lIFJPVVRFX09QVF9lICAgICAweDA0CisjZGVmaW5lIFJPVVRFX09QVF9JTkVUNiAweDA4IC8qIE5vdCBhbiBhY3R1YWwgb3B0aW9uLiBTZWUgYmVsb3cuICovCisKKy8qIDFzdCBieXRlIGlzIG9mZnNldCB0byBuZXh0IGVudHJ5IG9mZnNldC4gIDJuZCBieXRlIGlzIHJldHVybiB2YWx1ZS4gKi8KKy8qIDJuZCBieXRlIG1hdGNoZXMgUlRBQ1RJT05fKiBjb2RlICovCitzdGF0aWMgY29uc3QgY2hhciB0YmxfdmVyYltdIEFMSUdOMSA9CisJIlwwMDZcMDAxYWRkXDAiCisJIlwwMDZcMDAyZGVsXDAiCisvKgkiXDAxMVwwMDJkZWxldGVcMCIgKi8KKwkiXDAxMFwwMDJkZWxldGUiICAvKiBTaW5jZSBpdCdzIGxhc3QsIHdlIGNhbiBzYXZlIGEgYnl0ZS4gKi8KKzsKKworaW50IHJvdXRlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCByb3V0ZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0OworCWludCB3aGF0OworCWNoYXIgKmZhbWlseTsKKwljaGFyICoqcDsKKworCS8qIEZpcnN0LCByZW1hcCAnLW5ldCcgYW5kICctaG9zdCcgdG8gYXZvaWQgZ2V0b3B0IHByb2JsZW1zLiAqLworCXAgPSBhcmd2OworCXdoaWxlICgqKytwKSB7CisJCWlmIChzdHJjbXAoKnAsICItbmV0IikgPT0gMCB8fCBzdHJjbXAoKnAsICItaG9zdCIpID09IDApIHsKKwkJCXBbMF1bMF0gPSAnIyc7CisJCX0KKwl9CisKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiQTpuZSIsICZmYW1pbHkpOworCisJaWYgKChvcHQgJiBST1VURV9PUFRfQSkgJiYgc3RyY21wKGZhbWlseSwgImluZXQiKSAhPSAwKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCQlpZiAoc3RyY21wKGZhbWlseSwgImluZXQ2IikgPT0gMCkgeworCQkJb3B0IHw9IFJPVVRFX09QVF9JTkVUNjsJLyogU2V0IGZsYWcgZm9yIGlwdjYuICovCisJCX0gZWxzZQorI2VuZGlmCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwlhcmd2ICs9IG9wdGluZDsKKworCS8qIE5vIG1vcmUgYXJncyBtZWFucyBkaXNwbGF5IHRoZSByb3V0aW5nIHRhYmxlLiAqLworCWlmICghKmFyZ3YpIHsKKwkJaW50IG5vcmVzb2x2ZSA9IChvcHQgJiBST1VURV9PUFRfbikgPyAweDBmZmYgOiAwOworI2lmIEVOQUJMRV9GRUFUVVJFX0lQVjYKKwkJaWYgKG9wdCAmIFJPVVRFX09QVF9JTkVUNikKKwkJCUlORVQ2X2Rpc3BsYXlyb3V0ZXMoKTsKKwkJZWxzZQorI2VuZGlmCisJCQliYl9kaXNwbGF5cm91dGVzKG5vcmVzb2x2ZSwgb3B0ICYgUk9VVEVfT1BUX2UpOworCisJCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKKwl9CisKKwkvKiBDaGVjayB2ZXJiLiAgQXQgdGhlIG1vbWVudCwgbXVzdCBiZSBhZGQsIGRlbCwgb3IgZGVsZXRlLiAqLworCXdoYXQgPSBrd19sb29rdXAodGJsX3ZlcmIsICZhcmd2KTsKKwlpZiAoIXdoYXQgfHwgISphcmd2KSB7CQkvKiBVbmtub3duIHZlcmIgb3Igbm8gbW9yZSBhcmdzLiAqLworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCWlmIChvcHQgJiBST1VURV9PUFRfSU5FVDYpCisJCUlORVQ2X3NldHJvdXRlKHdoYXQsIGFyZ3YpOworCWVsc2UKKyNlbmRpZgorCQlJTkVUX3NldHJvdXRlKHdoYXQsIGFyZ3YpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvc2xhdHRhY2guYyBiL25ldHdvcmtpbmcvc2xhdHRhY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTAwZGE2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9zbGF0dGFjaC5jCkBAIC0wLDAgKzEsMjU4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBTdHJpcHBlZCBkb3duIHZlcnNpb24gb2YgbmV0LXRvb2xzIGZvciBidXN5Ym94LgorICoKKyAqIEF1dGhvcjogSWduYWNpbyBHYXJjaWEgUGVyZXogKGlnZ2FycGUgYXQgZ21haWwgZG90IGNvbSkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIFRoZXJlIGFyZSBzb21lIGRpZmZlcmVuY2VzIGZyb20gdGhlIHN0YW5kYXJkIG5ldC10b29scyBzbGF0dGFjaDoKKyAqCisgKiAtIFRoZSAtbCBvcHRpb24gaXMgbm90IHN1cHBvcnRlZC4KKyAqCisgKiAtIFRoZSAtRiBvcHRpb25zIGFsbG93cyBkaXNhYmxpbmcgb2YgUlRTL0NUUyBmbG93IGNvbnRyb2wuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHNsYXR0YWNoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWNlaG1MRl0gWy1zIFNQRUVEXSBbLXAgUFJPVE9DT0xdIERFVklDRSIKKy8vdXNhZ2U6I2RlZmluZSBzbGF0dGFjaF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkF0dGFjaCBuZXR3b3JrIGludGVyZmFjZShzKSB0byBzZXJpYWwgbGluZShzKVxuIgorLy91c2FnZTogICAgICJcbgktcCBQUk9UCVNldCBwcm90b2NvbCAoc2xpcCwgY3NsaXAsIHNsaXA2LCBjbGlzcDYgb3IgYWRhcHRpdmUpIgorLy91c2FnZTogICAgICJcbgktcyBTUEQJU2V0IGxpbmUgc3BlZWQiCisvL3VzYWdlOiAgICAgIlxuCS1lCUV4aXQgYWZ0ZXIgaW5pdGlhbGl6aW5nIGRldmljZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWgJRXhpdCB3aGVuIHRoZSBjYXJyaWVyIGlzIGxvc3QiCisvL3VzYWdlOiAgICAgIlxuCS1jIFBST0cJUnVuIFBST0cgd2hlbiB0aGUgbGluZSBpcyBodW5nIHVwIgorLy91c2FnZTogICAgICJcbgktbQlEbyBOT1QgaW5pdGlhbGl6ZSB0aGUgbGluZSBpbiByYXcgOCBiaXRzIG1vZGUiCisvL3VzYWdlOiAgICAgIlxuCS1MCUVuYWJsZSAzLXdpcmUgb3BlcmF0aW9uIgorLy91c2FnZTogICAgICJcbgktRglEaXNhYmxlIFJUUy9DVFMgZmxvdyBjb250cm9sIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJsaWJpcHJvdXRlL3V0aWxzLmgiIC8qIGludmFyZygpICovCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlpbnQgaGFuZGxlOworCWludCBzYXZlZF9kaXNjOworCXN0cnVjdCB0ZXJtaW9zIHNhdmVkX3N0YXRlOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgaGFuZGxlICAgICAgIChHLmhhbmRsZSAgICAgICkKKyNkZWZpbmUgc2F2ZWRfZGlzYyAgIChHLnNhdmVkX2Rpc2MgICkKKyNkZWZpbmUgc2F2ZWRfc3RhdGUgIChHLnNhdmVkX3N0YXRlICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyB9IHdoaWxlICgwKQorCisKKy8qCisgKiBTYXZlIHR0eSBzdGF0ZSBhbmQgbGluZSBkaXNjaXBsaW5lCisgKgorICogSXQgaXMgZmluZSBoZXJlIHRvIGJhaWwgb3V0IG9uIGVycm9ycywgc2luY2Ugd2UgaGF2ZW4gbW9kaWZpZWQgYW55dGhpbmcgeWV0CisgKi8KK3N0YXRpYyB2b2lkIHNhdmVfc3RhdGUodm9pZCkKK3sKKwkvKiBTYXZlIGxpbmUgc3RhdHVzICovCisJaWYgKHRjZ2V0YXR0cihoYW5kbGUsICZzYXZlZF9zdGF0ZSkgPCAwKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImdldCBzdGF0ZSIpOworCisJLyogU2F2ZSBsaW5lIGRpc2NpcGxpbmUgKi8KKwl4aW9jdGwoaGFuZGxlLCBUSU9DR0VURCwgJnNhdmVkX2Rpc2MpOworfQorCitzdGF0aWMgaW50IHNldF90ZXJtaW9zX3N0YXRlX29yX3dhcm4oc3RydWN0IHRlcm1pb3MgKnN0YXRlKQoreworCWludCByZXQ7CisKKwlyZXQgPSB0Y3NldGF0dHIoaGFuZGxlLCBUQ1NBTk9XLCBzdGF0ZSk7CisJaWYgKHJldCA8IDApIHsKKwkJYmJfcGVycm9yX21zZygic2V0IHN0YXRlIik7CisJCXJldHVybiAxOyAvKiB1c2VkIGFzIGV4aXRjb2RlICovCisJfQorCXJldHVybiAwOworfQorCisvKgorICogUmVzdG9yZSBzdGF0ZSBhbmQgbGluZSBkaXNjaXBsaW5lIGZvciBBTEwgbWFuYWdlZCB0dHlzCisgKgorICogUmVzdG9yaW5nIEFMTCBtYW5hZ2VkIHR0eXMgaXMgdGhlIG9ubHkgd2F5IHRvIGhhdmUgYSBzaW5nbGUKKyAqIGhhbmd1cCBkZWxheS4KKyAqCisgKiBHbyBvbiBhZnRlciBlcnJvcnM6IHdlIHdhbnQgdG8gcmVzdG9yZSBhcyBtYW55IGNvbnRyb2xsZWQgdHR5cworICogYXMgcG9zc2libGUuCisgKi8KK3N0YXRpYyB2b2lkIHJlc3RvcmVfc3RhdGVfYW5kX2V4aXQoaW50IGV4aXRjb2RlKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIHJlc3RvcmVfc3RhdGVfYW5kX2V4aXQoaW50IGV4aXRjb2RlKQoreworCXN0cnVjdCB0ZXJtaW9zIHN0YXRlOworCisJLyogUmVzdG9yZSBsaW5lIGRpc2NpcGxpbmUgKi8KKwlpZiAoaW9jdGxfb3Jfd2FybihoYW5kbGUsIFRJT0NTRVRELCAmc2F2ZWRfZGlzYykgPCAwKSB7CisJCWV4aXRjb2RlID0gMTsKKwl9CisKKwkvKiBIYW5ndXAgKi8KKwltZW1jcHkoJnN0YXRlLCAmc2F2ZWRfc3RhdGUsIHNpemVvZihzdGF0ZSkpOworCWNmc2V0aXNwZWVkKCZzdGF0ZSwgQjApOworCWNmc2V0b3NwZWVkKCZzdGF0ZSwgQjApOworCWlmIChzZXRfdGVybWlvc19zdGF0ZV9vcl93YXJuKCZzdGF0ZSkpCisJCWV4aXRjb2RlID0gMTsKKwlzbGVlcCgxKTsKKworCS8qIFJlc3RvcmUgbGluZSBzdGF0dXMgKi8KKwlpZiAoc2V0X3Rlcm1pb3Nfc3RhdGVfb3Jfd2Fybigmc2F2ZWRfc3RhdGUpKQorCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShoYW5kbGUpOworCisJZXhpdChleGl0Y29kZSk7Cit9CisKKy8qCisgKiBTZXQgdHR5IHN0YXRlLCBsaW5lIGRpc2NpcGxpbmUgYW5kIGVuY2Fwc3VsYXRpb24KKyAqLworc3RhdGljIHZvaWQgc2V0X3N0YXRlKHN0cnVjdCB0ZXJtaW9zICpzdGF0ZSwgaW50IGVuY2FwKQoreworCWludCBkaXNjOworCisJLyogU2V0IGxpbmUgc3RhdHVzICovCisJaWYgKHNldF90ZXJtaW9zX3N0YXRlX29yX3dhcm4oc3RhdGUpKQorCQlnb3RvIGJhZDsKKwkvKiBTZXQgbGluZSBkaXNjbGlwbGUgKE5fU0xJUCBhbHdheXMpICovCisJZGlzYyA9IE5fU0xJUDsKKwlpZiAoaW9jdGxfb3Jfd2FybihoYW5kbGUsIFRJT0NTRVRELCAmZGlzYykgPCAwKSB7CisJCWdvdG8gYmFkOworCX0KKworCS8qIFNldCBlbmNhcHN1bGF0aW9uIChTTElQLCBDU0xJUCwgZXRjKSAqLworCWlmIChpb2N0bF9vcl93YXJuKGhhbmRsZSwgU0lPQ1NJRkVOQ0FQLCAmZW5jYXApIDwgMCkgeworIGJhZDoKKwkJcmVzdG9yZV9zdGF0ZV9hbmRfZXhpdChFWElUX0ZBSUxVUkUpOworCX0KK30KKworc3RhdGljIHZvaWQgc2lnX2hhbmRsZXIoaW50IHNpZ25vIFVOVVNFRF9QQVJBTSkKK3sKKwlyZXN0b3JlX3N0YXRlX2FuZF9leGl0KEVYSVRfU1VDQ0VTUyk7Cit9CisKK2ludCBzbGF0dGFjaF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc2xhdHRhY2hfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCS8qIExpbmUgZGlzY2lwbGluZSBjb2RlIHRhYmxlICovCisJc3RhdGljIGNvbnN0IGNoYXIgcHJvdG9fbmFtZXNbXSBBTElHTjEgPQorCQkic2xpcFwwIiAgICAgICAgLyogMCAqLworCQkiY3NsaXBcMCIgICAgICAgLyogMSAqLworCQkic2xpcDZcMCIgICAgICAgLyogMiAqLworCQkiY3NsaXA2XDAiICAgICAgLyogMyAqLworCQkiYWRhcHRpdmVcMCIgICAgLyogOCAqLworCQk7CisKKwlpbnQgaSwgZW5jYXAsIG9wdDsKKwlzdHJ1Y3QgdGVybWlvcyBzdGF0ZTsKKwljb25zdCBjaGFyICpwcm90byA9ICJjc2xpcCI7CisJY29uc3QgY2hhciAqZXh0Y21kOyAgIC8qIENvbW1hbmQgdG8gZXhlY3V0ZSBhZnRlciBoYW5ndXAgKi8KKwljb25zdCBjaGFyICpiYXVkX3N0cjsKKwlpbnQgYmF1ZF9jb2RlID0gLTE7ICAgLyogTGluZSBiYXVkIHJhdGUgKHN5c3RlbSBjb2RlKSAqLworCisJZW51bSB7CisJCU9QVF9wX3Byb3RvICA9IDEgPDwgMCwKKwkJT1BUX3NfYmF1ZCAgID0gMSA8PCAxLAorCQlPUFRfY19leHRjbWQgPSAxIDw8IDIsCisJCU9QVF9lX3F1aXQgICA9IDEgPDwgMywKKwkJT1BUX2hfd2F0Y2ggID0gMSA8PCA0LAorCQlPUFRfbV9ub25yYXcgPSAxIDw8IDUsCisJCU9QVF9MX2xvY2FsICA9IDEgPDwgNiwKKwkJT1BUX0Zfbm9mbG93ID0gMSA8PCA3CisJfTsKKworCUlOSVRfRygpOworCisJLyogUGFyc2UgY29tbWFuZCBsaW5lIG9wdGlvbnMgKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAicDpzOmM6ZWhtTEYiLCAmcHJvdG8sICZiYXVkX3N0ciwgJmV4dGNtZCk7CisJLyphcmdjIC09IG9wdGluZDsqLworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKCEqYXJndikKKwkJYmJfc2hvd191c2FnZSgpOworCisJZW5jYXAgPSBpbmRleF9pbl9zdHJpbmdzKHByb3RvX25hbWVzLCBwcm90byk7CisKKwlpZiAoZW5jYXAgPCAwKQorCQlpbnZhcmcocHJvdG8sICJwcm90b2NvbCIpOworCWlmIChlbmNhcCA+IDMpCisJCWVuY2FwID0gODsKKworCS8qIFdlIHdhbnQgdG8ga25vdyBpZiB0aGUgYmF1ZCByYXRlIGlzIHZhbGlkIGJlZm9yZSB3ZSBzdGFydCB0b3VjaGluZyB0aGUgdHR5cyAqLworCWlmIChvcHQgJiBPUFRfc19iYXVkKSB7CisJCWJhdWRfY29kZSA9IHR0eV92YWx1ZV90b19iYXVkKHhhdG9pKGJhdWRfc3RyKSk7CisJCWlmIChiYXVkX2NvZGUgPCAwKQorCQkJaW52YXJnKGJhdWRfc3RyLCAiYmF1ZCByYXRlIik7CisJfQorCisJLyogVHJhcCBzaWduYWxzIGluIG9yZGVyIHRvIHJlc3RvcmUgdHR5IHN0YXRlcyB1cG9uIGV4aXQgKi8KKwlpZiAoIShvcHQgJiBPUFRfZV9xdWl0KSkgeworCQliYl9zaWduYWxzKDAKKwkJCSsgKDEgPDwgU0lHSFVQKQorCQkJKyAoMSA8PCBTSUdJTlQpCisJCQkrICgxIDw8IFNJR1FVSVQpCisJCQkrICgxIDw8IFNJR1RFUk0pCisJCQksIHNpZ19oYW5kbGVyKTsKKwl9CisKKwkvKiBPcGVuIHR0eSAqLworCWhhbmRsZSA9IG9wZW4oKmFyZ3YsIE9fUkRXUiB8IE9fTkRFTEFZKTsKKwlpZiAoaGFuZGxlIDwgMCkgeworCQljaGFyICpidWYgPSBjb25jYXRfcGF0aF9maWxlKCIvZGV2IiwgKmFyZ3YpOworCQloYW5kbGUgPSB4b3BlbihidWYsIE9fUkRXUiB8IE9fTkRFTEFZKTsKKwkJLyogbWF5YmUgaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSA/PyAqLworCQlmcmVlKGJ1Zik7CisJfQorCisJLyogU2F2ZSBjdXJyZW50IHR0eSBzdGF0ZSAqLworCXNhdmVfc3RhdGUoKTsKKworCS8qIENvbmZpZ3VyZSB0dHkgKi8KKwltZW1jcHkoJnN0YXRlLCAmc2F2ZWRfc3RhdGUsIHNpemVvZihzdGF0ZSkpOworCWlmICghKG9wdCAmIE9QVF9tX25vbnJhdykpIHsgLyogcmF3IG5vdCBzdXBwcmVzc2VkICovCisJCW1lbXNldCgmc3RhdGUuY19jYywgMCwgc2l6ZW9mKHN0YXRlLmNfY2MpKTsKKwkJc3RhdGUuY19jY1tWTUlOXSA9IDE7CisJCXN0YXRlLmNfaWZsYWcgPSBJR05CUksgfCBJR05QQVI7CisJCXN0YXRlLmNfb2ZsYWcgPSAwOworCQlzdGF0ZS5jX2xmbGFnID0gMDsKKwkJc3RhdGUuY19jZmxhZyA9IENTOCB8IEhVUENMIHwgQ1JFQUQKKwkJICAgICAgICAgICAgICB8ICgob3B0ICYgT1BUX0xfbG9jYWwpID8gQ0xPQ0FMIDogMCkKKwkJICAgICAgICAgICAgICB8ICgob3B0ICYgT1BUX0Zfbm9mbG93KSA/IDAgOiBDUlRTQ1RTKTsKKwkJY2ZzZXRpc3BlZWQoJnN0YXRlLCBjZmdldGlzcGVlZCgmc2F2ZWRfc3RhdGUpKTsKKwkJY2ZzZXRvc3BlZWQoJnN0YXRlLCBjZmdldG9zcGVlZCgmc2F2ZWRfc3RhdGUpKTsKKwl9CisKKwlpZiAob3B0ICYgT1BUX3NfYmF1ZCkgeworCQljZnNldGlzcGVlZCgmc3RhdGUsIGJhdWRfY29kZSk7CisJCWNmc2V0b3NwZWVkKCZzdGF0ZSwgYmF1ZF9jb2RlKTsKKwl9CisKKwlzZXRfc3RhdGUoJnN0YXRlLCBlbmNhcCk7CisKKwkvKiBFeGl0IG5vdyBpZiBvcHRpb24gLWUgd2FzIHBhc3NlZCAqLworCWlmIChvcHQgJiBPUFRfZV9xdWl0KQorCQlyZXR1cm4gMDsKKworCS8qIElmIHdlJ3JlIG5vdCByZXF1ZXN0ZWQgdG8gd2F0Y2gsIGp1c3Qga2VlcCBkZXNjcmlwdG9yIG9wZW4KKwkgKiB1bnRpbCB3ZSBhcmUga2lsbGVkICovCisJaWYgKCEob3B0ICYgT1BUX2hfd2F0Y2gpKQorCQl3aGlsZSAoMSkKKwkJCXNsZWVwKDI0KjYwKjYwKTsKKworCS8qIFdhdGNoIGxpbmUgZm9yIGhhbmd1cCAqLworCXdoaWxlICgxKSB7CisJCWlmIChpb2N0bChoYW5kbGUsIFRJT0NNR0VULCAmaSkgPCAwIHx8ICEoaSAmIFRJT0NNX0NBUikpCisJCQlnb3RvIG5vX2NhcnJpZXI7CisJCXNsZWVwKDE1KTsKKwl9CisKKyBub19jYXJyaWVyOgorCisJLyogRXhlY3V0ZSBjb21tYW5kIG9uIGhhbmd1cCAqLworCWlmIChvcHQgJiBPUFRfY19leHRjbWQpCisJCXN5c3RlbShleHRjbWQpOworCisJLyogUmVzdG9yZSBzdGF0ZXMgYW5kIGV4aXQgKi8KKwlyZXN0b3JlX3N0YXRlX2FuZF9leGl0KEVYSVRfU1VDQ0VTUyk7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3NzbF9oZWxwZXItd29sZnNzbC8wMGNmZy13b2xmc3NsLTMuNi44IGIvbmV0d29ya2luZy9zc2xfaGVscGVyLXdvbGZzc2wvMDBjZmctd29sZnNzbC0zLjYuOApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MGI2MTAyCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9zc2xfaGVscGVyLXdvbGZzc2wvMDBjZmctd29sZnNzbC0zLjYuOApAQCAtMCwwICsxLDIyIEBACisjIS9iaW4vc2gKKworIyBIb3cgdG8gY29uZmlndXJlICYgYnVpbGQgYSBzdGF0aWMgd29sZnNzbC0zLjYuOCBsaWJyYXJ5CisjIHN1aXRhYmxlIGZvciBzdGF0aWMgYnVpbGQgb2Ygc3NsX2hlbHBlci4KKworZXhwb3J0IENDPSJpNjg2LWdjYyIKK2V4cG9ydCBDRkxBR1M9IlwKKy1PcyBcCistc3RhdGljIFwKKy1mb21pdC1mcmFtZS1wb2ludGVyIFwKKy1mYWxpZ24tZnVuY3Rpb25zPTEgLWZhbGlnbi1sYWJlbHM9MSAtZmFsaWduLWxvb3BzPTEgLWZhbGlnbi1qdW1wcz0xIFwKKy1mZnVuY3Rpb24tc2VjdGlvbnMgLWZkYXRhLXNlY3Rpb25zIFwKKyIKKworLi9jb25maWd1cmUgXAorCS0taG9zdD1pNjg2IFwKKwktLWVuYWJsZS1zdGF0aWMgXAorCS0tZW5hYmxlLXNpbmdsZXRocmVhZGVkIFwKKwktLWRpc2FibGUtc2hhcmVkIFwKK3x8IGV4aXQgJD8KKworbWFrZQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9zc2xfaGVscGVyLXdvbGZzc2wvUkVBRE1FIGIvbmV0d29ya2luZy9zc2xfaGVscGVyLXdvbGZzc2wvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YTM4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3NzbF9oZWxwZXItd29sZnNzbC9SRUFETUUKQEAgLTAsMCArMSwyMCBAQAorQSBzbWFsbCBTU0wgaGVscGVyIGZvciBidXN5Ym94IHdnZXQuCisKK1ByZWNvbXBpbGVkIHN0YXRpYyBiaW5hcnkgbWF5IGJlIGZvdW5kIGluCitodHRwOi8vYnVzeWJveC5uZXQvZG93bmxvYWRzL2JpbmFyaWVzLworCitCdWlsZCBpbnN0cnVjdGlvbnM6CisKKyogVW5wYWNrIHdvbGZzc2wtMy42LjguemlwCisqIEJ1aWxkIGl0OgorICAuL2NvbmZpZ3VyZSAtLWVuYWJsZS1zdGF0aWMgLS1kaXNhYmxlLXNoYXJlZCAmJiBtYWtlCisqIERyb3AgdGhpcyBkaXJlY3RvcnkgaW50byB3b2xmc3NsLTMuNi44L3NzbF9oZWxwZXIKKyogUnVuIHNzbF9oZWxwZXIuc2ggdG8gY29tcGlsZSBhbmQgbGluayB0aGUgaGVscGVyCisKK1VzYWdlOiAic3NsX2hlbHBlciAtZCBGSUxFX0RFU0NSSVBUT1IiIHdoZXJlIEZJTEVfREVTQ1JJUFRPUiBpcyBvcGVuIHRvIHRoZSBwZWVyLgorCitJbiBiYXNoLCB5b3UgY2FuIGRvIGl0IHRoaXMgd2F5OgorJCBzc2xfaGVscGVyIC1kMyAzPD4vZGV2L3RjcC9IT1NUL1BPUlQKKworU3RkaW4gd2lsbCBiZSBTU0wtZW5jcnlwdGVkIGFuZCBzZW50IHRvIEZJTEVfREVTQ1JJUFRPUi4KK0RhdGEgZnJvbSBGSUxFX0RFU0NSSVBUT1Igd2lsbCBiZSBkZWNyeXB0ZWQgYW5kIHNlbnQgdG8gc3Rkb3V0LgpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9zc2xfaGVscGVyLXdvbGZzc2wvc3NsX2hlbHBlci5jIGIvbmV0d29ya2luZy9zc2xfaGVscGVyLXdvbGZzc2wvc3NsX2hlbHBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YjdiNTYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3NzbF9oZWxwZXItd29sZnNzbC9zc2xfaGVscGVyLmMKQEAgLTAsMCArMSw0ODAgQEAKKy8qCisgKiBBZGFwdGVkIGZyb206CisgKgorICogY2xpZW50LmMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxNSB3b2xmU1NMIEluYy4KKyAqCisgKiBUaGlzIGZpbGUgaXMgcGFydCBvZiB3b2xmU1NMLiAoZm9ybWVybHkga25vd24gYXMgQ3lhU1NMKQorICoKKyAqIHdvbGZTU0wgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIHdvbGZTU0wgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKKyAqLworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSA8d29sZnNzbC93b2xmY3J5cHQvdHlwZXMuaD4KKyNpbmNsdWRlIDx3b2xmc3NsL3NzbC5oPgorCisjaWYgMAorIyBkZWZpbmUgZGJnKC4uLikgc2F5KF9fVkFfQVJHU19fKQorI2Vsc2UKKyMgZGVmaW5lIGRiZyguLi4pICgodm9pZCkwKQorI2VuZGlmCisKK3N0YXRpYyBzc2l6ZV90IHNhZmVfd3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlzc2l6ZV90IG47CisKKwlkbyB7CisJCW4gPSB3cml0ZShmZCwgYnVmLCBjb3VudCk7CisJfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOworCisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBzc2l6ZV90IGZ1bGxfd3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisJc3NpemVfdCBjYzsKKwlzc2l6ZV90IHRvdGFsOworCisJdG90YWwgPSAwOworCisJd2hpbGUgKGxlbikgeworCQljYyA9IHNhZmVfd3JpdGUoZmQsIGJ1ZiwgbGVuKTsKKworCQlpZiAoY2MgPCAwKSB7CisJCQlpZiAodG90YWwpIHsKKwkJCQkvKiB3ZSBhbHJlYWR5IHdyb3RlIHNvbWUhICovCisJCQkJLyogdXNlciBjYW4gZG8gYW5vdGhlciB3cml0ZSB0byBrbm93IHRoZSBlcnJvciBjb2RlICovCisJCQkJcmV0dXJuIHRvdGFsOworCQkJfQorCQkJcmV0dXJuIGNjOyAgLyogd3JpdGUoKSByZXR1cm5zIC0xIG9uIGZhaWx1cmUuICovCisJCX0KKworCQl0b3RhbCArPSBjYzsKKwkJYnVmID0gKChjb25zdCBjaGFyICopYnVmKSArIGNjOworCQlsZW4gLT0gY2M7CisJfQorCisJcmV0dXJuIHRvdGFsOworfQorCitzdGF0aWMgdm9pZCBzYXkoY29uc3QgY2hhciAqcywgLi4uKQoreworCWNoYXIgYnVmWzI1Nl07CisJdmFfbGlzdCBwOworCWludCBzejsKKworCXZhX3N0YXJ0KHAsIHMpOworCXN6ID0gdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHMsIHApOworCWZ1bGxfd3JpdGUoU1RERVJSX0ZJTEVOTywgYnVmLCBzeiA+PSAwICYmIHN6IDwgc2l6ZW9mKGJ1ZikgPyBzeiA6IHN0cmxlbihidWYpKTsKKwl2YV9lbmQocCk7Cit9CisKK3N0YXRpYyB2b2lkIGRpZShjb25zdCBjaGFyICpzLCAuLi4pCit7CisJY2hhciBidWZbMjU2XTsKKwl2YV9saXN0IHA7CisJaW50IHN6OworCisJdmFfc3RhcnQocCwgcyk7CisJc3ogPSB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgcywgcCk7CisJZnVsbF93cml0ZShTVERFUlJfRklMRU5PLCBidWYsIHN6ID49IDAgJiYgc3ogPCBzaXplb2YoYnVmKSA/IHN6IDogc3RybGVuKGJ1ZikpOworCWV4aXQoMSk7CisJdmFfZW5kKHApOworfQorCitzdGF0aWMgdm9pZCBlcnJfc3lzKGNvbnN0IGNoYXIgKm1zZykKK3sKKwlkaWUoIiVzXG4iLCBtc2cpOworfQorCisvKiA9PT09ICovCisKKyNpZiAwCitzdGF0aWMgdm9pZCBzaG93UGVlcihXT0xGU1NMKiBzc2wpCit7CisJV09MRlNTTF9DSVBIRVIqIGNpcGhlcjsKKwlXT0xGU1NMX1g1MDkqIHBlZXIgPSB3b2xmU1NMX2dldF9wZWVyX2NlcnRpZmljYXRlKHNzbCk7CisJaWYgKHBlZXIpCisJCVNob3dYNTA5KHBlZXIsICJwZWVyJ3MgY2VydCBpbmZvOiIpOworCWVsc2UKKwkJc2F5KCJwZWVyIGhhcyBubyBjZXJ0IVxuIik7CisJc2F5KCJTU0wgdmVyc2lvbiBpcyAlc1xuIiwgd29sZlNTTF9nZXRfdmVyc2lvbihzc2wpKTsKKworCWNpcGhlciA9IHdvbGZTU0xfZ2V0X2N1cnJlbnRfY2lwaGVyKHNzbCk7CisJc2F5KCJTU0wgY2lwaGVyIHN1aXRlIGlzICVzXG4iLCB3b2xmU1NMX0NJUEhFUl9nZXRfbmFtZShjaXBoZXIpKTsKKworCXsKKwkJV09MRlNTTF9YNTA5X0NIQUlOKiBjaGFpbiA9IHdvbGZTU0xfZ2V0X3BlZXJfY2hhaW4oc3NsKTsKKwkJaW50IGNvdW50ID0gd29sZlNTTF9nZXRfY2hhaW5fY291bnQoY2hhaW4pOworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJaW50IGxlbmd0aDsKKwkJCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzMwNzJdOworCQkJV09MRlNTTF9YNTA5KiBjaGFpblg1MDk7CisKKwkJCXdvbGZTU0xfZ2V0X2NoYWluX2NlcnRfcGVtKGNoYWluLCBpLCBidWZmZXIsIHNpemVvZihidWZmZXIpLCAmbGVuZ3RoKTsKKwkJCWJ1ZmZlcltsZW5ndGhdID0gMDsKKwkJCXNheSgiY2VydCAlZCBoYXMgbGVuZ3RoICVkIGRhdGEgPSBcbiVzXG4iLCBpLCBsZW5ndGgsIGJ1ZmZlcik7CisKKwkJCWNoYWluWDUwOSA9IHdvbGZTU0xfZ2V0X2NoYWluX1g1MDkoY2hhaW4sIGkpOworCQkJaWYgKGNoYWluWDUwOSkKKwkJCQlTaG93WDUwOShjaGFpblg1MDksICJzZXNzaW9uIGNlcnQgaW5mbzoiKTsKKwkJCWVsc2UKKwkJCQlzYXkoImdldF9jaGFpbl9YNTA5IGZhaWxlZFxuIik7CisJCQl3b2xmU1NMX0ZyZWVYNTA5KGNoYWluWDUwOSk7CisJCX0KKwl9Cit9CisjZW5kaWYKKworV09MRlNTTCAqcHJlcGFyZShpbnQgc29ja2ZkKQoreworCVdPTEZTU0xfTUVUSE9EKiBtZXRob2Q7CisJV09MRlNTTF9DVFgqIGN0eDsKKwlXT0xGU1NMKiBzc2w7CisKKwl3b2xmU1NMX0luaXQoKTsKKworCW1ldGhvZCA9IHdvbGZUTFN2MV8xX2NsaWVudF9tZXRob2QoKTsKKwlpZiAobWV0aG9kID09IE5VTEwpCisJCWVycl9zeXMoIm91dCBvZiBtZW1vcnkiKTsKKwljdHggPSB3b2xmU1NMX0NUWF9uZXcobWV0aG9kKTsKKwlpZiAoY3R4ID09IE5VTEwpCisJCWVycl9zeXMoIm91dCBvZiBtZW1vcnkiKTsKKy8vCWlmIChjaXBoZXJMaXN0KQorLy8JCWlmICh3b2xmU1NMX0NUWF9zZXRfY2lwaGVyX2xpc3QoY3R4LCBjaXBoZXJMaXN0KSAhPSBTU0xfU1VDQ0VTUykKKy8vCQkJZXJyX3N5cygiY2xpZW50IGNhbid0IHNldCBjaXBoZXIgbGlzdCAxIik7CisKKy8vCWlmIChmZXdlclBhY2tldHMpCisvLwkJd29sZlNTTF9DVFhfc2V0X2dyb3VwX21lc3NhZ2VzKGN0eCk7CisKKy8vI2lmbmRlZiBOT19ESAorLy8Jd29sZlNTTF9DVFhfU2V0TWluRGhLZXlfU3ooY3R4LCAod29yZDE2KW1pbkRoS2V5Qml0cyk7CisvLyNlbmRpZgorCisvLwlpZiAodXNlUHNrKSB7CisvLwkJd29sZlNTTF9DVFhfc2V0X3Bza19jbGllbnRfY2FsbGJhY2soY3R4LCBteV9wc2tfY2xpZW50X2NiKTsKKy8vCQlpZiAoY2lwaGVyTGlzdCA9PSBOVUxMKSB7CisvLwkJCWNvbnN0IGNoYXIgKmRlZmF1bHRDaXBoZXJMaXN0OworLy8jaWYgZGVmaW5lZChIQVZFX0FFU0dDTSkgJiYgIWRlZmluZWQoTk9fREgpCisvLwkJCWRlZmF1bHRDaXBoZXJMaXN0ID0gIkRIRS1QU0stQUVTMTI4LUdDTS1TSEEyNTYiOworLy8jZWxpZiBkZWZpbmVkKEhBVkVfTlVMTF9DSVBIRVIpCisvLwkJCWRlZmF1bHRDaXBoZXJMaXN0ID0gIlBTSy1OVUxMLVNIQTI1NiI7CisvLyNlbHNlCisvLwkJCWRlZmF1bHRDaXBoZXJMaXN0ID0gIlBTSy1BRVMxMjgtQ0JDLVNIQTI1NiI7CisvLyNlbmRpZgorLy8JCQlpZiAod29sZlNTTF9DVFhfc2V0X2NpcGhlcl9saXN0KGN0eCxkZWZhdWx0Q2lwaGVyTGlzdCkgIT0gU1NMX1NVQ0NFU1MpCisvLwkJCQllcnJfc3lzKCJjbGllbnQgY2FuJ3Qgc2V0IGNpcGhlciBsaXN0IDIiKTsKKy8vCQl9CisvLwkJdXNlQ2xpZW50Q2VydCA9IDA7CisvLwl9CisKKy8vCWlmICh1c2VBbm9uKSB7CisvLwkJaWYgKGNpcGhlckxpc3QgPT0gTlVMTCkgeworLy8JCQl3b2xmU1NMX0NUWF9hbGxvd19hbm9uX2NpcGhlcihjdHgpOworLy8JCQlpZiAod29sZlNTTF9DVFhfc2V0X2NpcGhlcl9saXN0KGN0eCwiQURILUFFUzEyOC1TSEEiKSAhPSBTU0xfU1VDQ0VTUykKKy8vCQkJCWVycl9zeXMoImNsaWVudCBjYW4ndCBzZXQgY2lwaGVyIGxpc3QgNCIpOworLy8JCX0KKy8vCQl1c2VDbGllbnRDZXJ0ID0gMDsKKy8vCX0KKworLy8jaWYgZGVmaW5lZChPUEVOU1NMX0VYVFJBKSB8fCBkZWZpbmVkKEhBVkVfV0VCU0VSVkVSKQorLy8Jd29sZlNTTF9DVFhfc2V0X2RlZmF1bHRfcGFzc3dkX2NiKGN0eCwgUGFzc3dvcmRDYWxsQmFjayk7CisvLyNlbmRpZgorCisvLwlpZiAodXNlT2NzcCkgeworLy8JCWlmIChvY3NwVXJsICE9IE5VTEwpIHsKKy8vCQkJd29sZlNTTF9DVFhfU2V0T0NTUF9PdmVycmlkZVVSTChjdHgsIG9jc3BVcmwpOworLy8JCQl3b2xmU1NMX0NUWF9FbmFibGVPQ1NQKGN0eCwgV09MRlNTTF9PQ1NQX05PX05PTkNFCisvLwkJCQkJfCBXT0xGU1NMX09DU1BfVVJMX09WRVJSSURFKTsKKy8vCQl9CisvLwkJZWxzZQorLy8JCQl3b2xmU1NMX0NUWF9FbmFibGVPQ1NQKGN0eCwgV09MRlNTTF9PQ1NQX05PX05PTkNFKTsKKy8vCX0KKy8vCisvLyNpZmRlZiBVU0VSX0NBX0NCCisvLwl3b2xmU1NMX0NUWF9TZXRDQUNiKGN0eCwgQ2FDYik7CisvLyNlbmRpZgorLy8KKy8vI2lmZGVmIFZFUklGWV9DQUxMQkFDSworLy8Jd29sZlNTTF9DVFhfc2V0X3ZlcmlmeShjdHgsIFNTTF9WRVJJRllfUEVFUiwgbXlWZXJpZnkpOworLy8jZW5kaWYKKy8vI2lmICFkZWZpbmVkKE5PX0ZJTEVTWVNURU0pICYmICFkZWZpbmVkKE5PX0NFUlRTKQorLy8JaWYgKHVzZUNsaWVudENlcnQpIHsKKy8vCQlpZiAod29sZlNTTF9DVFhfdXNlX2NlcnRpZmljYXRlX2NoYWluX2ZpbGUoY3R4LCBvdXJDZXJ0KSAhPSBTU0xfU1VDQ0VTUykKKy8vCQkJZXJyX3N5cygiY2FuJ3QgbG9hZCBjbGllbnQgY2VydCBmaWxlLCBjaGVjayBmaWxlIGFuZCBydW4gZnJvbSIKKy8vCQkJCSIgd29sZlNTTCBob21lIGRpciIpOworLy8JCWlmICh3b2xmU1NMX0NUWF91c2VfUHJpdmF0ZUtleV9maWxlKGN0eCwgb3VyS2V5LCBTU0xfRklMRVRZUEVfUEVNKSAhPSBTU0xfU1VDQ0VTUykKKy8vCQkJZXJyX3N5cygiY2FuJ3QgbG9hZCBjbGllbnQgcHJpdmF0ZSBrZXkgZmlsZSwgY2hlY2sgZmlsZSBhbmQgcnVuICIKKy8vCQkJCSJmcm9tIHdvbGZTU0wgaG9tZSBkaXIiKTsKKy8vCX0KKy8vCisvLwlpZiAoIXVzZVBzayAmJiAhdXNlQW5vbikgeworLy8JCWlmICh3b2xmU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY3R4LCB2ZXJpZnlDZXJ0LDApICE9IFNTTF9TVUNDRVNTKQorLy8JCQllcnJfc3lzKCJjYW4ndCBsb2FkIGNhIGZpbGUsIFBsZWFzZSBydW4gZnJvbSB3b2xmU1NMIGhvbWUgZGlyIik7CisvLyNpZmRlZiBIQVZFX0VDQworLy8JCS8qIGxvYWQgZWNjIHZlcmlmeSB0b28sIGVjaG9zZXJ2ZXIgdXNlcyBpdCBieSBkZWZhdWx0IHcvIGVjYyAqLworLy8JCWlmICh3b2xmU1NMX0NUWF9sb2FkX3ZlcmlmeV9sb2NhdGlvbnMoY3R4LCBlY2NDZXJ0LCAwKSAhPSBTU0xfU1VDQ0VTUykKKy8vCQkJZXJyX3N5cygiY2FuJ3QgbG9hZCBlY2MgY2EgZmlsZSwgUGxlYXNlIHJ1biBmcm9tIHdvbGZTU0wgaG9tZSBkaXIiKTsKKy8vI2VuZGlmCisvLwl9CisvLyNlbmRpZiAvKiAhTk9fRklMRVNZU1RFTSAmJiAhTk9fQ0VSVFMgKi8KKworLy8jaWYgIWRlZmluZWQoTk9fQ0VSVFMpCisvLwlpZiAoIXVzZVBzayAmJiAhdXNlQW5vbiAmJiBkb1BlZXJDaGVjayA9PSAwKQorLy8JCXdvbGZTU0xfQ1RYX3NldF92ZXJpZnkoY3R4LCBTU0xfVkVSSUZZX05PTkUsIDApOworLy8JaWYgKCF1c2VQc2sgJiYgIXVzZUFub24gJiYgb3ZlcnJpZGVEYXRlRXJyb3JzID09IDEpCisvLwkJd29sZlNTTF9DVFhfc2V0X3ZlcmlmeShjdHgsIFNTTF9WRVJJRllfUEVFUiwgbXlEYXRlQ2IpOworLy8jZW5kaWYKKworCXdvbGZTU0xfQ1RYX3NldF92ZXJpZnkoY3R4LCBTU0xfVkVSSUZZX05PTkUsIDApOworCisvLyNpZmRlZiBIQVZFX1NOSQorLy8JaWYgKHNuaUhvc3ROYW1lKQorLy8JCWlmICh3b2xmU1NMX0NUWF9Vc2VTTkkoY3R4LCAwLCBzbmlIb3N0TmFtZSwgWFNUUkxFTihzbmlIb3N0TmFtZSkpICE9IFNTTF9TVUNDRVNTKQorLy8JCQllcnJfc3lzKCJVc2VTTkkgZmFpbGVkIik7CisvLyNlbmRpZgorCisvLyNpZmRlZiBIQVZFX01BWF9GUkFHTUVOVAorLy8JaWYgKG1heEZyYWdtZW50KQorLy8JCWlmICh3b2xmU1NMX0NUWF9Vc2VNYXhGcmFnbWVudChjdHgsIG1heEZyYWdtZW50KSAhPSBTU0xfU1VDQ0VTUykKKy8vCQkJZXJyX3N5cygiVXNlTWF4RnJhZ21lbnQgZmFpbGVkIik7CisvLyNlbmRpZgorLy8jaWZkZWYgSEFWRV9UUlVOQ0FURURfSE1BQworLy8JaWYgKHRydW5jYXRlZEhNQUMpCisvLwkJaWYgKHdvbGZTU0xfQ1RYX1VzZVRydW5jYXRlZEhNQUMoY3R4KSAhPSBTU0xfU1VDQ0VTUykKKy8vCQkJZXJyX3N5cygiVXNlVHJ1bmNhdGVkSE1BQyBmYWlsZWQiKTsKKy8vI2VuZGlmCisvLyNpZmRlZiBIQVZFX1NFU1NJT05fVElDS0VUCisvLwlpZiAod29sZlNTTF9DVFhfVXNlU2Vzc2lvblRpY2tldChjdHgpICE9IFNTTF9TVUNDRVNTKQorLy8JCWVycl9zeXMoIlVzZVNlc3Npb25UaWNrZXQgZmFpbGVkIik7CisvLyNlbmRpZgorCisvLyNpZiBkZWZpbmVkKFdPTEZTU0xfTURLX0FSTSkKKy8vCXdvbGZTU0xfQ1RYX3NldF92ZXJpZnkoY3R4LCBTU0xfVkVSSUZZX05PTkUsIDApOworLy8jZW5kaWYKKworCXNzbCA9IHdvbGZTU0xfbmV3KGN0eCk7CisJaWYgKHNzbCA9PSBOVUxMKQorCQllcnJfc3lzKCJvdXQgb2YgbWVtb3J5Iik7CisKKy8vI2lmZGVmIEhBVkVfU0VTU0lPTl9USUNLRVQKKy8vCXdvbGZTU0xfc2V0X1Nlc3Npb25UaWNrZXRfY2Ioc3NsLCBzZXNzaW9uVGlja2V0Q0IsICh2b2lkKikiaW5pdGlhbCBzZXNzaW9uIik7CisvLyNlbmRpZgorCisvLwlpZiAoZG9EVExTKSB7CisvLwkJU09DS0FERFJfSU5fVCBhZGRyOworLy8JCWJ1aWxkX2FkZHIoJmFkZHIsIGhvc3QsIHBvcnQsIDEpOworLy8JCXdvbGZTU0xfZHRsc19zZXRfcGVlcihzc2wsICZhZGRyLCBzaXplb2YoYWRkcikpOworLy8JCXRjcF9zb2NrZXQoJnNvY2tmZCwgMSk7CisvLwl9IHdsc2UgeworLy8JCXRjcF9jb25uZWN0KCZzb2NrZmQsIGhvc3QsIHBvcnQsIDApOworLy8JfQorCisvLyNpZmRlZiBIQVZFX1BPTFkxMzA1CisvLwkvKiB1c2Ugb2xkIHBvbHkgdG8gY29ubmVjdCB3aXRoIGdvb2dsZSBzZXJ2ZXIgKi8KKy8vCWlmICghWFNUUk5DTVAoZG9tYWluLCAid3d3Lmdvb2dsZS5jb20iLCAxNCkpIHsKKy8vCQlpZiAod29sZlNTTF91c2Vfb2xkX3BvbHkoc3NsLCAxKSAhPSAwKQorLy8JCQllcnJfc3lzKCJ1bmFibGUgdG8gc2V0IHRvIG9sZCBwb2x5Iik7CisvLwl9CisvLyNlbmRpZgorCisJd29sZlNTTF9zZXRfZmQoc3NsLCBzb2NrZmQpOworCisvLyNpZmRlZiBIQVZFX0NSTAorLy8JaWYgKGRpc2FibGVDUkwgPT0gMCkgeworLy8JCWlmICh3b2xmU1NMX0VuYWJsZUNSTChzc2wsIFdPTEZTU0xfQ1JMX0NIRUNLQUxMKSAhPSBTU0xfU1VDQ0VTUykKKy8vCQkJZXJyX3N5cygiY2FuJ3QgZW5hYmxlIGNybCBjaGVjayIpOworLy8JCWlmICh3b2xmU1NMX0xvYWRDUkwoc3NsLCBjcmxQZW1EaXIsIFNTTF9GSUxFVFlQRV9QRU0sIDApICE9IFNTTF9TVUNDRVNTKQorLy8JCQllcnJfc3lzKCJjYW4ndCBsb2FkIGNybCwgY2hlY2sgY3JsZmlsZSBhbmQgZGF0ZSB2YWxpZGl0eSIpOworLy8JCWlmICh3b2xmU1NMX1NldENSTF9DYihzc2wsIENSTF9DYWxsQmFjaykgIT0gU1NMX1NVQ0NFU1MpCisvLwkJCWVycl9zeXMoImNhbid0IHNldCBjcmwgY2FsbGJhY2siKTsKKy8vCX0KKy8vI2VuZGlmCisvLyNpZmRlZiBIQVZFX1NFQ1VSRV9SRU5FR09USUFUSU9OCisvLwlpZiAoc2NyKSB7CisvLwkJaWYgKHdvbGZTU0xfVXNlU2VjdXJlUmVuZWdvdGlhdGlvbihzc2wpICE9IFNTTF9TVUNDRVNTKQorLy8JCQllcnJfc3lzKCJjYW4ndCBlbmFibGUgc2VjdXJlIHJlbmVnb3RpYXRpb24iKTsKKy8vCX0KKy8vI2VuZGlmCisvLyNpZmRlZiBBVE9NSUNfVVNFUgorLy8JaWYgKGF0b21pY1VzZXIpCisvLwkJU2V0dXBBdG9taWNVc2VyKGN0eCwgc3NsKTsKKy8vI2VuZGlmCisvLyNpZmRlZiBIQVZFX1BLX0NBTExCQUNLUworLy8JaWYgKHBrQ2FsbGJhY2tzKQorLy8JCVNldHVwUGtDYWxsYmFja3MoY3R4LCBzc2wpOworLy8jZW5kaWYKKy8vCWlmIChtYXRjaE5hbWUgJiYgZG9QZWVyQ2hlY2spCisvLwkJd29sZlNTTF9jaGVja19kb21haW5fbmFtZShzc2wsIGRvbWFpbik7CisKKwlpZiAod29sZlNTTF9jb25uZWN0KHNzbCkgIT0gU1NMX1NVQ0NFU1MpIHsKKy8vCQkvKiBzZWUgbm90ZSBhdCB0b3Agb2YgUkVBRE1FICovCisvLwkJaW50ICBlcnIgPSB3b2xmU1NMX2dldF9lcnJvcihzc2wsIDApOworLy8JCWNoYXIgYnVmZmVyW1dPTEZTU0xfTUFYX0VSUk9SX1NaXTsKKy8vCQlzYXkoImVyciA9ICVkLCAlc1xuIiwgZXJyLAorLy8JCQl3b2xmU1NMX0VSUl9lcnJvcl9zdHJpbmcoZXJyLCBidWZmZXIpKTsKKwkJZXJyX3N5cygiU1NMX2Nvbm5lY3QgZmFpbGVkIik7CisJfQorLy8Jc2hvd1BlZXIoc3NsKTsKKworLy8jaWZkZWYgSEFWRV9TRUNVUkVfUkVORUdPVElBVElPTgorLy8JaWYgKHNjciAmJiBmb3JjZVNjcikgeworLy8JCWlmICh3b2xmU1NMX1JlaGFuZHNoYWtlKHNzbCkgIT0gU1NMX1NVQ0NFU1MpIHsKKy8vCQkJaW50IGVyciA9IHdvbGZTU0xfZ2V0X2Vycm9yKHNzbCwgMCk7CisvLwkJCWNoYXIgYnVmZmVyW1dPTEZTU0xfTUFYX0VSUk9SX1NaXTsKKy8vCQkJc2F5KCJlcnIgPSAlZCwgJXNcbiIsIGVyciwKKy8vCQkJCXdvbGZTU0xfRVJSX2Vycm9yX3N0cmluZyhlcnIsIGJ1ZmZlcikpOworLy8JCQllcnJfc3lzKCJ3b2xmU1NMX1JlaGFuZHNoYWtlIGZhaWxlZCIpOworLy8JCX0KKy8vCX0KKy8vI2VuZGlmCisKKwlyZXR1cm4gc3NsOworfQorCitzdGF0aWMgc3RydWN0IHBvbGxmZCBwZmRbMl0gPSB7CisJeyAtMSwgUE9MTElOfFBPTExFUlJ8UE9MTEhVUCwgMCB9LAorCXsgLTEsIFBPTExJTnxQT0xMRVJSfFBPTExIVVAsIDAgfSwKK307CisjZGVmaW5lIFNURElOICAgICAgICAgICBwZmRbMF0KKyNkZWZpbmUgTkVUV09SSyAgICAgICAgIHBmZFsxXQorI2RlZmluZSBTVERJTl9SRUFEWSgpICAgKHBmZFswXS5yZXZlbnRzICYgKFBPTExJTnxQT0xMRVJSfFBPTExIVVApKQorI2RlZmluZSBORVRXT1JLX1JFQURZKCkgKHBmZFsxXS5yZXZlbnRzICYgKFBPTExJTnxQT0xMRVJSfFBPTExIVVApKQorCitzdGF0aWMgdm9pZCB3YWl0X2Zvcl9pbnB1dCh2b2lkKQoreworCWlmIChTVERJTi5mZCA9PSBORVRXT1JLLmZkKSAvKiBtZWFucyBib3RoIGFyZSAtMSAqLworCQlleGl0KDApOworCWRiZygicG9sbGluZ1xuIik7CisJU1RESU4ucmV2ZW50cyA9IE5FVFdPUksucmV2ZW50cyA9IDA7CisJd2hpbGUgKHBvbGwocGZkLCAyLCAtMSkgPCAwICYmIGVycm5vID09IEVJTlRSKQorCQljb250aW51ZTsKK30KKworc3RhdGljIHZvaWQgZG9faW9fdW50aWxfZW9mX2FuZF9leGl0KFdPTEZTU0wgKnNzbCwgaW50IGZkKQoreworCWludCBsZW47CisJY2hhciBpYnVmWzQgKiAxMDI0XTsKKworCU5FVFdPUksuZmQgPSBmZDsKKwlTVERJTi5mZCA9IDA7CisKKwlsZW4gPSAwOyAvKiBvbmx5IHRvIHN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmcgKi8KKwlmb3IgKDs7KSB7CisJCXdhaXRfZm9yX2lucHV0KCk7CisKKwkJaWYgKFNURElOX1JFQURZKCkpIHsKKwkJCWRiZygicmVhZGluZyBzdGRpblxuIik7CisJCQlsZW4gPSByZWFkKFNURElOX0ZJTEVOTywgaWJ1Ziwgc2l6ZW9mKGlidWYpKTsKKwkJCWlmIChsZW4gPCAwKQorCQkJCWRpZSgicmVhZCBlcnJvciBvbiBzdGRpblxuIik7CisJCQlpZiAobGVuID09IDApIHsKKwkJCQlkYmcoInJlYWQgbGVuID0gMCwgc3RkaW4gbm90IHBvbGxlZCBhbnltb3JlXG4iKTsKKwkJCQlTVERJTi5mZCA9IC0xOworCQkJfSBlbHNlIHsKKwkJCQlpbnQgbiA9IHdvbGZTU0xfd3JpdGUoc3NsLCBpYnVmLCBsZW4pOworCQkJCWlmIChuICE9IGxlbikKKwkJCQkJZGllKCJTU0xfd3JpdGUoJWQpIGZhaWxlZCAocmV0dXJuZWQgJWQpXG4iLCBsZW4sIG4pOworCQkJfQorCQl9CisKKwkJaWYgKE5FVFdPUktfUkVBRFkoKSkgeworCQkJZGJnKCIlcyVzJXNcbiIsCisJCQkJKHBmZFsxXS5yZXZlbnRzICYgUE9MTElOKSAgPyAiUE9MTElOIiAgOiAiIiwKKwkJCQkocGZkWzFdLnJldmVudHMgJiBQT0xMRVJSKSA/ICJ8UE9MTEVSUiIgOiAiIiwKKwkJCQkocGZkWzFdLnJldmVudHMgJiBQT0xMSFVQKSA/ICJ8UE9MTEhVUCIgOiAiIgorCQkJKTsKKy8qIFdlIGFyZSB1c2luZyBibG9ja2luZyBzb2NrZXQgaGVyZS4KKyAqIChOb25ibG9ja2luZyBzb2NrZXQgd291bGQgY29tcGxpY2F0ZSB3cml0aW5nIHRvIGl0KS4KKyAqIFRoZXJlZm9yZSwgU1NMX3JlYWQgX2NhbiBibG9ja18gaGVyZS4KKyAqIFRoaXMgaXMgbm90IHdoYXQgd2dldCBleHBlY3RzIChpdCB3YW50cyB0byBzZWUgc2hvcnQgcmVhZHMpLgorICogVGhlcmVmb3JlLCB3ZSB1c2Ugc21hbGxpc2ggYnVmZmVyIGhlcmUsIHRvIGFwcHJveGltYXRlIHRoYXQuCisgKi8KKwkJCWxlbiA9IHdvbGZTU0xfcmVhZChzc2wsIGlidWYsCisJCQkJc2l6ZW9mKGlidWYpIDwgMTAyNCA/IHNpemVvZihpYnVmKSA6IDEwMjQKKwkJCSk7CisJCQlpZiAobGVuIDwgMCkKKwkJCQlkaWUoIlNTTF9yZWFkIGVycm9yIG9uIG5ldHdvcmsgKCVkKVxuIiwgbGVuKTsKKwkJCWlmIChsZW4gPiAwKSB7CisJCQkJaW50IG47CisJCQkJbiA9IGZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgaWJ1ZiwgbGVuKTsKKwkJCQlpZiAobiAhPSBsZW4pCisJCQkJCWRpZSgid3JpdGUoJWQpIHRvIHN0ZG91dCByZXR1cm5lZCAlZFxuIiwgbGVuLCBuKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKy8qIEJsb2NraW5nIHJlYWRzIGFyZSBlYXNpZXIgd3RyIEVPRiBkZXRlY3Rpb24gKG5vIEVBR0FJTiBlcnJvciB0byBjaGVjayBmb3IpICovCisJCQlkYmcoInJlYWQgbGVuID0gMCwgbmV0d29yayBub3QgcG9sbGVkIGFueW1vcmVcbiIpOworCQkJTkVUV09SSy5mZCA9IC0xOworCQkJLyogc2F3IEVPRiBvbiBuZXR3b3JrLCBhbmQgd2UgcHJvY2Vzc2VkCisJCQkgKiBhbmQgd3JvdGUgb3V0IGFsbCBzc2wgZGF0YS4gU2lnbmFsIGl0OgorCQkJICovCisJCQljbG9zZShTVERPVVRfRklMRU5PKTsKKwkJfQorCX0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCVdPTEZTU0wgKnNzbDsKKwlpbnQgZmQ7CisJY2hhciAqZmRfc3RyOworCisJaWYgKCFhcmd2WzFdKQorCQlkaWUoIlN5bnRheCBlcnJvclxuIik7CisJaWYgKGFyZ3ZbMV1bMF0gIT0gJy0nKQorCQlkaWUoIlN5bnRheCBlcnJvclxuIik7CisJaWYgKGFyZ3ZbMV1bMV0gIT0gJ2QnKQorCQlkaWUoIlN5bnRheCBlcnJvclxuIik7CisJZmRfc3RyID0gYXJndlsxXSArIDI7CisJaWYgKCFmZF9zdHJbMF0pCisJCWZkX3N0ciA9IGFyZ3ZbMl07CisJaWYgKCFmZF9zdHIgfHwgZmRfc3RyWzBdIDwgJzAnIHx8IGZkX3N0clswXSA+ICc5JykKKwkJZGllKCJTeW50YXggZXJyb3JcbiIpOworCisJZmQgPSBhdG9pKGZkX3N0cik7CisJaWYgKGZkIDwgMykKKwkJZGllKCJTeW50YXggZXJyb3JcbiIpOworCisJc3NsID0gcHJlcGFyZShmZCk7CisJZG9faW9fdW50aWxfZW9mX2FuZF9leGl0KHNzbCwgZmQpOworCS8qIGRvZXMgbm90IHJldHVybiAqLworCisvLwlpZiAoZG9EVExTID09IDApIHsgLyogZG9uJ3Qgc2VuZCBhbGVydCBhZnRlciAiYnJlYWsiIGNvbW1hbmQgKi8KKy8vCQlyZXQgPSB3b2xmU1NMX3NodXRkb3duKHNzbCk7CisvLwkJaWYgKHdjX3NodXRkb3duICYmIHJldCA9PSBTU0xfU0hVVERPV05fTk9UX0RPTkUpCisvLwkJCXdvbGZTU0xfc2h1dGRvd24oc3NsKTsgLyogYmlkaXJlY3Rpb25hbCBzaHV0ZG93biAqLworLy8JfQorLy8jaWZkZWYgQVRPTUlDX1VTRVIKKy8vCWlmIChhdG9taWNVc2VyKQorLy8JCUZyZWVBdG9taWNVc2VyKHNzbCk7CisvLyNlbmRpZgorLy8Jd29sZlNTTF9mcmVlKHNzbCk7CisvLwlDbG9zZVNvY2tldChzb2NrZmQpOworLy8Jd29sZlNTTF9DVFhfZnJlZShjdHgpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3NzbF9oZWxwZXItd29sZnNzbC9zc2xfaGVscGVyLnNoIGIvbmV0d29ya2luZy9zc2xfaGVscGVyLXdvbGZzc2wvc3NsX2hlbHBlci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xODRmZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy9zc2xfaGVscGVyLXdvbGZzc2wvc3NsX2hlbHBlci5zaApAQCAtMCwwICsxLDEyIEBACisjIS9iaW4vc2gKKworIyBJIHVzZSB0aGlzIHRvIGJ1aWxkIHN0YXRpYyB1Y2xpYmMgYmFzZWQgYmluYXJ5IHVzaW5nIEFib3JpZ2luYWwgTGludXggdG9vbGNoYWluOgorUFJFRklYPSJpNjg2LSIKK1NUQVRJQz0iLXN0YXRpYyIKKyMgU3RhbmRhcmQgYnVpbGQ6CisjUFJFRklYPSIiCisjU1RBVElDPSIiCisKKyR7UFJFRklYfWdjYyAtT3MgLVdhbGwgLUkuLiAtYyBzc2xfaGVscGVyLmMgLW8gc3NsX2hlbHBlci5vCiske1BSRUZJWH1nY2MgJFNUQVRJQyAtLXN0YXJ0LWdyb3VwIHNzbF9oZWxwZXIubyAtbG0gLi4vc3JjLy5saWJzL2xpYndvbGZzc2wuYSAtLWVuZC1ncm91cCAtbyBzc2xfaGVscGVyCiske1BSRUZJWH0tc3RyaXAgc3NsX2hlbHBlcgpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy9zc2xfaGVscGVyL1JFQURNRSBiL25ldHdvcmtpbmcvc3NsX2hlbHBlci9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQwNTA4ZgotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvc3NsX2hlbHBlci9SRUFETUUKQEAgLTAsMCArMSwxNiBAQAorQnVpbGQgaW5zdHJ1Y3Rpb25zOgorCisqIFVucGFjayBtYXRyaXhzc2wtMy00LTItb3Blbi50Z3ouCisqIEJ1aWxkIGl0OiAibWFrZSIKKyogRHJvcCB0aGlzIGRpcmVjdG9yeSBpbnRvIG1hdHJpeHNzbC0zLTQtMi1vcGVuL3NzbF9oZWxwZXIKKyogUnVuIHNzbF9oZWxwZXIuc2ggdG8gY29tcGlsZSBhbmQgbGluayB0aGUgaGVscGVyCisKK1VzYWdlOiAic3NsX2hlbHBlciAtZCA8RklMRV9ERVNDUklQVE9SPiIgd2hlcmUgRklMRV9ERVNDUklQVE9SIGlzIG9wZW4gdG8gdGhlIHBlZXIuCisKK0luIGJhc2gsIHlvdSBjYW4gZG8gaXQgdGhpcyB3YXk6CiskIHNzbF9oZWxwZXIgLWQzIDM8Pi9kZXYvdGNwL0hPU1QvUE9SVAorCitTdGRpbiB3aWxsIGJlIFNTTC1lbmNyeXB0ZWQgYW5kIHNlbnQgdG8gRklMRV9ERVNDUklQVE9SLgorRGF0YSBmcm9tIEZJTEVfREVTQ1JJUFRPUiB3aWxsIGJlIGRlY3J5cHRlZCBhbmQgc2VudCB0byBzdGRvdXQuCisKK1RoZSBwbGFuIGlzIHRvIGFkYXB0IGl0IGZvciB3Z2V0IGh0dHBzIGhlbHBlciwgYW5kIGZvciBzc2wgc3VwcG9ydCBpbiBuYy4KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvc3NsX2hlbHBlci9zc2xfaGVscGVyLmMgYi9uZXR3b3JraW5nL3NzbF9oZWxwZXIvc3NsX2hlbHBlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NDBiMWIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3NzbF9oZWxwZXIvc3NsX2hlbHBlci5jCkBAIC0wLDAgKzEsNDA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzIElOU0lERSBTZWN1cmUgQ29ycG9yYXRpb24KKyAqIENvcHlyaWdodCAoYykgUGVlclNlYyBOZXR3b3JrcywgMjAwMi0yMDExCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoaXMgY29kZSBpcyBhdmFpbGFibGUgYXQgaHR0cDovL3d3dy5tYXRyaXhzc2wub3JnCisgKgorICogVGhpcyBzb2Z0d2FyZSBpcyBvcGVuIHNvdXJjZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZQorICogaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuCisgKiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisgKiBodHRwOi8vd3d3LmdudS5vcmcvY29weWxlZnQvZ3BsLmh0bWwKKyAqLworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxwb2xsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorCisjaW5jbHVkZSAibWF0cml4c3NsL21hdHJpeHNzbEFwaS5oIgorCisvLyN3YXJuaW5nICJETyBOT1QgVVNFIFRIRVNFIERFRkFVTFQgS0VZUyBJTiBQUk9EVUNUSU9OIEVOVklST05NRU5UUy4iCisKKy8qCisgKiBJZiBzdXBwb3J0aW5nIGNsaWVudCBhdXRoZW50aWNhdGlvbiwgcGljayBPTkUgaWRlbnRpdHkgdG8gYXV0byBzZWxlY3QgYQorICogY2VydGlmaWNhdGUgYW5kIHByaXZhdGUga2V5IHRoYXQgc3VwcG9ydCBkZXNpcmVkIGFsZ29yaXRobXMuCisgKi8KKyNkZWZpbmUgSURfUlNBIC8qIFJTQSBDZXJ0aWZpY2F0ZSBhbmQgS2V5ICovCisKKyNkZWZpbmUgVVNFX0hFQURFUl9LRVlTCisKKy8qIElmIHRoZSBhbGdvcml0aG0gdHlwZSBpcyBzdXBwb3J0ZWQsIGxvYWQgYSBDQSBmb3IgaXQgKi8KKyNpZmRlZiBVU0VfSEVBREVSX0tFWVMKKy8qIENBcyAqLworIyBpbmNsdWRlICJzYW1wbGVDZXJ0cy9SU0EvQUxMX1JTQV9DQVMuaCIKKy8qIElkZW50aXR5IENlcnRzIGFuZCBLZXlzIGZvciB1c2Ugd2l0aCBDbGllbnQgQXV0aGVudGljYXRpb24gKi8KKyMgaWZkZWYgSURfUlNBCisjICBkZWZpbmUgRVhBTVBMRV9SU0FfS0VZUworIyAgaW5jbHVkZSAic2FtcGxlQ2VydHMvUlNBLzIwNDhfUlNBLmgiCisjICBpbmNsdWRlICJzYW1wbGVDZXJ0cy9SU0EvMjA0OF9SU0FfS0VZLmgiCisjIGVuZGlmCisjZW5kaWYKKworc3RhdGljIHNzaXplX3Qgc2FmZV93cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXNzaXplX3QgbjsKKworCWRvIHsKKwkJbiA9IHdyaXRlKGZkLCBidWYsIGNvdW50KTsKKwl9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHNzaXplX3QgZnVsbF93cml0ZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzc2l6ZV90IGNjOworCXNzaXplX3QgdG90YWw7CisKKwl0b3RhbCA9IDA7CisKKwl3aGlsZSAobGVuKSB7CisJCWNjID0gc2FmZV93cml0ZShmZCwgYnVmLCBsZW4pOworCisJCWlmIChjYyA8IDApIHsKKwkJCWlmICh0b3RhbCkgeworCQkJCS8qIHdlIGFscmVhZHkgd3JvdGUgc29tZSEgKi8KKwkJCQkvKiB1c2VyIGNhbiBkbyBhbm90aGVyIHdyaXRlIHRvIGtub3cgdGhlIGVycm9yIGNvZGUgKi8KKwkJCQlyZXR1cm4gdG90YWw7CisJCQl9CisJCQlyZXR1cm4gY2M7ICAvKiB3cml0ZSgpIHJldHVybnMgLTEgb24gZmFpbHVyZS4gKi8KKwkJfQorCisJCXRvdGFsICs9IGNjOworCQlidWYgPSAoKGNvbnN0IGNoYXIgKilidWYpICsgY2M7CisJCWxlbiAtPSBjYzsKKwl9CisKKwlyZXR1cm4gdG90YWw7Cit9CisKK3N0YXRpYyB2b2lkIHNheShjb25zdCBjaGFyICpzLCAuLi4pCit7CisJY2hhciBidWZbMjU2XTsKKwl2YV9saXN0IHA7CisJaW50IHN6OworCisJdmFfc3RhcnQocCwgcyk7CisJc3ogPSB2c25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgcywgcCk7CisJZnVsbF93cml0ZShTVERFUlJfRklMRU5PLCBidWYsIHN6ID49IDAgJiYgc3ogPCBzaXplb2YoYnVmKSA/IHN6IDogc3RybGVuKGJ1ZikpOworCXZhX2VuZChwKTsKK30KKworc3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKnMsIC4uLikKK3sKKwljaGFyIGJ1ZlsyNTZdOworCXZhX2xpc3QgcDsKKwlpbnQgc3o7CisKKwl2YV9zdGFydChwLCBzKTsKKwlzeiA9IHZzbnByaW50ZihidWYsIHNpemVvZihidWYpLCBzLCBwKTsKKwlmdWxsX3dyaXRlKFNUREVSUl9GSUxFTk8sIGJ1Ziwgc3ogPj0gMCAmJiBzeiA8IHNpemVvZihidWYpID8gc3ogOiBzdHJsZW4oYnVmKSk7CisJZXhpdCgxKTsKKwl2YV9lbmQocCk7Cit9CisKKyNpZiAwCisjIGRlZmluZSBkYmcoLi4uKSBzYXkoX19WQV9BUkdTX18pCisjZWxzZQorIyBkZWZpbmUgZGJnKC4uLikgKCh2b2lkKTApCisjZW5kaWYKKworc3RhdGljIHN0cnVjdCBwb2xsZmQgcGZkWzJdID0geworCXsgLTEsIFBPTExJTnxQT0xMRVJSfFBPTExIVVAsIDAgfSwKKwl7IC0xLCBQT0xMSU58UE9MTEVSUnxQT0xMSFVQLCAwIH0sCit9OworI2RlZmluZSBTVERJTiAgICAgICAgICAgcGZkWzBdCisjZGVmaW5lIE5FVFdPUksgICAgICAgICBwZmRbMV0KKyNkZWZpbmUgU1RESU5fUkVBRFkoKSAgIChwZmRbMF0ucmV2ZW50cyAmIChQT0xMSU58UE9MTEVSUnxQT0xMSFVQKSkKKyNkZWZpbmUgTkVUV09SS19SRUFEWSgpIChwZmRbMV0ucmV2ZW50cyAmIChQT0xMSU58UE9MTEVSUnxQT0xMSFVQKSkKKworc3RhdGljIGludCB3YWl0X2Zvcl9pbnB1dCh2b2lkKQoreworCWlmIChTVERJTi5mZCA9PSBORVRXT1JLLmZkKSAvKiBtZWFucyBib3RoIGFyZSAtMSAqLworCQlleGl0KDApOworCWRiZygicG9sbGluZ1xuIik7CisJU1RESU4ucmV2ZW50cyA9IE5FVFdPUksucmV2ZW50cyA9IDA7CisJcmV0dXJuIHBvbGwocGZkLCAyLCAtMSk7Cit9CisKK3N0YXRpYyBpbnQzMiBjZXJ0Q2Ioc3NsX3QgKnNzbCwgcHNYNTA5Q2VydF90ICpjZXJ0LCBpbnQzMiBhbGVydCkKK3sKKwkvKiBFeGFtcGxlIHRvIGFsbG93IGFub255bW91cyBjb25uZWN0aW9ucyBiYXNlZCBvbiBhIGRlZmluZSAqLworCWlmIChhbGVydCA+IDApIHsKKwkJcmV0dXJuIFNTTF9BTExPV19BTk9OX0NPTk5FQ1RJT047IC8vID0gMjU0CisJfQorI2lmIDAKKwkvKiBWYWxpZGF0ZSB0aGUgJ25vdCBiZWZvcmUnIGFuZCAnbm90IGFmdGVyJyBkYXRlcywgZXRjICovCisJcmV0dXJuIFBTX0ZBSUxVUkU7IC8qIGlmIHdlIGRvbid0IGxpa2UgdGhpcyBjZXJ0ICovCisjZW5kaWYKKwlyZXR1cm4gUFNfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgY2xvc2VfY29ubl9hbmRfZXhpdChzc2xfdCAqc3NsLCBpbnQgZmQpCit7CisJdW5zaWduZWQgY2hhciAqYnVmOworCWludCBsZW47CisKKwlmY250bChmZCwgRl9TRVRGTCwgZmNudGwoZmQsIEZfR0VURkwpIHwgT19OT05CTE9DSyk7CisJLyogUXVpY2sgYXR0ZW1wdCB0byBzZW5kIGEgY2xvc3VyZSBhbGVydCwgZG9uJ3Qgd29ycnkgYWJvdXQgZmFpbHVyZSAqLworCWlmIChtYXRyaXhTc2xFbmNvZGVDbG9zdXJlQWxlcnQoc3NsKSA+PSAwKSB7CisJCWxlbiA9IG1hdHJpeFNzbEdldE91dGRhdGEoc3NsLCAmYnVmKTsKKwkJaWYgKGxlbiA+IDApIHsKKwkJCWxlbiA9IHNhZmVfd3JpdGUoZmQsIGJ1ZiwgbGVuKTsKKwkJCS8vaWYgKGxlbiA+IDApIHsKKwkJCS8vCW1hdHJpeFNzbFNlbnREYXRhKHNzbCwgbGVuKTsKKwkJCS8vfQorCQl9CisJfQorCS8vbWF0cml4U3NsRGVsZXRlU2Vzc2lvbihzc2wpOworCXNodXRkb3duKGZkLCBTSFVUX1dSKTsKKwlleGl0KDApOworfQorCitzdGF0aWMgaW50IGVuY29kZV9kYXRhKHNzbF90ICpzc2wsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsZW4pCit7CisJdW5zaWduZWQgY2hhciAqYnVmOworCWludCBhdmFpbGFibGU7CisKKwlhdmFpbGFibGUgPSBtYXRyaXhTc2xHZXRXcml0ZWJ1Zihzc2wsICZidWYsIGxlbik7CisJaWYgKGF2YWlsYWJsZSA8IDApCisJCWRpZSgibWF0cml4U3NsR2V0V3JpdGVidWZcbiIpOworCWlmIChsZW4gPiBhdmFpbGFibGUpCisJCWRpZSgibGVuID4gYXZhaWxhYmxlXG4iKTsKKwltZW1jcHkoYnVmLCBkYXRhLCBsZW4pOworCWlmIChtYXRyaXhTc2xFbmNvZGVXcml0ZWJ1Zihzc2wsIGxlbikgPCAwKQorCQlkaWUoIm1hdHJpeFNzbEVuY29kZVdyaXRlYnVmXG4iKTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgdm9pZCBmbHVzaF90b19uZXQoc3NsX3QgKnNzbCwgaW50IGZkKQoreworCWludCByYzsKKwlpbnQgbGVuOworCXVuc2lnbmVkIGNoYXIgKmJ1ZjsKKworCXdoaWxlICgobGVuID0gbWF0cml4U3NsR2V0T3V0ZGF0YShzc2wsICZidWYpKSA+IDApIHsKKwkJZGJnKCJ3cml0aW5nIG5ldCAlZCBieXRlc1xuIiwgbGVuKTsKKwkJaWYgKGZ1bGxfd3JpdGUoZmQsIGJ1ZiwgbGVuKSAhPSBsZW4pCisJCQlkaWUoIndyaXRlIHRvIG5ldHdvcmtcbiIpOworCQlyYyA9IG1hdHJpeFNzbFNlbnREYXRhKHNzbCwgbGVuKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWRpZSgibWF0cml4U3NsU2VudERhdGFcbiIpOworCX0KK30KKworc3RhdGljIHZvaWQgZG9faW9fdW50aWxfZW9mX2FuZF9leGl0KGludCBmZCwgc3NsS2V5c190ICprZXlzKQoreworCWludCByYzsKKwlpbnQgbGVuOworCXVpbnQzMl90IGxlbjMydTsKKwlzc2xTZXNzaW9uSWRfdCAqc2lkOworCXNzbF90ICpzc2w7CisJdW5zaWduZWQgY2hhciAqYnVmOworCisJTkVUV09SSy5mZCA9IGZkOworCS8qIE5vdGUhIFNURElOLmZkIGlzIGRpc2FibGVkICgtMSkgdW50aWwgU1NMIGhhbmRzaGFrZSBpcyBvdmVyOgorCSAqIHdlIGRvIG5vdCBhdHRlbXB0IHRvIGZlZWQgYW55IHVzZXIgZGF0YSB0byBNYXRyaXhTU0wKKwkgKiBiZWZvcmUgaXQgaXMgcmVhZHkuCisJICovCisKKwltYXRyaXhTc2xOZXdTZXNzaW9uSWQoJnNpZCk7CisJcmMgPSBtYXRyaXhTc2xOZXdDbGllbnRTZXNzaW9uKCZzc2wsIGtleXMsIHNpZCwgMCwgY2VydENiLCBOVUxMLCBOVUxMLCAwKTsKK2RiZygibWF0cml4U3NsTmV3Q2xpZW50U2Vzc2lvbjpyYz0lZFxuIiwgcmMpOworCWlmIChyYyAhPSBNQVRSSVhTU0xfUkVRVUVTVF9TRU5EKQorCQlkaWUoIm1hdHJpeFNzbE5ld0NsaWVudFNlc3Npb25cbiIpOworCisJbGVuID0gMDsgLyogb25seSB0byBzdXBwcmVzcyBjb21waWxlciB3YXJuaW5nICovCisgYWdhaW46CisJc3dpdGNoIChyYykgeworCWNhc2UgTUFUUklYU1NMX1JFUVVFU1RfU0VORDoKKwkJZGJnKCJNQVRSSVhTU0xfUkVRVUVTVF9TRU5EXG4iKTsKKwkJZmx1c2hfdG9fbmV0KHNzbCwgZmQpOworCQlnb3RvIHBvbGxfaW5wdXQ7CisKKwljYXNlIDA6CisJCWRiZygicmM9PTBcbiIpOworCQlmbHVzaF90b19uZXQoc3NsLCBmZCk7CisJCWdvdG8gcG9sbF9pbnB1dDsKKworCWNhc2UgTUFUUklYU1NMX1JFUVVFU1RfQ0xPU0U6CisJCS8qIHdoYXQgZG9lcyB0aGlzIG1lYW4gaWYgd2UgYXJlIGhlcmU/ICovCisJCWRiZygiTUFUUklYU1NMX1JFUVVFU1RfQ0xPU0VcbiIpOworCQljbG9zZV9jb25uX2FuZF9leGl0KHNzbCwgZmQpOworCisJY2FzZSBNQVRSSVhTU0xfSEFORFNIQUtFX0NPTVBMRVRFOgorCQlkYmcoIk1BVFJJWFNTTF9IQU5EU0hBS0VfQ09NUExFVEVcbiIpOworCQkvKiBJbml0IGNvbXBsZXRlLCBjYW4gc3RhcnQgcmVhZGluZyBsb2NhbCB1c2VyJ3MgZGF0YTogKi8KKwkJU1RESU4uZmQgPSBTVERJTl9GSUxFTk87CisgcG9sbF9pbnB1dDoKKwkJd2FpdF9mb3JfaW5wdXQoKTsKKwkJaWYgKFNURElOX1JFQURZKCkpIHsKKwkJCWNoYXIgaWJ1Zls0ICogMTAyNF07CisJCQlkYmcoInJlYWRpbmcgc3RkaW5cbiIpOworCQkJbGVuID0gcmVhZChTVERJTl9GSUxFTk8sIGlidWYsIHNpemVvZihpYnVmKSk7CisJCQlpZiAobGVuIDwgMCkKKwkJCQlkaWUoInJlYWQgZXJyb3Igb24gc3RkaW5cbiIpOworCQkJaWYgKGxlbiA9PSAwKQorCQkJCVNURElOLmZkID0gLTE7CisJCQllbHNlIHsKKwkJCQlsZW4gPSBlbmNvZGVfZGF0YShzc2wsIGlidWYsIGxlbik7CisJCQkJaWYgKGxlbikgeworCQkJCQlyYyA9IE1BVFJJWFNTTF9SRVFVRVNUX1NFTkQ7CitkYmcoInJjPSVkXG4iLCByYyk7CisJCQkJCWdvdG8gYWdhaW47CisJCQkJfQorCQkJfQorCQl9CisgcmVhZF9uZXR3b3JrOgorCQlpZiAoTkVUV09SS19SRUFEWSgpKSB7CisJCQlkYmcoIiVzJXMlc1xuIiwKKwkJCQkocGZkWzFdLnJldmVudHMgJiBQT0xMSU4pICA/ICJQT0xMSU4iICA6ICIiLAorCQkJCShwZmRbMV0ucmV2ZW50cyAmIFBPTExFUlIpID8gInxQT0xMRVJSIiA6ICIiLAorCQkJCShwZmRbMV0ucmV2ZW50cyAmIFBPTExIVVApID8gInxQT0xMSFVQIiA6ICIiCisJCQkpOworCQkJbGVuID0gbWF0cml4U3NsR2V0UmVhZGJ1Zihzc2wsICZidWYpOworCQkJaWYgKGxlbiA8PSAwKQorCQkJCWRpZSgibWF0cml4U3NsR2V0UmVhZGJ1ZlxuIik7CisJCQlkYmcoInJlYWRpbmcgbmV0IHVwIHRvICVkXG4iLCBsZW4pOworCQkJbGVuID0gcmVhZChmZCwgYnVmLCBsZW4pOworCQkJZGJnKCJyZWFkaW5nIG5ldDolZFxuIiwgbGVuKTsKKwkJCWlmIChsZW4gPCAwKQorCQkJCWRpZSgicmVhZCBlcnJvciBvbiBuZXR3b3JrXG4iKTsKKwkJCWlmIChsZW4gPT0gMCkgLyplb2YqLworCQkJCU5FVFdPUksuZmQgPSAtMTsKKwkJCWxlbjMydSA9IGxlbjsKKwkJCXJjID0gbWF0cml4U3NsUmVjZWl2ZWREYXRhKHNzbCwgbGVuLCAmYnVmLCAmbGVuMzJ1KTsKK2RiZygibWF0cml4U3NsUmVjZWl2ZWREYXRhOnJjPSVkXG4iLCByYyk7CisJCQlsZW4gPSBsZW4zMnU7CisJCQlpZiAocmMgPCAwKQorCQkJCWRpZSgibWF0cml4U3NsUmVjZWl2ZWREYXRhXG4iKTsKKwkJfQorCQlnb3RvIGFnYWluOworCisJY2FzZSBNQVRSSVhTU0xfQVBQX0RBVEE6CisJCWRiZygiTUFUUklYU1NMX0FQUF9EQVRBOiB3cml0aW5nIHN0ZG91dFxuIik7CisJCWRvIHsKKwkJCWlmIChmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sIGJ1ZiwgbGVuKSAhPSBsZW4pCisJCQkJZGllKCJ3cml0ZSB0byBzdGRvdXRcbiIpOworCQkJbGVuMzJ1ID0gbGVuOworCQkJcmMgPSBtYXRyaXhTc2xQcm9jZXNzZWREYXRhKHNzbCwgJmJ1ZiwgJmxlbjMydSk7CisvL3RoaXMgd2FzIHNlZW4gcmV0dXJuaW5nIHJjPTA6CitkYmcoIm1hdHJpeFNzbFByb2Nlc3NlZERhdGE6cmM9JWRcbiIsIHJjKTsKKwkJCWxlbiA9IGxlbjMydTsKKwkJfSB3aGlsZSAocmMgPT0gTUFUUklYU1NMX0FQUF9EQVRBKTsKKwkJaWYgKHBmZFsxXS5mZCA9PSAtMSkgeworCQkJLyogQWxyZWFkeSBzYXcgRU9GIG9uIG5ldHdvcmssIGFuZCB3ZSBwcm9jZXNzZWQKKwkJCSAqIGFuZCB3cm90ZSBvdXQgYWxsIHNzbCBkYXRhLiBTaWduYWwgaXQ6CisJCQkgKi8KKwkJCWNsb3NlKFNURE9VVF9GSUxFTk8pOworCQl9CisJCWdvdG8gYWdhaW47CisKKwljYXNlIE1BVFJJWFNTTF9SRVFVRVNUX1JFQ1Y6CisJCWRiZygiTUFUUklYU1NMX1JFUVVFU1RfUkVDVlxuIik7CisJCXdhaXRfZm9yX2lucHV0KCk7CisJCWdvdG8gcmVhZF9uZXR3b3JrOworCisJY2FzZSBNQVRSSVhTU0xfUkVDRUlWRURfQUxFUlQ6CisJCWRiZygiTUFUUklYU1NMX1JFQ0VJVkVEX0FMRVJUXG4iKTsKKwkJLyogVGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGJ1ZmZlciBpcyB0aGUgbGV2ZWwgKi8KKwkJLyogVGhlIHNlY29uZCBieXRlIGlzIHRoZSBkZXNjcmlwdGlvbiAqLworCQlpZiAoYnVmWzBdID09IFNTTF9BTEVSVF9MRVZFTF9GQVRBTCkKKwkJCWRpZSgiRmF0YWwgYWxlcnRcbiIpOworCQkvKiBDbG9zdXJlIGFsZXJ0IGlzIG5vcm1hbCAoYW5kIGJlc3QpIHdheSB0byBjbG9zZSAqLworCQlpZiAoYnVmWzFdID09IFNTTF9BTEVSVF9DTE9TRV9OT1RJRlkpCisJCQljbG9zZV9jb25uX2FuZF9leGl0KHNzbCwgZmQpOworCQlkaWUoIldhcm5pbmcgYWxlcnRcbiIpOworCQlsZW4zMnUgPSBsZW47CisJCXJjID0gbWF0cml4U3NsUHJvY2Vzc2VkRGF0YShzc2wsICZidWYsICZsZW4zMnUpOworZGJnKCJtYXRyaXhTc2xQcm9jZXNzZWREYXRhOnJjPSVkXG4iLCByYyk7CisJCWxlbiA9IGxlbjMydTsKKwkJZ290byBhZ2FpbjsKKworCWRlZmF1bHQ6CisJCS8qIElmIHJjIDwgMCBpdCBpcyBhbiBlcnJvciAqLworCQlkaWUoImJhZCByYzolZFxuIiwgcmMpOworCX0KK30KKworc3RhdGljIHNzbEtleXNfdCogbWFrZV9rZXlzKHZvaWQpCit7CisJaW50IHJjLCBDQXN0cmVhbUxlbjsKKwljaGFyICpDQXN0cmVhbTsKKwlzc2xLZXlzX3QgKmtleXM7CisKKwlpZiAobWF0cml4U3NsTmV3S2V5cygma2V5cykgPCAwKQorCQlkaWUoIm1hdHJpeFNzbE5ld0tleXNcbiIpOworCisjaWZkZWYgVVNFX0hFQURFUl9LRVlTCisJLyoKKwkgKiBJbi1tZW1vcnkgYmFzZWQga2V5cworCSAqIEJ1aWxkIHRoZSBDQSBsaXN0IGZpcnN0IGZvciBwb3RlbnRpYWwgY2xpZW50IGF1dGggdXNhZ2UKKwkgKi8KKwlDQXN0cmVhbSA9IE5VTEw7CisJQ0FzdHJlYW1MZW4gPSBzaXplb2YoUlNBQ0FTKTsKKwlpZiAoQ0FzdHJlYW1MZW4gPiAwKSB7CisJCUNBc3RyZWFtID0gcHNNYWxsb2MoTlVMTCwgQ0FzdHJlYW1MZW4pOworCQltZW1jcHkoQ0FzdHJlYW0sIFJTQUNBUywgc2l6ZW9mKFJTQUNBUykpOworCX0KKworICNpZmRlZiBJRF9SU0EKKwlyYyA9IG1hdHJpeFNzbExvYWRSc2FLZXlzTWVtKGtleXMsIFJTQTIwNDgsIHNpemVvZihSU0EyMDQ4KSwKKwkJCVJTQTIwNDhLRVksIHNpemVvZihSU0EyMDQ4S0VZKSwgKHVuc2lnbmVkIGNoYXIqKUNBc3RyZWFtLAorCQkJQ0FzdHJlYW1MZW4pOworCWlmIChyYyA8IDApCisJCWRpZSgibWF0cml4U3NsTG9hZFJzYUtleXNNZW1cbiIpOworICNlbmRpZgorCisJaWYgKENBc3RyZWFtKQorCQlwc0ZyZWUoQ0FzdHJlYW0pOworI2VuZGlmIC8qIFVTRV9IRUFERVJfS0VZUyAqLworCXJldHVybiBrZXlzOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGZkOworCWNoYXIgKmZkX3N0cjsKKworCWlmICghYXJndlsxXSkKKwkJZGllKCJTeW50YXggZXJyb3JcbiIpOworCWlmIChhcmd2WzFdWzBdICE9ICctJykKKwkJZGllKCJTeW50YXggZXJyb3JcbiIpOworCWlmIChhcmd2WzFdWzFdICE9ICdkJykKKwkJZGllKCJTeW50YXggZXJyb3JcbiIpOworCWZkX3N0ciA9IGFyZ3ZbMV0gKyAyOworCWlmICghZmRfc3RyWzBdKQorCQlmZF9zdHIgPSBhcmd2WzJdOworCWlmICghZmRfc3RyIHx8IGZkX3N0clswXSA8ICcwJyB8fCBmZF9zdHJbMF0gPiAnOScpCisJCWRpZSgiU3ludGF4IGVycm9yXG4iKTsKKworCWZkID0gYXRvaShmZF9zdHIpOworCWlmIChmZCA8IDMpCisJCWRpZSgiU3ludGF4IGVycm9yXG4iKTsKKworCWlmIChtYXRyaXhTc2xPcGVuKCkgPCAwKQorCQlkaWUoIm1hdHJpeFNzbE9wZW5cbiIpOworCisJZG9faW9fdW50aWxfZW9mX2FuZF9leGl0KGZkLCBtYWtlX2tleXMoKSk7CisJLyogZG9lcyBub3QgcmV0dXJuICovCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvc3NsX2hlbHBlci9zc2xfaGVscGVyLnNoIGIvbmV0d29ya2luZy9zc2xfaGVscGVyL3NzbF9oZWxwZXIuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGM1MmRlNwotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvc3NsX2hlbHBlci9zc2xfaGVscGVyLnNoCkBAIC0wLDAgKzEsMTEgQEAKKyMhL2Jpbi9zaAorCisjIEkgdXNlIHRoaXMgdG8gYnVpbGQgc3RhdGljIHVjbGliYyBiYXNlZCBiaW5hcnkgdXNpbmcgQWJvcmlnaW5hbCBMaW51eCB0b29sY2hhaW46CitQUkVGSVg9eDg2XzY0LQorU1RBVElDPS1zdGF0aWMKKyMgU3RhbmRhcmQgYnVpbGQ6CitQUkVGSVg9IiIKK1NUQVRJQz0iIgorCiske1BSRUZJWH1nY2MgLU9zIC1EUE9TSVggLUkuLiAtSS4uL3NhbXBsZUNlcnRzIC1XYWxsIC1jIHNzbF9oZWxwZXIuYyAtbyBzc2xfaGVscGVyLm8KKyR7UFJFRklYfWdjYyAkU1RBVElDIHNzbF9oZWxwZXIubyAuLi9saWJtYXRyaXhzc2wuYSAtbGMgLi4vbGlibWF0cml4c3NsLmEgLW8gc3NsX2hlbHBlcgpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy90Yy5jIGIvbmV0d29ya2luZy90Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZTJlODMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3RjLmMKQEAgLTAsMCArMSw1NjIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQXV0aG9yczogQWxleGV5IEt1em5ldHNvdiwgPGt1em5ldEBtczIuaW5yLmFjLnJ1PgorICoKKyAqIEJlcm5oYXJkIFJldXRuZXItRmlzY2hlciBhZGp1c3RlZCBmb3IgYnVzeWJveAorICovCisKKy8vdXNhZ2U6I2RlZmluZSB0Y190cml2aWFsX3VzYWdlCisvKiAvL3VzYWdlOiAiW09QVElPTlNdIE9CSkVDVCBDTUQgW2RldiBTVFJJTkddIiAqLworLy91c2FnZToJIk9CSkVDVCBDTUQgW2RldiBTVFJJTkddIgorLy91c2FnZTojZGVmaW5lIHRjX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOgkiT0JKRUNUOiB7cWRpc2N8Y2xhc3N8ZmlsdGVyfVxuIgorLy91c2FnZToJIkNNRDoge2FkZHxkZWx8Y2hhbmdlfHJlcGxhY2V8c2hvd31cbiIKKy8vdXNhZ2U6CSJcbiIKKy8vdXNhZ2U6CSJxZGlzYyBbIGhhbmRsZSBRSEFORExFIF0gWyByb290IHwiSUZfRkVBVFVSRV9UQ19JTkdSRVNTKCIgaW5ncmVzcyB8IikiIHBhcmVudCBDTEFTU0lEIF1cbiIKKy8qIC8vdXNhZ2U6ICJbIGVzdGltYXRvciBJTlRFUlZBTCBUSU1FX0NPTlNUQU5UIF1cbiIgKi8KKy8vdXNhZ2U6CSIJWyBbIFFESVNDX0tJTkQgXSBbIGhlbHAgfCBPUFRJT05TIF0gXVxuIgorLy91c2FnZToJIglRRElTQ19LSU5EIDo9IHsgW3B8Yl1maWZvIHwgdGJmIHwgcHJpbyB8IGNicSB8IHJlZCB8IGV0Yy4gfVxuIgorLy91c2FnZToJInFkaXNjIHNob3cgWyBkZXYgU1RSSU5HIF0iSUZfRkVBVFVSRV9UQ19JTkdSRVNTKCIgW2luZ3Jlc3NdIikiXG4iCisvL3VzYWdlOgkiY2xhc3MgWyBjbGFzc2lkIENMQVNTSUQgXSBbIHJvb3QgfCBwYXJlbnQgQ0xBU1NJRCBdXG4iCisvL3VzYWdlOgkiCVsgWyBRRElTQ19LSU5EIF0gWyBoZWxwIHwgT1BUSU9OUyBdIF1cbiIKKy8vdXNhZ2U6CSJjbGFzcyBzaG93IFsgZGV2IFNUUklORyBdIFsgcm9vdCB8IHBhcmVudCBDTEFTU0lEIF1cbiIKKy8vdXNhZ2U6CSJmaWx0ZXIgWyBwcmVmIFBSSU8gXSBbIHByb3RvY29sIFBST1RPIF1cbiIKKy8qIC8vdXNhZ2U6ICJcdFsgZXN0aW1hdG9yIElOVEVSVkFMIFRJTUVfQ09OU1RBTlQgXVxuIiAqLworLy91c2FnZToJIglbIHJvb3QgfCBjbGFzc2lkIENMQVNTSUQgXSBbIGhhbmRsZSBGSUxURVJJRCBdXG4iCisvL3VzYWdlOgkiCVsgWyBGSUxURVJfVFlQRSBdIFsgaGVscCB8IE9QVElPTlMgXSBdXG4iCisvL3VzYWdlOgkiZmlsdGVyIHNob3cgWyBkZXYgU1RSSU5HIF0gWyByb290IHwgcGFyZW50IENMQVNTSUQgXSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpbmNsdWRlICJsaWJpcHJvdXRlL3V0aWxzLmgiCisjaW5jbHVkZSAibGliaXByb3V0ZS9pcF9jb21tb24uaCIKKyNpbmNsdWRlICJsaWJpcHJvdXRlL3J0X25hbWVzLmgiCisjaW5jbHVkZSA8bGludXgvcGt0X3NjaGVkLmg+IC8qIGZvciB0aGUgVENfSF8qIG1hY3JvcyAqLworCisjZGVmaW5lIHBhcnNlX3J0YXR0cl9uZXN0ZWQodGIsIG1heCwgcnRhKSBcCisJKHBhcnNlX3J0YXR0cigodGIpLCAobWF4KSwgUlRBX0RBVEEocnRhKSwgUlRBX1BBWUxPQUQocnRhKSkpCisKKy8qIG51bGxpZmllcyB0YiBvbiBlcnJvciAqLworI2RlZmluZSBfX3BhcnNlX3J0YXR0cl9uZXN0ZWRfY29tcGF0KHRiLCBtYXgsIHJ0YSwgbGVuKSBcCisJKHtpZiAoKFJUQV9QQVlMT0FEKHJ0YSkgPj0gbGVuKSAmJiBcCisJCSAoUlRBX1BBWUxPQUQocnRhKSA+PSBSVEFfQUxJR04obGVuKSArIHNpemVvZihzdHJ1Y3QgcnRhdHRyKSkpIHsgXAorCQkJcnRhID0gUlRBX0RBVEEocnRhKSArIFJUQV9BTElHTihsZW4pOyBcCisJCQlwYXJzZV9ydGF0dHJfbmVzdGVkKHRiLCBtYXgsIHJ0YSk7IFwKKwkgIH0gZWxzZSBcCisJCQltZW1zZXQodGIsIDAsIHNpemVvZihzdHJ1Y3QgcnRhdHRyICopICogKG1heCArIDEpKTsgXAorCX0pCisKKyNkZWZpbmUgcGFyc2VfcnRhdHRyX25lc3RlZF9jb21wYXQodGIsIG1heCwgcnRhLCBkYXRhLCBsZW4pIFwKKwkoe2RhdGEgPSBSVEFfUEFZTE9BRChydGEpID49IGxlbiA/IFJUQV9EQVRBKHJ0YSkgOiBOVUxMOyBcCisJX19wYXJzZV9ydGF0dHJfbmVzdGVkX2NvbXBhdCh0YiwgbWF4LCBydGEsIGxlbik7IH0pCisKKyNkZWZpbmUgc2hvd19kZXRhaWxzICgwKSAvKiBub3QgaW1wbGVtZW50ZWQuIERvZXMgYW55b25lIG5lZWQgaXQ/ICovCisjZGVmaW5lIHVzZV9pZWMgKDApIC8qIG5vdCBjdXJyZW50bHkgZG9jdW1lbnRlZCBpbiB0aGUgdXBzdHJlYW0gbWFucGFnZSAqLworCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlpbnQgZmlsdGVyX2lmaW5kZXg7CisJdWludDMyX3QgZmlsdGVyX3FkaXNjOworCXVpbnQzMl90IGZpbHRlcl9wYXJlbnQ7CisJdWludDMyX3QgZmlsdGVyX3ByaW87CisJdWludDMyX3QgZmlsdGVyX3Byb3RvOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKK3N0cnVjdCBCVUdfR190b29fYmlnIHsKKwljaGFyIEJVR19HX3Rvb19iaWdbc2l6ZW9mKEcpIDw9IENPTU1PTl9CVUZTSVpFID8gMSA6IC0xXTsKK307CisjZGVmaW5lIGZpbHRlcl9pZmluZGV4IChHLmZpbHRlcl9pZmluZGV4KQorI2RlZmluZSBmaWx0ZXJfcWRpc2MgKEcuZmlsdGVyX3FkaXNjKQorI2RlZmluZSBmaWx0ZXJfcGFyZW50IChHLmZpbHRlcl9wYXJlbnQpCisjZGVmaW5lIGZpbHRlcl9wcmlvIChHLmZpbHRlcl9wcmlvKQorI2RlZmluZSBmaWx0ZXJfcHJvdG8gKEcuZmlsdGVyX3Byb3RvKQorI2RlZmluZSBJTklUX0coKSBkbyB7IH0gd2hpbGUgKDApCisKKy8qIEFsbG9jYXRlcyBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSBuYW1lIG9mIGEgY2xhc3MgaWQuCisgKiBUaGUgY2FsbGVyIG11c3QgZnJlZSB0aGUgcmV0dXJuZWQgbWVtb3J5LiAgKi8KK3N0YXRpYyBjaGFyKiBwcmludF90Y19jbGFzc2lkKHVpbnQzMl90IGNpZCkKK3sKKyNpZiAwIC8qIElNUE9TU0lCTEUgKi8KKwlpZiAoY2lkID09IFRDX0hfUk9PVCkKKwkJcmV0dXJuIHhhc3ByaW50Zigicm9vdCIpOworCWVsc2UKKyNlbmRpZgorCWlmIChjaWQgPT0gVENfSF9VTlNQRUMpCisJCXJldHVybiB4YXNwcmludGYoIm5vbmUiKTsKKwllbHNlIGlmIChUQ19IX01BSihjaWQpID09IDApCisJCXJldHVybiB4YXNwcmludGYoIjoleCIsIFRDX0hfTUlOKGNpZCkpOworCWVsc2UgaWYgKFRDX0hfTUlOKGNpZCkgPT0gMCkKKwkJcmV0dXJuIHhhc3ByaW50ZigiJXg6IiwgVENfSF9NQUooY2lkKT4+MTYpOworCWVsc2UKKwkJcmV0dXJuIHhhc3ByaW50ZigiJXg6JXgiLCBUQ19IX01BSihjaWQpPj4xNiwgVENfSF9NSU4oY2lkKSk7Cit9CisKKy8qIEdldCBhIHFkaXNjIGhhbmRsZS4gIFJldHVybiAwIG9uIHN1Y2Nlc3MsICEwIG90aGVyd2lzZS4gICovCitzdGF0aWMgaW50IGdldF9xZGlzY19oYW5kbGUodWludDMyX3QgKmgsIGNvbnN0IGNoYXIgKnN0cikgeworCXVpbnQzMl90IG1hajsKKwljaGFyICpwOworCisJbWFqID0gVENfSF9VTlNQRUM7CisJaWYgKCFzdHJjbXAoc3RyLCAibm9uZSIpKQorCQlnb3RvIG9rOworCW1haiA9IHN0cnRvdWwoc3RyLCAmcCwgMTYpOworCWlmIChwID09IHN0cikKKwkJcmV0dXJuIDE7CisJbWFqIDw8PSAxNjsKKwlpZiAoKnAgIT0gJzonICYmICpwICE9ICdcMCcpCisJCXJldHVybiAxOworIG9rOgorCSpoID0gbWFqOworCXJldHVybiAwOworfQorCisvKiBHZXQgY2xhc3MgSUQuICBSZXR1cm4gMCBvbiBzdWNjZXNzLCAhMCBvdGhlcndpc2UuICAqLworc3RhdGljIGludCBnZXRfdGNfY2xhc3NpZCh1aW50MzJfdCAqaCwgY29uc3QgY2hhciAqc3RyKSB7CisJdWludDMyX3QgbWFqLCBtaW47CisJY2hhciAqcDsKKworCW1haiA9IFRDX0hfUk9PVDsKKwlpZiAoIXN0cmNtcChzdHIsICJyb290IikpCisJCWdvdG8gb2s7CisJbWFqID0gVENfSF9VTlNQRUM7CisJaWYgKCFzdHJjbXAoc3RyLCAibm9uZSIpKQorCQlnb3RvIG9rOworCW1haiA9IHN0cnRvdWwoc3RyLCAmcCwgMTYpOworCWlmIChwID09IHN0cikgeworCQlpZiAoKnAgIT0gJzonKQorCQkJcmV0dXJuIDE7CisJCW1haiA9IDA7CisJfQorCWlmICgqcCA9PSAnOicpIHsKKwkJaWYgKG1haiA+PSAoMTw8MTYpKQorCQkJcmV0dXJuIDE7CisJCW1haiA8PD0gMTY7CisJCXN0ciA9IHAgKyAxOworCQltaW4gPSBzdHJ0b3VsKHN0ciwgJnAsIDE2KTsKKy8vRklYTUU6IGNoZWNrIGZvciAiIiB0b28/CisJCWlmICgqcCAhPSAnXDAnIHx8IG1pbiA+PSAoMTw8MTYpKQorCQkJcmV0dXJuIDE7CisJCW1haiB8PSBtaW47CisJfSBlbHNlIGlmICgqcCAhPSAwKQorCQlyZXR1cm4gMTsKKyBvazoKKwkqaCA9IG1hajsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfcmF0ZShjaGFyICpidWYsIGludCBsZW4sIHVpbnQzMl90IHJhdGUpCit7CisJZG91YmxlIHRtcCA9IChkb3VibGUpcmF0ZSo4OworCisJaWYgKHVzZV9pZWMpIHsKKwkJaWYgKHRtcCA+PSAxMDAwKjEwMjQqMTAyNCkKKwkJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJS4wZk1pYml0IiwgdG1wLygxMDI0KjEwMjQpKTsKKwkJZWxzZSBpZiAodG1wID49IDEwMDAqMTAyNCkKKwkJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJS4wZktpYml0IiwgdG1wLzEwMjQpOworCQllbHNlCisJCQlzbnByaW50ZihidWYsIGxlbiwgIiUuMGZiaXQiLCB0bXApOworCX0gZWxzZSB7CisJCWlmICh0bXAgPj0gMTAwMCoxMDAwMDAwKQorCQkJc25wcmludGYoYnVmLCBsZW4sICIlLjBmTWJpdCIsIHRtcC8xMDAwMDAwKTsKKwkJZWxzZSBpZiAodG1wID49IDEwMDAqMTAwMCkKKwkJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJS4wZktiaXQiLCB0bXAvMTAwMCk7CisJCWVsc2UKKwkJCXNucHJpbnRmKGJ1ZiwgbGVuLCAiJS4wZmJpdCIsICB0bXApOworCX0KK30KKworLyogVGhpcyBpcyAicGZpZm9fZmFzdCIuICAqLworc3RhdGljIGludCBwcmlvX3BhcnNlX29wdChpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgcHJpb19wcmludF9vcHQoc3RydWN0IHJ0YXR0ciAqb3B0KQoreworCWludCBpOworCXN0cnVjdCB0Y19wcmlvX3FvcHQgKnFvcHQ7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX1BSSU9fTUFYKzFdOworCisJaWYgKG9wdCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlwYXJzZV9ydGF0dHJfbmVzdGVkX2NvbXBhdCh0YiwgVENBX1BSSU9fTUFYLCBvcHQsIHFvcHQsIHNpemVvZigqcW9wdCkpOworCWlmICh0YiA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKwlwcmludGYoImJhbmRzICV1IHByaW9tYXAgIiwgcW9wdC0+YmFuZHMpOworCWZvciAoaT0wOyBpPD1UQ19QUklPX01BWDsgaSsrKQorCQlwcmludGYoIiAlZCIsIHFvcHQtPnByaW9tYXBbaV0pOworCisJaWYgKHRiW1RDQV9QUklPX01RXSkKKwkJcHJpbnRmKCIgbXVsdGlxdWV1ZTogbyVzICIsCisJCSAgICAqKHVuc2lnbmVkIGNoYXIgKilSVEFfREFUQSh0YltUQ0FfUFJJT19NUV0pID8gIm4iIDogImZmIik7CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2xhc3MgQmFzZWQgUXVldWUgKi8KK3N0YXRpYyBpbnQgY2JxX3BhcnNlX29wdChpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBubG1zZ2hkciAqbikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbnQgY2JxX3ByaW50X29wdChzdHJ1Y3QgcnRhdHRyICpvcHQpCit7CisJc3RydWN0IHJ0YXR0ciAqdGJbVENBX0NCUV9NQVgrMV07CisJc3RydWN0IHRjX3JhdGVzcGVjICpyID0gTlVMTDsKKwlzdHJ1Y3QgdGNfY2JxX2xzc29wdCAqbHNzID0gTlVMTDsKKwlzdHJ1Y3QgdGNfY2JxX3dycm9wdCAqd3JyID0gTlVMTDsKKwlzdHJ1Y3QgdGNfY2JxX2ZvcHQgKmZvcHQgPSBOVUxMOworCXN0cnVjdCB0Y19jYnFfb3ZsICpvdmwgPSBOVUxMOworCWNvbnN0IGNoYXIgKmNvbnN0IGVycm9yID0gIkNCUTogdG9vIHNob3J0ICVzIG9wdCI7CisJY2hhciBidWZbNjRdOworCisJaWYgKG9wdCA9PSBOVUxMKQorCQlnb3RvIGRvbmU7CisJcGFyc2VfcnRhdHRyX25lc3RlZCh0YiwgVENBX0NCUV9NQVgsIG9wdCk7CisKKwlpZiAodGJbVENBX0NCUV9SQVRFXSkgeworCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX0NCUV9SQVRFXSkgPCBzaXplb2YoKnIpKQorCQkJYmJfZXJyb3JfbXNnKGVycm9yLCAicmF0ZSIpOworCQllbHNlCisJCQlyID0gUlRBX0RBVEEodGJbVENBX0NCUV9SQVRFXSk7CisJfQorCWlmICh0YltUQ0FfQ0JRX0xTU09QVF0pIHsKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9DQlFfTFNTT1BUXSkgPCBzaXplb2YoKmxzcykpCisJCQliYl9lcnJvcl9tc2coZXJyb3IsICJsc3MiKTsKKwkJZWxzZQorCQkJbHNzID0gUlRBX0RBVEEodGJbVENBX0NCUV9MU1NPUFRdKTsKKwl9CisJaWYgKHRiW1RDQV9DQlFfV1JST1BUXSkgeworCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX0NCUV9XUlJPUFRdKSA8IHNpemVvZigqd3JyKSkKKwkJCWJiX2Vycm9yX21zZyhlcnJvciwgIndyciIpOworCQllbHNlCisJCQl3cnIgPSBSVEFfREFUQSh0YltUQ0FfQ0JRX1dSUk9QVF0pOworCX0KKwlpZiAodGJbVENBX0NCUV9GT1BUXSkgeworCQlpZiAoUlRBX1BBWUxPQUQodGJbVENBX0NCUV9GT1BUXSkgPCBzaXplb2YoKmZvcHQpKQorCQkJYmJfZXJyb3JfbXNnKGVycm9yLCAiZm9wdCIpOworCQllbHNlCisJCQlmb3B0ID0gUlRBX0RBVEEodGJbVENBX0NCUV9GT1BUXSk7CisJfQorCWlmICh0YltUQ0FfQ0JRX09WTF9TVFJBVEVHWV0pIHsKKwkJaWYgKFJUQV9QQVlMT0FEKHRiW1RDQV9DQlFfT1ZMX1NUUkFURUdZXSkgPCBzaXplb2YoKm92bCkpCisJCQliYl9lcnJvcl9tc2coIkNCUTogdG9vIHNob3J0IG92ZXJsaW1pdCBzdHJhdGVneSAldS8ldSIsCisJCQkJKHVuc2lnbmVkKSBSVEFfUEFZTE9BRCh0YltUQ0FfQ0JRX09WTF9TVFJBVEVHWV0pLAorCQkJCSh1bnNpZ25lZCkgc2l6ZW9mKCpvdmwpKTsKKwkJZWxzZQorCQkJb3ZsID0gUlRBX0RBVEEodGJbVENBX0NCUV9PVkxfU1RSQVRFR1ldKTsKKwl9CisKKwlpZiAocikgeworCQlwcmludF9yYXRlKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHItPnJhdGUpOworCQlwcmludGYoInJhdGUgJXMgIiwgYnVmKTsKKwkJaWYgKHNob3dfZGV0YWlscykgeworCQkJcHJpbnRmKCJjZWxsICV1YiAiLCAxPDxyLT5jZWxsX2xvZyk7CisJCQlpZiAoci0+bXB1KQorCQkJCXByaW50ZigibXB1ICV1YiAiLCByLT5tcHUpOworCQkJaWYgKHItPm92ZXJoZWFkKQorCQkJCXByaW50Zigib3ZlcmhlYWQgJXViICIsIHItPm92ZXJoZWFkKTsKKwkJfQorCX0KKwlpZiAobHNzICYmIGxzcy0+ZmxhZ3MpIHsKKwkJYm9vbCBjb21tYSA9IGZhbHNlOworCQliYl9wdXRjaGFyKCcoJyk7CisJCWlmIChsc3MtPmZsYWdzJlRDRl9DQlFfTFNTX0JPVU5ERUQpIHsKKwkJCXByaW50ZigiYm91bmRlZCIpOworCQkJY29tbWEgPSB0cnVlOworCQl9CisJCWlmIChsc3MtPmZsYWdzJlRDRl9DQlFfTFNTX0lTT0xBVEVEKSB7CisJCQlpZiAoY29tbWEpCisJCQkJYmJfcHV0Y2hhcignLCcpOworCQkJcHJpbnRmKCJpc29sYXRlZCIpOworCQl9CisJCXByaW50ZigiKSAiKTsKKwl9CisJaWYgKHdycikgeworCQlpZiAod3JyLT5wcmlvcml0eSAhPSBUQ19DQlFfTUFYUFJJTykKKwkJCXByaW50ZigicHJpbyAldSIsIHdyci0+cHJpb3JpdHkpOworCQllbHNlCisJCQlwcmludGYoInByaW8gbm8tdHJhbnNtaXQiKTsKKwkJaWYgKHNob3dfZGV0YWlscykgeworCQkJcHJpbnRmKCIvJXUgIiwgd3JyLT5jcHJpb3JpdHkpOworCQkJaWYgKHdyci0+d2VpZ2h0ICE9IDEpIHsKKwkJCQlwcmludF9yYXRlKGJ1Ziwgc2l6ZW9mKGJ1ZiksIHdyci0+d2VpZ2h0KTsKKwkJCQlwcmludGYoIndlaWdodCAlcyAiLCBidWYpOworCQkJfQorCQkJaWYgKHdyci0+YWxsb3QpCisJCQkJcHJpbnRmKCJhbGxvdCAldWIgIiwgd3JyLT5hbGxvdCk7CisJCX0KKwl9CisgZG9uZToKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwcmludF9xZGlzYyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobyBVTlVTRURfUEFSQU0sCisJCQkJCQlzdHJ1Y3Qgbmxtc2doZHIgKmhkciwgdm9pZCAqYXJnIFVOVVNFRF9QQVJBTSkKK3sKKwlzdHJ1Y3QgdGNtc2cgKm1zZyA9IE5MTVNHX0RBVEEoaGRyKTsKKwlpbnQgbGVuID0gaGRyLT5ubG1zZ19sZW47CisJc3RydWN0IHJ0YXR0ciAqIHRiW1RDQV9NQVgrMV07CisJY2hhciAqbmFtZTsKKworCWlmIChoZHItPm5sbXNnX3R5cGUgIT0gUlRNX05FV1FESVNDICYmIGhkci0+bmxtc2dfdHlwZSAhPSBSVE1fREVMUURJU0MpIHsKKwkJLyogYmJfZXJyb3JfbXNnKCJub3QgYSBxZGlzYyIpOyAqLworCQlyZXR1cm4gMDsgLyogPz8/IG1pbWljIHVwc3RyZWFtOyBzaG91bGQgcGVyaGFwcyByZXR1cm4gLTEgKi8KKwl9CisJbGVuIC09IE5MTVNHX0xFTkdUSChzaXplb2YoKm1zZykpOworCWlmIChsZW4gPCAwKSB7CisJCS8qIGJiX2Vycm9yX21zZygid3JvbmcgbGVuICVkIiwgbGVuKTsgKi8KKwkJcmV0dXJuIC0xOworCX0KKwkvKiBub3QgdGhlIGRlc2lyZWQgaW50ZXJmYWNlPyAqLworCWlmIChmaWx0ZXJfaWZpbmRleCAmJiBmaWx0ZXJfaWZpbmRleCAhPSBtc2ctPnRjbV9pZmluZGV4KQorCQlyZXR1cm4gMDsKKwltZW1zZXQgKHRiLCAwLCBzaXplb2YodGIpKTsKKwlwYXJzZV9ydGF0dHIodGIsIFRDQV9NQVgsIFRDQV9SVEEobXNnKSwgbGVuKTsKKwlpZiAodGJbVENBX0tJTkRdID09IE5VTEwpIHsKKwkJLyogYmJfZXJyb3JfbXNnKCIlczogTlVMTCBraW5kIiwgInFkaXNjIik7ICovCisJCXJldHVybiAtMTsKKwl9CisJaWYgKGhkci0+bmxtc2dfdHlwZSA9PSBSVE1fREVMUURJU0MpCisJCXByaW50ZigiZGVsZXRlZCAiKTsKKwluYW1lID0gKGNoYXIqKVJUQV9EQVRBKHRiW1RDQV9LSU5EXSk7CisJcHJpbnRmKCJxZGlzYyAlcyAleDogIiwgbmFtZSwgbXNnLT50Y21faGFuZGxlPj4xNik7CisJaWYgKGZpbHRlcl9pZmluZGV4ID09IDApCisJCXByaW50ZigiZGV2ICVzICIsIGxsX2luZGV4X3RvX25hbWUobXNnLT50Y21faWZpbmRleCkpOworCWlmIChtc2ctPnRjbV9wYXJlbnQgPT0gVENfSF9ST09UKQorCQlwcmludGYoInJvb3QgIik7CisJZWxzZSBpZiAobXNnLT50Y21fcGFyZW50KSB7CisJCWNoYXIgKmNsYXNzaWQgPSBwcmludF90Y19jbGFzc2lkKG1zZy0+dGNtX3BhcmVudCk7CisJCXByaW50ZigicGFyZW50ICVzICIsIGNsYXNzaWQpOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQlmcmVlKGNsYXNzaWQpOworCX0KKwlpZiAobXNnLT50Y21faW5mbyAhPSAxKQorCQlwcmludGYoInJlZmNudCAlZCAiLCBtc2ctPnRjbV9pbmZvKTsKKwlpZiAodGJbVENBX09QVElPTlNdKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyIF9xX1tdIEFMSUdOMSA9ICJwZmlmb19mYXN0XDAiImNicVwwIjsKKwkJaW50IHFxcSA9IGluZGV4X2luX3N0cmluZ3MoX3FfLCBuYW1lKTsKKwkJaWYgKHFxcSA9PSAwKSB7IC8qIHBmaWZvX2Zhc3QgYWthIHByaW8gKi8KKwkJCXByaW9fcHJpbnRfb3B0KHRiW1RDQV9PUFRJT05TXSk7CisJCX0gZWxzZSBpZiAocXFxID09IDEpIHsgLyogY2xhc3MgYmFzZWQgcXVldWluZyAqLworCQkJY2JxX3ByaW50X29wdCh0YltUQ0FfT1BUSU9OU10pOworCQl9IGVsc2UKKwkJCWJiX2Vycm9yX21zZygidW5rbm93biAlcyIsIG5hbWUpOworCX0KKwliYl9wdXRjaGFyKCdcbicpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByaW50X2NsYXNzKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9ubCAqd2hvIFVOVVNFRF9QQVJBTSwKKwkJCQkJCXN0cnVjdCBubG1zZ2hkciAqaGRyLCB2b2lkICphcmcgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCB0Y21zZyAqbXNnID0gTkxNU0dfREFUQShoZHIpOworCWludCBsZW4gPSBoZHItPm5sbXNnX2xlbjsKKwlzdHJ1Y3QgcnRhdHRyICogdGJbVENBX01BWCsxXTsKKwljaGFyICpuYW1lLCAqY2xhc3NpZDsKKworCS8qWFhYIEV2ZW50dWFsbHkgZmFjdG9yIG91dCBjb21tb24gY29kZSAqLworCisJaWYgKGhkci0+bmxtc2dfdHlwZSAhPSBSVE1fTkVXVENMQVNTICYmIGhkci0+bmxtc2dfdHlwZSAhPSBSVE1fREVMVENMQVNTKSB7CisJCS8qIGJiX2Vycm9yX21zZygibm90IGEgY2xhc3MiKTsgKi8KKwkJcmV0dXJuIDA7IC8qID8/PyBtaW1pYyB1cHN0cmVhbTsgc2hvdWxkIHBlcmhhcHMgcmV0dXJuIC0xICovCisJfQorCWxlbiAtPSBOTE1TR19MRU5HVEgoc2l6ZW9mKCptc2cpKTsKKwlpZiAobGVuIDwgMCkgeworCQkvKiBiYl9lcnJvcl9tc2coIndyb25nIGxlbiAlZCIsIGxlbik7ICovCisJCXJldHVybiAtMTsKKwl9CisJLyogbm90IHRoZSBkZXNpcmVkIGludGVyZmFjZT8gKi8KKwlpZiAoZmlsdGVyX3FkaXNjICYmIFRDX0hfTUFKKG1zZy0+dGNtX2hhbmRsZV5maWx0ZXJfcWRpc2MpKQorCQlyZXR1cm4gMDsKKwltZW1zZXQgKHRiLCAwLCBzaXplb2YodGIpKTsKKwlwYXJzZV9ydGF0dHIodGIsIFRDQV9NQVgsIFRDQV9SVEEobXNnKSwgbGVuKTsKKwlpZiAodGJbVENBX0tJTkRdID09IE5VTEwpIHsKKwkJLyogYmJfZXJyb3JfbXNnKCIlczogTlVMTCBraW5kIiwgImNsYXNzIik7ICovCisJCXJldHVybiAtMTsKKwl9CisJaWYgKGhkci0+bmxtc2dfdHlwZSA9PSBSVE1fREVMVENMQVNTKQorCQlwcmludGYoImRlbGV0ZWQgIik7CisKKwluYW1lID0gKGNoYXIqKVJUQV9EQVRBKHRiW1RDQV9LSU5EXSk7CisJY2xhc3NpZCA9ICFtc2ctPnRjbV9oYW5kbGUgPyBOVUxMIDogcHJpbnRfdGNfY2xhc3NpZCgKKwkJCQlmaWx0ZXJfcWRpc2MgPyBUQ19IX01JTihtc2ctPnRjbV9wYXJlbnQpIDogbXNnLT50Y21fcGFyZW50KTsKKwlwcmludGYgKCJjbGFzcyAlcyAlcyIsIG5hbWUsIGNsYXNzaWQpOworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZShjbGFzc2lkKTsKKworCWlmIChmaWx0ZXJfaWZpbmRleCA9PSAwKQorCQlwcmludGYoImRldiAlcyAiLCBsbF9pbmRleF90b19uYW1lKG1zZy0+dGNtX2lmaW5kZXgpKTsKKwlpZiAobXNnLT50Y21fcGFyZW50ID09IFRDX0hfUk9PVCkKKwkJcHJpbnRmKCJyb290ICIpOworCWVsc2UgaWYgKG1zZy0+dGNtX3BhcmVudCkgeworCQljbGFzc2lkID0gcHJpbnRfdGNfY2xhc3NpZChmaWx0ZXJfcWRpc2MgPworCQkJCVRDX0hfTUlOKG1zZy0+dGNtX3BhcmVudCkgOiBtc2ctPnRjbV9wYXJlbnQpOworCQlwcmludGYoInBhcmVudCAlcyAiLCBjbGFzc2lkKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZShjbGFzc2lkKTsKKwl9CisJaWYgKG1zZy0+dGNtX2luZm8pCisJCXByaW50ZigibGVhZiAleCAiLCBtc2ctPnRjbV9pbmZvID4+IDE2KTsKKwkvKiBEbyB0aGF0IGdldF9xZGlzY19raW5kKFJUQV9EQVRBKHRiW1RDQV9LSU5EXSkpLiAgKi8KKwlpZiAodGJbVENBX09QVElPTlNdKSB7CisJCXN0YXRpYyBjb25zdCBjaGFyIF9xX1tdIEFMSUdOMSA9ICJwZmlmb19mYXN0XDAiImNicVwwIjsKKwkJaW50IHFxcSA9IGluZGV4X2luX3N0cmluZ3MoX3FfLCBuYW1lKTsKKwkJaWYgKHFxcSA9PSAwKSB7IC8qIHBmaWZvX2Zhc3QgYWthIHByaW8gKi8KKwkJCS8qIG5vdGhpbmcuICovIC8qcHJpb19wcmludF9vcHQodGJbVENBX09QVElPTlNdKTsqLworCQl9IGVsc2UgaWYgKHFxcSA9PSAxKSB7IC8qIGNsYXNzIGJhc2VkIHF1ZXVpbmcgKi8KKwkJCS8qIGNicV9wcmludF9jb3B0KCkgaXMgaWRlbnRpY2FsIHRvIGNicV9wcmludF9vcHQoKS4gKi8KKwkJCWNicV9wcmludF9vcHQodGJbVENBX09QVElPTlNdKTsKKwkJfSBlbHNlCisJCQliYl9lcnJvcl9tc2coInVua25vd24gJXMiLCBuYW1lKTsKKwl9CisJYmJfcHV0Y2hhcignXG4nKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHByaW50X2ZpbHRlcihjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfbmwgKndobyBVTlVTRURfUEFSQU0sCisJCQkJCQlzdHJ1Y3Qgbmxtc2doZHIgKmhkciwgdm9pZCAqYXJnIFVOVVNFRF9QQVJBTSkKK3sKKwlyZXR1cm4gMDsKK30KKworaW50IHRjX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0Y19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgb2JqZWN0c1tdIEFMSUdOMSA9CisJCSJxZGlzY1wwIiJjbGFzc1wwIiJmaWx0ZXJcMCIKKwkJOworCWVudW0geyBPQkpfcWRpc2MgPSAwLCBPQkpfY2xhc3MsIE9CSl9maWx0ZXIgfTsKKwlzdGF0aWMgY29uc3QgY2hhciBjb21tYW5kc1tdIEFMSUdOMSA9CisJCSJhZGRcMCIiZGVsZXRlXDAiImNoYW5nZVwwIgorCQkibGlua1wwIiAvKiBvbmx5IHFkaXNjICovCisJCSJyZXBsYWNlXDAiCisJCSJzaG93XDAiImxpc3RcMCIKKwkJOworCXN0YXRpYyBjb25zdCBjaGFyIGFyZ3NbXSBBTElHTjEgPQorCQkiZGV2XDAiIC8qIHFkaXNjLCBjbGFzcywgZmlsdGVyICovCisJCSJyb290XDAiIC8qIGNsYXNzLCBmaWx0ZXIgKi8KKwkJInBhcmVudFwwIiAvKiBjbGFzcywgZmlsdGVyICovCisJCSJxZGlzY1wwIiAvKiBjbGFzcyAqLworCQkiaGFuZGxlXDAiIC8qIGNoYW5nZTogcWRpc2MsIGNsYXNzKGNsYXNzaWQpIGxpc3Q6IGZpbHRlciAqLworCQkiY2xhc3NpZFwwIiAvKiBjaGFuZ2U6IGZvciBjbGFzcyB1c2UgImhhbmRsZSIgKi8KKwkJInByZWZlcmVuY2VcMCIicHJpb3JpdHlcMCIicHJvdG9jb2xcMCIgLyogZmlsdGVyICovCisJCTsKKwllbnVtIHsgQ01EX2FkZCA9IDAsIENNRF9kZWwsIENNRF9jaGFuZ2UsIENNRF9saW5rLCBDTURfcmVwbGFjZSwgQ01EX3Nob3cgfTsKKwllbnVtIHsgQVJHX2RldiA9IDAsIEFSR19yb290LCBBUkdfcGFyZW50LCBBUkdfcWRpc2MsCisJCQlBUkdfaGFuZGxlLCBBUkdfY2xhc3NpZCwgQVJHX3ByZWYsIEFSR19wcmlvLCBBUkdfcHJvdG99OworCXN0cnVjdCBydG5sX2hhbmRsZSBydGg7CisJc3RydWN0IHRjbXNnIG1zZzsKKwlpbnQgcmV0LCBvYmosIGNtZCwgYXJnOworCWNoYXIgKmRldiA9IE5VTEw7CisKKwlJTklUX0coKTsKKworCWlmICghKisrYXJndikKKwkJYmJfc2hvd191c2FnZSgpOworCXhydG5sX29wZW4oJnJ0aCk7CisJcmV0ID0gRVhJVF9TVUNDRVNTOworCisJb2JqID0gaW5kZXhfaW5fc3Vic3RyaW5ncyhvYmplY3RzLCAqYXJndisrKTsKKworCWlmIChvYmogPCBPQkpfcWRpc2MpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwlpZiAoISphcmd2KQorCQljbWQgPSBDTURfc2hvdzsgLyogbGlzdCBpcyB0aGUgZGVmYXVsdCAqLworCWVsc2UgeworCQljbWQgPSBpbmRleF9pbl9zdWJzdHJpbmdzKGNvbW1hbmRzLCAqYXJndik7CisJCWlmIChjbWQgPCAwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX2ludmFsaWRfYXJnLCAqYXJndiwgYXBwbGV0X25hbWUpOworCQlhcmd2Kys7CisJfQorCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisJbXNnLnRjbV9mYW1pbHkgPSBBRl9VTlNQRUM7CisJbGxfaW5pdF9tYXAoJnJ0aCk7CisJd2hpbGUgKCphcmd2KSB7CisJCWFyZyA9IGluZGV4X2luX3N1YnN0cmluZ3MoYXJncywgKmFyZ3YpOworCQlpZiAoYXJnID09IEFSR19kZXYpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQlpZiAoZGV2KQorCQkJCWR1cGFyZzIoImRldiIsICphcmd2KTsKKwkJCWRldiA9ICphcmd2Kys7CisJCQltc2cudGNtX2lmaW5kZXggPSB4bGxfbmFtZV90b19pbmRleChkZXYpOworCQkJaWYgKGNtZCA+PSBDTURfc2hvdykKKwkJCQlmaWx0ZXJfaWZpbmRleCA9IG1zZy50Y21faWZpbmRleDsKKwkJfSBlbHNlCisJCWlmICgoYXJnID09IEFSR19xZGlzYyAmJiBvYmogPT0gT0JKX2NsYXNzICYmIGNtZCA+PSBDTURfc2hvdykKKwkJIHx8IChhcmcgPT0gQVJHX2hhbmRsZSAmJiBvYmogPT0gT0JKX3FkaXNjICYmIGNtZCA9PSBDTURfY2hhbmdlKQorCQkpIHsKKwkJCU5FWFRfQVJHKCk7CisJCQkvKiBXZSBkb24ndCBjYXJlIGFib3V0IGR1cGFyZzIoInFkaXNjIGhhbmRsZSIsKmFyZ3YpIGZvciBub3cgKi8KKwkJCWlmIChnZXRfcWRpc2NfaGFuZGxlKCZmaWx0ZXJfcWRpc2MsICphcmd2KSkKKwkJCQlpbnZhcmcoKmFyZ3YsICJxZGlzYyIpOworCQl9IGVsc2UKKwkJaWYgKG9iaiAhPSBPQkpfcWRpc2MKKwkJICYmIChhcmcgPT0gQVJHX3Jvb3QKKwkJICAgIHx8IGFyZyA9PSBBUkdfcGFyZW50CisJCSAgICB8fCAob2JqID09IE9CSl9maWx0ZXIgJiYgYXJnID49IEFSR19wcmVmKQorCQkgICAgKQorCQkpIHsKKwkJCS8qIG5vdGhpbmcgKi8KKwkJfSBlbHNlIHsKKwkJCWludmFyZygqYXJndiwgImNvbW1hbmQiKTsKKwkJfQorCQlORVhUX0FSRygpOworCQlpZiAoYXJnID09IEFSR19yb290KSB7CisJCQlpZiAobXNnLnRjbV9wYXJlbnQpCisJCQkJZHVwYXJnKCJwYXJlbnQiLCAqYXJndik7CisJCQltc2cudGNtX3BhcmVudCA9IFRDX0hfUk9PVDsKKwkJCWlmIChvYmogPT0gT0JKX2ZpbHRlcikKKwkJCQlmaWx0ZXJfcGFyZW50ID0gVENfSF9ST09UOworCQl9IGVsc2UgaWYgKGFyZyA9PSBBUkdfcGFyZW50KSB7CisJCQl1aW50MzJfdCBoYW5kbGU7CisJCQlpZiAobXNnLnRjbV9wYXJlbnQpCisJCQkJZHVwYXJnKCphcmd2LCAicGFyZW50Iik7CisJCQlpZiAoZ2V0X3RjX2NsYXNzaWQoJmhhbmRsZSwgKmFyZ3YpKQorCQkJCWludmFyZygqYXJndiwgInBhcmVudCIpOworCQkJbXNnLnRjbV9wYXJlbnQgPSBoYW5kbGU7CisJCQlpZiAob2JqID09IE9CSl9maWx0ZXIpCisJCQkJZmlsdGVyX3BhcmVudCA9IGhhbmRsZTsKKwkJfSBlbHNlIGlmIChhcmcgPT0gQVJHX2hhbmRsZSkgeyAvKiBmaWx0ZXI6Omxpc3QgKi8KKwkJCWlmIChtc2cudGNtX2hhbmRsZSkKKwkJCQlkdXBhcmcoKmFyZ3YsICJoYW5kbGUiKTsKKwkJCS8qIHJlamVjdCBMT05HX01JTiB8fCBMT05HX01BWCAqLworCQkJLyogVE9ETzogZm9yIGZ3CisJCQlzbGFzaCA9IHN0cmNocihoYW5kbGUsICcvJyk7CisJCQlpZiAoc2xhc2ggIT0gTlVMTCkKKwkJCQkgICAqc2xhc2ggPSAnXDAnOworCQkJICovCisJCQltc2cudGNtX2hhbmRsZSA9IGdldF91MzIoKmFyZ3YsICJoYW5kbGUiKTsKKwkJCS8qIGlmIChzbGFzaCkge2lmIChnZXRfdTMyKHVpbnQzMl90ICZtYXNrLCBzbGFzaCsxLCBOVUxMKSkgaW52IG1hc2s7IGFkZGF0dHIzMihuLCBNQVhfTVNHLCBUQ0FfRldfTUFTSywgbWFzayk7ICovCisJCX0gZWxzZSBpZiAoYXJnID09IEFSR19jbGFzc2lkICYmIG9iaiA9PSBPQkpfY2xhc3MgJiYgY21kID09IENNRF9jaGFuZ2UpeworCQl9IGVsc2UgaWYgKGFyZyA9PSBBUkdfcHJlZiB8fCBhcmcgPT0gQVJHX3ByaW8pIHsgLyogZmlsdGVyOjpsaXN0ICovCisJCQlpZiAoZmlsdGVyX3ByaW8pCisJCQkJZHVwYXJnKCphcmd2LCAicHJpb3JpdHkiKTsKKwkJCWZpbHRlcl9wcmlvID0gZ2V0X3UzMigqYXJndiwgInByaW9yaXR5Iik7CisJCX0gZWxzZSBpZiAoYXJnID09IEFSR19wcm90bykgeyAvKiBmaWx0ZXI6Omxpc3QgKi8KKwkJCXVpbnQxNl90IHRtcDsKKwkJCWlmIChmaWx0ZXJfcHJvdG8pCisJCQkJZHVwYXJnKCphcmd2LCAicHJvdG9jb2wiKTsKKwkJCWlmIChsbF9wcm90b19hMm4oJnRtcCwgKmFyZ3YpKQorCQkJCWludmFyZygqYXJndiwgInByb3RvY29sIik7CisJCQlmaWx0ZXJfcHJvdG8gPSB0bXA7CisJCX0KKwl9CisJaWYgKGNtZCA+PSBDTURfc2hvdykgeyAvKiBzaG93IG9yIGxpc3QgKi8KKwkJaWYgKG9iaiA9PSBPQkpfZmlsdGVyKQorCQkJbXNnLnRjbV9pbmZvID0gVENfSF9NQUtFKGZpbHRlcl9wcmlvPDwxNiwgZmlsdGVyX3Byb3RvKTsKKwkJaWYgKHJ0bmxfZHVtcF9yZXF1ZXN0KCZydGgsIG9iaiA9PSBPQkpfcWRpc2MgPyBSVE1fR0VUUURJU0MgOgorCQkJCQkJb2JqID09IE9CSl9jbGFzcyA/IFJUTV9HRVRUQ0xBU1MgOiBSVE1fR0VUVEZJTFRFUiwKKwkJCQkJCSZtc2csIHNpemVvZihtc2cpKSA8IDApCisJCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzZW5kIGR1bXAgcmVxdWVzdCIpOworCisJCXhydG5sX2R1bXBfZmlsdGVyKCZydGgsIG9iaiA9PSBPQkpfcWRpc2MgPyBwcmludF9xZGlzYyA6CisJCQkJCQlvYmogPT0gT0JKX2NsYXNzID8gcHJpbnRfY2xhc3MgOiBwcmludF9maWx0ZXIsCisJCQkJCQlOVUxMKTsKKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCXJ0bmxfY2xvc2UoJnJ0aCk7CisJfQorCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3RjcHVkcC5jIGIvbmV0d29ya2luZy90Y3B1ZHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGY2YTk4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy90Y3B1ZHAuYwpAQCAtMCwwICsxLDY0NiBAQAorLyogQmFzZWQgb24gaXBzdmQgdXRpbGl0aWVzIHdyaXR0ZW4gYnkgR2Vycml0IFBhcGUgPHBhcGVAc21hcmRlbi5vcmc+CisgKiB3aGljaCBhcmUgcmVsZWFzZWQgaW50byBwdWJsaWMgZG9tYWluIGJ5IHRoZSBhdXRob3IuCisgKiBIb21lcGFnZTogaHR0cDovL3NtYXJkZW4uc3Vuc2l0ZS5kay9pcHN2ZC8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRGVueXMgVmxhc2Vua28uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCYXNlZCBvbiBpcHN2ZC0wLjEyLjEuIFRoaXMgdGNwc3ZkIGFjY2VwdHMgYWxsIG9wdGlvbnMKKyAqIHdoaWNoIGFyZSBzdXBwb3J0ZWQgYnkgb25lIGZyb20gaXBzdmQtMC4xMi4xLCBidXQgbm90IGFsbCBhcmUKKyAqIGZ1bmN0aW9uYWwuIFNlZSBoZWxwIHRleHQgYXQgdGhlIGVuZCBvZiB0aGlzIGZpbGUgZm9yIGRldGFpbHMuCisgKgorICogQ29kZSBpbnNpZGUgIiNpZmRlZiBTU0xTVkQiIGlzIGZvciBzc2xzdmQgYW5kIGlzIGN1cnJlbnRseSB1bnVzZWQuCisgKgorICogQnVzeWJveCB2ZXJzaW9uIGV4cG9ydHMgVENQTE9DQUxBRERSIGluc3RlYWQgb2YKKyAqIFRDUExPQ0FMSVAgKyBUQ1BMT0NBTFBPUlQgcGFpci4gQUREUiBtb3JlIGNsb3NlbHkgbWF0Y2hlcyByZWFsaXR5CisgKiAod2hpY2ggaXMgInN0cnVjdCBzb2NrYWRkcl9YWFgiLiBQb3J0IGlzIG5vdCBhIHNlcGFyYXRlIGVudGl0eSwKKyAqIGl0J3MganVzdCBhIHBhcnQgb2YgKEFGX0lORVRbNl0pIHNvY2thZGRyISkuCisgKgorICogVENQT1JJR0RTVEFERFIgaXMgQnVzeWJveC1zcGVjaWZpYyBhZGRpdGlvbi4KKyAqCisgKiB1ZHAgc2VydmVyIGlzIGhhY2tlZCB1cCBieSByZXVzaW5nIFRDUCBjb2RlLiBJdCBoYXMgdGhlIGZvbGxvd2luZworICogbGltaXRhdGlvbiBpbmhlcmVudCBpbiBVbml4IERHUkFNIHNvY2tldHMgaW1wbGVtZW50YXRpb246CisgKiAtIGxvY2FsIElQIGFkZHJlc3MgaXMgcmV0cmlldmVkICh1c2luZyByZWN2bXNnIHZvb2RvbykgYnV0CisgKiAgIGNoaWxkJ3Mgc29ja2V0IGlzIG5vdCBib3VuZCB0byBpdCAoYmluZCBjYW5ub3QgYmUgY2FsbGVkIG9uCisgKiAgIGFscmVhZHkgYm91bmQgc29ja2V0KS4gVGh1cyBpdCBzdGlsbCBjYW4gZW1pdCBvdXRnb2luZyBwYWNrZXRzCisgKiAgIHdpdGggd3Jvbmcgc291cmNlIElQLi4uCisgKiAtIGRvbid0IGtub3cgaG93IHRvIHJldHJpZXZlIE9SSUdEU1QgZm9yIHVkcC4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgdGNwc3ZkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWhFdl0gWy1jIE5dIFstQyBOWzpNU0ddXSBbLWIgTl0gWy11IFVTRVJdIFstbCBOQU1FXSBJUCBQT1JUIFBST0ciCisvKiB3aXRoIG5vdC1pbXBsZW1lbnRlZCBvcHRpb25zOiAqLworLyogLy91c2FnZTogICAgIlstaHBFdnZdIFstYyBOXSBbLUMgTls6TVNHXV0gWy1iIE5dIFstdSBVU0VSXSBbLWwgTkFNRV0gWy1pIERJUnwteCBDREJdIFstdCBTRUNdIElQIFBPUlQgUFJPRyIgKi8KKy8vdXNhZ2U6I2RlZmluZSB0Y3BzdmRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDcmVhdGUgVENQIHNvY2tldCwgYmluZCB0byBJUDpQT1JUIGFuZCBsaXN0ZW5cbiIKKy8vdXNhZ2U6ICAgICAgICJmb3IgaW5jb21pbmcgY29ubmVjdGlvbi4gUnVuIFBST0cgZm9yIGVhY2ggY29ubmVjdGlvbi5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JSVAJCUlQIHRvIGxpc3RlbiBvbiwgMCA9IGFsbCIKKy8vdXNhZ2U6ICAgICAiXG4JUE9SVAkJUG9ydCB0byBsaXN0ZW4gb24iCisvL3VzYWdlOiAgICAgIlxuCVBST0cgQVJHUwlQcm9ncmFtIHRvIHJ1biIKKy8vdXNhZ2U6ICAgICAiXG4JLWwgTkFNRQkJTG9jYWwgaG9zdG5hbWUgKGVsc2UgbG9va3MgdXAgbG9jYWwgaG9zdG5hbWUgaW4gRE5TKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUgVVNFUls6R1JQXQlDaGFuZ2UgdG8gdXNlci9ncm91cCBhZnRlciBiaW5kIgorLy91c2FnZTogICAgICJcbgktYyBOCQlIYW5kbGUgdXAgdG8gTiBjb25uZWN0aW9ucyBzaW11bHRhbmVvdXNseSIKKy8vdXNhZ2U6ICAgICAiXG4JLWIgTgkJQWxsb3cgYSBiYWNrbG9nIG9mIGFwcHJveGltYXRlbHkgTiBUQ1AgU1lOcyIKKy8vdXNhZ2U6ICAgICAiXG4JLUMgTls6TVNHXQlBbGxvdyBvbmx5IHVwIHRvIE4gY29ubmVjdGlvbnMgZnJvbSB0aGUgc2FtZSBJUCIKKy8vdXNhZ2U6ICAgICAiXG4JCQlOZXcgY29ubmVjdGlvbnMgZnJvbSB0aGlzIElQIGFkZHJlc3MgYXJlIGNsb3NlZCIKKy8vdXNhZ2U6ICAgICAiXG4JCQlpbW1lZGlhdGVseS4gTVNHIGlzIHdyaXR0ZW4gdG8gdGhlIHBlZXIgYmVmb3JlIGNsb3NlIgorLy91c2FnZTogICAgICJcbgktaAkJTG9vayB1cCBwZWVyJ3MgaG9zdG5hbWUiCisvL3VzYWdlOiAgICAgIlxuCS1FCQlEb24ndCBzZXQgdXAgZW52aXJvbm1lbnQgdmFyaWFibGVzIgorLy91c2FnZTogICAgICJcbgktdgkJVmVyYm9zZSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdWRwc3ZkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWhFdl0gWy1jIE5dIFstdSBVU0VSXSBbLWwgTkFNRV0gSVAgUE9SVCBQUk9HIgorLy91c2FnZTojZGVmaW5lIHVkcHN2ZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNyZWF0ZSBVRFAgc29ja2V0LCBiaW5kIHRvIElQOlBPUlQgYW5kIHdhaXRcbiIKKy8vdXNhZ2U6ICAgICAgICJmb3IgaW5jb21pbmcgcGFja2V0cy4gUnVuIFBST0cgZm9yIGVhY2ggcGFja2V0LFxuIgorLy91c2FnZTogICAgICAgInJlZGlyZWN0aW5nIGFsbCBmdXJ0aGVyIHBhY2tldHMgd2l0aCBzYW1lIHBlZXIgaXA6cG9ydCB0byBpdC5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JSVAJCUlQIHRvIGxpc3RlbiBvbiwgMCA9IGFsbCIKKy8vdXNhZ2U6ICAgICAiXG4JUE9SVAkJUG9ydCB0byBsaXN0ZW4gb24iCisvL3VzYWdlOiAgICAgIlxuCVBST0cgQVJHUwlQcm9ncmFtIHRvIHJ1biIKKy8vdXNhZ2U6ICAgICAiXG4JLWwgTkFNRQkJTG9jYWwgaG9zdG5hbWUgKGVsc2UgbG9va3MgdXAgbG9jYWwgaG9zdG5hbWUgaW4gRE5TKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUgVVNFUls6R1JQXQlDaGFuZ2UgdG8gdXNlci9ncm91cCBhZnRlciBiaW5kIgorLy91c2FnZTogICAgICJcbgktYyBOCQlIYW5kbGUgdXAgdG8gTiBjb25uZWN0aW9ucyBzaW11bHRhbmVvdXNseSIKKy8vdXNhZ2U6ICAgICAiXG4JLWgJCUxvb2sgdXAgcGVlcidzIGhvc3RuYW1lIgorLy91c2FnZTogICAgICJcbgktRQkJRG9uJ3Qgc2V0IHVwIGVudmlyb25tZW50IHZhcmlhYmxlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJCVZlcmJvc2UiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBXYW50cyA8bGltaXRzLmg+IGV0YywgdGh1cyBpbmNsdWRlZCBhZnRlciBsaWJiYi5oOiAqLworI2lmZGVmIF9fbGludXhfXworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+IC8qIGZvciBfX2JlMzIgZXRjICovCisjaW5jbHVkZSA8bGludXgvbmV0ZmlsdGVyX2lwdjQuaD4KKyNlbmRpZgorCisvLyBUT0RPOiBtb3ZlIGludG8gdGhpcyBmaWxlOgorI2luY2x1ZGUgInRjcHVkcF9wZXJob3N0LmgiCisKKyNpZmRlZiBTU0xTVkQKKyNpbmNsdWRlICJtYXRyaXhTc2wuaCIKKyNpbmNsdWRlICJzc2xfaW8uaCIKKyNlbmRpZgorCitzdHJ1Y3QgZ2xvYmFscyB7CisJdW5zaWduZWQgdmVyYm9zZTsKKwl1bnNpZ25lZCBtYXhfcGVyX2hvc3Q7CisJdW5zaWduZWQgY3VyX3Blcl9ob3N0OworCXVuc2lnbmVkIGNudW07CisJdW5zaWduZWQgY21heDsKKwljaGFyICoqZW52X2N1cjsKKwljaGFyICplbnZfdmFyWzFdOyAvKiBhY3R1YWxseSBiaWdnZXIgKi8KK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIHZlcmJvc2UgICAgICAoRy52ZXJib3NlICAgICApCisjZGVmaW5lIG1heF9wZXJfaG9zdCAoRy5tYXhfcGVyX2hvc3QpCisjZGVmaW5lIGN1cl9wZXJfaG9zdCAoRy5jdXJfcGVyX2hvc3QpCisjZGVmaW5lIGNudW0gICAgICAgICAoRy5jbnVtICAgICAgICApCisjZGVmaW5lIGNtYXggICAgICAgICAoRy5jbWF4ICAgICAgICApCisjZGVmaW5lIGVudl9jdXIgICAgICAoRy5lbnZfY3VyICAgICApCisjZGVmaW5lIGVudl92YXIgICAgICAoRy5lbnZfdmFyICAgICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCWNtYXggPSAzMDsgXAorCWVudl9jdXIgPSAmZW52X3ZhclswXTsgXAorfSB3aGlsZSAoMCkKKworCisvKiBXZSBoYXZlIHRvIGJlIGNhcmVmdWwgYWJvdXQgbGVha2luZyBtZW1vcnkgaW4gcmVwZWF0ZWQgc2V0ZW52J3MgKi8KK3N0YXRpYyB2b2lkIHhzZXRlbnZfcGxhaW4oY29uc3QgY2hhciAqbiwgY29uc3QgY2hhciAqdikKK3sKKwljaGFyICp2YXIgPSB4YXNwcmludGYoIiVzPSVzIiwgbiwgdik7CisJKmVudl9jdXIrKyA9IHZhcjsKKwlwdXRlbnYodmFyKTsKK30KKworc3RhdGljIHZvaWQgeHNldGVudl9wcm90byhjb25zdCBjaGFyICpwcm90bywgY29uc3QgY2hhciAqbiwgY29uc3QgY2hhciAqdikKK3sKKwljaGFyICp2YXIgPSB4YXNwcmludGYoIiVzJXM9JXMiLCBwcm90bywgbiwgdik7CisJKmVudl9jdXIrKyA9IHZhcjsKKwlwdXRlbnYodmFyKTsKK30KKworc3RhdGljIHZvaWQgdW5kb194c2V0ZW52KHZvaWQpCit7CisJY2hhciAqKnBwID0gZW52X2N1ciA9ICZlbnZfdmFyWzBdOworCXdoaWxlICgqcHApIHsKKwkJY2hhciAqdmFyID0gKnBwOworCQliYl91bnNldGVudl9hbmRfZnJlZSh2YXIpOworCQkqcHArKyA9IE5VTEw7CisJfQorfQorCitzdGF0aWMgdm9pZCBzaWdfdGVybV9oYW5kbGVyKGludCBzaWcpCit7CisJaWYgKHZlcmJvc2UpCisJCWJiX2Vycm9yX21zZygiZ290IHNpZ25hbCAldSwgZXhpdCIsIHNpZyk7CisJa2lsbF9teXNlbGZfd2l0aF9zaWcoc2lnKTsKK30KKworLyogTGl0dGxlIGJsb2F0ZWQsIGJ1dCB0cmllcyB0byBnaXZlIGFjY3VyYXRlIGluZm8gaG93IGNoaWxkIGV4aXRlZC4KKyAqIE1ha2VzIGVhc2llciB0byBzcG90IHNlZ2ZhdWx0aW5nIGNoaWxkcmVuIGV0Yy4uLiAqLworc3RhdGljIHZvaWQgcHJpbnRfd2FpdHN0YXQodW5zaWduZWQgcGlkLCBpbnQgd3N0YXQpCit7CisJdW5zaWduZWQgZSA9IDA7CisJY29uc3QgY2hhciAqY2F1c2UgPSAiP2V4aXQiOworCisJaWYgKFdJRkVYSVRFRCh3c3RhdCkpIHsKKwkJY2F1c2UrKzsKKwkJZSA9IFdFWElUU1RBVFVTKHdzdGF0KTsKKwl9IGVsc2UgaWYgKFdJRlNJR05BTEVEKHdzdGF0KSkgeworCQljYXVzZSA9ICJzaWduYWwiOworCQllID0gV1RFUk1TSUcod3N0YXQpOworCX0KKwliYl9lcnJvcl9tc2coImVuZCAlZCAlcyAlZCIsIHBpZCwgY2F1c2UsIGUpOworfQorCisvKiBNdXN0IG1hdGNoIGdldG9wdDMyIGluIG1haW4hICovCitlbnVtIHsKKwlPUFRfYyA9ICgxIDw8IDApLAorCU9QVF9DID0gKDEgPDwgMSksCisJT1BUX2kgPSAoMSA8PCAyKSwKKwlPUFRfeCA9ICgxIDw8IDMpLAorCU9QVF91ID0gKDEgPDwgNCksCisJT1BUX2wgPSAoMSA8PCA1KSwKKwlPUFRfRSA9ICgxIDw8IDYpLAorCU9QVF9iID0gKDEgPDwgNyksCisJT1BUX2ggPSAoMSA8PCA4KSwKKwlPUFRfcCA9ICgxIDw8IDkpLAorCU9QVF90ID0gKDEgPDwgMTApLAorCU9QVF92ID0gKDEgPDwgMTEpLAorCU9QVF9WID0gKDEgPDwgMTIpLAorCU9QVF9VID0gKDEgPDwgMTMpLCAvKiBmcm9tIGhlcmU6IHNzbHN2ZCBvbmx5ICovCisJT1BUX3NsYXNoID0gKDEgPDwgMTQpLAorCU9QVF9aID0gKDEgPDwgMTUpLAorCU9QVF9LID0gKDEgPDwgMTYpLAorfTsKKworc3RhdGljIHZvaWQgY29ubmVjdGlvbl9zdGF0dXModm9pZCkKK3sKKwkvKiAib25seSAxIGNsaWVudCBtYXgiIGRlc24ndCBuZWVkIHRoaXMgKi8KKwlpZiAoY21heCA+IDEpCisJCWJiX2Vycm9yX21zZygic3RhdHVzICV1LyV1IiwgY251bSwgY21heCk7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ19jaGlsZF9oYW5kbGVyKGludCBzaWcgVU5VU0VEX1BBUkFNKQoreworCWludCB3c3RhdDsKKwlwaWRfdCBwaWQ7CisKKwl3aGlsZSAoKHBpZCA9IHdhaXRfYW55X25vaGFuZygmd3N0YXQpKSA+IDApIHsKKwkJaWYgKG1heF9wZXJfaG9zdCkKKwkJCWlwc3ZkX3Blcmhvc3RfcmVtb3ZlKHBpZCk7CisJCWlmIChjbnVtKQorCQkJY251bS0tOworCQlpZiAodmVyYm9zZSkKKwkJCXByaW50X3dhaXRzdGF0KHBpZCwgd3N0YXQpOworCX0KKwlpZiAodmVyYm9zZSkKKwkJY29ubmVjdGlvbl9zdGF0dXMoKTsKK30KKworaW50IHRjcHVkcHN2ZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdGNwdWRwc3ZkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpzdHJfQywgKnN0cl90OworCWNoYXIgKnVzZXI7CisJc3RydWN0IGhjYyAqaGNjcDsKKwljb25zdCBjaGFyICppbnN0cnVjdHM7CisJY2hhciAqbXNnX3Blcl9ob3N0ID0gTlVMTDsKKwl1bnNpZ25lZCBsZW5fcGVyX2hvc3QgPSBsZW5fcGVyX2hvc3Q7IC8qIGdjYyAqLworI2lmbmRlZiBTU0xTVkQKKwlzdHJ1Y3QgYmJfdWlkZ2lkX3QgdWdpZDsKKyNlbmRpZgorCWJvb2wgdGNwOworCXVpbnQxNl90IGxvY2FsX3BvcnQ7CisJY2hhciAqcHJlc2V0X2xvY2FsX2hvc3RuYW1lID0gTlVMTDsKKwljaGFyICpyZW1vdGVfaG9zdG5hbWUgPSByZW1vdGVfaG9zdG5hbWU7IC8qIGZvciBjb21waWxlciAqLworCWNoYXIgKnJlbW90ZV9hZGRyID0gcmVtb3RlX2FkZHI7IC8qIGZvciBjb21waWxlciAqLworCWxlbl9hbmRfc29ja2FkZHIgKmxzYTsKKwlsZW5fYW5kX3NvY2thZGRyIGxvY2FsLCByZW1vdGU7CisJc29ja2xlbl90IHNhX2xlbjsKKwlpbnQgcGlkOworCWludCBzb2NrOworCWludCBjb25uOworCXVuc2lnbmVkIGJhY2tsb2cgPSAyMDsKKwl1bnNpZ25lZCBvcHRzOworCisJSU5JVF9HKCk7CisKKwl0Y3AgPSAoYXBwbGV0X25hbWVbMF0gPT0gJ3QnKTsKKworCS8qIDMrIGFyZ3MsIC1pIGF0IG1vc3Qgb25jZSwgLXAgaW1wbGllcyAtaCwgLXYgaXMgY291bnRlciwgLWIgTiwgLWMgTiAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0zOmktLWk6cGg6dnY6Yis6YysiOworI2lmZGVmIFNTTFNWRAorCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiK2M6QzppOng6dTpsOkViOmhwdDp2VTovOlo6SzoiLAorCQkmY21heCwgJnN0cl9DLCAmaW5zdHJ1Y3RzLCAmaW5zdHJ1Y3RzLCAmdXNlciwgJnByZXNldF9sb2NhbF9ob3N0bmFtZSwKKwkJJmJhY2tsb2csICZzdHJfdCwgJnNzbHVzZXIsICZyb290LCAmY2VydCwgJmtleSwgJnZlcmJvc2UKKwkpOworI2Vsc2UKKwkvKiAiKyI6IHN0b3Agb24gZmlyc3Qgbm9uLW9wdGlvbiAqLworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiK2M6QzppOng6dTpsOkViOmhwdDp2IiwKKwkJJmNtYXgsICZzdHJfQywgJmluc3RydWN0cywgJmluc3RydWN0cywgJnVzZXIsICZwcmVzZXRfbG9jYWxfaG9zdG5hbWUsCisJCSZiYWNrbG9nLCAmc3RyX3QsICZ2ZXJib3NlCisJKTsKKyNlbmRpZgorCWlmIChvcHRzICYgT1BUX0MpIHsgLyogLUMgbls6bWVzc2FnZV0gKi8KKwkJbWF4X3Blcl9ob3N0ID0gYmJfc3RydG91KHN0cl9DLCAmc3RyX0MsIDEwKTsKKwkJaWYgKHN0cl9DWzBdKSB7CisJCQlpZiAoc3RyX0NbMF0gIT0gJzonKQorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCW1zZ19wZXJfaG9zdCA9IHN0cl9DICsgMTsKKwkJCWxlbl9wZXJfaG9zdCA9IHN0cmxlbihtc2dfcGVyX2hvc3QpOworCQl9CisJfQorCWlmIChtYXhfcGVyX2hvc3QgPiBjbWF4KQorCQltYXhfcGVyX2hvc3QgPSBjbWF4OworCWlmIChvcHRzICYgT1BUX3UpIHsKKwkJeGdldF91aWRnaWQoJnVnaWQsIHVzZXIpOworCX0KKyNpZmRlZiBTU0xTVkQKKwlpZiAob3B0cyAmIE9QVF9VKSBzc2x1c2VyID0gb3B0YXJnOworCWlmIChvcHRzICYgT1BUX3NsYXNoKSByb290ID0gb3B0YXJnOworCWlmIChvcHRzICYgT1BUX1opIGNlcnQgPSBvcHRhcmc7CisJaWYgKG9wdHMgJiBPUFRfSykga2V5ID0gb3B0YXJnOworI2VuZGlmCisJYXJndiArPSBvcHRpbmQ7CisJaWYgKCFhcmd2WzBdWzBdIHx8IExPTkVfQ0hBUihhcmd2WzBdLCAnMCcpKQorCQlhcmd2WzBdID0gKGNoYXIqKSIwLjAuMC4wIjsKKworCS8qIFBlci1JUCBmbG9vZCBwcm90ZWN0aW9uIGlzIG5vdCB0aG91Z2h0LW91dCBmb3IgVURQICovCisJaWYgKCF0Y3ApCisJCW1heF9wZXJfaG9zdCA9IDA7CisKKwliYl9zYW5pdGl6ZV9zdGRpbygpOyAvKiBmZCMgMCwxLDIgbXVzdCBiZSBvcGVuZWQgKi8KKworI2lmZGVmIFNTTFNWRAorCXNzbHNlciA9IHVzZXI7CisJY2xpZW50ID0gMDsKKwlpZiAoKGdldHVpZCgpID09IDApICYmICEob3B0cyAmIE9QVF91KSkgeworCQl4ZnVuY19leGl0Y29kZSA9IDEwMDsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3lvdV9tdXN0X2JlX3Jvb3QpOworCX0KKwlpZiAob3B0cyAmIE9QVF91KQorCQlpZiAoIXVpZGdpZF9nZXQoJnNzbHVnaWQsIHNzbHVzZXIsIDEpKSB7CisJCQlpZiAoZXJybm8pIHsKKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGdldCB1c2VyL2dyb3VwOiAlcyIsIHNzbHVzZXIpOworCQkJfQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gdXNlci9ncm91cCAlcyIsIHNzbHVzZXIpOworCQl9CisJaWYgKCFjZXJ0KSBjZXJ0ID0gIi4vY2VydC5wZW0iOworCWlmICgha2V5KSBrZXkgPSBjZXJ0OworCWlmIChtYXRyaXhTc2xPcGVuKCkgPCAwKQorCQlmYXRhbCgiY2FuJ3QgaW5pdGlhbGl6ZSBzc2wiKTsKKwlpZiAobWF0cml4U3NsUmVhZEtleXMoJmtleXMsIGNlcnQsIGtleSwgMCwgY2EpIDwgMCkgeworCQlpZiAoY2xpZW50KQorCQkJZmF0YWwoImNhbid0IHJlYWQgY2VydCwga2V5LCBvciBjYSBmaWxlIik7CisJCWZhdGFsKCJjYW4ndCByZWFkIGNlcnQgb3Iga2V5IGZpbGUiKTsKKwl9CisJaWYgKG1hdHJpeFNzbE5ld1Nlc3Npb24oJnNzbCwga2V5cywgMCwgU1NMX0ZMQUdTX1NFUlZFUikgPCAwKQorCQlmYXRhbCgiY2FuJ3QgY3JlYXRlIHNzbCBzZXNzaW9uIik7CisjZW5kaWYKKworCXNpZ19ibG9jayhTSUdDSExEKTsKKwlzaWduYWwoU0lHQ0hMRCwgc2lnX2NoaWxkX2hhbmRsZXIpOworCWJiX3NpZ25hbHMoQkJfRkFUQUxfU0lHUywgc2lnX3Rlcm1faGFuZGxlcik7CisJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisJaWYgKG1heF9wZXJfaG9zdCkKKwkJaXBzdmRfcGVyaG9zdF9pbml0KGNtYXgpOworCisJbG9jYWxfcG9ydCA9IGJiX2xvb2t1cF9wb3J0KGFyZ3ZbMV0sIHRjcCA/ICJ0Y3AiIDogInVkcCIsIDApOworCWxzYSA9IHhob3N0MnNvY2thZGRyKGFyZ3ZbMF0sIGxvY2FsX3BvcnQpOworCWFyZ3YgKz0gMjsKKworCXNvY2sgPSB4c29ja2V0KGxzYS0+dS5zYS5zYV9mYW1pbHksIHRjcCA/IFNPQ0tfU1RSRUFNIDogU09DS19ER1JBTSwgMCk7CisJc2V0c29ja29wdF9yZXVzZWFkZHIoc29jayk7CisJc2FfbGVuID0gbHNhLT5sZW47IC8qIEkgcHJlc3VtZSBzb2NrYWRkciBsZW4gc3RheXMgdGhlIHNhbWUgKi8KKwl4YmluZChzb2NrLCAmbHNhLT51LnNhLCBzYV9sZW4pOworCWlmICh0Y3ApIHsKKwkJeGxpc3Rlbihzb2NrLCBiYWNrbG9nKTsKKwkJY2xvc2Vfb25fZXhlY19vbihzb2NrKTsKKwl9IGVsc2UgeyAvKiB1ZHA6IG5lZWRlZCBmb3IgcmVjdl9mcm9tX3RvIHRvIHdvcms6ICovCisJCXNvY2tldF93YW50X3BrdGluZm8oc29jayk7CisJfQorCS8qIG5kZWxheV9vZmYoc29jayk7IC0gaXQgaXMgdGhlIGRlZmF1bHQgSSB0aGluaz8gKi8KKworI2lmbmRlZiBTU0xTVkQKKwlpZiAob3B0cyAmIE9QVF91KSB7CisJCS8qIGRyb3AgcGVybWlzc2lvbnMgKi8KKwkJeHNldGdpZCh1Z2lkLmdpZCk7CisJCXhzZXR1aWQodWdpZC51aWQpOworCX0KKyNlbmRpZgorCisJaWYgKHZlcmJvc2UpIHsKKwkJY2hhciAqYWRkciA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkKCZsc2EtPnUuc2EpOworCQlpZiAob3B0cyAmIE9QVF91KQorCQkJYmJfZXJyb3JfbXNnKCJsaXN0ZW5pbmcgb24gJXMsIHN0YXJ0aW5nLCB1aWQgJXUsIGdpZCAldSIsIGFkZHIsCisJCQkJKHVuc2lnbmVkKXVnaWQudWlkLCAodW5zaWduZWQpdWdpZC5naWQpOworCQllbHNlCisJCQliYl9lcnJvcl9tc2coImxpc3RlbmluZyBvbiAlcywgc3RhcnRpbmciLCBhZGRyKTsKKwkJZnJlZShhZGRyKTsKKwl9CisKKwkvKiBNYWluIGFjY2VwdCgpIGxvb3AgKi8KKworIGFnYWluOgorCWhjY3AgPSBOVUxMOworCisJd2hpbGUgKGNudW0gPj0gY21heCkKKwkJd2FpdF9mb3JfYW55X3NpZygpOyAvKiBleHBlY3RpbmcgU0lHQ0hMRCAqLworCisJLyogQWNjZXB0IGEgY29ubmVjdGlvbiB0byBmZCAjMCAqLworIGFnYWluMToKKwljbG9zZSgwKTsKKyBhZ2FpbjI6CisJc2lnX3VuYmxvY2soU0lHQ0hMRCk7CisJbG9jYWwubGVuID0gcmVtb3RlLmxlbiA9IHNhX2xlbjsKKwlpZiAodGNwKSB7CisJCWNvbm4gPSBhY2NlcHQoc29jaywgJnJlbW90ZS51LnNhLCAmcmVtb3RlLmxlbik7CisJfSBlbHNlIHsKKwkJLyogSW4gY2FzZSByZWN2X2Zyb21fdG8gd29uJ3QgYmUgYWJsZSB0byByZWNvdmVyIGxvY2FsIGFkZHIuCisJCSAqIEFsc28gc2V0cyBwb3J0IC0gcmVjdl9mcm9tX3RvIGlzIHVuYWJsZSB0byBkbyBpdC4gKi8KKwkJbG9jYWwgPSAqbHNhOworCQljb25uID0gcmVjdl9mcm9tX3RvKHNvY2ssIE5VTEwsIDAsIE1TR19QRUVLLAorCQkJCSZyZW1vdGUudS5zYSwgJmxvY2FsLnUuc2EsIHNhX2xlbik7CisJfQorCXNpZ19ibG9jayhTSUdDSExEKTsKKwlpZiAoY29ubiA8IDApIHsKKwkJaWYgKGVycm5vICE9IEVJTlRSKQorCQkJYmJfcGVycm9yX21zZyh0Y3AgPyAiYWNjZXB0IiA6ICJyZWN2Iik7CisJCWdvdG8gYWdhaW4yOworCX0KKwl4bW92ZV9mZCh0Y3AgPyBjb25uIDogc29jaywgMCk7CisKKwlpZiAobWF4X3Blcl9ob3N0KSB7CisJCS8qIERyb3AgY29ubmVjdGlvbiBpbW1lZGlhdGVseSBpZiBjdXJfcGVyX2hvc3QgPiBtYXhfcGVyX2hvc3QKKwkJICogKG1pbmltaXppbmcgbG9hZCB1bmRlciBTWU4gZmxvb2QpICovCisJCXJlbW90ZV9hZGRyID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWRfbm9wb3J0KCZyZW1vdGUudS5zYSk7CisJCWN1cl9wZXJfaG9zdCA9IGlwc3ZkX3Blcmhvc3RfYWRkKHJlbW90ZV9hZGRyLCBtYXhfcGVyX2hvc3QsICZoY2NwKTsKKwkJaWYgKGN1cl9wZXJfaG9zdCA+IG1heF9wZXJfaG9zdCkgeworCQkJLyogaXBzdmRfcGVyaG9zdF9hZGQgZGV0ZWN0ZWQgdGhhdCBtYXggaXMgZXhjZWVkZWQKKwkJCSAqIChhbmQgZGlkIG5vdCBzdG9yZSBpcCBpbiBjb25uZWN0aW9uIHRhYmxlKSAqLworCQkJZnJlZShyZW1vdGVfYWRkcik7CisJCQlpZiAobXNnX3Blcl9ob3N0KSB7CisJCQkJLyogZG9uJ3QgYmxvY2sgb3IgdGVzdCBmb3IgZXJyb3JzICovCisJCQkJc2VuZCgwLCBtc2dfcGVyX2hvc3QsIGxlbl9wZXJfaG9zdCwgTVNHX0RPTlRXQUlUKTsKKwkJCX0KKwkJCWdvdG8gYWdhaW4xOworCQl9CisJCS8qIE5COiByZW1vdGVfYWRkciBpcyBub3QgbGVha2VkLCBpdCBpcyBzdG9yZWQgaW4gY29ubiB0YWJsZSAqLworCX0KKworCWlmICghdGNwKSB7CisJCS8qIFZvb2RvbyBtYWdpYzogbWFraW5nIHVkcCBzb2NrZXRzIGVhY2ggcmVjZWl2ZSBpdHMgb3duCisJCSAqIHBhY2tldHMgaXMgbm90IHRyaXZpYWwsIGFuZCBJIHN0aWxsIG5vdCBzdXJlCisJCSAqIEkgZG8gaXQgMTAwJSByaWdodC4KKwkJICogMSkgd2UgaGF2ZSB0byBkbyBpdCBiZWZvcmUgZm9yaygpCisJCSAqIDIpIG9yZGVyIGlzIGltcG9ydGFudCAtIGlzIGl0IHJpZ2h0IG5vdz8gKi8KKworCQkvKiBPcGVuIG5ldyBub24tY29ubmVjdGVkIFVEUCBzb2NrZXQgZm9yIGZ1cnRoZXIgY2xpZW50cy4uLiAqLworCQlzb2NrID0geHNvY2tldChsc2EtPnUuc2Euc2FfZmFtaWx5LCBTT0NLX0RHUkFNLCAwKTsKKwkJc2V0c29ja29wdF9yZXVzZWFkZHIoc29jayk7CisJCS8qIE1ha2UgcGxhaW4gd3JpdGUvc2VuZCB3b3JrIGZvciBvbGQgc29ja2V0IGJ5IHN1cHBseWluZyBkZWZhdWx0CisJCSAqIGRlc3RpbmF0aW9uIGFkZHJlc3MuIFRoaXMgYWxzbyByZXN0cmljdHMgaW5jb21pbmcgcGFja2V0cworCQkgKiB0byBvbmVzIGNvbWluZyBmcm9tIHRoaXMgcmVtb3RlIElQLiAqLworCQl4Y29ubmVjdCgwLCAmcmVtb3RlLnUuc2EsIHNhX2xlbik7CisJLyogaG9sZT8gYXQgdGhpcyBwb2ludCB3ZSBoYXZlIG5vIHdpbGRjYXJkIHVkcCBzb2NrZXQuLi4KKwkgKiBjYW4gdGhpcyBjYXVzZSBjbGllbnRzIHRvIGdldCAicG9ydCB1bnJlYWNoYWJsZSIgaWNtcD8KKwkgKiBZdXAsIHRpbWUgd2luZG93IGlzIHZlcnkgc21hbGwsIGJ1dCBpdCBleGlzdHMgKGlzIGl0PykgKi8KKwkJLyogLi4uIm9wZW4gbmV3IHNvY2tldCIsIGNvbnRpbnVlZCAqLworCQl4YmluZChzb2NrLCAmbHNhLT51LnNhLCBzYV9sZW4pOworCQlzb2NrZXRfd2FudF9wa3RpbmZvKHNvY2spOworCisJCS8qIERvZXNuJ3Qgd29yazoKKwkJICogd2UgY2Fubm90IHJlcGxhY2UgZmQgIzAgLSB3ZSB3aWxsIGxvc2UgcGVuZGluZyBwYWNrZXQKKwkJICogd2hpY2ggaXMgYWxyZWFkeSBidWZmZXJlZCBmb3IgdXMhIEFuZCB3ZSBjYW5ub3QgdXNlIGZkICMxCisJCSAqIGluc3RlYWQgLSBpdCB3aWxsICJpbnRlcmNlcHQiIGFsbCBmb2xsb3dpbmcgcGFja2V0cywgYnV0IGNoaWxkCisJCSAqIGRvZXMgbm90IGV4cGVjdCBkYXRhIGNvbWluZyAqZnJvbSBmZCAjMSohICovCisjaWYgMAorCQkvKiBNYWtlIGl0IHNvIHRoYXQgbG9jYWwgYWRkciBpcyBmaXhlZCB0byBsb2NhbHAtPnUuc2EKKwkJICogYW5kIHdlIGRvbid0IGFjY2lkZW50YWxseSBhY2NlcHQgcGFja2V0cyB0byBvdGhlciBsb2NhbCBJUHMuICovCisJCS8qIE5COiB3ZSBwb3NzaWJseSBiaW5kIHRvIHRoZSBfdmVyeV8gc2FtZV8gYWRkcmVzcyAmIHBvcnQgYXMgdGhlIG9uZQorCQkgKiBhbHJlYWR5IGJvdW5kIGluIHBhcmVudCEgVGhpcyBzZWVtcyB0byB3b3JrIGluIExpbnV4LgorCQkgKiAob3RoZXJ3aXNlIHdlIGNhbiBtb3ZlIHNvY2tldCB0byBmZCAjMCBvbmx5IGlmIGJpbmQgc3VjY2VlZHMpICovCisJCWNsb3NlKDApOworCQlzZXRfbnBvcnQoJmxvY2FscC0+dS5zYSwgaHRvbnMobG9jYWxfcG9ydCkpOworCQl4bW92ZV9mZCh4c29ja2V0KGxvY2FscC0+dS5zYS5zYV9mYW1pbHksIFNPQ0tfREdSQU0sIDApLCAwKTsKKwkJc2V0c29ja29wdF9yZXVzZWFkZHIoMCk7IC8qIGNydWNpYWwgKi8KKwkJeGJpbmQoMCwgJmxvY2FscC0+dS5zYSwgbG9jYWxwLT5sZW4pOworI2VuZGlmCisJfQorCisJcGlkID0gdmZvcmsoKTsKKwlpZiAocGlkID09IC0xKSB7CisJCWJiX3BlcnJvcl9tc2coInZmb3JrIik7CisJCWdvdG8gYWdhaW47CisJfQorCisJaWYgKHBpZCAhPSAwKSB7CisJCS8qIFBhcmVudCAqLworCQljbnVtKys7CisJCWlmICh2ZXJib3NlKQorCQkJY29ubmVjdGlvbl9zdGF0dXMoKTsKKwkJaWYgKGhjY3ApCisJCQloY2NwLT5waWQgPSBwaWQ7CisJCS8qIGNsZWFuIHVwIGNoYW5nZXMgZG9uZSBieSB2Zm9ya2VkIGNoaWxkICovCisJCXVuZG9feHNldGVudigpOworCQlnb3RvIGFnYWluOworCX0KKworCS8qIENoaWxkOiBwcmVwYXJlIGVudiwgbG9nLCBhbmQgZXhlYyBwcm9nICovCisKKwl7IC8qIHZmb3JrIGFsZXJ0ISBldmVyeSB4bWFsbG9jIGluIHRoaXMgYmxvY2sgc2hvdWxkIGJlIGZyZWVkISAqLworCQljaGFyICpsb2NhbF9ob3N0bmFtZSA9IGxvY2FsX2hvc3RuYW1lOyAvKiBmb3IgY29tcGlsZXIgKi8KKwkJY2hhciAqbG9jYWxfYWRkciA9IE5VTEw7CisJCWNoYXIgKmZyZWVfbWUwID0gTlVMTDsKKwkJY2hhciAqZnJlZV9tZTEgPSBOVUxMOworCQljaGFyICpmcmVlX21lMiA9IE5VTEw7CisKKwkJaWYgKHZlcmJvc2UgfHwgIShvcHRzICYgT1BUX0UpKSB7CisJCQlpZiAoIW1heF9wZXJfaG9zdCkgLyogcmVtb3RlX2FkZHIgaXMgbm90IHlldCBrbm93biAqLworCQkJCWZyZWVfbWUwID0gcmVtb3RlX2FkZHIgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZCgmcmVtb3RlLnUuc2EpOworCQkJaWYgKG9wdHMgJiBPUFRfaCkgeworCQkJCWZyZWVfbWUxID0gcmVtb3RlX2hvc3RuYW1lID0geG1hbGxvY19zb2NrYWRkcjJob3N0X25vcG9ydCgmcmVtb3RlLnUuc2EpOworCQkJCWlmICghcmVtb3RlX2hvc3RuYW1lKSB7CisJCQkJCWJiX2Vycm9yX21zZygiY2FuJ3QgbG9vayB1cCBob3N0bmFtZSBmb3IgJXMiLCByZW1vdGVfYWRkcik7CisJCQkJCXJlbW90ZV9ob3N0bmFtZSA9IHJlbW90ZV9hZGRyOworCQkJCX0KKwkJCX0KKwkJCS8qIEZpbmQgb3V0IGxvY2FsIElQIHBlZXIgY29ubmVjdGVkIHRvLgorCQkJICogRXJyb3JzIGlnbm9yZWQgKEknbSBub3QgcGFyYW5vaWQgZW5vdWdoIHRvIGltYWdpbmUga2VybmVsCisJCQkgKiB3aGljaCBkb2Vzbid0IGtub3cgbG9jYWwgSVApLiAqLworCQkJaWYgKHRjcCkKKwkJCQlnZXRzb2NrbmFtZSgwLCAmbG9jYWwudS5zYSwgJmxvY2FsLmxlbik7CisJCQkvKiBlbHNlOiBmb3IgVURQIGl0IGlzIGRvbmUgZWFybGllciBieSBwYXJlbnQgKi8KKwkJCWxvY2FsX2FkZHIgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZCgmbG9jYWwudS5zYSk7CisJCQlpZiAob3B0cyAmIE9QVF9oKSB7CisJCQkJbG9jYWxfaG9zdG5hbWUgPSBwcmVzZXRfbG9jYWxfaG9zdG5hbWU7CisJCQkJaWYgKCFsb2NhbF9ob3N0bmFtZSkgeworCQkJCQlmcmVlX21lMiA9IGxvY2FsX2hvc3RuYW1lID0geG1hbGxvY19zb2NrYWRkcjJob3N0X25vcG9ydCgmbG9jYWwudS5zYSk7CisJCQkJCWlmICghbG9jYWxfaG9zdG5hbWUpCisJCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgbG9vayB1cCBob3N0bmFtZSBmb3IgJXMiLCBsb2NhbF9hZGRyKTsKKwkJCQl9CisJCQkJLyogZWxzZTogbG9jYWxfaG9zdG5hbWUgaXMgbm90IE5VTEwsIGJ1dCBpcyBOT1QgbWFsbG9jZWQhICovCisJCQl9CisJCX0KKwkJaWYgKHZlcmJvc2UpIHsKKwkJCXBpZCA9IGdldHBpZCgpOworCQkJaWYgKG1heF9wZXJfaG9zdCkgeworCQkJCWJiX2Vycm9yX21zZygiY29uY3VycmVuY3kgJXMgJXUvJXUiLAorCQkJCQlyZW1vdGVfYWRkciwKKwkJCQkJY3VyX3Blcl9ob3N0LCBtYXhfcGVyX2hvc3QpOworCQkJfQorCQkJYmJfZXJyb3JfbXNnKChvcHRzICYgT1BUX2gpCisJCQkJPyAic3RhcnQgJXUgJXMtJXMgKCVzLSVzKSIKKwkJCQk6ICJzdGFydCAldSAlcy0lcyIsCisJCQkJcGlkLAorCQkJCWxvY2FsX2FkZHIsIHJlbW90ZV9hZGRyLAorCQkJCWxvY2FsX2hvc3RuYW1lLCByZW1vdGVfaG9zdG5hbWUpOworCQl9CisKKwkJaWYgKCEob3B0cyAmIE9QVF9FKSkgeworCQkJLyogc2V0dXAgdWNzcGkgZW52ICovCisJCQljb25zdCBjaGFyICpwcm90byA9IHRjcCA/ICJUQ1AiIDogIlVEUCI7CisKKyNpZmRlZiBTT19PUklHSU5BTF9EU1QKKwkJCS8qIEV4dHJhY3QgIm9yaWdpbmFsIiBkZXN0aW5hdGlvbiBhZGRyOnBvcnQKKwkJCSAqIGZyb20gTGludXggZmlyZXdhbGwuIFVzZWZ1bCB3aGVuIHlvdSByZWRpcmVjdAorCQkJICogYW4gb3V0Ym9uZCBjb25uZWN0aW9uIHRvIGxvY2FsIGhhbmRsZXIsIGFuZCBpdCBuZWVkcworCQkJICogdG8ga25vdyB3aGVyZSBpdCBvcmlnaW5hbGx5IHRyaWVkIHRvIGNvbm5lY3QgKi8KKwkJCWlmICh0Y3AgJiYgZ2V0c29ja29wdCgwLCBTT0xfSVAsIFNPX09SSUdJTkFMX0RTVCwgJmxvY2FsLnUuc2EsICZsb2NhbC5sZW4pID09IDApIHsKKwkJCQljaGFyICphZGRyID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWQoJmxvY2FsLnUuc2EpOworCQkJCXhzZXRlbnZfcGxhaW4oIlRDUE9SSUdEU1RBRERSIiwgYWRkcik7CisJCQkJZnJlZShhZGRyKTsKKwkJCX0KKyNlbmRpZgorCQkJeHNldGVudl9wbGFpbigiUFJPVE8iLCBwcm90byk7CisJCQl4c2V0ZW52X3Byb3RvKHByb3RvLCAiTE9DQUxBRERSIiwgbG9jYWxfYWRkcik7CisJCQl4c2V0ZW52X3Byb3RvKHByb3RvLCAiUkVNT1RFQUREUiIsIHJlbW90ZV9hZGRyKTsKKwkJCWlmIChvcHRzICYgT1BUX2gpIHsKKwkJCQl4c2V0ZW52X3Byb3RvKHByb3RvLCAiTE9DQUxIT1NUIiwgbG9jYWxfaG9zdG5hbWUpOworCQkJCXhzZXRlbnZfcHJvdG8ocHJvdG8sICJSRU1PVEVIT1NUIiwgcmVtb3RlX2hvc3RuYW1lKTsKKwkJCX0KKwkJCS8vY29tcGF0PyB4c2V0ZW52X3Byb3RvKHByb3RvLCAiUkVNT1RFSU5GTyIsICIiKTsKKwkJCS8qIGFkZGl0aW9uYWwgKi8KKwkJCWlmIChjdXJfcGVyX2hvc3QgPiAwKSAvKiBjYW4gbm90IGJlIHRydWUgZm9yIHVkcCAqLworCQkJCXhzZXRlbnZfcGxhaW4oIlRDUENPTkNVUlJFTkNZIiwgdXRvYShjdXJfcGVyX2hvc3QpKTsKKwkJfQorCQlmcmVlKGxvY2FsX2FkZHIpOworCQlmcmVlKGZyZWVfbWUwKTsKKwkJZnJlZShmcmVlX21lMSk7CisJCWZyZWUoZnJlZV9tZTIpOworCX0KKworCXhkdXAyKDAsIDEpOworCisJc2lnbmFsKFNJR1BJUEUsIFNJR19ERkwpOyAvKiB0aGlzIG9uZSB3YXMgU0lHX0lHTmVkICovCisJLyogTm9uLWlnbm9yZWQgc2lnbmFscyByZXZlcnQgdG8gU0lHX0RGTCBvbiBleGVjIGFueXdheSAqLworCS8qc2lnbmFsKFNJR0NITEQsIFNJR19ERkwpOyovCisJc2lnX3VuYmxvY2soU0lHQ0hMRCk7CisKKyNpZmRlZiBTU0xTVkQKKwlzdHJjcHkoaWQsIHV0b2EocGlkKSk7CisJc3NsX2lvKDAsIGFyZ3YpOworCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZXhlY3V0ZSAnJXMnIiwgYXJndlswXSk7CisjZWxzZQorCUJCX0VYRUNWUF9vcl9kaWUoYXJndik7CisjZW5kaWYKK30KKworLyoKK3RjcHN2ZCBbLWhwRXZ2XSBbLWMgbl0gWy1DIG46bXNnXSBbLWIgbl0gWy11IHVzZXJdIFstbCBuYW1lXQorCVstaSBkaXJ8LXggY2RiXSBbIC10IHNlY10gaG9zdCBwb3J0IHByb2cKKwordGNwc3ZkIGNyZWF0ZXMgYSBUQ1AvSVAgc29ja2V0LCBiaW5kcyBpdCB0byB0aGUgYWRkcmVzcyBob3N0OnBvcnQsCithbmQgbGlzdGVucyBvbiB0aGUgc29ja2V0IGZvciBpbmNvbWluZyBjb25uZWN0aW9ucy4KKworT24gZWFjaCBpbmNvbWluZyBjb25uZWN0aW9uLCB0Y3BzdmQgY29uZGl0aW9uYWxseSBydW5zIGEgcHJvZ3JhbSwKK3dpdGggc3RhbmRhcmQgaW5wdXQgcmVhZGluZyBmcm9tIHRoZSBzb2NrZXQsIGFuZCBzdGFuZGFyZCBvdXRwdXQKK3dyaXRpbmcgdG8gdGhlIHNvY2tldCwgdG8gaGFuZGxlIHRoaXMgY29ubmVjdGlvbi4gdGNwc3ZkIGtlZXBzCitsaXN0ZW5pbmcgb24gdGhlIHNvY2tldCBmb3IgbmV3IGNvbm5lY3Rpb25zLCBhbmQgY2FuIGhhbmRsZQorbXVsdGlwbGUgY29ubmVjdGlvbnMgc2ltdWx0YW5lb3VzbHkuCisKK3RjcHN2ZCBvcHRpb25hbGx5IGNoZWNrcyBmb3Igc3BlY2lhbCBpbnN0cnVjdGlvbnMgZGVwZW5kaW5nCitvbiB0aGUgSVAgYWRkcmVzcyBvciBob3N0bmFtZSBvZiB0aGUgY2xpZW50IHRoYXQgaW5pdGlhdGVkCit0aGUgY29ubmVjdGlvbiwgc2VlIGlwc3ZkLWluc3RydWN0KDUpLgorCitob3N0CisgICAgaG9zdCBlaXRoZXIgaXMgYSBob3N0bmFtZSwgb3IgYSBkb3R0ZWQtZGVjaW1hbCBJUCBhZGRyZXNzLAorICAgIG9yIDAuIElmIGhvc3QgaXMgMCwgdGNwc3ZkIGFjY2VwdHMgY29ubmVjdGlvbnMgdG8gYW55IGxvY2FsCisgICAgSVAgYWRkcmVzcy4KKyAgICAqIGJ1c3lib3ggYWNjZXB0cyBJUHY2IGFkZHJlc3NlcyBhbmQgaG9zdDpwb3J0IHBhaXJzIHRvbworICAgICAgSW4gdGhpcyBjYXNlIHNlY29uZCBwYXJhbWV0ZXIgaXMgaWdub3JlZAorcG9ydAorICAgIHRjcHN2ZCBhY2NlcHRzIGNvbm5lY3Rpb25zIHRvIGhvc3Q6cG9ydC4gcG9ydCBtYXkgYmUgYSBuYW1lCisgICAgZnJvbSAvZXRjL3NlcnZpY2VzIG9yIGEgbnVtYmVyLgorcHJvZworICAgIHByb2cgY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUgYXJndW1lbnRzLiBGb3IgZWFjaCBjb25uZWN0aW9uLAorICAgIHRjcHN2ZCBub3JtYWxseSBydW5zIHByb2csIHdpdGggZmlsZSBkZXNjcmlwdG9yIDAgcmVhZGluZyBmcm9tCisgICAgdGhlIG5ldHdvcmssIGFuZCBmaWxlIGRlc2NyaXB0b3IgMSB3cml0aW5nIHRvIHRoZSBuZXR3b3JrLgorICAgIEJ5IGRlZmF1bHQgaXQgYWxzbyBzZXRzIHVwIFRDUC1yZWxhdGVkIGVudmlyb25tZW50IHZhcmlhYmxlcywKKyAgICBzZWUgdGNwLWVudmlyb24oNSkKKy1pIGRpcgorICAgIHJlYWQgaW5zdHJ1Y3Rpb25zIGZvciBoYW5kbGluZyBuZXcgY29ubmVjdGlvbnMgZnJvbSB0aGUgaW5zdHJ1Y3Rpb25zCisgICAgZGlyZWN0b3J5IGRpci4gU2VlIGlwc3ZkLWluc3RydWN0KDUpIGZvciBkZXRhaWxzLgorICAgICogaWdub3JlZCBieSBidXN5Ym94ZWQgdmVyc2lvbgorLXggY2RiCisgICAgcmVhZCBpbnN0cnVjdGlvbnMgZm9yIGhhbmRsaW5nIG5ldyBjb25uZWN0aW9ucyBmcm9tIHRoZSBjb25zdGFudCBkYXRhYmFzZQorICAgIGNkYi4gVGhlIGNvbnN0YW50IGRhdGFiYXNlIG5vcm1hbGx5IGlzIGNyZWF0ZWQgZnJvbSBhbiBpbnN0cnVjdGlvbnMKKyAgICBkaXJlY3RvcnkgYnkgcnVubmluZyBpcHN2ZC1jZGIoOCkuCisgICAgKiBpZ25vcmVkIGJ5IGJ1c3lib3hlZCB2ZXJzaW9uCistdCBzZWMKKyAgICB0aW1lb3V0LiBUaGlzIG9wdGlvbiBvbmx5IHRha2VzIGVmZmVjdCBpZiB0aGUgLWkgb3B0aW9uIGlzIGdpdmVuLgorICAgIFdoaWxlIGNoZWNraW5nIHRoZSBpbnN0cnVjdGlvbnMgZGlyZWN0b3J5LCBjaGVjayB0aGUgdGltZSBvZiBsYXN0IGFjY2VzcworICAgIG9mIHRoZSBmaWxlIHRoYXQgbWF0Y2hlcyB0aGUgY2xpZW50cyBhZGRyZXNzIG9yIGhvc3RuYW1lIGlmIGFueSwgZGlzY2FyZAorICAgIGFuZCByZW1vdmUgdGhlIGZpbGUgaWYgaXQgd2Fzbid0IGFjY2Vzc2VkIHdpdGhpbiB0aGUgbGFzdCBzZWMgc2Vjb25kczsKKyAgICB0Y3BzdmQgZG9lcyBub3QgZGlzY2FyZCBvciByZW1vdmUgYSBmaWxlIGlmIHRoZSB1c2VyJ3Mgd3JpdGUgcGVybWlzc2lvbgorICAgIGlzIG5vdCBzZXQsIGZvciB0aG9zZSBmaWxlcyB0aGUgdGltZW91dCBpcyBkaXNhYmxlZC4gRGVmYXVsdCBpcyAwLAorICAgIHdoaWNoIG1lYW5zIHRoYXQgdGhlIHRpbWVvdXQgaXMgZGlzYWJsZWQuCisgICAgKiBpZ25vcmVkIGJ5IGJ1c3lib3hlZCB2ZXJzaW9uCistbCBuYW1lCisgICAgbG9jYWwgaG9zdG5hbWUuIERvIG5vdCBsb29rIHVwIHRoZSBsb2NhbCBob3N0bmFtZSBpbiBETlMsIGJ1dCB1c2UgbmFtZQorICAgIGFzIGhvc3RuYW1lLiBUaGlzIG9wdGlvbiBtdXN0IGJlIHNldCBpZiB0Y3BzdmQgbGlzdGVucyBvbiBwb3J0IDUzCisgICAgdG8gYXZvaWQgbG9vcHMuCistdSB1c2VyWzpncm91cF0KKyAgICBkcm9wIHBlcm1pc3Npb25zLiBTd2l0Y2ggdXNlciBJRCB0byB1c2VyJ3MgVUlELCBhbmQgZ3JvdXAgSUQgdG8gdXNlcidzCisgICAgcHJpbWFyeSBHSUQgYWZ0ZXIgY3JlYXRpbmcgYW5kIGJpbmRpbmcgdG8gdGhlIHNvY2tldC4gSWYgdXNlciBpcyBmb2xsb3dlZAorICAgIGJ5IGEgY29sb24gYW5kIGEgZ3JvdXAgbmFtZSwgdGhlIGdyb3VwIElEIGlzIHN3aXRjaGVkIHRvIHRoZSBHSUQgb2YgZ3JvdXAKKyAgICBpbnN0ZWFkLiBBbGwgc3VwcGxlbWVudGFyeSBncm91cHMgYXJlIHJlbW92ZWQuCistYyBuCisgICAgY29uY3VycmVuY3kuIEhhbmRsZSB1cCB0byBuIGNvbm5lY3Rpb25zIHNpbXVsdGFuZW91c2x5LiBEZWZhdWx0IGlzIDMwLgorICAgIElmIHRoZXJlIGFyZSBuIGNvbm5lY3Rpb25zIGFjdGl2ZSwgdGNwc3ZkIGRlZmVycyBhY2NlcHRhbmNlIG9mIGEgbmV3CisgICAgY29ubmVjdGlvbiB1bnRpbCBhbiBhY3RpdmUgY29ubmVjdGlvbiBpcyBjbG9zZWQuCistQyBuWzptc2ddCisgICAgcGVyIGhvc3QgY29uY3VycmVuY3kuIEFsbG93IG9ubHkgdXAgdG8gbiBjb25uZWN0aW9ucyBmcm9tIHRoZSBzYW1lIElQCisgICAgYWRkcmVzcyBzaW11bHRhbmVvdXNseS4gSWYgdGhlcmUgYXJlIG4gYWN0aXZlIGNvbm5lY3Rpb25zIGZyb20gb25lIElQCisgICAgYWRkcmVzcywgbmV3IGluY29taW5nIGNvbm5lY3Rpb25zIGZyb20gdGhpcyBJUCBhZGRyZXNzIGFyZSBjbG9zZWQKKyAgICBpbW1lZGlhdGVseS4gSWYgbiBpcyBmb2xsb3dlZCBieSA6bXNnLCB0aGUgbWVzc2FnZSBtc2cgaXMgd3JpdHRlbgorICAgIHRvIHRoZSBjbGllbnQgaWYgcG9zc2libGUsIGJlZm9yZSBjbG9zaW5nIHRoZSBjb25uZWN0aW9uLiBCeSBkZWZhdWx0CisgICAgbXNnIGlzIGVtcHR5LiBTZWUgaXBzdmQtaW5zdHJ1Y3QoNSkgZm9yIHN1cHBvcnRlZCBlc2NhcGUgc2VxdWVuY2VzIGluIG1zZy4KKworICAgIEZvciBlYWNoIGFjY2VwdGVkIGNvbm5lY3Rpb24sIHRoZSBjdXJyZW50IHBlciBob3N0IGNvbmN1cnJlbmN5IGlzCisgICAgYXZhaWxhYmxlIHRocm91Z2ggdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFRDUENPTkNVUlJFTkNZLiBuIGFuZCBtc2cKKyAgICBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgaXBzdmQoNykgaW5zdHJ1Y3Rpb25zLCBzZWUgaXBzdmQtaW5zdHJ1Y3QoNSkuCisgICAgQnkgZGVmYXVsdCB0Y3BzdmQgZG9lc24ndCBrZWVwIHRyYWNrIG9mIGNvbm5lY3Rpb25zLgorLWgKKyAgICBMb29rIHVwIHRoZSBjbGllbnQncyBob3N0bmFtZSBpbiBETlMuCistcAorICAgIHBhcmFub2lkLiBBZnRlciBsb29raW5nIHVwIHRoZSBjbGllbnQncyBob3N0bmFtZSBpbiBETlMsIGxvb2sgdXAgdGhlIElQCisgICAgYWRkcmVzc2VzIGluIEROUyBmb3IgdGhhdCBob3N0bmFtZSwgYW5kIGZvcmdldCBhYm91dCB0aGUgaG9zdG5hbWUKKyAgICBpZiBub25lIG9mIHRoZSBhZGRyZXNzZXMgbWF0Y2ggdGhlIGNsaWVudCdzIElQIGFkZHJlc3MuIFlvdSBzaG91bGQKKyAgICBzZXQgdGhpcyBvcHRpb24gaWYgeW91IHVzZSBob3N0bmFtZSBiYXNlZCBpbnN0cnVjdGlvbnMuIFRoZSAtcCBvcHRpb24KKyAgICBpbXBsaWVzIHRoZSAtaCBvcHRpb24uCisgICAgKiBpZ25vcmVkIGJ5IGJ1c3lib3hlZCB2ZXJzaW9uCistYiBuCisgICAgYmFja2xvZy4gQWxsb3cgYSBiYWNrbG9nIG9mIGFwcHJveGltYXRlbHkgbiBUQ1AgU1lOcy4gT24gc29tZSBzeXN0ZW1zIG4KKyAgICBpcyBzaWxlbnRseSBsaW1pdGVkLiBEZWZhdWx0IGlzIDIwLgorLUUKKyAgICBubyBzcGVjaWFsIGVudmlyb25tZW50LiBEbyBub3Qgc2V0IHVwIFRDUC1yZWxhdGVkIGVudmlyb25tZW50IHZhcmlhYmxlcy4KKy12CisgICAgdmVyYm9zZS4gUHJpbnQgdmVyYm9zZSBtZXNzc2FnZXMgdG8gc3RhbmRhcmQgb3V0cHV0LgorLXZ2CisgICAgbW9yZSB2ZXJib3NlLiBQcmludCBtb3JlIHZlcmJvc2UgbWVzc2FnZXMgdG8gc3RhbmRhcmQgb3V0cHV0LgorICAgICogbm8gZGlmZmVyZW5jZSBiZXR3ZWVuIC12IGFuZCAtdnYgaW4gYnVzeWJveGVkIHZlcnNpb24KKyovCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3RjcHVkcF9wZXJob3N0LmMgYi9uZXR3b3JraW5nL3RjcHVkcF9wZXJob3N0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA1NDEwOAotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvdGNwdWRwX3Blcmhvc3QuYwpAQCAtMCwwICsxLDY1IEBACisvKiBCYXNlZCBvbiBpcHN2ZCB1dGlsaXRpZXMgd3JpdHRlbiBieSBHZXJyaXQgUGFwZSA8cGFwZUBzbWFyZGVuLm9yZz4KKyAqIHdoaWNoIGFyZSByZWxlYXNlZCBpbnRvIHB1YmxpYyBkb21haW4gYnkgdGhlIGF1dGhvci4KKyAqIEhvbWVwYWdlOiBodHRwOi8vc21hcmRlbi5zdW5zaXRlLmRrL2lwc3ZkLworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBEZW55cyBWbGFzZW5rby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInRjcHVkcF9wZXJob3N0LmgiCisKK3N0YXRpYyBzdHJ1Y3QgaGNjICpjYzsKK3N0YXRpYyB1bnNpZ25lZCBjY2xlbjsKKworLyogdG8gYmUgb3B0aW1pemVkICovCisKK3ZvaWQgaXBzdmRfcGVyaG9zdF9pbml0KHVuc2lnbmVkIGMpCit7CisvLwlmcmVlKGNjKTsKKwljYyA9IHh6YWxsb2MoYyAqIHNpemVvZigqY2MpKTsKKwljY2xlbiA9IGM7Cit9CisKK3Vuc2lnbmVkIGlwc3ZkX3Blcmhvc3RfYWRkKGNoYXIgKmlwLCB1bnNpZ25lZCBtYXhjb25uLCBzdHJ1Y3QgaGNjICoqaGNjcHApCit7CisJdW5zaWduZWQgaTsKKwl1bnNpZ25lZCBjb25uID0gMTsKKwlpbnQgZnJlZXBvcyA9IC0xOworCisJZm9yIChpID0gMDsgaSA8IGNjbGVuOyArK2kpIHsKKwkJaWYgKCFjY1tpXS5pcCkgeworCQkJZnJlZXBvcyA9IGk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3RyY21wKGNjW2ldLmlwLCBpcCkgPT0gMCkgeworCQkJY29ubisrOworCQkJY29udGludWU7CisJCX0KKwl9CisJaWYgKGZyZWVwb3MgPT0gLTEpIHJldHVybiAwOworCWlmIChjb25uIDw9IG1heGNvbm4pIHsKKwkJY2NbZnJlZXBvc10uaXAgPSBpcDsKKwkJKmhjY3BwID0gJmNjW2ZyZWVwb3NdOworCX0KKwlyZXR1cm4gY29ubjsKK30KKwordm9pZCBpcHN2ZF9wZXJob3N0X3JlbW92ZShpbnQgcGlkKQoreworCXVuc2lnbmVkIGk7CisJZm9yIChpID0gMDsgaSA8IGNjbGVuOyArK2kpIHsKKwkJaWYgKGNjW2ldLnBpZCA9PSBwaWQpIHsKKwkJCWZyZWUoY2NbaV0uaXApOworCQkJY2NbaV0uaXAgPSBOVUxMOworCQkJY2NbaV0ucGlkID0gMDsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworLy92b2lkIGlwc3ZkX3Blcmhvc3RfZnJlZSh2b2lkKQorLy97CisvLwlmcmVlKGNjKTsKKy8vfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy90Y3B1ZHBfcGVyaG9zdC5oIGIvbmV0d29ya2luZy90Y3B1ZHBfcGVyaG9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNTc1NzYKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3RjcHVkcF9wZXJob3N0LmgKQEAgLTAsMCArMSwzMyBAQAorLyogQmFzZWQgb24gaXBzdmQgdXRpbGl0aWVzIHdyaXR0ZW4gYnkgR2Vycml0IFBhcGUgPHBhcGVAc21hcmRlbi5vcmc+CisgKiB3aGljaCBhcmUgcmVsZWFzZWQgaW50byBwdWJsaWMgZG9tYWluIGJ5IHRoZSBhdXRob3IuCisgKiBIb21lcGFnZTogaHR0cDovL3NtYXJkZW4uc3Vuc2l0ZS5kay9pcHN2ZC8KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgRGVueXMgVmxhc2Vua28uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworc3RydWN0IGhjYyB7CisJY2hhciAqaXA7CisJaW50IHBpZDsKK307CisKK3ZvaWQgaXBzdmRfcGVyaG9zdF9pbml0KHVuc2lnbmVkKTsKKworLyogUmV0dXJucyBudW1iZXIgb2YgYWxyZWFkeSBvcGVuZWQgY29ubmVjdHMgdG8gdGhpcyBpcHMsIGluY2x1ZGluZyB0aGlzIG9uZS4KKyAqIGlwIHNob3VsZCBiZSBhIG1hbGxvYydlZCBwdHIuCisgKiBJZiByZXR1cm4gdmFsdWUgaXMgPD0gbWF4Y29ubiwgaXAgaXMgaW5zZXJ0ZWQgaW50byB0aGUgdGFibGUKKyAqIGFuZCBwb2ludGVyIHRvIHRhYmxlIGVudHJ5IGlmIHN0b3JlZCBpbiAqaGNjcHAKKyAqICh1c2VmdWwgZm9yIHN0b3JpbmcgcGlkIGxhdGVyKS4KKyAqIEVsc2UgaXAgaXMgTk9UIGluc2VydGVkICh5b3UgbXVzdCB0YWtlIGNhcmUgb2YgaXQgLSBmcmVlKCkgZXRjKSAqLwordW5zaWduZWQgaXBzdmRfcGVyaG9zdF9hZGQoY2hhciAqaXAsIHVuc2lnbmVkIG1heGNvbm4sIHN0cnVjdCBoY2MgKipoY2NwcCk7CisKKy8qIEZpbmRzIGFuZCBmcmVlcyBlbGVtZW50IHdpdGggcGlkICovCit2b2lkIGlwc3ZkX3Blcmhvc3RfcmVtb3ZlKGludCBwaWQpOworCisvL3Vuc2lnbmVkIGlwc3ZkX3Blcmhvc3Rfc2V0cGlkKGludCBwaWQpOworLy92b2lkIGlwc3ZkX3Blcmhvc3RfZnJlZSh2b2lkKTsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvdGVsbmV0LmMgYi9uZXR3b3JraW5nL3RlbG5ldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYjZmYjEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3RlbG5ldC5jCkBAIC0wLDAgKzEsNjY1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB0ZWxuZXQgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBBdXRob3I6IFRvbWkgT2xsaWxhIDx0b29AaWtpLmZpPgorICogQ29weXJpZ2h0IChDKSAxOTk0LTIwMDAgYnkgVG9taSBPbGxpbGEKKyAqCisgKiBDcmVhdGVkOiBUaHUgQXByICA3IDEzOjI5OjQxIDE5OTQgdG9vCisgKiBMYXN0IG1vZGlmaWVkOiBGcmkgSnVuICA5IDE0OjM0OjI0IDIwMDAgdG9vCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBISVNUT1JZCisgKiBSZXZpc2lvbiAzLjEgIDE5OTQvMDQvMTcgIDExOjMxOjU0ICB0b28KKyAqIGluaXRpYWwgcmV2aXNpb24KKyAqIE1vZGlmaWVkIDIwMDAvMDYvMTMgZm9yIGluY2x1c2lvbiBpbnRvIEJ1c3lCb3ggYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogTW9kaWZpZWQgMjAwMS8wNS8wNyB0byBhZGQgYWJpbGl0eSB0byBwYXNzIFRUWVBFIHRvIHJlbW90ZSBob3N0IGJ5IEppbSBNY1F1aWxsYW4KKyAqIDxqYW1AbHRzcC5vcmc+CisgKiBNb2RpZmllZCAyMDA0LzAyLzExIHRvIGFkZCBhYmlsaXR5IHRvIHBhc3MgdGhlIFVTRVIgdmFyaWFibGUgdG8gcmVtb3RlIGhvc3QKKyAqIGJ5IEZlcm5hbmRvIFNpbHZlaXJhIDxzd3JoQGdteC5uZXQ+CisgKgorICovCisKKy8vdXNhZ2U6I2lmIEVOQUJMRV9GRUFUVVJFX1RFTE5FVF9BVVRPTE9HSU4KKy8vdXNhZ2U6I2RlZmluZSB0ZWxuZXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYV0gWy1sIFVTRVJdIEhPU1QgW1BPUlRdIgorLy91c2FnZTojZGVmaW5lIHRlbG5ldF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbm5lY3QgdG8gdGVsbmV0IHNlcnZlclxuIgorLy91c2FnZTogICAgICJcbgktYQlBdXRvbWF0aWMgbG9naW4gd2l0aCAkVVNFUiB2YXJpYWJsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWwgVVNFUglBdXRvbWF0aWMgbG9naW4gYXMgVVNFUiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNlbHNlCisvL3VzYWdlOiNkZWZpbmUgdGVsbmV0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJIT1NUIFtQT1JUXSIKKy8vdXNhZ2U6I2RlZmluZSB0ZWxuZXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDb25uZWN0IHRvIHRlbG5ldCBzZXJ2ZXIiCisvL3VzYWdlOiNlbmRpZgorCisjaW5jbHVkZSA8YXJwYS90ZWxuZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmZGVmIF9fQklPTklDX18KKy8qIHNob3VsZCBiZSBpbiBhcnBhL3RlbG5ldC5oICovCisjIGRlZmluZSBJQUMgICAgICAgICAyNTUgIC8qIGludGVycHJldCBhcyBjb21tYW5kOiAqLworIyBkZWZpbmUgRE9OVCAgICAgICAgMjU0ICAvKiB5b3UgYXJlIG5vdCB0byB1c2Ugb3B0aW9uICovCisjIGRlZmluZSBETyAgICAgICAgICAyNTMgIC8qIHBsZWFzZSwgeW91IHVzZSBvcHRpb24gKi8KKyMgZGVmaW5lIFdPTlQgICAgICAgIDI1MiAgLyogSSB3b24ndCB1c2Ugb3B0aW9uICovCisjIGRlZmluZSBXSUxMICAgICAgICAyNTEgIC8qIEkgd2lsbCB1c2Ugb3B0aW9uICovCisjIGRlZmluZSBTQiAgICAgICAgICAyNTAgIC8qIGludGVycHJldCBhcyBzdWJuZWdvdGlhdGlvbiAqLworIyBkZWZpbmUgU0UgICAgICAgICAgMjQwICAvKiBlbmQgc3ViIG5lZ290aWF0aW9uICovCisjIGRlZmluZSBURUxPUFRfRUNITyAgIDEgIC8qIGVjaG8gKi8KKyMgZGVmaW5lIFRFTE9QVF9TR0EgICAgMyAgLyogc3VwcHJlc3MgZ28gYWhlYWQgKi8KKyMgZGVmaW5lIFRFTE9QVF9UVFlQRSAyNCAgLyogdGVybWluYWwgdHlwZSAqLworIyBkZWZpbmUgVEVMT1BUX05BV1MgIDMxICAvKiB3aW5kb3cgc2l6ZSAqLworI2VuZGlmCisKKyNpZmRlZiBET1RSQUNFCisjIGRlZmluZSBUUkFDRSh4LCB5KSBkbyB7IGlmICh4KSBwcmludGYgeTsgfSB3aGlsZSAoMCkKKyNlbHNlCisjIGRlZmluZSBUUkFDRSh4LCB5KQorI2VuZGlmCisKK2VudW0geworCURBVEFCVUZTSVpFID0gMTI4LAorCUlBQ0JVRlNJWkUgID0gMTI4LAorCisJQ0hNX1RSWSA9IDAsCisJQ0hNX09OID0gMSwKKwlDSE1fT0ZGID0gMiwKKworCVVGX0VDSE8gPSAweDAxLAorCVVGX1NHQSA9IDB4MDIsCisKKwlUU19OT1JNQUwgPSAwLAorCVRTX0NPUFkgPSAxLAorCVRTX0lBQyA9IDIsCisJVFNfT1BUID0gMywKKwlUU19TVUIxID0gNCwKKwlUU19TVUIyID0gNSwKKwlUU19DUiA9IDYsCit9OworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgYnl0ZTsKKworZW51bSB7IG5ldGZkID0gMyB9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJaW50CWlhY2xlbjsgLyogY291bGQgZXZlbiB1c2UgYnl0ZSwgYnV0IGl0J3MgYSBsb3NzIG9uIHg4NiAqLworCWJ5dGUJdGVsc3RhdGU7IC8qIHRlbG5ldCBuZWdvdGlhdGlvbiBzdGF0ZSBmcm9tIG5ldHdvcmsgaW5wdXQgKi8KKwlieXRlCXRlbHdpc2g7ICAvKiBETywgRE9OVCwgV0lMTCwgV09OVCAqLworCWJ5dGUgICAgY2hhcm1vZGU7CisJYnl0ZSAgICB0ZWxmbGFnczsKKwlieXRlCWRvX3Rlcm1pb3M7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVUX1RUWVBFCisJY2hhcgkqdHR5cGU7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9URUxORVRfQVVUT0xPR0lOCisJY29uc3QgY2hhciAqYXV0b2xvZ2luOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfQVVUT1dJRFRICisJdW5zaWduZWQgd2luX3dpZHRoLCB3aW5faGVpZ2h0OworI2VuZGlmCisJLyogc2FtZSBidWZmZXIgdXNlZCBib3RoIGZvciBuZXR3b3JrIGFuZCBjb25zb2xlIHJlYWQvd3JpdGUgKi8KKwljaGFyICAgIGJ1ZltEQVRBQlVGU0laRV07CisJLyogYnVmZmVyIHRvIGhhbmRsZSB0ZWxuZXQgbmVnb3RpYXRpb25zICovCisJY2hhciAgICBpYWNidWZbSUFDQlVGU0laRV07CisJc3RydWN0IHRlcm1pb3MgdGVybWlvc19kZWY7CisJc3RydWN0IHRlcm1pb3MgdGVybWlvc19yYXc7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlzdHJ1Y3QgR19zaXplY2hlY2sgeyBcCisJCWNoYXIgR19zaXplY2hlY2tbc2l6ZW9mKEcpID4gQ09NTU9OX0JVRlNJWkUgPyAtMSA6IDFdOyBcCisJfTsgXAorfSB3aGlsZSAoMCkKKworCitzdGF0aWMgdm9pZCByYXdtb2RlKHZvaWQpOworc3RhdGljIHZvaWQgY29va21vZGUodm9pZCk7CitzdGF0aWMgdm9pZCBkb19saW5lbW9kZSh2b2lkKTsKK3N0YXRpYyB2b2lkIHdpbGxfY2hhcm1vZGUodm9pZCk7CitzdGF0aWMgdm9pZCB0ZWxvcHQoYnl0ZSBjKTsKK3N0YXRpYyB2b2lkIHN1Ym5lZyhieXRlIGMpOworCitzdGF0aWMgdm9pZCBpYWNfZmx1c2godm9pZCkKK3sKKwlmdWxsX3dyaXRlKG5ldGZkLCBHLmlhY2J1ZiwgRy5pYWNsZW4pOworCUcuaWFjbGVuID0gMDsKK30KKworc3RhdGljIHZvaWQgZG9leGl0KGludCBldikgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBkb2V4aXQoaW50IGV2KQoreworCWNvb2ttb2RlKCk7CisJZXhpdChldik7Cit9CisKK3N0YXRpYyB2b2lkIGNvbl9lc2NhcGUodm9pZCkKK3sKKwljaGFyIGI7CisKKwlpZiAoYmJfZ290X3NpZ25hbCkgLyogY2FtZSBmcm9tIGxpbmUgbW9kZS4uLiBnbyByYXcgKi8KKwkJcmF3bW9kZSgpOworCisJZnVsbF93cml0ZTFfc3RyKCJcclxuQ29uc29sZSBlc2NhcGUuIENvbW1hbmRzIGFyZTpcclxuXG4iCisJCQkiIGwJZ28gdG8gbGluZSBtb2RlXHJcbiIKKwkJCSIgYwlnbyB0byBjaGFyYWN0ZXIgbW9kZVxyXG4iCisJCQkiIHoJc3VzcGVuZCB0ZWxuZXRcclxuIgorCQkJIiBlCWV4aXQgdGVsbmV0XHJcbiIpOworCisJaWYgKHJlYWQoU1RESU5fRklMRU5PLCAmYiwgMSkgPD0gMCkKKwkJZG9leGl0KEVYSVRfRkFJTFVSRSk7CisKKwlzd2l0Y2ggKGIpIHsKKwljYXNlICdsJzoKKwkJaWYgKCFiYl9nb3Rfc2lnbmFsKSB7CisJCQlkb19saW5lbW9kZSgpOworCQkJZ290byByZXQ7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAnYyc6CisJCWlmIChiYl9nb3Rfc2lnbmFsKSB7CisJCQl3aWxsX2NoYXJtb2RlKCk7CisJCQlnb3RvIHJldDsKKwkJfQorCQlicmVhazsKKwljYXNlICd6JzoKKwkJY29va21vZGUoKTsKKwkJa2lsbCgwLCBTSUdUU1RQKTsKKwkJcmF3bW9kZSgpOworCQlicmVhazsKKwljYXNlICdlJzoKKwkJZG9leGl0KEVYSVRfU1VDQ0VTUyk7CisJfQorCisJZnVsbF93cml0ZTFfc3RyKCJjb250aW51aW5nLi4uXHJcbiIpOworCisJaWYgKGJiX2dvdF9zaWduYWwpCisJCWNvb2ttb2RlKCk7CisgcmV0OgorCWJiX2dvdF9zaWduYWwgPSAwOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfbmV0X291dHB1dChpbnQgbGVuKQoreworCWJ5dGUgb3V0YnVmWzIgKiBEQVRBQlVGU0laRV07CisJYnl0ZSAqZHN0ID0gb3V0YnVmOworCWJ5dGUgKnNyYyA9IChieXRlKilHLmJ1ZjsKKwlieXRlICplbmQgPSBzcmMgKyBsZW47CisKKwl3aGlsZSAoc3JjIDwgZW5kKSB7CisJCWJ5dGUgYyA9ICpzcmMrKzsKKwkJaWYgKGMgPT0gMHgxZCkgeworCQkJY29uX2VzY2FwZSgpOworCQkJcmV0dXJuOworCQl9CisJCSpkc3QgPSBjOworCQlpZiAoYyA9PSBJQUMpCisJCQkqKytkc3QgPSBjOyAvKiBJQUMgLT4gSUFDIElBQyAqLworCQllbHNlCisJCWlmIChjID09ICdccicgfHwgYyA9PSAnXG4nKSB7CisJCQkvKiBFbnRlciBrZXkgc2VuZHMgJ1xyJyBpbiByYXcgbW9kZSBhbmQgJ1xuJyBpbiBjb29rZWQgb25lLgorCQkJICoKKwkJCSAqIFNlZSBSRkMgMTEyMyAzLjMuMSBUZWxuZXQgRW5kLW9mLUxpbmUgQ29udmVudGlvbi4KKwkJCSAqIFVzaW5nIENSIExGIGluc3RlYWQgb2Ygb3RoZXIgYWxsb3dlZCBwb3NzaWJpbGl0aWVzCisJCQkgKiBsaWtlIENSIE5VTCAtIGVhc2llciB0byB0YWxrIHRvIEhUVFAvU01UUCBzZXJ2ZXJzLgorCQkJICovCisJCQkqZHN0ID0gJ1xyJzsgLyogRW50ZXIgLT4gQ1IgTEYgKi8KKwkJCSorK2RzdCA9ICdcbic7CisJCX0KKwkJZHN0Kys7CisJfQorCWlmIChkc3QgLSBvdXRidWYgIT0gMCkKKwkJZnVsbF93cml0ZShuZXRmZCwgb3V0YnVmLCBkc3QgLSBvdXRidWYpOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfbmV0X2lucHV0KGludCBsZW4pCit7CisJaW50IGk7CisJaW50IGNzdGFydCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKwkJYnl0ZSBjID0gRy5idWZbaV07CisKKwkJaWYgKEcudGVsc3RhdGUgPT0gVFNfTk9STUFMKSB7IC8qIG1vc3QgdHlwaWNhbCBzdGF0ZSAqLworCQkJaWYgKGMgPT0gSUFDKSB7CisJCQkJY3N0YXJ0ID0gaTsKKwkJCQlHLnRlbHN0YXRlID0gVFNfSUFDOworCQkJfQorCQkJZWxzZSBpZiAoYyA9PSAnXHInKSB7CisJCQkJY3N0YXJ0ID0gaSArIDE7CisJCQkJRy50ZWxzdGF0ZSA9IFRTX0NSOworCQkJfQorCQkJLyogTm8gSUFDcyB3ZXJlIHNlZW4gc28gZmFyLCBubyBuZWVkIHRvIGNvcHkKKwkJCSAqIGJ5dGVzIHdpdGhpbiBHLmJ1ZjogKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3dpdGNoIChHLnRlbHN0YXRlKSB7CisJCWNhc2UgVFNfQ1I6CisJCQkvKiBQcmV2IGNoYXIgd2FzIENSLiBJZiBjdXIgb25lIGlzIE5VTCwgaWdub3JlIGl0LgorCQkJICogU2VlIFJGQyAxMTIzIHNlY3Rpb24gMy4zLjEgZm9yIGRpc2N1c3Npb24gb2YgdGVsbmV0IEVPTCBoYW5kbGluZy4KKwkJCSAqLworCQkJRy50ZWxzdGF0ZSA9IFRTX0NPUFk7CisJCQlpZiAoYyA9PSAnXDAnKQorCQkJCWJyZWFrOworCQkJLyogZWxzZTogZmFsbCB0aHJvdWdoIC0gbmVlZCB0byBoYW5kbGUgQ1IgSUFDIC4uLiBwcm9wZXJseSAqLworCisJCWNhc2UgVFNfQ09QWTogLyogUHJldiBjaGFyIHdhcyBvcmRpbmFyeSAqLworCQkJLyogU2ltaWxhciB0byBOT1JNQUwsIGJ1dCBpbiBUU19DT1BZIHdlIG5lZWQgdG8gY29weSBieXRlcyAqLworCQkJaWYgKGMgPT0gSUFDKQorCQkJCUcudGVsc3RhdGUgPSBUU19JQUM7CisJCQllbHNlCisJCQkJRy5idWZbY3N0YXJ0KytdID0gYzsKKwkJCWlmIChjID09ICdccicpCisJCQkJRy50ZWxzdGF0ZSA9IFRTX0NSOworCQkJYnJlYWs7CisKKwkJY2FzZSBUU19JQUM6IC8qIFByZXYgY2hhciB3YXMgSUFDICovCisJCQlpZiAoYyA9PSBJQUMpIHsgLyogSUFDIElBQyAtPiBvbmUgSUFDICovCisJCQkJRy5idWZbY3N0YXJ0KytdID0gYzsKKwkJCQlHLnRlbHN0YXRlID0gVFNfQ09QWTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIGVsc2UgKi8KKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSBTQjoKKwkJCQlHLnRlbHN0YXRlID0gVFNfU1VCMTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRE86CisJCQljYXNlIERPTlQ6CisJCQljYXNlIFdJTEw6CisJCQljYXNlIFdPTlQ6CisJCQkJRy50ZWx3aXNoID0gYzsKKwkJCQlHLnRlbHN0YXRlID0gVFNfT1BUOworCQkJCWJyZWFrOworCQkJLyogREFUQSBNQVJLIG11c3QgYmUgYWRkZWQgbGF0ZXIgKi8KKwkJCWRlZmF1bHQ6CisJCQkJRy50ZWxzdGF0ZSA9IFRTX0NPUFk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIFRTX09QVDogLyogUHJldiBjaGFycyB3ZXJlIElBQyBXSUxML1dPTlQvRE8vRE9OVCAqLworCQkJdGVsb3B0KGMpOworCQkJRy50ZWxzdGF0ZSA9IFRTX0NPUFk7CisJCQlicmVhazsKKworCQljYXNlIFRTX1NVQjE6IC8qIFN1Ym5lZ290aWF0aW9uICovCisJCWNhc2UgVFNfU1VCMjogLyogU3VibmVnb3RpYXRpb24gKi8KKwkJCXN1Ym5lZyhjKTsgLyogY2FuIGNoYW5nZSBHLnRlbHN0YXRlICovCisJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChHLnRlbHN0YXRlICE9IFRTX05PUk1BTCkgeworCQkvKiBXZSBoYWQgc29tZSBJQUNzLCBvciBDUiAqLworCQlpZiAoRy5pYWNsZW4pCisJCQlpYWNfZmx1c2goKTsKKwkJaWYgKEcudGVsc3RhdGUgPT0gVFNfQ09QWSkgLyogd2UgYXJlbid0IGluIHRoZSBtaWRkbGUgb2YgSUFDICovCisJCQlHLnRlbHN0YXRlID0gVFNfTk9STUFMOworCQlsZW4gPSBjc3RhcnQ7CisJfQorCisJaWYgKGxlbikKKwkJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBHLmJ1ZiwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgcHV0X2lhYyhpbnQgYykKK3sKKwlHLmlhY2J1ZltHLmlhY2xlbisrXSA9IGM7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9pYWMyKGJ5dGUgd3dkZCwgYnl0ZSBjKQoreworCWlmIChHLmlhY2xlbiArIDMgPiBJQUNCVUZTSVpFKQorCQlpYWNfZmx1c2goKTsKKworCXB1dF9pYWMoSUFDKTsKKwlwdXRfaWFjKHd3ZGQpOworCXB1dF9pYWMoYyk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9URUxORVRfVFRZUEUKK3N0YXRpYyB2b2lkIHB1dF9pYWNfc3Vib3B0KGJ5dGUgYywgY2hhciAqc3RyKQoreworCWludCBsZW4gPSBzdHJsZW4oc3RyKSArIDY7ICAgLy8gKCAyICsgMSArIDEgKyBzdHJsZW4gKyAyICkKKworCWlmIChHLmlhY2xlbiArIGxlbiA+IElBQ0JVRlNJWkUpCisJCWlhY19mbHVzaCgpOworCisJcHV0X2lhYyhJQUMpOworCXB1dF9pYWMoU0IpOworCXB1dF9pYWMoYyk7CisJcHV0X2lhYygwKTsKKworCXdoaWxlICgqc3RyKQorCQlwdXRfaWFjKCpzdHIrKyk7CisKKwlwdXRfaWFjKElBQyk7CisJcHV0X2lhYyhTRSk7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RFTE5FVF9BVVRPTE9HSU4KK3N0YXRpYyB2b2lkIHB1dF9pYWNfc3Vib3B0X2F1dG9sb2dpbih2b2lkKQoreworCWludCBsZW4gPSBzdHJsZW4oRy5hdXRvbG9naW4pICsgNjsJLy8gKDIgKyAxICsgMSArIHN0cmxlbiArIDIpCisJY29uc3QgY2hhciAqcCA9ICJVU0VSIjsKKworCWlmIChHLmlhY2xlbiArIGxlbiA+IElBQ0JVRlNJWkUpCisJCWlhY19mbHVzaCgpOworCisJcHV0X2lhYyhJQUMpOworCXB1dF9pYWMoU0IpOworCXB1dF9pYWMoVEVMT1BUX05FV19FTlZJUk9OKTsKKwlwdXRfaWFjKFRFTFFVQUxfSVMpOworCXB1dF9pYWMoTkVXX0VOVl9WQVIpOworCisJd2hpbGUgKCpwKQorCQlwdXRfaWFjKCpwKyspOworCisJcHV0X2lhYyhORVdfRU5WX1ZBTFVFKTsKKworCXAgPSBHLmF1dG9sb2dpbjsKKwl3aGlsZSAoKnApCisJCXB1dF9pYWMoKnArKyk7CisKKwlwdXRfaWFjKElBQyk7CisJcHV0X2lhYyhTRSk7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0FVVE9XSURUSAorc3RhdGljIHZvaWQgcHV0X2lhY19uYXdzKGJ5dGUgYywgaW50IHgsIGludCB5KQoreworCWlmIChHLmlhY2xlbiArIDkgPiBJQUNCVUZTSVpFKQorCQlpYWNfZmx1c2goKTsKKworCXB1dF9pYWMoSUFDKTsKKwlwdXRfaWFjKFNCKTsKKwlwdXRfaWFjKGMpOworCisJLyogIi4uLiAmIDB4ZmYiIGltcGxpY2l0bHkgZG9uZSBiZWxvdyAqLworCXB1dF9pYWMoeCA+PiA4KTsKKwlwdXRfaWFjKHgpOworCXB1dF9pYWMoeSA+PiA4KTsKKwlwdXRfaWFjKHkpOworCisJcHV0X2lhYyhJQUMpOworCXB1dF9pYWMoU0UpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNldENvbk1vZGUodm9pZCkKK3sKKwlpZiAoRy50ZWxmbGFncyAmIFVGX0VDSE8pIHsKKwkJaWYgKEcuY2hhcm1vZGUgPT0gQ0hNX1RSWSkgeworCQkJRy5jaGFybW9kZSA9IENITV9PTjsKKwkJCXByaW50ZigiXHJcbkVudGVyaW5nICVzIG1vZGUiCisJCQkJIlxyXG5Fc2NhcGUgY2hhcmFjdGVyIGlzICdeJWMnLlxyXG4iLCAiY2hhcmFjdGVyIiwgJ10nKTsKKwkJCXJhd21vZGUoKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChHLmNoYXJtb2RlICE9IENITV9PRkYpIHsKKwkJCUcuY2hhcm1vZGUgPSBDSE1fT0ZGOworCQkJcHJpbnRmKCJcclxuRW50ZXJpbmcgJXMgbW9kZSIKKwkJCQkiXHJcbkVzY2FwZSBjaGFyYWN0ZXIgaXMgJ14lYycuXHJcbiIsICJsaW5lIiwgJ0MnKTsKKwkJCWNvb2ttb2RlKCk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHdpbGxfY2hhcm1vZGUodm9pZCkKK3sKKwlHLmNoYXJtb2RlID0gQ0hNX1RSWTsKKwlHLnRlbGZsYWdzIHw9IChVRl9FQ0hPIHwgVUZfU0dBKTsKKwlzZXRDb25Nb2RlKCk7CisKKwlwdXRfaWFjMihETywgVEVMT1BUX0VDSE8pOworCXB1dF9pYWMyKERPLCBURUxPUFRfU0dBKTsKKwlpYWNfZmx1c2goKTsKK30KKworc3RhdGljIHZvaWQgZG9fbGluZW1vZGUodm9pZCkKK3sKKwlHLmNoYXJtb2RlID0gQ0hNX1RSWTsKKwlHLnRlbGZsYWdzICY9IH4oVUZfRUNITyB8IFVGX1NHQSk7CisJc2V0Q29uTW9kZSgpOworCisJcHV0X2lhYzIoRE9OVCwgVEVMT1BUX0VDSE8pOworCXB1dF9pYWMyKERPTlQsIFRFTE9QVF9TR0EpOworCWlhY19mbHVzaCgpOworfQorCitzdGF0aWMgdm9pZCB0b19ub3RzdXAoY2hhciBjKQoreworCWlmIChHLnRlbHdpc2ggPT0gV0lMTCkKKwkJcHV0X2lhYzIoRE9OVCwgYyk7CisJZWxzZSBpZiAoRy50ZWx3aXNoID09IERPKQorCQlwdXRfaWFjMihXT05ULCBjKTsKK30KKworc3RhdGljIHZvaWQgdG9fZWNobyh2b2lkKQoreworCS8qIGlmIHNlcnZlciByZXF1ZXN0cyBFQ0hPLCBkb24ndCBhZ3JlZSAqLworCWlmIChHLnRlbHdpc2ggPT0gRE8pIHsKKwkJcHV0X2lhYzIoV09OVCwgVEVMT1BUX0VDSE8pOworCQlyZXR1cm47CisJfQorCWlmIChHLnRlbHdpc2ggPT0gRE9OVCkKKwkJcmV0dXJuOworCisJaWYgKEcudGVsZmxhZ3MgJiBVRl9FQ0hPKSB7CisJCWlmIChHLnRlbHdpc2ggPT0gV0lMTCkKKwkJCXJldHVybjsKKwl9IGVsc2UgaWYgKEcudGVsd2lzaCA9PSBXT05UKQorCQlyZXR1cm47CisKKwlpZiAoRy5jaGFybW9kZSAhPSBDSE1fT0ZGKQorCQlHLnRlbGZsYWdzIF49IFVGX0VDSE87CisKKwlpZiAoRy50ZWxmbGFncyAmIFVGX0VDSE8pCisJCXB1dF9pYWMyKERPLCBURUxPUFRfRUNITyk7CisJZWxzZQorCQlwdXRfaWFjMihET05ULCBURUxPUFRfRUNITyk7CisKKwlzZXRDb25Nb2RlKCk7CisJZnVsbF93cml0ZTFfc3RyKCJcclxuIik7ICAvKiBzdWRkZW4gbW9kZWMgKi8KK30KKworc3RhdGljIHZvaWQgdG9fc2dhKHZvaWQpCit7CisJLyogZGFlbW9uIGFsd2F5cyBzZW5kcyB3aWxsL3dvbnQsIGNsaWVudCBkby9kb250ICovCisKKwlpZiAoRy50ZWxmbGFncyAmIFVGX1NHQSkgeworCQlpZiAoRy50ZWx3aXNoID09IFdJTEwpCisJCQlyZXR1cm47CisJfSBlbHNlIGlmIChHLnRlbHdpc2ggPT0gV09OVCkKKwkJcmV0dXJuOworCisJRy50ZWxmbGFncyBePSBVRl9TR0E7IC8qIHRvZ2dsZSAqLworCWlmIChHLnRlbGZsYWdzICYgVUZfU0dBKQorCQlwdXRfaWFjMihETywgVEVMT1BUX1NHQSk7CisJZWxzZQorCQlwdXRfaWFjMihET05ULCBURUxPUFRfU0dBKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1RFTE5FVF9UVFlQRQorc3RhdGljIHZvaWQgdG9fdHR5cGUodm9pZCkKK3sKKwkvKiBUZWxsIHNlcnZlciB3ZSB3aWxsIChvciB3b24ndCkgZG8gVFRZUEUgKi8KKwlpZiAoRy50dHlwZSkKKwkJcHV0X2lhYzIoV0lMTCwgVEVMT1BUX1RUWVBFKTsKKwllbHNlCisJCXB1dF9pYWMyKFdPTlQsIFRFTE9QVF9UVFlQRSk7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RFTE5FVF9BVVRPTE9HSU4KK3N0YXRpYyB2b2lkIHRvX25ld19lbnZpcm9uKHZvaWQpCit7CisJLyogVGVsbCBzZXJ2ZXIgd2Ugd2lsbCAob3Igd2lsbCBub3QpIGRvIEFVVE9MT0dJTiAqLworCWlmIChHLmF1dG9sb2dpbikKKwkJcHV0X2lhYzIoV0lMTCwgVEVMT1BUX05FV19FTlZJUk9OKTsKKwllbHNlCisJCXB1dF9pYWMyKFdPTlQsIFRFTE9QVF9ORVdfRU5WSVJPTik7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0FVVE9XSURUSAorc3RhdGljIHZvaWQgdG9fbmF3cyh2b2lkKQoreworCS8qIFRlbGwgc2VydmVyIHdlIHdpbGwgZG8gTkFXUyAqLworCXB1dF9pYWMyKFdJTEwsIFRFTE9QVF9OQVdTKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCB0ZWxvcHQoYnl0ZSBjKQoreworCXN3aXRjaCAoYykgeworCWNhc2UgVEVMT1BUX0VDSE86CisJCXRvX2VjaG8oKTsgYnJlYWs7CisJY2FzZSBURUxPUFRfU0dBOgorCQl0b19zZ2EoKTsgYnJlYWs7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVUX1RUWVBFCisJY2FzZSBURUxPUFRfVFRZUEU6CisJCXRvX3R0eXBlKCk7IGJyZWFrOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVUX0FVVE9MT0dJTgorCWNhc2UgVEVMT1BUX05FV19FTlZJUk9OOgorCQl0b19uZXdfZW52aXJvbigpOyBicmVhazsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0FVVE9XSURUSAorCWNhc2UgVEVMT1BUX05BV1M6CisJCXRvX25hd3MoKTsKKwkJcHV0X2lhY19uYXdzKGMsIEcud2luX3dpZHRoLCBHLndpbl9oZWlnaHQpOworCQlicmVhazsKKyNlbmRpZgorCWRlZmF1bHQ6CisJCXRvX25vdHN1cChjKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBzdWJuZWdvdGlhdGlvbiAtLSBpZ25vcmUgYWxsIChleGNlcHQgVFRZUEUsTkFXUykgKi8KK3N0YXRpYyB2b2lkIHN1Ym5lZyhieXRlIGMpCit7CisJc3dpdGNoIChHLnRlbHN0YXRlKSB7CisJY2FzZSBUU19TVUIxOgorCQlpZiAoYyA9PSBJQUMpCisJCQlHLnRlbHN0YXRlID0gVFNfU1VCMjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9URUxORVRfVFRZUEUKKwkJZWxzZQorCQlpZiAoYyA9PSBURUxPUFRfVFRZUEUgJiYgRy50dHlwZSkKKwkJCXB1dF9pYWNfc3Vib3B0KFRFTE9QVF9UVFlQRSwgRy50dHlwZSk7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9URUxORVRfQVVUT0xPR0lOCisJCWVsc2UKKwkJaWYgKGMgPT0gVEVMT1BUX05FV19FTlZJUk9OICYmIEcuYXV0b2xvZ2luKQorCQkJcHV0X2lhY19zdWJvcHRfYXV0b2xvZ2luKCk7CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSBUU19TVUIyOgorCQlpZiAoYyA9PSBTRSkgeworCQkJRy50ZWxzdGF0ZSA9IFRTX0NPUFk7CisJCQlyZXR1cm47CisJCX0KKwkJRy50ZWxzdGF0ZSA9IFRTX1NVQjE7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgcmF3bW9kZSh2b2lkKQoreworCWlmIChHLmRvX3Rlcm1pb3MpCisJCXRjc2V0YXR0cigwLCBUQ1NBRFJBSU4sICZHLnRlcm1pb3NfcmF3KTsKK30KKworc3RhdGljIHZvaWQgY29va21vZGUodm9pZCkKK3sKKwlpZiAoRy5kb190ZXJtaW9zKQorCQl0Y3NldGF0dHIoMCwgVENTQURSQUlOLCAmRy50ZXJtaW9zX2RlZik7Cit9CisKK2ludCB0ZWxuZXRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHRlbG5ldF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqaG9zdDsKKwlpbnQgcG9ydDsKKwlpbnQgbGVuOworCXN0cnVjdCBwb2xsZmQgdWZkc1syXTsKKworCUlOSVRfRygpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfQVVUT1dJRFRICisJZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodCgwLCAmRy53aW5fd2lkdGgsICZHLndpbl9oZWlnaHQpOworI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9URUxORVRfVFRZUEUKKwlHLnR0eXBlID0gZ2V0ZW52KCJURVJNIik7CisjZW5kaWYKKworCWlmICh0Y2dldGF0dHIoMCwgJkcudGVybWlvc19kZWYpID49IDApIHsKKwkJRy5kb190ZXJtaW9zID0gMTsKKwkJRy50ZXJtaW9zX3JhdyA9IEcudGVybWlvc19kZWY7CisJCWNmbWFrZXJhdygmRy50ZXJtaW9zX3Jhdyk7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVUX0FVVE9MT0dJTgorCWlmICgxICYgZ2V0b3B0MzIoYXJndiwgImFsOiIsICZHLmF1dG9sb2dpbikpCisJCUcuYXV0b2xvZ2luID0gZ2V0ZW52KCJVU0VSIik7CisJYXJndiArPSBvcHRpbmQ7CisjZWxzZQorCWFyZ3YrKzsKKyNlbmRpZgorCWlmICghKmFyZ3YpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwlob3N0ID0gKmFyZ3YrKzsKKwlwb3J0ID0gYmJfbG9va3VwX3BvcnQoKmFyZ3YgPyAqYXJndisrIDogInRlbG5ldCIsICJ0Y3AiLCAyMyk7CisJaWYgKCphcmd2KSAvKiBleHRyYSBwYXJhbXM/PyAqLworCQliYl9zaG93X3VzYWdlKCk7CisKKwl4bW92ZV9mZChjcmVhdGVfYW5kX2Nvbm5lY3Rfc3RyZWFtX29yX2RpZShob3N0LCBwb3J0KSwgbmV0ZmQpOworCisJc2V0c29ja29wdF9rZWVwYWxpdmUobmV0ZmQpOworCisJc2lnbmFsKFNJR0lOVCwgcmVjb3JkX3NpZ25vKTsKKworCXVmZHNbMF0uZmQgPSBTVERJTl9GSUxFTk87CisJdWZkc1swXS5ldmVudHMgPSBQT0xMSU47CisJdWZkc1sxXS5mZCA9IG5ldGZkOworCXVmZHNbMV0uZXZlbnRzID0gUE9MTElOOworCisJd2hpbGUgKDEpIHsKKwkJaWYgKHBvbGwodWZkcywgMiwgLTEpIDwgMCkgeworCQkJLyogZXJyb3IsIGlnbm9yZSBhbmQvb3IgbG9nIHNvbWV0aGluZywgYmF5IGdvIHRvIGxvb3AgKi8KKwkJCWlmIChiYl9nb3Rfc2lnbmFsKQorCQkJCWNvbl9lc2NhcGUoKTsKKwkJCWVsc2UKKwkJCQlzbGVlcCgxKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKy8vIEZJWE1FOiByZWFkcyBjYW4gYmxvY2suIE5lZWQgZnVsbCBiaWRpcmVjdGlvbmFsIGJ1ZmZlcmluZy4KKworCQlpZiAodWZkc1swXS5yZXZlbnRzKSB7CisJCQlsZW4gPSBzYWZlX3JlYWQoU1RESU5fRklMRU5PLCBHLmJ1ZiwgREFUQUJVRlNJWkUpOworCQkJaWYgKGxlbiA8PSAwKQorCQkJCWRvZXhpdChFWElUX1NVQ0NFU1MpOworCQkJVFJBQ0UoMCwgKCJSZWFkIGNvbjogJWRcbiIsIGxlbikpOworCQkJaGFuZGxlX25ldF9vdXRwdXQobGVuKTsKKwkJfQorCisJCWlmICh1ZmRzWzFdLnJldmVudHMpIHsKKwkJCWxlbiA9IHNhZmVfcmVhZChuZXRmZCwgRy5idWYsIERBVEFCVUZTSVpFKTsKKwkJCWlmIChsZW4gPD0gMCkgeworCQkJCWZ1bGxfd3JpdGUxX3N0cigiQ29ubmVjdGlvbiBjbG9zZWQgYnkgZm9yZWlnbiBob3N0XHJcbiIpOworCQkJCWRvZXhpdChFWElUX0ZBSUxVUkUpOworCQkJfQorCQkJVFJBQ0UoMCwgKCJSZWFkIG5ldGZkICglZCk6ICVkXG4iLCBuZXRmZCwgbGVuKSk7CisJCQloYW5kbGVfbmV0X2lucHV0KGxlbik7CisJCX0KKwl9IC8qIHdoaWxlICgxKSAqLworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy90ZWxuZXRkLmMgYi9uZXR3b3JraW5nL3RlbG5ldGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWQwNWZlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy90ZWxuZXRkLmMKQEAgLTAsMCArMSw3NDAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFNpbXBsZSB0ZWxuZXQgc2VydmVyCisgKiBCam9ybiBXZXNlbiwgQXhpcyBDb21tdW5pY2F0aW9ucyBBQiAoYmpvcm53QGF4aXMuY29tKQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiAoQykgQ29weXJpZ2h0IDIwMDAsIEF4aXMgQ29tbXVuaWNhdGlvbnMgQUIsIExVTkQsIFNXRURFTgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqCisgKiBUaGUgdGVsbmV0ZCBtYW5wYWdlIHNheXMgaXQgYWxsOgorICoKKyAqIFRlbG5ldGQgb3BlcmF0ZXMgYnkgYWxsb2NhdGluZyBhIHBzZXVkby10ZXJtaW5hbCBkZXZpY2UgKHNlZSBwdHkoNCkpIGZvcgorICogYSBjbGllbnQsIHRoZW4gY3JlYXRpbmcgYSBsb2dpbiBwcm9jZXNzIHdoaWNoIGhhcyB0aGUgc2xhdmUgc2lkZSBvZiB0aGUKKyAqIHBzZXVkby10ZXJtaW5hbCBhcyBzdGRpbiwgc3Rkb3V0LCBhbmQgc3RkZXJyLiBUZWxuZXRkIG1hbmlwdWxhdGVzIHRoZQorICogbWFzdGVyIHNpZGUgb2YgdGhlIHBzZXVkby10ZXJtaW5hbCwgaW1wbGVtZW50aW5nIHRoZSB0ZWxuZXQgcHJvdG9jb2wgYW5kCisgKiBwYXNzaW5nIGNoYXJhY3RlcnMgYmV0d2VlbiB0aGUgcmVtb3RlIGNsaWVudCBhbmQgdGhlIGxvZ2luIHByb2Nlc3MuCisgKgorICogVmxhZGltaXIgT2xleW5payA8ZHpvQHNpbXRyZWFzLnJ1PiAyMDAxCisgKiBTZXQgcHJvY2VzcyBncm91cCBjb3JyZWN0aW9ucywgaW5pdGlhbCBidXN5Ym94IHBvcnQKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgdGVsbmV0ZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIgorLy91c2FnZTojZGVmaW5lIHRlbG5ldGRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJIYW5kbGUgaW5jb21pbmcgdGVsbmV0IGNvbm5lY3Rpb25zIgorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FKCIgdmlhIGluZXRkIikgIlxuIgorLy91c2FnZTogICAgICJcbgktbCBMT0dJTglFeGVjIExPR0lOIG9uIGNvbm5lY3QiCisvL3VzYWdlOiAgICAgIlxuCS1mIElTU1VFX0ZJTEUJRGlzcGxheSBJU1NVRV9GSUxFIGluc3RlYWQgb2YgL2V0Yy9pc3N1ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLUsJCUNsb3NlIGNvbm5lY3Rpb24gYXMgc29vbiBhcyBsb2dpbiBleGl0cyIKKy8vdXNhZ2U6ICAgICAiXG4JCQkobm9ybWFsbHkgd2FpdCB1bnRpbCBhbGwgcHJvZ3JhbXMgY2xvc2Ugc2xhdmUgcHR5KSIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FKAorLy91c2FnZTogICAgICJcbgktcCBQT1JUCQlQb3J0IHRvIGxpc3RlbiBvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWIgQUREUls6UE9SVF0JQWRkcmVzcyB0byBiaW5kIHRvIgorLy91c2FnZTogICAgICJcbgktRgkJUnVuIGluIGZvcmVncm91bmQiCisvL3VzYWdlOiAgICAgIlxuCS1pCQlJbmV0ZCBtb2RlIgorLy91c2FnZToJSUZfRkVBVFVSRV9URUxORVREX0lORVREX1dBSVQoCisvL3VzYWdlOiAgICAgIlxuCS13IFNFQwkJSW5ldGQgJ3dhaXQnIG1vZGUsIGxpbmdlciB0aW1lIFNFQyIKKy8vdXNhZ2U6ICAgICAiXG4JLVMJCUxvZyB0byBzeXNsb2cgKGltcGxpZWQgYnkgLWkgb3Igd2l0aG91dCAtRiBhbmQgLXcpIgorLy91c2FnZToJKQorLy91c2FnZToJKQorCisjZGVmaW5lIERFQlVHIDAKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzbG9nLmg+CisKKyNpZiBERUJVRworIyBkZWZpbmUgVEVMQ01EUworIyBkZWZpbmUgVEVMT1BUUworI2VuZGlmCisjaW5jbHVkZSA8YXJwYS90ZWxuZXQuaD4KKworCitzdHJ1Y3QgdHNlc3Npb24geworCXN0cnVjdCB0c2Vzc2lvbiAqbmV4dDsKKwlwaWRfdCBzaGVsbF9waWQ7CisJaW50IHNvY2tmZF9yZWFkOworCWludCBzb2NrZmRfd3JpdGU7CisJaW50IHB0eWZkOworCisJLyogdHdvIGNpcmN1bGFyIGJ1ZmZlcnMgKi8KKwkvKmNoYXIgKmJ1ZjEsICpidWYyOyovCisvKiNkZWZpbmUgVFNfQlVGMSh0cykgdHMtPmJ1ZjEqLworLyojZGVmaW5lIFRTX0JVRjIodHMpIFRTX0JVRjIodHMpKi8KKyNkZWZpbmUgVFNfQlVGMSh0cykgKCh1bnNpZ25lZCBjaGFyKikodHMgKyAxKSkKKyNkZWZpbmUgVFNfQlVGMih0cykgKCgodW5zaWduZWQgY2hhciopKHRzICsgMSkpICsgQlVGU0laRSkKKwlpbnQgcmRpZHgxLCB3cmlkeDEsIHNpemUxOworCWludCByZGlkeDIsIHdyaWR4Miwgc2l6ZTI7Cit9OworCisvKiBUd28gYnVmZmVycyBhcmUgZGlyZWN0bHkgYWZ0ZXIgdHNlc3Npb24gaW4gbWFsbG9jZWQgbWVtb3J5LgorICogTWFrZSB3aG9sZSB0aGluZyBmaXQgaW4gNGsgKi8KK2VudW0geyBCVUZTSVpFID0gKDQgKiAxMDI0IC0gc2l6ZW9mKHN0cnVjdCB0c2Vzc2lvbikpIC8gMiB9OworCisKKy8qIEdsb2JhbHMgKi8KK3N0cnVjdCBnbG9iYWxzIHsKKwlzdHJ1Y3QgdHNlc3Npb24gKnNlc3Npb25zOworCWNvbnN0IGNoYXIgKmxvZ2lucGF0aDsKKwljb25zdCBjaGFyICppc3N1ZWZpbGU7CisJaW50IG1heGZkOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJRy5sb2dpbnBhdGggPSAiL2Jpbi9sb2dpbiI7IFwKKwlHLmlzc3VlZmlsZSA9ICIvZXRjL2lzc3VlLm5ldCI7IFwKK30gd2hpbGUgKDApCisKKworLyoKKyAgIFJlbW92ZSBhbGwgSUFDJ3MgZnJvbSBidWYxIChyZWNlaXZlZCBJQUNzIGFyZSBpZ25vcmVkIGFuZCBtdXN0IGJlIHJlbW92ZWQKKyAgIHNvIGFzIHRvIG5vdCBiZSBpbnRlcnByZXRlZCBieSB0aGUgdGVybWluYWwpLiAgTWFrZSBhbiB1bmludGVycnVwdGVkCisgICBzdHJpbmcgb2YgY2hhcmFjdGVycyBmaXQgZm9yIHRoZSB0ZXJtaW5hbC4gIERvIHRoaXMgYnkgcGFja2luZworICAgYWxsIGNoYXJhY3RlcnMgbWVhbnQgZm9yIHRoZSB0ZXJtaW5hbCBzZXF1ZW50aWFsbHkgdG93YXJkcyB0aGUgZW5kIG9mIGJ1Zi4KKworICAgUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjaGFyYWN0ZXJzIG1lYW50IGZvciB0aGUgdGVybWluYWwKKyAgIGFuZCBtYWtlICpudW1fdG90dHkgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgc2hvdWxkIGJlIHNlbnQgdG8KKyAgIHRoZSB0ZXJtaW5hbC4KKworICAgTm90ZSAtIGlmIGFuIElBQyAoMyBieXRlIHF1YW50aXR5KSBzdGFydHMgYmVmb3JlIChiZiArIGxlbikgYnV0IGV4dGVuZHMKKyAgIHBhc3QgKGJmICsgbGVuKSB0aGVuIHRoYXQgSUFDIHdpbGwgYmUgbGVmdCB1bnByb2Nlc3NlZCBhbmQgKnByb2Nlc3NlZAorICAgd2lsbCBiZSBsZXNzIHRoYW4gbGVuLgorCisgICBDUi1MRiAtPidzIENSIG1hcHBpbmcgaXMgYWxzbyBkb25lIGhlcmUsIGZvciBjb252ZW5pZW5jZS4KKworICAgTkI6IG1heSBmYWlsIHRvIHJlbW92ZSBpYWNzIHdoaWNoIHdyYXAgYXJvdW5kIGJ1ZmZlciEKKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgKgorcmVtb3ZlX2lhY3Moc3RydWN0IHRzZXNzaW9uICp0cywgaW50ICpwbnVtX3RvdHR5KQoreworCXVuc2lnbmVkIGNoYXIgKnB0cjAgPSBUU19CVUYxKHRzKSArIHRzLT53cmlkeDE7CisJdW5zaWduZWQgY2hhciAqcHRyID0gcHRyMDsKKwl1bnNpZ25lZCBjaGFyICp0b3R0eSA9IHB0cjsKKwl1bnNpZ25lZCBjaGFyICplbmQgPSBwdHIgKyBNSU4oQlVGU0laRSAtIHRzLT53cmlkeDEsIHRzLT5zaXplMSk7CisJaW50IG51bV90b3R0eTsKKworCXdoaWxlIChwdHIgPCBlbmQpIHsKKwkJaWYgKCpwdHIgIT0gSUFDKSB7CisJCQljaGFyIGMgPSAqcHRyOworCisJCQkqdG90dHkrKyA9IGM7CisJCQlwdHIrKzsKKwkJCS8qIFdlIG1hcCBcclxuID09PiBcciBmb3IgcHJhZ21hdGljIHJlYXNvbnMuCisJCQkgKiBNYW55IGNsaWVudCBpbXBsZW1lbnRhdGlvbnMgc2VuZCBcclxuIHdoZW4KKwkJCSAqIHRoZSB1c2VyIGhpdHMgdGhlIENhcnJpYWdlUmV0dXJuIGtleS4KKwkJCSAqIFNlZSBSRkMgMTEyMyAzLjMuMSBUZWxuZXQgRW5kLW9mLUxpbmUgQ29udmVudGlvbi4KKwkJCSAqLworCQkJaWYgKGMgPT0gJ1xyJyAmJiBwdHIgPCBlbmQgJiYgKCpwdHIgPT0gJ1xuJyB8fCAqcHRyID09ICdcMCcpKQorCQkJCXB0cisrOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoKHB0cisxKSA+PSBlbmQpCisJCQlicmVhazsKKwkJaWYgKHB0clsxXSA9PSBOT1ApIHsgLyogSWdub3JlPyAocHV0dHkga2VlcGFsaXZlLCBldGMuKSAqLworCQkJcHRyICs9IDI7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocHRyWzFdID09IElBQykgeyAvKiBMaXRlcmFsIElBQz8gKGVtYWNzIE0tREVMKSAqLworCQkJKnRvdHR5KysgPSBwdHJbMV07CisJCQlwdHIgKz0gMjsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyoKKwkJICogVEVMT1BUX05BV1Mgc3VwcG9ydCEKKwkJICovCisJCWlmICgocHRyKzIpID49IGVuZCkgeworCQkJLyogT25seSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBJQUMgaXMgaW4gdGhlCisJCQlidWZmZXIgd2Ugd2VyZSBhc2tlZCB0byBwcm9jZXNzLCB3ZSBjYW4ndAorCQkJcHJvY2VzcyB0aGlzIGNoYXIgKi8KKwkJCWJyZWFrOworCQl9CisJCS8qCisJCSAqIElBQyAtPiBTQiAtPiBURUxPUFRfTkFXUyAtPiA0LWJ5dGUgLT4gSUFDIC0+IFNFCisJCSAqLworCQlpZiAocHRyWzFdID09IFNCICYmIHB0clsyXSA9PSBURUxPUFRfTkFXUykgeworCQkJc3RydWN0IHdpbnNpemUgd3M7CisJCQlpZiAoKHB0cis4KSA+PSBlbmQpCisJCQkJYnJlYWs7ICAvKiBpbmNvbXBsZXRlLCBjYW4ndCBwcm9jZXNzICovCisJCQl3cy53c19jb2wgPSAocHRyWzNdIDw8IDgpIHwgcHRyWzRdOworCQkJd3Mud3Nfcm93ID0gKHB0cls1XSA8PCA4KSB8IHB0cls2XTsKKwkJCWlvY3RsKHRzLT5wdHlmZCwgVElPQ1NXSU5TWiwgKGNoYXIgKikmd3MpOworCQkJcHRyICs9IDk7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBza2lwIDMtYnl0ZSBJQUMgbm9uLVNCIGNtZCAqLworI2lmIERFQlVHCisJCWZwcmludGYoc3RkZXJyLCAiSWdub3JpbmcgSUFDICVzLCVzXG4iLAorCQkJCVRFTENNRChwdHJbMV0pLCBURUxPUFQocHRyWzJdKSk7CisjZW5kaWYKKwkJcHRyICs9IDM7CisJfQorCisJbnVtX3RvdHR5ID0gdG90dHkgLSBwdHIwOworCSpwbnVtX3RvdHR5ID0gbnVtX3RvdHR5OworCS8qIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gcHRyIGFuZCB0b3R0eSBpcyBudW1iZXIgb2YgaWFjcworCSAgIHdlIHJlbW92ZWQgZnJvbSB0aGUgc3RyZWFtLiBBZGp1c3QgYnVmMSBhY2NvcmRpbmdseSAqLworCWlmICgocHRyIC0gdG90dHkpID09IDApIC8qIDk5Ljk5OSUgb2YgY2FzZXMgKi8KKwkJcmV0dXJuIHB0cjA7CisJdHMtPndyaWR4MSArPSBwdHIgLSB0b3R0eTsKKwl0cy0+c2l6ZTEgLT0gcHRyIC0gdG90dHk7CisJLyogTW92ZSBjaGFycyBtZWFudCBmb3IgdGhlIHRlcm1pbmFsIHRvd2FyZHMgdGhlIGVuZCBvZiB0aGUgYnVmZmVyICovCisJcmV0dXJuIG1lbW1vdmUocHRyIC0gbnVtX3RvdHR5LCBwdHIwLCBudW1fdG90dHkpOworfQorCisvKgorICogQ29udmVydGluZyBzaW5nbGUgSUFDIGludG8gZG91YmxlIG9uIG91dHB1dAorICovCitzdGF0aWMgc2l6ZV90IGlhY19zYWZlX3dyaXRlKGludCBmZCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCit7CisJY29uc3QgY2hhciAqSUFDcHRyOworCXNpemVfdCB3ciwgcmMsIHRvdGFsOworCisJdG90YWwgPSAwOworCXdoaWxlICgxKSB7CisJCWlmIChjb3VudCA9PSAwKQorCQkJcmV0dXJuIHRvdGFsOworCQlpZiAoKmJ1ZiA9PSAoY2hhcilJQUMpIHsKKwkJCXN0YXRpYyBjb25zdCBjaGFyIElBQ0lBQ1tdIEFMSUdOMSA9IHsgSUFDLCBJQUMgfTsKKwkJCXJjID0gc2FmZV93cml0ZShmZCwgSUFDSUFDLCAyKTsKKwkJCWlmIChyYyAhPSAyKQorCQkJCWJyZWFrOworCQkJYnVmKys7CisJCQl0b3RhbCsrOworCQkJY291bnQtLTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIGNvdW50ICE9IDAsICpidWYgIT0gSUFDICovCisJCUlBQ3B0ciA9IG1lbWNocihidWYsIElBQywgY291bnQpOworCQl3ciA9IGNvdW50OworCQlpZiAoSUFDcHRyKQorCQkJd3IgPSBJQUNwdHIgLSBidWY7CisJCXJjID0gc2FmZV93cml0ZShmZCwgYnVmLCB3cik7CisJCWlmIChyYyAhPSB3cikKKwkJCWJyZWFrOworCQlidWYgKz0gcmM7CisJCXRvdGFsICs9IHJjOworCQljb3VudCAtPSByYzsKKwl9CisJLyogaGVyZTogcmMgLSByZXN1bHQgb2YgbGFzdCBzaG9ydCB3cml0ZSAqLworCWlmICgoc3NpemVfdClyYyA8IDApIHsgLyogZXJyb3I/ICovCisJCWlmICh0b3RhbCA9PSAwKQorCQkJcmV0dXJuIHJjOworCQlyYyA9IDA7CisJfQorCXJldHVybiB0b3RhbCArIHJjOworfQorCisvKiBNdXN0IG1hdGNoIGdldG9wdDMyIHN0cmluZyAqLworZW51bSB7CisJT1BUX1dBVENIQ0hJTEQgPSAoMSA8PCAyKSwgLyogLUsgKi8KKwlPUFRfSU5FVEQgICAgICA9ICgxIDw8IDMpICogRU5BQkxFX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FLCAvKiAtaSAqLworCU9QVF9QT1JUICAgICAgID0gKDEgPDwgNCkgKiBFTkFCTEVfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUsIC8qIC1wIFBPUlQgKi8KKwlPUFRfRk9SRUdST1VORCA9ICgxIDw8IDYpICogRU5BQkxFX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FLCAvKiAtRiAqLworCU9QVF9TWVNMT0cgICAgID0gKDEgPDwgNykgKiBFTkFCTEVfRkVBVFVSRV9URUxORVREX0lORVREX1dBSVQsIC8qIC1TICovCisJT1BUX1dBSVQgICAgICAgPSAoMSA8PCA4KSAqIEVOQUJMRV9GRUFUVVJFX1RFTE5FVERfSU5FVERfV0FJVCwgLyogLXcgU0VDICovCit9OworCitzdGF0aWMgc3RydWN0IHRzZXNzaW9uICoKK21ha2VfbmV3X3Nlc3Npb24oCisJCUlGX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FKGludCBzb2NrKQorCQlJRl9OT1RfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUodm9pZCkKKykgeworI2lmICFFTkFCTEVfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUKKwllbnVtIHsgc29jayA9IDAgfTsKKyNlbmRpZgorCWNvbnN0IGNoYXIgKmxvZ2luX2FyZ3ZbMl07CisJc3RydWN0IHRlcm1pb3MgdGVybWJ1ZjsKKwlpbnQgZmQsIHBpZDsKKwljaGFyIHR0eV9uYW1lW0dFVFBUWV9CVUZTSVpFXTsKKwlzdHJ1Y3QgdHNlc3Npb24gKnRzID0geHphbGxvYyhzaXplb2Yoc3RydWN0IHRzZXNzaW9uKSArIEJVRlNJWkUgKiAyKTsKKworCS8qdHMtPmJ1ZjEgPSAoY2hhciAqKSh0cyArIDEpOyovCisJLyp0cy0+YnVmMiA9IHRzLT5idWYxICsgQlVGU0laRTsqLworCisJLyogR290IGEgbmV3IGNvbm5lY3Rpb24sIHNldCB1cCBhIHR0eSAqLworCWZkID0geGdldHB0eSh0dHlfbmFtZSk7CisJaWYgKGZkID4gRy5tYXhmZCkKKwkJRy5tYXhmZCA9IGZkOworCXRzLT5wdHlmZCA9IGZkOworCW5kZWxheV9vbihmZCk7CisJY2xvc2Vfb25fZXhlY19vbihmZCk7CisKKwkvKiBTT19LRUVQQUxJVkUgYnkgcG9wdWxhciBkZW1hbmQgKi8KKwlzZXRzb2Nrb3B0X2tlZXBhbGl2ZShzb2NrKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUKKwl0cy0+c29ja2ZkX3JlYWQgPSBzb2NrOworCW5kZWxheV9vbihzb2NrKTsKKwlpZiAoc29jayA9PSAwKSB7IC8qIFdlIGFyZSBjYWxsZWQgd2l0aCBmZCAwIC0gd2UgYXJlIGluIGluZXRkIG1vZGUgKi8KKwkJc29jaysrOyAvKiBzbyB1c2UgZmQgMSBmb3Igb3V0cHV0ICovCisJCW5kZWxheV9vbihzb2NrKTsKKwl9CisJdHMtPnNvY2tmZF93cml0ZSA9IHNvY2s7CisJaWYgKHNvY2sgPiBHLm1heGZkKQorCQlHLm1heGZkID0gc29jazsKKyNlbHNlCisJLyogdHMtPnNvY2tmZF9yZWFkID0gMDsgLSBkb25lIGJ5IHh6YWxsb2MgKi8KKwl0cy0+c29ja2ZkX3dyaXRlID0gMTsKKwluZGVsYXlfb24oMCk7CisJbmRlbGF5X29uKDEpOworI2VuZGlmCisKKwkvKiBNYWtlIHRoZSB0ZWxuZXQgY2xpZW50IHVuZGVyc3RhbmQgd2Ugd2lsbCBlY2hvIGNoYXJhY3RlcnMgc28gaXQKKwkgKiBzaG91bGQgbm90IGRvIGl0IGxvY2FsbHkuIFdlIGRvbid0IHRlbGwgdGhlIGNsaWVudCB0byBydW4gbGluZW1vZGUsCisJICogYmVjYXVzZSB3ZSB3YW50IHRvIGhhbmRsZSBsaW5lIGVkaXRpbmcgYW5kIHRhYiBjb21wbGV0aW9uIGFuZCBvdGhlcgorCSAqIHN0dWZmIHRoYXQgcmVxdWlyZXMgY2hhci1ieS1jaGFyIHN1cHBvcnQuICovCisJeworCQlzdGF0aWMgY29uc3QgY2hhciBpYWNzX3RvX3NlbmRbXSBBTElHTjEgPSB7CisJCQlJQUMsIERPLCBURUxPUFRfRUNITywKKwkJCUlBQywgRE8sIFRFTE9QVF9OQVdTLAorCQkJLyogVGhpcyByZXF1aXJlcyB0ZWxuZXRkLmN0cmxTUS5wYXRjaCAoaW5jb21wbGV0ZSkgKi8KKwkJCS8qSUFDLCBETywgVEVMT1BUX0xGTE9XLCovCisJCQlJQUMsIFdJTEwsIFRFTE9QVF9FQ0hPLAorCQkJSUFDLCBXSUxMLCBURUxPUFRfU0dBCisJCX07CisJCS8qIFRoaXMgY29uZnVzZXMgaWFjX3NhZmVfd3JpdGUoKSwgaXQgd2lsbCB0cnkgdG8gZHVwbGljYXRlCisJCSAqIGVhY2ggSUFDLi4uICovCisJCS8vbWVtY3B5KFRTX0JVRjIodHMpLCBpYWNzX3RvX3NlbmQsIHNpemVvZihpYWNzX3RvX3NlbmQpKTsKKwkJLy90cy0+cmRpZHgyID0gc2l6ZW9mKGlhY3NfdG9fc2VuZCk7CisJCS8vdHMtPnNpemUyID0gc2l6ZW9mKGlhY3NfdG9fc2VuZCk7CisJCS8qIFNvIGp1c3Qgc3R1ZmYgaXQgaW50byBUQ1Agc3RyZWFtISAobm8gZXJyb3IgY2hlY2suLi4pICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FCisJCXNhZmVfd3JpdGUoc29jaywgaWFjc190b19zZW5kLCBzaXplb2YoaWFjc190b19zZW5kKSk7CisjZWxzZQorCQlzYWZlX3dyaXRlKDEsIGlhY3NfdG9fc2VuZCwgc2l6ZW9mKGlhY3NfdG9fc2VuZCkpOworI2VuZGlmCisJCS8qdHMtPnJkaWR4MiA9IDA7IC0geHphbGxvYyBkaWQgaXQgKi8KKwkJLyp0cy0+c2l6ZTIgPSAwOyovCisJfQorCisJZmZsdXNoX2FsbCgpOworCXBpZCA9IHZmb3JrKCk7IC8qIE5PTU1VLWZyaWVuZGx5ICovCisJaWYgKHBpZCA8IDApIHsKKwkJZnJlZSh0cyk7CisJCWNsb3NlKGZkKTsKKwkJLyogc29jayB3aWxsIGJlIGNsb3NlZCBieSBjYWxsZXIgKi8KKwkJYmJfcGVycm9yX21zZygidmZvcmsiKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWlmIChwaWQgPiAwKSB7CisJCS8qIFBhcmVudCAqLworCQl0cy0+c2hlbGxfcGlkID0gcGlkOworCQlyZXR1cm4gdHM7CisJfQorCisJLyogQ2hpbGQgKi8KKwkvKiBDYXJlZnVsIC0gd2UgYXJlIGFmdGVyIHZmb3JrISAqLworCisJLyogUmVzdG9yZSBkZWZhdWx0IHNpZ25hbCBoYW5kbGluZyBBU0FQICovCisJYmJfc2lnbmFscygoMSA8PCBTSUdDSExEKSArICgxIDw8IFNJR1BJUEUpLCBTSUdfREZMKTsKKworCXBpZCA9IGdldHBpZCgpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX1VUTVApIHsKKwkJbGVuX2FuZF9zb2NrYWRkciAqbHNhID0gZ2V0X3BlZXJfbHNhKHNvY2spOworCQljaGFyICpob3N0bmFtZSA9IE5VTEw7CisJCWlmIChsc2EpIHsKKwkJCWhvc3RuYW1lID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWQoJmxzYS0+dS5zYSk7CisJCQlmcmVlKGxzYSk7CisJCX0KKwkJd3JpdGVfbmV3X3V0bXAocGlkLCBMT0dJTl9QUk9DRVNTLCB0dHlfbmFtZSwgLyp1c2VybmFtZToqLyAiTE9HSU4iLCBob3N0bmFtZSk7CisJCWZyZWUoaG9zdG5hbWUpOworCX0KKworCS8qIE1ha2UgbmV3IHNlc3Npb24gYW5kIHByb2Nlc3MgZ3JvdXAgKi8KKwlzZXRzaWQoKTsKKworCS8qIE9wZW4gdGhlIGNoaWxkJ3Mgc2lkZSBvZiB0aGUgdHR5ICovCisJLyogTkI6IHNldHNpZCgpIGRpc2Nvbm5lY3RzIGZyb20gYW55IHByZXZpb3VzIGN0dHkncy4gVGhlcmVmb3JlCisJICogd2UgbXVzdCBvcGVuIGNoaWxkJ3Mgc2lkZSBvZiB0aGUgdHR5IEFGVEVSIHNldHNpZCEgKi8KKwljbG9zZSgwKTsKKwl4b3Blbih0dHlfbmFtZSwgT19SRFdSKTsgLyogYmVjb21lcyBvdXIgY3R0eSAqLworCXhkdXAyKDAsIDEpOworCXhkdXAyKDAsIDIpOworCXRjc2V0cGdycCgwLCBwaWQpOyAvKiBzd2l0Y2ggdGhpcyB0dHkncyBwcm9jZXNzIGdyb3VwIHRvIHVzICovCisKKwkvKiBUaGUgcHNldWRvLXRlcm1pbmFsIGFsbG9jYXRlZCB0byB0aGUgY2xpZW50IGlzIGNvbmZpZ3VyZWQgdG8gb3BlcmF0ZQorCSAqIGluIGNvb2tlZCBtb2RlLCBhbmQgd2l0aCBYVEFCUyBDUk1PRCBlbmFibGVkIChzZWUgdHR5KDQpKSAqLworCXRjZ2V0YXR0cigwLCAmdGVybWJ1Zik7CisJdGVybWJ1Zi5jX2xmbGFnIHw9IEVDSE87IC8qIGlmIHdlIHVzZSByZWFkbGluZSB3ZSBkb250IHdhbnQgdGhpcyAqLworCXRlcm1idWYuY19vZmxhZyB8PSBPTkxDUiB8IFhUQUJTOworCXRlcm1idWYuY19pZmxhZyB8PSBJQ1JOTDsKKwl0ZXJtYnVmLmNfaWZsYWcgJj0gfklYT0ZGOworCS8qdGVybWJ1Zi5jX2xmbGFnICY9IH5JQ0FOT047Ki8KKwl0Y3NldGF0dHJfc3RkaW5fVENTQU5PVygmdGVybWJ1Zik7CisKKwkvKiBVc2VzIEZJTEUtYmFzZWQgSS9PIHRvIHN0ZG91dCwgYnV0IGRvZXMgZmZsdXNoX2FsbCgpLAorCSAqIHNvIHNob3VsZCBiZSBzYWZlIHdpdGggdmZvcmsuCisJICogSSBmZWFyLCB0aG91Z2gsIHRoYXQgc29tZSB1c2VycyB3aWxsIGhhdmUgcmlkaWN1bG91c2x5IGJpZworCSAqIGlzc3VlIGZpbGVzLCBhbmQgdGhleSBtYXkgYmxvY2sgd3JpdGluZyB0byBmZCAxLAorCSAqIChwYXJlbnQgaXMgc3VwcG9zZWQgdG8gcmVhZCBpdCwgYnV0IHBhcmVudCB3YWl0cworCSAqIGZvciB2Zm9ya2VkIGNoaWxkIHRvIGV4ZWMhKSAqLworCXByaW50X2xvZ2luX2lzc3VlKEcuaXNzdWVmaWxlLCB0dHlfbmFtZSk7CisKKwkvKiBFeGVjIHNoZWxsIC8gbG9naW4gLyB3aGF0ZXZlciAqLworCWxvZ2luX2FyZ3ZbMF0gPSBHLmxvZ2lucGF0aDsKKwlsb2dpbl9hcmd2WzFdID0gTlVMTDsKKwkvKiBleGVjIGJ1c3lib3ggYXBwbGV0IChpZiBQUkVGRVJfQVBQTEVUUz15KSwgaWYgdGhhdCBmYWlscywKKwkgKiBleGVjIGV4dGVybmFsIHByb2dyYW0uCisJICogTkI6IHNvY2sgaXMgZWl0aGVyIDAgb3IgaGFzIENMT0VYRUMgc2V0IG9uIGl0LgorCSAqIGZkIGhhcyBDTE9FWEVDIHNldCBvbiBpdCB0b28uIFRoZXNlIHR3byBmZHMgd2lsbCBiZSBjbG9zZWQgaGVyZS4KKwkgKi8KKwlCQl9FWEVDVlAoRy5sb2dpbnBhdGgsIChjaGFyICoqKWxvZ2luX2FyZ3YpOworCS8qIF9leGl0IGlzIHNhZmVyIHdpdGggdmZvcmssIGFuZCB3ZSBzaG91bGRuJ3Qgc2VuZCBtZXNzYWdlCisJICogdG8gcmVtb3RlIGNsaWVudHMgYW55d2F5ICovCisJX2V4aXQoRVhJVF9GQUlMVVJFKTsgLypiYl9wZXJyb3JfbXNnX2FuZF9kaWUoImV4ZWN2ICVzIiwgRy5sb2dpbnBhdGgpOyovCit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUKKworc3RhdGljIHZvaWQKK2ZyZWVfc2Vzc2lvbihzdHJ1Y3QgdHNlc3Npb24gKnRzKQoreworCXN0cnVjdCB0c2Vzc2lvbiAqdDsKKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX0lORVREKQorCQlleGl0KEVYSVRfU1VDQ0VTUyk7CisKKwkvKiBVbmxpbmsgdGhpcyB0ZWxuZXQgc2Vzc2lvbiBmcm9tIHRoZSBzZXNzaW9uIGxpc3QgKi8KKwl0ID0gRy5zZXNzaW9uczsKKwlpZiAodCA9PSB0cykKKwkJRy5zZXNzaW9ucyA9IHRzLT5uZXh0OworCWVsc2UgeworCQl3aGlsZSAodC0+bmV4dCAhPSB0cykKKwkJCXQgPSB0LT5uZXh0OworCQl0LT5uZXh0ID0gdHMtPm5leHQ7CisJfQorCisjaWYgMAorCS8qIEl0IHdhcyBzYWlkIHRoYXQgIm5vcm1hbCIgdGVsbmV0ZCBqdXN0IGNsb3NlcyBwdHlmZCwKKwkgKiBkb2Vzbid0IHNlbmQgU0lHS0lMTC4gV2hlbiB3ZSBjbG9zZSBwdHlmZCwKKwkgKiBrZXJuZWwgc2VuZHMgU0lHSFVQIHRvIHByb2Nlc3NlcyBoYXZpbmcgc2xhdmUgc2lkZSBvcGVuZWQuICovCisJa2lsbCh0cy0+c2hlbGxfcGlkLCBTSUdLSUxMKTsKKwl3YWl0cGlkKHRzLT5zaGVsbF9waWQsIE5VTEwsIDApOworI2VuZGlmCisJY2xvc2UodHMtPnB0eWZkKTsKKwljbG9zZSh0cy0+c29ja2ZkX3JlYWQpOworCS8qIFdlIGRvIG5vdCBuZWVkIHRvIGNsb3NlKHRzLT5zb2NrZmRfd3JpdGUpLCBpdCdzIHRoZSBzYW1lCisJICogYXMgc29ja2ZkX3JlYWQgdW5sZXNzIHdlIGFyZSBpbiBpbmV0ZCBtb2RlLiBCdXQgaW4gaW5ldGQgbW9kZQorCSAqIHdlIGRvIG5vdCByZWFjaCB0aGlzICovCisJZnJlZSh0cyk7CisKKwkvKiBTY2FuIGFsbCBzZXNzaW9ucyBhbmQgZmluZCBuZXcgbWF4ZmQgKi8KKwlHLm1heGZkID0gMDsKKwl0cyA9IEcuc2Vzc2lvbnM7CisJd2hpbGUgKHRzKSB7CisJCWlmIChHLm1heGZkIDwgdHMtPnB0eWZkKQorCQkJRy5tYXhmZCA9IHRzLT5wdHlmZDsKKwkJaWYgKEcubWF4ZmQgPCB0cy0+c29ja2ZkX3JlYWQpCisJCQlHLm1heGZkID0gdHMtPnNvY2tmZF9yZWFkOworI2lmIDAKKwkJLyogQWdhaW4sIHNvY2tmZF93cml0ZSA9PSBzb2NrZmRfcmVhZCBoZXJlICovCisJCWlmIChHLm1heGZkIDwgdHMtPnNvY2tmZF93cml0ZSkKKwkJCUcubWF4ZmQgPSB0cy0+c29ja2ZkX3dyaXRlOworI2VuZGlmCisJCXRzID0gdHMtPm5leHQ7CisJfQorfQorCisjZWxzZSAvKiAhRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUgKi8KKworLyogVXNlZCBpbiBtYWluKCkgb25seSwgdGh1cyAicmV0dXJuIDAiIGFjdHVhbGx5IGlzIGV4aXQoRVhJVF9TVUNDRVNTKS4gKi8KKyNkZWZpbmUgZnJlZV9zZXNzaW9uKHRzKSByZXR1cm4gMAorCisjZW5kaWYKKworc3RhdGljIHZvaWQgaGFuZGxlX3NpZ2NobGQoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJcGlkX3QgcGlkOworCXN0cnVjdCB0c2Vzc2lvbiAqdHM7CisJaW50IHNhdmVfZXJybm8gPSBlcnJubzsKKworCS8qIExvb3Bpbmc6IG1vcmUgdGhhbiBvbmUgY2hpbGQgbWF5IGhhdmUgZXhpdGVkICovCisJd2hpbGUgKDEpIHsKKwkJcGlkID0gd2FpdF9hbnlfbm9oYW5nKE5VTEwpOworCQlpZiAocGlkIDw9IDApCisJCQlicmVhazsKKwkJdHMgPSBHLnNlc3Npb25zOworCQl3aGlsZSAodHMpIHsKKwkJCWlmICh0cy0+c2hlbGxfcGlkID09IHBpZCkgeworCQkJCXRzLT5zaGVsbF9waWQgPSAtMTsKKwkJCQl1cGRhdGVfdXRtcF9ERUFEX1BST0NFU1MocGlkKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXRzID0gdHMtPm5leHQ7CisJCX0KKwl9CisKKwllcnJubyA9IHNhdmVfZXJybm87Cit9CisKK2ludCB0ZWxuZXRkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0ZWxuZXRkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlmZF9zZXQgcmRmZHNldCwgd3JmZHNldDsKKwl1bnNpZ25lZCBvcHQ7CisJaW50IGNvdW50OworCXN0cnVjdCB0c2Vzc2lvbiAqdHM7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FCisjZGVmaW5lIElTX0lORVREIChvcHQgJiBPUFRfSU5FVEQpCisJaW50IG1hc3Rlcl9mZCA9IG1hc3Rlcl9mZDsgLyogZm9yIGNvbXBpbGVyICovCisJaW50IHNlY19saW5nZXIgPSBzZWNfbGluZ2VyOworCWNoYXIgKm9wdF9iaW5kYWRkciA9IE5VTEw7CisJY2hhciAqb3B0X3BvcnRuYnI7CisjZWxzZQorCWVudW0geworCQlJU19JTkVURCA9IDEsCisJCW1hc3Rlcl9mZCA9IC0xLAorCX07CisjZW5kaWYKKwlJTklUX0coKTsKKworCS8qIC13IE5VTSwgYW5kIGltcGxpZXMgLUYuIC13IGFuZCAtaSBkb24ndCBtaXggKi8KKwlJRl9GRUFUVVJFX1RFTE5FVERfSU5FVERfV0FJVChvcHRfY29tcGxlbWVudGFyeSA9ICJ3Rjp3KzppLS13OnctLWkiOykKKwkvKiBFdmVuIGlmICFTVEFOREFMT05FLCB3ZSBhY2NlcHQgKGFuZCBpZ25vcmUpIC1pLCB0aHVzIHBlb3BsZQorCSAqIGRvbid0IG5lZWQgdG8gZ3Vlc3Mgd2hldGhlciBpdCdzIG9rIHRvIHBhc3MgLWkgdG8gdXMgKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiZjpsOktpIgorCQkJSUZfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUoInA6YjpGIikKKwkJCUlGX0ZFQVRVUkVfVEVMTkVURF9JTkVURF9XQUlUKCJTdzoiKSwKKwkJCSZHLmlzc3VlZmlsZSwgJkcubG9naW5wYXRoCisJCQlJRl9GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORSgsICZvcHRfcG9ydG5iciwgJm9wdF9iaW5kYWRkcikKKwkJCUlGX0ZFQVRVUkVfVEVMTkVURF9JTkVURF9XQUlUKCwgJnNlY19saW5nZXIpCisJKTsKKwlpZiAoIUlTX0lORVREIC8qJiYgIXJlX2V4ZWNlZCovKSB7CisJCS8qIGluZm9ybSB0aGF0IHdlIHN0YXJ0IGluIHN0YW5kYWxvbmUgbW9kZT8KKwkJICogTWF5IGJlIHVzZWZ1bCB3aGVuIHBlb3BsZSBmb3JnZXQgdG8gZ2l2ZSAtaSAqLworCQkvKmJiX2Vycm9yX21zZygibGlzdGVuaW5nIGZvciBjb25uZWN0aW9ucyIpOyovCisJCWlmICghKG9wdCAmIE9QVF9GT1JFR1JPVU5EKSkgeworCQkJLyogREFFTU9OX0NIRElSX1JPT1Qgd2FzIGdpdmluZyBpbmNvbnNpc3RlbnQKKwkJCSAqIGJlaGF2aW9yIHdpdGgvd2l0aG91dCAtRiwgLWkgKi8KKwkJCWJiX2RhZW1vbml6ZV9vcl9yZXhlYygwIC8qd2FzIERBRU1PTl9DSERJUl9ST09UKi8sIGFyZ3YpOworCQl9CisJfQorCS8qIFJlZGlyZWN0IGxvZyB0byBzeXNsb2cgZWFybHksIGlmIG5lZWRlZCAqLworCWlmIChJU19JTkVURCB8fCAob3B0ICYgT1BUX1NZU0xPRykgfHwgIShvcHQgJiBPUFRfRk9SRUdST1VORCkpIHsKKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgTE9HX1BJRCwgTE9HX0RBRU1PTik7CisJCWxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsKKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEVMTkVURF9TVEFOREFMT05FCisJaWYgKElTX0lORVREKSB7CisJCUcuc2Vzc2lvbnMgPSBtYWtlX25ld19zZXNzaW9uKDApOworCQlpZiAoIUcuc2Vzc2lvbnMpIC8qIHB0eSBvcGVuaW5nIG9yIHZmb3JrIHByb2JsZW0sIGV4aXQgKi8KKwkJCXJldHVybiAxOyAvKiBtYWtlX25ld19zZXNzaW9uIHByaW50ZWQgZXJyb3IgbWVzc2FnZSAqLworCX0gZWxzZSB7CisJCW1hc3Rlcl9mZCA9IDA7CisJCWlmICghKG9wdCAmIE9QVF9XQUlUKSkgeworCQkJdW5zaWduZWQgcG9ydG5iciA9IDIzOworCQkJaWYgKG9wdCAmIE9QVF9QT1JUKQorCQkJCXBvcnRuYnIgPSB4YXRvdTE2KG9wdF9wb3J0bmJyKTsKKwkJCW1hc3Rlcl9mZCA9IGNyZWF0ZV9hbmRfYmluZF9zdHJlYW1fb3JfZGllKG9wdF9iaW5kYWRkciwgcG9ydG5icik7CisJCQl4bGlzdGVuKG1hc3Rlcl9mZCwgMSk7CisJCX0KKwkJY2xvc2Vfb25fZXhlY19vbihtYXN0ZXJfZmQpOworCX0KKyNlbHNlCisJRy5zZXNzaW9ucyA9IG1ha2VfbmV3X3Nlc3Npb24oKTsKKwlpZiAoIUcuc2Vzc2lvbnMpIC8qIHB0eSBvcGVuaW5nIG9yIHZmb3JrIHByb2JsZW0sIGV4aXQgKi8KKwkJcmV0dXJuIDE7IC8qIG1ha2VfbmV3X3Nlc3Npb24gcHJpbnRlZCBlcnJvciBtZXNzYWdlICovCisjZW5kaWYKKworCS8qIFdlIGRvbid0IHdhbnQgdG8gZGllIGlmIGp1c3Qgb25lIHNlc3Npb24gaXMgYnJva2VuICovCisJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisJaWYgKG9wdCAmIE9QVF9XQVRDSENISUxEKQorCQlzaWduYWwoU0lHQ0hMRCwgaGFuZGxlX3NpZ2NobGQpOworCWVsc2UgLyogcHJldmVudCBkZWFkIGNoaWxkcmVuIGZyb20gYmVjb21pbmcgem9tYmllcyAqLworCQlzaWduYWwoU0lHQ0hMRCwgU0lHX0lHTik7CisKKy8qCisgICBUaGlzIGlzIGhvdyB0aGUgYnVmZmVycyBhcmUgdXNlZC4gVGhlIGFycm93cyBpbmRpY2F0ZSBkYXRhIGZsb3cuCisKKyAgICstLS0tLS0tKyAgICAgd3JpZHgxKysgICAgICstLS0tLS0rICAgICByZGlkeDErKyAgICAgKy0tLS0tLS0tLS0rCisgICB8ICAgICAgIHwgPC0tLS0tLS0tLS0tLS0tICB8IGJ1ZjEgfCA8LS0tLS0tLS0tLS0tLS0gIHwgICAgICAgICAgfAorICAgfCAgICAgICB8ICAgICBzaXplMS0tICAgICAgKy0tLS0tLSsgICAgIHNpemUxKysgICAgICB8ICAgICAgICAgIHwKKyAgIHwgIHB0eSAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgc29ja2V0ICB8CisgICB8ICAgICAgIHwgICAgIHJkaWR4MisrICAgICArLS0tLS0tKyAgICAgd3JpZHgyKysgICAgIHwgICAgICAgICAgfAorICAgfCAgICAgICB8ICAtLS0tLS0tLS0tLS0tLT4gfCBidWYyIHwgIC0tLS0tLS0tLS0tLS0tPiB8ICAgICAgICAgIHwKKyAgICstLS0tLS0tKyAgICAgc2l6ZTIrKyAgICAgICstLS0tLS0rICAgICBzaXplMi0tICAgICAgKy0tLS0tLS0tLS0rCisKKyAgIHNpemUxOiAiaG93IG1hbnkgYnl0ZXMgYXJlIGJ1ZmZlcmVkIGZvciBwdHkgYmV0d2VlbiByZGlkeDEgYW5kIHdyaWR4MT8iCisgICBzaXplMjogImhvdyBtYW55IGJ5dGVzIGFyZSBidWZmZXJlZCBmb3Igc29ja2V0IGJldHdlZW4gcmRpZHgyIGFuZCB3cmlkeDI/IgorCisgICBFYWNoIHNlc3Npb24gaGFzIGdvdCB0d28gYnVmZmVycy4gQnVmZmVycyBhcmUgY2lyY3VsYXIuIElmIHNpemVOID09IDAsCisgICBidWZmZXIgaXMgZW1wdHkuIElmIHNpemVOID09IEJVRlNJWkUsIGJ1ZmZlciBpcyBmdWxsLiBJbiBib3RoIHRoZXNlIGNhc2VzCisgICByZGlkeE4gPT0gd3JpZHhOLgorKi8KKyBhZ2FpbjoKKwlGRF9aRVJPKCZyZGZkc2V0KTsKKwlGRF9aRVJPKCZ3cmZkc2V0KTsKKworCS8qIFNlbGVjdCBvbiB0aGUgbWFzdGVyIHNvY2tldCwgYWxsIHRlbG5ldCBzb2NrZXRzIGFuZCB0aGVpcgorCSAqIHB0eXMgaWYgdGhlcmUgaXMgcm9vbSBpbiB0aGVpciBzZXNzaW9uIGJ1ZmZlcnMuCisJICogTkI6IHNjYWxhYmlsaXR5IHByb2JsZW06IHdlIHJlY2FsY3VsYXRlIGVudGlyZSBiaXRtYXAKKwkgKiBiZWZvcmUgZWFjaCBzZWxlY3QuIENhbiBiZSBhIHByb2JsZW0gd2l0aCA1MDArIGNvbm5lY3Rpb25zLiAqLworCXRzID0gRy5zZXNzaW9uczsKKwl3aGlsZSAodHMpIHsKKwkJc3RydWN0IHRzZXNzaW9uICpuZXh0ID0gdHMtPm5leHQ7IC8qIGluIGNhc2Ugd2UgZnJlZSB0cyAqLworCQlpZiAodHMtPnNoZWxsX3BpZCA9PSAtMSkgeworCQkJLyogQ2hpbGQgZGllZCBhbmQgd2UgZGV0ZWN0ZWQgdGhhdCAqLworCQkJZnJlZV9zZXNzaW9uKHRzKTsKKwkJfSBlbHNlIHsKKwkJCWlmICh0cy0+c2l6ZTEgPiAwKSAgICAgICAvKiBjYW4gd3JpdGUgdG8gcHR5ICovCisJCQkJRkRfU0VUKHRzLT5wdHlmZCwgJndyZmRzZXQpOworCQkJaWYgKHRzLT5zaXplMSA8IEJVRlNJWkUpIC8qIGNhbiByZWFkIGZyb20gc29ja2V0ICovCisJCQkJRkRfU0VUKHRzLT5zb2NrZmRfcmVhZCwgJnJkZmRzZXQpOworCQkJaWYgKHRzLT5zaXplMiA+IDApICAgICAgIC8qIGNhbiB3cml0ZSB0byBzb2NrZXQgKi8KKwkJCQlGRF9TRVQodHMtPnNvY2tmZF93cml0ZSwgJndyZmRzZXQpOworCQkJaWYgKHRzLT5zaXplMiA8IEJVRlNJWkUpIC8qIGNhbiByZWFkIGZyb20gcHR5ICovCisJCQkJRkRfU0VUKHRzLT5wdHlmZCwgJnJkZmRzZXQpOworCQl9CisJCXRzID0gbmV4dDsKKwl9CisJaWYgKCFJU19JTkVURCkgeworCQlGRF9TRVQobWFzdGVyX2ZkLCAmcmRmZHNldCk7CisJCS8qIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgZnJlZV9zZXNzaW9uKCkgZG9lcyBub3QKKwkJICogdGFrZSBtYXN0ZXJfZmQgaW50byBhY2NvdW50IHdoZW4gaXQgZmluZHMgbmV3CisJCSAqIG1heGZkIGFtb25nIHJlbWFpbmluZyBmZCdzICovCisJCWlmIChtYXN0ZXJfZmQgPiBHLm1heGZkKQorCQkJRy5tYXhmZCA9IG1hc3Rlcl9mZDsKKwl9CisKKwl7CisJCXN0cnVjdCB0aW1ldmFsICp0dl9wdHIgPSBOVUxMOworI2lmIEVOQUJMRV9GRUFUVVJFX1RFTE5FVERfSU5FVERfV0FJVAorCQlzdHJ1Y3QgdGltZXZhbCB0djsKKwkJaWYgKChvcHQgJiBPUFRfV0FJVCkgJiYgIUcuc2Vzc2lvbnMpIHsKKwkJCXR2LnR2X3NlYyA9IHNlY19saW5nZXI7CisJCQl0di50dl91c2VjID0gMDsKKwkJCXR2X3B0ciA9ICZ0djsKKwkJfQorI2VuZGlmCisJCWNvdW50ID0gc2VsZWN0KEcubWF4ZmQgKyAxLCAmcmRmZHNldCwgJndyZmRzZXQsIE5VTEwsIHR2X3B0cik7CisJfQorCWlmIChjb3VudCA9PSAwKSAvKiAidGVsbmV0ZCAtdyBTRUMiIHRpbWVkIG91dCAqLworCQlyZXR1cm4gMDsKKwlpZiAoY291bnQgPCAwKQorCQlnb3RvIGFnYWluOyAvKiBFSU5UUiBvciBFTk9NRU0gKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX1RFTE5FVERfU1RBTkRBTE9ORQorCS8qIENoZWNrIGZvciBhbmQgYWNjZXB0IG5ldyBzZXNzaW9ucyAqLworCWlmICghSVNfSU5FVEQgJiYgRkRfSVNTRVQobWFzdGVyX2ZkLCAmcmRmZHNldCkpIHsKKwkJaW50IGZkOworCQlzdHJ1Y3QgdHNlc3Npb24gKm5ld190czsKKworCQlmZCA9IGFjY2VwdChtYXN0ZXJfZmQsIE5VTEwsIE5VTEwpOworCQlpZiAoZmQgPCAwKQorCQkJZ290byBhZ2FpbjsKKwkJY2xvc2Vfb25fZXhlY19vbihmZCk7CisKKwkJLyogQ3JlYXRlIGEgbmV3IHNlc3Npb24gYW5kIGxpbmsgaXQgaW50byBhY3RpdmUgbGlzdCAqLworCQluZXdfdHMgPSBtYWtlX25ld19zZXNzaW9uKGZkKTsKKwkJaWYgKG5ld190cykgeworCQkJbmV3X3RzLT5uZXh0ID0gRy5zZXNzaW9uczsKKwkJCUcuc2Vzc2lvbnMgPSBuZXdfdHM7CisJCX0gZWxzZSB7CisJCQljbG9zZShmZCk7CisJCX0KKwl9CisjZW5kaWYKKworCS8qIFRoZW4gY2hlY2sgZm9yIGRhdGEgdHVubmVsaW5nICovCisJdHMgPSBHLnNlc3Npb25zOworCXdoaWxlICh0cykgeyAvKiBGb3IgYWxsIHNlc3Npb25zLi4uICovCisJCXN0cnVjdCB0c2Vzc2lvbiAqbmV4dCA9IHRzLT5uZXh0OyAvKiBpbiBjYXNlIHdlIGZyZWUgdHMgKi8KKworCQlpZiAoLyp0cy0+c2l6ZTEgJiYqLyBGRF9JU1NFVCh0cy0+cHR5ZmQsICZ3cmZkc2V0KSkgeworCQkJaW50IG51bV90b3R0eTsKKwkJCXVuc2lnbmVkIGNoYXIgKnB0cjsKKwkJCS8qIFdyaXRlIHRvIHB0eSBmcm9tIGJ1ZmZlciAxICovCisJCQlwdHIgPSByZW1vdmVfaWFjcyh0cywgJm51bV90b3R0eSk7CisJCQljb3VudCA9IHNhZmVfd3JpdGUodHMtPnB0eWZkLCBwdHIsIG51bV90b3R0eSk7CisJCQlpZiAoY291bnQgPCAwKSB7CisJCQkJaWYgKGVycm5vID09IEVBR0FJTikKKwkJCQkJZ290byBza2lwMTsKKwkJCQlnb3RvIGtpbGxfc2Vzc2lvbjsKKwkJCX0KKwkJCXRzLT5zaXplMSAtPSBjb3VudDsKKwkJCXRzLT53cmlkeDEgKz0gY291bnQ7CisJCQlpZiAodHMtPndyaWR4MSA+PSBCVUZTSVpFKSAvKiBhY3R1YWxseSA9PSBCVUZTSVpFICovCisJCQkJdHMtPndyaWR4MSA9IDA7CisJCX0KKyBza2lwMToKKwkJaWYgKC8qdHMtPnNpemUyICYmKi8gRkRfSVNTRVQodHMtPnNvY2tmZF93cml0ZSwgJndyZmRzZXQpKSB7CisJCQkvKiBXcml0ZSB0byBzb2NrZXQgZnJvbSBidWZmZXIgMiAqLworCQkJY291bnQgPSBNSU4oQlVGU0laRSAtIHRzLT53cmlkeDIsIHRzLT5zaXplMik7CisJCQljb3VudCA9IGlhY19zYWZlX3dyaXRlKHRzLT5zb2NrZmRfd3JpdGUsICh2b2lkKikoVFNfQlVGMih0cykgKyB0cy0+d3JpZHgyKSwgY291bnQpOworCQkJaWYgKGNvdW50IDwgMCkgeworCQkJCWlmIChlcnJubyA9PSBFQUdBSU4pCisJCQkJCWdvdG8gc2tpcDI7CisJCQkJZ290byBraWxsX3Nlc3Npb247CisJCQl9CisJCQl0cy0+c2l6ZTIgLT0gY291bnQ7CisJCQl0cy0+d3JpZHgyICs9IGNvdW50OworCQkJaWYgKHRzLT53cmlkeDIgPj0gQlVGU0laRSkgLyogYWN0dWFsbHkgPT0gQlVGU0laRSAqLworCQkJCXRzLT53cmlkeDIgPSAwOworCQl9Cisgc2tpcDI6CisJCS8qIFNob3VsZCBub3QgYmUgbmVlZGVkLCBidXQuLi4gcmVtb3ZlX2lhY3MgaXMgYWN0dWFsbHkgYnVnZ3kKKwkJICogKGl0IGNhbm5vdCBwcm9jZXNzIGlhY3Mgd2hpY2ggd3JhcCBhcm91bmQgYnVmZmVyJ3MgZW5kKSEKKwkJICogU2luY2UgcHJvcGVybHkgZml4aW5nIGl0IHJlcXVpcmVzIHdyaXRpbmcgYmlnZ2VyIGNvZGUsCisJCSAqIHdlIHJlbHkgaW5zdGVhZCBvbiB0aGlzIGNvZGUgbWFraW5nIGl0IHZpcnR1YWxseSBpbXBvc3NpYmxlCisJCSAqIHRvIGhhdmUgd3JhcHBlZCBpYWMgKHBlb3BsZSBkb24ndCB0eXBlIGF0IDJrL3NlY29uZCkuCisJCSAqIEl0IGFsc28gYWxsb3dzIGZvciBiaWdnZXIgcmVhZHMgaW4gY29tbW9uIGNhc2UuICovCisJCWlmICh0cy0+c2l6ZTEgPT0gMCkgeworCQkJdHMtPnJkaWR4MSA9IDA7CisJCQl0cy0+d3JpZHgxID0gMDsKKwkJfQorCQlpZiAodHMtPnNpemUyID09IDApIHsKKwkJCXRzLT5yZGlkeDIgPSAwOworCQkJdHMtPndyaWR4MiA9IDA7CisJCX0KKworCQlpZiAoLyp0cy0+c2l6ZTEgPCBCVUZTSVpFICYmKi8gRkRfSVNTRVQodHMtPnNvY2tmZF9yZWFkLCAmcmRmZHNldCkpIHsKKwkJCS8qIFJlYWQgZnJvbSBzb2NrZXQgdG8gYnVmZmVyIDEgKi8KKwkJCWNvdW50ID0gTUlOKEJVRlNJWkUgLSB0cy0+cmRpZHgxLCBCVUZTSVpFIC0gdHMtPnNpemUxKTsKKwkJCWNvdW50ID0gc2FmZV9yZWFkKHRzLT5zb2NrZmRfcmVhZCwgVFNfQlVGMSh0cykgKyB0cy0+cmRpZHgxLCBjb3VudCk7CisJCQlpZiAoY291bnQgPD0gMCkgeworCQkJCWlmIChjb3VudCA8IDAgJiYgZXJybm8gPT0gRUFHQUlOKQorCQkJCQlnb3RvIHNraXAzOworCQkJCWdvdG8ga2lsbF9zZXNzaW9uOworCQkJfQorCQkJLyogSWdub3JlIHRyYWlsaW5nIE5VTCBpZiBpdCBpcyB0aGVyZSAqLworCQkJaWYgKCFUU19CVUYxKHRzKVt0cy0+cmRpZHgxICsgY291bnQgLSAxXSkgeworCQkJCS0tY291bnQ7CisJCQl9CisJCQl0cy0+c2l6ZTEgKz0gY291bnQ7CisJCQl0cy0+cmRpZHgxICs9IGNvdW50OworCQkJaWYgKHRzLT5yZGlkeDEgPj0gQlVGU0laRSkgLyogYWN0dWFsbHkgPT0gQlVGU0laRSAqLworCQkJCXRzLT5yZGlkeDEgPSAwOworCQl9Cisgc2tpcDM6CisJCWlmICgvKnRzLT5zaXplMiA8IEJVRlNJWkUgJiYqLyBGRF9JU1NFVCh0cy0+cHR5ZmQsICZyZGZkc2V0KSkgeworCQkJLyogUmVhZCBmcm9tIHB0eSB0byBidWZmZXIgMiAqLworCQkJY291bnQgPSBNSU4oQlVGU0laRSAtIHRzLT5yZGlkeDIsIEJVRlNJWkUgLSB0cy0+c2l6ZTIpOworCQkJY291bnQgPSBzYWZlX3JlYWQodHMtPnB0eWZkLCBUU19CVUYyKHRzKSArIHRzLT5yZGlkeDIsIGNvdW50KTsKKwkJCWlmIChjb3VudCA8PSAwKSB7CisJCQkJaWYgKGNvdW50IDwgMCAmJiBlcnJubyA9PSBFQUdBSU4pCisJCQkJCWdvdG8gc2tpcDQ7CisJCQkJZ290byBraWxsX3Nlc3Npb247CisJCQl9CisJCQl0cy0+c2l6ZTIgKz0gY291bnQ7CisJCQl0cy0+cmRpZHgyICs9IGNvdW50OworCQkJaWYgKHRzLT5yZGlkeDIgPj0gQlVGU0laRSkgLyogYWN0dWFsbHkgPT0gQlVGU0laRSAqLworCQkJCXRzLT5yZGlkeDIgPSAwOworCQl9Cisgc2tpcDQ6CisJCXRzID0gbmV4dDsKKwkJY29udGludWU7Cisga2lsbF9zZXNzaW9uOgorCQlpZiAodHMtPnNoZWxsX3BpZCA+IDApCisJCQl1cGRhdGVfdXRtcF9ERUFEX1BST0NFU1ModHMtPnNoZWxsX3BpZCk7CisJCWZyZWVfc2Vzc2lvbih0cyk7CisJCXRzID0gbmV4dDsKKwl9CisKKwlnb3RvIGFnYWluOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy90ZWxuZXRkLmN0cmxTUS5wYXRjaCBiL25ldHdvcmtpbmcvdGVsbmV0ZC5jdHJsU1EucGF0Y2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2MGUxYwotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvdGVsbmV0ZC5jdHJsU1EucGF0Y2gKQEAgLTAsMCArMSwxNzUgQEAKK0Zyb206ICJEb3VnIEdyYWhhbSIgPGRncmFoYW1Abm9ydGVsLmNvbT4KK0RhdGU6IDIwMDktMDEtMjIgMDc6MjAKKworSGVsbG8sCisKK0J1c3lib3gncyB0ZWxuZXRkIGRvZXMgbm90IGRpc2FibGUgbG9jYWwgKGNsaWVudC1zaWRlKSBmbG93IGNvbnRyb2wKK3Byb3Blcmx5LiAgSXQgZG9lcyBub3QgcHV0IHRoZSBwdHkgaW50byBwYWNrZXQgbW9kZSBhbmQgdGhlbiBub3RpZnkgdGhlCitjbGllbnQgd2hlbmV2ZXIgZmxvdyBjb250cm9sIGlzIGRpc2FibGVkIGJ5IGFuIGFwcGxpY2F0aW9uIHJ1bm5pbmcgdW5kZXIKK2l0cyBjb250cm9sLiAgVGhlIHJlc3VsdCBpcyB0aGF0IF5TL15RIGFyZSBub3QgcGFzc2VkIHRocm91Z2ggdG8gdGhlCithcHBsaWNhdGlvbiwgd2hpY2ggaXMgcGFpbmZ1bCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBpcyBhbiBlbWFjcyB2YXJpYW50LgorCitJIHN1cHBvc2UgdGhhdCBzdXBwb3J0IGZvciB0aGlzIG1pZ2h0IGJlIGNvbnNpZGVyZWQgYmxvYXQsIGJ1dCB0aGUKK2luY2x1ZGVkIHBhdGNoIG9ubHkgYWRkcyBhYm91dCAyMDAgYnl0ZXMgb2YgdGV4dCB0byB4ODYgYnVzeWJveCBhbmQgMzAwCitieXRlcyB0byBtaXBzZWwgYnVzeWJveC4gIFBsZWFzZSBjb25zaWRlciBhcHBseWluZy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTkI6IHRoZSBwYXRjaCBkb2Vzbid0IHdvcmsgYXMtaXMgYmVjYXVzZSB3ZSBub3cgaGF2ZSBpYWNfc2FmZV93cml0ZSgpCit3aGljaCBxdW90ZXMgSUFDcyBvbiBvdXRwdXQuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitEb2NzOgorCitUaGUgZm9sbG93aW5nIGlvY3RsKDIpIGNhbGxzIGFwcGx5IG9ubHkgdG8gcHNldWRvIHRlcm1pbmFsczoKKworVElPQ1NUT1AgU3RvcHMgb3V0cHV0IHRvIGEgdGVybWluYWwgKGUuZy4gbGlrZSB0eXBpbmcgXlMpLiBUYWtlcyBubyBwYXJhbWV0ZXIuCisKK1RJT0NTVEFSVCBSZXN0YXJ0cyBvdXRwdXQgKHN0b3BwZWQgYnkgVElPQ1NUT1Agb3IgYnkgdHlwaW5nIF5TKS4gVGFrZXMgbm8gcGFyYW1ldGVyLgorCitUSU9DUEtUICAgICAgICAgRW5hYmxlL2Rpc2FibGUgcGFja2V0IG1vZGUuIFdoZW4gYXBwbGllZCB0byB0aGUgbWFzdGVyIHNpZGUgb2YgYSBwc2V1ZG8gdGVybWluYWwsIGVhY2gKK3N1YnNlcXVlbnQgcmVhZCgyKSBmcm9tIHRoZSB0ZXJtaW5hbCB3aWxsIHJldHVybiBkYXRhIHdyaXR0ZW4gb24gdGhlIHNsYXZlIHBhcnQgb2YgdGhlIHBzZXVkbyB0ZXJtaW5hbCBwcmVjZWRlZCBieSBhCit6ZXJvIGJ5dGUgKHN5bWJvbGljYWxseSBkZWZpbmVkIGFzIFRJT0NQS1RfREFUQSksIG9yIGEgc2luZ2xlIGJ5dGUgcmVmbGVjdGluZyBjb250cm9sIHN0YXR1cyBpbmZvcm1hdGlvbi4KK0luIHRoZSBsYXR0ZXIgY2FzZSwgdGhlIGJ5dGUgaXMgYW4gaW5jbHVzaXZlLW9yIG9mIHplcm8gb3IgbW9yZSBvZiB0aGUgYml0czoKKworVElPQ1BLVF9GTFVTSFJFQUQgICAgIHdoZW5ldmVyIHRoZSByZWFkIHF1ZXVlIGZvciB0aGUgdGVybWluYWwgaXMgZmx1c2hlZC4KK1RJT0NQS1RfRkxVU0hXUklURSAgICB3aGVuZXZlciB0aGUgd3JpdGUgcXVldWUgZm9yIHRoZSB0ZXJtaW5hbCBpcyBmbHVzaGVkLgorVElPQ1BLVF9TVE9QICAgIHdoZW5ldmVyIG91dHB1dCB0byB0aGUgdGVybWluYWwgaXMgc3RvcHBlZCBhIGxhIF5TLgorVElPQ1BLVF9TVEFSVCAgIHdoZW5ldmVyIG91dHB1dCB0byB0aGUgdGVybWluYWwgaXMgcmVzdGFydGVkLgorVElPQ1BLVF9ET1NUT1AgIHdoZW5ldmVyIHRfc3RvcGMgaXMgXlMgYW5kIHRfc3RhcnRjIGlzIF5RLgorVElPQ1BLVF9OT1NUT1AgIHdoZW5ldmVyIHRoZSBzdGFydCBhbmQgc3RvcCBjaGFyYWN0ZXJzIGFyZSBub3QgXlMvXlEuCisKK1doaWxlIHRoaXMgbW9kZSBpcyBpbiB1c2UsIHRoZSBwcmVzZW5jZSBvZiBjb250cm9sIHN0YXR1cyBpbmZvcm1hdGlvbiB0byBiZSByZWFkIGZyb20gdGhlIG1hc3RlciBzaWRlIG1heSBiZSBkZXRlY3RlZAorYnkgYSBzZWxlY3QoMikgZm9yIGV4Y2VwdGlvbmFsIGNvbmRpdGlvbnMuCisKK1RoaXMgbW9kZSBpcyB1c2VkIGJ5IHJsb2dpbigxKSBhbmQgcmxvZ2luZCg4KSB0byBpbXBsZW1lbnQgYSByZW1vdGUtZWNob2VkLCBsb2NhbGx5IF5TL15RIGZsb3ctY29udHJvbGxlZCByZW1vdGUgbG9naW4KK3dpdGggcHJvcGVyIGJhY2stZmx1c2hpbmcgb2Ygb3V0cHV0OyBpdCBjYW4gYmUgdXNlZCBieSBvdGhlciBzaW1pbGFyIHByb2dyYW1zLgorCitUSU9DVUNOVEwgICAgICAgRW5hYmxlL2Rpc2FibGUgYSBtb2RlIHRoYXQgYWxsb3dzIGEgc21hbGwgbnVtYmVyIG9mIHNpbXBsZSB1c2VyIGlvY3RsKDIpIGNvbW1hbmRzIHRvIGJlIHBhc3NlZCB0aHJvdWdoCit0aGUgcHNldWRvLXRlcm1pbmFsLCB1c2luZyBhIHByb3RvY29sIHNpbWlsYXIgdG8gdGhhdCBvZiBUSU9DUEtULiBUaGUgVElPQ1VDTlRMIGFuZCBUSU9DUEtUIG1vZGVzIGFyZSBtdXR1YWxseQorZXhjbHVzaXZlLiBUaGlzIG1vZGUgaXMgZW5hYmxlZCBmcm9tIHRoZSBtYXN0ZXIgc2lkZSBvZiBhIHBzZXVkbyB0ZXJtaW5hbC4gRWFjaCBzdWJzZXF1ZW50IHJlYWQoMikgZnJvbSB0aGUgbWFzdGVyIHNpZGUKK3dpbGwgcmV0dXJuIGRhdGEgd3JpdHRlbiBvbiB0aGUgc2xhdmUgcGFydCBvZiB0aGUgcHNldWRvIHRlcm1pbmFsIHByZWNlZGVkIGJ5IGEgemVybyBieXRlLCBvciBhIHNpbmdsZSBieXRlIHJlZmxlY3RpbmcgYQordXNlciBjb250cm9sIG9wZXJhdGlvbiBvbiB0aGUgc2xhdmUgc2lkZS4gQSB1c2VyIGNvbnRyb2wgY29tbWFuZCBjb25zaXN0cyBvZiBhIHNwZWNpYWwgaW9jdGwoMikgb3BlcmF0aW9uIHdpdGggbm8gZGF0YTsKK3RoZSBjb21tYW5kIGlzIGdpdmVuIGFzIFVJT0NDTUQgKG4pLCB3aGVyZSBuIGlzIGEgbnVtYmVyIGluIHRoZSByYW5nZSAxLTI1NS4gVGhlIG9wZXJhdGlvbiB2YWx1ZSBuIHdpbGwgYmUgcmVjZWl2ZWQgYXMKK2Egc2luZ2xlIGJ5dGUgb24gdGhlIG5leHQgcmVhZCgyKSBmcm9tIHRoZSBtYXN0ZXIgc2lkZS4gVGhlIGlvY3RsKDIpIFVJT0NDTUQgKDApIGlzIGEgbm8tb3AgdGhhdCBtYXkgYmUgdXNlZCB0byBwcm9iZQorZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhpcyBmYWNpbGl0eS4gQXMgd2l0aCBUSU9DUEtUIG1vZGUsIGNvbW1hbmQgb3BlcmF0aW9ucyBtYXkgYmUgZGV0ZWN0ZWQgd2l0aCBhIHNlbGVjdCgyKSBmb3IKK2V4Y2VwdGlvbmFsIGNvbmRpdGlvbnMuCisKKy0tLSBidXN5Ym94LTEuMTMuMi9uZXR3b3JraW5nL3RlbG5ldGQuYwkyMDA5LzAxLzIxIDIwOjAyOjM5CTEuMQorKysrIGJ1c3lib3gtMS4xMy4yL25ldHdvcmtpbmcvdGVsbmV0ZC5jCTIwMDkvMDEvMjIgMDA6MzU6MjgKK0BAIC0zOCw2ICszOCw5IEBACisgCWludCBzb2NrZmRfcmVhZCwgc29ja2ZkX3dyaXRlLCBwdHlmZDsKKyAJaW50IHNoZWxsX3BpZDsKKyAKKysjaWZkZWYgVElPQ1BLVAorKwlpbnQgZmxvd3N0YXRlOworKyNlbmRpZgorIAkvKiB0d28gY2lyY3VsYXIgYnVmZmVycyAqLworIAkvKmNoYXIgKmJ1ZjEsICpidWYyOyovCisgLyojZGVmaW5lIFRTX0JVRjEgdHMtPmJ1ZjEqLworQEAgLTE3MCw2ICsxNzMsOSBAQAorIAlpbnQgZmQsIHBpZDsKKyAJY2hhciB0dHlfbmFtZVtHRVRQVFlfQlVGU0laRV07CisgCXN0cnVjdCB0c2Vzc2lvbiAqdHMgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3QgdHNlc3Npb24pICsgQlVGU0laRSAqIDIpOworKyNpZmRlZiBUSU9DUEtUCisrCWludCBvbiA9IDE7CisrI2VuZGlmCisgCisgCS8qdHMtPmJ1ZjEgPSAoY2hhciAqKSh0cyArIDEpOyovCisgCS8qdHMtPmJ1ZjIgPSB0cy0+YnVmMSArIEJVRlNJWkU7Ki8KK0BAIC0xODAsNiArMTg2LDEwIEBACisgCQltYXhmZCA9IGZkOworIAl0cy0+cHR5ZmQgPSBmZDsKKyAJbmRlbGF5X29uKGZkKTsKKysjaWZkZWYgVElPQ1BLVAorKwlpb2N0bChmZCwgVElPQ1BLVCwgJm9uKTsKKysJdHMtPmZsb3dzdGF0ZSA9IFRJT0NQS1RfRE9TVE9QOworKyNlbmRpZgorICNpZiBFTkFCTEVfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUKKyAJdHMtPnNvY2tmZF9yZWFkID0gc29jazsKKyAJLyogU09fS0VFUEFMSVZFIGJ5IHBvcHVsYXIgZGVtYW5kICovCitAQCAtMzg1LDYgKzM5NSwxNiBAQAorIAkJcG9ydG5iciA9IDIzLAorIAl9OworICNlbmRpZgorKyNpZmRlZiBUSU9DUEtUCisrCWludCBjb250cm9sOworKwlzdGF0aWMgY29uc3QgY2hhciBsZmxvd19vbltdID0KKysJICAgIHtJQUMsIFNCLCBURUxPUFRfTEZMT1csIExGTE9XX09OLCBJQUMsIFNFfTsKKysJc3RhdGljIGNvbnN0IGNoYXIgbGZsb3dfb2ZmW10gPQorKwkgICAge0lBQywgU0IsIFRFTE9QVF9MRkxPVywgTEZMT1dfT0ZGLCBJQUMsIFNFfTsKKysjIGRlZmluZSBSRVNFUlZFRCBzaXplb2YobGZsb3dfb24pCisrI2Vsc2UKKysjIGRlZmluZSBSRVNFUlZFRCAwCisrI2VuZGlmCisgCS8qIEV2ZW4gaWYgIVNUQU5EQUxPTkUsIHdlIGFjY2VwdCAoYW5kIGlnbm9yZSkgLWksIHRodXMgcGVvcGxlCisgCSAqIGRvbid0IG5lZWQgdG8gZ3Vlc3Mgd2hldGhlciBpdCdzIG9rIHRvIHBhc3MgLWkgdG8gdXMgKi8KKyAJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImY6bDpLaSIgSUZfRkVBVFVSRV9URUxORVREX1NUQU5EQUxPTkUoInA6YjpGIiksCitAQCAtNDc1LDcgKzQ5NSw3IEBACisgCQkJCUZEX1NFVCh0cy0+c29ja2ZkX3JlYWQsICZyZGZkc2V0KTsKKyAJCQlpZiAodHMtPnNpemUyID4gMCkgICAgICAgLyogY2FuIHdyaXRlIHRvIHNvY2tldCAqLworIAkJCQlGRF9TRVQodHMtPnNvY2tmZF93cml0ZSwgJndyZmRzZXQpOworLQkJCWlmICh0cy0+c2l6ZTIgPCBCVUZTSVpFKSAvKiBjYW4gcmVhZCBmcm9tIHB0eSAqLworKwkJCWlmICh0cy0+c2l6ZTIgPCAoQlVGU0laRSAtIFJFU0VSVkVEKSkgLyogY2FuIHJlYWQgZnJvbSBwdHkgKi8KKyAJCQkJRkRfU0VUKHRzLT5wdHlmZCwgJnJkZmRzZXQpOworIAkJfQorIAkJdHMgPSBuZXh0OworQEAgLTU5Myw2ICs2MTMsNTIgQEAKKyAJCQkJCWdvdG8gc2tpcDQ7CisgCQkJCWdvdG8ga2lsbF9zZXNzaW9uOworIAkJCX0KKysjaWZkZWYgVElPQ1BLVAorKwkJCWNvbnRyb2wgPSBUU19CVUYyW3RzLT5yZGlkeDJdOworKwkJCWlmICgtLWNvdW50ID4gMCAmJiBjb250cm9sID09IFRJT0NQS1RfREFUQSkgeworKwkJCQkvKgorKwkJCQkgKiBJZiB3ZSBhcmUgaW4gcGFja2V0IG1vZGUsIGFuZCB3ZSBoYXZlCisrCQkJCSAqIGp1c3QgcmVhZCBhIGNodW5rIG9mIGFjdHVhbCBkYXRhIGZyb20KKysJCQkJICogdGhlIHB0eSwgdGhlbiB0aGVyZSBpcyB0aGUgVElPQ1BLVF9EQVRBCisrCQkJCSAqIGJ5dGUgKHplcm8pIHRoYXQgd2UgaGF2ZSBnb3QgdG8gcmVtb3ZlCisrCQkJCSAqIHNvbWVob3cuICBJZiB0aGVyZSB3ZXJlIG5vIGNoYXJzIGluCisrCQkJCSAqIFRTX0JVRjIgYmVmb3JlIHdlIGRpZCB0aGlzIHJlYWQsIHRoZW4KKysJCQkJICogd2UgY2FuIG9wdGltaXplIGJ5IGp1c3QgYWR2YW5jaW5nIHdyaWR4Mi4KKysJCQkJICogT3RoZXJ3aXNlIHdlIGhhdmUgdG8gY29weSB0aGUgbmV3IGRhdGEgZG93bgorKwkJCQkgKiB0byBjbG9zZSB0aGUgZ2FwIChDb3VsZCB1c2UgcmVhZHYoKSBpbnN0ZWFkKS4KKysJCQkJICovCisrCQkJCWlmICh0cy0+c2l6ZTIgPT0gMCkKKysJCQkJCXRzLT53cmlkeDIrKzsKKysJCQkJZWxzZSB7CisrCQkJCQltZW1tb3ZlKFRTX0JVRjIgKyB0cy0+cmRpZHgyLAorKwkJCQkJCVRTX0JVRjIgKyB0cy0+cmRpZHgyICsgMSwgY291bnQpOworKwkJCQl9CisrCQkJfQorKworKwkJCS8qCisrCQkJICogSWYgdGhlIGZsb3cgY29udHJvbCBzdGF0ZSBjaGFuZ2VkLCBub3RpZnkKKysJCQkgKiB0aGUgY2xpZW50LiAgSWYgImNvbnRyb2wiIGlzIG5vdCBUSU9DUEtUX0RBVEEsCisrCQkJICogdGhlbiB0aGVyZSBhcmUgbm8gZGF0YSBieXRlcyB0byB3b3JyeSBhYm91dC4KKysJCQkgKi8KKysJCQlpZiAoKGNvbnRyb2wgJiAoVElPQ1BLVF9ET1NUT1B8VElPQ1BLVF9OT1NUT1ApKSAhPSAwCisrCQkJICYmIHRzLT5mbG93c3RhdGUgIT0gKGNvbnRyb2wgJiBUSU9DUEtUX0RPU1RPUCkpIHsKKysJCQkJY29uc3QgY2hhciAqcCA9IHRzLT5mbG93c3RhdGUgPyBsZmxvd19vZmYgOiBsZmxvd19vbjsKKysKKysJCQkJLyoKKysJCQkJICogV2Uga25vdyB3ZSBoYXZlIGVub3VnaCBmcmVlIHNsb3RzIGF2YWlsYWJsZQorKwkJCQkgKiAoc2VlIFJFU0VSVkVEKSBidXQgdGhleSBhcmUgbm90IG5lY2Vzc2FyaWx5CisrCQkJCSAqIGNvbnRpZ3VvdXM7IHdlIG1heSBoYXZlIHRvIHdyYXAuCisrCQkJCSAqLworKwkJCQlmb3IgKGNvdW50ID0gc2l6ZW9mKGxmbG93X29uKTsgY291bnQgPiAwOyBjb3VudC0tKSB7CisrCQkJCQlUU19CVUYyW3RzLT5yZGlkeDIrK10gPSAqcCsrOworKwkJCQkJaWYgKHRzLT5yZGlkeDIgPj0gQlVGU0laRSkKKysJCQkJCQl0cy0+cmRpZHgyID0gMDsKKysJCQkJCXRzLT5zaXplMisrOworKwkJCQl9CisrCisrCQkJCXRzLT5mbG93c3RhdGUgPSBjb250cm9sICYgVElPQ1BLVF9ET1NUT1A7CisrCQkJfQorKyNlbmRpZiAvKiBUSU9DUEtUICovCisgCQkJdHMtPnNpemUyICs9IGNvdW50OworIAkJCXRzLT5yZGlkeDIgKz0gY291bnQ7CisgCQkJaWYgKHRzLT5yZGlkeDIgPj0gQlVGU0laRSkgLyogYWN0dWFsbHkgPT0gQlVGU0laRSAqLworCistLURvdWcKK19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCitidXN5Ym94IG1haWxpbmcgbGlzdAorYnVzeWJveEBidXN5Ym94Lm5ldAoraHR0cDovL2xpc3RzLmJ1c3lib3gubmV0L21haWxtYW4vbGlzdGluZm8vYnVzeWJveApkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy90ZnRwLmMgYi9uZXR3b3JraW5nL3RmdHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWNkN2JiCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy90ZnRwLmMKQEAgLTAsMCArMSw4ODkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIEEgc2ltcGxlIHRmdHAgY2xpZW50L3NlcnZlciBmb3IgYnVzeWJveC4KKyAqIFRyaWVzIHRvIGZvbGxvdyBSRkMxMzUwLgorICogT25seSAib2N0ZXQiIG1vZGUgc3VwcG9ydGVkLgorICogT3B0aW9uYWwgYmxvY2tzaXplIG5lZ290aWF0aW9uIChSRkMyMzQ3ICsgUkZDMjM0OCkKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgTWFnbnVzIERhbW0gPGRhbW1Ab3BlbnNvdXJjZS5zZT4KKyAqCisgKiBQYXJ0cyBvZiB0aGUgY29kZSBiYXNlZCBvbjoKKyAqCisgKiBhdGZ0cDogIENvcHlyaWdodCAoQykgMjAwMCBKZWFuLVBpZXJyZSBMZWZlYnZyZSA8aGVsaXhAc3RlcC5wb2x5bXRsLmNhPgorICogICAgICAgICAgICAgICAgICAgICAgICBhbmQgUmVtaSBMZWZlYnZyZSA8cmVtaUBkZWJpYW4ub3JnPgorICoKKyAqIHV0ZnRwOiAgQ29weXJpZ2h0IChDKSAxOTk5IFV3ZSBPaHNlIDx1d2VAb2hzZS5kZT4KKyAqCisgKiB0ZnRwZCBhZGRlZCBieSBEZW55cyBWbGFzZW5rbyAmIFZsYWRpbWlyIERyb25uaWtvdgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHRmdHBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBIT1NUIFtQT1JUXSIKKy8vdXNhZ2U6I2RlZmluZSB0ZnRwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVHJhbnNmZXIgYSBmaWxlIGZyb20vdG8gdGZ0cCBzZXJ2ZXJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWwgRklMRQlMb2NhbCBGSUxFIgorLy91c2FnZTogICAgICJcbgktciBGSUxFCVJlbW90ZSBGSUxFIgorLy91c2FnZToJSUZfRkVBVFVSRV9URlRQX0dFVCgKKy8vdXNhZ2U6ICAgICAiXG4JLWcJR2V0IGZpbGUiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX1RGVFBfUFVUKAorLy91c2FnZTogICAgICJcbgktcAlQdXQgZmlsZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUoCisvL3VzYWdlOiAgICAgIlxuCS1iIFNJWkUJVHJhbnNmZXIgYmxvY2tzIG9mIFNJWkUgb2N0ZXRzIgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB0ZnRwZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jcl0gWy11IFVTRVJdIFtESVJdIgorLy91c2FnZTojZGVmaW5lIHRmdHBkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVHJhbnNmZXIgYSBmaWxlIG9uIHRmdHAgY2xpZW50J3MgcmVxdWVzdFxuIgorLy91c2FnZTogICAgICAgIlxuIgorLy91c2FnZTogICAgICAgInRmdHBkIHNob3VsZCBiZSB1c2VkIGFzIGFuIGluZXRkIHNlcnZpY2UuXG4iCisvL3VzYWdlOiAgICAgICAidGZ0cGQncyBsaW5lIGZvciBpbmV0ZC5jb25mOlxuIgorLy91c2FnZTogICAgICAgIgk2OSBkZ3JhbSB1ZHAgbm93YWl0IHJvb3QgdGZ0cGQgdGZ0cGQgLWwgL2ZpbGVzL3RvL3NlcnZlXG4iCisvL3VzYWdlOiAgICAgICAiSXQgYWxzbyBjYW4gYmUgcmFuIGZyb20gdWRwc3ZkOlxuIgorLy91c2FnZTogICAgICAgIgl1ZHBzdmQgLXZFIDAuMC4wLjAgNjkgdGZ0cGQgL2ZpbGVzL3RvL3NlcnZlXG4iCisvL3VzYWdlOiAgICAgIlxuCS1yCVByb2hpYml0IHVwbG9hZCIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJQWxsb3cgZmlsZSBjcmVhdGlvbiB2aWEgdXBsb2FkIgorLy91c2FnZTogICAgICJcbgktdQlBY2Nlc3MgZmlsZXMgYXMgVVNFUiIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTG9nIHRvIHN5c2xvZyAoaW5ldGQgbW9kZSByZXF1aXJlcyB0aGlzKSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzbG9nLmg+CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9URlRQX0dFVCB8fCBFTkFCTEVfRkVBVFVSRV9URlRQX1BVVAorCisjZGVmaW5lIFRGVFBfQkxLU0laRV9ERUZBVUxUICAgICAgIDUxMiAgLyogYWNjb3JkaW5nIHRvIFJGQyAxMzUwLCBkb24ndCBjaGFuZ2UgKi8KKyNkZWZpbmUgVEZUUF9CTEtTSVpFX0RFRkFVTFRfU1RSICI1MTIiCisvKiBXYXMgNTAgbXMgYnV0IHVzZXJzIGFza2VkIHRvIGJ1bXAgaXQgdXAgYSBiaXQgKi8KKyNkZWZpbmUgVEZUUF9USU1FT1VUX01TICAgICAgICAgICAgMTAwCisjZGVmaW5lIFRGVFBfTUFYVElNRU9VVF9NUyAgICAgICAgMjAwMAorI2RlZmluZSBURlRQX05VTV9SRVRSSUVTICAgICAgICAgICAgMTIgIC8qIG51bWJlciBvZiBiYWNrZWQtb2ZmIHJldHJpZXMgKi8KKworLyogb3Bjb2RlcyB3ZSBzdXBwb3J0ICovCisjZGVmaW5lIFRGVFBfUlJRICAgMQorI2RlZmluZSBURlRQX1dSUSAgIDIKKyNkZWZpbmUgVEZUUF9EQVRBICAzCisjZGVmaW5lIFRGVFBfQUNLICAgNAorI2RlZmluZSBURlRQX0VSUk9SIDUKKyNkZWZpbmUgVEZUUF9PQUNLICA2CisKKy8qIGVycm9yIGNvZGVzIHNlbnQgb3ZlciBuZXR3b3JrICh3ZSB1c2Ugb25seSAwLCAxLCAzIGFuZCA4KSAqLworLyogZ2VuZXJpYyAoZXJyb3IgbWVzc2FnZSBpcyBpbmNsdWRlZCBpbiB0aGUgcGFja2V0KSAqLworI2RlZmluZSBFUlJfVU5TUEVDICAgMAorI2RlZmluZSBFUlJfTk9GSUxFICAgMQorI2RlZmluZSBFUlJfQUNDRVNTICAgMgorLyogZGlzayBmdWxsIG9yIGFsbG9jYXRpb24gZXhjZWVkZWQgKi8KKyNkZWZpbmUgRVJSX1dSSVRFICAgIDMKKyNkZWZpbmUgRVJSX09QICAgICAgIDQKKyNkZWZpbmUgRVJSX0JBRF9JRCAgIDUKKyNkZWZpbmUgRVJSX0VYSVNUICAgIDYKKyNkZWZpbmUgRVJSX0JBRF9VU0VSIDcKKyNkZWZpbmUgRVJSX0JBRF9PUFQgIDgKKworLyogbWFza3MgY29taW5nIGZyb20gZ2V0b3B0MzIgKi8KK2VudW0geworCVRGVFBfT1BUX0dFVCA9ICgxIDw8IDApLAorCVRGVFBfT1BUX1BVVCA9ICgxIDw8IDEpLAorCS8qIHBzZXVkbyBvcHRpb246IGlmIHNldCwgaXQncyB0ZnRwZCAqLworCVRGVFBEX09QVCA9ICgxIDw8IDcpICogRU5BQkxFX1RGVFBELAorCVRGVFBEX09QVF9yID0gKDEgPDwgOCkgKiBFTkFCTEVfVEZUUEQsCisJVEZUUERfT1BUX2MgPSAoMSA8PCA5KSAqIEVOQUJMRV9URlRQRCwKKwlURlRQRF9PUFRfdSA9ICgxIDw8IDEwKSAqIEVOQUJMRV9URlRQRCwKKwlURlRQRF9PUFRfbCA9ICgxIDw8IDExKSAqIEVOQUJMRV9URlRQRCwKK307CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9URlRQX0dFVCAmJiAhRU5BQkxFX0ZFQVRVUkVfVEZUUF9QVVQKKyNkZWZpbmUgSUZfR0VUUFVUKC4uLikKKyNkZWZpbmUgQ01EX0dFVChjbWQpIDEKKyNkZWZpbmUgQ01EX1BVVChjbWQpIDAKKyNlbGlmICFFTkFCTEVfRkVBVFVSRV9URlRQX0dFVCAmJiBFTkFCTEVfRkVBVFVSRV9URlRQX1BVVAorI2RlZmluZSBJRl9HRVRQVVQoLi4uKQorI2RlZmluZSBDTURfR0VUKGNtZCkgMAorI2RlZmluZSBDTURfUFVUKGNtZCkgMQorI2Vsc2UKKyNkZWZpbmUgSUZfR0VUUFVUKC4uLikgX19WQV9BUkdTX18KKyNkZWZpbmUgQ01EX0dFVChjbWQpICgoY21kKSAmIFRGVFBfT1BUX0dFVCkKKyNkZWZpbmUgQ01EX1BVVChjbWQpICgoY21kKSAmIFRGVFBfT1BUX1BVVCkKKyNlbmRpZgorLyogTkI6IGluIHRoZSBjb2RlIGJlbG93CisgKiBDTURfR0VUKGNtZCkgYW5kIENNRF9QVVQoY21kKSBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlCisgKi8KKworCitzdHJ1Y3QgZ2xvYmFscyB7CisJLyogdTE2IFRGVFBfRVJST1I7IHUxNiByZWFzb247IGJvdGggbmV0d29yay1lbmRpYW4sIHRoZW4gZXJyb3IgdGV4dDogKi8KKwl1aW50OF90IGVycm9yX3BrdFs0ICsgMzJdOworCXN0cnVjdCBwYXNzd2QgKnB3OworCS8qIFVzZWQgaW4gdGZ0cGRfbWFpbigpIGZvciBpbml0aWFsIHBhY2tldCAqLworCS8qIFNvbWUgSFAgUEEtUklTQyBmaXJtd2FyZSBhbHdheXMgc2VuZHMgZml4ZWQgNTE2LWJ5dGUgcmVxdWVzdHMgKi8KKwljaGFyIGJsb2NrX2J1Zls1MTZdOworCWNoYXIgYmxvY2tfYnVmX3RhaWxbMV07CisjaWYgRU5BQkxFX0ZFQVRVUkVfVEZUUF9QUk9HUkVTU19CQVIKKwlvZmZfdCBwb3M7CisJb2ZmX3Qgc2l6ZTsKKwljb25zdCBjaGFyICpmaWxlOworCWJiX3Byb2dyZXNzX3QgcG10OworI2VuZGlmCit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorc3RydWN0IEJVR19HX3Rvb19iaWcgeworCWNoYXIgQlVHX0dfdG9vX2JpZ1tzaXplb2YoRykgPD0gQ09NTU9OX0JVRlNJWkUgPyAxIDogLTFdOworfTsKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyB9IHdoaWxlICgwKQorCisjZGVmaW5lIEdfZXJyb3JfcGt0X3JlYXNvbiAoRy5lcnJvcl9wa3RbM10pCisjZGVmaW5lIEdfZXJyb3JfcGt0X3N0ciAgICAoKGNoYXIqKShHLmVycm9yX3BrdCArIDQpKQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEZUUF9QUk9HUkVTU19CQVIKK3N0YXRpYyB2b2lkIHRmdHBfcHJvZ3Jlc3NfdXBkYXRlKHZvaWQpCit7CisJYmJfcHJvZ3Jlc3NfdXBkYXRlKCZHLnBtdCwgMCwgRy5wb3MsIEcuc2l6ZSk7Cit9CitzdGF0aWMgdm9pZCB0ZnRwX3Byb2dyZXNzX2luaXQodm9pZCkKK3sKKwliYl9wcm9ncmVzc19pbml0KCZHLnBtdCwgRy5maWxlKTsKKwl0ZnRwX3Byb2dyZXNzX3VwZGF0ZSgpOworfQorc3RhdGljIHZvaWQgdGZ0cF9wcm9ncmVzc19kb25lKHZvaWQpCit7CisJaWYgKGlzX2JiX3Byb2dyZXNzX2luaXRlZCgmRy5wbXQpKSB7CisJCXRmdHBfcHJvZ3Jlc3NfdXBkYXRlKCk7CisJCWJiX3B1dGNoYXJfc3RkZXJyKCdcbicpOworCQliYl9wcm9ncmVzc19mcmVlKCZHLnBtdCk7CisJfQorfQorI2Vsc2UKKyMgZGVmaW5lIHRmdHBfcHJvZ3Jlc3NfaW5pdCgpICgodm9pZCkwKQorIyBkZWZpbmUgdGZ0cF9wcm9ncmVzc19kb25lKCkgKCh2b2lkKTApCisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFCisKK3N0YXRpYyBpbnQgdGZ0cF9ibGtzaXplX2NoZWNrKGNvbnN0IGNoYXIgKmJsa3NpemVfc3RyLCBpbnQgbWF4c2l6ZSkKK3sKKwkvKiBDaGVjayBpZiB0aGUgYmxrc2l6ZSBpcyB2YWxpZDoKKwkgKiBSRkMyMzQ4IHNheXMgYmV0d2VlbiA4IGFuZCA2NTQ2NCwKKwkgKiBidXQgb3VyIGltcGxlbWVudGF0aW9uIG1ha2VzIGl0IGltcG9zc2libGUKKwkgKiB0byB1c2UgYmxrc2l6ZXMgc21hbGxlciB0aGFuIDIyIG9jdGV0cy4gKi8KKwl1bnNpZ25lZCBibGtzaXplID0gYmJfc3RydG91KGJsa3NpemVfc3RyLCBOVUxMLCAxMCk7CisJaWYgKGVycm5vCisJIHx8IChibGtzaXplIDwgMjQpIHx8IChibGtzaXplID4gbWF4c2l6ZSkKKwkpIHsKKwkJYmJfZXJyb3JfbXNnKCJiYWQgYmxvY2tzaXplICclcyciLCBibGtzaXplX3N0cik7CisJCXJldHVybiAtMTsKKwl9CisjIGlmIEVOQUJMRV9URlRQX0RFQlVHCisJYmJfZXJyb3JfbXNnKCJ1c2luZyBibGtzaXplICV1IiwgYmxrc2l6ZSk7CisjIGVuZGlmCisJcmV0dXJuIGJsa3NpemU7Cit9CisKK3N0YXRpYyBjaGFyICp0ZnRwX2dldF9vcHRpb24oY29uc3QgY2hhciAqb3B0aW9uLCBjaGFyICpidWYsIGludCBsZW4pCit7CisJaW50IG9wdF92YWwgPSAwOworCWludCBvcHRfZm91bmQgPSAwOworCWludCBrOworCisJLyogYnVmIHBvaW50cyB0bzoKKwkgKiAib3B0X25hbWU8TlVMPm9wdF92YWw8TlVMPm9wdF9uYW1lMjxOVUw+b3B0X3ZhbDI8TlVMPi4uLiIgKi8KKworCXdoaWxlIChsZW4gPiAwKSB7CisJCS8qIE1ha2Ugc3VyZSBvcHRpb25zIGFyZSB0ZXJtaW5hdGVkIGNvcnJlY3RseSAqLworCQlmb3IgKGsgPSAwOyBrIDwgbGVuOyBrKyspIHsKKwkJCWlmIChidWZba10gPT0gJ1wwJykgeworCQkJCWdvdG8gbnVsX2ZvdW5kOworCQkJfQorCQl9CisJCXJldHVybiBOVUxMOworIG51bF9mb3VuZDoKKwkJaWYgKG9wdF92YWwgPT0gMCkgeyAvKiBpdCdzICJuYW1lIiBwYXJ0ICovCisJCQlpZiAoc3RyY2FzZWNtcChidWYsIG9wdGlvbikgPT0gMCkgeworCQkJCW9wdF9mb3VuZCA9IDE7CisJCQl9CisJCX0gZWxzZSBpZiAob3B0X2ZvdW5kKSB7CisJCQlyZXR1cm4gYnVmOworCQl9CisKKwkJaysrOworCQlidWYgKz0gazsKKwkJbGVuIC09IGs7CisJCW9wdF92YWwgXj0gMTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworI2VuZGlmCisKK3N0YXRpYyBpbnQgdGZ0cF9wcm90b2NvbCgKKwkJLyogTlVMTCBpZiB0ZnRwLCAhTlVMTCBpZiB0ZnRwZDogKi8KKwkJbGVuX2FuZF9zb2NrYWRkciAqb3VyX2xzYSwKKwkJbGVuX2FuZF9zb2NrYWRkciAqcGVlcl9sc2EsCisJCWNvbnN0IGNoYXIgKmxvY2FsX2ZpbGUKKwkJSUZfVEZUUCgsIGNvbnN0IGNoYXIgKnJlbW90ZV9maWxlKQorI2lmICFFTkFCTEVfVEZUUAorIyBkZWZpbmUgcmVtb3RlX2ZpbGUgTlVMTAorI2VuZGlmCisJCS8qIDEgZm9yIHRmdHA7IDEvMCBmb3IgdGZ0cGQgZGVwZW5kaW5nIHdoZXRoZXIgY2xpZW50IGFza2VkIGFib3V0IGl0OiAqLworCQlJRl9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFKCwgaW50IHdhbnRfdHJhbnNmZXJfc2l6ZSkKKwkJSUZfRkVBVFVSRV9URlRQX0JMT0NLU0laRSgsIGludCBibGtzaXplKSkKK3sKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUKKwllbnVtIHsgYmxrc2l6ZSA9IFRGVFBfQkxLU0laRV9ERUZBVUxUIH07CisjZW5kaWYKKworCXN0cnVjdCBwb2xsZmQgcGZkWzFdOworI2RlZmluZSBzb2NrZXRfZmQgKHBmZFswXS5mZCkKKwlpbnQgbGVuOworCWludCBzZW5kX2xlbjsKKwlJRl9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFKHNtYWxsaW50IGV4cGVjdF9PQUNLID0gMDspCisJc21hbGxpbnQgZmluaXNoZWQgPSAwOworCXVpbnQxNl90IG9wY29kZTsKKwl1aW50MTZfdCBibG9ja19ucjsKKwl1aW50MTZfdCByZWN2X2JsazsKKwlpbnQgb3Blbl9tb2RlLCBsb2NhbF9mZDsKKwlpbnQgcmV0cmllcywgd2FpdHRpbWVfbXM7CisJaW50IGlvX2J1ZnNpemUgPSBibGtzaXplICsgNDsKKwljaGFyICpjcDsKKwkvKiBDYW4ndCB1c2UgUkVTRVJWRV9DT05GSUdfQlVGRkVSIGhlcmUgc2luY2UgdGhlIGFsbG9jYXRpb24KKwkgKiBzaXplIHZhcmllcyBtZWFuaW5nIEJVRkZFUlNfR09fT05fU1RBQ0sgd291bGQgZmFpbC4KKwkgKgorCSAqIFdlIG11c3Qga2VlcCB0aGUgdHJhbnNtaXQgYW5kIHJlY2VpdmUgYnVmZmVycyBzZXBhcmF0ZQorCSAqIGluIGNhc2Ugd2UgcmN2IGEgZ2FyYmFnZSBwa3QgLSB3ZSBuZWVkIHRvIHJleG1pdCB0aGUgbGFzdCBwa3QuCisJICovCisJY2hhciAqeGJ1ZiA9IHhtYWxsb2MoaW9fYnVmc2l6ZSk7CisJY2hhciAqcmJ1ZiA9IHhtYWxsb2MoaW9fYnVmc2l6ZSk7CisKKwlzb2NrZXRfZmQgPSB4c29ja2V0KHBlZXJfbHNhLT51LnNhLnNhX2ZhbWlseSwgU09DS19ER1JBTSwgMCk7CisJc2V0c29ja29wdF9yZXVzZWFkZHIoc29ja2V0X2ZkKTsKKworCWlmICghRU5BQkxFX1RGVFAgfHwgb3VyX2xzYSkgeyAvKiB0ZnRwZCAqLworCQkvKiBDcmVhdGUgYSBzb2NrZXQgd2hpY2ggaXM6CisJCSAqIDEuIGJvdW5kIHRvIElQOnBvcnQgcGVlciBzZW50IDFzdCBkYXRhZ3JhbSB0bywKKwkJICogMi4gY29ubmVjdGVkIHRvIHBlZXIncyBJUDpwb3J0CisJCSAqIFRoaXMgd2F5IHdlIHdpbGwgYW5zd2VyIGZyb20gdGhlIElQOnBvcnQgcGVlcgorCQkgKiBleHBlY3RzLCB3aWxsIG5vdCBnZXQgYW55IG90aGVyIHBhY2tldHMgb24KKwkJICogdGhlIHNvY2tldCwgYW5kIGFsc28gcGxhaW4gcmVhZC93cml0ZSB3aWxsIHdvcmsuICovCisJCXhiaW5kKHNvY2tldF9mZCwgJm91cl9sc2EtPnUuc2EsIG91cl9sc2EtPmxlbik7CisJCXhjb25uZWN0KHNvY2tldF9mZCwgJnBlZXJfbHNhLT51LnNhLCBwZWVyX2xzYS0+bGVuKTsKKworCQkvKiBJcyB0aGVyZSBhbiBlcnJvciBhbHJlYWR5PyBTZW5kIHBrdCBhbmQgYmFpbCBvdXQgKi8KKwkJaWYgKEdfZXJyb3JfcGt0X3JlYXNvbiB8fCBHX2Vycm9yX3BrdF9zdHJbMF0pCisJCQlnb3RvIHNlbmRfZXJyX3BrdDsKKworCQlpZiAoRy5wdykgeworCQkJY2hhbmdlX2lkZW50aXR5KEcucHcpOyAvKiBpbml0Z3JvdXBzLCBzZXRnaWQsIHNldHVpZCAqLworCQl9CisJfQorCisJLyogUHJlcGFyZSBvcGVuIG1vZGUgKi8KKwlpZiAoQ01EX1BVVChvcHRpb25fbWFzazMyKSkgeworCQlvcGVuX21vZGUgPSBPX1JET05MWTsKKwl9IGVsc2UgeworCQlvcGVuX21vZGUgPSBPX1dST05MWSB8IE9fVFJVTkMgfCBPX0NSRUFUOworI2lmIEVOQUJMRV9URlRQRAorCQlpZiAoKG9wdGlvbl9tYXNrMzIgJiAoVEZUUERfT1BUK1RGVFBEX09QVF9jKSkgPT0gVEZUUERfT1BUKSB7CisJCQkvKiB0ZnRwZCB3aXRob3V0IC1jICovCisJCQlvcGVuX21vZGUgPSBPX1dST05MWSB8IE9fVFJVTkM7CisJCX0KKyNlbmRpZgorCX0KKworCS8qIEV4YW1wbGVzIG9mIG5ldHdvcmsgdHJhZmZpYy4KKwkgKiBOb3RlIHR3byBjYXNlcyB3aGVuIEFDS3Mgd2l0aCBibG9jayMgb2YgMCBhcmUgc2VudC4KKwkgKgorCSAqIERvd25sb2FkIHdpdGhvdXQgb3B0aW9uczoKKwkgKiB0ZnRwIC0+ICJcMFwxRklMRU5BTUVcMG9jdGV0XDAiCisJICogICAgICAgICAiXDBcM1wwXDFGSUxFREFUQS4uLiIgPC0gdGZ0cGQKKwkgKiB0ZnRwIC0+ICJcMFw0XDBcMSIKKwkgKiAuLi4KKwkgKiBEb3dubG9hZCB3aXRoIG9wdGlvbiBvZiBibGtzaXplIDE2Mzg0OgorCSAqIHRmdHAgLT4gIlwwXDFGSUxFTkFNRVwwb2N0ZXRcMGJsa3NpemVcMDAwMTYzODRcMCIKKwkgKiAgICAgICAgICJcMFw2Ymxrc2l6ZVwwMDAxNjM4NFwwIiA8LSB0ZnRwZAorCSAqIHRmdHAgLT4gIlwwXDRcMFwwIgorCSAqICAgICAgICAgIlwwXDNcMFwxRklMRURBVEEuLi4iIDwtIHRmdHBkCisJICogdGZ0cCAtPiAiXDBcNFwwXDEiCisJICogLi4uCisJICogVXBsb2FkIHdpdGhvdXQgb3B0aW9uczoKKwkgKiB0ZnRwIC0+ICJcMFwyRklMRU5BTUVcMG9jdGV0XDAiCisJICogICAgICAgICAiXDBcNFwwXDAiIDwtIHRmdHBkCisJICogdGZ0cCAtPiAiXDBcM1wwXDFGSUxFREFUQS4uLiIKKwkgKiAgICAgICAgICJcMFw0XDBcMSIgPC0gdGZ0cGQKKwkgKiAuLi4KKwkgKiBVcGxvYWQgd2l0aCBvcHRpb24gb2YgYmxrc2l6ZSAxNjM4NDoKKwkgKiB0ZnRwIC0+ICJcMFwyRklMRU5BTUVcMG9jdGV0XDBibGtzaXplXDAwMDE2Mzg0XDAiCisJICogICAgICAgICAiXDBcNmJsa3NpemVcMDAwMTYzODRcMCIgPC0gdGZ0cGQKKwkgKiB0ZnRwIC0+ICJcMFwzXDBcMUZJTEVEQVRBLi4uIgorCSAqICAgICAgICAgIlwwXDRcMFwxIiA8LSB0ZnRwZAorCSAqIC4uLgorCSAqLworCWJsb2NrX25yID0gMTsKKwljcCA9IHhidWYgKyAyOworCisJaWYgKCFFTkFCTEVfVEZUUCB8fCBvdXJfbHNhKSB7IC8qIHRmdHBkICovCisJCS8qIE9wZW4gZmlsZSAobXVzdCBiZSBhZnRlciBjaGFuZ2luZyB1c2VyKSAqLworCQlsb2NhbF9mZCA9IG9wZW4obG9jYWxfZmlsZSwgb3Blbl9tb2RlLCAwNjY2KTsKKwkJaWYgKGxvY2FsX2ZkIDwgMCkgeworCQkJR19lcnJvcl9wa3RfcmVhc29uID0gRVJSX05PRklMRTsKKwkJCXN0cmNweShHX2Vycm9yX3BrdF9zdHIsICJjYW4ndCBvcGVuIGZpbGUiKTsKKwkJCWdvdG8gc2VuZF9lcnJfcGt0OworCQl9CisvKiBnY2MgNC4zLjEgd291bGQgTk9UIG9wdGltaXplIGl0IG91dCBhcyBpdCBzaG91bGQhICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUKKwkJaWYgKGJsa3NpemUgIT0gVEZUUF9CTEtTSVpFX0RFRkFVTFQgfHwgd2FudF90cmFuc2Zlcl9zaXplKSB7CisJCQkvKiBDcmVhdGUgYW5kIHNlbmQgT0FDSyBwYWNrZXQuICovCisJCQkvKiBGb3IgdGhlIGRvd25sb2FkIGNhc2UsIGJsb2NrX25yIGlzIHN0aWxsIDEgLQorCQkJICogd2UgZXhwZWN0IDFzdCBBQ0sgZnJvbSBwZWVyIHRvIGJlIGZvciAoYmxvY2tfbnItMSksCisJCQkgKiB0aGF0IGlzLCBmb3IgImJsb2NrIDAiIHdoaWNoIGlzIG91ciBPQUNLIHBrdCAqLworCQkJb3Bjb2RlID0gVEZUUF9PQUNLOworCQkJZ290byBhZGRfYmxrc2l6ZV9vcHQ7CisJCX0KKyNlbmRpZgorCQlpZiAoQ01EX0dFVChvcHRpb25fbWFzazMyKSkgeworCQkJLyogSXQncyB1cGxvYWQgYW5kIHdlIGRvbid0IHNlbmQgT0FDSy4KKwkJCSAqIFdlIG11c3QgQUNLIDFzdCBwYWNrZXQgKHdpdGggZmlsZW5hbWUpCisJCQkgKiBhcyBpZiBpdCBpcyAiYmxvY2sgMCIgKi8KKwkJCWJsb2NrX25yID0gMDsKKwkJfQorCX0gZWxzZSB7IC8qIHRmdHAgKi8KKwkJLyogT3BlbiBmaWxlIChtdXN0IGJlIGFmdGVyIGNoYW5naW5nIHVzZXIpICovCisJCWxvY2FsX2ZkID0gQ01EX0dFVChvcHRpb25fbWFzazMyKSA/IFNURE9VVF9GSUxFTk8gOiBTVERJTl9GSUxFTk87CisJCWlmIChOT1RfTE9ORV9EQVNIKGxvY2FsX2ZpbGUpKQorCQkJbG9jYWxfZmQgPSB4b3Blbihsb2NhbF9maWxlLCBvcGVuX21vZGUpOworLyogUmVtb3ZpbmcgI2lmLCBvciB1c2luZyBpZigpIHN0YXRlbWVudCBpbnN0ZWFkIG9mICNpZiBtYXkgbGVhZCB0bworICogIndhcm5pbmc6IG51bGwgYXJndW1lbnQgd2hlcmUgbm9uLW51bGwgcmVxdWlyZWQiOiAqLworI2lmIEVOQUJMRV9URlRQCisJCS8qIHRmdHAgKi8KKworCQkvKiBXZSBjYW4ndCAoYW5kIGRvbid0IHJlYWxseSBuZWVkIHRvKSBiaW5kIHRoZSBzb2NrZXQ6CisJCSAqIHdlIGRvbid0IGtub3cgZnJvbSB3aGljaCBsb2NhbCBJUCBkYXRhZ3JhbXMgd2lsbCBiZSBzZW50LAorCQkgKiBidXQga2VybmVsIHdpbGwgcGljayB0aGUgc2FtZSBJUCBldmVyeSB0aW1lICh1bmxlc3Mgcm91dGluZworCQkgKiB0YWJsZSBpcyBjaGFuZ2VkKSwgdGh1cyBwZWVyIHdpbGwgc2VlIGRncmFtcyBjb25zaXN0ZW50bHkKKwkJICogY29taW5nIGZyb20gdGhlIHNhbWUgSVAuCisJCSAqIFdlIHdvdWxkIGxpa2UgdG8gY29ubmVjdCB0aGUgc29ja2V0LCBidXQgc2luY2UgcGVlcidzCisJCSAqIFVEUCBjb2RlIGNhbiBiZSBsZXNzIHBlcmZlY3QgdGhhbiBvdXJzLCBfcGVlcidzXyBJUDpwb3J0CisJCSAqIGluIHJlcGxpZXMgbWF5IGRpZmZlciBmcm9tIElQOnBvcnQgd2UgdXNlZCB0byBzZW5kCisJCSAqIG91ciBmaXJzdCBwYWNrZXQuIFdlIGNhbiBjb25uZWN0KCkgb25seSB3aGVuIHdlIGdldAorCQkgKiBmaXJzdCByZXBseS4gKi8KKworCQkvKiBidWlsZCBvcGNvZGUgKi8KKwkJb3Bjb2RlID0gVEZUUF9XUlE7CisJCWlmIChDTURfR0VUKG9wdGlvbl9tYXNrMzIpKSB7CisJCQlvcGNvZGUgPSBURlRQX1JSUTsKKwkJfQorCQkvKiBhZGQgZmlsZW5hbWUgYW5kIG1vZGUgKi8KKwkJLyogZmlsbCBpbiBwYWNrZXQgaWYgdGhlIGZpbGVuYW1lIGZpdHMgaW50byB4YnVmICovCisJCWxlbiA9IHN0cmxlbihyZW1vdGVfZmlsZSkgKyAxOworCQlpZiAoMiArIGxlbiArIHNpemVvZigib2N0ZXQiKSA+PSBpb19idWZzaXplKSB7CisJCQliYl9lcnJvcl9tc2coInJlbW90ZSBmaWxlbmFtZSBpcyB0b28gbG9uZyIpOworCQkJZ290byByZXQ7CisJCX0KKwkJc3RyY3B5KGNwLCByZW1vdGVfZmlsZSk7CisJCWNwICs9IGxlbjsKKwkJLyogYWRkICJtb2RlIiBwYXJ0IG9mIHRoZSBwYWNrZXQgKi8KKwkJc3RyY3B5KGNwLCAib2N0ZXQiKTsKKwkJY3AgKz0gc2l6ZW9mKCJvY3RldCIpOworCisjIGlmIEVOQUJMRV9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFCisJCWlmIChibGtzaXplID09IFRGVFBfQkxLU0laRV9ERUZBVUxUICYmICF3YW50X3RyYW5zZmVyX3NpemUpCisJCQlnb3RvIHNlbmRfcGt0OworCisJCS8qIE5lZWQgdG8gYWRkIG9wdGlvbiB0byBwa3QgKi8KKwkJaWYgKCgmeGJ1Zltpb19idWZzaXplIC0gMV0gLSBjcCkgPCBzaXplb2YoImJsa3NpemUgTk5OTk4gdHNpemUgIikgKyBzaXplb2Yob2ZmX3QpKjMpIHsKKwkJCWJiX2Vycm9yX21zZygicmVtb3RlIGZpbGVuYW1lIGlzIHRvbyBsb25nIik7CisJCQlnb3RvIHJldDsKKwkJfQorCQlleHBlY3RfT0FDSyA9IDE7CisjIGVuZGlmCisjZW5kaWYgLyogRU5BQkxFX1RGVFAgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFCisgYWRkX2Jsa3NpemVfb3B0OgorCQlpZiAoYmxrc2l6ZSAhPSBURlRQX0JMS1NJWkVfREVGQVVMVCkgeworCQkJLyogYWRkICJibGtzaXplIiwgPG51bD4sIGJsa3NpemUsIDxudWw+ICovCisJCQlzdHJjcHkoY3AsICJibGtzaXplIik7CisJCQljcCArPSBzaXplb2YoImJsa3NpemUiKTsKKwkJCWNwICs9IHNucHJpbnRmKGNwLCA2LCAiJWQiLCBibGtzaXplKSArIDE7CisJCX0KKwkJaWYgKHdhbnRfdHJhbnNmZXJfc2l6ZSkgeworCQkJLyogYWRkICJ0c2l6ZSIsIDxudWw+LCBzaXplLCA8bnVsPiAoc2VlIFJGQzIzNDkpICovCisJCQkvKiBpZiB0ZnRwIGFuZCBkb3dubG9hZGluZywgd2Ugc2VuZCAiMCIgKHNpbmNlIHdlIG9wZW5lZCBsb2NhbF9mZCB3aXRoIE9fVFJVTkMpCisJCQkgKiBhbmQgdGhpcyBtYWtlcyBzZXJ2ZXIgdG8gc2VuZCAidHNpemUiIG9wdGlvbiB3aXRoIHRoZSBzaXplICovCisJCQkvKiBpZiB0ZnRwIGFuZCB1cGxvYWRpbmcsIHdlIHNlbmQgZmlsZSBzaXplIChtYXliZSBkb250LCB0byBub3QgY29uZnVzZSBvbGQgc2VydmVycz8/PykgKi8KKwkJCS8qIGlmIHRmdHBkIGFuZCBkb3dubG9hZGluZywgd2UgYXJlIGFuc3dlcmluZyB0byBjbGllbnQncyByZXF1ZXN0ICovCisJCQkvKiBpZiB0ZnRwZCBhbmQgdXBsb2FkaW5nOiAhd2FudF90cmFuc2Zlcl9zaXplLCB0aGlzIGNvZGUgaXMgbm90IGV4ZWN1dGVkICovCisJCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJCXN0cmNweShjcCwgInRzaXplIik7CisJCQljcCArPSBzaXplb2YoInRzaXplIik7CisJCQlzdC5zdF9zaXplID0gMDsKKwkJCWZzdGF0KGxvY2FsX2ZkLCAmc3QpOworCQkJY3AgKz0gc3ByaW50ZihjcCwgIiUiT0ZGX0ZNVCJ1IiwgKG9mZl90KXN0LnN0X3NpemUpICsgMTsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVEZUUF9QUk9HUkVTU19CQVIKKwkJCS8qIFNhdmUgZm9yIHByb2dyZXNzIGJhci4gSWYgMCAodGZ0cCBkb3dubG9hZGluZyksCisJCQkgKiB3ZSBsb29rIGF0IHNlcnZlcidzIHJlcGx5IGxhdGVyICovCisJCQlHLnNpemUgPSBzdC5zdF9zaXplOworCQkJaWYgKHJlbW90ZV9maWxlICYmIHN0LnN0X3NpemUpCisJCQkJdGZ0cF9wcm9ncmVzc19pbml0KCk7CisjIGVuZGlmCisJCX0KKyNlbmRpZgorCQkvKiBGaXJzdCBwYWNrZXQgaXMgYnVpbHQsIHNvIHNraXAgcGFja2V0IGdlbmVyYXRpb24gKi8KKwkJZ290byBzZW5kX3BrdDsKKwl9CisKKwkvKiBVc2luZyBtb3N0bHkgZ290bydzIC0gY29udGludWUvYnJlYWsgd2lsbCBiZSBsZXNzIGNsZWFyCisJICogaW4gd2hlcmUgd2UgYWN0dWFsbHkganVtcCB0byAqLworCXdoaWxlICgxKSB7CisJCS8qIEJ1aWxkIEFDSyBvciBEQVRBICovCisJCWNwID0geGJ1ZiArIDI7CisJCSooKHVpbnQxNl90KiljcCkgPSBodG9ucyhibG9ja19ucik7CisJCWNwICs9IDI7CisJCWJsb2NrX25yKys7CisJCW9wY29kZSA9IFRGVFBfQUNLOworCQlpZiAoQ01EX1BVVChvcHRpb25fbWFzazMyKSkgeworCQkJb3Bjb2RlID0gVEZUUF9EQVRBOworCQkJbGVuID0gZnVsbF9yZWFkKGxvY2FsX2ZkLCBjcCwgYmxrc2l6ZSk7CisJCQlpZiAobGVuIDwgMCkgeworCQkJCWdvdG8gc2VuZF9yZWFkX2Vycl9wa3Q7CisJCQl9CisJCQlpZiAobGVuICE9IGJsa3NpemUpIHsKKwkJCQlmaW5pc2hlZCA9IDE7CisJCQl9CisJCQljcCArPSBsZW47CisJCQlJRl9GRUFUVVJFX1RGVFBfUFJPR1JFU1NfQkFSKEcucG9zICs9IGxlbjspCisJCX0KKyBzZW5kX3BrdDoKKwkJLyogU2VuZCBwYWNrZXQgKi8KKwkJKigodWludDE2X3QqKXhidWYpID0gaHRvbnMob3Bjb2RlKTsgLyogZmlsbCBpbiBvcGNvZGUgcGFydCAqLworCQlzZW5kX2xlbiA9IGNwIC0geGJ1ZjsKKwkJLyogTkI6IHNlbmRfbGVuIHZhbHVlIGlzIHByZXNlcnZlZCBpbiBjb2RlIGJlbG93CisJCSAqIGZvciBwb3RlbnRpYWwgcmVzZW5kICovCisKKwkJcmV0cmllcyA9IFRGVFBfTlVNX1JFVFJJRVM7ICAvKiByZS1pbml0aWFsaXplICovCisJCXdhaXR0aW1lX21zID0gVEZUUF9USU1FT1VUX01TOworCisgc2VuZF9hZ2FpbjoKKyNpZiBFTkFCTEVfVEZUUF9ERUJVRworCQlmcHJpbnRmKHN0ZGVyciwgInNlbmRpbmcgJXUgYnl0ZXNcbiIsIHNlbmRfbGVuKTsKKwkJZm9yIChjcCA9IHhidWY7IGNwIDwgJnhidWZbc2VuZF9sZW5dOyBjcCsrKQorCQkJZnByaW50ZihzdGRlcnIsICIlMDJ4ICIsICh1bnNpZ25lZCBjaGFyKSAqY3ApOworCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisjZW5kaWYKKwkJeHNlbmR0byhzb2NrZXRfZmQsIHhidWYsIHNlbmRfbGVuLCAmcGVlcl9sc2EtPnUuc2EsIHBlZXJfbHNhLT5sZW4pOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVEZUUF9QUk9HUkVTU19CQVIKKwkJaWYgKGlzX2JiX3Byb2dyZXNzX2luaXRlZCgmRy5wbXQpKQorCQkJdGZ0cF9wcm9ncmVzc191cGRhdGUoKTsKKyNlbmRpZgorCQkvKiBXYXMgaXQgZmluYWwgQUNLPyB0aGVuIGV4aXQgKi8KKwkJaWYgKGZpbmlzaGVkICYmIChvcGNvZGUgPT0gVEZUUF9BQ0spKQorCQkJZ290byByZXQ7CisKKyByZWN2X2FnYWluOgorCQkvKiBSZWNlaXZlIHBhY2tldCAqLworCQkvKnBmZFswXS5mZCA9IHNvY2tldF9mZDsqLworCQlwZmRbMF0uZXZlbnRzID0gUE9MTElOOworCQlzd2l0Y2ggKHNhZmVfcG9sbChwZmQsIDEsIHdhaXR0aW1lX21zKSkgeworCQlkZWZhdWx0OgorCQkJLypiYl9wZXJyb3JfbXNnKCJwb2xsIik7IC0gZG9uZSBpbiBzYWZlX3BvbGwgKi8KKwkJCWdvdG8gcmV0OworCQljYXNlIDA6CisJCQlyZXRyaWVzLS07CisJCQlpZiAocmV0cmllcyA9PSAwKSB7CisJCQkJdGZ0cF9wcm9ncmVzc19kb25lKCk7CisJCQkJYmJfZXJyb3JfbXNnKCJ0aW1lb3V0Iik7CisJCQkJZ290byByZXQ7IC8qIG5vIGVyciBwYWNrZXQgc2VudCAqLworCQkJfQorCisJCQkvKiBleHBvbmVudGlhbCBiYWNrb2ZmIHdpdGggbGltaXQgKi8KKwkJCXdhaXR0aW1lX21zICs9IHdhaXR0aW1lX21zLzI7CisJCQlpZiAod2FpdHRpbWVfbXMgPiBURlRQX01BWFRJTUVPVVRfTVMpIHsKKwkJCQl3YWl0dGltZV9tcyA9IFRGVFBfTUFYVElNRU9VVF9NUzsKKwkJCX0KKworCQkJZ290byBzZW5kX2FnYWluOyAvKiByZXNlbmQgbGFzdCBzZW50IHBrdCAqLworCQljYXNlIDE6CisJCQlpZiAoIW91cl9sc2EpIHsKKwkJCQkvKiB0ZnRwIChub3QgdGZ0cGQhKSByZWNlaXZpbmcgMXN0IHBhY2tldCAqLworCQkJCW91cl9sc2EgPSAoKHZvaWQqKShwdHJkaWZmX3QpLTEpOyAvKiBub3QgTlVMTCAqLworCQkJCWxlbiA9IHJlY3Zmcm9tKHNvY2tldF9mZCwgcmJ1ZiwgaW9fYnVmc2l6ZSwgMCwKKwkJCQkJCSZwZWVyX2xzYS0+dS5zYSwgJnBlZXJfbHNhLT5sZW4pOworCQkJCS8qIE91ciBmaXJzdCBkZ3JhbSB3ZW50IHRvIHBvcnQgNjkKKwkJCQkgKiBidXQgcmVwbHkgbWF5IGNvbWUgZnJvbSBkaWZmZXJlbnQgb25lLgorCQkJCSAqIFJlbWVtYmVyIGFuZCB1c2UgdGhpcyBuZXcgcG9ydCAoYW5kIElQKSAqLworCQkJCWlmIChsZW4gPj0gMCkKKwkJCQkJeGNvbm5lY3Qoc29ja2V0X2ZkLCAmcGVlcl9sc2EtPnUuc2EsIHBlZXJfbHNhLT5sZW4pOworCQkJfSBlbHNlIHsKKwkJCQkvKiB0ZnRwZCwgb3Igbm90IHRoZSB2ZXJ5IGZpcnN0IHBhY2tldDoKKwkJCQkgKiBzb2NrZXQgaXMgY29ubmVjdCgpZWQsIGNhbiBqdXN0IHJlYWQgZnJvbSBpdC4gKi8KKwkJCQkvKiBEb24ndCBmdWxsX3JlYWQoKSEKKwkJCQkgKiBUaGlzIGlzIG5vdCBUQ1AsIG9uZSByZWFkID09IG9uZSBwa3QhICovCisJCQkJbGVuID0gc2FmZV9yZWFkKHNvY2tldF9mZCwgcmJ1ZiwgaW9fYnVmc2l6ZSk7CisJCQl9CisJCQlpZiAobGVuIDwgMCkgeworCQkJCWdvdG8gc2VuZF9yZWFkX2Vycl9wa3Q7CisJCQl9CisJCQlpZiAobGVuIDwgNCkgeyAvKiB0b28gc21hbGw/ICovCisJCQkJZ290byByZWN2X2FnYWluOworCQkJfQorCQl9CisKKwkJLyogUHJvY2VzcyByZWN2J2VkIHBhY2tldCAqLworCQlvcGNvZGUgPSBudG9ocyggKCh1aW50MTZfdCopcmJ1ZilbMF0gKTsKKwkJcmVjdl9ibGsgPSBudG9ocyggKCh1aW50MTZfdCopcmJ1ZilbMV0gKTsKKyNpZiBFTkFCTEVfVEZUUF9ERUJVRworCQlmcHJpbnRmKHN0ZGVyciwgInJlY2VpdmVkICVkIGJ5dGVzOiAlMDR4ICUwNHhcbiIsIGxlbiwgb3Bjb2RlLCByZWN2X2Jsayk7CisjZW5kaWYKKwkJaWYgKG9wY29kZSA9PSBURlRQX0VSUk9SKSB7CisJCQlzdGF0aWMgY29uc3QgY2hhciBlcnJjb2RlX3N0cltdIEFMSUdOMSA9CisJCQkJIlwwIgorCQkJCSJmaWxlIG5vdCBmb3VuZFwwIgorCQkJCSJhY2Nlc3MgdmlvbGF0aW9uXDAiCisJCQkJImRpc2sgZnVsbFwwIgorCQkJCSJiYWQgb3BlcmF0aW9uXDAiCisJCQkJInVua25vd24gdHJhbnNmZXIgaWRcMCIKKwkJCQkiZmlsZSBhbHJlYWR5IGV4aXN0c1wwIgorCQkJCSJubyBzdWNoIHVzZXJcMCIKKwkJCQkiYmFkIG9wdGlvbiI7CisKKwkJCWNvbnN0IGNoYXIgKm1zZyA9ICIiOworCisJCQlpZiAobGVuID4gNCAmJiByYnVmWzRdICE9ICdcMCcpIHsKKwkJCQltc2cgPSAmcmJ1Zls0XTsKKwkJCQlyYnVmW2lvX2J1ZnNpemUgLSAxXSA9ICdcMCc7IC8qIHBhcmFub2lhICovCisJCQl9IGVsc2UgaWYgKHJlY3ZfYmxrIDw9IDgpIHsKKwkJCQltc2cgPSBudGhfc3RyaW5nKGVycmNvZGVfc3RyLCByZWN2X2Jsayk7CisJCQl9CisJCQliYl9lcnJvcl9tc2coInNlcnZlciBlcnJvcjogKCV1KSAlcyIsIHJlY3ZfYmxrLCBtc2cpOworCQkJZ290byByZXQ7CisJCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFCisJCWlmIChleHBlY3RfT0FDSykgeworCQkJZXhwZWN0X09BQ0sgPSAwOworCQkJaWYgKG9wY29kZSA9PSBURlRQX09BQ0spIHsKKwkJCQkvKiBzZXJ2ZXIgc2VlbXMgdG8gc3VwcG9ydCBvcHRpb25zICovCisJCQkJY2hhciAqcmVzOworCisJCQkJcmVzID0gdGZ0cF9nZXRfb3B0aW9uKCJibGtzaXplIiwgJnJidWZbMl0sIGxlbiAtIDIpOworCQkJCWlmIChyZXMpIHsKKwkJCQkJYmxrc2l6ZSA9IHRmdHBfYmxrc2l6ZV9jaGVjayhyZXMsIGJsa3NpemUpOworCQkJCQlpZiAoYmxrc2l6ZSA8IDApIHsKKwkJCQkJCUdfZXJyb3JfcGt0X3JlYXNvbiA9IEVSUl9CQURfT1BUOworCQkJCQkJZ290byBzZW5kX2Vycl9wa3Q7CisJCQkJCX0KKwkJCQkJaW9fYnVmc2l6ZSA9IGJsa3NpemUgKyA0OworCQkJCX0KKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVEZUUF9QUk9HUkVTU19CQVIKKwkJCQlpZiAocmVtb3RlX2ZpbGUgJiYgRy5zaXplID09IDApIHsgLyogaWYgd2UgZG9uJ3Qga25vdyBpdCB5ZXQgKi8KKwkJCQkJcmVzID0gdGZ0cF9nZXRfb3B0aW9uKCJ0c2l6ZSIsICZyYnVmWzJdLCBsZW4gLSAyKTsKKwkJCQkJaWYgKHJlcykgeworCQkJCQkJRy5zaXplID0gYmJfc3RydG91bGwocmVzLCBOVUxMLCAxMCk7CisJCQkJCQlpZiAoRy5zaXplKQorCQkJCQkJCXRmdHBfcHJvZ3Jlc3NfaW5pdCgpOworCQkJCQl9CisJCQkJfQorIyBlbmRpZgorCQkJCWlmIChDTURfR0VUKG9wdGlvbl9tYXNrMzIpKSB7CisJCQkJCS8qIFdlJ2xsIHNlbmQgQUNLIGZvciBPQUNLLAorCQkJCQkgKiBzdWNoIEFDSyBoYXMgImJsb2NrIG5vIiBvZiAwICovCisJCQkJCWJsb2NrX25yID0gMDsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiByZmMyMzQ3OgorCQkJICogIkFuIG9wdGlvbiBub3QgYWNrbm93bGVkZ2VkIGJ5IHRoZSBzZXJ2ZXIKKwkJCSAqIG11c3QgYmUgaWdub3JlZCBieSB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIKKwkJCSAqIGFzIGlmIGl0IHdlcmUgbmV2ZXIgcmVxdWVzdGVkLiIgKi8KKwkJCWlmIChibGtzaXplICE9IFRGVFBfQkxLU0laRV9ERUZBVUxUKQorCQkJCWJiX2Vycm9yX21zZygiZmFsbGluZyBiYWNrIHRvIGJsb2Nrc2l6ZSAiVEZUUF9CTEtTSVpFX0RFRkFVTFRfU1RSKTsKKwkJCWJsa3NpemUgPSBURlRQX0JMS1NJWkVfREVGQVVMVDsKKwkJCWlvX2J1ZnNpemUgPSBURlRQX0JMS1NJWkVfREVGQVVMVCArIDQ7CisJCX0KKyNlbmRpZgorCQkvKiBibG9ja19uciBpcyBhbHJlYWR5IGFkdmFuY2VkIHRvIG5leHQgYmxvY2sjIHdlIGV4cGVjdAorCQkgKiB0byBnZXQgLyBibG9jayMgd2UgYXJlIGFib3V0IHRvIHNlbmQgbmV4dCB0aW1lICovCisKKwkJaWYgKENNRF9HRVQob3B0aW9uX21hc2szMikgJiYgKG9wY29kZSA9PSBURlRQX0RBVEEpKSB7CisJCQlpZiAocmVjdl9ibGsgPT0gYmxvY2tfbnIpIHsKKwkJCQlpbnQgc3ogPSBmdWxsX3dyaXRlKGxvY2FsX2ZkLCAmcmJ1Zls0XSwgbGVuIC0gNCk7CisJCQkJaWYgKHN6ICE9IGxlbiAtIDQpIHsKKwkJCQkJc3RyY3B5KEdfZXJyb3JfcGt0X3N0ciwgYmJfbXNnX3dyaXRlX2Vycm9yKTsKKwkJCQkJR19lcnJvcl9wa3RfcmVhc29uID0gRVJSX1dSSVRFOworCQkJCQlnb3RvIHNlbmRfZXJyX3BrdDsKKwkJCQl9CisJCQkJaWYgKHN6ICE9IGJsa3NpemUpIHsKKwkJCQkJZmluaXNoZWQgPSAxOworCQkJCX0KKwkJCQlJRl9GRUFUVVJFX1RGVFBfUFJPR1JFU1NfQkFSKEcucG9zICs9IHN6OykKKwkJCQljb250aW51ZTsgLyogc2VuZCBBQ0sgKi8KKwkJCX0KKy8qIERpc2FibGVkIHRvIGNvcGUgd2l0aCBzZXJ2ZXJzIHdpdGggU29yY2VyZXIncyBBcHByZW50aWNlIFN5bmRyb21lICovCisjaWYgMAorCQkJaWYgKHJlY3ZfYmxrID09IChibG9ja19uciAtIDEpKSB7CisJCQkJLyogU2VydmVyIGxvc3Qgb3VyIFRGVFBfQUNLLiAgUmVzZW5kIGl0ICovCisJCQkJYmxvY2tfbnIgPSByZWN2X2JsazsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZgorCQl9CisKKwkJaWYgKENNRF9QVVQob3B0aW9uX21hc2szMikgJiYgKG9wY29kZSA9PSBURlRQX0FDSykpIHsKKwkJCS8qIGRpZCBwZWVyIEFDSyBvdXIgbGFzdCBEQVRBIHBrdD8gKi8KKwkJCWlmIChyZWN2X2JsayA9PSAodWludDE2X3QpIChibG9ja19uciAtIDEpKSB7CisJCQkJaWYgKGZpbmlzaGVkKQorCQkJCQlnb3RvIHJldDsKKwkJCQljb250aW51ZTsgLyogc2VuZCBuZXh0IGJsb2NrICovCisJCQl9CisJCX0KKwkJLyogQXd3dy4uLiByZWN2J2QgcGFja2V0IGlzIG5vdCByZWNvZ25pemVkISAqLworCQlnb3RvIHJlY3ZfYWdhaW47CisJCS8qIHdoeSByZWN2X2FnYWluPyAtIHJmYzExMjMgc2F5czoKKwkJICogIlRoZSBzZW5kZXIgKGkuZS4sIHRoZSBzaWRlIG9yaWdpbmF0aW5nIHRoZSBEQVRBIHBhY2tldHMpCisJCSAqICBtdXN0IG5ldmVyIHJlc2VuZCB0aGUgY3VycmVudCBEQVRBIHBhY2tldCBvbiByZWNlaXB0CisJCSAqICBvZiBhIGR1cGxpY2F0ZSBBQ0siLgorCQkgKiBEQVRBIHBrdHMgYXJlIHJlc2VudCBPTkxZIG9uIHRpbWVvdXQuCisJCSAqIFRodXMgImdvdG8gc2VuZF9hZ2FpbiIgd2lsbCBiYSBhIGJhZCBtaXN0YWtlIGFib3ZlLgorCQkgKiBTZWU6CisJCSAqIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU29yY2VyZXInc19BcHByZW50aWNlX1N5bmRyb21lCisJCSAqLworCX0gLyogZW5kIG9mICJ3aGlsZSAoMSkiICovCisgcmV0OgorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQljbG9zZShsb2NhbF9mZCk7CisJCWNsb3NlKHNvY2tldF9mZCk7CisJCWZyZWUoeGJ1Zik7CisJCWZyZWUocmJ1Zik7CisJfQorCXJldHVybiBmaW5pc2hlZCA9PSAwOyAvKiByZXR1cm5zIDEgb24gZmFpbHVyZSAqLworCisgc2VuZF9yZWFkX2Vycl9wa3Q6CisJc3RyY3B5KEdfZXJyb3JfcGt0X3N0ciwgYmJfbXNnX3JlYWRfZXJyb3IpOworIHNlbmRfZXJyX3BrdDoKKwlpZiAoR19lcnJvcl9wa3Rfc3RyWzBdKQorCQliYl9lcnJvcl9tc2coIiVzIiwgR19lcnJvcl9wa3Rfc3RyKTsKKwlHLmVycm9yX3BrdFsxXSA9IFRGVFBfRVJST1I7CisJeHNlbmR0byhzb2NrZXRfZmQsIEcuZXJyb3JfcGt0LCA0ICsgMSArIHN0cmxlbihHX2Vycm9yX3BrdF9zdHIpLAorCQkJJnBlZXJfbHNhLT51LnNhLCBwZWVyX2xzYS0+bGVuKTsKKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworI3VuZGVmIHJlbW90ZV9maWxlCit9CisKKyNpZiBFTkFCTEVfVEZUUAorCitpbnQgdGZ0cF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdGZ0cF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJbGVuX2FuZF9zb2NrYWRkciAqcGVlcl9sc2E7CisJY29uc3QgY2hhciAqbG9jYWxfZmlsZSA9IE5VTEw7CisJY29uc3QgY2hhciAqcmVtb3RlX2ZpbGUgPSBOVUxMOworIyBpZiBFTkFCTEVfRkVBVFVSRV9URlRQX0JMT0NLU0laRQorCWNvbnN0IGNoYXIgKmJsa3NpemVfc3RyID0gVEZUUF9CTEtTSVpFX0RFRkFVTFRfU1RSOworCWludCBibGtzaXplOworIyBlbmRpZgorCWludCByZXN1bHQ7CisJaW50IHBvcnQ7CisJSUZfR0VUUFVUKGludCBvcHQ7KQorCisJSU5JVF9HKCk7CisKKwkvKiAtcCBvciAtZyBpcyBtYW5kYXRvcnksIGFuZCB0aGV5IGFyZSBtdXR1YWxseSBleGNsdXNpdmUgKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICIiIElGX0ZFQVRVUkVfVEZUUF9HRVQoImc6IikgSUZfRkVBVFVSRV9URlRQX1BVVCgicDoiKQorCQkJSUZfR0VUUFVUKCJnLS1wOnAtLWc6Iik7CisKKwlJRl9HRVRQVVQob3B0ID0pIGdldG9wdDMyKGFyZ3YsCisJCQlJRl9GRUFUVVJFX1RGVFBfR0VUKCJnIikgSUZfRkVBVFVSRV9URlRQX1BVVCgicCIpCisJCQkJImw6cjoiIElGX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUoImI6IiksCisJCQkmbG9jYWxfZmlsZSwgJnJlbW90ZV9maWxlCisJCQlJRl9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFKCwgJmJsa3NpemVfc3RyKSk7CisJYXJndiArPSBvcHRpbmQ7CisKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUKKwkvKiBDaGVjayBpZiB0aGUgYmxrc2l6ZSBpcyB2YWxpZDoKKwkgKiBSRkMyMzQ4IHNheXMgYmV0d2VlbiA4IGFuZCA2NTQ2NCAqLworCWJsa3NpemUgPSB0ZnRwX2Jsa3NpemVfY2hlY2soYmxrc2l6ZV9zdHIsIDY1NTY0KTsKKwlpZiAoYmxrc2l6ZSA8IDApIHsKKwkJLy9iYl9lcnJvcl9tc2coImJhZCBibG9jayBzaXplIik7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorIyBlbmRpZgorCisJaWYgKHJlbW90ZV9maWxlKSB7CisJCWlmICghbG9jYWxfZmlsZSkgeworCQkJY29uc3QgY2hhciAqc2xhc2ggPSBzdHJyY2hyKHJlbW90ZV9maWxlLCAnLycpOworCQkJbG9jYWxfZmlsZSA9IHNsYXNoID8gc2xhc2ggKyAxIDogcmVtb3RlX2ZpbGU7CisJCX0KKwl9IGVsc2UgeworCQlyZW1vdGVfZmlsZSA9IGxvY2FsX2ZpbGU7CisJfQorCisJLyogRXJyb3IgaWYgZmlsZW5hbWUgb3IgaG9zdCBpcyBub3Qga25vd24gKi8KKwlpZiAoIXJlbW90ZV9maWxlIHx8ICFhcmd2WzBdKQorCQliYl9zaG93X3VzYWdlKCk7CisKKwlwb3J0ID0gYmJfbG9va3VwX3BvcnQoYXJndlsxXSwgInVkcCIsIDY5KTsKKwlwZWVyX2xzYSA9IHhob3N0MnNvY2thZGRyKGFyZ3ZbMF0sIHBvcnQpOworCisjIGlmIEVOQUJMRV9URlRQX0RFQlVHCisJZnByaW50ZihzdGRlcnIsICJ1c2luZyBzZXJ2ZXIgJyVzJywgcmVtb3RlX2ZpbGUgJyVzJywgbG9jYWxfZmlsZSAnJXMnXG4iLAorCQkJeG1hbGxvY19zb2NrYWRkcjJkb3R0ZWQoJnBlZXJfbHNhLT51LnNhKSwKKwkJCXJlbW90ZV9maWxlLCBsb2NhbF9maWxlKTsKKyMgZW5kaWYKKworIyBpZiBFTkFCTEVfRkVBVFVSRV9URlRQX1BST0dSRVNTX0JBUgorCUcuZmlsZSA9IHJlbW90ZV9maWxlOworIyBlbmRpZgorCXJlc3VsdCA9IHRmdHBfcHJvdG9jb2woCisJCU5VTEwgLypvdXJfbHNhKi8sIHBlZXJfbHNhLAorCQlsb2NhbF9maWxlLCByZW1vdGVfZmlsZQorCQlJRl9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFKCwgMSAvKiB3YW50X3RyYW5zZmVyX3NpemUgKi8pCisJCUlGX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUoLCBibGtzaXplKQorCSk7CisJdGZ0cF9wcm9ncmVzc19kb25lKCk7CisKKwlpZiAocmVzdWx0ICE9IEVYSVRfU1VDQ0VTUyAmJiBOT1RfTE9ORV9EQVNIKGxvY2FsX2ZpbGUpICYmIENNRF9HRVQob3B0KSkgeworCQl1bmxpbmsobG9jYWxfZmlsZSk7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKyNlbmRpZiAvKiBFTkFCTEVfVEZUUCAqLworCisjaWYgRU5BQkxFX1RGVFBECitpbnQgdGZ0cGRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHRmdHBkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlsZW5fYW5kX3NvY2thZGRyICpvdXJfbHNhOworCWxlbl9hbmRfc29ja2FkZHIgKnBlZXJfbHNhOworCWNoYXIgKmxvY2FsX2ZpbGUsICptb2RlLCAqdXNlcl9vcHQ7CisJY29uc3QgY2hhciAqZXJyb3JfbXNnOworCWludCBvcHQsIHJlc3VsdCwgb3Bjb2RlOworCUlGX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUoaW50IGJsa3NpemUgPSBURlRQX0JMS1NJWkVfREVGQVVMVDspCisJSUZfRkVBVFVSRV9URlRQX0JMT0NLU0laRShpbnQgd2FudF90cmFuc2Zlcl9zaXplID0gMDspCisKKwlJTklUX0coKTsKKworCW91cl9sc2EgPSBnZXRfc29ja19sc2EoU1RESU5fRklMRU5PKTsKKwlpZiAoIW91cl9sc2EpIHsKKwkJLyogVGhpcyBpcyBjb25mdXNpbmc6CisJCSAqYmJfZXJyb3JfbXNnX2FuZF9kaWUoInN0ZGluIGlzIG5vdCBhIHNvY2tldCIpOworCQkgKiBCZXR0ZXI6ICovCisJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJLyogSGVscCB0ZXh0IHNheXMgdGhhdCB0ZnRwZCBtdXN0IGJlIHVzZWQgYXMgaW5ldGQgc2VydmljZSwKKwkJICogd2hpY2ggaXMgYnkgZmFyIHRoZSBtb3N0IHVzdWFsIGNhdXNlIG9mIGdldF9zb2NrX2xzYQorCQkgKiBmYWlsdXJlICovCisJfQorCXBlZXJfbHNhID0geHphbGxvYyhMU0FfTEVOX1NJWkUgKyBvdXJfbHNhLT5sZW4pOworCXBlZXJfbHNhLT5sZW4gPSBvdXJfbHNhLT5sZW47CisKKwkvKiBTaGlmdGluZyB0byBub3QgY29sbGlkZSB3aXRoIFRGVFBfT1BUcyAqLworCW9wdCA9IG9wdGlvbl9tYXNrMzIgPSBURlRQRF9PUFQgfCAoZ2V0b3B0MzIoYXJndiwgInJjdTpsIiwgJnVzZXJfb3B0KSA8PCA4KTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZiAob3B0ICYgVEZUUERfT1BUX2wpIHsKKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgTE9HX1BJRCwgTE9HX0RBRU1PTik7CisJCWxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsKKwl9CisJaWYgKG9wdCAmIFRGVFBEX09QVF91KSB7CisJCS8qIE11c3QgYmUgYmVmb3JlIHhjaHJvb3QgKi8KKwkJRy5wdyA9IHhnZXRwd25hbSh1c2VyX29wdCk7CisJfQorCWlmIChhcmd2WzBdKSB7CisJCXhjaHJvb3QoYXJndlswXSk7CisJfQorCisJcmVzdWx0ID0gcmVjdl9mcm9tX3RvKFNURElOX0ZJTEVOTywKKwkJCUcuYmxvY2tfYnVmLCBzaXplb2YoRy5ibG9ja19idWYpICsgMSwKKwkJCS8qIF5eXiBzaXplb2YrMSB0byByZWxpYWJseSBkZXRlY3Qgb3ZlcnNpemVkIGlucHV0ICovCisJCQkwIC8qIGZsYWdzICovLAorCQkJJnBlZXJfbHNhLT51LnNhLCAmb3VyX2xzYS0+dS5zYSwgb3VyX2xzYS0+bGVuKTsKKworCWVycm9yX21zZyA9ICJtYWxmb3JtZWQgcGFja2V0IjsKKwlvcGNvZGUgPSBudG9ocygqKHVpbnQxNl90KilHLmJsb2NrX2J1Zik7CisJaWYgKHJlc3VsdCA8IDQgfHwgcmVzdWx0ID4gc2l6ZW9mKEcuYmxvY2tfYnVmKQorCS8qfHwgRy5ibG9ja19idWZbcmVzdWx0LTFdICE9ICdcMCcgLSBidWcgY29tcGF0aWJpbGl0eSwgc2VlIGJlbG93ICovCisJIHx8IChJRl9GRUFUVVJFX1RGVFBfUFVUKG9wY29kZSAhPSBURlRQX1JSUSkgLyogbm90IGRvd25sb2FkICovCisJICAgICBJRl9HRVRQVVQoJiYpCisJICAgICBJRl9GRUFUVVJFX1RGVFBfR0VUKG9wY29kZSAhPSBURlRQX1dSUSkgLyogbm90IHVwbG9hZCAqLworCSAgICApCisJKSB7CisJCWdvdG8gZXJyOworCX0KKwkvKiBTb21lIEhQIFBBLVJJU0MgZmlybXdhcmUgYWx3YXlzIHNlbmRzIGZpeGVkIDUxNi1ieXRlIHJlcXVlc3RzLAorCSAqIHdpdGggdHJhaWxpbmcgZ2FyYmFnZS4KKwkgKiBTdXBwb3J0IHRoYXQgYnkgbm90IHJlcXVpcmluZyBOVUwgdG8gYmUgdGhlIGxhc3QgYnl0ZSAoc2VlIGFib3ZlKS4KKwkgKiBUbyBtYWtlIHN0clhZWigpIG9wcyBzYWZlLCBmb3JjZSBOVUwgdGVybWluYXRpb246CisJICovCisJRy5ibG9ja19idWZfdGFpbFswXSA9ICdcMCc7CisKKwlsb2NhbF9maWxlID0gRy5ibG9ja19idWYgKyAyOworCWlmIChsb2NhbF9maWxlWzBdID09ICcuJyB8fCBzdHJzdHIobG9jYWxfZmlsZSwgIi8uIikpIHsKKwkJZXJyb3JfbXNnID0gImRvdCBpbiBmaWxlIG5hbWUiOworCQlnb3RvIGVycjsKKwl9CisJbW9kZSA9IGxvY2FsX2ZpbGUgKyBzdHJsZW4obG9jYWxfZmlsZSkgKyAxOworCS8qIFJGQyAxMzUwIHNheXMgbW9kZSBzdHJpbmcgaXMgY2FzZSBpbmRlcGVuZGVudCAqLworCWlmIChtb2RlID49IEcuYmxvY2tfYnVmICsgcmVzdWx0IHx8IHN0cmNhc2VjbXAobW9kZSwgIm9jdGV0IikgIT0gMCkgeworCQlnb3RvIGVycjsKKwl9CisjIGlmIEVOQUJMRV9GRUFUVVJFX1RGVFBfQkxPQ0tTSVpFCisJeworCQljaGFyICpyZXM7CisJCWNoYXIgKm9wdF9zdHIgPSBtb2RlICsgc2l6ZW9mKCJvY3RldCIpOworCQlpbnQgb3B0X2xlbiA9IEcuYmxvY2tfYnVmICsgcmVzdWx0IC0gb3B0X3N0cjsKKwkJaWYgKG9wdF9sZW4gPiAwKSB7CisJCQlyZXMgPSB0ZnRwX2dldF9vcHRpb24oImJsa3NpemUiLCBvcHRfc3RyLCBvcHRfbGVuKTsKKwkJCWlmIChyZXMpIHsKKwkJCQlibGtzaXplID0gdGZ0cF9ibGtzaXplX2NoZWNrKHJlcywgNjU1NjQpOworCQkJCWlmIChibGtzaXplIDwgMCkgeworCQkJCQlHX2Vycm9yX3BrdF9yZWFzb24gPSBFUlJfQkFEX09QVDsKKwkJCQkJLyogd2lsbCBqdXN0IHNlbmQgZXJyb3IgcGt0ICovCisJCQkJCWdvdG8gZG9fcHJvdG87CisJCQkJfQorCQkJfQorCQkJaWYgKG9wY29kZSAhPSBURlRQX1dSUSAvKiBkb3dubG9hZD8gKi8KKwkJCS8qIGRpZCBjbGllbnQgYXNrIHVzIGFib3V0IGZpbGUgc2l6ZT8gKi8KKwkJCSAmJiB0ZnRwX2dldF9vcHRpb24oInRzaXplIiwgb3B0X3N0ciwgb3B0X2xlbikKKwkJCSkgeworCQkJCXdhbnRfdHJhbnNmZXJfc2l6ZSA9IDE7CisJCQl9CisJCX0KKwl9CisjIGVuZGlmCisKKwlpZiAoIUVOQUJMRV9GRUFUVVJFX1RGVFBfUFVUIHx8IG9wY29kZSA9PSBURlRQX1dSUSkgeworCQlpZiAob3B0ICYgVEZUUERfT1BUX3IpIHsKKwkJCS8qIFRoaXMgd291bGQgbWVhbiAiZGlzayBmdWxsIiAtIG5vdCB0cnVlICovCisJCQkvKkdfZXJyb3JfcGt0X3JlYXNvbiA9IEVSUl9XUklURTsqLworCQkJZXJyb3JfbXNnID0gYmJfbXNnX3dyaXRlX2Vycm9yOworCQkJZ290byBlcnI7CisJCX0KKwkJSUZfR0VUUFVUKG9wdGlvbl9tYXNrMzIgfD0gVEZUUF9PUFRfR0VUOykgLyogd2lsbCByZWNlaXZlIGZpbGUncyBkYXRhICovCisJfSBlbHNlIHsKKwkJSUZfR0VUUFVUKG9wdGlvbl9tYXNrMzIgfD0gVEZUUF9PUFRfUFVUOykgLyogd2lsbCBzZW5kIGZpbGUncyBkYXRhICovCisJfQorCisJLyogTkI6IGlmIEdfZXJyb3JfcGt0X3N0ciBvciBHX2Vycm9yX3BrdF9yZWFzb24gaXMgc2V0IHVwLAorCSAqIHRmdHBfcHJvdG9jb2woKSBqdXN0IHNlbmRzIG9uZSBlcnJvciBwa3QgYW5kIHJldHVybnMgKi8KKworIGRvX3Byb3RvOgorCWNsb3NlKFNURElOX0ZJTEVOTyk7IC8qIGNsb3NlIG9sZCwgcG9zc2libHkgd2lsZGNhcmQgc29ja2V0ICovCisJLyogdGZ0cF9wcm90b2NvbCgpIHdpbGwgY3JlYXRlIG5ldyBvbmUsIGJvdW5kIHRvIHBhcnRpY3VsYXIgbG9jYWwgSVAgKi8KKwlyZXN1bHQgPSB0ZnRwX3Byb3RvY29sKAorCQlvdXJfbHNhLCBwZWVyX2xzYSwKKwkJbG9jYWxfZmlsZSBJRl9URlRQKCwgTlVMTCAvKnJlbW90ZV9maWxlKi8pCisJCUlGX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUoLCB3YW50X3RyYW5zZmVyX3NpemUpCisJCUlGX0ZFQVRVUkVfVEZUUF9CTE9DS1NJWkUoLCBibGtzaXplKQorCSk7CisKKwlyZXR1cm4gcmVzdWx0OworIGVycjoKKwlzdHJjcHkoR19lcnJvcl9wa3Rfc3RyLCBlcnJvcl9tc2cpOworCWdvdG8gZG9fcHJvdG87Cit9CisKKyNlbmRpZiAvKiBFTkFCTEVfVEZUUEQgKi8KKworI2VuZGlmIC8qIEVOQUJMRV9GRUFUVVJFX1RGVFBfR0VUIHx8IEVOQUJMRV9GRUFUVVJFX1RGVFBfUFVUICovCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3RyYWNlcm91dGUuYyBiL25ldHdvcmtpbmcvdHJhY2Vyb3V0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MjExMGMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3RyYWNlcm91dGUuYwpAQCAtMCwwICsxLDEyMzMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OCwgMTk4OSwgMTk5MSwgMTk5NCwgMTk5NSwgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMAorICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBCdXN5Ym94IHBvcnQgYnkgVmxhZGltaXIgT2xleW5payAoQykgMjAwNSA8ZHpvQHNpbXRyZWFzLnJ1PgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQ6ICgxKSBzb3VyY2UgY29kZSBkaXN0cmlidXRpb25zCisgKiByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGFyYWdyYXBoIGluIGl0cyBlbnRpcmV0eSwgKDIpCisgKiBkaXN0cmlidXRpb25zIGluY2x1ZGluZyBiaW5hcnkgY29kZSBpbmNsdWRlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZAorICogdGhpcyBwYXJhZ3JhcGggaW4gaXRzIGVudGlyZXR5IGluIHRoZSBkb2N1bWVudGF0aW9uIG9yIG90aGVyIG1hdGVyaWFscworICogcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLCBhbmQgKDMpIGFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZworICogZmVhdHVyZXMgb3IgdXNlIG9mIHRoaXMgc29mdHdhcmUgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKKyAqIGBgVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLAorICogTGF3cmVuY2UgQmVya2VsZXkgTGFib3JhdG9yeSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4nJyBOZWl0aGVyIHRoZSBuYW1lIG9mCisgKiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZQorICogb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yCisgKiB3cml0dGVuIHBlcm1pc3Npb24uCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECisgKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIFdJVEhPVVQgTElNSVRBVElPTiwgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAqLworCisvKgorICoJdHJhY2Vyb3V0ZTYKKyAqCisgKiAgICAgIE1vZGlmaWVkIGZvciBOUkwgNC40QlNEIElQdjYgcmVsZWFzZS4KKyAqICAgICAgMDcvMzEvOTYgYmdwCisgKgorICoJTW9kaWZpZWQgZm9yIExpbnV4IElQdjYgYnkgUGVkcm8gUm9xdWUgPHJvcXVlQGRpLmZjLnVsLnB0PgorICoJMzEvMDcvMTk5NgorICoKKyAqCUFzIElDTVAgZXJyb3IgbWVzc2FnZXMgZm9yIElQdjYgbm93IGluY2x1ZGUgbW9yZSB0aGFuIDggYnl0ZXMKKyAqCVVEUCBkYXRhZ3JhbXMgYXJlIG5vdyBzZW50IHZpYSBhbiBVRFAgc29ja2V0IGluc3RlYWQgb2YgbWFnaWMKKyAqCVJBVyBzb2NrZXQgdHJpY2tzLgorICoKKyAqCUNvbnZlcnRlZCB0byBidXN5Ym94IGFwcGxldCBieSBMZW9uaWQgTGlzb3Zza2l5IDxsbHlAc2YubmV0PgorICoJMjAwOS0xMS0xNgorICovCisKKy8qCisgKiB0cmFjZXJvdXRlIGhvc3QgIC0gdHJhY2UgdGhlIHJvdXRlIGlwIHBhY2tldHMgZm9sbG93IGdvaW5nIHRvICJob3N0Ii4KKyAqCisgKiBBdHRlbXB0IHRvIHRyYWNlIHRoZSByb3V0ZSBhbiBpcCBwYWNrZXQgd291bGQgZm9sbG93IHRvIHNvbWUKKyAqIGludGVybmV0IGhvc3QuICBXZSBmaW5kIG91dCBpbnRlcm1lZGlhdGUgaG9wcyBieSBsYXVuY2hpbmcgcHJvYmUKKyAqIHBhY2tldHMgd2l0aCBhIHNtYWxsIHR0bCAodGltZSB0byBsaXZlKSB0aGVuIGxpc3RlbmluZyBmb3IgYW4KKyAqIGljbXAgInRpbWUgZXhjZWVkZWQiIHJlcGx5IGZyb20gYSBnYXRld2F5LiAgV2Ugc3RhcnQgb3VyIHByb2JlcworICogd2l0aCBhIHR0bCBvZiBvbmUgYW5kIGluY3JlYXNlIGJ5IG9uZSB1bnRpbCB3ZSBnZXQgYW4gaWNtcCAicG9ydAorICogdW5yZWFjaGFibGUiICh3aGljaCBtZWFucyB3ZSBnb3QgdG8gImhvc3QiKSBvciBoaXQgYSBtYXggKHdoaWNoCisgKiBkZWZhdWx0cyB0byAzMCBob3BzICYgY2FuIGJlIGNoYW5nZWQgd2l0aCB0aGUgLW0gZmxhZykuICBUaHJlZQorICogcHJvYmVzIChjaGFuZ2Ugd2l0aCAtcSBmbGFnKSBhcmUgc2VudCBhdCBlYWNoIHR0bCBzZXR0aW5nIGFuZCBhCisgKiBsaW5lIGlzIHByaW50ZWQgc2hvd2luZyB0aGUgdHRsLCBhZGRyZXNzIG9mIHRoZSBnYXRld2F5IGFuZAorICogcm91bmQgdHJpcCB0aW1lIG9mIGVhY2ggcHJvYmUuICBJZiB0aGUgcHJvYmUgYW5zd2VycyBjb21lIGZyb20KKyAqIGRpZmZlcmVudCBnYXRld2F5cywgdGhlIGFkZHJlc3Mgb2YgZWFjaCByZXNwb25kaW5nIHN5c3RlbSB3aWxsCisgKiBiZSBwcmludGVkLiAgSWYgdGhlcmUgaXMgbm8gcmVzcG9uc2Ugd2l0aGluIGEgNSBzZWMuIHRpbWVvdXQKKyAqIGludGVydmFsIChjaGFuZ2VkIHdpdGggdGhlIC13IGZsYWcpLCBhICIqIiBpcyBwcmludGVkIGZvciB0aGF0CisgKiBwcm9iZS4KKyAqCisgKiBQcm9iZSBwYWNrZXRzIGFyZSBVRFAgZm9ybWF0LiAgV2UgZG9uJ3Qgd2FudCB0aGUgZGVzdGluYXRpb24KKyAqIGhvc3QgdG8gcHJvY2VzcyB0aGVtIHNvIHRoZSBkZXN0aW5hdGlvbiBwb3J0IGlzIHNldCB0byBhbgorICogdW5saWtlbHkgdmFsdWUgKGlmIHNvbWUgY2xvZCBvbiB0aGUgZGVzdGluYXRpb24gaXMgdXNpbmcgdGhhdAorICogdmFsdWUsIGl0IGNhbiBiZSBjaGFuZ2VkIHdpdGggdGhlIC1wIGZsYWcpLgorICoKKyAqIEEgc2FtcGxlIHVzZSBtaWdodCBiZToKKyAqCisgKiAgICAgW3lhayA3MV0lIHRyYWNlcm91dGUgbmlzLm5zZi5uZXQuCisgKiAgICAgdHJhY2Vyb3V0ZSB0byBuaXMubnNmLm5ldCAoMzUuMS4xLjQ4KSwgMzAgaG9wcyBtYXgsIDU2IGJ5dGUgcGFja2V0CisgKiAgICAgIDEgIGhlbGlvcy5lZS5sYmwuZ292ICgxMjguMy4xMTIuMSkgIDE5IG1zICAxOSBtcyAgMCBtcworICogICAgICAyICBsaWxhYy1kbWMuQmVya2VsZXkuRURVICgxMjguMzIuMjE2LjEpICAzOSBtcyAgMzkgbXMgIDE5IG1zCisgKiAgICAgIDMgIGxpbGFjLWRtYy5CZXJrZWxleS5FRFUgKDEyOC4zMi4yMTYuMSkgIDM5IG1zICAzOSBtcyAgMTkgbXMKKyAqICAgICAgNCAgY2NuZ3ctbmVyLWNjLkJlcmtlbGV5LkVEVSAoMTI4LjMyLjEzNi4yMykgIDM5IG1zICA0MCBtcyAgMzkgbXMKKyAqICAgICAgNSAgY2NuLW5lcmlmMjIuQmVya2VsZXkuRURVICgxMjguMzIuMTY4LjIyKSAgMzkgbXMgIDM5IG1zICAzOSBtcworICogICAgICA2ICAxMjguMzIuMTk3LjQgKDEyOC4zMi4xOTcuNCkgIDQwIG1zICA1OSBtcyAgNTkgbXMKKyAqICAgICAgNyAgMTMxLjExOS4yLjUgKDEzMS4xMTkuMi41KSAgNTkgbXMgIDU5IG1zICA1OSBtcworICogICAgICA4ICAxMjkuMTQwLjcwLjEzICgxMjkuMTQwLjcwLjEzKSAgOTkgbXMgIDk5IG1zICA4MCBtcworICogICAgICA5ICAxMjkuMTQwLjcxLjYgKDEyOS4xNDAuNzEuNikgIDEzOSBtcyAgMjM5IG1zICAzMTkgbXMKKyAqICAgICAxMCAgMTI5LjE0MC44MS43ICgxMjkuMTQwLjgxLjcpICAyMjAgbXMgIDE5OSBtcyAgMTk5IG1zCisgKiAgICAgMTEgIG5pYy5tZXJpdC5lZHUgKDM1LjEuMS40OCkgIDIzOSBtcyAgMjM5IG1zICAyMzkgbXMKKyAqCisgKiBOb3RlIHRoYXQgbGluZXMgMiAmIDMgYXJlIHRoZSBzYW1lLiAgVGhpcyBpcyBkdWUgdG8gYSBidWdneQorICoga2VybmVsIG9uIHRoZSAybmQgaG9wIHN5c3RlbSAtLSBsYmwtY3NhbS5hcnBhIC0tIHRoYXQgZm9yd2FyZHMKKyAqIHBhY2tldHMgd2l0aCBhIHplcm8gdHRsLgorICoKKyAqIEEgbW9yZSBpbnRlcmVzdGluZyBleGFtcGxlIGlzOgorICoKKyAqICAgICBbeWFrIDcyXSUgdHJhY2Vyb3V0ZSBhbGxzcGljZS5sY3MubWl0LmVkdS4KKyAqICAgICB0cmFjZXJvdXRlIHRvIGFsbHNwaWNlLmxjcy5taXQuZWR1ICgxOC4yNi4wLjExNSksIDMwIGhvcHMgbWF4CisgKiAgICAgIDEgIGhlbGlvcy5lZS5sYmwuZ292ICgxMjguMy4xMTIuMSkgIDAgbXMgIDAgbXMgIDAgbXMKKyAqICAgICAgMiAgbGlsYWMtZG1jLkJlcmtlbGV5LkVEVSAoMTI4LjMyLjIxNi4xKSAgMTkgbXMgIDE5IG1zICAxOSBtcworICogICAgICAzICBsaWxhYy1kbWMuQmVya2VsZXkuRURVICgxMjguMzIuMjE2LjEpICAzOSBtcyAgMTkgbXMgIDE5IG1zCisgKiAgICAgIDQgIGNjbmd3LW5lci1jYy5CZXJrZWxleS5FRFUgKDEyOC4zMi4xMzYuMjMpICAxOSBtcyAgMzkgbXMgIDM5IG1zCisgKiAgICAgIDUgIGNjbi1uZXJpZjIyLkJlcmtlbGV5LkVEVSAoMTI4LjMyLjE2OC4yMikgIDIwIG1zICAzOSBtcyAgMzkgbXMKKyAqICAgICAgNiAgMTI4LjMyLjE5Ny40ICgxMjguMzIuMTk3LjQpICA1OSBtcyAgMTE5IG1zICAzOSBtcworICogICAgICA3ICAxMzEuMTE5LjIuNSAoMTMxLjExOS4yLjUpICA1OSBtcyAgNTkgbXMgIDM5IG1zCisgKiAgICAgIDggIDEyOS4xNDAuNzAuMTMgKDEyOS4xNDAuNzAuMTMpICA4MCBtcyAgNzkgbXMgIDk5IG1zCisgKiAgICAgIDkgIDEyOS4xNDAuNzEuNiAoMTI5LjE0MC43MS42KSAgMTM5IG1zICAxMzkgbXMgIDE1OSBtcworICogICAgIDEwICAxMjkuMTQwLjgxLjcgKDEyOS4xNDAuODEuNykgIDE5OSBtcyAgMTgwIG1zICAzMDAgbXMKKyAqICAgICAxMSAgMTI5LjE0MC43Mi4xNyAoMTI5LjE0MC43Mi4xNykgIDMwMCBtcyAgMjM5IG1zICAyMzkgbXMKKyAqICAgICAxMiAgKiAqICoKKyAqICAgICAxMyAgMTI4LjEyMS41NC43MiAoMTI4LjEyMS41NC43MikgIDI1OSBtcyAgNDk5IG1zICAyNzkgbXMKKyAqICAgICAxNCAgKiAqICoKKyAqICAgICAxNSAgKiAqICoKKyAqICAgICAxNiAgKiAqICoKKyAqICAgICAxNyAgKiAqICoKKyAqICAgICAxOCAgQUxMU1BJQ0UuTENTLk1JVC5FRFUgKDE4LjI2LjAuMTE1KSAgMzM5IG1zICAyNzkgbXMgIDI3OSBtcworICoKKyAqIChJIHN0YXJ0IHRvIHNlZSB3aHkgSSdtIGhhdmluZyBzbyBtdWNoIHRyb3VibGUgd2l0aCBtYWlsIHRvCisgKiBNSVQuKSAgTm90ZSB0aGF0IHRoZSBnYXRld2F5cyAxMiwgMTQsIDE1LCAxNiAmIDE3IGhvcHMgYXdheQorICogZWl0aGVyIGRvbid0IHNlbmQgSUNNUCAidGltZSBleGNlZWRlZCIgbWVzc2FnZXMgb3Igc2VuZCB0aGVtCisgKiB3aXRoIGEgdHRsIHRvbyBzbWFsbCB0byByZWFjaCB1cy4gIDE0IC0gMTcgYXJlIHJ1bm5pbmcgdGhlCisgKiBNSVQgQyBHYXRld2F5IGNvZGUgdGhhdCBkb2Vzbid0IHNlbmQgInRpbWUgZXhjZWVkZWQicy4gIEdvZAorICogb25seSBrbm93cyB3aGF0J3MgZ29pbmcgb24gd2l0aCAxMi4KKyAqCisgKiBUaGUgc2lsZW50IGdhdGV3YXkgMTIgaW4gdGhlIGFib3ZlIG1heSBiZSB0aGUgcmVzdWx0IG9mIGEgYnVnIGluCisgKiB0aGUgNC5bMjNdQlNEIG5ldHdvcmsgY29kZSAoYW5kIGl0cyBkZXJpdmF0aXZlcyk6ICA0LnggKHggPD0gMykKKyAqIHNlbmRzIGFuIHVucmVhY2hhYmxlIG1lc3NhZ2UgdXNpbmcgd2hhdGV2ZXIgdHRsIHJlbWFpbnMgaW4gdGhlCisgKiBvcmlnaW5hbCBkYXRhZ3JhbS4gIFNpbmNlLCBmb3IgZ2F0ZXdheXMsIHRoZSByZW1haW5pbmcgdHRsIGlzCisgKiB6ZXJvLCB0aGUgaWNtcCAidGltZSBleGNlZWRlZCIgaXMgZ3VhcmFudGVlZCB0byBub3QgbWFrZSBpdCBiYWNrCisgKiB0byB1cy4gIFRoZSBiZWhhdmlvciBvZiB0aGlzIGJ1ZyBpcyBzbGlnaHRseSBtb3JlIGludGVyZXN0aW5nCisgKiB3aGVuIGl0IGFwcGVhcnMgb24gdGhlIGRlc3RpbmF0aW9uIHN5c3RlbToKKyAqCisgKiAgICAgIDEgIGhlbGlvcy5lZS5sYmwuZ292ICgxMjguMy4xMTIuMSkgIDAgbXMgIDAgbXMgIDAgbXMKKyAqICAgICAgMiAgbGlsYWMtZG1jLkJlcmtlbGV5LkVEVSAoMTI4LjMyLjIxNi4xKSAgMzkgbXMgIDE5IG1zICAzOSBtcworICogICAgICAzICBsaWxhYy1kbWMuQmVya2VsZXkuRURVICgxMjguMzIuMjE2LjEpICAxOSBtcyAgMzkgbXMgIDE5IG1zCisgKiAgICAgIDQgIGNjbmd3LW5lci1jYy5CZXJrZWxleS5FRFUgKDEyOC4zMi4xMzYuMjMpICAzOSBtcyAgNDAgbXMgIDE5IG1zCisgKiAgICAgIDUgIGNjbi1uZXJpZjM1LkJlcmtlbGV5LkVEVSAoMTI4LjMyLjE2OC4zNSkgIDM5IG1zICAzOSBtcyAgMzkgbXMKKyAqICAgICAgNiAgY3Nndy5CZXJrZWxleS5FRFUgKDEyOC4zMi4xMzMuMjU0KSAgMzkgbXMgIDU5IG1zICAzOSBtcworICogICAgICA3ICAqICogKgorICogICAgICA4ICAqICogKgorICogICAgICA5ICAqICogKgorICogICAgIDEwICAqICogKgorICogICAgIDExICAqICogKgorICogICAgIDEyICAqICogKgorICogICAgIDEzICByaXAuQmVya2VsZXkuRURVICgxMjguMzIuMTMxLjIyKSAgNTkgbXMgISAgMzkgbXMgISAgMzkgbXMgIQorICoKKyAqIE5vdGljZSB0aGF0IHRoZXJlIGFyZSAxMiAiZ2F0ZXdheXMiICgxMyBpcyB0aGUgZmluYWwKKyAqIGRlc3RpbmF0aW9uKSBhbmQgZXhhY3RseSB0aGUgbGFzdCBoYWxmIG9mIHRoZW0gYXJlICJtaXNzaW5nIi4KKyAqIFdoYXQncyByZWFsbHkgaGFwcGVuaW5nIGlzIHRoYXQgcmlwIChhIFN1bi0zIHJ1bm5pbmcgU3VuIE9TMy41KQorICogaXMgdXNpbmcgdGhlIHR0bCBmcm9tIG91ciBhcnJpdmluZyBkYXRhZ3JhbSBhcyB0aGUgdHRsIGluIGl0cworICogaWNtcCByZXBseS4gIFNvLCB0aGUgcmVwbHkgd2lsbCB0aW1lIG91dCBvbiB0aGUgcmV0dXJuIHBhdGgKKyAqICh3aXRoIG5vIG5vdGljZSBzZW50IHRvIGFueW9uZSBzaW5jZSBpY21wJ3MgYXJlbid0IHNlbnQgZm9yCisgKiBpY21wJ3MpIHVudGlsIHdlIHByb2JlIHdpdGggYSB0dGwgdGhhdCdzIGF0IGxlYXN0IHR3aWNlIHRoZSBwYXRoCisgKiBsZW5ndGguICBJLmUuLCByaXAgaXMgcmVhbGx5IG9ubHkgNyBob3BzIGF3YXkuICBBIHJlcGx5IHRoYXQKKyAqIHJldHVybnMgd2l0aCBhIHR0bCBvZiAxIGlzIGEgY2x1ZSB0aGlzIHByb2JsZW0gZXhpc3RzLgorICogVHJhY2Vyb3V0ZSBwcmludHMgYSAiISIgYWZ0ZXIgdGhlIHRpbWUgaWYgdGhlIHR0bCBpcyA8PSAxLgorICogU2luY2UgdmVuZG9ycyBzaGlwIGEgbG90IG9mIG9ic29sZXRlIChERUMncyBVbHRyaXgsIFN1biAzLngpIG9yCisgKiBub24tc3RhbmRhcmQgKEhQVVgpIHNvZnR3YXJlLCBleHBlY3QgdG8gc2VlIHRoaXMgcHJvYmxlbQorICogZnJlcXVlbnRseSBhbmQvb3IgdGFrZSBjYXJlIHBpY2tpbmcgdGhlIHRhcmdldCBob3N0IG9mIHlvdXIKKyAqIHByb2Jlcy4KKyAqCisgKiBPdGhlciBwb3NzaWJsZSBhbm5vdGF0aW9ucyBhZnRlciB0aGUgdGltZSBhcmUgIUgsICFOLCAhUCAoZ290IGEgaG9zdCwKKyAqIG5ldHdvcmsgb3IgcHJvdG9jb2wgdW5yZWFjaGFibGUsIHJlc3BlY3RpdmVseSksICFTIG9yICFGIChzb3VyY2UKKyAqIHJvdXRlIGZhaWxlZCBvciBmcmFnbWVudGF0aW9uIG5lZWRlZCAtLSBuZWl0aGVyIG9mIHRoZXNlIHNob3VsZAorICogZXZlciBvY2N1ciBhbmQgdGhlIGFzc29jaWF0ZWQgZ2F0ZXdheSBpcyBidXN0ZWQgaWYgeW91IHNlZSBvbmUpLiAgSWYKKyAqIGFsbW9zdCBhbGwgdGhlIHByb2JlcyByZXN1bHQgaW4gc29tZSBraW5kIG9mIHVucmVhY2hhYmxlLCB0cmFjZXJvdXRlCisgKiB3aWxsIGdpdmUgdXAgYW5kIGV4aXQuCisgKgorICogTm90ZXMKKyAqIC0tLS0tCisgKiBUaGlzIHByb2dyYW0gbXVzdCBiZSBydW4gYnkgcm9vdCBvciBiZSBzZXR1aWQuICAoSSBzdWdnZXN0IHRoYXQKKyAqIHlvdSAqZG9uJ3QqIG1ha2UgaXQgc2V0dWlkIC0tIGNhc3VhbCB1c2UgY291bGQgcmVzdWx0IGluIGEgbG90CisgKiBvZiB1bm5lY2Vzc2FyeSB0cmFmZmljIG9uIG91ciBwb29yLCBjb25nZXN0ZWQgbmV0cy4pCisgKgorICogVGhpcyBwcm9ncmFtIHJlcXVpcmVzIGEga2VybmVsIG1vZCB0aGF0IGRvZXMgbm90IGFwcGVhciBpbiBhbnkKKyAqIHN5c3RlbSBhdmFpbGFibGUgZnJvbSBCZXJrZWxleTogIEEgcmF3IGlwIHNvY2tldCB1c2luZyBwcm90bworICogSVBQUk9UT19SQVcgbXVzdCBpbnRlcnByZXQgdGhlIGRhdGEgc2VudCBhcyBhbiBpcCBkYXRhZ3JhbSAoYXMKKyAqIG9wcG9zZWQgdG8gZGF0YSB0byBiZSB3cmFwcGVkIGluIGEgaXAgZGF0YWdyYW0pLiAgU2VlIHRoZSBSRUFETUUKKyAqIGZpbGUgdGhhdCBjYW1lIHdpdGggdGhlIHNvdXJjZSB0byB0aGlzIHByb2dyYW0gZm9yIGEgZGVzY3JpcHRpb24KKyAqIG9mIHRoZSBtb2RzIEkgbWFkZSB0byAvc3lzL25ldGluZXQvcmF3X2lwLmMuICBZb3VyIG1pbGVhZ2UgbWF5CisgKiB2YXJ5LiAgQnV0LCBhZ2FpbiwgQU5ZIDQueCAoeCA8IDQpIEJTRCBLRVJORUwgV0lMTCBIQVZFIFRPIEJFCisgKiBNT0RJRklFRCBUTyBSVU4gVEhJUyBQUk9HUkFNLgorICoKKyAqIFRoZSB1ZHAgcG9ydCB1c2FnZSBtYXkgYXBwZWFyIGJpemFycmUgKHdlbGwsIG9rLCBpdCBpcyBiaXphcnJlKS4KKyAqIFRoZSBwcm9ibGVtIGlzIHRoYXQgYW4gaWNtcCBtZXNzYWdlIG9ubHkgY29udGFpbnMgOCBieXRlcyBvZgorICogZGF0YSBmcm9tIHRoZSBvcmlnaW5hbCBkYXRhZ3JhbS4gIDggYnl0ZXMgaXMgdGhlIHNpemUgb2YgYSB1ZHAKKyAqIGhlYWRlciBzbywgaWYgd2Ugd2FudCB0byBhc3NvY2lhdGUgcmVwbGllcyB3aXRoIHRoZSBvcmlnaW5hbAorICogZGF0YWdyYW0sIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gbXVzdCBiZSBlbmNvZGVkIGludG8gdGhlCisgKiB1ZHAgaGVhZGVyICh0aGUgaXAgaWQgY291bGQgYmUgdXNlZCBidXQgdGhlcmUncyBubyB3YXkgdG8KKyAqIGludGVybG9jayB3aXRoIHRoZSBrZXJuZWwncyBhc3NpZ25tZW50IG9mIGlwIGlkJ3MgYW5kLCBhbnl3YXksCisgKiBpdCB3b3VsZCBoYXZlIHRha2VuIGEgbG90IG1vcmUga2VybmVsIGhhY2tpbmcgdG8gYWxsb3cgdGhpcworICogY29kZSB0byBzZXQgdGhlIGlwIGlkKS4gIFNvLCB0byBhbGxvdyB0d28gb3IgbW9yZSB1c2VycyB0bworICogdXNlIHRyYWNlcm91dGUgc2ltdWx0YW5lb3VzbHksIHdlIHVzZSB0aGlzIHRhc2sncyBwaWQgYXMgdGhlCisgKiBzb3VyY2UgcG9ydCAodGhlIGhpZ2ggYml0IGlzIHNldCB0byBtb3ZlIHRoZSBwb3J0IG51bWJlciBvdXQKKyAqIG9mIHRoZSAibGlrZWx5IiByYW5nZSkuICBUbyBrZWVwIHRyYWNrIG9mIHdoaWNoIHByb2JlIGlzIGJlaW5nCisgKiByZXBsaWVkIHRvIChzbyB0aW1lcyBhbmQvb3IgaG9wIGNvdW50cyBkb24ndCBnZXQgY29uZnVzZWQgYnkgYQorICogcmVwbHkgdGhhdCB3YXMgZGVsYXllZCBpbiB0cmFuc2l0KSwgd2UgaW5jcmVtZW50IHRoZSBkZXN0aW5hdGlvbgorICogcG9ydCBudW1iZXIgYmVmb3JlIGVhY2ggcHJvYmUuCisgKgorICogRG9uJ3QgdXNlIHRoaXMgYXMgYSBjb2RpbmcgZXhhbXBsZS4gIEkgd2FzIHRyeWluZyB0byBmaW5kIGEKKyAqIHJvdXRpbmcgcHJvYmxlbSBhbmQgdGhpcyBjb2RlIHNvcnQtb2YgcG9wcGVkIG91dCBhZnRlciA0OCBob3VycworICogd2l0aG91dCBzbGVlcC4gIEkgd2FzIGFtYXplZCBpdCBldmVyIGNvbXBpbGVkLCBtdWNoIGxlc3MgcmFuLgorICoKKyAqIEkgc3RvbGUgdGhlIGlkZWEgZm9yIHRoaXMgcHJvZ3JhbSBmcm9tIFN0ZXZlIERlZXJpbmcuICBTaW5jZQorICogdGhlIGZpcnN0IHJlbGVhc2UsIEkndmUgbGVhcm5lZCB0aGF0IGhhZCBJIGF0dGVuZGVkIHRoZSByaWdodAorICogSUVURiB3b3JraW5nIGdyb3VwIG1lZXRpbmdzLCBJIGFsc28gY291bGQgaGF2ZSBzdG9sZW4gaXQgZnJvbSBHdXkKKyAqIEFsbWVzIG9yIE1hdHQgTWF0aGlzLiAgSSBkb24ndCBrbm93IChvciBjYXJlKSB3aG8gY2FtZSB1cCB3aXRoCisgKiB0aGUgaWRlYSBmaXJzdC4gIEkgZW52eSB0aGUgb3JpZ2luYXRvcnMnIHBlcnNwaWNhY2l0eSBhbmQgSSdtCisgKiBnbGFkIHRoZXkgZGlkbid0IGtlZXAgdGhlIGlkZWEgYSBzZWNyZXQuCisgKgorICogVGltIFNlYXZlciwgS2VuIEFkZWxtYW4gYW5kIEMuIFBoaWxpcCBXb29kIHByb3ZpZGVkIGJ1ZyBmaXhlcyBhbmQvb3IKKyAqIGVuaGFuY2VtZW50cyB0byB0aGUgb3JpZ2luYWwgZGlzdHJpYnV0aW9uLgorICoKKyAqIEkndmUgaGFja2VkIHVwIGEgcm91bmQtdHJpcC1yb3V0ZSB2ZXJzaW9uIG9mIHRoaXMgdGhhdCB3b3JrcyBieQorICogc2VuZGluZyBhIGxvb3NlLXNvdXJjZS1yb3V0ZWQgdWRwIGRhdGFncmFtIHRocm91Z2ggdGhlIGRlc3RpbmF0aW9uCisgKiBiYWNrIHRvIHlvdXJzZWxmLiAgVW5mb3J0dW5hdGVseSwgU08gbWFueSBnYXRld2F5cyBib3RjaCBzb3VyY2UKKyAqIHJvdXRpbmcsIHRoZSB0aGluZyBpcyBhbG1vc3Qgd29ydGhsZXNzLiAgTWF5YmUgb25lIGRheS4uLgorICoKKyAqICAtLSBWYW4gSmFjb2Jzb24gKHZhbkBlZS5sYmwuZ292KQorICogICAgIFR1ZSBEZWMgMjAgMDM6NTA6MTMgUFNUIDE5ODgKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgdHJhY2Vyb3V0ZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy0iSUZfVFJBQ0VST1VURTYoIjQ2IikiRklsbnJ2XSBbLWYgMVNUX1RUTF0gWy1tIE1BWFRUTF0gWy1xIFBST0JFU10gWy1wIFBPUlRdXG4iCisvL3VzYWdlOiAgICAgICAiCVstdCBUT1NdIFstdyBXQUlUX1NFQ10iCisvL3VzYWdlOiAgICAgICBJRl9GRUFUVVJFX1RSQUNFUk9VVEVfU09VUkNFX1JPVVRFKCIgWy1nIEdBVEVXQVldIikiIFstcyBTUkNfSVBdIFstaSBJRkFDRV1cbiIKKy8vdXNhZ2U6ICAgICAgICIJWy16IFBBVVNFX01TRUNdIEhPU1QgW0JZVEVTXSIKKy8vdXNhZ2U6I2RlZmluZSB0cmFjZXJvdXRlX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVHJhY2UgdGhlIHJvdXRlIHRvIEhPU1RcbiIKKy8vdXNhZ2U6CUlGX1RSQUNFUk9VVEU2KAorLy91c2FnZTogICAgICJcbgktNCwtNglGb3JjZSBJUCBvciBJUHY2IG5hbWUgcmVzb2x1dGlvbiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLUYJU2V0IGRvbid0IGZyYWdtZW50IGJpdCIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVFJBQ0VST1VURV9VU0VfSUNNUCgKKy8vdXNhZ2U6ICAgICAiXG4JLUkJVXNlIElDTVAgRUNITyBpbnN0ZWFkIG9mIFVEUCBkYXRhZ3JhbXMiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1sCURpc3BsYXkgVFRMIHZhbHVlIG9mIHRoZSByZXR1cm5lZCBwYWNrZXQiCisvL0N1cnJlbnRseSBkaXNhYmxlZCAoVFJBQ0VST1VURV9TT19ERUJVRz09MCkKKy8vLy91c2FnZTogICAgICJcbgktZAlTZXQgU09fREVCVUcgb3B0aW9ucyB0byBzb2NrZXQiCisvL3VzYWdlOiAgICAgIlxuCS1uCVByaW50IG51bWVyaWMgYWRkcmVzc2VzIgorLy91c2FnZTogICAgICJcbgktcglCeXBhc3Mgcm91dGluZyB0YWJsZXMsIHNlbmQgZGlyZWN0bHkgdG8gSE9TVCIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFKAorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktZiBOCUZpcnN0IG51bWJlciBvZiBob3BzIChkZWZhdWx0IDEpIgorLy91c2FnZTogICAgICJcbgktbSBOCU1heCBudW1iZXIgb2YgaG9wcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXEgTglOdW1iZXIgb2YgcHJvYmVzIHBlciBob3AgKGRlZmF1bHQgMykiCisvL3VzYWdlOiAgICAgIlxuCS1wIE4JQmFzZSBVRFAgcG9ydCBudW1iZXIgdXNlZCBpbiBwcm9iZXMiCisvL3VzYWdlOiAgICAgIlxuCQkoZGVmYXVsdCAzMzQzNCkiCisvL3VzYWdlOiAgICAgIlxuCS1zIElQCVNvdXJjZSBhZGRyZXNzIgorLy91c2FnZTogICAgICJcbgktaSBJRkFDRSBTb3VyY2UgaW50ZXJmYWNlIgorLy91c2FnZTogICAgICJcbgktdCBOCVR5cGUtb2Ytc2VydmljZSBpbiBwcm9iZSBwYWNrZXRzIChkZWZhdWx0IDApIgorLy91c2FnZTogICAgICJcbgktdyBTRUMJVGltZSB0byB3YWl0IGZvciBhIHJlc3BvbnNlIChkZWZhdWx0IDMpIgorLy91c2FnZTogICAgICJcbgktZyBJUAlMb29zZSBzb3VyY2Ugcm91dGUgZ2F0ZXdheSAoOCBtYXgpIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB0cmFjZXJvdXRlNl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1ucnZdIFstbSBNQVhUVExdIFstcSBQUk9CRVNdIFstcCBQT1JUXVxuIgorLy91c2FnZTogICAgICAgIglbLXQgVE9TXSBbLXcgV0FJVF9TRUNdIFstcyBTUkNfSVBdIFstaSBJRkFDRV1cbiIKKy8vdXNhZ2U6ICAgICAgICIJSE9TVCBbQllURVNdIgorLy91c2FnZTojZGVmaW5lIHRyYWNlcm91dGU2X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVHJhY2UgdGhlIHJvdXRlIHRvIEhPU1RcbiIKKy8vQ3VycmVudGx5IGRpc2FibGVkIChUUkFDRVJPVVRFX1NPX0RFQlVHPT0wKQorLy8vL3VzYWdlOiAgICAgIlxuCS1kCVNldCBTT19ERUJVRyBvcHRpb25zIHRvIHNvY2tldCIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JUHJpbnQgbnVtZXJpYyBhZGRyZXNzZXMiCisvL3VzYWdlOiAgICAgIlxuCS1yCUJ5cGFzcyByb3V0aW5nIHRhYmxlcywgc2VuZCBkaXJlY3RseSB0byBIT1NUIgorLy91c2FnZToJSUZfRkVBVFVSRV9UUkFDRVJPVVRFX1ZFUkJPU0UoCisvL3VzYWdlOiAgICAgIlxuCS12CVZlcmJvc2UiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1tIE4JTWF4IG51bWJlciBvZiBob3BzIgorLy91c2FnZTogICAgICJcbgktcSBOCU51bWJlciBvZiBwcm9iZXMgcGVyIGhvcCAoZGVmYXVsdCAzKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAgTglCYXNlIFVEUCBwb3J0IG51bWJlciB1c2VkIGluIHByb2JlcyIKKy8vdXNhZ2U6ICAgICAiXG4JCShkZWZhdWx0IDMzNDM0KSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgSVAJU291cmNlIGFkZHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCS1pIElGQUNFIFNvdXJjZSBpbnRlcmZhY2UiCisvL3VzYWdlOiAgICAgIlxuCS10IE4JVHlwZS1vZi1zZXJ2aWNlIGluIHByb2JlIHBhY2tldHMgKGRlZmF1bHQgMCkiCisvL3VzYWdlOiAgICAgIlxuCS13IFNFQwlUaW1lIHdhaXQgZm9yIGEgcmVzcG9uc2UgKGRlZmF1bHQgMykiCisKKyNkZWZpbmUgVFJBQ0VST1VURV9TT19ERUJVRyAwCisKKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC91ZHAuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2lwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcF9pY21wLmg+CisjaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorIyBpbmNsdWRlIDxuZXRpbmV0L2lwNi5oPgorIyBpbmNsdWRlIDxuZXRpbmV0L2ljbXA2Lmg+CisjIGlmbmRlZiBTT0xfSVBWNgorIyAgZGVmaW5lIFNPTF9JUFY2IElQUFJPVE9fSVBWNgorIyBlbmRpZgorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImluZXRfY29tbW9uLmgiCisKKyNpZm5kZWYgSVBQUk9UT19JQ01QCisjIGRlZmluZSBJUFBST1RPX0lDTVAgMQorI2VuZGlmCisjaWZuZGVmIElQUFJPVE9fSVAKKyMgZGVmaW5lIElQUFJPVE9fSVAgMAorI2VuZGlmCisKKworI2RlZmluZSBPUFRfU1RSSU5HIFwKKwkiRklsbnJkdnh0Omk6bTpwOnE6czp3Ono6ZjoiIFwKKwlJRl9GRUFUVVJFX1RSQUNFUk9VVEVfU09VUkNFX1JPVVRFKCJnOiIpIFwKKwkiNCIgSUZfVFJBQ0VST1VURTYoIjYiKQorZW51bSB7CisJT1BUX0RPTlRfRlJBR01OVCA9ICgxIDw8IDApLCAgICAvKiBGICovCisJT1BUX1VTRV9JQ01QICAgICA9ICgxIDw8IDEpICogRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9VU0VfSUNNUCwgLyogSSAqLworCU9QVF9UVExfRkxBRyAgICAgPSAoMSA8PCAyKSwgICAgLyogbCAqLworCU9QVF9BRERSX05VTSAgICAgPSAoMSA8PCAzKSwgICAgLyogbiAqLworCU9QVF9CWVBBU1NfUk9VVEUgPSAoMSA8PCA0KSwgICAgLyogciAqLworCU9QVF9ERUJVRyAgICAgICAgPSAoMSA8PCA1KSwgICAgLyogZCAqLworCU9QVF9WRVJCT1NFICAgICAgPSAoMSA8PCA2KSAqIEVOQUJMRV9GRUFUVVJFX1RSQUNFUk9VVEVfVkVSQk9TRSwgLyogdiAqLworCU9QVF9JUF9DSEtTVU0gICAgPSAoMSA8PCA3KSwgICAgLyogeCAqLworCU9QVF9UT1MgICAgICAgICAgPSAoMSA8PCA4KSwgICAgLyogdCAqLworCU9QVF9ERVZJQ0UgICAgICAgPSAoMSA8PCA5KSwgICAgLyogaSAqLworCU9QVF9NQVhfVFRMICAgICAgPSAoMSA8PCAxMCksICAgLyogbSAqLworCU9QVF9QT1JUICAgICAgICAgPSAoMSA8PCAxMSksICAgLyogcCAqLworCU9QVF9OUFJPQkVTICAgICAgPSAoMSA8PCAxMiksICAgLyogcSAqLworCU9QVF9TT1VSQ0UgICAgICAgPSAoMSA8PCAxMyksICAgLyogcyAqLworCU9QVF9XQUlUVElNRSAgICAgPSAoMSA8PCAxNCksICAgLyogdyAqLworCU9QVF9QQVVTRV9NUyAgICAgPSAoMSA8PCAxNSksICAgLyogeiAqLworCU9QVF9GSVJTVF9UVEwgICAgPSAoMSA8PCAxNiksICAgLyogZiAqLworCU9QVF9TT1VSQ0VfUk9VVEUgPSAoMSA8PCAxNykgKiBFTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1NPVVJDRV9ST1VURSwgLyogZyAqLworCU9QVF9JUFY0ICAgICAgICAgPSAoMSA8PCAoMTcrRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUpKSwgICAvKiA0ICovCisJT1BUX0lQVjYgICAgICAgICA9ICgxIDw8ICgxOCtFTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1NPVVJDRV9ST1VURSkpICogRU5BQkxFX1RSQUNFUk9VVEU2LCAvKiA2ICovCit9OworI2RlZmluZSB2ZXJib3NlIChvcHRpb25fbWFzazMyICYgT1BUX1ZFUkJPU0UpCisKK2VudW0geworCVNJWkVPRl9JQ01QX0hEUiA9IDgsCisJcmN2c29jayA9IDMsIC8qIHJlY2VpdmUgKGljbXApIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKi8KKwlzbmRzb2NrID0gNCwgLyogc2VuZCAodWRwL2ljbXApIHNvY2tldCBmaWxlIGRlc2NyaXB0b3IgKi8KK307CisKKy8qIERhdGEgc2VjdGlvbiBvZiB0aGUgcHJvYmUgcGFja2V0ICovCitzdHJ1Y3Qgb3V0ZGF0YV90IHsKKwl1bnNpZ25lZCBjaGFyIHNlcTsgICAgICAgICAgICAgLyogc2VxdWVuY2UgbnVtYmVyIG9mIHRoaXMgcGFja2V0ICovCisJdW5zaWduZWQgY2hhciB0dGw7ICAgICAgICAgICAgIC8qIHR0bCBwYWNrZXQgbGVmdCB3aXRoICovCisvLyBVTlVTRUQuIFJldGFpbmluZyB0byBoYXZlIHRoZSBzYW1lIHBhY2tldCBzaXplLgorCXN0cnVjdCB0aW1ldmFsIHR2X1VOVVNFRCBQQUNLRUQ7IC8qIHRpbWUgcGFja2V0IGxlZnQgKi8KK307CisKKyNpZiBFTkFCTEVfVFJBQ0VST1VURTYKK3N0cnVjdCBvdXRkYXRhNl90IHsKKwl1aW50MzJfdCBpZGVudDY7CisJdWludDMyX3Qgc2VxNjsKKwlzdHJ1Y3QgdGltZXZhbCB0dl9VTlVTRUQgUEFDS0VEOyAvKiB0aW1lIHBhY2tldCBsZWZ0ICovCit9OworI2VuZGlmCisKK3N0cnVjdCBnbG9iYWxzIHsKKwlzdHJ1Y3QgaXAgKm91dGlwOworCXN0cnVjdCBvdXRkYXRhX3QgKm91dGRhdGE7CisJbGVuX2FuZF9zb2NrYWRkciAqZGVzdF9sc2E7CisJaW50IHBhY2tsZW47ICAgICAgICAgICAgICAgICAgICAvKiB0b3RhbCBsZW5ndGggb2YgcGFja2V0ICovCisJaW50IHBtdHU7ICAgICAgICAgICAgICAgICAgICAgICAvKiBQYXRoIE1UVSBEaXNjb3ZlcnkgKFJGQzExOTEpICovCisJdWludDMyX3QgaWRlbnQ7CisJdWludDE2X3QgcG9ydDsgLy8gMzI3NjggKyA2NjY7ICAvKiBzdGFydCB1ZHAgZGVzdCBwb3J0ICMgZm9yIHByb2JlIHBhY2tldHMgKi8KKwlpbnQgd2FpdHRpbWU7IC8vIDU7ICAgICAgICAgICAgIC8qIHRpbWUgdG8gd2FpdCBmb3IgcmVzcG9uc2UgKGluIHNlY29uZHMpICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUKKwlpbnQgb3B0bGVuOyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBpcCBvcHRpb25zICovCisjZWxzZQorI2RlZmluZSBvcHRsZW4gMAorI2VuZGlmCisJdW5zaWduZWQgY2hhciByZWN2X3BrdFs1MTJdOyAgICAvKiBsYXN0IGluYm91bmQgKGljbXApIHBhY2tldCAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1RSQUNFUk9VVEVfU09VUkNFX1JPVVRFCisJLyogTWF4aW11bSBudW1iZXIgb2YgZ2F0ZXdheXMgKGluY2x1ZGUgcm9vbSBmb3Igb25lIG5vb3ApICovCisjZGVmaW5lIE5HQVRFV0FZUyAoKGludCkoKE1BWF9JUE9QVExFTiAtIElQT1BUX01JTk9GRiAtIDEpIC8gc2l6ZW9mKHVpbnQzMl90KSkpCisJLyogbG9vc2Ugc291cmNlIHJvdXRlIGdhdGV3YXkgbGlzdCAoaW5jbHVkaW5nIHJvb20gZm9yIGZpbmFsIGRlc3RpbmF0aW9uKSAqLworCXVpbnQzMl90IGd3bGlzdFtOR0FURVdBWVMgKyAxXTsKKyNlbmRpZgorfTsKKworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIG91dGlwICAgICAoRy5vdXRpcCAgICApCisjZGVmaW5lIG91dGRhdGEgICAoRy5vdXRkYXRhICApCisjZGVmaW5lIGRlc3RfbHNhICAoRy5kZXN0X2xzYSApCisjZGVmaW5lIHBhY2tsZW4gICAoRy5wYWNrbGVuICApCisjZGVmaW5lIHBtdHUgICAgICAoRy5wbXR1ICAgICApCisjZGVmaW5lIGlkZW50ICAgICAoRy5pZGVudCAgICApCisjZGVmaW5lIHBvcnQgICAgICAoRy5wb3J0ICAgICApCisjZGVmaW5lIHdhaXR0aW1lICAoRy53YWl0dGltZSApCisjaWYgRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUKKyMgZGVmaW5lIG9wdGxlbiAgIChHLm9wdGxlbiAgICkKKyNlbmRpZgorI2RlZmluZSByZWN2X3BrdCAgKEcucmVjdl9wa3QgKQorI2RlZmluZSBnd2xpc3QgICAgKEcuZ3dsaXN0ICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorCXBvcnQgPSAzMjc2OCArIDY2NjsgXAorCXdhaXR0aW1lID0gNTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBvdXRpY21wICgoc3RydWN0IGljbXAgKikob3V0aXAgKyAxKSkKKyNkZWZpbmUgb3V0dWRwICAoKHN0cnVjdCB1ZHBoZHIgKikob3V0aXAgKyAxKSkKKworCitzdGF0aWMgaW50Cit3YWl0X2Zvcl9yZXBseShsZW5fYW5kX3NvY2thZGRyICpmcm9tX2xzYSwgc3RydWN0IHNvY2thZGRyICp0bywgdW5zaWduZWQgKnRpbWVzdGFtcF91cywgaW50ICpsZWZ0X21zKQoreworCXN0cnVjdCBwb2xsZmQgcGZkWzFdOworCWludCByZWFkX2xlbiA9IDA7CisKKwlwZmRbMF0uZmQgPSByY3Zzb2NrOworCXBmZFswXS5ldmVudHMgPSBQT0xMSU47CisJaWYgKCpsZWZ0X21zID49IDAgJiYgc2FmZV9wb2xsKHBmZCwgMSwgKmxlZnRfbXMpID4gMCkgeworCQl1bnNpZ25lZCB0OworCisJCXJlYWRfbGVuID0gcmVjdl9mcm9tX3RvKHJjdnNvY2ssCisJCQkJcmVjdl9wa3QsIHNpemVvZihyZWN2X3BrdCksCisJCQkJLypmbGFnczoqLyBNU0dfRE9OVFdBSVQsCisJCQkJJmZyb21fbHNhLT51LnNhLCB0bywgZnJvbV9sc2EtPmxlbik7CisJCXQgPSBtb25vdG9uaWNfdXMoKTsKKwkJKmxlZnRfbXMgLT0gKHQgLSAqdGltZXN0YW1wX3VzKSAvIDEwMDA7CisJCSp0aW1lc3RhbXBfdXMgPSB0OworCX0KKworCXJldHVybiByZWFkX2xlbjsKK30KKworc3RhdGljIHZvaWQKK3NlbmRfcHJvYmUoaW50IHNlcSwgaW50IHR0bCkKK3sKKwlpbnQgbGVuLCByZXM7CisJdm9pZCAqb3V0OworCisJLyogUGF5bG9hZCAqLworI2lmIEVOQUJMRV9UUkFDRVJPVVRFNgorCWlmIChkZXN0X2xzYS0+dS5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJc3RydWN0IG91dGRhdGE2X3QgKnBrdCA9IChzdHJ1Y3Qgb3V0ZGF0YTZfdCAqKSBvdXRpcDsKKwkJcGt0LT5pZGVudDYgPSBodG9ubChpZGVudCk7CisJCXBrdC0+c2VxNiAgID0gaHRvbmwoc2VxKTsKKwkJLypnZXR0aW1lb2ZkYXkoJnBrdC0+dHYsICZ0eik7Ki8KKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJb3V0ZGF0YS0+c2VxID0gc2VxOworCQlvdXRkYXRhLT50dGwgPSB0dGw7CisvLyBVTlVTRUQ6IHdhcyBzdG9yaW5nIGdldHRpbWVvZmRheSdzIHJlc3VsdCB0aGVyZSwgYnV0IG5ldmVyIGV2ZXIgY2hlY2tlZCBpdAorCQkvKm1lbWNweSgmb3V0ZGF0YS0+dHYsIHRwLCBzaXplb2Yob3V0ZGF0YS0+dHYpKTsqLworCisJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX1VTRV9JQ01QKSB7CisJCQlvdXRpY21wLT5pY21wX3NlcSA9IGh0b25zKHNlcSk7CisKKwkJCS8qIEFsd2F5cyBjYWxjdWxhdGUgY2hlY2tzdW0gZm9yIGljbXAgcGFja2V0cyAqLworCQkJb3V0aWNtcC0+aWNtcF9ja3N1bSA9IDA7CisJCQlvdXRpY21wLT5pY21wX2Nrc3VtID0gaW5ldF9ja3N1bSgodWludDE2X3QgKilvdXRpY21wLAorCQkJCQkJcGFja2xlbiAtIChzaXplb2YoKm91dGlwKSArIG9wdGxlbikpOworCQkJaWYgKG91dGljbXAtPmljbXBfY2tzdW0gPT0gMCkKKwkJCQlvdXRpY21wLT5pY21wX2Nrc3VtID0gMHhmZmZmOworCQl9CisJfQorCisvL0JVRyEgdmVyYm9zZSBpcyAoeCAmIE9QVF9WRVJCT1NFKSwgbm90IGEgY291bnRlciEKKyNpZiAwIC8vRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFCisJLyogWFhYIHVuZG9jdW1lbnRlZCBkZWJ1Z2dpbmcgaGFjayAqLworCWlmICh2ZXJib3NlID4gMSkgeworCQljb25zdCB1aW50MTZfdCAqc3A7CisJCWludCBuc2hvcnRzLCBpOworCisJCXNwID0gKHVpbnQxNl90ICopb3V0aXA7CisJCW5zaG9ydHMgPSAodW5zaWduZWQpcGFja2xlbiAvIHNpemVvZih1aW50MTZfdCk7CisJCWkgPSAwOworCQlwcmludGYoIlsgJWQgYnl0ZXMiLCBwYWNrbGVuKTsKKwkJd2hpbGUgKC0tbnNob3J0cyA+PSAwKSB7CisJCQlpZiAoKGkrKyAlIDgpID09IDApCisJCQkJcHJpbnRmKCJcblx0Iik7CisJCQlwcmludGYoIiAlMDR4IiwgbnRvaHMoKnNwKSk7CisJCQlzcCsrOworCQl9CisJCWlmIChwYWNrbGVuICYgMSkgeworCQkJaWYgKChpICUgOCkgPT0gMCkKKwkJCQlwcmludGYoIlxuXHQiKTsKKwkJCXByaW50ZigiICUwMngiLCAqKHVuc2lnbmVkIGNoYXIgKilzcCk7CisJCX0KKwkJcHJpbnRmKCJdXG4iKTsKKwl9CisjZW5kaWYKKworI2lmIEVOQUJMRV9UUkFDRVJPVVRFNgorCWlmIChkZXN0X2xzYS0+dS5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVDYpIHsKKwkJcmVzID0gc2V0c29ja29wdF9pbnQoc25kc29jaywgU09MX0lQVjYsIElQVjZfVU5JQ0FTVF9IT1BTLCB0dGwpOworCQlpZiAocmVzICE9IDApCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNldHNvY2tvcHQoJXMpICVkIiwgIlVOSUNBU1RfSE9QUyIsIHR0bCk7CisJCW91dCA9IG91dGlwOworCQlsZW4gPSBwYWNrbGVuOworCX0gZWxzZQorI2VuZGlmCisJeworI2lmIGRlZmluZWQgSVBfVFRMCisJCXJlcyA9IHNldHNvY2tvcHRfaW50KHNuZHNvY2ssIElQUFJPVE9fSVAsIElQX1RUTCwgdHRsKTsKKwkJaWYgKHJlcyAhPSAwKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZXRzb2Nrb3B0KCVzKSAlZCIsICJUVEwiLCB0dGwpOworI2VuZGlmCisJCW91dCA9IG91dGljbXA7CisJCWxlbiA9IHBhY2tsZW4gLSBzaXplb2YoKm91dGlwKTsKKwkJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9VU0VfSUNNUCkpIHsKKwkJCW91dCA9IG91dGRhdGE7CisJCQlsZW4gLT0gc2l6ZW9mKCpvdXR1ZHApOworCQkJc2V0X25wb3J0KCZkZXN0X2xzYS0+dS5zYSwgaHRvbnMocG9ydCArIHNlcSkpOworCQl9CisJfQorCisJcmVzID0geHNlbmR0byhzbmRzb2NrLCBvdXQsIGxlbiwgJmRlc3RfbHNhLT51LnNhLCBkZXN0X2xzYS0+bGVuKTsKKwlpZiAocmVzICE9IGxlbikKKwkJYmJfaW5mb19tc2coInNlbnQgJWQgb2N0ZXRzLCByZXQ9JWQiLCBsZW4sIHJlcyk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1ZFUkJPU0UKKy8qCisgKiBDb252ZXJ0IGFuIElDTVAgInR5cGUiIGZpZWxkIHRvIGEgcHJpbnRhYmxlIHN0cmluZy4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKgorcHJfdHlwZSh1bnNpZ25lZCBjaGFyIHQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHR0YWJbXSA9IHsKKwkiRWNobyBSZXBseSIsICAgIklDTVAgMSIsICAgICAgICJJQ01QIDIiLCAgICAgICAiRGVzdCBVbnJlYWNoYWJsZSIsCisJIlNvdXJjZSBRdWVuY2giLCAiUmVkaXJlY3QiLCAgICAiSUNNUCA2IiwgICAgICAgIklDTVAgNyIsCisJIkVjaG8iLCAgICAgICAgICJSb3V0ZXIgQWR2ZXJ0IiwgIlJvdXRlciBTb2xpY2l0IiwgIlRpbWUgRXhjZWVkZWQiLAorCSJQYXJhbSBQcm9ibGVtIiwgIlRpbWVzdGFtcCIsICAgIlRpbWVzdGFtcCBSZXBseSIsICJJbmZvIFJlcXVlc3QiLAorCSJJbmZvIFJlcGx5IiwgICAiTWFzayBSZXF1ZXN0IiwgIk1hc2sgUmVwbHkiCisJfTsKKyMgaWYgRU5BQkxFX1RSQUNFUk9VVEU2CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHR0YWI2W10gPSB7CitbMF0JIkVycm9yIiwgIkRlc3QgVW5yZWFjaGFibGUiLCAiUGFja2V0IFRvbyBCaWciLCAiVGltZSBFeGNlZWRlZCIsCitbNF0JIlBhcmFtIFByb2JsZW0iLAorWzhdCSJFY2hvIFJlcXVlc3QiLCAiRWNobyBSZXBseSIsICJNZW1iZXJzaGlwIFF1ZXJ5IiwgIk1lbWJlcnNoaXAgUmVwb3J0IiwKK1sxMl0JIk1lbWJlcnNoaXAgUmVkdWN0aW9uIiwgIlJvdXRlciBTb2xpY2l0IiwgIlJvdXRlciBBZHZlcnQiLCAiTmVpZ2hib3IgU29saWNpdCIsCitbMTZdCSJOZWlnaGJvciBBZHZlcnQiLCAiUmVkaXJlY3QiLAorCX07CisKKwlpZiAoZGVzdF9sc2EtPnUuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCWlmICh0IDwgNSkKKwkJCXJldHVybiB0dGFiNlt0XTsKKwkJaWYgKHQgPCAxMjggfHwgdCA+IE5EX1JFRElSRUNUKQorCQkJcmV0dXJuICJPVVQtT0YtUkFOR0UiOworCQlyZXR1cm4gdHRhYjZbKHQgJiA2MykgKyA4XTsKKwl9CisjIGVuZGlmCisJaWYgKHQgPj0gQVJSQVlfU0laRSh0dGFiKSkKKwkJcmV0dXJuICJPVVQtT0YtUkFOR0UiOworCisJcmV0dXJuIHR0YWJbdF07Cit9CisjZW5kaWYKKworI2lmICFFTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1ZFUkJPU0UKKyNkZWZpbmUgcGFja2V0NF9vayhyZWFkX2xlbiwgZnJvbSwgc2VxKSBcCisJcGFja2V0NF9vayhyZWFkX2xlbiwgc2VxKQorI2VuZGlmCitzdGF0aWMgaW50CitwYWNrZXQ0X29rKGludCByZWFkX2xlbiwgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luICpmcm9tLCBpbnQgc2VxKQoreworCWNvbnN0IHN0cnVjdCBpY21wICppY3A7CisJdW5zaWduZWQgY2hhciB0eXBlLCBjb2RlOworCWludCBobGVuOworCWNvbnN0IHN0cnVjdCBpcCAqaXA7CisKKwlpcCA9IChzdHJ1Y3QgaXAgKikgcmVjdl9wa3Q7CisJaGxlbiA9IGlwLT5pcF9obCA8PCAyOworCWlmIChyZWFkX2xlbiA8IGhsZW4gKyBJQ01QX01JTkxFTikgeworI2lmIEVOQUJMRV9GRUFUVVJFX1RSQUNFUk9VVEVfVkVSQk9TRQorCQlpZiAodmVyYm9zZSkKKwkJCXByaW50ZigicGFja2V0IHRvbyBzaG9ydCAoJWQgYnl0ZXMpIGZyb20gJXNcbiIsIHJlYWRfbGVuLAorCQkJCWluZXRfbnRvYShmcm9tLT5zaW5fYWRkcikpOworI2VuZGlmCisJCXJldHVybiAwOworCX0KKwlyZWFkX2xlbiAtPSBobGVuOworCWljcCA9IChzdHJ1Y3QgaWNtcCAqKShyZWN2X3BrdCArIGhsZW4pOworCXR5cGUgPSBpY3AtPmljbXBfdHlwZTsKKwljb2RlID0gaWNwLT5pY21wX2NvZGU7CisJLyogUGF0aCBNVFUgRGlzY292ZXJ5IChSRkMxMTkxKSAqLworCXBtdHUgPSAwOworCWlmIChjb2RlID09IElDTVBfVU5SRUFDSF9ORUVERlJBRykKKwkJcG10dSA9IG50b2hzKGljcC0+aWNtcF9uZXh0bXR1KTsKKworCWlmICgodHlwZSA9PSBJQ01QX1RJTVhDRUVEICYmIGNvZGUgPT0gSUNNUF9USU1YQ0VFRF9JTlRSQU5TKQorCSB8fCB0eXBlID09IElDTVBfVU5SRUFDSAorCSB8fCB0eXBlID09IElDTVBfRUNIT1JFUExZCisJKSB7CisJCWNvbnN0IHN0cnVjdCBpcCAqaGlwOworCQljb25zdCBzdHJ1Y3QgdWRwaGRyICp1cDsKKworCQloaXAgPSAmaWNwLT5pY21wX2lwOworCQlobGVuID0gaGlwLT5pcF9obCA8PCAyOworCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9VU0VfSUNNUCkgeworCQkJc3RydWN0IGljbXAgKmhpY21wOworCisJCQkvKiBYWFggKi8KKwkJCWlmICh0eXBlID09IElDTVBfRUNIT1JFUExZCisJCQkgJiYgaWNwLT5pY21wX2lkID09IGh0b25zKGlkZW50KQorCQkJICYmIGljcC0+aWNtcF9zZXEgPT0gaHRvbnMoc2VxKQorCQkJKSB7CisJCQkJcmV0dXJuIElDTVBfVU5SRUFDSF9QT1JUKzE7CisJCQl9CisKKwkJCWhpY21wID0gKHN0cnVjdCBpY21wICopKCh1bnNpZ25lZCBjaGFyICopaGlwICsgaGxlbik7CisJCQlpZiAoaGxlbiArIFNJWkVPRl9JQ01QX0hEUiA8PSByZWFkX2xlbgorCQkJICYmIGhpcC0+aXBfcCA9PSBJUFBST1RPX0lDTVAKKwkJCSAmJiBoaWNtcC0+aWNtcF9pZCA9PSBodG9ucyhpZGVudCkKKwkJCSAmJiBoaWNtcC0+aWNtcF9zZXEgPT0gaHRvbnMoc2VxKQorCQkJKSB7CisJCQkJcmV0dXJuICh0eXBlID09IElDTVBfVElNWENFRUQgPyAtMSA6IGNvZGUgKyAxKTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCXVwID0gKHN0cnVjdCB1ZHBoZHIgKikoKGNoYXIgKiloaXAgKyBobGVuKTsKKwkJCWlmIChobGVuICsgMTIgPD0gcmVhZF9sZW4KKwkJCSAmJiBoaXAtPmlwX3AgPT0gSVBQUk9UT19VRFAKKy8vIE9mZjogc2luY2Ugd2UgZG8gbm90IGZvcm0gdGhlIGVudGlyZSBJUCBwYWNrZXQsCisvLyBidXQgZGVmZXIgaXQgdG8ga2VybmVsLCB3ZSBjYW4ndCBzZXQgc291cmNlIHBvcnQsCisvLyBhbmQgdGh1cyBjYW4ndCBjaGVjayBpdCBoZXJlIGluIHRoZSByZXBseQorCQkJLyogJiYgdXAtPnNvdXJjZSA9PSBodG9ucyhpZGVudCkgKi8KKwkJCSAmJiB1cC0+ZGVzdCA9PSBodG9ucyhwb3J0ICsgc2VxKQorCQkJKSB7CisJCQkJcmV0dXJuICh0eXBlID09IElDTVBfVElNWENFRUQgPyAtMSA6IGNvZGUgKyAxKTsKKwkJCX0KKwkJfQorCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1ZFUkJPU0UKKwlpZiAodmVyYm9zZSkgeworCQlpbnQgaTsKKwkJdWludDMyX3QgKmxwID0gKHVpbnQzMl90ICopJmljcC0+aWNtcF9pcDsKKworCQlwcmludGYoIlxuJWQgYnl0ZXMgZnJvbSAlcyB0byAiCisJCSAgICAgICAiJXM6IGljbXAgdHlwZSAlZCAoJXMpIGNvZGUgJWRcbiIsCisJCQlyZWFkX2xlbiwgaW5ldF9udG9hKGZyb20tPnNpbl9hZGRyKSwKKwkJCWluZXRfbnRvYShpcC0+aXBfZHN0KSwKKwkJCXR5cGUsIHByX3R5cGUodHlwZSksIGljcC0+aWNtcF9jb2RlKTsKKwkJZm9yIChpID0gNDsgaSA8IHJlYWRfbGVuOyBpICs9IHNpemVvZigqbHApKQorCQkJcHJpbnRmKCIlMmQ6IHglOC44eFxuIiwgaSwgKmxwKyspOworCX0KKyNlbmRpZgorCXJldHVybiAwOworfQorCisjaWYgRU5BQkxFX1RSQUNFUk9VVEU2CisjIGlmICFFTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1ZFUkJPU0UKKyNkZWZpbmUgcGFja2V0X29rKHJlYWRfbGVuLCBmcm9tX2xzYSwgdG8sIHNlcSkgXAorCXBhY2tldF9vayhyZWFkX2xlbiwgZnJvbV9sc2EsIHNlcSkKKyMgZW5kaWYKK3N0YXRpYyBpbnQKK3BhY2tldF9vayhpbnQgcmVhZF9sZW4sIGxlbl9hbmRfc29ja2FkZHIgKmZyb21fbHNhLAorCQkJc3RydWN0IHNvY2thZGRyICp0bywKKwkJCWludCBzZXEpCit7CisJY29uc3Qgc3RydWN0IGljbXA2X2hkciAqaWNwOworCXVuc2lnbmVkIGNoYXIgdHlwZSwgY29kZTsKKworCWlmIChmcm9tX2xzYS0+dS5zYS5zYV9mYW1pbHkgPT0gQUZfSU5FVCkKKwkJcmV0dXJuIHBhY2tldDRfb2socmVhZF9sZW4sICZmcm9tX2xzYS0+dS5zaW4sIHNlcSk7CisKKwlpY3AgPSAoc3RydWN0IGljbXA2X2hkciAqKSByZWN2X3BrdDsKKworCXR5cGUgPSBpY3AtPmljbXA2X3R5cGU7CisJY29kZSA9IGljcC0+aWNtcDZfY29kZTsKKworCWlmICgodHlwZSA9PSBJQ01QNl9USU1FX0VYQ0VFREVEICYmIGNvZGUgPT0gSUNNUDZfVElNRV9FWENFRURfVFJBTlNJVCkKKwkgfHwgdHlwZSA9PSBJQ01QNl9EU1RfVU5SRUFDSAorCSkgeworCQlzdHJ1Y3QgaXA2X2hkciAqaGlwOworCQlzdHJ1Y3QgdWRwaGRyICp1cDsKKwkJaW50IG5leHRoZHI7CisKKwkJaGlwID0gKHN0cnVjdCBpcDZfaGRyICopKGljcCArIDEpOworCQl1cCAgPSAoc3RydWN0IHVkcGhkciAqKSAoaGlwICsgMSk7CisJCW5leHRoZHIgPSBoaXAtPmlwNl9ueHQ7CisKKwkJaWYgKG5leHRoZHIgPT0gSVBQUk9UT19GUkFHTUVOVCkgeworCQkJbmV4dGhkciA9ICoodW5zaWduZWQgY2hhciopdXA7CisJCQl1cCsrOworCQl9CisJCWlmIChuZXh0aGRyID09IElQUFJPVE9fVURQKSB7CisJCQlzdHJ1Y3Qgb3V0ZGF0YTZfdCAqcGt0OworCisJCQlwa3QgPSAoc3RydWN0IG91dGRhdGE2X3QgKikgKHVwICsgMSk7CisKKwkJCWlmIChudG9obChwa3QtPmlkZW50NikgPT0gaWRlbnQKKwkJCSAmJiBudG9obChwa3QtPnNlcTYpID09IHNlcQorCQkJKSB7CisJCQkJcmV0dXJuICh0eXBlID09IElDTVA2X1RJTUVfRVhDRUVERUQgPyAtMSA6IChjb2RlPDw4KSsxKTsKKwkJCX0KKwkJfQorCX0KKworIyBpZiBFTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1ZFUkJPU0UKKwlpZiAodmVyYm9zZSkgeworCQl1bnNpZ25lZCBjaGFyICpwOworCQljaGFyIHBhMVtNQVhIT1NUTkFNRUxFTl07CisJCWNoYXIgcGEyW01BWEhPU1ROQU1FTEVOXTsKKwkJaW50IGk7CisKKwkJcCA9ICh1bnNpZ25lZCBjaGFyICopIChpY3AgKyAxKTsKKworCQlwcmludGYoIlxuJWQgYnl0ZXMgZnJvbSAlcyB0byAiCisJCSAgICAgICAiJXM6IGljbXAgdHlwZSAlZCAoJXMpIGNvZGUgJWRcbiIsCisJCQlyZWFkX2xlbiwKKwkJCWluZXRfbnRvcChBRl9JTkVUNiwgJmZyb21fbHNhLT51LnNpbjYuc2luNl9hZGRyLCBwYTEsIHNpemVvZihwYTEpKSwKKwkJCWluZXRfbnRvcChBRl9JTkVUNiwgJigoc3RydWN0IHNvY2thZGRyX2luNiopdG8pLT5zaW42X2FkZHIsIHBhMiwgc2l6ZW9mKHBhMikpLAorCQkJdHlwZSwgcHJfdHlwZSh0eXBlKSwgaWNwLT5pY21wNl9jb2RlKTsKKworCQlyZWFkX2xlbiAtPSBzaXplb2Yoc3RydWN0IGljbXA2X2hkcik7CisJCWZvciAoaSA9IDA7IGkgPCByZWFkX2xlbjsgaSsrKSB7CisJCQlpZiAoaSAlIDE2ID09IDApCisJCQkJcHJpbnRmKCIlMDR4OiIsIGkpOworCQkJaWYgKGkgJSA0ID09IDApCisJCQkJYmJfcHV0Y2hhcignICcpOworCQkJcHJpbnRmKCIlMDJ4IiwgcFtpXSk7CisJCQlpZiAoKGkgJSAxNiA9PSAxNSkgJiYgKGkgKyAxIDwgcmVhZF9sZW4pKQorCQkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCX0KKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9CisjIGVuZGlmCisKKwlyZXR1cm4gMDsKK30KKyNlbHNlIC8qICFFTkFCTEVfVFJBQ0VST1VURTYgKi8KK3N0YXRpYyBBTFdBWVNfSU5MSU5FIGludAorcGFja2V0X29rKGludCByZWFkX2xlbiwKKwkJbGVuX2FuZF9zb2NrYWRkciAqZnJvbV9sc2EgSUZfTk9UX0ZFQVRVUkVfVFJBQ0VST1VURV9WRVJCT1NFKFVOVVNFRF9QQVJBTSksCisJCXN0cnVjdCBzb2NrYWRkciAqdG8gVU5VU0VEX1BBUkFNLAorCQlpbnQgc2VxKQoreworCXJldHVybiBwYWNrZXQ0X29rKHJlYWRfbGVuLCAmZnJvbV9sc2EtPnUuc2luLCBzZXEpOworfQorI2VuZGlmCisKKy8qCisgKiBDb25zdHJ1Y3QgYW4gSW50ZXJuZXQgYWRkcmVzcyByZXByZXNlbnRhdGlvbi4KKyAqIElmIHRoZSAtbiBmbGFnIGhhcyBiZWVuIHN1cHBsaWVkLCBnaXZlCisgKiBudW1lcmljIHZhbHVlLCBvdGhlcndpc2UgdHJ5IGZvciBzeW1ib2xpYyBuYW1lLgorICovCitzdGF0aWMgdm9pZAorcHJpbnRfaW5ldG5hbWUoY29uc3Qgc3RydWN0IHNvY2thZGRyICpmcm9tKQoreworCWNoYXIgKmluYSA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkX25vcG9ydChmcm9tKTsKKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX0FERFJfTlVNKSB7CisJCXByaW50ZigiICAlcyIsIGluYSk7CisJfSBlbHNlIHsKKwkJY2hhciAqbiA9IE5VTEw7CisKKwkJaWYgKGZyb20tPnNhX2ZhbWlseSAhPSBBRl9JTkVUCisJCSB8fCAoKHN0cnVjdCBzb2NrYWRkcl9pbiopZnJvbSktPnNpbl9hZGRyLnNfYWRkciAhPSBJTkFERFJfQU5ZCisJCSkgeworCQkJLyogVHJ5IHRvIHJldmVyc2UgcmVzb2x2ZSBpZiBpdCBpcyBub3QgMC4wLjAuMCAqLworCQkJbiA9IHhtYWxsb2Nfc29ja2FkZHIyaG9zdF9ub3BvcnQoKHN0cnVjdCBzb2NrYWRkciopZnJvbSk7CisJCX0KKwkJcHJpbnRmKCIgICVzICglcykiLCAobiA/IG4gOiBpbmEpLCBpbmEpOworCQlmcmVlKG4pOworCX0KKwlmcmVlKGluYSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludChpbnQgcmVhZF9sZW4sIGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqZnJvbSwgY29uc3Qgc3RydWN0IHNvY2thZGRyICp0bykKK3sKKwlwcmludF9pbmV0bmFtZShmcm9tKTsKKworCWlmICh2ZXJib3NlKSB7CisJCWNoYXIgKmluYSA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkX25vcG9ydCh0byk7CisjaWYgRU5BQkxFX1RSQUNFUk9VVEU2CisJCWlmICh0by0+c2FfZmFtaWx5ID09IEFGX0lORVQ2KSB7CisJCQlyZWFkX2xlbiAtPSBzaXplb2Yoc3RydWN0IGlwNl9oZHIpOworCQl9IGVsc2UKKyNlbmRpZgorCQl7CisJCQlzdHJ1Y3QgaXAgKmlwNHBhY2tldCA9IChzdHJ1Y3QgaXAqKXJlY3ZfcGt0OworCQkJcmVhZF9sZW4gLT0gaXA0cGFja2V0LT5pcF9obCA8PCAyOworCQl9CisJCXByaW50ZigiICVkIGJ5dGVzIHRvICVzIiwgcmVhZF9sZW4sIGluYSk7CisJCWZyZWUoaW5hKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9kZWx0YV9tcyh1bnNpZ25lZCB0MXAsIHVuc2lnbmVkIHQycCkKK3sKKwl1bnNpZ25lZCB0dCA9IHQycCAtIHQxcDsKKwlwcmludGYoIiAgJXUuJTAzdSBtcyIsIHR0IC8gMTAwMCwgdHQgJSAxMDAwKTsKK30KKworLyoKKyAqIFVzYWdlOiBbLWRGSWxucnZ4XSBbLWcgZ2F0ZXdheV0gWy1pIGlmYWNlXSBbLWYgZmlyc3RfdHRsXQorICogWy1tIG1heF90dGxdIFsgLXAgcG9ydF0gWy1xIG5xdWVyaWVzXSBbLXMgc3JjX2FkZHJdIFstdCB0b3NdCisgKiBbLXcgd2FpdHRpbWVdIFsteiBwYXVzZW1zZWNzXSBob3N0IFtwYWNrZXRsZW5dIgorICovCitzdGF0aWMgaW50Citjb21tb25fdHJhY2Vyb3V0ZV9tYWluKGludCBvcCwgY2hhciAqKmFyZ3YpCit7CisJaW50IG1pbnBhY2tldDsKKyNpZmRlZiBJUF9UT1MKKwlpbnQgdG9zID0gMDsKKyNlbmRpZgorCWludCBtYXhfdHRsID0gMzA7CisJaW50IG5wcm9iZXMgPSAzOworCWludCBmaXJzdF90dGwgPSAxOworCXVuc2lnbmVkIHBhdXNlbXNlY3MgPSAwOworCWNoYXIgKnNvdXJjZTsKKwljaGFyICpkZXZpY2U7CisJY2hhciAqdG9zX3N0cjsKKwljaGFyICptYXhfdHRsX3N0cjsKKwljaGFyICpwb3J0X3N0cjsKKwljaGFyICpucHJvYmVzX3N0cjsKKwljaGFyICp3YWl0dGltZV9zdHI7CisJY2hhciAqcGF1c2Vtc2Vjc19zdHI7CisJY2hhciAqZmlyc3RfdHRsX3N0cjsKKwljaGFyICpkZXN0X3N0cjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1NPVVJDRV9ST1VURQorCWxsaXN0X3QgKnNvdXJjZV9yb3V0ZV9saXN0ID0gTlVMTDsKKwlpbnQgbHNyciA9IDA7CisjZW5kaWYKKyNpZiBFTkFCTEVfVFJBQ0VST1VURTYKKwlzYV9mYW1pbHlfdCBhZjsKKyNlbHNlCisJZW51bSB7IGFmID0gQUZfSU5FVCB9OworI2VuZGlmCisJaW50IHR0bDsKKwlpbnQgc2VxOworCWxlbl9hbmRfc29ja2FkZHIgKmZyb21fbHNhOworCXN0cnVjdCBzb2NrYWRkciAqbGFzdGFkZHI7CisJc3RydWN0IHNvY2thZGRyICp0bzsKKworCUlOSVRfRygpOworCisJLyogbWluaW11bSAxIGFyZyAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xOngteCIgSUZfRkVBVFVSRV9UUkFDRVJPVVRFX1NPVVJDRV9ST1VURSgiOmc6OiIpOworCW9wIHw9IGdldG9wdDMyKGFyZ3YsIE9QVF9TVFJJTkcKKwkJLCAmdG9zX3N0ciwgJmRldmljZSwgJm1heF90dGxfc3RyLCAmcG9ydF9zdHIsICZucHJvYmVzX3N0cgorCQksICZzb3VyY2UsICZ3YWl0dGltZV9zdHIsICZwYXVzZW1zZWNzX3N0ciwgJmZpcnN0X3R0bF9zdHIKKyNpZiBFTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1NPVVJDRV9ST1VURQorCQksICZzb3VyY2Vfcm91dGVfbGlzdAorI2VuZGlmCisJKTsKKwlhcmd2ICs9IG9wdGluZDsKKworI2lmIDAgLyogSUdOT1JFRCAqLworCWlmIChvcCAmIE9QVF9JUF9DSEtTVU0pCisJCWJiX2Vycm9yX21zZygid2FybmluZzogaXAgY2hlY2tzdW1zIGRpc2FibGVkIik7CisjZW5kaWYKKyNpZmRlZiBJUF9UT1MKKwlpZiAob3AgJiBPUFRfVE9TKQorCQl0b3MgPSB4YXRvdV9yYW5nZSh0b3Nfc3RyLCAwLCAyNTUpOworI2VuZGlmCisJaWYgKG9wICYgT1BUX01BWF9UVEwpCisJCW1heF90dGwgPSB4YXRvdV9yYW5nZShtYXhfdHRsX3N0ciwgMSwgMjU1KTsKKwlpZiAob3AgJiBPUFRfUE9SVCkKKwkJcG9ydCA9IHhhdG91MTYocG9ydF9zdHIpOworCWlmIChvcCAmIE9QVF9OUFJPQkVTKQorCQlucHJvYmVzID0geGF0b3VfcmFuZ2UobnByb2Jlc19zdHIsIDEsIElOVF9NQVgpOworCWlmIChvcCAmIE9QVF9TT1VSQ0UpIHsKKwkJLyoKKwkJICogc2V0IHRoZSBpcCBzb3VyY2UgYWRkcmVzcyBvZiB0aGUgb3V0Ym91bmQKKwkJICogcHJvYmUgKGUuZy4sIG9uIGEgbXVsdGktaG9tZWQgaG9zdCkuCisJCSAqLworCQlpZiAoZ2V0dWlkKCkgIT0gMCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ195b3VfbXVzdF9iZV9yb290KTsKKwl9CisJaWYgKG9wICYgT1BUX1dBSVRUSU1FKQorCQl3YWl0dGltZSA9IHhhdG91X3JhbmdlKHdhaXR0aW1lX3N0ciwgMSwgMjQgKiA2MCAqIDYwKTsKKwlpZiAob3AgJiBPUFRfUEFVU0VfTVMpCisJCXBhdXNlbXNlY3MgPSB4YXRvdV9yYW5nZShwYXVzZW1zZWNzX3N0ciwgMCwgNjAgKiA2MCAqIDEwMDApOworCWlmIChvcCAmIE9QVF9GSVJTVF9UVEwpCisJCWZpcnN0X3R0bCA9IHhhdG91X3JhbmdlKGZpcnN0X3R0bF9zdHIsIDEsIG1heF90dGwpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVFJBQ0VST1VURV9TT1VSQ0VfUk9VVEUKKwlpZiAoc291cmNlX3JvdXRlX2xpc3QpIHsKKwkJd2hpbGUgKHNvdXJjZV9yb3V0ZV9saXN0KSB7CisJCQlsZW5fYW5kX3NvY2thZGRyICpsc2E7CisKKwkJCWlmIChsc3JyID49IE5HQVRFV0FZUykKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm8gbW9yZSB0aGFuICVkIGdhdGV3YXlzIiwgTkdBVEVXQVlTKTsKKwkJCWxzYSA9IHhob3N0X2FuZF9hZjJzb2NrYWRkcihsbGlzdF9wb3AoJnNvdXJjZV9yb3V0ZV9saXN0KSwgMCwgQUZfSU5FVCk7CisJCQlnd2xpc3RbbHNycl0gPSBsc2EtPnUuc2luLnNpbl9hZGRyLnNfYWRkcjsKKwkJCWZyZWUobHNhKTsKKwkJCSsrbHNycjsKKwkJfQorCQlvcHRsZW4gPSAobHNyciArIDEpICogc2l6ZW9mKGd3bGlzdFswXSk7CisJfQorI2VuZGlmCisKKwkvKiBQcm9jZXNzIGRlc3RpbmF0aW9uIGFuZCBvcHRpb25hbCBwYWNrZXQgc2l6ZSAqLworCW1pbnBhY2tldCA9IHNpemVvZigqb3V0aXApICsgU0laRU9GX0lDTVBfSERSICsgc2l6ZW9mKCpvdXRkYXRhKSArIG9wdGxlbjsKKwlpZiAoIShvcCAmIE9QVF9VU0VfSUNNUCkpCisJCW1pbnBhY2tldCArPSBzaXplb2YoKm91dHVkcCkgLSBTSVpFT0ZfSUNNUF9IRFI7CisjaWYgRU5BQkxFX1RSQUNFUk9VVEU2CisJYWYgPSBBRl9VTlNQRUM7CisJaWYgKG9wICYgT1BUX0lQVjQpCisJCWFmID0gQUZfSU5FVDsKKwlpZiAob3AgJiBPUFRfSVBWNikKKwkJYWYgPSBBRl9JTkVUNjsKKwlkZXN0X2xzYSA9IHhob3N0X2FuZF9hZjJzb2NrYWRkcihhcmd2WzBdLCBwb3J0LCBhZik7CisJYWYgPSBkZXN0X2xzYS0+dS5zYS5zYV9mYW1pbHk7CisJaWYgKGFmID09IEFGX0lORVQ2KQorCQltaW5wYWNrZXQgPSBzaXplb2Yoc3RydWN0IG91dGRhdGE2X3QpOworI2Vsc2UKKwlkZXN0X2xzYSA9IHhob3N0MnNvY2thZGRyKGFyZ3ZbMF0sIHBvcnQpOworI2VuZGlmCisJcGFja2xlbiA9IG1pbnBhY2tldDsKKwlpZiAoYXJndlsxXSkKKwkJcGFja2xlbiA9IHhhdG91bF9yYW5nZShhcmd2WzFdLCBtaW5wYWNrZXQsIDMyICogMTAyNCk7CisKKwkvKiBFbnN1cmUgdGhlIHNvY2tldCBmZHMgd29uJ3QgYmUgMCwgMSBvciAyICovCisJYmJfc2FuaXRpemVfc3RkaW8oKTsKKworI2lmIEVOQUJMRV9UUkFDRVJPVVRFNgorCWlmIChhZiA9PSBBRl9JTkVUNikgeworCQl4bW92ZV9mZCh4c29ja2V0KEFGX0lORVQ2LCBTT0NLX1JBVywgSVBQUk9UT19JQ01QVjYpLCByY3Zzb2NrKTsKKyMgaWZkZWYgSVBWNl9SRUNWUEtUSU5GTworCQlzZXRzb2Nrb3B0XzEocmN2c29jaywgU09MX0lQVjYsIElQVjZfUkVDVlBLVElORk8pOworCQlzZXRzb2Nrb3B0XzEocmN2c29jaywgU09MX0lQVjYsIElQVjZfMjI5MlBLVElORk8pOworIyBlbHNlCisJCXNldHNvY2tvcHRfMShyY3Zzb2NrLCBTT0xfSVBWNiwgSVBWNl9QS1RJTkZPKTsKKyMgZW5kaWYKKwl9IGVsc2UKKyNlbmRpZgorCXsKKwkJeG1vdmVfZmQoeHNvY2tldChBRl9JTkVULCBTT0NLX1JBVywgSVBQUk9UT19JQ01QKSwgcmN2c29jayk7CisJfQorCisjaWYgVFJBQ0VST1VURV9TT19ERUJVRworCWlmIChvcCAmIE9QVF9ERUJVRykKKwkJc2V0c29ja29wdF9TT0xfU09DS0VUXzEocmN2c29jaywgU09fREVCVUcpOworI2VuZGlmCisJaWYgKG9wICYgT1BUX0JZUEFTU19ST1VURSkKKwkJc2V0c29ja29wdF9TT0xfU09DS0VUXzEocmN2c29jaywgU09fRE9OVFJPVVRFKTsKKworI2lmIEVOQUJMRV9UUkFDRVJPVVRFNgorCWlmIChhZiA9PSBBRl9JTkVUNikgeworCQlpZiAoc2V0c29ja29wdF9pbnQocmN2c29jaywgU09MX1JBVywgSVBWNl9DSEVDS1NVTSwgMikgIT0gMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0c29ja29wdCglcykiLCAiSVBWNl9DSEVDS1NVTSIpOworCQl4bW92ZV9mZCh4c29ja2V0KGFmLCBTT0NLX0RHUkFNLCAwKSwgc25kc29jayk7CisJfSBlbHNlCisjZW5kaWYKKwl7CisJCWlmIChvcCAmIE9QVF9VU0VfSUNNUCkKKwkJCXhtb3ZlX2ZkKHhzb2NrZXQoQUZfSU5FVCwgU09DS19SQVcsIElQUFJPVE9fSUNNUCksIHNuZHNvY2spOworCQllbHNlCisJCQl4bW92ZV9mZCh4c29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApLCBzbmRzb2NrKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UUkFDRVJPVVRFX1NPVVJDRV9ST1VURSAmJiBkZWZpbmVkIElQX09QVElPTlMKKwkJaWYgKGxzcnIgPiAwKSB7CisJCQl1bnNpZ25lZCBjaGFyIG9wdGxpc3RbTUFYX0lQT1BUTEVOXTsKKwkJCXVuc2lnbmVkIHNpemU7CisKKwkJCS8qIGZpbmFsIGhvcCAqLworCQkJZ3dsaXN0W2xzcnJdID0gZGVzdF9sc2EtPnUuc2luLnNpbl9hZGRyLnNfYWRkcjsKKwkJCSsrbHNycjsKKworCQkJLyogZm9yY2UgNCBieXRlIGFsaWdubWVudCAqLworCQkJb3B0bGlzdFswXSA9IElQT1BUX05PUDsKKwkJCS8qIGxvb3NlIHNvdXJjZSByb3V0ZSBvcHRpb24gKi8KKwkJCW9wdGxpc3RbMV0gPSBJUE9QVF9MU1JSOworCQkJc2l6ZSA9IGxzcnIgKiBzaXplb2YoZ3dsaXN0WzBdKTsKKwkJCW9wdGxpc3RbMl0gPSBzaXplICsgMzsKKwkJCS8qIHBvaW50ZXIgdG8gTFNSUiBhZGRyZXNzZXMgKi8KKwkJCW9wdGxpc3RbM10gPSBJUE9QVF9NSU5PRkY7CisJCQltZW1jcHkob3B0bGlzdCArIDQsIGd3bGlzdCwgc2l6ZSk7CisKKwkJCWlmIChzZXRzb2Nrb3B0KHNuZHNvY2ssIElQUFJPVE9fSVAsIElQX09QVElPTlMsCisJCQkJCShjaGFyICopb3B0bGlzdCwgc2l6ZSArIHNpemVvZihnd2xpc3RbMF0pKSA8IDApIHsKKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIklQX09QVElPTlMiKTsKKwkJCX0KKwkJfQorI2VuZGlmCisJfQorCisjaWZkZWYgU09fU05EQlVGCisJaWYgKHNldHNvY2tvcHRfU09MX1NPQ0tFVF9pbnQoc25kc29jaywgU09fU05EQlVGLCBwYWNrbGVuKSAhPSAwKSB7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0c29ja29wdCglcykiLCAiU09fU05EQlVGIik7CisJfQorI2VuZGlmCisjaWZkZWYgSVBfVE9TCisJaWYgKChvcCAmIE9QVF9UT1MpICYmIHNldHNvY2tvcHRfaW50KHNuZHNvY2ssIElQUFJPVE9fSVAsIElQX1RPUywgdG9zKSAhPSAwKSB7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0c29ja29wdCglcykgJWQiLCAiVE9TIiwgdG9zKTsKKwl9CisjZW5kaWYKKyNpZmRlZiBJUF9ET05URlJBRworCWlmIChvcCAmIE9QVF9ET05UX0ZSQUdNTlQpCisJCXNldHNvY2tvcHRfMShzbmRzb2NrLCBJUFBST1RPX0lQLCBJUF9ET05URlJBRyk7CisjZW5kaWYKKyNpZiBUUkFDRVJPVVRFX1NPX0RFQlVHCisJaWYgKG9wICYgT1BUX0RFQlVHKQorCQlzZXRzb2Nrb3B0X1NPTF9TT0NLRVRfMShzbmRzb2NrLCBTT19ERUJVRyk7CisjZW5kaWYKKwlpZiAob3AgJiBPUFRfQllQQVNTX1JPVVRFKQorCQlzZXRzb2Nrb3B0X1NPTF9TT0NLRVRfMShzbmRzb2NrLCBTT19ET05UUk9VVEUpOworCisJb3V0aXAgPSB4emFsbG9jKHBhY2tsZW4pOworCisJaWRlbnQgPSBnZXRwaWQoKTsKKworCWlmIChhZiA9PSBBRl9JTkVUKSB7CisJCWlmIChvcCAmIE9QVF9VU0VfSUNNUCkgeworCQkJaWRlbnQgfD0gMHg4MDAwOworCQkJb3V0aWNtcC0+aWNtcF90eXBlID0gSUNNUF9FQ0hPOworCQkJb3V0aWNtcC0+aWNtcF9pZCA9IGh0b25zKGlkZW50KTsKKwkJCW91dGRhdGEgPSAoc3RydWN0IG91dGRhdGFfdCAqKSgoY2hhciAqKW91dGljbXAgKyBTSVpFT0ZfSUNNUF9IRFIpOworCQl9IGVsc2UgeworCQkJb3V0ZGF0YSA9IChzdHJ1Y3Qgb3V0ZGF0YV90ICopKG91dHVkcCArIDEpOworCQl9CisJfQorCisJaWYgKG9wICYgT1BUX0RFVklDRSkgLyogaG1tLCBkbyB3ZSBuZWVkIGVycm9yIGNoZWNrPyAqLworCQlzZXRzb2Nrb3B0X2JpbmR0b2RldmljZShzbmRzb2NrLCBkZXZpY2UpOworCisJaWYgKG9wICYgT1BUX1NPVVJDRSkgeworI2lmIEVOQUJMRV9UUkFDRVJPVVRFNgorLy8gVE9ETzogbmVlZCB4ZG90dGVkX2FuZF9hZjJzb2NrYWRkcj8KKwkJbGVuX2FuZF9zb2NrYWRkciAqc291cmNlX2xzYSA9IHhob3N0X2FuZF9hZjJzb2NrYWRkcihzb3VyY2UsIDAsIGFmKTsKKyNlbHNlCisJCWxlbl9hbmRfc29ja2FkZHIgKnNvdXJjZV9sc2EgPSB4ZG90dGVkMnNvY2thZGRyKHNvdXJjZSwgMCk7CisjZW5kaWYKKwkJLyogUGluZzQgZG9lcyB0aGlzICh3aHk/KSAqLworCQlpZiAoYWYgPT0gQUZfSU5FVCkKKwkJCWlmIChzZXRzb2Nrb3B0KHNuZHNvY2ssIElQUFJPVE9fSVAsIElQX01VTFRJQ0FTVF9JRiwKKwkJCQkJJnNvdXJjZV9sc2EtPnUuc2EsIHNvdXJjZV9sc2EtPmxlbikpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHNldCBtdWx0aWNhc3Qgc291cmNlIGludGVyZmFjZSIpOworLy9UT0RPOiB3ZSBjYW4gcXVlcnkgc291cmNlIHBvcnQgd2UgYm91bmQgdG8sCisvLyBhbmQgY2hlY2sgaXQgaW4gcmVwbGllcy4uLiBpZiB3ZSBjYXJlIGVub3VnaAorCQl4YmluZChzbmRzb2NrLCAmc291cmNlX2xzYS0+dS5zYSwgc291cmNlX2xzYS0+bGVuKTsKKwkJZnJlZShzb3VyY2VfbHNhKTsKKwl9CisjaWYgRU5BQkxFX1RSQUNFUk9VVEU2CisJZWxzZSBpZiAoYWYgPT0gQUZfSU5FVDYpIHsKKy8vVE9ETzogd2h5IHdlIGRvbid0IGRvIGl0IGZvciBJUHY0PworCQlsZW5fYW5kX3NvY2thZGRyICpzb3VyY2VfbHNhOworCisJCWludCBwcm9iZV9mZCA9IHhzb2NrZXQoYWYsIFNPQ0tfREdSQU0sIDApOworCQlpZiAob3AgJiBPUFRfREVWSUNFKQorCQkJc2V0c29ja29wdF9iaW5kdG9kZXZpY2UocHJvYmVfZmQsIGRldmljZSk7CisJCXNldF9ucG9ydCgmZGVzdF9sc2EtPnUuc2EsIGh0b25zKDEwMjUpKTsKKwkJLyogZHVtbXkgY29ubmVjdC4gbWFrZXMga2VybmVsIHBpY2sgc291cmNlIElQIChhbmQgcG9ydCkgKi8KKwkJeGNvbm5lY3QocHJvYmVfZmQsICZkZXN0X2xzYS0+dS5zYSwgZGVzdF9sc2EtPmxlbik7CisJCXNldF9ucG9ydCgmZGVzdF9sc2EtPnUuc2EsIGh0b25zKHBvcnQpKTsKKworCQkvKiByZWFkIElQIGFuZCBwb3J0ICovCisJCXNvdXJjZV9sc2EgPSBnZXRfc29ja19sc2EocHJvYmVfZmQpOworCQlpZiAoc291cmNlX2xzYSA9PSBOVUxMKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGdldCBwcm9iZSBhZGRyIik7CisKKwkJY2xvc2UocHJvYmVfZmQpOworCisJCS8qIGJpbmQgb3VyIHNvY2tldHMgdG8gdGhpcyBJUCAoYnV0IG5vdCBwb3J0KSAqLworCQlzZXRfbnBvcnQoJnNvdXJjZV9sc2EtPnUuc2EsIDApOworCQl4YmluZChzbmRzb2NrLCAmc291cmNlX2xzYS0+dS5zYSwgc291cmNlX2xzYS0+bGVuKTsKKwkJeGJpbmQocmN2c29jaywgJnNvdXJjZV9sc2EtPnUuc2EsIHNvdXJjZV9sc2EtPmxlbik7CisKKwkJZnJlZShzb3VyY2VfbHNhKTsKKwl9CisjZW5kaWYKKworCS8qIFJldmVydCB0byBub24tcHJpdmlsZWdlZCB1c2VyIGFmdGVyIG9wZW5pbmcgc29ja2V0cyAqLworCXhzZXRnaWQoZ2V0Z2lkKCkpOworCXhzZXR1aWQoZ2V0dWlkKCkpOworCisJZGVzdF9zdHIgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZF9ub3BvcnQoJmRlc3RfbHNhLT51LnNhKTsKKwlwcmludGYoInRyYWNlcm91dGUgdG8gJXMgKCVzKSIsIGFyZ3ZbMF0sIGRlc3Rfc3RyKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZnJlZShkZXN0X3N0cik7CisJfQorCisJaWYgKG9wICYgT1BUX1NPVVJDRSkKKwkJcHJpbnRmKCIgZnJvbSAlcyIsIHNvdXJjZSk7CisJcHJpbnRmKCIsICVkIGhvcHMgbWF4LCAlZCBieXRlIHBhY2tldHNcbiIsIG1heF90dGwsIHBhY2tsZW4pOworCisJZnJvbV9sc2EgPSB4bWVtZHVwKGRlc3RfbHNhLCBMU0FfTEVOX1NJWkUgKyBkZXN0X2xzYS0+bGVuKTsKKwlsYXN0YWRkciA9IHh6YWxsb2MoZGVzdF9sc2EtPmxlbik7CisJdG8gPSB4emFsbG9jKGRlc3RfbHNhLT5sZW4pOworCXNlcSA9IDA7CisJZm9yICh0dGwgPSBmaXJzdF90dGw7IHR0bCA8PSBtYXhfdHRsOyArK3R0bCkgeworCQlpbnQgcHJvYmU7CisJCWludCB1bnJlYWNoYWJsZSA9IDA7IC8qIGNvdW50ZXIgKi8KKwkJaW50IGdvdGxhc3RhZGRyID0gMDsgLyogZmxhZ3MgKi8KKwkJaW50IGdvdF90aGVyZSA9IDA7CisKKwkJcHJpbnRmKCIlMmQiLCB0dGwpOworCQlmb3IgKHByb2JlID0gMDsgcHJvYmUgPCBucHJvYmVzOyArK3Byb2JlKSB7CisJCQlpbnQgcmVhZF9sZW47CisJCQl1bnNpZ25lZCB0MTsKKwkJCXVuc2lnbmVkIHQyOworCQkJaW50IGxlZnRfbXM7CisJCQlzdHJ1Y3QgaXAgKmlwOworCisJCQlmZmx1c2hfYWxsKCk7CisJCQlpZiAocHJvYmUgIT0gMCAmJiBwYXVzZW1zZWNzID4gMCkKKwkJCQl1c2xlZXAocGF1c2Vtc2VjcyAqIDEwMDApOworCisJCQlzZW5kX3Byb2JlKCsrc2VxLCB0dGwpOworCQkJdDIgPSB0MSA9IG1vbm90b25pY191cygpOworCisJCQlsZWZ0X21zID0gd2FpdHRpbWUgKiAxMDAwOworCQkJd2hpbGUgKChyZWFkX2xlbiA9IHdhaXRfZm9yX3JlcGx5KGZyb21fbHNhLCB0bywgJnQyLCAmbGVmdF9tcykpICE9IDApIHsKKwkJCQlpbnQgaWNtcF9jb2RlOworCisJCQkJLyogUmVjdidlZCBhIHBhY2tldCwgb3IgcmVhZCBlcnJvciAqLworCQkJCS8qIHQyID0gbW9ub3RvbmljX3VzKCkgLSBzZXQgYnkgd2FpdF9mb3JfcmVwbHkgKi8KKworCQkJCWlmIChyZWFkX2xlbiA8IDApCisJCQkJCWNvbnRpbnVlOworCQkJCWljbXBfY29kZSA9IHBhY2tldF9vayhyZWFkX2xlbiwgZnJvbV9sc2EsIHRvLCBzZXEpOworCQkJCS8qIFNraXAgc2hvcnQgcGFja2V0ICovCisJCQkJaWYgKGljbXBfY29kZSA9PSAwKQorCQkJCQljb250aW51ZTsKKworCQkJCWlmICghZ290bGFzdGFkZHIKKwkJCQkgfHwgKG1lbWNtcChsYXN0YWRkciwgJmZyb21fbHNhLT51LnNhLCBmcm9tX2xzYS0+bGVuKSAhPSAwKQorCQkJCSkgeworCQkJCQlwcmludChyZWFkX2xlbiwgJmZyb21fbHNhLT51LnNhLCB0byk7CisJCQkJCW1lbWNweShsYXN0YWRkciwgJmZyb21fbHNhLT51LnNhLCBmcm9tX2xzYS0+bGVuKTsKKwkJCQkJZ290bGFzdGFkZHIgPSAxOworCQkJCX0KKworCQkJCXByaW50X2RlbHRhX21zKHQxLCB0Mik7CisJCQkJaXAgPSAoc3RydWN0IGlwICopcmVjdl9wa3Q7CisKKwkJCQlpZiAoZnJvbV9sc2EtPnUuc2Euc2FfZmFtaWx5ID09IEFGX0lORVQpCisJCQkJCWlmIChvcCAmIE9QVF9UVExfRkxBRykKKwkJCQkJCXByaW50ZigiICglZCkiLCBpcC0+aXBfdHRsKTsKKworCQkJCS8qIHRpbWUgZXhjZWVkZWQgaW4gdHJhbnNpdCAqLworCQkJCWlmIChpY21wX2NvZGUgPT0gLTEpCisJCQkJCWJyZWFrOworCQkJCWljbXBfY29kZS0tOworCQkJCXN3aXRjaCAoaWNtcF9jb2RlKSB7CisjaWYgRU5BQkxFX1RSQUNFUk9VVEU2CisJCQkJY2FzZSBJQ01QNl9EU1RfVU5SRUFDSF9OT1BPUlQgPDwgODoKKwkJCQkJZ290X3RoZXJlID0gMTsKKwkJCQkJYnJlYWs7CisjZW5kaWYKKwkJCQljYXNlIElDTVBfVU5SRUFDSF9QT1JUOgorCQkJCQlpZiAoaXAtPmlwX3R0bCA8PSAxKQorCQkJCQkJcHJpbnRmKCIgISIpOworCQkJCQlnb3RfdGhlcmUgPSAxOworCQkJCQlicmVhazsKKworCQkJCWNhc2UgSUNNUF9VTlJFQUNIX05FVDoKKyNpZiBFTkFCTEVfVFJBQ0VST1VURTYgJiYgKElDTVA2X0RTVF9VTlJFQUNIX05PUk9VVEUgIT0gSUNNUF9VTlJFQUNIX05FVCkKKwkJCQljYXNlIElDTVA2X0RTVF9VTlJFQUNIX05PUk9VVEUgPDwgODoKKyNlbmRpZgorCQkJCQlwcmludGYoIiAhTiIpOworCQkJCQkrK3VucmVhY2hhYmxlOworCQkJCQlicmVhazsKKwkJCQljYXNlIElDTVBfVU5SRUFDSF9IT1NUOgorI2lmIEVOQUJMRV9UUkFDRVJPVVRFNgorCQkJCWNhc2UgSUNNUDZfRFNUX1VOUkVBQ0hfQUREUiA8PCA4OgorI2VuZGlmCisJCQkJCXByaW50ZigiICFIIik7CisJCQkJCSsrdW5yZWFjaGFibGU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgSUNNUF9VTlJFQUNIX1BST1RPQ09MOgorCQkJCQlwcmludGYoIiAhUCIpOworCQkJCQlnb3RfdGhlcmUgPSAxOworCQkJCQlicmVhazsKKwkJCQljYXNlIElDTVBfVU5SRUFDSF9ORUVERlJBRzoKKwkJCQkJcHJpbnRmKCIgIUYtJWQiLCBwbXR1KTsKKwkJCQkJKyt1bnJlYWNoYWJsZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJQ01QX1VOUkVBQ0hfU1JDRkFJTDoKKyNpZiBFTkFCTEVfVFJBQ0VST1VURTYKKwkJCQljYXNlIElDTVA2X0RTVF9VTlJFQUNIX0FETUlOIDw8IDg6CisjZW5kaWYKKwkJCQkJcHJpbnRmKCIgIVMiKTsKKwkJCQkJKyt1bnJlYWNoYWJsZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJQ01QX1VOUkVBQ0hfRklMVEVSX1BST0hJQjoKKwkJCQljYXNlIElDTVBfVU5SRUFDSF9ORVRfUFJPSElCOiAgIC8qIG1pc3VzZSAqLworCQkJCQlwcmludGYoIiAhQSIpOworCQkJCQkrK3VucmVhY2hhYmxlOworCQkJCQlicmVhazsKKwkJCQljYXNlIElDTVBfVU5SRUFDSF9IT1NUX1BST0hJQjoKKwkJCQkJcHJpbnRmKCIgIUMiKTsKKwkJCQkJKyt1bnJlYWNoYWJsZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJQ01QX1VOUkVBQ0hfSE9TVF9QUkVDRURFTkNFOgorCQkJCQlwcmludGYoIiAhViIpOworCQkJCQkrK3VucmVhY2hhYmxlOworCQkJCQlicmVhazsKKwkJCQljYXNlIElDTVBfVU5SRUFDSF9QUkVDRURFTkNFX0NVVE9GRjoKKwkJCQkJcHJpbnRmKCIgIUMiKTsKKwkJCQkJKyt1bnJlYWNoYWJsZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJQ01QX1VOUkVBQ0hfTkVUX1VOS05PV046CisJCQkJY2FzZSBJQ01QX1VOUkVBQ0hfSE9TVF9VTktOT1dOOgorCQkJCQlwcmludGYoIiAhVSIpOworCQkJCQkrK3VucmVhY2hhYmxlOworCQkJCQlicmVhazsKKwkJCQljYXNlIElDTVBfVU5SRUFDSF9JU09MQVRFRDoKKwkJCQkJcHJpbnRmKCIgIUkiKTsKKwkJCQkJKyt1bnJlYWNoYWJsZTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBJQ01QX1VOUkVBQ0hfVE9TTkVUOgorCQkJCWNhc2UgSUNNUF9VTlJFQUNIX1RPU0hPU1Q6CisJCQkJCXByaW50ZigiICFUIik7CisJCQkJCSsrdW5yZWFjaGFibGU7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXByaW50ZigiICE8JWQ+IiwgaWNtcF9jb2RlKTsKKwkJCQkJKyt1bnJlYWNoYWJsZTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfSAvKiB3aGlsZSAod2FpdCBhbmQgcmVhZCBhIHBhY2tldCkgKi8KKworCQkJLyogdGhlcmUgd2FzIG5vIHBhY2tldCBhdCBhbGw/ICovCisJCQlpZiAocmVhZF9sZW4gPT0gMCkKKwkJCQlwcmludGYoIiAgKiIpOworCQl9IC8qIGZvciAobnByb2JlcykgKi8KKworCQliYl9wdXRjaGFyKCdcbicpOworCQlpZiAoZ290X3RoZXJlCisJCSB8fCAodW5yZWFjaGFibGUgPiAwICYmIHVucmVhY2hhYmxlID49IG5wcm9iZXMgLSAxKQorCQkpIHsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZyZWUodG8pOworCQlmcmVlKGxhc3RhZGRyKTsKKwkJZnJlZShmcm9tX2xzYSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCB0cmFjZXJvdXRlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0cmFjZXJvdXRlX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlyZXR1cm4gY29tbW9uX3RyYWNlcm91dGVfbWFpbigwLCBhcmd2KTsKK30KKworI2lmIEVOQUJMRV9UUkFDRVJPVVRFNgoraW50IHRyYWNlcm91dGU2X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0cmFjZXJvdXRlNl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIGNvbW1vbl90cmFjZXJvdXRlX21haW4oT1BUX0lQVjYsIGFyZ3YpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3R1bmN0bC5jIGIvbmV0d29ya2luZy90dW5jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTA4NzBlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy90dW5jdGwuYwpAQCAtMCwwICsxLDE1NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdHVuIGRldmljZXMgY29udHJvbGxlcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBWbGFkaW1pciBEcm9ubmlrb3YgPGRyb25uaWtvdkBnbWFpbC5jb20+CisgKgorICogT3JpZ2luYWwgY29kZToKKyAqICAgICAgSmVmZiBEaWtlCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgdHVuY3RsX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWYgZGV2aWNlXSAoWy10IG5hbWVdIHwgLWQgbmFtZSkiIElGX0ZFQVRVUkVfVFVOQ1RMX1VHKCIgWy11IG93bmVyXSBbLWcgZ3JvdXBdIFstYl0iKQorLy91c2FnZTojZGVmaW5lIHR1bmN0bF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNyZWF0ZSBvciBkZWxldGUgdHVuIGludGVyZmFjZXNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYgbmFtZQkJdHVuIGRldmljZSAoL2Rldi9uZXQvdHVuKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXQgbmFtZQkJQ3JlYXRlIGlmYWNlICduYW1lJyIKKy8vdXNhZ2U6ICAgICAiXG4JLWQgbmFtZQkJRGVsZXRlIGlmYWNlICduYW1lJyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVFVOQ1RMX1VHKAorLy91c2FnZTogICAgICJcbgktdSBvd25lcglTZXQgaWZhY2Ugb3duZXIiCisvL3VzYWdlOiAgICAgIlxuCS1nIGdyb3VwCVNldCBpZmFjZSBncm91cCIKKy8vdXNhZ2U6ICAgICAiXG4JLWIJCUJyaWVmIG91dHB1dCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdHVuY3RsX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIjIHR1bmN0bFxuIgorLy91c2FnZTogICAgICAgIiMgdHVuY3RsIC1kIHR1bjBcbiIKKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl90dW4uaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBUVU5TRVRHUk9VUCBhcHBlYXJlZCBpbiAyLjYuMjMgKi8KKyNpZm5kZWYgVFVOU0VUR1JPVVAKKyNkZWZpbmUgVFVOU0VUR1JPVVAgX0lPVygnVCcsIDIwNiwgaW50KQorI2VuZGlmCisKKyNkZWZpbmUgSU9DVEwoYSwgYiwgYykgaW9jdGxfb3JfcGVycm9yX2FuZF9kaWUoYSwgYiwgYywgTlVMTCkKKworI2lmIDEKKworaW50IHR1bmN0bF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdHVuY3RsX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBmZDsKKwljb25zdCBjaGFyICpvcHRfbmFtZSA9ICJ0YXAlZCI7CisJY29uc3QgY2hhciAqb3B0X2RldmljZSA9ICIvZGV2L25ldC90dW4iOworI2lmIEVOQUJMRV9GRUFUVVJFX1RVTkNUTF9VRworCWNvbnN0IGNoYXIgKm9wdF91c2VyLCAqb3B0X2dyb3VwOworCWxvbmcgdXNlciA9IC0xLCBncm91cCA9IC0xOworI2VuZGlmCisJdW5zaWduZWQgb3B0czsKKworCWVudW0geworCQlPUFRfZiA9IDEgPDwgMCwgLy8gY29udHJvbCBkZXZpY2UgbmFtZSAoL2Rldi9uZXQvdHVuKQorCQlPUFRfdCA9IDEgPDwgMSwgLy8gY3JlYXRlIG5hbWVkIGludGVyZmFjZQorCQlPUFRfZCA9IDEgPDwgMiwgLy8gZGVsZXRlIG5hbWVkIGludGVyZmFjZQorI2lmIEVOQUJMRV9GRUFUVVJFX1RVTkNUTF9VRworCQlPUFRfdSA9IDEgPDwgMywgLy8gc2V0IG5ldyBpbnRlcmZhY2Ugb3duZXIKKwkJT1BUX2cgPSAxIDw8IDQsIC8vIHNldCBuZXcgaW50ZXJmYWNlIGdyb3VwCisJCU9QVF9iID0gMSA8PCA1LCAvLyBicmllZiBvdXRwdXQKKyNlbmRpZgorCX07CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MDp0LS1kOmQtLXQiOyAvLyBubyBhcmd1bWVudHM7IHQgXiBkCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJmOnQ6ZDoiIElGX0ZFQVRVUkVfVFVOQ1RMX1VHKCJ1Omc6YiIpLAorCQkJJm9wdF9kZXZpY2UsICZvcHRfbmFtZSwgJm9wdF9uYW1lCisJCQlJRl9GRUFUVVJFX1RVTkNUTF9VRygsICZvcHRfdXNlciwgJm9wdF9ncm91cCkpOworCisJLy8gc2VsZWN0IGRldmljZQorCW1lbXNldCgmaWZyLCAwLCBzaXplb2YoaWZyKSk7CisJaWZyLmlmcl9mbGFncyA9IElGRl9UQVAgfCBJRkZfTk9fUEk7CisJc3RybmNweV9JRk5BTVNJWihpZnIuaWZyX25hbWUsIG9wdF9uYW1lKTsKKworCS8vIG9wZW4gZGV2aWNlCisJZmQgPSB4b3BlbihvcHRfZGV2aWNlLCBPX1JEV1IpOworCUlPQ1RMKGZkLCBUVU5TRVRJRkYsICh2b2lkICopJmlmcik7CisKKwkvLyBkZWxldGU/CisJaWYgKG9wdHMgJiBPUFRfZCkgeworCQlJT0NUTChmZCwgVFVOU0VUUEVSU0lTVCwgKHZvaWQgKikodWludHB0cl90KTApOworCQliYl9pbmZvX21zZygiU2V0ICclcycgJXNwZXJzaXN0ZW50IiwgaWZyLmlmcl9uYW1lLCAibm9uIik7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJLy8gY3JlYXRlCisjaWYgRU5BQkxFX0ZFQVRVUkVfVFVOQ1RMX1VHCisJaWYgKG9wdHMgJiBPUFRfZykgeworCQlncm91cCA9IHhncm91cDJnaWQob3B0X2dyb3VwKTsKKwkJSU9DVEwoZmQsIFRVTlNFVEdST1VQLCAodm9pZCAqKSh1aW50cHRyX3QpZ3JvdXApOworCX0gZWxzZQorCQl1c2VyID0gZ2V0ZXVpZCgpOworCWlmIChvcHRzICYgT1BUX3UpCisJCXVzZXIgPSB4dW5hbWUydWlkKG9wdF91c2VyKTsKKwlJT0NUTChmZCwgVFVOU0VUT1dORVIsICh2b2lkICopKHVpbnRwdHJfdCl1c2VyKTsKKyNlbmRpZgorCUlPQ1RMKGZkLCBUVU5TRVRQRVJTSVNULCAodm9pZCAqKSh1aW50cHRyX3QpMSk7CisKKwkvLyBzaG93IGluZm8KKyNpZiBFTkFCTEVfRkVBVFVSRV9UVU5DVExfVUcKKwlpZiAob3B0cyAmIE9QVF9iKSB7CisJCXB1dHMoaWZyLmlmcl9uYW1lKTsKKwl9IGVsc2UgeworCQlwcmludGYoIlNldCAnJXMnICVzcGVyc2lzdGVudCIsIGlmci5pZnJfbmFtZSwgIiIpOworCQlwcmludGYoIiBhbmQgb3duZWQgYnkgdWlkICVsZCIsIHVzZXIpOworCQlpZiAoZ3JvdXAgIT0gLTEpCisJCQlwcmludGYoIiBnaWQgJWxkIiwgZ3JvdXApOworCQliYl9wdXRjaGFyKCdcbicpOworCX0KKyNlbHNlCisJcHV0cyhpZnIuaWZyX25hbWUpOworI2VuZGlmCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworI2Vsc2UKKworLyogLTIxMCBieXRlczogKi8KKworaW50IHR1bmN0bF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdHVuY3RsX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgaWZyZXEgaWZyOworCWludCBmZDsKKwljb25zdCBjaGFyICpvcHRfbmFtZSA9ICJ0YXAlZCI7CisJY29uc3QgY2hhciAqb3B0X2RldmljZSA9ICIvZGV2L25ldC90dW4iOworCXVuc2lnbmVkIG9wdHM7CisKKwllbnVtIHsKKwkJT1BUX2YgPSAxIDw8IDAsIC8vIGNvbnRyb2wgZGV2aWNlIG5hbWUgKC9kZXYvbmV0L3R1bikKKwkJT1BUX3QgPSAxIDw8IDEsIC8vIGNyZWF0ZSBuYW1lZCBpbnRlcmZhY2UKKwkJT1BUX2QgPSAxIDw8IDIsIC8vIGRlbGV0ZSBuYW1lZCBpbnRlcmZhY2UKKwl9OworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTA6dC0tZDpkLS10IjsgLy8gbm8gYXJndW1lbnRzOyB0IF4gZAorCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiZjp0OmQ6dTpnOmIiLCAvLyB1LCBnLCBiIGFjY2VwdGVkIGFuZCBpZ25vcmVkCisJCQkmb3B0X2RldmljZSwgJm9wdF9uYW1lLCAmb3B0X25hbWUsIE5VTEwsIE5VTEwpOworCisJLy8gc2V0IGludGVyZmFjZSBuYW1lCisJbWVtc2V0KCZpZnIsIDAsIHNpemVvZihpZnIpKTsKKwlpZnIuaWZyX2ZsYWdzID0gSUZGX1RBUCB8IElGRl9OT19QSTsKKwlzdHJuY3B5X0lGTkFNU0laKGlmci5pZnJfbmFtZSwgb3B0X25hbWUpOworCisJLy8gb3BlbiBkZXZpY2UKKwlmZCA9IHhvcGVuKG9wdF9kZXZpY2UsIE9fUkRXUik7CisJSU9DVEwoZmQsIFRVTlNFVElGRiwgKHZvaWQgKikmaWZyKTsKKworCS8vIGNyZWF0ZSBvciBkZWxldGUgaW50ZXJmYWNlCisJSU9DVEwoZmQsIFRVTlNFVFBFUlNJU1QsICh2b2lkICopKHVpbnRwdHJfdCkoMCA9PSAob3B0cyAmIE9QVF9kKSkpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3VkaGNwL0NvbmZpZy5zcmMgYi9uZXR3b3JraW5nL3VkaGNwL0NvbmZpZy5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM0YzhkNgotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvdWRoY3AvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDE2NSBAQAorIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworSU5TRVJUCisKK2NvbmZpZyBVREhDUEQKKwlib29sICJ1ZGhjcCBzZXJ2ZXIgKHVkaGNwZCkiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgdWRoY3BkIGlzIGEgREhDUCBzZXJ2ZXIgZ2VhcmVkIHByaW1hcmlseSB0b3dhcmQgZW1iZWRkZWQgc3lzdGVtcywKKwkgIHdoaWxlIHN0cml2aW5nIHRvIGJlIGZ1bGx5IGZ1bmN0aW9uYWwgYW5kIFJGQyBjb21wbGlhbnQuCisKK2NvbmZpZyBESENQUkVMQVkKKwlib29sICJkaGNwcmVsYXkiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBVREhDUEQKKwloZWxwCisJICBkaGNwcmVsYXkgbGlzdGVucyBmb3IgZGhjcCByZXF1ZXN0cyBvbiBvbmUgb3IgbW9yZSBpbnRlcmZhY2VzCisJICBhbmQgZm9yd2FyZHMgdGhlc2UgcmVxdWVzdHMgdG8gYSBkaWZmZXJlbnQgaW50ZXJmYWNlIG9yIGRoY3AKKwkgIHNlcnZlci4KKworY29uZmlnIERVTVBMRUFTRVMKKwlib29sICJMZWFzZSBkaXNwbGF5IHV0aWxpdHkgKGR1bXBsZWFzZXMpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVURIQ1BECisJaGVscAorCSAgZHVtcGxlYXNlcyBkaXNwbGF5cyB0aGUgbGVhc2VzIHdyaXR0ZW4gb3V0IGJ5IHRoZSB1ZGhjcGQgc2VydmVyLgorCSAgTGVhc2UgdGltZXMgYXJlIHN0b3JlZCBpbiB0aGUgZmlsZSBieSB0aW1lIHJlbWFpbmluZyBpbiBsZWFzZSwgb3IKKwkgIGJ5IHRoZSBhYnNvbHV0ZSB0aW1lIHRoYXQgaXQgZXhwaXJlcyBpbiBzZWNvbmRzIGZyb20gZXBvY2guCisKK2NvbmZpZyBGRUFUVVJFX1VESENQRF9XUklURV9MRUFTRVNfRUFSTFkKKwlib29sICJSZXdyaXRlIHRoZSBsZWFzZSBmaWxlIGF0IGV2ZXJ5IG5ldyBhY2tub3dsZWRnZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFVESENQRAorCWhlbHAKKwkgIElmIHNlbGVjdGVkLCB1ZGhjcGQgd2lsbCB3cml0ZSBhIG5ldyBmaWxlIHdpdGggbGVhc2VzIGV2ZXJ5CisJICB0aW1lIGEgbmV3IGxlYXNlIGhhcyBiZWVuIGFjY2VwdGVkLCB0aHVzIGVsaW1pbmF0aW5nIHRoZSBuZWVkCisJICB0byBzZW5kIFNJR1VTUjEgZm9yIHRoZSBpbml0aWFsIHdyaXRpbmcgb3IgdXBkYXRpbmcuIEFueSB0aW1lZAorCSAgcmV3cml0aW5nIHJlbWFpbnMgdW5kaXN0dXJiZWQuCisKK2NvbmZpZyBGRUFUVVJFX1VESENQRF9CQVNFX0lQX09OX01BQworCWJvb2wgIlNlbGVjdCBJUCBhZGRyZXNzIGJhc2VkIG9uIGNsaWVudCBNQUMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBVREhDUEQKKwloZWxwCisJICBJZiBzZWxlY3RlZCwgdWRoY3BkIHdpbGwgYmFzZSBpdHMgc2VsZWN0aW9uIG9mIElQIGFkZHJlc3MgdG8gb2ZmZXIKKwkgIG9uIHRoZSBjbGllbnQncyBoYXJkd2FyZSBhZGRyZXNzLiBPdGhlcndpc2UgdWRoY3BkIHVzZXMgdGhlIG5leHQKKwkgIGNvbnNlY3V0aXZlIGZyZWUgYWRkcmVzcy4KKworCSAgVGhpcyByZWR1Y2VzIHRoZSBmcmVxdWVuY3kgb2YgSVAgYWRkcmVzcyBjaGFuZ2VzIGZvciBjbGllbnRzCisJICB3aGljaCBsZXQgdGhlaXIgbGVhc2UgZXhwaXJlLCBhbmQgbWFrZXMgY29uc2VjdXRpdmUgREhDUE9GRkVSUworCSAgZm9yIHRoZSBzYW1lIGNsaWVudCB0byAoYWxtb3N0IGFsd2F5cykgY29udGFpbiB0aGUgc2FtZQorCSAgSVAgYWRkcmVzcy4KKworY29uZmlnIERIQ1BEX0xFQVNFU19GSUxFCisJc3RyaW5nICJBYnNvbHV0ZSBwYXRoIHRvIGxlYXNlIGZpbGUiCisJZGVmYXVsdCAiL3Zhci9saWIvbWlzYy91ZGhjcGQubGVhc2VzIgorCWRlcGVuZHMgb24gVURIQ1BECisJaGVscAorCSAgdWRoY3BkIHN0b3JlcyBhZGRyZXNzZXMgaW4gYSBsZWFzZSBmaWxlLiBUaGlzIGlzIHRoZSBhYnNvbHV0ZSBwYXRoCisJICBvZiB0aGUgZmlsZS4gTm9ybWFsbHkgaXQgaXMgc2FmZSB0byBsZWF2ZSBpdCB1bnRvdWNoZWQuCisKK2NvbmZpZyBVREhDUEMKKwlib29sICJ1ZGhjcCBjbGllbnQgKHVkaGNwYykiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgdWRoY3BjIGlzIGEgREhDUCBjbGllbnQgZ2VhcmVkIHByaW1hcmlseSB0b3dhcmQgZW1iZWRkZWQgc3lzdGVtcywKKwkgIHdoaWxlIHN0cml2aW5nIHRvIGJlIGZ1bGx5IGZ1bmN0aW9uYWwgYW5kIFJGQyBjb21wbGlhbnQuCisKKwkgIFRoZSB1ZGhjcCBjbGllbnQgbmVnb3RpYXRlcyBhIGxlYXNlIHdpdGggdGhlIERIQ1Agc2VydmVyIGFuZAorCSAgcnVucyBhIHNjcmlwdCB3aGVuIGEgbGVhc2UgaXMgb2J0YWluZWQgb3IgbG9zdC4KKworY29uZmlnIEZFQVRVUkVfVURIQ1BDX0FSUElORworCWJvb2wgIlZlcmlmeSB0aGF0IHRoZSBvZmZlcmVkIGFkZHJlc3MgaXMgZnJlZSwgdXNpbmcgQVJQIHBpbmciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBVREhDUEMKKwloZWxwCisJICBJZiBzZWxlY3RlZCwgdWRoY3BjIHdpbGwgc2VuZCBBUlAgcHJvYmVzIGFuZCBtYWtlIHN1cmUKKwkgIHRoZSBvZmZlcmVkIGFkZHJlc3MgaXMgcmVhbGx5IG5vdCBpbiB1c2UgYnkgYW55b25lLiBUaGUgY2xpZW50CisJICB3aWxsIERIQ1BERUNMSU5FIHRoZSBvZmZlciBpZiB0aGUgYWRkcmVzcyBpcyBpbiB1c2UsCisJICBhbmQgcmVzdGFydCB0aGUgZGlzY292ZXIgcHJvY2Vzcy4KKworY29uZmlnIEZFQVRVUkVfVURIQ1BDX1NBTklUSVpFT1BUCisJYm9vbCAiRG8gbm90IHBhc3MgbWFsZm9ybWVkIGhvc3QgYW5kIGRvbWFpbiBuYW1lcyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFVESENQQworCWhlbHAKKwkgIElmIHNlbGVjdGVkLCB1ZGhjcGMgd2lsbCBjaGVjayBzb21lIG9wdGlvbnMgKHN1Y2ggYXMgb3B0aW9uIDEyIC0KKwkgIGhvc3RuYW1lKSBhbmQgaWYgdGhleSBkb24ndCBsb29rIGxpa2UgdmFsaWQgaG9zdG5hbWVzCisJICAoZm9yIGV4YW1wbGUsIGlmIHRoZXkgc3RhcnQgd2l0aCBkYXNoIG9yIGNvbnRhaW4gc3BhY2VzKSwKKwkgIHRoZXkgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHN0cmluZyAiYmFkIiB3aGVuIGV4cG9ydGluZworCSAgdG8gdGhlIGVudmlyb25tZW50LgorCitjb25maWcgRkVBVFVSRV9VREhDUF9QT1JUCisJYm9vbCAiRW5hYmxlICctUCBwb3J0JyBvcHRpb24gZm9yIHVkaGNwZCBhbmQgdWRoY3BjIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gVURIQ1BEIHx8IFVESENQQworCWhlbHAKKwkgIEF0IHRoZSBjb3N0IG9mIH4zMDAgYnl0ZXMsIGVuYWJsZXMgLVAgcG9ydCBvcHRpb24uCisJICBUaGlzIGZlYXR1cmUgaXMgdHlwaWNhbGx5IG5vdCBuZWVkZWQuCisKK2NvbmZpZyBVREhDUF9ERUJVRworCWludCAiTWF4aW11bSB2ZXJib3NpdHkgbGV2ZWwgZm9yIHVkaGNwIGFwcGxldHMgKDAuLjkpIgorCWRlZmF1bHQgOQorCXJhbmdlIDAgOQorCWRlcGVuZHMgb24gVURIQ1BEIHx8IFVESENQQyB8fCBESENQUkVMQVkKKwloZWxwCisJICBWZXJib3NpdHkgY2FuIGJlIGluY3JlYXNlZCB3aXRoIG11bHRpcGxlIC12IG9wdGlvbnMuCisJICBUaGlzIG9wdGlvbiBjb250cm9scyBob3cgaGlnaCBpdCBjYW4gYmUgY3JhbmtlZCB1cC4KKworCSAgQmlnZ2VyIHZhbHVlcyByZXN1bHQgaW4gYmlnZ2VyIGNvZGUuIExldmVscyBhYm92ZSAxCisJICBhcmUgdmVyeSB2ZXJib3NlIGFuZCB1c2VmdWwgZm9yIGRlYnVnZ2luZyBvbmx5LgorCitjb25maWcgRkVBVFVSRV9VREhDUF9SRkMzMzk3CisJYm9vbCAiU3VwcG9ydCBmb3IgUkZDMzM5NyBkb21haW4gc2VhcmNoIChleHBlcmltZW50YWwpIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gVURIQ1BEIHx8IFVESENQQworCWhlbHAKKwkgIElmIHNlbGVjdGVkLCBib3RoIGNsaWVudCBhbmQgc2VydmVyIHdpbGwgc3VwcG9ydCBwYXNzaW5nIG9mIGRvbWFpbgorCSAgc2VhcmNoIGxpc3RzIHZpYSBvcHRpb24gMTE5LCBzcGVjaWZpZWQgaW4gUkZDIDMzOTcsCisJICBhbmQgU0lQIHNlcnZlcnMgb3B0aW9uIDEyMCwgc3BlY2lmaWVkIGluIFJGQyAzMzYxLgorCitjb25maWcgRkVBVFVSRV9VREhDUF84MDIxUQorCWJvb2wgIlN1cHBvcnQgZm9yIDgwMi4xUSBWTEFOIHBhcmFtZXRlcnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBVREhDUEQgfHwgVURIQ1BDCisJaGVscAorCSAgSWYgc2VsZWN0ZWQsIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgd2lsbCBzdXBwb3J0IHBhc3Npbmcgb2YgVkxBTgorCSAgSUQgYW5kIHByaW9yaXR5IHZpYSBvcHRpb25zIDEzMiBhbmQgMTMzIGFzIHBlciA4MDIuMVEuCisKK2NvbmZpZyBVREhDUENfREVGQVVMVF9TQ1JJUFQKKwlzdHJpbmcgIkFic29sdXRlIHBhdGggdG8gY29uZmlnIHNjcmlwdCIKKwlkZWZhdWx0ICIvdXNyL3NoYXJlL3VkaGNwYy9kZWZhdWx0LnNjcmlwdCIKKwlkZXBlbmRzIG9uIFVESENQQworCWhlbHAKKwkgIFRoaXMgc2NyaXB0IGlzIGNhbGxlZCBhZnRlciB1ZGhjcGMgcmVjZWl2ZXMgYW4gYW5zd2VyLiBTZWUKKwkgIGV4YW1wbGVzL3VkaGNwIGZvciBhIHdvcmtpbmcgZXhhbXBsZS4gTm9ybWFsbHkgaXQgaXMgc2FmZQorCSAgdG8gbGVhdmUgdGhpcyB1bnRvdWNoZWQuCisKK2NvbmZpZyBVREhDUENfU0xBQ0tfRk9SX0JVR0dZX1NFUlZFUlMKKwlpbnQgIkRIQ1Agb3B0aW9ucyBzbGFjayBidWZmZXIgc2l6ZSIKKwlkZWZhdWx0IDgwCisJcmFuZ2UgMCA5MjQKKwlkZXBlbmRzIG9uIFVESENQRCB8fCBVREhDUEMKKwloZWxwCisJICBTb21lIGJ1Z2d5IERIQ1Agc2VydmVycyBzZW5kIERIQ1Agb2ZmZXIgcGFja2V0cyB3aXRoIG9wdGlvbgorCSAgZmllbGQgbGFyZ2VyIHRoYW4gd2UgZXhwZWN0ICh3aGljaCBtaWdodCBhbHNvIGJlIGNvbnNpZGVyZWQgYQorCSAgYnVmZmVyIG92ZXJmbG93IGF0dGVtcHQpLiBUaGVzZSBwYWNrZXRzIGFyZSBub3JtYWxseSBkaXNjYXJkZWQuCisJICBJZiBjaXJjdW1zdGFuY2VzIGJleW9uZCB5b3VyIGNvbnRyb2wgZm9yY2UgeW91IHRvIHN1cHBvcnQgc3VjaAorCSAgc2VydmVycywgdGhpcyBtYXkgaGVscC4gVGhlIHVwcGVyIGxpbWl0ICg5MjQpIG1ha2VzIGRoY3BjIGFjY2VwdAorCSAgZXZlbiAxNTAwIGJ5dGUgcGFja2V0cyAobWF4aW11bS1zaXplZCBldGhlcm5ldCBwYWNrZXRzKS4KKworCSAgVGhpcyBvcHRpb24gZG9lcyBub3QgbWFrZSBkaGNwW2NkXSBlbWl0IG5vbi1zdGFuZGFyZAorCSAgc2l6ZWQgcGFja2V0cy4KKworCSAgS25vd24gYnVnZ3kgREhDUCBzZXJ2ZXJzOgorCSAgM0NvbSBPZmZpY2VDb25uZWN0IFJlbW90ZSA4MTIgQURTTCBSb3V0ZXI6CisJICAgIHNlZW1zIHRvIGNvbmZ1c2UgbWF4aW11bSBhbGxvd2VkIFVEUCBwYWNrZXQgc2l6ZSB3aXRoCisJICAgIG1heGltdW0gc2l6ZSBvZiBlbnRpcmUgSVAgcGFja2V0LCBhbmQgc2VuZHMgcGFja2V0cyB3aGljaCBhcmUKKwkgICAgMjggYnl0ZXMgdG9vIGxhcmdlLgorCSAgU2VlZG5ldCAoSVNQKSBWRFNMOiBzZW5kcyBwYWNrZXRzIDIgYnl0ZXMgdG9vIGxhcmdlLgpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy91ZGhjcC9LYnVpbGQuc3JjIGIvbmV0d29ya2luZy91ZGhjcC9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NzY3YmEKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3VkaGNwL0tidWlsZC5zcmMKQEAgLTAsMCArMSwyMSBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisjCisKK2xpYi15Oj0KKworSU5TRVJUCisKK2xpYi0kKENPTkZJR19VREhDUEMpICAgICArPSBjb21tb24ubyBwYWNrZXQubyBzaWduYWxwaXBlLm8gc29ja2V0Lm8KK2xpYi0kKENPTkZJR19VREhDUEQpICAgICArPSBjb21tb24ubyBwYWNrZXQubyBzaWduYWxwaXBlLm8gc29ja2V0Lm8KKworbGliLSQoQ09ORklHX1VESENQQykgICAgICs9IGRoY3BjLm8KK2xpYi0kKENPTkZJR19VREhDUEQpICAgICArPSBkaGNwZC5vIGFycHBpbmcubyBmaWxlcy5vIGxlYXNlcy5vIHN0YXRpY19sZWFzZXMubworbGliLSQoQ09ORklHX0RVTVBMRUFTRVMpICs9IGR1bXBsZWFzZXMubworbGliLSQoQ09ORklHX0RIQ1BSRUxBWSkgICs9IGRoY3ByZWxheS5vCisKK2xpYi0kKENPTkZJR19GRUFUVVJFX1VESENQQ19BUlBJTkcpICs9IGFycHBpbmcubworbGliLSQoQ09ORklHX0ZFQVRVUkVfVURIQ1BfUkZDMzM5NykgKz0gZG9tYWluX2NvZGVjLm8KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvdWRoY3AvYXJwcGluZy5jIGIvbmV0d29ya2luZy91ZGhjcC9hcnBwaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFkMjI4MwotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvdWRoY3AvYXJwcGluZy5jCkBAIC0wLDAgKzEsMTM3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNb3N0bHkgc3RvbGVuIGZyb206IGRoY3BjZCAtIERIQ1AgY2xpZW50IGRhZW1vbgorICogYnkgWW9pY2hpIEhhcmlndWNoaSA8eW9pY2hpQGZvcmUuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlIDxuZXRpbmV0L2lmX2V0aGVyLmg+CisjaW5jbHVkZSA8bmV0L2lmX2FycC5oPgorCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiZGhjcGQuaCIKKworc3RydWN0IGFycE1zZyB7CisJLyogRXRoZXJuZXQgaGVhZGVyICovCisJdWludDhfdCAgaF9kZXN0WzZdOyAgICAgLyogMDAgZGVzdGluYXRpb24gZXRoZXIgYWRkciAqLworCXVpbnQ4X3QgIGhfc291cmNlWzZdOyAgIC8qIDA2IHNvdXJjZSBldGhlciBhZGRyICovCisJdWludDE2X3QgaF9wcm90bzsgICAgICAgLyogMGMgcGFja2V0IHR5cGUgSUQgZmllbGQgKi8KKworCS8qIEFSUCBwYWNrZXQgKi8KKwl1aW50MTZfdCBodHlwZTsgICAgICAgICAvKiAwZSBoYXJkd2FyZSB0eXBlIChtdXN0IGJlIEFSUEhSRF9FVEhFUikgKi8KKwl1aW50MTZfdCBwdHlwZTsgICAgICAgICAvKiAxMCBwcm90b2NvbCB0eXBlIChtdXN0IGJlIEVUSF9QX0lQKSAqLworCXVpbnQ4X3QgIGhsZW47ICAgICAgICAgIC8qIDEyIGhhcmR3YXJlIGFkZHJlc3MgbGVuZ3RoIChtdXN0IGJlIDYpICovCisJdWludDhfdCAgcGxlbjsgICAgICAgICAgLyogMTMgcHJvdG9jb2wgYWRkcmVzcyBsZW5ndGggKG11c3QgYmUgNCkgKi8KKwl1aW50MTZfdCBvcGVyYXRpb247ICAgICAvKiAxNCBBUlAgb3Bjb2RlICovCisJdWludDhfdCAgc0hhZGRyWzZdOyAgICAgLyogMTYgc2VuZGVyJ3MgaGFyZHdhcmUgYWRkcmVzcyAqLworCXVpbnQ4X3QgIHNJbmFkZHJbNF07ICAgIC8qIDFjIHNlbmRlcidzIElQIGFkZHJlc3MgKi8KKwl1aW50OF90ICB0SGFkZHJbNl07ICAgICAvKiAyMCB0YXJnZXQncyBoYXJkd2FyZSBhZGRyZXNzICovCisJdWludDhfdCAgdEluYWRkcls0XTsgICAgLyogMjYgdGFyZ2V0J3MgSVAgYWRkcmVzcyAqLworCXVpbnQ4X3QgIHBhZFsxOF07ICAgICAgIC8qIDJhIHBhZCBmb3IgbWluLiBldGhlcm5ldCBwYXlsb2FkICg2MCBieXRlcykgKi8KK30gUEFDS0VEOworCitlbnVtIHsKKwlBUlBfTVNHX1NJWkUgPSAweDJhCit9OworCisvKiBSZXR1cm5zIDEgaWYgbm8gcmVwbHkgcmVjZWl2ZWQgKi8KK2ludCBGQVNUX0ZVTkMgYXJwcGluZyh1aW50MzJfdCB0ZXN0X25pcCwKKwkJY29uc3QgdWludDhfdCAqc2FmZV9tYWMsCisJCXVpbnQzMl90IGZyb21faXAsCisJCXVpbnQ4X3QgKmZyb21fbWFjLAorCQljb25zdCBjaGFyICppbnRlcmZhY2UsCisJCXVuc2lnbmVkIHRpbWVvKQoreworCWludCB0aW1lb3V0X21zOworCXN0cnVjdCBwb2xsZmQgcGZkWzFdOworI2RlZmluZSBzIChwZmRbMF0uZmQpICAgICAgICAgICAvKiBzb2NrZXQgKi8KKwlpbnQgcnYgPSAxOyAgICAgICAgICAgICAvKiAibm8gcmVwbHkgcmVjZWl2ZWQiIHlldCAqLworCXN0cnVjdCBzb2NrYWRkciBhZGRyOyAgIC8qIGZvciBpbnRlcmZhY2UgbmFtZSAqLworCXN0cnVjdCBhcnBNc2cgYXJwOworCisJaWYgKCF0aW1lbykKKwkJcmV0dXJuIDE7CisKKwlzID0gc29ja2V0KFBGX1BBQ0tFVCwgU09DS19QQUNLRVQsIGh0b25zKEVUSF9QX0FSUCkpOworCWlmIChzID09IC0xKSB7CisJCWJiX3BlcnJvcl9tc2coYmJfbXNnX2Nhbl9ub3RfY3JlYXRlX3Jhd19zb2NrZXQpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHNldHNvY2tvcHRfYnJvYWRjYXN0KHMpID09IC0xKSB7CisJCWJiX3BlcnJvcl9tc2coImNhbid0IGVuYWJsZSBiY2FzdCBvbiByYXcgc29ja2V0Iik7CisJCWdvdG8gcmV0OworCX0KKworCS8qIHNlbmQgYXJwIHJlcXVlc3QgKi8KKwltZW1zZXQoJmFycCwgMCwgc2l6ZW9mKGFycCkpOworCW1lbXNldChhcnAuaF9kZXN0LCAweGZmLCA2KTsgICAgICAgICAgICAgICAgICAgIC8qIE1BQyBEQSAqLworCW1lbWNweShhcnAuaF9zb3VyY2UsIGZyb21fbWFjLCA2KTsgICAgICAgICAgICAgIC8qIE1BQyBTQSAqLworCWFycC5oX3Byb3RvID0gaHRvbnMoRVRIX1BfQVJQKTsgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sIHR5cGUgKEV0aGVybmV0KSAqLworCWFycC5odHlwZSA9IGh0b25zKEFSUEhSRF9FVEhFUik7ICAgICAgICAgICAgICAgIC8qIGhhcmR3YXJlIHR5cGUgKi8KKwlhcnAucHR5cGUgPSBodG9ucyhFVEhfUF9JUCk7ICAgICAgICAgICAgICAgICAgICAvKiBwcm90b2NvbCB0eXBlIChBUlAgbWVzc2FnZSkgKi8KKwlhcnAuaGxlbiA9IDY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBoYXJkd2FyZSBhZGRyZXNzIGxlbmd0aCAqLworCWFycC5wbGVuID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHByb3RvY29sIGFkZHJlc3MgbGVuZ3RoICovCisJYXJwLm9wZXJhdGlvbiA9IGh0b25zKEFSUE9QX1JFUVVFU1QpOyAgICAgICAgICAgLyogQVJQIG9wIGNvZGUgKi8KKwltZW1jcHkoYXJwLnNIYWRkciwgZnJvbV9tYWMsIDYpOyAgICAgICAgICAgICAgICAvKiBzb3VyY2UgaGFyZHdhcmUgYWRkcmVzcyAqLworCW1lbWNweShhcnAuc0luYWRkciwgJmZyb21faXAsIHNpemVvZihmcm9tX2lwKSk7IC8qIHNvdXJjZSBJUCBhZGRyZXNzICovCisJLyogdEhhZGRyIGlzIHplcm8tZmlsbGVkICovICAgICAgICAgICAgICAgICAgICAgLyogdGFyZ2V0IGhhcmR3YXJlIGFkZHJlc3MgKi8KKwltZW1jcHkoYXJwLnRJbmFkZHIsICZ0ZXN0X25pcCwgc2l6ZW9mKHRlc3RfbmlwKSk7LyogdGFyZ2V0IElQIGFkZHJlc3MgKi8KKworCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwlzYWZlX3N0cm5jcHkoYWRkci5zYV9kYXRhLCBpbnRlcmZhY2UsIHNpemVvZihhZGRyLnNhX2RhdGEpKTsKKwlpZiAoc2VuZHRvKHMsICZhcnAsIHNpemVvZihhcnApLCAwLCAmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKKwkJLy8gVE9ETzogZXJyb3IgbWVzc2FnZT8gY2FsbGVyIGRpZG4ndCBleHBlY3QgdXMgdG8gZmFpbCwKKwkJLy8ganVzdCByZXR1cm5pbmcgMSAibm8gcmVwbHkgcmVjZWl2ZWQiIG1pc2xlYWRzIGl0LgorCQlnb3RvIHJldDsKKwl9CisKKwkvKiB3YWl0IGZvciBhcnAgcmVwbHksIGFuZCBjaGVjayBpdCAqLworCXRpbWVvdXRfbXMgPSAoaW50KXRpbWVvOworCWRvIHsKKwkJdHlwZWRlZiB1aW50MzJfdCBhbGlhc2VkX3VpbnQzMl90IEZJWF9BTElBU0lORzsKKwkJaW50IHI7CisJCXVuc2lnbmVkIHByZXZUaW1lID0gbW9ub3RvbmljX21zKCk7CisKKwkJcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKwkJciA9IHNhZmVfcG9sbChwZmQsIDEsIHRpbWVvdXRfbXMpOworCQlpZiAociA8IDApCisJCQlicmVhazsKKwkJaWYgKHIpIHsKKwkJCXIgPSBzYWZlX3JlYWQocywgJmFycCwgc2l6ZW9mKGFycCkpOworCQkJaWYgKHIgPCAwKQorCQkJCWJyZWFrOworCisJCQkvL2xvZzMoInNIYWRkciAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisJCQkvLwlhcnAuc0hhZGRyWzBdLCBhcnAuc0hhZGRyWzFdLCBhcnAuc0hhZGRyWzJdLAorCQkJLy8JYXJwLnNIYWRkclszXSwgYXJwLnNIYWRkcls0XSwgYXJwLnNIYWRkcls1XSk7CisKKwkJCWlmIChyID49IEFSUF9NU0dfU0laRQorCQkJICYmIGFycC5vcGVyYXRpb24gPT0gaHRvbnMoQVJQT1BfUkVQTFkpCisJCQkgLyogZG9uJ3QgY2hlY2sgaXQ6IExpbnV4IGRvZXNuJ3QgcmV0dXJuIHByb3BlciB0SGFkZHIgKGZpeGVkIGluIDIuNi4yND8pICovCisJCQkgLyogJiYgbWVtY21wKGFycC50SGFkZHIsIGZyb21fbWFjLCA2KSA9PSAwICovCisJCQkgJiYgKihhbGlhc2VkX3VpbnQzMl90KilhcnAuc0luYWRkciA9PSB0ZXN0X25pcAorCQkJKSB7CisJCQkJLyogaWYgQVJQIHNvdXJjZSBNQUMgbWF0Y2hlcyBzYWZlX21hYworCQkJCSAqICh3aGljaCBpcyBjbGllbnQncyBNQUMpLCB0aGVuIGl0J3Mgbm90IGEgY29uZmxpY3QKKwkJCQkgKiAoY2xpZW50IHNpbXBseSBhbHJlYWR5IGhhcyB0aGlzIElQIGFuZCByZXBsaWVzIHRvIEFSUHMhKQorCQkJCSAqLworCQkJCWlmICghc2FmZV9tYWMgfHwgbWVtY21wKHNhZmVfbWFjLCBhcnAuc0hhZGRyLCA2KSAhPSAwKQorCQkJCQlydiA9IDA7CisJCQkJLy9lbHNlIGxvZzIoInNIYWRkciA9PSBzYWZlX21hYyIpOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXRpbWVvdXRfbXMgLT0gKHVuc2lnbmVkKW1vbm90b25pY19tcygpIC0gcHJldlRpbWUgKyAxOworCisJCS8qIFdlIHVzZWQgdG8gY2hlY2sgInRpbWVvdXRfbXMgPiAwIiwgYnV0CisJCSAqIHRoaXMgaXMgbW9yZSB1bmRlci9vdmVyZmxvdy1yZXNpc3RhbnQKKwkJICogKHBlb3BsZSBkaWQgc2VlIG92ZXJmbG93cyBoZXJlIHdoZW4gc3lzdGVtIHRpbWUganVtcHMpOgorCQkgKi8KKwl9IHdoaWxlICgodW5zaWduZWQpdGltZW91dF9tcyA8PSB0aW1lbyk7CisKKyByZXQ6CisJY2xvc2Uocyk7CisJbG9nMSgiJXNycCByZXBseSByZWNlaXZlZCBmb3IgdGhpcyBhZGRyZXNzIiwgcnYgPyAiTm8gYSIgOiAiQSIpOworCXJldHVybiBydjsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvdWRoY3AvY29tbW9uLmMgYi9uZXR3b3JraW5nL3VkaGNwL2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNDFjOGQKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3VkaGNwL2NvbW1vbi5jCkBAIC0wLDAgKzEsNTgzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBSZXdyaXRlIGJ5IFJ1c3MgRGlsbCA8UnVzcy5EaWxsQGFzdS5lZHU+IEp1bHkgMjAwMQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJjb21tb24uaCIKKworI2lmIGRlZmluZWQgQ09ORklHX1VESENQX0RFQlVHICYmIENPTkZJR19VREhDUF9ERUJVRyA+PSAxCit1bnNpZ25lZCBkaGNwX3ZlcmJvc2U7CisjZW5kaWYKKworY29uc3QgdWludDhfdCBNQUNfQkNBU1RfQUREUls2XSBBTElHTjIgPSB7CisJMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZiwgMHhmZgorfTsKKworLyogU3VwcG9ydGVkIG9wdGlvbnMgYXJlIGVhc2lseSBhZGRlZCBoZXJlLgorICogU2VlIFJGQzIxMzIgZm9yIG1vcmUgb3B0aW9ucy4KKyAqIE9QVElPTl9SRVE6IHRoZXNlIG9wdGlvbnMgYXJlIHJlcXVlc3RlZCBieSB1ZGhjcGMgKHVubGVzcyAtbykuCisgKi8KK2NvbnN0IHN0cnVjdCBkaGNwX29wdGZsYWcgZGhjcF9vcHRmbGFnc1tdID0geworCS8qIGZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSAqLworCXsgT1BUSU9OX0lQICAgICAgICAgICAgICAgICAgIHwgT1BUSU9OX1JFUSwgMHgwMSB9LCAvKiBESENQX1NVQk5FVCAgICAgICAgKi8KKwl7IE9QVElPTl9TMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4MDIgfSwgLyogREhDUF9USU1FX09GRlNFVCAgICovCisJeyBPUFRJT05fSVAgfCBPUFRJT05fTElTVCAgICAgfCBPUFRJT05fUkVRLCAweDAzIH0sIC8qIERIQ1BfUk9VVEVSICAgICAgICAqLworLy8JeyBPUFRJT05fSVAgfCBPUFRJT05fTElTVCAgICAgICAgICAgICAgICAgLCAweDA0IH0sIC8qIERIQ1BfVElNRV9TRVJWRVIgICAqLworLy8JeyBPUFRJT05fSVAgfCBPUFRJT05fTElTVCAgICAgICAgICAgICAgICAgLCAweDA1IH0sIC8qIERIQ1BfTkFNRV9TRVJWRVIgICAqLworCXsgT1BUSU9OX0lQIHwgT1BUSU9OX0xJU1QgICAgIHwgT1BUSU9OX1JFUSwgMHgwNiB9LCAvKiBESENQX0ROU19TRVJWRVIgICAgKi8KKy8vCXsgT1BUSU9OX0lQIHwgT1BUSU9OX0xJU1QgICAgICAgICAgICAgICAgICwgMHgwNyB9LCAvKiBESENQX0xPR19TRVJWRVIgICAgKi8KKy8vCXsgT1BUSU9OX0lQIHwgT1BUSU9OX0xJU1QgICAgICAgICAgICAgICAgICwgMHgwOCB9LCAvKiBESENQX0NPT0tJRV9TRVJWRVIgKi8KKwl7IE9QVElPTl9JUCB8IE9QVElPTl9MSVNUICAgICAgICAgICAgICAgICAsIDB4MDkgfSwgLyogREhDUF9MUFJfU0VSVkVSICAgICovCisJeyBPUFRJT05fU1RSSU5HX0hPU1QgICAgICAgICAgfCBPUFRJT05fUkVRLCAweDBjIH0sIC8qIERIQ1BfSE9TVF9OQU1FICAgICAqLworCXsgT1BUSU9OX1UxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHgwZCB9LCAvKiBESENQX0JPT1RfU0laRSAgICAgKi8KKwl7IE9QVElPTl9TVFJJTkdfSE9TVCAgICAgICAgICB8IE9QVElPTl9SRVEsIDB4MGYgfSwgLyogREhDUF9ET01BSU5fTkFNRSAgICovCisJeyBPUFRJT05fSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDEwIH0sIC8qIERIQ1BfU1dBUF9TRVJWRVIgICAqLworCXsgT1BUSU9OX1NUUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHgxMSB9LCAvKiBESENQX1JPT1RfUEFUSCAgICAgKi8KKwl7IE9QVElPTl9VOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4MTcgfSwgLyogREhDUF9JUF9UVEwgICAgICAgICovCisJeyBPUFRJT05fVTE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDFhIH0sIC8qIERIQ1BfTVRVICAgICAgICAgICAqLworLy9UT0RPOiB3aHkgZG8gd2UgcmVxdWVzdCBESENQX0JST0FEQ0FTVD8gQ2FuJ3Qgd2UgYXNzdW1lIHRoYXQKKy8vaW4gdGhlIHVubGlrZWx5IGNhc2UgaXQgaXMgZGlmZmVyZW50IGZyb20gdHlwaWNhbCBOLk4uMjU1LjI1NSwKKy8vc2VydmVyIHdvdWxkIGxldCB1cyBrbm93IGFueXdheT8KKwl7IE9QVElPTl9JUCAgICAgICAgICAgICAgICAgICB8IE9QVElPTl9SRVEsIDB4MWMgfSwgLyogREhDUF9CUk9BRENBU1QgICAgICovCisJeyBPUFRJT05fSVBfUEFJUiB8IE9QVElPTl9MSVNUICAgICAgICAgICAgLCAweDIxIH0sIC8qIERIQ1BfUk9VVEVTICAgICAgICAqLworCXsgT1BUSU9OX1NUUklOR19IT1NUICAgICAgICAgICAgICAgICAgICAgICwgMHgyOCB9LCAvKiBESENQX05JU19ET01BSU4gICAgKi8KKwl7IE9QVElPTl9JUCB8IE9QVElPTl9MSVNUICAgICAgICAgICAgICAgICAsIDB4MjkgfSwgLyogREhDUF9OSVNfU0VSVkVSICAgICovCisJeyBPUFRJT05fSVAgfCBPUFRJT05fTElTVCAgICAgfCBPUFRJT05fUkVRLCAweDJhIH0sIC8qIERIQ1BfTlRQX1NFUlZFUiAgICAqLworCXsgT1BUSU9OX0lQIHwgT1BUSU9OX0xJU1QgICAgICAgICAgICAgICAgICwgMHgyYyB9LCAvKiBESENQX1dJTlNfU0VSVkVSICAgKi8KKwl7IE9QVElPTl9VMzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4MzMgfSwgLyogREhDUF9MRUFTRV9USU1FICAgICovCisJeyBPUFRJT05fSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDM2IH0sIC8qIERIQ1BfU0VSVkVSX0lEICAgICAqLworCXsgT1BUSU9OX1NUUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHgzOCB9LCAvKiBESENQX0VSUl9NRVNTQUdFICAgKi8KKy8vVE9ETzogbXVzdCBiZSBjb21iaW5lZCB3aXRoICdzbmFtZScgYW5kICdmaWxlJyBoYW5kbGluZzoKKwl7IE9QVElPTl9TVFJJTkdfSE9TVCAgICAgICAgICAgICAgICAgICAgICAsIDB4NDIgfSwgLyogREhDUF9URlRQX1NFUlZFUl9OQU1FICovCisJeyBPUFRJT05fU1RSSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDQzIH0sIC8qIERIQ1BfQk9PVF9GSUxFICAgICAqLworLy9UT0RPOiBub3QgYSBzdHJpbmcsIGJ1dCBhIHNldCBvZiBMQVNDSUkgc3RyaW5nczoKKy8vCXsgT1BUSU9OX1NUUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHg0RCB9LCAvKiBESENQX1VTRVJfQ0xBU1MgICAgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF9SRkMzMzk3CisJeyBPUFRJT05fRE5TX1NUUklORyB8IE9QVElPTl9MSVNUICAgICAgICAgLCAweDc3IH0sIC8qIERIQ1BfRE9NQUlOX1NFQVJDSCAqLworCXsgT1BUSU9OX1NJUF9TRVJWRVJTICAgICAgICAgICAgICAgICAgICAgICwgMHg3OCB9LCAvKiBESENQX1NJUF9TRVJWRVJTICAgKi8KKyNlbmRpZgorCXsgT1BUSU9OX1NUQVRJQ19ST1VURVMgfCBPUFRJT05fTElTVCAgICAgICwgMHg3OSB9LCAvKiBESENQX1NUQVRJQ19ST1VURVMgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF84MDIxUQorCXsgT1BUSU9OX1UxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHg4NCB9LCAvKiBESENQX1ZMQU5fSUQgICAgICAgKi8KKwl7IE9QVElPTl9VOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4ODUgfSwgLyogREhDUF9WTEFOX1BSSU9SSVRZICovCisjZW5kaWYKKwl7IE9QVElPTl9TVFJJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4ZDEgfSwgLyogREhDUF9QWEVfQ09ORl9GSUxFICovCisJeyBPUFRJT05fU1RSSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweGQyIH0sIC8qIERIQ1BfUFhFX1BBVEhfUFJFRklYICovCisJeyBPUFRJT05fNlJEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweGQ0IH0sIC8qIERIQ1BfNlJEICAgICAgICAgICAqLworCXsgT1BUSU9OX1NUQVRJQ19ST1VURVMgfCBPUFRJT05fTElTVCAgICAgICwgMHhmOSB9LCAvKiBESENQX01TX1NUQVRJQ19ST1VURVMgKi8KKwl7IE9QVElPTl9TVFJJTkcgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4ZmMgfSwgLyogREhDUF9XUEFEICAgICAgICAgICovCisKKwkvKiBPcHRpb25zIGJlbG93IGhhdmUgbm8gbWF0Y2ggaW4gZGhjcF9vcHRpb25fc3RyaW5nc1tdLAorCSAqIGFyZSBub3QgcGFzc2VkIHRvIGRoY3BjIHNjcmlwdHMsIGFuZCBjYW5ub3QgYmUgc3BlY2lmaWVkCisJICogd2l0aCAib3B0aW9uIFhYWCBZWVkiIHN5bnRheCBpbiBkaGNwZCBjb25maWcgZmlsZS4KKwkgKiBUaGVzZSBlbnRyaWVzIGFyZSBvbmx5IHVzZWQgaW50ZXJuYWxseSBieSB1ZGhjcFtjZF0KKwkgKiB0byBjb3JyZWN0bHkgZW5jb2RlIG9wdGlvbnMgaW50byBwYWNrZXRzLgorCSAqLworCisJeyBPUFRJT05fSVAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDMyIH0sIC8qIERIQ1BfUkVRVUVTVEVEX0lQICAqLworCXsgT1BUSU9OX1U4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHgzNSB9LCAvKiBESENQX01FU1NBR0VfVFlQRSAgKi8KKwl7IE9QVElPTl9VMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIDB4MzkgfSwgLyogREhDUF9NQVhfU0laRSAgICAgICovCisvL2xvb2tzIGxpa2UgdGhlc2Ugb3B0cyB3aWxsIHdvcmsganVzdCBmaW5lIGV2ZW4gd2l0aG91dCB0aGVzZSBkZWZzOgorLy8JeyBPUFRJT05fU1RSSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgLCAweDNjIH0sIC8qIERIQ1BfVkVORE9SICAgICAgICAqLworLy8JLyogbm90IHJlYWxseSBhIHN0cmluZzogKi8KKy8vCXsgT1BUSU9OX1NUUklORyAgICAgICAgICAgICAgICAgICAgICAgICAgICwgMHgzZCB9LCAvKiBESENQX0NMSUVOVF9JRCAgICAgKi8KKwl7IDAsIDAgfSAvKiB6ZXJvZWQgdGVybWluYXRpbmcgZW50cnkgKi8KK307CisKKy8qIFVzZWQgZm9yIGNvbnZlcnRpbmcgb3B0aW9ucyBmcm9tIGluY29taW5nIHBhY2tldHMgdG8gZW52IHZhcmlhYmxlcworICogZm9yIHVkaGNwYyBzdHJpcHQsIGFuZCBmb3Igc2V0dGluZyBvcHRpb25zIGZvciB1ZGhjcGQgdmlhCisgKiAib3B0IE9QVElPTl9OQU1FIE9QVElPTl9WQUxVRSIgZGlyZWN0aXZlcyBpbiB1ZGhjcGQuY29uZiBmaWxlLgorICovCisvKiBNdXN0IG1hdGNoIGRoY3Bfb3B0ZmxhZ3NbXSBvcmRlciAqLworY29uc3QgY2hhciBkaGNwX29wdGlvbl9zdHJpbmdzW10gQUxJR04xID0KKwkic3VibmV0IiAiXDAiICAgICAgLyogREhDUF9TVUJORVQgICAgICAgICAqLworCSJ0aW1lem9uZSIgIlwwIiAgICAvKiBESENQX1RJTUVfT0ZGU0VUICAgICovCisJInJvdXRlciIgIlwwIiAgICAgIC8qIERIQ1BfUk9VVEVSICAgICAgICAgKi8KKy8vCSJ0aW1lc3J2IiAiXDAiICAgICAvKiBESENQX1RJTUVfU0VSVkVSICAgICovCisvLwkibmFtZXNydiIgIlwwIiAgICAgLyogREhDUF9OQU1FX1NFUlZFUiAgICAqLworCSJkbnMiICJcMCIgICAgICAgICAvKiBESENQX0ROU19TRVJWRVIgICAgICovCisvLwkibG9nc3J2IiAiXDAiICAgICAgLyogREhDUF9MT0dfU0VSVkVSICAgICAqLworLy8JImNvb2tpZXNydiIgIlwwIiAgIC8qIERIQ1BfQ09PS0lFX1NFUlZFUiAgKi8KKwkibHByc3J2IiAiXDAiICAgICAgLyogREhDUF9MUFJfU0VSVkVSICAgICAqLworCSJob3N0bmFtZSIgIlwwIiAgICAvKiBESENQX0hPU1RfTkFNRSAgICAgICovCisJImJvb3RzaXplIiAiXDAiICAgIC8qIERIQ1BfQk9PVF9TSVpFICAgICAgKi8KKwkiZG9tYWluIiAiXDAiICAgICAgLyogREhDUF9ET01BSU5fTkFNRSAgICAqLworCSJzd2Fwc3J2IiAiXDAiICAgICAvKiBESENQX1NXQVBfU0VSVkVSICAgICovCisJInJvb3RwYXRoIiAiXDAiICAgIC8qIERIQ1BfUk9PVF9QQVRIICAgICAgKi8KKwkiaXB0dGwiICJcMCIgICAgICAgLyogREhDUF9JUF9UVEwgICAgICAgICAqLworCSJtdHUiICJcMCIgICAgICAgICAvKiBESENQX01UVSAgICAgICAgICAgICovCisJImJyb2FkY2FzdCIgIlwwIiAgIC8qIERIQ1BfQlJPQURDQVNUICAgICAgKi8KKwkicm91dGVzIiAiXDAiICAgICAgLyogREhDUF9ST1VURVMgICAgICAgICAqLworCSJuaXNkb21haW4iICJcMCIgICAvKiBESENQX05JU19ET01BSU4gICAgICovCisJIm5pc3NydiIgIlwwIiAgICAgIC8qIERIQ1BfTklTX1NFUlZFUiAgICAgKi8KKwkibnRwc3J2IiAiXDAiICAgICAgLyogREhDUF9OVFBfU0VSVkVSICAgICAqLworCSJ3aW5zIiAiXDAiICAgICAgICAvKiBESENQX1dJTlNfU0VSVkVSICAgICovCisJImxlYXNlIiAiXDAiICAgICAgIC8qIERIQ1BfTEVBU0VfVElNRSAgICAgKi8KKwkic2VydmVyaWQiICJcMCIgICAgLyogREhDUF9TRVJWRVJfSUQgICAgICAqLworCSJtZXNzYWdlIiAiXDAiICAgICAvKiBESENQX0VSUl9NRVNTQUdFICAgICovCisJInRmdHAiICJcMCIgICAgICAgIC8qIERIQ1BfVEZUUF9TRVJWRVJfTkFNRSAqLworCSJib290ZmlsZSIgIlwwIiAgICAvKiBESENQX0JPT1RfRklMRSAgICAgICovCisvLwkidXNlcmNsYXNzIiAiXDAiICAgLyogREhDUF9VU0VSX0NMQVNTICAgICAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQX1JGQzMzOTcKKwkic2VhcmNoIiAiXDAiICAgICAgLyogREhDUF9ET01BSU5fU0VBUkNIICAqLworLy8gZG9lc24ndCB3b3JrIGluIHVkaGNwZC5jb25mIHNpbmNlIE9QVElPTl9TSVBfU0VSVkVSUworLy8gaXMgbm90IGhhbmRsZWQgeWV0IGJ5ICJzdHJpbmctPm9wdGlvbiIgY29udmVyc2lvbiBjb2RlOgorCSJzaXBzcnYiICJcMCIgICAgICAvKiBESENQX1NJUF9TRVJWRVJTICAgICovCisjZW5kaWYKKwkic3RhdGljcm91dGVzIiAiXDAiLyogREhDUF9TVEFUSUNfUk9VVEVTICAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQXzgwMjFRCisJInZsYW5pZCIgIlwwIiAgICAgIC8qIERIQ1BfVkxBTl9JRCAgICAgICAgKi8KKwkidmxhbnByaW9yaXR5IiAiXDAiLyogREhDUF9WTEFOX1BSSU9SSVRZICAqLworI2VuZGlmCisJInB4ZWNvbmZmaWxlIiAiXDAiIC8qIERIQ1BfUFhFX0NPTkZfRklMRSAgKi8KKwkicHhlcGF0aHByZWZpeCIgIlwwIiAvKiBESENQX1BYRV9QQVRIX1BSRUZJWCAgKi8KKwkiaXA2cmQiICJcMCIgICAgICAgLyogREhDUF82UkQgICAgICAgICAgICAqLworCSJtc3N0YXRpY3JvdXRlcyIiXDAiLyogREhDUF9NU19TVEFUSUNfUk9VVEVTICovCisJIndwYWQiICJcMCIgICAgICAgIC8qIERIQ1BfV1BBRCAgICAgICAgICAgKi8KKwk7CisKKy8qIExlbmd0aHMgb2YgdGhlIG9wdGlvbiB0eXBlcyBpbiBiaW5hcnkgZm9ybS4KKyAqIFVzZWQgYnk6CisgKiB1ZGhjcF9zdHIyb3B0c2V0OiB0byBkZXRlcm1pbmUgaG93IG1hbnkgYnl0ZXMgdG8gYWxsb2NhdGUuCisgKiB4bWFsbG9jX29wdG5hbWVfb3B0dmFsOiB0byBlc3RpbWF0ZSBzdHJpbmcgbGVuZ3RoCisgKiBmcm9tIGJpbmFyeSBvcHRpb24gbGVuZ3RoOiAob3B0aW9uW0xFTl0gLyBkaGNwX29wdGlvbl9sZW5ndGhzW29wdF90eXBlXSkKKyAqIGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMsIG11bHRpcGx5IGluIGJ5IG9uZSBlbGVtZW50J3Mgc3RyaW5nIHdpZHRoCisgKiAobGVuX29mX29wdGlvbl9hc19zdHJpbmdbb3B0X3R5cGVdKSBhbmQgeW91IGtub3cgaG93IHdpZGUgc3RyaW5nIHlvdSBuZWVkLgorICovCitjb25zdCB1aW50OF90IGRoY3Bfb3B0aW9uX2xlbmd0aHNbXSBBTElHTjEgPSB7CisJW09QVElPTl9JUF0gPSAgICAgIDQsCisJW09QVElPTl9JUF9QQUlSXSA9IDgsCisvLwlbT1BUSU9OX0JPT0xFQU5dID0gMSwKKwlbT1BUSU9OX1NUUklOR10gPSAgMSwgIC8qIGlnbm9yZWQgYnkgdWRoY3Bfc3RyMm9wdHNldCAqLworCVtPUFRJT05fU1RSSU5HX0hPU1RdID0gMSwgIC8qIGlnbm9yZWQgYnkgdWRoY3Bfc3RyMm9wdHNldCAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQX1JGQzMzOTcKKwlbT1BUSU9OX0ROU19TVFJJTkddID0gMSwgIC8qIGlnbm9yZWQgYnkgYm90aCB1ZGhjcF9zdHIyb3B0c2V0IGFuZCB4bWFsbG9jX29wdG5hbWVfb3B0dmFsICovCisJW09QVElPTl9TSVBfU0VSVkVSU10gPSAxLAorI2VuZGlmCisJW09QVElPTl9VOF0gPSAgICAgIDEsCisJW09QVElPTl9VMTZdID0gICAgIDIsCisvLwlbT1BUSU9OX1MxNl0gPSAgICAgMiwKKwlbT1BUSU9OX1UzMl0gPSAgICAgNCwKKwlbT1BUSU9OX1MzMl0gPSAgICAgNCwKKwkvKiBKdXN0IGxpa2UgT1BUSU9OX1NUUklORywgd2UgdXNlIG1pbmltdW0gbGVuZ3RoIGhlcmUgKi8KKwlbT1BUSU9OX1NUQVRJQ19ST1VURVNdID0gNSwKKwlbT1BUSU9OXzZSRF0gPSAgICAyMiwgIC8qIGlnbm9yZWQgYnkgdWRoY3Bfc3RyMm9wdHNldCAqLworfTsKKworCisjaWYgZGVmaW5lZCBDT05GSUdfVURIQ1BfREVCVUcgJiYgQ09ORklHX1VESENQX0RFQlVHID49IDIKK3N0YXRpYyB2b2lkIGxvZ19vcHRpb24oY29uc3QgY2hhciAqcGZ4LCBjb25zdCB1aW50OF90ICpvcHQpCit7CisJaWYgKGRoY3BfdmVyYm9zZSA+PSAyKSB7CisJCWNoYXIgYnVmWzI1NiAqIDIgKyAyXTsKKwkJKmJpbjJoZXgoYnVmLCAodm9pZCopIChvcHQgKyBPUFRfREFUQSksIG9wdFtPUFRfTEVOXSkgPSAnXDAnOworCQliYl9pbmZvX21zZygiJXM6IDB4JTAyeCAlcyIsIHBmeCwgb3B0W09QVF9DT0RFXSwgYnVmKTsKKwl9Cit9CisjZWxzZQorIyBkZWZpbmUgbG9nX29wdGlvbihwZngsIG9wdCkgKCh2b2lkKTApCisjZW5kaWYKKwordW5zaWduZWQgRkFTVF9GVU5DIHVkaGNwX29wdGlvbl9pZHgoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgbiA9IGluZGV4X2luX3N0cmluZ3MoZGhjcF9vcHRpb25fc3RyaW5ncywgbmFtZSk7CisJaWYgKG4gPj0gMCkKKwkJcmV0dXJuIG47CisKKwl7CisJCWNoYXIgYnVmW3NpemVvZihkaGNwX29wdGlvbl9zdHJpbmdzKV07CisJCWNoYXIgKmQgPSBidWY7CisJCWNvbnN0IGNoYXIgKnMgPSBkaGNwX29wdGlvbl9zdHJpbmdzOworCQl3aGlsZSAocyA8IGRoY3Bfb3B0aW9uX3N0cmluZ3MgKyBzaXplb2YoZGhjcF9vcHRpb25fc3RyaW5ncykgLSAyKSB7CisJCQkqZCsrID0gKCpzID09ICdcMCcgPyAnICcgOiAqcyk7CisJCQlzKys7CisJCX0KKwkJKmQgPSAnXDAnOworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biBvcHRpb24gJyVzJywga25vd24gb3B0aW9uczogJXMiLCBuYW1lLCBidWYpOworCX0KK30KKworLyogR2V0IGFuIG9wdGlvbiB3aXRoIGJvdW5kcyBjaGVja2luZyAod2FybmluZywgcmVzdWx0IGlzIG5vdCBhbGlnbmVkKSAqLwordWludDhfdCogRkFTVF9GVU5DIHVkaGNwX2dldF9vcHRpb24oc3RydWN0IGRoY3BfcGFja2V0ICpwYWNrZXQsIGludCBjb2RlKQoreworCXVpbnQ4X3QgKm9wdGlvbnB0cjsKKwlpbnQgbGVuOworCWludCByZW07CisJaW50IG92ZXJsb2FkID0gMDsKKwllbnVtIHsKKwkJRklMRV9GSUVMRDEwMSAgPSBGSUxFX0ZJRUxEICAqIDB4MTAxLAorCQlTTkFNRV9GSUVMRDEwMSA9IFNOQU1FX0ZJRUxEICogMHgxMDEsCisJfTsKKworCS8qIG9wdGlvbiBieXRlczogW2NvZGVdW2xlbl1bZGF0YTFdW2RhdGEyXS4uW2RhdGFMRU5dICovCisJb3B0aW9ucHRyID0gcGFja2V0LT5vcHRpb25zOworCXJlbSA9IHNpemVvZihwYWNrZXQtPm9wdGlvbnMpOworCXdoaWxlICgxKSB7CisJCWlmIChyZW0gPD0gMCkgeworCQkJYmJfZXJyb3JfbXNnKCJiYWQgcGFja2V0LCBtYWxmb3JtZWQgb3B0aW9uIGZpZWxkIik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlpZiAob3B0aW9ucHRyW09QVF9DT0RFXSA9PSBESENQX1BBRERJTkcpIHsKKwkJCXJlbS0tOworCQkJb3B0aW9ucHRyKys7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAob3B0aW9ucHRyW09QVF9DT0RFXSA9PSBESENQX0VORCkgeworCQkJaWYgKChvdmVybG9hZCAmIEZJTEVfRklFTEQxMDEpID09IEZJTEVfRklFTEQpIHsKKwkJCQkvKiBjYW4gdXNlIHBhY2tldC0+ZmlsZSwgYW5kIGRpZG4ndCBsb29rIGF0IGl0IHlldCAqLworCQkJCW92ZXJsb2FkIHw9IEZJTEVfRklFTEQxMDE7IC8qICJ3ZSBsb29rZWQgYXQgaXQiICovCisJCQkJb3B0aW9ucHRyID0gcGFja2V0LT5maWxlOworCQkJCXJlbSA9IHNpemVvZihwYWNrZXQtPmZpbGUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKChvdmVybG9hZCAmIFNOQU1FX0ZJRUxEMTAxKSA9PSBTTkFNRV9GSUVMRCkgeworCQkJCS8qIGNhbiB1c2UgcGFja2V0LT5zbmFtZSwgYW5kIGRpZG4ndCBsb29rIGF0IGl0IHlldCAqLworCQkJCW92ZXJsb2FkIHw9IFNOQU1FX0ZJRUxEMTAxOyAvKiAid2UgbG9va2VkIGF0IGl0IiAqLworCQkJCW9wdGlvbnB0ciA9IHBhY2tldC0+c25hbWU7CisJCQkJcmVtID0gc2l6ZW9mKHBhY2tldC0+c25hbWUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJbGVuID0gMiArIG9wdGlvbnB0cltPUFRfTEVOXTsKKwkJcmVtIC09IGxlbjsKKwkJaWYgKHJlbSA8IDApCisJCQljb250aW51ZTsgLyogY29tcGxhaW4gYW5kIHJldHVybiBOVUxMICovCisKKwkJaWYgKG9wdGlvbnB0cltPUFRfQ09ERV0gPT0gY29kZSkgeworCQkJbG9nX29wdGlvbigiT3B0aW9uIGZvdW5kIiwgb3B0aW9ucHRyKTsKKwkJCXJldHVybiBvcHRpb25wdHIgKyBPUFRfREFUQTsKKwkJfQorCisJCWlmIChvcHRpb25wdHJbT1BUX0NPREVdID09IERIQ1BfT1BUSU9OX09WRVJMT0FEKSB7CisJCQlvdmVybG9hZCB8PSBvcHRpb25wdHJbT1BUX0RBVEFdOworCQkJLyogZmFsbCB0aHJvdWdoICovCisJCX0KKwkJb3B0aW9ucHRyICs9IGxlbjsKKwl9CisKKwkvKiBsb2czIGJlY2F1c2UgdWRoY3BjIHVzZXMgaXQgYSBsb3QgLSB2ZXJ5IG5vaXN5ICovCisJbG9nMygiT3B0aW9uIDB4JTAyeCBub3QgZm91bmQiLCBjb2RlKTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogUmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgJ2VuZCcgb3B0aW9uIChubyBib3VuZHMgY2hlY2tpbmcpICovCitpbnQgRkFTVF9GVU5DIHVkaGNwX2VuZF9vcHRpb24odWludDhfdCAqb3B0aW9ucHRyKQoreworCWludCBpID0gMDsKKworCXdoaWxlIChvcHRpb25wdHJbaV0gIT0gREhDUF9FTkQpIHsKKwkJaWYgKG9wdGlvbnB0cltpXSAhPSBESENQX1BBRERJTkcpCisJCQlpICs9IG9wdGlvbnB0cltpICsgT1BUX0xFTl0gKyBPUFRfREFUQS0xOworCQlpKys7CisJfQorCXJldHVybiBpOworfQorCisvKiBBZGQgYW4gb3B0aW9uIChzdXBwbGllZCBpbiBiaW5hcnkgZm9ybSkgdG8gdGhlIG9wdGlvbnMuCisgKiBPcHRpb24gZm9ybWF0OiBbY29kZV1bbGVuXVtkYXRhMV1bZGF0YTJdLi5bZGF0YUxFTl0KKyAqLwordm9pZCBGQVNUX0ZVTkMgdWRoY3BfYWRkX2JpbmFyeV9vcHRpb24oc3RydWN0IGRoY3BfcGFja2V0ICpwYWNrZXQsIHVpbnQ4X3QgKmFkZG9wdCkKK3sKKwl1bnNpZ25lZCBsZW47CisJdWludDhfdCAqb3B0aW9ucHRyID0gcGFja2V0LT5vcHRpb25zOworCXVuc2lnbmVkIGVuZCA9IHVkaGNwX2VuZF9vcHRpb24ob3B0aW9ucHRyKTsKKworCWxlbiA9IE9QVF9EQVRBICsgYWRkb3B0W09QVF9MRU5dOworCS8qIGVuZCBwb3NpdGlvbiArIChvcHRpb24gY29kZS9sZW5ndGggKyBhZGRvcHQgbGVuZ3RoKSArIGVuZCBvcHRpb24gKi8KKwlpZiAoZW5kICsgbGVuICsgMSA+PSBESENQX09QVElPTlNfQlVGU0laRSkgeworLy9UT0RPOiBsZWFybiBob3cgdG8gdXNlIG92ZXJmbG93IG9wdGlvbiBpZiB3ZSBleGhhdXN0IHBhY2tldC0+b3B0aW9uc1tdCisJCWJiX2Vycm9yX21zZygib3B0aW9uIDB4JTAyeCBkaWQgbm90IGZpdCBpbnRvIHRoZSBwYWNrZXQiLAorCQkJCWFkZG9wdFtPUFRfQ09ERV0pOworCQlyZXR1cm47CisJfQorCWxvZ19vcHRpb24oIkFkZGluZyBvcHRpb24iLCBhZGRvcHQpOworCW1lbWNweShvcHRpb25wdHIgKyBlbmQsIGFkZG9wdCwgbGVuKTsKKwlvcHRpb25wdHJbZW5kICsgbGVuXSA9IERIQ1BfRU5EOworfQorCisvKiBBZGQgYW4gb25lIHRvIGZvdXIgYnl0ZSBvcHRpb24gdG8gYSBwYWNrZXQgKi8KK3ZvaWQgRkFTVF9GVU5DIHVkaGNwX2FkZF9zaW1wbGVfb3B0aW9uKHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0LCB1aW50OF90IGNvZGUsIHVpbnQzMl90IGRhdGEpCit7CisJY29uc3Qgc3RydWN0IGRoY3Bfb3B0ZmxhZyAqZGg7CisKKwlmb3IgKGRoID0gZGhjcF9vcHRmbGFnczsgZGgtPmNvZGU7IGRoKyspIHsKKwkJaWYgKGRoLT5jb2RlID09IGNvZGUpIHsKKwkJCXVpbnQ4X3Qgb3B0aW9uWzZdLCBsZW47CisKKwkJCW9wdGlvbltPUFRfQ09ERV0gPSBjb2RlOworCQkJbGVuID0gZGhjcF9vcHRpb25fbGVuZ3Roc1tkaC0+ZmxhZ3MgJiBPUFRJT05fVFlQRV9NQVNLXTsKKwkJCW9wdGlvbltPUFRfTEVOXSA9IGxlbjsKKwkJCWlmIChCQl9CSUdfRU5ESUFOKQorCQkJCWRhdGEgPDw9IDggKiAoNCAtIGxlbik7CisJCQkvKiBBc3NpZ25tZW50IGlzIHVuYWxpZ25lZCEgKi8KKwkJCW1vdmVfdG9fdW5hbGlnbmVkMzIoJm9wdGlvbltPUFRfREFUQV0sIGRhdGEpOworCQkJdWRoY3BfYWRkX2JpbmFyeV9vcHRpb24ocGFja2V0LCBvcHRpb24pOworCQkJcmV0dXJuOworCQl9CisJfQorCisJYmJfZXJyb3JfbXNnKCJjYW4ndCBhZGQgb3B0aW9uIDB4JTAyeCIsIGNvZGUpOworfQorCisvKiBGaW5kIG9wdGlvbiAnY29kZScgaW4gb3B0X2xpc3QgKi8KK3N0cnVjdCBvcHRpb25fc2V0KiBGQVNUX0ZVTkMgdWRoY3BfZmluZF9vcHRpb24oc3RydWN0IG9wdGlvbl9zZXQgKm9wdF9saXN0LCB1aW50OF90IGNvZGUpCit7CisJd2hpbGUgKG9wdF9saXN0ICYmIG9wdF9saXN0LT5kYXRhW09QVF9DT0RFXSA8IGNvZGUpCisJCW9wdF9saXN0ID0gb3B0X2xpc3QtPm5leHQ7CisKKwlpZiAob3B0X2xpc3QgJiYgb3B0X2xpc3QtPmRhdGFbT1BUX0NPREVdID09IGNvZGUpCisJCXJldHVybiBvcHRfbGlzdDsKKwlyZXR1cm4gTlVMTDsKK30KKworLyogUGFyc2Ugc3RyaW5nIHRvIElQIGluIG5ldHdvcmsgb3JkZXIgKi8KK2ludCBGQVNUX0ZVTkMgdWRoY3Bfc3RyMm5pcChjb25zdCBjaGFyICpzdHIsIHZvaWQgKmFyZykKK3sKKwlsZW5fYW5kX3NvY2thZGRyICpsc2E7CisKKwlsc2EgPSBob3N0X2FuZF9hZjJzb2NrYWRkcihzdHIsIDAsIEFGX0lORVQpOworCWlmICghbHNhKQorCQlyZXR1cm4gMDsKKwkvKiBhcmcgbWF5YmUgdW5hbGlnbmVkICovCisJbW92ZV90b191bmFsaWduZWQzMigodWludDMyX3QqKWFyZywgbHNhLT51LnNpbi5zaW5fYWRkci5zX2FkZHIpOworCWZyZWUobHNhKTsKKwlyZXR1cm4gMTsKK30KKworLyogdWRoY3Bfc3RyMm9wdHNldDoKKyAqIFBhcnNlIHN0cmluZyBvcHRpb24gcmVwcmVzZW50YXRpb24gdG8gYmluYXJ5IGZvcm0gYW5kIGFkZCBpdCB0byBvcHRfbGlzdC4KKyAqIENhbGxlZCB0byBwYXJzZSAidWRoY3BjIC14IE9QVE5BTUU6T1BUVkFMIgorICogYW5kIHRvIHBhcnNlIHVkaGNwZC5jb25mJ3MgIm9wdCBPUFROQU1FIE9QVFZBTCIgZGlyZWN0aXZlcy4KKyAqLworLyogaGVscGVyIGZvciB0aGUgaGVscGVyICovCitzdGF0aWMgY2hhciAqYWxsb2NhdGVfdGVtcG9wdF9pZl9uZWVkZWQoCisJCWNvbnN0IHN0cnVjdCBkaGNwX29wdGZsYWcgKm9wdGZsYWcsCisJCWNoYXIgKmJ1ZmZlciwKKwkJaW50ICpsZW5ndGhfcCkKK3sKKwljaGFyICphbGxvY2F0ZWQgPSBOVUxMOworCWlmICgob3B0ZmxhZy0+ZmxhZ3MgJiBPUFRJT05fVFlQRV9NQVNLKSA9PSBPUFRJT05fQklOKSB7CisJCWNvbnN0IGNoYXIgKmVuZDsKKwkJYWxsb2NhdGVkID0geHN0cmR1cChidWZmZXIpOyAvKiBtb3JlIHRoYW4gZW5vdWdoICovCisJCWVuZCA9IGhleDJiaW4oYWxsb2NhdGVkLCBidWZmZXIsIDI1NSk7CisJCWlmIChlcnJubykKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtYWxmb3JtZWQgaGV4IHN0cmluZyAnJXMnIiwgYnVmZmVyKTsKKwkJKmxlbmd0aF9wID0gZW5kIC0gYWxsb2NhdGVkOworCX0KKwlyZXR1cm4gYWxsb2NhdGVkOworfQorLyogaGVscGVyOiBhZGQgYW4gb3B0aW9uIHRvIHRoZSBvcHRfbGlzdCAqLworc3RhdGljIE5PSU5MSU5FIHZvaWQgYXR0YWNoX29wdGlvbigKKwkJc3RydWN0IG9wdGlvbl9zZXQgKipvcHRfbGlzdCwKKwkJY29uc3Qgc3RydWN0IGRoY3Bfb3B0ZmxhZyAqb3B0ZmxhZywKKwkJY2hhciAqYnVmZmVyLAorCQlpbnQgbGVuZ3RoKQoreworCXN0cnVjdCBvcHRpb25fc2V0ICpleGlzdGluZzsKKwljaGFyICphbGxvY2F0ZWQ7CisKKwlhbGxvY2F0ZWQgPSBhbGxvY2F0ZV90ZW1wb3B0X2lmX25lZWRlZChvcHRmbGFnLCBidWZmZXIsICZsZW5ndGgpOworI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQX1JGQzMzOTcKKwlpZiAoKG9wdGZsYWctPmZsYWdzICYgT1BUSU9OX1RZUEVfTUFTSykgPT0gT1BUSU9OX0ROU19TVFJJTkcpIHsKKwkJLyogcmV1c2UgYnVmZmVyIGFuZCBsZW5ndGggZm9yIFJGQzEwMzUtZm9ybWF0dGVkIHN0cmluZyAqLworCQlhbGxvY2F0ZWQgPSBidWZmZXIgPSAoY2hhciAqKWRuYW1lX2VuYyhOVUxMLCAwLCBidWZmZXIsICZsZW5ndGgpOworCX0KKyNlbmRpZgorCisJZXhpc3RpbmcgPSB1ZGhjcF9maW5kX29wdGlvbigqb3B0X2xpc3QsIG9wdGZsYWctPmNvZGUpOworCWlmICghZXhpc3RpbmcpIHsKKwkJc3RydWN0IG9wdGlvbl9zZXQgKm5ldywgKipjdXJyOworCisJCS8qIG1ha2UgYSBuZXcgb3B0aW9uICovCisJCWxvZzIoIkF0dGFjaGluZyBvcHRpb24gJTAyeCB0byBsaXN0Iiwgb3B0ZmxhZy0+Y29kZSk7CisJCW5ldyA9IHhtYWxsb2Moc2l6ZW9mKCpuZXcpKTsKKwkJbmV3LT5kYXRhID0geG1hbGxvYyhsZW5ndGggKyBPUFRfREFUQSk7CisJCW5ldy0+ZGF0YVtPUFRfQ09ERV0gPSBvcHRmbGFnLT5jb2RlOworCQluZXctPmRhdGFbT1BUX0xFTl0gPSBsZW5ndGg7CisJCW1lbWNweShuZXctPmRhdGEgKyBPUFRfREFUQSwgKGFsbG9jYXRlZCA/IGFsbG9jYXRlZCA6IGJ1ZmZlciksIGxlbmd0aCk7CisKKwkJY3VyciA9IG9wdF9saXN0OworCQl3aGlsZSAoKmN1cnIgJiYgKCpjdXJyKS0+ZGF0YVtPUFRfQ09ERV0gPCBvcHRmbGFnLT5jb2RlKQorCQkJY3VyciA9ICYoKmN1cnIpLT5uZXh0OworCisJCW5ldy0+bmV4dCA9ICpjdXJyOworCQkqY3VyciA9IG5ldzsKKwkJZ290byByZXQ7CisJfQorCisJaWYgKG9wdGZsYWctPmZsYWdzICYgT1BUSU9OX0xJU1QpIHsKKwkJdW5zaWduZWQgb2xkX2xlbjsKKworCQkvKiBhZGQgaXQgdG8gYW4gZXhpc3Rpbmcgb3B0aW9uICovCisJCWxvZzIoIkF0dGFjaGluZyBvcHRpb24gJTAyeCB0byBleGlzdGluZyBtZW1iZXIgb2YgbGlzdCIsIG9wdGZsYWctPmNvZGUpOworCQlvbGRfbGVuID0gZXhpc3RpbmctPmRhdGFbT1BUX0xFTl07CisJCWlmIChvbGRfbGVuICsgbGVuZ3RoIDwgMjU1KSB7CisJCQkvKiBhY3R1YWxseSAyNTUgaXMgb2sgdG9vLCBidXQgYWRkaW5nIGEgc3BhY2UgY2FuIG92ZXJsb3cgaXQgKi8KKworCQkJZXhpc3RpbmctPmRhdGEgPSB4cmVhbGxvYyhleGlzdGluZy0+ZGF0YSwgT1BUX0RBVEEgKyAxICsgb2xkX2xlbiArIGxlbmd0aCk7CisJCQlpZiAoKG9wdGZsYWctPmZsYWdzICYgT1BUSU9OX1RZUEVfTUFTSykgPT0gT1BUSU9OX1NUUklORworCQkJIHx8IChvcHRmbGFnLT5mbGFncyAmIE9QVElPTl9UWVBFX01BU0spID09IE9QVElPTl9TVFJJTkdfSE9TVAorCQkJKSB7CisJCQkJLyogYWRkIHNwYWNlIHNlcGFyYXRvciBiZXR3ZWVuIFNUUklORyBvcHRpb25zIGluIGEgbGlzdCAqLworCQkJCWV4aXN0aW5nLT5kYXRhW09QVF9EQVRBICsgb2xkX2xlbl0gPSAnICc7CisJCQkJb2xkX2xlbisrOworCQkJfQorCQkJbWVtY3B5KGV4aXN0aW5nLT5kYXRhICsgT1BUX0RBVEEgKyBvbGRfbGVuLCAoYWxsb2NhdGVkID8gYWxsb2NhdGVkIDogYnVmZmVyKSwgbGVuZ3RoKTsKKwkJCWV4aXN0aW5nLT5kYXRhW09QVF9MRU5dID0gb2xkX2xlbiArIGxlbmd0aDsKKwkJfSAvKiBlbHNlLCBpZ25vcmUgdGhlIGRhdGEsIHdlIGNvdWxkIHB1dCB0aGlzIGluIGEgc2Vjb25kIG9wdGlvbiBpbiB0aGUgZnV0dXJlICovCisJfSAvKiBlbHNlLCBpZ25vcmUgdGhlIG5ldyBkYXRhICovCisKKyByZXQ6CisJZnJlZShhbGxvY2F0ZWQpOworfQorCitpbnQgRkFTVF9GVU5DIHVkaGNwX3N0cjJvcHRzZXQoY29uc3QgY2hhciAqY29uc3Rfc3RyLCB2b2lkICphcmcpCit7CisJc3RydWN0IG9wdGlvbl9zZXQgKipvcHRfbGlzdCA9IGFyZzsKKwljaGFyICpvcHQsICp2YWw7CisJY2hhciAqc3RyOworCWNvbnN0IHN0cnVjdCBkaGNwX29wdGZsYWcgKm9wdGZsYWc7CisJc3RydWN0IGRoY3Bfb3B0ZmxhZyBiaW5fb3B0ZmxhZzsKKwl1bnNpZ25lZCBvcHRjb2RlOworCWludCByZXR2YWwsIGxlbmd0aDsKKwkvKiBJUF9QQUlSIG5lZWRzIDggYnl0ZXMsIFNUQVRJQ19ST1VURVMgbmVlZHMgOSBtYXggKi8KKwljaGFyIGJ1ZmZlcls5XSBBTElHTkVEKDQpOworCXVpbnQxNl90ICpyZXN1bHRfdTE2ID0gKHVpbnQxNl90ICopIGJ1ZmZlcjsKKwl1aW50MzJfdCAqcmVzdWx0X3UzMiA9ICh1aW50MzJfdCAqKSBidWZmZXI7CisKKwkvKiBDaGVhdCwgdGhlIG9ubHkgKmNvbnN0KiBzdHIgcG9zc2libGUgaXMgIiIgKi8KKwlzdHIgPSAoY2hhciAqKSBjb25zdF9zdHI7CisJb3B0ID0gc3RydG9rKHN0ciwgIiBcdD0iKTsKKwlpZiAoIW9wdCkKKwkJcmV0dXJuIDA7CisKKwlvcHRjb2RlID0gYmJfc3RydG91KG9wdCwgTlVMTCwgMCk7CisJaWYgKCFlcnJubyAmJiBvcHRjb2RlIDwgMjU1KSB7CisJCS8qIFJhdyAobnVtZXJpYykgb3B0aW9uIGNvZGUgKi8KKwkJYmluX29wdGZsYWcuZmxhZ3MgPSBPUFRJT05fQklOOworCQliaW5fb3B0ZmxhZy5jb2RlID0gb3B0Y29kZTsKKwkJb3B0ZmxhZyA9ICZiaW5fb3B0ZmxhZzsKKwl9IGVsc2UgeworCQlvcHRmbGFnID0gJmRoY3Bfb3B0ZmxhZ3NbdWRoY3Bfb3B0aW9uX2lkeChvcHQpXTsKKwl9CisKKwlyZXR2YWwgPSAwOworCWRvIHsKKwkJdmFsID0gc3RydG9rKE5VTEwsICIsIFx0Iik7CisJCWlmICghdmFsKQorCQkJYnJlYWs7CisJCWxlbmd0aCA9IGRoY3Bfb3B0aW9uX2xlbmd0aHNbb3B0ZmxhZy0+ZmxhZ3MgJiBPUFRJT05fVFlQRV9NQVNLXTsKKwkJcmV0dmFsID0gMDsKKwkJb3B0ID0gYnVmZmVyOyAvKiBuZXcgbWVhbmluZyBmb3IgdmFyaWFibGUgb3B0ICovCisJCXN3aXRjaCAob3B0ZmxhZy0+ZmxhZ3MgJiBPUFRJT05fVFlQRV9NQVNLKSB7CisJCWNhc2UgT1BUSU9OX0lQOgorCQkJcmV0dmFsID0gdWRoY3Bfc3RyMm5pcCh2YWwsIGJ1ZmZlcik7CisJCQlicmVhazsKKwkJY2FzZSBPUFRJT05fSVBfUEFJUjoKKwkJCXJldHZhbCA9IHVkaGNwX3N0cjJuaXAodmFsLCBidWZmZXIpOworCQkJdmFsID0gc3RydG9rKE5VTEwsICIsIFx0Ly0iKTsKKwkJCWlmICghdmFsKQorCQkJCXJldHZhbCA9IDA7CisJCQlpZiAocmV0dmFsKQorCQkJCXJldHZhbCA9IHVkaGNwX3N0cjJuaXAodmFsLCBidWZmZXIgKyA0KTsKKwkJCWJyZWFrOworCQljYXNlIE9QVElPTl9TVFJJTkc6CisJCWNhc2UgT1BUSU9OX1NUUklOR19IT1NUOgorI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQX1JGQzMzOTcKKwkJY2FzZSBPUFRJT05fRE5TX1NUUklORzoKKyNlbmRpZgorCQkJbGVuZ3RoID0gc3Rybmxlbih2YWwsIDI1NCk7CisJCQlpZiAobGVuZ3RoID4gMCkgeworCQkJCW9wdCA9IHZhbDsKKwkJCQlyZXR2YWwgPSAxOworCQkJfQorCQkJYnJlYWs7CisvLwkJY2FzZSBPUFRJT05fQk9PTEVBTjogeworLy8JCQlzdGF0aWMgY29uc3QgY2hhciBub195ZXNbXSBBTElHTjEgPSAibm9cMHllc1wwIjsKKy8vCQkJYnVmZmVyWzBdID0gcmV0dmFsID0gaW5kZXhfaW5fc3RyaW5ncyhub195ZXMsIHZhbCk7CisvLwkJCXJldHZhbCsrOyAvKiAwIC0gYmFkOyAxOiAibm8iIDI6ICJ5ZXMiICovCisvLwkJCWJyZWFrOworLy8JCX0KKwkJY2FzZSBPUFRJT05fVTg6CisJCQlidWZmZXJbMF0gPSBiYl9zdHJ0b3UzMih2YWwsIE5VTEwsIDApOworCQkJcmV0dmFsID0gKGVycm5vID09IDApOworCQkJYnJlYWs7CisJCS8qIGh0b25YIGFyZSBtYWNyb3MgaW4gb2xkZXIgbGliYydzLCB1c2luZyB0ZW1wIHZhcgorCQkgKiBpbiBjb2RlIGJlbG93IGZvciBzYWZldHkgKi8KKwkJLyogVE9ETzogdXNlIGJiX3N0cnRvWD8gKi8KKwkJY2FzZSBPUFRJT05fVTE2OiB7CisJCQl1aW50MzJfdCB0bXAgPSBiYl9zdHJ0b3UzMih2YWwsIE5VTEwsIDApOworCQkJKnJlc3VsdF91MTYgPSBodG9ucyh0bXApOworCQkJcmV0dmFsID0gKGVycm5vID09IDAgLyomJiB0bXAgPCAweDEwMDAwKi8pOworCQkJYnJlYWs7CisJCX0KKy8vCQljYXNlIE9QVElPTl9TMTY6IHsKKy8vCQkJbG9uZyB0bXAgPSBiYl9zdHJ0b2kzMih2YWwsIE5VTEwsIDApOworLy8JCQkqcmVzdWx0X3UxNiA9IGh0b25zKHRtcCk7CisvLwkJCXJldHZhbCA9IChlcnJubyA9PSAwKTsKKy8vCQkJYnJlYWs7CisvLwkJfQorCQljYXNlIE9QVElPTl9VMzI6IHsKKwkJCXVpbnQzMl90IHRtcCA9IGJiX3N0cnRvdTMyKHZhbCwgTlVMTCwgMCk7CisJCQkqcmVzdWx0X3UzMiA9IGh0b25sKHRtcCk7CisJCQlyZXR2YWwgPSAoZXJybm8gPT0gMCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIE9QVElPTl9TMzI6IHsKKwkJCWludDMyX3QgdG1wID0gYmJfc3RydG9pMzIodmFsLCBOVUxMLCAwKTsKKwkJCSpyZXN1bHRfdTMyID0gaHRvbmwodG1wKTsKKwkJCXJldHZhbCA9IChlcnJubyA9PSAwKTsKKwkJCWJyZWFrOworCQl9CisJCWNhc2UgT1BUSU9OX1NUQVRJQ19ST1VURVM6IHsKKwkJCS8qIElucHV0OiAiYS5iLmMuZC9tIiAqLworCQkJLyogT3V0cHV0OiBtYXNrKDEgYnl0ZSkscGZ4KDAtNCBieXRlcyksZ3coNCBieXRlcykgKi8KKwkJCXVuc2lnbmVkIG1hc2s7CisJCQljaGFyICpzbGFzaCA9IHN0cmNocih2YWwsICcvJyk7CisJCQlpZiAoc2xhc2gpIHsKKwkJCQkqc2xhc2ggPSAnXDAnOworCQkJCXJldHZhbCA9IHVkaGNwX3N0cjJuaXAodmFsLCBidWZmZXIgKyAxKTsKKwkJCQlidWZmZXJbMF0gPSBtYXNrID0gYmJfc3RydG91KHNsYXNoICsgMSwgTlVMTCwgMTApOworCQkJCXZhbCA9IHN0cnRvayhOVUxMLCAiLCBcdC8tIik7CisJCQkJaWYgKCF2YWwgfHwgbWFzayA+IDMyIHx8IGVycm5vKQorCQkJCQlyZXR2YWwgPSAwOworCQkJCWlmIChyZXR2YWwpIHsKKwkJCQkJbGVuZ3RoID0gKChtYXNrICsgNykgPj4gMykgKyA1OworCQkJCQlyZXR2YWwgPSB1ZGhjcF9zdHIybmlwKHZhbCwgYnVmZmVyICsgKGxlbmd0aCAtIDQpKTsKKwkJCQl9CisJCQl9CisJCQlicmVhazsKKwkJfQorCQljYXNlIE9QVElPTl9CSU46IC8qIGhhbmRsZWQgaW4gYXR0YWNoX29wdGlvbigpICovCisJCQlvcHQgPSB2YWw7CisJCQlyZXR2YWwgPSAxOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJaWYgKHJldHZhbCkKKwkJCWF0dGFjaF9vcHRpb24ob3B0X2xpc3QsIG9wdGZsYWcsIG9wdCwgbGVuZ3RoKTsKKwl9IHdoaWxlIChyZXR2YWwgJiYgKG9wdGZsYWctPmZsYWdzICYgT1BUSU9OX0xJU1QpKTsKKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIG5vdGU6IGlwIGlzIGEgcG9pbnRlciB0byBhbiBJUHY2IGluIG5ldHdvcmsgb3JkZXIsIHBvc3NpYmx5IG1pc2FsaWdlZCAqLworaW50IEZBU1RfRlVOQyBzcHJpbnRfbmlwNihjaGFyICpkZXN0LCAvKmNvbnN0IGNoYXIgKnByZSwqLyBjb25zdCB1aW50OF90ICppcCkKK3sKKwljaGFyIGhleHN0cmJ1ZlsxNiAqIDJdOworCWJpbjJoZXgoaGV4c3RyYnVmLCAodm9pZCopaXAsIDE2KTsKKwlyZXR1cm4gc3ByaW50ZihkZXN0LCAvKiAiJXMiICovCisJCSIlLjRzOiUuNHM6JS40czolLjRzOiUuNHM6JS40czolLjRzOiUuNHMiLAorCQkvKiBwcmUsICovCisJCWhleHN0cmJ1ZiArIDAgKiA0LAorCQloZXhzdHJidWYgKyAxICogNCwKKwkJaGV4c3RyYnVmICsgMiAqIDQsCisJCWhleHN0cmJ1ZiArIDMgKiA0LAorCQloZXhzdHJidWYgKyA0ICogNCwKKwkJaGV4c3RyYnVmICsgNSAqIDQsCisJCWhleHN0cmJ1ZiArIDYgKiA0LAorCQloZXhzdHJidWYgKyA3ICogNAorCSk7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3VkaGNwL2NvbW1vbi5oIGIvbmV0d29ya2luZy91ZGhjcC9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjA2NTllCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy91ZGhjcC9jb21tb24uaApAQCAtMCwwICsxLDMyMiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogUnVzcyBEaWxsIDxSdXNzLkRpbGxAYXN1LmVkdT4gU2VwdGVtYmVyIDIwMDEKKyAqIFJld3JpdHRlbiBieSBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+IChDKSAyMDAzCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2lmbmRlZiBVREhDUF9DT01NT05fSAorI2RlZmluZSBVREhDUF9DT01NT05fSCAxCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPG5ldGluZXQvdWRwLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pcC5oPgorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgTUFDX0JDQVNUX0FERFJbNl0gQUxJR04yOyAvKiBzaXggYWxsLW9uZXMgKi8KKworCisvKioqIERIQ1AgcGFja2V0ICoqKi8KKworLyogREhDUCBwcm90b2NvbC4gU2VlIFJGQyAyMTMxICovCisjZGVmaW5lIERIQ1BfTUFHSUMgICAgICAgICAgICAgIDB4NjM4MjUzNjMKKyNkZWZpbmUgREhDUF9PUFRJT05TX0JVRlNJWkUgICAgMzA4CisjZGVmaW5lIEJPT1RSRVFVRVNUICAgICAgICAgICAgIDEKKyNkZWZpbmUgQk9PVFJFUExZICAgICAgICAgICAgICAgMgorCisvL1RPRE86IHJlbmFtZSBjaWFkZHIveWlhZGRyL2NoYWRkcgorc3RydWN0IGRoY3BfcGFja2V0IHsKKwl1aW50OF90IG9wOyAgICAgIC8qIEJPT1RSRVFVRVNUIG9yIEJPT1RSRVBMWSAqLworCXVpbnQ4X3QgaHR5cGU7ICAgLyogaGFyZHdhcmUgYWRkcmVzcyB0eXBlLiAxID0gMTBtYiBldGhlcm5ldCAqLworCXVpbnQ4X3QgaGxlbjsgICAgLyogaGFyZHdhcmUgYWRkcmVzcyBsZW5ndGggKi8KKwl1aW50OF90IGhvcHM7ICAgIC8qIHVzZWQgYnkgcmVsYXkgYWdlbnRzIG9ubHkgKi8KKwl1aW50MzJfdCB4aWQ7ICAgIC8qIHVuaXF1ZSBpZCAqLworCXVpbnQxNl90IHNlY3M7ICAgLyogZWxhcHNlZCBzaW5jZSBjbGllbnQgYmVnYW4gYWNxdWlzaXRpb24vcmVuZXdhbCAqLworCXVpbnQxNl90IGZsYWdzOyAgLyogb25seSBvbmUgZmxhZyBzbyBmYXI6ICovCisjZGVmaW5lIEJST0FEQ0FTVF9GTEFHIDB4ODAwMCAvKiAiSSBuZWVkIGJyb2FkY2FzdCByZXBsaWVzIiAqLworCXVpbnQzMl90IGNpYWRkcjsgLyogY2xpZW50IElQIChpZiBjbGllbnQgaXMgaW4gQk9VTkQsIFJFTkVXIG9yIFJFQklORElORyBzdGF0ZSkgKi8KKwl1aW50MzJfdCB5aWFkZHI7IC8qICd5b3VyJyAoY2xpZW50KSBJUCBhZGRyZXNzICovCisJLyogSVAgYWRkcmVzcyBvZiBuZXh0IHNlcnZlciB0byB1c2UgaW4gYm9vdHN0cmFwLCByZXR1cm5lZCBpbiBESENQT0ZGRVIsIERIQ1BBQ0sgYnkgc2VydmVyICovCisJdWludDMyX3Qgc2lhZGRyX25pcDsKKwl1aW50MzJfdCBnYXRld2F5X25pcDsgLyogcmVsYXkgYWdlbnQgSVAgYWRkcmVzcyAqLworCXVpbnQ4X3QgY2hhZGRyWzE2XTsgICAvKiBsaW5rLWxheWVyIGNsaWVudCBoYXJkd2FyZSBhZGRyZXNzIChNQUMpICovCisJdWludDhfdCBzbmFtZVs2NF07ICAgIC8qIHNlcnZlciBob3N0IG5hbWUgKEFTQ0laKSAqLworCXVpbnQ4X3QgZmlsZVsxMjhdOyAgICAvKiBib290IGZpbGUgbmFtZSAoQVNDSVopICovCisJdWludDMyX3QgY29va2llOyAgICAgIC8qIGZpeGVkIGZpcnN0IGZvdXIgb3B0aW9uIGJ5dGVzICg5OSwxMzAsODMsOTkgZGVjKSAqLworCXVpbnQ4X3Qgb3B0aW9uc1tESENQX09QVElPTlNfQlVGU0laRSArIENPTkZJR19VREhDUENfU0xBQ0tfRk9SX0JVR0dZX1NFUlZFUlNdOworfSBQQUNLRUQ7CisjZGVmaW5lIERIQ1BfUEtUX1NOQU1FX0xFTiAgICAgIDY0CisjZGVmaW5lIERIQ1BfUEtUX0ZJTEVfTEVOICAgICAgMTI4CisjZGVmaW5lIERIQ1BfUEtUX1NOQU1FX0xFTl9TVFIgIjY0IgorI2RlZmluZSBESENQX1BLVF9GSUxFX0xFTl9TVFIgIjEyOCIKKworc3RydWN0IGlwX3VkcF9kaGNwX3BhY2tldCB7CisJc3RydWN0IGlwaGRyIGlwOworCXN0cnVjdCB1ZHBoZHIgdWRwOworCXN0cnVjdCBkaGNwX3BhY2tldCBkYXRhOworfSBQQUNLRUQ7CisKK3N0cnVjdCB1ZHBfZGhjcF9wYWNrZXQgeworCXN0cnVjdCB1ZHBoZHIgdWRwOworCXN0cnVjdCBkaGNwX3BhY2tldCBkYXRhOworfSBQQUNLRUQ7CisKK2VudW0geworCUlQX1VEUF9ESENQX1NJWkUgPSBzaXplb2Yoc3RydWN0IGlwX3VkcF9kaGNwX3BhY2tldCkgLSBDT05GSUdfVURIQ1BDX1NMQUNLX0ZPUl9CVUdHWV9TRVJWRVJTLAorCVVEUF9ESENQX1NJWkUgICAgPSBzaXplb2Yoc3RydWN0IHVkcF9kaGNwX3BhY2tldCkgLSBDT05GSUdfVURIQ1BDX1NMQUNLX0ZPUl9CVUdHWV9TRVJWRVJTLAorCURIQ1BfU0laRSAgICAgICAgPSBzaXplb2Yoc3RydWN0IGRoY3BfcGFja2V0KSAtIENPTkZJR19VREhDUENfU0xBQ0tfRk9SX0JVR0dZX1NFUlZFUlMsCit9OworCisvKiBMZXQncyBzZWUgd2hldGhlciBjb21waWxlciB1bmRlcnN0b29kIHVzIHJpZ2h0ICovCitzdHJ1Y3QgQlVHX2JhZF9zaXplb2Zfc3RydWN0X2lwX3VkcF9kaGNwX3BhY2tldCB7CisJY2hhciBjW0lQX1VEUF9ESENQX1NJWkUgPT0gNTc2ID8gMSA6IC0xXTsKK307CisKKworLyoqKiBPcHRpb25zICoqKi8KKworZW51bSB7CisJT1BUSU9OX0lQID0gMSwKKwlPUFRJT05fSVBfUEFJUiwKKwlPUFRJT05fU1RSSU5HLAorCS8qIE9wdHMgb2YgU1RSSU5HX0hPU1QgdHlwZSB3aWxsIGJlIHNhbml0aXplZCBiZWZvcmUgdGhleSBhcmUgcGFzc2VkCisJICogdG8gdWRoY3BjIHNjcmlwdCdzIGVudmlyb25tZW50OiAqLworCU9QVElPTl9TVFJJTkdfSE9TVCwKKy8vCU9QVElPTl9CT09MRUFOLAorCU9QVElPTl9VOCwKKwlPUFRJT05fVTE2LAorLy8JT1BUSU9OX1MxNiwKKwlPUFRJT05fVTMyLAorCU9QVElPTl9TMzIsCisJT1BUSU9OX0JJTiwKKwlPUFRJT05fU1RBVElDX1JPVVRFUywKKwlPUFRJT05fNlJELAorI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQX1JGQzMzOTcKKwlPUFRJT05fRE5TX1NUUklORywgIC8qIFJGQzEwMzUgY29tcHJlc3NlZCBkb21haW4gbmFtZSBsaXN0ICovCisJT1BUSU9OX1NJUF9TRVJWRVJTLAorI2VuZGlmCisKKwlPUFRJT05fVFlQRV9NQVNLID0gMHgwZiwKKwkvKiBDbGllbnQgcmVxdWVzdHMgdGhpcyBvcHRpb24gYnkgZGVmYXVsdCAqLworCU9QVElPTl9SRVEgID0gMHgxMCwKKwkvKiBUaGVyZSBjYW4gYmUgYSBsaXN0IG9mIDEgb3IgbW9yZSBvZiB0aGVzZSAqLworCU9QVElPTl9MSVNUID0gMHgyMCwKK307CisKKy8qIERIQ1Agb3B0aW9uIGNvZGVzIChwYXJ0aWFsIGxpc3QpLiBTZWUgUkZDIDIxMzIgYW5kCisgKiBodHRwOi8vd3d3LmlhbmEub3JnL2Fzc2lnbm1lbnRzL2Jvb3RwLWRoY3AtcGFyYW1ldGVycy8KKyAqIENvbW1lbnRlZCBvdXQgb3B0aW9ucyBhcmUgaGFuZGxlZCBieSBjb21tb24gb3B0aW9uIG1hY2hpbmVyeSwKKyAqIHVuY29tbWVudGVkIG9uZXMgaGF2ZSBzcGVjaWFsIGNhc2VzIChncmVwIGZvciB0aGVtIHRvIHNlZSkuCisgKi8KKyNkZWZpbmUgREhDUF9QQURESU5HICAgICAgICAgICAgMHgwMAorI2RlZmluZSBESENQX1NVQk5FVCAgICAgICAgICAgICAweDAxCisvLyNkZWZpbmUgREhDUF9USU1FX09GRlNFVCAgICAgIDB4MDIgLyogKGxvY2FsdGltZSAtIFVUQ190aW1lKSBpbiBzZWNvbmRzLiBzaWduZWQgKi8KKy8vI2RlZmluZSBESENQX1JPVVRFUiAgICAgICAgICAgMHgwMworLy8jZGVmaW5lIERIQ1BfVElNRV9TRVJWRVIgICAgICAweDA0IC8qIFJGQyA4NjggdGltZSBzZXJ2ZXIgKDMyLWJpdCwgMCA9IDEuMS4xOTAwKSAqLworLy8jZGVmaW5lIERIQ1BfTkFNRV9TRVJWRVIgICAgICAweDA1IC8qIElFTiAxMTYgX3JlYWxseV8gYW5jaWVudCBraW5kIG9mIE5TICovCisvLyNkZWZpbmUgREhDUF9ETlNfU0VSVkVSICAgICAgIDB4MDYKKy8vI2RlZmluZSBESENQX0xPR19TRVJWRVIgICAgICAgMHgwNyAvKiBwb3J0IDcwNCBVRFAgbG9nIChub3Qgc3lzbG9nKQorLy8jZGVmaW5lIERIQ1BfQ09PS0lFX1NFUlZFUiAgICAweDA4IC8qICJxdW90ZSBvZiB0aGUgZGF5IiBzZXJ2ZXIgKi8KKy8vI2RlZmluZSBESENQX0xQUl9TRVJWRVIgICAgICAgMHgwOQorI2RlZmluZSBESENQX0hPU1RfTkFNRSAgICAgICAgICAweDBjIC8qIGVpdGhlciBjbGllbnQgaW5mb3JtcyBzZXJ2ZXIgb3Igc2VydmVyIGdpdmVzIG5hbWUgdG8gY2xpZW50ICovCisvLyNkZWZpbmUgREhDUF9CT09UX1NJWkUgICAgICAgIDB4MGQKKy8vI2RlZmluZSBESENQX0RPTUFJTl9OQU1FICAgICAgMHgwZiAvKiBzZXJ2ZXIgZ2l2ZXMgZG9tYWluIHN1ZmZpeCAqLworLy8jZGVmaW5lIERIQ1BfU1dBUF9TRVJWRVIgICAgICAweDEwCisvLyNkZWZpbmUgREhDUF9ST09UX1BBVEggICAgICAgIDB4MTEKKy8vI2RlZmluZSBESENQX0lQX1RUTCAgICAgICAgICAgMHgxNworLy8jZGVmaW5lIERIQ1BfTVRVICAgICAgICAgICAgICAweDFhCisvLyNkZWZpbmUgREhDUF9CUk9BRENBU1QgICAgICAgIDB4MWMKKy8vI2RlZmluZSBESENQX1JPVVRFUyAgICAgICAgICAgMHgyMQorLy8jZGVmaW5lIERIQ1BfTklTX0RPTUFJTiAgICAgICAweDI4CisvLyNkZWZpbmUgREhDUF9OSVNfU0VSVkVSICAgICAgIDB4MjkKKy8vI2RlZmluZSBESENQX05UUF9TRVJWRVIgICAgICAgMHgyYQorLy8jZGVmaW5lIERIQ1BfV0lOU19TRVJWRVIgICAgICAweDJjCisjZGVmaW5lIERIQ1BfUkVRVUVTVEVEX0lQICAgICAgIDB4MzIgLyogc2VudCBieSBjbGllbnQgaWYgc3BlY2lmaWMgSVAgaXMgd2FudGVkICovCisjZGVmaW5lIERIQ1BfTEVBU0VfVElNRSAgICAgICAgIDB4MzMKKyNkZWZpbmUgREhDUF9PUFRJT05fT1ZFUkxPQUQgICAgMHgzNAorI2RlZmluZSBESENQX01FU1NBR0VfVFlQRSAgICAgICAweDM1CisjZGVmaW5lIERIQ1BfU0VSVkVSX0lEICAgICAgICAgIDB4MzYgLyogYnkgZGVmYXVsdCBzZXJ2ZXIncyBJUCAqLworI2RlZmluZSBESENQX1BBUkFNX1JFUSAgICAgICAgICAweDM3IC8qIGxpc3Qgb2Ygb3B0aW9ucyBjbGllbnQgd2FudHMgKi8KKy8vI2RlZmluZSBESENQX0VSUl9NRVNTQUdFICAgICAgMHgzOCAvKiBlcnJvciBtZXNzYWdlIHdoZW4gc2VuZGluZyBOQUsgZXRjICovCisjZGVmaW5lIERIQ1BfTUFYX1NJWkUgICAgICAgICAgIDB4MzkKKyNkZWZpbmUgREhDUF9WRU5ET1IgICAgICAgICAgICAgMHgzYyAvKiBjbGllbnQncyB2ZW5kb3IgKGEgc3RyaW5nKSAqLworI2RlZmluZSBESENQX0NMSUVOVF9JRCAgICAgICAgICAweDNkIC8qIGJ5IGRlZmF1bHQgY2xpZW50J3MgTUFDIGFkZHIsIGJ1dCBtYXkgYmUgYXJiaXRyYXJpbHkgbG9uZyAqLworLy8jZGVmaW5lIERIQ1BfVEZUUF9TRVJWRVJfTkFNRSAweDQyIC8qIHNhbWUgYXMgJ3NuYW1lJyBmaWVsZCAqLworLy8jZGVmaW5lIERIQ1BfQk9PVF9GSUxFICAgICAgICAweDQzIC8qIHNhbWUgYXMgJ2ZpbGUnIGZpZWxkICovCisvLyNkZWZpbmUgREhDUF9VU0VSX0NMQVNTICAgICAgIDB4NGQgLyogUkZDIDMwMDQuIHNldCBvZiBMQVNDSUkgc3RyaW5ncy4gIkkgYW0gYSBwcmludGVyIiBldGMgKi8KKyNkZWZpbmUgREhDUF9GUUROICAgICAgICAgICAgICAgMHg1MSAvKiBjbGllbnQgYXNrcyB0byB1cGRhdGUgRE5TIHRvIG1hcCBpdHMgRlFETiB0byBpdHMgbmV3IElQICovCisvLyNkZWZpbmUgREhDUF9ET01BSU5fU0VBUkNIICAgIDB4NzcgLyogUkZDIDMzOTcuIHNldCBvZiBBU0NJWiBzdHJpbmcsIEROUy1zdHlsZSBjb21wcmVzc2VkICovCisvLyNkZWZpbmUgREhDUF9TSVBfU0VSVkVSUyAgICAgIDB4NzggLyogUkZDIDMzNjEuIGZsYWcgYnl0ZSwgdGhlbjogMDogZG9tYWluIG5hbWVzLCAxOiBJUCBhZGRycyAqLworLy8jZGVmaW5lIERIQ1BfU1RBVElDX1JPVVRFUyAgICAweDc5IC8qIFJGQyAzNDQyLiAobWFzayxpcCxyb3V0ZXIpIHR1cGxlcyAqLworLy8jZGVmaW5lIERIQ1BfVkxBTl9JRCAgICAgICAgICAweDg0IC8qIDgwMi4xUCBWTEFOIElEICovCisvLyNkZWZpbmUgREhDUF9WTEFOX1BSSU9SSVRZICAgIDB4ODUgLyogODAyLjFRIFZMQU4gcHJpb3JpdHkgKi8KKy8vI2RlZmluZSBESENQX1BYRV9DT05GX0ZJTEUgICAgMHhkMSAvKiBSRkMgNTA3MSBDb25maWd1cmF0aW9uIEZpbGUgKi8KKy8vI2RlZmluZSBESENQX1BYRV9QQVRIX1BSRUZJWCAgMHhkMiAvKiBSRkMgNTA3MSBDb25maWd1cmF0aW9uIEZpbGUgKi8KKy8vI2RlZmluZSBESENQX01TX1NUQVRJQ19ST1VURVMgMHhmOSAvKiBNaWNyb3NvZnQncyBwcmUtUkZDIDM0NDIgY29kZSBmb3IgMHg3OT8gKi8KKy8vI2RlZmluZSBESENQX1dQQUQgICAgICAgICAgICAgMHhmYyAvKiBNU0lFJ3MgV2ViIFByb3h5IEF1dG9kaXNjb3ZlcnkgUHJvdG9jb2wgKi8KKyNkZWZpbmUgREhDUF9FTkQgICAgICAgICAgICAgICAgMHhmZgorCisvKiBPZmZzZXRzIGluIG9wdGlvbiBieXRlIHNlcXVlbmNlICovCisjZGVmaW5lIE9QVF9DT0RFICAgICAgICAgICAgICAgIDAKKyNkZWZpbmUgT1BUX0xFTiAgICAgICAgICAgICAgICAgMQorI2RlZmluZSBPUFRfREFUQSAgICAgICAgICAgICAgICAyCisvKiBCaXRzIGluICJvdmVybG9hZCIgb3B0aW9uICovCisjZGVmaW5lIE9QVElPTl9GSUVMRCAgICAgICAgICAgIDAKKyNkZWZpbmUgRklMRV9GSUVMRCAgICAgICAgICAgICAgMQorI2RlZmluZSBTTkFNRV9GSUVMRCAgICAgICAgICAgICAyCisKKy8qIERIQ1BfTUVTU0FHRV9UWVBFIHZhbHVlcyAqLworI2RlZmluZSBESENQRElTQ09WRVIgICAgICAgICAgICAxIC8qIGNsaWVudCAtPiBzZXJ2ZXIgKi8KKyNkZWZpbmUgREhDUE9GRkVSICAgICAgICAgICAgICAgMiAvKiBjbGllbnQgPC0gc2VydmVyICovCisjZGVmaW5lIERIQ1BSRVFVRVNUICAgICAgICAgICAgIDMgLyogY2xpZW50IC0+IHNlcnZlciAqLworI2RlZmluZSBESENQREVDTElORSAgICAgICAgICAgICA0IC8qIGNsaWVudCAtPiBzZXJ2ZXIgKi8KKyNkZWZpbmUgREhDUEFDSyAgICAgICAgICAgICAgICAgNSAvKiBjbGllbnQgPC0gc2VydmVyICovCisjZGVmaW5lIERIQ1BOQUsgICAgICAgICAgICAgICAgIDYgLyogY2xpZW50IDwtIHNlcnZlciAqLworI2RlZmluZSBESENQUkVMRUFTRSAgICAgICAgICAgICA3IC8qIGNsaWVudCAtPiBzZXJ2ZXIgKi8KKyNkZWZpbmUgREhDUElORk9STSAgICAgICAgICAgICAgOCAvKiBjbGllbnQgLT4gc2VydmVyICovCisjZGVmaW5lIERIQ1BfTUlOVFlQRSBESENQRElTQ09WRVIKKyNkZWZpbmUgREhDUF9NQVhUWVBFIERIQ1BJTkZPUk0KKworc3RydWN0IGRoY3Bfb3B0ZmxhZyB7CisJdWludDhfdCBmbGFnczsKKwl1aW50OF90IGNvZGU7Cit9OworCitzdHJ1Y3Qgb3B0aW9uX3NldCB7CisJdWludDhfdCAqZGF0YTsKKwlzdHJ1Y3Qgb3B0aW9uX3NldCAqbmV4dDsKK307CisKK2V4dGVybiBjb25zdCBzdHJ1Y3QgZGhjcF9vcHRmbGFnIGRoY3Bfb3B0ZmxhZ3NbXTsKK2V4dGVybiBjb25zdCBjaGFyIGRoY3Bfb3B0aW9uX3N0cmluZ3NbXSBBTElHTjE7CitleHRlcm4gY29uc3QgdWludDhfdCBkaGNwX29wdGlvbl9sZW5ndGhzW10gQUxJR04xOworCit1bnNpZ25lZCBGQVNUX0ZVTkMgdWRoY3Bfb3B0aW9uX2lkeChjb25zdCBjaGFyICpuYW1lKTsKKwordWludDhfdCAqdWRoY3BfZ2V0X29wdGlvbihzdHJ1Y3QgZGhjcF9wYWNrZXQgKnBhY2tldCwgaW50IGNvZGUpIEZBU1RfRlVOQzsKK2ludCB1ZGhjcF9lbmRfb3B0aW9uKHVpbnQ4X3QgKm9wdGlvbnB0cikgRkFTVF9GVU5DOwordm9pZCB1ZGhjcF9hZGRfYmluYXJ5X29wdGlvbihzdHJ1Y3QgZGhjcF9wYWNrZXQgKnBhY2tldCwgdWludDhfdCAqYWRkb3B0KSBGQVNUX0ZVTkM7Cit2b2lkIHVkaGNwX2FkZF9zaW1wbGVfb3B0aW9uKHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0LCB1aW50OF90IGNvZGUsIHVpbnQzMl90IGRhdGEpIEZBU1RfRlVOQzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF9SRkMzMzk3CitjaGFyICpkbmFtZV9kZWMoY29uc3QgdWludDhfdCAqY3N0ciwgaW50IGNsZW4sIGNvbnN0IGNoYXIgKnByZSkgRkFTVF9GVU5DOwordWludDhfdCAqZG5hbWVfZW5jKGNvbnN0IHVpbnQ4X3QgKmNzdHIsIGludCBjbGVuLCBjb25zdCBjaGFyICpzcmMsIGludCAqcmV0bGVuKSBGQVNUX0ZVTkM7CisjZW5kaWYKK3N0cnVjdCBvcHRpb25fc2V0ICp1ZGhjcF9maW5kX29wdGlvbihzdHJ1Y3Qgb3B0aW9uX3NldCAqb3B0X2xpc3QsIHVpbnQ4X3QgY29kZSkgRkFTVF9GVU5DOworCisKKy8vIFJGQyAyMTMxICBUYWJsZSA1OiBGaWVsZHMgYW5kIG9wdGlvbnMgdXNlZCBieSBESENQIGNsaWVudHMKKy8vCisvLyBGaWVsZHMgJ2hvcHMnLCAneWlhZGRyJywgJ3NpYWRkcicsICdnaWFkZHInIGFyZSBhbHdheXMgemVybworLy8KKy8vIEZpZWxkICAgICAgREhDUERJU0NPVkVSICAgICAgICAgIERIQ1BJTkZPUk0gICAgICAgICAgICBESENQUkVRVUVTVCAgICAgICAgICAgREhDUERFQ0xJTkUgICAgICAgICBESENQUkVMRUFTRQorLy8gLS0tLS0gICAgICAtLS0tLS0tLS0tLS0gICAgICAgICAgLS0tLS0tLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tICAgICAgICAgICAtLS0tLS0tLS0tLSAgICAgICAgIC0tLS0tLS0tLS0tCisvLyAneGlkJyAgICAgIHNlbGVjdGVkIGJ5IGNsaWVudCAgICBzZWxlY3RlZCBieSBjbGllbnQgICAgJ3hpZCcgZnJvbSBzZXJ2ZXIgICAgIHNlbGVjdGVkIGJ5IGNsaWVudCAgc2VsZWN0ZWQgYnkgY2xpZW50CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREhDUE9GRkVSIG1lc3NhZ2UKKy8vICdzZWNzJyAgICAgMCBvciBzZWNvbmRzIHNpbmNlICAgIDAgb3Igc2Vjb25kcyBzaW5jZSAgICAwIG9yIHNlY29uZHMgc2luY2UgICAgMCAgICAgICAgICAgICAgICAgICAwCisvLyAgICAgICAgICAgIERIQ1AgcHJvY2VzcyBzdGFydGVkICBESENQIHByb2Nlc3Mgc3RhcnRlZCAgREhDUCBwcm9jZXNzIHN0YXJ0ZWQKKy8vICdmbGFncycgICAgU2V0ICdCUk9BRENBU1QnICAgICAgIFNldCAnQlJPQURDQVNUJyAgICAgICBTZXQgJ0JST0FEQ0FTVCcgICAgICAgMCAgICAgICAgICAgICAgICAgICAwCisvLyAgICAgICAgICAgIGZsYWcgaWYgY2xpZW50ICAgICAgICBmbGFnIGlmIGNsaWVudCAgICAgICAgZmxhZyBpZiBjbGllbnQKKy8vICAgICAgICAgICAgcmVxdWlyZXMgYnJvYWRjYXN0ICAgIHJlcXVpcmVzIGJyb2FkY2FzdCAgICByZXF1aXJlcyBicm9hZGNhc3QKKy8vICAgICAgICAgICAgcmVwbHkgICAgICAgICAgICAgICAgIHJlcGx5ICAgICAgICAgICAgICAgICByZXBseQorLy8gJ2NpYWRkcicgICAwICAgICAgICAgICAgICAgICAgICAgY2xpZW50J3MgSVAgICAgICAgICAgIDAgb3IgY2xpZW50J3MgSVAgICAgICAwICAgICAgICAgICAgICAgICAgIGNsaWVudCdzIElQCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJPVU5EL1JFTkVXL1JFQklORCkKKy8vICdjaGFkZHInICAgY2xpZW50J3MgTUFDICAgICAgICAgIGNsaWVudCdzIE1BQyAgICAgICAgICBjbGllbnQncyBNQUMgICAgICAgICAgY2xpZW50J3MgTUFDICAgICAgICBjbGllbnQncyBNQUMKKy8vICdzbmFtZScgICAgb3B0aW9ucyBvciBzbmFtZSAgICAgIG9wdGlvbnMgb3Igc25hbWUgICAgICBvcHRpb25zIG9yIHNuYW1lICAgICAgKHVudXNlZCkgICAgICAgICAgICAodW51c2VkKQorLy8gJ2ZpbGUnICAgICBvcHRpb25zIG9yIGZpbGUgICAgICAgb3B0aW9ucyBvciBmaWxlICAgICAgIG9wdGlvbnMgb3IgZmlsZSAgICAgICAodW51c2VkKSAgICAgICAgICAgICh1bnVzZWQpCisvLyAnb3B0aW9ucycgIG9wdGlvbnMgICAgICAgICAgICAgICBvcHRpb25zICAgICAgICAgICAgICAgb3B0aW9ucyAgICAgICAgICAgICAgIG1lc3NhZ2UgdHlwZSBvcHQgICAgbWVzc2FnZSB0eXBlIG9wdAorLy8KKy8vIE9wdGlvbiAgICAgICAgICAgICAgICAgICAgIERIQ1BESVNDT1ZFUiAgREhDUElORk9STSAgREhDUFJFUVVFU1QgICAgICBESENQREVDTElORSAgREhDUFJFTEVBU0UKKy8vIC0tLS0tLSAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0KKy8vIFJlcXVlc3RlZCBJUCBhZGRyZXNzICAgICAgIE1BWSAgICAgICAgICAgTVVTVCBOT1QgICAgTVVTVCAoaW4gICAgICAgICBNVVNUICAgICAgICAgTVVTVCBOT1QKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VMRUNUSU5HIG9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOSVQtUkVCT09UKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVVNUIE5PVCAoaW4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9VTkQgb3IKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVORVdJTkcpCisvLyBJUCBhZGRyZXNzIGxlYXNlIHRpbWUgICAgICBNQVkgICAgICAgICAgIE1VU1QgTk9UICAgIE1BWSAgICAgICAgICAgICAgTVVTVCBOT1QgICAgIE1VU1QgTk9UCisvLyBVc2UgJ2ZpbGUnLydzbmFtZScgZmllbGRzICBNQVkgICAgICAgICAgIE1BWSAgICAgICAgIE1BWSAgICAgICAgICAgICAgTUFZICAgICAgICAgIE1BWQorLy8gQ2xpZW50IGlkZW50aWZpZXIgICAgICAgICAgTUFZICAgICAgICAgICBNQVkgICAgICAgICBNQVkgICAgICAgICAgICAgIE1BWSAgICAgICAgICBNQVkKKy8vIFZlbmRvciBjbGFzcyBpZGVudGlmaWVyICAgIE1BWSAgICAgICAgICAgTUFZICAgICAgICAgTUFZICAgICAgICAgICAgICBNVVNUIE5PVCAgICAgTVVTVCBOT1QKKy8vIFNlcnZlciBpZGVudGlmaWVyICAgICAgICAgIE1VU1QgTk9UICAgICAgTVVTVCBOT1QgICAgTVVTVCAoYWZ0ZXIgICAgICBNVVNUICAgICAgICAgTVVTVAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRUxFQ1RJTkcpCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1VU1QgTk9UIChhZnRlcgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTklULVJFQk9PVCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9VTkQsIFJFTkVXSU5HCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIFJFQklORElORykKKy8vIFBhcmFtZXRlciByZXF1ZXN0IGxpc3QgICAgIE1BWSAgICAgICAgICAgTUFZICAgICAgICAgTUFZICAgICAgICAgICAgICBNVVNUIE5PVCAgICAgTVVTVCBOT1QKKy8vIE1heGltdW0gbWVzc2FnZSBzaXplICAgICAgIE1BWSAgICAgICAgICAgTUFZICAgICAgICAgTUFZICAgICAgICAgICAgICBNVVNUIE5PVCAgICAgTVVTVCBOT1QKKy8vIE1lc3NhZ2UgICAgICAgICAgICAgICAgICAgIFNIT1VMRCBOT1QgICAgU0hPVUxEIE5PVCAgU0hPVUxEIE5PVCAgICAgICBTSE9VTEQgICAgICAgU0hPVUxECisvLyBTaXRlLXNwZWNpZmljICAgICAgICAgICAgICBNQVkgICAgICAgICAgIE1BWSAgICAgICAgIE1BWSAgICAgICAgICAgICAgTVVTVCBOT1QgICAgIE1VU1QgTk9UCisvLyBBbGwgb3RoZXJzICAgICAgICAgICAgICAgICBNQVkgICAgICAgICAgIE1BWSAgICAgICAgIE1BWSAgICAgICAgICAgICAgTVVTVCBOT1QgICAgIE1VU1QgTk9UCisKKworLyoqKiBMb2dnaW5nICoqKi8KKworI2lmIGRlZmluZWQgQ09ORklHX1VESENQX0RFQlVHICYmIENPTkZJR19VREhDUF9ERUJVRyA+PSAxCisjIGRlZmluZSBJRl9VREhDUF9WRVJCT1NFKC4uLikgX19WQV9BUkdTX18KK2V4dGVybiB1bnNpZ25lZCBkaGNwX3ZlcmJvc2U7CisjIGRlZmluZSBsb2cxKC4uLikgZG8geyBpZiAoZGhjcF92ZXJib3NlID49IDEpIGJiX2luZm9fbXNnKF9fVkFfQVJHU19fKTsgfSB3aGlsZSAoMCkKKyMgaWYgQ09ORklHX1VESENQX0RFQlVHID49IDIKK3ZvaWQgdWRoY3BfZHVtcF9wYWNrZXQoc3RydWN0IGRoY3BfcGFja2V0ICpwYWNrZXQpIEZBU1RfRlVOQzsKKyMgIGRlZmluZSBsb2cyKC4uLikgZG8geyBpZiAoZGhjcF92ZXJib3NlID49IDIpIGJiX2luZm9fbXNnKF9fVkFfQVJHU19fKTsgfSB3aGlsZSAoMCkKKyMgZWxzZQorIyAgZGVmaW5lIHVkaGNwX2R1bXBfcGFja2V0KC4uLikgKCh2b2lkKTApCisjICBkZWZpbmUgbG9nMiguLi4pICgodm9pZCkwKQorIyBlbmRpZgorIyBpZiBDT05GSUdfVURIQ1BfREVCVUcgPj0gMworIyAgZGVmaW5lIGxvZzMoLi4uKSBkbyB7IGlmIChkaGNwX3ZlcmJvc2UgPj0gMykgYmJfaW5mb19tc2coX19WQV9BUkdTX18pOyB9IHdoaWxlICgwKQorIyBlbHNlCisjICBkZWZpbmUgbG9nMyguLi4pICgodm9pZCkwKQorIyBlbmRpZgorI2Vsc2UKKyMgZGVmaW5lIElGX1VESENQX1ZFUkJPU0UoLi4uKQorIyBkZWZpbmUgdWRoY3BfZHVtcF9wYWNrZXQoLi4uKSAoKHZvaWQpMCkKKyMgZGVmaW5lIGxvZzEoLi4uKSAoKHZvaWQpMCkKKyMgZGVmaW5lIGxvZzIoLi4uKSAoKHZvaWQpMCkKKyMgZGVmaW5lIGxvZzMoLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorCisKKy8qKiogT3RoZXIgc2hhcmVkIGZ1bmN0aW9ucyAqKiovCisKKy8qIDJuZCBwYXJhbSBpcyAidWludDMyX3QqIiAqLworaW50IEZBU1RfRlVOQyB1ZGhjcF9zdHIybmlwKGNvbnN0IGNoYXIgKnN0ciwgdm9pZCAqYXJnKTsKKy8qIDJuZCBwYXJhbSBpcyAic3RydWN0IG9wdGlvbl9zZXQqKiIgKi8KK2ludCBGQVNUX0ZVTkMgdWRoY3Bfc3RyMm9wdHNldChjb25zdCBjaGFyICpzdHIsIHZvaWQgKmFyZyk7CisKK3ZvaWQgdWRoY3BfaW5pdF9oZWFkZXIoc3RydWN0IGRoY3BfcGFja2V0ICpwYWNrZXQsIGNoYXIgdHlwZSkgRkFTVF9GVU5DOworCitpbnQgdWRoY3BfcmVjdl9rZXJuZWxfcGFja2V0KHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0LCBpbnQgZmQpIEZBU1RfRlVOQzsKKworaW50IHVkaGNwX3NlbmRfcmF3X3BhY2tldChzdHJ1Y3QgZGhjcF9wYWNrZXQgKmRoY3BfcGt0LAorCQl1aW50MzJfdCBzb3VyY2VfbmlwLCBpbnQgc291cmNlX3BvcnQsCisJCXVpbnQzMl90IGRlc3RfbmlwLCBpbnQgZGVzdF9wb3J0LCBjb25zdCB1aW50OF90ICpkZXN0X2FycCwKKwkJaW50IGlmaW5kZXgpIEZBU1RfRlVOQzsKKworaW50IHVkaGNwX3NlbmRfa2VybmVsX3BhY2tldChzdHJ1Y3QgZGhjcF9wYWNrZXQgKmRoY3BfcGt0LAorCQl1aW50MzJfdCBzb3VyY2VfbmlwLCBpbnQgc291cmNlX3BvcnQsCisJCXVpbnQzMl90IGRlc3RfbmlwLCBpbnQgZGVzdF9wb3J0KSBGQVNUX0ZVTkM7CisKK3ZvaWQgdWRoY3Bfc3Bfc2V0dXAodm9pZCkgRkFTVF9GVU5DOworaW50IHVkaGNwX3NwX2ZkX3NldChmZF9zZXQgKnJmZHMsIGludCBleHRyYV9mZCkgRkFTVF9GVU5DOworaW50IHVkaGNwX3NwX3JlYWQoY29uc3QgZmRfc2V0ICpyZmRzKSBGQVNUX0ZVTkM7CisKK2ludCB1ZGhjcF9yZWFkX2ludGVyZmFjZShjb25zdCBjaGFyICppbnRlcmZhY2UsIGludCAqaWZpbmRleCwgdWludDMyX3QgKm5pcCwgdWludDhfdCAqbWFjKSBGQVNUX0ZVTkM7CisKK2ludCB1ZGhjcF9saXN0ZW5fc29ja2V0KC8qdWludDMyX3QgaXAsKi8gaW50IHBvcnQsIGNvbnN0IGNoYXIgKmluZikgRkFTVF9GVU5DOworCisvKiBSZXR1cm5zIDEgaWYgbm8gcmVwbHkgcmVjZWl2ZWQgKi8KK2ludCBhcnBwaW5nKHVpbnQzMl90IHRlc3RfbmlwLAorCQljb25zdCB1aW50OF90ICpzYWZlX21hYywKKwkJdWludDMyX3QgZnJvbV9pcCwKKwkJdWludDhfdCAqZnJvbV9tYWMsCisJCWNvbnN0IGNoYXIgKmludGVyZmFjZSwKKwkJdW5zaWduZWQgdGltZW8pIEZBU1RfRlVOQzsKKworLyogbm90ZTogaXAgaXMgYSBwb2ludGVyIHRvIGFuIElQdjYgaW4gbmV0d29yayBvcmRlciwgcG9zc2libHkgbWlzYWxpZ2VkICovCitpbnQgc3ByaW50X25pcDYoY2hhciAqZGVzdCwgLypjb25zdCBjaGFyICpwcmUsKi8gY29uc3QgdWludDhfdCAqaXApIEZBU1RfRlVOQzsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3VkaGNwL2Q2X2NvbW1vbi5oIGIvbmV0d29ya2luZy91ZGhjcC9kNl9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjIxMWVhCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy91ZGhjcC9kNl9jb21tb24uaApAQCAtMCwwICsxLDEyNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIERlbnlzIFZsYXNlbmtvLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpZm5kZWYgVURIQ1BfRDZfQ09NTU9OX0gKKyNkZWZpbmUgVURIQ1BfRDZfQ09NTU9OX0ggMQorCisjaW5jbHVkZSA8bmV0aW5ldC9pcDYuaD4KKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKKworLyoqKiBESENQdjYgcGFja2V0ICoqKi8KKworLyogREhDUHY2IHByb3RvY29sLiBTZWUgUkZDIDMzMTUgKi8KKyNkZWZpbmUgRDZfTVNHX1NPTElDSVQgICAgICAgICAgICAgIDEKKyNkZWZpbmUgRDZfTVNHX0FEVkVSVElTRSAgICAgICAgICAgIDIKKyNkZWZpbmUgRDZfTVNHX1JFUVVFU1QgICAgICAgICAgICAgIDMKKyNkZWZpbmUgRDZfTVNHX0NPTkZJUk0gICAgICAgICAgICAgIDQKKyNkZWZpbmUgRDZfTVNHX1JFTkVXICAgICAgICAgICAgICAgIDUKKyNkZWZpbmUgRDZfTVNHX1JFQklORCAgICAgICAgICAgICAgIDYKKyNkZWZpbmUgRDZfTVNHX1JFUExZICAgICAgICAgICAgICAgIDcKKyNkZWZpbmUgRDZfTVNHX1JFTEVBU0UgICAgICAgICAgICAgIDgKKyNkZWZpbmUgRDZfTVNHX0RFQ0xJTkUgICAgICAgICAgICAgIDkKKyNkZWZpbmUgRDZfTVNHX1JFQ09ORklHVVJFICAgICAgICAgMTAKKyNkZWZpbmUgRDZfTVNHX0lORk9STUFUSU9OX1JFUVVFU1QgMTEKKyNkZWZpbmUgRDZfTVNHX1JFTEFZX0ZPUlcgICAgICAgICAgMTIKKyNkZWZpbmUgRDZfTVNHX1JFTEFZX1JFUEwgICAgICAgICAgMTMKKworc3RydWN0IGQ2X3BhY2tldCB7CisJdW5pb24geworCQl1aW50OF90IGQ2X21zZ190eXBlOworCQl1aW50MzJfdCBkNl94aWQzMjsKKwl9IGQ2X3U7CisJdWludDhfdCBkNl9vcHRpb25zWzU3NiAtIHNpemVvZihzdHJ1Y3QgaXBoZHIpIC0gc2l6ZW9mKHN0cnVjdCB1ZHBoZHIpIC0gNAorCQkJKyBDT05GSUdfVURIQ1BDX1NMQUNLX0ZPUl9CVUdHWV9TRVJWRVJTXTsKK30gUEFDS0VEOworI2RlZmluZSBkNl9tc2dfdHlwZSBkNl91LmQ2X21zZ190eXBlCisjZGVmaW5lIGQ2X3hpZDMyICAgIGQ2X3UuZDZfeGlkMzIKKworc3RydWN0IGlwNl91ZHBfZDZfcGFja2V0IHsKKwlzdHJ1Y3QgaXA2X2hkciBpcDY7CisJc3RydWN0IHVkcGhkciB1ZHA7CisJc3RydWN0IGQ2X3BhY2tldCBkYXRhOworfSBQQUNLRUQ7CisKK3N0cnVjdCB1ZHBfZDZfcGFja2V0IHsKKwlzdHJ1Y3QgdWRwaGRyIHVkcDsKKwlzdHJ1Y3QgZDZfcGFja2V0IGRhdGE7Cit9IFBBQ0tFRDsKKworLyoqKiBPcHRpb25zICoqKi8KKworc3RydWN0IGQ2X29wdGlvbiB7CisJdWludDhfdCBjb2RlX2hpOworCXVpbnQ4X3QgY29kZTsKKwl1aW50OF90IGxlbl9oaTsKKwl1aW50OF90IGxlbjsKKwl1aW50OF90IGRhdGFbMV07Cit9IFBBQ0tFRDsKKworI2RlZmluZSBENl9PUFRfQ0xJRU5USUQgICAgICAgMQorI2RlZmluZSBENl9PUFRfU0VSVkVSSUQgICAgICAgMgorI2RlZmluZSBENl9PUFRfSUFfTkEgICAgICAgICAgMworI2RlZmluZSBENl9PUFRfSUFfVEEgICAgICAgICAgNAorI2RlZmluZSBENl9PUFRfSUFBRERSICAgICAgICAgNQorI2RlZmluZSBENl9PUFRfT1JPICAgICAgICAgICAgNgorI2RlZmluZSBENl9PUFRfUFJFRkVSRU5DRSAgICAgNworI2RlZmluZSBENl9PUFRfRUxBUFNFRF9USU1FICAgOAorI2RlZmluZSBENl9PUFRfUkVMQVlfTVNHICAgICAgOQorI2RlZmluZSBENl9PUFRfQVVUSCAgICAgICAgICAxMQorI2RlZmluZSBENl9PUFRfVU5JQ0FTVCAgICAgICAxMgorI2RlZmluZSBENl9PUFRfU1RBVFVTX0NPREUgICAxMworI2RlZmluZSBENl9PUFRfUkFQSURfQ09NTUlUICAxNAorI2RlZmluZSBENl9PUFRfVVNFUl9DTEFTUyAgICAxNQorI2RlZmluZSBENl9PUFRfVkVORE9SX0NMQVNTICAxNgorI2RlZmluZSBENl9PUFRfVkVORE9SX09QVFMgICAxNworI2RlZmluZSBENl9PUFRfSU5URVJGQUNFX0lEICAxOAorI2RlZmluZSBENl9PUFRfUkVDT05GX01TRyAgICAxOQorI2RlZmluZSBENl9PUFRfUkVDT05GX0FDQ0VQVCAyMAorCisjZGVmaW5lIEQ2X09QVF9JQV9QRCAgICAgICAgIDI1CisjZGVmaW5lIEQ2X09QVF9JQVBSRUZJWCAgICAgIDI2CisKKy8qKiogT3RoZXIgc2hhcmVkIGZ1bmN0aW9ucyAqKiovCisKK3N0cnVjdCBjbGllbnQ2X2RhdGFfdCB7CisJc3RydWN0IGQ2X29wdGlvbiAqc2VydmVyX2lkOworCXN0cnVjdCBkNl9vcHRpb24gKmlhX25hOworCWNoYXIgKiplbnZfcHRyOworCXVuc2lnbmVkIGVudl9pZHg7Cit9OworCisjZGVmaW5lIGNsaWVudDZfZGF0YSAoKihzdHJ1Y3QgY2xpZW50Nl9kYXRhX3QqKSgmYmJfY29tbW9uX2J1ZnNpejFbQ09NTU9OX0JVRlNJWkUgLSBzaXplb2Yoc3RydWN0IGNsaWVudDZfZGF0YV90KV0pKQorCitpbnQgRkFTVF9GVU5DIGQ2X2xpc3Rlbl9zb2NrZXQoaW50IHBvcnQsIGNvbnN0IGNoYXIgKmluZik7CisKK2ludCBGQVNUX0ZVTkMgZDZfcmVjdl9rZXJuZWxfcGFja2V0KAorCQlzdHJ1Y3QgaW42X2FkZHIgKnBlZXJfaXB2NiwKKwkJc3RydWN0IGQ2X3BhY2tldCAqcGFja2V0LCBpbnQgZmQKKyk7CisKK2ludCBGQVNUX0ZVTkMgZDZfc2VuZF9yYXdfcGFja2V0KAorCQlzdHJ1Y3QgZDZfcGFja2V0ICpkNl9wa3QsIHVuc2lnbmVkIGQ2X3BrdF9zaXplLAorCQlzdHJ1Y3QgaW42X2FkZHIgKnNyY19pcHY2LCBpbnQgc291cmNlX3BvcnQsCisJCXN0cnVjdCBpbjZfYWRkciAqZHN0X2lwdjYsIGludCBkZXN0X3BvcnQsIGNvbnN0IHVpbnQ4X3QgKmRlc3RfYXJwLAorCQlpbnQgaWZpbmRleAorKTsKKworaW50IEZBU1RfRlVOQyBkNl9zZW5kX2tlcm5lbF9wYWNrZXQoCisJCXN0cnVjdCBkNl9wYWNrZXQgKmQ2X3BrdCwgdW5zaWduZWQgZDZfcGt0X3NpemUsCisJCXN0cnVjdCBpbjZfYWRkciAqc3JjX2lwdjYsIGludCBzb3VyY2VfcG9ydCwKKwkJc3RydWN0IGluNl9hZGRyICpkc3RfaXB2NiwgaW50IGRlc3RfcG9ydAorKTsKKworI2lmIGRlZmluZWQgQ09ORklHX1VESENQX0RFQlVHICYmIENPTkZJR19VREhDUF9ERUJVRyA+PSAyCit2b2lkIEZBU1RfRlVOQyBkNl9kdW1wX3BhY2tldChzdHJ1Y3QgZDZfcGFja2V0ICpwYWNrZXQpOworI2Vsc2UKKyMgZGVmaW5lIGQ2X2R1bXBfcGFja2V0KHBhY2tldCkgKCh2b2lkKTApCisjZW5kaWYKKworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvdWRoY3AvZDZfZGhjcGMuYyBiL25ldHdvcmtpbmcvdWRoY3AvZDZfZGhjcGMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTliNzA1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy91ZGhjcC9kNl9kaGNwYy5jCkBAIC0wLDAgKzEsMTQ5MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogREhDUHY2IGNsaWVudC4KKyAqCisgKiAyMDExLTExLgorICogV0FSTklORzogVEhJUyBDT0RFIElTIElOQ09NUExFVEUuIElUIElTIE5PV0hFUkUgTkVBUgorICogVE8gQkUgUkVBRFkgRk9SIFBST0RVQ1RJT04gVVNFLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBEZW55cyBWbGFzZW5rby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vY29uZmlnOmNvbmZpZyBVREhDUEM2CisvL2NvbmZpZzoJYm9vbCAidWRoY3AgY2xpZW50IGZvciBESENQdjYgKHVkaGNwYzYpIgorLy9jb25maWc6CWRlZmF1bHQgbiAgIyBub3QgeWV0IHJlYWR5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGRUFUVVJFX0lQVjYKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICB1ZGhjcGM2IGlzIGEgREhDUHY2IGNsaWVudAorCisvL2FwcGxldDpJRl9VREhDUEM2KEFQUExFVCh1ZGhjcGM2LCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1VESENQQzYpICs9IGQ2X2RoY3BjLm8gZDZfcGFja2V0Lm8gZDZfc29ja2V0Lm8gY29tbW9uLm8gc29ja2V0Lm8gc2lnbmFscGlwZS5vCisKKworI2luY2x1ZGUgPHN5c2xvZy5oPgorLyogT3ZlcnJpZGUgRU5BQkxFX0ZFQVRVUkVfUElERklMRSAtIGlmdXBkb3duIG5lZWRzIG91ciBwaWRmaWxlIHRvIGFsd2F5cyBleGlzdCAqLworI2RlZmluZSBXQU5UX1BJREZJTEUgMQorI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImRoY3BkLmgiCisjaW5jbHVkZSAiZGhjcGMuaCIKKyNpbmNsdWRlICJkNl9jb21tb24uaCIKKworI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxuZXRwYWNrZXQvcGFja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvZmlsdGVyLmg+CisKKy8qICJzdHJ1Y3QgY2xpZW50X2NvbmZpZ190IGNsaWVudF9jb25maWciIGlzIGluIGJiX2NvbW1vbl9idWZzaXoxICovCisKKworI2lmIEVOQUJMRV9MT05HX09QVFMKK3N0YXRpYyBjb25zdCBjaGFyIHVkaGNwYzZfbG9uZ29wdHNbXSBBTElHTjEgPQorCSJpbnRlcmZhY2VcMCIgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiaSIKKwkibm93XDAiICAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIm4iCisJInBpZGZpbGVcMCIgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJwIgorCSJxdWl0XDAiICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAicSIKKwkicmVsZWFzZVwwIiAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIlIiCisJInJlcXVlc3RcMCIgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJyIgorCSJzY3JpcHRcMCIgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAicyIKKwkidGltZW91dFwwIiAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIlQiCisJInJldHJpZXNcMCIgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ0IgorCSJ0cnlhZ2FpblwwIiAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiQSIKKwkic3lzbG9nXDAiICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgIlMiCisJInJlcXVlc3Qtb3B0aW9uXDAiIFJlcXVpcmVkX2FyZ3VtZW50ICJPIgorCSJuby1kZWZhdWx0LW9wdGlvbnNcMCIgTm9fYXJndW1lbnQgICAibyIKKwkiZm9yZWdyb3VuZFwwIiAgICAgTm9fYXJndW1lbnQgICAgICAgImYiCisJImJhY2tncm91bmRcMCIgICAgIE5vX2FyZ3VtZW50ICAgICAgICJiIgorLy8vCUlGX0ZFQVRVUkVfVURIQ1BDX0FSUElORygiYXJwaW5nXDAiCU5vX2FyZ3VtZW50ICAgICAgICJhIikKKwlJRl9GRUFUVVJFX1VESENQX1BPUlQoImNsaWVudC1wb3J0XDAiCVJlcXVpcmVkX2FyZ3VtZW50ICJQIikKKwk7CisjZW5kaWYKKy8qIE11c3QgbWF0Y2ggZ2V0b3B0MzIgb3B0aW9uIHN0cmluZyBvcmRlciAqLworZW51bSB7CisJT1BUX2kgPSAxIDw8IDAsCisJT1BUX24gPSAxIDw8IDEsCisJT1BUX3AgPSAxIDw8IDIsCisJT1BUX3EgPSAxIDw8IDMsCisJT1BUX1IgPSAxIDw8IDQsCisJT1BUX3IgPSAxIDw8IDUsCisJT1BUX3MgPSAxIDw8IDYsCisJT1BUX1QgPSAxIDw8IDcsCisJT1BUX3QgPSAxIDw8IDgsCisJT1BUX1MgPSAxIDw8IDksCisJT1BUX0EgPSAxIDw8IDEwLAorCU9QVF9PID0gMSA8PCAxMSwKKwlPUFRfbyA9IDEgPDwgMTIsCisJT1BUX3ggPSAxIDw8IDEzLAorCU9QVF9mID0gMSA8PCAxNCwKKy8qIFRoZSByZXN0IGhhcyB2YXJpYWJsZSBiaXQgcG9zaXRpb25zLCBuZWVkIHRvIGJlIGNsZXZlciAqLworCU9QVEJJVF9mID0gMTQsCisJVVNFX0ZPUl9NTVUoICAgICAgICAgICAgIE9QVEJJVF9iLCkKKwkvLy9JRl9GRUFUVVJFX1VESENQQ19BUlBJTkcoT1BUQklUX2EsKQorCUlGX0ZFQVRVUkVfVURIQ1BfUE9SVCggICBPUFRCSVRfUCwpCisJVVNFX0ZPUl9NTVUoICAgICAgICAgICAgIE9QVF9iID0gMSA8PCBPUFRCSVRfYiwpCisJLy8vSUZfRkVBVFVSRV9VREhDUENfQVJQSU5HKE9QVF9hID0gMSA8PCBPUFRCSVRfYSwpCisJSUZfRkVBVFVSRV9VREhDUF9QT1JUKCAgIE9QVF9QID0gMSA8PCBPUFRCSVRfUCwpCit9OworCisKKy8qKiogVXRpbGl0eSBmdW5jdGlvbnMgKioqLworCitzdGF0aWMgdm9pZCAqZDZfZmluZF9vcHRpb24odWludDhfdCAqb3B0aW9uLCB1aW50OF90ICpvcHRpb25fZW5kLCB1bnNpZ25lZCBjb2RlKQoreworCS8qICJsZW5ndGggbWludXMgNCIgKi8KKwlpbnQgbGVuX200ID0gb3B0aW9uX2VuZCAtIG9wdGlvbiAtIDQ7CisJd2hpbGUgKGxlbl9tNCA+PSAwKSB7CisJCS8qIE5leHQgb3B0aW9uJ3MgbGVuIGlzIHRvbyBiaWc/ICovCisJCWlmIChvcHRpb25bM10gPiBsZW5fbTQpCisJCQlyZXR1cm4gTlVMTDsgLyogeWVzLiBib2d1cyBwYWNrZXQhICovCisJCS8qIFNvIGZhciB3ZSB0cmVhdCBhbnkgb3B0cyB3aXRoIGNvZGUgPjI1NQorCQkgKiBvciBsZW4gPjI1NSBhcyBib2d1cywgYW5kIHN0b3AgYXQgb25jZS4KKwkJICogVGhpcyBzaW1wbGlmaWVzIGJpZy1lbmRpYW4gaGFuZGxpbmcuCisJCSAqLworCQlpZiAob3B0aW9uWzBdICE9IDAgfHwgb3B0aW9uWzJdICE9IDApCisJCQlyZXR1cm4gTlVMTDsKKwkJLyogT3B0aW9uIHNlZW1zIHRvIGJlIHZhbGlkICovCisJCS8qIERvZXMgaXRzIGNvZGUgbWF0Y2g/ICovCisJCWlmIChvcHRpb25bMV0gPT0gY29kZSkKKwkJCXJldHVybiBvcHRpb247IC8qIHllcyEgKi8KKwkJb3B0aW9uICs9IG9wdGlvblszXSArIDQ7CisJCWxlbl9tNCAtPSBvcHRpb25bM10gKyA0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgKmQ2X2NvcHlfb3B0aW9uKHVpbnQ4X3QgKm9wdGlvbiwgdWludDhfdCAqb3B0aW9uX2VuZCwgdW5zaWduZWQgY29kZSkKK3sKKwl1aW50OF90ICpvcHQgPSBkNl9maW5kX29wdGlvbihvcHRpb24sIG9wdGlvbl9lbmQsIGNvZGUpOworCWlmICghb3B0KQorCQlyZXR1cm4gb3B0OworCXJldHVybiB4bWVtZHVwKG9wdCwgb3B0WzNdICsgNCk7Cit9CisKK3N0YXRpYyB2b2lkICpkNl9zdG9yZV9ibG9iKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsZW4pCit7CisJbWVtY3B5KGRzdCwgc3JjLCBsZW4pOworCXJldHVybiBkc3QgKyBsZW47Cit9CisKKworLyoqKiBTY3JpcHQgZXhlY3V0aW9uIGNvZGUgKioqLworCitzdGF0aWMgY2hhcioqIG5ld19lbnYodm9pZCkKK3sKKwljbGllbnQ2X2RhdGEuZW52X3B0ciA9IHhyZWFsbG9jX3ZlY3RvcihjbGllbnQ2X2RhdGEuZW52X3B0ciwgMywgY2xpZW50Nl9kYXRhLmVudl9pZHgpOworCXJldHVybiAmY2xpZW50Nl9kYXRhLmVudl9wdHJbY2xpZW50Nl9kYXRhLmVudl9pZHgrK107Cit9CisKKy8qIHB1dCBhbGwgdGhlIHBhcmFtZXRlcnMgaW50byB0aGUgZW52aXJvbm1lbnQgKi8KK3N0YXRpYyB2b2lkIG9wdGlvbl90b19lbnYodWludDhfdCAqb3B0aW9uLCB1aW50OF90ICpvcHRpb25fZW5kKQoreworCS8qICJsZW5ndGggbWludXMgNCIgKi8KKwlpbnQgbGVuX200ID0gb3B0aW9uX2VuZCAtIG9wdGlvbiAtIDQ7CisJd2hpbGUgKGxlbl9tNCA+PSAwKSB7CisJCXVpbnQzMl90IHYzMjsKKwkJY2hhciBpcHY2c3RyW3NpemVvZigiZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmIildOworCisJCWlmIChvcHRpb25bMF0gIT0gMCB8fCBvcHRpb25bMl0gIT0gMCkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAob3B0aW9uWzFdKSB7CisJCS8vY2FzZSBENl9PUFRfQ0xJRU5USUQ6CisJCS8vY2FzZSBENl9PUFRfU0VSVkVSSUQ6CisJCWNhc2UgRDZfT1BUX0lBX05BOgorCQljYXNlIEQ2X09QVF9JQV9QRDoKKwkJCW9wdGlvbl90b19lbnYob3B0aW9uICsgMTYsIG9wdGlvbiArIDQgKyBvcHRpb25bM10pOworCQkJYnJlYWs7CisJCS8vY2FzZSBENl9PUFRfSUFfVEE6CisJCWNhc2UgRDZfT1BUX0lBQUREUjoKKy8qICAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMworICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgT1BUSU9OX0lBQUREUiAgICAgICAgfCAgICAgICAgICBvcHRpb24tbGVuICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgSVB2NiBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZC1saWZldGltZSAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZC1saWZldGltZSAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICovCisJCQlzcHJpbnRfbmlwNihpcHY2c3RyLCBvcHRpb24gKyA0KTsKKwkJCSpuZXdfZW52KCkgPSB4YXNwcmludGYoImlwdjY9JXMiLCBpcHY2c3RyKTsKKworCQkJbW92ZV9mcm9tX3VuYWxpZ25lZDMyKHYzMiwgb3B0aW9uICsgNCArIDE2ICsgNCk7CisJCQkqbmV3X2VudigpID0geGFzcHJpbnRmKCJsZWFzZT0ldSIsICh1bnNpZ25lZCl2MzIpOworCQkJYnJlYWs7CisKKwkJLy9jYXNlIEQ2X09QVF9PUk86CisJCS8vY2FzZSBENl9PUFRfUFJFRkVSRU5DRToKKwkJLy9jYXNlIEQ2X09QVF9FTEFQU0VEX1RJTUU6CisJCS8vY2FzZSBENl9PUFRfUkVMQVlfTVNHOgorCQkvL2Nhc2UgRDZfT1BUX0FVVEg6CisJCS8vY2FzZSBENl9PUFRfVU5JQ0FTVDoKKwkJLy9jYXNlIEQ2X09QVF9TVEFUVVNfQ09ERToKKwkJLy9jYXNlIEQ2X09QVF9SQVBJRF9DT01NSVQ6CisJCS8vY2FzZSBENl9PUFRfVVNFUl9DTEFTUzoKKwkJLy9jYXNlIEQ2X09QVF9WRU5ET1JfQ0xBU1M6CisJCS8vY2FzZSBENl9PUFRfVkVORE9SX09QVFM6CisJCS8vY2FzZSBENl9PUFRfSU5URVJGQUNFX0lEOgorCQkvL2Nhc2UgRDZfT1BUX1JFQ09ORl9NU0c6CisJCS8vY2FzZSBENl9PUFRfUkVDT05GX0FDQ0VQVDoKKworCQljYXNlIEQ2X09QVF9JQVBSRUZJWDoKKy8qICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgT1BUSU9OX0lBUFJFRklYICAgICAgICB8ICAgICAgICAgb3B0aW9uLWxlbmd0aCAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgIHByZWZlcnJlZC1saWZldGltZSAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZC1saWZldGltZSAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCBwcmVmaXgtbGVuZ3RoIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rICAgICAgICAgIElQdjYgcHJlZml4ICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgKDE2IG9jdGV0cykgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSsKKyAqLworCQkJLy9tb3ZlX2Zyb21fdW5hbGlnbmVkMzIodjMyLCBvcHRpb24gKyA0ICsgNCk7CisJCQkvLypuZXdfZW52KCkgPSB4YXNwcmludGYoImxlYXNlPSV1IiwgKHVuc2lnbmVkKXYzMik7CisKKwkJCXNwcmludF9uaXA2KGlwdjZzdHIsIG9wdGlvbiArIDQgKyA0ICsgMSk7CisJCQkqbmV3X2VudigpID0geGFzcHJpbnRmKCJpcHY2cHJlZml4PSVzLyV1IiwgaXB2NnN0ciwgKHVuc2lnbmVkKShvcHRpb25bNCArIDRdKSk7CisJCX0KKwkJb3B0aW9uICs9IDQgKyBvcHRpb25bM107CisJCWxlbl9tNCAtPSA0ICsgb3B0aW9uWzNdOworCX0KK30KKworc3RhdGljIGNoYXIgKipmaWxsX2VudnAoc3RydWN0IGQ2X3BhY2tldCAqcGFja2V0KQoreworCWNoYXIgKiplbnZwLCAqKmN1cnI7CisKKwljbGllbnQ2X2RhdGEuZW52X3B0ciA9IE5VTEw7CisJY2xpZW50Nl9kYXRhLmVudl9pZHggPSAwOworCisJKm5ld19lbnYoKSA9IHhhc3ByaW50ZigiaW50ZXJmYWNlPSVzIiwgY2xpZW50X2NvbmZpZy5pbnRlcmZhY2UpOworCisJaWYgKHBhY2tldCkKKwkJb3B0aW9uX3RvX2VudihwYWNrZXQtPmQ2X29wdGlvbnMsIHBhY2tldC0+ZDZfb3B0aW9ucyArIHNpemVvZihwYWNrZXQtPmQ2X29wdGlvbnMpKTsKKworCWVudnAgPSBjdXJyID0gY2xpZW50Nl9kYXRhLmVudl9wdHI7CisJd2hpbGUgKCpjdXJyKQorCQlwdXRlbnYoKmN1cnIrKyk7CisKKwlyZXR1cm4gZW52cDsKK30KKworLyogQ2FsbCBhIHNjcmlwdCB3aXRoIGEgcGFyIGZpbGUgYW5kIGVudiB2YXJzICovCitzdGF0aWMgdm9pZCBkNl9ydW5fc2NyaXB0KHN0cnVjdCBkNl9wYWNrZXQgKnBhY2tldCwgY29uc3QgY2hhciAqbmFtZSkKK3sKKwljaGFyICoqZW52cCwgKipjdXJyOworCWNoYXIgKmFyZ3ZbM107CisKKwllbnZwID0gZmlsbF9lbnZwKHBhY2tldCk7CisKKwkvKiBjYWxsIHNjcmlwdCAqLworCWxvZzEoIkV4ZWN1dGluZyAlcyAlcyIsIGNsaWVudF9jb25maWcuc2NyaXB0LCBuYW1lKTsKKwlhcmd2WzBdID0gKGNoYXIqKSBjbGllbnRfY29uZmlnLnNjcmlwdDsKKwlhcmd2WzFdID0gKGNoYXIqKSBuYW1lOworCWFyZ3ZbMl0gPSBOVUxMOworCXNwYXduX2FuZF93YWl0KGFyZ3YpOworCisJZm9yIChjdXJyID0gZW52cDsgKmN1cnI7IGN1cnIrKykgeworCQlsb2cyKCIgJXMiLCAqY3Vycik7CisJCWJiX3Vuc2V0ZW52X2FuZF9mcmVlKCpjdXJyKTsKKwl9CisJZnJlZShlbnZwKTsKK30KKworCisvKioqIFNlbmRpbmcvcmVjZWl2aW5nIHBhY2tldHMgKioqLworCitzdGF0aWMgQUxXQVlTX0lOTElORSB1aW50MzJfdCByYW5kb21feGlkKHZvaWQpCit7CisJdWludDMyX3QgdCA9IHJhbmQoKSAmIGh0b25sKDB4MDBmZmZmZmYpOworCXJldHVybiB0OworfQorCisvKiBJbml0aWFsaXplIHRoZSBwYWNrZXQgd2l0aCB0aGUgcHJvcGVyIGRlZmF1bHRzICovCitzdGF0aWMgdWludDhfdCAqaW5pdF9kNl9wYWNrZXQoc3RydWN0IGQ2X3BhY2tldCAqcGFja2V0LCBjaGFyIHR5cGUsIHVpbnQzMl90IHhpZCkKK3sKKwlzdHJ1Y3QgZDZfb3B0aW9uICpjbGllbnRpZDsKKworCW1lbXNldChwYWNrZXQsIDAsIHNpemVvZigqcGFja2V0KSk7CisKKwlwYWNrZXQtPmQ2X3hpZDMyID0geGlkOworCXBhY2tldC0+ZDZfbXNnX3R5cGUgPSB0eXBlOworCisJY2xpZW50aWQgPSAodm9pZCopY2xpZW50X2NvbmZpZy5jbGllbnRpZDsKKwlyZXR1cm4gZDZfc3RvcmVfYmxvYihwYWNrZXQtPmQ2X29wdGlvbnMsIGNsaWVudGlkLCBjbGllbnRpZC0+bGVuICsgMisyKTsKK30KKworc3RhdGljIHVpbnQ4X3QgKmFkZF9kNl9jbGllbnRfb3B0aW9ucyh1aW50OF90ICpwdHIpCit7CisJcmV0dXJuIHB0cjsKKwkvL3VpbnQ4X3QgYzsKKwkvL2ludCBpLCBlbmQsIGxlbjsKKworCS8qIEFkZCBhICJwYXJhbSByZXEiIG9wdGlvbiB3aXRoIHRoZSBsaXN0IG9mIG9wdGlvbnMgd2UnZCBsaWtlIHRvIGhhdmUKKwkgKiBmcm9tIHN0dWJib3JuIERIQ1Agc2VydmVycy4gUHVsbCB0aGUgZGF0YSBmcm9tIHRoZSBzdHJ1Y3QgaW4gY29tbW9uLmMuCisJICogTm8gYm91bmRzIGNoZWNraW5nIGJlY2F1c2UgaXQgZ29lcyB0b3dhcmRzIHRoZSBoZWFkIG9mIHRoZSBwYWNrZXQuICovCisJLy8uLi4KKworCS8qIEFkZCAteCBvcHRpb25zIGlmIGFueSAqLworCS8vLi4uCit9CisKK3N0YXRpYyBpbnQgZDZfbWNhc3RfZnJvbV9jbGllbnRfY29uZmlnX2lmaW5kZXgoc3RydWN0IGQ2X3BhY2tldCAqcGFja2V0LCB1aW50OF90ICplbmQpCit7CisJc3RhdGljIGNvbnN0IHVpbnQ4X3QgRkYwMl9fMV8yWzE2XSA9IHsKKwkJMHhGRiwgMHgwMiwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwKKwkJMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMiwKKwl9OworCisJcmV0dXJuIGQ2X3NlbmRfcmF3X3BhY2tldCgKKwkJcGFja2V0LCAoZW5kIC0gKHVpbnQ4X3QqKSBwYWNrZXQpLAorCQkvKnNyYyovIE5VTEwsIENMSUVOVF9QT1JUNiwKKwkJLypkc3QqLyAoc3RydWN0IGluNl9hZGRyKilGRjAyX18xXzIsIFNFUlZFUl9QT1JUNiwgTUFDX0JDQVNUX0FERFIsCisJCWNsaWVudF9jb25maWcuaWZpbmRleAorCSk7Cit9CisKKy8qIE1pbHRpY2FzdCBhIERIQ1B2NiBTb2xpY2l0IHBhY2tldCB0byB0aGUgbmV0d29yaywgd2l0aCBhbiBvcHRpb25hbGx5IHJlcXVlc3RlZCBJUC4KKyAqCisgKiBSRkMgMzMxNSAxNy4xLjEuIENyZWF0aW9uIG9mIFNvbGljaXQgTWVzc2FnZXMKKyAqCisgKiBUaGUgY2xpZW50IE1VU1QgaW5jbHVkZSBhIENsaWVudCBJZGVudGlmaWVyIG9wdGlvbiB0byBpZGVudGlmeSBpdHNlbGYKKyAqIHRvIHRoZSBzZXJ2ZXIuICBUaGUgY2xpZW50IGluY2x1ZGVzIElBIG9wdGlvbnMgZm9yIGFueSBJQXMgdG8gd2hpY2gKKyAqIGl0IHdhbnRzIHRoZSBzZXJ2ZXIgdG8gYXNzaWduIGFkZHJlc3Nlcy4gIFRoZSBjbGllbnQgTUFZIGluY2x1ZGUKKyAqIGFkZHJlc3NlcyBpbiB0aGUgSUFzIGFzIGEgaGludCB0byB0aGUgc2VydmVyIGFib3V0IGFkZHJlc3NlcyBmb3IKKyAqIHdoaWNoIHRoZSBjbGllbnQgaGFzIGEgcHJlZmVyZW5jZS4gLi4uCisgKgorICogVGhlIGNsaWVudCB1c2VzIElBX05BIG9wdGlvbnMgdG8gcmVxdWVzdCB0aGUgYXNzaWdubWVudCBvZiBub24tCisgKiB0ZW1wb3JhcnkgYWRkcmVzc2VzIGFuZCB1c2VzIElBX1RBIG9wdGlvbnMgdG8gcmVxdWVzdCB0aGUgYXNzaWdubWVudAorICogb2YgdGVtcG9yYXJ5IGFkZHJlc3Nlcy4gIEVpdGhlciBJQV9OQSBvciBJQV9UQSBvcHRpb25zLCBvciBhCisgKiBjb21iaW5hdGlvbiBvZiBib3RoLCBjYW4gYmUgaW5jbHVkZWQgaW4gREhDUCBtZXNzYWdlcy4KKyAqCisgKiBUaGUgY2xpZW50IFNIT1VMRCBpbmNsdWRlIGFuIE9wdGlvbiBSZXF1ZXN0IG9wdGlvbiAoc2VlIHNlY3Rpb24gMjIuNykKKyAqIHRvIGluZGljYXRlIHRoZSBvcHRpb25zIHRoZSBjbGllbnQgaXMgaW50ZXJlc3RlZCBpbiByZWNlaXZpbmcuICBUaGUKKyAqIGNsaWVudCBNQVkgYWRkaXRpb25hbGx5IGluY2x1ZGUgaW5zdGFuY2VzIG9mIHRob3NlIG9wdGlvbnMgdGhhdCBhcmUKKyAqIGlkZW50aWZpZWQgaW4gdGhlIE9wdGlvbiBSZXF1ZXN0IG9wdGlvbiwgd2l0aCBkYXRhIHZhbHVlcyBhcyBoaW50cyB0bworICogdGhlIHNlcnZlciBhYm91dCBwYXJhbWV0ZXIgdmFsdWVzIHRoZSBjbGllbnQgd291bGQgbGlrZSB0byBoYXZlCisgKiByZXR1cm5lZC4KKyAqCisgKiBUaGUgY2xpZW50IGluY2x1ZGVzIGEgUmVjb25maWd1cmUgQWNjZXB0IG9wdGlvbiAoc2VlIHNlY3Rpb24gMjIuMjApCisgKiBpZiB0aGUgY2xpZW50IGlzIHdpbGxpbmcgdG8gYWNjZXB0IFJlY29uZmlndXJlIG1lc3NhZ2VzIGZyb20gdGhlCisgKiBzZXJ2ZXIuCisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgfCAgICAgICAgT1BUSU9OX0NMSUVOVElEICAgICAgICB8ICAgICAgICAgIG9wdGlvbi1sZW4gICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERVSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAodmFyaWFibGUgbGVuZ3RoKSAgICAgICAgICAgICAgICAgICAgICAuCisgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLgorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworCisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgfCAgICAgICAgICBPUFRJT05fSUFfTkEgICAgICAgICB8ICAgICAgICAgIG9wdGlvbi1sZW4gICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgSUFJRCAoNCBvY3RldHMpICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICBJQV9OQS1vcHRpb25zICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCisKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICB8ICAgICAgICAgIE9QVElPTl9JQUFERFIgICAgICAgIHwgICAgICAgICAgb3B0aW9uLWxlbiAgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgIElQdjYgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgfCAgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWQtbGlmZXRpbWUgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQtbGlmZXRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCisgICAgICAuICAgICAgICAgICAgICAgICAgICAgICAgSUFhZGRyLW9wdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgLgorICAgICAgLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisKKworICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAgICAgIHwgICAgICAgICAgIE9QVElPTl9PUk8gICAgICAgICAgfCAgICAgICAgICAgb3B0aW9uLWxlbiAgICAgICAgICB8CisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgfCAgICByZXF1ZXN0ZWQtb3B0aW9uLWNvZGUtMSAgICB8ICAgIHJlcXVlc3RlZC1vcHRpb24tY29kZS0yICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKworCisgICAgICArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICAgICAgfCAgICAgT1BUSU9OX1JFQ09ORl9BQ0NFUFQgICAgICB8ICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgIHwKKyAgICAgICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKi8KKy8qIE5PSU5MSU5FOiBsaW1pdCBzdGFjayB1c2FnZSBpbiBjYWxsZXIgKi8KK3N0YXRpYyBOT0lOTElORSBpbnQgc2VuZF9kNl9kaXNjb3Zlcih1aW50MzJfdCB4aWQsIHN0cnVjdCBpbjZfYWRkciAqcmVxdWVzdGVkX2lwdjYpCit7CisJc3RydWN0IGQ2X3BhY2tldCBwYWNrZXQ7CisJdWludDhfdCAqb3B0X3B0cjsKKwl1bnNpZ25lZCBsZW47CisKKwkvKiBGaWxsIGluOiBtc2cgdHlwZSwgY2xpZW50IGlkICovCisJb3B0X3B0ciA9IGluaXRfZDZfcGFja2V0KCZwYWNrZXQsIEQ2X01TR19TT0xJQ0lULCB4aWQpOworCisJLyogQ3JlYXRlIG5ldyBJQV9OQSwgb3B0aW9uYWxseSB3aXRoIGluY2x1ZGVkIElBQUREUiB3aXRoIHJlcXVlc3RlZCBJUCAqLworCWZyZWUoY2xpZW50Nl9kYXRhLmlhX25hKTsKKwlsZW4gPSByZXF1ZXN0ZWRfaXB2NiA/IDIrMis0KzQrNCArIDIrMisxNis0KzQgOiAyKzIrNCs0KzQ7CisJY2xpZW50Nl9kYXRhLmlhX25hID0geHphbGxvYyhsZW4pOworCWNsaWVudDZfZGF0YS5pYV9uYS0+Y29kZSA9IEQ2X09QVF9JQV9OQTsKKwljbGllbnQ2X2RhdGEuaWFfbmEtPmxlbiA9IGxlbiAtIDQ7CisJKih1aW50MzJfdCopY2xpZW50Nl9kYXRhLmlhX25hLT5kYXRhID0gcmFuZCgpOyAvKiBJQUlEICovCisJaWYgKHJlcXVlc3RlZF9pcHY2KSB7CisJCXN0cnVjdCBkNl9vcHRpb24gKmlhYWRkciA9ICh2b2lkKikoY2xpZW50Nl9kYXRhLmlhX25hLT5kYXRhICsgNCs0KzQpOworCQlpYWFkZHItPmNvZGUgPSBENl9PUFRfSUFBRERSOworCQlpYWFkZHItPmxlbiA9IDE2KzQrNDsKKwkJbWVtY3B5KGlhYWRkci0+ZGF0YSwgcmVxdWVzdGVkX2lwdjYsIDE2KTsKKwl9CisJb3B0X3B0ciA9IGQ2X3N0b3JlX2Jsb2Iob3B0X3B0ciwgY2xpZW50Nl9kYXRhLmlhX25hLCBsZW4pOworCisJLyogQWRkIG9wdGlvbnM6CisJICogInBhcmFtIHJlcSIgb3B0aW9uIGFjY29yZGluZyB0byAtTywgb3B0aW9ucyBzcGVjaWZpZWQgd2l0aCAteAorCSAqLworCW9wdF9wdHIgPSBhZGRfZDZfY2xpZW50X29wdGlvbnMob3B0X3B0cik7CisKKwliYl9pbmZvX21zZygiU2VuZGluZyBkaXNjb3Zlci4uLiIpOworCXJldHVybiBkNl9tY2FzdF9mcm9tX2NsaWVudF9jb25maWdfaWZpbmRleCgmcGFja2V0LCBvcHRfcHRyKTsKK30KKworLyogTXVsdGljYXN0IGEgREhDUHY2IHJlcXVlc3QgbWVzc2FnZQorICoKKyAqIFJGQyAzMzE1IDE4LjEuMS4gQ3JlYXRpb24gYW5kIFRyYW5zbWlzc2lvbiBvZiBSZXF1ZXN0IE1lc3NhZ2VzCisgKgorICogVGhlIGNsaWVudCB1c2VzIGEgUmVxdWVzdCBtZXNzYWdlIHRvIHBvcHVsYXRlIElBcyB3aXRoIGFkZHJlc3NlcyBhbmQKKyAqIG9idGFpbiBvdGhlciBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiAgVGhlIGNsaWVudCBpbmNsdWRlcyBvbmUgb3IKKyAqIG1vcmUgSUEgb3B0aW9ucyBpbiB0aGUgUmVxdWVzdCBtZXNzYWdlLiAgVGhlIHNlcnZlciB0aGVuIHJldHVybnMKKyAqIGFkZHJlc3NlcyBhbmQgb3RoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIElBcyB0byB0aGUgY2xpZW50IGluIElBCisgKiBvcHRpb25zIGluIGEgUmVwbHkgbWVzc2FnZS4KKyAqCisgKiBUaGUgY2xpZW50IGdlbmVyYXRlcyBhIHRyYW5zYWN0aW9uIElEIGFuZCBpbnNlcnRzIHRoaXMgdmFsdWUgaW4gdGhlCisgKiAidHJhbnNhY3Rpb24taWQiIGZpZWxkLgorICoKKyAqIFRoZSBjbGllbnQgcGxhY2VzIHRoZSBpZGVudGlmaWVyIG9mIHRoZSBkZXN0aW5hdGlvbiBzZXJ2ZXIgaW4gYQorICogU2VydmVyIElkZW50aWZpZXIgb3B0aW9uLgorICoKKyAqIFRoZSBjbGllbnQgTVVTVCBpbmNsdWRlIGEgQ2xpZW50IElkZW50aWZpZXIgb3B0aW9uIHRvIGlkZW50aWZ5IGl0c2VsZgorICogdG8gdGhlIHNlcnZlci4gIFRoZSBjbGllbnQgYWRkcyBhbnkgb3RoZXIgYXBwcm9wcmlhdGUgb3B0aW9ucywKKyAqIGluY2x1ZGluZyBvbmUgb3IgbW9yZSBJQSBvcHRpb25zIChpZiB0aGUgY2xpZW50IGlzIHJlcXVlc3RpbmcgdGhhdAorICogdGhlIHNlcnZlciBhc3NpZ24gaXQgc29tZSBuZXR3b3JrIGFkZHJlc3NlcykuCisgKgorICogVGhlIGNsaWVudCBNVVNUIGluY2x1ZGUgYW4gT3B0aW9uIFJlcXVlc3Qgb3B0aW9uIChzZWUgc2VjdGlvbiAyMi43KQorICogdG8gaW5kaWNhdGUgdGhlIG9wdGlvbnMgdGhlIGNsaWVudCBpcyBpbnRlcmVzdGVkIGluIHJlY2VpdmluZy4gIFRoZQorICogY2xpZW50IE1BWSBpbmNsdWRlIG9wdGlvbnMgd2l0aCBkYXRhIHZhbHVlcyBhcyBoaW50cyB0byB0aGUgc2VydmVyCisgKiBhYm91dCBwYXJhbWV0ZXIgdmFsdWVzIHRoZSBjbGllbnQgd291bGQgbGlrZSB0byBoYXZlIHJldHVybmVkLgorICoKKyAqIFRoZSBjbGllbnQgaW5jbHVkZXMgYSBSZWNvbmZpZ3VyZSBBY2NlcHQgb3B0aW9uIChzZWUgc2VjdGlvbiAyMi4yMCkKKyAqIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIGNsaWVudCBpcyB3aWxsaW5nIHRvIGFjY2VwdCBSZWNvbmZpZ3VyZQorICogbWVzc2FnZXMgZnJvbSB0aGUgc2VydmVyLgorICovCisvKiBOT0lOTElORTogbGltaXQgc3RhY2sgdXNhZ2UgaW4gY2FsbGVyICovCitzdGF0aWMgTk9JTkxJTkUgaW50IHNlbmRfZDZfc2VsZWN0KHVpbnQzMl90IHhpZCkKK3sKKwlzdHJ1Y3QgZDZfcGFja2V0IHBhY2tldDsKKwl1aW50OF90ICpvcHRfcHRyOworCisJLyogRmlsbCBpbjogbXNnIHR5cGUsIGNsaWVudCBpZCAqLworCW9wdF9wdHIgPSBpbml0X2Q2X3BhY2tldCgmcGFja2V0LCBENl9NU0dfUkVRVUVTVCwgeGlkKTsKKworCS8qIHNlcnZlciBpZCAqLworCW9wdF9wdHIgPSBkNl9zdG9yZV9ibG9iKG9wdF9wdHIsIGNsaWVudDZfZGF0YS5zZXJ2ZXJfaWQsIGNsaWVudDZfZGF0YS5zZXJ2ZXJfaWQtPmxlbiArIDIrMik7CisJLyogSUEgTkEgKGNvbnRhaW5zIHJlcXVlc3RlZCBJUCkgKi8KKwlvcHRfcHRyID0gZDZfc3RvcmVfYmxvYihvcHRfcHRyLCBjbGllbnQ2X2RhdGEuaWFfbmEsIGNsaWVudDZfZGF0YS5pYV9uYS0+bGVuICsgMisyKTsKKworCS8qIEFkZCBvcHRpb25zOgorCSAqICJwYXJhbSByZXEiIG9wdGlvbiBhY2NvcmRpbmcgdG8gLU8sIG9wdGlvbnMgc3BlY2lmaWVkIHdpdGggLXgKKwkgKi8KKwlvcHRfcHRyID0gYWRkX2Q2X2NsaWVudF9vcHRpb25zKG9wdF9wdHIpOworCisJYmJfaW5mb19tc2coIlNlbmRpbmcgc2VsZWN0Li4uIik7CisJcmV0dXJuIGQ2X21jYXN0X2Zyb21fY2xpZW50X2NvbmZpZ19pZmluZGV4KCZwYWNrZXQsIG9wdF9wdHIpOworfQorCisvKiBVbmljYXN0IG9yIGJyb2FkY2FzdCBhIERIQ1AgcmVuZXcgbWVzc2FnZQorICoKKyAqIFJGQyAzMzE1IDE4LjEuMy4gQ3JlYXRpb24gYW5kIFRyYW5zbWlzc2lvbiBvZiBSZW5ldyBNZXNzYWdlcworICoKKyAqIFRvIGV4dGVuZCB0aGUgdmFsaWQgYW5kIHByZWZlcnJlZCBsaWZldGltZXMgZm9yIHRoZSBhZGRyZXNzZXMKKyAqIGFzc29jaWF0ZWQgd2l0aCBhbiBJQSwgdGhlIGNsaWVudCBzZW5kcyBhIFJlbmV3IG1lc3NhZ2UgdG8gdGhlIHNlcnZlcgorICogZnJvbSB3aGljaCB0aGUgY2xpZW50IG9idGFpbmVkIHRoZSBhZGRyZXNzZXMgaW4gdGhlIElBIGNvbnRhaW5pbmcgYW4KKyAqIElBIG9wdGlvbiBmb3IgdGhlIElBLiAgVGhlIGNsaWVudCBpbmNsdWRlcyBJQSBBZGRyZXNzIG9wdGlvbnMgaW4gdGhlCisgKiBJQSBvcHRpb24gZm9yIHRoZSBhZGRyZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBJQS4gIFRoZSBzZXJ2ZXIKKyAqIGRldGVybWluZXMgbmV3IGxpZmV0aW1lcyBmb3IgdGhlIGFkZHJlc3NlcyBpbiB0aGUgSUEgYWNjb3JkaW5nIHRvIHRoZQorICogYWRtaW5pc3RyYXRpdmUgY29uZmlndXJhdGlvbiBvZiB0aGUgc2VydmVyLiAgVGhlIHNlcnZlciBtYXkgYWxzbyBhZGQKKyAqIG5ldyBhZGRyZXNzZXMgdG8gdGhlIElBLiAgVGhlIHNlcnZlciBtYXkgcmVtb3ZlIGFkZHJlc3NlcyBmcm9tIHRoZSBJQQorICogYnkgc2V0dGluZyB0aGUgcHJlZmVycmVkIGFuZCB2YWxpZCBsaWZldGltZXMgb2YgdGhvc2UgYWRkcmVzc2VzIHRvCisgKiB6ZXJvLgorICoKKyAqIFRoZSBzZXJ2ZXIgY29udHJvbHMgdGhlIHRpbWUgYXQgd2hpY2ggdGhlIGNsaWVudCBjb250YWN0cyB0aGUgc2VydmVyCisgKiB0byBleHRlbmQgdGhlIGxpZmV0aW1lcyBvbiBhc3NpZ25lZCBhZGRyZXNzZXMgdGhyb3VnaCB0aGUgVDEgYW5kIFQyCisgKiBwYXJhbWV0ZXJzIGFzc2lnbmVkIHRvIGFuIElBLgorICoKKyAqIEF0IHRpbWUgVDEgZm9yIGFuIElBLCB0aGUgY2xpZW50IGluaXRpYXRlcyBhIFJlbmV3L1JlcGx5IG1lc3NhZ2UKKyAqIGV4Y2hhbmdlIHRvIGV4dGVuZCB0aGUgbGlmZXRpbWVzIG9uIGFueSBhZGRyZXNzZXMgaW4gdGhlIElBLiAgVGhlCisgKiBjbGllbnQgaW5jbHVkZXMgYW4gSUEgb3B0aW9uIHdpdGggYWxsIGFkZHJlc3NlcyBjdXJyZW50bHkgYXNzaWduZWQgdG8KKyAqIHRoZSBJQSBpbiBpdHMgUmVuZXcgbWVzc2FnZS4KKyAqCisgKiBJZiBUMSBvciBUMiBpcyBzZXQgdG8gMCBieSB0aGUgc2VydmVyIChmb3IgYW4gSUFfTkEpIG9yIHRoZXJlIGFyZSBubworICogVDEgb3IgVDIgdGltZXMgKGZvciBhbiBJQV9UQSksIHRoZSBjbGllbnQgbWF5IHNlbmQgYSBSZW5ldyBvciBSZWJpbmQKKyAqIG1lc3NhZ2UsIHJlc3BlY3RpdmVseSwgYXQgdGhlIGNsaWVudCdzIGRpc2NyZXRpb24uCisgKgorICogVGhlIGNsaWVudCBzZXRzIHRoZSAibXNnLXR5cGUiIGZpZWxkIHRvIFJFTkVXLiAgVGhlIGNsaWVudCBnZW5lcmF0ZXMKKyAqIGEgdHJhbnNhY3Rpb24gSUQgYW5kIGluc2VydHMgdGhpcyB2YWx1ZSBpbiB0aGUgInRyYW5zYWN0aW9uLWlkIgorICogZmllbGQuCisgKgorICogVGhlIGNsaWVudCBwbGFjZXMgdGhlIGlkZW50aWZpZXIgb2YgdGhlIGRlc3RpbmF0aW9uIHNlcnZlciBpbiBhCisgKiBTZXJ2ZXIgSWRlbnRpZmllciBvcHRpb24uCisgKgorICogVGhlIGNsaWVudCBNVVNUIGluY2x1ZGUgYSBDbGllbnQgSWRlbnRpZmllciBvcHRpb24gdG8gaWRlbnRpZnkgaXRzZWxmCisgKiB0byB0aGUgc2VydmVyLiAgVGhlIGNsaWVudCBhZGRzIGFueSBhcHByb3ByaWF0ZSBvcHRpb25zLCBpbmNsdWRpbmcKKyAqIG9uZSBvciBtb3JlIElBIG9wdGlvbnMuICBUaGUgY2xpZW50IE1VU1QgaW5jbHVkZSB0aGUgbGlzdCBvZgorICogYWRkcmVzc2VzIHRoZSBjbGllbnQgY3VycmVudGx5IGhhcyBhc3NvY2lhdGVkIHdpdGggdGhlIElBcyBpbiB0aGUKKyAqIFJlbmV3IG1lc3NhZ2UuCisgKgorICogVGhlIGNsaWVudCBNVVNUIGluY2x1ZGUgYW4gT3B0aW9uIFJlcXVlc3Qgb3B0aW9uIChzZWUgc2VjdGlvbiAyMi43KQorICogdG8gaW5kaWNhdGUgdGhlIG9wdGlvbnMgdGhlIGNsaWVudCBpcyBpbnRlcmVzdGVkIGluIHJlY2VpdmluZy4gIFRoZQorICogY2xpZW50IE1BWSBpbmNsdWRlIG9wdGlvbnMgd2l0aCBkYXRhIHZhbHVlcyBhcyBoaW50cyB0byB0aGUgc2VydmVyCisgKiBhYm91dCBwYXJhbWV0ZXIgdmFsdWVzIHRoZSBjbGllbnQgd291bGQgbGlrZSB0byBoYXZlIHJldHVybmVkLgorICovCisvKiBOT0lOTElORTogbGltaXQgc3RhY2sgdXNhZ2UgaW4gY2FsbGVyICovCitzdGF0aWMgTk9JTkxJTkUgaW50IHNlbmRfZDZfcmVuZXcodWludDMyX3QgeGlkLCBzdHJ1Y3QgaW42X2FkZHIgKnNlcnZlcl9pcHY2LCBzdHJ1Y3QgaW42X2FkZHIgKm91cl9jdXJfaXB2NikKK3sKKwlzdHJ1Y3QgZDZfcGFja2V0IHBhY2tldDsKKwl1aW50OF90ICpvcHRfcHRyOworCisJLyogRmlsbCBpbjogbXNnIHR5cGUsIGNsaWVudCBpZCAqLworCW9wdF9wdHIgPSBpbml0X2Q2X3BhY2tldCgmcGFja2V0LCBESENQUkVRVUVTVCwgeGlkKTsKKworCS8qIHNlcnZlciBpZCAqLworCW9wdF9wdHIgPSBkNl9zdG9yZV9ibG9iKG9wdF9wdHIsIGNsaWVudDZfZGF0YS5zZXJ2ZXJfaWQsIGNsaWVudDZfZGF0YS5zZXJ2ZXJfaWQtPmxlbiArIDIrMik7CisJLyogSUEgTkEgKGNvbnRhaW5zIHJlcXVlc3RlZCBJUCkgKi8KKwlvcHRfcHRyID0gZDZfc3RvcmVfYmxvYihvcHRfcHRyLCBjbGllbnQ2X2RhdGEuaWFfbmEsIGNsaWVudDZfZGF0YS5pYV9uYS0+bGVuICsgMisyKTsKKworCS8qIEFkZCBvcHRpb25zOgorCSAqICJwYXJhbSByZXEiIG9wdGlvbiBhY2NvcmRpbmcgdG8gLU8sIG9wdGlvbnMgc3BlY2lmaWVkIHdpdGggLXgKKwkgKi8KKwlvcHRfcHRyID0gYWRkX2Q2X2NsaWVudF9vcHRpb25zKG9wdF9wdHIpOworCisJYmJfaW5mb19tc2coIlNlbmRpbmcgcmVuZXcuLi4iKTsKKwlpZiAoc2VydmVyX2lwdjYpCisJCXJldHVybiBkNl9zZW5kX2tlcm5lbF9wYWNrZXQoCisJCQkmcGFja2V0LCAob3B0X3B0ciAtICh1aW50OF90KikgJnBhY2tldCksCisJCQlvdXJfY3VyX2lwdjYsIENMSUVOVF9QT1JUNiwKKwkJCXNlcnZlcl9pcHY2LCBTRVJWRVJfUE9SVDYKKwkJKTsKKwlyZXR1cm4gZDZfbWNhc3RfZnJvbV9jbGllbnRfY29uZmlnX2lmaW5kZXgoJnBhY2tldCwgb3B0X3B0cik7Cit9CisKKy8qIFVuaWNhc3QgYSBESENQIHJlbGVhc2UgbWVzc2FnZSAqLworc3RhdGljIGludCBzZW5kX2Q2X3JlbGVhc2Uoc3RydWN0IGluNl9hZGRyICpzZXJ2ZXJfaXB2Niwgc3RydWN0IGluNl9hZGRyICpvdXJfY3VyX2lwdjYpCit7CisJc3RydWN0IGQ2X3BhY2tldCBwYWNrZXQ7CisJdWludDhfdCAqb3B0X3B0cjsKKworCS8qIEZpbGwgaW46IG1zZyB0eXBlLCBjbGllbnQgaWQgKi8KKwlvcHRfcHRyID0gaW5pdF9kNl9wYWNrZXQoJnBhY2tldCwgRDZfTVNHX1JFTEVBU0UsIHJhbmRvbV94aWQoKSk7CisJLyogc2VydmVyIGlkICovCisJb3B0X3B0ciA9IGQ2X3N0b3JlX2Jsb2Iob3B0X3B0ciwgY2xpZW50Nl9kYXRhLnNlcnZlcl9pZCwgY2xpZW50Nl9kYXRhLnNlcnZlcl9pZC0+bGVuICsgMisyKTsKKwkvKiBJQSBOQSAoY29udGFpbnMgb3VyIGN1cnJlbnQgSVApICovCisJb3B0X3B0ciA9IGQ2X3N0b3JlX2Jsb2Iob3B0X3B0ciwgY2xpZW50Nl9kYXRhLmlhX25hLCBjbGllbnQ2X2RhdGEuaWFfbmEtPmxlbiArIDIrMik7CisKKwliYl9pbmZvX21zZygiU2VuZGluZyByZWxlYXNlLi4uIik7CisJcmV0dXJuIGQ2X3NlbmRfa2VybmVsX3BhY2tldCgKKwkJJnBhY2tldCwgKG9wdF9wdHIgLSAodWludDhfdCopICZwYWNrZXQpLAorCQlvdXJfY3VyX2lwdjYsIENMSUVOVF9QT1JUNiwKKwkJc2VydmVyX2lwdjYsIFNFUlZFUl9QT1JUNgorCSk7Cit9CisKKy8qIFJldHVybnMgLTEgb24gZXJyb3JzIHRoYXQgYXJlIGZhdGFsIGZvciB0aGUgc29ja2V0LCAtMiBmb3IgdGhvc2UgdGhhdCBhcmVuJ3QgKi8KKy8qIE5PSU5MSU5FOiBsaW1pdCBzdGFjayB1c2FnZSBpbiBjYWxsZXIgKi8KK3N0YXRpYyBOT0lOTElORSBpbnQgZDZfcmVjdl9yYXdfcGFja2V0KHN0cnVjdCBpbjZfYWRkciAqcGVlcl9pcHY2CisJVU5VU0VEX1BBUkFNCisJLCBzdHJ1Y3QgZDZfcGFja2V0ICpkNl9wa3QsIGludCBmZCkKK3sKKwlpbnQgYnl0ZXM7CisJc3RydWN0IGlwNl91ZHBfZDZfcGFja2V0IHBhY2tldDsKKworCWJ5dGVzID0gc2FmZV9yZWFkKGZkLCAmcGFja2V0LCBzaXplb2YocGFja2V0KSk7CisJaWYgKGJ5dGVzIDwgMCkgeworCQlsb2cxKCJQYWNrZXQgcmVhZCBlcnJvciwgaWdub3JpbmciKTsKKwkJLyogTkI6IHBvc3NpYmxlIGRvd24gaW50ZXJmYWNlLCBldGMuIENhbGxlciBzaG91bGQgcGF1c2UuICovCisJCXJldHVybiBieXRlczsgLyogcmV0dXJucyAtMSAqLworCX0KKworCWlmIChieXRlcyA8IChpbnQpIChzaXplb2YocGFja2V0LmlwNikgKyBzaXplb2YocGFja2V0LnVkcCkpKSB7CisJCWxvZzEoIlBhY2tldCBpcyB0b28gc2hvcnQsIGlnbm9yaW5nIik7CisJCXJldHVybiAtMjsKKwl9CisKKwlpZiAoYnl0ZXMgPCBzaXplb2YocGFja2V0LmlwNikgKyBudG9ocyhwYWNrZXQuaXA2LmlwNl9wbGVuKSkgeworCQkvKiBwYWNrZXQgaXMgYmlnZ2VyIHRoYW4gc2l6ZW9mKHBhY2tldCksIHdlIGRpZCBwYXJ0aWFsIHJlYWQgKi8KKwkJbG9nMSgiT3ZlcnNpemVkIHBhY2tldCwgaWdub3JpbmciKTsKKwkJcmV0dXJuIC0yOworCX0KKworCS8qIGlnbm9yZSBhbnkgZXh0cmEgZ2FyYmFnZSBieXRlcyAqLworCWJ5dGVzID0gc2l6ZW9mKHBhY2tldC5pcDYpICsgbnRvaHMocGFja2V0LmlwNi5pcDZfcGxlbik7CisKKwkvKiBtYWtlIHN1cmUgaXRzIHRoZSByaWdodCBwYWNrZXQgZm9yIHVzLCBhbmQgdGhhdCBpdCBwYXNzZXMgc2FuaXR5IGNoZWNrcyAqLworCWlmIChwYWNrZXQuaXA2LmlwNl9ueHQgIT0gSVBQUk9UT19VRFAKKwkgfHwgKHBhY2tldC5pcDYuaXA2X3ZmYyA+PiA0KSAhPSA2CisJIHx8IHBhY2tldC51ZHAuZGVzdCAhPSBodG9ucyhDTElFTlRfUE9SVDYpCisJLyogfHwgYnl0ZXMgPiAoaW50KSBzaXplb2YocGFja2V0KSAtIGNhbid0IGhhcHBlbiAqLworCSB8fCBwYWNrZXQudWRwLmxlbiAhPSBwYWNrZXQuaXA2LmlwNl9wbGVuCisJKSB7CisJCWxvZzEoIlVucmVsYXRlZC9ib2d1cyBwYWNrZXQsIGlnbm9yaW5nIik7CisJCXJldHVybiAtMjsKKwl9CisKKy8vSG93IHRvIGRvIHRoaXMgZm9yIGlwdjY/CisvLwkvKiB2ZXJpZnkgVURQIGNoZWNrc3VtLiBJUCBoZWFkZXIgaGFzIHRvIGJlIG1vZGlmaWVkIGZvciB0aGlzICovCisvLwltZW1zZXQoJnBhY2tldC5pcCwgMCwgb2Zmc2V0b2Yoc3RydWN0IGlwaGRyLCBwcm90b2NvbCkpOworLy8JLyogaXAueHggZmllbGRzIHdoaWNoIGFyZSBub3QgbWVtc2V0OiBwcm90b2NvbCwgY2hlY2ssIHNhZGRyLCBkYWRkciAqLworLy8JcGFja2V0LmlwLnRvdF9sZW4gPSBwYWNrZXQudWRwLmxlbjsgLyogeWVzLCB0aGlzIGlzIG5lZWRlZCAqLworLy8JY2hlY2sgPSBwYWNrZXQudWRwLmNoZWNrOworLy8JcGFja2V0LnVkcC5jaGVjayA9IDA7CisvLwlpZiAoY2hlY2sgJiYgY2hlY2sgIT0gaW5ldF9ja3N1bSgodWludDE2X3QgKikmcGFja2V0LCBieXRlcykpIHsKKy8vCQlsb2cxKCJQYWNrZXQgd2l0aCBiYWQgVURQIGNoZWNrc3VtIHJlY2VpdmVkLCBpZ25vcmluZyIpOworLy8JCXJldHVybiAtMjsKKy8vCX0KKworCWxvZzEoIlJlY2VpdmVkIGEgcGFja2V0Iik7CisJZDZfZHVtcF9wYWNrZXQoJnBhY2tldC5kYXRhKTsKKworCWJ5dGVzIC09IHNpemVvZihwYWNrZXQuaXA2KSArIHNpemVvZihwYWNrZXQudWRwKTsKKwltZW1jcHkoZDZfcGt0LCAmcGFja2V0LmRhdGEsIGJ5dGVzKTsKKwlyZXR1cm4gYnl0ZXM7Cit9CisKKworLyoqKiBNYWluICoqKi8KKworc3RhdGljIGludCBzb2NrZmQgPSAtMTsKKworI2RlZmluZSBMSVNURU5fTk9ORSAgIDAKKyNkZWZpbmUgTElTVEVOX0tFUk5FTCAxCisjZGVmaW5lIExJU1RFTl9SQVcgICAgMgorc3RhdGljIHNtYWxsaW50IGxpc3Rlbl9tb2RlOworCisvKiBpbml0aWFsIHN0YXRlOiAocmUpc3RhcnQgREhDUCBuZWdvdGlhdGlvbiAqLworI2RlZmluZSBJTklUX1NFTEVDVElORyAgMAorLyogZGlzY292ZXIgd2FzIHNlbnQsIERIQ1BPRkZFUiByZXBseSByZWNlaXZlZCAqLworI2RlZmluZSBSRVFVRVNUSU5HICAgICAgMQorLyogc2VsZWN0L3JlbmV3IHdhcyBzZW50LCBESENQQUNLIHJlcGx5IHJlY2VpdmVkICovCisjZGVmaW5lIEJPVU5EICAgICAgICAgICAyCisvKiBoYWxmIG9mIGxlYXNlIHBhc3NlZCwgd2FudCB0byByZW5ldyBpdCBieSBzZW5kaW5nIHVuaWNhc3QgcmVuZXcgcmVxdWVzdHMgKi8KKyNkZWZpbmUgUkVORVdJTkcgICAgICAgIDMKKy8qIHJlbmV3IHJlcXVlc3RzIHdlcmUgbm90IGFuc3dlcmVkLCBsZWFzZSBpcyBhbG1vc3Qgb3Zlciwgc2VuZCBicm9hZGNhc3QgcmVuZXcgKi8KKyNkZWZpbmUgUkVCSU5ESU5HICAgICAgIDQKKy8qIG1hbnVhbGx5IHJlcXVlc3RlZCByZW5ldyAoU0lHVVNSMSkgKi8KKyNkZWZpbmUgUkVORVdfUkVRVUVTVEVEIDUKKy8qIHJlbGVhc2UsIHBvc3NpYmx5IG1hbnVhbGx5IHJlcXVlc3RlZCAoU0lHVVNSMikgKi8KKyNkZWZpbmUgUkVMRUFTRUQgICAgICAgIDYKK3N0YXRpYyBzbWFsbGludCBzdGF0ZTsKKworc3RhdGljIGludCBkNl9yYXdfc29ja2V0KGludCBpZmluZGV4KQoreworCWludCBmZDsKKwlzdHJ1Y3Qgc29ja2FkZHJfbGwgc29jazsKKworCS8qCisJICogQ29tbWVudDoKKwkgKgorCSAqCUkndmUgc2VsZWN0ZWQgbm90IHRvIHNlZSBMTCBoZWFkZXIsIHNvIEJQRiBkb2Vzbid0IHNlZSBpdCwgdG9vLgorCSAqCVRoZSBmaWx0ZXIgbWF5IGFsc28gcGFzcyBub24tSVAgYW5kIG5vbi1BUlAgcGFja2V0cywgYnV0IHdlIGRvCisJICoJYSBtb3JlIGNvbXBsZXRlIGNoZWNrIHdoZW4gcmVjZWl2aW5nIHRoZSBtZXNzYWdlIGluIHVzZXJzcGFjZS4KKwkgKgorCSAqIGFuZCBmaWx0ZXIgc2hhbWVsZXNzbHkgc3RvbGVuIGZyb206CisJICoKKwkgKglodHRwOi8vd3d3LmZsYW1ld2FybWFzdGVyLmRlL3NvZnR3YXJlL2RoY3BjbGllbnQvCisJICoKKwkgKiBUaGVyZSBhcmUgYSBmZXcgb3RoZXIgaW50ZXJlc3RpbmcgaWRlYXMgb24gdGhhdCBwYWdlIChsb29rIHVuZGVyCisJICogIk1vdGl2YXRpb24iKS4gIFVzZSBvZiBuZXRsaW5rIGV2ZW50cyBpcyBtb3N0IGludGVyZXN0aW5nLiAgVGhpbmsKKwkgKiBvZiB2YXJpb3VzIG5ldHdvcmsgc2VydmVycyBsaXN0ZW5pbmcgZm9yIGV2ZW50cyBhbmQgcmVjb25maWd1cmluZy4KKwkgKiBUaGF0IHdvdWxkIG9ic29sZXRlIHNlbmRpbmcgSFVQIHNpZ25hbHMgYW5kL29yIG1ha2UgdXNlIG9mIHJlc3RhcnRzLgorCSAqCisJICogQ29weXJpZ2h0OiAyMDA2LCAyMDA3IFN0ZWZhbiBSb21wZiA8c3V4QGxvcGxvZi5kZT4uCisJICogTGljZW5zZTogR1BMIHYyLgorCSAqCisJICogVE9ETzogbWFrZSBjb25kaXRpb25hbD8KKwkgKi8KKyNpZiAwCisJc3RhdGljIGNvbnN0IHN0cnVjdCBzb2NrX2ZpbHRlciBmaWx0ZXJfaW5zdHJbXSA9IHsKKwkJLyogbG9hZCA5dGggYnl0ZSAocHJvdG9jb2wpICovCisJCUJQRl9TVE1UKEJQRl9MRHxCUEZfQnxCUEZfQUJTLCA5KSwKKwkJLyoganVtcCB0byBMMSBpZiBpdCBpcyBJUFBST1RPX1VEUCwgZWxzZSB0byBMNCAqLworCQlCUEZfSlVNUChCUEZfSk1QfEJQRl9KRVF8QlBGX0ssIElQUFJPVE9fVURQLCAwLCA2KSwKKwkJLyogTDE6IGxvYWQgaGFsZndvcmQgZnJvbSBvZmZzZXQgNiAoZmxhZ3MgYW5kIGZyYWcgb2Zmc2V0KSAqLworCQlCUEZfU1RNVChCUEZfTER8QlBGX0h8QlBGX0FCUywgNiksCisJCS8qIGp1bXAgdG8gTDQgaWYgYW55IGJpdHMgaW4gZnJhZyBvZmZzZXQgZmllbGQgYXJlIHNldCwgZWxzZSB0byBMMiAqLworCQlCUEZfSlVNUChCUEZfSk1QfEJQRl9KU0VUfEJQRl9LLCAweDFmZmYsIDQsIDApLAorCQkvKiBMMjogc2tpcCBJUCBoZWFkZXIgKGxvYWQgaW5kZXggcmVnIHdpdGggaGVhZGVyIGxlbikgKi8KKwkJQlBGX1NUTVQoQlBGX0xEWHxCUEZfQnxCUEZfTVNILCAwKSwKKwkJLyogbG9hZCB1ZHAgZGVzdGluYXRpb24gcG9ydCBmcm9tIGhhbGZ3b3JkW2hlYWRlcl9sZW4gKyAyXSAqLworCQlCUEZfU1RNVChCUEZfTER8QlBGX0h8QlBGX0lORCwgMiksCisJCS8qIGp1bXAgdG8gTDMgaWYgdWRwIGRwb3J0IGlzIENMSUVOVF9QT1JUNiwgZWxzZSB0byBMNCAqLworCQlCUEZfSlVNUChCUEZfSk1QfEJQRl9KRVF8QlBGX0ssIDY4LCAwLCAxKSwKKwkJLyogTDM6IGFjY2VwdCBwYWNrZXQgKi8KKwkJQlBGX1NUTVQoQlBGX1JFVHxCUEZfSywgMHg3ZmZmZmZmZiksCisJCS8qIEw0OiBkaXNjYXJkIHBhY2tldCAqLworCQlCUEZfU1RNVChCUEZfUkVUfEJQRl9LLCAwKSwKKwl9OworCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29ja19mcHJvZyBmaWx0ZXJfcHJvZyA9IHsKKwkJLmxlbiA9IHNpemVvZihmaWx0ZXJfaW5zdHIpIC8gc2l6ZW9mKGZpbHRlcl9pbnN0clswXSksCisJCS8qIGNhc3RpbmcgY29uc3QgYXdheTogKi8KKwkJLmZpbHRlciA9IChzdHJ1Y3Qgc29ja19maWx0ZXIgKikgZmlsdGVyX2luc3RyLAorCX07CisjZW5kaWYKKworCWxvZzEoIk9wZW5pbmcgcmF3IHNvY2tldCBvbiBpZmluZGV4ICVkIiwgaWZpbmRleCk7IC8vbG9nMj8KKworCWZkID0geHNvY2tldChQRl9QQUNLRVQsIFNPQ0tfREdSQU0sIGh0b25zKEVUSF9QX0lQVjYpKTsKKwlsb2cxKCJHb3QgcmF3IHNvY2tldCBmZCAlZCIsIGZkKTsgLy9sb2cyPworCisJc29jay5zbGxfZmFtaWx5ID0gQUZfUEFDS0VUOworCXNvY2suc2xsX3Byb3RvY29sID0gaHRvbnMoRVRIX1BfSVBWNik7CisJc29jay5zbGxfaWZpbmRleCA9IGlmaW5kZXg7CisJeGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNvY2ssIHNpemVvZihzb2NrKSk7CisKKyNpZiAwCisJaWYgKENMSUVOVF9QT1JUNiA9PSA1NDYpIHsKKwkJLyogVXNlIG9ubHkgaWYgc3RhbmRhcmQgcG9ydCBpcyBpbiB1c2UgKi8KKwkJLyogSWdub3JpbmcgZXJyb3IgKGtlcm5lbCBtYXkgbGFjayBzdXBwb3J0IGZvciB0aGlzKSAqLworCQlpZiAoc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fQVRUQUNIX0ZJTFRFUiwgJmZpbHRlcl9wcm9nLAorCQkJCXNpemVvZihmaWx0ZXJfcHJvZykpID49IDApCisJCQlsb2cxKCJBdHRhY2hlZCBmaWx0ZXIgdG8gcmF3IHNvY2tldCBmZCAlZCIsIGZkKTsgLy8gbG9nPworCX0KKyNlbmRpZgorCisJbG9nMSgiQ3JlYXRlZCByYXcgc29ja2V0Iik7CisKKwlyZXR1cm4gZmQ7Cit9CisKK3N0YXRpYyB2b2lkIGNoYW5nZV9saXN0ZW5fbW9kZShpbnQgbmV3X21vZGUpCit7CisJbG9nMSgiRW50ZXJpbmcgbGlzdGVuIG1vZGU6ICVzIiwKKwkJbmV3X21vZGUgIT0gTElTVEVOX05PTkUKKwkJCT8gKG5ld19tb2RlID09IExJU1RFTl9LRVJORUwgPyAia2VybmVsIiA6ICJyYXciKQorCQkJOiAibm9uZSIKKwkpOworCisJbGlzdGVuX21vZGUgPSBuZXdfbW9kZTsKKwlpZiAoc29ja2ZkID49IDApIHsKKwkJY2xvc2Uoc29ja2ZkKTsKKwkJc29ja2ZkID0gLTE7CisJfQorCWlmIChuZXdfbW9kZSA9PSBMSVNURU5fS0VSTkVMKQorCQlzb2NrZmQgPSB1ZGhjcF9saXN0ZW5fc29ja2V0KC8qSU5BRERSX0FOWSwqLyBDTElFTlRfUE9SVDYsIGNsaWVudF9jb25maWcuaW50ZXJmYWNlKTsKKwllbHNlIGlmIChuZXdfbW9kZSAhPSBMSVNURU5fTk9ORSkKKwkJc29ja2ZkID0gZDZfcmF3X3NvY2tldChjbGllbnRfY29uZmlnLmlmaW5kZXgpOworCS8qIGVsc2UgTElTVEVOX05PTkU6IHNvY2tmZCBzdGF5cyBjbG9zZWQgKi8KK30KKworLyogQ2FsbGVkIG9ubHkgb24gU0lHVVNSMSAqLworc3RhdGljIHZvaWQgcGVyZm9ybV9yZW5ldyh2b2lkKQoreworCWJiX2luZm9fbXNnKCJQZXJmb3JtaW5nIGEgREhDUCByZW5ldyIpOworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIEJPVU5EOgorCQljaGFuZ2VfbGlzdGVuX21vZGUoTElTVEVOX0tFUk5FTCk7CisJY2FzZSBSRU5FV0lORzoKKwljYXNlIFJFQklORElORzoKKwkJc3RhdGUgPSBSRU5FV19SRVFVRVNURUQ7CisJCWJyZWFrOworCWNhc2UgUkVORVdfUkVRVUVTVEVEOiAvKiBpbXBhdGllbnQgYXJlIHdlPyBmaW5lLCBzcXVhcmUgMSAqLworCQlkNl9ydW5fc2NyaXB0KE5VTEwsICJkZWNvbmZpZyIpOworCWNhc2UgUkVRVUVTVElORzoKKwljYXNlIFJFTEVBU0VEOgorCQljaGFuZ2VfbGlzdGVuX21vZGUoTElTVEVOX1JBVyk7CisJCXN0YXRlID0gSU5JVF9TRUxFQ1RJTkc7CisJCWJyZWFrOworCWNhc2UgSU5JVF9TRUxFQ1RJTkc6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgcGVyZm9ybV9kNl9yZWxlYXNlKHN0cnVjdCBpbjZfYWRkciAqc2VydmVyX2lwdjYsIHN0cnVjdCBpbjZfYWRkciAqb3VyX2N1cl9pcHY2KQoreworCS8qIHNlbmQgcmVsZWFzZSBwYWNrZXQgKi8KKwlpZiAoc3RhdGUgPT0gQk9VTkQgfHwgc3RhdGUgPT0gUkVORVdJTkcgfHwgc3RhdGUgPT0gUkVCSU5ESU5HKSB7CisJCWJiX2luZm9fbXNnKCJVbmljYXN0aW5nIGEgcmVsZWFzZSIpOworCQlzZW5kX2Q2X3JlbGVhc2Uoc2VydmVyX2lwdjYsIG91cl9jdXJfaXB2Nik7IC8qIHVuaWNhc3QgKi8KKwkJZDZfcnVuX3NjcmlwdChOVUxMLCAiZGVjb25maWciKTsKKwl9CisJYmJfaW5mb19tc2coIkVudGVyaW5nIHJlbGVhc2VkIHN0YXRlIik7CisKKwljaGFuZ2VfbGlzdGVuX21vZGUoTElTVEVOX05PTkUpOworCXN0YXRlID0gUkVMRUFTRUQ7Cit9CisKKy8vL3N0YXRpYyB1aW50OF90KiBhbGxvY19kaGNwX29wdGlvbihpbnQgY29kZSwgY29uc3QgY2hhciAqc3RyLCBpbnQgZXh0cmEpCisvLy97CisvLy8JdWludDhfdCAqc3RvcmFnZTsKKy8vLwlpbnQgbGVuID0gc3RybmxlbihzdHIsIDI1NSk7CisvLy8Jc3RvcmFnZSA9IHh6YWxsb2MobGVuICsgZXh0cmEgKyBPUFRfREFUQSk7CisvLy8Jc3RvcmFnZVtPUFRfQ09ERV0gPSBjb2RlOworLy8vCXN0b3JhZ2VbT1BUX0xFTl0gPSBsZW4gKyBleHRyYTsKKy8vLwltZW1jcHkoc3RvcmFnZSArIGV4dHJhICsgT1BUX0RBVEEsIHN0ciwgbGVuKTsKKy8vLwlyZXR1cm4gc3RvcmFnZTsKKy8vL30KKworI2lmIEJCX01NVQorc3RhdGljIHZvaWQgY2xpZW50X2JhY2tncm91bmQodm9pZCkKK3sKKwliYl9kYWVtb25pemUoMCk7CisJbG9nbW9kZSAmPSB+TE9HTU9ERV9TVERJTzsKKwkvKiByZXdyaXRlIHBpZGZpbGUsIGFzIG91ciBwaWQgaXMgZGlmZmVyZW50IG5vdyAqLworCXdyaXRlX3BpZGZpbGUoY2xpZW50X2NvbmZpZy5waWRmaWxlKTsKK30KKyNlbmRpZgorCisvL3VzYWdlOiNpZiBkZWZpbmVkIENPTkZJR19VREhDUF9ERUJVRyAmJiBDT05GSUdfVURIQ1BfREVCVUcgPj0gMQorLy91c2FnZTojIGRlZmluZSBJRl9VREhDUF9WRVJCT1NFKC4uLikgX19WQV9BUkdTX18KKy8vdXNhZ2U6I2Vsc2UKKy8vdXNhZ2U6IyBkZWZpbmUgSUZfVURIQ1BfVkVSQk9TRSguLi4pCisvL3VzYWdlOiNlbmRpZgorLy91c2FnZTojZGVmaW5lIHVkaGNwYzZfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZmJucSJJRl9VREhDUF9WRVJCT1NFKCJ2Iikib1JdIFstaSBJRkFDRV0gWy1yIElQXSBbLXMgUFJPR10gWy1wIFBJREZJTEVdXG4iCisvL3VzYWdlOiAgICAgICAiCVsteCBPUFQ6VkFMXS4uLiBbLU8gT1BUXS4uLiIgSUZfRkVBVFVSRV9VREhDUF9QT1JUKCIgWy1QIE5dIikKKy8vdXNhZ2U6I2RlZmluZSB1ZGhjcGM2X2Z1bGxfdXNhZ2UgIlxuIgorLy91c2FnZToJSUZfTE9OR19PUFRTKAorLy91c2FnZTogICAgICJcbgktaSwtLWludGVyZmFjZSBJRkFDRQlJbnRlcmZhY2UgdG8gdXNlIChkZWZhdWx0IGV0aDApIgorLy91c2FnZTogICAgICJcbgktcCwtLXBpZGZpbGUgRklMRQlDcmVhdGUgcGlkZmlsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMsLS1zY3JpcHQgUFJPRwlSdW4gUFJPRyBhdCBESENQIGV2ZW50cyAoZGVmYXVsdCAiQ09ORklHX1VESENQQ19ERUZBVUxUX1NDUklQVCIpIgorLy91c2FnZTogICAgICJcbgktQiwtLWJyb2FkY2FzdAkJUmVxdWVzdCBicm9hZGNhc3QgcmVwbGllcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXQsLS1yZXRyaWVzIE4JCVNlbmQgdXAgdG8gTiBkaXNjb3ZlciBwYWNrZXRzIgorLy91c2FnZTogICAgICJcbgktVCwtLXRpbWVvdXQgTgkJUGF1c2UgYmV0d2VlbiBwYWNrZXRzIChkZWZhdWx0IDMgc2Vjb25kcykiCisvL3VzYWdlOiAgICAgIlxuCS1BLC0tdHJ5YWdhaW4gTgkJV2FpdCBOIHNlY29uZHMgYWZ0ZXIgZmFpbHVyZSAoZGVmYXVsdCAyMCkiCisvL3VzYWdlOiAgICAgIlxuCS1mLC0tZm9yZWdyb3VuZAkJUnVuIGluIGZvcmVncm91bmQiCisvL3VzYWdlOglVU0VfRk9SX01NVSgKKy8vdXNhZ2U6ICAgICAiXG4JLWIsLS1iYWNrZ3JvdW5kCQlCYWNrZ3JvdW5kIGlmIGxlYXNlIGlzIG5vdCBvYnRhaW5lZCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLW4sLS1ub3cJCUV4aXQgaWYgbGVhc2UgaXMgbm90IG9idGFpbmVkIgorLy91c2FnZTogICAgICJcbgktcSwtLXF1aXQJCUV4aXQgYWZ0ZXIgb2J0YWluaW5nIGxlYXNlIgorLy91c2FnZTogICAgICJcbgktUiwtLXJlbGVhc2UJCVJlbGVhc2UgSVAgb24gZXhpdCIKKy8vdXNhZ2U6ICAgICAiXG4JLVMsLS1zeXNsb2cJCUxvZyB0byBzeXNsb2cgdG9vIgorLy91c2FnZToJSUZfRkVBVFVSRV9VREhDUF9QT1JUKAorLy91c2FnZTogICAgICJcbgktUCwtLWNsaWVudC1wb3J0IE4JVXNlIHBvcnQgTiAoZGVmYXVsdCA1NDYpIgorLy91c2FnZToJKQorLy8vL3VzYWdlOglJRl9GRUFUVVJFX1VESENQQ19BUlBJTkcoCisvLy8vdXNhZ2U6ICAgICAiXG4JLWEsLS1hcnBpbmcJCVVzZSBhcnBpbmcgdG8gdmFsaWRhdGUgb2ZmZXJlZCBhZGRyZXNzIgorLy8vL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1PLC0tcmVxdWVzdC1vcHRpb24gT1BUCVJlcXVlc3Qgb3B0aW9uIE9QVCBmcm9tIHNlcnZlciAoY3VtdWxhdGl2ZSkiCisvL3VzYWdlOiAgICAgIlxuCS1vLC0tbm8tZGVmYXVsdC1vcHRpb25zCURvbid0IHJlcXVlc3QgYW55IG9wdGlvbnMgKHVubGVzcyAtTyBpcyBnaXZlbikiCisvL3VzYWdlOiAgICAgIlxuCS1yLC0tcmVxdWVzdCBJUAkJUmVxdWVzdCB0aGlzIElQIGFkZHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCS14IE9QVDpWQUwJCUluY2x1ZGUgb3B0aW9uIE9QVCBpbiBzZW50IHBhY2tldHMgKGN1bXVsYXRpdmUpIgorLy91c2FnZTogICAgICJcbgkJCQlFeGFtcGxlcyBvZiBzdHJpbmcsIG51bWVyaWMsIGFuZCBoZXggYnl0ZSBvcHRzOiIKKy8vdXNhZ2U6ICAgICAiXG4JCQkJLXggaG9zdG5hbWU6YmJveCAtIG9wdGlvbiAxMiIKKy8vdXNhZ2U6ICAgICAiXG4JCQkJLXggbGVhc2U6MzYwMCAtIG9wdGlvbiA1MSAobGVhc2UgdGltZSkiCisvL3VzYWdlOiAgICAgIlxuCQkJCS14IDB4M2Q6MDEwMEJFRUZDMEZGRUUgLSBvcHRpb24gNjEgKGNsaWVudCBpZCkiCisvL3VzYWdlOglJRl9VREhDUF9WRVJCT1NFKAorLy91c2FnZTogICAgICJcbgktdgkJCVZlcmJvc2UiCisvL3VzYWdlOgkpCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9OT1RfTE9OR19PUFRTKAorLy91c2FnZTogICAgICJcbgktaSBJRkFDRQlJbnRlcmZhY2UgdG8gdXNlIChkZWZhdWx0IGV0aDApIgorLy91c2FnZTogICAgICJcbgktcCBGSUxFCQlDcmVhdGUgcGlkZmlsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgUFJPRwkJUnVuIFBST0cgYXQgREhDUCBldmVudHMgKGRlZmF1bHQgIkNPTkZJR19VREhDUENfREVGQVVMVF9TQ1JJUFQiKSIKKy8vdXNhZ2U6ICAgICAiXG4JLUIJCVJlcXVlc3QgYnJvYWRjYXN0IHJlcGxpZXMiCisvL3VzYWdlOiAgICAgIlxuCS10IE4JCVNlbmQgdXAgdG8gTiBkaXNjb3ZlciBwYWNrZXRzIgorLy91c2FnZTogICAgICJcbgktVCBOCQlQYXVzZSBiZXR3ZWVuIHBhY2tldHMgKGRlZmF1bHQgMyBzZWNvbmRzKSIKKy8vdXNhZ2U6ICAgICAiXG4JLUEgTgkJV2FpdCBOIHNlY29uZHMgKGRlZmF1bHQgMjApIGFmdGVyIGZhaWx1cmUiCisvL3VzYWdlOiAgICAgIlxuCS1mCQlSdW4gaW4gZm9yZWdyb3VuZCIKKy8vdXNhZ2U6CVVTRV9GT1JfTU1VKAorLy91c2FnZTogICAgICJcbgktYgkJQmFja2dyb3VuZCBpZiBsZWFzZSBpcyBub3Qgb2J0YWluZWQiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1uCQlFeGl0IGlmIGxlYXNlIGlzIG5vdCBvYnRhaW5lZCIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJCUV4aXQgYWZ0ZXIgb2J0YWluaW5nIGxlYXNlIgorLy91c2FnZTogICAgICJcbgktUgkJUmVsZWFzZSBJUCBvbiBleGl0IgorLy91c2FnZTogICAgICJcbgktUwkJTG9nIHRvIHN5c2xvZyB0b28iCisvL3VzYWdlOglJRl9GRUFUVVJFX1VESENQX1BPUlQoCisvL3VzYWdlOiAgICAgIlxuCS1QIE4JCVVzZSBwb3J0IE4gKGRlZmF1bHQgNTQ2KSIKKy8vdXNhZ2U6CSkKKy8vLy91c2FnZToJSUZfRkVBVFVSRV9VREhDUENfQVJQSU5HKAorLy8vL3VzYWdlOiAgICAgIlxuCS1hCQlVc2UgYXJwaW5nIHRvIHZhbGlkYXRlIG9mZmVyZWQgYWRkcmVzcyIKKy8vLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktTyBPUFQJCVJlcXVlc3Qgb3B0aW9uIE9QVCBmcm9tIHNlcnZlciAoY3VtdWxhdGl2ZSkiCisvL3VzYWdlOiAgICAgIlxuCS1vCQlEb24ndCByZXF1ZXN0IGFueSBvcHRpb25zICh1bmxlc3MgLU8gaXMgZ2l2ZW4pIgorLy91c2FnZTogICAgICJcbgktciBJUAkJUmVxdWVzdCB0aGlzIElQIGFkZHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCS14IE9QVDpWQUwJSW5jbHVkZSBvcHRpb24gT1BUIGluIHNlbnQgcGFja2V0cyAoY3VtdWxhdGl2ZSkiCisvL3VzYWdlOiAgICAgIlxuCQkJRXhhbXBsZXMgb2Ygc3RyaW5nLCBudW1lcmljLCBhbmQgaGV4IGJ5dGUgb3B0czoiCisvL3VzYWdlOiAgICAgIlxuCQkJLXggaG9zdG5hbWU6YmJveCAtIG9wdGlvbiAxMiIKKy8vdXNhZ2U6ICAgICAiXG4JCQkteCBsZWFzZTozNjAwIC0gb3B0aW9uIDUxIChsZWFzZSB0aW1lKSIKKy8vdXNhZ2U6ICAgICAiXG4JCQkteCAweDNkOjAxMDBCRUVGQzBGRkVFIC0gb3B0aW9uIDYxIChjbGllbnQgaWQpIgorLy91c2FnZToJSUZfVURIQ1BfVkVSQk9TRSgKKy8vdXNhZ2U6ICAgICAiXG4JLXYJCVZlcmJvc2UiCisvL3VzYWdlOgkpCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuU2lnbmFsczoiCisvL3VzYWdlOiAgICAgIlxuCVVTUjEJUmVuZXcgbGVhc2UiCisvL3VzYWdlOiAgICAgIlxuCVVTUjIJUmVsZWFzZSBsZWFzZSIKKworCitpbnQgdWRoY3BjNl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdWRoY3BjNl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqc3RyX3I7CisJSUZfRkVBVFVSRV9VREhDUF9QT1JUKGNoYXIgKnN0cl9QOykKKwl2b2lkICpjbGllbnRpZF9tYWNfcHRyOworCWxsaXN0X3QgKmxpc3RfTyA9IE5VTEw7CisJbGxpc3RfdCAqbGlzdF94ID0gTlVMTDsKKwlpbnQgdHJ5YWdhaW5fdGltZW91dCA9IDIwOworCWludCBkaXNjb3Zlcl90aW1lb3V0ID0gMzsKKwlpbnQgZGlzY292ZXJfcmV0cmllcyA9IDM7CisJc3RydWN0IGluNl9hZGRyIHNydjZfYnVmOworCXN0cnVjdCBpbjZfYWRkciBpcHY2X2J1ZjsKKwlzdHJ1Y3QgaW42X2FkZHIgKnJlcXVlc3RlZF9pcHY2OworCXVpbnQzMl90IHhpZCA9IDA7CisJaW50IHBhY2tldF9udW07CisJaW50IHRpbWVvdXQ7IC8qIG11c3QgYmUgc2lnbmVkICovCisJdW5zaWduZWQgYWxyZWFkeV93YWl0ZWRfc2VjOworCXVuc2lnbmVkIG9wdDsKKwlpbnQgbWF4X2ZkOworCWludCByZXR2YWw7CisJZmRfc2V0IHJmZHM7CisKKwkvKiBEZWZhdWx0IG9wdGlvbnMgKi8KKwlJRl9GRUFUVVJFX1VESENQX1BPUlQoU0VSVkVSX1BPUlQ2ID0gNTQ3OykKKwlJRl9GRUFUVVJFX1VESENQX1BPUlQoQ0xJRU5UX1BPUlQ2ID0gNTQ2OykKKwljbGllbnRfY29uZmlnLmludGVyZmFjZSA9ICJldGgwIjsKKwljbGllbnRfY29uZmlnLnNjcmlwdCA9IENPTkZJR19VREhDUENfREVGQVVMVF9TQ1JJUFQ7CisKKwkvKiBQYXJzZSBjb21tYW5kIGxpbmUgKi8KKwkvKiBPLHg6IGxpc3Q7IC1ULC10LC1BIHRha2UgbnVtZXJpYyBwYXJhbSAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIk86Ong6OlQrOnQrOkErIiBJRl9VREhDUF9WRVJCT1NFKCI6dnYiKSA7CisJSUZfTE9OR19PUFRTKGFwcGxldF9sb25nX29wdGlvbnMgPSB1ZGhjcGM2X2xvbmdvcHRzOykKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiaTpucDpxUnI6czpUOnQ6U0E6TzpveDpmIgorCQlVU0VfRk9SX01NVSgiYiIpCisJCS8vL0lGX0ZFQVRVUkVfVURIQ1BDX0FSUElORygiYSIpCisJCUlGX0ZFQVRVUkVfVURIQ1BfUE9SVCgiUDoiKQorCQkidiIKKwkJLCAmY2xpZW50X2NvbmZpZy5pbnRlcmZhY2UsICZjbGllbnRfY29uZmlnLnBpZGZpbGUsICZzdHJfciAvKiBpLHAgKi8KKwkJLCAmY2xpZW50X2NvbmZpZy5zY3JpcHQgLyogcyAqLworCQksICZkaXNjb3Zlcl90aW1lb3V0LCAmZGlzY292ZXJfcmV0cmllcywgJnRyeWFnYWluX3RpbWVvdXQgLyogVCx0LEEgKi8KKwkJLCAmbGlzdF9PCisJCSwgJmxpc3RfeAorCQlJRl9GRUFUVVJFX1VESENQX1BPUlQoLCAmc3RyX1ApCisJCUlGX1VESENQX1ZFUkJPU0UoLCAmZGhjcF92ZXJib3NlKQorCSk7CisJcmVxdWVzdGVkX2lwdjYgPSBOVUxMOworCWlmIChvcHQgJiBPUFRfcikgeworCQlpZiAoaW5ldF9wdG9uKEFGX0lORVQ2LCBzdHJfciwgJmlwdjZfYnVmKSA8PSAwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBJUHY2IGFkZHJlc3MgJyVzJyIsIHN0cl9yKTsKKwkJcmVxdWVzdGVkX2lwdjYgPSAmaXB2Nl9idWY7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQX1BPUlQKKwlpZiAob3B0ICYgT1BUX1ApIHsKKwkJQ0xJRU5UX1BPUlQ2ID0geGF0b3UxNihzdHJfUCk7CisJCVNFUlZFUl9QT1JUNiA9IENMSUVOVF9QT1JUNiArIDE7CisJfQorI2VuZGlmCisJd2hpbGUgKGxpc3RfTykgeworCQljaGFyICpvcHRzdHIgPSBsbGlzdF9wb3AoJmxpc3RfTyk7CisJCXVuc2lnbmVkIG4gPSBiYl9zdHJ0b3Uob3B0c3RyLCBOVUxMLCAwKTsKKwkJaWYgKGVycm5vIHx8IG4gPiAyNTQpIHsKKwkJCW4gPSB1ZGhjcF9vcHRpb25faWR4KG9wdHN0cik7CisJCQluID0gZGhjcF9vcHRmbGFnc1tuXS5jb2RlOworCQl9CisJCWNsaWVudF9jb25maWcub3B0X21hc2tbbiA+PiAzXSB8PSAxIDw8IChuICYgNyk7CisJfQorCWlmICghKG9wdCAmIE9QVF9vKSkgeworCQkvKgorCQl1bnNpZ25lZCBpLCBuOworCQlmb3IgKGkgPSAwOyAobiA9IGRoY3Bfb3B0ZmxhZ3NbaV0uY29kZSkgIT0gMDsgaSsrKSB7CisJCQlpZiAoZGhjcF9vcHRmbGFnc1tpXS5mbGFncyAmIE9QVElPTl9SRVEpIHsKKwkJCQljbGllbnRfY29uZmlnLm9wdF9tYXNrW24gPj4gM10gfD0gMSA8PCAobiAmIDcpOworCQkJfQorCQl9CisJCSovCisJfQorCXdoaWxlIChsaXN0X3gpIHsKKwkJY2hhciAqb3B0c3RyID0gbGxpc3RfcG9wKCZsaXN0X3gpOworCQljaGFyICpjb2xvbiA9IHN0cmNocihvcHRzdHIsICc6Jyk7CisJCWlmIChjb2xvbikKKwkJCSpjb2xvbiA9ICcgJzsKKwkJLyogbm93IGl0IGxvb2tzIHNpbWlsYXIgdG8gdWRoY3BkJ3MgY29uZmlnIGZpbGUgbGluZToKKwkJICogIm9wdG5hbWUgb3B0dmFsIiwgdXNpbmcgdGhlIGNvbW1vbiByb3V0aW5lOiAqLworCQl1ZGhjcF9zdHIyb3B0c2V0KG9wdHN0ciwgJmNsaWVudF9jb25maWcub3B0aW9ucyk7CisJfQorCisJaWYgKHVkaGNwX3JlYWRfaW50ZXJmYWNlKGNsaWVudF9jb25maWcuaW50ZXJmYWNlLAorCQkJJmNsaWVudF9jb25maWcuaWZpbmRleCwKKwkJCU5VTEwsCisJCQljbGllbnRfY29uZmlnLmNsaWVudF9tYWMpCisJKSB7CisJCXJldHVybiAxOworCX0KKworCS8qIENyZWF0ZSBjbGllbnQgSUQgYmFzZWQgb24gbWFjLCBzZXQgY2xpZW50aWRfbWFjX3B0ciAqLworCXsKKwkJc3RydWN0IGQ2X29wdGlvbiAqY2xpZW50aWQ7CisJCWNsaWVudGlkID0geHphbGxvYygyKzIrMisyKzYpOworCQljbGllbnRpZC0+Y29kZSA9IEQ2X09QVF9DTElFTlRJRDsKKwkJY2xpZW50aWQtPmxlbiA9IDIrMis2OworCQljbGllbnRpZC0+ZGF0YVsxXSA9IDM7IC8qIERVSUQtTEwgKi8KKwkJY2xpZW50aWQtPmRhdGFbM10gPSAxOyAvKiBldGhlcm5ldCAqLworCQljbGllbnRpZF9tYWNfcHRyID0gY2xpZW50aWQtPmRhdGEgKyAyKzI7CisJCW1lbWNweShjbGllbnRpZF9tYWNfcHRyLCBjbGllbnRfY29uZmlnLmNsaWVudF9tYWMsIDYpOworCQljbGllbnRfY29uZmlnLmNsaWVudGlkID0gKHZvaWQqKWNsaWVudGlkOworCX0KKworI2lmICFCQl9NTVUKKwkvKiBvbiBOT01NVSByZWV4ZWMgKGkuZS4sIGJhY2tncm91bmQpIGVhcmx5ICovCisJaWYgKCEob3B0ICYgT1BUX2YpKSB7CisJCWJiX2RhZW1vbml6ZV9vcl9yZXhlYygwIC8qIGZsYWdzICovLCBhcmd2KTsKKwkJbG9nbW9kZSA9IExPR01PREVfTk9ORTsKKwl9CisjZW5kaWYKKwlpZiAob3B0ICYgT1BUX1MpIHsKKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgTE9HX1BJRCwgTE9HX0RBRU1PTik7CisJCWxvZ21vZGUgfD0gTE9HTU9ERV9TWVNMT0c7CisJfQorCisJLyogTWFrZSBzdXJlIGZkIDAsMSwyIGFyZSBvcGVuICovCisJYmJfc2FuaXRpemVfc3RkaW8oKTsKKwkvKiBFcXVpdmFsZW50IG9mIGRvaW5nIGEgZmZsdXNoIGFmdGVyIGV2ZXJ5IFxuICovCisJc2V0bGluZWJ1ZihzdGRvdXQpOworCS8qIENyZWF0ZSBwaWRmaWxlICovCisJd3JpdGVfcGlkZmlsZShjbGllbnRfY29uZmlnLnBpZGZpbGUpOworCS8qIEdvZXMgdG8gc3Rkb3V0ICh1bmxlc3MgTk9NTVUpIGFuZCBwb3NzaWJseSBzeXNsb2cgKi8KKwliYl9pbmZvX21zZygiJXMgKHYiQkJfVkVSIikgc3RhcnRlZCIsIGFwcGxldF9uYW1lKTsKKwkvKiBTZXQgdXAgdGhlIHNpZ25hbCBwaXBlICovCisJdWRoY3Bfc3Bfc2V0dXAoKTsKKwkvKiBXZSB3YW50IHJhbmRvbV94aWQgdG8gYmUgcmFuZG9tLi4uICovCisJc3JhbmQobW9ub3RvbmljX3VzKCkpOworCisJc3RhdGUgPSBJTklUX1NFTEVDVElORzsKKwlkNl9ydW5fc2NyaXB0KE5VTEwsICJkZWNvbmZpZyIpOworCWNoYW5nZV9saXN0ZW5fbW9kZShMSVNURU5fUkFXKTsKKwlwYWNrZXRfbnVtID0gMDsKKwl0aW1lb3V0ID0gMDsKKwlhbHJlYWR5X3dhaXRlZF9zZWMgPSAwOworCisJLyogTWFpbiBldmVudCBsb29wLiBzZWxlY3QoKSB3YWl0cyBvbiBzaWduYWwgcGlwZSBhbmQgcG9zc2libHkKKwkgKiBvbiBzb2NrZmQuCisJICogImNvbnRpbnVlIiBzdGF0ZW1lbnRzIGluIGNvZGUgYmVsb3cganVtcCB0byB0aGUgdG9wIG9mIHRoZSBsb29wLgorCSAqLworCWZvciAoOzspIHsKKwkJc3RydWN0IHRpbWV2YWwgdHY7CisJCXN0cnVjdCBkNl9wYWNrZXQgcGFja2V0OworCQl1aW50OF90ICpwYWNrZXRfZW5kOworCQkvKiBzaWxlbmNlICJ1bmluaXRpYWxpemVkISIgd2FybmluZyAqLworCQl1bnNpZ25lZCB0aW1lc3RhbXBfYmVmb3JlX3dhaXQgPSB0aW1lc3RhbXBfYmVmb3JlX3dhaXQ7CisKKwkJLy9iYl9lcnJvcl9tc2coInNvY2tmZDolZCwgbGlzdGVuX21vZGU6JWQiLCBzb2NrZmQsIGxpc3Rlbl9tb2RlKTsKKworCQkvKiBXYXMgb3BlbmluZyByYXcgb3IgdWRwIHNvY2tldCBoZXJlCisJCSAqIGlmIChsaXN0ZW5fbW9kZSAhPSBMSVNURU5fTk9ORSAmJiBzb2NrZmQgPCAwKSwKKwkJICogYnV0IG9uIGZhc3QgbmV0d29yayByZW5ldyByZXNwb25zZXMgcmV0dXJuIGZhc3RlcgorCQkgKiB0aGFuIHdlIG9wZW4gc29ja2V0cy4gVGh1cyB0aGlzIGNvZGUgaXMgbW92ZWQKKwkJICogdG8gY2hhbmdlX2xpc3Rlbl9tb2RlKCkuIFRodXMgd2Ugb3BlbiBsaXN0ZW4gc29ja2V0CisJCSAqIEJFRk9SRSB3ZSBzZW5kIHJlbmV3IHJlcXVlc3QgKHNlZSAiY2FzZSBCT1VORDoiKS4gKi8KKworCQltYXhfZmQgPSB1ZGhjcF9zcF9mZF9zZXQoJnJmZHMsIHNvY2tmZCk7CisKKwkJdHYudHZfc2VjID0gdGltZW91dCAtIGFscmVhZHlfd2FpdGVkX3NlYzsKKwkJdHYudHZfdXNlYyA9IDA7CisJCXJldHZhbCA9IDA7CisJCS8qIElmIHdlIGFscmVhZHkgdGltZWQgb3V0LCBmYWxsIHRocm91Z2ggd2l0aCByZXR2YWwgPSAwLCBlbHNlLi4uICovCisJCWlmICgoaW50KXR2LnR2X3NlYyA+IDApIHsKKwkJCWxvZzEoIldhaXRpbmcgb24gc2VsZWN0ICV1IHNlY29uZHMiLCAoaW50KXR2LnR2X3NlYyk7CisJCQl0aW1lc3RhbXBfYmVmb3JlX3dhaXQgPSAodW5zaWduZWQpbW9ub3RvbmljX3NlYygpOworCQkJcmV0dmFsID0gc2VsZWN0KG1heF9mZCArIDEsICZyZmRzLCBOVUxMLCBOVUxMLCAmdHYpOworCQkJaWYgKHJldHZhbCA8IDApIHsKKwkJCQkvKiBFSU5UUj8gQSBzaWduYWwgd2FzIGNhdWdodCwgZG9uJ3QgcGFuaWMgKi8KKwkJCQlpZiAoZXJybm8gPT0gRUlOVFIpIHsKKwkJCQkJYWxyZWFkeV93YWl0ZWRfc2VjICs9ICh1bnNpZ25lZCltb25vdG9uaWNfc2VjKCkgLSB0aW1lc3RhbXBfYmVmb3JlX3dhaXQ7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvKiBFbHNlOiBhbiBlcnJvciBvY2N1cmVkLCBwYW5pYyEgKi8KKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNlbGVjdCIpOworCQkJfQorCQl9CisKKwkJLyogSWYgdGltZW91dCBkcm9wcGVkIHRvIHplcm8sIHRpbWUgdG8gYmVjb21lIGFjdGl2ZToKKwkJICogcmVzZW5kIGRpc2NvdmVyL3JlbmV3L3doYXRldmVyCisJCSAqLworCQlpZiAocmV0dmFsID09IDApIHsKKwkJCS8qIFdoZW4gcnVubmluZyBvbiBhIGJyaWRnZSwgdGhlIGlmaW5kZXggbWF5IGhhdmUgY2hhbmdlZAorCQkJICogKGUuZy4gaWYgbWVtYmVyIGludGVyZmFjZXMgd2VyZSBhZGRlZC9yZW1vdmVkCisJCQkgKiBvciBpZiB0aGUgc3RhdHVzIG9mIHRoZSBicmlkZ2UgY2hhbmdlZCkuCisJCQkgKiBSZWZyZXNoIGlmaW5kZXggYW5kIGNsaWVudF9tYWM6CisJCQkgKi8KKwkJCWlmICh1ZGhjcF9yZWFkX2ludGVyZmFjZShjbGllbnRfY29uZmlnLmludGVyZmFjZSwKKwkJCQkJJmNsaWVudF9jb25maWcuaWZpbmRleCwKKwkJCQkJTlVMTCwKKwkJCQkJY2xpZW50X2NvbmZpZy5jbGllbnRfbWFjKQorCQkJKSB7CisJCQkJZ290byByZXQwOyAvKiBpZmFjZSBpcyBnb25lPyAqLworCQkJfQorCQkJbWVtY3B5KGNsaWVudGlkX21hY19wdHIsIGNsaWVudF9jb25maWcuY2xpZW50X21hYywgNik7CisKKwkJCS8qIFdlIHdpbGwgcmVzdGFydCB0aGUgd2FpdCBpbiBhbnkgY2FzZSAqLworCQkJYWxyZWFkeV93YWl0ZWRfc2VjID0gMDsKKworCQkJc3dpdGNoIChzdGF0ZSkgeworCQkJY2FzZSBJTklUX1NFTEVDVElORzoKKwkJCQlpZiAoIWRpc2NvdmVyX3JldHJpZXMgfHwgcGFja2V0X251bSA8IGRpc2NvdmVyX3JldHJpZXMpIHsKKwkJCQkJaWYgKHBhY2tldF9udW0gPT0gMCkKKwkJCQkJCXhpZCA9IHJhbmRvbV94aWQoKTsKKwkJCQkJLyogbXVsdGljYXN0ICovCisJCQkJCXNlbmRfZDZfZGlzY292ZXIoeGlkLCByZXF1ZXN0ZWRfaXB2Nik7CisJCQkJCXRpbWVvdXQgPSBkaXNjb3Zlcl90aW1lb3V0OworCQkJCQlwYWNrZXRfbnVtKys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyBsZWFzZWZhaWw6CisJCQkJZDZfcnVuX3NjcmlwdChOVUxMLCAibGVhc2VmYWlsIik7CisjaWYgQkJfTU1VIC8qIC1iIGlzIG5vdCBzdXBwb3J0ZWQgb24gTk9NTVUgKi8KKwkJCQlpZiAob3B0ICYgT1BUX2IpIHsgLyogYmFja2dyb3VuZCBpZiBubyBsZWFzZSAqLworCQkJCQliYl9pbmZvX21zZygiTm8gbGVhc2UsIGZvcmtpbmcgdG8gYmFja2dyb3VuZCIpOworCQkJCQljbGllbnRfYmFja2dyb3VuZCgpOworCQkJCQkvKiBkbyBub3QgYmFja2dyb3VuZCBhZ2FpbiEgKi8KKwkJCQkJb3B0ID0gKChvcHQgJiB+T1BUX2IpIHwgT1BUX2YpOworCQkJCX0gZWxzZQorI2VuZGlmCisJCQkJaWYgKG9wdCAmIE9QVF9uKSB7IC8qIGFib3J0IGlmIG5vIGxlYXNlICovCisJCQkJCWJiX2luZm9fbXNnKCJObyBsZWFzZSwgZmFpbGluZyIpOworCQkJCQlyZXR2YWwgPSAxOworCQkJCQlnb3RvIHJldDsKKwkJCQl9CisJCQkJLyogd2FpdCBiZWZvcmUgdHJ5aW5nIGFnYWluICovCisJCQkJdGltZW91dCA9IHRyeWFnYWluX3RpbWVvdXQ7CisJCQkJcGFja2V0X251bSA9IDA7CisJCQkJY29udGludWU7CisJCQljYXNlIFJFUVVFU1RJTkc6CisJCQkJaWYgKCFkaXNjb3Zlcl9yZXRyaWVzIHx8IHBhY2tldF9udW0gPCBkaXNjb3Zlcl9yZXRyaWVzKSB7CisJCQkJCS8qIHNlbmQgbXVsdGljYXN0IHNlbGVjdCBwYWNrZXQgKi8KKwkJCQkJc2VuZF9kNl9zZWxlY3QoeGlkKTsKKwkJCQkJdGltZW91dCA9IGRpc2NvdmVyX3RpbWVvdXQ7CisJCQkJCXBhY2tldF9udW0rKzsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8qIFRpbWVkIG91dCwgZ28gYmFjayB0byBpbml0IHN0YXRlLgorCQkJCSAqICJkaXNjb3Zlci4uLnNlbGVjdC4uLmRpc2NvdmVyLi4uIiBsb29wcworCQkJCSAqIHdlcmUgc2VlbiBpbiB0aGUgd2lsZC4gVHJlYXQgdGhlbSBzaW1pbGFybHkKKwkJCQkgKiB0byAibm8gcmVzcG9uc2UgdG8gZGlzY292ZXIiIGNhc2UgKi8KKwkJCQljaGFuZ2VfbGlzdGVuX21vZGUoTElTVEVOX1JBVyk7CisJCQkJc3RhdGUgPSBJTklUX1NFTEVDVElORzsKKwkJCQlnb3RvIGxlYXNlZmFpbDsKKwkJCWNhc2UgQk9VTkQ6CisJCQkJLyogMS8yIGxlYXNlIHBhc3NlZCwgZW50ZXIgcmVuZXdpbmcgc3RhdGUgKi8KKwkJCQlzdGF0ZSA9IFJFTkVXSU5HOworCQkJCWNsaWVudF9jb25maWcuZmlyc3Rfc2VjcyA9IDA7IC8qIG1ha2Ugc2VjcyBmaWVsZCBjb3VudCBmcm9tIDAgKi8KKwkJCQljaGFuZ2VfbGlzdGVuX21vZGUoTElTVEVOX0tFUk5FTCk7CisJCQkJbG9nMSgiRW50ZXJpbmcgcmVuZXcgc3RhdGUiKTsKKwkJCQkvKiBmYWxsIHJpZ2h0IHRocm91Z2ggKi8KKwkJCWNhc2UgUkVORVdfUkVRVUVTVEVEOiAvKiBtYW51YWwgKFNJR1VTUjEpIHJlbmV3ICovCisJCQljYXNlX1JFTkVXX1JFUVVFU1RFRDoKKwkJCWNhc2UgUkVORVdJTkc6CisJCQkJaWYgKHRpbWVvdXQgPiA2MCkgeworCQkJCQkvKiBzZW5kIGFuIHVuaWNhc3QgcmVuZXcgcmVxdWVzdCAqLworCQkJLyogU29tZXRpbWVzIG9ic2VydmVkIHRvIGZhaWwgKEVBRERSTk9UQVZBSUwpIHRvIGJpbmQKKwkJCSAqIGEgbmV3IFVEUCBzb2NrZXQgZm9yIHNlbmRpbmcgaW5zaWRlIHNlbmRfcmVuZXcuCisJCQkgKiBJIGhhemFyZCB0byBndWVzcyBleGlzdGluZyBsaXN0ZW5pbmcgc29ja2V0CisJCQkgKiBpcyBzb21laG93IGNvbmZsaWN0aW5nIHdpdGggaXQsIGJ1dCB3aHkgaXMgaXQKKwkJCSAqIG5vdCBkZXRlcm1pbmlzdGljIHRoZW4/ISBTdHJhbmdlLgorCQkJICogQW55d2F5LCBpdCBkb2VzIHJlY292ZXIgYnkgZXZlbnR1YWxseSBmYWlsaW5nIHRocm91Z2gKKwkJCSAqIGludG8gSU5JVF9TRUxFQ1RJTkcgc3RhdGUuCisJCQkgKi8KKwkJCQkJc2VuZF9kNl9yZW5ldyh4aWQsICZzcnY2X2J1ZiwgcmVxdWVzdGVkX2lwdjYpOworCQkJCQl0aW1lb3V0ID4+PSAxOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyogVGltZWQgb3V0LCBlbnRlciByZWJpbmRpbmcgc3RhdGUgKi8KKwkJCQlsb2cxKCJFbnRlcmluZyByZWJpbmRpbmcgc3RhdGUiKTsKKwkJCQlzdGF0ZSA9IFJFQklORElORzsKKwkJCQkvKiBmYWxsIHJpZ2h0IHRocm91Z2ggKi8KKwkJCWNhc2UgUkVCSU5ESU5HOgorCQkJCS8qIFN3aXRjaCB0byBiY2FzdCByZWNlaXZlICovCisJCQkJY2hhbmdlX2xpc3Rlbl9tb2RlKExJU1RFTl9SQVcpOworCQkJCS8qIExlYXNlIGlzICpyZWFsbHkqIGFib3V0IHRvIHJ1biBvdXQsCisJCQkJICogdHJ5IHRvIGZpbmQgREhDUCBzZXJ2ZXIgdXNpbmcgYnJvYWRjYXN0ICovCisJCQkJaWYgKHRpbWVvdXQgPiAwKSB7CisJCQkJCS8qIHNlbmQgYSBicm9hZGNhc3QgcmVuZXcgcmVxdWVzdCAqLworCQkJCQlzZW5kX2Q2X3JlbmV3KHhpZCwgLypzZXJ2ZXJfaXB2NjoqLyBOVUxMLCByZXF1ZXN0ZWRfaXB2Nik7CisJCQkJCXRpbWVvdXQgPj49IDE7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvKiBUaW1lZCBvdXQsIGVudGVyIGluaXQgc3RhdGUgKi8KKwkJCQliYl9pbmZvX21zZygiTGVhc2UgbG9zdCwgZW50ZXJpbmcgaW5pdCBzdGF0ZSIpOworCQkJCWQ2X3J1bl9zY3JpcHQoTlVMTCwgImRlY29uZmlnIik7CisJCQkJc3RhdGUgPSBJTklUX1NFTEVDVElORzsKKwkJCQljbGllbnRfY29uZmlnLmZpcnN0X3NlY3MgPSAwOyAvKiBtYWtlIHNlY3MgZmllbGQgY291bnQgZnJvbSAwICovCisJCQkJLyp0aW1lb3V0ID0gMDsgLSBhbHJlYWR5IGlzICovCisJCQkJcGFja2V0X251bSA9IDA7CisJCQkJY29udGludWU7CisJCQkvKiBjYXNlIFJFTEVBU0VEOiAqLworCQkJfQorCQkJLyogeWFoLCBJIGtub3csICp5b3UqIHNheSBpdCB3b3VsZCBuZXZlciBoYXBwZW4gKi8KKwkJCXRpbWVvdXQgPSBJTlRfTUFYOworCQkJY29udGludWU7IC8qIGJhY2sgdG8gbWFpbiBsb29wICovCisJCX0gLyogaWYgc2VsZWN0IHRpbWVkIG91dCAqLworCisJCS8qIHNlbGVjdCgpIGRpZG4ndCB0aW1lb3V0LCBzb21ldGhpbmcgaGFwcGVuZWQgKi8KKworCQkvKiBJcyBpdCBhIHNpZ25hbD8gKi8KKwkJLyogbm90ZTogdWRoY3Bfc3BfcmVhZCBjaGVja3MgRkRfSVNTRVQgYmVmb3JlIHJlYWRpbmcgKi8KKwkJc3dpdGNoICh1ZGhjcF9zcF9yZWFkKCZyZmRzKSkgeworCQljYXNlIFNJR1VTUjE6CisJCQljbGllbnRfY29uZmlnLmZpcnN0X3NlY3MgPSAwOyAvKiBtYWtlIHNlY3MgZmllbGQgY291bnQgZnJvbSAwICovCisJCQlhbHJlYWR5X3dhaXRlZF9zZWMgPSAwOworCQkJcGVyZm9ybV9yZW5ldygpOworCQkJaWYgKHN0YXRlID09IFJFTkVXX1JFUVVFU1RFRCkgeworCQkJCS8qIFdlIG1pZ2h0IGJlIGVpdGhlciBvbiB0aGUgc2FtZSBuZXR3b3JrCisJCQkJICogKGluIHdoaWNoIGNhc2UgcmVuZXcgbWlnaHQgd29yayksCisJCQkJICogb3Igd2UgbWlnaHQgYmUgb24gYSBjb21wbGV0ZWx5IGRpZmZlcmVudCBvbmUKKwkJCQkgKiAoaW4gd2hpY2ggY2FzZSByZW5ldyB3b24ndCBldmVyIHN1Y2NlZWQpLgorCQkJCSAqIEZvciB0aGUgc2Vjb25kIGNhc2UsIG11c3QgbWFrZSBzdXJlIHRpbWVvdXQKKwkJCQkgKiBpcyBub3QgdG9vIGJpZywgb3IgZWxzZSB3ZSBjYW4gc2VuZAorCQkJCSAqIGZ1dGlsZSByZW5ldyByZXF1ZXN0cyBmb3IgaG91cnMuCisJCQkJICogKEFiKXVzZSAtQSBUSU1FT1VUIHZhbHVlICh1c3VhbGx5IDIwIHNlYykKKwkJCQkgKiBhcyBhIGNhcCBvbiB0aGUgdGltZW91dC4KKwkJCQkgKi8KKwkJCQlpZiAodGltZW91dCA+IHRyeWFnYWluX3RpbWVvdXQpCisJCQkJCXRpbWVvdXQgPSB0cnlhZ2Fpbl90aW1lb3V0OworCQkJCWdvdG8gY2FzZV9SRU5FV19SRVFVRVNURUQ7CisJCQl9CisJCQkvKiBTdGFydCB0aGluZ3Mgb3ZlciAqLworCQkJcGFja2V0X251bSA9IDA7CisJCQkvKiBLaWxsIGFueSB0aW1lb3V0cywgdXNlciB3YW50cyB0aGlzIHRvIGh1cnJ5IGFsb25nICovCisJCQl0aW1lb3V0ID0gMDsKKwkJCWNvbnRpbnVlOworCQljYXNlIFNJR1VTUjI6CisJCQlwZXJmb3JtX2Q2X3JlbGVhc2UoJnNydjZfYnVmLCByZXF1ZXN0ZWRfaXB2Nik7CisJCQl0aW1lb3V0ID0gSU5UX01BWDsKKwkJCWNvbnRpbnVlOworCQljYXNlIFNJR1RFUk06CisJCQliYl9pbmZvX21zZygiUmVjZWl2ZWQgU0lHVEVSTSIpOworCQkJZ290byByZXQwOworCQl9CisKKwkJLyogSXMgaXQgYSBwYWNrZXQ/ICovCisJCWlmIChsaXN0ZW5fbW9kZSA9PSBMSVNURU5fTk9ORSB8fCAhRkRfSVNTRVQoc29ja2ZkLCAmcmZkcykpCisJCQljb250aW51ZTsgLyogbm8gKi8KKworCQl7CisJCQlpbnQgbGVuOworCisJCQkvKiBBIHBhY2tldCBpcyByZWFkeSwgcmVhZCBpdCAqLworCQkJaWYgKGxpc3Rlbl9tb2RlID09IExJU1RFTl9LRVJORUwpCisJCQkJbGVuID0gZDZfcmVjdl9rZXJuZWxfcGFja2V0KCZzcnY2X2J1ZiwgJnBhY2tldCwgc29ja2ZkKTsKKwkJCWVsc2UKKwkJCQlsZW4gPSBkNl9yZWN2X3Jhd19wYWNrZXQoJnNydjZfYnVmLCAmcGFja2V0LCBzb2NrZmQpOworCQkJaWYgKGxlbiA9PSAtMSkgeworCQkJCS8qIEVycm9yIGlzIHNldmVyZSwgcmVvcGVuIHNvY2tldCAqLworCQkJCWJiX2luZm9fbXNnKCJSZWFkIGVycm9yOiAlcywgcmVvcGVuaW5nIHNvY2tldCIsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJc2xlZXAoZGlzY292ZXJfdGltZW91dCk7IC8qIDMgc2Vjb25kcyBieSBkZWZhdWx0ICovCisJCQkJY2hhbmdlX2xpc3Rlbl9tb2RlKGxpc3Rlbl9tb2RlKTsgLyoganVzdCBjbG9zZSBhbmQgcmVvcGVuICovCisJCQl9CisJCQkvKiBJZiB0aGlzIHBhY2tldCB3aWxsIHR1cm4gb3V0IHRvIGJlIHVucmVsYXRlZC9ib2d1cywKKwkJCSAqIHdlIHdpbGwgZ28gYmFjayBhbmQgd2FpdCBmb3IgbmV4dCBvbmUuCisJCQkgKiBCZSBzdXJlIHRpbWVvdXQgaXMgcHJvcGVybHkgZGVjcmVhc2VkLiAqLworCQkJYWxyZWFkeV93YWl0ZWRfc2VjICs9ICh1bnNpZ25lZCltb25vdG9uaWNfc2VjKCkgLSB0aW1lc3RhbXBfYmVmb3JlX3dhaXQ7CisJCQlpZiAobGVuIDwgMCkKKwkJCQljb250aW51ZTsKKwkJCXBhY2tldF9lbmQgPSAodWludDhfdCopJnBhY2tldCArIGxlbjsKKwkJfQorCisJCWlmICgocGFja2V0LmQ2X3hpZDMyICYgaHRvbmwoMHgwMGZmZmZmZikpICE9IHhpZCkgeworCQkJbG9nMSgieGlkICV4IChvdXIgaXMgJXgpLCBpZ25vcmluZyBwYWNrZXQiLAorCQkJCSh1bnNpZ25lZCkocGFja2V0LmQ2X3hpZDMyICYgaHRvbmwoMHgwMGZmZmZmZikpLCAodW5zaWduZWQpeGlkKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIElOSVRfU0VMRUNUSU5HOgorCQkJaWYgKHBhY2tldC5kNl9tc2dfdHlwZSA9PSBENl9NU0dfQURWRVJUSVNFKQorCQkJCWdvdG8gdHlwZV9pc19vazsKKwkJCS8qIERIQ1B2NiBoYXMgIlJhcGlkIENvbW1pdCIsIHdoZW4gaW5zdGVhZCBvZiBBZHZlcnRpc2UsCisJCQkgKiBzZXJ2ZXIgc2VuZHMgUmVwbHkgcmlnaHQgYXdheS4KKwkJCSAqIEZhbGwgdGhyb3VnaCB0byBjaGVjayBmb3IgdGhpcyBjYXNlLgorCQkJICovCisJCWNhc2UgUkVRVUVTVElORzoKKwkJY2FzZSBSRU5FV0lORzoKKwkJY2FzZSBSRU5FV19SRVFVRVNURUQ6CisJCWNhc2UgUkVCSU5ESU5HOgorCQkJaWYgKHBhY2tldC5kNl9tc2dfdHlwZSA9PSBENl9NU0dfUkVQTFkpIHsKKwkJCQl1aW50MzJfdCBsZWFzZV9zZWNvbmRzOworCQkJCXN0cnVjdCBkNl9vcHRpb24gKm9wdGlvbiwgKmlhYWRkcjsKKyB0eXBlX2lzX29rOgorCQkJCW9wdGlvbiA9IGQ2X2ZpbmRfb3B0aW9uKHBhY2tldC5kNl9vcHRpb25zLCBwYWNrZXRfZW5kLCBENl9PUFRfU1RBVFVTX0NPREUpOworCQkJCWlmIChvcHRpb24gJiYgb3B0aW9uLT5kYXRhWzRdICE9IDApIHsKKwkJCQkJLyogcmV0dXJuIHRvIGluaXQgc3RhdGUgKi8KKwkJCQkJYmJfaW5mb19tc2coIlJlY2VpdmVkIERIQ1AgTkFLICgldSkiLCBvcHRpb24tPmRhdGFbNF0pOworCQkJCQlkNl9ydW5fc2NyaXB0KCZwYWNrZXQsICJuYWsiKTsKKwkJCQkJaWYgKHN0YXRlICE9IFJFUVVFU1RJTkcpCisJCQkJCQlkNl9ydW5fc2NyaXB0KE5VTEwsICJkZWNvbmZpZyIpOworCQkJCQljaGFuZ2VfbGlzdGVuX21vZGUoTElTVEVOX1JBVyk7CisJCQkJCXNsZWVwKDMpOyAvKiBhdm9pZCBleGNlc3NpdmUgbmV0d29yayB0cmFmZmljICovCisJCQkJCXN0YXRlID0gSU5JVF9TRUxFQ1RJTkc7CisJCQkJCWNsaWVudF9jb25maWcuZmlyc3Rfc2VjcyA9IDA7IC8qIG1ha2Ugc2VjcyBmaWVsZCBjb3VudCBmcm9tIDAgKi8KKwkJCQkJcmVxdWVzdGVkX2lwdjYgPSBOVUxMOworCQkJCQl0aW1lb3V0ID0gMDsKKwkJCQkJcGFja2V0X251bSA9IDA7CisJCQkJCWFscmVhZHlfd2FpdGVkX3NlYyA9IDA7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlvcHRpb24gPSBkNl9jb3B5X29wdGlvbihwYWNrZXQuZDZfb3B0aW9ucywgcGFja2V0X2VuZCwgRDZfT1BUX1NFUlZFUklEKTsKKwkJCQlpZiAoIW9wdGlvbikgeworCQkJCQliYl9lcnJvcl9tc2coIm5vIHNlcnZlciBJRCwgaWdub3JpbmcgcGFja2V0Iik7CisJCQkJCWNvbnRpbnVlOworCQkJCQkvKiBzdGlsbCBzZWxlY3RpbmcgLSB0aGlzIHNlcnZlciBsb29rcyBiYWQgKi8KKwkJCQl9CisvL05vdGU6IHdlIGRvIG5vdCBib3RoZXIgY29tcGFyaW5nIHNlcnZlciBJRHMgaW4gQWR2ZXJ0aXNlIGFuZCBSZXBseSBtc2dzLgorLy9zZXJ2ZXJfaWQgdmFyaWFibGUgaXMgdXNlZCBzb2xlbHkgZm9yIGNyZWF0aW9uIG9mIHByb3BlciBzZXJ2ZXJfaWQgb3B0aW9uCisvL2luIG91dGdvaW5nIHBhY2tldHMuICh3aHkgREhDUHY2IGV2ZW4gaW50cm9kdWNlZCBpdCBpcyBhIG15c3RlcnkpLgorCQkJCWZyZWUoY2xpZW50Nl9kYXRhLnNlcnZlcl9pZCk7CisJCQkJY2xpZW50Nl9kYXRhLnNlcnZlcl9pZCA9IG9wdGlvbjsKKwkJCQlpZiAocGFja2V0LmQ2X21zZ190eXBlID09IEQ2X01TR19BRFZFUlRJU0UpIHsKKwkJCQkJLyogZW50ZXIgcmVxdWVzdGluZyBzdGF0ZSAqLworCQkJCQlzdGF0ZSA9IFJFUVVFU1RJTkc7CisJCQkJCXRpbWVvdXQgPSAwOworCQkJCQlwYWNrZXRfbnVtID0gMDsKKwkJCQkJYWxyZWFkeV93YWl0ZWRfc2VjID0gMDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8qIEl0J3MgYSBENl9NU0dfUkVQTFkgKi8KKy8qCisgKiBSRkMgMzMxNSAxOC4xLjguIFJlY2VpcHQgb2YgUmVwbHkgTWVzc2FnZXMKKyAqCisgKiBVcG9uIHRoZSByZWNlaXB0IG9mIGEgdmFsaWQgUmVwbHkgbWVzc2FnZSBpbiByZXNwb25zZSB0byBhIFNvbGljaXQKKyAqICh3aXRoIGEgUmFwaWQgQ29tbWl0IG9wdGlvbiksIFJlcXVlc3QsIENvbmZpcm0sIFJlbmV3LCBSZWJpbmQgb3IKKyAqIEluZm9ybWF0aW9uLXJlcXVlc3QgbWVzc2FnZSwgdGhlIGNsaWVudCBleHRyYWN0cyB0aGUgY29uZmlndXJhdGlvbgorICogaW5mb3JtYXRpb24gY29udGFpbmVkIGluIHRoZSBSZXBseS4gIFRoZSBjbGllbnQgTUFZIGNob29zZSB0byByZXBvcnQKKyAqIGFueSBzdGF0dXMgY29kZSBvciBtZXNzYWdlIGZyb20gdGhlIHN0YXR1cyBjb2RlIG9wdGlvbiBpbiB0aGUgUmVwbHkKKyAqIG1lc3NhZ2UuCisgKgorICogVGhlIGNsaWVudCBTSE9VTEQgcGVyZm9ybSBkdXBsaWNhdGUgYWRkcmVzcyBkZXRlY3Rpb24gWzE3XSBvbiBlYWNoIG9mCisgKiB0aGUgYWRkcmVzc2VzIGluIGFueSBJQXMgaXQgcmVjZWl2ZXMgaW4gdGhlIFJlcGx5IG1lc3NhZ2UgYmVmb3JlCisgKiB1c2luZyB0aGF0IGFkZHJlc3MgZm9yIHRyYWZmaWMuICBJZiBhbnkgb2YgdGhlIGFkZHJlc3NlcyBhcmUgZm91bmQgdG8KKyAqIGJlIGluIHVzZSBvbiB0aGUgbGluaywgdGhlIGNsaWVudCBzZW5kcyBhIERlY2xpbmUgbWVzc2FnZSB0byB0aGUKKyAqIHNlcnZlciBhcyBkZXNjcmliZWQgaW4gc2VjdGlvbiAxOC4xLjcuCisgKgorICogSWYgdGhlIFJlcGx5IHdhcyByZWNlaXZlZCBpbiByZXNwb25zZSB0byBhIFNvbGljaXQgKHdpdGggYSBSYXBpZAorICogQ29tbWl0IG9wdGlvbiksIFJlcXVlc3QsIFJlbmV3IG9yIFJlYmluZCBtZXNzYWdlLCB0aGUgY2xpZW50IHVwZGF0ZXMKKyAqIHRoZSBpbmZvcm1hdGlvbiBpdCBoYXMgcmVjb3JkZWQgYWJvdXQgSUFzIGZyb20gdGhlIElBIG9wdGlvbnMKKyAqIGNvbnRhaW5lZCBpbiB0aGUgUmVwbHkgbWVzc2FnZToKKyAqCisgKiAtICBSZWNvcmQgVDEgYW5kIFQyIHRpbWVzLgorICoKKyAqIC0gIEFkZCBhbnkgbmV3IGFkZHJlc3NlcyBpbiB0aGUgSUEgb3B0aW9uIHRvIHRoZSBJQSBhcyByZWNvcmRlZCBieQorICogICAgdGhlIGNsaWVudC4KKyAqCisgKiAtICBVcGRhdGUgbGlmZXRpbWVzIGZvciBhbnkgYWRkcmVzc2VzIGluIHRoZSBJQSBvcHRpb24gdGhhdCB0aGUKKyAqICAgIGNsaWVudCBhbHJlYWR5IGhhcyByZWNvcmRlZCBpbiB0aGUgSUEuCisgKgorICogLSAgRGlzY2FyZCBhbnkgYWRkcmVzc2VzIGZyb20gdGhlIElBLCBhcyByZWNvcmRlZCBieSB0aGUgY2xpZW50LCB0aGF0CisgKiAgICBoYXZlIGEgdmFsaWQgbGlmZXRpbWUgb2YgMCBpbiB0aGUgSUEgQWRkcmVzcyBvcHRpb24uCisgKgorICogLSAgTGVhdmUgdW5jaGFuZ2VkIGFueSBpbmZvcm1hdGlvbiBhYm91dCBhZGRyZXNzZXMgdGhlIGNsaWVudCBoYXMKKyAqICAgIHJlY29yZGVkIGluIHRoZSBJQSBidXQgdGhhdCB3ZXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgSUEgZnJvbSB0aGUKKyAqICAgIHNlcnZlci4KKyAqCisgKiBNYW5hZ2VtZW50IG9mIHRoZSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGlzIGRldGFpbGVkIGluCisgKiB0aGUgZGVmaW5pdGlvbiBvZiBlYWNoIG9wdGlvbiBpbiBzZWN0aW9uIDIyLgorICoKKyAqIElmIHRoZSBjbGllbnQgcmVjZWl2ZXMgYSBSZXBseSBtZXNzYWdlIHdpdGggYSBTdGF0dXMgQ29kZSBjb250YWluaW5nCisgKiBVbnNwZWNGYWlsLCB0aGUgc2VydmVyIGlzIGluZGljYXRpbmcgdGhhdCBpdCB3YXMgdW5hYmxlIHRvIHByb2Nlc3MKKyAqIHRoZSBtZXNzYWdlIGR1ZSB0byBhbiB1bnNwZWNpZmllZCBmYWlsdXJlIGNvbmRpdGlvbi4gIElmIHRoZSBjbGllbnQKKyAqIHJldHJhbnNtaXRzIHRoZSBvcmlnaW5hbCBtZXNzYWdlIHRvIHRoZSBzYW1lIHNlcnZlciB0byByZXRyeSB0aGUKKyAqIGRlc2lyZWQgb3BlcmF0aW9uLCB0aGUgY2xpZW50IE1VU1QgbGltaXQgdGhlIHJhdGUgYXQgd2hpY2ggaXQKKyAqIHJldHJhbnNtaXRzIHRoZSBtZXNzYWdlIGFuZCBsaW1pdCB0aGUgZHVyYXRpb24gb2YgdGhlIHRpbWUgZHVyaW5nCisgKiB3aGljaCBpdCByZXRyYW5zbWl0cyB0aGUgbWVzc2FnZS4KKyAqCisgKiBXaGVuIHRoZSBjbGllbnQgcmVjZWl2ZXMgYSBSZXBseSBtZXNzYWdlIHdpdGggYSBTdGF0dXMgQ29kZSBvcHRpb24KKyAqIHdpdGggdGhlIHZhbHVlIFVzZU11bHRpY2FzdCwgdGhlIGNsaWVudCByZWNvcmRzIHRoZSByZWNlaXB0IG9mIHRoZQorICogbWVzc2FnZSBhbmQgc2VuZHMgc3Vic2VxdWVudCBtZXNzYWdlcyB0byB0aGUgc2VydmVyIHRocm91Z2ggdGhlCisgKiBpbnRlcmZhY2Ugb24gd2hpY2ggdGhlIG1lc3NhZ2Ugd2FzIHJlY2VpdmVkIHVzaW5nIG11bHRpY2FzdC4gIFRoZQorICogY2xpZW50IHJlc2VuZHMgdGhlIG9yaWdpbmFsIG1lc3NhZ2UgdXNpbmcgbXVsdGljYXN0LgorICoKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgIE9QVElPTl9JQV9OQSAgICAgICAgIHwgICAgICAgICAgb3B0aW9uLWxlbiAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICBJQUlEICg0IG9jdGV0cykgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiAuICAgICAgICAgICAgICAgICAgICAgICAgIElBX05BLW9wdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgLgorICogLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKgorICoKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgIE9QVElPTl9JQUFERFIgICAgICAgIHwgICAgICAgICAgb3B0aW9uLWxlbiAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIElQdjYgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworICogfCAgICAgICAgICAgICAgICAgICAgICBwcmVmZXJyZWQtbGlmZXRpbWUgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQtbGlmZXRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgfAorICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKyAqIC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuCisgKiAuICAgICAgICAgICAgICAgICAgICAgICAgSUFhZGRyLW9wdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgLgorICogLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4KKyAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisgKi8KKwkJCQlmcmVlKGNsaWVudDZfZGF0YS5pYV9uYSk7CisJCQkJY2xpZW50Nl9kYXRhLmlhX25hID0gZDZfY29weV9vcHRpb24ocGFja2V0LmQ2X29wdGlvbnMsIHBhY2tldF9lbmQsIEQ2X09QVF9JQV9OQSk7CisJCQkJaWYgKCFjbGllbnQ2X2RhdGEuaWFfbmEpIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJubyAlcyBvcHRpb24sIGlnbm9yaW5nIHBhY2tldCIsICJJQV9OQSIpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJaWYgKGNsaWVudDZfZGF0YS5pYV9uYS0+bGVuIDwgKDQgKyA0ICsgNCkgKyAoMiArIDIgKyAxNiArIDQgKyA0KSkgeworCQkJCQliYl9lcnJvcl9tc2coIklBX05BIG9wdGlvbiBpcyB0b28gc2hvcnQ6JWQgYnl0ZXMiLCBjbGllbnQ2X2RhdGEuaWFfbmEtPmxlbik7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpYWFkZHIgPSBkNl9maW5kX29wdGlvbihjbGllbnQ2X2RhdGEuaWFfbmEtPmRhdGEgKyA0ICsgNCArIDQsCisJCQkJCQljbGllbnQ2X2RhdGEuaWFfbmEtPmRhdGEgKyBjbGllbnQ2X2RhdGEuaWFfbmEtPmxlbiwKKwkJCQkJCUQ2X09QVF9JQUFERFIKKwkJCQkpOworCQkJCWlmICghaWFhZGRyKSB7CisJCQkJCWJiX2Vycm9yX21zZygibm8gJXMgb3B0aW9uLCBpZ25vcmluZyBwYWNrZXQiLCAiSUFBRERSIik7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAoaWFhZGRyLT5sZW4gPCAoMTYgKyA0ICsgNCkpIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJJQUFERFIgb3B0aW9uIGlzIHRvbyBzaG9ydDolZCBieXRlcyIsIGlhYWRkci0+bGVuKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8qIE5vdGU6IHRoZSBhZGRyZXNzIGlzIHN1ZmZpY2llbnRseSBhbGlnbmVkIGZvciBjYXN0OgorCQkJCSAqIHdlIF9jb3BpZWRfIElBLU5BLCBhbmQgY29weSBpcyBhbHdheXMgd2VsbC1hbGlnbmVkLgorCQkJCSAqLworCQkJCXJlcXVlc3RlZF9pcHY2ID0gKHN0cnVjdCBpbjZfYWRkciopIGlhYWRkci0+ZGF0YTsKKwkJCQltb3ZlX2Zyb21fdW5hbGlnbmVkMzIobGVhc2Vfc2Vjb25kcywgaWFhZGRyLT5kYXRhICsgMTYgKyA0KTsKKwkJCQlsZWFzZV9zZWNvbmRzID0gbnRvaGwobGVhc2Vfc2Vjb25kcyk7CisJCQkJLyogcGFyYW5vaWE6IG11c3Qgbm90IGJlIHRvbyBzbWFsbCBhbmQgbm90IHByb25lIHRvIG92ZXJmbG93cyAqLworCQkJCWlmIChsZWFzZV9zZWNvbmRzIDwgMHgxMCkKKwkJCQkJbGVhc2Vfc2Vjb25kcyA9IDB4MTA7CisvLy8gVE9ETzogY2hlY2sgZm9yIDAgbGVhc2UgdGltZT8KKwkJCQlpZiAobGVhc2Vfc2Vjb25kcyA+PSAweDEwMDAwMDAwKQorCQkJCQlsZWFzZV9zZWNvbmRzID0gMHgwZmZmZmZmZjsKKwkJCQkvKiBlbnRlciBib3VuZCBzdGF0ZSAqLworCQkJCXRpbWVvdXQgPSBsZWFzZV9zZWNvbmRzIC8gMjsKKwkJCQliYl9pbmZvX21zZygiTGVhc2Ugb2J0YWluZWQsIGxlYXNlIHRpbWUgJXUiLAorCQkJCQkvKmluZXRfbnRvYSh0ZW1wX2FkZHIpLCovICh1bnNpZ25lZClsZWFzZV9zZWNvbmRzKTsKKwkJCQlkNl9ydW5fc2NyaXB0KCZwYWNrZXQsIHN0YXRlID09IFJFUVVFU1RJTkcgPyAiYm91bmQiIDogInJlbmV3Iik7CisKKwkJCQlzdGF0ZSA9IEJPVU5EOworCQkJCWNoYW5nZV9saXN0ZW5fbW9kZShMSVNURU5fTk9ORSk7CisJCQkJaWYgKG9wdCAmIE9QVF9xKSB7IC8qIHF1aXQgYWZ0ZXIgbGVhc2UgKi8KKwkJCQkJZ290byByZXQwOworCQkJCX0KKwkJCQkvKiBmdXR1cmUgcmVuZXcgZmFpbHVyZXMgc2hvdWxkIG5vdCBleGl0IChKTSkgKi8KKwkJCQlvcHQgJj0gfk9QVF9uOworI2lmIEJCX01NVSAvKiBOT01NVSBjYXNlIGJhY2tncm91bmRlZCBlYXJsaWVyICovCisJCQkJaWYgKCEob3B0ICYgT1BUX2YpKSB7CisJCQkJCWNsaWVudF9iYWNrZ3JvdW5kKCk7CisJCQkJCS8qIGRvIG5vdCBiYWNrZ3JvdW5kIGFnYWluISAqLworCQkJCQlvcHQgPSAoKG9wdCAmIH5PUFRfYikgfCBPUFRfZik7CisJCQkJfQorI2VuZGlmCisJCQkJYWxyZWFkeV93YWl0ZWRfc2VjID0gMDsKKwkJCQljb250aW51ZTsgLyogYmFjayB0byBtYWluIGxvb3AgKi8KKwkJCX0KKwkJCWNvbnRpbnVlOworCQkvKiBjYXNlIEJPVU5EOiAtIGlnbm9yZSBhbGwgcGFja2V0cyAqLworCQkvKiBjYXNlIFJFTEVBU0VEOiAtIGlnbm9yZSBhbGwgcGFja2V0cyAqLworCQl9CisJCS8qIGJhY2sgdG8gbWFpbiBsb29wICovCisJfSAvKiBmb3IgKDs7KSAtIG1haW4gbG9vcCBlbmRzICovCisKKyByZXQwOgorCWlmIChvcHQgJiBPUFRfUikgLyogcmVsZWFzZSBvbiBxdWl0ICovCisJCXBlcmZvcm1fZDZfcmVsZWFzZSgmc3J2Nl9idWYsIHJlcXVlc3RlZF9pcHY2KTsKKwlyZXR2YWwgPSAwOworIHJldDoKKwkvKmlmIChjbGllbnRfY29uZmlnLnBpZGZpbGUpIC0gcmVtb3ZlX3BpZGZpbGUgaGFzIGl0cyBvd24gY2hlY2sgKi8KKwkJcmVtb3ZlX3BpZGZpbGUoY2xpZW50X2NvbmZpZy5waWRmaWxlKTsKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy91ZGhjcC9kNl9wYWNrZXQuYyBiL25ldHdvcmtpbmcvdWRoY3AvZDZfcGFja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliMjk0NgotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvdWRoY3AvZDZfcGFja2V0LmMKQEAgLTAsMCArMSwxNzIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBEZW55cyBWbGFzZW5rby4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiZDZfY29tbW9uLmgiCisjaW5jbHVkZSAiZGhjcGQuaCIKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPG5ldHBhY2tldC9wYWNrZXQuaD4KKworI2lmIGRlZmluZWQgQ09ORklHX1VESENQX0RFQlVHICYmIENPTkZJR19VREhDUF9ERUJVRyA+PSAyCit2b2lkIEZBU1RfRlVOQyBkNl9kdW1wX3BhY2tldChzdHJ1Y3QgZDZfcGFja2V0ICpwYWNrZXQpCit7CisJaWYgKGRoY3BfdmVyYm9zZSA8IDIpCisJCXJldHVybjsKKworCWJiX2luZm9fbXNnKAorCQkiIHhpZCAleCIKKwkJLCBwYWNrZXQtPmQ2X3hpZDMyCisJKTsKKwkvLypiaW4yaGV4KGJ1ZiwgKHZvaWQgKikgcGFja2V0LT5jaGFkZHIsIHNpemVvZihwYWNrZXQtPmNoYWRkcikpID0gJ1wwJzsKKwkvL2JiX2luZm9fbXNnKCIgY2hhZGRyICVzIiwgYnVmKTsKK30KKyNlbmRpZgorCitpbnQgRkFTVF9GVU5DIGQ2X3JlY3Zfa2VybmVsX3BhY2tldChzdHJ1Y3QgaW42X2FkZHIgKnBlZXJfaXB2NgorCVVOVVNFRF9QQVJBTQorCSwgc3RydWN0IGQ2X3BhY2tldCAqcGFja2V0LCBpbnQgZmQpCit7CisJaW50IGJ5dGVzOworCisJbWVtc2V0KHBhY2tldCwgMCwgc2l6ZW9mKCpwYWNrZXQpKTsKKwlieXRlcyA9IHNhZmVfcmVhZChmZCwgcGFja2V0LCBzaXplb2YoKnBhY2tldCkpOworCWlmIChieXRlcyA8IDApIHsKKwkJbG9nMSgiUGFja2V0IHJlYWQgZXJyb3IsIGlnbm9yaW5nIik7CisJCXJldHVybiBieXRlczsgLyogcmV0dXJucyAtMSAqLworCX0KKworCWlmIChieXRlcyA8IG9mZnNldG9mKHN0cnVjdCBkNl9wYWNrZXQsIGQ2X29wdGlvbnMpKSB7CisJCWJiX2luZm9fbXNnKCJQYWNrZXQgd2l0aCBiYWQgbWFnaWMsIGlnbm9yaW5nIik7CisJCXJldHVybiAtMjsKKwl9CisJbG9nMSgiUmVjZWl2ZWQgYSBwYWNrZXQiKTsKKwlkNl9kdW1wX3BhY2tldChwYWNrZXQpOworCisJcmV0dXJuIGJ5dGVzOworfQorCisvKiBDb25zdHJ1Y3QgYSBpcHY2K3VkcCBoZWFkZXIgZm9yIGEgcGFja2V0LCBzZW5kIHBhY2tldCAqLworaW50IEZBU1RfRlVOQyBkNl9zZW5kX3Jhd19wYWNrZXQoCisJCXN0cnVjdCBkNl9wYWNrZXQgKmQ2X3BrdCwgdW5zaWduZWQgZDZfcGt0X3NpemUsCisJCXN0cnVjdCBpbjZfYWRkciAqc3JjX2lwdjYsIGludCBzb3VyY2VfcG9ydCwKKwkJc3RydWN0IGluNl9hZGRyICpkc3RfaXB2NiwgaW50IGRlc3RfcG9ydCwgY29uc3QgdWludDhfdCAqZGVzdF9hcnAsCisJCWludCBpZmluZGV4KQoreworCXN0cnVjdCBzb2NrYWRkcl9sbCBkZXN0X3NsbDsKKwlzdHJ1Y3QgaXA2X3VkcF9kNl9wYWNrZXQgcGFja2V0OworCWludCBmZDsKKwlpbnQgcmVzdWx0ID0gLTE7CisJY29uc3QgY2hhciAqbXNnOworCisJZmQgPSBzb2NrZXQoUEZfUEFDS0VULCBTT0NLX0RHUkFNLCBodG9ucyhFVEhfUF9JUFY2KSk7CisJaWYgKGZkIDwgMCkgeworCQltc2cgPSAic29ja2V0KCVzKSI7CisJCWdvdG8gcmV0X21zZzsKKwl9CisKKwltZW1zZXQoJmRlc3Rfc2xsLCAwLCBzaXplb2YoZGVzdF9zbGwpKTsKKwltZW1zZXQoJnBhY2tldCwgMCwgb2Zmc2V0b2Yoc3RydWN0IGlwNl91ZHBfZDZfcGFja2V0LCBkYXRhKSk7CisJcGFja2V0LmRhdGEgPSAqZDZfcGt0OyAvKiBzdHJ1Y3QgY29weSAqLworCisJZGVzdF9zbGwuc2xsX2ZhbWlseSA9IEFGX1BBQ0tFVDsKKwlkZXN0X3NsbC5zbGxfcHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUFY2KTsKKwlkZXN0X3NsbC5zbGxfaWZpbmRleCA9IGlmaW5kZXg7CisJZGVzdF9zbGwuc2xsX2hhbGVuID0gNjsKKwltZW1jcHkoZGVzdF9zbGwuc2xsX2FkZHIsIGRlc3RfYXJwLCA2KTsKKworCWlmIChiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopJmRlc3Rfc2xsLCBzaXplb2YoZGVzdF9zbGwpKSA8IDApIHsKKwkJbXNnID0gImJpbmQoJXMpIjsKKwkJZ290byByZXRfY2xvc2U7CisJfQorCisJcGFja2V0LmlwNi5pcDZfdmZjID0gKDYgPDwgNCk7IC8qIDQgYml0cyB2ZXJzaW9uLCB0b3AgNCBiaXRzIG9mIHRjbGFzcyAqLworCWlmIChzcmNfaXB2NikKKwkJcGFja2V0LmlwNi5pcDZfc3JjID0gKnNyY19pcHY2OyAvKiBzdHJ1Y3QgY29weSAqLworCXBhY2tldC5pcDYuaXA2X2RzdCA9ICpkc3RfaXB2NjsgLyogc3RydWN0IGNvcHkgKi8KKwlwYWNrZXQudWRwLnNvdXJjZSA9IGh0b25zKHNvdXJjZV9wb3J0KTsKKwlwYWNrZXQudWRwLmRlc3QgPSBodG9ucyhkZXN0X3BvcnQpOworCS8qIHNpemUsIGV4Y2x1ZGluZyBJUCBoZWFkZXI6ICovCisJcGFja2V0LnVkcC5sZW4gPSBodG9ucyhzaXplb2Yoc3RydWN0IHVkcGhkcikgKyBkNl9wa3Rfc2l6ZSk7CisJcGFja2V0LmlwNi5pcDZfcGxlbiA9IHBhY2tldC51ZHAubGVuOworCS8qCisJICogU29tZW9uZSB3YXMgc21va2luZyB3ZWVkIChhdCBsZWFzdCkgd2hpbGUgaW52ZW50aW5nIFVEUCBjaGVja3N1bW1pbmc6CisJICogVURQIGNoZWNrc3VtIHNraXBzIGZpcnN0IGZvdXIgYnl0ZXMgb2YgSVB2NiBoZWFkZXIuCisJICogJ25leHQgaGVhZGVyJyBmaWVsZCBzaG91bGQgYmUgc3VtbWVkIGFzIGlmIGl0IGlzIG9uZSBtb3JlIGJ5dGUKKwkgKiB0byB0aGUgcmlnaHQsIHRoZXJlZm9yZSB3ZSB3cml0ZSBpdHMgdmFsdWUgKElQUFJPVE9fVURQKQorCSAqIGludG8gaXA2X2hsaW0sIGFuZCBpdHMgJ3JlYWwnIGxvY2F0aW9uIHJlbWFpbnMgemVyby1maWxsZWQgZm9yIG5vdy4KKwkgKi8KKwlwYWNrZXQuaXA2LmlwNl9obGltID0gSVBQUk9UT19VRFA7CisJcGFja2V0LnVkcC5jaGVjayA9IGluZXRfY2tzdW0oCisJCQkJKHVpbnQxNl90ICopJnBhY2tldCArIDIsCisJCQkJb2Zmc2V0b2Yoc3RydWN0IGlwNl91ZHBfZDZfcGFja2V0LCBkYXRhKSAtIDQgKyBkNl9wa3Rfc2l6ZQorCSk7CisJLyogZml4ICdob3AgbGltaXQnIGFuZCAnbmV4dCBoZWFkZXInIGFmdGVyIFVEUCBjaGVja3N1bW1pbmcgKi8KKwlwYWNrZXQuaXA2LmlwNl9obGltID0gMTsgLyogb2JzZXJ2ZWQgV2luZG93cyBtYWNoaW5lcyB0byB1c2UgaGxpbT0xICovCisJcGFja2V0LmlwNi5pcDZfbnh0ID0gSVBQUk9UT19VRFA7CisKKwlkNl9kdW1wX3BhY2tldChkNl9wa3QpOworCXJlc3VsdCA9IHNlbmR0byhmZCwgJnBhY2tldCwgb2Zmc2V0b2Yoc3RydWN0IGlwNl91ZHBfZDZfcGFja2V0LCBkYXRhKSArIGQ2X3BrdF9zaXplLAorCQkJLypmbGFnczoqLyAwLAorCQkJKHN0cnVjdCBzb2NrYWRkciAqKSAmZGVzdF9zbGwsIHNpemVvZihkZXN0X3NsbCkKKwkpOworCW1zZyA9ICJzZW5kdG8iOworIHJldF9jbG9zZToKKwljbG9zZShmZCk7CisJaWYgKHJlc3VsdCA8IDApIHsKKyByZXRfbXNnOgorCQliYl9wZXJyb3JfbXNnKG1zZywgIlBBQ0tFVCIpOworCX0KKwlyZXR1cm4gcmVzdWx0OworfQorCisvKiBMZXQgdGhlIGtlcm5lbCBkbyBhbGwgdGhlIHdvcmsgZm9yIHBhY2tldCBnZW5lcmF0aW9uICovCitpbnQgRkFTVF9GVU5DIGQ2X3NlbmRfa2VybmVsX3BhY2tldCgKKwkJc3RydWN0IGQ2X3BhY2tldCAqZDZfcGt0LCB1bnNpZ25lZCBkNl9wa3Rfc2l6ZSwKKwkJc3RydWN0IGluNl9hZGRyICpzcmNfaXB2NiwgaW50IHNvdXJjZV9wb3J0LAorCQlzdHJ1Y3QgaW42X2FkZHIgKmRzdF9pcHY2LCBpbnQgZGVzdF9wb3J0KQoreworCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2E7CisJaW50IGZkOworCWludCByZXN1bHQgPSAtMTsKKwljb25zdCBjaGFyICptc2c7CisKKwlmZCA9IHNvY2tldChQRl9JTkVUNiwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOworCWlmIChmZCA8IDApIHsKKwkJbXNnID0gInNvY2tldCglcykiOworCQlnb3RvIHJldF9tc2c7CisJfQorCXNldHNvY2tvcHRfcmV1c2VhZGRyKGZkKTsKKworCW1lbXNldCgmc2EsIDAsIHNpemVvZihzYSkpOworCXNhLnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJc2Euc2luNl9wb3J0ID0gaHRvbnMoc291cmNlX3BvcnQpOworCXNhLnNpbjZfYWRkciA9ICpzcmNfaXB2NjsgLyogc3RydWN0IGNvcHkgKi8KKwlpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzYSwgc2l6ZW9mKHNhKSkgPT0gLTEpIHsKKwkJbXNnID0gImJpbmQoJXMpIjsKKwkJZ290byByZXRfY2xvc2U7CisJfQorCisJbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7CisJc2Euc2luNl9mYW1pbHkgPSBBRl9JTkVUNjsKKwlzYS5zaW42X3BvcnQgPSBodG9ucyhkZXN0X3BvcnQpOworCXNhLnNpbjZfYWRkciA9ICpkc3RfaXB2NjsgLyogc3RydWN0IGNvcHkgKi8KKwlpZiAoY29ubmVjdChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzYSwgc2l6ZW9mKHNhKSkgPT0gLTEpIHsKKwkJbXNnID0gImNvbm5lY3QiOworCQlnb3RvIHJldF9jbG9zZTsKKwl9CisKKwlkNl9kdW1wX3BhY2tldChkNl9wa3QpOworCXJlc3VsdCA9IHNhZmVfd3JpdGUoZmQsIGQ2X3BrdCwgZDZfcGt0X3NpemUpOworCW1zZyA9ICJ3cml0ZSI7CisgcmV0X2Nsb3NlOgorCWNsb3NlKGZkKTsKKwlpZiAocmVzdWx0IDwgMCkgeworIHJldF9tc2c6CisJCWJiX3BlcnJvcl9tc2cobXNnLCAiVURQIik7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3VkaGNwL2Q2X3NvY2tldC5jIGIvbmV0d29ya2luZy91ZGhjcC9kNl9zb2NrZXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmY2OWY2Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy91ZGhjcC9kNl9zb2NrZXQuYwpAQCAtMCwwICsxLDM0IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgRGVueXMgVmxhc2Vua28uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImQ2X2NvbW1vbi5oIgorI2luY2x1ZGUgPG5ldC9pZi5oPgorCitpbnQgRkFTVF9GVU5DIGQ2X2xpc3Rlbl9zb2NrZXQoaW50IHBvcnQsIGNvbnN0IGNoYXIgKmluZikKK3sKKwlpbnQgZmQ7CisJc3RydWN0IHNvY2thZGRyX2luNiBhZGRyOworCisJbG9nMSgiT3BlbmluZyBsaXN0ZW4gc29ja2V0IG9uICo6JWQgJXMiLCBwb3J0LCBpbmYpOworCWZkID0geHNvY2tldChQRl9JTkVUNiwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOworCisJc2V0c29ja29wdF9yZXVzZWFkZHIoZmQpOworCWlmIChzZXRzb2Nrb3B0X2Jyb2FkY2FzdChmZCkgPT0gLTEpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiU09fQlJPQURDQVNUIik7CisKKwkvKiBOQjogYnVnIDEwMzIgc2F5cyB0aGlzIGRvZXNuJ3Qgd29yayBvbiBldGhlcm5ldCBhbGlhc2VzIChldGhOOk0pICovCisJaWYgKHNldHNvY2tvcHRfYmluZHRvZGV2aWNlKGZkLCBpbmYpKQorCQl4ZnVuY19kaWUoKTsgLyogd2FybmluZyBpcyBhbHJlYWR5IHByaW50ZWQgKi8KKworCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwlhZGRyLnNpbjZfZmFtaWx5ID0gQUZfSU5FVDY7CisJYWRkci5zaW42X3BvcnQgPSBodG9ucyhwb3J0KTsKKwkvKiBhZGRyLnNpbjZfYWRkciBpcyBhbGwtemVyb3MgKi8KKwl4YmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpOworCisJcmV0dXJuIGZkOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy91ZGhjcC9kaGNwYy5jIGIvbmV0d29ya2luZy91ZGhjcC9kaGNwYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNWY2NTkKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3VkaGNwL2RoY3BjLmMKQEAgLTAsMCArMSwxODQ2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB1ZGhjcCBjbGllbnQKKyAqCisgKiBSdXNzIERpbGwgPFJ1c3MuRGlsbEBhc3UuZWR1PiBKdWx5IDIwMDEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgPHN5c2xvZy5oPgorLyogT3ZlcnJpZGUgRU5BQkxFX0ZFQVRVUkVfUElERklMRSAtIGlmdXBkb3duIG5lZWRzIG91ciBwaWRmaWxlIHRvIGFsd2F5cyBleGlzdCAqLworI2RlZmluZSBXQU5UX1BJREZJTEUgMQorI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImRoY3BkLmgiCisjaW5jbHVkZSAiZGhjcGMuaCIKKworI2luY2x1ZGUgPG5ldGluZXQvaWZfZXRoZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9maWx0ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9wYWNrZXQuaD4KKworI2lmbmRlZiBQQUNLRVRfQVVYREFUQQorIyBkZWZpbmUgUEFDS0VUX0FVWERBVEEgOAorc3RydWN0IHRwYWNrZXRfYXV4ZGF0YSB7CisJdWludDMyX3QgdHBfc3RhdHVzOworCXVpbnQzMl90IHRwX2xlbjsKKwl1aW50MzJfdCB0cF9zbmFwbGVuOworCXVpbnQxNl90IHRwX21hYzsKKwl1aW50MTZfdCB0cF9uZXQ7CisJdWludDE2X3QgdHBfdmxhbl90Y2k7CisJdWludDE2X3QgdHBfcGFkZGluZzsKK307CisjZW5kaWYKKworCisvKiAic3RydWN0IGNsaWVudF9jb25maWdfdCBjbGllbnRfY29uZmlnIiBpcyBpbiBiYl9jb21tb25fYnVmc2l6MSAqLworCisKKyNpZiBFTkFCTEVfTE9OR19PUFRTCitzdGF0aWMgY29uc3QgY2hhciB1ZGhjcGNfbG9uZ29wdHNbXSBBTElHTjEgPQorCSJjbGllbnRpZC1ub25lXDAiICBOb19hcmd1bWVudCAgICAgICAiQyIKKwkidmVuZG9yY2xhc3NcMCIgICAgUmVxdWlyZWRfYXJndW1lbnQgIlYiCisJImhvc3RuYW1lXDAiICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJIIgorCSJmcWRuXDAiICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiRiIKKwkiaW50ZXJmYWNlXDAiICAgICAgUmVxdWlyZWRfYXJndW1lbnQgImkiCisJIm5vd1wwIiAgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJuIgorCSJwaWRmaWxlXDAiICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAicCIKKwkicXVpdFwwIiAgICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInEiCisJInJlbGVhc2VcMCIgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJSIgorCSJyZXF1ZXN0XDAiICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiciIKKwkic2NyaXB0XDAiICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInMiCisJInRpbWVvdXRcMCIgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJUIgorCSJyZXRyaWVzXDAiICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAidCIKKwkidHJ5YWdhaW5cMCIgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIkEiCisJInN5c2xvZ1wwIiAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJTIgorCSJyZXF1ZXN0LW9wdGlvblwwIiBSZXF1aXJlZF9hcmd1bWVudCAiTyIKKwkibm8tZGVmYXVsdC1vcHRpb25zXDAiIE5vX2FyZ3VtZW50ICAgIm8iCisJImZvcmVncm91bmRcMCIgICAgIE5vX2FyZ3VtZW50ICAgICAgICJmIgorCSJiYWNrZ3JvdW5kXDAiICAgICBOb19hcmd1bWVudCAgICAgICAiYiIKKwkiYnJvYWRjYXN0XDAiICAgICAgTm9fYXJndW1lbnQgICAgICAgIkIiCisJSUZfRkVBVFVSRV9VREhDUENfQVJQSU5HKCJhcnBpbmdcMCIJT3B0aW9uYWxfYXJndW1lbnQgImEiKQorCUlGX0ZFQVRVUkVfVURIQ1BfUE9SVCgiY2xpZW50LXBvcnRcMCIJUmVxdWlyZWRfYXJndW1lbnQgIlAiKQorCTsKKyNlbmRpZgorLyogTXVzdCBtYXRjaCBnZXRvcHQzMiBvcHRpb24gc3RyaW5nIG9yZGVyICovCitlbnVtIHsKKwlPUFRfQyA9IDEgPDwgMCwKKwlPUFRfViA9IDEgPDwgMSwKKwlPUFRfSCA9IDEgPDwgMiwKKwlPUFRfaCA9IDEgPDwgMywKKwlPUFRfRiA9IDEgPDwgNCwKKwlPUFRfaSA9IDEgPDwgNSwKKwlPUFRfbiA9IDEgPDwgNiwKKwlPUFRfcCA9IDEgPDwgNywKKwlPUFRfcSA9IDEgPDwgOCwKKwlPUFRfUiA9IDEgPDwgOSwKKwlPUFRfciA9IDEgPDwgMTAsCisJT1BUX3MgPSAxIDw8IDExLAorCU9QVF9UID0gMSA8PCAxMiwKKwlPUFRfdCA9IDEgPDwgMTMsCisJT1BUX1MgPSAxIDw8IDE0LAorCU9QVF9BID0gMSA8PCAxNSwKKwlPUFRfTyA9IDEgPDwgMTYsCisJT1BUX28gPSAxIDw8IDE3LAorCU9QVF94ID0gMSA8PCAxOCwKKwlPUFRfZiA9IDEgPDwgMTksCisJT1BUX0IgPSAxIDw8IDIwLAorLyogVGhlIHJlc3QgaGFzIHZhcmlhYmxlIGJpdCBwb3NpdGlvbnMsIG5lZWQgdG8gYmUgY2xldmVyICovCisJT1BUQklUX0IgPSAyMCwKKwlVU0VfRk9SX01NVSggICAgICAgICAgICAgT1BUQklUX2IsKQorCUlGX0ZFQVRVUkVfVURIQ1BDX0FSUElORyhPUFRCSVRfYSwpCisJSUZfRkVBVFVSRV9VREhDUF9QT1JUKCAgIE9QVEJJVF9QLCkKKwlVU0VfRk9SX01NVSggICAgICAgICAgICAgT1BUX2IgPSAxIDw8IE9QVEJJVF9iLCkKKwlJRl9GRUFUVVJFX1VESENQQ19BUlBJTkcoT1BUX2EgPSAxIDw8IE9QVEJJVF9hLCkKKwlJRl9GRUFUVVJFX1VESENQX1BPUlQoICAgT1BUX1AgPSAxIDw8IE9QVEJJVF9QLCkKK307CisKKworLyoqKiBTY3JpcHQgZXhlY3V0aW9uIGNvZGUgKioqLworCisvKiBnZXQgYSByb3VnaCBpZGVhIG9mIGhvdyBsb25nIGFuIG9wdGlvbiB3aWxsIGJlIChyb3VuZGluZyB1cC4uLikgKi8KK3N0YXRpYyBjb25zdCB1aW50OF90IGxlbl9vZl9vcHRpb25fYXNfc3RyaW5nW10gPSB7CisJW09QVElPTl9JUCAgICAgICAgICAgICAgXSA9IHNpemVvZigiMjU1LjI1NS4yNTUuMjU1ICIpLAorCVtPUFRJT05fSVBfUEFJUiAgICAgICAgIF0gPSBzaXplb2YoIjI1NS4yNTUuMjU1LjI1NSAiKSAqIDIsCisJW09QVElPTl9TVEFUSUNfUk9VVEVTICAgXSA9IHNpemVvZigiMjU1LjI1NS4yNTUuMjU1LzMyIDI1NS4yNTUuMjU1LjI1NSAiKSwKKwlbT1BUSU9OXzZSRCAgICAgICAgICAgICBdID0gc2l6ZW9mKCIzMiAxMjggZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmOmZmZmY6ZmZmZjpmZmZmIDI1NS4yNTUuMjU1LjI1NSAiKSwKKwlbT1BUSU9OX1NUUklORyAgICAgICAgICBdID0gMSwKKwlbT1BUSU9OX1NUUklOR19IT1NUICAgICBdID0gMSwKKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF9SRkMzMzk3CisJW09QVElPTl9ETlNfU1RSSU5HICAgICAgXSA9IDEsIC8qIHVudXNlZCAqLworCS8qIEhtbW0sIHRoaXMgc2V2ZXJlbHkgb3ZlcmVzdGltYXRlcyBzaXplIGlmIFNJUF9TRVJWRVJTIG9wdGlvbgorCSAqIGlzIGluIGRvbWFpbiBuYW1lIGZvcm06IE4tYnl0ZSBvcHRpb24gaW4gYmluYXJ5IGZvcm0KKwkgKiBtYWxsb2NzIH4xNipOIGJ5dGVzLiBCdXQgaXQgaXMgZnJlZWQgYWxtb3N0IGF0IG9uY2UuCisJICovCisJW09QVElPTl9TSVBfU0VSVkVSUyAgICAgXSA9IHNpemVvZigiMjU1LjI1NS4yNTUuMjU1ICIpLAorI2VuZGlmCisvLwlbT1BUSU9OX0JPT0xFQU4gICAgICAgICBdID0gc2l6ZW9mKCJ5ZXMgIiksCisJW09QVElPTl9VOCAgICAgICAgICAgICAgXSA9IHNpemVvZigiMjU1ICIpLAorCVtPUFRJT05fVTE2ICAgICAgICAgICAgIF0gPSBzaXplb2YoIjY1NTM1ICIpLAorLy8JW09QVElPTl9TMTYgICAgICAgICAgICAgXSA9IHNpemVvZigiLTMyNzY4ICIpLAorCVtPUFRJT05fVTMyICAgICAgICAgICAgIF0gPSBzaXplb2YoIjQyOTQ5NjcyOTUgIiksCisJW09QVElPTl9TMzIgICAgICAgICAgICAgXSA9IHNpemVvZigiLTIxNDc0ODM2ODQgIiksCit9OworCisvKiBub3RlOiBpcCBpcyBhIHBvaW50ZXIgdG8gYW4gSVAgaW4gbmV0d29yayBvcmRlciwgcG9zc2libHkgbWlzYWxpZ2VkICovCitzdGF0aWMgaW50IHNwcmludF9uaXAoY2hhciAqZGVzdCwgY29uc3QgY2hhciAqcHJlLCBjb25zdCB1aW50OF90ICppcCkKK3sKKwlyZXR1cm4gc3ByaW50ZihkZXN0LCAiJXMldS4ldS4ldS4ldSIsIHByZSwgaXBbMF0sIGlwWzFdLCBpcFsyXSwgaXBbM10pOworfQorCisvKiByZWFsbHkgc2ltcGxlIGltcGxlbWVudGF0aW9uLCBqdXN0IGNvdW50IHRoZSBiaXRzICovCitzdGF0aWMgaW50IG10b24odWludDMyX3QgbWFzaykKK3sKKwlpbnQgaSA9IDA7CisJbWFzayA9IG50b2hsKG1hc2spOyAvKiAxMTExMTAwMDAtbGlrZSBiaXQgcGF0dGVybiAqLworCXdoaWxlIChtYXNrKSB7CisJCWkrKzsKKwkJbWFzayA8PD0gMTsKKwl9CisJcmV0dXJuIGk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUENfU0FOSVRJWkVPUFQKKy8qIENoZWNrIGlmIGEgZ2l2ZW4gbGFiZWwgcmVwcmVzZW50cyBhIHZhbGlkIEROUyBsYWJlbAorICogUmV0dXJuIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUgbGFiZWwgdXBvbiBzdWNjZXNzLAorICogTlVMTCBvdGhlcndpc2UuCisgKiBTZWUgUkZDMTAzNSwgMi4zLjEKKyAqLworLyogV2UgZG9uJ3QgbmVlZCB0byBiZSBwYXJ0aWN1bGFybHkgYW5hbC4gRm9yIGV4YW1wbGUsIGFsbG93aW5nIF8sIGh5cGhlbgorICogYXQgdGhlIGVuZCwgb3IgbGVhZGluZyBhbmQgdHJhaWxpbmcgZG90cyB3b3VsZCBiZSBvaywgc2luY2UgaXQKKyAqIGNhbid0IGJlIHVzZWQgZm9yIGF0dGFja3MuIChMZWFkaW5nIGh5cGhlbiBjYW4gYmUsIGlmIHNvbWVvbmUgdXNlcworICogY21kICIkaG9zdG5hbWUiCisgKiBpbiB0aGUgc2NyaXB0OiB0aGVuIGhvc3RuYW1lIG1heSBiZSB0cmVhdGVkIGFzIGFuIG9wdGlvbikKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKnZhbGlkX2RvbWFpbl9sYWJlbChjb25zdCBjaGFyICpsYWJlbCkKK3sKKwl1bnNpZ25lZCBjaGFyIGNoOworCXVuc2lnbmVkIHBvcyA9IDA7CisKKwlmb3IgKDs7KSB7CisJCWNoID0gKmxhYmVsOworCQlpZiAoKGNofDB4MjApIDwgJ2EnIHx8IChjaHwweDIwKSA+ICd6JykgeworCQkJaWYgKGNoIDwgJzAnIHx8IGNoID4gJzknKSB7CisJCQkJaWYgKGNoID09ICdcMCcgfHwgY2ggPT0gJy4nKQorCQkJCQlyZXR1cm4gbGFiZWw7CisJCQkJLyogRE5TIGFsbG93cyBvbmx5ICctJywgYnV0IHdlIGFyZSBtb3JlIHBlcm1pc3NpdmUgKi8KKwkJCQlpZiAoY2ggIT0gJy0nICYmIGNoICE9ICdfJykKKwkJCQkJcmV0dXJuIE5VTEw7CisJCQl9CisJCX0KKwkJbGFiZWwrKzsKKwkJcG9zKys7CisJCS8vRG8gd2Ugd2FudCB0aGlzPworCQkvL2lmIChwb3MgPiA2MykgLyogTlNfTUFYTEFCRUw7IGxhYmVscyBtdXN0IGJlIDYzIGNoYXJzIG9yIGxlc3MgKi8KKwkJLy8JcmV0dXJuIE5VTEw7CisJfQorfQorCisvKiBDaGVjayBpZiBhIGdpdmVuIG5hbWUgcmVwcmVzZW50cyBhIHZhbGlkIEROUyBuYW1lICovCisvKiBTZWUgUkZDMTAzNSwgMi4zLjEgKi8KK3N0YXRpYyBpbnQgZ29vZF9ob3N0bmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCS8vY29uc3QgY2hhciAqc3RhcnQgPSBuYW1lOworCisJZm9yICg7OykgeworCQluYW1lID0gdmFsaWRfZG9tYWluX2xhYmVsKG5hbWUpOworCQlpZiAoIW5hbWUpCisJCQlyZXR1cm4gMDsKKwkJaWYgKCFuYW1lWzBdKQorCQkJcmV0dXJuIDE7CisJCQkvL0RvIHdlIHdhbnQgdGhpcz8KKwkJCS8vcmV0dXJuICgobmFtZSAtIHN0YXJ0KSA8IDEwMjUpOyAvKiBOU19NQVhETkFNRSAqLworCQluYW1lKys7CisJfQorfQorI2Vsc2UKKyMgZGVmaW5lIGdvb2RfaG9zdG5hbWUobmFtZSkgMQorI2VuZGlmCisKKy8qIENyZWF0ZSAib3B0X25hbWU9b3B0X3ZhbHVlIiBzdHJpbmcgKi8KK3N0YXRpYyBOT0lOTElORSBjaGFyICp4bWFsbG9jX29wdG5hbWVfb3B0dmFsKHVpbnQ4X3QgKm9wdGlvbiwgY29uc3Qgc3RydWN0IGRoY3Bfb3B0ZmxhZyAqb3B0ZmxhZywgY29uc3QgY2hhciAqb3B0X25hbWUpCit7CisJdW5zaWduZWQgdXBwZXJfbGVuZ3RoOworCWludCBsZW4sIHR5cGUsIG9wdGxlbjsKKwljaGFyICpkZXN0LCAqcmV0OworCisJLyogb3B0aW9uIHBvaW50cyB0byBPUFRfREFUQSwgbmVlZCB0byBnbyBiYWNrIHRvIGdldCBPUFRfTEVOICovCisJbGVuID0gb3B0aW9uWy1PUFRfREFUQSArIE9QVF9MRU5dOworCisJdHlwZSA9IG9wdGZsYWctPmZsYWdzICYgT1BUSU9OX1RZUEVfTUFTSzsKKwlvcHRsZW4gPSBkaGNwX29wdGlvbl9sZW5ndGhzW3R5cGVdOworCXVwcGVyX2xlbmd0aCA9IGxlbl9vZl9vcHRpb25fYXNfc3RyaW5nW3R5cGVdCisJCSogKCh1bnNpZ25lZCkobGVuICsgb3B0bGVuIC0gMSkgLyAodW5zaWduZWQpb3B0bGVuKTsKKworCWRlc3QgPSByZXQgPSB4bWFsbG9jKHVwcGVyX2xlbmd0aCArIHN0cmxlbihvcHRfbmFtZSkgKyAyKTsKKwlkZXN0ICs9IHNwcmludGYocmV0LCAiJXM9Iiwgb3B0X25hbWUpOworCisJd2hpbGUgKGxlbiA+PSBvcHRsZW4pIHsKKwkJc3dpdGNoICh0eXBlKSB7CisJCWNhc2UgT1BUSU9OX0lQOgorCQljYXNlIE9QVElPTl9JUF9QQUlSOgorCQkJZGVzdCArPSBzcHJpbnRfbmlwKGRlc3QsICIiLCBvcHRpb24pOworCQkJaWYgKHR5cGUgPT0gT1BUSU9OX0lQKQorCQkJCWJyZWFrOworCQkJZGVzdCArPSBzcHJpbnRfbmlwKGRlc3QsICIvIiwgb3B0aW9uICsgNCk7CisJCQlicmVhazsKKy8vCQljYXNlIE9QVElPTl9CT09MRUFOOgorLy8JCQlkZXN0ICs9IHNwcmludGYoZGVzdCwgKm9wdGlvbiA/ICJ5ZXMiIDogIm5vIik7CisvLwkJCWJyZWFrOworCQljYXNlIE9QVElPTl9VODoKKwkJCWRlc3QgKz0gc3ByaW50ZihkZXN0LCAiJXUiLCAqb3B0aW9uKTsKKwkJCWJyZWFrOworLy8JCWNhc2UgT1BUSU9OX1MxNjoKKwkJY2FzZSBPUFRJT05fVTE2OiB7CisJCQl1aW50MTZfdCB2YWxfdTE2OworCQkJbW92ZV9mcm9tX3VuYWxpZ25lZDE2KHZhbF91MTYsIG9wdGlvbik7CisJCQlkZXN0ICs9IHNwcmludGYoZGVzdCwgIiV1IiwgbnRvaHModmFsX3UxNikpOworCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBPUFRJT05fUzMyOgorCQljYXNlIE9QVElPTl9VMzI6IHsKKwkJCXVpbnQzMl90IHZhbF91MzI7CisJCQltb3ZlX2Zyb21fdW5hbGlnbmVkMzIodmFsX3UzMiwgb3B0aW9uKTsKKwkJCWRlc3QgKz0gc3ByaW50ZihkZXN0LCB0eXBlID09IE9QVElPTl9VMzIgPyAiJWx1IiA6ICIlbGQiLCAodW5zaWduZWQgbG9uZykgbnRvaGwodmFsX3UzMikpOworCQkJYnJlYWs7CisJCX0KKwkJLyogTm90ZTogb3B0aW9ucyB3aGljaCB1c2UgJ3JldHVybicgaW5zdGVhZCBvZiAnYnJlYWsnCisJCSAqIChmb3IgZXhhbXBsZSwgT1BUSU9OX1NUUklORykgc2tpcCB0aGUgY29kZSB3aGljaCBoYW5kbGVzCisJCSAqIHRoZSBjYXNlIG9mIGxpc3Qgb2Ygb3B0aW9ucy4KKwkJICovCisJCWNhc2UgT1BUSU9OX1NUUklORzoKKwkJY2FzZSBPUFRJT05fU1RSSU5HX0hPU1Q6CisJCQltZW1jcHkoZGVzdCwgb3B0aW9uLCBsZW4pOworCQkJZGVzdFtsZW5dID0gJ1wwJzsKKwkJCWlmICh0eXBlID09IE9QVElPTl9TVFJJTkdfSE9TVCAmJiAhZ29vZF9ob3N0bmFtZShkZXN0KSkKKwkJCQlzYWZlX3N0cm5jcHkoZGVzdCwgImJhZCIsIGxlbik7CisJCQlyZXR1cm4gcmV0OworCQljYXNlIE9QVElPTl9TVEFUSUNfUk9VVEVTOiB7CisJCQkvKiBPcHRpb24gYmluYXJ5IGZvcm1hdDoKKwkJCSAqIG1hc2sgW29uZSBieXRlLCAwLi4zMl0KKwkJCSAqIGlwIFtiaWcgZW5kaWFuLCAwLi40IGJ5dGVzIGRlcGVuZGluZyBvbiBtYXNrXQorCQkJICogcm91dGVyIFtiaWcgZW5kaWFuLCA0IGJ5dGVzXQorCQkJICogbWF5IGJlIHJlcGVhdGVkCisJCQkgKgorCQkJICogV2UgY29udmVydCBpdCB0byBhIHN0cmluZyAiSVAvTUFTSyBST1VURVIgSVAyL01BU0syIFJPVVRFUjIiCisJCQkgKi8KKwkJCWNvbnN0IGNoYXIgKnBmeCA9ICIiOworCisJCQl3aGlsZSAobGVuID49IDEgKyA0KSB7IC8qIG1hc2sgKyAwLWJ5dGUgaXAgKyByb3V0ZXIgKi8KKwkJCQl1aW50MzJfdCBuaXA7CisJCQkJdWludDhfdCAqcDsKKwkJCQl1bnNpZ25lZCBtYXNrOworCQkJCWludCBieXRlczsKKworCQkJCW1hc2sgPSAqb3B0aW9uKys7CisJCQkJaWYgKG1hc2sgPiAzMikKKwkJCQkJYnJlYWs7CisJCQkJbGVuLS07CisKKwkJCQluaXAgPSAwOworCQkJCXAgPSAodm9pZCopICZuaXA7CisJCQkJYnl0ZXMgPSAobWFzayArIDcpIC8gODsgLyogMCAtPiAwLCAxLi44IC0+IDEsIDkuLjE2IC0+IDIgZXRjICovCisJCQkJd2hpbGUgKC0tYnl0ZXMgPj0gMCkgeworCQkJCQkqcCsrID0gKm9wdGlvbisrOworCQkJCQlsZW4tLTsKKwkJCQl9CisJCQkJaWYgKGxlbiA8IDQpCisJCQkJCWJyZWFrOworCisJCQkJLyogcHJpbnQgaXAvbWFzayAqLworCQkJCWRlc3QgKz0gc3ByaW50X25pcChkZXN0LCBwZngsICh2b2lkKikgJm5pcCk7CisJCQkJcGZ4ID0gIiAiOworCQkJCWRlc3QgKz0gc3ByaW50ZihkZXN0LCAiLyV1ICIsIG1hc2spOworCQkJCS8qIHByaW50IHJvdXRlciAqLworCQkJCWRlc3QgKz0gc3ByaW50X25pcChkZXN0LCAiIiwgb3B0aW9uKTsKKwkJCQlvcHRpb24gKz0gNDsKKwkJCQlsZW4gLT0gNDsKKwkJCX0KKworCQkJcmV0dXJuIHJldDsKKwkJfQorCQljYXNlIE9QVElPTl82UkQ6CisJCQkvKiBPcHRpb24gYmluYXJ5IGZvcm1hdCAoc2VlIFJGQyA1OTY5KToKKwkJCSAqICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCisJCQkgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCisJCQkgKiArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKworCQkJICogfCAgT1BUSU9OXzZSRCAgIHwgb3B0aW9uLWxlbmd0aCB8ICBJUHY0TWFza0xlbiAgfCAgNnJkUHJlZml4TGVuIHwKKwkJCSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisJCQkgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgNnJkUHJlZml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorCQkJICogLi4uICAgICAgICAgICAgICAgICAgICAgICAgKDE2IG9jdGV0cykgICAgICAgICAgICAgICAgICAgICAgICAuLi4KKwkJCSAqICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCisJCQkgKiAuLi4gICAgICAgICAgICAgICAgICAgNnJkQlJJUHY0QWRkcmVzcyhlcykgICAgICAgICAgICAgICAgICAgIC4uLgorCQkJICogKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKKwkJCSAqIFdlIGNvbnZlcnQgaXQgdG8gYSBzdHJpbmcKKwkJCSAqICJJUHY0TWFza0xlbiA2cmRQcmVmaXhMZW4gNnJkUHJlZml4IDZyZEJSSVB2NEFkZHJlc3MuLi4iCisJCQkgKgorCQkJICogU2FuaXR5IGNoZWNrOiBlbnN1cmUgdGhhdCBvdXIgbGVuZ3RoIGlzIGF0IGxlYXN0IDIyIGJ5dGVzLCB0aGF0CisJCQkgKiBJUHY0TWFza0xlbiA8PSAzMiwKKwkJCSAqIDZyZFByZWZpeExlbiA8PSAxMjgsCisJCQkgKiA2cmRQcmVmaXhMZW4gKyAoMzIgLSBJUHY0TWFza0xlbikgPD0gMTI4CisJCQkgKiAoMm5kIGNvbmRpdGlvbiBuZWVkIG5vIGNoZWNrIC0gaXQgZm9sbG93cyBmcm9tIDFzdCBhbmQgM3JkKS4KKwkJCSAqIEVsc2UsIHJldHVybiBlbnZ2YXIgd2l0aCBlbXB0eSB2YWx1ZSAoIm9wdG5hbWU9IikKKwkJCSAqLworCQkJaWYgKGxlbiA+PSAoMSArIDEgKyAxNiArIDQpCisJCQkgJiYgb3B0aW9uWzBdIDw9IDMyCisJCQkgJiYgKG9wdGlvblsxXSArIDMyIC0gb3B0aW9uWzBdKSA8PSAxMjgKKwkJCSkgeworCQkJCS8qIElQdjRNYXNrTGVuICovCisJCQkJZGVzdCArPSBzcHJpbnRmKGRlc3QsICIldSAiLCAqb3B0aW9uKyspOworCQkJCS8qIDZyZFByZWZpeExlbiAqLworCQkJCWRlc3QgKz0gc3ByaW50ZihkZXN0LCAiJXUgIiwgKm9wdGlvbisrKTsKKwkJCQkvKiA2cmRQcmVmaXggKi8KKwkJCQlkZXN0ICs9IHNwcmludF9uaXA2KGRlc3QsIC8qICIiLCAqLyBvcHRpb24pOworCQkJCW9wdGlvbiArPSAxNjsKKwkJCQlsZW4gLT0gMSArIDEgKyAxNiArIDQ7CisJCQkJLyogIisgNCIgYWJvdmUgY29ycmVzcG9uZHMgdG8gdGhlIGxlbmd0aCBvZiBJUHY0IGFkZHIKKwkJCQkgKiB3ZSBjb25zdW1lIGluIHRoZSBsb29wIGJlbG93ICovCisJCQkJd2hpbGUgKDEpIHsKKwkJCQkJLyogNnJkQlJJUHY0QWRkcmVzcyhlcykgKi8KKwkJCQkJZGVzdCArPSBzcHJpbnRfbmlwKGRlc3QsICIgIiwgb3B0aW9uKTsKKwkJCQkJb3B0aW9uICs9IDQ7CisJCQkJCWxlbiAtPSA0OyAvKiBkbyB3ZSBoYXZlIHlldCBhbm90aGVyIDQrIGJ5dGVzPyAqLworCQkJCQlpZiAobGVuIDwgMCkKKwkJCQkJCWJyZWFrOyAvKiBubyAqLworCQkJCX0KKwkJCX0KKworCQkJcmV0dXJuIHJldDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF9SRkMzMzk3CisJCWNhc2UgT1BUSU9OX0ROU19TVFJJTkc6CisJCQkvKiB1bnBhY2sgb3B0aW9uIGludG8gZGVzdDsgdXNlIHJldCBmb3IgcHJlZml4IChpLmUuLCAib3B0bmFtZT0iKSAqLworCQkJZGVzdCA9IGRuYW1lX2RlYyhvcHRpb24sIGxlbiwgcmV0KTsKKwkJCWlmIChkZXN0KSB7CisJCQkJZnJlZShyZXQpOworCQkJCXJldHVybiBkZXN0OworCQkJfQorCQkJLyogZXJyb3IuIHJldHVybiAib3B0bmFtZT0iIHN0cmluZyAqLworCQkJcmV0dXJuIHJldDsKKwkJY2FzZSBPUFRJT05fU0lQX1NFUlZFUlM6CisJCQkvKiBPcHRpb24gYmluYXJ5IGZvcm1hdDoKKwkJCSAqIHR5cGU6IGJ5dGUKKwkJCSAqIHR5cGU9MDogZG9tYWluIG5hbWVzLCBkbnMtY29tcHJlc3NlZAorCQkJICogdHlwZT0xOiBJUCBhZGRycworCQkJICovCisJCQlvcHRpb24rKzsKKwkJCWxlbi0tOworCQkJaWYgKG9wdGlvblstMV0gPT0gMCkgeworCQkJCWRlc3QgPSBkbmFtZV9kZWMob3B0aW9uLCBsZW4sIHJldCk7CisJCQkJaWYgKGRlc3QpIHsKKwkJCQkJZnJlZShyZXQpOworCQkJCQlyZXR1cm4gZGVzdDsKKwkJCQl9CisJCQl9IGVsc2UKKwkJCWlmIChvcHRpb25bLTFdID09IDEpIHsKKwkJCQljb25zdCBjaGFyICpwZnggPSAiIjsKKwkJCQl3aGlsZSAoMSkgeworCQkJCQlsZW4gLT0gNDsKKwkJCQkJaWYgKGxlbiA8IDApCisJCQkJCQlicmVhazsKKwkJCQkJZGVzdCArPSBzcHJpbnRfbmlwKGRlc3QsIHBmeCwgb3B0aW9uKTsKKwkJCQkJcGZ4ID0gIiAiOworCQkJCQlvcHRpb24gKz0gNDsKKwkJCQl9CisJCQl9CisJCQlyZXR1cm4gcmV0OworI2VuZGlmCisJCX0gLyogc3dpdGNoICovCisKKwkJLyogSWYgd2UgYXJlIGhlcmUsIHRyeSB0byBmb3JtYXQgYW55IHJlbWFpbmluZyBkYXRhCisJCSAqIGluIHRoZSBvcHRpb24gYXMgYW5vdGhlciwgc2ltaWxhcmx5LWZvcm1hdHRlZCBvcHRpb24KKwkJICovCisJCW9wdGlvbiArPSBvcHRsZW47CisJCWxlbiAtPSBvcHRsZW47CisvLyBUT0RPOiBpdCBjYW4gYmUgYSBsaXN0IG9ubHkgaWYgKG9wdGZsYWctPmZsYWdzICYgT1BUSU9OX0xJU1QpLgorLy8gU2hvdWxkIHdlIGJhaWwgb3V0L3dhcm4gaWYgd2Ugc2VlIG11bHRpLWlwIG9wdGlvbiB3aGljaCBpcworLy8gbm90IGFsbG93ZWQgdG8gYmUgc3VjaCAoZm9yIGV4YW1wbGUsIERIQ1BfQlJPQURDQVNUKT8gLQorCQlpZiAobGVuIDwgb3B0bGVuIC8qIHx8ICEob3B0ZmxhZy0+ZmxhZ3MgJiBPUFRJT05fTElTVCkgKi8pCisJCQlicmVhazsKKwkJKmRlc3QrKyA9ICcgJzsKKwkJKmRlc3QgPSAnXDAnOworCX0gLyogd2hpbGUgKi8KKworCXJldHVybiByZXQ7Cit9CisKKy8qIHB1dCBhbGwgdGhlIHBhcmFtZXRlcnMgaW50byB0aGUgZW52aXJvbm1lbnQgKi8KK3N0YXRpYyBjaGFyICoqZmlsbF9lbnZwKHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0KQoreworCWludCBlbnZjOworCWludCBpOworCWNoYXIgKiplbnZwLCAqKmN1cnI7CisJY29uc3QgY2hhciAqb3B0X25hbWU7CisJdWludDhfdCAqdGVtcDsKKwl1aW50OF90IG92ZXJsb2FkID0gMDsKKworI2RlZmluZSBCSVRNQVAgdW5zaWduZWQKKyNkZWZpbmUgQkJJVFMgKHNpemVvZihCSVRNQVApICogOCkKKyNkZWZpbmUgQk1BU0soaSkgKDEgPDwgKGkgJiAoc2l6ZW9mKEJJVE1BUCkgKiA4IC0gMSkpKQorI2RlZmluZSBGT1VORF9PUFRTKGkpIChmb3VuZF9vcHRzWyh1bnNpZ25lZClpIC8gQkJJVFNdKQorCUJJVE1BUCBmb3VuZF9vcHRzWzI1NiAvIEJCSVRTXTsKKworCW1lbXNldChmb3VuZF9vcHRzLCAwLCBzaXplb2YoZm91bmRfb3B0cykpOworCisJLyogV2UgbmVlZCA2IGVsZW1lbnRzIGZvcjoKKwkgKiAiaW50ZXJmYWNlPUlGQUNFIgorCSAqICJpcD1OLk4uTi5OIiBmcm9tIHBhY2tldC0+eWlhZGRyCisJICogInNpYWRkcj1JUCIgZnJvbSBwYWNrZXQtPnNpYWRkcl9uaXAgKHVubGVzcyAwKQorCSAqICJib290X2ZpbGU9RklMRSIgZnJvbSBwYWNrZXQtPmZpbGUgKHVubGVzcyBvdmVybG9hZGVkKQorCSAqICJzbmFtZT1TRVJWRVJfSE9TVE5BTUUiIGZyb20gcGFja2V0LT5zbmFtZSAodW5sZXNzIG92ZXJsb2FkZWQpCisJICogdGVybWluYXRpbmcgTlVMTAorCSAqLworCWVudmMgPSA2OworCS8qICsxIGVsZW1lbnQgZm9yIGVhY2ggb3B0aW9uLCArMiBmb3Igc3VibmV0IG9wdGlvbjogKi8KKwlpZiAocGFja2V0KSB7CisJCS8qIG5vdGU6IGRvIG5vdCBzZWFyY2ggZm9yICJwYWQiICgwKSBhbmQgImVuZCIgKDI1NSkgb3B0aW9ucyAqLworLy9UT0RPOiBjaGFuZ2UgbG9naWMgdG8gc2NhbiBwYWNrZXQgX29uY2VfCisJCWZvciAoaSA9IDE7IGkgPCAyNTU7IGkrKykgeworCQkJdGVtcCA9IHVkaGNwX2dldF9vcHRpb24ocGFja2V0LCBpKTsKKwkJCWlmICh0ZW1wKSB7CisJCQkJaWYgKGkgPT0gREhDUF9PUFRJT05fT1ZFUkxPQUQpCisJCQkJCW92ZXJsb2FkID0gKnRlbXA7CisJCQkJZWxzZSBpZiAoaSA9PSBESENQX1NVQk5FVCkKKwkJCQkJZW52YysrOyAvKiBmb3IgJG1hc2sgKi8KKwkJCQllbnZjKys7CisJCQkJLyppZiAoaSAhPSBESENQX01FU1NBR0VfVFlQRSkqLworCQkJCUZPVU5EX09QVFMoaSkgfD0gQk1BU0soaSk7CisJCQl9CisJCX0KKwl9CisJY3VyciA9IGVudnAgPSB4emFsbG9jKHNpemVvZihlbnZwWzBdKSAqIGVudmMpOworCisJKmN1cnIgPSB4YXNwcmludGYoImludGVyZmFjZT0lcyIsIGNsaWVudF9jb25maWcuaW50ZXJmYWNlKTsKKwlwdXRlbnYoKmN1cnIrKyk7CisKKwlpZiAoIXBhY2tldCkKKwkJcmV0dXJuIGVudnA7CisKKwkvKiBFeHBvcnQgQk9PVFAgZmllbGRzLiBGaWVsZHMgd2UgZG9uJ3QgKHlldD8pIGV4cG9ydDoKKwkgKiB1aW50OF90IG9wOyAgICAgIC8vIGFsd2F5cyBCT09UUkVQTFkKKwkgKiB1aW50OF90IGh0eXBlOyAgIC8vIGhhcmR3YXJlIGFkZHJlc3MgdHlwZS4gMSA9IDEwbWIgZXRoZXJuZXQKKwkgKiB1aW50OF90IGhsZW47ICAgIC8vIGhhcmR3YXJlIGFkZHJlc3MgbGVuZ3RoCisJICogdWludDhfdCBob3BzOyAgICAvLyB1c2VkIGJ5IHJlbGF5IGFnZW50cyBvbmx5CisJICogdWludDMyX3QgeGlkOworCSAqIHVpbnQxNl90IHNlY3M7ICAgLy8gZWxhcHNlZCBzaW5jZSBjbGllbnQgYmVnYW4gYWNxdWlzaXRpb24vcmVuZXdhbAorCSAqIHVpbnQxNl90IGZsYWdzOyAgLy8gb25seSBvbmUgZmxhZyBzbyBmYXI6IGJjYXN0LiBOZXZlciBzZXQgYnkgc2VydmVyCisJICogdWludDMyX3QgY2lhZGRyOyAvLyBjbGllbnQgSVAgKHVzdWFsbHkgPT0geWlhZGRyLiBjYW4gaXQgYmUgZGlmZmVyZW50CisJICogICAgICAgICAgICAgICAgICAvLyBpZiBkdXJpbmcgcmVuZXcgc2VydmVyIHdhbnRzIHRvIGdpdmUgdXMgZGlmZmVybiBJUD8pCisJICogdWludDMyX3QgZ2F0ZXdheV9uaXA7IC8vIHJlbGF5IGFnZW50IElQIGFkZHJlc3MKKwkgKiB1aW50OF90IGNoYWRkclsxNl07IC8vIGxpbmstbGF5ZXIgY2xpZW50IGhhcmR3YXJlIGFkZHJlc3MgKE1BQykKKwkgKiBUT0RPOiBleHBvcnQgZ2F0ZXdheV9uaXAgYXMgJGdpYWRkcj8KKwkgKi8KKwkvKiBNb3N0IGltcG9ydGFudCBvbmU6IHlpYWRkciBhcyAkaXAgKi8KKwkqY3VyciA9IHhtYWxsb2Moc2l6ZW9mKCJpcD0yNTUuMjU1LjI1NS4yNTUiKSk7CisJc3ByaW50X25pcCgqY3VyciwgImlwPSIsICh1aW50OF90ICopICZwYWNrZXQtPnlpYWRkcik7CisJcHV0ZW52KCpjdXJyKyspOworCWlmIChwYWNrZXQtPnNpYWRkcl9uaXApIHsKKwkJLyogSVAgYWRkcmVzcyBvZiBuZXh0IHNlcnZlciB0byB1c2UgaW4gYm9vdHN0cmFwICovCisJCSpjdXJyID0geG1hbGxvYyhzaXplb2YoInNpYWRkcj0yNTUuMjU1LjI1NS4yNTUiKSk7CisJCXNwcmludF9uaXAoKmN1cnIsICJzaWFkZHI9IiwgKHVpbnQ4X3QgKikgJnBhY2tldC0+c2lhZGRyX25pcCk7CisJCXB1dGVudigqY3VycisrKTsKKwl9CisJaWYgKCEob3ZlcmxvYWQgJiBGSUxFX0ZJRUxEKSAmJiBwYWNrZXQtPmZpbGVbMF0pIHsKKwkJLyogd2F0Y2ggb3V0IGZvciBpbnZhbGlkIHBhY2tldHMgKi8KKwkJKmN1cnIgPSB4YXNwcmludGYoImJvb3RfZmlsZT0lLiJESENQX1BLVF9GSUxFX0xFTl9TVFIicyIsIHBhY2tldC0+ZmlsZSk7CisJCXB1dGVudigqY3VycisrKTsKKwl9CisJaWYgKCEob3ZlcmxvYWQgJiBTTkFNRV9GSUVMRCkgJiYgcGFja2V0LT5zbmFtZVswXSkgeworCQkvKiB3YXRjaCBvdXQgZm9yIGludmFsaWQgcGFja2V0cyAqLworCQkqY3VyciA9IHhhc3ByaW50Zigic25hbWU9JS4iREhDUF9QS1RfU05BTUVfTEVOX1NUUiJzIiwgcGFja2V0LT5zbmFtZSk7CisJCXB1dGVudigqY3VycisrKTsKKwl9CisKKwkvKiBFeHBvcnQga25vd24gREhDUCBvcHRpb25zICovCisJb3B0X25hbWUgPSBkaGNwX29wdGlvbl9zdHJpbmdzOworCWkgPSAwOworCXdoaWxlICgqb3B0X25hbWUpIHsKKwkJdWludDhfdCBjb2RlID0gZGhjcF9vcHRmbGFnc1tpXS5jb2RlOworCQlCSVRNQVAgKmZvdW5kX3B0ciA9ICZGT1VORF9PUFRTKGNvZGUpOworCQlCSVRNQVAgZm91bmRfbWFzayA9IEJNQVNLKGNvZGUpOworCQlpZiAoISgqZm91bmRfcHRyICYgZm91bmRfbWFzaykpCisJCQlnb3RvIG5leHQ7CisJCSpmb3VuZF9wdHIgJj0gfmZvdW5kX21hc2s7IC8qIGxlYXZlIG9ubHkgdW5rbm93biBvcHRpb25zICovCisJCXRlbXAgPSB1ZGhjcF9nZXRfb3B0aW9uKHBhY2tldCwgY29kZSk7CisJCSpjdXJyID0geG1hbGxvY19vcHRuYW1lX29wdHZhbCh0ZW1wLCAmZGhjcF9vcHRmbGFnc1tpXSwgb3B0X25hbWUpOworCQlwdXRlbnYoKmN1cnIrKyk7CisJCWlmIChjb2RlID09IERIQ1BfU1VCTkVUKSB7CisJCQkvKiBTdWJuZXQgb3B0aW9uOiBtYWtlIHRoaW5ncyBsaWtlICIkaXAvJG1hc2siIHBvc3NpYmxlICovCisJCQl1aW50MzJfdCBzdWJuZXQ7CisJCQltb3ZlX2Zyb21fdW5hbGlnbmVkMzIoc3VibmV0LCB0ZW1wKTsKKwkJCSpjdXJyID0geGFzcHJpbnRmKCJtYXNrPSV1IiwgbXRvbihzdWJuZXQpKTsKKwkJCXB1dGVudigqY3VycisrKTsKKwkJfQorIG5leHQ6CisJCW9wdF9uYW1lICs9IHN0cmxlbihvcHRfbmFtZSkgKyAxOworCQlpKys7CisJfQorCS8qIEV4cG9ydCB1bmtub3duIG9wdGlvbnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgMjU2OykgeworCQlCSVRNQVAgYml0bWFwID0gRk9VTkRfT1BUUyhpKTsKKwkJaWYgKCFiaXRtYXApIHsKKwkJCWkgKz0gQkJJVFM7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYml0bWFwICYgQk1BU0soaSkpIHsKKwkJCXVuc2lnbmVkIGxlbiwgb2ZzOworCisJCQl0ZW1wID0gdWRoY3BfZ2V0X29wdGlvbihwYWNrZXQsIGkpOworCQkJLyogdWRoY3BfZ2V0X29wdGlvbiByZXR1cm5zIHB0ciB0byBkYXRhIHBvcnRpb24sCisJCQkgKiBuZWVkIHRvIGdvIGJhY2sgdG8gZ2V0IGxlbgorCQkJICovCisJCQlsZW4gPSB0ZW1wWy1PUFRfREFUQSArIE9QVF9MRU5dOworCQkJKmN1cnIgPSB4bWFsbG9jKHNpemVvZigib3B0Tk5OPSIpICsgMSArIGxlbioyKTsKKwkJCW9mcyA9IHNwcmludGYoKmN1cnIsICJvcHQldT0iLCBpKTsKKwkJCSpiaW4yaGV4KCpjdXJyICsgb2ZzLCAodm9pZCopIHRlbXAsIGxlbikgPSAnXDAnOworCQkJcHV0ZW52KCpjdXJyKyspOworCQl9CisJCWkrKzsKKwl9CisKKwlyZXR1cm4gZW52cDsKK30KKworLyogQ2FsbCBhIHNjcmlwdCB3aXRoIGEgcGFyIGZpbGUgYW5kIGVudiB2YXJzICovCitzdGF0aWMgdm9pZCB1ZGhjcF9ydW5fc2NyaXB0KHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0LCBjb25zdCBjaGFyICpuYW1lKQoreworCWNoYXIgKiplbnZwLCAqKmN1cnI7CisJY2hhciAqYXJndlszXTsKKworCWVudnAgPSBmaWxsX2VudnAocGFja2V0KTsKKworCS8qIGNhbGwgc2NyaXB0ICovCisJbG9nMSgiRXhlY3V0aW5nICVzICVzIiwgY2xpZW50X2NvbmZpZy5zY3JpcHQsIG5hbWUpOworCWFyZ3ZbMF0gPSAoY2hhciopIGNsaWVudF9jb25maWcuc2NyaXB0OworCWFyZ3ZbMV0gPSAoY2hhciopIG5hbWU7CisJYXJndlsyXSA9IE5VTEw7CisJc3Bhd25fYW5kX3dhaXQoYXJndik7CisKKwlmb3IgKGN1cnIgPSBlbnZwOyAqY3VycjsgY3VycisrKSB7CisJCWxvZzIoIiAlcyIsICpjdXJyKTsKKwkJYmJfdW5zZXRlbnZfYW5kX2ZyZWUoKmN1cnIpOworCX0KKwlmcmVlKGVudnApOworfQorCisKKy8qKiogU2VuZGluZy9yZWNlaXZpbmcgcGFja2V0cyAqKiovCisKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHVpbnQzMl90IHJhbmRvbV94aWQodm9pZCkKK3sKKwlyZXR1cm4gcmFuZCgpOworfQorCisvKiBJbml0aWFsaXplIHRoZSBwYWNrZXQgd2l0aCB0aGUgcHJvcGVyIGRlZmF1bHRzICovCitzdGF0aWMgdm9pZCBpbml0X3BhY2tldChzdHJ1Y3QgZGhjcF9wYWNrZXQgKnBhY2tldCwgY2hhciB0eXBlKQoreworCXVpbnQxNl90IHNlY3M7CisKKwkvKiBGaWxsIGluOiBvcCwgaHR5cGUsIGhsZW4sIGNvb2tpZSBmaWVsZHM7IG1lc3NhZ2UgdHlwZSBvcHRpb246ICovCisJdWRoY3BfaW5pdF9oZWFkZXIocGFja2V0LCB0eXBlKTsKKworCXBhY2tldC0+eGlkID0gcmFuZG9tX3hpZCgpOworCisJY2xpZW50X2NvbmZpZy5sYXN0X3NlY3MgPSBtb25vdG9uaWNfc2VjKCk7CisJaWYgKGNsaWVudF9jb25maWcuZmlyc3Rfc2VjcyA9PSAwKQorCQljbGllbnRfY29uZmlnLmZpcnN0X3NlY3MgPSBjbGllbnRfY29uZmlnLmxhc3Rfc2VjczsKKwlzZWNzID0gY2xpZW50X2NvbmZpZy5sYXN0X3NlY3MgLSBjbGllbnRfY29uZmlnLmZpcnN0X3NlY3M7CisJcGFja2V0LT5zZWNzID0gaHRvbnMoc2Vjcyk7CisKKwltZW1jcHkocGFja2V0LT5jaGFkZHIsIGNsaWVudF9jb25maWcuY2xpZW50X21hYywgNik7CisJaWYgKGNsaWVudF9jb25maWcuY2xpZW50aWQpCisJCXVkaGNwX2FkZF9iaW5hcnlfb3B0aW9uKHBhY2tldCwgY2xpZW50X2NvbmZpZy5jbGllbnRpZCk7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9jbGllbnRfb3B0aW9ucyhzdHJ1Y3QgZGhjcF9wYWNrZXQgKnBhY2tldCkKK3sKKwlpbnQgaSwgZW5kLCBsZW47CisKKwl1ZGhjcF9hZGRfc2ltcGxlX29wdGlvbihwYWNrZXQsIERIQ1BfTUFYX1NJWkUsIGh0b25zKElQX1VEUF9ESENQX1NJWkUpKTsKKworCS8qIEFkZCBhICJwYXJhbSByZXEiIG9wdGlvbiB3aXRoIHRoZSBsaXN0IG9mIG9wdGlvbnMgd2UnZCBsaWtlIHRvIGhhdmUKKwkgKiBmcm9tIHN0dWJib3JuIERIQ1Agc2VydmVycy4gUHVsbCB0aGUgZGF0YSBmcm9tIHRoZSBzdHJ1Y3QgaW4gY29tbW9uLmMuCisJICogTm8gYm91bmRzIGNoZWNraW5nIGJlY2F1c2UgaXQgZ29lcyB0b3dhcmRzIHRoZSBoZWFkIG9mIHRoZSBwYWNrZXQuICovCisJZW5kID0gdWRoY3BfZW5kX29wdGlvbihwYWNrZXQtPm9wdGlvbnMpOworCWxlbiA9IDA7CisJZm9yIChpID0gMTsgaSA8IERIQ1BfRU5EOyBpKyspIHsKKwkJaWYgKGNsaWVudF9jb25maWcub3B0X21hc2tbaSA+PiAzXSAmICgxIDw8IChpICYgNykpKSB7CisJCQlwYWNrZXQtPm9wdGlvbnNbZW5kICsgT1BUX0RBVEEgKyBsZW5dID0gaTsKKwkJCWxlbisrOworCQl9CisJfQorCWlmIChsZW4pIHsKKwkJcGFja2V0LT5vcHRpb25zW2VuZCArIE9QVF9DT0RFXSA9IERIQ1BfUEFSQU1fUkVROworCQlwYWNrZXQtPm9wdGlvbnNbZW5kICsgT1BUX0xFTl0gPSBsZW47CisJCXBhY2tldC0+b3B0aW9uc1tlbmQgKyBPUFRfREFUQSArIGxlbl0gPSBESENQX0VORDsKKwl9CisKKwlpZiAoY2xpZW50X2NvbmZpZy52ZW5kb3JjbGFzcykKKwkJdWRoY3BfYWRkX2JpbmFyeV9vcHRpb24ocGFja2V0LCBjbGllbnRfY29uZmlnLnZlbmRvcmNsYXNzKTsKKwlpZiAoY2xpZW50X2NvbmZpZy5ob3N0bmFtZSkKKwkJdWRoY3BfYWRkX2JpbmFyeV9vcHRpb24ocGFja2V0LCBjbGllbnRfY29uZmlnLmhvc3RuYW1lKTsKKwlpZiAoY2xpZW50X2NvbmZpZy5mcWRuKQorCQl1ZGhjcF9hZGRfYmluYXJ5X29wdGlvbihwYWNrZXQsIGNsaWVudF9jb25maWcuZnFkbik7CisKKwkvKiBSZXF1ZXN0IGJyb2FkY2FzdCByZXBsaWVzIGlmIHdlIGhhdmUgbm8gSVAgYWRkciAqLworCWlmICgob3B0aW9uX21hc2szMiAmIE9QVF9CKSAmJiBwYWNrZXQtPmNpYWRkciA9PSAwKQorCQlwYWNrZXQtPmZsYWdzIHw9IGh0b25zKEJST0FEQ0FTVF9GTEFHKTsKKworCS8qIEFkZCAteCBvcHRpb25zIGlmIGFueSAqLworCXsKKwkJc3RydWN0IG9wdGlvbl9zZXQgKmN1cnIgPSBjbGllbnRfY29uZmlnLm9wdGlvbnM7CisJCXdoaWxlIChjdXJyKSB7CisJCQl1ZGhjcF9hZGRfYmluYXJ5X29wdGlvbihwYWNrZXQsIGN1cnItPmRhdGEpOworCQkJY3VyciA9IGN1cnItPm5leHQ7CisJCX0KKy8vCQlpZiAoY2xpZW50X2NvbmZpZy5zbmFtZSkKKy8vCQkJc3RybmNweSgoY2hhciopcGFja2V0LT5zbmFtZSwgY2xpZW50X2NvbmZpZy5zbmFtZSwgc2l6ZW9mKHBhY2tldC0+c25hbWUpIC0gMSk7CisvLwkJaWYgKGNsaWVudF9jb25maWcuYm9vdF9maWxlKQorLy8JCQlzdHJuY3B5KChjaGFyKilwYWNrZXQtPmZpbGUsIGNsaWVudF9jb25maWcuYm9vdF9maWxlLCBzaXplb2YocGFja2V0LT5maWxlKSAtIDEpOworCX0KKworCS8vIFRoaXMgd2lsbCBiZSBuZWVkZWQgaWYgd2UgcmVtb3ZlIC1WIFZFTkRPUl9TVFIgaW4gZmF2b3Igb2YKKwkvLyAteCB2ZW5kb3I6VkVORE9SX1NUUgorCS8vaWYgKCF1ZGhjcF9maW5kX29wdGlvbihwYWNrZXQub3B0aW9ucywgREhDUF9WRU5ET1IpKQorCS8vCS8qIG5vdCBzZXQsIHNldCB0aGUgZGVmYXVsdCB2ZW5kb3IgSUQgKi8KKwkvLwkuLi5hZGQgKERIQ1BfVkVORE9SLCAidWRoY3AgIkJCX1ZFUikgb3B0Li4uCit9CisKKy8qIFJGQyAyMTMxCisgKiA0LjQuNCBVc2Ugb2YgYnJvYWRjYXN0IGFuZCB1bmljYXN0CisgKgorICogVGhlIERIQ1AgY2xpZW50IGJyb2FkY2FzdHMgREhDUERJU0NPVkVSLCBESENQUkVRVUVTVCBhbmQgREhDUElORk9STQorICogbWVzc2FnZXMsIHVubGVzcyB0aGUgY2xpZW50IGtub3dzIHRoZSBhZGRyZXNzIG9mIGEgREhDUCBzZXJ2ZXIuCisgKiBUaGUgY2xpZW50IHVuaWNhc3RzIERIQ1BSRUxFQVNFIG1lc3NhZ2VzIHRvIHRoZSBzZXJ2ZXIuIEJlY2F1c2UKKyAqIHRoZSBjbGllbnQgaXMgZGVjbGluaW5nIHRoZSB1c2Ugb2YgdGhlIElQIGFkZHJlc3Mgc3VwcGxpZWQgYnkgdGhlIHNlcnZlciwKKyAqIHRoZSBjbGllbnQgYnJvYWRjYXN0cyBESENQREVDTElORSBtZXNzYWdlcy4KKyAqCisgKiBXaGVuIHRoZSBESENQIGNsaWVudCBrbm93cyB0aGUgYWRkcmVzcyBvZiBhIERIQ1Agc2VydmVyLCBpbiBlaXRoZXIKKyAqIElOSVQgb3IgUkVCT09USU5HIHN0YXRlLCB0aGUgY2xpZW50IG1heSB1c2UgdGhhdCBhZGRyZXNzCisgKiBpbiB0aGUgREhDUERJU0NPVkVSIG9yIERIQ1BSRVFVRVNUIHJhdGhlciB0aGFuIHRoZSBJUCBicm9hZGNhc3QgYWRkcmVzcy4KKyAqIFRoZSBjbGllbnQgbWF5IGFsc28gdXNlIHVuaWNhc3QgdG8gc2VuZCBESENQSU5GT1JNIG1lc3NhZ2VzCisgKiB0byBhIGtub3duIERIQ1Agc2VydmVyLiBJZiB0aGUgY2xpZW50IHJlY2VpdmVzIG5vIHJlc3BvbnNlIHRvIERIQ1AKKyAqIG1lc3NhZ2VzIHNlbnQgdG8gdGhlIElQIGFkZHJlc3Mgb2YgYSBrbm93biBESENQIHNlcnZlciwgdGhlIERIQ1AKKyAqIGNsaWVudCByZXZlcnRzIHRvIHVzaW5nIHRoZSBJUCBicm9hZGNhc3QgYWRkcmVzcy4KKyAqLworCitzdGF0aWMgaW50IHJhd19iY2FzdF9mcm9tX2NsaWVudF9jb25maWdfaWZpbmRleChzdHJ1Y3QgZGhjcF9wYWNrZXQgKnBhY2tldCkKK3sKKwlyZXR1cm4gdWRoY3Bfc2VuZF9yYXdfcGFja2V0KHBhY2tldCwKKwkJLypzcmMqLyBJTkFERFJfQU5ZLCBDTElFTlRfUE9SVCwKKwkJLypkc3QqLyBJTkFERFJfQlJPQURDQVNULCBTRVJWRVJfUE9SVCwgTUFDX0JDQVNUX0FERFIsCisJCWNsaWVudF9jb25maWcuaWZpbmRleCk7Cit9CisKK3N0YXRpYyBpbnQgYmNhc3Rfb3JfdWNhc3Qoc3RydWN0IGRoY3BfcGFja2V0ICpwYWNrZXQsIHVpbnQzMl90IGNpYWRkciwgdWludDMyX3Qgc2VydmVyKQoreworCWlmIChzZXJ2ZXIpCisJCXJldHVybiB1ZGhjcF9zZW5kX2tlcm5lbF9wYWNrZXQocGFja2V0LAorCQkJY2lhZGRyLCBDTElFTlRfUE9SVCwKKwkJCXNlcnZlciwgU0VSVkVSX1BPUlQpOworCXJldHVybiByYXdfYmNhc3RfZnJvbV9jbGllbnRfY29uZmlnX2lmaW5kZXgocGFja2V0KTsKK30KKworLyogQnJvYWRjYXN0IGEgREhDUCBkaXNjb3ZlciBwYWNrZXQgdG8gdGhlIG5ldHdvcmssIHdpdGggYW4gb3B0aW9uYWxseSByZXF1ZXN0ZWQgSVAgKi8KKy8qIE5PSU5MSU5FOiBsaW1pdCBzdGFjayB1c2FnZSBpbiBjYWxsZXIgKi8KK3N0YXRpYyBOT0lOTElORSBpbnQgc2VuZF9kaXNjb3Zlcih1aW50MzJfdCB4aWQsIHVpbnQzMl90IHJlcXVlc3RlZCkKK3sKKwlzdHJ1Y3QgZGhjcF9wYWNrZXQgcGFja2V0OworCisJLyogRmlsbCBpbjogb3AsIGh0eXBlLCBobGVuLCBjb29raWUsIGNoYWRkciBmaWVsZHMsCisJICogcmFuZG9tIHhpZCBmaWVsZCAod2Ugb3ZlcnJpZGUgaXQgYmVsb3cpLAorCSAqIGNsaWVudC1pZCBvcHRpb24gKHVubGVzcyAtQyksIG1lc3NhZ2UgdHlwZSBvcHRpb246CisJICovCisJaW5pdF9wYWNrZXQoJnBhY2tldCwgREhDUERJU0NPVkVSKTsKKworCXBhY2tldC54aWQgPSB4aWQ7CisJaWYgKHJlcXVlc3RlZCkKKwkJdWRoY3BfYWRkX3NpbXBsZV9vcHRpb24oJnBhY2tldCwgREhDUF9SRVFVRVNURURfSVAsIHJlcXVlc3RlZCk7CisKKwkvKiBBZGQgb3B0aW9uczogbWF4c2l6ZSwKKwkgKiBvcHRpb25hbGx5OiBob3N0bmFtZSwgZnFkbiwgdmVuZG9yY2xhc3MsCisJICogInBhcmFtIHJlcSIgb3B0aW9uIGFjY29yZGluZyB0byAtTywgb3B0aW9ucyBzcGVjaWZpZWQgd2l0aCAteAorCSAqLworCWFkZF9jbGllbnRfb3B0aW9ucygmcGFja2V0KTsKKworCWJiX2luZm9fbXNnKCJTZW5kaW5nIGRpc2NvdmVyLi4uIik7CisJcmV0dXJuIHJhd19iY2FzdF9mcm9tX2NsaWVudF9jb25maWdfaWZpbmRleCgmcGFja2V0KTsKK30KKworLyogQnJvYWRjYXN0IGEgREhDUCByZXF1ZXN0IG1lc3NhZ2UgKi8KKy8qIFJGQyAyMTMxIDMuMSBwYXJhZ3JhcGggMzoKKyAqICJUaGUgY2xpZW50IF9icm9hZGNhc3RzXyBhIERIQ1BSRVFVRVNUIG1lc3NhZ2UuLi4iCisgKi8KKy8qIE5PSU5MSU5FOiBsaW1pdCBzdGFjayB1c2FnZSBpbiBjYWxsZXIgKi8KK3N0YXRpYyBOT0lOTElORSBpbnQgc2VuZF9zZWxlY3QodWludDMyX3QgeGlkLCB1aW50MzJfdCBzZXJ2ZXIsIHVpbnQzMl90IHJlcXVlc3RlZCkKK3sKKwlzdHJ1Y3QgZGhjcF9wYWNrZXQgcGFja2V0OworCXN0cnVjdCBpbl9hZGRyIGFkZHI7CisKKy8qCisgKiBSRkMgMjEzMSA0LjMuMiBESENQUkVRVUVTVCBtZXNzYWdlCisgKiAuLi4KKyAqIElmIHRoZSBESENQUkVRVUVTVCBtZXNzYWdlIGNvbnRhaW5zIGEgJ3NlcnZlciBpZGVudGlmaWVyJworICogb3B0aW9uLCB0aGUgbWVzc2FnZSBpcyBpbiByZXNwb25zZSB0byBhIERIQ1BPRkZFUiBtZXNzYWdlLgorICogT3RoZXJ3aXNlLCB0aGUgbWVzc2FnZSBpcyBhIHJlcXVlc3QgdG8gdmVyaWZ5IG9yIGV4dGVuZCBhbgorICogZXhpc3RpbmcgbGVhc2UuIElmIHRoZSBjbGllbnQgdXNlcyBhICdjbGllbnQgaWRlbnRpZmllcicKKyAqIGluIGEgREhDUFJFUVVFU1QgbWVzc2FnZSwgaXQgTVVTVCB1c2UgdGhhdCBzYW1lICdjbGllbnQgaWRlbnRpZmllcicKKyAqIGluIGFsbCBzdWJzZXF1ZW50IG1lc3NhZ2VzLiBJZiB0aGUgY2xpZW50IGluY2x1ZGVkIGEgbGlzdAorICogb2YgcmVxdWVzdGVkIHBhcmFtZXRlcnMgaW4gYSBESENQRElTQ09WRVIgbWVzc2FnZSwgaXQgTVVTVAorICogaW5jbHVkZSB0aGF0IGxpc3QgaW4gYWxsIHN1YnNlcXVlbnQgbWVzc2FnZXMuCisgKi8KKwkvKiBGaWxsIGluOiBvcCwgaHR5cGUsIGhsZW4sIGNvb2tpZSwgY2hhZGRyIGZpZWxkcywKKwkgKiByYW5kb20geGlkIGZpZWxkICh3ZSBvdmVycmlkZSBpdCBiZWxvdyksCisJICogY2xpZW50LWlkIG9wdGlvbiAodW5sZXNzIC1DKSwgbWVzc2FnZSB0eXBlIG9wdGlvbjoKKwkgKi8KKwlpbml0X3BhY2tldCgmcGFja2V0LCBESENQUkVRVUVTVCk7CisKKwlwYWNrZXQueGlkID0geGlkOworCXVkaGNwX2FkZF9zaW1wbGVfb3B0aW9uKCZwYWNrZXQsIERIQ1BfUkVRVUVTVEVEX0lQLCByZXF1ZXN0ZWQpOworCisJdWRoY3BfYWRkX3NpbXBsZV9vcHRpb24oJnBhY2tldCwgREhDUF9TRVJWRVJfSUQsIHNlcnZlcik7CisKKwkvKiBBZGQgb3B0aW9uczogbWF4c2l6ZSwKKwkgKiBvcHRpb25hbGx5OiBob3N0bmFtZSwgZnFkbiwgdmVuZG9yY2xhc3MsCisJICogInBhcmFtIHJlcSIgb3B0aW9uIGFjY29yZGluZyB0byAtTywgYW5kIG9wdGlvbnMgc3BlY2lmaWVkIHdpdGggLXgKKwkgKi8KKwlhZGRfY2xpZW50X29wdGlvbnMoJnBhY2tldCk7CisKKwlhZGRyLnNfYWRkciA9IHJlcXVlc3RlZDsKKwliYl9pbmZvX21zZygiU2VuZGluZyBzZWxlY3QgZm9yICVzLi4uIiwgaW5ldF9udG9hKGFkZHIpKTsKKwlyZXR1cm4gcmF3X2JjYXN0X2Zyb21fY2xpZW50X2NvbmZpZ19pZmluZGV4KCZwYWNrZXQpOworfQorCisvKiBVbmljYXN0IG9yIGJyb2FkY2FzdCBhIERIQ1AgcmVuZXcgbWVzc2FnZSAqLworLyogTk9JTkxJTkU6IGxpbWl0IHN0YWNrIHVzYWdlIGluIGNhbGxlciAqLworc3RhdGljIE5PSU5MSU5FIGludCBzZW5kX3JlbmV3KHVpbnQzMl90IHhpZCwgdWludDMyX3Qgc2VydmVyLCB1aW50MzJfdCBjaWFkZHIpCit7CisJc3RydWN0IGRoY3BfcGFja2V0IHBhY2tldDsKKworLyoKKyAqIFJGQyAyMTMxIDQuMy4yIERIQ1BSRVFVRVNUIG1lc3NhZ2UKKyAqIC4uLgorICogREhDUFJFUVVFU1QgZ2VuZXJhdGVkIGR1cmluZyBSRU5FV0lORyBzdGF0ZToKKyAqCisgKiAnc2VydmVyIGlkZW50aWZpZXInIE1VU1QgTk9UIGJlIGZpbGxlZCBpbiwgJ3JlcXVlc3RlZCBJUCBhZGRyZXNzJworICogb3B0aW9uIE1VU1QgTk9UIGJlIGZpbGxlZCBpbiwgJ2NpYWRkcicgTVVTVCBiZSBmaWxsZWQgaW4gd2l0aAorICogY2xpZW50J3MgSVAgYWRkcmVzcy4gSW4gdGhpcyBzaXR1YXRpb24sIHRoZSBjbGllbnQgaXMgY29tcGxldGVseQorICogY29uZmlndXJlZCwgYW5kIGlzIHRyeWluZyB0byBleHRlbmQgaXRzIGxlYXNlLiBUaGlzIG1lc3NhZ2Ugd2lsbAorICogYmUgdW5pY2FzdCwgc28gbm8gcmVsYXkgYWdlbnRzIHdpbGwgYmUgaW52b2x2ZWQgaW4gaXRzCisgKiB0cmFuc21pc3Npb24uICBCZWNhdXNlICdnaWFkZHInIGlzIHRoZXJlZm9yZSBub3QgZmlsbGVkIGluLCB0aGUKKyAqIERIQ1Agc2VydmVyIHdpbGwgdHJ1c3QgdGhlIHZhbHVlIGluICdjaWFkZHInLCBhbmQgdXNlIGl0IHdoZW4KKyAqIHJlcGx5aW5nIHRvIHRoZSBjbGllbnQuCisgKi8KKwkvKiBGaWxsIGluOiBvcCwgaHR5cGUsIGhsZW4sIGNvb2tpZSwgY2hhZGRyIGZpZWxkcywKKwkgKiByYW5kb20geGlkIGZpZWxkICh3ZSBvdmVycmlkZSBpdCBiZWxvdyksCisJICogY2xpZW50LWlkIG9wdGlvbiAodW5sZXNzIC1DKSwgbWVzc2FnZSB0eXBlIG9wdGlvbjoKKwkgKi8KKwlpbml0X3BhY2tldCgmcGFja2V0LCBESENQUkVRVUVTVCk7CisKKwlwYWNrZXQueGlkID0geGlkOworCXBhY2tldC5jaWFkZHIgPSBjaWFkZHI7CisKKwkvKiBBZGQgb3B0aW9uczogbWF4c2l6ZSwKKwkgKiBvcHRpb25hbGx5OiBob3N0bmFtZSwgZnFkbiwgdmVuZG9yY2xhc3MsCisJICogInBhcmFtIHJlcSIgb3B0aW9uIGFjY29yZGluZyB0byAtTywgYW5kIG9wdGlvbnMgc3BlY2lmaWVkIHdpdGggLXgKKwkgKi8KKwlhZGRfY2xpZW50X29wdGlvbnMoJnBhY2tldCk7CisKKwliYl9pbmZvX21zZygiU2VuZGluZyByZW5ldy4uLiIpOworCXJldHVybiBiY2FzdF9vcl91Y2FzdCgmcGFja2V0LCBjaWFkZHIsIHNlcnZlcik7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUENfQVJQSU5HCisvKiBCcm9hZGNhc3QgYSBESENQIGRlY2xpbmUgbWVzc2FnZSAqLworLyogTk9JTkxJTkU6IGxpbWl0IHN0YWNrIHVzYWdlIGluIGNhbGxlciAqLworc3RhdGljIE5PSU5MSU5FIGludCBzZW5kX2RlY2xpbmUoLyp1aW50MzJfdCB4aWQsKi8gdWludDMyX3Qgc2VydmVyLCB1aW50MzJfdCByZXF1ZXN0ZWQpCit7CisJc3RydWN0IGRoY3BfcGFja2V0IHBhY2tldDsKKworCS8qIEZpbGwgaW46IG9wLCBodHlwZSwgaGxlbiwgY29va2llLCBjaGFkZHIsIHJhbmRvbSB4aWQgZmllbGRzLAorCSAqIGNsaWVudC1pZCBvcHRpb24gKHVubGVzcyAtQyksIG1lc3NhZ2UgdHlwZSBvcHRpb246CisJICovCisJaW5pdF9wYWNrZXQoJnBhY2tldCwgREhDUERFQ0xJTkUpOworCisjaWYgMAorCS8qIFJGQyAyMTMxIHNheXMgREhDUERFQ0xJTkUncyB4aWQgaXMgcmFuZG9tbHkgc2VsZWN0ZWQgYnkgY2xpZW50LAorCSAqIGJ1dCBpbiBjYXNlIHRoZSBzZXJ2ZXIgaXMgYnVnZ3kgYW5kIHdhbnRzIERIQ1BERUNMSU5FJ3MgeGlkCisJICogdG8gbWF0Y2ggdGhlIHhpZCB3aGljaCBzdGFydGVkIGVudGlyZSBoYW5kc2hha2UsCisJICogd2UgdXNlIHRoZSBzYW1lIHhpZCB3ZSB1c2VkIGluIGluaXRpYWwgREhDUERJU0NPVkVSOgorCSAqLworCXBhY2tldC54aWQgPSB4aWQ7CisjZW5kaWYKKwkvKiBESENQREVDTElORSB1c2VzICJyZXF1ZXN0ZWQgaXAiLCBub3QgY2lhZGRyLCB0byBzdG9yZSBvZmZlcmVkIElQICovCisJdWRoY3BfYWRkX3NpbXBsZV9vcHRpb24oJnBhY2tldCwgREhDUF9SRVFVRVNURURfSVAsIHJlcXVlc3RlZCk7CisKKwl1ZGhjcF9hZGRfc2ltcGxlX29wdGlvbigmcGFja2V0LCBESENQX1NFUlZFUl9JRCwgc2VydmVyKTsKKworCWJiX2luZm9fbXNnKCJTZW5kaW5nIGRlY2xpbmUuLi4iKTsKKwlyZXR1cm4gcmF3X2JjYXN0X2Zyb21fY2xpZW50X2NvbmZpZ19pZmluZGV4KCZwYWNrZXQpOworfQorI2VuZGlmCisKKy8qIFVuaWNhc3QgYSBESENQIHJlbGVhc2UgbWVzc2FnZSAqLworc3RhdGljIGludCBzZW5kX3JlbGVhc2UodWludDMyX3Qgc2VydmVyLCB1aW50MzJfdCBjaWFkZHIpCit7CisJc3RydWN0IGRoY3BfcGFja2V0IHBhY2tldDsKKworCS8qIEZpbGwgaW46IG9wLCBodHlwZSwgaGxlbiwgY29va2llLCBjaGFkZHIsIHJhbmRvbSB4aWQgZmllbGRzLAorCSAqIGNsaWVudC1pZCBvcHRpb24gKHVubGVzcyAtQyksIG1lc3NhZ2UgdHlwZSBvcHRpb246CisJICovCisJaW5pdF9wYWNrZXQoJnBhY2tldCwgREhDUFJFTEVBU0UpOworCisJLyogREhDUFJFTEVBU0UgdXNlcyBjaWFkZHIsIG5vdCAicmVxdWVzdGVkIGlwIiwgdG8gc3RvcmUgSVAgYmVpbmcgcmVsZWFzZWQgKi8KKwlwYWNrZXQuY2lhZGRyID0gY2lhZGRyOworCisJdWRoY3BfYWRkX3NpbXBsZV9vcHRpb24oJnBhY2tldCwgREhDUF9TRVJWRVJfSUQsIHNlcnZlcik7CisKKwliYl9pbmZvX21zZygiU2VuZGluZyByZWxlYXNlLi4uIik7CisJLyogTm90ZTogbm9ybWFsbHkgd2UgdW5pY2FzdCBoZXJlIHNpbmNlICJzZXJ2ZXIiIGlzIG5vdCB6ZXJvLgorCSAqIEhvd2V2ZXIsIHRoZXJlIF9hcmVfIHBlb3BsZSB3aG8gcnVuICJhZGRyZXNzLWxlc3MiIERIQ1Agc2VydmVycywKKwkgKiBhbmQgcmVwb3J0ZWRseSBJU0MgZGhjcCBjbGllbnQgYW5kIFdpbmRvd3MgYWxsb3cgdGhhdC4KKwkgKi8KKwlyZXR1cm4gYmNhc3Rfb3JfdWNhc3QoJnBhY2tldCwgY2lhZGRyLCBzZXJ2ZXIpOworfQorCisvKiBSZXR1cm5zIC0xIG9uIGVycm9ycyB0aGF0IGFyZSBmYXRhbCBmb3IgdGhlIHNvY2tldCwgLTIgZm9yIHRob3NlIHRoYXQgYXJlbid0ICovCisvKiBOT0lOTElORTogbGltaXQgc3RhY2sgdXNhZ2UgaW4gY2FsbGVyICovCitzdGF0aWMgTk9JTkxJTkUgaW50IHVkaGNwX3JlY3ZfcmF3X3BhY2tldChzdHJ1Y3QgZGhjcF9wYWNrZXQgKmRoY3BfcGt0LCBpbnQgZmQpCit7CisJaW50IGJ5dGVzOworCXN0cnVjdCBpcF91ZHBfZGhjcF9wYWNrZXQgcGFja2V0OworCXVpbnQxNl90IGNoZWNrOworCXVuc2lnbmVkIGNoYXIgY21zZ2J1ZltDTVNHX0xFTihzaXplb2Yoc3RydWN0IHRwYWNrZXRfYXV4ZGF0YSkpXTsKKwlzdHJ1Y3QgaW92ZWMgaW92OworCXN0cnVjdCBtc2doZHIgbXNnOworCXN0cnVjdCBjbXNnaGRyICpjbXNnOworCisJLyogdXNlZCB0byB1c2UganVzdCBzYWZlX3JlYWQoZmQsICZwYWNrZXQsIHNpemVvZihwYWNrZXQpKQorCSAqIGJ1dCB3ZSBuZWVkIHRvIGNoZWNrIGZvciBUUF9TVEFUVVNfQ1NVTU5PVFJFQURZIDooCisJICovCisJaW92Lmlvdl9iYXNlID0gJnBhY2tldDsKKwlpb3YuaW92X2xlbiA9IHNpemVvZihwYWNrZXQpOworCW1lbXNldCgmbXNnLCAwLCBzaXplb2YobXNnKSk7CisJbXNnLm1zZ19pb3YgPSAmaW92OworCW1zZy5tc2dfaW92bGVuID0gMTsKKwltc2cubXNnX2NvbnRyb2wgPSBjbXNnYnVmOworCW1zZy5tc2dfY29udHJvbGxlbiA9IHNpemVvZihjbXNnYnVmKTsKKwlmb3IgKDs7KSB7CisJCWJ5dGVzID0gcmVjdm1zZyhmZCwgJm1zZywgMCk7CisJCWlmIChieXRlcyA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCQljb250aW51ZTsKKwkJCWxvZzEoIlBhY2tldCByZWFkIGVycm9yLCBpZ25vcmluZyIpOworCQkJLyogTkI6IHBvc3NpYmxlIGRvd24gaW50ZXJmYWNlLCBldGMuIENhbGxlciBzaG91bGQgcGF1c2UuICovCisJCQlyZXR1cm4gYnl0ZXM7IC8qIHJldHVybnMgLTEgKi8KKwkJfQorCQlicmVhazsKKwl9CisKKwlpZiAoYnl0ZXMgPCAoaW50KSAoc2l6ZW9mKHBhY2tldC5pcCkgKyBzaXplb2YocGFja2V0LnVkcCkpKSB7CisJCWxvZzEoIlBhY2tldCBpcyB0b28gc2hvcnQsIGlnbm9yaW5nIik7CisJCXJldHVybiAtMjsKKwl9CisKKwlpZiAoYnl0ZXMgPCBudG9ocyhwYWNrZXQuaXAudG90X2xlbikpIHsKKwkJLyogcGFja2V0IGlzIGJpZ2dlciB0aGFuIHNpemVvZihwYWNrZXQpLCB3ZSBkaWQgcGFydGlhbCByZWFkICovCisJCWxvZzEoIk92ZXJzaXplZCBwYWNrZXQsIGlnbm9yaW5nIik7CisJCXJldHVybiAtMjsKKwl9CisKKwkvKiBpZ25vcmUgYW55IGV4dHJhIGdhcmJhZ2UgYnl0ZXMgKi8KKwlieXRlcyA9IG50b2hzKHBhY2tldC5pcC50b3RfbGVuKTsKKworCS8qIG1ha2Ugc3VyZSBpdHMgdGhlIHJpZ2h0IHBhY2tldCBmb3IgdXMsIGFuZCB0aGF0IGl0IHBhc3NlcyBzYW5pdHkgY2hlY2tzICovCisJaWYgKHBhY2tldC5pcC5wcm90b2NvbCAhPSBJUFBST1RPX1VEUAorCSB8fCBwYWNrZXQuaXAudmVyc2lvbiAhPSBJUFZFUlNJT04KKwkgfHwgcGFja2V0LmlwLmlobCAhPSAoc2l6ZW9mKHBhY2tldC5pcCkgPj4gMikKKwkgfHwgcGFja2V0LnVkcC5kZXN0ICE9IGh0b25zKENMSUVOVF9QT1JUKQorCS8qIHx8IGJ5dGVzID4gKGludCkgc2l6ZW9mKHBhY2tldCkgLSBjYW4ndCBoYXBwZW4gKi8KKwkgfHwgbnRvaHMocGFja2V0LnVkcC5sZW4pICE9ICh1aW50MTZfdCkoYnl0ZXMgLSBzaXplb2YocGFja2V0LmlwKSkKKwkpIHsKKwkJbG9nMSgiVW5yZWxhdGVkL2JvZ3VzIHBhY2tldCwgaWdub3JpbmciKTsKKwkJcmV0dXJuIC0yOworCX0KKworCS8qIHZlcmlmeSBJUCBjaGVja3N1bSAqLworCWNoZWNrID0gcGFja2V0LmlwLmNoZWNrOworCXBhY2tldC5pcC5jaGVjayA9IDA7CisJaWYgKGNoZWNrICE9IGluZXRfY2tzdW0oKHVpbnQxNl90ICopJnBhY2tldC5pcCwgc2l6ZW9mKHBhY2tldC5pcCkpKSB7CisJCWxvZzEoIkJhZCBJUCBoZWFkZXIgY2hlY2tzdW0sIGlnbm9yaW5nIik7CisJCXJldHVybiAtMjsKKwl9CisKKwlmb3IgKGNtc2cgPSBDTVNHX0ZJUlNUSERSKCZtc2cpOyBjbXNnOyBjbXNnID0gQ01TR19OWFRIRFIoJm1zZywgY21zZykpIHsKKwkJaWYgKGNtc2ctPmNtc2dfbGV2ZWwgPT0gU09MX1BBQ0tFVAorCQkgJiYgY21zZy0+Y21zZ190eXBlID09IFBBQ0tFVF9BVVhEQVRBCisJCSkgeworCQkJLyogc29tZSBWTXMgZG9uJ3QgY2hlY2tzdW0gVURQIGFuZCBUQ1AgZGF0YQorCQkJICogdGhleSBzZW5kIHRvIHRoZSBzYW1lIHBoeXNpY2FsIG1hY2hpbmUsCisJCQkgKiBoZXJlIHdlIGRldGVjdCB0aGlzIGNhc2U6CisJCQkgKi8KKwkJCXN0cnVjdCB0cGFja2V0X2F1eGRhdGEgKmF1eCA9ICh2b2lkICopQ01TR19EQVRBKGNtc2cpOworCQkJaWYgKGF1eC0+dHBfc3RhdHVzICYgVFBfU1RBVFVTX0NTVU1OT1RSRUFEWSkKKwkJCQlnb3RvIHNraXBfdWRwX3N1bV9jaGVjazsKKwkJfQorCX0KKworCS8qIHZlcmlmeSBVRFAgY2hlY2tzdW0uIElQIGhlYWRlciBoYXMgdG8gYmUgbW9kaWZpZWQgZm9yIHRoaXMgKi8KKwltZW1zZXQoJnBhY2tldC5pcCwgMCwgb2Zmc2V0b2Yoc3RydWN0IGlwaGRyLCBwcm90b2NvbCkpOworCS8qIGlwLnh4IGZpZWxkcyB3aGljaCBhcmUgbm90IG1lbXNldDogcHJvdG9jb2wsIGNoZWNrLCBzYWRkciwgZGFkZHIgKi8KKwlwYWNrZXQuaXAudG90X2xlbiA9IHBhY2tldC51ZHAubGVuOyAvKiB5ZXMsIHRoaXMgaXMgbmVlZGVkICovCisJY2hlY2sgPSBwYWNrZXQudWRwLmNoZWNrOworCXBhY2tldC51ZHAuY2hlY2sgPSAwOworCWlmIChjaGVjayAmJiBjaGVjayAhPSBpbmV0X2Nrc3VtKCh1aW50MTZfdCAqKSZwYWNrZXQsIGJ5dGVzKSkgeworCQlsb2cxKCJQYWNrZXQgd2l0aCBiYWQgVURQIGNoZWNrc3VtIHJlY2VpdmVkLCBpZ25vcmluZyIpOworCQlyZXR1cm4gLTI7CisJfQorIHNraXBfdWRwX3N1bV9jaGVjazoKKworCWlmIChwYWNrZXQuZGF0YS5jb29raWUgIT0gaHRvbmwoREhDUF9NQUdJQykpIHsKKwkJYmJfaW5mb19tc2coIlBhY2tldCB3aXRoIGJhZCBtYWdpYywgaWdub3JpbmciKTsKKwkJcmV0dXJuIC0yOworCX0KKworCWxvZzEoIlJlY2VpdmVkIGEgcGFja2V0Iik7CisJdWRoY3BfZHVtcF9wYWNrZXQoJnBhY2tldC5kYXRhKTsKKworCWJ5dGVzIC09IHNpemVvZihwYWNrZXQuaXApICsgc2l6ZW9mKHBhY2tldC51ZHApOworCW1lbWNweShkaGNwX3BrdCwgJnBhY2tldC5kYXRhLCBieXRlcyk7CisJcmV0dXJuIGJ5dGVzOworfQorCisKKy8qKiogTWFpbiAqKiovCisKK3N0YXRpYyBpbnQgc29ja2ZkID0gLTE7CisKKyNkZWZpbmUgTElTVEVOX05PTkUgICAwCisjZGVmaW5lIExJU1RFTl9LRVJORUwgMQorI2RlZmluZSBMSVNURU5fUkFXICAgIDIKK3N0YXRpYyBzbWFsbGludCBsaXN0ZW5fbW9kZTsKKworLyogaW5pdGlhbCBzdGF0ZTogKHJlKXN0YXJ0IERIQ1AgbmVnb3RpYXRpb24gKi8KKyNkZWZpbmUgSU5JVF9TRUxFQ1RJTkcgIDAKKy8qIGRpc2NvdmVyIHdhcyBzZW50LCBESENQT0ZGRVIgcmVwbHkgcmVjZWl2ZWQgKi8KKyNkZWZpbmUgUkVRVUVTVElORyAgICAgIDEKKy8qIHNlbGVjdC9yZW5ldyB3YXMgc2VudCwgREhDUEFDSyByZXBseSByZWNlaXZlZCAqLworI2RlZmluZSBCT1VORCAgICAgICAgICAgMgorLyogaGFsZiBvZiBsZWFzZSBwYXNzZWQsIHdhbnQgdG8gcmVuZXcgaXQgYnkgc2VuZGluZyB1bmljYXN0IHJlbmV3IHJlcXVlc3RzICovCisjZGVmaW5lIFJFTkVXSU5HICAgICAgICAzCisvKiByZW5ldyByZXF1ZXN0cyB3ZXJlIG5vdCBhbnN3ZXJlZCwgbGVhc2UgaXMgYWxtb3N0IG92ZXIsIHNlbmQgYnJvYWRjYXN0IHJlbmV3ICovCisjZGVmaW5lIFJFQklORElORyAgICAgICA0CisvKiBtYW51YWxseSByZXF1ZXN0ZWQgcmVuZXcgKFNJR1VTUjEpICovCisjZGVmaW5lIFJFTkVXX1JFUVVFU1RFRCA1CisvKiByZWxlYXNlLCBwb3NzaWJseSBtYW51YWxseSByZXF1ZXN0ZWQgKFNJR1VTUjIpICovCisjZGVmaW5lIFJFTEVBU0VEICAgICAgICA2CitzdGF0aWMgc21hbGxpbnQgc3RhdGU7CisKK3N0YXRpYyBpbnQgdWRoY3BfcmF3X3NvY2tldChpbnQgaWZpbmRleCkKK3sKKwlpbnQgZmQ7CisJc3RydWN0IHNvY2thZGRyX2xsIHNvY2s7CisKKwlsb2cxKCJPcGVuaW5nIHJhdyBzb2NrZXQgb24gaWZpbmRleCAlZCIsIGlmaW5kZXgpOyAvL2xvZzI/CisKKwlmZCA9IHhzb2NrZXQoUEZfUEFDS0VULCBTT0NLX0RHUkFNLCBodG9ucyhFVEhfUF9JUCkpOworCS8qIF5eXl5eCisJICogU09DS19ER1JBTTogcmVtb3ZlIGxpbmstbGF5ZXIgaGVhZGVycyBvbiBpbnB1dCAoU09DS19SQVcga2VlcHMgdGhlbSkKKwkgKiBFVEhfUF9JUDogd2FudCB0byByZWNlaXZlIG9ubHkgcGFja2V0cyB3aXRoIElQdjQgZXRoIHR5cGUKKwkgKi8KKwlsb2cxKCJHb3QgcmF3IHNvY2tldCBmZCIpOyAvL2xvZzI/CisKKwlzb2NrLnNsbF9mYW1pbHkgPSBBRl9QQUNLRVQ7CisJc29jay5zbGxfcHJvdG9jb2wgPSBodG9ucyhFVEhfUF9JUCk7CisJc29jay5zbGxfaWZpbmRleCA9IGlmaW5kZXg7CisJeGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNvY2ssIHNpemVvZihzb2NrKSk7CisKKyNpZiAwIC8qIFNldmVyYWwgdXNlcnMgcmVwb3J0ZWQgYnJlYWthZ2Ugd2hlbiBCUEYgZmlsdGVyIGlzIHVzZWQgKi8KKwlpZiAoQ0xJRU5UX1BPUlQgPT0gNjgpIHsKKwkJLyogVXNlIG9ubHkgaWYgc3RhbmRhcmQgcG9ydCBpcyBpbiB1c2UgKi8KKwkJLyoKKwkJICoJSSd2ZSBzZWxlY3RlZCBub3QgdG8gc2VlIExMIGhlYWRlciwgc28gQlBGIGRvZXNuJ3Qgc2VlIGl0LCB0b28uCisJCSAqCVRoZSBmaWx0ZXIgbWF5IGFsc28gcGFzcyBub24tSVAgYW5kIG5vbi1BUlAgcGFja2V0cywgYnV0IHdlIGRvCisJCSAqCWEgbW9yZSBjb21wbGV0ZSBjaGVjayB3aGVuIHJlY2VpdmluZyB0aGUgbWVzc2FnZSBpbiB1c2Vyc3BhY2UuCisJCSAqCisJCSAqIGFuZCBmaWx0ZXIgc2hhbWVsZXNzbHkgc3RvbGVuIGZyb206CisJCSAqCisJCSAqCWh0dHA6Ly93d3cuZmxhbWV3YXJtYXN0ZXIuZGUvc29mdHdhcmUvZGhjcGNsaWVudC8KKwkJICoKKwkJICogVGhlcmUgYXJlIGEgZmV3IG90aGVyIGludGVyZXN0aW5nIGlkZWFzIG9uIHRoYXQgcGFnZSAobG9vayB1bmRlcgorCQkgKiAiTW90aXZhdGlvbiIpLiAgVXNlIG9mIG5ldGxpbmsgZXZlbnRzIGlzIG1vc3QgaW50ZXJlc3RpbmcuICBUaGluaworCQkgKiBvZiB2YXJpb3VzIG5ldHdvcmsgc2VydmVycyBsaXN0ZW5pbmcgZm9yIGV2ZW50cyBhbmQgcmVjb25maWd1cmluZy4KKwkJICogVGhhdCB3b3VsZCBvYnNvbGV0ZSBzZW5kaW5nIEhVUCBzaWduYWxzIGFuZC9vciBtYWtlIHVzZSBvZiByZXN0YXJ0cy4KKwkJICoKKwkJICogQ29weXJpZ2h0OiAyMDA2LCAyMDA3IFN0ZWZhbiBSb21wZiA8c3V4QGxvcGxvZi5kZT4uCisJCSAqIExpY2Vuc2U6IEdQTCB2Mi4KKwkJICovCisJCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29ja19maWx0ZXIgZmlsdGVyX2luc3RyW10gPSB7CisJCQkvKiBsb2FkIDl0aCBieXRlIChwcm90b2NvbCkgKi8KKwkJCUJQRl9TVE1UKEJQRl9MRHxCUEZfQnxCUEZfQUJTLCA5KSwKKwkJCS8qIGp1bXAgdG8gTDEgaWYgaXQgaXMgSVBQUk9UT19VRFAsIGVsc2UgdG8gTDQgKi8KKwkJCUJQRl9KVU1QKEJQRl9KTVB8QlBGX0pFUXxCUEZfSywgSVBQUk9UT19VRFAsIDAsIDYpLAorCQkJLyogTDE6IGxvYWQgaGFsZndvcmQgZnJvbSBvZmZzZXQgNiAoZmxhZ3MgYW5kIGZyYWcgb2Zmc2V0KSAqLworCQkJQlBGX1NUTVQoQlBGX0xEfEJQRl9IfEJQRl9BQlMsIDYpLAorCQkJLyoganVtcCB0byBMNCBpZiBhbnkgYml0cyBpbiBmcmFnIG9mZnNldCBmaWVsZCBhcmUgc2V0LCBlbHNlIHRvIEwyICovCisJCQlCUEZfSlVNUChCUEZfSk1QfEJQRl9KU0VUfEJQRl9LLCAweDFmZmYsIDQsIDApLAorCQkJLyogTDI6IHNraXAgSVAgaGVhZGVyIChsb2FkIGluZGV4IHJlZyB3aXRoIGhlYWRlciBsZW4pICovCisJCQlCUEZfU1RNVChCUEZfTERYfEJQRl9CfEJQRl9NU0gsIDApLAorCQkJLyogbG9hZCB1ZHAgZGVzdGluYXRpb24gcG9ydCBmcm9tIGhhbGZ3b3JkW2hlYWRlcl9sZW4gKyAyXSAqLworCQkJQlBGX1NUTVQoQlBGX0xEfEJQRl9IfEJQRl9JTkQsIDIpLAorCQkJLyoganVtcCB0byBMMyBpZiB1ZHAgZHBvcnQgaXMgQ0xJRU5UX1BPUlQsIGVsc2UgdG8gTDQgKi8KKwkJCUJQRl9KVU1QKEJQRl9KTVB8QlBGX0pFUXxCUEZfSywgNjgsIDAsIDEpLAorCQkJLyogTDM6IGFjY2VwdCBwYWNrZXQgKCJhY2NlcHQgMHg3ZmZmZmZmZiBieXRlcyIpICovCisJCQkvKiBBY2NlcHRpbmcgMHhmZmZmZmZmZiB3b3JrcyB0b28gYnV0IGtlcm5lbCAyLjYuMTkgaXMgYnVnZ3kgKi8KKwkJCUJQRl9TVE1UKEJQRl9SRVR8QlBGX0ssIDB4N2ZmZmZmZmYpLAorCQkJLyogTDQ6IGRpc2NhcmQgcGFja2V0ICgiYWNjZXB0IHplcm8gYnl0ZXMiKSAqLworCQkJQlBGX1NUTVQoQlBGX1JFVHxCUEZfSywgMCksCisJCX07CisJCXN0YXRpYyBjb25zdCBzdHJ1Y3Qgc29ja19mcHJvZyBmaWx0ZXJfcHJvZyA9IHsKKwkJCS5sZW4gPSBzaXplb2YoZmlsdGVyX2luc3RyKSAvIHNpemVvZihmaWx0ZXJfaW5zdHJbMF0pLAorCQkJLyogY2FzdGluZyBjb25zdCBhd2F5OiAqLworCQkJLmZpbHRlciA9IChzdHJ1Y3Qgc29ja19maWx0ZXIgKikgZmlsdGVyX2luc3RyLAorCQl9OworCQkvKiBJZ25vcmluZyBlcnJvciAoa2VybmVsIG1heSBsYWNrIHN1cHBvcnQgZm9yIHRoaXMpICovCisJCWlmIChzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19BVFRBQ0hfRklMVEVSLCAmZmlsdGVyX3Byb2csCisJCQkJc2l6ZW9mKGZpbHRlcl9wcm9nKSkgPj0gMCkKKwkJCWxvZzEoIkF0dGFjaGVkIGZpbHRlciB0byByYXcgc29ja2V0IGZkIik7IC8vIGxvZz8KKwl9CisjZW5kaWYKKworCWlmIChzZXRzb2Nrb3B0XzEoZmQsIFNPTF9QQUNLRVQsIFBBQ0tFVF9BVVhEQVRBKSAhPSAwKSB7CisJCWlmIChlcnJubyAhPSBFTk9QUk9UT09QVCkKKwkJCWxvZzEoIkNhbid0IHNldCBQQUNLRVRfQVVYREFUQSBvbiByYXcgc29ja2V0Iik7CisJfQorCisJbG9nMSgiQ3JlYXRlZCByYXcgc29ja2V0Iik7CisKKwlyZXR1cm4gZmQ7Cit9CisKK3N0YXRpYyB2b2lkIGNoYW5nZV9saXN0ZW5fbW9kZShpbnQgbmV3X21vZGUpCit7CisJbG9nMSgiRW50ZXJpbmcgbGlzdGVuIG1vZGU6ICVzIiwKKwkJbmV3X21vZGUgIT0gTElTVEVOX05PTkUKKwkJCT8gKG5ld19tb2RlID09IExJU1RFTl9LRVJORUwgPyAia2VybmVsIiA6ICJyYXciKQorCQkJOiAibm9uZSIKKwkpOworCisJbGlzdGVuX21vZGUgPSBuZXdfbW9kZTsKKwlpZiAoc29ja2ZkID49IDApIHsKKwkJY2xvc2Uoc29ja2ZkKTsKKwkJc29ja2ZkID0gLTE7CisJfQorCWlmIChuZXdfbW9kZSA9PSBMSVNURU5fS0VSTkVMKQorCQlzb2NrZmQgPSB1ZGhjcF9saXN0ZW5fc29ja2V0KC8qSU5BRERSX0FOWSwqLyBDTElFTlRfUE9SVCwgY2xpZW50X2NvbmZpZy5pbnRlcmZhY2UpOworCWVsc2UgaWYgKG5ld19tb2RlICE9IExJU1RFTl9OT05FKQorCQlzb2NrZmQgPSB1ZGhjcF9yYXdfc29ja2V0KGNsaWVudF9jb25maWcuaWZpbmRleCk7CisJLyogZWxzZSBMSVNURU5fTk9ORTogc29ja2ZkIHN0YXlzIGNsb3NlZCAqLworfQorCisvKiBDYWxsZWQgb25seSBvbiBTSUdVU1IxICovCitzdGF0aWMgdm9pZCBwZXJmb3JtX3JlbmV3KHZvaWQpCit7CisJYmJfaW5mb19tc2coIlBlcmZvcm1pbmcgYSBESENQIHJlbmV3Iik7CisJc3dpdGNoIChzdGF0ZSkgeworCWNhc2UgQk9VTkQ6CisJCWNoYW5nZV9saXN0ZW5fbW9kZShMSVNURU5fS0VSTkVMKTsKKwljYXNlIFJFTkVXSU5HOgorCWNhc2UgUkVCSU5ESU5HOgorCQlzdGF0ZSA9IFJFTkVXX1JFUVVFU1RFRDsKKwkJYnJlYWs7CisJY2FzZSBSRU5FV19SRVFVRVNURUQ6IC8qIGltcGF0aWVudCBhcmUgd2U/IGZpbmUsIHNxdWFyZSAxICovCisJCXVkaGNwX3J1bl9zY3JpcHQoTlVMTCwgImRlY29uZmlnIik7CisJY2FzZSBSRVFVRVNUSU5HOgorCWNhc2UgUkVMRUFTRUQ6CisJCWNoYW5nZV9saXN0ZW5fbW9kZShMSVNURU5fUkFXKTsKKwkJc3RhdGUgPSBJTklUX1NFTEVDVElORzsKKwkJYnJlYWs7CisJY2FzZSBJTklUX1NFTEVDVElORzoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCBwZXJmb3JtX3JlbGVhc2UodWludDMyX3Qgc2VydmVyX2FkZHIsIHVpbnQzMl90IHJlcXVlc3RlZF9pcCkKK3sKKwljaGFyIGJ1ZmZlcltzaXplb2YoIjI1NS4yNTUuMjU1LjI1NSIpXTsKKwlzdHJ1Y3QgaW5fYWRkciB0ZW1wX2FkZHI7CisKKwkvKiBzZW5kIHJlbGVhc2UgcGFja2V0ICovCisJaWYgKHN0YXRlID09IEJPVU5EIHx8IHN0YXRlID09IFJFTkVXSU5HIHx8IHN0YXRlID09IFJFQklORElORykgeworCQl0ZW1wX2FkZHIuc19hZGRyID0gc2VydmVyX2FkZHI7CisJCXN0cmNweShidWZmZXIsIGluZXRfbnRvYSh0ZW1wX2FkZHIpKTsKKwkJdGVtcF9hZGRyLnNfYWRkciA9IHJlcXVlc3RlZF9pcDsKKwkJYmJfaW5mb19tc2coIlVuaWNhc3RpbmcgYSByZWxlYXNlIG9mICVzIHRvICVzIiwKKwkJCQlpbmV0X250b2EodGVtcF9hZGRyKSwgYnVmZmVyKTsKKwkJc2VuZF9yZWxlYXNlKHNlcnZlcl9hZGRyLCByZXF1ZXN0ZWRfaXApOyAvKiB1bmljYXN0ICovCisJCXVkaGNwX3J1bl9zY3JpcHQoTlVMTCwgImRlY29uZmlnIik7CisJfQorCWJiX2luZm9fbXNnKCJFbnRlcmluZyByZWxlYXNlZCBzdGF0ZSIpOworCisJY2hhbmdlX2xpc3Rlbl9tb2RlKExJU1RFTl9OT05FKTsKKwlzdGF0ZSA9IFJFTEVBU0VEOworfQorCitzdGF0aWMgdWludDhfdCogYWxsb2NfZGhjcF9vcHRpb24oaW50IGNvZGUsIGNvbnN0IGNoYXIgKnN0ciwgaW50IGV4dHJhKQoreworCXVpbnQ4X3QgKnN0b3JhZ2U7CisJaW50IGxlbiA9IHN0cm5sZW4oc3RyLCAyNTUpOworCXN0b3JhZ2UgPSB4emFsbG9jKGxlbiArIGV4dHJhICsgT1BUX0RBVEEpOworCXN0b3JhZ2VbT1BUX0NPREVdID0gY29kZTsKKwlzdG9yYWdlW09QVF9MRU5dID0gbGVuICsgZXh0cmE7CisJbWVtY3B5KHN0b3JhZ2UgKyBleHRyYSArIE9QVF9EQVRBLCBzdHIsIGxlbik7CisJcmV0dXJuIHN0b3JhZ2U7Cit9CisKKyNpZiBCQl9NTVUKK3N0YXRpYyB2b2lkIGNsaWVudF9iYWNrZ3JvdW5kKHZvaWQpCit7CisJYmJfZGFlbW9uaXplKDApOworCWxvZ21vZGUgJj0gfkxPR01PREVfU1RESU87CisJLyogcmV3cml0ZSBwaWRmaWxlLCBhcyBvdXIgcGlkIGlzIGRpZmZlcmVudCBub3cgKi8KKwl3cml0ZV9waWRmaWxlKGNsaWVudF9jb25maWcucGlkZmlsZSk7Cit9CisjZW5kaWYKKworLy91c2FnZTojaWYgZGVmaW5lZCBDT05GSUdfVURIQ1BfREVCVUcgJiYgQ09ORklHX1VESENQX0RFQlVHID49IDEKKy8vdXNhZ2U6IyBkZWZpbmUgSUZfVURIQ1BfVkVSQk9TRSguLi4pIF9fVkFfQVJHU19fCisvL3VzYWdlOiNlbHNlCisvL3VzYWdlOiMgZGVmaW5lIElGX1VESENQX1ZFUkJPU0UoLi4uKQorLy91c2FnZTojZW5kaWYKKy8vdXNhZ2U6I2RlZmluZSB1ZGhjcGNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZmJxIklGX1VESENQX1ZFUkJPU0UoInYiKSJSQl0iSUZfRkVBVFVSRV9VREhDUENfQVJQSU5HKCIgWy1hW01TRUNdXSIpIiBbLXQgTl0gWy1UIFNFQ10gWy1BIFNFQy8tbl1cbiIKKy8vdXNhZ2U6ICAgICAgICIJWy1pIElGQUNFXSJJRl9GRUFUVVJFX1VESENQX1BPUlQoIiBbLVAgUE9SVF0iKSIgWy1zIFBST0ddIFstcCBQSURGSUxFXVxuIgorLy91c2FnZTogICAgICAgIglbLW9DXSBbLXIgSVBdIFstViBWRU5ET1JdIFstRiBOQU1FXSBbLXggT1BUOlZBTF0uLi4gWy1PIE9QVF0uLi4iCisvL3VzYWdlOiNkZWZpbmUgdWRoY3BjX2Z1bGxfdXNhZ2UgIlxuIgorLy91c2FnZToJSUZfTE9OR19PUFRTKAorLy91c2FnZTogICAgICJcbgktaSwtLWludGVyZmFjZSBJRkFDRQlJbnRlcmZhY2UgdG8gdXNlIChkZWZhdWx0IGV0aDApIgorLy91c2FnZToJSUZfRkVBVFVSRV9VREhDUF9QT1JUKAorLy91c2FnZTogICAgICJcbgktUCwtLWNsaWVudC1wb3J0IFBPUlQJVXNlIFBPUlQgKGRlZmF1bHQgNjgpIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktcywtLXNjcmlwdCBQUk9HCVJ1biBQUk9HIGF0IERIQ1AgZXZlbnRzIChkZWZhdWx0ICJDT05GSUdfVURIQ1BDX0RFRkFVTFRfU0NSSVBUIikiCisvL3VzYWdlOiAgICAgIlxuCS1wLC0tcGlkZmlsZSBGSUxFCUNyZWF0ZSBwaWRmaWxlIgorLy91c2FnZTogICAgICJcbgktQiwtLWJyb2FkY2FzdAkJUmVxdWVzdCBicm9hZGNhc3QgcmVwbGllcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXQsLS1yZXRyaWVzIE4JCVNlbmQgdXAgdG8gTiBkaXNjb3ZlciBwYWNrZXRzIChkZWZhdWx0IDMpIgorLy91c2FnZTogICAgICJcbgktVCwtLXRpbWVvdXQgU0VDCVBhdXNlIGJldHdlZW4gcGFja2V0cyAoZGVmYXVsdCAzKSIKKy8vdXNhZ2U6ICAgICAiXG4JLUEsLS10cnlhZ2FpbiBTRUMJV2FpdCBpZiBsZWFzZSBpcyBub3Qgb2J0YWluZWQgKGRlZmF1bHQgMjApIgorLy91c2FnZTogICAgICJcbgktbiwtLW5vdwkJRXhpdCBpZiBsZWFzZSBpcyBub3Qgb2J0YWluZWQiCisvL3VzYWdlOiAgICAgIlxuCS1xLC0tcXVpdAkJRXhpdCBhZnRlciBvYnRhaW5pbmcgbGVhc2UiCisvL3VzYWdlOiAgICAgIlxuCS1SLC0tcmVsZWFzZQkJUmVsZWFzZSBJUCBvbiBleGl0IgorLy91c2FnZTogICAgICJcbgktZiwtLWZvcmVncm91bmQJCVJ1biBpbiBmb3JlZ3JvdW5kIgorLy91c2FnZToJVVNFX0ZPUl9NTVUoCisvL3VzYWdlOiAgICAgIlxuCS1iLC0tYmFja2dyb3VuZAkJQmFja2dyb3VuZCBpZiBsZWFzZSBpcyBub3Qgb2J0YWluZWQiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1TLC0tc3lzbG9nCQlMb2cgdG8gc3lzbG9nIHRvbyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVURIQ1BDX0FSUElORygKKy8vdXNhZ2U6ICAgICAiXG4JLWFbTVNFQ10sLS1hcnBpbmdbPU1TRUNdIFZhbGlkYXRlIG9mZmVyZWQgYWRkcmVzcyB3aXRoIEFSUCBwaW5nIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktciwtLXJlcXVlc3QgSVAJCVJlcXVlc3QgdGhpcyBJUCBhZGRyZXNzIgorLy91c2FnZTogICAgICJcbgktbywtLW5vLWRlZmF1bHQtb3B0aW9ucwlEb24ndCByZXF1ZXN0IGFueSBvcHRpb25zICh1bmxlc3MgLU8gaXMgZ2l2ZW4pIgorLy91c2FnZTogICAgICJcbgktTywtLXJlcXVlc3Qtb3B0aW9uIE9QVAlSZXF1ZXN0IG9wdGlvbiBPUFQgZnJvbSBzZXJ2ZXIgKGN1bXVsYXRpdmUpIgorLy91c2FnZTogICAgICJcbgkteCBPUFQ6VkFMCQlJbmNsdWRlIG9wdGlvbiBPUFQgaW4gc2VudCBwYWNrZXRzIChjdW11bGF0aXZlKSIKKy8vdXNhZ2U6ICAgICAiXG4JCQkJRXhhbXBsZXMgb2Ygc3RyaW5nLCBudW1lcmljLCBhbmQgaGV4IGJ5dGUgb3B0czoiCisvL3VzYWdlOiAgICAgIlxuCQkJCS14IGhvc3RuYW1lOmJib3ggLSBvcHRpb24gMTIiCisvL3VzYWdlOiAgICAgIlxuCQkJCS14IGxlYXNlOjM2MDAgLSBvcHRpb24gNTEgKGxlYXNlIHRpbWUpIgorLy91c2FnZTogICAgICJcbgkJCQkteCAweDNkOjAxMDBCRUVGQzBGRkVFIC0gb3B0aW9uIDYxIChjbGllbnQgaWQpIgorLy91c2FnZTogICAgICJcbgktRiwtLWZxZG4gTkFNRQkJQXNrIHNlcnZlciB0byB1cGRhdGUgRE5TIG1hcHBpbmcgZm9yIE5BTUUiCisvL3VzYWdlOiAgICAgIlxuCS1WLC0tdmVuZG9yY2xhc3MgVkVORE9SCVZlbmRvciBpZGVudGlmaWVyIChkZWZhdWx0ICd1ZGhjcCBWRVJTSU9OJykiCisvL3VzYWdlOiAgICAgIlxuCS1DLC0tY2xpZW50aWQtbm9uZQlEb24ndCBzZW5kIE1BQyBhcyBjbGllbnQgaWRlbnRpZmllciIKKy8vdXNhZ2U6CUlGX1VESENQX1ZFUkJPU0UoCisvL3VzYWdlOiAgICAgIlxuCS12CQkJVmVyYm9zZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgIlxuCS1pIElGQUNFCUludGVyZmFjZSB0byB1c2UgKGRlZmF1bHQgZXRoMCkiCisvL3VzYWdlOglJRl9GRUFUVVJFX1VESENQX1BPUlQoCisvL3VzYWdlOiAgICAgIlxuCS1QIFBPUlQJCVVzZSBQT1JUIChkZWZhdWx0IDY4KSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXMgUFJPRwkJUnVuIFBST0cgYXQgREhDUCBldmVudHMgKGRlZmF1bHQgIkNPTkZJR19VREhDUENfREVGQVVMVF9TQ1JJUFQiKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAgRklMRQkJQ3JlYXRlIHBpZGZpbGUiCisvL3VzYWdlOiAgICAgIlxuCS1CCQlSZXF1ZXN0IGJyb2FkY2FzdCByZXBsaWVzIgorLy91c2FnZTogICAgICJcbgktdCBOCQlTZW5kIHVwIHRvIE4gZGlzY292ZXIgcGFja2V0cyAoZGVmYXVsdCAzKSIKKy8vdXNhZ2U6ICAgICAiXG4JLVQgU0VDCQlQYXVzZSBiZXR3ZWVuIHBhY2tldHMgKGRlZmF1bHQgMykiCisvL3VzYWdlOiAgICAgIlxuCS1BIFNFQwkJV2FpdCBpZiBsZWFzZSBpcyBub3Qgb2J0YWluZWQgKGRlZmF1bHQgMjApIgorLy91c2FnZTogICAgICJcbgktbgkJRXhpdCBpZiBsZWFzZSBpcyBub3Qgb2J0YWluZWQiCisvL3VzYWdlOiAgICAgIlxuCS1xCQlFeGl0IGFmdGVyIG9idGFpbmluZyBsZWFzZSIKKy8vdXNhZ2U6ICAgICAiXG4JLVIJCVJlbGVhc2UgSVAgb24gZXhpdCIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJCVJ1biBpbiBmb3JlZ3JvdW5kIgorLy91c2FnZToJVVNFX0ZPUl9NTVUoCisvL3VzYWdlOiAgICAgIlxuCS1iCQlCYWNrZ3JvdW5kIGlmIGxlYXNlIGlzIG5vdCBvYnRhaW5lZCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLVMJCUxvZyB0byBzeXNsb2cgdG9vIgorLy91c2FnZToJSUZfRkVBVFVSRV9VREhDUENfQVJQSU5HKAorLy91c2FnZTogICAgICJcbgktYVtNU0VDXQlWYWxpZGF0ZSBvZmZlcmVkIGFkZHJlc3Mgd2l0aCBBUlAgcGluZyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLXIgSVAJCVJlcXVlc3QgdGhpcyBJUCBhZGRyZXNzIgorLy91c2FnZTogICAgICJcbgktbwkJRG9uJ3QgcmVxdWVzdCBhbnkgb3B0aW9ucyAodW5sZXNzIC1PIGlzIGdpdmVuKSIKKy8vdXNhZ2U6ICAgICAiXG4JLU8gT1BUCQlSZXF1ZXN0IG9wdGlvbiBPUFQgZnJvbSBzZXJ2ZXIgKGN1bXVsYXRpdmUpIgorLy91c2FnZTogICAgICJcbgkteCBPUFQ6VkFMCUluY2x1ZGUgb3B0aW9uIE9QVCBpbiBzZW50IHBhY2tldHMgKGN1bXVsYXRpdmUpIgorLy91c2FnZTogICAgICJcbgkJCUV4YW1wbGVzIG9mIHN0cmluZywgbnVtZXJpYywgYW5kIGhleCBieXRlIG9wdHM6IgorLy91c2FnZTogICAgICJcbgkJCS14IGhvc3RuYW1lOmJib3ggLSBvcHRpb24gMTIiCisvL3VzYWdlOiAgICAgIlxuCQkJLXggbGVhc2U6MzYwMCAtIG9wdGlvbiA1MSAobGVhc2UgdGltZSkiCisvL3VzYWdlOiAgICAgIlxuCQkJLXggMHgzZDowMTAwQkVFRkMwRkZFRSAtIG9wdGlvbiA2MSAoY2xpZW50IGlkKSIKKy8vdXNhZ2U6ICAgICAiXG4JLUYgTkFNRQkJQXNrIHNlcnZlciB0byB1cGRhdGUgRE5TIG1hcHBpbmcgZm9yIE5BTUUiCisvL3VzYWdlOiAgICAgIlxuCS1WIFZFTkRPUglWZW5kb3IgaWRlbnRpZmllciAoZGVmYXVsdCAndWRoY3AgVkVSU0lPTicpIgorLy91c2FnZTogICAgICJcbgktQwkJRG9uJ3Qgc2VuZCBNQUMgYXMgY2xpZW50IGlkZW50aWZpZXIiCisvL3VzYWdlOglJRl9VREhDUF9WRVJCT1NFKAorLy91c2FnZTogICAgICJcbgktdgkJVmVyYm9zZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG5TaWduYWxzOiIKKy8vdXNhZ2U6ICAgICAiXG4JVVNSMQlSZW5ldyBsZWFzZSIKKy8vdXNhZ2U6ICAgICAiXG4JVVNSMglSZWxlYXNlIGxlYXNlIgorCisKK2ludCB1ZGhjcGNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHVkaGNwY19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdWludDhfdCAqbWVzc2FnZTsKKwljb25zdCBjaGFyICpzdHJfViwgKnN0cl9oLCAqc3RyX0YsICpzdHJfcjsKKwlJRl9GRUFUVVJFX1VESENQQ19BUlBJTkcoY29uc3QgY2hhciAqc3RyX2EgPSAiMjAwMCI7KQorCUlGX0ZFQVRVUkVfVURIQ1BfUE9SVChjaGFyICpzdHJfUDspCisJdm9pZCAqY2xpZW50aWRfbWFjX3B0cjsKKwlsbGlzdF90ICpsaXN0X08gPSBOVUxMOworCWxsaXN0X3QgKmxpc3RfeCA9IE5VTEw7CisJaW50IHRyeWFnYWluX3RpbWVvdXQgPSAyMDsKKwlpbnQgZGlzY292ZXJfdGltZW91dCA9IDM7CisJaW50IGRpc2NvdmVyX3JldHJpZXMgPSAzOworCXVpbnQzMl90IHNlcnZlcl9hZGRyID0gc2VydmVyX2FkZHI7IC8qIGZvciBjb21waWxlciAqLworCXVpbnQzMl90IHJlcXVlc3RlZF9pcCA9IDA7CisJdWludDMyX3QgeGlkID0geGlkOyAvKiBmb3IgY29tcGlsZXIgKi8KKwlpbnQgcGFja2V0X251bTsKKwlpbnQgdGltZW91dDsgLyogbXVzdCBiZSBzaWduZWQgKi8KKwl1bnNpZ25lZCBhbHJlYWR5X3dhaXRlZF9zZWM7CisJdW5zaWduZWQgb3B0OworCUlGX0ZFQVRVUkVfVURIQ1BDX0FSUElORyh1bnNpZ25lZCBhcnBwaW5nX21zOykKKwlpbnQgbWF4X2ZkOworCWludCByZXR2YWw7CisJZmRfc2V0IHJmZHM7CisKKwkvKiBEZWZhdWx0IG9wdGlvbnMgKi8KKwlJRl9GRUFUVVJFX1VESENQX1BPUlQoU0VSVkVSX1BPUlQgPSA2NzspCisJSUZfRkVBVFVSRV9VREhDUF9QT1JUKENMSUVOVF9QT1JUID0gNjg7KQorCWNsaWVudF9jb25maWcuaW50ZXJmYWNlID0gImV0aDAiOworCWNsaWVudF9jb25maWcuc2NyaXB0ID0gQ09ORklHX1VESENQQ19ERUZBVUxUX1NDUklQVDsKKwlzdHJfViA9ICJ1ZGhjcCAiQkJfVkVSOworCisJLyogUGFyc2UgY29tbWFuZCBsaW5lICovCisJLyogTyx4OiBsaXN0OyAtVCwtdCwtQSB0YWtlIG51bWVyaWMgcGFyYW0gKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICJPOjp4OjpUKzp0KzpBKyIgSUZfVURIQ1BfVkVSQk9TRSgiOnZ2IikgOworCUlGX0xPTkdfT1BUUyhhcHBsZXRfbG9uZ19vcHRpb25zID0gdWRoY3BjX2xvbmdvcHRzOykKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiQ1Y6SDpoOkY6aTpucDpxUnI6czpUOnQ6U0E6TzpveDpmQiIKKwkJVVNFX0ZPUl9NTVUoImIiKQorCQlJRl9GRUFUVVJFX1VESENQQ19BUlBJTkcoImE6OiIpCisJCUlGX0ZFQVRVUkVfVURIQ1BfUE9SVCgiUDoiKQorCQkidiIKKwkJLCAmc3RyX1YsICZzdHJfaCwgJnN0cl9oLCAmc3RyX0YKKwkJLCAmY2xpZW50X2NvbmZpZy5pbnRlcmZhY2UsICZjbGllbnRfY29uZmlnLnBpZGZpbGUsICZzdHJfciAvKiBpLHAgKi8KKwkJLCAmY2xpZW50X2NvbmZpZy5zY3JpcHQgLyogcyAqLworCQksICZkaXNjb3Zlcl90aW1lb3V0LCAmZGlzY292ZXJfcmV0cmllcywgJnRyeWFnYWluX3RpbWVvdXQgLyogVCx0LEEgKi8KKwkJLCAmbGlzdF9PCisJCSwgJmxpc3RfeAorCQlJRl9GRUFUVVJFX1VESENQQ19BUlBJTkcoLCAmc3RyX2EpCisJCUlGX0ZFQVRVUkVfVURIQ1BfUE9SVCgsICZzdHJfUCkKKwkJSUZfVURIQ1BfVkVSQk9TRSgsICZkaGNwX3ZlcmJvc2UpCisJKTsKKwlpZiAob3B0ICYgKE9QVF9ofE9QVF9IKSkgeworCQkvL21zZyBhZGRlZCAyMDExLTExCisJCWJiX2Vycm9yX21zZygib3B0aW9uIC1oIE5BTUUgaXMgZGVwcmVjYXRlZCwgdXNlIC14IGhvc3RuYW1lOk5BTUUiKTsKKwkJY2xpZW50X2NvbmZpZy5ob3N0bmFtZSA9IGFsbG9jX2RoY3Bfb3B0aW9uKERIQ1BfSE9TVF9OQU1FLCBzdHJfaCwgMCk7CisJfQorCWlmIChvcHQgJiBPUFRfRikgeworCQkvKiBGUUROIG9wdGlvbiBmb3JtYXQ6IFsweDUxXVtsZW5dW2ZsYWdzXVswXVswXTxmcWRuPiAqLworCQljbGllbnRfY29uZmlnLmZxZG4gPSBhbGxvY19kaGNwX29wdGlvbihESENQX0ZRRE4sIHN0cl9GLCAzKTsKKwkJLyogRmxhZyBiaXRzOiAwMDAwTkVPUworCQkgKiBTOiAxID0gQ2xpZW50IHJlcXVlc3RzIHNlcnZlciB0byB1cGRhdGUgQSBSUiBpbiBETlMgYXMgd2VsbCBhcyBQVFIKKwkJICogTzogMSA9IFNlcnZlciBpbmRpY2F0ZXMgdG8gY2xpZW50IHRoYXQgRE5TIGhhcyBiZWVuIHVwZGF0ZWQgcmVnYXJkbGVzcworCQkgKiBFOiAxID0gTmFtZSBpcyBpbiBETlMgZm9ybWF0LCBpLmUuIDw0Pmhvc3Q8Nj5kb21haW48Mz5jb208MD4sCisJCSAqICAgIG5vdCAiaG9zdC5kb21haW4uY29tIi4gRm9ybWF0IDAgaXMgb2Jzb2xldGUuCisJCSAqIE46IDEgPSBDbGllbnQgcmVxdWVzdHMgc2VydmVyIHRvIG5vdCB1cGRhdGUgRE5TIChTIG11c3QgYmUgMCB0aGVuKQorCQkgKiBUd28gWzBdIGJ5dGVzIHdoaWNoIGZvbGxvdyBhcmUgZGVwcmVjYXRlZCBhbmQgbXVzdCBiZSAwLgorCQkgKi8KKwkJY2xpZW50X2NvbmZpZy5mcWRuW09QVF9EQVRBICsgMF0gPSAweDE7CisJCS8qY2xpZW50X2NvbmZpZy5mcWRuW09QVF9EQVRBICsgMV0gPSAwOyAtIHh6YWxsb2MgZGlkIGl0ICovCisJCS8qY2xpZW50X2NvbmZpZy5mcWRuW09QVF9EQVRBICsgMl0gPSAwOyAqLworCX0KKwlpZiAob3B0ICYgT1BUX3IpCisJCXJlcXVlc3RlZF9pcCA9IGluZXRfYWRkcihzdHJfcik7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVURIQ1BfUE9SVAorCWlmIChvcHQgJiBPUFRfUCkgeworCQlDTElFTlRfUE9SVCA9IHhhdG91MTYoc3RyX1ApOworCQlTRVJWRVJfUE9SVCA9IENMSUVOVF9QT1JUIC0gMTsKKwl9CisjZW5kaWYKKwlJRl9GRUFUVVJFX1VESENQQ19BUlBJTkcoYXJwcGluZ19tcyA9IHhhdG91KHN0cl9hKTspCisJd2hpbGUgKGxpc3RfTykgeworCQljaGFyICpvcHRzdHIgPSBsbGlzdF9wb3AoJmxpc3RfTyk7CisJCXVuc2lnbmVkIG4gPSBiYl9zdHJ0b3Uob3B0c3RyLCBOVUxMLCAwKTsKKwkJaWYgKGVycm5vIHx8IG4gPiAyNTQpIHsKKwkJCW4gPSB1ZGhjcF9vcHRpb25faWR4KG9wdHN0cik7CisJCQluID0gZGhjcF9vcHRmbGFnc1tuXS5jb2RlOworCQl9CisJCWNsaWVudF9jb25maWcub3B0X21hc2tbbiA+PiAzXSB8PSAxIDw8IChuICYgNyk7CisJfQorCWlmICghKG9wdCAmIE9QVF9vKSkgeworCQl1bnNpZ25lZCBpLCBuOworCQlmb3IgKGkgPSAwOyAobiA9IGRoY3Bfb3B0ZmxhZ3NbaV0uY29kZSkgIT0gMDsgaSsrKSB7CisJCQlpZiAoZGhjcF9vcHRmbGFnc1tpXS5mbGFncyAmIE9QVElPTl9SRVEpIHsKKwkJCQljbGllbnRfY29uZmlnLm9wdF9tYXNrW24gPj4gM10gfD0gMSA8PCAobiAmIDcpOworCQkJfQorCQl9CisJfQorCXdoaWxlIChsaXN0X3gpIHsKKwkJY2hhciAqb3B0c3RyID0gbGxpc3RfcG9wKCZsaXN0X3gpOworCQljaGFyICpjb2xvbiA9IHN0cmNocihvcHRzdHIsICc6Jyk7CisJCWlmIChjb2xvbikKKwkJCSpjb2xvbiA9ICcgJzsKKwkJLyogbm93IGl0IGxvb2tzIHNpbWlsYXIgdG8gdWRoY3BkJ3MgY29uZmlnIGZpbGUgbGluZToKKwkJICogIm9wdG5hbWUgb3B0dmFsIiwgdXNpbmcgdGhlIGNvbW1vbiByb3V0aW5lOiAqLworCQl1ZGhjcF9zdHIyb3B0c2V0KG9wdHN0ciwgJmNsaWVudF9jb25maWcub3B0aW9ucyk7CisJfQorCisJaWYgKHVkaGNwX3JlYWRfaW50ZXJmYWNlKGNsaWVudF9jb25maWcuaW50ZXJmYWNlLAorCQkJJmNsaWVudF9jb25maWcuaWZpbmRleCwKKwkJCU5VTEwsCisJCQljbGllbnRfY29uZmlnLmNsaWVudF9tYWMpCisJKSB7CisJCXJldHVybiAxOworCX0KKworCWNsaWVudGlkX21hY19wdHIgPSBOVUxMOworCWlmICghKG9wdCAmIE9QVF9DKSAmJiAhdWRoY3BfZmluZF9vcHRpb24oY2xpZW50X2NvbmZpZy5vcHRpb25zLCBESENQX0NMSUVOVF9JRCkpIHsKKwkJLyogbm90IHN1cHByZXNzZWQgYW5kIG5vdCBzZXQsIHNldCB0aGUgZGVmYXVsdCBjbGllbnQgSUQgKi8KKwkJY2xpZW50X2NvbmZpZy5jbGllbnRpZCA9IGFsbG9jX2RoY3Bfb3B0aW9uKERIQ1BfQ0xJRU5UX0lELCAiIiwgNyk7CisJCWNsaWVudF9jb25maWcuY2xpZW50aWRbT1BUX0RBVEFdID0gMTsgLyogdHlwZTogZXRoZXJuZXQgKi8KKwkJY2xpZW50aWRfbWFjX3B0ciA9IGNsaWVudF9jb25maWcuY2xpZW50aWQgKyBPUFRfREFUQSsxOworCQltZW1jcHkoY2xpZW50aWRfbWFjX3B0ciwgY2xpZW50X2NvbmZpZy5jbGllbnRfbWFjLCA2KTsKKwl9CisJaWYgKHN0cl9WWzBdICE9ICdcMCcpIHsKKwkJLy8gY2FuIGRyb3AgLVYsIHN0cl9WLCBjbGllbnRfY29uZmlnLnZlbmRvcmNsYXNzLAorCQkvLyBidXQgbmVlZCB0byBhZGQgInZlbmRvciIgdG8gdGhlIGxpc3Qgb2YgcmVjb2duaXplZAorCQkvLyBzdHJpbmcgb3B0cyBmb3IgdGhpcyB0byB3b3JrOworCQkvLyBhbmQgbmVlZCB0byB0d2VhayBhZGRfY2xpZW50X29wdGlvbnMoKSB0b28uLi4KKwkJLy8gLi4uc28gdGhlIHF1ZXN0aW9uIGlzLCBzaG91bGQgd2U/CisJCS8vYmJfZXJyb3JfbXNnKCJvcHRpb24gLVYgVkVORE9SIGlzIGRlcHJlY2F0ZWQsIHVzZSAteCB2ZW5kb3I6VkVORE9SIik7CisJCWNsaWVudF9jb25maWcudmVuZG9yY2xhc3MgPSBhbGxvY19kaGNwX29wdGlvbihESENQX1ZFTkRPUiwgc3RyX1YsIDApOworCX0KKworI2lmICFCQl9NTVUKKwkvKiBvbiBOT01NVSByZWV4ZWMgKGkuZS4sIGJhY2tncm91bmQpIGVhcmx5ICovCisJaWYgKCEob3B0ICYgT1BUX2YpKSB7CisJCWJiX2RhZW1vbml6ZV9vcl9yZXhlYygwIC8qIGZsYWdzICovLCBhcmd2KTsKKwkJbG9nbW9kZSA9IExPR01PREVfTk9ORTsKKwl9CisjZW5kaWYKKwlpZiAob3B0ICYgT1BUX1MpIHsKKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgTE9HX1BJRCwgTE9HX0RBRU1PTik7CisJCWxvZ21vZGUgfD0gTE9HTU9ERV9TWVNMT0c7CisJfQorCisJLyogTWFrZSBzdXJlIGZkIDAsMSwyIGFyZSBvcGVuICovCisJYmJfc2FuaXRpemVfc3RkaW8oKTsKKwkvKiBFcXVpdmFsZW50IG9mIGRvaW5nIGEgZmZsdXNoIGFmdGVyIGV2ZXJ5IFxuICovCisJc2V0bGluZWJ1ZihzdGRvdXQpOworCS8qIENyZWF0ZSBwaWRmaWxlICovCisJd3JpdGVfcGlkZmlsZShjbGllbnRfY29uZmlnLnBpZGZpbGUpOworCS8qIEdvZXMgdG8gc3Rkb3V0ICh1bmxlc3MgTk9NTVUpIGFuZCBwb3NzaWJseSBzeXNsb2cgKi8KKwliYl9pbmZvX21zZygiJXMgKHYiQkJfVkVSIikgc3RhcnRlZCIsIGFwcGxldF9uYW1lKTsKKwkvKiBTZXQgdXAgdGhlIHNpZ25hbCBwaXBlICovCisJdWRoY3Bfc3Bfc2V0dXAoKTsKKwkvKiBXZSB3YW50IHJhbmRvbV94aWQgdG8gYmUgcmFuZG9tLi4uICovCisJc3JhbmQobW9ub3RvbmljX3VzKCkpOworCisJc3RhdGUgPSBJTklUX1NFTEVDVElORzsKKwl1ZGhjcF9ydW5fc2NyaXB0KE5VTEwsICJkZWNvbmZpZyIpOworCWNoYW5nZV9saXN0ZW5fbW9kZShMSVNURU5fUkFXKTsKKwlwYWNrZXRfbnVtID0gMDsKKwl0aW1lb3V0ID0gMDsKKwlhbHJlYWR5X3dhaXRlZF9zZWMgPSAwOworCisJLyogTWFpbiBldmVudCBsb29wLiBzZWxlY3QoKSB3YWl0cyBvbiBzaWduYWwgcGlwZSBhbmQgcG9zc2libHkKKwkgKiBvbiBzb2NrZmQuCisJICogImNvbnRpbnVlIiBzdGF0ZW1lbnRzIGluIGNvZGUgYmVsb3cganVtcCB0byB0aGUgdG9wIG9mIHRoZSBsb29wLgorCSAqLworCWZvciAoOzspIHsKKwkJc3RydWN0IHRpbWV2YWwgdHY7CisJCXN0cnVjdCBkaGNwX3BhY2tldCBwYWNrZXQ7CisJCS8qIHNpbGVuY2UgInVuaW5pdGlhbGl6ZWQhIiB3YXJuaW5nICovCisJCXVuc2lnbmVkIHRpbWVzdGFtcF9iZWZvcmVfd2FpdCA9IHRpbWVzdGFtcF9iZWZvcmVfd2FpdDsKKworCQkvL2JiX2Vycm9yX21zZygic29ja2ZkOiVkLCBsaXN0ZW5fbW9kZTolZCIsIHNvY2tmZCwgbGlzdGVuX21vZGUpOworCisJCS8qIFdhcyBvcGVuaW5nIHJhdyBvciB1ZHAgc29ja2V0IGhlcmUKKwkJICogaWYgKGxpc3Rlbl9tb2RlICE9IExJU1RFTl9OT05FICYmIHNvY2tmZCA8IDApLAorCQkgKiBidXQgb24gZmFzdCBuZXR3b3JrIHJlbmV3IHJlc3BvbnNlcyByZXR1cm4gZmFzdGVyCisJCSAqIHRoYW4gd2Ugb3BlbiBzb2NrZXRzLiBUaHVzIHRoaXMgY29kZSBpcyBtb3ZlZAorCQkgKiB0byBjaGFuZ2VfbGlzdGVuX21vZGUoKS4gVGh1cyB3ZSBvcGVuIGxpc3RlbiBzb2NrZXQKKwkJICogQkVGT1JFIHdlIHNlbmQgcmVuZXcgcmVxdWVzdCAoc2VlICJjYXNlIEJPVU5EOiIpLiAqLworCisJCW1heF9mZCA9IHVkaGNwX3NwX2ZkX3NldCgmcmZkcywgc29ja2ZkKTsKKworCQl0di50dl9zZWMgPSB0aW1lb3V0IC0gYWxyZWFkeV93YWl0ZWRfc2VjOworCQl0di50dl91c2VjID0gMDsKKwkJcmV0dmFsID0gMDsKKwkJLyogSWYgd2UgYWxyZWFkeSB0aW1lZCBvdXQsIGZhbGwgdGhyb3VnaCB3aXRoIHJldHZhbCA9IDAsIGVsc2UuLi4gKi8KKwkJaWYgKChpbnQpdHYudHZfc2VjID4gMCkgeworCQkJbG9nMSgiV2FpdGluZyBvbiBzZWxlY3QgJXUgc2Vjb25kcyIsIChpbnQpdHYudHZfc2VjKTsKKwkJCXRpbWVzdGFtcF9iZWZvcmVfd2FpdCA9ICh1bnNpZ25lZCltb25vdG9uaWNfc2VjKCk7CisJCQlyZXR2YWwgPSBzZWxlY3QobWF4X2ZkICsgMSwgJnJmZHMsIE5VTEwsIE5VTEwsICZ0dik7CisJCQlpZiAocmV0dmFsIDwgMCkgeworCQkJCS8qIEVJTlRSPyBBIHNpZ25hbCB3YXMgY2F1Z2h0LCBkb24ndCBwYW5pYyAqLworCQkJCWlmIChlcnJubyA9PSBFSU5UUikgeworCQkJCQlhbHJlYWR5X3dhaXRlZF9zZWMgKz0gKHVuc2lnbmVkKW1vbm90b25pY19zZWMoKSAtIHRpbWVzdGFtcF9iZWZvcmVfd2FpdDsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8qIEVsc2U6IGFuIGVycm9yIG9jY3VyZWQsIHBhbmljISAqLworCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2VsZWN0Iik7CisJCQl9CisJCX0KKworCQkvKiBJZiB0aW1lb3V0IGRyb3BwZWQgdG8gemVybywgdGltZSB0byBiZWNvbWUgYWN0aXZlOgorCQkgKiByZXNlbmQgZGlzY292ZXIvcmVuZXcvd2hhdGV2ZXIKKwkJICovCisJCWlmIChyZXR2YWwgPT0gMCkgeworCQkJLyogV2hlbiBydW5uaW5nIG9uIGEgYnJpZGdlLCB0aGUgaWZpbmRleCBtYXkgaGF2ZSBjaGFuZ2VkCisJCQkgKiAoZS5nLiBpZiBtZW1iZXIgaW50ZXJmYWNlcyB3ZXJlIGFkZGVkL3JlbW92ZWQKKwkJCSAqIG9yIGlmIHRoZSBzdGF0dXMgb2YgdGhlIGJyaWRnZSBjaGFuZ2VkKS4KKwkJCSAqIFJlZnJlc2ggaWZpbmRleCBhbmQgY2xpZW50X21hYzoKKwkJCSAqLworCQkJaWYgKHVkaGNwX3JlYWRfaW50ZXJmYWNlKGNsaWVudF9jb25maWcuaW50ZXJmYWNlLAorCQkJCQkmY2xpZW50X2NvbmZpZy5pZmluZGV4LAorCQkJCQlOVUxMLAorCQkJCQljbGllbnRfY29uZmlnLmNsaWVudF9tYWMpCisJCQkpIHsKKwkJCQlnb3RvIHJldDA7IC8qIGlmYWNlIGlzIGdvbmU/ICovCisJCQl9CisJCQlpZiAoY2xpZW50aWRfbWFjX3B0cikKKwkJCQltZW1jcHkoY2xpZW50aWRfbWFjX3B0ciwgY2xpZW50X2NvbmZpZy5jbGllbnRfbWFjLCA2KTsKKworCQkJLyogV2Ugd2lsbCByZXN0YXJ0IHRoZSB3YWl0IGluIGFueSBjYXNlICovCisJCQlhbHJlYWR5X3dhaXRlZF9zZWMgPSAwOworCisJCQlzd2l0Y2ggKHN0YXRlKSB7CisJCQljYXNlIElOSVRfU0VMRUNUSU5HOgorCQkJCWlmICghZGlzY292ZXJfcmV0cmllcyB8fCBwYWNrZXRfbnVtIDwgZGlzY292ZXJfcmV0cmllcykgeworCQkJCQlpZiAocGFja2V0X251bSA9PSAwKQorCQkJCQkJeGlkID0gcmFuZG9tX3hpZCgpOworCQkJCQkvKiBicm9hZGNhc3QgKi8KKwkJCQkJc2VuZF9kaXNjb3Zlcih4aWQsIHJlcXVlc3RlZF9pcCk7CisJCQkJCXRpbWVvdXQgPSBkaXNjb3Zlcl90aW1lb3V0OworCQkJCQlwYWNrZXRfbnVtKys7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKyBsZWFzZWZhaWw6CisJCQkJdWRoY3BfcnVuX3NjcmlwdChOVUxMLCAibGVhc2VmYWlsIik7CisjaWYgQkJfTU1VIC8qIC1iIGlzIG5vdCBzdXBwb3J0ZWQgb24gTk9NTVUgKi8KKwkJCQlpZiAob3B0ICYgT1BUX2IpIHsgLyogYmFja2dyb3VuZCBpZiBubyBsZWFzZSAqLworCQkJCQliYl9pbmZvX21zZygiTm8gbGVhc2UsIGZvcmtpbmcgdG8gYmFja2dyb3VuZCIpOworCQkJCQljbGllbnRfYmFja2dyb3VuZCgpOworCQkJCQkvKiBkbyBub3QgYmFja2dyb3VuZCBhZ2FpbiEgKi8KKwkJCQkJb3B0ID0gKChvcHQgJiB+T1BUX2IpIHwgT1BUX2YpOworCQkJCX0gZWxzZQorI2VuZGlmCisJCQkJaWYgKG9wdCAmIE9QVF9uKSB7IC8qIGFib3J0IGlmIG5vIGxlYXNlICovCisJCQkJCWJiX2luZm9fbXNnKCJObyBsZWFzZSwgZmFpbGluZyIpOworCQkJCQlyZXR2YWwgPSAxOworCQkJCQlnb3RvIHJldDsKKwkJCQl9CisJCQkJLyogd2FpdCBiZWZvcmUgdHJ5aW5nIGFnYWluICovCisJCQkJdGltZW91dCA9IHRyeWFnYWluX3RpbWVvdXQ7CisJCQkJcGFja2V0X251bSA9IDA7CisJCQkJY29udGludWU7CisJCQljYXNlIFJFUVVFU1RJTkc6CisJCQkJaWYgKCFkaXNjb3Zlcl9yZXRyaWVzIHx8IHBhY2tldF9udW0gPCBkaXNjb3Zlcl9yZXRyaWVzKSB7CisJCQkJCS8qIHNlbmQgYnJvYWRjYXN0IHNlbGVjdCBwYWNrZXQgKi8KKwkJCQkJc2VuZF9zZWxlY3QoeGlkLCBzZXJ2ZXJfYWRkciwgcmVxdWVzdGVkX2lwKTsKKwkJCQkJdGltZW91dCA9IGRpc2NvdmVyX3RpbWVvdXQ7CisJCQkJCXBhY2tldF9udW0rKzsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8qIFRpbWVkIG91dCwgZ28gYmFjayB0byBpbml0IHN0YXRlLgorCQkJCSAqICJkaXNjb3Zlci4uLnNlbGVjdC4uLmRpc2NvdmVyLi4uIiBsb29wcworCQkJCSAqIHdlcmUgc2VlbiBpbiB0aGUgd2lsZC4gVHJlYXQgdGhlbSBzaW1pbGFybHkKKwkJCQkgKiB0byAibm8gcmVzcG9uc2UgdG8gZGlzY292ZXIiIGNhc2UgKi8KKwkJCQljaGFuZ2VfbGlzdGVuX21vZGUoTElTVEVOX1JBVyk7CisJCQkJc3RhdGUgPSBJTklUX1NFTEVDVElORzsKKwkJCQlnb3RvIGxlYXNlZmFpbDsKKwkJCWNhc2UgQk9VTkQ6CisJCQkJLyogMS8yIGxlYXNlIHBhc3NlZCwgZW50ZXIgcmVuZXdpbmcgc3RhdGUgKi8KKwkJCQlzdGF0ZSA9IFJFTkVXSU5HOworCQkJCWNsaWVudF9jb25maWcuZmlyc3Rfc2VjcyA9IDA7IC8qIG1ha2Ugc2VjcyBmaWVsZCBjb3VudCBmcm9tIDAgKi8KKwkJCQljaGFuZ2VfbGlzdGVuX21vZGUoTElTVEVOX0tFUk5FTCk7CisJCQkJbG9nMSgiRW50ZXJpbmcgcmVuZXcgc3RhdGUiKTsKKwkJCQkvKiBmYWxsIHJpZ2h0IHRocm91Z2ggKi8KKwkJCWNhc2UgUkVORVdfUkVRVUVTVEVEOiAvKiBtYW51YWwgKFNJR1VTUjEpIHJlbmV3ICovCisJCQljYXNlX1JFTkVXX1JFUVVFU1RFRDoKKwkJCWNhc2UgUkVORVdJTkc6CisJCQkJaWYgKHRpbWVvdXQgPiA2MCkgeworCQkJCQkvKiBzZW5kIGFuIHVuaWNhc3QgcmVuZXcgcmVxdWVzdCAqLworCQkJLyogU29tZXRpbWVzIG9ic2VydmVkIHRvIGZhaWwgKEVBRERSTk9UQVZBSUwpIHRvIGJpbmQKKwkJCSAqIGEgbmV3IFVEUCBzb2NrZXQgZm9yIHNlbmRpbmcgaW5zaWRlIHNlbmRfcmVuZXcuCisJCQkgKiBJIGhhemFyZCB0byBndWVzcyBleGlzdGluZyBsaXN0ZW5pbmcgc29ja2V0CisJCQkgKiBpcyBzb21laG93IGNvbmZsaWN0aW5nIHdpdGggaXQsIGJ1dCB3aHkgaXMgaXQKKwkJCSAqIG5vdCBkZXRlcm1pbmlzdGljIHRoZW4/ISBTdHJhbmdlLgorCQkJICogQW55d2F5LCBpdCBkb2VzIHJlY292ZXIgYnkgZXZlbnR1YWxseSBmYWlsaW5nIHRocm91Z2gKKwkJCSAqIGludG8gSU5JVF9TRUxFQ1RJTkcgc3RhdGUuCisJCQkgKi8KKwkJCQkJc2VuZF9yZW5ldyh4aWQsIHNlcnZlcl9hZGRyLCByZXF1ZXN0ZWRfaXApOworCQkJCQl0aW1lb3V0ID4+PSAxOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJLyogVGltZWQgb3V0LCBlbnRlciByZWJpbmRpbmcgc3RhdGUgKi8KKwkJCQlsb2cxKCJFbnRlcmluZyByZWJpbmRpbmcgc3RhdGUiKTsKKwkJCQlzdGF0ZSA9IFJFQklORElORzsKKwkJCQkvKiBmYWxsIHJpZ2h0IHRocm91Z2ggKi8KKwkJCWNhc2UgUkVCSU5ESU5HOgorCQkJCS8qIFN3aXRjaCB0byBiY2FzdCByZWNlaXZlICovCisJCQkJY2hhbmdlX2xpc3Rlbl9tb2RlKExJU1RFTl9SQVcpOworCQkJCS8qIExlYXNlIGlzICpyZWFsbHkqIGFib3V0IHRvIHJ1biBvdXQsCisJCQkJICogdHJ5IHRvIGZpbmQgREhDUCBzZXJ2ZXIgdXNpbmcgYnJvYWRjYXN0ICovCisJCQkJaWYgKHRpbWVvdXQgPiAwKSB7CisJCQkJCS8qIHNlbmQgYSBicm9hZGNhc3QgcmVuZXcgcmVxdWVzdCAqLworCQkJCQlzZW5kX3JlbmV3KHhpZCwgMCAvKklOQUREUl9BTlkqLywgcmVxdWVzdGVkX2lwKTsKKwkJCQkJdGltZW91dCA+Pj0gMTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCS8qIFRpbWVkIG91dCwgZW50ZXIgaW5pdCBzdGF0ZSAqLworCQkJCWJiX2luZm9fbXNnKCJMZWFzZSBsb3N0LCBlbnRlcmluZyBpbml0IHN0YXRlIik7CisJCQkJdWRoY3BfcnVuX3NjcmlwdChOVUxMLCAiZGVjb25maWciKTsKKwkJCQlzdGF0ZSA9IElOSVRfU0VMRUNUSU5HOworCQkJCWNsaWVudF9jb25maWcuZmlyc3Rfc2VjcyA9IDA7IC8qIG1ha2Ugc2VjcyBmaWVsZCBjb3VudCBmcm9tIDAgKi8KKwkJCQkvKnRpbWVvdXQgPSAwOyAtIGFscmVhZHkgaXMgKi8KKwkJCQlwYWNrZXRfbnVtID0gMDsKKwkJCQljb250aW51ZTsKKwkJCS8qIGNhc2UgUkVMRUFTRUQ6ICovCisJCQl9CisJCQkvKiB5YWgsIEkga25vdywgKnlvdSogc2F5IGl0IHdvdWxkIG5ldmVyIGhhcHBlbiAqLworCQkJdGltZW91dCA9IElOVF9NQVg7CisJCQljb250aW51ZTsgLyogYmFjayB0byBtYWluIGxvb3AgKi8KKwkJfSAvKiBpZiBzZWxlY3QgdGltZWQgb3V0ICovCisKKwkJLyogc2VsZWN0KCkgZGlkbid0IHRpbWVvdXQsIHNvbWV0aGluZyBoYXBwZW5lZCAqLworCisJCS8qIElzIGl0IGEgc2lnbmFsPyAqLworCQkvKiBub3RlOiB1ZGhjcF9zcF9yZWFkIGNoZWNrcyBGRF9JU1NFVCBiZWZvcmUgcmVhZGluZyAqLworCQlzd2l0Y2ggKHVkaGNwX3NwX3JlYWQoJnJmZHMpKSB7CisJCWNhc2UgU0lHVVNSMToKKwkJCWNsaWVudF9jb25maWcuZmlyc3Rfc2VjcyA9IDA7IC8qIG1ha2Ugc2VjcyBmaWVsZCBjb3VudCBmcm9tIDAgKi8KKwkJCWFscmVhZHlfd2FpdGVkX3NlYyA9IDA7CisJCQlwZXJmb3JtX3JlbmV3KCk7CisJCQlpZiAoc3RhdGUgPT0gUkVORVdfUkVRVUVTVEVEKSB7CisJCQkJLyogV2UgbWlnaHQgYmUgZWl0aGVyIG9uIHRoZSBzYW1lIG5ldHdvcmsKKwkJCQkgKiAoaW4gd2hpY2ggY2FzZSByZW5ldyBtaWdodCB3b3JrKSwKKwkJCQkgKiBvciB3ZSBtaWdodCBiZSBvbiBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IG9uZQorCQkJCSAqIChpbiB3aGljaCBjYXNlIHJlbmV3IHdvbid0IGV2ZXIgc3VjY2VlZCkuCisJCQkJICogRm9yIHRoZSBzZWNvbmQgY2FzZSwgbXVzdCBtYWtlIHN1cmUgdGltZW91dAorCQkJCSAqIGlzIG5vdCB0b28gYmlnLCBvciBlbHNlIHdlIGNhbiBzZW5kCisJCQkJICogZnV0aWxlIHJlbmV3IHJlcXVlc3RzIGZvciBob3Vycy4KKwkJCQkgKiAoQWIpdXNlIC1BIFRJTUVPVVQgdmFsdWUgKHVzdWFsbHkgMjAgc2VjKQorCQkJCSAqIGFzIGEgY2FwIG9uIHRoZSB0aW1lb3V0LgorCQkJCSAqLworCQkJCWlmICh0aW1lb3V0ID4gdHJ5YWdhaW5fdGltZW91dCkKKwkJCQkJdGltZW91dCA9IHRyeWFnYWluX3RpbWVvdXQ7CisJCQkJZ290byBjYXNlX1JFTkVXX1JFUVVFU1RFRDsKKwkJCX0KKwkJCS8qIFN0YXJ0IHRoaW5ncyBvdmVyICovCisJCQlwYWNrZXRfbnVtID0gMDsKKwkJCS8qIEtpbGwgYW55IHRpbWVvdXRzLCB1c2VyIHdhbnRzIHRoaXMgdG8gaHVycnkgYWxvbmcgKi8KKwkJCXRpbWVvdXQgPSAwOworCQkJY29udGludWU7CisJCWNhc2UgU0lHVVNSMjoKKwkJCXBlcmZvcm1fcmVsZWFzZShzZXJ2ZXJfYWRkciwgcmVxdWVzdGVkX2lwKTsKKwkJCXRpbWVvdXQgPSBJTlRfTUFYOworCQkJY29udGludWU7CisJCWNhc2UgU0lHVEVSTToKKwkJCWJiX2luZm9fbXNnKCJSZWNlaXZlZCBTSUdURVJNIik7CisJCQlnb3RvIHJldDA7CisJCX0KKworCQkvKiBJcyBpdCBhIHBhY2tldD8gKi8KKwkJaWYgKGxpc3Rlbl9tb2RlID09IExJU1RFTl9OT05FIHx8ICFGRF9JU1NFVChzb2NrZmQsICZyZmRzKSkKKwkJCWNvbnRpbnVlOyAvKiBubyAqLworCisJCXsKKwkJCWludCBsZW47CisKKwkJCS8qIEEgcGFja2V0IGlzIHJlYWR5LCByZWFkIGl0ICovCisJCQlpZiAobGlzdGVuX21vZGUgPT0gTElTVEVOX0tFUk5FTCkKKwkJCQlsZW4gPSB1ZGhjcF9yZWN2X2tlcm5lbF9wYWNrZXQoJnBhY2tldCwgc29ja2ZkKTsKKwkJCWVsc2UKKwkJCQlsZW4gPSB1ZGhjcF9yZWN2X3Jhd19wYWNrZXQoJnBhY2tldCwgc29ja2ZkKTsKKwkJCWlmIChsZW4gPT0gLTEpIHsKKwkJCQkvKiBFcnJvciBpcyBzZXZlcmUsIHJlb3BlbiBzb2NrZXQgKi8KKwkJCQliYl9pbmZvX21zZygiUmVhZCBlcnJvcjogJXMsIHJlb3BlbmluZyBzb2NrZXQiLCBzdHJlcnJvcihlcnJubykpOworCQkJCXNsZWVwKGRpc2NvdmVyX3RpbWVvdXQpOyAvKiAzIHNlY29uZHMgYnkgZGVmYXVsdCAqLworCQkJCWNoYW5nZV9saXN0ZW5fbW9kZShsaXN0ZW5fbW9kZSk7IC8qIGp1c3QgY2xvc2UgYW5kIHJlb3BlbiAqLworCQkJfQorCQkJLyogSWYgdGhpcyBwYWNrZXQgd2lsbCB0dXJuIG91dCB0byBiZSB1bnJlbGF0ZWQvYm9ndXMsCisJCQkgKiB3ZSB3aWxsIGdvIGJhY2sgYW5kIHdhaXQgZm9yIG5leHQgb25lLgorCQkJICogQmUgc3VyZSB0aW1lb3V0IGlzIHByb3Blcmx5IGRlY3JlYXNlZC4gKi8KKwkJCWFscmVhZHlfd2FpdGVkX3NlYyArPSAodW5zaWduZWQpbW9ub3RvbmljX3NlYygpIC0gdGltZXN0YW1wX2JlZm9yZV93YWl0OworCQkJaWYgKGxlbiA8IDApCisJCQkJY29udGludWU7CisJCX0KKworCQlpZiAocGFja2V0LnhpZCAhPSB4aWQpIHsKKwkJCWxvZzEoInhpZCAleCAob3VyIGlzICV4KSwgaWdub3JpbmcgcGFja2V0IiwKKwkJCQkodW5zaWduZWQpcGFja2V0LnhpZCwgKHVuc2lnbmVkKXhpZCk7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIElnbm9yZSBwYWNrZXRzIHRoYXQgYXJlbid0IGZvciB1cyAqLworCQlpZiAocGFja2V0LmhsZW4gIT0gNgorCQkgfHwgbWVtY21wKHBhY2tldC5jaGFkZHIsIGNsaWVudF9jb25maWcuY2xpZW50X21hYywgNikgIT0gMAorCQkpIHsKKy8vRklYTUU6IG5lZWQgdG8gYWxzbyBjaGVjayB0aGF0IGxhc3QgMTAgYnl0ZXMgYXJlIHplcm8KKwkJCWxvZzEoImNoYWRkciBkb2VzIG5vdCBtYXRjaCwgaWdub3JpbmcgcGFja2V0Iik7IC8vIGxvZzI/CisJCQljb250aW51ZTsKKwkJfQorCisJCW1lc3NhZ2UgPSB1ZGhjcF9nZXRfb3B0aW9uKCZwYWNrZXQsIERIQ1BfTUVTU0FHRV9UWVBFKTsKKwkJaWYgKG1lc3NhZ2UgPT0gTlVMTCkgeworCQkJYmJfZXJyb3JfbXNnKCJubyBtZXNzYWdlIHR5cGUgb3B0aW9uLCBpZ25vcmluZyBwYWNrZXQiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3dpdGNoIChzdGF0ZSkgeworCQljYXNlIElOSVRfU0VMRUNUSU5HOgorCQkJLyogTXVzdCBiZSBhIERIQ1BPRkZFUiAqLworCQkJaWYgKCptZXNzYWdlID09IERIQ1BPRkZFUikgeworCQkJCXVpbnQ4X3QgKnRlbXA7CisKKy8qIFdoYXQgZXhhY3RseSBpcyBzZXJ2ZXIncyBJUD8gVGhlcmUgYXJlIHNldmVyYWwgdmFsdWVzLgorICogRXhhbXBsZSBESENQIG9mZmVyIGNhcHR1cmVkIHdpdGggdGNoZHVtcDoKKyAqCisgKiAxMC4zNC4yNS4yNTQ6NjcgPiAxMC4zNC4yNS4yMDI6NjggLy8gSVAgaGVhZGVyJ3Mgc3JjCisgKiBCT09UUCBmaWVsZHM6CisgKiBZb3VyLUlQIDEwLjM0LjI1LjIwMgorICogU2VydmVyLUlQIDEwLjM0LjMyLjEyNSAgIC8vICJuZXh0IHNlcnZlciIgSVAKKyAqIEdhdGV3YXktSVAgMTAuMzQuMjUuMjU0ICAvLyByZWxheSdzIGFkZHJlc3MgKGlmIERIQ1AgcmVsYXlzIGFyZSBpbiB1c2UpCisgKiBESENQIG9wdGlvbnM6CisgKiBESENQLU1lc3NhZ2UgT3B0aW9uIDUzLCBsZW5ndGggMTogT2ZmZXIKKyAqIFNlcnZlci1JRCBPcHRpb24gNTQsIGxlbmd0aCA0OiAxMC4zNC4yNTUuNyAgICAgICAvLyAic2VydmVyIElEIgorICogRGVmYXVsdC1HYXRld2F5IE9wdGlvbiAzLCBsZW5ndGggNDogMTAuMzQuMjUuMjU0IC8vIHJvdXRlcgorICoKKyAqIFdlIHRoaW5rIHRoYXQgcmVhbCBzZXJ2ZXIgSVAgKG9uZSB0byB1c2UgaW4gcmVuZXcvcmVsZWFzZSkKKyAqIGlzIG9uZSBpbiBTZXJ2ZXItSUQgb3B0aW9uLiBCdXQgSSBhbSBub3QgMTAwJSBzdXJlLgorICogSVAgaGVhZGVyJ3Mgc3JjIGFuZCBHYXRld2F5LUlQIChzYW1lIGluIHRoaXMgZXhhbXBsZSkKKyAqIG1pZ2h0IHdvcmsgdG9vLgorICogIk5leHQgc2VydmVyIiBhbmQgcm91dGVyIGFyZSBkZWZpbml0ZWx5IHdyb25nIG9uZXMgdG8gdXNlLCB0aG91Z2guLi4KKyAqLworLyogV2UgdXNlZCB0byBpZ25vcmUgcGNha2V0cyB3aXRob3V0IERIQ1BfU0VSVkVSX0lELgorICogSSd2ZSBnb3QgdXNlciByZXBvcnRzIGZyb20gcGVvcGxlIHdobyBydW4gImFkZHJlc3MtbGVzcyIgc2VydmVycy4KKyAqIFRoZXkgZWl0aGVyIHN1cHBseSBESENQX1NFUlZFUl9JRCBvZiAwLjAuMC4wIG9yIGRvbid0IHN1cHBseSBpdCBhdCBhbGwuCisgKiBUaGV5IHNheSBJU0MgREhDUCBjbGllbnQgc3VwcG9ydHMgdGhpcyBjYXNlLgorICovCisJCQkJc2VydmVyX2FkZHIgPSAwOworCQkJCXRlbXAgPSB1ZGhjcF9nZXRfb3B0aW9uKCZwYWNrZXQsIERIQ1BfU0VSVkVSX0lEKTsKKwkJCQlpZiAoIXRlbXApIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJubyBzZXJ2ZXIgSUQsIHVzaW5nIDAuMC4wLjAiKTsKKwkJCQl9IGVsc2UgeworCQkJCQkvKiBpdCBJUyB1bmFsaWduZWQgc29tZXRpbWVzLCBkb24ndCAib3B0aW1pemUiICovCisJCQkJCW1vdmVfZnJvbV91bmFsaWduZWQzMihzZXJ2ZXJfYWRkciwgdGVtcCk7CisJCQkJfQorCQkJCS8qeGlkID0gcGFja2V0LnhpZDsgLSBhbHJlYWR5IGlzICovCisJCQkJcmVxdWVzdGVkX2lwID0gcGFja2V0LnlpYWRkcjsKKworCQkJCS8qIGVudGVyIHJlcXVlc3Rpbmcgc3RhdGUgKi8KKwkJCQlzdGF0ZSA9IFJFUVVFU1RJTkc7CisJCQkJdGltZW91dCA9IDA7CisJCQkJcGFja2V0X251bSA9IDA7CisJCQkJYWxyZWFkeV93YWl0ZWRfc2VjID0gMDsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQljYXNlIFJFUVVFU1RJTkc6CisJCWNhc2UgUkVORVdJTkc6CisJCWNhc2UgUkVORVdfUkVRVUVTVEVEOgorCQljYXNlIFJFQklORElORzoKKwkJCWlmICgqbWVzc2FnZSA9PSBESENQQUNLKSB7CisJCQkJdW5zaWduZWQgc3RhcnQ7CisJCQkJdWludDMyX3QgbGVhc2Vfc2Vjb25kczsKKwkJCQlzdHJ1Y3QgaW5fYWRkciB0ZW1wX2FkZHI7CisJCQkJdWludDhfdCAqdGVtcDsKKworCQkJCXRlbXAgPSB1ZGhjcF9nZXRfb3B0aW9uKCZwYWNrZXQsIERIQ1BfTEVBU0VfVElNRSk7CisJCQkJaWYgKCF0ZW1wKSB7CisJCQkJCWJiX2Vycm9yX21zZygibm8gbGVhc2UgdGltZSB3aXRoIEFDSywgdXNpbmcgMSBob3VyIGxlYXNlIik7CisJCQkJCWxlYXNlX3NlY29uZHMgPSA2MCAqIDYwOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIGl0IElTIHVuYWxpZ25lZCBzb21ldGltZXMsIGRvbid0ICJvcHRpbWl6ZSIgKi8KKwkJCQkJbW92ZV9mcm9tX3VuYWxpZ25lZDMyKGxlYXNlX3NlY29uZHMsIHRlbXApOworCQkJCQlsZWFzZV9zZWNvbmRzID0gbnRvaGwobGVhc2Vfc2Vjb25kcyk7CisJCQkJCS8qIHBhcmFub2lhOiBtdXN0IG5vdCBiZSB0b28gc21hbGwgYW5kIG5vdCBwcm9uZSB0byBvdmVyZmxvd3MgKi8KKwkJCQkJaWYgKGxlYXNlX3NlY29uZHMgPCAweDEwKQorCQkJCQkJbGVhc2Vfc2Vjb25kcyA9IDB4MTA7CisJCQkJCWlmIChsZWFzZV9zZWNvbmRzID49IDB4MTAwMDAwMDApCisJCQkJCQlsZWFzZV9zZWNvbmRzID0gMHgwZmZmZmZmZjsKKwkJCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfVURIQ1BDX0FSUElORworCQkJCWlmIChvcHQgJiBPUFRfYSkgeworLyogUkZDIDIxMzEgMy4xIHBhcmFncmFwaCA1OgorICogIlRoZSBjbGllbnQgcmVjZWl2ZXMgdGhlIERIQ1BBQ0sgbWVzc2FnZSB3aXRoIGNvbmZpZ3VyYXRpb24KKyAqIHBhcmFtZXRlcnMuIFRoZSBjbGllbnQgU0hPVUxEIHBlcmZvcm0gYSBmaW5hbCBjaGVjayBvbiB0aGUKKyAqIHBhcmFtZXRlcnMgKGUuZy4sIEFSUCBmb3IgYWxsb2NhdGVkIG5ldHdvcmsgYWRkcmVzcyksIGFuZCBub3RlcworICogdGhlIGR1cmF0aW9uIG9mIHRoZSBsZWFzZSBzcGVjaWZpZWQgaW4gdGhlIERIQ1BBQ0sgbWVzc2FnZS4gQXQgdGhpcworICogcG9pbnQsIHRoZSBjbGllbnQgaXMgY29uZmlndXJlZC4gSWYgdGhlIGNsaWVudCBkZXRlY3RzIHRoYXQgdGhlCisgKiBhZGRyZXNzIGlzIGFscmVhZHkgaW4gdXNlIChlLmcuLCB0aHJvdWdoIHRoZSB1c2Ugb2YgQVJQKSwKKyAqIHRoZSBjbGllbnQgTVVTVCBzZW5kIGEgREhDUERFQ0xJTkUgbWVzc2FnZSB0byB0aGUgc2VydmVyIGFuZCByZXN0YXJ0cworICogdGhlIGNvbmZpZ3VyYXRpb24gcHJvY2Vzcy4uLiIgKi8KKwkJCQkJaWYgKCFhcnBwaW5nKHBhY2tldC55aWFkZHIsCisJCQkJCQkJTlVMTCwKKwkJCQkJCQkodWludDMyX3QpIDAsCisJCQkJCQkJY2xpZW50X2NvbmZpZy5jbGllbnRfbWFjLAorCQkJCQkJCWNsaWVudF9jb25maWcuaW50ZXJmYWNlLAorCQkJCQkJCWFycHBpbmdfbXMpCisJCQkJCSkgeworCQkJCQkJYmJfaW5mb19tc2coIk9mZmVyZWQgYWRkcmVzcyBpcyBpbiB1c2UgIgorCQkJCQkJCSIoZ290IEFSUCByZXBseSksIGRlY2xpbmluZyIpOworCQkJCQkJc2VuZF9kZWNsaW5lKC8qeGlkLCovIHNlcnZlcl9hZGRyLCBwYWNrZXQueWlhZGRyKTsKKworCQkJCQkJaWYgKHN0YXRlICE9IFJFUVVFU1RJTkcpCisJCQkJCQkJdWRoY3BfcnVuX3NjcmlwdChOVUxMLCAiZGVjb25maWciKTsKKwkJCQkJCWNoYW5nZV9saXN0ZW5fbW9kZShMSVNURU5fUkFXKTsKKwkJCQkJCXN0YXRlID0gSU5JVF9TRUxFQ1RJTkc7CisJCQkJCQljbGllbnRfY29uZmlnLmZpcnN0X3NlY3MgPSAwOyAvKiBtYWtlIHNlY3MgZmllbGQgY291bnQgZnJvbSAwICovCisJCQkJCQlyZXF1ZXN0ZWRfaXAgPSAwOworCQkJCQkJdGltZW91dCA9IHRyeWFnYWluX3RpbWVvdXQ7CisJCQkJCQlwYWNrZXRfbnVtID0gMDsKKwkJCQkJCWFscmVhZHlfd2FpdGVkX3NlYyA9IDA7CisJCQkJCQljb250aW51ZTsgLyogYmFjayB0byBtYWluIGxvb3AgKi8KKwkJCQkJfQorCQkJCX0KKyNlbmRpZgorCQkJCS8qIGVudGVyIGJvdW5kIHN0YXRlICovCisJCQkJdGVtcF9hZGRyLnNfYWRkciA9IHBhY2tldC55aWFkZHI7CisJCQkJYmJfaW5mb19tc2coIkxlYXNlIG9mICVzIG9idGFpbmVkLCBsZWFzZSB0aW1lICV1IiwKKwkJCQkJaW5ldF9udG9hKHRlbXBfYWRkciksICh1bnNpZ25lZClsZWFzZV9zZWNvbmRzKTsKKwkJCQlyZXF1ZXN0ZWRfaXAgPSBwYWNrZXQueWlhZGRyOworCisJCQkJc3RhcnQgPSBtb25vdG9uaWNfc2VjKCk7CisJCQkJdWRoY3BfcnVuX3NjcmlwdCgmcGFja2V0LCBzdGF0ZSA9PSBSRVFVRVNUSU5HID8gImJvdW5kIiA6ICJyZW5ldyIpOworCQkJCWFscmVhZHlfd2FpdGVkX3NlYyA9ICh1bnNpZ25lZCltb25vdG9uaWNfc2VjKCkgLSBzdGFydDsKKwkJCQl0aW1lb3V0ID0gbGVhc2Vfc2Vjb25kcyAvIDI7CisJCQkJaWYgKCh1bnNpZ25lZCl0aW1lb3V0IDwgYWxyZWFkeV93YWl0ZWRfc2VjKSB7CisJCQkJCS8qIFNvbWV0aGluZyB3ZW50IHdyb25nLiBCYWNrIHRvIGRpc2NvdmVyIHN0YXRlICovCisJCQkJCXRpbWVvdXQgPSBhbHJlYWR5X3dhaXRlZF9zZWMgPSAwOworCQkJCX0KKworCQkJCXN0YXRlID0gQk9VTkQ7CisJCQkJY2hhbmdlX2xpc3Rlbl9tb2RlKExJU1RFTl9OT05FKTsKKwkJCQlpZiAob3B0ICYgT1BUX3EpIHsgLyogcXVpdCBhZnRlciBsZWFzZSAqLworCQkJCQlnb3RvIHJldDA7CisJCQkJfQorCQkJCS8qIGZ1dHVyZSByZW5ldyBmYWlsdXJlcyBzaG91bGQgbm90IGV4aXQgKEpNKSAqLworCQkJCW9wdCAmPSB+T1BUX247CisjaWYgQkJfTU1VIC8qIE5PTU1VIGNhc2UgYmFja2dyb3VuZGVkIGVhcmxpZXIgKi8KKwkJCQlpZiAoIShvcHQgJiBPUFRfZikpIHsKKwkJCQkJY2xpZW50X2JhY2tncm91bmQoKTsKKwkJCQkJLyogZG8gbm90IGJhY2tncm91bmQgYWdhaW4hICovCisJCQkJCW9wdCA9ICgob3B0ICYgfk9QVF9iKSB8IE9QVF9mKTsKKwkJCQl9CisjZW5kaWYKKwkJCQkvKiBtYWtlIGZ1dHVyZSByZW5ldyBwYWNrZXRzIHVzZSBkaWZmZXJlbnQgeGlkICovCisJCQkJLyogeGlkID0gcmFuZG9tX3hpZCgpOyAuLi5idXQgd2h5IGJvdGhlcj8gKi8KKworCQkJCWNvbnRpbnVlOyAvKiBiYWNrIHRvIG1haW4gbG9vcCAqLworCQkJfQorCQkJaWYgKCptZXNzYWdlID09IERIQ1BOQUspIHsKKwkJCQkvKiBJZiBuZXR3b3JrIGhhcyBtb3JlIHRoYW4gb25lIERIQ1Agc2VydmVyLAorCQkJCSAqICJ3cm9uZyIgc2VydmVyIGNhbiByZXBseSBmaXJzdCwgd2l0aCBhIE5BSy4KKwkJCQkgKiBEbyBub3QgaW50ZXJwcmV0IGl0IGFzIGEgTkFLIGZyb20gIm91ciIgc2VydmVyLgorCQkJCSAqLworCQkJCWlmIChzZXJ2ZXJfYWRkciAhPSAwKSB7CisJCQkJCXVpbnQzMl90IHN2aWQ7CisJCQkJCXVpbnQ4X3QgKnRlbXA7CisKKwkJCQkJdGVtcCA9IHVkaGNwX2dldF9vcHRpb24oJnBhY2tldCwgREhDUF9TRVJWRVJfSUQpOworCQkJCQlpZiAoIXRlbXApIHsKKyBub25fbWF0Y2hpbmdfc3ZpZDoKKwkJCQkJCWxvZzEoIiVzIHdpdGggd3Jvbmcgc2VydmVyIElELCBpZ25vcmluZyBwYWNrZXQiLAorCQkJCQkJCSJSZWNlaXZlZCBESENQIE5BSyIKKwkJCQkJCSk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCQltb3ZlX2Zyb21fdW5hbGlnbmVkMzIoc3ZpZCwgdGVtcCk7CisJCQkJCWlmIChzdmlkICE9IHNlcnZlcl9hZGRyKQorCQkJCQkJZ290byBub25fbWF0Y2hpbmdfc3ZpZDsKKwkJCQl9CisJCQkJLyogcmV0dXJuIHRvIGluaXQgc3RhdGUgKi8KKwkJCQliYl9pbmZvX21zZygiUmVjZWl2ZWQgREhDUCBOQUsiKTsKKwkJCQl1ZGhjcF9ydW5fc2NyaXB0KCZwYWNrZXQsICJuYWsiKTsKKwkJCQlpZiAoc3RhdGUgIT0gUkVRVUVTVElORykKKwkJCQkJdWRoY3BfcnVuX3NjcmlwdChOVUxMLCAiZGVjb25maWciKTsKKwkJCQljaGFuZ2VfbGlzdGVuX21vZGUoTElTVEVOX1JBVyk7CisJCQkJc2xlZXAoMyk7IC8qIGF2b2lkIGV4Y2Vzc2l2ZSBuZXR3b3JrIHRyYWZmaWMgKi8KKwkJCQlzdGF0ZSA9IElOSVRfU0VMRUNUSU5HOworCQkJCWNsaWVudF9jb25maWcuZmlyc3Rfc2VjcyA9IDA7IC8qIG1ha2Ugc2VjcyBmaWVsZCBjb3VudCBmcm9tIDAgKi8KKwkJCQlyZXF1ZXN0ZWRfaXAgPSAwOworCQkJCXRpbWVvdXQgPSAwOworCQkJCXBhY2tldF9udW0gPSAwOworCQkJCWFscmVhZHlfd2FpdGVkX3NlYyA9IDA7CisJCQl9CisJCQljb250aW51ZTsKKwkJLyogY2FzZSBCT1VORDogLSBpZ25vcmUgYWxsIHBhY2tldHMgKi8KKwkJLyogY2FzZSBSRUxFQVNFRDogLSBpZ25vcmUgYWxsIHBhY2tldHMgKi8KKwkJfQorCQkvKiBiYWNrIHRvIG1haW4gbG9vcCAqLworCX0gLyogZm9yICg7OykgLSBtYWluIGxvb3AgZW5kcyAqLworCisgcmV0MDoKKwlpZiAob3B0ICYgT1BUX1IpIC8qIHJlbGVhc2Ugb24gcXVpdCAqLworCQlwZXJmb3JtX3JlbGVhc2Uoc2VydmVyX2FkZHIsIHJlcXVlc3RlZF9pcCk7CisJcmV0dmFsID0gMDsKKyByZXQ6CisJLyppZiAoY2xpZW50X2NvbmZpZy5waWRmaWxlKSAtIHJlbW92ZV9waWRmaWxlIGhhcyBpdHMgb3duIGNoZWNrICovCisJCXJlbW92ZV9waWRmaWxlKGNsaWVudF9jb25maWcucGlkZmlsZSk7CisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvdWRoY3AvZGhjcGMuaCBiL25ldHdvcmtpbmcvdWRoY3AvZGhjcGMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjQyM2E1Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy91ZGhjcC9kaGNwYy5oCkBAIC0wLDAgKzEsNDEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpZm5kZWYgVURIQ1BfREhDUENfSAorI2RlZmluZSBVREhDUF9ESENQQ19IIDEKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKK3N0cnVjdCBjbGllbnRfY29uZmlnX3QgeworCXVpbnQ4X3QgY2xpZW50X21hY1s2XTsgICAgICAgICAgLyogT3VyIG1hYyBhZGRyZXNzICovCisJSUZfRkVBVFVSRV9VREhDUF9QT1JUKHVpbnQxNl90IHBvcnQ7KQorCWludCBpZmluZGV4OyAgICAgICAgICAgICAgICAgICAgLyogSW5kZXggbnVtYmVyIG9mIHRoZSBpbnRlcmZhY2UgdG8gdXNlICovCisJdWludDhfdCBvcHRfbWFza1syNTYgLyA4XTsgICAgICAvKiBCaXRtYXNrIG9mIG9wdGlvbnMgdG8gc2VuZCAoLU8gb3B0aW9uKSAqLworCWNvbnN0IGNoYXIgKmludGVyZmFjZTsgICAgICAgICAgLyogVGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSB0byB1c2UgKi8KKwljaGFyICpwaWRmaWxlOyAgICAgICAgICAgICAgICAgIC8qIE9wdGlvbmFsbHkgc3RvcmUgdGhlIHByb2Nlc3MgSUQgKi8KKwljb25zdCBjaGFyICpzY3JpcHQ7ICAgICAgICAgICAgIC8qIFVzZXIgc2NyaXB0IHRvIHJ1biBhdCBkaGNwIGV2ZW50cyAqLworCXN0cnVjdCBvcHRpb25fc2V0ICpvcHRpb25zOyAgICAgLyogbGlzdCBvZiBESENQIG9wdGlvbnMgdG8gc2VuZCB0byBzZXJ2ZXIgKi8KKwl1aW50OF90ICpjbGllbnRpZDsgICAgICAgICAgICAgIC8qIE9wdGlvbmFsIGNsaWVudCBpZCB0byB1c2UgKi8KKwl1aW50OF90ICp2ZW5kb3JjbGFzczsgICAgICAgICAgIC8qIE9wdGlvbmFsIHZlbmRvciBjbGFzcy1pZCB0byB1c2UgKi8KKwl1aW50OF90ICpob3N0bmFtZTsgICAgICAgICAgICAgIC8qIE9wdGlvbmFsIGhvc3RuYW1lIHRvIHVzZSAqLworCXVpbnQ4X3QgKmZxZG47ICAgICAgICAgICAgICAgICAgLyogT3B0aW9uYWwgZnVsbHkgcXVhbGlmaWVkIGRvbWFpbiBuYW1lIHRvIHVzZSAqLworCisJdWludDE2X3QgZmlyc3Rfc2VjczsKKwl1aW50MTZfdCBsYXN0X3NlY3M7Cit9IEZJWF9BTElBU0lORzsKKworLyogc2VydmVyX2NvbmZpZyBzaXRzIGluIDFzdCBoYWxmIG9mIGJiX2NvbW1vbl9idWZzaXoxICovCisjZGVmaW5lIGNsaWVudF9jb25maWcgKCooc3RydWN0IGNsaWVudF9jb25maWdfdCopKCZiYl9jb21tb25fYnVmc2l6MVtDT01NT05fQlVGU0laRSAvIDJdKSkKKworI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQX1BPUlQKKyNkZWZpbmUgQ0xJRU5UX1BPUlQgIChjbGllbnRfY29uZmlnLnBvcnQpCisjZGVmaW5lIENMSUVOVF9QT1JUNiAoY2xpZW50X2NvbmZpZy5wb3J0KQorI2Vsc2UKKyNkZWZpbmUgQ0xJRU5UX1BPUlQgIDY4CisjZGVmaW5lIENMSUVOVF9QT1JUNiA1NDYKKyNlbmRpZgorCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvdWRoY3AvZGhjcGQuYyBiL25ldHdvcmtpbmcvdWRoY3AvZGhjcGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGUwNzRmCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy91ZGhjcC9kaGNwZC5jCkBAIC0wLDAgKzEsNjc5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiB1ZGhjcCBzZXJ2ZXIKKyAqIENvcHlyaWdodCAoQykgMTk5OSBNYXR0aGV3IFJhbXNheSA8bWF0dGhld3JAbW9yZXRvbi5jb20uYXU+CisgKgkJCUNocmlzIFRyZXcgPGN0cmV3QG1vcmV0b24uY29tLmF1PgorICoKKyAqIFJld3JpdGUgYnkgUnVzcyBEaWxsIDxSdXNzLkRpbGxAYXN1LmVkdT4gSnVseSAyMDAxCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHVkaGNwZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1mU10gWy1JIEFERFJdIiBJRl9GRUFUVVJFX1VESENQX1BPUlQoIiBbLVAgTl0iKSAiIFtDT05GRklMRV0iCisvL3VzYWdlOiNkZWZpbmUgdWRoY3BkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiREhDUCBzZXJ2ZXJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJUnVuIGluIGZvcmVncm91bmQiCisvL3VzYWdlOiAgICAgIlxuCS1TCUxvZyB0byBzeXNsb2cgdG9vIgorLy91c2FnZTogICAgICJcbgktSSBBRERSCUxvY2FsIGFkZHJlc3MiCisvL3VzYWdlOiAgICAgIlxuCS1hIE1TRUMJVGltZW91dCBmb3IgQVJQIHBpbmcgKGRlZmF1bHQgMjAwMCkiCisvL3VzYWdlOglJRl9GRUFUVVJFX1VESENQX1BPUlQoCisvL3VzYWdlOiAgICAgIlxuCS1QIE4JVXNlIHBvcnQgTiAoZGVmYXVsdCA2NykiCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJkaGNwYy5oIgorI2luY2x1ZGUgImRoY3BkLmgiCisKKworLyogU2VuZCBhIHBhY2tldCB0byBhIHNwZWNpZmljIG1hYyBhZGRyZXNzIGFuZCBpcCBhZGRyZXNzIGJ5IGNyZWF0aW5nIG91ciBvd24gaXAgcGFja2V0ICovCitzdGF0aWMgdm9pZCBzZW5kX3BhY2tldF90b19jbGllbnQoc3RydWN0IGRoY3BfcGFja2V0ICpkaGNwX3BrdCwgaW50IGZvcmNlX2Jyb2FkY2FzdCkKK3sKKwljb25zdCB1aW50OF90ICpjaGFkZHI7CisJdWludDMyX3QgY2lhZGRyOworCisJLy8gV2FzOgorCS8vaWYgKGZvcmNlX2Jyb2FkY2FzdCkgeyAvKiBicm9hZGNhc3QgKi8gfQorCS8vZWxzZSBpZiAoZGhjcF9wa3QtPmNpYWRkcikgeyAvKiB1bmljYXN0IHRvIGRoY3BfcGt0LT5jaWFkZHIgKi8gfQorCS8vZWxzZSBpZiAoZGhjcF9wa3QtPmZsYWdzICYgaHRvbnMoQlJPQURDQVNUX0ZMQUcpKSB7IC8qIGJyb2FkY2FzdCAqLyB9CisJLy9lbHNlIHsgLyogdW5pY2FzdCB0byBkaGNwX3BrdC0+eWlhZGRyICovIH0KKwkvLyBCdXQgdGhpcyBpcyB3cm9uZzogeWlhZGRyIGlzIF9vdXJfIGlkZWEgd2hhdCBjbGllbnQncyBJUCBpcworCS8vIChmb3IgZXhhbXBsZSwgZnJvbSBsZWFzZSBmaWxlKS4gQ2xpZW50IG1heSBub3Qga25vdyB0aGF0LAorCS8vIGFuZCBtYXkgbm90IGhhdmUgVURQIHNvY2tldCBsaXN0ZW5pbmcgb24gdGhhdCBJUCEKKwkvLyBXZSBzaG91bGQgbmV2ZXIgdW5pY2FzdCB0byBkaGNwX3BrdC0+eWlhZGRyIQorCS8vIGRoY3BfcGt0LT5jaWFkZHIsIE9UT0gsIGNvbWVzIGZyb20gY2xpZW50J3MgcmVxdWVzdCBwYWNrZXQsCisJLy8gYW5kIGNhbiBiZSB1c2VkLgorCisJaWYgKGZvcmNlX2Jyb2FkY2FzdAorCSB8fCAoZGhjcF9wa3QtPmZsYWdzICYgaHRvbnMoQlJPQURDQVNUX0ZMQUcpKQorCSB8fCBkaGNwX3BrdC0+Y2lhZGRyID09IDAKKwkpIHsKKwkJbG9nMSgiQnJvYWRjYXN0aW5nIHBhY2tldCB0byBjbGllbnQiKTsKKwkJY2lhZGRyID0gSU5BRERSX0JST0FEQ0FTVDsKKwkJY2hhZGRyID0gTUFDX0JDQVNUX0FERFI7CisJfSBlbHNlIHsKKwkJbG9nMSgiVW5pY2FzdGluZyBwYWNrZXQgdG8gY2xpZW50IGNpYWRkciIpOworCQljaWFkZHIgPSBkaGNwX3BrdC0+Y2lhZGRyOworCQljaGFkZHIgPSBkaGNwX3BrdC0+Y2hhZGRyOworCX0KKworCXVkaGNwX3NlbmRfcmF3X3BhY2tldChkaGNwX3BrdCwKKwkJLypzcmMqLyBzZXJ2ZXJfY29uZmlnLnNlcnZlcl9uaXAsIFNFUlZFUl9QT1JULAorCQkvKmRzdCovIGNpYWRkciwgQ0xJRU5UX1BPUlQsIGNoYWRkciwKKwkJc2VydmVyX2NvbmZpZy5pZmluZGV4KTsKK30KKworLyogU2VuZCBhIHBhY2tldCB0byBnYXRld2F5X25pcCB1c2luZyB0aGUga2VybmVsIGlwIHN0YWNrICovCitzdGF0aWMgdm9pZCBzZW5kX3BhY2tldF90b19yZWxheShzdHJ1Y3QgZGhjcF9wYWNrZXQgKmRoY3BfcGt0KQoreworCWxvZzEoIkZvcndhcmRpbmcgcGFja2V0IHRvIHJlbGF5Iik7CisKKwl1ZGhjcF9zZW5kX2tlcm5lbF9wYWNrZXQoZGhjcF9wa3QsCisJCQlzZXJ2ZXJfY29uZmlnLnNlcnZlcl9uaXAsIFNFUlZFUl9QT1JULAorCQkJZGhjcF9wa3QtPmdhdGV3YXlfbmlwLCBTRVJWRVJfUE9SVCk7Cit9CisKK3N0YXRpYyB2b2lkIHNlbmRfcGFja2V0KHN0cnVjdCBkaGNwX3BhY2tldCAqZGhjcF9wa3QsIGludCBmb3JjZV9icm9hZGNhc3QpCit7CisJaWYgKGRoY3BfcGt0LT5nYXRld2F5X25pcCkKKwkJc2VuZF9wYWNrZXRfdG9fcmVsYXkoZGhjcF9wa3QpOworCWVsc2UKKwkJc2VuZF9wYWNrZXRfdG9fY2xpZW50KGRoY3BfcGt0LCBmb3JjZV9icm9hZGNhc3QpOworfQorCitzdGF0aWMgdm9pZCBpbml0X3BhY2tldChzdHJ1Y3QgZGhjcF9wYWNrZXQgKnBhY2tldCwgc3RydWN0IGRoY3BfcGFja2V0ICpvbGRwYWNrZXQsIGNoYXIgdHlwZSkKK3sKKwkvKiBTZXRzIG9wLCBodHlwZSwgaGxlbiwgY29va2llIGZpZWxkcworCSAqIGFuZCBhZGRzIERIQ1BfTUVTU0FHRV9UWVBFIG9wdGlvbiAqLworCXVkaGNwX2luaXRfaGVhZGVyKHBhY2tldCwgdHlwZSk7CisKKwlwYWNrZXQtPnhpZCA9IG9sZHBhY2tldC0+eGlkOworCW1lbWNweShwYWNrZXQtPmNoYWRkciwgb2xkcGFja2V0LT5jaGFkZHIsIHNpemVvZihvbGRwYWNrZXQtPmNoYWRkcikpOworCXBhY2tldC0+ZmxhZ3MgPSBvbGRwYWNrZXQtPmZsYWdzOworCXBhY2tldC0+Z2F0ZXdheV9uaXAgPSBvbGRwYWNrZXQtPmdhdGV3YXlfbmlwOworCXBhY2tldC0+Y2lhZGRyID0gb2xkcGFja2V0LT5jaWFkZHI7CisJdWRoY3BfYWRkX3NpbXBsZV9vcHRpb24ocGFja2V0LCBESENQX1NFUlZFUl9JRCwgc2VydmVyX2NvbmZpZy5zZXJ2ZXJfbmlwKTsKK30KKworLyogRmlsbCBvcHRpb25zIGZpZWxkLCBzaWFkZHJfbmlwLCBhbmQgc25hbWUgYW5kIGJvb3RfZmlsZSBmaWVsZHMuCisgKiBUT0RPOiB0ZWFjaCB0aGlzIGNvZGUgdG8gdXNlIG92ZXJsb2FkIG9wdGlvbi4KKyAqLworc3RhdGljIHZvaWQgYWRkX3NlcnZlcl9vcHRpb25zKHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0KQoreworCXN0cnVjdCBvcHRpb25fc2V0ICpjdXJyID0gc2VydmVyX2NvbmZpZy5vcHRpb25zOworCisJd2hpbGUgKGN1cnIpIHsKKwkJaWYgKGN1cnItPmRhdGFbT1BUX0NPREVdICE9IERIQ1BfTEVBU0VfVElNRSkKKwkJCXVkaGNwX2FkZF9iaW5hcnlfb3B0aW9uKHBhY2tldCwgY3Vyci0+ZGF0YSk7CisJCWN1cnIgPSBjdXJyLT5uZXh0OworCX0KKworCXBhY2tldC0+c2lhZGRyX25pcCA9IHNlcnZlcl9jb25maWcuc2lhZGRyX25pcDsKKworCWlmIChzZXJ2ZXJfY29uZmlnLnNuYW1lKQorCQlzdHJuY3B5KChjaGFyKilwYWNrZXQtPnNuYW1lLCBzZXJ2ZXJfY29uZmlnLnNuYW1lLCBzaXplb2YocGFja2V0LT5zbmFtZSkgLSAxKTsKKwlpZiAoc2VydmVyX2NvbmZpZy5ib290X2ZpbGUpCisJCXN0cm5jcHkoKGNoYXIqKXBhY2tldC0+ZmlsZSwgc2VydmVyX2NvbmZpZy5ib290X2ZpbGUsIHNpemVvZihwYWNrZXQtPmZpbGUpIC0gMSk7Cit9CisKK3N0YXRpYyB1aW50MzJfdCBzZWxlY3RfbGVhc2VfdGltZShzdHJ1Y3QgZGhjcF9wYWNrZXQgKnBhY2tldCkKK3sKKwl1aW50MzJfdCBsZWFzZV90aW1lX3NlYyA9IHNlcnZlcl9jb25maWcubWF4X2xlYXNlX3NlYzsKKwl1aW50OF90ICpsZWFzZV90aW1lX29wdCA9IHVkaGNwX2dldF9vcHRpb24ocGFja2V0LCBESENQX0xFQVNFX1RJTUUpOworCWlmIChsZWFzZV90aW1lX29wdCkgeworCQltb3ZlX2Zyb21fdW5hbGlnbmVkMzIobGVhc2VfdGltZV9zZWMsIGxlYXNlX3RpbWVfb3B0KTsKKwkJbGVhc2VfdGltZV9zZWMgPSBudG9obChsZWFzZV90aW1lX3NlYyk7CisJCWlmIChsZWFzZV90aW1lX3NlYyA+IHNlcnZlcl9jb25maWcubWF4X2xlYXNlX3NlYykKKwkJCWxlYXNlX3RpbWVfc2VjID0gc2VydmVyX2NvbmZpZy5tYXhfbGVhc2Vfc2VjOworCQlpZiAobGVhc2VfdGltZV9zZWMgPCBzZXJ2ZXJfY29uZmlnLm1pbl9sZWFzZV9zZWMpCisJCQlsZWFzZV90aW1lX3NlYyA9IHNlcnZlcl9jb25maWcubWluX2xlYXNlX3NlYzsKKwl9CisJcmV0dXJuIGxlYXNlX3RpbWVfc2VjOworfQorCisvKiBXZSBnb3QgYSBESENQIERJU0NPVkVSLiBTZW5kIGFuIE9GRkVSLiAqLworLyogTk9JTkxJTkU6IGxpbWl0IHN0YWNrIHVzYWdlIGluIGNhbGxlciAqLworc3RhdGljIE5PSU5MSU5FIHZvaWQgc2VuZF9vZmZlcihzdHJ1Y3QgZGhjcF9wYWNrZXQgKm9sZHBhY2tldCwKKwkJdWludDMyX3Qgc3RhdGljX2xlYXNlX25pcCwKKwkJc3RydWN0IGR5bl9sZWFzZSAqbGVhc2UsCisJCXVpbnQ4X3QgKnJlcXVlc3RlZF9pcF9vcHQsCisJCXVuc2lnbmVkIGFycHBpbmdfbXMpCit7CisJc3RydWN0IGRoY3BfcGFja2V0IHBhY2tldDsKKwl1aW50MzJfdCBsZWFzZV90aW1lX3NlYzsKKwlzdHJ1Y3QgaW5fYWRkciBhZGRyOworCisJaW5pdF9wYWNrZXQoJnBhY2tldCwgb2xkcGFja2V0LCBESENQT0ZGRVIpOworCisJLyogSWYgaXQgaXMgYSBzdGF0aWMgbGVhc2UsIHVzZSBpdHMgSVAgKi8KKwlwYWNrZXQueWlhZGRyID0gc3RhdGljX2xlYXNlX25pcDsKKwkvKiBFbHNlOiAqLworCWlmICghc3RhdGljX2xlYXNlX25pcCkgeworCQkvKiBXZSBoYXZlIG5vIHN0YXRpYyBsZWFzZSBmb3IgY2xpZW50J3MgY2hhZGRyICovCisJCXVpbnQzMl90IHJlcV9uaXA7CisJCWNvbnN0IGNoYXIgKnBfaG9zdF9uYW1lOworCisJCWlmIChsZWFzZSkgeworCQkJLyogV2UgaGF2ZSBhIGR5bmFtaWMgbGVhc2UgZm9yIGNsaWVudCdzIGNoYWRkci4KKwkJCSAqIFJldXNlIGl0cyBJUCAoZXZlbiBpZiBsZWFzZSBpcyBleHBpcmVkKS4KKwkJCSAqIE5vdGUgdGhhdCB3ZSBpZ25vcmUgcmVxdWVzdGVkIElQIGluIHRoaXMgY2FzZS4KKwkJCSAqLworCQkJcGFja2V0LnlpYWRkciA9IGxlYXNlLT5sZWFzZV9uaXA7CisJCX0KKwkJLyogT3I6IGlmIGNsaWVudCBoYXMgcmVxdWVzdGVkIGFuIElQICovCisJCWVsc2UgaWYgKHJlcXVlc3RlZF9pcF9vcHQgIT0gTlVMTAorCQkgLyogKHJlYWQgSVApICovCisJCSAmJiAobW92ZV9mcm9tX3VuYWxpZ25lZDMyKHJlcV9uaXAsIHJlcXVlc3RlZF9pcF9vcHQpLCAxKQorCQkgLyogYW5kIHRoZSBJUCBpcyBpbiB0aGUgbGVhc2UgcmFuZ2UgKi8KKwkJICYmIG50b2hsKHJlcV9uaXApID49IHNlcnZlcl9jb25maWcuc3RhcnRfaXAKKwkJICYmIG50b2hsKHJlcV9uaXApIDw9IHNlcnZlcl9jb25maWcuZW5kX2lwCisJCSAvKiBhbmQgKi8KKwkJICYmICggICEobGVhc2UgPSBmaW5kX2xlYXNlX2J5X25pcChyZXFfbmlwKSkgLyogaXMgbm90IGFscmVhZHkgdGFrZW4gKi8KKwkJICAgIHx8IGlzX2V4cGlyZWRfbGVhc2UobGVhc2UpIC8qIG9yIGlzIHRha2VuLCBidXQgZXhwaXJlZCAqLworCQkgICAgKQorCQkpIHsKKwkJCXBhY2tldC55aWFkZHIgPSByZXFfbmlwOworCQl9CisJCWVsc2UgeworCQkJLyogT3RoZXJ3aXNlLCBmaW5kIGEgZnJlZSBJUCAqLworCQkJcGFja2V0LnlpYWRkciA9IGZpbmRfZnJlZV9vcl9leHBpcmVkX25pcChvbGRwYWNrZXQtPmNoYWRkciwgYXJwcGluZ19tcyk7CisJCX0KKworCQlpZiAoIXBhY2tldC55aWFkZHIpIHsKKwkJCWJiX2Vycm9yX21zZygibm8gZnJlZSBJUCBhZGRyZXNzZXMuIE9GRkVSIGFiYW5kb25lZCIpOworCQkJcmV0dXJuOworCQl9CisJCS8qIFJlc2VydmUgdGhlIElQIGZvciBhIHNob3J0IHRpbWUgaG9waW5nIHRvIGdldCBESENQUkVRVUVTVCBzb29uICovCisJCXBfaG9zdF9uYW1lID0gKGNvbnN0IGNoYXIqKSB1ZGhjcF9nZXRfb3B0aW9uKG9sZHBhY2tldCwgREhDUF9IT1NUX05BTUUpOworCQlsZWFzZSA9IGFkZF9sZWFzZShwYWNrZXQuY2hhZGRyLCBwYWNrZXQueWlhZGRyLAorCQkJCXNlcnZlcl9jb25maWcub2ZmZXJfdGltZSwKKwkJCQlwX2hvc3RfbmFtZSwKKwkJCQlwX2hvc3RfbmFtZSA/ICh1bnNpZ25lZCBjaGFyKXBfaG9zdF9uYW1lW09QVF9MRU4gLSBPUFRfREFUQV0gOiAwCisJCSk7CisJCWlmICghbGVhc2UpIHsKKwkJCWJiX2Vycm9yX21zZygibm8gZnJlZSBJUCBhZGRyZXNzZXMuIE9GRkVSIGFiYW5kb25lZCIpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJbGVhc2VfdGltZV9zZWMgPSBzZWxlY3RfbGVhc2VfdGltZShvbGRwYWNrZXQpOworCXVkaGNwX2FkZF9zaW1wbGVfb3B0aW9uKCZwYWNrZXQsIERIQ1BfTEVBU0VfVElNRSwgaHRvbmwobGVhc2VfdGltZV9zZWMpKTsKKwlhZGRfc2VydmVyX29wdGlvbnMoJnBhY2tldCk7CisKKwlhZGRyLnNfYWRkciA9IHBhY2tldC55aWFkZHI7CisJYmJfaW5mb19tc2coIlNlbmRpbmcgT0ZGRVIgb2YgJXMiLCBpbmV0X250b2EoYWRkcikpOworCS8qIHNlbmRfcGFja2V0IGVtaXRzIGVycm9yIG1lc3NhZ2UgaXRzZWxmIGlmIGl0IGRldGVjdHMgZmFpbHVyZSAqLworCXNlbmRfcGFja2V0KCZwYWNrZXQsIC8qZm9yY2VfYmNhc3Q6Ki8gMCk7Cit9CisKKy8qIE5PSU5MSU5FOiBsaW1pdCBzdGFjayB1c2FnZSBpbiBjYWxsZXIgKi8KK3N0YXRpYyBOT0lOTElORSB2b2lkIHNlbmRfTkFLKHN0cnVjdCBkaGNwX3BhY2tldCAqb2xkcGFja2V0KQoreworCXN0cnVjdCBkaGNwX3BhY2tldCBwYWNrZXQ7CisKKwlpbml0X3BhY2tldCgmcGFja2V0LCBvbGRwYWNrZXQsIERIQ1BOQUspOworCisJbG9nMSgiU2VuZGluZyBOQUsiKTsKKwlzZW5kX3BhY2tldCgmcGFja2V0LCAvKmZvcmNlX2JjYXN0OiovIDEpOworfQorCisvKiBOT0lOTElORTogbGltaXQgc3RhY2sgdXNhZ2UgaW4gY2FsbGVyICovCitzdGF0aWMgTk9JTkxJTkUgdm9pZCBzZW5kX0FDSyhzdHJ1Y3QgZGhjcF9wYWNrZXQgKm9sZHBhY2tldCwgdWludDMyX3QgeWlhZGRyKQoreworCXN0cnVjdCBkaGNwX3BhY2tldCBwYWNrZXQ7CisJdWludDMyX3QgbGVhc2VfdGltZV9zZWM7CisJc3RydWN0IGluX2FkZHIgYWRkcjsKKwljb25zdCBjaGFyICpwX2hvc3RfbmFtZTsKKworCWluaXRfcGFja2V0KCZwYWNrZXQsIG9sZHBhY2tldCwgREhDUEFDSyk7CisJcGFja2V0LnlpYWRkciA9IHlpYWRkcjsKKworCWxlYXNlX3RpbWVfc2VjID0gc2VsZWN0X2xlYXNlX3RpbWUob2xkcGFja2V0KTsKKwl1ZGhjcF9hZGRfc2ltcGxlX29wdGlvbigmcGFja2V0LCBESENQX0xFQVNFX1RJTUUsIGh0b25sKGxlYXNlX3RpbWVfc2VjKSk7CisKKwlhZGRfc2VydmVyX29wdGlvbnMoJnBhY2tldCk7CisKKwlhZGRyLnNfYWRkciA9IHlpYWRkcjsKKwliYl9pbmZvX21zZygiU2VuZGluZyBBQ0sgdG8gJXMiLCBpbmV0X250b2EoYWRkcikpOworCXNlbmRfcGFja2V0KCZwYWNrZXQsIC8qZm9yY2VfYmNhc3Q6Ki8gMCk7CisKKwlwX2hvc3RfbmFtZSA9IChjb25zdCBjaGFyKikgdWRoY3BfZ2V0X29wdGlvbihvbGRwYWNrZXQsIERIQ1BfSE9TVF9OQU1FKTsKKwlhZGRfbGVhc2UocGFja2V0LmNoYWRkciwgcGFja2V0LnlpYWRkciwKKwkJbGVhc2VfdGltZV9zZWMsCisJCXBfaG9zdF9uYW1lLAorCQlwX2hvc3RfbmFtZSA/ICh1bnNpZ25lZCBjaGFyKXBfaG9zdF9uYW1lW09QVF9MRU4gLSBPUFRfREFUQV0gOiAwCisJKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfVURIQ1BEX1dSSVRFX0xFQVNFU19FQVJMWSkgeworCQkvKiByZXdyaXRlIHRoZSBmaWxlIHdpdGggbGVhc2VzIGF0IGV2ZXJ5IG5ldyBhY2NlcHRhbmNlICovCisJCXdyaXRlX2xlYXNlcygpOworCX0KK30KKworLyogTk9JTkxJTkU6IGxpbWl0IHN0YWNrIHVzYWdlIGluIGNhbGxlciAqLworc3RhdGljIE5PSU5MSU5FIHZvaWQgc2VuZF9pbmZvcm0oc3RydWN0IGRoY3BfcGFja2V0ICpvbGRwYWNrZXQpCit7CisJc3RydWN0IGRoY3BfcGFja2V0IHBhY2tldDsKKworCS8qICJJZiBhIGNsaWVudCBoYXMgb2J0YWluZWQgYSBuZXR3b3JrIGFkZHJlc3MgdGhyb3VnaCBzb21lIG90aGVyIG1lYW5zCisJICogKGUuZy4sIG1hbnVhbCBjb25maWd1cmF0aW9uKSwgaXQgbWF5IHVzZSBhIERIQ1BJTkZPUk0gcmVxdWVzdCBtZXNzYWdlCisJICogdG8gb2J0YWluIG90aGVyIGxvY2FsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4gIFNlcnZlcnMgcmVjZWl2aW5nIGEKKwkgKiBESENQSU5GT1JNIG1lc3NhZ2UgY29uc3RydWN0IGEgREhDUEFDSyBtZXNzYWdlIHdpdGggYW55IGxvY2FsCisJICogY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFwcHJvcHJpYXRlIGZvciB0aGUgY2xpZW50IHdpdGhvdXQ6CisJICogYWxsb2NhdGluZyBhIG5ldyBhZGRyZXNzLCBjaGVja2luZyBmb3IgYW4gZXhpc3RpbmcgYmluZGluZywgZmlsbGluZworCSAqIGluICd5aWFkZHInIG9yIGluY2x1ZGluZyBsZWFzZSB0aW1lIHBhcmFtZXRlcnMuICBUaGUgc2VydmVycyBTSE9VTEQKKwkgKiB1bmljYXN0IHRoZSBESENQQUNLIHJlcGx5IHRvIHRoZSBhZGRyZXNzIGdpdmVuIGluIHRoZSAnY2lhZGRyJyBmaWVsZAorCSAqIG9mIHRoZSBESENQSU5GT1JNIG1lc3NhZ2UuCisJICogLi4uCisJICogVGhlIHNlcnZlciByZXNwb25kcyB0byBhIERIQ1BJTkZPUk0gbWVzc2FnZSBieSBzZW5kaW5nIGEgREhDUEFDSworCSAqIG1lc3NhZ2UgZGlyZWN0bHkgdG8gdGhlIGFkZHJlc3MgZ2l2ZW4gaW4gdGhlICdjaWFkZHInIGZpZWxkCisJICogb2YgdGhlIERIQ1BJTkZPUk0gbWVzc2FnZS4gIFRoZSBzZXJ2ZXIgTVVTVCBOT1Qgc2VuZCBhIGxlYXNlCisJICogZXhwaXJhdGlvbiB0aW1lIHRvIHRoZSBjbGllbnQgYW5kIFNIT1VMRCBOT1QgZmlsbCBpbiAneWlhZGRyJy4iCisJICovCisvL1RPRE86IGRvIGEgZmV3IHNhbml0eSBjaGVja3M6IGlzIGNpYWRkciBzZXQ/CisvL0JldHRlciB5ZXQ6IGlzIGNpYWRkciA9PSBJUCBzb3VyY2UgYWRkcj8KKwlpbml0X3BhY2tldCgmcGFja2V0LCBvbGRwYWNrZXQsIERIQ1BBQ0spOworCWFkZF9zZXJ2ZXJfb3B0aW9ucygmcGFja2V0KTsKKworCXNlbmRfcGFja2V0KCZwYWNrZXQsIC8qZm9yY2VfYmNhc3Q6Ki8gMCk7Cit9CisKKworLyogZ2xvYmFscyAqLworc3RydWN0IGR5bl9sZWFzZSAqZ19sZWFzZXM7CisvKiBzdHJ1Y3Qgc2VydmVyX2NvbmZpZ190IHNlcnZlcl9jb25maWcgaXMgaW4gYmJfY29tbW9uX2J1ZnNpejEgKi8KKworCitpbnQgdWRoY3BkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB1ZGhjcGRfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBzZXJ2ZXJfc29ja2V0ID0gLTEsIHJldHZhbCwgbWF4X3NvY2s7CisJdWludDhfdCAqc3RhdGU7CisJdW5zaWduZWQgdGltZW91dF9lbmQ7CisJdW5zaWduZWQgbnVtX2lwczsKKwl1bnNpZ25lZCBvcHQ7CisJc3RydWN0IG9wdGlvbl9zZXQgKm9wdGlvbjsKKwljaGFyICpzdHJfSSA9IHN0cl9JOworCWNvbnN0IGNoYXIgKnN0cl9hID0gIjIwMDAiOworCXVuc2lnbmVkIGFycHBpbmdfbXM7CisJSUZfRkVBVFVSRV9VREhDUF9QT1JUKGNoYXIgKnN0cl9QOykKKworI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQX1BPUlQKKwlTRVJWRVJfUE9SVCA9IDY3OworCUNMSUVOVF9QT1JUID0gNjg7CisjZW5kaWYKKworI2lmIGRlZmluZWQgQ09ORklHX1VESENQX0RFQlVHICYmIENPTkZJR19VREhDUF9ERUJVRyA+PSAxCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAidnYiOworI2VuZGlmCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImZTSTp2YToiCisJCUlGX0ZFQVRVUkVfVURIQ1BfUE9SVCgiUDoiKQorCQksICZzdHJfSQorCQksICZzdHJfYQorCQlJRl9GRUFUVVJFX1VESENQX1BPUlQoLCAmc3RyX1ApCisJCUlGX1VESENQX1ZFUkJPU0UoLCAmZGhjcF92ZXJib3NlKQorCQkpOworCWlmICghKG9wdCAmIDEpKSB7IC8qIG5vIC1mICovCisJCWJiX2RhZW1vbml6ZV9vcl9yZXhlYygwLCBhcmd2KTsKKwkJbG9nbW9kZSA9IExPR01PREVfTk9ORTsKKwl9CisJLyogdXBkYXRlIGFyZ3YgYWZ0ZXIgdGhlIHBvc3NpYmxlIHZmb3JrK2V4ZWMgaW4gZGFlbW9uaXplICovCisJYXJndiArPSBvcHRpbmQ7CisJaWYgKG9wdCAmIDIpIHsgLyogLVMgKi8KKwkJb3BlbmxvZyhhcHBsZXRfbmFtZSwgTE9HX1BJRCwgTE9HX0RBRU1PTik7CisJCWxvZ21vZGUgfD0gTE9HTU9ERV9TWVNMT0c7CisJfQorCWlmIChvcHQgJiA0KSB7IC8qIC1JICovCisJCWxlbl9hbmRfc29ja2FkZHIgKmxzYSA9IHhob3N0X2FuZF9hZjJzb2NrYWRkcihzdHJfSSwgMCwgQUZfSU5FVCk7CisJCXNlcnZlcl9jb25maWcuc2VydmVyX25pcCA9IGxzYS0+dS5zaW4uc2luX2FkZHIuc19hZGRyOworCQlmcmVlKGxzYSk7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQX1BPUlQKKwlpZiAob3B0ICYgMzIpIHsgLyogLVAgKi8KKwkJU0VSVkVSX1BPUlQgPSB4YXRvdTE2KHN0cl9QKTsKKwkJQ0xJRU5UX1BPUlQgPSBTRVJWRVJfUE9SVCArIDE7CisJfQorI2VuZGlmCisJYXJwcGluZ19tcyA9IHhhdG91KHN0cl9hKTsKKworCS8qIFdvdWxkIHJhdGhlciBub3QgZG8gcmVhZF9jb25maWcgYmVmb3JlIGRhZW1vbml6YXRpb24gLQorCSAqIG90aGVyd2lzZSBOT01NVSBtYWNoaW5lcyB3aWxsIHBhcnNlIGNvbmZpZyB0d2ljZSAqLworCXJlYWRfY29uZmlnKGFyZ3ZbMF0gPyBhcmd2WzBdIDogREhDUERfQ09ORl9GSUxFKTsKKworCS8qIE1ha2Ugc3VyZSBmZCAwLDEsMiBhcmUgb3BlbiAqLworCWJiX3Nhbml0aXplX3N0ZGlvKCk7CisJLyogRXF1aXZhbGVudCBvZiBkb2luZyBhIGZmbHVzaCBhZnRlciBldmVyeSBcbiAqLworCXNldGxpbmVidWYoc3Rkb3V0KTsKKworCS8qIENyZWF0ZSBwaWRmaWxlICovCisJd3JpdGVfcGlkZmlsZShzZXJ2ZXJfY29uZmlnLnBpZGZpbGUpOworCS8qIGlmICghLi4pIGJiX3BlcnJvcl9tc2coImNhbid0IGNyZWF0ZSBwaWRmaWxlICVzIiwgcGlkZmlsZSk7ICovCisKKwliYl9pbmZvX21zZygiJXMgKHYiQkJfVkVSIikgc3RhcnRlZCIsIGFwcGxldF9uYW1lKTsKKworCW9wdGlvbiA9IHVkaGNwX2ZpbmRfb3B0aW9uKHNlcnZlcl9jb25maWcub3B0aW9ucywgREhDUF9MRUFTRV9USU1FKTsKKwlzZXJ2ZXJfY29uZmlnLm1heF9sZWFzZV9zZWMgPSBERUZBVUxUX0xFQVNFX1RJTUU7CisJaWYgKG9wdGlvbikgeworCQltb3ZlX2Zyb21fdW5hbGlnbmVkMzIoc2VydmVyX2NvbmZpZy5tYXhfbGVhc2Vfc2VjLCBvcHRpb24tPmRhdGEgKyBPUFRfREFUQSk7CisJCXNlcnZlcl9jb25maWcubWF4X2xlYXNlX3NlYyA9IG50b2hsKHNlcnZlcl9jb25maWcubWF4X2xlYXNlX3NlYyk7CisJfQorCisJLyogU2FuaXR5IGNoZWNrICovCisJbnVtX2lwcyA9IHNlcnZlcl9jb25maWcuZW5kX2lwIC0gc2VydmVyX2NvbmZpZy5zdGFydF9pcCArIDE7CisJaWYgKHNlcnZlcl9jb25maWcubWF4X2xlYXNlcyA+IG51bV9pcHMpIHsKKwkJYmJfZXJyb3JfbXNnKCJtYXhfbGVhc2VzPSV1IGlzIHRvbyBiaWcsIHNldHRpbmcgdG8gJXUiLAorCQkJKHVuc2lnbmVkKXNlcnZlcl9jb25maWcubWF4X2xlYXNlcywgbnVtX2lwcyk7CisJCXNlcnZlcl9jb25maWcubWF4X2xlYXNlcyA9IG51bV9pcHM7CisJfQorCisJZ19sZWFzZXMgPSB4emFsbG9jKHNlcnZlcl9jb25maWcubWF4X2xlYXNlcyAqIHNpemVvZihnX2xlYXNlc1swXSkpOworCXJlYWRfbGVhc2VzKHNlcnZlcl9jb25maWcubGVhc2VfZmlsZSk7CisKKwlpZiAodWRoY3BfcmVhZF9pbnRlcmZhY2Uoc2VydmVyX2NvbmZpZy5pbnRlcmZhY2UsCisJCQkmc2VydmVyX2NvbmZpZy5pZmluZGV4LAorCQkJKHNlcnZlcl9jb25maWcuc2VydmVyX25pcCA9PSAwID8gJnNlcnZlcl9jb25maWcuc2VydmVyX25pcCA6IE5VTEwpLAorCQkJc2VydmVyX2NvbmZpZy5zZXJ2ZXJfbWFjKQorCSkgeworCQlyZXR2YWwgPSAxOworCQlnb3RvIHJldDsKKwl9CisKKwkvKiBTZXR1cCB0aGUgc2lnbmFsIHBpcGUgKi8KKwl1ZGhjcF9zcF9zZXR1cCgpOworCisgY29udGludWVfd2l0aF9hdXRvdGltZToKKwl0aW1lb3V0X2VuZCA9IG1vbm90b25pY19zZWMoKSArIHNlcnZlcl9jb25maWcuYXV0b190aW1lOworCXdoaWxlICgxKSB7IC8qIGxvb3AgdW50aWwgdW5pdmVyc2UgY29sbGFwc2VzICovCisJCWZkX3NldCByZmRzOworCQlzdHJ1Y3QgZGhjcF9wYWNrZXQgcGFja2V0OworCQlpbnQgYnl0ZXM7CisJCXN0cnVjdCB0aW1ldmFsIHR2OworCQl1aW50OF90ICpzZXJ2ZXJfaWRfb3B0OworCQl1aW50OF90ICpyZXF1ZXN0ZWRfaXBfb3B0OworCQl1aW50MzJfdCByZXF1ZXN0ZWRfbmlwID0gcmVxdWVzdGVkX25pcDsgLyogZm9yIGNvbXBpbGVyICovCisJCXVpbnQzMl90IHN0YXRpY19sZWFzZV9uaXA7CisJCXN0cnVjdCBkeW5fbGVhc2UgKmxlYXNlLCBmYWtlX2xlYXNlOworCisJCWlmIChzZXJ2ZXJfc29ja2V0IDwgMCkgeworCQkJc2VydmVyX3NvY2tldCA9IHVkaGNwX2xpc3Rlbl9zb2NrZXQoLypJTkFERFJfQU5ZLCovIFNFUlZFUl9QT1JULAorCQkJCQlzZXJ2ZXJfY29uZmlnLmludGVyZmFjZSk7CisJCX0KKworCQltYXhfc29jayA9IHVkaGNwX3NwX2ZkX3NldCgmcmZkcywgc2VydmVyX3NvY2tldCk7CisJCWlmIChzZXJ2ZXJfY29uZmlnLmF1dG9fdGltZSkgeworCQkJLyogY2FzdCB0byBzaWduZWQgaXMgZXNzZW50aWFsIGlmIHR2X3NlYyBpcyB3aWRlciB0aGFuIGludCAqLworCQkJdHYudHZfc2VjID0gKGludCkodGltZW91dF9lbmQgLSBtb25vdG9uaWNfc2VjKCkpOworCQkJdHYudHZfdXNlYyA9IDA7CisJCX0KKwkJcmV0dmFsID0gMDsKKwkJaWYgKCFzZXJ2ZXJfY29uZmlnLmF1dG9fdGltZSB8fCB0di50dl9zZWMgPiAwKSB7CisJCQlyZXR2YWwgPSBzZWxlY3QobWF4X3NvY2sgKyAxLCAmcmZkcywgTlVMTCwgTlVMTCwKKwkJCQkJc2VydmVyX2NvbmZpZy5hdXRvX3RpbWUgPyAmdHYgOiBOVUxMKTsKKwkJfQorCQlpZiAocmV0dmFsID09IDApIHsKKwkJCXdyaXRlX2xlYXNlcygpOworCQkJZ290byBjb250aW51ZV93aXRoX2F1dG90aW1lOworCQl9CisJCWlmIChyZXR2YWwgPCAwICYmIGVycm5vICE9IEVJTlRSKSB7CisJCQlsb2cxKCJFcnJvciBvbiBzZWxlY3QiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3dpdGNoICh1ZGhjcF9zcF9yZWFkKCZyZmRzKSkgeworCQljYXNlIFNJR1VTUjE6CisJCQliYl9pbmZvX21zZygiUmVjZWl2ZWQgU0lHVVNSMSIpOworCQkJd3JpdGVfbGVhc2VzKCk7CisJCQkvKiB3aHkgbm90IGp1c3QgcmVzZXQgdGhlIHRpbWVvdXQsIGVoICovCisJCQlnb3RvIGNvbnRpbnVlX3dpdGhfYXV0b3RpbWU7CisJCWNhc2UgU0lHVEVSTToKKwkJCWJiX2luZm9fbXNnKCJSZWNlaXZlZCBTSUdURVJNIik7CisJCQl3cml0ZV9sZWFzZXMoKTsKKwkJCWdvdG8gcmV0MDsKKwkJY2FzZSAwOiAvKiBubyBzaWduYWw6IHJlYWQgYSBwYWNrZXQgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OiAvKiBzaWduYWwgb3IgZXJyb3IgKHByb2JhYmx5IEVJTlRSKTogYmFjayB0byBzZWxlY3QgKi8KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYnl0ZXMgPSB1ZGhjcF9yZWN2X2tlcm5lbF9wYWNrZXQoJnBhY2tldCwgc2VydmVyX3NvY2tldCk7CisJCWlmIChieXRlcyA8IDApIHsKKwkJCS8qIGJ5dGVzIGNhbiBhbHNvIGJlIC0yICgiYmFkIHBhY2tldCBkYXRhIikgKi8KKwkJCWlmIChieXRlcyA9PSAtMSAmJiBlcnJubyAhPSBFSU5UUikgeworCQkJCWxvZzEoIlJlYWQgZXJyb3I6ICVzLCByZW9wZW5pbmcgc29ja2V0Iiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQljbG9zZShzZXJ2ZXJfc29ja2V0KTsKKwkJCQlzZXJ2ZXJfc29ja2V0ID0gLTE7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAocGFja2V0LmhsZW4gIT0gNikgeworCQkJYmJfZXJyb3JfbXNnKCJNQUMgbGVuZ3RoICE9IDYsIGlnbm9yaW5nIHBhY2tldCIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHBhY2tldC5vcCAhPSBCT09UUkVRVUVTVCkgeworCQkJYmJfZXJyb3JfbXNnKCJub3QgYSBSRVFVRVNULCBpZ25vcmluZyBwYWNrZXQiKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN0YXRlID0gdWRoY3BfZ2V0X29wdGlvbigmcGFja2V0LCBESENQX01FU1NBR0VfVFlQRSk7CisJCWlmIChzdGF0ZSA9PSBOVUxMIHx8IHN0YXRlWzBdIDwgREhDUF9NSU5UWVBFIHx8IHN0YXRlWzBdID4gREhDUF9NQVhUWVBFKSB7CisJCQliYl9lcnJvcl9tc2coIm5vIG9yIGJhZCBtZXNzYWdlIHR5cGUgb3B0aW9uLCBpZ25vcmluZyBwYWNrZXQiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogR2V0IFNFUlZFUl9JRCBpZiBwcmVzZW50ICovCisJCXNlcnZlcl9pZF9vcHQgPSB1ZGhjcF9nZXRfb3B0aW9uKCZwYWNrZXQsIERIQ1BfU0VSVkVSX0lEKTsKKwkJaWYgKHNlcnZlcl9pZF9vcHQpIHsKKwkJCXVpbnQzMl90IHNlcnZlcl9pZF9uZXR3b3JrX29yZGVyOworCQkJbW92ZV9mcm9tX3VuYWxpZ25lZDMyKHNlcnZlcl9pZF9uZXR3b3JrX29yZGVyLCBzZXJ2ZXJfaWRfb3B0KTsKKwkJCWlmIChzZXJ2ZXJfaWRfbmV0d29ya19vcmRlciAhPSBzZXJ2ZXJfY29uZmlnLnNlcnZlcl9uaXApIHsKKwkJCQkvKiBjbGllbnQgdGFsa3MgdG8gc29tZWJvZHkgZWxzZSAqLworCQkJCWxvZzEoInNlcnZlciBJRCBkb2Vzbid0IG1hdGNoLCBpZ25vcmluZyIpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJLyogTG9vayBmb3IgYSBzdGF0aWMvZHluYW1pYyBsZWFzZSAqLworCQlzdGF0aWNfbGVhc2VfbmlwID0gZ2V0X3N0YXRpY19uaXBfYnlfbWFjKHNlcnZlcl9jb25maWcuc3RhdGljX2xlYXNlcywgJnBhY2tldC5jaGFkZHIpOworCQlpZiAoc3RhdGljX2xlYXNlX25pcCkgeworCQkJYmJfaW5mb19tc2coIkZvdW5kIHN0YXRpYyBsZWFzZTogJXgiLCBzdGF0aWNfbGVhc2VfbmlwKTsKKwkJCW1lbWNweSgmZmFrZV9sZWFzZS5sZWFzZV9tYWMsICZwYWNrZXQuY2hhZGRyLCA2KTsKKwkJCWZha2VfbGVhc2UubGVhc2VfbmlwID0gc3RhdGljX2xlYXNlX25pcDsKKwkJCWZha2VfbGVhc2UuZXhwaXJlcyA9IDA7CisJCQlsZWFzZSA9ICZmYWtlX2xlYXNlOworCQl9IGVsc2UgeworCQkJbGVhc2UgPSBmaW5kX2xlYXNlX2J5X21hYyhwYWNrZXQuY2hhZGRyKTsKKwkJfQorCisJCS8qIEdldCBSRVFVRVNURURfSVAgaWYgcHJlc2VudCAqLworCQlyZXF1ZXN0ZWRfaXBfb3B0ID0gdWRoY3BfZ2V0X29wdGlvbigmcGFja2V0LCBESENQX1JFUVVFU1RFRF9JUCk7CisJCWlmIChyZXF1ZXN0ZWRfaXBfb3B0KSB7CisJCQltb3ZlX2Zyb21fdW5hbGlnbmVkMzIocmVxdWVzdGVkX25pcCwgcmVxdWVzdGVkX2lwX29wdCk7CisJCX0KKworCQlzd2l0Y2ggKHN0YXRlWzBdKSB7CisKKwkJY2FzZSBESENQRElTQ09WRVI6CisJCQlsb2cxKCJSZWNlaXZlZCBESVNDT1ZFUiIpOworCisJCQlzZW5kX29mZmVyKCZwYWNrZXQsIHN0YXRpY19sZWFzZV9uaXAsIGxlYXNlLCByZXF1ZXN0ZWRfaXBfb3B0LCBhcnBwaW5nX21zKTsKKwkJCWJyZWFrOworCisJCWNhc2UgREhDUFJFUVVFU1Q6CisJCQlsb2cxKCJSZWNlaXZlZCBSRVFVRVNUIik7CisvKiBSRkMgMjEzMToKKworbyBESENQUkVRVUVTVCBnZW5lcmF0ZWQgZHVyaW5nIFNFTEVDVElORyBzdGF0ZToKKworICAgQ2xpZW50IGluc2VydHMgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlbGVjdGVkIHNlcnZlciBpbiAnc2VydmVyCisgICBpZGVudGlmaWVyJywgJ2NpYWRkcicgTVVTVCBiZSB6ZXJvLCAncmVxdWVzdGVkIElQIGFkZHJlc3MnIE1VU1QgYmUKKyAgIGZpbGxlZCBpbiB3aXRoIHRoZSB5aWFkZHIgdmFsdWUgZnJvbSB0aGUgY2hvc2VuIERIQ1BPRkZFUi4KKworICAgTm90ZSB0aGF0IHRoZSBjbGllbnQgbWF5IGNob29zZSB0byBjb2xsZWN0IHNldmVyYWwgREhDUE9GRkVSCisgICBtZXNzYWdlcyBhbmQgc2VsZWN0IHRoZSAiYmVzdCIgb2ZmZXIuICBUaGUgY2xpZW50IGluZGljYXRlcyBpdHMKKyAgIHNlbGVjdGlvbiBieSBpZGVudGlmeWluZyB0aGUgb2ZmZXJpbmcgc2VydmVyIGluIHRoZSBESENQUkVRVUVTVAorICAgbWVzc2FnZS4gIElmIHRoZSBjbGllbnQgcmVjZWl2ZXMgbm8gYWNjZXB0YWJsZSBvZmZlcnMsIHRoZSBjbGllbnQKKyAgIG1heSBjaG9vc2UgdG8gdHJ5IGFub3RoZXIgREhDUERJU0NPVkVSIG1lc3NhZ2UuICBUaGVyZWZvcmUsIHRoZQorICAgc2VydmVycyBtYXkgbm90IHJlY2VpdmUgYSBzcGVjaWZpYyBESENQUkVRVUVTVCBmcm9tIHdoaWNoIHRoZXkgY2FuCisgICBkZWNpZGUgd2hldGhlciBvciBub3QgdGhlIGNsaWVudCBoYXMgYWNjZXB0ZWQgdGhlIG9mZmVyLgorCitvIERIQ1BSRVFVRVNUIGdlbmVyYXRlZCBkdXJpbmcgSU5JVC1SRUJPT1Qgc3RhdGU6CisKKyAgICdzZXJ2ZXIgaWRlbnRpZmllcicgTVVTVCBOT1QgYmUgZmlsbGVkIGluLCAncmVxdWVzdGVkIElQIGFkZHJlc3MnCisgICBvcHRpb24gTVVTVCBiZSBmaWxsZWQgaW4gd2l0aCBjbGllbnQncyBub3Rpb24gb2YgaXRzIHByZXZpb3VzbHkKKyAgIGFzc2lnbmVkIGFkZHJlc3MuICdjaWFkZHInIE1VU1QgYmUgemVyby4gVGhlIGNsaWVudCBpcyBzZWVraW5nIHRvCisgICB2ZXJpZnkgYSBwcmV2aW91c2x5IGFsbG9jYXRlZCwgY2FjaGVkIGNvbmZpZ3VyYXRpb24uIFNlcnZlciBTSE9VTEQKKyAgIHNlbmQgYSBESENQTkFLIG1lc3NhZ2UgdG8gdGhlIGNsaWVudCBpZiB0aGUgJ3JlcXVlc3RlZCBJUCBhZGRyZXNzJworICAgaXMgaW5jb3JyZWN0LCBvciBpcyBvbiB0aGUgd3JvbmcgbmV0d29yay4KKworICAgRGV0ZXJtaW5pbmcgd2hldGhlciBhIGNsaWVudCBpbiB0aGUgSU5JVC1SRUJPT1Qgc3RhdGUgaXMgb24gdGhlCisgICBjb3JyZWN0IG5ldHdvcmsgaXMgZG9uZSBieSBleGFtaW5pbmcgdGhlIGNvbnRlbnRzIG9mICdnaWFkZHInLCB0aGUKKyAgICdyZXF1ZXN0ZWQgSVAgYWRkcmVzcycgb3B0aW9uLCBhbmQgYSBkYXRhYmFzZSBsb29rdXAuIElmIHRoZSBESENQCisgICBzZXJ2ZXIgZGV0ZWN0cyB0aGF0IHRoZSBjbGllbnQgaXMgb24gdGhlIHdyb25nIG5ldCAoaS5lLiwgdGhlCisgICByZXN1bHQgb2YgYXBwbHlpbmcgdGhlIGxvY2FsIHN1Ym5ldCBtYXNrIG9yIHJlbW90ZSBzdWJuZXQgbWFzayAoaWYKKyAgICdnaWFkZHInIGlzIG5vdCB6ZXJvKSB0byAncmVxdWVzdGVkIElQIGFkZHJlc3MnIG9wdGlvbiB2YWx1ZQorICAgZG9lc24ndCBtYXRjaCByZWFsaXR5KSwgdGhlbiB0aGUgc2VydmVyIFNIT1VMRCBzZW5kIGEgREhDUE5BSworICAgbWVzc2FnZSB0byB0aGUgY2xpZW50LgorCisgICBJZiB0aGUgbmV0d29yayBpcyBjb3JyZWN0LCB0aGVuIHRoZSBESENQIHNlcnZlciBzaG91bGQgY2hlY2sgaWYKKyAgIHRoZSBjbGllbnQncyBub3Rpb24gb2YgaXRzIElQIGFkZHJlc3MgaXMgY29ycmVjdC4gSWYgbm90LCB0aGVuIHRoZQorICAgc2VydmVyIFNIT1VMRCBzZW5kIGEgREhDUE5BSyBtZXNzYWdlIHRvIHRoZSBjbGllbnQuIElmIHRoZSBESENQCisgICBzZXJ2ZXIgaGFzIG5vIHJlY29yZCBvZiB0aGlzIGNsaWVudCwgdGhlbiBpdCBNVVNUIHJlbWFpbiBzaWxlbnQsCisgICBhbmQgTUFZIG91dHB1dCBhIHdhcm5pbmcgdG8gdGhlIG5ldHdvcmsgYWRtaW5pc3RyYXRvci4gVGhpcworICAgYmVoYXZpb3IgaXMgbmVjZXNzYXJ5IGZvciBwZWFjZWZ1bCBjb2V4aXN0ZW5jZSBvZiBub24tCisgICBjb21tdW5pY2F0aW5nIERIQ1Agc2VydmVycyBvbiB0aGUgc2FtZSB3aXJlLgorCisgICBJZiAnZ2lhZGRyJyBpcyAweDAgaW4gdGhlIERIQ1BSRVFVRVNUIG1lc3NhZ2UsIHRoZSBjbGllbnQgaXMgb24KKyAgIHRoZSBzYW1lIHN1Ym5ldCBhcyB0aGUgc2VydmVyLiAgVGhlIHNlcnZlciBNVVNUIGJyb2FkY2FzdCB0aGUKKyAgIERIQ1BOQUsgbWVzc2FnZSB0byB0aGUgMHhmZmZmZmZmZiBicm9hZGNhc3QgYWRkcmVzcyBiZWNhdXNlIHRoZQorICAgY2xpZW50IG1heSBub3QgaGF2ZSBhIGNvcnJlY3QgbmV0d29yayBhZGRyZXNzIG9yIHN1Ym5ldCBtYXNrLCBhbmQKKyAgIHRoZSBjbGllbnQgbWF5IG5vdCBiZSBhbnN3ZXJpbmcgQVJQIHJlcXVlc3RzLgorCisgICBJZiAnZ2lhZGRyJyBpcyBzZXQgaW4gdGhlIERIQ1BSRVFVRVNUIG1lc3NhZ2UsIHRoZSBjbGllbnQgaXMgb24gYQorICAgZGlmZmVyZW50IHN1Ym5ldC4gIFRoZSBzZXJ2ZXIgTVVTVCBzZXQgdGhlIGJyb2FkY2FzdCBiaXQgaW4gdGhlCisgICBESENQTkFLLCBzbyB0aGF0IHRoZSByZWxheSBhZ2VudCB3aWxsIGJyb2FkY2FzdCB0aGUgREhDUE5BSyB0byB0aGUKKyAgIGNsaWVudCwgYmVjYXVzZSB0aGUgY2xpZW50IG1heSBub3QgaGF2ZSBhIGNvcnJlY3QgbmV0d29yayBhZGRyZXNzCisgICBvciBzdWJuZXQgbWFzaywgYW5kIHRoZSBjbGllbnQgbWF5IG5vdCBiZSBhbnN3ZXJpbmcgQVJQIHJlcXVlc3RzLgorCitvIERIQ1BSRVFVRVNUIGdlbmVyYXRlZCBkdXJpbmcgUkVORVdJTkcgc3RhdGU6CisKKyAgICdzZXJ2ZXIgaWRlbnRpZmllcicgTVVTVCBOT1QgYmUgZmlsbGVkIGluLCAncmVxdWVzdGVkIElQIGFkZHJlc3MnCisgICBvcHRpb24gTVVTVCBOT1QgYmUgZmlsbGVkIGluLCAnY2lhZGRyJyBNVVNUIGJlIGZpbGxlZCBpbiB3aXRoCisgICBjbGllbnQncyBJUCBhZGRyZXNzLiBJbiB0aGlzIHNpdHVhdGlvbiwgdGhlIGNsaWVudCBpcyBjb21wbGV0ZWx5CisgICBjb25maWd1cmVkLCBhbmQgaXMgdHJ5aW5nIHRvIGV4dGVuZCBpdHMgbGVhc2UuIFRoaXMgbWVzc2FnZSB3aWxsCisgICBiZSB1bmljYXN0LCBzbyBubyByZWxheSBhZ2VudHMgd2lsbCBiZSBpbnZvbHZlZCBpbiBpdHMKKyAgIHRyYW5zbWlzc2lvbi4gIEJlY2F1c2UgJ2dpYWRkcicgaXMgdGhlcmVmb3JlIG5vdCBmaWxsZWQgaW4sIHRoZQorICAgREhDUCBzZXJ2ZXIgd2lsbCB0cnVzdCB0aGUgdmFsdWUgaW4gJ2NpYWRkcicsIGFuZCB1c2UgaXQgd2hlbgorICAgcmVwbHlpbmcgdG8gdGhlIGNsaWVudC4KKworICAgQSBjbGllbnQgTUFZIGNob29zZSB0byByZW5ldyBvciBleHRlbmQgaXRzIGxlYXNlIHByaW9yIHRvIFQxLiAgVGhlCisgICBzZXJ2ZXIgbWF5IGNob29zZSBub3QgdG8gZXh0ZW5kIHRoZSBsZWFzZSAoYXMgYSBwb2xpY3kgZGVjaXNpb24gYnkKKyAgIHRoZSBuZXR3b3JrIGFkbWluaXN0cmF0b3IpLCBidXQgc2hvdWxkIHJldHVybiBhIERIQ1BBQ0sgbWVzc2FnZQorICAgcmVnYXJkbGVzcy4KKworbyBESENQUkVRVUVTVCBnZW5lcmF0ZWQgZHVyaW5nIFJFQklORElORyBzdGF0ZToKKworICAgJ3NlcnZlciBpZGVudGlmaWVyJyBNVVNUIE5PVCBiZSBmaWxsZWQgaW4sICdyZXF1ZXN0ZWQgSVAgYWRkcmVzcycKKyAgIG9wdGlvbiBNVVNUIE5PVCBiZSBmaWxsZWQgaW4sICdjaWFkZHInIE1VU1QgYmUgZmlsbGVkIGluIHdpdGgKKyAgIGNsaWVudCdzIElQIGFkZHJlc3MuIEluIHRoaXMgc2l0dWF0aW9uLCB0aGUgY2xpZW50IGlzIGNvbXBsZXRlbHkKKyAgIGNvbmZpZ3VyZWQsIGFuZCBpcyB0cnlpbmcgdG8gZXh0ZW5kIGl0cyBsZWFzZS4gVGhpcyBtZXNzYWdlIE1VU1QKKyAgIGJlIGJyb2FkY2FzdCB0byB0aGUgMHhmZmZmZmZmZiBJUCBicm9hZGNhc3QgYWRkcmVzcy4gIFRoZSBESENQCisgICBzZXJ2ZXIgU0hPVUxEIGNoZWNrICdjaWFkZHInIGZvciBjb3JyZWN0bmVzcyBiZWZvcmUgcmVwbHlpbmcgdG8KKyAgIHRoZSBESENQUkVRVUVTVC4KKworICAgVGhlIERIQ1BSRVFVRVNUIGZyb20gYSBSRUJJTkRJTkcgY2xpZW50IGlzIGludGVuZGVkIHRvIGFjY29tbW9kYXRlCisgICBzaXRlcyB0aGF0IGhhdmUgbXVsdGlwbGUgREhDUCBzZXJ2ZXJzIGFuZCBhIG1lY2hhbmlzbSBmb3IKKyAgIG1haW50YWluaW5nIGNvbnNpc3RlbmN5IGFtb25nIGxlYXNlcyBtYW5hZ2VkIGJ5IG11bHRpcGxlIHNlcnZlcnMuCisgICBBIERIQ1Agc2VydmVyIE1BWSBleHRlbmQgYSBjbGllbnQncyBsZWFzZSBvbmx5IGlmIGl0IGhhcyBsb2NhbAorICAgYWRtaW5pc3RyYXRpdmUgYXV0aG9yaXR5IHRvIGRvIHNvLgorKi8KKwkJCWlmICghcmVxdWVzdGVkX2lwX29wdCkgeworCQkJCXJlcXVlc3RlZF9uaXAgPSBwYWNrZXQuY2lhZGRyOworCQkJCWlmIChyZXF1ZXN0ZWRfbmlwID09IDApIHsKKwkJCQkJbG9nMSgibm8gcmVxdWVzdGVkIElQIGFuZCBubyBjaWFkZHIsIGlnbm9yaW5nIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChsZWFzZSAmJiByZXF1ZXN0ZWRfbmlwID09IGxlYXNlLT5sZWFzZV9uaXApIHsKKwkJCQkvKiBjbGllbnQgcmVxdWVzdGVkIG9yIGNvbmZpZ3VyZWQgSVAgbWF0Y2hlcyB0aGUgbGVhc2UuCisJCQkJICogQUNLIGl0LCBhbmQgYnVtcCBsZWFzZSBleHBpcmF0aW9uIHRpbWUuICovCisJCQkJc2VuZF9BQ0soJnBhY2tldCwgbGVhc2UtPmxlYXNlX25pcCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBObyBsZWFzZSBmb3IgdGhpcyBNQUMsIG9yIGxlYXNlIElQICE9IHJlcXVlc3RlZCBJUCAqLworCisJCQlpZiAoc2VydmVyX2lkX29wdCAgICAvKiBjbGllbnQgaXMgaW4gU0VMRUNUSU5HIHN0YXRlICovCisJCQkgfHwgcmVxdWVzdGVkX2lwX29wdCAvKiBjbGllbnQgaXMgaW4gSU5JVC1SRUJPT1Qgc3RhdGUgKi8KKwkJCSkgeworCQkJCS8qICJObywgd2UgZG9uJ3QgaGF2ZSB0aGlzIElQIGZvciB5b3UiICovCisJCQkJc2VuZF9OQUsoJnBhY2tldCk7CisJCQl9IC8qIGVsc2U6IGNsaWVudCBpcyBpbiBSRU5FV0lORyBvciBSRUJJTkRJTkcsIGRvIG5vdCBhbnN3ZXIgKi8KKworCQkJYnJlYWs7CisKKwkJY2FzZSBESENQREVDTElORToKKwkJCS8qIFJGQyAyMTMxOgorCQkJICogIklmIHRoZSBzZXJ2ZXIgcmVjZWl2ZXMgYSBESENQREVDTElORSBtZXNzYWdlLAorCQkJICogdGhlIGNsaWVudCBoYXMgZGlzY292ZXJlZCB0aHJvdWdoIHNvbWUgb3RoZXIgbWVhbnMKKwkJCSAqIHRoYXQgdGhlIHN1Z2dlc3RlZCBuZXR3b3JrIGFkZHJlc3MgaXMgYWxyZWFkeQorCQkJICogaW4gdXNlLiBUaGUgc2VydmVyIE1VU1QgbWFyayB0aGUgbmV0d29yayBhZGRyZXNzCisJCQkgKiBhcyBub3QgYXZhaWxhYmxlIGFuZCBTSE9VTEQgbm90aWZ5IHRoZSBsb2NhbAorCQkJICogc3lzYWRtaW4gb2YgYSBwb3NzaWJsZSBjb25maWd1cmF0aW9uIHByb2JsZW0uIgorCQkJICoKKwkJCSAqIFNFUlZFUl9JRCBtdXN0IGJlIHByZXNlbnQsCisJCQkgKiBSRVFVRVNURURfSVAgbXVzdCBiZSBwcmVzZW50LAorCQkJICogY2hhZGRyIG11c3QgYmUgZmlsbGVkIGluLAorCQkJICogY2lhZGRyIG11c3QgYmUgMCAod2UgZG8gbm90IGNoZWNrIHRoaXMpCisJCQkgKi8KKwkJCWxvZzEoIlJlY2VpdmVkIERFQ0xJTkUiKTsKKwkJCWlmIChzZXJ2ZXJfaWRfb3B0CisJCQkgJiYgcmVxdWVzdGVkX2lwX29wdAorCQkJICYmIGxlYXNlICAvKiBjaGFkZHIgbWF0Y2hlcyB0aGlzIGxlYXNlICovCisJCQkgJiYgcmVxdWVzdGVkX25pcCA9PSBsZWFzZS0+bGVhc2VfbmlwCisJCQkpIHsKKwkJCQltZW1zZXQobGVhc2UtPmxlYXNlX21hYywgMCwgc2l6ZW9mKGxlYXNlLT5sZWFzZV9tYWMpKTsKKwkJCQlsZWFzZS0+ZXhwaXJlcyA9IHRpbWUoTlVMTCkgKyBzZXJ2ZXJfY29uZmlnLmRlY2xpbmVfdGltZTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgREhDUFJFTEVBU0U6CisJCQkvKiAiVXBvbiByZWNlaXB0IG9mIGEgREhDUFJFTEVBU0UgbWVzc2FnZSwgdGhlIHNlcnZlcgorCQkJICogbWFya3MgdGhlIG5ldHdvcmsgYWRkcmVzcyBhcyBub3QgYWxsb2NhdGVkLiIKKwkJCSAqCisJCQkgKiBTRVJWRVJfSUQgbXVzdCBiZSBwcmVzZW50LAorCQkJICogUkVRVUVTVEVEX0lQIG11c3Qgbm90IGJlIHByZXNlbnQgKHdlIGRvIG5vdCBjaGVjayB0aGlzKSwKKwkJCSAqIGNoYWRkciBtdXN0IGJlIGZpbGxlZCBpbiwKKwkJCSAqIGNpYWRkciBtdXN0IGJlIGZpbGxlZCBpbgorCQkJICovCisJCQlsb2cxKCJSZWNlaXZlZCBSRUxFQVNFIik7CisJCQlpZiAoc2VydmVyX2lkX29wdAorCQkJICYmIGxlYXNlICAvKiBjaGFkZHIgbWF0Y2hlcyB0aGlzIGxlYXNlICovCisJCQkgJiYgcGFja2V0LmNpYWRkciA9PSBsZWFzZS0+bGVhc2VfbmlwCisJCQkpIHsKKwkJCQlsZWFzZS0+ZXhwaXJlcyA9IHRpbWUoTlVMTCk7CisJCQl9CisJCQlicmVhazsKKworCQljYXNlIERIQ1BJTkZPUk06CisJCQlsb2cxKCJSZWNlaXZlZCBJTkZPUk0iKTsKKwkJCXNlbmRfaW5mb3JtKCZwYWNrZXQpOworCQkJYnJlYWs7CisJCX0KKwl9CisgcmV0MDoKKwlyZXR2YWwgPSAwOworIHJldDoKKwkvKmlmIChzZXJ2ZXJfY29uZmlnLnBpZGZpbGUpIC0gc2VydmVyX2NvbmZpZy5waWRmaWxlIGlzIG5ldmVyIE5VTEwgKi8KKwkJcmVtb3ZlX3BpZGZpbGUoc2VydmVyX2NvbmZpZy5waWRmaWxlKTsKKwlyZXR1cm4gcmV0dmFsOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy91ZGhjcC9kaGNwZC5oIGIvbmV0d29ya2luZy91ZGhjcC9kaGNwZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4M2U3ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3VkaGNwL2RoY3BkLmgKQEAgLTAsMCArMSwxMjggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpZm5kZWYgVURIQ1BfREhDUERfSAorI2RlZmluZSBVREhDUF9ESENQRF9IIDEKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKKy8qIERlZmF1bHRzIHlvdSBtYXkgd2FudCB0byB0d2VhayAqLworLyogRGVmYXVsdCBtYXhfbGVhc2Vfc2VjICovCisjZGVmaW5lIERFRkFVTFRfTEVBU0VfVElNRSAgICAgICg2MCo2MCoyNCAqIDEwKQorI2RlZmluZSBMRUFTRVNfRklMRSAgICAgICAgICAgICBDT05GSUdfREhDUERfTEVBU0VTX0ZJTEUKKy8qIFdoZXJlIHRvIGZpbmQgdGhlIERIQ1Agc2VydmVyIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworI2RlZmluZSBESENQRF9DT05GX0ZJTEUgICAgICAgICAiL2V0Yy91ZGhjcGQuY29uZiIKKworCitzdHJ1Y3Qgc3RhdGljX2xlYXNlIHsKKwlzdHJ1Y3Qgc3RhdGljX2xlYXNlICpuZXh0OworCXVpbnQzMl90IG5pcDsKKwl1aW50OF90IG1hY1s2XTsKK307CisKK3N0cnVjdCBzZXJ2ZXJfY29uZmlnX3QgeworCWNoYXIgKmludGVyZmFjZTsgICAgICAgICAgICAgICAgLyogaW50ZXJmYWNlIHRvIHVzZSAqLworLy9UT0RPOiBpZmluZGV4LCBzZXJ2ZXJfbmlwLCBzZXJ2ZXJfbWFjCisvLyBhcmUgb2J0YWluZWQgZnJvbSBpbnRlcmZhY2UgbmFtZS4KKy8vIEluc3RlYWQgb2YgcXVlcnlpbmcgdGhlbSAqb25jZSosIGNyZWF0ZSB1cGRhdGVfc2VydmVyX25ldHdvcmtfZGF0YV9jYWNoZSgpCisvLyBhbmQgY2FsbCBpdCBiZWZvcmUgYW55IHVzYWdlIG9mIHRoZXNlIGZpZWxkcy4KKy8vIHVwZGF0ZV9zZXJ2ZXJfbmV0d29ya19kYXRhX2NhY2hlKCkgbXVzdCByZS1xdWVyeSBkYXRhCisvLyBpZiBtb3JlIHRoYW4gTiBzZWNvbmRzIGhhdmUgcGFzc2VkIGFmdGVyIGxhc3QgdXNlLgorCWludCBpZmluZGV4OworCXVpbnQzMl90IHNlcnZlcl9uaXA7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVURIQ1BfUE9SVAorCXVpbnQxNl90IHBvcnQ7CisjZW5kaWYKKwl1aW50OF90IHNlcnZlcl9tYWNbNl07ICAgICAgICAgIC8qIG91ciBNQUMgYWRkcmVzcyAodXNlZCBvbmx5IGZvciBBUlAgcHJvYmluZykgKi8KKwlzdHJ1Y3Qgb3B0aW9uX3NldCAqb3B0aW9uczsgICAgIC8qIGxpc3Qgb2YgREhDUCBvcHRpb25zIGxvYWRlZCBmcm9tIHRoZSBjb25maWcgZmlsZSAqLworCS8qIHN0YXJ0LGVuZCBhcmUgaW4gaG9zdCBvcmRlcjogd2UgbmVlZCB0byBjb21wYXJlIHN0YXJ0IDw9IGlwIDw9IGVuZCAqLworCXVpbnQzMl90IHN0YXJ0X2lwOyAgICAgICAgICAgICAgLyogc3RhcnQgYWRkcmVzcyBvZiBsZWFzZXMsIGluIGhvc3Qgb3JkZXIgKi8KKwl1aW50MzJfdCBlbmRfaXA7ICAgICAgICAgICAgICAgIC8qIGVuZCBvZiBsZWFzZXMsIGluIGhvc3Qgb3JkZXIgKi8KKwl1aW50MzJfdCBtYXhfbGVhc2Vfc2VjOyAgICAgICAgIC8qIG1heGltdW0gbGVhc2UgdGltZSAoaG9zdCBvcmRlcikgKi8KKwl1aW50MzJfdCBtaW5fbGVhc2Vfc2VjOyAgICAgICAgIC8qIG1pbmltdW0gbGVhc2UgdGltZSBhIGNsaWVudCBjYW4gcmVxdWVzdCAqLworCXVpbnQzMl90IG1heF9sZWFzZXM7ICAgICAgICAgICAgLyogbWF4aW11bSBudW1iZXIgb2YgbGVhc2VzIChpbmNsdWRpbmcgcmVzZXJ2ZWQgYWRkcmVzc2VzKSAqLworCXVpbnQzMl90IGF1dG9fdGltZTsgICAgICAgICAgICAgLyogaG93IGxvbmcgc2hvdWxkIHVkaGNwZCB3YWl0IGJlZm9yZSB3cml0aW5nIGEgY29uZmlnIGZpbGUuCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBpZiB0aGlzIGlzIHplcm8sIGl0IHdpbGwgb25seSB3cml0ZSBvbmUgb24gU0lHVVNSMSAqLworCXVpbnQzMl90IGRlY2xpbmVfdGltZTsgICAgICAgICAgLyogaG93IGxvbmcgYW4gYWRkcmVzcyBpcyByZXNlcnZlZCBpZiBhIGNsaWVudCByZXR1cm5zIGEKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRlY2xpbmUgbWVzc2FnZSAqLworCXVpbnQzMl90IGNvbmZsaWN0X3RpbWU7ICAgICAgICAgLyogaG93IGxvbmcgYW4gYXJwIGNvbmZsaWN0IG9mZmVuZGVyIGlzIGxlYXNlZCBmb3IgKi8KKwl1aW50MzJfdCBvZmZlcl90aW1lOyAgICAgICAgICAgIC8qIGhvdyBsb25nIGFuIG9mZmVyZWQgYWRkcmVzcyBpcyByZXNlcnZlZCAqLworCXVpbnQzMl90IHNpYWRkcl9uaXA7ICAgICAgICAgICAgLyogIm5leHQgc2VydmVyIiBib290cCBvcHRpb24gKi8KKwljaGFyICpsZWFzZV9maWxlOworCWNoYXIgKnBpZGZpbGU7CisJY2hhciAqbm90aWZ5X2ZpbGU7ICAgICAgICAgICAgICAvKiB3aGF0IHRvIHJ1biB3aGVuZXZlciBsZWFzZXMgYXJlIHdyaXR0ZW4gKi8KKwljaGFyICpzbmFtZTsgICAgICAgICAgICAgICAgICAgIC8qIGJvb3RwIHNlcnZlciBuYW1lICovCisJY2hhciAqYm9vdF9maWxlOyAgICAgICAgICAgICAgICAvKiBib290cCBib290IGZpbGUgb3B0aW9uICovCisJc3RydWN0IHN0YXRpY19sZWFzZSAqc3RhdGljX2xlYXNlczsgLyogTGlzdCBvZiBpcC9tYWMgcGFpcnMgdG8gYXNzaWduIHN0YXRpYyBsZWFzZXMgKi8KK30gRklYX0FMSUFTSU5HOworCisjZGVmaW5lIHNlcnZlcl9jb25maWcgKCooc3RydWN0IHNlcnZlcl9jb25maWdfdCopJmJiX2NvbW1vbl9idWZzaXoxKQorLyogY2xpZW50X2NvbmZpZyBzaXRzIGluIDJuZCBoYWxmIG9mIGJiX2NvbW1vbl9idWZzaXoxICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9VREhDUF9QT1JUCisjZGVmaW5lIFNFUlZFUl9QT1JUICAoc2VydmVyX2NvbmZpZy5wb3J0KQorI2RlZmluZSBTRVJWRVJfUE9SVDYgKHNlcnZlcl9jb25maWcucG9ydCkKKyNlbHNlCisjZGVmaW5lIFNFUlZFUl9QT1JUICA2NworI2RlZmluZSBTRVJWRVJfUE9SVDYgNTQ3CisjZW5kaWYKKworCit0eXBlZGVmIHVpbnQzMl90IGxlYXNldGltZV90OwordHlwZWRlZiBpbnQzMl90IHNpZ25lZF9sZWFzZXRpbWVfdDsKKworc3RydWN0IGR5bl9sZWFzZSB7CisJLyogVW5peCB0aW1lIHdoZW4gbGVhc2UgZXhwaXJlcy4gS2VwdCBpbiBtZW1vcnkgaW4gaG9zdCBvcmRlci4KKwkgKiBXaGVuIHdyaXR0ZW4gdG8gZmlsZSwgY29udmVydGVkIHRvIG5ldHdvcmsgb3JkZXIKKwkgKiBhbmQgYWRqdXN0ZWQgKGN1cnJlbnQgdGltZSBzdWJ0cmFjdGVkKSAqLworCWxlYXNldGltZV90IGV4cGlyZXM7CisJLyogIm5pcCI6IElQIGluIG5ldHdvcmsgb3JkZXIgKi8KKwl1aW50MzJfdCBsZWFzZV9uaXA7CisJLyogV2UgdXNlIGxlYXNlX21hY1s2XSwgc2luY2UgZS5nLiBBUlAgcHJvYmluZyB1c2VzCisJICogb25seSA2IGZpcnN0IGJ5dGVzIGFueXdheS4gV2UgY2hlY2sgcmVjZWl2ZWQgZGhjcCBwYWNrZXRzCisJICogdGhhdCB0aGVpciBobGVuID09IDYgYW5kIHRodXMgY2hhZGRyIGhhcyBvbmx5IDYgc2lnbmlmaWNhbnQgYnl0ZXMKKwkgKiAoZGhjcCBwYWNrZXQgaGFzIGNoYWRkclsxNl0sIG5vdCBbNl0pCisJICovCisJdWludDhfdCBsZWFzZV9tYWNbNl07CisJY2hhciBob3N0bmFtZVsyMF07CisJdWludDhfdCBwYWRbMl07CisJLyogdG90YWwgc2l6ZSBpcyBhIG11bHRpcGx5IG9mIDQgKi8KK30gUEFDS0VEOworCitleHRlcm4gc3RydWN0IGR5bl9sZWFzZSAqZ19sZWFzZXM7CisKK3N0cnVjdCBkeW5fbGVhc2UgKmFkZF9sZWFzZSgKKwkJY29uc3QgdWludDhfdCAqY2hhZGRyLCB1aW50MzJfdCB5aWFkZHIsCisJCWxlYXNldGltZV90IGxlYXNldGltZSwKKwkJY29uc3QgY2hhciAqaG9zdG5hbWUsIGludCBob3N0bmFtZV9sZW4KKwkJKSBGQVNUX0ZVTkM7CitpbnQgaXNfZXhwaXJlZF9sZWFzZShzdHJ1Y3QgZHluX2xlYXNlICpsZWFzZSkgRkFTVF9GVU5DOworc3RydWN0IGR5bl9sZWFzZSAqZmluZF9sZWFzZV9ieV9tYWMoY29uc3QgdWludDhfdCAqbWFjKSBGQVNUX0ZVTkM7CitzdHJ1Y3QgZHluX2xlYXNlICpmaW5kX2xlYXNlX2J5X25pcCh1aW50MzJfdCBuaXApIEZBU1RfRlVOQzsKK3VpbnQzMl90IGZpbmRfZnJlZV9vcl9leHBpcmVkX25pcChjb25zdCB1aW50OF90ICpzYWZlX21hYywgdW5zaWduZWQgYXJwcGluZ19tcykgRkFTVF9GVU5DOworCisKKy8qIENvbmZpZyBmaWxlIHBhcnNlciB3aWxsIHBhc3Mgc3RhdGljIGxlYXNlIGluZm8gdG8gdGhpcyBmdW5jdGlvbgorICogd2hpY2ggd2lsbCBhZGQgaXQgdG8gYSBkYXRhIHN0cnVjdHVyZSB0aGF0IGNhbiBiZSBzZWFyY2hlZCBsYXRlciAqLwordm9pZCBhZGRfc3RhdGljX2xlYXNlKHN0cnVjdCBzdGF0aWNfbGVhc2UgKipzdF9sZWFzZV9wcCwgdWludDhfdCAqbWFjLCB1aW50MzJfdCBuaXApIEZBU1RfRlVOQzsKKy8qIEZpbmQgc3RhdGljIGxlYXNlIElQIGJ5IG1hYyAqLwordWludDMyX3QgZ2V0X3N0YXRpY19uaXBfYnlfbWFjKHN0cnVjdCBzdGF0aWNfbGVhc2UgKnN0X2xlYXNlLCB2b2lkICphcmcpIEZBU1RfRlVOQzsKKy8qIENoZWNrIHRvIHNlZSBpZiBhbiBJUCBpcyByZXNlcnZlZCBhcyBhIHN0YXRpYyBJUCAqLworaW50IGlzX25pcF9yZXNlcnZlZChzdHJ1Y3Qgc3RhdGljX2xlYXNlICpzdF9sZWFzZSwgdWludDMyX3QgbmlwKSBGQVNUX0ZVTkM7CisvKiBQcmludCBvdXQgc3RhdGljIGxlYXNlcyBqdXN0IHRvIGNoZWNrIHdoYXQncyBnb2luZyBvbiAoZGVidWcgY29kZSkgKi8KKyNpZiBkZWZpbmVkIENPTkZJR19VREhDUF9ERUJVRyAmJiBDT05GSUdfVURIQ1BfREVCVUcgPj0gMgordm9pZCBsb2dfc3RhdGljX2xlYXNlcyhzdHJ1Y3Qgc3RhdGljX2xlYXNlICoqc3RfbGVhc2VfcHApIEZBU1RfRlVOQzsKKyNlbHNlCisjIGRlZmluZSBsb2dfc3RhdGljX2xlYXNlcyhzdF9sZWFzZV9wcCkgKCh2b2lkKTApCisjZW5kaWYKKworCit2b2lkIHJlYWRfY29uZmlnKGNvbnN0IGNoYXIgKmZpbGUpIEZBU1RfRlVOQzsKK3ZvaWQgd3JpdGVfbGVhc2VzKHZvaWQpIEZBU1RfRlVOQzsKK3ZvaWQgcmVhZF9sZWFzZXMoY29uc3QgY2hhciAqZmlsZSkgRkFTVF9GVU5DOworCisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy91ZGhjcC9kaGNwcmVsYXkuYyBiL25ldHdvcmtpbmcvdWRoY3AvZGhjcHJlbGF5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyYWMwNQotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvdWRoY3AvZGhjcHJlbGF5LmMKQEAgLTAsMCArMSwzNzMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyogUG9ydCB0byBCdXN5Ym94IENvcHlyaWdodCAoQykgMjAwNiBKZXNzZSBEdXR0b24gPGplc3NlZHV0dG9uQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIERIQ1AgUmVsYXkgZm9yICdESENQdjQgQ29uZmlndXJhdGlvbiBvZiBJUFNlYyBUdW5uZWwgTW9kZScgc3VwcG9ydAorICogQ29weXJpZ2h0IChDKSAyMDAyIE1hcmlvIFN0cmFzc2VyIDxtYXN0QGdteC5uZXQ+LAorICogICAgICAgICAgICAgICAgICAgWnVlcmNoZXIgSG9jaHNjaHVsZSBXaW50ZXJ0aHVyLAorICogICAgICAgICAgICAgICAgICAgTmV0YmVhdCBBRworICogVXBzdHJlYW0gaGFzIEdQTCB2MiBvciBsYXRlcgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBkaGNwcmVsYXlfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkNMSUVOVF9JRkFDRVssQ0xJRU5UX0lGQUNFMl0uLi4gU0VSVkVSX0lGQUNFIFtTRVJWRVJfSVBdIgorLy91c2FnZTojZGVmaW5lIGRoY3ByZWxheV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJlbGF5IERIQ1AgcmVxdWVzdHMgYmV0d2VlbiBjbGllbnRzIGFuZCBzZXJ2ZXIiCisKKyNpbmNsdWRlICJjb21tb24uaCIKKworI2RlZmluZSBTRVJWRVJfUE9SVCAgICA2NworCisvKiBsaWZldGltZSBvZiBhbiB4aWQgZW50cnkgaW4gc2VjLiAqLworI2RlZmluZSBNQVhfTElGRVRJTUUgICAyKjYwCisvKiBzZWxlY3QgdGltZW91dCBpbiBzZWMuICovCisjZGVmaW5lIFNFTEVDVF9USU1FT1VUIChNQVhfTElGRVRJTUUgLyA4KQorCisvKiBUaGlzIGxpc3QgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgY2xpZW50cy4gVGhlIHhpZF8qIGZ1bmN0aW9ucyBtYW5pcHVsYXRlIHRoaXMgbGlzdC4gKi8KK3N0cnVjdCB4aWRfaXRlbSB7CisJdW5zaWduZWQgdGltZXN0YW1wOworCWludCBjbGllbnQ7CisJdWludDMyX3QgeGlkOworCXN0cnVjdCBzb2NrYWRkcl9pbiBpcDsKKwlzdHJ1Y3QgeGlkX2l0ZW0gKm5leHQ7Cit9IEZJWF9BTElBU0lORzsKKworI2RlZmluZSBkaGNwcmVsYXlfeGlkX2xpc3QgKCooc3RydWN0IHhpZF9pdGVtKikmYmJfY29tbW9uX2J1ZnNpejEpCisKK3N0YXRpYyBzdHJ1Y3QgeGlkX2l0ZW0gKnhpZF9hZGQodWludDMyX3QgeGlkLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKmlwLCBpbnQgY2xpZW50KQoreworCXN0cnVjdCB4aWRfaXRlbSAqaXRlbTsKKworCS8qIGNyZWF0ZSBuZXcgeGlkIGVudHJ5ICovCisJaXRlbSA9IHhtYWxsb2Moc2l6ZW9mKHN0cnVjdCB4aWRfaXRlbSkpOworCisJLyogYWRkIHhpZCBlbnRyeSAqLworCWl0ZW0tPmlwID0gKmlwOworCWl0ZW0tPnhpZCA9IHhpZDsKKwlpdGVtLT5jbGllbnQgPSBjbGllbnQ7CisJaXRlbS0+dGltZXN0YW1wID0gbW9ub3RvbmljX3NlYygpOworCWl0ZW0tPm5leHQgPSBkaGNwcmVsYXlfeGlkX2xpc3QubmV4dDsKKwlkaGNwcmVsYXlfeGlkX2xpc3QubmV4dCA9IGl0ZW07CisKKwlyZXR1cm4gaXRlbTsKK30KKworc3RhdGljIHZvaWQgeGlkX2V4cGlyZSh2b2lkKQoreworCXN0cnVjdCB4aWRfaXRlbSAqaXRlbSA9IGRoY3ByZWxheV94aWRfbGlzdC5uZXh0OworCXN0cnVjdCB4aWRfaXRlbSAqbGFzdCA9ICZkaGNwcmVsYXlfeGlkX2xpc3Q7CisJdW5zaWduZWQgY3VycmVudF90aW1lID0gbW9ub3RvbmljX3NlYygpOworCisJd2hpbGUgKGl0ZW0gIT0gTlVMTCkgeworCQlpZiAoKGN1cnJlbnRfdGltZSAtIGl0ZW0tPnRpbWVzdGFtcCkgPiBNQVhfTElGRVRJTUUpIHsKKwkJCWxhc3QtPm5leHQgPSBpdGVtLT5uZXh0OworCQkJZnJlZShpdGVtKTsKKwkJCWl0ZW0gPSBsYXN0LT5uZXh0OworCQl9IGVsc2UgeworCQkJbGFzdCA9IGl0ZW07CisJCQlpdGVtID0gaXRlbS0+bmV4dDsKKwkJfQorCX0KK30KKworc3RhdGljIHN0cnVjdCB4aWRfaXRlbSAqeGlkX2ZpbmQodWludDMyX3QgeGlkKQoreworCXN0cnVjdCB4aWRfaXRlbSAqaXRlbSA9IGRoY3ByZWxheV94aWRfbGlzdC5uZXh0OworCXdoaWxlIChpdGVtICE9IE5VTEwpIHsKKwkJaWYgKGl0ZW0tPnhpZCA9PSB4aWQpIHsKKwkJCWJyZWFrOworCQl9CisJCWl0ZW0gPSBpdGVtLT5uZXh0OworCX0KKwlyZXR1cm4gaXRlbTsKK30KKworc3RhdGljIHZvaWQgeGlkX2RlbCh1aW50MzJfdCB4aWQpCit7CisJc3RydWN0IHhpZF9pdGVtICppdGVtID0gZGhjcHJlbGF5X3hpZF9saXN0Lm5leHQ7CisJc3RydWN0IHhpZF9pdGVtICpsYXN0ID0gJmRoY3ByZWxheV94aWRfbGlzdDsKKwl3aGlsZSAoaXRlbSAhPSBOVUxMKSB7CisJCWlmIChpdGVtLT54aWQgPT0geGlkKSB7CisJCQlsYXN0LT5uZXh0ID0gaXRlbS0+bmV4dDsKKwkJCWZyZWUoaXRlbSk7CisJCQlpdGVtID0gbGFzdC0+bmV4dDsKKwkJfSBlbHNlIHsKKwkJCWxhc3QgPSBpdGVtOworCQkJaXRlbSA9IGl0ZW0tPm5leHQ7CisJCX0KKwl9Cit9CisKKy8qKgorICogZ2V0X2RoY3BfcGFja2V0X3R5cGUgLSBnZXRzIHRoZSBtZXNzYWdlIHR5cGUgb2YgYSBkaGNwIHBhY2tldAorICogcCAtIHBvaW50ZXIgdG8gdGhlIGRoY3AgcGFja2V0CisgKiByZXR1cm5zIHRoZSBtZXNzYWdlIHR5cGUgb24gc3VjY2VzcywgLTEgb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbnQgZ2V0X2RoY3BfcGFja2V0X3R5cGUoc3RydWN0IGRoY3BfcGFja2V0ICpwKQoreworCXVpbnQ4X3QgKm9wOworCisJLyogaXQgbXVzdCBiZSBlaXRoZXIgYSBCT09UUkVRVUVTVCBvciBhIEJPT1RSRVBMWSAqLworCWlmIChwLT5vcCAhPSBCT09UUkVRVUVTVCAmJiBwLT5vcCAhPSBCT09UUkVQTFkpCisJCXJldHVybiAtMTsKKwkvKiBnZXQgbWVzc2FnZSB0eXBlIG9wdGlvbiAqLworCW9wID0gdWRoY3BfZ2V0X29wdGlvbihwLCBESENQX01FU1NBR0VfVFlQRSk7CisJaWYgKG9wICE9IE5VTEwpCisJCXJldHVybiBvcFswXTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qKgorICogbWFrZV9pZmFjZV9saXN0IC0gcGFyc2VzIGNsaWVudC9zZXJ2ZXIgaW50ZXJmYWNlIG5hbWVzCisgKiByZXR1cm5zIGFycmF5CisgKi8KK3N0YXRpYyBjaGFyICoqbWFrZV9pZmFjZV9saXN0KGNoYXIgKipjbGllbnRfYW5kX3NlcnZlcl9pZmFjZXMsIGludCAqY2xpZW50X251bWJlcikKK3sKKwljaGFyICpzLCAqKmlmYWNlX2xpc3Q7CisJaW50IGksIGNuOworCisJLyogZ2V0IG51bWJlciBvZiBpdGVtcyAqLworCWNuID0gMjsgLyogMSBzZXJ2ZXIgaWZhY2UgKyBhdCBsZWFzdCAxIGNsaWVudCBvbmUgKi8KKwlzID0gY2xpZW50X2FuZF9zZXJ2ZXJfaWZhY2VzWzBdOyAvKiBsaXN0IG9mIGNsaWVudCBpZmFjZXMgKi8KKwl3aGlsZSAoKnMpIHsKKwkJaWYgKCpzID09ICcsJykKKwkJCWNuKys7CisJCXMrKzsKKwl9CisJKmNsaWVudF9udW1iZXIgPSBjbjsKKworCS8qIGNyZWF0ZSB2ZWN0b3Igb2YgcG9pbnRlcnMgKi8KKwlpZmFjZV9saXN0ID0geHphbGxvYyhjbiAqIHNpemVvZihpZmFjZV9saXN0WzBdKSk7CisKKwlpZmFjZV9saXN0WzBdID0gY2xpZW50X2FuZF9zZXJ2ZXJfaWZhY2VzWzFdOyAvKiBzZXJ2ZXIgaWZhY2UgKi8KKworCWkgPSAxOworCXMgPSB4c3RyZHVwKGNsaWVudF9hbmRfc2VydmVyX2lmYWNlc1swXSk7IC8qIGxpc3Qgb2YgY2xpZW50IGlmYWNlcyAqLworCWdvdG8gc3RvcmVfY2xpZW50X2lmYWNlX25hbWU7CisKKwl3aGlsZSAoaSA8IGNuKSB7CisJCWlmICgqcysrID09ICcsJykgeworCQkJc1stMV0gPSAnXDAnOworIHN0b3JlX2NsaWVudF9pZmFjZV9uYW1lOgorCQkJaWZhY2VfbGlzdFtpKytdID0gczsKKwkJfQorCX0KKworCXJldHVybiBpZmFjZV9saXN0OworfQorCisvKiBDcmVhdGVzIGxpc3RlbiBzb2NrZXRzIChpbiBmZHMpIGJvdW5kIHRvIGNsaWVudCBhbmQgc2VydmVyIGlmYWNlcywKKyAqIGFuZCByZXR1cm5zIG51bWVyaWNhbGx5IG1heCBmZC4KKyAqLworc3RhdGljIGludCBpbml0X3NvY2tldHMoY2hhciAqKmlmYWNlX2xpc3QsIGludCBudW1fY2xpZW50cywgaW50ICpmZHMpCit7CisJaW50IGksIG47CisKKwluID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgbnVtX2NsaWVudHM7IGkrKykgeworCQlmZHNbaV0gPSB1ZGhjcF9saXN0ZW5fc29ja2V0KC8qSU5BRERSX0FOWSwqLyBTRVJWRVJfUE9SVCwgaWZhY2VfbGlzdFtpXSk7CisJCWlmIChuIDwgZmRzW2ldKQorCQkJbiA9IGZkc1tpXTsKKwl9CisJcmV0dXJuIG47Cit9CisKK3N0YXRpYyBpbnQgc2VuZHRvX2lwNChpbnQgc29jaywgY29uc3Qgdm9pZCAqbXNnLCBpbnQgbXNnX2xlbiwgc3RydWN0IHNvY2thZGRyX2luICp0bykKK3sKKwlpbnQgZXJyOworCisJZXJybm8gPSAwOworCWVyciA9IHNlbmR0byhzb2NrLCBtc2csIG1zZ19sZW4sIDAsIChzdHJ1Y3Qgc29ja2FkZHIqKSB0bywgc2l6ZW9mKCp0bykpOworCWVyciAtPSBtc2dfbGVuOworCWlmIChlcnIpCisJCWJiX3BlcnJvcl9tc2coInNlbmR0byIpOworCXJldHVybiBlcnI7Cit9CisKKy8qKgorICogcGFzc190b19zZXJ2ZXIoKSAtIGZvcndhcmRzIGRoY3AgcGFja2V0cyBmcm9tIGNsaWVudCB0byBzZXJ2ZXIKKyAqIHAgLSBwYWNrZXQgdG8gc2VuZAorICogY2xpZW50IC0gbnVtYmVyIG9mIHRoZSBjbGllbnQKKyAqLworc3RhdGljIHZvaWQgcGFzc190b19zZXJ2ZXIoc3RydWN0IGRoY3BfcGFja2V0ICpwLCBpbnQgcGFja2V0X2xlbiwgaW50IGNsaWVudCwgaW50ICpmZHMsCisJCQlzdHJ1Y3Qgc29ja2FkZHJfaW4gKmNsaWVudF9hZGRyLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNlcnZlcl9hZGRyKQoreworCWludCB0eXBlOworCisJLyogY2hlY2sgcGFja2V0X3R5cGUgKi8KKwl0eXBlID0gZ2V0X2RoY3BfcGFja2V0X3R5cGUocCk7CisJaWYgKHR5cGUgIT0gREhDUERJU0NPVkVSICYmIHR5cGUgIT0gREhDUFJFUVVFU1QKKwkgJiYgdHlwZSAhPSBESENQREVDTElORSAmJiB0eXBlICE9IERIQ1BSRUxFQVNFCisJICYmIHR5cGUgIT0gREhDUElORk9STQorCSkgeworCQlyZXR1cm47CisJfQorCisJLyogY3JlYXRlIG5ldyB4aWQgZW50cnkgKi8KKwl4aWRfYWRkKHAtPnhpZCwgY2xpZW50X2FkZHIsIGNsaWVudCk7CisKKwkvKiBmb3J3YXJkIHJlcXVlc3QgdG8gc2VydmVyICovCisJLyogbm90ZSB0aGF0IHdlIHNlbmQgZnJvbSBmZHNbMF0gd2hpY2ggaXMgYm91bmQgdG8gU0VSVkVSX1BPUlQgKDY3KS4KKwkgKiBJT1c6IHdlIHNlbmQgX2Zyb21fIFNFUlZFUl9QT1JUISBBbHRob3VnaCB0aGlzIG1heSBsb29rIHN0cmFuZ2UsCisJICogUkZDIDE1NDIgbm90IG9ubHkgYWxsb3dzLCBidXQgcHJlc2NyaWJlcyB0aGlzIGZvciBCT09UUCByZWxheXMuCisJICovCisJc2VuZHRvX2lwNChmZHNbMF0sIHAsIHBhY2tldF9sZW4sIHNlcnZlcl9hZGRyKTsKK30KKworLyoqCisgKiBwYXNzX3RvX2NsaWVudCgpIC0gZm9yd2FyZHMgZGhjcCBwYWNrZXRzIGZyb20gc2VydmVyIHRvIGNsaWVudAorICogcCAtIHBhY2tldCB0byBzZW5kCisgKi8KK3N0YXRpYyB2b2lkIHBhc3NfdG9fY2xpZW50KHN0cnVjdCBkaGNwX3BhY2tldCAqcCwgaW50IHBhY2tldF9sZW4sIGludCAqZmRzKQoreworCWludCB0eXBlOworCXN0cnVjdCB4aWRfaXRlbSAqaXRlbTsKKworCS8qIGNoZWNrIHhpZCAqLworCWl0ZW0gPSB4aWRfZmluZChwLT54aWQpOworCWlmICghaXRlbSkgeworCQlyZXR1cm47CisJfQorCisJLyogY2hlY2sgcGFja2V0IHR5cGUgKi8KKwl0eXBlID0gZ2V0X2RoY3BfcGFja2V0X3R5cGUocCk7CisJaWYgKHR5cGUgIT0gREhDUE9GRkVSICYmIHR5cGUgIT0gREhDUEFDSyAmJiB0eXBlICE9IERIQ1BOQUspIHsKKwkJcmV0dXJuOworCX0KKworLy9UT0RPOiBhbHNvIGRvIGl0IGlmIChwLT5mbGFncyAmIGh0b25zKEJST0FEQ0FTVF9GTEFHKSkgaXMgc2V0IQorCWlmIChpdGVtLT5pcC5zaW5fYWRkci5zX2FkZHIgPT0gaHRvbmwoSU5BRERSX0FOWSkpCisJCWl0ZW0tPmlwLnNpbl9hZGRyLnNfYWRkciA9IGh0b25sKElOQUREUl9CUk9BRENBU1QpOworCisJaWYgKHNlbmR0b19pcDQoZmRzW2l0ZW0tPmNsaWVudF0sIHAsIHBhY2tldF9sZW4sICZpdGVtLT5pcCkgIT0gMCkgeworCQlyZXR1cm47IC8qIHNlbmQgZXJyb3Igb2NjdXJyZWQgKi8KKwl9CisKKwkvKiByZW1vdmUgeGlkIGVudHJ5ICovCisJeGlkX2RlbChwLT54aWQpOworfQorCitpbnQgZGhjcHJlbGF5X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBkaGNwcmVsYXlfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHNvY2thZGRyX2luIHNlcnZlcl9hZGRyOworCWNoYXIgKippZmFjZV9saXN0OworCWludCAqZmRzOworCWludCBudW1fc29ja2V0cywgbWF4X3NvY2tldDsKKwl1aW50MzJfdCBvdXJfbmlwOworCisJc2VydmVyX2FkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc2VydmVyX2FkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0JST0FEQ0FTVCk7CisJc2VydmVyX2FkZHIuc2luX3BvcnQgPSBodG9ucyhTRVJWRVJfUE9SVCk7CisKKwkvKiBkaGNwcmVsYXkgQ0xJRU5UX0lGQUNFMVssQ0xJRU5UX0lGQUNFMi4uLl0gU0VSVkVSX0lGQUNFIFtTRVJWRVJfSVBdICovCisJaWYgKGFyZ2MgPT0gNCkgeworCQlpZiAoIWluZXRfYXRvbihhcmd2WzNdLCAmc2VydmVyX2FkZHIuc2luX2FkZHIpKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJiYWQgc2VydmVyIElQIik7CisJfSBlbHNlIGlmIChhcmdjICE9IDMpIHsKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCWlmYWNlX2xpc3QgPSBtYWtlX2lmYWNlX2xpc3QoYXJndiArIDEsICZudW1fc29ja2V0cyk7CisKKwlmZHMgPSB4bWFsbG9jKG51bV9zb2NrZXRzICogc2l6ZW9mKGZkc1swXSkpOworCisJLyogQ3JlYXRlIHNvY2tldHMgYW5kIGJpbmQgb25lIHRvIGV2ZXJ5IGlmYWNlICovCisJbWF4X3NvY2tldCA9IGluaXRfc29ja2V0cyhpZmFjZV9saXN0LCBudW1fc29ja2V0cywgZmRzKTsKKworCS8qIEdldCBvdXIgSVAgb24gc2VydmVyX2lmYWNlICovCisJaWYgKHVkaGNwX3JlYWRfaW50ZXJmYWNlKGFyZ3ZbMl0sIE5VTEwsICZvdXJfbmlwLCBOVUxMKSkKKwkJcmV0dXJuIDE7CisKKwkvKiBNYWluIGxvb3AgKi8KKwl3aGlsZSAoMSkgeworLy8gcmVpbml0IHN0dWZmIGZyb20gdGltZSB0byB0aW1lPyBnbyBiYWNrIHRvIG1ha2VfaWZhY2VfbGlzdAorLy8gZXZlcnkgTiBtaW51dGVzPworCQlmZF9zZXQgcmZkczsKKwkJc3RydWN0IHRpbWV2YWwgdHY7CisJCWludCBpOworCisJCUZEX1pFUk8oJnJmZHMpOworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3NvY2tldHM7IGkrKykKKwkJCUZEX1NFVChmZHNbaV0sICZyZmRzKTsKKwkJdHYudHZfc2VjID0gU0VMRUNUX1RJTUVPVVQ7CisJCXR2LnR2X3VzZWMgPSAwOworCQlpZiAoc2VsZWN0KG1heF9zb2NrZXQgKyAxLCAmcmZkcywgTlVMTCwgTlVMTCwgJnR2KSA+IDApIHsKKwkJCWludCBwYWNrbGVuOworCQkJc3RydWN0IGRoY3BfcGFja2V0IGRoY3BfbXNnOworCisJCQkvKiBzZXJ2ZXIgKi8KKwkJCWlmIChGRF9JU1NFVChmZHNbMF0sICZyZmRzKSkgeworCQkJCXBhY2tsZW4gPSB1ZGhjcF9yZWN2X2tlcm5lbF9wYWNrZXQoJmRoY3BfbXNnLCBmZHNbMF0pOworCQkJCWlmIChwYWNrbGVuID4gMCkgeworCQkJCQlwYXNzX3RvX2NsaWVudCgmZGhjcF9tc2csIHBhY2tsZW4sIGZkcyk7CisJCQkJfQorCQkJfQorCisJCQkvKiBjbGllbnRzICovCisJCQlmb3IgKGkgPSAxOyBpIDwgbnVtX3NvY2tldHM7IGkrKykgeworCQkJCXN0cnVjdCBzb2NrYWRkcl9pbiBjbGllbnRfYWRkcjsKKwkJCQlzb2NrbGVuX3QgYWRkcl9zaXplOworCisJCQkJaWYgKCFGRF9JU1NFVChmZHNbaV0sICZyZmRzKSkKKwkJCQkJY29udGludWU7CisKKwkJCQlhZGRyX3NpemUgPSBzaXplb2YoY2xpZW50X2FkZHIpOworCQkJCXBhY2tsZW4gPSByZWN2ZnJvbShmZHNbaV0sICZkaGNwX21zZywgc2l6ZW9mKGRoY3BfbXNnKSwgMCwKKwkJCQkJCShzdHJ1Y3Qgc29ja2FkZHIgKikoJmNsaWVudF9hZGRyKSwgJmFkZHJfc2l6ZSk7CisJCQkJaWYgKHBhY2tsZW4gPD0gMCkKKwkJCQkJY29udGludWU7CisKKwkJCQkvKiBHZXQgb3VyIElQIG9uIGNvcnJlc3BvbmRpbmcgY2xpZW50X2lmYWNlICovCisvLyBSRkMgMTU0MgorLy8gNC4xIEdlbmVyYWwgQk9PVFAgUHJvY2Vzc2luZyBmb3IgUmVsYXkgQWdlbnRzCisvLyA0LjEuMSBCT09UUkVRVUVTVCBNZXNzYWdlcworLy8gICBJZiB0aGUgcmVsYXkgYWdlbnQgZG9lcyBkZWNpZGUgdG8gcmVsYXkgdGhlIHJlcXVlc3QsIGl0IE1VU1QgZXhhbWluZQorLy8gICB0aGUgJ2dpYWRkcicgKCJnYXRld2F5IiBJUCBhZGRyZXNzKSBmaWVsZC4gIElmIHRoaXMgZmllbGQgaXMgemVybywKKy8vICAgdGhlIHJlbGF5IGFnZW50IE1VU1QgZmlsbCB0aGlzIGZpZWxkIHdpdGggdGhlIElQIGFkZHJlc3Mgb2YgdGhlCisvLyAgIGludGVyZmFjZSBvbiB3aGljaCB0aGUgcmVxdWVzdCB3YXMgcmVjZWl2ZWQuICBJZiB0aGUgaW50ZXJmYWNlIGhhcworLy8gICBtb3JlIHRoYW4gb25lIElQIGFkZHJlc3MgbG9naWNhbGx5IGFzc29jaWF0ZWQgd2l0aCBpdCwgdGhlIHJlbGF5CisvLyAgIGFnZW50IFNIT1VMRCBjaG9vc2Ugb25lIElQIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoYXQgaW50ZXJmYWNlIGFuZAorLy8gICB1c2UgaXQgY29uc2lzdGVudGx5IGZvciBhbGwgQk9PVFAgbWVzc2FnZXMgaXQgcmVsYXlzLiAgSWYgdGhlCisvLyAgICdnaWFkZHInIGZpZWxkIGNvbnRhaW5zIHNvbWUgbm9uLXplcm8gdmFsdWUsIHRoZSAnZ2lhZGRyJyBmaWVsZCBNVVNUCisvLyAgIE5PVCBiZSBtb2RpZmllZC4gIFRoZSByZWxheSBhZ2VudCBNVVNUIE5PVCwgdW5kZXIgYW55IGNpcmN1bXN0YW5jZXMsCisvLyAgIGZpbGwgdGhlICdnaWFkZHInIGZpZWxkIHdpdGggYSBicm9hZGNhc3QgYWRkcmVzcyBhcyBpcyBzdWdnZXN0ZWQgaW4KKy8vICAgWzFdIChTZWN0aW9uIDgsIHNpeHRoIHBhcmFncmFwaCkuCisKKy8vIGJ1dCB3aHk/IHdoYXQgaWYgc2VydmVyIGNhbid0IHJvdXRlIHN1Y2ggSVA/IENsaWVudCBpZmFjZXMgbWF5IGJlLCBzYXksIE5BVGVkIQorCisvLyA0LjEuMiBCT09UUkVQTFkgTWVzc2FnZXMKKy8vICAgQk9PVFAgcmVsYXkgYWdlbnRzIHJlbGF5IEJPT1RSRVBMWSBtZXNzYWdlcyBvbmx5IHRvIEJPT1RQIGNsaWVudHMuCisvLyAgIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBCT09UUCBzZXJ2ZXJzIHRvIHNlbmQgQk9PVFJFUExZIG1lc3NhZ2VzCisvLyAgIGRpcmVjdGx5IHRvIHRoZSByZWxheSBhZ2VudCBpZGVudGlmaWVkIGluIHRoZSAnZ2lhZGRyJyBmaWVsZC4KKy8vICh5ZWFoIHJpZ2h0LCB1bmxlc3MgaXQgaXMgaW1wb3NzaWJsZS4uLiBzZWUgY29tbWVudCBhYm92ZSkKKy8vICAgVGhlcmVmb3JlLCBhIHJlbGF5IGFnZW50IG1heSBhc3N1bWUgdGhhdCBhbGwgQk9PVFJFUExZIG1lc3NhZ2VzIGl0CisvLyAgIHJlY2VpdmVzIGFyZSBpbnRlbmRlZCBmb3IgQk9PVFAgY2xpZW50cyBvbiBpdHMgZGlyZWN0bHktY29ubmVjdGVkCisvLyAgIG5ldHdvcmtzLgorLy8KKy8vICAgV2hlbiBhIHJlbGF5IGFnZW50IHJlY2VpdmVzIGEgQk9PVFJFUExZIG1lc3NhZ2UsIGl0IHNob3VsZCBleGFtaW5lCisvLyAgIHRoZSBCT09UUCAnZ2lhZGRyJywgJ3lpYWRkcicsICdjaGFkZHInLCAnaHR5cGUnLCBhbmQgJ2hsZW4nIGZpZWxkcy4KKy8vICAgVGhlc2UgZmllbGRzIHNob3VsZCBwcm92aWRlIGFkZXF1YXRlIGluZm9ybWF0aW9uIGZvciB0aGUgcmVsYXkgYWdlbnQKKy8vICAgdG8gZGVsaXZlciB0aGUgQk9PVFJFUExZIG1lc3NhZ2UgdG8gdGhlIGNsaWVudC4KKy8vCisvLyAgIFRoZSAnZ2lhZGRyJyBmaWVsZCBjYW4gYmUgdXNlZCB0byBpZGVudGlmeSB0aGUgbG9naWNhbCBpbnRlcmZhY2UgZnJvbQorLy8gICB3aGljaCB0aGUgcmVwbHkgbXVzdCBiZSBzZW50IChpLmUuLCB0aGUgaG9zdCBvciByb3V0ZXIgaW50ZXJmYWNlCisvLyAgIGNvbm5lY3RlZCB0byB0aGUgc2FtZSBuZXR3b3JrIGFzIHRoZSBCT09UUCBjbGllbnQpLiAgSWYgdGhlIGNvbnRlbnQKKy8vICAgb2YgdGhlICdnaWFkZHInIGZpZWxkIGRvZXMgbm90IG1hdGNoIG9uZSBvZiB0aGUgcmVsYXkgYWdlbnQncworLy8gICBkaXJlY3RseS1jb25uZWN0ZWQgbG9naWNhbCBpbnRlcmZhY2VzLCB0aGUgQk9PVFJFUExZIG1lc3NzYWdlIE1VU1QgYmUKKy8vICAgc2lsZW50bHkgZGlzY2FyZGVkLgorCQkJCWlmICh1ZGhjcF9yZWFkX2ludGVyZmFjZShpZmFjZV9saXN0W2ldLCBOVUxMLCAmZGhjcF9tc2cuZ2F0ZXdheV9uaXAsIE5VTEwpKSB7CisJCQkJCS8qIEZhbGwgYmFjayB0byBvdXIgSVAgb24gc2VydmVyIGlmYWNlICovCisvLyB0aGlzIG1ha2VzIG1vcmUgc2Vuc2UhCisJCQkJCWRoY3BfbXNnLmdhdGV3YXlfbmlwID0gb3VyX25pcDsKKwkJCQl9CisvLyBtYXliZSBkaGNwX21zZy5ob3BzKys/IGRyb3AgcGFja2V0cyB3aXRoIHRvbyBtYW55IGhvcHMgKFJGQyAxNTQyIHNheXMgNCBvciAxNik/CisJCQkJcGFzc190b19zZXJ2ZXIoJmRoY3BfbXNnLCBwYWNrbGVuLCBpLCBmZHMsICZjbGllbnRfYWRkciwgJnNlcnZlcl9hZGRyKTsKKwkJCX0KKwkJfQorCQl4aWRfZXhwaXJlKCk7CisJfSAvKiB3aGlsZSAoMSkgKi8KKworCS8qIHJldHVybiAwOyAtIG5vdCByZWFjaGVkICovCit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3VkaGNwL2RvbWFpbl9jb2RlYy5jIGIvbmV0d29ya2luZy91ZGhjcC9kb21haW5fY29kZWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTMyNWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy91ZGhjcC9kb21haW5fY29kZWMuYwpAQCAtMCwwICsxLDI0NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisKKy8qIFJGQzEwMzUgZG9tYWluIGNvbXByZXNzaW9uIHJvdXRpbmVzIChDKSAyMDA3IEdhYnJpZWwgU29tbG8gPHNvbWxvIGF0IGNtdS5lZHU+CisgKgorICogTG9vc2VseSBiYXNlZCBvbiB0aGUgaXNjLWRoY3BkIGltcGxlbWVudGF0aW9uIGJ5IGRoYW5raW5zQGlzYy5vcmcKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaWZkZWYgRE5TX0NPTVBSX1RFU1RJTkcKKyMgZGVmaW5lIEZBU1RfRlVOQyAvKiBub3RoaW5nICovCisjIGRlZmluZSB4bWFsbG9jIG1hbGxvYworIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjIGluY2x1ZGUgPHN0cmluZy5oPgorIyBpbmNsdWRlIDxzdGRpby5oPgorI2Vsc2UKKyMgaW5jbHVkZSAiY29tbW9uLmgiCisjZW5kaWYKKworI2RlZmluZSBOU19NQVhETkFNRSAgMTAyNQkvKiBtYXggZG9tYWluIG5hbWUgbGVuZ3RoICovCisjZGVmaW5lIE5TX01BWENETkFNRSAgMjU1CS8qIG1heCBjb21wcmVzc2VkIGRvbWFpbiBuYW1lIGxlbmd0aCAqLworI2RlZmluZSBOU19NQVhMQUJFTCAgICA2MwkvKiBtYXggbGFiZWwgbGVuZ3RoICovCisjZGVmaW5lIE5TX01BWEROU1JDSCAgICA2CS8qIG1heCBkb21haW5zIGluIHNlYXJjaCBwYXRoICovCisjZGVmaW5lIE5TX0NNUFJTRkxHUyAweGMwCS8qIG5hbWUgY29tcHJlc3Npb24gcG9pbnRlciBmbGFnICovCisKKworLyogRXhwYW5kIGEgUkZDMTAzNS1jb21wcmVzc2VkIGxpc3Qgb2YgZG9tYWluIG5hbWVzICJjc3RyIiwgb2YgbGVuZ3RoICJjbGVuIjsKKyAqIHJldHVybnMgYSBuZXdseSBhbGxvY2F0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNwYWNlLXNlcGFyYXRlZCBkb21haW5zLAorICogcHJlZml4ZWQgd2l0aCB0aGUgY29udGVudHMgb2Ygc3RyaW5nIHByZSwgb3IgTlVMTCBpZiBhbiBlcnJvciBvY2N1cnMuCisgKi8KK2NoYXIqIEZBU1RfRlVOQyBkbmFtZV9kZWMoY29uc3QgdWludDhfdCAqY3N0ciwgaW50IGNsZW4sIGNvbnN0IGNoYXIgKnByZSkKK3sKKwljaGFyICpyZXQgPSByZXQ7IC8qIGZvciBjb21waWxlciAqLworCWNoYXIgKmRzdCA9IE5VTEw7CisKKwkvKiBXZSBtYWtlIHR3byBwYXNzZXMgb3ZlciB0aGUgY3N0ciBzdHJpbmcuIEZpcnN0LCB3ZSBjb21wdXRlCisJICogaG93IGxvbmcgdGhlIHJlc3VsdGluZyBzdHJpbmcgd291bGQgYmUuIFRoZW4gd2UgYWxsb2NhdGUgYQorCSAqIG5ldyBidWZmZXIgb2YgdGhlIHJlcXVpcmVkIGxlbmd0aCwgYW5kIGZpbGwgaXQgaW4gd2l0aCB0aGUKKwkgKiBleHBhbmRlZCBjb250ZW50LiBUaGUgYWR2YW50YWdlIG9mIHRoaXMgYXBwcm9hY2ggaXMgbm90CisJICogaGF2aW5nIHRvIGRlYWwgd2l0aCByZXF1aXJpbmcgY2FsbGVycyB0byBzdXBwbHkgdGhlaXIgb3duCisJICogYnVmZmVyLCB0aGVuIGhhdmluZyB0byBjaGVjayBpZiBpdCdzIHN1ZmZpY2llbnRseSBsYXJnZSwgZXRjLgorCSAqLworCXdoaWxlICgxKSB7CisJCS8qIG5vdGU6ICJyZXR1cm4gTlVMTCIgYmVsb3cgYXJlIGxlYWstc2FmZSBzaW5jZQorCQkgKiBkc3QgaXNuJ3QgeWV0IGFsbG9jYXRlZCAqLworCQljb25zdCB1aW50OF90ICpjOworCQl1bnNpZ25lZCBjcnRwb3MsIHJldHBvcywgZGVwdGgsIGxlbjsKKworCQljcnRwb3MgPSByZXRwb3MgPSBkZXB0aCA9IGxlbiA9IDA7CisJCXdoaWxlIChjcnRwb3MgPCBjbGVuKSB7CisJCQljID0gY3N0ciArIGNydHBvczsKKworCQkJaWYgKCgqYyAmIE5TX0NNUFJTRkxHUykgPT0gTlNfQ01QUlNGTEdTKSB7CisJCQkJLyogcG9pbnRlciAqLworCQkJCWlmIChjcnRwb3MgKyAyID4gY2xlbikgLyogbm8gb2Zmc2V0IHRvIGp1bXAgdG8/IGFib3J0ICovCisJCQkJCXJldHVybiBOVUxMOworCQkJCWlmIChyZXRwb3MgPT0gMCkgLyogdG9wbGV2ZWw/IHNhdmUgcmV0dXJuIHNwb3QgKi8KKwkJCQkJcmV0cG9zID0gY3J0cG9zICsgMjsKKwkJCQlkZXB0aCsrOworCQkJCWNydHBvcyA9ICgoY1swXSAmIDB4M2YpIDw8IDgpIHwgY1sxXTsgLyoganVtcCAqLworCQkJfSBlbHNlIGlmICgqYykgeworCQkJCS8qIGxhYmVsICovCisJCQkJaWYgKGNydHBvcyArICpjICsgMSA+IGNsZW4pIC8qIGxhYmVsIHRvbyBsb25nPyBhYm9ydCAqLworCQkJCQlyZXR1cm4gTlVMTDsKKwkJCQlpZiAoZHN0KQorCQkJCQltZW1jcHkoZHN0ICsgbGVuLCBjICsgMSwgKmMpOworCQkJCWxlbiArPSAqYyArIDE7CisJCQkJY3J0cG9zICs9ICpjICsgMTsKKwkJCQlpZiAoZHN0KQorCQkJCQlkc3RbbGVuIC0gMV0gPSAnLic7CisJCQl9IGVsc2UgeworCQkJCS8qIE5VTDogZW5kIG9mIGN1cnJlbnQgZG9tYWluIG5hbWUgKi8KKwkJCQlpZiAocmV0cG9zID09IDApIHsKKwkJCQkJLyogdG9wbGV2ZWw/IGtlZXAgZ29pbmcgKi8KKwkJCQkJY3J0cG9zKys7CisJCQkJfSBlbHNlIHsKKwkJCQkJLyogcmV0dXJuIHRvIHRvcGxldmVsIHNhdmVkIHNwb3QgKi8KKwkJCQkJY3J0cG9zID0gcmV0cG9zOworCQkJCQlyZXRwb3MgPSBkZXB0aCA9IDA7CisJCQkJfQorCQkJCWlmIChkc3QpCisJCQkJCWRzdFtsZW4gLSAxXSA9ICcgJzsKKwkJCX0KKworCQkJaWYgKGRlcHRoID4gTlNfTUFYRE5TUkNIIC8qIHRvbyBtYW55IGp1bXBzPyBhYm9ydCwgaXQncyBhIGxvb3AgKi8KKwkJCSB8fCBsZW4gPiBOU19NQVhETkFNRSAqIE5TX01BWEROU1JDSCAvKiByZXN1bHQgdG9vIGxvbmc/IGFib3J0ICovCisJCQkpIHsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCisJCWlmICghbGVuKSAvKiBleHBhbmRlZCBzdHJpbmcgaGFzIDAgbGVuZ3RoPyBhYm9ydCAqLworCQkJcmV0dXJuIE5VTEw7CisKKwkJaWYgKCFkc3QpIHsgLyogZmlyc3QgcGFzcz8gKi8KKwkJCS8qIGFsbG9jYXRlIGRzdCBidWZmZXIgYW5kIGNvcHkgcHJlICovCisJCQl1bnNpZ25lZCBwbGVuID0gc3RybGVuKHByZSk7CisJCQlyZXQgPSBkc3QgPSB4bWFsbG9jKHBsZW4gKyBsZW4pOworCQkJbWVtY3B5KGRzdCwgcHJlLCBwbGVuKTsKKwkJCWRzdCArPSBwbGVuOworCQl9IGVsc2UgeworCQkJZHN0W2xlbiAtIDFdID0gJ1wwJzsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogQ29udmVydCBhIGRvbWFpbiBuYW1lIChzcmMpIGZyb20gaHVtYW4tcmVhZGFibGUgImZvby5ibGFoLmNvbSIgZm9ybWF0IGludG8KKyAqIFJGQzEwMzUgZW5jb2RpbmcgIlwwMDNmb29cMDA0YmxhaFwwMDNjb21cMDAwIi4gUmV0dXJuIGFsbG9jYXRlZCBzdHJpbmcsIG9yCisgKiBOVUxMIGlmIGFuIGVycm9yIG9jY3Vycy4KKyAqLworc3RhdGljIHVpbnQ4X3QgKmNvbnZlcnRfZG5hbWUoY29uc3QgY2hhciAqc3JjKQoreworCXVpbnQ4X3QgYywgKnJlcywgKmxlbnB0ciwgKmRzdDsKKwlpbnQgbGVuOworCisJcmVzID0geG1hbGxvYyhzdHJsZW4oc3JjKSArIDIpOworCWRzdCA9IGxlbnB0ciA9IHJlczsKKwlkc3QrKzsKKworCWZvciAoOzspIHsKKwkJYyA9ICh1aW50OF90KSpzcmMrKzsKKwkJaWYgKGMgPT0gJy4nIHx8IGMgPT0gJ1wwJykgeyAgLyogZW5kIG9mIGxhYmVsICovCisJCQlsZW4gPSBkc3QgLSBsZW5wdHIgLSAxOworCQkJLyogbGFiZWwgdG9vIGxvbmcsIHRvbyBzaG9ydCwgb3IgdHdvICcuJ3MgaW4gYSByb3c/IGFib3J0ICovCisJCQlpZiAobGVuID4gTlNfTUFYTEFCRUwgfHwgbGVuID09IDAgfHwgKGMgPT0gJy4nICYmICpzcmMgPT0gJy4nKSkgeworCQkJCWZyZWUocmVzKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCSpsZW5wdHIgPSBsZW47CisJCQlpZiAoYyA9PSAnXDAnIHx8ICpzcmMgPT0gJ1wwJykJLyogIiIgb3IgIi4iOiBlbmQgb2Ygc3JjICovCisJCQkJYnJlYWs7CisJCQlsZW5wdHIgPSBkc3QrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgIC8qIHVwcGVyY2FzZT8gY29udmVydCB0byBsb3dlciAqLworCQkJYyArPSAoJ2EnIC0gJ0EnKTsKKwkJKmRzdCsrID0gYzsKKwl9CisKKwlpZiAoZHN0IC0gcmVzID49IE5TX01BWENETkFNRSkgeyAgLyogZG5hbWUgdG9vIGxvbmc/IGFib3J0ICovCisJCWZyZWUocmVzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJKmRzdCA9IDA7CisJcmV0dXJuIHJlczsKK30KKworLyogUmV0dXJucyB0aGUgb2Zmc2V0IHdpdGhpbiBjc3RyIGF0IHdoaWNoIGRuYW1lIGNhbiBiZSBmb3VuZCwgb3IgLTEgKi8KK3N0YXRpYyBpbnQgZmluZF9vZmZzZXQoY29uc3QgdWludDhfdCAqY3N0ciwgaW50IGNsZW4sIGNvbnN0IHVpbnQ4X3QgKmRuYW1lKQoreworCWNvbnN0IHVpbnQ4X3QgKmMsICpkOworCWludCBvZmY7CisKKwkvKiBmaW5kIGFsbCBsYWJlbHMgaW4gY3N0ciAqLworCW9mZiA9IDA7CisJd2hpbGUgKG9mZiA8IGNsZW4pIHsKKwkJYyA9IGNzdHIgKyBvZmY7CisKKwkJaWYgKCgqYyAmIE5TX0NNUFJTRkxHUykgPT0gTlNfQ01QUlNGTEdTKSB7ICAvKiBwb2ludGVyLCBza2lwICovCisJCQlvZmYgKz0gMjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgqYykgeyAgLyogbGFiZWwsIHRyeSBtYXRjaGluZyBkbmFtZSAqLworCQkJZCA9IGRuYW1lOworCQkJd2hpbGUgKDEpIHsKKwkJCQl1bnNpZ25lZCBsZW4xID0gKmMgKyAxOworCQkJCWlmIChtZW1jbXAoYywgZCwgbGVuMSkgIT0gMCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKGxlbjEgPT0gMSkgIC8qIGF0IHRlcm1pbmF0aW5nIE5VTCAtIG1hdGNoLCByZXR1cm4gb2Zmc2V0ICovCisJCQkJCXJldHVybiBvZmY7CisJCQkJZCArPSBsZW4xOworCQkJCWMgKz0gbGVuMTsKKwkJCQlpZiAoKCpjICYgTlNfQ01QUlNGTEdTKSA9PSBOU19DTVBSU0ZMR1MpICAvKiBwb2ludGVyLCBqdW1wICovCisJCQkJCWMgPSBjc3RyICsgKCgoY1swXSAmIDB4M2YpIDw8IDgpIHwgY1sxXSk7CisJCQl9CisJCQlvZmYgKz0gY3N0cltvZmZdICsgMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCS8qIE5VTCwgc2tpcCAqLworCQlvZmYrKzsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qIENvbXB1dGVzIHN0cmluZyB0byBiZSBhcHBlbmRlZCB0byBjc3RyIHNvIHRoYXQgc3JjIHdvdWxkIGJlIGFkZGVkIHRvCisgKiB0aGUgY29tcHJlc3Npb24gKGJlc3QgY2FzZSwgaXQncyBhIDItYnl0ZSBwb2ludGVyIHRvIHNvbWUgb2Zmc2V0IHdpdGhpbgorICogY3N0cjsgd29yc3QgY2FzZSwgaXQncyBhbGwgb2Ygc3JjLCBjb252ZXJ0ZWQgdG8gPDQ+aG9zdDwzPmNvbTwwPiBmb3JtYXQpLgorICogVGhlIGNvbXB1dGVkIHN0cmluZyBpcyByZXR1cm5lZCBkaXJlY3RseTsgaXRzIGxlbmd0aCBpcyByZXR1cm5lZCB2aWEgcmV0bGVuOworICogTlVMTCBhbmQgMCwgcmVzcGVjdGl2ZWx5LCBhcmUgcmV0dXJuZWQgaWYgYW4gZXJyb3Igb2NjdXJzLgorICovCit1aW50OF90KiBGQVNUX0ZVTkMgZG5hbWVfZW5jKGNvbnN0IHVpbnQ4X3QgKmNzdHIsIGludCBjbGVuLCBjb25zdCBjaGFyICpzcmMsIGludCAqcmV0bGVuKQoreworCXVpbnQ4X3QgKmQsICpkbmFtZTsKKwlpbnQgb2ZmOworCisJZG5hbWUgPSBjb252ZXJ0X2RuYW1lKHNyYyk7CisJaWYgKGRuYW1lID09IE5VTEwpIHsKKwkJKnJldGxlbiA9IDA7CisJCXJldHVybiBOVUxMOworCX0KKworCWQgPSBkbmFtZTsKKwl3aGlsZSAoKmQpIHsKKwkJaWYgKGNzdHIpIHsKKwkJCW9mZiA9IGZpbmRfb2Zmc2V0KGNzdHIsIGNsZW4sIGQpOworCQkJaWYgKG9mZiA+PSAwKSB7CS8qIGZvdW5kIGEgbWF0Y2gsIGFkZCBwb2ludGVyIGFuZCByZXR1cm4gKi8KKwkJCQkqZCsrID0gTlNfQ01QUlNGTEdTIHwgKG9mZiA+PiA4KTsKKwkJCQkqZCA9IG9mZjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlkICs9ICpkICsgMTsKKwl9CisKKwkqcmV0bGVuID0gZCAtIGRuYW1lICsgMTsKKwlyZXR1cm4gZG5hbWU7Cit9CisKKyNpZmRlZiBETlNfQ09NUFJfVEVTVElORworLyogZ2NjIC1XYWxsIC1ERE5TX0NPTVBSX1RFU1RJTkcgZG9tYWluX2NvZGVjLmMgLW8gZG9tYWluX2NvZGVjICYmIC4vZG9tYWluX2NvZGVjICovCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGxlbjsKKwl1aW50OF90ICplbmNvZGVkOworCisjZGVmaW5lIEROQU1FX0RFQyhlbmNvZGVkLHByZSkgZG5hbWVfZGVjKCh1aW50OF90KikoZW5jb2RlZCksIHNpemVvZihlbmNvZGVkKSwgKHByZSkpCisJcHJpbnRmKCInJXMnXG4iLCAgICAgICBETkFNRV9ERUMoIlw0aG9zdFwzY29tXDAiLCAidGVzdDE6IikpOworCXByaW50ZigidGVzdDI6JyVzJ1xuIiwgRE5BTUVfREVDKCJcNGhvc3RcM2NvbVwwXDRob3N0XDNjb21cMCIsICIiKSk7CisJcHJpbnRmKCJ0ZXN0MzonJXMnXG4iLCBETkFNRV9ERUMoIlw0aG9zdFwzY29tXDBceEMwXDAiLCAiIikpOworCXByaW50ZigidGVzdDQ6JyVzJ1xuIiwgRE5BTUVfREVDKCJcNGhvc3RcM2NvbVwwXHhDMFw1IiwgIiIpKTsKKwlwcmludGYoInRlc3Q1OiclcydcbiIsIEROQU1FX0RFQygiXDRob3N0XDNjb21cMFx4QzBcNVwxelx4QzBceEEiLCAiIikpOworCisjZGVmaW5lIEROQU1FX0VOQyhjYWNoZSxzb3VyY2UsbGVucCkgZG5hbWVfZW5jKCh1aW50OF90KikoY2FjaGUpLCBzaXplb2YoY2FjaGUpLCAoc291cmNlKSwgKGxlbnApKQorCWVuY29kZWQgPSBkbmFtZV9lbmMoTlVMTCwgMCwgInRlc3QubmV0IiwgJmxlbik7CisJcHJpbnRmKCJ0ZXN0NjonJXMnIGxlbjolZFxuIiwgZG5hbWVfZGVjKGVuY29kZWQsIGxlbiwgIiIpLCBsZW4pOworCWVuY29kZWQgPSBETkFNRV9FTkMoIlwzbmV0XDAiLCAidGVzdC5uZXQiLCAmbGVuKTsKKwlwcmludGYoInRlc3Q3OiclcycgbGVuOiVkXG4iLCBkbmFtZV9kZWMoZW5jb2RlZCwgbGVuLCAiIiksIGxlbik7CisJZW5jb2RlZCA9IEROQU1FX0VOQygiXDR0ZXN0XDNuZXRcMCIsICJ0ZXN0Lm5ldCIsICZsZW4pOworCXByaW50ZigidGVzdDg6JyVzJyBsZW46JWRcbiIsIGRuYW1lX2RlYyhlbmNvZGVkLCBsZW4sICIiKSwgbGVuKTsKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy91ZGhjcC9kdW1wbGVhc2VzLmMgYi9uZXR3b3JraW5nL3VkaGNwL2R1bXBsZWFzZXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGNkNzNlCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy91ZGhjcC9kdW1wbGVhc2VzLmMKQEAgLTAsMCArMSwxMDcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGR1bXBsZWFzZXNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstcnwtYV0gWy1mIExFQVNFRklMRV0iCisvL3VzYWdlOiNkZWZpbmUgZHVtcGxlYXNlc19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRpc3BsYXkgREhDUCBsZWFzZXMgZ3JhbnRlZCBieSB1ZGhjcGRcbiIKKy8vdXNhZ2U6CUlGX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAiXG4JLWYsLS1maWxlPUZJTEUJTGVhc2UgZmlsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXIsLS1yZW1haW5pbmcJU2hvdyByZW1haW5pbmcgdGltZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWEsLS1hYnNvbHV0ZQlTaG93IGV4cGlyYXRpb24gdGltZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgIlxuCS1mIEZJTEUJTGVhc2UgZmlsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXIJU2hvdyByZW1haW5pbmcgdGltZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJU2hvdyBleHBpcmF0aW9uIHRpbWUiCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJkaGNwZC5oIgorI2luY2x1ZGUgInVuaWNvZGUuaCIKKworaW50IGR1bXBsZWFzZXNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGR1bXBsZWFzZXNfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBmZDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBvcHQ7CisJaW50NjRfdCB3cml0dGVuX2F0LCBjdXJyLCBleHBpcmVzX2FiczsKKwljb25zdCBjaGFyICpmaWxlID0gTEVBU0VTX0ZJTEU7CisJc3RydWN0IGR5bl9sZWFzZSBsZWFzZTsKKwlzdHJ1Y3QgaW5fYWRkciBhZGRyOworCisJZW51bSB7CisJCU9QVF9hID0gMHgxLCAvLyAtYQorCQlPUFRfciA9IDB4MiwgLy8gLXIKKwkJT1BUX2YgPSAweDQsIC8vIC1mCisJfTsKKyNpZiBFTkFCTEVfTE9OR19PUFRTCisJc3RhdGljIGNvbnN0IGNoYXIgZHVtcGxlYXNlc19sb25nb3B0c1tdIEFMSUdOMSA9CisJCSJhYnNvbHV0ZVwwIiAgTm9fYXJndW1lbnQgICAgICAgImEiCisJCSJyZW1haW5pbmdcMCIgTm9fYXJndW1lbnQgICAgICAgInIiCisJCSJmaWxlXDAiICAgICAgUmVxdWlyZWRfYXJndW1lbnQgImYiCisJCTsKKworCWFwcGxldF9sb25nX29wdGlvbnMgPSBkdW1wbGVhc2VzX2xvbmdvcHRzOworI2VuZGlmCisJaW5pdF91bmljb2RlKCk7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MDphLS1yOnItLWEiOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJhcmY6IiwgJmZpbGUpOworCisJZmQgPSB4b3BlbihmaWxlLCBPX1JET05MWSk7CisKKwlwcmludGYoIk1hYyBBZGRyZXNzICAgICAgIElQIEFkZHJlc3MgICAgICBIb3N0IE5hbWUgICAgICAgICAgIEV4cGlyZXMgJXNcbiIsIChvcHQgJiBPUFRfYSkgPyAiYXQiIDogImluIik7CisJLyogICAgICIwMDowMDowMDowMDowMDowMCAyNTUuMjU1LjI1NS4yNTUgQUJDREVGR0hJSktMTU5PUFFSUyBXZWQgSnVuIDMwIDIxOjQ5OjA4IDE5OTMiICovCisJLyogICAgICIxMjM0NTY3ODkgMTIzNDU2Nzg5IDEyMzQ1Njc4OSAxMjM0NTY3ODkgMTIzNDU2Nzg5IDEyMzQ1Njc4OSAxMjM0NTY3ODkgMTIzNDU2Nzg5ICovCisKKwl4cmVhZChmZCwgJndyaXR0ZW5fYXQsIHNpemVvZih3cml0dGVuX2F0KSk7CisJd3JpdHRlbl9hdCA9IFNXQVBfQkU2NCh3cml0dGVuX2F0KTsKKwljdXJyID0gdGltZShOVUxMKTsKKwlpZiAoY3VyciA8IHdyaXR0ZW5fYXQpCisJCXdyaXR0ZW5fYXQgPSBjdXJyOyAvKiBsZWFzZSBmaWxlIGZyb20gZnV0dXJlISA6KSAqLworCisJd2hpbGUgKGZ1bGxfcmVhZChmZCwgJmxlYXNlLCBzaXplb2YobGVhc2UpKSA9PSBzaXplb2YobGVhc2UpKSB7CisJCWNvbnN0IGNoYXIgKmZtdCA9ICI6JTAyeCIgKyAxOworCQlmb3IgKGkgPSAwOyBpIDwgNjsgaSsrKSB7CisJCQlwcmludGYoZm10LCBsZWFzZS5sZWFzZV9tYWNbaV0pOworCQkJZm10ID0gIjolMDJ4IjsKKwkJfQorCQlhZGRyLnNfYWRkciA9IGxlYXNlLmxlYXNlX25pcDsKKyNpZiBFTkFCTEVfVU5JQ09ERV9TVVBQT1JUCisJCXsKKwkJCWNoYXIgKnVuaV9uYW1lID0gdW5pY29kZV9jb252X3RvX3ByaW50YWJsZV9maXhlZHdpZHRoKC8qTlVMTCwqLyBsZWFzZS5ob3N0bmFtZSwgMTkpOworCQkJcHJpbnRmKCIgJS0xNnMlcyAiLCBpbmV0X250b2EoYWRkciksIHVuaV9uYW1lKTsKKwkJCWZyZWUodW5pX25hbWUpOworCQl9CisjZWxzZQorCQkvKiBhY3R1YWxseSwgMTUrMSBhbmQgMTkrMSwgKzEgaXMgYSBzcGFjZSBiZXR3ZWVuIGNvbHVtbnMgKi8KKwkJLyogbGVhc2UuaG9zdG5hbWUgaXMgY2hhclsyMF0gYW5kIGlzIGFsd2F5cyBOVUwgdGVybWluYXRlZCAqLworCQlwcmludGYoIiAlLTE2cyUtMjBzIiwgaW5ldF9udG9hKGFkZHIpLCBsZWFzZS5ob3N0bmFtZSk7CisjZW5kaWYKKwkJZXhwaXJlc19hYnMgPSBudG9obChsZWFzZS5leHBpcmVzKSArIHdyaXR0ZW5fYXQ7CisJCWlmIChleHBpcmVzX2FicyA8PSBjdXJyKSB7CisJCQlwdXRzKCJleHBpcmVkIik7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIShvcHQgJiBPUFRfYSkpIHsgLyogbm8gLWEgKi8KKwkJCXVuc2lnbmVkIGQsIGgsIG07CisJCQl1bnNpZ25lZCBleHBpcmVzID0gZXhwaXJlc19hYnMgLSBjdXJyOworCQkJZCA9IGV4cGlyZXMgLyAoMjQqNjAqNjApOyBleHBpcmVzICU9ICgyNCo2MCo2MCk7CisJCQloID0gZXhwaXJlcyAvICg2MCo2MCk7IGV4cGlyZXMgJT0gKDYwKjYwKTsKKwkJCW0gPSBleHBpcmVzIC8gNjA7IGV4cGlyZXMgJT0gNjA7CisJCQlpZiAoZCkKKwkJCQlwcmludGYoIiV1IGRheXMgIiwgZCk7CisJCQlwcmludGYoIiUwMnU6JTAydTolMDJ1XG4iLCBoLCBtLCAodW5zaWduZWQpZXhwaXJlcyk7CisJCX0gZWxzZSB7IC8qIC1hICovCisJCQl0aW1lX3QgdCA9IGV4cGlyZXNfYWJzOworCQkJZnB1dHMoY3RpbWUoJnQpLCBzdGRvdXQpOworCQl9CisJfQorCS8qIGNsb3NlKGZkKTsgKi8KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy91ZGhjcC9maWxlcy5jIGIvbmV0d29ya2luZy91ZGhjcC9maWxlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjODgwOGMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3VkaGNwL2ZpbGVzLmMKQEAgLTAsMCArMSwyMjggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIERIQ1Agc2VydmVyIGNvbmZpZyBhbmQgbGVhc2UgZmlsZSBtYW5pcHVsYXRpb24KKyAqCisgKiBSZXdyaXRlIGJ5IFJ1c3MgRGlsbCA8UnVzcy5EaWxsQGFzdS5lZHU+IEp1bHkgMjAwMQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlIDxuZXRpbmV0L2V0aGVyLmg+CisKKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJkaGNwZC5oIgorCisvKiBvbiB0aGVzZSBmdW5jdGlvbnMsIG1ha2Ugc3VyZSB5b3VyIGRhdGF0eXBlIG1hdGNoZXMgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DIHJlYWRfc3RyKGNvbnN0IGNoYXIgKmxpbmUsIHZvaWQgKmFyZykKK3sKKwljaGFyICoqZGVzdCA9IGFyZzsKKworCWZyZWUoKmRlc3QpOworCSpkZXN0ID0geHN0cmR1cChsaW5lKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgcmVhZF91MzIoY29uc3QgY2hhciAqbGluZSwgdm9pZCAqYXJnKQoreworCSoodWludDMyX3QqKWFyZyA9IGJiX3N0cnRvdTMyKGxpbmUsIE5VTEwsIDEwKTsKKwlyZXR1cm4gZXJybm8gPT0gMDsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgcmVhZF9zdGF0aWNsZWFzZShjb25zdCBjaGFyICpjb25zdF9saW5lLCB2b2lkICphcmcpCit7CisJY2hhciAqbGluZTsKKwljaGFyICptYWNfc3RyaW5nOworCWNoYXIgKmlwX3N0cmluZzsKKwlzdHJ1Y3QgZXRoZXJfYWRkciBtYWNfYnl0ZXM7IC8qIGl0J3MgInN0cnVjdCB7IHVpbnQ4X3QgbWFjWzZdOyB9IiAqLworCXVpbnQzMl90IG5pcDsKKworCS8qIFJlYWQgbWFjICovCisJbGluZSA9IChjaGFyICopIGNvbnN0X2xpbmU7CisJbWFjX3N0cmluZyA9IHN0cnRva19yKGxpbmUsICIgXHQiLCAmbGluZSk7CisJaWYgKCFtYWNfc3RyaW5nIHx8ICFldGhlcl9hdG9uX3IobWFjX3N0cmluZywgJm1hY19ieXRlcykpCisJCXJldHVybiAwOworCisJLyogUmVhZCBpcCAqLworCWlwX3N0cmluZyA9IHN0cnRva19yKE5VTEwsICIgXHQiLCAmbGluZSk7CisJaWYgKCFpcF9zdHJpbmcgfHwgIXVkaGNwX3N0cjJuaXAoaXBfc3RyaW5nLCAmbmlwKSkKKwkJcmV0dXJuIDA7CisKKwlhZGRfc3RhdGljX2xlYXNlKGFyZywgKHVpbnQ4X3QqKSAmbWFjX2J5dGVzLCBuaXApOworCisJbG9nX3N0YXRpY19sZWFzZXMoYXJnKTsKKworCXJldHVybiAxOworfQorCisKK3N0cnVjdCBjb25maWdfa2V5d29yZCB7CisJY29uc3QgY2hhciAqa2V5d29yZDsKKwlpbnQgKCpoYW5kbGVyKShjb25zdCBjaGFyICpsaW5lLCB2b2lkICp2YXIpIEZBU1RfRlVOQzsKKwl2b2lkICp2YXI7CisJY29uc3QgY2hhciAqZGVmOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBjb25maWdfa2V5d29yZCBrZXl3b3Jkc1tdID0geworCS8qIGtleXdvcmQgICAgICAgIGhhbmRsZXIgICAgICAgICAgIHZhcmlhYmxlIGFkZHJlc3MgICAgICAgICAgICAgICBkZWZhdWx0ICovCisJeyJzdGFydCIgICAgICAgICwgdWRoY3Bfc3RyMm5pcCAgICwgJnNlcnZlcl9jb25maWcuc3RhcnRfaXAgICAgICwgIjE5Mi4xNjguMC4yMCJ9LAorCXsiZW5kIiAgICAgICAgICAsIHVkaGNwX3N0cjJuaXAgICAsICZzZXJ2ZXJfY29uZmlnLmVuZF9pcCAgICAgICAsICIxOTIuMTY4LjAuMjU0In0sCisJeyJpbnRlcmZhY2UiICAgICwgcmVhZF9zdHIgICAgICAgICwgJnNlcnZlcl9jb25maWcuaW50ZXJmYWNlICAgICwgImV0aDAifSwKKwkvKiBBdm9pZCAibWF4X2xlYXNlcyB2YWx1ZSBub3Qgc2FuZSIgd2FybmluZyBieSBzZXR0aW5nIGRlZmF1bHQKKwkgKiB0byBkZWZhdWx0X2VuZF9pcCAtIGRlZmF1bHRfc3RhcnRfaXAgKyAxOiAqLworCXsibWF4X2xlYXNlcyIgICAsIHJlYWRfdTMyICAgICAgICAsICZzZXJ2ZXJfY29uZmlnLm1heF9sZWFzZXMgICAsICIyMzUifSwKKwl7ImF1dG9fdGltZSIgICAgLCByZWFkX3UzMiAgICAgICAgLCAmc2VydmVyX2NvbmZpZy5hdXRvX3RpbWUgICAgLCAiNzIwMCJ9LAorCXsiZGVjbGluZV90aW1lIiAsIHJlYWRfdTMyICAgICAgICAsICZzZXJ2ZXJfY29uZmlnLmRlY2xpbmVfdGltZSAsICIzNjAwIn0sCisJeyJjb25mbGljdF90aW1lIiwgcmVhZF91MzIgICAgICAgICwgJnNlcnZlcl9jb25maWcuY29uZmxpY3RfdGltZSwgIjM2MDAifSwKKwl7Im9mZmVyX3RpbWUiICAgLCByZWFkX3UzMiAgICAgICAgLCAmc2VydmVyX2NvbmZpZy5vZmZlcl90aW1lICAgLCAiNjAifSwKKwl7Im1pbl9sZWFzZSIgICAgLCByZWFkX3UzMiAgICAgICAgLCAmc2VydmVyX2NvbmZpZy5taW5fbGVhc2Vfc2VjLCAiNjAifSwKKwl7ImxlYXNlX2ZpbGUiICAgLCByZWFkX3N0ciAgICAgICAgLCAmc2VydmVyX2NvbmZpZy5sZWFzZV9maWxlICAgLCBMRUFTRVNfRklMRX0sCisJeyJwaWRmaWxlIiAgICAgICwgcmVhZF9zdHIgICAgICAgICwgJnNlcnZlcl9jb25maWcucGlkZmlsZSAgICAgICwgIi92YXIvcnVuL3VkaGNwZC5waWQifSwKKwl7InNpYWRkciIgICAgICAgLCB1ZGhjcF9zdHIybmlwICAgLCAmc2VydmVyX2NvbmZpZy5zaWFkZHJfbmlwICAgLCAiMC4wLjAuMCJ9LAorCS8qIGtleXdvcmRzIHdpdGggbm8gZGVmYXVsdHMgbXVzdCBiZSBsYXN0ISAqLworCXsib3B0aW9uIiAgICAgICAsIHVkaGNwX3N0cjJvcHRzZXQsICZzZXJ2ZXJfY29uZmlnLm9wdGlvbnMgICAgICAsICIifSwKKwl7Im9wdCIgICAgICAgICAgLCB1ZGhjcF9zdHIyb3B0c2V0LCAmc2VydmVyX2NvbmZpZy5vcHRpb25zICAgICAgLCAiIn0sCisJeyJub3RpZnlfZmlsZSIgICwgcmVhZF9zdHIgICAgICAgICwgJnNlcnZlcl9jb25maWcubm90aWZ5X2ZpbGUgICwgTlVMTH0sCisJeyJzbmFtZSIgICAgICAgICwgcmVhZF9zdHIgICAgICAgICwgJnNlcnZlcl9jb25maWcuc25hbWUgICAgICAgICwgTlVMTH0sCisJeyJib290X2ZpbGUiICAgICwgcmVhZF9zdHIgICAgICAgICwgJnNlcnZlcl9jb25maWcuYm9vdF9maWxlICAgICwgTlVMTH0sCisJeyJzdGF0aWNfbGVhc2UiICwgcmVhZF9zdGF0aWNsZWFzZSwgJnNlcnZlcl9jb25maWcuc3RhdGljX2xlYXNlcywgIiJ9LAorfTsKK2VudW0geyBLV1NfV0lUSF9ERUZBVUxUUyA9IEFSUkFZX1NJWkUoa2V5d29yZHMpIC0gNiB9OworCit2b2lkIEZBU1RfRlVOQyByZWFkX2NvbmZpZyhjb25zdCBjaGFyICpmaWxlKQoreworCXBhcnNlcl90ICpwYXJzZXI7CisJY29uc3Qgc3RydWN0IGNvbmZpZ19rZXl3b3JkICprOworCXVuc2lnbmVkIGk7CisJY2hhciAqdG9rZW5bMl07CisKKwlmb3IgKGkgPSAwOyBpIDwgS1dTX1dJVEhfREVGQVVMVFM7IGkrKykKKwkJa2V5d29yZHNbaV0uaGFuZGxlcihrZXl3b3Jkc1tpXS5kZWYsIGtleXdvcmRzW2ldLnZhcik7CisKKwlwYXJzZXIgPSBjb25maWdfb3BlbihmaWxlKTsKKwl3aGlsZSAoY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbiwgMiwgMiwgIiMgXHQiLCBQQVJTRV9OT1JNQUwpKSB7CisJCWZvciAoayA9IGtleXdvcmRzLCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoa2V5d29yZHMpOyBrKyssIGkrKykgeworCQkJaWYgKHN0cmNhc2VjbXAodG9rZW5bMF0sIGstPmtleXdvcmQpID09IDApIHsKKwkJCQlpZiAoIWstPmhhbmRsZXIodG9rZW5bMV0sIGstPnZhcikpIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJjYW4ndCBwYXJzZSBsaW5lICV1IGluICVzIiwKKwkJCQkJCQlwYXJzZXItPmxpbmVubywgZmlsZSk7CisJCQkJCS8qIHJlc2V0IGJhY2sgdG8gdGhlIGRlZmF1bHQgdmFsdWUgKi8KKwkJCQkJay0+aGFuZGxlcihrLT5kZWYsIGstPnZhcik7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWNvbmZpZ19jbG9zZShwYXJzZXIpOworCisJc2VydmVyX2NvbmZpZy5zdGFydF9pcCA9IG50b2hsKHNlcnZlcl9jb25maWcuc3RhcnRfaXApOworCXNlcnZlcl9jb25maWcuZW5kX2lwID0gbnRvaGwoc2VydmVyX2NvbmZpZy5lbmRfaXApOworfQorCit2b2lkIEZBU1RfRlVOQyB3cml0ZV9sZWFzZXModm9pZCkKK3sKKwlpbnQgZmQ7CisJdW5zaWduZWQgaTsKKwlsZWFzZXRpbWVfdCBjdXJyOworCWludDY0X3Qgd3JpdHRlbl9hdDsKKworCWZkID0gb3Blbl9vcl93YXJuKHNlcnZlcl9jb25maWcubGVhc2VfZmlsZSwgT19XUk9OTFl8T19DUkVBVHxPX1RSVU5DKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm47CisKKwljdXJyID0gd3JpdHRlbl9hdCA9IHRpbWUoTlVMTCk7CisKKwl3cml0dGVuX2F0ID0gU1dBUF9CRTY0KHdyaXR0ZW5fYXQpOworCWZ1bGxfd3JpdGUoZmQsICZ3cml0dGVuX2F0LCBzaXplb2Yod3JpdHRlbl9hdCkpOworCisJZm9yIChpID0gMDsgaSA8IHNlcnZlcl9jb25maWcubWF4X2xlYXNlczsgaSsrKSB7CisJCWxlYXNldGltZV90IHRtcF90aW1lOworCisJCWlmIChnX2xlYXNlc1tpXS5sZWFzZV9uaXAgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCS8qIFNjcmV3IHdpdGggdGhlIHRpbWUgaW4gdGhlIHN0cnVjdCwgZm9yIGVhc2llciB3cml0aW5nICovCisJCXRtcF90aW1lID0gZ19sZWFzZXNbaV0uZXhwaXJlczsKKworCQlnX2xlYXNlc1tpXS5leHBpcmVzIC09IGN1cnI7CisJCWlmICgoc2lnbmVkX2xlYXNldGltZV90KSBnX2xlYXNlc1tpXS5leHBpcmVzIDwgMCkKKwkJCWdfbGVhc2VzW2ldLmV4cGlyZXMgPSAwOworCQlnX2xlYXNlc1tpXS5leHBpcmVzID0gaHRvbmwoZ19sZWFzZXNbaV0uZXhwaXJlcyk7CisKKwkJLyogTm8gZXJyb3IgY2hlY2suIElmIHRoZSBmaWxlIGdldHMgdHJ1bmNhdGVkLAorCQkgKiB3ZSBsb3NlIHNvbWUgbGVhc2VzIG9uIHJlc3RhcnQuIE9oIHdlbGwuICovCisJCWZ1bGxfd3JpdGUoZmQsICZnX2xlYXNlc1tpXSwgc2l6ZW9mKGdfbGVhc2VzW2ldKSk7CisKKwkJLyogVGhlbiByZXN0b3JlIGl0IHdoZW4gZG9uZSAqLworCQlnX2xlYXNlc1tpXS5leHBpcmVzID0gdG1wX3RpbWU7CisJfQorCWNsb3NlKGZkKTsKKworCWlmIChzZXJ2ZXJfY29uZmlnLm5vdGlmeV9maWxlKSB7CisJCWNoYXIgKmFyZ3ZbM107CisJCWFyZ3ZbMF0gPSBzZXJ2ZXJfY29uZmlnLm5vdGlmeV9maWxlOworCQlhcmd2WzFdID0gc2VydmVyX2NvbmZpZy5sZWFzZV9maWxlOworCQlhcmd2WzJdID0gTlVMTDsKKwkJc3Bhd25fYW5kX3dhaXQoYXJndik7CisJfQorfQorCit2b2lkIEZBU1RfRlVOQyByZWFkX2xlYXNlcyhjb25zdCBjaGFyICpmaWxlKQoreworCXN0cnVjdCBkeW5fbGVhc2UgbGVhc2U7CisJaW50NjRfdCB3cml0dGVuX2F0LCB0aW1lX3Bhc3NlZDsKKwlpbnQgZmQ7CisjaWYgZGVmaW5lZCBDT05GSUdfVURIQ1BfREVCVUcgJiYgQ09ORklHX1VESENQX0RFQlVHID49IDEKKwl1bnNpZ25lZCBpID0gMDsKKyNlbmRpZgorCisJZmQgPSBvcGVuX29yX3dhcm4oZmlsZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApCisJCXJldHVybjsKKworCWlmIChmdWxsX3JlYWQoZmQsICZ3cml0dGVuX2F0LCBzaXplb2Yod3JpdHRlbl9hdCkpICE9IHNpemVvZih3cml0dGVuX2F0KSkKKwkJZ290byByZXQ7CisJd3JpdHRlbl9hdCA9IFNXQVBfQkU2NCh3cml0dGVuX2F0KTsKKworCXRpbWVfcGFzc2VkID0gdGltZShOVUxMKSAtIHdyaXR0ZW5fYXQ7CisJLyogU3RyYW5nZSB3cml0dGVuX2F0LCBvciBsZWFzZSBmaWxlIGZyb20gb2xkIHZlcnNpb24gb2YgdWRoY3BkCisJICogd2hpY2ggaGFkIG5vICJ3cml0dGVuX2F0IiBmaWVsZD8gKi8KKwlpZiAoKHVpbnQ2NF90KXRpbWVfcGFzc2VkID4gMTIgKiA2MCAqIDYwKQorCQlnb3RvIHJldDsKKworCXdoaWxlIChmdWxsX3JlYWQoZmQsICZsZWFzZSwgc2l6ZW9mKGxlYXNlKSkgPT0gc2l6ZW9mKGxlYXNlKSkgeworCQl1aW50MzJfdCB5ID0gbnRvaGwobGVhc2UubGVhc2VfbmlwKTsKKwkJaWYgKHkgPj0gc2VydmVyX2NvbmZpZy5zdGFydF9pcCAmJiB5IDw9IHNlcnZlcl9jb25maWcuZW5kX2lwKSB7CisJCQlzaWduZWRfbGVhc2V0aW1lX3QgZXhwaXJlcyA9IG50b2hsKGxlYXNlLmV4cGlyZXMpIC0gKHNpZ25lZF9sZWFzZXRpbWVfdCl0aW1lX3Bhc3NlZDsKKwkJCXVpbnQzMl90IHN0YXRpY19uaXA7CisKKwkJCWlmIChleHBpcmVzIDw9IDApCisJCQkJY29udGludWU7CisKKwkJCS8qIENoZWNrIGlmIHRoZXJlIGlzIGEgZGlmZmVyZW50IHN0YXRpYyBsZWFzZSBmb3IgdGhpcyBJUCBvciBNQUMgKi8KKwkJCXN0YXRpY19uaXAgPSBnZXRfc3RhdGljX25pcF9ieV9tYWMoc2VydmVyX2NvbmZpZy5zdGF0aWNfbGVhc2VzLCBsZWFzZS5sZWFzZV9tYWMpOworCQkJaWYgKHN0YXRpY19uaXApIHsKKwkJCQkvKiBOQjogd2UgZG8gbm90IGFkZCBsZWFzZSBldmVuIGlmIHN0YXRpY19uaXAgPT0gbGVhc2UubGVhc2VfbmlwLgorCQkJCSAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGlzX25pcF9yZXNlcnZlZChzZXJ2ZXJfY29uZmlnLnN0YXRpY19sZWFzZXMsIGxlYXNlLmxlYXNlX25pcCkpCisJCQkJY29udGludWU7CisKKwkJCS8qIE5COiBhZGRfbGVhc2UgdGFrZXMgInJlbGF0aXZlIHRpbWUiLCBJT1csCisJCQkgKiBsZWFzZSBkdXJhdGlvbiwgbm90IGxlYXNlIGRlYWRsaW5lLiAqLworCQkJaWYgKGFkZF9sZWFzZShsZWFzZS5sZWFzZV9tYWMsIGxlYXNlLmxlYXNlX25pcCwKKwkJCQkJZXhwaXJlcywKKwkJCQkJbGVhc2UuaG9zdG5hbWUsIHNpemVvZihsZWFzZS5ob3N0bmFtZSkKKwkJCQkpID09IDAKKwkJCSkgeworCQkJCWJiX2Vycm9yX21zZygidG9vIG1hbnkgbGVhc2VzIHdoaWxlIGxvYWRpbmcgJXMiLCBmaWxlKTsKKwkJCQlicmVhazsKKwkJCX0KKyNpZiBkZWZpbmVkIENPTkZJR19VREhDUF9ERUJVRyAmJiBDT05GSUdfVURIQ1BfREVCVUcgPj0gMQorCQkJaSsrOworI2VuZGlmCisJCX0KKwl9CisJbG9nMSgiUmVhZCAlZCBsZWFzZXMiLCBpKTsKKyByZXQ6CisJY2xvc2UoZmQpOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy91ZGhjcC9sZWFzZXMuYyBiL25ldHdvcmtpbmcvdWRoY3AvbGVhc2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ1MzQwYQotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvdWRoY3AvbGVhc2VzLmMKQEAgLTAsMCArMSwyMDQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFJ1c3MgRGlsbCA8UnVzcy5EaWxsQGFzdS5lZHU+IEp1bHkgMjAwMQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJjb21tb24uaCIKKyNpbmNsdWRlICJkaGNwZC5oIgorCisvKiBGaW5kIHRoZSBvbGRlc3QgZXhwaXJlZCBsZWFzZSwgTlVMTCBpZiB0aGVyZSBhcmUgbm8gZXhwaXJlZCBsZWFzZXMgKi8KK3N0YXRpYyBzdHJ1Y3QgZHluX2xlYXNlICpvbGRlc3RfZXhwaXJlZF9sZWFzZSh2b2lkKQoreworCXN0cnVjdCBkeW5fbGVhc2UgKm9sZGVzdF9sZWFzZSA9IE5VTEw7CisJbGVhc2V0aW1lX3Qgb2xkZXN0X3RpbWUgPSB0aW1lKE5VTEwpOworCXVuc2lnbmVkIGk7CisKKwkvKiBVbmV4cGlyZWQgbGVhc2VzIGhhdmUgZ19sZWFzZXNbaV0uZXhwaXJlcyA+PSBjdXJyZW50IHRpbWUKKwkgKiBhbmQgdGhlcmVmb3JlIGNhbid0IGV2ZXIgbWF0Y2ggKi8KKwlmb3IgKGkgPSAwOyBpIDwgc2VydmVyX2NvbmZpZy5tYXhfbGVhc2VzOyBpKyspIHsKKwkJaWYgKGdfbGVhc2VzW2ldLmV4cGlyZXMgPCBvbGRlc3RfdGltZSkgeworCQkJb2xkZXN0X3RpbWUgPSBnX2xlYXNlc1tpXS5leHBpcmVzOworCQkJb2xkZXN0X2xlYXNlID0gJmdfbGVhc2VzW2ldOworCQl9CisJfQorCXJldHVybiBvbGRlc3RfbGVhc2U7Cit9CisKKy8qIENsZWFyIG91dCBhbGwgbGVhc2VzIHdpdGggbWF0Y2hpbmcgbm9uemVybyBjaGFkZHIgT1IgeWlhZGRyLgorICogSWYgY2hhZGRyID09IE5VTEwsIHRoaXMgaXMgYSBjb25mbGljdCBsZWFzZS4KKyAqLworc3RhdGljIHZvaWQgY2xlYXJfbGVhc2VzKGNvbnN0IHVpbnQ4X3QgKmNoYWRkciwgdWludDMyX3QgeWlhZGRyKQoreworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2VydmVyX2NvbmZpZy5tYXhfbGVhc2VzOyBpKyspIHsKKwkJaWYgKChjaGFkZHIgJiYgbWVtY21wKGdfbGVhc2VzW2ldLmxlYXNlX21hYywgY2hhZGRyLCA2KSA9PSAwKQorCQkgfHwgKHlpYWRkciAmJiBnX2xlYXNlc1tpXS5sZWFzZV9uaXAgPT0geWlhZGRyKQorCQkpIHsKKwkJCW1lbXNldCgmZ19sZWFzZXNbaV0sIDAsIHNpemVvZihnX2xlYXNlc1tpXSkpOworCQl9CisJfQorfQorCisvKiBBZGQgYSBsZWFzZSBpbnRvIHRoZSB0YWJsZSwgY2xlYXJpbmcgb3V0IGFueSBvbGQgb25lcy4KKyAqIElmIGNoYWRkciA9PSBOVUxMLCB0aGlzIGlzIGEgY29uZmxpY3QgbGVhc2UuCisgKi8KK3N0cnVjdCBkeW5fbGVhc2UqIEZBU1RfRlVOQyBhZGRfbGVhc2UoCisJCWNvbnN0IHVpbnQ4X3QgKmNoYWRkciwgdWludDMyX3QgeWlhZGRyLAorCQlsZWFzZXRpbWVfdCBsZWFzZXRpbWUsCisJCWNvbnN0IGNoYXIgKmhvc3RuYW1lLCBpbnQgaG9zdG5hbWVfbGVuKQoreworCXN0cnVjdCBkeW5fbGVhc2UgKm9sZGVzdDsKKworCS8qIGNsZWFuIG91dCBhbnkgb2xkIG9uZXMgKi8KKwljbGVhcl9sZWFzZXMoY2hhZGRyLCB5aWFkZHIpOworCisJb2xkZXN0ID0gb2xkZXN0X2V4cGlyZWRfbGVhc2UoKTsKKworCWlmIChvbGRlc3QpIHsKKwkJbWVtc2V0KG9sZGVzdCwgMCwgc2l6ZW9mKCpvbGRlc3QpKTsKKwkJaWYgKGhvc3RuYW1lKSB7CisJCQljaGFyICpwOworCisJCQlob3N0bmFtZV9sZW4rKzsgLyogaW5jbHVkZSBOVUwgKi8KKwkJCWlmIChob3N0bmFtZV9sZW4gPiBzaXplb2Yob2xkZXN0LT5ob3N0bmFtZSkpCisJCQkJaG9zdG5hbWVfbGVuID0gc2l6ZW9mKG9sZGVzdC0+aG9zdG5hbWUpOworCQkJcCA9IHNhZmVfc3RybmNweShvbGRlc3QtPmhvc3RuYW1lLCBob3N0bmFtZSwgaG9zdG5hbWVfbGVuKTsKKwkJCS8qIHNhbml0aXphdGlvbiAocy9ub24tQVNDSUkvXi9nKSAqLworCQkJd2hpbGUgKCpwKSB7CisJCQkJaWYgKCpwIDwgJyAnIHx8ICpwID4gMTI2KQorCQkJCQkqcCA9ICdeJzsKKwkJCQlwKys7CisJCQl9CisJCX0KKwkJaWYgKGNoYWRkcikKKwkJCW1lbWNweShvbGRlc3QtPmxlYXNlX21hYywgY2hhZGRyLCA2KTsKKwkJb2xkZXN0LT5sZWFzZV9uaXAgPSB5aWFkZHI7CisJCW9sZGVzdC0+ZXhwaXJlcyA9IHRpbWUoTlVMTCkgKyBsZWFzZXRpbWU7CisJfQorCisJcmV0dXJuIG9sZGVzdDsKK30KKworLyogVHJ1ZSBpZiBhIGxlYXNlIGhhcyBleHBpcmVkICovCitpbnQgRkFTVF9GVU5DIGlzX2V4cGlyZWRfbGVhc2Uoc3RydWN0IGR5bl9sZWFzZSAqbGVhc2UpCit7CisJcmV0dXJuIChsZWFzZS0+ZXhwaXJlcyA8IChsZWFzZXRpbWVfdCkgdGltZShOVUxMKSk7Cit9CisKKy8qIEZpbmQgdGhlIGZpcnN0IGxlYXNlIHRoYXQgbWF0Y2hlcyBNQUMsIE5VTEwgaWYgbm8gbWF0Y2ggKi8KK3N0cnVjdCBkeW5fbGVhc2UqIEZBU1RfRlVOQyBmaW5kX2xlYXNlX2J5X21hYyhjb25zdCB1aW50OF90ICptYWMpCit7CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBzZXJ2ZXJfY29uZmlnLm1heF9sZWFzZXM7IGkrKykKKwkJaWYgKG1lbWNtcChnX2xlYXNlc1tpXS5sZWFzZV9tYWMsIG1hYywgNikgPT0gMCkKKwkJCXJldHVybiAmZ19sZWFzZXNbaV07CisKKwlyZXR1cm4gTlVMTDsKK30KKworLyogRmluZCB0aGUgZmlyc3QgbGVhc2UgdGhhdCBtYXRjaGVzIElQLCBOVUxMIGlzIG5vIG1hdGNoICovCitzdHJ1Y3QgZHluX2xlYXNlKiBGQVNUX0ZVTkMgZmluZF9sZWFzZV9ieV9uaXAodWludDMyX3QgbmlwKQoreworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2VydmVyX2NvbmZpZy5tYXhfbGVhc2VzOyBpKyspCisJCWlmIChnX2xlYXNlc1tpXS5sZWFzZV9uaXAgPT0gbmlwKQorCQkJcmV0dXJuICZnX2xlYXNlc1tpXTsKKworCXJldHVybiBOVUxMOworfQorCisvKiBDaGVjayBpZiB0aGUgSVAgaXMgdGFrZW47IGlmIGl0IGlzLCBhZGQgaXQgdG8gdGhlIGxlYXNlIHRhYmxlICovCitzdGF0aWMgaW50IG5vYm9keV9yZXNwb25kc190b19hcnAodWludDMyX3QgbmlwLCBjb25zdCB1aW50OF90ICpzYWZlX21hYywgdW5zaWduZWQgYXJwcGluZ19tcykKK3sKKwlzdHJ1Y3QgaW5fYWRkciB0ZW1wOworCWludCByOworCisJciA9IGFycHBpbmcobmlwLCBzYWZlX21hYywKKwkJCXNlcnZlcl9jb25maWcuc2VydmVyX25pcCwKKwkJCXNlcnZlcl9jb25maWcuc2VydmVyX21hYywKKwkJCXNlcnZlcl9jb25maWcuaW50ZXJmYWNlLAorCQkJYXJwcGluZ19tcyk7CisJaWYgKHIpCisJCXJldHVybiByOworCisJdGVtcC5zX2FkZHIgPSBuaXA7CisJYmJfaW5mb19tc2coIiVzIGJlbG9uZ3MgdG8gc29tZW9uZSwgcmVzZXJ2aW5nIGl0IGZvciAldSBzZWNvbmRzIiwKKwkJaW5ldF9udG9hKHRlbXApLCAodW5zaWduZWQpc2VydmVyX2NvbmZpZy5jb25mbGljdF90aW1lKTsKKwlhZGRfbGVhc2UoTlVMTCwgbmlwLCBzZXJ2ZXJfY29uZmlnLmNvbmZsaWN0X3RpbWUsIE5VTEwsIDApOworCXJldHVybiAwOworfQorCisvKiBGaW5kIGEgbmV3IHVzYWJsZSAod2UgdGhpbmspIGFkZHJlc3MgKi8KK3VpbnQzMl90IEZBU1RfRlVOQyBmaW5kX2ZyZWVfb3JfZXhwaXJlZF9uaXAoY29uc3QgdWludDhfdCAqc2FmZV9tYWMsIHVuc2lnbmVkIGFycHBpbmdfbXMpCit7CisJdWludDMyX3QgYWRkcjsKKwlzdHJ1Y3QgZHluX2xlYXNlICpvbGRlc3RfbGVhc2UgPSBOVUxMOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVURIQ1BEX0JBU0VfSVBfT05fTUFDCisJdWludDMyX3Qgc3RvcDsKKwl1bnNpZ25lZCBpLCBoYXNoOworCisJLyogaGFzaCBod2FkZHI6IHVzZSB0aGUgU0RCTSBoYXNoaW5nIGFsZ29yaXRobS4gIFNlZW1zIHRvIGdpdmUgZ29vZAorCSAqIGRpc3BlcnNhbCBldmVuIHdpdGggc2ltaWxhcmx5LXZhbHVlZCAic3RyaW5ncyIuCisJICovCisJaGFzaCA9IDA7CisJZm9yIChpID0gMDsgaSA8IDY7IGkrKykKKwkJaGFzaCArPSBzYWZlX21hY1tpXSArIChoYXNoIDw8IDYpICsgKGhhc2ggPDwgMTYpIC0gaGFzaDsKKworCS8qIHBpY2sgYSBzZWVkIGJhc2VkIG9uIGh3YWRkciB0aGVuIGl0ZXJhdGUgdW50aWwgd2UgZmluZCBhIGZyZWUgYWRkcmVzcy4gKi8KKwlhZGRyID0gc2VydmVyX2NvbmZpZy5zdGFydF9pcAorCQkrIChoYXNoICUgKDEgKyBzZXJ2ZXJfY29uZmlnLmVuZF9pcCAtIHNlcnZlcl9jb25maWcuc3RhcnRfaXApKTsKKwlzdG9wID0gYWRkcjsKKyNlbHNlCisJYWRkciA9IHNlcnZlcl9jb25maWcuc3RhcnRfaXA7CisjZGVmaW5lIHN0b3AgKHNlcnZlcl9jb25maWcuZW5kX2lwICsgMSkKKyNlbmRpZgorCWRvIHsKKwkJdWludDMyX3QgbmlwOworCQlzdHJ1Y3QgZHluX2xlYXNlICpsZWFzZTsKKworCQkvKiBpZSwgMTkyLjE2OC41NS4wICovCisJCWlmICgoYWRkciAmIDB4ZmYpID09IDApCisJCQlnb3RvIG5leHRfYWRkcjsKKwkJLyogaWUsIDE5Mi4xNjguNTUuMjU1ICovCisJCWlmICgoYWRkciAmIDB4ZmYpID09IDB4ZmYpCisJCQlnb3RvIG5leHRfYWRkcjsKKwkJbmlwID0gaHRvbmwoYWRkcik7CisJCS8qIHNraXAgb3VyIG93biBhZGRyZXNzICovCisJCWlmIChuaXAgPT0gc2VydmVyX2NvbmZpZy5zZXJ2ZXJfbmlwKQorCQkJZ290byBuZXh0X2FkZHI7CisJCS8qIGlzIHRoaXMgYSBzdGF0aWMgbGVhc2UgYWRkcj8gKi8KKwkJaWYgKGlzX25pcF9yZXNlcnZlZChzZXJ2ZXJfY29uZmlnLnN0YXRpY19sZWFzZXMsIG5pcCkpCisJCQlnb3RvIG5leHRfYWRkcjsKKworCQlsZWFzZSA9IGZpbmRfbGVhc2VfYnlfbmlwKG5pcCk7CisJCWlmICghbGVhc2UpIHsKKy8vVE9ETzogREhDUCBzZXJ2ZXJzIGRvIG5vdCBhbHdheXMgc2l0IG9uIHRoZSBzYW1lIHN1Ym5ldCBhcyBjbGllbnRzOiBzaG91bGQgKnBpbmcqLCBub3QgYXJwLXBpbmchCisJCQlpZiAobm9ib2R5X3Jlc3BvbmRzX3RvX2FycChuaXAsIHNhZmVfbWFjLCBhcnBwaW5nX21zKSkKKwkJCQlyZXR1cm4gbmlwOworCQl9IGVsc2UgeworCQkJaWYgKCFvbGRlc3RfbGVhc2UgfHwgbGVhc2UtPmV4cGlyZXMgPCBvbGRlc3RfbGVhc2UtPmV4cGlyZXMpCisJCQkJb2xkZXN0X2xlYXNlID0gbGVhc2U7CisJCX0KKworIG5leHRfYWRkcjoKKwkJYWRkcisrOworI2lmIEVOQUJMRV9GRUFUVVJFX1VESENQRF9CQVNFX0lQX09OX01BQworCQlpZiAoYWRkciA+IHNlcnZlcl9jb25maWcuZW5kX2lwKQorCQkJYWRkciA9IHNlcnZlcl9jb25maWcuc3RhcnRfaXA7CisjZW5kaWYKKwl9IHdoaWxlIChhZGRyICE9IHN0b3ApOworCisJaWYgKG9sZGVzdF9sZWFzZQorCSAmJiBpc19leHBpcmVkX2xlYXNlKG9sZGVzdF9sZWFzZSkKKwkgJiYgbm9ib2R5X3Jlc3BvbmRzX3RvX2FycChvbGRlc3RfbGVhc2UtPmxlYXNlX25pcCwgc2FmZV9tYWMsIGFycHBpbmdfbXMpCisJKSB7CisJCXJldHVybiBvbGRlc3RfbGVhc2UtPmxlYXNlX25pcDsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvdWRoY3AvcGFja2V0LmMgYi9uZXR3b3JraW5nL3VkaGNwL3BhY2tldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OGY1MjUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3VkaGNwL3BhY2tldC5jCkBAIC0wLDAgKzEsMjM2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBQYWNrZXQgb3BzCisgKgorICogUmV3cml0ZSBieSBSdXNzIERpbGwgPFJ1c3MuRGlsbEBhc3UuZWR1PiBKdWx5IDIwMDEKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisjaW5jbHVkZSAiY29tbW9uLmgiCisjaW5jbHVkZSAiZGhjcGQuaCIKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgorI2luY2x1ZGUgPG5ldHBhY2tldC9wYWNrZXQuaD4KKwordm9pZCBGQVNUX0ZVTkMgdWRoY3BfaW5pdF9oZWFkZXIoc3RydWN0IGRoY3BfcGFja2V0ICpwYWNrZXQsIGNoYXIgdHlwZSkKK3sKKwltZW1zZXQocGFja2V0LCAwLCBzaXplb2YoKnBhY2tldCkpOworCXBhY2tldC0+b3AgPSBCT09UUkVRVUVTVDsgLyogaWYgY2xpZW50IHRvIGEgc2VydmVyICovCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBESENQT0ZGRVI6CisJY2FzZSBESENQQUNLOgorCWNhc2UgREhDUE5BSzoKKwkJcGFja2V0LT5vcCA9IEJPT1RSRVBMWTsgLyogaWYgc2VydmVyIHRvIGNsaWVudCAqLworCX0KKwlwYWNrZXQtPmh0eXBlID0gMTsgLyogZXRoZXJuZXQgKi8KKwlwYWNrZXQtPmhsZW4gPSA2OworCXBhY2tldC0+Y29va2llID0gaHRvbmwoREhDUF9NQUdJQyk7CisJaWYgKERIQ1BfRU5EICE9IDApCisJCXBhY2tldC0+b3B0aW9uc1swXSA9IERIQ1BfRU5EOworCXVkaGNwX2FkZF9zaW1wbGVfb3B0aW9uKHBhY2tldCwgREhDUF9NRVNTQUdFX1RZUEUsIHR5cGUpOworfQorCisjaWYgZGVmaW5lZCBDT05GSUdfVURIQ1BfREVCVUcgJiYgQ09ORklHX1VESENQX0RFQlVHID49IDIKK3ZvaWQgRkFTVF9GVU5DIHVkaGNwX2R1bXBfcGFja2V0KHN0cnVjdCBkaGNwX3BhY2tldCAqcGFja2V0KQoreworCWNoYXIgYnVmW3NpemVvZihwYWNrZXQtPmNoYWRkcikqMiArIDFdOworCisJaWYgKGRoY3BfdmVyYm9zZSA8IDIpCisJCXJldHVybjsKKworCWJiX2luZm9fbXNnKAorCQkvLyIgb3AgJXgiCisJCS8vIiBodHlwZSAleCIKKwkJIiBobGVuICV4IgorCQkvLyIgaG9wcyAleCIKKwkJIiB4aWQgJXgiCisJCS8vIiBzZWNzICV4IgorCQkvLyIgZmxhZ3MgJXgiCisJCSIgY2lhZGRyICV4IgorCQkiIHlpYWRkciAleCIKKwkJIiBzaWFkZHIgJXgiCisJCSIgZ2lhZGRyICV4IgorCQkvLyIgY2hhZGRyICVzIgorCQkvLyIgc25hbWUgJXMiCisJCS8vIiBmaWxlICVzIgorCQkvLyIgY29va2llICV4IgorCQkvLyIgb3B0aW9ucyAlcyIKKwkJLy8sIHBhY2tldC0+b3AKKwkJLy8sIHBhY2tldC0+aHR5cGUKKwkJLCBwYWNrZXQtPmhsZW4KKwkJLy8sIHBhY2tldC0+aG9wcworCQksIHBhY2tldC0+eGlkCisJCS8vLCBwYWNrZXQtPnNlY3MKKwkJLy8sIHBhY2tldC0+ZmxhZ3MKKwkJLCBwYWNrZXQtPmNpYWRkcgorCQksIHBhY2tldC0+eWlhZGRyCisJCSwgcGFja2V0LT5zaWFkZHJfbmlwCisJCSwgcGFja2V0LT5nYXRld2F5X25pcAorCQkvLywgcGFja2V0LT5jaGFkZHJbMTZdCisJCS8vLCBwYWNrZXQtPnNuYW1lWzY0XQorCQkvLywgcGFja2V0LT5maWxlWzEyOF0KKwkJLy8sIHBhY2tldC0+Y29va2llCisJCS8vLCBwYWNrZXQtPm9wdGlvbnNbXQorCSk7CisJKmJpbjJoZXgoYnVmLCAodm9pZCAqKSBwYWNrZXQtPmNoYWRkciwgc2l6ZW9mKHBhY2tldC0+Y2hhZGRyKSkgPSAnXDAnOworCWJiX2luZm9fbXNnKCIgY2hhZGRyICVzIiwgYnVmKTsKK30KKyNlbmRpZgorCisvKiBSZWFkIGEgcGFja2V0IGZyb20gc29ja2V0IGZkLCByZXR1cm4gLTEgb24gcmVhZCBlcnJvciwgLTIgb24gcGFja2V0IGVycm9yICovCitpbnQgRkFTVF9GVU5DIHVkaGNwX3JlY3Zfa2VybmVsX3BhY2tldChzdHJ1Y3QgZGhjcF9wYWNrZXQgKnBhY2tldCwgaW50IGZkKQoreworCWludCBieXRlczsKKworCW1lbXNldChwYWNrZXQsIDAsIHNpemVvZigqcGFja2V0KSk7CisJYnl0ZXMgPSBzYWZlX3JlYWQoZmQsIHBhY2tldCwgc2l6ZW9mKCpwYWNrZXQpKTsKKwlpZiAoYnl0ZXMgPCAwKSB7CisJCWxvZzEoIlBhY2tldCByZWFkIGVycm9yLCBpZ25vcmluZyIpOworCQlyZXR1cm4gYnl0ZXM7IC8qIHJldHVybnMgLTEgKi8KKwl9CisKKwlpZiAoYnl0ZXMgPCBvZmZzZXRvZihzdHJ1Y3QgZGhjcF9wYWNrZXQsIG9wdGlvbnMpCisJIHx8IHBhY2tldC0+Y29va2llICE9IGh0b25sKERIQ1BfTUFHSUMpCisJKSB7CisJCWJiX2luZm9fbXNnKCJQYWNrZXQgd2l0aCBiYWQgbWFnaWMsIGlnbm9yaW5nIik7CisJCXJldHVybiAtMjsKKwl9CisJbG9nMSgiUmVjZWl2ZWQgYSBwYWNrZXQiKTsKKwl1ZGhjcF9kdW1wX3BhY2tldChwYWNrZXQpOworCisJcmV0dXJuIGJ5dGVzOworfQorCisvKiBDb25zdHJ1Y3QgYSBpcC91ZHAgaGVhZGVyIGZvciBhIHBhY2tldCwgc2VuZCBwYWNrZXQgKi8KK2ludCBGQVNUX0ZVTkMgdWRoY3Bfc2VuZF9yYXdfcGFja2V0KHN0cnVjdCBkaGNwX3BhY2tldCAqZGhjcF9wa3QsCisJCXVpbnQzMl90IHNvdXJjZV9uaXAsIGludCBzb3VyY2VfcG9ydCwKKwkJdWludDMyX3QgZGVzdF9uaXAsIGludCBkZXN0X3BvcnQsIGNvbnN0IHVpbnQ4X3QgKmRlc3RfYXJwLAorCQlpbnQgaWZpbmRleCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfbGwgZGVzdF9zbGw7CisJc3RydWN0IGlwX3VkcF9kaGNwX3BhY2tldCBwYWNrZXQ7CisJdW5zaWduZWQgcGFkZGluZzsKKwlpbnQgZmQ7CisJaW50IHJlc3VsdCA9IC0xOworCWNvbnN0IGNoYXIgKm1zZzsKKworCWZkID0gc29ja2V0KFBGX1BBQ0tFVCwgU09DS19ER1JBTSwgaHRvbnMoRVRIX1BfSVApKTsKKwlpZiAoZmQgPCAwKSB7CisJCW1zZyA9ICJzb2NrZXQoJXMpIjsKKwkJZ290byByZXRfbXNnOworCX0KKworCW1lbXNldCgmZGVzdF9zbGwsIDAsIHNpemVvZihkZXN0X3NsbCkpOworCW1lbXNldCgmcGFja2V0LCAwLCBvZmZzZXRvZihzdHJ1Y3QgaXBfdWRwX2RoY3BfcGFja2V0LCBkYXRhKSk7CisJcGFja2V0LmRhdGEgPSAqZGhjcF9wa3Q7IC8qIHN0cnVjdCBjb3B5ICovCisKKwlkZXN0X3NsbC5zbGxfZmFtaWx5ID0gQUZfUEFDS0VUOworCWRlc3Rfc2xsLnNsbF9wcm90b2NvbCA9IGh0b25zKEVUSF9QX0lQKTsKKwlkZXN0X3NsbC5zbGxfaWZpbmRleCA9IGlmaW5kZXg7CisJZGVzdF9zbGwuc2xsX2hhbGVuID0gNjsKKwltZW1jcHkoZGVzdF9zbGwuc2xsX2FkZHIsIGRlc3RfYXJwLCA2KTsKKworCWlmIChiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopJmRlc3Rfc2xsLCBzaXplb2YoZGVzdF9zbGwpKSA8IDApIHsKKwkJbXNnID0gImJpbmQoJXMpIjsKKwkJZ290byByZXRfY2xvc2U7CisJfQorCisJLyogV2Ugd2VyZSBzZW5kaW5nIGZ1bGwtc2l6ZWQgREhDUCBwYWNrZXRzICh6ZXJvIHBhZGRlZCksCisJICogYnV0IHNvbWUgYmFkbHkgY29uZmlndXJlZCBzZXJ2ZXJzIHdlcmUgc2VlbiBkcm9wcGluZyB0aGVtLgorCSAqIEFwcGFyZW50bHkgdGhleSBkcm9wIGFsbCBESENQIHBhY2tldHMgPjU3NiAqZXRoZXJuZXQqIG9jdGV0cyBiaWcsCisJICogd2hlcmVhcyB0aGV5IG1heSBvbmx5IGRyb3AgcGFja2V0cyA+NTc2ICpJUCogb2N0ZXRzIGJpZworCSAqICh3aGljaCBmb3IgdHlwaWNhbCBFdGhlcm5ldCBJSSBtZWFucyA1OTAgb2N0ZXRzOiA2KzYrMiArIDU3NikuCisJICoKKwkgKiBJbiBvcmRlciB0byB3b3JrIHdpdGggdGhvc2UgYnVnZ3kgc2VydmVycywKKwkgKiB3ZSB0cnVuY2F0ZSBwYWNrZXRzIGFmdGVyIGVuZCBvcHRpb24gYnl0ZS4KKwkgKgorCSAqIEhvd2V2ZXIsIFJGQyAxNTQyIHNheXMgIlRoZSBJUCBUb3RhbCBMZW5ndGggYW5kIFVEUCBMZW5ndGgKKwkgKiBtdXN0IGJlIGxhcmdlIGVub3VnaCB0byBjb250YWluIHRoZSBtaW5pbWFsIEJPT1RQIGhlYWRlciBvZiAzMDAgb2N0ZXRzIi4KKwkgKiBUaHVzLCB3ZSByZXRhaW4gZW5vdWdoIHBhZGRpbmcgdG8gbm90IGdvIGJlbG93IDMwMCBCT09UUCBieXRlcy4KKwkgKiBTb21lIGRldmljZXMgaGF2ZSBmaWx0ZXJzIHdoaWNoIGRyb3AgREhDUCBwYWNrZXRzIHNob3J0ZXIgdGhhbiB0aGF0LgorCSAqLworCXBhZGRpbmcgPSBESENQX09QVElPTlNfQlVGU0laRSAtIDEgLSB1ZGhjcF9lbmRfb3B0aW9uKHBhY2tldC5kYXRhLm9wdGlvbnMpOworCWlmIChwYWRkaW5nID4gREhDUF9TSVpFIC0gMzAwKQorCQlwYWRkaW5nID0gREhDUF9TSVpFIC0gMzAwOworCisJcGFja2V0LmlwLnByb3RvY29sID0gSVBQUk9UT19VRFA7CisJcGFja2V0LmlwLnNhZGRyID0gc291cmNlX25pcDsKKwlwYWNrZXQuaXAuZGFkZHIgPSBkZXN0X25pcDsKKwlwYWNrZXQudWRwLnNvdXJjZSA9IGh0b25zKHNvdXJjZV9wb3J0KTsKKwlwYWNrZXQudWRwLmRlc3QgPSBodG9ucyhkZXN0X3BvcnQpOworCS8qIHNpemUsIGV4Y2x1ZGluZyBJUCBoZWFkZXI6ICovCisJcGFja2V0LnVkcC5sZW4gPSBodG9ucyhVRFBfREhDUF9TSVpFIC0gcGFkZGluZyk7CisJLyogZm9yIFVEUCBjaGVja3N1bW1pbmcsIGlwLmxlbiBpcyBzZXQgdG8gVURQIHBhY2tldCBsZW4gKi8KKwlwYWNrZXQuaXAudG90X2xlbiA9IHBhY2tldC51ZHAubGVuOworCXBhY2tldC51ZHAuY2hlY2sgPSBpbmV0X2Nrc3VtKCh1aW50MTZfdCAqKSZwYWNrZXQsCisJCQlJUF9VRFBfREhDUF9TSVpFIC0gcGFkZGluZyk7CisJLyogYnV0IGZvciBzZW5kaW5nLCBpdCBpcyBzZXQgdG8gSVAgcGFja2V0IGxlbiAqLworCXBhY2tldC5pcC50b3RfbGVuID0gaHRvbnMoSVBfVURQX0RIQ1BfU0laRSAtIHBhZGRpbmcpOworCXBhY2tldC5pcC5paGwgPSBzaXplb2YocGFja2V0LmlwKSA+PiAyOworCXBhY2tldC5pcC52ZXJzaW9uID0gSVBWRVJTSU9OOworCXBhY2tldC5pcC50dGwgPSBJUERFRlRUTDsKKwlwYWNrZXQuaXAuY2hlY2sgPSBpbmV0X2Nrc3VtKCh1aW50MTZfdCAqKSZwYWNrZXQuaXAsIHNpemVvZihwYWNrZXQuaXApKTsKKworCXVkaGNwX2R1bXBfcGFja2V0KGRoY3BfcGt0KTsKKwlyZXN1bHQgPSBzZW5kdG8oZmQsICZwYWNrZXQsIElQX1VEUF9ESENQX1NJWkUgLSBwYWRkaW5nLCAvKmZsYWdzOiovIDAsCisJCQkoc3RydWN0IHNvY2thZGRyICopICZkZXN0X3NsbCwgc2l6ZW9mKGRlc3Rfc2xsKSk7CisJbXNnID0gInNlbmR0byI7CisgcmV0X2Nsb3NlOgorCWNsb3NlKGZkKTsKKwlpZiAocmVzdWx0IDwgMCkgeworIHJldF9tc2c6CisJCWJiX3BlcnJvcl9tc2cobXNnLCAiUEFDS0VUIik7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CisKKy8qIExldCB0aGUga2VybmVsIGRvIGFsbCB0aGUgd29yayBmb3IgcGFja2V0IGdlbmVyYXRpb24gKi8KK2ludCBGQVNUX0ZVTkMgdWRoY3Bfc2VuZF9rZXJuZWxfcGFja2V0KHN0cnVjdCBkaGNwX3BhY2tldCAqZGhjcF9wa3QsCisJCXVpbnQzMl90IHNvdXJjZV9uaXAsIGludCBzb3VyY2VfcG9ydCwKKwkJdWludDMyX3QgZGVzdF9uaXAsIGludCBkZXN0X3BvcnQpCit7CisJc3RydWN0IHNvY2thZGRyX2luIHNhOworCXVuc2lnbmVkIHBhZGRpbmc7CisJaW50IGZkOworCWludCByZXN1bHQgPSAtMTsKKwljb25zdCBjaGFyICptc2c7CisKKwlmZCA9IHNvY2tldChQRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7CisJaWYgKGZkIDwgMCkgeworCQltc2cgPSAic29ja2V0KCVzKSI7CisJCWdvdG8gcmV0X21zZzsKKwl9CisJc2V0c29ja29wdF9yZXVzZWFkZHIoZmQpOworCisJbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7CisJc2Euc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc2Euc2luX3BvcnQgPSBodG9ucyhzb3VyY2VfcG9ydCk7CisJc2Euc2luX2FkZHIuc19hZGRyID0gc291cmNlX25pcDsKKwlpZiAoYmluZChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzYSwgc2l6ZW9mKHNhKSkgPT0gLTEpIHsKKwkJbXNnID0gImJpbmQoJXMpIjsKKwkJZ290byByZXRfY2xvc2U7CisJfQorCisJbWVtc2V0KCZzYSwgMCwgc2l6ZW9mKHNhKSk7CisJc2Euc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc2Euc2luX3BvcnQgPSBodG9ucyhkZXN0X3BvcnQpOworCXNhLnNpbl9hZGRyLnNfYWRkciA9IGRlc3RfbmlwOworCWlmIChjb25uZWN0KGZkLCAoc3RydWN0IHNvY2thZGRyICopJnNhLCBzaXplb2Yoc2EpKSA9PSAtMSkgeworCQltc2cgPSAiY29ubmVjdCI7CisJCWdvdG8gcmV0X2Nsb3NlOworCX0KKworCXVkaGNwX2R1bXBfcGFja2V0KGRoY3BfcGt0KTsKKwlwYWRkaW5nID0gREhDUF9PUFRJT05TX0JVRlNJWkUgLSAxIC0gdWRoY3BfZW5kX29wdGlvbihkaGNwX3BrdC0+b3B0aW9ucyk7CisJaWYgKHBhZGRpbmcgPiBESENQX1NJWkUgLSAzMDApCisJCXBhZGRpbmcgPSBESENQX1NJWkUgLSAzMDA7CisJcmVzdWx0ID0gc2FmZV93cml0ZShmZCwgZGhjcF9wa3QsIERIQ1BfU0laRSAtIHBhZGRpbmcpOworCW1zZyA9ICJ3cml0ZSI7CisgcmV0X2Nsb3NlOgorCWNsb3NlKGZkKTsKKwlpZiAocmVzdWx0IDwgMCkgeworIHJldF9tc2c6CisJCWJiX3BlcnJvcl9tc2cobXNnLCAiVURQIik7CisJfQorCXJldHVybiByZXN1bHQ7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3VkaGNwL3NpZ25hbHBpcGUuYyBiL25ldHdvcmtpbmcvdWRoY3Avc2lnbmFscGlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNTVjNWUKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3VkaGNwL3NpZ25hbHBpcGUuYwpAQCAtMCwwICsxLDc3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBTaWduYWwgcGlwZSBpbmZyYXN0cnVjdHVyZS4gQSByZWxpYWJsZSB3YXkgb2YgZGVsaXZlcmluZyBzaWduYWxzLgorICoKKyAqIFJ1c3MgRGlsbCA8UnVzcy5EaWxsQGFzdS5lZHU+IERlY2VtYmVyIDIwMDMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgImNvbW1vbi5oIgorCisvKiBHbG9iYWwgdmFyaWFibGU6IHdlIGFjY2VzcyBpdCBmcm9tIHNpZ25hbCBoYW5kbGVyICovCitzdGF0aWMgc3RydWN0IGZkX3BhaXIgc2lnbmFsX3BpcGU7CisKK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWcpCit7CisJdW5zaWduZWQgY2hhciBjaCA9IHNpZzsgLyogdXNlIGNoYXIsIGF2b2lkIGRlYWxpbmcgd2l0aCBwYXJ0aWFsIHdyaXRlcyAqLworCWlmICh3cml0ZShzaWduYWxfcGlwZS53ciwgJmNoLCAxKSAhPSAxKQorCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBzZW5kIHNpZ25hbCIpOworfQorCisvKiBDYWxsIHRoaXMgYmVmb3JlIGRvaW5nIGFueXRoaW5nIGVsc2UuIFNldHMgdXAgdGhlIHNvY2tldCBwYWlyCisgKiBhbmQgaW5zdGFsbHMgdGhlIHNpZ25hbCBoYW5kbGVyICovCit2b2lkIEZBU1RfRlVOQyB1ZGhjcF9zcF9zZXR1cCh2b2lkKQoreworCS8qIHdhcyBzb2NrZXRwYWlyLCBidXQgaXQgbmVlZHMgQUZfVU5JWCBpbiBrZXJuZWwgKi8KKwl4cGlwZWRfcGFpcihzaWduYWxfcGlwZSk7CisJY2xvc2Vfb25fZXhlY19vbihzaWduYWxfcGlwZS5yZCk7CisJY2xvc2Vfb25fZXhlY19vbihzaWduYWxfcGlwZS53cik7CisJbmRlbGF5X29uKHNpZ25hbF9waXBlLndyKTsKKwliYl9zaWduYWxzKDAKKwkJKyAoMSA8PCBTSUdVU1IxKQorCQkrICgxIDw8IFNJR1VTUjIpCisJCSsgKDEgPDwgU0lHVEVSTSkKKwkJLCBzaWduYWxfaGFuZGxlcik7Cit9CisKKy8qIFF1aWNrIGxpdHRsZSBmdW5jdGlvbiB0byBzZXR1cCB0aGUgcmZkcy4gV2lsbCByZXR1cm4gdGhlCisgKiBtYXhfZmQgZm9yIHVzZSB3aXRoIHNlbGVjdC4gTGltaXRlZCBpbiB0aGF0IHlvdSBjYW4gb25seSBwYXNzCisgKiBvbmUgZXh0cmEgZmQgKi8KK2ludCBGQVNUX0ZVTkMgdWRoY3Bfc3BfZmRfc2V0KGZkX3NldCAqcmZkcywgaW50IGV4dHJhX2ZkKQoreworCUZEX1pFUk8ocmZkcyk7CisJRkRfU0VUKHNpZ25hbF9waXBlLnJkLCByZmRzKTsKKwlpZiAoZXh0cmFfZmQgPj0gMCkgeworCQljbG9zZV9vbl9leGVjX29uKGV4dHJhX2ZkKTsKKwkJRkRfU0VUKGV4dHJhX2ZkLCByZmRzKTsKKwl9CisJcmV0dXJuIHNpZ25hbF9waXBlLnJkID4gZXh0cmFfZmQgPyBzaWduYWxfcGlwZS5yZCA6IGV4dHJhX2ZkOworfQorCisvKiBSZWFkIGEgc2lnbmFsIGZyb20gdGhlIHNpZ25hbCBwaXBlLiBSZXR1cm5zIDAgaWYgdGhlcmUgaXMKKyAqIG5vIHNpZ25hbCwgLTEgb24gZXJyb3IgKGFuZCBzZXRzIGVycm5vIGFwcHJvcHJpYXRlbHkpLCBhbmQKKyAqIHlvdXIgc2lnbmFsIG9uIHN1Y2Nlc3MgKi8KK2ludCBGQVNUX0ZVTkMgdWRoY3Bfc3BfcmVhZChjb25zdCBmZF9zZXQgKnJmZHMpCit7CisJdW5zaWduZWQgY2hhciBzaWc7CisKKwlpZiAoIUZEX0lTU0VUKHNpZ25hbF9waXBlLnJkLCByZmRzKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2FmZV9yZWFkKHNpZ25hbF9waXBlLnJkLCAmc2lnLCAxKSAhPSAxKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gc2lnOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy91ZGhjcC9zb2NrZXQuYyBiL25ldHdvcmtpbmcvdWRoY3Avc29ja2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQyMTA2OQotLS0gL2Rldi9udWxsCisrKyBiL25ldHdvcmtpbmcvdWRoY3Avc29ja2V0LmMKQEAgLTAsMCArMSwxMTAgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIERIQ1Agc2VydmVyIGNsaWVudC9zZXJ2ZXIgc29ja2V0IGNyZWF0aW9uCisgKgorICogdWRoY3AgY2xpZW50L3NlcnZlcgorICogQ29weXJpZ2h0IChDKSAxOTk5IE1hdHRoZXcgUmFtc2F5IDxtYXR0aGV3ckBtb3JldG9uLmNvbS5hdT4KKyAqCQkJQ2hyaXMgVHJldyA8Y3RyZXdAbW9yZXRvbi5jb20uYXU+CisgKgorICogUmV3cml0ZSBieSBSdXNzIERpbGwgPFJ1c3MuRGlsbEBhc3UuZWR1PiBKdWx5IDIwMDEKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgPG5ldC9pZi5oPgorCitpbnQgRkFTVF9GVU5DIHVkaGNwX3JlYWRfaW50ZXJmYWNlKGNvbnN0IGNoYXIgKmludGVyZmFjZSwgaW50ICppZmluZGV4LCB1aW50MzJfdCAqbmlwLCB1aW50OF90ICptYWMpCit7CisJLyogY2hhciBidWZmZXIgaW5zdGVhZCBvZiBib25hLWZpZGUgc3RydWN0IGF2b2lkcyBhbGlhc2luZyB3YXJuaW5nICovCisJY2hhciBpZnJfYnVmW3NpemVvZihzdHJ1Y3QgaWZyZXEpXTsKKwlzdHJ1Y3QgaWZyZXEgKmNvbnN0IGlmciA9ICh2b2lkICopaWZyX2J1ZjsKKworCWludCBmZDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gKm91cl9pcDsKKworCW1lbXNldChpZnIsIDAsIHNpemVvZigqaWZyKSk7CisJZmQgPSB4c29ja2V0KEFGX0lORVQsIFNPQ0tfUkFXLCBJUFBST1RPX1JBVyk7CisKKwlpZnItPmlmcl9hZGRyLnNhX2ZhbWlseSA9IEFGX0lORVQ7CisJc3RybmNweV9JRk5BTVNJWihpZnItPmlmcl9uYW1lLCBpbnRlcmZhY2UpOworCWlmIChuaXApIHsKKwkJaWYgKGlvY3RsX29yX3BlcnJvcihmZCwgU0lPQ0dJRkFERFIsIGlmciwKKwkJCSJpcyBpbnRlcmZhY2UgJXMgdXAgYW5kIGNvbmZpZ3VyZWQ/IiwgaW50ZXJmYWNlKQorCQkpIHsKKwkJCWNsb3NlKGZkKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlvdXJfaXAgPSAoc3RydWN0IHNvY2thZGRyX2luICopICZpZnItPmlmcl9hZGRyOworCQkqbmlwID0gb3VyX2lwLT5zaW5fYWRkci5zX2FkZHI7CisJCWxvZzEoIklQICVzIiwgaW5ldF9udG9hKG91cl9pcC0+c2luX2FkZHIpKTsKKwl9CisKKwlpZiAoaWZpbmRleCkgeworCQlpZiAoaW9jdGxfb3Jfd2FybihmZCwgU0lPQ0dJRklOREVYLCBpZnIpICE9IDApIHsKKwkJCWNsb3NlKGZkKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlsb2cxKCJBZGFwdGVyIGluZGV4ICVkIiwgaWZyLT5pZnJfaWZpbmRleCk7CisJCSppZmluZGV4ID0gaWZyLT5pZnJfaWZpbmRleDsKKwl9CisKKwlpZiAobWFjKSB7CisJCWlmIChpb2N0bF9vcl93YXJuKGZkLCBTSU9DR0lGSFdBRERSLCBpZnIpICE9IDApIHsKKwkJCWNsb3NlKGZkKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQltZW1jcHkobWFjLCBpZnItPmlmcl9od2FkZHIuc2FfZGF0YSwgNik7CisJCWxvZzEoIk1BQyAlMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCIsCisJCQltYWNbMF0sIG1hY1sxXSwgbWFjWzJdLCBtYWNbM10sIG1hY1s0XSwgbWFjWzVdKTsKKwl9CisKKwljbG9zZShmZCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIDEuIE5vbmUgb2YgdGhlIGNhbGxlcnMgZXhwZWN0cyBpdCB0byBldmVyIGZhaWwgKi8KKy8qIDIuIGlwIHdhcyBhbHdheXMgSU5BRERSX0FOWSAqLworaW50IEZBU1RfRlVOQyB1ZGhjcF9saXN0ZW5fc29ja2V0KC8qdWludDMyX3QgaXAsKi8gaW50IHBvcnQsIGNvbnN0IGNoYXIgKmluZikKK3sKKwlpbnQgZmQ7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJY2hhciAqY29sb247CisKKwlsb2cxKCJPcGVuaW5nIGxpc3RlbiBzb2NrZXQgb24gKjolZCAlcyIsIHBvcnQsIGluZik7CisJZmQgPSB4c29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKKworCXNldHNvY2tvcHRfcmV1c2VhZGRyKGZkKTsKKwlpZiAoc2V0c29ja29wdF9icm9hZGNhc3QoZmQpID09IC0xKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIlNPX0JST0FEQ0FTVCIpOworCisJLyogU09fQklORFRPREVWSUNFIGRvZXNuJ3Qgd29yayBvbiBldGhlcm5ldCBhbGlhc2VzIChldGhOOk0pICovCisJY29sb24gPSBzdHJyY2hyKGluZiwgJzonKTsKKwlpZiAoY29sb24pCisJCSpjb2xvbiA9ICdcMCc7CisKKwlpZiAoc2V0c29ja29wdF9iaW5kdG9kZXZpY2UoZmQsIGluZikpCisJCXhmdW5jX2RpZSgpOyAvKiB3YXJuaW5nIGlzIGFscmVhZHkgcHJpbnRlZCAqLworCisJaWYgKGNvbG9uKQorCQkqY29sb24gPSAnOic7CisKKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJLyogYWRkci5zaW5fYWRkci5zX2FkZHIgPSBpcDsgLSBhbGwtemVyb3MgaXMgSU5BRERSX0FOWSAqLworCXhiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopJmFkZHIsIHNpemVvZihhZGRyKSk7CisKKwlyZXR1cm4gZmQ7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3VkaGNwL3N0YXRpY19sZWFzZXMuYyBiL25ldHdvcmtpbmcvdWRoY3Avc3RhdGljX2xlYXNlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YTI0YWIKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3VkaGNwL3N0YXRpY19sZWFzZXMuYwpAQCAtMCwwICsxLDc3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBTdG9yaW5nIGFuZCByZXRyaWV2aW5nIGRhdGEgZm9yIHN0YXRpYyBsZWFzZXMKKyAqCisgKiBXYWRlIEJlcnJpZXIgPHdiZXJyaWVyQG15cmVhbGJveC5jb20+IFNlcHRlbWJlciAyMDA0CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImNvbW1vbi5oIgorI2luY2x1ZGUgImRoY3BkLmgiCisKKy8qIFRha2VzIHRoZSBhZGRyZXNzIG9mIHRoZSBwb2ludGVyIHRvIHRoZSBzdGF0aWNfbGVhc2VzIGxpbmtlZCBsaXN0LAorICogYWRkcmVzcyB0byBhIDYgYnl0ZSBtYWMgYWRkcmVzcywKKyAqIDQgYnl0ZSBJUCBhZGRyZXNzICovCit2b2lkIEZBU1RfRlVOQyBhZGRfc3RhdGljX2xlYXNlKHN0cnVjdCBzdGF0aWNfbGVhc2UgKipzdF9sZWFzZV9wcCwKKwkJdWludDhfdCAqbWFjLAorCQl1aW50MzJfdCBuaXApCit7CisJc3RydWN0IHN0YXRpY19sZWFzZSAqc3RfbGVhc2U7CisKKwkvKiBGaW5kIHRoZSB0YWlsIG9mIHRoZSBsaXN0ICovCisJd2hpbGUgKChzdF9sZWFzZSA9ICpzdF9sZWFzZV9wcCkgIT0gTlVMTCkgeworCQlzdF9sZWFzZV9wcCA9ICZzdF9sZWFzZS0+bmV4dDsKKwl9CisKKwkvKiBBZGQgbmV3IG5vZGUgKi8KKwkqc3RfbGVhc2VfcHAgPSBzdF9sZWFzZSA9IHh6YWxsb2Moc2l6ZW9mKCpzdF9sZWFzZSkpOworCW1lbWNweShzdF9sZWFzZS0+bWFjLCBtYWMsIDYpOworCXN0X2xlYXNlLT5uaXAgPSBuaXA7CisJLypzdF9sZWFzZS0+bmV4dCA9IE5VTEw7Ki8KK30KKworLyogRmluZCBzdGF0aWMgbGVhc2UgSVAgYnkgbWFjICovCit1aW50MzJfdCBGQVNUX0ZVTkMgZ2V0X3N0YXRpY19uaXBfYnlfbWFjKHN0cnVjdCBzdGF0aWNfbGVhc2UgKnN0X2xlYXNlLCB2b2lkICptYWMpCit7CisJd2hpbGUgKHN0X2xlYXNlKSB7CisJCWlmIChtZW1jbXAoc3RfbGVhc2UtPm1hYywgbWFjLCA2KSA9PSAwKQorCQkJcmV0dXJuIHN0X2xlYXNlLT5uaXA7CisJCXN0X2xlYXNlID0gc3RfbGVhc2UtPm5leHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIENoZWNrIHRvIHNlZSBpZiBhbiBJUCBpcyByZXNlcnZlZCBhcyBhIHN0YXRpYyBJUCAqLworaW50IEZBU1RfRlVOQyBpc19uaXBfcmVzZXJ2ZWQoc3RydWN0IHN0YXRpY19sZWFzZSAqc3RfbGVhc2UsIHVpbnQzMl90IG5pcCkKK3sKKwl3aGlsZSAoc3RfbGVhc2UpIHsKKwkJaWYgKHN0X2xlYXNlLT5uaXAgPT0gbmlwKQorCQkJcmV0dXJuIDE7CisJCXN0X2xlYXNlID0gc3RfbGVhc2UtPm5leHQ7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKyNpZiBkZWZpbmVkIENPTkZJR19VREhDUF9ERUJVRyAmJiBDT05GSUdfVURIQ1BfREVCVUcgPj0gMgorLyogUHJpbnQgb3V0IHN0YXRpYyBsZWFzZXMganVzdCB0byBjaGVjayB3aGF0J3MgZ29pbmcgb24gKi8KKy8qIFRha2VzIHRoZSBhZGRyZXNzIG9mIHRoZSBwb2ludGVyIHRvIHRoZSBzdGF0aWNfbGVhc2VzIGxpbmtlZCBsaXN0ICovCit2b2lkIEZBU1RfRlVOQyBsb2dfc3RhdGljX2xlYXNlcyhzdHJ1Y3Qgc3RhdGljX2xlYXNlICoqc3RfbGVhc2VfcHApCit7CisJc3RydWN0IHN0YXRpY19sZWFzZSAqY3VyOworCisJaWYgKGRoY3BfdmVyYm9zZSA8IDIpCisJCXJldHVybjsKKworCWN1ciA9ICpzdF9sZWFzZV9wcDsKKwl3aGlsZSAoY3VyKSB7CisJCWJiX2luZm9fbXNnKCJzdGF0aWMgbGVhc2U6IG1hYzolMDJ4OiUwMng6JTAyeDolMDJ4OiUwMng6JTAyeCBuaXA6JXgiLAorCQkJY3VyLT5tYWNbMF0sIGN1ci0+bWFjWzFdLCBjdXItPm1hY1syXSwKKwkJCWN1ci0+bWFjWzNdLCBjdXItPm1hY1s0XSwgY3VyLT5tYWNbNV0sCisJCQljdXItPm5pcAorCQkpOworCQljdXIgPSBjdXItPm5leHQ7CisJfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3Zjb25maWcuYyBiL25ldHdvcmtpbmcvdmNvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNGIyZjAKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3Zjb25maWcuYwpAQCAtMCwwICsxLDE1MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdmNvbmZpZyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMSAgTWFudWVsIE5vdm9hIElJSSAgPG1qbjNAY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogQkJfQVVESVQgU1VTdjMgTi9BICovCisKKy8vdXNhZ2U6I2RlZmluZSB2Y29uZmlnX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJDT01NQU5EIFtPUFRJT05TXSIKKy8vdXNhZ2U6I2RlZmluZSB2Y29uZmlnX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ3JlYXRlIGFuZCByZW1vdmUgdmlydHVhbCBldGhlcm5ldCBkZXZpY2VzXG4iCisvL3VzYWdlOiAgICAgIlxuCWFkZAkJSUZBQ0UgVkxBTl9JRCIKKy8vdXNhZ2U6ICAgICAiXG4JcmVtCQlWTEFOX05BTUUiCisvL3VzYWdlOiAgICAgIlxuCXNldF9mbGFnCUlGQUNFIDB8MSBWTEFOX1FPUyIKKy8vdXNhZ2U6ICAgICAiXG4Jc2V0X2VncmVzc19tYXAJVkxBTl9OQU1FIFNLQl9QUklPIFZMQU5fUU9TIgorLy91c2FnZTogICAgICJcbglzZXRfaW5ncmVzc19tYXAJVkxBTl9OQU1FIFNLQl9QUklPIFZMQU5fUU9TIgorLy91c2FnZTogICAgICJcbglzZXRfbmFtZV90eXBlCU5BTUVfVFlQRSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bmV0L2lmLmg+CisKKy8qIFN0dWZmIGZyb20gbGludXgvaWZfdmxhbi5oLCBrZXJuZWwgdmVyc2lvbiAyLjQuMjMgKi8KK2VudW0gdmxhbl9pb2N0bF9jbWRzIHsKKwlBRERfVkxBTl9DTUQsCisJREVMX1ZMQU5fQ01ELAorCVNFVF9WTEFOX0lOR1JFU1NfUFJJT1JJVFlfQ01ELAorCVNFVF9WTEFOX0VHUkVTU19QUklPUklUWV9DTUQsCisJR0VUX1ZMQU5fSU5HUkVTU19QUklPUklUWV9DTUQsCisJR0VUX1ZMQU5fRUdSRVNTX1BSSU9SSVRZX0NNRCwKKwlTRVRfVkxBTl9OQU1FX1RZUEVfQ01ELAorCVNFVF9WTEFOX0ZMQUdfQ01ECit9OworZW51bSB2bGFuX25hbWVfdHlwZXMgeworCVZMQU5fTkFNRV9UWVBFX1BMVVNfVklELCAvKiBOYW1lIHdpbGwgbG9vayBsaWtlOiAgdmxhbjAwMDUgKi8KKwlWTEFOX05BTUVfVFlQRV9SQVdfUExVU19WSUQsIC8qIG5hbWUgd2lsbCBsb29rIGxpa2U6ICBldGgxLjAwMDUgKi8KKwlWTEFOX05BTUVfVFlQRV9QTFVTX1ZJRF9OT19QQUQsIC8qIE5hbWUgd2lsbCBsb29rIGxpa2U6ICB2bGFuNSAqLworCVZMQU5fTkFNRV9UWVBFX1JBV19QTFVTX1ZJRF9OT19QQUQsIC8qIE5hbWUgd2lsbCBsb29rIGxpa2U6ICBldGgwLjUgKi8KKwlWTEFOX05BTUVfVFlQRV9ISUdIRVNUCit9OworCitzdHJ1Y3Qgdmxhbl9pb2N0bF9hcmdzIHsKKwlpbnQgY21kOyAvKiBTaG91bGQgYmUgb25lIG9mIHRoZSB2bGFuX2lvY3RsX2NtZHMgZW51bSBhYm92ZS4gKi8KKwljaGFyIGRldmljZTFbMjRdOworCisJdW5pb24geworCQljaGFyIGRldmljZTJbMjRdOworCQlpbnQgVklEOworCQl1bnNpZ25lZCBpbnQgc2tiX3ByaW9yaXR5OworCQl1bnNpZ25lZCBpbnQgbmFtZV90eXBlOworCQl1bnNpZ25lZCBpbnQgYmluZF90eXBlOworCQl1bnNpZ25lZCBpbnQgZmxhZzsgLyogTWF0Y2hlcyB2bGFuX2Rldl9pbmZvIGZsYWdzICovCisJfSB1OworCisJc2hvcnQgdmxhbl9xb3M7Cit9OworCisjZGVmaW5lIFZMQU5fR1JPVVBfQVJSQVlfTEVOICA0MDk2CisjZGVmaW5lIFNJT0NTSUZWTEFOICAgICAgICAgICAweDg5ODMgIC8qIFNldCA4MDIuMVEgVkxBTiBvcHRpb25zICovCisKKy8qIE9uIGVudHJ5LCB0YWJsZSBwb2ludHMgdG8gdGhlIGxlbmd0aCBvZiB0aGUgY3VycmVudCBzdHJpbmcKKyAqIHBsdXMgTlVMIHRlcm1pbmF0b3IgcGx1cyBkYXRhIGxlbmd0aCBmb3IgdGhlIHN1YnNlcXVlbnQgZW50cnkuCisgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBsYXN0IGRhdGEgZW50cnkgZm9yIHRoZSBtYXRjaGluZyBzdHJpbmcuICovCitzdGF0aWMgY29uc3QgY2hhciAqeGZpbmRfc3RyKGNvbnN0IGNoYXIgKnRhYmxlLCBjb25zdCBjaGFyICpzdHIpCit7CisJd2hpbGUgKHN0cmNhc2VjbXAoc3RyLCB0YWJsZSArIDEpICE9IDApIHsKKwkJaWYgKCF0YWJsZVswXSkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJdGFibGUgKz0gdGFibGVbMF07CisJfQorCXJldHVybiB0YWJsZSAtIDE7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyIGNtZHNbXSBBTElHTjEgPSB7CisJNCwgQUREX1ZMQU5fQ01ELCA3LAorCSdhJywnZCcsJ2QnLDAsCisJMywgREVMX1ZMQU5fQ01ELCA3LAorCSdyJywnZScsJ20nLDAsCisJMywgU0VUX1ZMQU5fTkFNRV9UWVBFX0NNRCwgMTcsCisJJ3MnLCdlJywndCcsJ18nLCduJywnYScsJ20nLCdlJywnXycsJ3QnLCd5JywncCcsJ2UnLDAsCisJNSwgU0VUX1ZMQU5fRkxBR19DTUQsIDEyLAorCSdzJywnZScsJ3QnLCdfJywnZicsJ2wnLCdhJywnZycsMCwKKwk1LCBTRVRfVkxBTl9FR1JFU1NfUFJJT1JJVFlfQ01ELCAxOCwKKwkncycsJ2UnLCd0JywnXycsJ2UnLCdnJywncicsJ2UnLCdzJywncycsJ18nLCdtJywnYScsJ3AnLDAsCisJNSwgU0VUX1ZMQU5fSU5HUkVTU19QUklPUklUWV9DTUQsIDAsCisJJ3MnLCdlJywndCcsJ18nLCdpJywnbicsJ2cnLCdyJywnZScsJ3MnLCdzJywnXycsJ20nLCdhJywncCcsMCwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyIG5hbWVfdHlwZXNbXSBBTElHTjEgPSB7CisJVkxBTl9OQU1FX1RZUEVfUExVU19WSUQsIDE2LAorCSdWJywnTCcsJ0EnLCdOJywnXycsJ1AnLCdMJywnVScsJ1MnLCdfJywnVicsJ0knLCdEJywwLAorCVZMQU5fTkFNRV9UWVBFX1BMVVNfVklEX05PX1BBRCwgMjIsCisJJ1YnLCdMJywnQScsJ04nLCdfJywnUCcsJ0wnLCdVJywnUycsJ18nLCdWJywnSScsJ0QnLCdfJywnTicsJ08nLCdfJywnUCcsJ0EnLCdEJywwLAorCVZMQU5fTkFNRV9UWVBFX1JBV19QTFVTX1ZJRCwgMTUsCisJJ0QnLCdFJywnVicsJ18nLCdQJywnTCcsJ1UnLCdTJywnXycsJ1YnLCdJJywnRCcsMCwKKwlWTEFOX05BTUVfVFlQRV9SQVdfUExVU19WSURfTk9fUEFELCAwLAorCSdEJywnRScsJ1YnLCdfJywnUCcsJ0wnLCdVJywnUycsJ18nLCdWJywnSScsJ0QnLCdfJywnTicsJ08nLCdfJywnUCcsJ0EnLCdEJywwLAorfTsKKworaW50IHZjb25maWdfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHZjb25maWdfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHZsYW5faW9jdGxfYXJncyBpZnI7CisJY29uc3QgY2hhciAqcDsKKwlpbnQgZmQ7CisKKwltZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCisJKythcmd2OworCWlmICghYXJndlswXSkKKwkJYmJfc2hvd191c2FnZSgpOworCXAgPSB4ZmluZF9zdHIoY21kcyArIDIsIGFyZ3ZbMF0pOworCWlmci5jbWQgPSAqcDsKKwlpZiAoYXJnYyAhPSBwWy0xXSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJaWYgKGlmci5jbWQgPT0gU0VUX1ZMQU5fTkFNRV9UWVBFX0NNRCkgeworCQkvKiBzZXRfbmFtZV90eXBlICovCisJCWlmci51Lm5hbWVfdHlwZSA9ICp4ZmluZF9zdHIobmFtZV90eXBlcyArIDEsIGFyZ3ZbMV0pOworCX0gZWxzZSB7CisJCXN0cm5jcHlfSUZOQU1TSVooaWZyLmRldmljZTEsIGFyZ3ZbMV0pOworCQlwID0gYXJndlsyXTsKKworCQkvKiBJIHN1cHBvc2Ugb25lIGNvdWxkIHRyeSB0byBjb21iaW5lIHNvbWUgb2YgdGhlIGZ1bmN0aW9uIGNhbGxzIGJlbG93LAorCQkgKiBzaW5jZSBpZnIudS5mbGFnLCBpZnIudS5WSUQsIGFuZCBpZnIudS5za2JfcHJpb3JpdHkgYXJlIGFsbCBzYW1lLXNpemVkCisJCSAqICh1bnNpZ25lZCkgaW50IG1lbWJlcnMgb2YgYSB1bmlvbnMuICBCdXQgYmVjYXVzZSBvZiB0aGUgcmFuZ2UgY2hlY2tpbmcsCisJCSAqIGRvaW5nIHNvIHdvdWxkbid0IHNhdmUgdGhhdCBtdWNoIHNwYWNlIGFuZCB3b3VsZCBhbHNvIG1ha2UgbWFpbnRhaW5lbmNlCisJCSAqIG1vcmUgb2YgYSBwYWluLgorCQkgKi8KKwkJaWYgKGlmci5jbWQgPT0gU0VUX1ZMQU5fRkxBR19DTUQpIHsKKwkJCS8qIHNldF9mbGFnICovCisJCQlpZnIudS5mbGFnID0geGF0b3VfcmFuZ2UocCwgMCwgMSk7CisJCQkvKiBETTogaW4gb3JkZXIgdG8gc2V0IHJlb3JkZXIgaGVhZGVyLCBxb3MgbXVzdCBiZSBzZXQgKi8KKwkJCWlmci52bGFuX3FvcyA9IHhhdG91X3JhbmdlKGFyZ3ZbM10sIDAsIDcpOworCQl9IGVsc2UgaWYgKGlmci5jbWQgPT0gQUREX1ZMQU5fQ01EKSB7CisJCQkvKiBhZGQgKi8KKwkJCWlmci51LlZJRCA9IHhhdG91X3JhbmdlKHAsIDAsIFZMQU5fR1JPVVBfQVJSQVlfTEVOIC0gMSk7CisJCX0gZWxzZSBpZiAoaWZyLmNtZCAhPSBERUxfVkxBTl9DTUQpIHsKKwkJCS8qIHNldF97ZWdyZXNzfGluZ3Jlc3N9X21hcCAqLworCQkJaWZyLnUuc2tiX3ByaW9yaXR5ID0geGF0b3UocCk7CisJCQlpZnIudmxhbl9xb3MgPSB4YXRvdV9yYW5nZShhcmd2WzNdLCAwLCA3KTsKKwkJfQorCX0KKworCWZkID0geHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CisJaW9jdGxfb3JfcGVycm9yX2FuZF9kaWUoZmQsIFNJT0NTSUZWTEFOLCAmaWZyLAorCQkJCQkJImlvY3RsIGVycm9yIGZvciAlcyIsIGFyZ3ZbMF0pOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9uZXR3b3JraW5nL3dnZXQuYyBiL25ldHdvcmtpbmcvd2dldC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YTljMGMKLS0tIC9kZXYvbnVsbAorKysgYi9uZXR3b3JraW5nL3dnZXQuYwpAQCAtMCwwICsxLDEzMTggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHdnZXQgLSByZXRyaWV2ZSBhIGZpbGUgdXNpbmcgSFRUUCBvciBGVFAKKyAqCisgKiBDaGlwIFJvc2VudGhhbCBDb3ZhZCBDb21tdW5pY2F0aW9ucyA8Y2hpcEBsYXNlcmxpbmsubmV0PgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgQnJhZGxleSBNLiBLdWhuIDxia3VobkBlYmIub3JnPgorICogS3VobidzIGNvcHlyaWdodHMgYXJlIGxpY2Vuc2VkIEdQTHYyLW9yLWxhdGVyLiAgRmlsZSBhcyBhIHdob2xlIHJlbWFpbnMgR1BMdjIuCisgKi8KKworLy9jb25maWc6Y29uZmlnIFdHRVQKKy8vY29uZmlnOglib29sICJ3Z2V0IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIHdnZXQgaXMgYSB1dGlsaXR5IGZvciBub24taW50ZXJhY3RpdmUgZG93bmxvYWQgb2YgZmlsZXMgZnJvbSBIVFRQCisvL2NvbmZpZzoJICBhbmQgRlRQIHNlcnZlcnMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1dHRVRfU1RBVFVTQkFSCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIGEgbmlmdHkgcHJvY2VzcyBtZXRlciAoKzJrKSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFdHRVQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgdGhlIHRyYW5zZmVyIHByb2dyZXNzIGJhciBmb3Igd2dldCB0cmFuc2ZlcnMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1dHRVRfQVVUSEVOVElDQVRJT04KKy8vY29uZmlnOglib29sICJFbmFibGUgSFRUUCBhdXRoZW50aWNhdGlvbiIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFdHRVQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdXBwb3J0IGF1dGhlbnRpY2F0ZWQgSFRUUCB0cmFuc2ZlcnMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFdHRVQgJiYgTE9OR19PUFRTCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSB3Z2V0IGFwcGxldC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfV0dFVF9USU1FT1VUCisvL2NvbmZpZzoJYm9vbCAiRW5hYmxlIHRpbWVvdXQgb3B0aW9uIC1UIFNFQyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFdHRVQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdXBwb3J0cyBuZXR3b3JrIHJlYWQgYW5kIGNvbm5lY3QgdGltZW91dHMgZm9yIHdnZXQsCisvL2NvbmZpZzoJICBzbyB0aGF0IHdnZXQgd2lsbCBnaXZlIHVwIGFuZCB0aW1lb3V0LCB0aHJvdWdoIHRoZSAtVAorLy9jb25maWc6CSAgY29tbWFuZCBsaW5lIG9wdGlvbi4KKy8vY29uZmlnOgorLy9jb25maWc6CSAgQ3VycmVudGx5IG9ubHkgY29ubmVjdCBhbmQgbmV0d29yayBkYXRhIHJlYWQgdGltZW91dCBhcmUKKy8vY29uZmlnOgkgIHN1cHBvcnRlZCAoaS5lLiwgdGltZW91dCBpcyBub3QgYXBwbGllZCB0byB0aGUgRE5TIHF1ZXJ5KS4gV2hlbgorLy9jb25maWc6CSAgRkVBVFVSRV9XR0VUX0xPTkdfT1BUSU9OUyBpcyBhbHNvIGVuYWJsZWQsIHRoZSAtLXRpbWVvdXQgb3B0aW9uCisvL2NvbmZpZzoJICB3aWxsIHdvcmsgaW4gYWRkaXRpb24gdG8gLVQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1dHRVRfT1BFTlNTTAorLy9jb25maWc6CWJvb2wgIlRyeSB0byBjb25uZWN0IHRvIEhUVFBTIHVzaW5nIG9wZW5zc2wiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBXR0VUCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQ2hvb3NlIGhvdyB3Z2V0IGVzdGFibGlzaGVzIFNTTCBjb25uZWN0aW9uIGZvciBodHRwczovLyBVUkxzLgorLy9jb25maWc6CisvL2NvbmZpZzoJICBCdXN5Ym94IGl0c2VsZiBjb250YWlucyBubyBTU0wgY29kZS4gd2dldCB3aWxsIHNwYXduCisvL2NvbmZpZzoJICBhIGhlbHBlciBwcm9ncmFtIHRvIHRhbGsgb3ZlciBIVFRQUy4KKy8vY29uZmlnOgorLy9jb25maWc6CSAgT3BlblNTTCBoYXMgYSBzaW1wbGUgU1NMIGNsaWVudCBmb3IgZGVidWcgcHVycG9zZXMuCisvL2NvbmZpZzoJICBJZiB5b3Ugc2VsZWN0ICJvcGVuc3NsIiBoZWxwZXIsIHdnZXQgd2lsbCBlZmZlY3RpdmVseSBjYWxsCisvL2NvbmZpZzoJICAib3BlbnNzbCBzX2NsaWVudCAtcXVpZXQgLWNvbm5lY3QgSVA6NDQzIDI+L2Rldi9udWxsIgorLy9jb25maWc6CSAgYW5kIHBpcGUgaXRzIGRhdGEgdGhyb3VnaCBpdC4KKy8vY29uZmlnOgkgIE5vdGUgaW5jb252ZW5pZW50IEFQSTogaG9zdCByZXNvbHV0aW9uIGlzIGRvbmUgdHdpY2UsCisvL2NvbmZpZzoJICBhbmQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIG9wZW5zc2wncyBpZGVhIG9mIElQdjYgYWRkcmVzcworLy9jb25maWc6CSAgZm9ybWF0IGlzIHRoZSBzYW1lIGFzIG91cnMuCisvL2NvbmZpZzoJICBBbm90aGVyIHByb2JsZW0gaXMgdGhhdCBzX2NsaWVudCBwcmludHMgZGVidWcgaW5mb3JtYXRpb24KKy8vY29uZmlnOgkgIHRvIHN0ZGVyciwgYW5kIGl0IG5lZWRzIHRvIGJlIHN1cHByZXNzZWQuIFRoaXMgbWVhbnMKKy8vY29uZmlnOgkgIGFsbCBlcnJvciBtZXNzYWdlcyBnZXQgc3VwcHJlc3NlZCB0b28uCisvL2NvbmZpZzoJICBvcGVuc3NsIGlzIGFsc28gYSBiaWcgYmluYXJ5LCBvZnRlbiBkeW5hbWljYWxseSBsaW5rZWQKKy8vY29uZmlnOgkgIGFnYWluc3QgfjE1IGxpYnJhcmllcy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfV0dFVF9TU0xfSEVMUEVSCisvL2NvbmZpZzoJYm9vbCAiVHJ5IHRvIGNvbm5lY3QgdG8gSFRUUFMgdXNpbmcgc3NsX2hlbHBlciIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFdHRVQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBDaG9vc2UgaG93IHdnZXQgZXN0YWJsaXNoZXMgU1NMIGNvbm5lY3Rpb24gZm9yIGh0dHBzOi8vIFVSTHMuCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIEJ1c3lib3ggaXRzZWxmIGNvbnRhaW5zIG5vIFNTTCBjb2RlLiB3Z2V0IHdpbGwgc3Bhd24KKy8vY29uZmlnOgkgIGEgaGVscGVyIHByb2dyYW0gdG8gdGFsayBvdmVyIEhUVFBTLgorLy9jb25maWc6CisvL2NvbmZpZzoJICBzc2xfaGVscGVyIGlzIGEgdG9vbCB3aGljaCBjYW4gYmUgYnVpbHQgc3RhdGljYWxseQorLy9jb25maWc6CSAgZnJvbSBidXN5Ym94IHNvdXJjZXMgYWdhaW5zdCBhIHNtYWxsIGVtYmVkZGVkIFNTTCBsaWJyYXJ5LgorLy9jb25maWc6CSAgUGxlYXNlIHNlZSBuZXR3b3JraW5nL3NzbF9oZWxwZXIvUkVBRE1FLgorLy9jb25maWc6CSAgSXQgZG9lcyBub3QgcmVxdWlyZSBkb3VibGUgaG9zdCByZXNvbHV0aW9uIGFuZCBlbWl0cworLy9jb25maWc6CSAgZXJyb3IgbWVzc2FnZXMgdG8gc3RkZXJyLgorLy9jb25maWc6CisvL2NvbmZpZzoJICBQcmVjb21waWxlZCBzdGF0aWMgYmluYXJ5IG1heSBiZSBhdmFpbGFibGUgYXQKKy8vY29uZmlnOgkgIGh0dHA6Ly9idXN5Ym94Lm5ldC9kb3dubG9hZHMvYmluYXJpZXMvCisKKy8vYXBwbGV0OklGX1dHRVQoQVBQTEVUKHdnZXQsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfV0dFVCkgKz0gd2dldC5vCisKKy8vdXNhZ2U6I2RlZmluZSB3Z2V0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgICAiWy1jfC0tY29udGludWVdIFstc3wtLXNwaWRlcl0gWy1xfC0tcXVpZXRdIFstT3wtLW91dHB1dC1kb2N1bWVudCBGSUxFXVxuIgorLy91c2FnZTogICAgICAgIglbLS1oZWFkZXIgJ2hlYWRlcjogdmFsdWUnXSBbLVl8LS1wcm94eSBvbi9vZmZdIFstUCBESVJdXG4iCisvKiBTaW5jZSB3ZSBpZ25vcmUgdGhlc2Ugb3B0cywgd2UgZG9uJ3Qgc2hvdyB0aGVtIGluIC0taGVscCAqLworLyogLy91c2FnZTogICAgIglbLS1uby1jaGVjay1jZXJ0aWZpY2F0ZV0gWy0tbm8tY2FjaGVdIiAqLworLy91c2FnZTogICAgICAgIglbLVV8LS11c2VyLWFnZW50IEFHRU5UXSIgSUZfRkVBVFVSRV9XR0VUX1RJTUVPVVQoIiBbLVQgU0VDXSIpICIgVVJMLi4uIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgICAiWy1jc3FdIFstTyBGSUxFXSBbLVkgb24vb2ZmXSBbLVAgRElSXSBbLVUgQUdFTlRdIgorLy91c2FnZToJCQlJRl9GRUFUVVJFX1dHRVRfVElNRU9VVCgiIFstVCBTRUNdIikgIiBVUkwuLi4iCisvL3VzYWdlOgkpCisvL3VzYWdlOiNkZWZpbmUgd2dldF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJldHJpZXZlIGZpbGVzIHZpYSBIVFRQIG9yIEZUUFxuIgorLy91c2FnZTogICAgICJcbgktcwlTcGlkZXIgbW9kZSAtIG9ubHkgY2hlY2sgZmlsZSBleGlzdGVuY2UiCisvL3VzYWdlOiAgICAgIlxuCS1jCUNvbnRpbnVlIHJldHJpZXZhbCBvZiBhYm9ydGVkIHRyYW5zZmVyIgorLy91c2FnZTogICAgICJcbgktcQlRdWlldCIKKy8vdXNhZ2U6ICAgICAiXG4JLVAgRElSCVNhdmUgdG8gRElSIChkZWZhdWx0IC4pIgorLy91c2FnZToJSUZfRkVBVFVSRV9XR0VUX1RJTUVPVVQoCisvL3VzYWdlOiAgICAgIlxuCS1UIFNFQwlOZXR3b3JrIHJlYWQgdGltZW91dCBpcyBTRUMgc2Vjb25kcyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLU8gRklMRQlTYXZlIHRvIEZJTEUgKCctJyBmb3Igc3Rkb3V0KSIKKy8vdXNhZ2U6ICAgICAiXG4JLVUgU1RSCVVzZSBTVFIgZm9yIFVzZXItQWdlbnQgaGVhZGVyIgorLy91c2FnZTogICAgICJcbgktWQlVc2UgcHJveHkgKCdvbicgb3IgJ29mZicpIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIDAKKyMgZGVmaW5lIGxvZ19pbyguLi4pIGJiX2Vycm9yX21zZyhfX1ZBX0FSR1NfXykKKyMgZGVmaW5lIFNFTkRGTVQoZnAsIGZtdCwgLi4uKSBcCisJZG8geyBcCisJCWxvZ19pbygiPiAiIGZtdCwgIyNfX1ZBX0FSR1NfXyk7IFwKKwkJZnByaW50ZihmcCwgZm10LCAjI19fVkFfQVJHU19fKTsgXAorCX0gd2hpbGUgKDApOworI2Vsc2UKKyMgZGVmaW5lIGxvZ19pbyguLi4pICgodm9pZCkwKQorIyBkZWZpbmUgU0VOREZNVChmcCwgZm10LCAuLi4pIGZwcmludGYoZnAsIGZtdCwgIyNfX1ZBX0FSR1NfXykKKyNlbmRpZgorCisKK3N0cnVjdCBob3N0X2luZm8geworCWNoYXIgKmFsbG9jYXRlZDsKKwljb25zdCBjaGFyICpwYXRoOworCWNoYXIgICAgICAgKnVzZXI7CisJY29uc3QgY2hhciAqcHJvdG9jb2w7CisJY2hhciAgICAgICAqaG9zdDsKKwlpbnQgICAgICAgICBwb3J0OworfTsKK3N0YXRpYyBjb25zdCBjaGFyIFBfRlRQW10gPSAiZnRwIjsKK3N0YXRpYyBjb25zdCBjaGFyIFBfSFRUUFtdID0gImh0dHAiOworc3RhdGljIGNvbnN0IGNoYXIgUF9IVFRQU1tdID0gImh0dHBzIjsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TCisvKiBVc2VyLXNwZWNpZmllZCBoZWFkZXJzIHByZXZlbnQgdXNpbmcgb3VyIGNvcnJlc3BvbmRpbmcgYnVpbHQtaW4gaGVhZGVycy4gICovCitlbnVtIHsKKwlIRFJfSE9TVCAgICAgICAgICA9ICgxPDwwKSwKKwlIRFJfVVNFUl9BR0VOVCAgICA9ICgxPDwxKSwKKwlIRFJfUkFOR0UgICAgICAgICA9ICgxPDwyKSwKKwlIRFJfQVVUSCAgICAgICAgICA9ICgxPDwzKSAqIEVOQUJMRV9GRUFUVVJFX1dHRVRfQVVUSEVOVElDQVRJT04sCisJSERSX1BST1hZX0FVVEggICAgPSAoMTw8NCkgKiBFTkFCTEVfRkVBVFVSRV9XR0VUX0FVVEhFTlRJQ0FUSU9OLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyIHdnZXRfdXNlcl9oZWFkZXJzW10gQUxJR04xID0KKwkiSG9zdDpcMCIKKwkiVXNlci1BZ2VudDpcMCIKKwkiUmFuZ2U6XDAiCisjIGlmIEVOQUJMRV9GRUFUVVJFX1dHRVRfQVVUSEVOVElDQVRJT04KKwkiQXV0aG9yaXphdGlvbjpcMCIKKwkiUHJveHktQXV0aG9yaXphdGlvbjpcMCIKKyMgZW5kaWYKKwk7CisjIGRlZmluZSBVU1JfSEVBREVSX0hPU1QgICAgICAgKEcudXNlcl9oZWFkZXJzICYgSERSX0hPU1QpCisjIGRlZmluZSBVU1JfSEVBREVSX1VTRVJfQUdFTlQgKEcudXNlcl9oZWFkZXJzICYgSERSX1VTRVJfQUdFTlQpCisjIGRlZmluZSBVU1JfSEVBREVSX1JBTkdFICAgICAgKEcudXNlcl9oZWFkZXJzICYgSERSX1JBTkdFKQorIyBkZWZpbmUgVVNSX0hFQURFUl9BVVRIICAgICAgIChHLnVzZXJfaGVhZGVycyAmIEhEUl9BVVRIKQorIyBkZWZpbmUgVVNSX0hFQURFUl9QUk9YWV9BVVRIIChHLnVzZXJfaGVhZGVycyAmIEhEUl9QUk9YWV9BVVRIKQorI2Vsc2UgLyogTm8gbG9uZyBvcHRpb25zLCBubyB1c2VyLWhlYWRlcnMgOiggKi8KKyMgZGVmaW5lIFVTUl9IRUFERVJfSE9TVCAgICAgICAwCisjIGRlZmluZSBVU1JfSEVBREVSX1VTRVJfQUdFTlQgMAorIyBkZWZpbmUgVVNSX0hFQURFUl9SQU5HRSAgICAgIDAKKyMgZGVmaW5lIFVTUl9IRUFERVJfQVVUSCAgICAgICAwCisjIGRlZmluZSBVU1JfSEVBREVSX1BST1hZX0FVVEggMAorI2VuZGlmCisKKy8qIEdsb2JhbHMgKi8KK3N0cnVjdCBnbG9iYWxzIHsKKwlvZmZfdCBjb250ZW50X2xlbjsgICAgICAgIC8qIENvbnRlbnQtbGVuZ3RoIG9mIHRoZSBmaWxlICovCisJb2ZmX3QgYmVnX3JhbmdlOyAgICAgICAgICAvKiBSYW5nZSBhdCB3aGljaCBjb250aW51ZSBiZWdpbnMgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9XR0VUX1NUQVRVU0JBUgorCW9mZl90IHRyYW5zZmVycmVkOyAgICAgICAgLyogTnVtYmVyIG9mIGJ5dGVzIHRyYW5zZmVycmVkIHNvIGZhciAqLworCWNvbnN0IGNoYXIgKmN1cmZpbGU7ICAgICAgLyogTmFtZSBvZiBjdXJyZW50IGZpbGUgYmVpbmcgdHJhbnNmZXJyZWQgKi8KKwliYl9wcm9ncmVzc190IHBtdDsKKyNlbmRpZgorCWNoYXIgKmRpcl9wcmVmaXg7CisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMKKwljaGFyICpwb3N0X2RhdGE7CisJY2hhciAqZXh0cmFfaGVhZGVyczsKKwl1bnNpZ25lZCBjaGFyIHVzZXJfaGVhZGVyczsgLyogSGVhZGVycyBtZW50aW9uZWQgYnkgdGhlIHVzZXIgKi8KKyNlbmRpZgorCWNoYXIgKmZuYW1lX291dDsgICAgICAgIC8qIHdoZXJlIHRvIGRpcmVjdCBvdXRwdXQgKC1PKSAqLworCWNvbnN0IGNoYXIgKnByb3h5X2ZsYWc7IC8qIFVzZSBwcm94aWVzIGlmIGVudiB2YXJzIGFyZSBzZXQgKi8KKwljb25zdCBjaGFyICp1c2VyX2FnZW50OyAvKiAiVXNlci1BZ2VudCIgaGVhZGVyIGZpZWxkICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9USU1FT1VUCisJdW5zaWduZWQgdGltZW91dF9zZWNvbmRzOworCWJvb2wgY29ubmVjdGluZzsKKyNlbmRpZgorCWludCBvdXRwdXRfZmQ7CisJaW50IG9fZmxhZ3M7CisJc21hbGxpbnQgY2h1bmtlZDsgICAgICAgICAvKiBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nICovCisJc21hbGxpbnQgZ290X2NsZW47ICAgICAgICAvKiBnb3QgY29udGVudC1sZW5ndGg6IGZyb20gc2VydmVyICAqLworCS8qIExvY2FsIGRvd25sb2FkcyBkbyBiZW5lZml0IGZyb20gYmlnIGJ1ZmZlci4KKwkgKiBXaXRoIDUxMiBieXRlIGJ1ZmZlciwgaXQgd2FzIG1lYXN1cmVkIHRvIGJlCisJICogYW4gb3JkZXIgb2YgbWFnbml0dWRlIHNsb3dlciB0aGFuIHdpdGggYmlnIG9uZS4KKwkgKi8KKwl1aW50NjRfdCBqdXN0X3RvX2FsaWduX25leHRfbWVtYmVyOworCWNoYXIgd2dldF9idWZbQ09ORklHX0ZFQVRVUkVfQ09QWUJVRl9LQioxMDI0XTsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqcHRyX3RvX2dsb2JhbHMpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBGSU5JX0coKSBkbyB7IFwKKwlGUkVFX1BUUl9UT19HTE9CQUxTKCk7IFwKK30gd2hpbGUgKDApCisKKworLyogTXVzdCBtYXRjaCBvcHRpb24gc3RyaW5nISAqLworZW51bSB7CisJV0dFVF9PUFRfQ09OVElOVUUgICA9ICgxIDw8IDApLAorCVdHRVRfT1BUX1NQSURFUiAgICAgPSAoMSA8PCAxKSwKKwlXR0VUX09QVF9RVUlFVCAgICAgID0gKDEgPDwgMiksCisJV0dFVF9PUFRfT1VUTkFNRSAgICA9ICgxIDw8IDMpLAorCVdHRVRfT1BUX1BSRUZJWCAgICAgPSAoMSA8PCA0KSwKKwlXR0VUX09QVF9QUk9YWSAgICAgID0gKDEgPDwgNSksCisJV0dFVF9PUFRfVVNFUl9BR0VOVCA9ICgxIDw8IDYpLAorCVdHRVRfT1BUX05FVFdPUktfUkVBRF9USU1FT1VUID0gKDEgPDwgNyksCisJV0dFVF9PUFRfUkVUUklFUyAgICA9ICgxIDw8IDgpLAorCVdHRVRfT1BUX1BBU1NJVkUgICAgPSAoMSA8PCA5KSwKKwlXR0VUX09QVF9IRUFERVIgICAgID0gKDEgPDwgMTApICogRU5BQkxFX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMsCisJV0dFVF9PUFRfUE9TVF9EQVRBICA9ICgxIDw8IDExKSAqIEVOQUJMRV9GRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TLAorfTsKKworZW51bSB7CisJUFJPR1JFU1NfU1RBUlQgPSAtMSwKKwlQUk9HUkVTU19FTkQgICA9IDAsCisJUFJPR1JFU1NfQlVNUCAgPSAxLAorfTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9XR0VUX1NUQVRVU0JBUgorc3RhdGljIHZvaWQgcHJvZ3Jlc3NfbWV0ZXIoaW50IGZsYWcpCit7CisJaWYgKG9wdGlvbl9tYXNrMzIgJiBXR0VUX09QVF9RVUlFVCkKKwkJcmV0dXJuOworCisJaWYgKGZsYWcgPT0gUFJPR1JFU1NfU1RBUlQpCisJCWJiX3Byb2dyZXNzX2luaXQoJkcucG10LCBHLmN1cmZpbGUpOworCisJYmJfcHJvZ3Jlc3NfdXBkYXRlKCZHLnBtdCwKKwkJCUcuYmVnX3JhbmdlLAorCQkJRy50cmFuc2ZlcnJlZCwKKwkJCShHLmNodW5rZWQgfHwgIUcuZ290X2NsZW4pID8gMCA6IEcuYmVnX3JhbmdlICsgRy50cmFuc2ZlcnJlZCArIEcuY29udGVudF9sZW4KKwkpOworCisJaWYgKGZsYWcgPT0gUFJPR1JFU1NfRU5EKSB7CisJCWJiX3Byb2dyZXNzX2ZyZWUoJkcucG10KTsKKwkJYmJfcHV0Y2hhcl9zdGRlcnIoJ1xuJyk7CisJCUcudHJhbnNmZXJyZWQgPSAwOworCX0KK30KKyNlbHNlCitzdGF0aWMgQUxXQVlTX0lOTElORSB2b2lkIHByb2dyZXNzX21ldGVyKGludCBmbGFnIFVOVVNFRF9QQVJBTSkgeyB9CisjZW5kaWYKKworCisvKiBJUHY2IGtub3dzIHNjb3BlZCBhZGRyZXNzIHR5cGVzIGkuZS4gbGluayBhbmQgc2l0ZSBsb2NhbCBhZGRyZXNzZXMuIExpbmsKKyAqIGxvY2FsIGFkZHJlc3NlcyBjYW4gaGF2ZSBhIHNjb3BlIGlkZW50aWZpZXIgdG8gc3BlY2lmeSB0aGUKKyAqIGludGVyZmFjZS9saW5rIGFuIGFkZHJlc3MgaXMgdmFsaWQgb24gKGUuZy4gZmU4MDo6MSVldGgwKS4gVGhpcyBzY29wZQorICogaWRlbnRpZmllciBpcyBvbmx5IHZhbGlkIG9uIGEgc2luZ2xlIG5vZGUuCisgKgorICogUkZDIDQwMDcgc2F5cyB0aGF0IHRoZSBzY29wZSBpZGVudGlmaWVyIE1VU1QgTk9UIGJlIHNlbnQgYWNyb3NzIHRoZSB3aXJlLAorICogdW5sZXNzIGFsbCBub2RlcyBhZ3JlZSBvbiB0aGUgc2VtYW50aWMuIEFwYWNoZSBlLmcuIHJlZ2FyZHMgem9uZSBpZGVudGlmaWVycworICogaW4gdGhlIEhvc3QgaGVhZGVyIGFzIGludmFsaWQgcmVxdWVzdHMsIHNlZQorICogaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9idWd6aWxsYS9zaG93X2J1Zy5jZ2k/aWQ9MzUxMjIKKyAqLworc3RhdGljIHZvaWQgc3RyaXBfaXB2Nl9zY29wZV9pZChjaGFyICpob3N0KQoreworCWNoYXIgKnNjb3BlLCAqY3A7CisKKwkvKiBiYm94IHdnZXQgYWN0dWFsbHkgaGFuZGxlcyBJUHY2IGFkZHJlc3NlcyB3aXRob3V0IFtdLCBsaWtlCisJICogd2dldCAiaHR0cDovLzo6MS94eHgiLCBidXQgdGhpcyBpcyBub3Qgc3RhbmRhcmQuCisJICogVG8gc2F2ZSBjb2RlLCBfaGVyZV8gd2UgZG8gbm90IHN1cHBvcnQgaXQuICovCisKKwlpZiAoaG9zdFswXSAhPSAnWycpCisJCXJldHVybjsgLyogbm90IElQdjYgKi8KKworCXNjb3BlID0gc3RyY2hyKGhvc3QsICclJyk7CisJaWYgKCFzY29wZSkKKwkJcmV0dXJuOworCisJLyogUmVtb3ZlIHRoZSBJUHY2IHpvbmUgaWRlbnRpZmllciBmcm9tIHRoZSBob3N0IGFkZHJlc3MgKi8KKwljcCA9IHN0cmNocihob3N0LCAnXScpOworCWlmICghY3AgfHwgKGNwWzFdICE9ICc6JyAmJiBjcFsxXSAhPSAnXDAnKSkgeworCQkvKiBtYWxmb3JtZWQgYWRkcmVzcyAobm90ICJbeHhdOm5uIiBvciAiW3h4XSIpICovCisJCXJldHVybjsKKwl9CisKKwkvKiBjcCBwb2ludHMgdG8gIl0uLi4iLCBzY29wZSBwb2ludHMgdG8gIiVldGgwXS4uLiIgKi8KKwlvdmVybGFwcGluZ19zdHJjcHkoc2NvcGUsIGNwKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfQVVUSEVOVElDQVRJT04KKy8qIEJhc2U2NC1lbmNvZGUgY2hhcmFjdGVyIHN0cmluZy4gKi8KK3N0YXRpYyBjaGFyICpiYXNlNjRlbmMoY29uc3QgY2hhciAqc3RyKQoreworCXVuc2lnbmVkIGxlbiA9IHN0cmxlbihzdHIpOworCWlmIChsZW4gPiBzaXplb2YoRy53Z2V0X2J1ZikvNCozIC0gMTApIC8qIHBhcmFub2lhICovCisJCWxlbiA9IHNpemVvZihHLndnZXRfYnVmKS80KjMgLSAxMDsKKwliYl91dWVuY29kZShHLndnZXRfYnVmLCBzdHIsIGxlbiwgYmJfdXVlbmNfdGJsX2Jhc2U2NCk7CisJcmV0dXJuIEcud2dldF9idWY7Cit9CisjZW5kaWYKKworc3RhdGljIGNoYXIqIHNhbml0aXplX3N0cmluZyhjaGFyICpzKQoreworCXVuc2lnbmVkIGNoYXIgKnAgPSAodm9pZCAqKSBzOworCXdoaWxlICgqcCA+PSAnICcpCisJCXArKzsKKwkqcCA9ICdcMCc7CisJcmV0dXJuIHM7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9XR0VUX1RJTUVPVVQKK3N0YXRpYyB2b2lkIGFsYXJtX2hhbmRsZXIoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJLyogVGhpcyBpcyB0aGVvcmV0aWNhbGx5IHVuc2FmZSAodXNlcyBzdGRpbyBhbmQgbWFsbG9jIGluIHNpZ25hbCBoYW5kbGVyKSAqLworCWlmIChHLmNvbm5lY3RpbmcpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJkb3dubG9hZCB0aW1lZCBvdXQiKTsKK30KKyNlbmRpZgorCitzdGF0aWMgRklMRSAqb3Blbl9zb2NrZXQobGVuX2FuZF9zb2NrYWRkciAqbHNhKQoreworCWludCBmZDsKKwlGSUxFICpmcDsKKworCUlGX0ZFQVRVUkVfV0dFVF9USU1FT1VUKGFsYXJtKEcudGltZW91dF9zZWNvbmRzKTsgRy5jb25uZWN0aW5nID0gMTspCisJZmQgPSB4Y29ubmVjdF9zdHJlYW0obHNhKTsKKwlJRl9GRUFUVVJFX1dHRVRfVElNRU9VVChHLmNvbm5lY3RpbmcgPSAwOykKKworCS8qIGdsaWJjIDIuNCBzZWVtcyB0byB0cnkgc2Vla2luZyBvbiBpdCAtID8/ISAqLworCS8qIGhvcGVmdWxseSBpdCB1bmRlcnN0YW5kcyB3aGF0IEVTUElQRSBtZWFucy4uLiAqLworCWZwID0gZmRvcGVuKGZkLCAicisiKTsKKwlpZiAoIWZwKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX21lbW9yeV9leGhhdXN0ZWQpOworCisJcmV0dXJuIGZwOworfQorCisvKiBSZXR1cm5zICdcbicgaWYgaXQgd2FzIHNlZW4sIGVsc2UgJ1wwJy4gVHJpbXMgYXQgZmlyc3QgJ1xyJyBvciAnXG4nICovCisvKiBGSVhNRTogZG9lcyBub3QgcmVzcGVjdCBGRUFUVVJFX1dHRVRfVElNRU9VVCBhbmQgLVQgTjogKi8KK3N0YXRpYyBjaGFyIGZnZXRzX2FuZF90cmltKEZJTEUgKmZwKQoreworCWNoYXIgYzsKKwljaGFyICpidWZfcHRyOworCisJaWYgKGZnZXRzKEcud2dldF9idWYsIHNpemVvZihHLndnZXRfYnVmKSAtIDEsIGZwKSA9PSBOVUxMKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImVycm9yIGdldHRpbmcgcmVzcG9uc2UiKTsKKworCWJ1Zl9wdHIgPSBzdHJjaHJudWwoRy53Z2V0X2J1ZiwgJ1xuJyk7CisJYyA9ICpidWZfcHRyOworCSpidWZfcHRyID0gJ1wwJzsKKwlidWZfcHRyID0gc3RyY2hybnVsKEcud2dldF9idWYsICdccicpOworCSpidWZfcHRyID0gJ1wwJzsKKworCWxvZ19pbygiPCAlcyIsIEcud2dldF9idWYpOworCisJcmV0dXJuIGM7Cit9CisKK3N0YXRpYyBpbnQgZnRwY21kKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgRklMRSAqZnApCit7CisJaW50IHJlc3VsdDsKKwlpZiAoczEpIHsKKwkJaWYgKCFzMikKKwkJCXMyID0gIiI7CisJCWZwcmludGYoZnAsICIlcyVzXHJcbiIsIHMxLCBzMik7CisJCWZmbHVzaChmcCk7CisJCWxvZ19pbygiPiAlcyVzIiwgczEsIHMyKTsKKwl9CisKKwlkbyB7CisJCWZnZXRzX2FuZF90cmltKGZwKTsKKwl9IHdoaWxlICghaXNkaWdpdChHLndnZXRfYnVmWzBdKSB8fCBHLndnZXRfYnVmWzNdICE9ICcgJyk7CisKKwlHLndnZXRfYnVmWzNdID0gJ1wwJzsKKwlyZXN1bHQgPSB4YXRvaV9wb3NpdGl2ZShHLndnZXRfYnVmKTsKKwlHLndnZXRfYnVmWzNdID0gJyAnOworCXJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX3VybChjb25zdCBjaGFyICpzcmNfdXJsLCBzdHJ1Y3QgaG9zdF9pbmZvICpoKQoreworCWNoYXIgKnVybCwgKnAsICpzcDsKKworCWZyZWUoaC0+YWxsb2NhdGVkKTsKKwloLT5hbGxvY2F0ZWQgPSB1cmwgPSB4c3RyZHVwKHNyY191cmwpOworCisJaC0+cHJvdG9jb2wgPSBQX0ZUUDsKKwlwID0gc3Ryc3RyKHVybCwgIjovLyIpOworCWlmIChwKSB7CisJCSpwID0gJ1wwJzsKKwkJaC0+aG9zdCA9IHAgKyAzOworCQlpZiAoc3RyY21wKHVybCwgUF9GVFApID09IDApIHsKKwkJCWgtPnBvcnQgPSBiYl9sb29rdXBfcG9ydChQX0ZUUCwgInRjcCIsIDIxKTsKKwkJfSBlbHNlCisJCWlmIChzdHJjbXAodXJsLCBQX0hUVFBTKSA9PSAwKSB7CisJCQloLT5wb3J0ID0gYmJfbG9va3VwX3BvcnQoUF9IVFRQUywgInRjcCIsIDQ0Myk7CisJCQloLT5wcm90b2NvbCA9IFBfSFRUUFM7CisJCX0gZWxzZQorCQlpZiAoc3RyY21wKHVybCwgUF9IVFRQKSA9PSAwKSB7CisgaHR0cDoKKwkJCWgtPnBvcnQgPSBiYl9sb29rdXBfcG9ydChQX0hUVFAsICJ0Y3AiLCA4MCk7CisJCQloLT5wcm90b2NvbCA9IFBfSFRUUDsKKwkJfSBlbHNlIHsKKwkJCSpwID0gJzonOworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vdCBhbiBodHRwIG9yIGZ0cCB1cmw6ICVzIiwgc2FuaXRpemVfc3RyaW5nKHVybCkpOworCQl9CisJfSBlbHNlIHsKKwkJLy8gR05VIHdnZXQgaXMgdXNlci1mcmllbmRseSBhbmQgZmFsbHMgYmFjayB0byBodHRwOi8vCisJCWgtPmhvc3QgPSB1cmw7CisJCWdvdG8gaHR0cDsKKwl9CisKKwkvLyBGWUk6CisJLy8gIlJlYWwiIHdnZXQgJ2h0dHA6Ly9idXN5Ym94Lm5ldD92YXI9YS9iJyBzZW5kcyB0aGlzIHJlcXVlc3Q6CisJLy8gICAnR0VUIC8/dmFyPWEvYiBIVFRQIDEuMCcKKwkvLyAgIGFuZCBzYXZlcyAnaW5kZXguaHRtbD92YXI9YSUyRmInICh3ZSBzYXZlICdiJykKKwkvLyB3Z2V0ICdodHRwOi8vYnVzeWJveC5uZXQ/bG9naW49am9obkBkb2UnOgorCS8vICAgcmVxdWVzdDogJ0dFVCAvP2xvZ2luPWpvaG5AZG9lIEhUVFAvMS4wJworCS8vICAgc2F2ZXM6ICdpbmRleC5odG1sP2xvZ2luPWpvaG5AZG9lJyAod2Ugc2F2ZSAnP2xvZ2luPWpvaG5AZG9lJykKKwkvLyB3Z2V0ICdodHRwOi8vYnVzeWJveC5uZXQjdGVzdC90ZXN0JzoKKwkvLyAgIHJlcXVlc3Q6ICdHRVQgLyBIVFRQLzEuMCcKKwkvLyAgIHNhdmVzOiAnaW5kZXguaHRtbCcgKHdlIHNhdmUgJ3Rlc3QnKQorCS8vCisJLy8gV2UgYWxzbyBkb24ndCBhZGQgdW5pcXVlIC5OIHN1ZmZpeCBpZiBmaWxlIGV4aXN0cy4uLgorCXNwID0gc3RyY2hyKGgtPmhvc3QsICcvJyk7CisJcCA9IHN0cmNocihoLT5ob3N0LCAnPycpOyBpZiAoIXNwIHx8IChwICYmIHNwID4gcCkpIHNwID0gcDsKKwlwID0gc3RyY2hyKGgtPmhvc3QsICcjJyk7IGlmICghc3AgfHwgKHAgJiYgc3AgPiBwKSkgc3AgPSBwOworCWlmICghc3ApIHsKKwkJaC0+cGF0aCA9ICIiOworCX0gZWxzZSBpZiAoKnNwID09ICcvJykgeworCQkqc3AgPSAnXDAnOworCQloLT5wYXRoID0gc3AgKyAxOworCX0gZWxzZSB7IC8vICcjJyBvciAnPycKKwkJLy8gaHR0cDovL2J1c3lib3gubmV0P2xvZ2luPWpvaG5AZG9lIGlzIGEgdmFsaWQgVVJMCisJCS8vIG1lbW1vdmUgY29udmVydHMgdG86CisJCS8vIGh0dHA6L2J1c3lib3gubmV0dD9sb2dpbj1qb2huQGRvZS4uLgorCQltZW1tb3ZlKGgtPmhvc3QgLSAxLCBoLT5ob3N0LCBzcCAtIGgtPmhvc3QpOworCQloLT5ob3N0LS07CisJCXNwWy0xXSA9ICdcMCc7CisJCWgtPnBhdGggPSBzcDsKKwl9CisKKwlzcCA9IHN0cnJjaHIoaC0+aG9zdCwgJ0AnKTsKKwlpZiAoc3AgIT0gTlVMTCkgeworCQkvLyBVUkwtZGVjb2RlICJ1c2VyOnBhc3N3b3JkIiBzdHJpbmcgYmVmb3JlIGJhc2U2NC1lbmNvZGluZzoKKwkJLy8gd2dldCBodHRwOi8vdGVzdDpteSUyMHBhc3NAZXhhbXBsZS5jb20gc2hvdWxkIHNlbmQKKwkJLy8gQXV0aG9yaXphdGlvbjogQmFzaWMgZEdWemREcHRlU0J3WVhOegorCQkvLyB3aGljaCBkZWNvZGVzIHRvICJ0ZXN0Om15IHBhc3MiLgorCQkvLyBTdGFuZGFyZCB3Z2V0IGFuZCBjdXJsIGRvIHRoaXMgdG9vLgorCQkqc3AgPSAnXDAnOworCQlmcmVlKGgtPnVzZXIpOworCQloLT51c2VyID0geHN0cmR1cChwZXJjZW50X2RlY29kZV9pbl9wbGFjZShoLT5ob3N0LCAvKnN0cmljdDoqLyAwKSk7CisJCWgtPmhvc3QgPSBzcCArIDE7CisJfQorCS8qIGVsc2U6IGgtPnVzZXIgcmVtYWlucyBOVUxMLCBvciBhcyBzZXQgYnkgb3JpZ2luYWwgcmVxdWVzdAorCSAqIGJlZm9yZSByZWRpcmVjdCAoaWYgd2UgYXJlIGhlcmUgYWZ0ZXIgYSByZWRpcmVjdCkuCisJICovCit9CisKK3N0YXRpYyBjaGFyICpnZXRoZHIoRklMRSAqZnApCit7CisJY2hhciAqcywgKmhkcnZhbDsKKwlpbnQgYzsKKworCS8qIHJldHJpZXZlIGhlYWRlciBsaW5lICovCisJYyA9IGZnZXRzX2FuZF90cmltKGZwKTsKKworCS8qIGVuZCBvZiB0aGUgaGVhZGVycz8gKi8KKwlpZiAoRy53Z2V0X2J1ZlswXSA9PSAnXDAnKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGNvbnZlcnQgdGhlIGhlYWRlciBuYW1lIHRvIGxvd2VyIGNhc2UgKi8KKwlmb3IgKHMgPSBHLndnZXRfYnVmOyBpc2FsbnVtKCpzKSB8fCAqcyA9PSAnLScgfHwgKnMgPT0gJy4nIHx8ICpzID09ICdfJzsgKytzKSB7CisJCS8qCisJCSAqIE5vLW9wIGZvciAyMC0zZiBhbmQgNjAtN2YuICIwLTlhLXotLiIgYXJlIGluIHRoZXNlIHJhbmdlcy4KKwkJICogNDAtNWYgcmFuZ2UgKCJAQS1aW1xdXl8iKSBtYXBzIHRvIDYwLTdmLgorCQkgKiAiQS1aIiBtYXBzIHRvICJhLXoiLgorCQkgKiAiQFtcXSIgY2FuJ3Qgb2NjdXIgaW4gaGVhZGVyIG5hbWVzLgorCQkgKiAiXl8iIG1hcHMgdG8gIn4sREVMIiAod2hpY2ggaXMgd3JvbmcpLgorCQkgKiAiXiIgd2FzIG5ldmVyIHNlZW4geWV0LCAiXyIgd2FzIHNlZW4gZnJvbSB3ZWIuYXJjaGl2ZS5vcmcKKwkJICogKHgtYXJjaGl2ZS1vcmlnLXhfY29tbW9uY3Jhd2xfU2lnbmF0dXJlOiBIRVhTVFJJTkcpLgorCQkgKi8KKwkJKnMgfD0gMHgyMDsKKwl9CisKKwkvKiB2ZXJpZnkgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGhlYWRlciBuYW1lICovCisJaWYgKCpzICE9ICc6JykKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBoZWFkZXIgbGluZTogJXMiLCBzYW5pdGl6ZV9zdHJpbmcoRy53Z2V0X2J1ZikpOworCisJLyogbG9jYXRlIHRoZSBzdGFydCBvZiB0aGUgaGVhZGVyIHZhbHVlICovCisJKnMrKyA9ICdcMCc7CisJaGRydmFsID0gc2tpcF93aGl0ZXNwYWNlKHMpOworCisJaWYgKGMgIT0gJ1xuJykgeworCQkvKiBSYXRzISBUaGUgYnVmZmVyIGlzbid0IGJpZyBlbm91Z2ggdG8gaG9sZCB0aGUgZW50aXJlIGhlYWRlciB2YWx1ZSAqLworCQl3aGlsZSAoYyA9IGdldGMoZnApLCBjICE9IEVPRiAmJiBjICE9ICdcbicpCisJCQljb250aW51ZTsKKwl9CisKKwlyZXR1cm4gaGRydmFsOworfQorCitzdGF0aWMgdm9pZCByZXNldF9iZWdfcmFuZ2VfdG9femVybyh2b2lkKQoreworCWJiX2Vycm9yX21zZygicmVzdGFydCBmYWlsZWQiKTsKKwlHLmJlZ19yYW5nZSA9IDA7CisJeGxzZWVrKEcub3V0cHV0X2ZkLCAwLCBTRUVLX1NFVCk7CisJLyogRG9uZSBhdCB0aGUgZW5kIGluc3RlYWQ6ICovCisJLyogZnRydW5jYXRlKEcub3V0cHV0X2ZkLCAwKTsgKi8KK30KKworc3RhdGljIEZJTEUqIHByZXBhcmVfZnRwX3Nlc3Npb24oRklMRSAqKmRmcHAsIHN0cnVjdCBob3N0X2luZm8gKnRhcmdldCwgbGVuX2FuZF9zb2NrYWRkciAqbHNhKQoreworCUZJTEUgKnNmcDsKKwljaGFyICpzdHI7CisJaW50IHBvcnQ7CisKKwlpZiAoIXRhcmdldC0+dXNlcikKKwkJdGFyZ2V0LT51c2VyID0geHN0cmR1cCgiYW5vbnltb3VzOmJ1c3lib3hAIik7CisKKwlzZnAgPSBvcGVuX3NvY2tldChsc2EpOworCWlmIChmdHBjbWQoTlVMTCwgTlVMTCwgc2ZwKSAhPSAyMjApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyIsIHNhbml0aXplX3N0cmluZyhHLndnZXRfYnVmICsgNCkpOworCisJLyoKKwkgKiBTcGxpdHRpbmcgdXNlcm5hbWU6cGFzc3dvcmQgcGFpciwKKwkgKiB0cnlpbmcgdG8gbG9nIGluCisJICovCisJc3RyID0gc3RyY2hyKHRhcmdldC0+dXNlciwgJzonKTsKKwlpZiAoc3RyKQorCQkqc3RyKysgPSAnXDAnOworCXN3aXRjaCAoZnRwY21kKCJVU0VSICIsIHRhcmdldC0+dXNlciwgc2ZwKSkgeworCWNhc2UgMjMwOgorCQlicmVhazsKKwljYXNlIDMzMToKKwkJaWYgKGZ0cGNtZCgiUEFTUyAiLCBzdHIsIHNmcCkgPT0gMjMwKQorCQkJYnJlYWs7CisJCS8qIGZhbGwgdGhyb3VnaCAoZmFpbGVkIGxvZ2luKSAqLworCWRlZmF1bHQ6CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJmdHAgbG9naW46ICVzIiwgc2FuaXRpemVfc3RyaW5nKEcud2dldF9idWYgKyA0KSk7CisJfQorCisJZnRwY21kKCJUWVBFIEkiLCBOVUxMLCBzZnApOworCisJLyoKKwkgKiBRdWVyeWluZyBmaWxlIHNpemUKKwkgKi8KKwlpZiAoZnRwY21kKCJTSVpFICIsIHRhcmdldC0+cGF0aCwgc2ZwKSA9PSAyMTMpIHsKKwkJRy5jb250ZW50X2xlbiA9IEJCX1NUUlRPT0ZGKEcud2dldF9idWYgKyA0LCBOVUxMLCAxMCk7CisJCWlmIChHLmNvbnRlbnRfbGVuIDwgMCB8fCBlcnJubykgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIlNJWkUgdmFsdWUgaXMgZ2FyYmFnZSIpOworCQl9CisJCUcuZ290X2NsZW4gPSAxOworCX0KKworCS8qCisJICogRW50ZXJpbmcgcGFzc2l2ZSBtb2RlCisJICovCisJaWYgKGZ0cGNtZCgiUEFTViIsIE5VTEwsIHNmcCkgIT0gMjI3KSB7CisgcGFzdl9lcnJvcjoKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCByZXNwb25zZSB0byAlczogJXMiLCAiUEFTViIsIHNhbml0aXplX3N0cmluZyhHLndnZXRfYnVmKSk7CisJfQorCS8vIFJlc3BvbnNlIGlzICIyMjcgZ2FyYmFnZU4xLE4yLE4zLE40LFAxLFAyWylnYXJiYWdlXQorCS8vIFNlcnZlcidzIElQIGlzIE4xLk4yLk4zLk40ICh3ZSBpZ25vcmUgaXQpCisJLy8gU2VydmVyJ3MgcG9ydCBmb3IgZGF0YSBjb25uZWN0aW9uIGlzIFAxKjI1NitQMgorCXN0ciA9IHN0cnJjaHIoRy53Z2V0X2J1ZiwgJyknKTsKKwlpZiAoc3RyKSBzdHJbMF0gPSAnXDAnOworCXN0ciA9IHN0cnJjaHIoRy53Z2V0X2J1ZiwgJywnKTsKKwlpZiAoIXN0cikgZ290byBwYXN2X2Vycm9yOworCXBvcnQgPSB4YXRvdV9yYW5nZShzdHIrMSwgMCwgMjU1KTsKKwkqc3RyID0gJ1wwJzsKKwlzdHIgPSBzdHJyY2hyKEcud2dldF9idWYsICcsJyk7CisJaWYgKCFzdHIpIGdvdG8gcGFzdl9lcnJvcjsKKwlwb3J0ICs9IHhhdG91X3JhbmdlKHN0cisxLCAwLCAyNTUpICogMjU2OworCXNldF9ucG9ydCgmbHNhLT51LnNhLCBodG9ucyhwb3J0KSk7CisKKwkqZGZwcCA9IG9wZW5fc29ja2V0KGxzYSk7CisKKwlpZiAoRy5iZWdfcmFuZ2UgIT0gMCkgeworCQlzcHJpbnRmKEcud2dldF9idWYsICJSRVNUICUiT0ZGX0ZNVCJ1IiwgRy5iZWdfcmFuZ2UpOworCQlpZiAoZnRwY21kKEcud2dldF9idWYsIE5VTEwsIHNmcCkgPT0gMzUwKQorCQkJRy5jb250ZW50X2xlbiAtPSBHLmJlZ19yYW5nZTsKKwkJZWxzZQorCQkJcmVzZXRfYmVnX3JhbmdlX3RvX3plcm8oKTsKKwl9CisKKwlpZiAoZnRwY21kKCJSRVRSICIsIHRhcmdldC0+cGF0aCwgc2ZwKSA+IDE1MCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCByZXNwb25zZSB0byAlczogJXMiLCAiUkVUUiIsIHNhbml0aXplX3N0cmluZyhHLndnZXRfYnVmKSk7CisKKwlyZXR1cm4gc2ZwOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9PUEVOU1NMCitzdGF0aWMgaW50IHNwYXduX2h0dHBzX2hlbHBlcl9vcGVuc3NsKGNvbnN0IGNoYXIgKmhvc3QsIHVuc2lnbmVkIHBvcnQpCit7CisJY2hhciAqYWxsb2NhdGVkID0gTlVMTDsKKwlpbnQgc3BbMl07CisJaW50IHBpZDsKKwlJRl9GRUFUVVJFX1dHRVRfU1NMX0hFTFBFUih2b2xhdGlsZSBpbnQgY2hpbGRfZmFpbGVkID0gMDspCisKKwlpZiAoc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgc3ApICE9IDApCisJCS8qIEtlcm5lbCBjYW4gaGF2ZSBBRl9VTklYIHN1cHBvcnQgZGlzYWJsZWQgKi8KKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzb2NrZXRwYWlyIik7CisKKwlpZiAoIXN0cmNocihob3N0LCAnOicpKQorCQlob3N0ID0gYWxsb2NhdGVkID0geGFzcHJpbnRmKCIlczoldSIsIGhvc3QsIHBvcnQpOworCisJZmZsdXNoX2FsbCgpOworCXBpZCA9IHh2Zm9yaygpOworCWlmIChwaWQgPT0gMCkgeworCQkvKiBDaGlsZCAqLworCQljaGFyICphcmd2WzZdOworCisJCWNsb3NlKHNwWzBdKTsKKwkJeG1vdmVfZmQoc3BbMV0sIDApOworCQl4ZHVwMigwLCAxKTsKKwkJLyoKKwkJICogb3BlbnNzbCBzX2NsaWVudCAtcXVpZXQgLWNvbm5lY3Qgd3d3Lmtlcm5lbC5vcmc6NDQzIDI+L2Rldi9udWxsCisJCSAqIEl0IHByaW50cyBzb21lIGRlYnVnIHN0dWZmIG9uIHN0ZGVyciwgZG9uJ3Qga25vdyBob3cgdG8gc3VwcHJlc3MgaXQuCisJCSAqIFdvcmsgYXJvdW5kIGJ5IGRldi1udWxsaW5nIHN0ZGVyci4gV2UgbG9zZSBhbGwgZXJyb3IgbWVzc2FnZXMgOigKKwkJICovCisJCXhtb3ZlX2ZkKDIsIDMpOworCQl4b3BlbigiL2Rldi9udWxsIiwgT19SRFdSKTsKKwkJYXJndlswXSA9IChjaGFyKikib3BlbnNzbCI7CisJCWFyZ3ZbMV0gPSAoY2hhciopInNfY2xpZW50IjsKKwkJYXJndlsyXSA9IChjaGFyKikiLXF1aWV0IjsKKwkJYXJndlszXSA9IChjaGFyKikiLWNvbm5lY3QiOworCQlhcmd2WzRdID0gKGNoYXIqKWhvc3Q7CisJCWFyZ3ZbNV0gPSBOVUxMOworCQlCQl9FWEVDVlAoYXJndlswXSwgYXJndik7CisJCXhtb3ZlX2ZkKDMsIDIpOworIyBpZiBFTkFCTEVfRkVBVFVSRV9XR0VUX1NTTF9IRUxQRVIKKwkJY2hpbGRfZmFpbGVkID0gMTsKKwkJeGZ1bmNfZGllKCk7CisjIGVsc2UKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBleGVjdXRlICclcyciLCBhcmd2WzBdKTsKKyMgZW5kaWYKKwkJLyogbm90cmVhY2hlZCAqLworCX0KKworCS8qIFBhcmVudCAqLworCWZyZWUoYWxsb2NhdGVkKTsKKwljbG9zZShzcFsxXSk7CisjIGlmIEVOQUJMRV9GRUFUVVJFX1dHRVRfU1NMX0hFTFBFUgorCWlmIChjaGlsZF9mYWlsZWQpIHsKKwkJY2xvc2Uoc3BbMF0pOworCQlyZXR1cm4gLTE7CisJfQorIyBlbmRpZgorCXJldHVybiBzcFswXTsKK30KKyNlbmRpZgorCisvKiBTZWUgbmV0d29ya2luZy9zc2xfaGVscGVyL1JFQURNRSBob3cgdG8gYnVpbGQgb25lICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9TU0xfSEVMUEVSCitzdGF0aWMgdm9pZCBzcGF3bl9odHRwc19oZWxwZXJfc21hbGwoaW50IG5ldHdvcmtfZmQpCit7CisJaW50IHNwWzJdOworCWludCBwaWQ7CisKKwlpZiAoc29ja2V0cGFpcihBRl9VTklYLCBTT0NLX1NUUkVBTSwgMCwgc3ApICE9IDApCisJCS8qIEtlcm5lbCBjYW4gaGF2ZSBBRl9VTklYIHN1cHBvcnQgZGlzYWJsZWQgKi8KKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzb2NrZXRwYWlyIik7CisKKwlwaWQgPSBCQl9NTVUgPyB4Zm9yaygpIDogeHZmb3JrKCk7CisJaWYgKHBpZCA9PSAwKSB7CisJCS8qIENoaWxkICovCisJCWNoYXIgKmFyZ3ZbM107CisKKwkJY2xvc2Uoc3BbMF0pOworCQl4bW92ZV9mZChzcFsxXSwgMCk7CisJCXhkdXAyKDAsIDEpOworCQl4bW92ZV9mZChuZXR3b3JrX2ZkLCAzKTsKKwkJLyoKKwkJICogQSBzaW1wbGUgc3NsL3RscyBoZWxwZXIKKwkJICovCisJCWFyZ3ZbMF0gPSAoY2hhciopInNzbF9oZWxwZXIiOworCQlhcmd2WzFdID0gKGNoYXIqKSItZDMiOworCQlhcmd2WzJdID0gTlVMTDsKKwkJQkJfRVhFQ1ZQKGFyZ3ZbMF0sIGFyZ3YpOworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGV4ZWN1dGUgJyVzJyIsIGFyZ3ZbMF0pOworCQkvKiBub3RyZWFjaGVkICovCisJfQorCisJLyogUGFyZW50ICovCisJY2xvc2Uoc3BbMV0pOworCXhtb3ZlX2ZkKHNwWzBdLCBuZXR3b3JrX2ZkKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBOT0lOTElORSByZXRyaWV2ZV9maWxlX2RhdGEoRklMRSAqZGZwKQoreworI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfU1RBVFVTQkFSIHx8IEVOQUJMRV9GRUFUVVJFX1dHRVRfVElNRU9VVAorIyBpZiBFTkFCTEVfRkVBVFVSRV9XR0VUX1RJTUVPVVQKKwl1bnNpZ25lZCBzZWNvbmRfY250ID0gRy50aW1lb3V0X3NlY29uZHM7CisjIGVuZGlmCisJc3RydWN0IHBvbGxmZCBwb2xsZGF0YTsKKworCXBvbGxkYXRhLmZkID0gZmlsZW5vKGRmcCk7CisJcG9sbGRhdGEuZXZlbnRzID0gUE9MTElOIHwgUE9MTFBSSTsKKyNlbmRpZgorCXByb2dyZXNzX21ldGVyKFBST0dSRVNTX1NUQVJUKTsKKworCWlmIChHLmNodW5rZWQpCisJCWdvdG8gZ2V0X2NsZW47CisKKwkvKiBMb29wcyBvbmx5IGlmIGNodW5rZWQgKi8KKwl3aGlsZSAoMSkgeworCisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9TVEFUVVNCQVIgfHwgRU5BQkxFX0ZFQVRVUkVfV0dFVF9USU1FT1VUCisJCS8qIE11c3QgdXNlIG5vbmJsb2NraW5nIEkvTywgb3RoZXJ3aXNlIGZyZWFkIHdpbGwgbG9vcAorCQkgKiBhbmQgKmJsb2NrKiB1bnRpbCBpdCByZWFkcyBmdWxsIGJ1ZmZlciwKKwkJICogd2hpY2ggbWVzc2VzIHVwIHByb2dyZXNzIGJhciBhbmQvb3IgdGltZW91dCBsb2dpYy4KKwkJICogQmVjYXVzZSBvZiBub25ibG9ja2luZyBJL08sIHdlIG5lZWQgdG8gZGFuY2UKKwkJICogdmVyeSBjYXJlZnVsbHkgYXJvdW5kIEVBR0FJTi4gU2VlIGV4cGxhbmF0aW9uIGF0CisJCSAqIGNsZWFyZXJyKCkgY2FsbHMuCisJCSAqLworCQluZGVsYXlfb24ocG9sbGRhdGEuZmQpOworI2VuZGlmCisJCXdoaWxlICgxKSB7CisJCQlpbnQgbjsKKwkJCXVuc2lnbmVkIHJkc3o7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9XR0VUX1NUQVRVU0JBUiB8fCBFTkFCTEVfRkVBVFVSRV9XR0VUX1RJTUVPVVQKKwkJCS8qIGZyZWFkIGludGVybmFsbHkgdXNlcyByZWFkIGxvb3AsIHdoaWNoIGluIG91ciBjYXNlCisJCQkgKiBpcyB1c3VhbGx5IGV4aXRlZCB3aGVuIHdlIGdldCBFQUdBSU4uCisJCQkgKiBJbiB0aGlzIGNhc2UsIGxpYmMgc2V0cyBlcnJvciBtYXJrZXIgb24gdGhlIHN0cmVhbS4KKwkJCSAqIE5lZWQgdG8gY2xlYXIgaXQgYmVmb3JlIG5leHQgZnJlYWQgdG8gYXZvaWQgcG9zc2libGUKKwkJCSAqIHJhcmUgZmFsc2UgcG9zaXRpdmUgZmVycm9yIGJlbG93LiBSYXJlIGJlY2F1c2UgdXN1YWxseQorCQkJICogZnJlYWQgZ2V0cyBtb3JlIHRoYW4gemVybyBieXRlcywgYW5kIHdlIGRvbid0IGZhbGwKKwkJCSAqIGludG8gaWYgKG4gPD0gMCkgLi4uCisJCQkgKi8KKwkJCWNsZWFyZXJyKGRmcCk7CisjZW5kaWYKKwkJCWVycm5vID0gMDsKKwkJCXJkc3ogPSBzaXplb2YoRy53Z2V0X2J1Zik7CisJCQlpZiAoRy5nb3RfY2xlbikgeworCQkJCWlmIChHLmNvbnRlbnRfbGVuIDwgKG9mZl90KXNpemVvZihHLndnZXRfYnVmKSkgeworCQkJCQlpZiAoKGludClHLmNvbnRlbnRfbGVuIDw9IDApCisJCQkJCQlicmVhazsKKwkJCQkJcmRzeiA9ICh1bnNpZ25lZClHLmNvbnRlbnRfbGVuOworCQkJCX0KKwkJCX0KKwkJCW4gPSBmcmVhZChHLndnZXRfYnVmLCAxLCByZHN6LCBkZnApOworCisJCQlpZiAobiA+IDApIHsKKwkJCQl4d3JpdGUoRy5vdXRwdXRfZmQsIEcud2dldF9idWYsIG4pOworI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfU1RBVFVTQkFSCisJCQkJRy50cmFuc2ZlcnJlZCArPSBuOworI2VuZGlmCisJCQkJaWYgKEcuZ290X2NsZW4pIHsKKwkJCQkJRy5jb250ZW50X2xlbiAtPSBuOworCQkJCQlpZiAoRy5jb250ZW50X2xlbiA9PSAwKQorCQkJCQkJYnJlYWs7CisJCQkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfVElNRU9VVAorCQkJCXNlY29uZF9jbnQgPSBHLnRpbWVvdXRfc2Vjb25kczsKKyNlbmRpZgorCQkJCWdvdG8gYnVtcDsKKwkJCX0KKworCQkJLyogbiA8PSAwLgorCQkJICogbWFuIGZyZWFkOgorCQkJICogSWYgZXJyb3Igb2NjdXJzLCBvciBFT0YgaXMgcmVhY2hlZCwgdGhlIHJldHVybiB2YWx1ZQorCQkJICogaXMgYSBzaG9ydCBpdGVtIGNvdW50IChvciB6ZXJvKS4KKwkJCSAqIGZyZWFkIGRvZXMgbm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gRU9GIGFuZCBlcnJvci4KKwkJCSAqLworCQkJaWYgKGVycm5vICE9IEVBR0FJTikgeworCQkJCWlmIChmZXJyb3IoZGZwKSkgeworCQkJCQlwcm9ncmVzc19tZXRlcihQUk9HUkVTU19FTkQpOworCQkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3JlYWRfZXJyb3IpOworCQkJCX0KKwkJCQlicmVhazsgLyogRU9GLCBub3QgZXJyb3IgKi8KKwkJCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfU1RBVFVTQkFSIHx8IEVOQUJMRV9GRUFUVVJFX1dHRVRfVElNRU9VVAorCQkJLyogSXQgd2FzIEVBR0FJTi4gVGhlcmUgaXMgbm8gZGF0YS4gV2FpdCB1cCB0byBvbmUgc2Vjb25kCisJCQkgKiB0aGVuIGFib3J0IGlmIHRpbWVkIG91dCwgb3IgdXBkYXRlIHRoZSBiYXIgYW5kIHRyeSByZWFkaW5nIGFnYWluLgorCQkJICovCisJCQlpZiAoc2FmZV9wb2xsKCZwb2xsZGF0YSwgMSwgMTAwMCkgPT0gMCkgeworIyBpZiBFTkFCTEVfRkVBVFVSRV9XR0VUX1RJTUVPVVQKKwkJCQlpZiAoc2Vjb25kX2NudCAhPSAwICYmIC0tc2Vjb25kX2NudCA9PSAwKSB7CisJCQkJCXByb2dyZXNzX21ldGVyKFBST0dSRVNTX0VORCk7CisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJkb3dubG9hZCB0aW1lZCBvdXQiKTsKKwkJCQl9CisjIGVuZGlmCisJCQkJLyogV2UgdXNlZCB0byBsb29wIGJhY2sgdG8gcG9sbCBoZXJlLAorCQkJCSAqIGJ1dCB0aGVyZSBpcyBubyBncmVhdCBoYXJtIGluIGxldHRpbmcgZnJlYWQKKwkJCQkgKiB0byB0cnkgcmVhZGluZyBhbnl3YXkuCisJCQkJICovCisJCQl9CisjZW5kaWYKKyBidW1wOgorCQkJLyogTmVlZCB0byBkbyBpdCBfZXZlcnlfIHNlY29uZCBmb3IgInN0YWxsZWQiIGluZGljYXRvcgorCQkJICogdG8gYmUgc2hvd24gcHJvcGVybHkuCisJCQkgKi8KKwkJCXByb2dyZXNzX21ldGVyKFBST0dSRVNTX0JVTVApOworCQl9IC8qIHdoaWxlIChyZWFkaW5nIGRhdGEpICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9XR0VUX1NUQVRVU0JBUiB8fCBFTkFCTEVfRkVBVFVSRV9XR0VUX1RJTUVPVVQKKwkJY2xlYXJlcnIoZGZwKTsKKwkJbmRlbGF5X29mZihwb2xsZGF0YS5mZCk7IC8qIGVsc2UgZmdldHMgY2FuIGdldCB2ZXJ5IHVuaGFwcHkgKi8KKyNlbmRpZgorCQlpZiAoIUcuY2h1bmtlZCkKKwkJCWJyZWFrOworCisJCWZnZXRzX2FuZF90cmltKGRmcCk7IC8qIEVhdCBlbXB0eSBsaW5lICovCisgZ2V0X2NsZW46CisJCWZnZXRzX2FuZF90cmltKGRmcCk7CisJCUcuY29udGVudF9sZW4gPSBTVFJUT09GRihHLndnZXRfYnVmLCBOVUxMLCAxNik7CisJCS8qIEZJWE1FOiBlcnJvciBjaGVjaz8gKi8KKwkJaWYgKEcuY29udGVudF9sZW4gPT0gMCkKKwkJCWJyZWFrOyAvKiBhbGwgZG9uZSEgKi8KKwkJRy5nb3RfY2xlbiA9IDE7CisJCS8qCisJCSAqIE5vdGUgdGhhdCBmZ2V0cyBtYXkgcmVzdWx0IGluIHNvbWUgZGF0YSBiZWluZyBidWZmZXJlZCBpbiBkZnAuCisJCSAqIFdlIGxvb3AgYmFjayB0byBmcmVhZCwgd2hpY2ggd2lsbCByZXRyaWV2ZSB0aGlzIGRhdGEuCisJCSAqIEFsc28gbm90ZSB0aGF0IGNvZGUgaGFzIHRvIGJlIGFycmFuZ2VkIHNvIHRoYXQgZnJlYWQKKwkJICogaXMgZG9uZSBfYmVmb3JlXyBvbmUtc2Vjb25kIHBvbGwgd2FpdCAtIHBvbGwgZG9lc24ndCBrbm93CisJCSAqIGFib3V0IHN0ZGlvIGJ1ZmZlcmluZyBhbmQgY2FuIHJlc3VsdCBpbiBzcHVyaW91cyBvbmUgc2Vjb25kIHdhaXRzIQorCQkgKi8KKwl9CisKKwkvKiBJZiAtYyBmYWlsZWQsIHdlIHJlc3RhcnQgZnJvbSB0aGUgYmVnaW5uaW5nLAorCSAqIGJ1dCB3ZSBkbyBub3QgdHJ1bmNhdGUgZmlsZSB0aGVuLCB3ZSBkbyBpdCBvbmx5IG5vdywgYXQgdGhlIGVuZC4KKwkgKiBUaGlzIGxldHMgdXNlciB0byBeQyBpZiBoaXMgOTklIGNvbXBsZXRlIDEwIEdCIGZpbGUgZG93bmxvYWQKKwkgKiBmYWlsZWQgdG8gcmVzdGFydCAqd2l0aG91dCogbG9zaW5nIHRoZSBhbG1vc3QgY29tcGxldGUgZmlsZS4KKwkgKi8KKwl7CisJCW9mZl90IHBvcyA9IGxzZWVrKEcub3V0cHV0X2ZkLCAwLCBTRUVLX0NVUik7CisJCWlmIChwb3MgIT0gKG9mZl90KS0xKQorCQkJZnRydW5jYXRlKEcub3V0cHV0X2ZkLCBwb3MpOworCX0KKworCS8qIERyYXcgZnVsbCBiYXIgYW5kIGZyZWUgaXRzIHJlc291cmNlcyAqLworCUcuY2h1bmtlZCA9IDA7ICAvKiBtYWtlcyBpdCBzaG93IDEwMCUgZXZlbiBmb3IgY2h1bmtlZCBkb3dubG9hZCAqLworCUcuZ290X2NsZW4gPSAxOyAvKiBtYWtlcyBpdCBzaG93IDEwMCUgZXZlbiBmb3IgZG93bmxvYWQgb2YgKGZvcm1lcmx5KSB1bmtub3duIHNpemUgKi8KKwlwcm9ncmVzc19tZXRlcihQUk9HUkVTU19FTkQpOworfQorCitzdGF0aWMgdm9pZCBkb3dubG9hZF9vbmVfdXJsKGNvbnN0IGNoYXIgKnVybCkKK3sKKwlib29sIHVzZV9wcm94eTsgICAgICAgICAgICAgICAgIC8qIFVzZSBwcm94aWVzIGlmIGVudiB2YXJzIGFyZSBzZXQgICovCisJaW50IHJlZGlyX2xpbWl0OworCWxlbl9hbmRfc29ja2FkZHIgKmxzYTsKKwlGSUxFICpzZnA7ICAgICAgICAgICAgICAgICAgICAgIC8qIHNvY2tldCB0byB3ZWIvZnRwIHNlcnZlciAgICAgICAgICovCisJRklMRSAqZGZwOyAgICAgICAgICAgICAgICAgICAgICAvKiBzb2NrZXQgdG8gZnRwIHNlcnZlciAoZGF0YSkgICAgICAqLworCWNoYXIgKnByb3h5ID0gTlVMTDsKKwljaGFyICpmbmFtZV9vdXRfYWxsb2M7CisJY2hhciAqcmVkaXJlY3RlZF9wYXRoID0gTlVMTDsKKwlzdHJ1Y3QgaG9zdF9pbmZvIHNlcnZlcjsKKwlzdHJ1Y3QgaG9zdF9pbmZvIHRhcmdldDsKKworCXNlcnZlci5hbGxvY2F0ZWQgPSBOVUxMOworCXRhcmdldC5hbGxvY2F0ZWQgPSBOVUxMOworCXNlcnZlci51c2VyID0gTlVMTDsKKwl0YXJnZXQudXNlciA9IE5VTEw7CisKKwlwYXJzZV91cmwodXJsLCAmdGFyZ2V0KTsKKworCS8qIFVzZSB0aGUgcHJveHkgaWYgbmVjZXNzYXJ5ICovCisJdXNlX3Byb3h5ID0gKHN0cmNtcChHLnByb3h5X2ZsYWcsICJvZmYiKSAhPSAwKTsKKwlpZiAodXNlX3Byb3h5KSB7CisJCXByb3h5ID0gZ2V0ZW52KHRhcmdldC5wcm90b2NvbCA9PSBQX0ZUUCA/ICJmdHBfcHJveHkiIDogImh0dHBfcHJveHkiKTsKKy8vRklYTUU6IHdoYXQgaWYgcHJvdG9jb2wgaXMgaHR0cHM/IE9rIHRvIHVzZSBodHRwX3Byb3h5PworCQl1c2VfcHJveHkgPSAocHJveHkgJiYgcHJveHlbMF0pOworCQlpZiAodXNlX3Byb3h5KQorCQkJcGFyc2VfdXJsKHByb3h5LCAmc2VydmVyKTsKKwl9CisJaWYgKCF1c2VfcHJveHkpIHsKKwkJc2VydmVyLnBvcnQgPSB0YXJnZXQucG9ydDsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0lQVjYpIHsKKwkJCS8vZnJlZShzZXJ2ZXIuYWxsb2NhdGVkKTsgLSBjYW4ndCBiZSBub24tTlVMTAorCQkJc2VydmVyLmhvc3QgPSBzZXJ2ZXIuYWxsb2NhdGVkID0geHN0cmR1cCh0YXJnZXQuaG9zdCk7CisJCX0gZWxzZSB7CisJCQlzZXJ2ZXIuaG9zdCA9IHRhcmdldC5ob3N0OworCQl9CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0lQVjYpCisJCXN0cmlwX2lwdjZfc2NvcGVfaWQodGFyZ2V0Lmhvc3QpOworCisJLyogSWYgdGhlcmUgd2FzIG5vIC1PIEZJTEUsIGd1ZXNzIG91dHB1dCBmaWxlbmFtZSAqLworCWZuYW1lX291dF9hbGxvYyA9IE5VTEw7CisJaWYgKCEob3B0aW9uX21hc2szMiAmIFdHRVRfT1BUX09VVE5BTUUpKSB7CisJCUcuZm5hbWVfb3V0ID0gYmJfZ2V0X2xhc3RfcGF0aF9jb21wb25lbnRfbm9zdHJpcCh0YXJnZXQucGF0aCk7CisJCS8qIGhhbmRsZSAid2dldCBodHRwOi8va2VybmVsLm9yZy8vIiAqLworCQlpZiAoRy5mbmFtZV9vdXRbMF0gPT0gJy8nIHx8ICFHLmZuYW1lX291dFswXSkKKwkJCUcuZm5hbWVfb3V0ID0gKGNoYXIqKSJpbmRleC5odG1sIjsKKwkJLyogLVAgRElSIGlzIGNvbnNpZGVyZWQgb25seSBpZiB0aGVyZSB3YXMgbm8gLU8gRklMRSAqLworCQlpZiAoRy5kaXJfcHJlZml4KQorCQkJRy5mbmFtZV9vdXQgPSBmbmFtZV9vdXRfYWxsb2MgPSBjb25jYXRfcGF0aF9maWxlKEcuZGlyX3ByZWZpeCwgRy5mbmFtZV9vdXQpOworCQllbHNlIHsKKwkJCS8qIHJlZGlyZWN0cyBtYXkgZnJlZSB0YXJnZXQucGF0aCBsYXRlciwgbmVlZCB0byBtYWtlIGEgY29weSAqLworCQkJRy5mbmFtZV9vdXQgPSBmbmFtZV9vdXRfYWxsb2MgPSB4c3RyZHVwKEcuZm5hbWVfb3V0KTsKKwkJfQorCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9XR0VUX1NUQVRVU0JBUgorCUcuY3VyZmlsZSA9IGJiX2dldF9sYXN0X3BhdGhfY29tcG9uZW50X25vc3RyaXAoRy5mbmFtZV9vdXQpOworI2VuZGlmCisKKwkvKiBEZXRlcm1pbmUgd2hlcmUgdG8gc3RhcnQgdHJhbnNmZXIgKi8KKwlHLmJlZ19yYW5nZSA9IDA7CisJaWYgKG9wdGlvbl9tYXNrMzIgJiBXR0VUX09QVF9DT05USU5VRSkgeworCQlHLm91dHB1dF9mZCA9IG9wZW4oRy5mbmFtZV9vdXQsIE9fV1JPTkxZKTsKKwkJaWYgKEcub3V0cHV0X2ZkID49IDApIHsKKwkJCUcuYmVnX3JhbmdlID0geGxzZWVrKEcub3V0cHV0X2ZkLCAwLCBTRUVLX0VORCk7CisJCX0KKwkJLyogRmlsZSBkb2Vzbid0IGV4aXN0LiBXZSBkbyBub3QgY3JlYXRlIGZpbGUgaGVyZSB5ZXQuCisJCSAqIFdlIGFyZSBub3Qgc3VyZSBpdCBleGlzdHMgb24gcmVtb3RlIHNpZGUgKi8KKwl9CisKKwlyZWRpcl9saW1pdCA9IDU7CisgcmVzb2x2ZV9sc2E6CisJbHNhID0geGhvc3Qyc29ja2FkZHIoc2VydmVyLmhvc3QsIHNlcnZlci5wb3J0KTsKKwlpZiAoIShvcHRpb25fbWFzazMyICYgV0dFVF9PUFRfUVVJRVQpKSB7CisJCWNoYXIgKnMgPSB4bWFsbG9jX3NvY2thZGRyMmRvdHRlZCgmbHNhLT51LnNhKTsKKwkJZnByaW50ZihzdGRlcnIsICJDb25uZWN0aW5nIHRvICVzICglcylcbiIsIHNlcnZlci5ob3N0LCBzKTsKKwkJZnJlZShzKTsKKwl9CisgZXN0YWJsaXNoX3Nlc3Npb246CisJLypHLmNvbnRlbnRfbGVuID0gMDsgLSByZWR1bmRhbnQsIGdvdF9jbGVuID0gMCBpcyBlbm91Z2ggKi8KKwlHLmdvdF9jbGVuID0gMDsKKwlHLmNodW5rZWQgPSAwOworCWlmICh1c2VfcHJveHkgfHwgdGFyZ2V0LnByb3RvY29sICE9IFBfRlRQKSB7CisJCS8qCisJCSAqICBIVFRQIHNlc3Npb24KKwkJICovCisJCWNoYXIgKnN0cjsKKwkJaW50IHN0YXR1czsKKworCQkvKiBPcGVuIHNvY2tldCB0byBodHRwKHMpIHNlcnZlciAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfT1BFTlNTTAorCQkvKiBvcGVuc3NsIChhbmQgbWF5YmUgc3NsX2hlbHBlcikgc3VwcG9ydCBpcyBjb25maWd1cmVkICovCisJCWlmICh0YXJnZXQucHJvdG9jb2wgPT0gUF9IVFRQUykgeworCQkJLyogb3BlbnNzbC1iYXNlZCBoZWxwZXIKKwkJCSAqIEluY29udmVuaWVudCBBUEkgc2luY2Ugd2UgY2FuJ3QgZ2l2ZSBpdCBhbiBvcGVuIGZkCisJCQkgKi8KKwkJCWludCBmZCA9IHNwYXduX2h0dHBzX2hlbHBlcl9vcGVuc3NsKHNlcnZlci5ob3N0LCBzZXJ2ZXIucG9ydCk7CisjIGlmIEVOQUJMRV9GRUFUVVJFX1dHRVRfU1NMX0hFTFBFUgorCQkJaWYgKGZkIDwgMCkgeyAvKiBubyBvcGVuc3NsPyB0cnkgc3NsX2hlbHBlciAqLworCQkJCXNmcCA9IG9wZW5fc29ja2V0KGxzYSk7CisJCQkJc3Bhd25faHR0cHNfaGVscGVyX3NtYWxsKGZpbGVubyhzZnApKTsKKwkJCQlnb3RvIHNvY2tldF9vcGVuZWQ7CisJCQl9CisjIGVsc2UKKwkJCS8qIFdlIGRvbid0IGNoZWNrIGZvciBleGVjKCJvcGVuc3NsIikgZmFpbHVyZSBpbiB0aGlzIGNhc2UgKi8KKyMgZW5kaWYKKwkJCXNmcCA9IGZkb3BlbihmZCwgInIrIik7CisJCQlpZiAoIXNmcCkKKwkJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX21lbW9yeV9leGhhdXN0ZWQpOworCQkJZ290byBzb2NrZXRfb3BlbmVkOworCQl9CisJCXNmcCA9IG9wZW5fc29ja2V0KGxzYSk7Cisgc29ja2V0X29wZW5lZDoKKyNlbGlmIEVOQUJMRV9GRUFUVVJFX1dHRVRfU1NMX0hFTFBFUgorCQkvKiBPbmx5IHNzbF9oZWxwZXIgc3VwcG9ydCBpcyBjb25maWd1cmVkICovCisJCXNmcCA9IG9wZW5fc29ja2V0KGxzYSk7CisJCWlmICh0YXJnZXQucHJvdG9jb2wgPT0gUF9IVFRQUykKKwkJCXNwYXduX2h0dHBzX2hlbHBlcl9zbWFsbChmaWxlbm8oc2ZwKSk7CisjZWxzZQorCQkvKiBzc2wgKGh0dHBzKSBzdXBwb3J0IGlzIG5vdCBjb25maWd1cmVkICovCisJCXNmcCA9IG9wZW5fc29ja2V0KGxzYSk7CisjZW5kaWYKKwkJLyogU2VuZCBIVFRQIHJlcXVlc3QgKi8KKwkJaWYgKHVzZV9wcm94eSkgeworCQkJU0VOREZNVChzZnAsICJHRVQgJXM6Ly8lcy8lcyBIVFRQLzEuMVxyXG4iLAorCQkJCXRhcmdldC5wcm90b2NvbCwgdGFyZ2V0Lmhvc3QsCisJCQkJdGFyZ2V0LnBhdGgpOworCQl9IGVsc2UgeworCQkJU0VOREZNVChzZnAsICIlcyAvJXMgSFRUUC8xLjFcclxuIiwKKwkJCQkob3B0aW9uX21hc2szMiAmIFdHRVRfT1BUX1BPU1RfREFUQSkgPyAiUE9TVCIgOiAiR0VUIiwKKwkJCQl0YXJnZXQucGF0aCk7CisJCX0KKwkJaWYgKCFVU1JfSEVBREVSX0hPU1QpCisJCQlTRU5ERk1UKHNmcCwgIkhvc3Q6ICVzXHJcbiIsIHRhcmdldC5ob3N0KTsKKwkJaWYgKCFVU1JfSEVBREVSX1VTRVJfQUdFTlQpCisJCQlTRU5ERk1UKHNmcCwgIlVzZXItQWdlbnQ6ICVzXHJcbiIsIEcudXNlcl9hZ2VudCk7CisKKwkJLyogQXNrIHNlcnZlciB0byBjbG9zZSB0aGUgY29ubmVjdGlvbiBhcyBzb29uIGFzIHdlIGFyZSBkb25lCisJCSAqIChJT1c6IHdlIGRvIG5vdCBpbnRlbmQgdG8gc2VuZCBtb3JlIHJlcXVlc3RzKQorCQkgKi8KKwkJU0VOREZNVChzZnAsICJDb25uZWN0aW9uOiBjbG9zZVxyXG4iKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfQVVUSEVOVElDQVRJT04KKwkJaWYgKHRhcmdldC51c2VyICYmICFVU1JfSEVBREVSX0FVVEgpIHsKKwkJCVNFTkRGTVQoc2ZwLCAiUHJveHktQXV0aG9yaXphdGlvbjogQmFzaWMgJXNcclxuIis2LAorCQkJCWJhc2U2NGVuYyh0YXJnZXQudXNlcikpOworCQl9CisJCWlmICh1c2VfcHJveHkgJiYgc2VydmVyLnVzZXIgJiYgIVVTUl9IRUFERVJfUFJPWFlfQVVUSCkgeworCQkJU0VOREZNVChzZnAsICJQcm94eS1BdXRob3JpemF0aW9uOiBCYXNpYyAlc1xyXG4iLAorCQkJCWJhc2U2NGVuYyhzZXJ2ZXIudXNlcikpOworCQl9CisjZW5kaWYKKworCQlpZiAoRy5iZWdfcmFuZ2UgIT0gMCAmJiAhVVNSX0hFQURFUl9SQU5HRSkKKwkJCVNFTkRGTVQoc2ZwLCAiUmFuZ2U6IGJ5dGVzPSUiT0ZGX0ZNVCJ1LVxyXG4iLCBHLmJlZ19yYW5nZSk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9XR0VUX0xPTkdfT1BUSU9OUworCQlpZiAoRy5leHRyYV9oZWFkZXJzKSB7CisJCQlsb2dfaW8oRy5leHRyYV9oZWFkZXJzKTsKKwkJCWZwdXRzKEcuZXh0cmFfaGVhZGVycywgc2ZwKTsKKwkJfQorCisJCWlmIChvcHRpb25fbWFzazMyICYgV0dFVF9PUFRfUE9TVF9EQVRBKSB7CisJCQlTRU5ERk1UKHNmcCwKKwkJCQkiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcclxuIgorCQkJCSJDb250ZW50LUxlbmd0aDogJXVcclxuIgorCQkJCSJcclxuIgorCQkJCSIlcyIsCisJCQkJKGludCkgc3RybGVuKEcucG9zdF9kYXRhKSwgRy5wb3N0X2RhdGEKKwkJCSk7CisJCX0gZWxzZQorI2VuZGlmCisJCXsKKwkJCVNFTkRGTVQoc2ZwLCAiXHJcbiIpOworCQl9CisKKwkJZmZsdXNoKHNmcCk7CisKKwkJLyoKKwkJICogUmV0cmlldmUgSFRUUCByZXNwb25zZSBsaW5lIGFuZCBjaGVjayBmb3IgIjIwMCIgc3RhdHVzIGNvZGUuCisJCSAqLworIHJlYWRfcmVzcG9uc2U6CisJCWZnZXRzX2FuZF90cmltKHNmcCk7CisKKwkJc3RyID0gRy53Z2V0X2J1ZjsKKwkJc3RyID0gc2tpcF9ub25fd2hpdGVzcGFjZShzdHIpOworCQlzdHIgPSBza2lwX3doaXRlc3BhY2Uoc3RyKTsKKwkJLy8gRklYTUU6IG5vIGVycm9yIGNoZWNrCisJCS8vIHhhdG91IHdvdWxkbid0IHdvcms6ICIyMDAgT0siCisJCXN0YXR1cyA9IGF0b2koc3RyKTsKKwkJc3dpdGNoIChzdGF0dXMpIHsKKwkJY2FzZSAwOgorCQljYXNlIDEwMDoKKwkJCXdoaWxlIChnZXRoZHIoc2ZwKSAhPSBOVUxMKQorCQkJCS8qIGVhdCBhbGwgcmVtYWluaW5nIGhlYWRlcnMgKi87CisJCQlnb3RvIHJlYWRfcmVzcG9uc2U7CisJCWNhc2UgMjAwOgorLyoKK1Jlc3BvbnNlIDIwNCBkb2Vzbid0IHNheSAibnVsbCBmaWxlIiwgaXQgc2F5cyAibWV0YWRhdGEKK2hhcyBjaGFuZ2VkIGJ1dCBkYXRhIGRpZG4ndCI6CisKKyIxMC4yLjUgMjA0IE5vIENvbnRlbnQKK1RoZSBzZXJ2ZXIgaGFzIGZ1bGZpbGxlZCB0aGUgcmVxdWVzdCBidXQgZG9lcyBub3QgbmVlZCB0byByZXR1cm4KK2FuIGVudGl0eS1ib2R5LCBhbmQgbWlnaHQgd2FudCB0byByZXR1cm4gdXBkYXRlZCBtZXRhaW5mb3JtYXRpb24uCitUaGUgcmVzcG9uc2UgTUFZIGluY2x1ZGUgbmV3IG9yIHVwZGF0ZWQgbWV0YWluZm9ybWF0aW9uIGluIHRoZSBmb3JtCitvZiBlbnRpdHktaGVhZGVycywgd2hpY2ggaWYgcHJlc2VudCBTSE9VTEQgYmUgYXNzb2NpYXRlZCB3aXRoCit0aGUgcmVxdWVzdGVkIHZhcmlhbnQuCisKK0lmIHRoZSBjbGllbnQgaXMgYSB1c2VyIGFnZW50LCBpdCBTSE9VTEQgTk9UIGNoYW5nZSBpdHMgZG9jdW1lbnQKK3ZpZXcgZnJvbSB0aGF0IHdoaWNoIGNhdXNlZCB0aGUgcmVxdWVzdCB0byBiZSBzZW50LiBUaGlzIHJlc3BvbnNlCitpcyBwcmltYXJpbHkgaW50ZW5kZWQgdG8gYWxsb3cgaW5wdXQgZm9yIGFjdGlvbnMgdG8gdGFrZSBwbGFjZQord2l0aG91dCBjYXVzaW5nIGEgY2hhbmdlIHRvIHRoZSB1c2VyIGFnZW50J3MgYWN0aXZlIGRvY3VtZW50IHZpZXcsCithbHRob3VnaCBhbnkgbmV3IG9yIHVwZGF0ZWQgbWV0YWluZm9ybWF0aW9uIFNIT1VMRCBiZSBhcHBsaWVkCit0byB0aGUgZG9jdW1lbnQgY3VycmVudGx5IGluIHRoZSB1c2VyIGFnZW50J3MgYWN0aXZlIHZpZXcuCisKK1RoZSAyMDQgcmVzcG9uc2UgTVVTVCBOT1QgaW5jbHVkZSBhIG1lc3NhZ2UtYm9keSwgYW5kIHRodXMKK2lzIGFsd2F5cyB0ZXJtaW5hdGVkIGJ5IHRoZSBmaXJzdCBlbXB0eSBsaW5lIGFmdGVyIHRoZSBoZWFkZXIgZmllbGRzLiIKKworSG93ZXZlciwgaW4gcmVhbCB3b3JsZCBpdCB3YXMgb2JzZXJ2ZWQgdGhhdCBzb21lIHdlYiBzZXJ2ZXJzCisoZS5nLiBCb2EvMC45NC4xNHJjMjEpIHNpbXBseSB1c2UgY29kZSAyMDQgd2hlbiBmaWxlIHNpemUgaXMgemVyby4KKyovCisJCWNhc2UgMjA0OgorCQkJaWYgKEcuYmVnX3JhbmdlICE9IDApIHsKKwkJCQkvKiAiUmFuZ2U6Li4uIiB3YXMgbm90IGhvbm9yZWQgYnkgdGhlIHNlcnZlci4KKwkJCQkgKiBSZXN0YXJ0IGRvd25sb2FkIGZyb20gdGhlIGJlZ2lubmluZy4KKwkJCQkgKi8KKwkJCQlyZXNldF9iZWdfcmFuZ2VfdG9femVybygpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMzAwOiAgLyogcmVkaXJlY3Rpb24gKi8KKwkJY2FzZSAzMDE6CisJCWNhc2UgMzAyOgorCQljYXNlIDMwMzoKKwkJCWJyZWFrOworCQljYXNlIDIwNjogLyogUGFydGlhbCBDb250ZW50ICovCisJCQlpZiAoRy5iZWdfcmFuZ2UgIT0gMCkKKwkJCQkvKiAiUmFuZ2U6Li4uIiB3b3JrZWQuIEdvb2QuICovCisJCQkJYnJlYWs7CisJCQkvKiBQYXJ0aWFsIENvbnRlbnQgZXZlbiB0aG91Z2ggd2UgZGlkIG5vdCBhc2sgZm9yIGl0Pz8/ICovCisJCQkvKiBmYWxsIHRocm91Z2ggKi8KKwkJZGVmYXVsdDoKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzZXJ2ZXIgcmV0dXJuZWQgZXJyb3I6ICVzIiwgc2FuaXRpemVfc3RyaW5nKEcud2dldF9idWYpKTsKKwkJfQorCisJCS8qCisJCSAqIFJldHJpZXZlIEhUVFAgaGVhZGVycy4KKwkJICovCisJCXdoaWxlICgoc3RyID0gZ2V0aGRyKHNmcCkpICE9IE5VTEwpIHsKKwkJCXN0YXRpYyBjb25zdCBjaGFyIGtleXdvcmRzW10gQUxJR04xID0KKwkJCQkiY29udGVudC1sZW5ndGhcMCIidHJhbnNmZXItZW5jb2RpbmdcMCIibG9jYXRpb25cMCI7CisJCQllbnVtIHsKKwkJCQlLRVlfY29udGVudF9sZW5ndGggPSAxLCBLRVlfdHJhbnNmZXJfZW5jb2RpbmcsIEtFWV9sb2NhdGlvbgorCQkJfTsKKwkJCXNtYWxsdWludCBrZXk7CisKKwkJCS8qIGdldGhkciBjb252ZXJ0ZWQgIkZPTzoiIHN0cmluZyB0byBsb3dlcmNhc2UgKi8KKworCQkJLyogc3RyaXAgdHJhaWxpbmcgd2hpdGVzcGFjZSAqLworCQkJY2hhciAqcyA9IHN0cmNocm51bChzdHIsICdcMCcpIC0gMTsKKwkJCXdoaWxlIChzID49IHN0ciAmJiAoKnMgPT0gJyAnIHx8ICpzID09ICdcdCcpKSB7CisJCQkJKnMgPSAnXDAnOworCQkJCXMtLTsKKwkJCX0KKwkJCWtleSA9IGluZGV4X2luX3N0cmluZ3Moa2V5d29yZHMsIEcud2dldF9idWYpICsgMTsKKwkJCWlmIChrZXkgPT0gS0VZX2NvbnRlbnRfbGVuZ3RoKSB7CisJCQkJRy5jb250ZW50X2xlbiA9IEJCX1NUUlRPT0ZGKHN0ciwgTlVMTCwgMTApOworCQkJCWlmIChHLmNvbnRlbnRfbGVuIDwgMCB8fCBlcnJubykgeworCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY29udGVudC1sZW5ndGggJXMgaXMgZ2FyYmFnZSIsIHNhbml0aXplX3N0cmluZyhzdHIpKTsKKwkJCQl9CisJCQkJRy5nb3RfY2xlbiA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoa2V5ID09IEtFWV90cmFuc2Zlcl9lbmNvZGluZykgeworCQkJCWlmIChzdHJjbXAoc3RyX3RvbG93ZXIoc3RyKSwgImNodW5rZWQiKSAhPSAwKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidHJhbnNmZXIgZW5jb2RpbmcgJyVzJyBpcyBub3Qgc3VwcG9ydGVkIiwgc2FuaXRpemVfc3RyaW5nKHN0cikpOworCQkJCUcuY2h1bmtlZCA9IDE7CisJCQl9CisJCQlpZiAoa2V5ID09IEtFWV9sb2NhdGlvbiAmJiBzdGF0dXMgPj0gMzAwKSB7CisJCQkJaWYgKC0tcmVkaXJfbGltaXQgPT0gMCkKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRvbyBtYW55IHJlZGlyZWN0aW9ucyIpOworCQkJCWZjbG9zZShzZnApOworCQkJCWlmIChzdHJbMF0gPT0gJy8nKSB7CisJCQkJCWZyZWUocmVkaXJlY3RlZF9wYXRoKTsKKwkJCQkJdGFyZ2V0LnBhdGggPSByZWRpcmVjdGVkX3BhdGggPSB4c3RyZHVwKHN0cisxKTsKKwkJCQkJLyogbHNhIHN0YXlzIHRoZSBzYW1lOiBpdCdzIG9uIHRoZSBzYW1lIHNlcnZlciAqLworCQkJCX0gZWxzZSB7CisJCQkJCXBhcnNlX3VybChzdHIsICZ0YXJnZXQpOworCQkJCQlpZiAoIXVzZV9wcm94eSkgeworCQkJCQkJLyogc2VydmVyLnVzZXIgcmVtYWlucyB1bnRvdWNoZWQgKi8KKwkJCQkJCWZyZWUoc2VydmVyLmFsbG9jYXRlZCk7CisJCQkJCQlzZXJ2ZXIuYWxsb2NhdGVkID0gTlVMTDsKKwkJCQkJCXNlcnZlci5ob3N0ID0gdGFyZ2V0Lmhvc3Q7CisJCQkJCQkvKiBzdHJpcF9pcHY2X3Njb3BlX2lkKHRhcmdldC5ob3N0KTsgLSBubyEgKi8KKwkJCQkJCS8qIHdlIGFzc3VtZSByZW1vdGUgbmV2ZXIgZ2l2ZXMgdXMgSVB2NiBhZGRyIHdpdGggc2NvcGUgaWQgKi8KKwkJCQkJCXNlcnZlci5wb3J0ID0gdGFyZ2V0LnBvcnQ7CisJCQkJCQlmcmVlKGxzYSk7CisJCQkJCQlnb3RvIHJlc29sdmVfbHNhOworCQkJCQl9IC8qIGVsc2U6IGxzYSBzdGF5cyB0aGUgc2FtZTogd2UgdXNlIHByb3h5ICovCisJCQkJfQorCQkJCWdvdG8gZXN0YWJsaXNoX3Nlc3Npb247CisJCQl9CisJCX0KKy8vCQlpZiAoc3RhdHVzID49IDMwMCkKKy8vCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCByZWRpcmVjdGlvbiAobm8gTG9jYXRpb246IGhlYWRlciBmcm9tIHNlcnZlcikiKTsKKworCQkvKiBGb3IgSFRUUCwgZGF0YSBpcyBwdW1wZWQgb3ZlciB0aGUgc2FtZSBjb25uZWN0aW9uICovCisJCWRmcCA9IHNmcDsKKwl9IGVsc2UgeworCQkvKgorCQkgKiAgRlRQIHNlc3Npb24KKwkJICovCisJCXNmcCA9IHByZXBhcmVfZnRwX3Nlc3Npb24oJmRmcCwgJnRhcmdldCwgbHNhKTsKKwl9CisKKwlmcmVlKGxzYSk7CisKKwlpZiAoIShvcHRpb25fbWFzazMyICYgV0dFVF9PUFRfU1BJREVSKSkgeworCQlpZiAoRy5vdXRwdXRfZmQgPCAwKQorCQkJRy5vdXRwdXRfZmQgPSB4b3BlbihHLmZuYW1lX291dCwgRy5vX2ZsYWdzKTsKKwkJcmV0cmlldmVfZmlsZV9kYXRhKGRmcCk7CisJCWlmICghKG9wdGlvbl9tYXNrMzIgJiBXR0VUX09QVF9PVVROQU1FKSkgeworCQkJeGNsb3NlKEcub3V0cHV0X2ZkKTsKKwkJCUcub3V0cHV0X2ZkID0gLTE7CisJCX0KKwl9CisKKwlpZiAoZGZwICE9IHNmcCkgeworCQkvKiBJdCdzIGZ0cC4gQ2xvc2UgZGF0YSBjb25uZWN0aW9uIHByb3Blcmx5ICovCisJCWZjbG9zZShkZnApOworCQlpZiAoZnRwY21kKE5VTEwsIE5VTEwsIHNmcCkgIT0gMjI2KQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImZ0cCBlcnJvcjogJXMiLCBzYW5pdGl6ZV9zdHJpbmcoRy53Z2V0X2J1ZiArIDQpKTsKKwkJLyogZnRwY21kKCJRVUlUIiwgTlVMTCwgc2ZwKTsgLSB3aHkgYm90aGVyPyAqLworCX0KKwlmY2xvc2Uoc2ZwKTsKKworCWZyZWUoc2VydmVyLmFsbG9jYXRlZCk7CisJZnJlZSh0YXJnZXQuYWxsb2NhdGVkKTsKKwlmcmVlKHNlcnZlci51c2VyKTsKKwlmcmVlKHRhcmdldC51c2VyKTsKKwlmcmVlKGZuYW1lX291dF9hbGxvYyk7CisJZnJlZShyZWRpcmVjdGVkX3BhdGgpOworfQorCitpbnQgd2dldF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgd2dldF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMKKwlzdGF0aWMgY29uc3QgY2hhciB3Z2V0X2xvbmdvcHRzW10gQUxJR04xID0KKwkJLyogbmFtZSwgaGFzX2FyZywgdmFsICovCisJCSJjb250aW51ZVwwIiAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJjIgorLy9GSVhNRTogLXMgaXNuJ3QgLS1zcGlkZXIsIGl0J3MgLS1zYXZlLWhlYWRlcnMhCisJCSJzcGlkZXJcMCIgICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJzIgorCQkicXVpZXRcMCIgICAgICAgICAgICBOb19hcmd1bWVudCAgICAgICAicSIKKwkJIm91dHB1dC1kb2N1bWVudFwwIiAgUmVxdWlyZWRfYXJndW1lbnQgIk8iCisJCSJkaXJlY3RvcnktcHJlZml4XDAiIFJlcXVpcmVkX2FyZ3VtZW50ICJQIgorCQkicHJveHlcMCIgICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiWSIKKwkJInVzZXItYWdlbnRcMCIgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIlUiCisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9USU1FT1VUCisJCSJ0aW1lb3V0XDAiICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJUIgorI2VuZGlmCisJCS8qIElnbm9yZWQ6ICovCisJCS8vICJ0cmllc1wwIiAgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ0IgorCQkvKiBJZ25vcmVkICh3ZSBhbHdheXMgdXNlIFBBU1YpOiAqLworCQkicGFzc2l2ZS1mdHBcMCIgICAgICBOb19hcmd1bWVudCAgICAgICAiXHhmZiIKKwkJImhlYWRlclwwIiAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgIlx4ZmUiCisJCSJwb3N0LWRhdGFcMCIgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJceGZkIgorCQkvKiBJZ25vcmVkICh3ZSBkb24ndCBkbyBzc2wpICovCisJCSJuby1jaGVjay1jZXJ0aWZpY2F0ZVwwIiBOb19hcmd1bWVudCAgICJceGZjIgorCQkvKiBJZ25vcmVkICh3ZSBkb24ndCBzdXBwb3J0IGNhY2hpbmcpICovCisJCSJuby1jYWNoZVwwIiAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJceGZiIgorCQk7CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TCisJbGxpc3RfdCAqaGVhZGVyc19sbGlzdCA9IE5VTEw7CisjZW5kaWYKKworCUlOSVRfRygpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfV0dFVF9USU1FT1VUCisJRy50aW1lb3V0X3NlY29uZHMgPSA5MDA7CisJc2lnbmFsKFNJR0FMUk0sIGFsYXJtX2hhbmRsZXIpOworI2VuZGlmCisJRy5wcm94eV9mbGFnID0gIm9uIjsgICAvKiB1c2UgcHJveGllcyBpZiBlbnYgdmFycyBhcmUgc2V0ICovCisJRy51c2VyX2FnZW50ID0gIldnZXQiOyAvKiAiVXNlci1BZ2VudCIgaGVhZGVyIGZpZWxkICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9XR0VUX0xPTkdfT1BUSU9OUworCWFwcGxldF9sb25nX29wdGlvbnMgPSB3Z2V0X2xvbmdvcHRzOworI2VuZGlmCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiCisJCQlJRl9GRUFUVVJFX1dHRVRfVElNRU9VVCgiOlQrIikKKwkJCUlGX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMoIjpceGZlOjoiKTsKKwlnZXRvcHQzMihhcmd2LCAiY3NxTzpQOlk6VTpUOiIgLyppZ25vcmVkOiovICJ0OiIsCisJCSZHLmZuYW1lX291dCwgJkcuZGlyX3ByZWZpeCwKKwkJJkcucHJveHlfZmxhZywgJkcudXNlcl9hZ2VudCwKKwkJSUZfRkVBVFVSRV9XR0VUX1RJTUVPVVQoJkcudGltZW91dF9zZWNvbmRzKSBJRl9OT1RfRkVBVFVSRV9XR0VUX1RJTUVPVVQoTlVMTCksCisJCU5VTEwgLyogLXQgUkVUUklFUyAqLworCQlJRl9GRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TKCwgJmhlYWRlcnNfbGxpc3QpCisJCUlGX0ZFQVRVUkVfV0dFVF9MT05HX09QVElPTlMoLCAmRy5wb3N0X2RhdGEpCisJKTsKKwlhcmd2ICs9IG9wdGluZDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1dHRVRfTE9OR19PUFRJT05TCisJaWYgKGhlYWRlcnNfbGxpc3QpIHsKKwkJaW50IHNpemUgPSAwOworCQljaGFyICpoZHI7CisJCWxsaXN0X3QgKmxsID0gaGVhZGVyc19sbGlzdDsKKwkJd2hpbGUgKGxsKSB7CisJCQlzaXplICs9IHN0cmxlbihsbC0+ZGF0YSkgKyAyOworCQkJbGwgPSBsbC0+bGluazsKKwkJfQorCQlHLmV4dHJhX2hlYWRlcnMgPSBoZHIgPSB4bWFsbG9jKHNpemUgKyAxKTsKKwkJd2hpbGUgKGhlYWRlcnNfbGxpc3QpIHsKKwkJCWludCBiaXQ7CisJCQljb25zdCBjaGFyICp3b3JkczsKKworCQkJc2l6ZSA9IHNwcmludGYoaGRyLCAiJXNcclxuIiwKKwkJCQkJKGNoYXIqKWxsaXN0X3BvcCgmaGVhZGVyc19sbGlzdCkpOworCQkJLyogYSBiaXQgbGlrZSBpbmRleF9pbl9zdWJzdHJpbmdzIGJ1dCBkb24ndCBtYXRjaCBmdWxsIGtleSAqLworCQkJYml0ID0gMTsKKwkJCXdvcmRzID0gd2dldF91c2VyX2hlYWRlcnM7CisJCQl3aGlsZSAoKndvcmRzKSB7CisJCQkJaWYgKHN0cnN0cihoZHIsIHdvcmRzKSA9PSBoZHIpIHsKKwkJCQkJRy51c2VyX2hlYWRlcnMgfD0gYml0OworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYml0IDw8PSAxOworCQkJCXdvcmRzICs9IHN0cmxlbih3b3JkcykgKyAxOworCQkJfQorCQkJaGRyICs9IHNpemU7CisJCX0KKwl9CisjZW5kaWYKKworCUcub3V0cHV0X2ZkID0gLTE7CisJRy5vX2ZsYWdzID0gT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fRVhDTDsKKwlpZiAoRy5mbmFtZV9vdXQpIHsgLyogLU8gRklMRSA/ICovCisJCWlmIChMT05FX0RBU0goRy5mbmFtZV9vdXQpKSB7IC8qIC1PIC0gPyAqLworCQkJRy5vdXRwdXRfZmQgPSAxOworCQkJb3B0aW9uX21hc2szMiAmPSB+V0dFVF9PUFRfQ09OVElOVUU7CisJCX0KKwkJLyogY29tcGF0IHdpdGggd2dldDogLU8gRklMRSBjYW4gb3ZlcndyaXRlICovCisJCUcub19mbGFncyA9IE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkM7CisJfQorCisJd2hpbGUgKCphcmd2KQorCQlkb3dubG9hZF9vbmVfdXJsKCphcmd2KyspOworCisJaWYgKEcub3V0cHV0X2ZkID49IDApCisJCXhjbG9zZShHLm91dHB1dF9mZCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCAmJiBFTkFCTEVfRkVBVFVSRV9XR0VUX0xPTkdfT1BUSU9OUworCWZyZWUoRy5leHRyYV9oZWFkZXJzKTsKKyNlbmRpZgorCUZJTklfRygpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL25ldHdvcmtpbmcvd2hvaXMuYyBiL25ldHdvcmtpbmcvd2hvaXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjMzMDMzCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy93aG9pcy5jCkBAIC0wLDAgKzEsNjUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHdob2lzIC0gdGlueSBjbGllbnQgZm9yIHRoZSB3aG9pcyBkaXJlY3Rvcnkgc2VydmljZQorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMSBQZXJlIE9yZ2EgPGdvdHJ1bmtzQGdtYWlsLmNvbT4KKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKy8qIFRPRE8KKyAqIEFkZCBpcHY2IHN1cHBvcnQKKyAqIEFkZCBwcm94eSBzdXBwb3J0CisgKi8KKworLy9jb25maWc6Y29uZmlnIFdIT0lTCisvL2NvbmZpZzoJYm9vbCAid2hvaXMiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgd2hvaXMgaXMgYSBjbGllbnQgZm9yIHRoZSB3aG9pcyBkaXJlY3Rvcnkgc2VydmljZQorCisvL2FwcGxldDpJRl9XSE9JUyhBUFBMRVQod2hvaXMsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfV0hPSVMpICs9IHdob2lzLm8KKworLy91c2FnZTojZGVmaW5lIHdob2lzX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWggU0VSVkVSXSBbLXAgUE9SVF0gTkFNRS4uLiIKKy8vdXNhZ2U6I2RlZmluZSB3aG9pc19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlF1ZXJ5IFdIT0lTIGluZm8gYWJvdXQgTkFNRVxuIgorLy91c2FnZTogICAgICJcbgktaCwtcAlTZXJ2ZXIgdG8gcXVlcnkiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitzdGF0aWMgdm9pZCBwaXBlX291dChpbnQgZmQpCit7CisJRklMRSAqZnA7CisJY2hhciBidWZbMTAyNF07CisKKwlmcCA9IHhmZG9wZW5fZm9yX3JlYWQoZmQpOworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKKwkJY2hhciAqcCA9IHN0cnBicmsoYnVmLCAiXHJcbiIpOworCQlpZiAocCkKKwkJCSpwID0gJ1wwJzsKKwkJcHV0cyhidWYpOworCX0KKworCWZjbG9zZShmcCk7IC8qIGNsb3NlcyBmZCB0b28gKi8KK30KKworaW50IHdob2lzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB3aG9pc19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHBvcnQgPSA0MzsKKwljb25zdCBjaGFyICpob3N0ID0gIndob2lzLXNlcnZlcnMubmV0IjsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xOnArIjsKKwlnZXRvcHQzMihhcmd2LCAiaDpwOiIsICZob3N0LCAmcG9ydCk7CisKKwlhcmd2ICs9IG9wdGluZDsKKwlkbyB7CisJCWludCBmZCA9IGNyZWF0ZV9hbmRfY29ubmVjdF9zdHJlYW1fb3JfZGllKGhvc3QsIHBvcnQpOworCQlmZHByaW50ZihmZCwgIiVzXHJcbiIsICphcmd2KTsKKwkJcGlwZV9vdXQoZmQpOworCX0KKwl3aGlsZSAoKisrYXJndik7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbmV0d29ya2luZy96Y2lwLmMgYi9uZXR3b3JraW5nL3pjaXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmEyNjliCi0tLSAvZGV2L251bGwKKysrIGIvbmV0d29ya2luZy96Y2lwLmMKQEAgLTAsMCArMSw1MjUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFJGQzM5MjcgWmVyb0NvbmYgSVB2NCBMaW5rLUxvY2FsIGFkZHJlc3NpbmcKKyAqIChzZWUgPGh0dHA6Ly93d3cuemVyb2NvbmYub3JnLz4pCisgKgorICogQ29weXJpZ2h0IChDKSAyMDAzIGJ5IEFydGh1ciB2YW4gSG9mZiAoYXZoQHN0cmFuZ2ViZXJyeS5jb20pCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgYnkgRGF2aWQgQnJvd25lbGwKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qCisgKiBaQ0lQIGp1c3QgbWFuYWdlcyB0aGUgMTY5LjI1NC4qLiogYWRkcmVzc2VzLiAgVGhhdCBuZXR3b3JrIGlzIG5vdAorICogcm91dGVkIGF0IHRoZSBJUCBsZXZlbCwgdGhvdWdoIHZhcmlvdXMgcHJveGllcyBvciBicmlkZ2VzIGNhbgorICogY2VydGFpbmx5IGJlIHVzZWQuICBJdHMgbmFtaW5nIGlzIGJ1aWx0IG92ZXIgbXVsdGljYXN0IEROUy4KKyAqLworCisvLyNkZWZpbmUgREVCVUcKKworLy8gVE9ETzoKKy8vIC0gbW9yZSByZWFsLXdvcmxkIHVzYWdlL3Rlc3RpbmcsIGVzcGVjaWFsbHkgZGFlbW9uIG1vZGUKKy8vIC0ga2VybmVsIHBhY2tldCBmaWx0ZXJzIHRvIHJlZHVjZSBzY2hlZHVsaW5nIG5vaXNlCisvLyAtIGF2b2lkIHNpbGVudCBzY3JpcHQgZmFpbHVyZXMsIGVzcGVjaWFsbHkgdW5kZXIgbG9hZC4uLgorLy8gLSBsaW5rIHN0YXR1cyBtb25pdG9yaW5nIChyZXN0YXJ0IG9uIGxpbmstdXA7IHN0b3Agb24gbGluay1kb3duKQorCisvL3VzYWdlOiNkZWZpbmUgemNpcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIElGQUNFIFNDUklQVCIKKy8vdXNhZ2U6I2RlZmluZSB6Y2lwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTWFuYWdlIGEgWmVyb0NvbmYgSVB2NCBsaW5rLWxvY2FsIGFkZHJlc3NcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJCVJ1biBpbiBmb3JlZ3JvdW5kIgorLy91c2FnZTogICAgICJcbgktcQkJUXVpdCBhZnRlciBvYnRhaW5pbmcgYWRkcmVzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXIgMTY5LjI1NC54LngJUmVxdWVzdCB0aGlzIGFkZHJlc3MgZmlyc3QiCisvL3VzYWdlOiAgICAgIlxuCS1sIHgueC4wLjAJVXNlIHRoaXMgcmFuZ2UgaW5zdGVhZCBvZiAxNjkuMjU0IgorLy91c2FnZTogICAgICJcbgktdgkJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuJExPR0dJTkc9bm9uZQkJU3VwcHJlc3MgbG9nZ2luZyIKKy8vdXNhZ2U6ICAgICAiXG4kTE9HR0lORz1zeXNsb2cgCUxvZyB0byBzeXNsb2ciCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbldpdGggbm8gLXEsIHJ1bnMgY29udGludW91c2x5IG1vbml0b3JpbmcgZm9yIEFSUCBjb25mbGljdHMsIgorLy91c2FnZTogICAgICJcbmV4aXRzIG9ubHkgb24gSS9PIGVycm9ycyAobGluayBkb3duIGV0YykiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPG5ldGluZXQvZXRoZXIuaD4KKyNpbmNsdWRlIDxuZXQvaWYuaD4KKyNpbmNsdWRlIDxuZXQvaWZfYXJwLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lvcy5oPgorCisjaW5jbHVkZSA8c3lzbG9nLmg+CisKKy8qIFdlIGRvbid0IG5lZWQgbW9yZSB0aGFuIDMyIGJpdHMgb2YgdGhlIGNvdW50ZXIgKi8KKyNkZWZpbmUgTU9OT1RPTklDX1VTKCkgKCh1bnNpZ25lZCltb25vdG9uaWNfdXMoKSkKKworc3RydWN0IGFycF9wYWNrZXQgeworCXN0cnVjdCBldGhlcl9oZWFkZXIgZXRoOworCXN0cnVjdCBldGhlcl9hcnAgYXJwOworfSBQQUNLRUQ7CisKK2VudW0geworCS8qIDAtMSBzZWNvbmRzIGJlZm9yZSBzZW5kaW5nIDFzdCBwcm9iZSAqLworCVBST0JFX1dBSVQgPSAxLAorCS8qIDEtMiBzZWNvbmRzIGJldHdlZW4gcHJvYmVzICovCisJUFJPQkVfTUlOID0gMSwKKwlQUk9CRV9NQVggPSAyLAorCVBST0JFX05VTSA9IDMsCQkvKiB0b3RhbCBwcm9iZXMgdG8gc2VuZCAqLworCUFOTk9VTkNFX0lOVEVSVkFMID0gMiwgIC8qIDIgc2Vjb25kcyBiZXR3ZWVuIGFubm91bmNlcyAqLworCUFOTk9VTkNFX05VTSA9IDMsCS8qIGFubm91bmNlcyB0byBzZW5kICovCisJLyogaWYgcHJvYmUvYW5ub3VuY2Ugc2VlcyBhIGNvbmZsaWN0LCBtdWx0aXBseSBSQU5ET00oTlVNX0NPTkZMSUNUKSBieS4uLiAqLworCUNPTkZMSUNUX01VTFRJUExJRVIgPSAyLAorCS8qIGlmIHdlIG1vbml0b3IgYW5kIHNlZSBhIGNvbmZsaWN0LCBob3cgbG9uZyBpcyBkZWZlbmQgc3RhdGU/ICovCisJREVGRU5EX0lOVEVSVkFMID0gMTAsCit9OworCisvKiBTdGF0ZXMgZHVyaW5nIHRoZSBjb25maWd1cmF0aW9uIHByb2Nlc3MuICovCitlbnVtIHsKKwlQUk9CRSA9IDAsCisJQU5OT1VOQ0UsCisJTU9OSVRPUiwKKwlERUZFTkQKK307CisKKyNkZWZpbmUgVkRCRyguLi4pIGRvIHsgfSB3aGlsZSAoMCkKKworCitlbnVtIHsKKwlzb2NrX2ZkID0gMworfTsKKworc3RydWN0IGdsb2JhbHMgeworCXN0cnVjdCBzb2NrYWRkciBpZmFjZV9zb2NrYWRkcjsKKwlzdHJ1Y3QgZXRoZXJfYWRkciBvdXJfZXRoYWRkcjsKKwl1aW50MzJfdCBsb2NhbG5ldF9pcDsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgfSB3aGlsZSAoMCkKKworCisvKioKKyAqIFBpY2sgYSByYW5kb20gbGluayBsb2NhbCBJUCBhZGRyZXNzIG9uIDE2OS4yNTQvMTYsIGV4Y2VwdCB0aGF0CisgKiB0aGUgZmlyc3QgYW5kIGxhc3QgMjU2IGFkZHJlc3NlcyBhcmUgcmVzZXJ2ZWQuCisgKi8KK3N0YXRpYyB1aW50MzJfdCBwaWNrX25pcCh2b2lkKQoreworCXVuc2lnbmVkIHRtcDsKKworCWRvIHsKKwkJdG1wID0gcmFuZCgpICYgSU5fQ0xBU1NCX0hPU1Q7CisJfSB3aGlsZSAodG1wID4gKElOX0NMQVNTQl9IT1NUIC0gMHgwMjAwKSk7CisJcmV0dXJuIGh0b25sKChHLmxvY2FsbmV0X2lwICsgMHgwMTAwKSArIHRtcCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpuaXBfdG9fYSh1aW50MzJfdCBuaXApCit7CisJc3RydWN0IGluX2FkZHIgaW47CisJaW4uc19hZGRyID0gbmlwOworCXJldHVybiBpbmV0X250b2EoaW4pOworfQorCisvKioKKyAqIEJyb2FkY2FzdCBhbiBBUlAgcGFja2V0LgorICovCitzdGF0aWMgdm9pZCBzZW5kX2FycF9yZXF1ZXN0KAorCS8qIGludCBvcCwgLSBhbHdheXMgQVJQT1BfUkVRVUVTVCAqLworCS8qIGNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICpzb3VyY2VfZXRoLCAtIGFsd2F5cyAmRy5vdXJfZXRoYWRkciAqLworCQkJCQl1aW50MzJfdCBzb3VyY2VfbmlwLAorCWNvbnN0IHN0cnVjdCBldGhlcl9hZGRyICp0YXJnZXRfZXRoLCB1aW50MzJfdCB0YXJnZXRfbmlwKQoreworCWVudW0geyBvcCA9IEFSUE9QX1JFUVVFU1QgfTsKKyNkZWZpbmUgc291cmNlX2V0aCAoJkcub3VyX2V0aGFkZHIpCisKKwlzdHJ1Y3QgYXJwX3BhY2tldCBwOworCW1lbXNldCgmcCwgMCwgc2l6ZW9mKHApKTsKKworCS8vIGV0aGVyIGhlYWRlcgorCXAuZXRoLmV0aGVyX3R5cGUgPSBodG9ucyhFVEhFUlRZUEVfQVJQKTsKKwltZW1jcHkocC5ldGguZXRoZXJfc2hvc3QsIHNvdXJjZV9ldGgsIEVUSF9BTEVOKTsKKwltZW1zZXQocC5ldGguZXRoZXJfZGhvc3QsIDB4ZmYsIEVUSF9BTEVOKTsKKworCS8vIGFycCByZXF1ZXN0CisJcC5hcnAuYXJwX2hyZCA9IGh0b25zKEFSUEhSRF9FVEhFUik7CisJcC5hcnAuYXJwX3BybyA9IGh0b25zKEVUSEVSVFlQRV9JUCk7CisJcC5hcnAuYXJwX2hsbiA9IEVUSF9BTEVOOworCXAuYXJwLmFycF9wbG4gPSA0OworCXAuYXJwLmFycF9vcCA9IGh0b25zKG9wKTsKKwltZW1jcHkoJnAuYXJwLmFycF9zaGEsIHNvdXJjZV9ldGgsIEVUSF9BTEVOKTsKKwltZW1jcHkoJnAuYXJwLmFycF9zcGEsICZzb3VyY2VfbmlwLCA0KTsKKwltZW1jcHkoJnAuYXJwLmFycF90aGEsIHRhcmdldF9ldGgsIEVUSF9BTEVOKTsKKwltZW1jcHkoJnAuYXJwLmFycF90cGEsICZ0YXJnZXRfbmlwLCA0KTsKKworCS8vIHNlbmQgaXQKKwkvLyBFdmVuIHRob3VnaCBzb2NrX2ZkIGlzIGFscmVhZHkgYm91bmQgdG8gRy5pZmFjZV9zb2NrYWRkciwganVzdCBzZW5kKCkKKwkvLyB3b24ndCB3b3JrLCBiZWNhdXNlICJzb2NrZXQgaXMgbm90IGNvbm5lY3RlZCIKKwkvLyAoYW5kIGNvbm5lY3QoKSB3b24ndCBmaXggdGhhdCwgIm9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIikuCisJLy8gVGh1cyB3ZSBzZW5kdG8oKSB0byBHLmlmYWNlX3NvY2thZGRyLiBJIHdvbmRlciB3aGljaCBzb2NrYWRkcgorCS8vIChmcm9tIGJpbmQoKSBvciBmcm9tIHNlbmR0bygpPykga2VybmVsIGFjdHVhbGx5IHVzZXMKKwkvLyB0byBkZXRlcm1pbmUgaWZhY2UgdG8gZW1pdCB0aGUgcGFja2V0IGZyb20uLi4KKwl4c2VuZHRvKHNvY2tfZmQsICZwLCBzaXplb2YocCksICZHLmlmYWNlX3NvY2thZGRyLCBzaXplb2YoRy5pZmFjZV9zb2NrYWRkcikpOworI3VuZGVmIHNvdXJjZV9ldGgKK30KKworLyoqCisgKiBSdW4gYSBzY3JpcHQuCisgKiBhcmd2WzBdOmludGYgYXJndlsxXTpzY3JpcHRfbmFtZSBhcmd2WzJdOmp1bmsgYXJndlszXTpOVUxMCisgKi8KK3N0YXRpYyBpbnQgcnVuKGNoYXIgKmFyZ3ZbM10sIGNvbnN0IGNoYXIgKnBhcmFtLCB1aW50MzJfdCBuaXApCit7CisJaW50IHN0YXR1czsKKwljb25zdCBjaGFyICphZGRyID0gYWRkcjsgLyogZm9yIGdjYyAqLworCWNvbnN0IGNoYXIgKmZtdCA9ICIlcyAlcyAlcyIgKyAzOworCisJYXJndlsyXSA9IChjaGFyKilwYXJhbTsKKworCVZEQkcoIiVzIHJ1biAlcyAlc1xuIiwgYXJndlswXSwgYXJndlsxXSwgYXJndlsyXSk7CisKKwlpZiAobmlwICE9IDApIHsKKwkJYWRkciA9IG5pcF90b19hKG5pcCk7CisJCXhzZXRlbnYoImlwIiwgYWRkcik7CisJCWZtdCAtPSAzOworCX0KKwliYl9pbmZvX21zZyhmbXQsIGFyZ3ZbMl0sIGFyZ3ZbMF0sIGFkZHIpOworCisJc3RhdHVzID0gc3Bhd25fYW5kX3dhaXQoYXJndiArIDEpOworCWlmIChzdGF0dXMgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2coIiVzICVzICVzIiArIDMsIGFyZ3ZbMl0sIGFyZ3ZbMF0pOworCQlyZXR1cm4gLWVycm5vOworCX0KKwlpZiAoc3RhdHVzICE9IDApCisJCWJiX2Vycm9yX21zZygic2NyaXB0ICVzICVzIGZhaWxlZCwgZXhpdGNvZGU9JWQiLCBhcmd2WzFdLCBhcmd2WzJdLCBzdGF0dXMgJiAweGZmKTsKKwlyZXR1cm4gc3RhdHVzOworfQorCisvKioKKyAqIFJldHVybiBtaWxsaXNlY29uZHMgb2YgcmFuZG9tIGRlbGF5LCB1cCB0byAic2VjcyIgc2Vjb25kcy4KKyAqLworc3RhdGljIEFMV0FZU19JTkxJTkUgdW5zaWduZWQgcmFuZG9tX2RlbGF5X21zKHVuc2lnbmVkIHNlY3MpCit7CisJcmV0dXJuICh1bnNpZ25lZClyYW5kKCkgJSAoc2VjcyAqIDEwMDApOworfQorCisvKioKKyAqIG1haW4gcHJvZ3JhbQorICovCitpbnQgemNpcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgemNpcF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqcl9vcHQ7CisJY29uc3QgY2hhciAqbF9vcHQgPSAiMTY5LjI1NC4wLjAiOworCWludCBzdGF0ZTsKKwlpbnQgbnNlbnQ7CisJdW5zaWduZWQgb3B0czsKKworCS8vIFVnbHkgdHJpY2ssIGJ1dCBJIHdhbnQgdGhlc2UgemVyb2VkIGluIG9uZSBnbworCXN0cnVjdCB7CisJCWNvbnN0IHN0cnVjdCBldGhlcl9hZGRyIG51bGxfZXRoYWRkcjsKKwkJc3RydWN0IGlmcmVxIGlmcjsKKwkJdWludDMyX3QgY2hvc2VuX25pcDsKKwkJaW50IGNvbmZsaWN0czsKKwkJaW50IHRpbWVvdXRfbXM7IC8vIG11c3QgYmUgc2lnbmVkCisJCWludCB2ZXJib3NlOworCX0gTDsKKyNkZWZpbmUgbnVsbF9ldGhhZGRyIChMLm51bGxfZXRoYWRkcikKKyNkZWZpbmUgaWZyICAgICAgICAgIChMLmlmciAgICAgICAgICkKKyNkZWZpbmUgY2hvc2VuX25pcCAgIChMLmNob3Nlbl9uaXAgICkKKyNkZWZpbmUgY29uZmxpY3RzICAgIChMLmNvbmZsaWN0cyAgICkKKyNkZWZpbmUgdGltZW91dF9tcyAgIChMLnRpbWVvdXRfbXMgICkKKyNkZWZpbmUgdmVyYm9zZSAgICAgIChMLnZlcmJvc2UgICAgICkKKworCW1lbXNldCgmTCwgMCwgc2l6ZW9mKEwpKTsKKwlJTklUX0coKTsKKworI2RlZmluZSBGT1JFR1JPVU5EIChvcHRzICYgMSkKKyNkZWZpbmUgUVVJVCAgICAgICAob3B0cyAmIDIpCisJLy8gUGFyc2UgY29tbWFuZGxpbmU6IHByb2cgW29wdGlvbnNdIGlmbmFtZSBzY3JpcHQKKwkvLyBleGFjdGx5IDIgYXJnczsgLXYgYWNjdW11bGF0ZXMgYW5kIGltcGxpZXMgLWYKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9Mjp2djp2ZiI7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJmcXI6bDp2IiwgJnJfb3B0LCAmbF9vcHQsICZ2ZXJib3NlKTsKKyNpZiAhQkJfTU1VCisJLy8gb24gTk9NTVUgcmVleGVjIGVhcmx5IChvciBlbHNlIHdlIHdpbGwgcmVydW4gdGhpbmdzIHR3aWNlKQorCWlmICghRk9SRUdST1VORCkKKwkJYmJfZGFlbW9uaXplX29yX3JleGVjKDAgLyp3YXM6IERBRU1PTl9DSERJUl9ST09UKi8sIGFyZ3YpOworI2VuZGlmCisJLy8gT3BlbiBhbiBBUlAgc29ja2V0CisJLy8gKG5lZWQgdG8gZG8gaXQgYmVmb3JlIG9wZW5sb2cgdG8gcHJldmVudCBvcGVubG9nIGZyb20gdGFraW5nCisJLy8gZmQgMyAoc29ja19mZD09MykpCisJeG1vdmVfZmQoeHNvY2tldChBRl9QQUNLRVQsIFNPQ0tfUEFDS0VULCBodG9ucyhFVEhfUF9BUlApKSwgc29ja19mZCk7CisJaWYgKCFGT1JFR1JPVU5EKSB7CisJCS8vIGRvIGl0IGJlZm9yZSBhbGwgYmJfeHhfbXNnIGNhbGxzCisJCW9wZW5sb2coYXBwbGV0X25hbWUsIDAsIExPR19EQUVNT04pOworCQlsb2dtb2RlIHw9IExPR01PREVfU1lTTE9HOworCX0KKwliYl9sb2dlbnZfb3ZlcnJpZGUoKTsKKworCXsgLy8gLWwgbi5uLm4ubgorCQlzdHJ1Y3QgaW5fYWRkciBuZXQ7CisJCWlmIChpbmV0X2F0b24obF9vcHQsICZuZXQpID09IDAKKwkJIHx8IChuZXQuc19hZGRyICYgaHRvbmwoSU5fQ0xBU1NCX05FVCkpICE9IG5ldC5zX2FkZHIKKwkJKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBuZXR3b3JrIGFkZHJlc3MiKTsKKwkJfQorCQlHLmxvY2FsbmV0X2lwID0gbnRvaGwobmV0LnNfYWRkcik7CisJfQorCWlmIChvcHRzICYgNCkgeyAvLyAtciBuLm4ubi5uCisJCXN0cnVjdCBpbl9hZGRyIGlwOworCQlpZiAoaW5ldF9hdG9uKHJfb3B0LCAmaXApID09IDAKKwkJIHx8IChudG9obChpcC5zX2FkZHIpICYgSU5fQ0xBU1NCX05FVCkgIT0gRy5sb2NhbG5ldF9pcAorCQkpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJpbnZhbGlkIGxpbmsgYWRkcmVzcyIpOworCQl9CisJCWNob3Nlbl9uaXAgPSBpcC5zX2FkZHI7CisJfQorCWFyZ3YgKz0gb3B0aW5kIC0gMTsKKworCS8qIE5vdzogYXJndlswXTpqdW5rIGFyZ3ZbMV06aW50ZiBhcmd2WzJdOnNjcmlwdCBhcmd2WzNdOk5VTEwgKi8KKwkvKiBXZSBuZWVkIHRvIG1ha2Ugc3BhY2UgZm9yIHNjcmlwdCBhcmd1bWVudDogKi8KKwlhcmd2WzBdID0gYXJndlsxXTsKKwlhcmd2WzFdID0gYXJndlsyXTsKKwkvKiBOb3c6IGFyZ3ZbMF06aW50ZiBhcmd2WzFdOnNjcmlwdCBhcmd2WzJdOmp1bmsgYXJndlszXTpOVUxMICovCisjZGVmaW5lIGFyZ3ZfaW50ZiAoYXJndlswXSkKKworCXhzZXRlbnYoImludGVyZmFjZSIsIGFyZ3ZfaW50Zik7CisKKwkvLyBJbml0aWFsaXplIHRoZSBpbnRlcmZhY2UgKG1vZHByb2JlLCBpZnVwLCBldGMpCisJaWYgKHJ1bihhcmd2LCAiaW5pdCIsIDApKQorCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCisJLy8gSW5pdGlhbGl6ZSBHLmlmYWNlX3NvY2thZGRyCisJLy8gRy5pZmFjZV9zb2NrYWRkciBpczogeyB1MTYgc2FfZmFtaWx5OyB1OCBzYV9kYXRhWzE0XTsgfQorCS8vbWVtc2V0KCZHLmlmYWNlX3NvY2thZGRyLCAwLCBzaXplb2YoRy5pZmFjZV9zb2NrYWRkcikpOworCS8vVE9ETzogYXJlIHdlIGxlYXZpbmcgc2FfZmFtaWx5ID09IDAgKEFGX1VOU1BFQyk/IQorCXNhZmVfc3RybmNweShHLmlmYWNlX3NvY2thZGRyLnNhX2RhdGEsIGFyZ3ZfaW50Ziwgc2l6ZW9mKEcuaWZhY2Vfc29ja2FkZHIuc2FfZGF0YSkpOworCisJLy8gQmluZCB0byB0aGUgaW50ZXJmYWNlJ3MgQVJQIHNvY2tldAorCXhiaW5kKHNvY2tfZmQsICZHLmlmYWNlX3NvY2thZGRyLCBzaXplb2YoRy5pZmFjZV9zb2NrYWRkcikpOworCisJLy8gR2V0IHRoZSBpbnRlcmZhY2UncyBldGhlcm5ldCBhZGRyZXNzCisJLy9tZW1zZXQoJmlmciwgMCwgc2l6ZW9mKGlmcikpOworCXN0cm5jcHlfSUZOQU1TSVooaWZyLmlmcl9uYW1lLCBhcmd2X2ludGYpOworCXhpb2N0bChzb2NrX2ZkLCBTSU9DR0lGSFdBRERSLCAmaWZyKTsKKwltZW1jcHkoJkcub3VyX2V0aGFkZHIsICZpZnIuaWZyX2h3YWRkci5zYV9kYXRhLCBFVEhfQUxFTik7CisKKwkvLyBTdGFydCB3aXRoIHNvbWUgc3RhYmxlIGlwIGFkZHJlc3MsIGVpdGhlciBhIGZ1bmN0aW9uIG9mCisJLy8gdGhlIGhhcmR3YXJlIGFkZHJlc3Mgb3IgZWxzZSB0aGUgbGFzdCBhZGRyZXNzIHdlIHVzZWQuCisJLy8gd2UgYXJlIHRha2luZyBsb3ctb3JkZXIgZm91ciBieXRlcywgYXMgdG9wLW9yZGVyIG9uZXMKKwkvLyBhcmVuJ3QgcmFuZG9tIGVub3VnaC4KKwkvLyBOT1RFOiB0aGUgc2VxdWVuY2Ugb2YgYWRkcmVzc2VzIHdlIHRyeSBjaGFuZ2VzIG9ubHkKKwkvLyBkZXBlbmRpbmcgb24gd2hlbiB3ZSBkZXRlY3QgY29uZmxpY3RzLgorCXsKKwkJdWludDMyX3QgdDsKKwkJbW92ZV9mcm9tX3VuYWxpZ25lZDMyKHQsICgoY2hhciAqKSZHLm91cl9ldGhhZGRyICsgMikpOworCQlzcmFuZCh0KTsKKwl9CisJLy8gRklYTUUgY2FzZXMgdG8gaGFuZGxlOgorCS8vICAtIHpjaXAgYWxyZWFkeSBydW5uaW5nIQorCS8vICAtIGxpbmsgYWxyZWFkeSBoYXMgbG9jYWwgYWRkcmVzcy4uLiBqdXN0IGRlZmVuZC91cGRhdGUKKworCS8vIERhZW1vbml6ZSBub3c7IGRvbid0IGRlbGF5IHN5c3RlbSBzdGFydHVwCisJaWYgKCFGT1JFR1JPVU5EKSB7CisjaWYgQkJfTU1VCisJCWJiX2RhZW1vbml6ZSgwIC8qd2FzOiBEQUVNT05fQ0hESVJfUk9PVCovKTsKKyNlbmRpZgorCQliYl9pbmZvX21zZygic3RhcnQsIGludGVyZmFjZSAlcyIsIGFyZ3ZfaW50Zik7CisJfQorCisJLy8gUnVuIHRoZSBkeW5hbWljIGFkZHJlc3MgbmVnb3RpYXRpb24gcHJvdG9jb2wsCisJLy8gcmVzdGFydGluZyBhZnRlciBhZGRyZXNzIGNvbmZsaWN0czoKKwkvLyAgLSBzdGFydCB3aXRoIHNvbWUgYWRkcmVzcyB3ZSB3YW50IHRvIHRyeQorCS8vICAtIHNob3J0IHJhbmRvbSBkZWxheQorCS8vICAtIGFycCBwcm9iZXMgdG8gc2VlIGlmIGFub3RoZXIgaG9zdCB1c2VzIGl0CisJLy8gICAgMDA6MDQ6ZTI6NjQ6MjM6YzIgPiBmZjpmZjpmZjpmZjpmZjpmZiBhcnAgd2hvLWhhcyAxNjkuMjU0LjE5NC4xNzEgdGVsbCAwLjAuMC4wCisJLy8gIC0gYXJwIGFubm91bmNlbWVudHMgdGhhdCB3ZSdyZSBjbGFpbWluZyBpdAorCS8vICAgIDAwOjA0OmUyOjY0OjIzOmMyID4gZmY6ZmY6ZmY6ZmY6ZmY6ZmYgYXJwIHdoby1oYXMgMTY5LjI1NC4xOTQuMTcxICgwMDowNDplMjo2NDoyMzpjMikgdGVsbCAxNjkuMjU0LjE5NC4xNzEKKwkvLyAgLSB1c2UgaXQKKwkvLyAgLSBkZWZlbmQgaXQsIHdpdGhpbiBsaW1pdHMKKwkvLyBleGl0IGlmOgorCS8vIC0gYWRkcmVzcyBpcyBzdWNjZXNzZnVsbHkgb2J0YWluZWQgYW5kIC1xIHdhcyBnaXZlbjoKKwkvLyAgIHJ1biAiPHNjcmlwdD4gY29uZmlnIiwgdGhlbiBleGl0IHdpdGggZXhpdGNvZGUgMAorCS8vIC0gcG9sbCBlcnJvciAod2hlbiBkb2VzIHRoaXMgaGFwcGVuPykKKwkvLyAtIHJlYWQgZXJyb3IgKHdoZW4gZG9lcyB0aGlzIGhhcHBlbj8pCisJLy8gLSBzZW5kdG8gZXJyb3IgKGluIHNlbmRfYXJwX3JlcXVlc3QoKSkgKHdoZW4gZG9lcyB0aGlzIGhhcHBlbj8pCisJLy8gLSByZXZlbnRzICYgUE9MTEVSUiAobGluayBkb3duKS4gcnVuICI8c2NyaXB0PiBkZWNvbmZpZyIgZmlyc3QKKwlpZiAoY2hvc2VuX25pcCA9PSAwKSB7CisgbmV3X25pcF9hbmRfUFJPQkU6CisJCWNob3Nlbl9uaXAgPSBwaWNrX25pcCgpOworCX0KKwluc2VudCA9IDA7CisJc3RhdGUgPSBQUk9CRTsKKwl3aGlsZSAoMSkgeworCQlzdHJ1Y3QgcG9sbGZkIGZkc1sxXTsKKwkJdW5zaWduZWQgZGVhZGxpbmVfdXM7CisJCXN0cnVjdCBhcnBfcGFja2V0IHA7CisJCWludCBpcF9jb25mbGljdDsKKwkJaW50IG47CisKKwkJZmRzWzBdLmZkID0gc29ja19mZDsKKwkJZmRzWzBdLmV2ZW50cyA9IFBPTExJTjsKKwkJZmRzWzBdLnJldmVudHMgPSAwOworCisJCS8vIFBvbGwsIGJlaW5nIHJlYWR5IHRvIGFkanVzdCBjdXJyZW50IHRpbWVvdXQKKwkJaWYgKCF0aW1lb3V0X21zKSB7CisJCQl0aW1lb3V0X21zID0gcmFuZG9tX2RlbGF5X21zKFBST0JFX1dBSVQpOworCQkJLy8gRklYTUUgc2V0c29ja29wdChzb2NrX2ZkLCBTT19BVFRBQ0hfRklMVEVSLCAuLi4pIHRvCisJCQkvLyBtYWtlIHRoZSBrZXJuZWwgZmlsdGVyIG91dCBhbGwgcGFja2V0cyBleGNlcHQKKwkJCS8vIG9uZXMgd2UnZCBjYXJlIGFib3V0LgorCQl9CisJCS8vIFNldCBkZWFkbGluZV91cyB0byB0aGUgcG9pbnQgaW4gdGltZSB3aGVuIHdlIHRpbWVvdXQKKwkJZGVhZGxpbmVfdXMgPSBNT05PVE9OSUNfVVMoKSArIHRpbWVvdXRfbXMgKiAxMDAwOworCisJCVZEQkcoIi4uLndhaXQgJWQgJXMgbnNlbnQ9JXVcbiIsCisJCQkJdGltZW91dF9tcywgYXJndl9pbnRmLCBuc2VudCk7CisKKwkJbiA9IHNhZmVfcG9sbChmZHMsIDEsIHRpbWVvdXRfbXMpOworCQlpZiAobiA8IDApIHsKKwkJCS8vYmJfcGVycm9yX21zZygicG9sbCIpOyAtIGRvbmUgaW4gc2FmZV9wb2xsCisJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQl9CisJCWlmIChuID09IDApIHsgLy8gdGltZWQgb3V0PworCQkJVkRCRygic3RhdGU6JWRcbiIsIHN0YXRlKTsKKwkJCXN3aXRjaCAoc3RhdGUpIHsKKwkJCWNhc2UgUFJPQkU6CisJCQkJLy8gTm8gY29uZmxpY3RpbmcgQVJQIHBhY2tldHMgd2VyZSBzZWVuOgorCQkJCS8vIHdlIGNhbiBwcm9ncmVzcyB0aHJvdWdoIHRoZSBzdGF0ZXMKKwkJCQlpZiAobnNlbnQgPCBQUk9CRV9OVU0pIHsKKwkJCQkJbnNlbnQrKzsKKwkJCQkJVkRCRygicHJvYmUvJXUgJXNAJXNcbiIsCisJCQkJCQkJbnNlbnQsIGFyZ3ZfaW50ZiwgbmlwX3RvX2EoY2hvc2VuX25pcCkpOworCQkJCQl0aW1lb3V0X21zID0gUFJPQkVfTUlOICogMTAwMDsKKwkJCQkJdGltZW91dF9tcyArPSByYW5kb21fZGVsYXlfbXMoUFJPQkVfTUFYIC0gUFJPQkVfTUlOKTsKKwkJCQkJc2VuZF9hcnBfcmVxdWVzdCgwLCAmbnVsbF9ldGhhZGRyLCBjaG9zZW5fbmlwKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorICAJCQkJLy8gU3dpdGNoIHRvIGFubm91bmNlIHN0YXRlCisJCQkJbnNlbnQgPSAwOworCQkJCXN0YXRlID0gQU5OT1VOQ0U7CisJCQkJZ290byBzZW5kX2Fubm91bmNlOworCQkJY2FzZSBBTk5PVU5DRToKKwkJCQkvLyBObyBjb25mbGljdGluZyBBUlAgcGFja2V0cyB3ZXJlIHNlZW46CisJCQkJLy8gd2UgY2FuIHByb2dyZXNzIHRocm91Z2ggdGhlIHN0YXRlcworCQkJCWlmIChuc2VudCA8IEFOTk9VTkNFX05VTSkgeworIHNlbmRfYW5ub3VuY2U6CisJCQkJCW5zZW50Kys7CisJCQkJCVZEQkcoImFubm91bmNlLyV1ICVzQCVzXG4iLAorCQkJCQkJCW5zZW50LCBhcmd2X2ludGYsIG5pcF90b19hKGNob3Nlbl9uaXApKTsKKwkJCQkJdGltZW91dF9tcyA9IEFOTk9VTkNFX0lOVEVSVkFMICogMTAwMDsKKwkJCQkJc2VuZF9hcnBfcmVxdWVzdChjaG9zZW5fbmlwLCAmRy5vdXJfZXRoYWRkciwgY2hvc2VuX25pcCk7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkvLyBTd2l0Y2ggdG8gbW9uaXRvciBzdGF0ZQorCQkJCS8vIEZJWE1FIHVwZGF0ZSBmaWx0ZXJzCisJCQkJcnVuKGFyZ3YsICJjb25maWciLCBjaG9zZW5fbmlwKTsKKwkJCQkvLyBOT1RFOiBhbGwgb3RoZXIgZXhpdCBwYXRocyBzaG91bGQgZGVjb25maWcuLi4KKwkJCQlpZiAoUVVJVCkKKwkJCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJCQkvLyBmYWxsIHRocm91Z2g6IHN3aXRjaCB0byBNT05JVE9SCisJCQlkZWZhdWx0OgorCQkJLy8gY2FzZSBERUZFTkQ6CisJCQkvLyBjYXNlIE1PTklUT1I6IChzaG91bGRuJ3QgaGFwcGVuLCBNT05JVE9SIHRpbWVvdXQgaXMgaW5maW5pdGUpCisJCQkJLy8gRGVmZW5kIHBlcmlvZCBlbmRlZCB3aXRoIG5vIEFSUCByZXBsaWVzIC0gd2Ugd29uCisJCQkJdGltZW91dF9tcyA9IC0xOyAvLyBuZXZlciB0aW1lb3V0IGluIG1vbml0b3Igc3RhdGUKKwkJCQlzdGF0ZSA9IE1PTklUT1I7CisJCQkJY29udGludWU7CisJCQl9CisJCX0KKworCQkvLyBQYWNrZXQgYXJyaXZlZCwgb3IgbGluayB3ZW50IGRvd24uCisJCS8vIFdlIG5lZWQgdG8gYWRqdXN0IHRoZSB0aW1lb3V0IGluIGNhc2Ugd2UgZGlkbid0IHJlY2VpdmUKKwkJLy8gYSBjb25mbGljdGluZyBwYWNrZXQuCisJCWlmICh0aW1lb3V0X21zID4gMCkgeworCQkJdW5zaWduZWQgZGlmZiA9IGRlYWRsaW5lX3VzIC0gTU9OT1RPTklDX1VTKCk7CisJCQlpZiAoKGludCkoZGlmZikgPCAwKSB7CisJCQkJLy8gQ3VycmVudCB0aW1lIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZXhwZWN0ZWQgdGltZW91dCB0aW1lLgorCQkJCWRpZmYgPSAwOworCQkJfQorCQkJVkRCRygiYWRqdXN0aW5nIHRpbWVvdXRcbiIpOworCQkJdGltZW91dF9tcyA9IChkaWZmIC8gMTAwMCkgfCAxOyAvLyBuZXZlciAwCisJCX0KKworCQlpZiAoKGZkc1swXS5yZXZlbnRzICYgUE9MTElOKSA9PSAwKSB7CisJCQlpZiAoZmRzWzBdLnJldmVudHMgJiBQT0xMRVJSKSB7CisJCQkJLy8gRklYTUU6IGxpbmtzIHJvdXRpbmVseSBnbyBkb3duOworCQkJCS8vIHRoaXMgc2hvdWxkbid0IG5lY2Vzc2FyaWx5IGV4aXQuCisJCQkJYmJfZXJyb3JfbXNnKCJpZmFjZSAlcyBpcyBkb3duIiwgYXJndl9pbnRmKTsKKwkJCQlpZiAoc3RhdGUgPj0gTU9OSVRPUikgeworCQkJCQkvLyBPbmx5IGlmIHdlIGFyZSBpbiBNT05JVE9SIG9yIERFRkVORAorCQkJCQlydW4oYXJndiwgImRlY29uZmlnIiwgY2hvc2VuX25pcCk7CisJCQkJfQorCQkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCS8vIFJlYWQgQVJQIHBhY2tldAorCQlpZiAoc2FmZV9yZWFkKHNvY2tfZmQsICZwLCBzaXplb2YocCkpIDwgMCkgeworCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKGJiX21zZ19yZWFkX2Vycm9yKTsKKwkJfQorCisJCWlmIChwLmV0aC5ldGhlcl90eXBlICE9IGh0b25zKEVUSEVSVFlQRV9BUlApKQorCQkJY29udGludWU7CisJCWlmIChwLmFycC5hcnBfb3AgIT0gaHRvbnMoQVJQT1BfUkVRVUVTVCkKKwkJICYmIHAuYXJwLmFycF9vcCAhPSBodG9ucyhBUlBPUF9SRVBMWSkKKwkJKSB7CisJCQljb250aW51ZTsKKwkJfQorI2lmZGVmIERFQlVHCisJCXsKKwkJCXN0cnVjdCBldGhlcl9hZGRyICpzaGEgPSAoc3RydWN0IGV0aGVyX2FkZHIgKikgcC5hcnAuYXJwX3NoYTsKKwkJCXN0cnVjdCBldGhlcl9hZGRyICp0aGEgPSAoc3RydWN0IGV0aGVyX2FkZHIgKikgcC5hcnAuYXJwX3RoYTsKKwkJCXN0cnVjdCBpbl9hZGRyICpzcGEgPSAoc3RydWN0IGluX2FkZHIgKikgcC5hcnAuYXJwX3NwYTsKKwkJCXN0cnVjdCBpbl9hZGRyICp0cGEgPSAoc3RydWN0IGluX2FkZHIgKikgcC5hcnAuYXJwX3RwYTsKKwkJCVZEQkcoInNvdXJjZT0lcyAlc1xuIiwgZXRoZXJfbnRvYShzaGEpLAlpbmV0X250b2EoKnNwYSkpOworCQkJVkRCRygidGFyZ2V0PSVzICVzXG4iLCBldGhlcl9udG9hKHRoYSksCWluZXRfbnRvYSgqdHBhKSk7CisJCX0KKyNlbmRpZgorCQlpcF9jb25mbGljdCA9IDA7CisJCWlmIChtZW1jbXAoJnAuYXJwLmFycF9zaGEsICZHLm91cl9ldGhhZGRyLCBFVEhfQUxFTikgIT0gMCkgeworCQkJaWYgKG1lbWNtcChwLmFycC5hcnBfc3BhLCAmY2hvc2VuX25pcCwgNCkgPT0gMCkgeworCQkJCS8vIEEgcHJvYmUgb3IgcmVwbHkgd2l0aCBzb3VyY2VfaXAgPT0gY2hvc2VuIGlwCisJCQkJaXBfY29uZmxpY3QgPSAxOworCQkJfQorCQkJaWYgKHAuYXJwLmFycF9vcCA9PSBodG9ucyhBUlBPUF9SRVFVRVNUKQorCQkJICYmIG1lbWNtcChwLmFycC5hcnBfc3BhLCAmY29uc3RfaW50XzAsIDQpID09IDAKKwkJCSAmJiBtZW1jbXAocC5hcnAuYXJwX3RwYSwgJmNob3Nlbl9uaXAsIDQpID09IDAKKwkJCSkgeworCQkJCS8vIEEgcHJvYmUgd2l0aCBzb3VyY2VfaXAgPT0gMC4wLjAuMCwgdGFyZ2V0X2lwID09IGNob3NlbiBpcDoKKwkJCQkvLyBhbm90aGVyIGhvc3QgdHJ5aW5nIHRvIGNsYWltIHRoaXMgaXAhCisJCQkJaXBfY29uZmxpY3QgfD0gMjsKKwkJCX0KKwkJfQorCQlWREJHKCJzdGF0ZTolZCBpcF9jb25mbGljdDolZFxuIiwgc3RhdGUsIGlwX2NvbmZsaWN0KTsKKwkJaWYgKCFpcF9jb25mbGljdCkKKwkJCWNvbnRpbnVlOworCisJCS8vIEVpdGhlciBzcmMgb3IgdGFyZ2V0IElQIGNvbmZsaWN0IGV4aXN0cworCQlpZiAoc3RhdGUgPD0gQU5OT1VOQ0UpIHsKKwkJCS8vIFBST0JFIG9yIEFOTk9VTkNFCisJCQljb25mbGljdHMrKzsKKwkJCXRpbWVvdXRfbXMgPSBQUk9CRV9NSU4gKiAxMDAwCisJCQkJKyBDT05GTElDVF9NVUxUSVBMSUVSICogcmFuZG9tX2RlbGF5X21zKGNvbmZsaWN0cyk7CisJCQlnb3RvIG5ld19uaXBfYW5kX1BST0JFOworCQl9CisKKwkJLy8gTU9OSVRPUiBvciBERUZFTkQ6IG9ubHkgc3JjIElQIGNvbmZsaWN0IGlzIGEgcHJvYmxlbQorCQlpZiAoaXBfY29uZmxpY3QgJiAxKSB7CisJCQlpZiAoc3RhdGUgPT0gTU9OSVRPUikgeworCQkJCS8vIFNyYyBJUCBjb25mbGljdCwgZGVmZW5kIHdpdGggYSBzaW5nbGUgQVJQIHByb2JlCisJCQkJVkRCRygibW9uaXRvciBjb25mbGljdCAtIGRlZmVuZGluZ1xuIik7CisJCQkJdGltZW91dF9tcyA9IERFRkVORF9JTlRFUlZBTCAqIDEwMDA7CisJCQkJc3RhdGUgPSBERUZFTkQ7CisJCQkJc2VuZF9hcnBfcmVxdWVzdChjaG9zZW5fbmlwLCAmRy5vdXJfZXRoYWRkciwgY2hvc2VuX25pcCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvLyBzdGF0ZSA9PSBERUZFTkQKKwkJCS8vIEFub3RoZXIgc3JjIElQIGNvbmZsaWN0LCBzdGFydCBvdmVyCisJCQlWREJHKCJkZWZlbmQgY29uZmxpY3QgLSBzdGFydGluZyBvdmVyXG4iKTsKKwkJCXJ1bihhcmd2LCAiZGVjb25maWciLCBjaG9zZW5fbmlwKTsKKwkJCWNvbmZsaWN0cyA9IDA7CisJCQl0aW1lb3V0X21zID0gMDsKKwkJCWdvdG8gbmV3X25pcF9hbmRfUFJPQkU7CisJCX0KKwkJLy8gTm90ZTogaWYgd2Ugb25seSBoYXZlIGEgdGFyZ2V0IElQIGNvbmZsaWN0IGhlcmUgKGlwX2NvbmZsaWN0ICYgMiksCisJCS8vIElPVzogaWYgd2UganVzdCBzYXcgdGhpcyBzb3J0IG9mIEFSUCBwYWNrZXQ6CisJCS8vICBhYTpiYjpjYzpkZDplZTpmZiA+IHh4Onh4Onh4Onh4Onh4Onh4IGFycCB3aG8taGFzIDxjaG9zZW5fbmlwPiB0ZWxsIDAuMC4wLjAKKwkJLy8gd2UgZXhwZWN0IF9rZXJuZWxfIHRvIHJlc3BvbmQgdG8gdGhhdCwgYmVjYXVzZSA8Y2hvc2VuX25pcD4KKwkJLy8gaXMgKGV4cGVjdGVkIHRvIGJlKSBjb25maWd1cmVkIG9uIHRoaXMgaWZhY2UuCisJfSAvLyB3aGlsZSAoMSkKKyN1bmRlZiBhcmd2X2ludGYKK30KZGlmZiAtLWdpdCBhL3ByaW50dXRpbHMvQ29uZmlnLnNyYyBiL3ByaW50dXRpbHMvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzRhYjhkCi0tLSAvZGV2L251bGwKKysrIGIvcHJpbnR1dGlscy9Db25maWcuc3JjCkBAIC0wLDAgKzEsMjggQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIlByaW50IFV0aWxpdGllcyIKKworSU5TRVJUCisKK2NvbmZpZyBMUEQKKwlib29sICJscGQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgbHBkIGlzIGEgcHJpbnQgc3Bvb2xpbmcgZGFlbW9uLgorCitjb25maWcgTFBSCisJYm9vbCAibHByIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGxwciBzZW5kcyBmaWxlcyAob3Igc3RhbmRhcmQgaW5wdXQpIHRvIGEgcHJpbnQgc3Bvb2xpbmcgZGFlbW9uLgorCitjb25maWcgTFBRCisJYm9vbCAibHBxIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGxwcSBpcyBhIHByaW50IHNwb29sIHF1ZXVlIGV4YW1pbmF0aW9uIGFuZCBtYW5pcHVsYXRpb24gcHJvZ3JhbS4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvcHJpbnR1dGlscy9LYnVpbGQuc3JjIGIvcHJpbnR1dGlscy9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NGZlMDEKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludHV0aWxzL0tidWlsZC5zcmMKQEAgLTAsMCArMSw5IEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15IDo9CisKK2xpYi0kKENPTkZJR19MUEQpICs9IGxwZC5vCitsaWItJChDT05GSUdfTFBSKSArPSBscHIubworbGliLSQoQ09ORklHX0xQUSkgKz0gbHByLm8KZGlmZiAtLWdpdCBhL3ByaW50dXRpbHMvbHBkLmMgYi9wcmludHV0aWxzL2xwZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OGJiYjMKLS0tIC9kZXYvbnVsbAorKysgYi9wcmludHV0aWxzL2xwZC5jCkBAIC0wLDAgKzEsMjkyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBtaWNybyBscGQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKKyAqIEEgdHlwaWNhbCB1c2FnZSBvZiBCQiBscGQgbG9va3MgYXMgZm9sbG93czoKKyAqICMgdGNwc3ZkIC1FIDAgNTE1IGxwZCBbU1BPT0xESVJdIFtIRUxQRVItUFJPRyBbQVJHUy4uLl1dCisgKgorICogVGhpcyBzdGFydHMgVENQIGxpc3RlbmVyIG9uIHBvcnQgNTE1IChkZWZhdWx0IGZvciBMUCBwcm90b2NvbCkuCisgKiBXaGVuIGEgY2xpZW50IGNvbm5lY3Rpb24gaXMgbWFkZSAodmlhIGxwcikgbHBkIGZpcnN0IGNoYW5nZXMgaXRzCisgKiB3b3JraW5nIGRpcmVjdG9yeSB0byBTUE9PTERJUiAoY3VycmVudCBkaXIgaXMgdGhlIGRlZmF1bHQpLgorICoKKyAqIFNQT09MRElSIGlzIHRoZSBzcG9vbCBkaXJlY3Rvcnkgd2hpY2ggY29udGFpbnMgcHJpbnRpbmcgcXVldWVzCisgKiBhbmQgc2hvdWxkIGhhdmUgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisgKgorICogU1BPT0xESVIvCisgKiAgICAgIDxxdWV1ZTE+CisgKiAgICAgIC4uLgorICogICAgICA8cXVldWVOPgorICoKKyAqIDxxdWV1ZVg+IGNhbiBiZSBvZiB0d28gdHlwZXM6CisgKiAgICAgIEEuIGEgcHJpbnRlciBjaGFyYWN0ZXIgZGV2aWNlLCBhbiBvcmRpbmFyeSBmaWxlIG9yIGEgbGluayB0byBzdWNoOworICogICAgICBCLiBhIGRpcmVjdG9yeS4KKyAqCisgKiBJbiBjYXNlIEEgbHBkIGp1c3QgZHVtcHMgdGhlIGRhdGEgaXQgcmVjZWl2ZXMgZnJvbSBjbGllbnQgKGxwcikgdG8gdGhlCisgKiBlbmQgb2YgcXVldWUgZmlsZS9kZXZpY2UuIFRoaXMgaXMgbm9uLXNwb29saW5nIG1vZGUuCisgKgorICogSW4gY2FzZSBCIGxwZCBlbnRlcnMgc3Bvb2xpbmcgbW9kZS4gSXQgcmVsaWFibHkgc2F2ZXMgY2xpZW50IGRhdGEgYWxvbmcKKyAqIHdpdGggY29udHJvbCBpbmZvIGluIHR3byB1bmlxdWUgZmlsZXMgdW5kZXIgdGhlIHF1ZXVlIGRpcmVjdG9yeS4gVGhlc2UKKyAqIGZpbGVzIGFyZSBuYW1lZCBkZkFYWFhISEhIIGFuZCBjZkFYWFhISEhILCB3aGVyZSBYWFggaXMgdGhlIGpvYiBudW1iZXIKKyAqIGFuZCBISEhIIGlzIHRoZSBjbGllbnQgaG9zdG5hbWUuIFVubGVzcyBhIHByaW50aW5nIGhlbHBlciBhcHBsaWNhdGlvbgorICogaXMgc3BlY2lmaWVkIGxwZCBpcyBkb25lIGF0IHRoaXMgcG9pbnQuCisgKgorICogTkI6IGZpbGUgbmFtZXMgYXJlIHByb2R1Y2VkIGJ5IHBlZXIhIFRoZXkgYWN0dWFsbHkgbWF5IGJlIGFueXRoaW5nIGF0IGFsbC4KKyAqIGxwZCBvbmx5IHNhbml0aXplcyB0aGVtIChieSByZW1vdmluZyBtb3N0IG5vbi1hbHBoYW51bWVyaWNzKS4KKyAqCisgKiBJZiBIRUxQRVItUFJPRyAod2l0aCBvcHRpb25hbCBhcmd1bWVudHMpIGlzIHNwZWNpZmllZCB0aGVuIGxwZCBjb250aW51ZXMKKyAqIHRvIHByb2Nlc3MgY2xpZW50IGRhdGE6CisgKiAgICAgIDEuIGl0IHJlYWRzIGFuZCBwYXJzZXMgY29udHJvbCBmaWxlIChjZkEuLi4pLiBUaGUgcGFyc2UgcHJvY2VzcworICogICAgICByZXN1bHRzIGluIHNldHRpbmcgZW52aXJvbm1lbnQgdmFyaWFibGVzIHdob3NlIHZhbHVlcyB3ZXJlIHBhc3NlZAorICogICAgICBpbiBjb250cm9sIGZpbGU7IHdoZW4gcGFyc2luZyBpcyBjb21wbGV0ZSwgbHBkIGRlbGV0ZXMgY29udHJvbCBmaWxlLgorICogICAgICAyLiBpdCBzcGF3bnMgc3BlY2lmaWVkIGhlbHBlciBhcHBsaWNhdGlvbi4gSXQgaXMgdGhlbgorICogICAgICB0aGUgaGVscGVyIGFwcGxpY2F0aW9uIHdobyBpcyByZXNwb25zaWJsZSBmb3IgYm90aCBhY3R1YWwgcHJpbnRpbmcKKyAqICAgICAgYW5kIGRlbGV0aW5nIG9mIHByb2Nlc3NlZCBkYXRhIGZpbGUuCisgKgorICogQSBnb29kIGxwciBwYXNzZXMgY29udHJvbCBmaWxlcyB3aGljaCB3aGVuIHBhcnNlZCBwcm92aWRlcyB0aGUgZm9sbG93aW5nCisgKiB2YXJpYWJsZXM6CisgKiAkSCA9IGhvc3Qgd2hpY2ggaXNzdWVzIHRoZSBqb2IKKyAqICRQID0gdXNlciB3aG8gcHJpbnRzCisgKiAkQyA9IGNsYXNzIG9mIHByaW50aW5nICh3aGF0IGlzIHByaW50ZWQgb24gYmFubmVyIHBhZ2UpCisgKiAkSiA9IHRoZSBuYW1lIG9mIHRoZSBqb2IKKyAqICRMID0gcHJpbnQgYmFubmVyIHBhZ2UKKyAqICRNID0gdGhlIHVzZXIgdG8gd2hvbSBhIG1haWwgc2hvdWxkIGJlIHNlbnQgaWYgYSBwcm9ibGVtIG9jY3VycworICoKKyAqIFdlIHNwZWNpZmljYWxseSBmaWx0ZXIgb3V0IGFuZCBOT1QgcHJvdmlkZToKKyAqICRsID0gbmFtZSBvZiBkYXRhZmlsZSAoImRmQXh4eCIpIC0gZmlsZSB3aG9zZSBjb250ZW50IGFyZSB0byBiZSBwcmludGVkCisgKgorICogbHBkIHByb3ZpZGVzICREQVRBRklMRSBpbnN0ZWFkIC0gdGhlIEFDVFVBTCBuYW1lCisgKiBvZiB0aGUgZGF0YWZpbGUgdW5kZXIgd2hpY2ggaXQgd2FzIHNhdmVkLgorICogJGwgd291bGQgYmUgbm90IHJlbGlhYmxlICh5b3Ugd291bGQgYmUgYXQgbWVyY3kgb2YgcmVtb3RlIHBlZXIpLgorICoKKyAqIFRodXMsIGEgdHlwaWNhbCBoZWxwZXIgY2FuIGJlIHNvbWV0aGluZyBsaWtlIHRoaXM6CisgKiAjIS9iaW4vc2gKKyAqIGNhdCAuLyIkREFUQUZJTEUiID4vZGV2L2xwMAorICogbXYgLWYgLi8iJERBVEFGSUxFIiBzYXZlLworICovCisKKy8vdXNhZ2U6I2RlZmluZSBscGRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlNQT09MRElSIFtIRUxQRVIgW0FSR1NdXSIKKy8vdXNhZ2U6I2RlZmluZSBscGRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTUE9PTERJUiBtdXN0IGNvbnRhaW4gKHN5bWxpbmtzIHRvKSBkZXZpY2Ugbm9kZXMgb3IgZGlyZWN0b3JpZXMiCisvL3VzYWdlOiAgICAgIlxud2l0aCBuYW1lcyBtYXRjaGluZyBwcmludCBxdWV1ZSBuYW1lcy4gSW4gdGhlIGZpcnN0IGNhc2UsIGpvYnMgYXJlIgorLy91c2FnZTogICAgICJcbnNlbnQgZGlyZWN0bHkgdG8gdGhlIGRldmljZS4gT3RoZXJ3aXNlIGVhY2ggam9iIGlzIHN0b3JlZCBpbiBxdWV1ZSIKKy8vdXNhZ2U6ICAgICAiXG5kaXJlY3RvcnkgYW5kIEhFTFBFUiBwcm9ncmFtIGlzIGNhbGxlZC4gTmFtZSBvZiBmaWxlIHRvIHByaW50IgorLy91c2FnZTogICAgICJcbmlzIHBhc3NlZCBpbiAkREFUQUZJTEUgdmFyaWFibGUuIgorLy91c2FnZTogICAgICJcbkV4YW1wbGU6IgorLy91c2FnZTogICAgICJcbgl0Y3BzdmQgLUUgMCA1MTUgc29mdGxpbWl0IC1tIDk5OTk5OSBscGQgL3Zhci9zcG9vbCAuL3ByaW50IgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLy8gc3RyaXAgYXJndW1lbnQgb2YgYmFkIGNoYXJzCitzdGF0aWMgY2hhciAqc2FuZShjaGFyICpzdHIpCit7CisJY2hhciAqcyA9IHN0cjsKKwljaGFyICpwID0gczsKKwl3aGlsZSAoKnMpIHsKKwkJaWYgKGlzYWxudW0oKnMpIHx8ICctJyA9PSAqcyB8fCAnXycgPT0gKnMpIHsKKwkJCSpwKysgPSAqczsKKwkJfQorCQlzKys7CisJfQorCSpwID0gJ1wwJzsKKwlyZXR1cm4gc3RyOworfQorCitzdGF0aWMgY2hhciAqeG1hbGxvY19yZWFkX3N0ZGluKHZvaWQpCit7CisJLy8gU0VDVVJJVFk6CisJc2l6ZV90IG1heCA9IDQgKiAxMDI0OyAvLyBtb3JlIHRoYW4gZW5vdWdoIGZvciBjb21tYW5kcyEKKwlyZXR1cm4geG1hbGxvY19yZWFkcyhTVERJTl9GSUxFTk8sICZtYXgpOworfQorCitpbnQgbHBkX21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbHBkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICphcmd2W10pCit7CisJaW50IHNwb29saW5nID0gc3Bvb2xpbmc7IC8vIGZvciBjb21waWxlcgorCWNoYXIgKnMsICpxdWV1ZTsKKwljaGFyICpmaWxlbmFtZXNbMl07CisKKwkvLyBnb3RvIHNwb29sIGRpcmVjdG9yeQorCWlmICgqKythcmd2KQorCQl4Y2hkaXIoKmFyZ3YrKyk7CisKKwkvLyBlcnJvciBtZXNzYWdlcyBvZiB4ZnVuY3Mgd2lsbCBiZSBzZW50IG92ZXIgbmV0d29yaworCXhkdXAyKFNURE9VVF9GSUxFTk8sIFNUREVSUl9GSUxFTk8pOworCisJLy8gbnVsbGlmeSBjdHJsL2RhdGEgZmlsZW5hbWVzCisJbWVtc2V0KGZpbGVuYW1lcywgMCwgc2l6ZW9mKGZpbGVuYW1lcykpOworCisJLy8gcmVhZCBjb21tYW5kCisJcyA9IHF1ZXVlID0geG1hbGxvY19yZWFkX3N0ZGluKCk7CisJLy8gd2UgdW5kZXJzdGFuZCBvbmx5ICJyZWNlaXZlIGpvYiIgY29tbWFuZAorCWlmICgyICE9ICpxdWV1ZSkgeworIHVuc3VwcG9ydGVkX2NtZDoKKwkJcHJpbnRmKCJDb21tYW5kICUwMnggJXNcbiIsCisJCQkodW5zaWduZWQgY2hhcilzWzBdLCAiaXMgbm90IHN1cHBvcnRlZCIpOworCQlnb3RvIGVycl9leGl0OworCX0KKworCS8vIHBhcnNlIGNvbW1hbmQ6ICIyIHwgUVVFVUVfTkFNRSB8ICdcbiciCisJcXVldWUrKzsKKwkvLyBwcm90ZWN0IGFnYWluc3QgIi8uLi8iIGF0dGFja3MKKwkvLyAqc3RyY2hybnVsKHF1ZXVlLCAnXG4nKSA9ICdcMCc7IC0gcmVkdW5kYW50LCBzYW5lKCkgd2lsbCBkbworCWlmICghKnNhbmUocXVldWUpKQorCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCisJLy8gcXVldWUgaXMgYSBkaXJlY3RvcnkgLT4gY2hkaXIgdG8gaXQgYW5kIGVudGVyIHNwb29saW5nIG1vZGUKKwlzcG9vbGluZyA9IGNoZGlyKHF1ZXVlKSArIDE7IC8vIDA6IGNhbm5vdCBjaGRpciwgMTogZG9uZQorCS8vIHdlIGRvbid0IGZyZWUocyksIHdlIG1pZ2h0IG5lZWQgInF1ZXVlIiB2YXIgbGF0ZXIKKworCXdoaWxlICgxKSB7CisJCWNoYXIgKmZuYW1lOworCQlpbnQgZmQ7CisJCS8vIGludCBpcyBlYXNpZXIgdGhhbiBzc2l6ZV90OiBjYW4gdXNlIHhhdG9pX3Bvc2l0aXZlLAorCQkvLyBhbmQgY2FuIGNvcnJlY3RseSBkaXNwbGF5IGVycm9yIHJldHVybnMgKC0xKQorCQlpbnQgZXhwZWN0ZWRfbGVuLCByZWFsX2xlbjsKKworCQkvLyBzaWduYWwgT0sKKwkJc2FmZV93cml0ZShTVERPVVRfRklMRU5PLCAiIiwgMSk7CisKKwkJLy8gZ2V0IHN1YmNvbW1hbmQKKwkJLy8gdmFsaWQgcyBtdXN0IGJlIG9mIGZvcm06ICJTVUJDTUQgfCBMRU4gfCBzcGFjZSB8IEZOQU1FIgorCQkvLyBOLkIuIHdlIGJhaWwgb3V0IG9uIGFueSBlcnJvcgorCQlzID0geG1hbGxvY19yZWFkX3N0ZGluKCk7CisJCWlmICghcykgeyAvLyAocHJvYmFibHkpIEVPRgorCQkJY2hhciAqcCwgKnEsIHZhclsyXTsKKworCQkJLy8gbm9uLXNwb29saW5nIG1vZGUgb3Igbm8gc3Bvb2wgaGVscGVyIHNwZWNpZmllZAorCQkJaWYgKCFzcG9vbGluZyB8fCAhKmFyZ3YpCisJCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsgLy8gdGhlIG9ubHkgbm9uLWVycm9yIGV4aXQKKwkJCS8vIHNwb29saW5nIG1vZGUgYnV0IHdlIGRpZG4ndCBzZWUgYm90aCBjdHJsZmlsZSAmIGRhdGFmaWxlCisJCQlpZiAoc3Bvb2xpbmcgIT0gNykKKwkJCQlnb3RvIGVycl9leGl0OyAvLyByZWplY3Qgam9iCisKKwkJCS8vIHNwb29saW5nIG1vZGUgYW5kIHNwb29sIGhlbHBlciBzcGVjaWZpZWQgLT4gZXhlYyBzcG9vbCBoZWxwZXIKKwkJCS8vICh3ZSBleGl0IDEyNyBpZiBoZWxwZXIgY2Fubm90IGJlIGV4ZWN1dGVkKQorCQkJdmFyWzFdID0gJ1wwJzsKKwkJCS8vIHJlYWQgYW5kIGRlbGV0ZSBjdHJsZmlsZQorCQkJcSA9IHhtYWxsb2NfeG9wZW5fcmVhZF9jbG9zZShmaWxlbmFtZXNbMF0sIE5VTEwpOworCQkJdW5saW5rKGZpbGVuYW1lc1swXSk7CisJCQkvLyBwcm92aWRlIGRhdGFmaWxlIG5hbWUKKwkJCS8vIHdlIGNhbiB1c2UgbGVha3kgc2V0ZW52IHNpbmNlIHdlIGFyZSBhYm91dCB0byBleGVjIG9yIGV4aXQKKwkJCXhzZXRlbnYoIkRBVEFGSUxFIiwgZmlsZW5hbWVzWzFdKTsKKwkJCS8vIHBhcnNlIGNvbnRyb2wgZmlsZSBieSAiXG4iCisJCQl3aGlsZSAoKHAgPSBzdHJjaHIocSwgJ1xuJykpICE9IE5VTEwgJiYgaXNhbHBoYSgqcSkpIHsKKwkJCQkqcCsrID0gJ1wwJzsKKwkJCQkvLyBxIGlzIGEgbGluZSBvZiA8U1lNPjxWQUxVRT4sCisJCQkJLy8gd2UgYXJlIHNldHRpbmcgZW52aXJvbm1lbnQgc3RyaW5nIDxTWU0+PTxWQUxVRT4uCisJCQkJLy8gSWdub3JpbmcgImw8ZGF0YWZpbGU+IiwgZXhwb3J0aW5nIG90aGVyczoKKwkJCQlpZiAoKnEgIT0gJ2wnKSB7CisJCQkJCXZhclswXSA9ICpxKys7CisJCQkJCXhzZXRlbnYodmFyLCBxKTsKKwkJCQl9CisJCQkJcSA9IHA7IC8vIG5leHQgbGluZQorCQkJfQorCQkJLy8gaGVscGVyIHNob3VsZCBub3QgdGFsayBvdmVyIG5ldHdvcmsuCisJCQkvLyB0aGlzIGNhbGwgcmVvcGVucyBzdGRpbyBmZHMgdG8gIi9kZXYvbnVsbCIKKwkJCS8vIChubyBkYWVtb25pemF0aW9uIGlzIGRvbmUpCisJCQliYl9kYWVtb25pemVfb3JfcmV4ZWMoREFFTU9OX0RFVk5VTExfU1RESU8gfCBEQUVNT05fT05MWV9TQU5JVElaRSwgTlVMTCk7CisJCQlCQl9FWEVDVlBfb3JfZGllKGFyZ3YpOworCQl9CisKKwkJLy8gdmFsaWRhdGUgaW5wdXQuCisJCS8vIHdlIHVuZGVyc3RhbmQgb25seSAiY29udHJvbCBmaWxlIiBvciAiZGF0YSBmaWxlIiBjbWRzCisJCWlmICgyICE9IHNbMF0gJiYgMyAhPSBzWzBdKQorCQkJZ290byB1bnN1cHBvcnRlZF9jbWQ7CisJCWlmIChzcG9vbGluZyAmICgxIDw8IChzWzBdLTEpKSkgeworCQkJcHV0cygiRHVwbGljYXRlZCBzdWJjb21tYW5kIik7CisJCQlnb3RvIGVycl9leGl0OworCQl9CisJCS8vIGdldCBmaWxlbmFtZQorCQljaG9tcChzKTsKKwkJZm5hbWUgPSBzdHJjaHIocywgJyAnKTsKKwkJaWYgKCFmbmFtZSkgeworLy8gYmFkX2ZuYW1lOgorCQkJcHV0cygiTm8gb3IgYmFkIGZpbGVuYW1lIik7CisJCQlnb3RvIGVycl9leGl0OworCQl9CisJCSpmbmFtZSsrID0gJ1wwJzsKKy8vCQkvLyBzWzBdPT0yOiBjdHJsZmlsZSwgbXVzdCBzdGFydCB3aXRoICdjJworLy8JCS8vIHNbMF09PTM6IGRhdGFmaWxlLCBtdXN0IHN0YXJ0IHdpdGggJ2QnCisvLwkJaWYgKGZuYW1lWzBdICE9IHNbMF0gKyAoJ2MnLTIpKQorLy8JCQlnb3RvIGJhZF9mbmFtZTsKKwkJLy8gZ2V0IGxlbmd0aAorCQlleHBlY3RlZF9sZW4gPSBiYl9zdHJ0b3UocyArIDEsIE5VTEwsIDEwKTsKKwkJaWYgKGVycm5vIHx8IGV4cGVjdGVkX2xlbiA8IDApIHsKKwkJCXB1dHMoIkJhZCBsZW5ndGgiKTsKKwkJCWdvdG8gZXJyX2V4aXQ7CisJCX0KKwkJaWYgKDIgPT0gc1swXSAmJiBleHBlY3RlZF9sZW4gPiAxNiAqIDEwMjQpIHsKKwkJCS8vIFNFQ1VSSVRZOgorCQkJLy8gY3RybGZpbGUgY2FuJ3QgYmUgYmlnICh3ZSB3YW50IHRvIHJlYWQgaXQgYmFjayBsYXRlciEpCisJCQlwdXRzKCJGaWxlIGlzIHRvbyBiaWciKTsKKwkJCWdvdG8gZXJyX2V4aXQ7CisJCX0KKworCQkvLyBvcGVuIHRoZSBmaWxlCisJCWlmIChzcG9vbGluZykgeworCQkJLy8gc3Bvb2xpbmcgbW9kZTogZHVtcCBib3RoIGZpbGVzCisJCQkvLyBqb2IgaW4gZmxpZ2h0IGhhcyBtb2RlIDAyMDAgIm9ubHkgd3JpdGFibGUiCisJCQlzYW5lKGZuYW1lKTsKKwkJCWZkID0gb3BlbjNfb3Jfd2FybihmbmFtZSwgT19DUkVBVCB8IE9fV1JPTkxZIHwgT19UUlVOQyB8IE9fRVhDTCwgMDIwMCk7CisJCQlpZiAoZmQgPCAwKQorCQkJCWdvdG8gZXJyX2V4aXQ7CisJCQlmaWxlbmFtZXNbc1swXSAtIDJdID0geHN0cmR1cChmbmFtZSk7CisJCX0gZWxzZSB7CisJCQkvLyBub24tc3Bvb2xpbmcgbW9kZToKKwkJCS8vIDI6IGNvbnRyb2wgZmlsZSAoaWdub3JpbmcpLCAzOiBkYXRhIGZpbGUKKwkJCWZkID0gLTE7CisJCQlpZiAoMyA9PSBzWzBdKQorCQkJCWZkID0geG9wZW4ocXVldWUsIE9fUkRXUiB8IE9fQVBQRU5EKTsKKwkJfQorCisJCS8vIHNpZ25hbCBPSworCQlzYWZlX3dyaXRlKFNURE9VVF9GSUxFTk8sICIiLCAxKTsKKworCQkvLyBjb3B5IHRoZSBmaWxlCisJCXJlYWxfbGVuID0gYmJfY29weWZkX3NpemUoU1RESU5fRklMRU5PLCBmZCwgZXhwZWN0ZWRfbGVuKTsKKwkJaWYgKHJlYWxfbGVuICE9IGV4cGVjdGVkX2xlbikgeworCQkJcHJpbnRmKCJFeHBlY3RlZCAlZCBidXQgZ290ICVkIGJ5dGVzXG4iLAorCQkJCWV4cGVjdGVkX2xlbiwgcmVhbF9sZW4pOworCQkJZ290byBlcnJfZXhpdDsKKwkJfQorCQkvLyBnZXQgRU9GIGluZGljYXRvciwgc2VlIHdoZXRoZXIgaXQgaXMgTlVMIChvaykKKwkJLy8gKGFuZCBkb24ndCB0cmFzaCBzWzBdISkKKwkJaWYgKHNhZmVfcmVhZChTVERJTl9GSUxFTk8sICZzWzFdLCAxKSAhPSAxIHx8IHNbMV0gIT0gMCkgeworCQkJLy8gZG9uJ3Qgc2VuZCBlcnJvciBtc2cgdG8gcGVlciAtIGl0IG9idmlvdXNseQorCQkJLy8gZG9lc24ndCBmb2xsb3cgdGhlIHByb3RvY29sLCBzbyBwcm9iYWJseQorCQkJLy8gaXQgY2FuJ3QgdW5kZXJzdGFuZCB1cyBlaXRoZXIKKwkJCWdvdG8gZXJyX2V4aXQ7CisJCX0KKworCQlpZiAoc3Bvb2xpbmcpIHsKKwkJCS8vIGNobW9kIGNvbXBsZXRlbHkgZG93bmxvYWRlZCBmaWxlIGFzICJyZWFkYWJsZSt3cml0YWJsZSIKKwkJCWZjaG1vZChmZCwgMDYwMCk7CisJCQkvLyBhY2N1bXVsYXRlIGR1bXAgc3RhdGUKKwkJCS8vIE4uQi4gYWZ0ZXIgYWxsIGZpbGVzIGFyZSBkdW1wZWQgc3Bvb2xpbmcgc2hvdWxkIGJlIDErMis0PT03CisJCQlzcG9vbGluZyB8PSAoMSA8PCAoc1swXS0xKSk7IC8vIGJpdCAxOiBjdHJsZmlsZTsgYml0IDI6IGRhdGFmaWxlCisJCX0KKworCQlmcmVlKHMpOworCQljbG9zZShmZCk7IC8vIE5COiBjYW4gZG8gY2xvc2UoLTEpLiBXaG8gY2FyZXM/CisKKwkJLy8gTkI6IGRvbid0IGRvICJzaWduYWwgT0siIHdyaXRlIGhlcmUsIGl0IHdpbGwgYmUgZG9uZQorCQkvLyBhdCB0aGUgdG9wIG9mIHRoZSBsb29wCisJfSAvLyB3aGlsZSAoMSkKKworIGVycl9leGl0OgorCS8vIGRvbid0IGtlZXAgY29ycnVwdGVkIGZpbGVzCisJaWYgKHNwb29saW5nKSB7CisjZGVmaW5lIGkgc3Bvb2xpbmcKKwkJZm9yIChpID0gMjsgLS1pID49IDA7ICkKKwkJCWlmIChmaWxlbmFtZXNbaV0pCisJCQkJdW5saW5rKGZpbGVuYW1lc1tpXSk7CisJfQorCXJldHVybiBFWElUX0ZBSUxVUkU7Cit9CmRpZmYgLS1naXQgYS9wcmludHV0aWxzL2xwci5jIGIvcHJpbnR1dGlscy9scHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGNkYTc3Ci0tLSAvZGV2L251bGwKKysrIGIvcHJpbnR1dGlscy9scHIuYwpAQCAtMCwwICsxLDI3NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYmFyZSBib25lcyB2ZXJzaW9uIG9mIGxwciAmIGxwcTogQlNEIHByaW50aW5nIHV0aWxpdGllcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBWbGFkaW1pciBEcm9ubmlrb3YgPGRyb25uaWtvdkBnbWFpbC5jb20+CisgKgorICogT3JpZ2luYWwgaWRlYSBhbmQgY29kZToKKyAqICAgICAgV2FsdGVyIEhhcm1zIDxXSGFybXNAYmZzLmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogU2VlIFJGQyAxMTc5IGZvciBwcm90b2NvbCBkZXNjcmlwdGlvbi4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbHByX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICItUCBxdWV1ZVtAaG9zdFs6cG9ydF1dIC1VIFVTRVJOQU1FIC1KIFRJVExFIC1WbWggW0ZJTEVdLi4uIgorLyogLUMgQ0xBU1MgZXhpc3RzIHRvbywgbm90IHNob3duLgorICogQ0xBU1MgaXMgc3VwcG9zZWQgdG8gYmUgcHJpbnRlZCBvbiBiYW5uZXIgcGFnZSwgaWYgb25lIGlzIHJlcXVlc3RlZCAqLworLy91c2FnZTojZGVmaW5lIGxwcl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgktUAlscCBzZXJ2aWNlIHRvIGNvbm5lY3QgdG8gKGVsc2UgdXNlcyAkUFJJTlRFUikiCisvL3VzYWdlOiAgICAgIlxuCS1tCVNlbmQgbWFpbCBvbiBjb21wbGV0aW9uIgorLy91c2FnZTogICAgICJcbgktaAlQcmludCBiYW5uZXIgcGFnZSB0b28iCisvL3VzYWdlOiAgICAgIlxuCS1WCVZlcmJvc2UiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGxwcV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1QIHF1ZXVlW0Bob3N0Wzpwb3J0XV1dIFstVSBVU0VSTkFNRV0gWy1kIEpPQklEXS4uLiBbLWZzXSIKKy8vdXNhZ2U6I2RlZmluZSBscHFfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLVAJbHAgc2VydmljZSB0byBjb25uZWN0IHRvIChlbHNlIHVzZXMgJFBSSU5URVIpIgorLy91c2FnZTogICAgICJcbgktZAlEZWxldGUgam9icyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgYW55IHdhaXRpbmcgam9iIHRvIGJlIHByaW50ZWQiCisvL3VzYWdlOiAgICAgIlxuCS1zCVNob3J0IGRpc3BsYXkiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKgorICogTFBEIHJldHVybnMgYmluYXJ5IDAgb24gc3VjY2Vzcy4KKyAqIE90aGVyd2lzZSBpdCByZXR1cm5zIGVycm9yIG1lc3NhZ2UuCisgKi8KK3N0YXRpYyB2b2lkIGdldF9yZXNwb25zZV9vcl9zYXlfYW5kX2RpZShpbnQgZmQsIGNvbnN0IGNoYXIgKmVycm1zZykKK3sKKwlzc2l6ZV90IHN6OworCWNoYXIgYnVmWzEyOF07CisKKwlidWZbMF0gPSAnICc7CisJc3ogPSBzYWZlX3JlYWQoZmQsIGJ1ZiwgMSk7CisJaWYgKCdcMCcgIT0gYnVmWzBdKSB7CisJCS8vIHJlcXVlc3QgaGFzIGZhaWxlZAorCQkvLyB0cnkgdG8gbWFrZSBzdXJlIGxhc3QgY2hhciBpcyAnXG4nLCBidXQgZG8gbm90IGFkZAorCQkvLyBzdXBlcmZsdW91cyBvbmUKKwkJc3ogPSBmdWxsX3JlYWQoZmQsIGJ1ZiArIDEsIDEyNik7CisJCWJiX2Vycm9yX21zZygiZXJyb3Igd2hpbGUgJXMlcyIsIGVycm1zZywKKwkJCQkoc3ogPiAwID8gIi4gU2VydmVyIHNhaWQ6IiA6ICIiKSk7CisJCWlmIChzeiA+IDApIHsKKwkJCS8vIHN6ID0gKGJ5dGVzIGluIGJ1ZikgLSAxCisJCQlpZiAoYnVmW3N6XSAhPSAnXG4nKQorCQkJCWJ1ZlsrK3N6XSA9ICdcbic7CisJCQlzYWZlX3dyaXRlKFNUREVSUl9GSUxFTk8sIGJ1Ziwgc3ogKyAxKTsKKwkJfQorCQl4ZnVuY19kaWUoKTsKKwl9Cit9CisKK2ludCBscHFyX21haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbHBxcl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqYXJndltdKQoreworCWVudW0geworCQlPUFRfUCAgICAgICAgICAgPSAxIDw8IDAsIC8vIC1QIHF1ZXVlW0Bob3N0Wzpwb3J0XV0uIElmIG5vIC1QIGlzIGdpdmVuIHVzZSAkUFJJTlRFUiwgdGhlbiAibHBAbG9jYWxob3N0OjUxNSIKKwkJT1BUX1UgICAgICAgICAgID0gMSA8PCAxLCAvLyAtVSB1c2VybmFtZQorCisJCUxQUl9WICAgICAgICAgICA9IDEgPDwgMiwgLy8gLVY6IGJlIHZlcmJvc2UKKwkJTFBSX2ggICAgICAgICAgID0gMSA8PCAzLCAvLyAtaDogd2FudCBiYW5uZXIgcHJpbnRlZAorCQlMUFJfQyAgICAgICAgICAgPSAxIDw8IDQsIC8vIC1DIGNsYXNzOiBqb2IgImNsYXNzIiAoPyBzdXBwb3NlZGx5IHByaW50ZWQgb24gYmFubmVyKQorCQlMUFJfSiAgICAgICAgICAgPSAxIDw8IDUsIC8vIC1KIHRpdGxlOiB0aGUgam9iIHRpdGxlIGZvciB0aGUgYmFubmVyIHBhZ2UKKwkJTFBSX20gICAgICAgICAgID0gMSA8PCA2LCAvLyAtbTogc2VuZCBtYWlsIGJhY2sgdG8gdXNlcgorCisJCUxQUV9TSE9SVF9GTVQgICA9IDEgPDwgMiwgLy8gLXM6IHNob3J0IGxpc3RpbmcgZm9ybWF0CisJCUxQUV9ERUxFVEUgICAgICA9IDEgPDwgMywgLy8gLWQ6IGRlbGV0ZSBqb2IocykKKwkJTFBRX0ZPUkNFICAgICAgID0gMSA8PCA0LCAvLyAtZjogZm9yY2Ugd2FpdGluZyBqb2IocykgdG8gYmUgcHJpbnRlZAorCX07CisJY2hhciB0ZW1wZmlsZVtzaXplb2YoIi90bXAvbHByWFhYWFhYIildOworCWNvbnN0IGNoYXIgKmpvYl90aXRsZTsKKwljb25zdCBjaGFyICpwcmludGVyX2NsYXNzID0gIiI7ICAgLy8gcHJpbnRlciBjbGFzcywgbWF4IDMyIGNoYXIKKwljb25zdCBjaGFyICpxdWV1ZTsgICAgICAgICAgICAgICAgLy8gbmFtZSBvZiBwcmludGVyIHF1ZXVlCisJY29uc3QgY2hhciAqc2VydmVyID0gImxvY2FsaG9zdCI7IC8vIHNlcnZlcls6cG9ydF0gb2YgcHJpbnRlciBxdWV1ZQorCWNoYXIgKmhvc3RuYW1lOworCS8vIE4uQi4gSU1ITyBnZXRlbnYoIlVTRVIiKSBjYW4gYmUgd2F5IGVhc2lseSBzcG9vZmVkIQorCWNvbnN0IGNoYXIgKnVzZXIgPSB4dWlkMnVuYW1lKGdldHVpZCgpKTsKKwl1bnNpZ25lZCBqb2I7CisJdW5zaWduZWQgb3B0czsKKwlpbnQgZmQ7CisKKwlxdWV1ZSA9IGdldGVudigiUFJJTlRFUiIpOworCWlmICghcXVldWUpCisJCXF1ZXVlID0gImxwIjsKKworCS8vIHBhcnNlIG9wdGlvbnMKKwkvLyBUT0RPOiBzZXQgb3B0X2NvbXBsZW1lbnRhcnk6IHMsZCxmIGFyZSBtdXR1YWxseSBleGNsdXNpdmUKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwKKwkJKC8qbHAqLydyJyA9PSBhcHBsZXRfbmFtZVsyXSkgPyAiUDpVOlZoQzpKOm0iIDogIlA6VTpzZGYiCisJCSwgJnF1ZXVlLCAmdXNlcgorCQksICZwcmludGVyX2NsYXNzLCAmam9iX3RpdGxlCisJKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCXsKKwkJLy8gcXVldWUgbmFtZSBpcyB0byB0aGUgbGVmdCBvZiAnQCcKKwkJY2hhciAqcyA9IHN0cmNocihxdWV1ZSwgJ0AnKTsKKwkJaWYgKHMpIHsKKwkJCS8vIHNlcnZlciBuYW1lIGlzIHRvIHRoZSByaWdodCBvZiAnQCcKKwkJCSpzID0gJ1wwJzsKKwkJCXNlcnZlciA9IHMgKyAxOworCQl9CisJfQorCisJLy8gZG8gY29ubmVjdAorCWZkID0gY3JlYXRlX2FuZF9jb25uZWN0X3N0cmVhbV9vcl9kaWUoc2VydmVyLCA1MTUpOworCisJLy8KKwkvLyBMUFEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJLy8KKwlpZiAoLypscCovJ3EnID09IGFwcGxldF9uYW1lWzJdKSB7CisJCWNoYXIgY21kOworCQkvLyBmb3JjZSBwcmludGluZyBvZiBldmVyeSBqb2Igc3RpbGwgaW4gcXVldWUKKwkJaWYgKG9wdHMgJiBMUFFfRk9SQ0UpIHsKKwkJCWNtZCA9IDE7CisJCQlnb3RvIGNvbW1hbmQ7CisJCS8vIGRlbGV0ZSBqb2IocykKKwkJfSBlbHNlIGlmIChvcHRzICYgTFBRX0RFTEVURSkgeworCQkJZmRwcmludGYoZmQsICJceDUiICIlcyAlcyIsIHF1ZXVlLCB1c2VyKTsKKwkJCXdoaWxlICgqYXJndikgeworCQkJCWZkcHJpbnRmKGZkLCAiICVzIiwgKmFyZ3YrKyk7CisJCQl9CisJCQliYl9wdXRjaGFyKCdcbicpOworCQkvLyBkdW1wIGN1cnJlbnQgam9icyBzdGF0dXMKKwkJLy8gTi5CLiBwZXJpb2RpY2FsIHBvbGxpbmcgc2hvdWxkIGJlIGFjaGlldmVkCisJCS8vIHZpYSAid2F0Y2ggLW4gZGVsYXkgbHBxIgorCQkvLyBUaGV5IHNheSBpdCdzIHRoZSBVTklYLXdheSA6KQorCQl9IGVsc2UgeworCQkJY21kID0gKG9wdHMgJiBMUFFfU0hPUlRfRk1UKSA/IDMgOiA0OworIGNvbW1hbmQ6CisJCQlmZHByaW50ZihmZCwgIiVjIiAiJXNcbiIsIGNtZCwgcXVldWUpOworCQkJYmJfY29weWZkX2VvZihmZCwgU1RET1VUX0ZJTEVOTyk7CisJCX0KKworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCS8vCisJLy8gTFBSIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCS8vCisJaWYgKG9wdHMgJiBMUFJfVikKKwkJYmJfZXJyb3JfbXNnKCJjb25uZWN0ZWQgdG8gc2VydmVyIik7CisKKwlqb2IgPSBnZXRwaWQoKSAlIDEwMDA7CisJaG9zdG5hbWUgPSBzYWZlX2dldGhvc3RuYW1lKCk7CisKKwkvLyBubyBmaWxlcyBnaXZlbiBvbiBjb21tYW5kIGxpbmU/IC0+IHVzZSBzdGRpbgorCWlmICghKmFyZ3YpCisJCSotLWFyZ3YgPSAoY2hhciAqKSItIjsKKworCWZkcHJpbnRmKGZkLCAiXHgyIiAiJXNcbiIsIHF1ZXVlKTsKKwlnZXRfcmVzcG9uc2Vfb3Jfc2F5X2FuZF9kaWUoZmQsICJzZXR0aW5nIHF1ZXVlIik7CisKKwkvLyBwcm9jZXNzIGZpbGVzCisJZG8geworCQl1bnNpZ25lZCBjZmxlbjsKKwkJaW50IGRmZDsKKwkJc3RydWN0IHN0YXQgc3Q7CisJCWNoYXIgKmM7CisJCWNoYXIgKnJlbW90ZV9maWxlbmFtZTsKKwkJY2hhciAqY29udHJvbGZpbGU7CisKKwkJLy8gaWYgZGF0YSBmaWxlIGlzIHN0ZGluLCB3ZSBuZWVkIHRvIGR1bXAgaXQgZmlyc3QKKwkJaWYgKExPTkVfREFTSCgqYXJndikpIHsKKwkJCXN0cmNweSh0ZW1wZmlsZSwgIi90bXAvbHByWFhYWFhYIik7CisJCQlkZmQgPSB4bWtzdGVtcCh0ZW1wZmlsZSk7CisJCQliYl9jb3B5ZmRfZW9mKFNURElOX0ZJTEVOTywgZGZkKTsKKwkJCXhsc2VlayhkZmQsIDAsIFNFRUtfU0VUKTsKKwkJCSphcmd2ID0gKGNoYXIqKWJiX21zZ19zdGFuZGFyZF9pbnB1dDsKKwkJfSBlbHNlIHsKKwkJCWRmZCA9IHhvcGVuKCphcmd2LCBPX1JET05MWSk7CisJCX0KKworCQlzdC5zdF9zaXplID0gMDsgLyogcGFyYW5vaWE6IGZzdGF0IG1heSB0aGVvcmV0aWNhbGx5IGZhaWwgKi8KKwkJZnN0YXQoZGZkLCAmc3QpOworCisJCS8qIEFwcGFyZW50bHksIHNvbWUgc2VydmVycyBhcmUgYnVnZ3kgYW5kIHdvbid0IGFjY2VwdCAwLXNpemVkIGpvYnMuCisJCSAqIFN0YW5kYXJkIGxwciB3b3JrcyBhcm91bmQgaXQgYnkgcmVmdXNpbmcgdG8gc2VuZCBzdWNoIGpvYnM6CisJCSAqLworCQlpZiAoc3Quc3Rfc2l6ZSA9PSAwKSB7CisJCQliYl9lcnJvcl9tc2coIm5vdGhpbmcgdG8gcHJpbnQiKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogIlRoZSBuYW1lIC4uLiBzaG91bGQgc3RhcnQgd2l0aCBBU0NJSSAiY2ZBIiwKKwkJICogZm9sbG93ZWQgYnkgYSB0aHJlZSBkaWdpdCBqb2IgbnVtYmVyLCBmb2xsb3dlZAorCQkgKiBieSB0aGUgaG9zdCBuYW1lIHdoaWNoIGhhcyBjb25zdHJ1Y3RlZCB0aGUgZmlsZS4iCisJCSAqIFdlIHN1cHBseSAnYycgb3IgJ2QnIGFzIG5lZWRlZCBmb3IgY29udHJvbC9kYXRhIGZpbGUuICovCisJCXJlbW90ZV9maWxlbmFtZSA9IHhhc3ByaW50ZigiZkElMDN1JXMiLCBqb2IsIGhvc3RuYW1lKTsKKworCQkvLyBjcmVhdGUgY29udHJvbCBmaWxlCisJCS8vIFRPRE86IGFsbCBsaW5lcyBidXQgMiBsYXN0IGFyZSBjb25zdGFudHMhIEhvdyB3ZSBjYW4gdXNlIHRoaXMgZmFjdD8KKwkJY29udHJvbGZpbGUgPSB4YXNwcmludGYoCisJCQkiSCIgIiUuMzJzXG4iICJQIiAiJS4zMnNcbiIgLyogSCBIT1NULCBQIFVTRVIgKi8KKwkJCSJDIiAiJS4zMnNcbiIgLyogQyBDTEFTUyAtIHByaW50ZWQgb24gYmFubmVyIHBhZ2UgKGlmIEwgY21kIGlzIGFsc28gZ2l2ZW4pICovCisJCQkiSiIgIiUuOTlzXG4iIC8qIEogSk9CTkFNRSAqLworCQkJLyogImNsYXNzIG5hbWUgZm9yIGJhbm5lciBwYWdlIGFuZCBqb2IgbmFtZQorCQkJICogZm9yIGJhbm5lciBwYWdlIGNvbW1hbmRzIG11c3QgcHJlY2VkZSBMIGNvbW1hbmQiICovCisJCQkiTCIgIiUuMzJzXG4iIC8qIEwgVVNFUiAtIHByaW50IGJhbm5lciBwYWdlLCB3aXRoIGdpdmVuIHVzZXIncyBuYW1lICovCisJCQkiTSIgIiUuMzJzXG4iIC8qIE0gV0hPTV9UT19NQUlMICovCisJCQkibCIgImQlLjMxc1xuIiAvKiBsIERBVEFfRklMRV9OQU1FICgiZGZBeHh4IikgKi8KKwkJCSwgaG9zdG5hbWUsIHVzZXIKKwkJCSwgcHJpbnRlcl9jbGFzcyAvKiBjYW4gYmUgIiIgKi8KKwkJCSwgKChvcHRzICYgTFBSX0opID8gam9iX3RpdGxlIDogKmFyZ3YpCisJCQksIChvcHRzICYgTFBSX2gpID8gdXNlciA6ICIiCisJCQksIChvcHRzICYgTFBSX20pID8gdXNlciA6ICIiCisJCQksIHJlbW90ZV9maWxlbmFtZQorCQkpOworCQkvLyBkZWxldGUgcG9zc2libGUgIlxuWFxuIiAodGhhdCBpcywgb25lLWNoYXIpIHBhdHRlcm5zCisJCWMgPSBjb250cm9sZmlsZTsKKwkJd2hpbGUgKChjID0gc3RyY2hyKGMsICdcbicpKSAhPSBOVUxMKSB7CisJCQlpZiAoY1sxXSAmJiBjWzJdID09ICdcbicpIHsKKwkJCQlvdmVybGFwcGluZ19zdHJjcHkoYywgYysyKTsKKwkJCX0gZWxzZSB7CisJCQkJYysrOworCQkJfQorCQl9CisKKwkJLy8gc2VuZCBjb250cm9sIGZpbGUKKwkJaWYgKG9wdHMgJiBMUFJfVikKKwkJCWJiX2Vycm9yX21zZygic2VuZGluZyBjb250cm9sIGZpbGUiKTsKKwkJLyogIkFja25vd2xlZGdlbWVudCBwcm9jZXNzaW5nIG11c3Qgb2NjdXIgYXMgdXN1YWwKKwkJICogYWZ0ZXIgdGhlIGNvbW1hbmQgaXMgc2VudC4iICovCisJCWNmbGVuID0gKHVuc2lnbmVkKXN0cmxlbihjb250cm9sZmlsZSk7CisJCWZkcHJpbnRmKGZkLCAiXHgyIiAiJXUgYyVzXG4iLCBjZmxlbiwgcmVtb3RlX2ZpbGVuYW1lKTsKKwkJZ2V0X3Jlc3BvbnNlX29yX3NheV9hbmRfZGllKGZkLCAic2VuZGluZyBjb250cm9sIGZpbGUiKTsKKwkJLyogIk9uY2UgYWxsIG9mIHRoZSBjb250ZW50cyBoYXZlCisJCSAqIGJlZW4gZGVsaXZlcmVkLCBhbiBvY3RldCBvZiB6ZXJvIGJpdHMgaXMgc2VudCBhcworCQkgKiBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlIGZpbGUgYmVpbmcgc2VudCBpcyBjb21wbGV0ZS4KKwkJICogQSBzZWNvbmQgbGV2ZWwgb2YgYWNrbm93bGVkZ2VtZW50IHByb2Nlc3NpbmcKKwkJICogbXVzdCBvY2N1ciBhdCB0aGlzIHBvaW50LiIgKi8KKwkJZnVsbF93cml0ZShmZCwgY29udHJvbGZpbGUsIGNmbGVuICsgMSk7IC8qIHdyaXRlcyBOVUwgYnl0ZSB0b28gKi8KKwkJZ2V0X3Jlc3BvbnNlX29yX3NheV9hbmRfZGllKGZkLCAic2VuZGluZyBjb250cm9sIGZpbGUiKTsKKworCQkvLyBzZW5kIGRhdGEgZmlsZSwgd2l0aCBuYW1lICJkZmFYWFgiCisJCWlmIChvcHRzICYgTFBSX1YpCisJCQliYl9lcnJvcl9tc2coInNlbmRpbmcgZGF0YSBmaWxlIik7CisJCWZkcHJpbnRmKGZkLCAiXHgzIiAiJSJPRkZfRk1UInUgZCVzXG4iLCBzdC5zdF9zaXplLCByZW1vdGVfZmlsZW5hbWUpOworCQlnZXRfcmVzcG9uc2Vfb3Jfc2F5X2FuZF9kaWUoZmQsICJzZW5kaW5nIGRhdGEgZmlsZSIpOworCQlpZiAoYmJfY29weWZkX3NpemUoZGZkLCBmZCwgc3Quc3Rfc2l6ZSkgIT0gc3Quc3Rfc2l6ZSkgeworCQkJLy8gV2UncmUgc2NyZXdlZC4gV2Ugc2VudCBsZXNzIGJ5dGVzIHRoYW4gd2UgYWR2ZXJ0aXNlZC4KKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJsb2NhbCBmaWxlIGNoYW5nZWQgc2l6ZT8hIik7CisJCX0KKwkJd3JpdGUoZmQsICIiLCAxKTsgLy8gc2VuZCBBQ0sKKwkJZ2V0X3Jlc3BvbnNlX29yX3NheV9hbmRfZGllKGZkLCAic2VuZGluZyBkYXRhIGZpbGUiKTsKKworCQkvLyBkZWxldGUgdGVtcG9yYXJ5IGZpbGUgaWYgd2UgZHVtcGVkIHN0ZGluCisJCWlmICgqYXJndiA9PSAoY2hhciopYmJfbXNnX3N0YW5kYXJkX2lucHV0KQorCQkJdW5saW5rKHRlbXBmaWxlKTsKKworCQkvLyBjbGVhbnVwCisJCWNsb3NlKGZkKTsKKwkJZnJlZShyZW1vdGVfZmlsZW5hbWUpOworCQlmcmVlKGNvbnRyb2xmaWxlKTsKKworCQkvLyBzYXkgam9iIGFjY2VwdGVkCisJCWlmIChvcHRzICYgTFBSX1YpCisJCQliYl9lcnJvcl9tc2coImpvYiBhY2NlcHRlZCIpOworCisJCS8vIG5leHQsIHBsZWFzZSEKKwkJam9iID0gKGpvYiArIDEpICUgMTAwMDsKKwl9IHdoaWxlICgqKythcmd2KTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9wcm9jcHMvQ29uZmlnLnNyYyBiL3Byb2Nwcy9Db25maWcuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyN2Q5ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9jcHMvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDE1OCBAQAorIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiUHJvY2VzcyBVdGlsaXRpZXMiCisKK0lOU0VSVAorCitjb25maWcgRlJFRQorCWJvb2wgImZyZWUiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYICNzeXNpbmZvKCkKKwloZWxwCisJICBmcmVlIGRpc3BsYXlzIHRoZSB0b3RhbCBhbW91bnQgb2YgZnJlZSBhbmQgdXNlZCBwaHlzaWNhbCBhbmQgc3dhcAorCSAgbWVtb3J5IGluIHRoZSBzeXN0ZW0sIGFzIHdlbGwgYXMgdGhlIGJ1ZmZlcnMgdXNlZCBieSB0aGUga2VybmVsLgorCSAgVGhlIHNoYXJlZCBtZW1vcnkgY29sdW1uIHNob3VsZCBiZSBpZ25vcmVkOyBpdCBpcyBvYnNvbGV0ZS4KKworY29uZmlnIEZVU0VSCisJYm9vbCAiZnVzZXIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgZnVzZXIgbGlzdHMgYWxsIFBJRHMgKFByb2Nlc3MgSURzKSB0aGF0IGN1cnJlbnRseSBoYXZlIGEgZ2l2ZW4KKwkgIGZpbGUgb3Blbi4gZnVzZXIgY2FuIGFsc28gbGlzdCBhbGwgUElEcyB0aGF0IGhhdmUgYSBnaXZlbiBuZXR3b3JrCisJICAoVENQIG9yIFVEUCkgcG9ydCBvcGVuLgorCitjb25maWcgS0lMTAorCWJvb2wgImtpbGwiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIGNvbW1hbmQga2lsbCBzZW5kcyB0aGUgc3BlY2lmaWVkIHNpZ25hbCB0byB0aGUgc3BlY2lmaWVkCisJICBwcm9jZXNzIG9yIHByb2Nlc3MgZ3JvdXAuIElmIG5vIHNpZ25hbCBpcyBzcGVjaWZpZWQsIHRoZSBURVJNCisJICBzaWduYWwgaXMgc2VudC4KKworY29uZmlnIEtJTExBTEwKKwlib29sICJraWxsYWxsIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gS0lMTAorCWhlbHAKKwkgIGtpbGxhbGwgc2VuZHMgYSBzaWduYWwgdG8gYWxsIHByb2Nlc3NlcyBydW5uaW5nIGFueSBvZiB0aGUKKwkgIHNwZWNpZmllZCBjb21tYW5kcy4gSWYgbm8gc2lnbmFsIG5hbWUgaXMgc3BlY2lmaWVkLCBTSUdURVJNIGlzCisJICBzZW50LgorCitjb25maWcgS0lMTEFMTDUKKwlib29sICJraWxsYWxsNSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEtJTEwKKworY29uZmlnIFBHUkVQCisJYm9vbCAicGdyZXAiCisJZGVmYXVsdCB5CisJaGVscAorCSAgTG9vayBmb3IgcHJvY2Vzc2VzIGJ5IG5hbWUuCisKK2NvbmZpZyBQSURPRgorCWJvb2wgInBpZG9mIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFBpZG9mIGZpbmRzIHRoZSBwcm9jZXNzIGlkJ3MgKHBpZHMpIG9mIHRoZSBuYW1lZCBwcm9ncmFtcy4gSXQgcHJpbnRzCisJICB0aG9zZSBpZCdzIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuCisKK2NvbmZpZyBGRUFUVVJFX1BJRE9GX1NJTkdMRQorCWJvb2wgIkVuYWJsZSBhcmd1bWVudCBmb3Igc2luZ2xlIHNob3QgKC1zKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFBJRE9GCisJaGVscAorCSAgU3VwcG9ydCBhcmd1bWVudCAnLXMnIGZvciByZXR1cm5pbmcgb25seSB0aGUgZmlyc3QgcGlkIGZvdW5kLgorCitjb25maWcgRkVBVFVSRV9QSURPRl9PTUlUCisJYm9vbCAiRW5hYmxlIGFyZ3VtZW50IGZvciBvbWl0dGluZyBwaWRzICgtbykiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBQSURPRgorCWhlbHAKKwkgIFN1cHBvcnQgYXJndW1lbnQgJy1vJyBmb3Igb21pdHRpbmcgdGhlIGdpdmVuIHBpZHMgaW4gb3V0cHV0LgorCSAgVGhlIHNwZWNpYWwgcGlkICVQUElEIGNhbiBiZSB1c2VkIHRvIG5hbWUgdGhlIHBhcmVudCBwcm9jZXNzCisJICBvZiB0aGUgcGlkb2YsIGluIG90aGVyIHdvcmRzIHRoZSBjYWxsaW5nIHNoZWxsIG9yIHNoZWxsIHNjcmlwdC4KKworY29uZmlnIFBLSUxMCisJYm9vbCAicGtpbGwiCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2VuZCBzaWduYWxzIHRvIHByb2Nlc3NlcyBieSBuYW1lLgorCitjb25maWcgUFMKKwlib29sICJwcyIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBwcyBnaXZlcyBhIHNuYXBzaG90IG9mIHRoZSBjdXJyZW50IHByb2Nlc3Nlcy4KKworY29uZmlnIEZFQVRVUkVfUFNfV0lERQorCWJvb2wgIkVuYWJsZSB3aWRlIG91dHB1dCBvcHRpb24gKC13KSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFBTICYmICFERVNLVE9QCisJaGVscAorCSAgU3VwcG9ydCBhcmd1bWVudCAndycgZm9yIHdpZGUgb3V0cHV0LgorCSAgSWYgZ2l2ZW4gb25jZSwgMTMyIGNoYXJzIGFyZSBwcmludGVkLCBhbmQgaWYgZ2l2ZW4gbW9yZQorCSAgdGhhbiBvbmNlLCB0aGUgbGVuZ3RoIGlzIHVubGltaXRlZC4KKworY29uZmlnIEZFQVRVUkVfUFNfTE9ORworCWJvb2wgIkVuYWJsZSBsb25nIG91dHB1dCBvcHRpb24gKC1sKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFBTICYmICFERVNLVE9QCisJaGVscAorCSAgU3VwcG9ydCBhcmd1bWVudCAnbCcgZm9yIGxvbmcgb3V0cHV0LgorCSAgQWRkcyBmaWVsZHMgUFBJRCwgUlNTLCBTVEFSVCwgVElNRSAmIFRUWQorCitjb25maWcgRkVBVFVSRV9QU19USU1FCisJYm9vbCAiRW5hYmxlIHRpbWUgYW5kIGVsYXBzZWQgdGltZSBvdXRwdXQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBQUyAmJiBERVNLVE9QCisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgU3VwcG9ydCAtbyB0aW1lIGFuZCAtbyBldGltZSBvdXRwdXQgc3BlY2lmaWVycy4KKworY29uZmlnIEZFQVRVUkVfUFNfQURESVRJT05BTF9DT0xVTU5TCisJYm9vbCAiRW5hYmxlIGFkZGl0aW9uYWwgcHMgY29sdW1ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFBTICYmIERFU0tUT1AKKwloZWxwCisJICBTdXBwb3J0IC1vIHJncm91cCwgLW8gcnVzZXIsIC1vIG5pY2Ugb3V0cHV0IHNwZWNpZmllcnMuCisKK2NvbmZpZyBGRUFUVVJFX1BTX1VOVVNVQUxfU1lTVEVNUworCWJvb2wgIlN1cHBvcnQgTGludXggcHJpb3IgdG8gMi40LjAgYW5kIG5vbi1FTEYgc3lzdGVtcyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZFQVRVUkVfUFNfVElNRQorCWhlbHAKKwkgIEluY2x1ZGUgc3VwcG9ydCBmb3IgbWVhc3VyaW5nIEhaIG9uIG9sZCBrZXJuZWxzIGFuZCBub24tRUxGIHN5c3RlbXMKKwkgIChpZiB5b3UgYXJlIG9uIExpbnV4IDIuNC4wKyBhbmQgdXNlIEVMRiwgeW91IGRvbid0IG5lZWQgdGhpcykKKworY29uZmlnIFJFTklDRQorCWJvb2wgInJlbmljZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBSZW5pY2UgYWx0ZXJzIHRoZSBzY2hlZHVsaW5nIHByaW9yaXR5IG9mIG9uZSBvciBtb3JlIHJ1bm5pbmcKKwkgIHByb2Nlc3Nlcy4KKworY29uZmlnIEJCX1NZU0NUTAorCWJvb2wgInN5c2N0bCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBDb25maWd1cmUga2VybmVsIHBhcmFtZXRlcnMgYXQgcnVudGltZS4KKworY29uZmlnIEZFQVRVUkVfU0hPV19USFJFQURTCisJYm9vbCAiU3VwcG9ydCBmb3Igc2hvd2luZyB0aHJlYWRzIGluIHBzL3BzdHJlZS90b3AiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBQUyB8fCBUT1AgfHwgUFNUUkVFCisJaGVscAorCSAgRW5hYmxlcyB0aGUgcHMgLVQgb3B0aW9uLCBzaG93aW5nIG9mIHRocmVhZHMgaW4gcHN0cmVlLAorCSAgYW5kICdoJyBjb21tYW5kIGluIHRvcC4KKworY29uZmlnIFdBVENICisJYm9vbCAid2F0Y2giCisJZGVmYXVsdCB5CisJaGVscAorCSAgd2F0Y2ggaXMgdXNlZCB0byBleGVjdXRlIGEgcHJvZ3JhbSBwZXJpb2RpY2FsbHksIHNob3dpbmcKKwkgIG91dHB1dCB0byB0aGUgc2NyZWVuLgorCitlbmRtZW51CmRpZmYgLS1naXQgYS9wcm9jcHMvS2J1aWxkLnNyYyBiL3Byb2Nwcy9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YjFjYzAKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9jcHMvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDIyIEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKK2xpYi0kKENPTkZJR19GUkVFKQkrPSBmcmVlLm8KK2xpYi0kKENPTkZJR19GVVNFUikJKz0gZnVzZXIubworbGliLSQoQ09ORklHX0tJTEwpCSs9IGtpbGwubworbGliLSQoQ09ORklHX0FTSCkJKz0ga2lsbC5vICAjIHVzZWQgZm9yIGJ1aWx0LWluIGtpbGwgYnkgYXNoCitsaWItJChDT05GSUdfUEdSRVApCSs9IHBncmVwLm8KK2xpYi0kKENPTkZJR19QS0lMTCkJKz0gcGdyZXAubworbGliLSQoQ09ORklHX1BJRE9GKQkrPSBwaWRvZi5vCitsaWItJChDT05GSUdfUFMpCSs9IHBzLm8KK2xpYi0kKENPTkZJR19SRU5JQ0UpCSs9IHJlbmljZS5vCitsaWItJChDT05GSUdfQkJfU1lTQ1RMKQkrPSBzeXNjdGwubworbGliLSQoQ09ORklHX1RPUCkJKz0gdG9wLm8KK2xpYi0kKENPTkZJR19VUFRJTUUpCSs9IHVwdGltZS5vCitsaWItJChDT05GSUdfV0FUQ0gpICAgICArPSB3YXRjaC5vCmRpZmYgLS1naXQgYS9wcm9jcHMvZnJlZS5jIGIvcHJvY3BzL2ZyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDAyM2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvY3BzL2ZyZWUuYwpAQCAtMCwwICsxLDEzNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBmcmVlIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyogZ2V0b3B0IG5vdCBuZWVkZWQgKi8KKworLy91c2FnZTojZGVmaW5lIGZyZWVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIiIgSUZfREVTS1RPUCgiWy1iL2svbS9nXSIpCisvL3VzYWdlOiNkZWZpbmUgZnJlZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRpc3BsYXkgdGhlIGFtb3VudCBvZiBmcmVlIGFuZCB1c2VkIHN5c3RlbSBtZW1vcnkiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGZyZWVfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgZnJlZVxuIgorLy91c2FnZTogICAgICAgIiAgICAgICAgICAgICAgdG90YWwgICAgICAgICB1c2VkICAgICAgICAgZnJlZSAgICAgICBzaGFyZWQgICAgICBidWZmZXJzXG4iCisvL3VzYWdlOiAgICAgICAiICBNZW06ICAgICAgIDI1NzYyOCAgICAgICAyNDg3MjQgICAgICAgICA4OTA0ICAgICAgICA1OTY0NCAgICAgICAgOTMxMjRcbiIKKy8vdXNhZ2U6ICAgICAgICIgU3dhcDogICAgICAgMTI4NTE2ICAgICAgICAgODQwNCAgICAgICAxMjAxMTJcbiIKKy8vdXNhZ2U6ICAgICAgICJUb3RhbDogICAgICAgMzg2MTQ0ICAgICAgIDI1NzEyOCAgICAgICAxMjkwMTZcbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaWZkZWYgX19saW51eF9fCisjIGluY2x1ZGUgPHN5cy9zeXNpbmZvLmg+CisjZW5kaWYKKworc3RydWN0IGdsb2JhbHMgeworCXVuc2lnbmVkIG1lbV91bml0OworI2lmIEVOQUJMRV9ERVNLVE9QCisJdW5zaWduZWQgdW5pdF9zdGVwczsKKyMgZGVmaW5lIEdfdW5pdF9zdGVwcyBHLnVuaXRfc3RlcHMKKyNlbHNlCisjIGRlZmluZSBHX3VuaXRfc3RlcHMgMTAKKyNlbmRpZgorfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyB9IHdoaWxlICgwKQorCisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvbmcgc2NhbGUodW5zaWduZWQgbG9uZyBkKQoreworCXJldHVybiAoKHVuc2lnbmVkIGxvbmcgbG9uZylkICogRy5tZW1fdW5pdCkgPj4gR191bml0X3N0ZXBzOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBwYXJzZV9jYWNoZWRfa2Iodm9pZCkKK3sKKwljaGFyIGJ1Zls2MF07IC8qIGFjdHVhbCBsaW5lcyB3ZSBleHBlY3QgYXJlIH4zMCBjaGFycyBvciBsZXNzICovCisJRklMRSAqZnA7CisJdW5zaWduZWQgbG9uZyBjYWNoZWQgPSAwOworCisJZnAgPSB4Zm9wZW5fZm9yX3JlYWQoIi9wcm9jL21lbWluZm8iKTsKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApICE9IE5VTEwpIHsKKwkJaWYgKHNzY2FuZihidWYsICJDYWNoZWQ6ICVsdSAlKnNcbiIsICZjYWNoZWQpID09IDEpCisJCQlicmVhazsKKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmY2xvc2UoZnApOworCisJcmV0dXJuIGNhY2hlZDsKK30KKworaW50IGZyZWVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZyZWVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IElGX05PVF9ERVNLVE9QKFVOVVNFRF9QQVJBTSkpCit7CisJc3RydWN0IHN5c2luZm8gaW5mbzsKKwl1bnNpZ25lZCBsb25nIGxvbmcgY2FjaGVkOworCisJSU5JVF9HKCk7CisKKyNpZiBFTkFCTEVfREVTS1RPUAorCUcudW5pdF9zdGVwcyA9IDEwOworCWlmIChhcmd2WzFdICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CisJCXN3aXRjaCAoYXJndlsxXVsxXSkgeworCQljYXNlICdiJzoKKwkJCUcudW5pdF9zdGVwcyA9IDA7CisJCQlicmVhazsKKwkJY2FzZSAnayc6IC8qIDJeMTAgKi8KKwkJCS8qIEcudW5pdF9zdGVwcyA9IDEwOyAtIGFscmVhZHkgaXMgKi8KKwkJCWJyZWFrOworCQljYXNlICdtJzogLyogMl4oMioxMCkgKi8KKwkJCUcudW5pdF9zdGVwcyA9IDIwOworCQkJYnJlYWs7CisJCWNhc2UgJ2cnOiAvKiAyXigzKjEwKSAqLworCQkJRy51bml0X3N0ZXBzID0gMzA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJfQorCX0KKyNlbmRpZgorCXByaW50ZigiICAgICAgICUxMXMlMTFzJTExcyUxMXMlMTFzJTExc1xuIgorCSJNZW06ICAgIiwKKwkJInRvdGFsIiwKKwkJInVzZWQiLAorCQkiZnJlZSIsCisJCSJzaGFyZWQiLCAiYnVmZmVycyIsICJjYWNoZWQiIC8qIHN3YXAgYW5kIHRvdGFsIGRvbid0IGhhdmUgdGhlc2UgY29sdW1ucyAqLworCSk7CisKKwlzeXNpbmZvKCZpbmZvKTsKKwkvKiBLZXJuZWxzIHByaW9yIHRvIDIuNC54IHdpbGwgcmV0dXJuIGluZm8ubWVtX3VuaXQ9PTAsIHNvIGNvcGUuLi4gKi8KKwlHLm1lbV91bml0ID0gKGluZm8ubWVtX3VuaXQgPyBpbmZvLm1lbV91bml0IDogMSk7CisJLyogRXh0cmFjdCBjYWNoZWQgZnJvbSAvcHJvYy9tZW1pbmZvIGFuZCBjb252ZXJ0IHRvIG1lbV91bml0cyAqLworCWNhY2hlZCA9ICgodW5zaWduZWQgbG9uZyBsb25nKSBwYXJzZV9jYWNoZWRfa2IoKSAqIDEwMjQpIC8gRy5tZW1fdW5pdDsKKworI2RlZmluZSBGSUVMRFNfNiAiJTExbGx1JTExbGx1JTExbGx1JTExbGx1JTExbGx1JTExbGx1XG4iCisjZGVmaW5lIEZJRUxEU18zIChGSUVMRFNfNiArIDMqNikKKyNkZWZpbmUgRklFTERTXzIgKEZJRUxEU182ICsgNCo2KQorCisJcHJpbnRmKEZJRUxEU182LAorCQlzY2FsZShpbmZvLnRvdGFscmFtKSwgICAgICAgICAgICAgICAgLy90b3RhbAorCQlzY2FsZShpbmZvLnRvdGFscmFtIC0gaW5mby5mcmVlcmFtKSwgLy91c2VkCisJCXNjYWxlKGluZm8uZnJlZXJhbSksICAgICAgICAgICAgICAgICAvL2ZyZWUKKwkJc2NhbGUoaW5mby5zaGFyZWRyYW0pLCAgICAgICAgICAgICAgIC8vc2hhcmVkCisJCXNjYWxlKGluZm8uYnVmZmVycmFtKSwgICAgICAgICAgICAgICAvL2J1ZmZlcnMKKwkJc2NhbGUoY2FjaGVkKSAgICAgICAgICAgICAgICAgICAgICAgIC8vY2FjaGVkCisJKTsKKwkvKiBTaG93IGFsdGVybmF0ZSwgbW9yZSBtZWFuaW5nZnVsIGJ1c3kvZnJlZSBudW1iZXJzIGJ5IGNvdW50aW5nCisJICogYnVmZmVyIGNhY2hlIGFzIGZyZWUgbWVtb3J5LiAqLworCXByaW50ZigiLS8rIGJ1ZmZlcnMvY2FjaGU6Iik7CisJY2FjaGVkICs9IGluZm8uZnJlZXJhbTsKKwljYWNoZWQgKz0gaW5mby5idWZmZXJyYW07CisJcHJpbnRmKEZJRUxEU18yLAorCQlzY2FsZShpbmZvLnRvdGFscmFtIC0gY2FjaGVkKSwgLy91c2VkCisJCXNjYWxlKGNhY2hlZCkgICAgICAgICAgICAgICAgICAvL2ZyZWUKKwkpOworI2lmIEJCX01NVQorCXByaW50ZigiU3dhcDogICIpOworCXByaW50ZihGSUVMRFNfMywKKwkJc2NhbGUoaW5mby50b3RhbHN3YXApLCAgICAgICAgICAgICAgICAgLy90b3RhbAorCQlzY2FsZShpbmZvLnRvdGFsc3dhcCAtIGluZm8uZnJlZXN3YXApLCAvL3VzZWQKKwkJc2NhbGUoaW5mby5mcmVlc3dhcCkgICAgICAgICAgICAgICAgICAgLy9mcmVlCisJKTsKKyNlbmRpZgorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9wcm9jcHMvZnVzZXIuYyBiL3Byb2Nwcy9mdXNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YjUyYWIKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9jcHMvZnVzZXIuYwpAQCAtMCwwICsxLDMyMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogdGlueSBmdXNlciBpbXBsZW1lbnRhdGlvbgorICoKKyAqIENvcHlyaWdodCAyMDA0IFRvbnkgSi4gV2hpdGUKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBmdXNlcl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIEZJTEUgb3IgUE9SVC9QUk9UTyIKKy8vdXNhZ2U6I2RlZmluZSBmdXNlcl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkZpbmQgcHJvY2Vzc2VzIHdoaWNoIHVzZSBGSUxFcyBvciBQT1JUc1xuIgorLy91c2FnZTogICAgICJcbgktbQlGaW5kIHByb2Nlc3NlcyB3aGljaCB1c2Ugc2FtZSBmcyBhcyBGSUxFcyIKKy8vdXNhZ2U6ICAgICAiXG4JLTQsLTYJU2VhcmNoIG9ubHkgSVB2NC9JUHY2IHNwYWNlIgorLy91c2FnZTogICAgICJcbgktcwlEb24ndCBkaXNwbGF5IFBJRHMiCisvL3VzYWdlOiAgICAgIlxuCS1rCUtpbGwgZm91bmQgcHJvY2Vzc2VzIgorLy91c2FnZTogICAgICJcbgktU0lHTkFMCVNpZ25hbCB0byBzZW5kIChkZWZhdWx0OiBLSUxMKSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgTUFYX0xJTkUgMjU1CisKKyNkZWZpbmUgT1BUSU9OX1NUUklORyAibWtzNjQiCitlbnVtIHsKKwlPUFRfTU9VTlQgID0gKDEgPDwgMCksCisJT1BUX0tJTEwgICA9ICgxIDw8IDEpLAorCU9QVF9TSUxFTlQgPSAoMSA8PCAyKSwKKwlPUFRfSVA2ICAgID0gKDEgPDwgMyksCisJT1BUX0lQNCAgICA9ICgxIDw8IDQpLAorfTsKKwordHlwZWRlZiBzdHJ1Y3QgaW5vZGVfbGlzdCB7CisJc3RydWN0IGlub2RlX2xpc3QgKm5leHQ7CisJaW5vX3QgaW5vZGU7CisJZGV2X3QgZGV2OworfSBpbm9kZV9saXN0OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJaW50IHJlY3Vyc2lvbl9kZXB0aDsKKwlwaWRfdCBteXBpZDsKKwlpbm9kZV9saXN0ICppbm9kZV9saXN0X2hlYWQ7CisJc21hbGxpbnQga2lsbF9mYWlsZWQ7CisJaW50IGtpbGxzaWc7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlHLm15cGlkID0gZ2V0cGlkKCk7IFwKKwlHLmtpbGxzaWcgPSBTSUdLSUxMOyBcCit9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBhZGRfaW5vZGUoY29uc3Qgc3RydWN0IHN0YXQgKnN0KQoreworCWlub2RlX2xpc3QgKipjdXJyID0gJkcuaW5vZGVfbGlzdF9oZWFkOworCisJd2hpbGUgKCpjdXJyKSB7CisJCWlmICgoKmN1cnIpLT5kZXYgPT0gc3QtPnN0X2RldgorCQkgJiYgKCpjdXJyKS0+aW5vZGUgPT0gc3QtPnN0X2lubworCQkpIHsKKwkJCXJldHVybjsKKwkJfQorCQljdXJyID0gJigqY3VyciktPm5leHQ7CisJfQorCisJKmN1cnIgPSB4emFsbG9jKHNpemVvZihpbm9kZV9saXN0KSk7CisJKCpjdXJyKS0+ZGV2ID0gc3QtPnN0X2RldjsKKwkoKmN1cnIpLT5pbm9kZSA9IHN0LT5zdF9pbm87Cit9CisKK3N0YXRpYyBzbWFsbGludCBzZWFyY2hfZGV2X2lub2RlKGNvbnN0IHN0cnVjdCBzdGF0ICpzdCkKK3sKKwlpbm9kZV9saXN0ICppbGlzdCA9IEcuaW5vZGVfbGlzdF9oZWFkOworCisJd2hpbGUgKGlsaXN0KSB7CisJCWlmIChpbGlzdC0+ZGV2ID09IHN0LT5zdF9kZXYpIHsKKwkJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX01PVU5UKQorCQkJCXJldHVybiAxOworCQkJaWYgKGlsaXN0LT5pbm9kZSA9PSBzdC0+c3RfaW5vKQorCQkJCXJldHVybiAxOworCQl9CisJCWlsaXN0ID0gaWxpc3QtPm5leHQ7CisJfQorCXJldHVybiAwOworfQorCitlbnVtIHsKKwlQUk9DX05FVCA9IDAsCisJUFJPQ19ESVIsCisJUFJPQ19ESVJfTElOS1MsCisJUFJPQ19TVUJESVJfTElOS1MsCit9OworCitzdGF0aWMgc21hbGxpbnQgc2Nhbl9wcm9jX25ldF9vcl9tYXBzKGNvbnN0IGNoYXIgKnBhdGgsIHVuc2lnbmVkIHBvcnQpCit7CisJRklMRSAqZjsKKwljaGFyIGxpbmVbTUFYX0xJTkUgKyAxXSwgYWRkcls2OF07CisJaW50IG1ham9yLCBtaW5vciwgcjsKKwlsb25nIGxvbmcgdWludDY0X2lub2RlOworCXVuc2lnbmVkIHRtcF9wb3J0OworCXNtYWxsaW50IHJldHZhbDsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCWNvbnN0IGNoYXIgKmZtdDsKKwl2b2lkICpmYWcsICpzYWc7CisKKwlmID0gZm9wZW5fZm9yX3JlYWQocGF0aCk7CisJaWYgKCFmKQorCQlyZXR1cm4gMDsKKworCWlmIChHLnJlY3Vyc2lvbl9kZXB0aCA9PSBQUk9DX05FVCkgeworCQlpbnQgZmQ7CisKKwkJLyogZmluZCBzb2NrZXQgZGV2ICovCisJCXN0YXRidWYuc3RfZGV2ID0gMDsKKwkJZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJCWlmIChmZCA+PSAwKSB7CisJCQlmc3RhdChmZCwgJnN0YXRidWYpOworCQkJY2xvc2UoZmQpOworCQl9CisKKwkJZm10ID0gIiUqZDogJTY0WzAtOUEtRmEtZl06JXggJSp4OiUqeCAlKnggIgorCQkJIiUqeDolKnggJSp4OiUqeCAlKnggJSpkICUqZCAlbGx1IjsKKwkJZmFnID0gYWRkcjsKKwkJc2FnID0gJnRtcF9wb3J0OworCX0gZWxzZSB7CisJCWZtdCA9ICIlKnMgJSpzICUqcyAleDoleCAlbGx1IjsKKwkJZmFnID0gJm1ham9yOworCQlzYWcgPSAmbWlub3I7CisJfQorCisJcmV0dmFsID0gMDsKKwl3aGlsZSAoZmdldHMobGluZSwgTUFYX0xJTkUsIGYpKSB7CisJCXIgPSBzc2NhbmYobGluZSwgZm10LCBmYWcsIHNhZywgJnVpbnQ2NF9pbm9kZSk7CisJCWlmIChyICE9IDMpCisJCQljb250aW51ZTsKKworCQlzdGF0YnVmLnN0X2lubyA9IHVpbnQ2NF9pbm9kZTsKKwkJaWYgKEcucmVjdXJzaW9uX2RlcHRoID09IFBST0NfTkVUKSB7CisJCQlyID0gc3RybGVuKGFkZHIpOworCQkJaWYgKHIgPT0gOCAmJiAob3B0aW9uX21hc2szMiAmIE9QVF9JUDYpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKHIgPiA4ICYmIChvcHRpb25fbWFzazMyICYgT1BUX0lQNCkpCisJCQkJY29udGludWU7CisJCQlpZiAodG1wX3BvcnQgPT0gcG9ydCkKKwkJCQlhZGRfaW5vZGUoJnN0YXRidWYpOworCQl9IGVsc2UgeworCQkJaWYgKG1ham9yICE9IDAgJiYgbWlub3IgIT0gMCAmJiBzdGF0YnVmLnN0X2lubyAhPSAwKSB7CisJCQkJc3RhdGJ1Zi5zdF9kZXYgPSBtYWtlZGV2KG1ham9yLCBtaW5vcik7CisJCQkJcmV0dmFsID0gc2VhcmNoX2Rldl9pbm9kZSgmc3RhdGJ1Zik7CisJCQkJaWYgKHJldHZhbCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJZmNsb3NlKGYpOworCisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIHNtYWxsaW50IHNjYW5fcmVjdXJzaXZlKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJRElSICpkOworCXN0cnVjdCBkaXJlbnQgKmRfZW50OworCXNtYWxsaW50IHN0b3Bfc2NhbjsKKwlzbWFsbGludCByZXR2YWw7CisKKwlkID0gb3BlbmRpcihwYXRoKTsKKwlpZiAoZCA9PSBOVUxMKQorCQlyZXR1cm4gMDsKKworCUcucmVjdXJzaW9uX2RlcHRoKys7CisJcmV0dmFsID0gMDsKKwlzdG9wX3NjYW4gPSAwOworCXdoaWxlICghc3RvcF9zY2FuICYmIChkX2VudCA9IHJlYWRkaXIoZCkpICE9IE5VTEwpIHsKKwkJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwkJcGlkX3QgcGlkOworCQljaGFyICpzdWJwYXRoOworCisJCXN1YnBhdGggPSBjb25jYXRfc3VicGF0aF9maWxlKHBhdGgsIGRfZW50LT5kX25hbWUpOworCQlpZiAoc3VicGF0aCA9PSBOVUxMKQorCQkJY29udGludWU7IC8qIC4gb3IgLi4gKi8KKworCQlzd2l0Y2ggKEcucmVjdXJzaW9uX2RlcHRoKSB7CisJCWNhc2UgUFJPQ19ESVI6CisJCQlwaWQgPSAocGlkX3QpYmJfc3RydG91KGRfZW50LT5kX25hbWUsIE5VTEwsIDEwKTsKKwkJCWlmIChlcnJubyAhPSAwCisJCQkgfHwgcGlkID09IEcubXlwaWQKKwkJCS8qICJ0aGlzIFBJRCBkb2Vzbid0IHVzZSBzcGVjaWZpZWQgRklMRXMgb3IgUE9SVC9QUk9UTyI6ICovCisJCQkgfHwgc2Nhbl9yZWN1cnNpdmUoc3VicGF0aCkgPT0gMAorCQkJKSB7CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9LSUxMKSB7CisJCQkJaWYgKGtpbGwocGlkLCBHLmtpbGxzaWcpICE9IDApIHsKKwkJCQkJYmJfcGVycm9yX21zZygia2lsbCBwaWQgJXMiLCBkX2VudC0+ZF9uYW1lKTsKKwkJCQkJRy5raWxsX2ZhaWxlZCA9IDE7CisJCQkJfQorCQkJfQorCQkJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9TSUxFTlQpKQorCQkJCXByaW50ZigiJXMgIiwgZF9lbnQtPmRfbmFtZSk7CisJCQlyZXR2YWwgPSAxOworCQkJYnJlYWs7CisKKwkJY2FzZSBQUk9DX0RJUl9MSU5LUzoKKwkJCXN3aXRjaCAoCisJCQkJaW5kZXhfaW5fc3Vic3RyaW5ncygKKwkJCQkJImN3ZCIgICJcMCIgImV4ZSIgICJcMCIKKwkJCQkJInJvb3QiICJcMCIgImZkIiAgICJcMCIKKwkJCQkJImxpYiIgICJcMCIgIm1tYXAiICJcMCIKKwkJCQkJIm1hcHMiICJcMCIsCisJCQkJCWRfZW50LT5kX25hbWUKKwkJCQkpCisJCQkpIHsKKwkJCWVudW0geworCQkJCUNXRF9MSU5LLAorCQkJCUVYRV9MSU5LLAorCQkJCVJPT1RfTElOSywKKwkJCQlGRF9ESVJfTElOS1MsCisJCQkJTElCX0RJUl9MSU5LUywKKwkJCQlNTUFQX0RJUl9MSU5LUywKKwkJCQlNQVBTLAorCQkJfTsKKwkJCWNhc2UgQ1dEX0xJTks6CisJCQljYXNlIEVYRV9MSU5LOgorCQkJY2FzZSBST09UX0xJTks6CisJCQkJZ290byBzY2FuX2xpbms7CisJCQljYXNlIEZEX0RJUl9MSU5LUzoKKwkJCWNhc2UgTElCX0RJUl9MSU5LUzoKKwkJCWNhc2UgTU1BUF9ESVJfTElOS1M6CisJCQkJc3RvcF9zY2FuID0gc2Nhbl9yZWN1cnNpdmUoc3VicGF0aCk7CisJCQkJaWYgKHN0b3Bfc2NhbikKKwkJCQkJcmV0dmFsID0gc3RvcF9zY2FuOworCQkJCWJyZWFrOworCQkJY2FzZSBNQVBTOgorCQkJCXN0b3Bfc2NhbiA9IHNjYW5fcHJvY19uZXRfb3JfbWFwcyhzdWJwYXRoLCAwKTsKKwkJCQlpZiAoc3RvcF9zY2FuKQorCQkJCQlyZXR2YWwgPSBzdG9wX3NjYW47CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgUFJPQ19TVUJESVJfTElOS1M6CisgIHNjYW5fbGluazoKKwkJCWlmIChzdGF0KHN1YnBhdGgsICZzdGF0YnVmKSA8IDApCisJCQkJYnJlYWs7CisJCQlzdG9wX3NjYW4gPSBzZWFyY2hfZGV2X2lub2RlKCZzdGF0YnVmKTsKKwkJCWlmIChzdG9wX3NjYW4pCisJCQkJcmV0dmFsID0gc3RvcF9zY2FuOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJZnJlZShzdWJwYXRoKTsKKwl9CisJY2xvc2VkaXIoZCk7CisJRy5yZWN1cnNpb25fZGVwdGgtLTsKKwlyZXR1cm4gcmV0dmFsOworfQorCitpbnQgZnVzZXJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZ1c2VyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICoqcHA7CisKKwlJTklUX0coKTsKKworCS8qIEhhbmRsZSAtU0lHTkFMLiBPaCBteS4uLiAqLworCXBwID0gYXJndjsKKwl3aGlsZSAoKisrcHApIHsKKwkJaW50IHNpZzsKKwkJY2hhciAqYXJnID0gKnBwOworCisJCWlmIChhcmdbMF0gIT0gJy0nKQorCQkJY29udGludWU7CisJCWlmIChhcmdbMV0gPT0gJy0nICYmIGFyZ1syXSA9PSAnXDAnKSAvKiAiLS0iICovCisJCQlicmVhazsKKwkJaWYgKChhcmdbMV0gPT0gJzQnIHx8IGFyZ1sxXSA9PSAnNicpICYmIGFyZ1syXSA9PSAnXDAnKQorCQkJY29udGludWU7IC8qIGl0J3MgIi00IiBvciAiLTYiICovCisJCXNpZyA9IGdldF9zaWdudW0oJmFyZ1sxXSk7CisJCWlmIChzaWcgPCAwKQorCQkJY29udGludWU7CisJCS8qICItU0lHTkFMIiBvcHRpb24gZm91bmQuIFJlbW92ZSBpdCBhbmQgYmFpbCBvdXQgKi8KKwkJRy5raWxsc2lnID0gc2lnOworCQlkbyB7CisJCQlwcFswXSA9IGFyZyA9IHBwWzFdOworCQkJcHArKzsKKwkJfSB3aGlsZSAoYXJnKTsKKwkJYnJlYWs7CisJfQorCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiOyAvKiBhdCBsZWFzdCBvbmUgcGFyYW0gKi8KKwlnZXRvcHQzMihhcmd2LCBPUFRJT05fU1RSSU5HKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCXBwID0gYXJndjsKKwl3aGlsZSAoKnBwKSB7CisJCS8qIHBhcnNlIG5ldCBhcmcgKi8KKwkJdW5zaWduZWQgcG9ydDsKKwkJY2hhciBwYXRoW3NpemVvZigiL3Byb2MvbmV0L1RDUDYiKV07CisKKwkJc3RyY3B5KHBhdGgsICIvcHJvYy9uZXQvIik7CisJCWlmIChzc2NhbmYoKnBwLCAiJXUvJTRzIiwgJnBvcnQsIHBhdGggKyBzaXplb2YoIi9wcm9jL25ldC8iKS0xKSA9PSAyCisJCSAmJiBhY2Nlc3MocGF0aCwgUl9PSykgPT0gMAorCQkpIHsKKwkJCS8qIFBPUlQvUFJPVE8gKi8KKwkJCXNjYW5fcHJvY19uZXRfb3JfbWFwcyhwYXRoLCBwb3J0KTsKKwkJfSBlbHNlIHsKKwkJCS8qIEZJTEUgKi8KKwkJCXN0cnVjdCBzdGF0IHN0YXRidWY7CisJCQl4c3RhdCgqcHAsICZzdGF0YnVmKTsKKwkJCWFkZF9pbm9kZSgmc3RhdGJ1Zik7CisJCX0KKwkJcHArKzsKKwl9CisKKwlpZiAoc2Nhbl9yZWN1cnNpdmUoIi9wcm9jIikpIHsKKwkJaWYgKCEob3B0aW9uX21hc2szMiAmIE9QVF9TSUxFTlQpKQorCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJcmV0dXJuIEcua2lsbF9mYWlsZWQ7CisJfQorCisJcmV0dXJuIEVYSVRfRkFJTFVSRTsKK30KZGlmZiAtLWdpdCBhL3Byb2Nwcy9pb3N0YXQuYyBiL3Byb2Nwcy9pb3N0YXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjkwYzU5Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvY3BzL2lvc3RhdC5jCkBAIC0wLDAgKzEsNTMwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBSZXBvcnQgQ1BVIGFuZCBJL08gc3RhdHMsIGJhc2VkIG9uIHN5c3N0YXQgdmVyc2lvbiA5LjEuMiBieSBTZWJhc3RpZW4gR29kYXJkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE1hcmVrIFBvbGFjZWsgPG1tcG9sYWNla0BnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2NvbmZpZzpjb25maWcgSU9TVEFUCisvL2NvbmZpZzoJYm9vbCAiaW9zdGF0IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFJlcG9ydCBDUFUgYW5kIEkvTyBzdGF0aXN0aWNzCisKKy8vYXBwbGV0OklGX0lPU1RBVChBUFBMRVQoaW9zdGF0LCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfSU9TVEFUKSArPSBpb3N0YXQubworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPiAgLyogc3RydWN0IHV0c25hbWUgKi8KKworLy8jZGVmaW5lIGRlYnVnKGZtdCwgLi4uKSBmcHJpbnRmKHN0ZGVyciwgZm10LCAjIyBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgZGVidWcoZm10LCAuLi4pICgodm9pZCkwKQorCisjZGVmaW5lIE1BWF9ERVZJQ0VfTkFNRSAxMgorI2RlZmluZSBNQVhfREVWSUNFX05BTUVfU1RSICIxMiIKKworI2lmIDEKK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGNwdXRpbWVfdDsKK3R5cGVkZWYgbG9uZyBsb25nIGljcHV0aW1lX3Q7CisjIGRlZmluZSBGTVRfREFUQSAibGwiCisjIGRlZmluZSBDUFVUSU1FX01BWCAofjBVTEwpCisjZWxzZQordHlwZWRlZiB1bnNpZ25lZCBsb25nIGNwdXRpbWVfdDsKK3R5cGVkZWYgbG9uZyBpY3B1dGltZV90OworIyBkZWZpbmUgRk1UX0RBVEEgImwiCisjIGRlZmluZSBDUFVUSU1FX01BWCAofjBVTCkKKyNlbmRpZgorCitlbnVtIHsKKwlTVEFUU19DUFVfVVNFUiwKKwlTVEFUU19DUFVfTklDRSwKKwlTVEFUU19DUFVfU1lTVEVNLAorCVNUQVRTX0NQVV9JRExFLAorCVNUQVRTX0NQVV9JT1dBSVQsCisJU1RBVFNfQ1BVX0lSUSwKKwlTVEFUU19DUFVfU09GVElSUSwKKwlTVEFUU19DUFVfU1RFQUwsCisJU1RBVFNfQ1BVX0dVRVNULAorCisJR0xPQkFMX1VQVElNRSwKKwlTTVBfVVBUSU1FLAorCisJTl9TVEFUU19DUFUsCit9OworCit0eXBlZGVmIHN0cnVjdCB7CisJY3B1dGltZV90IHZlY3RvcltOX1NUQVRTX0NQVV07Cit9IHN0YXRzX2NwdV90OworCit0eXBlZGVmIHN0cnVjdCB7CisJc3RhdHNfY3B1X3QgKnByZXY7CisJc3RhdHNfY3B1X3QgKmN1cnI7CisJY3B1dGltZV90IGl0djsKK30gc3RhdHNfY3B1X3BhaXJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGxvbmcgbG9uZyByZF9zZWN0b3JzOworCXVuc2lnbmVkIGxvbmcgbG9uZyB3cl9zZWN0b3JzOworCXVuc2lnbmVkIGxvbmcgcmRfb3BzOworCXVuc2lnbmVkIGxvbmcgd3Jfb3BzOworfSBzdGF0c19kZXZfZGF0YV90OworCit0eXBlZGVmIHN0cnVjdCBzdGF0c19kZXYgeworCXN0cnVjdCBzdGF0c19kZXYgKm5leHQ7CisJY2hhciBkbmFtZVtNQVhfREVWSUNFX05BTUUgKyAxXTsKKwlzdGF0c19kZXZfZGF0YV90IHByZXZfZGF0YTsKKwlzdGF0c19kZXZfZGF0YV90IGN1cnJfZGF0YTsKK30gc3RhdHNfZGV2X3Q7CisKKy8qIEdsb2JhbHMuIFNvcnQgYnkgc2l6ZSBhbmQgYWNjZXNzIGZyZXF1ZW5jeS4gKi8KK3N0cnVjdCBnbG9iYWxzIHsKKwlzbWFsbGludCBzaG93X2FsbDsKKwl1bnNpZ25lZCB0b3RhbF9jcHVzOyAgICAgICAgICAgIC8qIE51bWJlciBvZiBDUFVzICovCisJdW5zaWduZWQgY2xrX3RjazsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgY2xvY2sgdGlja3MgcGVyIHNlY29uZCAqLworCWxsaXN0X3QgKmRldl9uYW1lX2xpc3Q7ICAgICAgICAgLyogTGlzdCBvZiBkZXZpY2VzIGVudGVyZWQgb24gdGhlIGNvbW1hbmQgbGluZSAqLworCXN0YXRzX2Rldl90ICpzdGF0c19kZXZfbGlzdDsKKwlzdHJ1Y3QgdG0gdG10aW1lOworCXN0cnVjdCB7CisJCWNvbnN0IGNoYXIgKnN0cjsKKwkJdW5zaWduZWQgZGl2OworCX0gdW5pdDsKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKKwlHLnVuaXQuc3RyID0gIkJsayI7IFwKKwlHLnVuaXQuZGl2ID0gMTsgXAorfSB3aGlsZSAoMCkKKworLyogTXVzdCBtYXRjaCBvcHRpb24gc3RyaW5nISAqLworZW51bSB7CisJT1BUX2MgPSAxIDw8IDAsCisJT1BUX2QgPSAxIDw8IDEsCisJT1BUX3QgPSAxIDw8IDIsCisJT1BUX3ogPSAxIDw8IDMsCisJT1BUX2sgPSAxIDw8IDQsCisJT1BUX20gPSAxIDw8IDUsCit9OworCitzdGF0aWMgQUxXQVlTX0lOTElORSBpbnQgdGhpc19pc19zbXAodm9pZCkKK3sKKwlyZXR1cm4gKEcudG90YWxfY3B1cyA+IDEpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9oZWFkZXIodm9pZCkKK3sKKwljaGFyIGJ1ZlszMl07CisJc3RydWN0IHV0c25hbWUgdXRzOworCisJdW5hbWUoJnV0cyk7IC8qIG5ldmVyIGZhaWxzICovCisKKwkvKiBEYXRlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgY3VycmVudCBsb2NhbGUgKi8KKwlzdHJmdGltZShidWYsIHNpemVvZihidWYpLCAiJXgiLCAmRy50bXRpbWUpOworCisJcHJpbnRmKCIlcyAlcyAoJXMpIFx0JXMgXHRfJXNfXHQoJXUgQ1BVKVxuXG4iLAorCQkJdXRzLnN5c25hbWUsIHV0cy5yZWxlYXNlLCB1dHMubm9kZW5hbWUsCisJCQlidWYsIHV0cy5tYWNoaW5lLCBHLnRvdGFsX2NwdXMpOworfQorCitzdGF0aWMgdm9pZCBnZXRfbG9jYWx0aW1lKHN0cnVjdCB0bSAqcHRtKQoreworCXRpbWVfdCB0aW1lcjsKKwl0aW1lKCZ0aW1lcik7CisJbG9jYWx0aW1lX3IoJnRpbWVyLCBwdG0pOworfQorCitzdGF0aWMgdm9pZCBwcmludF90aW1lc3RhbXAodm9pZCkKK3sKKwljaGFyIGJ1Zls2NF07CisJLyogJXg6IGRhdGUgcmVwcmVzZW50YXRpb24gZm9yIHRoZSBjdXJyZW50IGxvY2FsZSAqLworCS8qICVYOiB0aW1lIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgY3VycmVudCBsb2NhbGUgKi8KKwlzdHJmdGltZShidWYsIHNpemVvZihidWYpLCAiJXggJVgiLCAmRy50bXRpbWUpOworCXB1dHMoYnVmKTsKK30KKworc3RhdGljIGNwdXRpbWVfdCBnZXRfc21wX3VwdGltZSh2b2lkKQoreworCUZJTEUgKmZwOworCXVuc2lnbmVkIGxvbmcgc2VjLCBkZWM7CisKKwlmcCA9IHhmb3Blbl9mb3JfcmVhZCgiL3Byb2MvdXB0aW1lIik7CisKKwlpZiAoZnNjYW5mKGZwLCAiJWx1LiVsdSIsICZzZWMsICZkZWMpICE9IDIpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCByZWFkICclcyciLCAiL3Byb2MvdXB0aW1lIik7CisKKwlmY2xvc2UoZnApOworCisJcmV0dXJuIChjcHV0aW1lX3Qpc2VjICogRy5jbGtfdGNrICsgZGVjICogRy5jbGtfdGNrIC8gMTAwOworfQorCisvKiBGZXRjaCBDUFUgc3RhdGlzdGljcyBmcm9tIC9wcm9jL3N0YXQgKi8KK3N0YXRpYyB2b2lkIGdldF9jcHVfc3RhdGlzdGljcyhzdGF0c19jcHVfdCAqc2MpCit7CisJRklMRSAqZnA7CisJY2hhciBidWZbMTAyNF07CisKKwlmcCA9IHhmb3Blbl9mb3JfcmVhZCgiL3Byb2Mvc3RhdCIpOworCisJbWVtc2V0KHNjLCAwLCBzaXplb2YoKnNjKSk7CisKKwl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCWludCBpOworCQljaGFyICppYnVmOworCisJCS8qIERvZXMgdGhlIGxpbmUgc3RhcnQgd2l0aCAiY3B1ICI/ICovCisJCWlmICghc3RhcnRzX3dpdGhfY3B1KGJ1ZikgfHwgYnVmWzNdICE9ICcgJykgeworCQkJY29udGludWU7CisJCX0KKwkJaWJ1ZiA9IGJ1ZiArIDQ7CisJCWZvciAoaSA9IFNUQVRTX0NQVV9VU0VSOyBpIDw9IFNUQVRTX0NQVV9HVUVTVDsgaSsrKSB7CisJCQlpYnVmID0gc2tpcF93aGl0ZXNwYWNlKGlidWYpOworCQkJc3NjYW5mKGlidWYsICIlIkZNVF9EQVRBInUiLCAmc2MtPnZlY3RvcltpXSk7CisJCQlpZiAoaSAhPSBTVEFUU19DUFVfR1VFU1QpIHsKKwkJCQlzYy0+dmVjdG9yW0dMT0JBTF9VUFRJTUVdICs9IHNjLT52ZWN0b3JbaV07CisJCQl9CisJCQlpYnVmID0gc2tpcF9ub25fd2hpdGVzcGFjZShpYnVmKTsKKwkJfQorCQlicmVhazsKKwl9CisKKwlpZiAodGhpc19pc19zbXAoKSkgeworCQlzYy0+dmVjdG9yW1NNUF9VUFRJTUVdID0gZ2V0X3NtcF91cHRpbWUoKTsKKwl9CisKKwlmY2xvc2UoZnApOworfQorCitzdGF0aWMgQUxXQVlTX0lOTElORSBjcHV0aW1lX3QgZ2V0X2ludGVydmFsKGNwdXRpbWVfdCBvbGQsIGNwdXRpbWVfdCBuZXcpCit7CisJY3B1dGltZV90IGl0diA9IG5ldyAtIG9sZDsKKworCXJldHVybiAoaXR2ID09IDApID8gMSA6IGl0djsKK30KKworI2lmIENQVVRJTUVfTUFYID4gMHhmZmZmZmZmZgorLyoKKyAqIEhhbmRsZSBvdmVyZmxvdyBjb25kaXRpb25zIHByb3Blcmx5IGZvciBjb3VudGVycyB3aGljaCBjYW4gaGF2ZQorICogbGVzcyBiaXRzIHRoYW4gY3B1dGltZV90LCBkZXBlbmRpbmcgb24gdGhlIGtlcm5lbCB2ZXJzaW9uLgorICovCisvKiBTdXJwcmlzaW5nbHksIG9uIDMyYml0IGlubGluaW5nIGlzIGEgc2l6ZSB3aW4gKi8KK3N0YXRpYyBBTFdBWVNfSU5MSU5FIGNwdXRpbWVfdCBvdmVyZmxvd19zYWZlX3N1YihjcHV0aW1lX3QgcHJldiwgY3B1dGltZV90IGN1cnIpCit7CisJY3B1dGltZV90IHYgPSBjdXJyIC0gcHJldjsKKworCWlmICgoaWNwdXRpbWVfdCl2IDwgMCAgICAgLyogY3VyciA8IHByZXYgLSBjb3VudGVyIG92ZXJmbG93PyAqLworCSAmJiBwcmV2IDw9IDB4ZmZmZmZmZmYgLyoga2VybmVsIHVzZXMgMzJiaXQgdmFsdWUgZm9yIHRoZSBjb3VudGVyPyAqLworCSkgeworCQkvKiBBZGQgMzN0aCBiaXQgc2V0IHRvIDEgdG8gY3VyciwgY29tcGVuc2F0aW5nIGZvciB0aGUgb3ZlcmZsb3cgKi8KKwkJLyogZG91YmxlIHNoaWZ0IGRlZmVhdHMgIndhcm5pbmc6IGxlZnQgc2hpZnQgY291bnQgPj0gd2lkdGggb2YgdHlwZSIgKi8KKwkJdiArPSAoKGNwdXRpbWVfdCkxIDw8IDE2KSA8PCAxNjsKKwl9CisJcmV0dXJuIHY7Cit9CisjZWxzZQorc3RhdGljIEFMV0FZU19JTkxJTkUgY3B1dGltZV90IG92ZXJmbG93X3NhZmVfc3ViKGNwdXRpbWVfdCBwcmV2LCBjcHV0aW1lX3QgY3VycikKK3sKKwlyZXR1cm4gY3VyciAtIHByZXY7Cit9CisjZW5kaWYKKworc3RhdGljIGRvdWJsZSBwZXJjZW50X3ZhbHVlKGNwdXRpbWVfdCBwcmV2LCBjcHV0aW1lX3QgY3VyciwgY3B1dGltZV90IGl0dikKK3sKKwlyZXR1cm4gKChkb3VibGUpb3ZlcmZsb3dfc2FmZV9zdWIocHJldiwgY3VycikpIC8gaXR2ICogMTAwOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zdGF0c19jcHVfc3RydWN0KHN0YXRzX2NwdV9wYWlyX3QgKnN0YXRzKQoreworCWNwdXRpbWVfdCAqcCA9IHN0YXRzLT5wcmV2LT52ZWN0b3I7CisJY3B1dGltZV90ICpjID0gc3RhdHMtPmN1cnItPnZlY3RvcjsKKwlwcmludGYoIiAgICAgICAgJTcuMmYgJTcuMmYgJTcuMmYgJTcuMmYgJTcuMmYgJTcuMmZcbiIsCisJCXBlcmNlbnRfdmFsdWUocFtTVEFUU19DUFVfVVNFUl0gICwgY1tTVEFUU19DUFVfVVNFUl0gICwgc3RhdHMtPml0diksCisJCXBlcmNlbnRfdmFsdWUocFtTVEFUU19DUFVfTklDRV0gICwgY1tTVEFUU19DUFVfTklDRV0gICwgc3RhdHMtPml0diksCisJCXBlcmNlbnRfdmFsdWUocFtTVEFUU19DUFVfU1lTVEVNXSArIHBbU1RBVFNfQ1BVX1NPRlRJUlFdICsgcFtTVEFUU19DUFVfSVJRXSwKKwkJCWNbU1RBVFNfQ1BVX1NZU1RFTV0gKyBjW1NUQVRTX0NQVV9TT0ZUSVJRXSArIGNbU1RBVFNfQ1BVX0lSUV0sIHN0YXRzLT5pdHYpLAorCQlwZXJjZW50X3ZhbHVlKHBbU1RBVFNfQ1BVX0lPV0FJVF0sIGNbU1RBVFNfQ1BVX0lPV0FJVF0sIHN0YXRzLT5pdHYpLAorCQlwZXJjZW50X3ZhbHVlKHBbU1RBVFNfQ1BVX1NURUFMXSAsIGNbU1RBVFNfQ1BVX1NURUFMXSAsIHN0YXRzLT5pdHYpLAorCQlwZXJjZW50X3ZhbHVlKHBbU1RBVFNfQ1BVX0lETEVdICAsIGNbU1RBVFNfQ1BVX0lETEVdICAsIHN0YXRzLT5pdHYpCisJKTsKK30KKworc3RhdGljIHZvaWQgY3B1X3JlcG9ydChzdGF0c19jcHVfcGFpcl90ICpzdGF0cykKK3sKKwkvKiBBbHdheXMgcHJpbnQgYSBoZWFkZXIgKi8KKwlwdXRzKCJhdmctY3B1OiAgJXVzZXIgICAlbmljZSAlc3lzdGVtICVpb3dhaXQgICVzdGVhbCAgICVpZGxlIik7CisKKwkvKiBQcmludCBjdXJyZW50IHN0YXRpc3RpY3MgKi8KKwlwcmludF9zdGF0c19jcHVfc3RydWN0KHN0YXRzKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc3RhdHNfZGV2X3N0cnVjdChzdGF0c19kZXZfdCAqc3RhdHNfZGV2LCBjcHV0aW1lX3QgaXR2KQoreworCXN0YXRzX2Rldl9kYXRhX3QgKnAgPSAmc3RhdHNfZGV2LT5wcmV2X2RhdGE7CisJc3RhdHNfZGV2X2RhdGFfdCAqYyA9ICZzdGF0c19kZXYtPmN1cnJfZGF0YTsKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF96KQorCQlpZiAocC0+cmRfb3BzID09IGMtPnJkX29wcyAmJiBwLT53cl9vcHMgPT0gYy0+d3Jfb3BzKQorCQkJcmV0dXJuOworCisJcHJpbnRmKCIlLTEzcyAlOC4yZiAlMTIuMmYgJTEyLjJmICUxMGxsdSAlMTBsbHVcbiIsCisJCXN0YXRzX2Rldi0+ZG5hbWUsCisJCXBlcmNlbnRfdmFsdWUocC0+cmRfb3BzICsgcC0+d3Jfb3BzLCBjLT5yZF9vcHMgKyBjLT53cl9vcHMsIGl0diksCisJCXBlcmNlbnRfdmFsdWUocC0+cmRfc2VjdG9ycywgYy0+cmRfc2VjdG9ycywgaXR2KSAvIEcudW5pdC5kaXYsCisJCXBlcmNlbnRfdmFsdWUocC0+d3Jfc2VjdG9ycywgYy0+d3Jfc2VjdG9ycywgaXR2KSAvIEcudW5pdC5kaXYsCisJCShjLT5yZF9zZWN0b3JzIC0gcC0+cmRfc2VjdG9ycykgLyBHLnVuaXQuZGl2LAorCQkoYy0+d3Jfc2VjdG9ycyAtIHAtPndyX3NlY3RvcnMpIC8gRy51bml0LmRpdgorCSk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2RldnN0YXRfaGVhZGVyKHZvaWQpCit7CisJcHJpbnRmKCJEZXZpY2U6JTE1cyU2cyVzL3MlNnMlcy9zJTZzJXMlNnMlc1xuIiwKKwkJInRwcyIsCisJCUcudW5pdC5zdHIsICJfcmVhZCIsIEcudW5pdC5zdHIsICJfd3J0biIsCisJCUcudW5pdC5zdHIsICJfcmVhZCIsIEcudW5pdC5zdHIsICJfd3J0biIKKwkpOworfQorCisvKgorICogSXMgaW5wdXQgcGFydGl0aW9uIG9mIGZvcm1hdCBbc2RhTl0/CisgKi8KK3N0YXRpYyBpbnQgaXNfcGFydGl0aW9uKGNvbnN0IGNoYXIgKmRldikKK3sKKwkvKiBPaywgdGhpcyBpcyBuYWl2ZS4uLiAqLworCXJldHVybiAoKGRldlswXSAtICdzJykgfCAoZGV2WzFdIC0gJ2QnKSB8IChkZXZbMl0gLSAnYScpKSA9PSAwICYmIGlzZGlnaXQoZGV2WzNdKTsKK30KKworc3RhdGljIHN0YXRzX2Rldl90ICpzdGF0c19kZXZfZmluZF9vcl9uZXcoY29uc3QgY2hhciAqZGV2X25hbWUpCit7CisJc3RhdHNfZGV2X3QgKipjdXJyID0gJkcuc3RhdHNfZGV2X2xpc3Q7CisKKwl3aGlsZSAoKmN1cnIgIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKCgqY3VyciktPmRuYW1lLCBkZXZfbmFtZSkgPT0gMCkKKwkJCXJldHVybiAqY3VycjsKKwkJY3VyciA9ICYoKmN1cnIpLT5uZXh0OworCX0KKworCSpjdXJyID0geHphbGxvYyhzaXplb2Yoc3RhdHNfZGV2X3QpKTsKKwlzdHJuY3B5KCgqY3VyciktPmRuYW1lLCBkZXZfbmFtZSwgTUFYX0RFVklDRV9OQU1FKTsKKwlyZXR1cm4gKmN1cnI7Cit9CisKK3N0YXRpYyB2b2lkIHN0YXRzX2Rldl9mcmVlKHN0YXRzX2Rldl90ICpzdGF0c19kZXYpCit7CisJaWYgKHN0YXRzX2RldikgeworCQlzdGF0c19kZXZfZnJlZShzdGF0c19kZXYtPm5leHQpOworCQlmcmVlKHN0YXRzX2Rldik7CisJfQorfQorCitzdGF0aWMgdm9pZCBkb19kaXNrX3N0YXRpc3RpY3MoY3B1dGltZV90IGl0dikKK3sKKwljaGFyIGJ1ZlsxMjhdOworCWNoYXIgZGV2X25hbWVbTUFYX0RFVklDRV9OQU1FICsgMV07CisJdW5zaWduZWQgbG9uZyBsb25nIHJkX3NlY19vcl9kdW1teTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgd3Jfc2VjX29yX2R1bW15OworCXN0YXRzX2Rldl9kYXRhX3QgKmN1cnJfZGF0YTsKKwlzdGF0c19kZXZfdCAqc3RhdHNfZGV2OworCUZJTEUgKmZwOworCWludCByYzsKKworCWZwID0geGZvcGVuX2Zvcl9yZWFkKCIvcHJvYy9kaXNrc3RhdHMiKTsKKwkvKiBSZWFkIGFuZCBwb3NzaWJseSBwcmludCBzdGF0cyBmcm9tIC9wcm9jL2Rpc2tzdGF0cyAqLworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKKwkJc3NjYW5mKGJ1ZiwgIiUqcyAlKnMgJSJNQVhfREVWSUNFX05BTUVfU1RSInMiLCBkZXZfbmFtZSk7CisJCWlmIChHLmRldl9uYW1lX2xpc3QpIHsKKwkJCS8qIElzIGRldmljZSBuYW1lIGluIGxpc3Q/ICovCisJCQlpZiAoIWxsaXN0X2ZpbmRfc3RyKEcuZGV2X25hbWVfbGlzdCwgZGV2X25hbWUpKQorCQkJCWNvbnRpbnVlOworCQl9IGVsc2UgaWYgKGlzX3BhcnRpdGlvbihkZXZfbmFtZSkpIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3RhdHNfZGV2ID0gc3RhdHNfZGV2X2ZpbmRfb3JfbmV3KGRldl9uYW1lKTsKKwkJY3Vycl9kYXRhID0gJnN0YXRzX2Rldi0+Y3Vycl9kYXRhOworCisJCXJjID0gc3NjYW5mKGJ1ZiwgIiUqcyAlKnMgJSpzICVsdSAlbGx1ICVsbHUgJWxsdSAlbHUgJSpzICVsbHUiLAorCQkJJmN1cnJfZGF0YS0+cmRfb3BzLAorCQkJJnJkX3NlY19vcl9kdW1teSwKKwkJCSZjdXJyX2RhdGEtPnJkX3NlY3RvcnMsCisJCQkmd3Jfc2VjX29yX2R1bW15LAorCQkJJmN1cnJfZGF0YS0+d3Jfb3BzLAorCQkJJmN1cnJfZGF0YS0+d3Jfc2VjdG9ycyk7CisJCWlmIChyYyAhPSA2KSB7CisJCQljdXJyX2RhdGEtPnJkX3NlY3RvcnMgPSByZF9zZWNfb3JfZHVtbXk7CisJCQljdXJyX2RhdGEtPndyX3NlY3RvcnMgPSB3cl9zZWNfb3JfZHVtbXk7CisJCQkvL2N1cnJfZGF0YS0+cmRfb3BzID0gOworCQkJY3Vycl9kYXRhLT53cl9vcHMgPSAodW5zaWduZWQgbG9uZyljdXJyX2RhdGEtPnJkX3NlY3RvcnM7CisJCX0KKworCQlpZiAoIUcuZGV2X25hbWVfbGlzdCAvKiBVc2VyIGRpZG4ndCBzcGVjaWZ5IGRldmljZSAqLworCQkgJiYgIUcuc2hvd19hbGwKKwkJICYmIGN1cnJfZGF0YS0+cmRfb3BzID09IDAKKwkJICYmIGN1cnJfZGF0YS0+d3Jfb3BzID09IDAKKwkJKSB7CisJCQkvKiBEb24ndCBwcmludCB1bnVzZWQgZGV2aWNlICovCisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIFByaW50IGN1cnJlbnQgc3RhdGlzdGljcyAqLworCQlwcmludF9zdGF0c19kZXZfc3RydWN0KHN0YXRzX2RldiwgaXR2KTsKKwkJc3RhdHNfZGV2LT5wcmV2X2RhdGEgPSAqY3Vycl9kYXRhOworCX0KKworCWZjbG9zZShmcCk7Cit9CisKK3N0YXRpYyB2b2lkIGRldl9yZXBvcnQoY3B1dGltZV90IGl0dikKK3sKKwkvKiBBbHdheXMgcHJpbnQgYSBoZWFkZXIgKi8KKwlwcmludF9kZXZzdGF0X2hlYWRlcigpOworCisJLyogRmV0Y2ggY3VycmVudCBkaXNrIHN0YXRpc3RpY3MgKi8KKwlkb19kaXNrX3N0YXRpc3RpY3MoaXR2KTsKK30KKworLy91c2FnZTojZGVmaW5lIGlvc3RhdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jXSBbLWRdIFstdF0gWy16XSBbLWt8LW1dIFtBTEx8QkxPQ0tERVYuLi5dIFtJTlRFUlZBTCBbQ09VTlRdXSIKKy8vdXNhZ2U6I2RlZmluZSBpb3N0YXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSZXBvcnQgQ1BVIGFuZCBJL08gc3RhdGlzdGljc1xuIgorLy91c2FnZTogICAgICJcbgktYwlTaG93IENQVSB1dGlsaXphdGlvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWQJU2hvdyBkZXZpY2UgdXRpbGl6YXRpb24iCisvL3VzYWdlOiAgICAgIlxuCS10CVByaW50IGN1cnJlbnQgdGltZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXoJT21pdCBkZXZpY2VzIHdpdGggbm8gYWN0aXZpdHkiCisvL3VzYWdlOiAgICAgIlxuCS1rCVVzZSBrYi9zIgorLy91c2FnZTogICAgICJcbgktbQlVc2UgTWIvcyIKKworaW50IGlvc3RhdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaW9zdGF0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgb3B0OworCXVuc2lnbmVkIGludGVydmFsOworCWludCBjb3VudDsKKwlzdGF0c19jcHVfdCBzdGF0c19kYXRhWzJdOworCXNtYWxsaW50IGN1cnJlbnRfc3RhdHM7CisKKwlJTklUX0coKTsKKworCW1lbXNldCgmc3RhdHNfZGF0YSwgMCwgc2l6ZW9mKHN0YXRzX2RhdGEpKTsKKworCS8qIEdldCBudW1iZXIgb2YgY2xvY2sgdGlja3MgcGVyIHNlYyAqLworCUcuY2xrX3RjayA9IGJiX2Nsa190Y2soKTsKKworCS8qIERldGVybWluZSBudW1iZXIgb2YgQ1BVcyAqLworCUcudG90YWxfY3B1cyA9IGdldF9jcHVfY291bnQoKTsKKwlpZiAoRy50b3RhbF9jcHVzID09IDApCisJCUcudG90YWxfY3B1cyA9IDE7CisKKwkvKiBQYXJzZSBhbmQgcHJvY2VzcyBhcmd1bWVudHMgKi8KKwkvKiAtayBhbmQgLW0gYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gImstLW06bS0tayI7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImNkdHprbSIpOworCWlmICghKG9wdCAmIChPUFRfYyArIE9QVF9kKSkpCisJCS8qIERlZmF1bHQgaXMgLWNkICovCisJCW9wdCB8PSBPUFRfYyArIE9QVF9kOworCisJYXJndiArPSBvcHRpbmQ7CisKKwkvKiBTdG9yZSBkZXZpY2UgbmFtZXMgaW50byBkZXZpY2UgbGlzdCAqLworCXdoaWxlICgqYXJndiAmJiAhaXNkaWdpdCgqYXJndlswXSkpIHsKKwkJaWYgKHN0cmNtcCgqYXJndiwgIkFMTCIpICE9IDApIHsKKwkJCS8qIElmIG5vdCBBTEwsIHNhdmUgZGV2aWNlIG5hbWUgKi8KKwkJCWNoYXIgKmRldl9uYW1lID0gc2tpcF9kZXZfcGZ4KCphcmd2KTsKKwkJCWlmICghbGxpc3RfZmluZF9zdHIoRy5kZXZfbmFtZV9saXN0LCBkZXZfbmFtZSkpIHsKKwkJCQlsbGlzdF9hZGRfdG8oJkcuZGV2X25hbWVfbGlzdCwgZGV2X25hbWUpOworCQkJfQorCQl9IGVsc2UgeworCQkJRy5zaG93X2FsbCA9IDE7CisJCX0KKwkJYXJndisrOworCX0KKworCWludGVydmFsID0gMDsKKwljb3VudCA9IDE7CisJaWYgKCphcmd2KSB7CisJCS8qIEdldCBpbnRlcnZhbCAqLworCQlpbnRlcnZhbCA9IHhhdG9pX3Bvc2l0aXZlKCphcmd2KTsKKwkJY291bnQgPSAoaW50ZXJ2YWwgIT0gMCA/IC0xIDogMSk7CisJCWFyZ3YrKzsKKwkJaWYgKCphcmd2KQorCQkJLyogR2V0IGNvdW50IHZhbHVlICovCisJCQljb3VudCA9IHhhdG9pX3Bvc2l0aXZlKCphcmd2KTsKKwl9CisKKwlpZiAob3B0ICYgT1BUX20pIHsKKwkJRy51bml0LnN0ciA9ICIgTUIiOworCQlHLnVuaXQuZGl2ID0gMjA0ODsKKwl9CisKKwlpZiAob3B0ICYgT1BUX2spIHsKKwkJRy51bml0LnN0ciA9ICIga0IiOworCQlHLnVuaXQuZGl2ID0gMjsKKwl9CisKKwlnZXRfbG9jYWx0aW1lKCZHLnRtdGltZSk7CisKKwkvKiBEaXNwbGF5IGhlYWRlciAqLworCXByaW50X2hlYWRlcigpOworCisJY3VycmVudF9zdGF0cyA9IDA7CisJLyogTWFpbiBsb29wICovCisJZm9yICg7OykgeworCQlzdGF0c19jcHVfcGFpcl90IHN0YXRzOworCisJCXN0YXRzLnByZXYgPSAmc3RhdHNfZGF0YVtjdXJyZW50X3N0YXRzIF4gMV07CisJCXN0YXRzLmN1cnIgPSAmc3RhdHNfZGF0YVtjdXJyZW50X3N0YXRzXTsKKworCQkvKiBGaWxsIHRoZSB0aW1lIHN0cnVjdHVyZSAqLworCQlnZXRfbG9jYWx0aW1lKCZHLnRtdGltZSk7CisKKwkJLyogRmV0Y2ggY3VycmVudCBDUFUgc3RhdGlzdGljcyAqLworCQlnZXRfY3B1X3N0YXRpc3RpY3Moc3RhdHMuY3Vycik7CisKKwkJLyogR2V0IGludGVydmFsICovCisJCXN0YXRzLml0diA9IGdldF9pbnRlcnZhbCgKKwkJCXN0YXRzLnByZXYtPnZlY3RvcltHTE9CQUxfVVBUSU1FXSwKKwkJCXN0YXRzLmN1cnItPnZlY3RvcltHTE9CQUxfVVBUSU1FXQorCQkpOworCisJCWlmIChvcHQgJiBPUFRfdCkKKwkJCXByaW50X3RpbWVzdGFtcCgpOworCisJCWlmIChvcHQgJiBPUFRfYykgeworCQkJY3B1X3JlcG9ydCgmc3RhdHMpOworCQkJaWYgKG9wdCAmIE9QVF9kKQorCQkJCS8qIFNlcGFyYXRlIG91dHB1dHMgYnkgYSBuZXdsaW5lICovCisJCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJfQorCisJCWlmIChvcHQgJiBPUFRfZCkgeworCQkJaWYgKHRoaXNfaXNfc21wKCkpIHsKKwkJCQlzdGF0cy5pdHYgPSBnZXRfaW50ZXJ2YWwoCisJCQkJCXN0YXRzLnByZXYtPnZlY3RvcltTTVBfVVBUSU1FXSwKKwkJCQkJc3RhdHMuY3Vyci0+dmVjdG9yW1NNUF9VUFRJTUVdCisJCQkJKTsKKwkJCX0KKwkJCWRldl9yZXBvcnQoc3RhdHMuaXR2KTsKKwkJfQorCisJCWJiX3B1dGNoYXIoJ1xuJyk7CisKKwkJaWYgKGNvdW50ID4gMCkgeworCQkJaWYgKC0tY291bnQgPT0gMCkKKwkJCQlicmVhazsKKwkJfQorCisJCS8qIFN3YXAgc3RhdHMgKi8KKwkJY3VycmVudF9zdGF0cyBePSAxOworCisJCXNsZWVwKGludGVydmFsKTsKKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJbGxpc3RfZnJlZShHLmRldl9uYW1lX2xpc3QsIE5VTEwpOworCQlzdGF0c19kZXZfZnJlZShHLnN0YXRzX2Rldl9saXN0KTsKKwkJZnJlZSgmRyk7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3Byb2Nwcy9raWxsLmMgYi9wcm9jcHMva2lsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1YzdhOGQKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9jcHMva2lsbC5jCkBAIC0wLDAgKzEsMjg1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIGtpbGwva2lsbGFsbFs1XSBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBieSBCcnVjZSBQZXJlbnMgPGJydWNlQHBpeGFyLmNvbT4uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUga2lsbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1sXSBbLVNJR10gUElELi4uIgorLy91c2FnZTojZGVmaW5lIGtpbGxfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZW5kIGEgc2lnbmFsIChkZWZhdWx0OiBURVJNKSB0byBnaXZlbiBQSURzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1sCUxpc3QgYWxsIHNpZ25hbCBuYW1lcyBhbmQgbnVtYmVycyIKKy8qIC8vdXNhZ2U6ICAiXG4JLXMgU0lHCVlldCBhbm90aGVyIHdheSBvZiBzcGVjaWZ5aW5nIFNJRyIgKi8KKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUga2lsbF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBwcyB8IGdyZXAgYXBhY2hlXG4iCisvL3VzYWdlOiAgICAgICAiMjUyIHJvb3QgICAgIHJvb3QgICAgIFMgW2FwYWNoZV1cbiIKKy8vdXNhZ2U6ICAgICAgICIyNjMgd3d3LWRhdGEgd3d3LWRhdGEgUyBbYXBhY2hlXVxuIgorLy91c2FnZTogICAgICAgIjI2NCB3d3ctZGF0YSB3d3ctZGF0YSBTIFthcGFjaGVdXG4iCisvL3VzYWdlOiAgICAgICAiMjY1IHd3dy1kYXRhIHd3dy1kYXRhIFMgW2FwYWNoZV1cbiIKKy8vdXNhZ2U6ICAgICAgICIyNjYgd3d3LWRhdGEgd3d3LWRhdGEgUyBbYXBhY2hlXVxuIgorLy91c2FnZTogICAgICAgIjI2NyB3d3ctZGF0YSB3d3ctZGF0YSBTIFthcGFjaGVdXG4iCisvL3VzYWdlOiAgICAgICAiJCBraWxsIDI1MlxuIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBraWxsYWxsX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWxdIFstcV0gWy1TSUddIFBST0NFU1NfTkFNRS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBraWxsYWxsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2VuZCBhIHNpZ25hbCAoZGVmYXVsdDogVEVSTSkgdG8gZ2l2ZW4gcHJvY2Vzc2VzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1sCUxpc3QgYWxsIHNpZ25hbCBuYW1lcyBhbmQgbnVtYmVycyIKKy8qIC8vdXNhZ2U6ICAiXG4JLXMgU0lHCVlldCBhbm90aGVyIHdheSBvZiBzcGVjaWZ5aW5nIFNJRyIgKi8KKy8vdXNhZ2U6ICAgICAiXG4JLXEJRG9uJ3QgY29tcGxhaW4gaWYgbm8gcHJvY2Vzc2VzIHdlcmUga2lsbGVkIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBraWxsYWxsX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGtpbGxhbGwgYXBhY2hlXG4iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGtpbGxhbGw1X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWxdIFstU0lHXSBbLW8gUElEXS4uLiIKKy8vdXNhZ2U6I2RlZmluZSBraWxsYWxsNV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNlbmQgYSBzaWduYWwgKGRlZmF1bHQ6IFRFUk0pIHRvIGFsbCBwcm9jZXNzZXMgb3V0c2lkZSBjdXJyZW50IHNlc3Npb25cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTGlzdCBhbGwgc2lnbmFsIG5hbWVzIGFuZCBudW1iZXJzIgorLy91c2FnZTogICAgICJcbgktbyBQSUQJRG9uJ3Qgc2lnbmFsIHRoaXMgUElEIgorLyogLy91c2FnZTogICJcbgktcyBTSUcJWWV0IGFub3RoZXIgd2F5IG9mIHNwZWNpZnlpbmcgU0lHIiAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogTm90ZToga2lsbF9tYWluIGlzIGRpcmVjdGx5IGNhbGxlZCBmcm9tIHNoZWxsIGluIG9yZGVyIHRvIGltcGxlbWVudAorICoga2lsbCBidWlsdC1pbi4gU2hlbGwgc3Vic3RpdHV0ZXMgam9iIGlkcyB3aXRoIHByb2Nlc3MgZ3JvdXBzIGZpcnN0LgorICoKKyAqIFRoaXMgYnJpbmdzIHNvbWUgY29tcGxpY2F0aW9uczoKKyAqCisgKiArIHdlIGNhbid0IHVzZSB4ZnVuYyBoZXJlCisgKiArIHdlIGNhbid0IHVzZSBhcHBsZXRfbmFtZQorICogKyB3ZSBjYW4ndCB1c2UgYmJfc2hvd191c2FnZQorICogKEFib3ZlIGRvZXNuJ3QgYXBwbHkgZm9yIGtpbGxhbGxbNV0gY2FzZXMpCisgKgorICoga2lsbCAlbiBnZXRzIHRyYW5zbGF0ZWQgaW50byBraWxsICcgLTxwcm9jZXNzIGdyb3VwPicgYnkgc2hlbGwgKG5vdGUgc3BhY2UhKQorICogVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgY29sbGlzaW9uIHdpdGgga2lsbCAtOSAuLi4gc3ludGF4CisgKi8KKworaW50IGtpbGxfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKmFyZzsKKwlwaWRfdCBwaWQ7CisJaW50IHNpZ25vID0gU0lHVEVSTSwgZXJyb3JzID0gMCwgcXVpZXQgPSAwOworI2lmICFFTkFCTEVfS0lMTEFMTCAmJiAhRU5BQkxFX0tJTExBTEw1CisjZGVmaW5lIGtpbGxhbGwgMAorI2RlZmluZSBraWxsYWxsNSAwCisjZWxzZQorLyogSG93IHRvIGRldGVybWluZSB3aG8gd2UgYXJlPyBmaW5kIDNyZCBjaGFyIGZyb20gdGhlIGVuZDoKKyAqIGtpbGwsIGtpbGxhbGwsIGtpbGxhbGw1CisgKiAgXmkgICAgICAgXmEgICAgICAgIF5sICAtIGl0J3MgdW5pcXVlCisgKiAoY2hlY2tpbmcgZnJvbSB0aGUgc3RhcnQgaXMgY29tcGxpY2F0ZWQgYnkgL2Jpbi9raWxsLi4uIGNhc2UpICovCisJY29uc3QgY2hhciBjaGFyMyA9IGFyZ3ZbMF1bc3RybGVuKGFyZ3ZbMF0pIC0gM107CisjZGVmaW5lIGtpbGxhbGwgKEVOQUJMRV9LSUxMQUxMICYmIGNoYXIzID09ICdhJykKKyNkZWZpbmUga2lsbGFsbDUgKEVOQUJMRV9LSUxMQUxMNSAmJiBjaGFyMyA9PSAnbCcpCisjZW5kaWYKKworCS8qIFBhcnNlIGFueSBvcHRpb25zICovCisJYXJnID0gKisrYXJndjsKKworCWlmICghYXJnIHx8IGFyZ1swXSAhPSAnLScpIHsKKwkJZ290byBkb19pdF9ub3c7CisJfQorCisJLyogVGhlIC1sIG9wdGlvbiwgd2hpY2ggcHJpbnRzIG91dCBzaWduYWwgbmFtZXMuCisJICogSW50ZW5kZWQgdXNhZ2UgaW4gc2hlbGw6CisJICogZWNobyAiRGllZCBvZiBTSUdga2lsbCAtbCAkP2AiCisJICogV2UgdHJ5IHRvIG1pbWljIHdoYXQga2lsbCBmcm9tIGNvcmV1dGlscy02LjggZG9lcyAqLworCWlmIChhcmdbMV0gPT0gJ2wnICYmIGFyZ1syXSA9PSAnXDAnKSB7CisJCWFyZyA9ICorK2FyZ3Y7CisJCWlmICghYXJnKSB7CisJCQkvKiBQcmludCB0aGUgd2hvbGUgc2lnbmFsIGxpc3QgKi8KKwkJCXByaW50X3NpZ25hbWVzKCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkvKiAtbCA8c2lnIGxpc3Q+ICovCisJCWRvIHsKKwkJCWlmIChpc2RpZ2l0KGFyZ1swXSkpIHsKKwkJCQlzaWdubyA9IGJiX3N0cnRvdShhcmcsIE5VTEwsIDEwKTsKKwkJCQlpZiAoZXJybm8pIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJ1bmtub3duIHNpZ25hbCAnJXMnIiwgYXJnKTsKKwkJCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJCQl9CisJCQkJLyogRXhpdGNvZGVzID49IDB4ODAgYXJlIHRvIGJlIHRyZWF0ZWQKKwkJCQkgKiBhcyAia2lsbGVkIGJ5IHNpZ25hbCAoZXhpdGNvZGUgJiAweDdmKSIgKi8KKwkJCQlwdXRzKGdldF9zaWduYW1lKHNpZ25vICYgMHg3ZikpOworCQkJCS8qIFRPRE86ICdiYWQnIHNpZ25hbCMgLSBjb3JldXRpbHMgc2F5czoKKwkJCQkgKiBraWxsOiAxMjc6IGludmFsaWQgc2lnbmFsCisJCQkJICogd2UganVzdCBwcmludCAiMTI3IiBpbnN0ZWFkICovCisJCQl9IGVsc2UgeworCQkJCXNpZ25vID0gZ2V0X3NpZ251bShhcmcpOworCQkJCWlmIChzaWdubyA8IDApIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJ1bmtub3duIHNpZ25hbCAnJXMnIiwgYXJnKTsKKwkJCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJCQl9CisJCQkJcHJpbnRmKCIlZFxuIiwgc2lnbm8pOworCQkJfQorCQkJYXJnID0gKisrYXJndjsKKwkJfSB3aGlsZSAoYXJnKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwkvKiBUaGUgLXEgcXVpZXQgb3B0aW9uICovCisJaWYgKGtpbGxhbGwgJiYgYXJnWzFdID09ICdxJyAmJiBhcmdbMl0gPT0gJ1wwJykgeworCQlxdWlldCA9IDE7CisJCWFyZyA9ICorK2FyZ3Y7CisJCWlmICghYXJnKQorCQkJYmJfc2hvd191c2FnZSgpOworCQlpZiAoYXJnWzBdICE9ICctJykKKwkJCWdvdG8gZG9faXRfbm93OworCX0KKworCWFyZysrOyAvKiBza2lwICctJyAqLworCisJLyogLW8gUElEPyAoaWYgcHJlc2VudCwgaXQgYWx3YXlzIGlzIGF0IHRoZSBlbmQgb2YgY29tbWFuZCBsaW5lKSAqLworCWlmIChraWxsYWxsNSAmJiBhcmdbMF0gPT0gJ28nKQorCQlnb3RvIGRvX2l0X25vdzsKKworCWlmIChhcmd2WzFdICYmIGFyZ1swXSA9PSAncycgJiYgYXJnWzFdID09ICdcMCcpIHsgLyogLXMgU0lHPyAqLworCQlhcmcgPSAqKythcmd2OworCX0gLyogZWxzZSBpdCBtdXN0IGJlIC1TSUcgKi8KKwlzaWdubyA9IGdldF9zaWdudW0oYXJnKTsKKwlpZiAoc2lnbm8gPCAwKSB7IC8qIHx8IHNpZ25vID4gTUFYX1NJR05VTSA/ICovCisJCWJiX2Vycm9yX21zZygiYmFkIHNpZ25hbCBuYW1lICclcyciLCBhcmcpOworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKwlhcmcgPSAqKythcmd2OworCisgZG9faXRfbm93OgorCXBpZCA9IGdldHBpZCgpOworCisJaWYgKGtpbGxhbGw1KSB7CisJCXBpZF90IHNpZDsKKwkJcHJvY3BzX3N0YXR1c190KiBwID0gTlVMTDsKKwkJLyogY29tcGF0OiBleGl0Y29kZSAyIGlzICJubyBvbmUgd2FzIHNpZ25hbGVkIiAqLworCQlpbnQgcmV0ID0gMjsKKworCQkvKiBGaW5kIG91dCBvdXIgc2Vzc2lvbiBpZCAqLworCQlzaWQgPSBnZXRzaWQocGlkKTsKKwkJLyogU3RvcCBhbGwgcHJvY2Vzc2VzICovCisJCWlmIChzaWdubyAhPSBTSUdTVE9QICYmIHNpZ25vICE9IFNJR0NPTlQpCisJCQlraWxsKC0xLCBTSUdTVE9QKTsKKwkJLyogU2lnbmFsIGFsbCBwcm9jZXNzZXMgZXhjZXB0IHRob3NlIGluIG91ciBzZXNzaW9uICovCisJCXdoaWxlICgocCA9IHByb2Nwc19zY2FuKHAsIFBTU0NBTl9QSUR8UFNTQ0FOX1NJRCkpICE9IE5VTEwpIHsKKwkJCWNoYXIgKiphcmdzOworCisJCQlpZiAocC0+c2lkID09ICh1bnNpZ25lZClzaWQKKwkJCSB8fCBwLT5zaWQgPT0gMCAvKiBjb21wYXQ6IGtlcm5lbCB0aHJlYWQsIGRvbid0IHNpZ25hbCBpdCAqLworCQkJIHx8IHAtPnBpZCA9PSAodW5zaWduZWQpcGlkCisJCQkgfHwgcC0+cGlkID09IDEKKwkJCSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBBbGwgcmVtYWluaW5nIGFyZ3MgbXVzdCBiZSAtbyBQSUQgb3B0aW9ucy4KKwkJCSAqIENoZWNrIHAtPnBpZCBhZ2FpbnN0IHRoZW0uICovCisJCQlhcmdzID0gYXJndjsKKwkJCXdoaWxlICgqYXJncykgeworCQkJCXBpZF90IG9taXQ7CisKKwkJCQlhcmcgPSAqYXJncysrOworCQkJCWlmIChhcmdbMF0gIT0gJy0nIHx8IGFyZ1sxXSAhPSAnbycpIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJiYWQgb3B0aW9uICclcyciLCBhcmcpOworCQkJCQlyZXQgPSAxOworCQkJCQlnb3RvIHJlc3VtZTsKKwkJCQl9CisJCQkJYXJnICs9IDI7CisJCQkJaWYgKCFhcmdbMF0gJiYgKmFyZ3MpCisJCQkJCWFyZyA9ICphcmdzKys7CisJCQkJb21pdCA9IGJiX3N0cnRvaShhcmcsIE5VTEwsIDEwKTsKKwkJCQlpZiAoZXJybm8pIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJpbnZhbGlkIG51bWJlciAnJXMnIiwgYXJnKTsKKwkJCQkJcmV0ID0gMTsKKwkJCQkJZ290byByZXN1bWU7CisJCQkJfQorCQkJCWlmIChwLT5waWQgPT0gb21pdCkKKwkJCQkJZ290byBkb250X2tpbGw7CisJCQl9CisJCQlraWxsKHAtPnBpZCwgc2lnbm8pOworCQkJcmV0ID0gMDsKKyBkb250X2tpbGw6IDsKKwkJfQorIHJlc3VtZToKKwkJLyogQW5kIGxldCB0aGVtIGNvbnRpbnVlICovCisJCWlmIChzaWdubyAhPSBTSUdTVE9QICYmIHNpZ25vICE9IFNJR0NPTlQpCisJCQlraWxsKC0xLCBTSUdDT05UKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBQaWQgb3IgbmFtZSBpcyByZXF1aXJlZCBmb3Iga2lsbC9raWxsYWxsICovCisJaWYgKCFhcmcpIHsKKwkJYmJfZXJyb3JfbXNnKCJ5b3UgbmVlZCB0byBzcGVjaWZ5IHdob20gdG8ga2lsbCIpOworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKworCWlmIChraWxsYWxsKSB7CisJCS8qIExvb2tzIGxpa2UgdGhleSB3YW50IHRvIGRvIGEga2lsbGFsbC4gIERvIHRoYXQgKi8KKwkJZG8geworCQkJcGlkX3QqIHBpZExpc3Q7CisKKwkJCXBpZExpc3QgPSBmaW5kX3BpZF9ieV9uYW1lKGFyZyk7CisJCQlpZiAoKnBpZExpc3QgPT0gMCkgeworCQkJCWVycm9ycysrOworCQkJCWlmICghcXVpZXQpCisJCQkJCWJiX2Vycm9yX21zZygiJXM6IG5vIHByb2Nlc3Mga2lsbGVkIiwgYXJnKTsKKwkJCX0gZWxzZSB7CisJCQkJcGlkX3QgKnBsOworCisJCQkJZm9yIChwbCA9IHBpZExpc3Q7ICpwbDsgcGwrKykgeworCQkJCQlpZiAoKnBsID09IHBpZCkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQlpZiAoa2lsbCgqcGwsIHNpZ25vKSA9PSAwKQorCQkJCQkJY29udGludWU7CisJCQkJCWVycm9ycysrOworCQkJCQlpZiAoIXF1aWV0KQorCQkJCQkJYmJfcGVycm9yX21zZygiY2FuJ3Qga2lsbCBwaWQgJWQiLCAoaW50KSpwbCk7CisJCQkJfQorCQkJfQorCQkJZnJlZShwaWRMaXN0KTsKKwkJCWFyZyA9ICorK2FyZ3Y7CisJCX0gd2hpbGUgKGFyZyk7CisJCXJldHVybiBlcnJvcnM7CisJfQorCisJLyogTG9va3MgbGlrZSB0aGV5IHdhbnQgdG8gZG8gYSBraWxsLiBEbyB0aGF0ICovCisJd2hpbGUgKGFyZykgeworI2lmIEVOQUJMRV9BU0ggfHwgRU5BQkxFX0hVU0gKKwkJLyoKKwkJICogV2UgbmVlZCB0byBzdXBwb3J0IHNoZWxsJ3MgImhhY2sgZm9ybWF0cyIgb2YKKwkJICogIiAtUFJHUF9JRCIgKHllcywgd2l0aCBhIGxlYWRpbmcgc3BhY2UpCisJCSAqIGFuZCAiIFBJRDEgUElEMiBQSUQzIiAod2l0aCBkZWdlbmVyYXRlIGNhc2UgIiIpCisJCSAqLworCQl3aGlsZSAoKmFyZyAhPSAnXDAnKSB7CisJCQljaGFyICplbmQ7CisJCQlpZiAoKmFyZyA9PSAnICcpCisJCQkJYXJnKys7CisJCQlwaWQgPSBiYl9zdHJ0b2koYXJnLCAmZW5kLCAxMCk7CisJCQlpZiAoZXJybm8gJiYgKGVycm5vICE9IEVJTlZBTCB8fCAqZW5kICE9ICcgJykpIHsKKwkJCQliYl9lcnJvcl9tc2coImludmFsaWQgbnVtYmVyICclcyciLCBhcmcpOworCQkJCWVycm9ycysrOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGtpbGwocGlkLCBzaWdubykgIT0gMCkgeworCQkJCWJiX3BlcnJvcl9tc2coImNhbid0IGtpbGwgcGlkICVkIiwgKGludClwaWQpOworCQkJCWVycm9ycysrOworCQkJfQorCQkJYXJnID0gZW5kOyAvKiBjYW4gb25seSBwb2ludCB0byAnICcgb3IgJ1wwJyBub3cgKi8KKwkJfQorI2Vsc2UKKwkJcGlkID0gYmJfc3RydG9pKGFyZywgTlVMTCwgMTApOworCQlpZiAoZXJybm8pIHsKKwkJCWJiX2Vycm9yX21zZygiaW52YWxpZCBudW1iZXIgJyVzJyIsIGFyZyk7CisJCQllcnJvcnMrKzsKKwkJfSBlbHNlIGlmIChraWxsKHBpZCwgc2lnbm8pICE9IDApIHsKKwkJCWJiX3BlcnJvcl9tc2coImNhbid0IGtpbGwgcGlkICVkIiwgKGludClwaWQpOworCQkJZXJyb3JzKys7CisJCX0KKyNlbmRpZgorCQlhcmcgPSAqKythcmd2OworCX0KKwlyZXR1cm4gZXJyb3JzOworfQpkaWZmIC0tZ2l0IGEvcHJvY3BzL2xzb2YuYyBiL3Byb2Nwcy9sc29mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxNTZhNQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2Nwcy9sc29mLmMKQEAgLTAsMCArMSw3OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBsc29mIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIGJ5IFN2ZW4gT2xpdmVyICdTdk9sbGknIE1vbGwgPHN2b2xsaUBzdm9sbGkuZGU+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2NvbmZpZzpjb25maWcgTFNPRgorLy9jb25maWc6CWJvb2wgImxzb2YiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU2hvdyBvcGVuIGZpbGVzIGluIHRoZSBmb3JtYXQgb2Y6CisvL2NvbmZpZzoJICBQSUQgPFRBQj4gL3BhdGgvdG8vZXhlY3V0YWJsZSA8VEFCPiAvcGF0aC90by9vcGVuZWQvZmlsZQorCisvL2FwcGxldDpJRl9MU09GKEFQUExFVChsc29mLCBCQl9ESVJfVVNSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0xTT0YpICs9IGxzb2YubworCisvL3VzYWdlOiNkZWZpbmUgbHNvZl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIGxzb2ZfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTaG93IGFsbCBvcGVuIGZpbGVzIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyoKKyAqIEV4YW1wbGVzIG9mICJzdGFuZGFyZCIgbHNvZiBvdXRwdXQ6CisgKgorICogQ09NTUFORCAgICBQSUQgVVNFUiAgIEZEICAgVFlQRSAgICAgICAgICAgICBERVZJQ0UgICAgIFNJWkUgICAgICAgTk9ERSBOQU1FCisgKiBpbml0ICAgICAgICAgMSByb290ICBjd2QgICAgRElSICAgICAgICAgICAgICAgIDgsNSAgICAgNDA5NiAgICAgICAgICAyIC8KKyAqIGluaXQgICAgICAgICAxIHJvb3QgIHJ0ZCAgICBESVIgICAgICAgICAgICAgICAgOCw1ICAgICA0MDk2ICAgICAgICAgIDIgLworICogaW5pdCAgICAgICAgIDEgcm9vdCAgdHh0ICAgIFJFRyAgICAgICAgICAgICAgICA4LDUgICA4NzI0MDAgICAgICA2MzQwOCAvYXBwL2J1c3lib3gtMS4xOS4yL2J1c3lib3gKKyAqIHJwYy5wb3J0bSAxMDY0IHJvb3QgIG1lbSAgICBSRUcgICAgICAgICAgICAgICAgOCw1ICAgIDQzNDk0ICAgICAgNDc0NTEgL2FwcC9nbGliYy0yLjExL2xpYi9saWJuc3NfZmlsZXMtMi4xMS5zbworICogcnBjLnBvcnRtIDEwNjQgcm9vdCAgICAzdSAgSVB2NCAgICAgICAgICAgICAgIDIxNzggICAgICAgICAgICAgICAgIFVEUCAqOjExMQorICogcnBjLnBvcnRtIDEwNjQgcm9vdCAgICA0dSAgSVB2NCAgICAgICAgICAgICAgIDEyNDQgICAgICAgICAgICAgICAgIFRDUCAqOjExMSAoTElTVEVOKQorICogcnVuc3ZkaXIgIDExMTYgcm9vdCAgICAwciAgIENIUiAgICAgICAgICAgICAgICAxLDMgICAgICAgICAgICAgICAgMTIxNCAvZGV2L251bGwKKyAqIHJ1bnN2ZGlyICAxMTE2IHJvb3QgICAgMXcgICBDSFIgICAgICAgICAgICAgICAgMSwzICAgICAgICAgICAgICAgIDEyMTQgL2Rldi9udWxsCisgKiBydW5zdmRpciAgMTExNiByb290ICAgIDJ3ICAgQ0hSICAgICAgICAgICAgICAgIDEsMyAgICAgICAgICAgICAgICAxMjE0IC9kZXYvbnVsbAorICogcnVuc3ZkaXIgIDExMTYgcm9vdCAgICAzciAgIERJUiAgICAgICAgICAgICAgICA4LDYgICAgIDE1NjAgICAgICA1ODM1OSAvLmxvY2FsL3Zhci9zZXJ2aWNlCisgKiBncG0gICAgICAgMTEyOCByb290ICAgIDR1ICB1bml4IDB4ZmZmZjg4MDA3YzA5Y2NjMCAgICAgICAgICAgICAgICAxMzAyIC9kZXYvZ3BtY3RsCisgKi8KKworaW50IGxzb2ZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGxzb2ZfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlwcm9jcHNfc3RhdHVzX3QgKnByb2MgPSBOVUxMOworCisJd2hpbGUgKChwcm9jID0gcHJvY3BzX3NjYW4ocHJvYywgUFNTQ0FOX1BJRHxQU1NDQU5fRVhFKSkgIT0gTlVMTCkgeworCQljaGFyIG5hbWVbc2l6ZW9mKCIvcHJvYy8ldS9mZC8wMTIzNDU2Nzg5IikgKyBzaXplb2YoaW50KSozXTsKKwkJdW5zaWduZWQgYmFzZW9mczsKKwkJRElSICpkX2ZkOworCQljaGFyICpmZGxpbms7CisJCXN0cnVjdCBkaXJlbnQgKmVudHJ5OworCisJCWlmIChnZXRwaWQoKSA9PSBwcm9jLT5waWQpCisJCQljb250aW51ZTsKKworCQliYXNlb2ZzID0gc3ByaW50ZihuYW1lLCAiL3Byb2MvJXUvZmQvIiwgcHJvYy0+cGlkKTsKKwkJZF9mZCA9IG9wZW5kaXIobmFtZSk7CisJCWlmIChkX2ZkKSB7CisJCQl3aGlsZSAoKGVudHJ5ID0gcmVhZGRpcihkX2ZkKSkgIT0gTlVMTCkgeworCQkJCS8qIFNraXAgZW50cmllcyAnLicgYW5kICcuLicgKGFuZCBhbnkgaGlkZGVuIGZpbGUpICovCisJCQkJaWYgKGVudHJ5LT5kX25hbWVbMF0gPT0gJy4nKQorCQkJCQljb250aW51ZTsKKworCQkJCXNhZmVfc3RybmNweShuYW1lICsgYmFzZW9mcywgZW50cnktPmRfbmFtZSwgMTApOworCQkJCWlmICgoZmRsaW5rID0geG1hbGxvY19yZWFkbGluayhuYW1lKSkgIT0gTlVMTCkgeworCQkJCQlwcmludGYoIiVkXHQlc1x0JXNcbiIsIHByb2MtPnBpZCwgcHJvYy0+ZXhlLCBmZGxpbmspOworCQkJCQlmcmVlKGZkbGluayk7CisJCQkJfQorCQkJfQorCQkJY2xvc2VkaXIoZF9mZCk7CisJCX0KKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvcHJvY3BzL21wc3RhdC5jIGIvcHJvY3BzL21wc3RhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMjg5MDMKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9jcHMvbXBzdGF0LmMKQEAgLTAsMCArMSw5NjcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFBlci1wcm9jZXNzb3Igc3RhdGlzdGljcywgYmFzZWQgb24gc3lzc3RhdCB2ZXJzaW9uIDkuMS4yIGJ5IFNlYmFzdGllbiBHb2RhcmQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTWFyZWsgUG9sYWNlayA8bW1wb2xhY2VrQGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vYXBwbGV0OklGX01QU1RBVChBUFBMRVQobXBzdGF0LCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfTVBTVEFUKSArPSBtcHN0YXQubworCisvL2NvbmZpZzpjb25maWcgTVBTVEFUCisvL2NvbmZpZzoJYm9vbCAibXBzdGF0IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFBlci1wcm9jZXNzb3Igc3RhdGlzdGljcworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPiAgLyogc3RydWN0IHV0c25hbWUgKi8KKworLy8jZGVmaW5lIGRlYnVnKGZtdCwgLi4uKSBmcHJpbnRmKHN0ZGVyciwgZm10LCAjIyBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgZGVidWcoZm10LCAuLi4pICgodm9pZCkwKQorCisvKiBTaXplIG9mIC9wcm9jL2ludGVycnVwdHMgbGluZSwgQ1BVIGRhdGEgZXhjbHVkZWQgKi8KKyNkZWZpbmUgSU5URVJSVVBUU19MSU5FICAgIDY0CisvKiBNYXhpbXVtIG51bWJlciBvZiBpbnRlcnJ1cHRzICovCisjZGVmaW5lIE5SX0lSUVMgICAgICAgICAgICAyNTYKKyNkZWZpbmUgTlJfSVJRQ1BVX1BSRUFMTE9DIDMKKyNkZWZpbmUgTUFYX0lSUU5BTUVfTEVOICAgIDE2CisjZGVmaW5lIE1BWF9QRl9OQU1FICAgICAgICA1MTIKKy8qIHN5c3N0YXQgOS4wLjYgdXNlcyB3aWR0aCA4LCBidXQgbmV3ZXIgY29kZSB3aGljaCBhbHNvIHByaW50cyAvcHJvYy9zb2Z0aXJxcworICogZGF0YSBuZWVkcyBtb3JlOiAiaW50ZXJydXB0cyIgaW4gL3Byb2Mvc29mdGlycXMgaGF2ZSBsb25nZXIgbmFtZXMsCisgKiBtb3N0IGFyZSB1cCB0byA4IGNoYXJzLCBvbmUgKEJMT0NLX0lPUE9MTCkgaXMgZXZlbiBsb25nZXIuCisgKiBXZSBhcmUgcHJpbnRpbmcgaGVhZGVycyBpbiB0aGUgIiBJUlFOQU1FL3MiIGZvcm0sIGV4cGVyaW1lbnRhbGx5CisgKiBhbnl0aGluZyBzbWFsbGVyIHRoYW4gMTAgY2hhcnMgbG9va3MgdWdseSBmb3IgL3Byb2Mvc29mdGlycXMgc3RhdHMuCisgKi8KKyNkZWZpbmUgSU5UUkFURV9TQ1JXSURUSCAgICAgIDEwCisjZGVmaW5lIElOVFJBVEVfU0NSV0lEVEhfU1RSICIxMCIKKworLyogU3lzdGVtIGZpbGVzICovCisjZGVmaW5lIFBST0NGU19TVEFUICAgICAgICIvcHJvYy9zdGF0IgorI2RlZmluZSBQUk9DRlNfSU5URVJSVVBUUyAiL3Byb2MvaW50ZXJydXB0cyIKKyNkZWZpbmUgUFJPQ0ZTX1NPRlRJUlFTICAgIi9wcm9jL3NvZnRpcnFzIgorI2RlZmluZSBQUk9DRlNfVVBUSU1FICAgICAiL3Byb2MvdXB0aW1lIgorCisKKyNpZiAxCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBkYXRhX3Q7Cit0eXBlZGVmIGxvbmcgbG9uZyBpZGF0YV90OworI2RlZmluZSBGTVRfREFUQSAibGwiCisjZGVmaW5lIERBVEFfTUFYIFVMTE9OR19NQVgKKyNlbHNlCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgZGF0YV90OwordHlwZWRlZiBsb25nIGlkYXRhX3Q7CisjZGVmaW5lIEZNVF9EQVRBICJsIgorI2RlZmluZSBEQVRBX01BWCBVTE9OR19NQVgKKyNlbmRpZgorCisKK3N0cnVjdCBzdGF0c19pcnFjcHUgeworCXVuc2lnbmVkIGludGVycnVwdHM7CisJY2hhciBpcnFfbmFtZVtNQVhfSVJRTkFNRV9MRU5dOworfTsKKworc3RydWN0IHN0YXRzX2NwdSB7CisJZGF0YV90IGNwdV91c2VyOworCWRhdGFfdCBjcHVfbmljZTsKKwlkYXRhX3QgY3B1X3N5c3RlbTsKKwlkYXRhX3QgY3B1X2lkbGU7CisJZGF0YV90IGNwdV9pb3dhaXQ7CisJZGF0YV90IGNwdV9zdGVhbDsKKwlkYXRhX3QgY3B1X2lycTsKKwlkYXRhX3QgY3B1X3NvZnRpcnE7CisJZGF0YV90IGNwdV9ndWVzdDsKK307CisKK3N0cnVjdCBzdGF0c19pcnEgeworCWRhdGFfdCBpcnFfbnI7Cit9OworCisKKy8qIEdsb2JhbHMuIFNvcnQgYnkgc2l6ZSBhbmQgYWNjZXNzIGZyZXF1ZW5jeS4gKi8KK3N0cnVjdCBnbG9iYWxzIHsKKwlpbnQgaW50ZXJ2YWw7CisJaW50IGNvdW50OworCXVuc2lnbmVkIGNwdV9ucjsgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIENQVXMgKi8KKwl1bnNpZ25lZCBpcnFjcHVfbnI7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBpbnRlcnJ1cHRzIHBlciBDUFUgKi8KKwl1bnNpZ25lZCBzb2Z0aXJxY3B1X25yOyAgICAgICAgIC8qIE51bWJlciBvZiBzb2Z0IGludGVycnVwdHMgcGVyIENQVSAqLworCXVuc2lnbmVkIG9wdGlvbnM7CisJdW5zaWduZWQgaHo7CisJdW5zaWduZWQgY3B1X2JpdG1hcF9sZW47CisJc21hbGxpbnQgcF9vcHRpb247CisJLy8gOS4wLjYgZG9lcyBub3QgZG8gaXQuIFRyeSAibXBzdGF0IC1BIDEgMiIgLSBoZWFkZXJzIGFyZSByZXBlYXRlZCEKKwkvL3NtYWxsaW50IGhlYWRlcl9kb25lOworCS8vc21hbGxpbnQgYXZnX2hlYWRlcl9kb25lOworCXVuc2lnbmVkIGNoYXIgKmNwdV9iaXRtYXA7ICAgICAgLyogQml0IDA6IGdsb2JhbCwgYml0IDE6IDFzdCBwcm9jLi4uICovCisJZGF0YV90IGdsb2JhbF91cHRpbWVbM107CisJZGF0YV90IHBlcl9jcHVfdXB0aW1lWzNdOworCXN0cnVjdCBzdGF0c19jcHUgKnN0X2NwdVszXTsKKwlzdHJ1Y3Qgc3RhdHNfaXJxICpzdF9pcnFbM107CisJc3RydWN0IHN0YXRzX2lycWNwdSAqc3RfaXJxY3B1WzNdOworCXN0cnVjdCBzdGF0c19pcnFjcHUgKnN0X3NvZnRpcnFjcHVbM107CisJc3RydWN0IHRtIHRpbWVzdGFtcFszXTsKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKK30gd2hpbGUgKDApCisKKy8qIFRoZSBzZWxlY3RlZCBpbnRlcnJ1cHRzIHN0YXRpc3RpY3MgKGJpdHMgaW4gRy5vcHRpb25zKSAqLworZW51bSB7CisJRF9DUFUgICAgICA9IDEgPDwgMCwKKwlEX0lSUV9TVU0gID0gMSA8PCAxLAorCURfSVJRX0NQVSAgPSAxIDw8IDIsCisJRF9TT0ZUSVJRUyA9IDEgPDwgMywKK307CisKKworLyogSXMgb3B0aW9uIG9uPyAqLworc3RhdGljIEFMV0FZU19JTkxJTkUgaW50IGRpc3BsYXlfb3B0KGludCBvcHQpCit7CisJcmV0dXJuIChvcHQgJiBHLm9wdGlvbnMpOworfQorCisjaWYgREFUQV9NQVggPiAweGZmZmZmZmZmCisvKgorICogSGFuZGxlIG92ZXJmbG93IGNvbmRpdGlvbnMgcHJvcGVybHkgZm9yIGNvdW50ZXJzIHdoaWNoIGNhbiBoYXZlCisgKiBsZXNzIGJpdHMgdGhhbiBkYXRhX3QsIGRlcGVuZGluZyBvbiB0aGUga2VybmVsIHZlcnNpb24uCisgKi8KKy8qIFN1cnByaXNpbmdseSwgb24gMzJiaXQgaW5saW5pbmcgaXMgYSBzaXplIHdpbiAqLworc3RhdGljIEFMV0FZU19JTkxJTkUgZGF0YV90IG92ZXJmbG93X3NhZmVfc3ViKGRhdGFfdCBwcmV2LCBkYXRhX3QgY3VycikKK3sKKwlkYXRhX3QgdiA9IGN1cnIgLSBwcmV2OworCisJaWYgKChpZGF0YV90KXYgPCAwICAgICAvKiBjdXJyIDwgcHJldiAtIGNvdW50ZXIgb3ZlcmZsb3c/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+Y3B1X3N0ZWFsOworCisJCWlmIChidWZbM10gPT0gJyAnKSB7CisJCQkvKiAiY3B1ICIgKi8KKwkJCSp1cCA9IHN1bTsKKwkJfSBlbHNlIHsKKwkJCS8qICJjcHVOICIgKi8KKwkJCWlmIChjcHVfbnVtYmVyID09IDAgJiYgKnVwMCAhPSAwKSB7CisJCQkJLyogQ29tcHV0ZSB1cHRpbWUgb2Ygc2luZ2xlIENQVSAqLworCQkJCSp1cDAgPSBzdW07CisJCQl9CisJCX0KKwl9CisJZmNsb3NlKGZwKTsKK30KKworLyoKKyAqIFJlYWQgSVJRcyBmcm9tIC9wcm9jL3N0YXQKKyAqLworc3RhdGljIHZvaWQgZ2V0X2lycXNfZnJvbV9zdGF0KHN0cnVjdCBzdGF0c19pcnEgKmlycSkKK3sKKwlGSUxFICpmcDsKKwljaGFyIGJ1ZlsxMDI0XTsKKworCWZwID0geGZvcGVuX2Zvcl9yZWFkKFBST0NGU19TVEFUKTsKKworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKKwkJLy9iYl9lcnJvcl9tc2coIi9wcm9jL3N0YXQ6JyVzJyIsIGJ1Zik7CisJCWlmIChpc19wcmVmaXhlZF93aXRoKGJ1ZiwgImludHIgIikpIHsKKwkJCS8qIFJlYWQgdG90YWwgbnVtYmVyIG9mIElSUXMgc2luY2Ugc3lzdGVtIGJvb3QgKi8KKwkJCXNzY2FuZihidWYgKyA1LCAiJSJGTVRfREFUQSJ1IiwgJmlycS0+aXJxX25yKTsKKwkJfQorCX0KKworCWZjbG9zZShmcCk7Cit9CisKKy8qCisgKiBSZWFkIHN0YXRzIGZyb20gL3Byb2MvaW50ZXJydXB0cyBvciAvcHJvYy9zb2Z0aXJxcworICovCitzdGF0aWMgdm9pZCBnZXRfaXJxc19mcm9tX2ludGVycnVwdHMoY29uc3QgY2hhciAqZm5hbWUsCisJCXN0cnVjdCBzdGF0c19pcnFjcHUgKnBlcl9jcHVfc3RhdHNbXSwKKwkJaW50IGlycXNfcGVyX2NwdSwgaW50IGN1cnJlbnQpCit7CisJRklMRSAqZnA7CisJc3RydWN0IHN0YXRzX2lycSAqaXJxX2k7CisJc3RydWN0IHN0YXRzX2lycWNwdSAqaWM7CisJY2hhciAqYnVmOworCXVuc2lnbmVkIGJ1ZmxlbjsKKwl1bnNpZ25lZCBjcHU7CisJdW5zaWduZWQgaXJxOworCWludCBjcHVfaW5kZXhbRy5jcHVfbnJdOworCWludCBpaW5kZXg7CisKKy8vIE1vdmVkIHRvIGNhbGxlci4KKy8vIE90aGVyd2lzZSByZWFkaW5nIG9mIC9wcm9jL3NvZnRpcnFzCisvLyB3YXMgcmVzZXR0aW5nIGNvdW50cyB0byAwIGFmdGVyIHdlIHBhaW5zdGFraW5nbHkgY29sbGVjdGVkIHRoZW0gZnJvbQorLy8gL3Byb2MvaW50ZXJydXB0cy4gV2hpY2ggcmVzdWx0ZWQgaW46CisvLyAwMTozMjo0NyBQTSAgQ1BVICAgIGludHIvcworLy8gMDE6MzI6NDcgUE0gIGFsbCAgICA1OTEuNDcKKy8vIDAxOjMyOjQ3IFBNICAgIDAgICAgICAwLjAwIDw9ID8/PworLy8gMDE6MzI6NDcgUE0gICAgMSAgICAgIDAuMDAgPD0gPz8/CisvLwlmb3IgKGNwdSA9IDE7IGNwdSA8PSBHLmNwdV9ucjsgY3B1KyspIHsKKy8vCQlHLnN0X2lycVtjdXJyZW50XVtjcHVdLmlycV9uciA9IDA7CisvLwkJLy9iYl9lcnJvcl9tc2coIkcuc3RfaXJxWyV1XVsldV0uaXJxX25yPTAiLCBjdXJyZW50LCBjcHUpOworLy8JfQorCisJZnAgPSBmb3Blbl9mb3JfcmVhZChmbmFtZSk7CisJaWYgKCFmcCkKKwkJcmV0dXJuOworCisJYnVmbGVuID0gSU5URVJSVVBUU19MSU5FICsgMTYgKiBHLmNwdV9ucjsKKwlidWYgPSB4bWFsbG9jKGJ1Zmxlbik7CisKKwkvKiBQYXJzZSBoZWFkZXIgYW5kIGRldGVybWluZSwgd2hpY2ggQ1BVcyBhcmUgb25saW5lICovCisJaWluZGV4ID0gMDsKKwl3aGlsZSAoZmdldHMoYnVmLCBidWZsZW4sIGZwKSkgeworCQljaGFyICpjcCwgKm5leHQ7CisJCW5leHQgPSBidWY7CisJCXdoaWxlICgoY3AgPSBzdHJzdHIobmV4dCwgIkNQVSIpKSAhPSBOVUxMCisJCSAmJiBpaW5kZXggPCBHLmNwdV9ucgorCQkpIHsKKwkJCWNwdSA9IHN0cnRvdWwoY3AgKyAzLCAmbmV4dCwgMTApOworCQkJY3B1X2luZGV4W2lpbmRleCsrXSA9IGNwdTsKKwkJfQorCQlpZiAoaWluZGV4KSAvKiBXZSBmb3VuZCBoZWFkZXIgKi8KKwkJCWJyZWFrOworCX0KKworCWlycSA9IDA7CisJd2hpbGUgKGZnZXRzKGJ1ZiwgYnVmbGVuLCBmcCkKKwkgJiYgaXJxIDwgaXJxc19wZXJfY3B1CisJKSB7CisJCWludCBsZW47CisJCWNoYXIgbGFzdF9jaGFyOworCQljaGFyICpjcDsKKworCQkvKiBTa2lwIG92ZXIgIklSUU5BTUU6IiAqLworCQljcCA9IHN0cmNocihidWYsICc6Jyk7CisJCWlmICghY3ApCisJCQljb250aW51ZTsKKwkJbGFzdF9jaGFyID0gY3BbLTFdOworCisJCWljID0gJnBlcl9jcHVfc3RhdHNbY3VycmVudF1baXJxXTsKKwkJbGVuID0gY3AgLSBidWY7CisJCWlmIChsZW4gPj0gc2l6ZW9mKGljLT5pcnFfbmFtZSkpIHsKKwkJCWxlbiA9IHNpemVvZihpYy0+aXJxX25hbWUpIC0gMTsKKwkJfQorCQlzYWZlX3N0cm5jcHkoaWMtPmlycV9uYW1lLCBidWYsIGxlbiArIDEpOworCQkvL2JiX2Vycm9yX21zZygiJXM6IGlycSVkOiclcycgYnVmOiclcyciLCBmbmFtZSwgaXJxLCBpYy0+aXJxX25hbWUsIGJ1Zik7CisJCWNwKys7CisKKwkJZm9yIChjcHUgPSAwOyBjcHUgPCBpaW5kZXg7IGNwdSsrKSB7CisJCQljaGFyICpuZXh0OworCQkJaWMgPSAmcGVyX2NwdV9zdGF0c1tjdXJyZW50XVtjcHVfaW5kZXhbY3B1XSAqIGlycXNfcGVyX2NwdSArIGlycV07CisJCQlpcnFfaSA9ICZHLnN0X2lycVtjdXJyZW50XVtjcHVfaW5kZXhbY3B1XSArIDFdOworCQkJaWMtPmludGVycnVwdHMgPSBzdHJ0b3VsKGNwLCAmbmV4dCwgMTApOworCQkJLyogQ291bnQgb25seSBudW1lcmljYWwgSVJRcyAqLworCQkJaWYgKGlzZGlnaXQobGFzdF9jaGFyKSkgeworCQkJCWlycV9pLT5pcnFfbnIgKz0gaWMtPmludGVycnVwdHM7CisJCQkJLy9iYl9lcnJvcl9tc2coIkcuc3RfaXJxWyV1XVsldV0uaXJxX25yICsgJXUgPSAlbGxkIiwKKwkJCQkvLyBjdXJyZW50LCBjcHVfaW5kZXhbY3B1XSArIDEsIGljLT5pbnRlcnJ1cHRzLCBpcnFfaS0+aXJxX25yKTsKKwkJCX0KKwkJCWNwID0gbmV4dDsKKwkJfQorCQlpcnErKzsKKwl9CisJZmNsb3NlKGZwKTsKKwlmcmVlKGJ1Zik7CisKKwl3aGlsZSAoaXJxIDwgaXJxc19wZXJfY3B1KSB7CisJCS8qIE51bWJlciBvZiBpbnRlcnJ1cHRzIHBlciBDUFUgaGFzIGNoYW5nZWQgKi8KKwkJaWMgPSAmcGVyX2NwdV9zdGF0c1tjdXJyZW50XVtpcnFdOworCQlpYy0+aXJxX25hbWVbMF0gPSAnXDAnOyAvKiBGYWxzZSBpbnRlcnJ1cHQgKi8KKwkJaXJxKys7CisJfQorfQorCitzdGF0aWMgdm9pZCBnZXRfdXB0aW1lKGRhdGFfdCAqdXB0aW1lKQoreworCUZJTEUgKmZwOworCWNoYXIgYnVmW3NpemVvZihsb25nKSozICogMiArIDRdOyAvKiBlbm91Z2ggZm9yIGxvbmcubG9uZyAqLworCXVuc2lnbmVkIGxvbmcgdXB0aW1lX3NlYywgZGVjaW1hbDsKKworCWZwID0geGZvcGVuX2Zvcl9yZWFkKFBST0NGU19VUFRJTUUpOworCWlmIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKKwkJaWYgKHNzY2FuZihidWYsICIlbHUuJWx1IiwgJnVwdGltZV9zZWMsICZkZWNpbWFsKSA9PSAyKSB7CisJCQkqdXB0aW1lID0gKGRhdGFfdCl1cHRpbWVfc2VjICogRy5oeiArIGRlY2ltYWwgKiBHLmh6IC8gMTAwOworCQl9CisJfQorCisJZmNsb3NlKGZwKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X2xvY2FsdGltZShzdHJ1Y3QgdG0gKnRtKQoreworCXRpbWVfdCB0aW1lcjsKKwl0aW1lKCZ0aW1lcik7CisJbG9jYWx0aW1lX3IoJnRpbWVyLCB0bSk7Cit9CisKK3N0YXRpYyB2b2lkIGFsYXJtX2hhbmRsZXIoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJc2lnbmFsKFNJR0FMUk0sIGFsYXJtX2hhbmRsZXIpOworCWFsYXJtKEcuaW50ZXJ2YWwpOworfQorCitzdGF0aWMgdm9pZCBtYWluX2xvb3Aodm9pZCkKK3sKKwl1bnNpZ25lZCBjdXJyZW50OworCXVuc2lnbmVkIGNwdXM7CisKKwkvKiBSZWFkIHRoZSBzdGF0cyAqLworCWlmIChHLmNwdV9uciA+IDEpIHsKKwkJRy5wZXJfY3B1X3VwdGltZVswXSA9IDA7CisJCWdldF91cHRpbWUoJkcucGVyX2NwdV91cHRpbWVbMF0pOworCX0KKworCWdldF9jcHVfc3RhdGlzdGljcyhHLnN0X2NwdVswXSwgJkcuZ2xvYmFsX3VwdGltZVswXSwgJkcucGVyX2NwdV91cHRpbWVbMF0pOworCisJaWYgKGRpc3BsYXlfb3B0KERfSVJRX1NVTSkpCisJCWdldF9pcnFzX2Zyb21fc3RhdChHLnN0X2lycVswXSk7CisKKwlpZiAoZGlzcGxheV9vcHQoRF9JUlFfU1VNIHwgRF9JUlFfQ1BVKSkKKwkJZ2V0X2lycXNfZnJvbV9pbnRlcnJ1cHRzKFBST0NGU19JTlRFUlJVUFRTLCBHLnN0X2lycWNwdSwKKwkJCQkJRy5pcnFjcHVfbnIsIDApOworCisJaWYgKGRpc3BsYXlfb3B0KERfU09GVElSUVMpKQorCQlnZXRfaXJxc19mcm9tX2ludGVycnVwdHMoUFJPQ0ZTX1NPRlRJUlFTLCBHLnN0X3NvZnRpcnFjcHUsCisJCQkJCUcuc29mdGlycWNwdV9uciwgMCk7CisKKwlpZiAoRy5pbnRlcnZhbCA9PSAwKSB7CisJCS8qIERpc3BsYXkgc2luY2UgYm9vdCB0aW1lICovCisJCWNwdXMgPSBHLmNwdV9uciArIDE7CisJCUcudGltZXN0YW1wWzFdID0gRy50aW1lc3RhbXBbMF07CisJCW1lbXNldChHLnN0X2NwdVsxXSwgMCwgc2l6ZW9mKEcuc3RfY3B1WzFdWzBdKSAqIGNwdXMpOworCQltZW1zZXQoRy5zdF9pcnFbMV0sIDAsIHNpemVvZihHLnN0X2lycVsxXVswXSkgKiBjcHVzKTsKKwkJbWVtc2V0KEcuc3RfaXJxY3B1WzFdLCAwLCBzaXplb2YoRy5zdF9pcnFjcHVbMV1bMF0pICogY3B1cyAqIEcuaXJxY3B1X25yKTsKKwkJbWVtc2V0KEcuc3Rfc29mdGlycWNwdVsxXSwgMCwgc2l6ZW9mKEcuc3Rfc29mdGlycWNwdVsxXVswXSkgKiBjcHVzICogRy5zb2Z0aXJxY3B1X25yKTsKKworCQl3cml0ZV9zdGF0cygwKTsKKworCQkvKiBBbmQgd2UncmUgZG9uZSAqLworCQlyZXR1cm47CisJfQorCisJLyogU2V0IGEgaGFuZGxlciBmb3IgU0lHQUxSTSAqLworCWFsYXJtX2hhbmRsZXIoMCk7CisKKwkvKiBTYXZlIHRoZSBzdGF0cyB3ZSBhbHJlYWR5IGhhdmUuIFdlIG5lZWQgdGhlbSB0byBjb21wdXRlIHRoZSBhdmVyYWdlICovCisJRy50aW1lc3RhbXBbMl0gPSBHLnRpbWVzdGFtcFswXTsKKwlHLmdsb2JhbF91cHRpbWVbMl0gPSBHLmdsb2JhbF91cHRpbWVbMF07CisJRy5wZXJfY3B1X3VwdGltZVsyXSA9IEcucGVyX2NwdV91cHRpbWVbMF07CisJY3B1cyA9IEcuY3B1X25yICsgMTsKKwltZW1jcHkoRy5zdF9jcHVbMl0sIEcuc3RfY3B1WzBdLCBzaXplb2YoRy5zdF9jcHVbMF1bMF0pICogY3B1cyk7CisJbWVtY3B5KEcuc3RfaXJxWzJdLCBHLnN0X2lycVswXSwgc2l6ZW9mKEcuc3RfaXJxWzBdWzBdKSAqIGNwdXMpOworCW1lbWNweShHLnN0X2lycWNwdVsyXSwgRy5zdF9pcnFjcHVbMF0sIHNpemVvZihHLnN0X2lycWNwdVswXVswXSkgKiBjcHVzICogRy5pcnFjcHVfbnIpOworCWlmIChkaXNwbGF5X29wdChEX1NPRlRJUlFTKSkgeworCQltZW1jcHkoRy5zdF9zb2Z0aXJxY3B1WzJdLCBHLnN0X3NvZnRpcnFjcHVbMF0sCisJCQlzaXplb2YoRy5zdF9zb2Z0aXJxY3B1WzBdWzBdKSAqIGNwdXMgKiBHLnNvZnRpcnFjcHVfbnIpOworCX0KKworCWN1cnJlbnQgPSAxOworCXdoaWxlICgxKSB7CisJCS8qIFN1c3BlbmQgdW50aWwgYSBzaWduYWwgaXMgcmVjZWl2ZWQgKi8KKwkJcGF1c2UoKTsKKworCQkvKiBTZXQgc3RydWN0dXJlcyB0byAwIHRvIGRpc3Rpbmd1aXNoIG9mZi9vbmxpbmUgQ1BVcyAqLworCQltZW1zZXQoJkcuc3RfY3B1W2N1cnJlbnRdWy8qY3B1OiovIDFdLCAwLCBzaXplb2YoRy5zdF9jcHVbMF1bMF0pICogRy5jcHVfbnIpOworCisJCWdldF9sb2NhbHRpbWUoJkcudGltZXN0YW1wW2N1cnJlbnRdKTsKKworCQkvKiBSZWFkIHN0YXRzICovCisJCWlmIChHLmNwdV9uciA+IDEpIHsKKwkJCUcucGVyX2NwdV91cHRpbWVbY3VycmVudF0gPSAwOworCQkJZ2V0X3VwdGltZSgmRy5wZXJfY3B1X3VwdGltZVtjdXJyZW50XSk7CisJCX0KKwkJZ2V0X2NwdV9zdGF0aXN0aWNzKEcuc3RfY3B1W2N1cnJlbnRdLCAmRy5nbG9iYWxfdXB0aW1lW2N1cnJlbnRdLCAmRy5wZXJfY3B1X3VwdGltZVtjdXJyZW50XSk7CisKKwkJaWYgKGRpc3BsYXlfb3B0KERfSVJRX1NVTSkpCisJCQlnZXRfaXJxc19mcm9tX3N0YXQoRy5zdF9pcnFbY3VycmVudF0pOworCisJCWlmIChkaXNwbGF5X29wdChEX0lSUV9TVU0gfCBEX0lSUV9DUFUpKSB7CisJCQlpbnQgY3B1OworCQkJZm9yIChjcHUgPSAxOyBjcHUgPD0gRy5jcHVfbnI7IGNwdSsrKSB7CisJCQkJRy5zdF9pcnFbY3VycmVudF1bY3B1XS5pcnFfbnIgPSAwOworCQkJfQorCQkJLyogYWNjdW11bGF0ZXMgLmlycV9uciAqLworCQkJZ2V0X2lycXNfZnJvbV9pbnRlcnJ1cHRzKFBST0NGU19JTlRFUlJVUFRTLCBHLnN0X2lycWNwdSwKKwkJCQkJRy5pcnFjcHVfbnIsIGN1cnJlbnQpOworCQl9CisKKwkJaWYgKGRpc3BsYXlfb3B0KERfU09GVElSUVMpKQorCQkJZ2V0X2lycXNfZnJvbV9pbnRlcnJ1cHRzKFBST0NGU19TT0ZUSVJRUywKKwkJCQkJRy5zdF9zb2Z0aXJxY3B1LAorCQkJCQlHLnNvZnRpcnFjcHVfbnIsIGN1cnJlbnQpOworCisJCXdyaXRlX3N0YXRzKGN1cnJlbnQpOworCisJCWlmIChHLmNvdW50ID4gMCkgeworCQkJaWYgKC0tRy5jb3VudCA9PSAwKQorCQkJCWJyZWFrOworCQl9CisKKwkJY3VycmVudCBePSAxOworCX0KKworCS8qIFByaW50IGF2ZXJhZ2Ugc3RhdGlzdGljcyAqLworCXdyaXRlX3N0YXRzX2F2ZyhjdXJyZW50KTsKK30KKworLyogSW5pdGlhbGl6YXRpb24gKi8KKworc3RhdGljIHZvaWQgYWxsb2Nfc3RydWN0KGludCBjcHVzKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspIHsKKwkJRy5zdF9jcHVbaV0gPSB4emFsbG9jKHNpemVvZihHLnN0X2NwdVtpXVswXSkgKiBjcHVzKTsKKwkJRy5zdF9pcnFbaV0gPSB4emFsbG9jKHNpemVvZihHLnN0X2lycVtpXVswXSkgKiBjcHVzKTsKKwkJRy5zdF9pcnFjcHVbaV0gPSB4emFsbG9jKHNpemVvZihHLnN0X2lycWNwdVtpXVswXSkgKiBjcHVzICogRy5pcnFjcHVfbnIpOworCQlHLnN0X3NvZnRpcnFjcHVbaV0gPSB4emFsbG9jKHNpemVvZihHLnN0X3NvZnRpcnFjcHVbaV1bMF0pICogY3B1cyAqIEcuc29mdGlycWNwdV9ucik7CisJfQorCUcuY3B1X2JpdG1hcF9sZW4gPSAoY3B1cyA+PiAzKSArIDE7CisJRy5jcHVfYml0bWFwID0geHphbGxvYyhHLmNwdV9iaXRtYXBfbGVuKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaGVhZGVyKHN0cnVjdCB0bSAqdCkKK3sKKwljaGFyIGN1cl9kYXRlWzE2XTsKKwlzdHJ1Y3QgdXRzbmFtZSB1dHM7CisKKwkvKiBHZXQgc3lzdGVtIG5hbWUsIHJlbGVhc2UgbnVtYmVyIGFuZCBob3N0bmFtZSAqLworCXVuYW1lKCZ1dHMpOworCisJc3RyZnRpbWUoY3VyX2RhdGUsIHNpemVvZihjdXJfZGF0ZSksICIleCIsIHQpOworCisJcHJpbnRmKCIlcyAlcyAoJXMpXHQlc1x0XyVzX1x0KCV1IENQVSlcbiIsCisJCXV0cy5zeXNuYW1lLCB1dHMucmVsZWFzZSwgdXRzLm5vZGVuYW1lLCBjdXJfZGF0ZSwgdXRzLm1hY2hpbmUsIEcuY3B1X25yKTsKK30KKworLyoKKyAqIEdldCBudW1iZXIgb2YgaW50ZXJydXB0cyBhdmFpbGFibGUgcGVyIHByb2Nlc3NvcgorICovCitzdGF0aWMgaW50IGdldF9pcnFjcHVfbnIoY29uc3QgY2hhciAqZiwgaW50IG1heF9pcnFzKQoreworCUZJTEUgKmZwOworCWNoYXIgKmxpbmU7CisJdW5zaWduZWQgbGluZWxlbjsKKwl1bnNpZ25lZCBpcnE7CisKKwlmcCA9IGZvcGVuX2Zvcl9yZWFkKGYpOworCWlmICghZnApICAvKiBObyBpbnRlcnJ1cHRzIGZpbGUgKi8KKwkJcmV0dXJuIDA7CisKKwlsaW5lbGVuID0gSU5URVJSVVBUU19MSU5FICsgMTYgKiBHLmNwdV9ucjsKKwlsaW5lID0geG1hbGxvYyhsaW5lbGVuKTsKKworCWlycSA9IDA7CisJd2hpbGUgKGZnZXRzKGxpbmUsIGxpbmVsZW4sIGZwKQorCSAmJiBpcnEgPCBtYXhfaXJxcworCSkgeworCQlpbnQgcCA9IHN0cmNzcG4obGluZSwgIjoiKTsKKwkJaWYgKChwID4gMCkgJiYgKHAgPCAxNikpCisJCQlpcnErKzsKKwl9CisKKwlmY2xvc2UoZnApOworCWZyZWUobGluZSk7CisKKwlyZXR1cm4gaXJxOworfQorCisvL3VzYWdlOiNkZWZpbmUgbXBzdGF0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLUFdIFstSSBTVU18Q1BVfEFMTHxTQ1BVXSBbLXVdIFstUCBudW18QUxMXSBbSU5URVJWQUwgW0NPVU5UXV0iCisvL3VzYWdlOiNkZWZpbmUgbXBzdGF0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUGVyLXByb2Nlc3NvciBzdGF0aXN0aWNzXG4iCisvL3VzYWdlOiAgICAgIlxuCS1BCQkJU2FtZSBhcyAtSSBBTEwgLXUgLVAgQUxMIgorLy91c2FnZTogICAgICJcbgktSSBTVU18Q1BVfEFMTHxTQ1BVCVJlcG9ydCBpbnRlcnJ1cHQgc3RhdGlzdGljcyIKKy8vdXNhZ2U6ICAgICAiXG4JLVAgbnVtfEFMTAkJUHJvY2Vzc29yIHRvIG1vbml0b3IiCisvL3VzYWdlOiAgICAgIlxuCS11CQkJUmVwb3J0IENQVSB1dGlsaXphdGlvbiIKKworaW50IG1wc3RhdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbXBzdGF0X21haW4oaW50IFVOVVNFRF9QQVJBTSBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpvcHRfaXJxX2ZtdDsKKwljaGFyICpvcHRfc2V0X2NwdTsKKwlpbnQgaSwgb3B0OworCWVudW0geworCQlPUFRfQUxMICAgID0gMSA8PCAwLCAvKiAtQSAqLworCQlPUFRfSU5UUyAgID0gMSA8PCAxLCAvKiAtSSAqLworCQlPUFRfU0VUQ1BVID0gMSA8PCAyLCAvKiAtUCAqLworCQlPUFRfVVRJTCAgID0gMSA8PCAzLCAvKiAtdSAqLworCX07CisKKwkvKiBEb250IGJ1ZmZlciBkYXRhIGlmIHJlZGlyZWN0ZWQgdG8gYSBwaXBlICovCisJc2V0YnVmKHN0ZG91dCwgTlVMTCk7CisKKwlJTklUX0coKTsKKworCUcuaW50ZXJ2YWwgPSAtMTsKKworCS8qIEdldCBudW1iZXIgb2YgcHJvY2Vzc29ycyAqLworCUcuY3B1X25yID0gZ2V0X2NwdV9jb3VudCgpOworCisJLyogR2V0IG51bWJlciBvZiBjbG9jayB0aWNrcyBwZXIgc2VjICovCisJRy5oeiA9IGJiX2Nsa190Y2soKTsKKworCS8qIENhbGN1bGF0ZSBudW1iZXIgb2YgaW50ZXJydXB0cyBwZXIgcHJvY2Vzc29yICovCisJRy5pcnFjcHVfbnIgPSBnZXRfaXJxY3B1X25yKFBST0NGU19JTlRFUlJVUFRTLCBOUl9JUlFTKSArIE5SX0lSUUNQVV9QUkVBTExPQzsKKworCS8qIENhbGN1bGF0ZSBudW1iZXIgb2Ygc29mdCBpbnRlcnJ1cHRzIHBlciBwcm9jZXNzb3IgKi8KKwlHLnNvZnRpcnFjcHVfbnIgPSBnZXRfaXJxY3B1X25yKFBST0NGU19TT0ZUSVJRUywgTlJfSVJRUykgKyBOUl9JUlFDUFVfUFJFQUxMT0M7CisKKwkvKiBBbGxvY2F0ZSBzcGFjZSBmb3Igc3RydWN0dXJlcy4gKyAxIGZvciBnbG9iYWwgc3RydWN0dXJlLiAqLworCWFsbG9jX3N0cnVjdChHLmNwdV9uciArIDEpOworCisJLyogUGFyc2UgYW5kIHByb2Nlc3MgYXJndW1lbnRzICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIkFJOlA6dSIsICZvcHRfaXJxX2ZtdCwgJm9wdF9zZXRfY3B1KTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmICgqYXJndikgeworCQkvKiBHZXQgaW50ZXJ2YWwgKi8KKwkJRy5pbnRlcnZhbCA9IHhhdG9pX3Bvc2l0aXZlKCphcmd2KTsKKwkJRy5jb3VudCA9IC0xOworCQlhcmd2Kys7CisJCWlmICgqYXJndikgeworCQkJLyogR2V0IGNvdW50IHZhbHVlICovCisJCQlpZiAoRy5pbnRlcnZhbCA9PSAwKQorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCUcuY291bnQgPSB4YXRvaV9wb3NpdGl2ZSgqYXJndik7CisJCQkvL2lmICgqKythcmd2KQorCQkJLy8JYmJfc2hvd191c2FnZSgpOworCQl9CisJfQorCWlmIChHLmludGVydmFsIDwgMCkKKwkJRy5pbnRlcnZhbCA9IDA7CisKKwlpZiAob3B0ICYgT1BUX0FMTCkgeworCQlHLnBfb3B0aW9uID0gMTsKKwkJRy5vcHRpb25zIHw9IERfQ1BVICsgRF9JUlFfU1VNICsgRF9JUlFfQ1BVICsgRF9TT0ZUSVJRUzsKKwkJLyogU2VsZWN0IGV2ZXJ5IENQVSAqLworCQltZW1zZXQoRy5jcHVfYml0bWFwLCAweGZmLCBHLmNwdV9iaXRtYXBfbGVuKTsKKwl9CisKKwlpZiAob3B0ICYgT1BUX0lOVFMpIHsKKwkJc3RhdGljIGNvbnN0IGNoYXIgdltdID0geworCQkJRF9JUlFfQ1BVLCBEX0lSUV9TVU0sIERfU09GVElSUVMsCisJCQlEX0lSUV9TVU0gKyBEX0lSUV9DUFUgKyBEX1NPRlRJUlFTCisJCX07CisJCWkgPSBpbmRleF9pbl9zdHJpbmdzKCJDUFVcMFNVTVwwU0NQVVwwQUxMXDAiLCBvcHRfaXJxX2ZtdCk7CisJCWlmIChpID09IC0xKQorCQkJYmJfc2hvd191c2FnZSgpOworCQlHLm9wdGlvbnMgfD0gdltpXTsKKwl9CisKKwlpZiAoKG9wdCAmIE9QVF9VVElMKSAvKiAtdT8gKi8KKwkgfHwgRy5vcHRpb25zID09IDAgIC8qIG5vdGhpbmc/ICh1c2UgZGVmYXVsdCB0aGVuKSAqLworCSkgeworCQlHLm9wdGlvbnMgfD0gRF9DUFU7CisJfQorCisJaWYgKG9wdCAmIE9QVF9TRVRDUFUpIHsKKwkJY2hhciAqdDsKKwkJRy5wX29wdGlvbiA9IDE7CisKKwkJZm9yICh0ID0gc3RydG9rKG9wdF9zZXRfY3B1LCAiLCIpOyB0OyB0ID0gc3RydG9rKE5VTEwsICIsIikpIHsKKwkJCWlmIChzdHJjbXAodCwgIkFMTCIpID09IDApIHsKKwkJCQkvKiBTZWxlY3QgZXZlcnkgQ1BVICovCisJCQkJbWVtc2V0KEcuY3B1X2JpdG1hcCwgMHhmZiwgRy5jcHVfYml0bWFwX2xlbik7CisJCQl9IGVsc2UgeworCQkJCS8qIEdldCBDUFUgbnVtYmVyICovCisJCQkJdW5zaWduZWQgbiA9IHhhdG9pX3Bvc2l0aXZlKHQpOworCQkJCWlmIChuID49IEcuY3B1X25yKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibm90IHRoYXQgbWFueSBwcm9jZXNzb3JzIik7CisJCQkJbisrOworCQkJCUcuY3B1X2JpdG1hcFtuID4+IDNdIHw9IDEgPDwgKG4gJiA3KTsKKwkJCX0KKwkJfQorCX0KKworCWlmICghRy5wX29wdGlvbikKKwkJLyogRGlzcGxheSBnbG9iYWwgc3RhdHMgKi8KKwkJRy5jcHVfYml0bWFwWzBdID0gMTsKKworCS8qIEdldCB0aW1lICovCisJZ2V0X2xvY2FsdGltZSgmRy50aW1lc3RhbXBbMF0pOworCisJLyogRGlzcGxheSBoZWFkZXIgKi8KKwlwcmludF9oZWFkZXIoJkcudGltZXN0YW1wWzBdKTsKKworCS8qIFRoZSBtYWluIGxvb3AgKi8KKwltYWluX2xvb3AoKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQkvKiBDbGVhbiB1cCAqLworCQlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCQlmcmVlKEcuc3RfY3B1W2ldKTsKKwkJCWZyZWUoRy5zdF9pcnFbaV0pOworCQkJZnJlZShHLnN0X2lycWNwdVtpXSk7CisJCQlmcmVlKEcuc3Rfc29mdGlycWNwdVtpXSk7CisJCX0KKwkJZnJlZShHLmNwdV9iaXRtYXApOworCQlmcmVlKCZHKTsKKwl9CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvcHJvY3BzL25tZXRlci5jIGIvcHJvY3BzL25tZXRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNWI4M2IKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9jcHMvbm1ldGVyLmMKQEAgLTAsMCArMSw5NzYgQEAKKy8qCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIEJhc2VkIG9uIG5hbm90b3AuYyBmcm9tIGZsb3BweWZ3IHByb2plY3QKKyAqCisgKiBDb250YWN0IG1lOiB2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20KKyAqLworCisvL2NvbmZpZzpjb25maWcgTk1FVEVSCisvL2NvbmZpZzoJYm9vbCAibm1ldGVyIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFByaW50cyBzZWxlY3RlZCBzeXN0ZW0gc3RhdHMgY29udGludW91c2x5LCBvbmUgbGluZSBwZXIgdXBkYXRlLgorCisvL2FwcGxldDpJRl9OTUVURVIoQVBQTEVUKG5tZXRlciwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19OTUVURVIpICs9IG5tZXRlci5vCisKKy8vdXNhZ2U6I2RlZmluZSBubWV0ZXJfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZCBNU0VDXSBGT1JNQVRfU1RSSU5HIgorLy91c2FnZTojZGVmaW5lIG5tZXRlcl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIk1vbml0b3Igc3lzdGVtIGluIHJlYWwgdGltZSIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuIC1kIE1TRUMJTWlsbGlzZWNvbmRzIGJldHdlZW4gdXBkYXRlcyAoZGVmYXVsdDoxMDAwKSIKKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuRm9ybWF0IHNwZWNpZmllcnM6IgorLy91c2FnZTogICAgICJcbiAlTmMgb3IgJVtjTl0JQ1BVLiBOIC0gYmFyIHNpemUgKGRlZmF1bHQ6MTApIgorLy91c2FnZTogICAgICJcbgkJKGRpc3BsYXlzOiBTOnN5c3RlbSBVOnVzZXIgTjpuaWNlZCBEOmlvd2FpdCBJOmlycSBpOnNvZnRpcnEpIgorLy91c2FnZTogICAgICJcbiAlW25JTlRFUkZBQ0VdCU5ldHdvcmsgSU5URVJGQUNFIgorLy91c2FnZTogICAgICJcbiAlbQkJQWxsb2NhdGVkIG1lbW9yeSIKKy8vdXNhZ2U6ICAgICAiXG4gJVttZl0JCUZyZWUgbWVtb3J5IgorLy91c2FnZTogICAgICJcbiAlW210XQkJVG90YWwgbWVtb3J5IgorLy91c2FnZTogICAgICJcbiAlcwkJQWxsb2NhdGVkIHN3YXAiCisvL3VzYWdlOiAgICAgIlxuICVmCQlOdW1iZXIgb2YgdXNlZCBmaWxlIGRlc2NyaXB0b3JzIgorLy91c2FnZTogICAgICJcbiAlTmkJCVRvdGFsL3NwZWNpZmljIElSUSByYXRlIgorLy91c2FnZTogICAgICJcbiAleAkJQ29udGV4dCBzd2l0Y2ggcmF0ZSIKKy8vdXNhZ2U6ICAgICAiXG4gJXAJCUZvcmtzIgorLy91c2FnZTogICAgICJcbiAlW3BuXQkJIyBvZiBwcm9jZXNzZXMiCisvL3VzYWdlOiAgICAgIlxuICViCQlCbG9jayBpbyIKKy8vdXNhZ2U6ICAgICAiXG4gJU50CQlUaW1lICh3aXRoIE4gZGVjaW1hbCBwb2ludHMpIgorLy91c2FnZTogICAgICJcbiAlcgkJUHJpbnQgPGNyPiBpbnN0ZWFkIG9mIDxsZj4gYXQgRU9MIgorCisvL1RPRE86CisvLyBzaW1wbGlmeSBjb2RlCisvLyAvcHJvYy9sb2NrcworLy8gL3Byb2Mvc3RhdDoKKy8vIGRpc2tfaW86ICgzLDApOigyMjI3MiwxNzg5Nyw0MTA3MDIsNDM3NSw1NDc1MCkKKy8vIGJ0aW1lIDEwNTk0MDE5NjIKKy8vVE9ETzogdXNlIHN5c2luZm8gbGliYyBjYWxsL3N5c2NhbGwsIGlmIGFwcHJvcHJpYXRlCisvLyAoZmFzdGVyIHRoYW4gb3Blbi9yZWFkL2Nsb3NlKToKKy8vIHN5c2luZm8oe3VwdGltZT0xNTAxNywgbG9hZHM9WzU3MjgsIDE1MDQwLCAxNjQ4MF0KKy8vICB0b3RhbHJhbT0yMTA3NDE2NTc2LCBmcmVlcmFtPTIxMTUyNTYzMiwgc2hhcmVkcmFtPTAsIGJ1ZmZlcnJhbT0xNTcyMDQ0ODB9CisvLyAgdG90YWxzd2FwPTEzNDIwOTUzNiwgZnJlZXN3YXA9MTM0MjA5NTM2LCBwcm9jcz0xNTd9KQorCisjaW5jbHVkZSAibGliYmIuaCIKKwordHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWxsb25nOworCitlbnVtIHsgIC8qIFByZWZlcmFibHkgdXNlIHBvd2VycyBvZiAyICovCisJUFJPQ19NSU5fRklMRV9TSVpFID0gMjU2LAorCVBST0NfTUFYX0ZJTEVfU0laRSA9IDE2ICogMTAyNCwKK307CisKK3R5cGVkZWYgc3RydWN0IHByb2NfZmlsZSB7CisJY2hhciAqZmlsZTsKKwlpbnQgZmlsZV9zejsKKwlzbWFsbGludCBsYXN0X2dlbjsKK30gcHJvY19maWxlOworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgcHJvY19uYW1lW10gPSB7CisJInN0YXQiLAkJLy8gTXVzdCBtYXRjaCB0aGUgb3JkZXIgb2YgcHJvY19maWxlJ3MhCisJImxvYWRhdmciLAorCSJuZXQvZGV2IiwKKwkibWVtaW5mbyIsCisJImRpc2tzdGF0cyIsCisJInN5cy9mcy9maWxlLW5yIgorfTsKKworc3RydWN0IGdsb2JhbHMgeworCS8vIFNhbXBsZSBnZW5lcmF0aW9uIGZsaXAtZmxvcAorCXNtYWxsaW50IGdlbjsKKwkvLyBMaW51eCAyLjY/IChvdGhlcndpc2UgYXNzdW1lcyAyLjQpCisJc21hbGxpbnQgaXMyNjsKKwkvLyAxIGlmIHNhbXBsZSBkZWxheSBpcyBub3QgYW4gaW50ZWdlciBmcmFjdGlvbiBvZiBhIHNlY29uZAorCXNtYWxsaW50IG5lZWRfc2Vjb25kczsKKwljaGFyICpjdXJfb3V0YnVmOworCWNvbnN0IGNoYXIgKmZpbmFsX3N0cjsKKwlpbnQgZGVsdGE7CisJaW50IGRlbHRhbno7CisJc3RydWN0IHRpbWV2YWwgdHY7CisjZGVmaW5lIGZpcnN0X3Byb2NfZmlsZSBwcm9jX3N0YXQKKwlwcm9jX2ZpbGUgcHJvY19zdGF0OwkvLyBNdXN0IG1hdGNoIHRoZSBvcmRlciBvZiBwcm9jX25hbWUncyEKKwlwcm9jX2ZpbGUgcHJvY19sb2FkYXZnOworCXByb2NfZmlsZSBwcm9jX25ldF9kZXY7CisJcHJvY19maWxlIHByb2NfbWVtaW5mbzsKKwlwcm9jX2ZpbGUgcHJvY19kaXNrc3RhdHM7CisJcHJvY19maWxlIHByb2Nfc3lzX2ZzX2ZpbGVucjsKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgZ2VuICAgICAgICAgICAgICAgIChHLmdlbiAgICAgICAgICAgICAgICkKKyNkZWZpbmUgaXMyNiAgICAgICAgICAgICAgIChHLmlzMjYgICAgICAgICAgICAgICkKKyNkZWZpbmUgbmVlZF9zZWNvbmRzICAgICAgIChHLm5lZWRfc2Vjb25kcyAgICAgICkKKyNkZWZpbmUgY3VyX291dGJ1ZiAgICAgICAgIChHLmN1cl9vdXRidWYgICAgICAgICkKKyNkZWZpbmUgZmluYWxfc3RyICAgICAgICAgIChHLmZpbmFsX3N0ciAgICAgICAgICkKKyNkZWZpbmUgZGVsdGEgICAgICAgICAgICAgIChHLmRlbHRhICAgICAgICAgICAgICkKKyNkZWZpbmUgZGVsdGFueiAgICAgICAgICAgIChHLmRlbHRhbnogICAgICAgICAgICkKKyNkZWZpbmUgdHYgICAgICAgICAgICAgICAgIChHLnR2ICAgICAgICAgICAgICAgICkKKyNkZWZpbmUgcHJvY19zdGF0ICAgICAgICAgIChHLnByb2Nfc3RhdCAgICAgICAgICkKKyNkZWZpbmUgcHJvY19sb2FkYXZnICAgICAgIChHLnByb2NfbG9hZGF2ZyAgICAgICkKKyNkZWZpbmUgcHJvY19uZXRfZGV2ICAgICAgIChHLnByb2NfbmV0X2RldiAgICAgICkKKyNkZWZpbmUgcHJvY19tZW1pbmZvICAgICAgIChHLnByb2NfbWVtaW5mbyAgICAgICkKKyNkZWZpbmUgcHJvY19kaXNrc3RhdHMgICAgIChHLnByb2NfZGlza3N0YXRzICAgICkKKyNkZWZpbmUgcHJvY19zeXNfZnNfZmlsZW5yIChHLnByb2Nfc3lzX2ZzX2ZpbGVucikKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKKwljdXJfb3V0YnVmID0gb3V0YnVmOyBcCisJZmluYWxfc3RyID0gIlxuIjsgXAorCWRlbHRhbnogPSBkZWx0YSA9IDEwMDAwMDA7IFwKK30gd2hpbGUgKDApCisKKy8vIFdlIGRlcGVuZCBvbiB0aGlzIGJlaW5nIGEgY2hhcltdLCBub3QgY2hhciogLSB3ZSB0YWtlIHNpemVvZigpIG9mIGl0CisjZGVmaW5lIG91dGJ1ZiBiYl9jb21tb25fYnVmc2l6MQorCitzdGF0aWMgaW5saW5lIHZvaWQgcmVzZXRfb3V0YnVmKHZvaWQpCit7CisJY3VyX291dGJ1ZiA9IG91dGJ1ZjsKK30KKworc3RhdGljIGlubGluZSBpbnQgb3V0YnVmX2NvdW50KHZvaWQpCit7CisJcmV0dXJuIGN1cl9vdXRidWYgLSBvdXRidWY7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X291dGJ1Zih2b2lkKQoreworCWludCBzeiA9IGN1cl9vdXRidWYgLSBvdXRidWY7CisJaWYgKHN6ID4gMCkgeworCQl4d3JpdGUoU1RET1VUX0ZJTEVOTywgb3V0YnVmLCBzeik7CisJCWN1cl9vdXRidWYgPSBvdXRidWY7CisJfQorfQorCitzdGF0aWMgdm9pZCBwdXQoY29uc3QgY2hhciAqcykKK3sKKwlpbnQgc3ogPSBzdHJsZW4ocyk7CisJaWYgKHN6ID4gb3V0YnVmICsgc2l6ZW9mKG91dGJ1ZikgLSBjdXJfb3V0YnVmKQorCQlzeiA9IG91dGJ1ZiArIHNpemVvZihvdXRidWYpIC0gY3VyX291dGJ1ZjsKKwltZW1jcHkoY3VyX291dGJ1Ziwgcywgc3opOworCWN1cl9vdXRidWYgKz0gc3o7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9jKGNoYXIgYykKK3sKKwlpZiAoY3VyX291dGJ1ZiA8IG91dGJ1ZiArIHNpemVvZihvdXRidWYpKQorCQkqY3VyX291dGJ1ZisrID0gYzsKK30KKworc3RhdGljIHZvaWQgcHV0X3F1ZXN0aW9uX21hcmtzKGludCBjb3VudCkKK3sKKwl3aGlsZSAoY291bnQtLSkKKwkJcHV0X2MoJz8nKTsKK30KKworc3RhdGljIHZvaWQgcmVhZGZpbGVfeihwcm9jX2ZpbGUgKnBmLCBjb25zdCBjaGFyKiBmbmFtZSkKK3sKKy8vIG9wZW5fcmVhZF9jbG9zZSgpIHdpbGwgZG8gdHdvIHJlYWRzIGluIG9yZGVyIHRvIGJlIHN1cmUgd2UgYXJlIGF0IEVPRiwKKy8vIGFuZCB3ZSBkb24ndCBuZWVkL3dhbnQgdGhhdC4KKwlpbnQgZmQ7CisJaW50IHN6LCByZHN6OworCWNoYXIgKmJ1ZjsKKworCXN6ID0gcGYtPmZpbGVfc3o7CisJYnVmID0gcGYtPmZpbGU7CisJaWYgKCFidWYpIHsKKwkJYnVmID0geG1hbGxvYyhQUk9DX01JTl9GSUxFX1NJWkUpOworCQlzeiA9IFBST0NfTUlOX0ZJTEVfU0laRTsKKwl9CisgYWdhaW46CisJZmQgPSB4b3BlbihmbmFtZSwgT19SRE9OTFkpOworCWJ1ZlswXSA9ICdcMCc7CisJcmRzeiA9IHJlYWQoZmQsIGJ1Ziwgc3otMSk7CisJY2xvc2UoZmQpOworCWlmIChyZHN6ID4gMCkgeworCQlpZiAocmRzeiA9PSBzei0xICYmIHN6IDwgUFJPQ19NQVhfRklMRV9TSVpFKSB7CisJCQlzeiAqPSAyOworCQkJYnVmID0geHJlYWxsb2MoYnVmLCBzeik7CisJCQlnb3RvIGFnYWluOworCQl9CisJCWJ1ZltyZHN6XSA9ICdcMCc7CisJfQorCXBmLT5maWxlX3N6ID0gc3o7CisJcGYtPmZpbGUgPSBidWY7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyKiBnZXRfZmlsZShwcm9jX2ZpbGUgKnBmKQoreworCWlmIChwZi0+bGFzdF9nZW4gIT0gZ2VuKSB7CisJCXBmLT5sYXN0X2dlbiA9IGdlbjsKKwkJcmVhZGZpbGVfeihwZiwgcHJvY19uYW1lW3BmIC0gJmZpcnN0X3Byb2NfZmlsZV0pOworCX0KKwlyZXR1cm4gcGYtPmZpbGU7Cit9CisKK3N0YXRpYyB1bGxvbmcgcmVhZF9hZnRlcl9zbGFzaChjb25zdCBjaGFyICpwKQoreworCXAgPSBzdHJjaHIocCwgJy8nKTsKKwlpZiAoIXApIHJldHVybiAwOworCXJldHVybiBzdHJ0b3VsbChwKzEsIE5VTEwsIDEwKTsKK30KKworZW51bSBjb252X3R5cGUgeyBjb252X2RlY2ltYWwsIGNvbnZfc2xhc2ggfTsKKworLy8gUmVhZHMgZGVjaW1hbCB2YWx1ZXMgZnJvbSBsaW5lLiBWYWx1ZXMgc3RhcnQgYWZ0ZXIga2V5LCBmb3IgZXhhbXBsZToKKy8vICJjcHUgIDY0OTM2OSAwIDM0MTI5NyA0MzM2NzY5Li4uIiAtIGtleSBpcyAiY3B1IiBoZXJlLgorLy8gVmFsdWVzIGFyZSBzdG9yZWQgaW4gdmVjW10uIGFyZ19wdHIgaGFzIGxpc3Qgb2YgcG9zaXRpb25zCisvLyB3ZSBhcmUgaW50ZXJlc3RlZCBpbjogZm9yIGV4YW1wbGU6IDEsMiw1IC0gd2Ugd2FudCAxc3QsIDJuZCBhbmQgNXRoIHZhbHVlLgorc3RhdGljIGludCB2cmR2YWwoY29uc3QgY2hhciogcCwgY29uc3QgY2hhcioga2V5LAorCWVudW0gY29udl90eXBlIGNvbnYsIHVsbG9uZyAqdmVjLCB2YV9saXN0IGFyZ19wdHIpCit7CisJaW50IGluZGV4bGluZTsKKwlpbnQgaW5kZXhuZXh0OworCisJcCA9IHN0cnN0cihwLCBrZXkpOworCWlmICghcCkgcmV0dXJuIDE7CisKKwlwICs9IHN0cmxlbihrZXkpOworCWluZGV4bGluZSA9IDE7CisJaW5kZXhuZXh0ID0gdmFfYXJnKGFyZ19wdHIsIGludCk7CisJd2hpbGUgKDEpIHsKKwkJd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKSBwKys7CisJCWlmICgqcCA9PSAnXG4nIHx8ICpwID09ICdcMCcpIGJyZWFrOworCisJCWlmIChpbmRleGxpbmUgPT0gaW5kZXhuZXh0KSB7IC8vIHJlYWQgdGhpcyB2YWx1ZQorCQkJKnZlYysrID0gY29udj09Y29udl9kZWNpbWFsID8KKwkJCQlzdHJ0b3VsbChwLCBOVUxMLCAxMCkgOgorCQkJCXJlYWRfYWZ0ZXJfc2xhc2gocCk7CisJCQlpbmRleG5leHQgPSB2YV9hcmcoYXJnX3B0ciwgaW50KTsKKwkJfQorCQl3aGlsZSAoKnAgPiAnICcpIHArKzsgLy8gc2tpcCBvdmVyIHZhbHVlCisJCWluZGV4bGluZSsrOworCX0KKwlyZXR1cm4gMDsKK30KKworLy8gUGFyc2VzIGZpbGVzIHdpdGggbGluZXMgbGlrZSAiY3B1MCAyMTcyNyAwIDE1NzE4IDE4MTM4NTYgOTQ2MSAxMDQ4NSAwIDAiOgorLy8gcmR2YWwoZmlsZV9jb250ZW50cywgInN0cmluZ190b19maW5kIiwgcmVzdWx0X3ZlY3RvciwgdmFsdWUjLCB2YWx1ZSMuLi4pCisvLyB2YWx1ZSMgc3RhcnQgd2l0aCAxCitzdGF0aWMgaW50IHJkdmFsKGNvbnN0IGNoYXIqIHAsIGNvbnN0IGNoYXIqIGtleSwgdWxsb25nICp2ZWMsIC4uLikKK3sKKwl2YV9saXN0IGFyZ19wdHI7CisJaW50IHJlc3VsdDsKKworCXZhX3N0YXJ0KGFyZ19wdHIsIHZlYyk7CisJcmVzdWx0ID0gdnJkdmFsKHAsIGtleSwgY29udl9kZWNpbWFsLCB2ZWMsIGFyZ19wdHIpOworCXZhX2VuZChhcmdfcHRyKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8vIFBhcnNlcyBmaWxlcyB3aXRoIGxpbmVzIGxpa2UgIi4uLiAuLi4gLi4uIDMvMTQ4IC4uLi4iCitzdGF0aWMgaW50IHJkdmFsX2xvYWRhdmcoY29uc3QgY2hhciogcCwgdWxsb25nICp2ZWMsIC4uLikKK3sKKwl2YV9saXN0IGFyZ19wdHI7CisJaW50IHJlc3VsdDsKKworCXZhX3N0YXJ0KGFyZ19wdHIsIHZlYyk7CisJcmVzdWx0ID0gdnJkdmFsKHAsICIiLCBjb252X3NsYXNoLCB2ZWMsIGFyZ19wdHIpOworCXZhX2VuZChhcmdfcHRyKTsKKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8vIFBhcnNlcyAvcHJvYy9kaXNrc3RhdHMKKy8vICAgMSAgMiAzICAgNCAgICAgNSAgICAgNihyZCkgIDcgICAgICA4ICAgICA5ICAgICAxMCh3cikgMTEgICAgIDEyIDEzICAgICAxNAorLy8gICAzICAwIGhkYSA1MTI5MiAxNDQ0MSA4NDE3ODMgOTI2MDUyIDI1NzE3IDc5NjUwIDg0MzI1NiAzMDI5ODA0IDAgMTQ4NDU5IDM5NTY5MzMKKy8vICAgMyAgMSBoZGExIDAgMCAwIDAgPC0gaWdub3JlIGlmIG9ubHkgNCBmaWVsZHMKKy8vIExpbnV4IDMuMCAobWF5YmUgZWFybGllcikgc3RhcnRlZCBwcmludGluZyBmdWxsIHN0YXRzIGZvciBoZGExIHRvby4KKy8vIEhhZCB0byBhZGQgY29kZSB3aGljaCBza2lwcyBzdWNoIGRldmljZXMuCitzdGF0aWMgaW50IHJkdmFsX2Rpc2tzdGF0cyhjb25zdCBjaGFyKiBwLCB1bGxvbmcgKnZlYykKK3sKKwljaGFyIGRldm5hbWVbMzJdOworCXVuc2lnbmVkIGRldm5hbWVfbGVuID0gMDsKKwlpbnQgdmFsdWVfaWR4ID0gMDsKKworCXZlY1swXSA9IDA7CisJdmVjWzFdID0gMDsKKwl3aGlsZSAoMSkgeworCQl2YWx1ZV9pZHgrKzsKKwkJd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKQorCQkJcCsrOworCQlpZiAoKnAgPT0gJ1wwJykKKwkJCWJyZWFrOworCQlpZiAoKnAgPT0gJ1xuJykgeworCQkJdmFsdWVfaWR4ID0gMDsKKwkJCXArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICh2YWx1ZV9pZHggPT0gMykgeworCQkJY2hhciAqZW5kID0gc3RyY2hybnVsKHAsICcgJyk7CisJCQkvKiBJZiB0aGlzIGEgaGRhMS1saWtlIGRldmljZSAoc2FtZSBwcmVmaXggYXMgbGFzdCBvbmUgKyBkaWdpdCk/ICovCisJCQlpZiAoZGV2bmFtZV9sZW4gJiYgc3RybmNtcChkZXZuYW1lLCBwLCBkZXZuYW1lX2xlbikgPT0gMCAmJiBpc2RpZ2l0KHBbZGV2bmFtZV9sZW5dKSkgeworCQkJCXAgPSBlbmQ7CisJCQkJZ290byBza2lwX2xpbmU7IC8qIHNraXAgZW50aXJlIGxpbmUgKi8KKwkJCX0KKwkJCS8qIEl0IGlzIG5vdC4gUmVtZW1iZXIgdGhlIG5hbWUgZm9yIGZ1dHVyZSBjaGVja3MgKi8KKwkJCWRldm5hbWVfbGVuID0gZW5kIC0gcDsKKwkJCWlmIChkZXZuYW1lX2xlbiA+IHNpemVvZihkZXZuYW1lKS0xKQorCQkJCWRldm5hbWVfbGVuID0gc2l6ZW9mKGRldm5hbWUpLTE7CisJCQlzdHJuY3B5KGRldm5hbWUsIHAsIGRldm5hbWVfbGVuKTsKKwkJCS8qIGRldm5hbWVbZGV2bmFtZV9sZW5dID0gJ1wwJzsgLSBub3QgcmVhbGx5IG5lZWRlZCAqLworCQkJcCA9IGVuZDsKKwkJfSBlbHNlCisJCWlmICh2YWx1ZV9pZHggPT0gNikgeworCQkJLy8gVE9ETzogKnNlY3RvcnNpemUgKGRvbid0IGtub3cgaG93IHRvIGZpbmQgb3V0IHNlY3RvcnNpemUpCisJCQl2ZWNbMF0gKz0gc3RydG91bGwocCwgTlVMTCwgMTApOworCQl9IGVsc2UKKwkJaWYgKHZhbHVlX2lkeCA9PSAxMCkgeworCQkJLy8gVE9ETzogKnNlY3RvcnNpemUgKGRvbid0IGtub3cgaG93IHRvIGZpbmQgb3V0IHNlY3RvcnNpemUpCisJCQl2ZWNbMV0gKz0gc3RydG91bGwocCwgTlVMTCwgMTApOworIHNraXBfbGluZToKKwkJCXdoaWxlICgqcCAhPSAnXG4nICYmICpwICE9ICdcMCcpCisJCQkJcCsrOworCQkJY29udGludWU7CisJCX0KKwkJd2hpbGUgKCh1bnNpZ25lZCBjaGFyKSgqcCkgPiAnICcpIC8vIHNraXAgb3ZlciB2YWx1ZQorCQkJcCsrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc2NhbGUodWxsb25nIHVsKQoreworCWNoYXIgYnVmWzVdOworCisJLyogc2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVGVyYSAqLworCXNtYXJ0X3VsbHRvYTQodWwsIGJ1ZiwgIiBrbWd0cGV6eSIpWzBdID0gJ1wwJzsKKwlwdXQoYnVmKTsKK30KKworCisjZGVmaW5lIFNfU1RBVChhKSBcCit0eXBlZGVmIHN0cnVjdCBhIHsgXAorCXN0cnVjdCBzX3N0YXQgKm5leHQ7IFwKKwl2b2lkICgqY29sbGVjdCkoc3RydWN0IGEgKnMpIEZBU1RfRlVOQzsgXAorCWNvbnN0IGNoYXIgKmxhYmVsOworI2RlZmluZSBTX1NUQVRfRU5EKGEpIH0gYTsKKworU19TVEFUKHNfc3RhdCkKK1NfU1RBVF9FTkQoc19zdGF0KQorCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY29sbGVjdF9saXRlcmFsKHNfc3RhdCAqcyBVTlVTRURfUEFSQU0pCit7Cit9CisKK3N0YXRpYyBzX3N0YXQqIGluaXRfbGl0ZXJhbCh2b2lkKQoreworCXNfc3RhdCAqcyA9IHh6YWxsb2Moc2l6ZW9mKCpzKSk7CisJcy0+Y29sbGVjdCA9IGNvbGxlY3RfbGl0ZXJhbDsKKwlyZXR1cm4gKHNfc3RhdCopczsKK30KKworc3RhdGljIHNfc3RhdCogaW5pdF9kZWxheShjb25zdCBjaGFyICpwYXJhbSkKK3sKKwlkZWx0YSA9IHN0cnRvdWwocGFyYW0sIE5VTEwsIDApICogMTAwMDsgLyogcGFyYW0gY2FuIGJlICIiICovCisJZGVsdGFueiA9IGRlbHRhID4gMCA/IGRlbHRhIDogMTsKKwluZWVkX3NlY29uZHMgPSAoMTAwMDAwMCVkZWx0YW56KSAhPSAwOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc19zdGF0KiBpbml0X2NyKGNvbnN0IGNoYXIgKnBhcmFtIFVOVVNFRF9QQVJBTSkKK3sKKwlmaW5hbF9zdHIgPSAiXHIiOworCXJldHVybiAoc19zdGF0KikwOworfQorCisKKy8vICAgICB1c2VyIG5pY2Ugc3lzdGVtIGlkbGUgIGlvd2FpdCBpcnEgIHNvZnRpcnEgKGxhc3QgMyBvbmx5IGluIDIuNikKKy8vY3B1ICA2NDkzNjkgMCAzNDEyOTcgNDMzNjc2OSAxMTY0MCA3MTIyIDExODMKKy8vY3B1TiA2NDkzNjkgMCAzNDEyOTcgNDMzNjc2OSAxMTY0MCA3MTIyIDExODMKK2VudW0geyBDUFVfRklFTERDTlQgPSA3IH07CitTX1NUQVQoY3B1X3N0YXQpCisJdWxsb25nIG9sZFtDUFVfRklFTERDTlRdOworCWludCBiYXJfc3o7CisJY2hhciAqYmFyOworU19TVEFUX0VORChjcHVfc3RhdCkKKworCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY29sbGVjdF9jcHUoY3B1X3N0YXQgKnMpCit7CisJdWxsb25nIGRhdGFbQ1BVX0ZJRUxEQ05UXSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworCXVuc2lnbmVkIGZyYWNbQ1BVX0ZJRUxEQ05UXSA9IHsgMCwgMCwgMCwgMCwgMCwgMCwgMCB9OworCXVsbG9uZyBhbGwgPSAwOworCWludCBub3JtX2FsbCA9IDA7CisJaW50IGJhcl9zeiA9IHMtPmJhcl9zejsKKwljaGFyICpiYXIgPSBzLT5iYXI7CisJaW50IGk7CisKKwlpZiAocmR2YWwoZ2V0X2ZpbGUoJnByb2Nfc3RhdCksICJjcHUgIiwgZGF0YSwgMSwgMiwgMywgNCwgNSwgNiwgNykpIHsKKwkJcHV0X3F1ZXN0aW9uX21hcmtzKGJhcl9zeik7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQ1BVX0ZJRUxEQ05UOyBpKyspIHsKKwkJdWxsb25nIG9sZCA9IHMtPm9sZFtpXTsKKwkJaWYgKGRhdGFbaV0gPCBvbGQpIG9sZCA9IGRhdGFbaV07CQkvL3Nhbml0aXplCisJCXMtPm9sZFtpXSA9IGRhdGFbaV07CisJCWFsbCArPSAoZGF0YVtpXSAtPSBvbGQpOworCX0KKworCWlmIChhbGwpIHsKKwkJZm9yIChpID0gMDsgaSA8IENQVV9GSUVMRENOVDsgaSsrKSB7CisJCQl1bGxvbmcgdCA9IGJhcl9zeiAqIGRhdGFbaV07CisJCQlub3JtX2FsbCArPSBkYXRhW2ldID0gdCAvIGFsbDsKKwkJCWZyYWNbaV0gPSB0ICUgYWxsOworCQl9CisKKwkJd2hpbGUgKG5vcm1fYWxsIDwgYmFyX3N6KSB7CisJCQl1bnNpZ25lZCBtYXggPSBmcmFjWzBdOworCQkJaW50IHBvcyA9IDA7CisJCQlmb3IgKGkgPSAxOyBpIDwgQ1BVX0ZJRUxEQ05UOyBpKyspIHsKKwkJCQlpZiAoZnJhY1tpXSA+IG1heCkgbWF4ID0gZnJhY1tpXSwgcG9zID0gaTsKKwkJCX0KKwkJCWZyYWNbcG9zXSA9IDA7CS8vYXZvaWQgYnVtcGluZyB1cCBzYW1lIHZhbHVlIHR3aWNlCisJCQlkYXRhW3Bvc10rKzsKKwkJCW5vcm1fYWxsKys7CisJCX0KKworCQltZW1zZXQoYmFyLCAnLicsIGJhcl9zeik7CisJCW1lbXNldChiYXIsICdTJywgZGF0YVsyXSk7IGJhciArPSBkYXRhWzJdOyAvL3N5cworCQltZW1zZXQoYmFyLCAnVScsIGRhdGFbMF0pOyBiYXIgKz0gZGF0YVswXTsgLy91c3IKKwkJbWVtc2V0KGJhciwgJ04nLCBkYXRhWzFdKTsgYmFyICs9IGRhdGFbMV07IC8vbmljZQorCQltZW1zZXQoYmFyLCAnRCcsIGRhdGFbNF0pOyBiYXIgKz0gZGF0YVs0XTsgLy9pb3dhaXQKKwkJbWVtc2V0KGJhciwgJ0knLCBkYXRhWzVdKTsgYmFyICs9IGRhdGFbNV07IC8vaXJxCisJCW1lbXNldChiYXIsICdpJywgZGF0YVs2XSk7IGJhciArPSBkYXRhWzZdOyAvL3NvZnRpcnEKKwl9IGVsc2UgeworCQltZW1zZXQoYmFyLCAnPycsIGJhcl9zeik7CisJfQorCXB1dChzLT5iYXIpOworfQorCisKK3N0YXRpYyBzX3N0YXQqIGluaXRfY3B1KGNvbnN0IGNoYXIgKnBhcmFtKQoreworCWludCBzejsKKwljcHVfc3RhdCAqcyA9IHh6YWxsb2Moc2l6ZW9mKCpzKSk7CisJcy0+Y29sbGVjdCA9IGNvbGxlY3RfY3B1OworCXN6ID0gc3RydG91bChwYXJhbSwgTlVMTCwgMCk7IC8qIHBhcmFtIGNhbiBiZSAiIiAqLworCWlmIChzeiA8IDEwKSBzeiA9IDEwOworCWlmIChzeiA+IDEwMDApIHN6ID0gMTAwMDsKKwlzLT5iYXIgPSB4emFsbG9jKHN6KzEpOworCS8qcy0+YmFyW3N6XSA9ICdcMCc7IC0geHphbGxvYyBkaWQgaXQgKi8KKwlzLT5iYXJfc3ogPSBzejsKKwlyZXR1cm4gKHNfc3RhdCopczsKK30KKworCitTX1NUQVQoaW50X3N0YXQpCisJdWxsb25nIG9sZDsKKwlpbnQgbm87CitTX1NUQVRfRU5EKGludF9zdGF0KQorCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY29sbGVjdF9pbnQoaW50X3N0YXQgKnMpCit7CisJdWxsb25nIGRhdGFbMV07CisJdWxsb25nIG9sZDsKKworCWlmIChyZHZhbChnZXRfZmlsZSgmcHJvY19zdGF0KSwgImludHIiLCBkYXRhLCBzLT5ubykpIHsKKwkJcHV0X3F1ZXN0aW9uX21hcmtzKDQpOworCQlyZXR1cm47CisJfQorCisJb2xkID0gcy0+b2xkOworCWlmIChkYXRhWzBdIDwgb2xkKSBvbGQgPSBkYXRhWzBdOwkJLy9zYW5pdGl6ZQorCXMtPm9sZCA9IGRhdGFbMF07CisJc2NhbGUoZGF0YVswXSAtIG9sZCk7Cit9CisKK3N0YXRpYyBzX3N0YXQqIGluaXRfaW50KGNvbnN0IGNoYXIgKnBhcmFtKQoreworCWludF9zdGF0ICpzID0geHphbGxvYyhzaXplb2YoKnMpKTsKKwlzLT5jb2xsZWN0ID0gY29sbGVjdF9pbnQ7CisJaWYgKHBhcmFtWzBdID09ICdcMCcpIHsKKwkJcy0+bm8gPSAxOworCX0gZWxzZSB7CisJCWludCBuID0geGF0b2lfcG9zaXRpdmUocGFyYW0pOworCQlzLT5ubyA9IG4gKyAyOworCX0KKwlyZXR1cm4gKHNfc3RhdCopczsKK30KKworCitTX1NUQVQoY3R4X3N0YXQpCisJdWxsb25nIG9sZDsKK1NfU1RBVF9FTkQoY3R4X3N0YXQpCisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjb2xsZWN0X2N0eChjdHhfc3RhdCAqcykKK3sKKwl1bGxvbmcgZGF0YVsxXTsKKwl1bGxvbmcgb2xkOworCisJaWYgKHJkdmFsKGdldF9maWxlKCZwcm9jX3N0YXQpLCAiY3R4dCIsIGRhdGEsIDEpKSB7CisJCXB1dF9xdWVzdGlvbl9tYXJrcyg0KTsKKwkJcmV0dXJuOworCX0KKworCW9sZCA9IHMtPm9sZDsKKwlpZiAoZGF0YVswXSA8IG9sZCkgb2xkID0gZGF0YVswXTsJCS8vc2FuaXRpemUKKwlzLT5vbGQgPSBkYXRhWzBdOworCXNjYWxlKGRhdGFbMF0gLSBvbGQpOworfQorCitzdGF0aWMgc19zdGF0KiBpbml0X2N0eChjb25zdCBjaGFyICpwYXJhbSBVTlVTRURfUEFSQU0pCit7CisJY3R4X3N0YXQgKnMgPSB4emFsbG9jKHNpemVvZigqcykpOworCXMtPmNvbGxlY3QgPSBjb2xsZWN0X2N0eDsKKwlyZXR1cm4gKHNfc3RhdCopczsKK30KKworCitTX1NUQVQoYmxrX3N0YXQpCisJY29uc3QgY2hhciogbG9va2ZvcjsKKwl1bGxvbmcgb2xkWzJdOworU19TVEFUX0VORChibGtfc3RhdCkKKworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGNvbGxlY3RfYmxrKGJsa19zdGF0ICpzKQoreworCXVsbG9uZyBkYXRhWzJdOworCWludCBpOworCisJaWYgKGlzMjYpIHsKKwkJaSA9IHJkdmFsX2Rpc2tzdGF0cyhnZXRfZmlsZSgmcHJvY19kaXNrc3RhdHMpLCBkYXRhKTsKKwl9IGVsc2UgeworCQlpID0gcmR2YWwoZ2V0X2ZpbGUoJnByb2Nfc3RhdCksIHMtPmxvb2tmb3IsIGRhdGEsIDEsIDIpOworCQkvLyBMaW51eCAyLjQgcmVwb3J0cyBiaW8gaW4gS2J5dGVzLCBjb252ZXJ0IHRvIHNlY3RvcnM6CisJCWRhdGFbMF0gKj0gMjsKKwkJZGF0YVsxXSAqPSAyOworCX0KKwlpZiAoaSkgeworCQlwdXRfcXVlc3Rpb25fbWFya3MoOSk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGk9MDsgaTwyOyBpKyspIHsKKwkJdWxsb25nIG9sZCA9IHMtPm9sZFtpXTsKKwkJaWYgKGRhdGFbaV0gPCBvbGQpIG9sZCA9IGRhdGFbaV07CQkvL3Nhbml0aXplCisJCXMtPm9sZFtpXSA9IGRhdGFbaV07CisJCWRhdGFbaV0gLT0gb2xkOworCX0KKwlzY2FsZShkYXRhWzBdKjUxMik7IC8vIFRPRE86ICpzZWN0b3JzaXplCisJcHV0X2MoJyAnKTsKKwlzY2FsZShkYXRhWzFdKjUxMik7Cit9CisKK3N0YXRpYyBzX3N0YXQqIGluaXRfYmxrKGNvbnN0IGNoYXIgKnBhcmFtIFVOVVNFRF9QQVJBTSkKK3sKKwlibGtfc3RhdCAqcyA9IHh6YWxsb2Moc2l6ZW9mKCpzKSk7CisJcy0+Y29sbGVjdCA9IGNvbGxlY3RfYmxrOworCXMtPmxvb2tmb3IgPSAicGFnZSI7CisJcmV0dXJuIChzX3N0YXQqKXM7Cit9CisKKworU19TVEFUKGZvcmtfc3RhdCkKKwl1bGxvbmcgb2xkOworU19TVEFUX0VORChmb3JrX3N0YXQpCisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjb2xsZWN0X3RocmVhZF9ucihmb3JrX3N0YXQgKnMgVU5VU0VEX1BBUkFNKQoreworCXVsbG9uZyBkYXRhWzFdOworCisJaWYgKHJkdmFsX2xvYWRhdmcoZ2V0X2ZpbGUoJnByb2NfbG9hZGF2ZyksIGRhdGEsIDQpKSB7CisJCXB1dF9xdWVzdGlvbl9tYXJrcyg0KTsKKwkJcmV0dXJuOworCX0KKwlzY2FsZShkYXRhWzBdKTsKK30KKworc3RhdGljIHZvaWQgRkFTVF9GVU5DIGNvbGxlY3RfZm9yayhmb3JrX3N0YXQgKnMpCit7CisJdWxsb25nIGRhdGFbMV07CisJdWxsb25nIG9sZDsKKworCWlmIChyZHZhbChnZXRfZmlsZSgmcHJvY19zdGF0KSwgInByb2Nlc3NlcyIsIGRhdGEsIDEpKSB7CisJCXB1dF9xdWVzdGlvbl9tYXJrcyg0KTsKKwkJcmV0dXJuOworCX0KKworCW9sZCA9IHMtPm9sZDsKKwlpZiAoZGF0YVswXSA8IG9sZCkgb2xkID0gZGF0YVswXTsJLy9zYW5pdGl6ZQorCXMtPm9sZCA9IGRhdGFbMF07CisJc2NhbGUoZGF0YVswXSAtIG9sZCk7Cit9CisKK3N0YXRpYyBzX3N0YXQqIGluaXRfZm9yayhjb25zdCBjaGFyICpwYXJhbSkKK3sKKwlmb3JrX3N0YXQgKnMgPSB4emFsbG9jKHNpemVvZigqcykpOworCWlmICgqcGFyYW0gPT0gJ24nKSB7CisJCXMtPmNvbGxlY3QgPSBjb2xsZWN0X3RocmVhZF9ucjsKKwl9IGVsc2UgeworCQlzLT5jb2xsZWN0ID0gY29sbGVjdF9mb3JrOworCX0KKwlyZXR1cm4gKHNfc3RhdCopczsKK30KKworCitTX1NUQVQoaWZfc3RhdCkKKwl1bGxvbmcgb2xkWzRdOworCWNvbnN0IGNoYXIgKmRldmljZTsKKwljaGFyICpkZXZpY2VfY29sb247CitTX1NUQVRfRU5EKGlmX3N0YXQpCisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjb2xsZWN0X2lmKGlmX3N0YXQgKnMpCit7CisJdWxsb25nIGRhdGFbNF07CisJaW50IGk7CisKKwlpZiAocmR2YWwoZ2V0X2ZpbGUoJnByb2NfbmV0X2RldiksIHMtPmRldmljZV9jb2xvbiwgZGF0YSwgMSwgMywgOSwgMTEpKSB7CisJCXB1dF9xdWVzdGlvbl9tYXJrcygxMCk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGk9MDsgaTw0OyBpKyspIHsKKwkJdWxsb25nIG9sZCA9IHMtPm9sZFtpXTsKKwkJaWYgKGRhdGFbaV0gPCBvbGQpIG9sZCA9IGRhdGFbaV07CQkvL3Nhbml0aXplCisJCXMtPm9sZFtpXSA9IGRhdGFbaV07CisJCWRhdGFbaV0gLT0gb2xkOworCX0KKwlwdXRfYyhkYXRhWzFdID8gJyonIDogJyAnKTsKKwlzY2FsZShkYXRhWzBdKTsKKwlwdXRfYyhkYXRhWzNdID8gJyonIDogJyAnKTsKKwlzY2FsZShkYXRhWzJdKTsKK30KKworc3RhdGljIHNfc3RhdCogaW5pdF9pZihjb25zdCBjaGFyICpkZXZpY2UpCit7CisJaWZfc3RhdCAqcyA9IHh6YWxsb2Moc2l6ZW9mKCpzKSk7CisKKwlpZiAoIWRldmljZSB8fCAhZGV2aWNlWzBdKQorCQliYl9zaG93X3VzYWdlKCk7CisJcy0+Y29sbGVjdCA9IGNvbGxlY3RfaWY7CisKKwlzLT5kZXZpY2UgPSBkZXZpY2U7CisJcy0+ZGV2aWNlX2NvbG9uID0geGFzcHJpbnRmKCIlczoiLCBkZXZpY2UpOworCXJldHVybiAoc19zdGF0KilzOworfQorCisKK1NfU1RBVChtZW1fc3RhdCkKKwljaGFyIG9wdDsKK1NfU1RBVF9FTkQobWVtX3N0YXQpCisKKy8vICJNZW1vcnkiIHZhbHVlIHNob3VsZCBub3QgaW5jbHVkZSBhbnkgY2FjaGVzLgorLy8gSU9XOiBuZWl0aGVyICJscyAtbGFSIC8iIG5vciBoZWF2eSByZWFkL3dyaXRlIGFjdGl2aXR5CisvLyAgICAgIHNob3VsZCBhZmZlY3QgaXQuIFdlJ2QgbGlrZSB0byBhbHNvIGluY2x1ZGUgYW55CisvLyAgICAgIGxvbmctdGVybSBhbGxvY2F0ZWQga2VybmVsLXNpZGUgbWVtLCBidXQgaXQgaXMgaGFyZAorLy8gICAgICB0byBmaWd1cmUgb3V0LiBGb3Igbm93LCBidWZzLCBjYWNoZWQgJiBzbGFiIGFyZQorLy8gICAgICBjb3VudGVkIGFzICJmcmVlIiBtZW1vcnkKKy8vMi42LjE2OgorLy9NZW1Ub3RhbDogICAgICAgNzczMjgwIGtCCisvL01lbUZyZWU6ICAgICAgICAgMjU5MTIga0IgLSBnZW51aW5lbHkgZnJlZQorLy9CdWZmZXJzOiAgICAgICAgMzIwNjcyIGtCIC0gY2FjaGUKKy8vQ2FjaGVkOiAgICAgICAgIDE0NjM5NiBrQiAtIGNhY2hlCisvL1N3YXBDYWNoZWQ6ICAgICAgICAgIDAga0IKKy8vQWN0aXZlOiAgICAgICAgIDE4MzA2NCBrQgorLy9JbmFjdGl2ZTogICAgICAgMzU2ODkyIGtCCisvL0hpZ2hUb3RhbDogICAgICAgICAgIDAga0IKKy8vSGlnaEZyZWU6ICAgICAgICAgICAgMCBrQgorLy9Mb3dUb3RhbDogICAgICAgNzczMjgwIGtCCisvL0xvd0ZyZWU6ICAgICAgICAgMjU5MTIga0IKKy8vU3dhcFRvdGFsOiAgICAgIDEzMTA2NCBrQgorLy9Td2FwRnJlZTogICAgICAgMTMxMDY0IGtCCisvL0RpcnR5OiAgICAgICAgICAgICAgNDgga0IKKy8vV3JpdGViYWNrOiAgICAgICAgICAgMCBrQgorLy9NYXBwZWQ6ICAgICAgICAgIDk2NjIwIGtCCisvL1NsYWI6ICAgICAgICAgICAyMDA2Njgga0IgLSB0YWtlcyA3IE1iIG9uIG15IGJveCBmcmVzaCBhZnRlciBib290LAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IGluY2x1ZGVzIGRlbnRyaWVzIGFuZCBpbm9kZXMKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICg9PSBjYW4gdGFrZSBhcmJpdHJhcnkgYW1vdW50IG9mIG1lbSkKKy8vQ29tbWl0TGltaXQ6ICAgIDUxNzcwNCBrQgorLy9Db21taXR0ZWRfQVM6ICAgMjM2Nzc2IGtCCisvL1BhZ2VUYWJsZXM6ICAgICAgIDEyNDgga0IKKy8vVm1hbGxvY1RvdGFsOiAgIDUxNjA1MiBrQgorLy9WbWFsbG9jVXNlZDogICAgICAzODUyIGtCCisvL1ZtYWxsb2NDaHVuazogICA1MTIwOTYga0IKKy8vSHVnZVBhZ2VzX1RvdGFsOiAgICAgMAorLy9IdWdlUGFnZXNfRnJlZTogICAgICAwCisvL0h1Z2VwYWdlc2l6ZTogICAgIDQwOTYga0IKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjb2xsZWN0X21lbShtZW1fc3RhdCAqcykKK3sKKwl1bGxvbmcgbV90b3RhbCA9IDA7CisJdWxsb25nIG1fZnJlZSA9IDA7CisJdWxsb25nIG1fYnVmcyA9IDA7CisJdWxsb25nIG1fY2FjaGVkID0gMDsKKwl1bGxvbmcgbV9zbGFiID0gMDsKKworCWlmIChyZHZhbChnZXRfZmlsZSgmcHJvY19tZW1pbmZvKSwgIk1lbVRvdGFsOiIsICZtX3RvdGFsLCAxKSkgeworCQlwdXRfcXVlc3Rpb25fbWFya3MoNCk7CisJCXJldHVybjsKKwl9CisJaWYgKHMtPm9wdCA9PSAndCcpIHsKKwkJc2NhbGUobV90b3RhbCA8PCAxMCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAocmR2YWwocHJvY19tZW1pbmZvLmZpbGUsICJNZW1GcmVlOiIsICZtX2ZyZWUgICwgMSkKKwkgfHwgcmR2YWwocHJvY19tZW1pbmZvLmZpbGUsICJCdWZmZXJzOiIsICZtX2J1ZnMgICwgMSkKKwkgfHwgcmR2YWwocHJvY19tZW1pbmZvLmZpbGUsICJDYWNoZWQ6IiwgICZtX2NhY2hlZCwgMSkKKwkgfHwgcmR2YWwocHJvY19tZW1pbmZvLmZpbGUsICJTbGFiOiIsICAgICZtX3NsYWIgICwgMSkKKwkpIHsKKwkJcHV0X3F1ZXN0aW9uX21hcmtzKDQpOworCQlyZXR1cm47CisJfQorCisJbV9mcmVlICs9IG1fYnVmcyArIG1fY2FjaGVkICsgbV9zbGFiOworCXN3aXRjaCAocy0+b3B0KSB7CisJY2FzZSAnZic6CisJCXNjYWxlKG1fZnJlZSA8PCAxMCk7IGJyZWFrOworCWRlZmF1bHQ6CisJCXNjYWxlKChtX3RvdGFsIC0gbV9mcmVlKSA8PCAxMCk7IGJyZWFrOworCX0KK30KKworc3RhdGljIHNfc3RhdCogaW5pdF9tZW0oY29uc3QgY2hhciAqcGFyYW0pCit7CisJbWVtX3N0YXQgKnMgPSB4emFsbG9jKHNpemVvZigqcykpOworCXMtPmNvbGxlY3QgPSBjb2xsZWN0X21lbTsKKwlzLT5vcHQgPSBwYXJhbVswXTsKKwlyZXR1cm4gKHNfc3RhdCopczsKK30KKworCitTX1NUQVQoc3dwX3N0YXQpCitTX1NUQVRfRU5EKHN3cF9zdGF0KQorCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY29sbGVjdF9zd3Aoc3dwX3N0YXQgKnMgVU5VU0VEX1BBUkFNKQoreworCXVsbG9uZyBzX3RvdGFsWzFdOworCXVsbG9uZyBzX2ZyZWVbMV07CisJaWYgKHJkdmFsKGdldF9maWxlKCZwcm9jX21lbWluZm8pLCAiU3dhcFRvdGFsOiIsIHNfdG90YWwsIDEpCisJIHx8IHJkdmFsKHByb2NfbWVtaW5mby5maWxlLCAgICAgICAiU3dhcEZyZWU6IiAsIHNfZnJlZSwgIDEpCisJKSB7CisJCXB1dF9xdWVzdGlvbl9tYXJrcyg0KTsKKwkJcmV0dXJuOworCX0KKwlzY2FsZSgoc190b3RhbFswXS1zX2ZyZWVbMF0pIDw8IDEwKTsKK30KKworc3RhdGljIHNfc3RhdCogaW5pdF9zd3AoY29uc3QgY2hhciAqcGFyYW0gVU5VU0VEX1BBUkFNKQoreworCXN3cF9zdGF0ICpzID0geHphbGxvYyhzaXplb2YoKnMpKTsKKwlzLT5jb2xsZWN0ID0gY29sbGVjdF9zd3A7CisJcmV0dXJuIChzX3N0YXQqKXM7Cit9CisKKworU19TVEFUKGZkX3N0YXQpCitTX1NUQVRfRU5EKGZkX3N0YXQpCisKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBjb2xsZWN0X2ZkKGZkX3N0YXQgKnMgVU5VU0VEX1BBUkFNKQoreworCXVsbG9uZyBkYXRhWzJdOworCisJaWYgKHJkdmFsKGdldF9maWxlKCZwcm9jX3N5c19mc19maWxlbnIpLCAiIiwgZGF0YSwgMSwgMikpIHsKKwkJcHV0X3F1ZXN0aW9uX21hcmtzKDQpOworCQlyZXR1cm47CisJfQorCisJc2NhbGUoZGF0YVswXSAtIGRhdGFbMV0pOworfQorCitzdGF0aWMgc19zdGF0KiBpbml0X2ZkKGNvbnN0IGNoYXIgKnBhcmFtIFVOVVNFRF9QQVJBTSkKK3sKKwlmZF9zdGF0ICpzID0geHphbGxvYyhzaXplb2YoKnMpKTsKKwlzLT5jb2xsZWN0ID0gY29sbGVjdF9mZDsKKwlyZXR1cm4gKHNfc3RhdCopczsKK30KKworCitTX1NUQVQodGltZV9zdGF0KQorCWludCBwcmVjOworCWludCBzY2FsZTsKK1NfU1RBVF9FTkQodGltZV9zdGF0KQorCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY29sbGVjdF90aW1lKHRpbWVfc3RhdCAqcykKK3sKKwljaGFyIGJ1ZltzaXplb2YoIjEyOjM0OjU2LjEyMzQ1NiIpXTsKKwlzdHJ1Y3QgdG0qIHRtOworCWludCB1cyA9IHR2LnR2X3VzZWMgKyBzLT5zY2FsZS8yOworCXRpbWVfdCB0ID0gdHYudHZfc2VjOworCisJaWYgKHVzID49IDEwMDAwMDApIHsKKwkJdCsrOworCQl1cyAtPSAxMDAwMDAwOworCX0KKwl0bSA9IGxvY2FsdGltZSgmdCk7CisKKwlzcHJpbnRmKGJ1ZiwgIiUwMmQ6JTAyZDolMDJkIiwgdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOworCWlmIChzLT5wcmVjKQorCQlzcHJpbnRmKGJ1Zis4LCAiLiUwKmQiLCBzLT5wcmVjLCB1cyAvIHMtPnNjYWxlKTsKKwlwdXQoYnVmKTsKK30KKworc3RhdGljIHNfc3RhdCogaW5pdF90aW1lKGNvbnN0IGNoYXIgKnBhcmFtKQoreworCWludCBwcmVjOworCXRpbWVfc3RhdCAqcyA9IHh6YWxsb2Moc2l6ZW9mKCpzKSk7CisKKwlzLT5jb2xsZWN0ID0gY29sbGVjdF90aW1lOworCXByZWMgPSBwYXJhbVswXSAtICcwJzsKKwlpZiAocHJlYyA8IDApIHByZWMgPSAwOworCWVsc2UgaWYgKHByZWMgPiA2KSBwcmVjID0gNjsKKwlzLT5wcmVjID0gcHJlYzsKKwlzLT5zY2FsZSA9IDE7CisJd2hpbGUgKHByZWMrKyA8IDYpCisJCXMtPnNjYWxlICo9IDEwOworCXJldHVybiAoc19zdGF0KilzOworfQorCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgY29sbGVjdF9pbmZvKHNfc3RhdCAqcykKK3sKKwlnZW4gXj0gMTsKKwl3aGlsZSAocykgeworCQlwdXQocy0+bGFiZWwpOworCQlzLT5jb2xsZWN0KHMpOworCQlzID0gcy0+bmV4dDsKKwl9Cit9CisKKwordHlwZWRlZiBzX3N0YXQqIGluaXRfZnVuYyhjb25zdCBjaGFyICpwYXJhbSk7CisKKy8vIERlcHJlY2F0ZWQgJU5OTmQgaXMgdG8gYmUgcmVtb3ZlZCwgLWQgTVNFQyBzdXBlcnNlZGVzIGl0CitzdGF0aWMgY29uc3QgY2hhciBvcHRpb25zW10gQUxJR04xID0gIm5jbXNmaXhwdGJkciI7CitzdGF0aWMgaW5pdF9mdW5jICpjb25zdCBpbml0X2Z1bmN0aW9uc1tdID0geworCWluaXRfaWYsCisJaW5pdF9jcHUsCisJaW5pdF9tZW0sCisJaW5pdF9zd3AsCisJaW5pdF9mZCwKKwlpbml0X2ludCwKKwlpbml0X2N0eCwKKwlpbml0X2ZvcmssCisJaW5pdF90aW1lLAorCWluaXRfYmxrLAorCWluaXRfZGVsYXksCisJaW5pdF9jcgorfTsKKworaW50IG5tZXRlcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbm1ldGVyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyIGJ1ZlszMl07CisJc19zdGF0ICpmaXJzdCA9IE5VTEw7CisJc19zdGF0ICpsYXN0ID0gTlVMTDsKKwlzX3N0YXQgKnM7CisJY2hhciAqb3B0X2Q7CisJY2hhciAqY3VyLCAqcHJldjsKKworCUlOSVRfRygpOworCisJeGNoZGlyKCIvcHJvYyIpOworCisJaWYgKG9wZW5fcmVhZF9jbG9zZSgidmVyc2lvbiIsIGJ1Ziwgc2l6ZW9mKGJ1ZiktMSkgPiAwKSB7CisJCWJ1ZltzaXplb2YoYnVmKS0xXSA9ICdcMCc7CisJCWlzMjYgPSAoc3Ryc3RyKGJ1ZiwgIiAyLjQuIikgPT0gTlVMTCk7CisJfQorCisJaWYgKGdldG9wdDMyKGFyZ3YsICJkOiIsICZvcHRfZCkpCisJCWluaXRfZGVsYXkob3B0X2QpOworCWFyZ3YgKz0gb3B0aW5kOworCisJaWYgKCFhcmd2WzBdKQorCQliYl9zaG93X3VzYWdlKCk7CisKKwkvLyBDYW4gdXNlIGFyZ3ZbMF0gZGlyZWN0bHksIGJ1dCB0aGlzIHdpbGwgbWVzcyB1cAorCS8vIHBhcmFtZXRlcnMgYXMgc2VlbiBieSBlLmcuIHBzLiBNYWtpbmcgYSBjb3B5Li4uCisJY3VyID0geHN0cmR1cChhcmd2WzBdKTsKKwl3aGlsZSAoMSkgeworCQljaGFyICpwYXJhbSwgKnA7CisJCXByZXYgPSBjdXI7CisgYWdhaW46CisJCWN1ciA9IHN0cmNocihjdXIsICclJyk7CisJCWlmICghY3VyKQorCQkJYnJlYWs7CisJCWlmIChjdXJbMV0gPT0gJyUnKSB7CS8vICUlCisJCQlvdmVybGFwcGluZ19zdHJjcHkoY3VyLCBjdXIgKyAxKTsKKwkJCWN1cisrOworCQkJZ290byBhZ2FpbjsKKwkJfQorCQkqY3VyKysgPSAnXDAnOwkJLy8gb3ZlcndyaXRlICUKKwkJaWYgKGN1clswXSA9PSAnWycpIHsKKwkJCS8vIGZvcm1hdDogJVtmb3B0c3RyaW5nXQorCQkJY3VyKys7CisJCQlwID0gc3RyY2hyKG9wdGlvbnMsIGN1clswXSk7CisJCQlwYXJhbSA9IGN1cisxOworCQkJd2hpbGUgKGN1clswXSAhPSAnXScpIHsKKwkJCQlpZiAoIWN1clswXSkKKwkJCQkJYmJfc2hvd191c2FnZSgpOworCQkJCWN1cisrOworCQkJfQorCQkJKmN1cisrID0gJ1wwJzsJLy8gb3ZlcndyaXRlIFsKKwkJfSBlbHNlIHsKKwkJCS8vIGZvcm1hdDogJU5OTk5OTmYKKwkJCXBhcmFtID0gY3VyOworCQkJd2hpbGUgKGN1clswXSA+PSAnMCcgJiYgY3VyWzBdIDw9ICc5JykKKwkJCQljdXIrKzsKKwkJCWlmICghY3VyWzBdKQorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCXAgPSBzdHJjaHIob3B0aW9ucywgY3VyWzBdKTsKKwkJCSpjdXIrKyA9ICdcMCc7CS8vIG92ZXJ3cml0ZSBmb3JtYXQgY2hhcgorCQl9CisJCWlmICghcCkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJcyA9IGluaXRfZnVuY3Rpb25zW3Atb3B0aW9uc10ocGFyYW0pOworCQlpZiAocykgeworCQkJcy0+bGFiZWwgPSBwcmV2OworCQkJLypzLT5uZXh0ID0gTlVMTDsgLSBhbGwgaW5pdFhYWCBmdW5jcyB1c2UgeHphbGxvYyAqLworCQkJaWYgKCFmaXJzdCkKKwkJCQlmaXJzdCA9IHM7CisJCQllbHNlCisJCQkJbGFzdC0+bmV4dCA9IHM7CisJCQlsYXN0ID0gczsKKwkJfSBlbHNlIHsKKwkJCS8vICVOTk5OZCBvciAlciBvcHRpb24uIHJlbW92ZSBpdCBmcm9tIHN0cmluZworCQkJc3RyY3B5KHByZXYgKyBzdHJsZW4ocHJldiksIGN1cik7CisJCQljdXIgPSBwcmV2OworCQl9CisJfQorCWlmIChwcmV2WzBdKSB7CisJCXMgPSBpbml0X2xpdGVyYWwoKTsKKwkJcy0+bGFiZWwgPSBwcmV2OworCQkvKnMtPm5leHQgPSBOVUxMOyAtIGFsbCBpbml0WFhYIGZ1bmNzIHVzZSB4emFsbG9jICovCisJCWlmICghZmlyc3QpCisJCQlmaXJzdCA9IHM7CisJCWVsc2UKKwkJCWxhc3QtPm5leHQgPSBzOworCQlsYXN0ID0gczsKKwl9CisKKwkvLyBHZW5lcmF0ZSBmaXJzdCBzYW1wbGVzIGJ1dCBkbyBub3QgcHJpbnQgdGhlbSwgdGhleSdyZSBib2d1cworCWNvbGxlY3RfaW5mbyhmaXJzdCk7CisJcmVzZXRfb3V0YnVmKCk7CisJaWYgKGRlbHRhID49IDApIHsKKwkJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJCXVzbGVlcChkZWx0YSA+IDEwMDAwMDAgPyAxMDAwMDAwIDogZGVsdGEgLSB0di50dl91c2VjJWRlbHRhbnopOworCX0KKworCXdoaWxlICgxKSB7CisJCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCQljb2xsZWN0X2luZm8oZmlyc3QpOworCQlwdXQoZmluYWxfc3RyKTsKKwkJcHJpbnRfb3V0YnVmKCk7CisKKwkJLy8gTmVnYXRpdmUgZGVsdGEgLT4gbm8gdXNsZWVwIGF0IGFsbAorCQkvLyBUaGlzIHdpbGwgaG9nIHRoZSBDUFUgYnV0IHlvdSBjYW4gaGF2ZSBSRUFMTFkgR09PRAorCQkvLyB0aW1lIHJlc29sdXRpb24gOykKKwkJLy8gVE9ETzogZGV0ZWN0IGFuZCBhdm9pZCB1c2VsZXNzIHVwZGF0ZXMKKwkJLy8gKGxpa2U6IG5vdGhpbmcgaGFwcGVucyBleGNlcHQgdGltZSkKKwkJaWYgKGRlbHRhID49IDApIHsKKwkJCWludCByZW07CisJCQkvLyBjYW4gYmUgY29tbWVudGVkIG91dCwgd2lsbCBzYWNyaWZpY2Ugc2xlZXAgdGltZSBwcmVjaXNpb24gYSBiaXQKKwkJCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCQkJaWYgKG5lZWRfc2Vjb25kcykKKwkJCQlyZW0gPSBkZWx0YSAtICgodWxsb25nKXR2LnR2X3NlYyoxMDAwMDAwICsgdHYudHZfdXNlYykgJSBkZWx0YW56OworCQkJZWxzZQorCQkJCXJlbSA9IGRlbHRhIC0gdHYudHZfdXNlYyVkZWx0YW56OworCQkJLy8gU29tZXRpbWVzIGtlcm5lbCB3YWtlcyB1cyB1cCBqdXN0IGEgdGlueSBiaXQgZWFybGllciB0aGFuIGFza2VkCisJCQkvLyBEbyBub3QgZ28gdG8gdmVyeSBzaG9ydCBzbGVlcCBpbiB0aGlzIGNhc2UKKwkJCWlmIChyZW0gPCBkZWx0YS8xMjgpIHsKKwkJCQlyZW0gKz0gZGVsdGE7CisJCQl9CisJCQl1c2xlZXAocmVtKTsKKwkJfQorCX0KKworCS8qcmV0dXJuIDA7Ki8KK30KZGlmZiAtLWdpdCBhL3Byb2Nwcy9wZ3JlcC5jIGIvcHJvY3BzL3BncmVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM3YzdjNAotLS0gL2Rldi9udWxsCisrKyBiL3Byb2Nwcy9wZ3JlcC5jCkBAIC0wLDAgKzEsMTgyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHBncmVwL3BraWxsIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA3IExvaWMgR3JlbmllIDxsb2ljLmdyZW5pZUBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgcGdyZXBfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZmxub3Z4XSBbLXMgU0lEfC1QIFBQSUR8UEFUVEVSTl0iCisvL3VzYWdlOiNkZWZpbmUgcGdyZXBfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEaXNwbGF5IHByb2Nlc3MoZXMpIHNlbGVjdGVkIGJ5IHJlZ2V4IFBBVFRFUk5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJU2hvdyBjb21tYW5kIG5hbWUgdG9vIgorLy91c2FnZTogICAgICJcbgktZglNYXRjaCBhZ2FpbnN0IGVudGlyZSBjb21tYW5kIGxpbmUiCisvL3VzYWdlOiAgICAgIlxuCS1uCVNob3cgdGhlIG5ld2VzdCBwcm9jZXNzIG9ubHkiCisvL3VzYWdlOiAgICAgIlxuCS1vCVNob3cgdGhlIG9sZGVzdCBwcm9jZXNzIG9ubHkiCisvL3VzYWdlOiAgICAgIlxuCS12CU5lZ2F0ZSB0aGUgbWF0Y2giCisvL3VzYWdlOiAgICAgIlxuCS14CU1hdGNoIHdob2xlIG5hbWUgKG5vdCBzdWJzdHJpbmcpIgorLy91c2FnZTogICAgICJcbgktcwlNYXRjaCBzZXNzaW9uIElEICgwIGZvciBjdXJyZW50KSIKKy8vdXNhZ2U6ICAgICAiXG4JLVAJTWF0Y2ggcGFyZW50IHByb2Nlc3MgSUQiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHBraWxsX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWx8LVNJR05BTF0gWy1mbm92eF0gWy1zIFNJRHwtUCBQUElEfFBBVFRFUk5dIgorLy91c2FnZTojZGVmaW5lIHBraWxsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2VuZCBhIHNpZ25hbCB0byBwcm9jZXNzKGVzKSBzZWxlY3RlZCBieSByZWdleCBQQVRURVJOXG4iCisvL3VzYWdlOiAgICAgIlxuCS1sCUxpc3QgYWxsIHNpZ25hbHMiCisvL3VzYWdlOiAgICAgIlxuCS1mCU1hdGNoIGFnYWluc3QgZW50aXJlIGNvbW1hbmQgbGluZSIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JU2lnbmFsIHRoZSBuZXdlc3QgcHJvY2VzcyBvbmx5IgorLy91c2FnZTogICAgICJcbgktbwlTaWduYWwgdGhlIG9sZGVzdCBwcm9jZXNzIG9ubHkiCisvL3VzYWdlOiAgICAgIlxuCS12CU5lZ2F0ZSB0aGUgbWF0Y2giCisvL3VzYWdlOiAgICAgIlxuCS14CU1hdGNoIHdob2xlIG5hbWUgKG5vdCBzdWJzdHJpbmcpIgorLy91c2FnZTogICAgICJcbgktcwlNYXRjaCBzZXNzaW9uIElEICgwIGZvciBjdXJyZW50KSIKKy8vdXNhZ2U6ICAgICAiXG4JLVAJTWF0Y2ggcGFyZW50IHByb2Nlc3MgSUQiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInhyZWdleC5oIgorCisvKiBJZGVhIHRha2VuIGZyb20ga2lsbC5jICovCisjZGVmaW5lIHBncmVwIChFTkFCTEVfUEdSRVAgJiYgYXBwbGV0X25hbWVbMV0gPT0gJ2cnKQorI2RlZmluZSBwa2lsbCAoRU5BQkxFX1BLSUxMICYmIGFwcGxldF9uYW1lWzFdID09ICdrJykKKworZW51bSB7CisJLyogInZsZnhvbnM6UDoiICovCisJT1BUQklUX1YgPSAwLCAvKiBtdXN0IGJlIGZpcnN0LCB3ZSBuZWVkIE9QVF9JTlZFUlQgPSAwLzEgKi8KKwlPUFRCSVRfTCwKKwlPUFRCSVRfRiwKKwlPUFRCSVRfWCwKKwlPUFRCSVRfTywKKwlPUFRCSVRfTiwKKwlPUFRCSVRfUywKKwlPUFRCSVRfUCwKK307CisKKyNkZWZpbmUgT1BUX0lOVkVSVAkob3B0ICYgKDEgPDwgT1BUQklUX1YpKQorI2RlZmluZSBPUFRfTElTVAkob3B0ICYgKDEgPDwgT1BUQklUX0wpKQorI2RlZmluZSBPUFRfRlVMTAkob3B0ICYgKDEgPDwgT1BUQklUX0YpKQorI2RlZmluZSBPUFRfQU5DSE9SCShvcHQgJiAoMSA8PCBPUFRCSVRfWCkpCisjZGVmaW5lIE9QVF9GSVJTVAkob3B0ICYgKDEgPDwgT1BUQklUX08pKQorI2RlZmluZSBPUFRfTEFTVAkob3B0ICYgKDEgPDwgT1BUQklUX04pKQorI2RlZmluZSBPUFRfU0lECQkob3B0ICYgKDEgPDwgT1BUQklUX1MpKQorI2RlZmluZSBPUFRfUFBJRAkob3B0ICYgKDEgPDwgT1BUQklUX1ApKQorCitzdGF0aWMgdm9pZCBhY3QodW5zaWduZWQgcGlkLCBjaGFyICpjbWQsIGludCBzaWdubykKK3sKKwlpZiAocGdyZXApIHsKKwkJaWYgKG9wdGlvbl9tYXNrMzIgJiAoMSA8PCBPUFRCSVRfTCkpIC8qIE9QVF9MSVNUICovCisJCQlwcmludGYoIiV1ICVzXG4iLCBwaWQsIGNtZCk7CisJCWVsc2UKKwkJCXByaW50ZigiJXVcbiIsIHBpZCk7CisJfSBlbHNlCisJCWtpbGwocGlkLCBzaWdubyk7Cit9CisKK2ludCBwZ3JlcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcGdyZXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIHBpZDsKKwlpbnQgc2lnbm87CisJdW5zaWduZWQgb3B0OworCWludCBzY2FuX21hc2s7CisJaW50IG1hdGNoZWRfcGlkOworCWludCBzaWQybWF0Y2gsIHBwaWQybWF0Y2g7CisJY2hhciAqY21kX2xhc3Q7CisJcHJvY3BzX3N0YXR1c190ICpwcm9jOworCS8qIFRoZXNlIGFyZSBpbml0aWFsaXplZCB0byAwICovCisJc3RydWN0IHsKKwkJcmVnZXhfdCByZV9idWZmZXI7CisJCXJlZ21hdGNoX3QgcmVfbWF0Y2hbMV07CisJfSBaOworI2RlZmluZSByZV9idWZmZXIgKFoucmVfYnVmZmVyKQorI2RlZmluZSByZV9tYXRjaCAgKFoucmVfbWF0Y2ggKQorCisJbWVtc2V0KCZaLCAwLCBzaXplb2YoWikpOworCisJLyogUGFyc2UgLVNJR05BTCBmb3IgcGtpbGwuIE11c3QgYmUgZmlyc3Qgb3B0aW9uLCBpZiBwcmVzZW50ICovCisJc2lnbm8gPSBTSUdURVJNOworCWlmIChwa2lsbCAmJiBhcmd2WzFdICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CisJCWludCB0ZW1wID0gZ2V0X3NpZ251bShhcmd2WzFdKzEpOworCQlpZiAodGVtcCAhPSAtMSkgeworCQkJc2lnbm8gPSB0ZW1wOworCQkJYXJndisrOworCQl9CisJfQorCisJLyogUGFyc2UgcmVtYWluaW5nIG9wdGlvbnMgKi8KKwlwcGlkMm1hdGNoID0gLTE7CisJc2lkMm1hdGNoID0gLTE7CisJb3B0X2NvbXBsZW1lbnRhcnkgPSAicys6UCsiOyAvKiBudW1lcmljIG9wdHMgKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAidmxmeG9uczpQOiIsICZzaWQybWF0Y2gsICZwcGlkMm1hdGNoKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChwa2lsbCAmJiBPUFRfTElTVCkgeyAvKiAtbDogcHJpbnQgdGhlIHdob2xlIHNpZ25hbCBsaXN0ICovCisJCXByaW50X3NpZ25hbWVzKCk7CisJCXJldHVybiAwOworCX0KKworCXBpZCA9IGdldHBpZCgpOworCWlmIChzaWQybWF0Y2ggPT0gMCkKKwkJc2lkMm1hdGNoID0gZ2V0c2lkKHBpZCk7CisKKwlzY2FuX21hc2sgPSBQU1NDQU5fQ09NTSB8IFBTU0NBTl9BUkdWMDsKKwlpZiAoT1BUX0ZVTEwpCisJCXNjYW5fbWFzayB8PSBQU1NDQU5fQVJHVk47CisKKwkvKiBPbmUgcGF0dGVybiBpcyByZXF1aXJlZCwgaWYgbm8gLXMgYW5kIG5vIC1QICovCisJaWYgKChzaWQybWF0Y2ggJiBwcGlkMm1hdGNoKSA8IDAgJiYgKCFhcmd2WzBdIHx8IGFyZ3ZbMV0pKQorCQliYl9zaG93X3VzYWdlKCk7CisKKwlpZiAoYXJndlswXSkKKwkJeHJlZ2NvbXAoJnJlX2J1ZmZlciwgYXJndlswXSwgT1BUX0FOQ0hPUiA/IFJFR19FWFRFTkRFRCA6IChSRUdfRVhURU5ERUR8UkVHX05PU1VCKSk7CisKKwltYXRjaGVkX3BpZCA9IDA7CisJY21kX2xhc3QgPSBOVUxMOworCXByb2MgPSBOVUxMOworCXdoaWxlICgocHJvYyA9IHByb2Nwc19zY2FuKHByb2MsIHNjYW5fbWFzaykpICE9IE5VTEwpIHsKKwkJY2hhciAqY21kOworCisJCWlmIChwcm9jLT5waWQgPT0gcGlkKQorCQkJY29udGludWU7CisKKwkJY21kID0gcHJvYy0+YXJndjA7CisJCWlmICghY21kKSB7CisJCQljbWQgPSBwcm9jLT5jb21tOworCQl9IGVsc2UgeworCQkJaW50IGkgPSBwcm9jLT5hcmd2X2xlbjsKKwkJCXdoaWxlICgtLWkgPj0gMCkgeworCQkJCWlmICgodW5zaWduZWQgY2hhciljbWRbaV0gPCAnICcpCisJCQkJCWNtZFtpXSA9ICcgJzsKKwkJCX0KKwkJfQorCisJCWlmIChwcGlkMm1hdGNoID49IDAgJiYgcHBpZDJtYXRjaCAhPSBwcm9jLT5wcGlkKQorCQkJY29udGludWU7CisJCWlmIChzaWQybWF0Y2ggPj0gMCAgJiYgc2lkMm1hdGNoICE9IHByb2MtPnNpZCkKKwkJCWNvbnRpbnVlOworCisJCS8qIE5COiBPUFRfSU5WRVJUIGlzIGFsd2F5cyAwIG9yIDEgKi8KKwkJaWYgKCFhcmd2WzBdCisJCSB8fCAocmVnZXhlYygmcmVfYnVmZmVyLCBjbWQsIDEsIHJlX21hdGNoLCAwKSA9PSAwIC8qIG1hdGNoIGZvdW5kICovCisJCSAgICAmJiAoIU9QVF9BTkNIT1IgfHwgKHJlX21hdGNoWzBdLnJtX3NvID09IDAgJiYgcmVfbWF0Y2hbMF0ucm1fZW8gPT0gKHJlZ29mZl90KXN0cmxlbihjbWQpKSkKKwkJICAgICkgXiBPUFRfSU5WRVJUCisJCSkgeworCQkJbWF0Y2hlZF9waWQgPSBwcm9jLT5waWQ7CisJCQlpZiAoT1BUX0xBU1QpIHsKKwkJCQlmcmVlKGNtZF9sYXN0KTsKKwkJCQljbWRfbGFzdCA9IHhzdHJkdXAoY21kKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWFjdChwcm9jLT5waWQsIGNtZCwgc2lnbm8pOworCQkJaWYgKE9QVF9GSVJTVCkKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChjbWRfbGFzdCkgeworCQlhY3QobWF0Y2hlZF9waWQsIGNtZF9sYXN0LCBzaWdubyk7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZyZWUoY21kX2xhc3QpOworCX0KKwlyZXR1cm4gbWF0Y2hlZF9waWQgPT0gMDsgLyogcmV0dXJuIDEgaWYgbm8gcHJvY2Vzc2VzIGxpc3RlZC9zaWduYWxlZCAqLworfQpkaWZmIC0tZ2l0IGEvcHJvY3BzL3BpZG9mLmMgYi9wcm9jcHMvcGlkb2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDdiNTkxCi0tLSAvZGV2L251bGwKKysrIGIvcHJvY3BzL3BpZG9mLmMKQEAgLTAsMCArMSwxMTQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHBpZG9mIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojaWYgKEVOQUJMRV9GRUFUVVJFX1BJRE9GX1NJTkdMRSB8fCBFTkFCTEVfRkVBVFVSRV9QSURPRl9PTUlUKQorLy91c2FnZTojZGVmaW5lIHBpZG9mX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gW05BTUVdLi4uIgorLy91c2FnZTojZGVmaW5lIFVTQUdFX1BJRE9GICJcbiIKKy8vdXNhZ2U6I2Vsc2UKKy8vdXNhZ2U6I2RlZmluZSBwaWRvZl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW05BTUVdLi4uIgorLy91c2FnZTojZGVmaW5lIFVTQUdFX1BJRE9GIC8qIG5vbmUgKi8KKy8vdXNhZ2U6I2VuZGlmCisvL3VzYWdlOiNkZWZpbmUgcGlkb2ZfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJMaXN0IFBJRHMgb2YgYWxsIHByb2Nlc3NlcyB3aXRoIG5hbWVzIHRoYXQgbWF0Y2ggTkFNRXMiCisvL3VzYWdlOglVU0FHRV9QSURPRgorLy91c2FnZToJSUZfRkVBVFVSRV9QSURPRl9TSU5HTEUoCisvL3VzYWdlOiAgICAgIlxuCS1zCVNob3cgb25seSBvbmUgUElEIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9QSURPRl9PTUlUKAorLy91c2FnZTogICAgICJcbgktbyBQSUQJT21pdCBnaXZlbiBwaWQiCisvL3VzYWdlOiAgICAgIlxuCQlVc2UgJVBQSUQgdG8gb21pdCBwaWQgb2YgcGlkb2YncyBwYXJlbnQiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHBpZG9mX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHBpZG9mIGluaXRcbiIKKy8vdXNhZ2U6ICAgICAgICIxXG4iCisvL3VzYWdlOglJRl9GRUFUVVJFX1BJRE9GX09NSVQoCisvL3VzYWdlOiAgICAgICAiJCBwaWRvZiAvYmluL3NoXG4yMDM1MSA1OTczIDU5NTBcbiIpCisvL3VzYWdlOglJRl9GRUFUVVJFX1BJRE9GX09NSVQoCisvL3VzYWdlOiAgICAgICAiJCBwaWRvZiAvYmluL3NoIC1vICVQUElEXG4yMDM1MSA1OTUwIikKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2VudW0geworCUlGX0ZFQVRVUkVfUElET0ZfU0lOR0xFKE9QVEJJVF9TSU5HTEUsKQorCUlGX0ZFQVRVUkVfUElET0ZfT01JVCggIE9QVEJJVF9PTUlUICAsKQorCU9QVF9TSU5HTEUgPSBJRl9GRUFUVVJFX1BJRE9GX1NJTkdMRSgoMTw8T1BUQklUX1NJTkdMRSkpICsgMCwKKwlPUFRfT01JVCAgID0gSUZfRkVBVFVSRV9QSURPRl9PTUlUKCAgKDE8PE9QVEJJVF9PTUlUICApKSArIDAsCit9OworCitpbnQgcGlkb2ZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHBpZG9mX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBmaXJzdCA9IDE7CisJdW5zaWduZWQgb3B0OworI2lmIEVOQUJMRV9GRUFUVVJFX1BJRE9GX09NSVQKKwlsbGlzdF90ICpvbWl0cyA9IE5VTEw7IC8qIGxpc3Qgb2YgcGlkcyB0byBvbWl0ICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAibzo6IjsKKyNlbmRpZgorCisJLyogZG8gdW5jb25kaXRpb25hbCBvcHRpb24gcGFyc2luZyAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICIiCisJCQlJRl9GRUFUVVJFX1BJRE9GX1NJTkdMRSAoInMiKQorCQkJSUZfRkVBVFVSRV9QSURPRl9PTUlUKCJvOiIsICZvbWl0cykpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfUElET0ZfT01JVAorCS8qIGZpbGwgb21pdCBsaXN0LiAgKi8KKwl7CisJCWxsaXN0X3QgKm9taXRzX3AgPSBvbWl0czsKKwkJd2hpbGUgKDEpIHsKKwkJCW9taXRzX3AgPSBsbGlzdF9maW5kX3N0cihvbWl0c19wLCAiJVBQSUQiKTsKKwkJCWlmICghb21pdHNfcCkKKwkJCQlicmVhazsKKwkJCS8qIGFyZSB3ZSBhc2tlZCB0byBleGNsdWRlIHRoZSBwYXJlbnQncyBwcm9jZXNzIElEPyAgKi8KKwkJCW9taXRzX3AtPmRhdGEgPSB1dG9hKCh1bnNpZ25lZClnZXRwcGlkKCkpOworCQl9CisJfQorI2VuZGlmCisJLyogTG9va3MgbGlrZSBldmVyeXRoaW5nIGlzIHNldCB0byBnby4gICovCisJYXJndiArPSBvcHRpbmQ7CisJd2hpbGUgKCphcmd2KSB7CisJCXBpZF90ICpwaWRMaXN0OworCQlwaWRfdCAqcGw7CisKKwkJLyogcmV2ZXJzZSB0aGUgcGlkbGlzdCBsaWtlIEdOVSBwaWRvZiBkb2VzLiAgKi8KKwkJcGlkTGlzdCA9IHBpZGxpc3RfcmV2ZXJzZShmaW5kX3BpZF9ieV9uYW1lKCphcmd2KSk7CisJCWZvciAocGwgPSBwaWRMaXN0OyAqcGw7IHBsKyspIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9QSURPRl9PTUlUCisJCQlpZiAob3B0ICYgT1BUX09NSVQpIHsKKwkJCQlsbGlzdF90ICpvbWl0c19wID0gb21pdHM7CisJCQkJd2hpbGUgKG9taXRzX3ApIHsKKwkJCQkJaWYgKHhhdG91bChvbWl0c19wLT5kYXRhKSA9PSAodW5zaWduZWQgbG9uZykoKnBsKSkgeworCQkJCQkJZ290byBvbWl0dGluZzsKKwkJCQkJfQorCQkJCQlvbWl0c19wID0gb21pdHNfcC0+bGluazsKKwkJCQl9CisJCQl9CisjZW5kaWYKKwkJCXByaW50ZigiICV1IiArIGZpcnN0LCAodW5zaWduZWQpKnBsKTsKKwkJCWZpcnN0ID0gMDsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9QSURPRl9TSU5HTEUgJiYgKG9wdCAmIE9QVF9TSU5HTEUpKQorCQkJCWJyZWFrOworI2lmIEVOQUJMRV9GRUFUVVJFX1BJRE9GX09NSVQKKyBvbWl0dGluZzogOworI2VuZGlmCisJCX0KKwkJZnJlZShwaWRMaXN0KTsKKwkJYXJndisrOworCX0KKwlpZiAoIWZpcnN0KQorCQliYl9wdXRjaGFyKCdcbicpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfUElET0ZfT01JVAorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJbGxpc3RfZnJlZShvbWl0cywgTlVMTCk7CisjZW5kaWYKKwlyZXR1cm4gZmlyc3Q7IC8qIDEgKGZhaWx1cmUpIC0gbm8gcHJvY2Vzc2VzIGZvdW5kICovCit9CmRpZmYgLS1naXQgYS9wcm9jcHMvcG1hcC5jIGIvcHJvY3BzL3BtYXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDk5NWE1Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvY3BzL3BtYXAuYwpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIHBtYXAgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTm9raWEgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBXcml0dGVuIGJ5IEFsZXhhbmRlciBTaGlzaGtpbiA8dmlydHVvc29Ac2xpbmQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgdGhlIExJQ0VOU0UgZmlsZSBpbiB0aGlzIHNvdXJjZSB0cmVlCisgKiBmb3IgZGV0YWlscy4KKyAqLworCisvL2NvbmZpZzpjb25maWcgUE1BUAorLy9jb25maWc6ICAgICAgIGJvb2wgInBtYXAiCisvL2NvbmZpZzogICAgICAgZGVmYXVsdCB5CisvL2NvbmZpZzogICAgICAgaGVscAorLy9jb25maWc6ICAgICAgICAgRGlzcGxheSBwcm9jZXNzZXMnIG1lbW9yeSBtYXBwaW5ncy4KKworLy9hcHBsZXQ6SUZfUE1BUChBUFBMRVQocG1hcCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisvL2tidWlsZDpsaWItJChDT05GSUdfUE1BUCkgKz0gcG1hcC5vCisKKy8vdXNhZ2U6I2RlZmluZSBwbWFwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXhxXSBQSUQiCisvL3VzYWdlOiNkZWZpbmUgcG1hcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRpc3BsYXkgZGV0YWlsZWQgcHJvY2VzcyBtZW1vcnkgdXNhZ2UiCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbgkteAlTaG93IGRldGFpbHMiCisvL3VzYWdlOiAgICAgIlxuCS1xCVF1aWV0IgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIFVMT05HX01BWCA9PSAweGZmZmZmZmZmCisjIGRlZmluZSBUQUJTICJcdCIKKyMgZGVmaW5lIEFGTVQgIjgiCisjIGRlZmluZSBEQVNIRVMgIiIKKyNlbHNlCisjIGRlZmluZSBUQUJTICJcdFx0IgorIyBkZWZpbmUgQUZNVCAiMTYiCisjIGRlZmluZSBEQVNIRVMgIi0tLS0tLS0tIgorI2VuZGlmCisKK2VudW0geworCU9QVF94ID0gMSA8PCAwLAorCU9QVF9xID0gMSA8PCAxLAorfTsKKworc3RhdGljIHZvaWQgcHJpbnRfc21hcHJlYyhzdHJ1Y3Qgc21hcHJlYyAqY3VycmVjLCB2b2lkICpkYXRhKQoreworCXVuc2lnbmVkIG9wdCA9ICh1aW50cHRyX3QpZGF0YTsKKworCXByaW50ZigiJTAiIEFGTVQgImx4ICIsIGN1cnJlYy0+c21hcF9zdGFydCk7CisKKwlpZiAob3B0ICYgT1BUX3gpCisJCXByaW50ZigiJTdsdSAlN2x1ICU3bHUgJTdsdSAiLAorCQkJY3VycmVjLT5zbWFwX3NpemUsCisJCQljdXJyZWMtPnNtYXBfcHNzLAorCQkJY3VycmVjLT5wcml2YXRlX2RpcnR5LAorCQkJY3VycmVjLT5zbWFwX3N3YXApOworCWVsc2UKKwkJcHJpbnRmKCIlN2x1SyIsIGN1cnJlYy0+c21hcF9zaXplKTsKKworCXByaW50ZigiICUuNHMgICVzXG4iLCBjdXJyZWMtPnNtYXBfbW9kZSwgY3VycmVjLT5zbWFwX25hbWUpOworfQorCitzdGF0aWMgaW50IHByb2Nwc19nZXRfbWFwcyhwaWRfdCBwaWQsIHVuc2lnbmVkIG9wdCkKK3sKKwlzdHJ1Y3Qgc21hcHJlYyB0b3RhbDsKKwlpbnQgcmV0OworCWNoYXIgYnVmWzI1Nl07CisKKwlyZWFkX2NtZGxpbmUoYnVmLCBzaXplb2YoYnVmKSwgcGlkLCAibm8gc3VjaCBwcm9jZXNzIik7CisJcHJpbnRmKCIldTogJXNcbiIsIChpbnQpcGlkLCBidWYpOworCisJaWYgKCEob3B0ICYgT1BUX3EpICYmIChvcHQgJiBPUFRfeCkpCisJCXB1dHMoIkFkZHJlc3MiIFRBQlMgIiAgS2J5dGVzICAgICBQU1MgICBEaXJ0eSAgICBTd2FwICBNb2RlICBNYXBwaW5nIik7CisKKwltZW1zZXQoJnRvdGFsLCAwLCBzaXplb2YodG90YWwpKTsKKworCXJldCA9IHByb2Nwc19yZWFkX3NtYXBzKHBpZCwgJnRvdGFsLCBwcmludF9zbWFwcmVjLCAodm9pZCopKHVpbnRwdHJfdClvcHQpOworCWlmIChyZXQpCisJCXJldHVybiByZXQ7CisKKwlpZiAoIShvcHQgJiBPUFRfcSkpIHsKKwkJaWYgKG9wdCAmIE9QVF94KQorCQkJcHJpbnRmKCItLS0tLS0tLSIgREFTSEVTICIgIC0tLS0tLSAgLS0tLS0tICAtLS0tLS0gIC0tLS0tLVxuIgorCQkJCSJ0b3RhbCIgVEFCUyAiICU3bHUgJTdsdSAlN2x1ICU3bHVcbiIsCisJCQkJdG90YWwuc21hcF9zaXplLCB0b3RhbC5zbWFwX3BzcywgdG90YWwucHJpdmF0ZV9kaXJ0eSwgdG90YWwuc21hcF9zd2FwKTsKKwkJZWxzZQorCQkJcHJpbnRmKCJtYXBwZWQ6ICVsdUtcbiIsIHRvdGFsLnNtYXBfc2l6ZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBwbWFwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwbWFwX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHRzOworCWludCByZXQ7CisKKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgInhxIik7CisJYXJndiArPSBvcHRpbmQ7CisKKwlyZXQgPSAwOworCXdoaWxlICgqYXJndikgeworCQlwaWRfdCBwaWQgPSB4YXRvaV9wb3NpdGl2ZSgqYXJndisrKTsKKwkJLyogR05VIHBtYXAgcmV0dXJucyA0MiBpZiBhbnkgb2YgdGhlIHBpZHMgZmFpbGVkICovCisJCWlmIChwcm9jcHNfZ2V0X21hcHMocGlkLCBvcHRzKSAhPSAwKQorCQkJcmV0ID0gNDI7CisJfQorCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3Byb2Nwcy9wb3dlcnRvcC5jIGIvcHJvY3BzL3Bvd2VydG9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U4NWY0MQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2Nwcy9wb3dlcnRvcC5jCkBAIC0wLDAgKzEsODU2IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBBIG1pbmkgJ3Bvd2VydG9wJyB1dGlsaXR5OgorICogICBBbmFseXplIHBvd2VyIGNvbnN1bXB0aW9uIG9uIEludGVsLWJhc2VkIGxhcHRvcHMuCisgKiBCYXNlZCBvbiBwb3dlcnRvcCAxLjExLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBNYXJlayBQb2xhY2VrIDxtbXBvbGFjZWtAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9hcHBsZXQ6SUZfUE9XRVJUT1AoQVBQTEVUKHBvd2VydG9wLCBCQl9ESVJfVVNSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19QT1dFUlRPUCkgKz0gcG93ZXJ0b3AubworCisvL2NvbmZpZzpjb25maWcgUE9XRVJUT1AKKy8vY29uZmlnOglib29sICJwb3dlcnRvcCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBBbmFseXplIHBvd2VyIGNvbnN1bXB0aW9uIG9uIEludGVsLWJhc2VkIGxhcHRvcHMKKworLy8gWFhYIFRoaXMgc2hvdWxkIGJlIGNvbmZpZ3VyYWJsZQorI2RlZmluZSBFTkFCTEVfRkVBVFVSRV9QT1dFUlRPUF9QUk9DSVJRIDEKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKworLy8jZGVmaW5lIGRlYnVnKGZtdCwgLi4uKSBmcHJpbnRmKHN0ZGVyciwgZm10LCAjIyBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgZGVidWcoZm10LCAuLi4pICgodm9pZCkwKQorCisKKyNkZWZpbmUgQkxPQVRZX0hQRVRfSVJRX05VTV9ERVRFQ1RJT04gMAorI2RlZmluZSBNQVhfQ1NUQVRFX0NPVU5UICAgOAorI2RlZmluZSBJUlFDT1VOVCAgICAgICAgICAgNDAKKworCisjZGVmaW5lIERFRkFVTFRfU0xFRVAgICAgICAxMAorI2RlZmluZSBERUZBVUxUX1NMRUVQX1NUUiAiMTAiCisKKy8qIEZyZXF1ZW5jeSBvZiB0aGUgQUNQSSB0aW1lciAqLworI2RlZmluZSBGUkVRX0FDUEkgICAgICAgICAgMzU3OS41NDUKKyNkZWZpbmUgRlJFUV9BQ1BJXzEwMDAgICAgIDM1Nzk1NDUKKworLyogTWF4IGZpbGVuYW1lIGxlbmd0aCBvZiBlbnRyeSBpbiAvc3lzL2RldmljZXMgc3Vic3lzdGVtICovCisjZGVmaW5lIEJJR19TWVNOQU1FX0xFTiAgICAxNgorCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1bGxvbmc7CisKK3N0cnVjdCBsaW5lIHsKKwljaGFyICpzdHJpbmc7CisJaW50IGNvdW50OworCS8qaW50IGRpc2tfY291bnQ7Ki8KK307CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9QT1dFUlRPUF9QUk9DSVJRCitzdHJ1Y3QgaXJxZGF0YSB7CisJc21hbGxpbnQgYWN0aXZlOworCWludCBudW1iZXI7CisJdWxsb25nIGNvdW50OworCWNoYXIgaXJxX2Rlc2NbMzJdOworfTsKKyNlbmRpZgorCitzdHJ1Y3QgZ2xvYmFscyB7CisJc3RydWN0IGxpbmUgKmxpbmVzOyAvKiB0aGUgbW9zdCBvZnRlbiB1c2VkIG1lbWJlciAqLworCWludCBsaW5lc19jbnQ7CisJaW50IGxpbmVzX2N1bXVsYXRpdmVfY291bnQ7CisJaW50IG1heGNzdGF0ZTsKKwl1bnNpZ25lZCB0b3RhbF9jcHVzOworCXNtYWxsaW50IGNhbnRfZW5hYmxlX3RpbWVyX3N0YXRzOworI2lmIEVOQUJMRV9GRUFUVVJFX1BPV0VSVE9QX1BST0NJUlEKKyMgaWYgQkxPQVRZX0hQRVRfSVJRX05VTV9ERVRFQ1RJT04KKwlzbWFsbGludCBzY2FubmVkX3RpbWVyX2xpc3Q7CisJaW50IHBlcmNwdV9ocGV0X3N0YXJ0OworCWludCBwZXJjcHVfaHBldF9lbmQ7CisjIGVuZGlmCisJaW50IGludGVycnVwdF8wOworCWludCB0b3RhbF9pbnRlcnJ1cHQ7CisJc3RydWN0IGlycWRhdGEgaW50ZXJydXB0c1tJUlFDT1VOVF07CisjZW5kaWYKKwl1bGxvbmcgc3RhcnRfdXNhZ2VbTUFYX0NTVEFURV9DT1VOVF07CisJdWxsb25nIGxhc3RfdXNhZ2VbTUFYX0NTVEFURV9DT1VOVF07CisJdWxsb25nIHN0YXJ0X2R1cmF0aW9uW01BWF9DU1RBVEVfQ09VTlRdOworCXVsbG9uZyBsYXN0X2R1cmF0aW9uW01BWF9DU1RBVEVfQ09VTlRdOworI2lmIEVOQUJMRV9GRUFUVVJFX1VTRV9URVJNSU9TCisJc3RydWN0IHRlcm1pb3MgaW5pdF9zZXR0aW5nczsKKyNlbmRpZgorfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorfSB3aGlsZSAoMCkKKworI2lmIEVOQUJMRV9GRUFUVVJFX1VTRV9URVJNSU9TCitzdGF0aWMgdm9pZCByZXNldF90ZXJtKHZvaWQpCit7CisJdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coJkcuaW5pdF9zZXR0aW5ncyk7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ19oYW5kbGVyKGludCBzaWdubyBVTlVTRURfUEFSQU0pCit7CisJcmVzZXRfdGVybSgpOworCV9leGl0KEVYSVRfRkFJTFVSRSk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCB3cml0ZV9zdHJfdG9fZmlsZShjb25zdCBjaGFyICpmbmFtZSwgY29uc3QgY2hhciAqc3RyKQoreworCUZJTEUgKmZwID0gZm9wZW5fZm9yX3dyaXRlKGZuYW1lKTsKKwlpZiAoIWZwKQorCQlyZXR1cm4gMTsKKwlmcHV0cyhzdHIsIGZwKTsKKwlmY2xvc2UoZnApOworCXJldHVybiAwOworfQorCisvKiBNYWtlIGl0IG1vcmUgcmVhZGFibGUgKi8KKyNkZWZpbmUgc3RhcnRfdGltZXIoKSB3cml0ZV9zdHJfdG9fZmlsZSgiL3Byb2MvdGltZXJfc3RhdHMiLCAiMVxuIikKKyNkZWZpbmUgc3RvcF90aW1lcigpICB3cml0ZV9zdHJfdG9fZmlsZSgiL3Byb2MvdGltZXJfc3RhdHMiLCAiMFxuIikKKworc3RhdGljIE5PSU5MSU5FIHZvaWQgY2xlYXJfbGluZXModm9pZCkKK3sKKwlpbnQgaTsKKwlpZiAoRy5saW5lcykgeworCQlmb3IgKGkgPSAwOyBpIDwgRy5saW5lc19jbnQ7IGkrKykKKwkJCWZyZWUoRy5saW5lc1tpXS5zdHJpbmcpOworCQlmcmVlKEcubGluZXMpOworCQlHLmxpbmVzX2NudCA9IDA7CisJCUcubGluZXMgPSBOVUxMOworCX0KK30KKworc3RhdGljIHZvaWQgdXBkYXRlX2xpbmVzX2N1bXVsYXRpdmVfY291bnQodm9pZCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgRy5saW5lc19jbnQ7IGkrKykKKwkJRy5saW5lc19jdW11bGF0aXZlX2NvdW50ICs9IEcubGluZXNbaV0uY291bnQ7Cit9CisKK3N0YXRpYyBpbnQgbGluZV9jb21wYXJlKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKK3sKKwljb25zdCBzdHJ1Y3QgbGluZSAqYSA9IHAxOworCWNvbnN0IHN0cnVjdCBsaW5lICpiID0gcDI7CisJcmV0dXJuIChiLT5jb3VudCAvKisgNTAgKiBiLT5kaXNrX2NvdW50Ki8pIC0gKGEtPmNvdW50IC8qKyA1MCAqIGEtPmRpc2tfY291bnQqLyk7Cit9CisKK3N0YXRpYyB2b2lkIHNvcnRfbGluZXModm9pZCkKK3sKKwlxc29ydChHLmxpbmVzLCBHLmxpbmVzX2NudCwgc2l6ZW9mKEcubGluZXNbMF0pLCBsaW5lX2NvbXBhcmUpOworfQorCisvKiBTYXZlIEMtc3RhdGUgdXNhZ2UgYW5kIGR1cmF0aW9uLiBBbHNvIHVwZGF0ZSBtYXhjc3RhdGUuICovCitzdGF0aWMgdm9pZCByZWFkX2NzdGF0ZV9jb3VudHModWxsb25nICp1c2FnZSwgdWxsb25nICpkdXJhdGlvbikKK3sKKwlESVIgKmRpcjsKKwlzdHJ1Y3QgZGlyZW50ICpkOworCisJZGlyID0gb3BlbmRpcigiL3Byb2MvYWNwaS9wcm9jZXNzb3IiKTsKKwlpZiAoIWRpcikKKwkJcmV0dXJuOworCisJd2hpbGUgKChkID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCUZJTEUgKmZwOworCQljaGFyIGJ1ZlsxOTJdOworCQlpbnQgbGV2ZWw7CisJCWludCBsZW47CisKKwkJbGVuID0gc3RybGVuKGQtPmRfbmFtZSk7IC8qICJDUFVubiIgKi8KKwkJaWYgKGxlbiA8IDMgfHwgbGVuID4gQklHX1NZU05BTUVfTEVOKQorCQkJY29udGludWU7CisKKwkJc3ByaW50ZihidWYsICIlcy8lcy9wb3dlciIsICIvcHJvYy9hY3BpL3Byb2Nlc3NvciIsIGQtPmRfbmFtZSk7CisJCWZwID0gZm9wZW5fZm9yX3JlYWQoYnVmKTsKKwkJaWYgKCFmcCkKKwkJCWNvbnRpbnVlOworCisvLyBFeGFtcGxlIGZpbGUgY29udGVudHM6CisvLyBhY3RpdmUgc3RhdGU6ICAgICAgICAgICAgQzAKKy8vIG1heF9jc3RhdGU6ICAgICAgICAgICAgICBDOAorLy8gbWF4aW11bSBhbGxvd2VkIGxhdGVuY3k6IDIwMDAwMDAwMDAgdXNlYworLy8gc3RhdGVzOgorLy8gICAgIEMxOiAgICAgICAgICAgICAgICAgIHR5cGVbQzFdIHByb21vdGlvblstLV0gZGVtb3Rpb25bLS1dIGxhdGVuY3lbMDAxXSB1c2FnZVswMDAwNjE3M10gZHVyYXRpb25bMDAwMDAwMDAwMDAwMDAwMDAwMDBdCisvLyAgICAgQzI6ICAgICAgICAgICAgICAgICAgdHlwZVtDMl0gcHJvbW90aW9uWy0tXSBkZW1vdGlvblstLV0gbGF0ZW5jeVswMDFdIHVzYWdlWzAwMDg1MTkxXSBkdXJhdGlvblswMDAwMDAwMDAwMDA4MzAyNDkwN10KKy8vICAgICBDMzogICAgICAgICAgICAgICAgICB0eXBlW0MzXSBwcm9tb3Rpb25bLS1dIGRlbW90aW9uWy0tXSBsYXRlbmN5WzAxN10gdXNhZ2VbMDEwMTc2MjJdIGR1cmF0aW9uWzAwMDAwMDAwMDE3OTIxMzI3MTgyXQorCQlsZXZlbCA9IDA7CisJCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKKwkJCWNoYXIgKnAgPSBzdHJzdHIoYnVmLCAiYWdlWyIpOworCQkJaWYgKCFwKQorCQkJCWNvbnRpbnVlOworCQkJcCArPSA0OworCQkJdXNhZ2VbbGV2ZWxdICs9IGJiX3N0cnRvdWxsKHAsIE5VTEwsIDEwKSArIDE7CisJCQlwID0gc3Ryc3RyKGJ1ZiwgImF0aW9uWyIpOworCQkJaWYgKCFwKQorCQkJCWNvbnRpbnVlOworCQkJcCArPSA2OworCQkJZHVyYXRpb25bbGV2ZWxdICs9IGJiX3N0cnRvdWxsKHAsIE5VTEwsIDEwKTsKKworCQkJaWYgKGxldmVsID49IE1BWF9DU1RBVEVfQ09VTlQtMSkKKwkJCQlicmVhazsKKwkJCWxldmVsKys7CisJCQlpZiAobGV2ZWwgPiBHLm1heGNzdGF0ZSkgIC8qIHVwZGF0ZSBtYXhjc3RhdGUgKi8KKwkJCQlHLm1heGNzdGF0ZSA9IGxldmVsOworCQl9CisJCWZjbG9zZShmcCk7CisJfQorCWNsb3NlZGlyKGRpcik7Cit9CisKKy8qIEFkZCBsaW5lIGFuZC9vciB1cGRhdGUgY291bnQgKi8KK3N0YXRpYyB2b2lkIHNhdmVfbGluZShjb25zdCBjaGFyICpzdHJpbmcsIGludCBjb3VudCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgRy5saW5lc19jbnQ7IGkrKykgeworCQlpZiAoc3RyY21wKHN0cmluZywgRy5saW5lc1tpXS5zdHJpbmcpID09IDApIHsKKwkJCS8qIEl0J3MgYWxyZWFkeSB0aGVyZSwgb25seSB1cGRhdGUgY291bnQgKi8KKwkJCUcubGluZXNbaV0uY291bnQgKz0gY291bnQ7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwkvKiBBZGQgbmV3IGxpbmUgKi8KKwlHLmxpbmVzID0geHJlYWxsb2NfdmVjdG9yKEcubGluZXMsIDQsIEcubGluZXNfY250KTsKKwlHLmxpbmVzW0cubGluZXNfY250XS5zdHJpbmcgPSB4c3RyZHVwKHN0cmluZyk7CisJRy5saW5lc1tHLmxpbmVzX2NudF0uY291bnQgPSBjb3VudDsKKwkvKkcubGluZXNbRy5saW5lc19jbnRdLmRpc2tfY291bnQgPSAwOyovCisJRy5saW5lc19jbnQrKzsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1BPV0VSVE9QX1BST0NJUlEKK3N0YXRpYyBpbnQgaXNfaHBldF9pcnEoY29uc3QgY2hhciAqbmFtZSkKK3sKKwljaGFyICpwOworIyBpZiBCTE9BVFlfSFBFVF9JUlFfTlVNX0RFVEVDVElPTgorCWxvbmcgaHBldF9jaGFuOworCisJLyogTGVhcm4gdGhlIHJhbmdlIG9mIGV4aXN0aW5nIGhwZXQgdGltZXJzLiBUaGlzIGlzIGRvbmUgb25jZSAqLworCWlmICghRy5zY2FubmVkX3RpbWVyX2xpc3QpIHsKKwkJRklMRSAqZnA7CisJCWNoYXIgYnVmWzgwXTsKKworCQlHLnNjYW5uZWRfdGltZXJfbGlzdCA9IHRydWU7CisJCWZwID0gZm9wZW5fZm9yX3JlYWQoIi9wcm9jL3RpbWVyX2xpc3QiKTsKKwkJaWYgKCFmcCkKKwkJCXJldHVybiAwOworCisJCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmcCkpIHsKKwkJCXAgPSBzdHJzdHIoYnVmLCAiQ2xvY2sgRXZlbnQgRGV2aWNlOiBocGV0Iik7CisJCQlpZiAoIXApCisJCQkJY29udGludWU7CisJCQlwICs9IHNpemVvZigiQ2xvY2sgRXZlbnQgRGV2aWNlOiBocGV0IiktMTsKKwkJCWlmICghaXNkaWdpdCgqcCkpCisJCQkJY29udGludWU7CisJCQlocGV0X2NoYW4gPSB4YXRvaV9wb3NpdGl2ZShwKTsKKwkJCWlmIChocGV0X2NoYW4gPCBHLnBlcmNwdV9ocGV0X3N0YXJ0KQorCQkJCUcucGVyY3B1X2hwZXRfc3RhcnQgPSBocGV0X2NoYW47CisJCQlpZiAoaHBldF9jaGFuID4gRy5wZXJjcHVfaHBldF9lbmQpCisJCQkJRy5wZXJjcHVfaHBldF9lbmQgPSBocGV0X2NoYW47CisJCX0KKwkJZmNsb3NlKGZwKTsKKwl9CisjIGVuZGlmCisvL1RPRE86IG9wdGltaXplCisJcCA9IHN0cnN0cihuYW1lLCAiaHBldCIpOworCWlmICghcCkKKwkJcmV0dXJuIDA7CisJcCArPSA0OworCWlmICghaXNkaWdpdCgqcCkpCisJCXJldHVybiAwOworIyBpZiBCTE9BVFlfSFBFVF9JUlFfTlVNX0RFVEVDVElPTgorCWhwZXRfY2hhbiA9IHhhdG9pX3Bvc2l0aXZlKHApOworCWlmIChocGV0X2NoYW4gPCBHLnBlcmNwdV9ocGV0X3N0YXJ0IHx8IGhwZXRfY2hhbiA+IEcucGVyY3B1X2hwZXRfZW5kKQorCQlyZXR1cm4gMDsKKyMgZW5kaWYKKwlyZXR1cm4gMTsKK30KKworLyogU2F2ZSBuZXcgSVJRIGNvdW50LCByZXR1cm4gZGVsdGEgZnJvbSBvbGQgb25lICovCitzdGF0aWMgaW50IHNhdmVfaXJxX2NvdW50KGludCBpcnEsIHVsbG9uZyBjb3VudCkKK3sKKwlpbnQgdW51c2VkID0gSVJRQ09VTlQ7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IElSUUNPVU5UOyBpKyspIHsKKwkJaWYgKEcuaW50ZXJydXB0c1tpXS5hY3RpdmUgJiYgRy5pbnRlcnJ1cHRzW2ldLm51bWJlciA9PSBpcnEpIHsKKwkJCXVsbG9uZyBvbGQgPSBHLmludGVycnVwdHNbaV0uY291bnQ7CisJCQlHLmludGVycnVwdHNbaV0uY291bnQgPSBjb3VudDsKKwkJCXJldHVybiBjb3VudCAtIG9sZDsKKwkJfQorCQlpZiAoIUcuaW50ZXJydXB0c1tpXS5hY3RpdmUgJiYgdW51c2VkID4gaSkKKwkJCXVudXNlZCA9IGk7CisJfQorCWlmICh1bnVzZWQgPCBJUlFDT1VOVCkgeworCQlHLmludGVycnVwdHNbdW51c2VkXS5hY3RpdmUgPSAxOworCQlHLmludGVycnVwdHNbdW51c2VkXS5jb3VudCA9IGNvdW50OworCQlHLmludGVycnVwdHNbdW51c2VkXS5udW1iZXIgPSBpcnE7CisJfQorCXJldHVybiBjb3VudDsKK30KKworLyogUmVhZCAvcHJvYy9pbnRlcnJ1cHRzLCBzYXZlIElSUSBjb3VudHMgYW5kIElSUSBkZXNjcmlwdGlvbiAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19pcnFfY291bnRzKHZvaWQpCit7CisJRklMRSAqZnA7CisJY2hhciBidWZbMTI4XTsKKworCS8qIFJlc2V0IHZhbHVlcyAqLworCUcuaW50ZXJydXB0XzAgPSAwOworCUcudG90YWxfaW50ZXJydXB0ID0gMDsKKworCWZwID0geGZvcGVuX2Zvcl9yZWFkKCIvcHJvYy9pbnRlcnJ1cHRzIik7CisJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZwKSkgeworCQljaGFyIGlycV9kZXNjW3NpemVvZigiICAgPGtlcm5lbCBJUEk+IDogIikgKyBzaXplb2YoYnVmKV07CisJCWNoYXIgKnA7CisJCWNvbnN0IGNoYXIgKm5hbWU7CisJCWludCBucjsKKwkJdWxsb25nIGNvdW50OworCQl1bGxvbmcgZGVsdGE7CisKKwkJcCA9IHN0cmNocihidWYsICc6Jyk7CisJCWlmICghcCkKKwkJCWNvbnRpbnVlOworCQkvKiAgMDogIDE0MzY0NjA0NSAgMTUzOTAxMDA3ICAgSU8tQVBJQy1lZGdlICAgICAgdGltZXIKKwkJICogICBeCisJCSAqLworCQkqcCA9ICdcMCc7CisJCS8qIERlYWwgd2l0aCBub24tbWFza2FibGUgaW50ZXJydXB0cyAtLSBtYWtlIHVwIGZha2UgbnVtYmVycyAqLworCQluciA9IGluZGV4X2luX3N0cmluZ3MoIk5NSVwwUkVTXDBDQUxcMFRMQlwwVFJNXDBUSFJcMFNQVVwwIiwgYnVmKTsKKwkJaWYgKG5yID49IDApIHsKKwkJCW5yICs9IDIwMDAwOworCQl9IGVsc2UgeworCQkJLyogYmJfc3RydG91IGRvZXNuJ3QgZWF0IGxlYWRpbmcgc3BhY2VzLCB1c2luZyBzdHJ0b3VsICovCisJCQllcnJubyA9IDA7CisJCQluciA9IHN0cnRvdWwoYnVmLCBOVUxMLCAxMCk7CisJCQlpZiAoZXJybm8pCisJCQkJY29udGludWU7CisJCX0KKwkJcCsrOworCQkvKiAgMDogIDE0MzY0NjA0NSAgMTUzOTAxMDA3ICAgSU8tQVBJQy1lZGdlICAgICAgdGltZXIKKwkJICogICAgXgorCQkgKi8KKwkJLyogU3VtIGNvdW50cyBmb3IgdGhpcyBJUlEgKi8KKwkJY291bnQgPSAwOworCQl3aGlsZSAoMSkgeworCQkJY2hhciAqdG1wOworCQkJcCA9IHNraXBfd2hpdGVzcGFjZShwKTsKKwkJCWlmICghaXNkaWdpdCgqcCkpCisJCQkJYnJlYWs7CisJCQljb3VudCArPSBiYl9zdHJ0b3VsbChwLCAmdG1wLCAxMCk7CisJCQlwID0gdG1wOworCQl9CisJCS8qICAgMDogIDE0MzY0NjA0NSAgMTUzOTAxMDA3ICAgSU8tQVBJQy1lZGdlICAgICAgdGltZXIKKwkJICogTk1JOiAgICAgICAgICAxICAgICAgICAgIDIgICBOb24tbWFza2FibGUgaW50ZXJydXB0cworCQkgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF4KKwkJICovCisJCWlmIChuciA8IDIwMDAwKSB7CisJCQkvKiBTa2lwIHRvIHRoZSBpbnRlcnJ1cHQgbmFtZSwgZS5nLiAndGltZXInICovCisJCQlwID0gc3RyY2hyKHAsICcgJyk7CisJCQlpZiAoIXApCisJCQkJY29udGludWU7CisJCQlwID0gc2tpcF93aGl0ZXNwYWNlKHApOworCQl9CisKKwkJbmFtZSA9IHA7CisJCWNob21wKHApOworCQkvKiBTYXZlIGRlc2NyaXB0aW9uIG9mIHRoZSBpbnRlcnJ1cHQgKi8KKwkJaWYgKG5yID49IDIwMDAwKQorCQkJc3ByaW50ZihpcnFfZGVzYywgIiAgIDxrZXJuZWwgSVBJPiA6ICVzIiwgbmFtZSk7CisJCWVsc2UKKwkJCXNwcmludGYoaXJxX2Rlc2MsICIgICAgPGludGVycnVwdD4gOiAlcyIsIG5hbWUpOworCisJCWRlbHRhID0gc2F2ZV9pcnFfY291bnQobnIsIGNvdW50KTsKKworCQkvKiBTa2lwIHBlciBDUFUgdGltZXIgaW50ZXJydXB0cyAqLworCQlpZiAoaXNfaHBldF9pcnEobmFtZSkpCisJCQljb250aW51ZTsKKworCQlpZiAobnIgIT0gMCAmJiBkZWx0YSAhPSAwKQorCQkJc2F2ZV9saW5lKGlycV9kZXNjLCBkZWx0YSk7CisKKwkJaWYgKG5yID09IDApCisJCQlHLmludGVycnVwdF8wID0gZGVsdGE7CisJCWVsc2UKKwkJCUcudG90YWxfaW50ZXJydXB0ICs9IGRlbHRhOworCX0KKworCWZjbG9zZShmcCk7Cit9CisjZWxzZSAvKiAhRU5BQkxFX0ZFQVRVUkVfUE9XRVJUT1BfUFJPQ0lSUSAqLworIyBkZWZpbmUgcHJvY2Vzc19pcnFfY291bnRzKCkgICgodm9pZCkwKQorI2VuZGlmCisKK3N0YXRpYyBOT0lOTElORSBpbnQgcHJvY2Vzc190aW1lcl9zdGF0cyh2b2lkKQoreworCWNoYXIgYnVmWzEyOF07CisJY2hhciBsaW5lWzE1ICsgMyArIDEyOF07CisJaW50IG47CisJRklMRSAqZnA7CisKKwlidWZbMF0gPSAnXDAnOworCisJbiA9IDA7CisJZnAgPSBOVUxMOworCWlmICghRy5jYW50X2VuYWJsZV90aW1lcl9zdGF0cykKKwkJZnAgPSBmb3Blbl9mb3JfcmVhZCgiL3Byb2MvdGltZXJfc3RhdHMiKTsKKwlpZiAoZnApIHsKKy8vIEV4YW1wbGUgZmlsZSBjb250ZW50czoKKy8vIFRpbWVyIFN0YXRzIFZlcnNpb246IHYwLjIKKy8vIFNhbXBsZSBwZXJpb2Q6IDEuMzI5IHMKKy8vICAgIDc2LCAgICAgMCBzd2FwcGVyICAgICAgICAgIGhydGltZXJfc3RhcnRfcmFuZ2VfbnMgKHRpY2tfc2NoZWRfdGltZXIpCisvLyAgICA4OCwgICAgIDAgc3dhcHBlciAgICAgICAgICBocnRpbWVyX3N0YXJ0X3JhbmdlX25zICh0aWNrX3NjaGVkX3RpbWVyKQorLy8gICAgMjQsICAzNzg3IGZpcmVmb3ggICAgICAgICAgaHJ0aW1lcl9zdGFydF9yYW5nZV9ucyAoaHJ0aW1lcl93YWtldXApCisvLyAgIDQ2RCwgIDExMzYga29uZGVtYW5kLzEgICAgICBkb19kYnNfdGltZXIgKGRlbGF5ZWRfd29ya190aW1lcl9mbikKKy8vIC4uLgorLy8gICAgIDEsICAxNjU2IFhvcmcgICAgICAgICAgICAgaHJ0aW1lcl9zdGFydF9yYW5nZV9ucyAoaHJ0aW1lcl93YWtldXApCisvLyAgICAgMSwgIDIxNTkgdWRpc2tzLWRhZW1vbiAgICBocnRpbWVyX3N0YXJ0X3JhbmdlX25zIChocnRpbWVyX3dha2V1cCkKKy8vIDMzMSB0b3RhbCBldmVudHMsIDI0OS4wNTkgZXZlbnRzL3NlYworCQl3aGlsZSAoZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApKSB7CisJCQljb25zdCBjaGFyICpjb3VudCwgKnByb2Nlc3MsICpmdW5jOworCQkJY2hhciAqcDsKKwkJCWludCBpZHg7CisJCQl1bnNpZ25lZCBjbnQ7CisKKwkJCWNvdW50ID0gc2tpcF93aGl0ZXNwYWNlKGJ1Zik7CisJCQlwID0gc3RyY2hyKGNvdW50LCAnLCcpOworCQkJaWYgKCFwKQorCQkJCWNvbnRpbnVlOworCQkJKnArKyA9ICdcMCc7CisJCQljbnQgPSBiYl9zdHJ0b3UoY291bnQsIE5VTEwsIDEwKTsKKwkJCWlmIChzdHJjbXAoc2tpcF9ub25fd2hpdGVzcGFjZShjb3VudCksICIgdG90YWwgZXZlbnRzIikgPT0gMCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX1BPV0VSVE9QX1BST0NJUlEKKwkJCQluID0gY250IC8gRy50b3RhbF9jcHVzOworCQkJCWlmIChuID4gMCAmJiBuIDwgRy5pbnRlcnJ1cHRfMCkgeworCQkJCQlzcHJpbnRmKGxpbmUsICIgICAgPGludGVycnVwdD4gOiAlcyIsICJleHRyYSB0aW1lciBpbnRlcnJ1cHQiKTsKKwkJCQkJc2F2ZV9saW5lKGxpbmUsIEcuaW50ZXJydXB0XzAgLSBuKTsKKwkJCQl9CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChzdHJjaHIoY291bnQsICdEJykpCisJCQkJY29udGludWU7IC8qIGRlZmVycmVkICovCisJCQlwID0gc2tpcF93aGl0ZXNwYWNlKHApOyAvKiBwb2ludHMgdG8gcGlkIG5vdyAqLworCQkJcHJvY2VzcyA9IE5VTEw7CisgZ2V0X2Z1bmNfbmFtZToKKwkJCXAgPSBzdHJjaHIocCwgJyAnKTsKKwkJCWlmICghcCkKKwkJCQljb250aW51ZTsKKwkJCSpwKysgPSAnXDAnOworCQkJcCA9IHNraXBfd2hpdGVzcGFjZShwKTsKKwkJCWlmIChwcm9jZXNzID09IE5VTEwpIHsKKwkJCQlwcm9jZXNzID0gcDsKKwkJCQlnb3RvIGdldF9mdW5jX25hbWU7CisJCQl9CisJCQlmdW5jID0gcDsKKworCQkJLy9pZiAoc3RyY21wKHByb2Nlc3MsICJzd2FwcGVyIikgPT0gMAorCQkJLy8gJiYgc3RyY21wKGZ1bmMsICJocnRpbWVyX3N0YXJ0X3JhbmdlX25zICh0aWNrX3NjaGVkX3RpbWVyKVxuIikgPT0gMAorCQkJLy8pIHsKKwkJCS8vCXByb2Nlc3MgPSAiW2tlcm5lbCBzY2hlZHVsZXJdIjsKKwkJCS8vCWZ1bmMgPSAiTG9hZCBiYWxhbmNpbmcgdGljayI7CisJCQkvL30KKworCQkJaWYgKGlzX3ByZWZpeGVkX3dpdGgoZnVuYywgInRpY2tfbm9oel8iKSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChpc19wcmVmaXhlZF93aXRoKGZ1bmMsICJ0aWNrX3NldHVwX3NjaGVkX3RpbWVyIikpCisJCQkJY29udGludWU7CisJCQkvL2lmIChzdHJjbXAocHJvY2VzcywgInBvd2VydG9wIikgPT0gMCkKKwkJCS8vCWNvbnRpbnVlOworCisJCQlpZHggPSBpbmRleF9pbl9zdHJpbmdzKCJpbnNtb2RcMG1vZHByb2JlXDBzd2FwcGVyXDAiLCBwcm9jZXNzKTsKKwkJCWlmIChpZHggIT0gLTEpIHsKKwkJCQlwcm9jZXNzID0gaWR4IDwgMiA/ICJba2VybmVsIG1vZHVsZV0iIDogIjxrZXJuZWwgY29yZT4iOworCQkJfQorCisJCQljaG9tcChwKTsKKworCQkJLy8gNDZEXDAxMTM2XDBrb25kZW1hbmQvMVwwZG9fZGJzX3RpbWVyIChkZWxheWVkX3dvcmtfdGltZXJfZm4pCisJCQkvLyBeICAgICAgICAgIF4gICAgICAgICAgICBeCisJCQkvLyBjb3VudCAgICAgIHByb2Nlc3MgICAgICBmdW5jCisKKwkJCS8vaWYgKHN0cmNocihwcm9jZXNzLCAnWycpKQorCQkJCXNwcmludGYobGluZSwgIiUxNS4xNXMgOiAlcyIsIHByb2Nlc3MsIGZ1bmMpOworCQkJLy9lbHNlCisJCQkvLwlzcHJpbnRmKGxpbmUsICIlcyIsIHByb2Nlc3MpOworCQkJc2F2ZV9saW5lKGxpbmUsIGNudCk7CisJCX0KKwkJZmNsb3NlKGZwKTsKKwl9CisKKwlyZXR1cm4gbjsKK30KKworI2lmZGVmIF9faTM4Nl9fCisvKgorICogR2V0IGluZm9ybWF0aW9uIGFib3V0IENQVSB1c2luZyBDUFVJRCBvcGNvZGUuCisgKi8KK3N0YXRpYyB2b2lkIGNwdWlkKHVuc2lnbmVkIGludCAqZWF4LCB1bnNpZ25lZCBpbnQgKmVieCwgdW5zaWduZWQgaW50ICplY3gsCisJCQkJdW5zaWduZWQgaW50ICplZHgpCit7CisJLyogRUFYIHZhbHVlIHNwZWNpZmllcyB3aGF0IGluZm9ybWF0aW9uIHRvIHJldHVybiAqLworCV9fYXNtX18oCisJCSIJcHVzaGwgJSVlYnhcbiIgICAgIC8qIFNhdmUgRUJYICovCisJCSIJY3B1aWRcbiIKKwkJIgltb3ZsICUlZWJ4LCAlMVxuIiAgLyogU2F2ZSBjb250ZW50IG9mIEVCWCAqLworCQkiCXBvcGwgJSVlYnhcbiIgICAgICAvKiBSZXN0b3JlIEVCWCAqLworCQk6ICI9YSIoKmVheCksIC8qIE91dHB1dCAqLworCQkgICI9ciIoKmVieCksCisJCSAgIj1jIigqZWN4KSwKKwkJICAiPWQiKCplZHgpCisJCTogIjAiKCplYXgpLCAgLyogSW5wdXQgKi8KKwkJICAiMSIoKmVieCksCisJCSAgIjIiKCplY3gpLAorCQkgICIzIigqZWR4KQorCQkvKiBObyBjbG9iYmVyZWQgcmVnaXN0ZXJzICovCisJKTsKK30KKyNlbmRpZgorCisjaWZkZWYgX19pMzg2X18KK3N0YXRpYyBOT0lOTElORSB2b2lkIHByaW50X2ludGVsX2NzdGF0ZXModm9pZCkKK3sKKwlpbnQgYmlvc190YWJsZVs4XSA9IHsgMCB9OworCWludCBuYmlvcyA9IDA7CisJRElSICpjcHVkaXI7CisJc3RydWN0IGRpcmVudCAqZDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBlYXgsIGVieCwgZWN4LCBlZHg7CisKKwljcHVkaXIgPSBvcGVuZGlyKCIvc3lzL2RldmljZXMvc3lzdGVtL2NwdSIpOworCWlmICghY3B1ZGlyKQorCQlyZXR1cm47CisKKwkvKiBMb29wIG92ZXIgY3B1TiBlbnRyaWVzICovCisJd2hpbGUgKChkID0gcmVhZGRpcihjcHVkaXIpKSAhPSBOVUxMKSB7CisJCURJUiAqZGlyOworCQlpbnQgbGVuOworCQljaGFyIGZuYW1lW3NpemVvZigiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvL2NwdWlkbGUvL2Rlc2MiKSArIDIqQklHX1NZU05BTUVfTEVOXTsKKworCQlsZW4gPSBzdHJsZW4oZC0+ZF9uYW1lKTsKKwkJaWYgKGxlbiA8IDMgfHwgbGVuID4gQklHX1NZU05BTUVfTEVOKQorCQkJY29udGludWU7CisKKwkJaWYgKCFpc2RpZ2l0KGQtPmRfbmFtZVszXSkpCisJCQljb250aW51ZTsKKworCQlsZW4gPSBzcHJpbnRmKGZuYW1lLCAiJXMvJXMvY3B1aWRsZSIsICIvc3lzL2RldmljZXMvc3lzdGVtL2NwdSIsIGQtPmRfbmFtZSk7CisJCWRpciA9IG9wZW5kaXIoZm5hbWUpOworCQlpZiAoIWRpcikKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIEV2ZXJ5IEMtc3RhdGUgaGFzIGl0cyBvd24gc3RhdGVOIGRpcmVjdG9yeSwgdGhhdAorCQkgKiBjb250YWlucyBhICd0aW1lJyBhbmQgYSAndXNhZ2UnIGZpbGUuCisJCSAqLworCQl3aGlsZSAoKGQgPSByZWFkZGlyKGRpcikpICE9IE5VTEwpIHsKKwkJCUZJTEUgKmZwOworCQkJY2hhciBidWZbNjRdOworCQkJaW50IG47CisKKwkJCW4gPSBzdHJsZW4oZC0+ZF9uYW1lKTsKKwkJCWlmIChuIDwgMyB8fCBuID4gQklHX1NZU05BTUVfTEVOKQorCQkJCWNvbnRpbnVlOworCisJCQlzcHJpbnRmKGZuYW1lICsgbGVuLCAiLyVzL2Rlc2MiLCBkLT5kX25hbWUpOworCQkJZnAgPSBmb3Blbl9mb3JfcmVhZChmbmFtZSk7CisJCQlpZiAoZnApIHsKKwkJCQljaGFyICpwID0gZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgZnApOworCQkJCWZjbG9zZShmcCk7CisJCQkJaWYgKCFwKQorCQkJCQlicmVhazsKKwkJCQlwID0gc3Ryc3RyKHAsICJNV0FJVCAiKTsKKwkJCQlpZiAocCkgeworCQkJCQlpbnQgcG9zOworCQkJCQlwICs9IHNpemVvZigiTVdBSVQgIikgLSAxOworCQkJCQlwb3MgPSAoYmJfc3RydG91bGwocCwgTlVMTCwgMTYpID4+IDQpICsgMTsKKwkJCQkJaWYgKHBvcyA+PSBBUlJBWV9TSVpFKGJpb3NfdGFibGUpKQorCQkJCQkJY29udGludWU7CisJCQkJCWJpb3NfdGFibGVbcG9zXSsrOworCQkJCQluYmlvcysrOworCQkJCX0KKwkJCX0KKwkJfQorCQljbG9zZWRpcihkaXIpOworCX0KKwljbG9zZWRpcihjcHVkaXIpOworCisJaWYgKCFuYmlvcykKKwkJcmV0dXJuOworCisJZWF4ID0gNTsKKwllYnggPSBlY3ggPSBlZHggPSAwOworCWNwdWlkKCZlYXgsICZlYngsICZlY3gsICZlZHgpOworCWlmICghZWR4IHx8ICEoZWN4ICYgMSkpCisJCXJldHVybjsKKworCXByaW50ZigiWW91ciAlcyB0aGUgZm9sbG93aW5nIEMtc3RhdGVzOiAiLCAiQ1BVIHN1cHBvcnRzIik7CisJaSA9IDA7CisJd2hpbGUgKGVkeCkgeworCQlpZiAoZWR4ICYgNykKKwkJCXByaW50ZigiQyV1ICIsIGkpOworCQllZHggPj49IDQ7CisJCWkrKzsKKwl9CisJYmJfcHV0Y2hhcignXG4nKTsKKworCS8qIFByaW50IEJJT1MgQy1TdGF0ZXMgKi8KKwlwcmludGYoIllvdXIgJXMgdGhlIGZvbGxvd2luZyBDLXN0YXRlczogIiwgIkJJT1MgcmVwb3J0cyIpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGJpb3NfdGFibGUpOyBpKyspCisJCWlmIChiaW9zX3RhYmxlW2ldKQorCQkJcHJpbnRmKCJDJXUgIiwgaSk7CisKKwliYl9wdXRjaGFyKCdcbicpOworfQorI2Vsc2UKKyMgZGVmaW5lIHByaW50X2ludGVsX2NzdGF0ZXMoKSAoKHZvaWQpMCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBzaG93X3RpbWVyc3RhdHModm9pZCkKK3sKKwl1bnNpZ25lZCBsaW5lczsKKworCS8qIEdldCB0ZXJtaW5hbCBoZWlnaHQgKi8KKwlnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KFNURE9VVF9GSUxFTk8sIE5VTEwsICZsaW5lcyk7CisKKwkvKiBXZSBkb24ndCBoYXZlIHdob2xlIHRlcm1pbmFsIGp1c3QgZm9yIHRpbWVyc3RhdHMgKi8KKwlsaW5lcyAtPSAxMjsKKworCWlmICghRy5jYW50X2VuYWJsZV90aW1lcl9zdGF0cykgeworCQlpbnQgaSwgbiA9IDA7CisJCWNoYXIgc3RyYnVmNls2XTsKKworCQlwdXRzKCJcblRvcCBjYXVzZXMgZm9yIHdha2V1cHM6Iik7CisJCWZvciAoaSA9IDA7IGkgPCBHLmxpbmVzX2NudDsgaSsrKSB7CisJCQlpZiAoKEcubGluZXNbaV0uY291bnQgPiAwIC8qfHwgRy5saW5lc1tpXS5kaXNrX2NvdW50ID4gMCovKQorCQkJICYmIG4rKyA8IGxpbmVzCisJCQkpIHsKKwkJCQkvKiBOQjogdXBzdHJlYW0gcG93ZXJ0b3AgcHJpbnRzICIod2FrZXVwcy9zZWMpIiwKKwkJCQkgKiB3ZSBwcmludCBqdXN0ICIod2FrZXVwIGNvdW50cykiLgorCQkJCSAqLworCQkJCS8qY2hhciBjID0gJyAnOworCQkJCWlmIChHLmxpbmVzW2ldLmRpc2tfY291bnQpCisJCQkJCWMgPSAnRCc7Ki8KKwkJCQlzbWFydF91bGx0b2E1KEcubGluZXNbaV0uY291bnQsIHN0cmJ1ZjYsICIgS01HVFBFWlkiKVswXSA9ICdcMCc7CisJCQkJcHJpbnRmKC8qIiAlNS4xZiUlICglcyklYyAgJXNcbiIqLworCQkJCQkiICU1LjFmJSUgKCVzKSAgICVzXG4iLAorCQkJCQlHLmxpbmVzW2ldLmNvdW50ICogMTAwLjAgLyBHLmxpbmVzX2N1bXVsYXRpdmVfY291bnQsCisJCQkJCXN0cmJ1ZjYsIC8qYywqLworCQkJCQlHLmxpbmVzW2ldLnN0cmluZyk7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQliYl9wdXRjaGFyKCdcbicpOworCQliYl9lcnJvcl9tc2coIm5vIHN0YXRzIGF2YWlsYWJsZTsgcnVuIGFzIHJvb3Qgb3IiCisJCQkJIiBlbmFibGUgdGhlIHRpbWVyX3N0YXRzIG1vZHVsZSIpOworCX0KK30KKworLy8gRXhhbXBsZSBkaXNwbGF5IGZyb20gcG93ZXJ0b3AgdmVyc2lvbiAxLjExCisvLyBDbiAgICAgICAgICAgICAgICBBdmcgcmVzaWRlbmN5ICAgICAgIFAtc3RhdGVzIChmcmVxdWVuY2llcykKKy8vIEMwIChjcHUgcnVubmluZykgICAgICAgICggMC41JSkgICAgICAgICAyLjAwIEdoeiAgICAgMC4wJQorLy8gcG9sbGluZyAgICAgICAgICAgMC4wbXMgKCAwLjAlKSAgICAgICAgIDEuNjcgR2h6ICAgICAwLjAlCisvLyBDMSBtd2FpdCAgICAgICAgICAwLjBtcyAoIDAuMCUpICAgICAgICAgMTMzMyBNaHogICAgIDAuMSUKKy8vIEMyIG13YWl0ICAgICAgICAgIDAuMW1zICggMC4xJSkgICAgICAgICAxMDAwIE1oeiAgICA5OS45JQorLy8gQzMgbXdhaXQgICAgICAgICAxMi4xbXMgKDk5LjQlKQorLy8KKy8vIFdha2V1cHMtZnJvbS1pZGxlIHBlciBzZWNvbmQgOiA5My42ICAgICBpbnRlcnZhbDogMTUuMHMKKy8vIG5vIEFDUEkgcG93ZXIgdXNhZ2UgZXN0aW1hdGUgYXZhaWxhYmxlCisvLworLy8gVG9wIGNhdXNlcyBmb3Igd2FrZXVwczoKKy8vICAgMzIuNCUgKCAyNi43KSAgICAgICA8aW50ZXJydXB0PiA6IGV4dHJhIHRpbWVyIGludGVycnVwdAorLy8gICAyOS4wJSAoIDIzLjkpICAgICA8a2VybmVsIGNvcmU+IDogaHJ0aW1lcl9zdGFydF9yYW5nZV9ucyAodGlja19zY2hlZF90aW1lcikKKy8vICAgIDkuMCUgKCAgNy41KSAgICAgPGtlcm5lbCBjb3JlPiA6IGhydGltZXJfc3RhcnQgKHRpY2tfc2NoZWRfdGltZXIpCisvLyAgICA2LjUlICggIDUuMykgICAgICAgPGludGVycnVwdD4gOiBhdGFfcGlpeAorLy8gICAgNS4wJSAoICA0LjEpICAgICAgICAgICAgIGluZXRkIDogaHJ0aW1lcl9zdGFydF9yYW5nZV9ucyAoaHJ0aW1lcl93YWtldXApCisKKy8vdXNhZ2U6I2RlZmluZSBwb3dlcnRvcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIHBvd2VydG9wX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQW5hbHl6ZSBwb3dlciBjb25zdW1wdGlvbiBvbiBJbnRlbC1iYXNlZCBsYXB0b3BzIgorCitpbnQgcG93ZXJ0b3BfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHBvd2VydG9wX21haW4oaW50IFVOVVNFRF9QQVJBTSBhcmdjLCBjaGFyIFVOVVNFRF9QQVJBTSAqKmFyZ3YpCit7CisJdWxsb25nIGN1cl91c2FnZVtNQVhfQ1NUQVRFX0NPVU5UXTsKKwl1bGxvbmcgY3VyX2R1cmF0aW9uW01BWF9DU1RBVEVfQ09VTlRdOworCWNoYXIgY3N0YXRlX2xpbmVzW01BWF9DU1RBVEVfQ09VTlQgKyAyXVs2NF07CisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX1RFUk1JT1MKKwlzdHJ1Y3QgdGVybWlvcyBuZXdfc2V0dGluZ3M7CisJc3RydWN0IHBvbGxmZCBwZmRbMV07CisKKwlwZmRbMF0uZmQgPSAwOworCXBmZFswXS5ldmVudHMgPSBQT0xMSU47CisjZW5kaWYKKworCUlOSVRfRygpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfUE9XRVJUT1BfUFJPQ0lSUSAmJiBCTE9BVFlfSFBFVF9JUlFfTlVNX0RFVEVDVElPTgorCUcucGVyY3B1X2hwZXRfc3RhcnQgPSBJTlRfTUFYOworCUcucGVyY3B1X2hwZXRfZW5kID0gSU5UX01JTjsKKyNlbmRpZgorCisJLyogUHJpbnQgd2FybmluZyB3aGVuIHdlIGRvbid0IGhhdmUgc3VwZXJ1c2VyIHByaXZpbGVnZXMgKi8KKwlpZiAoZ2V0ZXVpZCgpICE9IDApCisJCWJiX2Vycm9yX21zZygicnVuIGFzIHJvb3QgdG8gY29sbGVjdCBlbm91Z2ggaW5mb3JtYXRpb24iKTsKKworCS8qIEdldCBudW1iZXIgb2YgQ1BVcyAqLworCUcudG90YWxfY3B1cyA9IGdldF9jcHVfY291bnQoKTsKKworCXB1dHMoIkNvbGxlY3RpbmcgZGF0YSBmb3IgIkRFRkFVTFRfU0xFRVBfU1RSIiBzZWNvbmRzIik7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUworCXRjZ2V0YXR0cigwLCAodm9pZCAqKSZHLmluaXRfc2V0dGluZ3MpOworCW1lbWNweSgmbmV3X3NldHRpbmdzLCAmRy5pbml0X3NldHRpbmdzLCBzaXplb2YobmV3X3NldHRpbmdzKSk7CisJLyogVHVybiBvbiB1bmJ1ZmZlcmVkIGlucHV0LCB0dXJuIG9mZiBlY2hvaW5nICovCisJbmV3X3NldHRpbmdzLmNfbGZsYWcgJj0gfihJU0lHIHwgSUNBTk9OIHwgRUNITyB8IEVDSE9OTCk7CisJLyogU28gd2UgZG9uJ3QgZm9yZ2V0IHRvIHJlc2V0IHRlcm0gc2V0dGluZ3MgKi8KKwlhdGV4aXQocmVzZXRfdGVybSk7CisJYmJfc2lnbmFscyhCQl9GQVRBTF9TSUdTLCBzaWdfaGFuZGxlcik7CisJdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coJm5ld19zZXR0aW5ncyk7CisjZW5kaWYKKworCS8qIENvbGxlY3QgaW5pdGlhbCBkYXRhICovCisJcHJvY2Vzc19pcnFfY291bnRzKCk7CisKKwkvKiBSZWFkIGluaXRpYWwgdXNhZ2UgYW5kIGR1cmF0aW9uICovCisJcmVhZF9jc3RhdGVfY291bnRzKEcuc3RhcnRfdXNhZ2UsIEcuc3RhcnRfZHVyYXRpb24pOworCisJLyogQ29weSB0aGVtIHRvICJsYXN0IiAqLworCW1lbWNweShHLmxhc3RfdXNhZ2UsIEcuc3RhcnRfdXNhZ2UsIHNpemVvZihHLmxhc3RfdXNhZ2UpKTsKKwltZW1jcHkoRy5sYXN0X2R1cmF0aW9uLCBHLnN0YXJ0X2R1cmF0aW9uLCBzaXplb2YoRy5sYXN0X2R1cmF0aW9uKSk7CisKKwkvKiBEaXNwbGF5IEMtc3RhdGVzICovCisJcHJpbnRfaW50ZWxfY3N0YXRlcygpOworCisJRy5jYW50X2VuYWJsZV90aW1lcl9zdGF0cyB8PSBzdG9wX3RpbWVyKCk7IC8qIDEgb24gZXJyb3IgKi8KKworCS8qIFRoZSBtYWluIGxvb3AgKi8KKwlmb3IgKDs7KSB7CisJCS8vZG91YmxlIG1heHNsZWVwID0gMC4wOworCQl1bGxvbmcgdG90YWx0aWNrcywgdG90YWxldmVudHM7CisJCWludCBpOworCisJCUcuY2FudF9lbmFibGVfdGltZXJfc3RhdHMgfD0gc3RhcnRfdGltZXIoKTsgLyogMSBvbiBlcnJvciAqLworI2lmICFFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUworCQlzbGVlcChERUZBVUxUX1NMRUVQKTsKKyNlbHNlCisJCWlmIChzYWZlX3BvbGwocGZkLCAxLCBERUZBVUxUX1NMRUVQICogMTAwMCkgPiAwKSB7CisJCQl1bnNpZ25lZCBjaGFyIGM7CisJCQlpZiAoc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgJmMsIDEpICE9IDEpCisJCQkJYnJlYWs7IC8qIEVPRi9lcnJvciAqLworCQkJaWYgKGMgPT0gRy5pbml0X3NldHRpbmdzLmNfY2NbVklOVFJdKQorCQkJCWJyZWFrOyAvKiBeQyAqLworCQkJaWYgKChjIHwgMHgyMCkgPT0gJ3EnKQorCQkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJRy5jYW50X2VuYWJsZV90aW1lcl9zdGF0cyB8PSBzdG9wX3RpbWVyKCk7IC8qIDEgb24gZXJyb3IgKi8KKworCQljbGVhcl9saW5lcygpOworCQlwcm9jZXNzX2lycV9jb3VudHMoKTsKKworCQkvKiBDbGVhciB0aGUgc3RhdHMgKi8KKwkJbWVtc2V0KGN1cl9kdXJhdGlvbiwgMCwgc2l6ZW9mKGN1cl9kdXJhdGlvbikpOworCQltZW1zZXQoY3VyX3VzYWdlLCAwLCBzaXplb2YoY3VyX3VzYWdlKSk7CisKKwkJLyogUmVhZCB0aGVtICovCisJCXJlYWRfY3N0YXRlX2NvdW50cyhjdXJfdXNhZ2UsIGN1cl9kdXJhdGlvbik7CisKKwkJLyogQ291bnQgdG90YWx0aWNrcyBhbmQgdG90YWxldmVudHMgKi8KKwkJdG90YWx0aWNrcyA9IHRvdGFsZXZlbnRzID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9DU1RBVEVfQ09VTlQ7IGkrKykgeworCQkJaWYgKGN1cl91c2FnZVtpXSAhPSAwKSB7CisJCQkJdG90YWx0aWNrcyArPSBjdXJfZHVyYXRpb25baV0gLSBHLmxhc3RfZHVyYXRpb25baV07CisJCQkJdG90YWxldmVudHMgKz0gY3VyX3VzYWdlW2ldIC0gRy5sYXN0X3VzYWdlW2ldOworCQkJfQorCQl9CisKKwkJLyogQ2xlYXIgdGhlIHNjcmVlbiAqLworCQlwcmludGYoIlwwMzNbSFwwMzNbSiIpOworCisJCS8qIENsZWFyIEMtc3RhdGUgbGluZXMgKi8KKwkJbWVtc2V0KCZjc3RhdGVfbGluZXMsIDAsIHNpemVvZihjc3RhdGVfbGluZXMpKTsKKworCQlpZiAodG90YWxldmVudHMgPT0gMCAmJiBHLm1heGNzdGF0ZSA8PSAxKSB7CisJCQkvKiBUaGlzIHNob3VsZCBub3QgaGFwcGVuICovCisJCQlzdHJjcHkoY3N0YXRlX2xpbmVzWzBdLCAiQy1zdGF0ZSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlXG4iKTsKKwkJfSBlbHNlIHsKKwkJCWRvdWJsZSBwZXJjZW50YWdlOworCQkJdW5zaWduZWQgbmV3dGlja3M7CisKKwkJCW5ld3RpY2tzID0gRy50b3RhbF9jcHVzICogREVGQVVMVF9TTEVFUCAqIEZSRVFfQUNQSV8xMDAwIC0gdG90YWx0aWNrczsKKwkJCS8qIEhhbmRsZSByb3VuZGluZyBlcnJvcnM6IGRvIG5vdCBkaXNwbGF5IG5lZ2F0aXZlIHZhbHVlcyAqLworCQkJaWYgKChpbnQpbmV3dGlja3MgPCAwKQorCQkJCW5ld3RpY2tzID0gMDsKKworCQkJc3ByaW50Zihjc3RhdGVfbGluZXNbMF0sICJDblx0XHQgIEF2ZyByZXNpZGVuY3lcbiIpOworCQkJcGVyY2VudGFnZSA9IG5ld3RpY2tzICogMTAwLjAgLyAoRy50b3RhbF9jcHVzICogREVGQVVMVF9TTEVFUCAqIEZSRVFfQUNQSV8xMDAwKTsKKwkJCXNwcmludGYoY3N0YXRlX2xpbmVzWzFdLCAiQzAgKGNwdSBydW5uaW5nKSAgICAgICAgKCU0LjFmJSUpXG4iLCBwZXJjZW50YWdlKTsKKworCQkJLyogQ29tcHV0ZSB2YWx1ZXMgZm9yIGluZGl2aWR1YWwgQy1zdGF0ZXMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBNQVhfQ1NUQVRFX0NPVU5UOyBpKyspIHsKKwkJCQlpZiAoY3VyX3VzYWdlW2ldICE9IDApIHsKKwkJCQkJZG91YmxlIHNsZXB0OworCQkJCQlzbGVwdCA9IChjdXJfZHVyYXRpb25baV0gLSBHLmxhc3RfZHVyYXRpb25baV0pCisJCQkJCQkvIChjdXJfdXNhZ2VbaV0gLSBHLmxhc3RfdXNhZ2VbaV0gKyAwLjEpIC8gRlJFUV9BQ1BJOworCQkJCQlwZXJjZW50YWdlID0gKGN1cl9kdXJhdGlvbltpXSAtIEcubGFzdF9kdXJhdGlvbltpXSkgKiAxMDAKKwkJCQkJCS8gKEcudG90YWxfY3B1cyAqIERFRkFVTFRfU0xFRVAgKiBGUkVRX0FDUElfMTAwMCk7CisJCQkJCXNwcmludGYoY3N0YXRlX2xpbmVzW2kgKyAyXSwgIkMldVx0XHQlNS4xZm1zICglNC4xZiUlKVxuIiwKKwkJCQkJCWkgKyAxLCBzbGVwdCwgcGVyY2VudGFnZSk7CisJCQkJCS8vaWYgKG1heHNsZWVwIDwgc2xlcHQpCisJCQkJCS8vCW1heHNsZWVwID0gc2xlcHQ7CisJCQkJfQorCQkJfQorCQl9CisKKwkJZm9yIChpID0gMDsgaSA8IE1BWF9DU1RBVEVfQ09VTlQgKyAyOyBpKyspCisJCQlpZiAoY3N0YXRlX2xpbmVzW2ldWzBdKQorCQkJCWZwdXRzKGNzdGF0ZV9saW5lc1tpXSwgc3Rkb3V0KTsKKworCQlpID0gcHJvY2Vzc190aW1lcl9zdGF0cygpOworI2lmIEVOQUJMRV9GRUFUVVJFX1BPV0VSVE9QX1BST0NJUlEKKwkJaWYgKHRvdGFsZXZlbnRzID09IDApIHsKKwkJCS8qIE5vIEMtc3RhdGUgaW5mbyBhdmFpbGFibGUsIHVzZSB0aW1lcnN0YXRzICovCisJCQl0b3RhbGV2ZW50cyA9IGkgKiBHLnRvdGFsX2NwdXMgKyBHLnRvdGFsX2ludGVycnVwdDsKKwkJCWlmIChpIDwgMCkKKwkJCQl0b3RhbGV2ZW50cyArPSBHLmludGVycnVwdF8wIC0gaTsKKwkJfQorI2VuZGlmCisJCS8qIFVwc3RyZWFtIHBvd2VydG9wIHByaW50cyB3YWtldXBzIHBlciBzZWMgcGVyIENQVSwKKwkJICogd2UgcHJpbnQganVzdCByYXcgd2FrZXVwIGNvdW50cy4KKwkJICovCisvL1RPRE86IHNob3cgcmVhbCBzZWNvbmRzICh0aGluayBhYm91dCBtYW51YWwgcmVmcmVzaCkKKwkJcHJpbnRmKCJcbldha2V1cHMtZnJvbS1pZGxlIGluICV1IHNlY29uZHM6ICVsbHVcbiIsCisJCQlERUZBVUxUX1NMRUVQLAorCQkJdG90YWxldmVudHMKKwkJKTsKKworCQl1cGRhdGVfbGluZXNfY3VtdWxhdGl2ZV9jb3VudCgpOworCQlzb3J0X2xpbmVzKCk7CisJCXNob3dfdGltZXJzdGF0cygpOworCQlmZmx1c2goc3Rkb3V0KTsKKworCQkvKiBDbGVhciB0aGUgc3RhdHMgKi8KKwkJbWVtc2V0KGN1cl9kdXJhdGlvbiwgMCwgc2l6ZW9mKGN1cl9kdXJhdGlvbikpOworCQltZW1zZXQoY3VyX3VzYWdlLCAwLCBzaXplb2YoY3VyX3VzYWdlKSk7CisKKwkJLyogR2V0IG5ldyB2YWx1ZXMgKi8KKwkJcmVhZF9jc3RhdGVfY291bnRzKGN1cl91c2FnZSwgY3VyX2R1cmF0aW9uKTsKKworCQkvKiBTYXZlIHRoZW0gKi8KKwkJbWVtY3B5KEcubGFzdF91c2FnZSwgY3VyX3VzYWdlLCBzaXplb2YoRy5sYXN0X3VzYWdlKSk7CisJCW1lbWNweShHLmxhc3RfZHVyYXRpb24sIGN1cl9kdXJhdGlvbiwgc2l6ZW9mKEcubGFzdF9kdXJhdGlvbikpOworCX0gLyogZm9yICg7OykgKi8KKworCWJiX3B1dGNoYXIoJ1xuJyk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvcHJvY3BzL3BzLmMgYi9wcm9jcHMvcHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGU1Zjk0Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvY3BzL3BzLmMKQEAgLTAsMCArMSw4MDEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgcHMgaW1wbGVtZW50YXRpb24ocykgZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBGaXggZm9yIFNFTGludXggU3VwcG9ydDooYykyMDA3IEhpcm9zaGkgU2hpbmppIDxzaGlyb3NoaUBteS5lbWFpbC5uZS5qcD4KKyAqICAgICAgICAgICAgICAgICAgICAgICAgIChjKTIwMDcgWXVpY2hpIE5ha2FtdXJhIDx5bmFrYW1AaGl0YWNoaXNvZnQuanA+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNpZiBFTkFCTEVfREVTS1RPUAorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBwc190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1vIENPTDEsQ09MMj1IRUFERVJdIiBJRl9GRUFUVVJFX1NIT1dfVEhSRUFEUygiIFstVF0iKQorLy91c2FnZTojZGVmaW5lIHBzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2hvdyBsaXN0IG9mIHByb2Nlc3Nlc1xuIgorLy91c2FnZTogICAgICJcbgktbyBDT0wxLENPTDI9SEVBREVSCVNlbGVjdCBjb2x1bW5zIGZvciBkaXNwbGF5IgorLy91c2FnZToJSUZfRkVBVFVSRV9TSE9XX1RIUkVBRFMoCisvL3VzYWdlOiAgICAgIlxuCS1UCQkJU2hvdyB0aHJlYWRzIgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2Vsc2UgLyogIUVOQUJMRV9ERVNLVE9QICovCisvL3VzYWdlOgorLy91c2FnZTojaWYgIUVOQUJMRV9TRUxJTlVYICYmICFFTkFCTEVfRkVBVFVSRV9QU19XSURFCisvL3VzYWdlOiNkZWZpbmUgVVNBR0VfUFMgIlxuVGhpcyB2ZXJzaW9uIG9mIHBzIGFjY2VwdHMgbm8gb3B0aW9ucyIKKy8vdXNhZ2U6I2Vsc2UKKy8vdXNhZ2U6I2RlZmluZSBVU0FHRV9QUyAiIgorLy91c2FnZTojZW5kaWYKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgcHNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIiIKKy8vdXNhZ2U6I2RlZmluZSBwc19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNob3cgbGlzdCBvZiBwcm9jZXNzZXNcbiIKKy8vdXNhZ2U6CVVTQUdFX1BTCisvL3VzYWdlOglJRl9TRUxJTlVYKAorLy91c2FnZTogICAgICJcbgktWglTaG93IHNlbGludXggY29udGV4dCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfUFNfV0lERSgKKy8vdXNhZ2U6ICAgICAiXG4JdwlXaWRlIG91dHB1dCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfUFNfTE9ORygKKy8vdXNhZ2U6ICAgICAiXG4JbAlMb25nIG91dHB1dCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU0hPV19USFJFQURTKAorLy91c2FnZTogICAgICJcbglUCVNob3cgdGhyZWFkcyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CisvL3VzYWdlOiNlbmRpZiAvKiBFTkFCTEVfREVTS1RPUCAqLworLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBwc19leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBwc1xuIgorLy91c2FnZTogICAgICAgIiAgUElEICBVaWQgICAgICBHaWQgU3RhdGUgQ29tbWFuZFxuIgorLy91c2FnZTogICAgICAgIiAgICAxIHJvb3QgICAgIHJvb3QgICAgIFMgaW5pdFxuIgorLy91c2FnZTogICAgICAgIiAgICAyIHJvb3QgICAgIHJvb3QgICAgIFMgW2tmbHVzaGRdXG4iCisvL3VzYWdlOiAgICAgICAiICAgIDMgcm9vdCAgICAgcm9vdCAgICAgUyBba3VwZGF0ZV1cbiIKKy8vdXNhZ2U6ICAgICAgICIgICAgNCByb290ICAgICByb290ICAgICBTIFtrcGlvZF1cbiIKKy8vdXNhZ2U6ICAgICAgICIgICAgNSByb290ICAgICByb290ICAgICBTIFtrc3dhcGRdXG4iCisvL3VzYWdlOiAgICAgICAiICA3NDIgYW5kZXJzZW4gYW5kZXJzZW4gUyBbYmFzaF1cbiIKKy8vdXNhZ2U6ICAgICAgICIgIDc0MyBhbmRlcnNlbiBhbmRlcnNlbiBTIC1iYXNoXG4iCisvL3VzYWdlOiAgICAgICAiICA3NDUgcm9vdCAgICAgcm9vdCAgICAgUyBbZ2V0dHldXG4iCisvL3VzYWdlOiAgICAgICAiIDI5OTAgYW5kZXJzZW4gYW5kZXJzZW4gUiBwc1xuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZmRlZiBfX2xpbnV4X18KKyMgaW5jbHVkZSA8c3lzL3N5c2luZm8uaD4KKyNlbmRpZgorCisvKiBBYnNvbHV0ZSBtYXhpbXVtIG9uIG91dHB1dCBsaW5lIGxlbmd0aCAqLworZW51bSB7IE1BWF9XSURUSCA9IDIqMTAyNCB9OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfUFNfVElNRSB8fCBFTkFCTEVfRkVBVFVSRV9QU19MT05HCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfdXB0aW1lKHZvaWQpCit7CisjaWZkZWYgX19saW51eF9fCisJc3RydWN0IHN5c2luZm8gaW5mbzsKKwlpZiAoc3lzaW5mbygmaW5mbykgPCAwKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaW5mby51cHRpbWU7CisjZWxpZiAxCisJdW5zaWduZWQgbG9uZyB1cHRpbWU7CisJY2hhciBidWZbc2l6ZW9mKHVwdGltZSkqMyArIDJdOworCS8qIC9wcm9jL3VwdGltZSBpcyAiVVBUSU1FX1NFQy5OTiBJRExFX1NFQy5OTlxuIgorCSAqICh3aGVyZSBJRExFIGlzIGN1bXVsYXRpdmUgb3ZlciBhbGwgQ1BVcykKKwkgKi8KKwlpZiAob3Blbl9yZWFkX2Nsb3NlKCIvcHJvYy91cHRpbWUiLCBidWYsIHNpemVvZihidWYpKSA8PSAwKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJlYWQgJyVzJyIsICIvcHJvYy91cHRpbWUiKTsKKwlidWZbc2l6ZW9mKGJ1ZiktMV0gPSAnXDAnOworCXNzY2FuZihidWYsICIlbHUiLCAmdXB0aW1lKTsKKwlyZXR1cm4gdXB0aW1lOworI2Vsc2UKKwlzdHJ1Y3QgdGltZXNwZWMgdHM7CisJaWYgKGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpIDwgMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHRzLnR2X3NlYzsKKyNlbmRpZgorfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfREVTS1RPUAorCisjaW5jbHVkZSA8c3lzL3RpbWVzLmg+IC8qIGZvciB0aW1lcygpICovCisjaWZuZGVmIEFUX0NMS1RDSworIyBkZWZpbmUgQVRfQ0xLVENLIDE3CisjZW5kaWYKKworLyogVE9ETzoKKyAqIGh0dHA6Ly9wdWJzLm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9wcy5odG1sCisgKiBzcGVjaWZpZXMgKGZvciBYU0ktY29uZm9ybWFudCBzeXN0ZW1zKSBmb2xsb3dpbmcgZGVmYXVsdCBjb2x1bW5zCisgKiAobCBhbmQgZiBtYXJrIGNvbHVtbnMgc2hvd24gd2l0aCAtbCBhbmQgLWYgcmVzcGVjdGl2ZWx5KToKKyAqIEYgICAgIGwgICBGbGFncyAob2N0YWwgYW5kIGFkZGl0aXZlKSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb2Nlc3MgKD8/KQorICogUyAgICAgbCAgIFRoZSBzdGF0ZSBvZiB0aGUgcHJvY2VzcworICogVUlEICAgZixsIFRoZSB1c2VyIElEOyB0aGUgbG9naW4gbmFtZSBpcyBwcmludGVkIHdpdGggLWYKKyAqIFBJRCAgICAgICBUaGUgcHJvY2VzcyBJRAorICogUFBJRCAgZixsIFRoZSBwYXJlbnQgcHJvY2VzcworICogQyAgICAgZixsIFByb2Nlc3NvciB1dGlsaXphdGlvbgorICogUFJJICAgbCAgIFRoZSBwcmlvcml0eSBvZiB0aGUgcHJvY2VzczsgaGlnaGVyIG51bWJlcnMgbWVhbiBsb3dlciBwcmlvcml0eQorICogTkkgICAgbCAgIE5pY2UgdmFsdWUKKyAqIEFERFIgIGwgICBUaGUgYWRkcmVzcyBvZiB0aGUgcHJvY2VzcworICogU1ogICAgbCAgIFRoZSBzaXplIGluIGJsb2NrcyBvZiB0aGUgY29yZSBpbWFnZSBvZiB0aGUgcHJvY2VzcworICogV0NIQU4gbCAgIFRoZSBldmVudCBmb3Igd2hpY2ggdGhlIHByb2Nlc3MgaXMgd2FpdGluZyBvciBzbGVlcGluZworICogU1RJTUUgZiAgIFN0YXJ0aW5nIHRpbWUgb2YgdGhlIHByb2Nlc3MKKyAqIFRUWSAgICAgICBUaGUgY29udHJvbGxpbmcgdGVybWluYWwgZm9yIHRoZSBwcm9jZXNzCisgKiBUSU1FICAgICAgVGhlIGN1bXVsYXRpdmUgZXhlY3V0aW9uIHRpbWUgZm9yIHRoZSBwcm9jZXNzCisgKiBDTUQgICAgICAgVGhlIGNvbW1hbmQgbmFtZTsgdGhlIGZ1bGwgY29tbWFuZCBsaW5lIGlzIHNob3duIHdpdGggLWYKKyAqLwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQxNl90IHdpZHRoOworCWNoYXIgbmFtZTZbNl07CisJY29uc3QgY2hhciAqaGVhZGVyOworCXZvaWQgKCpmKShjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKTsKKwlpbnQgcHNfZmxhZ3M7Cit9IHBzX291dF90OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJcHNfb3V0X3QqIG91dDsKKwlpbnQgb3V0X2NudDsKKwlpbnQgcHJpbnRfaGVhZGVyOworCWludCBuZWVkX2ZsYWdzOworCWNoYXIgKmJ1ZmZlcjsKKwl1bnNpZ25lZCB0ZXJtaW5hbF93aWR0aDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9QU19USU1FCisJdW5zaWduZWQga2VybmVsX0haOworCXVuc2lnbmVkIGxvbmcgc2Vjb25kc19zaW5jZV9ib290OworI2VuZGlmCit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBvdXQgICAgICAgICAgICAgICAgKEcub3V0ICAgICAgICAgICAgICAgKQorI2RlZmluZSBvdXRfY250ICAgICAgICAgICAgKEcub3V0X2NudCAgICAgICAgICAgKQorI2RlZmluZSBwcmludF9oZWFkZXIgICAgICAgKEcucHJpbnRfaGVhZGVyICAgICAgKQorI2RlZmluZSBuZWVkX2ZsYWdzICAgICAgICAgKEcubmVlZF9mbGFncyAgICAgICAgKQorI2RlZmluZSBidWZmZXIgICAgICAgICAgICAgKEcuYnVmZmVyICAgICAgICAgICAgKQorI2RlZmluZSB0ZXJtaW5hbF93aWR0aCAgICAgKEcudGVybWluYWxfd2lkdGggICAgKQorI2RlZmluZSBrZXJuZWxfSFogICAgICAgICAgKEcua2VybmVsX0haICAgICAgICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IH0gd2hpbGUgKDApCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9QU19USU1FCisvKiBmb3IgRUxGIGV4ZWN1dGFibGVzLCBub3RlcyBhcmUgcHVzaGVkIGJlZm9yZSBlbnZpcm9ubWVudCBhbmQgYXJncyAqLworc3RhdGljIHVpbnRwdHJfdCBmaW5kX2VsZl9ub3RlKHVpbnRwdHJfdCBmaW5kbWUpCit7CisJdWludHB0cl90ICplcCA9ICh1aW50cHRyX3QgKikgZW52aXJvbjsKKworCXdoaWxlICgqZXArKykKKwkJY29udGludWU7CisJd2hpbGUgKCplcCkgeworCQlpZiAoZXBbMF0gPT0gZmluZG1lKSB7CisJCQlyZXR1cm4gZXBbMV07CisJCX0KKwkJZXAgKz0gMjsKKwl9CisJcmV0dXJuIC0xOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfUFNfVU5VU1VBTF9TWVNURU1TCitzdGF0aWMgdW5zaWduZWQgZ2V0X0haX2J5X3dhaXRpbmcodm9pZCkKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djEsIHR2MjsKKwl1bnNpZ25lZCB0MSwgdDIsIHIsIGh6OworCXVuc2lnbmVkIGNudCA9IGNudDsgLyogZm9yIGNvbXBpbGVyICovCisJaW50IGRpZmY7CisKKwlyID0gMDsKKworCS8qIFdhaXQgZm9yIHRpbWVzKCkgdG8gcmVhY2ggbmV3IHRpY2sgKi8KKwl0MSA9IHRpbWVzKE5VTEwpOworCWRvIHsKKwkJdDIgPSB0aW1lcyhOVUxMKTsKKwl9IHdoaWxlICh0MiA9PSB0MSk7CisJZ2V0dGltZW9mZGF5KCZ0djIsIE5VTEwpOworCisJZG8geworCQl0MSA9IHQyOworCQl0djEudHZfdXNlYyA9IHR2Mi50dl91c2VjOworCisJCS8qIFdhaXQgZXhhY3RseSBvbmUgdGltZXMoKSB0aWNrICovCisJCWRvIHsKKwkJCXQyID0gdGltZXMoTlVMTCk7CisJCX0gd2hpbGUgKHQyID09IHQxKTsKKwkJZ2V0dGltZW9mZGF5KCZ0djIsIE5VTEwpOworCisJCS8qIENhbGN1bGF0ZSB0aWNrcyBwZXIgc2VjLCByb3VuZGluZyB1cCB0byBldmVuICovCisJCWRpZmYgPSB0djIudHZfdXNlYyAtIHR2MS50dl91c2VjOworCQlpZiAoZGlmZiA8PSAwKSBkaWZmICs9IDEwMDAwMDA7CisJCWh6ID0gMTAwMDAwMHUgLyAodW5zaWduZWQpZGlmZjsKKwkJaHogPSAoaHorMSkgJiB+MTsKKworCQkvKiBDb3VudCBob3cgbWFueSBzYW1lIGh6IHZhbHVlcyB3ZSBzYXcgKi8KKwkJaWYgKHIgIT0gaHopIHsKKwkJCXIgPSBoejsKKwkJCWNudCA9IDA7CisJCX0KKwkJY250Kys7CisJfSB3aGlsZSAoY250IDwgMyk7IC8qIGV4aXQgaWYgc2F3IDMgc2FtZSB2YWx1ZXMgKi8KKworCXJldHVybiByOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZ2V0X0haX2J5X3dhaXRpbmcodm9pZCkKK3sKKwkvKiBCZXR0ZXIgbWV0aG9kPyAqLworCXJldHVybiAxMDA7Cit9CisjZW5kaWYKKworc3RhdGljIHVuc2lnbmVkIGdldF9rZXJuZWxfSFoodm9pZCkKK3sKKwlpZiAoa2VybmVsX0haKQorCQlyZXR1cm4ga2VybmVsX0haOworCisJLyogV29ya3MgZm9yIEVMRiBvbmx5LCBMaW51eCAyLjQuMCsgKi8KKwlrZXJuZWxfSFogPSBmaW5kX2VsZl9ub3RlKEFUX0NMS1RDSyk7CisJaWYgKGtlcm5lbF9IWiA9PSAodW5zaWduZWQpLTEpCisJCWtlcm5lbF9IWiA9IGdldF9IWl9ieV93YWl0aW5nKCk7CisKKwlHLnNlY29uZHNfc2luY2VfYm9vdCA9IGdldF91cHRpbWUoKTsKKworCXJldHVybiBrZXJuZWxfSFo7Cit9CisjZW5kaWYKKworLyogUHJpbnQgdmFsdWUgdG8gYnVmLCBtYXggc2l6ZSsxIGNoYXJzIChpbmNsdWRpbmcgdHJhaWxpbmcgJ1wwJykgKi8KKworc3RhdGljIHZvaWQgZnVuY191c2VyKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisjaWYgMQorCXNhZmVfc3RybmNweShidWYsIGdldF9jYWNoZWRfdXNlcm5hbWUocHMtPnVpZCksIHNpemUrMSk7CisjZWxzZQorCS8qICJjb21wYXRpYmxlIiB2ZXJzaW9uLCBidXQgaXQncyBsYXJnZXIgKi8KKwkvKiBwcm9jcHMgMi4xOCBzaG93cyBudW1lcmljIFVJRCBpZiBuYW1lIG92ZXJmbG93cyB0aGUgZmllbGQgKi8KKwkvKiBUT0RPOiBnZXRfY2FjaGVkX3VzZXJuYW1lKCkgcmV0dXJucyBudW1lcmljIHN0cmluZyBpZgorCSAqIHVzZXIgaGFzIG5vIHBhc3N3ZCByZWNvcmQsIHdlIHdpbGwgZGlzcGxheSBpdAorCSAqIGxlZnQtanVzdGlmaWVkIGhlcmU7IHRvbyBsb25nIHVzZXJuYW1lcyBhcmUgc2hvd24KKwkgKiBhcyBfcmlnaHQtanVzdGlmaWVkXyBJRHMuIElzIGl0IHdvcnRoIGZpeGluZz8gKi8KKwljb25zdCBjaGFyICp1c2VyID0gZ2V0X2NhY2hlZF91c2VybmFtZShwcy0+dWlkKTsKKwlpZiAoc3RybGVuKHVzZXIpIDw9IHNpemUpCisJCXNhZmVfc3RybmNweShidWYsIHVzZXIsIHNpemUrMSk7CisJZWxzZQorCQlzcHJpbnRmKGJ1ZiwgIiUqdSIsIHNpemUsICh1bnNpZ25lZClwcy0+dWlkKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBmdW5jX2dyb3VwKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisJc2FmZV9zdHJuY3B5KGJ1ZiwgZ2V0X2NhY2hlZF9ncm91cG5hbWUocHMtPmdpZCksIHNpemUrMSk7Cit9CisKK3N0YXRpYyB2b2lkIGZ1bmNfY29tbShjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworCXNhZmVfc3RybmNweShidWYsIHBzLT5jb21tLCBzaXplKzEpOworfQorCitzdGF0aWMgdm9pZCBmdW5jX3N0YXRlKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisJc2FmZV9zdHJuY3B5KGJ1ZiwgcHMtPnN0YXRlLCBzaXplKzEpOworfQorCitzdGF0aWMgdm9pZCBmdW5jX2FyZ3MoY2hhciAqYnVmLCBpbnQgc2l6ZSwgY29uc3QgcHJvY3BzX3N0YXR1c190ICpwcykKK3sKKwlyZWFkX2NtZGxpbmUoYnVmLCBzaXplKzEsIHBzLT5waWQsIHBzLT5jb21tKTsKK30KKworc3RhdGljIHZvaWQgZnVuY19waWQoY2hhciAqYnVmLCBpbnQgc2l6ZSwgY29uc3QgcHJvY3BzX3N0YXR1c190ICpwcykKK3sKKwlzcHJpbnRmKGJ1ZiwgIiUqdSIsIHNpemUsIHBzLT5waWQpOworfQorCitzdGF0aWMgdm9pZCBmdW5jX3BwaWQoY2hhciAqYnVmLCBpbnQgc2l6ZSwgY29uc3QgcHJvY3BzX3N0YXR1c190ICpwcykKK3sKKwlzcHJpbnRmKGJ1ZiwgIiUqdSIsIHNpemUsIHBzLT5wcGlkKTsKK30KKworc3RhdGljIHZvaWQgZnVuY19wZ2lkKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisJc3ByaW50ZihidWYsICIlKnUiLCBzaXplLCBwcy0+cGdpZCk7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9sdShjaGFyICpidWYsIGludCBzaXplLCB1bnNpZ25lZCBsb25nIHUpCit7CisJY2hhciBidWY0WzVdOworCisJLyogc2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVGVyYSAqLworCXNtYXJ0X3VsbHRvYTQodSwgYnVmNCwgIiBtZ3RwZXp5IilbMF0gPSAnXDAnOworCXNwcmludGYoYnVmLCAiJS4qcyIsIHNpemUsIGJ1ZjQpOworfQorCitzdGF0aWMgdm9pZCBmdW5jX3ZzeihjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworCXB1dF9sdShidWYsIHNpemUsIHBzLT52c3opOworfQorCitzdGF0aWMgdm9pZCBmdW5jX3JzcyhjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworCXB1dF9sdShidWYsIHNpemUsIHBzLT5yc3MpOworfQorCitzdGF0aWMgdm9pZCBmdW5jX3R0eShjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworCWJ1ZlswXSA9ICc/JzsKKwlidWZbMV0gPSAnXDAnOworCWlmIChwcy0+dHR5X21ham9yKSAvKiB0dHkgZmllbGQgb2YgIjAiIG1lYW5zICJubyB0dHkiICovCisJCXNucHJpbnRmKGJ1Ziwgc2l6ZSsxLCAiJXUsJXUiLCBwcy0+dHR5X21ham9yLCBwcy0+dHR5X21pbm9yKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1BTX0FERElUSU9OQUxfQ09MVU1OUworCitzdGF0aWMgdm9pZCBmdW5jX3Jncm91cChjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworCXNhZmVfc3RybmNweShidWYsIGdldF9jYWNoZWRfZ3JvdXBuYW1lKHBzLT5yZ2lkKSwgc2l6ZSsxKTsKK30KKworc3RhdGljIHZvaWQgZnVuY19ydXNlcihjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworCXNhZmVfc3RybmNweShidWYsIGdldF9jYWNoZWRfdXNlcm5hbWUocHMtPnJ1aWQpLCBzaXplKzEpOworfQorCitzdGF0aWMgdm9pZCBmdW5jX25pY2UoY2hhciAqYnVmLCBpbnQgc2l6ZSwgY29uc3QgcHJvY3BzX3N0YXR1c190ICpwcykKK3sKKwlzcHJpbnRmKGJ1ZiwgIiUqZCIsIHNpemUsIHBzLT5uaWNlbmVzcyk7Cit9CisKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfUFNfVElNRQorCitzdGF0aWMgdm9pZCBmdW5jX2V0aW1lKGNoYXIgKmJ1ZiwgaW50IHNpemUsIGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisJLyogZWxhcHNlZCB0aW1lIFtbZGQtXWhoOl1tbTpzczsgaGVyZSBvbmx5IG1tOnNzICovCisJdW5zaWduZWQgbG9uZyBtbTsKKwl1bnNpZ25lZCBzczsKKworCW1tID0gcHMtPnN0YXJ0X3RpbWUgLyBnZXRfa2VybmVsX0haKCk7CisJLyogbXVzdCBiZSBhZnRlciBnZXRfa2VybmVsX0haKCkhICovCisJbW0gPSBHLnNlY29uZHNfc2luY2VfYm9vdCAtIG1tOworCXNzID0gbW0gJSA2MDsKKwltbSAvPSA2MDsKKwlzbnByaW50ZihidWYsIHNpemUrMSwgIiUzbHU6JTAydSIsIG1tLCBzcyk7Cit9CisKK3N0YXRpYyB2b2lkIGZ1bmNfdGltZShjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworCS8qIGN1bXVsYXRpdmUgdGltZSBbW2RkLV1oaDpdbW06c3M7IGhlcmUgb25seSBtbTpzcyAqLworCXVuc2lnbmVkIGxvbmcgbW07CisJdW5zaWduZWQgc3M7CisKKwltbSA9IChwcy0+dXRpbWUgKyBwcy0+c3RpbWUpIC8gZ2V0X2tlcm5lbF9IWigpOworCXNzID0gbW0gJSA2MDsKKwltbSAvPSA2MDsKKwlzbnByaW50ZihidWYsIHNpemUrMSwgIiUzbHU6JTAydSIsIG1tLCBzcyk7Cit9CisKKyNlbmRpZgorCisjaWYgRU5BQkxFX1NFTElOVVgKK3N0YXRpYyB2b2lkIGZ1bmNfbGFiZWwoY2hhciAqYnVmLCBpbnQgc2l6ZSwgY29uc3QgcHJvY3BzX3N0YXR1c190ICpwcykKK3sKKwlzYWZlX3N0cm5jcHkoYnVmLCBwcy0+Y29udGV4dCA/IHBzLT5jb250ZXh0IDogInVua25vd24iLCBzaXplKzEpOworfQorI2VuZGlmCisKKy8qCitzdGF0aWMgdm9pZCBmdW5jX25pY2UoY2hhciAqYnVmLCBpbnQgc2l6ZSwgY29uc3QgcHJvY3BzX3N0YXR1c190ICpwcykKK3sKKwlwcy0+Pz8/Cit9CisKK3N0YXRpYyB2b2lkIGZ1bmNfcGNwdShjaGFyICpidWYsIGludCBzaXplLCBjb25zdCBwcm9jcHNfc3RhdHVzX3QgKnBzKQoreworfQorKi8KKworc3RhdGljIGNvbnN0IHBzX291dF90IG91dF9zcGVjW10gPSB7CisvKiBNYW5kYXRlZCBieSBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvcHMuaHRtbDogKi8KKwl7IDggICAgICAgICAgICAgICAgICAsICJ1c2VyIiAgLCJVU0VSIiAgICxmdW5jX3VzZXIgICxQU1NDQU5fVUlER0lEICB9LAorCXsgOCAgICAgICAgICAgICAgICAgICwgImdyb3VwIiAsIkdST1VQIiAgLGZ1bmNfZ3JvdXAgLFBTU0NBTl9VSURHSUQgIH0sCisJeyAxNiAgICAgICAgICAgICAgICAgLCAiY29tbSIgICwiQ09NTUFORCIsZnVuY19jb21tICAsUFNTQ0FOX0NPTU0gICAgfSwKKwl7IE1BWF9XSURUSCAgICAgICAgICAsICJhcmdzIiAgLCJDT01NQU5EIixmdW5jX2FyZ3MgICxQU1NDQU5fQ09NTSAgICB9LAorCXsgNSAgICAgICAgICAgICAgICAgICwgInBpZCIgICAsIlBJRCIgICAgLGZ1bmNfcGlkICAgLFBTU0NBTl9QSUQgICAgIH0sCisJeyA1ICAgICAgICAgICAgICAgICAgLCAicHBpZCIgICwiUFBJRCIgICAsZnVuY19wcGlkICAsUFNTQ0FOX1BQSUQgICAgfSwKKwl7IDUgICAgICAgICAgICAgICAgICAsICJwZ2lkIiAgLCJQR0lEIiAgICxmdW5jX3BnaWQgICxQU1NDQU5fUEdJRCAgICB9LAorI2lmIEVOQUJMRV9GRUFUVVJFX1BTX1RJTUUKKwl7IHNpemVvZigiRUxBUFNFRCIpLTEsICJldGltZSIgLCJFTEFQU0VEIixmdW5jX2V0aW1lICxQU1NDQU5fU1RBUlRfVElNRSB9LAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfUFNfQURESVRJT05BTF9DT0xVTU5TCisJeyA1ICAgICAgICAgICAgICAgICAgLCAibmljZSIgICwiTkkiICAgICAsZnVuY19uaWNlICAsUFNTQ0FOX05JQ0UgICAgfSwKKwl7IDggICAgICAgICAgICAgICAgICAsICJyZ3JvdXAiLCJSR1JPVVAiICxmdW5jX3Jncm91cCxQU1NDQU5fUlVJREdJRCB9LAorCXsgOCAgICAgICAgICAgICAgICAgICwgInJ1c2VyIiAsIlJVU0VSIiAgLGZ1bmNfcnVzZXIgLFBTU0NBTl9SVUlER0lEIH0sCisvLwl7IDUgICAgICAgICAgICAgICAgICAsICJwY3B1IiAgLCIlQ1BVIiAgICxmdW5jX3BjcHUgICxQU1NDQU5fICAgICAgICB9LAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfUFNfVElNRQorCXsgNiAgICAgICAgICAgICAgICAgICwgInRpbWUiICAsIlRJTUUiICAgLGZ1bmNfdGltZSAgLFBTU0NBTl9TVElNRSB8IFBTU0NBTl9VVElNRSB9LAorI2VuZGlmCisJeyA2ICAgICAgICAgICAgICAgICAgLCAidHR5IiAgICwiVFQiICAgICAsZnVuY190dHkgICAsUFNTQ0FOX1RUWSAgICAgfSwKKwl7IDQgICAgICAgICAgICAgICAgICAsICJ2c3oiICAgLCJWU1oiICAgICxmdW5jX3ZzeiAgICxQU1NDQU5fVlNaICAgICB9LAorLyogTm90IG1hbmRhdGVkLCBidXQgdXNlZnVsOiAqLworCXsgNCAgICAgICAgICAgICAgICAgICwgInN0YXQiICAsIlNUQVQiICAgLGZ1bmNfc3RhdGUgLFBTU0NBTl9TVEFURSAgIH0sCisJeyA0ICAgICAgICAgICAgICAgICAgLCAicnNzIiAgICwiUlNTIiAgICAsZnVuY19yc3MgICAsUFNTQ0FOX1JTUyAgICAgfSwKKyNpZiBFTkFCTEVfU0VMSU5VWAorCXsgMzUgICAgICAgICAgICAgICAgICwgImxhYmVsIiAsIkxBQkVMIiAgLGZ1bmNfbGFiZWwgLFBTU0NBTl9DT05URVhUIH0sCisjZW5kaWYKK307CisKK3N0YXRpYyBwc19vdXRfdCogbmV3X291dF90KHZvaWQpCit7CisJb3V0ID0geHJlYWxsb2NfdmVjdG9yKG91dCwgMiwgb3V0X2NudCk7CisJcmV0dXJuICZvdXRbb3V0X2NudCsrXTsKK30KKworc3RhdGljIGNvbnN0IHBzX291dF90KiBmaW5kX291dF9zcGVjKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJdW5zaWduZWQgaTsKKwljaGFyIGJ1ZltBUlJBWV9TSVpFKG91dF9zcGVjKSo3ICsgMV07CisJY2hhciAqcCA9IGJ1ZjsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG91dF9zcGVjKTsgaSsrKSB7CisJCWlmIChzdHJuY21wKG5hbWUsIG91dF9zcGVjW2ldLm5hbWU2LCA2KSA9PSAwKQorCQkJcmV0dXJuICZvdXRfc3BlY1tpXTsKKwkJcCArPSBzcHJpbnRmKHAsICIlLjZzLCIsIG91dF9zcGVjW2ldLm5hbWU2KTsKKwl9CisJcFstMV0gPSAnXDAnOworCWJiX2Vycm9yX21zZ19hbmRfZGllKCJiYWQgLW8gYXJndW1lbnQgJyVzJywgc3VwcG9ydGVkIGFyZ3VtZW50czogJXMiLCBuYW1lLCBidWYpOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9vKGNoYXIqIG9wdCkKK3sKKwlwc19vdXRfdCogbmV3OworCS8vIFBPU0lYOiAiLW8gaXMgYmxhbmstIG9yIGNvbW1hLXNlcGFyYXRlZCBsaXN0IiAoRklYTUUpCisJY2hhciAqY29tbWEsICplcXVhbDsKKwl3aGlsZSAoMSkgeworCQljb21tYSA9IHN0cmNocihvcHQsICcsJyk7CisJCWVxdWFsID0gc3RyY2hyKG9wdCwgJz0nKTsKKwkJaWYgKGNvbW1hICYmICghZXF1YWwgfHwgZXF1YWwgPiBjb21tYSkpIHsKKwkJCSpjb21tYSA9ICdcMCc7CisJCQkqbmV3X291dF90KCkgPSAqZmluZF9vdXRfc3BlYyhvcHQpOworCQkJKmNvbW1hID0gJywnOworCQkJb3B0ID0gY29tbWEgKyAxOworCQkJY29udGludWU7CisJCX0KKwkJYnJlYWs7CisJfQorCS8vIG9wdCBwb2ludHMgdG8gbGFzdCBzcGVjIGluIGNvbW1hIHNlcGFyYXRlZCBsaXN0LgorCS8vIFRoaXMgb25lIGNhbiBoYXZlID1IRUFERVIgcGFydC4KKwluZXcgPSBuZXdfb3V0X3QoKTsKKwlpZiAoZXF1YWwpCisJCSplcXVhbCA9ICdcMCc7CisJKm5ldyA9ICpmaW5kX291dF9zcGVjKG9wdCk7CisJaWYgKGVxdWFsKSB7CisJCSplcXVhbCA9ICc9JzsKKwkJbmV3LT5oZWFkZXIgPSBlcXVhbCArIDE7CisJCS8vIFBPU0lYOiB0aGUgZmllbGQgd2lkdGhzIHNoYWxsIGJlIC4uLiBhdCBsZWFzdCBhcyB3aWRlIGFzCisJCS8vIHRoZSBoZWFkZXIgdGV4dCAoZGVmYXVsdCBvciBvdmVycmlkZGVuIHZhbHVlKS4KKwkJLy8gSWYgdGhlIGhlYWRlciB0ZXh0IGlzIG51bGwsIHN1Y2ggYXMgLW8gdXNlcj0sCisJCS8vIHRoZSBmaWVsZCB3aWR0aCBzaGFsbCBiZSBhdCBsZWFzdCBhcyB3aWRlIGFzIHRoZQorCQkvLyBkZWZhdWx0IGhlYWRlciB0ZXh0CisJCWlmIChuZXctPmhlYWRlclswXSkgeworCQkJbmV3LT53aWR0aCA9IHN0cmxlbihuZXctPmhlYWRlcik7CisJCQlwcmludF9oZWFkZXIgPSAxOworCQl9CisJfSBlbHNlCisJCXByaW50X2hlYWRlciA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGFsbG9jX2xpbmVfYnVmZmVyKHZvaWQpCit7CisJaW50IGk7CisJaW50IHdpZHRoID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgb3V0X2NudDsgaSsrKSB7CisJCW5lZWRfZmxhZ3MgfD0gb3V0W2ldLnBzX2ZsYWdzOworCQlpZiAob3V0W2ldLmhlYWRlclswXSkgeworCQkJcHJpbnRfaGVhZGVyID0gMTsKKwkJfQorCQl3aWR0aCArPSBvdXRbaV0ud2lkdGggKyAxOyAvKiAiRklFTEQgIiAqLworCQlpZiAoKGludCkod2lkdGggLSB0ZXJtaW5hbF93aWR0aCkgPiAwKSB7CisJCQkvKiBUaGUgcmVzdCBkb2VzIG5vdCBmaXQgb24gdGhlIHNjcmVlbiAqLworCQkJLy9vdXRbaV0ud2lkdGggLT0gKHdpZHRoIC0gdGVybWluYWxfd2lkdGggLSAxKTsKKwkJCW91dF9jbnQgPSBpICsgMTsKKwkJCWJyZWFrOworCQl9CisJfQorI2lmIEVOQUJMRV9TRUxJTlVYCisJaWYgKCFpc19zZWxpbnV4X2VuYWJsZWQoKSkKKwkJbmVlZF9mbGFncyAmPSB+UFNTQ0FOX0NPTlRFWFQ7CisjZW5kaWYKKwlidWZmZXIgPSB4bWFsbG9jKHdpZHRoICsgMSk7IC8qIGZvciB0cmFpbGluZyBcMCAqLworfQorCitzdGF0aWMgdm9pZCBmb3JtYXRfaGVhZGVyKHZvaWQpCit7CisJaW50IGk7CisJcHNfb3V0X3QqIG9wOworCWNoYXIgKnA7CisKKwlpZiAoIXByaW50X2hlYWRlcikKKwkJcmV0dXJuOworCXAgPSBidWZmZXI7CisJaSA9IDA7CisJaWYgKG91dF9jbnQpIHsKKwkJd2hpbGUgKDEpIHsKKwkJCW9wID0gJm91dFtpXTsKKwkJCWlmICgrK2kgPT0gb3V0X2NudCkgLyogZG8gbm90IHBhZCBsYXN0IGZpZWxkICovCisJCQkJYnJlYWs7CisJCQlwICs9IHNwcmludGYocCwgIiUtKnMgIiwgb3AtPndpZHRoLCBvcC0+aGVhZGVyKTsKKwkJfQorCQlzdHJjcHkocCwgb3AtPmhlYWRlcik7CisJfQorCXByaW50ZigiJS4qc1xuIiwgdGVybWluYWxfd2lkdGgsIGJ1ZmZlcik7Cit9CisKK3N0YXRpYyB2b2lkIGZvcm1hdF9wcm9jZXNzKGNvbnN0IHByb2Nwc19zdGF0dXNfdCAqcHMpCit7CisJaW50IGksIGxlbjsKKwljaGFyICpwID0gYnVmZmVyOworCWkgPSAwOworCWlmIChvdXRfY250KSB3aGlsZSAoMSkgeworCQlvdXRbaV0uZihwLCBvdXRbaV0ud2lkdGgsIHBzKTsKKwkJLy8gUE9TSVg6IEFueSBmaWVsZCBuZWVkIG5vdCBiZSBtZWFuaW5nZnVsIGluIGFsbAorCQkvLyBpbXBsZW1lbnRhdGlvbnMuIEluIHN1Y2ggYSBjYXNlIGEgaHlwaGVuICggJy0nICkKKwkJLy8gc2hvdWxkIGJlIG91dHB1dCBpbiBwbGFjZSBvZiB0aGUgZmllbGQgdmFsdWUuCisJCWlmICghcFswXSkgeworCQkJcFswXSA9ICctJzsKKwkJCXBbMV0gPSAnXDAnOworCQl9CisJCWxlbiA9IHN0cmxlbihwKTsKKwkJcCArPSBsZW47CisJCWxlbiA9IG91dFtpXS53aWR0aCAtIGxlbiArIDE7CisJCWlmICgrK2kgPT0gb3V0X2NudCkgLyogZG8gbm90IHBhZCBsYXN0IGZpZWxkICovCisJCQlicmVhazsKKwkJcCArPSBzcHJpbnRmKHAsICIlKnMiLCBsZW4sICIiKTsKKwl9CisJcHJpbnRmKCIlLipzXG4iLCB0ZXJtaW5hbF93aWR0aCwgYnVmZmVyKTsKK30KKworI2lmIEVOQUJMRV9TRUxJTlVYCisjIGRlZmluZSBTRUxJTlVYX09fUFJFRklYICJsYWJlbCwiCisjIGRlZmluZSBERUZBVUxUX09fU1RSICAgIChTRUxJTlVYX09fUFJFRklYICJwaWQsdXNlciIgSUZfRkVBVFVSRV9QU19USU1FKCIsdGltZSIpICIsYXJncyIpCisjZWxzZQorIyBkZWZpbmUgREVGQVVMVF9PX1NUUiAgICAoInBpZCx1c2VyIiBJRl9GRUFUVVJFX1BTX1RJTUUoIix0aW1lIikgIixhcmdzIikKKyNlbmRpZgorCitpbnQgcHNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHBzX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlwcm9jcHNfc3RhdHVzX3QgKnA7CisJbGxpc3RfdCogb3B0X28gPSBOVUxMOworCWNoYXIgZGVmYXVsdF9vW3NpemVvZihERUZBVUxUX09fU1RSKV07CisJaW50IG9wdDsKKwllbnVtIHsKKwkJT1BUX1ogPSAoMSA8PCAwKSwKKwkJT1BUX28gPSAoMSA8PCAxKSwKKwkJT1BUX2EgPSAoMSA8PCAyKSwKKwkJT1BUX0EgPSAoMSA8PCAzKSwKKwkJT1BUX2QgPSAoMSA8PCA0KSwKKwkJT1BUX2UgPSAoMSA8PCA1KSwKKwkJT1BUX2YgPSAoMSA8PCA2KSwKKwkJT1BUX2wgPSAoMSA8PCA3KSwKKwkJT1BUX1QgPSAoMSA8PCA4KSAqIEVOQUJMRV9GRUFUVVJFX1NIT1dfVEhSRUFEUywKKwl9OworCisJSU5JVF9HKCk7CisKKwkvLyBQT1NJWDoKKwkvLyAtYSAgV3JpdGUgaW5mb3JtYXRpb24gZm9yIGFsbCBwcm9jZXNzZXMgYXNzb2NpYXRlZCB3aXRoIHRlcm1pbmFscworCS8vICAgICBJbXBsZW1lbnRhdGlvbnMgbWF5IG9taXQgc2Vzc2lvbiBsZWFkZXJzIGZyb20gdGhpcyBsaXN0CisJLy8gLUEgIFdyaXRlIGluZm9ybWF0aW9uIGZvciBhbGwgcHJvY2Vzc2VzCisJLy8gLWQgIFdyaXRlIGluZm9ybWF0aW9uIGZvciBhbGwgcHJvY2Vzc2VzLCBleGNlcHQgc2Vzc2lvbiBsZWFkZXJzCisJLy8gLWUgIFdyaXRlIGluZm9ybWF0aW9uIGZvciBhbGwgcHJvY2Vzc2VzIChlcXVpdmFsZW50IHRvIC1BKQorCS8vIC1mICBHZW5lcmF0ZSBhIGZ1bGwgbGlzdGluZworCS8vIC1sICBHZW5lcmF0ZSBhIGxvbmcgbGlzdGluZworCS8vIC1vIGNvbDEsY29sMixjb2wzPWhlYWRlcgorCS8vICAgICBTZWxlY3Qgd2hpY2ggY29sdW1ucyB0byBkaXNwbGF5CisJLyogV2UgYWxsb3cgKGFuZCBpZ25vcmUpIG1vc3Qgb2YgdGhlIGFib3ZlLiBGSVhNRS4KKwkgKiAtVCBpcyBwaWNrZWQgZm9yIHRocmVhZHMgKFBPU0lYIGhhc24ndCBzdGFuZGFyZGl6ZWQgaXQpLgorCSAqIHByb2NwcyB2My4yLjcgc3VwcG9ydHMgLVQgYW5kIHNob3dzIHRpZHMgYXMgU1BJRCBjb2x1bW4sCisJICogaXQgYWxzbyBzdXBwb3J0cyAtTCB3aGVyZSBpdCBzaG93cyB0aWRzIGFzIExXUCBjb2x1bW4uCisJICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAibzo6IjsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiWm86YUFkZWZsIklGX0ZFQVRVUkVfU0hPV19USFJFQURTKCJUIiksICZvcHRfbyk7CisJaWYgKG9wdF9vKSB7CisJCWRvIHsKKwkJCXBhcnNlX28obGxpc3RfcG9wKCZvcHRfbykpOworCQl9IHdoaWxlIChvcHRfbyk7CisJfSBlbHNlIHsKKwkJLyogQmVsb3c6IHBhcnNlX28oKSBuZWVkcyBjaGFyKiwgTk9UIGNvbnN0IGNoYXIqLAorCQkgKiBjYW4ndCBwYXNzIGl0IGNvbnN0YW50IHN0cmluZy4gTmVlZCB0byBtYWtlIGEgY29weSBmaXJzdC4KKwkJICovCisjaWYgRU5BQkxFX1NFTElOVVgKKwkJaWYgKCEob3B0ICYgT1BUX1opIHx8ICFpc19zZWxpbnV4X2VuYWJsZWQoKSkgeworCQkJLyogbm8gLVogb3Igbm8gU0VMaW51eDogZG8gbm90IHNob3cgTEFCRUwgKi8KKwkJCXN0cmNweShkZWZhdWx0X28sIERFRkFVTFRfT19TVFIgKyBzaXplb2YoU0VMSU5VWF9PX1BSRUZJWCktMSk7CisJCX0gZWxzZQorI2VuZGlmCisJCXsKKwkJCXN0cmNweShkZWZhdWx0X28sIERFRkFVTFRfT19TVFIpOworCQl9CisJCXBhcnNlX28oZGVmYXVsdF9vKTsKKwl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hPV19USFJFQURTCisJaWYgKG9wdCAmIE9QVF9UKQorCQluZWVkX2ZsYWdzIHw9IFBTU0NBTl9UQVNLUzsKKyNlbmRpZgorCisJLyogV2FzIElOVF9NQVgsIGJ1dCBzb21lIGxpYmMncyBnbyBiZWxseSB1cCB3aXRoIHByaW50ZigiJS4qcyIpCisJICogYW5kIHN1Y2ggbGFyZ2Ugd2lkdGhzICovCisJdGVybWluYWxfd2lkdGggPSBNQVhfV0lEVEg7CisJaWYgKGlzYXR0eSgxKSkgeworCQlnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KDAsICZ0ZXJtaW5hbF93aWR0aCwgTlVMTCk7CisJCWlmICgtLXRlcm1pbmFsX3dpZHRoID4gTUFYX1dJRFRIKQorCQkJdGVybWluYWxfd2lkdGggPSBNQVhfV0lEVEg7CisJfQorCWFsbG9jX2xpbmVfYnVmZmVyKCk7CisJZm9ybWF0X2hlYWRlcigpOworCisJcCA9IE5VTEw7CisJd2hpbGUgKChwID0gcHJvY3BzX3NjYW4ocCwgbmVlZF9mbGFncykpICE9IE5VTEwpIHsKKwkJZm9ybWF0X3Byb2Nlc3MocCk7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworCisjZWxzZSAvKiAhRU5BQkxFX0RFU0tUT1AgKi8KKworCitpbnQgcHNfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHBzX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJcHJvY3BzX3N0YXR1c190ICpwOworCWludCBwc3NjYW5fZmxhZ3MgPSBQU1NDQU5fUElEIHwgUFNTQ0FOX1VJREdJRAorCQkJfCBQU1NDQU5fU1RBVEUgfCBQU1NDQU5fVlNaIHwgUFNTQ0FOX0NPTU07CisJdW5zaWduZWQgdGVybWluYWxfd2lkdGggSUZfTk9UX0ZFQVRVUkVfUFNfV0lERSg9IDc5KTsKKwllbnVtIHsKKwkJT1BUX1ogPSAoMSA8PCAwKSAqIEVOQUJMRV9TRUxJTlVYLAorCQlPUFRfVCA9ICgxIDw8IEVOQUJMRV9TRUxJTlVYKSAqIEVOQUJMRV9GRUFUVVJFX1NIT1dfVEhSRUFEUywKKwkJT1BUX2wgPSAoMSA8PCBFTkFCTEVfU0VMSU5VWCkgKiAoMSA8PCBFTkFCTEVfRkVBVFVSRV9TSE9XX1RIUkVBRFMpICogRU5BQkxFX0ZFQVRVUkVfUFNfTE9ORywKKwl9OworI2lmIEVOQUJMRV9GRUFUVVJFX1BTX0xPTkcKKwl0aW1lX3Qgbm93ID0gbm93OyAvKiBmb3IgY29tcGlsZXIgKi8KKwl1bnNpZ25lZCBsb25nIHVwdGltZSA9IHVwdGltZTsKKyNlbmRpZgorCS8qIElmIHdlIHN1cHBvcnQgYW55IG9wdGlvbnMsIHBhcnNlIGFyZ3YgKi8KKyNpZiBFTkFCTEVfU0VMSU5VWCB8fCBFTkFCTEVfRkVBVFVSRV9TSE9XX1RIUkVBRFMgfHwgRU5BQkxFX0ZFQVRVUkVfUFNfV0lERSB8fCBFTkFCTEVfRkVBVFVSRV9QU19MT05HCisJaW50IG9wdHMgPSAwOworIyBpZiBFTkFCTEVfRkVBVFVSRV9QU19XSURFCisJLyogLXcgaXMgYSBiaXQgY29tcGxpY2F0ZWQgKi8KKwlpbnQgd19jb3VudCA9IDA7CisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTp3dyI7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsIElGX1NFTElOVVgoIloiKUlGX0ZFQVRVUkVfU0hPV19USFJFQURTKCJUIilJRl9GRUFUVVJFX1BTX0xPTkcoImwiKQorCQkJCQkidyIsICZ3X2NvdW50KTsKKwkvKiBpZiB3IGlzIGdpdmVuIG9uY2UsIEdOVSBwcyBzZXRzIHRoZSB3aWR0aCB0byAxMzIsCisJICogaWYgdyBpcyBnaXZlbiBtb3JlIHRoYW4gb25jZSwgaXQgaXMgInVubGltaXRlZCIKKwkgKi8KKwlpZiAod19jb3VudCkgeworCQl0ZXJtaW5hbF93aWR0aCA9ICh3X2NvdW50ID09IDEpID8gMTMyIDogTUFYX1dJRFRIOworCX0gZWxzZSB7CisJCWdldF90ZXJtaW5hbF93aWR0aF9oZWlnaHQoMCwgJnRlcm1pbmFsX3dpZHRoLCBOVUxMKTsKKwkJLyogR28gb25lIGxlc3MuLi4gKi8KKwkJaWYgKC0tdGVybWluYWxfd2lkdGggPiBNQVhfV0lEVEgpCisJCQl0ZXJtaW5hbF93aWR0aCA9IE1BWF9XSURUSDsKKwl9CisjIGVsc2UKKwkvKiAtdyBpcyBub3Qgc3VwcG9ydGVkLCBvbmx5IC1aIGFuZC9vciAtVCAqLworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0iOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCBJRl9TRUxJTlVYKCJaIilJRl9GRUFUVVJFX1NIT1dfVEhSRUFEUygiVCIpSUZfRkVBVFVSRV9QU19MT05HKCJsIikpOworIyBlbmRpZgorCisjIGlmIEVOQUJMRV9TRUxJTlVYCisJaWYgKChvcHRzICYgT1BUX1opICYmIGlzX3NlbGludXhfZW5hYmxlZCgpKSB7CisJCXBzc2Nhbl9mbGFncyA9IFBTU0NBTl9QSUQgfCBQU1NDQU5fQ09OVEVYVAorCQkJCXwgUFNTQ0FOX1NUQVRFIHwgUFNTQ0FOX0NPTU07CisJCXB1dHMoIiAgUElEIENPTlRFWFQgICAgICAgICAgICAgICAgICAgICAgICAgIFNUQVQgQ09NTUFORCIpOworCX0gZWxzZQorIyBlbmRpZgorCWlmIChvcHRzICYgT1BUX2wpIHsKKwkJcHNzY2FuX2ZsYWdzID0gUFNTQ0FOX1NUQVRFIHwgUFNTQ0FOX1VJREdJRCB8IFBTU0NBTl9QSUQgfCBQU1NDQU5fUFBJRAorCQkJfCBQU1NDQU5fVFRZIHwgUFNTQ0FOX1NUSU1FIHwgUFNTQ0FOX1VUSU1FIHwgUFNTQ0FOX0NPTU0KKwkJCXwgUFNTQ0FOX1ZTWiB8IFBTU0NBTl9SU1M7CisvKiBodHRwOi8vcHVicy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvcHMuaHRtbAorICogbWFuZGF0ZXMgZm9yIC1sOgorICogLUYgICAgIEZsYWdzICg/KQorICogUyAgICAgIFN0YXRlCisgKiBVSUQsUElELFBQSUQKKyAqIC1DICAgICBDUFUgdXNhZ2UKKyAqIC1QUkkgICBUaGUgcHJpb3JpdHkgb2YgdGhlIHByb2Nlc3M7IGhpZ2hlciBudW1iZXJzIG1lYW4gbG93ZXIgcHJpb3JpdHkKKyAqIC1OSSAgICBOaWNlIHZhbHVlCisgKiAtQUREUiAgVGhlIGFkZHJlc3Mgb2YgdGhlIHByb2Nlc3MgKD8pCisgKiBTWiAgICAgVGhlIHNpemUgaW4gYmxvY2tzIG9mIHRoZSBjb3JlIGltYWdlCisgKiAtV0NIQU4gVGhlIGV2ZW50IGZvciB3aGljaCB0aGUgcHJvY2VzcyBpcyB3YWl0aW5nIG9yIHNsZWVwaW5nCisgKiBUVFkKKyAqIFRJTUUgICBUaGUgY3VtdWxhdGl2ZSBleGVjdXRpb24gdGltZQorICogQ01ECisgKiBXZSBkb24ndCBzaG93IGZpZWxkcyBtYXJrZWQgd2l0aCAnLScuCisgKiBXZSBzaG93IFZTWiBhbmQgUlNTIGluc3RlYWQgb2YgU1ouCisgKiBXZSBhbHNvIHNob3cgU1RJTUUgKHN0YW5kYXJkIHNheXMgdGhhdCAtZiBzaG93cyBpdCwgLWwgZG9lc24ndCkuCisgKi8KKwkJcHV0cygiUyAgIFVJRCAgIFBJRCAgUFBJRCAgIFZTWiAgIFJTUyBUVFkgICBTVElNRSBUSU1FICAgICBDTUQiKTsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfUFNfTE9ORworCQlub3cgPSB0aW1lKE5VTEwpOworCQl1cHRpbWUgPSBnZXRfdXB0aW1lKCk7CisjIGVuZGlmCisJfQorCWVsc2UgeworCQlwdXRzKCIgIFBJRCBVU0VSICAgICAgIFZTWiBTVEFUIENPTU1BTkQiKTsKKwl9CisJaWYgKG9wdHMgJiBPUFRfVCkgeworCQlwc3NjYW5fZmxhZ3MgfD0gUFNTQ0FOX1RBU0tTOworCX0KKyNlbmRpZgorCisJcCA9IE5VTEw7CisJd2hpbGUgKChwID0gcHJvY3BzX3NjYW4ocCwgcHNzY2FuX2ZsYWdzKSkgIT0gTlVMTCkgeworCQlpbnQgbGVuOworI2lmIEVOQUJMRV9TRUxJTlVYCisJCWlmIChwc3NjYW5fZmxhZ3MgJiBQU1NDQU5fQ09OVEVYVCkgeworCQkJbGVuID0gcHJpbnRmKCIlNXUgJS0zMi4zMnMgJXMgICIsCisJCQkJCXAtPnBpZCwKKwkJCQkJcC0+Y29udGV4dCA/IHAtPmNvbnRleHQgOiAidW5rbm93biIsCisJCQkJCXAtPnN0YXRlKTsKKwkJfSBlbHNlCisjZW5kaWYKKwkJeworCQkJY2hhciBidWY2WzZdOworCQkJc21hcnRfdWxsdG9hNShwLT52c3osIGJ1ZjYsICIgbWd0cGV6eSIpWzBdID0gJ1wwJzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9QU19MT05HCisJCQlpZiAob3B0cyAmIE9QVF9sKSB7CisJCQkJY2hhciBidWZyWzZdLCBzdGltZV9zdHJbNl07CisJCQkJY2hhciB0dHlbMiAqIHNpemVvZihpbnQpKjMgKyAyXTsKKwkJCQljaGFyICplbmRwOworCQkJCXVuc2lnbmVkIHN1dCA9IChwLT5zdGltZSArIHAtPnV0aW1lKSAvIDEwMDsKKwkJCQl1bnNpZ25lZCBlbGFwc2VkID0gdXB0aW1lIC0gKHAtPnN0YXJ0X3RpbWUgLyAxMDApOworCQkJCXRpbWVfdCBzdGFydCA9IG5vdyAtIGVsYXBzZWQ7CisJCQkJc3RydWN0IHRtICp0bSA9IGxvY2FsdGltZSgmc3RhcnQpOworCisJCQkJc21hcnRfdWxsdG9hNShwLT5yc3MsIGJ1ZnIsICIgbWd0cGV6eSIpWzBdID0gJ1wwJzsKKworCQkJCWlmIChwLT50dHlfbWFqb3IgPT0gMTM2KQorCQkJCQkvKiBJdCBzaG91bGQgYmUgcHRzL04sIG5vdCBwdHNOLCBidXQgTiA+IDkKKwkJCQkJICogd2lsbCBvdmVyZmxvdyBmaWVsZCB3aWR0aC4uLgorCQkJCQkgKi8KKwkJCQkJZW5kcCA9IHN0cGNweSh0dHksICJwdHMiKTsKKwkJCQllbHNlCisJCQkJaWYgKHAtPnR0eV9tYWpvciA9PSA0KSB7CisJCQkJCWVuZHAgPSBzdHBjcHkodHR5LCAidHR5Iik7CisJCQkJCWlmIChwLT50dHlfbWlub3IgPj0gNjQpIHsKKwkJCQkJCXAtPnR0eV9taW5vciAtPSA2NDsKKwkJCQkJCSplbmRwKysgPSAnUyc7CisJCQkJCX0KKwkJCQl9CisJCQkJZWxzZQorCQkJCQllbmRwID0gdHR5ICsgc3ByaW50Zih0dHksICIlZDoiLCBwLT50dHlfbWFqb3IpOworCQkJCXN0cmNweShlbmRwLCB1dG9hKHAtPnR0eV9taW5vcikpOworCisJCQkJc3RyZnRpbWUoc3RpbWVfc3RyLCA2LCAoZWxhcHNlZCA+PSAoMjQgKiA2MCAqIDYwKSkgPyAiJWIlZCIgOiAiJUg6JU0iLCB0bSk7CisJCQkJc3RpbWVfc3RyWzVdID0gJ1wwJzsKKwkJCQkvLyAgICAgICAgICAgIFMgIFVJRCBQSUQgUFBJRCBWU1ogUlNTIFRUWSBTVElNRSBUSU1FICAgICAgICBDTUQKKwkJCQlsZW4gPSBwcmludGYoIiVjICU1dSAlNXUgJTV1ICU1cyAlNXMgJS01cyAlcyAlMDJ1OiUwMnU6JTAydSAiLAorCQkJCQlwLT5zdGF0ZVswXSwgcC0+dWlkLCBwLT5waWQsIHAtPnBwaWQsIGJ1ZjYsIGJ1ZnIsIHR0eSwKKwkJCQkJc3RpbWVfc3RyLCBzdXQgLyAzNjAwLCAoc3V0ICUgMzYwMCkgLyA2MCwgc3V0ICUgNjApOworCQkJfSBlbHNlCisjZW5kaWYKKwkJCXsKKwkJCQljb25zdCBjaGFyICp1c2VyID0gZ2V0X2NhY2hlZF91c2VybmFtZShwLT51aWQpOworCQkJCWxlbiA9IHByaW50ZigiJTV1ICUtOC44cyAlcyAlcyAgIiwKKwkJCQkJcC0+cGlkLCB1c2VyLCBidWY2LCBwLT5zdGF0ZSk7CisJCQl9CisJCX0KKworCQl7CisJCQlpbnQgc3ogPSB0ZXJtaW5hbF93aWR0aCAtIGxlbjsKKwkJCWlmIChzeiA+PSAwKSB7CisJCQkJY2hhciBidWZbc3ogKyAxXTsKKwkJCQlyZWFkX2NtZGxpbmUoYnVmLCBzeiwgcC0+cGlkLCBwLT5jb21tKTsKKwkJCQlwdXRzKGJ1Zik7CisJCQl9CisJCX0KKwl9CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbGVhcl91c2VybmFtZV9jYWNoZSgpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKKyNlbmRpZiAvKiAhRU5BQkxFX0RFU0tUT1AgKi8KZGlmZiAtLWdpdCBhL3Byb2Nwcy9wcy5wb3NpeCBiL3Byb2Nwcy9wcy5wb3NpeApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2Y0ZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvcHJvY3BzL3BzLnBvc2l4CkBAIC0wLDAgKzEsMTc1IEBACitUaGlzIGlzIHdoYXQgUE9TSVggMjAwMyBzYXlzIGFib3V0IHBzOgorCitCeSBkZWZhdWx0LCBwcyBzaGFsbCBzZWxlY3QgIGFsbCBwcm9jZXNzZXMgd2l0aCB0aGUgc2FtZSBlZmZlY3RpdmUgdXNlcgorSUQgYXMgdGhlIGN1cnJlbnQgdXNlciBhbmQgdGhlIHNhbWUgY29udHJvbGxpbmcgdGVybWluYWwgYXMgdGhlIGludm9rZXIKKworcHMgWy1hQV1bLWRlZmxdWy1HIGdyb3VwbGlzdF1bLW8gZm9ybWF0XS4uLlstcCBwcm9jbGlzdF1bLXQgdGVybWxpc3RdCitbLVUgdXNlcmxpc3RdWy1nIGdyb3VwbGlzdF1bLW4gbmFtZWxpc3RdWy11IHVzZXJsaXN0XQorCistYSAgICAgV3JpdGUgaW5mb3JtYXRpb24gZm9yIGFsbCBwcm9jZXNzZXMgYXNzb2NpYXRlZCAgd2l0aCAgdGVybWluYWxzLgorICAgICAgIEltcGxlbWVudGF0aW9ucyBtYXkgb21pdCBzZXNzaW9uIGxlYWRlcnMgZnJvbSB0aGlzIGxpc3QuCisKKy1BICAgICBXcml0ZSBpbmZvcm1hdGlvbiBmb3IgYWxsIHByb2Nlc3Nlcy4KKworLWQgICAgIFdyaXRlIGluZm9ybWF0aW9uIGZvciBhbGwgcHJvY2Vzc2VzLCBleGNlcHQgc2Vzc2lvbiBsZWFkZXJzLgorCistZSAgICAgV3JpdGUgaW5mb3JtYXRpb24gZm9yIGFsbCBwcm9jZXNzZXMuICAoRXF1aXZhbGVudCB0byAtQS4pCisKKy1mICAgICBHZW5lcmF0ZSAgYSAgZnVsbCAgbGlzdGluZy4gKFNlZSB0aGUgU1RET1VUIHNlY3Rpb24gZm9yIHRoZSBjb24tCisgICAgICAgdGVudHMgb2YgYSBmdWxsIGxpc3RpbmcuKQorCistZyAgZ3JvdXBsaXN0CisgICAgICAgV3JpdGUgaW5mb3JtYXRpb24gZm9yIHByb2Nlc3NlcyB3aG9zZSBzZXNzaW9uIGxlYWRlcnMgYXJlICBnaXZlbgorICAgICAgIGluIGdyb3VwbGlzdC4gVGhlIGFwcGxpY2F0aW9uIHNoYWxsIGVuc3VyZSB0aGF0IHRoZSBncm91cGxpc3QgaXMKKyAgICAgICBhIHNpbmdsZSBhcmd1bWVudCBpbiB0aGUgZm9ybSBvZiBhICA8Ymxhbms+ICBvciAgY29tbWEtc2VwYXJhdGVkCisgICAgICAgbGlzdC4KKworLUcgIGdyb3VwbGlzdAorICAgICAgIFdyaXRlICBpbmZvcm1hdGlvbiBmb3IgcHJvY2Vzc2VzIHdob3NlIHJlYWwgZ3JvdXAgSUQgbnVtYmVycyBhcmUKKyAgICAgICBnaXZlbiBpbiBncm91cGxpc3QuIFRoZSBhcHBsaWNhdGlvbiBzaGFsbCBlbnN1cmUgdGhhdCB0aGUgIGdyb3UtCisgICAgICAgcGxpc3QgIGlzICBhICBzaW5nbGUgYXJndW1lbnQgaW4gdGhlIGZvcm0gb2YgYSA8Ymxhbms+IG9yIGNvbW1hLQorICAgICAgIHNlcGFyYXRlZCBsaXN0LgorCistbCAgICAgR2VuZXJhdGUgYSBsb25nIGxpc3RpbmcuIChTZWUgU1RET1VUIGZvciB0aGUgY29udGVudHMgb2YgYSAgbG9uZworICAgICAgIGxpc3RpbmcuKQorCistbiAgbmFtZWxpc3QKKyAgICAgICBTcGVjaWZ5IHRoZSBuYW1lIG9mIGFuIGFsdGVybmF0aXZlIHN5c3RlbSBuYW1lbGlzdCBmaWxlIGluIHBsYWNlCisgICAgICAgb2YgdGhlIGRlZmF1bHQuIFRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IGZpbGUgYW5kIHRoZSBmb3JtYXQgb2YgYQorICAgICAgIG5hbWVsaXN0IGZpbGUgYXJlIHVuc3BlY2lmaWVkLgorCistbyAgZm9ybWF0CisgICAgICAgV3JpdGUgaW5mb3JtYXRpb24gYWNjb3JkaW5nIHRvIHRoZSBmb3JtYXQgc3BlY2lmaWNhdGlvbiBnaXZlbiBpbgorICAgICAgIGZvcm1hdC4gIE11bHRpcGxlIC1vIG9wdGlvbnMgY2FuIGJlIHNwZWNpZmllZDsgdGhlIGZvcm1hdCBzcGVjaS0KKyAgICAgICBmaWNhdGlvbiBzaGFsbCBiZSBpbnRlcnByZXRlZCBhcyB0aGUgIDxzcGFjZT4tc2VwYXJhdGVkIGNvbmNhdGUtCisgICAgICAgbmF0aW9uIG9mIGFsbCB0aGUgZm9ybWF0IG9wdGlvbi1hcmd1bWVudHMuCisKKy1wICBwcm9jbGlzdAorICAgICAgIFdyaXRlICBpbmZvcm1hdGlvbiAgZm9yICBwcm9jZXNzZXMgIHdob3NlIHByb2Nlc3MgSUQgbnVtYmVycyBhcmUKKyAgICAgICBnaXZlbiBpbiBwcm9jbGlzdC4gVGhlIGFwcGxpY2F0aW9uIHNoYWxsIGVuc3VyZSAgdGhhdCAgdGhlICBwcm8tCisgICAgICAgY2xpc3QgIGlzICBhICBzaW5nbGUgYXJndW1lbnQgaW4gdGhlIGZvcm0gb2YgYSA8Ymxhbms+IG9yIGNvbW1hLQorICAgICAgIHNlcGFyYXRlZCBsaXN0LgorCistdCAgdGVybWxpc3QKKyAgICAgICBXcml0ZSBpbmZvcm1hdGlvbiBmb3IgcHJvY2Vzc2VzIGFzc29jaWF0ZWQgd2l0aCB0ZXJtaW5hbHMgIGdpdmVuCisgICAgICAgaW4gdGVybWxpc3QuIFRoZSBhcHBsaWNhdGlvbiBzaGFsbCBlbnN1cmUgdGhhdCB0aGUgdGVybWxpc3QgaXMgYQorICAgICAgIHNpbmdsZSBhcmd1bWVudCBpbiB0aGUgZm9ybSAgb2YgIGEgIDxibGFuaz4gIG9yICBjb21tYS1zZXBhcmF0ZWQKKyAgICAgICBsaXN0LiAgVGVybWluYWwgaWRlbnRpZmllcnMgc2hhbGwgYmUgZ2l2ZW4gaW4gYW4gaW1wbGVtZW50YXRpb24tCisgICAgICAgZGVmaW5lZCBmb3JtYXQuICAgIE9uICBYU0ktY29uZm9ybWFudCAgc3lzdGVtcywgIHRoZXkgIHNoYWxsICBiZQorICAgICAgIGdpdmVuICBpbiAgb25lIG9mIHR3byBmb3JtczogdGhlIGRldmljZSdzIGZpbGVuYW1lIChmb3IgZXhhbXBsZSwKKyAgICAgICB0dHkwNCkgb3IsIGlmIHRoZSBkZXZpY2UncyBmaWxlbmFtZSBzdGFydHMgd2l0aCAgdHR5LCAganVzdCAgdGhlCisgICAgICAgaWRlbnRpZmllciBmb2xsb3dpbmcgdGhlIGNoYXJhY3RlcnMgdHR5IChmb3IgZXhhbXBsZSwgIjA0IiApLgorCistdSAgdXNlcmxpc3QKKyAgICAgICBXcml0ZSAgaW5mb3JtYXRpb24gIGZvciBwcm9jZXNzZXMgd2hvc2UgdXNlciBJRCBudW1iZXJzIG9yIGxvZ2luCisgICAgICAgbmFtZXMgYXJlIGdpdmVuIGluIHVzZXJsaXN0LiBUaGUgYXBwbGljYXRpb24gc2hhbGwgIGVuc3VyZSAgdGhhdAorICAgICAgIHRoZSAgdXNlcmxpc3QgIGlzICBhIHNpbmdsZSBhcmd1bWVudCBpbiB0aGUgZm9ybSBvZiBhIDxibGFuaz4gb3IKKyAgICAgICBjb21tYS1zZXBhcmF0ZWQgbGlzdC4gSW4gdGhlICBsaXN0aW5nLCAgdGhlICBudW1lcmljYWwgIHVzZXIgIElECisgICAgICAgc2hhbGwgYmUgd3JpdHRlbiB1bmxlc3MgdGhlIC1mIG9wdGlvbiBpcyB1c2VkLCBpbiB3aGljaCBjYXNlIHRoZQorICAgICAgIGxvZ2luIG5hbWUgc2hhbGwgYmUgd3JpdHRlbi4KKworLVUgIHVzZXJsaXN0CisgICAgICAgV3JpdGUgaW5mb3JtYXRpb24gZm9yIHByb2Nlc3NlcyB3aG9zZSByZWFsIHVzZXIgIElEICBudW1iZXJzICBvcgorICAgICAgIGxvZ2luICBuYW1lcyBhcmUgZ2l2ZW4gaW4gdXNlcmxpc3QuIFRoZSBhcHBsaWNhdGlvbiBzaGFsbCBlbnN1cmUKKyAgICAgICB0aGF0IHRoZSB1c2VybGlzdCBpcyBhIHNpbmdsZSBhcmd1bWVudCBpbiB0aGUgZm9ybSBvZiBhICA8Ymxhbms+CisgICAgICAgb3IgY29tbWEtc2VwYXJhdGVkIGxpc3QuCisKK1dpdGggIHRoZSAgZXhjZXB0aW9uIG9mIC1vIGZvcm1hdCwgYWxsIG9mIHRoZSBvcHRpb25zIHNob3duIGFyZSB1c2VkIHRvCitzZWxlY3QgcHJvY2Vzc2VzLiBJZiBhbnkgYXJlICBzcGVjaWZpZWQsICB0aGUgIGRlZmF1bHQgIGxpc3QgIHNoYWxsICBiZQoraWdub3JlZCAgYW5kIHBzIHNoYWxsIHNlbGVjdCB0aGUgcHJvY2Vzc2VzIHJlcHJlc2VudGVkIGJ5IHRoZSBpbmNsdXNpdmUKK09SIG9mIGFsbCB0aGUgc2VsZWN0aW9uLWNyaXRlcmlhIG9wdGlvbnMuCisKK1RoZSAgLW8gb3B0aW9uIGFsbG93cyB0aGUgb3V0cHV0IGZvcm1hdCB0byBiZSBzcGVjaWZpZWQgdW5kZXIgdXNlciBjb24tCit0cm9sLgorCitUaGUgYXBwbGljYXRpb24gc2hhbGwgZW5zdXJlIHRoYXQgdGhlIGZvcm1hdCBzcGVjaWZpY2F0aW9uIGlzIGEgbGlzdCBvZgorbmFtZXMgIHByZXNlbnRlZCBhcyBhIHNpbmdsZSBhcmd1bWVudCwgPGJsYW5rPiBvciBjb21tYS1zZXBhcmF0ZWQuIEVhY2gKK3ZhcmlhYmxlIGhhcyBhIGRlZmF1bHQgaGVhZGVyLiBUaGUgZGVmYXVsdCBoZWFkZXIgY2FuIGJlIG92ZXJyaWRkZW4gIGJ5CithcHBlbmRpbmcgIGFuICBlcXVhbHMgIHNpZ24gYW5kIHRoZSBuZXcgdGV4dCBvZiB0aGUgaGVhZGVyLiBUaGUgcmVzdCBvZgordGhlIGNoYXJhY3RlcnMgaW4gdGhlIGFyZ3VtZW50IHNoYWxsIGJlIHVzZWQgYXMgdGhlICBoZWFkZXIgIHRleHQuICBUaGUKK2ZpZWxkcyBzcGVjaWZpZWQgc2hhbGwgYmUgd3JpdHRlbiBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kCitsaW5lLCBhbmQgc2hvdWxkIGJlIGFycmFuZ2VkIGluIGNvbHVtbnMgaW4gdGhlIG91dHB1dC4gVGhlIGZpZWxkIHdpZHRocworc2hhbGwgIGJlICBzZWxlY3RlZCAgYnkgdGhlIHN5c3RlbSB0byBiZSBhdCBsZWFzdCBhcyB3aWRlIGFzIHRoZSBoZWFkZXIKK3RleHQgKGRlZmF1bHQgb3Igb3ZlcnJpZGRlbiB2YWx1ZSkuIElmIHRoZSBoZWFkZXIgdGV4dCBpcyBudWxsLCBzdWNoIGFzCistbyAgdXNlcj0sICB0aGUgIGZpZWxkICB3aWR0aCAgc2hhbGwgYmUgYXQgbGVhc3QgYXMgd2lkZSBhcyB0aGUgZGVmYXVsdAoraGVhZGVyIHRleHQuIElmIGFsbCBoZWFkZXIgdGV4dCBmaWVsZHMgYXJlIG51bGwsIG5vIGhlYWRlciAgbGluZSAgc2hhbGwKK2JlIHdyaXR0ZW4uCisKK3J1c2VyICBUaGUgIHJlYWwgdXNlciBJRCBvZiB0aGUgcHJvY2Vzcy4gVGhpcyBzaGFsbCBiZSB0aGUgdGV4dHVhbCB1c2VyCisgICAgICAgSUQsIGlmIGl0IGNhbiBiZSBvYnRhaW5lZCBhbmQgdGhlIGZpZWxkIHdpZHRoIHBlcm1pdHMsIG9yIGEgZGVjLQorICAgICAgIGltYWwgcmVwcmVzZW50YXRpb24gb3RoZXJ3aXNlLgorCit1c2VyICAgVGhlICBlZmZlY3RpdmUgdXNlciBJRCBvZiB0aGUgcHJvY2Vzcy4gVGhpcyBzaGFsbCBiZSB0aGUgdGV4dHVhbAorICAgICAgIHVzZXIgSUQsIGlmIGl0IGNhbiBiZSBvYnRhaW5lZCBhbmQgdGhlIGZpZWxkIHdpZHRoIHBlcm1pdHMsIG9yIGEKKyAgICAgICBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG90aGVyd2lzZS4KKworcmdyb3VwIFRoZSAgcmVhbCAgZ3JvdXAgIElEICBvZiAgdGhlIHByb2Nlc3MuIFRoaXMgc2hhbGwgYmUgdGhlIHRleHR1YWwKKyAgICAgICBncm91cCBJRCwgaWYgaXQgY2FuIGJlIG9idGFpbmVkIGFuZCB0aGUgZmllbGQgd2lkdGggcGVybWl0cywgIG9yCisgICAgICAgYSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG90aGVyd2lzZS4KKworZ3JvdXAgIFRoZSBlZmZlY3RpdmUgZ3JvdXAgSUQgb2YgdGhlIHByb2Nlc3MuIFRoaXMgc2hhbGwgYmUgdGhlIHRleHR1YWwKKyAgICAgICBncm91cCBJRCwgaWYgaXQgY2FuIGJlIG9idGFpbmVkIGFuZCB0aGUgZmllbGQgd2lkdGggcGVybWl0cywgIG9yCisgICAgICAgYSBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG90aGVyd2lzZS4KKworcGlkICAgIFRoZSBkZWNpbWFsIHZhbHVlIG9mIHRoZSBwcm9jZXNzIElELgorCitwcGlkICAgVGhlIGRlY2ltYWwgdmFsdWUgb2YgdGhlIHBhcmVudCBwcm9jZXNzIElELgorCitwZ2lkICAgVGhlIGRlY2ltYWwgdmFsdWUgb2YgdGhlIHByb2Nlc3MgZ3JvdXAgSUQuCisKK3BjcHUgICBUaGUgcmF0aW8gb2YgQ1BVIHRpbWUgdXNlZCByZWNlbnRseSB0byBDUFUgdGltZSBhdmFpbGFibGUgaW4gdGhlCisgICAgICAgc2FtZSAgcGVyaW9kLCAgZXhwcmVzc2VkICBhcyAgYSAgcGVyY2VudGFnZS4gIFRoZSAgIG1lYW5pbmcgICBvZgorICAgICAgICJyZWNlbnRseSIgIGluICB0aGlzIGNvbnRleHQgaXMgdW5zcGVjaWZpZWQuIFRoZSBDUFUgdGltZSBhdmFpbC0KKyAgICAgICBhYmxlIGlzIGRldGVybWluZWQgaW4gYW4gdW5zcGVjaWZpZWQgbWFubmVyLgorCit2c3ogICAgVGhlIHNpemUgb2YgdGhlIHByb2Nlc3MgaW4gKHZpcnR1YWwpIG1lbW9yeSBpbiAxMDI0ICBieXRlICB1bml0cworICAgICAgIGFzIGEgZGVjaW1hbCBpbnRlZ2VyLgorCituaWNlICAgVGhlIGRlY2ltYWwgdmFsdWUgb2YgdGhlIG5pY2UgdmFsdWUgb2YgdGhlIHByb2Nlc3M7IHNlZSBuaWNlKCkgLgorCitldGltZSAgSW4gdGhlIFBPU0lYIGxvY2FsZSwgdGhlIGVsYXBzZWQgIHRpbWUgIHNpbmNlICB0aGUgIHByb2Nlc3MgIHdhcworICAgICAgIHN0YXJ0ZWQsIGluIHRoZSBmb3JtOiBbW2RkLV1oaDpdbW06c3MKKwordGltZSAgIEluIHRoZSBQT1NJWCBsb2NhbGUsIHRoZSBjdW11bGF0aXZlIENQVSB0aW1lIG9mIHRoZSAgcHJvY2VzcyAgaW4KKyAgICAgICB0aGUgZm9ybTogW2RkLV1oaDptbTpzcworCit0dHkgICAgVGhlIG5hbWUgb2YgdGhlIGNvbnRyb2xsaW5nIHRlcm1pbmFsIG9mIHRoZSBwcm9jZXNzIChpZiBhbnkpICBpbgorICAgICAgIHRoZSBzYW1lIGZvcm1hdCB1c2VkIGJ5IHRoZSB3aG8gdXRpbGl0eS4KKworY29tbSAgIFRoZSAgbmFtZSAgb2YgIHRoZSAgY29tbWFuZCBiZWluZyBleGVjdXRlZCAoIGFyZ3ZbMF0gdmFsdWUpIGFzIGEKKyAgICAgICBzdHJpbmcuCisKK2FyZ3MgICBUaGUgY29tbWFuZCB3aXRoIGFsbCBpdHMgYXJndW1lbnRzIGFzIGEgc3RyaW5nLiBUaGUgIGltcGxlbWVudGEtCisgICAgICAgdGlvbiBtYXkgdHJ1bmNhdGUgdGhpcyB2YWx1ZSB0byB0aGUgZmllbGQgd2lkdGg7IGl0IGlzIGltcGxlbWVuLQorICAgICAgIHRhdGlvbi1kZWZpbmVkIHdoZXRoZXIgYW55ICBmdXJ0aGVyICB0cnVuY2F0aW9uICBvY2N1cnMuICBJdCAgaXMKKyAgICAgICB1bnNwZWNpZmllZCAgd2hldGhlciAgdGhlIHN0cmluZyByZXByZXNlbnRlZCBpcyBhIHZlcnNpb24gb2YgdGhlCisgICAgICAgYXJndW1lbnQgbGlzdCBhcyBpdCB3YXMgcGFzc2VkIHRvIHRoZSBjb21tYW5kIHdoZW4gIGl0ICBzdGFydGVkLAorICAgICAgIG9yICBpcyBhIHZlcnNpb24gb2YgdGhlIGFyZ3VtZW50cyBhcyB0aGV5IG1heSBoYXZlIGJlZW4gbW9kaWZpZWQKKyAgICAgICBieSB0aGUgYXBwbGljYXRpb24uIEFwcGxpY2F0aW9ucyBjYW5ub3QgZGVwZW5kIG9uIGJlaW5nIGFibGUgIHRvCisgICAgICAgbW9kaWZ5ICB0aGVpciAgYXJndW1lbnQgIGxpc3QgIGFuZCAgaGF2aW5nICB0aGF0IG1vZGlmaWNhdGlvbiBiZQorICAgICAgIHJlZmxlY3RlZCBpbiB0aGUgb3V0cHV0IG9mIHBzLgorCitBbnkgZmllbGQgbmVlZCBub3QgYmUgbWVhbmluZ2Z1bCBpbiBhbGwgaW1wbGVtZW50YXRpb25zLiBJbiBzdWNoIGEgY2FzZQorYSBoeXBoZW4gKCAnLScgKSBzaG91bGQgYmUgb3V0cHV0IGluIHBsYWNlIG9mIHRoZSBmaWVsZCB2YWx1ZS4KKworT25seSAgY29tbSAgYW5kICBhcmdzICBzaGFsbCBiZSBhbGxvd2VkIHRvIGNvbnRhaW4gPGJsYW5rPnM7IGFsbCBvdGhlcnMKK3NoYWxsIG5vdC4KKworVGhlIGZvbGxvd2luZyB0YWJsZSBzcGVjaWZpZXMgdGhlIGRlZmF1bHQgaGVhZGVyICB0byAgYmUgIHVzZWQgIGluICB0aGUKK1BPU0lYIGxvY2FsZSBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZm9ybWF0IHNwZWNpZmllci4KKworICAgIEZvcm1hdCBTcGVjaWZpZXIgRGVmYXVsdCBIZWFkZXIgRm9ybWF0IFNwZWNpZmllciBEZWZhdWx0IEhlYWRlcgorICAgIGFyZ3MgICAgICAgICAgICAgQ09NTUFORCAgICAgICAgcHBpZCAgICAgICAgICAgICBQUElECisgICAgY29tbSAgICAgICAgICAgICBDT01NQU5EICAgICAgICByZ3JvdXAgICAgICAgICAgIFJHUk9VUAorICAgIGV0aW1lICAgICAgICAgICAgRUxBUFNFRCAgICAgICAgcnVzZXIgICAgICAgICAgICBSVVNFUgorICAgIGdyb3VwICAgICAgICAgICAgR1JPVVAgICAgICAgICAgdGltZSAgICAgICAgICAgICBUSU1FCisgICAgbmljZSAgICAgICAgICAgICBOSSAgICAgICAgICAgICB0dHkgICAgICAgICAgICAgIFRUCisgICAgcGNwdSAgICAgICAgICAgICAlQ1BVICAgICAgICAgICB1c2VyICAgICAgICAgICAgIFVTRVIKKyAgICBwZ2lkICAgICAgICAgICAgIFBHSUQgICAgICAgICAgIHZzeiAgICAgICAgICAgICAgVlNaCisgICAgcGlkICAgICAgICAgICAgICBQSUQKKworVGhlcmUgIGlzIG5vIHNwZWNpYWwgcXVvdGluZyBtZWNoYW5pc20gZm9yIGhlYWRlciB0ZXh0LiBUaGUgaGVhZGVyIHRleHQKK2lzIHRoZSByZXN0IG9mIHRoZSBhcmd1bWVudC4gSWYgbXVsdGlwbGUgIGhlYWRlciAgY2hhbmdlcyAgYXJlICBuZWVkZWQsCittdWx0aXBsZSAtbyBvcHRpb25zIGNhbiBiZSB1c2VkLCBzdWNoIGFzOgorCisgICAgICAgIHBzIC1vICJ1c2VyPVVzZXIgTmFtZSIgLW8gcGlkPVByb2Nlc3NcIElECmRpZmYgLS1naXQgYS9wcm9jcHMvcHN0cmVlLmMgYi9wcm9jcHMvcHN0cmVlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQxYTQxMgotLS0gL2Rldi9udWxsCisrKyBiL3Byb2Nwcy9wc3RyZWUuYwpAQCAtMCwwICsxLDQxNCBAQAorLyoKKyAqIHBzdHJlZS5jIC0gZGlzcGxheSBwcm9jZXNzIHRyZWUKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTMtMjAwMiBXZXJuZXIgQWxtZXNiZXJnZXIKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA5IENyYWlnIFNtYWxsCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgTGF1cmkgS2FzYW5lbgorICoKKyAqIEJhc2VkIG9uIHBzdHJlZSAoUFNtaXNjKSAyMi4xMy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vY29uZmlnOmNvbmZpZyBQU1RSRUUKKy8vY29uZmlnOglib29sICJwc3RyZWUiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRGlzcGxheSBhIHRyZWUgb2YgcHJvY2Vzc2VzLgorCisvL2FwcGxldDpJRl9QU1RSRUUoQVBQTEVUKHBzdHJlZSwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19QU1RSRUUpICs9IHBzdHJlZS5vCisKKy8vdXNhZ2U6I2RlZmluZSBwc3RyZWVfdHJpdmlhbF91c2FnZQorLy91c2FnZToJIlstcF0gW1BJRHxVU0VSXSIKKy8vdXNhZ2U6I2RlZmluZSBwc3RyZWVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJEaXNwbGF5IHByb2Nlc3MgdHJlZSwgb3B0aW9uYWxseSBzdGFydCBmcm9tIFVTRVIgb3IgUElEXG4iCisvL3VzYWdlOiAgICAgIlxuCS1wCVNob3cgcGlkcyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgUFJPQ19CQVNFICIvcHJvYyIKKworI2RlZmluZSBPUFRfUElEICAoMSA8PCAwKQorCitzdHJ1Y3QgY2hpbGQ7CisKKyNpZmRlZiBFTkFCTEVfRkVBVFVSRV9TSE9XX1RIUkVBRFMKKy8qIEZvciB0aHJlYWRzLCB3ZSBhZGQgey4uLn0gYXJvdW5kIHRoZSBjb21tLCBzbyB3ZSBuZWVkIHR3byBleHRyYSBieXRlcyAqLworIyBkZWZpbmUgQ09NTV9ESVNQX0xFTiAoQ09NTV9MRU4gKyAyKQorI2Vsc2UKKyMgZGVmaW5lIENPTU1fRElTUF9MRU4gQ09NTV9MRU4KKyNlbmRpZgorCit0eXBlZGVmIHN0cnVjdCBwcm9jIHsKKwljaGFyIGNvbW1bQ09NTV9ESVNQX0xFTiArIDFdOworLy8JY2hhciBmbGFnczsgLSB1bnVzZWQsIGRlbGV0ZT8KKwlwaWRfdCBwaWQ7CisJdWlkX3QgdWlkOworCXN0cnVjdCBjaGlsZCAqY2hpbGRyZW47CisJc3RydWN0IHByb2MgKnBhcmVudDsKKwlzdHJ1Y3QgcHJvYyAqbmV4dDsKK30gUFJPQzsKKworLyogRm9yIGZsYWdzIGFib3ZlICovCisvLyNkZWZpbmUgUEZMQUdfVEhSRUFEICAweDAxCisKK3R5cGVkZWYgc3RydWN0IGNoaWxkIHsKKwlQUk9DICpjaGlsZDsKKwlzdHJ1Y3QgY2hpbGQgKm5leHQ7Cit9IENISUxEOworCisjZGVmaW5lIGVtcHR5XzIgICIgICIKKyNkZWZpbmUgYnJhbmNoXzIgInwtIgorI2RlZmluZSB2ZXJ0XzIgICAifCAiCisjZGVmaW5lIGxhc3RfMiAgICJgLSIKKyNkZWZpbmUgc2luZ2xlXzMgIi0tLSIKKyNkZWZpbmUgZmlyc3RfMyAgIi0rLSIKKworc3RydWN0IGdsb2JhbHMgeworCS8qIDAtYmFzZWQuIElPVzogdGhlIG51bWJlciBvZiBjaGFycyB3ZSBwcmludGVkIG9uIGN1cnJlbnQgbGluZSAqLworCXVuc2lnbmVkIGN1cl94OworCXVuc2lnbmVkIG91dHB1dF93aWR0aDsKKworCS8qIFRoZSBidWZmZXJzIHdpbGwgYmUgZHluYW1pY2FsbHkgaW5jcmVhc2VkIGluIHNpemUgYXMgbmVlZGVkICovCisJdW5zaWduZWQgY2FwYWNpdHk7CisJdW5zaWduZWQgKndpZHRoOworCXVpbnQ4X3QgKm1vcmU7CisKKwlQUk9DICpsaXN0OworCisJc21hbGxpbnQgZHVtcGVkOyAvKiB1c2VkIGJ5IGR1bXBfYnlfdXNlciAqLworfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorfSB3aGlsZSAoMCkKKworCisvKgorICogQWxsb2NhdGVzIGFkZGl0aW9uYWwgYnVmZmVyIHNwYWNlIGZvciB3aWR0aCBhbmQgbW9yZSBhcyBuZWVkZWQuCisgKiBUaGUgZmlyc3QgY2FsbCB3aWxsIGFsbG9jYXRlIHRoZSBmaXJzdCBidWZmZXIuCisgKgorICogYnVmaW5kZXggIHRoZSBpbmRleCB0aGF0IHdpbGwgYmUgdXNlZCBhZnRlciB0aGUgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLgorICovCitzdGF0aWMgdm9pZCBlbnN1cmVfYnVmZmVyX2NhcGFjaXR5KGludCBidWZpbmRleCkKK3sKKwlpZiAoYnVmaW5kZXggPj0gRy5jYXBhY2l0eSkgeworCQlHLmNhcGFjaXR5ICs9IDB4MTAwOworCQlHLndpZHRoID0geHJlYWxsb2MoRy53aWR0aCwgRy5jYXBhY2l0eSAqIHNpemVvZihHLndpZHRoWzBdKSk7CisJCUcubW9yZSA9IHhyZWFsbG9jKEcubW9yZSwgRy5jYXBhY2l0eSAqIHNpemVvZihHLm1vcmVbMF0pKTsKKwl9Cit9CisKKy8qIE5COiB0aGlzIGZ1bmN0aW9uIGlzIG5ldmVyIGNhbGxlZCB3aXRoICJiYWQiIGNoYXJzCisgKiAoY29udHJvbCBjaGFycyBvciBjaGFycyA+PSAweDdmKQorICovCitzdGF0aWMgdm9pZCBvdXRfY2hhcihjaGFyIGMpCit7CisJRy5jdXJfeCsrOworCWlmIChHLmN1cl94ID4gRy5vdXRwdXRfd2lkdGgpCisJCXJldHVybjsKKwlpZiAoRy5jdXJfeCA9PSBHLm91dHB1dF93aWR0aCkKKwkJYyA9ICcrJzsKKwlwdXRjaGFyKGMpOworfQorCisvKiBOQjogdGhpcyBmdW5jdGlvbiBpcyBuZXZlciBjYWxsZWQgd2l0aCAiYmFkIiBjaGFycworICogKGNvbnRyb2wgY2hhcnMgb3IgY2hhcnMgPj0gMHg3ZikKKyAqLworc3RhdGljIHZvaWQgb3V0X3N0cmluZyhjb25zdCBjaGFyICpzdHIpCit7CisJd2hpbGUgKCpzdHIpCisJCW91dF9jaGFyKCpzdHIrKyk7Cit9CisKK3N0YXRpYyB2b2lkIG91dF9uZXdsaW5lKHZvaWQpCit7CisJcHV0Y2hhcignXG4nKTsKKwlHLmN1cl94ID0gMDsKK30KKworc3RhdGljIFBST0MgKmZpbmRfcHJvYyhwaWRfdCBwaWQpCit7CisJUFJPQyAqd2FsazsKKworCWZvciAod2FsayA9IEcubGlzdDsgd2Fsazsgd2FsayA9IHdhbGstPm5leHQpCisJCWlmICh3YWxrLT5waWQgPT0gcGlkKQorCQkJYnJlYWs7CisKKwlyZXR1cm4gd2FsazsKK30KKworc3RhdGljIFBST0MgKm5ld19wcm9jKGNvbnN0IGNoYXIgKmNvbW0sIHBpZF90IHBpZCwgdWlkX3QgdWlkKQoreworCVBST0MgKm5ldyA9IHh6YWxsb2Moc2l6ZW9mKCpuZXcpKTsKKworCXN0cmNweShuZXctPmNvbW0sIGNvbW0pOworCW5ldy0+cGlkID0gcGlkOworCW5ldy0+dWlkID0gdWlkOworCW5ldy0+bmV4dCA9IEcubGlzdDsKKworCUcubGlzdCA9IG5ldzsKKwlyZXR1cm4gRy5saXN0OworfQorCitzdGF0aWMgdm9pZCBhZGRfY2hpbGQoUFJPQyAqcGFyZW50LCBQUk9DICpjaGlsZCkKK3sKKwlDSElMRCAqbmV3LCAqKndhbGs7CisJaW50IGNtcDsKKworCW5ldyA9IHhtYWxsb2Moc2l6ZW9mKCpuZXcpKTsKKworCW5ldy0+Y2hpbGQgPSBjaGlsZDsKKwlmb3IgKHdhbGsgPSAmcGFyZW50LT5jaGlsZHJlbjsgKndhbGs7IHdhbGsgPSAmKCp3YWxrKS0+bmV4dCkgeworCQljbXAgPSBzdHJjbXAoKCp3YWxrKS0+Y2hpbGQtPmNvbW0sIGNoaWxkLT5jb21tKTsKKwkJaWYgKGNtcCA+IDApCisJCQlicmVhazsKKwkJaWYgKGNtcCA9PSAwICYmICgqd2FsayktPmNoaWxkLT51aWQgPiBjaGlsZC0+dWlkKQorCQkJYnJlYWs7CisJfQorCW5ldy0+bmV4dCA9ICp3YWxrOworCSp3YWxrID0gbmV3OworfQorCitzdGF0aWMgdm9pZCBhZGRfcHJvYyhjb25zdCBjaGFyICpjb21tLCBwaWRfdCBwaWQsIHBpZF90IHBwaWQsCisJCQl1aWRfdCB1aWQgLyosIGNoYXIgaXN0aHJlYWQqLykKK3sKKwlQUk9DICp0aGlzLCAqcGFyZW50OworCisJdGhpcyA9IGZpbmRfcHJvYyhwaWQpOworCWlmICghdGhpcykKKwkJdGhpcyA9IG5ld19wcm9jKGNvbW0sIHBpZCwgdWlkKTsKKwllbHNlIHsKKwkJc3RyY3B5KHRoaXMtPmNvbW0sIGNvbW0pOworCQl0aGlzLT51aWQgPSB1aWQ7CisJfQorCisJaWYgKHBpZCA9PSBwcGlkKQorCQlwcGlkID0gMDsKKy8vCWlmIChpc3RocmVhZCkKKy8vCQl0aGlzLT5mbGFncyB8PSBQRkxBR19USFJFQUQ7CisKKwlwYXJlbnQgPSBmaW5kX3Byb2MocHBpZCk7CisJaWYgKCFwYXJlbnQpCisJCXBhcmVudCA9IG5ld19wcm9jKCI/IiwgcHBpZCwgMCk7CisKKwlhZGRfY2hpbGQocGFyZW50LCB0aGlzKTsKKwl0aGlzLT5wYXJlbnQgPSBwYXJlbnQ7Cit9CisKK3N0YXRpYyBpbnQgdHJlZV9lcXVhbChjb25zdCBQUk9DICphLCBjb25zdCBQUk9DICpiKQoreworCWNvbnN0IENISUxEICp3YWxrX2EsICp3YWxrX2I7CisKKwlpZiAoc3RyY21wKGEtPmNvbW0sIGItPmNvbW0pICE9IDApCisJCXJldHVybiAwOworCWlmICgob3B0aW9uX21hc2szMiAvKiYgT1BUX1BJRCovKSAmJiBhLT5waWQgIT0gYi0+cGlkKQorCQlyZXR1cm4gMDsKKworCWZvciAod2Fsa19hID0gYS0+Y2hpbGRyZW4sIHdhbGtfYiA9IGItPmNoaWxkcmVuOworCSAgd2Fsa19hICYmIHdhbGtfYjsKKwkgIHdhbGtfYSA9IHdhbGtfYS0+bmV4dCwgd2Fsa19iID0gd2Fsa19iLT5uZXh0CisJKSB7CisJCWlmICghdHJlZV9lcXVhbCh3YWxrX2EtPmNoaWxkLCB3YWxrX2ItPmNoaWxkKSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAhKHdhbGtfYSB8fCB3YWxrX2IpOworfQorCitzdGF0aWMgaW50IG91dF9hcmdzKGNvbnN0IGNoYXIgKm15c3RyKQoreworCWNvbnN0IGNoYXIgKmhlcmU7CisJaW50IHN0cmNvdW50ID0gMDsKKwljaGFyIHRtcHN0cls1XTsKKworCWZvciAoaGVyZSA9IG15c3RyOyAqaGVyZTsgaGVyZSsrKSB7CisJCWlmICgqaGVyZSA9PSAnXFwnKSB7CisJCQlvdXRfc3RyaW5nKCJcXFxcIik7CisJCQlzdHJjb3VudCArPSAyOworCQl9IGVsc2UgaWYgKCpoZXJlID49ICcgJyAmJiAqaGVyZSA8IDB4N2YpIHsKKwkJCW91dF9jaGFyKCpoZXJlKTsKKwkJCXN0cmNvdW50Kys7CisJCX0gZWxzZSB7CisJCQlzcHJpbnRmKHRtcHN0ciwgIlxcJTAzbyIsICh1bnNpZ25lZCBjaGFyKSAqaGVyZSk7CisJCQlvdXRfc3RyaW5nKHRtcHN0cik7CisJCQlzdHJjb3VudCArPSA0OworCQl9CisJfQorCisJcmV0dXJuIHN0cmNvdW50OworfQorCitzdGF0aWMgdm9pZAorZHVtcF90cmVlKFBST0MgKmN1cnJlbnQsIGludCBsZXZlbCwgaW50IHJlcCwgaW50IGxlYWYsIGludCBsYXN0LCBpbnQgY2xvc2luZykKK3sKKwlDSElMRCAqd2FsaywgKm5leHQsICoqc2NhbjsKKwlpbnQgbHZsLCBpLCBhZGQsIG9mZnNldCwgY291bnQsIGNvbW1fbGVuLCBmaXJzdDsKKwljaGFyIHRtcFtzaXplb2YoaW50KSozICsgNF07CisKKwlpZiAoIWN1cnJlbnQpCisJCXJldHVybjsKKworCWlmICghbGVhZikgeworCQlmb3IgKGx2bCA9IDA7IGx2bCA8IGxldmVsOyBsdmwrKykgeworCQkJaSA9IEcud2lkdGhbbHZsXSArIDE7CisJCQl3aGlsZSAoLS1pID49IDApCisJCQkJb3V0X2NoYXIoJyAnKTsKKworCQkJaWYgKGx2bCA9PSBsZXZlbCAtIDEpIHsKKwkJCQlpZiAobGFzdCkgeworCQkJCQlvdXRfc3RyaW5nKGxhc3RfMik7CisJCQkJfSBlbHNlIHsKKwkJCQkJb3V0X3N0cmluZyhicmFuY2hfMik7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlpZiAoRy5tb3JlW2x2bCArIDFdKSB7CisJCQkJCW91dF9zdHJpbmcodmVydF8yKTsKKwkJCQl9IGVsc2UgeworCQkJCQlvdXRfc3RyaW5nKGVtcHR5XzIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWFkZCA9IDA7CisJaWYgKHJlcCA+IDEpIHsKKwkJYWRkICs9IHNwcmludGYodG1wLCAiJWQqWyIsIHJlcCk7CisJCW91dF9zdHJpbmcodG1wKTsKKwl9CisJY29tbV9sZW4gPSBvdXRfYXJncyhjdXJyZW50LT5jb21tKTsKKwlpZiAob3B0aW9uX21hc2szMiAvKiYgT1BUX1BJRCovKSB7CisJCWNvbW1fbGVuICs9IHNwcmludGYodG1wLCAiKCVkKSIsIChpbnQpY3VycmVudC0+cGlkKTsKKwkJb3V0X3N0cmluZyh0bXApOworCX0KKwlvZmZzZXQgPSBHLmN1cl94OworCisJaWYgKCFjdXJyZW50LT5jaGlsZHJlbikJeworCQl3aGlsZSAoY2xvc2luZy0tKQorCQkJb3V0X2NoYXIoJ10nKTsKKwkJb3V0X25ld2xpbmUoKTsKKwl9CisJZW5zdXJlX2J1ZmZlcl9jYXBhY2l0eShsZXZlbCk7CisJRy5tb3JlW2xldmVsXSA9ICFsYXN0OworCisJRy53aWR0aFtsZXZlbF0gPSBjb21tX2xlbiArIEcuY3VyX3ggLSBvZmZzZXQgKyBhZGQ7CisJaWYgKEcuY3VyX3ggPj0gRy5vdXRwdXRfd2lkdGgpIHsKKwkJLy9vdXRfc3RyaW5nKGZpcnN0XzMpOyAtIHdoeT8gaXQgd29uJ3QgcHJpbnQgYW55dGhpbmcKKwkJLy9vdXRfY2hhcignKycpOworCQlvdXRfbmV3bGluZSgpOworCQlyZXR1cm47CisJfQorCisJZmlyc3QgPSAxOworCWZvciAod2FsayA9IGN1cnJlbnQtPmNoaWxkcmVuOyB3YWxrOyB3YWxrID0gbmV4dCkgeworCQljb3VudCA9IDA7CisJCW5leHQgPSB3YWxrLT5uZXh0OworCQlzY2FuID0gJndhbGstPm5leHQ7CisJCXdoaWxlICgqc2NhbikgeworCQkJaWYgKCF0cmVlX2VxdWFsKHdhbGstPmNoaWxkLCAoKnNjYW4pLT5jaGlsZCkpCisJCQkJc2NhbiA9ICYoKnNjYW4pLT5uZXh0OworCQkJZWxzZSB7CisJCQkJaWYgKG5leHQgPT0gKnNjYW4pCisJCQkJCW5leHQgPSAoKnNjYW4pLT5uZXh0OworCQkJCWNvdW50Kys7CisJCQkJKnNjYW4gPSAoKnNjYW4pLT5uZXh0OworCQkJfQorCQl9CisJCWlmIChmaXJzdCkgeworCQkJb3V0X3N0cmluZyhuZXh0ID8gZmlyc3RfMyA6IHNpbmdsZV8zKTsKKwkJCWZpcnN0ID0gMDsKKwkJfQorCisJCWR1bXBfdHJlZSh3YWxrLT5jaGlsZCwgbGV2ZWwgKyAxLCBjb3VudCArIDEsCisJCQkJd2FsayA9PSBjdXJyZW50LT5jaGlsZHJlbiwgIW5leHQsCisJCQkJY2xvc2luZyArIChjb3VudCA/IDEgOiAwKSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkdW1wX2J5X3VzZXIoUFJPQyAqY3VycmVudCwgdWlkX3QgdWlkKQoreworCWNvbnN0IENISUxEICp3YWxrOworCisJaWYgKCFjdXJyZW50KQorCQlyZXR1cm47CisKKwlpZiAoY3VycmVudC0+dWlkID09IHVpZCkgeworCQlpZiAoRy5kdW1wZWQpCisJCQlwdXRjaGFyKCdcbicpOworCQlkdW1wX3RyZWUoY3VycmVudCwgMCwgMSwgMSwgMSwgMCk7CisJCUcuZHVtcGVkID0gMTsKKwkJcmV0dXJuOworCX0KKwlmb3IgKHdhbGsgPSBjdXJyZW50LT5jaGlsZHJlbjsgd2Fsazsgd2FsayA9IHdhbGstPm5leHQpCisJCWR1bXBfYnlfdXNlcih3YWxrLT5jaGlsZCwgdWlkKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1NIT1dfVEhSRUFEUworc3RhdGljIHZvaWQgaGFuZGxlX3RocmVhZChjb25zdCBjaGFyICpjb21tLCBwaWRfdCBwaWQsIHBpZF90IHBwaWQsIHVpZF90IHVpZCkKK3sKKwljaGFyIHRocmVhZG5hbWVbQ09NTV9ESVNQX0xFTiArIDFdOworCXNwcmludGYodGhyZWFkbmFtZSwgInslLipzfSIsIChpbnQpc2l6ZW9mKHRocmVhZG5hbWUpIC0gMywgY29tbSk7CisJYWRkX3Byb2ModGhyZWFkbmFtZSwgcGlkLCBwcGlkLCB1aWQvKiwgMSovKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBtcmVhZF9wcm9jKHZvaWQpCit7CisJcHJvY3BzX3N0YXR1c190ICpwID0gTlVMTDsKKwlwaWRfdCBwYXJlbnQgPSAwOworCWludCBmbGFncyA9IFBTU0NBTl9DT01NIHwgUFNTQ0FOX1BJRCB8IFBTU0NBTl9QUElEIHwgUFNTQ0FOX1VJREdJRCB8IFBTU0NBTl9UQVNLUzsKKworCXdoaWxlICgocCA9IHByb2Nwc19zY2FuKHAsIGZsYWdzKSkgIT0gTlVMTCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX1NIT1dfVEhSRUFEUworCQlpZiAocC0+cGlkICE9IHAtPm1haW5fdGhyZWFkX3BpZCkKKwkJCWhhbmRsZV90aHJlYWQocC0+Y29tbSwgcC0+cGlkLCBwYXJlbnQsIHAtPnVpZCk7CisJCWVsc2UKKyNlbmRpZgorCQl7CisJCQlhZGRfcHJvYyhwLT5jb21tLCBwLT5waWQsIHAtPnBwaWQsIHAtPnVpZC8qLCAwKi8pOworCQkJcGFyZW50ID0gcC0+cGlkOworCQl9CisJfQorfQorCitpbnQgcHN0cmVlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBwc3RyZWVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXBpZF90IHBpZCA9IDE7CisJbG9uZyB1aWQgPSAwOworCisJSU5JVF9HKCk7CisKKwlnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KDAsICZHLm91dHB1dF93aWR0aCwgTlVMTCk7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI/MSI7CisJZ2V0b3B0MzIoYXJndiwgInAiKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChhcmd2WzBdKSB7CisJCWlmIChhcmd2WzBdWzBdID49ICcwJyAmJiBhcmd2WzBdWzBdIDw9ICc5JykgeworCQkJcGlkID0geGF0b2koYXJndlswXSk7CisJCX0gZWxzZSB7CisJCQl1aWQgPSB4dW5hbWUydWlkKGFyZ3ZbMF0pOworCQl9CisJfQorCisJbXJlYWRfcHJvYygpOworCisJaWYgKCF1aWQpCisJCWR1bXBfdHJlZShmaW5kX3Byb2MocGlkKSwgMCwgMSwgMSwgMSwgMCk7CisJZWxzZSB7CisJCWR1bXBfYnlfdXNlcihmaW5kX3Byb2MoMSksIHVpZCk7CisJCWlmICghRy5kdW1wZWQpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyBwcm9jZXNzZXMgZm91bmQiKTsKKwkJfQorCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlmcmVlKEcud2lkdGgpOworCQlmcmVlKEcubW9yZSk7CisJfQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcHJvY3BzL3B3ZHguYyBiL3Byb2Nwcy9wd2R4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUzNDE0OQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2Nwcy9wd2R4LmMKQEAgLTAsMCArMSw2MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcHdkeCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoYykgMjAwNCBOaWNob2xhcyBNaWVsbAorICogcG9ydGVkIGZyb20gcHJvY3BzIGJ5IFBlcmUgT3JnYSA8Z290cnVua3NAZ21haWwuY29tPiAyMDExCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2NvbmZpZzpjb25maWcgUFdEWAorLy9jb25maWc6CWJvb2wgInB3ZHgiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgUmVwb3J0IGN1cnJlbnQgd29ya2luZyBkaXJlY3Rvcnkgb2YgYSBwcm9jZXNzCisKKy8vYXBwbGV0OklGX1BXRFgoQVBQTEVUKHB3ZHgsIEJCX0RJUl9VU1JfQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfUFdEWCkgKz0gcHdkeC5vCisKKy8vdXNhZ2U6I2RlZmluZSBwd2R4X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJQSUQuLi4iCisvL3VzYWdlOiNkZWZpbmUgcHdkeF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNob3cgY3VycmVudCBkaXJlY3RvcnkgZm9yIFBJRHMiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgcHdkeF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcHdkeF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiOworCWdldG9wdDMyKGFyZ3YsICIiKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWRvIHsKKwkJY2hhciBidWZbc2l6ZW9mKCIvcHJvYy8ldS9jd2QiKSArIHNpemVvZihpbnQpKjNdOworCQl1bnNpZ25lZCBwaWQ7CisJCWNoYXIgKnM7CisJCWNoYXIgKmFyZyA9ICphcmd2OworCisJCS8vIEFsbG93ZWQgb24gdGhlIGNvbW1hbmQgbGluZToKKwkJLy8gL3Byb2MvTlVNCisJCS8vIE5VTQorCQlpZiAoaXNfcHJlZml4ZWRfd2l0aChhcmcsICIvcHJvYy8iKSkKKwkJCWFyZyArPSA2OworCisJCXBpZCA9IGJiX3N0cnRvdShhcmcsIE5VTEwsIDEwKTsKKwkJaWYgKGVycm5vKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImludmFsaWQgcHJvY2VzcyBpZDogJyVzJyIsIGFyZyk7CisKKwkJc3ByaW50ZihidWYsICIvcHJvYy8ldS9jd2QiLCBwaWQpOworCisJCXMgPSB4bWFsbG9jX3JlYWRsaW5rKGJ1Zik7CisJCS8vICJwd2R4IC9wcm9jLzEiIHNheXMgIi9wcm9jLzE6IERJUiIsIG5vdCAiMTogRElSIgorCQlwcmludGYoIiVzOiAlc1xuIiwgKmFyZ3YsIHMgPyBzIDogc3RyZXJyb3IoZXJybm8gPT0gRU5PRU5UID8gRVNSQ0ggOiBlcnJubykpOworCQlmcmVlKHMpOworCX0gd2hpbGUgKCorK2FyZ3YpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3Byb2Nwcy9yZW5pY2UuYyBiL3Byb2Nwcy9yZW5pY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2Y0MDBhCi0tLSAvZGV2L251bGwKKysrIGIvcHJvY3BzL3JlbmljZS5jCkBAIC0wLDAgKzEsMTM3IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiByZW5pY2UgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgIE1hbnVlbCBOb3ZvYSBJSUkgIDxtam4zQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIE5vdGVzOgorICogICBTZXR0aW5nIGFuIGFic29sdXRlIHByaW9yaXR5IHdhcyBvYnNvbGV0ZWQgaW4gU1VTdjIgYW5kIHJlbW92ZWQKKyAqICAgaW4gU1VTdjMuICBIb3dldmVyLCB0aGUgY29tbW9uIGxpbnV4IHZlcnNpb24gb2YgcmVuaWNlIGRvZXMKKyAqICAgYWJzb2x1dGUgYW5kIG5vdCByZWxhdGl2ZS4gIFNvIHdlJ2xsIGNvbnRpbnVlIHN1cHBvcnRpbmcgYWJzb2x1dGUsCisgKiAgIGFsdGhvdWdoIHRoZSBzdGRvdXQgbG9nZ2luZyBoYXMgYmVlbiByZW1vdmVkIHNpbmNlIGJvdGggU1VTdjIgYW5kCisgKiAgIFNVU3YzIHNwZWNpZnkgdGhhdCBzdGRvdXQgaXNuJ3QgdXNlZC4KKyAqCisgKiAgIFRoaXMgdmVyc2lvbiBpcyBsZW5pZW50IGluIHRoYXQgaXQgZG9lc24ndCByZXF1aXJlIGFueSBJRHMuICBUaGUKKyAqICAgb3B0aW9ucyAtcCwgLWcsIGFuZCAtdSBhcmUgdHJlYXRlZCBhcyBtb2RlIHN3aXRjaGVzIGZvciB0aGUKKyAqICAgZm9sbG93aW5nIElEcyAoaWYgYW55KS4gIE11bHRpcGxlIHN3aXRjaGVzIGFyZSBhbGxvd2VkLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSByZW5pY2VfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgInt7LW4gSU5DUkVNRU5UfSB8IFBSSU9SSVRZfSBbWy1wIHwgLWcgfCAtdV0gSUQuLi5dIgorLy91c2FnZTojZGVmaW5lIHJlbmljZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoYW5nZSBzY2hlZHVsaW5nIHByaW9yaXR5IGZvciBhIHJ1bm5pbmcgcHJvY2Vzc1xuIgorLy91c2FnZTogICAgICJcbgktbglBZGp1c3QgY3VycmVudCBuaWNlIHZhbHVlIChzbWFsbGVyIGlzIGZhc3RlcikiCisvL3VzYWdlOiAgICAgIlxuCS1wCVByb2Nlc3MgaWQocykgKGRlZmF1bHQpIgorLy91c2FnZTogICAgICJcbgktZwlQcm9jZXNzIGdyb3VwIGlkKHMpIgorLy91c2FnZTogICAgICJcbgktdQlQcm9jZXNzIHVzZXIgbmFtZShzKSBhbmQvb3IgaWQocykiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorCit2b2lkIEJVR19iYWRfUFJJT19QUk9DRVNTKHZvaWQpOwordm9pZCBCVUdfYmFkX1BSSU9fUEdSUCh2b2lkKTsKK3ZvaWQgQlVHX2JhZF9QUklPX1VTRVIodm9pZCk7CisKK2ludCByZW5pY2VfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJlbmljZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgWGV0cHJpb3JpdHlfbXNnW10gQUxJR04xID0gIiVjZXRwcmlvcml0eSI7CisKKwlpbnQgcmV0dmFsID0gRVhJVF9TVUNDRVNTOworCWludCB3aGljaCA9IFBSSU9fUFJPQ0VTUzsgIC8qIERlZmF1bHQgJ3doaWNoJyB2YWx1ZS4gKi8KKwlpbnQgdXNlX3JlbGF0aXZlID0gMDsKKwlpbnQgYWRqdXN0bWVudCwgbmV3X3ByaW9yaXR5OworCXVuc2lnbmVkIHdobzsKKwljaGFyICphcmc7CisKKwkvKiBZZXMsIHRoZXkgYXJlIG5vdCAjZGVmaW5lcyBpbiBnbGliYyAyLjQhICNpZiB3b24ndCB3b3JrICovCisJaWYgKFBSSU9fUFJPQ0VTUyA8IENIQVJfTUlOIHx8IFBSSU9fUFJPQ0VTUyA+IENIQVJfTUFYKQorCQlCVUdfYmFkX1BSSU9fUFJPQ0VTUygpOworCWlmIChQUklPX1BHUlAgPCBDSEFSX01JTiB8fCBQUklPX1BHUlAgPiBDSEFSX01BWCkKKwkJQlVHX2JhZF9QUklPX1BHUlAoKTsKKwlpZiAoUFJJT19VU0VSIDwgQ0hBUl9NSU4gfHwgUFJJT19VU0VSID4gQ0hBUl9NQVgpCisJCUJVR19iYWRfUFJJT19VU0VSKCk7CisKKwlhcmcgPSAqKythcmd2OworCisJLyogQ2hlY2sgaWYgd2UgYXJlIHVzaW5nIGEgcmVsYXRpdmUgYWRqdXN0bWVudC4gKi8KKwlpZiAoYXJnICYmIGFyZ1swXSA9PSAnLScgJiYgYXJnWzFdID09ICduJykgeworCQl1c2VfcmVsYXRpdmUgPSAxOworCQlpZiAoIWFyZ1syXSkKKwkJCWFyZyA9ICorK2FyZ3Y7CisJCWVsc2UKKwkJCWFyZyArPSAyOworCX0KKworCWlmICghYXJnKSB7ICAvKiBObyBhcmdzPyAgVGhlbiBzaG93IHVzYWdlLiAqLworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJLyogR2V0IHRoZSBwcmlvcml0eSBhZGp1c3RtZW50IChhYnNvbHV0ZSBvciByZWxhdGl2ZSkuICovCisJYWRqdXN0bWVudCA9IHhhdG9pX3JhbmdlKGFyZywgSU5UX01JTi8yLCBJTlRfTUFYLzIpOworCisJd2hpbGUgKChhcmcgPSAqKythcmd2KSAhPSBOVUxMKSB7CisJCS8qIENoZWNrIGZvciBhIG1vZGUgc3dpdGNoLiAqLworCQlpZiAoYXJnWzBdID09ICctJyAmJiBhcmdbMV0pIHsKKwkJCXN0YXRpYyBjb25zdCBjaGFyIG9wdHNbXSBBTElHTjEgPSB7CisJCQkJJ3AnLCAnZycsICd1JywgMCwgUFJJT19QUk9DRVNTLCBQUklPX1BHUlAsIFBSSU9fVVNFUgorCQkJfTsKKwkJCWNvbnN0IGNoYXIgKnAgPSBzdHJjaHIob3B0cywgYXJnWzFdKTsKKwkJCWlmIChwKSB7CisJCQkJd2hpY2ggPSBwWzRdOworCQkJCWlmICghYXJnWzJdKQorCQkJCQljb250aW51ZTsKKwkJCQlhcmcgKz0gMjsKKwkJCX0KKwkJfQorCisJCS8qIFByb2Nlc3MgYW4gSUQgYXJnLiAqLworCQlpZiAod2hpY2ggPT0gUFJJT19VU0VSKSB7CisJCQlzdHJ1Y3QgcGFzc3dkICpwOworCQkJcCA9IGdldHB3bmFtKGFyZyk7CisJCQlpZiAoIXApIHsKKwkJCQliYl9lcnJvcl9tc2coInVua25vd24gdXNlciAlcyIsIGFyZyk7CisJCQkJZ290byBIQURfRVJST1I7CisJCQl9CisJCQl3aG8gPSBwLT5wd191aWQ7CisJCX0gZWxzZSB7CisJCQl3aG8gPSBiYl9zdHJ0b3UoYXJnLCBOVUxMLCAxMCk7CisJCQlpZiAoZXJybm8pIHsKKwkJCQliYl9lcnJvcl9tc2coImludmFsaWQgbnVtYmVyICclcyciLCBhcmcpOworCQkJCWdvdG8gSEFEX0VSUk9SOworCQkJfQorCQl9CisKKwkJLyogR2V0IHByaW9yaXR5IHRvIHVzZSwgYW5kIHNldCBpdC4gKi8KKwkJaWYgKHVzZV9yZWxhdGl2ZSkgeworCQkJaW50IG9sZF9wcmlvcml0eTsKKworCQkJZXJybm8gPSAwOyAgLyogTmVlZGVkIGZvciBnZXRwcmlvcml0eSBlcnJvciBkZXRlY3Rpb24uICovCisJCQlvbGRfcHJpb3JpdHkgPSBnZXRwcmlvcml0eSh3aGljaCwgd2hvKTsKKwkJCWlmIChlcnJubykgeworCQkJCWJiX3BlcnJvcl9tc2coWGV0cHJpb3JpdHlfbXNnLCAnZycpOworCQkJCWdvdG8gSEFEX0VSUk9SOworCQkJfQorCisJCQluZXdfcHJpb3JpdHkgPSBvbGRfcHJpb3JpdHkgKyBhZGp1c3RtZW50OworCQl9IGVsc2UgeworCQkJbmV3X3ByaW9yaXR5ID0gYWRqdXN0bWVudDsKKwkJfQorCisJCWlmIChzZXRwcmlvcml0eSh3aGljaCwgd2hvLCBuZXdfcHJpb3JpdHkpID09IDApIHsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJYmJfcGVycm9yX21zZyhYZXRwcmlvcml0eV9tc2csICdzJyk7CisgSEFEX0VSUk9SOgorCQlyZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJfQorCisJLyogTm8gbmVlZCB0byBjaGVjayBmb3IgZXJyb3JzIG91dHB1dGluZyB0byBzdGRlcnIgc2luY2UsIGlmIGl0CisJICogd2FzIHVzZWQsIHRoZSBIQURfRVJST1IgbGFiZWwgd2FzIHJlYWNoZWQgYW5kIHJldHZhbCB3YXMgc2V0LiAqLworCisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL3Byb2Nwcy9zbWVtY2FwLmMgYi9wcm9jcHMvc21lbWNhcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMTEyNmEKLS0tIC9kZXYvbnVsbAorKysgYi9wcm9jcHMvc21lbWNhcC5jCkBAIC0wLDAgKzEsMTMyIEBACisvKgorIHNtZW1jYXAgLSBhIHRvb2wgZm9yIG1lYW5pbmdmdWwgbWVtb3J5IHJlcG9ydGluZworCisgQ29weXJpZ2h0IDIwMDgtMjAwOSBNYXR0IE1hY2thbGwgPG1wbUBzZWxlbmljLmNvbT4KKworIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMgb2YKKyB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyIG9yIGxhdGVyLCBpbmNvcnBvcmF0ZWQKKyBoZXJlaW4gYnkgcmVmZXJlbmNlLgorKi8KKworLy9hcHBsZXQ6SUZfU01FTUNBUChBUFBMRVQoc21lbWNhcCwgQkJfRElSX1VTUl9CSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19TTUVNQ0FQKSArPSBzbWVtY2FwLm8KKworLy9jb25maWc6Y29uZmlnIFNNRU1DQVAKKy8vY29uZmlnOglib29sICJzbWVtY2FwIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIHNtZW1jYXAgaXMgYSB0b29sIGZvciBjYXB0dXJpbmcgcHJvY2VzcyBkYXRhIGZvciBzbWVtLAorLy9jb25maWc6CSAgYSBtZW1vcnkgdXNhZ2Ugc3RhdGlzdGljIHRvb2wuCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImJiX2FyY2hpdmUuaCIKKworc3RydWN0IGZpbGVibG9jayB7CisJc3RydWN0IGZpbGVibG9jayAqbmV4dDsKKwljaGFyIGRhdGFbVEFSX0JMT0NLX1NJWkVdOworfTsKKworc3RhdGljIHZvaWQgd3JpdGVoZWFkZXIoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IHN0YXQgKnNiLCBpbnQgdHlwZSkKK3sKKwlzdHJ1Y3QgdGFyX2hlYWRlcl90IGhlYWRlcjsKKwlpbnQgaSwgc3VtOworCisJbWVtc2V0KCZoZWFkZXIsIDAsIFRBUl9CTE9DS19TSVpFKTsKKwlzdHJjcHkoaGVhZGVyLm5hbWUsIHBhdGgpOworCXNwcmludGYoaGVhZGVyLm1vZGUsICIlbyIsIHNiLT5zdF9tb2RlICYgMDc3Nyk7CisJLyogY2FyZWZ1bCB0byBub3Qgb3ZlcmZsb3cgZmllbGRzISAqLworCXNwcmludGYoaGVhZGVyLnVpZCwgIiVvIiwgc2ItPnN0X3VpZCAmIDA3Nzc3Nzc3KTsKKwlzcHJpbnRmKGhlYWRlci5naWQsICIlbyIsIHNiLT5zdF9naWQgJiAwNzc3Nzc3Nyk7CisJc3ByaW50ZihoZWFkZXIuc2l6ZSwgIiVvIiwgKHVuc2lnbmVkKXNiLT5zdF9zaXplKTsKKwlzcHJpbnRmKGhlYWRlci5tdGltZSwgIiVsbG8iLCBzYi0+c3RfbXRpbWUgJiAwNzc3Nzc3Nzc3NzdMTCk7CisJaGVhZGVyLnR5cGVmbGFnID0gdHlwZTsKKwlzdHJjcHkoaGVhZGVyLm1hZ2ljLCAidXN0YXIgICIpOyAvKiBsaWtlIEdOVSB0YXIgKi8KKworCS8qIENhbGN1bGF0ZSBhbmQgc3RvcmUgdGhlIGNoZWNrc3VtICh0aGUgc3VtIG9mIGFsbCBvZiB0aGUgYnl0ZXMgb2YKKwkgKiB0aGUgaGVhZGVyKS4gVGhlIGNoZWNrc3VtIGZpZWxkIG11c3QgYmUgZmlsbGVkIHdpdGggYmxhbmtzIGZvciB0aGUKKwkgKiBjYWxjdWxhdGlvbi4gVGhlIGNoZWNrc3VtIGZpZWxkIGlzIGZvcm1hdHRlZCBkaWZmZXJlbnRseSBmcm9tIHRoZQorCSAqIG90aGVyIGZpZWxkczogaXQgaGFzIDYgZGlnaXRzLCBhIE5VTCwgdGhlbiBhIHNwYWNlIC0tIHJhdGhlciB0aGFuCisJICogZGlnaXRzLCBmb2xsb3dlZCBieSBhIE5VTCBsaWtlIHRoZSBvdGhlciBmaWVsZHMuLi4gKi8KKwloZWFkZXIuY2hrc3VtWzddID0gJyAnOworCXN1bSA9ICcgJyAqIDc7CisJZm9yIChpID0gMDsgaSA8IFRBUl9CTE9DS19TSVpFOyBpKyspCisJCXN1bSArPSAoKHVuc2lnbmVkIGNoYXIqKSZoZWFkZXIpW2ldOworCXNwcmludGYoaGVhZGVyLmNoa3N1bSwgIiUwNm8iLCBzdW0pOworCisJeHdyaXRlKFNURE9VVF9GSUxFTk8sICZoZWFkZXIsIFRBUl9CTE9DS19TSVpFKTsKK30KKworc3RhdGljIHZvaWQgYXJjaGl2ZWZpbGUoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3QgZmlsZWJsb2NrICpzdGFydCwgKmN1cjsKKwlzdHJ1Y3QgZmlsZWJsb2NrICoqcHJldiA9ICZzdGFydDsKKwlpbnQgZmQsIHI7CisJdW5zaWduZWQgc2l6ZSA9IDA7CisJc3RydWN0IHN0YXQgczsKKworCS8qIGJ1ZmZlciB0aGUgZmlsZSAqLworCWZkID0geG9wZW4ocGF0aCwgT19SRE9OTFkpOworCWRvIHsKKwkJY3VyID0geHphbGxvYyhzaXplb2YoKmN1cikpOworCQkqcHJldiA9IGN1cjsKKwkJcHJldiA9ICZjdXItPm5leHQ7CisJCXIgPSBmdWxsX3JlYWQoZmQsIGN1ci0+ZGF0YSwgVEFSX0JMT0NLX1NJWkUpOworCQlpZiAociA+IDApCisJCQlzaXplICs9IHI7CisJfSB3aGlsZSAociA9PSBUQVJfQkxPQ0tfU0laRSk7CisKKwkvKiB3cml0ZSBhcmNoaXZlIGhlYWRlciAqLworCWZzdGF0KGZkLCAmcyk7CisJY2xvc2UoZmQpOworCXMuc3Rfc2l6ZSA9IHNpemU7CisJd3JpdGVoZWFkZXIocGF0aCwgJnMsICcwJyk7CisKKwkvKiBkdW1wIGZpbGUgY29udGVudHMgKi8KKwlmb3IgKGN1ciA9IHN0YXJ0OyAoaW50KXNpemUgPiAwOyBzaXplIC09IFRBUl9CTE9DS19TSVpFKSB7CisJCXh3cml0ZShTVERPVVRfRklMRU5PLCBjdXItPmRhdGEsIFRBUl9CTE9DS19TSVpFKTsKKwkJc3RhcnQgPSBjdXI7CisJCWN1ciA9IGN1ci0+bmV4dDsKKwkJZnJlZShzdGFydCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBhcmNoaXZlam9pbihjb25zdCBjaGFyICpzdWIsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY2hhciBwYXRoW3NpemVvZihsb25nIGxvbmcpKjMgKyBzaXplb2YoIi9jbWRsaW5lIildOworCXNwcmludGYocGF0aCwgIiVzLyVzIiwgc3ViLCBuYW1lKTsKKwlhcmNoaXZlZmlsZShwYXRoKTsKK30KKworLy91c2FnZTojZGVmaW5lIHNtZW1jYXBfdHJpdmlhbF91c2FnZSAiPlNNRU1EQVRBLlRBUiIKKy8vdXNhZ2U6I2RlZmluZSBzbWVtY2FwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ29sbGVjdCBtZW1vcnkgdXNhZ2UgZGF0YSBpbiAvcHJvYyBhbmQgd3JpdGUgaXQgdG8gc3Rkb3V0IgorCitpbnQgc21lbWNhcF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc21lbWNhcF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCURJUiAqZDsKKwlzdHJ1Y3QgZGlyZW50ICpkZTsKKworCXhjaGRpcigiL3Byb2MiKTsKKwlkID0geG9wZW5kaXIoIi4iKTsKKworCWFyY2hpdmVmaWxlKCJtZW1pbmZvIik7CisJYXJjaGl2ZWZpbGUoInZlcnNpb24iKTsKKwl3aGlsZSAoKGRlID0gcmVhZGRpcihkKSkgIT0gTlVMTCkgeworCQlpZiAoaXNkaWdpdChkZS0+ZF9uYW1lWzBdKSkgeworCQkJc3RydWN0IHN0YXQgczsKKwkJCW1lbXNldCgmcywgMCwgc2l6ZW9mKHMpKTsKKwkJCXMuc3RfbW9kZSA9IDA1NTU7CisJCQl3cml0ZWhlYWRlcihkZS0+ZF9uYW1lLCAmcywgJzUnKTsKKwkJCWFyY2hpdmVqb2luKGRlLT5kX25hbWUsICJzbWFwcyIpOworCQkJYXJjaGl2ZWpvaW4oZGUtPmRfbmFtZSwgImNtZGxpbmUiKTsKKwkJCWFyY2hpdmVqb2luKGRlLT5kX25hbWUsICJzdGF0Iik7CisJCX0KKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsb3NlZGlyKGQpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3Byb2Nwcy9zeXNjdGwuYyBiL3Byb2Nwcy9zeXNjdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDg4M2YwCi0tLSAvZGV2L251bGwKKysrIGIvcHJvY3BzL3N5c2N0bC5jCkBAIC0wLDAgKzEsMjg1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBTeXNjdGwgMS4wMSAtIEEgdXRpbGl0eSB0byByZWFkIGFuZCBtYW5pcHVsYXRlIHRoZSBzeXNjdGwgcGFyYW1ldGVycworICoKKyAqIENvcHlyaWdodCAxOTk5IEdlb3JnZSBTdGFpa29zCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBDaGFuZ2Vsb2c6CisgKiB2MS4wMSAgIC0gYWRkZWQgLXAgPHByZWxvYWQ+IHRvIHByZWxvYWQgdmFsdWVzIGZyb20gYSBmaWxlCisgKiB2MS4wMS4xIC0gYnVzeWJveCBhcHBsZXQgYXdhcmUgYnkgPHNvbGFyQGdlbnRvby5vcmc+CisgKi8KKworLy91c2FnZTojZGVmaW5lIHN5c2N0bF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFtLRVlbPVZBTFVFXV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgc3lzY3RsX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2hvdy9zZXQga2VybmVsIHBhcmFtZXRlcnNcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWUJRG9uJ3Qgd2FybiBhYm91dCB1bmtub3duIGtleXMiCisvL3VzYWdlOiAgICAgIlxuCS1uCURvbid0IHNob3cga2V5IG5hbWVzIgorLy91c2FnZTogICAgICJcbgktYQlTaG93IGFsbCB2YWx1ZXMiCisvKiBTYW1lIGFzIC1hLCBubyBuZWVkIHRvIHNob3cgaXQgKi8KKy8qIC8vdXNhZ2U6ICAgICAiXG4JLUEJU2hvdyBhbGwgdmFsdWVzIGluIHRhYmxlIGZvcm0iICovCisvL3VzYWdlOiAgICAgIlxuCS13CVNldCB2YWx1ZXMiCisvL3VzYWdlOiAgICAgIlxuCS1wIEZJTEUJU2V0IHZhbHVlcyBmcm9tIEZJTEUgKGRlZmF1bHQgL2V0Yy9zeXNjdGwuY29uZikiCisvL3VzYWdlOiAgICAgIlxuCS1xICAgICAgU2V0IHZhbHVlcyBzaWxlbnRseSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgc3lzY3RsX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJzeXNjdGwgWy1uXSBbLWVdIHZhcmlhYmxlLi4uXG4iCisvL3VzYWdlOiAgICAgICAic3lzY3RsIFstbl0gWy1lXSBbLXFdIC13IHZhcmlhYmxlPXZhbHVlLi4uXG4iCisvL3VzYWdlOiAgICAgICAic3lzY3RsIFstbl0gWy1lXSAtYVxuIgorLy91c2FnZTogICAgICAgInN5c2N0bCBbLW5dIFstZV0gWy1xXSAtcCBmaWxlCShkZWZhdWx0IC9ldGMvc3lzY3RsLmNvbmYpXG4iCisvL3VzYWdlOiAgICAgICAic3lzY3RsIFstbl0gWy1lXSAtQVxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworZW51bSB7CisJRkxBR19TSE9XX0tFWVMgICAgICAgPSAxIDw8IDAsCisJRkxBR19TSE9XX0tFWV9FUlJPUlMgPSAxIDw8IDEsCisJRkxBR19UQUJMRV9GT1JNQVQgICAgPSAxIDw8IDIsIC8qIG5vdCBpbXBsZW1lbnRlZCAqLworCUZMQUdfU0hPV19BTEwgICAgICAgID0gMSA8PCAzLAorCUZMQUdfUFJFTE9BRF9GSUxFICAgID0gMSA8PCA0LAorLyogVE9ETzogcHJvY3BzIDMuMi44IHNlZW1zIHRvIG5vdCByZXF1aXJlIC13IGZvciBLRVk9VkFMIHRvIHdvcms6ICovCisJRkxBR19XUklURSAgICAgICAgICAgPSAxIDw8IDUsCisJRkxBR19RVUlFVCAgICAgICAgICAgPSAxIDw8IDYsCit9OworI2RlZmluZSBPUFRJT05fU1RSICJuZUFhcHdxIgorCitzdGF0aWMgdm9pZCBzeXNjdGxfZG90c190b19zbGFzaGVzKGNoYXIgKm5hbWUpCit7CisJY2hhciAqY3B0ciwgKmxhc3RfZ29vZCwgKmVuZDsKKworCS8qIENvbnZlcnQgbWluaW11bSBudW1iZXIgb2YgJy4nIHRvICcvJyBzbyB0aGF0CisJICogd2UgZW5kIHVwIHdpdGggZXhpc3RpbmcgZmlsZSdzIG5hbWUuCisJICoKKwkgKiBFeGFtcGxlIGZyb20gYnVnIDM4OTQ6CisJICogbmV0LmlwdjQuY29uZi5ldGgwLjEwMC5tY19mb3J3YXJkaW5nIC0+CisJICogbmV0L2lwdjQvY29uZi9ldGgwLjEwMC9tY19mb3J3YXJkaW5nCisJICogTkI6IG5ldC9pcHY0L2NvbmYvZXRoMC9tY19mb3J3YXJkaW5nICphbHNvIGV4aXN0cyosCisJICogdGhlcmVmb3JlIHdlIG11c3Qgc3RhcnQgZnJvbSB0aGUgZW5kLCBhbmQgaWYKKwkgKiB3ZSByZXBsYWNlZCBldmVuIG9uZSAuIC0+IC8sIHN0YXJ0IG92ZXIgYWdhaW4sCisJICogYnV0IG5ldmVyIHJlcGxhY2UgZG90cyBiZWZvcmUgdGhlIHBvc2l0aW9uCisJICogd2hlcmUgbGFzdCByZXBsYWNlbWVudCBvY2N1cnJlZC4KKwkgKgorCSAqIEFub3RoZXIgYnVnIHdlIGxhdGVyIGhhZCBpcyB0aGF0CisJICogbmV0LmlwdjQuY29uZi5ldGgwLjEwMAorCSAqICh3aXRob3V0IC5tY19mb3J3YXJkaW5nKSB3YXMgbWlzaGFuZGxlZC4KKwkgKgorCSAqIFRvIHNldCB1cCB0ZXN0aW5nOiBtb2Rwcm9iZSA4MDIxcTsgdmNvbmZpZyBhZGQgZXRoMCAxMDAKKwkgKi8KKwllbmQgPSBuYW1lICsgc3RybGVuKG5hbWUpOworCWxhc3RfZ29vZCA9IG5hbWUgLSAxOworCSplbmQgPSAnLic7IC8qIHRyaWNrIHRoZSBsb29wIGludG8gdHJ5aW5nIGZ1bGwgbmFtZSB0b28gKi8KKworIGFnYWluOgorCWNwdHIgPSBlbmQ7CisJd2hpbGUgKGNwdHIgPiBsYXN0X2dvb2QpIHsKKwkJaWYgKCpjcHRyID09ICcuJykgeworCQkJKmNwdHIgPSAnXDAnOworCQkJLy9iYl9lcnJvcl9tc2coInRyeWluZzonJXMnIiwgbmFtZSk7CisJCQlpZiAoYWNjZXNzKG5hbWUsIEZfT0spID09IDApIHsKKwkJCQkqY3B0ciA9ICcvJzsKKwkJCQkvL2JiX2Vycm9yX21zZygicmVwbGFjZWQ6JyVzJyIsIG5hbWUpOworCQkJCWxhc3RfZ29vZCA9IGNwdHI7CisJCQkJZ290byBhZ2FpbjsKKwkJCX0KKwkJCSpjcHRyID0gJy4nOworCQl9CisJCWNwdHItLTsKKwl9CisJKmVuZCA9ICdcMCc7Cit9CisKK3N0YXRpYyBpbnQgc3lzY3RsX2FjdF9vbl9zZXR0aW5nKGNoYXIgKnNldHRpbmcpCit7CisJaW50IGZkLCByZXR2YWwgPSBFWElUX1NVQ0NFU1M7CisJY2hhciAqY3B0ciwgKm91dG5hbWU7CisJY2hhciAqdmFsdWUgPSB2YWx1ZTsgLyogZm9yIGNvbXBpbGVyICovCisKKwlvdXRuYW1lID0geHN0cmR1cChzZXR0aW5nKTsKKworCWNwdHIgPSBvdXRuYW1lOworCXdoaWxlICgqY3B0cikgeworCQlpZiAoKmNwdHIgPT0gJy8nKQorCQkJKmNwdHIgPSAnLic7CisJCWNwdHIrKzsKKwl9CisKKwlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfV1JJVEUpIHsKKwkJY3B0ciA9IHN0cmNocihzZXR0aW5nLCAnPScpOworCQlpZiAoY3B0ciA9PSBOVUxMKSB7CisJCQliYl9lcnJvcl9tc2coImVycm9yOiAnJXMnIG11c3QgYmUgb2YgdGhlIGZvcm0gbmFtZT12YWx1ZSIsCisJCQkJb3V0bmFtZSk7CisJCQlyZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJCQlnb3RvIGVuZDsKKwkJfQorCQl2YWx1ZSA9IGNwdHIgKyAxOyAgLyogcG9pbnQgdG8gdGhlIHZhbHVlIGluIG5hbWU9dmFsdWUgKi8KKwkJaWYgKHNldHRpbmcgPT0gY3B0ciB8fCAhKnZhbHVlKSB7CisJCQliYl9lcnJvcl9tc2coImVycm9yOiBtYWxmb3JtZWQgc2V0dGluZyAnJXMnIiwgb3V0bmFtZSk7CisJCQlyZXR2YWwgPSBFWElUX0ZBSUxVUkU7CisJCQlnb3RvIGVuZDsKKwkJfQorCQkqY3B0ciA9ICdcMCc7CisJCW91dG5hbWVbY3B0ciAtIHNldHRpbmddID0gJ1wwJzsKKwkJLyogcHJvY3BzIDMuMi43IGFjdHVhbGx5IHVzZXMgdGhlc2UgZmxhZ3MgKi8KKwkJZmQgPSBvcGVuKHNldHRpbmcsIE9fV1JPTkxZfE9fQ1JFQVR8T19UUlVOQywgMDY2Nik7CisJfSBlbHNlIHsKKwkJZmQgPSBvcGVuKHNldHRpbmcsIE9fUkRPTkxZKTsKKwl9CisKKwlpZiAoZmQgPCAwKSB7CisJCXN3aXRjaCAoZXJybm8pIHsKKwkJY2FzZSBFQUNDRVM6CisJCQkvKiBIYXBwZW5zIGZvciB3cml0ZS1vbmx5IHNldHRpbmdzLCBlLmcuIG5ldC5pcHY2LnJvdXRlLmZsdXNoICovCisJCQlnb3RvIGVuZDsKKwkJY2FzZSBFTk9FTlQ6CisJCQlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfU0hPV19LRVlfRVJST1JTKQorCQkJCWJiX2Vycm9yX21zZygiZXJyb3I6ICclcycgaXMgYW4gdW5rbm93biBrZXkiLCBvdXRuYW1lKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYmJfcGVycm9yX21zZygiZXJyb3IgJXNpbmcga2V5ICclcyciLAorCQkJCQlvcHRpb25fbWFzazMyICYgRkxBR19XUklURSA/CisJCQkJCQkic2V0dCIgOiAicmVhZCIsCisJCQkJCW91dG5hbWUpOworCQkJYnJlYWs7CisJCX0KKwkJcmV0dmFsID0gRVhJVF9GQUlMVVJFOworCQlnb3RvIGVuZDsKKwl9CisKKwlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfV1JJVEUpIHsKKy8vVE9ETzogcHJvY3BzIDMuMi43IHdyaXRlcyAidmFsdWVcbiIsIG5vdGUgdHJhaWxpbmcgIlxuIgorCQl4d3JpdGVfc3RyKGZkLCB2YWx1ZSk7CisJCWNsb3NlKGZkKTsKKwkJaWYgKCEob3B0aW9uX21hc2szMiAmIEZMQUdfUVVJRVQpKSB7CisJCQlpZiAob3B0aW9uX21hc2szMiAmIEZMQUdfU0hPV19LRVlTKQorCQkJCXByaW50ZigiJXMgPSAiLCBvdXRuYW1lKTsKKwkJCXB1dHModmFsdWUpOworCQl9CisJfSBlbHNlIHsKKwkJY2hhciBjOworCisJCXZhbHVlID0gY3B0ciA9IHhtYWxsb2NfcmVhZChmZCwgTlVMTCk7CisJCWNsb3NlKGZkKTsKKwkJaWYgKHZhbHVlID09IE5VTEwpIHsKKwkJCWJiX3BlcnJvcl9tc2coImVycm9yIHJlYWRpbmcga2V5ICclcyciLCBvdXRuYW1lKTsKKwkJCWdvdG8gZW5kOworCQl9CisKKwkJLyogZGV2LmNkcm9tLmluZm8gYW5kIHN1bnJwYy50cmFuc3BvcnRzLCBmb3IgZXhhbXBsZSwKKwkJICogYXJlIG11bHRpLWxpbmUuIFRyeSAic3lzY3RsIHN1bnJwYy50cmFuc3BvcnRzIgorCQkgKi8KKwkJd2hpbGUgKChjID0gKmNwdHIpICE9ICdcMCcpIHsKKwkJCWlmIChvcHRpb25fbWFzazMyICYgRkxBR19TSE9XX0tFWVMpCisJCQkJcHJpbnRmKCIlcyA9ICIsIG91dG5hbWUpOworCQkJd2hpbGUgKDEpIHsKKwkJCQlmcHV0YyhjLCBzdGRvdXQpOworCQkJCWNwdHIrKzsKKwkJCQlpZiAoYyA9PSAnXG4nKQorCQkJCQlicmVhazsKKwkJCQljID0gKmNwdHI7CisJCQkJaWYgKGMgPT0gJ1wwJykKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZnJlZSh2YWx1ZSk7CisJfQorIGVuZDoKKwlmcmVlKG91dG5hbWUpOworCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQgc3lzY3RsX2FjdF9yZWN1cnNpdmUoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlESVIgKmRpcnA7CisJc3RydWN0IHN0YXQgYnVmOworCXN0cnVjdCBkaXJlbnQgKmVudHJ5OworCWNoYXIgKm5leHQ7CisJaW50IHJldHZhbCA9IDA7CisKKwlzdGF0KHBhdGgsICZidWYpOworCWlmIChTX0lTRElSKGJ1Zi5zdF9tb2RlKSAmJiAhKG9wdGlvbl9tYXNrMzIgJiBGTEFHX1dSSVRFKSkgeworCQlkaXJwID0gb3BlbmRpcihwYXRoKTsKKwkJaWYgKGRpcnAgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKwkJd2hpbGUgKChlbnRyeSA9IHJlYWRkaXIoZGlycCkpICE9IE5VTEwpIHsKKwkJCW5leHQgPSBjb25jYXRfc3VicGF0aF9maWxlKHBhdGgsIGVudHJ5LT5kX25hbWUpOworCQkJaWYgKG5leHQgPT0gTlVMTCkKKwkJCQljb250aW51ZTsgLyogZF9uYW1lIGlzICIuIiBvciAiLi4iICovCisJCQkvKiBpZiBwYXRoIHdhcyAiLiIsIGRyb3AgIi4vIiBwcmVmaXg6ICovCisJCQlyZXR2YWwgfD0gc3lzY3RsX2FjdF9yZWN1cnNpdmUoKG5leHRbMF0gPT0gJy4nICYmIG5leHRbMV0gPT0gJy8nKSA/CisJCQkJCW5leHQgKyAyIDogbmV4dCk7CisJCQlmcmVlKG5leHQpOworCQl9CisJCWNsb3NlZGlyKGRpcnApOworCX0gZWxzZSB7CisJCWNoYXIgKm5hbWUgPSB4c3RyZHVwKHBhdGgpOworCQlyZXR2YWwgfD0gc3lzY3RsX2FjdF9vbl9zZXR0aW5nKG5hbWUpOworCQlmcmVlKG5hbWUpOworCX0KKworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIFNldCBzeXNjdGwncyBmcm9tIGEgY29uZiBmaWxlLiBGb3JtYXQgZXhhbXBsZToKKyAqICMgQ29udHJvbHMgSVAgcGFja2V0IGZvcndhcmRpbmcKKyAqIG5ldC5pcHY0LmlwX2ZvcndhcmQgPSAwCisgKi8KK3N0YXRpYyBpbnQgc3lzY3RsX2hhbmRsZV9wcmVsb2FkX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJY2hhciAqdG9rZW5bMl07CisJcGFyc2VyX3QgKnBhcnNlcjsKKworCXBhcnNlciA9IGNvbmZpZ19vcGVuKGZpbGVuYW1lKTsKKwkvKiBNdXN0IGRvIGl0IF9hZnRlcl8gY29uZmlnX29wZW4oKTogKi8KKwl4Y2hkaXIoIi9wcm9jL3N5cyIpOworCS8qIHhjaHJvb3QoIi9wcm9jL3N5cyIpIC0gaWYgeW91IGFyZSBwYXJhbm9pZCAqLworCisvL1RPRE86ICc7JyBpcyBjb21tZW50IGNoYXIgdG9vCisvL1RPRE86IGNvbW1lbnQgbWF5IGJlIG9ubHkgYXQgbGluZSBzdGFydC4gInZhcj0xICNhYmMiIC0gIjEgI2FiYyIgaXMgdGhlIHZhbHVlCisvLyAoYnV0IF93aGl0ZXNwYWNlXyBmcm9tIGVuZHMgc2hvdWxkIGJlIHRyaW1tZWQgZmlyc3QgKGFuZCB3ZSBkbyBpdCByaWdodCkpCisvL1RPRE86ICJ2YXI9PTEiIGlzIG1pc2hhbmRsZWQgKG11c3QgdXNlICI9MSIgYXMgYSB2YWx1ZSwgYnV0IHVzZXMgIjEiKQorLy8gY2FuIGl0IGJlIGZpeGVkIGJ5IHJlbW92aW5nIFBBUlNFX0NPTExBUFNFIGJpdD8KKwl3aGlsZSAoY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbiwgMiwgMiwgIiMgXHQ9IiwgUEFSU0VfTk9STUFMKSkgeworCQljaGFyICp0cDsKKwkJc3lzY3RsX2RvdHNfdG9fc2xhc2hlcyh0b2tlblswXSk7CisJCXRwID0geGFzcHJpbnRmKCIlcz0lcyIsIHRva2VuWzBdLCB0b2tlblsxXSk7CisJCXN5c2N0bF9hY3RfcmVjdXJzaXZlKHRwKTsKKwkJZnJlZSh0cCk7CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzeXNjdGxfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHN5c2N0bF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHJldHZhbDsKKwlpbnQgb3B0OworCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIisiIE9QVElPTl9TVFIpOyAvKiAnKycgLSBzdG9wIG9uIGZpcnN0IG5vbi1vcHRpb24gKi8KKwlhcmd2ICs9IG9wdGluZDsKKwlvcHQgXj0gKEZMQUdfU0hPV19LRVlTIHwgRkxBR19TSE9XX0tFWV9FUlJPUlMpOworCW9wdGlvbl9tYXNrMzIgPSBvcHQ7CisKKwlpZiAob3B0ICYgRkxBR19QUkVMT0FEX0ZJTEUpIHsKKwkJb3B0aW9uX21hc2szMiB8PSBGTEFHX1dSSVRFOworCQkvKiB4Y2hkaXIoIi9wcm9jL3N5cyIpIGlzIGluc2lkZSAqLworCQlyZXR1cm4gc3lzY3RsX2hhbmRsZV9wcmVsb2FkX2ZpbGUoKmFyZ3YgPyAqYXJndiA6ICIvZXRjL3N5c2N0bC5jb25mIik7CisJfQorCXhjaGRpcigiL3Byb2Mvc3lzIik7CisJLyogeGNocm9vdCgiL3Byb2Mvc3lzIikgLSBpZiB5b3UgYXJlIHBhcmFub2lkICovCisJaWYgKG9wdCAmIChGTEFHX1RBQkxFX0ZPUk1BVCB8IEZMQUdfU0hPV19BTEwpKSB7CisJCXJldHVybiBzeXNjdGxfYWN0X3JlY3Vyc2l2ZSgiLiIpOworCX0KKworCXJldHZhbCA9IDA7CisJd2hpbGUgKCphcmd2KSB7CisJCXN5c2N0bF9kb3RzX3RvX3NsYXNoZXMoKmFyZ3YpOworCQlyZXR2YWwgfD0gc3lzY3RsX2FjdF9yZWN1cnNpdmUoKmFyZ3YpOworCQlhcmd2Kys7CisJfQorCisJcmV0dXJuIHJldHZhbDsKK30KZGlmZiAtLWdpdCBhL3Byb2Nwcy90b3AuYyBiL3Byb2Nwcy90b3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDY3YzNjCi0tLSAvZGV2L251bGwKKysrIGIvcHJvY3BzL3RvcC5jCkBAIC0wLDAgKzEsMTI2MCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQSB0aW55ICd0b3AnIHV0aWxpdHkuCisgKgorICogVGhpcyBpcyB3cml0dGVuIHNwZWNpZmljYWxseSBmb3IgdGhlIGxpbnV4IC9wcm9jLzxQSUQ+L3N0YXQobSkKKyAqIGZpbGVzIGZvcm1hdC4KKyAqCisgKiBUaGlzIHJlYWRzIHRoZSBQSURzIG9mIGFsbCBwcm9jZXNzZXMgYW5kIHRoZWlyIHN0YXR1cyBhbmQgc2hvd3MKKyAqIHRoZSBzdGF0dXMgb2YgcHJvY2Vzc2VzIChmaXJzdCBvbmVzIHRoYXQgZml0IHRvIHNjcmVlbikgYXQgZ2l2ZW4KKyAqIGludGVydmFscy4KKyAqCisgKiBOT1RFUzoKKyAqIC0gQXQgc3RhcnR1cCB0aGlzIGNoYW5nZXMgdG8gL3Byb2MsIGFsbCB0aGUgcmVhZHMgYXJlIHRoZW4KKyAqICAgcmVsYXRpdmUgdG8gdGhhdC4KKyAqCisgKiAoQykgRWVybyBUYW1taW5lbiA8b2FrIGF0IHdlbGhvIGRvdCBjb20+CisgKgorICogUmV3cml0dGVuIGJ5IFZsYWRpbWlyIE9sZXluaWsgKEMpIDIwMDIgPGR6b0BzaW10cmVhcy5ydT4KKyAqCisgKiBTZXB0IDIwMDg6IFZpbmVldCBHdXB0YSA8dmluZWV0Lmd1cHRhQGFyYy5jb20+CisgKiBBZGRlZCBTdXBwb3J0IGZvciByZXBvcnRpbmcgU01QIEluZm9ybWF0aW9uCisgKiAtIENQVSB3aGVyZSBwcm9jZXNzIHdhcyBsYXN0IHNlZW4gcnVubmluZworICogICAodG8gc2VlIGVmZmVjdCBvZiBzY2hlZF9zZXRhZmZpbml0eSgpIGV0YykKKyAqIC0gQ1BVIHRpbWUgc3BsaXQgKGlkbGUvSU8vd2FpdCBldGMpIHBlciBDUFUKKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTIgQnJhbmtvIExhbmtlc3RlcgorICogQ29weXJpZ2h0IChjKSAxOTkyIFJvZ2VyIEJpbm5zCisgKiBDb3B5cmlnaHQgKEMpIDE5OTQtMTk5NiBDaGFybGVzIEwuIEJsYWtlLgorICogQ29weXJpZ2h0IChDKSAxOTkyLTE5OTggTWljaGFlbCBLLiBKb2huc29uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworLyogSG93IHRvIHNuYXBzaG90IC9wcm9jIGZvciBkZWJ1Z2dpbmcgdG9wIHByb2JsZW1zOgorICogZm9yIGYgaW4gL3Byb2MvWzAtOV0qIiIvc3RhdDsgZG8KKyAqICAgICAgICAgbj0ke2YjL3Byb2MvfQorICogICAgICAgICBuPSR7biUvc3RhdH1fc3RhdAorICogICAgICAgICBjcCAkZiAkbgorICogZG9uZQorICogY3AgL3Byb2Mvc3RhdCAvcHJvYy9tZW1pbmZvIC9wcm9jL2xvYWRhdmcgLgorICogdG9wIC1ibjEgPnRvcC5vdXQKKyAqCisgKiAuLi5hbmQgaG93IHRvIHJ1biB0b3Agb24gaXQgb24gYW5vdGhlciBtYWNoaW5lOgorICogcm0gLXJmIHByb2M7IG1rZGlyIHByb2MKKyAqIGZvciBmIGluIFswLTldKl9zdGF0OyBkbworICogICAgICAgICBwPSR7ZiVfc3RhdH0KKyAqICAgICAgICAgbWtkaXIgLXAgcHJvYy8kcAorICogICAgICAgICBjcCAkZiBwcm9jLyRwL3N0YXQKKyAqIGRvbmUKKyAqIGNwIHN0YXQgbWVtaW5mbyBsb2FkYXZnIHByb2MKKyAqIGNocm9vdCAuIC4vdG9wIC1ibjEgPnRvcDEub3V0CisgKi8KKworLy9jb25maWc6Y29uZmlnIFRPUAorLy9jb25maWc6CWJvb2wgInRvcCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGUgdG9wIHByb2dyYW0gcHJvdmlkZXMgYSBkeW5hbWljIHJlYWwtdGltZSB2aWV3IG9mIGEgcnVubmluZworLy9jb25maWc6CSAgc3lzdGVtLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UKKy8vY29uZmlnOglib29sICJTaG93IENQVSBwZXItcHJvY2VzcyB1c2FnZSBwZXJjZW50YWdlIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVE9QCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgTWFrZSB0b3AgZGlzcGxheSBDUFUgdXNhZ2UgZm9yIGVhY2ggcHJvY2Vzcy4KKy8vY29uZmlnOgkgIFRoaXMgYWRkcyBhYm91dCAyay4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVE9QX0NQVV9HTE9CQUxfUEVSQ0VOVFMKKy8vY29uZmlnOglib29sICJTaG93IENQVSBnbG9iYWwgdXNhZ2UgcGVyY2VudGFnZSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgTWFrZXMgdG9wIGRpc3BsYXkgIkNQVTogTk4lIHVzciBOTiUgc3lzLi4uIiBsaW5lLgorLy9jb25maWc6CSAgVGhpcyBhZGRzIGFib3V0IDAuNWsuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1RPUF9TTVBfQ1BVCisvL2NvbmZpZzoJYm9vbCAiU01QIENQVSB1c2FnZSBkaXNwbGF5ICgnYycga2V5KSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZFQVRVUkVfVE9QX0NQVV9HTE9CQUxfUEVSQ0VOVFMKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBBbGxvdyAnYycga2V5IHRvIHN3aXRjaCBiZXR3ZWVuIGluZGl2aWR1YWwvY3VtdWxhdGl2ZSBDUFUgc3RhdHMKKy8vY29uZmlnOgkgIFRoaXMgYWRkcyBhYm91dCAwLjVrLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9UT1BfREVDSU1BTFMKKy8vY29uZmlnOglib29sICJTaG93IDEvMTB0aCBvZiBhIHBlcmNlbnQgaW4gQ1BVL21lbSBzdGF0aXN0aWNzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTaG93IDEvMTB0aCBvZiBhIHBlcmNlbnQgaW4gQ1BVL21lbSBzdGF0aXN0aWNzLgorLy9jb25maWc6CSAgVGhpcyBhZGRzIGFib3V0IDAuM2suCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUworLy9jb25maWc6CWJvb2wgIlNob3cgQ1BVIHByb2Nlc3MgcnVucyBvbiAoJ2onIGZpZWxkKSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFRPUAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFNob3cgQ1BVIHdoZXJlIHByb2Nlc3Mgd2FzIGxhc3QgZm91bmQgcnVubmluZyBvbi4KKy8vY29uZmlnOgkgIFRoaXMgaXMgdGhlICdqJyBmaWVsZC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVE9QTUVNCisvL2NvbmZpZzoJYm9vbCAiVG9wbWVtIGNvbW1hbmQgKCdzJyBrZXkpIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVE9QCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlICdzJyBpbiB0b3AgKGdpdmVzIGxvdHMgb2YgbWVtb3J5IGluZm8pLgorCisjaW5jbHVkZSAibGliYmIuaCIKKworCit0eXBlZGVmIHN0cnVjdCB0b3Bfc3RhdHVzX3QgeworCXVuc2lnbmVkIGxvbmcgdnN6OworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRQorCXVuc2lnbmVkIGxvbmcgdGlja3M7CisJdW5zaWduZWQgcGNwdTsgLyogZGVsdGEgb2YgdGlja3MgKi8KKyNlbmRpZgorCXVuc2lnbmVkIHBpZCwgcHBpZDsKKwl1bnNpZ25lZCB1aWQ7CisJY2hhciBzdGF0ZVs0XTsKKwljaGFyIGNvbW1bQ09NTV9MRU5dOworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUworCWludCBsYXN0X3NlZW5fb25fY3B1OworI2VuZGlmCit9IHRvcF9zdGF0dXNfdDsKKwordHlwZWRlZiBzdHJ1Y3QgamlmZnlfY291bnRzX3QgeworCS8qIExpbnV4IDIuNC54IGhhcyBvbmx5IGZpcnN0IGZvdXIgKi8KKwl1bnNpZ25lZCBsb25nIGxvbmcgdXNyLCBuaWMsIHN5cywgaWRsZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgaW93YWl0LCBpcnEsIHNvZnRpcnEsIHN0ZWFsOworCXVuc2lnbmVkIGxvbmcgbG9uZyB0b3RhbDsKKwl1bnNpZ25lZCBsb25nIGxvbmcgYnVzeTsKK30gamlmZnlfY291bnRzX3Q7CisKKy8qIFRoaXMgc3RydWN0dXJlIHN0b3JlcyBzb21lIGNyaXRpY2FsIGluZm9ybWF0aW9uIGZyb20gb25lIGZyYW1lIHRvCisgICB0aGUgbmV4dC4gVXNlZCBmb3IgZmluZGluZyBkZWx0YXMuICovCit0eXBlZGVmIHN0cnVjdCBzYXZlX2hpc3QgeworCXVuc2lnbmVkIGxvbmcgdGlja3M7CisJcGlkX3QgcGlkOworfSBzYXZlX2hpc3Q7CisKK3R5cGVkZWYgaW50ICgqY21wX2Z1bmNwKSh0b3Bfc3RhdHVzX3QgKlAsIHRvcF9zdGF0dXNfdCAqUSk7CisKKworZW51bSB7IFNPUlRfREVQVEggPSAzIH07CisKKworc3RydWN0IGdsb2JhbHMgeworCXRvcF9zdGF0dXNfdCAqdG9wOworCWludCBudG9wOworCXNtYWxsaW50IGludmVydGVkOworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUE1FTQorCXNtYWxsaW50IHNvcnRfZmllbGQ7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BfU01QX0NQVQorCXNtYWxsaW50IHNtcF9jcHVfaW5mbzsgLyogb25lL21hbnkgY3B1IGluZm8gbGluZXM/ICovCisjZW5kaWYKKwl1bnNpZ25lZCBsaW5lczsgIC8qIHNjcmVlbiBoZWlnaHQgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUworCXN0cnVjdCB0ZXJtaW9zIGluaXRpYWxfc2V0dGluZ3M7CisJaW50IHNjcm9sbF9vZnM7CisjZGVmaW5lIEdfc2Nyb2xsX29mcyBHLnNjcm9sbF9vZnMKKyNlbHNlCisjZGVmaW5lIEdfc2Nyb2xsX29mcyAwCisjZW5kaWYKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFCisJY21wX2Z1bmNwIHNvcnRfZnVuY3Rpb25bMV07CisjZWxzZQorCWNtcF9mdW5jcCBzb3J0X2Z1bmN0aW9uW1NPUlRfREVQVEhdOworCXN0cnVjdCBzYXZlX2hpc3QgKnByZXZfaGlzdDsKKwlpbnQgcHJldl9oaXN0X2NvdW50OworCWppZmZ5X2NvdW50c190IGN1cl9qaWYsIHByZXZfamlmOworCS8qIGludCBoaXN0X2l0ZXJhdGlvbnM7ICovCisJdW5zaWduZWQgdG90YWxfcGNwdTsKKwkvKiB1bnNpZ25lZCBsb25nIHRvdGFsX3ZzejsgKi8KKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1RPUF9TTVBfQ1BVCisJLyogUGVyIENQVSBzYW1wbGVzOiBjdXJyZW50IGFuZCBsYXN0ICovCisJamlmZnlfY291bnRzX3QgKmNwdV9qaWYsICpjcHVfcHJldl9qaWY7CisJaW50IG51bV9jcHVzOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX1RFUk1JT1MKKwljaGFyIGtiZF9pbnB1dFtLRVlDT0RFX0JVRkZFUl9TSVpFXTsKKyNlbmRpZgorCWNoYXIgbGluZV9idWZbODBdOworfTsgLy9GSVhfQUxJQVNJTkc7IC0gbGFyZ2UgY29kZSBncm93dGgKK2VudW0geyBMSU5FX0JVRl9TSVpFID0gQ09NTU9OX0JVRlNJWkUgLSBvZmZzZXRvZihzdHJ1Y3QgZ2xvYmFscywgbGluZV9idWYpIH07CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKK3N0cnVjdCBCVUdfYmFkX3NpemUgeworCWNoYXIgQlVHX0dfdG9vX2JpZ1tzaXplb2YoRykgPD0gQ09NTU9OX0JVRlNJWkUgPyAxIDogLTFdOworCWNoYXIgQlVHX2xpbmVfYnVmX3Rvb19zbWFsbFtMSU5FX0JVRl9TSVpFID4gODAgPyAxIDogLTFdOworfTsKKyNkZWZpbmUgdG9wICAgICAgICAgICAgICAoRy50b3AgICAgICAgICAgICAgICApCisjZGVmaW5lIG50b3AgICAgICAgICAgICAgKEcubnRvcCAgICAgICAgICAgICAgKQorI2RlZmluZSBzb3J0X2ZpZWxkICAgICAgIChHLnNvcnRfZmllbGQgICAgICAgICkKKyNkZWZpbmUgaW52ZXJ0ZWQgICAgICAgICAoRy5pbnZlcnRlZCAgICAgICAgICApCisjZGVmaW5lIHNtcF9jcHVfaW5mbyAgICAgKEcuc21wX2NwdV9pbmZvICAgICAgKQorI2RlZmluZSBpbml0aWFsX3NldHRpbmdzIChHLmluaXRpYWxfc2V0dGluZ3MgICkKKyNkZWZpbmUgc29ydF9mdW5jdGlvbiAgICAoRy5zb3J0X2Z1bmN0aW9uICAgICApCisjZGVmaW5lIHByZXZfaGlzdCAgICAgICAgKEcucHJldl9oaXN0ICAgICAgICAgKQorI2RlZmluZSBwcmV2X2hpc3RfY291bnQgIChHLnByZXZfaGlzdF9jb3VudCAgICkKKyNkZWZpbmUgY3VyX2ppZiAgICAgICAgICAoRy5jdXJfamlmICAgICAgICAgICApCisjZGVmaW5lIHByZXZfamlmICAgICAgICAgKEcucHJldl9qaWYgICAgICAgICAgKQorI2RlZmluZSBjcHVfamlmICAgICAgICAgIChHLmNwdV9qaWYgICAgICAgICAgICkKKyNkZWZpbmUgY3B1X3ByZXZfamlmICAgICAoRy5jcHVfcHJldl9qaWYgICAgICApCisjZGVmaW5lIG51bV9jcHVzICAgICAgICAgKEcubnVtX2NwdXMgICAgICAgICAgKQorI2RlZmluZSB0b3RhbF9wY3B1ICAgICAgIChHLnRvdGFsX3BjcHUgICAgICAgICkKKyNkZWZpbmUgbGluZV9idWYgICAgICAgICAoRy5saW5lX2J1ZiAgICAgICAgICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgfSB3aGlsZSAoMCkKKworZW51bSB7CisJT1BUX2QgPSAoMSA8PCAwKSwKKwlPUFRfbiA9ICgxIDw8IDEpLAorCU9QVF9iID0gKDEgPDwgMiksCisJT1BUX20gPSAoMSA8PCAzKSwKKwlPUFRfRU9GID0gKDEgPDwgNCksIC8qIHBzZXVkbzogIndlIHNhdyBFT0YgaW4gc3RkaW4iICovCit9OworI2RlZmluZSBPUFRfQkFUQ0hfTU9ERSAob3B0aW9uX21hc2szMiAmIE9QVF9iKQorCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUworc3RhdGljIGludCBwaWRfc29ydCh0b3Bfc3RhdHVzX3QgKlAsIHRvcF9zdGF0dXNfdCAqUSkKK3sKKwkvKiBCdWdneSB3cnQgcGlkcyB3aXRoIGhpZ2ggYml0IHNldCAqLworCS8qIChsaW51eCBwaWRzIGFyZSBpbiBbMS4uMl4xNS0xXSkgKi8KKwlyZXR1cm4gKFEtPnBpZCAtIFAtPnBpZCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBtZW1fc29ydCh0b3Bfc3RhdHVzX3QgKlAsIHRvcF9zdGF0dXNfdCAqUSkKK3sKKwkvKiBXZSB3YW50IHRvIGF2b2lkIHVuc2lnbmVkLT5zaWduZWQgYW5kIHRydW5jYXRpb24gZXJyb3JzICovCisJaWYgKFEtPnZzeiA8IFAtPnZzeikgcmV0dXJuIC0xOworCXJldHVybiBRLT52c3ogIT0gUC0+dnN6OyAvKiAwIGlmID09LCAxIGlmID4gKi8KK30KKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFCisKK3N0YXRpYyBpbnQgcGNwdV9zb3J0KHRvcF9zdGF0dXNfdCAqUCwgdG9wX3N0YXR1c190ICpRKQoreworCS8qIEJ1Z2d5IHdydCB0aWNrcyB3aXRoIGhpZ2ggYml0IHNldCAqLworCS8qIEFmZmVjdHMgb25seSBwcm9jZXNzZXMgZm9yIHdoaWNoIHRpY2tzIG92ZXJmbG93ICovCisJcmV0dXJuIChpbnQpUS0+cGNwdSAtIChpbnQpUC0+cGNwdTsKK30KKworc3RhdGljIGludCB0aW1lX3NvcnQodG9wX3N0YXR1c190ICpQLCB0b3Bfc3RhdHVzX3QgKlEpCit7CisJLyogV2Ugd2FudCB0byBhdm9pZCB1bnNpZ25lZC0+c2lnbmVkIGFuZCB0cnVuY2F0aW9uIGVycm9ycyAqLworCWlmIChRLT50aWNrcyA8IFAtPnRpY2tzKSByZXR1cm4gLTE7CisJcmV0dXJuIFEtPnRpY2tzICE9IFAtPnRpY2tzOyAvKiAwIGlmID09LCAxIGlmID4gKi8KK30KKworc3RhdGljIGludCBtdWx0X2x2bF9jbXAodm9pZCogYSwgdm9pZCogYikKK3sKKwlpbnQgaSwgY21wX3ZhbDsKKworCWZvciAoaSA9IDA7IGkgPCBTT1JUX0RFUFRIOyBpKyspIHsKKwkJY21wX3ZhbCA9ICgqc29ydF9mdW5jdGlvbltpXSkoYSwgYik7CisJCWlmIChjbXBfdmFsICE9IDApCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGludmVydGVkID8gLWNtcF92YWwgOiBjbXBfdmFsOworfQorCitzdGF0aWMgTk9JTkxJTkUgaW50IHJlYWRfY3B1X2ppZmZ5KEZJTEUgKmZwLCBqaWZmeV9jb3VudHNfdCAqcF9qaWYpCit7CisjaWYgIUVOQUJMRV9GRUFUVVJFX1RPUF9TTVBfQ1BVCisJc3RhdGljIGNvbnN0IGNoYXIgZm10W10gPSAiY3B1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSI7CisjZWxzZQorCXN0YXRpYyBjb25zdCBjaGFyIGZtdFtdID0gImNwJSpzICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSAlbGx1ICVsbHUgJWxsdSI7CisjZW5kaWYKKwlpbnQgcmV0OworCisJaWYgKCFmZ2V0cyhsaW5lX2J1ZiwgTElORV9CVUZfU0laRSwgZnApIHx8IGxpbmVfYnVmWzBdICE9ICdjJyAvKiBub3QgImNwdSIgKi8pCisJCXJldHVybiAwOworCXJldCA9IHNzY2FuZihsaW5lX2J1ZiwgZm10LAorCQkJJnBfamlmLT51c3IsICZwX2ppZi0+bmljLCAmcF9qaWYtPnN5cywgJnBfamlmLT5pZGxlLAorCQkJJnBfamlmLT5pb3dhaXQsICZwX2ppZi0+aXJxLCAmcF9qaWYtPnNvZnRpcnEsCisJCQkmcF9qaWYtPnN0ZWFsKTsKKwlpZiAocmV0ID49IDQpIHsKKwkJcF9qaWYtPnRvdGFsID0gcF9qaWYtPnVzciArIHBfamlmLT5uaWMgKyBwX2ppZi0+c3lzICsgcF9qaWYtPmlkbGUKKwkJCSsgcF9qaWYtPmlvd2FpdCArIHBfamlmLT5pcnEgKyBwX2ppZi0+c29mdGlycSArIHBfamlmLT5zdGVhbDsKKwkJLyogcHJvY3BzIDIueCBkb2VzIG5vdCBjb3VudCBpb3dhaXQgYXMgYnVzeSB0aW1lICovCisJCXBfamlmLT5idXN5ID0gcF9qaWYtPnRvdGFsIC0gcF9qaWYtPmlkbGUgLSBwX2ppZi0+aW93YWl0OworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9qaWZmeV9jb3VudHModm9pZCkKK3sKKwlGSUxFKiBmcCA9IHhmb3Blbl9mb3JfcmVhZCgic3RhdCIpOworCisJLyogV2UgbmVlZCB0byBwYXJzZSBjdW11bGF0aXZlIGNvdW50cyBldmVuIGlmIFNNUCBDUFUgZGlzcGxheSBpcyBvbiwKKwkgKiB0aGV5IGFyZSB1c2VkIHRvIGNhbGN1bGF0ZSBwZXIgcHJvY2VzcyBDUFUlICovCisJcHJldl9qaWYgPSBjdXJfamlmOworCWlmIChyZWFkX2NwdV9qaWZmeShmcCwgJmN1cl9qaWYpIDwgNCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJlYWQgJyVzJyIsICIvcHJvYy9zdGF0Iik7CisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfVE9QX1NNUF9DUFUKKwlmY2xvc2UoZnApOworCXJldHVybjsKKyNlbHNlCisJaWYgKCFzbXBfY3B1X2luZm8pIHsKKwkJZmNsb3NlKGZwKTsKKwkJcmV0dXJuOworCX0KKworCWlmICghbnVtX2NwdXMpIHsKKwkJLyogRmlyc3QgdGltZSBoZXJlLiBIb3cgbWFueSBDUFVzPworCQkgKiBUaGVyZSB3aWxsIGJlIGF0IGxlYXN0IDEgL3Byb2Mvc3RhdCBsaW5lIHdpdGggY3B1JWQKKwkJICovCisJCXdoaWxlICgxKSB7CisJCQljcHVfamlmID0geHJlYWxsb2NfdmVjdG9yKGNwdV9qaWYsIDEsIG51bV9jcHVzKTsKKwkJCWlmIChyZWFkX2NwdV9qaWZmeShmcCwgJmNwdV9qaWZbbnVtX2NwdXNdKSA8PSA0KQorCQkJCWJyZWFrOworCQkJbnVtX2NwdXMrKzsKKwkJfQorCQlpZiAobnVtX2NwdXMgPT0gMCkgLyogL3Byb2Mvc3RhdCB3aXRoIG9ubHkgImNwdSAuLi4iIGxpbmU/ISAqLworCQkJc21wX2NwdV9pbmZvID0gMDsKKworCQljcHVfcHJldl9qaWYgPSB4emFsbG9jKHNpemVvZihjcHVfcHJldl9qaWZbMF0pICogbnVtX2NwdXMpOworCisJCS8qIE90aGVyd2lzZSB0aGUgZmlyc3QgcGVyIGNwdSBkaXNwbGF5IHNob3dzIGFsbCAxMDAlIGlkbGVzICovCisJCXVzbGVlcCg1MDAwMCk7CisJfSBlbHNlIHsgLyogTm9uIGZpcnN0IHRpbWUgaW52b2NhdGlvbiAqLworCQlqaWZmeV9jb3VudHNfdCAqdG1wOworCQlpbnQgaTsKKworCQkvKiBGaXJzdCBzd2l0Y2ggdGhlIHNhbXBsZSBwb2ludGVyczogbm8gbmVlZCB0byBjb3B5ICovCisJCXRtcCA9IGNwdV9wcmV2X2ppZjsKKwkJY3B1X3ByZXZfamlmID0gY3B1X2ppZjsKKwkJY3B1X2ppZiA9IHRtcDsKKworCQkvKiBHZXQgdGhlIG5ldyBzYW1wbGVzICovCisJCWZvciAoaSA9IDA7IGkgPCBudW1fY3B1czsgaSsrKQorCQkJcmVhZF9jcHVfamlmZnkoZnAsICZjcHVfamlmW2ldKTsKKwl9CisjZW5kaWYKKwlmY2xvc2UoZnApOworfQorCitzdGF0aWMgdm9pZCBkb19zdGF0cyh2b2lkKQoreworCXRvcF9zdGF0dXNfdCAqY3VyOworCXBpZF90IHBpZDsKKwlpbnQgaSwgbGFzdF9pLCBuOworCXN0cnVjdCBzYXZlX2hpc3QgKm5ld19oaXN0OworCisJZ2V0X2ppZmZ5X2NvdW50cygpOworCXRvdGFsX3BjcHUgPSAwOworCS8qIHRvdGFsX3ZzeiA9IDA7ICovCisJbmV3X2hpc3QgPSB4bWFsbG9jKHNpemVvZihuZXdfaGlzdFswXSkgKiBudG9wKTsKKwkvKgorCSAqIE1ha2UgYSBwYXNzIHRocm91Z2ggdGhlIGRhdGEgdG8gZ2V0IHN0YXRzLgorCSAqLworCS8qIGhpc3RfaXRlcmF0aW9ucyA9IDA7ICovCisJaSA9IDA7CisJZm9yIChuID0gMDsgbiA8IG50b3A7IG4rKykgeworCQljdXIgPSB0b3AgKyBuOworCisJCS8qCisJCSAqIENhbGN1bGF0ZSB0aW1lIGluIGN1ciBwcm9jZXNzLiAgVGltZSBpcyBzdW0gb2YgdXNlciB0aW1lCisJCSAqIGFuZCBzeXN0ZW0gdGltZQorCQkgKi8KKwkJcGlkID0gY3VyLT5waWQ7CisJCW5ld19oaXN0W25dLnRpY2tzID0gY3VyLT50aWNrczsKKwkJbmV3X2hpc3Rbbl0ucGlkID0gcGlkOworCisJCS8qIGZpbmQgbWF0Y2hpbmcgZW50cnkgZnJvbSBwcmV2aW91cyBwYXNzICovCisJCWN1ci0+cGNwdSA9IDA7CisJCS8qIGRvIG5vdCBzdGFydCBhdCBpbmRleCAwLCBjb250aW51ZSBhdCBsYXN0IHVzZWQgb25lCisJCSAqIChicm91Z2h0IGhpc3RfaXRlcmF0aW9ucyBmcm9tIH4xNDAwMCBkb3duIHRvIDE3MikgKi8KKwkJbGFzdF9pID0gaTsKKwkJaWYgKHByZXZfaGlzdF9jb3VudCkgZG8geworCQkJaWYgKHByZXZfaGlzdFtpXS5waWQgPT0gcGlkKSB7CisJCQkJY3VyLT5wY3B1ID0gY3VyLT50aWNrcyAtIHByZXZfaGlzdFtpXS50aWNrczsKKwkJCQl0b3RhbF9wY3B1ICs9IGN1ci0+cGNwdTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWkgPSAoaSsxKSAlIHByZXZfaGlzdF9jb3VudDsKKwkJCS8qIGhpc3RfaXRlcmF0aW9ucysrOyAqLworCQl9IHdoaWxlIChpICE9IGxhc3RfaSk7CisJCS8qIHRvdGFsX3ZzeiArPSBjdXItPnZzejsgKi8KKwl9CisKKwkvKgorCSAqIFNhdmUgY3VyIGZyYW1lJ3MgaW5mb3JtYXRpb24uCisJICovCisJZnJlZShwcmV2X2hpc3QpOworCXByZXZfaGlzdCA9IG5ld19oaXN0OworCXByZXZfaGlzdF9jb3VudCA9IG50b3A7Cit9CisKKyNlbmRpZiAvKiBGRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRSAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX0NQVV9HTE9CQUxfUEVSQ0VOVFMgJiYgRU5BQkxFX0ZFQVRVUkVfVE9QX0RFQ0lNQUxTCisvKiBmb3JtYXRzIDcgY2hhciBzdHJpbmcgKDggd2l0aCB0ZXJtaW5hdGluZyBOVUwpICovCitzdGF0aWMgY2hhciAqZm10XzEwMHBlcmNlbnRfOChjaGFyIHBidWZbOF0sIHVuc2lnbmVkIHZhbHVlLCB1bnNpZ25lZCB0b3RhbCkKK3sKKwl1bnNpZ25lZCB0OworCWlmICh2YWx1ZSA+PSB0b3RhbCkgeyAvKiAxMDAlID8gKi8KKwkJc3RyY3B5KHBidWYsICIgIDEwMCUgIik7CisJCXJldHVybiBwYnVmOworCX0KKwkvKiBlbHNlIGdlbmVyYXRlICIgW04vc3BhY2VdTi5OJSAiIHN0cmluZyAqLworCXZhbHVlID0gMTAwMCAqIHZhbHVlIC8gdG90YWw7CisJdCA9IHZhbHVlIC8gMTAwOworCXZhbHVlID0gdmFsdWUgJSAxMDA7CisJcGJ1ZlswXSA9ICcgJzsKKwlwYnVmWzFdID0gdCA/IHQgKyAnMCcgOiAnICc7CisJcGJ1ZlsyXSA9ICcwJyArICh2YWx1ZSAvIDEwKTsKKwlwYnVmWzNdID0gJy4nOworCXBidWZbNF0gPSAnMCcgKyAodmFsdWUgJSAxMCk7CisJcGJ1Zls1XSA9ICclJzsKKwlwYnVmWzZdID0gJyAnOworCXBidWZbN10gPSAnXDAnOworCXJldHVybiBwYnVmOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BfQ1BVX0dMT0JBTF9QRVJDRU5UUworc3RhdGljIHZvaWQgZGlzcGxheV9jcHVzKGludCBzY3Jfd2lkdGgsIGNoYXIgKnNjcmJ1ZiwgaW50ICpsaW5lc19yZW1fcCkKK3sKKwkvKgorCSAqIHh4eCUgPSAoY3VyX2ppZi54eHggLSBwcmV2X2ppZi54eHgpIC8gKGN1cl9qaWYudG90YWwgLSBwcmV2X2ppZi50b3RhbCkgKiAxMDAlCisJICovCisJdW5zaWduZWQgdG90YWxfZGlmZjsKKwlqaWZmeV9jb3VudHNfdCAqcF9qaWYsICpwX3ByZXZfamlmOworCWludCBpOworIyBpZiBFTkFCTEVfRkVBVFVSRV9UT1BfU01QX0NQVQorCWludCBuX2NwdV9saW5lczsKKyMgZW5kaWYKKworCS8qIHVzaW5nICh1bnNpZ25lZCkgY2FzdHMgdG8gbWFrZSBvcGVyYXRpb25zIGNoZWFwZXIgKi8KKyMgZGVmaW5lICBDQUxDX1RPVEFMX0RJRkYgZG8geyBcCisJdG90YWxfZGlmZiA9ICh1bnNpZ25lZCkocF9qaWYtPnRvdGFsIC0gcF9wcmV2X2ppZi0+dG90YWwpOyBcCisJaWYgKHRvdGFsX2RpZmYgPT0gMCkgdG90YWxfZGlmZiA9IDE7IFwKK30gd2hpbGUgKDApCisKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX0RFQ0lNQUxTCisjICBkZWZpbmUgQ0FMQ19TVEFUKHh4eCkgY2hhciB4eHhbOF0KKyMgIGRlZmluZSBTSE9XX1NUQVQoeHh4KSBmbXRfMTAwcGVyY2VudF84KHh4eCwgKHVuc2lnbmVkKShwX2ppZi0+eHh4IC0gcF9wcmV2X2ppZi0+eHh4KSwgdG90YWxfZGlmZikKKyMgIGRlZmluZSBGTVQgIiVzIgorIyBlbHNlCisjICBkZWZpbmUgQ0FMQ19TVEFUKHh4eCkgdW5zaWduZWQgeHh4ID0gMTAwICogKHVuc2lnbmVkKShwX2ppZi0+eHh4IC0gcF9wcmV2X2ppZi0+eHh4KSAvIHRvdGFsX2RpZmYKKyMgIGRlZmluZSBTSE9XX1NUQVQoeHh4KSB4eHgKKyMgIGRlZmluZSBGTVQgIiU0dSUlICIKKyMgZW5kaWYKKworIyBpZiAhRU5BQkxFX0ZFQVRVUkVfVE9QX1NNUF9DUFUKKwl7CisJCWkgPSAxOworCQlwX2ppZiA9ICZjdXJfamlmOworCQlwX3ByZXZfamlmID0gJnByZXZfamlmOworIyBlbHNlCisJLyogTG9vcCB0aHJ1IENQVShzKSAqLworCW5fY3B1X2xpbmVzID0gc21wX2NwdV9pbmZvID8gbnVtX2NwdXMgOiAxOworCWlmIChuX2NwdV9saW5lcyA+ICpsaW5lc19yZW1fcCkKKwkJbl9jcHVfbGluZXMgPSAqbGluZXNfcmVtX3A7CisKKwlmb3IgKGkgPSAwOyBpIDwgbl9jcHVfbGluZXM7IGkrKykgeworCQlwX2ppZiA9ICZjcHVfamlmW2ldOworCQlwX3ByZXZfamlmID0gJmNwdV9wcmV2X2ppZltpXTsKKyMgZW5kaWYKKwkJQ0FMQ19UT1RBTF9ESUZGOworCisJCXsgLyogTmVlZCBhIGJsb2NrOiBDQUxDX1NUQVQgYXJlIGRlY2xhcmF0aW9ucyAqLworCQkJQ0FMQ19TVEFUKHVzcik7CisJCQlDQUxDX1NUQVQoc3lzKTsKKwkJCUNBTENfU1RBVChuaWMpOworCQkJQ0FMQ19TVEFUKGlkbGUpOworCQkJQ0FMQ19TVEFUKGlvd2FpdCk7CisJCQlDQUxDX1NUQVQoaXJxKTsKKwkJCUNBTENfU1RBVChzb2Z0aXJxKTsKKwkJCS8qQ0FMQ19TVEFUKHN0ZWFsKTsqLworCisJCQlzbnByaW50ZihzY3JidWYsIHNjcl93aWR0aCwKKwkJCQkvKiBCYXJlbHkgZml0cyBpbiA3OSBjaGFycyB3aGVuIGluICJkZWNpbWFscyIgbW9kZS4gKi8KKyMgaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX1NNUF9DUFUKKwkJCQkiQ1BVJXM6IkZNVCJ1c3IiRk1UInN5cyJGTVQibmljIkZNVCJpZGxlIkZNVCJpbyJGTVQiaXJxIkZNVCJzaXJxIiwKKwkJCQkoc21wX2NwdV9pbmZvID8gdXRvYShpKSA6ICIiKSwKKyMgZWxzZQorCQkJCSJDUFU6IkZNVCJ1c3IiRk1UInN5cyJGTVQibmljIkZNVCJpZGxlIkZNVCJpbyJGTVQiaXJxIkZNVCJzaXJxIiwKKyMgZW5kaWYKKwkJCQlTSE9XX1NUQVQodXNyKSwgU0hPV19TVEFUKHN5cyksIFNIT1dfU1RBVChuaWMpLCBTSE9XX1NUQVQoaWRsZSksCisJCQkJU0hPV19TVEFUKGlvd2FpdCksIFNIT1dfU1RBVChpcnEpLCBTSE9XX1NUQVQoc29mdGlycSkKKwkJCQkvKiwgU0hPV19TVEFUKHN0ZWFsKSAtIHdoYXQgaXMgdGhpcyAnc3RlYWwnIHRoaW5nPyAqLworCQkJCS8qIEkgZG91YnQgYW55b25lIHdhbnRzIHRvIGtub3cgaXQgKi8KKwkJCSk7CisJCQlwdXRzKHNjcmJ1Zik7CisJCX0KKwl9CisjIHVuZGVmIFNIT1dfU1RBVAorIyB1bmRlZiBDQUxDX1NUQVQKKyMgdW5kZWYgRk1UCisJKmxpbmVzX3JlbV9wIC09IGk7Cit9CisjZWxzZSAgLyogIUVOQUJMRV9GRUFUVVJFX1RPUF9DUFVfR0xPQkFMX1BFUkNFTlRTICovCisjIGRlZmluZSBkaXNwbGF5X2NwdXMoc2NyX3dpZHRoLCBzY3JidWYsIGxpbmVzX3JlbSkgKCh2b2lkKTApCisjZW5kaWYKKworZW51bSB7CisJTUlfTUVNVE9UQUwsCisJTUlfTUVNRlJFRSwKKwlNSV9NRU1TSEFSRUQsCisJTUlfU0hNRU0sCisJTUlfQlVGRkVSUywKKwlNSV9DQUNIRUQsCisJTUlfU1dBUFRPVEFMLAorCU1JX1NXQVBGUkVFLAorCU1JX0RJUlRZLAorCU1JX1dSSVRFQkFDSywKKwlNSV9BTk9OUEFHRVMsCisJTUlfTUFQUEVELAorCU1JX1NMQUIsCisJTUlfTUFYCit9OworCitzdGF0aWMgdm9pZCBwYXJzZV9tZW1pbmZvKHVuc2lnbmVkIGxvbmcgbWVtaW5mb1tNSV9NQVhdKQoreworCXN0YXRpYyBjb25zdCBjaGFyIGZpZWxkc1tdID0KKwkJIk1lbVRvdGFsXDAiCisJCSJNZW1GcmVlXDAiCisJCSJNZW1TaGFyZWRcMCIKKwkJIlNobWVtXDAiCisJCSJCdWZmZXJzXDAiCisJCSJDYWNoZWRcMCIKKwkJIlN3YXBUb3RhbFwwIgorCQkiU3dhcEZyZWVcMCIKKwkJIkRpcnR5XDAiCisJCSJXcml0ZWJhY2tcMCIKKwkJIkFub25QYWdlc1wwIgorCQkiTWFwcGVkXDAiCisJCSJTbGFiXDAiOworCWNoYXIgYnVmWzYwXTsgLyogYWN0dWFsIGxpbmVzIHdlIGV4cGVjdCBhcmUgfjMwIGNoYXJzIG9yIGxlc3MgKi8KKwlGSUxFICpmOworCWludCBpOworCisJbWVtc2V0KG1lbWluZm8sIDAsIHNpemVvZihtZW1pbmZvWzBdKSAqIE1JX01BWCk7CisJZiA9IHhmb3Blbl9mb3JfcmVhZCgibWVtaW5mbyIpOworCXdoaWxlIChmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSAhPSBOVUxMKSB7CisJCWNoYXIgKmMgPSBzdHJjaHIoYnVmLCAnOicpOworCQlpZiAoIWMpCisJCQljb250aW51ZTsKKwkJKmMgPSAnXDAnOworCQlpID0gaW5kZXhfaW5fc3RyaW5ncyhmaWVsZHMsIGJ1Zik7CisJCWlmIChpID49IDApCisJCQltZW1pbmZvW2ldID0gc3RydG91bChjKzEsIE5VTEwsIDEwKTsKKwl9CisJZmNsb3NlKGYpOworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBkaXNwbGF5X2hlYWRlcihpbnQgc2NyX3dpZHRoLCBpbnQgKmxpbmVzX3JlbV9wKQoreworCWNoYXIgc2NyYnVmWzEwMF07IC8qIFs4MF0gd2FzIGEgYml0IHRvbyBsb3cgb24gOEdiIHJhbSBib3ggKi8KKwljaGFyICpidWY7CisJdW5zaWduZWQgbG9uZyBtZW1pbmZvW01JX01BWF07CisKKwlwYXJzZV9tZW1pbmZvKG1lbWluZm8pOworCisJLyogT3V0cHV0IG1lbW9yeSBpbmZvICovCisJaWYgKHNjcl93aWR0aCA+IChpbnQpc2l6ZW9mKHNjcmJ1ZikpCisJCXNjcl93aWR0aCA9IHNpemVvZihzY3JidWYpOworCXNucHJpbnRmKHNjcmJ1Ziwgc2NyX3dpZHRoLAorCQkiTWVtOiAlbHVLIHVzZWQsICVsdUsgZnJlZSwgJWx1SyBzaHJkLCAlbHVLIGJ1ZmYsICVsdUsgY2FjaGVkIiwKKwkJbWVtaW5mb1tNSV9NRU1UT1RBTF0gLSBtZW1pbmZvW01JX01FTUZSRUVdLAorCQltZW1pbmZvW01JX01FTUZSRUVdLAorCQltZW1pbmZvW01JX01FTVNIQVJFRF0gKyBtZW1pbmZvW01JX1NITUVNXSwKKwkJbWVtaW5mb1tNSV9CVUZGRVJTXSwKKwkJbWVtaW5mb1tNSV9DQUNIRURdKTsKKwkvKiBHbyB0byB0b3AgJiBjbGVhciB0byB0aGUgZW5kIG9mIHNjcmVlbiAqLworCXByaW50ZihPUFRfQkFUQ0hfTU9ERSA/ICIlc1xuIiA6ICJcMDMzW0hcMDMzW0olc1xuIiwgc2NyYnVmKTsKKwkoKmxpbmVzX3JlbV9wKS0tOworCisJLyogRGlzcGxheSBDUFUgdGltZSBzcGxpdCBhcyBwZXJjZW50YWdlIG9mIHRvdGFsIHRpbWUuCisJICogVGhpcyBkaXNwbGF5cyBlaXRoZXIgYSBjdW11bGF0aXZlIGxpbmUgb3Igb25lIGxpbmUgcGVyIENQVS4KKwkgKi8KKwlkaXNwbGF5X2NwdXMoc2NyX3dpZHRoLCBzY3JidWYsIGxpbmVzX3JlbV9wKTsKKworCS8qIFJlYWQgbG9hZCBhdmVyYWdlIGFzIGEgc3RyaW5nICovCisJYnVmID0gc3RwY3B5KHNjcmJ1ZiwgIkxvYWQgYXZlcmFnZTogIik7CisJb3Blbl9yZWFkX2Nsb3NlKCJsb2FkYXZnIiwgYnVmLCBzaXplb2Yoc2NyYnVmKSAtIHNpemVvZigiTG9hZCBhdmVyYWdlOiAiKSk7CisJc2NyYnVmW3Njcl93aWR0aCAtIDFdID0gJ1wwJzsKKwlzdHJjaHJudWwoYnVmLCAnXG4nKVswXSA9ICdcMCc7CisJcHV0cyhzY3JidWYpOworCSgqbGluZXNfcmVtX3ApLS07CisKKwlyZXR1cm4gbWVtaW5mb1tNSV9NRU1UT1RBTF07Cit9CisKK3N0YXRpYyBOT0lOTElORSB2b2lkIGRpc3BsYXlfcHJvY2Vzc19saXN0KGludCBsaW5lc19yZW0sIGludCBzY3Jfd2lkdGgpCit7CisJZW51bSB7CisJCUJJVFNfUEVSX0lOVCA9IHNpemVvZihpbnQpICogOAorCX07CisKKwl0b3Bfc3RhdHVzX3QgKnM7CisJY2hhciB2c3pfc3RyX2J1Zls4XTsKKwl1bnNpZ25lZCBsb25nIHRvdGFsX21lbW9yeSA9IGRpc3BsYXlfaGVhZGVyKHNjcl93aWR0aCwgJmxpbmVzX3JlbSk7IC8qIG9yIHVzZSB0b3RhbF92c3o/ICovCisJLyogeHh4X3NoaWZ0IGFuZCB4eHhfc2NhbGUgdmFyaWFibGVzIGFsbG93IHVzIHRvIHJlcGxhY2UKKwkgKiBleHBlbnNpdmUgZGl2aWRlcyB3aXRoIG11bHRpcGx5IGFuZCBzaGlmdCAqLworCXVuc2lnbmVkIHBtZW1fc2hpZnQsIHBtZW1fc2NhbGUsIHBtZW1faGFsZjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UKKwl1bnNpZ25lZCB0bXBfdW5zaWduZWQ7CisJdW5zaWduZWQgcGNwdV9zaGlmdCwgcGNwdV9zY2FsZSwgcGNwdV9oYWxmOworCXVuc2lnbmVkIGJ1c3lfamlmczsKKyNlbmRpZgorCisJLyogd2hhdCBpbmZvIG9mIHRoZSBwcm9jZXNzZXMgaXMgc2hvd24gKi8KKwlwcmludGYoT1BUX0JBVENIX01PREUgPyAiJS4qcyIgOiAiXDAzM1s3bSUuKnNcMDMzWzBtIiwgc2NyX3dpZHRoLAorCQkiICBQSUQgIFBQSUQgVVNFUiAgICAgU1RBVCAgIFZTWiAlVlNaIgorCQlJRl9GRUFUVVJFX1RPUF9TTVBfUFJPQ0VTUygiIENQVSIpCisJCUlGX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFKCIgJUNQVSIpCisJCSIgQ09NTUFORCIpOworCWxpbmVzX3JlbS0tOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX0RFQ0lNQUxTCisjIGRlZmluZSBVUFNDQUxFIDEwMDAKKyMgZGVmaW5lIENBTENfU1RBVChuYW1lLCB2YWwpIGRpdl90IG5hbWUgPSBkaXYoKHZhbCksIDEwKQorIyBkZWZpbmUgU0hPV19TVEFUKG5hbWUpIG5hbWUucXVvdCwgJzAnK25hbWUucmVtCisjIGRlZmluZSBGTVQgIiUzdS4lYyIKKyNlbHNlCisjIGRlZmluZSBVUFNDQUxFIDEwMAorIyBkZWZpbmUgQ0FMQ19TVEFUKG5hbWUsIHZhbCkgdW5zaWduZWQgbmFtZSA9ICh2YWwpCisjIGRlZmluZSBTSE9XX1NUQVQobmFtZSkgbmFtZQorIyBkZWZpbmUgRk1UICIlNHUlJSIKKyNlbmRpZgorCS8qCisJICogJVZTWiA9IHMtPnZzei9NZW1Ub3RhbAorCSAqLworCXBtZW1fc2hpZnQgPSBCSVRTX1BFUl9JTlQtMTE7CisJcG1lbV9zY2FsZSA9IFVQU0NBTEUqKDFVPDwoQklUU19QRVJfSU5ULTExKSkgLyB0b3RhbF9tZW1vcnk7CisJLyogcy0+dnN6IGlzIGluIGtiLiB3ZSB3YW50IChzLT52c3ogKiBwbWVtX3NjYWxlKSB0byBuZXZlciBvdmVyZmxvdyAqLworCXdoaWxlIChwbWVtX3NjYWxlID49IDUxMikgeworCQlwbWVtX3NjYWxlIC89IDQ7CisJCXBtZW1fc2hpZnQgLT0gMjsKKwl9CisJcG1lbV9oYWxmID0gKDFVIDw8IHBtZW1fc2hpZnQpIC8gKEVOQUJMRV9GRUFUVVJFX1RPUF9ERUNJTUFMUyA/IDIwIDogMik7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFCisJYnVzeV9qaWZzID0gY3VyX2ppZi5idXN5IC0gcHJldl9qaWYuYnVzeTsKKwkvKiBUaGlzIGhhcHBlbnMgaWYgdGhlcmUgd2VyZSBsb3RzIG9mIHNob3J0LWxpdmVkIHByb2Nlc3NlcworCSAqIGJldHdlZW4gdHdvIHRvcCB1cGRhdGVzIChlLmcuIGNvbXBpbGF0aW9uKSAqLworCWlmICh0b3RhbF9wY3B1IDwgYnVzeV9qaWZzKSB0b3RhbF9wY3B1ID0gYnVzeV9qaWZzOworCisJLyoKKwkgKiBDUFUlID0gcy0+cGNwdS9zdW0ocy0+cGNwdSkgKiBidXN5X2NwdV90aWNrcy90b3RhbF9jcHVfdGlja3MKKwkgKiAocGNwdSBpcyBkZWx0YSBvZiBzeXMrdXNlciB0aW1lIGJldHdlZW4gc2FtcGxlcykKKwkgKi8KKwkvKiAoY3VyX2ppZi54eHggLSBwcmV2X2ppZi54eHgpIGFuZCBzLT5wY3B1IGFyZQorCSAqIGluIDAuLn42NDAwMCByYW5nZSAoSFoqdXBkYXRlX2ludGVydmFsKS4KKwkgKiB3ZSBhc3N1bWUgdGhhdCB1bnNpZ25lZCBpcyBhdCBsZWFzdCAzMi1iaXQuCisJICovCisJcGNwdV9zaGlmdCA9IDY7CisJcGNwdV9zY2FsZSA9IFVQU0NBTEUqNjQgKiAodWludDE2X3QpYnVzeV9qaWZzOworCWlmIChwY3B1X3NjYWxlID09IDApCisJCXBjcHVfc2NhbGUgPSAxOworCXdoaWxlIChwY3B1X3NjYWxlIDwgKDFVIDw8IChCSVRTX1BFUl9JTlQtMikpKSB7CisJCXBjcHVfc2NhbGUgKj0gNDsKKwkJcGNwdV9zaGlmdCArPSAyOworCX0KKwl0bXBfdW5zaWduZWQgPSAodWludDE2X3QpKGN1cl9qaWYudG90YWwgLSBwcmV2X2ppZi50b3RhbCkgKiB0b3RhbF9wY3B1OworCWlmICh0bXBfdW5zaWduZWQgIT0gMCkKKwkJcGNwdV9zY2FsZSAvPSB0bXBfdW5zaWduZWQ7CisJLyogd2Ugd2FudCAocy0+cGNwdSAqIHBjcHVfc2NhbGUpIHRvIG5ldmVyIG92ZXJmbG93ICovCisJd2hpbGUgKHBjcHVfc2NhbGUgPj0gMTAyNCkgeworCQlwY3B1X3NjYWxlIC89IDQ7CisJCXBjcHVfc2hpZnQgLT0gMjsKKwl9CisJcGNwdV9oYWxmID0gKDFVIDw8IHBjcHVfc2hpZnQpIC8gKEVOQUJMRV9GRUFUVVJFX1RPUF9ERUNJTUFMUyA/IDIwIDogMik7CisJLyogcHJpbnRmKCIgcG1lbV9zY2FsZT0ldSBwY3B1X3NjYWxlPSV1ICIsIHBtZW1fc2NhbGUsIHBjcHVfc2NhbGUpOyAqLworI2VuZGlmCisKKwkvKiBPaywgYWxsIHByZWxpbWluYXJ5IGRhdGEgaXMgcmVhZHksIGdvIHRocm91Z2ggdGhlIGxpc3QgKi8KKwlzY3Jfd2lkdGggKz0gMjsgLyogYWNjb3VudCBmb3IgbGVhZGluZyAnXG4nIGFuZCB0cmFpbGluZyBOVUwgKi8KKwlpZiAobGluZXNfcmVtID4gbnRvcCAtIEdfc2Nyb2xsX29mcykKKwkJbGluZXNfcmVtID0gbnRvcCAtIEdfc2Nyb2xsX29mczsKKwlzID0gdG9wICsgR19zY3JvbGxfb2ZzOworCXdoaWxlICgtLWxpbmVzX3JlbSA+PSAwKSB7CisJCXVuc2lnbmVkIGNvbDsKKwkJQ0FMQ19TVEFUKHBtZW0sIChzLT52c3oqcG1lbV9zY2FsZSArIHBtZW1faGFsZikgPj4gcG1lbV9zaGlmdCk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFCisJCUNBTENfU1RBVChwY3B1LCAocy0+cGNwdSpwY3B1X3NjYWxlICsgcGNwdV9oYWxmKSA+PiBwY3B1X3NoaWZ0KTsKKyNlbmRpZgorCisJCWlmIChzLT52c3ogPj0gMTAwMDAwKQorCQkJc3ByaW50Zih2c3pfc3RyX2J1ZiwgIiU2bGRtIiwgcy0+dnN6LzEwMjQpOworCQllbHNlCisJCQlzcHJpbnRmKHZzel9zdHJfYnVmLCAiJTdsdSIsIHMtPnZzeik7CisJCS8qIFBJRCBQUElEIFVTRVIgU1RBVCBWU1ogJVZTWiBbJUNQVV0gQ09NTUFORCAqLworCQljb2wgPSBzbnByaW50ZihsaW5lX2J1Ziwgc2NyX3dpZHRoLAorCQkJCSJcbiIgIiU1dSU2dSAlLTguOHMgJXMlcyIgRk1UCisJCQkJSUZfRkVBVFVSRV9UT1BfU01QX1BST0NFU1MoIiAlM2QiKQorCQkJCUlGX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFKEZNVCkKKwkJCQkiICIsCisJCQkJcy0+cGlkLCBzLT5wcGlkLCBnZXRfY2FjaGVkX3VzZXJuYW1lKHMtPnVpZCksCisJCQkJcy0+c3RhdGUsIHZzel9zdHJfYnVmLAorCQkJCVNIT1dfU1RBVChwbWVtKQorCQkJCUlGX0ZFQVRVUkVfVE9QX1NNUF9QUk9DRVNTKCwgcy0+bGFzdF9zZWVuX29uX2NwdSkKKwkJCQlJRl9GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRSgsIFNIT1dfU1RBVChwY3B1KSkKKwkJKTsKKwkJaWYgKChpbnQpKGNvbCArIDEpIDwgc2NyX3dpZHRoKQorCQkJcmVhZF9jbWRsaW5lKGxpbmVfYnVmICsgY29sLCBzY3Jfd2lkdGggLSBjb2wsIHMtPnBpZCwgcy0+Y29tbSk7CisJCWZwdXRzKGxpbmVfYnVmLCBzdGRvdXQpOworCQkvKiBwcmludGYoIiAlZC8lZCAlbGxkLyVsbGQiLCBzLT5wY3B1LCB0b3RhbF9wY3B1LAorCQkJY3VyX2ppZi5idXN5IC0gcHJldl9qaWYuYnVzeSwgY3VyX2ppZi50b3RhbCAtIHByZXZfamlmLnRvdGFsKTsgKi8KKwkJcysrOworCX0KKwkvKiBwcmludGYoIiAlZCIsIGhpc3RfaXRlcmF0aW9ucyk7ICovCisJYmJfcHV0Y2hhcihPUFRfQkFUQ0hfTU9ERSA/ICdcbicgOiAnXHInKTsKKwlmZmx1c2hfYWxsKCk7Cit9CisjdW5kZWYgVVBTQ0FMRQorI3VuZGVmIFNIT1dfU1RBVAorI3VuZGVmIENBTENfU1RBVAorI3VuZGVmIEZNVAorCitzdGF0aWMgdm9pZCBjbGVhcm1lbXModm9pZCkKK3sKKwljbGVhcl91c2VybmFtZV9jYWNoZSgpOworCWZyZWUodG9wKTsKKwl0b3AgPSBOVUxMOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX1RFUk1JT1MKKworc3RhdGljIHZvaWQgcmVzZXRfdGVybSh2b2lkKQoreworCWlmICghT1BUX0JBVENIX01PREUpCisJCXRjc2V0YXR0cl9zdGRpbl9UQ1NBTk9XKCZpbml0aWFsX3NldHRpbmdzKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJY2xlYXJtZW1zKCk7CisjIGlmIEVOQUJMRV9GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRQorCQlmcmVlKHByZXZfaGlzdCk7CisjIGVuZGlmCisJfQorfQorCitzdGF0aWMgdm9pZCBzaWdfY2F0Y2hlcihpbnQgc2lnKQoreworCXJlc2V0X3Rlcm0oKTsKKwlraWxsX215c2VsZl93aXRoX3NpZyhzaWcpOworfQorCisjZW5kaWYgLyogRkVBVFVSRV9VU0VfVEVSTUlPUyAqLworCisvKgorICogVE9QTUVNIHN1cHBvcnQKKyAqLworCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbWVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IHRvcG1lbV9zdGF0dXNfdCB7CisJdW5zaWduZWQgcGlkOworCWNoYXIgY29tbVtDT01NX0xFTl07CisJLyogdnN6IGRvZXNuJ3QgY291bnQgL2Rldi94eHggbWFwcGluZ3MgZXhjZXB0IC9kZXYvemVybyAqLworCW1lbV90IHZzeiAgICAgOworCW1lbV90IHZzenJ3ICAgOworCW1lbV90IHJzcyAgICAgOworCW1lbV90IHJzc19zaCAgOworCW1lbV90IGRpcnR5ICAgOworCW1lbV90IGRpcnR5X3NoOworCW1lbV90IHN0YWNrICAgOworfSB0b3BtZW1fc3RhdHVzX3Q7CisKK2VudW0geyBOVU1fU09SVF9GSUVMRCA9IDcgfTsKKworI2RlZmluZSB0b3BtZW0gKCh0b3BtZW1fc3RhdHVzX3QqKXRvcCkKKworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUE1FTQorCitzdGF0aWMgaW50IHRvcG1lbV9zb3J0KGNoYXIgKmEsIGNoYXIgKmIpCit7CisJaW50IG47CisJbWVtX3QgbCwgcjsKKworCW4gPSBvZmZzZXRvZih0b3BtZW1fc3RhdHVzX3QsIHZzeikgKyAoc29ydF9maWVsZCAqIHNpemVvZihtZW1fdCkpOworCWwgPSAqKG1lbV90KikoYSArIG4pOworCXIgPSAqKG1lbV90KikoYiArIG4pOworCWlmIChsID09IHIpIHsKKwkJbCA9ICgodG9wbWVtX3N0YXR1c190KilhKS0+ZGlydHk7CisJCXIgPSAoKHRvcG1lbV9zdGF0dXNfdCopYiktPmRpcnR5OworCX0KKwkvKiBXZSB3YW50IHRvIGF2b2lkIHVuc2lnbmVkLT5zaWduZWQgYW5kIHRydW5jYXRpb24gZXJyb3JzICovCisJLyogbD5yOiAtMSwgbD1yOiAwLCBsPHI6IDEgKi8KKwluID0gKGwgPiByKSA/IC0xIDogKGwgIT0gcik7CisJcmV0dXJuIGludmVydGVkID8gLW4gOiBuOworfQorCisvKiBkaXNwbGF5IGhlYWRlciBpbmZvIChtZW1pbmZvIC8gbG9hZGF2ZykgKi8KK3N0YXRpYyB2b2lkIGRpc3BsYXlfdG9wbWVtX2hlYWRlcihpbnQgc2NyX3dpZHRoLCBpbnQgKmxpbmVzX3JlbV9wKQoreworCXVuc2lnbmVkIGxvbmcgbWVtaW5mb1tNSV9NQVhdOworCisJcGFyc2VfbWVtaW5mbyhtZW1pbmZvKTsKKworCXNucHJpbnRmKGxpbmVfYnVmLCBMSU5FX0JVRl9TSVpFLAorCQkiTWVtIHRvdGFsOiVsdSBhbm9uOiVsdSBtYXA6JWx1IGZyZWU6JWx1IiwKKwkJbWVtaW5mb1tNSV9NRU1UT1RBTF0sCisJCW1lbWluZm9bTUlfQU5PTlBBR0VTXSwKKwkJbWVtaW5mb1tNSV9NQVBQRURdLAorCQltZW1pbmZvW01JX01FTUZSRUVdKTsKKwlwcmludGYoT1BUX0JBVENIX01PREUgPyAiJS4qc1xuIiA6ICJcMDMzW0hcMDMzW0olLipzXG4iLCBzY3Jfd2lkdGgsIGxpbmVfYnVmKTsKKworCXNucHJpbnRmKGxpbmVfYnVmLCBMSU5FX0JVRl9TSVpFLAorCQkiIHNsYWI6JWx1IGJ1ZjolbHUgY2FjaGU6JWx1IGRpcnR5OiVsdSB3cml0ZTolbHUiLAorCQltZW1pbmZvW01JX1NMQUJdLAorCQltZW1pbmZvW01JX0JVRkZFUlNdLAorCQltZW1pbmZvW01JX0NBQ0hFRF0sCisJCW1lbWluZm9bTUlfRElSVFldLAorCQltZW1pbmZvW01JX1dSSVRFQkFDS10pOworCXByaW50ZigiJS4qc1xuIiwgc2NyX3dpZHRoLCBsaW5lX2J1Zik7CisKKwlzbnByaW50ZihsaW5lX2J1ZiwgTElORV9CVUZfU0laRSwKKwkJIlN3YXAgdG90YWw6JWx1IGZyZWU6JWx1IiwgLy8gVE9ETzogJSB1c2VkPworCQltZW1pbmZvW01JX1NXQVBUT1RBTF0sCisJCW1lbWluZm9bTUlfU1dBUEZSRUVdKTsKKwlwcmludGYoIiUuKnNcbiIsIHNjcl93aWR0aCwgbGluZV9idWYpOworCisJKCpsaW5lc19yZW1fcCkgLT0gMzsKK30KKworc3RhdGljIHZvaWQgdWxsdG9hNl9hbmRfc3BhY2UodW5zaWduZWQgbG9uZyBsb25nIHVsLCBjaGFyIGJ1Zls2XSkKK3sKKwkvKiBzZWUgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9UZXJhICovCisJc21hcnRfdWxsdG9hNSh1bCwgYnVmLCAiIG1ndHBlenkiKVswXSA9ICcgJzsKK30KKworc3RhdGljIE5PSU5MSU5FIHZvaWQgZGlzcGxheV90b3BtZW1fcHJvY2Vzc19saXN0KGludCBsaW5lc19yZW0sIGludCBzY3Jfd2lkdGgpCit7CisjZGVmaW5lIEhEUl9TVFIgIiAgUElEICAgVlNaIFZTWlJXICAgUlNTIChTSFIpIERJUlRZIChTSFIpIFNUQUNLIgorI2RlZmluZSBNSU5fV0lEVEggc2l6ZW9mKEhEUl9TVFIpCisJY29uc3QgdG9wbWVtX3N0YXR1c190ICpzID0gdG9wbWVtICsgR19zY3JvbGxfb2ZzOworCisJZGlzcGxheV90b3BtZW1faGVhZGVyKHNjcl93aWR0aCwgJmxpbmVzX3JlbSk7CisJc3RyY3B5KGxpbmVfYnVmLCBIRFJfU1RSICIgQ09NTUFORCIpOworCWxpbmVfYnVmWzExICsgc29ydF9maWVsZCAqIDZdID0gIl5fIltpbnZlcnRlZF07CisJcHJpbnRmKE9QVF9CQVRDSF9NT0RFID8gIiUuKnMiIDogIlxlWzdtJS4qc1xlWzBtIiwgc2NyX3dpZHRoLCBsaW5lX2J1Zik7CisJbGluZXNfcmVtLS07CisKKwlpZiAobGluZXNfcmVtID4gbnRvcCAtIEdfc2Nyb2xsX29mcykKKwkJbGluZXNfcmVtID0gbnRvcCAtIEdfc2Nyb2xsX29mczsKKwl3aGlsZSAoLS1saW5lc19yZW0gPj0gMCkgeworCQkvKiBQSUQgVlNaIFZTWlJXIFJTUyAoU0hSKSBESVJUWSAoU0hSKSBDT01NQU5EICovCisJCXVsbHRvYTZfYW5kX3NwYWNlKHMtPnBpZCAgICAgLCAmbGluZV9idWZbMCo2XSk7CisJCXVsbHRvYTZfYW5kX3NwYWNlKHMtPnZzeiAgICAgLCAmbGluZV9idWZbMSo2XSk7CisJCXVsbHRvYTZfYW5kX3NwYWNlKHMtPnZzenJ3ICAgLCAmbGluZV9idWZbMio2XSk7CisJCXVsbHRvYTZfYW5kX3NwYWNlKHMtPnJzcyAgICAgLCAmbGluZV9idWZbMyo2XSk7CisJCXVsbHRvYTZfYW5kX3NwYWNlKHMtPnJzc19zaCAgLCAmbGluZV9idWZbNCo2XSk7CisJCXVsbHRvYTZfYW5kX3NwYWNlKHMtPmRpcnR5ICAgLCAmbGluZV9idWZbNSo2XSk7CisJCXVsbHRvYTZfYW5kX3NwYWNlKHMtPmRpcnR5X3NoLCAmbGluZV9idWZbNio2XSk7CisJCXVsbHRvYTZfYW5kX3NwYWNlKHMtPnN0YWNrICAgLCAmbGluZV9idWZbNyo2XSk7CisJCWxpbmVfYnVmWzgqNl0gPSAnXDAnOworCQlpZiAoc2NyX3dpZHRoID4gKGludClNSU5fV0lEVEgpIHsKKwkJCXJlYWRfY21kbGluZSgmbGluZV9idWZbOCo2XSwgc2NyX3dpZHRoIC0gTUlOX1dJRFRILCBzLT5waWQsIHMtPmNvbW0pOworCQl9CisJCXByaW50ZigiXG4iIiUuKnMiLCBzY3Jfd2lkdGgsIGxpbmVfYnVmKTsKKwkJcysrOworCX0KKwliYl9wdXRjaGFyKE9QVF9CQVRDSF9NT0RFID8gJ1xuJyA6ICdccicpOworCWZmbHVzaF9hbGwoKTsKKyN1bmRlZiBIRFJfU1RSCisjdW5kZWYgTUlOX1dJRFRICit9CisKKyNlbHNlCit2b2lkIGRpc3BsYXlfdG9wbWVtX3Byb2Nlc3NfbGlzdChpbnQgbGluZXNfcmVtLCBpbnQgc2NyX3dpZHRoKTsKK2ludCB0b3BtZW1fc29ydChjaGFyICphLCBjaGFyICpiKTsKKyNlbmRpZiAvKiBUT1BNRU0gKi8KKworLyoKKyAqIGVuZCBUT1BNRU0gc3VwcG9ydAorICovCisKK2VudW0geworCVRPUF9NQVNLID0gMAorCQl8IFBTU0NBTl9QSUQKKwkJfCBQU1NDQU5fUFBJRAorCQl8IFBTU0NBTl9WU1oKKwkJfCBQU1NDQU5fU1RJTUUKKwkJfCBQU1NDQU5fVVRJTUUKKwkJfCBQU1NDQU5fU1RBVEUKKwkJfCBQU1NDQU5fQ09NTQorCQl8IFBTU0NBTl9DUFUKKwkJfCBQU1NDQU5fVUlER0lELAorCVRPUE1FTV9NQVNLID0gMAorCQl8IFBTU0NBTl9QSUQKKwkJfCBQU1NDQU5fU01BUFMKKwkJfCBQU1NDQU5fQ09NTSwKKwlFWElUX01BU0sgPSAodW5zaWduZWQpLTEsCit9OworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX1RFUk1JT1MKK3N0YXRpYyB1bnNpZ25lZCBoYW5kbGVfaW5wdXQodW5zaWduZWQgc2Nhbl9tYXNrLCB1bnNpZ25lZCBpbnRlcnZhbCkKK3sKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9FT0YpIHsKKwkJLyogRU9GIG9uIHN0ZGluICgidG9wIDwvZGV2L251bGwiKSAqLworCQlzbGVlcChpbnRlcnZhbCk7CisJCXJldHVybiBzY2FuX21hc2s7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJaW50MzJfdCBjOworCisJCWMgPSByZWFkX2tleShTVERJTl9GSUxFTk8sIEcua2JkX2lucHV0LCBpbnRlcnZhbCAqIDEwMDApOworCQlpZiAoYyA9PSAtMSAmJiBlcnJubyAhPSBFQUdBSU4pIHsKKwkJCS8qIGVycm9yL0VPRiAqLworCQkJb3B0aW9uX21hc2szMiB8PSBPUFRfRU9GOworCQkJYnJlYWs7CisJCX0KKwkJaW50ZXJ2YWwgPSAwOworCisJCWlmIChjID09IGluaXRpYWxfc2V0dGluZ3MuY19jY1tWSU5UUl0pCisJCQlyZXR1cm4gRVhJVF9NQVNLOworCQlpZiAoYyA9PSBpbml0aWFsX3NldHRpbmdzLmNfY2NbVkVPRl0pCisJCQlyZXR1cm4gRVhJVF9NQVNLOworCisJCWlmIChjID09IEtFWUNPREVfVVApIHsKKwkJCUdfc2Nyb2xsX29mcy0tOworCQkJZ290byBub3JtYWxpemVfb2ZzOworCQl9CisJCWlmIChjID09IEtFWUNPREVfRE9XTikgeworCQkJR19zY3JvbGxfb2ZzKys7CisJCQlnb3RvIG5vcm1hbGl6ZV9vZnM7CisJCX0KKwkJaWYgKGMgPT0gS0VZQ09ERV9IT01FKSB7CisJCQlHX3Njcm9sbF9vZnMgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGMgPT0gS0VZQ09ERV9FTkQpIHsKKwkJCUdfc2Nyb2xsX29mcyA9IG50b3AgLSBHLmxpbmVzIC8gMjsKKwkJCWdvdG8gbm9ybWFsaXplX29mczsKKwkJfQorCQlpZiAoYyA9PSBLRVlDT0RFX1BBR0VVUCkgeworCQkJR19zY3JvbGxfb2ZzIC09IEcubGluZXMgLyAyOworCQkJZ290byBub3JtYWxpemVfb2ZzOworCQl9CisJCWlmIChjID09IEtFWUNPREVfUEFHRURPV04pIHsKKwkJCUdfc2Nyb2xsX29mcyArPSBHLmxpbmVzIC8gMjsKKyBub3JtYWxpemVfb2ZzOgorCQkJaWYgKEdfc2Nyb2xsX29mcyA+PSBudG9wKQorCQkJCUdfc2Nyb2xsX29mcyA9IG50b3AgLSAxOworCQkJaWYgKEdfc2Nyb2xsX29mcyA8IDApCisJCQkJR19zY3JvbGxfb2ZzID0gMDsKKwkJCWJyZWFrOworCQl9CisKKwkJYyB8PSAweDIwOyAvKiBsb3dlcmNhc2UgKi8KKwkJaWYgKGMgPT0gJ3EnKQorCQkJcmV0dXJuIEVYSVRfTUFTSzsKKworCQlpZiAoYyA9PSAnbicpIHsKKwkJCUlGX0ZFQVRVUkVfVE9QTUVNKHNjYW5fbWFzayA9IFRPUF9NQVNLOykKKwkJCXNvcnRfZnVuY3Rpb25bMF0gPSBwaWRfc29ydDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID09ICdtJykgeworCQkJSUZfRkVBVFVSRV9UT1BNRU0oc2Nhbl9tYXNrID0gVE9QX01BU0s7KQorCQkJc29ydF9mdW5jdGlvblswXSA9IG1lbV9zb3J0OworIyBpZiBFTkFCTEVfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UKKwkJCXNvcnRfZnVuY3Rpb25bMV0gPSBwY3B1X3NvcnQ7CisJCQlzb3J0X2Z1bmN0aW9uWzJdID0gdGltZV9zb3J0OworIyBlbmRpZgorCQkJY29udGludWU7CisJCX0KKyMgaWYgRU5BQkxFX0ZFQVRVUkVfU0hPV19USFJFQURTCisJCWlmIChjID09ICdoJworCQlJRl9GRUFUVVJFX1RPUE1FTSgmJiBzY2FuX21hc2sgIT0gVE9QTUVNX01BU0spCisJCSkgeworCQkJc2Nhbl9tYXNrIF49IFBTU0NBTl9UQVNLUzsKKwkJCWNvbnRpbnVlOworCQl9CisjIGVuZGlmCisjIGlmIEVOQUJMRV9GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRQorCQlpZiAoYyA9PSAncCcpIHsKKwkJCUlGX0ZFQVRVUkVfVE9QTUVNKHNjYW5fbWFzayA9IFRPUF9NQVNLOykKKwkJCXNvcnRfZnVuY3Rpb25bMF0gPSBwY3B1X3NvcnQ7CisJCQlzb3J0X2Z1bmN0aW9uWzFdID0gbWVtX3NvcnQ7CisJCQlzb3J0X2Z1bmN0aW9uWzJdID0gdGltZV9zb3J0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGMgPT0gJ3QnKSB7CisJCQlJRl9GRUFUVVJFX1RPUE1FTShzY2FuX21hc2sgPSBUT1BfTUFTSzspCisJCQlzb3J0X2Z1bmN0aW9uWzBdID0gdGltZV9zb3J0OworCQkJc29ydF9mdW5jdGlvblsxXSA9IG1lbV9zb3J0OworCQkJc29ydF9mdW5jdGlvblsyXSA9IHBjcHVfc29ydDsKKwkJCWNvbnRpbnVlOworCQl9CisjICBpZiBFTkFCTEVfRkVBVFVSRV9UT1BNRU0KKwkJaWYgKGMgPT0gJ3MnKSB7CisJCQlzY2FuX21hc2sgPSBUT1BNRU1fTUFTSzsKKwkJCWZyZWUocHJldl9oaXN0KTsKKwkJCXByZXZfaGlzdCA9IE5VTEw7CisJCQlwcmV2X2hpc3RfY291bnQgPSAwOworCQkJc29ydF9maWVsZCA9IChzb3J0X2ZpZWxkICsgMSkgJSBOVU1fU09SVF9GSUVMRDsKKwkJCWNvbnRpbnVlOworCQl9CisjICBlbmRpZgorCQlpZiAoYyA9PSAncicpIHsKKwkJCWludmVydGVkIF49IDE7CisJCQljb250aW51ZTsKKwkJfQorIyAgaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX1NNUF9DUFUKKwkJLyogcHJvY3BzLTIuMC4xOCB1c2VzICdDJywgMy4yLjcgdXNlcyAnMScgKi8KKwkJaWYgKGMgPT0gJ2MnIHx8IGMgPT0gJzEnKSB7CisJCQkvKiBVc2VyIHdhbnRzIHRvIHRvZ2dsZSBwZXIgY3B1IDw+IGFnZ3JlZ2F0ZSAqLworCQkJaWYgKHNtcF9jcHVfaW5mbykgeworCQkJCWZyZWUoY3B1X3ByZXZfamlmKTsKKwkJCQlmcmVlKGNwdV9qaWYpOworCQkJCWNwdV9qaWYgPSAmY3VyX2ppZjsKKwkJCQljcHVfcHJldl9qaWYgPSAmcHJldl9qaWY7CisJCQl9IGVsc2UgeworCQkJCS8qIFByZXBhcmUgZm9yIHhyZWFsbG9jKCkgKi8KKwkJCQljcHVfamlmID0gY3B1X3ByZXZfamlmID0gTlVMTDsKKwkJCX0KKwkJCW51bV9jcHVzID0gMDsKKwkJCXNtcF9jcHVfaW5mbyA9ICFzbXBfY3B1X2luZm87CisJCQlnZXRfamlmZnlfY291bnRzKCk7CisJCQljb250aW51ZTsKKwkJfQorIyAgZW5kaWYKKyMgZW5kaWYKKwkJYnJlYWs7IC8qIHVua25vd24ga2V5IC0+IGZvcmNlIHJlZnJlc2ggKi8KKwl9CisKKwlyZXR1cm4gc2Nhbl9tYXNrOworfQorI2VuZGlmCisKKy8vdXNhZ2U6I2lmIEVOQUJMRV9GRUFUVVJFX1NIT1dfVEhSRUFEUyB8fCBFTkFCTEVfRkVBVFVSRV9UT1BfU01QX0NQVQorLy91c2FnZTojIGRlZmluZSBJRl9TSE9XX1RIUkVBRFNfT1JfVE9QX1NNUCguLi4pIF9fVkFfQVJHU19fCisvL3VzYWdlOiNlbHNlCisvL3VzYWdlOiMgZGVmaW5lIElGX1NIT1dfVEhSRUFEU19PUl9UT1BfU01QKC4uLikKKy8vdXNhZ2U6I2VuZGlmCisvL3VzYWdlOiNkZWZpbmUgdG9wX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWJdIFstbkNPVU5UXSBbLWRTRUNPTkRTXSIgSUZfRkVBVFVSRV9UT1BNRU0oIiBbLW1dIikKKy8vdXNhZ2U6I2RlZmluZSB0b3BfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQcm92aWRlIGEgdmlldyBvZiBwcm9jZXNzIGFjdGl2aXR5IGluIHJlYWwgdGltZS4iCisvL3VzYWdlOiAgICJcbiIiUmVhZCB0aGUgc3RhdHVzIG9mIGFsbCBwcm9jZXNzZXMgZnJvbSAvcHJvYyBlYWNoIFNFQ09ORFMiCisvL3VzYWdlOiAgICJcbiIiYW5kIGRpc3BsYXkgYSBzY3JlZW5mdWwgb2YgdGhlbS4iCisvL3VzYWdlOiAgICJcbiIiS2V5czoiCisvL3VzYWdlOiAgICJcbiIiCU4vTSIKKy8vdXNhZ2U6ICAgICAgICAgICAgICAgIElGX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFKCIvUCIpCisvL3VzYWdlOiAgICAgICAgICAgICAgICBJRl9GRUFUVVJFX1RPUF9DUFVfVVNBR0VfUEVSQ0VOVEFHRSgiL1QiKQorLy91c2FnZTogICAgICAgICAgICI6ICIgSUZfRkVBVFVSRV9UT1BNRU0oInNob3cgQ1BVIHVzYWdlLCAiKSAic29ydCBieSBwaWQvbWVtIgorLy91c2FnZTogICAgICAgICAgICAgICAgSUZfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UoIi9jcHUiKQorLy91c2FnZTogICAgICAgICAgICAgICAgSUZfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UoIi90aW1lIikKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVE9QTUVNKAorLy91c2FnZTogICAiXG4iIglTOiBzaG93IG1lbW9yeSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgIlxuIiIJUjogcmV2ZXJzZSBzb3J0IgorLy91c2FnZToJSUZfU0hPV19USFJFQURTX09SX1RPUF9TTVAoCisvL3VzYWdlOiAgICJcbiIiCSIKKy8vdXNhZ2U6ICAgICAgICAgICAgICAgIElGX0ZFQVRVUkVfU0hPV19USFJFQURTKCJIOiB0b2dnbGUgdGhyZWFkcyIpCisvL3VzYWdlOiAgICAgICAgICAgICAgICBJRl9GRUFUVVJFX1NIT1dfVEhSRUFEUyhJRl9GRUFUVVJFX1RPUF9TTVBfQ1BVKCIsICIpKQorLy91c2FnZTogICAgICAgICAgICAgICAgSUZfRkVBVFVSRV9UT1BfU01QX0NQVSgiMTogdG9nZ2xlIFNNUCIpCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICJcbiIiCVEsXkM6IGV4aXQiCisvL3VzYWdlOiAgICJcbiIKKy8vdXNhZ2U6ICAgIlxuIiJPcHRpb25zOiIKKy8vdXNhZ2U6ICAgIlxuIiIJLWIJQmF0Y2ggbW9kZSIKKy8vdXNhZ2U6ICAgIlxuIiIJLW4gTglFeGl0IGFmdGVyIE4gaXRlcmF0aW9ucyIKKy8vdXNhZ2U6ICAgIlxuIiIJLWQgTglEZWxheSBiZXR3ZWVuIHVwZGF0ZXMiCisvL3VzYWdlOglJRl9GRUFUVVJFX1RPUE1FTSgKKy8vdXNhZ2U6ICAgIlxuIiIJLW0JU2FtZSBhcyAncycga2V5IgorLy91c2FnZToJKQorCisvKiBJbnRlcmFjdGl2ZSB0ZXN0aW5nOgorICogZWNobyBzc3MgfCAuL2J1c3lib3ggdG9wCisgKiAtIHNob3dzIG1lbW9yeSBzY3JlZW4KKyAqIGVjaG8gc3NzIHwgLi9idXN5Ym94IHRvcCAtYm4xID5tZW0KKyAqIC0gc2F2ZXMgbWVtb3J5IHNjcmVlbiAtIHRoZSAqd2hvbGUqIGxpc3QsIG5vdCBmaXJzdCBOUk9XUyBwcm9jZXNzZXMhCisgKiBlY2hvIC5tLnMucy5zLnMucy5zLnEgfCAuL2J1c3lib3ggdG9wIC1iID56CisgKiAtIHNhdmVzIHNldmVyYWwgZGlmZmVyZW50IHNjcmVlbnMsIGFuZCBleGl0cworICoKKyAqIFRPRE86IC1pIFNUUklORyBwYXJhbSBhcyBhIGJldHRlciBhbHRlcm5hdGl2ZT8KKyAqLworCitpbnQgdG9wX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB0b3BfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBpdGVyYXRpb25zOworCXVuc2lnbmVkIGNvbDsKKwl1bnNpZ25lZCBpbnRlcnZhbDsKKwljaGFyICpzdHJfaW50ZXJ2YWwsICpzdHJfaXRlcmF0aW9uczsKKwl1bnNpZ25lZCBzY2FuX21hc2sgPSBUT1BfTUFTSzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUworCXN0cnVjdCB0ZXJtaW9zIG5ld19zZXR0aW5nczsKKyNlbmRpZgorCisJSU5JVF9HKCk7CisKKwlpbnRlcnZhbCA9IDU7IC8qIGRlZmF1bHQgdXBkYXRlIGludGVydmFsIGlzIDUgc2Vjb25kcyAqLworCWl0ZXJhdGlvbnMgPSAwOyAvKiBpbmZpbml0ZSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUF9TTVBfQ1BVCisJLypudW1fY3B1cyA9IDA7Ki8KKwkvKnNtcF9jcHVfaW5mbyA9IDA7Ki8gIC8qIHRvIHN0YXJ0IHdpdGggc2hvdyBhZ2dyZWdhdGUgKi8KKwljcHVfamlmID0gJmN1cl9qaWY7CisJY3B1X3ByZXZfamlmID0gJnByZXZfamlmOworI2VuZGlmCisKKwkvKiBhbGwgYXJncyBhcmUgb3B0aW9uczsgLW4gTlVNICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLSI7IC8qIG9wdGlvbnMgY2FuIGJlIHNwZWNpZmllZCB3L28gZGFzaCAqLworCWNvbCA9IGdldG9wdDMyKGFyZ3YsICJkOm46YiJJRl9GRUFUVVJFX1RPUE1FTSgibSIpLCAmc3RyX2ludGVydmFsLCAmc3RyX2l0ZXJhdGlvbnMpOworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUE1FTQorCWlmIChjb2wgJiBPUFRfbSkgLyogLW0gKGJ1c3lib3ggc3BlY2lmaWMpICovCisJCXNjYW5fbWFzayA9IFRPUE1FTV9NQVNLOworI2VuZGlmCisJaWYgKGNvbCAmIE9QVF9kKSB7CisJCS8qIHdvcmsgYXJvdW5kIGZvciAiLWQgMSIgLT4gIi1kIC0xIiBkb25lIGJ5IGdldG9wdDMyCisJCSAqIChvcHRfY29tcGxlbWVudGFyeSA9PSAiLSIgZG9lcyB0aGlzKSAqLworCQlpZiAoc3RyX2ludGVydmFsWzBdID09ICctJykKKwkJCXN0cl9pbnRlcnZhbCsrOworCQkvKiBOZWVkIHRvIGxpbWl0IGl0IHRvIG5vdCBvdmVyZmxvdyBwb2xsIHRpbWVvdXQgKi8KKwkJaW50ZXJ2YWwgPSB4YXRvdTE2KHN0cl9pbnRlcnZhbCk7CisJfQorCWlmIChjb2wgJiBPUFRfbikgeworCQlpZiAoc3RyX2l0ZXJhdGlvbnNbMF0gPT0gJy0nKQorCQkJc3RyX2l0ZXJhdGlvbnMrKzsKKwkJaXRlcmF0aW9ucyA9IHhhdG91KHN0cl9pdGVyYXRpb25zKTsKKwl9CisKKwkvKiBjaGFuZ2UgdG8gL3Byb2MgKi8KKwl4Y2hkaXIoIi9wcm9jIik7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UKKwlzb3J0X2Z1bmN0aW9uWzBdID0gcGNwdV9zb3J0OworCXNvcnRfZnVuY3Rpb25bMV0gPSBtZW1fc29ydDsKKwlzb3J0X2Z1bmN0aW9uWzJdID0gdGltZV9zb3J0OworI2Vsc2UKKwlzb3J0X2Z1bmN0aW9uWzBdID0gbWVtX3NvcnQ7CisjZW5kaWYKKworCWlmIChPUFRfQkFUQ0hfTU9ERSkgeworCQlvcHRpb25fbWFzazMyIHw9IE9QVF9FT0Y7CisJfQorI2lmIEVOQUJMRV9GRUFUVVJFX1VTRV9URVJNSU9TCisJZWxzZSB7CisJCXRjZ2V0YXR0cigwLCAodm9pZCAqKSAmaW5pdGlhbF9zZXR0aW5ncyk7CisJCW1lbWNweSgmbmV3X3NldHRpbmdzLCAmaW5pdGlhbF9zZXR0aW5ncywgc2l6ZW9mKG5ld19zZXR0aW5ncykpOworCQkvKiB1bmJ1ZmZlcmVkIGlucHV0LCB0dXJuIG9mZiBlY2hvICovCisJCW5ld19zZXR0aW5ncy5jX2xmbGFnICY9IH4oSVNJRyB8IElDQU5PTiB8IEVDSE8gfCBFQ0hPTkwpOworCQl0Y3NldGF0dHJfc3RkaW5fVENTQU5PVygmbmV3X3NldHRpbmdzKTsKKwl9CisKKwliYl9zaWduYWxzKEJCX0ZBVEFMX1NJR1MsIHNpZ19jYXRjaGVyKTsKKworCS8qIEVhdCBpbml0aWFsIGlucHV0LCBpZiBhbnkgKi8KKwlzY2FuX21hc2sgPSBoYW5kbGVfaW5wdXQoc2Nhbl9tYXNrLCAwKTsKKyNlbmRpZgorCisJd2hpbGUgKHNjYW5fbWFzayAhPSBFWElUX01BU0spIHsKKwkJcHJvY3BzX3N0YXR1c190ICpwID0gTlVMTDsKKworCQlpZiAoT1BUX0JBVENIX01PREUpIHsKKwkJCUcubGluZXMgPSBJTlRfTUFYOworCQkJY29sID0gTElORV9CVUZfU0laRSAtIDI7IC8qICsyIGJ5dGVzIGZvciAnXG4nLCBOVUwgKi8KKwkJfSBlbHNlIHsKKwkJCUcubGluZXMgPSAyNDsgLyogZGVmYXVsdCAqLworCQkJY29sID0gNzk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVVNFX1RFUk1JT1MKKwkJCS8qIFdlIG91dHB1dCB0byBzdGRvdXQsIHdlIG5lZWQgc2l6ZSBvZiBzdGRvdXQgKG5vdCBzdGRpbikhICovCisJCQlnZXRfdGVybWluYWxfd2lkdGhfaGVpZ2h0KFNURE9VVF9GSUxFTk8sICZjb2wsICZHLmxpbmVzKTsKKwkJCWlmIChHLmxpbmVzIDwgNSB8fCBjb2wgPCAxMCkgeworCQkJCXNsZWVwKGludGVydmFsKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKyNlbmRpZgorCQkJaWYgKGNvbCA+IExJTkVfQlVGX1NJWkUgLSAyKQorCQkJCWNvbCA9IExJTkVfQlVGX1NJWkUgLSAyOworCQl9CisKKwkJLyogcmVhZCBwcm9jZXNzIElEcyAmIHN0YXR1cyBmb3IgYWxsIHRoZSBwcm9jZXNzZXMgKi8KKwkJbnRvcCA9IDA7CisJCXdoaWxlICgocCA9IHByb2Nwc19zY2FuKHAsIHNjYW5fbWFzaykpICE9IE5VTEwpIHsKKwkJCWludCBuOworI2lmIEVOQUJMRV9GRUFUVVJFX1RPUE1FTQorCQkJaWYgKHNjYW5fbWFzayAhPSBUT1BNRU1fTUFTSykKKyNlbmRpZgorCQkJeworCQkJCW4gPSBudG9wOworCQkJCXRvcCA9IHhyZWFsbG9jX3ZlY3Rvcih0b3AsIDYsIG50b3ArKyk7CisJCQkJdG9wW25dLnBpZCA9IHAtPnBpZDsKKwkJCQl0b3Bbbl0ucHBpZCA9IHAtPnBwaWQ7CisJCQkJdG9wW25dLnZzeiA9IHAtPnZzejsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BfQ1BVX1VTQUdFX1BFUkNFTlRBR0UKKwkJCQl0b3Bbbl0udGlja3MgPSBwLT5zdGltZSArIHAtPnV0aW1lOworI2VuZGlmCisJCQkJdG9wW25dLnVpZCA9IHAtPnVpZDsKKwkJCQlzdHJjcHkodG9wW25dLnN0YXRlLCBwLT5zdGF0ZSk7CisJCQkJc3RyY3B5KHRvcFtuXS5jb21tLCBwLT5jb21tKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BfU01QX1BST0NFU1MKKwkJCQl0b3Bbbl0ubGFzdF9zZWVuX29uX2NwdSA9IHAtPmxhc3Rfc2Vlbl9vbl9jcHU7CisjZW5kaWYKKwkJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BNRU0KKwkJCWVsc2UgeyAvKiBUT1BNRU0gKi8KKwkJCQlpZiAoIShwLT5zbWFwcy5tYXBwZWRfcm8gfCBwLT5zbWFwcy5tYXBwZWRfcncpKQorCQkJCQljb250aW51ZTsgLyoga2VybmVsIHRocmVhZHMgYXJlIGlnbm9yZWQgKi8KKwkJCQluID0gbnRvcDsKKwkJCQkvKiBObyBidWcgaGVyZSAtIHRvcCBhbmQgdG9wbWVtIGFyZSB0aGUgc2FtZSAqLworCQkJCXRvcCA9IHhyZWFsbG9jX3ZlY3Rvcih0b3BtZW0sIDYsIG50b3ArKyk7CisJCQkJc3RyY3B5KHRvcG1lbVtuXS5jb21tLCBwLT5jb21tKTsKKwkJCQl0b3BtZW1bbl0ucGlkICAgICAgPSBwLT5waWQ7CisJCQkJdG9wbWVtW25dLnZzeiAgICAgID0gcC0+c21hcHMubWFwcGVkX3J3ICsgcC0+c21hcHMubWFwcGVkX3JvOworCQkJCXRvcG1lbVtuXS52c3pydyAgICA9IHAtPnNtYXBzLm1hcHBlZF9ydzsKKwkJCQl0b3BtZW1bbl0ucnNzX3NoICAgPSBwLT5zbWFwcy5zaGFyZWRfY2xlYW4gKyBwLT5zbWFwcy5zaGFyZWRfZGlydHk7CisJCQkJdG9wbWVtW25dLnJzcyAgICAgID0gcC0+c21hcHMucHJpdmF0ZV9jbGVhbiArIHAtPnNtYXBzLnByaXZhdGVfZGlydHkgKyB0b3BtZW1bbl0ucnNzX3NoOworCQkJCXRvcG1lbVtuXS5kaXJ0eSAgICA9IHAtPnNtYXBzLnByaXZhdGVfZGlydHkgKyBwLT5zbWFwcy5zaGFyZWRfZGlydHk7CisJCQkJdG9wbWVtW25dLmRpcnR5X3NoID0gcC0+c21hcHMuc2hhcmVkX2RpcnR5OworCQkJCXRvcG1lbVtuXS5zdGFjayAgICA9IHAtPnNtYXBzLnN0YWNrOworCQkJfQorI2VuZGlmCisJCX0gLyogZW5kIG9mICJ3aGlsZSB3ZSByZWFkIC9wcm9jIiAqLworCQlpZiAobnRvcCA9PSAwKSB7CisJCQliYl9lcnJvcl9tc2coIm5vIHByb2Nlc3MgaW5mbyBpbiAvcHJvYyIpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoc2Nhbl9tYXNrICE9IFRPUE1FTV9NQVNLKSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QX0NQVV9VU0FHRV9QRVJDRU5UQUdFCisJCQlpZiAoIXByZXZfaGlzdF9jb3VudCkgeworCQkJCWRvX3N0YXRzKCk7CisJCQkJdXNsZWVwKDEwMDAwMCk7CisJCQkJY2xlYXJtZW1zKCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlkb19zdGF0cygpOworCQkJLyogVE9ETzogd2UgZG9uJ3QgbmVlZCB0byBzb3J0IGFsbCAxMDAwMCBwcm9jZXNzZXMsIHdlIG5lZWQgdG8gZmluZCB0b3AgMjQhICovCisJCQlxc29ydCh0b3AsIG50b3AsIHNpemVvZih0b3Bfc3RhdHVzX3QpLCAodm9pZCopbXVsdF9sdmxfY21wKTsKKyNlbHNlCisJCQlxc29ydCh0b3AsIG50b3AsIHNpemVvZih0b3Bfc3RhdHVzX3QpLCAodm9pZCopKHNvcnRfZnVuY3Rpb25bMF0pKTsKKyNlbmRpZgorCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfVE9QTUVNCisJCWVsc2UgeyAvKiBUT1BNRU0gKi8KKwkJCXFzb3J0KHRvcG1lbSwgbnRvcCwgc2l6ZW9mKHRvcG1lbV9zdGF0dXNfdCksICh2b2lkKil0b3BtZW1fc29ydCk7CisJCX0KKyNlbmRpZgorCQlpZiAoc2Nhbl9tYXNrICE9IFRPUE1FTV9NQVNLKQorCQkJZGlzcGxheV9wcm9jZXNzX2xpc3QoRy5saW5lcywgY29sKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9UT1BNRU0KKwkJZWxzZQorCQkJZGlzcGxheV90b3BtZW1fcHJvY2Vzc19saXN0KEcubGluZXMsIGNvbCk7CisjZW5kaWYKKwkJY2xlYXJtZW1zKCk7CisJCWlmIChpdGVyYXRpb25zID49IDAgJiYgIS0taXRlcmF0aW9ucykKKwkJCWJyZWFrOworI2lmICFFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUworCQlzbGVlcChpbnRlcnZhbCk7CisjZWxzZQorCQlzY2FuX21hc2sgPSBoYW5kbGVfaW5wdXQoc2Nhbl9tYXNrLCBpbnRlcnZhbCk7CisjZW5kaWYgLyogRkVBVFVSRV9VU0VfVEVSTUlPUyAqLworCX0gLyogZW5kIG9mICJ3aGlsZSAobm90IFEpIiAqLworCisJYmJfcHV0Y2hhcignXG4nKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUworCXJlc2V0X3Rlcm0oKTsKKyNlbmRpZgorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9wcm9jcHMvdXB0aW1lLmMgYi9wcm9jcHMvdXB0aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQ5YmFlNgotLS0gL2Rldi9udWxsCisrKyBiL3Byb2Nwcy91cHRpbWUuYwpAQCAtMCwwICsxLDEwMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSB1cHRpbWUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiAyMDExCQlQZXJlIE9yZ2EgPGdvdHJ1bmtzQGdtYWlsLmNvbT4KKyAqCisgKiBBZGRlZCBGRUFUVVJFX1VQVElNRV9VVE1QX1NVUFBPUlQgZmxhZy4KKyAqLworCisvKiBnZXRvcHQgbm90IG5lZWRlZCAqLworCisvL2NvbmZpZzpjb25maWcgVVBUSU1FCisvL2NvbmZpZzoJYm9vbCAidXB0aW1lIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CXNlbGVjdCBQTEFURk9STV9MSU5VWCAjc3lzaW5mbygpCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgdXB0aW1lIGdpdmVzIGEgb25lIGxpbmUgZGlzcGxheSBvZiB0aGUgY3VycmVudCB0aW1lLCBob3cgbG9uZworLy9jb25maWc6CSAgdGhlIHN5c3RlbSBoYXMgYmVlbiBydW5uaW5nLCBob3cgbWFueSB1c2VycyBhcmUgY3VycmVudGx5IGxvZ2dlZAorLy9jb25maWc6CSAgb24sIGFuZCB0aGUgc3lzdGVtIGxvYWQgYXZlcmFnZXMgZm9yIHRoZSBwYXN0IDEsIDUsIGFuZCAxNSBtaW51dGVzLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9VUFRJTUVfVVRNUF9TVVBQT1JUCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCBmb3Igc2hvd2luZyB0aGUgbnVtYmVyIG9mIHVzZXJzIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVVBUSU1FICYmIEZFQVRVUkVfVVRNUAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIE1ha2VzIHVwdGltZSBkaXNwbGF5IHRoZSBudW1iZXIgb2YgdXNlcnMgY3VycmVudGx5IGxvZ2dlZCBvbi4KKworLy91c2FnZTojZGVmaW5lIHVwdGltZV90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiIgorLy91c2FnZTojZGVmaW5lIHVwdGltZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRpc3BsYXkgdGhlIHRpbWUgc2luY2UgdGhlIGxhc3QgYm9vdCIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgdXB0aW1lX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHVwdGltZVxuIgorLy91c2FnZTogICAgICAgIiAgMTo1NXBtICB1cCAgMjozMCwgbG9hZCBhdmVyYWdlOiAwLjA5LCAwLjA0LCAwLjAwXG4iCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2lmZGVmIF9fbGludXhfXworIyBpbmNsdWRlIDxzeXMvc3lzaW5mby5oPgorI2VuZGlmCisKKworI2lmbmRlZiBGU0hJRlQKKyMgZGVmaW5lIEZTSElGVCAxNiAgICAgICAgICAgICAgLyogbnIgb2YgYml0cyBvZiBwcmVjaXNpb24gKi8KKyNlbmRpZgorI2RlZmluZSBGSVhFRF8xICAgICAgKDEgPDwgRlNISUZUKSAgICAgLyogMS4wIGFzIGZpeGVkLXBvaW50ICovCisjZGVmaW5lIExPQURfSU5UKHgpICAodW5zaWduZWQpKCh4KSA+PiBGU0hJRlQpCisjZGVmaW5lIExPQURfRlJBQyh4KSBMT0FEX0lOVCgoKHgpICYgKEZJWEVEXzEgLSAxKSkgKiAxMDApCisKKworaW50IHVwdGltZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdXB0aW1lX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJdW5zaWduZWQgdXBkYXlzLCB1cGhvdXJzLCB1cG1pbnV0ZXM7CisJc3RydWN0IHN5c2luZm8gaW5mbzsKKwlzdHJ1Y3QgdG0gKmN1cnJlbnRfdGltZTsKKwl0aW1lX3QgY3VycmVudF9zZWNzOworCisJdGltZSgmY3VycmVudF9zZWNzKTsKKwljdXJyZW50X3RpbWUgPSBsb2NhbHRpbWUoJmN1cnJlbnRfc2Vjcyk7CisKKwlzeXNpbmZvKCZpbmZvKTsKKworCXByaW50ZigiICUwMnU6JTAydTolMDJ1IHVwICIsCisJCQljdXJyZW50X3RpbWUtPnRtX2hvdXIsIGN1cnJlbnRfdGltZS0+dG1fbWluLCBjdXJyZW50X3RpbWUtPnRtX3NlYyk7CisJdXBkYXlzID0gKHVuc2lnbmVkKSBpbmZvLnVwdGltZSAvICh1bnNpZ25lZCkoNjAqNjAqMjQpOworCWlmICh1cGRheXMpCisJCXByaW50ZigiJXUgZGF5JXMsICIsIHVwZGF5cywgKHVwZGF5cyAhPSAxKSA/ICJzIiA6ICIiKTsKKwl1cG1pbnV0ZXMgPSAodW5zaWduZWQpIGluZm8udXB0aW1lIC8gKHVuc2lnbmVkKTYwOworCXVwaG91cnMgPSAodXBtaW51dGVzIC8gKHVuc2lnbmVkKTYwKSAlICh1bnNpZ25lZCkyNDsKKwl1cG1pbnV0ZXMgJT0gNjA7CisJaWYgKHVwaG91cnMpCisJCXByaW50ZigiJTJ1OiUwMnUiLCB1cGhvdXJzLCB1cG1pbnV0ZXMpOworCWVsc2UKKwkJcHJpbnRmKCIldSBtaW4iLCB1cG1pbnV0ZXMpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfVVBUSU1FX1VUTVBfU1VQUE9SVAorCXsKKwkJc3RydWN0IHV0bXB4ICp1dDsKKwkJdW5zaWduZWQgdXNlcnMgPSAwOworCQl3aGlsZSAoKHV0ID0gZ2V0dXR4ZW50KCkpICE9IE5VTEwpIHsKKwkJCWlmICgodXQtPnV0X3R5cGUgPT0gVVNFUl9QUk9DRVNTKSAmJiAodXQtPnV0X3VzZXJbMF0gIT0gJ1wwJykpCisJCQkJdXNlcnMrKzsKKwkJfQorCQlwcmludGYoIiwgICV1IHVzZXJzIiwgdXNlcnMpOworCX0KKyNlbmRpZgorCisJcHJpbnRmKCIsICBsb2FkIGF2ZXJhZ2U6ICV1LiUwMnUsICV1LiUwMnUsICV1LiUwMnVcbiIsCisJCQlMT0FEX0lOVChpbmZvLmxvYWRzWzBdKSwgTE9BRF9GUkFDKGluZm8ubG9hZHNbMF0pLAorCQkJTE9BRF9JTlQoaW5mby5sb2Fkc1sxXSksIExPQURfRlJBQyhpbmZvLmxvYWRzWzFdKSwKKwkJCUxPQURfSU5UKGluZm8ubG9hZHNbMl0pLCBMT0FEX0ZSQUMoaW5mby5sb2Fkc1syXSkpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3Byb2Nwcy93YXRjaC5jIGIvcHJvY3BzL3dhdGNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM5N2YyMQotLS0gL2Rldi9udWxsCisrKyBiL3Byb2Nwcy93YXRjaC5jCkBAIC0wLDAgKzEsMTAwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIHdhdGNoIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAxIGJ5IE1pY2hhZWwgSGFiZXJtYW5uIDxtaGFiZXJtYW5uQGdteC5kZT4KKyAqIENvcHlyaWdqdCAoQykgTWFyIDE2LCAyMDAzIE1hbnVlbCBOb3ZvYSBJSUkgICAobWpuM0Bjb2RlcG9ldC5vcmcpCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBCQl9BVURJVCBTVVN2MyBOL0EgKi8KKy8qIEJCX0FVRElUIEdOVSBkZWZlY3RzIC0tIG9ubHkgb3B0aW9uIC1uIGlzIHN1cHBvcnRlZC4gKi8KKworLy91c2FnZTojZGVmaW5lIHdhdGNoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLW4gU0VDXSBbLXRdIFBST0cgQVJHUyIKKy8vdXNhZ2U6I2RlZmluZSB3YXRjaF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlJ1biBQUk9HIHBlcmlvZGljYWxseVxuIgorLy91c2FnZTogICAgICJcbgktbglMb29wIHBlcmlvZCBpbiBzZWNvbmRzIChkZWZhdWx0IDIpIgorLy91c2FnZTogICAgICJcbgktdAlEb24ndCBwcmludCBoZWFkZXIiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHdhdGNoX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHdhdGNoIGRhdGVcbiIKKy8vdXNhZ2U6ICAgICAgICJNb24gRGVjIDE3IDEwOjMxOjQwIEdNVCAyMDAwXG4iCisvL3VzYWdlOiAgICAgICAiTW9uIERlYyAxNyAxMDozMTo0MiBHTVQgMjAwMFxuIgorLy91c2FnZTogICAgICAgIk1vbiBEZWMgMTcgMTA6MzE6NDQgR01UIDIwMDAiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvLyBwcm9jcHMgMi4wLjE4OgorLy8gd2F0Y2ggWy1kXSBbLW4gc2Vjb25kc10KKy8vICAgWy0tZGlmZmVyZW5jZXNbPWN1bXVsYXRpdmVdXSBbLS1pbnRlcnZhbD1zZWNvbmRzXSBjb21tYW5kCisvLworLy8gcHJvY3BzLTMuMi4zOgorLy8gd2F0Y2ggWy1kdF0gWy1uIHNlY29uZHNdCisvLyAgIFstLWRpZmZlcmVuY2VzWz1jdW11bGF0aXZlXV0gWy0taW50ZXJ2YWw9c2Vjb25kc10gWy0tbm8tdGl0bGVdIGNvbW1hbmQKKy8vCisvLyAocHJvY3BzIDMueCBhbmQgcHJvY3BzIDIueCBhcmUgZm9ya3MsIG5vdCBuZXdlci9vbGRlciB2ZXJzaW9ucyBvZiB0aGUgc2FtZSkKKworaW50IHdhdGNoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCB3YXRjaF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0OworCXVuc2lnbmVkIHBlcmlvZCA9IDI7CisJdW5zaWduZWQgd2lkdGgsIG5ld193aWR0aDsKKwljaGFyICpoZWFkZXI7CisJY2hhciAqY21kOworCisjaWYgMCAvLyBtYXliZSBFTkFCTEVfREVTS1RPUD8KKwkvLyBwcm9jcHMzIGNvbXBhdCAtICJlY2hvIFRFU1QgfCB3YXRjaCBjYXQiIGRvZXNuJ3Qgc2hvdyBURVNUOgorCWNsb3NlKFNURElOX0ZJTEVOTyk7CisJeG9wZW4oIi9kZXYvbnVsbCIsIE9fUkRPTkxZKTsKKyNlbmRpZgorCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTE6bisiOyAvLyBhdCBsZWFzdCBvbmUgcGFyYW07IC1uIE5VTQorCS8vICIrIjogc3RvcCBhdCBmaXJzdCBub24tb3B0aW9uIChwcm9jcHMgMy54IG9ubHkpCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIitkdG46IiwgJnBlcmlvZCk7CisJYXJndiArPSBvcHRpbmQ7CisKKwkvLyB3YXRjaCBmcm9tIGJvdGggcHJvY3BzIDIueCBhbmQgMy54IGRvZXMgY29uY2F0ZW5hdGlvbi4gRXhhbXBsZToKKwkvLyB3YXRjaCBscyAtbCAiYSAvdG1wIiAiMj4mMSIgLSBscyB3b24ndCBzZWUgImEgL3RtcCIgYXMgb25lIHBhcmFtCisJY21kID0gKmFyZ3Y7CisJd2hpbGUgKCorK2FyZ3YpCisJCWNtZCA9IHhhc3ByaW50ZigiJXMgJXMiLCBjbWQsICphcmd2KTsgLy8gbGVha3MgY21kCisKKwl3aWR0aCA9ICh1bnNpZ25lZCktMTsgLy8gbWFrZSBzdXJlIGZpcnN0IHRpbWUgbmV3X3dpZHRoICE9IHdpZHRoCisJaGVhZGVyID0gTlVMTDsKKwl3aGlsZSAoMSkgeworCQkvKiBob21lOyBjbGVhciB0byB0aGUgZW5kIG9mIHNjcmVlbiAqLworCQlwcmludGYoIlwwMzNbSCIiXDAzM1tKIik7CisJCWlmICghKG9wdCAmIDB4MikpIHsgLy8gbm8gLXQKKwkJCWNvbnN0IHVuc2lnbmVkIHRpbWVfbGVuID0gc2l6ZW9mKCIxMjM0LTY3LTkwIDIzOjU2Ojg5Iik7CisKKwkJCS8vIFNUREVSUl9GSUxFTk8gaXMgcHJvY3BzMyBjb21wYXQ6CisJCQkvLyAid2F0Y2ggbHMgMj4vZGV2L251bGwiIGRvZXMgbm90IGRldGVjdCB0dHkgc2l6ZQorCQkJZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodChTVERFUlJfRklMRU5PLCAmbmV3X3dpZHRoLCBOVUxMKTsKKwkJCWlmIChuZXdfd2lkdGggIT0gd2lkdGgpIHsKKwkJCQl3aWR0aCA9IG5ld193aWR0aDsKKwkJCQlmcmVlKGhlYWRlcik7CisJCQkJaGVhZGVyID0geGFzcHJpbnRmKCJFdmVyeSAldXM6ICUtKnMiLCBwZXJpb2QsIChpbnQpd2lkdGgsIGNtZCk7CisJCQl9CisJCQlpZiAodGltZV9sZW4gPCB3aWR0aCkgeworCQkJCXN0cmZ0aW1lX1lZWVlNTURESEhNTVNTKAorCQkJCQloZWFkZXIgKyB3aWR0aCAtIHRpbWVfbGVuLAorCQkJCQl0aW1lX2xlbiwKKwkJCQkJLyp0aW1lX3QqOiovIE5VTEwKKwkJCQkpOworCQkJfQorCisJCQkvLyBjb21wYXQ6IGVtcHR5IGxpbmUgYmV0d2VlbiBoZWFkZXIgYW5kIGNtZCBvdXRwdXQKKwkJCXByaW50ZigiJXNcblxuIiwgaGVhZGVyKTsKKwkJfQorCQlmZmx1c2hfYWxsKCk7CisJCS8vIFRPRE86ICdyZWFsJyB3YXRjaCBwaXBlcyBjbWQncyBvdXRwdXQgdG8gaXRzZWxmCisJCS8vIGFuZCBkb2VzIG5vdCBhbGxvdyBpdCB0byBvdmVyZmxvdyB0aGUgc2NyZWVuCisJCS8vICh0YWtpbmcgaW50byBhY2NvdW50IGxpbmV3cmFwISkKKwkJc3lzdGVtKGNtZCk7CisJCXNsZWVwKHBlcmlvZCk7CisJfQorCXJldHVybiAwOyAvLyBnY2MgdGhpbmtzIHdlIGNhbiByZWFjaCB0aGlzIDopCit9CmRpZmYgLS1naXQgYS9xZW11X211bHRpYXJjaF90ZXN0aW5nL1JFQURNRSBiL3FlbXVfbXVsdGlhcmNoX3Rlc3RpbmcvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NTdmZjAKLS0tIC9kZXYvbnVsbAorKysgYi9xZW11X211bHRpYXJjaF90ZXN0aW5nL1JFQURNRQpAQCAtMCwwICsxLDU4IEBACitIb3cgdG8gdGVzdCBidWlsZCB1c2luZyBBYm9yaWdpbmFsIExpbnV4IHN5c3RlbSBpbWFnZXMuCisKKyogUHV0IGEgc291cmNlIHRyZWUgaW50byBoZGMuZGlyLy4KK0ZvciBleGFtcGxlLCB0aGlzIHNob3VsZCB3b3JrOgorZ2l0IGNsb25lIGdpdDovL2J1c3lib3gubmV0L3Zhci9saWIvZ2l0L2J1c3lib3guZ2l0CisKKyogUnVuIC4vbWFrZS1oZGMtaW1nLnNoOiBpdCB3aWxsIGdlbmVyYXRlIGV4dDIgaW1hZ2UgZmlsZSwKK2hkYy5pbWcsIGZyb20gaGRjLmRpci8qIGRhdGEuIFRoaXMgcmVxdWlyZXMgcm9vdCBmb3IgbG9vcCBtb3VudC4KKworKiBEb3dubG9hZCBhbmQgdW5wYWNrLCBvciBidWlsZCBmcm9tIHNvdXJjZSBhbmQgdW5wYWNrCitvbmUgb3IgbW9yZSBzeXN0ZW0taW1hZ2UtQVJDSCBkaXJlY3RvcmllcyBpbnRvIHRoaXMgZGlyZWN0b3J5CisodGhlIG9uZSB3aGljaCBjb250YWlucyB0aGlzIFJFQURNRSkuCisKKyogUnVuOiAuL3BhcmFsbGVsLWJ1aWxkLWhkYy1pbWcuc2ggc3lzdGVtLWltYWdlLURJUjEgc3lzdGVtLWltYWdlLURJUjIuLi4KKyhiYWNrZ3JvdW5kIGl0IGlmIHlvdSBkb24ndCB3YW50IHRvIHNlZSAiV2FpdGluZyB0byBmaW5pc2giIHRoaW5nKS4KK1RoaXMgcnVucyBidWlsZCBpbiBzZXZlcmFsIHFlbXUgdmlydHVhbCBtYWNoaW5lcyBpbiBwYXJhbGxlbC4KKworKiBPYnNlcnZlIHN5c3RlbS1pbWFnZS0qLmxvZyBmaWxlKHMpIHdpdGggZ3Jvd2luZyBsb2cgb2YgdGhlIGJ1aWxkLgorCitUaGVyZSBpcyBubyBhdXRvbWF0ZWQgZGV0ZWN0aW9uIG9mIGVycm9ycyBmb3Igbm93OiB5b3UgbmVlZCB0byBleGFtaW5lCitsb2dzIHlvdXJzZWxmLgorCitMb2cgZmlsZXMgd2lsbCBhbHNvIGNvbnRhaW4gdXVlbmNvZGVkIChvciBpZiBhbGwgZWxzZSBmYWlscywgb2QgLXR4MSdlZCkKK2JpbmFyeSwgaWYgYnVpbGQgd2FzIHN1Y2Nlc3NmdWwuCisKK1RvIGRlYnVnIGEgYnVpbGQgcHJvYmxlbSBpbiBvbmUgb2YgdGhlIHNhbmRib3hlcywgY2hhbmdlIGtlZXBfaGRiCit0byAia2VlcF9oZGI9dHJ1ZSIgaW4gcGFyYWxsZWwtYnVpbGQtaGRjLWltZy5zaAorLSB0aGlzIHByZXNlcnZlcyBzeXN0ZW0taW1hZ2UtQVJDSC9oZGIuaW1nIGFmdGVyIHRoZSBidWlsZCwKK3NvIHlvdSBjYW4gZ28gaW50byBzeXN0ZW0taW1hZ2UtQVJDSCBhbmQgcnVuCisiSERCPWhkYi5pbWcgLi9kZXYtZW52aXJvbm1lbnQuc2giIHRvIGRlYnVnIHRoZSBwcm9ibGVtLgorCitZb3UgY2FuIGFsc28gcnVuICIuL3BhcmFsbGVsLWJ1aWxkLWhkYy1pbWcuc2ggLXMgc3lzdGVtLWltYWdlLUFSQ0giCistIHNpbmdsZSBtb2RlLCBvdXRwdXQgaXMgdG8gc2NyZWVuIGFuZCBzZXJpYWwgaW5wdXQgaXMgZnJvbSBrZXlib2FyZC4KKworSWYgaGRjLmRpci9iaW4vYnVzeWJveC0kQVJDSCBleGlzdHMsIGl0IHdpbGwgYmUgdXNlZCBkdXJpbmcgYnVpbGQKK3RvIHN1cHBseSBhZGRpdGlvbmFsIHRvb2xzIChkaXIgd2l0aCBhbGwgYXBwbGV0cyBhcHBlbmRlZCB0byAkUEFUSCkuCisKK0ZvciBtZSwgdGhlIGZvbGxvd2luZyBzeXN0ZW0gaW1hZ2VzIHdvcmtlZDoKK3N5c3RlbS1pbWFnZS1hcm12NGwKK3N5c3RlbS1pbWFnZS1hcm12NHRsCitzeXN0ZW0taW1hZ2UtYXJtdjVsCisgICAgb2QgaXMgYnVnZ3kgb24gYXJtKjoKKyAgICAjIGVjaG8gSGVsbG8taGVsbG8taGVsbG8taGVsbG8gfCBvZCAtYgorICAgIDAwMDAwMDAgMTEwIDE0NSAxNTQgMTU0IDE1NyAwNTUgMTUwIDE0NSAxNTQgMTU0IDE1NyAwNTUgMTUwIDE0NSAxNTQgMTU0CisgICAgMDAwMDAwMCAxNTcgMDU1IDE1MCAxNDUgMTU0IDE1NCAxNTcgMDEyICA8PSBXUk9ORyBPRkZTRVQKKyAgICAwMDAwMDAwICAgICAgICAgICAgICAgICAgICAgKGNhbiBhbHNvIGJlIGV2ZW4gbW9yZSBib2d1cyBsaWtlIDE3NzY3MTUzMzYxKQorc3lzdGVtLWltYWdlLWk2ODYKK3N5c3RlbS1pbWFnZS1taXBzICAgIC0gb2QgaXMgYnVnZ3kKK3N5c3RlbS1pbWFnZS1taXBzZWwgIC0gb2QgaXMgYnVnZ3kKK3N5c3RlbS1pbWFnZS14ODZfNjQKK3N5c3RlbS1pbWFnZS1wb3dlcnBjIC0gcWVtdSAxLjIuMiBkaWRuJ3Qgd29yaywgMi40LjAgd29ya2VkOyBvZCBpcyBidWdneQorc3lzdGVtLWltYWdlLXNwYXJjICAgLSBxZW11IDEuMi4yIGRpZG4ndCB3b3JrLCAyLjQuMCB3b3JrZWQ7IG9kIGlzIGJ1Z2d5CisKK0FuZCB0aGVzZSBkaWQgbm90Ogorc3lzdGVtLWltYWdlLWFybXY2bCAgLSBoYW5nIG9uICJVbmNvbXByZXNzaW5nIExpbnV4Li4uIGRvbmUsIGJvb3RpbmcgdGhlIGtlcm5lbCIKK3N5c3RlbS1pbWFnZS1tNjhrICAgIC0gbXkgcWVtdSBkb2Vzbid0IGxpa2UgIi1NIHE4MDAiCitzeXN0ZW0taW1hZ2UtbWlwczY0ICAtIGluaXQgZGllcyAiS2VybmVsIHBhbmljIC0gbm90IHN5bmNpbmc6IEF0dGVtcHRlZCB0byBraWxsIGluaXQhIGV4aXRjb2RlPTB4MDAwMDAwMGEiCitzeXN0ZW0taW1hZ2Utc2g0ICAgICAtIHFlbXUgc2VnZmF1bHRzIGVhcmx5IGluIGtlcm5lbCBib290CmRpZmYgLS1naXQgYS9xZW11X211bHRpYXJjaF90ZXN0aW5nL2V4dHJhY3Rfb2RfYmluYXJ5LnNoIGIvcWVtdV9tdWx0aWFyY2hfdGVzdGluZy9leHRyYWN0X29kX2JpbmFyeS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMDA2ZTUxCi0tLSAvZGV2L251bGwKKysrIGIvcWVtdV9tdWx0aWFyY2hfdGVzdGluZy9leHRyYWN0X29kX2JpbmFyeS5zaApAQCAtMCwwICsxLDYgQEAKKyMhL2Jpbi9zaAorCisjIENvbnZlcnRzIHRleHR1YWwgcmVzdWx0IG9mICJvZCAtdHgxIDxGSUxFIgorIyBiYWNrIGludG8gYSBiaW5hcnkgRklMRQorCitncmVwIC1hICdeWzAtN11bMC03XVswLTddWzAtN11bMC03XVswLTddWzAtN11bMC03XSogWzAtOWEtZl1bMC05YS1mXSBbMC05YS1mXVswLTlhLWZdIFswLTlhLWZdWzAtOWEtZl0gWzAtOWEtZl1bMC05YS1mXScgfCBidXN5Ym94IGhleGR1bXAgLVIKZGlmZiAtLWdpdCBhL3FlbXVfbXVsdGlhcmNoX3Rlc3RpbmcvaGRjLmRpci9idWlsZCBiL3FlbXVfbXVsdGlhcmNoX3Rlc3RpbmcvaGRjLmRpci9idWlsZApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOTk4MTg2Ci0tLSAvZGV2L251bGwKKysrIGIvcWVtdV9tdWx0aWFyY2hfdGVzdGluZy9oZGMuZGlyL2J1aWxkCkBAIC0wLDAgKzEsNTAgQEAKKyMhL2Jpbi9zaAorCit1bW91bnQgL21udCAjIG9wdGlvbmFsCisKK3Rlc3QgLXggImJpbi9idXN5Ym94LSRIT1NUIiAmJiB7CisJZWNobyAiRm91bmQgYmluL2J1c3lib3gtJEhPU1QsIHVzaW5nIGl0IgorCWNwIC1hICJiaW4vYnVzeWJveC0kSE9TVCIgYmluL2J1c3lib3gKKwliaW4vYnVzeWJveCAtLWluc3RhbGwgLXMgYmluLworCSMgU3VwcGx5IG1pc3Npbmcgc3R1ZmYgKGUuZy4gYnppcDIpOgorCVBBVEg9IiRQQVRIOiRQV0QvYmluIgorCSMgT3ZlcnJpZGUga25vd24tYnVnZ3kgaG9zdCBiaW5hcmllczoKKwljcCAtYWYgYmluL29kIGB3aGljaCBvZGAKK30KKworKAorCSNzZXQgLWUgLXgKKwljZCBidXN5Ym94CisKKwltYWtlIGRlZmNvbmZpZworCSMgV2FudCBzdGF0aWMgYnVpbGQKKwlzZWQgJ3MvXi4qQ09ORklHX1NUQVRJQy4qJC9DT05GSUdfU1RBVElDPXkvJyAtaSAuY29uZmlnCisJYnppcDIgPC9kZXYvbnVsbCA+L2Rldi9udWxsIHx8IHsKKwkJIyBEcmF0cywgbmV3ZXIgQWJvcmlnaW5hbCBMaW51eCBoYXMgbm8gYnppcDIKKwkJc2VkICdzL14uKkNPTkZJR19GRUFUVVJFX0NPTVBSRVNTX1VTQUdFLiokLyMgQ09ORklHX0ZFQVRVUkVfQ09NUFJFU1NfVVNBR0UgaXMgbm90IHNldC8nIC1pIC5jb25maWcKKwl9CisJdGVzdCB4ImB1bmFtZSAtbWAiID0geCJtaXBzIiAmJiB7CisJCSMgV2l0aG91dCB0aGlzLCBJIGdldCBNSVBTLUkgYmluYXJ5IGluc3RlYWQgb2YgTUlQUzMyLgorCQkjIE5vIGlkZWEgd2hhdCdzIHRoZSBkaWZmZXJlbmNlLCBidXQgbXkgcm91dGVyIHdhbnRzIE1JUFMzMi4KKwkJc2VkICdzL14uKkNPTkZJR19FWFRSQV9DRkxBR1MuKiQvQ09ORklHX0VYVFJBX0NGTEFHUz0iLW1pcHMzMiIvJyAtaSAuY29uZmlnCisJfQorCSMgVGhlc2Ugd29uJ3QgYnVpbGQgYmVjYXVzZSBvZiB0b29sY2hhaW4vbGliYyBicmVha2FnZToKKwlzZWQgJ3MvXi4qQ09ORklHX0ZFQVRVUkVfU1lOQ19GQU5DWS4qJC8jIENPTkZJR19GRUFUVVJFX1NZTkNfRkFOQ1kgaXMgbm90IHNldC8nIC1pIC5jb25maWcgIyBubyBzeW5jZnMoKQorCXNlZCAncy9eLipDT05GSUdfRkVBVFVSRV9XVE1QLiokLyMgQ09ORklHX0ZFQVRVUkVfV1RNUCBpcyBub3Qgc2V0LycgLWkgLmNvbmZpZworCXNlZCAncy9eLipDT05GSUdfRkVBVFVSRV9VVE1QLiokLyMgQ09ORklHX0ZFQVRVUkVfVVRNUCBpcyBub3Qgc2V0LycgLWkgLmNvbmZpZworCXNlZCAncy9eLipDT05GSUdfRkVBVFVSRV9JTkVURF9SUEMuKiQvIyBDT05GSUdfRkVBVFVSRV9JTkVURF9SUEMgaXMgbm90IHNldC8nIC1pIC5jb25maWcKKworCW1ha2UgI1Y9MSB8fCBzaAorCXNpemUgYnVzeWJveAorCS4vYnVzeWJveCB8fCBlY2hvICJFeGl0IGNvZGU6ICQ/IgorCWlmIHV1ZW5jb2RlIFRFU1QgPC9kZXYvbnVsbCA+L2Rldi9udWxsICYmIGJ6aXAyIDwvZGV2L251bGwgPi9kZXYvbnVsbDsgdGhlbgorCQliemlwMiA8YnVzeWJveCB8IHV1ZW5jb2RlIGJ1c3lib3guYnoyCisJZWxzZQorCQlvZCAtdiAtdHgxIDxidXN5Ym94CisJZmkKKwkjdGVzdCAieCRGVFBfUE9SVCIgPSB4IHx8CisJIwlmdHBwdXQgLVAgIiRGVFBfUE9SVCIgIiRGVFBfU0VSVkVSIiBzdHJhY2UKKykgMj4mMSB8IHRlZSBidWlsZC5sb2cKK21vdW50IC1vIHJlbW91bnQscm8gL2hvbWUKK3N5bmMKK3NsZWVwIDEKZGlmZiAtLWdpdCBhL3FlbXVfbXVsdGlhcmNoX3Rlc3RpbmcvaGRjLmRpci9pbml0IGIvcWVtdV9tdWx0aWFyY2hfdGVzdGluZy9oZGMuZGlyL2luaXQKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjkyMzcxZAotLS0gL2Rldi9udWxsCisrKyBiL3FlbXVfbXVsdGlhcmNoX3Rlc3RpbmcvaGRjLmRpci9pbml0CkBAIC0wLDAgKzEsOSBAQAorIyEvYmluL3NoCisKKyMgRW1pdCBhIG1zZyB0byBsZXQgdXNlciBrbm93IHRoaXMgcGxhY2Ugd2FzIHJlYWNoZWQKK2VjaG8gIkNvcHlpbmcgdG8gL2hvbWUiCisjIEhhZCBhIGNhc2Ugd2hlcmUgY3AgU0VHVnMsIGxldCdzIGhhdmUgZGlhZ25vc3RpY3MgZm9yIGl0CitjcCAtYSAvbW50IC9ob21lIHx8IHsgZWNobyAiY3A6ICQ/IjsgZXhpdCAxOyB9CitjZCAvaG9tZS9tbnQgfHwgeyBlY2hvICJjZDogJD8iOyBleGl0IDE7IH0KK2V4ZWMgLi9idWlsZAorZWNobyAiRmFpbGVkIHRvIGV4ZWMgLi9idWlsZCIKZGlmZiAtLWdpdCBhL3FlbXVfbXVsdGlhcmNoX3Rlc3RpbmcvbWFrZS1oZGMtaW1nLnNoIGIvcWVtdV9tdWx0aWFyY2hfdGVzdGluZy9tYWtlLWhkYy1pbWcuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2MzNWY0ZQotLS0gL2Rldi9udWxsCisrKyBiL3FlbXVfbXVsdGlhcmNoX3Rlc3RpbmcvbWFrZS1oZGMtaW1nLnNoCkBAIC0wLDAgKzEsMzAgQEAKKyMhL2Jpbi9zaCAtZXgKKworbW91bnRwb2ludCAtcSAvCitbICEgLWUgaGRjLmltZy5kaXIgXQorCitjbGVhbnVwKCkKK3sKKwl0cmFwIC0gRVhJVAorCWlmIG1vdW50cG9pbnQgLXEgaGRjLmltZy5kaXI7IHRoZW4KKwkJdW1vdW50IC1kIGhkYy5pbWcuZGlyCisJZmkKKwltb3VudHBvaW50IC1xIGhkYy5pbWcuZGlyIHx8CisJCXJtIC1yZiBoZGMuaW1nLmRpcgorCWV4aXQgJEAKK30KKwordHJhcCAnY2xlYW51cCAkPycgRVhJVAordHJhcCAnY2xlYW51cCAxJyBIVVAgUElQRSBJTlQgUVVJVCBURVJNCisKK3NpemU9JChkdSAta3MgaGRjLmRpciB8IHNlZCAtcm4gJ3MvXihbMC05XSspLiovXDEvcCcpCitbICIkc2l6ZSIgLWd0IDAgXQorCitybSAtZiBoZGMuaW1nCitkZCBpZj0vZGV2L3plcm8gb2Y9aGRjLmltZyBjb3VudD0xIGJzPTEwMjQgc2Vlaz0kKCgkc2l6ZSoyKSkKK21rZnMuZXh0MyAtcSAtRiAtYiAxMDI0IC1pIDQwOTYgaGRjLmltZwordHVuZTJmcyAtYyAwIC1pIDAgaGRjLmltZworbWtkaXIgaGRjLmltZy5kaXIKK21vdW50IC1vIGxvb3AgaGRjLmltZyBoZGMuaW1nLmRpcgorY3AgLWEgaGRjLmRpci8qIGhkYy5pbWcuZGlyLwordW1vdW50IC1kIGhkYy5pbWcuZGlyCmRpZmYgLS1naXQgYS9xZW11X211bHRpYXJjaF90ZXN0aW5nL3BhcmFsbGVsLWJ1aWxkLWhkYy1pbWcuc2ggYi9xZW11X211bHRpYXJjaF90ZXN0aW5nL3BhcmFsbGVsLWJ1aWxkLWhkYy1pbWcuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWVlNTRlYgotLS0gL2Rldi9udWxsCisrKyBiL3FlbXVfbXVsdGlhcmNoX3Rlc3RpbmcvcGFyYWxsZWwtYnVpbGQtaGRjLWltZy5zaApAQCAtMCwwICsxLDQwIEBACisjIS9iaW4vc2gKKworZXhwb3J0IEhEQk1FR1M9MTAwCitrZWVwX2hkYj1mYWxzZQorCitidWlsZF9pbl9kaXIoKQoreworCWNkICIkMSIgfHwgZXhpdCAxCisJcm0gLWYgaGRiLmltZworCW5pY2UgLW4xMCB0aW1lIC4vbmF0aXZlLWJ1aWxkLnNoIC4uL2hkYy5pbWcKKwkka2VlcF9oZGIgfHwgcm0gLWYgaGRiLmltZworCWVjaG8gPiYzICJGaW5pc2hlZDogJDEiCit9CisKK3Rlc3QgIiQxIiA9ICItcyIgJiYgeworCWRpcj0iJDIiCisJIyBzaW5nbGUgbW9kZTogYnVpbGQgb25lIGRpcmVjdG9yeSwgc2hvdyBvdXRwdXQKKwl0ZXN0IC1kICIkZGlyIiB8fCBleGl0IDEKKwl0ZXN0IC1lICIkZGlyL25hdGl2ZS1idWlsZC5zaCIgfHwgZXhpdCAxCisJYnVpbGRfaW5fZGlyICIkZGlyIgorCWV4aXQgJD8KK30KKworc3RhcnRlZD1mYWxzZQorZm9yIGRpcjsgZG8KKwl0ZXN0IC1kICIkZGlyIiB8fCBjb250aW51ZQorCXRlc3QgLWUgIiRkaXIvbmF0aXZlLWJ1aWxkLnNoIiB8fCBjb250aW51ZQorCWVjaG8gIlN0YXJ0aW5nOiAkZGlyIgorCWJ1aWxkX2luX2RpciAiJGRpciIgMz4mMSA8L2Rldi9udWxsID4iJGRpci5sb2ciIDI+JjEgJgorCXN0YXJ0ZWQ9dHJ1ZQorZG9uZQorCiskc3RhcnRlZCB8fCB7CisJZWNobyAiR2l2ZSBtZSBzeXN0ZW0taW1hZ2UtQVJDSCBkaXJlY3RvcmllcyBvbiBjb21tYW5kIGxpbmUiCisJZXhpdCAxCit9CisKK2VjaG8gIldhaXRpbmcgdG8gZmluaXNoIgord2FpdAorZWNobyAiRG9uZSwgY2hlY2sgdGhlIGxvZ3MiCmRpZmYgLS1naXQgYS9ydW5pdC9Db25maWcuc3JjIGIvcnVuaXQvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGI5NzQwCi0tLSAvZGV2L251bGwKKysrIGIvcnVuaXQvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDg5IEBACisjCisjIEZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBzeW50YXggb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpbGUsCisjIHNlZSBzY3JpcHRzL2tidWlsZC9jb25maWctbGFuZ3VhZ2UudHh0LgorIworCittZW51ICJSdW5pdCBVdGlsaXRpZXMiCisKK0lOU0VSVAorCitjb25maWcgUlVOU1YKKwlib29sICJydW5zdiIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBydW5zdiBzdGFydHMgYW5kIG1vbml0b3JzIGEgc2VydmljZSBhbmQgb3B0aW9uYWxseSBhbiBhcHBlbmRhbnQgbG9nCisJICBzZXJ2aWNlLgorCitjb25maWcgUlVOU1ZESVIKKwlib29sICJydW5zdmRpciIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBydW5zdmRpciBzdGFydHMgYSBydW5zdiBwcm9jZXNzIGZvciBlYWNoIHN1YmRpcmVjdG9yeSwgb3Igc3ltbGluayB0bworCSAgYSBkaXJlY3RvcnksIGluIHRoZSBzZXJ2aWNlcyBkaXJlY3RvcnkgZGlyLCB1cCB0byBhIGxpbWl0IG9mIDEwMDAKKwkgIHN1YmRpcmVjdG9yaWVzLCBhbmQgcmVzdGFydHMgYSBydW5zdiBwcm9jZXNzIGlmIGl0IHRlcm1pbmF0ZXMuCisKK2NvbmZpZyBGRUFUVVJFX1JVTlNWRElSX0xPRworCWJvb2wgIkVuYWJsZSBzY3JvbGxpbmcgYXJndW1lbnQgbG9nIgorCWRlcGVuZHMgb24gUlVOU1ZESVIKKwlkZWZhdWx0IG4KKwloZWxwCisJICBFbmFibGUgZmVhdHVyZSB3aGVyZSBzZWNvbmQgcGFyYW1ldGVyIG9mIHJ1bnN2ZGlyIGhvbGRzIGxhc3QgZXJyb3IKKwkgIG1lc3NhZ2UgKHZpZXdhYmxlIHZpYSB0b3AvcHMpLiBPdGhlcndpc2UgKGZlYXR1cmUgaXMgb2ZmCisJICBvciBubyBwYXJhbWV0ZXIpLCBlcnJvciBtZXNzYWdlcyBnbyB0byBzdGRlcnIgb25seS4KKworY29uZmlnIFNWCisJYm9vbCAic3YiCisJZGVmYXVsdCB5CisJaGVscAorCSAgc3YgcmVwb3J0cyB0aGUgY3VycmVudCBzdGF0dXMgYW5kIGNvbnRyb2xzIHRoZSBzdGF0ZSBvZiBzZXJ2aWNlcworCSAgbW9uaXRvcmVkIGJ5IHRoZSBydW5zdiBzdXBlcnZpc29yLgorCitjb25maWcgU1ZfREVGQVVMVF9TRVJWSUNFX0RJUgorCXN0cmluZyAiRGVmYXVsdCBkaXJlY3RvcnkgZm9yIHNlcnZpY2VzIgorCWRlZmF1bHQgIi92YXIvc2VydmljZSIKKwlkZXBlbmRzIG9uIFNWCisJaGVscAorCSAgRGVmYXVsdCBkaXJlY3RvcnkgZm9yIHNlcnZpY2VzLgorCSAgRGVmYXVsdHMgdG8gIi92YXIvc2VydmljZSIKKworY29uZmlnIFNWTE9HRAorCWJvb2wgInN2bG9nZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBzdmxvZ2QgY29udGludW91c2x5IHJlYWRzIGxvZyBkYXRhIGZyb20gaXRzIHN0YW5kYXJkIGlucHV0LCBvcHRpb25hbGx5CisJICBmaWx0ZXJzIGxvZyBtZXNzYWdlcywgYW5kIHdyaXRlcyB0aGUgZGF0YSB0byBvbmUgb3IgbW9yZSBhdXRvbWF0aWNhbGx5CisJICByb3RhdGVkIGxvZ3MuCisKK2NvbmZpZyBDSFBTVAorCWJvb2wgImNocHN0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIGNocHN0IGNoYW5nZXMgdGhlIHByb2Nlc3Mgc3RhdGUgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBvcHRpb25zLCBhbmQKKwkgIGV4ZWNzIHNwZWNpZmllZCBwcm9ncmFtLgorCitjb25maWcgU0VUVUlER0lECisJYm9vbCAic2V0dWlkZ2lkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFNldHMgc29mdCByZXNvdXJjZSBsaW1pdHMgYXMgc3BlY2lmaWVkIGJ5IG9wdGlvbnMKKworY29uZmlnIEVOVlVJREdJRAorCWJvb2wgImVudnVpZGdpZCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTZXRzICRVSUQgdG8gYWNjb3VudCdzIHVpZCBhbmQgJEdJRCB0byBhY2NvdW50J3MgZ2lkCisKK2NvbmZpZyBFTlZESVIKKwlib29sICJlbnZkaXIiCisJZGVmYXVsdCB5CisJaGVscAorCSAgU2V0cyB2YXJpb3VzIGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzcGVjaWZpZWQgYnkgZmlsZXMKKwkgIGluIHRoZSBnaXZlbiBkaXJlY3RvcnkKKworY29uZmlnIFNPRlRMSU1JVAorCWJvb2wgInNvZnRsaW1pdCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBTZXRzIHNvZnQgcmVzb3VyY2UgbGltaXRzIGFzIHNwZWNpZmllZCBieSBvcHRpb25zCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL3J1bml0L0tidWlsZC5zcmMgYi9ydW5pdC9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmY2U5NTUKLS0tIC9kZXYvbnVsbAorKysgYi9ydW5pdC9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsMjAgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitsaWIteTo9CisKK0lOU0VSVAorCitsaWItJChDT05GSUdfUlVOU1YpICs9IHJ1bnN2Lm8KK2xpYi0kKENPTkZJR19SVU5TVkRJUikgKz0gcnVuc3ZkaXIubworbGliLSQoQ09ORklHX1NWKSArPSBzdi5vCitsaWItJChDT05GSUdfU1ZMT0dEKSArPSBzdmxvZ2QubworbGliLSQoQ09ORklHX0NIUFNUKSArPSBjaHBzdC5vCisKK2xpYi0kKENPTkZJR19FTlZESVIpICs9IGNocHN0Lm8KK2xpYi0kKENPTkZJR19FTlZVSURHSUQpICs9IGNocHN0Lm8KK2xpYi0kKENPTkZJR19TRVRVSURHSUQpICs9IGNocHN0Lm8KK2xpYi0kKENPTkZJR19TT0ZUTElNSVQpICs9IGNocHN0Lm8KZGlmZiAtLWdpdCBhL3J1bml0L2NocHN0LmMgYi9ydW5pdC9jaHBzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYWYyOWYKLS0tIC9kZXYvbnVsbAorKysgYi9ydW5pdC9jaHBzdC5jCkBAIC0wLDAgKzEsNDQ0IEBACisvKgorQ29weXJpZ2h0IChjKSAyMDAxLTIwMDYsIEdlcnJpdCBQYXBlCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECitXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8KK0VWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKK1BST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCitXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisvKiBCdXN5Ym94ZWQgYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4gKi8KKy8qIERlcGVuZGVuY2llcyBvbiBydW5pdF9saWIuYyByZW1vdmVkICovCisKKy8vdXNhZ2U6I2RlZmluZSBjaHBzdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy12UDAxMl0gWy11IFVTRVJbOkdSUF1dIFstVSBVU0VSWzpHUlBdXSBbLWUgRElSXVxuIgorLy91c2FnZTogICAgICAgIglbLS8gRElSXSBbLW4gTklDRV0gWy1tIEJZVEVTXSBbLWQgQllURVNdIFstbyBOXVxuIgorLy91c2FnZTogICAgICAgIglbLXAgTl0gWy1mIEJZVEVTXSBbLWMgQllURVNdIFBST0cgQVJHUyIKKy8vdXNhZ2U6I2RlZmluZSBjaHBzdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoYW5nZSB0aGUgcHJvY2VzcyBzdGF0ZSwgcnVuIFBST0dcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXUgVVNFUls6R1JQXQlTZXQgdWlkIGFuZCBnaWQiCisvL3VzYWdlOiAgICAgIlxuCS1VIFVTRVJbOkdSUF0JU2V0ICRVSUQgYW5kICRHSUQgaW4gZW52aXJvbm1lbnQiCisvL3VzYWdlOiAgICAgIlxuCS1lIERJUgkJU2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzcGVjaWZpZWQgYnkgZmlsZXMiCisvL3VzYWdlOiAgICAgIlxuCQkJaW4gRElSOiBmaWxlPTFzdF9saW5lX29mX2ZpbGUiCisvL3VzYWdlOiAgICAgIlxuCS0vIERJUgkJQ2hyb290IHRvIERJUiIKKy8vdXNhZ2U6ICAgICAiXG4JLW4gTklDRQkJQWRkIE5JQ0UgdG8gbmljZSB2YWx1ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLW0gQllURVMJU2FtZSBhcyAtZCBCWVRFUyAtcyBCWVRFUyAtbCBCWVRFUyIKKy8vdXNhZ2U6ICAgICAiXG4JLWQgQllURVMJTGltaXQgZGF0YSBzZWdtZW50IgorLy91c2FnZTogICAgICJcbgktbyBOCQlMaW1pdCBudW1iZXIgb2Ygb3BlbiBmaWxlcyBwZXIgcHJvY2VzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXAgTgkJTGltaXQgbnVtYmVyIG9mIHByb2Nlc3NlcyBwZXIgdWlkIgorLy91c2FnZTogICAgICJcbgktZiBCWVRFUwlMaW1pdCBvdXRwdXQgZmlsZSBzaXplcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWMgQllURVMJTGltaXQgY29yZSBmaWxlIHNpemUiCisvL3VzYWdlOiAgICAgIlxuCS12CQlWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktUAkJQ3JlYXRlIG5ldyBwcm9jZXNzIGdyb3VwIgorLy91c2FnZTogICAgICJcbgktMAkJQ2xvc2Ugc3RkaW4iCisvL3VzYWdlOiAgICAgIlxuCS0xCQlDbG9zZSBzdGRvdXQiCisvL3VzYWdlOiAgICAgIlxuCS0yCQlDbG9zZSBzdGRlcnIiCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGVudmRpcl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiRElSIFBST0cgQVJHUyIKKy8vdXNhZ2U6I2RlZmluZSBlbnZkaXJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTZXQgdmFyaW91cyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXMgc3BlY2lmaWVkIGJ5IGZpbGVzXG4iCisvL3VzYWdlOiAgICAgICAiaW4gdGhlIGRpcmVjdG9yeSBESVIsIHJ1biBQUk9HIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBlbnZ1aWRnaWRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlVTRVIgUFJPRyBBUkdTIgorLy91c2FnZTojZGVmaW5lIGVudnVpZGdpZF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNldCAkVUlEIHRvIFVTRVIncyB1aWQgYW5kICRHSUQgdG8gVVNFUidzIGdpZCwgcnVuIFBST0ciCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHNldHVpZGdpZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiVVNFUiBQUk9HIEFSR1MiCisvL3VzYWdlOiNkZWZpbmUgc2V0dWlkZ2lkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU2V0IHVpZCBhbmQgZ2lkIHRvIFVTRVIncyB1aWQgYW5kIGdpZCwgZHJvcCBzdXBwbGVtZW50YXJ5IGdyb3VwIGlkcyxcbiIKKy8vdXNhZ2U6ICAgICAgICJydW4gUFJPRyIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgc29mdGxpbWl0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWEgQllURVNdIFstbSBCWVRFU10gWy1kIEJZVEVTXSBbLXMgQllURVNdIFstbCBCWVRFU11cbiIKKy8vdXNhZ2U6ICAgICAgICIJWy1mIEJZVEVTXSBbLWMgQllURVNdIFstciBCWVRFU10gWy1vIE5dIFstcCBOXSBbLXQgTl1cbiIKKy8vdXNhZ2U6ICAgICAgICIJUFJPRyBBUkdTIgorLy91c2FnZTojZGVmaW5lIHNvZnRsaW1pdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlNldCBzb2Z0IHJlc291cmNlIGxpbWl0cywgdGhlbiBydW4gUFJPR1xuIgorLy91c2FnZTogICAgICJcbgktYSBCWVRFUwlMaW1pdCB0b3RhbCBzaXplIG9mIGFsbCBzZWdtZW50cyIKKy8vdXNhZ2U6ICAgICAiXG4JLW0gQllURVMJU2FtZSBhcyAtZCBCWVRFUyAtcyBCWVRFUyAtbCBCWVRFUyAtYSBCWVRFUyIKKy8vdXNhZ2U6ICAgICAiXG4JLWQgQllURVMJTGltaXQgZGF0YSBzZWdtZW50IgorLy91c2FnZTogICAgICJcbgktcyBCWVRFUwlMaW1pdCBzdGFjayBzZWdtZW50IgorLy91c2FnZTogICAgICJcbgktbCBCWVRFUwlMaW1pdCBsb2NrZWQgbWVtb3J5IHNpemUiCisvL3VzYWdlOiAgICAgIlxuCS1vIE4JCUxpbWl0IG51bWJlciBvZiBvcGVuIGZpbGVzIHBlciBwcm9jZXNzIgorLy91c2FnZTogICAgICJcbgktcCBOCQlMaW1pdCBudW1iZXIgb2YgcHJvY2Vzc2VzIHBlciB1aWQiCisvL3VzYWdlOiAgICAgIlxuT3B0aW9ucyBjb250cm9sbGluZyBmaWxlIHNpemVzOiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYgQllURVMJTGltaXQgb3V0cHV0IGZpbGUgc2l6ZXMiCisvL3VzYWdlOiAgICAgIlxuCS1jIEJZVEVTCUxpbWl0IGNvcmUgZmlsZSBzaXplIgorLy91c2FnZTogICAgICJcbkVmZmljaWVuY3kgb3B0czoiCisvL3VzYWdlOiAgICAgIlxuCS1yIEJZVEVTCUxpbWl0IHJlc2lkZW50IHNldCBzaXplIgorLy91c2FnZTogICAgICJcbgktdCBOCQlMaW1pdCBDUFUgdGltZSwgcHJvY2VzcyByZWNlaXZlcyIKKy8vdXNhZ2U6ICAgICAiXG4JCQlhIFNJR1hDUFUgYWZ0ZXIgTiBzZWNvbmRzIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4gLyogZ2V0cmxpbWl0ICovCisKKy8qCitGaXZlIGFwcGxldHMgaGVyZTogY2hwc3QsIGVudmRpciwgZW52dWlkZ2lkLCBzZXR1aWRnaWQsIHNvZnRsaW1pdC4KKworT25seSBzb2Z0bGltaXQgYW5kIGNocHN0IGFyZSB0YWtpbmcgb3B0aW9uczoKKworIyBjb21tb24KKy1vIE4gICAgICAgICAgICBMaW1pdCBudW1iZXIgb2Ygb3BlbiBmaWxlcyBwZXIgcHJvY2VzcworLXAgTiAgICAgICAgICAgIExpbWl0IG51bWJlciBvZiBwcm9jZXNzZXMgcGVyIHVpZAorLW0gQllURVMgICAgICAgIFNhbWUgYXMgLWQgQllURVMgLXMgQllURVMgLWwgQllURVMgWy1hIEJZVEVTXQorLWQgQllURVMgICAgICAgIExpbWl0IGRhdGEgc2VnbWVudAorLWYgQllURVMgICAgICAgIExpbWl0IG91dHB1dCBmaWxlIHNpemVzCistYyBCWVRFUyAgICAgICAgTGltaXQgY29yZSBmaWxlIHNpemUKKyMgc29mdGxpbWl0CistYSBCWVRFUyAgICAgICAgTGltaXQgdG90YWwgc2l6ZSBvZiBhbGwgc2VnbWVudHMKKy1zIEJZVEVTICAgICAgICBMaW1pdCBzdGFjayBzZWdtZW50CistbCBCWVRFUyAgICAgICAgTGltaXQgbG9ja2VkIG1lbW9yeSBzaXplCistciBCWVRFUyAgICAgICAgTGltaXQgcmVzaWRlbnQgc2V0IHNpemUKKy10IE4gICAgICAgICAgICBMaW1pdCBDUFUgdGltZQorIyBjaHBzdAorLXUgVVNFUls6R1JQXSAgIFNldCB1aWQgYW5kIGdpZAorLVUgVVNFUls6R1JQXSAgIFNldCAkVUlEIGFuZCAkR0lEIGluIGVudmlyb25tZW50CistZSBESVIgICAgICAgICAgU2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyBhcyBzcGVjaWZpZWQgYnkgZmlsZXMgaW4gRElSCistLyBESVIgICAgICAgICAgQ2hyb290IHRvIERJUgorLW4gTklDRSAgICAgICAgIEFkZCBOSUNFIHRvIG5pY2UgdmFsdWUKKy12ICAgICAgICAgICAgICBWZXJib3NlCistUCAgICAgICAgICAgICAgQ3JlYXRlIG5ldyBwcm9jZXNzIGdyb3VwCistMCAtMSAtMiAgICAgICAgQ2xvc2UgZmQgMCwxLDIKKworRXZlbiB0aG91Z2ggd2UgYWNjZXB0IGFsbCB0aGVzZSBvcHRpb25zIGZvciBib3RoIHNvZnRsaW1pdCBhbmQgY2hwc3QsCit0aGV5IGFyZSBub3QgdG8gYmUgYWR2ZXJ0aXNlZCBvbiB0aGVpciBoZWxwIHRleHRzLgorV2UgaGF2ZSBlbm91Z2ggcHJvYmxlbXMgd2l0aCBmZWF0dXJlIGNyZWVwIGluIG90aGVyIHBlb3BsZSdzCitzb2Z0d2FyZSwgZG9uJ3Qgd2FudCB0byBhZGQgb3VyIG93bi4KKworZW52ZGlyLCBlbnZ1aWRnaWQsIHNldHVpZGdpZCB0YWtlIG5vIG9wdGlvbnMsIGJ1dCB0aGV5IHJldXNlIGNvZGUgd2hpY2gKK2hhbmRsZXMgLWUsIC1VIGFuZCAtdS4KKyovCisKK2VudW0geworCU9QVF9hID0gKDEgPDwgMCkgKiBFTkFCTEVfU09GVExJTUlULAorCU9QVF9jID0gKDEgPDwgMSkgKiAoRU5BQkxFX1NPRlRMSU1JVCB8fCBFTkFCTEVfQ0hQU1QpLAorCU9QVF9kID0gKDEgPDwgMikgKiAoRU5BQkxFX1NPRlRMSU1JVCB8fCBFTkFCTEVfQ0hQU1QpLAorCU9QVF9mID0gKDEgPDwgMykgKiAoRU5BQkxFX1NPRlRMSU1JVCB8fCBFTkFCTEVfQ0hQU1QpLAorCU9QVF9sID0gKDEgPDwgNCkgKiBFTkFCTEVfU09GVExJTUlULAorCU9QVF9tID0gKDEgPDwgNSkgKiAoRU5BQkxFX1NPRlRMSU1JVCB8fCBFTkFCTEVfQ0hQU1QpLAorCU9QVF9vID0gKDEgPDwgNikgKiAoRU5BQkxFX1NPRlRMSU1JVCB8fCBFTkFCTEVfQ0hQU1QpLAorCU9QVF9wID0gKDEgPDwgNykgKiAoRU5BQkxFX1NPRlRMSU1JVCB8fCBFTkFCTEVfQ0hQU1QpLAorCU9QVF9yID0gKDEgPDwgOCkgKiBFTkFCTEVfU09GVExJTUlULAorCU9QVF9zID0gKDEgPDwgOSkgKiBFTkFCTEVfU09GVExJTUlULAorCU9QVF90ID0gKDEgPDwgMTApICogRU5BQkxFX1NPRlRMSU1JVCwKKwlPUFRfdSA9ICgxIDw8IDExKSAqIChFTkFCTEVfQ0hQU1QgfHwgRU5BQkxFX1NFVFVJREdJRCksCisJT1BUX1UgPSAoMSA8PCAxMikgKiAoRU5BQkxFX0NIUFNUIHx8IEVOQUJMRV9FTlZVSURHSUQpLAorCU9QVF9lID0gKDEgPDwgMTMpICogKEVOQUJMRV9DSFBTVCB8fCBFTkFCTEVfRU5WRElSKSwKKwlPUFRfcm9vdCA9ICgxIDw8IDE0KSAqIEVOQUJMRV9DSFBTVCwKKwlPUFRfbiA9ICgxIDw8IDE1KSAqIEVOQUJMRV9DSFBTVCwKKwlPUFRfdiA9ICgxIDw8IDE2KSAqIEVOQUJMRV9DSFBTVCwKKwlPUFRfUCA9ICgxIDw8IDE3KSAqIEVOQUJMRV9DSFBTVCwKKwlPUFRfMCA9ICgxIDw8IDE4KSAqIEVOQUJMRV9DSFBTVCwKKwlPUFRfMSA9ICgxIDw8IDE5KSAqIEVOQUJMRV9DSFBTVCwKKwlPUFRfMiA9ICgxIDw8IDIwKSAqIEVOQUJMRV9DSFBTVCwKK307CisKKy8qIFRPRE86IHVzZSByZWN1cnNpdmVfYWN0aW9uPyAqLworc3RhdGljIE5PSU5MSU5FIHZvaWQgZWRpcihjb25zdCBjaGFyICpkaXJlY3RvcnlfbmFtZSkKK3sKKwlpbnQgd2RpcjsKKwlESVIgKmRpcjsKKwlzdHJ1Y3QgZGlyZW50ICpkOworCWludCBmZDsKKworCXdkaXIgPSB4b3BlbigiLiIsIE9fUkRPTkxZIHwgT19OREVMQVkpOworCXhjaGRpcihkaXJlY3RvcnlfbmFtZSk7CisJZGlyID0geG9wZW5kaXIoIi4iKTsKKwlmb3IgKDs7KSB7CisJCWNoYXIgYnVmWzI1Nl07CisJCWNoYXIgKnRhaWw7CisJCWludCBzaXplOworCisJCWVycm5vID0gMDsKKwkJZCA9IHJlYWRkaXIoZGlyKTsKKwkJaWYgKCFkKSB7CisJCQlpZiAoZXJybm8pCisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJyZWFkZGlyICVzIiwKKwkJCQkJCWRpcmVjdG9yeV9uYW1lKTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChkLT5kX25hbWVbMF0gPT0gJy4nKQorCQkJY29udGludWU7CisJCWZkID0gb3BlbihkLT5kX25hbWUsIE9fUkRPTkxZIHwgT19OREVMQVkpOworCQlpZiAoZmQgPCAwKSB7CisJCQlpZiAoKGVycm5vID09IEVJU0RJUikgJiYgZGlyZWN0b3J5X25hbWUpIHsKKwkJCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF92KQorCQkJCQliYl9wZXJyb3JfbXNnKCJ3YXJuaW5nOiAlcy8lcyBpcyBhIGRpcmVjdG9yeSIsCisJCQkJCQlkaXJlY3RvcnlfbmFtZSwgZC0+ZF9uYW1lKTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgib3BlbiAlcy8lcyIsCisJCQkJCQlkaXJlY3RvcnlfbmFtZSwgZC0+ZF9uYW1lKTsKKwkJfQorCQlzaXplID0gZnVsbF9yZWFkKGZkLCBidWYsIHNpemVvZihidWYpLTEpOworCQljbG9zZShmZCk7CisJCWlmIChzaXplIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgicmVhZCAlcy8lcyIsCisJCQkJCWRpcmVjdG9yeV9uYW1lLCBkLT5kX25hbWUpOworCQlpZiAoc2l6ZSA9PSAwKSB7CisJCQl1bnNldGVudihkLT5kX25hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJYnVmW3NpemVdID0gJ1xuJzsKKwkJdGFpbCA9IHN0cmNocihidWYsICdcbicpOworCQkvKiBza2lwIHRyYWlsaW5nIHdoaXRlc3BhY2UgKi8KKwkJd2hpbGUgKDEpIHsKKwkJCSp0YWlsID0gJ1wwJzsKKwkJCXRhaWwtLTsKKwkJCWlmICh0YWlsIDwgYnVmIHx8ICFpc3NwYWNlKCp0YWlsKSkKKwkJCQlicmVhazsKKwkJfQorCQl4c2V0ZW52KGQtPmRfbmFtZSwgYnVmKTsKKwl9CisJY2xvc2VkaXIoZGlyKTsKKwlpZiAoZmNoZGlyKHdkaXIpID09IC0xKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImZjaGRpciIpOworCWNsb3NlKHdkaXIpOworfQorCitzdGF0aWMgdm9pZCBsaW1pdChpbnQgd2hhdCwgbG9uZyBsKQoreworCXN0cnVjdCBybGltaXQgcjsKKworCS8qIE5ldmVyIGZhaWxzIHVuZGVyIExpbnV4IChleGNlcHQgaWYgeW91IHBhc3MgaXQgYmFkIGFyZ3VtZW50cykgKi8KKwlnZXRybGltaXQod2hhdCwgJnIpOworCWlmICgobCA8IDApIHx8IChsID4gci5ybGltX21heCkpCisJCXIucmxpbV9jdXIgPSByLnJsaW1fbWF4OworCWVsc2UKKwkJci5ybGltX2N1ciA9IGw7CisJaWYgKHNldHJsaW1pdCh3aGF0LCAmcikgPT0gLTEpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0cmxpbWl0Iik7Cit9CisKK2ludCBjaHBzdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgY2hwc3RfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBiYl91aWRnaWRfdCB1Z2lkOworCWNoYXIgKnNldF91c2VyID0gc2V0X3VzZXI7IC8qIGZvciBjb21waWxlciAqLworCWNoYXIgKmVudl9kaXIgPSBlbnZfZGlyOworCWNoYXIgKnJvb3Q7CisJY2hhciAqbmljZXN0cjsKKwl1bnNpZ25lZCBsaW1pdGE7CisJdW5zaWduZWQgbGltaXRjOworCXVuc2lnbmVkIGxpbWl0ZDsKKwl1bnNpZ25lZCBsaW1pdGY7CisJdW5zaWduZWQgbGltaXRsOworCXVuc2lnbmVkIGxpbWl0bTsKKwl1bnNpZ25lZCBsaW1pdG87CisJdW5zaWduZWQgbGltaXRwOworCXVuc2lnbmVkIGxpbWl0cjsKKwl1bnNpZ25lZCBsaW1pdHM7CisJdW5zaWduZWQgbGltaXR0OworCXVuc2lnbmVkIG9wdDsKKworCWlmICgoRU5BQkxFX0NIUFNUICYmIGFwcGxldF9uYW1lWzBdID09ICdjJykKKwkgfHwgKEVOQUJMRV9TT0ZUTElNSVQgJiYgYXBwbGV0X25hbWVbMV0gPT0gJ28nKQorCSkgeworCQkvLyBGSVhNRTogY2FuIHdlIGxpdmUgd2l0aCBpbnQtc2l6ZWQgbGltaXRzPworCQkvLyBjYW4gd2UgbGl2ZSB3aXRoIDQwMDAwIGRheXM/CisJCS8vIGlmIHllcyAtPiBnZXRvcHQgY29udmVydHMgc3RyaW5ncyB0byBudW1iZXJzIGZvciB1cworCQlvcHRfY29tcGxlbWVudGFyeSA9ICItMTphKzpjKzpkKzpmKzpsKzptKzpvKzpwKzpyKzpzKzp0KyI7CisJCW9wdCA9IGdldG9wdDMyKGFyZ3YsICIrYTpjOmQ6ZjpsOm06bzpwOnI6czp0OnU6VTplOiIKKwkJCUlGX0NIUFNUKCIvOm46dlAwMTIiKSwKKwkJCSZsaW1pdGEsICZsaW1pdGMsICZsaW1pdGQsICZsaW1pdGYsICZsaW1pdGwsCisJCQkmbGltaXRtLCAmbGltaXRvLCAmbGltaXRwLCAmbGltaXRyLCAmbGltaXRzLCAmbGltaXR0LAorCQkJJnNldF91c2VyLCAmc2V0X3VzZXIsICZlbnZfZGlyCisJCQlJRl9DSFBTVCgsICZyb290LCAmbmljZXN0cikpOworCQlhcmd2ICs9IG9wdGluZDsKKwkJaWYgKG9wdCAmIE9QVF9tKSB7IC8vIC1tIG1lYW5zIC1hc2xkCisJCQlsaW1pdGEgPSBsaW1pdHMgPSBsaW1pdGwgPSBsaW1pdGQgPSBsaW1pdG07CisJCQlvcHQgfD0gKE9QVF9zIHwgT1BUX2wgfCBPUFRfYSB8IE9QVF9kKTsKKwkJfQorCX0gZWxzZSB7CisJCW9wdGlvbl9tYXNrMzIgPSBvcHQgPSAwOworCQlhcmd2Kys7CisJCWlmICghKmFyZ3YpCisJCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJLy8gZW52ZGlyPworCWlmIChFTkFCTEVfRU5WRElSICYmIGFwcGxldF9uYW1lWzNdID09ICdkJykgeworCQllbnZfZGlyID0gKmFyZ3YrKzsKKwkJb3B0IHw9IE9QVF9lOworCX0KKworCS8vIHNldHVpZGdpZD8KKwlpZiAoRU5BQkxFX1NFVFVJREdJRCAmJiBhcHBsZXRfbmFtZVsxXSA9PSAnZScpIHsKKwkJc2V0X3VzZXIgPSAqYXJndisrOworCQlvcHQgfD0gT1BUX3U7CisJfQorCisJLy8gZW52dWlkZ2lkPworCWlmIChFTkFCTEVfRU5WVUlER0lEICYmIGFwcGxldF9uYW1lWzBdID09ICdlJyAmJiBhcHBsZXRfbmFtZVszXSA9PSAndScpIHsKKwkJc2V0X3VzZXIgPSAqYXJndisrOworCQlvcHQgfD0gT1BUX1U7CisJfQorCisJLy8gd2UgbXVzdCBoYXZlIFBST0cgW0FSR1NdCisJaWYgKCEqYXJndikKKwkJYmJfc2hvd191c2FnZSgpOworCisJLy8gc2V0IGxpbWl0cworCWlmIChvcHQgJiBPUFRfZCkgeworI2lmZGVmIFJMSU1JVF9EQVRBCisJCWxpbWl0KFJMSU1JVF9EQVRBLCBsaW1pdGQpOworI2Vsc2UKKwkJaWYgKG9wdCAmIE9QVF92KQorCQkJYmJfZXJyb3JfbXNnKCJzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSTElNSVRfJXMiLAorCQkJCSJEQVRBIik7CisjZW5kaWYKKwl9CisJaWYgKG9wdCAmIE9QVF9zKSB7CisjaWZkZWYgUkxJTUlUX1NUQUNLCisJCWxpbWl0KFJMSU1JVF9TVEFDSywgbGltaXRzKTsKKyNlbHNlCisJCWlmIChvcHQgJiBPUFRfdikKKwkJCWJiX2Vycm9yX21zZygic3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgUkxJTUlUXyVzIiwKKwkJCQkiU1RBQ0siKTsKKyNlbmRpZgorCX0KKwlpZiAob3B0ICYgT1BUX2wpIHsKKyNpZmRlZiBSTElNSVRfTUVNTE9DSworCQlsaW1pdChSTElNSVRfTUVNTE9DSywgbGltaXRsKTsKKyNlbHNlCisJCWlmIChvcHQgJiBPUFRfdikKKwkJCWJiX2Vycm9yX21zZygic3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgUkxJTUlUXyVzIiwKKwkJCQkiTUVNTE9DSyIpOworI2VuZGlmCisJfQorCWlmIChvcHQgJiBPUFRfYSkgeworI2lmZGVmIFJMSU1JVF9WTUVNCisJCWxpbWl0KFJMSU1JVF9WTUVNLCBsaW1pdGEpOworI2Vsc2UKKyNpZmRlZiBSTElNSVRfQVMKKwkJbGltaXQoUkxJTUlUX0FTLCBsaW1pdGEpOworI2Vsc2UKKwkJaWYgKG9wdCAmIE9QVF92KQorCQkJYmJfZXJyb3JfbXNnKCJzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSTElNSVRfJXMiLAorCQkJCSJWTUVNIik7CisjZW5kaWYKKyNlbmRpZgorCX0KKwlpZiAob3B0ICYgT1BUX28pIHsKKyNpZmRlZiBSTElNSVRfTk9GSUxFCisJCWxpbWl0KFJMSU1JVF9OT0ZJTEUsIGxpbWl0byk7CisjZWxzZQorI2lmZGVmIFJMSU1JVF9PRklMRQorCQlsaW1pdChSTElNSVRfT0ZJTEUsIGxpbWl0byk7CisjZWxzZQorCQlpZiAob3B0ICYgT1BUX3YpCisJCQliYl9lcnJvcl9tc2coInN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IFJMSU1JVF8lcyIsCisJCQkJIk5PRklMRSIpOworI2VuZGlmCisjZW5kaWYKKwl9CisJaWYgKG9wdCAmIE9QVF9wKSB7CisjaWZkZWYgUkxJTUlUX05QUk9DCisJCWxpbWl0KFJMSU1JVF9OUFJPQywgbGltaXRwKTsKKyNlbHNlCisJCWlmIChvcHQgJiBPUFRfdikKKwkJCWJiX2Vycm9yX21zZygic3lzdGVtIGRvZXMgbm90IHN1cHBvcnQgUkxJTUlUXyVzIiwKKwkJCQkiTlBST0MiKTsKKyNlbmRpZgorCX0KKwlpZiAob3B0ICYgT1BUX2YpIHsKKyNpZmRlZiBSTElNSVRfRlNJWkUKKwkJbGltaXQoUkxJTUlUX0ZTSVpFLCBsaW1pdGYpOworI2Vsc2UKKwkJaWYgKG9wdCAmIE9QVF92KQorCQkJYmJfZXJyb3JfbXNnKCJzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSTElNSVRfJXMiLAorCQkJCSJGU0laRSIpOworI2VuZGlmCisJfQorCWlmIChvcHQgJiBPUFRfYykgeworI2lmZGVmIFJMSU1JVF9DT1JFCisJCWxpbWl0KFJMSU1JVF9DT1JFLCBsaW1pdGMpOworI2Vsc2UKKwkJaWYgKG9wdCAmIE9QVF92KQorCQkJYmJfZXJyb3JfbXNnKCJzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSTElNSVRfJXMiLAorCQkJCSJDT1JFIik7CisjZW5kaWYKKwl9CisJaWYgKG9wdCAmIE9QVF9yKSB7CisjaWZkZWYgUkxJTUlUX1JTUworCQlsaW1pdChSTElNSVRfUlNTLCBsaW1pdHIpOworI2Vsc2UKKwkJaWYgKG9wdCAmIE9QVF92KQorCQkJYmJfZXJyb3JfbXNnKCJzeXN0ZW0gZG9lcyBub3Qgc3VwcG9ydCBSTElNSVRfJXMiLAorCQkJCSJSU1MiKTsKKyNlbmRpZgorCX0KKwlpZiAob3B0ICYgT1BUX3QpIHsKKyNpZmRlZiBSTElNSVRfQ1BVCisJCWxpbWl0KFJMSU1JVF9DUFUsIGxpbWl0dCk7CisjZWxzZQorCQlpZiAob3B0ICYgT1BUX3YpCisJCQliYl9lcnJvcl9tc2coInN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IFJMSU1JVF8lcyIsCisJCQkJIkNQVSIpOworI2VuZGlmCisJfQorCisJaWYgKG9wdCAmIE9QVF9QKQorCQlzZXRzaWQoKTsKKworCWlmIChvcHQgJiBPUFRfZSkKKwkJZWRpcihlbnZfZGlyKTsKKworCWlmIChvcHQgJiAoT1BUX3V8T1BUX1UpKQorCQl4Z2V0X3VpZGdpZCgmdWdpZCwgc2V0X3VzZXIpOworCisJLy8gY2hyb290ZWQgamFpbCBtdXN0IGhhdmUgL2V0Yy9wYXNzd2QgaWYgd2UgbW92ZSB0aGlzIGFmdGVyIGNocm9vdC4KKwkvLyBPVE9IIGNocm9vdCBmYWlscyBmb3Igbm9uLXJvb3RzLgorCS8vIFNvbHV0aW9uOiBjYWNoZSB1aWQvZ2lkIGJlZm9yZSBjaHJvb3QsIGFwcGx5IHVpZC9naWQgYWZ0ZXIuCisJaWYgKG9wdCAmIE9QVF9VKSB7CisJCXhzZXRlbnYoIkdJRCIsIHV0b2EodWdpZC5naWQpKTsKKwkJeHNldGVudigiVUlEIiwgdXRvYSh1Z2lkLnVpZCkpOworCX0KKworCWlmIChvcHQgJiBPUFRfcm9vdCkgeworCQl4Y2hyb290KHJvb3QpOworCX0KKworCWlmIChvcHQgJiBPUFRfdSkgeworCQlpZiAoc2V0Z3JvdXBzKDEsICZ1Z2lkLmdpZCkgPT0gLTEpCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNldGdyb3VwcyIpOworCQl4c2V0Z2lkKHVnaWQuZ2lkKTsKKwkJeHNldHVpZCh1Z2lkLnVpZCk7CisJfQorCisJaWYgKG9wdCAmIE9QVF9uKSB7CisJCWVycm5vID0gMDsKKwkJaWYgKG5pY2UoeGF0b2kobmljZXN0cikpID09IC0xKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJuaWNlIik7CisJfQorCisJaWYgKG9wdCAmIE9QVF8wKQorCQljbG9zZShTVERJTl9GSUxFTk8pOworCWlmIChvcHQgJiBPUFRfMSkKKwkJY2xvc2UoU1RET1VUX0ZJTEVOTyk7CisJaWYgKG9wdCAmIE9QVF8yKQorCQljbG9zZShTVERFUlJfRklMRU5PKTsKKworCUJCX0VYRUNWUF9vcl9kaWUoYXJndik7Cit9CmRpZmYgLS1naXQgYS9ydW5pdC9ydW5pdF9saWIuaCBiL3J1bml0L3J1bml0X2xpYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNmVhNGMKLS0tIC9kZXYvbnVsbAorKysgYi9ydW5pdC9ydW5pdF9saWIuaApAQCAtMCwwICsxLDQ2IEBACisvKgorQ29weXJpZ2h0IChjKSAyMDAxLTIwMDYsIEdlcnJpdCBQYXBlCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECitXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8KK0VWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKK1BST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCitXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworLyoKKyAqIHJ1bnN2IC8gc3VwZXJ2aXNlIC8gc3Ygc3R1ZmYKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc3ZzdGF0dXNfdCB7CisJdWludDY0X3QgdGltZV9iZTY0IFBBQ0tFRDsKKwl1aW50MzJfdCB0aW1lX25zZWNfYmUzMiBQQUNLRUQ7CisJdWludDMyX3QgcGlkX2xlMzIgUEFDS0VEOworCXVpbnQ4X3QgIHBhdXNlZDsKKwl1aW50OF90ICB3YW50OyAvKiAndScgb3IgJ2QnICovCisJdWludDhfdCAgZ290X3Rlcm07CisJdWludDhfdCAgcnVuX29yX2ZpbmlzaDsKK30gc3ZzdGF0dXNfdDsKK3N0cnVjdCBFUlJfc3ZzdGF0dXNfbXVzdF9iZV8yMF9ieXRlcyB7CisJY2hhciBFUlJfc3ZzdGF0dXNfbXVzdF9iZV8yMF9ieXRlc1tzaXplb2Yoc3ZzdGF0dXNfdCkgPT0gMjAgPyAxIDogLTFdOworfTsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKZGlmZiAtLWdpdCBhL3J1bml0L3J1bnN2LmMgYi9ydW5pdC9ydW5zdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZDI4NjAKLS0tIC9kZXYvbnVsbAorKysgYi9ydW5pdC9ydW5zdi5jCkBAIC0wLDAgKzEsNjcwIEBACisvKgorQ29weXJpZ2h0IChjKSAyMDAxLTIwMDYsIEdlcnJpdCBQYXBlCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECitXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8KK0VWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKK1BST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCitXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisvKiBCdXN5Ym94ZWQgYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4gKi8KKy8qIFRPRE86IGRlcGVuZHMgb24gcnVuaXRfbGliLmMgLSByZXZpZXcgYW5kIHJlZHVjZS9lbGltaW5hdGUgKi8KKworLy91c2FnZTojZGVmaW5lIHJ1bnN2X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJESVIiCisvL3VzYWdlOiNkZWZpbmUgcnVuc3ZfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTdGFydCBhbmQgbW9uaXRvciBhIHNlcnZpY2UgYW5kIG9wdGlvbmFsbHkgYW4gYXBwZW5kYW50IGxvZyBzZXJ2aWNlIgorCisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInJ1bml0X2xpYi5oIgorCisjaWYgRU5BQkxFX01PTk9UT05JQ19TWVNDQUxMCisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKworLyogbGliYyBoYXMgaW5jcmVkaWJseSBtZXNzeSB3YXkgb2YgZG9pbmcgdGhpcywKKyAqIHR5cGljYWxseSByZXF1aXJpbmcgLWxydC4gV2UganVzdCBza2lwIGFsbCB0aGlzIG1lc3MgKi8KK3N0YXRpYyB2b2lkIGdldHRpbWVvZmRheV9ucyhzdHJ1Y3QgdGltZXNwZWMgKnRzKQoreworCXN5c2NhbGwoX19OUl9jbG9ja19nZXR0aW1lLCBDTE9DS19SRUFMVElNRSwgdHMpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIGdldHRpbWVvZmRheV9ucyhzdHJ1Y3QgdGltZXNwZWMgKnRzKQoreworCWlmIChzaXplb2Yoc3RydWN0IHRpbWV2YWwpID09IHNpemVvZihzdHJ1Y3QgdGltZXNwZWMpCisJICYmIHNpemVvZigoKHN0cnVjdCB0aW1ldmFsKil0cyktPnR2X3VzZWMpID09IHNpemVvZih0cy0+dHZfbnNlYykKKwkpIHsKKwkJLyogQ2hlYXQgKi8KKwkJZ2V0dGltZW9mZGF5KCh2b2lkKil0cywgTlVMTCk7CisJCXRzLT50dl9uc2VjICo9IDEwMDA7CisJfSBlbHNlIHsKKwkJZXh0ZXJuIHZvaWQgQlVHX25lZWRfdG9faW1wbGVtZW50X2dldHRpbWVvZmRheV9ucyh2b2lkKTsKKwkJQlVHX25lZWRfdG9faW1wbGVtZW50X2dldHRpbWVvZmRheV9ucygpOworCX0KK30KKyNlbmRpZgorCisvKiBDb21wYXJlIHBvc3NpYmx5IG92ZXJmbG93aW5nIHVuc2lnbmVkIGNvdW50ZXJzICovCisjZGVmaW5lIExFU1MoYSxiKSAoKGludCkoKHVuc2lnbmVkKShiKSAtICh1bnNpZ25lZCkoYSkpID4gMCkKKworLyogc3RhdGUgKi8KKyNkZWZpbmUgU19ET1dOIDAKKyNkZWZpbmUgU19SVU4gMQorI2RlZmluZSBTX0ZJTklTSCAyCisvKiBjdHJsICovCisjZGVmaW5lIENfTk9PUCAwCisjZGVmaW5lIENfVEVSTSAxCisjZGVmaW5lIENfUEFVU0UgMgorLyogd2FudCAqLworI2RlZmluZSBXX1VQIDAKKyNkZWZpbmUgV19ET1dOIDEKKyNkZWZpbmUgV19FWElUIDIKKworc3RydWN0IHN2ZGlyIHsKKwlpbnQgcGlkOworCXNtYWxsaW50IHN0YXRlOworCXNtYWxsaW50IGN0cmw7CisJc21hbGxpbnQgc2Rfd2FudDsKKwlzbWFsbGludCBpc2xvZzsKKwlzdHJ1Y3QgdGltZXNwZWMgc3RhcnQ7CisJaW50IGZkbG9jazsKKwlpbnQgZmRjb250cm9sOworCWludCBmZGNvbnRyb2x3cml0ZTsKKwlpbnQgd3N0YXQ7Cit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJc21hbGxpbnQgaGFzbG9nOworCXNtYWxsaW50IHNpZ3Rlcm07CisJc21hbGxpbnQgcGlkY2hhbmdlZDsKKwlzdHJ1Y3QgZmRfcGFpciBzZWxmcGlwZTsKKwlzdHJ1Y3QgZmRfcGFpciBsb2dwaXBlOworCWNoYXIgKmRpcjsKKwlzdHJ1Y3Qgc3ZkaXIgc3ZkWzJdOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgaGFzbG9nICAgICAgIChHLmhhc2xvZyAgICAgICkKKyNkZWZpbmUgc2lndGVybSAgICAgIChHLnNpZ3Rlcm0gICAgICkKKyNkZWZpbmUgcGlkY2hhbmdlZCAgIChHLnBpZGNoYW5nZWQgICkKKyNkZWZpbmUgc2VsZnBpcGUgICAgIChHLnNlbGZwaXBlICAgICkKKyNkZWZpbmUgbG9ncGlwZSAgICAgIChHLmxvZ3BpcGUgICAgICkKKyNkZWZpbmUgZGlyICAgICAgICAgIChHLmRpciAgICAgICAgICkKKyNkZWZpbmUgc3ZkICAgICAgICAgIChHLnN2ZCAgICAgICAgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJcGlkY2hhbmdlZCA9IDE7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIGZhdGFsMl9jYW5ub3QoY29uc3QgY2hhciAqbTEsIGNvbnN0IGNoYXIgKm0yKQoreworCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiJXM6IGZhdGFsOiBjYW4ndCAlcyVzIiwgZGlyLCBtMSwgbTIpOworCS8qIHdhcyBleGl0aW5nIDExMSAqLworfQorc3RhdGljIHZvaWQgZmF0YWxfY2Fubm90KGNvbnN0IGNoYXIgKm0pCit7CisJZmF0YWwyX2Nhbm5vdChtLCAiIik7CisJLyogd2FzIGV4aXRpbmcgMTExICovCit9CitzdGF0aWMgdm9pZCBmYXRhbDJ4X2Nhbm5vdChjb25zdCBjaGFyICptMSwgY29uc3QgY2hhciAqbTIpCit7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiBmYXRhbDogY2FuJ3QgJXMlcyIsIGRpciwgbTEsIG0yKTsKKwkvKiB3YXMgZXhpdGluZyAxMTEgKi8KK30KK3N0YXRpYyB2b2lkIHdhcm5fY2Fubm90KGNvbnN0IGNoYXIgKm0pCit7CisJYmJfcGVycm9yX21zZygiJXM6IHdhcm5pbmc6IGNhbm5vdCAlcyIsIGRpciwgbSk7Cit9CisKK3N0YXRpYyB2b2lkIHNfY2hpbGQoaW50IHNpZ19ubyBVTlVTRURfUEFSQU0pCit7CisJd3JpdGUoc2VsZnBpcGUud3IsICIiLCAxKTsKK30KKworc3RhdGljIHZvaWQgc190ZXJtKGludCBzaWdfbm8gVU5VU0VEX1BBUkFNKQoreworCXNpZ3Rlcm0gPSAxOworCXdyaXRlKHNlbGZwaXBlLndyLCAiIiwgMSk7IC8qIFhYWCAqLworfQorCitzdGF0aWMgaW50IG9wZW5fdHJ1bmNfb3Jfd2Fybihjb25zdCBjaGFyICpuYW1lKQoreworCS8qIFdoeSBPX05ERUxBWT8gKi8KKwlpbnQgZmQgPSBvcGVuKG5hbWUsIE9fV1JPTkxZIHwgT19OREVMQVkgfCBPX1RSVU5DIHwgT19DUkVBVCwgMDY0NCk7CisJaWYgKGZkIDwgMCkKKwkJYmJfcGVycm9yX21zZygiJXM6IHdhcm5pbmc6IGNhbm5vdCBvcGVuICVzIiwKKwkJCQlkaXIsIG5hbWUpOworCXJldHVybiBmZDsKK30KKworc3RhdGljIHZvaWQgdXBkYXRlX3N0YXR1cyhzdHJ1Y3Qgc3ZkaXIgKnMpCit7CisJc3NpemVfdCBzejsKKwlpbnQgZmQ7CisJc3ZzdGF0dXNfdCBzdGF0dXM7CisKKwkvKiBwaWQgKi8KKwlpZiAocGlkY2hhbmdlZCkgeworCQlmZCA9IG9wZW5fdHJ1bmNfb3Jfd2Fybigic3VwZXJ2aXNlL3BpZC5uZXciKTsKKwkJaWYgKGZkIDwgMCkKKwkJCXJldHVybjsKKwkJaWYgKHMtPnBpZCkgeworCQkJY2hhciBzcGlkW3NpemVvZihpbnQpKjMgKyAyXTsKKwkJCWludCBzaXplID0gc3ByaW50ZihzcGlkLCAiJXVcbiIsICh1bnNpZ25lZClzLT5waWQpOworCQkJd3JpdGUoZmQsIHNwaWQsIHNpemUpOworCQl9CisJCWNsb3NlKGZkKTsKKwkJaWYgKHJlbmFtZV9vcl93YXJuKCJzdXBlcnZpc2UvcGlkLm5ldyIsCisJCQkJcy0+aXNsb2cgPyAibG9nL3N1cGVydmlzZS9waWQiIDogImxvZy9zdXBlcnZpc2UvcGlkIis0KSkKKwkJCXJldHVybjsKKwkJcGlkY2hhbmdlZCA9IDA7CisJfQorCisJLyogc3RhdCAqLworCWZkID0gb3Blbl90cnVuY19vcl93YXJuKCJzdXBlcnZpc2Uvc3RhdC5uZXciKTsKKwlpZiAoZmQgPCAtMSkKKwkJcmV0dXJuOworCisJeworCQljaGFyIHN0YXRfYnVmW3NpemVvZigiZmluaXNoLCBwYXVzZWQsIGdvdCBURVJNLCB3YW50IGRvd25cbiIpXTsKKwkJY2hhciAqcCA9IHN0YXRfYnVmOworCQlzd2l0Y2ggKHMtPnN0YXRlKSB7CisJCWNhc2UgU19ET1dOOgorCQkJcCA9IHN0cGNweShwLCAiZG93biIpOworCQkJYnJlYWs7CisJCWNhc2UgU19SVU46CisJCQlwID0gc3RwY3B5KHAsICJydW4iKTsKKwkJCWJyZWFrOworCQljYXNlIFNfRklOSVNIOgorCQkJcCA9IHN0cGNweShwLCAiZmluaXNoIik7CisJCQlicmVhazsKKwkJfQorCQlpZiAocy0+Y3RybCAmIENfUEFVU0UpCisJCQlwID0gc3RwY3B5KHAsICIsIHBhdXNlZCIpOworCQlpZiAocy0+Y3RybCAmIENfVEVSTSkKKwkJCXAgPSBzdHBjcHkocCwgIiwgZ290IFRFUk0iKTsKKwkJaWYgKHMtPnN0YXRlICE9IFNfRE9XTikKKwkJCXN3aXRjaCAocy0+c2Rfd2FudCkgeworCQkJY2FzZSBXX0RPV046CisJCQkJcCA9IHN0cGNweShwLCAiLCB3YW50IGRvd24iKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgV19FWElUOgorCQkJCXAgPSBzdHBjcHkocCwgIiwgd2FudCBleGl0Iik7CisJCQkJYnJlYWs7CisJCQl9CisJCSpwKysgPSAnXG4nOworCQl3cml0ZShmZCwgc3RhdF9idWYsIHAgLSBzdGF0X2J1Zik7CisJCWNsb3NlKGZkKTsKKwl9CisKKwlyZW5hbWVfb3Jfd2Fybigic3VwZXJ2aXNlL3N0YXQubmV3IiwKKwkJcy0+aXNsb2cgPyAibG9nL3N1cGVydmlzZS9zdGF0IiA6ICJsb2cvc3VwZXJ2aXNlL3N0YXQiKzQpOworCisJLyogc3VwZXJ2aXNlIGNvbXBhdGliaWxpdHkgKi8KKwltZW1zZXQoJnN0YXR1cywgMCwgc2l6ZW9mKHN0YXR1cykpOworCXN0YXR1cy50aW1lX2JlNjQgPSBTV0FQX0JFNjQocy0+c3RhcnQudHZfc2VjICsgMHg0MDAwMDAwMDAwMDAwMDBhVUxMKTsKKwlzdGF0dXMudGltZV9uc2VjX2JlMzIgPSBTV0FQX0JFMzIocy0+c3RhcnQudHZfbnNlYyk7CisJc3RhdHVzLnBpZF9sZTMyID0gU1dBUF9MRTMyKHMtPnBpZCk7CisJaWYgKHMtPmN0cmwgJiBDX1BBVVNFKQorCQlzdGF0dXMucGF1c2VkID0gMTsKKwlpZiAocy0+c2Rfd2FudCA9PSBXX1VQKQorCQlzdGF0dXMud2FudCA9ICd1JzsKKwllbHNlCisJCXN0YXR1cy53YW50ID0gJ2QnOworCWlmIChzLT5jdHJsICYgQ19URVJNKQorCQlzdGF0dXMuZ290X3Rlcm0gPSAxOworCXN0YXR1cy5ydW5fb3JfZmluaXNoID0gcy0+c3RhdGU7CisJZmQgPSBvcGVuX3RydW5jX29yX3dhcm4oInN1cGVydmlzZS9zdGF0dXMubmV3Iik7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuOworCXN6ID0gd3JpdGUoZmQsICZzdGF0dXMsIHNpemVvZihzdGF0dXMpKTsKKwljbG9zZShmZCk7CisJaWYgKHN6ICE9IHNpemVvZihzdGF0dXMpKSB7CisJCXdhcm5fY2Fubm90KCJ3cml0ZSBzdXBlcnZpc2Uvc3RhdHVzLm5ldyIpOworCQl1bmxpbmsoInN1cGVydmlzZS9zdGF0dXMubmV3Iik7CisJCXJldHVybjsKKwl9CisJcmVuYW1lX29yX3dhcm4oInN1cGVydmlzZS9zdGF0dXMubmV3IiwKKwkJcy0+aXNsb2cgPyAibG9nL3N1cGVydmlzZS9zdGF0dXMiIDogImxvZy9zdXBlcnZpc2Uvc3RhdHVzIis0KTsKK30KKworc3RhdGljIHVuc2lnbmVkIGN1c3RvbShzdHJ1Y3Qgc3ZkaXIgKnMsIGNoYXIgYykKK3sKKwlwaWRfdCBwaWQ7CisJaW50IHc7CisJY2hhciBhWzEwXTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChzLT5pc2xvZykKKwkJcmV0dXJuIDA7CisJc3RyY3B5KGEsICJjb250cm9sLz8iKTsKKwlhWzhdID0gYzsgLyogcmVwbGFjZSAnPycgKi8KKwlpZiAoc3RhdChhLCAmc3QpID09IDApIHsKKwkJaWYgKHN0LnN0X21vZGUgJiBTX0lYVVNSKSB7CisJCQlwaWQgPSB2Zm9yaygpOworCQkJaWYgKHBpZCA9PSAtMSkgeworCQkJCXdhcm5fY2Fubm90KCJ2Zm9yayBmb3IgY29udHJvbC8/Iik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlpZiAocGlkID09IDApIHsKKwkJCQkvKiBjaGlsZCAqLworCQkJCWlmIChoYXNsb2cgJiYgZHVwMihsb2dwaXBlLndyLCAxKSA9PSAtMSkKKwkJCQkJd2Fybl9jYW5ub3QoInNldHVwIHN0ZG91dCBmb3IgY29udHJvbC8/Iik7CisJCQkJZXhlY2woYSwgYSwgKGNoYXIgKikgTlVMTCk7CisJCQkJZmF0YWxfY2Fubm90KCJydW4gY29udHJvbC8/Iik7CisJCQl9CisJCQkvKiBwYXJlbnQgKi8KKwkJCWlmIChzYWZlX3dhaXRwaWQocGlkLCAmdywgMCkgPT0gLTEpIHsKKwkJCQl3YXJuX2Nhbm5vdCgid2FpdCBmb3IgY2hpbGQgY29udHJvbC8/Iik7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCQlyZXR1cm4gV0VYSVRTVEFUVVModykgPT0gMDsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpCisJCQl3YXJuX2Nhbm5vdCgic3RhdCBjb250cm9sLz8iKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHN0b3BzZXJ2aWNlKHN0cnVjdCBzdmRpciAqcykKK3sKKwlpZiAocy0+cGlkICYmICFjdXN0b20ocywgJ3QnKSkgeworCQlraWxsKHMtPnBpZCwgU0lHVEVSTSk7CisJCXMtPmN0cmwgfD0gQ19URVJNOworCQl1cGRhdGVfc3RhdHVzKHMpOworCX0KKwlpZiAocy0+c2Rfd2FudCA9PSBXX0RPV04pIHsKKwkJa2lsbChzLT5waWQsIFNJR0NPTlQpOworCQljdXN0b20ocywgJ2QnKTsKKwkJcmV0dXJuOworCX0KKwlpZiAocy0+c2Rfd2FudCA9PSBXX0VYSVQpIHsKKwkJa2lsbChzLT5waWQsIFNJR0NPTlQpOworCQljdXN0b20ocywgJ3gnKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHN0YXJ0c2VydmljZShzdHJ1Y3Qgc3ZkaXIgKnMpCit7CisJaW50IHA7CisJY29uc3QgY2hhciAqYXJnWzRdOworCWNoYXIgZXhpdGNvZGVbc2l6ZW9mKGludCkqMyArIDJdOworCisJaWYgKHMtPnN0YXRlID09IFNfRklOSVNIKSB7CisvKiBUd28gYXJndW1lbnRzIGFyZSBnaXZlbiB0byAuL2ZpbmlzaC4gVGhlIGZpcnN0IG9uZSBpcyAuL3J1biBleGl0IGNvZGUsCisgKiBvciAtMSBpZiAuL3J1biBkaWRudCBleGl0IG5vcm1hbGx5LiBUaGUgc2Vjb25kIG9uZSBpcworICogdGhlIGxlYXN0IHNpZ25pZmljYW50IGJ5dGUgb2YgdGhlIGV4aXQgc3RhdHVzIGFzIGRldGVybWluZWQgYnkgd2FpdHBpZDsKKyAqIGZvciBpbnN0YW5jZSBpdCBpcyAwIGlmIC4vcnVuIGV4aXRlZCBub3JtYWxseSwgYW5kIHRoZSBzaWduYWwgbnVtYmVyCisgKiBpZiAuL3J1biB3YXMgdGVybWluYXRlZCBieSBhIHNpZ25hbC4gSWYgcnVuc3YgY2Fubm90IHN0YXJ0IC4vcnVuCisgKiBmb3Igc29tZSByZWFzb24sIHRoZSBleGl0IGNvZGUgaXMgMTExIGFuZCB0aGUgc3RhdHVzIGlzIDAuCisgKi8KKwkJYXJnWzBdID0gIi4vZmluaXNoIjsKKwkJYXJnWzFdID0gIi0xIjsKKwkJaWYgKFdJRkVYSVRFRChzLT53c3RhdCkpIHsKKwkJCSp1dG9hX3RvX2J1ZihXRVhJVFNUQVRVUyhzLT53c3RhdCksIGV4aXRjb2RlLCBzaXplb2YoZXhpdGNvZGUpKSA9ICdcMCc7CisJCQlhcmdbMV0gPSBleGl0Y29kZTsKKwkJfQorCQkvL2FyZ1syXSA9ICIwIjsKKwkJLy9pZiAoV0lGU0lHTkFMRUQocy0+d3N0YXQpKSB7CisJCQlhcmdbMl0gPSB1dG9hKFdURVJNU0lHKHMtPndzdGF0KSk7CisJCS8vfQorCQlhcmdbM10gPSBOVUxMOworCX0gZWxzZSB7CisJCWFyZ1swXSA9ICIuL3J1biI7CisJCWFyZ1sxXSA9IE5VTEw7CisJCWN1c3RvbShzLCAndScpOworCX0KKworCWlmIChzLT5waWQgIT0gMCkKKwkJc3RvcHNlcnZpY2Uocyk7IC8qIHNob3VsZCBuZXZlciBoYXBwZW4gKi8KKwl3aGlsZSAoKHAgPSB2Zm9yaygpKSA9PSAtMSkgeworCQl3YXJuX2Nhbm5vdCgidmZvcmssIHNsZWVwaW5nIik7CisJCXNsZWVwKDUpOworCX0KKwlpZiAocCA9PSAwKSB7CisJCS8qIGNoaWxkICovCisJCWlmIChoYXNsb2cpIHsKKwkJCS8qIE5COiBidWcgYWxlcnQhIHJpZ2h0IG9yZGVyIGlzIGNsb3NlLCB0aGVuIGR1cDIgKi8KKwkJCWlmIChzLT5pc2xvZykgeworCQkJCXhjaGRpcigiLi9sb2ciKTsKKwkJCQljbG9zZShsb2dwaXBlLndyKTsKKwkJCQl4ZHVwMihsb2dwaXBlLnJkLCAwKTsKKwkJCX0gZWxzZSB7CisJCQkJY2xvc2UobG9ncGlwZS5yZCk7CisJCQkJeGR1cDIobG9ncGlwZS53ciwgMSk7CisJCQl9CisJCX0KKwkJLyogTm9uLWlnbm9yZWQgc2lnbmFscyByZXZlcnQgdG8gU0lHX0RGTCBvbiBleGVjIGFueXdheSAqLworCQkvKmJiX3NpZ25hbHMoMAorCQkJKyAoMSA8PCBTSUdDSExEKQorCQkJKyAoMSA8PCBTSUdURVJNKQorCQkJLCBTSUdfREZMKTsqLworCQlzaWdfdW5ibG9jayhTSUdDSExEKTsKKwkJc2lnX3VuYmxvY2soU0lHVEVSTSk7CisJCWV4ZWN2KGFyZ1swXSwgKGNoYXIqKikgYXJnKTsKKwkJZmF0YWwyX2Nhbm5vdChzLT5pc2xvZyA/ICJzdGFydCBsb2cvIiA6ICJzdGFydCAiLCBhcmdbMF0pOworCX0KKwkvKiBwYXJlbnQgKi8KKwlpZiAocy0+c3RhdGUgIT0gU19GSU5JU0gpIHsKKwkJZ2V0dGltZW9mZGF5X25zKCZzLT5zdGFydCk7CisJCXMtPnN0YXRlID0gU19SVU47CisJfQorCXMtPnBpZCA9IHA7CisJcGlkY2hhbmdlZCA9IDE7CisJcy0+Y3RybCA9IENfTk9PUDsKKwl1cGRhdGVfc3RhdHVzKHMpOworfQorCitzdGF0aWMgaW50IGN0cmwoc3RydWN0IHN2ZGlyICpzLCBjaGFyIGMpCit7CisJaW50IHNpZzsKKworCXN3aXRjaCAoYykgeworCWNhc2UgJ2QnOiAvKiBkb3duICovCisJCXMtPnNkX3dhbnQgPSBXX0RPV047CisJCXVwZGF0ZV9zdGF0dXMocyk7CisJCWlmIChzLT5waWQgJiYgcy0+c3RhdGUgIT0gU19GSU5JU0gpCisJCQlzdG9wc2VydmljZShzKTsKKwkJYnJlYWs7CisJY2FzZSAndSc6IC8qIHVwICovCisJCXMtPnNkX3dhbnQgPSBXX1VQOworCQl1cGRhdGVfc3RhdHVzKHMpOworCQlpZiAocy0+cGlkID09IDApCisJCQlzdGFydHNlcnZpY2Uocyk7CisJCWJyZWFrOworCWNhc2UgJ3gnOiAvKiBleGl0ICovCisJCWlmIChzLT5pc2xvZykKKwkJCWJyZWFrOworCQlzLT5zZF93YW50ID0gV19FWElUOworCQl1cGRhdGVfc3RhdHVzKHMpOworCQkvKiBGQUxMVEhST1VHSCAqLworCWNhc2UgJ3QnOiAvKiBzaWcgdGVybSAqLworCQlpZiAocy0+cGlkICYmIHMtPnN0YXRlICE9IFNfRklOSVNIKQorCQkJc3RvcHNlcnZpY2Uocyk7CisJCWJyZWFrOworCWNhc2UgJ2snOiAvKiBzaWcga2lsbCAqLworCQlpZiAocy0+cGlkICYmICFjdXN0b20ocywgYykpCisJCQlraWxsKHMtPnBpZCwgU0lHS0lMTCk7CisJCXMtPnN0YXRlID0gU19ET1dOOworCQlicmVhazsKKwljYXNlICdwJzogLyogc2lnIHBhdXNlICovCisJCWlmIChzLT5waWQgJiYgIWN1c3RvbShzLCBjKSkKKwkJCWtpbGwocy0+cGlkLCBTSUdTVE9QKTsKKwkJcy0+Y3RybCB8PSBDX1BBVVNFOworCQl1cGRhdGVfc3RhdHVzKHMpOworCQlicmVhazsKKwljYXNlICdjJzogLyogc2lnIGNvbnQgKi8KKwkJaWYgKHMtPnBpZCAmJiAhY3VzdG9tKHMsIGMpKQorCQkJa2lsbChzLT5waWQsIFNJR0NPTlQpOworCQlzLT5jdHJsICY9IH5DX1BBVVNFOworCQl1cGRhdGVfc3RhdHVzKHMpOworCQlicmVhazsKKwljYXNlICdvJzogLyogb25jZSAqLworCQlzLT5zZF93YW50ID0gV19ET1dOOworCQl1cGRhdGVfc3RhdHVzKHMpOworCQlpZiAoIXMtPnBpZCkKKwkJCXN0YXJ0c2VydmljZShzKTsKKwkJYnJlYWs7CisJY2FzZSAnYSc6IC8qIHNpZyBhbGFybSAqLworCQlzaWcgPSBTSUdBTFJNOworCQlnb3RvIHNlbmRzaWc7CisJY2FzZSAnaCc6IC8qIHNpZyBodXAgKi8KKwkJc2lnID0gU0lHSFVQOworCQlnb3RvIHNlbmRzaWc7CisJY2FzZSAnaSc6IC8qIHNpZyBpbnQgKi8KKwkJc2lnID0gU0lHSU5UOworCQlnb3RvIHNlbmRzaWc7CisJY2FzZSAncSc6IC8qIHNpZyBxdWl0ICovCisJCXNpZyA9IFNJR1FVSVQ7CisJCWdvdG8gc2VuZHNpZzsKKwljYXNlICcxJzogLyogc2lnIHVzcjEgKi8KKwkJc2lnID0gU0lHVVNSMTsKKwkJZ290byBzZW5kc2lnOworCWNhc2UgJzInOiAvKiBzaWcgdXNyMiAqLworCQlzaWcgPSBTSUdVU1IyOworCQlnb3RvIHNlbmRzaWc7CisJfQorCXJldHVybiAxOworIHNlbmRzaWc6CisJaWYgKHMtPnBpZCAmJiAhY3VzdG9tKHMsIGMpKQorCQlraWxsKHMtPnBpZCwgc2lnKTsKKwlyZXR1cm4gMTsKK30KKworaW50IHJ1bnN2X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBydW5zdl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHN0YXQgczsKKwlpbnQgZmQ7CisJaW50IHI7CisJY2hhciBidWZbMjU2XTsKKworCUlOSVRfRygpOworCisJZGlyID0gc2luZ2xlX2FyZ3YoYXJndik7CisKKwl4cGlwZWRfcGFpcihzZWxmcGlwZSk7CisJY2xvc2Vfb25fZXhlY19vbihzZWxmcGlwZS5yZCk7CisJY2xvc2Vfb25fZXhlY19vbihzZWxmcGlwZS53cik7CisJbmRlbGF5X29uKHNlbGZwaXBlLnJkKTsKKwluZGVsYXlfb24oc2VsZnBpcGUud3IpOworCisJc2lnX2Jsb2NrKFNJR0NITEQpOworCWJiX3NpZ25hbHNfcmVjdXJzaXZlX25vcmVzdGFydCgxIDw8IFNJR0NITEQsIHNfY2hpbGQpOworCXNpZ19ibG9jayhTSUdURVJNKTsKKwliYl9zaWduYWxzX3JlY3Vyc2l2ZV9ub3Jlc3RhcnQoMSA8PCBTSUdURVJNLCBzX3Rlcm0pOworCisJeGNoZGlyKGRpcik7CisJLyogYnNzOiBzdmRbMF0ucGlkID0gMDsgKi8KKwlpZiAoU19ET1dOKSBzdmRbMF0uc3RhdGUgPSBTX0RPV047IC8qIG90aGVyd2lzZSBhbHJlYWR5IDAgKGJzcykgKi8KKwlpZiAoQ19OT09QKSBzdmRbMF0uY3RybCA9IENfTk9PUDsKKwlpZiAoV19VUCkgc3ZkWzBdLnNkX3dhbnQgPSBXX1VQOworCS8qIGJzczogc3ZkWzBdLmlzbG9nID0gMDsgKi8KKwkvKiBic3M6IHN2ZFsxXS5waWQgPSAwOyAqLworCWdldHRpbWVvZmRheV9ucygmc3ZkWzBdLnN0YXJ0KTsKKwlpZiAoc3RhdCgiZG93biIsICZzKSAhPSAtMSkKKwkJc3ZkWzBdLnNkX3dhbnQgPSBXX0RPV047CisKKwlpZiAoc3RhdCgibG9nIiwgJnMpID09IC0xKSB7CisJCWlmIChlcnJubyAhPSBFTk9FTlQpCisJCQl3YXJuX2Nhbm5vdCgic3RhdCAuL2xvZyIpOworCX0gZWxzZSB7CisJCWlmICghU19JU0RJUihzLnN0X21vZGUpKSB7CisJCQllcnJubyA9IDA7CisJCQl3YXJuX2Nhbm5vdCgic3RhdCBsb2cvZG93bjogbG9nIGlzIG5vdCBhIGRpcmVjdG9yeSIpOworCQl9IGVsc2UgeworCQkJaGFzbG9nID0gMTsKKwkJCXN2ZFsxXS5zdGF0ZSA9IFNfRE9XTjsKKwkJCXN2ZFsxXS5jdHJsID0gQ19OT09QOworCQkJc3ZkWzFdLnNkX3dhbnQgPSBXX1VQOworCQkJc3ZkWzFdLmlzbG9nID0gMTsKKwkJCWdldHRpbWVvZmRheV9ucygmc3ZkWzFdLnN0YXJ0KTsKKwkJCWlmIChzdGF0KCJsb2cvZG93biIsICZzKSAhPSAtMSkKKwkJCQlzdmRbMV0uc2Rfd2FudCA9IFdfRE9XTjsKKwkJCXhwaXBlZF9wYWlyKGxvZ3BpcGUpOworCQkJY2xvc2Vfb25fZXhlY19vbihsb2dwaXBlLnJkKTsKKwkJCWNsb3NlX29uX2V4ZWNfb24obG9ncGlwZS53cik7CisJCX0KKwl9CisKKwlpZiAobWtkaXIoInN1cGVydmlzZSIsIDA3MDApID09IC0xKSB7CisJCXIgPSByZWFkbGluaygic3VwZXJ2aXNlIiwgYnVmLCBzaXplb2YoYnVmKSk7CisJCWlmIChyICE9IC0xKSB7CisJCQlpZiAociA9PSBzaXplb2YoYnVmKSkKKwkJCQlmYXRhbDJ4X2Nhbm5vdCgicmVhZGxpbmsgLi9zdXBlcnZpc2UiLCAiOiBuYW1lIHRvbyBsb25nIik7CisJCQlidWZbcl0gPSAwOworCQkJbWtkaXIoYnVmLCAwNzAwKTsKKwkJfSBlbHNlIHsKKwkJCWlmICgoZXJybm8gIT0gRU5PRU5UKSAmJiAoZXJybm8gIT0gRUlOVkFMKSkKKwkJCQlmYXRhbF9jYW5ub3QoInJlYWRsaW5rIC4vc3VwZXJ2aXNlIik7CisJCX0KKwl9CisJc3ZkWzBdLmZkbG9jayA9IHhvcGVuMygibG9nL3N1cGVydmlzZS9sb2NrIis0LAorCQkJT19XUk9OTFl8T19OREVMQVl8T19BUFBFTkR8T19DUkVBVCwgMDYwMCk7CisJaWYgKGZsb2NrKHN2ZFswXS5mZGxvY2ssIExPQ0tfRVggfCBMT0NLX05CKSA9PSAtMSkKKwkJZmF0YWxfY2Fubm90KCJsb2NrIHN1cGVydmlzZS9sb2NrIik7CisJY2xvc2Vfb25fZXhlY19vbihzdmRbMF0uZmRsb2NrKTsKKwlpZiAoaGFzbG9nKSB7CisJCWlmIChta2RpcigibG9nL3N1cGVydmlzZSIsIDA3MDApID09IC0xKSB7CisJCQlyID0gcmVhZGxpbmsoImxvZy9zdXBlcnZpc2UiLCBidWYsIDI1Nik7CisJCQlpZiAociAhPSAtMSkgeworCQkJCWlmIChyID09IDI1NikKKwkJCQkJZmF0YWwyeF9jYW5ub3QoInJlYWRsaW5rIC4vbG9nL3N1cGVydmlzZSIsICI6IG5hbWUgdG9vIGxvbmciKTsKKwkJCQlidWZbcl0gPSAwOworCQkJCWZkID0geG9wZW4oIi4iLCBPX1JET05MWXxPX05ERUxBWSk7CisJCQkJeGNoZGlyKCIuL2xvZyIpOworCQkJCW1rZGlyKGJ1ZiwgMDcwMCk7CisJCQkJaWYgKGZjaGRpcihmZCkgPT0gLTEpCisJCQkJCWZhdGFsX2Nhbm5vdCgiY2hhbmdlIGJhY2sgdG8gc2VydmljZSBkaXJlY3RvcnkiKTsKKwkJCQljbG9zZShmZCk7CisJCQl9CisJCQllbHNlIHsKKwkJCQlpZiAoKGVycm5vICE9IEVOT0VOVCkgJiYgKGVycm5vICE9IEVJTlZBTCkpCisJCQkJCWZhdGFsX2Nhbm5vdCgicmVhZGxpbmsgLi9sb2cvc3VwZXJ2aXNlIik7CisJCQl9CisJCX0KKwkJc3ZkWzFdLmZkbG9jayA9IHhvcGVuMygibG9nL3N1cGVydmlzZS9sb2NrIiwKKwkJCQlPX1dST05MWXxPX05ERUxBWXxPX0FQUEVORHxPX0NSRUFULCAwNjAwKTsKKwkJaWYgKGZsb2NrKHN2ZFsxXS5mZGxvY2ssIExPQ0tfRVgpID09IC0xKQorCQkJZmF0YWxfY2Fubm90KCJsb2NrIGxvZy9zdXBlcnZpc2UvbG9jayIpOworCQljbG9zZV9vbl9leGVjX29uKHN2ZFsxXS5mZGxvY2spOworCX0KKworCW1rZmlmbygibG9nL3N1cGVydmlzZS9jb250cm9sIis0LCAwNjAwKTsKKwlzdmRbMF0uZmRjb250cm9sID0geG9wZW4oImxvZy9zdXBlcnZpc2UvY29udHJvbCIrNCwgT19SRE9OTFl8T19OREVMQVkpOworCWNsb3NlX29uX2V4ZWNfb24oc3ZkWzBdLmZkY29udHJvbCk7CisJc3ZkWzBdLmZkY29udHJvbHdyaXRlID0geG9wZW4oImxvZy9zdXBlcnZpc2UvY29udHJvbCIrNCwgT19XUk9OTFl8T19OREVMQVkpOworCWNsb3NlX29uX2V4ZWNfb24oc3ZkWzBdLmZkY29udHJvbHdyaXRlKTsKKwl1cGRhdGVfc3RhdHVzKCZzdmRbMF0pOworCWlmIChoYXNsb2cpIHsKKwkJbWtmaWZvKCJsb2cvc3VwZXJ2aXNlL2NvbnRyb2wiLCAwNjAwKTsKKwkJc3ZkWzFdLmZkY29udHJvbCA9IHhvcGVuKCJsb2cvc3VwZXJ2aXNlL2NvbnRyb2wiLCBPX1JET05MWXxPX05ERUxBWSk7CisJCWNsb3NlX29uX2V4ZWNfb24oc3ZkWzFdLmZkY29udHJvbCk7CisJCXN2ZFsxXS5mZGNvbnRyb2x3cml0ZSA9IHhvcGVuKCJsb2cvc3VwZXJ2aXNlL2NvbnRyb2wiLCBPX1dST05MWXxPX05ERUxBWSk7CisJCWNsb3NlX29uX2V4ZWNfb24oc3ZkWzFdLmZkY29udHJvbHdyaXRlKTsKKwkJdXBkYXRlX3N0YXR1cygmc3ZkWzFdKTsKKwl9CisJbWtmaWZvKCJsb2cvc3VwZXJ2aXNlL29rIis0LCAwNjAwKTsKKwlmZCA9IHhvcGVuKCJsb2cvc3VwZXJ2aXNlL29rIis0LCBPX1JET05MWXxPX05ERUxBWSk7CisJY2xvc2Vfb25fZXhlY19vbihmZCk7CisJaWYgKGhhc2xvZykgeworCQlta2ZpZm8oImxvZy9zdXBlcnZpc2Uvb2siLCAwNjAwKTsKKwkJZmQgPSB4b3BlbigibG9nL3N1cGVydmlzZS9vayIsIE9fUkRPTkxZfE9fTkRFTEFZKTsKKwkJY2xvc2Vfb25fZXhlY19vbihmZCk7CisJfQorCWZvciAoOzspIHsKKwkJc3RydWN0IHBvbGxmZCB4WzNdOworCQl1bnNpZ25lZCBkZWFkbGluZTsKKwkJY2hhciBjaDsKKworCQlpZiAoaGFzbG9nKQorCQkJaWYgKCFzdmRbMV0ucGlkICYmIHN2ZFsxXS5zZF93YW50ID09IFdfVVApCisJCQkJc3RhcnRzZXJ2aWNlKCZzdmRbMV0pOworCQlpZiAoIXN2ZFswXS5waWQpCisJCQlpZiAoc3ZkWzBdLnNkX3dhbnQgPT0gV19VUCB8fCBzdmRbMF0uc3RhdGUgPT0gU19GSU5JU0gpCisJCQkJc3RhcnRzZXJ2aWNlKCZzdmRbMF0pOworCisJCXhbMF0uZmQgPSBzZWxmcGlwZS5yZDsKKwkJeFswXS5ldmVudHMgPSBQT0xMSU47CisJCXhbMV0uZmQgPSBzdmRbMF0uZmRjb250cm9sOworCQl4WzFdLmV2ZW50cyA9IFBPTExJTjsKKwkJLyogeFsyXSBpcyB1c2VkIG9ubHkgaWYgaGFzbG9nID09IDEgKi8KKwkJeFsyXS5mZCA9IHN2ZFsxXS5mZGNvbnRyb2w7CisJCXhbMl0uZXZlbnRzID0gUE9MTElOOworCQlzaWdfdW5ibG9jayhTSUdURVJNKTsKKwkJc2lnX3VuYmxvY2soU0lHQ0hMRCk7CisJCXBvbGwoeCwgMiArIGhhc2xvZywgMzYwMCoxMDAwKTsKKwkJc2lnX2Jsb2NrKFNJR1RFUk0pOworCQlzaWdfYmxvY2soU0lHQ0hMRCk7CisKKwkJd2hpbGUgKHJlYWQoc2VsZnBpcGUucmQsICZjaCwgMSkgPT0gMSkKKwkJCWNvbnRpbnVlOworCisJCWZvciAoOzspIHsKKwkJCXBpZF90IGNoaWxkOworCQkJaW50IHdzdGF0OworCisJCQljaGlsZCA9IHdhaXRfYW55X25vaGFuZygmd3N0YXQpOworCQkJaWYgKCFjaGlsZCkKKwkJCQlicmVhazsKKwkJCWlmICgoY2hpbGQgPT0gLTEpICYmIChlcnJubyAhPSBFSU5UUikpCisJCQkJYnJlYWs7CisJCQlpZiAoY2hpbGQgPT0gc3ZkWzBdLnBpZCkgeworCQkJCXN2ZFswXS53c3RhdCA9IHdzdGF0OworCQkJCXN2ZFswXS5waWQgPSAwOworCQkJCXBpZGNoYW5nZWQgPSAxOworCQkJCXN2ZFswXS5jdHJsICY9IH5DX1RFUk07CisJCQkJaWYgKHN2ZFswXS5zdGF0ZSAhPSBTX0ZJTklTSCkgeworCQkJCQlmZCA9IG9wZW4oImZpbmlzaCIsIE9fUkRPTkxZfE9fTkRFTEFZKTsKKwkJCQkJaWYgKGZkICE9IC0xKSB7CisJCQkJCQljbG9zZShmZCk7CisJCQkJCQlzdmRbMF0uc3RhdGUgPSBTX0ZJTklTSDsKKwkJCQkJCXVwZGF0ZV9zdGF0dXMoJnN2ZFswXSk7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCX0KKwkJCQlzdmRbMF0uc3RhdGUgPSBTX0RPV047CisJCQkJZGVhZGxpbmUgPSBzdmRbMF0uc3RhcnQudHZfc2VjICsgMTsKKwkJCQlnZXR0aW1lb2ZkYXlfbnMoJnN2ZFswXS5zdGFydCk7CisJCQkJdXBkYXRlX3N0YXR1cygmc3ZkWzBdKTsKKwkJCQlpZiAoTEVTUyhzdmRbMF0uc3RhcnQudHZfc2VjLCBkZWFkbGluZSkpCisJCQkJCXNsZWVwKDEpOworCQkJfQorCQkJaWYgKGhhc2xvZykgeworCQkJCWlmIChjaGlsZCA9PSBzdmRbMV0ucGlkKSB7CisJCQkJCXN2ZFswXS53c3RhdCA9IHdzdGF0OworCQkJCQlzdmRbMV0ucGlkID0gMDsKKwkJCQkJcGlkY2hhbmdlZCA9IDE7CisJCQkJCXN2ZFsxXS5zdGF0ZSA9IFNfRE9XTjsKKwkJCQkJc3ZkWzFdLmN0cmwgJj0gfkNfVEVSTTsKKwkJCQkJZGVhZGxpbmUgPSBzdmRbMV0uc3RhcnQudHZfc2VjICsgMTsKKwkJCQkJZ2V0dGltZW9mZGF5X25zKCZzdmRbMV0uc3RhcnQpOworCQkJCQl1cGRhdGVfc3RhdHVzKCZzdmRbMV0pOworCQkJCQlpZiAoTEVTUyhzdmRbMV0uc3RhcnQudHZfc2VjLCBkZWFkbGluZSkpCisJCQkJCQlzbGVlcCgxKTsKKwkJCQl9CisJCQl9CisJCX0gLyogZm9yICg7OykgKi8KKwkJaWYgKHJlYWQoc3ZkWzBdLmZkY29udHJvbCwgJmNoLCAxKSA9PSAxKQorCQkJY3RybCgmc3ZkWzBdLCBjaCk7CisJCWlmIChoYXNsb2cpCisJCQlpZiAocmVhZChzdmRbMV0uZmRjb250cm9sLCAmY2gsIDEpID09IDEpCisJCQkJY3RybCgmc3ZkWzFdLCBjaCk7CisKKwkJaWYgKHNpZ3Rlcm0pIHsKKwkJCWN0cmwoJnN2ZFswXSwgJ3gnKTsKKwkJCXNpZ3Rlcm0gPSAwOworCQl9CisKKwkJaWYgKHN2ZFswXS5zZF93YW50ID09IFdfRVhJVCAmJiBzdmRbMF0uc3RhdGUgPT0gU19ET1dOKSB7CisJCQlpZiAoc3ZkWzFdLnBpZCA9PSAwKQorCQkJCV9leGl0KEVYSVRfU1VDQ0VTUyk7CisJCQlpZiAoc3ZkWzFdLnNkX3dhbnQgIT0gV19FWElUKSB7CisJCQkJc3ZkWzFdLnNkX3dhbnQgPSBXX0VYSVQ7CisJCQkJLyogc3RvcHNlcnZpY2UoJnN2ZFsxXSk7ICovCisJCQkJdXBkYXRlX3N0YXR1cygmc3ZkWzFdKTsKKwkJCQljbG9zZShsb2dwaXBlLndyKTsKKwkJCQljbG9zZShsb2dwaXBlLnJkKTsKKwkJCX0KKwkJfQorCX0gLyogZm9yICg7OykgKi8KKwkvKiBub3QgcmVhY2hlZCAqLworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcnVuaXQvcnVuc3ZkaXIuYyBiL3J1bml0L3J1bnN2ZGlyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRjMGIyZQotLS0gL2Rldi9udWxsCisrKyBiL3J1bml0L3J1bnN2ZGlyLmMKQEAgLTAsMCArMSw0MDYgQEAKKy8qCitDb3B5cmlnaHQgKGMpIDIwMDEtMjAwNiwgR2Vycml0IFBhcGUKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK1JlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CisKKyAgIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKKyAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgICAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgIDMuIFRoZSBuYW1lIG9mIHRoZSBhdXRob3IgbWF5IG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cworICAgICAgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisKK1RISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIEFVVEhPUiBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQKK1dBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCitNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTworRVZFTlQgU0hBTEwgVEhFIEFVVEhPUiBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7CitPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKK1dIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SCitPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGCitBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyovCisKKy8qIEJ1c3lib3hlZCBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPiAqLworLyogVE9ETzogZGVwZW5kcyBvbiBydW5pdF9saWIuYyAtIHJldmlldyBhbmQgcmVkdWNlL2VsaW1pbmF0ZSAqLworCisvL3VzYWdlOiNkZWZpbmUgcnVuc3ZkaXJfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstUF0gWy1zIFNDUklQVF0gRElSIgorLy91c2FnZTojZGVmaW5lIHJ1bnN2ZGlyX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU3RhcnQgYSBydW5zdiBwcm9jZXNzIGZvciBlYWNoIHN1YmRpcmVjdG9yeS4gSWYgaXQgZXhpdHMsIHJlc3RhcnQgaXQuXG4iCisvL3VzYWdlOiAgICAgIlxuCS1QCQlQdXQgZWFjaCBydW5zdiBpbiBhIG5ldyBzZXNzaW9uIgorLy91c2FnZTogICAgICJcbgktcyBTQ1JJUFQJUnVuIFNDUklQVCA8c2lnbm8+IGFmdGVyIHNpZ25hbCBpcyBwcm9jZXNzZWQiCisKKyNpbmNsdWRlIDxzeXMvZmlsZS5oPgorI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAicnVuaXRfbGliLmgiCisKKyNkZWZpbmUgTUFYU0VSVklDRVMgMTAwMAorCisvKiBTaG91bGQgYmUgbm90IG5lZWRlZCAtIGFsbCBkaXJzIGFyZSBvbiBzYW1lIEZTLCByaWdodD8gKi8KKyNkZWZpbmUgQ0hFQ0tfREVWTk9fVE9PIDAKKworc3RydWN0IHNlcnZpY2UgeworI2lmIENIRUNLX0RFVk5PX1RPTworCWRldl90IGRldjsKKyNlbmRpZgorCWlub190IGlubzsKKwlwaWRfdCBwaWQ7CisJc21hbGxpbnQgaXNnb25lOworfTsKKworc3RydWN0IGdsb2JhbHMgeworCXN0cnVjdCBzZXJ2aWNlICpzdjsKKwljaGFyICpzdmRpcjsKKwlpbnQgc3ZudW07CisjaWYgRU5BQkxFX0ZFQVRVUkVfUlVOU1ZESVJfTE9HCisJY2hhciAqcnBsb2c7CisJc3RydWN0IGZkX3BhaXIgbG9ncGlwZTsKKwlzdHJ1Y3QgcG9sbGZkIHBmZFsxXTsKKwl1bnNpZ25lZCBzdGFtcGxvZzsKKyNlbmRpZgorfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgc3YgICAgICAgICAgKEcuc3YgICAgICAgICAgKQorI2RlZmluZSBzdmRpciAgICAgICAoRy5zdmRpciAgICAgICApCisjZGVmaW5lIHN2bnVtICAgICAgIChHLnN2bnVtICAgICAgICkKKyNkZWZpbmUgcnBsb2cgICAgICAgKEcucnBsb2cgICAgICAgKQorI2RlZmluZSBsb2dwaXBlICAgICAoRy5sb2dwaXBlICAgICApCisjZGVmaW5lIHBmZCAgICAgICAgIChHLnBmZCAgICAgICAgICkKKyNkZWZpbmUgc3RhbXBsb2cgICAgKEcuc3RhbXBsb2cgICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IH0gd2hpbGUgKDApCisKK3N0YXRpYyB2b2lkIGZhdGFsMl9jYW5ub3QoY29uc3QgY2hhciAqbTEsIGNvbnN0IGNoYXIgKm0yKQoreworCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiJXM6IGZhdGFsOiBjYW4ndCAlcyVzIiwgc3ZkaXIsIG0xLCBtMik7CisJLyogd2FzIGV4aXRpbmcgMTAwICovCit9CitzdGF0aWMgdm9pZCB3YXJuM3goY29uc3QgY2hhciAqbTEsIGNvbnN0IGNoYXIgKm0yLCBjb25zdCBjaGFyICptMykKK3sKKwliYl9lcnJvcl9tc2coIiVzOiB3YXJuaW5nOiAlcyVzJXMiLCBzdmRpciwgbTEsIG0yLCBtMyk7Cit9CitzdGF0aWMgdm9pZCB3YXJuMl9jYW5ub3QoY29uc3QgY2hhciAqbTEsIGNvbnN0IGNoYXIgKm0yKQoreworCXdhcm4zeCgiY2FuJ3QgIiwgbTEsIG0yKTsKK30KKyNpZiBFTkFCTEVfRkVBVFVSRV9SVU5TVkRJUl9MT0cKK3N0YXRpYyB2b2lkIHdhcm54KGNvbnN0IGNoYXIgKm0xKQoreworCXdhcm4zeChtMSwgIiIsICIiKTsKK30KKyNlbmRpZgorCisvKiBpbmxpbmluZyArIHZmb3JrIC0+IGJpZ2dlciBjb2RlICovCitzdGF0aWMgTk9JTkxJTkUgcGlkX3QgcnVuc3YoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlwaWRfdCBwaWQ7CisKKwkvKiBJZiB3ZSBnb3Qgc2lnbmFsZWQsIHN0b3Agc3Bhd25pbmcgY2hpbGRyZW4gYXQgb25jZSEgKi8KKwlpZiAoYmJfZ290X3NpZ25hbCkKKwkJcmV0dXJuIDA7CisKKwlwaWQgPSB2Zm9yaygpOworCWlmIChwaWQgPT0gLTEpIHsKKwkJd2FybjJfY2Fubm90KCJ2Zm9yayIsICIiKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChwaWQgPT0gMCkgeworCQkvKiBjaGlsZCAqLworCQlpZiAob3B0aW9uX21hc2szMiAmIDEpIC8qIC1QIG9wdGlvbj8gKi8KKwkJCXNldHNpZCgpOworLyogbWFuIGV4ZWN2OgorICogIlNpZ25hbHMgc2V0IHRvIGJlIGNhdWdodCBieSB0aGUgY2FsbGluZyBwcm9jZXNzIGltYWdlCisgKiAgc2hhbGwgYmUgc2V0IHRvIHRoZSBkZWZhdWx0IGFjdGlvbiBpbiB0aGUgbmV3IHByb2Nlc3MgaW1hZ2UuIgorICogVGhlcmVmb3JlLCB3ZSBkbyBub3QgbmVlZCB0aGlzOiAqLworI2lmIDAKKwkJYmJfc2lnbmFscygwCisJCQl8ICgxIDw8IFNJR0hVUCkKKwkJCXwgKDEgPDwgU0lHVEVSTSkKKwkJCSwgU0lHX0RGTCk7CisjZW5kaWYKKwkJZXhlY2xwKCJydW5zdiIsICJydW5zdiIsIG5hbWUsIChjaGFyICopIE5VTEwpOworCQlmYXRhbDJfY2Fubm90KCJzdGFydCBydW5zdiAiLCBuYW1lKTsKKwl9CisJcmV0dXJuIHBpZDsKK30KKworLyogZ2NjIDQuMy4wIGRvZXMgYmV0dGVyIHdpdGggTk9JTkxJTkUgKi8KK3N0YXRpYyBOT0lOTElORSBpbnQgZG9fcmVzY2FuKHZvaWQpCit7CisJRElSICpkaXI7CisJc3RydWN0IGRpcmVudCAqZDsKKwlpbnQgaTsKKwlzdHJ1Y3Qgc3RhdCBzOworCWludCBuZWVkX3Jlc2NhbiA9IDA7CisKKwlkaXIgPSBvcGVuZGlyKCIuIik7CisJaWYgKCFkaXIpIHsKKwkJd2FybjJfY2Fubm90KCJvcGVuIGRpcmVjdG9yeSAiLCBzdmRpcik7CisJCXJldHVybiAxOyAvKiBuZWVkIHRvIHJlc2NhbiBhZ2FpbiBzb29uICovCisJfQorCWZvciAoaSA9IDA7IGkgPCBzdm51bTsgaSsrKQorCQlzdltpXS5pc2dvbmUgPSAxOworCisJd2hpbGUgKDEpIHsKKwkJZXJybm8gPSAwOworCQlkID0gcmVhZGRpcihkaXIpOworCQlpZiAoIWQpCisJCQlicmVhazsKKwkJaWYgKGQtPmRfbmFtZVswXSA9PSAnLicpCisJCQljb250aW51ZTsKKwkJaWYgKHN0YXQoZC0+ZF9uYW1lLCAmcykgPT0gLTEpIHsKKwkJCXdhcm4yX2Nhbm5vdCgic3RhdCAiLCBkLT5kX25hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFTX0lTRElSKHMuc3RfbW9kZSkpCisJCQljb250aW51ZTsKKwkJLyogRG8gd2UgaGF2ZSB0aGlzIHNlcnZpY2UgbGlzdGVkIGFscmVhZHk/ICovCisJCWZvciAoaSA9IDA7IGkgPCBzdm51bTsgaSsrKSB7CisJCQlpZiAoKHN2W2ldLmlubyA9PSBzLnN0X2lubykKKyNpZiBDSEVDS19ERVZOT19UT08KKwkJCSAmJiAoc3ZbaV0uZGV2ID09IHMuc3RfZGV2KQorI2VuZGlmCisJCQkpIHsKKwkJCQlpZiAoc3ZbaV0ucGlkID09IDApIC8qIHJlc3RhcnQgaWYgaXQgaGFzIGRpZWQgKi8KKwkJCQkJZ290byBydW5faXRoX3N2OworCQkJCXN2W2ldLmlzZ29uZSA9IDA7IC8qICJ3ZSBzdGlsbCBzZWUgeW91IiAqLworCQkJCWdvdG8gbmV4dF9kZW50cnk7CisJCQl9CisJCX0KKwkJeyAvKiBOb3QgZm91bmQsIG1ha2UgbmV3IHNlcnZpY2UgKi8KKwkJCXN0cnVjdCBzZXJ2aWNlICpzdm5ldyA9IHJlYWxsb2Moc3YsIChpKzEpICogc2l6ZW9mKCpzdikpOworCQkJaWYgKCFzdm5ldykgeworCQkJCXdhcm4yX2Nhbm5vdCgic3RhcnQgcnVuc3YgIiwgZC0+ZF9uYW1lKTsKKwkJCQluZWVkX3Jlc2NhbiA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlzdiA9IHN2bmV3OworCQkJc3ZudW0rKzsKKyNpZiBDSEVDS19ERVZOT19UT08KKwkJCXN2W2ldLmRldiA9IHMuc3RfZGV2OworI2VuZGlmCisJCQlzdltpXS5pbm8gPSBzLnN0X2lubzsKKyBydW5faXRoX3N2OgorCQkJc3ZbaV0ucGlkID0gcnVuc3YoZC0+ZF9uYW1lKTsKKwkJCXN2W2ldLmlzZ29uZSA9IDA7CisJCX0KKyBuZXh0X2RlbnRyeTogOworCX0KKwlpID0gZXJybm87CisJY2xvc2VkaXIoZGlyKTsKKwlpZiAoaSkgeyAvKiByZWFkZGlyIGZhaWxlZCAqLworCQl3YXJuMl9jYW5ub3QoInJlYWQgZGlyZWN0b3J5ICIsIHN2ZGlyKTsKKwkJcmV0dXJuIDE7IC8qIG5lZWQgdG8gcmVzY2FuIGFnYWluIHNvb24gKi8KKwl9CisKKwkvKiBTZW5kIFNJR1RFUk0gdG8gcnVuc3Ygd2hvc2UgZGlyZWN0b3JpZXMKKwkgKiB3ZXJlIG5vIGxvbmdlciBmb3VuZCAoLT4gbXVzdCBoYXZlIGJlZW4gcmVtb3ZlZCkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgc3ZudW07IGkrKykgeworCQlpZiAoIXN2W2ldLmlzZ29uZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoc3ZbaV0ucGlkKQorCQkJa2lsbChzdltpXS5waWQsIFNJR1RFUk0pOworCQlzdm51bS0tOworCQlzdltpXSA9IHN2W3N2bnVtXTsKKwkJaS0tOyAvKiBzbyB0aGF0IHdlIGRvbid0IHNraXAgbmV3IHN2W2ldIChidWcgd2FzIGhlcmUhKSAqLworCX0KKwlyZXR1cm4gbmVlZF9yZXNjYW47Cit9CisKK2ludCBydW5zdmRpcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcnVuc3ZkaXJfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBzdGF0IHM7CisJZGV2X3QgbGFzdF9kZXYgPSBsYXN0X2RldjsgLyogZm9yIGdjYyAqLworCWlub190IGxhc3RfaW5vID0gbGFzdF9pbm87IC8qIGZvciBnY2MgKi8KKwl0aW1lX3QgbGFzdF9tdGltZTsKKwlpbnQgY3VyZGlyOworCXVuc2lnbmVkIHN0YW1wY2hlY2s7CisJaW50IGk7CisJaW50IG5lZWRfcmVzY2FuOworCWJvb2wgaV9hbV9pbml0OworCWNoYXIgKm9wdF9zX2FyZ3ZbM107CisKKwlJTklUX0coKTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIjsKKwlvcHRfc19hcmd2WzBdID0gTlVMTDsKKwlvcHRfc19hcmd2WzJdID0gTlVMTDsKKwlnZXRvcHQzMihhcmd2LCAiUHM6IiwgJm9wdF9zX2FyZ3ZbMF0pOworCWFyZ3YgKz0gb3B0aW5kOworCisJaV9hbV9pbml0ID0gKGdldHBpZCgpID09IDEpOworCWJiX3NpZ25hbHMoMAorCQl8ICgxIDw8IFNJR1RFUk0pCisJCXwgKDEgPDwgU0lHSFVQKQorCQkvKiBGb3IgYnVzeWJveCdzIGluaXQsIFNJR1RFUk0gPT0gcmVib290LAorCQkgKiBTSUdVU1IxID09IGhhbHQsCisJCSAqIFNJR1VTUjIgPT0gcG93ZXJvZmYsCisJCSAqIEN0bHItQUx0LURlbCBzZW5kcyBTSUdJTlQgdG8gaW5pdCwKKwkJICogc28gd2UgbmVlZCB0byBpbnRlcmNlcHQgU0lHVVNSbiBhbmQgU0lHSU5UIHRvby4KKwkJICogTm90ZSB0aGF0IHdlIGRvIG5vdCBpbXBsZW1lbnQgYWN0dWFsIHJlYm9vdAorCQkgKiAoa2lsbGFsbChURVJNKSArIHVtb3VudCwgZXRjKSwgd2UganVzdCBwYXVzZQorCQkgKiByZXNwYXdpbmcgYW5kIGF2b2lkIGV4aXRpbmcgKC0+IG1ha2luZyBrZXJuZWwgb29wcykuCisJCSAqIFRoZSB1c2VyIGlzIHJlc3BvbnNpYmxlIGZvciB0aGUgcmVzdC4KKwkJICovCisJCXwgKGlfYW1faW5pdCA/ICgoMSA8PCBTSUdVU1IxKSB8ICgxIDw8IFNJR1VTUjIpIHwgKDEgPDwgU0lHSU5UKSkgOiAwKQorCQksIHJlY29yZF9zaWdubyk7CisJc3ZkaXIgPSAqYXJndisrOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfUlVOU1ZESVJfTE9HCisJLyogc2V0dXAgbG9nICovCisJaWYgKCphcmd2KSB7CisJCXJwbG9nID0gKmFyZ3Y7CisJCWlmIChzdHJsZW4ocnBsb2cpIDwgNykgeworCQkJd2FybngoImxvZyBtdXN0IGhhdmUgYXQgbGVhc3Qgc2V2ZW4gY2hhcmFjdGVycyIpOworCQl9IGVsc2UgaWYgKHBpcGVkX3BhaXIobG9ncGlwZSkpIHsKKwkJCXdhcm54KCJjYW4ndCBjcmVhdGUgcGlwZSBmb3IgbG9nIik7CisJCX0gZWxzZSB7CisJCQljbG9zZV9vbl9leGVjX29uKGxvZ3BpcGUucmQpOworCQkJY2xvc2Vfb25fZXhlY19vbihsb2dwaXBlLndyKTsKKwkJCW5kZWxheV9vbihsb2dwaXBlLnJkKTsKKwkJCW5kZWxheV9vbihsb2dwaXBlLndyKTsKKwkJCWlmIChkdXAyKGxvZ3BpcGUud3IsIDIpID09IC0xKSB7CisJCQkJd2FybngoImNhbid0IHNldCBmaWxlZGVzY3JpcHRvciBmb3IgbG9nIik7CisJCQl9IGVsc2UgeworCQkJCXBmZFswXS5mZCA9IGxvZ3BpcGUucmQ7CisJCQkJcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKwkJCQlzdGFtcGxvZyA9IG1vbm90b25pY19zZWMoKTsKKwkJCQlnb3RvIHJ1bjsKKwkJCX0KKwkJfQorCQlycGxvZyA9IE5VTEw7CisJCXdhcm54KCJsb2cgc2VydmljZSBkaXNhYmxlZCIpOworCX0KKyBydW46CisjZW5kaWYKKwljdXJkaXIgPSBvcGVuKCIuIiwgT19SRE9OTFl8T19OREVMQVkpOworCWlmIChjdXJkaXIgPT0gLTEpCisJCWZhdGFsMl9jYW5ub3QoIm9wZW4gY3VycmVudCBkaXJlY3RvcnkiLCAiIik7CisJY2xvc2Vfb25fZXhlY19vbihjdXJkaXIpOworCisJc3RhbXBjaGVjayA9IG1vbm90b25pY19zZWMoKTsKKwluZWVkX3Jlc2NhbiA9IDE7CisJbGFzdF9tdGltZSA9IDA7CisKKwlmb3IgKDs7KSB7CisJCXVuc2lnbmVkIG5vdzsKKwkJdW5zaWduZWQgc2lnOworCisJCS8qIGNvbGxlY3QgY2hpbGRyZW4gKi8KKwkJZm9yICg7OykgeworCQkJcGlkX3QgcGlkID0gd2FpdF9hbnlfbm9oYW5nKE5VTEwpOworCQkJaWYgKHBpZCA8PSAwKQorCQkJCWJyZWFrOworCQkJZm9yIChpID0gMDsgaSA8IHN2bnVtOyBpKyspIHsKKwkJCQlpZiAocGlkID09IHN2W2ldLnBpZCkgeworCQkJCQkvKiBydW5zdiBoYXMgZGllZCAqLworCQkJCQlzdltpXS5waWQgPSAwOworCQkJCQluZWVkX3Jlc2NhbiA9IDE7CisJCQkJfQorCQkJfQorCQl9CisKKwkJbm93ID0gbW9ub3RvbmljX3NlYygpOworCQlpZiAoKGludCkobm93IC0gc3RhbXBjaGVjaykgPj0gMCkgeworCQkJLyogd2FpdCBhdCBsZWFzdCBhIHNlY29uZCAqLworCQkJc3RhbXBjaGVjayA9IG5vdyArIDE7CisKKwkJCWlmIChzdGF0KHN2ZGlyLCAmcykgIT0gLTEpIHsKKwkJCQlpZiAobmVlZF9yZXNjYW4gfHwgcy5zdF9tdGltZSAhPSBsYXN0X210aW1lCisJCQkJIHx8IHMuc3RfaW5vICE9IGxhc3RfaW5vIHx8IHMuc3RfZGV2ICE9IGxhc3RfZGV2CisJCQkJKSB7CisJCQkJCS8qIHN2ZGlyIG1vZGlmaWVkICovCisJCQkJCWlmIChjaGRpcihzdmRpcikgIT0gLTEpIHsKKwkJCQkJCWxhc3RfbXRpbWUgPSBzLnN0X210aW1lOworCQkJCQkJbGFzdF9kZXYgPSBzLnN0X2RldjsKKwkJCQkJCWxhc3RfaW5vID0gcy5zdF9pbm87CisJCQkJCQkvKiBpZiB0aGUgc3ZkaXIgY2hhbmdlZCB0aGlzIHZlcnkgc2Vjb25kLCB3YWl0IHVudGlsIHRoZQorCQkJCQkJICogbmV4dCBzZWNvbmQsIGJlY2F1c2Ugd2Ugd29uJ3QgYmUgYWJsZSB0byBkZXRlY3QgbW9yZQorCQkJCQkJICogY2hhbmdlcyB3aXRoaW4gdGhpcyBzZWNvbmQgKi8KKwkJCQkJCXdoaWxlICh0aW1lKE5VTEwpID09IGxhc3RfbXRpbWUpCisJCQkJCQkJdXNsZWVwKDEwMDAwMCk7CisJCQkJCQluZWVkX3Jlc2NhbiA9IGRvX3Jlc2NhbigpOworCQkJCQkJd2hpbGUgKGZjaGRpcihjdXJkaXIpID09IC0xKSB7CisJCQkJCQkJd2FybjJfY2Fubm90KCJjaGFuZ2UgZGlyZWN0b3J5LCBwYXVzaW5nIiwgIiIpOworCQkJCQkJCXNsZWVwKDUpOworCQkJCQkJfQorCQkJCQl9IGVsc2UgeworCQkJCQkJd2FybjJfY2Fubm90KCJjaGFuZ2UgZGlyZWN0b3J5IHRvICIsIHN2ZGlyKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJd2FybjJfY2Fubm90KCJzdGF0ICIsIHN2ZGlyKTsKKwkJCX0KKwkJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfUlVOU1ZESVJfTE9HCisJCWlmIChycGxvZykgeworCQkJaWYgKChpbnQpKG5vdyAtIHN0YW1wbG9nKSA+PSAwKSB7CisJCQkJd3JpdGUobG9ncGlwZS53ciwgIi4iLCAxKTsKKwkJCQlzdGFtcGxvZyA9IG5vdyArIDkwMDsKKwkJCX0KKwkJfQorCQlwZmRbMF0ucmV2ZW50cyA9IDA7CisjZW5kaWYKKwkJeworCQkJdW5zaWduZWQgZGVhZGxpbmUgPSAobmVlZF9yZXNjYW4gPyAxIDogNSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUlVOU1ZESVJfTE9HCisJCQlpZiAocnBsb2cpCisJCQkJcG9sbChwZmQsIDEsIGRlYWRsaW5lKjEwMDApOworCQkJZWxzZQorI2VuZGlmCisJCQkJc2xlZXAoZGVhZGxpbmUpOworCQl9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9SVU5TVkRJUl9MT0cKKwkJaWYgKHBmZFswXS5yZXZlbnRzICYgUE9MTElOKSB7CisJCQljaGFyIGNoOworCQkJd2hpbGUgKHJlYWQobG9ncGlwZS5yZCwgJmNoLCAxKSA+IDApIHsKKwkJCQlpZiAoY2ggPCAnICcpCisJCQkJCWNoID0gJyAnOworCQkJCWZvciAoaSA9IDY7IHJwbG9nW2ldICE9ICdcMCc7IGkrKykKKwkJCQkJcnBsb2dbaS0xXSA9IHJwbG9nW2ldOworCQkJCXJwbG9nW2ktMV0gPSBjaDsKKwkJCX0KKwkJfQorI2VuZGlmCisJCXNpZyA9IGJiX2dvdF9zaWduYWw7CisJCWlmICghc2lnKQorCQkJY29udGludWU7CisJCWJiX2dvdF9zaWduYWwgPSAwOworCisJCS8qIC1zIFNDUklQVDogdXNlZnVsIGlmIHdlIGFyZSBpbml0LgorCQkgKiBJbiB0aGlzIGNhc2UgdHlwaWNhbGx5IHNjcmlwdCBuZXZlciByZXR1cm5zLAorCQkgKiBpdCBoYWx0cy9wb3dlcnMgb2ZmL3JlYm9vdHMgdGhlIHN5c3RlbS4gKi8KKwkJaWYgKG9wdF9zX2FyZ3ZbMF0pIHsKKwkJCXBpZF90IHBpZDsKKworCQkJLyogU2luZ2xlIHBhcmFtZXRlcjogc2lnbmFsIyAqLworCQkJb3B0X3NfYXJndlsxXSA9IHV0b2Eoc2lnKTsKKwkJCXBpZCA9IHNwYXduKG9wdF9zX2FyZ3YpOworCQkJaWYgKHBpZCA+IDApIHsKKwkJCQkvKiBSZW1lbWJlcmluZyB0byB3YWl0IGZvciBfYW55XyBjaGlsZHJlbiwKKwkJCQkgKiBub3QganVzdCBwaWQgKi8KKwkJCQl3aGlsZSAod2FpdChOVUxMKSAhPSBwaWQpCisJCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJaWYgKHNpZyA9PSBTSUdIVVApIHsKKwkJCWZvciAoaSA9IDA7IGkgPCBzdm51bTsgaSsrKQorCQkJCWlmIChzdltpXS5waWQpCisJCQkJCWtpbGwoc3ZbaV0ucGlkLCBTSUdURVJNKTsKKwkJfQorCQkvKiBTSUdIVVAgb3IgU0lHVEVSTSAob3IgU0lHVVNSbiBpZiB3ZSBhcmUgaW5pdCkgKi8KKwkJLyogRXhpdCB1bmxlc3Mgd2UgYXJlIGluaXQgKi8KKwkJaWYgKCFpX2FtX2luaXQpCisJCQlyZXR1cm4gKFNJR0hVUCA9PSBzaWcpID8gMTExIDogRVhJVF9TVUNDRVNTOworCisJCS8qIGluaXQgY29udGludWVzIHRvIG1vbml0b3Igc2VydmljZXMgZm9yZXZlciAqLworCX0gLyogZm9yICg7OykgKi8KK30KZGlmZiAtLWdpdCBhL3J1bml0L3N2LmMgYi9ydW5pdC9zdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNWU5ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9ydW5pdC9zdi5jCkBAIC0wLDAgKzEsNjE3IEBACisvKgorQ29weXJpZ2h0IChjKSAyMDAxLTIwMDYsIEdlcnJpdCBQYXBlCitBbGwgcmlnaHRzIHJlc2VydmVkLgorCitSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKK21vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgorCisgICAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICAgMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgICAzLiBUaGUgbmFtZSBvZiB0aGUgYXV0aG9yIG1heSBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMKKyAgICAgIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorCitUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVECitXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRgorTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8KK0VWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKK1NQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywKK1BST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOworT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksCitXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUgorT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRgorQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisqLworCisvKiBUYWtlbiBmcm9tIGh0dHA6Ly9zbWFyZGVuLnN1bnNpdGUuZGsvcnVuaXQvc3YuOC5odG1sOgorCitzdiAtIGNvbnRyb2wgYW5kIG1hbmFnZSBzZXJ2aWNlcyBtb25pdG9yZWQgYnkgcnVuc3YKKworc3YgWy12XSBbLXcgc2VjXSBjb21tYW5kIHNlcnZpY2VzCisvZXRjL2luaXQuZC9zZXJ2aWNlIFstdyBzZWNdIGNvbW1hbmQKKworVGhlIHN2IHByb2dyYW0gcmVwb3J0cyB0aGUgY3VycmVudCBzdGF0dXMgYW5kIGNvbnRyb2xzIHRoZSBzdGF0ZSBvZiBzZXJ2aWNlcworbW9uaXRvcmVkIGJ5IHRoZSBydW5zdig4KSBzdXBlcnZpc29yLgorCitzZXJ2aWNlcyBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSBhcmd1bWVudHMsIGVhY2ggYXJndW1lbnQgbmFtaW5nIGEgZGlyZWN0b3J5CitzZXJ2aWNlIHVzZWQgYnkgcnVuc3YoOCkuIElmIHNlcnZpY2UgZG9lc24ndCBzdGFydCB3aXRoIGEgZG90IG9yIHNsYXNoLAoraXQgaXMgc2VhcmNoZWQgaW4gdGhlIGRlZmF1bHQgc2VydmljZXMgZGlyZWN0b3J5IC92YXIvc2VydmljZS8sIG90aGVyd2lzZQorcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorCitjb21tYW5kIGlzIG9uZSBvZiB1cCwgZG93biwgc3RhdHVzLCBvbmNlLCBwYXVzZSwgY29udCwgaHVwLCBhbGFybSwgaW50ZXJydXB0LAorMSwgMiwgdGVybSwga2lsbCwgb3IgZXhpdCwgb3Igc3RhcnQsIHN0b3AsIHJlc3RhcnQsIHNodXRkb3duLCBmb3JjZS1zdG9wLAorZm9yY2UtcmVsb2FkLCBmb3JjZS1yZXN0YXJ0LCBmb3JjZS1zaHV0ZG93bi4KKworVGhlIHN2IHByb2dyYW0gY2FuIGJlIHN5bS1saW5rZWQgdG8gL2V0Yy9pbml0LmQvIHRvIHByb3ZpZGUgYW4gTFNCIGluaXQKK3NjcmlwdCBpbnRlcmZhY2UuIFRoZSBzZXJ2aWNlIHRvIGJlIGNvbnRyb2xsZWQgdGhlbiBpcyBzcGVjaWZpZWQgYnkgdGhlCitiYXNlIG5hbWUgb2YgdGhlICJpbml0IHNjcmlwdCIuCisKK3N0YXR1cworICAgIFJlcG9ydCB0aGUgY3VycmVudCBzdGF0dXMgb2YgdGhlIHNlcnZpY2UsIGFuZCB0aGUgYXBwZW5kYW50IGxvZyBzZXJ2aWNlCisgICAgaWYgYXZhaWxhYmxlLCB0byBzdGFuZGFyZCBvdXRwdXQuCit1cAorICAgIElmIHRoZSBzZXJ2aWNlIGlzIG5vdCBydW5uaW5nLCBzdGFydCBpdC4gSWYgdGhlIHNlcnZpY2Ugc3RvcHMsIHJlc3RhcnQgaXQuCitkb3duCisgICAgSWYgdGhlIHNlcnZpY2UgaXMgcnVubmluZywgc2VuZCBpdCB0aGUgVEVSTSBzaWduYWwsIGFuZCB0aGUgQ09OVCBzaWduYWwuCisgICAgSWYgLi9ydW4gZXhpdHMsIHN0YXJ0IC4vZmluaXNoIGlmIGl0IGV4aXN0cy4gQWZ0ZXIgaXQgc3RvcHMsIGRvIG5vdAorICAgIHJlc3RhcnQgc2VydmljZS4KK29uY2UKKyAgICBJZiB0aGUgc2VydmljZSBpcyBub3QgcnVubmluZywgc3RhcnQgaXQuIERvIG5vdCByZXN0YXJ0IGl0IGlmIGl0IHN0b3BzLgorcGF1c2UgY29udCBodXAgYWxhcm0gaW50ZXJydXB0IHF1aXQgMSAyIHRlcm0ga2lsbAorICAgIElmIHRoZSBzZXJ2aWNlIGlzIHJ1bm5pbmcsIHNlbmQgaXQgdGhlIFNUT1AsIENPTlQsIEhVUCwgQUxSTSwgSU5ULCBRVUlULAorICAgIFVTUjEsIFVTUjIsIFRFUk0sIG9yIEtJTEwgc2lnbmFsIHJlc3BlY3RpdmVseS4KK2V4aXQKKyAgICBJZiB0aGUgc2VydmljZSBpcyBydW5uaW5nLCBzZW5kIGl0IHRoZSBURVJNIHNpZ25hbCwgYW5kIHRoZSBDT05UIHNpZ25hbC4KKyAgICBEbyBub3QgcmVzdGFydCB0aGUgc2VydmljZS4gSWYgdGhlIHNlcnZpY2UgaXMgZG93biwgYW5kIG5vIGxvZyBzZXJ2aWNlCisgICAgZXhpc3RzLCBydW5zdig4KSBleGl0cy4gSWYgdGhlIHNlcnZpY2UgaXMgZG93biBhbmQgYSBsb2cgc2VydmljZSBleGlzdHMsCisgICAgc2VuZCB0aGUgVEVSTSBzaWduYWwgdG8gdGhlIGxvZyBzZXJ2aWNlLiBJZiB0aGUgbG9nIHNlcnZpY2UgaXMgZG93biwKKyAgICBydW5zdig4KSBleGl0cy4gVGhpcyBjb21tYW5kIGlzIGlnbm9yZWQgaWYgaXQgaXMgZ2l2ZW4gdG8gYW4gYXBwZW5kYW50CisgICAgbG9nIHNlcnZpY2UuCisKK3N2IGFjdHVhbGx5IGxvb2tzIG9ubHkgYXQgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhYm92ZSBjb21tYW5kcy4KKworQ29tbWFuZHMgY29tcGF0aWJsZSB0byBMU0IgaW5pdCBzY3JpcHQgYWN0aW9uczoKKworc3RhdHVzCisgICAgU2FtZSBhcyBzdGF0dXMuCitzdGFydAorICAgIFNhbWUgYXMgdXAsIGJ1dCB3YWl0IHVwIHRvIDcgc2Vjb25kcyBmb3IgdGhlIGNvbW1hbmQgdG8gdGFrZSBlZmZlY3QuCisgICAgVGhlbiByZXBvcnQgdGhlIHN0YXR1cyBvciB0aW1lb3V0LiBJZiB0aGUgc2NyaXB0IC4vY2hlY2sgZXhpc3RzIGluCisgICAgdGhlIHNlcnZpY2UgZGlyZWN0b3J5LCBzdiBydW5zIHRoaXMgc2NyaXB0IHRvIGNoZWNrIHdoZXRoZXIgdGhlIHNlcnZpY2UKKyAgICBpcyB1cCBhbmQgYXZhaWxhYmxlOyBpdCdzIGNvbnNpZGVyZWQgdG8gYmUgYXZhaWxhYmxlIGlmIC4vY2hlY2sgZXhpdHMKKyAgICB3aXRoIDAuCitzdG9wCisgICAgU2FtZSBhcyBkb3duLCBidXQgd2FpdCB1cCB0byA3IHNlY29uZHMgZm9yIHRoZSBzZXJ2aWNlIHRvIGJlY29tZSBkb3duLgorICAgIFRoZW4gcmVwb3J0IHRoZSBzdGF0dXMgb3IgdGltZW91dC4KK3Jlc3RhcnQKKyAgICBTZW5kIHRoZSBjb21tYW5kcyB0ZXJtLCBjb250LCBhbmQgdXAgdG8gdGhlIHNlcnZpY2UsIGFuZCB3YWl0IHVwIHRvCisgICAgNyBzZWNvbmRzIGZvciB0aGUgc2VydmljZSB0byByZXN0YXJ0LiBUaGVuIHJlcG9ydCB0aGUgc3RhdHVzIG9yIHRpbWVvdXQuCisgICAgSWYgdGhlIHNjcmlwdCAuL2NoZWNrIGV4aXN0cyBpbiB0aGUgc2VydmljZSBkaXJlY3RvcnksIHN2IHJ1bnMgdGhpcyBzY3JpcHQKKyAgICB0byBjaGVjayB3aGV0aGVyIHRoZSBzZXJ2aWNlIGlzIHVwIGFuZCBhdmFpbGFibGUgYWdhaW47IGl0J3MgY29uc2lkZXJlZAorICAgIHRvIGJlIGF2YWlsYWJsZSBpZiAuL2NoZWNrIGV4aXRzIHdpdGggMC4KK3NodXRkb3duCisgICAgU2FtZSBhcyBleGl0LCBidXQgd2FpdCB1cCB0byA3IHNlY29uZHMgZm9yIHRoZSBydW5zdig4KSBwcm9jZXNzCisgICAgdG8gdGVybWluYXRlLiBUaGVuIHJlcG9ydCB0aGUgc3RhdHVzIG9yIHRpbWVvdXQuCitmb3JjZS1zdG9wCisgICAgU2FtZSBhcyBkb3duLCBidXQgd2FpdCB1cCB0byA3IHNlY29uZHMgZm9yIHRoZSBzZXJ2aWNlIHRvIGJlY29tZSBkb3duLgorICAgIFRoZW4gcmVwb3J0IHRoZSBzdGF0dXMsIGFuZCBvbiB0aW1lb3V0IHNlbmQgdGhlIHNlcnZpY2UgdGhlIGtpbGwgY29tbWFuZC4KK2ZvcmNlLXJlbG9hZAorICAgIFNlbmQgdGhlIHNlcnZpY2UgdGhlIHRlcm0gYW5kIGNvbnQgY29tbWFuZHMsIGFuZCB3YWl0IHVwIHRvCisgICAgNyBzZWNvbmRzIGZvciB0aGUgc2VydmljZSB0byByZXN0YXJ0LiBUaGVuIHJlcG9ydCB0aGUgc3RhdHVzLAorICAgIGFuZCBvbiB0aW1lb3V0IHNlbmQgdGhlIHNlcnZpY2UgdGhlIGtpbGwgY29tbWFuZC4KK2ZvcmNlLXJlc3RhcnQKKyAgICBTZW5kIHRoZSBzZXJ2aWNlIHRoZSB0ZXJtLCBjb250IGFuZCB1cCBjb21tYW5kcywgYW5kIHdhaXQgdXAgdG8KKyAgICA3IHNlY29uZHMgZm9yIHRoZSBzZXJ2aWNlIHRvIHJlc3RhcnQuIFRoZW4gcmVwb3J0IHRoZSBzdGF0dXMsIGFuZAorICAgIG9uIHRpbWVvdXQgc2VuZCB0aGUgc2VydmljZSB0aGUga2lsbCBjb21tYW5kLiBJZiB0aGUgc2NyaXB0IC4vY2hlY2sKKyAgICBleGlzdHMgaW4gdGhlIHNlcnZpY2UgZGlyZWN0b3J5LCBzdiBydW5zIHRoaXMgc2NyaXB0IHRvIGNoZWNrIHdoZXRoZXIKKyAgICB0aGUgc2VydmljZSBpcyB1cCBhbmQgYXZhaWxhYmxlIGFnYWluOyBpdCdzIGNvbnNpZGVyZWQgdG8gYmUgYXZhaWxhYmxlCisgICAgaWYgLi9jaGVjayBleGl0cyB3aXRoIDAuCitmb3JjZS1zaHV0ZG93bgorICAgIFNhbWUgYXMgZXhpdCwgYnV0IHdhaXQgdXAgdG8gNyBzZWNvbmRzIGZvciB0aGUgcnVuc3YoOCkgcHJvY2VzcyB0bworICAgIHRlcm1pbmF0ZS4gVGhlbiByZXBvcnQgdGhlIHN0YXR1cywgYW5kIG9uIHRpbWVvdXQgc2VuZCB0aGUgc2VydmljZQorICAgIHRoZSBraWxsIGNvbW1hbmQuCisKK0FkZGl0aW9uYWwgQ29tbWFuZHMKKworY2hlY2sKKyAgICBDaGVjayBmb3IgdGhlIHNlcnZpY2UgdG8gYmUgaW4gdGhlIHN0YXRlIHRoYXQncyBiZWVuIHJlcXVlc3RlZC4gV2FpdCB1cCB0bworICAgIDcgc2Vjb25kcyBmb3IgdGhlIHNlcnZpY2UgdG8gcmVhY2ggdGhlIHJlcXVlc3RlZCBzdGF0ZSwgdGhlbiByZXBvcnQKKyAgICB0aGUgc3RhdHVzIG9yIHRpbWVvdXQuIElmIHRoZSByZXF1ZXN0ZWQgc3RhdGUgb2YgdGhlIHNlcnZpY2UgaXMgdXAsCisgICAgYW5kIHRoZSBzY3JpcHQgLi9jaGVjayBleGlzdHMgaW4gdGhlIHNlcnZpY2UgZGlyZWN0b3J5LCBzdiBydW5zCisgICAgdGhpcyBzY3JpcHQgdG8gY2hlY2sgd2hldGhlciB0aGUgc2VydmljZSBpcyB1cCBhbmQgcnVubmluZzsKKyAgICBpdCdzIGNvbnNpZGVyZWQgdG8gYmUgdXAgaWYgLi9jaGVjayBleGl0cyB3aXRoIDAuCisKK09wdGlvbnMKKworLXYKKyAgICB3YWl0IHVwIHRvIDcgc2Vjb25kcyBmb3IgdGhlIGNvbW1hbmQgdG8gdGFrZSBlZmZlY3QuCisgICAgVGhlbiByZXBvcnQgdGhlIHN0YXR1cyBvciB0aW1lb3V0LgorLXcgc2VjCisgICAgT3ZlcnJpZGUgdGhlIGRlZmF1bHQgdGltZW91dCBvZiA3IHNlY29uZHMgd2l0aCBzZWMgc2Vjb25kcy4gSW1wbGllcyAtdi4KKworRW52aXJvbm1lbnQKKworU1ZESVIKKyAgICBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJFNWRElSIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBzZXJ2aWNlcyBkaXJlY3RvcnkKKyAgICAvdmFyL3NlcnZpY2UuCitTVldBSVQKKyAgICBUaGUgZW52aXJvbm1lbnQgdmFyaWFibGUgJFNWV0FJVCBvdmVycmlkZXMgdGhlIGRlZmF1bHQgNyBzZWNvbmRzIHRvIHdhaXQKKyAgICBmb3IgYSBjb21tYW5kIHRvIHRha2UgZWZmZWN0LiBJdCBpcyBvdmVycmlkZGVuIGJ5IHRoZSAtdyBvcHRpb24uCisKK0V4aXQgQ29kZXMKKyAgICBzdiBleGl0cyAwLCBpZiB0aGUgY29tbWFuZCB3YXMgc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gYWxsIHNlcnZpY2VzLCBhbmQsCisgICAgaWYgaXQgd2FzIHRvbGQgdG8gd2FpdCwgdGhlIGNvbW1hbmQgaGFzIHRha2VuIGVmZmVjdCB0byBhbGwgc2VydmljZXMuCisKKyAgICBGb3IgZWFjaCBzZXJ2aWNlIHRoYXQgY2F1c2VkIGFuIGVycm9yIChlLmcuIHRoZSBkaXJlY3RvcnkgaXMgbm90CisgICAgY29udHJvbGxlZCBieSBhIHJ1bnN2KDgpIHByb2Nlc3MsIG9yIHN2IHRpbWVkIG91dCB3aGlsZSB3YWl0aW5nKSwKKyAgICBzdiBpbmNyZWFzZXMgdGhlIGV4aXQgY29kZSBieSBvbmUgYW5kIGV4aXRzIG5vbiB6ZXJvLiBUaGUgbWF4aW11bQorICAgIGlzIDk5LiBzdiBleGl0cyAxMDAgb24gZXJyb3IuCisqLworCisvKiBCdXN5Ym94ZWQgYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4gKi8KKy8qIFRPRE86IGRlcGVuZHMgb24gcnVuaXRfbGliLmMgLSByZXZpZXcgYW5kIHJlZHVjZS9lbGltaW5hdGUgKi8KKworLy91c2FnZTojZGVmaW5lIHN2X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXZdIFstdyBTRUNdIENNRCBTRVJWSUNFX0RJUi4uLiIKKy8vdXNhZ2U6I2RlZmluZSBzdl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNvbnRyb2wgc2VydmljZXMgbW9uaXRvcmVkIGJ5IHJ1bnN2IHN1cGVydmlzb3IuXG4iCisvL3VzYWdlOiAgICAgICAiQ29tbWFuZHMgKG9ubHkgZmlyc3QgY2hhcmFjdGVyIGlzIGVub3VnaCk6XG4iCisvL3VzYWdlOiAgICAgICAiXG4iCisvL3VzYWdlOiAgICAgICAic3RhdHVzOiBxdWVyeSBzZXJ2aWNlIHN0YXR1c1xuIgorLy91c2FnZTogICAgICAgInVwOiBpZiBzZXJ2aWNlIGlzbid0IHJ1bm5pbmcsIHN0YXJ0IGl0LiBJZiBzZXJ2aWNlIHN0b3BzLCByZXN0YXJ0IGl0XG4iCisvL3VzYWdlOiAgICAgICAib25jZTogbGlrZSAndXAnLCBidXQgaWYgc2VydmljZSBzdG9wcywgZG9uJ3QgcmVzdGFydCBpdFxuIgorLy91c2FnZTogICAgICAgImRvd246IHNlbmQgVEVSTSBhbmQgQ09OVCBzaWduYWxzLiBJZiAuL3J1biBleGl0cywgc3RhcnQgLi9maW5pc2hcbiIKKy8vdXNhZ2U6ICAgICAgICIJaWYgaXQgZXhpc3RzLiBBZnRlciBpdCBzdG9wcywgZG9uJ3QgcmVzdGFydCBzZXJ2aWNlXG4iCisvL3VzYWdlOiAgICAgICAiZXhpdDogc2VuZCBURVJNIGFuZCBDT05UIHNpZ25hbHMgdG8gc2VydmljZSBhbmQgbG9nIHNlcnZpY2UuIElmIHRoZXkgZXhpdCxcbiIKKy8vdXNhZ2U6ICAgICAgICIJcnVuc3YgZXhpdHMgdG9vXG4iCisvL3VzYWdlOiAgICAgICAicGF1c2UsIGNvbnQsIGh1cCwgYWxhcm0sIGludGVycnVwdCwgcXVpdCwgMSwgMiwgdGVybSwga2lsbDogc2VuZFxuIgorLy91c2FnZTogICAgICAgIlNUT1AsIENPTlQsIEhVUCwgQUxSTSwgSU5ULCBRVUlULCBVU1IxLCBVU1IyLCBURVJNLCBLSUxMIHNpZ25hbCB0byBzZXJ2aWNlIgorCisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInJ1bml0X2xpYi5oIgorCitzdHJ1Y3QgZ2xvYmFscyB7CisJY29uc3QgY2hhciAqYWN0czsKKwljaGFyICoqc2VydmljZTsKKwl1bnNpZ25lZCByYzsKKy8qICJCZXJuc3RlaW4iIHRpbWUgZm9ybWF0OiB1bml4ICsgMHg0MDAwMDAwMDAwMDAwMDBhVUxMICovCisJdWludDY0X3QgdHN0YXJ0LCB0bm93OworCXN2c3RhdHVzX3Qgc3ZzdGF0dXM7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBhY3RzICAgICAgICAgKEcuYWN0cyAgICAgICAgKQorI2RlZmluZSBzZXJ2aWNlICAgICAgKEcuc2VydmljZSAgICAgKQorI2RlZmluZSByYyAgICAgICAgICAgKEcucmMgICAgICAgICAgKQorI2RlZmluZSB0c3RhcnQgICAgICAgKEcudHN0YXJ0ICAgICAgKQorI2RlZmluZSB0bm93ICAgICAgICAgKEcudG5vdyAgICAgICAgKQorI2RlZmluZSBzdnN0YXR1cyAgICAgKEcuc3ZzdGF0dXMgICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IH0gd2hpbGUgKDApCisKKworI2RlZmluZSBzdHJfZXF1YWwocyx0KSAoIXN0cmNtcCgocyksICh0KSkpCisKKworc3RhdGljIHZvaWQgZmF0YWxfY2Fubm90KGNvbnN0IGNoYXIgKm0xKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGZhdGFsX2Nhbm5vdChjb25zdCBjaGFyICptMSkKK3sKKwliYl9wZXJyb3JfbXNnKCJmYXRhbDogY2FuJ3QgJXMiLCBtMSk7CisJX2V4aXQoMTUxKTsKK30KKworc3RhdGljIHZvaWQgb3V0KGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKm0xKQoreworCXByaW50ZigiJXMlczogJXMiLCBwLCAqc2VydmljZSwgbTEpOworCWlmIChlcnJubykgeworCQlwcmludGYoIjogJXMiLCBzdHJlcnJvcihlcnJubykpOworCX0KKwliYl9wdXRjaGFyKCdcbicpOyAvKiB3aWxsIGFsc28gZmx1c2ggdGhlIG91dHB1dCAqLworfQorCisjZGVmaW5lIFdBUk4gICAgIndhcm5pbmc6ICIKKyNkZWZpbmUgT0sgICAgICAib2s6ICIKKworc3RhdGljIHZvaWQgZmFpbChjb25zdCBjaGFyICptMSkKK3sKKwkrK3JjOworCW91dCgiZmFpbDogIiwgbTEpOworfQorc3RhdGljIHZvaWQgZmFpbHgoY29uc3QgY2hhciAqbTEpCit7CisJZXJybm8gPSAwOworCWZhaWwobTEpOworfQorc3RhdGljIHZvaWQgd2Fybihjb25zdCBjaGFyICptMSkKK3sKKwkrK3JjOworCS8qICJ3YXJuaW5nOiA8c2VydmljZT46IDxtMT5cbiIgKi8KKwlvdXQoIndhcm5pbmc6ICIsIG0xKTsKK30KK3N0YXRpYyB2b2lkIG9rKGNvbnN0IGNoYXIgKm0xKQoreworCWVycm5vID0gMDsKKwlvdXQoT0ssIG0xKTsKK30KKworc3RhdGljIGludCBzdnN0YXR1c19nZXQodm9pZCkKK3sKKwlpbnQgZmQsIHI7CisKKwlmZCA9IG9wZW4oInN1cGVydmlzZS9vayIsIE9fV1JPTkxZfE9fTkRFTEFZKTsKKwlpZiAoZmQgPT0gLTEpIHsKKwkJaWYgKGVycm5vID09IEVOT0RFVikgeworCQkJKmFjdHMgPT0gJ3gnID8gb2soInJ1bnN2IG5vdCBydW5uaW5nIikKKwkJCSAgICAgICAgICAgICA6IGZhaWx4KCJydW5zdiBub3QgcnVubmluZyIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJd2FybigiY2FuJ3Qgb3BlbiBzdXBlcnZpc2Uvb2siKTsKKwkJcmV0dXJuIC0xOworCX0KKwljbG9zZShmZCk7CisJZmQgPSBvcGVuKCJzdXBlcnZpc2Uvc3RhdHVzIiwgT19SRE9OTFl8T19OREVMQVkpOworCWlmIChmZCA9PSAtMSkgeworCQl3YXJuKCJjYW4ndCBvcGVuIHN1cGVydmlzZS9zdGF0dXMiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyID0gcmVhZChmZCwgJnN2c3RhdHVzLCAyMCk7CisJY2xvc2UoZmQpOworCXN3aXRjaCAocikgeworCWNhc2UgMjA6CisJCWJyZWFrOworCWNhc2UgLTE6CisJCXdhcm4oImNhbid0IHJlYWQgc3VwZXJ2aXNlL3N0YXR1cyIpOworCQlyZXR1cm4gLTE7CisJZGVmYXVsdDoKKwkJZXJybm8gPSAwOworCQl3YXJuKCJjYW4ndCByZWFkIHN1cGVydmlzZS9zdGF0dXM6IGJhZCBmb3JtYXQiKTsKKwkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIHN2c3RhdHVzX3ByaW50KGNvbnN0IGNoYXIgKm0pCit7CisJaW50IGRpZmY7CisJaW50IHBpZDsKKwlpbnQgbm9ybWFsbHl1cCA9IDA7CisJc3RydWN0IHN0YXQgczsKKwl1aW50NjRfdCB0aW1lc3RhbXA7CisKKwlpZiAoc3RhdCgiZG93biIsICZzKSA9PSAtMSkgeworCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisJCQliYl9wZXJyb3JfbXNnKFdBUk4iY2FuJ3Qgc3RhdCAlcy9kb3duIiwgKnNlcnZpY2UpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJbm9ybWFsbHl1cCA9IDE7CisJfQorCXBpZCA9IFNXQVBfTEUzMihzdnN0YXR1cy5waWRfbGUzMik7CisJdGltZXN0YW1wID0gU1dBUF9CRTY0KHN2c3RhdHVzLnRpbWVfYmU2NCk7CisJaWYgKHBpZCkgeworCQlzd2l0Y2ggKHN2c3RhdHVzLnJ1bl9vcl9maW5pc2gpIHsKKwkJY2FzZSAxOiBwcmludGYoInJ1bjogIik7IGJyZWFrOworCQljYXNlIDI6IHByaW50ZigiZmluaXNoOiAiKTsgYnJlYWs7CisJCX0KKwkJcHJpbnRmKCIlczogKHBpZCAlZCkgIiwgbSwgcGlkKTsKKwl9IGVsc2UgeworCQlwcmludGYoImRvd246ICVzOiAiLCBtKTsKKwl9CisJZGlmZiA9IHRub3cgLSB0aW1lc3RhbXA7CisJcHJpbnRmKCIldXMiLCAoZGlmZiA8IDAgPyAwIDogZGlmZikpOworCWlmIChwaWQpIHsKKwkJaWYgKCFub3JtYWxseXVwKSBwcmludGYoIiwgbm9ybWFsbHkgZG93biIpOworCQlpZiAoc3ZzdGF0dXMucGF1c2VkKSBwcmludGYoIiwgcGF1c2VkIik7CisJCWlmIChzdnN0YXR1cy53YW50ID09ICdkJykgcHJpbnRmKCIsIHdhbnQgZG93biIpOworCQlpZiAoc3ZzdGF0dXMuZ290X3Rlcm0pIHByaW50ZigiLCBnb3QgVEVSTSIpOworCX0gZWxzZSB7CisJCWlmIChub3JtYWxseXVwKSBwcmludGYoIiwgbm9ybWFsbHkgdXAiKTsKKwkJaWYgKHN2c3RhdHVzLndhbnQgPT0gJ3UnKSBwcmludGYoIiwgd2FudCB1cCIpOworCX0KKwlyZXR1cm4gcGlkID8gMSA6IDI7Cit9CisKK3N0YXRpYyBpbnQgc3RhdHVzKGNvbnN0IGNoYXIgKnVudXNlZCBVTlVTRURfUEFSQU0pCit7CisJaW50IHI7CisKKwlpZiAoc3ZzdGF0dXNfZ2V0KCkgPD0gMCkKKwkJcmV0dXJuIDA7CisKKwlyID0gc3ZzdGF0dXNfcHJpbnQoKnNlcnZpY2UpOworCWlmIChjaGRpcigibG9nIikgPT0gLTEpIHsKKwkJaWYgKGVycm5vICE9IEVOT0VOVCkgeworCQkJcHJpbnRmKCI7IGxvZzogIldBUk4iY2FuJ3QgY2hhbmdlIHRvIGxvZyBzZXJ2aWNlIGRpcmVjdG9yeTogJXMiLAorCQkJCQlzdHJlcnJvcihlcnJubykpOworCQl9CisJfSBlbHNlIGlmIChzdnN0YXR1c19nZXQoKSkgeworCQlwcmludGYoIjsgIik7CisJCXN2c3RhdHVzX3ByaW50KCJsb2ciKTsKKwl9CisJYmJfcHV0Y2hhcignXG4nKTsgLyogd2lsbCBhbHNvIGZsdXNoIHRoZSBvdXRwdXQgKi8KKwlyZXR1cm4gcjsKK30KKworc3RhdGljIGludCBjaGVja3NjcmlwdCh2b2lkKQoreworCWNoYXIgKnByb2dbMl07CisJc3RydWN0IHN0YXQgczsKKwlpbnQgcGlkLCB3OworCisJaWYgKHN0YXQoImNoZWNrIiwgJnMpID09IC0xKSB7CisJCWlmIChlcnJubyA9PSBFTk9FTlQpIHJldHVybiAxOworCQliYl9wZXJyb3JfbXNnKFdBUk4iY2FuJ3Qgc3RhdCAlcy9jaGVjayIsICpzZXJ2aWNlKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIGlmICghKHMuc3RfbW9kZSAmIFNfSVhVU1IpKSByZXR1cm4gMTsgKi8KKwlwcm9nWzBdID0gKGNoYXIqKSIuL2NoZWNrIjsKKwlwcm9nWzFdID0gTlVMTDsKKwlwaWQgPSBzcGF3bihwcm9nKTsKKwlpZiAocGlkIDw9IDApIHsKKwkJYmJfcGVycm9yX21zZyhXQVJOImNhbid0ICVzIGNoaWxkICVzL2NoZWNrIiwgInJ1biIsICpzZXJ2aWNlKTsKKwkJcmV0dXJuIDA7CisJfQorCXdoaWxlIChzYWZlX3dhaXRwaWQocGlkLCAmdywgMCkgPT0gLTEpIHsKKwkJYmJfcGVycm9yX21zZyhXQVJOImNhbid0ICVzIGNoaWxkICVzL2NoZWNrIiwgIndhaXQgZm9yIiwgKnNlcnZpY2UpOworCQlyZXR1cm4gMDsKKwl9CisJcmV0dXJuIFdFWElUU1RBVFVTKHcpID09IDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2soY29uc3QgY2hhciAqYSkKK3sKKwlpbnQgcjsKKwl1bnNpZ25lZCBwaWRfbGUzMjsKKwl1aW50NjRfdCB0aW1lc3RhbXA7CisKKwlyID0gc3ZzdGF0dXNfZ2V0KCk7CisJaWYgKHIgPT0gLTEpCisJCXJldHVybiAtMTsKKwlpZiAociA9PSAwKSB7CisJCWlmICgqYSA9PSAneCcpCisJCQlyZXR1cm4gMTsKKwkJcmV0dXJuIC0xOworCX0KKwlwaWRfbGUzMiA9IHN2c3RhdHVzLnBpZF9sZTMyOworCXN3aXRjaCAoKmEpIHsKKwljYXNlICd4JzoKKwkJcmV0dXJuIDA7CisJY2FzZSAndSc6CisJCWlmICghcGlkX2xlMzIgfHwgc3ZzdGF0dXMucnVuX29yX2ZpbmlzaCAhPSAxKSByZXR1cm4gMDsKKwkJaWYgKCFjaGVja3NjcmlwdCgpKSByZXR1cm4gMDsKKwkJYnJlYWs7CisJY2FzZSAnZCc6CisJCWlmIChwaWRfbGUzMikgcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgJ2MnOgorCQlpZiAocGlkX2xlMzIgJiYgIWNoZWNrc2NyaXB0KCkpIHJldHVybiAwOworCQlicmVhazsKKwljYXNlICd0JzoKKwkJaWYgKCFwaWRfbGUzMiAmJiBzdnN0YXR1cy53YW50ID09ICdkJykgYnJlYWs7CisJCXRpbWVzdGFtcCA9IFNXQVBfQkU2NChzdnN0YXR1cy50aW1lX2JlNjQpOworCQlpZiAoKHRzdGFydCA+IHRpbWVzdGFtcCkgfHwgIXBpZF9sZTMyIHx8IHN2c3RhdHVzLmdvdF90ZXJtIHx8ICFjaGVja3NjcmlwdCgpKQorCQkJcmV0dXJuIDA7CisJCWJyZWFrOworCWNhc2UgJ28nOgorCQl0aW1lc3RhbXAgPSBTV0FQX0JFNjQoc3ZzdGF0dXMudGltZV9iZTY0KTsKKwkJaWYgKCghcGlkX2xlMzIgJiYgdHN0YXJ0ID4gdGltZXN0YW1wKSB8fCAocGlkX2xlMzIgJiYgc3ZzdGF0dXMud2FudCAhPSAnZCcpKQorCQkJcmV0dXJuIDA7CisJfQorCXByaW50ZihPSyk7CisJc3ZzdGF0dXNfcHJpbnQoKnNlcnZpY2UpOworCWJiX3B1dGNoYXIoJ1xuJyk7IC8qIHdpbGwgYWxzbyBmbHVzaCB0aGUgb3V0cHV0ICovCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgY29udHJvbChjb25zdCBjaGFyICphKQoreworCWludCBmZCwgciwgbDsKKworLyogSXMgaXQgYW4gb3B0aW1pemF0aW9uPworICAgSXQgY2F1c2VzIHByb2JsZW1zIHdpdGggInN2IG8gU1JWOyAuLi47IHN2IGQgU1JWIgorICAgKCdkJyBpcyBub3QgcGFzc2VkIHRvIFNSViBiZWNhdXNlIGl0cyAud2FudCA9PSAnZCcpOgorCWlmIChzdnN0YXR1c19nZXQoKSA8PSAwKQorCQlyZXR1cm4gLTE7CisJaWYgKHN2c3RhdHVzLndhbnQgPT0gKmEpCisJCXJldHVybiAwOworKi8KKwlmZCA9IG9wZW4oInN1cGVydmlzZS9jb250cm9sIiwgT19XUk9OTFl8T19OREVMQVkpOworCWlmIChmZCA9PSAtMSkgeworCQlpZiAoZXJybm8gIT0gRU5PREVWKQorCQkJd2FybigiY2FuJ3Qgb3BlbiBzdXBlcnZpc2UvY29udHJvbCIpOworCQllbHNlCisJCQkqYSA9PSAneCcgPyBvaygicnVuc3Ygbm90IHJ1bm5pbmciKSA6IGZhaWx4KCJydW5zdiBub3QgcnVubmluZyIpOworCQlyZXR1cm4gLTE7CisJfQorCWwgPSBzdHJsZW4oYSk7CisJciA9IHdyaXRlKGZkLCBhLCBsKTsKKwljbG9zZShmZCk7CisJaWYgKHIgIT0gbCkgeworCQl3YXJuKCJjYW4ndCB3cml0ZSB0byBzdXBlcnZpc2UvY29udHJvbCIpOworCQlyZXR1cm4gLTE7CisJfQorCXJldHVybiAxOworfQorCitpbnQgc3ZfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHN2X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICp4OworCWNoYXIgKmFjdGlvbjsKKwljb25zdCBjaGFyICp2YXJzZXJ2aWNlID0gQ09ORklHX1NWX0RFRkFVTFRfU0VSVklDRV9ESVI7CisJdW5zaWduZWQgd2FpdHNlYyA9IDc7CisJc21hbGxpbnQga2xsID0gMDsKKwlpbnQgdmVyYm9zZSA9IDA7CisJaW50ICgqYWN0KShjb25zdCBjaGFyKik7CisJaW50ICgqY2JrKShjb25zdCBjaGFyKik7CisJaW50IGN1cmRpcjsKKworCUlOSVRfRygpOworCisJeGZ1bmNfZXJyb3JfcmV0dmFsID0gMTAwOworCisJeCA9IGdldGVudigiU1ZESVIiKTsKKwlpZiAoeCkgdmFyc2VydmljZSA9IHg7CisJeCA9IGdldGVudigiU1ZXQUlUIik7CisJaWYgKHgpIHdhaXRzZWMgPSB4YXRvdSh4KTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIncrOnZ2IjsgLyogLXcgTiwgLXYgaXMgYSBjb3VudGVyICovCisJZ2V0b3B0MzIoYXJndiwgInc6diIsICZ3YWl0c2VjLCAmdmVyYm9zZSk7CisJYXJndiArPSBvcHRpbmQ7CisJYWN0aW9uID0gKmFyZ3YrKzsKKwlpZiAoIWFjdGlvbiB8fCAhKmFyZ3YpIGJiX3Nob3dfdXNhZ2UoKTsKKworCXRub3cgPSB0aW1lKE5VTEwpICsgMHg0MDAwMDAwMDAwMDAwMDBhVUxMOworCXRzdGFydCA9IHRub3c7CisJY3VyZGlyID0gb3BlbigiLiIsIE9fUkRPTkxZfE9fTkRFTEFZKTsKKwlpZiAoY3VyZGlyID09IC0xKQorCQlmYXRhbF9jYW5ub3QoIm9wZW4gY3VycmVudCBkaXJlY3RvcnkiKTsKKworCWFjdCA9ICZjb250cm9sOworCWFjdHMgPSAicyI7CisJY2JrID0gJmNoZWNrOworCisJc3dpdGNoICgqYWN0aW9uKSB7CisJY2FzZSAneCc6CisJY2FzZSAnZSc6CisJCWFjdHMgPSAieCI7CisJCWlmICghdmVyYm9zZSkgY2JrID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSAnWCc6CisJY2FzZSAnRSc6CisJCWFjdHMgPSAieCI7CisJCWtsbCA9IDE7CisJCWJyZWFrOworCWNhc2UgJ0QnOgorCQlhY3RzID0gImQiOworCQlrbGwgPSAxOworCQlicmVhazsKKwljYXNlICdUJzoKKwkJYWN0cyA9ICJ0YyI7CisJCWtsbCA9IDE7CisJCWJyZWFrOworCWNhc2UgJ2MnOgorCQlpZiAoc3RyX2VxdWFsKGFjdGlvbiwgImNoZWNrIikpIHsKKwkJCWFjdCA9IE5VTEw7CisJCQlhY3RzID0gImMiOworCQkJYnJlYWs7CisJCX0KKwljYXNlICd1JzogY2FzZSAnZCc6IGNhc2UgJ28nOiBjYXNlICd0JzogY2FzZSAncCc6IGNhc2UgJ2gnOgorCWNhc2UgJ2EnOiBjYXNlICdpJzogY2FzZSAnayc6IGNhc2UgJ3EnOiBjYXNlICcxJzogY2FzZSAnMic6CisJCWFjdGlvblsxXSA9ICdcMCc7CisJCWFjdHMgPSBhY3Rpb247CisJCWlmICghdmVyYm9zZSkgY2JrID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSAncyc6CisJCWlmIChzdHJfZXF1YWwoYWN0aW9uLCAic2h1dGRvd24iKSkgeworCQkJYWN0cyA9ICJ4IjsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzdHJfZXF1YWwoYWN0aW9uLCAic3RhcnQiKSkgeworCQkJYWN0cyA9ICJ1IjsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzdHJfZXF1YWwoYWN0aW9uLCAic3RvcCIpKSB7CisJCQlhY3RzID0gImQiOworCQkJYnJlYWs7CisJCX0KKwkJLyogInN0YXR1cyIgKi8KKwkJYWN0ID0gJnN0YXR1czsKKwkJY2JrID0gTlVMTDsKKwkJYnJlYWs7CisJY2FzZSAncic6CisJCWlmIChzdHJfZXF1YWwoYWN0aW9uLCAicmVzdGFydCIpKSB7CisJCQlhY3RzID0gInRjdSI7CisJCQlicmVhazsKKwkJfQorCQliYl9zaG93X3VzYWdlKCk7CisJY2FzZSAnZic6CisJCWlmIChzdHJfZXF1YWwoYWN0aW9uLCAiZm9yY2UtcmVsb2FkIikpIHsKKwkJCWFjdHMgPSAidGMiOworCQkJa2xsID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzdHJfZXF1YWwoYWN0aW9uLCAiZm9yY2UtcmVzdGFydCIpKSB7CisJCQlhY3RzID0gInRjdSI7CisJCQlrbGwgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHN0cl9lcXVhbChhY3Rpb24sICJmb3JjZS1zaHV0ZG93biIpKSB7CisJCQlhY3RzID0gIngiOworCQkJa2xsID0gMTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzdHJfZXF1YWwoYWN0aW9uLCAiZm9yY2Utc3RvcCIpKSB7CisJCQlhY3RzID0gImQiOworCQkJa2xsID0gMTsKKwkJCWJyZWFrOworCQl9CisJZGVmYXVsdDoKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCXNlcnZpY2UgPSBhcmd2OworCXdoaWxlICgoeCA9ICpzZXJ2aWNlKSAhPSBOVUxMKSB7CisJCWlmICh4WzBdICE9ICcvJyAmJiB4WzBdICE9ICcuJykgeworCQkJaWYgKGNoZGlyKHZhcnNlcnZpY2UpID09IC0xKQorCQkJCWdvdG8gY2hkaXJfZmFpbGVkXzA7CisJCX0KKwkJaWYgKGNoZGlyKHgpID09IC0xKSB7CisgY2hkaXJfZmFpbGVkXzA6CisJCQlmYWlsKCJjYW4ndCBjaGFuZ2UgdG8gc2VydmljZSBkaXJlY3RvcnkiKTsKKwkJCWdvdG8gbnVsbGlmeV9zZXJ2aWNlXzA7CisJCX0KKwkJaWYgKGFjdCAmJiAoYWN0KGFjdHMpID09IC0xKSkgeworIG51bGxpZnlfc2VydmljZV8wOgorCQkJKnNlcnZpY2UgPSAoY2hhciopIC0xTDsgLyogImRlYWQiICovCisJCX0KKwkJaWYgKGZjaGRpcihjdXJkaXIpID09IC0xKQorCQkJZmF0YWxfY2Fubm90KCJjaGFuZ2UgdG8gb3JpZ2luYWwgZGlyZWN0b3J5Iik7CisJCXNlcnZpY2UrKzsKKwl9CisKKwlpZiAoY2JrKSB3aGlsZSAoMSkgeworCQlpbnQgd2FudF9leGl0OworCQlpbnQgZGlmZjsKKworCQlkaWZmID0gdG5vdyAtIHRzdGFydDsKKwkJc2VydmljZSA9IGFyZ3Y7CisJCXdhbnRfZXhpdCA9IDE7CisJCXdoaWxlICgoeCA9ICpzZXJ2aWNlKSAhPSBOVUxMKSB7CisJCQlpZiAoeCA9PSAoY2hhciopIC0xTCkgLyogImRlYWQiICovCisJCQkJZ290byBuZXh0OworCQkJaWYgKHhbMF0gIT0gJy8nICYmIHhbMF0gIT0gJy4nKSB7CisJCQkJaWYgKGNoZGlyKHZhcnNlcnZpY2UpID09IC0xKQorCQkJCQlnb3RvIGNoZGlyX2ZhaWxlZDsKKwkJCX0KKwkJCWlmIChjaGRpcih4KSA9PSAtMSkgeworIGNoZGlyX2ZhaWxlZDoKKwkJCQlmYWlsKCJjYW4ndCBjaGFuZ2UgdG8gc2VydmljZSBkaXJlY3RvcnkiKTsKKwkJCQlnb3RvIG51bGxpZnlfc2VydmljZTsKKwkJCX0KKwkJCWlmIChjYmsoYWN0cykgIT0gMCkKKwkJCQlnb3RvIG51bGxpZnlfc2VydmljZTsKKwkJCXdhbnRfZXhpdCA9IDA7CisJCQlpZiAoZGlmZiA+PSB3YWl0c2VjKSB7CisJCQkJcHJpbnRmKGtsbCA/ICJraWxsOiAiIDogInRpbWVvdXQ6ICIpOworCQkJCWlmIChzdnN0YXR1c19nZXQoKSA+IDApIHsKKwkJCQkJc3ZzdGF0dXNfcHJpbnQoeCk7CisJCQkJCSsrcmM7CisJCQkJfQorCQkJCWJiX3B1dGNoYXIoJ1xuJyk7IC8qIHdpbGwgYWxzbyBmbHVzaCB0aGUgb3V0cHV0ICovCisJCQkJaWYgKGtsbCkKKwkJCQkJY29udHJvbCgiayIpOworIG51bGxpZnlfc2VydmljZToKKwkJCQkqc2VydmljZSA9IChjaGFyKikgLTFMOyAvKiAiZGVhZCIgKi8KKwkJCX0KKwkJCWlmIChmY2hkaXIoY3VyZGlyKSA9PSAtMSkKKwkJCQlmYXRhbF9jYW5ub3QoImNoYW5nZSB0byBvcmlnaW5hbCBkaXJlY3RvcnkiKTsKKyBuZXh0OgorCQkJc2VydmljZSsrOworCQl9CisJCWlmICh3YW50X2V4aXQpIGJyZWFrOworCQl1c2xlZXAoNDIwMDAwKTsKKwkJdG5vdyA9IHRpbWUoTlVMTCkgKyAweDQwMDAwMDAwMDAwMDAwMGFVTEw7CisJfQorCXJldHVybiByYyA+IDk5ID8gOTkgOiByYzsKK30KZGlmZiAtLWdpdCBhL3J1bml0L3N2bG9nZC5jIGIvcnVuaXQvc3Zsb2dkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4MGI5YQotLS0gL2Rldi9udWxsCisrKyBiL3J1bml0L3N2bG9nZC5jCkBAIC0wLDAgKzEsMTIyNiBAQAorLyoKK0NvcHlyaWdodCAoYykgMjAwMS0yMDA2LCBHZXJyaXQgUGFwZQorQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Cittb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKworICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICAgMy4gVGhlIG5hbWUgb2YgdGhlIGF1dGhvciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgICBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRAorV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YKK01FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PCitFVkVOVCBTSEFMTCBUSEUgQVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCitTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sCitQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsKK09SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IKK09USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYKK0FEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorKi8KKworLyogQnVzeWJveGVkIGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+ICovCisvKiBUT0RPOiBkZXBlbmRzIG9uIHJ1bml0X2xpYi5jIC0gcmV2aWV3IGFuZCByZWR1Y2UvZWxpbWluYXRlICovCisKKy8qCitDb25maWcgZmlsZXMKKworT24gc3RhcnR1cCwgYW5kIGFmdGVyIHJlY2VpdmluZyBhIEhVUCBzaWduYWwsIHN2bG9nZCBjaGVja3MgZm9yIGVhY2gKK2xvZyBkaXJlY3RvcnkgbG9nIGlmIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgbG9nL2NvbmZpZyBleGlzdHMsCithbmQgaWYgc28sIHJlYWRzIHRoZSBmaWxlIGxpbmUgYnkgbGluZSBhbmQgYWRqdXN0cyBjb25maWd1cmF0aW9uCitmb3IgbG9nIGFzIGZvbGxvd3M6CisKK0lmIHRoZSBsaW5lIGlzIGVtcHR5LCBvciBzdGFydHMgd2l0aCBhICMsIGl0IGlzIGlnbm9yZWQuIEEgbGluZQorb2YgdGhlIGZvcm0KKworc3NpemUKKyAgICBzZXRzIHRoZSBtYXhpbXVtIGZpbGUgc2l6ZSBvZiBjdXJyZW50IHdoZW4gc3Zsb2dkIHNob3VsZCByb3RhdGUKKyAgICB0aGUgY3VycmVudCBsb2cgZmlsZSB0byBzaXplIGJ5dGVzLiBEZWZhdWx0IGlzIDEwMDAwMDAuCisgICAgSWYgc2l6ZSBpcyB6ZXJvLCBzdmxvZ2QgZG9lc250IHJvdGF0ZSBsb2cgZmlsZXMKKyAgICBZb3Ugc2hvdWxkIHNldCBzaXplIHRvIGF0IGxlYXN0ICgyICogbGVuKS4KK25udW0KKyAgICBzZXRzIHRoZSBudW1iZXIgb2Ygb2xkIGxvZyBmaWxlcyBzdmxvZ2Qgc2hvdWxkIG1haW50YWluIHRvIG51bS4KKyAgICBJZiBzdmxvZ2Qgc2VlcyBtb3JlIHRoYXQgbnVtIG9sZCBsb2cgZmlsZXMgaW4gbG9nIGFmdGVyIGxvZyBmaWxlCisgICAgcm90YXRpb24sIGl0IGRlbGV0ZXMgdGhlIG9sZGVzdCBvbmUuIERlZmF1bHQgaXMgMTAuCisgICAgSWYgbnVtIGlzIHplcm8sIHN2bG9nZCBkb2VzbnQgcmVtb3ZlIG9sZCBsb2cgZmlsZXMuCitObWluCisgICAgc2V0cyB0aGUgbWluaW11bSBudW1iZXIgb2Ygb2xkIGxvZyBmaWxlcyBzdmxvZ2Qgc2hvdWxkIG1haW50YWluCisgICAgdG8gbWluLiBtaW4gbXVzdCBiZSBsZXNzIHRoYW4gbnVtLiBJZiBtaW4gaXMgc2V0LCBhbmQgc3Zsb2dkCisgICAgY2Fubm90IHdyaXRlIHRvIGN1cnJlbnQgYmVjYXVzZSB0aGUgZmlsZXN5c3RlbSBpcyBmdWxsLAorICAgIGFuZCBpdCBzZWVzIG1vcmUgdGhhbiBtaW4gb2xkIGxvZyBmaWxlcywgaXQgZGVsZXRlcyB0aGUgb2xkZXN0IG9uZS4KK3R0aW1lb3V0CisgICAgc2V0cyB0aGUgbWF4aW11bSBhZ2Ugb2YgdGhlIGN1cnJlbnQgbG9nIGZpbGUgd2hlbiBzdmxvZ2Qgc2hvdWxkCisgICAgcm90YXRlIHRoZSBjdXJyZW50IGxvZyBmaWxlIHRvIHRpbWVvdXQgc2Vjb25kcy4gSWYgY3VycmVudAorICAgIGlzIHRpbWVvdXQgc2Vjb25kcyBvbGQsIGFuZCBpcyBub3QgZW1wdHksIHN2bG9nZCBmb3JjZXMgbG9nIGZpbGUgcm90YXRpb24uCishcHJvY2Vzc29yCisgICAgdGVsbHMgc3Zsb2dkIHRvIGZlZWQgZWFjaCByZWNlbnQgbG9nIGZpbGUgdGhyb3VnaCBwcm9jZXNzb3IKKyAgICAoc2VlIGFib3ZlKSBvbiBsb2cgZmlsZSByb3RhdGlvbi4gQnkgZGVmYXVsdCBsb2cgZmlsZXMgYXJlIG5vdCBwcm9jZXNzZWQuCit1YS5iLmMuZFs6cG9ydF0KKyAgICB0ZWxscyBzdmxvZ2QgdG8gdHJhbnNtaXQgdGhlIGZpcnN0IGxlbiBjaGFyYWN0ZXJzIG9mIHNlbGVjdGVkCisgICAgbG9nIG1lc3NhZ2VzIHRvIHRoZSBJUCBhZGRyZXNzIGEuYi5jLmQsIHBvcnQgbnVtYmVyIHBvcnQuCisgICAgSWYgcG9ydCBpc250IHNldCwgdGhlIGRlZmF1bHQgcG9ydCBmb3Igc3lzbG9nIGlzIHVzZWQgKDUxNCkuCisgICAgbGVuIGNhbiBiZSBzZXQgdGhyb3VnaCB0aGUgLWwgb3B0aW9uLCBzZWUgYmVsb3cuIElmIHN2bG9nZAorICAgIGhhcyB0cm91YmxlIHNlbmRpbmcgdWRwIHBhY2tldHMsIGl0IHdyaXRlcyBlcnJvciBtZXNzYWdlcworICAgIHRvIHRoZSBsb2cgZGlyZWN0b3J5LiBBdHRlbnRpb246IGxvZ2dpbmcgdGhyb3VnaCB1ZHAgaXMgdW5yZWxpYWJsZSwKKyAgICBhbmQgc2hvdWxkIGJlIHVzZWQgaW4gcHJpdmF0ZSBuZXR3b3JrcyBvbmx5LgorVWEuYi5jLmRbOnBvcnRdCisgICAgaXMgdGhlIHNhbWUgYXMgdGhlIHUgbGluZSBhYm92ZSwgYnV0IHRoZSBsb2cgbWVzc2FnZXMgYXJlIG5vIGxvbmdlcgorICAgIHdyaXR0ZW4gdG8gdGhlIGxvZyBkaXJlY3RvcnksIGJ1dCB0cmFuc21pdHRlZCB0aHJvdWdoIHVkcCBvbmx5LgorICAgIEVycm9yIG1lc3NhZ2VzIGZyb20gc3Zsb2dkIGNvbmNlcm5pbmcgc2VuZGluZyB1ZHAgcGFja2FnZXMgc3RpbGwgZ28KKyAgICB0byB0aGUgbG9nIGRpcmVjdG9yeS4KK3BwcmVmaXgKKyAgICB0ZWxscyBzdmxvZ2QgdG8gcHJlZml4IGVhY2ggbGluZSB0byBiZSB3cml0dGVuIHRvIHRoZSBsb2cgZGlyZWN0b3J5LAorICAgIHRvIHN0YW5kYXJkIGVycm9yLCBvciB0aHJvdWdoIFVEUCwgd2l0aCBwcmVmaXguCisKK0lmIGEgbGluZSBzdGFydHMgd2l0aCBhIC0sICssIGUsIG9yIEUsIHN2bG9nZCBtYXRjaGVzIHRoZSBmaXJzdCBsZW4gY2hhcmFjdGVycworb2YgZWFjaCBsb2cgbWVzc2FnZSBhZ2FpbnN0IHBhdHRlcm4gYW5kIGFjdHMgYWNjb3JkaW5nbHk6CisKKy1wYXR0ZXJuCisgICAgdGhlIGxvZyBtZXNzYWdlIGlzIGRlc2VsZWN0ZWQuCisrcGF0dGVybgorICAgIHRoZSBsb2cgbWVzc2FnZSBpcyBzZWxlY3RlZC4KK2VwYXR0ZXJuCisgICAgdGhlIGxvZyBtZXNzYWdlIGlzIHNlbGVjdGVkIHRvIGJlIHByaW50ZWQgdG8gc3RhbmRhcmQgZXJyb3IuCitFcGF0dGVybgorICAgIHRoZSBsb2cgbWVzc2FnZSBpcyBkZXNlbGVjdGVkIHRvIGJlIHByaW50ZWQgdG8gc3RhbmRhcmQgZXJyb3IuCisKK0luaXRpYWxseSBlYWNoIGxpbmUgaXMgc2VsZWN0ZWQgdG8gYmUgd3JpdHRlbiB0byBsb2cvY3VycmVudC4gRGVzZWxlY3RlZAorbG9nIG1lc3NhZ2VzIGFyZSBkaXNjYXJkZWQgZnJvbSBsb2cuIEluaXRpYWxseSBlYWNoIGxpbmUgaXMgZGVzZWxlY3RlZAordG8gYmUgd3JpdHRlbiB0byBzdGFuZGFyZCBlcnIuIExvZyBtZXNzYWdlcyBzZWxlY3RlZCBmb3Igc3RhbmRhcmQgZXJyb3IKK2FyZSB3cml0dGVuIHRvIHN0YW5kYXJkIGVycm9yLgorCitQYXR0ZXJuIE1hdGNoaW5nCisKK3N2bG9nZCBtYXRjaGVzIGEgbG9nIG1lc3NhZ2UgYWdhaW5zdCB0aGUgc3RyaW5nIHBhdHRlcm4gYXMgZm9sbG93czoKKworcGF0dGVybiBpcyBhcHBsaWVkIHRvIHRoZSBsb2cgbWVzc2FnZSBvbmUgY2hhcmFjdGVyIGJ5IG9uZSwgc3RhcnRpbmcKK3dpdGggdGhlIGZpcnN0LiBBIGNoYXJhY3RlciBub3QgYSBzdGFyICgqKSBhbmQgbm90IGEgcGx1cyAoKykgbWF0Y2hlcyBpdHNlbGYuCitBIHBsdXMgbWF0Y2hlcyB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gcGF0dGVybiBpbiB0aGUgbG9nIG1lc3NhZ2Ugb25lCitvciBtb3JlIHRpbWVzLiBBIHN0YXIgYmVmb3JlIHRoZSBlbmQgb2YgcGF0dGVybiBtYXRjaGVzIGFueSBzdHJpbmcKK2luIHRoZSBsb2cgbWVzc2FnZSB0aGF0IGRvZXMgbm90IGluY2x1ZGUgdGhlIG5leHQgY2hhcmFjdGVyIGluIHBhdHRlcm4uCitBIHN0YXIgYXQgdGhlIGVuZCBvZiBwYXR0ZXJuIG1hdGNoZXMgYW55IHN0cmluZy4KKworVGltZXN0YW1wcyBvcHRpb25hbGx5IGFkZGVkIGJ5IHN2bG9nZCBhcmUgbm90IGNvbnNpZGVyZWQgcGFydAorb2YgdGhlIGxvZyBtZXNzYWdlLgorCitBbiBzdmxvZ2QgcGF0dGVybiBpcyBub3QgYSByZWd1bGFyIGV4cHJlc3Npb24uIEZvciBleGFtcGxlIGNvbnNpZGVyCithIGxvZyBtZXNzYWdlIGxpa2UgdGhpcworCisyMDA1LTEyLTE4XzA5OjEzOjUwLjk3NjE4IHRjcHN2ZDogaW5mbzogcGlkIDE5NzcgZnJvbSAxMC40LjEuMTQKKworVGhlIGZvbGxvd2luZyBwYXR0ZXJuIGRvZXNudCBtYXRjaAorCistKnBpZCoKKworYmVjYXVzZSB0aGUgZmlyc3Qgc3RhciBtYXRjaGVzIHVwIHRvIHRoZSBmaXJzdCBwIGluIHRjcHN2ZCwKK2FuZCB0aGVuIHRoZSBtYXRjaCBmYWlscyBiZWNhdXNlIGkgaXMgbm90IHMuIFRvIG1hdGNoIHRoaXMKK2xvZyBtZXNzYWdlLCB5b3UgY2FuIHVzZSBhIHBhdHRlcm4gbGlrZSB0aGlzIGluc3RlYWQKKworLSo6ICo6IHBpZCAqCisqLworCisvL3VzYWdlOiNkZWZpbmUgc3Zsb2dkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXR0dl0gWy1yIENdIFstUiBDSEFSU10gWy1sIE1BVENITEVOXSBbLWIgQlVGTEVOXSBESVIuLi4iCisvL3VzYWdlOiNkZWZpbmUgc3Zsb2dkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ29udGludW91c2x5IHJlYWQgbG9nIGRhdGEgZnJvbSBzdGRpbiBhbmQgd3JpdGUgdG8gcm90YXRlZCBsb2cgZmlsZXMgaW4gRElScyIKKy8vdXNhZ2U6ICAgIlxuIgorLy91c2FnZTogICAiXG4iIkRJUi9jb25maWcgZmlsZSBtb2RpZmllcyBiZWhhdmlvcjoiCisvL3VzYWdlOiAgICJcbiIic1NJWkUgLSB3aGVuIHRvIHJvdGF0ZSBsb2dzIgorLy91c2FnZTogICAiXG4iIm5OVU0gLSBudW1iZXIgb2YgZmlsZXMgdG8gcmV0YWluIgorLyp1c2FnZTogICAiXG4iIk5OVU0gLSBtaW4gbnVtYmVyIGZpbGVzIHRvIHJldGFpbiIgLSBjb25mdXNpbmcgKi8KKy8qdXNhZ2U6ICAgIlxuIiJ0U0VDIC0gcm90YXRlIGZpbGUgaWYgaXQgZ2V0IFNFQyBzZWNvbmRzIG9sZCIgLSBjb25mdXNpbmcgKi8KKy8vdXNhZ2U6ICAgIlxuIiIhUFJPRyAtIHByb2Nlc3Mgcm90YXRlZCBsb2cgd2l0aCBQUk9HIgorLyp1c2FnZTogICAiXG4iInVJUEFERFIgLSBzZW5kIGxvZyBvdmVyIFVEUCIgLSB1bnN1cHBvcnRlZCAqLworLyp1c2FnZTogICAiXG4iIlVJUEFERFIgLSBzZW5kIGxvZyBvdmVyIFVEUCBhbmQgRE9OVCBsb2ciIC0gdW5zdXBwb3J0ZWQgKi8KKy8qdXNhZ2U6ICAgIlxuIiJwUEZYIC0gcHJlZml4IGVhY2ggbGluZSB3aXRoIFBGWCIgLSB1bnN1cHBvcnRlZCAqLworLy91c2FnZTogICAiXG4iIissLVBBVFRFUk4gLSAoZGUpc2VsZWN0IGxpbmUgZm9yIGxvZ2dpbmciCisvL3VzYWdlOiAgICJcbiIiRSxlUEFUVEVSTiAtIChkZSlzZWxlY3QgbGluZSBmb3Igc3RkZXJyIgorCisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInJ1bml0X2xpYi5oIgorCisjZGVmaW5lIExFU1MoYSxiKSAoKGludCkoKHVuc2lnbmVkKShiKSAtICh1bnNpZ25lZCkoYSkpID4gMCkKKworI2RlZmluZSBGTVRfUFRJTUUgMzAKKworc3RydWN0IGxvZ2RpciB7CisJLy8vL2NoYXIgKmJ0bXA7CisJLyogcGF0dGVybiBsaXN0IHRvIG1hdGNoLCBpbiAiYWFcMGJiXDBcY2NcMFwwIiBmb3JtICovCisJY2hhciAqaW5zdDsKKwljaGFyICpwcm9jZXNzb3I7CisJY2hhciAqbmFtZTsKKwl1bnNpZ25lZCBzaXplOworCXVuc2lnbmVkIHNpemVtYXg7CisJdW5zaWduZWQgbm1heDsKKwl1bnNpZ25lZCBubWluOworCXVuc2lnbmVkIHJvdGF0ZV9wZXJpb2Q7CisJaW50IHBwaWQ7CisJaW50IGZkZGlyOworCWludCBmZGN1cjsKKwlGSUxFKiBmaWxlY3VyOyAvLy8vCisJaW50IGZkbG9jazsKKwl1bnNpZ25lZCBuZXh0X3JvdGF0ZTsKKwljaGFyIGZuc2F2ZVtGTVRfUFRJTUVdOworCWNoYXIgbWF0Y2g7CisJY2hhciBtYXRjaGVycjsKK307CisKKworc3RydWN0IGdsb2JhbHMgeworCXN0cnVjdCBsb2dkaXIgKmRpcjsKKwl1bnNpZ25lZCB2ZXJib3NlOworCWludCBsaW5lbWF4OworCS8vLy9pbnQgYnVmbGVuOworCWludCBsaW5lbGVuOworCisJaW50IGZkd2RpcjsKKwljaGFyICoqZm5kaXI7CisJaW50IHdzdGF0OworCXVuc2lnbmVkIG5lYXJlc3Rfcm90YXRlOworCisJdm9pZCogKCptZW1SY2hyKShjb25zdCB2b2lkICosIGludCwgc2l6ZV90KTsKKwljaGFyICpzaGVsbDsKKworCXNtYWxsaW50IGV4aXRhc2FwOworCXNtYWxsaW50IHJvdGF0ZWFzYXA7CisJc21hbGxpbnQgcmVvcGVuYXNhcDsKKwlzbWFsbGludCBsaW5lY29tcGxldGU7CisJc21hbGxpbnQgdG1heGZsYWc7CisKKwljaGFyIHJlcGw7CisJY29uc3QgY2hhciAqcmVwbGFjZTsKKwlpbnQgZmxfZmxhZ18wOworCXVuc2lnbmVkIGRpcm47CisKKwlzaWdzZXRfdCBibG9ja2VkX3NpZ3NldDsKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgZGlyICAgICAgICAgICAgKEcuZGlyICAgICAgICAgICApCisjZGVmaW5lIHZlcmJvc2UgICAgICAgIChHLnZlcmJvc2UgICAgICAgKQorI2RlZmluZSBsaW5lbWF4ICAgICAgICAoRy5saW5lbWF4ICAgICAgICkKKyNkZWZpbmUgYnVmbGVuICAgICAgICAgKEcuYnVmbGVuICAgICAgICApCisjZGVmaW5lIGxpbmVsZW4gICAgICAgIChHLmxpbmVsZW4gICAgICAgKQorI2RlZmluZSBmbmRpciAgICAgICAgICAoRy5mbmRpciAgICAgICAgICkKKyNkZWZpbmUgZmR3ZGlyICAgICAgICAgKEcuZmR3ZGlyICAgICAgICApCisjZGVmaW5lIHdzdGF0ICAgICAgICAgIChHLndzdGF0ICAgICAgICAgKQorI2RlZmluZSBtZW1SY2hyICAgICAgICAoRy5tZW1SY2hyICAgICAgICkKKyNkZWZpbmUgbmVhcmVzdF9yb3RhdGUgKEcubmVhcmVzdF9yb3RhdGUpCisjZGVmaW5lIGV4aXRhc2FwICAgICAgIChHLmV4aXRhc2FwICAgICAgKQorI2RlZmluZSByb3RhdGVhc2FwICAgICAoRy5yb3RhdGVhc2FwICAgICkKKyNkZWZpbmUgcmVvcGVuYXNhcCAgICAgKEcucmVvcGVuYXNhcCAgICApCisjZGVmaW5lIGxpbmVjb21wbGV0ZSAgIChHLmxpbmVjb21wbGV0ZSAgKQorI2RlZmluZSB0bWF4ZmxhZyAgICAgICAoRy50bWF4ZmxhZyAgICAgICkKKyNkZWZpbmUgcmVwbCAgICAgICAgICAgKEcucmVwbCAgICAgICAgICApCisjZGVmaW5lIHJlcGxhY2UgICAgICAgIChHLnJlcGxhY2UgICAgICAgKQorI2RlZmluZSBibG9ja2VkX3NpZ3NldCAoRy5ibG9ja2VkX3NpZ3NldCkKKyNkZWZpbmUgZmxfZmxhZ18wICAgICAgKEcuZmxfZmxhZ18wICAgICApCisjZGVmaW5lIGRpcm4gICAgICAgICAgIChHLmRpcm4gICAgICAgICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorCWxpbmVtYXggPSAxMDAwOyBcCisJLypidWZsZW4gPSAxMDI0OyovIFwKKwlsaW5lY29tcGxldGUgPSAxOyBcCisJcmVwbGFjZSA9ICIiOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIGxpbmUgYmJfY29tbW9uX2J1ZnNpejEKKworCisjZGVmaW5lIEZBVEFMICJmYXRhbDogIgorI2RlZmluZSBXQVJOSU5HICJ3YXJuaW5nOiAiCisjZGVmaW5lIFBBVVNFICJwYXVzaW5nOiAiCisjZGVmaW5lIElORk8gImluZm86ICIKKworc3RhdGljIHZvaWQgZmF0YWx4KGNvbnN0IGNoYXIgKm0wKQoreworCWJiX2Vycm9yX21zZ19hbmRfZGllKEZBVEFMIiVzIiwgbTApOworfQorc3RhdGljIHZvaWQgd2Fybihjb25zdCBjaGFyICptMCkKK3sKKwliYl9wZXJyb3JfbXNnKFdBUk5JTkciJXMiLCBtMCk7Cit9CitzdGF0aWMgdm9pZCB3YXJuMihjb25zdCBjaGFyICptMCwgY29uc3QgY2hhciAqbTEpCit7CisJYmJfcGVycm9yX21zZyhXQVJOSU5HIiVzOiAlcyIsIG0wLCBtMSk7Cit9CitzdGF0aWMgdm9pZCB3YXJueChjb25zdCBjaGFyICptMCwgY29uc3QgY2hhciAqbTEpCit7CisJYmJfZXJyb3JfbXNnKFdBUk5JTkciJXM6ICVzIiwgbTAsIG0xKTsKK30KK3N0YXRpYyB2b2lkIHBhdXNlX25vbWVtKHZvaWQpCit7CisJYmJfZXJyb3JfbXNnKFBBVVNFIm91dCBvZiBtZW1vcnkiKTsKKwlzbGVlcCgzKTsKK30KK3N0YXRpYyB2b2lkIHBhdXNlMWNhbm5vdChjb25zdCBjaGFyICptMCkKK3sKKwliYl9wZXJyb3JfbXNnKFBBVVNFImNhbid0ICVzIiwgbTApOworCXNsZWVwKDMpOworfQorc3RhdGljIHZvaWQgcGF1c2UyY2Fubm90KGNvbnN0IGNoYXIgKm0wLCBjb25zdCBjaGFyICptMSkKK3sKKwliYl9wZXJyb3JfbXNnKFBBVVNFImNhbid0ICVzICVzIiwgbTAsIG0xKTsKKwlzbGVlcCgzKTsKK30KKworc3RhdGljIGNoYXIqIHdzdHJkdXAoY29uc3QgY2hhciAqc3RyKQoreworCWNoYXIgKnM7CisJd2hpbGUgKCEocyA9IHN0cmR1cChzdHIpKSkKKwkJcGF1c2Vfbm9tZW0oKTsKKwlyZXR1cm4gczsKK30KKworc3RhdGljIHVuc2lnbmVkIHBtYXRjaChjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyICpzLCB1bnNpZ25lZCBsZW4pCit7CisJZm9yICg7OykgeworCQljaGFyIGMgPSAqcCsrOworCQlpZiAoIWMpIHJldHVybiAhbGVuOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnKic6CisJCQljID0gKnA7CisJCQlpZiAoIWMpIHJldHVybiAxOworCQkJZm9yICg7OykgeworCQkJCWlmICghbGVuKSByZXR1cm4gMDsKKwkJCQlpZiAoKnMgPT0gYykgYnJlYWs7CisJCQkJKytzOworCQkJCS0tbGVuOworCQkJfQorCQkJY29udGludWU7CisJCWNhc2UgJysnOgorCQkJYyA9ICpwKys7CisJCQlpZiAoYyAhPSAqcykgcmV0dXJuIDA7CisJCQlmb3IgKDs7KSB7CisJCQkJaWYgKCFsZW4pIHJldHVybiAxOworCQkJCWlmICgqcyAhPSBjKSBicmVhazsKKwkJCQkrK3M7CisJCQkJLS1sZW47CisJCQl9CisJCQljb250aW51ZTsKKwkJCS8qCisJCWNhc2UgJz8nOgorCQkJaWYgKCpwID09ICc/JykgeworCQkJCWlmICgqcyAhPSAnPycpIHJldHVybiAwOworCQkJCSsrcDsKKwkJCX0KKwkJCSsrczsgLS1sZW47CisJCQljb250aW51ZTsKKwkJCSovCisJCWRlZmF1bHQ6CisJCQlpZiAoIWxlbikgcmV0dXJuIDA7CisJCQlpZiAoKnMgIT0gYykgcmV0dXJuIDA7CisJCQkrK3M7CisJCQktLWxlbjsKKwkJCWNvbnRpbnVlOworCQl9CisJfQorCXJldHVybiAwOworfQorCisvKioqIGV4IGZtdF9wdGltZS5bY2hdICoqKi8KKworLyogTlVMIHRlcm1pbmF0ZWQgKi8KK3N0YXRpYyB2b2lkIGZtdF90aW1lX2h1bWFuXzMwbnVsKGNoYXIgKnMpCit7CisJc3RydWN0IHRtICpwdG07CisJc3RydWN0IHRpbWV2YWwgdHY7CisKKwlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwlwdG0gPSBnbXRpbWUoJnR2LnR2X3NlYyk7CisJc3ByaW50ZihzLCAiJTA0dS0lMDJ1LSUwMnVfJTAydTolMDJ1OiUwMnUuJTA2dTAwMCIsCisJCSh1bnNpZ25lZCkoMTkwMCArIHB0bS0+dG1feWVhciksCisJCSh1bnNpZ25lZCkocHRtLT50bV9tb24gKyAxKSwKKwkJKHVuc2lnbmVkKShwdG0tPnRtX21kYXkpLAorCQkodW5zaWduZWQpKHB0bS0+dG1faG91ciksCisJCSh1bnNpZ25lZCkocHRtLT50bV9taW4pLAorCQkodW5zaWduZWQpKHB0bS0+dG1fc2VjKSwKKwkJKHVuc2lnbmVkKSh0di50dl91c2VjKQorCSk7CisJLyogNCsxICsgMisxICsgMisxICsgMisxICsgMisxICsgMisxICsgOSA9ICovCisJLyogNSAgICsgMyAgICsgMyAgICsgMyAgICsgMyAgICsgMyAgICsgOSA9ICovCisJLyogMjAgKHVwIHRvICcuJyBpbmNsdXNpdmUpICsgOSAobm90IGluY2x1ZGluZyAnXDAnKSAqLworfQorCisvKiBOT1QgdGVybWluYXRlZCEgKi8KK3N0YXRpYyB2b2lkIGZtdF90aW1lX2Jlcm5zdGVpbl8yNShjaGFyICpzKQoreworCXVpbnQzMl90IHBhY2tbM107CisJc3RydWN0IHRpbWV2YWwgdHY7CisJdW5zaWduZWQgc2VjX2hpOworCisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJc2VjX2hpID0gKDB4NDAwMDAwMDAwMDAwMDAwYVVMTCArIHR2LnR2X3NlYykgPj4gMzI7CisJdHYudHZfc2VjID0gKHRpbWVfdCkoMHg0MDAwMDAwMDAwMDAwMDBhVUxMKSArIHR2LnR2X3NlYzsKKwl0di50dl91c2VjICo9IDEwMDA7CisJLyogTmV0d29yayBvcmRlciBpcyBiaWctZW5kaWFuOiBtb3N0IHNpZ25pZmljYW50IGJ5dGUgZmlyc3QuCisJICogVGhpcyBpcyBleGFjdGx5IHdoYXQgd2Ugd2FudCBoZXJlICovCisJcGFja1swXSA9IGh0b25sKHNlY19oaSk7CisJcGFja1sxXSA9IGh0b25sKHR2LnR2X3NlYyk7CisJcGFja1syXSA9IGh0b25sKHR2LnR2X3VzZWMpOworCSpzKysgPSAnQCc7CisJYmluMmhleChzLCAoY2hhciopcGFjaywgMTIpOworfQorCitzdGF0aWMgdm9pZCBwcm9jZXNzb3JzdGFydChzdHJ1Y3QgbG9nZGlyICpsZCkKK3sKKwljaGFyIHN2X2NoOworCWludCBwaWQ7CisKKwlpZiAoIWxkLT5wcm9jZXNzb3IpIHJldHVybjsKKwlpZiAobGQtPnBwaWQpIHsKKwkJd2FybngoInByb2Nlc3NvciBhbHJlYWR5IHJ1bm5pbmciLCBsZC0+bmFtZSk7CisJCXJldHVybjsKKwl9CisKKwkvKiB2Zm9yaydlZCBjaGlsZCB0cmFzaGVzIHRoaXMgYnl0ZSwgc2F2ZS4uLiAqLworCXN2X2NoID0gbGQtPmZuc2F2ZVsyNl07CisKKwlpZiAoIUcuc2hlbGwpCisJCUcuc2hlbGwgPSB4c3RyZHVwKGdldF9zaGVsbF9uYW1lKCkpOworCisJd2hpbGUgKChwaWQgPSB2Zm9yaygpKSA9PSAtMSkKKwkJcGF1c2UyY2Fubm90KCJ2Zm9yayBmb3IgcHJvY2Vzc29yIiwgbGQtPm5hbWUpOworCWlmICghcGlkKSB7CisJCWludCBmZDsKKworCQkvKiBjaGlsZCAqLworCQkvKiBOb24taWdub3JlZCBzaWduYWxzIHJldmVydCB0byBTSUdfREZMIG9uIGV4ZWMgYW55d2F5ICovCisJCS8qYmJfc2lnbmFscygwCisJCQkrICgxIDw8IFNJR1RFUk0pCisJCQkrICgxIDw8IFNJR0FMUk0pCisJCQkrICgxIDw8IFNJR0hVUCkKKwkJCSwgU0lHX0RGTCk7Ki8KKwkJc2lnX3VuYmxvY2soU0lHVEVSTSk7CisJCXNpZ191bmJsb2NrKFNJR0FMUk0pOworCQlzaWdfdW5ibG9jayhTSUdIVVApOworCisJCWlmICh2ZXJib3NlKQorCQkJYmJfZXJyb3JfbXNnKElORk8icHJvY2Vzc2luZzogJXMvJXMiLCBsZC0+bmFtZSwgbGQtPmZuc2F2ZSk7CisJCWZkID0geG9wZW4obGQtPmZuc2F2ZSwgT19SRE9OTFl8T19OREVMQVkpOworCQl4bW92ZV9mZChmZCwgMCk7CisJCWxkLT5mbnNhdmVbMjZdID0gJ3QnOyAvKiA8LSB0aGF0J3Mgd2h5IHdlIG5lZWQgc3ZfY2ghICovCisJCWZkID0geG9wZW4obGQtPmZuc2F2ZSwgT19XUk9OTFl8T19OREVMQVl8T19UUlVOQ3xPX0NSRUFUKTsKKwkJeG1vdmVfZmQoZmQsIDEpOworCQlmZCA9IG9wZW4oInN0YXRlIiwgT19SRE9OTFl8T19OREVMQVkpOworCQlpZiAoZmQgPT0gLTEpIHsKKwkJCWlmIChlcnJubyAhPSBFTk9FTlQpCisJCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKEZBVEFMImNhbid0ICVzIHByb2Nlc3NvciAlcyIsICJvcGVuIHN0YXRlIGZvciIsIGxkLT5uYW1lKTsKKwkJCWNsb3NlKHhvcGVuKCJzdGF0ZSIsIE9fV1JPTkxZfE9fTkRFTEFZfE9fVFJVTkN8T19DUkVBVCkpOworCQkJZmQgPSB4b3Blbigic3RhdGUiLCBPX1JET05MWXxPX05ERUxBWSk7CisJCX0KKwkJeG1vdmVfZmQoZmQsIDQpOworCQlmZCA9IHhvcGVuKCJuZXdzdGF0ZSIsIE9fV1JPTkxZfE9fTkRFTEFZfE9fVFJVTkN8T19DUkVBVCk7CisJCXhtb3ZlX2ZkKGZkLCA1KTsKKworCQlleGVjbChHLnNoZWxsLCBHLnNoZWxsLCAiLWMiLCBsZC0+cHJvY2Vzc29yLCAoY2hhciopIE5VTEwpOworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoRkFUQUwiY2FuJ3QgJXMgcHJvY2Vzc29yICVzIiwgInJ1biIsIGxkLT5uYW1lKTsKKwl9CisJbGQtPmZuc2F2ZVsyNl0gPSBzdl9jaDsgLyogLi4ucmVzdG9yZSAqLworCWxkLT5wcGlkID0gcGlkOworfQorCitzdGF0aWMgdW5zaWduZWQgcHJvY2Vzc29yc3RvcChzdHJ1Y3QgbG9nZGlyICpsZCkKK3sKKwljaGFyIGZbMjhdOworCisJaWYgKGxkLT5wcGlkKSB7CisJCXNpZ191bmJsb2NrKFNJR0hVUCk7CisJCXdoaWxlIChzYWZlX3dhaXRwaWQobGQtPnBwaWQsICZ3c3RhdCwgMCkgPT0gLTEpCisJCQlwYXVzZTJjYW5ub3QoIndhaXQgZm9yIHByb2Nlc3NvciIsIGxkLT5uYW1lKTsKKwkJc2lnX2Jsb2NrKFNJR0hVUCk7CisJCWxkLT5wcGlkID0gMDsKKwl9CisJaWYgKGxkLT5mZGRpciA9PSAtMSkKKwkJcmV0dXJuIDE7CisJd2hpbGUgKGZjaGRpcihsZC0+ZmRkaXIpID09IC0xKQorCQlwYXVzZTJjYW5ub3QoImNoYW5nZSBkaXJlY3RvcnksIHdhbnQgcHJvY2Vzc29yIiwgbGQtPm5hbWUpOworCWlmIChXRVhJVFNUQVRVUyh3c3RhdCkgIT0gMCkgeworCQl3YXJueCgicHJvY2Vzc29yIGZhaWxlZCwgcmVzdGFydCIsIGxkLT5uYW1lKTsKKwkJbGQtPmZuc2F2ZVsyNl0gPSAndCc7CisJCXVubGluayhsZC0+Zm5zYXZlKTsKKwkJbGQtPmZuc2F2ZVsyNl0gPSAndSc7CisJCXByb2Nlc3NvcnN0YXJ0KGxkKTsKKwkJd2hpbGUgKGZjaGRpcihmZHdkaXIpID09IC0xKQorCQkJcGF1c2UxY2Fubm90KCJjaGFuZ2UgdG8gaW5pdGlhbCB3b3JraW5nIGRpcmVjdG9yeSIpOworCQlyZXR1cm4gbGQtPnByb2Nlc3NvciA/IDAgOiAxOworCX0KKwlsZC0+Zm5zYXZlWzI2XSA9ICd0JzsKKwltZW1jcHkoZiwgbGQtPmZuc2F2ZSwgMjYpOworCWZbMjZdID0gJ3MnOworCWZbMjddID0gJ1wwJzsKKwl3aGlsZSAocmVuYW1lKGxkLT5mbnNhdmUsIGYpID09IC0xKQorCQlwYXVzZTJjYW5ub3QoInJlbmFtZSBwcm9jZXNzZWQiLCBsZC0+bmFtZSk7CisJd2hpbGUgKGNobW9kKGYsIDA3NDQpID09IC0xKQorCQlwYXVzZTJjYW5ub3QoInNldCBtb2RlIG9mIHByb2Nlc3NlZCIsIGxkLT5uYW1lKTsKKwlsZC0+Zm5zYXZlWzI2XSA9ICd1JzsKKwlpZiAodW5saW5rKGxkLT5mbnNhdmUpID09IC0xKQorCQliYl9lcnJvcl9tc2coV0FSTklORyJjYW4ndCB1bmxpbms6ICVzLyVzIiwgbGQtPm5hbWUsIGxkLT5mbnNhdmUpOworCXdoaWxlIChyZW5hbWUoIm5ld3N0YXRlIiwgInN0YXRlIikgPT0gLTEpCisJCXBhdXNlMmNhbm5vdCgicmVuYW1lIHN0YXRlIiwgbGQtPm5hbWUpOworCWlmICh2ZXJib3NlKQorCQliYl9lcnJvcl9tc2coSU5GTyJwcm9jZXNzZWQ6ICVzLyVzIiwgbGQtPm5hbWUsIGYpOworCXdoaWxlIChmY2hkaXIoZmR3ZGlyKSA9PSAtMSkKKwkJcGF1c2UxY2Fubm90KCJjaGFuZ2UgdG8gaW5pdGlhbCB3b3JraW5nIGRpcmVjdG9yeSIpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBybW9sZGVzdChzdHJ1Y3QgbG9nZGlyICpsZCkKK3sKKwlESVIgKmQ7CisJc3RydWN0IGRpcmVudCAqZjsKKwljaGFyIG9sZGVzdFtGTVRfUFRJTUVdOworCWludCBuID0gMDsKKworCW9sZGVzdFswXSA9ICdBJzsgb2xkZXN0WzFdID0gb2xkZXN0WzI3XSA9IDA7CisJd2hpbGUgKCEoZCA9IG9wZW5kaXIoIi4iKSkpCisJCXBhdXNlMmNhbm5vdCgib3BlbiBkaXJlY3RvcnksIHdhbnQgcm90YXRlIiwgbGQtPm5hbWUpOworCWVycm5vID0gMDsKKwl3aGlsZSAoKGYgPSByZWFkZGlyKGQpKSkgeworCQlpZiAoKGYtPmRfbmFtZVswXSA9PSAnQCcpICYmIChzdHJsZW4oZi0+ZF9uYW1lKSA9PSAyNykpIHsKKwkJCWlmIChmLT5kX25hbWVbMjZdID09ICd0JykgeworCQkJCWlmICh1bmxpbmsoZi0+ZF9uYW1lKSA9PSAtMSkKKwkJCQkJd2FybjIoImNhbid0IHVubGluayBwcm9jZXNzb3IgbGVmdG92ZXIiLCBmLT5kX25hbWUpOworCQkJfSBlbHNlIHsKKwkJCQkrK247CisJCQkJaWYgKHN0cmNtcChmLT5kX25hbWUsIG9sZGVzdCkgPCAwKQorCQkJCQltZW1jcHkob2xkZXN0LCBmLT5kX25hbWUsIDI3KTsKKwkJCX0KKwkJCWVycm5vID0gMDsKKwkJfQorCX0KKwlpZiAoZXJybm8pCisJCXdhcm4yKCJjYW4ndCByZWFkIGRpcmVjdG9yeSIsIGxkLT5uYW1lKTsKKwljbG9zZWRpcihkKTsKKworCWlmIChsZC0+bm1heCAmJiAobiA+IGxkLT5ubWF4KSkgeworCQlpZiAodmVyYm9zZSkKKwkJCWJiX2Vycm9yX21zZyhJTkZPImRlbGV0ZTogJXMvJXMiLCBsZC0+bmFtZSwgb2xkZXN0KTsKKwkJaWYgKCgqb2xkZXN0ID09ICdAJykgJiYgKHVubGluayhvbGRlc3QpID09IC0xKSkKKwkJCXdhcm4yKCJjYW4ndCB1bmxpbmsgb2xkZXN0IGxvZ2ZpbGUiLCBsZC0+bmFtZSk7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgcm90YXRlKHN0cnVjdCBsb2dkaXIgKmxkKQoreworCXN0cnVjdCBzdGF0IHN0OworCXVuc2lnbmVkIG5vdzsKKworCWlmIChsZC0+ZmRkaXIgPT0gLTEpIHsKKwkJbGQtPnJvdGF0ZV9wZXJpb2QgPSAwOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGxkLT5wcGlkKQorCQl3aGlsZSAoIXByb2Nlc3NvcnN0b3AobGQpKQorCQkJY29udGludWU7CisKKwl3aGlsZSAoZmNoZGlyKGxkLT5mZGRpcikgPT0gLTEpCisJCXBhdXNlMmNhbm5vdCgiY2hhbmdlIGRpcmVjdG9yeSwgd2FudCByb3RhdGUiLCBsZC0+bmFtZSk7CisKKwkvKiBjcmVhdGUgbmV3IGZpbGVuYW1lICovCisJbGQtPmZuc2F2ZVsyNV0gPSAnLic7CisJbGQtPmZuc2F2ZVsyNl0gPSAncyc7CisJaWYgKGxkLT5wcm9jZXNzb3IpCisJCWxkLT5mbnNhdmVbMjZdID0gJ3UnOworCWxkLT5mbnNhdmVbMjddID0gJ1wwJzsKKwlkbyB7CisJCWZtdF90aW1lX2Jlcm5zdGVpbl8yNShsZC0+Zm5zYXZlKTsKKwkJZXJybm8gPSAwOworCQlzdGF0KGxkLT5mbnNhdmUsICZzdCk7CisJfSB3aGlsZSAoZXJybm8gIT0gRU5PRU5UKTsKKworCW5vdyA9IG1vbm90b25pY19zZWMoKTsKKwlpZiAobGQtPnJvdGF0ZV9wZXJpb2QgJiYgTEVTUyhsZC0+bmV4dF9yb3RhdGUsIG5vdykpIHsKKwkJbGQtPm5leHRfcm90YXRlID0gbm93ICsgbGQtPnJvdGF0ZV9wZXJpb2Q7CisJCWlmIChMRVNTKGxkLT5uZXh0X3JvdGF0ZSwgbmVhcmVzdF9yb3RhdGUpKQorCQkJbmVhcmVzdF9yb3RhdGUgPSBsZC0+bmV4dF9yb3RhdGU7CisJfQorCisJaWYgKGxkLT5zaXplID4gMCkgeworCQl3aGlsZSAoZmZsdXNoKGxkLT5maWxlY3VyKSB8fCBmc3luYyhsZC0+ZmRjdXIpID09IC0xKQorCQkJcGF1c2UyY2Fubm90KCJmc3luYyBjdXJyZW50IGxvZ2ZpbGUiLCBsZC0+bmFtZSk7CisJCXdoaWxlIChmY2htb2QobGQtPmZkY3VyLCAwNzQ0KSA9PSAtMSkKKwkJCXBhdXNlMmNhbm5vdCgic2V0IG1vZGUgb2YgY3VycmVudCIsIGxkLT5uYW1lKTsKKwkJLy8vL2Nsb3NlKGxkLT5mZGN1cik7CisJCWZjbG9zZShsZC0+ZmlsZWN1cik7CisKKwkJaWYgKHZlcmJvc2UpIHsKKwkJCWJiX2Vycm9yX21zZyhJTkZPInJlbmFtZTogJXMvY3VycmVudCAlcyAldSIsIGxkLT5uYW1lLAorCQkJCQlsZC0+Zm5zYXZlLCBsZC0+c2l6ZSk7CisJCX0KKwkJd2hpbGUgKHJlbmFtZSgiY3VycmVudCIsIGxkLT5mbnNhdmUpID09IC0xKQorCQkJcGF1c2UyY2Fubm90KCJyZW5hbWUgY3VycmVudCIsIGxkLT5uYW1lKTsKKwkJd2hpbGUgKChsZC0+ZmRjdXIgPSBvcGVuKCJjdXJyZW50IiwgT19XUk9OTFl8T19OREVMQVl8T19BUFBFTkR8T19DUkVBVCwgMDYwMCkpID09IC0xKQorCQkJcGF1c2UyY2Fubm90KCJjcmVhdGUgbmV3IGN1cnJlbnQiLCBsZC0+bmFtZSk7CisJCXdoaWxlICgobGQtPmZpbGVjdXIgPSBmZG9wZW4obGQtPmZkY3VyLCAiYSIpKSA9PSBOVUxMKSAvLy8vCisJCQlwYXVzZTJjYW5ub3QoImNyZWF0ZSBuZXcgY3VycmVudCIsIGxkLT5uYW1lKTsgLyogdmVyeSB1bmxpa2VseSAqLworCQlzZXR2YnVmKGxkLT5maWxlY3VyLCBOVUxMLCBfSU9GQkYsIGxpbmVsZW4pOyAvLy8vCisJCWNsb3NlX29uX2V4ZWNfb24obGQtPmZkY3VyKTsKKwkJbGQtPnNpemUgPSAwOworCQl3aGlsZSAoZmNobW9kKGxkLT5mZGN1ciwgMDY0NCkgPT0gLTEpCisJCQlwYXVzZTJjYW5ub3QoInNldCBtb2RlIG9mIGN1cnJlbnQiLCBsZC0+bmFtZSk7CisKKwkJcm1vbGRlc3QobGQpOworCQlwcm9jZXNzb3JzdGFydChsZCk7CisJfQorCisJd2hpbGUgKGZjaGRpcihmZHdkaXIpID09IC0xKQorCQlwYXVzZTFjYW5ub3QoImNoYW5nZSB0byBpbml0aWFsIHdvcmtpbmcgZGlyZWN0b3J5Iik7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgYnVmZmVyX3B3cml0ZShpbnQgbiwgY2hhciAqcywgdW5zaWduZWQgbGVuKQoreworCWludCBpOworCXN0cnVjdCBsb2dkaXIgKmxkID0gJmRpcltuXTsKKworCWlmIChsZC0+c2l6ZW1heCkgeworCQlpZiAobGQtPnNpemUgPj0gbGQtPnNpemVtYXgpCisJCQlyb3RhdGUobGQpOworCQlpZiAobGVuID4gKGxkLT5zaXplbWF4IC0gbGQtPnNpemUpKQorCQkJbGVuID0gbGQtPnNpemVtYXggLSBsZC0+c2l6ZTsKKwl9CisJd2hpbGUgKDEpIHsKKwkJLy8vL2kgPSBmdWxsX3dyaXRlKGxkLT5mZGN1ciwgcywgbGVuKTsKKwkJLy8vL2lmIChpICE9IC0xKSBicmVhazsKKwkJaSA9IGZ3cml0ZShzLCAxLCBsZW4sIGxkLT5maWxlY3VyKTsKKwkJaWYgKGkgPT0gbGVuKSBicmVhazsKKworCQlpZiAoKGVycm5vID09IEVOT1NQQykgJiYgKGxkLT5ubWluIDwgbGQtPm5tYXgpKSB7CisJCQlESVIgKmQ7CisJCQlzdHJ1Y3QgZGlyZW50ICpmOworCQkJY2hhciBvbGRlc3RbRk1UX1BUSU1FXTsKKwkJCWludCBqID0gMDsKKworCQkJd2hpbGUgKGZjaGRpcihsZC0+ZmRkaXIpID09IC0xKQorCQkJCXBhdXNlMmNhbm5vdCgiY2hhbmdlIGRpcmVjdG9yeSwgd2FudCByZW1vdmUgb2xkIGxvZ2ZpbGUiLAorCQkJCQkJCWxkLT5uYW1lKTsKKwkJCW9sZGVzdFswXSA9ICdBJzsKKwkJCW9sZGVzdFsxXSA9IG9sZGVzdFsyN10gPSAnXDAnOworCQkJd2hpbGUgKCEoZCA9IG9wZW5kaXIoIi4iKSkpCisJCQkJcGF1c2UyY2Fubm90KCJvcGVuIGRpcmVjdG9yeSwgd2FudCByZW1vdmUgb2xkIGxvZ2ZpbGUiLAorCQkJCQkJCWxkLT5uYW1lKTsKKwkJCWVycm5vID0gMDsKKwkJCXdoaWxlICgoZiA9IHJlYWRkaXIoZCkpKQorCQkJCWlmICgoZi0+ZF9uYW1lWzBdID09ICdAJykgJiYgKHN0cmxlbihmLT5kX25hbWUpID09IDI3KSkgeworCQkJCQkrK2o7CisJCQkJCWlmIChzdHJjbXAoZi0+ZF9uYW1lLCBvbGRlc3QpIDwgMCkKKwkJCQkJCW1lbWNweShvbGRlc3QsIGYtPmRfbmFtZSwgMjcpOworCQkJCX0KKwkJCWlmIChlcnJubykgd2FybjIoImNhbid0IHJlYWQgZGlyZWN0b3J5LCB3YW50IHJlbW92ZSBvbGQgbG9nZmlsZSIsCisJCQkJCWxkLT5uYW1lKTsKKwkJCWNsb3NlZGlyKGQpOworCQkJZXJybm8gPSBFTk9TUEM7CisJCQlpZiAoaiA+IGxkLT5ubWluKSB7CisJCQkJaWYgKCpvbGRlc3QgPT0gJ0AnKSB7CisJCQkJCWJiX2Vycm9yX21zZyhXQVJOSU5HIm91dCBvZiBkaXNrIHNwYWNlLCBkZWxldGU6ICVzLyVzIiwKKwkJCQkJCQlsZC0+bmFtZSwgb2xkZXN0KTsKKwkJCQkJZXJybm8gPSAwOworCQkJCQlpZiAodW5saW5rKG9sZGVzdCkgPT0gLTEpIHsKKwkJCQkJCXdhcm4yKCJjYW4ndCB1bmxpbmsgb2xkZXN0IGxvZ2ZpbGUiLCBsZC0+bmFtZSk7CisJCQkJCQllcnJubyA9IEVOT1NQQzsKKwkJCQkJfQorCQkJCQl3aGlsZSAoZmNoZGlyKGZkd2RpcikgPT0gLTEpCisJCQkJCQlwYXVzZTFjYW5ub3QoImNoYW5nZSB0byBpbml0aWFsIHdvcmtpbmcgZGlyZWN0b3J5Iik7CisJCQkJfQorCQkJfQorCQl9CisJCWlmIChlcnJubykKKwkJCXBhdXNlMmNhbm5vdCgid3JpdGUgdG8gY3VycmVudCIsIGxkLT5uYW1lKTsKKwl9CisKKwlsZC0+c2l6ZSArPSBpOworCWlmIChsZC0+c2l6ZW1heCkKKwkJaWYgKHNbaS0xXSA9PSAnXG4nKQorCQkJaWYgKGxkLT5zaXplID49IChsZC0+c2l6ZW1heCAtIGxpbmVtYXgpKQorCQkJCXJvdGF0ZShsZCk7CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkIGxvZ2Rpcl9jbG9zZShzdHJ1Y3QgbG9nZGlyICpsZCkKK3sKKwlpZiAobGQtPmZkZGlyID09IC0xKQorCQlyZXR1cm47CisJaWYgKHZlcmJvc2UpCisJCWJiX2Vycm9yX21zZyhJTkZPImNsb3NlOiAlcyIsIGxkLT5uYW1lKTsKKwljbG9zZShsZC0+ZmRkaXIpOworCWxkLT5mZGRpciA9IC0xOworCWlmIChsZC0+ZmRjdXIgPT0gLTEpCisJCXJldHVybjsgLyogaW1wb3NzaWJsZSAqLworCXdoaWxlIChmZmx1c2gobGQtPmZpbGVjdXIpIHx8IGZzeW5jKGxkLT5mZGN1cikgPT0gLTEpCisJCXBhdXNlMmNhbm5vdCgiZnN5bmMgY3VycmVudCBsb2dmaWxlIiwgbGQtPm5hbWUpOworCXdoaWxlIChmY2htb2QobGQtPmZkY3VyLCAwNzQ0KSA9PSAtMSkKKwkJcGF1c2UyY2Fubm90KCJzZXQgbW9kZSBvZiBjdXJyZW50IiwgbGQtPm5hbWUpOworCS8vLy9jbG9zZShsZC0+ZmRjdXIpOworCWZjbG9zZShsZC0+ZmlsZWN1cik7CisJbGQtPmZkY3VyID0gLTE7CisJaWYgKGxkLT5mZGxvY2sgPT0gLTEpCisJCXJldHVybjsgLyogaW1wb3NzaWJsZSAqLworCWNsb3NlKGxkLT5mZGxvY2spOworCWxkLT5mZGxvY2sgPSAtMTsKKwlmcmVlKGxkLT5wcm9jZXNzb3IpOworCWxkLT5wcm9jZXNzb3IgPSBOVUxMOworfQorCitzdGF0aWMgTk9JTkxJTkUgdW5zaWduZWQgbG9nZGlyX29wZW4oc3RydWN0IGxvZ2RpciAqbGQsIGNvbnN0IGNoYXIgKmZuKQoreworCWNoYXIgYnVmWzEyOF07CisJdW5zaWduZWQgbm93OworCWNoYXIgKm5ldywgKnMsICpucDsKKwlpbnQgaTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCW5vdyA9IG1vbm90b25pY19zZWMoKTsKKworCWxkLT5mZGRpciA9IG9wZW4oZm4sIE9fUkRPTkxZfE9fTkRFTEFZKTsKKwlpZiAobGQtPmZkZGlyID09IC0xKSB7CisJCXdhcm4yKCJjYW4ndCBvcGVuIGxvZyBkaXJlY3RvcnkiLCAoY2hhciopZm4pOworCQlyZXR1cm4gMDsKKwl9CisJY2xvc2Vfb25fZXhlY19vbihsZC0+ZmRkaXIpOworCWlmIChmY2hkaXIobGQtPmZkZGlyKSA9PSAtMSkgeworCQlsb2dkaXJfY2xvc2UobGQpOworCQl3YXJuMigiY2FuJ3QgY2hhbmdlIGRpcmVjdG9yeSIsIChjaGFyKilmbik7CisJCXJldHVybiAwOworCX0KKwlsZC0+ZmRsb2NrID0gb3BlbigibG9jayIsIE9fV1JPTkxZfE9fTkRFTEFZfE9fQVBQRU5EfE9fQ1JFQVQsIDA2MDApOworCWlmICgobGQtPmZkbG9jayA9PSAtMSkKKwkgfHwgKGZsb2NrKGxkLT5mZGxvY2ssIExPQ0tfRVggfCBMT0NLX05CKSA9PSAtMSkKKwkpIHsKKwkJbG9nZGlyX2Nsb3NlKGxkKTsKKwkJd2FybjIoImNhbid0IGxvY2sgZGlyZWN0b3J5IiwgKGNoYXIqKWZuKTsKKwkJd2hpbGUgKGZjaGRpcihmZHdkaXIpID09IC0xKQorCQkJcGF1c2UxY2Fubm90KCJjaGFuZ2UgdG8gaW5pdGlhbCB3b3JraW5nIGRpcmVjdG9yeSIpOworCQlyZXR1cm4gMDsKKwl9CisJY2xvc2Vfb25fZXhlY19vbihsZC0+ZmRsb2NrKTsKKworCWxkLT5zaXplID0gMDsKKwlsZC0+c2l6ZW1heCA9IDEwMDAwMDA7CisJbGQtPm5tYXggPSBsZC0+bm1pbiA9IDEwOworCWxkLT5yb3RhdGVfcGVyaW9kID0gMDsKKwlsZC0+bmFtZSA9IChjaGFyKilmbjsKKwlsZC0+cHBpZCA9IDA7CisJbGQtPm1hdGNoID0gJysnOworCWZyZWUobGQtPmluc3QpOyBsZC0+aW5zdCA9IE5VTEw7CisJZnJlZShsZC0+cHJvY2Vzc29yKTsgbGQtPnByb2Nlc3NvciA9IE5VTEw7CisKKwkvKiByZWFkIGNvbmZpZyAqLworCWkgPSBvcGVuX3JlYWRfY2xvc2UoImNvbmZpZyIsIGJ1Ziwgc2l6ZW9mKGJ1ZikgLSAxKTsKKwlpZiAoaSA8IDAgJiYgZXJybm8gIT0gRU5PRU5UKQorCQliYl9wZXJyb3JfbXNnKFdBUk5JTkciJXMvY29uZmlnIiwgbGQtPm5hbWUpOworCWlmIChpID4gMCkgeworCQlidWZbaV0gPSAnXDAnOworCQlpZiAodmVyYm9zZSkKKwkJCWJiX2Vycm9yX21zZyhJTkZPInJlYWQ6ICVzL2NvbmZpZyIsIGxkLT5uYW1lKTsKKwkJcyA9IGJ1ZjsKKwkJd2hpbGUgKHMpIHsKKwkJCW5wID0gc3RyY2hyKHMsICdcbicpOworCQkJaWYgKG5wKQorCQkJCSpucCsrID0gJ1wwJzsKKwkJCXN3aXRjaCAoc1swXSkgeworCQkJY2FzZSAnKyc6CisJCQljYXNlICctJzoKKwkJCWNhc2UgJ2UnOgorCQkJY2FzZSAnRSc6CisJCQkJLyogRmlsdGVyaW5nIHJlcXVpcmVzIG9uZS1saW5lIGJ1ZmZlcmluZywKKwkJCQkgKiByZXNldHRpbmcgdGhlICJmaW5kIG5ld2xpbmUiIGZ1bmN0aW9uCisJCQkJICogYWNjb3JkaW5nbHkgKi8KKwkJCQltZW1SY2hyID0gbWVtY2hyOworCQkJCS8qIEFkZCAnXG4nLXRlcm1pbmF0ZWQgbGluZSB0byBsZC0+aW5zdCAqLworCQkJCXdoaWxlICgxKSB7CisJCQkJCWludCBsID0gYXNwcmludGYoJm5ldywgIiVzJXNcbiIsIGxkLT5pbnN0ID8gbGQtPmluc3QgOiAiIiwgcyk7CisJCQkJCWlmIChsID49IDAgJiYgbmV3KQorCQkJCQkJYnJlYWs7CisJCQkJCXBhdXNlX25vbWVtKCk7CisJCQkJfQorCQkJCWZyZWUobGQtPmluc3QpOworCQkJCWxkLT5pbnN0ID0gbmV3OworCQkJCWJyZWFrOworCQkJY2FzZSAncyc6IHsKKwkJCQlsZC0+c2l6ZW1heCA9IHhhdG91X3NmeCgmc1sxXSwga21fc3VmZml4ZXMpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2FzZSAnbic6CisJCQkJbGQtPm5tYXggPSB4YXRvaV9wb3NpdGl2ZSgmc1sxXSk7CisJCQkJYnJlYWs7CisJCQljYXNlICdOJzoKKwkJCQlsZC0+bm1pbiA9IHhhdG9pX3Bvc2l0aXZlKCZzWzFdKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ3QnOiB7CisJCQkJc3RhdGljIGNvbnN0IHN0cnVjdCBzdWZmaXhfbXVsdCBtaF9zdWZmaXhlc1tdID0geworCQkJCQl7ICJtIiwgNjAgfSwKKwkJCQkJeyAiaCIsIDYwKjYwIH0sCisJCQkJCS8qeyAiZCIsIDI0KjYwKjYwIH0sKi8KKwkJCQkJeyAiIiwgMCB9CisJCQkJfTsKKwkJCQlsZC0+cm90YXRlX3BlcmlvZCA9IHhhdG91X3NmeCgmc1sxXSwgbWhfc3VmZml4ZXMpOworCQkJCWlmIChsZC0+cm90YXRlX3BlcmlvZCkgeworCQkJCQlsZC0+bmV4dF9yb3RhdGUgPSBub3cgKyBsZC0+cm90YXRlX3BlcmlvZDsKKwkJCQkJaWYgKCF0bWF4ZmxhZyB8fCBMRVNTKGxkLT5uZXh0X3JvdGF0ZSwgbmVhcmVzdF9yb3RhdGUpKQorCQkJCQkJbmVhcmVzdF9yb3RhdGUgPSBsZC0+bmV4dF9yb3RhdGU7CisJCQkJCXRtYXhmbGFnID0gMTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQljYXNlICchJzoKKwkJCQlpZiAoc1sxXSkgeworCQkJCQlmcmVlKGxkLT5wcm9jZXNzb3IpOworCQkJCQlsZC0+cHJvY2Vzc29yID0gd3N0cmR1cChzKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisJCQlzID0gbnA7CisJCX0KKwkJLyogQ29udmVydCAiYWFcbmJiXG5jY1xuXDAiIHRvICJhYVwwYmJcMGNjXDBcMCIgKi8KKwkJcyA9IGxkLT5pbnN0OworCQl3aGlsZSAocykgeworCQkJbnAgPSBzdHJjaHIocywgJ1xuJyk7CisJCQlpZiAobnApCisJCQkJKm5wKysgPSAnXDAnOworCQkJcyA9IG5wOworCQl9CisJfQorCisJLyogb3BlbiBjdXJyZW50ICovCisJaSA9IHN0YXQoImN1cnJlbnQiLCAmc3QpOworCWlmIChpICE9IC0xKSB7CisJCWlmIChzdC5zdF9zaXplICYmICEoc3Quc3RfbW9kZSAmIFNfSVhVU1IpKSB7CisJCQlsZC0+Zm5zYXZlWzI1XSA9ICcuJzsKKwkJCWxkLT5mbnNhdmVbMjZdID0gJ3UnOworCQkJbGQtPmZuc2F2ZVsyN10gPSAnXDAnOworCQkJZG8geworCQkJCWZtdF90aW1lX2Jlcm5zdGVpbl8yNShsZC0+Zm5zYXZlKTsKKwkJCQllcnJubyA9IDA7CisJCQkJc3RhdChsZC0+Zm5zYXZlLCAmc3QpOworCQkJfSB3aGlsZSAoZXJybm8gIT0gRU5PRU5UKTsKKwkJCXdoaWxlIChyZW5hbWUoImN1cnJlbnQiLCBsZC0+Zm5zYXZlKSA9PSAtMSkKKwkJCQlwYXVzZTJjYW5ub3QoInJlbmFtZSBjdXJyZW50IiwgbGQtPm5hbWUpOworCQkJcm1vbGRlc3QobGQpOworCQkJaSA9IC0xOworCQl9IGVsc2UgeworCQkJLyogc3Quc3Rfc2l6ZSBjYW4gYmUgbm90IGp1c3QgYmlnZ2VyLCBidXQgV0lERVIhCisJCQkgKiBUaGlzIGNvZGUgaXMgc2FmZTogaWYgc3Quc3Rfc2l6ZSA+IDRHQiwgd2Ugc2VsZWN0CisJCQkgKiBsZC0+c2l6ZW1heCAoYmVjYXVzZSBpdCdzICJ1bnNpZ25lZCIpICovCisJCQlsZC0+c2l6ZSA9IChzdC5zdF9zaXplID4gbGQtPnNpemVtYXgpID8gbGQtPnNpemVtYXggOiBzdC5zdF9zaXplOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGVycm5vICE9IEVOT0VOVCkgeworCQkJbG9nZGlyX2Nsb3NlKGxkKTsKKwkJCXdhcm4yKCJjYW4ndCBzdGF0IGN1cnJlbnQiLCBsZC0+bmFtZSk7CisJCQl3aGlsZSAoZmNoZGlyKGZkd2RpcikgPT0gLTEpCisJCQkJcGF1c2UxY2Fubm90KCJjaGFuZ2UgdG8gaW5pdGlhbCB3b3JraW5nIGRpcmVjdG9yeSIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJd2hpbGUgKChsZC0+ZmRjdXIgPSBvcGVuKCJjdXJyZW50IiwgT19XUk9OTFl8T19OREVMQVl8T19BUFBFTkR8T19DUkVBVCwgMDYwMCkpID09IC0xKQorCQlwYXVzZTJjYW5ub3QoIm9wZW4gY3VycmVudCIsIGxkLT5uYW1lKTsKKwl3aGlsZSAoKGxkLT5maWxlY3VyID0gZmRvcGVuKGxkLT5mZGN1ciwgImEiKSkgPT0gTlVMTCkKKwkJcGF1c2UyY2Fubm90KCJvcGVuIGN1cnJlbnQiLCBsZC0+bmFtZSk7IC8vLy8KKwlzZXR2YnVmKGxkLT5maWxlY3VyLCBOVUxMLCBfSU9GQkYsIGxpbmVsZW4pOyAvLy8vCisKKwljbG9zZV9vbl9leGVjX29uKGxkLT5mZGN1cik7CisJd2hpbGUgKGZjaG1vZChsZC0+ZmRjdXIsIDA2NDQpID09IC0xKQorCQlwYXVzZTJjYW5ub3QoInNldCBtb2RlIG9mIGN1cnJlbnQiLCBsZC0+bmFtZSk7CisKKwlpZiAodmVyYm9zZSkgeworCQlpZiAoaSA9PSAwKSBiYl9lcnJvcl9tc2coSU5GTyJhcHBlbmQ6ICVzL2N1cnJlbnQiLCBsZC0+bmFtZSk7CisJCWVsc2UgYmJfZXJyb3JfbXNnKElORk8ibmV3OiAlcy9jdXJyZW50IiwgbGQtPm5hbWUpOworCX0KKworCXdoaWxlIChmY2hkaXIoZmR3ZGlyKSA9PSAtMSkKKwkJcGF1c2UxY2Fubm90KCJjaGFuZ2UgdG8gaW5pdGlhbCB3b3JraW5nIGRpcmVjdG9yeSIpOworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBsb2dkaXJzX3Jlb3Blbih2b2lkKQoreworCWludCBsOworCWludCBvayA9IDA7CisKKwl0bWF4ZmxhZyA9IDA7CisJZm9yIChsID0gMDsgbCA8IGRpcm47ICsrbCkgeworCQlsb2dkaXJfY2xvc2UoJmRpcltsXSk7CisJCWlmIChsb2dkaXJfb3BlbigmZGlyW2xdLCBmbmRpcltsXSkpCisJCQlvayA9IDE7CisJfQorCWlmICghb2spCisJCWZhdGFseCgibm8gZnVuY3Rpb25hbCBsb2cgZGlyZWN0b3JpZXMiKTsKK30KKworLyogV2lsbCBsb29rIGdvb2QgaW4gbGliYmIgb25lIGRheSAqLworc3RhdGljIHNzaXplX3QgbmRlbGF5X3JlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwlpZiAoIShmbF9mbGFnXzAgJiBPX05PTkJMT0NLKSkKKwkJZmNudGwoZmQsIEZfU0VURkwsIGZsX2ZsYWdfMCB8IE9fTk9OQkxPQ0spOworCWNvdW50ID0gc2FmZV9yZWFkKGZkLCBidWYsIGNvdW50KTsKKwlpZiAoIShmbF9mbGFnXzAgJiBPX05PTkJMT0NLKSkKKwkJZmNudGwoZmQsIEZfU0VURkwsIGZsX2ZsYWdfMCk7CisJcmV0dXJuIGNvdW50OworfQorCisvKiBVc2VkIGZvciByZWFkaW5nIHN0ZGluICovCitzdGF0aWMgaW50IGJ1ZmZlcl9wcmVhZCgvKmludCBmZCwgKi9jaGFyICpzLCB1bnNpZ25lZCBsZW4pCit7CisJdW5zaWduZWQgbm93OworCXN0cnVjdCBwb2xsZmQgaW5wdXQ7CisJaW50IGk7CisKKwlpbnB1dC5mZCA9IFNURElOX0ZJTEVOTzsKKwlpbnB1dC5ldmVudHMgPSBQT0xMSU47CisKKwlkbyB7CisJCWlmIChyb3RhdGVhc2FwKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgZGlybjsgKytpKQorCQkJCXJvdGF0ZShkaXIgKyBpKTsKKwkJCXJvdGF0ZWFzYXAgPSAwOworCQl9CisJCWlmIChleGl0YXNhcCkgeworCQkJaWYgKGxpbmVjb21wbGV0ZSkKKwkJCQlyZXR1cm4gMDsKKwkJCWxlbiA9IDE7CisJCX0KKwkJaWYgKHJlb3BlbmFzYXApIHsKKwkJCWxvZ2RpcnNfcmVvcGVuKCk7CisJCQlyZW9wZW5hc2FwID0gMDsKKwkJfQorCQlub3cgPSBtb25vdG9uaWNfc2VjKCk7CisJCW5lYXJlc3Rfcm90YXRlID0gbm93ICsgKDQ1ICogNjAgKyA0NSk7CisJCWZvciAoaSA9IDA7IGkgPCBkaXJuOyArK2kpIHsKKwkJCWlmIChkaXJbaV0ucm90YXRlX3BlcmlvZCkgeworCQkJCWlmIChMRVNTKGRpcltpXS5uZXh0X3JvdGF0ZSwgbm93KSkKKwkJCQkJcm90YXRlKGRpciArIGkpOworCQkJCWlmIChMRVNTKGRpcltpXS5uZXh0X3JvdGF0ZSwgbmVhcmVzdF9yb3RhdGUpKQorCQkJCQluZWFyZXN0X3JvdGF0ZSA9IGRpcltpXS5uZXh0X3JvdGF0ZTsKKwkJCX0KKwkJfQorCisJCXNpZ3Byb2NtYXNrKFNJR19VTkJMT0NLLCAmYmxvY2tlZF9zaWdzZXQsIE5VTEwpOworCQlpID0gbmVhcmVzdF9yb3RhdGUgLSBub3c7CisJCWlmIChpID4gMTAwMDAwMCkKKwkJCWkgPSAxMDAwMDAwOworCQlpZiAoaSA8PSAwKQorCQkJaSA9IDE7CisJCXBvbGwoJmlucHV0LCAxLCBpICogMTAwMCk7CisJCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJmJsb2NrZWRfc2lnc2V0LCBOVUxMKTsKKworCQlpID0gbmRlbGF5X3JlYWQoU1RESU5fRklMRU5PLCBzLCBsZW4pOworCQlpZiAoaSA+PSAwKQorCQkJYnJlYWs7CisJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCWNvbnRpbnVlOworCQlpZiAoZXJybm8gIT0gRUFHQUlOKSB7CisJCQl3YXJuKCJjYW4ndCByZWFkIHN0YW5kYXJkIGlucHV0Iik7CisJCQlicmVhazsKKwkJfQorCQkvKiBlbHNlOiBFQUdBSU4gLSBub3JtYWwsIHJlcGVhdCBzaWxlbnRseSAqLworCX0gd2hpbGUgKCFleGl0YXNhcCk7CisKKwlpZiAoaSA+IDApIHsKKwkJaW50IGNudDsKKwkJbGluZWNvbXBsZXRlID0gKHNbaS0xXSA9PSAnXG4nKTsKKwkJaWYgKCFyZXBsKQorCQkJcmV0dXJuIGk7CisKKwkJY250ID0gaTsKKwkJd2hpbGUgKC0tY250ID49IDApIHsKKwkJCWNoYXIgY2ggPSAqczsKKwkJCWlmIChjaCAhPSAnXG4nKSB7CisJCQkJaWYgKGNoIDwgMzIgfHwgY2ggPiAxMjYpCisJCQkJCSpzID0gcmVwbDsKKwkJCQllbHNlIHsKKwkJCQkJaW50IGo7CisJCQkJCWZvciAoaiA9IDA7IHJlcGxhY2Vbal07ICsraikgeworCQkJCQkJaWYgKGNoID09IHJlcGxhY2Vbal0pIHsKKwkJCQkJCQkqcyA9IHJlcGw7CisJCQkJCQkJYnJlYWs7CisJCQkJCQl9CisJCQkJCX0KKwkJCQl9CisJCQl9CisJCQlzKys7CisJCX0KKwl9CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ190ZXJtX2hhbmRsZXIoaW50IHNpZ19ubyBVTlVTRURfUEFSQU0pCit7CisJaWYgKHZlcmJvc2UpCisJCWJiX2Vycm9yX21zZyhJTkZPInNpZyVzIHJlY2VpdmVkIiwgInRlcm0iKTsKKwlleGl0YXNhcCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ19jaGlsZF9oYW5kbGVyKGludCBzaWdfbm8gVU5VU0VEX1BBUkFNKQoreworCXBpZF90IHBpZDsKKwlpbnQgbDsKKworCWlmICh2ZXJib3NlKQorCQliYl9lcnJvcl9tc2coSU5GTyJzaWclcyByZWNlaXZlZCIsICJjaGlsZCIpOworCXdoaWxlICgocGlkID0gd2FpdF9hbnlfbm9oYW5nKCZ3c3RhdCkpID4gMCkgeworCQlmb3IgKGwgPSAwOyBsIDwgZGlybjsgKytsKSB7CisJCQlpZiAoZGlyW2xdLnBwaWQgPT0gcGlkKSB7CisJCQkJZGlyW2xdLnBwaWQgPSAwOworCQkJCXByb2Nlc3NvcnN0b3AoJmRpcltsXSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNpZ19hbGFybV9oYW5kbGVyKGludCBzaWdfbm8gVU5VU0VEX1BBUkFNKQoreworCWlmICh2ZXJib3NlKQorCQliYl9lcnJvcl9tc2coSU5GTyJzaWclcyByZWNlaXZlZCIsICJhbGFybSIpOworCXJvdGF0ZWFzYXAgPSAxOworfQorCitzdGF0aWMgdm9pZCBzaWdfaGFuZ3VwX2hhbmRsZXIoaW50IHNpZ19ubyBVTlVTRURfUEFSQU0pCit7CisJaWYgKHZlcmJvc2UpCisJCWJiX2Vycm9yX21zZyhJTkZPInNpZyVzIHJlY2VpdmVkIiwgImhhbmd1cCIpOworCXJlb3BlbmFzYXAgPSAxOworfQorCitzdGF0aWMgdm9pZCBsb2dtYXRjaChzdHJ1Y3QgbG9nZGlyICpsZCkKK3sKKwljaGFyICpzOworCisJbGQtPm1hdGNoID0gJysnOworCWxkLT5tYXRjaGVyciA9ICdFJzsKKwlzID0gbGQtPmluc3Q7CisJd2hpbGUgKHMgJiYgc1swXSkgeworCQlzd2l0Y2ggKHNbMF0pIHsKKwkJY2FzZSAnKyc6CisJCWNhc2UgJy0nOgorCQkJaWYgKHBtYXRjaChzKzEsIGxpbmUsIGxpbmVsZW4pKQorCQkJCWxkLT5tYXRjaCA9IHNbMF07CisJCQlicmVhazsKKwkJY2FzZSAnZSc6CisJCWNhc2UgJ0UnOgorCQkJaWYgKHBtYXRjaChzKzEsIGxpbmUsIGxpbmVsZW4pKQorCQkJCWxkLT5tYXRjaGVyciA9IHNbMF07CisJCQlicmVhazsKKwkJfQorCQlzICs9IHN0cmxlbihzKSArIDE7CisJfQorfQorCitpbnQgc3Zsb2dkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzdmxvZ2RfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqciwgKmwsICpiOworCXNzaXplX3Qgc3RkaW5fY250ID0gMDsKKwlpbnQgaTsKKwl1bnNpZ25lZCBvcHQ7CisJdW5zaWduZWQgdGltZXN0YW1wID0gMDsKKworCUlOSVRfRygpOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAidHQ6dnYiOworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJyOlI6bDpiOnR2IiwKKwkJCSZyLCAmcmVwbGFjZSwgJmwsICZiLCAmdGltZXN0YW1wLCAmdmVyYm9zZSk7CisJaWYgKG9wdCAmIDEpIHsgLy8gLXIKKwkJcmVwbCA9IHJbMF07CisJCWlmICghcmVwbCB8fCByWzFdKQorCQkJYmJfc2hvd191c2FnZSgpOworCX0KKwlpZiAob3B0ICYgMikgaWYgKCFyZXBsKSByZXBsID0gJ18nOyAvLyAtUgorCWlmIChvcHQgJiA0KSB7IC8vIC1sCisJCWxpbmVtYXggPSB4YXRvdV9yYW5nZShsLCAwLCBCVUZTSVotMjYpOworCQlpZiAobGluZW1heCA9PSAwKQorCQkJbGluZW1heCA9IEJVRlNJWi0yNjsKKwkJaWYgKGxpbmVtYXggPCAyNTYpCisJCQlsaW5lbWF4ID0gMjU2OworCX0KKwkvLy8vaWYgKG9wdCAmIDgpIHsgLy8gLWIKKwkvLy8vCWJ1ZmxlbiA9IHhhdG9pX3Bvc2l0aXZlKGIpOworCS8vLy8JaWYgKGJ1ZmxlbiA9PSAwKSBidWZsZW4gPSAxMDI0OworCS8vLy99CisJLy9pZiAob3B0ICYgMHgxMCkgdGltZXN0YW1wKys7IC8vIC10CisJLy9pZiAob3B0ICYgMHgyMCkgdmVyYm9zZSsrOyAvLyAtdgorCS8vaWYgKHRpbWVzdGFtcCA+IDIpIHRpbWVzdGFtcCA9IDI7CisJYXJndiArPSBvcHRpbmQ7CisJYXJnYyAtPSBvcHRpbmQ7CisKKwlkaXJuID0gYXJnYzsKKwlpZiAoZGlybiA8PSAwKQorCQliYl9zaG93X3VzYWdlKCk7CisJLy8vL2lmIChidWZsZW4gPD0gbGluZW1heCkgYmJfc2hvd191c2FnZSgpOworCWZkd2RpciA9IHhvcGVuKCIuIiwgT19SRE9OTFl8T19OREVMQVkpOworCWNsb3NlX29uX2V4ZWNfb24oZmR3ZGlyKTsKKwlkaXIgPSB4emFsbG9jKGRpcm4gKiBzaXplb2YoZGlyWzBdKSk7CisJZm9yIChpID0gMDsgaSA8IGRpcm47ICsraSkgeworCQlkaXJbaV0uZmRkaXIgPSAtMTsKKwkJZGlyW2ldLmZkY3VyID0gLTE7CisJCS8vLy9kaXJbaV0uYnRtcCA9IHhtYWxsb2MoYnVmbGVuKTsKKwkJLypkaXJbaV0ucHBpZCA9IDA7Ki8KKwl9CisJLyogbGluZSA9IHhtYWxsb2MobGluZW1heCArICh0aW1lc3RhbXAgPyAyNiA6IDApKTsgKi8KKwlmbmRpciA9IGFyZ3Y7CisJLyogV2UgY2Fubm90IHNldCBOT05CTE9DSyBvbiBmZCAjMCBwZXJtYW5lbnRseSAtIHRoaXMgc2V0dGluZworCSAqIF9pc24ndF8gcGVyLXByb2Nlc3MhIEl0IGlzIHNoYXJlZCBhbW9uZyBhbGwgb3RoZXIgcHJvY2Vzc2VzCisJICogd2l0aCB0aGUgc2FtZSBzdGRpbiAqLworCWZsX2ZsYWdfMCA9IGZjbnRsKDAsIEZfR0VURkwpOworCisJc2lnZW1wdHlzZXQoJmJsb2NrZWRfc2lnc2V0KTsKKwlzaWdhZGRzZXQoJmJsb2NrZWRfc2lnc2V0LCBTSUdURVJNKTsKKwlzaWdhZGRzZXQoJmJsb2NrZWRfc2lnc2V0LCBTSUdDSExEKTsKKwlzaWdhZGRzZXQoJmJsb2NrZWRfc2lnc2V0LCBTSUdBTFJNKTsKKwlzaWdhZGRzZXQoJmJsb2NrZWRfc2lnc2V0LCBTSUdIVVApOworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJmJsb2NrZWRfc2lnc2V0LCBOVUxMKTsKKwliYl9zaWduYWxzX3JlY3Vyc2l2ZV9ub3Jlc3RhcnQoMSA8PCBTSUdURVJNLCBzaWdfdGVybV9oYW5kbGVyKTsKKwliYl9zaWduYWxzX3JlY3Vyc2l2ZV9ub3Jlc3RhcnQoMSA8PCBTSUdDSExELCBzaWdfY2hpbGRfaGFuZGxlcik7CisJYmJfc2lnbmFsc19yZWN1cnNpdmVfbm9yZXN0YXJ0KDEgPDwgU0lHQUxSTSwgc2lnX2FsYXJtX2hhbmRsZXIpOworCWJiX3NpZ25hbHNfcmVjdXJzaXZlX25vcmVzdGFydCgxIDw8IFNJR0hVUCwgc2lnX2hhbmd1cF9oYW5kbGVyKTsKKworCS8qIFdpdGhvdXQgdGltZXN0YW1wcywgd2UgZG9uJ3QgaGF2ZSB0byBwcmludCBlYWNoIGxpbmUKKwkgKiBzZXBhcmF0ZWx5LCBzbyB3ZSBjYW4gbG9vayBmb3IgX2xhc3RfIG5ld2xpbmUsIG5vdCBmaXJzdCwKKwkgKiB0aHVzIGJhdGNoaW5nIHdyaXRlcy4gSWYgZmlsdGVyaW5nIGlzIGVuYWJsZWQgaW4gY29uZmlnLAorCSAqIGxvZ2RpcnNfcmVvcGVuIHJlc2V0cyBpdCB0byBtZW1jaHIuCisJICovCisJbWVtUmNociA9ICh0aW1lc3RhbXAgPyBtZW1jaHIgOiBtZW1yY2hyKTsKKworCWxvZ2RpcnNfcmVvcGVuKCk7CisKKwlzZXR2YnVmKHN0ZGVyciwgTlVMTCwgX0lPRkJGLCBsaW5lbGVuKTsKKworCS8qIEVhY2ggaXRlcmF0aW9uIHByb2Nlc3NlcyBvbmUgb3IgbW9yZSBsaW5lcyAqLworCXdoaWxlICgxKSB7CisJCWNoYXIgc3RhbXBbRk1UX1BUSU1FXTsKKwkJY2hhciAqbGluZXB0cjsKKwkJY2hhciAqcHJpbnRwdHI7CisJCWNoYXIgKm5wOworCQlpbnQgcHJpbnRsZW47CisJCWNoYXIgY2g7CisKKwkJbGluZXB0ciA9IGxpbmU7CisJCWlmICh0aW1lc3RhbXApCisJCQlsaW5lcHRyICs9IDI2OworCisJCS8qIGxpbmVwdHJbMC4ubGluZW1heC0xXSAtIGJ1ZmZlciBmb3Igc3RkaW4gKi8KKwkJLyogKHBvc3NpYmx5IGhhcyBzb21lIHVucHJvY2Vzc2VkIGRhdGEgZnJvbSBwcmV2IGxvb3ApICovCisKKwkJLyogUmVmaWxsIHRoZSBidWZmZXIgaWYgbmVlZGVkICovCisJCW5wID0gbWVtUmNocihsaW5lcHRyLCAnXG4nLCBzdGRpbl9jbnQpOworCQlpZiAoIW5wICYmICFleGl0YXNhcCkgeworCQkJaSA9IGxpbmVtYXggLSBzdGRpbl9jbnQ7IC8qIGF2YWlsLiBieXRlcyBhdCB0YWlsICovCisJCQlpZiAoaSA+PSAxMjgpIHsKKwkJCQlpID0gYnVmZmVyX3ByZWFkKC8qMCwgKi9saW5lcHRyICsgc3RkaW5fY250LCBpKTsKKwkJCQlpZiAoaSA8PSAwKSAvKiBFT0Ygb3IgZXJyb3Igb24gc3RkaW4gKi8KKwkJCQkJZXhpdGFzYXAgPSAxOworCQkJCWVsc2UgeworCQkJCQlucCA9IG1lbVJjaHIobGluZXB0ciArIHN0ZGluX2NudCwgJ1xuJywgaSk7CisJCQkJCXN0ZGluX2NudCArPSBpOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAoc3RkaW5fY250IDw9IDAgJiYgZXhpdGFzYXApCisJCQlicmVhazsKKworCQkvKiBTZWFyY2ggZm9yICdcbicgKGluIGZhY3QsIG5wIGFscmVhZHkgaG9sZHMgdGhlIHJlc3VsdCkgKi8KKwkJbGluZWxlbiA9IHN0ZGluX2NudDsKKwkJaWYgKG5wKSB7CisgcHJpbnRfdG9fbmw6CisJCQkvKiBOQjogc3RhcnRpbmcgZnJvbSBoZXJlIGxpbmVwdHIgbWF5IHBvaW50CisJCQkgKiBmYXJ0aGVyIG91dCBpbnRvIGxpbmVbXSAqLworCQkJbGluZWxlbiA9IG5wIC0gbGluZXB0ciArIDE7CisJCX0KKwkJLyogbGluZWxlbiA9PSBubyBvZiBjaGFycyBpbmNsLiAnXG4nIChvciA9PSBzdGRpbl9jbnQpICovCisJCWNoID0gbGluZXB0cltsaW5lbGVuLTFdOworCisJCS8qIEJpZ2dlc3QgcGVyZm9ybWFuY2UgaGl0IHdhcyBjb21pbmcgZnJvbSB0aGUgZmFjdAorCQkgKiB0aGF0IHdlIGRpZCBub3QgYnVmZmVyIHdyaXRlcy4gV2Ugd2VyZSByZWFkaW5nIG1hbnkgbGluZXMKKwkJICogaW4gb25lIHJlYWQoKSBhYm92ZSwgYnV0IHdyb3RlIG9uZSBsaW5lIHBlciB3cml0ZSgpLgorCQkgKiBXZSBhcmUgdXNpbmcgc3RkaW8gdG8gZml4IHRoYXQgKi8KKworCQkvKiB3cml0ZSBvdXQgbGluZXB0clswLi5saW5lbGVuLTFdIHRvIGVhY2ggbG9nIGRlc3RpbmF0aW9uCisJCSAqIChvciBsaW5lcHRyWy0yNi4ubGluZWxlbi0xXSBpZiB0aW1lc3RhbXBpbmcpICovCisJCXByaW50bGVuID0gbGluZWxlbjsKKwkJcHJpbnRwdHIgPSBsaW5lcHRyOworCQlpZiAodGltZXN0YW1wKSB7CisJCQlpZiAodGltZXN0YW1wID09IDEpCisJCQkJZm10X3RpbWVfYmVybnN0ZWluXzI1KHN0YW1wKTsKKwkJCWVsc2UgLyogMjogKi8KKwkJCQlmbXRfdGltZV9odW1hbl8zMG51bChzdGFtcCk7CisJCQlwcmludGxlbiArPSAyNjsKKwkJCXByaW50cHRyIC09IDI2OworCQkJbWVtY3B5KHByaW50cHRyLCBzdGFtcCwgMjUpOworCQkJcHJpbnRwdHJbMjVdID0gJyAnOworCQl9CisJCWZvciAoaSA9IDA7IGkgPCBkaXJuOyArK2kpIHsKKwkJCXN0cnVjdCBsb2dkaXIgKmxkID0gJmRpcltpXTsKKwkJCWlmIChsZC0+ZmRkaXIgPT0gLTEpCisJCQkJY29udGludWU7CisJCQlpZiAobGQtPmluc3QpCisJCQkJbG9nbWF0Y2gobGQpOworCQkJaWYgKGxkLT5tYXRjaGVyciA9PSAnZScpIHsKKwkJCQkvKiBydW5pdC0xLjguMCBjb21wYXQ6IGlmIHRpbWVzdGFtcGluZywgZG8gaXQgb24gc3RkZXJyIHRvbyAqLworCQkJCS8vLy9mdWxsX3dyaXRlKFNUREVSUl9GSUxFTk8sIHByaW50cHRyLCBwcmludGxlbik7CisJCQkJZndyaXRlKHByaW50cHRyLCAxLCBwcmludGxlbiwgc3RkZXJyKTsKKwkJCX0KKwkJCWlmIChsZC0+bWF0Y2ggIT0gJysnKQorCQkJCWNvbnRpbnVlOworCQkJYnVmZmVyX3B3cml0ZShpLCBwcmludHB0ciwgcHJpbnRsZW4pOworCQl9CisKKwkJLyogSWYgd2UgZGlkbid0IHNlZSAnXG4nIChsb25nIGlucHV0IGxpbmUpLCAqLworCQkvKiByZWFkL3dyaXRlIHJlcGVhdGVkbHkgdW50aWwgd2Ugc2VlIGl0ICovCisJCXdoaWxlIChjaCAhPSAnXG4nKSB7CisJCQkvKiBsaW5lcHRyIGlzIGVtcHRpZWQgbm93LCBzYWZlIHRvIHVzZSBhcyBidWZmZXIgKi8KKwkJCXN0ZGluX2NudCA9IGV4aXRhc2FwID8gLTEgOiBidWZmZXJfcHJlYWQoLyowLCAqL2xpbmVwdHIsIGxpbmVtYXgpOworCQkJaWYgKHN0ZGluX2NudCA8PSAwKSB7IC8qIEVPRiBvciBlcnJvciBvbiBzdGRpbiAqLworCQkJCWV4aXRhc2FwID0gMTsKKwkJCQlsaW5lcHRyWzBdID0gY2ggPSAnXG4nOworCQkJCWxpbmVsZW4gPSAxOworCQkJCXN0ZGluX2NudCA9IDE7CisJCQl9IGVsc2UgeworCQkJCWxpbmVsZW4gPSBzdGRpbl9jbnQ7CisJCQkJbnAgPSBtZW1SY2hyKGxpbmVwdHIsICdcbicsIHN0ZGluX2NudCk7CisJCQkJaWYgKG5wKQorCQkJCQlsaW5lbGVuID0gbnAgLSBsaW5lcHRyICsgMTsKKwkJCQljaCA9IGxpbmVwdHJbbGluZWxlbi0xXTsKKwkJCX0KKwkJCS8qIGxpbmVsZW4gPT0gbm8gb2YgY2hhcnMgaW5jbC4gJ1xuJyAob3IgPT0gc3RkaW5fY250KSAqLworCQkJZm9yIChpID0gMDsgaSA8IGRpcm47ICsraSkgeworCQkJCWlmIChkaXJbaV0uZmRkaXIgPT0gLTEpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChkaXJbaV0ubWF0Y2hlcnIgPT0gJ2UnKSB7CisJCQkJCS8vLy9mdWxsX3dyaXRlKFNUREVSUl9GSUxFTk8sIGxpbmVwdHIsIGxpbmVsZW4pOworCQkJCQlmd3JpdGUobGluZXB0ciwgMSwgbGluZWxlbiwgc3RkZXJyKTsKKwkJCQl9CisJCQkJaWYgKGRpcltpXS5tYXRjaCAhPSAnKycpCisJCQkJCWNvbnRpbnVlOworCQkJCWJ1ZmZlcl9wd3JpdGUoaSwgbGluZXB0ciwgbGluZWxlbik7CisJCQl9CisJCX0KKworCQlzdGRpbl9jbnQgLT0gbGluZWxlbjsKKwkJaWYgKHN0ZGluX2NudCA+IDApIHsKKwkJCWxpbmVwdHIgKz0gbGluZWxlbjsKKwkJCS8qIElmIHdlIHNlZSBhbm90aGVyICdcbicsIHdlIGRvbid0IG5lZWQgdG8gcmVhZAorCQkJICogbmV4dCBwaWVjZSBvZiBpbnB1dDogY2FuIHByaW50IHdoYXQgd2UgaGF2ZSAqLworCQkJbnAgPSBtZW1SY2hyKGxpbmVwdHIsICdcbicsIHN0ZGluX2NudCk7CisJCQlpZiAobnApCisJCQkJZ290byBwcmludF90b19ubDsKKwkJCS8qIE1vdmUgdW5wcm9jZXNzZWQgZGF0YSB0byB0aGUgZnJvbnQgb2YgbGluZSAqLworCQkJbWVtbW92ZSgodGltZXN0YW1wID8gbGluZSsyNiA6IGxpbmUpLCBsaW5lcHRyLCBzdGRpbl9jbnQpOworCQl9CisJCWZmbHVzaF9hbGwoKTsvLy8vCisJfQorCisJZm9yIChpID0gMDsgaSA8IGRpcm47ICsraSkgeworCQlpZiAoZGlyW2ldLnBwaWQpCisJCQl3aGlsZSAoIXByb2Nlc3NvcnN0b3AoJmRpcltpXSkpCisJCQkJY29udGludWU7CisJCWxvZ2Rpcl9jbG9zZSgmZGlyW2ldKTsKKwl9CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL0tidWlsZC5pbmNsdWRlIGIvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWMxODA5Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQpAQCAtMCwwICsxLDE1NCBAQAorIyMjIworIyBrYnVpbGQ6IEdlbmVyaWMgZGVmaW5pdGlvbnMKKworIyBDb252aW5pZW50IHZhcmlhYmxlcworY29tbWEgICA6PSAsCitzcXVvdGUgIDo9ICcKK2VtcHR5ICAgOj0KK3NwYWNlICAgOj0gJChlbXB0eSkgJChlbXB0eSkKKworIyMjCisjIFRoZSB0ZW1wb3JhcnkgZmlsZSB0byBzYXZlIGdjYyAtTUQgZ2VuZXJhdGVkIGRlcGVuZGVuY2llcyBtdXN0IG5vdAorIyBjb250YWluIGEgY29tbWEKK2RlcGZpbGUgPSAkKHN1YnN0ICQoY29tbWEpLF8sJChARCkvLiQoQEYpLmQpCisKKyMjIworIyBFc2NhcGUgc2luZ2xlIHF1b3RlIGZvciB1c2UgaW4gZWNobyBzdGF0ZW1lbnRzCitlc2NzcSA9ICQoc3Vic3QgJChzcXVvdGUpLCdcJChzcXVvdGUpJywkMSkKKworIyMjCisjIGZpbGVjaGsgaXMgdXNlZCB0byBjaGVjayBpZiB0aGUgY29udGVudCBvZiBhIGdlbmVyYXRlZCBmaWxlIGlzIHVwZGF0ZWQuCisjIFNhbXBsZSB1c2FnZToKKyMgZGVmaW5lIGZpbGVjaGtfc2FtcGxlCisjCWVjaG8gJEtFUk5FTFJFTEVBU0UKKyMgZW5kZWYKKyMgdmVyc2lvbi5oIDogTWFrZWZpbGUKKyMJJChjYWxsIGZpbGVjaGssc2FtcGxlKQorIyBUaGUgcnVsZSBkZWZpbmVkIHNoYWxsIHdyaXRlIHRvIHN0ZG91dCB0aGUgY29udGVudCBvZiB0aGUgbmV3IGZpbGUuCisjIFRoZSBleGlzdGluZyBmaWxlIHdpbGwgYmUgY29tcGFyZWQgd2l0aCB0aGUgbmV3IG9uZS4KKyMgLSBJZiBubyBmaWxlIGV4aXN0IGl0IGlzIGNyZWF0ZWQKKyMgLSBJZiB0aGUgY29udGVudCBkaWZmZXIgdGhlIG5ldyBmaWxlIGlzIHVzZWQKKyMgLSBJZiB0aGV5IGFyZSBlcXVhbCBubyBjaGFuZ2UsIGFuZCBubyB0aW1lc3RhbXAgdXBkYXRlCisjIC0gc3RkaW4gaXMgcGlwZWQgaW4gZnJvbSB0aGUgZmlyc3QgcHJlcmVxdWlzaXRlICgkPCkgc28gb25lIGhhcworIyAgIHRvIHNwZWNpZnkgYSB2YWxpZCBmaWxlIGFzIGZpcnN0IHByZXJlcXVpc2l0ZSAob2Z0ZW4gdGhlIGtidWlsZCBmaWxlKQorZGVmaW5lIGZpbGVjaGsKKwkkKFEpc2V0IC1lOwkJCQlcCisJZWNobyAnICBDSEsgICAgICRAJzsJCQlcCisJbWtkaXIgLXAgJChkaXIgJEApOwkJCVwKKwkkKGZpbGVjaGtfJCgxKSkgPCAkPCA+ICRALnRtcDsJCVwKKwlpZiBbIC1yICRAIF0gJiYgY21wIC1zICRAICRALnRtcDsgdGhlbglcCisJCXJtIC1mICRALnRtcDsJCQlcCisJZWxzZQkJCQkJXAorCQllY2hvICcgIFVQRCAgICAgJEAnOwkJXAorCQltdiAtZiAkQC50bXAgJEA7CQlcCisJZmkKK2VuZGVmCisKKyMjIyMjIworIyBnY2Mgc3VwcG9ydCBmdW5jdGlvbnMKKyMgU2VlIGRvY3VtZW50YXRpb24gaW4gRG9jdW1lbnRhdGlvbi9rYnVpbGQvbWFrZWZpbGVzLnR4dAorCisjIGFzLW9wdGlvbgorIyBVc2FnZTogY2ZsYWdzLXkgKz0gJChjYWxsIGFzLW9wdGlvbiwgLVdhJChjb21tYSktaXNhPWZvbywpCisKK2FzLW9wdGlvbiA9ICQoc2hlbGwgaWYgJChDQykgJChDRkxBR1MpICQoMSkgLVdhLC1aIC1jIC1vIC9kZXYvbnVsbCBcCisJICAgICAteGFzc2VtYmxlciAvZGV2L251bGwgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBlY2hvICIkKDEpIjsgXAorCSAgICAgZWxzZSBlY2hvICIkKDIpIjsgZmkgOykKKworIyBjYy1vcHRpb24KKyMgVXNhZ2U6IGNmbGFncy15ICs9ICQoY2FsbCBjYy1vcHRpb24sIC1tYXJjaD13aW5jaGlwLWM2LCAtbWFyY2g9aTU4NikKKworY2Mtb3B0aW9uID0gJChzaGVsbCBpZiAkKENDKSAkKENGTEFHUykgJCgxKSAtUyAtbyAvZGV2L251bGwgLXhjIC9kZXYvbnVsbCBcCisgICAgICAgICAgICAgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBlY2hvICIkKDEpIjsgZWxzZSBlY2hvICIkKDIpIjsgZmkgOykKKworIyBob3N0Y2Mtb3B0aW9uCisjIFVzYWdlOiBob3N0Y2ZsYWdzLXkgKz0gJChjYWxsIGhvc3RjYy1vcHRpb24sIC1tYXJjaD13aW5jaGlwLWM2LCAtbWFyY2g9aTU4NikKKworaG9zdGNjLW9wdGlvbiA9ICQoc2hlbGwgaWYgJChIT1NUQ0MpICQoSE9TVENGTEFHUykgJCgxKSAtUyAtbyAvZGV2L251bGwgLXhjIC9kZXYvbnVsbCBcCisgICAgICAgICAgICAgPiAvZGV2L251bGwgMj4mMTsgdGhlbiBlY2hvICIkKDEpIjsgZWxzZSBlY2hvICIkKDIpIjsgZmkgOykKKworIyBjYy1vcHRpb24teW4KKyMgVXNhZ2U6IGZsYWcgOj0gJChjYWxsIGNjLW9wdGlvbi15biwgLW1hcmNoPXdpbmNoaXAtYzYpCitjYy1vcHRpb24teW4gPSAkKHNoZWxsIGlmICQoQ0MpICQoQ0ZMQUdTKSAkKDEpIC1TIC1vIC9kZXYvbnVsbCAteGMgL2Rldi9udWxsIFwKKyAgICAgICAgICAgICAgICA+IC9kZXYvbnVsbCAyPiYxOyB0aGVuIGVjaG8gInkiOyBlbHNlIGVjaG8gIm4iOyBmaTspCisKKyMgY2Mtb3B0aW9uLWFsaWduCisjIFByZWZpeCBhbGlnbiB3aXRoIGVpdGhlciAtZmFsaWduIG9yIC1tYWxpZ24KK2NjLW9wdGlvbi1hbGlnbiA9ICQoc3Vic3QgLWZ1bmN0aW9ucz0wLCxcCisJJChjYWxsIGNjLW9wdGlvbiwtZmFsaWduLWZ1bmN0aW9ucz0wLC1tYWxpZ24tZnVuY3Rpb25zPTApKQorCisjIGNjLXZlcnNpb24KKyMgVXNhZ2UgZ2NjLXZlciA6PSAkKGNhbGwgY2MtdmVyc2lvbiwgJChDQykpCitjYy12ZXJzaW9uID0gJChzaGVsbCBQQVRIPSIkKFBBVEgpIiAkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS9zY3JpcHRzL2djYy12ZXJzaW9uLnNoIFwKKyAgICAgICAgICAgICAgJChpZiAkKDEpLCAkKDEpLCAkKENDKSkpCisKKyMgY2MtaWZ2ZXJzaW9uCisjIFVzYWdlOiAgRVhUUkFfQ0ZMQUdTICs9ICQoY2FsbCBjYy1pZnZlcnNpb24sIC1sdCwgMDQwMiwgLU8xKQorY2MtaWZ2ZXJzaW9uID0gJChzaGVsbCBpZiBbICQoY2FsbCBjYy12ZXJzaW9uLCAkKENDKSkgJCgxKSAkKDIpIF07IHRoZW4gXAorICAgICAgICAgICAgICAgICAgICAgICBlY2hvICQoMyk7IGZpOykKKworIyMjCisjIFNob3J0aGFuZCBmb3IgJChRKSQoTUFLRSkgLWYgc2NyaXB0cy9NYWtlZmlsZS5idWlsZCBvYmo9CisjIFVzYWdlOgorIyAkKFEpJChNQUtFKSAkKGJ1aWxkKT1kaXIKK2J1aWxkIDo9IC1mICQoaWYgJChLQlVJTERfU1JDKSwkKHNyY3RyZWUpLylzY3JpcHRzL01ha2VmaWxlLmJ1aWxkIG9iagorCisjIFByZWZpeCAtSSB3aXRoICQoc3JjdHJlZSkgaWYgaXQgaXMgbm90IGFuIGFic29sdXRlIHBhdGgKK2FkZHRyZWUgPSAkKGlmICQoZmlsdGVyLW91dCAtSS8lLCQoMSkpLCQocGF0c3Vic3QgLUklLC1JJChzcmN0cmVlKS8lLCQoMSkpKSAkKDEpCisjIEZpbmQgYWxsIC1JIG9wdGlvbnMgYW5kIGNhbGwgYWRkdHJlZQorZmxhZ3MgPSAkKGZvcmVhY2ggbywkKCQoMSkpLCQoaWYgJChmaWx0ZXIgLUklLCQobykpLCQoY2FsbCBhZGR0cmVlLCQobykpLCQobykpKQorCisjIElmIHF1aWV0IGlzIHNldCwgb25seSBwcmludCBzaG9ydCB2ZXJzaW9uIG9mIGNvbW1hbmQKK2NtZCA9IEAkKGVjaG8tY21kKSAkKGNtZF8kKDEpKQorCisjIEFkZCAkKG9iaikvIGZvciBwYXRocyB0aGF0IGlzIG5vdCBhYnNvbHV0ZQorb2JqZWN0aWZ5ID0gJChmb3JlYWNoIG8sJCgxKSwkKGlmICQoZmlsdGVyIC8lLCQobykpLCQobyksJChvYmopLyQobykpKQorCisjIyMKKyMgaWZfY2hhbmdlZCAgICAgIC0gZXhlY3V0ZSBjb21tYW5kIGlmIGFueSBwcmVyZXF1aXNpdGUgaXMgbmV3ZXIgdGhhbgorIyAgICAgICAgICAgICAgICAgICB0YXJnZXQsIG9yIGNvbW1hbmQgbGluZSBoYXMgY2hhbmdlZAorIyBpZl9jaGFuZ2VkX2RlcCAgLSBhcyBpZl9jaGFuZ2VkLCBidXQgdXNlcyBmaXhkZXAgdG8gcmV2ZWFsIGRlcGVuZGVuY2llcworIyAgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgdXNlZCBjb25maWcgc3ltYm9scworIyBpZl9jaGFuZ2VkX3J1bGUgLSBhcyBpZl9jaGFuZ2VkIGJ1dCBleGVjdXRlIHJ1bGUgaW5zdGVhZAorIyBTZWUgRG9jdW1lbnRhdGlvbi9rYnVpbGQvbWFrZWZpbGVzLnR4dCBmb3IgbW9yZSBpbmZvCisKK2lmbmVxICgkKEtCVUlMRF9OT0NNRERFUCksMSkKKyMgQ2hlY2sgaWYgYm90aCBhcmd1bWVudHMgaGFzIHNhbWUgYXJndW1lbnRzLiBSZXN1bHQgaW4gZW1wdHkgc3RyaW5nIGlmIGVxdWFsCisjIFVzZXIgbWF5IG92ZXJyaWRlIHRoaXMgY2hlY2sgdXNpbmcgbWFrZSBLQlVJTERfTk9DTURERVA9MQorYXJnLWNoZWNrID0gJChzdHJpcCAkKGZpbHRlci1vdXQgJCgxKSwgJCgyKSkgJChmaWx0ZXItb3V0ICQoMiksICQoMSkpICkKK2VuZGlmCisKKyMgZWNobyBjb21tYW5kLiBTaG9ydCB2ZXJzaW9uIGlzICQocXVpZXQpIGVxdWFscyBxdWlldCwgb3RoZXJ3aXNlIGZ1bGwgY29tbWFuZAorZWNoby1jbWQgPSAkKGlmICQoJChxdWlldCljbWRfJCgxKSksIFwKKwllY2hvICcgICQoY2FsbCBlc2NzcSwkKCQocXVpZXQpY21kXyQoMSkpKSc7KQorCittYWtlLWNtZCA9ICQoc3Vic3QgXCMsXFxcIywkKHN1YnN0ICQkLCQkJCQsJChjYWxsIGVzY3NxLCQoY21kXyQoMSkpKSkpCisKKyMgZnVuY3Rpb24gdG8gb25seSBleGVjdXRlIHRoZSBwYXNzZWQgY29tbWFuZCBpZiBuZWNlc3NhcnkKKyMgPic8IHN1YnN0aXR1dGlvbiBpcyBmb3IgZWNobyB0byB3b3JrLCA+JDwgc3Vic3RpdHV0aW9uIHRvIHByZXNlcnZlICQgd2hlbiByZWxvYWRpbmcgLmNtZCBmaWxlCisjIG5vdGU6IHdoZW4gdXNpbmcgaW5saW5lIHBlcmwgc2NyaXB0cyBbcGVybCAtZSAnLi4uJCR0PTE7Li4uJ10gaW4gJChjbWRfeHh4KSBkb3VibGUgJCQgeW91ciBwZXJsIHZhcnMKKyMKK2lmX2NoYW5nZWQgPSAkKGlmICQoc3RyaXAgJChmaWx0ZXItb3V0ICQoUEhPTlkpLCQ/KSAgICAgICAgICBcCisJCSQoY2FsbCBhcmctY2hlY2ssICQoY21kXyQoMSkpLCAkKGNtZF8kQCkpICksIFwKKwlAc2V0IC1lOyBcCisJJChlY2hvLWNtZCkgJChjbWRfJCgxKSk7IFwKKwllY2hvICdjbWRfJEAgOj0gJChtYWtlLWNtZCknID4gJChARCkvLiQoQEYpLmNtZCkKKworIyBleGVjdXRlIHRoZSBjb21tYW5kIGFuZCBhbHNvIHBvc3Rwcm9jZXNzIGdlbmVyYXRlZCAuZCBkZXBlbmRlbmNpZXMKKyMgZmlsZQoraWZfY2hhbmdlZF9kZXAgPSAkKGlmICQoc3RyaXAgJChmaWx0ZXItb3V0ICQoUEhPTlkpLCQ/KSAgXAorCQkkKGZpbHRlci1vdXQgRk9SQ0UgJCh3aWxkY2FyZCAkXiksJF4pICAgIFwKKwkkKGNhbGwgYXJnLWNoZWNrLCAkKGNtZF8kKDEpKSwgJChjbWRfJEApKSApLCAgICAgXAorCUBzZXQgLWU7IFwKKwkkKGVjaG8tY21kKSAkKGNtZF8kKDEpKTsgXAorCXNjcmlwdHMvYmFzaWMvZml4ZGVwICQoZGVwZmlsZSkgJEAgJyQobWFrZS1jbWQpJyA+ICQoQEQpLy4kKEBGKS50bXA7IFwKKwlybSAtZiAkKGRlcGZpbGUpOyBcCisJbXYgLWYgJChARCkvLiQoQEYpLnRtcCAkKEBEKS8uJChARikuY21kKQorCisjIFVzYWdlOiAkKGNhbGwgaWZfY2hhbmdlZF9ydWxlLGZvbykKKyMgd2lsbCBjaGVjayBpZiAkKGNtZF9mb28pIGNoYW5nZWQsIG9yIGFueSBvZiB0aGUgcHJlcXVpc2l0ZXMgY2hhbmdlZCwKKyMgYW5kIGlmIHNvIHdpbGwgZXhlY3V0ZSAkKHJ1bGVfZm9vKQoraWZfY2hhbmdlZF9ydWxlID0gJChpZiAkKHN0cmlwICQoZmlsdGVyLW91dCAkKFBIT05ZKSwkPykgICAgICAgICAgICBcCisJCQkkKGNhbGwgYXJnLWNoZWNrLCAkKGNtZF8kKDEpKSwgJChjbWRfJEApKSApLFwKKwkJCUBzZXQgLWU7IFwKKwkJCSQocnVsZV8kKDEpKSkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvS2J1aWxkLnNyYyBiL3NjcmlwdHMvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2I0MjMyCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsNyBAQAorIyMjCisjIHNjcmlwdHMgY29udGFpbnMgc291cmNlcyBmb3IgdmFyaW91cyBoZWxwZXIgcHJvZ3JhbXMgdXNlZCB0aHJvdWdob3V0CisjIHRoZSBrZXJuZWwgZm9yIHRoZSBidWlsZCBwcm9jZXNzLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBMZXQgY2xlYW4gZGVzY2VuZCBpbnRvIHN1YmRpcnMKK3N1YmRpci0gKz0gYmFzaWMga2NvbmZpZwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5JTUEgYi9zY3JpcHRzL01ha2VmaWxlLklNQQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWNlZDI5Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5JTUEKQEAgLTAsMCArMSwyMDggQEAKKyMgVGhpcyBpcyBjb21wbGV0ZWx5IHVuc3VwcG9ydGVkLgorIworIyBVYXNnZTogbWFrZSAtZiBzY3JpcHRzL01ha2VmaWxlLklNQQorIworIyBGaXggQ09NQklORURfQ09NUElMRSB1cHN0cmVhbSAoaW4gdGhlIEtidWlsZCkgYW5kIHByb3BhZ2F0ZQorIyB0aGUgY2hhbmdlcyBiYWNrCitzcmN0cmVlCQk6PSAkKGlmICQoS0JVSUxEX1NSQyksJChLQlVJTERfU1JDKSwkKENVUkRJUikpCitvYmp0cmVlCQk6PSAkKENVUkRJUikKK3NyYwkJOj0gJChzcmN0cmVlKQorb2JqCQk6PSAkKG9ianRyZWUpCisKKyMgTWFrZSBnZW5lcmF0ZWQgZmlsZXMKK0RVTU1ZIDo9ICQoc2hlbGwgJChRKSQoc3JjdHJlZSkvc2NyaXB0cy9nZW5fYnVpbGRfZmlsZXMuc2ggJChzcmN0cmVlKSAkKG9ianRyZWUpID4mMikKKworIyBMb29rIGZvciBtYWtlIGluY2x1ZGUgZmlsZXMgcmVsYXRpdmUgdG8gcm9vdCBvZiBzcmMKK01BS0VGTEFHUyArPSAtLWluY2x1ZGUtZGlyPSQoc3JjdHJlZSkKKworZGVmYXVsdDogYnVzeWJveAorCitpbmNsdWRlIC5jb25maWcKKworIyBDcm9zcyBjb21waWxpbmcgYW5kIHNlbGVjdGluZyBkaWZmZXJlbnQgc2V0IG9mIGdjYy9iaW4tdXRpbHMKK2lmZXEgKCQoQ1JPU1NfQ09NUElMRSksKQorQ1JPU1NfQ09NUElMRSA6PSAkKHN1YnN0ICIsLCQoQ09ORklHX0NST1NTX0NPTVBJTEVSX1BSRUZJWCkpCitlbmRpZgorCitpZm5lcSAoJChDUk9TU19DT01QSUxFKSwpCitTVUJBUkNIIDo9ICQoc2hlbGwgZWNobyAkKENST1NTX0NPTVBJTEUpIHwgY3V0IC1kLSAtZjEpCitlbHNlCitTVUJBUkNIIDo9ICQoc2hlbGwgdW5hbWUgLW0pCitlbmRpZgorU1VCQVJDSCA6PSAkKHNoZWxsIGVjaG8gJChTVUJBUkNIKSB8IHNlZCAtZSBzL2kuODYvaTM4Ni8gLWUgcy9zdW40dS9zcGFyYzY0LyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1lIHMvYXJtLiovYXJtLyAtZSBzL3NhMTEwL2FybS8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtZSBzL3MzOTB4L3MzOTAvIC1lIHMvcGFyaXNjNjQvcGFyaXNjLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1lIHMvcHBjLiovcG93ZXJwYy8gLWUgcy9taXBzLiovbWlwcy8gKQorQVJDSCA/PSAkKFNVQkFSQ0gpCisKK2lmbmRlZiBIT1NUQ0MKK0hPU1RDQyA9IGNjCitlbmRpZgorQVMgICAgICAgICAgICAgID0gJChDUk9TU19DT01QSUxFKWFzCitDQyAgICAgICAgICAgICAgPSAkKENST1NTX0NPTVBJTEUpZ2NjCitMRCAgICAgICAgICAgICAgPSAkKENDKSAtbm9zdGRsaWIKK0NQUCAgICAgICAgICAgICA9ICQoQ0MpIC1FCitBUiAgICAgICAgICAgICAgPSAkKENST1NTX0NPTVBJTEUpYXIKK05NICAgICAgICAgICAgICA9ICQoQ1JPU1NfQ09NUElMRSlubQorU1RSSVAgICAgICAgICAgID0gJChDUk9TU19DT01QSUxFKXN0cmlwCitPQkpDT1BZICAgICAgICAgPSAkKENST1NTX0NPTVBJTEUpb2JqY29weQorT0JKRFVNUCAgICAgICAgID0gJChDUk9TU19DT01QSUxFKW9iamR1bXAKKworQ0ZMQUdTICAgOj0gJChDRkxBR1MpCitDUFBGTEFHUyArPSAtRCJLQlVJTERfU1RSKHMpPVwjcyIgIy1RCisKKyMgV2UgbmVlZCBzb21lIGdlbmVyaWMgZGVmaW5pdGlvbnMKK2luY2x1ZGUgJChzcmN0cmVlKS9zY3JpcHRzL0tidWlsZC5pbmNsdWRlCisKK2luY2x1ZGUgTWFrZWZpbGUuZmxhZ3MKKworLWluY2x1ZGUgJChzcmN0cmVlKS9hcmNoLyQoQVJDSCkvTWFrZWZpbGUKK2lmZGVmIENPTkZJR19GRUFUVVJFX0NPTVBSRVNTX1VTQUdFCit1c2FnZV9zdHVmZiA9IGluY2x1ZGUvdXNhZ2VfY29tcHJlc3NlZC5oCitlbmRpZgorCitpZm5kZWYgQkJfVkVSCitCQl9WRVI6PSIiCitlbmRpZgorCitXSE9MRV9QUk9HUkFNOj0kKGNhbGwgY2Mtb3B0aW9uLC1md2hvbGUtcHJvZ3JhbSwpCisKKyMgcHVsbCBpbiB0aGUgY29uZmlnIHN0dWZmCitsaWItYWxsLXkgOj0gYXBwbGV0cy9hcHBsZXRzLm8KK2xpYi15Oj0KK2luY2x1ZGUgcHJvY3BzL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxwcm9jcHMvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBuZXR3b3JraW5nL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxuZXR3b3JraW5nLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgbmV0d29ya2luZy91ZGhjcC9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsbmV0d29ya2luZy91ZGhjcC8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIG5ldHdvcmtpbmcvbGliaXByb3V0ZS9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsbmV0d29ya2luZy9saWJpcHJvdXRlLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgbG9naW51dGlscy9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsbG9naW51dGlscy8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIGFyY2hpdmFsL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxhcmNoaXZhbC8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIGFyY2hpdmFsL2xpYmFyY2hpdmUvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLGFyY2hpdmFsL2xpYmFyY2hpdmUvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBhcHBsZXRzL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxhcHBsZXRzLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgZTJmc3Byb2dzL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxlMmZzcHJvZ3MvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQorI2luY2x1ZGUgZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvS2J1aWxkCisjbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxlMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy8lLCQoc29ydCAkKGxpYi15KSkpCisjbGliLXk6PQorI2luY2x1ZGUgZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzL0tidWlsZAorI2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZXh0MmZzLyUsJChzb3J0ICQobGliLXkpKSkKKyNsaWIteTo9CisjaW5jbHVkZSBlMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy9ibGtpZC9LYnVpbGQKKyNsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLGUyZnNwcm9ncy9vbGRfZTJmc3Byb2dzL2Jsa2lkLyUsJChzb3J0ICQobGliLXkpKSkKKyNsaWIteTo9CisjaW5jbHVkZSBlMmZzcHJvZ3Mvb2xkX2UyZnNwcm9ncy91dWlkL0tidWlsZAorI2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvdXVpZC8lLCQoc29ydCAkKGxpYi15KSkpCisjbGliLXk6PQorI2luY2x1ZGUgZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwL0tidWlsZAorI2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsZTJmc3Byb2dzL29sZF9lMmZzcHJvZ3MvZTJwLyUsJChzb3J0ICQobGliLXkpKSkKKyNsaWIteTo9CitpbmNsdWRlIGRlYmlhbnV0aWxzL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxkZWJpYW51dGlscy8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIHJ1bml0L0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxydW5pdC8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIG1vZHV0aWxzL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxtb2R1dGlscy8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIG1pc2N1dGlscy9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsbWlzY3V0aWxzLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgbWFpbHV0aWxzL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxtYWlsdXRpbHMvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBjb3JldXRpbHMvbGliY29yZXV0aWxzL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxjb3JldXRpbHMvbGliY29yZXV0aWxzLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgY29yZXV0aWxzL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxjb3JldXRpbHMvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBzeXNrbG9nZC9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsc3lza2xvZ2QvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBzaGVsbC9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsc2hlbGwvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBjb25zb2xlLXRvb2xzL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxjb25zb2xlLXRvb2xzLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgZmluZHV0aWxzL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxmaW5kdXRpbHMvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSB1dGlsLWxpbnV4L0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSx1dGlsLWxpbnV4LyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgdXRpbC1saW51eC92b2x1bWVfaWQvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLHV0aWwtbGludXgvdm9sdW1lX2lkLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgaW5pdC9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsaW5pdC8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIGxpYnB3ZGdycC9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsbGlicHdkZ3JwLyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgZWRpdG9ycy9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsZWRpdG9ycy8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIHByaW50dXRpbHMvS2J1aWxkCitsaWItYWxsLXkgKz0gJChwYXRzdWJzdCAlLHByaW50dXRpbHMvJSwkKHNvcnQgJChsaWIteSkpKQorbGliLXk6PQoraW5jbHVkZSBzZWxpbnV4L0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxzZWxpbnV4LyUsJChzb3J0ICQobGliLXkpKSkKK2xpYi15Oj0KK2luY2x1ZGUgc2NyaXB0cy9LYnVpbGQKK2xpYi1hbGwteSArPSAkKHBhdHN1YnN0ICUsc2NyaXB0cy8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CitpbmNsdWRlIGxpYmJiL0tidWlsZAorbGliLWFsbC15ICs9ICQocGF0c3Vic3QgJSxsaWJiYi8lLCQoc29ydCAkKGxpYi15KSkpCitsaWIteTo9CisKK2NvbW1hOj0sCitidXN5Ym94X3Vuc3RyaXBwZWQubzogJCh1c2FnZV9zdHVmZikgaW5jbHVkZS9hcHBsZXRfdGFibGVzLmggaW5jbHVkZS9OVU1fQVBQTEVUUy5oIGluY2x1ZGUvYXV0b2NvbmYuaAorCSQoQ0MpICQoQ1BQRkxBR1MpICQoQ0ZMQUdTKSAkKEVYVFJBX0NGTEFHUykgXAorCQkkKHBhdHN1YnN0ICUsLVdsJChjb21tYSklLCQoTERGTEFHUykgJChFWFRSQV9MREZMQUdTKSkgXAorCQktREdDQ19DT01CSU5FPTEgXAorCQktLWNvbWJpbmUgJChXSE9MRV9QUk9HUkFNKSBcCisJCS1mdW5pdC1hdC1hLXRpbWUgLVduby1lcnJvciAtc3RkPWdudTk5ICBcCisJCS1jIC1vIGJ1c3lib3hfdW5zdHJpcHBlZC5vIFwKKwkJJChsaWItYWxsLXk6Lm89LmMpCisKK2J1c3lib3g6IGJ1c3lib3hfdW5zdHJpcHBlZC5vCisJJChzcmN0cmVlKS9zY3JpcHRzL3RyeWxpbmsgXAorCQlidXN5Ym94X3Vuc3RyaXBwZWQgXAorCQkiJChDQykgJChDRkxBR1NfYnVzeWJveCkiIFwKKwkJIiQoQ0ZMQUdTKSIgXAorCQkiJChMREZMQUdTKSIgXAorCQkiYnVzeWJveF91bnN0cmlwcGVkLm8iIFwKKwkJIiIgXAorCQkiY3J5cHQgbSIKKwljcCAtZiAkKEApX3Vuc3RyaXBwZWQgJEAKKwktJChTVFJJUCkgLXMgLVIgLm5vdGUgLVIgLmNvbW1lbnQgLVIgLnZlcnNpb24gJEAKKworIyBJZiAuY29uZmlnIGlzIG5ld2VyIHRoYW4gaW5jbHVkZS9hdXRvY29uZi5oLCBzb21lb25lIHRpbmtlcmVkCisjIHdpdGggaXQgYW5kIGZvcmdvdCB0byBydW4gbWFrZSBvbGRjb25maWcuCitpbmNsdWRlL2F1dG9jb25mLmg6IC5jb25maWcKKwkkKE1BS0UpIC1mICQoc3JjdHJlZSkvTWFrZWZpbGUgc2lsZW50b2xkY29uZmlnCisKKyMgT3ZlcnJpZGUgcnVsZXMgZm9yIGhvc3QgY29tcGlsZQorYXBwbGV0cy91c2FnZTogaW5jbHVkZS9hdXRvY29uZi5oCisJJChIT1NUQ0MpIC1XYWxsIC1PMiAtSSQoc3JjdHJlZSkvaW5jbHVkZSAtbyBhcHBsZXRzL3VzYWdlIGFwcGxldHMvdXNhZ2UuYworCithcHBsZXRzL2FwcGxldF90YWJsZXM6IGluY2x1ZGUvYXV0b2NvbmYuaAorCSQoSE9TVENDKSAtV2FsbCAtTzIgLUkkKHNyY3RyZWUpL2luY2x1ZGUgLW8gYXBwbGV0cy9hcHBsZXRfdGFibGVzIGFwcGxldHMvYXBwbGV0X3RhYmxlcy5jCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmJ1aWxkIGIvc2NyaXB0cy9NYWtlZmlsZS5idWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWFjNDVmCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5idWlsZApAQCAtMCwwICsxLDM0NCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBCdWlsZGluZworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitzcmMgOj0gJChvYmopCisKK1BIT05ZIDo9IF9fYnVpbGQKK19fYnVpbGQ6CisKKyMgUmVhZCAuY29uZmlnIGlmIGl0IGV4aXN0LCBvdGhlcndpc2UgaWdub3JlCistaW5jbHVkZSAuY29uZmlnCisKK2luY2x1ZGUgc2NyaXB0cy9LYnVpbGQuaW5jbHVkZQorCisjIFRoZSBmaWxlbmFtZSBLYnVpbGQgaGFzIHByZWNlZGVuY2Ugb3ZlciBNYWtlZmlsZQorIyBiYm94OiB3ZSBhbHNvIHRyeSB0byBpbmNsdWRlIEtidWlsZCBmaWxlIGluIG9iaiB0cmVlIGZpcnN0CitrYnVpbGQtZGlyIDo9ICQoaWYgJChmaWx0ZXIgLyUsJChzcmMpKSwkKHNyYyksJChzcmN0cmVlKS8kKHNyYykpCitpbmNsdWRlICQoaWYgJCh3aWxkY2FyZCAkKHNyYykvS2J1aWxkKSwgJChzcmMpL0tidWlsZCwgXAorCQkkKGlmICQod2lsZGNhcmQgJChrYnVpbGQtZGlyKS9LYnVpbGQpLCAkKGtidWlsZC1kaXIpL0tidWlsZCwgXAorCQkJJChrYnVpbGQtZGlyKS9NYWtlZmlsZSBcCisJCSkgXAorCSkKKworaW5jbHVkZSBzY3JpcHRzL01ha2VmaWxlLmxpYgorCitpZmRlZiBob3N0LXByb2dzCitpZm5lcSAoJChob3N0cHJvZ3MteSksJChob3N0LXByb2dzKSkKKyQod2FybmluZyBrYnVpbGQ6ICQob2JqKS9NYWtlZmlsZSAtIFVzYWdlIG9mIGhvc3QtcHJvZ3MgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHJlcGxhY2Ugd2l0aCBob3N0cHJvZ3MteSEpCitob3N0cHJvZ3MteSArPSAkKGhvc3QtcHJvZ3MpCitlbmRpZgorZW5kaWYKKworIyBEbyBub3QgaW5jbHVkZSBob3N0IHJ1bGVzIHVubGVzIG5lZWRlZAoraWZuZXEgKCQoaG9zdHByb2dzLXkpJChob3N0cHJvZ3MtbSksKQoraW5jbHVkZSBzY3JpcHRzL01ha2VmaWxlLmhvc3QKK2VuZGlmCisKK2lmbmVxICgkKEtCVUlMRF9TUkMpLCkKKyMgQ3JlYXRlIG91dHB1dCBkaXJlY3RvcnkgaWYgbm90IGFscmVhZHkgcHJlc2VudAorX2R1bW15IDo9ICQoc2hlbGwgWyAtZCAkKG9iaikgXSB8fCBta2RpciAtcCAkKG9iaikpCisKKyMgQ3JlYXRlIGRpcmVjdG9yaWVzIGZvciBvYmplY3QgZmlsZXMgaWYgZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0CisjIE5lZWRlZCB3aGVuIG9iai15IDo9IGRpci9maWxlLm8gc3ludGF4IGlzIHVzZWQKK19kdW1teSA6PSAkKGZvcmVhY2ggZCwkKG9iai1kaXJzKSwgJChzaGVsbCBbIC1kICQoZCkgXSB8fCBta2RpciAtcCAkKGQpKSkKK2VuZGlmCisKKworaWZkZWYgRVhUUkFfVEFSR0VUUworJCh3YXJuaW5nIGtidWlsZDogJChvYmopL01ha2VmaWxlIC0gVXNhZ2Ugb2YgRVhUUkFfVEFSR0VUUyBpcyBvYnNvbGV0ZSBpbiAyLjYuIFBsZWFzZSBmaXghKQorZW5kaWYKKworaWZkZWYgYnVpbGQtdGFyZ2V0cworJCh3YXJuaW5nIGtidWlsZDogJChvYmopL01ha2VmaWxlIC0gVXNhZ2Ugb2YgYnVpbGQtdGFyZ2V0cyBpcyBvYnNvbGV0ZSBpbiAyLjYuIFBsZWFzZSBmaXghKQorZW5kaWYKKworaWZkZWYgZXhwb3J0LW9ianMKKyQod2FybmluZyBrYnVpbGQ6ICQob2JqKS9NYWtlZmlsZSAtIFVzYWdlIG9mIGV4cG9ydC1vYmpzIGlzIG9ic29sZXRlIGluIDIuNi4gUGxlYXNlIGZpeCEpCitlbmRpZgorCitpZmRlZiBPX1RBUkdFVAorJCh3YXJuaW5nIGtidWlsZDogJChvYmopL01ha2VmaWxlIC0gVXNhZ2Ugb2YgT19UQVJHRVQgOj0gJChPX1RBUkdFVCkgaXMgb2Jzb2xldGUgaW4gMi42LiBQbGVhc2UgZml4ISkKK2VuZGlmCisKK2lmZGVmIExfVEFSR0VUCiskKGVycm9yIGtidWlsZDogJChvYmopL01ha2VmaWxlIC0gVXNlIG9mIExfVEFSR0VUIGlzIHJlcGxhY2VkIGJ5IGxpYi15IGluIDIuNi4gUGxlYXNlIGZpeCEpCitlbmRpZgorCitpZmRlZiBsaXN0LW11bHRpCiskKHdhcm5pbmcga2J1aWxkOiAkKG9iaikvTWFrZWZpbGUgLSBsaXN0LW11bHRpIDo9ICQobGlzdC1tdWx0aSkgaXMgb2Jzb2xldGUgaW4gMi42LiBQbGVhc2UgZml4ISkKK2VuZGlmCisKK2lmbmRlZiBvYmoKKyQod2FybmluZyBrYnVpbGQ6IE1ha2VmaWxlLmJ1aWxkIGlzIGluY2x1ZGVkIGltcHJvcGVybHkpCitlbmRpZgorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpZm5lcSAoJChzdHJpcCAkKGxpYi15KSAkKGxpYi1tKSAkKGxpYi1uKSAkKGxpYi0pKSwpCitsaWItdGFyZ2V0IDo9ICQob2JqKS9saWIuYQorZW5kaWYKKworaWZuZXEgKCQoc3RyaXAgJChvYmoteSkgJChvYmotbSkgJChvYmotbikgJChvYmotKSAkKGxpYi10YXJnZXQpKSwpCitidWlsdGluLXRhcmdldCA6PSAkKG9iaikvYnVpbHQtaW4ubworZW5kaWYKKworIyBXZSBrZWVwIGEgbGlzdCBvZiBhbGwgbW9kdWxlcyBpbiAkKE1PRFZFUkRJUikKKworX19idWlsZDogJChpZiAkKEtCVUlMRF9CVUlMVElOKSwkKGJ1aWx0aW4tdGFyZ2V0KSAkKGxpYi10YXJnZXQpICQoZXh0cmEteSkpIFwKKwkgJChpZiAkKEtCVUlMRF9NT0RVTEVTKSwkKG9iai1tKSkgXAorCSAkKHN1YmRpci15bSkgJChhbHdheXMpCisJQDoKKworIyBMaW51cycga2VybmVsIHNhbml0eSBjaGVja2luZyB0b29sCitpZm5lcSAoJChLQlVJTERfQ0hFQ0tTUkMpLDApCisgIGlmZXEgKCQoS0JVSUxEX0NIRUNLU1JDKSwyKQorICAgIHF1aWV0X2NtZF9mb3JjZV9jaGVja3NyYyA9IENIRUNLICAgJDwKKyAgICAgICAgICBjbWRfZm9yY2VfY2hlY2tzcmMgPSAkKENIRUNLKSAkKENIRUNLRkxBR1MpICQoY19mbGFncykgJDwgOworICBlbHNlCisgICAgICBxdWlldF9jbWRfY2hlY2tzcmMgICAgID0gQ0hFQ0sgICAkPAorICAgICAgICAgICAgY21kX2NoZWNrc3JjICAgICA9ICQoQ0hFQ0spICQoQ0hFQ0tGTEFHUykgJChjX2ZsYWdzKSAkPCA7CisgIGVuZGlmCitlbmRpZgorCisKKyMgQ29tcGlsZSBDIHNvdXJjZXMgKC5jKQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBEZWZhdWx0IGlzIGJ1aWx0LWluLCB1bmxlc3Mgd2Uga25vdyBvdGhlcndpc2UKK21vZGtlcm5fY2ZsYWdzIDo9ICQoQ0ZMQUdTX0tFUk5FTCkKK3F1aWV0X21vZHRhZyA6PSAkKGVtcHR5KSAgICQoZW1wdHkpCisKKyQocmVhbC1vYmpzLW0pICAgICAgICA6IG1vZGtlcm5fY2ZsYWdzIDo9ICQoQ0ZMQUdTX01PRFVMRSkKKyQocmVhbC1vYmpzLW06Lm89LmkpICA6IG1vZGtlcm5fY2ZsYWdzIDo9ICQoQ0ZMQUdTX01PRFVMRSkKKyQocmVhbC1vYmpzLW06Lm89LnMpICA6IG1vZGtlcm5fY2ZsYWdzIDo9ICQoQ0ZMQUdTX01PRFVMRSkKKyQocmVhbC1vYmpzLW06Lm89LmxzdCk6IG1vZGtlcm5fY2ZsYWdzIDo9ICQoQ0ZMQUdTX01PRFVMRSkKKworJChyZWFsLW9ianMtbSkgICAgICAgIDogcXVpZXRfbW9kdGFnIDo9IFtNXQorJChyZWFsLW9ianMtbToubz0uaSkgIDogcXVpZXRfbW9kdGFnIDo9IFtNXQorJChyZWFsLW9ianMtbToubz0ucykgIDogcXVpZXRfbW9kdGFnIDo9IFtNXQorJChyZWFsLW9ianMtbToubz0ubHN0KTogcXVpZXRfbW9kdGFnIDo9IFtNXQorCiskKG9iai1tKSAgICAgICAgICAgICAgOiBxdWlldF9tb2R0YWcgOj0gW01dCisKKyMgRGVmYXVsdCBmb3Igbm90IG11bHRpLXBhcnQgbW9kdWxlcworbW9kbmFtZSA9ICQoKkYpCisKKyQobXVsdGktb2Jqcy1tKSAgICAgICAgIDogbW9kbmFtZSA9ICQobW9kbmFtZS1tdWx0aSkKKyQobXVsdGktb2Jqcy1tOi5vPS5pKSAgIDogbW9kbmFtZSA9ICQobW9kbmFtZS1tdWx0aSkKKyQobXVsdGktb2Jqcy1tOi5vPS5zKSAgIDogbW9kbmFtZSA9ICQobW9kbmFtZS1tdWx0aSkKKyQobXVsdGktb2Jqcy1tOi5vPS5sc3QpIDogbW9kbmFtZSA9ICQobW9kbmFtZS1tdWx0aSkKKyQobXVsdGktb2Jqcy15KSAgICAgICAgIDogbW9kbmFtZSA9ICQobW9kbmFtZS1tdWx0aSkKKyQobXVsdGktb2Jqcy15Oi5vPS5pKSAgIDogbW9kbmFtZSA9ICQobW9kbmFtZS1tdWx0aSkKKyQobXVsdGktb2Jqcy15Oi5vPS5zKSAgIDogbW9kbmFtZSA9ICQobW9kbmFtZS1tdWx0aSkKKyQobXVsdGktb2Jqcy15Oi5vPS5sc3QpIDogbW9kbmFtZSA9ICQobW9kbmFtZS1tdWx0aSkKKworcXVpZXRfY21kX2NjX3NfYyA9IENDICQocXVpZXRfbW9kdGFnKSAgJEAKK2NtZF9jY19zX2MgICAgICAgPSAkKENDKSAkKGNfZmxhZ3MpIC1mdmVyYm9zZS1hc20gLVMgLW8gJEAgJDwKKworJS5zOiAlLmMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsY2Nfc19jKQorCitxdWlldF9jbWRfY2NfaV9jID0gQ1BQICQocXVpZXRfbW9kdGFnKSAkQAorY21kX2NjX2lfYyAgICAgICA9ICQoQ1BQKSAkKGNfZmxhZ3MpICAgLW8gJEAgJDwKKworJS5pOiAlLmMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsY2NfaV9jKQorCisjIEMgKC5jKSBmaWxlcworIyBUaGUgQyBmaWxlIGlzIGNvbXBpbGVkIGFuZCB1cGRhdGVkIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gaXMgZ2VuZXJhdGVkLgorIyAoU2VlIGNtZF9jY19vX2MgKyByZWxldmFudCBwYXJ0IG9mIHJ1bGVfY2Nfb19jKQorCitxdWlldF9jbWRfY2Nfb19jID0gQ0MgJChxdWlldF9tb2R0YWcpICAkQAorCitpZm5kZWYgQ09ORklHX01PRFZFUlNJT05TCitjbWRfY2Nfb19jID0gJChDQykgJChjX2ZsYWdzKSAtYyAtbyAkQCAkPAorCitlbHNlCisjIFdoZW4gbW9kdWxlIHZlcnNpb25pbmcgaXMgZW5hYmxlZCB0aGUgZm9sbG93aW5nIHN0ZXBzIGFyZSBleGVjdXRlZDoKKyMgbyBjb21waWxlIGEgLnRtcF88ZmlsZT4ubyBmcm9tIDxmaWxlPi5jCisjIG8gaWYgLnRtcF88ZmlsZT4ubyBkb2Vzbid0IGNvbnRhaW4gYSBfX2tzeW10YWIgdmVyc2lvbiwgaS5lLiBkb2VzCisjICAgbm90IGV4cG9ydCBzeW1ib2xzLCB3ZSBqdXN0IHJlbmFtZSAudG1wXzxmaWxlPi5vIHRvIDxmaWxlPi5vIGFuZAorIyAgIGFyZSBkb25lLgorIyBvIG90aGVyd2lzZSwgd2UgY2FsY3VsYXRlIHN5bWJvbCB2ZXJzaW9ucyB1c2luZyB0aGUgZ29vZCBvbGQKKyMgICBnZW5rc3ltcyBvbiB0aGUgcHJlcHJvY2Vzc2VkIHNvdXJjZSBhbmQgcG9zdHByb2Nlc3MgdGhlbSBpbiBhIHdheQorIyAgIHRoYXQgdGhleSBhcmUgdXNhYmxlIGFzIGEgbGlua2VyIHNjcmlwdAorIyBvIGdlbmVyYXRlIDxmaWxlPi5vIGZyb20gLnRtcF88ZmlsZT4ubyB1c2luZyB0aGUgbGlua2VyIHRvCisjICAgcmVwbGFjZSB0aGUgdW5yZXNvbHZlZCBzeW1ib2xzIF9fY3JjX2V4cG9ydGVkX3N5bWJvbCB3aXRoCisjICAgdGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgY2hlY2tzdW0gZ2VuZXJhdGVkIGJ5IGdlbmtzeW1zCisKK2NtZF9jY19vX2MgPSAkKENDKSAkKGNfZmxhZ3MpIC1jIC1vICQoQEQpLy50bXBfJChARikgJDwKK2NtZF9tb2R2ZXJzaW9ucyA9CQkJCQkJCVwKKwlpZiAkKE9CSkRVTVApIC1oICQoQEQpLy50bXBfJChARikgfCBncmVwIC1xIF9fa3N5bXRhYjsgdGhlbglcCisJCSQoQ1BQKSAtRF9fR0VOS1NZTVNfXyAkKGNfZmxhZ3MpICQ8CQkJXAorCQl8ICQoR0VOS1NZTVMpIC1hICQoQVJDSCkJCQkJXAorCQk+ICQoQEQpLy50bXBfJChARjoubz0udmVyKTsJCQkJXAorCQkJCQkJCQkJXAorCQkkKExEKSAkKExERkxBR1MpIC1yIC1vICRAICQoQEQpLy50bXBfJChARikgCQlcCisJCQktVCAkKEBEKS8udG1wXyQoQEY6Lm89LnZlcik7CQkJXAorCQlybSAtZiAkKEBEKS8udG1wXyQoQEYpICQoQEQpLy50bXBfJChARjoubz0udmVyKTsJXAorCWVsc2UJCQkJCQkJCVwKKwkJbXYgLWYgJChARCkvLnRtcF8kKEBGKSAkQDsJCQkJXAorCWZpOworZW5kaWYKKworZGVmaW5lIHJ1bGVfY2Nfb19jCisJJChjYWxsIGVjaG8tY21kLGNoZWNrc3JjKSAkKGNtZF9jaGVja3NyYykJCQkgIFwKKwkkKGNhbGwgZWNoby1jbWQsY2Nfb19jKSAkKGNtZF9jY19vX2MpOwkJCQkgIFwKKwkkKGNtZF9tb2R2ZXJzaW9ucykJCQkJCQkgIFwKKwlzY3JpcHRzL2Jhc2ljL2ZpeGRlcCAkKGRlcGZpbGUpICRAICckKGNhbGwgbWFrZS1jbWQsY2Nfb19jKScgPiAkKEBEKS8uJChARikudG1wOyAgXAorCXJtIC1mICQoZGVwZmlsZSk7CQkJCQkJICBcCisJbXYgLWYgJChARCkvLiQoQEYpLnRtcCAkKEBEKS8uJChARikuY21kCitlbmRlZgorCisjIEJ1aWx0LWluIGFuZCBjb21wb3NpdGUgbW9kdWxlIHBhcnRzCisKKyUubzogJS5jIEZPUkNFCisJJChjYWxsIGNtZCxmb3JjZV9jaGVja3NyYykKKwkkKGNhbGwgaWZfY2hhbmdlZF9ydWxlLGNjX29fYykKKworIyBTaW5nbGUtcGFydCBtb2R1bGVzIGFyZSBzcGVjaWFsIHNpbmNlIHdlIG5lZWQgdG8gbWFyayB0aGVtIGluICQoTU9EVkVSRElSKQorCiskKHNpbmdsZS11c2VkLW0pOiAlLm86ICUuYyBGT1JDRQorCSQoY2FsbCBjbWQsZm9yY2VfY2hlY2tzcmMpCisJJChjYWxsIGlmX2NoYW5nZWRfcnVsZSxjY19vX2MpCisJQHsgZWNobyAkKEA6Lm89LmtvKTsgZWNobyAkQDsgfSA+ICQoTU9EVkVSRElSKS8kKEBGOi5vPS5tb2QpCisKK3F1aWV0X2NtZF9jY19sc3RfYyA9IE1LTFNUICAgJEAKKyAgICAgIGNtZF9jY19sc3RfYyA9ICQoQ0MpICQoY19mbGFncykgLWcgLWMgLW8gJCoubyAkPCAmJiBcCisJCSAgICAgJChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvc2NyaXB0cy9tYWtlbHN0ICQqLm8gXAorCQkJCSAgICAgU3lzdGVtLm1hcCAkKE9CSkRVTVApID4gJEAKKworJS5sc3Q6ICUuYyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxjY19sc3RfYykKKworIyBDb21waWxlIGFzc2VtYmxlciBzb3VyY2VzICguUykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK21vZGtlcm5fYWZsYWdzIDo9ICQoQUZMQUdTX0tFUk5FTCkKKworJChyZWFsLW9ianMtbSkgICAgICA6IG1vZGtlcm5fYWZsYWdzIDo9ICQoQUZMQUdTX01PRFVMRSkKKyQocmVhbC1vYmpzLW06Lm89LnMpOiBtb2RrZXJuX2FmbGFncyA6PSAkKEFGTEFHU19NT0RVTEUpCisKK3F1aWV0X2NtZF9hc19zX1MgPSBDUFAgJChxdWlldF9tb2R0YWcpICRACitjbWRfYXNfc19TICAgICAgID0gJChDUFApICQoYV9mbGFncykgICAtbyAkQCAkPAorCislLnM6ICUuUyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxhc19zX1MpCisKK3F1aWV0X2NtZF9hc19vX1MgPSBBUyAkKHF1aWV0X21vZHRhZykgICRACitjbWRfYXNfb19TICAgICAgID0gJChDQykgJChhX2ZsYWdzKSAtYyAtbyAkQCAkPAorCislLm86ICUuUyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxhc19vX1MpCisKK3RhcmdldHMgKz0gJChyZWFsLW9ianMteSkgJChyZWFsLW9ianMtbSkgJChsaWIteSkKK3RhcmdldHMgKz0gJChleHRyYS15KSAkKE1BS0VDTURHT0FMUykgJChhbHdheXMpCisKKyMgTGlua2VyIHNjcmlwdHMgcHJlcHJvY2Vzc29yICgubGRzLlMgLT4gLmxkcykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitxdWlldF9jbWRfY3BwX2xkc19TID0gTERTICAgICAkQAorICAgICAgY21kX2NwcF9sZHNfUyA9ICQoQ1BQKSAkKGNwcF9mbGFncykgLURfX0FTU0VNQkxZX18gLW8gJEAgJDwKKworJS5sZHM6ICUubGRzLlMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsY3BwX2xkc19TKQorCisjIEJ1aWxkIHRoZSBjb21waWxlZC1pbiB0YXJnZXRzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRvIGJ1aWxkIG9iamVjdHMgaW4gc3ViZGlycywgd2UgbmVlZCB0byBkZXNjZW5kIGludG8gdGhlIGRpcmVjdG9yaWVzCiskKHNvcnQgJChzdWJkaXItb2JqLXkpKTogJChzdWJkaXIteW0pIDsKKworIworIyBSdWxlIHRvIGNvbXBpbGUgYSBzZXQgb2YgLm8gZmlsZXMgaW50byBvbmUgLm8gZmlsZQorIworaWZkZWYgYnVpbHRpbi10YXJnZXQKK3F1aWV0X2NtZF9saW5rX29fdGFyZ2V0ID0gTEQgICAgICAkQAorIyBJZiB0aGUgbGlzdCBvZiBvYmplY3RzIHRvIGxpbmsgaXMgZW1wdHksIGp1c3QgY3JlYXRlIGFuIGVtcHR5IGJ1aWx0LWluLm8KKyMgLW5vc3RkbGliIGlzIGFkZGVkIHRvIG1ha2UgIm1ha2UgTEQ9Z2NjIC4uLiIgd29yayAoc29tZSBwZW9wbGUgdXNlIHRoYXQpCitjbWRfbGlua19vX3RhcmdldCA9ICQoaWYgJChzdHJpcCAkKG9iai15KSksXAorCQkkKExEKSAtbm9zdGRsaWIgJChsZF9mbGFncykgLXIgLW8gJEAgJChmaWx0ZXIgJChvYmoteSksICReKSxcCisJCXJtIC1mICRAOyAkKEFSKSByY3MgJEApCisKKyQoYnVpbHRpbi10YXJnZXQpOiAkKG9iai15KSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxpbmtfb190YXJnZXQpCisKK3RhcmdldHMgKz0gJChidWlsdGluLXRhcmdldCkKK2VuZGlmICMgYnVpbHRpbi10YXJnZXQKKworIworIyBSdWxlIHRvIGNvbXBpbGUgYSBzZXQgb2YgLm8gZmlsZXMgaW50byBvbmUgLmEgZmlsZQorIworaWZkZWYgbGliLXRhcmdldAorcXVpZXRfY21kX2xpbmtfbF90YXJnZXQgPSBBUiAgICAgICRACitjbWRfbGlua19sX3RhcmdldCA9IHJtIC1mICRAOyAkKEFSKSAkKEVYVFJBX0FSRkxBR1MpIHJjcyAkQCAkKGxpYi15KQorCiskKGxpYi10YXJnZXQpOiAkKGxpYi15KSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxpbmtfbF90YXJnZXQpCisKK3RhcmdldHMgKz0gJChsaWItdGFyZ2V0KQorZW5kaWYKKworIworIyBSdWxlIHRvIGxpbmsgY29tcG9zaXRlIG9iamVjdHMKKyMKKyMgIENvbXBvc2l0ZSBvYmplY3RzIGFyZSBzcGVjaWZpZWQgaW4ga2J1aWxkIG1ha2VmaWxlIGFzIGZvbGxvd3M6CisjICAgIDxjb21wb3NpdGUtb2JqZWN0Pi1vYmpzIDo9IDxsaXN0IG9mIC5vIGZpbGVzPgorIyAgb3IKKyMgICAgPGNvbXBvc2l0ZS1vYmplY3Q+LXkgICAgOj0gPGxpc3Qgb2YgLm8gZmlsZXM+CitsaW5rX211bHRpX2RlcHMgPSAgICAgICAgICAgICAgICAgICAgIFwKKyQoZmlsdGVyICQoYWRkcHJlZml4ICQob2JqKS8sICAgICAgICAgXAorJCgkKHN1YnN0ICQob2JqKS8sLCQoQDoubz0tb2JqcykpKSAgICBcCiskKCQoc3Vic3QgJChvYmopLywsJChAOi5vPS15KSkpKSwgJF4pCisKK3F1aWV0X2NtZF9saW5rX211bHRpLXkgPSBMRCAgICAgICRACitjbWRfbGlua19tdWx0aS15ID0gJChMRCkgJChsZF9mbGFncykgLXIgLW8gJEAgJChsaW5rX211bHRpX2RlcHMpCisKK3F1aWV0X2NtZF9saW5rX211bHRpLW0gPSBMRCBbTV0gICRACitjbWRfbGlua19tdWx0aS1tID0gJChMRCkgJChsZF9mbGFncykgJChMREZMQUdTX01PRFVMRSkgLW8gJEAgJChsaW5rX211bHRpX2RlcHMpCisKKyMgV2Ugd291bGQgcmF0aGVyIGhhdmUgYSBsaXN0IG9mIHJ1bGVzIGxpa2UKKyMgCWZvby5vOiAkKGZvby1vYmpzKQorIyBidXQgdGhhdCdzIG5vdCBzbyBlYXN5LCBzbyB3ZSByYXRoZXIgbWFrZSBhbGwgY29tcG9zaXRlIG9iamVjdHMgZGVwZW5kCisjIG9uIHRoZSBzZXQgb2YgYWxsIHRoZWlyIHBhcnRzCiskKG11bHRpLXVzZWQteSkgOiAlLm86ICQobXVsdGktb2Jqcy15KSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxpbmtfbXVsdGkteSkKKworJChtdWx0aS11c2VkLW0pIDogJS5vOiAkKG11bHRpLW9ianMtbSkgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxsaW5rX211bHRpLW0pCisJQHsgZWNobyAkKEA6Lm89LmtvKTsgZWNobyAkKGxpbmtfbXVsdGlfZGVwcyk7IH0gPiAkKE1PRFZFUkRJUikvJChARjoubz0ubW9kKQorCit0YXJnZXRzICs9ICQobXVsdGktdXNlZC15KSAkKG11bHRpLXVzZWQtbSkKKworCisjIERlc2NlbmRpbmcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1BIT05ZICs9ICQoc3ViZGlyLXltKQorJChzdWJkaXIteW0pOgorCSQoUSkkKE1BS0UpICQoYnVpbGQpPSRACisKKyMgQWRkIEZPUkNFIHRvIHRoZSBwcmVxdWlzaXRlcyBvZiBhIHRhcmdldCB0byBmb3JjZSBpdCB0byBiZSBhbHdheXMgcmVidWlsdC4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1BIT05ZICs9IEZPUkNFCisKK0ZPUkNFOgorCisjIFJlYWQgYWxsIHNhdmVkIGNvbW1hbmQgbGluZXMgYW5kIGRlcGVuZGVuY2llcyBmb3IgdGhlICQodGFyZ2V0cykgd2UKKyMgbWF5IGJlIGJ1aWxkaW5nIGFib3ZlLCB1c2luZyAkKGlmX2NoYW5nZWR7LF9kZXB9KS4gQXMgYW4KKyMgb3B0aW1pemF0aW9uLCB3ZSBkb24ndCBuZWVkIHRvIHJlYWQgdGhlbSBpZiB0aGUgdGFyZ2V0IGRvZXMgbm90CisjIGV4aXN0LCB3ZSB3aWxsIHJlYnVpbGQgYW55d2F5IGluIHRoYXQgY2FzZS4KKwordGFyZ2V0cyA6PSAkKHdpbGRjYXJkICQoc29ydCAkKHRhcmdldHMpKSkKK2NtZF9maWxlcyA6PSAkKHdpbGRjYXJkICQoZm9yZWFjaCBmLCQodGFyZ2V0cyksJChkaXIgJChmKSkuJChub3RkaXIgJChmKSkuY21kKSkKKworaWZuZXEgKCQoY21kX2ZpbGVzKSwpCisgIGluY2x1ZGUgJChjbWRfZmlsZXMpCitlbmRpZgorCisKKyMgRGVjbGFyZSB0aGUgY29udGVudHMgb2YgdGhlIC5QSE9OWSB2YXJpYWJsZSBhcyBwaG9ueS4gIFdlIGtlZXAgdGhhdAorIyBpbmZvcm1hdGlvbiBpbiBhIHZhcmlhYmxlIHNlIHdlIGNhbiB1c2UgaXQgaW4gaWZfY2hhbmdlZCBhbmQgZnJpZW5kcy4KKworLlBIT05ZOiAkKFBIT05ZKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5jbGVhbiBiL3NjcmlwdHMvTWFrZWZpbGUuY2xlYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNlMzk3ZgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUuY2xlYW4KQEAgLTAsMCArMSwxMDIgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQ2xlYW5pbmcgdXAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3JjIDo9ICQob2JqKQorCitQSE9OWSA6PSBfX2NsZWFuCitfX2NsZWFuOgorCisjIFNob3J0aGFuZCBmb3IgJChRKSQoTUFLRSkgc2NyaXB0cy9NYWtlZmlsZS5jbGVhbiBvYmo9ZGlyCisjIFVzYWdlOgorIyAkKFEpJChNQUtFKSAkKGNsZWFuKT1kaXIKK2NsZWFuIDo9IC1mICQoaWYgJChLQlVJTERfU1JDKSwkKHNyY3RyZWUpLylzY3JpcHRzL01ha2VmaWxlLmNsZWFuIG9iagorCisjIFRoZSBmaWxlbmFtZSBLYnVpbGQgaGFzIHByZWNlZGVuY2Ugb3ZlciBNYWtlZmlsZQora2J1aWxkLWRpciA6PSAkKGlmICQoZmlsdGVyIC8lLCQoc3JjKSksJChzcmMpLCQoc3JjdHJlZSkvJChzcmMpKQorLWluY2x1ZGUgJChpZiAkKHdpbGRjYXJkICQoa2J1aWxkLWRpcikvS2J1aWxkKSwgJChrYnVpbGQtZGlyKS9LYnVpbGQsICQoa2J1aWxkLWRpcikvTWFrZWZpbGUpCisKKyMgRmlndXJlIG91dCB3aGF0IHdlIG5lZWQgdG8gYnVpbGQgZnJvbSB0aGUgdmFyaW91cyB2YXJpYWJsZXMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworX19zdWJkaXIteQk6PSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQob2JqLXkpKSkKK3N1YmRpci15CSs9ICQoX19zdWJkaXIteSkKK19fc3ViZGlyLW0JOj0gJChwYXRzdWJzdCAlLywlLCQoZmlsdGVyICUvLCAkKG9iai1tKSkpCitzdWJkaXItbQkrPSAkKF9fc3ViZGlyLW0pCitfX3N1YmRpci1uCTo9ICQocGF0c3Vic3QgJS8sJSwkKGZpbHRlciAlLywgJChvYmotbikpKQorc3ViZGlyLW4JKz0gJChfX3N1YmRpci1uKQorX19zdWJkaXItCTo9ICQocGF0c3Vic3QgJS8sJSwkKGZpbHRlciAlLywgJChvYmotKSkpCitzdWJkaXItCQkrPSAkKF9fc3ViZGlyLSkKKworIyBTdWJkaXJlY3RvcmllcyB3ZSBuZWVkIHRvIGRlc2NlbmQgaW50bworCitzdWJkaXIteW0JOj0gJChzb3J0ICQoc3ViZGlyLXkpICQoc3ViZGlyLW0pKQorc3ViZGlyLXltbiAgICAgIDo9ICQoc29ydCAkKHN1YmRpci15bSkgJChzdWJkaXItbikgJChzdWJkaXItKSkKKworIyBBZGQgc3ViZGlyIHBhdGgKKworc3ViZGlyLXltbgk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoc3ViZGlyLXltbikpCisKKyMgYnVpbGQgYSBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZSwgdXN1YWxseSByZWxlYXRpdmUgdG8gdGhlIGN1cnJlbnQKKyMgZGlyZWN0b3J5CisKK19fY2xlYW4tZmlsZXMJOj0gJChleHRyYS15KSAkKEVYVFJBX1RBUkdFVFMpICQoYWx3YXlzKSBcCisJCSAgICQodGFyZ2V0cykgJChjbGVhbi1maWxlcykgICAgICAgICAgICAgXAorCQkgICAkKGhvc3QtcHJvZ3MpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJICAgJChob3N0cHJvZ3MteSkgJChob3N0cHJvZ3MtbSkgJChob3N0cHJvZ3MtKQorCisjIGFzIGNsZWFuLWZpbGVzIGlzIGdpdmVuIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgdGhpcyBhZGRzCisjIGEgJChvYmopIHByZWZpeCwgZXhjZXB0IGZvciBhYnNvbHV0ZSBwYXRocworCitfX2NsZWFuLWZpbGVzICAgOj0gJCh3aWxkY2FyZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICQoYWRkcHJlZml4ICQob2JqKS8sICQoZmlsdGVyLW91dCAvJSwgJChfX2NsZWFuLWZpbGVzKSkpIFwKKwkJICAgJChmaWx0ZXIgLyUsICQoX19jbGVhbi1maWxlcykpKQorCisjIGFzIGNsZWFuLWRpcnMgaXMgZ2l2ZW4gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCB0aGlzIGFkZHMKKyMgYSAkKG9iaikgcHJlZml4LCBleGNlcHQgZm9yIGFic29sdXRlIHBhdGhzCisKK19fY2xlYW4tZGlycyAgICA6PSAkKHdpbGRjYXJkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgJChhZGRwcmVmaXggJChvYmopLywgJChmaWx0ZXItb3V0IC8lLCAkKGNsZWFuLWRpcnMpKSkgICAgXAorCQkgICAkKGZpbHRlciAvJSwgJChjbGVhbi1kaXJzKSkpCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworcXVpZXRfY21kX2NsZWFuICAgID0gQ0xFQU4gICAkKG9iaikKKyAgICAgIGNtZF9jbGVhbiAgICA9IHJtIC1mICQoX19jbGVhbi1maWxlcykKK3F1aWV0X2NtZF9jbGVhbmRpciA9IENMRUFOICAgJChfX2NsZWFuLWRpcnMpCisgICAgICBjbWRfY2xlYW5kaXIgPSBybSAtcmYgJChfX2NsZWFuLWRpcnMpCisKKworX19jbGVhbjogJChzdWJkaXIteW1uKQoraWZuZXEgKCQoc3RyaXAgJChfX2NsZWFuLWZpbGVzKSksKQorCSskKGNhbGwgY21kLGNsZWFuKQorZW5kaWYKK2lmbmVxICgkKHN0cmlwICQoX19jbGVhbi1kaXJzKSksKQorCSskKGNhbGwgY21kLGNsZWFuZGlyKQorZW5kaWYKK2lmbmVxICgkKHN0cmlwICQoY2xlYW4tcnVsZSkpLCkKKwkrJChjbGVhbi1ydWxlKQorZW5kaWYKKwlAOgorCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEdlbmVyaWMgc3R1ZmYKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgRGVzY2VuZGluZworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUEhPTlkgKz0gJChzdWJkaXIteW1uKQorJChzdWJkaXIteW1uKToKKwkkKFEpJChNQUtFKSAkKGNsZWFuKT0kQAorCisjIElmIHF1aWV0IGlzIHNldCwgb25seSBwcmludCBzaG9ydCB2ZXJzaW9uIG9mIGNvbW1hbmQKKworY21kID0gQCQoaWYgJCgkKHF1aWV0KWNtZF8kKDEpKSxlY2hvICcgICQoJChxdWlldCljbWRfJCgxKSknICYmKSAkKGNtZF8kKDEpKQorCisKKyMgRGVjbGFyZSB0aGUgY29udGVudHMgb2YgdGhlIC5QSE9OWSB2YXJpYWJsZSBhcyBwaG9ueS4gIFdlIGtlZXAgdGhhdAorIyBpbmZvcm1hdGlvbiBpbiBhIHZhcmlhYmxlIHNlIHdlIGNhbiB1c2UgaXQgaW4gaWZfY2hhbmdlZCBhbmQgZnJpZW5kcy4KKworLlBIT05ZOiAkKFBIT05ZKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5ob3N0IGIvc2NyaXB0cy9NYWtlZmlsZS5ob3N0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjI4NTAKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL01ha2VmaWxlLmhvc3QKQEAgLTAsMCArMSwxNTUgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQnVpbGRpbmcgYmluYXJpZXMgb24gdGhlIGhvc3Qgc3lzdGVtCisjIEJpbmFyaWVzIGFyZSB1c2VkIGR1cmluZyB0aGUgY29tcGlsYXRpb24gb2YgdGhlIGtlcm5lbCwgZm9yIGV4YW1wbGUKKyMgdG8gcHJlcHJvY2VzcyBhIGRhdGEgZmlsZS4KKyMKKyMgQm90aCBDIGFuZCBDKysgaXMgc3VwcG9ydGVkLCBidXQgcHJlZmVycmVkIGxhbmd1YWdlIGlzIEMgZm9yIHN1Y2ggdXRpbGl0aWVzLgorIworIyBTYW1sZSBzeW50YXggKHNlZSBEb2N1bWVudGF0aW9uL2tidWlsZC9tYWtlZmlsZS50eHQgZm9yIHJlZmVyZW5jZSkKKyMgaG9zdHByb2dzLXkgOj0gYmluMmhleAorIyBXaWxsIGNvbXBpbGUgYmluMmhleC5jIGFuZCBjcmVhdGUgYW4gZXhlY3V0YWJsZSBuYW1lZCBiaW4yaGV4CisjCisjIGhvc3Rwcm9ncy15ICAgIDo9IGx4ZGlhbG9nCisjIGx4ZGlhbG9nLW9ianMgOj0gY2hlY2tsaXN0Lm8gbHhkaWFsb2cubworIyBXaWxsIGNvbXBpbGUgbHhkaWFsb2cuYyBhbmQgY2hlY2tsaXN0LmMsIGFuZCB0aGVuIGxpbmsgdGhlIGV4ZWN1dGFibGUKKyMgbHhkaWFsb2csIGJhc2VkIG9uIGNoZWNrbGlzdC5vIGFuZCBseGRpYWxvZy5vCisjCisjIGhvc3Rwcm9ncy15ICAgICAgOj0gcWNvbmYKKyMgcWNvbmYtY3h4b2JqcyAgIDo9IHFjb25mLm8KKyMgcWNvbmYtb2JqcyAgICAgIDo9IG1lbnUubworIyBXaWxsIGNvbXBpbGUgcWNvbmYgYXMgYSBDKysgcHJvZ3JhbSwgYW5kIG1lbnUgYXMgYSBDIHByb2dyYW0uCisjIFRoZXkgYXJlIGxpbmtlZCBhcyBDKysgY29kZSB0byB0aGUgZXhlY3V0YWJsZSBxY29uZgorCisjIGhvc3Rwcm9ncy15IDo9IGNvbmYKKyMgY29uZi1vYmpzICA6PSBjb25mLm8gbGlia2NvbmZpZy5zbworIyBsaWJrY29uZmlnLW9ianMgOj0gZXhwci5vIHR5cGUubworIyBXaWxsIGNyZWF0ZSBhIHNoYXJlZCBsaWJyYXJ5IG5hbWVkIGxpYmtjb25maWcuc28gdGhhdCBjb25zaXN0IG9mCisjIGV4cHIubyBhbmQgdHlwZS5vICh0aGV5IGFyZSBib3RoIGNvbXBpbGVkIGFzIEMgY29kZSBhbmQgdGhlIG9iamVjdCBmaWxlCisjIGFyZSBtYWRlIGFzIHBvc2l0aW9uIGluZGVwZW5kZW50IGNvZGUpLgorIyBjb25mLmMgaXMgY29tcGlsZWQgYXMgYSBjIHByb2dyYW0sIGFuZCBjb25mLm8gaXMgbGlua2VkIHRvZ2V0aGVyIHdpdGgKKyMgbGlia2NvbmZpZy5zbyBhcyB0aGUgZXhlY3V0YWJsZSBjb25mLgorIyBOb3RlOiBTaGFyZWQgbGlicmFyaWVzIGNvbnNpc3Rpbmcgb2YgQysrIGZpbGVzIGFyZSBub3Qgc3VwcG9ydGVkCisKK19faG9zdHByb2dzIDo9ICQoc29ydCAkKGhvc3Rwcm9ncy15KSQoaG9zdHByb2dzLW0pKQorCisjIGhvc3Rwcm9ncy15IDo9IHRvb2xzL2J1aWxkIG1heSBoYXZlIGJlZW4gc3BlY2lmaWVkLiBSZXRyZWl2ZSBkaXJlY3RvcnkKK29iai1kaXJzICs9ICQoZm9yZWFjaCBmLCQoX19ob3N0cHJvZ3MpLCAkKGlmICQoZGlyICQoZikpLCQoZGlyICQoZikpKSkKK29iai1kaXJzIDo9ICQoc3RyaXAgJChzb3J0ICQoZmlsdGVyLW91dCAuLywkKG9iai1kaXJzKSkpKQorCisKKyMgQyBjb2RlCisjIEV4ZWN1dGFibGVzIGNvbXBpbGVkIGZyb20gYSBzaW5nbGUgLmMgZmlsZQoraG9zdC1jc2luZ2xlCTo9ICQoZm9yZWFjaCBtLCQoX19ob3N0cHJvZ3MpLCQoaWYgJCgkKG0pLW9ianMpLCwkKG0pKSkKKworIyBDIGV4ZWN1dGFibGVzIGxpbmtlZCBiYXNlZCBvbiBzZXZlcmFsIC5vIGZpbGVzCitob3N0LWNtdWx0aQk6PSAkKGZvcmVhY2ggbSwkKF9faG9zdHByb2dzKSxcCisJCSAgICQoaWYgJCgkKG0pLWN4eG9ianMpLCwkKGlmICQoJChtKS1vYmpzKSwkKG0pKSkpCisKKyMgT2JqZWN0ICgubykgZmlsZXMgY29tcGlsZWQgZnJvbSAuYyBmaWxlcworaG9zdC1jb2Jqcwk6PSAkKHNvcnQgJChmb3JlYWNoIG0sJChfX2hvc3Rwcm9ncyksJCgkKG0pLW9ianMpKSkKKworIyBDKysgY29kZQorIyBDKysgZXhlY3V0YWJsZXMgY29tcGlsZWQgZnJvbSBhdCBsZWFzdCBvbiAuY2MgZmlsZQorIyBhbmQgemVybyBvciBtb3JlIC5jIGZpbGVzCitob3N0LWN4eG11bHRpCTo9ICQoZm9yZWFjaCBtLCQoX19ob3N0cHJvZ3MpLCQoaWYgJCgkKG0pLWN4eG9ianMpLCQobSkpKQorCisjIEMrKyBPYmplY3QgKC5vKSBmaWxlcyBjb21waWxlZCBmcm9tIC5jYyBmaWxlcworaG9zdC1jeHhvYmpzCTo9ICQoc29ydCAkKGZvcmVhY2ggbSwkKGhvc3QtY3h4bXVsdGkpLCQoJChtKS1jeHhvYmpzKSkpCisKKyMgU2hhcmVkIGxpYmFyaWVzIChvbmx5IC5jIHN1cHBvcnRlZCkKKyMgU2hhcmVkIGxpYnJhcmllcyAoLnNvKSAtIGFsbCAuc28gZmlsZXMgcmVmZXJlbmNlZCBpbiAieHh4LW9ianMiCitob3N0LWNzaGxpYgk6PSAkKHNvcnQgJChmaWx0ZXIgJS5zbywgJChob3N0LWNvYmpzKSkpCisjIFJlbW92ZSAuc28gZmlsZXMgZnJvbSAieHh4LW9ianMiCitob3N0LWNvYmpzCTo9ICQoZmlsdGVyLW91dCAlLnNvLCQoaG9zdC1jb2JqcykpCisKKyNPYmplY3QgKC5vKSBmaWxlcyB1c2VkIGJ5IHRoZSBzaGFyZWQgbGliYXJpZXMKK2hvc3QtY3Nob2Jqcwk6PSAkKHNvcnQgJChmb3JlYWNoIG0sJChob3N0LWNzaGxpYiksJCgkKG06LnNvPS1vYmpzKSkpKQorCitfX2hvc3Rwcm9ncyAgICAgOj0gJChhZGRwcmVmaXggJChvYmopLywkKF9faG9zdHByb2dzKSkKK2hvc3QtY3NpbmdsZQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoaG9zdC1jc2luZ2xlKSkKK2hvc3QtY211bHRpCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChob3N0LWNtdWx0aSkpCitob3N0LWNvYmpzCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChob3N0LWNvYmpzKSkKK2hvc3QtY3h4bXVsdGkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKGhvc3QtY3h4bXVsdGkpKQoraG9zdC1jeHhvYmpzCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChob3N0LWN4eG9ianMpKQoraG9zdC1jc2hsaWIJOj0gJChhZGRwcmVmaXggJChvYmopLywkKGhvc3QtY3NobGliKSkKK2hvc3QtY3Nob2Jqcwk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoaG9zdC1jc2hvYmpzKSkKK29iai1kaXJzICAgICAgICA6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQob2JqLWRpcnMpKQorCisjIyMjIworIyBIYW5kbGUgb3B0aW9ucyB0byBnY2MuIFN1cHBvcnQgYnVpbGRpbmcgd2l0aCBzZXBhcmF0ZSBvdXRwdXQgZGlyZWN0b3J5CisKK19ob3N0Y19mbGFncyAgID0gJChIT1NUQ0ZMQUdTKSAgICQoSE9TVF9FWFRSQUNGTEFHUykgICAkKEhPU1RDRkxBR1NfJCgqRikubykKK19ob3N0Y3h4X2ZsYWdzID0gJChIT1NUQ1hYRkxBR1MpICQoSE9TVF9FWFRSQUNYWEZMQUdTKSAkKEhPU1RDWFhGTEFHU18kKCpGKS5vKQorCitpZmVxICgkKEtCVUlMRF9TUkMpLCkKK19faG9zdGNfZmxhZ3MJPSAkKF9ob3N0Y19mbGFncykKK19faG9zdGN4eF9mbGFncwk9ICQoX2hvc3RjeHhfZmxhZ3MpCitlbHNlCitfX2hvc3RjX2ZsYWdzCT0gLUkkKG9iaikgJChjYWxsIGZsYWdzLF9ob3N0Y19mbGFncykKK19faG9zdGN4eF9mbGFncwk9IC1JJChvYmopICQoY2FsbCBmbGFncyxfaG9zdGN4eF9mbGFncykKK2VuZGlmCisKK2hvc3RjX2ZsYWdzICAgID0gLVdwLC1NRCwkKGRlcGZpbGUpICQoX19ob3N0Y19mbGFncykKK2hvc3RjeHhfZmxhZ3MgID0gLVdwLC1NRCwkKGRlcGZpbGUpICQoX19ob3N0Y3h4X2ZsYWdzKQorCisjIyMjIworIyBDb21waWxlIHByb2dyYW1zIG9uIHRoZSBob3N0CisKKyMgQ3JlYXRlIGV4ZWN1dGFibGUgZnJvbSBhIHNpbmdsZSAuYyBmaWxlCisjIGhvc3QtY3NpbmdsZSAtPiBFeGVjdXRhYmxlCitxdWlldF9jbWRfaG9zdC1jc2luZ2xlIAk9IEhPU1RDQyAgJEAKKyAgICAgIGNtZF9ob3N0LWNzaW5nbGUJPSAkKEhPU1RDQykgJChob3N0Y19mbGFncykgLW8gJEAgJDwgXAorCQkJICAkKEhPU1RfTE9BRExJQkVTKSAkKEhPU1RMT0FETElCRVNfJChARikpCiskKGhvc3QtY3NpbmdsZSk6ICU6ICUuYyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxob3N0LWNzaW5nbGUpCisKKyMgTGluayBhbiBleGVjdXRhYmxlIGJhc2VkIG9uIGxpc3Qgb2YgLm8gZmlsZXMsIGFsbCBwbGFpbiBjCisjIGhvc3QtY211bHRpIC0+IGV4ZWN1dGFibGUKK3F1aWV0X2NtZF9ob3N0LWNtdWx0aQk9IEhPU1RMRCAgJEAKKyAgICAgIGNtZF9ob3N0LWNtdWx0aQk9ICQoSE9TVENDKSAkKEhPU1RMREZMQUdTKSAtbyAkQCBcCisJCQkgICQoYWRkcHJlZml4ICQob2JqKS8sJCgkKEBGKS1vYmpzKSkgXAorCQkJICAkKEhPU1RfTE9BRExJQkVTKSAkKEhPU1RMT0FETElCRVNfJChARikpCiskKGhvc3QtY211bHRpKTogJTogJChob3N0LWNvYmpzKSAkKGhvc3QtY3NobGliKSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGhvc3QtY211bHRpKQorCisjIENyZWF0ZSAubyBmaWxlIGZyb20gYSBzaW5nbGUgLmMgZmlsZQorIyBob3N0LWNvYmpzIC0+IC5vCitxdWlldF9jbWRfaG9zdC1jb2Jqcwk9IEhPU1RDQyAgJEAKKyAgICAgIGNtZF9ob3N0LWNvYmpzCT0gJChIT1NUQ0MpICQoaG9zdGNfZmxhZ3MpIC1jIC1vICRAICQ8CiskKGhvc3QtY29ianMpOiAlLm86ICUuYyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxob3N0LWNvYmpzKQorCisjIExpbmsgYW4gZXhlY3V0YWJsZSBiYXNlZCBvbiBsaXN0IG9mIC5vIGZpbGVzLCBhIG1peHR1cmUgb2YgLmMgYW5kIC5jYworIyBob3N0LWN4eG11bHRpIC0+IGV4ZWN1dGFibGUKK3F1aWV0X2NtZF9ob3N0LWN4eG11bHRpCT0gSE9TVExEICAkQAorICAgICAgY21kX2hvc3QtY3h4bXVsdGkJPSAkKEhPU1RDWFgpICQoSE9TVExERkxBR1MpIC1vICRAIFwKKwkJCSAgJChmb3JlYWNoIG8sb2JqcyBjeHhvYmpzLFwKKwkJCSAgJChhZGRwcmVmaXggJChvYmopLywkKCQoQEYpLSQobykpKSkgXAorCQkJICAkKEhPU1RfTE9BRExJQkVTKSAkKEhPU1RMT0FETElCRVNfJChARikpCiskKGhvc3QtY3h4bXVsdGkpOiAlOiAkKGhvc3QtY29ianMpICQoaG9zdC1jeHhvYmpzKSAkKGhvc3QtY3NobGliKSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGhvc3QtY3h4bXVsdGkpCisKKyMgQ3JlYXRlIC5vIGZpbGUgZnJvbSBhIHNpbmdsZSAuY2MgKEMrKykgZmlsZQorcXVpZXRfY21kX2hvc3QtY3h4b2Jqcwk9IEhPU1RDWFggJEAKKyAgICAgIGNtZF9ob3N0LWN4eG9ianMJPSAkKEhPU1RDWFgpICQoaG9zdGN4eF9mbGFncykgLWMgLW8gJEAgJDwKKyQoaG9zdC1jeHhvYmpzKTogJS5vOiAlLmNjIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGhvc3QtY3h4b2JqcykKKworIyBDb21waWxlIC5jIGZpbGUsIGNyZWF0ZSBwb3NpdGlvbiBpbmRlcGVuZGVudCAubyBmaWxlCisjIGhvc3QtY3Nob2JqcyAtPiAubworcXVpZXRfY21kX2hvc3QtY3Nob2Jqcwk9IEhPU1RDQyAgLWZQSUMgJEAKKyAgICAgIGNtZF9ob3N0LWNzaG9ianMJPSAkKEhPU1RDQykgJChob3N0Y19mbGFncykgLWZQSUMgLWMgLW8gJEAgJDwKKyQoaG9zdC1jc2hvYmpzKTogJS5vOiAlLmMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsaG9zdC1jc2hvYmpzKQorCisjIExpbmsgYSBzaGFyZWQgbGlicmFyeSwgYmFzZWQgb24gcG9zaXRpb24gaW5kZXBlbmRlbnQgLm8gZmlsZXMKKyMgKi5vIC0+IC5zbyBzaGFyZWQgbGlicmFyeSAoaG9zdC1jc2hsaWIpCitxdWlldF9jbWRfaG9zdC1jc2hsaWIJPSBIT1NUTExEIC1zaGFyZWQgJEAKKyAgICAgIGNtZF9ob3N0LWNzaGxpYgk9ICQoSE9TVENDKSAkKEhPU1RMREZMQUdTKSAtc2hhcmVkIC1vICRAIFwKKwkJCSAgJChhZGRwcmVmaXggJChvYmopLywkKCQoQEY6LnNvPS1vYmpzKSkpIFwKKwkJCSAgJChIT1NUX0xPQURMSUJFUykgJChIT1NUTE9BRExJQkVTXyQoQEYpKQorJChob3N0LWNzaGxpYik6ICU6ICQoaG9zdC1jc2hvYmpzKSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGhvc3QtY3NobGliKQorCit0YXJnZXRzICs9ICQoaG9zdC1jc2luZ2xlKSAgJChob3N0LWNtdWx0aSkgJChob3N0LWNvYmpzKVwKKwkgICAkKGhvc3QtY3h4bXVsdGkpICQoaG9zdC1jeHhvYmpzKSAkKGhvc3QtY3NobGliKSAkKGhvc3QtY3Nob2JqcykKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUubGliIGIvc2NyaXB0cy9NYWtlZmlsZS5saWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U1NGVhNwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUubGliCkBAIC0wLDAgKzEsMTcwIEBACisjIEJhY2t3YXJkIGNvbXBhdGliaWxpdHkgLSB0byBiZSByZW1vdmVkLi4uCitleHRyYS15CSs9ICQoRVhUUkFfVEFSR0VUUykKKyMgRmlndXJlIG91dCB3aGF0IHdlIG5lZWQgdG8gYnVpbGQgZnJvbSB0aGUgdmFyaW91cyB2YXJpYWJsZXMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgV2hlbiBhbiBvYmplY3QgaXMgbGlzdGVkIHRvIGJlIGJ1aWx0IGNvbXBpbGVkLWluIGFuZCBtb2R1bGFyLAorIyBvbmx5IGJ1aWxkIHRoZSBjb21waWxlZC1pbiB2ZXJzaW9uCisKK29iai1tIDo9ICQoZmlsdGVyLW91dCAkKG9iai15KSwkKG9iai1tKSkKKworIyBMaWJyYXJpZXMgYXJlIGFsd2F5cyBjb2xsZWN0ZWQgaW4gb25lIGxpYiBmaWxlLgorIyBGaWx0ZXIgb3V0IG9iamVjdHMgYWxyZWFkeSBidWlsdC1pbgorCitsaWIteSA6PSAkKGZpbHRlci1vdXQgJChvYmoteSksICQoc29ydCAkKGxpYi15KSAkKGxpYi1tKSkpCisKKworIyBIYW5kbGUgb2JqZWN0cyBpbiBzdWJkaXJzCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBvIGlmIHdlIGVuY291bnRlciBmb28vIGluICQob2JqLXkpLCByZXBsYWNlIGl0IGJ5IGZvby9idWlsdC1pbi5vCisjICAgYW5kIGFkZCB0aGUgZGlyZWN0b3J5IHRvIHRoZSBsaXN0IG9mIGRpcnMgdG8gZGVzY2VuZCBpbnRvOiAkKHN1YmRpci15KQorIyBvIGlmIHdlIGVuY291bnRlciBmb28vIGluICQob2JqLW0pLCByZW1vdmUgaXQgZnJvbSAkKG9iai1tKQorIyAgIGFuZCBhZGQgdGhlIGRpcmVjdG9yeSB0byB0aGUgbGlzdCBvZiBkaXJzIHRvIGRlc2NlbmQgaW50bzogJChzdWJkaXItbSkKKworX19zdWJkaXIteQk6PSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQob2JqLXkpKSkKK3N1YmRpci15CSs9ICQoX19zdWJkaXIteSkKK19fc3ViZGlyLW0JOj0gJChwYXRzdWJzdCAlLywlLCQoZmlsdGVyICUvLCAkKG9iai1tKSkpCitzdWJkaXItbQkrPSAkKF9fc3ViZGlyLW0pCitvYmoteQkJOj0gJChwYXRzdWJzdCAlLywgJS9idWlsdC1pbi5vLCAkKG9iai15KSkKK29iai1tCQk6PSAkKGZpbHRlci1vdXQgJS8sICQob2JqLW0pKQorCisjIFN1YmRpcmVjdG9yaWVzIHdlIG5lZWQgdG8gZGVzY2VuZCBpbnRvCisKK3N1YmRpci15bQk6PSAkKHNvcnQgJChzdWJkaXIteSkgJChzdWJkaXItbSkpCisKKyMgaWYgJChmb28tb2JqcykgZXhpc3RzLCBmb28ubyBpcyBhIGNvbXBvc2l0ZSBvYmplY3QKK211bHRpLXVzZWQteSA6PSAkKHNvcnQgJChmb3JlYWNoIG0sJChvYmoteSksICQoaWYgJChzdHJpcCAkKCQobToubz0tb2JqcykpICQoJChtOi5vPS15KSkpLCAkKG0pKSkpCittdWx0aS11c2VkLW0gOj0gJChzb3J0ICQoZm9yZWFjaCBtLCQob2JqLW0pLCAkKGlmICQoc3RyaXAgJCgkKG06Lm89LW9ianMpKSAkKCQobToubz0teSkpKSwgJChtKSkpKQorbXVsdGktdXNlZCAgIDo9ICQobXVsdGktdXNlZC15KSAkKG11bHRpLXVzZWQtbSkKK3NpbmdsZS11c2VkLW0gOj0gJChzb3J0ICQoZmlsdGVyLW91dCAkKG11bHRpLXVzZWQtbSksJChvYmotbSkpKQorCisjIEJ1aWxkIGxpc3Qgb2YgdGhlIHBhcnRzIG9mIG91ciBjb21wb3NpdGUgb2JqZWN0cywgb3VyIGNvbXBvc2l0ZQorIyBvYmplY3RzIGRlcGVuZCBvbiB0aG9zZSAob2J2aW91c2x5KQorbXVsdGktb2Jqcy15IDo9ICQoZm9yZWFjaCBtLCAkKG11bHRpLXVzZWQteSksICQoJChtOi5vPS1vYmpzKSkgJCgkKG06Lm89LXkpKSkKK211bHRpLW9ianMtbSA6PSAkKGZvcmVhY2ggbSwgJChtdWx0aS11c2VkLW0pLCAkKCQobToubz0tb2JqcykpICQoJChtOi5vPS15KSkpCittdWx0aS1vYmpzICAgOj0gJChtdWx0aS1vYmpzLXkpICQobXVsdGktb2Jqcy1tKQorCisjICQoc3ViZGlyLW9iai15KSBpcyB0aGUgbGlzdCBvZiBvYmplY3RzIGluICQob2JqLXkpIHdoaWNoIGRvIG5vdCBsaXZlCisjIGluIHRoZSBsb2NhbCBkaXJlY3RvcnkKK3N1YmRpci1vYmoteSA6PSAkKGZvcmVhY2ggbywkKG9iai15KSwkKGlmICQoZmlsdGVyLW91dCAkKG8pLCQobm90ZGlyICQobykpKSwkKG8pKSkKKworIyAkKG9iai1kaXJzKSBpcyBhIGxpc3Qgb2YgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluIG9iamVjdCBmaWxlcworb2JqLWRpcnMgOj0gJChkaXIgJChtdWx0aS1vYmpzKSAkKHN1YmRpci1vYmoteSkpCisKKyMgUmVwbGFjZSBtdWx0aS1wYXJ0IG9iamVjdHMgYnkgdGhlaXIgaW5kaXZpZHVhbCBwYXJ0cywgbG9vayBhdCBsb2NhbCBkaXIgb25seQorcmVhbC1vYmpzLXkgOj0gJChmb3JlYWNoIG0sICQoZmlsdGVyLW91dCAkKHN1YmRpci1vYmoteSksICQob2JqLXkpKSwgJChpZiAkKHN0cmlwICQoJChtOi5vPS1vYmpzKSkgJCgkKG06Lm89LXkpKSksJCgkKG06Lm89LW9ianMpKSAkKCQobToubz0teSkpLCQobSkpKSAkKGV4dHJhLXkpCityZWFsLW9ianMtbSA6PSAkKGZvcmVhY2ggbSwgJChvYmotbSksICQoaWYgJChzdHJpcCAkKCQobToubz0tb2JqcykpICQoJChtOi5vPS15KSkpLCQoJChtOi5vPS1vYmpzKSkgJCgkKG06Lm89LXkpKSwkKG0pKSkKKworIyBBZGQgc3ViZGlyIHBhdGgKKworZXh0cmEteQkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKGV4dHJhLXkpKQorYWx3YXlzCQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoYWx3YXlzKSkKK3RhcmdldHMJCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJCh0YXJnZXRzKSkKK29iai15CQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQob2JqLXkpKQorb2JqLW0JCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChvYmotbSkpCitsaWIteQkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKGxpYi15KSkKK3N1YmRpci1vYmoteQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoc3ViZGlyLW9iai15KSkKK3JlYWwtb2Jqcy15CTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChyZWFsLW9ianMteSkpCityZWFsLW9ianMtbQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQocmVhbC1vYmpzLW0pKQorc2luZ2xlLXVzZWQtbQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoc2luZ2xlLXVzZWQtbSkpCittdWx0aS11c2VkLXkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKG11bHRpLXVzZWQteSkpCittdWx0aS11c2VkLW0JOj0gJChhZGRwcmVmaXggJChvYmopLywkKG11bHRpLXVzZWQtbSkpCittdWx0aS1vYmpzLXkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKG11bHRpLW9ianMteSkpCittdWx0aS1vYmpzLW0JOj0gJChhZGRwcmVmaXggJChvYmopLywkKG11bHRpLW9ianMtbSkpCitzdWJkaXIteW0JOj0gJChhZGRwcmVmaXggJChvYmopLywkKHN1YmRpci15bSkpCitvYmotZGlycwk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQob2JqLWRpcnMpKQorCisjIFRoZXNlIGZsYWdzIGFyZSBuZWVkZWQgZm9yIG1vZHZlcnNpb25zIGFuZCBjb21waWxpbmcsIHNvIHdlIGRlZmluZSB0aGVtIGhlcmUKKyMgYWxyZWFkeQorIyAkKG1vZG5hbWVfZmxhZ3MpICNkZWZpbmVzIEtCVUlMRF9NT0ROQU1FIGFzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgaXQgd2lsbAorIyBlbmQgdXAgaW4gKG9yIHdvdWxkLCBpZiBpdCBnZXRzIGNvbXBpbGVkIGluKQorIyBOb3RlOiBJdCdzIHBvc3NpYmxlIHRoYXQgb25lIG9iamVjdCBnZXRzIHBvdGVudGlhbGx5IGxpbmtlZCBpbnRvIG1vcmUKKyMgICAgICAgdGhhbiBvbmUgbW9kdWxlLiBJbiB0aGF0IGNhc2UgS0JVSUxEX01PRE5BTUUgd2lsbCBiZSBzZXQgdG8gZm9vX2JhciwKKyMgICAgICAgd2hlcmUgZm9vIGFuZCBiYXIgYXJlIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGVzLgorbmFtZS1maXggPSAkKHN1YnN0ICQoY29tbWEpLF8sJChzdWJzdCAtLF8sJDEpKQorYmFzZW5hbWVfZmxhZ3MgPSAtRCJLQlVJTERfQkFTRU5BTUU9S0JVSUxEX1NUUigkKGNhbGwgbmFtZS1maXgsJCgqRikpKSIKK21vZG5hbWVfZmxhZ3MgID0gJChpZiAkKGZpbHRlciAxLCQod29yZHMgJChtb2RuYW1lKSkpLFwKKyAgICAgICAgICAgICAgICAgLUQiS0JVSUxEX01PRE5BTUU9S0JVSUxEX1NUUigkKGNhbGwgbmFtZS1maXgsJChtb2RuYW1lKSkpIikKKworX2NfZmxhZ3MgICAgICAgPSAkKENGTEFHUykgJChFWFRSQV9DRkxBR1MpICQoQ0ZMQUdTXyQoKkYpLm8pCitfYV9mbGFncyAgICAgICA9ICQoQUZMQUdTKSAkKEVYVFJBX0FGTEFHUykgJChBRkxBR1NfJCgqRikubykKK19jcHBfZmxhZ3MgICAgID0gJChDUFBGTEFHUykgJChFWFRSQV9DUFBGTEFHUykgJChDUFBGTEFHU18kKEBGKSkKKworIyBJZiBidWlsZGluZyB0aGUga2VybmVsIGluIGEgc2VwYXJhdGUgb2JqdHJlZSBleHBhbmQgYWxsIG9jY3VycmVuY2VzCisjIG9mIC1JZGlyIHRvIC1JJChzcmN0cmVlKS9kaXIgZXhjZXB0IGZvciBhYnNvbHV0ZSBwYXRocyAoc3RhcnRpbmcgd2l0aCAnLycpLgorCitpZmVxICgkKEtCVUlMRF9TUkMpLCkKK19fY19mbGFncwk9ICQoX2NfZmxhZ3MpCitfX2FfZmxhZ3MJPSAkKF9hX2ZsYWdzKQorX19jcHBfZmxhZ3MgICAgID0gJChfY3BwX2ZsYWdzKQorZWxzZQorCisjIC1JJChvYmopIGxvY2F0ZXMgZ2VuZXJhdGVkIC5oIGZpbGVzCisjICQoY2FsbCBhZGR0cmVlLC1JJChvYmopKSBsb2NhdGVzIC5oIGZpbGVzIGluIHNyY3RyZWUsIGZyb20gZ2VuZXJhdGVkIC5jIGZpbGVzCisjICAgYW5kIGxvY2F0ZXMgZ2VuZXJhdGVkIC5oIGZpbGVzCisjIEZJWE1FOiBSZXBsYWNlIGJvdGggd2l0aCBzcGVjaWZpYyBDRkxBR1MqIHN0YXRlbWVudHMgaW4gdGhlIG1ha2VmaWxlcworX19jX2ZsYWdzCT0gJChjYWxsIGFkZHRyZWUsLUkkKG9iaikpICQoY2FsbCBmbGFncyxfY19mbGFncykKK19fYV9mbGFncwk9ICAgICAgICAgICAgICAgICAgICAgICAgICAkKGNhbGwgZmxhZ3MsX2FfZmxhZ3MpCitfX2NwcF9mbGFncyAgICAgPSAgICAgICAgICAgICAgICAgICAgICAgICAgJChjYWxsIGZsYWdzLF9jcHBfZmxhZ3MpCitlbmRpZgorCitjX2ZsYWdzICAgICAgICA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKE5PU1RESU5DX0ZMQUdTKSAkKENQUEZMQUdTKSBcCisJCSAkKF9fY19mbGFncykgJChtb2RrZXJuX2NmbGFncykgXAorCQkgLUQiS0JVSUxEX1NUUihzKT1cI3MiICQoYmFzZW5hbWVfZmxhZ3MpICQobW9kbmFtZV9mbGFncykKKworYV9mbGFncyAgICAgICAgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChOT1NURElOQ19GTEFHUykgJChDUFBGTEFHUykgXAorCQkgJChfX2FfZmxhZ3MpICQobW9ka2Vybl9hZmxhZ3MpCisKK2NwcF9mbGFncyAgICAgID0gLVdwLC1NRCwkKGRlcGZpbGUpICQoTk9TVERJTkNfRkxBR1MpICQoX19jcHBfZmxhZ3MpCisKKyMgU2VlbXMgdG8gYmUgYSB3cm9uZyB0aGluZyB0byBkby4gTERGTEFHUyBjb250YWlucyBnY2MncyBmbGFncywKKyMgeWV0IGxkX2ZsYWdzIGlzIGZlZCB0byBsZC4KKyNsZF9mbGFncyAgICAgICA9ICQoTERGTEFHUykgJChFWFRSQV9MREZMQUdTKQorIyBSZW1vdmUgdGhlIC1XbCwgcHJlZml4IGZyb20gbGlua2VyIG9wdGlvbnMgbm9ybWFsbHkgcGFzc2VkIHRocm91Z2ggZ2NjCitsZF9mbGFncyAgICAgICA9ICQoZmlsdGVyLW91dCAtV2wkKGNvbW1hKSUsJChMREZMQUdTKSAkKEVYVFJBX0xERkxBR1MpKQorCisKKyMgRmluZHMgdGhlIG11bHRpLXBhcnQgb2JqZWN0IHRoZSBjdXJyZW50IG9iamVjdCB3aWxsIGJlIGxpbmtlZCBpbnRvCittb2RuYW1lLW11bHRpID0gJChzb3J0ICQoZm9yZWFjaCBtLCQobXVsdGktdXNlZCksXAorCQkkKGlmICQoZmlsdGVyICQoc3Vic3QgJChvYmopLywsJCoubyksICQoJChtOi5vPS1vYmpzKSkgJCgkKG06Lm89LXkpKSksJChtOi5vPSkpKSkKKworIyBTaGlwcGVkIGZpbGVzCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitxdWlldF9jbWRfc2hpcHBlZCA9IFNISVBQRUQgJEAKK2NtZF9zaGlwcGVkID0gY2F0ICQ8ID4gJEAKKworJChvYmopLyU6OiAkKHNyYykvJV9zaGlwcGVkCisJJChjYWxsIGNtZCxzaGlwcGVkKQorCisjIENvbW1hbmRzIHVzZWZ1bCBmb3IgYnVpbGRpbmcgYSBib290IGltYWdlCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIwlVc2UgYXMgZm9sbG93aW5nOgorIworIwl0YXJnZXQ6IHNvdXJjZShzKSBGT1JDRQorIwkJJChpZl9jaGFuZ2VkLGxkL29iamNvcHkvZ3ppcCkKKyMKKyMJYW5kIGFkZCB0YXJnZXQgdG8gRVhUUkFfVEFSR0VUUyBzbyB0aGF0IHdlIGtub3cgd2UgaGF2ZSB0bworIwlyZWFkIGluIHRoZSBzYXZlZCBjb21tYW5kIGxpbmUKKworIyBMaW5raW5nCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRPRE86IExERkxBR1MgdXN1YWxseSBpcyBzdXBwb3NlZCB0byBjb250YWluIGdjYydzIGZsYWdzLCBub3QgbGQncy4KKyMgYnV0IGhlcmUgd2UgZmVlZCB0aGVtIHRvIGxkIQorcXVpZXRfY21kX2xkID0gTEQgICAgICAkQAorY21kX2xkID0gJChMRCkgJChMREZMQUdTKSAkKEVYVFJBX0xERkxBR1MpICQoTERGTEFHU18kKEBGKSkgXAorCSAgICAgICAkKGZpbHRlci1vdXQgRk9SQ0UsJF4pIC1vICRACisKKyMgT2JqY29weQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcXVpZXRfY21kX29iamNvcHkgPSBPQkpDT1BZICRACitjbWRfb2JqY29weSA9ICQoT0JKQ09QWSkgJChPQkpDT1BZRkxBR1MpICQoT0JKQ09QWUZMQUdTXyQoQEYpKSAkPCAkQAorCisjIEd6aXAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3F1aWV0X2NtZF9nemlwID0gR1pJUCAgICAkQAorY21kX2d6aXAgPSBnemlwIC1mIC05IDwgJDwgPiAkQApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9iYXNpYy9NYWtlZmlsZSBiL3NjcmlwdHMvYmFzaWMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE5ZjA3OQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvYmFzaWMvTWFrZWZpbGUKQEAgLTAsMCArMSwxOCBAQAorIyMjCisjIE1ha2VmaWxlLmJhc2ljIGxpc3QgdGhlIG1vc3QgYmFzaWMgcHJvZ3JhbXMgdXNlZCBkdXJpbmcgdGhlIGJ1aWxkIHByb2Nlc3MuCisjIFRoZSBwcm9ncmFtcyBsaXN0ZWQgaGVyZWluIGlzIHdoYXQgaXMgbmVlZGVkIHRvIGRvIHRoZSBiYXNpYyBzdHVmZiwKKyMgc3VjaCBhcyBzcGxpdHRpbmcgLmNvbmZpZyBhbmQgZml4IGRlcGVuZGVuY3kgZmlsZS4KKyMgVGhpcyBpbml0aWFsIHN0ZXAgaXMgbmVlZGVkIHRvIGF2b2lkIGZpbGVzIHRvIGJlIHJlY29tcGlsZWQKKyMgd2hlbiBidXN5Ym94IGNvbmZpZ3VyYXRpb24gY2hhbmdlcyAod2hpY2ggaXMgd2hhdCBoYXBwZW5zIHdoZW4KKyMgLmNvbmZpZyBpcyBpbmNsdWRlZCBieSBtYWluIE1ha2VmaWxlLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZml4ZGVwOiAJIFVzZWQgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBkdXJpbmcgYnVpbGQgcHJvY2VzcworIyBzcGxpdC1pbmNsdWRlOiBEaXZpZGUgYWxsIGNvbmZpZyBzeW1ib2xzIHVwIGluIGEgbnVtYmVyIG9mIGZpbGVzIGluCisjICAgICAgICAgICAgICAgIGluY2x1ZGUvY29uZmlnLy4uLgorIyBkb2Nwcm9jOgkgVXNlZCBpbiBEb2N1bWVudGF0aW9uL2RvY2Jvb2sKKworaG9zdHByb2dzLXkJOj0gZml4ZGVwIHNwbGl0LWluY2x1ZGUgZG9jcHJvYworYWx3YXlzCQk6PSAkKGhvc3Rwcm9ncy15KQorCisjIGZpeGRlcCBpcyBuZWVkZWQgdG8gY29tcGlsZSBvdGhlciBob3N0IHByb2dyYW1zCiskKGFkZHByZWZpeCAkKG9iaikvLCQoZmlsdGVyLW91dCBmaXhkZXAsJChhbHdheXMpKSk6ICQob2JqKS9maXhkZXAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvYmFzaWMvZG9jcHJvYy5jIGIvc2NyaXB0cy9iYXNpYy9kb2Nwcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIwMDk4YQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvYmFzaWMvZG9jcHJvYy5jCkBAIC0wLDAgKzEsNDAwIEBACisvKgorICoJZG9jcHJvYyBpcyBhIHNpbXBsZSBwcmVwcm9jZXNzb3IgZm9yIHRoZSB0ZW1wbGF0ZSBmaWxlcworICogICAgICB1c2VkIGFzIHBsYWNlaG9sZGVycyBmb3IgdGhlIGtlcm5lbCBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLgorICoJZG9jcHJvYyBpcyB1c2VkIGZvciBkb2N1bWVudGF0aW9uLWZyb250ZW5kIGFuZAorICogICAgICBkZXBlbmRlbmN5LWdlbmVyYXRvci4KKyAqCVRoZSB0d28gdXNhZ2VzIGhhdmUgaW4gY29tbW9uIHRoYXQgdGhleSByZXF1aXJlCisgKglzb21lIGtub3dsZWRnZSBvZiB0aGUgLnRtcGwgc3ludGF4LCB0aGVyZWZvcmUgdGhleQorICoJYXJlIGtlcHQgdG9nZXRoZXIuCisgKgorICoJZG9jdW1lbnRhdGlvbi1mcm9udGVuZAorICoJCVNjYW5zIHRoZSB0ZW1wbGF0ZSBmaWxlIGFuZCBjYWxsIGtlcm5lbC1kb2MgZm9yCisgKgkJYWxsIG9jY3VycmVuY2VzIG9mICFbRUlGXWZpbGUKKyAqCQlCZWZvcmVoYW5kIGVhY2ggcmVmZXJlbmNlZCBmaWxlIGFyZSBzY2FubmVkIGZvcgorICoJCWFueSBleHBvcnRlZCBzeW1wb2xzICJFWFBPUlRfU1lNQk9MKCkiIHN0YXRlbWVudHMuCisgKgkJVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBwcm9wZXIgLWZ1bmN0aW9uIGFuZAorICoJCS1ub2Z1bmN0aW9uIGFyZ3VtZW50cyBpbiBjYWxscyB0byBrZXJuZWwtZG9jLgorICoJCVVzYWdlOiBkb2Nwcm9jIGRvYyBmaWxlLnRtcGwKKyAqCisgKglkZXBlbmRlbmN5LWdlbmVyYXRvcjoKKyAqCQlTY2FucyB0aGUgdGVtcGxhdGUgZmlsZSBhbmQgbGlzdCBhbGwgZmlsZXMKKyAqCQlyZWZlcmVuY2VkIGluIGEgZm9ybWF0IHJlY29nbml6ZWQgYnkgbWFrZS4KKyAqCQlVc2FnZToJZG9jcHJvYyBkZXBlbmQgZmlsZS50bXBsCisgKgkJV3JpdGVzIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gdG8gc3Rkb3V0CisgKgkJaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgKgkJZmlsZS50bXBsIHNyYy5jCXNyYzIuYworICoJCVRoZSBmaWxlbmFtZXMgYXJlIG9idGFpbmVkIGZyb20gdGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzOgorICoJCSFFZmlsZW5hbWUKKyAqCQkhSWZpbGVuYW1lCisgKgkJIURmaWxlbmFtZQorICoJCSFGZmlsZW5hbWUKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorLy9iYm94IGRpc2FibGVkOiAjaW5jbHVkZSA8YWxsb2NhLmg+CisKKy8qIGV4aXRzdGF0dXMgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIGFueSBmYWlsaW5nIGNhbGxzIHRvIGtlcm5lbC1kb2MsCisgKiBidXQgZXhlY3V0aW9uIGNvbnRpbnVlcy4gKi8KK2ludCBleGl0c3RhdHVzID0gMDsKKwordHlwZWRlZiB2b2lkIERGTChjaGFyICopOworREZMICpkZWZhdWx0bGluZTsKKwordHlwZWRlZiB2b2lkIEZJTEVPTkxZKGNoYXIgKiBmaWxlKTsKK0ZJTEVPTkxZICppbnRlcm5hbGZ1bmN0aW9uczsKK0ZJTEVPTkxZICpleHRlcm5hbGZ1bmN0aW9uczsKK0ZJTEVPTkxZICpzeW1ib2xzb25seTsKKwordHlwZWRlZiB2b2lkIEZJTEVMSU5FKGNoYXIgKiBmaWxlLCBjaGFyICogbGluZSk7CitGSUxFTElORSAqIHNpbmdsZWZ1bmN0aW9uczsKK0ZJTEVMSU5FICogZW50aXR5X3N5c3RlbTsKKworI2RlZmluZSBNQVhMSU5FU1ogICAgIDIwNDgKKyNkZWZpbmUgTUFYRklMRVMgICAgICAyNTAKKyNkZWZpbmUgS0VSTkVMRE9DUEFUSCAic2NyaXB0cy8iCisjZGVmaW5lIEtFUk5FTERPQyAgICAgImtlcm5lbC1kb2MiCisjZGVmaW5lIERPQ0JPT0sgICAgICAgIi1kb2Nib29rIgorI2RlZmluZSBGVU5DVElPTiAgICAgICItZnVuY3Rpb24iCisjZGVmaW5lIE5PRlVOQ1RJT04gICAgIi1ub2Z1bmN0aW9uIgorCit2b2lkIHVzYWdlICh2b2lkKQoreworCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IGRvY3Byb2Mge2RvY3xkZXBlbmR9IGZpbGVcbiIpOworCWZwcmludGYoc3RkZXJyLCAiSW5wdXQgaXMgcmVhZCBmcm9tIGZpbGUudG1wbC4gT3V0cHV0IGlzIHNlbnQgdG8gc3Rkb3V0XG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgImRvYzogZnJvbnRlbmQgd2hlbiBnZW5lcmF0aW5nIGtlcm5lbCBkb2N1bWVudGF0aW9uXG4iKTsKKwlmcHJpbnRmKHN0ZGVyciwgImRlcGVuZDogZ2VuZXJhdGUgbGlzdCBvZiBmaWxlcyByZWZlcmVuY2VkIHdpdGhpbiBmaWxlXG4iKTsKK30KKworLyoKKyAqIEV4ZWN1dGUga2VybmVsLWRvYyB3aXRoIHBhcmFtZXRlcnMgZ2l2aW4gaW4gc3ZlYworICovCit2b2lkIGV4ZWNfa2VybmVsX2RvYyhjaGFyICoqc3ZlYykKK3sKKwlwaWRfdCBwaWQ7CisJaW50IHJldDsKKwljaGFyICpyZWFsX2ZpbGVuYW1lOworCWludCByZmxlbjsKKworCS8qIE1ha2Ugc3VyZSBvdXRwdXQgZ2VuZXJhdGVkIHNvIGZhciBhcmUgZmx1c2hlZCAqLworCWZmbHVzaChzdGRvdXQpOworCXN3aXRjaChwaWQ9Zm9yaygpKSB7CisJCWNhc2UgLTE6CisJCQlwZXJyb3IoInZmb3JrIisxKTsKKwkJCWV4aXQoMSk7CisJCWNhc2UgIDA6CisJCQlyZmxlbiAgPSBzdHJsZW4oZ2V0ZW52KCJTUkNUUkVFIikpOworCQkJcmZsZW4gKz0gc3RybGVuKEtFUk5FTERPQ1BBVEggS0VSTkVMRE9DKTsKKwkJCXJlYWxfZmlsZW5hbWUgPSBhbGxvY2EocmZsZW4gKyAxKTsKKwkJCXN0cmNweShyZWFsX2ZpbGVuYW1lLCBnZXRlbnYoIlNSQ1RSRUUiKSk7CisJCQlzdHJjYXQocmVhbF9maWxlbmFtZSwgS0VSTkVMRE9DUEFUSCBLRVJORUxET0MpOworCQkJZXhlY3ZwKHJlYWxfZmlsZW5hbWUsIHN2ZWMpOworCQkJZnByaW50ZihzdGRlcnIsICJleGVjICIpOworCQkJcGVycm9yKHJlYWxfZmlsZW5hbWUpOworCQkJZXhpdCgxKTsKKwkJZGVmYXVsdDoKKwkJCXdhaXRwaWQocGlkLCAmcmV0ICwwKTsKKwl9CisJaWYgKFdJRkVYSVRFRChyZXQpKQorCQlleGl0c3RhdHVzIHw9IFdFWElUU1RBVFVTKHJldCk7CisJZWxzZQorCQlleGl0c3RhdHVzID0gMHhmZjsKK30KKworLyogVHlwZXMgdXNlZCB0byBjcmVhdGUgbGlzdCBvZiBhbGwgZXhwb3J0ZWQgc3ltYm9scyBpbiBhIG51bWJlciBvZiBmaWxlcyAqLworc3RydWN0IHN5bWJvbHMKK3sKKwljaGFyICpuYW1lOworfTsKKworc3RydWN0IHN5bWZpbGUKK3sKKwljaGFyICpmaWxlbmFtZTsKKwlzdHJ1Y3Qgc3ltYm9scyAqc3ltYm9sbGlzdDsKKwlpbnQgc3ltYm9sY250OworfTsKKworc3RydWN0IHN5bWZpbGUgc3ltZmlsZWxpc3RbTUFYRklMRVNdOworaW50IHN5bWZpbGVjbnQgPSAwOworCit2b2lkIGFkZF9uZXdfc3ltYm9sKHN0cnVjdCBzeW1maWxlICpzeW0sIGNoYXIgKiBzeW1uYW1lKQoreworCXN5bS0+c3ltYm9sbGlzdCA9CisJICByZWFsbG9jKHN5bS0+c3ltYm9sbGlzdCwgKHN5bS0+c3ltYm9sY250ICsgMSkgKiBzaXplb2YoY2hhciAqKSk7CisJc3ltLT5zeW1ib2xsaXN0W3N5bS0+c3ltYm9sY250KytdLm5hbWUgPSBzdHJkdXAoc3ltbmFtZSk7Cit9CisKKy8qIEFkZCBhIGZpbGVuYW1lIHRvIHRoZSBsaXN0ICovCitzdHJ1Y3Qgc3ltZmlsZSAqIGFkZF9uZXdfZmlsZShjaGFyICogZmlsZW5hbWUpCit7CisJc3ltZmlsZWxpc3Rbc3ltZmlsZWNudCsrXS5maWxlbmFtZSA9IHN0cmR1cChmaWxlbmFtZSk7CisJcmV0dXJuICZzeW1maWxlbGlzdFtzeW1maWxlY250IC0gMV07Cit9CisvKiBDaGVjayBpZiBmaWxlIGFscmVhZHkgYXJlIHByZXNlbnQgaW4gdGhlIGxpc3QgKi8KK3N0cnVjdCBzeW1maWxlICogZmlsZW5hbWVfZXhpc3QoY2hhciAqIGZpbGVuYW1lKQoreworCWludCBpOworCWZvciAoaT0wOyBpIDwgc3ltZmlsZWNudDsgaSsrKQorCQlpZiAoc3RyY21wKHN5bWZpbGVsaXN0W2ldLmZpbGVuYW1lLCBmaWxlbmFtZSkgPT0gMCkKKwkJCXJldHVybiAmc3ltZmlsZWxpc3RbaV07CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qCisgKiBMaXN0IGFsbCBmaWxlcyByZWZlcmVuY2VkIHdpdGhpbiB0aGUgdGVtcGxhdGUgZmlsZS4KKyAqIEZpbGVzIGFyZSBzZXBhcmF0ZWQgYnkgdGFicy4KKyAqLwordm9pZCBhZGRkZXAoY2hhciAqIGZpbGUpCQkgICB7IHByaW50ZigiXHQlcyIsIGZpbGUpOyB9Cit2b2lkIGFkZGRlcDIoY2hhciAqIGZpbGUsIGNoYXIgKiBsaW5lKSAgICAgeyBsaW5lID0gbGluZTsgYWRkZGVwKGZpbGUpOyB9Cit2b2lkIG5vYWN0aW9uKGNoYXIgKiBsaW5lKQkJICAgeyBsaW5lID0gbGluZTsgfQordm9pZCBub2FjdGlvbjIoY2hhciAqIGZpbGUsIGNoYXIgKiBsaW5lKSAgIHsgZmlsZSA9IGZpbGU7IGxpbmUgPSBsaW5lOyB9CisKKy8qIEVjaG8gdGhlIGxpbmUgd2l0aG91dCBmdXJ0aGVyIGFjdGlvbiAqLwordm9pZCBwcmludGxpbmUoY2hhciAqIGxpbmUpICAgICAgICAgICAgICAgeyBwcmludGYoIiVzIiwgbGluZSk7IH0KKworLyoKKyAqIEZpbmQgYWxsIHN5bWJvbHMgZXhwb3J0ZWQgd2l0aCBFWFBPUlRfU1lNQk9MIGFuZCBFWFBPUlRfU1lNQk9MX0dQTAorICogaW4gZmlsZW5hbWUuCisgKiBBbGwgc3ltYm9scyBsb2NhdGVkIGFyZSBzdG9yZWQgaW4gc3ltZmlsZWxpc3QuCisgKi8KK3ZvaWQgZmluZF9leHBvcnRfc3ltYm9scyhjaGFyICogZmlsZW5hbWUpCit7CisJRklMRSAqIGZwOworCXN0cnVjdCBzeW1maWxlICpzeW07CisJY2hhciBsaW5lW01BWExJTkVTWl07CisJaWYgKGZpbGVuYW1lX2V4aXN0KGZpbGVuYW1lKSA9PSBOVUxMKSB7CisJCWludCByZmxlbiA9IHN0cmxlbihnZXRlbnYoIlNSQ1RSRUUiKSkgKyBzdHJsZW4oZmlsZW5hbWUpOworCQljaGFyICpyZWFsX2ZpbGVuYW1lID0gYWxsb2NhKHJmbGVuICsgMSk7CisJCXN0cmNweShyZWFsX2ZpbGVuYW1lLCBnZXRlbnYoIlNSQ1RSRUUiKSk7CisJCXN0cmNhdChyZWFsX2ZpbGVuYW1lLCBmaWxlbmFtZSk7CisJCXN5bSA9IGFkZF9uZXdfZmlsZShmaWxlbmFtZSk7CisJCWZwID0gZm9wZW4ocmVhbF9maWxlbmFtZSwgInIiKTsKKwkJaWYgKGZwID09IE5VTEwpCisJCXsKKwkJCWZwcmludGYoc3RkZXJyLCAiZG9jcHJvYzogIik7CisJCQlwZXJyb3IocmVhbF9maWxlbmFtZSk7CisJCX0KKwkJd2hpbGUgKGZnZXRzKGxpbmUsIE1BWExJTkVTWiwgZnApKSB7CisJCQljaGFyICpwOworCQkJY2hhciAqZTsKKwkJCWlmICgoKHAgPSBzdHJzdHIobGluZSwgIkVYUE9SVF9TWU1CT0xfR1BMIikpICE9IDApIHx8CisJCQkgICAgKChwID0gc3Ryc3RyKGxpbmUsICJFWFBPUlRfU1lNQk9MIikpICE9IDApKSB7CisJCQkJLyogU2tpcCBFWFBPUlRfU1lNQk9Me19HUEx9ICovCisJCQkJd2hpbGUgKGlzYWxudW0oKnApIHx8ICpwID09ICdfJykKKwkJCQkJcCsrOworCQkJCS8qIFJlbW92ZSBwYXJhbnRlc2VzIGFuZCBhZGRpdGlvbmFsIHdzICovCisJCQkJd2hpbGUgKGlzc3BhY2UoKnApKQorCQkJCQlwKys7CisJCQkJaWYgKCpwICE9ICcoJykKKwkJCQkJY29udGludWU7IC8qIFN5bnRheCBlcnJvcj8gKi8KKwkJCQllbHNlCisJCQkJCXArKzsKKwkJCQl3aGlsZSAoaXNzcGFjZSgqcCkpCisJCQkJCXArKzsKKwkJCQllID0gcDsKKwkJCQl3aGlsZSAoaXNhbG51bSgqZSkgfHwgKmUgPT0gJ18nKQorCQkJCQllKys7CisJCQkJKmUgPSAnXDAnOworCQkJCWFkZF9uZXdfc3ltYm9sKHN5bSwgcCk7CisJCQl9CisJCX0KKwkJZmNsb3NlKGZwKTsKKwl9Cit9CisKKy8qCisgKiBEb2N1bWVudCBhbGwgZXh0ZXJuYWwgb3IgaW50ZXJuYWwgZnVuY3Rpb25zIGluIGEgZmlsZS4KKyAqIENhbGwga2VybmVsLWRvYyB3aXRoIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICoga2VybmVsLWRvYyAtZG9jYm9vayAtbm9mdW5jdGlvbiBmdW5jdGlvbl9uYW1lMSBmaWxlbmFtZQorICogZnVuY3Rpb24gbmFtZXMgYXJlIG9idGFpbmVkIGZyb20gYWxsIHRoZSBzcmMgZmlsZXMKKyAqIGJ5IGZpbmRfZXhwb3J0X3N5bWJvbHMuCisgKiBpbnRmdW5jIHVzZXMgLW5vZnVuY3Rpb24KKyAqIGV4dGZ1bmMgdXNlcyAtZnVuY3Rpb24KKyAqLwordm9pZCBkb2NmdW5jdGlvbnMoY2hhciAqIGZpbGVuYW1lLCBjaGFyICogdHlwZSkKK3sKKwlpbnQgaSxqOworCWludCBzeW1jbnQgPSAwOworCWludCBpZHggPSAwOworCWNoYXIgKip2ZWM7CisKKwlmb3IgKGk9MDsgaSA8PSBzeW1maWxlY250OyBpKyspCisJCXN5bWNudCArPSBzeW1maWxlbGlzdFtpXS5zeW1ib2xjbnQ7CisJdmVjID0gbWFsbG9jKCgyICsgMiAqIHN5bWNudCArIDIpICogc2l6ZW9mKGNoYXIqKSk7CisJaWYgKHZlYyA9PSBOVUxMKSB7CisJCXBlcnJvcigiZG9jcHJvYzogIik7CisJCWV4aXQoMSk7CisJfQorCXZlY1tpZHgrK10gPSBLRVJORUxET0M7CisJdmVjW2lkeCsrXSA9IERPQ0JPT0s7CisJZm9yIChpPTA7IGkgPCBzeW1maWxlY250OyBpKyspIHsKKwkJc3RydWN0IHN5bWZpbGUgKiBzeW0gPSAmc3ltZmlsZWxpc3RbaV07CisJCWZvciAoaj0wOyBqIDwgc3ltLT5zeW1ib2xjbnQ7IGorKykgeworCQkJdmVjW2lkeCsrXSAgICAgPSB0eXBlOworCQkJdmVjW2lkeCsrXSA9IHN5bS0+c3ltYm9sbGlzdFtqXS5uYW1lOworCQl9CisJfQorCXZlY1tpZHgrK10gICAgID0gZmlsZW5hbWU7CisJdmVjW2lkeF0gPSBOVUxMOworCXByaW50ZigiPCEtLSAlcyAtLT5cbiIsIGZpbGVuYW1lKTsKKwlleGVjX2tlcm5lbF9kb2ModmVjKTsKKwlmZmx1c2goc3Rkb3V0KTsKKwlmcmVlKHZlYyk7Cit9Cit2b2lkIGludGZ1bmMoY2hhciAqIGZpbGVuYW1lKSB7CWRvY2Z1bmN0aW9ucyhmaWxlbmFtZSwgTk9GVU5DVElPTik7IH0KK3ZvaWQgZXh0ZnVuYyhjaGFyICogZmlsZW5hbWUpIHsgZG9jZnVuY3Rpb25zKGZpbGVuYW1lLCBGVU5DVElPTik7ICAgfQorCisvKgorICogRG9jdW1lbnQgc3BlY2lmaWMgZnVuY3Rpb24ocykgaW4gYSBmaWxlLgorICogQ2FsbCBrZXJuZWwtZG9jIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICoga2VybmVsLWRvYyAtZG9jYm9vayAtZnVuY3Rpb24gZnVuY3Rpb24xIFstZnVuY3Rpb24gZnVuY3Rpb24yXQorICovCit2b2lkIHNpbmdmdW5jKGNoYXIgKiBmaWxlbmFtZSwgY2hhciAqIGxpbmUpCit7CisJY2hhciAqdmVjWzIwMF07IC8qIEVub3VnaCBmb3Igc3BlY2lmaWMgZnVuY3Rpb25zICovCisJaW50IGksIGlkeCA9IDA7CisJaW50IHN0YXJ0b2ZzeW0gPSAxOworCXZlY1tpZHgrK10gPSBLRVJORUxET0M7CisJdmVjW2lkeCsrXSA9IERPQ0JPT0s7CisKKwkvKiBTcGxpdCBsaW5lIHVwIGluIGluZGl2aWR1YWwgcGFyYW1ldGVycyBwcmVjZWRlZCBieSBGVU5DVElPTiAqLworCWZvciAoaT0wOyBsaW5lW2ldOyBpKyspIHsKKwkJaWYgKGlzc3BhY2UobGluZVtpXSkpIHsKKwkJCWxpbmVbaV0gPSAnXDAnOworCQkJc3RhcnRvZnN5bSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoc3RhcnRvZnN5bSkgeworCQkJc3RhcnRvZnN5bSA9IDA7CisJCQl2ZWNbaWR4KytdID0gRlVOQ1RJT047CisJCQl2ZWNbaWR4KytdID0gJmxpbmVbaV07CisJCX0KKwl9CisJdmVjW2lkeCsrXSA9IGZpbGVuYW1lOworCXZlY1tpZHhdID0gTlVMTDsKKwlleGVjX2tlcm5lbF9kb2ModmVjKTsKK30KKworLyoKKyAqIFBhcnNlIGZpbGUsIGNhbGxpbmcgYWN0aW9uIHNwZWNpZmljIGZ1bmN0aW9ucyBmb3I6CisgKiAxKSBMaW5lcyBjb250YWluaW5nICFFCisgKiAyKSBMaW5lcyBjb250YWluaW5nICFJCisgKiAzKSBMaW5lcyBjb250YWluaW5nICFECisgKiA0KSBMaW5lcyBjb250YWluaW5nICFGCisgKiA1KSBEZWZhdWx0IGxpbmVzIC0gbGluZXMgbm90IG1hdGNoaW5nIHRoZSBhYm92ZQorICovCit2b2lkIHBhcnNlX2ZpbGUoRklMRSAqaW5maWxlKQoreworCWNoYXIgbGluZVtNQVhMSU5FU1pdOworCWNoYXIgKiBzOworCXdoaWxlIChmZ2V0cyhsaW5lLCBNQVhMSU5FU1osIGluZmlsZSkpIHsKKwkJaWYgKGxpbmVbMF0gPT0gJyEnKSB7CisJCQlzID0gbGluZSArIDI7CisJCQlzd2l0Y2ggKGxpbmVbMV0pIHsKKwkJCQljYXNlICdFJzoKKwkJCQkJd2hpbGUgKCpzICYmICFpc3NwYWNlKCpzKSkgcysrOworCQkJCQkqcyA9ICdcMCc7CisJCQkJCWV4dGVybmFsZnVuY3Rpb25zKGxpbmUrMik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ0knOgorCQkJCQl3aGlsZSAoKnMgJiYgIWlzc3BhY2UoKnMpKSBzKys7CisJCQkJCSpzID0gJ1wwJzsKKwkJCQkJaW50ZXJuYWxmdW5jdGlvbnMobGluZSsyKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnRCc6CisJCQkJCXdoaWxlICgqcyAmJiAhaXNzcGFjZSgqcykpIHMrKzsKKwkJCQkJKnMgPSAnXDAnOworCQkJCQlzeW1ib2xzb25seShsaW5lKzIpOworCQkJCQlicmVhazsKKwkJCQljYXNlICdGJzoKKwkJCQkJLyogZmlsZW5hbWUgKi8KKwkJCQkJd2hpbGUgKCpzICYmICFpc3NwYWNlKCpzKSkgcysrOworCQkJCQkqcysrID0gJ1wwJzsKKwkJCQkJLyogZnVuY3Rpb24gbmFtZXMgKi8KKwkJCQkJd2hpbGUgKGlzc3BhY2UoKnMpKQorCQkJCQkJcysrOworCQkJCQlzaW5nbGVmdW5jdGlvbnMobGluZSArMiwgcyk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCWRlZmF1bHRsaW5lKGxpbmUpOworCQkJfQorCQl9CisJCWVsc2UgeworCQkJZGVmYXVsdGxpbmUobGluZSk7CisJCX0KKwl9CisJZmZsdXNoKHN0ZG91dCk7Cit9CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCUZJTEUgKiBpbmZpbGU7CisJaWYgKGFyZ2MgIT0gMykgeworCQl1c2FnZSgpOworCQlleGl0KDEpOworCX0KKwkvKiBPcGVuIGZpbGUsIGV4aXQgb24gZXJyb3IgKi8KKwlpbmZpbGUgPSBmb3Blbihhcmd2WzJdLCAiciIpOworCWlmIChpbmZpbGUgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgImRvY3Byb2M6ICIpOworCQlwZXJyb3IoYXJndlsyXSk7CisJCWV4aXQoMik7CisJfQorCisJaWYgKHN0cmNtcCgiZG9jIiwgYXJndlsxXSkgPT0gMCkKKwl7CisJCS8qIE5lZWQgdG8gZG8gdGhpcyBpbiB0d28gcGFzc2VzLgorCQkgKiBGaXJzdCBwYXNzIGlzIHVzZWQgdG8gY29sbGVjdCBhbGwgc3ltYm9scyBleHBvcnRlZAorCQkgKiBpbiB0aGUgdmFyaW91cyBmaWxlcy4KKwkJICogU2Vjb25kIHBhc3MgZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24uCisJCSAqIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBmdW5jdGlvbiBhcmUgZGVjbGFyZWQKKwkJICogYW5kIGV4cG9ydGVkIGluIGRpZmZlcmVudCBmaWxlcyA6LSgoCisJCSAqLworCQkvKiBDb2xsZWN0IHN5bWJvbHMgKi8KKwkJZGVmYXVsdGxpbmUgICAgICAgPSBub2FjdGlvbjsKKwkJaW50ZXJuYWxmdW5jdGlvbnMgPSBmaW5kX2V4cG9ydF9zeW1ib2xzOworCQlleHRlcm5hbGZ1bmN0aW9ucyA9IGZpbmRfZXhwb3J0X3N5bWJvbHM7CisJCXN5bWJvbHNvbmx5ICAgICAgID0gZmluZF9leHBvcnRfc3ltYm9sczsKKwkJc2luZ2xlZnVuY3Rpb25zICAgPSBub2FjdGlvbjI7CisJCXBhcnNlX2ZpbGUoaW5maWxlKTsKKworCQkvKiBSZXdpbmQgdG8gc3RhcnQgZnJvbSBiZWdpbm5pbmcgb2YgZmlsZSBhZ2FpbiAqLworCQlmc2VlayhpbmZpbGUsIDAsIFNFRUtfU0VUKTsKKwkJZGVmYXVsdGxpbmUgICAgICAgPSBwcmludGxpbmU7CisJCWludGVybmFsZnVuY3Rpb25zID0gaW50ZnVuYzsKKwkJZXh0ZXJuYWxmdW5jdGlvbnMgPSBleHRmdW5jOworCQlzeW1ib2xzb25seSAgICAgICA9IHByaW50bGluZTsKKwkJc2luZ2xlZnVuY3Rpb25zICAgPSBzaW5nZnVuYzsKKworCQlwYXJzZV9maWxlKGluZmlsZSk7CisJfQorCWVsc2UgaWYgKHN0cmNtcCgiZGVwZW5kIiwgYXJndlsxXSkgPT0gMCkKKwl7CisJCS8qIENyZWF0ZSBmaXJzdCBwYXJ0IG9mIGRlcGVuZGVuY3kgY2hhaW4KKwkJICogZmlsZS50bXBsICovCisJCXByaW50ZigiJXNcdCIsIGFyZ3ZbMl0pOworCQlkZWZhdWx0bGluZSAgICAgICA9IG5vYWN0aW9uOworCQlpbnRlcm5hbGZ1bmN0aW9ucyA9IGFkZGRlcDsKKwkJZXh0ZXJuYWxmdW5jdGlvbnMgPSBhZGRkZXA7CisJCXN5bWJvbHNvbmx5ICAgICAgID0gYWRkZGVwOworCQlzaW5nbGVmdW5jdGlvbnMgICA9IGFkZGRlcDI7CisJCXBhcnNlX2ZpbGUoaW5maWxlKTsKKwkJcHJpbnRmKCJcbiIpOworCX0KKwllbHNlCisJeworCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gb3B0aW9uOiAlc1xuIiwgYXJndlsxXSk7CisJCWV4aXQoMSk7CisJfQorCWZjbG9zZShpbmZpbGUpOworCWZmbHVzaChzdGRvdXQpOworCXJldHVybiBleGl0c3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9iYXNpYy9maXhkZXAuYyBiL3NjcmlwdHMvYmFzaWMvZml4ZGVwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlmODJkZgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvYmFzaWMvZml4ZGVwLmMKQEAgLTAsMCArMSw0MTQgQEAKKy8qCisgKiAiT3B0aW1pemUiIGEgbGlzdCBvZiBkZXBlbmRlbmNpZXMgYXMgc3BpdCBvdXQgYnkgZ2NjIC1NRAorICogZm9yIHRoZSBrZXJuZWwgYnVpbGQKKyAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICoKKyAqIEF1dGhvciAgICAgICBLYWkgR2VybWFzY2hld3NraQorICogQ29weXJpZ2h0ICAgIDIwMDIgYnkgS2FpIEdlcm1hc2NoZXdza2kgIDxrYWkuZ2VybWFzY2hld3NraUBnbXguZGU+CisgKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKgorICogSW50cm9kdWN0aW9uOgorICoKKyAqIGdjYyBwcm9kdWNlcyBhIHZlcnkgbmljZSBhbmQgY29ycmVjdCBsaXN0IG9mIGRlcGVuZGVuY2llcyB3aGljaAorICogdGVsbHMgbWFrZSB3aGVuIHRvIHJlbWFrZSBhIGZpbGUuCisgKgorICogVG8gdXNlIHRoaXMgbGlzdCBhcy1pcyBob3dldmVyIGhhcyB0aGUgZHJhd2JhY2sgdGhhdCB2aXJ0dWFsbHkKKyAqIGV2ZXJ5IGZpbGUgaW4gdGhlIGtlcm5lbCBpbmNsdWRlcyA8bGludXgvY29uZmlnLmg+IHdoaWNoIHRoZW4gYWdhaW4KKyAqIGluY2x1ZGVzIDxsaW51eC9hdXRvY29uZi5oPgorICoKKyAqIElmIHRoZSB1c2VyIHJlLXJ1bnMgbWFrZSAqY29uZmlnLCBsaW51eC9hdXRvY29uZi5oIHdpbGwgYmUKKyAqIHJlZ2VuZXJhdGVkLiAgbWFrZSBub3RpY2VzIHRoYXQgYW5kIHdpbGwgcmVidWlsZCBldmVyeSBmaWxlIHdoaWNoCisgKiBpbmNsdWRlcyBhdXRvY29uZi5oLCBpLmUuIGJhc2ljYWxseSBhbGwgZmlsZXMuIFRoaXMgaXMgZXh0cmVtZWx5CisgKiBhbm5veWluZyBpZiB0aGUgdXNlciBqdXN0IGNoYW5nZWQgQ09ORklHX0hJU19EUklWRVIgZnJvbSBuIHRvIG0uCisgKgorICogU28gd2UgcGxheSB0aGUgc2FtZSB0cmljayB0aGF0ICJta2RlcCIgcGxheWVkIGJlZm9yZS4gV2UgcmVwbGFjZQorICogdGhlIGRlcGVuZGVuY3kgb24gbGludXgvYXV0b2NvbmYuaCBieSBhIGRlcGVuZGVuY3kgb24gZXZlcnkgY29uZmlnCisgKiBvcHRpb24gd2hpY2ggaXMgbWVudGlvbmVkIGluIGFueSBvZiB0aGUgbGlzdGVkIHByZXF1aXNpdGVzLgorICoKKyAqIFRvIGJlIGV4YWN0LCBzcGxpdC1pbmNsdWRlIHBvcHVsYXRlcyBhIHRyZWUgaW4gaW5jbHVkZS9jb25maWcvLAorICogZS5nLiBpbmNsdWRlL2NvbmZpZy9oaXMvZHJpdmVyLmgsIHdoaWNoIGNvbnRhaW5zIHRoZSAjZGVmaW5lLyN1bmRlZgorICogZm9yIHRoZSBDT05GSUdfSElTX0RSSVZFUiBvcHRpb24uCisgKgorICogU28gaWYgdGhlIHVzZXIgY2hhbmdlcyBoaXMgQ09ORklHX0hJU19EUklWRVIgb3B0aW9uLCBvbmx5IHRoZSBvYmplY3RzCisgKiB3aGljaCBkZXBlbmQgb24gImluY2x1ZGUvbGludXgvY29uZmlnL2hpcy9kcml2ZXIuaCIgd2lsbCBiZSByZWJ1aWx0LAorICogc28gbW9zdCBsaWtlbHkgb25seSBoaXMgZHJpdmVyIDstKQorICoKKyAqIFRoZSBpZGVhIGFib3ZlIGRhdGVzLCBieSB0aGUgd2F5LCBiYWNrIHRvIE1pY2hhZWwgRSBDaGFzdGFpbiwgQUZBSUsuCisgKgorICogU28gdG8gZ2V0IGRlcGVuZGVuY2llcyByaWdodCwgdGhlcmUgYXJlIHR3byBpc3N1ZXM6CisgKiBvIGlmIGFueSBvZiB0aGUgZmlsZXMgdGhlIGNvbXBpbGVyIHJlYWQgY2hhbmdlZCwgd2UgbmVlZCB0byByZWJ1aWxkCisgKiBvIGlmIHRoZSBjb21tYW5kIGxpbmUgZ2l2ZW4gdG8gdGhlIGNvbXBpbGUgdGhlIGZpbGUgY2hhbmdlZCwgd2UKKyAqICAgYmV0dGVyIHJlYnVpbGQgYXMgd2VsbC4KKyAqCisgKiBUaGUgZm9ybWVyIGlzIGhhbmRsZWQgYnkgdXNpbmcgdGhlIC1NRCBvdXRwdXQsIHRoZSBsYXRlciBieSBzYXZpbmcKKyAqIHRoZSBjb21tYW5kIGxpbmUgdXNlZCB0byBjb21waWxlIHRoZSBvbGQgb2JqZWN0IGFuZCBjb21wYXJpbmcgaXQKKyAqIHRvIHRoZSBvbmUgd2Ugd291bGQgbm93IHVzZS4KKyAqCisgKiBBZ2FpbiwgYWxzbyB0aGlzIGlkZWEgaXMgcHJldHR5IG9sZCBhbmQgaGFzIGJlZW4gZGlzY3Vzc2VkIG9uCisgKiBrYnVpbGQtZGV2ZWwgYSBsb25nIHRpbWUgYWdvLiBJIGRvbid0IGhhdmUgYSBzZW5zaWJseSB3b3JraW5nCisgKiBpbnRlcm5ldCBjb25uZWN0aW9uIHJpZ2h0IG5vdywgc28gSSByYXRoZXIgZG9uJ3QgbWVudGlvbiBuYW1lcworICogd2l0aG91dCBkb3VibGUgY2hlY2tpbmcuCisgKgorICogVGhpcyBjb2RlIGhlcmUgaGFzIGJlZW4gYmFzZWQgcGFydGlhbGx5IGJhc2VkIG9uIG1rZGVwLmMsIHdoaWNoCisgKiBzYXlzIHRoZSBmb2xsb3dpbmcgYWJvdXQgaXRzIGhpc3Rvcnk6CisgKgorICogICBDb3B5cmlnaHQgYWJhbmRvbmVkLCBNaWNoYWVsIENoYXN0YWluLCA8bWFpbHRvOm1lY0BzaG91dC5uZXQ+LgorICogICBUaGlzIGlzIGEgQyB2ZXJzaW9uIG9mIHN5bmNkZXAucGwgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLgorICoKKyAqCisgKiBJdCBpcyBpbnZva2VkIGFzCisgKgorICogICBmaXhkZXAgPGRlcGZpbGU+IDx0YXJnZXQ+IDxjbWRsaW5lPgorICoKKyAqIGFuZCB3aWxsIHJlYWQgdGhlIGRlcGVuZGVuY3kgZmlsZSA8ZGVwZmlsZT4KKyAqCisgKiBUaGUgdHJhbnNmb3JtZWQgZGVwZW5kZW5jeSBzbmlwcGVkIGlzIHdyaXR0ZW4gdG8gc3Rkb3V0LgorICoKKyAqIEl0IGZpcnN0IGdlbmVyYXRlcyBhIGxpbmUKKyAqCisgKiAgIGNtZF88dGFyZ2V0PiA9IDxjbWRsaW5lPgorICoKKyAqIGFuZCB0aGVuIGJhc2ljYWxseSBjb3BpZXMgdGhlIC48dGFyZ2V0Pi5kIGZpbGUgdG8gc3Rkb3V0LCBpbiB0aGUKKyAqIHByb2Nlc3MgZmlsdGVyaW5nIG91dCB0aGUgZGVwZW5kZW5jeSBvbiBsaW51eC9hdXRvY29uZi5oIGFuZCBhZGRpbmcKKyAqIGRlcGVuZGVuY2llcyBvbiBpbmNsdWRlL2NvbmZpZy9teS9vcHRpb24uaCBmb3IgZXZlcnkKKyAqIENPTkZJR19NWV9PUFRJT04gZW5jb3VudGVyZWQgaW4gYW55IG9mIHRoZSBwcmVxdWlzaXRlcy4KKyAqCisgKiBJdCB3aWxsIGFsc28gZmlsdGVyIG91dCBhbGwgdGhlIGRlcGVuZGVuY2llcyBvbiAqLnZlci4gV2UgbmVlZAorICogdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGdlbmVyYXRlZCB2ZXJzaW9uIGNoZWNrc3VtIGFyZSBnbG9iYWxseSB1cAorICogdG8gZGF0ZSBiZWZvcmUgZXZlbiBzdGFydGluZyB0aGUgcmVjdXJzaXZlIGJ1aWxkLCBzbyBpdCdzIHRvbyBsYXRlCisgKiBhdCB0aGlzIHBvaW50IGFueXdheS4KKyAqCisgKiBUaGUgYWxnb3JpdGhtIHRvIGdyZXAgZm9yICJDT05GSUdfLi4uIiBpcyBiaXQgdW51c3VhbCwgYnV0IHNob3VsZAorICogYmUgZmFzdCA7LSkgV2UgZG9uJ3QgZXZlbiB0cnkgdG8gcmVhbGx5IHBhcnNlIHRoZSBoZWFkZXIgZmlsZXMsIGJ1dAorICogbWVyZWx5IGdyZXAsIGkuZS4gaWYgQ09ORklHX0ZPTyBpcyBtZW50aW9uZWQgaW4gYSBjb21tZW50LCBpdCB3aWxsCisgKiBiZSBwaWNrZWQgdXAgYXMgd2VsbC4gSXQncyBub3QgYSBwcm9ibGVtIHdpdGggcmVzcGVjdCB0bworICogY29ycmVjdG5lc3MsIHNpbmNlIHRoYXQgY2FuIG9ubHkgZ2l2ZSB0b28gbWFueSBkZXBlbmRlbmNpZXMsIHRodXMKKyAqIHdlIGNhbm5vdCBtaXNzIGEgcmVidWlsZC4gU2luY2UgcGVvcGxlIHRlbmQgdG8gbm90IG1lbnRpb24gdG90YWxseQorICogdW5yZWxhdGVkIENPTkZJR18gb3B0aW9ucyBhbGwgb3ZlciB0aGUgcGxhY2UsIGl0J3Mgbm90IGFuCisgKiBlZmZpY2llbmN5IHByb2JsZW0gZWl0aGVyLgorICoKKyAqIChOb3RlOiBpdCdkIGJlIGVhc3kgdG8gcG9ydCBvdmVyIHRoZSBjb21wbGV0ZSBta2RlcCBzdGF0ZSBtYWNoaW5lLAorICogIGJ1dCBJIGRvbid0IHRoaW5rIHRoZSBhZGRlZCBjb21wbGV4aXR5IGlzIHdvcnRoIGl0KQorICovCisvKgorICogTm90ZSAyOiBpZiBzb21lYm9keSB3cml0ZXMgSEVMTE9fQ09ORklHX0JPT00gaW4gYSBmaWxlLCBpdCB3aWxsIGRlcGVuZCBvbnRvCisgKiBDT05GSUdfQk9PTS4gVGhpcyBjb3VsZCBzZWVtIGEgYnVnIChub3QgdG9vIGhhcmQgdG8gZml4KSwgYnV0IHBsZWFzZSBkbyBub3QKKyAqIGZpeCBpdCEgU29tZSBVc2VyTW9kZUxpbnV4IGZpbGVzIChsb29rIGF0IGFyY2gvdW0vKSBjYWxsIENPTkZJR19CT09NIGFzCisgKiBVTUxfQ09ORklHX0JPT00sIHRvIGF2b2lkIGNvbmZsaWN0cyB3aXRoIC91c3IvaW5jbHVkZS9saW51eC9hdXRvY29uZi5oLAorICogdGhyb3VnaCBhcmNoL3VtL2luY2x1ZGUvdW1sLWNvbmZpZy5oOyB0aGlzIGZpeGRlcCAiYnVnIiBtYWtlcyBzdXJlIHRoYXQKKyAqIHRob3NlIGZpbGVzIHdpbGwgaGF2ZSBjb3JyZWN0IGRlcGVuZGVuY2llcy4KKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorLy9iYm94IGRpc2FibGVkOiAjaW5jbHVkZSA8YWxsb2NhLmg+CisKKy8qIGJib3g6IG5vdCBuZWVkZWQKKyNkZWZpbmUgSU5UX0NPTkYgbnRvaGwoMHg0MzRmNGU0NikKKyNkZWZpbmUgSU5UX09ORkkgbnRvaGwoMHg0ZjRlNDY0OSkKKyNkZWZpbmUgSU5UX05GSUcgbnRvaGwoMHg0ZTQ2NDk0NykKKyNkZWZpbmUgSU5UX0ZJR18gbnRvaGwoMHg0NjQ5NDc1ZikKKyovCisKK2NoYXIgKnRhcmdldDsKK2NoYXIgKmRlcGZpbGU7CitjaGFyICpjbWRsaW5lOworCit2b2lkIHVzYWdlKHZvaWQpCisKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiBmaXhkZXAgPGRlcGZpbGU+IDx0YXJnZXQ+IDxjbWRsaW5lPlxuIik7CisJZXhpdCgxKTsKK30KKworLyoKKyAqIFByaW50IG91dCB0aGUgY29tbWFuZGxpbmUgcHJlZml4ZWQgd2l0aCBjbWRfPHRhcmdldCBmaWxlbmFtZT4gOj0KKyAqLwordm9pZCBwcmludF9jbWRsaW5lKHZvaWQpCit7CisJcHJpbnRmKCJjbWRfJXMgOj0gJXNcblxuIiwgdGFyZ2V0LCBjbWRsaW5lKTsKK30KKworY2hhciAqIHN0cl9jb25maWcgID0gTlVMTDsKK2ludCAgICBzaXplX2NvbmZpZyA9IDA7CitpbnQgICAgbGVuX2NvbmZpZyAgPSAwOworCisvKgorICogR3JvdyB0aGUgY29uZmlndXJhdGlvbiBzdHJpbmcgdG8gYSBkZXNpcmVkIGxlbmd0aC4KKyAqIFVzdWFsbHkgdGhlIGZpcnN0IGdyb3d0aCBpcyBwbGVudHkuCisgKi8KK3ZvaWQgZ3Jvd19jb25maWcoaW50IGxlbikKK3sKKwl3aGlsZSAobGVuX2NvbmZpZyArIGxlbiA+IHNpemVfY29uZmlnKSB7CisJCWlmIChzaXplX2NvbmZpZyA9PSAwKQorCQkJc2l6ZV9jb25maWcgPSAyMDQ4OworCQlzdHJfY29uZmlnID0gcmVhbGxvYyhzdHJfY29uZmlnLCBzaXplX2NvbmZpZyAqPSAyKTsKKwkJaWYgKHN0cl9jb25maWcgPT0gTlVMTCkKKwkJCXsgcGVycm9yKCJmaXhkZXA6bWFsbG9jIik7IGV4aXQoMSk7IH0KKwl9Cit9CisKKworCisvKgorICogTG9va3VwIGEgdmFsdWUgaW4gdGhlIGNvbmZpZ3VyYXRpb24gc3RyaW5nLgorICovCitpbnQgaXNfZGVmaW5lZF9jb25maWcoY29uc3QgY2hhciAqIG5hbWUsIGludCBsZW4pCit7CisJY29uc3QgY2hhciAqIHBjb25maWc7CisJY29uc3QgY2hhciAqIHBsYXN0ID0gc3RyX2NvbmZpZyArIGxlbl9jb25maWcgLSBsZW47CisJZm9yICggcGNvbmZpZyA9IHN0cl9jb25maWcgKyAxOyBwY29uZmlnIDwgcGxhc3Q7IHBjb25maWcrKyApIHsKKwkJaWYgKHBjb25maWdbIC0xXSA9PSAnXG4nCisJCSYmICBwY29uZmlnW2xlbl0gPT0gJ1xuJworCQkmJiAgIW1lbWNtcChwY29uZmlnLCBuYW1lLCBsZW4pKQorCQkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCisvKgorICogQWRkIGEgbmV3IHZhbHVlIHRvIHRoZSBjb25maWd1cmF0aW9uIHN0cmluZy4KKyAqLwordm9pZCBkZWZpbmVfY29uZmlnKGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbGVuKQoreworCWdyb3dfY29uZmlnKGxlbiArIDEpOworCisJbWVtY3B5KHN0cl9jb25maWcrbGVuX2NvbmZpZywgbmFtZSwgbGVuKTsKKwlsZW5fY29uZmlnICs9IGxlbjsKKwlzdHJfY29uZmlnW2xlbl9jb25maWcrK10gPSAnXG4nOworfQorCisvKgorICogQ2xlYXIgdGhlIHNldCBvZiBjb25maWd1cmF0aW9uIHN0cmluZ3MuCisgKi8KK3ZvaWQgY2xlYXJfY29uZmlnKHZvaWQpCit7CisJbGVuX2NvbmZpZyA9IDA7CisJZGVmaW5lX2NvbmZpZygiIiwgMCk7Cit9CisKKy8qCisgKiBSZWNvcmQgdGhlIHVzZSBvZiBhIENPTkZJR18qIHdvcmQuCisgKi8KK3ZvaWQgdXNlX2NvbmZpZyhjaGFyICptLCBpbnQgc2xlbikKK3sKKwljaGFyICpzID0gYWxsb2NhKHNsZW4rMSk7CisJY2hhciAqcDsKKworCWlmIChpc19kZWZpbmVkX2NvbmZpZyhtLCBzbGVuKSkKKwkgICAgcmV0dXJuOworCisJZGVmaW5lX2NvbmZpZyhtLCBzbGVuKTsKKworCW1lbWNweShzLCBtLCBzbGVuKTsgc1tzbGVuXSA9IDA7CisKKwlmb3IgKHAgPSBzOyBwIDwgcyArIHNsZW47IHArKykgeworCQlpZiAoKnAgPT0gJ18nKQorCQkJKnAgPSAnLyc7CisJCWVsc2UKKwkJCSpwID0gdG9sb3dlcigoaW50KSpwKTsKKwl9CisJcHJpbnRmKCIgICAgJCh3aWxkY2FyZCBpbmNsdWRlL2NvbmZpZy8lcy5oKSBcXFxuIiwgcyk7Cit9CisKK3ZvaWQgcGFyc2VfY29uZmlnX2ZpbGUoY2hhciAqbWFwLCBzaXplX3QgbGVuKQoreworCS8qIG1vZGlmaWVkIGZvciBiYm94ICovCisJY2hhciAqZW5kXzMgPSBtYXAgKyBsZW4gLSAzOyAvKiAzID09IGxlbmd0aCBvZiAiSUZfIiAqLworCWNoYXIgKmVuZF83ID0gbWFwICsgbGVuIC0gNzsKKwljaGFyICpwID0gbWFwOworCWNoYXIgKnE7CisJaW50IG9mZjsKKworCWZvciAoOyBwIDw9IGVuZF8zOyBwKyspIHsKKwkJLyogRmluZCBuZXh0IGlkZW50aWZpZXIncyBiZWdpbm5pbmcgKi8KKwkJaWYgKCEoaXNhbG51bSgqcCkgfHwgKnAgPT0gJ18nKSkKKwkJCWNvbnRpbnVlOworCisJCS8qIENoZWNrIGl0ICovCisJCWlmIChwIDwgZW5kXzcgJiYgcFs2XSA9PSAnXycpIHsKKwkJCWlmICghbWVtY21wKHAsICJDT05GSUciLCA2KSkgZ290byBjb25mNzsKKwkJCWlmICghbWVtY21wKHAsICJFTkFCTEUiLCA2KSkgZ290byBjb25mNzsKKwkJCWlmICghbWVtY21wKHAsICJJRl9OT1QiLCA2KSkgZ290byBjb25mNzsKKwkJfQorCQkvKiB3ZSBoYXZlIGF0IGxlYXN0IDMgY2hhcnMgYmVjYXVzZSBvZiBwIDw9IGVuZF8zICovCisJCS8qaWYgKCFtZW1jbXAocCwgIklGXyIsIDMpKSAuLi4qLworCQlpZiAocFswXSA9PSAnSScgJiYgcFsxXSA9PSAnRicgJiYgcFsyXSA9PSAnXycpIHsKKwkJCW9mZiA9IDM7CisJCQlnb3RvIGNvbmY7CisJCX0KKworCQkvKiBUaGlzIGlkZW50aWZpZXIgaXMgbm90IGludGVyZXN0aW5nLCBza2lwIGl0ICovCisJCXdoaWxlIChwIDw9IGVuZF8zICYmIChpc2FsbnVtKCpwKSB8fCAqcCA9PSAnXycpKQorCQkJcCsrOworCQljb250aW51ZTsKKworCWNvbmY3OglvZmYgPSA3OworCWNvbmY6CisJCXAgKz0gb2ZmOworCQlmb3IgKHEgPSBwOyBxIDwgZW5kXzMrMzsgcSsrKSB7CisJCQlpZiAoIShpc2FsbnVtKCpxKSB8fCAqcSA9PSAnXycpKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChxICE9IHApIHsKKwkJCXVzZV9jb25maWcocCwgcS1wKTsKKwkJfQorCX0KK30KKworLyogdGVzdCBpcyBzIGVuZHMgaW4gc3ViICovCitpbnQgc3RycmNtcChjaGFyICpzLCBjaGFyICpzdWIpCit7CisJaW50IHNsZW4gPSBzdHJsZW4ocyk7CisJaW50IHN1YmxlbiA9IHN0cmxlbihzdWIpOworCisJaWYgKHN1YmxlbiA+IHNsZW4pCisJCXJldHVybiAxOworCisJcmV0dXJuIG1lbWNtcChzICsgc2xlbiAtIHN1Ymxlbiwgc3ViLCBzdWJsZW4pOworfQorCit2b2lkIGRvX2NvbmZpZ19maWxlKGNoYXIgKmZpbGVuYW1lKQoreworCXN0cnVjdCBzdGF0IHN0OworCWludCBmZDsKKwl2b2lkICptYXA7CisKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZml4ZGVwOiAiKTsKKwkJcGVycm9yKGZpbGVuYW1lKTsKKwkJZXhpdCgyKTsKKwl9CisJZnN0YXQoZmQsICZzdCk7CisJaWYgKHN0LnN0X3NpemUgPT0gMCkgeworCQljbG9zZShmZCk7CisJCXJldHVybjsKKwl9CisJbWFwID0gbW1hcChOVUxMLCBzdC5zdF9zaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisJaWYgKChsb25nKSBtYXAgPT0gLTEpIHsKKwkJcGVycm9yKCJmaXhkZXA6IG1tYXAiKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm47CisJfQorCisJcGFyc2VfY29uZmlnX2ZpbGUobWFwLCBzdC5zdF9zaXplKTsKKworCW11bm1hcChtYXAsIHN0LnN0X3NpemUpOworCisJY2xvc2UoZmQpOworfQorCit2b2lkIHBhcnNlX2RlcF9maWxlKHZvaWQgKm1hcCwgc2l6ZV90IGxlbikKK3sKKwljaGFyICptID0gbWFwOworCWNoYXIgKmVuZCA9IG0gKyBsZW47CisJY2hhciAqcDsKKwljaGFyICpzID0gYWxsb2NhKGxlbik7CisKKwlwID0gbWVtY2hyKG0sICc6JywgbGVuKTsKKwlpZiAoIXApIHsKKwkJZnByaW50ZihzdGRlcnIsICJmaXhkZXA6IHBhcnNlIGVycm9yXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisJbWVtY3B5KHMsIG0sIHAtbSk7IHNbcC1tXSA9IDA7CisJcHJpbnRmKCJkZXBzXyVzIDo9IFxcXG4iLCB0YXJnZXQpOworCW0gPSBwKzE7CisKKwljbGVhcl9jb25maWcoKTsKKworCXdoaWxlIChtIDwgZW5kKSB7CisJCXdoaWxlIChtIDwgZW5kICYmICgqbSA9PSAnICcgfHwgKm0gPT0gJ1xcJyB8fCAqbSA9PSAnXG4nIHx8ICptID09ICdccicpKQorCQkJbSsrOworCQlwID0gbTsKKwkJd2hpbGUgKHAgPCBlbmQgJiYgKnAgIT0gJyAnKSBwKys7CisJCWlmIChwID09IGVuZCkgeworCQkJZG8gcC0tOyB3aGlsZSAoIWlzYWxudW0oKnApKTsKKwkJCXArKzsKKwkJfQorCQltZW1jcHkocywgbSwgcC1tKTsgc1twLW1dID0gMDsKKwkJaWYgKHN0cnJjbXAocywgImluY2x1ZGUvYXV0b2NvbmYuaCIpICYmCisJCSAgICBzdHJyY21wKHMsICJhcmNoL3VtL2luY2x1ZGUvdW1sLWNvbmZpZy5oIikgJiYKKwkJICAgIHN0cnJjbXAocywgIi52ZXIiKSkgeworCQkJcHJpbnRmKCIgICVzIFxcXG4iLCBzKTsKKwkJCWRvX2NvbmZpZ19maWxlKHMpOworCQl9CisJCW0gPSBwICsgMTsKKwl9CisJcHJpbnRmKCJcbiVzOiAkKGRlcHNfJXMpXG5cbiIsIHRhcmdldCwgdGFyZ2V0KTsKKwlwcmludGYoIiQoZGVwc18lcyk6XG4iLCB0YXJnZXQpOworfQorCit2b2lkIHByaW50X2RlcHModm9pZCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpbnQgZmQ7CisJdm9pZCAqbWFwOworCisJZmQgPSBvcGVuKGRlcGZpbGUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZml4ZGVwOiAiKTsKKwkJcGVycm9yKGRlcGZpbGUpOworCQlleGl0KDIpOworCX0KKwlmc3RhdChmZCwgJnN0KTsKKwlpZiAoc3Quc3Rfc2l6ZSA9PSAwKSB7CisJCWZwcmludGYoc3RkZXJyLCJmaXhkZXA6ICVzIGlzIGVtcHR5XG4iLGRlcGZpbGUpOworCQljbG9zZShmZCk7CisJCXJldHVybjsKKwl9CisJbWFwID0gbW1hcChOVUxMLCBzdC5zdF9zaXplLCBQUk9UX1JFQUQsIE1BUF9QUklWQVRFLCBmZCwgMCk7CisJaWYgKChsb25nKSBtYXAgPT0gLTEpIHsKKwkJcGVycm9yKCJmaXhkZXA6IG1tYXAiKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm47CisJfQorCisJcGFyc2VfZGVwX2ZpbGUobWFwLCBzdC5zdF9zaXplKTsKKworCW11bm1hcChtYXAsIHN0LnN0X3NpemUpOworCisJY2xvc2UoZmQpOworfQorCit2b2lkIHRyYXBzKHZvaWQpCit7CisvKiBiYm94OiBub3QgbmVlZGVkCisJc3RhdGljIGNoYXIgdGVzdFtdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoc2l6ZW9mKGludCkpKSkgPSAiQ09ORiI7CisKKwlpZiAoKihpbnQgKil0ZXN0ICE9IElOVF9DT05GKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZml4ZGVwOiBzaXplb2YoaW50KSAhPSA0IG9yIHdyb25nIGVuZGlhbmVzcz8gJSN4XG4iLAorCQkJKihpbnQgKil0ZXN0KTsKKwkJZXhpdCgyKTsKKwl9CisqLworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJdHJhcHMoKTsKKworCWlmIChhcmdjICE9IDQpCisJCXVzYWdlKCk7CisKKwlkZXBmaWxlID0gYXJndlsxXTsKKwl0YXJnZXQgPSBhcmd2WzJdOworCWNtZGxpbmUgPSBhcmd2WzNdOworCisJcHJpbnRfY21kbGluZSgpOworCXByaW50X2RlcHMoKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9iYXNpYy9zcGxpdC1pbmNsdWRlLmMgYi9zY3JpcHRzL2Jhc2ljL3NwbGl0LWluY2x1ZGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzI4Nzg4Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9iYXNpYy9zcGxpdC1pbmNsdWRlLmMKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBzcGxpdC1pbmNsdWRlLmMKKyAqCisgKiBDb3B5cmlnaHQgYWJhbmRvbmVkLCBNaWNoYWVsIENoYXN0YWluLCA8bWFpbHRvOm1lY0BzaG91dC5uZXQ+LgorICogVGhpcyBpcyBhIEMgdmVyc2lvbiBvZiBzeW5jZGVwLnBsIGJ5IFdlcm5lciBBbG1lc2Jlcmdlci4KKyAqCisgKiBUaGlzIHByb2dyYW0gdGFrZXMgYXV0b2NvbmYuaCBhcyBpbnB1dCBhbmQgb3V0cHV0cyBhIGRpcmVjdG9yeSBmdWxsCisgKiBvZiBvbmUtbGluZSBpbmNsdWRlIGZpbGVzLCBtZXJnaW5nIG9udG8gdGhlIG9sZCB2YWx1ZXMuCisgKgorICogVGhpbmsgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcyBrZXktdmFsdWUgcGFpcnMuICBUaGVuIHRoZXJlCisgKiBhcmUgZml2ZSBjYXNlczoKKyAqCisgKiAgICBrZXkgICAgICBvbGQgdmFsdWUgICBuZXcgdmFsdWUgICBhY3Rpb24KKyAqCisgKiAgICBLRVktMSAgICBWQUxVRS0xICAgICBWQUxVRS0xICAgICBsZWF2ZSBmaWxlIGFsb25lCisgKiAgICBLRVktMiAgICBWQUxVRS0yQSAgICBWQUxVRS0yQiAgICB3cml0ZSBWQUxVRS0yQiBpbnRvIGZpbGUKKyAqICAgIEtFWS0zICAgIC0gICAgICAgICAgIFZBTFVFLTMgICAgIHdyaXRlIFZBTFVFLTMgIGludG8gZmlsZQorICogICAgS0VZLTQgICAgVkFMVUUtNCAgICAgLSAgICAgICAgICAgd3JpdGUgYW4gZW1wdHkgZmlsZQorICogICAgS0VZLTUgICAgKGVtcHR5KSAgICAgLSAgICAgICAgICAgbGVhdmUgb2xkIGVtcHR5IGZpbGUgYWxvbmUKKyAqLworCisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgRVJST1JfRVhJVChzdHJFeGl0KQkJCQkJCVwKKyAgICB7CQkJCQkJCQkJXAorCWNvbnN0IGludCBlcnJub1NhdmUgPSBlcnJubzsJCQkJCVwKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBzdHJfbXlfbmFtZSk7CQkJCVwKKwllcnJubyA9IGVycm5vU2F2ZTsJCQkJCQlcCisJcGVycm9yKChzdHJFeGl0KSk7CQkJCQkJXAorCWV4aXQoMSk7CQkJCQkJCVwKKyAgICB9CisKKworCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqIGFyZ3YgW10pCit7CisgICAgY29uc3QgY2hhciAqIHN0cl9teV9uYW1lOworICAgIGNvbnN0IGNoYXIgKiBzdHJfZmlsZV9hdXRvY29uZjsKKyAgICBjb25zdCBjaGFyICogc3RyX2Rpcl9jb25maWc7CisKKyAgICBGSUxFICogZnBfY29uZmlnOworICAgIEZJTEUgKiBmcF90YXJnZXQ7CisgICAgRklMRSAqIGZwX2ZpbmQ7CisKKyAgICBpbnQgYnVmZmVyX3NpemU7CisKKyAgICBjaGFyICogbGluZTsKKyAgICBjaGFyICogb2xkX2xpbmU7CisgICAgY2hhciAqIGxpc3RfdGFyZ2V0OworICAgIGNoYXIgKiBwdGFyZ2V0OworCisgICAgc3RydWN0IHN0YXQgc3RhdF9idWY7CisKKyAgICAvKiBDaGVjayBhcmcgY291bnQuICovCisgICAgaWYgKGFyZ2MgIT0gMykKKyAgICB7CisJZnByaW50ZihzdGRlcnIsICIlczogd3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50cy5cbiIsIGFyZ3ZbMF0pOworCWV4aXQoMSk7CisgICAgfQorCisgICAgc3RyX215X25hbWUgICAgICAgPSBhcmd2WzBdOworICAgIHN0cl9maWxlX2F1dG9jb25mID0gYXJndlsxXTsKKyAgICBzdHJfZGlyX2NvbmZpZyAgICA9IGFyZ3ZbMl07CisKKyAgICAvKiBGaW5kIGEgYnVmZmVyIHNpemUuICovCisgICAgaWYgKHN0YXQoc3RyX2ZpbGVfYXV0b2NvbmYsICZzdGF0X2J1ZikgIT0gMCkKKwlFUlJPUl9FWElUKHN0cl9maWxlX2F1dG9jb25mKTsKKyAgICBidWZmZXJfc2l6ZSA9IDIgKiBzdGF0X2J1Zi5zdF9zaXplICsgNDA5NjsKKworICAgIC8qIEFsbG9jYXRlIGJ1ZmZlcnMuICovCisgICAgaWYgKCAobGluZSAgICAgICAgPSBtYWxsb2MoYnVmZmVyX3NpemUpKSA9PSBOVUxMCisgICAgfHwgICAob2xkX2xpbmUgICAgPSBtYWxsb2MoYnVmZmVyX3NpemUpKSA9PSBOVUxMCisgICAgfHwgICAobGlzdF90YXJnZXQgPSBtYWxsb2MoYnVmZmVyX3NpemUpKSA9PSBOVUxMICkKKwlFUlJPUl9FWElUKHN0cl9maWxlX2F1dG9jb25mKTsKKworICAgIC8qIE9wZW4gYXV0b2NvbmZpZyBmaWxlLiAqLworICAgIGlmICgoZnBfY29uZmlnID0gZm9wZW4oc3RyX2ZpbGVfYXV0b2NvbmYsICJyIikpID09IE5VTEwpCisJRVJST1JfRVhJVChzdHJfZmlsZV9hdXRvY29uZik7CisKKyAgICAvKiBNYWtlIG91dHB1dCBkaXJlY3RvcnkgaWYgbmVlZGVkLiAqLworICAgIGlmIChzdGF0KHN0cl9kaXJfY29uZmlnLCAmc3RhdF9idWYpICE9IDApCisgICAgeworCWlmIChta2RpcihzdHJfZGlyX2NvbmZpZywgMDc1NSkgIT0gMCkKKwkgICAgRVJST1JfRVhJVChzdHJfZGlyX2NvbmZpZyk7CisgICAgfQorCisgICAgLyogQ2hhbmdlIHRvIG91dHB1dCBkaXJlY3RvcnkuICovCisgICAgaWYgKGNoZGlyKHN0cl9kaXJfY29uZmlnKSAhPSAwKQorCUVSUk9SX0VYSVQoc3RyX2Rpcl9jb25maWcpOworCisgICAgLyogUHV0IGluaXRpYWwgc2VwYXJhdG9yIGludG8gdGFyZ2V0IGxpc3QuICovCisgICAgcHRhcmdldCA9IGxpc3RfdGFyZ2V0OworICAgICpwdGFyZ2V0KysgPSAnXG4nOworCisgICAgLyogUmVhZCBjb25maWcgbGluZXMuICovCisgICAgd2hpbGUgKGZnZXRzKGxpbmUsIGJ1ZmZlcl9zaXplLCBmcF9jb25maWcpKQorICAgIHsKKwljb25zdCBjaGFyICogc3RyX2NvbmZpZzsKKwlpbnQgaXNfc2FtZTsKKwlpbnQgaXRhcmdldDsKKworCWlmIChsaW5lWzBdICE9ICcjJykKKwkgICAgY29udGludWU7CisJaWYgKChzdHJfY29uZmlnID0gc3Ryc3RyKGxpbmUsICIgQ09ORklHXyIpKSA9PSBOVUxMKQorCSAgICBjb250aW51ZTsKKworCS8qIFdlIGZvdW5kICNkZWZpbmUgQ09ORklHX2ZvbyBvciAjdW5kZWYgQ09ORklHX2Zvby4KKwkgKiBNYWtlIHRoZSBvdXRwdXQgZmlsZSBuYW1lLiAqLworCXN0cl9jb25maWcgKz0gc2l6ZW9mKCIgQ09ORklHXyIpIC0gMTsKKwlmb3IgKGl0YXJnZXQgPSAwOyAhaXNzcGFjZShzdHJfY29uZmlnW2l0YXJnZXRdKTsgaXRhcmdldCsrKQorCXsKKwkgICAgaW50IGMgPSAodW5zaWduZWQgY2hhcikgc3RyX2NvbmZpZ1tpdGFyZ2V0XTsKKwkgICAgaWYgKGlzdXBwZXIoYykpIGMgPSB0b2xvd2VyKGMpOworCSAgICBpZiAoYyA9PSAnXycpICAgYyA9ICcvJzsKKwkgICAgcHRhcmdldFtpdGFyZ2V0XSA9IGM7CisJfQorCXB0YXJnZXRbaXRhcmdldCsrXSA9ICcuJzsKKwlwdGFyZ2V0W2l0YXJnZXQrK10gPSAnaCc7CisJcHRhcmdldFtpdGFyZ2V0KytdID0gJ1wwJzsKKworCS8qIENoZWNrIGZvciBleGlzdGluZyBmaWxlLiAqLworCWlzX3NhbWUgPSAwOworCWlmICgoZnBfdGFyZ2V0ID0gZm9wZW4ocHRhcmdldCwgInIiKSkgIT0gTlVMTCkKKwl7CisJICAgIGZnZXRzKG9sZF9saW5lLCBidWZmZXJfc2l6ZSwgZnBfdGFyZ2V0KTsKKwkgICAgaWYgKGZjbG9zZShmcF90YXJnZXQpICE9IDApCisJCUVSUk9SX0VYSVQocHRhcmdldCk7CisJICAgIGlmICghc3RyY21wKGxpbmUsIG9sZF9saW5lKSkKKwkJaXNfc2FtZSA9IDE7CisJfQorCisJaWYgKCFpc19zYW1lKQorCXsKKwkgICAgLyogQXV0by1jcmVhdGUgZGlyZWN0b3JpZXMuICovCisJICAgIGludCBpc2xhc2g7CisJICAgIGZvciAoaXNsYXNoID0gMDsgaXNsYXNoIDwgaXRhcmdldDsgaXNsYXNoKyspCisJICAgIHsKKwkJaWYgKHB0YXJnZXRbaXNsYXNoXSA9PSAnLycpCisJCXsKKwkJICAgIHB0YXJnZXRbaXNsYXNoXSA9ICdcMCc7CisJCSAgICBpZiAoc3RhdChwdGFyZ2V0LCAmc3RhdF9idWYpICE9IDAKKwkJICAgICYmICBta2RpcihwdGFyZ2V0LCAwNzU1KSAgICAgIT0gMCkKKwkJCUVSUk9SX0VYSVQoIHB0YXJnZXQgKTsKKwkJICAgIHB0YXJnZXRbaXNsYXNoXSA9ICcvJzsKKwkJfQorCSAgICB9CisKKwkgICAgLyogV3JpdGUgdGhlIGZpbGUuICovCisJICAgIGlmICgoZnBfdGFyZ2V0ID0gZm9wZW4ocHRhcmdldCwgICJ3IikpID09IE5VTEwpCisJCUVSUk9SX0VYSVQocHRhcmdldCk7CisJICAgIGZwdXRzKGxpbmUsIGZwX3RhcmdldCk7CisJICAgIGlmIChmZXJyb3IoZnBfdGFyZ2V0KSB8fCBmY2xvc2UoZnBfdGFyZ2V0KSAhPSAwKQorCQlFUlJPUl9FWElUKHB0YXJnZXQpOworCX0KKworCS8qIFVwZGF0ZSB0YXJnZXQgbGlzdCAqLworCXB0YXJnZXQgKz0gaXRhcmdldDsKKwkqKHB0YXJnZXQtMSkgPSAnXG4nOworICAgIH0KKworICAgIC8qCisgICAgICogQ2xvc2UgYXV0b2NvbmZpZyBmaWxlLgorICAgICAqIFRlcm1pbmF0ZSB0aGUgdGFyZ2V0IGxpc3QuCisgICAgICovCisgICAgaWYgKGZjbG9zZShmcF9jb25maWcpICE9IDApCisJRVJST1JfRVhJVChzdHJfZmlsZV9hdXRvY29uZik7CisgICAgKnB0YXJnZXQgPSAnXDAnOworCisgICAgLyoKKyAgICAgKiBGaXggdXAgZXhpc3RpbmcgZmlsZXMgd2hpY2ggaGF2ZSBubyBuZXcgdmFsdWUuCisgICAgICogVGhpcyBpcyBDYXNlIDQgYW5kIENhc2UgNS4KKyAgICAgKgorICAgICAqIEkgcmUtcmVhZCB0aGUgdHJlZSBhbmQgZmlsdGVyIGl0IGFnYWluc3QgbGlzdF90YXJnZXQuCisgICAgICogVGhpcyBpcyBjcnVkZS4gIEJ1dCBpdCBhdm9pZHMgZGF0YSBjb3BpZXMuICBBbHNvLCBsaXN0X3RhcmdldAorICAgICAqIGlzIGNvbXBhY3QgYW5kIGNvbnRpZ3VvdXMsIHNvIGl0IGVhc2lseSBmaXRzIGludG8gY2FjaGUuCisgICAgICoKKyAgICAgKiBOb3RpY2UgdGhhdCBsaXN0X3RhcmdldCBjb250YWlucyBzdHJpbmdzIHNlcGFyYXRlZCBieSBcbiwKKyAgICAgKiB3aXRoIGEgXG4gYmVmb3JlIHRoZSBmaXJzdCBzdHJpbmcgYW5kIGFmdGVyIHRoZSBsYXN0LgorICAgICAqIGZnZXRzIGdpdmVzIHRoZSBpbmNvbWluZyBuYW1lcyBhIHRlcm1pbmF0aW5nIFxuLgorICAgICAqIFNvIGJ5IGhhdmluZyBhbiBpbml0aWFsIFxuLCBzdHJzdHIgd2lsbCBmaW5kIGV4YWN0IG1hdGNoZXMuCisgICAgICovCisKKyAgICBmcF9maW5kID0gcG9wZW4oImZpbmQgKiAtdHlwZSBmIC1uYW1lIFwiKi5oXCIgLXByaW50IiwgInIiKTsKKyAgICBpZiAoZnBfZmluZCA9PSAwKQorCUVSUk9SX0VYSVQoICJmaW5kIiApOworCisgICAgbGluZVswXSA9ICdcbic7CisgICAgd2hpbGUgKGZnZXRzKGxpbmUrMSwgYnVmZmVyX3NpemUsIGZwX2ZpbmQpKQorICAgIHsKKwlpZiAoc3Ryc3RyKGxpc3RfdGFyZ2V0LCBsaW5lKSA9PSBOVUxMKQorCXsKKwkgICAgLyoKKwkgICAgICogVGhpcyBpcyBhbiBvbGQgZmlsZSB3aXRoIG5vIENPTkZJR18qIGZsYWcgaW4gYXV0b2NvbmYuaC4KKwkgICAgICovCisKKwkgICAgLyogRmlyc3Qgc3RyaXAgdGhlIFxuLiAqLworCSAgICBsaW5lW3N0cmxlbihsaW5lKS0xXSA9ICdcMCc7CisKKwkgICAgLyogR3JhYiBzaXplLiAqLworCSAgICBpZiAoc3RhdChsaW5lKzEsICZzdGF0X2J1ZikgIT0gMCkKKwkJRVJST1JfRVhJVChsaW5lKTsKKworCSAgICAvKiBJZiBmaWxlIGlzIG5vdCBlbXB0eSwgbWFrZSBpdCBlbXB0eSBhbmQgZ2l2ZSBpdCBhIGZyZXNoIGRhdGUuICovCisJICAgIGlmIChzdGF0X2J1Zi5zdF9zaXplICE9IDApCisJICAgIHsKKwkJaWYgKChmcF90YXJnZXQgPSBmb3BlbihsaW5lKzEsICJ3IikpID09IE5VTEwpCisJCSAgICBFUlJPUl9FWElUKGxpbmUpOworCQlpZiAoZmNsb3NlKGZwX3RhcmdldCkgIT0gMCkKKwkJICAgIEVSUk9SX0VYSVQobGluZSk7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgaWYgKHBjbG9zZShmcF9maW5kKSAhPSAwKQorCUVSUk9SX0VYSVQoImZpbmQiKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9iYl9yZWxlYXNlIGIvc2NyaXB0cy9iYl9yZWxlYXNlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhhYTM4MDQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2JiX3JlbGVhc2UKQEAgLTAsMCArMSwzNCBAQAorIyEvYmluL3NoCisKKyMgQ3JlYXRlIHNpZ25lZCByZWxlYXNlIHRhcmJhbGxzIGFuZCBzaWduYXR1cmUgZmlsZXMgZnJvbSBjdXJyZW50IHN2bi4KKyMgU2luY2UgeW91IGRvbid0IGhhdmUgbXkgZ3BnIGtleSwgdGhpcyBkb2Vzbid0IGRvIHlvdSBtdWNoIGdvb2QsCisjIGJ1dCBpZiBJIGdldCBoaXQgYnkgYSBidXMgdGhlIG5leHQgbWFpbnRhaW5lciBtaWdodCBmaW5kIHRoaXMgdXNlZnVsLgorIyBSdW4gdGhpcyBpbiBhbiBlbXB0eSBkaXJlY3RvcnkuICBUaGUgVkVSU0lPTj0gbGluZSBjYW4gZ2V0IGNvbmZ1c2VkCisjIG90aGVyd2lzZS4KKworI3N2biBjbyBzdm46Ly9idXN5Ym94Lm5ldC90cnVuay9idXN5Ym94CitjZCBidXN5Ym94IHx8IHsgZWNobyAiY2QgYnVzeWJveCBmYWlsZWQiOyBleGl0IDE7IH0KK21ha2UgcmVsZWFzZSB8fCB7IGVjaG8gIm1ha2UgcmVsZWFzZSBmYWlsZWQiOyBleGl0IDE7IH0KK2NkIC4uCisKK1ZFUlNJT049YGxzIGJ1c3lib3gtKi50YXIuZ3ogfCBzZWQgJ3MvYnVzeWJveC1cKC4qXClcLnRhclwuZ3ovXDEvJ2AKKworemNhdCBidXN5Ym94LSRWRVJTSU9OLnRhci5neiB8IGJ6aXAyID4gYnVzeWJveC0kVkVSU0lPTi50YXIuYnoyCisKK3Rlc3QgLWYgYnVzeWJveC0kVkVSU0lPTi50YXIuZ3ogfHwgeyBlY2hvICJubyBidXN5Ym94LSRWRVJTSU9OLnRhci5neiI7IGV4aXQgMTsgfQordGVzdCAtZiBidXN5Ym94LSRWRVJTSU9OLnRhci5iejIgfHwgeyBlY2hvICJubyBidXN5Ym94LSRWRVJTSU9OLnRhci5iejIiOyBleGl0IDE7IH0KKworc2lnbml0KCkKK3sKK2VjaG8gIiQxIHJlbGVhc2VkIGBkYXRlIC1yICQxIC1SYAorCitNRDU6ICBgbWQ1c3VtICQxYAorU0hBMTogYHNoYTFzdW0gJDFgCisKK1RvIHZlcmlmeSB0aGlzIHNpZ25hdHVyZSwgeW91IGNhbiBvYnRhaW4gbXkgcHVibGljIGtleQorZnJvbSBodHRwOi8vYnVzeWJveC5uZXQvfnZkYS92ZGFfcHVia2V5LmdwZworIiB8IGdwZyAtLWNsZWFyc2lnbiA+ICIkMS5zaWduIgorfQorCitzaWduaXQgYnVzeWJveC0kVkVSU0lPTi50YXIuZ3oKK3NpZ25pdCBidXN5Ym94LSRWRVJTSU9OLnRhci5iejIKZGlmZiAtLWdpdCBhL3NjcmlwdHMvYmxvYXQtby1tZXRlciBiL3NjcmlwdHMvYmxvYXQtby1tZXRlcgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYjg2MWI4Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9ibG9hdC1vLW1ldGVyCkBAIC0wLDAgKzEsMTM1IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgQ29weXJpZ2h0IDIwMDQgTWF0dCBNYWNrYWxsIDxtcG1Ac2VsZW5pYy5jb20+CisjCisjIEluc3BpcmVkIGJ5IHBlcmwgQmxvYXQtTy1NZXRlciAoYykgMTk5NyBieSBBbmRpIEtsZWVuCisjCisjIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKworaW1wb3J0IHN5cywgb3MKKworZGVmIHVzYWdlKCk6CisgICAgc3lzLnN0ZGVyci53cml0ZSgidXNhZ2U6ICVzIFstdF0gZmlsZTEgZmlsZTIgWy0tIDxyZWFkZWxmIG9wdGlvbnM+XVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgJSBzeXMuYXJndlswXSkKKyAgICBzeXMuc3RkZXJyLndyaXRlKCJcdC10XHRTaG93IHRpbWUgc3BlbnQgb24gcGFyc2luZy9wcm9jZXNzaW5nXG4iKQorICAgIHN5cy5zdGRlcnIud3JpdGUoIlx0LS1cdFBhc3MgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHJlYWRlbGZcbiIpCisgICAgc3lzLmV4aXQoMSkKKworZjEsIGYyID0gKE5vbmUsIE5vbmUpCitmbGFnX3RpbWluZywgZGFzaGVzID0gKEZhbHNlLCBGYWxzZSkKKworZm9yIGYgaW4gc3lzLmFyZ3ZbMTpdOgorICAgIGlmIGYuc3RhcnRzd2l0aCgiLSIpOgorICAgICAgICBpZiBmID09ICItLSI6ICMgc3ltX2FyZ3MKKyAgICAgICAgICAgIGRhc2hlcyA9IFRydWUKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIGYgPT0gIi10IjogIyB0aW1pbmdzCisgICAgICAgICAgICBmbGFnX3RpbWluZyA9IFRydWUKKyAgICBlbHNlOgorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoZik6CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJFcnJvcjogZmlsZSAnJXMnIGRvZXMgbm90IGV4aXN0XG4iICUgZikKKyAgICAgICAgICAgIHVzYWdlKCkKKyAgICAgICAgaWYgZjEgaXMgTm9uZToKKyAgICAgICAgICAgIGYxID0gZgorICAgICAgICBlbGlmIGYyIGlzIE5vbmU6CisgICAgICAgICAgICBmMiA9IGYKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHVzYWdlKCkKK2lmIGZsYWdfdGltaW5nOgorICAgIGltcG9ydCB0aW1lCitpZiBmMSBpcyBOb25lIG9yIGYyIGlzIE5vbmU6CisgICAgdXNhZ2UoKQorCitzeW1fYXJncyA9ICIgIi5qb2luKHN5cy5hcmd2WzMgKyBmbGFnX3RpbWluZyArIGRhc2hlczpdKQorZGVmIGdldHNpemVzKGZpbGUpOgorICAgIHN5bSwgYWxpYXMsIGx1dCA9IHt9LCB7fSwge30KKyAgICBmb3IgbCBpbiBvcy5wb3BlbigicmVhZGVsZiAtVyAtcyAlcyAlcyIgJSAoc3ltX2FyZ3MsIGZpbGUpKS5yZWFkbGluZXMoKToKKyAgICAgICAgbCA9IGwuc3RyaXAoKQorICAgICAgICBpZiBub3QgKGxlbihsKSBhbmQgbFswXS5pc2RpZ2l0KCkgYW5kIGxlbihsLnNwbGl0KCkpID09IDgpOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgbnVtLCB2YWx1ZSwgc2l6ZSwgdHlwLCBiaW5kLCB2aXMsIG5keCwgbmFtZSA9IGwuc3BsaXQoKQorICAgICAgICBpZiBuZHggPT0gIlVORCI6IGNvbnRpbnVlICMgc2tpcCB1bmRlZmluZWQKKyAgICAgICAgaWYgdHlwIGluIFsiU0VDVElPTiIsICJGSUxFUyJdOiBjb250aW51ZSAjIHNraXAgc2VjdGlvbnMgYW5kIGZpbGVzCisgICAgICAgIGlmICIuIiBpbiBuYW1lOiBuYW1lID0gInN0YXRpYy4iICsgbmFtZS5zcGxpdCgiLiIpWzBdCisgICAgICAgIHZhbHVlID0gaW50KHZhbHVlLCAxNikKKyAgICAgICAgc2l6ZSA9IGludChzaXplLCAxNikgaWYgc2l6ZS5zdGFydHN3aXRoKCcweCcpIGVsc2UgaW50KHNpemUpCisgICAgICAgIGlmIHZpcyAhPSAiREVGQVVMVCIgYW5kIGJpbmQgIT0gIkdMT0JBTCI6ICMgc2VlIGlmIGl0IGlzIGFuIGFsaWFzCisgICAgICAgICAgICBhbGlhc1sodmFsdWUsIHNpemUpXSA9IHsibmFtZSIgOiBuYW1lfQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc3ltW25hbWVdID0geyJhZGRyIiA6IHZhbHVlLCAic2l6ZSI6ICBzaXplfQorICAgICAgICAgICAgbHV0Wyh2YWx1ZSwgc2l6ZSldID0gMAorICAgIGZvciBhZGRyLCBzeiBpbiBpdGVyKGFsaWFzLmtleXMoKSk6CisgICAgICAgICMgSWYgdGhlIG5vbi1HTE9CQUwgc3ltIGhhcyBhbiBpbXBsZW1lbnRhdGlvbiBlbHNld2hlcmUgdGhlbgorICAgICAgICAjIGl0J3MgYW4gYWxpYXMsIGRpc3JlZ2FyZCBpdC4KKyAgICAgICAgaWYgbm90IChhZGRyLCBzeikgaW4gbHV0OgorICAgICAgICAgICAgIyBJZiB0aGlzIG5vbi1HTE9CQUwgc3ltIGRvZXMgbm90IGhhdmUgYW4gaW1wbGVtZW50YXRpb24gYXQKKyAgICAgICAgICAgICMgYW5vdGhlciBhZGRyZXNzLCB0aGVuIHRyZWF0IGl0IGFzIGEgbm9ybWFsIHN5bWJvbC4KKyAgICAgICAgICAgIHN5bVthbGlhc1soYWRkciwgc3opXVsibmFtZSJdXSA9IHsiYWRkciIgOiBhZGRyLCAic2l6ZSI6IHN6fQorICAgIGZvciBsIGluIG9zLnBvcGVuKCJyZWFkZWxmIC1XIC1TICIgKyBmaWxlKS5yZWFkbGluZXMoKToKKyAgICAgICAgeCA9IGwuc3BsaXQoKQorICAgICAgICBpZiBsZW4oeCk8NjogY29udGludWUKKyAgICAgICAgIyBTaG91bGQgdGFrZSB0aGVzZSBpbnRvIGFjY291bnQgdG9vIQorICAgICAgICAjaWYgeFsxXSBub3QgaW4gWyIudGV4dCIsICIucm9kYXRhIiwgIi5zeW10YWIiLCAiLnN0cnRhYiJdOiBjb250aW51ZQorICAgICAgICBpZiB4WzFdIG5vdCBpbiBbIi5yb2RhdGEiXTogY29udGludWUKKyAgICAgICAgc3ltW3hbMV1dID0geyJhZGRyIiA6IGludCh4WzNdLCAxNiksICJzaXplIiA6IGludCh4WzVdLCAxNil9CisgICAgcmV0dXJuIHN5bQorCitpZiBmbGFnX3RpbWluZzoKKyAgICBzdGFydF90MSA9IGludCh0aW1lLnRpbWUoKSAqIDFlOSkKK29sZCA9IGdldHNpemVzKGYxKQoraWYgZmxhZ190aW1pbmc6CisgICAgZW5kX3QxID0gaW50KHRpbWUudGltZSgpICogMWU5KQorICAgIHN0YXJ0X3QyID0gaW50KHRpbWUudGltZSgpICogMWU5KQorbmV3ID0gZ2V0c2l6ZXMoZjIpCitpZiBmbGFnX3RpbWluZzoKKyAgICBlbmRfdDIgPSBpbnQodGltZS50aW1lKCkgKiAxZTkpCisgICAgc3RhcnRfdDMgPSBpbnQodGltZS50aW1lKCkgKiAxZTkpCitncm93LCBzaHJpbmssIGFkZCwgcmVtb3ZlLCB1cCwgZG93biA9IDAsIDAsIDAsIDAsIDAsIDAKK2RlbHRhLCBjb21tb24gPSBbXSwge30KKworZm9yIG5hbWUgaW4gaXRlcihvbGQua2V5cygpKToKKyAgICBpZiBuYW1lIGluIG5ldzoKKyAgICAgICAgY29tbW9uW25hbWVdID0gMQorCitmb3IgbmFtZSBpbiBvbGQ6CisgICAgaWYgbmFtZSBub3QgaW4gY29tbW9uOgorICAgICAgICByZW1vdmUgKz0gMQorICAgICAgICBzeiA9IG9sZFtuYW1lXVsic2l6ZSJdCisgICAgICAgIGRvd24gKz0gc3oKKyAgICAgICAgZGVsdGEuYXBwZW5kKCgtc3osIG5hbWUpKQorCitmb3IgbmFtZSBpbiBuZXc6CisgICAgaWYgbmFtZSBub3QgaW4gY29tbW9uOgorICAgICAgICBhZGQgKz0gMQorICAgICAgICBzeiA9IG5ld1tuYW1lXVsic2l6ZSJdCisgICAgICAgIHVwICs9IHN6CisgICAgICAgIGRlbHRhLmFwcGVuZCgoc3osIG5hbWUpKQorCitmb3IgbmFtZSBpbiBjb21tb246CisgICAgICAgIGQgPSBuZXdbbmFtZV0uZ2V0KCJzaXplIiwgMCkgLSBvbGRbbmFtZV0uZ2V0KCJzaXplIiwgMCkKKyAgICAgICAgaWYgZD4wOiBncm93LCB1cCA9IGdyb3crMSwgdXArZAorICAgICAgICBlbGlmIGQ8MDogc2hyaW5rLCBkb3duID0gc2hyaW5rKzEsIGRvd24tZAorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgZGVsdGEuYXBwZW5kKChkLCBuYW1lKSkKKworZGVsdGEuc29ydCgpCitkZWx0YS5yZXZlcnNlKCkKK2lmIGZsYWdfdGltaW5nOgorICAgIGVuZF90MyA9IGludCh0aW1lLnRpbWUoKSAqIDFlOSkKKworcHJpbnQoIiUtNDhzICU3cyAlN3MgJSs3cyIgJSAoImZ1bmN0aW9uIiwgIm9sZCIsICJuZXciLCAiZGVsdGEiKSkKK2ZvciBkLCBuIGluIGRlbHRhOgorICAgIGlmIGQ6CisgICAgICAgIG9sZF9zeiA9IG9sZC5nZXQobiwge30pLmdldCgic2l6ZSIsICItIikKKyAgICAgICAgbmV3X3N6ID0gbmV3LmdldChuLCB7fSkuZ2V0KCJzaXplIiwgIi0iKQorICAgICAgICBwcmludCgiJS00OHMgJTdzICU3cyAlKzdkIiAlIChuLCBvbGRfc3osIG5ld19zeiwgZCkpCitwcmludCgiLSIqNzgpCit0b3RhbD0iKGFkZC9yZW1vdmU6ICVzLyVzIGdyb3cvc2hyaW5rOiAlcy8lcyB1cC9kb3duOiAlcy8lcyklJXNUb3RhbDogJXMgYnl0ZXMiXAorICAgICUgKGFkZCwgcmVtb3ZlLCBncm93LCBzaHJpbmssIHVwLCAtZG93biwgdXAtZG93bikKK3ByaW50KHRvdGFsICUgKCIgIiooODAtbGVuKHRvdGFsKSkpKQoraWYgZmxhZ190aW1pbmc6CisgICAgcHJpbnQoIlxuJWQvJWQ7ICVkIFBhcnNlIG9yaWdpbi9uZXc7IHByb2Nlc3NpbmcgbnNlY3MiICUKKyAgICAgICAgKGVuZF90MS1zdGFydF90MSwgZW5kX3QyLXN0YXJ0X3QyLCBlbmRfdDMtc3RhcnRfdDMpKQorICAgIHByaW50KCJ0b3RhbCBuc2VjczogJWQiICUgKGVuZF90My1zdGFydF90MSkpCmRpZmYgLS1naXQgYS9zY3JpcHRzL2NoZWNraGVscC5hd2sgYi9zY3JpcHRzL2NoZWNraGVscC5hd2sKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTQ4NDNkNgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvY2hlY2toZWxwLmF3awpAQCAtMCwwICsxLDQwIEBACisjIS91c3IvYmluL2F3ayAtZgorIyBBV0sgc2NyaXB0IHRvIGNoZWNrIGZvciBtaXNzaW5nIGhlbHAgZW50cmllcyBmb3IgY29uZmlnIG9wdGlvbnMKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDA2IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorIworIyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZQorIyBNSVQvWCBwdWJsaWMgbGljZW5zZXMuIFNlZSBodHRwOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UuaHRtbAorIyBhbmQgbm90aWNlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9saWNlbnNlLWxpc3QuaHRtbCNYMTFMaWNlbnNlCisKKworL15jaG9pY2UvIHsgaXNfY2hvaWNlID0gMTsgfQorL15lbmRjaG9pY2UvIHsgaXNfY2hvaWNlID0gMDsgfQorL15jb25maWcvIHsKKwlwb3MrKzsKKwljb25mW3Bvc10gPSAkMjsKKwlmaWxlW3Bvc10gPSBGSUxFTkFNRTsKKwlpZiAoaXNfY2hvaWNlKSB7CisJCWhlbHBbcG9zXSA9IDE7ICMgZG8gbm90IHdhcm4gYWJvdXQgJ2Nob2ljZScgY29uZmlnIGVudHJpZXMuCisJfSBlbHNlIHsKKwkJaGVscFtwb3NdID0gMDsKKwl9Cit9CisvXlsgXHRdKmhlbHBbIFx0XSokLyB7CisJaGVscFtwb3NdID0gMTsKK30KKy9eWyBcdF0qYm9vbFsgXHRdKiQvIHsKKwloZWxwW3Bvc10gPSAxOyAjIGlnbm9yZSBvcHRpb25zIHdoaWNoIGFyZSBub3Qgc2VsZWN0YWJsZQorfQorQkVHSU4geworCXBvcyA9IC0xOworCWlzX2Nob2ljZSA9IDA7Cit9CitFTkQgeworCWZvciAoaSA9IDA7IGkgPD0gcG9zOyBpKyspIHsKKyMJcHJpbnRmKCIlczogaGVscCBmb3IgIyVpICclcycgPT0gJWlcbiIsIGZpbGVbaV0sIGksIGNvbmZbaV0sIGhlbHBbaV0pOworCQlpZiAoaGVscFtpXSA9PSAwKSB7CisJCQlwcmludGYoIiVzOiBObyBoZWxwdGV4dCBmb3IgJyVzJ1xuIiwgZmlsZVtpXSwgY29uZltpXSk7CisJCX0KKwl9Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2NoZWNrc3RhY2sucGwgYi9zY3JpcHRzL2NoZWNrc3RhY2sucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTVjZGQ3OAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvY2hlY2tzdGFjay5wbApAQCAtMCwwICsxLDE0MSBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMgU3RvbGVuIGZyb20gTGludXgga2VybmVsIDopCisKKyMJQ2hlY2sgdGhlIHN0YWNrIHVzYWdlIG9mIGZ1bmN0aW9ucworIworIwlDb3B5cmlnaHQgSm9lcm4gRW5nZWwgPGpvZXJuQHdoLmZoLXdlZGVsLmRlPgorIwlJbnNwaXJlZCBieSBMaW51cyBUb3J2YWxkcworIwlPcmlnaW5hbCBpZGVhIG1heWJlIGZyb20gS2VpdGggT3dlbnMKKyMJczM5MCBwb3J0IGFuZCBiaWcgc3BlZWR1cCBieSBBcm5kIEJlcmdtYW5uIDxhcm5kQGJlcmdtYW5uLWRhbGxkb3JmLmRlPgorIwlNaXBzIHBvcnQgYnkgSnVhbiBRdWludGVsYSA8cXVpbnRlbGFAbWFuZHJha2Vzb2Z0LmNvbT4KKyMJSUE2NCBwb3J0IHZpYSBBbmRyZWFzIERpbGdlcgorIwlBcm0gcG9ydCBieSBIb2xnZXIgU2NodXJpZworIwlzaDY0IHBvcnQgYnkgUGF1bCBNdW5kdAorIwlSYW5kb20gYml0cyBieSBNYXR0IE1hY2thbGwgPG1wbUBzZWxlbmljLmNvbT4KKyMJTTY4ayBwb3J0IGJ5IEdlZXJ0IFV5dHRlcmhvZXZlbiBhbmQgQW5kcmVhcyBTY2h3YWIKKyMKKyMJVXNhZ2U6CisjCW9iamR1bXAgLWQgdm1saW51eCB8IGNoZWNrc3RhY2sucGwgW2FyY2hdCisjCisjCVRPRE8gOglQb3J0IHRvIGFsbCBhcmNoaXRlY3R1cmVzIChvbmUgcmVnZXggcGVyIGFyY2gpCisKKyMgY2hlY2sgZm9yIGFyY2gKKyMKKyMgJHJlIGlzIHVzZWQgZm9yIHR3byBtYXRjaGVzOgorIyAkJiAod2hvbGUgcmUpIG1hdGNoZXMgdGhlIGNvbXBsZXRlIG9iamR1bXAgbGluZSB3aXRoIHRoZSBzdGFjayBncm93dGgKKyMgJDEgKGZpcnN0IGJyYWNrZXQpIG1hdGNoZXMgdGhlIHNpemUgb2YgdGhlIHN0YWNrIGdyb3d0aAorIworIyB1c2UgYW55dGhpbmcgZWxzZSBhbmQgZmVlbCB0aGUgcGFpbiA7KQorbXkgKEBzdGFjaywgJHJlLCAkeCwgJHhzKTsKK3sKKwlteSAkYXJjaCA9IHNoaWZ0OworCWlmICgkYXJjaCBlcSAiIikgeworCQkkYXJjaCA9IGB1bmFtZSAtbWA7CisJfQorCisJJHgJPSAiWzAtOWEtZl0iOwkjIGhleCBjaGFyYWN0ZXIKKwkkeHMJPSAiWzAtOWEtZiBdIjsJIyBoZXggY2hhcmFjdGVyIG9yIHNwYWNlCisJaWYgKCRhcmNoIGVxICdhcm0nKSB7CisJCSNjMDAwOGZmYzoJZTI0ZGQwNjQJc3ViCXNwLCBzcCwgIzEwMAk7IDB4NjQKKwkJJHJlID0gcXIvLipzdWIuKnNwLCBzcCwgIygoWzAtOV17Mn18WzMtOV0pWzAtOV17Mn0pL287CisJfSBlbHNpZiAoJGFyY2ggZXEgJ2JsYWNrZmluJykgeworCQkjICAgICAgNTI6ICAgICAgIDAwIGU4IDAzIDAwICAgICBMSU5LIDB4YzsKKwkJJHJlID0gcXIvLipMSU5LICgweCR4ezEsNX0pOyQvbzsKKwl9IGVsc2lmICgkYXJjaCA9fiAvXmlbMzQ1Nl04NiQvKSB7CisJCSNjMDEwNTIzNDogICAgICAgODEgZWMgYWMgMDUgMDAgMDAgICAgICAgc3ViICAgICQweDVhYywlZXNwCisJCSRyZSA9IHFyL14uKlthc11bZHVdW2RiXSAgICBcJCgweCR4ezEsOH0pLFwlZXNwJC9vOworCX0gZWxzaWYgKCRhcmNoIGVxICd4ODZfNjQnKSB7CisJCSMgICAgMmY2MDoJNDggODEgZWMgZTggMDUgMDAgMDAgCXN1YiAgICAkMHg1ZTgsJXJzcAorCQkkcmUgPSBxci9eLipbYXNdW2R1XVtkYl0gICAgXCQoMHgkeHsxLDh9KSxcJXJzcCQvbzsKKwl9IGVsc2lmICgkYXJjaCBlcSAnaWE2NCcpIHsKKwkJI2UwMDAwMDAwMDQ0MDExZmM6ICAgICAgIDAxIDBmIGZjIDhjICAgICBhZGRzIHIxMj0tMzg0LHIxMgorCQkkcmUgPSBxci8uKmFkZHMuKnIxMj0tKChbMC05XXsyfXxbMy05XSlbMC05XXsyfSkscjEyL287CisJfSBlbHNpZiAoJGFyY2ggZXEgJ202OGsnKSB7CisJCSMgICAgMmI2YzogICAgICAgNGU1NiBmYjcwICAgICAgIGxpbmt3ICVmcCwjLTExNjgKKwkJIyAgMWRmNzcwOiAgICAgICBkZWZjIGZmZTQgICAgICAgYWRkYXcgIy0yOCwlc3AKKwkJJHJlID0gcXIvLiooPzpsaW5rdyAlZnAsfGFkZGF3ICkjLShbMC05XXsxLDR9KSg/Oiwlc3ApPyQvbzsKKwl9IGVsc2lmICgkYXJjaCBlcSAnbWlwczY0JykgeworCQkjODgwMDQwMmM6ICAgICAgIDY3YmRmZmYwICAgICAgICBkYWRkaXUgIHNwLHNwLC0xNgorCQkkcmUgPSBxci8uKmRhZGRpdS4qc3Asc3AsLSgoWzAtOV17Mn18WzMtOV0pWzAtOV17Mn0pL287CisJfSBlbHNpZiAoJGFyY2ggZXEgJ21pcHMnKSB7CisJCSM4ODAwMzI1NDogICAgICAgMjdiZGZmZTAgICAgICAgIGFkZGl1ICAgc3Asc3AsLTMyCisJCSRyZSA9IHFyLy4qYWRkaXUuKnNwLHNwLC0oKFswLTldezJ9fFszLTldKVswLTldezJ9KS9vOworCX0gZWxzaWYgKCRhcmNoIGVxICdwcGMnKSB7CisJCSNjMDAwMjlmNDogICAgICAgOTQgMjEgZmYgMzAgICAgIHN0d3UgICAgcjEsLTIwOChyMSkKKwkJJHJlID0gcXIvLipzdHd1LipyMSwtKCR4ezEsOH0pXChyMVwpL287CisJfSBlbHNpZiAoJGFyY2ggZXEgJ3BwYzY0JykgeworCQkjWFhYCisJCSRyZSA9IHFyLy4qc3RkdS4qcjEsLSgkeHsxLDh9KVwocjFcKS9vOworCX0gZWxzaWYgKCRhcmNoIGVxICdwb3dlcnBjJykgeworCQkkcmUgPSBxci8uKnN0W2R3XXUuKnIxLC0oJHh7MSw4fSlcKHIxXCkvbzsKKwl9IGVsc2lmICgkYXJjaCA9fiAvXnMzOTB4PyQvKSB7CisJCSMgICAxMTE2MDogICAgICAgYTcgZmIgZmYgNjAgICAgICAgICAgICAgYWdoaSAgICVyMTUsLTE2MAorCQkkcmUgPSBxci8uKmFnP2hpLipcJXIxNSwtKChbMC05XXsyfXxbMy05XSlbMC05XXsyfSkvbzsKKwl9IGVsc2lmICgkYXJjaCA9fiAvXnNoNjQkLykgeworCQkjWFhYOiB3ZSBvbmx5IGNoZWNrIGZvciB0aGUgaW1tZWRpYXRlIGNhc2UgcHJlc2VudGx5LAorCQkjICAgICB0aG91Z2ggd2Ugd2lsbCB3YW50IHRvIGNoZWNrIGZvciB0aGUgbW92aS9zdWIKKwkJIyAgICAgcGFpciBmb3IgbGFyZ2VyIHVzZXJzLiAtLSBQRk0uCisJCSNhMDAwNDhlMDogICAgICAgZDRmYzQwZjAgICAgICAgIGFkZGkubCAgcjE1LC0yNDAscjE1CisJCSRyZSA9IHFyLy4qYWRkaVwubC4qcjE1LC0oKFswLTldezJ9fFszLTldKVswLTldezJ9KSxyMTUvbzsKKwl9IGVsc2UgeworCQlwcmludCgid3Jvbmcgb3IgdW5rbm93biBhcmNoaXRlY3R1cmVcbiIpOworCQlleGl0CisJfQorfQorCitzdWIgYnlzaXplKCQpIHsKKwlteSAoJGFzaXplLCAkYnNpemUpOworCSgkYXNpemUgPSAkYSkgPX4gcy8uKjoJKiguKikkLyQxLzsKKwkoJGJzaXplID0gJGIpID1+IHMvLio6CSooLiopJC8kMS87CisJJGJzaXplIDw9PiAkYXNpemUKK30KKworIworIyBtYWluKCkKKyMKK215ICRmdW5jcmUgPSBxci9eJHgqIDwoLiopPjokLzsKK215ICRmdW5jOworbXkgJGZpbGUsICRsYXN0c2xhc2g7CisKK3doaWxlIChteSAkbGluZSA9IDxTVERJTj4pIHsKKwlpZiAoJGxpbmUgPX4gbS8kZnVuY3JlLykgeworCQkkZnVuYyA9ICQxOworCX0KKwllbHNpZiAoJGxpbmUgPX4gbS8oLiopOlxzKmZpbGUgZm9ybWF0LykgeworCQkkZmlsZSA9ICQxOworCQkkZmlsZSA9fiBzL1wua28vLzsKKwkJJGxhc3RzbGFzaCA9IHJpbmRleCgkZmlsZSwgIi8iKTsKKwkJaWYgKCRsYXN0c2xhc2ggIT0gLTEpIHsKKwkJCSRmaWxlID0gc3Vic3RyKCRmaWxlLCAkbGFzdHNsYXNoICsgMSk7CisJCX0KKwl9CisJZWxzaWYgKCRsaW5lID1+IG0vJHJlLykgeworCQlteSAkc2l6ZSA9ICQxOworCQkkc2l6ZSA9IGhleCgkc2l6ZSkgaWYgKCRzaXplID1+IC9eMHgvKTsKKworCQlpZiAoJHNpemUgPiAweGYwMDAwMDAwKSB7CisJCQkkc2l6ZSA9IC0gJHNpemU7CisJCQkkc2l6ZSArPSAweDgwMDAwMDAwOworCQkJJHNpemUgKz0gMHg4MDAwMDAwMDsKKwkJfQorCQluZXh0IGlmICgkc2l6ZSA+IDB4MTAwMDAwMDApOworCisJCW5leHQgaWYgJGxpbmUgIX4gbS9eKCR4cyopLzsKKwkJbXkgJGFkZHIgPSAkMTsKKwkJJGFkZHIgPX4gcy8gLzAvZzsKKwkJJGFkZHIgPSAiMHgkYWRkciI7CisKKwkJIyBiYm94OiB3YXM6IG15ICRpbnRybyA9ICIkYWRkciAkZnVuYyBbJGZpbGVdOiI7CisJCW15ICRpbnRybyA9ICIkZnVuYyBbJGZpbGVdOiI7CisJCW15ICRwYWRsZW4gPSA1NiAtIGxlbmd0aCgkaW50cm8pOworCQl3aGlsZSAoJHBhZGxlbiA+IDApIHsKKwkJCSRpbnRybyAuPSAnCSc7CisJCQkkcGFkbGVuIC09IDg7CisJCX0KKwkJbmV4dCBpZiAoJHNpemUgPCAxMDApOworCQlwdXNoIEBzdGFjaywgIiRpbnRybyRzaXplXG4iOworCX0KK30KKworcHJpbnQgc29ydCBieXNpemUgQHN0YWNrOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jbGVhbnVwX3ByaW50ZjJwdXRzIGIvc2NyaXB0cy9jbGVhbnVwX3ByaW50ZjJwdXRzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAwMTkzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2NsZWFudXBfcHJpbnRmMnB1dHMKQEAgLTAsMCArMSw5IEBACisjIS9iaW4vc2gKKworIyBQcm9jZXNzZXMgY3VycmVudCBkaXJlY3RvcnkgcmVjdXJzaXZlbHk6CisjIHByaW50ZigiYWJjXG4iKSAtPiBwdXRzKCJhYmMiKS4gQmV3YXJlIG9mIGZwcmludGYgZXRjLi4uCisKKyMgQlRXLCBnY2MgNC4xLjIgYWxyZWFkeSBkb2VzIHRoZSBzYW1lISBDYW4ndCBiZWxpZXZlIGl0Li4uCisKK2dyZXAgLWxyICdwcmludGZcKFteJSVdKlxcbiJcKScgLiB8IGdyZXAgJy5bY2hdJCcgfCB4YXJncyAtbjEgXAorICAgIHNlZCAtZSAncy9cKFteQS1aYS16MC05X11cKXByaW50ZihcKCAqIlteJV0qXClcXG4iKS9cMXB1dHMoXDIiKS8nIC1pCmRpZmYgLS1naXQgYS9zY3JpcHRzL2VjaG8uYyBiL3NjcmlwdHMvZWNoby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMjA3YWUKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2VjaG8uYwpAQCAtMCwwICsxLDIzMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZWNobyBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveCAtIHVzZWQgYXMgYSBoZWxwZXIgZm9yIHRlc3RzdWl0ZS8qCisgKiBvbiBzeXN0ZW1zIGxhY2tpbmcgImVjaG8gLWVuIgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICoJVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgbm90aWNlIGlzIHJldGFpbmVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorICovCisKKy8qIEJCX0FVRElUIFNVU3YzIGNvbXBsaWFudCAtLSB1bmxlc3MgY29uZmlndXJlZCBhcyBmYW5jeSBlY2hvLiAqLworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA3OTA0OTc1L3V0aWxpdGllcy9lY2hvLmh0bWwgKi8KKworLyogTWFyIDE2LCAyMDAzICAgICAgTWFudWVsIE5vdm9hIElJSSAgIChtam4zQGNvZGVwb2V0Lm9yZykKKyAqCisgKiBCZWNhdXNlIG9mIGJlaGF2aW9yYWwgZGlmZmVyZW5jZXMsIGltcGxlbWVudGVkIGNvbmZpZ3VyYWJsZSBTVVN2MworICogb3IgJ2ZhbmN5JyBnbnUtaXNoIGJlaGF2aW9ycy4gIEFsc28sIHJlZHVjZWQgc2l6ZSBhbmQgZml4ZWQgYnVncy4KKyAqIDEpIEluIGhhbmRsaW5nICdcYycgZXNjYXBlLCB0aGUgcHJldmlvdXMgdmVyc2lvbiBvbmx5IHN1cHByZXNzZWQgdGhlCisgKiAgICAgdHJhaWxpbmcgbmV3bGluZS4gIFNVU3YzIHNwZWNpZmllcyBfbm9fIG91dHB1dCBhZnRlciAnXGMnLgorICogMikgU1VTdjMgc3BlY2lmaWVzIHRoYXQgb2N0YWwgZXNjYXBlcyBhcmUgb2YgdGhlIGZvcm0gXDB7I3sjeyN9fX0uCisgKiAgICBUaGUgcHJldmlvdXMgdmVyc2lvbiBkaWQgbm90IGFsbG93IDQtZGlnaXQgb2N0YWxzLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjZGVmaW5lIFdBTlRfSEVYX0VTQ0FQRVMgMQorCisvKiBVc3VhbCAidGhpcyBvbmx5IHdvcmtzIGZvciBhc2NpaSBjb21wYXRpYmxlIGVuY29kaW5ncyIgZGlzY2xhaW1lci4gKi8KKyN1bmRlZiBfdG9sb3dlcgorI2RlZmluZSBfdG9sb3dlcihYKSAoKFgpfCgoY2hhcikgMHgyMCkpCisKK3N0YXRpYyBjaGFyIGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlKGNvbnN0IGNoYXIgKipwdHIpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgY2hhcm1hcFtdID0geworCQknYScsICAnYicsICAnZicsICAnbicsICAncicsICAndCcsICAndicsICAnXFwnLCAwLAorCQknXGEnLCAnXGInLCAnXGYnLCAnXG4nLCAnXHInLCAnXHQnLCAnXHYnLCAnXFwnLCAnXFwnIH07CisKKwljb25zdCBjaGFyICpwOworCWNvbnN0IGNoYXIgKnE7CisJdW5zaWduZWQgaW50IG51bV9kaWdpdHM7CisJdW5zaWduZWQgaW50IHI7CisJdW5zaWduZWQgaW50IG47CisJdW5zaWduZWQgaW50IGQ7CisJdW5zaWduZWQgaW50IGJhc2U7CisKKwludW1fZGlnaXRzID0gbiA9IDA7CisJYmFzZSA9IDg7CisJcSA9ICpwdHI7CisKKyNpZmRlZiBXQU5UX0hFWF9FU0NBUEVTCisJaWYgKCpxID09ICd4JykgeworCQkrK3E7CisJCWJhc2UgPSAxNjsKKwkJKytudW1fZGlnaXRzOworCX0KKyNlbmRpZgorCisJZG8geworCQlkID0gKHVuc2lnbmVkIGNoYXIpKCpxKSAtICcwJzsKKyNpZmRlZiBXQU5UX0hFWF9FU0NBUEVTCisJCWlmIChkID49IDEwKSB7CisJCQlkID0gKHVuc2lnbmVkIGNoYXIpKF90b2xvd2VyKCpxKSkgLSAnYScgKyAxMDsKKwkJfQorI2VuZGlmCisKKwkJaWYgKGQgPj0gYmFzZSkgeworI2lmZGVmIFdBTlRfSEVYX0VTQ0FQRVMKKwkJCWlmICgoYmFzZSA9PSAxNikgJiYgKCEtLW51bV9kaWdpdHMpKSB7CisvKgkJCQlyZXR1cm4gJ1xcJzsgKi8KKwkJCQktLXE7CisJCQl9CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisKKwkJciA9IG4gKiBiYXNlICsgZDsKKwkJaWYgKHIgPiBVQ0hBUl9NQVgpIHsKKwkJCWJyZWFrOworCQl9CisKKwkJbiA9IHI7CisJCSsrcTsKKwl9IHdoaWxlICgrK251bV9kaWdpdHMgPCAzKTsKKworCWlmIChudW1fZGlnaXRzID09IDApIHsJLyogbW5lbW9uaWMgZXNjYXBlIHNlcXVlbmNlPyAqLworCQlwID0gY2hhcm1hcDsKKwkJZG8geworCQkJaWYgKCpwID09ICpxKSB7CisJCQkJcSsrOworCQkJCWJyZWFrOworCQkJfQorCQl9IHdoaWxlICgqKytwKTsKKwkJbiA9ICoocCArIChzaXplb2YoY2hhcm1hcCkvMikpOworCX0KKworCSpwdHIgPSBxOworCisJcmV0dXJuIChjaGFyKSBuOworfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICphcmc7CisJY29uc3QgY2hhciAqcDsKKwljaGFyIG5mbGFnID0gMTsKKwljaGFyIGVmbGFnID0gMDsKKworCS8qIFdlIG11c3QgY2hlY2sgdGhhdCBzdGRvdXQgaXMgbm90IGNsb3NlZC4gKi8KKwlpZiAoZHVwMigxLCAxKSAhPSAxKQorCQlyZXR1cm4gLTE7CisKKwl3aGlsZSAoMSkgeworCQlhcmcgPSAqKythcmd2OworCQlpZiAoIWFyZykKKwkJCWdvdG8gbmV3bGluZV9yZXQ7CisJCWlmICgqYXJnICE9ICctJykKKwkJCWJyZWFrOworCisJCS8qIElmIGl0IGFwcGVhcnMgdGhhdCB3ZSBhcmUgaGFuZGxpbmcgb3B0aW9ucywgdGhlbiBtYWtlIHN1cmUKKwkJICogdGhhdCBhbGwgb2YgdGhlIG9wdGlvbnMgc3BlY2lmaWVkIGFyZSBhY3R1YWxseSB2YWxpZC4KKwkJICogT3RoZXJ3aXNlLCB0aGUgc3RyaW5nIHNob3VsZCBqdXN0IGJlIGVjaG9lZC4KKwkJICovCisJCXAgPSBhcmcgKyAxOworCQlpZiAoISpwKQkvKiBBIHNpbmdsZSAnLScsIHNvIGVjaG8gaXQuICovCisJCQlnb3RvIGp1c3RfZWNobzsKKworCQlkbyB7CisJCQlpZiAoIXN0cnJjaHIoIm5lRSIsICpwKSkKKwkJCQlnb3RvIGp1c3RfZWNobzsKKwkJfSB3aGlsZSAoKisrcCk7CisKKwkJLyogQWxsIG9mIHRoZSBvcHRpb25zIGluIHRoaXMgYXJnIGFyZSB2YWxpZCwgc28gaGFuZGxlIHRoZW0uICovCisJCXAgPSBhcmcgKyAxOworCQlkbyB7CisJCQlpZiAoKnAgPT0gJ24nKQorCQkJCW5mbGFnID0gMDsKKwkJCWlmICgqcCA9PSAnZScpCisJCQkJZWZsYWcgPSAnXFwnOworCQl9IHdoaWxlICgqKytwKTsKKwl9CisganVzdF9lY2hvOgorCXdoaWxlICgxKSB7CisJCS8qIGFyZyBpcyBhbHJlYWR5ID09ICphcmd2IGFuZCBpc24ndCBOVUxMICovCisJCWludCBjOworCisJCWlmICghZWZsYWcpIHsKKwkJCS8qIG9wdGltaXphdGlvbiBmb3IgdmVyeSBjb21tb24gY2FzZSAqLworCQkJZnB1dHMoYXJnLCBzdGRvdXQpOworCQl9IGVsc2Ugd2hpbGUgKChjID0gKmFyZysrKSkgeworCQkJaWYgKGMgPT0gZWZsYWcpIHsJLyogQ2hlY2sgZm9yIGVzY2FwZSBzZXEuICovCisJCQkJaWYgKCphcmcgPT0gJ2MnKSB7CisJCQkJCS8qICdcYycgbWVhbnMgY2FuY2VsIG5ld2xpbmUgYW5kCisJCQkJCSAqIGlnbm9yZSBhbGwgc3Vic2VxdWVudCBjaGFycy4gKi8KKwkJCQkJZ290byByZXQ7CisJCQkJfQorCQkJCXsKKwkJCQkJLyogU2luY2UgU1VTdjMgbWFuZGF0ZXMgYSBmaXJzdCBkaWdpdCBvZiAwLCA0LWRpZ2l0IG9jdGFscworCQkJCQkqIG9mIHRoZSBmb3JtIFwwIyMjIGFyZSBhY2NlcHRlZC4gKi8KKwkJCQkJaWYgKCphcmcgPT0gJzAnKSB7CisJCQkJCQkvKiBOQjogZG9uJ3QgdHVybiAiLi4uXDAiIGludG8gIi4uLlwiICovCisJCQkJCQlpZiAoYXJnWzFdICYmICgodW5zaWduZWQgY2hhcikoYXJnWzFdKSAtICcwJykgPCA4KSB7CisJCQkJCQkJYXJnKys7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJLyogYmJfcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UgaGFuZGxlcyBOVUwgY29ycmVjdGx5CisJCQkJCSAqICgiLi4uXCIgY2FzZS4gKi8KKwkJCQkJYyA9IGJiX3Byb2Nlc3NfZXNjYXBlX3NlcXVlbmNlKCZhcmcpOworCQkJCX0KKwkJCX0KKwkJCXB1dGNoYXIoYyk7CisJCX0KKworCQlhcmcgPSAqKythcmd2OworCQlpZiAoIWFyZykKKwkJCWJyZWFrOworCQlwdXRjaGFyKCcgJyk7CisJfQorCisgbmV3bGluZV9yZXQ6CisJaWYgKG5mbGFnKSB7CisJCXB1dGNoYXIoJ1xuJyk7CisJfQorIHJldDoKKwlyZXR1cm4gZmZsdXNoKE5VTEwpOworfQorCisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk5MSwgMTk5MworICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIDxCU0QgQWR2ZXJ0aXNpbmcgQ2xhdXNlIG9taXR0ZWQgcGVyIHRoZSBKdWx5IDIyLCAxOTk5IGxpY2Vuc2luZyBjaGFuZ2UKKyAqICAgICAgICAgICAgICBmdHA6Ly9mdHAuY3MuYmVya2VsZXkuZWR1L3B1Yi80YnNkL1JFQURNRS5JbXB0LkxpY2Vuc2UuQ2hhbmdlPgorICoKKyAqICAgICAgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICoKKyAqICAgICAgQCgjKWVjaG8uYyAgICAgIDguMSAoQmVya2VsZXkpIDUvMzEvOTMKKyAqLwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9maW5kX2JhZF9jb21tb25fYnVmc2l6IGIvc2NyaXB0cy9maW5kX2JhZF9jb21tb25fYnVmc2l6Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU4MGNmNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2ZpbmRfYmFkX2NvbW1vbl9idWZzaXoKQEAgLTAsMCArMSwxMyBAQAorIyEvYmluL3NoCisKKyMgVGhpcyBzY3JpcHQgZmluZHMgYXBwbGV0cyB3aXRoIG11bHRpcGxlIHVzZXMgb2YgYmJfY29tbW9uX2J1ZnNpejEKKyMgKD09IHBvc3NpYmxlIGJ1Z3MpLgorIyBDdXJyZW50bHkgKDIwMDctMDYtMDQpIHJlcG9ydHMgMyBmYWxzZSBwb3NpdGl2ZXM6CisjIC4vY29yZXV0aWxzL2RpZmYuYzo3CisjIC4vbG9naW51dGlscy9nZXR0eS5jOjIKKyMgLi91dGlsLWxpbnV4L21vdW50LmM6NQorCitmaW5kIC1uYW1lICcqLmMnIFwKK3wgd2hpbGUgcmVhZCBuYW1lOyBkbworICAgIGdyZXAgLUhjIGJiX2NvbW1vbl9idWZzaXoxICIkbmFtZSIKK2RvbmUgfCBncmVwIC12ICc6WzAxXSQnCmRpZmYgLS1naXQgYS9zY3JpcHRzL2ZpbmRfc3RyYXlfY29tbW9uX3ZhcnMgYi9zY3JpcHRzL2ZpbmRfc3RyYXlfY29tbW9uX3ZhcnMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2EyNWQ3YQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZmluZF9zdHJheV9jb21tb25fdmFycwpAQCAtMCwwICsxLDEwIEBACisjIS9iaW4vc2gKKworIyBDb21tb24gdmFyaWFibGVzIGFyZSBlbHVzaXZlLCB0aGV5IGRvbid0IHNob3cgdXAgaW4gc2l6ZSBvdXRwdXQhCisjIFRoaXMgc2NyaXB0IHdpbGwgc2hvdyBhbGwgY29tbW9ucyBpbiAqLm8sIHNvcnRlZCBieSBzaXplCisKK2ZpbmQgISAtcGF0aCAnLi9zY3JpcHRzLyonIC1hICEgLW5hbWUgYnVpbHQtaW4ubyAtYSAtbmFtZSAnKi5vJyBcCit8IHdoaWxlIHJlYWQgbmFtZTsgZG8KKyAgICBiPWBiYXNlbmFtZSAiJG5hbWUiYAorICAgIG5tICIkbmFtZSIgfCBzZWQgInMvXi8kYjogLyIKK2RvbmUgfCBncmVwIC1pICcgYyAnIHwgc29ydCAtazIKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZmluZF9zdHJheV9lbXB0eV9saW5lcyBiL3NjcmlwdHMvZmluZF9zdHJheV9lbXB0eV9saW5lcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hYWUxOGY5Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9maW5kX3N0cmF5X2VtcHR5X2xpbmVzCkBAIC0wLDAgKzEsMTkgQEAKKyMhL2Jpbi9zaAorCitncmVwIC1uIC1CMSAtciAkJ15cdCp9JCcgLiB8IGdyZXAgLUExICcuW2NoXS1bMC05XSotJCcKK2dyZXAgLW4gLUExIC1yICQnXlx0KnskJyAuIHwgZ3JlcCAtQjEgJy5bY2hdLVswLTldKi0kJworIyBvciAobGVzcyBzdXJlZmlyZSBvbmVzKToKK2dyZXAgLW4gLUIxIC1yICQnXlx0Kn0nIC4gfCBncmVwIC1BMSAnLltjaF0tWzAtOV0qLSQnCitncmVwIC1uIC1BMSAtciAkJ15cdCp7JyAuIHwgZ3JlcCAtQjEgJy5bY2hdLVswLTldKi0kJworCisjIGZpbmQgdHJhaWxpbmcgZW1wdHkgbGluZXMKK2ZpbmQgLXR5cGUgZiB8IHdoaWxlIHJlYWQgZmlsZTsgZG8KKyAgICAgICAgdGVzdCB4IiRmaWxlIiA9IHgiIiAmJiBjb250aW51ZQorICAgICAgICB0YWlsIC1uMSAkZmlsZSB8IHdoaWxlIHJlYWQgbGFzdGxpbmUKKyAgICAgICAgZG8KKyAgICAgICAgICAjZWNobyAifCRmaWxlfCRsYXN0bGluZSIKKyAgICAgICAgICBpZiB0ZXN0IHgiJGxhc3RsaW5lIiA9IHgiIjsgdGhlbgorICAgICAgICAgICAgICAgIGVjaG8gIiRmaWxlIgorICAgICAgICAgIGZpCisgICAgICAgIGRvbmUKK2RvbmUKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZml4X3dzLnNoIGIvc2NyaXB0cy9maXhfd3Muc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTdjZjUyOQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZml4X3dzLnNoCkBAIC0wLDAgKzEsNzEgQEAKKyMhL2Jpbi9iYXNoCisjIFdoaXRlc3BhY2UgZml4ZXIKKyMgVXNhZ2U6IGZpeF93cyBbZGlyXS4uLgorCit0ZW1wPSIvdG1wL2ZpeF93cy4kJC4kUkFORE9NIgorCisjIFVzaW5nICQneHh4JyBiYXNoaXNtCitiZWdpbjhzcF90YWI9JCdzL14gICAgICAgIC9cdC8nCitiZWdpbmNoYXI3c3BfY2hhcnRhYj0kJ3MvXlxcKFteIFx0XVxcKSAgICAgICAvXFwxXHQvJwordGFiOHNwX3RhYnRhYj0kJ3MvXHQgICAgICAgIC9cdFx0L2cnCit0YWI4c3B0YWJfdGFidGFidGFiPSQncy9cdCAgICAgICAgXHQvXHRcdFx0L2cnCitiZWdpbjE3c3B0YWJfdGFiPSQncy9eIFxcezEsN1xcfVx0L1x0LycKK3RhYjE3c3B0YWJfdGFidGFiPSQncy9cdCBcXHsxLDdcXH1cdC9cdFx0L2cnCit0cmFpbGluZ3dzXz0kJ3MvWyBcdF0qJC8vJworCisjPmZpeF93cy5kaWZmCisKK2ZpbmQgIiRAIiAtdHlwZSBmIFwKK3wgd2hpbGUgcmVhZCBuYW1lOyBkbworICAgIHRlc3QgIllFUyIgPSAiJHtuYW1lLyouYnoyL1lFU30iICYmIGNvbnRpbnVlCisgICAgdGVzdCAiWUVTIiA9ICIke25hbWUvKi5nei9ZRVN9IiAmJiBjb250aW51ZQorICAgIHRlc3QgIllFUyIgPSAiJHtuYW1lLyoucG5nL1lFU30iICYmIGNvbnRpbnVlCisgICAgdGVzdCAiWUVTIiA9ICIke25hbWUvKi5naWYvWUVTfSIgJiYgY29udGludWUKKyAgICB0ZXN0ICJZRVMiID0gIiR7bmFtZS8qLmpwZy9ZRVN9IiAmJiBjb250aW51ZQorICAgIHRlc3QgIllFUyIgPSAiJHtuYW1lLyouZGlmZi9ZRVN9IiAmJiBjb250aW51ZQorICAgIHRlc3QgIllFUyIgPSAiJHtuYW1lLyoucGF0Y2gvWUVTfSIgJiYgY29udGludWUKKyAgICAjIHNoZWxsIHRlc3RzdWl0ZSBlbnRyaWVzIGFyZSBub3QgdG8gYmUgdG91Y2hlZCB0b28KKyAgICB0ZXN0ICJZRVMiID0gIiR7bmFtZS8qLnJpZ2h0L1lFU30iICYmIGNvbnRpbnVlCisKKyAgICBpZiB0ZXN0ICJZRVMiID0gIiR7bmFtZS8qLltjaHNTXS9ZRVN9IiBcCisJLW8gIllFUyIgPSAiJHtuYW1lLyouc2gvWUVTfSIgXAorCS1vICJZRVMiID0gIiR7bmFtZS8qLnR4dC9ZRVN9IiBcCisJLW8gIllFUyIgPSAiJHtuYW1lLyouaHRtbC9ZRVN9IiBcCisJLW8gIllFUyIgPSAiJHtuYW1lLyouaHRtL1lFU30iIFwKKwktbyAiWUVTIiA9ICIke25hbWUvKkNvbmZpZy5pbiovWUVTfSIgXAorICAgIDsgdGhlbgorICAgICMgTW9yZSBhZ2dyZXNzaXZlIHdoaXRlc3BhY2UgZml4ZXMgZm9yIGtub3duIGZpbGUgdHlwZXMKKwllY2hvICJGb3JtYXR0aW5nOiAkbmFtZSIgPiYyCisJY2F0ICIkbmFtZSIgXAorCXwgc2VkIC1lICIkdGFiOHNwdGFiX3RhYnRhYnRhYiIgLWUgIiR0YWI4c3B0YWJfdGFidGFidGFiIiBcCisJICAgICAgLWUgIiR0YWI4c3B0YWJfdGFidGFidGFiIiAtZSAiJHRhYjhzcHRhYl90YWJ0YWJ0YWIiIFwKKwl8IHNlZCAiJGJlZ2luMTdzcHRhYl90YWIiIFwKKwl8IHNlZCAtZSAiJHRhYjE3c3B0YWJfdGFidGFiIiAtZSAiJHRhYjE3c3B0YWJfdGFidGFiIiBcCisJICAgICAgLWUgIiR0YWIxN3NwdGFiX3RhYnRhYiIgLWUgIiR0YWIxN3NwdGFiX3RhYnRhYiIgXAorCSAgICAgIC1lICIkdGFiMTdzcHRhYl90YWJ0YWIiIC1lICIkdGFiMTdzcHRhYl90YWJ0YWIiIFwKKwl8IHNlZCAiJHRyYWlsaW5nd3NfIgorICAgIGVsaWYgdGVzdCAiWUVTIiA9ICIke25hbWUvKk1ha2VmaWxlKi9ZRVN9IiBcCisJLW8gIllFUyIgPSAiJHtuYW1lLypLYnVpbGQqL1lFU30iIFwKKyAgICA7IHRoZW4KKyAgICAjIEZvciBNYWtlZmlsZXMsIG5ldmVyIGNvbnZlcnQgIjEtN3NwYWNlcyt0YWIiIGludG8gInRhYnRhYiIKKwllY2hvICJNYWtlZmlsZTogJG5hbWUiID4mMgorCWNhdCAiJG5hbWUiIFwKKwl8IHNlZCAtZSAiJHRhYjhzcHRhYl90YWJ0YWJ0YWIiIC1lICIkdGFiOHNwdGFiX3RhYnRhYnRhYiIgXAorCSAgICAgIC1lICIkdGFiOHNwdGFiX3RhYnRhYnRhYiIgLWUgIiR0YWI4c3B0YWJfdGFidGFidGFiIiBcCisJfCBzZWQgLWUgIiR0YWIxN3NwdGFiX3RhYnRhYiIgLWUgIiR0YWIxN3NwdGFiX3RhYnRhYiIgXAorCSAgICAgIC1lICIkdGFiMTdzcHRhYl90YWJ0YWIiIC1lICIkdGFiMTdzcHRhYl90YWJ0YWIiIFwKKwkgICAgICAtZSAiJHRhYjE3c3B0YWJfdGFidGFiIiAtZSAiJHRhYjE3c3B0YWJfdGFidGFiIiBcCisJfCBzZWQgIiR0cmFpbGluZ3dzXyIKKyAgICBlbHNlCisgICAgIyBPbmx5IHJlbW92ZSB0cmFpbGluZyBXUyBmb3IgdGhlIHJlc3QKKwllY2hvICJSZW1vdmluZyB0cmFpbGluZyB3aGl0ZXNwYWNlOiAkbmFtZSIgPiYyCisJY2F0ICIkbmFtZSIgXAorCXwgc2VkICIkdHJhaWxpbmd3c18iCisgICAgZmkgPiIkdGVtcCIKKworIyAgICBkaWZmIC11ICIkdGVtcCIgIiRuYW1lIiA+PmZpeF93cy5kaWZmCisKKyAgICAjIENvbnNlcnZlIG1vZGUvc3ltbGluazoKKyAgICBjYXQgIiR0ZW1wIiA+IiRuYW1lIgorZG9uZQorcm0gIiR0ZW1wIiAyPi9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nY2MtdmVyc2lvbi5zaCBiL3NjcmlwdHMvZ2NjLXZlcnNpb24uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzQ1MTA4MAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZ2NjLXZlcnNpb24uc2gKQEAgLTAsMCArMSwxMiBAQAorIyEvYmluL3NoCisjCisjIGdjYy12ZXJzaW9uIGdjYy1jb21tYW5kCisjCisjIFByaW50cyB0aGUgZ2NjIHZlcnNpb24gb2YgYGdjYy1jb21tYW5kJyBpbiBhIGNhbm9uaWNhbCA0LWRpZ2l0IGZvcm0KKyMgc3VjaCBhcyBgMDI5NScgZm9yIGdjYy0yLjk1LCBgMDMwMycgZm9yIGdjYy0zLjMsIGV0Yy4KKyMKKworY29tcGlsZXI9IiQqIgorCitNQUpfTUlOPSQoZWNobyBfX0dOVUNfXyBfX0dOVUNfTUlOT1JfXyB8ICRjb21waWxlciAtRSAteGMgLSB8IHRhaWwgLW4gMSkKK3ByaW50ZiAnJTAyZCUwMmRcbicgJE1BSl9NSU4KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2VuX2J1aWxkX2ZpbGVzLnNoIGIvc2NyaXB0cy9nZW5fYnVpbGRfZmlsZXMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWJlZTE3YwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZ2VuX2J1aWxkX2ZpbGVzLnNoCkBAIC0wLDAgKzEsMTAyIEBACisjIS9iaW4vc2gKKworIyBOb3RlOiB3YXMgdXNpbmcgc2VkIE9QVFMgQ01EIC0tIEZJTEVTCisjIGJ1dCB1c2VycyBjb21wbGFpbiB0aGF0IG1hbnkgc2VkIGltcGxlbWVudGF0aW9ucworIyBhcmUgbWlzaW50ZXJwcmV0aW5nIC0tLgorCit0ZXN0ICQjIC1nZSAyIHx8IHsgZWNobyAiU3ludGF4OiAkMCBTUkNUUkVFIE9CSlRSRUUiOyBleGl0IDE7IH0KKworIyBjZCB0byBvYmp0cmVlCitjZCAtLSAiJDIiIHx8IHsgZWNobyAiU3ludGF4OiAkMCBTUkNUUkVFIE9CSlRSRUUiOyBleGl0IDE7IH0KKyMgSW4gc2VwYXJhdGUgb2JqdHJlZSBidWlsZCwgaW5jbHVkZS8gbWlnaHQgbm90IGV4aXN0IHlldAorbWtkaXIgaW5jbHVkZSAyPi9kZXYvbnVsbAorCitzcmN0cmVlPSIkMSIKKworc3RhdHVzKCkgeyBwcmludGYgJyAgJS04cyVzXG4nICIkMSIgIiQyIjsgfQorZ2VuKCkgeyBzdGF0dXMgIkdFTiIgIiRAIjsgfQorY2hrKCkgeyBzdGF0dXMgIkNISyIgIiRAIjsgfQorCitnZW5lcmF0ZSgpCit7CisJIyBOQjogZGF0YSB0byBiZSBpbnNlcnRlZCBhdCBJTlNFUlQgbGluZSBpcyBjb21pbmcgb24gc3RkaW4KKwlsb2NhbCBzcmM9IiQxIiBkc3Q9IiQyIiBoZWFkZXI9IiQzIgorCSNjaGsgIiR7ZHN0fSIKKwl7CisJCSMgTmVlZCB0byB1c2UgcHJpbnRmOiBkaWZmZXJlbnQgc2hlbGxzIGhhdmUgaW5jb25zaXN0ZW50CisJCSMgcnVsZXMgcmUgaGFuZGxpbmcgb2YgIlxuIiBpbiBlY2hvIHBhcmFtcy4KKwkJcHJpbnRmICIlc1xuIiAiJHtoZWFkZXJ9IgorCQkjIHByaW50IGV2ZXJ5dGhpbmcgdXAgdG8gSU5TRVJUIGxpbmUKKwkJc2VkIC1uICcvXklOU0VSVCQvIHE7IHAnICIke3NyY30iCisJCSMgY29weSBzdGRpbiB0byBzdGRvdXQKKwkJY2F0CisJCSMgcHJpbnQgZXZlcnl0aGluZyBhZnRlciBJTlNFUlQgbGluZQorCQlzZWQgLW4gJy9eSU5TRVJUJC8geworCQk6bAorCQkgICAgbgorCQkgICAgcAorCQkgICAgYmwKKwkJfScgIiR7c3JjfSIKKwl9ID4iJHtkc3R9LnRtcCIKKwlpZiAhIGNtcCAtcyAiJHtkc3R9IiAiJHtkc3R9LnRtcCI7IHRoZW4KKwkJZ2VuICIke2RzdH0iCisJCW12ICIke2RzdH0udG1wIiAiJHtkc3R9IgorCWVsc2UKKwkJcm0gLWYgIiR7ZHN0fS50bXAiCisJZmkKK30KKworIyAoUmUpZ2VuZXJhdGUgaW5jbHVkZS9hcHBsZXRzLmgKK3NlZCAtbiAnc0BeLy9hcHBsZXQ6QEBwJyAiJHNyY3RyZWUiLyovKi5jICIkc3JjdHJlZSIvKi8qLyouYyBcCit8IGdlbmVyYXRlIFwKKwkiJHNyY3RyZWUvaW5jbHVkZS9hcHBsZXRzLnNyYy5oIiBcCisJImluY2x1ZGUvYXBwbGV0cy5oIiBcCisJIi8qIERPIE5PVCBFRElULiBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGZyb20gYXBwbGV0cy5zcmMuaCAqLyIKKworIyAoUmUpZ2VuZXJhdGUgaW5jbHVkZS91c2FnZS5oCisjIFdlIGFkZCBsaW5lIGNvbnRpbnVhdGlvbiBiYWNrc2xhc2ggYWZ0ZXIgZWFjaCBsaW5lLAorIyBhbmQgaW5zZXJ0IGVtcHR5IGxpbmUgYmVmb3JlIGVhY2ggbGluZSB3aGljaCBkb2Vzbid0IHN0YXJ0CisjIHdpdGggc3BhY2Ugb3IgdGFiCitUQUI9IiQocHJpbnRmICdcdFgnKSIKK1RBQj0iJHtUQUIlWH0iCitMRj0iJChwcmludGYgJ1xuWCcpIgorTEY9IiR7TEYlWH0iCitzZWQgLW4gLWUgJ3NAXi8vdXNhZ2U6XChbICciJFRBQiInXS4qXCkkQFwxIFxcQHAnIFwKKyAgICAgICAtZSAnc0BeLy91c2FnZTpcKFteICciJFRBQiInXS4qXCkkQFwnIiRMRiInXDEgXFxAcCcgXAorCSIkc3JjdHJlZSIvKi8qLmMgIiRzcmN0cmVlIi8qLyovKi5jIFwKK3wgZ2VuZXJhdGUgXAorCSIkc3JjdHJlZS9pbmNsdWRlL3VzYWdlLnNyYy5oIiBcCisJImluY2x1ZGUvdXNhZ2UuaCIgXAorCSIvKiBETyBOT1QgRURJVC4gVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIHVzYWdlLnNyYy5oICovIgorCisjIChSZSlnZW5lcmF0ZSAqL0tidWlsZCBhbmQgKi9Db25maWcuaW4KKyMgV2Ugc2tpcCAuZG90ZGlycyAtIG1ha2VzIGdpdC9zdm4vZXRjIHVzZXJzIGhhcHBpZXIKK3sgY2QgLS0gIiRzcmN0cmVlIiAmJiBmaW5kIC4gLXR5cGUgZCAhICcoJyAtbmFtZSAnLj8qJyAtcHJ1bmUgJyknOyB9IFwKK3wgd2hpbGUgcmVhZCAtciBkOyBkbworCWQ9IiR7ZCMuL30iCisKKwlzcmM9IiRzcmN0cmVlLyRkL0tidWlsZC5zcmMiCisJZHN0PSIkZC9LYnVpbGQiCisJaWYgdGVzdCAtZiAiJHNyYyI7IHRoZW4KKwkJbWtkaXIgLXAgLS0gIiRkIiAyPi9kZXYvbnVsbAorCisJCXNlZCAtbiAnc0BeLy9rYnVpbGQ6QEBwJyAiJHNyY3RyZWUvJGQiLyouYyBcCisJCXwgZ2VuZXJhdGUgXAorCQkJIiR7c3JjfSIgIiR7ZHN0fSIgXAorCQkJIiMgRE8gTk9UIEVESVQuIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSBLYnVpbGQuc3JjIgorCWZpCisKKwlzcmM9IiRzcmN0cmVlLyRkL0NvbmZpZy5zcmMiCisJZHN0PSIkZC9Db25maWcuaW4iCisJaWYgdGVzdCAtZiAiJHNyYyI7IHRoZW4KKwkJbWtkaXIgLXAgLS0gIiRkIiAyPi9kZXYvbnVsbAorCisJCXNlZCAtbiAnc0BeLy9jb25maWc6QEBwJyAiJHNyY3RyZWUvJGQiLyouYyBcCisJCXwgZ2VuZXJhdGUgXAorCQkJIiR7c3JjfSIgIiR7ZHN0fSIgXAorCQkJIiMgRE8gTk9UIEVESVQuIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgZnJvbSBDb25maWcuc3JjIgorCWZpCitkb25lCisKKyMgTGFzdCByZWFkIGZhaWxlZC4gVGhpcyBpcyBub3JtYWwuIERvbid0IGV4aXQgd2l0aCBpdHMgZXJyb3IgY29kZToKK2V4aXQgMApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlIGIvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YmFlODAKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvTWFrZWZpbGUKQEAgLTAsMCArMSwyNzEgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEtlcm5lbCBjb25maWd1cmF0aW9uIHRhcmdldHMKKyMgVGhlc2UgdGFyZ2V0cyBhcmUgdXNlZCBmcm9tIHRvcC1sZXZlbCBtYWtlZmlsZQorCitQSE9OWSArPSBvbGRjb25maWcgeGNvbmZpZyBnY29uZmlnIG1lbnVjb25maWcgY29uZmlnIHNpbGVudG9sZGNvbmZpZyB1cGRhdGUtcG8tY29uZmlnCisKK3hjb25maWc6ICQob2JqKS9xY29uZgorCSQ8IENvbmZpZy5pbgorCitnY29uZmlnOiAkKG9iaikvZ2NvbmYKKwkkPCBDb25maWcuaW4KKworbWVudWNvbmZpZzogJChvYmopL21jb25mCisJJChRKSQoTUFLRSkgJChidWlsZCk9c2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nCisJJDwgQ29uZmlnLmluCisKK2NvbmZpZzogJChvYmopL2NvbmYKKwkkPCBDb25maWcuaW4KKworIyBNdGltZSBncmFudWxhcml0eSBwcm9ibGVtLgorIyBJdCB3YXMgb2JzZXJ2ZWQgdGhhdCB0aGVzZSBjb21tYW5kczoKKyMgbWFrZSBhbGxub2NvbmZpZzsgc2VkIC1pIC1lICcvQ09ORklHX1RSVUUvcy8uKi9DT05GSUdfVFJVRT15LycgLmNvbmZpZzsgbWFrZQorIyBzb21ldGltZXMgcHJvZHVjZSBidXN5Ym94IHdpdGggInRydWUiIGFwcGxldCBzdGlsbCBkaXNhYmxlZC4KKyMgVGhpcyBpcyBjYXVzZWQgYnkgLmNvbmZpZyB1cGRhdGVkIGJ5IHNlZCBoYXZpbmcgbXRpbWUgd2hpY2ggaXMgc3RpbGwKKyMgZXF1YWwgdG8gKG5vdCBiaWdnZXIgdGhhbikgaW5jbHVkZS9hdXRvY29uZi5oJ3MgbXRpbWUsCisjIGFuZCB0aHVzIDJuZCBtYWtlIGRvZXMgbm90IHJlZ2VuZXJhdGUgaW5jbHVkZS9hdXRvY29uZi5oLgorIyBXYWl0aW5nIGZvciAxIHNlY29uZCBhZnRlciBub24taW50ZXJhY3RpdmUgIm1ha2UgWFhYWGNvbmZpZyIKKyMgcHJldmVudHMgdGhpcyBmcm9tIGhhcHBlbmluZy4KKyMKKyMgV2UnZCBsaWtlIHRvIGRldGVjdCB3aGV0aGVyIGZpbGVzeXN0ZW0gd2UgYXJlIG9uIGhhcyBjb2Fyc2UgbXRpbWVzLAorIyBidXQgY2FuJ3QgZG8gaXQgeWV0LCBiYm94IGxzIGhhc24ndCBnb3QgLS1mdWxsLXRpbWUuCisjTVRJTUVfSVNfQ09BUlNFOj1AbHMgLS1mdWxsLXRpbWUgLWxkIHwgZ3JlcCAtRiAuMDAwID4vZGV2L251bGwKK01USU1FX0lTX0NPQVJTRTo9QHRydWUKKworb2xkY29uZmlnOiAkKG9iaikvY29uZgorCSQ8IC1vIENvbmZpZy5pbgorCSQoTVRJTUVfSVNfQ09BUlNFKSAmJiBzbGVlcCAxCisKK3NpbGVudG9sZGNvbmZpZzogJChvYmopL2NvbmYKKwkkPCAtcyBDb25maWcuaW4KKwkkKE1USU1FX0lTX0NPQVJTRSkgJiYgc2xlZXAgMQorCit1cGRhdGUtcG8tY29uZmlnOiAkKG9iaikva3hnZXR0ZXh0CisJeGdldHRleHQgLS1kZWZhdWx0LWRvbWFpbj1saW51eCBcCisgICAgICAgICAgLS1hZGQtY29tbWVudHMgLS1rZXl3b3JkPV8gLS1rZXl3b3JkPU5fIFwKKyAgICAgICAgICAtLWZpbGVzLWZyb209c2NyaXB0cy9rY29uZmlnL1BPVEZJTEVTLmluIFwKKyAgICAgICAgICAtLW91dHB1dCBzY3JpcHRzL2tjb25maWcvY29uZmlnLnBvdAorCSQoUSlsbiAtZnMgS2NvbmZpZ19pMzg2IGFyY2gvdW0vS2NvbmZpZ19hcmNoCisJJChRKWZvciBpIGluIGBscyBhcmNoL2A7IFwKKwlkbyBcCisJICBzY3JpcHRzL2tjb25maWcva3hnZXR0ZXh0IGFyY2gvJCRpL0tjb25maWcgXAorCSAgICB8IG1zZ3VuaXEgLW8gc2NyaXB0cy9rY29uZmlnL2xpbnV4XyQke2l9LnBvdDsgXAorCWRvbmUKKwkkKFEpbXNnY2F0IHNjcmlwdHMva2NvbmZpZy9jb25maWcucG90IFwKKwkgIGBmaW5kIHNjcmlwdHMva2NvbmZpZy8gLXR5cGUgZiAtbmFtZSBsaW51eF8qLnBvdGAgXAorCSAgLS1vdXRwdXQgc2NyaXB0cy9rY29uZmlnL2xpbnV4X3Jhdy5wb3QKKwkkKFEpbXNndW5pcSAtLXNvcnQtYnktZmlsZSBzY3JpcHRzL2tjb25maWcvbGludXhfcmF3LnBvdCBcCisJICAgIC0tb3V0cHV0IHNjcmlwdHMva2NvbmZpZy9saW51eC5wb3QKKwkkKFEpcm0gLWYgYXJjaC91bS9LY29uZmlnX2FyY2gKKwkkKFEpcm0gLWYgc2NyaXB0cy9rY29uZmlnL2xpbnV4XyoucG90IHNjcmlwdHMva2NvbmZpZy9jb25maWcucG90CisKK1BIT05ZICs9IHJhbmRjb25maWcgYWxseWVzY29uZmlnIGFsbG5vY29uZmlnIGFsbG1vZGNvbmZpZyBkZWZjb25maWcKKworcmFuZGNvbmZpZzogJChvYmopL2NvbmYKKwkkPCAtciBDb25maWcuaW4KKwkkKE1USU1FX0lTX0NPQVJTRSkgJiYgc2xlZXAgMQorCithbGx5ZXNjb25maWc6ICQob2JqKS9jb25mCisJJDwgLXkgQ29uZmlnLmluCisJJChNVElNRV9JU19DT0FSU0UpICYmIHNsZWVwIDEKKworYWxsbm9jb25maWc6ICQob2JqKS9jb25mCisJJDwgLW4gQ29uZmlnLmluCisJJChNVElNRV9JU19DT0FSU0UpICYmIHNsZWVwIDEKKworYWxsbW9kY29uZmlnOiAkKG9iaikvY29uZgorCSQ8IC1tIENvbmZpZy5pbgorCSQoTVRJTUVfSVNfQ09BUlNFKSAmJiBzbGVlcCAxCisKK2RlZmNvbmZpZzogJChvYmopL2NvbmYKK2lmZXEgKCQoS0JVSUxEX0RFRkNPTkZJRyksKQorCSQ8IC1kIENvbmZpZy5pbgorZWxzZQorCUBlY2hvICoqKiBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gaXMgYmFzZWQgb24gJyQoS0JVSUxEX0RFRkNPTkZJRyknCisJJChRKSQ8IC1EICQoS0JVSUxEX0RFRkNPTkZJRykgQ29uZmlnLmluCitlbmRpZgorCSQoTVRJTUVfSVNfQ09BUlNFKSAmJiBzbGVlcCAxCisKKyVfZGVmY29uZmlnOiAkKG9iaikvY29uZgorCSQoUSkkPCAtRCBjb25maWdzLyRAIENvbmZpZy5pbgorCSQoTVRJTUVfSVNfQ09BUlNFKSAmJiBzbGVlcCAxCisKKyMgSGVscCB0ZXh0IHVzZWQgYnkgbWFrZSBoZWxwCitoZWxwOgorCUBlY2hvICAnICBjb25maWcJICAtIFVwZGF0ZSBjdXJyZW50IGNvbmZpZyB1dGlsaXNpbmcgYSBsaW5lLW9yaWVudGVkIHByb2dyYW0nCisJQGVjaG8gICcgIG1lbnVjb25maWcJICAtIFVwZGF0ZSBjdXJyZW50IGNvbmZpZyB1dGlsaXNpbmcgYSBtZW51IGJhc2VkIHByb2dyYW0nCisJQGVjaG8gICcgIHhjb25maWcJICAtIFVwZGF0ZSBjdXJyZW50IGNvbmZpZyB1dGlsaXNpbmcgYSBRVCBiYXNlZCBmcm9udC1lbmQnCisJQGVjaG8gICcgIGdjb25maWcJICAtIFVwZGF0ZSBjdXJyZW50IGNvbmZpZyB1dGlsaXNpbmcgYSBHVEsgYmFzZWQgZnJvbnQtZW5kJworCUBlY2hvICAnICBvbGRjb25maWcJICAtIFVwZGF0ZSBjdXJyZW50IGNvbmZpZyB1dGlsaXNpbmcgYSBwcm92aWRlZCAuY29uZmlnIGFzIGJhc2UnCisJQGVjaG8gICcgIHJhbmRjb25maWcJICAtIE5ldyBjb25maWcgd2l0aCByYW5kb20gYW5zd2VyIHRvIGFsbCBvcHRpb25zJworCUBlY2hvICAnICBkZWZjb25maWcJICAtIE5ldyBjb25maWcgd2l0aCBkZWZhdWx0IGFuc3dlciB0byBhbGwgb3B0aW9ucycKKwlAZWNobyAgJyAgYWxsbW9kY29uZmlnCSAgLSBOZXcgY29uZmlnIHNlbGVjdGluZyBtb2R1bGVzIHdoZW4gcG9zc2libGUnCisJQGVjaG8gICcgIGFsbHllc2NvbmZpZwkgIC0gTmV3IGNvbmZpZyB3aGVyZSBhbGwgb3B0aW9ucyBhcmUgYWNjZXB0ZWQgd2l0aCB5ZXMnCisJQGVjaG8gICcgIGFsbG5vY29uZmlnCSAgLSBOZXcgY29uZmlnIHdoZXJlIGFsbCBvcHRpb25zIGFyZSBhbnN3ZXJlZCB3aXRoIG5vJworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBTaGFyZWQgTWFrZWZpbGUgZm9yIHRoZSB2YXJpb3VzIGtjb25maWcgZXhlY3V0YWJsZXM6CisjIGNvbmY6CSAgVXNlZCBmb3IgZGVmY29uZmlnLCBvbGRjb25maWcgYW5kIHJlbGF0ZWQgdGFyZ2V0cworIyBtY29uZjogIFVzZWQgZm9yIHRoZSBtY29uZmlnIHRhcmdldC4KKyMgICAgICAgICBVdGlsaXplcyB0aGUgbHhkaWFsb2cgcGFja2FnZQorIyBxY29uZjogIFVzZWQgZm9yIHRoZSB4Y29uZmlnIHRhcmdldAorIyAgICAgICAgIEJhc2VkIG9uIFFUIHdoaWNoIG5lZWRzIHRvIGJlIGluc3RhbGxlZCB0byBjb21waWxlIGl0CisjIGdjb25mOiAgVXNlZCBmb3IgdGhlIGdjb25maWcgdGFyZ2V0CisjICAgICAgICAgQmFzZWQgb24gR1RLIHdoaWNoIG5lZWRzIHRvIGJlIGluc3RhbGxlZCB0byBjb21waWxlIGl0CisjIG9iamVjdCBmaWxlcyB1c2VkIGJ5IGFsbCBrY29uZmlnIGZsYXZvdXJzCisKK2hvc3Rwcm9ncy15CTo9IGNvbmYgbWNvbmYgcWNvbmYgZ2NvbmYga3hnZXR0ZXh0Citjb25mLW9ianMJOj0gY29uZi5vICB6Y29uZi50YWIubworbWNvbmYtb2Jqcwk6PSBtY29uZi5vIHpjb25mLnRhYi5vCitreGdldHRleHQtb2Jqcwk6PSBreGdldHRleHQubyB6Y29uZi50YWIubworCitpZmVxICgkKE1BS0VDTURHT0FMUykseGNvbmZpZykKKwlxY29uZi10YXJnZXQgOj0gMQorZW5kaWYKK2lmZXEgKCQoTUFLRUNNREdPQUxTKSxnY29uZmlnKQorCWdjb25mLXRhcmdldCA6PSAxCitlbmRpZgorCisKK2lmZXEgKCQocWNvbmYtdGFyZ2V0KSwxKQorcWNvbmYtY3h4b2Jqcwk6PSBxY29uZi5vCitxY29uZi1vYmpzCTo9IGtjb25maWdfbG9hZC5vIHpjb25mLnRhYi5vCitlbmRpZgorCitpZmVxICgkKGdjb25mLXRhcmdldCksMSkKK2djb25mLW9ianMJOj0gZ2NvbmYubyBrY29uZmlnX2xvYWQubyB6Y29uZi50YWIubworZW5kaWYKKworY2xlYW4tZmlsZXMJOj0gbGtjX2RlZnMuaCBxY29uZi5tb2MgLnRtcF9xdGNoZWNrIFwKKwkJICAgLnRtcF9ndGtjaGVjayB6Y29uZi50YWIuYyBsZXguemNvbmYuYyB6Y29uZi5oYXNoLmMKK3N1YmRpci0gKz0gbHhkaWFsb2cKKworIyBBZGQgZW52aXJvbm1lbnQgc3BlY2lmaWMgZmxhZ3MKK0hPU1RfRVhUUkFDRkxBR1MgKz0gJChzaGVsbCAkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS8kKHNyYykvY2hlY2suc2ggJChIT1NUQ0MpICQoSE9TVENGTEFHUykpCisKKyMgZ2VuZXJhdGVkIGZpbGVzIHNlZW0gdG8gbmVlZCB0aGlzIHRvIGZpbmQgbG9jYWwgaW5jbHVkZSBmaWxlcworSE9TVENGTEFHU19sZXguemNvbmYubwk6PSAtSSQoc3JjKQorSE9TVENGTEFHU196Y29uZi50YWIubwk6PSAtSSQoc3JjKQorCitIT1NUTE9BRExJQkVTX3Fjb25mCT0gJChLQ19RVF9MSUJTKSAtbGRsCitIT1NUQ1hYRkxBR1NfcWNvbmYubwk9ICQoS0NfUVRfQ0ZMQUdTKSAtRCBMS0NfRElSRUNUX0xJTksKKworSE9TVExPQURMSUJFU19nY29uZgk9IGBwa2ctY29uZmlnIC0tbGlicyBndGsrLTIuMCBnbW9kdWxlLTIuMCBsaWJnbGFkZS0yLjBgIC1sZGwKK0hPU1RDRkxBR1NfZ2NvbmYubwk9IGBwa2ctY29uZmlnIC0tY2ZsYWdzIGd0aystMi4wIGdtb2R1bGUtMi4wIGxpYmdsYWRlLTIuMGAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAtRCBMS0NfRElSRUNUX0xJTksKKworJChvYmopL3Fjb25mLm86ICQob2JqKS8udG1wX3F0Y2hlY2sKKworaWZlcSAoJChxY29uZi10YXJnZXQpLDEpCiskKG9iaikvLnRtcF9xdGNoZWNrOiAkKHNyYykvTWFrZWZpbGUKKy1pbmNsdWRlICQob2JqKS8udG1wX3F0Y2hlY2sKKworIyBRVCBuZWVkcyBzb21lIGV4dHJhIGVmZm9ydC4uLgorJChvYmopLy50bXBfcXRjaGVjazoKKwlAc2V0IC1lOyBlY2hvICIgIENIRUNLICAgcXQiOyBkaXI9IiI7IHBrZz0iIjsgXAorCXBrZy1jb25maWcgLS1leGlzdHMgcXQgMj4gL2Rldi9udWxsICYmIHBrZz1xdDsgXAorCXBrZy1jb25maWcgLS1leGlzdHMgcXQtbXQgMj4gL2Rldi9udWxsICYmIHBrZz1xdC1tdDsgXAorCWlmIFsgLW4gIiQkcGtnIiBdOyB0aGVuIFwKKwkgIGNmbGFncz0iXCQkKHNoZWxsIHBrZy1jb25maWcgJCRwa2cgLS1jZmxhZ3MpIjsgXAorCSAgbGlicz0iXCQkKHNoZWxsIHBrZy1jb25maWcgJCRwa2cgLS1saWJzKSI7IFwKKwkgIG1vYz0iXCQkKHNoZWxsIHBrZy1jb25maWcgJCRwa2cgLS12YXJpYWJsZT1wcmVmaXgpL2Jpbi9tb2MiOyBcCisJICBkaXI9IiQkKHBrZy1jb25maWcgJCRwa2cgLS12YXJpYWJsZT1wcmVmaXgpIjsgXAorCWVsc2UgXAorCSAgZm9yIGQgaW4gJCRRVERJUiAvdXNyL3NoYXJlL3F0KiAvdXNyL2xpYi9xdCo7IGRvIFwKKwkgICAgaWYgWyAtZiAkJGQvaW5jbHVkZS9xY29uZmlnLmggXTsgdGhlbiBkaXI9JCRkOyBicmVhazsgZmk7IFwKKwkgIGRvbmU7IFwKKwkgIGlmIFsgLXogIiQkZGlyIiBdOyB0aGVuIFwKKwkgICAgZWNobyAiKiI7IFwKKwkgICAgZWNobyAiKiBVbmFibGUgdG8gZmluZCB0aGUgUVQgaW5zdGFsbGF0aW9uLiBQbGVhc2UgbWFrZSBzdXJlIHRoYXQiOyBcCisJICAgIGVjaG8gIiogdGhlIFFUIGRldmVsb3BtZW50IHBhY2thZ2UgaXMgY29ycmVjdGx5IGluc3RhbGxlZCBhbmQiOyBcCisJICAgIGVjaG8gIiogZWl0aGVyIGluc3RhbGwgcGtnLWNvbmZpZyBvciBzZXQgdGhlIFFURElSIGVudmlyb25tZW50IjsgXAorCSAgICBlY2hvICIqIHZhcmlhYmxlIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uLiI7IFwKKwkgICAgZWNobyAiKiI7IFwKKwkgICAgZmFsc2U7IFwKKwkgIGZpOyBcCisJICBsaWJwYXRoPSQkZGlyL2xpYjsgbGliPXF0OyBvc2Rpcj0iIjsgXAorCSAgJChIT1NUQ1hYKSAtcHJpbnQtbXVsdGktb3MtZGlyZWN0b3J5ID4gL2Rldi9udWxsIDI+JjEgJiYgXAorCSAgICBvc2Rpcj14JCQoJChIT1NUQ1hYKSAtcHJpbnQtbXVsdGktb3MtZGlyZWN0b3J5KTsgXAorCSAgdGVzdCAtZCAkJGxpYnBhdGgvJCRvc2RpciAmJiBsaWJwYXRoPSQkbGlicGF0aC8kJG9zZGlyOyBcCisJICB0ZXN0IC1mICQkbGlicGF0aC9saWJxdC1tdC5zbyAmJiBsaWI9cXQtbXQ7IFwKKwkgIGNmbGFncz0iLUkkJGRpci9pbmNsdWRlIjsgXAorCSAgbGlicz0iLUwkJGxpYnBhdGggLVdsLC1ycGF0aCwkJGxpYnBhdGggLWwkJGxpYiI7IFwKKwkgIG1vYz0iJCRkaXIvYmluL21vYyI7IFwKKwlmaTsgXAorCWlmIFsgISAteCAkJGRpci9iaW4vbW9jIC1hIC14IC91c3IvYmluL21vYyBdOyB0aGVuIFwKKwkgIGVjaG8gIioiOyBcCisJICBlY2hvICIqIFVuYWJsZSB0byBmaW5kICQkZGlyL2Jpbi9tb2MsIHVzaW5nIC91c3IvYmluL21vYyBpbnN0ZWFkLiI7IFwKKwkgIGVjaG8gIioiOyBcCisJICBtb2M9Ii91c3IvYmluL21vYyI7IFwKKwlmaTsgXAorCWVjaG8gIktDX1FUX0NGTEFHUz0kJGNmbGFncyIgPiAkQDsgXAorCWVjaG8gIktDX1FUX0xJQlM9JCRsaWJzIiA+PiAkQDsgXAorCWVjaG8gIktDX1FUX01PQz0kJG1vYyIgPj4gJEAKK2VuZGlmCisKKyQob2JqKS9nY29uZi5vOiAkKG9iaikvLnRtcF9ndGtjaGVjaworCitpZmVxICgkKGdjb25mLXRhcmdldCksMSkKKy1pbmNsdWRlICQob2JqKS8udG1wX2d0a2NoZWNrCisKKyMgR1RLIG5lZWRzIHNvbWUgZXh0cmEgZWZmb3J0LCB0b28uLi4KKyQob2JqKS8udG1wX2d0a2NoZWNrOgorCUBpZiBgcGtnLWNvbmZpZyAtLWV4aXN0cyBndGsrLTIuMCBnbW9kdWxlLTIuMCBsaWJnbGFkZS0yLjBgOyB0aGVuCQlcCisJCWlmIGBwa2ctY29uZmlnIC0tYXRsZWFzdC12ZXJzaW9uPTIuMC4wIGd0aystMi4wYDsgdGhlbgkJCVwKKwkJCXRvdWNoICRAOwkJCQkJCQkJXAorCQllbHNlCQkJCQkJCQkJXAorCQkJZWNobyAiKiI7IAkJCQkJCQlcCisJCQllY2hvICIqIEdUSysgaXMgcHJlc2VudCBidXQgdmVyc2lvbiA+PSAyLjAuMCBpcyByZXF1aXJlZC4iOwlcCisJCQllY2hvICIqIjsJCQkJCQkJXAorCQkJZmFsc2U7CQkJCQkJCQlcCisJCWZpCQkJCQkJCQkJXAorCWVsc2UJCQkJCQkJCQkJXAorCQllY2hvICIqIjsgCQkJCQkJCQlcCisJCWVjaG8gIiogVW5hYmxlIHRvIGZpbmQgdGhlIEdUSysgaW5zdGFsbGF0aW9uLiBQbGVhc2UgbWFrZSBzdXJlIHRoYXQiOyAJXAorCQllY2hvICIqIHRoZSBHVEsrIDIuMCBkZXZlbG9wbWVudCBwYWNrYWdlIGlzIGNvcnJlY3RseSBpbnN0YWxsZWQuLi4iOyAJXAorCQllY2hvICIqIFlvdSBuZWVkIGd0aystMi4wLCBnbGliLTIuMCBhbmQgbGliZ2xhZGUtMi4wLiI7IAkJXAorCQllY2hvICIqIjsgCQkJCQkJCQlcCisJCWZhbHNlOwkJCQkJCQkJCVwKKwlmaQorZW5kaWYKKworJChvYmopL3pjb25mLnRhYi5vOiAkKG9iaikvbGV4Lnpjb25mLmMgJChvYmopL3pjb25mLmhhc2guYworCiskKG9iaikva2NvbmZpZ19sb2FkLm86ICQob2JqKS9sa2NfZGVmcy5oCisKKyQob2JqKS9xY29uZi5vOiAkKG9iaikvcWNvbmYubW9jICQob2JqKS9sa2NfZGVmcy5oCisKKyQob2JqKS9nY29uZi5vOiAkKG9iaikvbGtjX2RlZnMuaAorCiskKG9iaikvJS5tb2M6ICQoc3JjKS8lLmgKKwkkKEtDX1FUX01PQykgLWkgJDwgLW8gJEAKKworJChvYmopL2xrY19kZWZzLmg6ICQoc3JjKS9sa2NfcHJvdG8uaAorCXNlZCA8ICQ8ID4gJEAgJ3MvUChcKFteLF0qXCksLiovI2RlZmluZSBcMSAoXCpcMV9wKS8nCisKKworIyMjCisjIFRoZSBmb2xsb3dpbmcgcmVxdWlyZXMgZmxleC9iaXNvbi9ncGVyZgorIyBCeSBkZWZhdWx0IHdlIHVzZSB0aGUgX3NoaXBwZWQgdmVyc2lvbnMsIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgaWYKKyMgeW91IGFyZSBtb2RpZnlpbmcgdGhlIGZsZXgvYmlzb24gc3JjLgorIyBMS0NfR0VOUEFSU0VSIDo9IDEKKworaWZkZWYgTEtDX0dFTlBBUlNFUgorCiskKG9iaikvemNvbmYudGFiLmM6ICQoc3JjKS96Y29uZi55CiskKG9iaikvbGV4Lnpjb25mLmM6ICQoc3JjKS96Y29uZi5sCiskKG9iaikvemNvbmYuaGFzaC5jOiAkKHNyYykvemNvbmYuZ3BlcmYKKworJS50YWIuYzogJS55CisJYmlzb24gLWwgLWIgJCogLXAgJChub3RkaXIgJCopICQ8CisJY3AgJEAgJEBfc2hpcHBlZAorCitsZXguJS5jOiAlLmwKKwlmbGV4IC1MIC1QJChub3RkaXIgJCopIC1vJEAgJDwKKwljcCAkQCAkQF9zaGlwcGVkCisKKyUuaGFzaC5jOiAlLmdwZXJmCisJZ3BlcmYgPCAkPCA+ICRACisJY3AgJEAgJEBfc2hpcHBlZAorCitlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL1BPVEZJTEVTLmluIGIvc2NyaXB0cy9rY29uZmlnL1BPVEZJTEVTLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOTRlNDYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvUE9URklMRVMuaW4KQEAgLTAsMCArMSw1IEBACitzY3JpcHRzL2tjb25maWcvbWNvbmYuYworc2NyaXB0cy9rY29uZmlnL2NvbmYuYworc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMKK3NjcmlwdHMva2NvbmZpZy9nY29uZi5jCitzY3JpcHRzL2tjb25maWcvcWNvbmYuY2MKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9jaGVjay5zaCBiL3NjcmlwdHMva2NvbmZpZy9jaGVjay5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNWZjMjk0Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL2NoZWNrLnNoCkBAIC0wLDAgKzEsMTMgQEAKKyMhL2Jpbi9zaAorIyBOZWVkZWQgZm9yIHN5c3RlbXMgd2l0aG91dCBnZXR0ZXh0CiskKiAteGMgLW8gL2Rldi9udWxsIC0gPiAvZGV2L251bGwgMj4mMSA8PCBFT0YKKyNpbmNsdWRlIDxsaWJpbnRsLmg+CitpbnQgbWFpbigpCit7CisJZ2V0dGV4dCgiIik7CisJcmV0dXJuIDA7Cit9CitFT0YKK2lmIFsgISAiJD8iIC1lcSAiMCIgIF07IHRoZW4KKwllY2hvIC1ES0JVSUxEX05PX05MUzsKK2ZpCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvY29uZi5jIGIvc2NyaXB0cy9rY29uZmlnL2NvbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTI0NDZhCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL2NvbmYuYwpAQCAtMCwwICsxLDYwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNkZWZpbmUgX1hPUEVOX1NPVVJDRSA3MDAKKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworc3RhdGljIHZvaWQgY29uZihzdHJ1Y3QgbWVudSAqbWVudSk7CitzdGF0aWMgdm9pZCBjaGVja19jb25mKHN0cnVjdCBtZW51ICptZW51KTsKKworZW51bSB7CisJYXNrX2FsbCwKKwlhc2tfbmV3LAorCWFza19zaWxlbnQsCisJc2V0X2RlZmF1bHQsCisJc2V0X3llcywKKwlzZXRfbW9kLAorCXNldF9ubywKKwlzZXRfcmFuZG9tCit9IGlucHV0X21vZGUgPSBhc2tfYWxsOworY2hhciAqZGVmY29uZmlnX2ZpbGU7CisKK3N0YXRpYyBpbnQgaW5kZW50ID0gMTsKK3N0YXRpYyBpbnQgdmFsaWRfc3RkaW4gPSAxOworc3RhdGljIGludCBjb25mX2NudDsKK3N0YXRpYyBjaGFyIGxpbmVbMTI4XTsKK3N0YXRpYyBzdHJ1Y3QgbWVudSAqcm9vdEVudHJ5OworCitzdGF0aWMgY2hhciBub2hlbHBfdGV4dFtdID0gTl8oIlNvcnJ5LCBubyBoZWxwIGF2YWlsYWJsZSBmb3IgdGhpcyBvcHRpb24geWV0LlxuIik7CisKK3N0YXRpYyB2b2lkIHN0cmlwKGNoYXIgKnN0cikKK3sKKwljaGFyICpwID0gc3RyOworCWludCBsOworCisJd2hpbGUgKChpc3NwYWNlKCpwKSkpCisJCXArKzsKKwlsID0gc3RybGVuKHApOworCWlmIChwICE9IHN0cikKKwkJbWVtbW92ZShzdHIsIHAsIGwgKyAxKTsKKwlpZiAoIWwpCisJCXJldHVybjsKKwlwID0gc3RyICsgbCAtIDE7CisJd2hpbGUgKChpc3NwYWNlKCpwKSkpCisJCSpwLS0gPSAwOworfQorCitzdGF0aWMgdm9pZCBjaGVja19zdGRpbih2b2lkKQoreworCWlmICghdmFsaWRfc3RkaW4gJiYgaW5wdXRfbW9kZSA9PSBhc2tfc2lsZW50KSB7CisJCXByaW50ZihfKCJhYm9ydGVkIVxuXG4iKSk7CisJCXByaW50ZihfKCJDb25zb2xlIGlucHV0L291dHB1dCBpcyByZWRpcmVjdGVkLiAiKSk7CisJCXByaW50ZihfKCJSdW4gJ21ha2Ugb2xkY29uZmlnJyB0byB1cGRhdGUgY29uZmlndXJhdGlvbi5cblxuIikpOworCQlleGl0KDEpOworCX0KK30KKworc3RhdGljIHZvaWQgY29uZl9hc2t2YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKmRlZikKK3sKKwllbnVtIHN5bWJvbF90eXBlIHR5cGUgPSBzeW1fZ2V0X3R5cGUoc3ltKTsKKwl0cmlzdGF0ZSB2YWw7CisKKwlpZiAoIXN5bV9oYXNfdmFsdWUoc3ltKSkKKwkJcHJpbnRmKCIoTkVXKSAiKTsKKworCWxpbmVbMF0gPSAnXG4nOworCWxpbmVbMV0gPSAwOworCisJaWYgKCFzeW1faXNfY2hhbmdhYmxlKHN5bSkpIHsKKwkJcHJpbnRmKCIlc1xuIiwgZGVmKTsKKwkJbGluZVswXSA9ICdcbic7CisJCWxpbmVbMV0gPSAwOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChpbnB1dF9tb2RlKSB7CisJY2FzZSBzZXRfbm86CisJY2FzZSBzZXRfbW9kOgorCWNhc2Ugc2V0X3llczoKKwljYXNlIHNldF9yYW5kb206CisJCWlmIChzeW1faGFzX3ZhbHVlKHN5bSkpIHsKKwkJCXByaW50ZigiJXNcbiIsIGRlZik7CisJCQlyZXR1cm47CisJCX0KKwkJYnJlYWs7CisJY2FzZSBhc2tfbmV3OgorCWNhc2UgYXNrX3NpbGVudDoKKwkJaWYgKHN5bV9oYXNfdmFsdWUoc3ltKSkgeworCQkJcHJpbnRmKCIlc1xuIiwgZGVmKTsKKwkJCXJldHVybjsKKwkJfQorCQljaGVja19zdGRpbigpOworCWNhc2UgYXNrX2FsbDoKKwkJZmZsdXNoKHN0ZG91dCk7CisJCWZnZXRzKGxpbmUsIDEyOCwgc3RkaW4pOworCQlyZXR1cm47CisJY2FzZSBzZXRfZGVmYXVsdDoKKwkJcHJpbnRmKCIlc1xuIiwgZGVmKTsKKwkJcmV0dXJuOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU19JTlQ6CisJY2FzZSBTX0hFWDoKKwljYXNlIFNfU1RSSU5HOgorCQlwcmludGYoIiVzXG4iLCBkZWYpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJOworCX0KKwlzd2l0Y2ggKGlucHV0X21vZGUpIHsKKwljYXNlIHNldF95ZXM6CisJCWlmIChzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgeWVzKSkgeworCQkJbGluZVswXSA9ICd5JzsKKwkJCWxpbmVbMV0gPSAnXG4nOworCQkJbGluZVsyXSA9IDA7CisJCQlicmVhazsKKwkJfQorCWNhc2Ugc2V0X21vZDoKKwkJaWYgKHR5cGUgPT0gU19UUklTVEFURSkgeworCQkJaWYgKHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCBtb2QpKSB7CisJCQkJbGluZVswXSA9ICdtJzsKKwkJCQlsaW5lWzFdID0gJ1xuJzsKKwkJCQlsaW5lWzJdID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgeWVzKSkgeworCQkJCWxpbmVbMF0gPSAneSc7CisJCQkJbGluZVsxXSA9ICdcbic7CisJCQkJbGluZVsyXSA9IDA7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwljYXNlIHNldF9ubzoKKwkJaWYgKHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCBubykpIHsKKwkJCWxpbmVbMF0gPSAnbic7CisJCQlsaW5lWzFdID0gJ1xuJzsKKwkJCWxpbmVbMl0gPSAwOworCQkJYnJlYWs7CisJCX0KKwljYXNlIHNldF9yYW5kb206CisJCWRvIHsKKwkJCXZhbCA9ICh0cmlzdGF0ZSkocmFuZG9tKCkgJSAzKTsKKwkJfSB3aGlsZSAoIXN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCB2YWwpKTsKKwkJc3dpdGNoICh2YWwpIHsKKwkJY2FzZSBubzogbGluZVswXSA9ICduJzsgYnJlYWs7CisJCWNhc2UgbW9kOiBsaW5lWzBdID0gJ20nOyBicmVhazsKKwkJY2FzZSB5ZXM6IGxpbmVbMF0gPSAneSc7IGJyZWFrOworCQl9CisJCWxpbmVbMV0gPSAnXG4nOworCQlsaW5lWzJdID0gMDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXByaW50ZigiJXMiLCBsaW5lKTsKK30KKworaW50IGNvbmZfc3RyaW5nKHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKKwljb25zdCBjaGFyICpkZWY7CisKKwl3aGlsZSAoMSkgeworCQlwcmludGYoIiUqcyVzICIsIGluZGVudCAtIDEsICIiLCBtZW51LT5wcm9tcHQtPnRleHQpOworCQlwcmludGYoIiglcykgIiwgc3ltLT5uYW1lKTsKKwkJZGVmID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKKwkJaWYgKHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSkpCisJCQlwcmludGYoIlslc10gIiwgZGVmKTsKKwkJY29uZl9hc2t2YWx1ZShzeW0sIGRlZik7CisJCXN3aXRjaCAobGluZVswXSkgeworCQljYXNlICdcbic6CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQkvKiBwcmludCBoZWxwICovCisJCQlpZiAobGluZVsxXSA9PSAnXG4nKSB7CisJCQkJcHJpbnRmKCJcbiVzXG4iLCBtZW51LT5zeW0tPmhlbHAgPyBtZW51LT5zeW0tPmhlbHAgOiBub2hlbHBfdGV4dCk7CisJCQkJZGVmID0gTlVMTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJZGVmYXVsdDoKKwkJCWxpbmVbc3RybGVuKGxpbmUpLTFdID0gMDsKKwkJCWRlZiA9IGxpbmU7CisJCX0KKwkJaWYgKGRlZiAmJiBzeW1fc2V0X3N0cmluZ192YWx1ZShzeW0sIGRlZikpCisJCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY29uZl9zeW0oc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gbWVudS0+c3ltOworCXRyaXN0YXRlIG9sZHZhbCwgbmV3dmFsOworCWNvbnN0IGNoYXIgKmhlbHA7CisKKwl3aGlsZSAoMSkgeworCQlwcmludGYoIiUqcyVzICIsIGluZGVudCAtIDEsICIiLCBtZW51LT5wcm9tcHQtPnRleHQpOworCQlpZiAoc3ltLT5uYW1lKQorCQkJcHJpbnRmKCIoJXMpICIsIHN5bS0+bmFtZSk7CisJCXB1dGNoYXIoJ1snKTsKKwkJb2xkdmFsID0gc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pOworCQlzd2l0Y2ggKG9sZHZhbCkgeworCQljYXNlIG5vOgorCQkJcHV0Y2hhcignTicpOworCQkJYnJlYWs7CisJCWNhc2UgbW9kOgorCQkJcHV0Y2hhcignTScpOworCQkJYnJlYWs7CisJCWNhc2UgeWVzOgorCQkJcHV0Y2hhcignWScpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKG9sZHZhbCAhPSBubyAmJiBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbm8pKQorCQkJcHJpbnRmKCIvbiIpOworCQlpZiAob2xkdmFsICE9IG1vZCAmJiBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbW9kKSkKKwkJCXByaW50ZigiL20iKTsKKwkJaWYgKG9sZHZhbCAhPSB5ZXMgJiYgc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIHllcykpCisJCQlwcmludGYoIi95Iik7CisJCWlmIChzeW0tPmhlbHApCisJCQlwcmludGYoIi8/Iik7CisJCXByaW50ZigiXSAiKTsKKwkJY29uZl9hc2t2YWx1ZShzeW0sIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSkpOworCQlzdHJpcChsaW5lKTsKKworCQlzd2l0Y2ggKGxpbmVbMF0pIHsKKwkJY2FzZSAnbic6CisJCWNhc2UgJ04nOgorCQkJbmV3dmFsID0gbm87CisJCQlpZiAoIWxpbmVbMV0gfHwgIXN0cmNtcCgmbGluZVsxXSwgIm8iKSkKKwkJCQlicmVhazsKKwkJCWNvbnRpbnVlOworCQljYXNlICdtJzoKKwkJY2FzZSAnTSc6CisJCQluZXd2YWwgPSBtb2Q7CisJCQlpZiAoIWxpbmVbMV0pCisJCQkJYnJlYWs7CisJCQljb250aW51ZTsKKwkJY2FzZSAneSc6CisJCWNhc2UgJ1knOgorCQkJbmV3dmFsID0geWVzOworCQkJaWYgKCFsaW5lWzFdIHx8ICFzdHJjbXAoJmxpbmVbMV0sICJlcyIpKQorCQkJCWJyZWFrOworCQkJY29udGludWU7CisJCWNhc2UgMDoKKwkJCW5ld3ZhbCA9IG9sZHZhbDsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCWdvdG8gaGVscDsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbmV3dmFsKSkKKwkJCXJldHVybiAwOworaGVscDoKKwkJaGVscCA9IG5vaGVscF90ZXh0OworCQlpZiAoc3ltLT5oZWxwKQorCQkJaGVscCA9IHN5bS0+aGVscDsKKwkJcHJpbnRmKCJcbiVzXG4iLCBoZWxwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY29uZl9jaG9pY2Uoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltLCAqZGVmX3N5bTsKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisJYm9vbCBpc19uZXc7CisKKwlzeW0gPSBtZW51LT5zeW07CisJaXNfbmV3ID0gIXN5bV9oYXNfdmFsdWUoc3ltKTsKKwlpZiAoc3ltX2lzX2NoYW5nYWJsZShzeW0pKSB7CisJCWNvbmZfc3ltKG1lbnUpOworCQlzeW1fY2FsY192YWx1ZShzeW0pOworCQlzd2l0Y2ggKHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSkgeworCQljYXNlIG5vOgorCQkJcmV0dXJuIDE7CisJCWNhc2UgbW9kOgorCQkJcmV0dXJuIDA7CisJCWNhc2UgeWVzOgorCQkJYnJlYWs7CisJCX0KKwl9IGVsc2UgeworCQlzd2l0Y2ggKHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSkgeworCQljYXNlIG5vOgorCQkJcmV0dXJuIDE7CisJCWNhc2UgbW9kOgorCQkJcHJpbnRmKCIlKnMlc1xuIiwgaW5kZW50IC0gMSwgIiIsIG1lbnVfZ2V0X3Byb21wdChtZW51KSk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSB5ZXM6CisJCQlicmVhazsKKwkJfQorCX0KKworCXdoaWxlICgxKSB7CisJCWludCBjbnQsIGRlZjsKKworCQlwcmludGYoIiUqcyVzXG4iLCBpbmRlbnQgLSAxLCAiIiwgbWVudV9nZXRfcHJvbXB0KG1lbnUpKTsKKwkJZGVmX3N5bSA9IHN5bV9nZXRfY2hvaWNlX3ZhbHVlKHN5bSk7CisJCWNudCA9IGRlZiA9IDA7CisJCWxpbmVbMF0gPSAwOworCQlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKwkJCWlmICghbWVudV9pc192aXNpYmxlKGNoaWxkKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghY2hpbGQtPnN5bSkgeworCQkJCXByaW50ZigiJSpjICVzXG4iLCBpbmRlbnQsICcqJywgbWVudV9nZXRfcHJvbXB0KGNoaWxkKSk7CisJCQkJY29udGludWU7CisJCQl9CisJCQljbnQrKzsKKwkJCWlmIChjaGlsZC0+c3ltID09IGRlZl9zeW0pIHsKKwkJCQlkZWYgPSBjbnQ7CisJCQkJcHJpbnRmKCIlKmMiLCBpbmRlbnQsICc+Jyk7CisJCQl9IGVsc2UKKwkJCQlwcmludGYoIiUqYyIsIGluZGVudCwgJyAnKTsKKwkJCXByaW50ZigiICVkLiAlcyIsIGNudCwgbWVudV9nZXRfcHJvbXB0KGNoaWxkKSk7CisJCQlpZiAoY2hpbGQtPnN5bS0+bmFtZSkKKwkJCQlwcmludGYoIiAoJXMpIiwgY2hpbGQtPnN5bS0+bmFtZSk7CisJCQlpZiAoIXN5bV9oYXNfdmFsdWUoY2hpbGQtPnN5bSkpCisJCQkJcHJpbnRmKCIgKE5FVykiKTsKKwkJCXByaW50ZigiXG4iKTsKKwkJfQorCQlwcmludGYoIiUqc2Nob2ljZSIsIGluZGVudCAtIDEsICIiKTsKKwkJaWYgKGNudCA9PSAxKSB7CisJCQlwcmludGYoIlsxXTogMVxuIik7CisJCQlnb3RvIGNvbmZfY2hpbGRzOworCQl9CisJCXByaW50ZigiWzEtJWQiLCBjbnQpOworCQlpZiAoc3ltLT5oZWxwKQorCQkJcHJpbnRmKCI/Iik7CisJCXByaW50ZigiXTogIik7CisJCXN3aXRjaCAoaW5wdXRfbW9kZSkgeworCQljYXNlIGFza19uZXc6CisJCWNhc2UgYXNrX3NpbGVudDoKKwkJCWlmICghaXNfbmV3KSB7CisJCQkJY250ID0gZGVmOworCQkJCXByaW50ZigiJWRcbiIsIGNudCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQljaGVja19zdGRpbigpOworCQljYXNlIGFza19hbGw6CisJCQlmZmx1c2goc3Rkb3V0KTsKKwkJCWZnZXRzKGxpbmUsIDEyOCwgc3RkaW4pOworCQkJc3RyaXAobGluZSk7CisJCQlpZiAobGluZVswXSA9PSAnPycpIHsKKwkJCQlwcmludGYoIlxuJXNcbiIsIG1lbnUtPnN5bS0+aGVscCA/CisJCQkJCW1lbnUtPnN5bS0+aGVscCA6IG5vaGVscF90ZXh0KTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICghbGluZVswXSkKKwkJCQljbnQgPSBkZWY7CisJCQllbHNlIGlmIChpc2RpZ2l0KGxpbmVbMF0pKQorCQkJCWNudCA9IGF0b2kobGluZSk7CisJCQllbHNlCisJCQkJY29udGludWU7CisJCQlicmVhazsKKwkJY2FzZSBzZXRfcmFuZG9tOgorCQkJZGVmID0gKHJhbmRvbSgpICUgY250KSArIDE7CisJCWNhc2Ugc2V0X2RlZmF1bHQ6CisJCWNhc2Ugc2V0X3llczoKKwkJY2FzZSBzZXRfbW9kOgorCQljYXNlIHNldF9ubzoKKwkJCWNudCA9IGRlZjsKKwkJCXByaW50ZigiJWRcbiIsIGNudCk7CisJCQlicmVhazsKKwkJfQorCisJY29uZl9jaGlsZHM6CisJCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworCQkJaWYgKCFjaGlsZC0+c3ltIHx8ICFtZW51X2lzX3Zpc2libGUoY2hpbGQpKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKCEtLWNudCkKKwkJCQlicmVhazsKKwkJfQorCQlpZiAoIWNoaWxkKQorCQkJY29udGludWU7CisJCWlmIChzdHJsZW4obGluZSkgPiAwICYmIGxpbmVbc3RybGVuKGxpbmUpIC0gMV0gPT0gJz8nKSB7CisJCQlwcmludGYoIlxuJXNcbiIsIGNoaWxkLT5zeW0tPmhlbHAgPworCQkJCWNoaWxkLT5zeW0tPmhlbHAgOiBub2hlbHBfdGV4dCk7CisJCQljb250aW51ZTsKKwkJfQorCQlzeW1fc2V0X2Nob2ljZV92YWx1ZShzeW0sIGNoaWxkLT5zeW0pOworCQlpZiAoY2hpbGQtPmxpc3QpIHsKKwkJCWluZGVudCArPSAyOworCQkJY29uZihjaGlsZC0+bGlzdCk7CisJCQlpbmRlbnQgLT0gMjsKKwkJfQorCQlyZXR1cm4gMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbmYoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisKKwlpZiAoIW1lbnVfaXNfdmlzaWJsZShtZW51KSkKKwkJcmV0dXJuOworCisJc3ltID0gbWVudS0+c3ltOworCXByb3AgPSBtZW51LT5wcm9tcHQ7CisJaWYgKHByb3ApIHsKKwkJY29uc3QgY2hhciAqcHJvbXB0OworCisJCXN3aXRjaCAocHJvcC0+dHlwZSkgeworCQljYXNlIFBfTUVOVToKKwkJCWlmIChpbnB1dF9tb2RlID09IGFza19zaWxlbnQgJiYgcm9vdEVudHJ5ICE9IG1lbnUpIHsKKwkJCQljaGVja19jb25mKG1lbnUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJY2FzZSBQX0NPTU1FTlQ6CisJCQlwcm9tcHQgPSBtZW51X2dldF9wcm9tcHQobWVudSk7CisJCQlpZiAocHJvbXB0KQorCQkJCXByaW50ZigiJSpjXG4lKmMgJXNcbiUqY1xuIiwKKwkJCQkJaW5kZW50LCAnKicsCisJCQkJCWluZGVudCwgJyonLCBwcm9tcHQsCisJCQkJCWluZGVudCwgJyonKTsKKwkJZGVmYXVsdDoKKwkJCTsKKwkJfQorCX0KKworCWlmICghc3ltKQorCQlnb3RvIGNvbmZfY2hpbGRzOworCisJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSkgeworCQljb25mX2Nob2ljZShtZW51KTsKKwkJaWYgKHN5bS0+Y3Vyci50cmkgIT0gbW9kKQorCQkJcmV0dXJuOworCQlnb3RvIGNvbmZfY2hpbGRzOworCX0KKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0lOVDoKKwljYXNlIFNfSEVYOgorCWNhc2UgU19TVFJJTkc6CisJCWNvbmZfc3RyaW5nKG1lbnUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQljb25mX3N5bShtZW51KTsKKwkJYnJlYWs7CisJfQorCitjb25mX2NoaWxkczoKKwlpZiAoc3ltKQorCQlpbmRlbnQgKz0gMjsKKwlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpCisJCWNvbmYoY2hpbGQpOworCWlmIChzeW0pCisJCWluZGVudCAtPSAyOworfQorCitzdGF0aWMgdm9pZCBjaGVja19jb25mKHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisKKwlpZiAoIW1lbnVfaXNfdmlzaWJsZShtZW51KSkKKwkJcmV0dXJuOworCisJc3ltID0gbWVudS0+c3ltOworCWlmIChzeW0gJiYgIXN5bV9oYXNfdmFsdWUoc3ltKSkgeworCQlpZiAoc3ltX2lzX2NoYW5nYWJsZShzeW0pIHx8CisJCSAgICAoc3ltX2lzX2Nob2ljZShzeW0pICYmIHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSA9PSB5ZXMpKSB7CisJCQlpZiAoIWNvbmZfY250KyspCisJCQkJcHJpbnRmKF8oIipcbiogUmVzdGFydCBjb25maWcuLi5cbipcbiIpKTsKKwkJCXJvb3RFbnRyeSA9IG1lbnVfZ2V0X3BhcmVudF9tZW51KG1lbnUpOworCQkJY29uZihyb290RW50cnkpOworCQl9CisJfQorCisJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KQorCQljaGVja19jb25mKGNoaWxkKTsKK30KKworaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCit7CisJaW50IGkgPSAxOworCWNvbnN0IGNoYXIgKm5hbWU7CisJc3RydWN0IHN0YXQgdG1wc3RhdDsKKworCWlmIChhYyA+IGkgJiYgYXZbaV1bMF0gPT0gJy0nKSB7CisJCXN3aXRjaCAoYXZbaSsrXVsxXSkgeworCQljYXNlICdvJzoKKwkJCWlucHV0X21vZGUgPSBhc2tfbmV3OworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJaW5wdXRfbW9kZSA9IGFza19zaWxlbnQ7CisJCQl2YWxpZF9zdGRpbiA9IGlzYXR0eSgwKTsgLy9iYm94OiAmJiBpc2F0dHkoMSkgJiYgaXNhdHR5KDIpOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJaW5wdXRfbW9kZSA9IHNldF9kZWZhdWx0OworCQkJYnJlYWs7CisJCWNhc2UgJ0QnOgorCQkJaW5wdXRfbW9kZSA9IHNldF9kZWZhdWx0OworCQkJZGVmY29uZmlnX2ZpbGUgPSBhdltpKytdOworCQkJaWYgKCFkZWZjb25maWdfZmlsZSkgeworCQkJCXByaW50ZihfKCIlczogTm8gZGVmYXVsdCBjb25maWcgZmlsZSBzcGVjaWZpZWRcbiIpLAorCQkJCQlhdlswXSk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCWlucHV0X21vZGUgPSBzZXRfbm87CisJCQlicmVhazsKKwkJY2FzZSAnbSc6CisJCQlpbnB1dF9tb2RlID0gc2V0X21vZDsKKwkJCWJyZWFrOworCQljYXNlICd5JzoKKwkJCWlucHV0X21vZGUgPSBzZXRfeWVzOworCQkJYnJlYWs7CisJCWNhc2UgJ3InOgorCQkJaW5wdXRfbW9kZSA9IHNldF9yYW5kb207CisJCQlzcmFuZG9tKHRpbWUoTlVMTCkpOworCQkJYnJlYWs7CisJCWNhc2UgJ2gnOgorCQljYXNlICc/JzoKKwkJCWZwcmludGYoc3RkZXJyLCAiU2VlIFJFQURNRSBmb3IgdXNhZ2UgaW5mb1xuIik7CisJCQlleGl0KDApOworCQl9CisJfQorCW5hbWUgPSBhdltpXTsKKwlpZiAoIW5hbWUpIHsKKwkJcHJpbnRmKF8oIiVzOiBLY29uZmlnIGZpbGUgbWlzc2luZ1xuIiksIGF2WzBdKTsKKwl9CisJY29uZl9wYXJzZShuYW1lKTsKKwkvL3pjb25mZHVtcChzdGRvdXQpOworCXN3aXRjaCAoaW5wdXRfbW9kZSkgeworCWNhc2Ugc2V0X2RlZmF1bHQ6CisJCWlmICghZGVmY29uZmlnX2ZpbGUpCisJCQlkZWZjb25maWdfZmlsZSA9IGNvbmZfZ2V0X2RlZmF1bHRfY29uZm5hbWUoKTsKKwkJaWYgKGNvbmZfcmVhZChkZWZjb25maWdfZmlsZSkpIHsKKwkJCXByaW50ZigiKioqXG4iCisJCQkJIioqKiBDYW4ndCBmaW5kIGRlZmF1bHQgY29uZmlndXJhdGlvbiBcIiVzXCIhXG4iCisJCQkJIioqKlxuIiwgZGVmY29uZmlnX2ZpbGUpOworCQkJZXhpdCgxKTsKKwkJfQorCQlicmVhazsKKwljYXNlIGFza19zaWxlbnQ6CisJCWlmIChzdGF0KCIuY29uZmlnIiwgJnRtcHN0YXQpKSB7CisJCQlwcmludGYoXygiKioqXG4iCisJCQkJIioqKiBZb3UgaGF2ZSBub3QgeWV0IGNvbmZpZ3VyZWQgYnVzeWJveCFcbiIKKwkJCQkiKioqXG4iCisJCQkJIioqKiBQbGVhc2UgcnVuIHNvbWUgY29uZmlndXJhdG9yIChlLmcuIFwibWFrZSBvbGRjb25maWdcIiBvclxuIgorCQkJCSIqKiogXCJtYWtlIG1lbnVjb25maWdcIiBvciBcIm1ha2UgZGVmY29uZmlnXCIpLlxuIgorCQkJCSIqKipcbiIpKTsKKwkJCWV4aXQoMSk7CisJCX0KKwljYXNlIGFza19hbGw6CisJY2FzZSBhc2tfbmV3OgorCQljb25mX3JlYWQoTlVMTCk7CisJCWJyZWFrOworCWNhc2Ugc2V0X25vOgorCWNhc2Ugc2V0X21vZDoKKwljYXNlIHNldF95ZXM6CisJY2FzZSBzZXRfcmFuZG9tOgorCQluYW1lID0gZ2V0ZW52KCJLQ09ORklHX0FMTENPTkZJRyIpOworCQlpZiAobmFtZSAmJiAhc3RhdChuYW1lLCAmdG1wc3RhdCkpIHsKKwkJCWNvbmZfcmVhZF9zaW1wbGUobmFtZSk7CisJCQlicmVhazsKKwkJfQorCQlzd2l0Y2ggKGlucHV0X21vZGUpIHsKKwkJY2FzZSBzZXRfbm86CSBuYW1lID0gImFsbG5vLmNvbmZpZyI7IGJyZWFrOworCQljYXNlIHNldF9tb2Q6CSBuYW1lID0gImFsbG1vZC5jb25maWciOyBicmVhazsKKwkJY2FzZSBzZXRfeWVzOgkgbmFtZSA9ICJhbGx5ZXMuY29uZmlnIjsgYnJlYWs7CisJCWNhc2Ugc2V0X3JhbmRvbTogbmFtZSA9ICJhbGxyYW5kb20uY29uZmlnIjsgYnJlYWs7CisJCWRlZmF1bHQ6IGJyZWFrOworCQl9CisJCWlmICghc3RhdChuYW1lLCAmdG1wc3RhdCkpCisJCQljb25mX3JlYWRfc2ltcGxlKG5hbWUpOworCQllbHNlIGlmICghc3RhdCgiYWxsLmNvbmZpZyIsICZ0bXBzdGF0KSkKKwkJCWNvbmZfcmVhZF9zaW1wbGUoImFsbC5jb25maWciKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJaWYgKGlucHV0X21vZGUgIT0gYXNrX3NpbGVudCkgeworCQlyb290RW50cnkgPSAmcm9vdG1lbnU7CisJCWNvbmYoJnJvb3RtZW51KTsKKwkJaWYgKGlucHV0X21vZGUgPT0gYXNrX2FsbCkgeworCQkJaW5wdXRfbW9kZSA9IGFza19zaWxlbnQ7CisJCQl2YWxpZF9zdGRpbiA9IDE7CisJCX0KKwl9CisJZG8geworCQljb25mX2NudCA9IDA7CisJCWNoZWNrX2NvbmYoJnJvb3RtZW51KTsKKwl9IHdoaWxlIChjb25mX2NudCk7CisJaWYgKGNvbmZfd3JpdGUoTlVMTCkpIHsKKwkJZnByaW50ZihzdGRlcnIsIF8oIlxuKioqIEVycm9yIGR1cmluZyB3cml0aW5nIG9mIHRoZSBjb25maWd1cmF0aW9uLlxuXG4iKSk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jIGIvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY0ZWNiZAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCkBAIC0wLDAgKzEsNTg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworc3RhdGljIHZvaWQgY29uZl93YXJuaW5nKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbmZfZmlsZW5hbWU7CitzdGF0aWMgaW50IGNvbmZfbGluZW5vLCBjb25mX3dhcm5pbmdzLCBjb25mX3Vuc2F2ZWQ7CisKK2NvbnN0IGNoYXIgY29uZl9kZWZfZmlsZW5hbWVbXSA9ICIuY29uZmlnIjsKKworY29uc3QgY2hhciBjb25mX2RlZm5hbWVbXSA9ICIvZGV2L251bGwiOyAvL2Jib3gKKworY29uc3QgY2hhciAqY29uZl9jb25mbmFtZXNbXSA9IHsKKwljb25mX2RlZl9maWxlbmFtZSwKKwljb25mX2RlZm5hbWUsCisJTlVMTCwKK307CisKK3N0YXRpYyB2b2lkIGNvbmZfd2FybmluZyhjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6d2FybmluZzogIiwgY29uZl9maWxlbmFtZSwgY29uZl9saW5lbm8pOworCXZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcCk7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCXZhX2VuZChhcCk7CisJY29uZl93YXJuaW5ncysrOworfQorCitzdGF0aWMgY2hhciAqY29uZl9leHBhbmRfdmFsdWUoY29uc3QgY2hhciAqaW4pCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCWNvbnN0IGNoYXIgKnNyYzsKKwlzdGF0aWMgY2hhciByZXNfdmFsdWVbU1lNQk9MX01BWExFTkdUSF07CisJY2hhciAqZHN0LCBuYW1lW1NZTUJPTF9NQVhMRU5HVEhdOworCisJcmVzX3ZhbHVlWzBdID0gMDsKKwlkc3QgPSBuYW1lOworCXdoaWxlICgoc3JjID0gc3RyY2hyKGluLCAnJCcpKSkgeworCQlzdHJuY2F0KHJlc192YWx1ZSwgaW4sIHNyYyAtIGluKTsKKwkJc3JjKys7CisJCWRzdCA9IG5hbWU7CisJCXdoaWxlIChpc2FsbnVtKCpzcmMpIHx8ICpzcmMgPT0gJ18nKQorCQkJKmRzdCsrID0gKnNyYysrOworCQkqZHN0ID0gMDsKKwkJc3ltID0gc3ltX2xvb2t1cChuYW1lLCAwKTsKKwkJc3ltX2NhbGNfdmFsdWUoc3ltKTsKKwkJc3RyY2F0KHJlc192YWx1ZSwgc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSk7CisJCWluID0gc3JjOworCX0KKwlzdHJjYXQocmVzX3ZhbHVlLCBpbik7CisKKwlyZXR1cm4gcmVzX3ZhbHVlOworfQorCitjaGFyICpjb25mX2dldF9kZWZhdWx0X2NvbmZuYW1lKHZvaWQpCit7CisJc3RydWN0IHN0YXQgYnVmOworCXN0YXRpYyBjaGFyICpmdWxsbmFtZSA9IE5VTEw7CisJY2hhciAqZW52LCAqbmFtZTsKKworCW5hbWUgPSBjb25mX2V4cGFuZF92YWx1ZShjb25mX2RlZm5hbWUpOworCWVudiA9IGdldGVudihTUkNUUkVFKTsKKwlpZiAoZW52KSB7CisJCWZ1bGxuYW1lID0gcmVhbGxvYyhmdWxsbmFtZSwgc3RybGVuKGVudikgKyBzdHJsZW4obmFtZSkgKyAyKTsKKwkJc3ByaW50ZihmdWxsbmFtZSwgIiVzLyVzIiwgZW52LCBuYW1lKTsKKwkJaWYgKCFzdGF0KGZ1bGxuYW1lLCAmYnVmKSkKKwkJCXJldHVybiBmdWxsbmFtZTsKKwl9CisJcmV0dXJuIG5hbWU7Cit9CisKK2ludCBjb25mX3JlYWRfc2ltcGxlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJRklMRSAqaW4gPSBOVUxMOworCWNoYXIgbGluZVsxMDI0XTsKKwljaGFyICpwLCAqcDI7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCWludCBpOworCisJaWYgKG5hbWUpIHsKKwkJaW4gPSB6Y29uZl9mb3BlbihuYW1lKTsKKwl9IGVsc2UgeworCQljb25zdCBjaGFyICoqbmFtZXMgPSBjb25mX2NvbmZuYW1lczsKKwkJd2hpbGUgKChuYW1lID0gKm5hbWVzKyspKSB7CisJCQluYW1lID0gY29uZl9leHBhbmRfdmFsdWUobmFtZSk7CisJCQlpbiA9IHpjb25mX2ZvcGVuKG5hbWUpOworCQkJaWYgKGluKSB7CisJCQkJcHJpbnRmKF8oIiNcbiIKKwkJCQkgICAgICAgICAiIyB1c2luZyBkZWZhdWx0cyBmb3VuZCBpbiAlc1xuIgorCQkJCSAgICAgICAgICIjXG4iKSwgbmFtZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJaWYgKCFpbikKKwkJcmV0dXJuIDE7CisKKwljb25mX2ZpbGVuYW1lID0gbmFtZTsKKwljb25mX2xpbmVubyA9IDA7CisJY29uZl93YXJuaW5ncyA9IDA7CisJY29uZl91bnNhdmVkID0gMDsKKworCWZvcl9hbGxfc3ltYm9scyhpLCBzeW0pIHsKKwkJc3ltLT5mbGFncyB8PSBTWU1CT0xfTkVXIHwgU1lNQk9MX0NIQU5HRUQ7CisJCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpCisJCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfTkVXOworCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfVkFMSUQ7CisJCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJCWNhc2UgU19JTlQ6CisJCWNhc2UgU19IRVg6CisJCWNhc2UgU19TVFJJTkc6CisJCQlmcmVlKHN5bS0+dXNlci52YWwpOworCQlkZWZhdWx0OgorCQkJc3ltLT51c2VyLnZhbCA9IE5VTEw7CisJCQlzeW0tPnVzZXIudHJpID0gbm87CisJCX0KKwl9CisKKwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBpbikpIHsKKwkJY29uZl9saW5lbm8rKzsKKwkJc3ltID0gTlVMTDsKKwkJc3dpdGNoIChsaW5lWzBdKSB7CisJCWNhc2UgJyMnOgorCQkJaWYgKG1lbWNtcChsaW5lICsgMiwgIkNPTkZJR18iLCA3KSkKKwkJCQljb250aW51ZTsKKwkJCXAgPSBzdHJjaHIobGluZSArIDksICcgJyk7CisJCQlpZiAoIXApCisJCQkJY29udGludWU7CisJCQkqcCsrID0gMDsKKwkJCWlmIChzdHJuY21wKHAsICJpcyBub3Qgc2V0IiwgMTApKQorCQkJCWNvbnRpbnVlOworCQkJc3ltID0gc3ltX2ZpbmQobGluZSArIDkpOworCQkJaWYgKCFzeW0pIHsKKwkJCQljb25mX3dhcm5pbmcoInRyeWluZyB0byBhc3NpZ24gbm9uZXhpc3RlbnQgc3ltYm9sICVzIiwgbGluZSArIDkpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmICghKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfTkVXKSkgeworCQkJCWNvbmZfd2FybmluZygidHJ5aW5nIHRvIHJlYXNzaWduIHN5bWJvbCAlcyIsIHN5bS0+bmFtZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCQkJY2FzZSBTX0JPT0xFQU46CisJCQljYXNlIFNfVFJJU1RBVEU6CisJCQkJc3ltLT51c2VyLnRyaSA9IG5vOworCQkJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9ORVc7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdDJzoKKwkJCWlmIChtZW1jbXAobGluZSwgIkNPTkZJR18iLCA3KSkgeworCQkJCWNvbmZfd2FybmluZygidW5leHBlY3RlZCBkYXRhIik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlwID0gc3RyY2hyKGxpbmUgKyA3LCAnPScpOworCQkJaWYgKCFwKQorCQkJCWNvbnRpbnVlOworCQkJKnArKyA9IDA7CisJCQlwMiA9IHN0cmNocihwLCAnXG4nKTsKKwkJCWlmIChwMikKKwkJCQkqcDIgPSAwOworCQkJc3ltID0gc3ltX2ZpbmQobGluZSArIDcpOworCQkJaWYgKCFzeW0pIHsKKwkJCQljb25mX3dhcm5pbmcoInRyeWluZyB0byBhc3NpZ24gbm9uZXhpc3RlbnQgc3ltYm9sICVzIiwgbGluZSArIDcpOworCQkJCWJyZWFrOworCQkJfSBlbHNlIGlmICghKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfTkVXKSkgeworCQkJCWNvbmZfd2FybmluZygidHJ5aW5nIHRvIHJlYXNzaWduIHN5bWJvbCAlcyIsIHN5bS0+bmFtZSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCQkJY2FzZSBTX1RSSVNUQVRFOgorCQkJCWlmIChwWzBdID09ICdtJykgeworCQkJCQlzeW0tPnVzZXIudHJpID0gbW9kOworCQkJCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfTkVXOworCQkJCQlicmVhazsKKwkJCQl9CisJCQljYXNlIFNfQk9PTEVBTjoKKwkJCQlpZiAocFswXSA9PSAneScpIHsKKwkJCQkJc3ltLT51c2VyLnRyaSA9IHllczsKKwkJCQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX05FVzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWlmIChwWzBdID09ICduJykgeworCQkJCQlzeW0tPnVzZXIudHJpID0gbm87CisJCQkJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9ORVc7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQljb25mX3dhcm5pbmcoInN5bWJvbCB2YWx1ZSAnJXMnIGludmFsaWQgZm9yICVzIiwgcCwgc3ltLT5uYW1lKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgU19TVFJJTkc6CisJCQkJaWYgKCpwKysgIT0gJyInKQorCQkJCQlicmVhazsKKwkJCQlmb3IgKHAyID0gcDsgKHAyID0gc3RycGJyayhwMiwgIlwiXFwiKSk7IHAyKyspIHsKKwkJCQkJaWYgKCpwMiA9PSAnIicpIHsKKwkJCQkJCSpwMiA9IDA7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQltZW1tb3ZlKHAyLCBwMiArIDEsIHN0cmxlbihwMikpOworCQkJCX0KKwkJCQlpZiAoIXAyKSB7CisJCQkJCWNvbmZfd2FybmluZygiaW52YWxpZCBzdHJpbmcgZm91bmQiKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJY2FzZSBTX0lOVDoKKwkJCWNhc2UgU19IRVg6CisJCQkJaWYgKHN5bV9zdHJpbmdfdmFsaWQoc3ltLCBwKSkgeworCQkJCQlzeW0tPnVzZXIudmFsID0gc3RyZHVwKHApOworCQkJCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfTkVXOworCQkJCX0gZWxzZSB7CisJCQkJCWlmIChwWzBdKSAvKiBiYm94ICovCisJCQkJCQljb25mX3dhcm5pbmcoInN5bWJvbCB2YWx1ZSAnJXMnIGludmFsaWQgZm9yICVzIiwgcCwgc3ltLT5uYW1lKTsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnXG4nOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQljb25mX3dhcm5pbmcoInVuZXhwZWN0ZWQgZGF0YSIpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHN5bSAmJiBzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkpIHsKKwkJCXN0cnVjdCBzeW1ib2wgKmNzID0gcHJvcF9nZXRfc3ltYm9sKHN5bV9nZXRfY2hvaWNlX3Byb3Aoc3ltKSk7CisJCQlzd2l0Y2ggKHN5bS0+dXNlci50cmkpIHsKKwkJCWNhc2Ugbm86CisJCQkJYnJlYWs7CisJCQljYXNlIG1vZDoKKwkJCQlpZiAoY3MtPnVzZXIudHJpID09IHllcykgeworCQkJCQljb25mX3dhcm5pbmcoIiVzIGNyZWF0ZXMgaW5jb25zaXN0ZW50IGNob2ljZSBzdGF0ZSIsIHN5bS0+bmFtZSk7CisJCQkJCWNzLT5mbGFncyB8PSBTWU1CT0xfTkVXOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgeWVzOgorCQkJCWlmIChjcy0+dXNlci50cmkgIT0gbm8pIHsKKwkJCQkJY29uZl93YXJuaW5nKCIlcyBjcmVhdGVzIGluY29uc2lzdGVudCBjaG9pY2Ugc3RhdGUiLCBzeW0tPm5hbWUpOworCQkJCQljcy0+ZmxhZ3MgfD0gU1lNQk9MX05FVzsKKwkJCQl9IGVsc2UKKwkJCQkJY3MtPnVzZXIudmFsID0gc3ltOworCQkJCWJyZWFrOworCQkJfQorCQkJY3MtPnVzZXIudHJpID0gRV9PUihjcy0+dXNlci50cmksIHN5bS0+dXNlci50cmkpOworCQl9CisJfQorCWZjbG9zZShpbik7CisKKwlpZiAobW9kdWxlc19zeW0pCisJCXN5bV9jYWxjX3ZhbHVlKG1vZHVsZXNfc3ltKTsKKwlyZXR1cm4gMDsKK30KKworaW50IGNvbmZfcmVhZChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IGV4cHIgKmU7CisJaW50IGk7CisKKwlpZiAoY29uZl9yZWFkX3NpbXBsZShuYW1lKSkKKwkJcmV0dXJuIDE7CisKKwlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSB7CisJCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CisJCWlmIChzeW1faXNfY2hvaWNlKHN5bSkgfHwgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfQVVUTykpCisJCQlnb3RvIHN5bV9vazsKKwkJaWYgKHN5bV9oYXNfdmFsdWUoc3ltKSAmJiAoc3ltLT5mbGFncyAmIFNZTUJPTF9XUklURSkpIHsKKwkJCS8qIGNoZWNrIHRoYXQgY2FsY3VsYXRlZCB2YWx1ZSBhZ3JlZXMgd2l0aCBzYXZlZCB2YWx1ZSAqLworCQkJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwkJCWNhc2UgU19CT09MRUFOOgorCQkJY2FzZSBTX1RSSVNUQVRFOgorCQkJCWlmIChzeW0tPnVzZXIudHJpICE9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKSkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKCFzeW1faXNfY2hvaWNlKHN5bSkpCisJCQkJCWdvdG8gc3ltX29rOworCQkJZGVmYXVsdDoKKwkJCQlpZiAoIXN0cmNtcChzeW0tPmN1cnIudmFsLCBzeW0tPnVzZXIudmFsKSkKKwkJCQkJZ290byBzeW1fb2s7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSBpZiAoIXN5bV9oYXNfdmFsdWUoc3ltKSAmJiAhKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfV1JJVEUpKQorCQkJLyogbm8gcHJldmlvdXMgdmFsdWUgYW5kIG5vdCBzYXZlZCAqLworCQkJZ290byBzeW1fb2s7CisJCWNvbmZfdW5zYXZlZCsrOworCQkvKiBtYXliZSBwcmludCB2YWx1ZSBpbiB2ZXJib3NlIG1vZGUuLi4gKi8KKwlzeW1fb2s6CisJCWlmIChzeW1faGFzX3ZhbHVlKHN5bSkgJiYgIXN5bV9pc19jaG9pY2VfdmFsdWUoc3ltKSkgeworCQkJaWYgKHN5bS0+dmlzaWJsZSA9PSBubykKKwkJCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9ORVc7CisJCQlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCQkJY2FzZSBTX1NUUklORzoKKwkJCWNhc2UgU19JTlQ6CisJCQljYXNlIFNfSEVYOgorCQkJCWlmICghc3ltX3N0cmluZ193aXRoaW5fcmFuZ2Uoc3ltLCBzeW0tPnVzZXIudmFsKSkgeworCQkJCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9ORVc7CisJCQkJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9WQUxJRDsKKwkJCQl9CisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWlmICghc3ltX2lzX2Nob2ljZShzeW0pKQorCQkJY29udGludWU7CisJCXByb3AgPSBzeW1fZ2V0X2Nob2ljZV9wcm9wKHN5bSk7CisJCWZvciAoZSA9IHByb3AtPmV4cHI7IGU7IGUgPSBlLT5sZWZ0LmV4cHIpCisJCQlpZiAoZS0+cmlnaHQuc3ltLT52aXNpYmxlICE9IG5vKQorCQkJCXN5bS0+ZmxhZ3MgfD0gZS0+cmlnaHQuc3ltLT5mbGFncyAmIFNZTUJPTF9ORVc7CisJfQorCisJc3ltX2NoYW5nZV9jb3VudCA9IGNvbmZfd2FybmluZ3MgfHwgY29uZl91bnNhdmVkOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjb25mX3dyaXRlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJRklMRSAqb3V0LCAqb3V0X2g7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBtZW51ICptZW51OworCWNvbnN0IGNoYXIgKmJhc2VuYW1lOworCWNoYXIgZGlybmFtZVsxMjhdLCB0bXBuYW1lWzEyOF0sIG5ld25hbWVbMTI4XTsKKwlpbnQgdHlwZSwgbDsKKwljb25zdCBjaGFyICpzdHI7CisJdGltZV90IG5vdzsKKwlpbnQgdXNlX3RpbWVzdGFtcCA9IDE7CisJY2hhciAqZW52OworCisJZGlybmFtZVswXSA9IDA7CisJaWYgKG5hbWUgJiYgbmFtZVswXSkgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJY2hhciAqc2xhc2g7CisKKwkJaWYgKCFzdGF0KG5hbWUsICZzdCkgJiYgU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJc3RyY3B5KGRpcm5hbWUsIG5hbWUpOworCQkJc3RyY2F0KGRpcm5hbWUsICIvIik7CisJCQliYXNlbmFtZSA9IGNvbmZfZGVmX2ZpbGVuYW1lOworCQl9IGVsc2UgaWYgKChzbGFzaCA9IHN0cnJjaHIobmFtZSwgJy8nKSkpIHsKKwkJCWludCBzaXplID0gc2xhc2ggLSBuYW1lICsgMTsKKwkJCW1lbWNweShkaXJuYW1lLCBuYW1lLCBzaXplKTsKKwkJCWRpcm5hbWVbc2l6ZV0gPSAwOworCQkJaWYgKHNsYXNoWzFdKQorCQkJCWJhc2VuYW1lID0gc2xhc2ggKyAxOworCQkJZWxzZQorCQkJCWJhc2VuYW1lID0gY29uZl9kZWZfZmlsZW5hbWU7CisJCX0gZWxzZQorCQkJYmFzZW5hbWUgPSBuYW1lOworCX0gZWxzZQorCQliYXNlbmFtZSA9IGNvbmZfZGVmX2ZpbGVuYW1lOworCisJc3ByaW50ZihuZXduYW1lLCAiJXMudG1wY29uZmlnLiVkIiwgZGlybmFtZSwgKGludClnZXRwaWQoKSk7CisJb3V0ID0gZm9wZW4obmV3bmFtZSwgInciKTsKKwlpZiAoIW91dCkKKwkJcmV0dXJuIDE7CisJb3V0X2ggPSBOVUxMOworCWlmICghbmFtZSkgeworCQlvdXRfaCA9IGZvcGVuKCIudG1wY29uZmlnLmgiLCAidyIpOworCQlpZiAoIW91dF9oKQorCQkJcmV0dXJuIDE7CisJCWZpbGVfd3JpdGVfZGVwKE5VTEwpOworCX0KKwlzeW0gPSBzeW1fbG9va3VwKCJLRVJORUxWRVJTSU9OIiwgMCk7CisJc3ltX2NhbGNfdmFsdWUoc3ltKTsKKwl0aW1lKCZub3cpOworCWVudiA9IGdldGVudigiS0NPTkZJR19OT1RJTUVTVEFNUCIpOworCWlmIChlbnYgJiYgKmVudikKKwkJdXNlX3RpbWVzdGFtcCA9IDA7CisKKwlmcHJpbnRmKG91dCwgXygiI1xuIgorCQkgICAgICAgIiMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXRcbiIKKwkJICAgICAgICIjIEJ1c3lib3ggdmVyc2lvbjogJXNcbiIKKwkJICAgICAgICIlcyVzIgorCQkgICAgICAgIiNcbiIpLAorCQkgICAgIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSksCisJCSAgICAgdXNlX3RpbWVzdGFtcCA/ICIjICIgOiAiIiwKKwkJICAgICB1c2VfdGltZXN0YW1wID8gY3RpbWUoJm5vdykgOiAiIik7CisJaWYgKG91dF9oKSB7CisJCWNoYXIgYnVmW3NpemVvZigiI2RlZmluZSBBVVRPQ09ORl9USU1FU1RBTVAgIgorCQkJCSJcIllZWVktTU0tREQgSEg6TU06U1Mgc29tZV90aW1lem9uZVwiXG4iKV07CisJCWJ1ZlswXSA9ICdcMCc7CisJCWlmICh1c2VfdGltZXN0YW1wKSB7CisJCQlzaXplX3QgcmV0ID0gXAorCQkJCXN0cmZ0aW1lKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIjZGVmaW5lIEFVVE9DT05GX1RJTUVTVEFNUCAiCisJCQkJCSJcIiVZLSVtLSVkICVIOiVNOiVTICVaXCJcbiIsIGxvY2FsdGltZSgmbm93KSk7CisJCQkvKiBpZiB1c2VyIGhhcyBGYWN0b3J5IHRpbWV6b25lIG9yIHNvbWUgb3RoZXIgb2RkIGluc3RhbGwsIHRoZQorCQkJICogJVogYWJvdmUgd2lsbCBvdmVyZmxvdyB0aGUgc3RyaW5nIGxlYXZpbmcgdXMgd2l0aCB1bmRlZmluZWQKKwkJCSAqIHJlc3VsdHMgLi4uIHNvIGxldCdzIHRyeSBhZ2FpbiB3aXRob3V0IHRoZSB0aW1lem9uZS4KKwkJCSAqLworCQkJaWYgKHJldCA9PSAwKQorCQkJCXN0cmZ0aW1lKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIjZGVmaW5lIEFVVE9DT05GX1RJTUVTVEFNUCAiCisJCQkJCSJcIiVZLSVtLSVkICVIOiVNOiVTXCJcbiIsIGxvY2FsdGltZSgmbm93KSk7CisJCX0gZWxzZSB7IC8qIGJib3ggKi8KKwkJCXN0cmNweShidWYsICIjZGVmaW5lIEFVVE9DT05GX1RJTUVTVEFNUCBcIlwiXG4iKTsKKwkJfQorCQlmcHJpbnRmKG91dF9oLCAiLypcbiIKKwkJCSAgICAgICAiICogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgQyBjb25maWc6IGRvbid0IGVkaXRcbiIKKwkJCSAgICAgICAiICogQnVzeWJveCB2ZXJzaW9uOiAlc1xuIgorCQkJICAgICAgICIgKi9cbiIKKwkJCSAgICAgICAiJXMiCisJCQkgICAgICAgIlxuIiwKKwkJCSAgICAgICBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pLAorCQkJICAgICAgIGJ1Zik7CisJfQorCWlmICghc3ltX2NoYW5nZV9jb3VudCkKKwkJc3ltX2NsZWFyX2FsbF92YWxpZCgpOworCisJbWVudSA9IHJvb3RtZW51Lmxpc3Q7CisJd2hpbGUgKG1lbnUpIHsKKwkJc3ltID0gbWVudS0+c3ltOworCQlpZiAoIXN5bSkgeworCQkJaWYgKCFtZW51X2lzX3Zpc2libGUobWVudSkpCisJCQkJZ290byBuZXh0OworCQkJc3RyID0gbWVudV9nZXRfcHJvbXB0KG1lbnUpOworCQkJZnByaW50ZihvdXQsICJcbiIKKwkJCQkgICAgICIjXG4iCisJCQkJICAgICAiIyAlc1xuIgorCQkJCSAgICAgIiNcbiIsIHN0cik7CisJCQlpZiAob3V0X2gpCisJCQkJZnByaW50ZihvdXRfaCwgIlxuIgorCQkJCQkgICAgICAgIi8qXG4iCisJCQkJCSAgICAgICAiICogJXNcbiIKKwkJCQkJICAgICAgICIgKi9cbiIsIHN0cik7CisJCX0gZWxzZSBpZiAoIShzeW0tPmZsYWdzICYgU1lNQk9MX0NIT0lDRSkpIHsKKwkJCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CisvKiBiYm94OiB3ZSB3YW50IHRvIHNlZSBhbGwgc3ltcworCQkJaWYgKCEoc3ltLT5mbGFncyAmIFNZTUJPTF9XUklURSkpCisJCQkJZ290byBuZXh0OworKi8KKwkJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9XUklURTsKKwkJCXR5cGUgPSBzeW0tPnR5cGU7CisJCQlpZiAodHlwZSA9PSBTX1RSSVNUQVRFKSB7CisJCQkJc3ltX2NhbGNfdmFsdWUobW9kdWxlc19zeW0pOworCQkJCWlmIChtb2R1bGVzX3N5bS0+Y3Vyci50cmkgPT0gbm8pCisJCQkJCXR5cGUgPSBTX0JPT0xFQU47CisJCQl9CisJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCWNhc2UgU19CT09MRUFOOgorCQkJY2FzZSBTX1RSSVNUQVRFOgorCQkJCXN3aXRjaCAoc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pKSB7CisJCQkJY2FzZSBubzoKKwkJCQkJZnByaW50ZihvdXQsICIjIENPTkZJR18lcyBpcyBub3Qgc2V0XG4iLCBzeW0tPm5hbWUpOworCQkJCQlpZiAob3V0X2gpIHsKKwkJCQkJCWZwcmludGYob3V0X2gsICIjdW5kZWYgQ09ORklHXyVzXG4iLCBzeW0tPm5hbWUpOworCQkJCQkJLyogYmJveCAqLworCQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgRU5BQkxFXyVzIDBcbiIsIHN5bS0+bmFtZSk7CisJCQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBJRl8lcyguLi4pXG4iLCBzeW0tPm5hbWUpOworCQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgSUZfTk9UXyVzKC4uLikgX19WQV9BUkdTX19cbiIsIHN5bS0+bmFtZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBtb2Q6CisJCQkJCWZwcmludGYob3V0LCAiQ09ORklHXyVzPW1cbiIsIHN5bS0+bmFtZSk7CisJCQkJCWlmIChvdXRfaCkKKwkJCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIENPTkZJR18lc19NT0RVTEUgMVxuIiwgc3ltLT5uYW1lKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSB5ZXM6CisJCQkJCWZwcmludGYob3V0LCAiQ09ORklHXyVzPXlcbiIsIHN5bS0+bmFtZSk7CisJCQkJCWlmIChvdXRfaCkgeworCQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgQ09ORklHXyVzIDFcbiIsIHN5bS0+bmFtZSk7CisJCQkJCQkvKiBiYm94ICovCisJCQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBFTkFCTEVfJXMgMVxuIiwgc3ltLT5uYW1lKTsKKwkJCQkJCWZwcmludGYob3V0X2gsICIjaWZkZWYgTUFLRV9TVUlEXG4iKTsKKwkJCQkJCWZwcmludGYob3V0X2gsICIjIGRlZmluZSBJRl8lcyguLi4pIF9fVkFfQVJHU19fIFwiQ09ORklHXyVzXCJcbiIsIHN5bS0+bmFtZSwgc3ltLT5uYW1lKTsKKwkJCQkJCWZwcmludGYob3V0X2gsICIjZWxzZVxuIik7CisJCQkJCQlmcHJpbnRmKG91dF9oLCAiIyBkZWZpbmUgSUZfJXMoLi4uKSBfX1ZBX0FSR1NfX1xuIiwgc3ltLT5uYW1lKTsKKwkJCQkJCWZwcmludGYob3V0X2gsICIjZW5kaWZcbiIpOworCQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgSUZfTk9UXyVzKC4uLilcbiIsIHN5bS0+bmFtZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBTX1NUUklORzoKKwkJCQkvLyBmaXggbWUKKwkJCQlzdHIgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pOworCQkJCWZwcmludGYob3V0LCAiQ09ORklHXyVzPVwiIiwgc3ltLT5uYW1lKTsKKwkJCQlpZiAob3V0X2gpCisJCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIENPTkZJR18lcyBcIiIsIHN5bS0+bmFtZSk7CisJCQkJZG8geworCQkJCQlsID0gc3RyY3NwbihzdHIsICJcIlxcIik7CisJCQkJCWlmIChsKSB7CisJCQkJCQlmd3JpdGUoc3RyLCBsLCAxLCBvdXQpOworCQkJCQkJaWYgKG91dF9oKQorCQkJCQkJCWZ3cml0ZShzdHIsIGwsIDEsIG91dF9oKTsKKwkJCQkJfQorCQkJCQlzdHIgKz0gbDsKKwkJCQkJd2hpbGUgKCpzdHIgPT0gJ1xcJyB8fCAqc3RyID09ICciJykgeworCQkJCQkJZnByaW50ZihvdXQsICJcXCVjIiwgKnN0cik7CisJCQkJCQlpZiAob3V0X2gpCisJCQkJCQkJZnByaW50ZihvdXRfaCwgIlxcJWMiLCAqc3RyKTsKKwkJCQkJCXN0cisrOworCQkJCQl9CisJCQkJfSB3aGlsZSAoKnN0cik7CisJCQkJZnB1dHMoIlwiXG4iLCBvdXQpOworCQkJCWlmIChvdXRfaCkgeworCQkJCQlmcHV0cygiXCJcbiIsIG91dF9oKTsKKwkJCQkJLyogYmJveCAqLworCQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBFTkFCTEVfJXMgMVxuIiwgc3ltLT5uYW1lKTsKKwkJCQkJZnByaW50ZihvdXRfaCwgIiNpZmRlZiBNQUtFX1NVSURcbiIpOworCQkJCQlmcHJpbnRmKG91dF9oLCAiIyBkZWZpbmUgSUZfJXMoLi4uKSBfX1ZBX0FSR1NfXyBcIkNPTkZJR18lc1wiXG4iLCBzeW0tPm5hbWUsIHN5bS0+bmFtZSk7CisJCQkJCWZwcmludGYob3V0X2gsICIjZWxzZVxuIik7CisJCQkJCWZwcmludGYob3V0X2gsICIjIGRlZmluZSBJRl8lcyguLi4pIF9fVkFfQVJHU19fXG4iLCBzeW0tPm5hbWUpOworCQkJCQlmcHJpbnRmKG91dF9oLCAiI2VuZGlmXG4iKTsKKwkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgSUZfTk9UXyVzKC4uLilcbiIsIHN5bS0+bmFtZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBTX0hFWDoKKwkJCQlzdHIgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pOworCQkJCWlmIChzdHJbMF0gIT0gJzAnIHx8IChzdHJbMV0gIT0gJ3gnICYmIHN0clsxXSAhPSAnWCcpKSB7CisJCQkJCWZwcmludGYob3V0LCAiQ09ORklHXyVzPSVzXG4iLCBzeW0tPm5hbWUsIHN0cik7CisJCQkJCWlmIChvdXRfaCkgeworCQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgQ09ORklHXyVzIDB4JXNcbiIsIHN5bS0+bmFtZSwgc3RyKTsKKwkJCQkJCS8qIGJib3ggKi8KKwkJCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIEVOQUJMRV8lcyAxXG4iLCBzeW0tPm5hbWUpOworCQkJCQkJZnByaW50ZihvdXRfaCwgIiNpZmRlZiBNQUtFX1NVSURcbiIpOworCQkJCQkJZnByaW50ZihvdXRfaCwgIiMgZGVmaW5lIElGXyVzKC4uLikgX19WQV9BUkdTX18gXCJDT05GSUdfJXNcIlxuIiwgc3ltLT5uYW1lLCBzeW0tPm5hbWUpOworCQkJCQkJZnByaW50ZihvdXRfaCwgIiNlbHNlXG4iKTsKKwkJCQkJCWZwcmludGYob3V0X2gsICIjIGRlZmluZSBJRl8lcyguLi4pIF9fVkFfQVJHU19fXG4iLCBzeW0tPm5hbWUpOworCQkJCQkJZnByaW50ZihvdXRfaCwgIiNlbmRpZlxuIik7CisJCQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBJRl9OT1RfJXMoLi4uKVxuIiwgc3ltLT5uYW1lKTsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQl9CisJCQljYXNlIFNfSU5UOgorCQkJCXN0ciA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7CisJCQkJaWYgKCFzdHJbMF0pCisJCQkJCXN0ciA9ICIwIjsKKwkJCQlmcHJpbnRmKG91dCwgIkNPTkZJR18lcz0lc1xuIiwgc3ltLT5uYW1lLCBzdHIpOworCQkJCWlmIChvdXRfaCkgeworCQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBDT05GSUdfJXMgJXNcbiIsIHN5bS0+bmFtZSwgc3RyKTsKKwkJCQkJLyogYmJveCAqLworCQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBFTkFCTEVfJXMgMVxuIiwgc3ltLT5uYW1lKTsKKwkJCQkJZnByaW50ZihvdXRfaCwgIiNpZmRlZiBNQUtFX1NVSURcbiIpOworCQkJCQlmcHJpbnRmKG91dF9oLCAiIyBkZWZpbmUgSUZfJXMoLi4uKSBfX1ZBX0FSR1NfXyBcIkNPTkZJR18lc1wiXG4iLCBzeW0tPm5hbWUsIHN5bS0+bmFtZSk7CisJCQkJCWZwcmludGYob3V0X2gsICIjZWxzZVxuIik7CisJCQkJCWZwcmludGYob3V0X2gsICIjIGRlZmluZSBJRl8lcyguLi4pIF9fVkFfQVJHU19fXG4iLCBzeW0tPm5hbWUpOworCQkJCQlmcHJpbnRmKG91dF9oLCAiI2VuZGlmXG4iKTsKKwkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgSUZfTk9UXyVzKC4uLilcbiIsIHN5bS0+bmFtZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwluZXh0OgorCQlpZiAobWVudS0+bGlzdCkgeworCQkJbWVudSA9IG1lbnUtPmxpc3Q7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAobWVudS0+bmV4dCkKKwkJCW1lbnUgPSBtZW51LT5uZXh0OworCQllbHNlIHdoaWxlICgobWVudSA9IG1lbnUtPnBhcmVudCkpIHsKKwkJCWlmIChtZW51LT5uZXh0KSB7CisJCQkJbWVudSA9IG1lbnUtPm5leHQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJZmNsb3NlKG91dCk7CisJaWYgKG91dF9oKSB7CisJCWZjbG9zZShvdXRfaCk7CisJCXJlbmFtZSgiLnRtcGNvbmZpZy5oIiwgImluY2x1ZGUvYXV0b2NvbmYuaCIpOworCX0KKwlpZiAoIW5hbWUgfHwgYmFzZW5hbWUgIT0gY29uZl9kZWZfZmlsZW5hbWUpIHsKKwkJaWYgKCFuYW1lKQorCQkJbmFtZSA9IGNvbmZfZGVmX2ZpbGVuYW1lOworCQlzcHJpbnRmKHRtcG5hbWUsICIlcy5vbGQiLCBuYW1lKTsKKwkJcmVuYW1lKG5hbWUsIHRtcG5hbWUpOworCX0KKwlzcHJpbnRmKHRtcG5hbWUsICIlcyVzIiwgZGlybmFtZSwgYmFzZW5hbWUpOworCWlmIChyZW5hbWUobmV3bmFtZSwgdG1wbmFtZSkpCisJCXJldHVybiAxOworCisJc3ltX2NoYW5nZV9jb3VudCA9IDA7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9leHByLmMgYi9zY3JpcHRzL2tjb25maWcvZXhwci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMzllN2EKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvZXhwci5jCkBAIC0wLDAgKzEsMTA5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIExLQ19ESVJFQ1RfTElOSworI2luY2x1ZGUgImxrYy5oIgorCisjZGVmaW5lIERFQlVHX0VYUFIJMAorCitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19zeW1ib2woc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBleHByICplID0gbWFsbG9jKHNpemVvZigqZSkpOworCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKKwllLT50eXBlID0gRV9TWU1CT0w7CisJZS0+bGVmdC5zeW0gPSBzeW07CisJcmV0dXJuIGU7Cit9CisKK3N0cnVjdCBleHByICpleHByX2FsbG9jX29uZShlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqY2UpCit7CisJc3RydWN0IGV4cHIgKmUgPSBtYWxsb2Moc2l6ZW9mKCplKSk7CisJbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOworCWUtPnR5cGUgPSB0eXBlOworCWUtPmxlZnQuZXhwciA9IGNlOworCXJldHVybiBlOworfQorCitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY190d28oZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpCit7CisJc3RydWN0IGV4cHIgKmUgPSBtYWxsb2Moc2l6ZW9mKCplKSk7CisJbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOworCWUtPnR5cGUgPSB0eXBlOworCWUtPmxlZnQuZXhwciA9IGUxOworCWUtPnJpZ2h0LmV4cHIgPSBlMjsKKwlyZXR1cm4gZTsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2NfY29tcChlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzMSwgc3RydWN0IHN5bWJvbCAqczIpCit7CisJc3RydWN0IGV4cHIgKmUgPSBtYWxsb2Moc2l6ZW9mKCplKSk7CisJbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOworCWUtPnR5cGUgPSB0eXBlOworCWUtPmxlZnQuc3ltID0gczE7CisJZS0+cmlnaHQuc3ltID0gczI7CisJcmV0dXJuIGU7Cit9CisKK3N0cnVjdCBleHByICpleHByX2FsbG9jX2FuZChzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMikKK3sKKwlpZiAoIWUxKQorCQlyZXR1cm4gZTI7CisJcmV0dXJuIGUyID8gZXhwcl9hbGxvY190d28oRV9BTkQsIGUxLCBlMikgOiBlMTsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2Nfb3Ioc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpCit7CisJaWYgKCFlMSkKKwkJcmV0dXJuIGUyOworCXJldHVybiBlMiA/IGV4cHJfYWxsb2NfdHdvKEVfT1IsIGUxLCBlMikgOiBlMTsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfY29weShzdHJ1Y3QgZXhwciAqb3JnKQoreworCXN0cnVjdCBleHByICplOworCisJaWYgKCFvcmcpCisJCXJldHVybiBOVUxMOworCisJZSA9IG1hbGxvYyhzaXplb2YoKm9yZykpOworCW1lbWNweShlLCBvcmcsIHNpemVvZigqb3JnKSk7CisJc3dpdGNoIChvcmctPnR5cGUpIHsKKwljYXNlIEVfU1lNQk9MOgorCQllLT5sZWZ0ID0gb3JnLT5sZWZ0OworCQlicmVhazsKKwljYXNlIEVfTk9UOgorCQllLT5sZWZ0LmV4cHIgPSBleHByX2NvcHkob3JnLT5sZWZ0LmV4cHIpOworCQlicmVhazsKKwljYXNlIEVfRVFVQUw6CisJY2FzZSBFX1VORVFVQUw6CisJCWUtPmxlZnQuc3ltID0gb3JnLT5sZWZ0LnN5bTsKKwkJZS0+cmlnaHQuc3ltID0gb3JnLT5yaWdodC5zeW07CisJCWJyZWFrOworCWNhc2UgRV9BTkQ6CisJY2FzZSBFX09SOgorCWNhc2UgRV9DSE9JQ0U6CisJCWUtPmxlZnQuZXhwciA9IGV4cHJfY29weShvcmctPmxlZnQuZXhwcik7CisJCWUtPnJpZ2h0LmV4cHIgPSBleHByX2NvcHkob3JnLT5yaWdodC5leHByKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJjYW4ndCBjb3B5IHR5cGUgJWRcbiIsIGUtPnR5cGUpOworCQlmcmVlKGUpOworCQllID0gTlVMTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGU7Cit9CisKK3ZvaWQgZXhwcl9mcmVlKHN0cnVjdCBleHByICplKQoreworCWlmICghZSkKKwkJcmV0dXJuOworCisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX1NZTUJPTDoKKwkJYnJlYWs7CisJY2FzZSBFX05PVDoKKwkJZXhwcl9mcmVlKGUtPmxlZnQuZXhwcik7CisJCXJldHVybjsKKwljYXNlIEVfRVFVQUw6CisJY2FzZSBFX1VORVFVQUw6CisJCWJyZWFrOworCWNhc2UgRV9PUjoKKwljYXNlIEVfQU5EOgorCQlleHByX2ZyZWUoZS0+bGVmdC5leHByKTsKKwkJZXhwcl9mcmVlKGUtPnJpZ2h0LmV4cHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoImhvdyB0byBmcmVlIHR5cGUgJWQ/XG4iLCBlLT50eXBlKTsKKwkJYnJlYWs7CisJfQorCWZyZWUoZSk7Cit9CisKK3N0YXRpYyBpbnQgdHJhbnNfY291bnQ7CisKKyNkZWZpbmUgZTEgKCplcDEpCisjZGVmaW5lIGUyICgqZXAyKQorCitzdGF0aWMgdm9pZCBfX2V4cHJfZWxpbWluYXRlX2VxKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMikKK3sKKwlpZiAoZTEtPnR5cGUgPT0gdHlwZSkgeworCQlfX2V4cHJfZWxpbWluYXRlX2VxKHR5cGUsICZlMS0+bGVmdC5leHByLCAmZTIpOworCQlfX2V4cHJfZWxpbWluYXRlX2VxKHR5cGUsICZlMS0+cmlnaHQuZXhwciwgJmUyKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZTItPnR5cGUgPT0gdHlwZSkgeworCQlfX2V4cHJfZWxpbWluYXRlX2VxKHR5cGUsICZlMSwgJmUyLT5sZWZ0LmV4cHIpOworCQlfX2V4cHJfZWxpbWluYXRlX2VxKHR5cGUsICZlMSwgJmUyLT5yaWdodC5leHByKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZTEtPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTItPnR5cGUgPT0gRV9TWU1CT0wgJiYKKwkgICAgZTEtPmxlZnQuc3ltID09IGUyLT5sZWZ0LnN5bSAmJiAoZTEtPmxlZnQuc3ltLT5mbGFncyAmIChTWU1CT0xfWUVTfFNZTUJPTF9OTykpKQorCQlyZXR1cm47CisJaWYgKCFleHByX2VxKGUxLCBlMikpCisJCXJldHVybjsKKwl0cmFuc19jb3VudCsrOworCWV4cHJfZnJlZShlMSk7IGV4cHJfZnJlZShlMik7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBFX09SOgorCQllMSA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQllMiA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQlicmVhazsKKwljYXNlIEVfQU5EOgorCQllMSA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfeWVzKTsKKwkJZTIgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX3llcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsKKwl9Cit9CisKK3ZvaWQgZXhwcl9lbGltaW5hdGVfZXEoc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKQoreworCWlmICghZTEgfHwgIWUyKQorCQlyZXR1cm47CisJc3dpdGNoIChlMS0+dHlwZSkgeworCWNhc2UgRV9PUjoKKwljYXNlIEVfQU5EOgorCQlfX2V4cHJfZWxpbWluYXRlX2VxKGUxLT50eXBlLCBlcDEsIGVwMik7CisJZGVmYXVsdDoKKwkJOworCX0KKwlpZiAoZTEtPnR5cGUgIT0gZTItPnR5cGUpIHN3aXRjaCAoZTItPnR5cGUpIHsKKwljYXNlIEVfT1I6CisJY2FzZSBFX0FORDoKKwkJX19leHByX2VsaW1pbmF0ZV9lcShlMi0+dHlwZSwgZXAxLCBlcDIpOworCWRlZmF1bHQ6CisJCTsKKwl9CisJZTEgPSBleHByX2VsaW1pbmF0ZV95bihlMSk7CisJZTIgPSBleHByX2VsaW1pbmF0ZV95bihlMik7Cit9CisKKyN1bmRlZiBlMQorI3VuZGVmIGUyCisKK2ludCBleHByX2VxKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKQoreworCWludCByZXMsIG9sZF9jb3VudDsKKworCWlmIChlMS0+dHlwZSAhPSBlMi0+dHlwZSkKKwkJcmV0dXJuIDA7CisJc3dpdGNoIChlMS0+dHlwZSkgeworCWNhc2UgRV9FUVVBTDoKKwljYXNlIEVfVU5FUVVBTDoKKwkJcmV0dXJuIGUxLT5sZWZ0LnN5bSA9PSBlMi0+bGVmdC5zeW0gJiYgZTEtPnJpZ2h0LnN5bSA9PSBlMi0+cmlnaHQuc3ltOworCWNhc2UgRV9TWU1CT0w6CisJCXJldHVybiBlMS0+bGVmdC5zeW0gPT0gZTItPmxlZnQuc3ltOworCWNhc2UgRV9OT1Q6CisJCXJldHVybiBleHByX2VxKGUxLT5sZWZ0LmV4cHIsIGUyLT5sZWZ0LmV4cHIpOworCWNhc2UgRV9BTkQ6CisJY2FzZSBFX09SOgorCQllMSA9IGV4cHJfY29weShlMSk7CisJCWUyID0gZXhwcl9jb3B5KGUyKTsKKwkJb2xkX2NvdW50ID0gdHJhbnNfY291bnQ7CisJCWV4cHJfZWxpbWluYXRlX2VxKCZlMSwgJmUyKTsKKwkJcmVzID0gKGUxLT50eXBlID09IEVfU1lNQk9MICYmIGUyLT50eXBlID09IEVfU1lNQk9MICYmCisJCSAgICAgICBlMS0+bGVmdC5zeW0gPT0gZTItPmxlZnQuc3ltKTsKKwkJZXhwcl9mcmVlKGUxKTsKKwkJZXhwcl9mcmVlKGUyKTsKKwkJdHJhbnNfY291bnQgPSBvbGRfY291bnQ7CisJCXJldHVybiByZXM7CisJY2FzZSBFX0NIT0lDRToKKwljYXNlIEVfUkFOR0U6CisJY2FzZSBFX05PTkU6CisJCS8qIHBhbmljICovOworCX0KKworCWlmIChERUJVR19FWFBSKSB7CisJCWV4cHJfZnByaW50KGUxLCBzdGRvdXQpOworCQlwcmludGYoIiA9ICIpOworCQlleHByX2ZwcmludChlMiwgc3Rkb3V0KTsKKwkJcHJpbnRmKCIgP1xuIik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBleHByICpleHByX2VsaW1pbmF0ZV95bihzdHJ1Y3QgZXhwciAqZSkKK3sKKwlzdHJ1Y3QgZXhwciAqdG1wOworCisJaWYgKGUpIHN3aXRjaCAoZS0+dHlwZSkgeworCWNhc2UgRV9BTkQ6CisJCWUtPmxlZnQuZXhwciA9IGV4cHJfZWxpbWluYXRlX3luKGUtPmxlZnQuZXhwcik7CisJCWUtPnJpZ2h0LmV4cHIgPSBleHByX2VsaW1pbmF0ZV95bihlLT5yaWdodC5leHByKTsKKwkJaWYgKGUtPmxlZnQuZXhwci0+dHlwZSA9PSBFX1NZTUJPTCkgeworCQkJaWYgKGUtPmxlZnQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF9ubykgeworCQkJCWV4cHJfZnJlZShlLT5sZWZ0LmV4cHIpOworCQkJCWV4cHJfZnJlZShlLT5yaWdodC5leHByKTsKKwkJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQkJZS0+bGVmdC5zeW0gPSAmc3ltYm9sX25vOworCQkJCWUtPnJpZ2h0LmV4cHIgPSBOVUxMOworCQkJCXJldHVybiBlOworCQkJfSBlbHNlIGlmIChlLT5sZWZ0LmV4cHItPmxlZnQuc3ltID09ICZzeW1ib2xfeWVzKSB7CisJCQkJZnJlZShlLT5sZWZ0LmV4cHIpOworCQkJCXRtcCA9IGUtPnJpZ2h0LmV4cHI7CisJCQkJKmUgPSAqKGUtPnJpZ2h0LmV4cHIpOworCQkJCWZyZWUodG1wKTsKKwkJCQlyZXR1cm4gZTsKKwkJCX0KKwkJfQorCQlpZiAoZS0+cmlnaHQuZXhwci0+dHlwZSA9PSBFX1NZTUJPTCkgeworCQkJaWYgKGUtPnJpZ2h0LmV4cHItPmxlZnQuc3ltID09ICZzeW1ib2xfbm8pIHsKKwkJCQlleHByX2ZyZWUoZS0+bGVmdC5leHByKTsKKwkJCQlleHByX2ZyZWUoZS0+cmlnaHQuZXhwcik7CisJCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJCWUtPmxlZnQuc3ltID0gJnN5bWJvbF9ubzsKKwkJCQllLT5yaWdodC5leHByID0gTlVMTDsKKwkJCQlyZXR1cm4gZTsKKwkJCX0gZWxzZSBpZiAoZS0+cmlnaHQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF95ZXMpIHsKKwkJCQlmcmVlKGUtPnJpZ2h0LmV4cHIpOworCQkJCXRtcCA9IGUtPmxlZnQuZXhwcjsKKwkJCQkqZSA9ICooZS0+bGVmdC5leHByKTsKKwkJCQlmcmVlKHRtcCk7CisJCQkJcmV0dXJuIGU7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFX09SOgorCQllLT5sZWZ0LmV4cHIgPSBleHByX2VsaW1pbmF0ZV95bihlLT5sZWZ0LmV4cHIpOworCQllLT5yaWdodC5leHByID0gZXhwcl9lbGltaW5hdGVfeW4oZS0+cmlnaHQuZXhwcik7CisJCWlmIChlLT5sZWZ0LmV4cHItPnR5cGUgPT0gRV9TWU1CT0wpIHsKKwkJCWlmIChlLT5sZWZ0LmV4cHItPmxlZnQuc3ltID09ICZzeW1ib2xfbm8pIHsKKwkJCQlmcmVlKGUtPmxlZnQuZXhwcik7CisJCQkJdG1wID0gZS0+cmlnaHQuZXhwcjsKKwkJCQkqZSA9ICooZS0+cmlnaHQuZXhwcik7CisJCQkJZnJlZSh0bXApOworCQkJCXJldHVybiBlOworCQkJfSBlbHNlIGlmIChlLT5sZWZ0LmV4cHItPmxlZnQuc3ltID09ICZzeW1ib2xfeWVzKSB7CisJCQkJZXhwcl9mcmVlKGUtPmxlZnQuZXhwcik7CisJCQkJZXhwcl9mcmVlKGUtPnJpZ2h0LmV4cHIpOworCQkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCQllLT5sZWZ0LnN5bSA9ICZzeW1ib2xfeWVzOworCQkJCWUtPnJpZ2h0LmV4cHIgPSBOVUxMOworCQkJCXJldHVybiBlOworCQkJfQorCQl9CisJCWlmIChlLT5yaWdodC5leHByLT50eXBlID09IEVfU1lNQk9MKSB7CisJCQlpZiAoZS0+cmlnaHQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF9ubykgeworCQkJCWZyZWUoZS0+cmlnaHQuZXhwcik7CisJCQkJdG1wID0gZS0+bGVmdC5leHByOworCQkJCSplID0gKihlLT5sZWZ0LmV4cHIpOworCQkJCWZyZWUodG1wKTsKKwkJCQlyZXR1cm4gZTsKKwkJCX0gZWxzZSBpZiAoZS0+cmlnaHQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF95ZXMpIHsKKwkJCQlleHByX2ZyZWUoZS0+bGVmdC5leHByKTsKKwkJCQlleHByX2ZyZWUoZS0+cmlnaHQuZXhwcik7CisJCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJCWUtPmxlZnQuc3ltID0gJnN5bWJvbF95ZXM7CisJCQkJZS0+cmlnaHQuZXhwciA9IE5VTEw7CisJCQkJcmV0dXJuIGU7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJOworCX0KKwlyZXR1cm4gZTsKK30KKworLyoKKyAqIGJvb2wgRk9PIT1uID0+IEZPTworICovCitzdHJ1Y3QgZXhwciAqZXhwcl90cmFuc19ib29sKHN0cnVjdCBleHByICplKQoreworCWlmICghZSkKKwkJcmV0dXJuIE5VTEw7CisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX0FORDoKKwljYXNlIEVfT1I6CisJY2FzZSBFX05PVDoKKwkJZS0+bGVmdC5leHByID0gZXhwcl90cmFuc19ib29sKGUtPmxlZnQuZXhwcik7CisJCWUtPnJpZ2h0LmV4cHIgPSBleHByX3RyYW5zX2Jvb2woZS0+cmlnaHQuZXhwcik7CisJCWJyZWFrOworCWNhc2UgRV9VTkVRVUFMOgorCQkvLyBGT08hPW4gLT4gRk9PCisJCWlmIChlLT5sZWZ0LnN5bS0+dHlwZSA9PSBTX1RSSVNUQVRFKSB7CisJCQlpZiAoZS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8pIHsKKwkJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQkJZS0+cmlnaHQuc3ltID0gTlVMTDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQk7CisJfQorCXJldHVybiBlOworfQorCisvKgorICogZTEgfHwgZTIgLT4gPworICovCitzdHJ1Y3QgZXhwciAqZXhwcl9qb2luX29yKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKQoreworCXN0cnVjdCBleHByICp0bXA7CisJc3RydWN0IHN5bWJvbCAqc3ltMSwgKnN5bTI7CisKKwlpZiAoZXhwcl9lcShlMSwgZTIpKQorCQlyZXR1cm4gZXhwcl9jb3B5KGUxKTsKKwlpZiAoZTEtPnR5cGUgIT0gRV9FUVVBTCAmJiBlMS0+dHlwZSAhPSBFX1VORVFVQUwgJiYgZTEtPnR5cGUgIT0gRV9TWU1CT0wgJiYgZTEtPnR5cGUgIT0gRV9OT1QpCisJCXJldHVybiBOVUxMOworCWlmIChlMi0+dHlwZSAhPSBFX0VRVUFMICYmIGUyLT50eXBlICE9IEVfVU5FUVVBTCAmJiBlMi0+dHlwZSAhPSBFX1NZTUJPTCAmJiBlMi0+dHlwZSAhPSBFX05PVCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGUxLT50eXBlID09IEVfTk9UKSB7CisJCXRtcCA9IGUxLT5sZWZ0LmV4cHI7CisJCWlmICh0bXAtPnR5cGUgIT0gRV9FUVVBTCAmJiB0bXAtPnR5cGUgIT0gRV9VTkVRVUFMICYmIHRtcC0+dHlwZSAhPSBFX1NZTUJPTCkKKwkJCXJldHVybiBOVUxMOworCQlzeW0xID0gdG1wLT5sZWZ0LnN5bTsKKwl9IGVsc2UKKwkJc3ltMSA9IGUxLT5sZWZ0LnN5bTsKKwlpZiAoZTItPnR5cGUgPT0gRV9OT1QpIHsKKwkJaWYgKGUyLT5sZWZ0LmV4cHItPnR5cGUgIT0gRV9TWU1CT0wpCisJCQlyZXR1cm4gTlVMTDsKKwkJc3ltMiA9IGUyLT5sZWZ0LmV4cHItPmxlZnQuc3ltOworCX0gZWxzZQorCQlzeW0yID0gZTItPmxlZnQuc3ltOworCWlmIChzeW0xICE9IHN5bTIpCisJCXJldHVybiBOVUxMOworCWlmIChzeW0xLT50eXBlICE9IFNfQk9PTEVBTiAmJiBzeW0xLT50eXBlICE9IFNfVFJJU1RBVEUpCisJCXJldHVybiBOVUxMOworCWlmIChzeW0xLT50eXBlID09IFNfVFJJU1RBVEUpIHsKKwkJaWYgKGUxLT50eXBlID09IEVfRVFVQUwgJiYgZTItPnR5cGUgPT0gRV9FUVVBTCAmJgorCQkgICAgKChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpIHx8CisJCSAgICAgKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykpKSB7CisJCQkvLyAoYT0neScpIHx8IChhPSdtJykgLT4gKGEhPSduJykKKwkJCXJldHVybiBleHByX2FsbG9jX2NvbXAoRV9VTkVRVUFMLCBzeW0xLCAmc3ltYm9sX25vKTsKKwkJfQorCQlpZiAoZTEtPnR5cGUgPT0gRV9FUVVBTCAmJiBlMi0+dHlwZSA9PSBFX0VRVUFMICYmCisJCSAgICAoKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vKSB8fAorCQkgICAgIChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8gJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykpKSB7CisJCQkvLyAoYT0neScpIHx8IChhPSduJykgLT4gKGEhPSdtJykKKwkJCXJldHVybiBleHByX2FsbG9jX2NvbXAoRV9VTkVRVUFMLCBzeW0xLCAmc3ltYm9sX21vZCk7CisJCX0KKwkJaWYgKGUxLT50eXBlID09IEVfRVFVQUwgJiYgZTItPnR5cGUgPT0gRV9FUVVBTCAmJgorCQkgICAgKChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubykgfHwKKwkJICAgICAoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpKSkgeworCQkJLy8gKGE9J20nKSB8fCAoYT0nbicpIC0+IChhIT0neScpCisJCQlyZXR1cm4gZXhwcl9hbGxvY19jb21wKEVfVU5FUVVBTCwgc3ltMSwgJnN5bWJvbF95ZXMpOworCQl9CisJfQorCWlmIChzeW0xLT50eXBlID09IFNfQk9PTEVBTiAmJiBzeW0xID09IHN5bTIpIHsKKwkJaWYgKChlMS0+dHlwZSA9PSBFX05PVCAmJiBlMS0+bGVmdC5leHByLT50eXBlID09IEVfU1lNQk9MICYmIGUyLT50eXBlID09IEVfU1lNQk9MKSB8fAorCQkgICAgKGUyLT50eXBlID09IEVfTk9UICYmIGUyLT5sZWZ0LmV4cHItPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTEtPnR5cGUgPT0gRV9TWU1CT0wpKQorCQkJcmV0dXJuIGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfeWVzKTsKKwl9CisKKwlpZiAoREVCVUdfRVhQUikgeworCQlwcmludGYoIm9wdGltaXplICgiKTsKKwkJZXhwcl9mcHJpbnQoZTEsIHN0ZG91dCk7CisJCXByaW50ZigiKSB8fCAoIik7CisJCWV4cHJfZnByaW50KGUyLCBzdGRvdXQpOworCQlwcmludGYoIik/XG4iKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBleHByICpleHByX2pvaW5fYW5kKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKQoreworCXN0cnVjdCBleHByICp0bXA7CisJc3RydWN0IHN5bWJvbCAqc3ltMSwgKnN5bTI7CisKKwlpZiAoZXhwcl9lcShlMSwgZTIpKQorCQlyZXR1cm4gZXhwcl9jb3B5KGUxKTsKKwlpZiAoZTEtPnR5cGUgIT0gRV9FUVVBTCAmJiBlMS0+dHlwZSAhPSBFX1VORVFVQUwgJiYgZTEtPnR5cGUgIT0gRV9TWU1CT0wgJiYgZTEtPnR5cGUgIT0gRV9OT1QpCisJCXJldHVybiBOVUxMOworCWlmIChlMi0+dHlwZSAhPSBFX0VRVUFMICYmIGUyLT50eXBlICE9IEVfVU5FUVVBTCAmJiBlMi0+dHlwZSAhPSBFX1NZTUJPTCAmJiBlMi0+dHlwZSAhPSBFX05PVCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGUxLT50eXBlID09IEVfTk9UKSB7CisJCXRtcCA9IGUxLT5sZWZ0LmV4cHI7CisJCWlmICh0bXAtPnR5cGUgIT0gRV9FUVVBTCAmJiB0bXAtPnR5cGUgIT0gRV9VTkVRVUFMICYmIHRtcC0+dHlwZSAhPSBFX1NZTUJPTCkKKwkJCXJldHVybiBOVUxMOworCQlzeW0xID0gdG1wLT5sZWZ0LnN5bTsKKwl9IGVsc2UKKwkJc3ltMSA9IGUxLT5sZWZ0LnN5bTsKKwlpZiAoZTItPnR5cGUgPT0gRV9OT1QpIHsKKwkJaWYgKGUyLT5sZWZ0LmV4cHItPnR5cGUgIT0gRV9TWU1CT0wpCisJCQlyZXR1cm4gTlVMTDsKKwkJc3ltMiA9IGUyLT5sZWZ0LmV4cHItPmxlZnQuc3ltOworCX0gZWxzZQorCQlzeW0yID0gZTItPmxlZnQuc3ltOworCWlmIChzeW0xICE9IHN5bTIpCisJCXJldHVybiBOVUxMOworCWlmIChzeW0xLT50eXBlICE9IFNfQk9PTEVBTiAmJiBzeW0xLT50eXBlICE9IFNfVFJJU1RBVEUpCisJCXJldHVybiBOVUxMOworCisJaWYgKChlMS0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMi0+dHlwZSA9PSBFX0VRVUFMICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpIHx8CisJICAgIChlMi0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMS0+dHlwZSA9PSBFX0VRVUFMICYmIGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpKQorCQkvLyAoYSkgJiYgKGE9J3knKSAtPiAoYT0neScpCisJCXJldHVybiBleHByX2FsbG9jX2NvbXAoRV9FUVVBTCwgc3ltMSwgJnN5bWJvbF95ZXMpOworCisJaWYgKChlMS0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMi0+dHlwZSA9PSBFX1VORVFVQUwgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vKSB8fAorCSAgICAoZTItPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTEtPnR5cGUgPT0gRV9VTkVRVUFMICYmIGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubykpCisJCS8vIChhKSAmJiAoYSE9J24nKSAtPiAoYSkKKwkJcmV0dXJuIGV4cHJfYWxsb2Nfc3ltYm9sKHN5bTEpOworCisJaWYgKChlMS0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMi0+dHlwZSA9PSBFX1VORVFVQUwgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCkgfHwKKwkgICAgKGUyLT50eXBlID09IEVfU1lNQk9MICYmIGUxLT50eXBlID09IEVfVU5FUVVBTCAmJiBlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKSkKKwkJLy8gKGEpICYmIChhIT0nbScpIC0+IChhPSd5JykKKwkJcmV0dXJuIGV4cHJfYWxsb2NfY29tcChFX0VRVUFMLCBzeW0xLCAmc3ltYm9sX3llcyk7CisKKwlpZiAoc3ltMS0+dHlwZSA9PSBTX1RSSVNUQVRFKSB7CisJCWlmIChlMS0+dHlwZSA9PSBFX0VRVUFMICYmIGUyLT50eXBlID09IEVfVU5FUVVBTCkgeworCQkJLy8gKGE9J2InKSAmJiAoYSE9J2MnKSAtPiAnYic9J2MnID8gJ24nIDogYT0nYicKKwkJCXN5bTIgPSBlMS0+cmlnaHQuc3ltOworCQkJaWYgKChlMi0+cmlnaHQuc3ltLT5mbGFncyAmIFNZTUJPTF9DT05TVCkgJiYgKHN5bTItPmZsYWdzICYgU1lNQk9MX0NPTlNUKSkKKwkJCQlyZXR1cm4gc3ltMiAhPSBlMi0+cmlnaHQuc3ltID8gZXhwcl9hbGxvY19jb21wKEVfRVFVQUwsIHN5bTEsIHN5bTIpCisJCQkJCQkJICAgICA6IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQl9CisJCWlmIChlMS0+dHlwZSA9PSBFX1VORVFVQUwgJiYgZTItPnR5cGUgPT0gRV9FUVVBTCkgeworCQkJLy8gKGE9J2InKSAmJiAoYSE9J2MnKSAtPiAnYic9J2MnID8gJ24nIDogYT0nYicKKwkJCXN5bTIgPSBlMi0+cmlnaHQuc3ltOworCQkJaWYgKChlMS0+cmlnaHQuc3ltLT5mbGFncyAmIFNZTUJPTF9DT05TVCkgJiYgKHN5bTItPmZsYWdzICYgU1lNQk9MX0NPTlNUKSkKKwkJCQlyZXR1cm4gc3ltMiAhPSBlMS0+cmlnaHQuc3ltID8gZXhwcl9hbGxvY19jb21wKEVfRVFVQUwsIHN5bTEsIHN5bTIpCisJCQkJCQkJICAgICA6IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQl9CisJCWlmIChlMS0+dHlwZSA9PSBFX1VORVFVQUwgJiYgZTItPnR5cGUgPT0gRV9VTkVRVUFMICYmCisJCQkgICAoKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vKSB8fAorCQkJICAgIChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8gJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykpKQorCQkJLy8gKGEhPSd5JykgJiYgKGEhPSduJykgLT4gKGE9J20nKQorCQkJcmV0dXJuIGV4cHJfYWxsb2NfY29tcChFX0VRVUFMLCBzeW0xLCAmc3ltYm9sX21vZCk7CisKKwkJaWYgKGUxLT50eXBlID09IEVfVU5FUVVBTCAmJiBlMi0+dHlwZSA9PSBFX1VORVFVQUwgJiYKKwkJCSAgICgoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcyAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKSB8fAorCQkJICAgIChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpKSkKKwkJCS8vIChhIT0neScpICYmIChhIT0nbScpIC0+IChhPSduJykKKwkJCXJldHVybiBleHByX2FsbG9jX2NvbXAoRV9FUVVBTCwgc3ltMSwgJnN5bWJvbF9ubyk7CisKKwkJaWYgKGUxLT50eXBlID09IEVfVU5FUVVBTCAmJiBlMi0+dHlwZSA9PSBFX1VORVFVQUwgJiYKKwkJCSAgICgoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8pIHx8CisJCQkgICAgKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubyAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKSkpCisJCQkvLyAoYSE9J20nKSAmJiAoYSE9J24nKSAtPiAoYT0nbScpCisJCQlyZXR1cm4gZXhwcl9hbGxvY19jb21wKEVfRVFVQUwsIHN5bTEsICZzeW1ib2xfeWVzKTsKKworCQlpZiAoKGUxLT50eXBlID09IEVfU1lNQk9MICYmIGUyLT50eXBlID09IEVfRVFVQUwgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCkgfHwKKwkJICAgIChlMi0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMS0+dHlwZSA9PSBFX0VRVUFMICYmIGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpIHx8CisJCSAgICAoZTEtPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTItPnR5cGUgPT0gRV9VTkVRVUFMICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpIHx8CisJCSAgICAoZTItPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTEtPnR5cGUgPT0gRV9VTkVRVUFMICYmIGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKERFQlVHX0VYUFIpIHsKKwkJcHJpbnRmKCJvcHRpbWl6ZSAoIik7CisJCWV4cHJfZnByaW50KGUxLCBzdGRvdXQpOworCQlwcmludGYoIikgJiYgKCIpOworCQlleHByX2ZwcmludChlMiwgc3Rkb3V0KTsKKwkJcHJpbnRmKCIpP1xuIik7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBleHByX2VsaW1pbmF0ZV9kdXBzMShlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpCit7CisjZGVmaW5lIGUxICgqZXAxKQorI2RlZmluZSBlMiAoKmVwMikKKwlzdHJ1Y3QgZXhwciAqdG1wOworCisJaWYgKGUxLT50eXBlID09IHR5cGUpIHsKKwkJZXhwcl9lbGltaW5hdGVfZHVwczEodHlwZSwgJmUxLT5sZWZ0LmV4cHIsICZlMik7CisJCWV4cHJfZWxpbWluYXRlX2R1cHMxKHR5cGUsICZlMS0+cmlnaHQuZXhwciwgJmUyKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZTItPnR5cGUgPT0gdHlwZSkgeworCQlleHByX2VsaW1pbmF0ZV9kdXBzMSh0eXBlLCAmZTEsICZlMi0+bGVmdC5leHByKTsKKwkJZXhwcl9lbGltaW5hdGVfZHVwczEodHlwZSwgJmUxLCAmZTItPnJpZ2h0LmV4cHIpOworCQlyZXR1cm47CisJfQorCWlmIChlMSA9PSBlMikKKwkJcmV0dXJuOworCisJc3dpdGNoIChlMS0+dHlwZSkgeworCWNhc2UgRV9PUjogY2FzZSBFX0FORDoKKwkJZXhwcl9lbGltaW5hdGVfZHVwczEoZTEtPnR5cGUsICZlMSwgJmUxKTsKKwlkZWZhdWx0OgorCQk7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBFX09SOgorCQl0bXAgPSBleHByX2pvaW5fb3IoZTEsIGUyKTsKKwkJaWYgKHRtcCkgeworCQkJZXhwcl9mcmVlKGUxKTsgZXhwcl9mcmVlKGUyKTsKKwkJCWUxID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9ubyk7CisJCQllMiA9IHRtcDsKKwkJCXRyYW5zX2NvdW50Kys7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFX0FORDoKKwkJdG1wID0gZXhwcl9qb2luX2FuZChlMSwgZTIpOworCQlpZiAodG1wKSB7CisJCQlleHByX2ZyZWUoZTEpOyBleHByX2ZyZWUoZTIpOworCQkJZTEgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX3llcyk7CisJCQllMiA9IHRtcDsKKwkJCXRyYW5zX2NvdW50Kys7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJOworCX0KKyN1bmRlZiBlMQorI3VuZGVmIGUyCit9CisKK3N0YXRpYyB2b2lkIGV4cHJfZWxpbWluYXRlX2R1cHMyKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMikKK3sKKyNkZWZpbmUgZTEgKCplcDEpCisjZGVmaW5lIGUyICgqZXAyKQorCXN0cnVjdCBleHByICp0bXAsICp0bXAxLCAqdG1wMjsKKworCWlmIChlMS0+dHlwZSA9PSB0eXBlKSB7CisJCWV4cHJfZWxpbWluYXRlX2R1cHMyKHR5cGUsICZlMS0+bGVmdC5leHByLCAmZTIpOworCQlleHByX2VsaW1pbmF0ZV9kdXBzMih0eXBlLCAmZTEtPnJpZ2h0LmV4cHIsICZlMik7CisJCXJldHVybjsKKwl9CisJaWYgKGUyLT50eXBlID09IHR5cGUpIHsKKwkJZXhwcl9lbGltaW5hdGVfZHVwczIodHlwZSwgJmUxLCAmZTItPmxlZnQuZXhwcik7CisJCWV4cHJfZWxpbWluYXRlX2R1cHMyKHR5cGUsICZlMSwgJmUyLT5yaWdodC5leHByKTsKKwl9CisJaWYgKGUxID09IGUyKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGUxLT50eXBlKSB7CisJY2FzZSBFX09SOgorCQlleHByX2VsaW1pbmF0ZV9kdXBzMihlMS0+dHlwZSwgJmUxLCAmZTEpOworCQkvLyAoRk9PIHx8IEJBUikgJiYgKCFGT08gJiYgIUJBUikgLT4gbgorCQl0bXAxID0gZXhwcl90cmFuc2Zvcm0oZXhwcl9hbGxvY19vbmUoRV9OT1QsIGV4cHJfY29weShlMSkpKTsKKwkJdG1wMiA9IGV4cHJfY29weShlMik7CisJCXRtcCA9IGV4cHJfZXh0cmFjdF9lcV9hbmQoJnRtcDEsICZ0bXAyKTsKKwkJaWYgKGV4cHJfaXNfeWVzKHRtcDEpKSB7CisJCQlleHByX2ZyZWUoZTEpOworCQkJZTEgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX25vKTsKKwkJCXRyYW5zX2NvdW50Kys7CisJCX0KKwkJZXhwcl9mcmVlKHRtcDIpOworCQlleHByX2ZyZWUodG1wMSk7CisJCWV4cHJfZnJlZSh0bXApOworCQlicmVhazsKKwljYXNlIEVfQU5EOgorCQlleHByX2VsaW1pbmF0ZV9kdXBzMihlMS0+dHlwZSwgJmUxLCAmZTEpOworCQkvLyAoRk9PICYmIEJBUikgfHwgKCFGT08gfHwgIUJBUikgLT4geQorCQl0bXAxID0gZXhwcl90cmFuc2Zvcm0oZXhwcl9hbGxvY19vbmUoRV9OT1QsIGV4cHJfY29weShlMSkpKTsKKwkJdG1wMiA9IGV4cHJfY29weShlMik7CisJCXRtcCA9IGV4cHJfZXh0cmFjdF9lcV9vcigmdG1wMSwgJnRtcDIpOworCQlpZiAoZXhwcl9pc19ubyh0bXAxKSkgeworCQkJZXhwcl9mcmVlKGUxKTsKKwkJCWUxID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF95ZXMpOworCQkJdHJhbnNfY291bnQrKzsKKwkJfQorCQlleHByX2ZyZWUodG1wMik7CisJCWV4cHJfZnJlZSh0bXAxKTsKKwkJZXhwcl9mcmVlKHRtcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsKKwl9CisjdW5kZWYgZTEKKyN1bmRlZiBlMgorfQorCitzdHJ1Y3QgZXhwciAqZXhwcl9lbGltaW5hdGVfZHVwcyhzdHJ1Y3QgZXhwciAqZSkKK3sKKwlpbnQgb2xkY291bnQ7CisJaWYgKCFlKQorCQlyZXR1cm4gZTsKKworCW9sZGNvdW50ID0gdHJhbnNfY291bnQ7CisJd2hpbGUgKDEpIHsKKwkJdHJhbnNfY291bnQgPSAwOworCQlzd2l0Y2ggKGUtPnR5cGUpIHsKKwkJY2FzZSBFX09SOiBjYXNlIEVfQU5EOgorCQkJZXhwcl9lbGltaW5hdGVfZHVwczEoZS0+dHlwZSwgJmUsICZlKTsKKwkJCWV4cHJfZWxpbWluYXRlX2R1cHMyKGUtPnR5cGUsICZlLCAmZSk7CisJCWRlZmF1bHQ6CisJCQk7CisJCX0KKwkJaWYgKCF0cmFuc19jb3VudCkKKwkJCWJyZWFrOworCQllID0gZXhwcl9lbGltaW5hdGVfeW4oZSk7CisJfQorCXRyYW5zX2NvdW50ID0gb2xkY291bnQ7CisJcmV0dXJuIGU7Cit9CisKK3N0cnVjdCBleHByICpleHByX3RyYW5zZm9ybShzdHJ1Y3QgZXhwciAqZSkKK3sKKwlzdHJ1Y3QgZXhwciAqdG1wOworCisJaWYgKCFlKQorCQlyZXR1cm4gTlVMTDsKKwlzd2l0Y2ggKGUtPnR5cGUpIHsKKwljYXNlIEVfRVFVQUw6CisJY2FzZSBFX1VORVFVQUw6CisJY2FzZSBFX1NZTUJPTDoKKwljYXNlIEVfQ0hPSUNFOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQllLT5sZWZ0LmV4cHIgPSBleHByX3RyYW5zZm9ybShlLT5sZWZ0LmV4cHIpOworCQllLT5yaWdodC5leHByID0gZXhwcl90cmFuc2Zvcm0oZS0+cmlnaHQuZXhwcik7CisJfQorCisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX0VRVUFMOgorCQlpZiAoZS0+bGVmdC5zeW0tPnR5cGUgIT0gU19CT09MRUFOKQorCQkJYnJlYWs7CisJCWlmIChlLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubykgeworCQkJZS0+dHlwZSA9IEVfTk9UOworCQkJZS0+bGVmdC5leHByID0gZXhwcl9hbGxvY19zeW1ib2woZS0+bGVmdC5zeW0pOworCQkJZS0+cmlnaHQuc3ltID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChlLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpIHsKKwkJCXByaW50ZigiYm9vbGVhbiBzeW1ib2wgJXMgdGVzdGVkIGZvciAnbSc/IHRlc3QgZm9yY2VkIHRvICduJ1xuIiwgZS0+bGVmdC5zeW0tPm5hbWUpOworCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJZS0+bGVmdC5zeW0gPSAmc3ltYm9sX25vOworCQkJZS0+cmlnaHQuc3ltID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChlLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpIHsKKwkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCWUtPnJpZ2h0LnN5bSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIEVfVU5FUVVBTDoKKwkJaWYgKGUtPmxlZnQuc3ltLT50eXBlICE9IFNfQk9PTEVBTikKKwkJCWJyZWFrOworCQlpZiAoZS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8pIHsKKwkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCWUtPnJpZ2h0LnN5bSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKSB7CisJCQlwcmludGYoImJvb2xlYW4gc3ltYm9sICVzIHRlc3RlZCBmb3IgJ20nPyB0ZXN0IGZvcmNlZCB0byAneSdcbiIsIGUtPmxlZnQuc3ltLT5uYW1lKTsKKwkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCWUtPmxlZnQuc3ltID0gJnN5bWJvbF95ZXM7CisJCQllLT5yaWdodC5zeW0gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGUtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykgeworCQkJZS0+dHlwZSA9IEVfTk9UOworCQkJZS0+bGVmdC5leHByID0gZXhwcl9hbGxvY19zeW1ib2woZS0+bGVmdC5zeW0pOworCQkJZS0+cmlnaHQuc3ltID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgRV9OT1Q6CisJCXN3aXRjaCAoZS0+bGVmdC5leHByLT50eXBlKSB7CisJCWNhc2UgRV9OT1Q6CisJCQkvLyAhIWEgLT4gYQorCQkJdG1wID0gZS0+bGVmdC5leHByLT5sZWZ0LmV4cHI7CisJCQlmcmVlKGUtPmxlZnQuZXhwcik7CisJCQlmcmVlKGUpOworCQkJZSA9IHRtcDsKKwkJCWUgPSBleHByX3RyYW5zZm9ybShlKTsKKwkJCWJyZWFrOworCQljYXNlIEVfRVFVQUw6CisJCWNhc2UgRV9VTkVRVUFMOgorCQkJLy8gIWE9J3gnIC0+IGEhPSd4JworCQkJdG1wID0gZS0+bGVmdC5leHByOworCQkJZnJlZShlKTsKKwkJCWUgPSB0bXA7CisJCQllLT50eXBlID0gZS0+dHlwZSA9PSBFX0VRVUFMID8gRV9VTkVRVUFMIDogRV9FUVVBTDsKKwkJCWJyZWFrOworCQljYXNlIEVfT1I6CisJCQkvLyAhKGEgfHwgYikgLT4gIWEgJiYgIWIKKwkJCXRtcCA9IGUtPmxlZnQuZXhwcjsKKwkJCWUtPnR5cGUgPSBFX0FORDsKKwkJCWUtPnJpZ2h0LmV4cHIgPSBleHByX2FsbG9jX29uZShFX05PVCwgdG1wLT5yaWdodC5leHByKTsKKwkJCXRtcC0+dHlwZSA9IEVfTk9UOworCQkJdG1wLT5yaWdodC5leHByID0gTlVMTDsKKwkJCWUgPSBleHByX3RyYW5zZm9ybShlKTsKKwkJCWJyZWFrOworCQljYXNlIEVfQU5EOgorCQkJLy8gIShhICYmIGIpIC0+ICFhIHx8ICFiCisJCQl0bXAgPSBlLT5sZWZ0LmV4cHI7CisJCQllLT50eXBlID0gRV9PUjsKKwkJCWUtPnJpZ2h0LmV4cHIgPSBleHByX2FsbG9jX29uZShFX05PVCwgdG1wLT5yaWdodC5leHByKTsKKwkJCXRtcC0+dHlwZSA9IEVfTk9UOworCQkJdG1wLT5yaWdodC5leHByID0gTlVMTDsKKwkJCWUgPSBleHByX3RyYW5zZm9ybShlKTsKKwkJCWJyZWFrOworCQljYXNlIEVfU1lNQk9MOgorCQkJaWYgKGUtPmxlZnQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF95ZXMpIHsKKwkJCQkvLyAhJ3knIC0+ICduJworCQkJCXRtcCA9IGUtPmxlZnQuZXhwcjsKKwkJCQlmcmVlKGUpOworCQkJCWUgPSB0bXA7CisJCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJCWUtPmxlZnQuc3ltID0gJnN5bWJvbF9ubzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChlLT5sZWZ0LmV4cHItPmxlZnQuc3ltID09ICZzeW1ib2xfbW9kKSB7CisJCQkJLy8gISdtJyAtPiAnbScKKwkJCQl0bXAgPSBlLT5sZWZ0LmV4cHI7CisJCQkJZnJlZShlKTsKKwkJCQllID0gdG1wOworCQkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCQllLT5sZWZ0LnN5bSA9ICZzeW1ib2xfbW9kOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGUtPmxlZnQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF9ubykgeworCQkJCS8vICEnbicgLT4gJ3knCisJCQkJdG1wID0gZS0+bGVmdC5leHByOworCQkJCWZyZWUoZSk7CisJCQkJZSA9IHRtcDsKKwkJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQkJZS0+bGVmdC5zeW0gPSAmc3ltYm9sX3llczsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsKKwl9CisJcmV0dXJuIGU7Cit9CisKK2ludCBleHByX2NvbnRhaW5zX3N5bWJvbChzdHJ1Y3QgZXhwciAqZGVwLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJaWYgKCFkZXApCisJCXJldHVybiAwOworCisJc3dpdGNoIChkZXAtPnR5cGUpIHsKKwljYXNlIEVfQU5EOgorCWNhc2UgRV9PUjoKKwkJcmV0dXJuIGV4cHJfY29udGFpbnNfc3ltYm9sKGRlcC0+bGVmdC5leHByLCBzeW0pIHx8CisJCSAgICAgICBleHByX2NvbnRhaW5zX3N5bWJvbChkZXAtPnJpZ2h0LmV4cHIsIHN5bSk7CisJY2FzZSBFX1NZTUJPTDoKKwkJcmV0dXJuIGRlcC0+bGVmdC5zeW0gPT0gc3ltOworCWNhc2UgRV9FUVVBTDoKKwljYXNlIEVfVU5FUVVBTDoKKwkJcmV0dXJuIGRlcC0+bGVmdC5zeW0gPT0gc3ltIHx8CisJCSAgICAgICBkZXAtPnJpZ2h0LnN5bSA9PSBzeW07CisJY2FzZSBFX05PVDoKKwkJcmV0dXJuIGV4cHJfY29udGFpbnNfc3ltYm9sKGRlcC0+bGVmdC5leHByLCBzeW0pOworCWRlZmF1bHQ6CisJCTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2Jvb2wgZXhwcl9kZXBlbmRzX3N5bWJvbChzdHJ1Y3QgZXhwciAqZGVwLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJaWYgKCFkZXApCisJCXJldHVybiBmYWxzZTsKKworCXN3aXRjaCAoZGVwLT50eXBlKSB7CisJY2FzZSBFX0FORDoKKwkJcmV0dXJuIGV4cHJfZGVwZW5kc19zeW1ib2woZGVwLT5sZWZ0LmV4cHIsIHN5bSkgfHwKKwkJICAgICAgIGV4cHJfZGVwZW5kc19zeW1ib2woZGVwLT5yaWdodC5leHByLCBzeW0pOworCWNhc2UgRV9TWU1CT0w6CisJCXJldHVybiBkZXAtPmxlZnQuc3ltID09IHN5bTsKKwljYXNlIEVfRVFVQUw6CisJCWlmIChkZXAtPmxlZnQuc3ltID09IHN5bSkgeworCQkJaWYgKGRlcC0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzIHx8IGRlcC0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCWJyZWFrOworCWNhc2UgRV9VTkVRVUFMOgorCQlpZiAoZGVwLT5sZWZ0LnN5bSA9PSBzeW0pIHsKKwkJCWlmIChkZXAtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsKKwl9CisJcmV0dXJuIGZhbHNlOworfQorCitzdHJ1Y3QgZXhwciAqZXhwcl9leHRyYWN0X2VxX2FuZChzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpCit7CisJc3RydWN0IGV4cHIgKnRtcCA9IE5VTEw7CisJZXhwcl9leHRyYWN0X2VxKEVfQU5ELCAmdG1wLCBlcDEsIGVwMik7CisJaWYgKHRtcCkgeworCQkqZXAxID0gZXhwcl9lbGltaW5hdGVfeW4oKmVwMSk7CisJCSplcDIgPSBleHByX2VsaW1pbmF0ZV95bigqZXAyKTsKKwl9CisJcmV0dXJuIHRtcDsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfZXh0cmFjdF9lcV9vcihzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpCit7CisJc3RydWN0IGV4cHIgKnRtcCA9IE5VTEw7CisJZXhwcl9leHRyYWN0X2VxKEVfT1IsICZ0bXAsIGVwMSwgZXAyKTsKKwlpZiAodG1wKSB7CisJCSplcDEgPSBleHByX2VsaW1pbmF0ZV95bigqZXAxKTsKKwkJKmVwMiA9IGV4cHJfZWxpbWluYXRlX3luKCplcDIpOworCX0KKwlyZXR1cm4gdG1wOworfQorCit2b2lkIGV4cHJfZXh0cmFjdF9lcShlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqKmVwLCBzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpCit7CisjZGVmaW5lIGUxICgqZXAxKQorI2RlZmluZSBlMiAoKmVwMikKKwlpZiAoZTEtPnR5cGUgPT0gdHlwZSkgeworCQlleHByX2V4dHJhY3RfZXEodHlwZSwgZXAsICZlMS0+bGVmdC5leHByLCAmZTIpOworCQlleHByX2V4dHJhY3RfZXEodHlwZSwgZXAsICZlMS0+cmlnaHQuZXhwciwgJmUyKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZTItPnR5cGUgPT0gdHlwZSkgeworCQlleHByX2V4dHJhY3RfZXEodHlwZSwgZXAsIGVwMSwgJmUyLT5sZWZ0LmV4cHIpOworCQlleHByX2V4dHJhY3RfZXEodHlwZSwgZXAsIGVwMSwgJmUyLT5yaWdodC5leHByKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZXhwcl9lcShlMSwgZTIpKSB7CisJCSplcCA9ICplcCA/IGV4cHJfYWxsb2NfdHdvKHR5cGUsICplcCwgZTEpIDogZTE7CisJCWV4cHJfZnJlZShlMik7CisJCWlmICh0eXBlID09IEVfQU5EKSB7CisJCQllMSA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfeWVzKTsKKwkJCWUyID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF95ZXMpOworCQl9IGVsc2UgaWYgKHR5cGUgPT0gRV9PUikgeworCQkJZTEgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX25vKTsKKwkJCWUyID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9ubyk7CisJCX0KKwl9CisjdW5kZWYgZTEKKyN1bmRlZiBlMgorfQorCitzdHJ1Y3QgZXhwciAqZXhwcl90cmFuc19jb21wYXJlKHN0cnVjdCBleHByICplLCBlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IGV4cHIgKmUxLCAqZTI7CisKKwlpZiAoIWUpIHsKKwkJZSA9IGV4cHJfYWxsb2Nfc3ltYm9sKHN5bSk7CisJCWlmICh0eXBlID09IEVfVU5FUVVBTCkKKwkJCWUgPSBleHByX2FsbG9jX29uZShFX05PVCwgZSk7CisJCXJldHVybiBlOworCX0KKwlzd2l0Y2ggKGUtPnR5cGUpIHsKKwljYXNlIEVfQU5EOgorCQllMSA9IGV4cHJfdHJhbnNfY29tcGFyZShlLT5sZWZ0LmV4cHIsIEVfRVFVQUwsIHN5bSk7CisJCWUyID0gZXhwcl90cmFuc19jb21wYXJlKGUtPnJpZ2h0LmV4cHIsIEVfRVFVQUwsIHN5bSk7CisJCWlmIChzeW0gPT0gJnN5bWJvbF95ZXMpCisJCQllID0gZXhwcl9hbGxvY190d28oRV9BTkQsIGUxLCBlMik7CisJCWlmIChzeW0gPT0gJnN5bWJvbF9ubykKKwkJCWUgPSBleHByX2FsbG9jX3R3byhFX09SLCBlMSwgZTIpOworCQlpZiAodHlwZSA9PSBFX1VORVFVQUwpCisJCQllID0gZXhwcl9hbGxvY19vbmUoRV9OT1QsIGUpOworCQlyZXR1cm4gZTsKKwljYXNlIEVfT1I6CisJCWUxID0gZXhwcl90cmFuc19jb21wYXJlKGUtPmxlZnQuZXhwciwgRV9FUVVBTCwgc3ltKTsKKwkJZTIgPSBleHByX3RyYW5zX2NvbXBhcmUoZS0+cmlnaHQuZXhwciwgRV9FUVVBTCwgc3ltKTsKKwkJaWYgKHN5bSA9PSAmc3ltYm9sX3llcykKKwkJCWUgPSBleHByX2FsbG9jX3R3byhFX09SLCBlMSwgZTIpOworCQlpZiAoc3ltID09ICZzeW1ib2xfbm8pCisJCQllID0gZXhwcl9hbGxvY190d28oRV9BTkQsIGUxLCBlMik7CisJCWlmICh0eXBlID09IEVfVU5FUVVBTCkKKwkJCWUgPSBleHByX2FsbG9jX29uZShFX05PVCwgZSk7CisJCXJldHVybiBlOworCWNhc2UgRV9OT1Q6CisJCXJldHVybiBleHByX3RyYW5zX2NvbXBhcmUoZS0+bGVmdC5leHByLCB0eXBlID09IEVfRVFVQUwgPyBFX1VORVFVQUwgOiBFX0VRVUFMLCBzeW0pOworCWNhc2UgRV9VTkVRVUFMOgorCWNhc2UgRV9FUVVBTDoKKwkJaWYgKHR5cGUgPT0gRV9FUVVBTCkgeworCQkJaWYgKHN5bSA9PSAmc3ltYm9sX3llcykKKwkJCQlyZXR1cm4gZXhwcl9jb3B5KGUpOworCQkJaWYgKHN5bSA9PSAmc3ltYm9sX21vZCkKKwkJCQlyZXR1cm4gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9ubyk7CisJCQlpZiAoc3ltID09ICZzeW1ib2xfbm8pCisJCQkJcmV0dXJuIGV4cHJfYWxsb2Nfb25lKEVfTk9ULCBleHByX2NvcHkoZSkpOworCQl9IGVsc2UgeworCQkJaWYgKHN5bSA9PSAmc3ltYm9sX3llcykKKwkJCQlyZXR1cm4gZXhwcl9hbGxvY19vbmUoRV9OT1QsIGV4cHJfY29weShlKSk7CisJCQlpZiAoc3ltID09ICZzeW1ib2xfbW9kKQorCQkJCXJldHVybiBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX3llcyk7CisJCQlpZiAoc3ltID09ICZzeW1ib2xfbm8pCisJCQkJcmV0dXJuIGV4cHJfY29weShlKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEVfU1lNQk9MOgorCQlyZXR1cm4gZXhwcl9hbGxvY19jb21wKHR5cGUsIGUtPmxlZnQuc3ltLCBzeW0pOworCWNhc2UgRV9DSE9JQ0U6CisJY2FzZSBFX1JBTkdFOgorCWNhc2UgRV9OT05FOgorCQkvKiBwYW5pYyAqLzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3RyaXN0YXRlIGV4cHJfY2FsY192YWx1ZShzdHJ1Y3QgZXhwciAqZSkKK3sKKwl0cmlzdGF0ZSB2YWwxLCB2YWwyOworCWNvbnN0IGNoYXIgKnN0cjEsICpzdHIyOworCisJaWYgKCFlKQorCQlyZXR1cm4geWVzOworCisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX1NZTUJPTDoKKwkJc3ltX2NhbGNfdmFsdWUoZS0+bGVmdC5zeW0pOworCQlyZXR1cm4gZS0+bGVmdC5zeW0tPmN1cnIudHJpOworCWNhc2UgRV9BTkQ6CisJCXZhbDEgPSBleHByX2NhbGNfdmFsdWUoZS0+bGVmdC5leHByKTsKKwkJdmFsMiA9IGV4cHJfY2FsY192YWx1ZShlLT5yaWdodC5leHByKTsKKwkJcmV0dXJuIEVfQU5EKHZhbDEsIHZhbDIpOworCWNhc2UgRV9PUjoKKwkJdmFsMSA9IGV4cHJfY2FsY192YWx1ZShlLT5sZWZ0LmV4cHIpOworCQl2YWwyID0gZXhwcl9jYWxjX3ZhbHVlKGUtPnJpZ2h0LmV4cHIpOworCQlyZXR1cm4gRV9PUih2YWwxLCB2YWwyKTsKKwljYXNlIEVfTk9UOgorCQl2YWwxID0gZXhwcl9jYWxjX3ZhbHVlKGUtPmxlZnQuZXhwcik7CisJCXJldHVybiBFX05PVCh2YWwxKTsKKwljYXNlIEVfRVFVQUw6CisJCXN5bV9jYWxjX3ZhbHVlKGUtPmxlZnQuc3ltKTsKKwkJc3ltX2NhbGNfdmFsdWUoZS0+cmlnaHQuc3ltKTsKKwkJc3RyMSA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKGUtPmxlZnQuc3ltKTsKKwkJc3RyMiA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKGUtPnJpZ2h0LnN5bSk7CisJCXJldHVybiAhc3RyY21wKHN0cjEsIHN0cjIpID8geWVzIDogbm87CisJY2FzZSBFX1VORVFVQUw6CisJCXN5bV9jYWxjX3ZhbHVlKGUtPmxlZnQuc3ltKTsKKwkJc3ltX2NhbGNfdmFsdWUoZS0+cmlnaHQuc3ltKTsKKwkJc3RyMSA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKGUtPmxlZnQuc3ltKTsKKwkJc3RyMiA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKGUtPnJpZ2h0LnN5bSk7CisJCXJldHVybiAhc3RyY21wKHN0cjEsIHN0cjIpID8gbm8gOiB5ZXM7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJleHByX2NhbGNfdmFsdWU6ICVkP1xuIiwgZS0+dHlwZSk7CisJCXJldHVybiBubzsKKwl9Cit9CisKK2ludCBleHByX2NvbXBhcmVfdHlwZShlbnVtIGV4cHJfdHlwZSB0MSwgZW51bSBleHByX3R5cGUgdDIpCit7CisjaWYgMAorCXJldHVybiAxOworI2Vsc2UKKwlpZiAodDEgPT0gdDIpCisJCXJldHVybiAwOworCXN3aXRjaCAodDEpIHsKKwljYXNlIEVfRVFVQUw6CisJY2FzZSBFX1VORVFVQUw6CisJCWlmICh0MiA9PSBFX05PVCkKKwkJCXJldHVybiAxOworCWNhc2UgRV9OT1Q6CisJCWlmICh0MiA9PSBFX0FORCkKKwkJCXJldHVybiAxOworCWNhc2UgRV9BTkQ6CisJCWlmICh0MiA9PSBFX09SKQorCQkJcmV0dXJuIDE7CisJY2FzZSBFX09SOgorCQlpZiAodDIgPT0gRV9DSE9JQ0UpCisJCQlyZXR1cm4gMTsKKwljYXNlIEVfQ0hPSUNFOgorCQlpZiAodDIgPT0gMCkKKwkJCXJldHVybiAxOworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9CisJcHJpbnRmKCJbJWRndCVkP10iLCB0MSwgdDIpOworCXJldHVybiAwOworI2VuZGlmCit9CisKK3ZvaWQgZXhwcl9wcmludChzdHJ1Y3QgZXhwciAqZSwgdm9pZCAoKmZuKSh2b2lkICosIGNvbnN0IGNoYXIgKiksIHZvaWQgKmRhdGEsIGludCBwcmV2dG9rZW4pCit7CisJaWYgKCFlKSB7CisJCWZuKGRhdGEsICJ5Iik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZXhwcl9jb21wYXJlX3R5cGUocHJldnRva2VuLCBlLT50eXBlKSA+IDApCisJCWZuKGRhdGEsICIoIik7CisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX1NZTUJPTDoKKwkJaWYgKGUtPmxlZnQuc3ltLT5uYW1lKQorCQkJZm4oZGF0YSwgZS0+bGVmdC5zeW0tPm5hbWUpOworCQllbHNlCisJCQlmbihkYXRhLCAiPGNob2ljZT4iKTsKKwkJYnJlYWs7CisJY2FzZSBFX05PVDoKKwkJZm4oZGF0YSwgIiEiKTsKKwkJZXhwcl9wcmludChlLT5sZWZ0LmV4cHIsIGZuLCBkYXRhLCBFX05PVCk7CisJCWJyZWFrOworCWNhc2UgRV9FUVVBTDoKKwkJZm4oZGF0YSwgZS0+bGVmdC5zeW0tPm5hbWUpOworCQlmbihkYXRhLCAiPSIpOworCQlmbihkYXRhLCBlLT5yaWdodC5zeW0tPm5hbWUpOworCQlicmVhazsKKwljYXNlIEVfVU5FUVVBTDoKKwkJZm4oZGF0YSwgZS0+bGVmdC5zeW0tPm5hbWUpOworCQlmbihkYXRhLCAiIT0iKTsKKwkJZm4oZGF0YSwgZS0+cmlnaHQuc3ltLT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBFX09SOgorCQlleHByX3ByaW50KGUtPmxlZnQuZXhwciwgZm4sIGRhdGEsIEVfT1IpOworCQlmbihkYXRhLCAiIHx8ICIpOworCQlleHByX3ByaW50KGUtPnJpZ2h0LmV4cHIsIGZuLCBkYXRhLCBFX09SKTsKKwkJYnJlYWs7CisJY2FzZSBFX0FORDoKKwkJZXhwcl9wcmludChlLT5sZWZ0LmV4cHIsIGZuLCBkYXRhLCBFX0FORCk7CisJCWZuKGRhdGEsICIgJiYgIik7CisJCWV4cHJfcHJpbnQoZS0+cmlnaHQuZXhwciwgZm4sIGRhdGEsIEVfQU5EKTsKKwkJYnJlYWs7CisJY2FzZSBFX0NIT0lDRToKKwkJZm4oZGF0YSwgZS0+cmlnaHQuc3ltLT5uYW1lKTsKKwkJaWYgKGUtPmxlZnQuZXhwcikgeworCQkJZm4oZGF0YSwgIiBeICIpOworCQkJZXhwcl9wcmludChlLT5sZWZ0LmV4cHIsIGZuLCBkYXRhLCBFX0NIT0lDRSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFX1JBTkdFOgorCQlmbihkYXRhLCAiWyIpOworCQlmbihkYXRhLCBlLT5sZWZ0LnN5bS0+bmFtZSk7CisJCWZuKGRhdGEsICIgIik7CisJCWZuKGRhdGEsIGUtPnJpZ2h0LnN5bS0+bmFtZSk7CisJCWZuKGRhdGEsICJdIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJICB7CisJCWNoYXIgYnVmWzMyXTsKKwkJc3ByaW50ZihidWYsICI8dW5rbm93biB0eXBlICVkPiIsIGUtPnR5cGUpOworCQlmbihkYXRhLCBidWYpOworCQlicmVhazsKKwkgIH0KKwl9CisJaWYgKGV4cHJfY29tcGFyZV90eXBlKHByZXZ0b2tlbiwgZS0+dHlwZSkgPiAwKQorCQlmbihkYXRhLCAiKSIpOworfQorCitzdGF0aWMgdm9pZCBleHByX3ByaW50X2ZpbGVfaGVscGVyKHZvaWQgKmRhdGEsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlmd3JpdGUoc3RyLCBzdHJsZW4oc3RyKSwgMSwgZGF0YSk7Cit9CisKK3ZvaWQgZXhwcl9mcHJpbnQoc3RydWN0IGV4cHIgKmUsIEZJTEUgKm91dCkKK3sKKwlleHByX3ByaW50KGUsIGV4cHJfcHJpbnRfZmlsZV9oZWxwZXIsIG91dCwgRV9OT05FKTsKK30KKworc3RhdGljIHZvaWQgZXhwcl9wcmludF9nc3RyX2hlbHBlcih2b2lkICpkYXRhLCBjb25zdCBjaGFyICpzdHIpCit7CisJc3RyX2FwcGVuZCgoc3RydWN0IGdzdHIqKWRhdGEsIHN0cik7Cit9CisKK3ZvaWQgZXhwcl9nc3RyX3ByaW50KHN0cnVjdCBleHByICplLCBzdHJ1Y3QgZ3N0ciAqZ3MpCit7CisJZXhwcl9wcmludChlLCBleHByX3ByaW50X2dzdHJfaGVscGVyLCBncywgRV9OT05FKTsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9leHByLmggYi9zY3JpcHRzL2tjb25maWcvZXhwci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMzZlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvZXhwci5oCkBAIC0wLDAgKzEsMTk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2lmbmRlZiBFWFBSX0gKKyNkZWZpbmUgRVhQUl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaWZuZGVmIF9fY3BsdXNwbHVzCisjaW5jbHVkZSA8c3RkYm9vbC5oPgorI2VuZGlmCisKK3N0cnVjdCBmaWxlIHsKKwlzdHJ1Y3QgZmlsZSAqbmV4dDsKKwlzdHJ1Y3QgZmlsZSAqcGFyZW50OworCWNoYXIgKm5hbWU7CisJaW50IGxpbmVubzsKKwlpbnQgZmxhZ3M7Cit9OworCisjZGVmaW5lIEZJTEVfQlVTWQkJMHgwMDAxCisjZGVmaW5lIEZJTEVfU0NBTk5FRAkJMHgwMDAyCisjZGVmaW5lIEZJTEVfUFJJTlRFRAkJMHgwMDA0CisKK3R5cGVkZWYgZW51bSB0cmlzdGF0ZSB7CisJbm8sIG1vZCwgeWVzCit9IHRyaXN0YXRlOworCitlbnVtIGV4cHJfdHlwZSB7CisJRV9OT05FLCBFX09SLCBFX0FORCwgRV9OT1QsIEVfRVFVQUwsIEVfVU5FUVVBTCwgRV9DSE9JQ0UsIEVfU1lNQk9MLCBFX1JBTkdFCit9OworCit1bmlvbiBleHByX2RhdGEgeworCXN0cnVjdCBleHByICpleHByOworCXN0cnVjdCBzeW1ib2wgKnN5bTsKK307CisKK3N0cnVjdCBleHByIHsKKwllbnVtIGV4cHJfdHlwZSB0eXBlOworCXVuaW9uIGV4cHJfZGF0YSBsZWZ0LCByaWdodDsKK307CisKKyNkZWZpbmUgRV9PUihkZXAxLCBkZXAyKQkoKChkZXAxKT4oZGVwMikpPyhkZXAxKTooZGVwMikpCisjZGVmaW5lIEVfQU5EKGRlcDEsIGRlcDIpCSgoKGRlcDEpPChkZXAyKSk/KGRlcDEpOihkZXAyKSkKKyNkZWZpbmUgRV9OT1QoZGVwKQkJKDItKGRlcCkpCisKK3N0cnVjdCBleHByX3ZhbHVlIHsKKwlzdHJ1Y3QgZXhwciAqZXhwcjsKKwl0cmlzdGF0ZSB0cmk7Cit9OworCitzdHJ1Y3Qgc3ltYm9sX3ZhbHVlIHsKKwl2b2lkICp2YWw7CisJdHJpc3RhdGUgdHJpOworfTsKKworZW51bSBzeW1ib2xfdHlwZSB7CisJU19VTktOT1dOLCBTX0JPT0xFQU4sIFNfVFJJU1RBVEUsIFNfSU5ULCBTX0hFWCwgU19TVFJJTkcsIFNfT1RIRVIKK307CisKK3N0cnVjdCBzeW1ib2wgeworCXN0cnVjdCBzeW1ib2wgKm5leHQ7CisJY2hhciAqbmFtZTsKKwljaGFyICpoZWxwOworCWVudW0gc3ltYm9sX3R5cGUgdHlwZTsKKwlzdHJ1Y3Qgc3ltYm9sX3ZhbHVlIGN1cnIsIHVzZXI7CisJdHJpc3RhdGUgdmlzaWJsZTsKKwlpbnQgZmxhZ3M7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBleHByICpkZXAsICpkZXAyOworCXN0cnVjdCBleHByX3ZhbHVlIHJldl9kZXA7Cit9OworCisjZGVmaW5lIGZvcl9hbGxfc3ltYm9scyhpLCBzeW0pIGZvciAoaSA9IDA7IGkgPCAyNTc7IGkrKykgZm9yIChzeW0gPSBzeW1ib2xfaGFzaFtpXTsgc3ltOyBzeW0gPSBzeW0tPm5leHQpIGlmIChzeW0tPnR5cGUgIT0gU19PVEhFUikKKworI2RlZmluZSBTWU1CT0xfWUVTCQkweDAwMDEKKyNkZWZpbmUgU1lNQk9MX01PRAkJMHgwMDAyCisjZGVmaW5lIFNZTUJPTF9OTwkJMHgwMDA0CisjZGVmaW5lIFNZTUJPTF9DT05TVAkJMHgwMDA3CisjZGVmaW5lIFNZTUJPTF9DSEVDSwkJMHgwMDA4CisjZGVmaW5lIFNZTUJPTF9DSE9JQ0UJCTB4MDAxMAorI2RlZmluZSBTWU1CT0xfQ0hPSUNFVkFMCTB4MDAyMAorI2RlZmluZSBTWU1CT0xfUFJJTlRFRAkJMHgwMDQwCisjZGVmaW5lIFNZTUJPTF9WQUxJRAkJMHgwMDgwCisjZGVmaW5lIFNZTUJPTF9PUFRJT05BTAkJMHgwMTAwCisjZGVmaW5lIFNZTUJPTF9XUklURQkJMHgwMjAwCisjZGVmaW5lIFNZTUJPTF9DSEFOR0VECQkweDA0MDAKKyNkZWZpbmUgU1lNQk9MX05FVwkJMHgwODAwCisjZGVmaW5lIFNZTUJPTF9BVVRPCQkweDEwMDAKKyNkZWZpbmUgU1lNQk9MX0NIRUNLRUQJCTB4MjAwMAorI2RlZmluZSBTWU1CT0xfV0FSTkVECQkweDgwMDAKKworI2RlZmluZSBTWU1CT0xfTUFYTEVOR1RICTI1NgorI2RlZmluZSBTWU1CT0xfSEFTSFNJWkUJCTI1NworI2RlZmluZSBTWU1CT0xfSEFTSE1BU0sJCTB4ZmYKKworZW51bSBwcm9wX3R5cGUgeworCVBfVU5LTk9XTiwgUF9QUk9NUFQsIFBfQ09NTUVOVCwgUF9NRU5VLCBQX0RFRkFVTFQsIFBfQ0hPSUNFLCBQX1NFTEVDVCwgUF9SQU5HRQorfTsKKworc3RydWN0IHByb3BlcnR5IHsKKwlzdHJ1Y3QgcHJvcGVydHkgKm5leHQ7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCWVudW0gcHJvcF90eXBlIHR5cGU7CisJY29uc3QgY2hhciAqdGV4dDsKKwlzdHJ1Y3QgZXhwcl92YWx1ZSB2aXNpYmxlOworCXN0cnVjdCBleHByICpleHByOworCXN0cnVjdCBtZW51ICptZW51OworCXN0cnVjdCBmaWxlICpmaWxlOworCWludCBsaW5lbm87Cit9OworCisjZGVmaW5lIGZvcl9hbGxfcHJvcGVydGllcyhzeW0sIHN0LCB0b2spIFwKKwlmb3IgKHN0ID0gc3ltLT5wcm9wOyBzdDsgc3QgPSBzdC0+bmV4dCkgXAorCQlpZiAoc3QtPnR5cGUgPT0gKHRvaykpCisjZGVmaW5lIGZvcl9hbGxfZGVmYXVsdHMoc3ltLCBzdCkgZm9yX2FsbF9wcm9wZXJ0aWVzKHN5bSwgc3QsIFBfREVGQVVMVCkKKyNkZWZpbmUgZm9yX2FsbF9jaG9pY2VzKHN5bSwgc3QpIGZvcl9hbGxfcHJvcGVydGllcyhzeW0sIHN0LCBQX0NIT0lDRSkKKyNkZWZpbmUgZm9yX2FsbF9wcm9tcHRzKHN5bSwgc3QpIFwKKwlmb3IgKHN0ID0gc3ltLT5wcm9wOyBzdDsgc3QgPSBzdC0+bmV4dCkgXAorCQlpZiAoc3QtPnRleHQpCisKK3N0cnVjdCBtZW51IHsKKwlzdHJ1Y3QgbWVudSAqbmV4dDsKKwlzdHJ1Y3QgbWVudSAqcGFyZW50OworCXN0cnVjdCBtZW51ICpsaXN0OworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb21wdDsKKwlzdHJ1Y3QgZXhwciAqZGVwOworCXVuc2lnbmVkIGludCBmbGFnczsKKwkvL2NoYXIgKmhlbHA7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJaW50IGxpbmVubzsKKwl2b2lkICpkYXRhOworfTsKKworI2RlZmluZSBNRU5VX0NIQU5HRUQJCTB4MDAwMQorI2RlZmluZSBNRU5VX1JPT1QJCTB4MDAwMgorCisjaWZuZGVmIFNXSUcKKworZXh0ZXJuIHN0cnVjdCBmaWxlICpmaWxlX2xpc3Q7CitleHRlcm4gc3RydWN0IGZpbGUgKmN1cnJlbnRfZmlsZTsKK3N0cnVjdCBmaWxlICpsb29rdXBfZmlsZShjb25zdCBjaGFyICpuYW1lKTsKKworZXh0ZXJuIHN0cnVjdCBzeW1ib2wgc3ltYm9sX3llcywgc3ltYm9sX25vLCBzeW1ib2xfbW9kOworZXh0ZXJuIHN0cnVjdCBzeW1ib2wgKm1vZHVsZXNfc3ltOworZXh0ZXJuIGludCBjZGVidWc7CitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19zeW1ib2woc3RydWN0IHN5bWJvbCAqc3ltKTsKK3N0cnVjdCBleHByICpleHByX2FsbG9jX29uZShlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqY2UpOworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2NfdHdvKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKTsKK3N0cnVjdCBleHByICpleHByX2FsbG9jX2NvbXAoZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IHN5bWJvbCAqczEsIHN0cnVjdCBzeW1ib2wgKnMyKTsKK3N0cnVjdCBleHByICpleHByX2FsbG9jX2FuZChzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMik7CitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19vcihzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMik7CitzdHJ1Y3QgZXhwciAqZXhwcl9jb3B5KHN0cnVjdCBleHByICpvcmcpOwordm9pZCBleHByX2ZyZWUoc3RydWN0IGV4cHIgKmUpOworaW50IGV4cHJfZXEoc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpOwordm9pZCBleHByX2VsaW1pbmF0ZV9lcShzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpOwordHJpc3RhdGUgZXhwcl9jYWxjX3ZhbHVlKHN0cnVjdCBleHByICplKTsKK3N0cnVjdCBleHByICpleHByX2VsaW1pbmF0ZV95bihzdHJ1Y3QgZXhwciAqZSk7CitzdHJ1Y3QgZXhwciAqZXhwcl90cmFuc19ib29sKHN0cnVjdCBleHByICplKTsKK3N0cnVjdCBleHByICpleHByX2VsaW1pbmF0ZV9kdXBzKHN0cnVjdCBleHByICplKTsKK3N0cnVjdCBleHByICpleHByX3RyYW5zZm9ybShzdHJ1Y3QgZXhwciAqZSk7CitpbnQgZXhwcl9jb250YWluc19zeW1ib2woc3RydWN0IGV4cHIgKmRlcCwgc3RydWN0IHN5bWJvbCAqc3ltKTsKK2Jvb2wgZXhwcl9kZXBlbmRzX3N5bWJvbChzdHJ1Y3QgZXhwciAqZGVwLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pOworc3RydWN0IGV4cHIgKmV4cHJfZXh0cmFjdF9lcV9hbmQoc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKTsKK3N0cnVjdCBleHByICpleHByX2V4dHJhY3RfZXFfb3Ioc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKTsKK3ZvaWQgZXhwcl9leHRyYWN0X2VxKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBleHByICoqZXAsIHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMik7CitzdHJ1Y3QgZXhwciAqZXhwcl90cmFuc19jb21wYXJlKHN0cnVjdCBleHByICplLCBlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pOworCit2b2lkIGV4cHJfZnByaW50KHN0cnVjdCBleHByICplLCBGSUxFICpvdXQpOworc3RydWN0IGdzdHI7IC8qIGZvcndhcmQgKi8KK3ZvaWQgZXhwcl9nc3RyX3ByaW50KHN0cnVjdCBleHByICplLCBzdHJ1Y3QgZ3N0ciAqZ3MpOworCitzdGF0aWMgaW5saW5lIGludCBleHByX2lzX3llcyhzdHJ1Y3QgZXhwciAqZSkKK3sKKwlyZXR1cm4gIWUgfHwgKGUtPnR5cGUgPT0gRV9TWU1CT0wgJiYgZS0+bGVmdC5zeW0gPT0gJnN5bWJvbF95ZXMpOworfQorCitzdGF0aWMgaW5saW5lIGludCBleHByX2lzX25vKHN0cnVjdCBleHByICplKQoreworCXJldHVybiBlICYmIChlLT50eXBlID09IEVfU1lNQk9MICYmIGUtPmxlZnQuc3ltID09ICZzeW1ib2xfbm8pOworfQorI2VuZGlmCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBFWFBSX0ggKi8KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9nY29uZi5jIGIvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhYjE3ZAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9nY29uZi5jCkBAIC0wLDAgKzEsMTY0NCBAQAorLyogSGV5IEVNQUNTIC0qLSBsaW51eC1jIC0qLSAqLworLyoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwMyBSb21haW4gTGlldmluIDxyb21zQHRpbHAuaW5mbz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICoKKyAqLworCisjaWZkZWYgSEFWRV9DT05GSUdfSAorIyAgaW5jbHVkZSA8Y29uZmlnLmg+CisjZW5kaWYKKworI2luY2x1ZGUgImxrYy5oIgorI2luY2x1ZGUgImltYWdlcy5jIgorCisjaW5jbHVkZSA8Z2xhZGUvZ2xhZGUuaD4KKyNpbmNsdWRlIDxndGsvZ3RrLmg+CisjaW5jbHVkZSA8Z2xpYi5oPgorI2luY2x1ZGUgPGdkay9nZGtrZXlzeW1zLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLy8jZGVmaW5lIERFQlVHCisKK2VudW0geworCVNJTkdMRV9WSUVXLCBTUExJVF9WSUVXLCBGVUxMX1ZJRVcKK307CisKK3N0YXRpYyBnaW50IHZpZXdfbW9kZSA9IEZVTExfVklFVzsKK3N0YXRpYyBnYm9vbGVhbiBzaG93X25hbWUgPSBUUlVFOworc3RhdGljIGdib29sZWFuIHNob3dfcmFuZ2UgPSBUUlVFOworc3RhdGljIGdib29sZWFuIHNob3dfdmFsdWUgPSBUUlVFOworc3RhdGljIGdib29sZWFuIHNob3dfYWxsID0gRkFMU0U7CitzdGF0aWMgZ2Jvb2xlYW4gc2hvd19kZWJ1ZyA9IEZBTFNFOworc3RhdGljIGdib29sZWFuIHJlc2l6ZWFibGUgPSBGQUxTRTsKKworc3RhdGljIGdib29sZWFuIGNvbmZpZ19jaGFuZ2VkID0gRkFMU0U7CisKK3N0YXRpYyBjaGFyIG5vaGVscF90ZXh0W10gPQorICAgIE5fKCJTb3JyeSwgbm8gaGVscCBhdmFpbGFibGUgZm9yIHRoaXMgb3B0aW9uIHlldC5cbiIpOworCitHdGtXaWRnZXQgKm1haW5fd25kID0gTlVMTDsKK0d0a1dpZGdldCAqdHJlZTFfdyA9IE5VTEw7CS8vIGxlZnQgIGZyYW1lCitHdGtXaWRnZXQgKnRyZWUyX3cgPSBOVUxMOwkvLyByaWdodCBmcmFtZQorR3RrV2lkZ2V0ICp0ZXh0X3cgPSBOVUxMOworR3RrV2lkZ2V0ICpocGFuZWQgPSBOVUxMOworR3RrV2lkZ2V0ICp2cGFuZWQgPSBOVUxMOworR3RrV2lkZ2V0ICpiYWNrX2J0biA9IE5VTEw7CisKK0d0a1RleHRUYWcgKnRhZzEsICp0YWcyOworR2RrQ29sb3IgY29sb3I7CisKK0d0a1RyZWVTdG9yZSAqdHJlZTEsICp0cmVlMiwgKnRyZWU7CitHdGtUcmVlTW9kZWwgKm1vZGVsMSwgKm1vZGVsMjsKK3N0YXRpYyBHdGtUcmVlSXRlciAqcGFyZW50c1syNTZdOworc3RhdGljIGdpbnQgaW5kZW50OworCitzdGF0aWMgc3RydWN0IG1lbnUgKmN1cnJlbnQ7IC8vIGN1cnJlbnQgbm9kZSBmb3IgU0lOR0xFIHZpZXcKK3N0YXRpYyBzdHJ1Y3QgbWVudSAqYnJvd3NlZDsgLy8gYnJvd3NlZCBub2RlIGZvciBTUExJVCB2aWV3CisKK2VudW0geworCUNPTF9PUFRJT04sIENPTF9OQU1FLCBDT0xfTk8sIENPTF9NT0QsIENPTF9ZRVMsIENPTF9WQUxVRSwKKwlDT0xfTUVOVSwgQ09MX0NPTE9SLCBDT0xfRURJVCwgQ09MX1BJWEJVRiwKKwlDT0xfUElYVklTLCBDT0xfQlROVklTLCBDT0xfQlROQUNULCBDT0xfQlROSU5DLCBDT0xfQlROUkFELAorCUNPTF9OVU1CRVIKK307CisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfbGlzdCh2b2lkKTsKK3N0YXRpYyB2b2lkIGRpc3BsYXlfdHJlZShzdHJ1Y3QgbWVudSAqbWVudSk7CitzdGF0aWMgdm9pZCBkaXNwbGF5X3RyZWVfcGFydCh2b2lkKTsKK3N0YXRpYyB2b2lkIHVwZGF0ZV90cmVlKHN0cnVjdCBtZW51ICpzcmMsIEd0a1RyZWVJdGVyICogZHN0KTsKK3N0YXRpYyB2b2lkIHNldF9ub2RlKEd0a1RyZWVJdGVyICogbm9kZSwgc3RydWN0IG1lbnUgKm1lbnUsIGdjaGFyICoqIHJvdyk7CitzdGF0aWMgZ2NoYXIgKipmaWxsX3JvdyhzdHJ1Y3QgbWVudSAqbWVudSk7CisKKworLyogSGVscGluZy9EZWJ1Z2dpbmcgRnVuY3Rpb25zICovCisKKworY29uc3QgY2hhciAqZGJnX3ByaW50X3N0eXBlKGludCB2YWwpCit7CisJc3RhdGljIGNoYXIgYnVmWzI1Nl07CisKKwltZW1zZXQoYnVmLCAwLCAyNTYpOworCisJaWYgKHZhbCA9PSBTX1VOS05PV04pCisJCXN0cmNweShidWYsICJ1bmtub3duIik7CisJaWYgKHZhbCA9PSBTX0JPT0xFQU4pCisJCXN0cmNweShidWYsICJib29sZWFuIik7CisJaWYgKHZhbCA9PSBTX1RSSVNUQVRFKQorCQlzdHJjcHkoYnVmLCAidHJpc3RhdGUiKTsKKwlpZiAodmFsID09IFNfSU5UKQorCQlzdHJjcHkoYnVmLCAiaW50Iik7CisJaWYgKHZhbCA9PSBTX0hFWCkKKwkJc3RyY3B5KGJ1ZiwgImhleCIpOworCWlmICh2YWwgPT0gU19TVFJJTkcpCisJCXN0cmNweShidWYsICJzdHJpbmciKTsKKwlpZiAodmFsID09IFNfT1RIRVIpCisJCXN0cmNweShidWYsICJvdGhlciIpOworCisjaWZkZWYgREVCVUcKKwlwcmludGYoIiVzIiwgYnVmKTsKKyNlbmRpZgorCisJcmV0dXJuIGJ1ZjsKK30KKworY29uc3QgY2hhciAqZGJnX3ByaW50X2ZsYWdzKGludCB2YWwpCit7CisJc3RhdGljIGNoYXIgYnVmWzI1Nl07CisKKwltZW1zZXQoYnVmLCAwLCAyNTYpOworCisJaWYgKHZhbCAmIFNZTUJPTF9ZRVMpCisJCXN0cmNhdChidWYsICJ5ZXMvIik7CisJaWYgKHZhbCAmIFNZTUJPTF9NT0QpCisJCXN0cmNhdChidWYsICJtb2QvIik7CisJaWYgKHZhbCAmIFNZTUJPTF9OTykKKwkJc3RyY2F0KGJ1ZiwgIm5vLyIpOworCWlmICh2YWwgJiBTWU1CT0xfQ09OU1QpCisJCXN0cmNhdChidWYsICJjb25zdC8iKTsKKwlpZiAodmFsICYgU1lNQk9MX0NIRUNLKQorCQlzdHJjYXQoYnVmLCAiY2hlY2svIik7CisJaWYgKHZhbCAmIFNZTUJPTF9DSE9JQ0UpCisJCXN0cmNhdChidWYsICJjaG9pY2UvIik7CisJaWYgKHZhbCAmIFNZTUJPTF9DSE9JQ0VWQUwpCisJCXN0cmNhdChidWYsICJjaG9pY2V2YWwvIik7CisJaWYgKHZhbCAmIFNZTUJPTF9QUklOVEVEKQorCQlzdHJjYXQoYnVmLCAicHJpbnRlZC8iKTsKKwlpZiAodmFsICYgU1lNQk9MX1ZBTElEKQorCQlzdHJjYXQoYnVmLCAidmFsaWQvIik7CisJaWYgKHZhbCAmIFNZTUJPTF9PUFRJT05BTCkKKwkJc3RyY2F0KGJ1ZiwgIm9wdGlvbmFsLyIpOworCWlmICh2YWwgJiBTWU1CT0xfV1JJVEUpCisJCXN0cmNhdChidWYsICJ3cml0ZS8iKTsKKwlpZiAodmFsICYgU1lNQk9MX0NIQU5HRUQpCisJCXN0cmNhdChidWYsICJjaGFuZ2VkLyIpOworCWlmICh2YWwgJiBTWU1CT0xfTkVXKQorCQlzdHJjYXQoYnVmLCAibmV3LyIpOworCWlmICh2YWwgJiBTWU1CT0xfQVVUTykKKwkJc3RyY2F0KGJ1ZiwgImF1dG8vIik7CisKKwlidWZbc3RybGVuKGJ1ZikgLSAxXSA9ICdcMCc7CisjaWZkZWYgREVCVUcKKwlwcmludGYoIiVzIiwgYnVmKTsKKyNlbmRpZgorCisJcmV0dXJuIGJ1ZjsKK30KKworY29uc3QgY2hhciAqZGJnX3ByaW50X3B0eXBlKGludCB2YWwpCit7CisJc3RhdGljIGNoYXIgYnVmWzI1Nl07CisKKwltZW1zZXQoYnVmLCAwLCAyNTYpOworCisJaWYgKHZhbCA9PSBQX1VOS05PV04pCisJCXN0cmNweShidWYsICJ1bmtub3duIik7CisJaWYgKHZhbCA9PSBQX1BST01QVCkKKwkJc3RyY3B5KGJ1ZiwgInByb21wdCIpOworCWlmICh2YWwgPT0gUF9DT01NRU5UKQorCQlzdHJjcHkoYnVmLCAiY29tbWVudCIpOworCWlmICh2YWwgPT0gUF9NRU5VKQorCQlzdHJjcHkoYnVmLCAibWVudSIpOworCWlmICh2YWwgPT0gUF9ERUZBVUxUKQorCQlzdHJjcHkoYnVmLCAiZGVmYXVsdCIpOworCWlmICh2YWwgPT0gUF9DSE9JQ0UpCisJCXN0cmNweShidWYsICJjaG9pY2UiKTsKKworI2lmZGVmIERFQlVHCisJcHJpbnRmKCIlcyIsIGJ1Zik7CisjZW5kaWYKKworCXJldHVybiBidWY7Cit9CisKKwordm9pZCByZXBsYWNlX2J1dHRvbl9pY29uKEdsYWRlWE1MICogeG1sLCBHZGtEcmF3YWJsZSAqIHdpbmRvdywKKwkJCSBHdGtTdHlsZSAqIHN0eWxlLCBnY2hhciAqIGJ0bl9uYW1lLCBnY2hhciAqKiB4cG0pCit7CisJR2RrUGl4bWFwICpwaXhtYXA7CisJR2RrQml0bWFwICptYXNrOworCUd0a1Rvb2xCdXR0b24gKmJ1dHRvbjsKKwlHdGtXaWRnZXQgKmltYWdlOworCisJcGl4bWFwID0gZ2RrX3BpeG1hcF9jcmVhdGVfZnJvbV94cG1fZCh3aW5kb3csICZtYXNrLAorCQkJCQkgICAgICAmc3R5bGUtPmJnW0dUS19TVEFURV9OT1JNQUxdLAorCQkJCQkgICAgICB4cG0pOworCisJYnV0dG9uID0gR1RLX1RPT0xfQlVUVE9OKGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgYnRuX25hbWUpKTsKKwlpbWFnZSA9IGd0a19pbWFnZV9uZXdfZnJvbV9waXhtYXAocGl4bWFwLCBtYXNrKTsKKwlndGtfd2lkZ2V0X3Nob3coaW1hZ2UpOworCWd0a190b29sX2J1dHRvbl9zZXRfaWNvbl93aWRnZXQoYnV0dG9uLCBpbWFnZSk7Cit9CisKKy8qIE1haW4gV2luZG93IEluaXRpYWxpemF0aW9uICovCit2b2lkIGluaXRfbWFpbl93aW5kb3coY29uc3QgZ2NoYXIgKiBnbGFkZV9maWxlKQoreworCUdsYWRlWE1MICp4bWw7CisJR3RrV2lkZ2V0ICp3aWRnZXQ7CisJR3RrVGV4dEJ1ZmZlciAqdHh0YnVmOworCWNoYXIgdGl0bGVbMjU2XTsKKwlHdGtTdHlsZSAqc3R5bGU7CisKKwl4bWwgPSBnbGFkZV94bWxfbmV3KGdsYWRlX2ZpbGUsICJ3aW5kb3cxIiwgTlVMTCk7CisJaWYgKCF4bWwpCisJCWdfZXJyb3IoXygiR1VJIGxvYWRpbmcgZmFpbGVkICFcbiIpKTsKKwlnbGFkZV94bWxfc2lnbmFsX2F1dG9jb25uZWN0KHhtbCk7CisKKwltYWluX3duZCA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgIndpbmRvdzEiKTsKKwlocGFuZWQgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJocGFuZWQxIik7CisJdnBhbmVkID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAidnBhbmVkMSIpOworCXRyZWUxX3cgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJ0cmVldmlldzEiKTsKKwl0cmVlMl93ID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAidHJlZXZpZXcyIik7CisJdGV4dF93ID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAidGV4dHZpZXczIik7CisKKwliYWNrX2J0biA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgImJ1dHRvbjEiKTsKKwlndGtfd2lkZ2V0X3NldF9zZW5zaXRpdmUoYmFja19idG4sIEZBTFNFKTsKKworCXdpZGdldCA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgInNob3dfbmFtZTEiKTsKKwlndGtfY2hlY2tfbWVudV9pdGVtX3NldF9hY3RpdmUoKEd0a0NoZWNrTWVudUl0ZW0gKikgd2lkZ2V0LAorCQkJCSAgICAgICBzaG93X25hbWUpOworCisJd2lkZ2V0ID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAic2hvd19yYW5nZTEiKTsKKwlndGtfY2hlY2tfbWVudV9pdGVtX3NldF9hY3RpdmUoKEd0a0NoZWNrTWVudUl0ZW0gKikgd2lkZ2V0LAorCQkJCSAgICAgICBzaG93X3JhbmdlKTsKKworCXdpZGdldCA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgInNob3dfZGF0YTEiKTsKKwlndGtfY2hlY2tfbWVudV9pdGVtX3NldF9hY3RpdmUoKEd0a0NoZWNrTWVudUl0ZW0gKikgd2lkZ2V0LAorCQkJCSAgICAgICBzaG93X3ZhbHVlKTsKKworCXN0eWxlID0gZ3RrX3dpZGdldF9nZXRfc3R5bGUobWFpbl93bmQpOworCXdpZGdldCA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgInRvb2xiYXIxIik7CisKKyNpZiAwCS8qIFVzZSBzdG9jayBHdGsgaWNvbnMgaW5zdGVhZCAqLworCXJlcGxhY2VfYnV0dG9uX2ljb24oeG1sLCBtYWluX3duZC0+d2luZG93LCBzdHlsZSwKKwkJCSAgICAiYnV0dG9uMSIsIChnY2hhciAqKikgeHBtX2JhY2spOworCXJlcGxhY2VfYnV0dG9uX2ljb24oeG1sLCBtYWluX3duZC0+d2luZG93LCBzdHlsZSwKKwkJCSAgICAiYnV0dG9uMiIsIChnY2hhciAqKikgeHBtX2xvYWQpOworCXJlcGxhY2VfYnV0dG9uX2ljb24oeG1sLCBtYWluX3duZC0+d2luZG93LCBzdHlsZSwKKwkJCSAgICAiYnV0dG9uMyIsIChnY2hhciAqKikgeHBtX3NhdmUpOworI2VuZGlmCisJcmVwbGFjZV9idXR0b25faWNvbih4bWwsIG1haW5fd25kLT53aW5kb3csIHN0eWxlLAorCQkJICAgICJidXR0b240IiwgKGdjaGFyICoqKSB4cG1fc2luZ2xlX3ZpZXcpOworCXJlcGxhY2VfYnV0dG9uX2ljb24oeG1sLCBtYWluX3duZC0+d2luZG93LCBzdHlsZSwKKwkJCSAgICAiYnV0dG9uNSIsIChnY2hhciAqKikgeHBtX3NwbGl0X3ZpZXcpOworCXJlcGxhY2VfYnV0dG9uX2ljb24oeG1sLCBtYWluX3duZC0+d2luZG93LCBzdHlsZSwKKwkJCSAgICAiYnV0dG9uNiIsIChnY2hhciAqKikgeHBtX3RyZWVfdmlldyk7CisKKyNpZiAwCisJc3dpdGNoICh2aWV3X21vZGUpIHsKKwljYXNlIFNJTkdMRV9WSUVXOgorCQl3aWRnZXQgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJidXR0b240Iik7CisJCWdfc2lnbmFsX2VtaXRfYnlfbmFtZSh3aWRnZXQsICJjbGlja2VkIik7CisJCWJyZWFrOworCWNhc2UgU1BMSVRfVklFVzoKKwkJd2lkZ2V0ID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAiYnV0dG9uNSIpOworCQlnX3NpZ25hbF9lbWl0X2J5X25hbWUod2lkZ2V0LCAiY2xpY2tlZCIpOworCQlicmVhazsKKwljYXNlIEZVTExfVklFVzoKKwkJd2lkZ2V0ID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAiYnV0dG9uNiIpOworCQlnX3NpZ25hbF9lbWl0X2J5X25hbWUod2lkZ2V0LCAiY2xpY2tlZCIpOworCQlicmVhazsKKwl9CisjZW5kaWYKKwl0eHRidWYgPSBndGtfdGV4dF92aWV3X2dldF9idWZmZXIoR1RLX1RFWFRfVklFVyh0ZXh0X3cpKTsKKwl0YWcxID0gZ3RrX3RleHRfYnVmZmVyX2NyZWF0ZV90YWcodHh0YnVmLCAibXl0YWcxIiwKKwkJCQkJICAiZm9yZWdyb3VuZCIsICJyZWQiLAorCQkJCQkgICJ3ZWlnaHQiLCBQQU5HT19XRUlHSFRfQk9MRCwKKwkJCQkJICBOVUxMKTsKKwl0YWcyID0gZ3RrX3RleHRfYnVmZmVyX2NyZWF0ZV90YWcodHh0YnVmLCAibXl0YWcyIiwKKwkJCQkJICAvKiJzdHlsZSIsIFBBTkdPX1NUWUxFX09CTElRVUUsICovCisJCQkJCSAgTlVMTCk7CisKKwlzcHJpbnRmKHRpdGxlLCBfKCJCdXN5Qm94ICVzIENvbmZpZ3VyYXRpb24iKSwKKwkJZ2V0ZW52KCJLRVJORUxWRVJTSU9OIikpOworCWd0a193aW5kb3dfc2V0X3RpdGxlKEdUS19XSU5ET1cobWFpbl93bmQpLCB0aXRsZSk7CisKKwlndGtfd2lkZ2V0X3Nob3cobWFpbl93bmQpOworfQorCit2b2lkIGluaXRfdHJlZV9tb2RlbCh2b2lkKQoreworCWdpbnQgaTsKKworCXRyZWUgPSB0cmVlMiA9IGd0a190cmVlX3N0b3JlX25ldyhDT0xfTlVNQkVSLAorCQkJCQkgIEdfVFlQRV9TVFJJTkcsIEdfVFlQRV9TVFJJTkcsCisJCQkJCSAgR19UWVBFX1NUUklORywgR19UWVBFX1NUUklORywKKwkJCQkJICBHX1RZUEVfU1RSSU5HLCBHX1RZUEVfU1RSSU5HLAorCQkJCQkgIEdfVFlQRV9QT0lOVEVSLCBHREtfVFlQRV9DT0xPUiwKKwkJCQkJICBHX1RZUEVfQk9PTEVBTiwgR0RLX1RZUEVfUElYQlVGLAorCQkJCQkgIEdfVFlQRV9CT09MRUFOLCBHX1RZUEVfQk9PTEVBTiwKKwkJCQkJICBHX1RZUEVfQk9PTEVBTiwgR19UWVBFX0JPT0xFQU4sCisJCQkJCSAgR19UWVBFX0JPT0xFQU4pOworCW1vZGVsMiA9IEdUS19UUkVFX01PREVMKHRyZWUyKTsKKworCWZvciAocGFyZW50c1swXSA9IE5VTEwsIGkgPSAxOyBpIDwgMjU2OyBpKyspCisJCXBhcmVudHNbaV0gPSAoR3RrVHJlZUl0ZXIgKikgZ19tYWxsb2Moc2l6ZW9mKEd0a1RyZWVJdGVyKSk7CisKKwl0cmVlMSA9IGd0a190cmVlX3N0b3JlX25ldyhDT0xfTlVNQkVSLAorCQkJCSAgIEdfVFlQRV9TVFJJTkcsIEdfVFlQRV9TVFJJTkcsCisJCQkJICAgR19UWVBFX1NUUklORywgR19UWVBFX1NUUklORywKKwkJCQkgICBHX1RZUEVfU1RSSU5HLCBHX1RZUEVfU1RSSU5HLAorCQkJCSAgIEdfVFlQRV9QT0lOVEVSLCBHREtfVFlQRV9DT0xPUiwKKwkJCQkgICBHX1RZUEVfQk9PTEVBTiwgR0RLX1RZUEVfUElYQlVGLAorCQkJCSAgIEdfVFlQRV9CT09MRUFOLCBHX1RZUEVfQk9PTEVBTiwKKwkJCQkgICBHX1RZUEVfQk9PTEVBTiwgR19UWVBFX0JPT0xFQU4sCisJCQkJICAgR19UWVBFX0JPT0xFQU4pOworCW1vZGVsMSA9IEdUS19UUkVFX01PREVMKHRyZWUxKTsKK30KKwordm9pZCBpbml0X2xlZnRfdHJlZSh2b2lkKQoreworCUd0a1RyZWVWaWV3ICp2aWV3ID0gR1RLX1RSRUVfVklFVyh0cmVlMV93KTsKKwlHdGtDZWxsUmVuZGVyZXIgKnJlbmRlcmVyOworCUd0a1RyZWVTZWxlY3Rpb24gKnNlbDsKKwlHdGtUcmVlVmlld0NvbHVtbiAqY29sdW1uOworCisJZ3RrX3RyZWVfdmlld19zZXRfbW9kZWwodmlldywgbW9kZWwxKTsKKwlndGtfdHJlZV92aWV3X3NldF9oZWFkZXJzX3Zpc2libGUodmlldywgVFJVRSk7CisJZ3RrX3RyZWVfdmlld19zZXRfcnVsZXNfaGludCh2aWV3LCBGQUxTRSk7CisKKwljb2x1bW4gPSBndGtfdHJlZV92aWV3X2NvbHVtbl9uZXcoKTsKKwlndGtfdHJlZV92aWV3X2FwcGVuZF9jb2x1bW4odmlldywgY29sdW1uKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdGl0bGUoY29sdW1uLCBfKCJPcHRpb25zIikpOworCisJcmVuZGVyZXIgPSBndGtfY2VsbF9yZW5kZXJlcl90b2dnbGVfbmV3KCk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fcGFja19zdGFydChHVEtfVFJFRV9WSUVXX0NPTFVNTihjb2x1bW4pLAorCQkJCQlyZW5kZXJlciwgRkFMU0UpOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF9hdHRyaWJ1dGVzKEdUS19UUkVFX1ZJRVdfQ09MVU1OKGNvbHVtbiksCisJCQkJCSAgICByZW5kZXJlciwKKwkJCQkJICAgICJhY3RpdmUiLCBDT0xfQlROQUNULAorCQkJCQkgICAgImluY29uc2lzdGVudCIsIENPTF9CVE5JTkMsCisJCQkJCSAgICAidmlzaWJsZSIsIENPTF9CVE5WSVMsCisJCQkJCSAgICAicmFkaW8iLCBDT0xfQlROUkFELCBOVUxMKTsKKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3RleHRfbmV3KCk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fcGFja19zdGFydChHVEtfVFJFRV9WSUVXX0NPTFVNTihjb2x1bW4pLAorCQkJCQlyZW5kZXJlciwgRkFMU0UpOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF9hdHRyaWJ1dGVzKEdUS19UUkVFX1ZJRVdfQ09MVU1OKGNvbHVtbiksCisJCQkJCSAgICByZW5kZXJlciwKKwkJCQkJICAgICJ0ZXh0IiwgQ09MX09QVElPTiwKKwkJCQkJICAgICJmb3JlZ3JvdW5kLWdkayIsCisJCQkJCSAgICBDT0xfQ09MT1IsIE5VTEwpOworCisJc2VsID0gZ3RrX3RyZWVfdmlld19nZXRfc2VsZWN0aW9uKHZpZXcpOworCWd0a190cmVlX3NlbGVjdGlvbl9zZXRfbW9kZShzZWwsIEdUS19TRUxFQ1RJT05fU0lOR0xFKTsKKwlndGtfd2lkZ2V0X3JlYWxpemUodHJlZTFfdyk7Cit9CisKK3N0YXRpYyB2b2lkIHJlbmRlcmVyX2VkaXRlZChHdGtDZWxsUmVuZGVyZXJUZXh0ICogY2VsbCwKKwkJCSAgICBjb25zdCBnY2hhciAqIHBhdGhfc3RyaW5nLAorCQkJICAgIGNvbnN0IGdjaGFyICogbmV3X3RleHQsIGdwb2ludGVyIHVzZXJfZGF0YSk7CitzdGF0aWMgdm9pZCByZW5kZXJlcl90b2dnbGVkKEd0a0NlbGxSZW5kZXJlclRvZ2dsZSAqIGNlbGxyZW5kZXJlcnRvZ2dsZSwKKwkJCSAgICAgZ2NoYXIgKiBhcmcxLCBncG9pbnRlciB1c2VyX2RhdGEpOworCit2b2lkIGluaXRfcmlnaHRfdHJlZSh2b2lkKQoreworCUd0a1RyZWVWaWV3ICp2aWV3ID0gR1RLX1RSRUVfVklFVyh0cmVlMl93KTsKKwlHdGtDZWxsUmVuZGVyZXIgKnJlbmRlcmVyOworCUd0a1RyZWVTZWxlY3Rpb24gKnNlbDsKKwlHdGtUcmVlVmlld0NvbHVtbiAqY29sdW1uOworCWdpbnQgaTsKKworCWd0a190cmVlX3ZpZXdfc2V0X21vZGVsKHZpZXcsIG1vZGVsMik7CisJZ3RrX3RyZWVfdmlld19zZXRfaGVhZGVyc192aXNpYmxlKHZpZXcsIFRSVUUpOworCWd0a190cmVlX3ZpZXdfc2V0X3J1bGVzX2hpbnQodmlldywgRkFMU0UpOworCisJY29sdW1uID0gZ3RrX3RyZWVfdmlld19jb2x1bW5fbmV3KCk7CisJZ3RrX3RyZWVfdmlld19hcHBlbmRfY29sdW1uKHZpZXcsIGNvbHVtbik7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3RpdGxlKGNvbHVtbiwgXygiT3B0aW9ucyIpKTsKKworCXJlbmRlcmVyID0gZ3RrX2NlbGxfcmVuZGVyZXJfcGl4YnVmX25ldygpOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3BhY2tfc3RhcnQoR1RLX1RSRUVfVklFV19DT0xVTU4oY29sdW1uKSwKKwkJCQkJcmVuZGVyZXIsIEZBTFNFKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfYXR0cmlidXRlcyhHVEtfVFJFRV9WSUVXX0NPTFVNTihjb2x1bW4pLAorCQkJCQkgICAgcmVuZGVyZXIsCisJCQkJCSAgICAicGl4YnVmIiwgQ09MX1BJWEJVRiwKKwkJCQkJICAgICJ2aXNpYmxlIiwgQ09MX1BJWFZJUywgTlVMTCk7CisJcmVuZGVyZXIgPSBndGtfY2VsbF9yZW5kZXJlcl90b2dnbGVfbmV3KCk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fcGFja19zdGFydChHVEtfVFJFRV9WSUVXX0NPTFVNTihjb2x1bW4pLAorCQkJCQlyZW5kZXJlciwgRkFMU0UpOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF9hdHRyaWJ1dGVzKEdUS19UUkVFX1ZJRVdfQ09MVU1OKGNvbHVtbiksCisJCQkJCSAgICByZW5kZXJlciwKKwkJCQkJICAgICJhY3RpdmUiLCBDT0xfQlROQUNULAorCQkJCQkgICAgImluY29uc2lzdGVudCIsIENPTF9CVE5JTkMsCisJCQkJCSAgICAidmlzaWJsZSIsIENPTF9CVE5WSVMsCisJCQkJCSAgICAicmFkaW8iLCBDT0xfQlROUkFELCBOVUxMKTsKKwkvKmdfc2lnbmFsX2Nvbm5lY3QoR19PQkpFQ1QocmVuZGVyZXIpLCAidG9nZ2xlZCIsCisJICAgR19DQUxMQkFDSyhyZW5kZXJlcl90b2dnbGVkKSwgTlVMTCk7ICovCisJcmVuZGVyZXIgPSBndGtfY2VsbF9yZW5kZXJlcl90ZXh0X25ldygpOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3BhY2tfc3RhcnQoR1RLX1RSRUVfVklFV19DT0xVTU4oY29sdW1uKSwKKwkJCQkJcmVuZGVyZXIsIEZBTFNFKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfYXR0cmlidXRlcyhHVEtfVFJFRV9WSUVXX0NPTFVNTihjb2x1bW4pLAorCQkJCQkgICAgcmVuZGVyZXIsCisJCQkJCSAgICAidGV4dCIsIENPTF9PUFRJT04sCisJCQkJCSAgICAiZm9yZWdyb3VuZC1nZGsiLAorCQkJCQkgICAgQ09MX0NPTE9SLCBOVUxMKTsKKworCXJlbmRlcmVyID0gZ3RrX2NlbGxfcmVuZGVyZXJfdGV4dF9uZXcoKTsKKwlndGtfdHJlZV92aWV3X2luc2VydF9jb2x1bW5fd2l0aF9hdHRyaWJ1dGVzKHZpZXcsIC0xLAorCQkJCQkJICAgIF8oIk5hbWUiKSwgcmVuZGVyZXIsCisJCQkJCQkgICAgInRleHQiLCBDT0xfTkFNRSwKKwkJCQkJCSAgICAiZm9yZWdyb3VuZC1nZGsiLAorCQkJCQkJICAgIENPTF9DT0xPUiwgTlVMTCk7CisJcmVuZGVyZXIgPSBndGtfY2VsbF9yZW5kZXJlcl90ZXh0X25ldygpOworCWd0a190cmVlX3ZpZXdfaW5zZXJ0X2NvbHVtbl93aXRoX2F0dHJpYnV0ZXModmlldywgLTEsCisJCQkJCQkgICAgIk4iLCByZW5kZXJlciwKKwkJCQkJCSAgICAidGV4dCIsIENPTF9OTywKKwkJCQkJCSAgICAiZm9yZWdyb3VuZC1nZGsiLAorCQkJCQkJICAgIENPTF9DT0xPUiwgTlVMTCk7CisJcmVuZGVyZXIgPSBndGtfY2VsbF9yZW5kZXJlcl90ZXh0X25ldygpOworCWd0a190cmVlX3ZpZXdfaW5zZXJ0X2NvbHVtbl93aXRoX2F0dHJpYnV0ZXModmlldywgLTEsCisJCQkJCQkgICAgIk0iLCByZW5kZXJlciwKKwkJCQkJCSAgICAidGV4dCIsIENPTF9NT0QsCisJCQkJCQkgICAgImZvcmVncm91bmQtZ2RrIiwKKwkJCQkJCSAgICBDT0xfQ09MT1IsIE5VTEwpOworCXJlbmRlcmVyID0gZ3RrX2NlbGxfcmVuZGVyZXJfdGV4dF9uZXcoKTsKKwlndGtfdHJlZV92aWV3X2luc2VydF9jb2x1bW5fd2l0aF9hdHRyaWJ1dGVzKHZpZXcsIC0xLAorCQkJCQkJICAgICJZIiwgcmVuZGVyZXIsCisJCQkJCQkgICAgInRleHQiLCBDT0xfWUVTLAorCQkJCQkJICAgICJmb3JlZ3JvdW5kLWdkayIsCisJCQkJCQkgICAgQ09MX0NPTE9SLCBOVUxMKTsKKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3RleHRfbmV3KCk7CisJZ3RrX3RyZWVfdmlld19pbnNlcnRfY29sdW1uX3dpdGhfYXR0cmlidXRlcyh2aWV3LCAtMSwKKwkJCQkJCSAgICBfKCJWYWx1ZSIpLCByZW5kZXJlciwKKwkJCQkJCSAgICAidGV4dCIsIENPTF9WQUxVRSwKKwkJCQkJCSAgICAiZWRpdGFibGUiLAorCQkJCQkJICAgIENPTF9FRElULAorCQkJCQkJICAgICJmb3JlZ3JvdW5kLWdkayIsCisJCQkJCQkgICAgQ09MX0NPTE9SLCBOVUxMKTsKKwlnX3NpZ25hbF9jb25uZWN0KEdfT0JKRUNUKHJlbmRlcmVyKSwgImVkaXRlZCIsCisJCQkgR19DQUxMQkFDSyhyZW5kZXJlcl9lZGl0ZWQpLCBOVUxMKTsKKworCWNvbHVtbiA9IGd0a190cmVlX3ZpZXdfZ2V0X2NvbHVtbih2aWV3LCBDT0xfTkFNRSk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGUoY29sdW1uLCBzaG93X25hbWUpOworCWNvbHVtbiA9IGd0a190cmVlX3ZpZXdfZ2V0X2NvbHVtbih2aWV3LCBDT0xfTk8pOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF92aXNpYmxlKGNvbHVtbiwgc2hvd19yYW5nZSk7CisJY29sdW1uID0gZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uKHZpZXcsIENPTF9NT0QpOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF92aXNpYmxlKGNvbHVtbiwgc2hvd19yYW5nZSk7CisJY29sdW1uID0gZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uKHZpZXcsIENPTF9ZRVMpOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF92aXNpYmxlKGNvbHVtbiwgc2hvd19yYW5nZSk7CisJY29sdW1uID0gZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uKHZpZXcsIENPTF9WQUxVRSk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGUoY29sdW1uLCBzaG93X3ZhbHVlKTsKKworCWlmIChyZXNpemVhYmxlKSB7CisJCWZvciAoaSA9IDA7IGkgPCBDT0xfVkFMVUU7IGkrKykgeworCQkJY29sdW1uID0gZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uKHZpZXcsIGkpOworCQkJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Jlc2l6YWJsZShjb2x1bW4sIFRSVUUpOworCQl9CisJfQorCisJc2VsID0gZ3RrX3RyZWVfdmlld19nZXRfc2VsZWN0aW9uKHZpZXcpOworCWd0a190cmVlX3NlbGVjdGlvbl9zZXRfbW9kZShzZWwsIEdUS19TRUxFQ1RJT05fU0lOR0xFKTsKK30KKworCisvKiBVdGlsaXR5IEZ1bmN0aW9ucyAqLworCisKK3N0YXRpYyB2b2lkIHRleHRfaW5zZXJ0X2hlbHAoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJR3RrVGV4dEJ1ZmZlciAqYnVmZmVyOworCUd0a1RleHRJdGVyIHN0YXJ0LCBlbmQ7CisJY29uc3QgY2hhciAqcHJvbXB0ID0gbWVudV9nZXRfcHJvbXB0KG1lbnUpOworCWdjaGFyICpuYW1lOworCWNvbnN0IGNoYXIgKmhlbHAgPSBfKG5vaGVscF90ZXh0KTsKKworCWlmICghbWVudS0+c3ltKQorCQloZWxwID0gIiI7CisJZWxzZSBpZiAobWVudS0+c3ltLT5oZWxwKQorCQloZWxwID0gXyhtZW51LT5zeW0tPmhlbHApOworCisJaWYgKG1lbnUtPnN5bSAmJiBtZW51LT5zeW0tPm5hbWUpCisJCW5hbWUgPSBnX3N0cmR1cF9wcmludGYoXyhtZW51LT5zeW0tPm5hbWUpKTsKKwllbHNlCisJCW5hbWUgPSBnX3N0cmR1cCgiIik7CisKKwlidWZmZXIgPSBndGtfdGV4dF92aWV3X2dldF9idWZmZXIoR1RLX1RFWFRfVklFVyh0ZXh0X3cpKTsKKwlndGtfdGV4dF9idWZmZXJfZ2V0X2JvdW5kcyhidWZmZXIsICZzdGFydCwgJmVuZCk7CisJZ3RrX3RleHRfYnVmZmVyX2RlbGV0ZShidWZmZXIsICZzdGFydCwgJmVuZCk7CisJZ3RrX3RleHRfdmlld19zZXRfbGVmdF9tYXJnaW4oR1RLX1RFWFRfVklFVyh0ZXh0X3cpLCAxNSk7CisKKwlndGtfdGV4dF9idWZmZXJfZ2V0X2VuZF9pdGVyKGJ1ZmZlciwgJmVuZCk7CisJZ3RrX3RleHRfYnVmZmVyX2luc2VydF93aXRoX3RhZ3MoYnVmZmVyLCAmZW5kLCBwcm9tcHQsIC0xLCB0YWcxLAorCQkJCQkgTlVMTCk7CisJZ3RrX3RleHRfYnVmZmVyX2luc2VydF9hdF9jdXJzb3IoYnVmZmVyLCAiICIsIDEpOworCWd0a190ZXh0X2J1ZmZlcl9nZXRfZW5kX2l0ZXIoYnVmZmVyLCAmZW5kKTsKKwlndGtfdGV4dF9idWZmZXJfaW5zZXJ0X3dpdGhfdGFncyhidWZmZXIsICZlbmQsIG5hbWUsIC0xLCB0YWcxLAorCQkJCQkgTlVMTCk7CisJZ3RrX3RleHRfYnVmZmVyX2luc2VydF9hdF9jdXJzb3IoYnVmZmVyLCAiXG5cbiIsIDIpOworCWd0a190ZXh0X2J1ZmZlcl9nZXRfZW5kX2l0ZXIoYnVmZmVyLCAmZW5kKTsKKwlndGtfdGV4dF9idWZmZXJfaW5zZXJ0X3dpdGhfdGFncyhidWZmZXIsICZlbmQsIGhlbHAsIC0xLCB0YWcyLAorCQkJCQkgTlVMTCk7Cit9CisKKworc3RhdGljIHZvaWQgdGV4dF9pbnNlcnRfbXNnKGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICptZXNzYWdlKQoreworCUd0a1RleHRCdWZmZXIgKmJ1ZmZlcjsKKwlHdGtUZXh0SXRlciBzdGFydCwgZW5kOworCWNvbnN0IGNoYXIgKm1zZyA9IG1lc3NhZ2U7CisKKwlidWZmZXIgPSBndGtfdGV4dF92aWV3X2dldF9idWZmZXIoR1RLX1RFWFRfVklFVyh0ZXh0X3cpKTsKKwlndGtfdGV4dF9idWZmZXJfZ2V0X2JvdW5kcyhidWZmZXIsICZzdGFydCwgJmVuZCk7CisJZ3RrX3RleHRfYnVmZmVyX2RlbGV0ZShidWZmZXIsICZzdGFydCwgJmVuZCk7CisJZ3RrX3RleHRfdmlld19zZXRfbGVmdF9tYXJnaW4oR1RLX1RFWFRfVklFVyh0ZXh0X3cpLCAxNSk7CisKKwlndGtfdGV4dF9idWZmZXJfZ2V0X2VuZF9pdGVyKGJ1ZmZlciwgJmVuZCk7CisJZ3RrX3RleHRfYnVmZmVyX2luc2VydF93aXRoX3RhZ3MoYnVmZmVyLCAmZW5kLCB0aXRsZSwgLTEsIHRhZzEsCisJCQkJCSBOVUxMKTsKKwlndGtfdGV4dF9idWZmZXJfaW5zZXJ0X2F0X2N1cnNvcihidWZmZXIsICJcblxuIiwgMik7CisJZ3RrX3RleHRfYnVmZmVyX2dldF9lbmRfaXRlcihidWZmZXIsICZlbmQpOworCWd0a190ZXh0X2J1ZmZlcl9pbnNlcnRfd2l0aF90YWdzKGJ1ZmZlciwgJmVuZCwgbXNnLCAtMSwgdGFnMiwKKwkJCQkJIE5VTEwpOworfQorCisKKy8qIE1haW4gV2luZG93cyBDYWxsYmFja3MgKi8KKwordm9pZCBvbl9zYXZlMV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpOworZ2Jvb2xlYW4gb25fd2luZG93MV9kZWxldGVfZXZlbnQoR3RrV2lkZ2V0ICogd2lkZ2V0LCBHZGtFdmVudCAqIGV2ZW50LAorCQkJCSBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrV2lkZ2V0ICpkaWFsb2csICpsYWJlbDsKKwlnaW50IHJlc3VsdDsKKworCWlmIChjb25maWdfY2hhbmdlZCA9PSBGQUxTRSkKKwkJcmV0dXJuIEZBTFNFOworCisJZGlhbG9nID0gZ3RrX2RpYWxvZ19uZXdfd2l0aF9idXR0b25zKF8oIldhcm5pbmcgISIpLAorCQkJCQkgICAgIEdUS19XSU5ET1cobWFpbl93bmQpLAorCQkJCQkgICAgIChHdGtEaWFsb2dGbGFncykKKwkJCQkJICAgICAoR1RLX0RJQUxPR19NT0RBTCB8CisJCQkJCSAgICAgIEdUS19ESUFMT0dfREVTVFJPWV9XSVRIX1BBUkVOVCksCisJCQkJCSAgICAgR1RLX1NUT0NLX09LLAorCQkJCQkgICAgIEdUS19SRVNQT05TRV9ZRVMsCisJCQkJCSAgICAgR1RLX1NUT0NLX05PLAorCQkJCQkgICAgIEdUS19SRVNQT05TRV9OTywKKwkJCQkJICAgICBHVEtfU1RPQ0tfQ0FOQ0VMLAorCQkJCQkgICAgIEdUS19SRVNQT05TRV9DQU5DRUwsIE5VTEwpOworCWd0a19kaWFsb2dfc2V0X2RlZmF1bHRfcmVzcG9uc2UoR1RLX0RJQUxPRyhkaWFsb2cpLAorCQkJCQlHVEtfUkVTUE9OU0VfQ0FOQ0VMKTsKKworCWxhYmVsID0gZ3RrX2xhYmVsX25ldyhfKCJcblNhdmUgY29uZmlndXJhdGlvbiA/XG4iKSk7CisJZ3RrX2NvbnRhaW5lcl9hZGQoR1RLX0NPTlRBSU5FUihHVEtfRElBTE9HKGRpYWxvZyktPnZib3gpLCBsYWJlbCk7CisJZ3RrX3dpZGdldF9zaG93KGxhYmVsKTsKKworCXJlc3VsdCA9IGd0a19kaWFsb2dfcnVuKEdUS19ESUFMT0coZGlhbG9nKSk7CisJc3dpdGNoIChyZXN1bHQpIHsKKwljYXNlIEdUS19SRVNQT05TRV9ZRVM6CisJCW9uX3NhdmUxX2FjdGl2YXRlKE5VTEwsIE5VTEwpOworCQlyZXR1cm4gRkFMU0U7CisJY2FzZSBHVEtfUkVTUE9OU0VfTk86CisJCXJldHVybiBGQUxTRTsKKwljYXNlIEdUS19SRVNQT05TRV9DQU5DRUw6CisJY2FzZSBHVEtfUkVTUE9OU0VfREVMRVRFX0VWRU5UOgorCWRlZmF1bHQ6CisJCWd0a193aWRnZXRfZGVzdHJveShkaWFsb2cpOworCQlyZXR1cm4gVFJVRTsKKwl9CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKKwordm9pZCBvbl93aW5kb3cxX2Rlc3Ryb3koR3RrT2JqZWN0ICogb2JqZWN0LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJZ3RrX21haW5fcXVpdCgpOworfQorCisKK3ZvaWQKK29uX3dpbmRvdzFfc2l6ZV9yZXF1ZXN0KEd0a1dpZGdldCAqIHdpZGdldCwKKwkJCUd0a1JlcXVpc2l0aW9uICogcmVxdWlzaXRpb24sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlzdGF0aWMgZ2ludCBvbGRfaDsKKwlnaW50IHcsIGg7CisKKwlpZiAod2lkZ2V0LT53aW5kb3cgPT0gTlVMTCkKKwkJZ3RrX3dpbmRvd19nZXRfZGVmYXVsdF9zaXplKEdUS19XSU5ET1cobWFpbl93bmQpLCAmdywgJmgpOworCWVsc2UKKwkJZ2RrX3dpbmRvd19nZXRfc2l6ZSh3aWRnZXQtPndpbmRvdywgJncsICZoKTsKKworCWlmIChoID09IG9sZF9oKQorCQlyZXR1cm47CisJb2xkX2ggPSBoOworCisJZ3RrX3BhbmVkX3NldF9wb3NpdGlvbihHVEtfUEFORUQodnBhbmVkKSwgMiAqIGggLyAzKTsKK30KKworCisvKiBNZW51ICYgVG9vbGJhciBDYWxsYmFja3MgKi8KKworCitzdGF0aWMgdm9pZAorbG9hZF9maWxlbmFtZShHdGtGaWxlU2VsZWN0aW9uICogZmlsZV9zZWxlY3RvciwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCWNvbnN0IGdjaGFyICpmbjsKKworCWZuID0gZ3RrX2ZpbGVfc2VsZWN0aW9uX2dldF9maWxlbmFtZShHVEtfRklMRV9TRUxFQ1RJT04KKwkJCQkJICAgICAodXNlcl9kYXRhKSk7CisKKwlpZiAoY29uZl9yZWFkKGZuKSkKKwkJdGV4dF9pbnNlcnRfbXNnKF8oIkVycm9yIiksIF8oIlVuYWJsZSB0byBsb2FkIGNvbmZpZ3VyYXRpb24gISIpKTsKKwllbHNlCisJCWRpc3BsYXlfdHJlZSgmcm9vdG1lbnUpOworfQorCit2b2lkIG9uX2xvYWQxX2FjdGl2YXRlKEd0a01lbnVJdGVtICogbWVudWl0ZW0sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtXaWRnZXQgKmZzOworCisJZnMgPSBndGtfZmlsZV9zZWxlY3Rpb25fbmV3KF8oIkxvYWQgZmlsZS4uLiIpKTsKKwlnX3NpZ25hbF9jb25uZWN0KEdUS19PQkpFQ1QoR1RLX0ZJTEVfU0VMRUNUSU9OKGZzKS0+b2tfYnV0dG9uKSwKKwkJCSAiY2xpY2tlZCIsCisJCQkgR19DQUxMQkFDSyhsb2FkX2ZpbGVuYW1lKSwgKGdwb2ludGVyKSBmcyk7CisJZ19zaWduYWxfY29ubmVjdF9zd2FwcGVkKEdUS19PQkpFQ1QKKwkJCQkgKEdUS19GSUxFX1NFTEVDVElPTihmcyktPm9rX2J1dHRvbiksCisJCQkJICJjbGlja2VkIiwgR19DQUxMQkFDSyhndGtfd2lkZ2V0X2Rlc3Ryb3kpLAorCQkJCSAoZ3BvaW50ZXIpIGZzKTsKKwlnX3NpZ25hbF9jb25uZWN0X3N3YXBwZWQoR1RLX09CSkVDVAorCQkJCSAoR1RLX0ZJTEVfU0VMRUNUSU9OKGZzKS0+Y2FuY2VsX2J1dHRvbiksCisJCQkJICJjbGlja2VkIiwgR19DQUxMQkFDSyhndGtfd2lkZ2V0X2Rlc3Ryb3kpLAorCQkJCSAoZ3BvaW50ZXIpIGZzKTsKKwlndGtfd2lkZ2V0X3Nob3coZnMpOworfQorCisKK3ZvaWQgb25fc2F2ZTFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCWlmIChjb25mX3dyaXRlKE5VTEwpKQorCQl0ZXh0X2luc2VydF9tc2coXygiRXJyb3IiKSwgXygiVW5hYmxlIHRvIHNhdmUgY29uZmlndXJhdGlvbiAhIikpOworCisJY29uZmlnX2NoYW5nZWQgPSBGQUxTRTsKK30KKworCitzdGF0aWMgdm9pZAorc3RvcmVfZmlsZW5hbWUoR3RrRmlsZVNlbGVjdGlvbiAqIGZpbGVfc2VsZWN0b3IsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwljb25zdCBnY2hhciAqZm47CisKKwlmbiA9IGd0a19maWxlX3NlbGVjdGlvbl9nZXRfZmlsZW5hbWUoR1RLX0ZJTEVfU0VMRUNUSU9OCisJCQkJCSAgICAgKHVzZXJfZGF0YSkpOworCisJaWYgKGNvbmZfd3JpdGUoZm4pKQorCQl0ZXh0X2luc2VydF9tc2coXygiRXJyb3IiKSwgXygiVW5hYmxlIHRvIHNhdmUgY29uZmlndXJhdGlvbiAhIikpOworCisJZ3RrX3dpZGdldF9kZXN0cm95KEdUS19XSURHRVQodXNlcl9kYXRhKSk7Cit9CisKK3ZvaWQgb25fc2F2ZV9hczFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1dpZGdldCAqZnM7CisKKwlmcyA9IGd0a19maWxlX3NlbGVjdGlvbl9uZXcoXygiU2F2ZSBmaWxlIGFzLi4uIikpOworCWdfc2lnbmFsX2Nvbm5lY3QoR1RLX09CSkVDVChHVEtfRklMRV9TRUxFQ1RJT04oZnMpLT5va19idXR0b24pLAorCQkJICJjbGlja2VkIiwKKwkJCSBHX0NBTExCQUNLKHN0b3JlX2ZpbGVuYW1lKSwgKGdwb2ludGVyKSBmcyk7CisJZ19zaWduYWxfY29ubmVjdF9zd2FwcGVkKEdUS19PQkpFQ1QKKwkJCQkgKEdUS19GSUxFX1NFTEVDVElPTihmcyktPm9rX2J1dHRvbiksCisJCQkJICJjbGlja2VkIiwgR19DQUxMQkFDSyhndGtfd2lkZ2V0X2Rlc3Ryb3kpLAorCQkJCSAoZ3BvaW50ZXIpIGZzKTsKKwlnX3NpZ25hbF9jb25uZWN0X3N3YXBwZWQoR1RLX09CSkVDVAorCQkJCSAoR1RLX0ZJTEVfU0VMRUNUSU9OKGZzKS0+Y2FuY2VsX2J1dHRvbiksCisJCQkJICJjbGlja2VkIiwgR19DQUxMQkFDSyhndGtfd2lkZ2V0X2Rlc3Ryb3kpLAorCQkJCSAoZ3BvaW50ZXIpIGZzKTsKKwlndGtfd2lkZ2V0X3Nob3coZnMpOworfQorCisKK3ZvaWQgb25fcXVpdDFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCWlmICghb25fd2luZG93MV9kZWxldGVfZXZlbnQoTlVMTCwgTlVMTCwgTlVMTCkpCisJCWd0a193aWRnZXRfZGVzdHJveShHVEtfV0lER0VUKG1haW5fd25kKSk7Cit9CisKKwordm9pZCBvbl9zaG93X25hbWUxX2FjdGl2YXRlKEd0a01lbnVJdGVtICogbWVudWl0ZW0sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtUcmVlVmlld0NvbHVtbiAqY29sOworCisJc2hvd19uYW1lID0gR1RLX0NIRUNLX01FTlVfSVRFTShtZW51aXRlbSktPmFjdGl2ZTsKKwljb2wgPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4oR1RLX1RSRUVfVklFVyh0cmVlMl93KSwgQ09MX05BTUUpOworCWlmIChjb2wpCisJCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF92aXNpYmxlKGNvbCwgc2hvd19uYW1lKTsKK30KKworCit2b2lkIG9uX3Nob3dfcmFuZ2UxX2FjdGl2YXRlKEd0a01lbnVJdGVtICogbWVudWl0ZW0sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtUcmVlVmlld0NvbHVtbiAqY29sOworCisJc2hvd19yYW5nZSA9IEdUS19DSEVDS19NRU5VX0lURU0obWVudWl0ZW0pLT5hY3RpdmU7CisJY29sID0gZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uKEdUS19UUkVFX1ZJRVcodHJlZTJfdyksIENPTF9OTyk7CisJaWYgKGNvbCkKKwkJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGUoY29sLCBzaG93X3JhbmdlKTsKKwljb2wgPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4oR1RLX1RSRUVfVklFVyh0cmVlMl93KSwgQ09MX01PRCk7CisJaWYgKGNvbCkKKwkJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGUoY29sLCBzaG93X3JhbmdlKTsKKwljb2wgPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4oR1RLX1RSRUVfVklFVyh0cmVlMl93KSwgQ09MX1lFUyk7CisJaWYgKGNvbCkKKwkJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGUoY29sLCBzaG93X3JhbmdlKTsKKworfQorCisKK3ZvaWQgb25fc2hvd19kYXRhMV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrVHJlZVZpZXdDb2x1bW4gKmNvbDsKKworCXNob3dfdmFsdWUgPSBHVEtfQ0hFQ0tfTUVOVV9JVEVNKG1lbnVpdGVtKS0+YWN0aXZlOworCWNvbCA9IGd0a190cmVlX3ZpZXdfZ2V0X2NvbHVtbihHVEtfVFJFRV9WSUVXKHRyZWUyX3cpLCBDT0xfVkFMVUUpOworCWlmIChjb2wpCisJCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF92aXNpYmxlKGNvbCwgc2hvd192YWx1ZSk7Cit9CisKKwordm9pZAorb25fc2hvd19hbGxfb3B0aW9uczFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCXNob3dfYWxsID0gR1RLX0NIRUNLX01FTlVfSVRFTShtZW51aXRlbSktPmFjdGl2ZTsKKworCWd0a190cmVlX3N0b3JlX2NsZWFyKHRyZWUyKTsKKwlkaXNwbGF5X3RyZWUoJnJvb3RtZW51KTsJLy8gaW5zdGVhZCBvZiB1cGRhdGVfdHJlZSB0byBzcGVlZC11cAorfQorCisKK3ZvaWQKK29uX3Nob3dfZGVidWdfaW5mbzFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCXNob3dfZGVidWcgPSBHVEtfQ0hFQ0tfTUVOVV9JVEVNKG1lbnVpdGVtKS0+YWN0aXZlOworCXVwZGF0ZV90cmVlKCZyb290bWVudSwgTlVMTCk7Cit9CisKKwordm9pZCBvbl9pbnRyb2R1Y3Rpb24xX2FjdGl2YXRlKEd0a01lbnVJdGVtICogbWVudWl0ZW0sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtXaWRnZXQgKmRpYWxvZzsKKwljb25zdCBnY2hhciAqaW50cm9fdGV4dCA9IF8oCisJICAgICJXZWxjb21lIHRvIGdrYywgdGhlIEdUSysgZ3JhcGhpY2FsIGNvbmZpZ3VyYXRpb24gdG9vbC5cbiIKKwkgICAgIkZvciBlYWNoIG9wdGlvbiwgYSBibGFuayBib3ggaW5kaWNhdGVzIHRoZSBmZWF0dXJlIGlzIGRpc2FibGVkLCBhXG4iCisJICAgICJjaGVjayBpbmRpY2F0ZXMgaXQgaXMgZW5hYmxlZCwgYW5kIGEgZG90IGluZGljYXRlcyB0aGF0IGl0IGlzIHRvXG4iCisJICAgICJiZSBjb21waWxlZCBhcyBhIG1vZHVsZS4gIENsaWNraW5nIG9uIHRoZSBib3ggd2lsbCBjeWNsZSB0aHJvdWdoIHRoZSB0aHJlZSBzdGF0ZXMuXG4iCisJICAgICJcbiIKKwkgICAgIklmIHlvdSBkbyBub3Qgc2VlIGFuIG9wdGlvbiAoZS5nLiwgYSBkZXZpY2UgZHJpdmVyKSB0aGF0IHlvdVxuIgorCSAgICAiYmVsaWV2ZSBzaG91bGQgYmUgcHJlc2VudCwgdHJ5IHR1cm5pbmcgb24gU2hvdyBBbGwgT3B0aW9uc1xuIgorCSAgICAidW5kZXIgdGhlIE9wdGlvbnMgbWVudS5cbiIKKwkgICAgIkFsdGhvdWdoIHRoZXJlIGlzIG5vIGNyb3NzIHJlZmVyZW5jZSB5ZXQgdG8gaGVscCB5b3UgZmlndXJlIG91dFxuIgorCSAgICAid2hhdCBvdGhlciBvcHRpb25zIG11c3QgYmUgZW5hYmxlZCB0byBzdXBwb3J0IHRoZSBvcHRpb24geW91XG4iCisJICAgICJhcmUgaW50ZXJlc3RlZCBpbiwgeW91IGNhbiBzdGlsbCB2aWV3IHRoZSBoZWxwIG9mIGEgZ3JheWVkLW91dFxuIgorCSAgICAib3B0aW9uLlxuIgorCSAgICAiXG4iCisJICAgICJUb2dnbGluZyBTaG93IERlYnVnIEluZm8gdW5kZXIgdGhlIE9wdGlvbnMgbWVudSB3aWxsIHNob3dcbiIKKwkgICAgInRoZSBkZXBlbmRlbmNpZXMsIHdoaWNoIHlvdSBjYW4gdGhlbiBtYXRjaCBieSBleGFtaW5pbmcgb3RoZXIgb3B0aW9ucy4iKTsKKworCWRpYWxvZyA9IGd0a19tZXNzYWdlX2RpYWxvZ19uZXcoR1RLX1dJTkRPVyhtYWluX3duZCksCisJCQkJCUdUS19ESUFMT0dfREVTVFJPWV9XSVRIX1BBUkVOVCwKKwkJCQkJR1RLX01FU1NBR0VfSU5GTywKKwkJCQkJR1RLX0JVVFRPTlNfQ0xPU0UsIGludHJvX3RleHQpOworCWdfc2lnbmFsX2Nvbm5lY3Rfc3dhcHBlZChHVEtfT0JKRUNUKGRpYWxvZyksICJyZXNwb25zZSIsCisJCQkJIEdfQ0FMTEJBQ0soZ3RrX3dpZGdldF9kZXN0cm95KSwKKwkJCQkgR1RLX09CSkVDVChkaWFsb2cpKTsKKwlndGtfd2lkZ2V0X3Nob3dfYWxsKGRpYWxvZyk7Cit9CisKKwordm9pZCBvbl9hYm91dDFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1dpZGdldCAqZGlhbG9nOworCWNvbnN0IGdjaGFyICphYm91dF90ZXh0ID0KKwkgICAgXygiZ2tjIGlzIGNvcHlyaWdodCAoYykgMjAwMiBSb21haW4gTGlldmluIDxyb21zQGxwZy50aWNhbGMub3JnPi5cbiIKKwkgICAgICAiQmFzZWQgb24gdGhlIHNvdXJjZSBjb2RlIGZyb20gUm9tYW4gWmlwcGVsLlxuIik7CisKKwlkaWFsb2cgPSBndGtfbWVzc2FnZV9kaWFsb2dfbmV3KEdUS19XSU5ET1cobWFpbl93bmQpLAorCQkJCQlHVEtfRElBTE9HX0RFU1RST1lfV0lUSF9QQVJFTlQsCisJCQkJCUdUS19NRVNTQUdFX0lORk8sCisJCQkJCUdUS19CVVRUT05TX0NMT1NFLCBhYm91dF90ZXh0KTsKKwlnX3NpZ25hbF9jb25uZWN0X3N3YXBwZWQoR1RLX09CSkVDVChkaWFsb2cpLCAicmVzcG9uc2UiLAorCQkJCSBHX0NBTExCQUNLKGd0a193aWRnZXRfZGVzdHJveSksCisJCQkJIEdUS19PQkpFQ1QoZGlhbG9nKSk7CisJZ3RrX3dpZGdldF9zaG93X2FsbChkaWFsb2cpOworfQorCisKK3ZvaWQgb25fbGljZW5zZTFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1dpZGdldCAqZGlhbG9nOworCWNvbnN0IGdjaGFyICpsaWNlbnNlX3RleHQgPQorCSAgICBfKCJna2MgaXMgcmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLlxuIgorCSAgICAgICJGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSB0aGUgc291cmNlIGNvZGUgb3JcbiIKKwkgICAgICAidmlzaXQgaHR0cDovL3d3dy5mc2Yub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWxcbiIpOworCisJZGlhbG9nID0gZ3RrX21lc3NhZ2VfZGlhbG9nX25ldyhHVEtfV0lORE9XKG1haW5fd25kKSwKKwkJCQkJR1RLX0RJQUxPR19ERVNUUk9ZX1dJVEhfUEFSRU5ULAorCQkJCQlHVEtfTUVTU0FHRV9JTkZPLAorCQkJCQlHVEtfQlVUVE9OU19DTE9TRSwgbGljZW5zZV90ZXh0KTsKKwlnX3NpZ25hbF9jb25uZWN0X3N3YXBwZWQoR1RLX09CSkVDVChkaWFsb2cpLCAicmVzcG9uc2UiLAorCQkJCSBHX0NBTExCQUNLKGd0a193aWRnZXRfZGVzdHJveSksCisJCQkJIEdUS19PQkpFQ1QoZGlhbG9nKSk7CisJZ3RrX3dpZGdldF9zaG93X2FsbChkaWFsb2cpOworfQorCisKK3ZvaWQgb25fYmFja19jbGlja2VkKEd0a0J1dHRvbiAqIGJ1dHRvbiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCWVudW0gcHJvcF90eXBlIHB0eXBlOworCisJY3VycmVudCA9IGN1cnJlbnQtPnBhcmVudDsKKwlwdHlwZSA9IGN1cnJlbnQtPnByb21wdCA/IGN1cnJlbnQtPnByb21wdC0+dHlwZSA6IFBfVU5LTk9XTjsKKwlpZiAocHR5cGUgIT0gUF9NRU5VKQorCQljdXJyZW50ID0gY3VycmVudC0+cGFyZW50OworCWRpc3BsYXlfdHJlZV9wYXJ0KCk7CisKKwlpZiAoY3VycmVudCA9PSAmcm9vdG1lbnUpCisJCWd0a193aWRnZXRfc2V0X3NlbnNpdGl2ZShiYWNrX2J0biwgRkFMU0UpOworfQorCisKK3ZvaWQgb25fbG9hZF9jbGlja2VkKEd0a0J1dHRvbiAqIGJ1dHRvbiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCW9uX2xvYWQxX2FjdGl2YXRlKE5VTEwsIHVzZXJfZGF0YSk7Cit9CisKKwordm9pZCBvbl9zYXZlX2NsaWNrZWQoR3RrQnV0dG9uICogYnV0dG9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJb25fc2F2ZTFfYWN0aXZhdGUoTlVMTCwgdXNlcl9kYXRhKTsKK30KKworCit2b2lkIG9uX3NpbmdsZV9jbGlja2VkKEd0a0J1dHRvbiAqIGJ1dHRvbiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCXZpZXdfbW9kZSA9IFNJTkdMRV9WSUVXOworCWd0a19wYW5lZF9zZXRfcG9zaXRpb24oR1RLX1BBTkVEKGhwYW5lZCksIDApOworCWd0a193aWRnZXRfaGlkZSh0cmVlMV93KTsKKwljdXJyZW50ID0gJnJvb3RtZW51OworCWRpc3BsYXlfdHJlZV9wYXJ0KCk7Cit9CisKKwordm9pZCBvbl9zcGxpdF9jbGlja2VkKEd0a0J1dHRvbiAqIGJ1dHRvbiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCWdpbnQgdywgaDsKKwl2aWV3X21vZGUgPSBTUExJVF9WSUVXOworCWd0a193aWRnZXRfc2hvdyh0cmVlMV93KTsKKwlndGtfd2luZG93X2dldF9kZWZhdWx0X3NpemUoR1RLX1dJTkRPVyhtYWluX3duZCksICZ3LCAmaCk7CisJZ3RrX3BhbmVkX3NldF9wb3NpdGlvbihHVEtfUEFORUQoaHBhbmVkKSwgdyAvIDIpOworCWlmICh0cmVlMikKKwkJZ3RrX3RyZWVfc3RvcmVfY2xlYXIodHJlZTIpOworCWRpc3BsYXlfbGlzdCgpOworCisJLyogRGlzYWJsZSBiYWNrIGJ0biwgbGlrZSBpbiBmdWxsIG1vZGUuICovCisJZ3RrX3dpZGdldF9zZXRfc2Vuc2l0aXZlKGJhY2tfYnRuLCBGQUxTRSk7Cit9CisKKwordm9pZCBvbl9mdWxsX2NsaWNrZWQoR3RrQnV0dG9uICogYnV0dG9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJdmlld19tb2RlID0gRlVMTF9WSUVXOworCWd0a19wYW5lZF9zZXRfcG9zaXRpb24oR1RLX1BBTkVEKGhwYW5lZCksIDApOworCWd0a193aWRnZXRfaGlkZSh0cmVlMV93KTsKKwlpZiAodHJlZTIpCisJCWd0a190cmVlX3N0b3JlX2NsZWFyKHRyZWUyKTsKKwlkaXNwbGF5X3RyZWUoJnJvb3RtZW51KTsKKwlndGtfd2lkZ2V0X3NldF9zZW5zaXRpdmUoYmFja19idG4sIEZBTFNFKTsKK30KKworCit2b2lkIG9uX2NvbGxhcHNlX2NsaWNrZWQoR3RrQnV0dG9uICogYnV0dG9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJZ3RrX3RyZWVfdmlld19jb2xsYXBzZV9hbGwoR1RLX1RSRUVfVklFVyh0cmVlMl93KSk7Cit9CisKKwordm9pZCBvbl9leHBhbmRfY2xpY2tlZChHdGtCdXR0b24gKiBidXR0b24sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlndGtfdHJlZV92aWV3X2V4cGFuZF9hbGwoR1RLX1RSRUVfVklFVyh0cmVlMl93KSk7Cit9CisKKworLyogQ1RyZWUgQ2FsbGJhY2tzICovCisKKy8qIENoYW5nZSBoZXgvaW50L3N0cmluZyB2YWx1ZSBpbiB0aGUgY2VsbCAqLworc3RhdGljIHZvaWQgcmVuZGVyZXJfZWRpdGVkKEd0a0NlbGxSZW5kZXJlclRleHQgKiBjZWxsLAorCQkJICAgIGNvbnN0IGdjaGFyICogcGF0aF9zdHJpbmcsCisJCQkgICAgY29uc3QgZ2NoYXIgKiBuZXdfdGV4dCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1RyZWVQYXRoICpwYXRoID0gZ3RrX3RyZWVfcGF0aF9uZXdfZnJvbV9zdHJpbmcocGF0aF9zdHJpbmcpOworCUd0a1RyZWVJdGVyIGl0ZXI7CisJY29uc3QgY2hhciAqb2xkX2RlZiwgKm5ld19kZWY7CisJc3RydWN0IG1lbnUgKm1lbnU7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCisJaWYgKCFndGtfdHJlZV9tb2RlbF9nZXRfaXRlcihtb2RlbDIsICZpdGVyLCBwYXRoKSkKKwkJcmV0dXJuOworCisJZ3RrX3RyZWVfbW9kZWxfZ2V0KG1vZGVsMiwgJml0ZXIsIENPTF9NRU5VLCAmbWVudSwgLTEpOworCXN5bSA9IG1lbnUtPnN5bTsKKworCWd0a190cmVlX21vZGVsX2dldChtb2RlbDIsICZpdGVyLCBDT0xfVkFMVUUsICZvbGRfZGVmLCAtMSk7CisJbmV3X2RlZiA9IG5ld190ZXh0OworCisJc3ltX3NldF9zdHJpbmdfdmFsdWUoc3ltLCBuZXdfZGVmKTsKKworCWNvbmZpZ19jaGFuZ2VkID0gVFJVRTsKKwl1cGRhdGVfdHJlZSgmcm9vdG1lbnUsIE5VTEwpOworCisJZ3RrX3RyZWVfcGF0aF9mcmVlKHBhdGgpOworfQorCisvKiBDaGFuZ2UgdGhlIHZhbHVlIG9mIGEgc3ltYm9sIGFuZCB1cGRhdGUgdGhlIHRyZWUgKi8KK3N0YXRpYyB2b2lkIGNoYW5nZV9zeW1fdmFsdWUoc3RydWN0IG1lbnUgKm1lbnUsIGdpbnQgY29sKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKKwl0cmlzdGF0ZSBvbGR2YWwsIG5ld3ZhbDsKKworCWlmICghc3ltKQorCQlyZXR1cm47CisKKwlpZiAoY29sID09IENPTF9OTykKKwkJbmV3dmFsID0gbm87CisJZWxzZSBpZiAoY29sID09IENPTF9NT0QpCisJCW5ld3ZhbCA9IG1vZDsKKwllbHNlIGlmIChjb2wgPT0gQ09MX1lFUykKKwkJbmV3dmFsID0geWVzOworCWVsc2UKKwkJcmV0dXJuOworCisJc3dpdGNoIChzeW1fZ2V0X3R5cGUoc3ltKSkgeworCWNhc2UgU19CT09MRUFOOgorCWNhc2UgU19UUklTVEFURToKKwkJb2xkdmFsID0gc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pOworCQlpZiAoIXN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCBuZXd2YWwpKQorCQkJbmV3dmFsID0geWVzOworCQlzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbmV3dmFsKTsKKwkJY29uZmlnX2NoYW5nZWQgPSBUUlVFOworCQlpZiAodmlld19tb2RlID09IEZVTExfVklFVykKKwkJCXVwZGF0ZV90cmVlKCZyb290bWVudSwgTlVMTCk7CisJCWVsc2UgaWYgKHZpZXdfbW9kZSA9PSBTUExJVF9WSUVXKSB7CisJCQl1cGRhdGVfdHJlZShicm93c2VkLCBOVUxMKTsKKwkJCWRpc3BsYXlfbGlzdCgpOworCQl9CisJCWVsc2UgaWYgKHZpZXdfbW9kZSA9PSBTSU5HTEVfVklFVykKKwkJCWRpc3BsYXlfdHJlZV9wYXJ0KCk7CS8vZml4bWU6IGtlZXAgZXhwL2NvbGwKKwkJYnJlYWs7CisJY2FzZSBTX0lOVDoKKwljYXNlIFNfSEVYOgorCWNhc2UgU19TVFJJTkc6CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZCB0b2dnbGVfc3ltX3ZhbHVlKHN0cnVjdCBtZW51ICptZW51KQoreworCWlmICghbWVudS0+c3ltKQorCQlyZXR1cm47CisKKwlzeW1fdG9nZ2xlX3RyaXN0YXRlX3ZhbHVlKG1lbnUtPnN5bSk7CisJaWYgKHZpZXdfbW9kZSA9PSBGVUxMX1ZJRVcpCisJCXVwZGF0ZV90cmVlKCZyb290bWVudSwgTlVMTCk7CisJZWxzZSBpZiAodmlld19tb2RlID09IFNQTElUX1ZJRVcpIHsKKwkJdXBkYXRlX3RyZWUoYnJvd3NlZCwgTlVMTCk7CisJCWRpc3BsYXlfbGlzdCgpOworCX0KKwllbHNlIGlmICh2aWV3X21vZGUgPT0gU0lOR0xFX1ZJRVcpCisJCWRpc3BsYXlfdHJlZV9wYXJ0KCk7CS8vZml4bWU6IGtlZXAgZXhwL2NvbGwKK30KKworc3RhdGljIHZvaWQgcmVuZGVyZXJfdG9nZ2xlZChHdGtDZWxsUmVuZGVyZXJUb2dnbGUgKiBjZWxsLAorCQkJICAgICBnY2hhciAqIHBhdGhfc3RyaW5nLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrVHJlZVBhdGggKnBhdGgsICpzZWxfcGF0aCA9IE5VTEw7CisJR3RrVHJlZUl0ZXIgaXRlciwgc2VsX2l0ZXI7CisJR3RrVHJlZVNlbGVjdGlvbiAqc2VsOworCXN0cnVjdCBtZW51ICptZW51OworCisJcGF0aCA9IGd0a190cmVlX3BhdGhfbmV3X2Zyb21fc3RyaW5nKHBhdGhfc3RyaW5nKTsKKwlpZiAoIWd0a190cmVlX21vZGVsX2dldF9pdGVyKG1vZGVsMiwgJml0ZXIsIHBhdGgpKQorCQlyZXR1cm47CisKKwlzZWwgPSBndGtfdHJlZV92aWV3X2dldF9zZWxlY3Rpb24oR1RLX1RSRUVfVklFVyh0cmVlMl93KSk7CisJaWYgKGd0a190cmVlX3NlbGVjdGlvbl9nZXRfc2VsZWN0ZWQoc2VsLCBOVUxMLCAmc2VsX2l0ZXIpKQorCQlzZWxfcGF0aCA9IGd0a190cmVlX21vZGVsX2dldF9wYXRoKG1vZGVsMiwgJnNlbF9pdGVyKTsKKwlpZiAoIXNlbF9wYXRoKQorCQlnb3RvIG91dDE7CisJaWYgKGd0a190cmVlX3BhdGhfY29tcGFyZShwYXRoLCBzZWxfcGF0aCkpCisJCWdvdG8gb3V0MjsKKworCWd0a190cmVlX21vZGVsX2dldChtb2RlbDIsICZpdGVyLCBDT0xfTUVOVSwgJm1lbnUsIC0xKTsKKwl0b2dnbGVfc3ltX3ZhbHVlKG1lbnUpOworCisgICAgICBvdXQyOgorCWd0a190cmVlX3BhdGhfZnJlZShzZWxfcGF0aCk7CisgICAgICBvdXQxOgorCWd0a190cmVlX3BhdGhfZnJlZShwYXRoKTsKK30KKworc3RhdGljIGdpbnQgY29sdW1uMmluZGV4KEd0a1RyZWVWaWV3Q29sdW1uICogY29sdW1uKQoreworCWdpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBDT0xfTlVNQkVSOyBpKyspIHsKKwkJR3RrVHJlZVZpZXdDb2x1bW4gKmNvbDsKKworCQljb2wgPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4oR1RLX1RSRUVfVklFVyh0cmVlMl93KSwgaSk7CisJCWlmIChjb2wgPT0gY29sdW1uKQorCQkJcmV0dXJuIGk7CisJfQorCisJcmV0dXJuIC0xOworfQorCisKKy8qIFVzZXIgY2xpY2s6IHVwZGF0ZSBjaG9pY2UgKGZ1bGwpIG9yIGdvZXMgZG93biAoc2luZ2xlKSAqLworZ2Jvb2xlYW4KK29uX3RyZWV2aWV3Ml9idXR0b25fcHJlc3NfZXZlbnQoR3RrV2lkZ2V0ICogd2lkZ2V0LAorCQkJCUdka0V2ZW50QnV0dG9uICogZXZlbnQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtUcmVlVmlldyAqdmlldyA9IEdUS19UUkVFX1ZJRVcod2lkZ2V0KTsKKwlHdGtUcmVlUGF0aCAqcGF0aDsKKwlHdGtUcmVlVmlld0NvbHVtbiAqY29sdW1uOworCUd0a1RyZWVJdGVyIGl0ZXI7CisJc3RydWN0IG1lbnUgKm1lbnU7CisJZ2ludCBjb2w7CisKKyNpZiBHVEtfQ0hFQ0tfVkVSU0lPTigyLDEsNCkgLy8gYnVnIGluIGN0cmVlIHdpdGggZWFybGllciB2ZXJzaW9uIG9mIEdUSworCWdpbnQgdHggPSAoZ2ludCkgZXZlbnQtPng7CisJZ2ludCB0eSA9IChnaW50KSBldmVudC0+eTsKKwlnaW50IGN4LCBjeTsKKworCWd0a190cmVlX3ZpZXdfZ2V0X3BhdGhfYXRfcG9zKHZpZXcsIHR4LCB0eSwgJnBhdGgsICZjb2x1bW4sICZjeCwKKwkJCQkgICAgICAmY3kpOworI2Vsc2UKKwlndGtfdHJlZV92aWV3X2dldF9jdXJzb3IodmlldywgJnBhdGgsICZjb2x1bW4pOworI2VuZGlmCisJaWYgKHBhdGggPT0gTlVMTCkKKwkJcmV0dXJuIEZBTFNFOworCisJaWYgKCFndGtfdHJlZV9tb2RlbF9nZXRfaXRlcihtb2RlbDIsICZpdGVyLCBwYXRoKSkKKwkJcmV0dXJuIEZBTFNFOworCWd0a190cmVlX21vZGVsX2dldChtb2RlbDIsICZpdGVyLCBDT0xfTUVOVSwgJm1lbnUsIC0xKTsKKworCWNvbCA9IGNvbHVtbjJpbmRleChjb2x1bW4pOworCWlmIChldmVudC0+dHlwZSA9PSBHREtfMkJVVFRPTl9QUkVTUykgeworCQllbnVtIHByb3BfdHlwZSBwdHlwZTsKKwkJcHR5cGUgPSBtZW51LT5wcm9tcHQgPyBtZW51LT5wcm9tcHQtPnR5cGUgOiBQX1VOS05PV047CisKKwkJaWYgKHB0eXBlID09IFBfTUVOVSAmJiB2aWV3X21vZGUgIT0gRlVMTF9WSUVXICYmIGNvbCA9PSBDT0xfT1BUSU9OKSB7CisJCQkvLyBnb2VzIGRvd24gaW50byBtZW51CisJCQljdXJyZW50ID0gbWVudTsKKwkJCWRpc3BsYXlfdHJlZV9wYXJ0KCk7CisJCQlndGtfd2lkZ2V0X3NldF9zZW5zaXRpdmUoYmFja19idG4sIFRSVUUpOworCQl9IGVsc2UgaWYgKChjb2wgPT0gQ09MX09QVElPTikpIHsKKwkJCXRvZ2dsZV9zeW1fdmFsdWUobWVudSk7CisJCQlndGtfdHJlZV92aWV3X2V4cGFuZF9yb3codmlldywgcGF0aCwgVFJVRSk7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY29sID09IENPTF9WQUxVRSkgeworCQkJdG9nZ2xlX3N5bV92YWx1ZShtZW51KTsKKwkJCWd0a190cmVlX3ZpZXdfZXhwYW5kX3Jvdyh2aWV3LCBwYXRoLCBUUlVFKTsKKwkJfSBlbHNlIGlmIChjb2wgPT0gQ09MX05PIHx8IGNvbCA9PSBDT0xfTU9ECisJCQkgICB8fCBjb2wgPT0gQ09MX1lFUykgeworCQkJY2hhbmdlX3N5bV92YWx1ZShtZW51LCBjb2wpOworCQkJZ3RrX3RyZWVfdmlld19leHBhbmRfcm93KHZpZXcsIHBhdGgsIFRSVUUpOworCQl9CisJfQorCisJcmV0dXJuIEZBTFNFOworfQorCisvKiBLZXkgcHJlc3NlZDogdXBkYXRlIGNob2ljZSAqLworZ2Jvb2xlYW4KK29uX3RyZWV2aWV3Ml9rZXlfcHJlc3NfZXZlbnQoR3RrV2lkZ2V0ICogd2lkZ2V0LAorCQkJICAgICBHZGtFdmVudEtleSAqIGV2ZW50LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrVHJlZVZpZXcgKnZpZXcgPSBHVEtfVFJFRV9WSUVXKHdpZGdldCk7CisJR3RrVHJlZVBhdGggKnBhdGg7CisJR3RrVHJlZVZpZXdDb2x1bW4gKmNvbHVtbjsKKwlHdGtUcmVlSXRlciBpdGVyOworCXN0cnVjdCBtZW51ICptZW51OworCWdpbnQgY29sOworCisJZ3RrX3RyZWVfdmlld19nZXRfY3Vyc29yKHZpZXcsICZwYXRoLCAmY29sdW1uKTsKKwlpZiAocGF0aCA9PSBOVUxMKQorCQlyZXR1cm4gRkFMU0U7CisKKwlpZiAoZXZlbnQtPmtleXZhbCA9PSBHREtfc3BhY2UpIHsKKwkJaWYgKGd0a190cmVlX3ZpZXdfcm93X2V4cGFuZGVkKHZpZXcsIHBhdGgpKQorCQkJZ3RrX3RyZWVfdmlld19jb2xsYXBzZV9yb3codmlldywgcGF0aCk7CisJCWVsc2UKKwkJCWd0a190cmVlX3ZpZXdfZXhwYW5kX3Jvdyh2aWV3LCBwYXRoLCBGQUxTRSk7CisJCXJldHVybiBUUlVFOworCX0KKwlpZiAoZXZlbnQtPmtleXZhbCA9PSBHREtfS1BfRW50ZXIpIHsKKwl9CisJaWYgKHdpZGdldCA9PSB0cmVlMV93KQorCQlyZXR1cm4gRkFMU0U7CisKKwlndGtfdHJlZV9tb2RlbF9nZXRfaXRlcihtb2RlbDIsICZpdGVyLCBwYXRoKTsKKwlndGtfdHJlZV9tb2RlbF9nZXQobW9kZWwyLCAmaXRlciwgQ09MX01FTlUsICZtZW51LCAtMSk7CisKKwlpZiAoIXN0cmNhc2VjbXAoZXZlbnQtPnN0cmluZywgIm4iKSkKKwkJY29sID0gQ09MX05POworCWVsc2UgaWYgKCFzdHJjYXNlY21wKGV2ZW50LT5zdHJpbmcsICJtIikpCisJCWNvbCA9IENPTF9NT0Q7CisJZWxzZSBpZiAoIXN0cmNhc2VjbXAoZXZlbnQtPnN0cmluZywgInkiKSkKKwkJY29sID0gQ09MX1lFUzsKKwllbHNlCisJCWNvbCA9IC0xOworCWNoYW5nZV9zeW1fdmFsdWUobWVudSwgY29sKTsKKworCXJldHVybiBGQUxTRTsKK30KKworCisvKiBSb3cgc2VsZWN0aW9uIGNoYW5nZWQ6IHVwZGF0ZSBoZWxwICovCit2b2lkCitvbl90cmVldmlldzJfY3Vyc29yX2NoYW5nZWQoR3RrVHJlZVZpZXcgKiB0cmVldmlldywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1RyZWVTZWxlY3Rpb24gKnNlbGVjdGlvbjsKKwlHdGtUcmVlSXRlciBpdGVyOworCXN0cnVjdCBtZW51ICptZW51OworCisJc2VsZWN0aW9uID0gZ3RrX3RyZWVfdmlld19nZXRfc2VsZWN0aW9uKHRyZWV2aWV3KTsKKwlpZiAoZ3RrX3RyZWVfc2VsZWN0aW9uX2dldF9zZWxlY3RlZChzZWxlY3Rpb24sICZtb2RlbDIsICZpdGVyKSkgeworCQlndGtfdHJlZV9tb2RlbF9nZXQobW9kZWwyLCAmaXRlciwgQ09MX01FTlUsICZtZW51LCAtMSk7CisJCXRleHRfaW5zZXJ0X2hlbHAobWVudSk7CisJfQorfQorCisKKy8qIFVzZXIgY2xpY2s6IGRpc3BsYXkgc3ViLXRyZWUgaW4gdGhlIHJpZ2h0IGZyYW1lLiAqLworZ2Jvb2xlYW4KK29uX3RyZWV2aWV3MV9idXR0b25fcHJlc3NfZXZlbnQoR3RrV2lkZ2V0ICogd2lkZ2V0LAorCQkJCUdka0V2ZW50QnV0dG9uICogZXZlbnQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtUcmVlVmlldyAqdmlldyA9IEdUS19UUkVFX1ZJRVcod2lkZ2V0KTsKKwlHdGtUcmVlUGF0aCAqcGF0aDsKKwlHdGtUcmVlVmlld0NvbHVtbiAqY29sdW1uOworCUd0a1RyZWVJdGVyIGl0ZXI7CisJc3RydWN0IG1lbnUgKm1lbnU7CisKKwlnaW50IHR4ID0gKGdpbnQpIGV2ZW50LT54OworCWdpbnQgdHkgPSAoZ2ludCkgZXZlbnQtPnk7CisJZ2ludCBjeCwgY3k7CisKKwlndGtfdHJlZV92aWV3X2dldF9wYXRoX2F0X3Bvcyh2aWV3LCB0eCwgdHksICZwYXRoLCAmY29sdW1uLCAmY3gsCisJCQkJICAgICAgJmN5KTsKKwlpZiAocGF0aCA9PSBOVUxMKQorCQlyZXR1cm4gRkFMU0U7CisKKwlndGtfdHJlZV9tb2RlbF9nZXRfaXRlcihtb2RlbDEsICZpdGVyLCBwYXRoKTsKKwlndGtfdHJlZV9tb2RlbF9nZXQobW9kZWwxLCAmaXRlciwgQ09MX01FTlUsICZtZW51LCAtMSk7CisKKwlpZiAoZXZlbnQtPnR5cGUgPT0gR0RLXzJCVVRUT05fUFJFU1MpIHsKKwkJdG9nZ2xlX3N5bV92YWx1ZShtZW51KTsKKwkJY3VycmVudCA9IG1lbnU7CisJCWRpc3BsYXlfdHJlZV9wYXJ0KCk7CisJfSBlbHNlIHsKKwkJYnJvd3NlZCA9IG1lbnU7CisJCWRpc3BsYXlfdHJlZV9wYXJ0KCk7CisJfQorCisJZ3RrX3dpZGdldF9yZWFsaXplKHRyZWUyX3cpOworCWd0a190cmVlX3ZpZXdfc2V0X2N1cnNvcih2aWV3LCBwYXRoLCBOVUxMLCBGQUxTRSk7CisJZ3RrX3dpZGdldF9ncmFiX2ZvY3VzKHRyZWUyX3cpOworCisJcmV0dXJuIEZBTFNFOworfQorCisKKy8qIEZpbGwgYSByb3cgb2Ygc3RyaW5ncyAqLworc3RhdGljIGdjaGFyICoqZmlsbF9yb3coc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RhdGljIGdjaGFyICpyb3dbQ09MX05VTUJFUl07CisJc3RydWN0IHN5bWJvbCAqc3ltID0gbWVudS0+c3ltOworCWNvbnN0IGNoYXIgKmRlZjsKKwlpbnQgc3R5cGU7CisJdHJpc3RhdGUgdmFsOworCWVudW0gcHJvcF90eXBlIHB0eXBlOworCWludCBpOworCisJZm9yIChpID0gQ09MX09QVElPTjsgaSA8PSBDT0xfQ09MT1I7IGkrKykKKwkJZ19mcmVlKHJvd1tpXSk7CisJbWVtc2V0KHJvdywgMCwgc2l6ZW9mKHJvdykpOworCisJcm93W0NPTF9PUFRJT05dID0KKwkgICAgZ19zdHJkdXBfcHJpbnRmKCIlcyAlcyIsIG1lbnVfZ2V0X3Byb21wdChtZW51KSwKKwkJCSAgICBzeW0gPyAoc3ltLT4KKwkJCQkgICBmbGFncyAmIFNZTUJPTF9ORVcgPyAiKE5FVykiIDogIiIpIDoKKwkJCSAgICAiIik7CisKKwlpZiAoc2hvd19hbGwgJiYgIW1lbnVfaXNfdmlzaWJsZShtZW51KSkKKwkJcm93W0NPTF9DT0xPUl0gPSBnX3N0cmR1cCgiRGFya0dyYXkiKTsKKwllbHNlCisJCXJvd1tDT0xfQ09MT1JdID0gZ19zdHJkdXAoIkJsYWNrIik7CisKKwlwdHlwZSA9IG1lbnUtPnByb21wdCA/IG1lbnUtPnByb21wdC0+dHlwZSA6IFBfVU5LTk9XTjsKKwlzd2l0Y2ggKHB0eXBlKSB7CisJY2FzZSBQX01FTlU6CisJCXJvd1tDT0xfUElYQlVGXSA9IChnY2hhciAqKSB4cG1fbWVudTsKKwkJaWYgKHZpZXdfbW9kZSA9PSBTSU5HTEVfVklFVykKKwkJCXJvd1tDT0xfUElYVklTXSA9IEdJTlRfVE9fUE9JTlRFUihUUlVFKTsKKwkJcm93W0NPTF9CVE5WSVNdID0gR0lOVF9UT19QT0lOVEVSKEZBTFNFKTsKKwkJYnJlYWs7CisJY2FzZSBQX0NPTU1FTlQ6CisJCXJvd1tDT0xfUElYQlVGXSA9IChnY2hhciAqKSB4cG1fdm9pZDsKKwkJcm93W0NPTF9QSVhWSVNdID0gR0lOVF9UT19QT0lOVEVSKEZBTFNFKTsKKwkJcm93W0NPTF9CVE5WSVNdID0gR0lOVF9UT19QT0lOVEVSKEZBTFNFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcm93W0NPTF9QSVhCVUZdID0gKGdjaGFyICopIHhwbV92b2lkOworCQlyb3dbQ09MX1BJWFZJU10gPSBHSU5UX1RPX1BPSU5URVIoRkFMU0UpOworCQlyb3dbQ09MX0JUTlZJU10gPSBHSU5UX1RPX1BPSU5URVIoVFJVRSk7CisJCWJyZWFrOworCX0KKworCWlmICghc3ltKQorCQlyZXR1cm4gcm93OworCXJvd1tDT0xfTkFNRV0gPSBnX3N0cmR1cChzeW0tPm5hbWUpOworCisJc3ltX2NhbGNfdmFsdWUoc3ltKTsKKwlzeW0tPmZsYWdzICY9IH5TWU1CT0xfQ0hBTkdFRDsKKworCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpIHsJLy8gcGFyc2UgY2hpbGRzIGZvciBnZXR0aW5nIGZpbmFsIHZhbHVlCisJCXN0cnVjdCBtZW51ICpjaGlsZDsKKwkJc3RydWN0IHN5bWJvbCAqZGVmX3N5bSA9IHN5bV9nZXRfY2hvaWNlX3ZhbHVlKHN5bSk7CisJCXN0cnVjdCBtZW51ICpkZWZfbWVudSA9IE5VTEw7CisKKwkJcm93W0NPTF9CVE5WSVNdID0gR0lOVF9UT19QT0lOVEVSKEZBTFNFKTsKKworCQlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKwkJCWlmIChtZW51X2lzX3Zpc2libGUoY2hpbGQpCisJCQkgICAgJiYgY2hpbGQtPnN5bSA9PSBkZWZfc3ltKQorCQkJCWRlZl9tZW51ID0gY2hpbGQ7CisJCX0KKworCQlpZiAoZGVmX21lbnUpCisJCQlyb3dbQ09MX1ZBTFVFXSA9CisJCQkgICAgZ19zdHJkdXAobWVudV9nZXRfcHJvbXB0KGRlZl9tZW51KSk7CisJfQorCWlmIChzeW0tPmZsYWdzICYgU1lNQk9MX0NIT0lDRVZBTCkKKwkJcm93W0NPTF9CVE5SQURdID0gR0lOVF9UT19QT0lOVEVSKFRSVUUpOworCisJc3R5cGUgPSBzeW1fZ2V0X3R5cGUoc3ltKTsKKwlzd2l0Y2ggKHN0eXBlKSB7CisJY2FzZSBTX0JPT0xFQU46CisJCWlmIChHUE9JTlRFUl9UT19JTlQocm93W0NPTF9QSVhWSVNdKSA9PSBGQUxTRSkKKwkJCXJvd1tDT0xfQlROVklTXSA9IEdJTlRfVE9fUE9JTlRFUihUUlVFKTsKKwkJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSkKKwkJCWJyZWFrOworCWNhc2UgU19UUklTVEFURToKKwkJdmFsID0gc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pOworCQlzd2l0Y2ggKHZhbCkgeworCQljYXNlIG5vOgorCQkJcm93W0NPTF9OT10gPSBnX3N0cmR1cCgiTiIpOworCQkJcm93W0NPTF9WQUxVRV0gPSBnX3N0cmR1cCgiTiIpOworCQkJcm93W0NPTF9CVE5BQ1RdID0gR0lOVF9UT19QT0lOVEVSKEZBTFNFKTsKKwkJCXJvd1tDT0xfQlROSU5DXSA9IEdJTlRfVE9fUE9JTlRFUihGQUxTRSk7CisJCQlicmVhazsKKwkJY2FzZSBtb2Q6CisJCQlyb3dbQ09MX01PRF0gPSBnX3N0cmR1cCgiTSIpOworCQkJcm93W0NPTF9WQUxVRV0gPSBnX3N0cmR1cCgiTSIpOworCQkJcm93W0NPTF9CVE5JTkNdID0gR0lOVF9UT19QT0lOVEVSKFRSVUUpOworCQkJYnJlYWs7CisJCWNhc2UgeWVzOgorCQkJcm93W0NPTF9ZRVNdID0gZ19zdHJkdXAoIlkiKTsKKwkJCXJvd1tDT0xfVkFMVUVdID0gZ19zdHJkdXAoIlkiKTsKKwkJCXJvd1tDT0xfQlROQUNUXSA9IEdJTlRfVE9fUE9JTlRFUihUUlVFKTsKKwkJCXJvd1tDT0xfQlROSU5DXSA9IEdJTlRfVE9fUE9JTlRFUihGQUxTRSk7CisJCQlicmVhazsKKwkJfQorCisJCWlmICh2YWwgIT0gbm8gJiYgc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIG5vKSkKKwkJCXJvd1tDT0xfTk9dID0gZ19zdHJkdXAoIl8iKTsKKwkJaWYgKHZhbCAhPSBtb2QgJiYgc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIG1vZCkpCisJCQlyb3dbQ09MX01PRF0gPSBnX3N0cmR1cCgiXyIpOworCQlpZiAodmFsICE9IHllcyAmJiBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgeWVzKSkKKwkJCXJvd1tDT0xfWUVTXSA9IGdfc3RyZHVwKCJfIik7CisJCWJyZWFrOworCWNhc2UgU19JTlQ6CisJY2FzZSBTX0hFWDoKKwljYXNlIFNfU1RSSU5HOgorCQlkZWYgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pOworCQlyb3dbQ09MX1ZBTFVFXSA9IGdfc3RyZHVwKGRlZik7CisJCXJvd1tDT0xfRURJVF0gPSBHSU5UX1RPX1BPSU5URVIoVFJVRSk7CisJCXJvd1tDT0xfQlROVklTXSA9IEdJTlRfVE9fUE9JTlRFUihGQUxTRSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByb3c7Cit9CisKKworLyogU2V0IHRoZSBub2RlIGNvbnRlbnQgd2l0aCBhIHJvdyBvZiBzdHJpbmdzICovCitzdGF0aWMgdm9pZCBzZXRfbm9kZShHdGtUcmVlSXRlciAqIG5vZGUsIHN0cnVjdCBtZW51ICptZW51LCBnY2hhciAqKiByb3cpCit7CisJR2RrQ29sb3IgY29sb3I7CisJZ2Jvb2xlYW4gc3VjY2VzczsKKwlHZGtQaXhidWYgKnBpeDsKKworCXBpeCA9IGdka19waXhidWZfbmV3X2Zyb21feHBtX2RhdGEoKGNvbnN0IGNoYXIgKiopCisJCQkJCSAgIHJvd1tDT0xfUElYQlVGXSk7CisKKwlnZGtfY29sb3JfcGFyc2Uocm93W0NPTF9DT0xPUl0sICZjb2xvcik7CisJZ2RrX2NvbG9ybWFwX2FsbG9jX2NvbG9ycyhnZGtfY29sb3JtYXBfZ2V0X3N5c3RlbSgpLCAmY29sb3IsIDEsCisJCQkJICBGQUxTRSwgRkFMU0UsICZzdWNjZXNzKTsKKworCWd0a190cmVlX3N0b3JlX3NldCh0cmVlLCBub2RlLAorCQkJICAgQ09MX09QVElPTiwgcm93W0NPTF9PUFRJT05dLAorCQkJICAgQ09MX05BTUUsIHJvd1tDT0xfTkFNRV0sCisJCQkgICBDT0xfTk8sIHJvd1tDT0xfTk9dLAorCQkJICAgQ09MX01PRCwgcm93W0NPTF9NT0RdLAorCQkJICAgQ09MX1lFUywgcm93W0NPTF9ZRVNdLAorCQkJICAgQ09MX1ZBTFVFLCByb3dbQ09MX1ZBTFVFXSwKKwkJCSAgIENPTF9NRU5VLCAoZ3BvaW50ZXIpIG1lbnUsCisJCQkgICBDT0xfQ09MT1IsICZjb2xvciwKKwkJCSAgIENPTF9FRElULCBHUE9JTlRFUl9UT19JTlQocm93W0NPTF9FRElUXSksCisJCQkgICBDT0xfUElYQlVGLCBwaXgsCisJCQkgICBDT0xfUElYVklTLCBHUE9JTlRFUl9UT19JTlQocm93W0NPTF9QSVhWSVNdKSwKKwkJCSAgIENPTF9CVE5WSVMsIEdQT0lOVEVSX1RPX0lOVChyb3dbQ09MX0JUTlZJU10pLAorCQkJICAgQ09MX0JUTkFDVCwgR1BPSU5URVJfVE9fSU5UKHJvd1tDT0xfQlROQUNUXSksCisJCQkgICBDT0xfQlROSU5DLCBHUE9JTlRFUl9UT19JTlQocm93W0NPTF9CVE5JTkNdKSwKKwkJCSAgIENPTF9CVE5SQUQsIEdQT0lOVEVSX1RPX0lOVChyb3dbQ09MX0JUTlJBRF0pLAorCQkJICAgLTEpOworCisJZ19vYmplY3RfdW5yZWYocGl4KTsKK30KKworCisvKiBBZGQgYSBub2RlIHRvIHRoZSB0cmVlICovCitzdGF0aWMgdm9pZCBwbGFjZV9ub2RlKHN0cnVjdCBtZW51ICptZW51LCBjaGFyICoqcm93KQoreworCUd0a1RyZWVJdGVyICpwYXJlbnQgPSBwYXJlbnRzW2luZGVudCAtIDFdOworCUd0a1RyZWVJdGVyICpub2RlID0gcGFyZW50c1tpbmRlbnRdOworCisJZ3RrX3RyZWVfc3RvcmVfYXBwZW5kKHRyZWUsIG5vZGUsIHBhcmVudCk7CisJc2V0X25vZGUobm9kZSwgbWVudSwgcm93KTsKK30KKworCisvKiBGaW5kIGEgbm9kZSBpbiB0aGUgR1RLKyB0cmVlICovCitzdGF0aWMgR3RrVHJlZUl0ZXIgZm91bmQ7CisKKy8qCisgKiBGaW5kIGEgbWVudSBpbiB0aGUgR3RrVHJlZSBzdGFydGluZyBhdCBwYXJlbnQuCisgKi8KK0d0a1RyZWVJdGVyICpndGt0cmVlX2l0ZXJfZmluZF9ub2RlKEd0a1RyZWVJdGVyICogcGFyZW50LAorCQkJCSAgICBzdHJ1Y3QgbWVudSAqdG9maW5kKQoreworCUd0a1RyZWVJdGVyIGl0ZXI7CisJR3RrVHJlZUl0ZXIgKmNoaWxkID0gJml0ZXI7CisJZ2Jvb2xlYW4gdmFsaWQ7CisJR3RrVHJlZUl0ZXIgKnJldDsKKworCXZhbGlkID0gZ3RrX3RyZWVfbW9kZWxfaXRlcl9jaGlsZHJlbihtb2RlbDIsIGNoaWxkLCBwYXJlbnQpOworCXdoaWxlICh2YWxpZCkgeworCQlzdHJ1Y3QgbWVudSAqbWVudTsKKworCQlndGtfdHJlZV9tb2RlbF9nZXQobW9kZWwyLCBjaGlsZCwgNiwgJm1lbnUsIC0xKTsKKworCQlpZiAobWVudSA9PSB0b2ZpbmQpIHsKKwkJCW1lbWNweSgmZm91bmQsIGNoaWxkLCBzaXplb2YoR3RrVHJlZUl0ZXIpKTsKKwkJCXJldHVybiAmZm91bmQ7CisJCX0KKworCQlyZXQgPSBndGt0cmVlX2l0ZXJfZmluZF9ub2RlKGNoaWxkLCB0b2ZpbmQpOworCQlpZiAocmV0KQorCQkJcmV0dXJuIHJldDsKKworCQl2YWxpZCA9IGd0a190cmVlX21vZGVsX2l0ZXJfbmV4dChtb2RlbDIsIGNoaWxkKTsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworCisvKgorICogVXBkYXRlIHRoZSB0cmVlIGJ5IGFkZGluZy9yZW1vdmluZyBlbnRyaWVzCisgKiBEb2VzIG5vdCBjaGFuZ2Ugb3RoZXIgbm9kZXMKKyAqLworc3RhdGljIHZvaWQgdXBkYXRlX3RyZWUoc3RydWN0IG1lbnUgKnNyYywgR3RrVHJlZUl0ZXIgKiBkc3QpCit7CisJc3RydWN0IG1lbnUgKmNoaWxkMTsKKwlHdGtUcmVlSXRlciBpdGVyLCB0bXA7CisJR3RrVHJlZUl0ZXIgKmNoaWxkMiA9ICZpdGVyOworCWdib29sZWFuIHZhbGlkOworCUd0a1RyZWVJdGVyICpzaWJsaW5nOworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IG1lbnUgKm1lbnUxLCAqbWVudTI7CisKKwlpZiAoc3JjID09ICZyb290bWVudSkKKwkJaW5kZW50ID0gMTsKKworCXZhbGlkID0gZ3RrX3RyZWVfbW9kZWxfaXRlcl9jaGlsZHJlbihtb2RlbDIsIGNoaWxkMiwgZHN0KTsKKwlmb3IgKGNoaWxkMSA9IHNyYy0+bGlzdDsgY2hpbGQxOyBjaGlsZDEgPSBjaGlsZDEtPm5leHQpIHsKKworCQlwcm9wID0gY2hpbGQxLT5wcm9tcHQ7CisJCXN5bSA9IGNoaWxkMS0+c3ltOworCisJICAgICAgcmVwYXJzZToKKwkJbWVudTEgPSBjaGlsZDE7CisJCWlmICh2YWxpZCkKKwkJCWd0a190cmVlX21vZGVsX2dldChtb2RlbDIsIGNoaWxkMiwgQ09MX01FTlUsCisJCQkJCSAgICZtZW51MiwgLTEpOworCQllbHNlCisJCQltZW51MiA9IE5VTEw7CS8vIGZvcmNlIGFkZGluZyBvZiBhIGZpcnN0IGNoaWxkCisKKyNpZmRlZiBERUJVRworCQlwcmludGYoIiUqYyVzIHwgJXNcbiIsIGluZGVudCwgJyAnLAorCQkgICAgICAgbWVudTEgPyBtZW51X2dldF9wcm9tcHQobWVudTEpIDogIm5pbCIsCisJCSAgICAgICBtZW51MiA/IG1lbnVfZ2V0X3Byb21wdChtZW51MikgOiAibmlsIik7CisjZW5kaWYKKworCQlpZiAoIW1lbnVfaXNfdmlzaWJsZShjaGlsZDEpICYmICFzaG93X2FsbCkgewkvLyByZW1vdmUgbm9kZQorCQkJaWYgKGd0a3RyZWVfaXRlcl9maW5kX25vZGUoZHN0LCBtZW51MSkgIT0gTlVMTCkgeworCQkJCW1lbWNweSgmdG1wLCBjaGlsZDIsIHNpemVvZihHdGtUcmVlSXRlcikpOworCQkJCXZhbGlkID0gZ3RrX3RyZWVfbW9kZWxfaXRlcl9uZXh0KG1vZGVsMiwKKwkJCQkJCQkJIGNoaWxkMik7CisJCQkJZ3RrX3RyZWVfc3RvcmVfcmVtb3ZlKHRyZWUyLCAmdG1wKTsKKwkJCQlpZiAoIXZhbGlkKQorCQkJCQlyZXR1cm47CS8vIG5leHQgcGFyZW50CisJCQkJZWxzZQorCQkJCQlnb3RvIHJlcGFyc2U7CS8vIG5leHQgY2hpbGQKKwkJCX0gZWxzZQorCQkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKG1lbnUxICE9IG1lbnUyKSB7CisJCQlpZiAoZ3RrdHJlZV9pdGVyX2ZpbmRfbm9kZShkc3QsIG1lbnUxKSA9PSBOVUxMKSB7CS8vIGFkZCBub2RlCisJCQkJaWYgKCF2YWxpZCAmJiAhbWVudTIpCisJCQkJCXNpYmxpbmcgPSBOVUxMOworCQkJCWVsc2UKKwkJCQkJc2libGluZyA9IGNoaWxkMjsKKwkJCQlndGtfdHJlZV9zdG9yZV9pbnNlcnRfYmVmb3JlKHRyZWUyLAorCQkJCQkJCSAgICAgY2hpbGQyLAorCQkJCQkJCSAgICAgZHN0LCBzaWJsaW5nKTsKKwkJCQlzZXRfbm9kZShjaGlsZDIsIG1lbnUxLCBmaWxsX3JvdyhtZW51MSkpOworCQkJCWlmIChtZW51MiA9PSBOVUxMKQorCQkJCQl2YWxpZCA9IFRSVUU7CisJCQl9IGVsc2UgewkvLyByZW1vdmUgbm9kZQorCQkJCW1lbWNweSgmdG1wLCBjaGlsZDIsIHNpemVvZihHdGtUcmVlSXRlcikpOworCQkJCXZhbGlkID0gZ3RrX3RyZWVfbW9kZWxfaXRlcl9uZXh0KG1vZGVsMiwKKwkJCQkJCQkJIGNoaWxkMik7CisJCQkJZ3RrX3RyZWVfc3RvcmVfcmVtb3ZlKHRyZWUyLCAmdG1wKTsKKwkJCQlpZiAoIXZhbGlkKQorCQkJCQlyZXR1cm47CS8vIG5leHQgcGFyZW50CisJCQkJZWxzZQorCQkJCQlnb3RvIHJlcGFyc2U7CS8vIG5leHQgY2hpbGQKKwkJCX0KKwkJfSBlbHNlIGlmIChzeW0gJiYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfQ0hBTkdFRCkpIHsKKwkJCXNldF9ub2RlKGNoaWxkMiwgbWVudTEsIGZpbGxfcm93KG1lbnUxKSk7CisJCX0KKworCQlpbmRlbnQrKzsKKwkJdXBkYXRlX3RyZWUoY2hpbGQxLCBjaGlsZDIpOworCQlpbmRlbnQtLTsKKworCQl2YWxpZCA9IGd0a190cmVlX21vZGVsX2l0ZXJfbmV4dChtb2RlbDIsIGNoaWxkMik7CisJfQorfQorCisKKy8qIERpc3BsYXkgdGhlIHdob2xlIHRyZWUgKHNpbmdsZS9zcGxpdC9mdWxsIHZpZXcpICovCitzdGF0aWMgdm9pZCBkaXNwbGF5X3RyZWUoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisJZW51bSBwcm9wX3R5cGUgcHR5cGU7CisKKwlpZiAobWVudSA9PSAmcm9vdG1lbnUpIHsKKwkJaW5kZW50ID0gMTsKKwkJY3VycmVudCA9ICZyb290bWVudTsKKwl9CisKKwlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKwkJcHJvcCA9IGNoaWxkLT5wcm9tcHQ7CisJCXN5bSA9IGNoaWxkLT5zeW07CisJCXB0eXBlID0gcHJvcCA/IHByb3AtPnR5cGUgOiBQX1VOS05PV047CisKKwkJaWYgKHN5bSkKKwkJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9DSEFOR0VEOworCisJCWlmICgodmlld19tb2RlID09IFNQTElUX1ZJRVcpCisJCSAgICAmJiAhKGNoaWxkLT5mbGFncyAmIE1FTlVfUk9PVCkgJiYgKHRyZWUgPT0gdHJlZTEpKQorCQkJY29udGludWU7CisKKwkJaWYgKCh2aWV3X21vZGUgPT0gU1BMSVRfVklFVykgJiYgKGNoaWxkLT5mbGFncyAmIE1FTlVfUk9PVCkKKwkJICAgICYmICh0cmVlID09IHRyZWUyKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChtZW51X2lzX3Zpc2libGUoY2hpbGQpIHx8IHNob3dfYWxsKQorCQkJcGxhY2Vfbm9kZShjaGlsZCwgZmlsbF9yb3coY2hpbGQpKTsKKyNpZmRlZiBERUJVRworCQlwcmludGYoIiUqYyVzOiAiLCBpbmRlbnQsICcgJywgbWVudV9nZXRfcHJvbXB0KGNoaWxkKSk7CisJCXByaW50ZigiJXMiLCBjaGlsZC0+ZmxhZ3MgJiBNRU5VX1JPT1QgPyAicm9vdG1lbnUgfCAiIDogIiIpOworCQlkYmdfcHJpbnRfcHR5cGUocHR5cGUpOworCQlwcmludGYoIiB8ICIpOworCQlpZiAoc3ltKSB7CisJCQlkYmdfcHJpbnRfc3R5cGUoc3ltLT50eXBlKTsKKwkJCXByaW50ZigiIHwgIik7CisJCQlkYmdfcHJpbnRfZmxhZ3Moc3ltLT5mbGFncyk7CisJCQlwcmludGYoIlxuIik7CisJCX0gZWxzZQorCQkJcHJpbnRmKCJcbiIpOworI2VuZGlmCisJCWlmICgodmlld19tb2RlICE9IEZVTExfVklFVykgJiYgKHB0eXBlID09IFBfTUVOVSkKKwkJICAgICYmICh0cmVlID09IHRyZWUyKSkKKwkJCWNvbnRpbnVlOworLyoKKwkJaWYgKCgobWVudSAhPSAmcm9vdG1lbnUpICYmICEobWVudS0+ZmxhZ3MgJiBNRU5VX1JPT1QpKQorCQkgICAgfHwgKHZpZXdfbW9kZSA9PSBGVUxMX1ZJRVcpCisJCSAgICB8fCAodmlld19tb2RlID09IFNQTElUX1ZJRVcpKSovCisJCWlmICgoKHZpZXdfbW9kZSA9PSBTSU5HTEVfVklFVykgJiYgKG1lbnUtPmZsYWdzICYgTUVOVV9ST09UKSkKKwkJICAgIHx8ICh2aWV3X21vZGUgPT0gRlVMTF9WSUVXKQorCQkgICAgfHwgKHZpZXdfbW9kZSA9PSBTUExJVF9WSUVXKSkgeworCQkJaW5kZW50Kys7CisJCQlkaXNwbGF5X3RyZWUoY2hpbGQpOworCQkJaW5kZW50LS07CisJCX0KKwl9Cit9CisKKy8qIERpc3BsYXkgYSBwYXJ0IG9mIHRoZSB0cmVlIHN0YXJ0aW5nIGF0IGN1cnJlbnQgbm9kZSAoc2luZ2xlL3NwbGl0IHZpZXcpICovCitzdGF0aWMgdm9pZCBkaXNwbGF5X3RyZWVfcGFydCh2b2lkKQoreworCWlmICh0cmVlMikKKwkJZ3RrX3RyZWVfc3RvcmVfY2xlYXIodHJlZTIpOworCWlmICh2aWV3X21vZGUgPT0gU0lOR0xFX1ZJRVcpCisJCWRpc3BsYXlfdHJlZShjdXJyZW50KTsKKwllbHNlIGlmICh2aWV3X21vZGUgPT0gU1BMSVRfVklFVykKKwkJZGlzcGxheV90cmVlKGJyb3dzZWQpOworCWd0a190cmVlX3ZpZXdfZXhwYW5kX2FsbChHVEtfVFJFRV9WSUVXKHRyZWUyX3cpKTsKK30KKworLyogRGlzcGxheSB0aGUgbGlzdCBpbiB0aGUgbGVmdCBmcmFtZSAoc3BsaXQgdmlldykgKi8KK3N0YXRpYyB2b2lkIGRpc3BsYXlfbGlzdCh2b2lkKQoreworCWlmICh0cmVlMSkKKwkJZ3RrX3RyZWVfc3RvcmVfY2xlYXIodHJlZTEpOworCisJdHJlZSA9IHRyZWUxOworCWRpc3BsYXlfdHJlZSgmcm9vdG1lbnUpOworCWd0a190cmVlX3ZpZXdfZXhwYW5kX2FsbChHVEtfVFJFRV9WSUVXKHRyZWUxX3cpKTsKKwl0cmVlID0gdHJlZTI7Cit9CisKK3ZvaWQgZml4dXBfcm9vdG1lbnUoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IG1lbnUgKmNoaWxkOworCXN0YXRpYyBpbnQgbWVudV9jbnQgPSAwOworCisJbWVudS0+ZmxhZ3MgfD0gTUVOVV9ST09UOworCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworCQlpZiAoY2hpbGQtPnByb21wdCAmJiBjaGlsZC0+cHJvbXB0LT50eXBlID09IFBfTUVOVSkgeworCQkJbWVudV9jbnQrKzsKKwkJCWZpeHVwX3Jvb3RtZW51KGNoaWxkKTsKKwkJCW1lbnVfY250LS07CisJCX0gZWxzZSBpZiAoIW1lbnVfY250KQorCQkJZml4dXBfcm9vdG1lbnUoY2hpbGQpOworCX0KK30KKworCisvKiBNYWluICovCitpbnQgbWFpbihpbnQgYWMsIGNoYXIgKmF2W10pCit7CisJY29uc3QgY2hhciAqbmFtZTsKKwljaGFyICplbnY7CisJZ2NoYXIgKmdsYWRlX2ZpbGU7CisKKyNpZm5kZWYgTEtDX0RJUkVDVF9MSU5LCisJa2NvbmZpZ19sb2FkKCk7CisjZW5kaWYKKworCWJpbmR0ZXh0ZG9tYWluKFBBQ0tBR0UsIExPQ0FMRURJUik7CisJYmluZF90ZXh0ZG9tYWluX2NvZGVzZXQoUEFDS0FHRSwgIlVURi04Iik7CisJdGV4dGRvbWFpbihQQUNLQUdFKTsKKworCS8qIEdUSyBzdHVmZnMgKi8KKwlndGtfc2V0X2xvY2FsZSgpOworCWd0a19pbml0KCZhYywgJmF2KTsKKwlnbGFkZV9pbml0KCk7CisKKwkvL2FkZF9waXhtYXBfZGlyZWN0b3J5IChQQUNLQUdFX0RBVEFfRElSICIvIiBQQUNLQUdFICIvcGl4bWFwcyIpOworCS8vYWRkX3BpeG1hcF9kaXJlY3RvcnkgKFBBQ0tBR0VfU09VUkNFX0RJUiAiL3BpeG1hcHMiKTsKKworCS8qIERldGVybWluZSBHVUkgcGF0aCAqLworCWVudiA9IGdldGVudihTUkNUUkVFKTsKKwlpZiAoZW52KQorCQlnbGFkZV9maWxlID0gZ19zdHJjb25jYXQoZW52LCAiL3NjcmlwdHMva2NvbmZpZy9nY29uZi5nbGFkZSIsIE5VTEwpOworCWVsc2UgaWYgKGF2WzBdWzBdID09ICcvJykKKwkJZ2xhZGVfZmlsZSA9IGdfc3RyY29uY2F0KGF2WzBdLCAiLmdsYWRlIiwgTlVMTCk7CisJZWxzZQorCQlnbGFkZV9maWxlID0gZ19zdHJjb25jYXQoZ19nZXRfY3VycmVudF9kaXIoKSwgIi8iLCBhdlswXSwgIi5nbGFkZSIsIE5VTEwpOworCisJLyogTG9hZCB0aGUgaW50ZXJmYWNlIGFuZCBjb25uZWN0IHNpZ25hbHMgKi8KKwlpbml0X21haW5fd2luZG93KGdsYWRlX2ZpbGUpOworCWluaXRfdHJlZV9tb2RlbCgpOworCWluaXRfbGVmdF90cmVlKCk7CisJaW5pdF9yaWdodF90cmVlKCk7CisKKwkvKiBDb25mIHN0dWZmcyAqLworCWlmIChhYyA+IDEgJiYgYXZbMV1bMF0gPT0gJy0nKSB7CisJCXN3aXRjaCAoYXZbMV1bMV0pIHsKKwkJY2FzZSAnYSc6CisJCQkvL3Nob3dBbGwgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2gnOgorCQljYXNlICc/JzoKKwkJCXByaW50ZigiJXMgPGNvbmZpZz5cbiIsIGF2WzBdKTsKKwkJCWV4aXQoMCk7CisJCX0KKwkJbmFtZSA9IGF2WzJdOworCX0gZWxzZQorCQluYW1lID0gYXZbMV07CisKKwljb25mX3BhcnNlKG5hbWUpOworCWZpeHVwX3Jvb3RtZW51KCZyb290bWVudSk7CisJY29uZl9yZWFkKE5VTEwpOworCisJc3dpdGNoICh2aWV3X21vZGUpIHsKKwljYXNlIFNJTkdMRV9WSUVXOgorCQlkaXNwbGF5X3RyZWVfcGFydCgpOworCQlicmVhazsKKwljYXNlIFNQTElUX1ZJRVc6CisJCWRpc3BsYXlfbGlzdCgpOworCQlicmVhazsKKwljYXNlIEZVTExfVklFVzoKKwkJZGlzcGxheV90cmVlKCZyb290bWVudSk7CisJCWJyZWFrOworCX0KKworCWd0a19tYWluKCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9nY29uZi5nbGFkZSBiL3NjcmlwdHMva2NvbmZpZy9nY29uZi5nbGFkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODc0NGVkCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL2djb25mLmdsYWRlCkBAIC0wLDAgKzEsNjQ4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+IDwhLS0qLSBtb2RlOiB4bWwgLSotLT4KKzwhRE9DVFlQRSBnbGFkZS1pbnRlcmZhY2UgU1lTVEVNICJodHRwOi8vZ2xhZGUuZ25vbWUub3JnL2dsYWRlLTIuMC5kdGQiPgorCis8Z2xhZGUtaW50ZXJmYWNlPgorCis8d2lkZ2V0IGNsYXNzPSJHdGtXaW5kb3ciIGlkPSJ3aW5kb3cxIj4KKyAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0idGl0bGUiIHRyYW5zbGF0YWJsZT0ieWVzIj5HdGsgS2VybmVsIENvbmZpZ3VyYXRvcjwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlIj5HVEtfV0lORE9XX1RPUExFVkVMPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9IndpbmRvd19wb3NpdGlvbiI+R1RLX1dJTl9QT1NfTk9ORTwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJtb2RhbCI+RmFsc2U8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0iZGVmYXVsdF93aWR0aCI+NjQwPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9ImRlZmF1bHRfaGVpZ2h0Ij40ODA8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0icmVzaXphYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9ImRlc3Ryb3lfd2l0aF9wYXJlbnQiPkZhbHNlPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9ImRlY29yYXRlZCI+VHJ1ZTwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJza2lwX3Rhc2tiYXJfaGludCI+RmFsc2U8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0ic2tpcF9wYWdlcl9oaW50Ij5GYWxzZTwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0eXBlX2hpbnQiPkdES19XSU5ET1dfVFlQRV9ISU5UX05PUk1BTDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJncmF2aXR5Ij5HREtfR1JBVklUWV9OT1JUSF9XRVNUPC9wcm9wZXJ0eT4KKyAgPHNpZ25hbCBuYW1lPSJkZXN0cm95IiBoYW5kbGVyPSJvbl93aW5kb3cxX2Rlc3Ryb3kiIG9iamVjdD0id2luZG93MSIvPgorICA8c2lnbmFsIG5hbWU9InNpemVfcmVxdWVzdCIgaGFuZGxlcj0ib25fd2luZG93MV9zaXplX3JlcXVlc3QiIG9iamVjdD0idnBhbmVkMSIgbGFzdF9tb2RpZmljYXRpb25fdGltZT0iRnJpLCAxMSBKYW4gMjAwMiAxNjoxNzoxMSBHTVQiLz4KKyAgPHNpZ25hbCBuYW1lPSJkZWxldGVfZXZlbnQiIGhhbmRsZXI9Im9uX3dpbmRvdzFfZGVsZXRlX2V2ZW50IiBvYmplY3Q9IndpbmRvdzEiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMDkgTWFyIDIwMDMgMTk6NDI6NDYgR01UIi8+CisKKyAgPGNoaWxkPgorICAgIDx3aWRnZXQgY2xhc3M9Ikd0a1ZCb3giIGlkPSJ2Ym94MSI+CisgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgICAgICA8cHJvcGVydHkgbmFtZT0iaG9tb2dlbmVvdXMiPkZhbHNlPC9wcm9wZXJ0eT4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzcGFjaW5nIj4wPC9wcm9wZXJ0eT4KKworICAgICAgPGNoaWxkPgorCTx3aWRnZXQgY2xhc3M9Ikd0a01lbnVCYXIiIGlkPSJtZW51YmFyMSI+CisJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisKKwkgIDxjaGlsZD4KKwkgICAgPHdpZGdldCBjbGFzcz0iR3RrTWVudUl0ZW0iIGlkPSJmaWxlMSI+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPl9GaWxlPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a01lbnUiIGlkPSJmaWxlMV9tZW51Ij4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlTWVudUl0ZW0iIGlkPSJsb2FkMSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5Mb2FkIGEgY29uZmlnIGZpbGU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5fTG9hZDwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJhY3RpdmF0ZSIgaGFuZGxlcj0ib25fbG9hZDFfYWN0aXZhdGUiLz4KKwkJICAgICAgPGFjY2VsZXJhdG9yIGtleT0iTCIgbW9kaWZpZXJzPSJHREtfQ09OVFJPTF9NQVNLIiBzaWduYWw9ImFjdGl2YXRlIi8+CisKKwkJICAgICAgPGNoaWxkIGludGVybmFsLWNoaWxkPSJpbWFnZSI+CisJCQk8d2lkZ2V0IGNsYXNzPSJHdGtJbWFnZSIgaWQ9ImltYWdlMzkiPgorCQkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9jayI+Z3RrLW9wZW48L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0iaWNvbl9zaXplIj4xPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhwYWQiPjA8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieXBhZCI+MDwvcHJvcGVydHk+CisJCQk8L3dpZGdldD4KKwkJICAgICAgPC9jaGlsZD4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtJbWFnZU1lbnVJdGVtIiBpZD0ic2F2ZTEiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+U2F2ZSB0aGUgY29uZmlnIGluIC5jb25maWc8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5fU2F2ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJhY3RpdmF0ZSIgaGFuZGxlcj0ib25fc2F2ZTFfYWN0aXZhdGUiLz4KKwkJICAgICAgPGFjY2VsZXJhdG9yIGtleT0iUyIgbW9kaWZpZXJzPSJHREtfQ09OVFJPTF9NQVNLIiBzaWduYWw9ImFjdGl2YXRlIi8+CisKKwkJICAgICAgPGNoaWxkIGludGVybmFsLWNoaWxkPSJpbWFnZSI+CisJCQk8d2lkZ2V0IGNsYXNzPSJHdGtJbWFnZSIgaWQ9ImltYWdlNDAiPgorCQkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9jayI+Z3RrLXNhdmU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0iaWNvbl9zaXplIj4xPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhwYWQiPjA8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieXBhZCI+MDwvcHJvcGVydHk+CisJCQk8L3dpZGdldD4KKwkJICAgICAgPC9jaGlsZD4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtJbWFnZU1lbnVJdGVtIiBpZD0ic2F2ZV9hczEiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+U2F2ZSB0aGUgY29uZmlnIGluIGEgZmlsZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNhdmUgX2FzPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9zYXZlX2FzMV9hY3RpdmF0ZSIvPgorCisJCSAgICAgIDxjaGlsZCBpbnRlcm5hbC1jaGlsZD0iaW1hZ2UiPgorCQkJPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2UiIGlkPSJpbWFnZTQxIj4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2siPmd0ay1zYXZlLWFzPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9Imljb25fc2l6ZSI+MTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlwYWQiPjA8L3Byb3BlcnR5PgorCQkJPC93aWRnZXQ+CisJCSAgICAgIDwvY2hpbGQ+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrU2VwYXJhdG9yTWVudUl0ZW0iIGlkPSJzZXBhcmF0b3IxIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlTWVudUl0ZW0iIGlkPSJxdWl0MSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+X1F1aXQ8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxzaWduYWwgbmFtZT0iYWN0aXZhdGUiIGhhbmRsZXI9Im9uX3F1aXQxX2FjdGl2YXRlIi8+CisJCSAgICAgIDxhY2NlbGVyYXRvciBrZXk9IlEiIG1vZGlmaWVycz0iR0RLX0NPTlRST0xfTUFTSyIgc2lnbmFsPSJhY3RpdmF0ZSIvPgorCisJCSAgICAgIDxjaGlsZCBpbnRlcm5hbC1jaGlsZD0iaW1hZ2UiPgorCQkJPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2UiIGlkPSJpbWFnZTQyIj4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2siPmd0ay1xdWl0PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9Imljb25fc2l6ZSI+MTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlwYWQiPjA8L3Byb3BlcnR5PgorCQkJPC93aWRnZXQ+CisJCSAgICAgIDwvY2hpbGQ+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCQk8L3dpZGdldD4KKwkgICAgICA8L2NoaWxkPgorCSAgICA8L3dpZGdldD4KKwkgIDwvY2hpbGQ+CisKKwkgIDxjaGlsZD4KKwkgICAgPHdpZGdldCBjbGFzcz0iR3RrTWVudUl0ZW0iIGlkPSJvcHRpb25zMSI+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPl9PcHRpb25zPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a01lbnUiIGlkPSJvcHRpb25zMV9tZW51Ij4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0NoZWNrTWVudUl0ZW0iIGlkPSJzaG93X25hbWUxIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNob3cgbmFtZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNob3cgX25hbWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhY3RpdmUiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJhY3RpdmF0ZSIgaGFuZGxlcj0ib25fc2hvd19uYW1lMV9hY3RpdmF0ZSIvPgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0NoZWNrTWVudUl0ZW0iIGlkPSJzaG93X3JhbmdlMSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5TaG93IHJhbmdlIChZL00vTik8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5TaG93IF9yYW5nZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImFjdGl2ZSI+RmFsc2U8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9zaG93X3JhbmdlMV9hY3RpdmF0ZSIvPgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0NoZWNrTWVudUl0ZW0iIGlkPSJzaG93X2RhdGExIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNob3cgdmFsdWUgb2YgdGhlIG9wdGlvbjwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNob3cgX2RhdGE8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhY3RpdmUiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJhY3RpdmF0ZSIgaGFuZGxlcj0ib25fc2hvd19kYXRhMV9hY3RpdmF0ZSIvPgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a1NlcGFyYXRvck1lbnVJdGVtIiBpZD0ic2VwYXJhdG9yMiI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtDaGVja01lbnVJdGVtIiBpZD0ic2hvd19hbGxfb3B0aW9uczEiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyBhbGwgb3B0aW9uczwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNob3cgYWxsIF9vcHRpb25zPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0iYWN0aXZlIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgICAgIDxzaWduYWwgbmFtZT0iYWN0aXZhdGUiIGhhbmRsZXI9Im9uX3Nob3dfYWxsX29wdGlvbnMxX2FjdGl2YXRlIi8+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrQ2hlY2tNZW51SXRlbSIgaWQ9InNob3dfZGVidWdfaW5mbzEiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyBtYXNrZWQgb3B0aW9uczwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNob3cgX2RlYnVnIGluZm88L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhY3RpdmUiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJhY3RpdmF0ZSIgaGFuZGxlcj0ib25fc2hvd19kZWJ1Z19pbmZvMV9hY3RpdmF0ZSIvPgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKwkJPC93aWRnZXQ+CisJICAgICAgPC9jaGlsZD4KKwkgICAgPC93aWRnZXQ+CisJICA8L2NoaWxkPgorCisJICA8Y2hpbGQ+CisJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a01lbnVJdGVtIiBpZD0iaGVscDEiPgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5fSGVscDwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJHdGtNZW51IiBpZD0iaGVscDFfbWVudSI+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtJbWFnZU1lbnVJdGVtIiBpZD0iaW50cm9kdWN0aW9uMSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+X0ludHJvZHVjdGlvbjwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJhY3RpdmF0ZSIgaGFuZGxlcj0ib25faW50cm9kdWN0aW9uMV9hY3RpdmF0ZSIgbGFzdF9tb2RpZmljYXRpb25fdGltZT0iRnJpLCAxNSBOb3YgMjAwMiAyMDoyNjozMCBHTVQiLz4KKwkJICAgICAgPGFjY2VsZXJhdG9yIGtleT0iSSIgbW9kaWZpZXJzPSJHREtfQ09OVFJPTF9NQVNLIiBzaWduYWw9ImFjdGl2YXRlIi8+CisKKwkJICAgICAgPGNoaWxkIGludGVybmFsLWNoaWxkPSJpbWFnZSI+CisJCQk8d2lkZ2V0IGNsYXNzPSJHdGtJbWFnZSIgaWQ9ImltYWdlNDMiPgorCQkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9jayI+Z3RrLWRpYWxvZy1xdWVzdGlvbjwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJpY29uX3NpemUiPjE8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieWFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieHBhZCI+MDwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCTwvd2lkZ2V0PgorCQkgICAgICA8L2NoaWxkPgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlTWVudUl0ZW0iIGlkPSJhYm91dDEiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPl9BYm91dDwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJhY3RpdmF0ZSIgaGFuZGxlcj0ib25fYWJvdXQxX2FjdGl2YXRlIiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJGcmksIDE1IE5vdiAyMDAyIDIwOjI2OjMwIEdNVCIvPgorCQkgICAgICA8YWNjZWxlcmF0b3Iga2V5PSJBIiBtb2RpZmllcnM9IkdES19DT05UUk9MX01BU0siIHNpZ25hbD0iYWN0aXZhdGUiLz4KKworCQkgICAgICA8Y2hpbGQgaW50ZXJuYWwtY2hpbGQ9ImltYWdlIj4KKwkJCTx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlIiBpZD0iaW1hZ2U0NCI+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InN0b2NrIj5ndGstcHJvcGVydGllczwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJpY29uX3NpemUiPjE8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieWFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieHBhZCI+MDwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCTwvd2lkZ2V0PgorCQkgICAgICA8L2NoaWxkPgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlTWVudUl0ZW0iIGlkPSJsaWNlbnNlMSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+X0xpY2Vuc2U8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxzaWduYWwgbmFtZT0iYWN0aXZhdGUiIGhhbmRsZXI9Im9uX2xpY2Vuc2UxX2FjdGl2YXRlIiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJGcmksIDE1IE5vdiAyMDAyIDIwOjI2OjMwIEdNVCIvPgorCisJCSAgICAgIDxjaGlsZCBpbnRlcm5hbC1jaGlsZD0iaW1hZ2UiPgorCQkJPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2UiIGlkPSJpbWFnZTQ1Ij4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2siPmd0ay1qdXN0aWZ5LWZpbGw8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0iaWNvbl9zaXplIj4xPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhwYWQiPjA8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieXBhZCI+MDwvcHJvcGVydHk+CisJCQk8L3dpZGdldD4KKwkJICAgICAgPC9jaGlsZD4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisJCTwvd2lkZ2V0PgorCSAgICAgIDwvY2hpbGQ+CisJICAgIDwvd2lkZ2V0PgorCSAgPC9jaGlsZD4KKwk8L3dpZGdldD4KKwk8cGFja2luZz4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJwYWRkaW5nIj4wPC9wcm9wZXJ0eT4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJleHBhbmQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJmaWxsIj5GYWxzZTwvcHJvcGVydHk+CisJPC9wYWNraW5nPgorICAgICAgPC9jaGlsZD4KKworICAgICAgPGNoaWxkPgorCTx3aWRnZXQgY2xhc3M9Ikd0a0hhbmRsZUJveCIgaWQ9ImhhbmRsZWJveDEiPgorCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCSAgPHByb3BlcnR5IG5hbWU9InNoYWRvd190eXBlIj5HVEtfU0hBRE9XX09VVDwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0iaGFuZGxlX3Bvc2l0aW9uIj5HVEtfUE9TX0xFRlQ8L3Byb3BlcnR5PgorCSAgPHByb3BlcnR5IG5hbWU9InNuYXBfZWRnZSI+R1RLX1BPU19UT1A8L3Byb3BlcnR5PgorCisJICA8Y2hpbGQ+CisJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a1Rvb2xiYXIiIGlkPSJ0b29sYmFyMSI+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcmllbnRhdGlvbiI+R1RLX09SSUVOVEFUSU9OX0hPUklaT05UQUw8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sYmFyX3N0eWxlIj5HVEtfVE9PTEJBUl9CT1RIPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcHMiPlRydWU8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzaG93X2Fycm93Ij5UcnVlPC9wcm9wZXJ0eT4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrVG9vbEJ1dHRvbiIgaWQ9ImJ1dHRvbjEiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkdvZXMgdXAgb2Ygb25lIGxldmVsIChzaW5nbGUgdmlldyk8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkJhY2s8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2tfaWQiPmd0ay11bmRvPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV9ob3Jpem9udGFsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV92ZXJ0aWNhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImlzX2ltcG9ydGFudCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxzaWduYWwgbmFtZT0iY2xpY2tlZCIgaGFuZGxlcj0ib25fYmFja19jbGlja2VkIi8+CisJCTwvd2lkZ2V0PgorCQk8cGFja2luZz4KKwkJICA8cHJvcGVydHkgbmFtZT0iZXhwYW5kIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImhvbW9nZW5lb3VzIj5UcnVlPC9wcm9wZXJ0eT4KKwkJPC9wYWNraW5nPgorCSAgICAgIDwvY2hpbGQ+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a1Rvb2xJdGVtIiBpZD0idG9vbGl0ZW0xIj4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfaG9yaXpvbnRhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfdmVydGljYWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJpc19pbXBvcnRhbnQiPkZhbHNlPC9wcm9wZXJ0eT4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a1ZTZXBhcmF0b3IiIGlkPSJ2c2VwYXJhdG9yMSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisJCTwvd2lkZ2V0PgorCQk8cGFja2luZz4KKwkJICA8cHJvcGVydHkgbmFtZT0iZXhwYW5kIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImhvbW9nZW5lb3VzIj5GYWxzZTwvcHJvcGVydHk+CisJCTwvcGFja2luZz4KKwkgICAgICA8L2NoaWxkPgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJHdGtUb29sQnV0dG9uIiBpZD0iYnV0dG9uMiI+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+TG9hZCBhIGNvbmZpZyBmaWxlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5Mb2FkPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InN0b2NrX2lkIj5ndGstb3BlbjwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfaG9yaXpvbnRhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfdmVydGljYWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJpc19pbXBvcnRhbnQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICA8c2lnbmFsIG5hbWU9ImNsaWNrZWQiIGhhbmRsZXI9Im9uX2xvYWRfY2xpY2tlZCIvPgorCQk8L3dpZGdldD4KKwkJPHBhY2tpbmc+CisJCSAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJob21vZ2VuZW91cyI+VHJ1ZTwvcHJvcGVydHk+CisJCTwvcGFja2luZz4KKwkgICAgICA8L2NoaWxkPgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJHdGtUb29sQnV0dG9uIiBpZD0iYnV0dG9uMyI+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+U2F2ZSBhIGNvbmZpZyBmaWxlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5TYXZlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InN0b2NrX2lkIj5ndGstc2F2ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfaG9yaXpvbnRhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfdmVydGljYWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJpc19pbXBvcnRhbnQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICA8c2lnbmFsIG5hbWU9ImNsaWNrZWQiIGhhbmRsZXI9Im9uX3NhdmVfY2xpY2tlZCIvPgorCQk8L3dpZGdldD4KKwkJPHBhY2tpbmc+CisJCSAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJob21vZ2VuZW91cyI+VHJ1ZTwvcHJvcGVydHk+CisJCTwvcGFja2luZz4KKwkgICAgICA8L2NoaWxkPgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJHdGtUb29sSXRlbSIgaWQ9InRvb2xpdGVtMiI+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX2hvcml6b250YWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX3ZlcnRpY2FsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaXNfaW1wb3J0YW50Ij5GYWxzZTwvcHJvcGVydHk+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtWU2VwYXJhdG9yIiBpZD0idnNlcGFyYXRvcjIiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCQk8L3dpZGdldD4KKwkJPHBhY2tpbmc+CisJCSAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJob21vZ2VuZW91cyI+RmFsc2U8L3Byb3BlcnR5PgorCQk8L3BhY2tpbmc+CisJICAgICAgPC9jaGlsZD4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrVG9vbEJ1dHRvbiIgaWQ9ImJ1dHRvbjQiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNpbmdsZSB2aWV3PC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5TaW5nbGU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2tfaWQiPmd0ay1taXNzaW5nLWltYWdlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV9ob3Jpem9udGFsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV92ZXJ0aWNhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImlzX2ltcG9ydGFudCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxzaWduYWwgbmFtZT0iY2xpY2tlZCIgaGFuZGxlcj0ib25fc2luZ2xlX2NsaWNrZWQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTQ6Mjg6MzkgR01UIi8+CisJCTwvd2lkZ2V0PgorCQk8cGFja2luZz4KKwkJICA8cHJvcGVydHkgbmFtZT0iZXhwYW5kIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImhvbW9nZW5lb3VzIj5UcnVlPC9wcm9wZXJ0eT4KKwkJPC9wYWNraW5nPgorCSAgICAgIDwvY2hpbGQ+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a1Rvb2xCdXR0b24iIGlkPSJidXR0b241Ij4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5TcGxpdCB2aWV3PC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5TcGxpdDwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9ja19pZCI+Z3RrLW1pc3NpbmctaW1hZ2U8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX2hvcml6b250YWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlX3ZlcnRpY2FsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaXNfaW1wb3J0YW50Ij5GYWxzZTwvcHJvcGVydHk+CisJCSAgPHNpZ25hbCBuYW1lPSJjbGlja2VkIiBoYW5kbGVyPSJvbl9zcGxpdF9jbGlja2VkIiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJTdW4sIDEyIEphbiAyMDAzIDE0OjI4OjQ1IEdNVCIvPgorCQk8L3dpZGdldD4KKwkJPHBhY2tpbmc+CisJCSAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJob21vZ2VuZW91cyI+VHJ1ZTwvcHJvcGVydHk+CisJCTwvcGFja2luZz4KKwkgICAgICA8L2NoaWxkPgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJHdGtUb29sQnV0dG9uIiBpZD0iYnV0dG9uNiI+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+RnVsbCB2aWV3PC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5GdWxsPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InN0b2NrX2lkIj5ndGstbWlzc2luZy1pbWFnZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfaG9yaXpvbnRhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGVfdmVydGljYWwiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJpc19pbXBvcnRhbnQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICA8c2lnbmFsIG5hbWU9ImNsaWNrZWQiIGhhbmRsZXI9Im9uX2Z1bGxfY2xpY2tlZCIgbGFzdF9tb2RpZmljYXRpb25fdGltZT0iU3VuLCAxMiBKYW4gMjAwMyAxNDoyODo1MCBHTVQiLz4KKwkJPC93aWRnZXQ+CisJCTxwYWNraW5nPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJleHBhbmQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaG9tb2dlbmVvdXMiPlRydWU8L3Byb3BlcnR5PgorCQk8L3BhY2tpbmc+CisJICAgICAgPC9jaGlsZD4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrVG9vbEl0ZW0iIGlkPSJ0b29saXRlbTMiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV9ob3Jpem9udGFsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV92ZXJ0aWNhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImlzX2ltcG9ydGFudCI+RmFsc2U8L3Byb3BlcnR5PgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrVlNlcGFyYXRvciIgaWQ9InZzZXBhcmF0b3IzIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKwkJPC93aWRnZXQ+CisJCTxwYWNraW5nPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJleHBhbmQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaG9tb2dlbmVvdXMiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJPC9wYWNraW5nPgorCSAgICAgIDwvY2hpbGQ+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a1Rvb2xCdXR0b24iIGlkPSJidXR0b243Ij4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5Db2xsYXBzZSB0aGUgd2hvbGUgdHJlZSBpbiB0aGUgcmlnaHQgZnJhbWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkNvbGxhcHNlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InN0b2NrX2lkIj5ndGstcmVtb3ZlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV9ob3Jpem9udGFsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV92ZXJ0aWNhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImlzX2ltcG9ydGFudCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxzaWduYWwgbmFtZT0iY2xpY2tlZCIgaGFuZGxlcj0ib25fY29sbGFwc2VfY2xpY2tlZCIvPgorCQk8L3dpZGdldD4KKwkJPHBhY2tpbmc+CisJCSAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJob21vZ2VuZW91cyI+VHJ1ZTwvcHJvcGVydHk+CisJCTwvcGFja2luZz4KKwkgICAgICA8L2NoaWxkPgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJHdGtUb29sQnV0dG9uIiBpZD0iYnV0dG9uOCI+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+RXhwYW5kIHRoZSB3aG9sZSB0cmVlIGluIHRoZSByaWdodCBmcmFtZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+RXhwYW5kPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InN0b2NrX2lkIj5ndGstYWRkPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV9ob3Jpem9udGFsIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZV92ZXJ0aWNhbCI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImlzX2ltcG9ydGFudCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxzaWduYWwgbmFtZT0iY2xpY2tlZCIgaGFuZGxlcj0ib25fZXhwYW5kX2NsaWNrZWQiLz4KKwkJPC93aWRnZXQ+CisJCTxwYWNraW5nPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJleHBhbmQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaG9tb2dlbmVvdXMiPlRydWU8L3Byb3BlcnR5PgorCQk8L3BhY2tpbmc+CisJICAgICAgPC9jaGlsZD4KKwkgICAgPC93aWRnZXQ+CisJICA8L2NoaWxkPgorCTwvd2lkZ2V0PgorCTxwYWNraW5nPgorCSAgPHByb3BlcnR5IG5hbWU9InBhZGRpbmciPjA8L3Byb3BlcnR5PgorCSAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+RmFsc2U8L3Byb3BlcnR5PgorCSAgPHByb3BlcnR5IG5hbWU9ImZpbGwiPkZhbHNlPC9wcm9wZXJ0eT4KKwk8L3BhY2tpbmc+CisgICAgICA8L2NoaWxkPgorCisgICAgICA8Y2hpbGQ+CisJPHdpZGdldCBjbGFzcz0iR3RrSFBhbmVkIiBpZD0iaHBhbmVkMSI+CisJICA8cHJvcGVydHkgbmFtZT0id2lkdGhfcmVxdWVzdCI+MTwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0iY2FuX2ZvY3VzIj5UcnVlPC9wcm9wZXJ0eT4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJwb3NpdGlvbiI+MDwvcHJvcGVydHk+CisKKwkgIDxjaGlsZD4KKwkgICAgPHdpZGdldCBjbGFzcz0iR3RrU2Nyb2xsZWRXaW5kb3ciIGlkPSJzY3JvbGxlZHdpbmRvdzEiPgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0iaHNjcm9sbGJhcl9wb2xpY3kiPkdUS19QT0xJQ1lfQVVUT01BVElDPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idnNjcm9sbGJhcl9wb2xpY3kiPkdUS19QT0xJQ1lfQVVUT01BVElDPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0ic2hhZG93X3R5cGUiPkdUS19TSEFET1dfSU48L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ3aW5kb3dfcGxhY2VtZW50Ij5HVEtfQ09STkVSX1RPUF9MRUZUPC9wcm9wZXJ0eT4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrVHJlZVZpZXciIGlkPSJ0cmVldmlldzEiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iY2FuX2ZvY3VzIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyc192aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0icnVsZXNfaGludCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJyZW9yZGVyYWJsZSI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJlbmFibGVfc2VhcmNoIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8c2lnbmFsIG5hbWU9ImN1cnNvcl9jaGFuZ2VkIiBoYW5kbGVyPSJvbl90cmVldmlldzJfY3Vyc29yX2NoYW5nZWQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTU6NTg6MjIgR01UIi8+CisJCSAgPHNpZ25hbCBuYW1lPSJidXR0b25fcHJlc3NfZXZlbnQiIGhhbmRsZXI9Im9uX3RyZWV2aWV3MV9idXR0b25fcHJlc3NfZXZlbnQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTY6MDM6NTIgR01UIi8+CisJCSAgPHNpZ25hbCBuYW1lPSJrZXlfcHJlc3NfZXZlbnQiIGhhbmRsZXI9Im9uX3RyZWV2aWV3Ml9rZXlfcHJlc3NfZXZlbnQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTY6MTE6NDQgR01UIi8+CisJCTwvd2lkZ2V0PgorCSAgICAgIDwvY2hpbGQ+CisJICAgIDwvd2lkZ2V0PgorCSAgICA8cGFja2luZz4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0ic2hyaW5rIj5UcnVlPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0icmVzaXplIj5GYWxzZTwvcHJvcGVydHk+CisJICAgIDwvcGFja2luZz4KKwkgIDwvY2hpbGQ+CisKKwkgIDxjaGlsZD4KKwkgICAgPHdpZGdldCBjbGFzcz0iR3RrVlBhbmVkIiBpZD0idnBhbmVkMSI+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYW5fZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwb3NpdGlvbiI+MDwvcHJvcGVydHk+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a1Njcm9sbGVkV2luZG93IiBpZD0ic2Nyb2xsZWR3aW5kb3cyIj4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImhzY3JvbGxiYXJfcG9saWN5Ij5HVEtfUE9MSUNZX0FVVE9NQVRJQzwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZzY3JvbGxiYXJfcG9saWN5Ij5HVEtfUE9MSUNZX0FVVE9NQVRJQzwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InNoYWRvd190eXBlIj5HVEtfU0hBRE9XX0lOPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0id2luZG93X3BsYWNlbWVudCI+R1RLX0NPUk5FUl9UT1BfTEVGVDwvcHJvcGVydHk+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtUcmVlVmlldyIgaWQ9InRyZWV2aWV3MiI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImNhbl9mb2N1cyI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNfZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyc192aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InJ1bGVzX2hpbnQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InJlb3JkZXJhYmxlIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlbmFibGVfc2VhcmNoIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJjdXJzb3JfY2hhbmdlZCIgaGFuZGxlcj0ib25fdHJlZXZpZXcyX2N1cnNvcl9jaGFuZ2VkIiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJTdW4sIDEyIEphbiAyMDAzIDE1OjU3OjU1IEdNVCIvPgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImJ1dHRvbl9wcmVzc19ldmVudCIgaGFuZGxlcj0ib25fdHJlZXZpZXcyX2J1dHRvbl9wcmVzc19ldmVudCIgbGFzdF9tb2RpZmljYXRpb25fdGltZT0iU3VuLCAxMiBKYW4gMjAwMyAxNTo1Nzo1OCBHTVQiLz4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJrZXlfcHJlc3NfZXZlbnQiIGhhbmRsZXI9Im9uX3RyZWV2aWV3Ml9rZXlfcHJlc3NfZXZlbnQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTU6NTg6MDEgR01UIi8+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCQk8L3dpZGdldD4KKwkJPHBhY2tpbmc+CisJCSAgPHByb3BlcnR5IG5hbWU9InNocmluayI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InJlc2l6ZSI+RmFsc2U8L3Byb3BlcnR5PgorCQk8L3BhY2tpbmc+CisJICAgICAgPC9jaGlsZD4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrU2Nyb2xsZWRXaW5kb3ciIGlkPSJzY3JvbGxlZHdpbmRvdzMiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaHNjcm9sbGJhcl9wb2xpY3kiPkdUS19QT0xJQ1lfTkVWRVI8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2c2Nyb2xsYmFyX3BvbGljeSI+R1RLX1BPTElDWV9BVVRPTUFUSUM8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJzaGFkb3dfdHlwZSI+R1RLX1NIQURPV19JTjwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9IndpbmRvd19wbGFjZW1lbnQiPkdUS19DT1JORVJfVE9QX0xFRlQ8L3Byb3BlcnR5PgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrVGV4dFZpZXciIGlkPSJ0ZXh0dmlldzMiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYW5fZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0iZWRpdGFibGUiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9Im92ZXJ3cml0ZSI+RmFsc2U8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0iYWNjZXB0c190YWIiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0ianVzdGlmaWNhdGlvbiI+R1RLX0pVU1RJRllfTEVGVDwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ3cmFwX21vZGUiPkdUS19XUkFQX1dPUkQ8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0iY3Vyc29yX3Zpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0icGl4ZWxzX2Fib3ZlX2xpbmVzIj4wPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InBpeGVsc19iZWxvd19saW5lcyI+MDwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwaXhlbHNfaW5zaWRlX3dyYXAiPjA8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0ibGVmdF9tYXJnaW4iPjA8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0icmlnaHRfbWFyZ2luIj4wPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImluZGVudCI+MDwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0ZXh0IiB0cmFuc2xhdGFibGU9InllcyI+U29ycnksIG5vIGhlbHAgYXZhaWxhYmxlIGZvciB0aGlzIG9wdGlvbiB5ZXQuPC9wcm9wZXJ0eT4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisJCTwvd2lkZ2V0PgorCQk8cGFja2luZz4KKwkJICA8cHJvcGVydHkgbmFtZT0ic2hyaW5rIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0icmVzaXplIj5UcnVlPC9wcm9wZXJ0eT4KKwkJPC9wYWNraW5nPgorCSAgICAgIDwvY2hpbGQ+CisJICAgIDwvd2lkZ2V0PgorCSAgICA8cGFja2luZz4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0ic2hyaW5rIj5UcnVlPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0icmVzaXplIj5UcnVlPC9wcm9wZXJ0eT4KKwkgICAgPC9wYWNraW5nPgorCSAgPC9jaGlsZD4KKwk8L3dpZGdldD4KKwk8cGFja2luZz4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJwYWRkaW5nIj4wPC9wcm9wZXJ0eT4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJleHBhbmQiPlRydWU8L3Byb3BlcnR5PgorCSAgPHByb3BlcnR5IG5hbWU9ImZpbGwiPlRydWU8L3Byb3BlcnR5PgorCTwvcGFja2luZz4KKyAgICAgIDwvY2hpbGQ+CisgICAgPC93aWRnZXQ+CisgIDwvY2hpbGQ+Cis8L3dpZGdldD4KKworPC9nbGFkZS1pbnRlcmZhY2U+CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvaW1hZ2VzLmMgYi9zY3JpcHRzL2tjb25maWcvaW1hZ2VzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmODRiZAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9pbWFnZXMuYwpAQCAtMCwwICsxLDMyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fbG9hZFtdID0geworIjIyIDIyIDUgMSIsCisiLiBjIE5vbmUiLAorIiMgYyAjMDAwMDAwIiwKKyJjIGMgIzgzODEwMCIsCisiYSBjICNmZmZmMDAiLAorImIgYyAjZmZmZmZmIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4jIyMjLi4uLiMuIiwKKyIuLi4uLi4uLi4uLiMuLi4uIyMuIyMuIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4jIyMuIiwKKyIuLi4uLi4uLi4uLi4uLi4uLiMjIyMuIiwKKyIuIyMjIy4uLi4uLi4uLi4uIyMjIyMuIiwKKyIjYWJhYiMjIyMjIyMjIyMuLi4uLi4uIiwKKyIjYmFiYWJhYmFiYWJhYiMuLi4uLi4uIiwKKyIjYWJhYmFiYWJhYmFiYSMuLi4uLi4uIiwKKyIjYmFiYWJhYmFiYWJhYiMuLi4uLi4uIiwKKyIjYWJhYmFiIyMjIyMjIyMjIyMjIyMjIiwKKyIjYmFiYWIjI2NjY2NjY2NjY2NjYyMjIiwKKyIjYWJhYiMjY2NjY2NjY2NjY2NjIyMuIiwKKyIjYmFiIyNjY2NjY2NjY2NjY2MjIy4uIiwKKyIjYWIjI2NjY2NjY2NjY2NjYyMjLi4uIiwKKyIjYiMjY2NjY2NjY2NjY2NjIyMuLi4uIiwKKyIjIyNjY2NjY2NjY2NjY2MjIy4uLi4uIiwKKyIjI2NjY2NjY2NjY2NjYyMjLi4uLi4uIiwKKyIjIyMjIyMjIyMjIyMjIyMuLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fc2F2ZVtdID0geworIjIyIDIyIDUgMSIsCisiLiBjIE5vbmUiLAorIiMgYyAjMDAwMDAwIiwKKyJhIGMgIzgzODEwMCIsCisiYiBjICNjNWMyYzUiLAorImMgYyAjY2RiNmQ1IiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuIyMjIyMjIyMjIyMjIyMjIyMjIyMuIiwKKyIuI2FhI2JiYmJiYmJiYmJiYiNiYiMuIiwKKyIuI2FhI2JiYmJiYmJiYmJiYiNiYiMuIiwKKyIuI2FhI2JiYmJiYmJiYmNiYiMjIyMuIiwKKyIuI2FhI2JiYmNjYmJiYmJiYiNhYSMuIiwKKyIuI2FhI2JiYmNjYmJiYmJiYiNhYSMuIiwKKyIuI2FhI2JiYmJiYmJiYmJiYiNhYSMuIiwKKyIuI2FhI2JiYmJiYmJiYmJiYiNhYSMuIiwKKyIuI2FhI2JiYmJiYmJiYmJiYiNhYSMuIiwKKyIuI2FhI2JiYmJiYmJiYmJiYiNhYSMuIiwKKyIuI2FhYSMjIyMjIyMjIyMjI2FhYSMuIiwKKyIuI2FhYWFhYWFhYWFhYWFhYWFhYSMuIiwKKyIuI2FhYWFhYWFhYWFhYWFhYWFhYSMuIiwKKyIuI2FhYSMjIyMjIyMjIyMjIyNhYSMuIiwKKyIuI2FhYSMjIyMjIyMjI2JiYiNhYSMuIiwKKyIuI2FhYSMjIyMjIyMjI2JiYiNhYSMuIiwKKyIuI2FhYSMjIyMjIyMjI2JiYiNhYSMuIiwKKyIuI2FhYSMjIyMjIyMjI2JiYiNhYSMuIiwKKyIuI2FhYSMjIyMjIyMjI2JiYiNhYSMuIiwKKyIuLiMjIyMjIyMjIyMjIyMjIyMjIy4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fYmFja1tdID0geworIjIyIDIyIDMgMSIsCisiLiBjIE5vbmUiLAorIiMgYyAjMDAwMDgzIiwKKyJhIGMgIzgzODE4MyIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4jIyMjIyNhLi4uLiIsCisiLi4jLi4uLi4uIyMjIyMjIyMjIy4uLiIsCisiLi4jIy4uLiMjIyMuLi4uLi4jI2EuLiIsCisiLi4jIyMuIyMjLi4uLi4uLi4uIyMuLiIsCisiLi4jIyMjIyMuLi4uLi4uLi4uIyMuLiIsCisiLi4jIyMjIy4uLi4uLi4uLi4uIyMuLiIsCisiLi4jIyMjIyMuLi4uLi4uLi4uIyMuLiIsCisiLi4jIyMjIyMjLi4uLi4uLi4uIyMuLiIsCisiLi4jIyMjIyMjIy4uLi4uLi4jI2EuLiIsCisiLi4uLi4uLi4uLi4uLi4uYSMjIy4uLiIsCisiLi4uLi4uLi4uLi4uLi4uIyMjLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX3RyZWVfdmlld1tdID0geworIjIyIDIyIDIgMSIsCisiLiBjIE5vbmUiLAorIiMgYyAjMDAwMDAwIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4jIyMjIyMjIy4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4jIyMjIyMjIy4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4jLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4jIyMjIyMjIy4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIiwKKyIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fc2luZ2xlX3ZpZXdbXSA9IHsKKyIyMiAyMiAyIDEiLAorIi4gYyBOb25lIiwKKyIjIGMgIzAwMDAwMCIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLiMuLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLiMuLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLiMuLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLiMuLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLiMuLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLiMuLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLiMuLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLiMuLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLiMuLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLiMuLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLiMuLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLiMuLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLiMuLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLiMuLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLiMuLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLiMuLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLiMuLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLiMuLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX3NwbGl0X3ZpZXdbXSA9IHsKKyIyMiAyMiAyIDEiLAorIi4gYyBOb25lIiwKKyIjIGMgIzAwMDAwMCIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLiMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLiMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLiMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLiMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLiMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLiMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLiMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLiMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLiMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLiMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLiMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLiMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLiMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLiMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLiMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLiMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLiMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLiMuLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX3N5bWJvbF9ub1tdID0geworIjEyIDEyIDIgMSIsCisiICBjIHdoaXRlIiwKKyIuIGMgYmxhY2siLAorIiAgICAgICAgICAgICIsCisiIC4uLi4uLi4uLi4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4uLi4uLi4uLi4gIiwKKyIgICAgICAgICAgICAifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV9zeW1ib2xfbW9kW10gPSB7CisiMTIgMTIgMiAxIiwKKyIgIGMgd2hpdGUiLAorIi4gYyBibGFjayIsCisiICAgICAgICAgICAgIiwKKyIgLi4uLi4uLi4uLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgIC4uICAgLiAiLAorIiAuICAuLi4uICAuICIsCisiIC4gIC4uLi4gIC4gIiwKKyIgLiAgIC4uICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLi4uLi4uLi4uLiAiLAorIiAgICAgICAgICAgICJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX3N5bWJvbF95ZXNbXSA9IHsKKyIxMiAxMiAyIDEiLAorIiAgYyB3aGl0ZSIsCisiLiBjIGJsYWNrIiwKKyIgICAgICAgICAgICAiLAorIiAuLi4uLi4uLi4uICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgLiAuICIsCisiIC4gICAgIC4uIC4gIiwKKyIgLiAuICAuLiAgLiAiLAorIiAuIC4uLi4gICAuICIsCisiIC4gIC4uICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuLi4uLi4uLi4uICIsCisiICAgICAgICAgICAgIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fY2hvaWNlX25vW10gPSB7CisiMTIgMTIgMiAxIiwKKyIgIGMgd2hpdGUiLAorIi4gYyBibGFjayIsCisiICAgICAgICAgICAgIiwKKyIgICAgLi4uLiAgICAiLAorIiAgLi4gICAgLi4gICIsCisiICAuICAgICAgLiAgIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAgLiAgICAgIC4gICIsCisiICAuLiAgICAuLiAgIiwKKyIgICAgLi4uLiAgICAiLAorIiAgICAgICAgICAgICJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX2Nob2ljZV95ZXNbXSA9IHsKKyIxMiAxMiAyIDEiLAorIiAgYyB3aGl0ZSIsCisiLiBjIGJsYWNrIiwKKyIgICAgICAgICAgICAiLAorIiAgICAuLi4uICAgICIsCisiICAuLiAgICAuLiAgIiwKKyIgIC4gICAgICAuICAiLAorIiAuICAgLi4gICAuICIsCisiIC4gIC4uLi4gIC4gIiwKKyIgLiAgLi4uLiAgLiAiLAorIiAuICAgLi4gICAuICIsCisiICAuICAgICAgLiAgIiwKKyIgIC4uICAgIC4uICAiLAorIiAgICAuLi4uICAgICIsCisiICAgICAgICAgICAgIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fbWVudVtdID0geworIjEyIDEyIDIgMSIsCisiICBjIHdoaXRlIiwKKyIuIGMgYmxhY2siLAorIiAgICAgICAgICAgICIsCisiIC4uLi4uLi4uLi4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuIC4uICAgICAuICIsCisiIC4gLi4uLiAgIC4gIiwKKyIgLiAuLi4uLi4gLiAiLAorIiAuIC4uLi4uLiAuICIsCisiIC4gLi4uLiAgIC4gIiwKKyIgLiAuLiAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4uLi4uLi4uLi4gIiwKKyIgICAgICAgICAgICAifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV9tZW51X2ludltdID0geworIjEyIDEyIDIgMSIsCisiICBjIHdoaXRlIiwKKyIuIGMgYmxhY2siLAorIiAgICAgICAgICAgICIsCisiIC4uLi4uLi4uLi4gIiwKKyIgLi4uLi4uLi4uLiAiLAorIiAuLiAgLi4uLi4uICIsCisiIC4uICAgIC4uLi4gIiwKKyIgLi4gICAgICAuLiAiLAorIiAuLiAgICAgIC4uICIsCisiIC4uICAgIC4uLi4gIiwKKyIgLi4gIC4uLi4uLiAiLAorIiAuLi4uLi4uLi4uICIsCisiIC4uLi4uLi4uLi4gIiwKKyIgICAgICAgICAgICAifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV9tZW51YmFja1tdID0geworIjEyIDEyIDIgMSIsCisiICBjIHdoaXRlIiwKKyIuIGMgYmxhY2siLAorIiAgICAgICAgICAgICIsCisiIC4uLi4uLi4uLi4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAuLiAuICIsCisiIC4gICAuLi4uIC4gIiwKKyIgLiAuLi4uLi4gLiAiLAorIiAuIC4uLi4uLiAuICIsCisiIC4gICAuLi4uIC4gIiwKKyIgLiAgICAgLi4gLiAiLAorIiAuICAgICAgICAuICIsCisiIC4uLi4uLi4uLi4gIiwKKyIgICAgICAgICAgICAifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV92b2lkW10gPSB7CisiMTIgMTIgMiAxIiwKKyIgIGMgd2hpdGUiLAorIi4gYyBibGFjayIsCisiICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICIsCisiICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICIsCisiICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICIsCisiICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICJ9OwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2tjb25maWdfbG9hZC5jIGIvc2NyaXB0cy9rY29uZmlnL2tjb25maWdfbG9hZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlODdkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcva2NvbmZpZ19sb2FkLmMKQEAgLTAsMCArMSwzNSBAQAorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgImxrYy5oIgorCisjZGVmaW5lIFAobmFtZSx0eXBlLGFyZykJdHlwZSAoKm5hbWUgIyMgX3ApIGFyZworI2luY2x1ZGUgImxrY19wcm90by5oIgorI3VuZGVmIFAKKwordm9pZCBrY29uZmlnX2xvYWQodm9pZCkKK3sKKwl2b2lkICpoYW5kbGU7CisJY2hhciAqZXJyb3I7CisKKwloYW5kbGUgPSBkbG9wZW4oIi4vbGlia2NvbmZpZy5zbyIsIFJUTERfTEFaWSk7CisJaWYgKCFoYW5kbGUpIHsKKwkJaGFuZGxlID0gZGxvcGVuKCIuL3NjcmlwdHMva2NvbmZpZy9saWJrY29uZmlnLnNvIiwgUlRMRF9MQVpZKTsKKwkJaWYgKCFoYW5kbGUpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGRsZXJyb3IoKSk7CisJCQlleGl0KDEpOworCQl9CisJfQorCisjZGVmaW5lIFAobmFtZSx0eXBlLGFyZykJCQlcCit7CQkJCQkJXAorCW5hbWUgIyMgX3AgPSBkbHN5bShoYW5kbGUsICNuYW1lKTsJXAorCWlmICgoZXJyb3IgPSBkbGVycm9yKCkpKSAgewkJXAorCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBlcnJvcik7CVwKKwkJZXhpdCgxKTsJCQlcCisJfQkJCQkJXAorfQorI2luY2x1ZGUgImxrY19wcm90by5oIgorI3VuZGVmIFAKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9reGdldHRleHQuYyBiL3NjcmlwdHMva2NvbmZpZy9reGdldHRleHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmVlNTVjCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL2t4Z2V0dGV4dC5jCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+LCAyMDA1CisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCisjaW5jbHVkZSAibGtjLmgiCisKK3N0YXRpYyBjaGFyICplc2NhcGUoY29uc3QgY2hhciogdGV4dCwgY2hhciAqYmYsIGludCBsZW4pCit7CisJY2hhciAqYmZwID0gYmY7CisJaW50IG11bHRpbGluZSA9IHN0cmNocih0ZXh0LCAnXG4nKSAhPSBOVUxMOworCWludCBlb2wgPSAwOworCWludCB0ZXh0bGVuID0gc3RybGVuKHRleHQpOworCisJaWYgKCh0ZXh0bGVuID4gMCkgJiYgKHRleHRbdGV4dGxlbi0xXSA9PSAnXG4nKSkKKwkJZW9sID0gMTsKKworCSpiZnArKyA9ICciJzsKKwktLWxlbjsKKworCWlmIChtdWx0aWxpbmUpIHsKKwkJKmJmcCsrID0gJyInOworCQkqYmZwKysgPSAnXG4nOworCQkqYmZwKysgPSAnIic7CisJCWxlbiAtPSAzOworCX0KKworCXdoaWxlICgqdGV4dCAhPSAnXDAnICYmIGxlbiA+IDEpIHsKKwkJaWYgKCp0ZXh0ID09ICciJykKKwkJCSpiZnArKyA9ICdcXCc7CisJCWVsc2UgaWYgKCp0ZXh0ID09ICdcbicpIHsKKwkJCSpiZnArKyA9ICdcXCc7CisJCQkqYmZwKysgPSAnbic7CisJCQkqYmZwKysgPSAnIic7CisJCQkqYmZwKysgPSAnXG4nOworCQkJKmJmcCsrID0gJyInOworCQkJbGVuIC09IDU7CisJCQkrK3RleHQ7CisJCQlnb3RvIG5leHQ7CisJCX0KKwkJKmJmcCsrID0gKnRleHQrKzsKK25leHQ6CisJCS0tbGVuOworCX0KKworCWlmIChtdWx0aWxpbmUgJiYgZW9sKQorCQliZnAgLT0gMzsKKworCSpiZnArKyA9ICciJzsKKwkqYmZwID0gJ1wwJzsKKworCXJldHVybiBiZjsKK30KKworc3RydWN0IGZpbGVfbGluZSB7CisJc3RydWN0IGZpbGVfbGluZSAqbmV4dDsKKwljaGFyKgkJIGZpbGU7CisJaW50CQkgbGluZW5vOworfTsKKworc3RhdGljIHN0cnVjdCBmaWxlX2xpbmUgKmZpbGVfbGluZV9fbmV3KGNoYXIgKmZpbGUsIGludCBsaW5lbm8pCit7CisJc3RydWN0IGZpbGVfbGluZSAqc2VsZiA9IG1hbGxvYyhzaXplb2YoKnNlbGYpKTsKKworCWlmIChzZWxmID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJc2VsZi0+ZmlsZSAgID0gZmlsZTsKKwlzZWxmLT5saW5lbm8gPSBsaW5lbm87CisJc2VsZi0+bmV4dCAgID0gTlVMTDsKK291dDoKKwlyZXR1cm4gc2VsZjsKK30KKworc3RydWN0IG1lc3NhZ2UgeworCWNvbnN0IGNoYXIJICptc2c7CisJY29uc3QgY2hhcgkgKm9wdGlvbjsKKwlzdHJ1Y3QgbWVzc2FnZQkgKm5leHQ7CisJc3RydWN0IGZpbGVfbGluZSAqZmlsZXM7Cit9OworCitzdGF0aWMgc3RydWN0IG1lc3NhZ2UgKm1lc3NhZ2VfX2xpc3Q7CisKK3N0YXRpYyBzdHJ1Y3QgbWVzc2FnZSAqbWVzc2FnZV9fbmV3KGNvbnN0IGNoYXIgKm1zZywgY2hhciAqb3B0aW9uLCBjaGFyICpmaWxlLCBpbnQgbGluZW5vKQoreworCXN0cnVjdCBtZXNzYWdlICpzZWxmID0gbWFsbG9jKHNpemVvZigqc2VsZikpOworCisJaWYgKHNlbGYgPT0gTlVMTCkKKwkJZ290byBvdXQ7CisKKwlzZWxmLT5maWxlcyA9IGZpbGVfbGluZV9fbmV3KGZpbGUsIGxpbmVubyk7CisJaWYgKHNlbGYtPmZpbGVzID09IE5VTEwpCisJCWdvdG8gb3V0X2ZhaWw7CisKKwlzZWxmLT5tc2cgPSBzdHJkdXAobXNnKTsKKwlpZiAoc2VsZi0+bXNnID09IE5VTEwpCisJCWdvdG8gb3V0X2ZhaWxfbXNnOworCisJc2VsZi0+b3B0aW9uID0gb3B0aW9uOworCXNlbGYtPm5leHQgPSBOVUxMOworb3V0OgorCXJldHVybiBzZWxmOworb3V0X2ZhaWxfbXNnOgorCWZyZWUoc2VsZi0+ZmlsZXMpOworb3V0X2ZhaWw6CisJZnJlZShzZWxmKTsKKwlzZWxmID0gTlVMTDsKKwlnb3RvIG91dDsKK30KKworc3RhdGljIHN0cnVjdCBtZXNzYWdlICptZXNhZ2VfX2ZpbmQoY29uc3QgY2hhciAqbXNnKQoreworCXN0cnVjdCBtZXNzYWdlICptID0gbWVzc2FnZV9fbGlzdDsKKworCXdoaWxlIChtICE9IE5VTEwpIHsKKwkJaWYgKHN0cmNtcChtLT5tc2csIG1zZykgPT0gMCkKKwkJCWJyZWFrOworCQltID0gbS0+bmV4dDsKKwl9CisKKwlyZXR1cm4gbTsKK30KKworc3RhdGljIGludCBtZXNzYWdlX19hZGRfZmlsZV9saW5lKHN0cnVjdCBtZXNzYWdlICpzZWxmLCBjaGFyICpmaWxlLCBpbnQgbGluZW5vKQoreworCWludCByYyA9IC0xOworCXN0cnVjdCBmaWxlX2xpbmUgKmZsID0gZmlsZV9saW5lX19uZXcoZmlsZSwgbGluZW5vKTsKKworCWlmIChmbCA9PSBOVUxMKQorCQlnb3RvIG91dDsKKworCWZsLT5uZXh0ICAgID0gc2VsZi0+ZmlsZXM7CisJc2VsZi0+ZmlsZXMgPSBmbDsKKwlyYyA9IDA7CitvdXQ6CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IG1lc3NhZ2VfX2FkZChjb25zdCBjaGFyICptc2csIGNoYXIgKm9wdGlvbiwgY2hhciAqZmlsZSwgaW50IGxpbmVubykKK3sKKwlpbnQgcmMgPSAwOworCWNoYXIgYmZbMTYzODRdOworCWNoYXIgKmVzY2FwZWQgPSBlc2NhcGUobXNnLCBiZiwgc2l6ZW9mKGJmKSk7CisJc3RydWN0IG1lc3NhZ2UgKm0gPSBtZXNhZ2VfX2ZpbmQoZXNjYXBlZCk7CisKKwlpZiAobSAhPSBOVUxMKQorCQlyYyA9IG1lc3NhZ2VfX2FkZF9maWxlX2xpbmUobSwgZmlsZSwgbGluZW5vKTsKKwllbHNlIHsKKwkJbSA9IG1lc3NhZ2VfX25ldyhlc2NhcGVkLCBvcHRpb24sIGZpbGUsIGxpbmVubyk7CisKKwkJaWYgKG0gIT0gTlVMTCkgeworCQkJbS0+bmV4dAkgICAgICA9IG1lc3NhZ2VfX2xpc3Q7CisJCQltZXNzYWdlX19saXN0ID0gbTsKKwkJfSBlbHNlCisJCQlyYyA9IC0xOworCX0KKwlyZXR1cm4gcmM7Cit9CisKK3ZvaWQgbWVudV9idWlsZF9tZXNzYWdlX2xpc3Qoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IG1lbnUgKmNoaWxkOworCisJbWVzc2FnZV9fYWRkKG1lbnVfZ2V0X3Byb21wdChtZW51KSwgTlVMTCwKKwkJICAgICBtZW51LT5maWxlID09IE5VTEwgPyAiUm9vdCBNZW51IiA6IG1lbnUtPmZpbGUtPm5hbWUsCisJCSAgICAgbWVudS0+bGluZW5vKTsKKworCWlmIChtZW51LT5zeW0gIT0gTlVMTCAmJiBtZW51LT5zeW0tPmhlbHAgIT0gTlVMTCkKKwkJbWVzc2FnZV9fYWRkKG1lbnUtPnN5bS0+aGVscCwgbWVudS0+c3ltLT5uYW1lLAorCQkJICAgICBtZW51LT5maWxlID09IE5VTEwgPyAiUm9vdCBNZW51IiA6IG1lbnUtPmZpbGUtPm5hbWUsCisJCQkgICAgIG1lbnUtPmxpbmVubyk7CisKKwlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkKKwkJaWYgKGNoaWxkLT5wcm9tcHQgIT0gTlVMTCkKKwkJCW1lbnVfYnVpbGRfbWVzc2FnZV9saXN0KGNoaWxkKTsKK30KKworc3RhdGljIHZvaWQgbWVzc2FnZV9fcHJpbnRfZmlsZV9saW5lbm8oc3RydWN0IG1lc3NhZ2UgKnNlbGYpCit7CisJc3RydWN0IGZpbGVfbGluZSAqZmwgPSBzZWxmLT5maWxlczsKKworCXB1dGNoYXIoJ1xuJyk7CisJaWYgKHNlbGYtPm9wdGlvbiAhPSBOVUxMKQorCQlwcmludGYoIiMgJXM6MDAwMDBcbiIsIHNlbGYtPm9wdGlvbik7CisKKwlwcmludGYoIiM6ICVzOiVkIiwgZmwtPmZpbGUsIGZsLT5saW5lbm8pOworCWZsID0gZmwtPm5leHQ7CisKKwl3aGlsZSAoZmwgIT0gTlVMTCkgeworCQlwcmludGYoIiwgJXM6JWQiLCBmbC0+ZmlsZSwgZmwtPmxpbmVubyk7CisJCWZsID0gZmwtPm5leHQ7CisJfQorCisJcHV0Y2hhcignXG4nKTsKK30KKworc3RhdGljIHZvaWQgbWVzc2FnZV9fcHJpbnRfZ2V0dGV4dF9tc2dpZF9tc2dzdHIoc3RydWN0IG1lc3NhZ2UgKnNlbGYpCit7CisJbWVzc2FnZV9fcHJpbnRfZmlsZV9saW5lbm8oc2VsZik7CisKKwlwcmludGYoIm1zZ2lkICVzXG4iCisJICAgICAgICJtc2dzdHIgXCJcIlxuIiwgc2VsZi0+bXNnKTsKK30KKwordm9pZCBtZW51X194Z2V0dGV4dCh2b2lkKQoreworCXN0cnVjdCBtZXNzYWdlICptID0gbWVzc2FnZV9fbGlzdDsKKworCXdoaWxlIChtICE9IE5VTEwpIHsKKwkJbWVzc2FnZV9fcHJpbnRfZ2V0dGV4dF9tc2dpZF9tc2dzdHIobSk7CisJCW0gPSBtLT5uZXh0OworCX0KK30KKworaW50IG1haW4oaW50IGFjLCBjaGFyICoqYXYpCit7CisJY29uZl9wYXJzZShhdlsxXSk7CisKKwltZW51X2J1aWxkX21lc3NhZ2VfbGlzdChtZW51X2dldF9yb290X21lbnUoTlVMTCkpOworCW1lbnVfX3hnZXR0ZXh0KCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbGV4Lnpjb25mLmNfc2hpcHBlZCBiL3NjcmlwdHMva2NvbmZpZy9sZXguemNvbmYuY19zaGlwcGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZjE1ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvbGV4Lnpjb25mLmNfc2hpcHBlZApAQCAtMCwwICsxLDIzMjUgQEAKKworI2xpbmUgMyAic2NyaXB0cy9rY29uZmlnL2xleC56Y29uZi5jIgorCisjZGVmaW5lICBZWV9JTlRfQUxJR05FRCBzaG9ydCBpbnQKKworLyogQSBsZXhpY2FsIHNjYW5uZXIgZ2VuZXJhdGVkIGJ5IGZsZXggKi8KKworI2RlZmluZSBGTEVYX1NDQU5ORVIKKyNkZWZpbmUgWVlfRkxFWF9NQUpPUl9WRVJTSU9OIDIKKyNkZWZpbmUgWVlfRkxFWF9NSU5PUl9WRVJTSU9OIDUKKyNkZWZpbmUgWVlfRkxFWF9TVUJNSU5PUl9WRVJTSU9OIDMxCisjaWYgWVlfRkxFWF9TVUJNSU5PUl9WRVJTSU9OID4gMAorI2RlZmluZSBGTEVYX0JFVEEKKyNlbmRpZgorCisvKiBGaXJzdCwgd2UgZGVhbCB3aXRoICBwbGF0Zm9ybS1zcGVjaWZpYyBvciBjb21waWxlci1zcGVjaWZpYyBpc3N1ZXMuICovCisKKy8qIGJlZ2luIHN0YW5kYXJkIEMgaGVhZGVycy4gKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKy8qIGVuZCBzdGFuZGFyZCBDIGhlYWRlcnMuICovCisKKy8qIGZsZXggaW50ZWdlciB0eXBlIGRlZmluaXRpb25zICovCisKKyNpZm5kZWYgRkxFWElOVF9ICisjZGVmaW5lIEZMRVhJTlRfSAorCisvKiBDOTkgc3lzdGVtcyBoYXZlIDxpbnR0eXBlcy5oPi4gTm9uLUM5OSBzeXN0ZW1zIG1heSBvciBtYXkgbm90LiAqLworCisjaWYgZGVmaW5lZCBfX1NURENfVkVSU0lPTl9fICYmIF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTAorI2luY2x1ZGUgPGludHR5cGVzLmg+Cit0eXBlZGVmIGludDhfdCBmbGV4X2ludDhfdDsKK3R5cGVkZWYgdWludDhfdCBmbGV4X3VpbnQ4X3Q7Cit0eXBlZGVmIGludDE2X3QgZmxleF9pbnQxNl90OwordHlwZWRlZiB1aW50MTZfdCBmbGV4X3VpbnQxNl90OwordHlwZWRlZiBpbnQzMl90IGZsZXhfaW50MzJfdDsKK3R5cGVkZWYgdWludDMyX3QgZmxleF91aW50MzJfdDsKKyNlbHNlCit0eXBlZGVmIHNpZ25lZCBjaGFyIGZsZXhfaW50OF90OwordHlwZWRlZiBzaG9ydCBpbnQgZmxleF9pbnQxNl90OwordHlwZWRlZiBpbnQgZmxleF9pbnQzMl90OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIGZsZXhfdWludDhfdDsKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IGZsZXhfdWludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBmbGV4X3VpbnQzMl90OworI2VuZGlmIC8qICEgQzk5ICovCisKKy8qIExpbWl0cyBvZiBpbnRlZ3JhbCB0eXBlcy4gKi8KKyNpZm5kZWYgSU5UOF9NSU4KKyNkZWZpbmUgSU5UOF9NSU4gICAgICAgICAgICAgICAoLTEyOCkKKyNlbmRpZgorI2lmbmRlZiBJTlQxNl9NSU4KKyNkZWZpbmUgSU5UMTZfTUlOICAgICAgICAgICAgICAoLTMyNzY3LTEpCisjZW5kaWYKKyNpZm5kZWYgSU5UMzJfTUlOCisjZGVmaW5lIElOVDMyX01JTiAgICAgICAgICAgICAgKC0yMTQ3NDgzNjQ3LTEpCisjZW5kaWYKKyNpZm5kZWYgSU5UOF9NQVgKKyNkZWZpbmUgSU5UOF9NQVggICAgICAgICAgICAgICAoMTI3KQorI2VuZGlmCisjaWZuZGVmIElOVDE2X01BWAorI2RlZmluZSBJTlQxNl9NQVggICAgICAgICAgICAgICgzMjc2NykKKyNlbmRpZgorI2lmbmRlZiBJTlQzMl9NQVgKKyNkZWZpbmUgSU5UMzJfTUFYICAgICAgICAgICAgICAoMjE0NzQ4MzY0NykKKyNlbmRpZgorI2lmbmRlZiBVSU5UOF9NQVgKKyNkZWZpbmUgVUlOVDhfTUFYICAgICAgICAgICAgICAoMjU1VSkKKyNlbmRpZgorI2lmbmRlZiBVSU5UMTZfTUFYCisjZGVmaW5lIFVJTlQxNl9NQVggICAgICAgICAgICAgKDY1NTM1VSkKKyNlbmRpZgorI2lmbmRlZiBVSU5UMzJfTUFYCisjZGVmaW5lIFVJTlQzMl9NQVggICAgICAgICAgICAgKDQyOTQ5NjcyOTVVKQorI2VuZGlmCisKKyNlbmRpZiAvKiAhIEZMRVhJTlRfSCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKKworLyogVGhlICJjb25zdCIgc3RvcmFnZS1jbGFzcy1tb2RpZmllciBpcyB2YWxpZC4gKi8KKyNkZWZpbmUgWVlfVVNFX0NPTlNUCisKKyNlbHNlCS8qICEgX19jcGx1c3BsdXMgKi8KKworI2lmIF9fU1REQ19fCisKKyNkZWZpbmUgWVlfVVNFX0NPTlNUCisKKyNlbmRpZgkvKiBfX1NURENfXyAqLworI2VuZGlmCS8qICEgX19jcGx1c3BsdXMgKi8KKworI2lmZGVmIFlZX1VTRV9DT05TVAorI2RlZmluZSB5eWNvbnN0IGNvbnN0CisjZWxzZQorI2RlZmluZSB5eWNvbnN0CisjZW5kaWYKKworLyogUmV0dXJuZWQgdXBvbiBlbmQtb2YtZmlsZS4gKi8KKyNkZWZpbmUgWVlfTlVMTCAwCisKKy8qIFByb21vdGVzIGEgcG9zc2libHkgbmVnYXRpdmUsIHBvc3NpYmx5IHNpZ25lZCBjaGFyIHRvIGFuIHVuc2lnbmVkCisgKiBpbnRlZ2VyIGZvciB1c2UgYXMgYW4gYXJyYXkgaW5kZXguICBJZiB0aGUgc2lnbmVkIGNoYXIgaXMgbmVnYXRpdmUsCisgKiB3ZSB3YW50IHRvIGluc3RlYWQgdHJlYXQgaXQgYXMgYW4gOC1iaXQgdW5zaWduZWQgY2hhciwgaGVuY2UgdGhlCisgKiBkb3VibGUgY2FzdC4KKyAqLworI2RlZmluZSBZWV9TQ19UT19VSShjKSAoKHVuc2lnbmVkIGludCkgKHVuc2lnbmVkIGNoYXIpIGMpCisKKy8qIEVudGVyIGEgc3RhcnQgY29uZGl0aW9uLiAgVGhpcyBtYWNybyByZWFsbHkgb3VnaHQgdG8gdGFrZSBhIHBhcmFtZXRlciwKKyAqIGJ1dCB3ZSBkbyBpdCB0aGUgZGlzZ3VzdGluZyBjcnVmdHkgd2F5IGZvcmNlZCBvbiB1cyBieSB0aGUgKCktbGVzcworICogZGVmaW5pdGlvbiBvZiBCRUdJTi4KKyAqLworI2RlZmluZSBCRUdJTiAoeXlfc3RhcnQpID0gMSArIDIgKgorCisvKiBUcmFuc2xhdGUgdGhlIGN1cnJlbnQgc3RhcnQgc3RhdGUgaW50byBhIHZhbHVlIHRoYXQgY2FuIGJlIGxhdGVyIGhhbmRlZAorICogdG8gQkVHSU4gdG8gcmV0dXJuIHRvIHRoZSBzdGF0ZS4gIFRoZSBZWVNUQVRFIGFsaWFzIGlzIGZvciBsZXgKKyAqIGNvbXBhdGliaWxpdHkuCisgKi8KKyNkZWZpbmUgWVlfU1RBUlQgKCgoeXlfc3RhcnQpIC0gMSkgLyAyKQorI2RlZmluZSBZWVNUQVRFIFlZX1NUQVJUCisKKy8qIEFjdGlvbiBudW1iZXIgZm9yIEVPRiBydWxlIG9mIGEgZ2l2ZW4gc3RhcnQgc3RhdGUuICovCisjZGVmaW5lIFlZX1NUQVRFX0VPRihzdGF0ZSkgKFlZX0VORF9PRl9CVUZGRVIgKyBzdGF0ZSArIDEpCisKKy8qIFNwZWNpYWwgYWN0aW9uIG1lYW5pbmcgInN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgZmlsZSIuICovCisjZGVmaW5lIFlZX05FV19GSUxFIHpjb25mcmVzdGFydCh6Y29uZmluICApCisKKyNkZWZpbmUgWVlfRU5EX09GX0JVRkZFUl9DSEFSIDAKKworLyogU2l6ZSBvZiBkZWZhdWx0IGlucHV0IGJ1ZmZlci4gKi8KKyNpZm5kZWYgWVlfQlVGX1NJWkUKKyNkZWZpbmUgWVlfQlVGX1NJWkUgMTYzODQKKyNlbmRpZgorCisjaWZuZGVmIFlZX1RZUEVERUZfWVlfQlVGRkVSX1NUQVRFCisjZGVmaW5lIFlZX1RZUEVERUZfWVlfQlVGRkVSX1NUQVRFCit0eXBlZGVmIHN0cnVjdCB5eV9idWZmZXJfc3RhdGUgKllZX0JVRkZFUl9TVEFURTsKKyNlbmRpZgorCitleHRlcm4gaW50IHpjb25mbGVuZzsKKworZXh0ZXJuIEZJTEUgKnpjb25maW4sICp6Y29uZm91dDsKKworI2RlZmluZSBFT0JfQUNUX0NPTlRJTlVFX1NDQU4gMAorI2RlZmluZSBFT0JfQUNUX0VORF9PRl9GSUxFIDEKKyNkZWZpbmUgRU9CX0FDVF9MQVNUX01BVENIIDIKKworICAgICNkZWZpbmUgWVlfTEVTU19MSU5FTk8obikKKworLyogUmV0dXJuIGFsbCBidXQgdGhlIGZpcnN0ICJuIiBtYXRjaGVkIGNoYXJhY3RlcnMgYmFjayB0byB0aGUgaW5wdXQgc3RyZWFtLiAqLworI2RlZmluZSB5eWxlc3MobikgXAorCWRvIFwKKwkJeyBcCisJCS8qIFVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHpjb25mdGV4dC4gKi8gXAorICAgICAgICBpbnQgeXlsZXNzX21hY3JvX2FyZyA9IChuKTsgXAorICAgICAgICBZWV9MRVNTX0xJTkVOTyh5eWxlc3NfbWFjcm9fYXJnKTtcCisJCSp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOyBcCisJCVlZX1JFU1RPUkVfWVlfTU9SRV9PRkZTRVQgXAorCQkoeXlfY19idWZfcCkgPSB5eV9jcCA9IHl5X2JwICsgeXlsZXNzX21hY3JvX2FyZyAtIFlZX01PUkVfQURKOyBcCisJCVlZX0RPX0JFRk9SRV9BQ1RJT047IC8qIHNldCB1cCB6Y29uZnRleHQgYWdhaW4gKi8gXAorCQl9IFwKKwl3aGlsZSAoIDAgKQorCisjZGVmaW5lIHVucHV0KGMpIHl5dW5wdXQoIGMsICh5eXRleHRfcHRyKSAgKQorCisvKiBUaGUgZm9sbG93aW5nIGlzIGJlY2F1c2Ugd2UgY2Fubm90IHBvcnRhYmx5IGdldCBvdXIgaGFuZHMgb24gc2l6ZV90CisgKiAod2l0aG91dCBhdXRvY29uZidzIGhlbHAsIHdoaWNoIGlzbid0IGF2YWlsYWJsZSBiZWNhdXNlIHdlIHdhbnQKKyAqIGZsZXgtZ2VuZXJhdGVkIHNjYW5uZXJzIHRvIGNvbXBpbGUgb24gdGhlaXIgb3duKS4KKyAqLworCisjaWZuZGVmIFlZX1RZUEVERUZfWVlfU0laRV9UCisjZGVmaW5lIFlZX1RZUEVERUZfWVlfU0laRV9UCit0eXBlZGVmIHVuc2lnbmVkIGludCB5eV9zaXplX3Q7CisjZW5kaWYKKworI2lmbmRlZiBZWV9TVFJVQ1RfWVlfQlVGRkVSX1NUQVRFCisjZGVmaW5lIFlZX1NUUlVDVF9ZWV9CVUZGRVJfU1RBVEUKK3N0cnVjdCB5eV9idWZmZXJfc3RhdGUKKwl7CisJRklMRSAqeXlfaW5wdXRfZmlsZTsKKworCWNoYXIgKnl5X2NoX2J1ZjsJCS8qIGlucHV0IGJ1ZmZlciAqLworCWNoYXIgKnl5X2J1Zl9wb3M7CQkvKiBjdXJyZW50IHBvc2l0aW9uIGluIGlucHV0IGJ1ZmZlciAqLworCisJLyogU2l6ZSBvZiBpbnB1dCBidWZmZXIgaW4gYnl0ZXMsIG5vdCBpbmNsdWRpbmcgcm9vbSBmb3IgRU9CCisJICogY2hhcmFjdGVycy4KKwkgKi8KKwl5eV9zaXplX3QgeXlfYnVmX3NpemU7CisKKwkvKiBOdW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIGludG8geXlfY2hfYnVmLCBub3QgaW5jbHVkaW5nIEVPQgorCSAqIGNoYXJhY3RlcnMuCisJICovCisJaW50IHl5X25fY2hhcnM7CisKKwkvKiBXaGV0aGVyIHdlICJvd24iIHRoZSBidWZmZXIgLSBpLmUuLCB3ZSBrbm93IHdlIGNyZWF0ZWQgaXQsCisJICogYW5kIGNhbiByZWFsbG9jKCkgaXQgdG8gZ3JvdyBpdCwgYW5kIHNob3VsZCBmcmVlKCkgaXQgdG8KKwkgKiBkZWxldGUgaXQuCisJICovCisJaW50IHl5X2lzX291cl9idWZmZXI7CisKKwkvKiBXaGV0aGVyIHRoaXMgaXMgYW4gImludGVyYWN0aXZlIiBpbnB1dCBzb3VyY2U7IGlmIHNvLCBhbmQKKwkgKiBpZiB3ZSdyZSB1c2luZyBzdGRpbyBmb3IgaW5wdXQsIHRoZW4gd2Ugd2FudCB0byB1c2UgZ2V0YygpCisJICogaW5zdGVhZCBvZiBmcmVhZCgpLCB0byBtYWtlIHN1cmUgd2Ugc3RvcCBmZXRjaGluZyBpbnB1dCBhZnRlcgorCSAqIGVhY2ggbmV3bGluZS4KKwkgKi8KKwlpbnQgeXlfaXNfaW50ZXJhY3RpdmU7CisKKwkvKiBXaGV0aGVyIHdlJ3JlIGNvbnNpZGVyZWQgdG8gYmUgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUuCisJICogSWYgc28sICdeJyBydWxlcyB3aWxsIGJlIGFjdGl2ZSBvbiB0aGUgbmV4dCBtYXRjaCwgb3RoZXJ3aXNlCisJICogbm90LgorCSAqLworCWludCB5eV9hdF9ib2w7CisKKyAgICBpbnQgeXlfYnNfbGluZW5vOyAvKio8IFRoZSBsaW5lIGNvdW50LiAqLworICAgIGludCB5eV9ic19jb2x1bW47IC8qKjwgVGhlIGNvbHVtbiBjb3VudC4gKi8KKworCS8qIFdoZXRoZXIgdG8gdHJ5IHRvIGZpbGwgdGhlIGlucHV0IGJ1ZmZlciB3aGVuIHdlIHJlYWNoIHRoZQorCSAqIGVuZCBvZiBpdC4KKwkgKi8KKwlpbnQgeXlfZmlsbF9idWZmZXI7CisKKwlpbnQgeXlfYnVmZmVyX3N0YXR1czsKKworI2RlZmluZSBZWV9CVUZGRVJfTkVXIDAKKyNkZWZpbmUgWVlfQlVGRkVSX05PUk1BTCAxCisJLyogV2hlbiBhbiBFT0YncyBiZWVuIHNlZW4gYnV0IHRoZXJlJ3Mgc3RpbGwgc29tZSB0ZXh0IHRvIHByb2Nlc3MKKwkgKiB0aGVuIHdlIG1hcmsgdGhlIGJ1ZmZlciBhcyBZWV9FT0ZfUEVORElORywgdG8gaW5kaWNhdGUgdGhhdCB3ZQorCSAqIHNob3VsZG4ndCB0cnkgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzb3VyY2UgYW55IG1vcmUuICBXZSBtaWdodAorCSAqIHN0aWxsIGhhdmUgYSBidW5jaCBvZiB0b2tlbnMgdG8gbWF0Y2gsIHRob3VnaCwgYmVjYXVzZSBvZgorCSAqIHBvc3NpYmxlIGJhY2tpbmctdXAuCisJICoKKwkgKiBXaGVuIHdlIGFjdHVhbGx5IHNlZSB0aGUgRU9GLCB3ZSBjaGFuZ2UgdGhlIHN0YXR1cyB0byAibmV3IgorCSAqICh2aWEgemNvbmZyZXN0YXJ0KCkpLCBzbyB0aGF0IHRoZSB1c2VyIGNhbiBjb250aW51ZSBzY2FubmluZyBieQorCSAqIGp1c3QgcG9pbnRpbmcgemNvbmZpbiBhdCBhIG5ldyBpbnB1dCBmaWxlLgorCSAqLworI2RlZmluZSBZWV9CVUZGRVJfRU9GX1BFTkRJTkcgMgorCisJfTsKKyNlbmRpZiAvKiAhWVlfU1RSVUNUX1lZX0JVRkZFUl9TVEFURSAqLworCisvKiBTdGFjayBvZiBpbnB1dCBidWZmZXJzLiAqLworc3RhdGljIHNpemVfdCB5eV9idWZmZXJfc3RhY2tfdG9wID0gMDsgLyoqPCBpbmRleCBvZiB0b3Agb2Ygc3RhY2suICovCitzdGF0aWMgc2l6ZV90IHl5X2J1ZmZlcl9zdGFja19tYXggPSAwOyAvKio8IGNhcGFjaXR5IG9mIHN0YWNrLiAqLworc3RhdGljIFlZX0JVRkZFUl9TVEFURSAqIHl5X2J1ZmZlcl9zdGFjayA9IDA7IC8qKjwgU3RhY2sgYXMgYW4gYXJyYXkuICovCisKKy8qIFdlIHByb3ZpZGUgbWFjcm9zIGZvciBhY2Nlc3NpbmcgYnVmZmVyIHN0YXRlcyBpbiBjYXNlIGluIHRoZQorICogZnV0dXJlIHdlIHdhbnQgdG8gcHV0IHRoZSBidWZmZXIgc3RhdGVzIGluIGEgbW9yZSBnZW5lcmFsCisgKiAic2Nhbm5lciBzdGF0ZSIuCisgKgorICogUmV0dXJucyB0aGUgdG9wIG9mIHRoZSBzdGFjaywgb3IgTlVMTC4KKyAqLworI2RlZmluZSBZWV9DVVJSRU5UX0JVRkZFUiAoICh5eV9idWZmZXJfc3RhY2spIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoeXlfYnVmZmVyX3N0YWNrKVsoeXlfYnVmZmVyX3N0YWNrX3RvcCldIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMKQorCisvKiBTYW1lIGFzIHByZXZpb3VzIG1hY3JvLCBidXQgdXNlZnVsIHdoZW4gd2Uga25vdyB0aGF0IHRoZSBidWZmZXIgc3RhY2sgaXMgbm90CisgKiBOVUxMIG9yIHdoZW4gd2UgbmVlZCBhbiBsdmFsdWUuIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KKyAqLworI2RlZmluZSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgKHl5X2J1ZmZlcl9zdGFjaylbKHl5X2J1ZmZlcl9zdGFja190b3ApXQorCisvKiB5eV9ob2xkX2NoYXIgaG9sZHMgdGhlIGNoYXJhY3RlciBsb3N0IHdoZW4gemNvbmZ0ZXh0IGlzIGZvcm1lZC4gKi8KK3N0YXRpYyBjaGFyIHl5X2hvbGRfY2hhcjsKK3N0YXRpYyBpbnQgeXlfbl9jaGFyczsJCS8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQgaW50byB5eV9jaF9idWYgKi8KK2ludCB6Y29uZmxlbmc7CisKKy8qIFBvaW50cyB0byBjdXJyZW50IGNoYXJhY3RlciBpbiBidWZmZXIuICovCitzdGF0aWMgY2hhciAqeXlfY19idWZfcCA9IChjaGFyICopIDA7CitzdGF0aWMgaW50IHl5X2luaXQgPSAxOwkJLyogd2hldGhlciB3ZSBuZWVkIHRvIGluaXRpYWxpemUgKi8KK3N0YXRpYyBpbnQgeXlfc3RhcnQgPSAwOwkvKiBzdGFydCBzdGF0ZSBudW1iZXIgKi8KKworLyogRmxhZyB3aGljaCBpcyB1c2VkIHRvIGFsbG93IHpjb25md3JhcCgpJ3MgdG8gZG8gYnVmZmVyIHN3aXRjaGVzCisgKiBpbnN0ZWFkIG9mIHNldHRpbmcgdXAgYSBmcmVzaCB6Y29uZmluLiAgQSBiaXQgb2YgYSBoYWNrIC4uLgorICovCitzdGF0aWMgaW50IHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZjsKKwordm9pZCB6Y29uZnJlc3RhcnQgKEZJTEUgKmlucHV0X2ZpbGUgICk7Cit2b2lkIHpjb25mX3N3aXRjaF90b19idWZmZXIgKFlZX0JVRkZFUl9TVEFURSBuZXdfYnVmZmVyICApOworWVlfQlVGRkVSX1NUQVRFIHpjb25mX2NyZWF0ZV9idWZmZXIgKEZJTEUgKmZpbGUsaW50IHNpemUgICk7Cit2b2lkIHpjb25mX2RlbGV0ZV9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSBiICApOwordm9pZCB6Y29uZl9mbHVzaF9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSBiICApOwordm9pZCB6Y29uZnB1c2hfYnVmZmVyX3N0YXRlIChZWV9CVUZGRVJfU1RBVEUgbmV3X2J1ZmZlciAgKTsKK3ZvaWQgemNvbmZwb3BfYnVmZmVyX3N0YXRlICh2b2lkICk7CisKK3N0YXRpYyB2b2lkIHpjb25mZW5zdXJlX2J1ZmZlcl9zdGFjayAodm9pZCApOworc3RhdGljIHZvaWQgemNvbmZfbG9hZF9idWZmZXJfc3RhdGUgKHZvaWQgKTsKK3N0YXRpYyB2b2lkIHpjb25mX2luaXRfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgYixGSUxFICpmaWxlICApOworCisjZGVmaW5lIFlZX0ZMVVNIX0JVRkZFUiB6Y29uZl9mbHVzaF9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIgKQorCitZWV9CVUZGRVJfU1RBVEUgemNvbmZfc2Nhbl9idWZmZXIgKGNoYXIgKmJhc2UseXlfc2l6ZV90IHNpemUgICk7CitZWV9CVUZGRVJfU1RBVEUgemNvbmZfc2Nhbl9zdHJpbmcgKHl5Y29uc3QgY2hhciAqeXlfc3RyICApOworWVlfQlVGRkVSX1NUQVRFIHpjb25mX3NjYW5fYnl0ZXMgKHl5Y29uc3QgY2hhciAqYnl0ZXMsaW50IGxlbiAgKTsKKwordm9pZCAqemNvbmZhbGxvYyAoeXlfc2l6ZV90ICApOwordm9pZCAqemNvbmZyZWFsbG9jICh2b2lkICoseXlfc2l6ZV90ICApOwordm9pZCB6Y29uZmZyZWUgKHZvaWQgKiAgKTsKKworI2RlZmluZSB5eV9uZXdfYnVmZmVyIHpjb25mX2NyZWF0ZV9idWZmZXIKKworI2RlZmluZSB5eV9zZXRfaW50ZXJhY3RpdmUoaXNfaW50ZXJhY3RpdmUpIFwKKwl7IFwKKwlpZiAoICEgWVlfQ1VSUkVOVF9CVUZGRVIgKXsgXAorICAgICAgICB6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2sgKCk7IFwKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gICAgXAorICAgICAgICAgICAgemNvbmZfY3JlYXRlX2J1ZmZlcih6Y29uZmluLFlZX0JVRl9TSVpFICk7IFwKKwl9IFwKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2lzX2ludGVyYWN0aXZlID0gaXNfaW50ZXJhY3RpdmU7IFwKKwl9CisKKyNkZWZpbmUgeXlfc2V0X2JvbChhdF9ib2wpIFwKKwl7IFwKKwlpZiAoICEgWVlfQ1VSUkVOVF9CVUZGRVIgKXtcCisgICAgICAgIHpjb25mZW5zdXJlX2J1ZmZlcl9zdGFjayAoKTsgXAorCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSAgICBcCisgICAgICAgICAgICB6Y29uZl9jcmVhdGVfYnVmZmVyKHpjb25maW4sWVlfQlVGX1NJWkUgKTsgXAorCX0gXAorCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYXRfYm9sID0gYXRfYm9sOyBcCisJfQorCisjZGVmaW5lIFlZX0FUX0JPTCgpIChZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2F0X2JvbCkKKworLyogQmVnaW4gdXNlciBzZWN0MyAqLworCisjZGVmaW5lIHpjb25md3JhcCgpIDEKKyNkZWZpbmUgWVlfU0tJUF9ZWVdSQVAKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFlZX0NIQVI7CisKK0ZJTEUgKnpjb25maW4gPSAoRklMRSAqKSAwLCAqemNvbmZvdXQgPSAoRklMRSAqKSAwOworCit0eXBlZGVmIGludCB5eV9zdGF0ZV90eXBlOworCitleHRlcm4gaW50IHpjb25mbGluZW5vOworCitpbnQgemNvbmZsaW5lbm8gPSAxOworCitleHRlcm4gY2hhciAqemNvbmZ0ZXh0OworI2RlZmluZSB5eXRleHRfcHRyIHpjb25mdGV4dAorc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X254dFtdWzE3XSA9CisgICAgeworICAgIHsKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMTIsICAgMTMsICAgMTQsICAgMTIsICAgMTIsICAgMTUsICAgMTIsICAgMTIsICAgMTIsCisgICAgICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDEyLCAgIDEyLCAgIDE1LCAgIDEyLCAgIDEyLCAgIDEyLAorICAgICAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICAxNiwgICAxNiwgICAxNywgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwKKyAgICAgICAxNiwgICAxNiwgICAxNiwgICAxOCwgICAxNiwgICAxNiwgICAxNgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMTYsICAgMTYsICAgMTcsICAgMTYsICAgMTYsICAgMTYsICAgMTYsICAgMTYsICAgMTYsCisgICAgICAgMTYsICAgMTYsICAgMTYsICAgMTgsICAgMTYsICAgMTYsICAgMTYKKworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMTksICAgMjAsICAgMjEsICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksCisgICAgICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTksICAgMTkKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDE5LCAgIDIwLCAgIDIxLCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LAorICAgICAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5LCAgIDE5CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICAyMiwgICAyMiwgICAyMywgICAyMiwgICAyNCwgICAyMiwgICAyMiwgICAyNCwgICAyMiwKKyAgICAgICAyMiwgICAyMiwgICAyMiwgICAyMiwgICAyMiwgICAyNSwgICAyMgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMjIsICAgMjIsICAgMjMsICAgMjIsICAgMjQsICAgMjIsICAgMjIsICAgMjQsICAgMjIsCisgICAgICAgMjIsICAgMjIsICAgMjIsICAgMjIsICAgMjIsICAgMjUsICAgMjIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDI2LCAgIDI2LCAgIDI3LCAgIDI4LCAgIDI5LCAgIDMwLCAgIDMxLCAgIDI5LCAgIDMyLAorICAgICAgIDMzLCAgIDM0LCAgIDM1LCAgIDM1LCAgIDM2LCAgIDM3LCAgIDM4CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDI2LCAgIDI2LCAgIDI3LCAgIDI4LCAgIDI5LCAgIDMwLCAgIDMxLCAgIDI5LCAgIDMyLAorICAgICAgIDMzLCAgIDM0LCAgIDM1LCAgIDM1LCAgIDM2LCAgIDM3LCAgIDM4CisgICAgfSwKKworICAgIHsKKyAgICAgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwKKyAgICAgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMSwgIC0xMQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsCisgICAgICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTEzLCAgIDM5LCAgIDQwLCAgLTEzLCAgLTEzLCAgIDQxLCAgLTEzLCAgLTEzLCAgLTEzLAorICAgICAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwKKyAgICAgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA0MiwgICA0MiwgICA0MywgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwKKyAgICAgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsCisgICAgICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LAorICAgICAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0xOCwgIC0xOCwgIC0xOCwgIC0xOCwgIC0xOCwgIC0xOCwgIC0xOCwgIC0xOCwgIC0xOCwKKyAgICAgIC0xOCwgIC0xOCwgIC0xOCwgICA0NCwgIC0xOCwgIC0xOCwgIC0xOAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgNDUsICAgNDUsICAtMTksICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsCisgICAgICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUsICAgNDUKKworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMjAsICAgNDYsICAgNDcsICAtMjAsICAtMjAsICAtMjAsICAtMjAsICAtMjAsICAtMjAsCisgICAgICAtMjAsICAtMjAsICAtMjAsICAtMjAsICAtMjAsICAtMjAsICAtMjAKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDQ4LCAgLTIxLCAgLTIxLCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LAorICAgICAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA0OSwgICA0OSwgICA1MCwgICA0OSwgIC0yMiwgICA0OSwgICA0OSwgIC0yMiwgICA0OSwKKyAgICAgICA0OSwgICA0OSwgICA0OSwgICA0OSwgICA0OSwgIC0yMiwgICA0OQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsCisgICAgICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMsICAtMjMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LAorICAgICAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0LCAgLTI0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDUxLCAgIDUxLCAgIDUyLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxLAorICAgICAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDUxCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwKKyAgICAgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNiwgIC0yNgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsCisgICAgICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcsICAtMjcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LAorICAgICAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgIDUzLCAgLTI4LCAgLTI4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwKKyAgICAgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA1NCwgICA1NCwgIC0zMCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwKKyAgICAgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NCwgICA1NAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMzEsICAtMzEsICAtMzEsICAtMzEsICAtMzEsICAtMzEsICAgNTUsICAtMzEsICAtMzEsCisgICAgICAtMzEsICAtMzEsICAtMzEsICAtMzEsICAtMzEsICAtMzEsICAtMzEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLAorICAgICAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMywKKyAgICAgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMywgIC0zMworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMzQsICAtMzQsICAtMzQsICAtMzQsICAtMzQsICAtMzQsICAtMzQsICAtMzQsICAtMzQsCisgICAgICAtMzQsICAgNTYsICAgNTcsICAgNTcsICAtMzQsICAtMzQsICAtMzQKKworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMzUsICAtMzUsICAtMzUsICAtMzUsICAtMzUsICAtMzUsICAtMzUsICAtMzUsICAtMzUsCisgICAgICAtMzUsICAgNTcsICAgNTcsICAgNTcsICAtMzUsICAtMzUsICAtMzUKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LAorICAgICAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2LCAgLTM2CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0zNywgIC0zNywgICA1OCwgIC0zNywgIC0zNywgIC0zNywgIC0zNywgIC0zNywgIC0zNywKKyAgICAgIC0zNywgIC0zNywgIC0zNywgIC0zNywgIC0zNywgIC0zNywgIC0zNworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsCisgICAgICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAtMzgsICAgNTkKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTM5LCAgIDM5LCAgIDQwLCAgLTM5LCAgLTM5LCAgIDQxLCAgLTM5LCAgLTM5LCAgLTM5LAorICAgICAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5LCAgLTM5CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLAorICAgICAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwLCAgLTQwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA0MiwgICA0MiwgICA0MywgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwKKyAgICAgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MiwgICA0MgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgNDIsICAgNDIsICAgNDMsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsCisgICAgICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIsICAgNDIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLAorICAgICAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwKKyAgICAgIC00NCwgIC00NCwgIC00NCwgICA0NCwgIC00NCwgIC00NCwgIC00NAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA0NSwgICA0NSwgIC00NSwgICA0NSwgICA0NSwgICA0NSwgICA0NSwgICA0NSwgICA0NSwKKyAgICAgICA0NSwgICA0NSwgICA0NSwgICA0NSwgICA0NSwgICA0NSwgICA0NQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNDYsICAgNDYsICAgNDcsICAtNDYsICAtNDYsICAtNDYsICAtNDYsICAtNDYsICAtNDYsCisgICAgICAtNDYsICAtNDYsICAtNDYsICAtNDYsICAtNDYsICAtNDYsICAtNDYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDQ4LCAgLTQ3LCAgLTQ3LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LAorICAgICAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OCwKKyAgICAgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OCwgIC00OAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgNDksICAgNDksICAgNTAsICAgNDksICAtNDksICAgNDksICAgNDksICAtNDksICAgNDksCisgICAgICAgNDksICAgNDksICAgNDksICAgNDksICAgNDksICAtNDksICAgNDkKKworICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAsCisgICAgICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAsICAtNTAKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTUxLCAgLTUxLCAgIDUyLCAgLTUxLCAgLTUxLCAgLTUxLCAgLTUxLCAgLTUxLCAgLTUxLAorICAgICAgLTUxLCAgLTUxLCAgLTUxLCAgLTUxLCAgLTUxLCAgLTUxLCAgLTUxCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwKKyAgICAgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MiwgIC01MgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsCisgICAgICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMsICAtNTMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDU0LCAgIDU0LCAgLTU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LAorICAgICAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0LCAgIDU0CisKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LAorICAgICAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1LCAgLTU1CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC01NiwgIC01NiwgIC01NiwgIC01NiwgIC01NiwgIC01NiwgIC01NiwgIC01NiwgIC01NiwKKyAgICAgIC01NiwgICA2MCwgICA1NywgICA1NywgIC01NiwgIC01NiwgIC01NgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsCisgICAgICAtNTcsICAgNTcsICAgNTcsICAgNTcsICAtNTcsICAtNTcsICAtNTcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LAorICAgICAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwKKyAgICAgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC02MCwgIC02MCwgIC02MCwgIC02MCwgIC02MCwgIC02MCwgIC02MCwgIC02MCwgIC02MCwKKyAgICAgIC02MCwgICA1NywgICA1NywgICA1NywgIC02MCwgIC02MCwgIC02MAorICAgIH0sCisKKyAgICB9IDsKKworc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfZ2V0X3ByZXZpb3VzX3N0YXRlICh2b2lkICk7CitzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV90cnlfTlVMX3RyYW5zICh5eV9zdGF0ZV90eXBlIGN1cnJlbnRfc3RhdGUgICk7CitzdGF0aWMgaW50IHl5X2dldF9uZXh0X2J1ZmZlciAodm9pZCApOworc3RhdGljIHZvaWQgeXlfZmF0YWxfZXJyb3IgKHl5Y29uc3QgY2hhciBtc2dbXSAgKTsKKworLyogRG9uZSBhZnRlciB0aGUgY3VycmVudCBwYXR0ZXJuIGhhcyBiZWVuIG1hdGNoZWQgYW5kIGJlZm9yZSB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgYWN0aW9uIC0gc2V0cyB1cCB6Y29uZnRleHQuCisgKi8KKyNkZWZpbmUgWVlfRE9fQkVGT1JFX0FDVElPTiBcCisJKHl5dGV4dF9wdHIpID0geXlfYnA7IFwKKwl6Y29uZmxlbmcgPSAoc2l6ZV90KSAoeXlfY3AgLSB5eV9icCk7IFwKKwkoeXlfaG9sZF9jaGFyKSA9ICp5eV9jcDsgXAorCSp5eV9jcCA9ICdcMCc7IFwKKwkoeXlfY19idWZfcCkgPSB5eV9jcDsKKworI2RlZmluZSBZWV9OVU1fUlVMRVMgMzMKKyNkZWZpbmUgWVlfRU5EX09GX0JVRkZFUiAzNAorLyogVGhpcyBzdHJ1Y3QgaXMgbm90IHVzZWQgaW4gdGhpcyBzY2FubmVyLAorICAgYnV0IGl0cyBwcmVzZW5jZSBpcyBuZWNlc3NhcnkuICovCitzdHJ1Y3QgeXlfdHJhbnNfaW5mbworCXsKKwlmbGV4X2ludDMyX3QgeXlfdmVyaWZ5OworCWZsZXhfaW50MzJfdCB5eV9ueHQ7CisJfTsKK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9hY2NlcHRbNjFdID0KKyAgICB7ICAgMCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICAzNCwgICAgNSwgICAgNCwgICAgMiwgICAgMywgICAgNywgICAgOCwgICAgNiwgICAzMiwgICAyOSwKKyAgICAgICAzMSwgICAyNCwgICAyOCwgICAyNywgICAyNiwgICAyMiwgICAxNywgICAxMywgICAxNiwgICAyMCwKKyAgICAgICAyMiwgICAxMSwgICAxMiwgICAxOSwgICAxOSwgICAxNCwgICAyMiwgICAyMiwgICAgNCwgICAgMiwKKyAgICAgICAgMywgICAgMywgICAgMSwgICAgNiwgICAzMiwgICAyOSwgICAzMSwgICAzMCwgICAyNCwgICAyMywKKyAgICAgICAyNiwgICAyNSwgICAxNSwgICAyMCwgICAgOSwgICAxOSwgICAxOSwgICAyMSwgICAxMCwgICAxOAorICAgIH0gOworCitzdGF0aWMgeXljb25zdCBmbGV4X2ludDMyX3QgeXlfZWNbMjU2XSA9CisgICAgeyAgIDAsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDIsICAgIDMsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDIsICAgIDQsICAgIDUsICAgIDYsICAgIDEsICAgIDEsICAgIDcsICAgIDgsICAgIDksCisgICAgICAgMTAsICAgIDEsICAgIDEsICAgIDEsICAgMTEsICAgMTIsICAgMTIsICAgMTMsICAgMTMsICAgMTMsCisgICAgICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgMTQsICAgIDEsICAgIDEsICAgIDEsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsCisgICAgICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsCisgICAgICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsICAgMTMsCisgICAgICAgIDEsICAgMTUsICAgIDEsICAgIDEsICAgMTMsICAgIDEsICAgMTMsICAgMTMsICAgMTMsICAgMTMsCisKKyAgICAgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywKKyAgICAgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywKKyAgICAgICAxMywgICAxMywgICAgMSwgICAxNiwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKworICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxCisgICAgfSA7CisKK2V4dGVybiBpbnQgemNvbmZfZmxleF9kZWJ1ZzsKK2ludCB6Y29uZl9mbGV4X2RlYnVnID0gMDsKKworLyogVGhlIGludGVudCBiZWhpbmQgdGhpcyBkZWZpbml0aW9uIGlzIHRoYXQgaXQnbGwgY2F0Y2gKKyAqIGFueSB1c2VzIG9mIFJFSkVDVCB3aGljaCBmbGV4IG1pc3NlZC4KKyAqLworI2RlZmluZSBSRUpFQ1QgcmVqZWN0X3VzZWRfYnV0X25vdF9kZXRlY3RlZAorI2RlZmluZSB5eW1vcmUoKSB5eW1vcmVfdXNlZF9idXRfbm90X2RldGVjdGVkCisjZGVmaW5lIFlZX01PUkVfQURKIDAKKyNkZWZpbmUgWVlfUkVTVE9SRV9ZWV9NT1JFX09GRlNFVAorY2hhciAqemNvbmZ0ZXh0OworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCisjaW5jbHVkZSAibGtjLmgiCisKKyNkZWZpbmUgU1RBUlRfU1RSU0laRQkxNgorCitzdGF0aWMgc3RydWN0IHsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlpbnQgbGluZW5vOworfSBjdXJyZW50X3BvczsKKworc3RhdGljIGNoYXIgKnRleHQ7CitzdGF0aWMgaW50IHRleHRfc2l6ZSwgdGV4dF9hc2l6ZTsKKworc3RydWN0IGJ1ZmZlciB7CisgICAgICAgIHN0cnVjdCBidWZmZXIgKnBhcmVudDsKKyAgICAgICAgWVlfQlVGRkVSX1NUQVRFIHN0YXRlOworfTsKKworc3RydWN0IGJ1ZmZlciAqY3VycmVudF9idWY7CisKK3N0YXRpYyBpbnQgbGFzdF90cywgZmlyc3RfdHM7CisKK3N0YXRpYyB2b2lkIHpjb25mX2VuZGhlbHAodm9pZCk7CitzdGF0aWMgdm9pZCB6Y29uZl9lbmRmaWxlKHZvaWQpOworCit2b2lkIG5ld19zdHJpbmcodm9pZCkKK3sKKwl0ZXh0ID0gbWFsbG9jKFNUQVJUX1NUUlNJWkUpOworCXRleHRfYXNpemUgPSBTVEFSVF9TVFJTSVpFOworCXRleHRfc2l6ZSA9IDA7CisJKnRleHQgPSAwOworfQorCit2b2lkIGFwcGVuZF9zdHJpbmcoY29uc3QgY2hhciAqc3RyLCBpbnQgc2l6ZSkKK3sKKwlpbnQgbmV3X3NpemUgPSB0ZXh0X3NpemUgKyBzaXplICsgMTsKKwlpZiAoc2l6ZSA+IDcwKSB7CisJCWZwcmludGYgKHN0ZGVyciwgIiVzOiVkIGVycm9yOiBPdmVybG9uZyBsaW5lXG4iLAorCQljdXJyZW50X2ZpbGUtPm5hbWUsIGN1cnJlbnRfZmlsZS0+bGluZW5vKTsKKwl9CisKKwlpZiAobmV3X3NpemUgPiB0ZXh0X2FzaXplKSB7CisJCW5ld19zaXplICs9IFNUQVJUX1NUUlNJWkUgLSAxOworCQluZXdfc2l6ZSAmPSAtU1RBUlRfU1RSU0laRTsKKwkJdGV4dCA9IHJlYWxsb2ModGV4dCwgbmV3X3NpemUpOworCQl0ZXh0X2FzaXplID0gbmV3X3NpemU7CisJfQorCW1lbWNweSh0ZXh0ICsgdGV4dF9zaXplLCBzdHIsIHNpemUpOworCXRleHRfc2l6ZSArPSBzaXplOworCXRleHRbdGV4dF9zaXplXSA9IDA7Cit9CisKK3ZvaWQgYWxsb2Nfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50IHNpemUpCit7CisJdGV4dCA9IG1hbGxvYyhzaXplICsgMSk7CisJbWVtY3B5KHRleHQsIHN0ciwgc2l6ZSk7CisJdGV4dFtzaXplXSA9IDA7Cit9CisKKyNkZWZpbmUgSU5JVElBTCAwCisjZGVmaW5lIENPTU1BTkQgMQorI2RlZmluZSBIRUxQIDIKKyNkZWZpbmUgU1RSSU5HIDMKKyNkZWZpbmUgUEFSQU0gNAorCisjaWZuZGVmIFlZX05PX1VOSVNURF9ICisvKiBTcGVjaWFsIGNhc2UgZm9yICJ1bmlzdGQuaCIsIHNpbmNlIGl0IGlzIG5vbi1BTlNJLiBXZSBpbmNsdWRlIGl0IHdheQorICogZG93biBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0aGUgdXNlcidzIHNlY3Rpb24gMSB0byBoYXZlIGJlZW4gc2Nhbm5lZCBmaXJzdC4KKyAqIFRoZSB1c2VyIGhhcyBhIGNoYW5jZSB0byBvdmVycmlkZSBpdCB3aXRoIGFuIG9wdGlvbi4KKyAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmCisKKyNpZm5kZWYgWVlfRVhUUkFfVFlQRQorI2RlZmluZSBZWV9FWFRSQV9UWVBFIHZvaWQgKgorI2VuZGlmCisKKy8qIE1hY3JvcyBhZnRlciB0aGlzIHBvaW50IGNhbiBhbGwgYmUgb3ZlcnJpZGRlbiBieSB1c2VyIGRlZmluaXRpb25zIGluCisgKiBzZWN0aW9uIDEuCisgKi8KKworI2lmbmRlZiBZWV9TS0lQX1lZV1JBUAorI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIGludCB6Y29uZndyYXAgKHZvaWQgKTsKKyNlbHNlCitleHRlcm4gaW50IHpjb25md3JhcCAodm9pZCApOworI2VuZGlmCisjZW5kaWYKKworICAgIHN0YXRpYyB2b2lkIHl5dW5wdXQgKGludCBjLGNoYXIgKmJ1Zl9wdHIgICk7CisKKyNpZm5kZWYgeXl0ZXh0X3B0cgorc3RhdGljIHZvaWQgeXlfZmxleF9zdHJuY3B5IChjaGFyICoseXljb25zdCBjaGFyICosaW50ICk7CisjZW5kaWYKKworI2lmZGVmIFlZX05FRURfU1RSTEVOCitzdGF0aWMgaW50IHl5X2ZsZXhfc3RybGVuICh5eWNvbnN0IGNoYXIgKiApOworI2VuZGlmCisKKy8vYmJveDogc3VwcHJlc3NpbmcgImRlZmluZWQgYnV0IG5vdCB1c2VkIiB3YXJuaW5nCisjZGVmaW5lIFlZX05PX0lOUFVUIDEKKworI2lmbmRlZiBZWV9OT19JTlBVVAorCisjaWZkZWYgX19jcGx1c3BsdXMKK3N0YXRpYyBpbnQgeXlpbnB1dCAodm9pZCApOworI2Vsc2UKK3N0YXRpYyBpbnQgaW5wdXQgKHZvaWQgKTsKKyNlbmRpZgorCisjZW5kaWYKKworLyogQW1vdW50IG9mIHN0dWZmIHRvIHNsdXJwIHVwIHdpdGggZWFjaCByZWFkLiAqLworI2lmbmRlZiBZWV9SRUFEX0JVRl9TSVpFCisjZGVmaW5lIFlZX1JFQURfQlVGX1NJWkUgODE5MgorI2VuZGlmCisKKy8qIENvcHkgd2hhdGV2ZXIgdGhlIGxhc3QgcnVsZSBtYXRjaGVkIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuICovCisjaWZuZGVmIEVDSE8KKy8qIFRoaXMgdXNlZCB0byBiZSBhbiBmcHV0cygpLCBidXQgc2luY2UgdGhlIHN0cmluZyBtaWdodCBjb250YWluIE5VTCdzLAorICogd2Ugbm93IHVzZSBmd3JpdGUoKS4KKyAqLworI2RlZmluZSBFQ0hPICh2b2lkKSBmd3JpdGUoIHpjb25mdGV4dCwgemNvbmZsZW5nLCAxLCB6Y29uZm91dCApCisjZW5kaWYKKworLyogR2V0cyBpbnB1dCBhbmQgc3R1ZmZzIGl0IGludG8gImJ1ZiIuICBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBvciBZWV9OVUxMLAorICogaXMgcmV0dXJuZWQgaW4gInJlc3VsdCIuCisgKi8KKyNpZm5kZWYgWVlfSU5QVVQKKyNkZWZpbmUgWVlfSU5QVVQoYnVmLHJlc3VsdCxtYXhfc2l6ZSkgXAorCWVycm5vPTA7IFwKKwl3aGlsZSAoIChyZXN1bHQgPSByZWFkKCBmaWxlbm8oemNvbmZpbiksIChjaGFyICopIGJ1ZiwgbWF4X3NpemUgKSkgPCAwICkgXAorCXsgXAorCQlpZiggZXJybm8gIT0gRUlOVFIpIFwKKwkJeyBcCisJCQlZWV9GQVRBTF9FUlJPUiggImlucHV0IGluIGZsZXggc2Nhbm5lciBmYWlsZWQiICk7IFwKKwkJCWJyZWFrOyBcCisJCX0gXAorCQllcnJubz0wOyBcCisJCWNsZWFyZXJyKHpjb25maW4pOyBcCisJfVwKK1wKKworI2VuZGlmCisKKy8qIE5vIHNlbWktY29sb24gYWZ0ZXIgcmV0dXJuOyBjb3JyZWN0IHVzYWdlIGlzIHRvIHdyaXRlICJ5eXRlcm1pbmF0ZSgpOyIgLQorICogd2UgZG9uJ3Qgd2FudCBhbiBleHRyYSAnOycgYWZ0ZXIgdGhlICJyZXR1cm4iIGJlY2F1c2UgdGhhdCB3aWxsIGNhdXNlCisgKiBzb21lIGNvbXBpbGVycyB0byBjb21wbGFpbiBhYm91dCB1bnJlYWNoYWJsZSBzdGF0ZW1lbnRzLgorICovCisjaWZuZGVmIHl5dGVybWluYXRlCisjZGVmaW5lIHl5dGVybWluYXRlKCkgcmV0dXJuIFlZX05VTEwKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgZW50cmllcyBieSB3aGljaCBzdGFydC1jb25kaXRpb24gc3RhY2sgZ3Jvd3MuICovCisjaWZuZGVmIFlZX1NUQVJUX1NUQUNLX0lOQ1IKKyNkZWZpbmUgWVlfU1RBUlRfU1RBQ0tfSU5DUiAyNQorI2VuZGlmCisKKy8qIFJlcG9ydCBhIGZhdGFsIGVycm9yLiAqLworI2lmbmRlZiBZWV9GQVRBTF9FUlJPUgorI2RlZmluZSBZWV9GQVRBTF9FUlJPUihtc2cpIHl5X2ZhdGFsX2Vycm9yKCBtc2cgKQorI2VuZGlmCisKKy8qIGVuZCB0YWJsZXMgc2VyaWFsaXphdGlvbiBzdHJ1Y3R1cmVzIGFuZCBwcm90b3R5cGVzICovCisKKy8qIERlZmF1bHQgZGVjbGFyYXRpb24gb2YgZ2VuZXJhdGVkIHNjYW5uZXIgLSBhIGRlZmluZSBzbyB0aGUgdXNlciBjYW4KKyAqIGVhc2lseSBhZGQgcGFyYW1ldGVycy4KKyAqLworI2lmbmRlZiBZWV9ERUNMCisjZGVmaW5lIFlZX0RFQ0xfSVNfT1VSUyAxCisKK2V4dGVybiBpbnQgemNvbmZsZXggKHZvaWQpOworCisjZGVmaW5lIFlZX0RFQ0wgaW50IHpjb25mbGV4ICh2b2lkKQorI2VuZGlmIC8qICFZWV9ERUNMICovCisKKy8qIENvZGUgZXhlY3V0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJ1bGUsIGFmdGVyIHpjb25mdGV4dCBhbmQgemNvbmZsZW5nCisgKiBoYXZlIGJlZW4gc2V0IHVwLgorICovCisjaWZuZGVmIFlZX1VTRVJfQUNUSU9OCisjZGVmaW5lIFlZX1VTRVJfQUNUSU9OCisjZW5kaWYKKworLyogQ29kZSBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIGVhY2ggcnVsZS4gKi8KKyNpZm5kZWYgWVlfQlJFQUsKKyNkZWZpbmUgWVlfQlJFQUsgYnJlYWs7CisjZW5kaWYKKworI2RlZmluZSBZWV9SVUxFX1NFVFVQIFwKKwlZWV9VU0VSX0FDVElPTgorCisvKiogVGhlIG1haW4gc2Nhbm5lciBmdW5jdGlvbiB3aGljaCBkb2VzIGFsbCB0aGUgd29yay4KKyAqLworWVlfREVDTAoreworCXJlZ2lzdGVyIHl5X3N0YXRlX3R5cGUgeXlfY3VycmVudF9zdGF0ZTsKKwlyZWdpc3RlciBjaGFyICp5eV9jcCwgKnl5X2JwOworCXJlZ2lzdGVyIGludCB5eV9hY3Q7CisKKwlpbnQgc3RyID0gMDsKKwlpbnQgdHMsIGk7CisKKwlpZiAoICh5eV9pbml0KSApCisJCXsKKwkJKHl5X2luaXQpID0gMDsKKworI2lmZGVmIFlZX1VTRVJfSU5JVAorCQlZWV9VU0VSX0lOSVQ7CisjZW5kaWYKKworCQlpZiAoICEgKHl5X3N0YXJ0KSApCisJCQkoeXlfc3RhcnQpID0gMTsJLyogZmlyc3Qgc3RhcnQgc3RhdGUgKi8KKworCQlpZiAoICEgemNvbmZpbiApCisJCQl6Y29uZmluID0gc3RkaW47CisKKwkJaWYgKCAhIHpjb25mb3V0ICkKKwkJCXpjb25mb3V0ID0gc3Rkb3V0OworCisJCWlmICggISBZWV9DVVJSRU5UX0JVRkZFUiApIHsKKwkJCXpjb25mZW5zdXJlX2J1ZmZlcl9zdGFjayAoKTsKKwkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9CisJCQkJemNvbmZfY3JlYXRlX2J1ZmZlcih6Y29uZmluLFlZX0JVRl9TSVpFICk7CisJCX0KKworCQl6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKKwkJfQorCisJd2hpbGUgKCAxICkJCS8qIGxvb3BzIHVudGlsIGVuZC1vZi1maWxlIGlzIHJlYWNoZWQgKi8KKwkJeworCQl5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKKworCQkvKiBTdXBwb3J0IG9mIHpjb25mdGV4dC4gKi8KKwkJKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7CisKKwkJLyogeXlfYnAgcG9pbnRzIHRvIHRoZSBwb3NpdGlvbiBpbiB5eV9jaF9idWYgb2YgdGhlIHN0YXJ0IG9mCisJCSAqIHRoZSBjdXJyZW50IHJ1bi4KKwkJICovCisJCXl5X2JwID0geXlfY3A7CisKKwkJeXlfY3VycmVudF9zdGF0ZSA9ICh5eV9zdGFydCk7Cit5eV9tYXRjaDoKKwkJd2hpbGUgKCAoeXlfY3VycmVudF9zdGF0ZSA9IHl5X254dFt5eV9jdXJyZW50X3N0YXRlXVsgeXlfZWNbWVlfU0NfVE9fVUkoKnl5X2NwKV0gIF0pID4gMCApCisJCQkrK3l5X2NwOworCisJCXl5X2N1cnJlbnRfc3RhdGUgPSAteXlfY3VycmVudF9zdGF0ZTsKKworeXlfZmluZF9hY3Rpb246CisJCXl5X2FjdCA9IHl5X2FjY2VwdFt5eV9jdXJyZW50X3N0YXRlXTsKKworCQlZWV9ET19CRUZPUkVfQUNUSU9OOworCitkb19hY3Rpb246CS8qIFRoaXMgbGFiZWwgaXMgdXNlZCBvbmx5IHRvIGFjY2VzcyBFT0YgYWN0aW9ucy4gKi8KKworCQlzd2l0Y2ggKCB5eV9hY3QgKQorCXsgLyogYmVnaW5uaW5nIG9mIGFjdGlvbiBzd2l0Y2ggKi8KK2Nhc2UgMToKKy8qIHJ1bGUgMSBjYW4gbWF0Y2ggZW9sICovCitjYXNlIDI6CisvKiBydWxlIDIgY2FuIG1hdGNoIGVvbCAqLworWVlfUlVMRV9TRVRVUAoreworCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7CisJcmV0dXJuIFRfRU9MOworfQorCVlZX0JSRUFLCitjYXNlIDM6CitZWV9SVUxFX1NFVFVQCisKKwlZWV9CUkVBSworY2FzZSA0OgorWVlfUlVMRV9TRVRVUAoreworCUJFR0lOKENPTU1BTkQpOworfQorCVlZX0JSRUFLCitjYXNlIDU6CitZWV9SVUxFX1NFVFVQCit7CisJdW5wdXQoemNvbmZ0ZXh0WzBdKTsKKwlCRUdJTihDT01NQU5EKTsKK30KKwlZWV9CUkVBSworCitjYXNlIDY6CitZWV9SVUxFX1NFVFVQCit7CisJCXN0cnVjdCBrY29uZl9pZCAqaWQgPSBrY29uZl9pZF9sb29rdXAoemNvbmZ0ZXh0LCB6Y29uZmxlbmcpOworCQlCRUdJTihQQVJBTSk7CisJCWN1cnJlbnRfcG9zLmZpbGUgPSBjdXJyZW50X2ZpbGU7CisJCWN1cnJlbnRfcG9zLmxpbmVubyA9IGN1cnJlbnRfZmlsZS0+bGluZW5vOworCQlpZiAoaWQgJiYgaWQtPmZsYWdzICYgVEZfQ09NTUFORCkgeworCQkJemNvbmZsdmFsLmlkID0gaWQ7CisJCQlyZXR1cm4gaWQtPnRva2VuOworCQl9CisJCWFsbG9jX3N0cmluZyh6Y29uZnRleHQsIHpjb25mbGVuZyk7CisJCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCQlyZXR1cm4gVF9XT1JEOworCX0KKwlZWV9CUkVBSworY2FzZSA3OgorWVlfUlVMRV9TRVRVUAorCisJWVlfQlJFQUsKK2Nhc2UgODoKKy8qIHJ1bGUgOCBjYW4gbWF0Y2ggZW9sICovCitZWV9SVUxFX1NFVFVQCit7CisJCUJFR0lOKElOSVRJQUwpOworCQljdXJyZW50X2ZpbGUtPmxpbmVubysrOworCQlyZXR1cm4gVF9FT0w7CisJfQorCVlZX0JSRUFLCisKK2Nhc2UgOToKK1lZX1JVTEVfU0VUVVAKK3JldHVybiBUX0FORDsKKwlZWV9CUkVBSworY2FzZSAxMDoKK1lZX1JVTEVfU0VUVVAKK3JldHVybiBUX09SOworCVlZX0JSRUFLCitjYXNlIDExOgorWVlfUlVMRV9TRVRVUAorcmV0dXJuIFRfT1BFTl9QQVJFTjsKKwlZWV9CUkVBSworY2FzZSAxMjoKK1lZX1JVTEVfU0VUVVAKK3JldHVybiBUX0NMT1NFX1BBUkVOOworCVlZX0JSRUFLCitjYXNlIDEzOgorWVlfUlVMRV9TRVRVUAorcmV0dXJuIFRfTk9UOworCVlZX0JSRUFLCitjYXNlIDE0OgorWVlfUlVMRV9TRVRVUAorcmV0dXJuIFRfRVFVQUw7CisJWVlfQlJFQUsKK2Nhc2UgMTU6CitZWV9SVUxFX1NFVFVQCityZXR1cm4gVF9VTkVRVUFMOworCVlZX0JSRUFLCitjYXNlIDE2OgorWVlfUlVMRV9TRVRVUAoreworCQlzdHIgPSB6Y29uZnRleHRbMF07CisJCW5ld19zdHJpbmcoKTsKKwkJQkVHSU4oU1RSSU5HKTsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgMTc6CisvKiBydWxlIDE3IGNhbiBtYXRjaCBlb2wgKi8KK1lZX1JVTEVfU0VUVVAKK0JFR0lOKElOSVRJQUwpOyBjdXJyZW50X2ZpbGUtPmxpbmVubysrOyByZXR1cm4gVF9FT0w7CisJWVlfQlJFQUsKK2Nhc2UgMTg6CitZWV9SVUxFX1NFVFVQCisvKiBpZ25vcmUgKi8KKwlZWV9CUkVBSworY2FzZSAxOToKK1lZX1JVTEVfU0VUVVAKK3sKKwkJc3RydWN0IGtjb25mX2lkICppZCA9IGtjb25mX2lkX2xvb2t1cCh6Y29uZnRleHQsIHpjb25mbGVuZyk7CisJCWlmIChpZCAmJiBpZC0+ZmxhZ3MgJiBURl9QQVJBTSkgeworCQkJemNvbmZsdmFsLmlkID0gaWQ7CisJCQlyZXR1cm4gaWQtPnRva2VuOworCQl9CisJCWFsbG9jX3N0cmluZyh6Y29uZnRleHQsIHpjb25mbGVuZyk7CisJCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCQlyZXR1cm4gVF9XT1JEOworCX0KKwlZWV9CUkVBSworY2FzZSAyMDoKK1lZX1JVTEVfU0VUVVAKKy8qIGNvbW1lbnQgKi8KKwlZWV9CUkVBSworY2FzZSAyMToKKy8qIHJ1bGUgMjEgY2FuIG1hdGNoIGVvbCAqLworWVlfUlVMRV9TRVRVUAorY3VycmVudF9maWxlLT5saW5lbm8rKzsKKwlZWV9CUkVBSworY2FzZSAyMjoKK1lZX1JVTEVfU0VUVVAKKworCVlZX0JSRUFLCitjYXNlIFlZX1NUQVRFX0VPRihQQVJBTSk6Cit7CisJCUJFR0lOKElOSVRJQUwpOworCX0KKwlZWV9CUkVBSworCitjYXNlIDIzOgorLyogcnVsZSAyMyBjYW4gbWF0Y2ggZW9sICovCisqeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsgLyogdW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgemNvbmZ0ZXh0ICovCisoeXlfY19idWZfcCkgPSB5eV9jcCAtPSAxOworWVlfRE9fQkVGT1JFX0FDVElPTjsgLyogc2V0IHVwIHpjb25mdGV4dCBhZ2FpbiAqLworWVlfUlVMRV9TRVRVUAoreworCQlhcHBlbmRfc3RyaW5nKHpjb25mdGV4dCwgemNvbmZsZW5nKTsKKwkJemNvbmZsdmFsLnN0cmluZyA9IHRleHQ7CisJCXJldHVybiBUX1dPUkRfUVVPVEU7CisJfQorCVlZX0JSRUFLCitjYXNlIDI0OgorWVlfUlVMRV9TRVRVUAoreworCQlhcHBlbmRfc3RyaW5nKHpjb25mdGV4dCwgemNvbmZsZW5nKTsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgMjU6CisvKiBydWxlIDI1IGNhbiBtYXRjaCBlb2wgKi8KKyp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOyAvKiB1bmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB6Y29uZnRleHQgKi8KKyh5eV9jX2J1Zl9wKSA9IHl5X2NwIC09IDE7CitZWV9ET19CRUZPUkVfQUNUSU9OOyAvKiBzZXQgdXAgemNvbmZ0ZXh0IGFnYWluICovCitZWV9SVUxFX1NFVFVQCit7CisJCWFwcGVuZF9zdHJpbmcoemNvbmZ0ZXh0ICsgMSwgemNvbmZsZW5nIC0gMSk7CisJCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCQlyZXR1cm4gVF9XT1JEX1FVT1RFOworCX0KKwlZWV9CUkVBSworY2FzZSAyNjoKK1lZX1JVTEVfU0VUVVAKK3sKKwkJYXBwZW5kX3N0cmluZyh6Y29uZnRleHQgKyAxLCB6Y29uZmxlbmcgLSAxKTsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgMjc6CitZWV9SVUxFX1NFVFVQCit7CisJCWlmIChzdHIgPT0gemNvbmZ0ZXh0WzBdKSB7CisJCQlCRUdJTihQQVJBTSk7CisJCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwkJCXJldHVybiBUX1dPUkRfUVVPVEU7CisJCX0gZWxzZQorCQkJYXBwZW5kX3N0cmluZyh6Y29uZnRleHQsIDEpOworCX0KKwlZWV9CUkVBSworY2FzZSAyODoKKy8qIHJ1bGUgMjggY2FuIG1hdGNoIGVvbCAqLworWVlfUlVMRV9TRVRVUAoreworCQlwcmludGYoIiVzOiVkOndhcm5pbmc6IG11bHRpLWxpbmUgc3RyaW5ncyBub3Qgc3VwcG9ydGVkXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwkJY3VycmVudF9maWxlLT5saW5lbm8rKzsKKwkJQkVHSU4oSU5JVElBTCk7CisJCXJldHVybiBUX0VPTDsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgWVlfU1RBVEVfRU9GKFNUUklORyk6Cit7CisJCUJFR0lOKElOSVRJQUwpOworCX0KKwlZWV9CUkVBSworCitjYXNlIDI5OgorWVlfUlVMRV9TRVRVUAoreworCQl0cyA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCB6Y29uZmxlbmc7IGkrKykgeworCQkJaWYgKHpjb25mdGV4dFtpXSA9PSAnXHQnKQorCQkJCXRzID0gKHRzICYgfjcpICsgODsKKwkJCWVsc2UKKwkJCQl0cysrOworCQl9CisJCWxhc3RfdHMgPSB0czsKKwkJaWYgKGZpcnN0X3RzKSB7CisJCQlpZiAodHMgPCBmaXJzdF90cykgeworCQkJCXpjb25mX2VuZGhlbHAoKTsKKwkJCQlyZXR1cm4gVF9IRUxQVEVYVDsKKwkJCX0KKwkJCXRzIC09IGZpcnN0X3RzOworCQkJd2hpbGUgKHRzID4gOCkgeworCQkJCWFwcGVuZF9zdHJpbmcoIiAgICAgICAgIiwgOCk7CisJCQkJdHMgLT0gODsKKwkJCX0KKwkJCWFwcGVuZF9zdHJpbmcoIiAgICAgICAgIiwgdHMpOworCQl9CisJfQorCVlZX0JSRUFLCitjYXNlIDMwOgorLyogcnVsZSAzMCBjYW4gbWF0Y2ggZW9sICovCisqeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsgLyogdW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgemNvbmZ0ZXh0ICovCisoeXlfY19idWZfcCkgPSB5eV9jcCAtPSAxOworWVlfRE9fQkVGT1JFX0FDVElPTjsgLyogc2V0IHVwIHpjb25mdGV4dCBhZ2FpbiAqLworWVlfUlVMRV9TRVRVUAoreworCQljdXJyZW50X2ZpbGUtPmxpbmVubysrOworCQl6Y29uZl9lbmRoZWxwKCk7CisJCXJldHVybiBUX0hFTFBURVhUOworCX0KKwlZWV9CUkVBSworY2FzZSAzMToKKy8qIHJ1bGUgMzEgY2FuIG1hdGNoIGVvbCAqLworWVlfUlVMRV9TRVRVUAoreworCQljdXJyZW50X2ZpbGUtPmxpbmVubysrOworCQlhcHBlbmRfc3RyaW5nKCJcbiIsIDEpOworCX0KKwlZWV9CUkVBSworY2FzZSAzMjoKK1lZX1JVTEVfU0VUVVAKK3sKKwkJYXBwZW5kX3N0cmluZyh6Y29uZnRleHQsIHpjb25mbGVuZyk7CisJCWlmICghZmlyc3RfdHMpCisJCQlmaXJzdF90cyA9IGxhc3RfdHM7CisJfQorCVlZX0JSRUFLCitjYXNlIFlZX1NUQVRFX0VPRihIRUxQKToKK3sKKwkJemNvbmZfZW5kaGVscCgpOworCQlyZXR1cm4gVF9IRUxQVEVYVDsKKwl9CisJWVlfQlJFQUsKKworY2FzZSBZWV9TVEFURV9FT0YoSU5JVElBTCk6CitjYXNlIFlZX1NUQVRFX0VPRihDT01NQU5EKToKK3sKKwlpZiAoY3VycmVudF9maWxlKSB7CisJCXpjb25mX2VuZGZpbGUoKTsKKwkJcmV0dXJuIFRfRU9MOworCX0KKwlmY2xvc2UoemNvbmZpbik7CisJeXl0ZXJtaW5hdGUoKTsKK30KKwlZWV9CUkVBSworY2FzZSAzMzoKK1lZX1JVTEVfU0VUVVAKK1lZX0ZBVEFMX0VSUk9SKCAiZmxleCBzY2FubmVyIGphbW1lZCIgKTsKKwlZWV9CUkVBSworCisJY2FzZSBZWV9FTkRfT0ZfQlVGRkVSOgorCQl7CisJCS8qIEFtb3VudCBvZiB0ZXh0IG1hdGNoZWQgbm90IGluY2x1ZGluZyB0aGUgRU9CIGNoYXIuICovCisJCWludCB5eV9hbW91bnRfb2ZfbWF0Y2hlZF90ZXh0ID0gKGludCkgKHl5X2NwIC0gKHl5dGV4dF9wdHIpKSAtIDE7CisKKwkJLyogVW5kbyB0aGUgZWZmZWN0cyBvZiBZWV9ET19CRUZPUkVfQUNUSU9OLiAqLworCQkqeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsKKwkJWVlfUkVTVE9SRV9ZWV9NT1JFX09GRlNFVAorCisJCWlmICggWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZmZXJfc3RhdHVzID09IFlZX0JVRkZFUl9ORVcgKQorCQkJeworCQkJLyogV2UncmUgc2Nhbm5pbmcgYSBuZXcgZmlsZSBvciBpbnB1dCBzb3VyY2UuICBJdCdzCisJCQkgKiBwb3NzaWJsZSB0aGF0IHRoaXMgaGFwcGVuZWQgYmVjYXVzZSB0aGUgdXNlcgorCQkJICoganVzdCBwb2ludGVkIHpjb25maW4gYXQgYSBuZXcgc291cmNlIGFuZCBjYWxsZWQKKwkJCSAqIHpjb25mbGV4KCkuICBJZiBzbywgdGhlbiB3ZSBoYXZlIHRvIGFzc3VyZQorCQkJICogY29uc2lzdGVuY3kgYmV0d2VlbiBZWV9DVVJSRU5UX0JVRkZFUiBhbmQgb3VyCisJCQkgKiBnbG9iYWxzLiAgSGVyZSBpcyB0aGUgcmlnaHQgcGxhY2UgdG8gZG8gc28sIGJlY2F1c2UKKwkJCSAqIHRoaXMgaXMgdGhlIGZpcnN0IGFjdGlvbiAob3RoZXIgdGhhbiBwb3NzaWJseSBhCisJCQkgKiBiYWNrLXVwKSB0aGF0IHdpbGwgbWF0Y2ggZm9yIHRoZSBuZXcgaW5wdXQgc291cmNlLgorCQkJICovCisJCQkoeXlfbl9jaGFycykgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnM7CisJCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2lucHV0X2ZpbGUgPSB6Y29uZmluOworCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZmZXJfc3RhdHVzID0gWVlfQlVGRkVSX05PUk1BTDsKKwkJCX0KKworCQkvKiBOb3RlIHRoYXQgaGVyZSB3ZSB0ZXN0IGZvciB5eV9jX2J1Zl9wICI8PSIgdG8gdGhlIHBvc2l0aW9uCisJCSAqIG9mIHRoZSBmaXJzdCBFT0IgaW4gdGhlIGJ1ZmZlciwgc2luY2UgeXlfY19idWZfcCB3aWxsCisJCSAqIGFscmVhZHkgaGF2ZSBiZWVuIGluY3JlbWVudGVkIHBhc3QgdGhlIE5VTCBjaGFyYWN0ZXIKKwkJICogKHNpbmNlIGFsbCBzdGF0ZXMgbWFrZSB0cmFuc2l0aW9ucyBvbiBFT0IgdG8gdGhlCisJCSAqIGVuZC1vZi1idWZmZXIgc3RhdGUpLiAgQ29udHJhc3QgdGhpcyB3aXRoIHRoZSB0ZXN0CisJCSAqIGluIGlucHV0KCkuCisJCSAqLworCQlpZiAoICh5eV9jX2J1Zl9wKSA8PSAmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpXSApCisJCQl7IC8qIFRoaXMgd2FzIHJlYWxseSBhIE5VTC4gKi8KKwkJCXl5X3N0YXRlX3R5cGUgeXlfbmV4dF9zdGF0ZTsKKworCQkJKHl5X2NfYnVmX3ApID0gKHl5dGV4dF9wdHIpICsgeXlfYW1vdW50X29mX21hdGNoZWRfdGV4dDsKKworCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X2dldF9wcmV2aW91c19zdGF0ZSggICk7CisKKwkJCS8qIE9rYXksIHdlJ3JlIG5vdyBwb3NpdGlvbmVkIHRvIG1ha2UgdGhlIE5VTAorCQkJICogdHJhbnNpdGlvbi4gIFdlIGNvdWxkbid0IGhhdmUKKwkJCSAqIHl5X2dldF9wcmV2aW91c19zdGF0ZSgpIGdvIGFoZWFkIGFuZCBkbyBpdAorCQkJICogZm9yIHVzIGJlY2F1c2UgaXQgZG9lc24ndCBrbm93IGhvdyB0byBkZWFsCisJCQkgKiB3aXRoIHRoZSBwb3NzaWJpbGl0eSBvZiBqYW1taW5nIChhbmQgd2UgZG9uJ3QKKwkJCSAqIHdhbnQgdG8gYnVpbGQgamFtbWluZyBpbnRvIGl0IGJlY2F1c2UgdGhlbiBpdAorCQkJICogd2lsbCBydW4gbW9yZSBzbG93bHkpLgorCQkJICovCisKKwkJCXl5X25leHRfc3RhdGUgPSB5eV90cnlfTlVMX3RyYW5zKCB5eV9jdXJyZW50X3N0YXRlICk7CisKKwkJCXl5X2JwID0gKHl5dGV4dF9wdHIpICsgWVlfTU9SRV9BREo7CisKKwkJCWlmICggeXlfbmV4dF9zdGF0ZSApCisJCQkJeworCQkJCS8qIENvbnN1bWUgdGhlIE5VTC4gKi8KKwkJCQl5eV9jcCA9ICsrKHl5X2NfYnVmX3ApOworCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9uZXh0X3N0YXRlOworCQkJCWdvdG8geXlfbWF0Y2g7CisJCQkJfQorCisJCQllbHNlCisJCQkJeworCQkJCXl5X2NwID0gKHl5X2NfYnVmX3ApOworCQkJCWdvdG8geXlfZmluZF9hY3Rpb247CisJCQkJfQorCQkJfQorCisJCWVsc2Ugc3dpdGNoICggeXlfZ2V0X25leHRfYnVmZmVyKCAgKSApCisJCQl7CisJCQljYXNlIEVPQl9BQ1RfRU5EX09GX0ZJTEU6CisJCQkJeworCQkJCSh5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YpID0gMDsKKworCQkJCWlmICggemNvbmZ3cmFwKCApICkKKwkJCQkJeworCQkJCQkvKiBOb3RlOiBiZWNhdXNlIHdlJ3ZlIHRha2VuIGNhcmUgaW4KKwkJCQkJICogeXlfZ2V0X25leHRfYnVmZmVyKCkgdG8gaGF2ZSBzZXQgdXAKKwkJCQkJICogemNvbmZ0ZXh0LCB3ZSBjYW4gbm93IHNldCB1cAorCQkJCQkgKiB5eV9jX2J1Zl9wIHNvIHRoYXQgaWYgc29tZSB0b3RhbAorCQkJCQkgKiBob3NlciAobGlrZSBmbGV4IGl0c2VsZikgd2FudHMgdG8KKwkJCQkJICogY2FsbCB0aGUgc2Nhbm5lciBhZnRlciB3ZSByZXR1cm4gdGhlCisJCQkJCSAqIFlZX05VTEwsIGl0J2xsIHN0aWxsIHdvcmsgLSBhbm90aGVyCisJCQkJCSAqIFlZX05VTEwgd2lsbCBnZXQgcmV0dXJuZWQuCisJCQkJCSAqLworCQkJCQkoeXlfY19idWZfcCkgPSAoeXl0ZXh0X3B0cikgKyBZWV9NT1JFX0FESjsKKworCQkJCQl5eV9hY3QgPSBZWV9TVEFURV9FT0YoWVlfU1RBUlQpOworCQkJCQlnb3RvIGRvX2FjdGlvbjsKKwkJCQkJfQorCisJCQkJZWxzZQorCQkJCQl7CisJCQkJCWlmICggISAoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSApCisJCQkJCQlZWV9ORVdfRklMRTsKKwkJCQkJfQorCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBFT0JfQUNUX0NPTlRJTlVFX1NDQU46CisJCQkJKHl5X2NfYnVmX3ApID0KKwkJCQkJKHl5dGV4dF9wdHIpICsgeXlfYW1vdW50X29mX21hdGNoZWRfdGV4dDsKKworCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9nZXRfcHJldmlvdXNfc3RhdGUoICApOworCisJCQkJeXlfY3AgPSAoeXlfY19idWZfcCk7CisJCQkJeXlfYnAgPSAoeXl0ZXh0X3B0cikgKyBZWV9NT1JFX0FESjsKKwkJCQlnb3RvIHl5X21hdGNoOworCisJCQljYXNlIEVPQl9BQ1RfTEFTVF9NQVRDSDoKKwkJCQkoeXlfY19idWZfcCkgPQorCQkJCSZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycyldOworCisJCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X2dldF9wcmV2aW91c19zdGF0ZSggICk7CisKKwkJCQl5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKKwkJCQl5eV9icCA9ICh5eXRleHRfcHRyKSArIFlZX01PUkVfQURKOworCQkJCWdvdG8geXlfZmluZF9hY3Rpb247CisJCQl9CisJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQlZWV9GQVRBTF9FUlJPUigKKwkJCSJmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLW5vIGFjdGlvbiBmb3VuZCIgKTsKKwl9IC8qIGVuZCBvZiBhY3Rpb24gc3dpdGNoICovCisJCX0gLyogZW5kIG9mIHNjYW5uaW5nIG9uZSB0b2tlbiAqLworfSAvKiBlbmQgb2YgemNvbmZsZXggKi8KKworLyogeXlfZ2V0X25leHRfYnVmZmVyIC0gdHJ5IHRvIHJlYWQgaW4gYSBuZXcgYnVmZmVyCisgKgorICogUmV0dXJucyBhIGNvZGUgcmVwcmVzZW50aW5nIGFuIGFjdGlvbjoKKyAqCUVPQl9BQ1RfTEFTVF9NQVRDSCAtCisgKglFT0JfQUNUX0NPTlRJTlVFX1NDQU4gLSBjb250aW51ZSBzY2FubmluZyBmcm9tIGN1cnJlbnQgcG9zaXRpb24KKyAqCUVPQl9BQ1RfRU5EX09GX0ZJTEUgLSBlbmQgb2YgZmlsZQorICovCitzdGF0aWMgaW50IHl5X2dldF9uZXh0X2J1ZmZlciAodm9pZCkKK3sKKyAgICAJcmVnaXN0ZXIgY2hhciAqZGVzdCA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmOworCXJlZ2lzdGVyIGNoYXIgKnNvdXJjZSA9ICh5eXRleHRfcHRyKTsKKwlyZWdpc3RlciBpbnQgbnVtYmVyX3RvX21vdmUsIGk7CisJaW50IHJldF92YWw7CisKKwlpZiAoICh5eV9jX2J1Zl9wKSA+ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycykgKyAxXSApCisJCVlZX0ZBVEFMX0VSUk9SKAorCQkiZmF0YWwgZmxleCBzY2FubmVyIGludGVybmFsIGVycm9yLS1lbmQgb2YgYnVmZmVyIG1pc3NlZCIgKTsKKworCWlmICggWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9maWxsX2J1ZmZlciA9PSAwICkKKwkJeyAvKiBEb24ndCB0cnkgdG8gZmlsbCB0aGUgYnVmZmVyLCBzbyB0aGlzIGlzIGFuIEVPRi4gKi8KKwkJaWYgKCAoeXlfY19idWZfcCkgLSAoeXl0ZXh0X3B0cikgLSBZWV9NT1JFX0FESiA9PSAxICkKKwkJCXsKKwkJCS8qIFdlIG1hdGNoZWQgYSBzaW5nbGUgY2hhcmFjdGVyLCB0aGUgRU9CLCBzbworCQkJICogdHJlYXQgdGhpcyBhcyBhIGZpbmFsIEVPRi4KKwkJCSAqLworCQkJcmV0dXJuIEVPQl9BQ1RfRU5EX09GX0ZJTEU7CisJCQl9CisKKwkJZWxzZQorCQkJeworCQkJLyogV2UgbWF0Y2hlZCBzb21lIHRleHQgcHJpb3IgdG8gdGhlIEVPQiwgZmlyc3QKKwkJCSAqIHByb2Nlc3MgaXQuCisJCQkgKi8KKwkJCXJldHVybiBFT0JfQUNUX0xBU1RfTUFUQ0g7CisJCQl9CisJCX0KKworCS8qIFRyeSB0byByZWFkIG1vcmUgZGF0YS4gKi8KKworCS8qIEZpcnN0IG1vdmUgbGFzdCBjaGFycyB0byBzdGFydCBvZiBidWZmZXIuICovCisJbnVtYmVyX3RvX21vdmUgPSAoaW50KSAoKHl5X2NfYnVmX3ApIC0gKHl5dGV4dF9wdHIpKSAtIDE7CisKKwlmb3IgKCBpID0gMDsgaSA8IG51bWJlcl90b19tb3ZlOyArK2kgKQorCQkqKGRlc3QrKykgPSAqKHNvdXJjZSsrKTsKKworCWlmICggWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZmZXJfc3RhdHVzID09IFlZX0JVRkZFUl9FT0ZfUEVORElORyApCisJCS8qIGRvbid0IGRvIHRoZSByZWFkLCBpdCdzIG5vdCBndWFyYW50ZWVkIHRvIHJldHVybiBhbiBFT0YsCisJCSAqIGp1c3QgZm9yY2UgYW4gRU9GCisJCSAqLworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnMgPSAoeXlfbl9jaGFycykgPSAwOworCisJZWxzZQorCQl7CisJCQlzaXplX3QgbnVtX3RvX3JlYWQgPQorCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfc2l6ZSAtIG51bWJlcl90b19tb3ZlIC0gMTsKKworCQl3aGlsZSAoIG51bV90b19yZWFkIDw9IDAgKQorCQkJeyAvKiBOb3QgZW5vdWdoIHJvb20gaW4gdGhlIGJ1ZmZlciAtIGdyb3cgaXQuICovCisKKwkJCS8qIGp1c3QgYSBzaG9ydGVyIG5hbWUgZm9yIHRoZSBjdXJyZW50IGJ1ZmZlciAqLworCQkJWVlfQlVGRkVSX1NUQVRFIGIgPSBZWV9DVVJSRU5UX0JVRkZFUjsKKworCQkJaW50IHl5X2NfYnVmX3Bfb2Zmc2V0ID0KKwkJCQkoaW50KSAoKHl5X2NfYnVmX3ApIC0gYi0+eXlfY2hfYnVmKTsKKworCQkJaWYgKCBiLT55eV9pc19vdXJfYnVmZmVyICkKKwkJCQl7CisJCQkJaW50IG5ld19zaXplID0gYi0+eXlfYnVmX3NpemUgKiAyOworCisJCQkJaWYgKCBuZXdfc2l6ZSA8PSAwICkKKwkJCQkJYi0+eXlfYnVmX3NpemUgKz0gYi0+eXlfYnVmX3NpemUgLyA4OworCQkJCWVsc2UKKwkJCQkJYi0+eXlfYnVmX3NpemUgKj0gMjsKKworCQkJCWItPnl5X2NoX2J1ZiA9IChjaGFyICopCisJCQkJCS8qIEluY2x1ZGUgcm9vbSBpbiBmb3IgMiBFT0IgY2hhcnMuICovCisJCQkJCXpjb25mcmVhbGxvYygodm9pZCAqKSBiLT55eV9jaF9idWYsYi0+eXlfYnVmX3NpemUgKyAyICApOworCQkJCX0KKwkJCWVsc2UKKwkJCQkvKiBDYW4ndCBncm93IGl0LCB3ZSBkb24ndCBvd24gaXQuICovCisJCQkJYi0+eXlfY2hfYnVmID0gMDsKKworCQkJaWYgKCAhIGItPnl5X2NoX2J1ZiApCisJCQkJWVlfRkFUQUxfRVJST1IoCisJCQkJImZhdGFsIGVycm9yIC0gc2Nhbm5lciBpbnB1dCBidWZmZXIgb3ZlcmZsb3ciICk7CisKKwkJCSh5eV9jX2J1Zl9wKSA9ICZiLT55eV9jaF9idWZbeXlfY19idWZfcF9vZmZzZXRdOworCisJCQludW1fdG9fcmVhZCA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemUgLQorCQkJCQkJbnVtYmVyX3RvX21vdmUgLSAxOworCisJCQl9CisKKwkJaWYgKCBudW1fdG9fcmVhZCA+IFlZX1JFQURfQlVGX1NJWkUgKQorCQkJbnVtX3RvX3JlYWQgPSBZWV9SRUFEX0JVRl9TSVpFOworCisJCS8qIFJlYWQgaW4gbW9yZSBkYXRhLiAqLworCQlZWV9JTlBVVCggKCZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZltudW1iZXJfdG9fbW92ZV0pLAorCQkJKHl5X25fY2hhcnMpLCBudW1fdG9fcmVhZCApOworCisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9ICh5eV9uX2NoYXJzKTsKKwkJfQorCisJaWYgKCAoeXlfbl9jaGFycykgPT0gMCApCisJCXsKKwkJaWYgKCBudW1iZXJfdG9fbW92ZSA9PSBZWV9NT1JFX0FESiApCisJCQl7CisJCQlyZXRfdmFsID0gRU9CX0FDVF9FTkRfT0ZfRklMRTsKKwkJCXpjb25mcmVzdGFydCh6Y29uZmluICApOworCQkJfQorCisJCWVsc2UKKwkJCXsKKwkJCXJldF92YWwgPSBFT0JfQUNUX0xBU1RfTUFUQ0g7CisJCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1ZmZlcl9zdGF0dXMgPQorCQkJCVlZX0JVRkZFUl9FT0ZfUEVORElORzsKKwkJCX0KKwkJfQorCisJZWxzZQorCQlyZXRfdmFsID0gRU9CX0FDVF9DT05USU5VRV9TQ0FOOworCisJKHl5X25fY2hhcnMpICs9IG51bWJlcl90b19tb3ZlOworCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWyh5eV9uX2NoYXJzKV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7CisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpICsgMV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7CisKKwkoeXl0ZXh0X3B0cikgPSAmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbMF07CisKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyogeXlfZ2V0X3ByZXZpb3VzX3N0YXRlIC0gZ2V0IHRoZSBzdGF0ZSBqdXN0IGJlZm9yZSB0aGUgRU9CIGNoYXIgd2FzIHJlYWNoZWQgKi8KKworICAgIHN0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X2dldF9wcmV2aW91c19zdGF0ZSAodm9pZCkKK3sKKwlyZWdpc3RlciB5eV9zdGF0ZV90eXBlIHl5X2N1cnJlbnRfc3RhdGU7CisJcmVnaXN0ZXIgY2hhciAqeXlfY3A7CisKKwl5eV9jdXJyZW50X3N0YXRlID0gKHl5X3N0YXJ0KTsKKworCWZvciAoIHl5X2NwID0gKHl5dGV4dF9wdHIpICsgWVlfTU9SRV9BREo7IHl5X2NwIDwgKHl5X2NfYnVmX3ApOyArK3l5X2NwICkKKwkJeworCQl5eV9jdXJyZW50X3N0YXRlID0geXlfbnh0W3l5X2N1cnJlbnRfc3RhdGVdWygqeXlfY3AgPyB5eV9lY1tZWV9TQ19UT19VSSgqeXlfY3ApXSA6IDEpXTsKKwkJfQorCisJcmV0dXJuIHl5X2N1cnJlbnRfc3RhdGU7Cit9CisKKy8qIHl5X3RyeV9OVUxfdHJhbnMgLSB0cnkgdG8gbWFrZSBhIHRyYW5zaXRpb24gb24gdGhlIE5VTCBjaGFyYWN0ZXIKKyAqCisgKiBzeW5vcHNpcworICoJbmV4dF9zdGF0ZSA9IHl5X3RyeV9OVUxfdHJhbnMoIGN1cnJlbnRfc3RhdGUgKTsKKyAqLworICAgIHN0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X3RyeV9OVUxfdHJhbnMgICh5eV9zdGF0ZV90eXBlIHl5X2N1cnJlbnRfc3RhdGUgKQoreworCXJlZ2lzdGVyIGludCB5eV9pc19qYW07CisKKwl5eV9jdXJyZW50X3N0YXRlID0geXlfbnh0W3l5X2N1cnJlbnRfc3RhdGVdWzFdOworCXl5X2lzX2phbSA9ICh5eV9jdXJyZW50X3N0YXRlIDw9IDApOworCisJcmV0dXJuIHl5X2lzX2phbSA/IDAgOiB5eV9jdXJyZW50X3N0YXRlOworfQorCisgICAgc3RhdGljIHZvaWQgeXl1bnB1dCAoaW50IGMsIHJlZ2lzdGVyIGNoYXIgKiB5eV9icCApCit7CisJcmVnaXN0ZXIgY2hhciAqeXlfY3A7CisKKyAgICB5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKKworCS8qIHVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHpjb25mdGV4dCAqLworCSp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOworCisJaWYgKCB5eV9jcCA8IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmICsgMiApCisJCXsgLyogbmVlZCB0byBzaGlmdCB0aGluZ3MgdXAgdG8gbWFrZSByb29tICovCisJCS8qICsyIGZvciBFT0IgY2hhcnMuICovCisJCXJlZ2lzdGVyIGludCBudW1iZXJfdG9fbW92ZSA9ICh5eV9uX2NoYXJzKSArIDI7CisJCXJlZ2lzdGVyIGNoYXIgKmRlc3QgPSAmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbCisJCQkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemUgKyAyXTsKKwkJcmVnaXN0ZXIgY2hhciAqc291cmNlID0KKwkJCQkmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbbnVtYmVyX3RvX21vdmVdOworCisJCXdoaWxlICggc291cmNlID4gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWYgKQorCQkJKi0tZGVzdCA9ICotLXNvdXJjZTsKKworCQl5eV9jcCArPSAoaW50KSAoZGVzdCAtIHNvdXJjZSk7CisJCXl5X2JwICs9IChpbnQpIChkZXN0IC0gc291cmNlKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0KKwkJCSh5eV9uX2NoYXJzKSA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemU7CisKKwkJaWYgKCB5eV9jcCA8IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmICsgMiApCisJCQlZWV9GQVRBTF9FUlJPUiggImZsZXggc2Nhbm5lciBwdXNoLWJhY2sgb3ZlcmZsb3ciICk7CisJCX0KKworCSotLXl5X2NwID0gKGNoYXIpIGM7CisKKwkoeXl0ZXh0X3B0cikgPSB5eV9icDsKKwkoeXlfaG9sZF9jaGFyKSA9ICp5eV9jcDsKKwkoeXlfY19idWZfcCkgPSB5eV9jcDsKK30KKworI2lmbmRlZiBZWV9OT19JTlBVVAorI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgc3RhdGljIGludCB5eWlucHV0ICh2b2lkKQorI2Vsc2UKKyAgICBzdGF0aWMgaW50IGlucHV0ICAodm9pZCkKKyNlbmRpZgorCit7CisJaW50IGM7CisKKwkqKHl5X2NfYnVmX3ApID0gKHl5X2hvbGRfY2hhcik7CisKKwlpZiAoICooeXlfY19idWZfcCkgPT0gWVlfRU5EX09GX0JVRkZFUl9DSEFSICkKKwkJeworCQkvKiB5eV9jX2J1Zl9wIG5vdyBwb2ludHMgdG8gdGhlIGNoYXJhY3RlciB3ZSB3YW50IHRvIHJldHVybi4KKwkJICogSWYgdGhpcyBvY2N1cnMgKmJlZm9yZSogdGhlIEVPQiBjaGFyYWN0ZXJzLCB0aGVuIGl0J3MgYQorCQkgKiB2YWxpZCBOVUw7IGlmIG5vdCwgdGhlbiB3ZSd2ZSBoaXQgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorCQkgKi8KKwkJaWYgKCAoeXlfY19idWZfcCkgPCAmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpXSApCisJCQkvKiBUaGlzIHdhcyByZWFsbHkgYSBOVUwuICovCisJCQkqKHl5X2NfYnVmX3ApID0gJ1wwJzsKKworCQllbHNlCisJCQl7IC8qIG5lZWQgbW9yZSBpbnB1dCAqLworCQkJaW50IG9mZnNldCA9ICh5eV9jX2J1Zl9wKSAtICh5eXRleHRfcHRyKTsKKwkJCSsrKHl5X2NfYnVmX3ApOworCisJCQlzd2l0Y2ggKCB5eV9nZXRfbmV4dF9idWZmZXIoICApICkKKwkJCQl7CisJCQkJY2FzZSBFT0JfQUNUX0xBU1RfTUFUQ0g6CisJCQkJCS8qIFRoaXMgaGFwcGVucyBiZWNhdXNlIHl5X2dfbl9iKCkKKwkJCQkJICogc2VlcyB0aGF0IHdlJ3ZlIGFjY3VtdWxhdGVkIGEKKwkJCQkJICogdG9rZW4gYW5kIGZsYWdzIHRoYXQgd2UgbmVlZCB0bworCQkJCQkgKiB0cnkgbWF0Y2hpbmcgdGhlIHRva2VuIGJlZm9yZQorCQkJCQkgKiBwcm9jZWVkaW5nLiAgQnV0IGZvciBpbnB1dCgpLAorCQkJCQkgKiB0aGVyZSdzIG5vIG1hdGNoaW5nIHRvIGNvbnNpZGVyLgorCQkJCQkgKiBTbyBjb252ZXJ0IHRoZSBFT0JfQUNUX0xBU1RfTUFUQ0gKKwkJCQkJICogdG8gRU9CX0FDVF9FTkRfT0ZfRklMRS4KKwkJCQkJICovCisKKwkJCQkJLyogUmVzZXQgYnVmZmVyIHN0YXR1cy4gKi8KKwkJCQkJemNvbmZyZXN0YXJ0KHpjb25maW4gKTsKKworCQkJCQkvKkZBTExUSFJPVUdIKi8KKworCQkJCWNhc2UgRU9CX0FDVF9FTkRfT0ZfRklMRToKKwkJCQkJeworCQkJCQlpZiAoIHpjb25md3JhcCggKSApCisJCQkJCQlyZXR1cm4gRU9GOworCisJCQkJCWlmICggISAoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSApCisJCQkJCQlZWV9ORVdfRklMRTsKKyNpZmRlZiBfX2NwbHVzcGx1cworCQkJCQlyZXR1cm4geXlpbnB1dCgpOworI2Vsc2UKKwkJCQkJcmV0dXJuIGlucHV0KCk7CisjZW5kaWYKKwkJCQkJfQorCisJCQkJY2FzZSBFT0JfQUNUX0NPTlRJTlVFX1NDQU46CisJCQkJCSh5eV9jX2J1Zl9wKSA9ICh5eXRleHRfcHRyKSArIG9mZnNldDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQl9CisKKwljID0gKih1bnNpZ25lZCBjaGFyICopICh5eV9jX2J1Zl9wKTsJLyogY2FzdCBmb3IgOC1iaXQgY2hhcidzICovCisJKih5eV9jX2J1Zl9wKSA9ICdcMCc7CS8qIHByZXNlcnZlIHpjb25mdGV4dCAqLworCSh5eV9ob2xkX2NoYXIpID0gKisrKHl5X2NfYnVmX3ApOworCisJcmV0dXJuIGM7Cit9CisjZW5kaWYJLyogaWZuZGVmIFlZX05PX0lOUFVUICovCisKKy8qKiBJbW1lZGlhdGVseSBzd2l0Y2ggdG8gYSBkaWZmZXJlbnQgaW5wdXQgc3RyZWFtLgorICogQHBhcmFtIGlucHV0X2ZpbGUgQSByZWFkYWJsZSBzdHJlYW0uCisgKgorICogQG5vdGUgVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXNldCB0aGUgc3RhcnQgY29uZGl0aW9uIHRvIEBjIElOSVRJQUwgLgorICovCisgICAgdm9pZCB6Y29uZnJlc3RhcnQgIChGSUxFICogaW5wdXRfZmlsZSApCit7CisKKwlpZiAoICEgWVlfQ1VSUkVOVF9CVUZGRVIgKXsKKyAgICAgICAgemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrICgpOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPQorICAgICAgICAgICAgemNvbmZfY3JlYXRlX2J1ZmZlcih6Y29uZmluLFlZX0JVRl9TSVpFICk7CisJfQorCisJemNvbmZfaW5pdF9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIsaW5wdXRfZmlsZSApOworCXpjb25mX2xvYWRfYnVmZmVyX3N0YXRlKCApOworfQorCisvKiogU3dpdGNoIHRvIGEgZGlmZmVyZW50IGlucHV0IGJ1ZmZlci4KKyAqIEBwYXJhbSBuZXdfYnVmZmVyIFRoZSBuZXcgaW5wdXQgYnVmZmVyLgorICoKKyAqLworICAgIHZvaWQgemNvbmZfc3dpdGNoX3RvX2J1ZmZlciAgKFlZX0JVRkZFUl9TVEFURSAgbmV3X2J1ZmZlciApCit7CisKKwkvKiBUT0RPLiBXZSBzaG91bGQgYmUgYWJsZSB0byByZXBsYWNlIHRoaXMgZW50aXJlIGZ1bmN0aW9uIGJvZHkKKwkgKiB3aXRoCisJICoJCXpjb25mcG9wX2J1ZmZlcl9zdGF0ZSgpOworCSAqCQl6Y29uZnB1c2hfYnVmZmVyX3N0YXRlKG5ld19idWZmZXIpOworICAgICAqLworCXpjb25mZW5zdXJlX2J1ZmZlcl9zdGFjayAoKTsKKwlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSID09IG5ld19idWZmZXIgKQorCQlyZXR1cm47CisKKwlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSICkKKwkJeworCQkvKiBGbHVzaCBvdXQgaW5mb3JtYXRpb24gZm9yIG9sZCBidWZmZXIuICovCisJCSooeXlfY19idWZfcCkgPSAoeXlfaG9sZF9jaGFyKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfcG9zID0gKHl5X2NfYnVmX3ApOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnMgPSAoeXlfbl9jaGFycyk7CisJCX0KKworCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IG5ld19idWZmZXI7CisJemNvbmZfbG9hZF9idWZmZXJfc3RhdGUoICk7CisKKwkvKiBXZSBkb24ndCBhY3R1YWxseSBrbm93IHdoZXRoZXIgd2UgZGlkIHRoaXMgc3dpdGNoIGR1cmluZworCSAqIEVPRiAoemNvbmZ3cmFwKCkpIHByb2Nlc3NpbmcsIGJ1dCB0aGUgb25seSB0aW1lIHRoaXMgZmxhZworCSAqIGlzIGxvb2tlZCBhdCBpcyBhZnRlciB6Y29uZndyYXAoKSBpcyBjYWxsZWQsIHNvIGl0J3Mgc2FmZQorCSAqIHRvIGdvIGFoZWFkIGFuZCBhbHdheXMgc2V0IGl0LgorCSAqLworCSh5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YpID0gMTsKK30KKworc3RhdGljIHZvaWQgemNvbmZfbG9hZF9idWZmZXJfc3RhdGUgICh2b2lkKQoreworICAgIAkoeXlfbl9jaGFycykgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnM7CisJKHl5dGV4dF9wdHIpID0gKHl5X2NfYnVmX3ApID0gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfcG9zOworCXpjb25maW4gPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2lucHV0X2ZpbGU7CisJKHl5X2hvbGRfY2hhcikgPSAqKHl5X2NfYnVmX3ApOworfQorCisvKiogQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYW4gaW5wdXQgYnVmZmVyIHN0YXRlLgorICogQHBhcmFtIGZpbGUgQSByZWFkYWJsZSBzdHJlYW0uCisgKiBAcGFyYW0gc2l6ZSBUaGUgY2hhcmFjdGVyIGJ1ZmZlciBzaXplIGluIGJ5dGVzLiBXaGVuIGluIGRvdWJ0LCB1c2UgQGMgWVlfQlVGX1NJWkUuCisgKgorICogQHJldHVybiB0aGUgYWxsb2NhdGVkIGJ1ZmZlciBzdGF0ZS4KKyAqLworICAgIFlZX0JVRkZFUl9TVEFURSB6Y29uZl9jcmVhdGVfYnVmZmVyICAoRklMRSAqIGZpbGUsIGludCAgc2l6ZSApCit7CisJWVlfQlVGRkVSX1NUQVRFIGI7CisKKwliID0gKFlZX0JVRkZFUl9TVEFURSkgemNvbmZhbGxvYyhzaXplb2YoIHN0cnVjdCB5eV9idWZmZXJfc3RhdGUgKSAgKTsKKwlpZiAoICEgYiApCisJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHpjb25mX2NyZWF0ZV9idWZmZXIoKSIgKTsKKworCWItPnl5X2J1Zl9zaXplID0gc2l6ZTsKKworCS8qIHl5X2NoX2J1ZiBoYXMgdG8gYmUgMiBjaGFyYWN0ZXJzIGxvbmdlciB0aGFuIHRoZSBzaXplIGdpdmVuIGJlY2F1c2UKKwkgKiB3ZSBuZWVkIHRvIHB1dCBpbiAyIGVuZC1vZi1idWZmZXIgY2hhcmFjdGVycy4KKwkgKi8KKwliLT55eV9jaF9idWYgPSAoY2hhciAqKSB6Y29uZmFsbG9jKGItPnl5X2J1Zl9zaXplICsgMiAgKTsKKwlpZiAoICEgYi0+eXlfY2hfYnVmICkKKwkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4gemNvbmZfY3JlYXRlX2J1ZmZlcigpIiApOworCisJYi0+eXlfaXNfb3VyX2J1ZmZlciA9IDE7CisKKwl6Y29uZl9pbml0X2J1ZmZlcihiLGZpbGUgKTsKKworCXJldHVybiBiOworfQorCisvKiogRGVzdHJveSB0aGUgYnVmZmVyLgorICogQHBhcmFtIGIgYSBidWZmZXIgY3JlYXRlZCB3aXRoIHpjb25mX2NyZWF0ZV9idWZmZXIoKQorICoKKyAqLworICAgIHZvaWQgemNvbmZfZGVsZXRlX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFICBiICkKK3sKKworCWlmICggISBiICkKKwkJcmV0dXJuOworCisJaWYgKCBiID09IFlZX0NVUlJFTlRfQlVGRkVSICkgLyogTm90IHN1cmUgaWYgd2Ugc2hvdWxkIHBvcCBoZXJlLiAqLworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSAoWVlfQlVGRkVSX1NUQVRFKSAwOworCisJaWYgKCBiLT55eV9pc19vdXJfYnVmZmVyICkKKwkJemNvbmZmcmVlKCh2b2lkICopIGItPnl5X2NoX2J1ZiAgKTsKKworCXpjb25mZnJlZSgodm9pZCAqKSBiICApOworfQorCisvKiBJbml0aWFsaXplcyBvciByZWluaXRpYWxpemVzIGEgYnVmZmVyLgorICogVGhpcyBmdW5jdGlvbiBpcyBzb21ldGltZXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIGJ1ZmZlciwKKyAqIHN1Y2ggYXMgZHVyaW5nIGEgemNvbmZyZXN0YXJ0KCkgb3IgYXQgRU9GLgorICovCisgICAgc3RhdGljIHZvaWQgemNvbmZfaW5pdF9idWZmZXIgIChZWV9CVUZGRVJfU1RBVEUgIGIsIEZJTEUgKiBmaWxlICkKKworeworCWludCBvZXJybm8gPSBlcnJubzsKKworCXpjb25mX2ZsdXNoX2J1ZmZlcihiICk7CisKKwliLT55eV9pbnB1dF9maWxlID0gZmlsZTsKKwliLT55eV9maWxsX2J1ZmZlciA9IDE7CisKKyAgICAvKiBJZiBiIGlzIHRoZSBjdXJyZW50IGJ1ZmZlciwgdGhlbiB6Y29uZl9pbml0X2J1ZmZlciB3YXMgX3Byb2JhYmx5XworICAgICAqIGNhbGxlZCBmcm9tIHpjb25mcmVzdGFydCgpIG9yIHRocm91Z2ggeXlfZ2V0X25leHRfYnVmZmVyLgorICAgICAqIEluIHRoYXQgY2FzZSwgd2UgZG9uJ3Qgd2FudCB0byByZXNldCB0aGUgbGluZW5vIG9yIGNvbHVtbi4KKyAgICAgKi8KKyAgICBpZiAoYiAhPSBZWV9DVVJSRU5UX0JVRkZFUil7CisgICAgICAgIGItPnl5X2JzX2xpbmVubyA9IDE7CisgICAgICAgIGItPnl5X2JzX2NvbHVtbiA9IDA7CisgICAgfQorCisgICAgICAgIGItPnl5X2lzX2ludGVyYWN0aXZlID0gMDsKKworCWVycm5vID0gb2Vycm5vOworfQorCisvKiogRGlzY2FyZCBhbGwgYnVmZmVyZWQgY2hhcmFjdGVycy4gT24gdGhlIG5leHQgc2NhbiwgWVlfSU5QVVQgd2lsbCBiZSBjYWxsZWQuCisgKiBAcGFyYW0gYiB0aGUgYnVmZmVyIHN0YXRlIHRvIGJlIGZsdXNoZWQsIHVzdWFsbHkgQGMgWVlfQ1VSUkVOVF9CVUZGRVIuCisgKgorICovCisgICAgdm9pZCB6Y29uZl9mbHVzaF9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSAgYiApCit7CisgICAgCWlmICggISBiICkKKwkJcmV0dXJuOworCisJYi0+eXlfbl9jaGFycyA9IDA7CisKKwkvKiBXZSBhbHdheXMgbmVlZCB0d28gZW5kLW9mLWJ1ZmZlciBjaGFyYWN0ZXJzLiAgVGhlIGZpcnN0IGNhdXNlcworCSAqIGEgdHJhbnNpdGlvbiB0byB0aGUgZW5kLW9mLWJ1ZmZlciBzdGF0ZS4gIFRoZSBzZWNvbmQgY2F1c2VzCisJICogYSBqYW0gaW4gdGhhdCBzdGF0ZS4KKwkgKi8KKwliLT55eV9jaF9idWZbMF0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7CisJYi0+eXlfY2hfYnVmWzFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworCisJYi0+eXlfYnVmX3BvcyA9ICZiLT55eV9jaF9idWZbMF07CisKKwliLT55eV9hdF9ib2wgPSAxOworCWItPnl5X2J1ZmZlcl9zdGF0dXMgPSBZWV9CVUZGRVJfTkVXOworCisJaWYgKCBiID09IFlZX0NVUlJFTlRfQlVGRkVSICkKKwkJemNvbmZfbG9hZF9idWZmZXJfc3RhdGUoICk7Cit9CisKKy8qKiBQdXNoZXMgdGhlIG5ldyBzdGF0ZSBvbnRvIHRoZSBzdGFjay4gVGhlIG5ldyBzdGF0ZSBiZWNvbWVzCisgKiAgdGhlIGN1cnJlbnQgc3RhdGUuIFRoaXMgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZSB0aGUgc3RhY2sKKyAqICBpZiBuZWNlc3NhcnkuCisgKiAgQHBhcmFtIG5ld19idWZmZXIgVGhlIG5ldyBzdGF0ZS4KKyAqCisgKi8KK3ZvaWQgemNvbmZwdXNoX2J1ZmZlcl9zdGF0ZSAoWVlfQlVGRkVSX1NUQVRFIG5ld19idWZmZXIgKQoreworICAgIAlpZiAobmV3X2J1ZmZlciA9PSBOVUxMKQorCQlyZXR1cm47CisKKwl6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2soKTsKKworCS8qIFRoaXMgYmxvY2sgaXMgY29waWVkIGZyb20gemNvbmZfc3dpdGNoX3RvX2J1ZmZlci4gKi8KKwlpZiAoIFlZX0NVUlJFTlRfQlVGRkVSICkKKwkJeworCQkvKiBGbHVzaCBvdXQgaW5mb3JtYXRpb24gZm9yIG9sZCBidWZmZXIuICovCisJCSooeXlfY19idWZfcCkgPSAoeXlfaG9sZF9jaGFyKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfcG9zID0gKHl5X2NfYnVmX3ApOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnMgPSAoeXlfbl9jaGFycyk7CisJCX0KKworCS8qIE9ubHkgcHVzaCBpZiB0b3AgZXhpc3RzLiBPdGhlcndpc2UsIHJlcGxhY2UgdG9wLiAqLworCWlmIChZWV9DVVJSRU5UX0JVRkZFUikKKwkJKHl5X2J1ZmZlcl9zdGFja190b3ApKys7CisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gbmV3X2J1ZmZlcjsKKworCS8qIGNvcGllZCBmcm9tIHpjb25mX3N3aXRjaF90b19idWZmZXIuICovCisJemNvbmZfbG9hZF9idWZmZXJfc3RhdGUoICk7CisJKHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZikgPSAxOworfQorCisvKiogUmVtb3ZlcyBhbmQgZGVsZXRlcyB0aGUgdG9wIG9mIHRoZSBzdGFjaywgaWYgcHJlc2VudC4KKyAqICBUaGUgbmV4dCBlbGVtZW50IGJlY29tZXMgdGhlIG5ldyB0b3AuCisgKgorICovCit2b2lkIHpjb25mcG9wX2J1ZmZlcl9zdGF0ZSAodm9pZCkKK3sKKyAgICAJaWYgKCFZWV9DVVJSRU5UX0JVRkZFUikKKwkJcmV0dXJuOworCisJemNvbmZfZGVsZXRlX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUiApOworCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IE5VTEw7CisJaWYgKCh5eV9idWZmZXJfc3RhY2tfdG9wKSA+IDApCisJCS0tKHl5X2J1ZmZlcl9zdGFja190b3ApOworCisJaWYgKFlZX0NVUlJFTlRfQlVGRkVSKSB7CisJCXpjb25mX2xvYWRfYnVmZmVyX3N0YXRlKCApOworCQkoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSA9IDE7CisJfQorfQorCisvKiBBbGxvY2F0ZXMgdGhlIHN0YWNrIGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICogIEd1YXJhbnRlZXMgc3BhY2UgZm9yIGF0IGxlYXN0IG9uZSBwdXNoLgorICovCitzdGF0aWMgdm9pZCB6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2sgKHZvaWQpCit7CisJaW50IG51bV90b19hbGxvYzsKKworCWlmICghKHl5X2J1ZmZlcl9zdGFjaykpIHsKKworCQkvKiBGaXJzdCBhbGxvY2F0aW9uIGlzIGp1c3QgZm9yIDIgZWxlbWVudHMsIHNpbmNlIHdlIGRvbid0IGtub3cgaWYgdGhpcworCQkgKiBzY2FubmVyIHdpbGwgZXZlbiBuZWVkIGEgc3RhY2suIFdlIHVzZSAyIGluc3RlYWQgb2YgMSB0byBhdm9pZCBhbgorCQkgKiBpbW1lZGlhdGUgcmVhbGxvYyBvbiB0aGUgbmV4dCBjYWxsLgorICAgICAgICAgKi8KKwkJbnVtX3RvX2FsbG9jID0gMTsKKwkJKHl5X2J1ZmZlcl9zdGFjaykgPSAoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSoqKXpjb25mYWxsb2MKKwkJCQkJCQkJKG51bV90b19hbGxvYyAqIHNpemVvZihzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKikKKwkJCQkJCQkJKTsKKworCQltZW1zZXQoKHl5X2J1ZmZlcl9zdGFjayksIDAsIG51bV90b19hbGxvYyAqIHNpemVvZihzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKikpOworCisJCSh5eV9idWZmZXJfc3RhY2tfbWF4KSA9IG51bV90b19hbGxvYzsKKwkJKHl5X2J1ZmZlcl9zdGFja190b3ApID0gMDsKKwkJcmV0dXJuOworCX0KKworCWlmICgoeXlfYnVmZmVyX3N0YWNrX3RvcCkgPj0gKCh5eV9idWZmZXJfc3RhY2tfbWF4KSkgLSAxKXsKKworCQkvKiBJbmNyZWFzZSB0aGUgYnVmZmVyIHRvIHByZXBhcmUgZm9yIGEgcG9zc2libGUgcHVzaC4gKi8KKwkJaW50IGdyb3dfc2l6ZSA9IDggLyogYXJiaXRyYXJ5IGdyb3cgc2l6ZSAqLzsKKworCQludW1fdG9fYWxsb2MgPSAoeXlfYnVmZmVyX3N0YWNrX21heCkgKyBncm93X3NpemU7CisJCSh5eV9idWZmZXJfc3RhY2spID0gKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKil6Y29uZnJlYWxsb2MKKwkJCQkJCQkJKCh5eV9idWZmZXJfc3RhY2spLAorCQkJCQkJCQludW1fdG9fYWxsb2MgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopCisJCQkJCQkJCSk7CisKKwkJLyogemVybyBvbmx5IHRoZSBuZXcgc2xvdHMuKi8KKwkJbWVtc2V0KCh5eV9idWZmZXJfc3RhY2spICsgKHl5X2J1ZmZlcl9zdGFja19tYXgpLCAwLCBncm93X3NpemUgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopKTsKKwkJKHl5X2J1ZmZlcl9zdGFja19tYXgpID0gbnVtX3RvX2FsbG9jOworCX0KK30KKworLyoqIFNldHVwIHRoZSBpbnB1dCBidWZmZXIgc3RhdGUgdG8gc2NhbiBkaXJlY3RseSBmcm9tIGEgdXNlci1zcGVjaWZpZWQgY2hhcmFjdGVyIGJ1ZmZlci4KKyAqIEBwYXJhbSBiYXNlIHRoZSBjaGFyYWN0ZXIgYnVmZmVyCisgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgY2hhcmFjdGVyIGJ1ZmZlcgorICoKKyAqIEByZXR1cm4gdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgc3RhdGUgb2JqZWN0LgorICovCitZWV9CVUZGRVJfU1RBVEUgemNvbmZfc2Nhbl9idWZmZXIgIChjaGFyICogYmFzZSwgeXlfc2l6ZV90ICBzaXplICkKK3sKKwlZWV9CVUZGRVJfU1RBVEUgYjsKKworCWlmICggc2l6ZSA8IDIgfHwKKwkgICAgIGJhc2Vbc2l6ZS0yXSAhPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVIgfHwKKwkgICAgIGJhc2Vbc2l6ZS0xXSAhPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVIgKQorCQkvKiBUaGV5IGZvcmdvdCB0byBsZWF2ZSByb29tIGZvciB0aGUgRU9CJ3MuICovCisJCXJldHVybiAwOworCisJYiA9IChZWV9CVUZGRVJfU1RBVEUpIHpjb25mYWxsb2Moc2l6ZW9mKCBzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlICkgICk7CisJaWYgKCAhIGIgKQorCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB6Y29uZl9zY2FuX2J1ZmZlcigpIiApOworCisJYi0+eXlfYnVmX3NpemUgPSBzaXplIC0gMjsJLyogIi0gMiIgdG8gdGFrZSBjYXJlIG9mIEVPQidzICovCisJYi0+eXlfYnVmX3BvcyA9IGItPnl5X2NoX2J1ZiA9IGJhc2U7CisJYi0+eXlfaXNfb3VyX2J1ZmZlciA9IDA7CisJYi0+eXlfaW5wdXRfZmlsZSA9IDA7CisJYi0+eXlfbl9jaGFycyA9IGItPnl5X2J1Zl9zaXplOworCWItPnl5X2lzX2ludGVyYWN0aXZlID0gMDsKKwliLT55eV9hdF9ib2wgPSAxOworCWItPnl5X2ZpbGxfYnVmZmVyID0gMDsKKwliLT55eV9idWZmZXJfc3RhdHVzID0gWVlfQlVGRkVSX05FVzsKKworCXpjb25mX3N3aXRjaF90b19idWZmZXIoYiAgKTsKKworCXJldHVybiBiOworfQorCisvKiogU2V0dXAgdGhlIGlucHV0IGJ1ZmZlciBzdGF0ZSB0byBzY2FuIGEgc3RyaW5nLiBUaGUgbmV4dCBjYWxsIHRvIHpjb25mbGV4KCkgd2lsbAorICogc2NhbiBmcm9tIGEgQGUgY29weSBvZiBAYSBzdHIuCisgKiBAcGFyYW0geXlfc3RyIGEgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIHNjYW4KKyAqCisgKiBAcmV0dXJuIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHN0YXRlIG9iamVjdC4KKyAqIEBub3RlIElmIHlvdSB3YW50IHRvIHNjYW4gYnl0ZXMgdGhhdCBtYXkgY29udGFpbiBOVUwgdmFsdWVzLCB0aGVuIHVzZQorICogICAgICAgemNvbmZfc2Nhbl9ieXRlcygpIGluc3RlYWQuCisgKi8KK1lZX0JVRkZFUl9TVEFURSB6Y29uZl9zY2FuX3N0cmluZyAoeXljb25zdCBjaGFyICogeXlfc3RyICkKK3sKKworCXJldHVybiB6Y29uZl9zY2FuX2J5dGVzKHl5X3N0cixzdHJsZW4oeXlfc3RyKSApOworfQorCisvKiogU2V0dXAgdGhlIGlucHV0IGJ1ZmZlciBzdGF0ZSB0byBzY2FuIHRoZSBnaXZlbiBieXRlcy4gVGhlIG5leHQgY2FsbCB0byB6Y29uZmxleCgpIHdpbGwKKyAqIHNjYW4gZnJvbSBhIEBlIGNvcHkgb2YgQGEgYnl0ZXMuCisgKiBAcGFyYW0gYnl0ZXMgdGhlIGJ5dGUgYnVmZmVyIHRvIHNjYW4KKyAqIEBwYXJhbSBsZW4gdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgQGEgYnl0ZXMuCisgKgorICogQHJldHVybiB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlciBzdGF0ZSBvYmplY3QuCisgKi8KK1lZX0JVRkZFUl9TVEFURSB6Y29uZl9zY2FuX2J5dGVzICAoeXljb25zdCBjaGFyICogYnl0ZXMsIGludCAgbGVuICkKK3sKKwlZWV9CVUZGRVJfU1RBVEUgYjsKKwljaGFyICpidWY7CisJeXlfc2l6ZV90IG47CisJaW50IGk7CisKKwkvKiBHZXQgbWVtb3J5IGZvciBmdWxsIGJ1ZmZlciwgaW5jbHVkaW5nIHNwYWNlIGZvciB0cmFpbGluZyBFT0Incy4gKi8KKwluID0gbGVuICsgMjsKKwlidWYgPSAoY2hhciAqKSB6Y29uZmFsbG9jKG4gICk7CisJaWYgKCAhIGJ1ZiApCisJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHpjb25mX3NjYW5fYnl0ZXMoKSIgKTsKKworCWZvciAoIGkgPSAwOyBpIDwgbGVuOyArK2kgKQorCQlidWZbaV0gPSBieXRlc1tpXTsKKworCWJ1ZltsZW5dID0gYnVmW2xlbisxXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKworCWIgPSB6Y29uZl9zY2FuX2J1ZmZlcihidWYsbiApOworCWlmICggISBiICkKKwkJWVlfRkFUQUxfRVJST1IoICJiYWQgYnVmZmVyIGluIHpjb25mX3NjYW5fYnl0ZXMoKSIgKTsKKworCS8qIEl0J3Mgb2theSB0byBncm93IGV0Yy4gdGhpcyBidWZmZXIsIGFuZCB3ZSBzaG91bGQgdGhyb3cgaXQKKwkgKiBhd2F5IHdoZW4gd2UncmUgZG9uZS4KKwkgKi8KKwliLT55eV9pc19vdXJfYnVmZmVyID0gMTsKKworCXJldHVybiBiOworfQorCisjaWZuZGVmIFlZX0VYSVRfRkFJTFVSRQorI2RlZmluZSBZWV9FWElUX0ZBSUxVUkUgMgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHl5X2ZhdGFsX2Vycm9yICh5eWNvbnN0IGNoYXIqIG1zZyApCit7CisgICAgCSh2b2lkKSBmcHJpbnRmKCBzdGRlcnIsICIlc1xuIiwgbXNnICk7CisJZXhpdCggWVlfRVhJVF9GQUlMVVJFICk7Cit9CisKKy8qIFJlZGVmaW5lIHl5bGVzcygpIHNvIGl0IHdvcmtzIGluIHNlY3Rpb24gMyBjb2RlLiAqLworCisjdW5kZWYgeXlsZXNzCisjZGVmaW5lIHl5bGVzcyhuKSBcCisJZG8gXAorCQl7IFwKKwkJLyogVW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgemNvbmZ0ZXh0LiAqLyBcCisgICAgICAgIGludCB5eWxlc3NfbWFjcm9fYXJnID0gKG4pOyBcCisgICAgICAgIFlZX0xFU1NfTElORU5PKHl5bGVzc19tYWNyb19hcmcpO1wKKwkJemNvbmZ0ZXh0W3pjb25mbGVuZ10gPSAoeXlfaG9sZF9jaGFyKTsgXAorCQkoeXlfY19idWZfcCkgPSB6Y29uZnRleHQgKyB5eWxlc3NfbWFjcm9fYXJnOyBcCisJCSh5eV9ob2xkX2NoYXIpID0gKih5eV9jX2J1Zl9wKTsgXAorCQkqKHl5X2NfYnVmX3ApID0gJ1wwJzsgXAorCQl6Y29uZmxlbmcgPSB5eWxlc3NfbWFjcm9fYXJnOyBcCisJCX0gXAorCXdoaWxlICggMCApCisKKy8qIEFjY2Vzc29yICBtZXRob2RzIChnZXQvc2V0IGZ1bmN0aW9ucykgdG8gc3RydWN0IG1lbWJlcnMuICovCisKKy8qKiBHZXQgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIuCisgKgorICovCitpbnQgemNvbmZnZXRfbGluZW5vICAodm9pZCkKK3sKKworICAgIHJldHVybiB6Y29uZmxpbmVubzsKK30KKworLyoqIEdldCB0aGUgaW5wdXQgc3RyZWFtLgorICoKKyAqLworRklMRSAqemNvbmZnZXRfaW4gICh2b2lkKQoreworICAgICAgICByZXR1cm4gemNvbmZpbjsKK30KKworLyoqIEdldCB0aGUgb3V0cHV0IHN0cmVhbS4KKyAqCisgKi8KK0ZJTEUgKnpjb25mZ2V0X291dCAgKHZvaWQpCit7CisgICAgICAgIHJldHVybiB6Y29uZm91dDsKK30KKworLyoqIEdldCB0aGUgbGVuZ3RoIG9mIHRoZSBjdXJyZW50IHRva2VuLgorICoKKyAqLworaW50IHpjb25mZ2V0X2xlbmcgICh2b2lkKQoreworICAgICAgICByZXR1cm4gemNvbmZsZW5nOworfQorCisvKiogR2V0IHRoZSBjdXJyZW50IHRva2VuLgorICoKKyAqLworCitjaGFyICp6Y29uZmdldF90ZXh0ICAodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIHpjb25mdGV4dDsKK30KKworLyoqIFNldCB0aGUgY3VycmVudCBsaW5lIG51bWJlci4KKyAqIEBwYXJhbSBsaW5lX251bWJlcgorICoKKyAqLwordm9pZCB6Y29uZnNldF9saW5lbm8gKGludCAgbGluZV9udW1iZXIgKQoreworCisgICAgemNvbmZsaW5lbm8gPSBsaW5lX251bWJlcjsKK30KKworLyoqIFNldCB0aGUgaW5wdXQgc3RyZWFtLiBUaGlzIGRvZXMgbm90IGRpc2NhcmQgdGhlIGN1cnJlbnQKKyAqIGlucHV0IGJ1ZmZlci4KKyAqIEBwYXJhbSBpbl9zdHIgQSByZWFkYWJsZSBzdHJlYW0uCisgKgorICogQHNlZSB6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyCisgKi8KK3ZvaWQgemNvbmZzZXRfaW4gKEZJTEUgKiAgaW5fc3RyICkKK3sKKyAgICAgICAgemNvbmZpbiA9IGluX3N0ciA7Cit9CisKK3ZvaWQgemNvbmZzZXRfb3V0IChGSUxFICogIG91dF9zdHIgKQoreworICAgICAgICB6Y29uZm91dCA9IG91dF9zdHIgOworfQorCitpbnQgemNvbmZnZXRfZGVidWcgICh2b2lkKQoreworICAgICAgICByZXR1cm4gemNvbmZfZmxleF9kZWJ1ZzsKK30KKwordm9pZCB6Y29uZnNldF9kZWJ1ZyAoaW50ICBiZGVidWcgKQoreworICAgICAgICB6Y29uZl9mbGV4X2RlYnVnID0gYmRlYnVnIDsKK30KKworLyogemNvbmZsZXhfZGVzdHJveSBpcyBmb3IgYm90aCByZWVudHJhbnQgYW5kIG5vbi1yZWVudHJhbnQgc2Nhbm5lcnMuICovCitpbnQgemNvbmZsZXhfZGVzdHJveSAgKHZvaWQpCit7CisKKyAgICAvKiBQb3AgdGhlIGJ1ZmZlciBzdGFjaywgZGVzdHJveWluZyBlYWNoIGVsZW1lbnQuICovCisJd2hpbGUoWVlfQ1VSUkVOVF9CVUZGRVIpeworCQl6Y29uZl9kZWxldGVfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSICApOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSBOVUxMOworCQl6Y29uZnBvcF9idWZmZXJfc3RhdGUoKTsKKwl9CisKKwkvKiBEZXN0cm95IHRoZSBzdGFjayBpdHNlbGYuICovCisJemNvbmZmcmVlKCh5eV9idWZmZXJfc3RhY2spICk7CisJKHl5X2J1ZmZlcl9zdGFjaykgPSBOVUxMOworCisgICAgcmV0dXJuIDA7Cit9CisKKy8qCisgKiBJbnRlcm5hbCB1dGlsaXR5IHJvdXRpbmVzLgorICovCisKKyNpZm5kZWYgeXl0ZXh0X3B0cgorc3RhdGljIHZvaWQgeXlfZmxleF9zdHJuY3B5IChjaGFyKiBzMSwgeXljb25zdCBjaGFyICogczIsIGludCBuICkKK3sKKwlyZWdpc3RlciBpbnQgaTsKKyAgICAJZm9yICggaSA9IDA7IGkgPCBuOyArK2kgKQorCQlzMVtpXSA9IHMyW2ldOworfQorI2VuZGlmCisKKyNpZmRlZiBZWV9ORUVEX1NUUkxFTgorc3RhdGljIGludCB5eV9mbGV4X3N0cmxlbiAoeXljb25zdCBjaGFyICogcyApCit7CisJcmVnaXN0ZXIgaW50IG47CisgICAgCWZvciAoIG4gPSAwOyBzW25dOyArK24gKQorCQk7CisKKwlyZXR1cm4gbjsKK30KKyNlbmRpZgorCit2b2lkICp6Y29uZmFsbG9jICh5eV9zaXplX3QgIHNpemUgKQoreworCXJldHVybiAodm9pZCAqKSBtYWxsb2MoIHNpemUgKTsKK30KKwordm9pZCAqemNvbmZyZWFsbG9jICAodm9pZCAqIHB0ciwgeXlfc2l6ZV90ICBzaXplICkKK3sKKwkvKiBUaGUgY2FzdCB0byAoY2hhciAqKSBpbiB0aGUgZm9sbG93aW5nIGFjY29tbW9kYXRlcyBib3RoCisJICogaW1wbGVtZW50YXRpb25zIHRoYXQgdXNlIGNoYXIqIGdlbmVyaWMgcG9pbnRlcnMsIGFuZCB0aG9zZQorCSAqIHRoYXQgdXNlIHZvaWQqIGdlbmVyaWMgcG9pbnRlcnMuICBJdCB3b3JrcyB3aXRoIHRoZSBsYXR0ZXIKKwkgKiBiZWNhdXNlIGJvdGggQU5TSSBDIGFuZCBDKysgYWxsb3cgY2FzdGxlc3MgYXNzaWdubWVudCBmcm9tCisJICogYW55IHBvaW50ZXIgdHlwZSB0byB2b2lkKiwgYW5kIGRlYWwgd2l0aCBhcmd1bWVudCBjb252ZXJzaW9ucworCSAqIGFzIHRob3VnaCBkb2luZyBhbiBhc3NpZ25tZW50LgorCSAqLworCXJldHVybiAodm9pZCAqKSByZWFsbG9jKCAoY2hhciAqKSBwdHIsIHNpemUgKTsKK30KKwordm9pZCB6Y29uZmZyZWUgKHZvaWQgKiBwdHIgKQoreworCWZyZWUoIChjaGFyICopIHB0ciApOwkvKiBzZWUgemNvbmZyZWFsbG9jKCkgZm9yIChjaGFyICopIGNhc3QgKi8KK30KKworI2RlZmluZSBZWVRBQkxFU19OQU1FICJ5eXRhYmxlcyIKKworI3VuZGVmIFlZX05FV19GSUxFCisjdW5kZWYgWVlfRkxVU0hfQlVGRkVSCisjdW5kZWYgeXlfc2V0X2JvbAorI3VuZGVmIHl5X25ld19idWZmZXIKKyN1bmRlZiB5eV9zZXRfaW50ZXJhY3RpdmUKKyN1bmRlZiB5eXRleHRfcHRyCisjdW5kZWYgWVlfRE9fQkVGT1JFX0FDVElPTgorCisjaWZkZWYgWVlfREVDTF9JU19PVVJTCisjdW5kZWYgWVlfREVDTF9JU19PVVJTCisjdW5kZWYgWVlfREVDTAorI2VuZGlmCisKK3ZvaWQgemNvbmZfc3RhcnRoZWxwKHZvaWQpCit7CisJbmV3X3N0cmluZygpOworCWxhc3RfdHMgPSBmaXJzdF90cyA9IDA7CisJQkVHSU4oSEVMUCk7Cit9CisKK3N0YXRpYyB2b2lkIHpjb25mX2VuZGhlbHAodm9pZCkKK3sKKwl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwlCRUdJTihJTklUSUFMKTsKK30KKworLyoKKyAqIFRyeSB0byBvcGVuIHNwZWNpZmllZCBmaWxlIHdpdGggZm9sbG93aW5nIG5hbWVzOgorICogLi9uYW1lCisgKiAkKHNyY3RyZWUpL25hbWUKKyAqIFRoZSBsYXR0ZXIgaXMgdXNlZCB3aGVuIHNyY3RyZWUgaXMgc2VwYXJhdGUgZnJvbSBvYmp0cmVlCisgKiB3aGVuIGNvbXBpbGluZyB0aGUga2VybmVsLgorICogUmV0dXJuIE5VTEwgaWYgZmlsZSBpcyBub3QgZm91bmQuCisgKi8KK0ZJTEUgKnpjb25mX2ZvcGVuKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY2hhciAqZW52OworCUZJTEUgKmY7CisKKwlmID0gZm9wZW4obmFtZSwgInIiKTsKKwlpZiAoIWYgJiYgbmFtZVswXSAhPSAnLycpIHsKKwkJZW52ID0gZ2V0ZW52KFNSQ1RSRUUpOworCQlpZiAoZW52KSB7CisJCQljaGFyICpmdWxsbmFtZSA9IGFsbG9jYShzdHJsZW4oZW52KSArIHN0cmxlbihuYW1lKSArIDIpOworCQkJc3ByaW50ZihmdWxsbmFtZSwgIiVzLyVzIiwgZW52LCBuYW1lKTsKKwkJCWYgPSBmb3BlbihmdWxsbmFtZSwgInIiKTsKKwkJfQorCX0KKwlyZXR1cm4gZjsKK30KKwordm9pZCB6Y29uZl9pbml0c2Nhbihjb25zdCBjaGFyICpuYW1lKQoreworCXpjb25maW4gPSB6Y29uZl9mb3BlbihuYW1lKTsKKwlpZiAoIXpjb25maW4pIHsKKwkJcHJpbnRmKCJjYW4ndCBmaW5kIGZpbGUgJXNcbiIsIG5hbWUpOworCQlleGl0KDEpOworCX0KKworCWN1cnJlbnRfYnVmID0gbWFsbG9jKHNpemVvZigqY3VycmVudF9idWYpKTsKKwltZW1zZXQoY3VycmVudF9idWYsIDAsIHNpemVvZigqY3VycmVudF9idWYpKTsKKworCWN1cnJlbnRfZmlsZSA9IGZpbGVfbG9va3VwKG5hbWUpOworCWN1cnJlbnRfZmlsZS0+bGluZW5vID0gMTsKKwljdXJyZW50X2ZpbGUtPmZsYWdzID0gRklMRV9CVVNZOworfQorCit2b2lkIHpjb25mX25leHRmaWxlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGZpbGUgKmZpbGUgPSBmaWxlX2xvb2t1cChuYW1lKTsKKwlzdHJ1Y3QgYnVmZmVyICpidWYgPSBtYWxsb2Moc2l6ZW9mKCpidWYpKTsKKwltZW1zZXQoYnVmLCAwLCBzaXplb2YoKmJ1ZikpOworCisJY3VycmVudF9idWYtPnN0YXRlID0gWVlfQ1VSUkVOVF9CVUZGRVI7CisJemNvbmZpbiA9IHpjb25mX2ZvcGVuKG5hbWUpOworCWlmICghemNvbmZpbikgeworCQlwcmludGYoIiVzOiVkOiBjYW4ndCBvcGVuIGZpbGUgXCIlc1wiXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpLCBuYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisJemNvbmZfc3dpdGNoX3RvX2J1ZmZlcih6Y29uZl9jcmVhdGVfYnVmZmVyKHpjb25maW4sWVlfQlVGX1NJWkUpKTsKKwlidWYtPnBhcmVudCA9IGN1cnJlbnRfYnVmOworCWN1cnJlbnRfYnVmID0gYnVmOworCisJaWYgKGZpbGUtPmZsYWdzICYgRklMRV9CVVNZKSB7CisJCXByaW50ZigicmVjdXJzaXZlIHNjYW4gKCVzKT9cbiIsIG5hbWUpOworCQlleGl0KDEpOworCX0KKwlpZiAoZmlsZS0+ZmxhZ3MgJiBGSUxFX1NDQU5ORUQpIHsKKwkJcHJpbnRmKCJmaWxlICVzIGFscmVhZHkgc2Nhbm5lZD9cbiIsIG5hbWUpOworCQlleGl0KDEpOworCX0KKwlmaWxlLT5mbGFncyB8PSBGSUxFX0JVU1k7CisJZmlsZS0+bGluZW5vID0gMTsKKwlmaWxlLT5wYXJlbnQgPSBjdXJyZW50X2ZpbGU7CisJY3VycmVudF9maWxlID0gZmlsZTsKK30KKworc3RhdGljIHZvaWQgemNvbmZfZW5kZmlsZSh2b2lkKQoreworCXN0cnVjdCBidWZmZXIgKnBhcmVudDsKKworCWN1cnJlbnRfZmlsZS0+ZmxhZ3MgfD0gRklMRV9TQ0FOTkVEOworCWN1cnJlbnRfZmlsZS0+ZmxhZ3MgJj0gfkZJTEVfQlVTWTsKKwljdXJyZW50X2ZpbGUgPSBjdXJyZW50X2ZpbGUtPnBhcmVudDsKKworCXBhcmVudCA9IGN1cnJlbnRfYnVmLT5wYXJlbnQ7CisJaWYgKHBhcmVudCkgeworCQlmY2xvc2UoemNvbmZpbik7CisJCXpjb25mX2RlbGV0ZV9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIpOworCQl6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyKHBhcmVudC0+c3RhdGUpOworCX0KKwlmcmVlKGN1cnJlbnRfYnVmKTsKKwljdXJyZW50X2J1ZiA9IHBhcmVudDsKK30KKworaW50IHpjb25mX2xpbmVubyh2b2lkKQoreworCXJldHVybiBjdXJyZW50X3Bvcy5saW5lbm87Cit9CisKK2NoYXIgKnpjb25mX2N1cm5hbWUodm9pZCkKK3sKKwlyZXR1cm4gY3VycmVudF9wb3MuZmlsZSA/IGN1cnJlbnRfcG9zLmZpbGUtPm5hbWUgOiAiPG5vbmU+IjsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9sa2MuaCBiL3NjcmlwdHMva2NvbmZpZy9sa2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjdmNjBjCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL2xrYy5oCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2lmbmRlZiBMS0NfSAorI2RlZmluZSBMS0NfSAorCisjaW5jbHVkZSAiZXhwci5oIgorCisjaWZuZGVmIEtCVUlMRF9OT19OTFMKKyMgaW5jbHVkZSA8bGliaW50bC5oPgorI2Vsc2UKKyMgZGVmaW5lIGdldHRleHQoTXNnaWQpICgoY29uc3QgY2hhciAqKSAoTXNnaWQpKQorIyBkZWZpbmUgdGV4dGRvbWFpbihEb21haW5uYW1lKSAoKGNvbnN0IGNoYXIgKikgKERvbWFpbm5hbWUpKQorIyBkZWZpbmUgYmluZHRleHRkb21haW4oRG9tYWlubmFtZSwgRGlybmFtZSkgKChjb25zdCBjaGFyICopIChEaXJuYW1lKSkKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpZmRlZiBMS0NfRElSRUNUX0xJTksKKyNkZWZpbmUgUChuYW1lLHR5cGUsYXJnKQlleHRlcm4gdHlwZSBuYW1lIGFyZworI2Vsc2UKKyNpbmNsdWRlICJsa2NfZGVmcy5oIgorI2RlZmluZSBQKG5hbWUsdHlwZSxhcmcpCWV4dGVybiB0eXBlICgqbmFtZSAjIyBfcCkgYXJnCisjZW5kaWYKKyNpbmNsdWRlICJsa2NfcHJvdG8uaCIKKyN1bmRlZiBQCisKKyNkZWZpbmUgU1JDVFJFRSAic3JjdHJlZSIKKworI2RlZmluZSBQQUNLQUdFICJsaW51eCIKKyNkZWZpbmUgTE9DQUxFRElSICIvdXNyL3NoYXJlL2xvY2FsZSIKKworI2RlZmluZSBfKHRleHQpIGdldHRleHQodGV4dCkKKyNkZWZpbmUgTl8odGV4dCkgKHRleHQpCisKKworI2RlZmluZSBURl9DT01NQU5ECTB4MDAwMQorI2RlZmluZSBURl9QQVJBTQkweDAwMDIKKworc3RydWN0IGtjb25mX2lkIHsKKwlpbnQgbmFtZTsKKwlpbnQgdG9rZW47CisJdW5zaWduZWQgaW50IGZsYWdzOworCWVudW0gc3ltYm9sX3R5cGUgc3R5cGU7Cit9OworCitpbnQgemNvbmZwYXJzZSh2b2lkKTsKK3ZvaWQgemNvbmZkdW1wKEZJTEUgKm91dCk7CisKK2V4dGVybiBpbnQgemNvbmZkZWJ1ZzsKK3ZvaWQgemNvbmZfc3RhcnRoZWxwKHZvaWQpOworRklMRSAqemNvbmZfZm9wZW4oY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIHpjb25mX2luaXRzY2FuKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCB6Y29uZl9uZXh0ZmlsZShjb25zdCBjaGFyICpuYW1lKTsKK2ludCB6Y29uZl9saW5lbm8odm9pZCk7CitjaGFyICp6Y29uZl9jdXJuYW1lKHZvaWQpOworCisvKiBjb25mZGF0YS5jICovCitleHRlcm4gY29uc3QgY2hhciBjb25mX2RlZl9maWxlbmFtZVtdOworCitjaGFyICpjb25mX2dldF9kZWZhdWx0X2NvbmZuYW1lKHZvaWQpOworCisvKiBrY29uZmlnX2xvYWQuYyAqLwordm9pZCBrY29uZmlnX2xvYWQodm9pZCk7CisKKy8qIG1lbnUuYyAqLwordm9pZCBtZW51X2luaXQodm9pZCk7CitzdHJ1Y3QgbWVudSAqbWVudV9hZGRfbWVudSh2b2lkKTsKK3ZvaWQgbWVudV9lbmRfbWVudSh2b2lkKTsKK3ZvaWQgbWVudV9hZGRfZW50cnkoc3RydWN0IHN5bWJvbCAqc3ltKTsKK3ZvaWQgbWVudV9lbmRfZW50cnkodm9pZCk7Cit2b2lkIG1lbnVfYWRkX2RlcChzdHJ1Y3QgZXhwciAqZGVwKTsKK3N0cnVjdCBwcm9wZXJ0eSAqbWVudV9hZGRfcHJvcChlbnVtIHByb3BfdHlwZSB0eXBlLCBjaGFyICpwcm9tcHQsIHN0cnVjdCBleHByICpleHByLCBzdHJ1Y3QgZXhwciAqZGVwKTsKK3N0cnVjdCBwcm9wZXJ0eSAqbWVudV9hZGRfcHJvbXB0KGVudW0gcHJvcF90eXBlIHR5cGUsIGNoYXIgKnByb21wdCwgc3RydWN0IGV4cHIgKmRlcCk7Cit2b2lkIG1lbnVfYWRkX2V4cHIoZW51bSBwcm9wX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKmV4cHIsIHN0cnVjdCBleHByICpkZXApOwordm9pZCBtZW51X2FkZF9zeW1ib2woZW51bSBwcm9wX3R5cGUgdHlwZSwgc3RydWN0IHN5bWJvbCAqc3ltLCBzdHJ1Y3QgZXhwciAqZGVwKTsKK3ZvaWQgbWVudV9maW5hbGl6ZShzdHJ1Y3QgbWVudSAqcGFyZW50KTsKK3ZvaWQgbWVudV9zZXRfdHlwZShpbnQgdHlwZSk7CisKKy8qIHV0aWwuYyAqLworc3RydWN0IGZpbGUgKmZpbGVfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpOworaW50IGZpbGVfd3JpdGVfZGVwKGNvbnN0IGNoYXIgKm5hbWUpOworCitzdHJ1Y3QgZ3N0ciB7CisJc2l6ZV90IGxlbjsKKwljaGFyICAqczsKK307CitzdHJ1Y3QgZ3N0ciBzdHJfbmV3KHZvaWQpOworc3RydWN0IGdzdHIgc3RyX2Fzc2lnbihjb25zdCBjaGFyICpzKTsKK3ZvaWQgc3RyX2ZyZWUoc3RydWN0IGdzdHIgKmdzKTsKK3ZvaWQgc3RyX2FwcGVuZChzdHJ1Y3QgZ3N0ciAqZ3MsIGNvbnN0IGNoYXIgKnMpOwordm9pZCBzdHJfcHJpbnRmKHN0cnVjdCBnc3RyICpncywgY29uc3QgY2hhciAqZm10LCAuLi4pOworY29uc3QgY2hhciAqc3RyX2dldChzdHJ1Y3QgZ3N0ciAqZ3MpOworCisvKiBzeW1ib2wuYyAqLwordm9pZCBzeW1faW5pdCh2b2lkKTsKK3ZvaWQgc3ltX2NsZWFyX2FsbF92YWxpZCh2b2lkKTsKK3ZvaWQgc3ltX3NldF9jaGFuZ2VkKHN0cnVjdCBzeW1ib2wgKnN5bSk7CitzdHJ1Y3Qgc3ltYm9sICpzeW1fY2hlY2tfZGVwcyhzdHJ1Y3Qgc3ltYm9sICpzeW0pOworc3RydWN0IHByb3BlcnR5ICpwcm9wX2FsbG9jKGVudW0gcHJvcF90eXBlIHR5cGUsIHN0cnVjdCBzeW1ib2wgKnN5bSk7CitzdHJ1Y3Qgc3ltYm9sICpwcm9wX2dldF9zeW1ib2woc3RydWN0IHByb3BlcnR5ICpwcm9wKTsKKworc3RhdGljIGlubGluZSB0cmlzdGF0ZSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlyZXR1cm4gc3ltLT5jdXJyLnRyaTsKK30KKworCitzdGF0aWMgaW5saW5lIHN0cnVjdCBzeW1ib2wgKnN5bV9nZXRfY2hvaWNlX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlyZXR1cm4gKHN0cnVjdCBzeW1ib2wgKilzeW0tPmN1cnIudmFsOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgc3ltX3NldF9jaG9pY2VfdmFsdWUoc3RydWN0IHN5bWJvbCAqY2gsIHN0cnVjdCBzeW1ib2wgKmNodmFsKQoreworCXJldHVybiBzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKGNodmFsLCB5ZXMpOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgc3ltX2lzX2Nob2ljZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJcmV0dXJuIHN5bS0+ZmxhZ3MgJiBTWU1CT0xfQ0hPSUNFID8gdHJ1ZSA6IGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgc3ltX2lzX2Nob2ljZV92YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJcmV0dXJuIHN5bS0+ZmxhZ3MgJiBTWU1CT0xfQ0hPSUNFVkFMID8gdHJ1ZSA6IGZhbHNlOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wgc3ltX2lzX29wdGlvbmFsKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlyZXR1cm4gc3ltLT5mbGFncyAmIFNZTUJPTF9PUFRJT05BTCA/IHRydWUgOiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBib29sIHN5bV9oYXNfdmFsdWUoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXJldHVybiBzeW0tPmZsYWdzICYgU1lNQk9MX05FVyA/IGZhbHNlIDogdHJ1ZTsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIExLQ19IICovCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbGtjX3Byb3RvLmggYi9zY3JpcHRzL2tjb25maWcvbGtjX3Byb3RvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZhMzg5YwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9sa2NfcHJvdG8uaApAQCAtMCwwICsxLDQxIEBACisKKy8qIGNvbmZkYXRhLmMgKi8KK1AoY29uZl9wYXJzZSx2b2lkLChjb25zdCBjaGFyICpuYW1lKSk7CitQKGNvbmZfcmVhZCxpbnQsKGNvbnN0IGNoYXIgKm5hbWUpKTsKK1AoY29uZl9yZWFkX3NpbXBsZSxpbnQsKGNvbnN0IGNoYXIgKm5hbWUpKTsKK1AoY29uZl93cml0ZSxpbnQsKGNvbnN0IGNoYXIgKm5hbWUpKTsKKworLyogbWVudS5jICovCitQKHJvb3RtZW51LHN0cnVjdCBtZW51LCk7CisKK1AobWVudV9pc192aXNpYmxlLGJvb2wsKHN0cnVjdCBtZW51ICptZW51KSk7CitQKG1lbnVfZ2V0X3Byb21wdCxjb25zdCBjaGFyICosKHN0cnVjdCBtZW51ICptZW51KSk7CitQKG1lbnVfZ2V0X3Jvb3RfbWVudSxzdHJ1Y3QgbWVudSAqLChzdHJ1Y3QgbWVudSAqbWVudSkpOworUChtZW51X2dldF9wYXJlbnRfbWVudSxzdHJ1Y3QgbWVudSAqLChzdHJ1Y3QgbWVudSAqbWVudSkpOworCisvKiBzeW1ib2wuYyAqLworUChzeW1ib2xfaGFzaCxzdHJ1Y3Qgc3ltYm9sICosW1NZTUJPTF9IQVNIU0laRV0pOworUChzeW1fY2hhbmdlX2NvdW50LGludCwpOworCitQKHN5bV9sb29rdXAsc3RydWN0IHN5bWJvbCAqLChjb25zdCBjaGFyICpuYW1lLCBpbnQgaXNjb25zdCkpOworUChzeW1fZmluZCxzdHJ1Y3Qgc3ltYm9sICosKGNvbnN0IGNoYXIgKm5hbWUpKTsKK1Aoc3ltX3JlX3NlYXJjaCxzdHJ1Y3Qgc3ltYm9sICoqLChjb25zdCBjaGFyICpwYXR0ZXJuKSk7CitQKHN5bV90eXBlX25hbWUsY29uc3QgY2hhciAqLChlbnVtIHN5bWJvbF90eXBlIHR5cGUpKTsKK1Aoc3ltX2NhbGNfdmFsdWUsdm9pZCwoc3RydWN0IHN5bWJvbCAqc3ltKSk7CitQKHN5bV9nZXRfdHlwZSxlbnVtIHN5bWJvbF90eXBlLChzdHJ1Y3Qgc3ltYm9sICpzeW0pKTsKK1Aoc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZSxib29sLChzdHJ1Y3Qgc3ltYm9sICpzeW0sdHJpc3RhdGUgdHJpKSk7CitQKHN5bV9zZXRfdHJpc3RhdGVfdmFsdWUsYm9vbCwoc3RydWN0IHN5bWJvbCAqc3ltLHRyaXN0YXRlIHRyaSkpOworUChzeW1fdG9nZ2xlX3RyaXN0YXRlX3ZhbHVlLHRyaXN0YXRlLChzdHJ1Y3Qgc3ltYm9sICpzeW0pKTsKK1Aoc3ltX3N0cmluZ192YWxpZCxib29sLChzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKm5ld3ZhbCkpOworUChzeW1fc3RyaW5nX3dpdGhpbl9yYW5nZSxib29sLChzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKnN0cikpOworUChzeW1fc2V0X3N0cmluZ192YWx1ZSxib29sLChzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKm5ld3ZhbCkpOworUChzeW1faXNfY2hhbmdhYmxlLGJvb2wsKHN0cnVjdCBzeW1ib2wgKnN5bSkpOworUChzeW1fZ2V0X2Nob2ljZV9wcm9wLHN0cnVjdCBwcm9wZXJ0eSAqLChzdHJ1Y3Qgc3ltYm9sICpzeW0pKTsKK1Aoc3ltX2dldF9kZWZhdWx0X3Byb3Asc3RydWN0IHByb3BlcnR5ICosKHN0cnVjdCBzeW1ib2wgKnN5bSkpOworUChzeW1fZ2V0X3N0cmluZ192YWx1ZSxjb25zdCBjaGFyICosKHN0cnVjdCBzeW1ib2wgKnN5bSkpOworCitQKHByb3BfZ2V0X3R5cGVfbmFtZSxjb25zdCBjaGFyICosKGVudW0gcHJvcF90eXBlIHR5cGUpKTsKKworLyogZXhwci5jICovCitQKGV4cHJfY29tcGFyZV90eXBlLGludCwoZW51bSBleHByX3R5cGUgdDEsIGVudW0gZXhwcl90eXBlIHQyKSk7CitQKGV4cHJfcHJpbnQsdm9pZCwoc3RydWN0IGV4cHIgKmUsIHZvaWQgKCpmbikodm9pZCAqLCBjb25zdCBjaGFyICopLCB2b2lkICpkYXRhLCBpbnQgcHJldnRva2VuKSk7CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvQklHLkZBVC5XQVJOSU5HIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL0JJRy5GQVQuV0FSTklORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2FkYjgwCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL0JJRy5GQVQuV0FSTklORwpAQCAtMCwwICsxLDQgQEAKK1RoaXMgaXMgTk9UIHRoZSBvZmZpY2lhbCB2ZXJzaW9uIG9mIGRpYWxvZy4gIFRoaXMgdmVyc2lvbiBoYXMgYmVlbgorc2lnbmlmaWNhbnRseSBtb2RpZmllZCBmcm9tIHRoZSBvcmlnaW5hbC4gIEl0IHdhcyB1c2VkIGJ5IHRoZSBMaW51eAora2VybmVsIGNvbmZpZ3VyYXRpb24gc2NyaXB0LCBhbmQgc3Vic2VxdWVudGx5IGFkYXB0ZWQgZm9yIGJ1c3lib3guCitQbGVhc2UgZG8gbm90IGJvdGhlciBTYXZpbyBMYW0gd2l0aCBxdWVzdGlvbnMgYWJvdXQgdGhpcyBwcm9ncmFtLgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL01ha2VmaWxlIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjOWRjNDgKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvTWFrZWZpbGUKQEAgLTAsMCArMSwyMSBAQAorIyBNYWtlZmlsZSB0byBidWlsZCBseGRpYWxvZyBwYWNrYWdlCisjCisKK2NoZWNrLWx4ZGlhbG9nICA6PSAkKHNyY3RyZWUpLyQoc3JjKS9jaGVjay1seGRpYWxvZy5zaAorCisjIFVzZSByZXVyc2l2ZWx5IGV4cGFuZGVkIHZhcmlhYmxlcyBzbyB3ZSBkbyBub3QgY2FsbCBnY2MgdW5sZXNzCisjIHdlIHJlYWxseSBuZWVkIHRvIGRvIHNvLiAoRG8gbm90IGNhbGwgZ2NjIGFzIHBhcnQgb2YgbWFrZSBtcnByb3BlcikKK0hPU1RfRVhUUkFDRkxBR1MgPSAkKHNoZWxsICQoQ09ORklHX1NIRUxMKSAkKGNoZWNrLWx4ZGlhbG9nKSAtY2NmbGFncykKK0hPU1RfTE9BRExJQkVTICAgPSAkKHNoZWxsICQoQ09ORklHX1NIRUxMKSAkKGNoZWNrLWx4ZGlhbG9nKSAtbGRmbGFncyAkKEhPU1RDQykpCisKK0hPU1RfRVhUUkFDRkxBR1MgKz0gLURMT0NBTEUKKworUEhPTlkgKz0gZG9jaGVja2x4ZGlhbG9nCiskKG9iaikvZG9jaGVja2x4ZGlhbG9nOgorCSQoUSkkKENPTkZJR19TSEVMTCkgJChjaGVjay1seGRpYWxvZykgLWNoZWNrICQoSE9TVENDKSAkKEhPU1RfRVhUUkFDRkxBR1MpICQoSE9TVF9MT0FETElCRVMpCisKK2hvc3Rwcm9ncy15CTo9IGx4ZGlhbG9nCithbHdheXMJCTo9ICQoaG9zdHByb2dzLXkpIGRvY2hlY2tseGRpYWxvZworCitseGRpYWxvZy1vYmpzIDo9IGNoZWNrbGlzdC5vIG1lbnVib3gubyB0ZXh0Ym94Lm8geWVzbm8ubyBpbnB1dGJveC5vIFwKKwkJIHV0aWwubyBseGRpYWxvZy5vIG1zZ2JveC5vCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvY2hlY2stbHhkaWFsb2cuc2ggYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvY2hlY2stbHhkaWFsb2cuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM0ZGZkNAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9jaGVjay1seGRpYWxvZy5zaApAQCAtMCwwICsxLDg2IEBACisjIS9iaW4vc2gKKyMgQ2hlY2sgbmN1cnNlcyBjb21wYXRpYmlsaXR5CisKKyMgV2hhdCBsaWJyYXJ5IHRvIGxpbmsKK2xkZmxhZ3MoKQoreworCWZvciBleHQgaW4gc28gYSBkeWxpYiA7IGRvCisJCWZvciBsaWIgaW4gbmN1cnNlc3cgbmN1cnNlcyBjdXJzZXMgOyBkbworCQkJJGNjIC1wcmludC1maWxlLW5hbWU9bGliJHtsaWJ9LiR7ZXh0fSB8IGdyZXAgLXEgLworCQkJaWYgWyAkPyAtZXEgMCBdOyB0aGVuCisJCQkJZWNobyAiLWwke2xpYn0iCisJCQkJZXhpdAorCQkJZmkKKwkJZG9uZQorCWRvbmUKKwlleGl0IDEKK30KKworIyBXaGVyZSBpcyBuY3Vyc2VzLmg/CitjY2ZsYWdzKCkKK3sKKwlpZiBbIC1mIC91c3IvaW5jbHVkZS9uY3Vyc2Vzdy9uY3Vyc2VzLmggXTsgdGhlbgorCQllY2hvICctSS91c3IvaW5jbHVkZS9uY3Vyc2VzdyAtRENVUlNFU19MT0M9IjxuY3Vyc2VzLmg+IicKKwllbGlmIFsgLWYgL3Vzci9pbmNsdWRlL25jdXJzZXN3L2N1cnNlcy5oIF07IHRoZW4KKwkJZWNobyAnLUkvdXNyL2luY2x1ZGUvbmN1cnNlc3cgLURDVVJTRVNfTE9DPSI8bmN1cnNlc3cvY3Vyc2VzLmg+IicKKwllbGlmIFsgLWYgL3Vzci9pbmNsdWRlL25jdXJzZXMvbmN1cnNlcy5oIF07IHRoZW4KKwkJZWNobyAnLUkvdXNyL2luY2x1ZGUvbmN1cnNlcyAtRENVUlNFU19MT0M9IjxuY3Vyc2VzLmg+IicKKwllbGlmIFsgLWYgL3Vzci9pbmNsdWRlL25jdXJzZXMvY3Vyc2VzLmggXTsgdGhlbgorCQllY2hvICctSS91c3IvaW5jbHVkZS9uY3Vyc2VzIC1EQ1VSU0VTX0xPQz0iPG5jdXJzZXMvY3Vyc2VzLmg+IicKKwllbGlmIFsgLWYgL3Vzci9pbmNsdWRlL25jdXJzZXMuaCBdOyB0aGVuCisJCWVjaG8gJy1EQ1VSU0VTX0xPQz0iPG5jdXJzZXMuaD4iJworCWVsc2UKKwkJZWNobyAnLURDVVJTRVNfTE9DPSI8Y3Vyc2VzLmg+IicKKwlmaQorfQorCisjIFRlbXAgZmlsZSwgdHJ5IHRvIGNsZWFuIHVwIGFmdGVyIHVzCit0bXA9Lmx4ZGlhbG9nLnRtcAordHJhcCAicm0gLWYgJHRtcCIgMCAxIDIgMyAxNQorCisjIENoZWNrIGlmIHdlIGNhbiBsaW5rIHRvIG5jdXJzZXMKK2NoZWNrKCkgeworICAgICAgICAkY2MgLXhjIC0gLW8gJHRtcCAyPi9kZXYvbnVsbCA8PCdFT0YnCisjaW5jbHVkZSBDVVJTRVNfTE9DCittYWluKCkge30KK0VPRgorCWlmIFsgJD8gIT0gMCBdOyB0aGVuCisJICAgIGVjaG8gIiAqKiogVW5hYmxlIHRvIGZpbmQgdGhlIG5jdXJzZXMgbGlicmFyaWVzIG9yIHRoZSIgICAgICAgMT4mMgorCSAgICBlY2hvICIgKioqIHJlcXVpcmVkIGhlYWRlciBmaWxlcy4iICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE+JjIKKwkgICAgZWNobyAiICoqKiAnbWFrZSBtZW51Y29uZmlnJyByZXF1aXJlcyB0aGUgbmN1cnNlcyBsaWJyYXJpZXMuIiAxPiYyCisJICAgIGVjaG8gIiAqKiogIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMT4mMgorCSAgICBlY2hvICIgKioqIEluc3RhbGwgbmN1cnNlcyAobmN1cnNlcy1kZXZlbCkgYW5kIHRyeSBhZ2Fpbi4iICAgIDE+JjIKKwkgICAgZWNobyAiICoqKiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxPiYyCisJICAgIGV4aXQgMQorCWZpCit9CisKK3VzYWdlKCkgeworCXByaW50ZiAiVXNhZ2U6ICQwIFstY2hlY2sgY29tcGlsZXIgb3B0aW9uc3wtY2NmbGFnc3wtbGRmbGFncyBjb21waWxlciBvcHRpb25zXVxuIgorfQorCitpZiBbICQjIC1lcSAwIF07IHRoZW4KKwl1c2FnZQorCWV4aXQgMQorZmkKKworY2M9IiIKK2Nhc2UgIiQxIiBpbgorCSItY2hlY2siKQorCQlzaGlmdAorCQljYz0iJEAiCisJCWNoZWNrCisJCTs7CisJIi1jY2ZsYWdzIikKKwkJY2NmbGFncworCQk7OworCSItbGRmbGFncyIpCisJCXNoaWZ0CisJCWNjPSIkQCIKKwkJbGRmbGFncworCQk7OworCSIqIikKKwkJdXNhZ2UKKwkJZXhpdCAxCisJCTs7Citlc2FjCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvY2hlY2tsaXN0LmMgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvY2hlY2tsaXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUwMjAwZQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9jaGVja2xpc3QuYwpAQCAtMCwwICsxLDMzMyBAQAorLyoKKyAqICBjaGVja2xpc3QuYyAtLSBpbXBsZW1lbnRzIHRoZSBjaGVja2xpc3QgYm94CisgKgorICogIE9SSUdJTkFMIEFVVEhPUjogU2F2aW8gTGFtIChsYW04MzZAY3MuY3Voay5oaykKKyAqICAgICBTdHVhcnQgSGVyYmVydCAtIFMuSGVyYmVydEBzaGVmZmllbGQuYWMudWs6IHJhZGlvbGlzdCBleHRlbnNpb24KKyAqICAgICBBbGVzc2FuZHJvIFJ1YmluaSAtIHJ1YmluaUBpcHZ2aXMudW5pcHYuaXQ6IG1lcmdlZCB0aGUgdHdvCisgKiAgTU9ESUZJRUQgRk9SIExJTlVYIEtFUk5FTCBDT05GSUcgQlk6IFdpbGxpYW0gUm9hZGNhcCAocm9hZGNhcEBjZncuY29tKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImRpYWxvZy5oIgorCitzdGF0aWMgaW50IGxpc3Rfd2lkdGgsIGNoZWNrX3gsIGl0ZW1feDsKKworLyoKKyAqIFByaW50IGxpc3QgaXRlbQorICovCitzdGF0aWMgdm9pZCBwcmludF9pdGVtKFdJTkRPVyAqIHdpbiwgY29uc3QgY2hhciAqaXRlbSwgaW50IHN0YXR1cywgaW50IGNob2ljZSwKKwkJICAgICAgIGludCBzZWxlY3RlZCkKK3sKKwlpbnQgaTsKKworCS8qIENsZWFyICdyZXNpZHVlJyBvZiBsYXN0IGl0ZW0gKi8KKwl3YXR0cnNldCh3aW4sIG1lbnVib3hfYXR0cik7CisJd21vdmUod2luLCBjaG9pY2UsIDApOworCWZvciAoaSA9IDA7IGkgPCBsaXN0X3dpZHRoOyBpKyspCisJCXdhZGRjaCh3aW4sICcgJyk7CisKKwl3bW92ZSh3aW4sIGNob2ljZSwgY2hlY2tfeCk7CisJd2F0dHJzZXQod2luLCBzZWxlY3RlZCA/IGNoZWNrX3NlbGVjdGVkX2F0dHIgOiBjaGVja19hdHRyKTsKKwl3cHJpbnR3KHdpbiwgIiglYykiLCBzdGF0dXMgPyAnWCcgOiAnICcpOworCisJd2F0dHJzZXQod2luLCBzZWxlY3RlZCA/IHRhZ19zZWxlY3RlZF9hdHRyIDogdGFnX2F0dHIpOworCW12d2FkZGNoKHdpbiwgY2hvaWNlLCBpdGVtX3gsIGl0ZW1bMF0pOworCXdhdHRyc2V0KHdpbiwgc2VsZWN0ZWQgPyBpdGVtX3NlbGVjdGVkX2F0dHIgOiBpdGVtX2F0dHIpOworCXdhZGRzdHIod2luLCAoY2hhciAqKWl0ZW0gKyAxKTsKKwlpZiAoc2VsZWN0ZWQpIHsKKwkJd21vdmUod2luLCBjaG9pY2UsIGNoZWNrX3ggKyAxKTsKKwkJd3JlZnJlc2god2luKTsKKwl9Cit9CisKKy8qCisgKiBQcmludCB0aGUgc2Nyb2xsIGluZGljYXRvcnMuCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X2Fycm93cyhXSU5ET1cgKiB3aW4sIGludCBjaG9pY2UsIGludCBpdGVtX25vLCBpbnQgc2Nyb2xsLAorCSAgICAgaW50IHksIGludCB4LCBpbnQgaGVpZ2h0KQoreworCXdtb3ZlKHdpbiwgeSwgeCk7CisKKwlpZiAoc2Nyb2xsID4gMCkgeworCQl3YXR0cnNldCh3aW4sIHVhcnJvd19hdHRyKTsKKwkJd2FkZGNoKHdpbiwgQUNTX1VBUlJPVyk7CisJCXdhZGRzdHIod2luLCAiKC0pIik7CisJfSBlbHNlIHsKKwkJd2F0dHJzZXQod2luLCBtZW51Ym94X2F0dHIpOworCQl3YWRkY2god2luLCBBQ1NfSExJTkUpOworCQl3YWRkY2god2luLCBBQ1NfSExJTkUpOworCQl3YWRkY2god2luLCBBQ1NfSExJTkUpOworCQl3YWRkY2god2luLCBBQ1NfSExJTkUpOworCX0KKworCXkgPSB5ICsgaGVpZ2h0ICsgMTsKKwl3bW92ZSh3aW4sIHksIHgpOworCisJaWYgKChoZWlnaHQgPCBpdGVtX25vKSAmJiAoc2Nyb2xsICsgY2hvaWNlIDwgaXRlbV9ubyAtIDEpKSB7CisJCXdhdHRyc2V0KHdpbiwgZGFycm93X2F0dHIpOworCQl3YWRkY2god2luLCBBQ1NfREFSUk9XKTsKKwkJd2FkZHN0cih3aW4sICIoKykiKTsKKwl9IGVsc2UgeworCQl3YXR0cnNldCh3aW4sIG1lbnVib3hfYm9yZGVyX2F0dHIpOworCQl3YWRkY2god2luLCBBQ1NfSExJTkUpOworCQl3YWRkY2god2luLCBBQ1NfSExJTkUpOworCQl3YWRkY2god2luLCBBQ1NfSExJTkUpOworCQl3YWRkY2god2luLCBBQ1NfSExJTkUpOworCX0KK30KKworLyoKKyAqICBEaXNwbGF5IHRoZSB0ZXJtaW5hdGlvbiBidXR0b25zCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X2J1dHRvbnMoV0lORE9XICogZGlhbG9nLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGludCBzZWxlY3RlZCkKK3sKKwlpbnQgeCA9IHdpZHRoIC8gMiAtIDExOworCWludCB5ID0gaGVpZ2h0IC0gMjsKKworCXByaW50X2J1dHRvbihkaWFsb2csICJTZWxlY3QiLCB5LCB4LCBzZWxlY3RlZCA9PSAwKTsKKwlwcmludF9idXR0b24oZGlhbG9nLCAiIEhlbHAgIiwgeSwgeCArIDE0LCBzZWxlY3RlZCA9PSAxKTsKKworCXdtb3ZlKGRpYWxvZywgeSwgeCArIDEgKyAxNCAqIHNlbGVjdGVkKTsKKwl3cmVmcmVzaChkaWFsb2cpOworfQorCisvKgorICogRGlzcGxheSBhIGRpYWxvZyBib3ggd2l0aCBhIGxpc3Qgb2Ygb3B0aW9ucyB0aGF0IGNhbiBiZSB0dXJuZWQgb24gb3Igb2ZmCisgKiBpbiB0aGUgc3R5bGUgb2YgcmFkaW9saXN0IChvbmx5IG9uZSBvcHRpb24gdHVybmVkIG9uIGF0IGEgdGltZSkuCisgKi8KK2ludCBkaWFsb2dfY2hlY2tsaXN0KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsCisJCSAgICAgaW50IHdpZHRoLCBpbnQgbGlzdF9oZWlnaHQsIGludCBpdGVtX25vLAorCQkgICAgIGNvbnN0IGNoYXIgKmNvbnN0ICppdGVtcykKK3sKKwlpbnQgaSwgeCwgeSwgYm94X3gsIGJveF95OworCWludCBrZXkgPSAwLCBidXR0b24gPSAwLCBjaG9pY2UgPSAwLCBzY3JvbGwgPSAwLCBtYXhfY2hvaWNlLCAqc3RhdHVzOworCVdJTkRPVyAqZGlhbG9nLCAqbGlzdDsKKworCS8qIEFsbG9jYXRlIHNwYWNlIGZvciBzdG9yaW5nIGl0ZW0gb24vb2ZmIHN0YXR1cyAqLworCWlmICgoc3RhdHVzID0gbWFsbG9jKHNpemVvZihpbnQpICogaXRlbV9ubykpID09IE5VTEwpIHsKKwkJZW5kd2luKCk7CisJCWZwcmludGYoc3RkZXJyLAorCQkJIlxuQ2FuJ3QgYWxsb2NhdGUgbWVtb3J5IGluIGRpYWxvZ19jaGVja2xpc3QoKS5cbiIpOworCQlleGl0KC0xKTsKKwl9CisKKwkvKiBJbml0aWFsaXplcyBzdGF0dXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaXRlbV9ubzsgaSsrKSB7CisJCXN0YXR1c1tpXSA9ICFzdHJjYXNlY21wKGl0ZW1zW2kgKiAzICsgMl0sICJvbiIpOworCQlpZiAoKCFjaG9pY2UgJiYgc3RhdHVzW2ldKQorCQkgICAgfHwgIXN0cmNhc2VjbXAoaXRlbXNbaSAqIDMgKyAyXSwgInNlbGVjdGVkIikpCisJCQljaG9pY2UgPSBpICsgMTsKKwl9CisJaWYgKGNob2ljZSkKKwkJY2hvaWNlLS07CisKKwltYXhfY2hvaWNlID0gTUlOKGxpc3RfaGVpZ2h0LCBpdGVtX25vKTsKKworCS8qIGNlbnRlciBkaWFsb2cgYm94IG9uIHNjcmVlbiAqLworCXggPSAoQ09MUyAtIHdpZHRoKSAvIDI7CisJeSA9IChMSU5FUyAtIGhlaWdodCkgLyAyOworCisJZHJhd19zaGFkb3coc3Rkc2NyLCB5LCB4LCBoZWlnaHQsIHdpZHRoKTsKKworCWRpYWxvZyA9IG5ld3dpbihoZWlnaHQsIHdpZHRoLCB5LCB4KTsKKwlrZXlwYWQoZGlhbG9nLCBUUlVFKTsKKworCWRyYXdfYm94KGRpYWxvZywgMCwgMCwgaGVpZ2h0LCB3aWR0aCwgZGlhbG9nX2F0dHIsIGJvcmRlcl9hdHRyKTsKKwl3YXR0cnNldChkaWFsb2csIGJvcmRlcl9hdHRyKTsKKwltdndhZGRjaChkaWFsb2csIGhlaWdodCAtIDMsIDAsIEFDU19MVEVFKTsKKwlmb3IgKGkgPSAwOyBpIDwgd2lkdGggLSAyOyBpKyspCisJCXdhZGRjaChkaWFsb2csIEFDU19ITElORSk7CisJd2F0dHJzZXQoZGlhbG9nLCBkaWFsb2dfYXR0cik7CisJd2FkZGNoKGRpYWxvZywgQUNTX1JURUUpOworCisJcHJpbnRfdGl0bGUoZGlhbG9nLCB0aXRsZSwgd2lkdGgpOworCisJd2F0dHJzZXQoZGlhbG9nLCBkaWFsb2dfYXR0cik7CisJcHJpbnRfYXV0b3dyYXAoZGlhbG9nLCBwcm9tcHQsIHdpZHRoIC0gMiwgMSwgMyk7CisKKwlsaXN0X3dpZHRoID0gd2lkdGggLSA2OworCWJveF95ID0gaGVpZ2h0IC0gbGlzdF9oZWlnaHQgLSA1OworCWJveF94ID0gKHdpZHRoIC0gbGlzdF93aWR0aCkgLyAyIC0gMTsKKworCS8qIGNyZWF0ZSBuZXcgd2luZG93IGZvciB0aGUgbGlzdCAqLworCWxpc3QgPSBzdWJ3aW4oZGlhbG9nLCBsaXN0X2hlaWdodCwgbGlzdF93aWR0aCwgeSArIGJveF95ICsgMSwKKwkgICAgICAgICAgICAgIHggKyBib3hfeCArIDEpOworCisJa2V5cGFkKGxpc3QsIFRSVUUpOworCisJLyogZHJhdyBhIGJveCBhcm91bmQgdGhlIGxpc3QgaXRlbXMgKi8KKwlkcmF3X2JveChkaWFsb2csIGJveF95LCBib3hfeCwgbGlzdF9oZWlnaHQgKyAyLCBsaXN0X3dpZHRoICsgMiwKKwkgICAgICAgICBtZW51Ym94X2JvcmRlcl9hdHRyLCBtZW51Ym94X2F0dHIpOworCisJLyogRmluZCBsZW5ndGggb2YgbG9uZ2VzdCBpdGVtIGluIG9yZGVyIHRvIGNlbnRlciBjaGVja2xpc3QgKi8KKwljaGVja194ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgaXRlbV9ubzsgaSsrKQorCQljaGVja194ID0gTUFYKGNoZWNrX3gsICtzdHJsZW4oaXRlbXNbaSAqIDMgKyAxXSkgKyA0KTsKKworCWNoZWNrX3ggPSAobGlzdF93aWR0aCAtIGNoZWNrX3gpIC8gMjsKKwlpdGVtX3ggPSBjaGVja194ICsgNDsKKworCWlmIChjaG9pY2UgPj0gbGlzdF9oZWlnaHQpIHsKKwkJc2Nyb2xsID0gY2hvaWNlIC0gbGlzdF9oZWlnaHQgKyAxOworCQljaG9pY2UgLT0gc2Nyb2xsOworCX0KKworCS8qIFByaW50IHRoZSBsaXN0ICovCisJZm9yIChpID0gMDsgaSA8IG1heF9jaG9pY2U7IGkrKykgeworCQlwcmludF9pdGVtKGxpc3QsIGl0ZW1zWyhzY3JvbGwgKyBpKSAqIDMgKyAxXSwKKwkJCSAgIHN0YXR1c1tpICsgc2Nyb2xsXSwgaSwgaSA9PSBjaG9pY2UpOworCX0KKworCXByaW50X2Fycm93cyhkaWFsb2csIGNob2ljZSwgaXRlbV9ubywgc2Nyb2xsLAorCQkgICAgIGJveF95LCBib3hfeCArIGNoZWNrX3ggKyA1LCBsaXN0X2hlaWdodCk7CisKKwlwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgMCk7CisKKwl3bm91dHJlZnJlc2goZGlhbG9nKTsKKwl3bm91dHJlZnJlc2gobGlzdCk7CisJZG91cGRhdGUoKTsKKworCXdoaWxlIChrZXkgIT0gRVNDKSB7CisJCWtleSA9IHdnZXRjaChkaWFsb2cpOworCisJCWZvciAoaSA9IDA7IGkgPCBtYXhfY2hvaWNlOyBpKyspCisJCQlpZiAodG91cHBlcihrZXkpID09CisJCQkgICAgdG91cHBlcihpdGVtc1soc2Nyb2xsICsgaSkgKiAzICsgMV1bMF0pKQorCQkJCWJyZWFrOworCisJCWlmIChpIDwgbWF4X2Nob2ljZSB8fCBrZXkgPT0gS0VZX1VQIHx8IGtleSA9PSBLRVlfRE9XTiB8fAorCQkgICAga2V5ID09ICcrJyB8fCBrZXkgPT0gJy0nKSB7CisJCQlpZiAoa2V5ID09IEtFWV9VUCB8fCBrZXkgPT0gJy0nKSB7CisJCQkJaWYgKCFjaG9pY2UpIHsKKwkJCQkJaWYgKCFzY3JvbGwpCisJCQkJCQljb250aW51ZTsKKwkJCQkJLyogU2Nyb2xsIGxpc3QgZG93biAqLworCQkJCQlpZiAobGlzdF9oZWlnaHQgPiAxKSB7CisJCQkJCQkvKiBEZS1oaWdobGlnaHQgY3VycmVudCBmaXJzdCBpdGVtICovCisJCQkJCQlwcmludF9pdGVtKGxpc3QsIGl0ZW1zW3Njcm9sbCAqIDMgKyAxXSwKKwkJCQkJCQkgICBzdGF0dXNbc2Nyb2xsXSwgMCwgRkFMU0UpOworCQkJCQkJc2Nyb2xsb2sobGlzdCwgVFJVRSk7CisJCQkJCQl3c2NybChsaXN0LCAtMSk7CisJCQkJCQlzY3JvbGxvayhsaXN0LCBGQUxTRSk7CisJCQkJCX0KKwkJCQkJc2Nyb2xsLS07CisJCQkJCXByaW50X2l0ZW0obGlzdCwgaXRlbXNbc2Nyb2xsICogMyArIDFdLCBzdGF0dXNbc2Nyb2xsXSwgMCwgVFJVRSk7CisJCQkJCXByaW50X2Fycm93cyhkaWFsb2csIGNob2ljZSwgaXRlbV9ubywKKwkJCQkJCSAgICAgc2Nyb2xsLCBib3hfeSwgYm94X3ggKyBjaGVja194ICsgNSwgbGlzdF9oZWlnaHQpOworCisJCQkJCXdub3V0cmVmcmVzaChkaWFsb2cpOworCQkJCQl3cmVmcmVzaChsaXN0KTsKKworCQkJCQljb250aW51ZTsJLyogd2FpdCBmb3IgYW5vdGhlciBrZXkgcHJlc3MgKi8KKwkJCQl9IGVsc2UKKwkJCQkJaSA9IGNob2ljZSAtIDE7CisJCQl9IGVsc2UgaWYgKGtleSA9PSBLRVlfRE9XTiB8fCBrZXkgPT0gJysnKSB7CisJCQkJaWYgKGNob2ljZSA9PSBtYXhfY2hvaWNlIC0gMSkgeworCQkJCQlpZiAoc2Nyb2xsICsgY2hvaWNlID49IGl0ZW1fbm8gLSAxKQorCQkJCQkJY29udGludWU7CisJCQkJCS8qIFNjcm9sbCBsaXN0IHVwICovCisJCQkJCWlmIChsaXN0X2hlaWdodCA+IDEpIHsKKwkJCQkJCS8qIERlLWhpZ2hsaWdodCBjdXJyZW50IGxhc3QgaXRlbSBiZWZvcmUgc2Nyb2xsaW5nIHVwICovCisJCQkJCQlwcmludF9pdGVtKGxpc3QsIGl0ZW1zWyhzY3JvbGwgKyBtYXhfY2hvaWNlIC0gMSkgKiAzICsgMV0sCisJCQkJCQkJICAgc3RhdHVzW3Njcm9sbCArIG1heF9jaG9pY2UgLSAxXSwKKwkJCQkJCQkgICBtYXhfY2hvaWNlIC0gMSwgRkFMU0UpOworCQkJCQkJc2Nyb2xsb2sobGlzdCwgVFJVRSk7CisJCQkJCQl3c2NybChsaXN0LCAxKTsKKwkJCQkJCXNjcm9sbG9rKGxpc3QsIEZBTFNFKTsKKwkJCQkJfQorCQkJCQlzY3JvbGwrKzsKKwkJCQkJcHJpbnRfaXRlbShsaXN0LCBpdGVtc1soc2Nyb2xsICsgbWF4X2Nob2ljZSAtIDEpICogMyArIDFdLAorCQkJCQkJICAgc3RhdHVzW3Njcm9sbCArIG1heF9jaG9pY2UgLSAxXSwgbWF4X2Nob2ljZSAtIDEsIFRSVUUpOworCisJCQkJCXByaW50X2Fycm93cyhkaWFsb2csIGNob2ljZSwgaXRlbV9ubywKKwkJCQkJCSAgICAgc2Nyb2xsLCBib3hfeSwgYm94X3ggKyBjaGVja194ICsgNSwgbGlzdF9oZWlnaHQpOworCisJCQkJCXdub3V0cmVmcmVzaChkaWFsb2cpOworCQkJCQl3cmVmcmVzaChsaXN0KTsKKworCQkJCQljb250aW51ZTsJLyogd2FpdCBmb3IgYW5vdGhlciBrZXkgcHJlc3MgKi8KKwkJCQl9IGVsc2UKKwkJCQkJaSA9IGNob2ljZSArIDE7CisJCQl9CisJCQlpZiAoaSAhPSBjaG9pY2UpIHsKKwkJCQkvKiBEZS1oaWdobGlnaHQgY3VycmVudCBpdGVtICovCisJCQkJcHJpbnRfaXRlbShsaXN0LCBpdGVtc1soc2Nyb2xsICsgY2hvaWNlKSAqIDMgKyAxXSwKKwkJCQkJICAgc3RhdHVzW3Njcm9sbCArIGNob2ljZV0sIGNob2ljZSwgRkFMU0UpOworCQkJCS8qIEhpZ2hsaWdodCBuZXcgaXRlbSAqLworCQkJCWNob2ljZSA9IGk7CisJCQkJcHJpbnRfaXRlbShsaXN0LCBpdGVtc1soc2Nyb2xsICsgY2hvaWNlKSAqIDMgKyAxXSwKKwkJCQkJICAgc3RhdHVzW3Njcm9sbCArIGNob2ljZV0sIGNob2ljZSwgVFJVRSk7CisJCQkJd25vdXRyZWZyZXNoKGRpYWxvZyk7CisJCQkJd3JlZnJlc2gobGlzdCk7CisJCQl9CisJCQljb250aW51ZTsJLyogd2FpdCBmb3IgYW5vdGhlciBrZXkgcHJlc3MgKi8KKwkJfQorCQlzd2l0Y2ggKGtleSkgeworCQljYXNlICdIJzoKKwkJY2FzZSAnaCc6CisJCWNhc2UgJz8nOgorCQkJZnByaW50ZihzdGRlcnIsICIlcyIsIGl0ZW1zWyhzY3JvbGwgKyBjaG9pY2UpICogM10pOworCQkJZGVsd2luKGRpYWxvZyk7CisJCQlmcmVlKHN0YXR1cyk7CisJCQlyZXR1cm4gMTsKKwkJY2FzZSBUQUI6CisJCWNhc2UgS0VZX0xFRlQ6CisJCWNhc2UgS0VZX1JJR0hUOgorCQkJYnV0dG9uID0gKChrZXkgPT0gS0VZX0xFRlQgPyAtLWJ1dHRvbiA6ICsrYnV0dG9uKSA8IDApCisJCQkgICAgPyAxIDogKGJ1dHRvbiA+IDEgPyAwIDogYnV0dG9uKTsKKworCQkJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIGJ1dHRvbik7CisJCQl3cmVmcmVzaChkaWFsb2cpOworCQkJYnJlYWs7CisJCWNhc2UgJ1MnOgorCQljYXNlICdzJzoKKwkJY2FzZSAnICc6CisJCWNhc2UgJ1xuJzoKKwkJCWlmICghYnV0dG9uKSB7CisJCQkJaWYgKCFzdGF0dXNbc2Nyb2xsICsgY2hvaWNlXSkgeworCQkJCQlmb3IgKGkgPSAwOyBpIDwgaXRlbV9ubzsgaSsrKQorCQkJCQkJc3RhdHVzW2ldID0gMDsKKwkJCQkJc3RhdHVzW3Njcm9sbCArIGNob2ljZV0gPSAxOworCQkJCQlmb3IgKGkgPSAwOyBpIDwgbWF4X2Nob2ljZTsgaSsrKQorCQkJCQkJcHJpbnRfaXRlbShsaXN0LCBpdGVtc1soc2Nyb2xsICsgaSkgKiAzICsgMV0sCisJCQkJCQkJICAgc3RhdHVzW3Njcm9sbCArIGldLCBpLCBpID09IGNob2ljZSk7CisJCQkJfQorCQkJCXdub3V0cmVmcmVzaChkaWFsb2cpOworCQkJCXdyZWZyZXNoKGxpc3QpOworCisJCQkJZm9yIChpID0gMDsgaSA8IGl0ZW1fbm87IGkrKykKKwkJCQkJaWYgKHN0YXR1c1tpXSkKKwkJCQkJCWZwcmludGYoc3RkZXJyLCAiJXMiLCBpdGVtc1tpICogM10pOworCQkJfSBlbHNlCisJCQkJZnByaW50ZihzdGRlcnIsICIlcyIsIGl0ZW1zWyhzY3JvbGwgKyBjaG9pY2UpICogM10pOworCQkJZGVsd2luKGRpYWxvZyk7CisJCQlmcmVlKHN0YXR1cyk7CisJCQlyZXR1cm4gYnV0dG9uOworCQljYXNlICdYJzoKKwkJY2FzZSAneCc6CisJCQlrZXkgPSBFU0M7CisJCWNhc2UgRVNDOgorCQkJYnJlYWs7CisJCX0KKworCQkvKiBOb3csIHVwZGF0ZSBldmVyeXRoaW5nLi4uICovCisJCWRvdXBkYXRlKCk7CisJfQorCisJZGVsd2luKGRpYWxvZyk7CisJZnJlZShzdGF0dXMpOworCXJldHVybiAtMTsJCS8qIEVTQyBwcmVzc2VkICovCit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvY29sb3JzLmggYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvY29sb3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIwNzFkZgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9jb2xvcnMuaApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqICBjb2xvcnMuaCAtLSBjb2xvciBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMKKyAqCisgKiAgQVVUSE9SOiBTYXZpbyBMYW0gKGxhbTgzNkBjcy5jdWhrLmhrKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworLyoKKyAqICAgRGVmYXVsdCBjb2xvciBkZWZpbml0aW9ucworICoKKyAqICAgKl9GRyA9IGZvcmVncm91bmQKKyAqICAgKl9CRyA9IGJhY2tncm91bmQKKyAqICAgKl9ITCA9IGhpZ2hsaWdodD8KKyAqLworI2RlZmluZSBTQ1JFRU5fRkcgICAgICAgICAgICAgICAgICAgIENPTE9SX0NZQU4KKyNkZWZpbmUgU0NSRUVOX0JHICAgICAgICAgICAgICAgICAgICBDT0xPUl9CTFVFCisjZGVmaW5lIFNDUkVFTl9ITCAgICAgICAgICAgICAgICAgICAgVFJVRQorCisjZGVmaW5lIFNIQURPV19GRyAgICAgICAgICAgICAgICAgICAgQ09MT1JfQkxBQ0sKKyNkZWZpbmUgU0hBRE9XX0JHICAgICAgICAgICAgICAgICAgICBDT0xPUl9CTEFDSworI2RlZmluZSBTSEFET1dfSEwgICAgICAgICAgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBESUFMT0dfRkcgICAgICAgICAgICAgICAgICAgIENPTE9SX0JMQUNLCisjZGVmaW5lIERJQUxPR19CRyAgICAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgRElBTE9HX0hMICAgICAgICAgICAgICAgICAgICBGQUxTRQorCisjZGVmaW5lIFRJVExFX0ZHICAgICAgICAgICAgICAgICAgICAgQ09MT1JfWUVMTE9XCisjZGVmaW5lIFRJVExFX0JHICAgICAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgVElUTEVfSEwgICAgICAgICAgICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgQk9SREVSX0ZHICAgICAgICAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBCT1JERVJfQkcgICAgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIEJPUkRFUl9ITCAgICAgICAgICAgICAgICAgICAgVFJVRQorCisjZGVmaW5lIEJVVFRPTl9BQ1RJVkVfRkcgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgQlVUVE9OX0FDVElWRV9CRyAgICAgICAgICAgICBDT0xPUl9CTFVFCisjZGVmaW5lIEJVVFRPTl9BQ1RJVkVfSEwgICAgICAgICAgICAgVFJVRQorCisjZGVmaW5lIEJVVFRPTl9JTkFDVElWRV9GRyAgICAgICAgICAgQ09MT1JfQkxBQ0sKKyNkZWZpbmUgQlVUVE9OX0lOQUNUSVZFX0JHICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBCVVRUT05fSU5BQ1RJVkVfSEwgICAgICAgICAgIEZBTFNFCisKKyNkZWZpbmUgQlVUVE9OX0tFWV9BQ1RJVkVfRkcgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBCVVRUT05fS0VZX0FDVElWRV9CRyAgICAgICAgIENPTE9SX0JMVUUKKyNkZWZpbmUgQlVUVE9OX0tFWV9BQ1RJVkVfSEwgICAgICAgICBUUlVFCisKKyNkZWZpbmUgQlVUVE9OX0tFWV9JTkFDVElWRV9GRyAgICAgICBDT0xPUl9SRUQKKyNkZWZpbmUgQlVUVE9OX0tFWV9JTkFDVElWRV9CRyAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBCVVRUT05fS0VZX0lOQUNUSVZFX0hMICAgICAgIEZBTFNFCisKKyNkZWZpbmUgQlVUVE9OX0xBQkVMX0FDVElWRV9GRyAgICAgICBDT0xPUl9ZRUxMT1cKKyNkZWZpbmUgQlVUVE9OX0xBQkVMX0FDVElWRV9CRyAgICAgICBDT0xPUl9CTFVFCisjZGVmaW5lIEJVVFRPTl9MQUJFTF9BQ1RJVkVfSEwgICAgICAgVFJVRQorCisjZGVmaW5lIEJVVFRPTl9MQUJFTF9JTkFDVElWRV9GRyAgICAgQ09MT1JfQkxBQ0sKKyNkZWZpbmUgQlVUVE9OX0xBQkVMX0lOQUNUSVZFX0JHICAgICBDT0xPUl9XSElURQorI2RlZmluZSBCVVRUT05fTEFCRUxfSU5BQ1RJVkVfSEwgICAgIFRSVUUKKworI2RlZmluZSBJTlBVVEJPWF9GRyAgICAgICAgICAgICAgICAgIENPTE9SX0JMQUNLCisjZGVmaW5lIElOUFVUQk9YX0JHICAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgSU5QVVRCT1hfSEwgICAgICAgICAgICAgICAgICBGQUxTRQorCisjZGVmaW5lIElOUFVUQk9YX0JPUkRFUl9GRyAgICAgICAgICAgQ09MT1JfQkxBQ0sKKyNkZWZpbmUgSU5QVVRCT1hfQk9SREVSX0JHICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBJTlBVVEJPWF9CT1JERVJfSEwgICAgICAgICAgIEZBTFNFCisKKyNkZWZpbmUgU0VBUkNIQk9YX0ZHICAgICAgICAgICAgICAgICBDT0xPUl9CTEFDSworI2RlZmluZSBTRUFSQ0hCT1hfQkcgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIFNFQVJDSEJPWF9ITCAgICAgICAgICAgICAgICAgRkFMU0UKKworI2RlZmluZSBTRUFSQ0hCT1hfVElUTEVfRkcgICAgICAgICAgIENPTE9SX1lFTExPVworI2RlZmluZSBTRUFSQ0hCT1hfVElUTEVfQkcgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIFNFQVJDSEJPWF9USVRMRV9ITCAgICAgICAgICAgVFJVRQorCisjZGVmaW5lIFNFQVJDSEJPWF9CT1JERVJfRkcgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgU0VBUkNIQk9YX0JPUkRFUl9CRyAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBTRUFSQ0hCT1hfQk9SREVSX0hMICAgICAgICAgIFRSVUUKKworI2RlZmluZSBQT1NJVElPTl9JTkRJQ0FUT1JfRkcgICAgICAgIENPTE9SX1lFTExPVworI2RlZmluZSBQT1NJVElPTl9JTkRJQ0FUT1JfQkcgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIFBPU0lUSU9OX0lORElDQVRPUl9ITCAgICAgICAgVFJVRQorCisjZGVmaW5lIE1FTlVCT1hfRkcgICAgICAgICAgICAgICAgICAgQ09MT1JfQkxBQ0sKKyNkZWZpbmUgTUVOVUJPWF9CRyAgICAgICAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBNRU5VQk9YX0hMICAgICAgICAgICAgICAgICAgIEZBTFNFCisKKyNkZWZpbmUgTUVOVUJPWF9CT1JERVJfRkcgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBNRU5VQk9YX0JPUkRFUl9CRyAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIE1FTlVCT1hfQk9SREVSX0hMICAgICAgICAgICAgVFJVRQorCisjZGVmaW5lIElURU1fRkcgICAgICAgICAgICAgICAgICAgICAgQ09MT1JfQkxBQ0sKKyNkZWZpbmUgSVRFTV9CRyAgICAgICAgICAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBJVEVNX0hMICAgICAgICAgICAgICAgICAgICAgIEZBTFNFCisKKyNkZWZpbmUgSVRFTV9TRUxFQ1RFRF9GRyAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBJVEVNX1NFTEVDVEVEX0JHICAgICAgICAgICAgIENPTE9SX0JMVUUKKyNkZWZpbmUgSVRFTV9TRUxFQ1RFRF9ITCAgICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgVEFHX0ZHICAgICAgICAgICAgICAgICAgICAgICBDT0xPUl9ZRUxMT1cKKyNkZWZpbmUgVEFHX0JHICAgICAgICAgICAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBUQUdfSEwgICAgICAgICAgICAgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBUQUdfU0VMRUNURURfRkcgICAgICAgICAgICAgIENPTE9SX1lFTExPVworI2RlZmluZSBUQUdfU0VMRUNURURfQkcgICAgICAgICAgICAgIENPTE9SX0JMVUUKKyNkZWZpbmUgVEFHX1NFTEVDVEVEX0hMICAgICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgVEFHX0tFWV9GRyAgICAgICAgICAgICAgICAgICBDT0xPUl9ZRUxMT1cKKyNkZWZpbmUgVEFHX0tFWV9CRyAgICAgICAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBUQUdfS0VZX0hMICAgICAgICAgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBUQUdfS0VZX1NFTEVDVEVEX0ZHICAgICAgICAgIENPTE9SX1lFTExPVworI2RlZmluZSBUQUdfS0VZX1NFTEVDVEVEX0JHICAgICAgICAgIENPTE9SX0JMVUUKKyNkZWZpbmUgVEFHX0tFWV9TRUxFQ1RFRF9ITCAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgQ0hFQ0tfRkcgICAgICAgICAgICAgICAgICAgICBDT0xPUl9CTEFDSworI2RlZmluZSBDSEVDS19CRyAgICAgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIENIRUNLX0hMICAgICAgICAgICAgICAgICAgICAgRkFMU0UKKworI2RlZmluZSBDSEVDS19TRUxFQ1RFRF9GRyAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIENIRUNLX1NFTEVDVEVEX0JHICAgICAgICAgICAgQ09MT1JfQkxVRQorI2RlZmluZSBDSEVDS19TRUxFQ1RFRF9ITCAgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBVQVJST1dfRkcgICAgICAgICAgICAgICAgICAgIENPTE9SX0dSRUVOCisjZGVmaW5lIFVBUlJPV19CRyAgICAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgVUFSUk9XX0hMICAgICAgICAgICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgREFSUk9XX0ZHICAgICAgICAgICAgICAgICAgICBDT0xPUl9HUkVFTgorI2RlZmluZSBEQVJST1dfQkcgICAgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIERBUlJPV19ITCAgICAgICAgICAgICAgICAgICAgVFJVRQorCisvKiBFbmQgb2YgZGVmYXVsdCBjb2xvciBkZWZpbml0aW9ucyAqLworCisjZGVmaW5lIENfQVRUUih4LHkpICAgICAgICAgICAgICAgICAgKCh4ID8gQV9CT0xEIDogMCkgfCBDT0xPUl9QQUlSKCh5KSkpCisjZGVmaW5lIENPTE9SX05BTUVfTEVOICAgICAgICAgICAgICAgMTAKKyNkZWZpbmUgQ09MT1JfQ09VTlQgICAgICAgICAgICAgICAgICA4CisKKy8qCisgKiBHbG9iYWwgdmFyaWFibGVzCisgKi8KKworZXh0ZXJuIGludCBjb2xvcl90YWJsZVtdWzNdOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2RpYWxvZy5oIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL2RpYWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmM2NmNzEKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvZGlhbG9nLmgKQEAgLTAsMCArMSwxNzcgQEAKKy8qCisgKiAgZGlhbG9nLmggLS0gY29tbW9uIGRlY2xhcmF0aW9ucyBmb3IgYWxsIGRpYWxvZyBtb2R1bGVzCisgKgorICogIEFVVEhPUjogU2F2aW8gTGFtIChsYW04MzZAY3MuY3Voay5oaykKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpZmRlZiBfX3N1bl9fCisjZGVmaW5lIENVUlNfTUFDUk9TCisjZW5kaWYKKyNpbmNsdWRlIENVUlNFU19MT0MKKworLyoKKyAqIENvbG9ycyBpbiBuY3Vyc2VzIDEuOS45ZSBkbyBub3Qgd29yayBwcm9wZXJseSBzaW5jZSBmb3JlZ3JvdW5kIGFuZAorICogYmFja2dyb3VuZCBjb2xvcnMgYXJlIE9SJ2QgcmF0aGVyIHRoYW4gc2VwYXJhdGVseSBtYXNrZWQuICBUaGlzIHZlcnNpb24KKyAqIG9mIGRpYWxvZyB3YXMgaGFja2VkIHRvIHdvcmsgd2l0aCBuY3Vyc2VzIDEuOS45ZSwgbWFraW5nIGl0IGluY29tcGF0aWJsZQorICogd2l0aCBzdGFuZGFyZCBjdXJzZXMuICBUaGUgc2ltcGxlc3QgZml4ICh0byBtYWtlIHRoaXMgd29yayB3aXRoIHN0YW5kYXJkCisgKiBjdXJzZXMpIHVzZXMgdGhlIHdia2dkc2V0KCkgZnVuY3Rpb24sIG5vdCB1c2VkIGluIHRoZSBvcmlnaW5hbCBoYWNrLgorICogVHVybiBpdCBvZmYgaWYgd2UncmUgYnVpbGRpbmcgd2l0aCAxLjkuOWUsIHNpbmNlIGl0IGp1c3QgY29uZnVzZXMgdGhpbmdzLgorICovCisjaWYgZGVmaW5lZChOQ1VSU0VTX1ZFUlNJT04pICYmIGRlZmluZWQoX05FRURfV1JBUCkgJiYgIWRlZmluZWQoR0NDX1BSSU5URkxJS0UpCisjZGVmaW5lIE9MRF9OQ1VSU0VTIDEKKyN1bmRlZiAgd2JrZ2RzZXQKKyNkZWZpbmUgd2JrZ2RzZXQodyxwKQkJLypub3RoaW5nICovCisjZWxzZQorI2RlZmluZSBPTERfTkNVUlNFUyAwCisjZW5kaWYKKworI2RlZmluZSBUUihwYXJhbXMpIF90cmFjZWYgcGFyYW1zCisKKyNkZWZpbmUgRVNDIDI3CisjZGVmaW5lIFRBQiA5CisjZGVmaW5lIE1BWF9MRU4gMjA0OAorI2RlZmluZSBCVUZfU0laRSAoMTAqMTAyNCkKKyNkZWZpbmUgTUlOKHgseSkgKHggPCB5ID8geCA6IHkpCisjZGVmaW5lIE1BWCh4LHkpICh4ID4geSA/IHggOiB5KQorCisjaWZuZGVmIEFDU19VTENPUk5FUgorI2RlZmluZSBBQ1NfVUxDT1JORVIgJysnCisjZW5kaWYKKyNpZm5kZWYgQUNTX0xMQ09STkVSCisjZGVmaW5lIEFDU19MTENPUk5FUiAnKycKKyNlbmRpZgorI2lmbmRlZiBBQ1NfVVJDT1JORVIKKyNkZWZpbmUgQUNTX1VSQ09STkVSICcrJworI2VuZGlmCisjaWZuZGVmIEFDU19MUkNPUk5FUgorI2RlZmluZSBBQ1NfTFJDT1JORVIgJysnCisjZW5kaWYKKyNpZm5kZWYgQUNTX0hMSU5FCisjZGVmaW5lIEFDU19ITElORSAnLScKKyNlbmRpZgorI2lmbmRlZiBBQ1NfVkxJTkUKKyNkZWZpbmUgQUNTX1ZMSU5FICd8JworI2VuZGlmCisjaWZuZGVmIEFDU19MVEVFCisjZGVmaW5lIEFDU19MVEVFICcrJworI2VuZGlmCisjaWZuZGVmIEFDU19SVEVFCisjZGVmaW5lIEFDU19SVEVFICcrJworI2VuZGlmCisjaWZuZGVmIEFDU19VQVJST1cKKyNkZWZpbmUgQUNTX1VBUlJPVyAnXicKKyNlbmRpZgorI2lmbmRlZiBBQ1NfREFSUk9XCisjZGVmaW5lIEFDU19EQVJST1cgJ3YnCisjZW5kaWYKKworLyoKKyAqIEF0dHJpYnV0ZSBuYW1lcworICovCisjZGVmaW5lIHNjcmVlbl9hdHRyICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMF0KKyNkZWZpbmUgc2hhZG93X2F0dHIgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1sxXQorI2RlZmluZSBkaWFsb2dfYXR0ciAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzJdCisjZGVmaW5lIHRpdGxlX2F0dHIgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbM10KKyNkZWZpbmUgYm9yZGVyX2F0dHIgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1s0XQorI2RlZmluZSBidXR0b25fYWN0aXZlX2F0dHIgICAgICAgICAgICBhdHRyaWJ1dGVzWzVdCisjZGVmaW5lIGJ1dHRvbl9pbmFjdGl2ZV9hdHRyICAgICAgICAgIGF0dHJpYnV0ZXNbNl0KKyNkZWZpbmUgYnV0dG9uX2tleV9hY3RpdmVfYXR0ciAgICAgICAgYXR0cmlidXRlc1s3XQorI2RlZmluZSBidXR0b25fa2V5X2luYWN0aXZlX2F0dHIgICAgICBhdHRyaWJ1dGVzWzhdCisjZGVmaW5lIGJ1dHRvbl9sYWJlbF9hY3RpdmVfYXR0ciAgICAgIGF0dHJpYnV0ZXNbOV0KKyNkZWZpbmUgYnV0dG9uX2xhYmVsX2luYWN0aXZlX2F0dHIgICAgYXR0cmlidXRlc1sxMF0KKyNkZWZpbmUgaW5wdXRib3hfYXR0ciAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1sxMV0KKyNkZWZpbmUgaW5wdXRib3hfYm9yZGVyX2F0dHIgICAgICAgICAgYXR0cmlidXRlc1sxMl0KKyNkZWZpbmUgc2VhcmNoYm94X2F0dHIgICAgICAgICAgICAgICAgYXR0cmlidXRlc1sxM10KKyNkZWZpbmUgc2VhcmNoYm94X3RpdGxlX2F0dHIgICAgICAgICAgYXR0cmlidXRlc1sxNF0KKyNkZWZpbmUgc2VhcmNoYm94X2JvcmRlcl9hdHRyICAgICAgICAgYXR0cmlidXRlc1sxNV0KKyNkZWZpbmUgcG9zaXRpb25faW5kaWNhdG9yX2F0dHIgICAgICAgYXR0cmlidXRlc1sxNl0KKyNkZWZpbmUgbWVudWJveF9hdHRyICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1sxN10KKyNkZWZpbmUgbWVudWJveF9ib3JkZXJfYXR0ciAgICAgICAgICAgYXR0cmlidXRlc1sxOF0KKyNkZWZpbmUgaXRlbV9hdHRyICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1sxOV0KKyNkZWZpbmUgaXRlbV9zZWxlY3RlZF9hdHRyICAgICAgICAgICAgYXR0cmlidXRlc1syMF0KKyNkZWZpbmUgdGFnX2F0dHIgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1syMV0KKyNkZWZpbmUgdGFnX3NlbGVjdGVkX2F0dHIgICAgICAgICAgICAgYXR0cmlidXRlc1syMl0KKyNkZWZpbmUgdGFnX2tleV9hdHRyICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1syM10KKyNkZWZpbmUgdGFnX2tleV9zZWxlY3RlZF9hdHRyICAgICAgICAgYXR0cmlidXRlc1syNF0KKyNkZWZpbmUgY2hlY2tfYXR0ciAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1syNV0KKyNkZWZpbmUgY2hlY2tfc2VsZWN0ZWRfYXR0ciAgICAgICAgICAgYXR0cmlidXRlc1syNl0KKyNkZWZpbmUgdWFycm93X2F0dHIgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1syN10KKyNkZWZpbmUgZGFycm93X2F0dHIgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1syOF0KKworLyogbnVtYmVyIG9mIGF0dHJpYnV0ZXMgKi8KKyNkZWZpbmUgQVRUUklCVVRFX0NPVU5UICAgICAgICAgICAgICAgMjkKKworLyoKKyAqIEdsb2JhbCB2YXJpYWJsZXMKKyAqLworZXh0ZXJuIGJvb2wgdXNlX2NvbG9yczsKK2V4dGVybiBib29sIHVzZV9zaGFkb3c7CisKK2V4dGVybiBjaHR5cGUgYXR0cmlidXRlc1tdOworCitleHRlcm4gY29uc3QgY2hhciAqYmFja3RpdGxlOworCisvKgorICogRnVuY3Rpb24gcHJvdG90eXBlcworICovCitleHRlcm4gdm9pZCBjcmVhdGVfcmMoY29uc3QgY2hhciAqZmlsZW5hbWUpOworZXh0ZXJuIGludCBwYXJzZV9yYyh2b2lkKTsKKwordm9pZCBpbml0X2RpYWxvZyh2b2lkKTsKK3ZvaWQgZW5kX2RpYWxvZyh2b2lkKTsKK3ZvaWQgYXR0cl9jbGVhcihXSU5ET1cgKiB3aW4sIGludCBoZWlnaHQsIGludCB3aWR0aCwgY2h0eXBlIGF0dHIpOwordm9pZCBkaWFsb2dfY2xlYXIodm9pZCk7Cit2b2lkIGNvbG9yX3NldHVwKHZvaWQpOwordm9pZCBwcmludF9hdXRvd3JhcChXSU5ET1cgKiB3aW4sIGNvbnN0IGNoYXIgKnByb21wdCwgaW50IHdpZHRoLCBpbnQgeSwgaW50IHgpOwordm9pZCBwcmludF9idXR0b24oV0lORE9XICogd2luLCBjb25zdCBjaGFyICpsYWJlbCwgaW50IHksIGludCB4LCBpbnQgc2VsZWN0ZWQpOwordm9pZCBwcmludF90aXRsZShXSU5ET1cgKmRpYWxvZywgY29uc3QgY2hhciAqdGl0bGUsIGludCB3aWR0aCk7Cit2b2lkIGRyYXdfYm94KFdJTkRPVyAqIHdpbiwgaW50IHksIGludCB4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGNodHlwZSBib3gsCisJICAgICAgY2h0eXBlIGJvcmRlcik7Cit2b2lkIGRyYXdfc2hhZG93KFdJTkRPVyAqIHdpbiwgaW50IHksIGludCB4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpOworCitpbnQgZmlyc3RfYWxwaGEoY29uc3QgY2hhciAqc3RyaW5nLCBjb25zdCBjaGFyICpleGVtcHQpOworaW50IGRpYWxvZ195ZXNubyhjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpOworaW50IGRpYWxvZ19tc2dib3goY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnByb21wdCwgaW50IGhlaWdodCwKKwkJICBpbnQgd2lkdGgsIGludCBwYXVzZSk7CitpbnQgZGlhbG9nX3RleHRib3goY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBoZWlnaHQsIGludCB3aWR0aCk7CitpbnQgZGlhbG9nX21lbnUoY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnByb21wdCwgaW50IGhlaWdodCwgaW50IHdpZHRoLAorCQlpbnQgbWVudV9oZWlnaHQsIGNvbnN0IGNoYXIgKmNob2ljZSwgaW50IGl0ZW1fbm8sCisJCWNvbnN0IGNoYXIgKmNvbnN0ICppdGVtcyk7CitpbnQgZGlhbG9nX2NoZWNrbGlzdChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LAorCQkgICAgIGludCB3aWR0aCwgaW50IGxpc3RfaGVpZ2h0LCBpbnQgaXRlbV9ubywKKwkJICAgICBjb25zdCBjaGFyICpjb25zdCAqaXRlbXMpOworZXh0ZXJuIGNoYXIgZGlhbG9nX2lucHV0X3Jlc3VsdFtdOworaW50IGRpYWxvZ19pbnB1dGJveChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LAorCQkgICAgaW50IHdpZHRoLCBjb25zdCBjaGFyICppbml0KTsKKworLyoKKyAqIFRoaXMgaXMgdGhlIGJhc2UgZm9yIGZpY3RpdGlvdXMga2V5cywgd2hpY2ggYWN0aXZhdGUKKyAqIHRoZSBidXR0b25zLgorICoKKyAqIE1vdXNlLWdlbmVyYXRlZCBrZXlzIGFyZSB0aGUgZm9sbG93aW5nOgorICogICAtLSB0aGUgZmlyc3QgMzIgYXJlIHVzZWQgYXMgbnVtYmVycywgaW4gYWRkaXRpb24gdG8gJzAnLSc5JworICogICAtLSB0aGUgbG93ZXJjYXNlIGFyZSB1c2VkIHRvIHNpZ25hbCBtb3VzZS1lbnRlciBldmVudHMgKE1fRVZFTlQgKyAnbycpCisgKiAgIC0tIHVwcGVyY2FzZSBjaGFycyBhcmUgdXNlZCB0byBpbnZva2UgdGhlIGJ1dHRvbiAoTV9FVkVOVCArICdPJykKKyAqLworI2RlZmluZSBNX0VWRU5UIChLRVlfTUFYKzEpCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvaW5wdXRib3guYyBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9pbnB1dGJveC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3OTUwMzcKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvaW5wdXRib3guYwpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqICBpbnB1dGJveC5jIC0tIGltcGxlbWVudHMgdGhlIGlucHV0IGJveAorICoKKyAqICBPUklHSU5BTCBBVVRIT1I6IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspCisgKiAgTU9ESUZJRUQgRk9SIExJTlVYIEtFUk5FTCBDT05GSUcgQlk6IFdpbGxpYW0gUm9hZGNhcCAocm9hZGNhcEBjZncuY29tKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImRpYWxvZy5oIgorCitjaGFyIGRpYWxvZ19pbnB1dF9yZXN1bHRbTUFYX0xFTiArIDFdOworCisvKgorICogIFByaW50IHRoZSB0ZXJtaW5hdGlvbiBidXR0b25zCisgKi8KK3N0YXRpYyB2b2lkIHByaW50X2J1dHRvbnMoV0lORE9XICogZGlhbG9nLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGludCBzZWxlY3RlZCkKK3sKKwlpbnQgeCA9IHdpZHRoIC8gMiAtIDExOworCWludCB5ID0gaGVpZ2h0IC0gMjsKKworCXByaW50X2J1dHRvbihkaWFsb2csICIgIE9rICAiLCB5LCB4LCBzZWxlY3RlZCA9PSAwKTsKKwlwcmludF9idXR0b24oZGlhbG9nLCAiIEhlbHAgIiwgeSwgeCArIDE0LCBzZWxlY3RlZCA9PSAxKTsKKworCXdtb3ZlKGRpYWxvZywgeSwgeCArIDEgKyAxNCAqIHNlbGVjdGVkKTsKKwl3cmVmcmVzaChkaWFsb2cpOworfQorCisvKgorICogRGlzcGxheSBhIGRpYWxvZyBib3ggZm9yIGlucHV0aW5nIGEgc3RyaW5nCisgKi8KK2ludCBkaWFsb2dfaW5wdXRib3goY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnByb21wdCwgaW50IGhlaWdodCwgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICppbml0KQoreworCWludCBpLCB4LCB5LCBib3hfeSwgYm94X3gsIGJveF93aWR0aDsKKwlpbnQgaW5wdXRfeCA9IDAsIHNjcm9sbCA9IDAsIGtleSA9IDAsIGJ1dHRvbiA9IC0xOworCWNoYXIgKmluc3RyID0gZGlhbG9nX2lucHV0X3Jlc3VsdDsKKwlXSU5ET1cgKmRpYWxvZzsKKworCS8qIGNlbnRlciBkaWFsb2cgYm94IG9uIHNjcmVlbiAqLworCXggPSAoQ09MUyAtIHdpZHRoKSAvIDI7CisJeSA9IChMSU5FUyAtIGhlaWdodCkgLyAyOworCisJZHJhd19zaGFkb3coc3Rkc2NyLCB5LCB4LCBoZWlnaHQsIHdpZHRoKTsKKworCWRpYWxvZyA9IG5ld3dpbihoZWlnaHQsIHdpZHRoLCB5LCB4KTsKKwlrZXlwYWQoZGlhbG9nLCBUUlVFKTsKKworCWRyYXdfYm94KGRpYWxvZywgMCwgMCwgaGVpZ2h0LCB3aWR0aCwgZGlhbG9nX2F0dHIsIGJvcmRlcl9hdHRyKTsKKwl3YXR0cnNldChkaWFsb2csIGJvcmRlcl9hdHRyKTsKKwltdndhZGRjaChkaWFsb2csIGhlaWdodCAtIDMsIDAsIEFDU19MVEVFKTsKKwlmb3IgKGkgPSAwOyBpIDwgd2lkdGggLSAyOyBpKyspCisJCXdhZGRjaChkaWFsb2csIEFDU19ITElORSk7CisJd2F0dHJzZXQoZGlhbG9nLCBkaWFsb2dfYXR0cik7CisJd2FkZGNoKGRpYWxvZywgQUNTX1JURUUpOworCisJcHJpbnRfdGl0bGUoZGlhbG9nLCB0aXRsZSwgd2lkdGgpOworCisJd2F0dHJzZXQoZGlhbG9nLCBkaWFsb2dfYXR0cik7CisJcHJpbnRfYXV0b3dyYXAoZGlhbG9nLCBwcm9tcHQsIHdpZHRoIC0gMiwgMSwgMyk7CisKKwkvKiBEcmF3IHRoZSBpbnB1dCBmaWVsZCBib3ggKi8KKwlib3hfd2lkdGggPSB3aWR0aCAtIDY7CisJZ2V0eXgoZGlhbG9nLCB5LCB4KTsKKwlib3hfeSA9IHkgKyAyOworCWJveF94ID0gKHdpZHRoIC0gYm94X3dpZHRoKSAvIDI7CisJZHJhd19ib3goZGlhbG9nLCB5ICsgMSwgYm94X3ggLSAxLCAzLCBib3hfd2lkdGggKyAyLCBib3JkZXJfYXR0ciwgZGlhbG9nX2F0dHIpOworCisJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIDApOworCisJLyogU2V0IHVwIHRoZSBpbml0aWFsIHZhbHVlICovCisJd21vdmUoZGlhbG9nLCBib3hfeSwgYm94X3gpOworCXdhdHRyc2V0KGRpYWxvZywgaW5wdXRib3hfYXR0cik7CisKKwlpZiAoIWluaXQpCisJCWluc3RyWzBdID0gJ1wwJzsKKwllbHNlCisJCXN0cmNweShpbnN0ciwgaW5pdCk7CisKKwlpbnB1dF94ID0gc3RybGVuKGluc3RyKTsKKworCWlmIChpbnB1dF94ID49IGJveF93aWR0aCkgeworCQlzY3JvbGwgPSBpbnB1dF94IC0gYm94X3dpZHRoICsgMTsKKwkJaW5wdXRfeCA9IGJveF93aWR0aCAtIDE7CisJCWZvciAoaSA9IDA7IGkgPCBib3hfd2lkdGggLSAxOyBpKyspCisJCQl3YWRkY2goZGlhbG9nLCBpbnN0cltzY3JvbGwgKyBpXSk7CisJfSBlbHNlIHsKKwkJd2FkZHN0cihkaWFsb2csIGluc3RyKTsKKwl9CisKKwl3bW92ZShkaWFsb2csIGJveF95LCBib3hfeCArIGlucHV0X3gpOworCisJd3JlZnJlc2goZGlhbG9nKTsKKworCXdoaWxlIChrZXkgIT0gRVNDKSB7CisJCWtleSA9IHdnZXRjaChkaWFsb2cpOworCisJCWlmIChidXR0b24gPT0gLTEpIHsJLyogSW5wdXQgYm94IHNlbGVjdGVkICovCisJCQlzd2l0Y2ggKGtleSkgeworCQkJY2FzZSBUQUI6CisJCQljYXNlIEtFWV9VUDoKKwkJCWNhc2UgS0VZX0RPV046CisJCQkJYnJlYWs7CisJCQljYXNlIEtFWV9MRUZUOgorCQkJCWNvbnRpbnVlOworCQkJY2FzZSBLRVlfUklHSFQ6CisJCQkJY29udGludWU7CisJCQljYXNlIEtFWV9CQUNLU1BBQ0U6CisJCQljYXNlIDEyNzoKKwkJCQlpZiAoaW5wdXRfeCB8fCBzY3JvbGwpIHsKKwkJCQkJd2F0dHJzZXQoZGlhbG9nLCBpbnB1dGJveF9hdHRyKTsKKwkJCQkJaWYgKCFpbnB1dF94KSB7CisJCQkJCQlzY3JvbGwgPSBzY3JvbGwgPCBib3hfd2lkdGggLSAxID8gMCA6IHNjcm9sbCAtIChib3hfd2lkdGggLSAxKTsKKwkJCQkJCXdtb3ZlKGRpYWxvZywgYm94X3ksIGJveF94KTsKKwkJCQkJCWZvciAoaSA9IDA7IGkgPCBib3hfd2lkdGg7IGkrKykKKwkJCQkJCQl3YWRkY2goZGlhbG9nLAorCQkJCQkJCSAgICAgICBpbnN0cltzY3JvbGwgKyBpbnB1dF94ICsgaV0gPworCQkJCQkJCSAgICAgICBpbnN0cltzY3JvbGwgKyBpbnB1dF94ICsgaV0gOiAnICcpOworCQkJCQkJaW5wdXRfeCA9IHN0cmxlbihpbnN0cikgLSBzY3JvbGw7CisJCQkJCX0gZWxzZQorCQkJCQkJaW5wdXRfeC0tOworCQkJCQlpbnN0cltzY3JvbGwgKyBpbnB1dF94XSA9ICdcMCc7CisJCQkJCW12d2FkZGNoKGRpYWxvZywgYm94X3ksIGlucHV0X3ggKyBib3hfeCwgJyAnKTsKKwkJCQkJd21vdmUoZGlhbG9nLCBib3hfeSwgaW5wdXRfeCArIGJveF94KTsKKwkJCQkJd3JlZnJlc2goZGlhbG9nKTsKKwkJCQl9CisJCQkJY29udGludWU7CisJCQlkZWZhdWx0OgorCQkJCWlmIChrZXkgPCAweDEwMCAmJiBpc3ByaW50KGtleSkpIHsKKwkJCQkJaWYgKHNjcm9sbCArIGlucHV0X3ggPCBNQVhfTEVOKSB7CisJCQkJCQl3YXR0cnNldChkaWFsb2csIGlucHV0Ym94X2F0dHIpOworCQkJCQkJaW5zdHJbc2Nyb2xsICsgaW5wdXRfeF0gPSBrZXk7CisJCQkJCQlpbnN0cltzY3JvbGwgKyBpbnB1dF94ICsgMV0gPSAnXDAnOworCQkJCQkJaWYgKGlucHV0X3ggPT0gYm94X3dpZHRoIC0gMSkgeworCQkJCQkJCXNjcm9sbCsrOworCQkJCQkJCXdtb3ZlKGRpYWxvZywgYm94X3ksIGJveF94KTsKKwkJCQkJCQlmb3IgKGkgPSAwOyBpIDwgYm94X3dpZHRoIC0gMTsgaSsrKQorCQkJCQkJCQl3YWRkY2goZGlhbG9nLCBpbnN0ciBbc2Nyb2xsICsgaV0pOworCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQl3bW92ZShkaWFsb2csIGJveF95LCBpbnB1dF94KysgKyBib3hfeCk7CisJCQkJCQkJd2FkZGNoKGRpYWxvZywga2V5KTsKKwkJCQkJCX0KKwkJCQkJCXdyZWZyZXNoKGRpYWxvZyk7CisJCQkJCX0gZWxzZQorCQkJCQkJZmxhc2goKTsJLyogQWxhcm0gdXNlciBhYm91dCBvdmVyZmxvdyAqLworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCX0KKwkJc3dpdGNoIChrZXkpIHsKKwkJY2FzZSAnTyc6CisJCWNhc2UgJ28nOgorCQkJZGVsd2luKGRpYWxvZyk7CisJCQlyZXR1cm4gMDsKKwkJY2FzZSAnSCc6CisJCWNhc2UgJ2gnOgorCQkJZGVsd2luKGRpYWxvZyk7CisJCQlyZXR1cm4gMTsKKwkJY2FzZSBLRVlfVVA6CisJCWNhc2UgS0VZX0xFRlQ6CisJCQlzd2l0Y2ggKGJ1dHRvbikgeworCQkJY2FzZSAtMToKKwkJCQlidXR0b24gPSAxOwkvKiBJbmRpY2F0ZXMgIkNhbmNlbCIgYnV0dG9uIGlzIHNlbGVjdGVkICovCisJCQkJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIDEpOworCQkJCWJyZWFrOworCQkJY2FzZSAwOgorCQkJCWJ1dHRvbiA9IC0xOwkvKiBJbmRpY2F0ZXMgaW5wdXQgYm94IGlzIHNlbGVjdGVkICovCisJCQkJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIDApOworCQkJCXdtb3ZlKGRpYWxvZywgYm94X3ksIGJveF94ICsgaW5wdXRfeCk7CisJCQkJd3JlZnJlc2goZGlhbG9nKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgMToKKwkJCQlidXR0b24gPSAwOwkvKiBJbmRpY2F0ZXMgIk9LIiBidXR0b24gaXMgc2VsZWN0ZWQgKi8KKwkJCQlwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgMCk7CisJCQkJYnJlYWs7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBUQUI6CisJCWNhc2UgS0VZX0RPV046CisJCWNhc2UgS0VZX1JJR0hUOgorCQkJc3dpdGNoIChidXR0b24pIHsKKwkJCWNhc2UgLTE6CisJCQkJYnV0dG9uID0gMDsJLyogSW5kaWNhdGVzICJPSyIgYnV0dG9uIGlzIHNlbGVjdGVkICovCisJCQkJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIDApOworCQkJCWJyZWFrOworCQkJY2FzZSAwOgorCQkJCWJ1dHRvbiA9IDE7CS8qIEluZGljYXRlcyAiQ2FuY2VsIiBidXR0b24gaXMgc2VsZWN0ZWQgKi8KKwkJCQlwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgMSk7CisJCQkJYnJlYWs7CisJCQljYXNlIDE6CisJCQkJYnV0dG9uID0gLTE7CS8qIEluZGljYXRlcyBpbnB1dCBib3ggaXMgc2VsZWN0ZWQgKi8KKwkJCQlwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgMCk7CisJCQkJd21vdmUoZGlhbG9nLCBib3hfeSwgYm94X3ggKyBpbnB1dF94KTsKKwkJCQl3cmVmcmVzaChkaWFsb2cpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJyAnOgorCQljYXNlICdcbic6CisJCQlkZWx3aW4oZGlhbG9nKTsKKwkJCXJldHVybiAoYnV0dG9uID09IC0xID8gMCA6IGJ1dHRvbik7CisJCWNhc2UgJ1gnOgorCQljYXNlICd4JzoKKwkJCWtleSA9IEVTQzsKKwkJY2FzZSBFU0M6CisJCQlicmVhazsKKwkJfQorCX0KKworCWRlbHdpbihkaWFsb2cpOworCXJldHVybiAtMTsJCS8qIEVTQyBwcmVzc2VkICovCit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvbHhkaWFsb2cuYyBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9seGRpYWxvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZjZjNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvbHhkaWFsb2cuYwpAQCAtMCwwICsxLDIwNCBAQAorLyoKKyAqICBkaWFsb2cgLSBEaXNwbGF5IHNpbXBsZSBkaWFsb2cgYm94ZXMgZnJvbSBzaGVsbCBzY3JpcHRzCisgKgorICogIE9SSUdJTkFMIEFVVEhPUjogU2F2aW8gTGFtIChsYW04MzZAY3MuY3Voay5oaykKKyAqICBNT0RJRklFRCBGT1IgTElOVVggS0VSTkVMIENPTkZJRyBCWTogV2lsbGlhbSBSb2FkY2FwIChyb2FkY2FwQGNmdy5jb20pCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZGlhbG9nLmgiCisKK3N0YXRpYyB2b2lkIFVzYWdlKGNvbnN0IGNoYXIgKm5hbWUpOworCit0eXBlZGVmIGludCAoanVtcGVyRm4pIChjb25zdCBjaGFyICp0aXRsZSwgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmNvbnN0ICphcmd2KTsKKworc3RydWN0IE1vZGUgeworCWNoYXIgKm5hbWU7CisJaW50IGFyZ21pbiwgYXJnbWF4LCBhcmdtb2Q7CisJanVtcGVyRm4gKmp1bXBlcjsKK307CisKK2p1bXBlckZuIGpfbWVudSwgal9yYWRpb2xpc3QsIGpfeWVzbm8sIGpfdGV4dGJveCwgal9pbnB1dGJveDsKK2p1bXBlckZuIGpfbXNnYm94LCBqX2luZm9ib3g7CisKK3N0YXRpYyBzdHJ1Y3QgTW9kZSBtb2Rlc1tdID0geworCXsiLS1tZW51IiwgOSwgMCwgMywgal9tZW51fSwKKwl7Ii0tcmFkaW9saXN0IiwgOSwgMCwgMywgal9yYWRpb2xpc3R9LAorCXsiLS15ZXNubyIsIDUsIDUsIDEsIGpfeWVzbm99LAorCXsiLS10ZXh0Ym94IiwgNSwgNSwgMSwgal90ZXh0Ym94fSwKKwl7Ii0taW5wdXRib3giLCA1LCA2LCAxLCBqX2lucHV0Ym94fSwKKwl7Ii0tbXNnYm94IiwgNSwgNSwgMSwgal9tc2dib3h9LAorCXsiLS1pbmZvYm94IiwgNSwgNSwgMSwgal9pbmZvYm94fSwKKwl7TlVMTCwgMCwgMCwgMCwgTlVMTH0KK307CisKK3N0YXRpYyBzdHJ1Y3QgTW9kZSAqbW9kZVB0cjsKKworI2lmZGVmIExPQ0FMRQorI2luY2x1ZGUgPGxvY2FsZS5oPgorI2VuZGlmCisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICpjb25zdCAqYXJndikKK3sKKwlpbnQgb2Zmc2V0ID0gMCwgb3B0X2NsZWFyID0gMCwgZW5kX2NvbW1vbl9vcHRzID0gMCwgcmV0dmFsOworCWNvbnN0IGNoYXIgKnRpdGxlID0gTlVMTDsKKworI2lmZGVmIExPQ0FMRQorCSh2b2lkKXNldGxvY2FsZShMQ19BTEwsICIiKTsKKyNlbmRpZgorCisjaWZkZWYgVFJBQ0UKKwl0cmFjZShUUkFDRV9DQUxMUyB8IFRSQUNFX1VQREFURSk7CisjZW5kaWYKKwlpZiAoYXJnYyA8IDIpIHsKKwkJVXNhZ2UoYXJndlswXSk7CisJCWV4aXQoLTEpOworCX0KKworCXdoaWxlIChvZmZzZXQgPCBhcmdjIC0gMSAmJiAhZW5kX2NvbW1vbl9vcHRzKSB7CS8qIENvbW1vbiBvcHRpb25zICovCisJCWlmICghc3RyY21wKGFyZ3Zbb2Zmc2V0ICsgMV0sICItLXRpdGxlIikpIHsKKwkJCWlmIChhcmdjIC0gb2Zmc2V0IDwgMyB8fCB0aXRsZSAhPSBOVUxMKSB7CisJCQkJVXNhZ2UoYXJndlswXSk7CisJCQkJZXhpdCgtMSk7CisJCQl9IGVsc2UgeworCQkJCXRpdGxlID0gYXJndltvZmZzZXQgKyAyXTsKKwkJCQlvZmZzZXQgKz0gMjsKKwkJCX0KKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3Zbb2Zmc2V0ICsgMV0sICItLWJhY2t0aXRsZSIpKSB7CisJCQlpZiAoYmFja3RpdGxlICE9IE5VTEwpIHsKKwkJCQlVc2FnZShhcmd2WzBdKTsKKwkJCQlleGl0KC0xKTsKKwkJCX0gZWxzZSB7CisJCQkJYmFja3RpdGxlID0gYXJndltvZmZzZXQgKyAyXTsKKwkJCQlvZmZzZXQgKz0gMjsKKwkJCX0KKwkJfSBlbHNlIGlmICghc3RyY21wKGFyZ3Zbb2Zmc2V0ICsgMV0sICItLWNsZWFyIikpIHsKKwkJCWlmIChvcHRfY2xlYXIpIHsJLyogSGV5LCAiLS1jbGVhciIgY2FuJ3QgYXBwZWFyIHR3aWNlISAqLworCQkJCVVzYWdlKGFyZ3ZbMF0pOworCQkJCWV4aXQoLTEpOworCQkJfSBlbHNlIGlmIChhcmdjID09IDIpIHsJLyogd2Ugb25seSB3YW50IHRvIGNsZWFyIHRoZSBzY3JlZW4gKi8KKwkJCQlpbml0X2RpYWxvZygpOworCQkJCXJlZnJlc2goKTsJLyogaW5pdF9kaWFsb2coKSB3aWxsIGNsZWFyIHRoZSBzY3JlZW4gZm9yIHVzICovCisJCQkJZW5kX2RpYWxvZygpOworCQkJCXJldHVybiAwOworCQkJfSBlbHNlIHsKKwkJCQlvcHRfY2xlYXIgPSAxOworCQkJCW9mZnNldCsrOworCQkJfQorCQl9IGVsc2UJCS8qIG5vIG1vcmUgY29tbW9uIG9wdGlvbnMgKi8KKwkJCWVuZF9jb21tb25fb3B0cyA9IDE7CisJfQorCisJaWYgKGFyZ2MgLSAxID09IG9mZnNldCkgewkvKiBubyBtb3JlIG9wdGlvbnMgKi8KKwkJVXNhZ2UoYXJndlswXSk7CisJCWV4aXQoLTEpOworCX0KKwkvKiB1c2UgYSB0YWJsZSB0byBsb29rIGZvciB0aGUgcmVxdWVzdGVkIG1vZGUsIHRvIGF2b2lkIGNvZGUgZHVwbGljYXRpb24gKi8KKworCWZvciAobW9kZVB0ciA9IG1vZGVzOyBtb2RlUHRyLT5uYW1lOyBtb2RlUHRyKyspCS8qIGxvb2sgZm9yIHRoZSBtb2RlICovCisJCWlmICghc3RyY21wKGFyZ3Zbb2Zmc2V0ICsgMV0sIG1vZGVQdHItPm5hbWUpKQorCQkJYnJlYWs7CisKKwlpZiAoIW1vZGVQdHItPm5hbWUpCisJCVVzYWdlKGFyZ3ZbMF0pOworCWlmIChhcmdjIC0gb2Zmc2V0IDwgbW9kZVB0ci0+YXJnbWluKQorCQlVc2FnZShhcmd2WzBdKTsKKwlpZiAobW9kZVB0ci0+YXJnbWF4ICYmIGFyZ2MgLSBvZmZzZXQgPiBtb2RlUHRyLT5hcmdtYXgpCisJCVVzYWdlKGFyZ3ZbMF0pOworCisJaW5pdF9kaWFsb2coKTsKKwlyZXR2YWwgPSAoKihtb2RlUHRyLT5qdW1wZXIpKSAodGl0bGUsIGFyZ2MgLSBvZmZzZXQsIGFyZ3YgKyBvZmZzZXQpOworCisJaWYgKG9wdF9jbGVhcikgewkvKiBjbGVhciBzY3JlZW4gYmVmb3JlIGV4aXQgKi8KKwkJYXR0cl9jbGVhcihzdGRzY3IsIExJTkVTLCBDT0xTLCBzY3JlZW5fYXR0cik7CisJCXJlZnJlc2goKTsKKwl9CisJZW5kX2RpYWxvZygpOworCisJZXhpdChyZXR2YWwpOworfQorCisvKgorICogUHJpbnQgcHJvZ3JhbSB1c2FnZQorICovCitzdGF0aWMgdm9pZCBVc2FnZShjb25zdCBjaGFyICpuYW1lKQoreworCWZwcmludGYoc3RkZXJyLCAiXAorXG5kaWFsb2csIGJ5IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspLlwKK1xuICBwYXRjaGVkIGJ5IFN0dWFydCBIZXJiZXJ0IChTLkhlcmJlcnRAc2hlZi5hYy51aylcCitcbiAgbW9kaWZpZWQvZ3V0dGVkIGZvciB1c2UgYXMgYSBMaW51eCBrZXJuZWwgY29uZmlnIHRvb2wgYnkgXAorXG4gIFdpbGxpYW0gUm9hZGNhcCAocm9hZGNhcHdAY2Z3LmNvbSlcCitcblwKK1xuKiBEaXNwbGF5IGRpYWxvZyBib3hlcyBmcm9tIHNoZWxsIHNjcmlwdHMgKlwKK1xuXAorXG5Vc2FnZTogJXMgLS1jbGVhclwKK1xuICAgICAgICVzIFstLXRpdGxlIDx0aXRsZT5dIFstLWJhY2t0aXRsZSA8YmFja3RpdGxlPl0gLS1jbGVhciA8Qm94IG9wdGlvbnM+XAorXG5cCitcbkJveCBvcHRpb25zOlwKK1xuXAorXG4gIC0tbWVudSAgICAgIDx0ZXh0PiA8aGVpZ2h0PiA8d2lkdGg+IDxtZW51IGhlaWdodD4gPHRhZzE+IDxpdGVtMT4uLi5cCitcbiAgLS1yYWRpb2xpc3QgPHRleHQ+IDxoZWlnaHQ+IDx3aWR0aD4gPGxpc3QgaGVpZ2h0PiA8dGFnMT4gPGl0ZW0xPiA8c3RhdHVzMT4uLi5cCitcbiAgLS10ZXh0Ym94ICAgPGZpbGU+IDxoZWlnaHQ+IDx3aWR0aD5cCitcbiAgLS1pbnB1dGJveCAgPHRleHQ+IDxoZWlnaHQ+IDx3aWR0aD4gWzxpbml0Pl1cCitcbiAgLS15ZXNubyAgICAgPHRleHQ+IDxoZWlnaHQ+IDx3aWR0aD5cCitcbiIsIG5hbWUsIG5hbWUpOworCWV4aXQoLTEpOworfQorCisvKgorICogVGhlc2UgYXJlIHRoZSBwcm9ncmFtIGp1bXBlcnMKKyAqLworCitpbnQgal9tZW51KGNvbnN0IGNoYXIgKnQsIGludCBhYywgY29uc3QgY2hhciAqY29uc3QgKmF2KQoreworCXJldHVybiBkaWFsb2dfbWVudSh0LCBhdlsyXSwgYXRvaShhdlszXSksIGF0b2koYXZbNF0pLAorCQkJICAgYXRvaShhdls1XSksIGF2WzZdLCAoYWMgLSA2KSAvIDIsIGF2ICsgNyk7Cit9CisKK2ludCBqX3JhZGlvbGlzdChjb25zdCBjaGFyICp0LCBpbnQgYWMsIGNvbnN0IGNoYXIgKmNvbnN0ICphdikKK3sKKwlyZXR1cm4gZGlhbG9nX2NoZWNrbGlzdCh0LCBhdlsyXSwgYXRvaShhdlszXSksIGF0b2koYXZbNF0pLAorCQkJCWF0b2koYXZbNV0pLCAoYWMgLSA2KSAvIDMsIGF2ICsgNik7Cit9CisKK2ludCBqX3RleHRib3goY29uc3QgY2hhciAqdCwgaW50IGFjLCBjb25zdCBjaGFyICpjb25zdCAqYXYpCit7CisJcmV0dXJuIGRpYWxvZ190ZXh0Ym94KHQsIGF2WzJdLCBhdG9pKGF2WzNdKSwgYXRvaShhdls0XSkpOworfQorCitpbnQgal95ZXNubyhjb25zdCBjaGFyICp0LCBpbnQgYWMsIGNvbnN0IGNoYXIgKmNvbnN0ICphdikKK3sKKwlyZXR1cm4gZGlhbG9nX3llc25vKHQsIGF2WzJdLCBhdG9pKGF2WzNdKSwgYXRvaShhdls0XSkpOworfQorCitpbnQgal9pbnB1dGJveChjb25zdCBjaGFyICp0LCBpbnQgYWMsIGNvbnN0IGNoYXIgKmNvbnN0ICphdikKK3sKKwlpbnQgcmV0ID0gZGlhbG9nX2lucHV0Ym94KHQsIGF2WzJdLCBhdG9pKGF2WzNdKSwgYXRvaShhdls0XSksCisJCQkJICBhYyA9PSA2ID8gYXZbNV0gOiAoY2hhciAqKU5VTEwpOworCWlmIChyZXQgPT0gMCkKKwkJZnByaW50ZihzdGRlcnIsIGRpYWxvZ19pbnB1dF9yZXN1bHQpOworCXJldHVybiByZXQ7Cit9CisKK2ludCBqX21zZ2JveChjb25zdCBjaGFyICp0LCBpbnQgYWMsIGNvbnN0IGNoYXIgKmNvbnN0ICphdikKK3sKKwlyZXR1cm4gZGlhbG9nX21zZ2JveCh0LCBhdlsyXSwgYXRvaShhdlszXSksIGF0b2koYXZbNF0pLCAxKTsKK30KKworaW50IGpfaW5mb2JveChjb25zdCBjaGFyICp0LCBpbnQgYWMsIGNvbnN0IGNoYXIgKmNvbnN0ICphdikKK3sKKwlyZXR1cm4gZGlhbG9nX21zZ2JveCh0LCBhdlsyXSwgYXRvaShhdlszXSksIGF0b2koYXZbNF0pLCAwKTsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9tZW51Ym94LmMgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvbWVudWJveC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZDUwMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvbWVudWJveC5jCkBAIC0wLDAgKzEsNDI2IEBACisvKgorICogIG1lbnVib3guYyAtLSBpbXBsZW1lbnRzIHRoZSBtZW51IGJveAorICoKKyAqICBPUklHSU5BTCBBVVRIT1I6IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspCisgKiAgTU9ESUZJRUQgRk9SIExJTlVYIEtFUk5FTCBDT05GSUcgQlk6IFdpbGxpYW0gUm9hZGNhcCAocm9hZGNhcHdAY2Z3LmNvbSkKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKy8qCisgKiAgQ2hhbmdlcyBieSBDbGlmZm9yZCBXb2xmIChnb2RAY2xpZmZvcmQuYXQpCisgKgorICogIFsgMTk5OC0wNi0xMyBdCisgKgorICogICAgKikgIEEgYnVnZml4IGZvciB0aGUgUGFnZS1Eb3duIHByb2JsZW0KKyAqCisgKiAgICAqKSAgRm9ybWVybHkgd2hlbiBJIHVzZWQgUGFnZSBEb3duIGFuZCBQYWdlIFVwLCB0aGUgY3Vyc29yIHdvdWxkIGJlIHNldAorICogICAgICAgIHRvIHRoZSBmaXJzdCBwb3NpdGlvbiBpbiB0aGUgbWVudSBib3guICBOb3cgbHhkaWFsb2cgaXMgYSBiaXQKKyAqICAgICAgICBzbWFydGVyIGFuZCB3b3JrcyBtb3JlIGxpa2Ugb3RoZXIgbWVudSBzeXN0ZW1zIChqdXN0IGhhdmUgYSBsb29rIGF0CisgKiAgICAgICAgaXQpLgorICoKKyAqICAgICopICBGb3JtZXJseSBpZiBJIHNlbGVjdGVkIHNvbWV0aGluZyBteSBzY3JvbGxpbmcgd291bGQgYmUgYnJva2VuIGJlY2F1c2UKKyAqICAgICAgICBseGRpYWxvZyBpcyByZS1pbnZva2VkIGJ5IHRoZSBNZW51Y29uZmlnIHNoZWxsIHNjcmlwdCwgY2FuJ3QKKyAqICAgICAgICByZW1lbWJlciB0aGUgbGFzdCBzY3JvbGxpbmcgcG9zaXRpb24sIGFuZCBqdXN0IHNldHMgaXQgc28gdGhhdCB0aGUKKyAqICAgICAgICBjdXJzb3IgaXMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgYm94LiAgTm93IGl0IHdyaXRlcyB0aGUgdGVtcG9yYXJ5IGZpbGUKKyAqICAgICAgICBseGRpYWxvZy5zY3JsdG1wIHdoaWNoIGNvbnRhaW5zIHRoaXMgaW5mb3JtYXRpb24uIFRoZSBmaWxlIGlzCisgKiAgICAgICAgZGVsZXRlZCBieSBseGRpYWxvZyBpZiB0aGUgdXNlciBsZWF2ZXMgYSBzdWJtZW51IG9yIGVudGVycyBhIG5ldworICogICAgICAgIG9uZSwgYnV0IGl0IHdvdWxkIGJlIG5pY2UgaWYgTWVudWNvbmZpZyBjb3VsZCBtYWtlIGFub3RoZXIgInJtIC1mIgorICogICAgICAgIGp1c3QgdG8gYmUgc3VyZS4gIEp1c3QgdHJ5IGl0IG91dCAtIHlvdSB3aWxsIHJlY29nbmlzZSBhIGRpZmZlcmVuY2UhCisgKgorICogIFsgMTk5OC0wNi0xNCBdCisgKgorICogICAgKikgIE5vdyBseGRpYWxvZyBpcyBjcmFzaC1zYWZlIGFnYWluc3QgYnJva2VuICJseGRpYWxvZy5zY3JsdG1wIiBmaWxlcworICogICAgICAgIGFuZCBtZW51cyBjaGFuZ2UgdGhlaXIgc2l6ZSBvbiB0aGUgZmx5LgorICoKKyAqICAgICopICBJZiBmb3Igc29tZSByZWFzb24gdGhlIGxhc3Qgc2Nyb2xsaW5nIHBvc2l0aW9uIGlzIG5vdCBzYXZlZCBieQorICogICAgICAgIGx4ZGlhbG9nLCBpdCBzZXRzIHRoZSBzY3JvbGxpbmcgc28gdGhhdCB0aGUgc2VsZWN0ZWQgaXRlbSBpcyBpbiB0aGUKKyAqICAgICAgICBtaWRkbGUgb2YgdGhlIG1lbnUgYm94LCBub3QgYXQgdGhlIGJvdHRvbS4KKyAqCisgKiAwMiBKYW51YXJ5IDE5OTksIE1pY2hhZWwgRWxpemFiZXRoIENoYXN0YWluIChtZWNAc2hvdXQubmV0KQorICogUmVzZXQgJ3Njcm9sbCcgdG8gMCBpZiB0aGUgdmFsdWUgZnJvbSBseGRpYWxvZy5zY3JsdG1wIGlzIGJvZ3VzLgorICogVGhpcyBmaXhlcyBhIGJ1ZyBpbiBNZW51Y29uZmlnIHdoZXJlIHVzaW5nICcgJyB0byBkZXNjZW5kIGludG8gbWVudXMKKyAqIHdvdWxkIGxlYXZlIG1pcy1zeW5jaHJvbml6ZWQgbHhkaWFsb2cuc2NybHRtcCBmaWxlcyBseWluZyBhcm91bmQsCisgKiBmc2NhbmYgd291bGQgcmVhZCBpbiAnc2Nyb2xsJywgYW5kIGV2ZW50dWFsbHkgdGhhdCB2YWx1ZSB3b3VsZCBnZXQgdXNlZC4KKyAqLworCisjaW5jbHVkZSAiZGlhbG9nLmgiCisKK3N0YXRpYyBpbnQgbWVudV93aWR0aCwgaXRlbV94OworCisvKgorICogUHJpbnQgbWVudSBpdGVtCisgKi8KK3N0YXRpYyB2b2lkIGRvX3ByaW50X2l0ZW0oV0lORE9XICogd2luLCBjb25zdCBjaGFyICppdGVtLCBpbnQgY2hvaWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2VsZWN0ZWQsIGludCBob3RrZXkpCit7CisJaW50IGo7CisJY2hhciAqbWVudV9pdGVtID0gbWFsbG9jKG1lbnVfd2lkdGggKyAxKTsKKworCXN0cm5jcHkobWVudV9pdGVtLCBpdGVtLCBtZW51X3dpZHRoIC0gaXRlbV94KTsKKwltZW51X2l0ZW1bbWVudV93aWR0aF0gPSAwOworCWogPSBmaXJzdF9hbHBoYShtZW51X2l0ZW0sICJZeU5uTW1IaCIpOworCisJLyogQ2xlYXIgJ3Jlc2lkdWUnIG9mIGxhc3QgaXRlbSAqLworCXdhdHRyc2V0KHdpbiwgbWVudWJveF9hdHRyKTsKKwl3bW92ZSh3aW4sIGNob2ljZSwgMCk7CisjaWYgT0xEX05DVVJTRVMKKwl7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgbWVudV93aWR0aDsgaSsrKQorCQkJd2FkZGNoKHdpbiwgJyAnKTsKKwl9CisjZWxzZQorCXdjbHJ0b2VvbCh3aW4pOworI2VuZGlmCisJd2F0dHJzZXQod2luLCBzZWxlY3RlZCA/IGl0ZW1fc2VsZWN0ZWRfYXR0ciA6IGl0ZW1fYXR0cik7CisJbXZ3YWRkc3RyKHdpbiwgY2hvaWNlLCBpdGVtX3gsIG1lbnVfaXRlbSk7CisJaWYgKGhvdGtleSkgeworCQl3YXR0cnNldCh3aW4sIHNlbGVjdGVkID8gdGFnX2tleV9zZWxlY3RlZF9hdHRyIDogdGFnX2tleV9hdHRyKTsKKwkJbXZ3YWRkY2god2luLCBjaG9pY2UsIGl0ZW1feCArIGosIG1lbnVfaXRlbVtqXSk7CisJfQorCWlmIChzZWxlY3RlZCkgeworCQl3bW92ZSh3aW4sIGNob2ljZSwgaXRlbV94ICsgMSk7CisJfQorCWZyZWUobWVudV9pdGVtKTsKKwl3cmVmcmVzaCh3aW4pOworfQorCisjZGVmaW5lIHByaW50X2l0ZW0oaW5kZXgsIGNob2ljZSwgc2VsZWN0ZWQpIFwKK2RvIHtcCisJaW50IGhvdGtleSA9IChpdGVtc1soaW5kZXgpICogMl1bMF0gIT0gJzonKTsgXAorCWRvX3ByaW50X2l0ZW0obWVudSwgaXRlbXNbKGluZGV4KSAqIDIgKyAxXSwgY2hvaWNlLCBzZWxlY3RlZCwgaG90a2V5KTsgXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIFByaW50IHRoZSBzY3JvbGwgaW5kaWNhdG9ycy4KKyAqLworc3RhdGljIHZvaWQgcHJpbnRfYXJyb3dzKFdJTkRPVyAqIHdpbiwgaW50IGl0ZW1fbm8sIGludCBzY3JvbGwsIGludCB5LCBpbnQgeCwKKwkJCSBpbnQgaGVpZ2h0KQoreworCWludCBjdXJfeSwgY3VyX3g7CisKKwlnZXR5eCh3aW4sIGN1cl95LCBjdXJfeCk7CisKKwl3bW92ZSh3aW4sIHksIHgpOworCisJaWYgKHNjcm9sbCA+IDApIHsKKwkJd2F0dHJzZXQod2luLCB1YXJyb3dfYXR0cik7CisJCXdhZGRjaCh3aW4sIEFDU19VQVJST1cpOworCQl3YWRkc3RyKHdpbiwgIigtKSIpOworCX0gZWxzZSB7CisJCXdhdHRyc2V0KHdpbiwgbWVudWJveF9hdHRyKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwkJd2FkZGNoKHdpbiwgQUNTX0hMSU5FKTsKKwl9CisKKwl5ID0geSArIGhlaWdodCArIDE7CisJd21vdmUod2luLCB5LCB4KTsKKwl3cmVmcmVzaCh3aW4pOworCisJaWYgKChoZWlnaHQgPCBpdGVtX25vKSAmJiAoc2Nyb2xsICsgaGVpZ2h0IDwgaXRlbV9ubykpIHsKKwkJd2F0dHJzZXQod2luLCBkYXJyb3dfYXR0cik7CisJCXdhZGRjaCh3aW4sIEFDU19EQVJST1cpOworCQl3YWRkc3RyKHdpbiwgIigrKSIpOworCX0gZWxzZSB7CisJCXdhdHRyc2V0KHdpbiwgbWVudWJveF9ib3JkZXJfYXR0cik7CisJCXdhZGRjaCh3aW4sIEFDU19ITElORSk7CisJCXdhZGRjaCh3aW4sIEFDU19ITElORSk7CisJCXdhZGRjaCh3aW4sIEFDU19ITElORSk7CisJCXdhZGRjaCh3aW4sIEFDU19ITElORSk7CisJfQorCisJd21vdmUod2luLCBjdXJfeSwgY3VyX3gpOworCXdyZWZyZXNoKHdpbik7Cit9CisKKy8qCisgKiBEaXNwbGF5IHRoZSB0ZXJtaW5hdGlvbiBidXR0b25zLgorICovCitzdGF0aWMgdm9pZCBwcmludF9idXR0b25zKFdJTkRPVyAqIHdpbiwgaW50IGhlaWdodCwgaW50IHdpZHRoLCBpbnQgc2VsZWN0ZWQpCit7CisJaW50IHggPSB3aWR0aCAvIDIgLSAxNjsKKwlpbnQgeSA9IGhlaWdodCAtIDI7CisKKwlwcmludF9idXR0b24od2luLCAiU2VsZWN0IiwgeSwgeCwgc2VsZWN0ZWQgPT0gMCk7CisJcHJpbnRfYnV0dG9uKHdpbiwgIiBFeGl0ICIsIHksIHggKyAxMiwgc2VsZWN0ZWQgPT0gMSk7CisJcHJpbnRfYnV0dG9uKHdpbiwgIiBIZWxwICIsIHksIHggKyAyNCwgc2VsZWN0ZWQgPT0gMik7CisKKwl3bW92ZSh3aW4sIHksIHggKyAxICsgMTIgKiBzZWxlY3RlZCk7CisJd3JlZnJlc2god2luKTsKK30KKworLyogc2Nyb2xsIHVwIG4gbGluZXMgKG4gbWF5IGJlIG5lZ2F0aXZlKSAqLworc3RhdGljIHZvaWQgZG9fc2Nyb2xsKFdJTkRPVyAqd2luLCBpbnQgKnNjcm9sbCwgaW50IG4pCit7CisJLyogU2Nyb2xsIG1lbnUgdXAgKi8KKwlzY3JvbGxvayh3aW4sIFRSVUUpOworCXdzY3JsKHdpbiwgbik7CisJc2Nyb2xsb2sod2luLCBGQUxTRSk7CisJKnNjcm9sbCA9ICpzY3JvbGwgKyBuOworCXdyZWZyZXNoKHdpbik7Cit9CisKKy8qCisgKiBEaXNwbGF5IGEgbWVudSBmb3IgY2hvb3NpbmcgYW1vbmcgYSBudW1iZXIgb2Ygb3B0aW9ucworICovCitpbnQgZGlhbG9nX21lbnUoY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnByb21wdCwgaW50IGhlaWdodCwgaW50IHdpZHRoLAorCQlpbnQgbWVudV9oZWlnaHQsIGNvbnN0IGNoYXIgKmN1cnJlbnQsIGludCBpdGVtX25vLAorCQljb25zdCBjaGFyICpjb25zdCAqaXRlbXMpCit7CisJaW50IGksIGosIHgsIHksIGJveF94LCBib3hfeTsKKwlpbnQga2V5ID0gMCwgYnV0dG9uID0gMCwgc2Nyb2xsID0gMCwgY2hvaWNlID0gMDsKKwlpbnQgZmlyc3RfaXRlbSA9ICAwLCBtYXhfY2hvaWNlOworCVdJTkRPVyAqZGlhbG9nLCAqbWVudTsKKwlGSUxFICpmOworCisJbWF4X2Nob2ljZSA9IE1JTihtZW51X2hlaWdodCwgaXRlbV9ubyk7CisKKwkvKiBjZW50ZXIgZGlhbG9nIGJveCBvbiBzY3JlZW4gKi8KKwl4ID0gKENPTFMgLSB3aWR0aCkgLyAyOworCXkgPSAoTElORVMgLSBoZWlnaHQpIC8gMjsKKworCWRyYXdfc2hhZG93KHN0ZHNjciwgeSwgeCwgaGVpZ2h0LCB3aWR0aCk7CisKKwlkaWFsb2cgPSBuZXd3aW4oaGVpZ2h0LCB3aWR0aCwgeSwgeCk7CisJa2V5cGFkKGRpYWxvZywgVFJVRSk7CisKKwlkcmF3X2JveChkaWFsb2csIDAsIDAsIGhlaWdodCwgd2lkdGgsIGRpYWxvZ19hdHRyLCBib3JkZXJfYXR0cik7CisJd2F0dHJzZXQoZGlhbG9nLCBib3JkZXJfYXR0cik7CisJbXZ3YWRkY2goZGlhbG9nLCBoZWlnaHQgLSAzLCAwLCBBQ1NfTFRFRSk7CisJZm9yIChpID0gMDsgaSA8IHdpZHRoIC0gMjsgaSsrKQorCQl3YWRkY2goZGlhbG9nLCBBQ1NfSExJTkUpOworCXdhdHRyc2V0KGRpYWxvZywgZGlhbG9nX2F0dHIpOworCXdia2dkc2V0KGRpYWxvZywgZGlhbG9nX2F0dHIgJiBBX0NPTE9SKTsKKwl3YWRkY2goZGlhbG9nLCBBQ1NfUlRFRSk7CisKKwlwcmludF90aXRsZShkaWFsb2csIHRpdGxlLCB3aWR0aCk7CisKKwl3YXR0cnNldChkaWFsb2csIGRpYWxvZ19hdHRyKTsKKwlwcmludF9hdXRvd3JhcChkaWFsb2csIHByb21wdCwgd2lkdGggLSAyLCAxLCAzKTsKKworCW1lbnVfd2lkdGggPSB3aWR0aCAtIDY7CisJYm94X3kgPSBoZWlnaHQgLSBtZW51X2hlaWdodCAtIDU7CisJYm94X3ggPSAod2lkdGggLSBtZW51X3dpZHRoKSAvIDIgLSAxOworCisJLyogY3JlYXRlIG5ldyB3aW5kb3cgZm9yIHRoZSBtZW51ICovCisJbWVudSA9IHN1YndpbihkaWFsb2csIG1lbnVfaGVpZ2h0LCBtZW51X3dpZHRoLAorCQkgICAgICB5ICsgYm94X3kgKyAxLCB4ICsgYm94X3ggKyAxKTsKKwlrZXlwYWQobWVudSwgVFJVRSk7CisKKwkvKiBkcmF3IGEgYm94IGFyb3VuZCB0aGUgbWVudSBpdGVtcyAqLworCWRyYXdfYm94KGRpYWxvZywgYm94X3ksIGJveF94LCBtZW51X2hlaWdodCArIDIsIG1lbnVfd2lkdGggKyAyLAorCQkgbWVudWJveF9ib3JkZXJfYXR0ciwgbWVudWJveF9hdHRyKTsKKworCWl0ZW1feCA9IChtZW51X3dpZHRoIC0gNzApIC8gMjsKKworCS8qIFNldCBjaG9pY2UgdG8gZGVmYXVsdCBpdGVtICovCisJZm9yIChpID0gMDsgaSA8IGl0ZW1fbm87IGkrKykKKwkJaWYgKHN0cmNtcChjdXJyZW50LCBpdGVtc1tpICogMl0pID09IDApCisJCQljaG9pY2UgPSBpOworCisJLyogZ2V0IHRoZSBzY3JvbGwgaW5mbyBmcm9tIHRoZSB0ZW1wIGZpbGUgKi8KKwlpZiAoKGYgPSBmb3BlbigibHhkaWFsb2cuc2NybHRtcCIsICJyIikpICE9IE5VTEwpIHsKKwkJaWYgKChmc2NhbmYoZiwgIiVkXG4iLCAmc2Nyb2xsKSA9PSAxKSAmJiAoc2Nyb2xsIDw9IGNob2ljZSkgJiYKKwkJICAgIChzY3JvbGwgKyBtYXhfY2hvaWNlID4gY2hvaWNlKSAmJiAoc2Nyb2xsID49IDApICYmCisJCSAgICAoc2Nyb2xsICsgbWF4X2Nob2ljZSA8PSBpdGVtX25vKSkgeworCQkJZmlyc3RfaXRlbSA9IHNjcm9sbDsKKwkJCWNob2ljZSA9IGNob2ljZSAtIHNjcm9sbDsKKwkJCWZjbG9zZShmKTsKKwkJfSBlbHNlIHsKKwkJCXNjcm9sbCA9IDA7CisJCQlyZW1vdmUoImx4ZGlhbG9nLnNjcmx0bXAiKTsKKwkJCWZjbG9zZShmKTsKKwkJCWYgPSBOVUxMOworCQl9CisJfQorCWlmICgoY2hvaWNlID49IG1heF9jaG9pY2UpIHx8IChmID09IE5VTEwgJiYgY2hvaWNlID49IG1heF9jaG9pY2UgLyAyKSkgeworCQlpZiAoY2hvaWNlID49IGl0ZW1fbm8gLSBtYXhfY2hvaWNlIC8gMikKKwkJCXNjcm9sbCA9IGZpcnN0X2l0ZW0gPSBpdGVtX25vIC0gbWF4X2Nob2ljZTsKKwkJZWxzZQorCQkJc2Nyb2xsID0gZmlyc3RfaXRlbSA9IGNob2ljZSAtIG1heF9jaG9pY2UgLyAyOworCQljaG9pY2UgPSBjaG9pY2UgLSBzY3JvbGw7CisJfQorCisJLyogUHJpbnQgdGhlIG1lbnUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbWF4X2Nob2ljZTsgaSsrKSB7CisJCXByaW50X2l0ZW0oZmlyc3RfaXRlbSArIGksIGksIGkgPT0gY2hvaWNlKTsKKwl9CisKKwl3bm91dHJlZnJlc2gobWVudSk7CisKKwlwcmludF9hcnJvd3MoZGlhbG9nLCBpdGVtX25vLCBzY3JvbGwsCisJCSAgICAgYm94X3ksIGJveF94ICsgaXRlbV94ICsgMSwgbWVudV9oZWlnaHQpOworCisJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIDApOworCXdtb3ZlKG1lbnUsIGNob2ljZSwgaXRlbV94ICsgMSk7CisJd3JlZnJlc2gobWVudSk7CisKKwl3aGlsZSAoa2V5ICE9IEVTQykgeworCQlrZXkgPSB3Z2V0Y2gobWVudSk7CisKKwkJaWYgKGtleSA8IDI1NiAmJiBpc2FscGhhKGtleSkpCisJCQlrZXkgPSB0b2xvd2VyKGtleSk7CisKKwkJaWYgKHN0cmNocigieW5taCIsIGtleSkpCisJCQlpID0gbWF4X2Nob2ljZTsKKwkJZWxzZSB7CisJCQlmb3IgKGkgPSBjaG9pY2UgKyAxOyBpIDwgbWF4X2Nob2ljZTsgaSsrKSB7CisJCQkJaiA9IGZpcnN0X2FscGhhKGl0ZW1zWyhzY3JvbGwgKyBpKSAqIDIgKyAxXSwgIll5Tm5NbUhoIik7CisJCQkJaWYgKGtleSA9PSB0b2xvd2VyKGl0ZW1zWyhzY3JvbGwgKyBpKSAqIDIgKyAxXVtqXSkpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGkgPT0gbWF4X2Nob2ljZSkKKwkJCQlmb3IgKGkgPSAwOyBpIDwgbWF4X2Nob2ljZTsgaSsrKSB7CisJCQkJCWogPSBmaXJzdF9hbHBoYShpdGVtcyBbKHNjcm9sbCArIGkpICogMiArIDFdLCAiWXlObk1tSGgiKTsKKwkJCQkJaWYgKGtleSA9PSB0b2xvd2VyKGl0ZW1zWyhzY3JvbGwgKyBpKSAqIDIgKyAxXVtqXSkpCisJCQkJCQlicmVhazsKKwkJCQl9CisJCX0KKworCQlpZiAoaSA8IG1heF9jaG9pY2UgfHwKKwkJICAgIGtleSA9PSBLRVlfVVAgfHwga2V5ID09IEtFWV9ET1dOIHx8CisJCSAgICBrZXkgPT0gJy0nIHx8IGtleSA9PSAnKycgfHwKKwkJICAgIGtleSA9PSBLRVlfUFBBR0UgfHwga2V5ID09IEtFWV9OUEFHRSkgeworCQkJLyogUmVtb3ZlIGhpZ2hsaWd0IG9mIGN1cnJlbnQgaXRlbSAqLworCQkJcHJpbnRfaXRlbShzY3JvbGwgKyBjaG9pY2UsIGNob2ljZSwgRkFMU0UpOworCisJCQlpZiAoa2V5ID09IEtFWV9VUCB8fCBrZXkgPT0gJy0nKSB7CisJCQkJaWYgKGNob2ljZSA8IDIgJiYgc2Nyb2xsKSB7CisJCQkJCS8qIFNjcm9sbCBtZW51IGRvd24gKi8KKwkJCQkJZG9fc2Nyb2xsKG1lbnUsICZzY3JvbGwsIC0xKTsKKworCQkJCQlwcmludF9pdGVtKHNjcm9sbCwgMCwgRkFMU0UpOworCQkJCX0gZWxzZQorCQkJCQljaG9pY2UgPSBNQVgoY2hvaWNlIC0gMSwgMCk7CisKKwkJCX0gZWxzZSBpZiAoa2V5ID09IEtFWV9ET1dOIHx8IGtleSA9PSAnKycpIHsKKwkJCQlwcmludF9pdGVtKHNjcm9sbCtjaG9pY2UsIGNob2ljZSwgRkFMU0UpOworCisJCQkJaWYgKChjaG9pY2UgPiBtYXhfY2hvaWNlIC0gMykgJiYKKwkJCQkgICAgKHNjcm9sbCArIG1heF9jaG9pY2UgPCBpdGVtX25vKSkgeworCQkJCQkvKiBTY3JvbGwgbWVudSB1cCAqLworCQkJCQlkb19zY3JvbGwobWVudSwgJnNjcm9sbCwgMSk7CisKKwkJCQkJcHJpbnRfaXRlbShzY3JvbGwrbWF4X2Nob2ljZSAtIDEsCisJCQkJCQkgICBtYXhfY2hvaWNlIC0gMSwgRkFMU0UpOworCQkJCX0gZWxzZQorCQkJCQljaG9pY2UgPSBNSU4oY2hvaWNlICsgMSwgbWF4X2Nob2ljZSAtIDEpOworCisJCQl9IGVsc2UgaWYgKGtleSA9PSBLRVlfUFBBR0UpIHsKKwkJCQlzY3JvbGxvayhtZW51LCBUUlVFKTsKKwkJCQlmb3IgKGkgPSAwOyAoaSA8IG1heF9jaG9pY2UpOyBpKyspIHsKKwkJCQkJaWYgKHNjcm9sbCA+IDApIHsKKwkJCQkJCWRvX3Njcm9sbChtZW51LCAmc2Nyb2xsLCAtMSk7CisJCQkJCQlwcmludF9pdGVtKHNjcm9sbCwgMCwgRkFMU0UpOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKGNob2ljZSA+IDApCisJCQkJCQkJY2hvaWNlLS07CisJCQkJCX0KKwkJCQl9CisKKwkJCX0gZWxzZSBpZiAoa2V5ID09IEtFWV9OUEFHRSkgeworCQkJCWZvciAoaSA9IDA7IChpIDwgbWF4X2Nob2ljZSk7IGkrKykgeworCQkJCQlpZiAoc2Nyb2xsICsgbWF4X2Nob2ljZSA8IGl0ZW1fbm8pIHsKKwkJCQkJCWRvX3Njcm9sbChtZW51LCAmc2Nyb2xsLCAxKTsKKwkJCQkJCXByaW50X2l0ZW0oc2Nyb2xsK21heF9jaG9pY2UtMSwKKwkJCQkJCQkgICBtYXhfY2hvaWNlIC0gMSwgRkFMU0UpOworCQkJCQl9IGVsc2UgeworCQkJCQkJaWYgKGNob2ljZSArIDEgPCBtYXhfY2hvaWNlKQorCQkJCQkJCWNob2ljZSsrOworCQkJCQl9CisJCQkJfQorCQkJfSBlbHNlCisJCQkJY2hvaWNlID0gaTsKKworCQkJcHJpbnRfaXRlbShzY3JvbGwgKyBjaG9pY2UsIGNob2ljZSwgVFJVRSk7CisKKwkJCXByaW50X2Fycm93cyhkaWFsb2csIGl0ZW1fbm8sIHNjcm9sbCwKKwkJCQkgICAgIGJveF95LCBib3hfeCArIGl0ZW1feCArIDEsIG1lbnVfaGVpZ2h0KTsKKworCQkJd25vdXRyZWZyZXNoKGRpYWxvZyk7CisJCQl3cmVmcmVzaChtZW51KTsKKworCQkJY29udGludWU7CS8qIHdhaXQgZm9yIGFub3RoZXIga2V5IHByZXNzICovCisJCX0KKworCQlzd2l0Y2ggKGtleSkgeworCQljYXNlIEtFWV9MRUZUOgorCQljYXNlIFRBQjoKKwkJY2FzZSBLRVlfUklHSFQ6CisJCQlidXR0b24gPSAoKGtleSA9PSBLRVlfTEVGVCA/IC0tYnV0dG9uIDogKytidXR0b24pIDwgMCkKKwkJCSAgICA/IDIgOiAoYnV0dG9uID4gMiA/IDAgOiBidXR0b24pOworCisJCQlwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgYnV0dG9uKTsKKwkJCXdyZWZyZXNoKG1lbnUpOworCQkJYnJlYWs7CisJCWNhc2UgJyAnOgorCQljYXNlICdzJzoKKwkJY2FzZSAneSc6CisJCWNhc2UgJ24nOgorCQljYXNlICdtJzoKKwkJY2FzZSAnLyc6CisJCQkvKiBzYXZlIHNjcm9sbCBpbmZvICovCisJCQlpZiAoKGYgPSBmb3BlbigibHhkaWFsb2cuc2NybHRtcCIsICJ3IikpICE9IE5VTEwpIHsKKwkJCQlmcHJpbnRmKGYsICIlZFxuIiwgc2Nyb2xsKTsKKwkJCQlmY2xvc2UoZik7CisJCQl9CisJCQlkZWx3aW4oZGlhbG9nKTsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIGl0ZW1zWyhzY3JvbGwgKyBjaG9pY2UpICogMl0pOworCQkJc3dpdGNoIChrZXkpIHsKKwkJCWNhc2UgJ3MnOgorCQkJCXJldHVybiAzOworCQkJY2FzZSAneSc6CisJCQkJcmV0dXJuIDM7CisJCQljYXNlICduJzoKKwkJCQlyZXR1cm4gNDsKKwkJCWNhc2UgJ20nOgorCQkJCXJldHVybiA1OworCQkJY2FzZSAnICc6CisJCQkJcmV0dXJuIDY7CisJCQljYXNlICcvJzoKKwkJCQlyZXR1cm4gNzsKKwkJCX0KKwkJCXJldHVybiAwOworCQljYXNlICdoJzoKKwkJY2FzZSAnPyc6CisJCQlidXR0b24gPSAyOworCQljYXNlICdcbic6CisJCQlkZWx3aW4oZGlhbG9nKTsKKwkJCWlmIChidXR0b24gPT0gMikKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIFwiJXNcIlxuIiwKKwkJCQkJaXRlbXNbKHNjcm9sbCArIGNob2ljZSkgKiAyXSwKKwkJCQkJaXRlbXNbKHNjcm9sbCArIGNob2ljZSkgKiAyICsgMV0gKworCQkJCQlmaXJzdF9hbHBoYShpdGVtcyBbKHNjcm9sbCArIGNob2ljZSkgKiAyICsgMV0sICIiKSk7CisJCQllbHNlCisJCQkJZnByaW50ZihzdGRlcnIsICIlc1xuIiwKKwkJCQkJaXRlbXNbKHNjcm9sbCArIGNob2ljZSkgKiAyXSk7CisKKwkJCXJlbW92ZSgibHhkaWFsb2cuc2NybHRtcCIpOworCQkJcmV0dXJuIGJ1dHRvbjsKKwkJY2FzZSAnZSc6CisJCWNhc2UgJ3gnOgorCQkJa2V5ID0gRVNDOworCQljYXNlIEVTQzoKKwkJCWJyZWFrOworCQl9CisJfQorCisJZGVsd2luKGRpYWxvZyk7CisJcmVtb3ZlKCJseGRpYWxvZy5zY3JsdG1wIik7CisJcmV0dXJuIC0xOwkJLyogRVNDIHByZXNzZWQgKi8KK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9tc2dib3guYyBiL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy9tc2dib3guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzIzZjU0Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL21zZ2JveC5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiAgbXNnYm94LmMgLS0gaW1wbGVtZW50cyB0aGUgbWVzc2FnZSBib3ggYW5kIGluZm8gYm94CisgKgorICogIE9SSUdJTkFMIEFVVEhPUjogU2F2aW8gTGFtIChsYW04MzZAY3MuY3Voay5oaykKKyAqICBNT0RJRklFRCBGT1IgTElOVVggS0VSTkVMIENPTkZJRyBCWTogV2lsbGlhbSBSb2FkY2FwIChyb2FkY2Fwd0BjZncuY29tKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImRpYWxvZy5oIgorCisvKgorICogRGlzcGxheSBhIG1lc3NhZ2UgYm94LiBQcm9ncmFtIHdpbGwgcGF1c2UgYW5kIGRpc3BsYXkgYW4gIk9LIiBidXR0b24KKyAqIGlmIHRoZSBwYXJhbWV0ZXIgJ3BhdXNlJyBpcyBub24temVyby4KKyAqLworaW50IGRpYWxvZ19tc2dib3goY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnByb21wdCwgaW50IGhlaWdodCwgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgaW50IHBhdXNlKQoreworCWludCBpLCB4LCB5LCBrZXkgPSAwOworCVdJTkRPVyAqZGlhbG9nOworCisJLyogY2VudGVyIGRpYWxvZyBib3ggb24gc2NyZWVuICovCisJeCA9IChDT0xTIC0gd2lkdGgpIC8gMjsKKwl5ID0gKExJTkVTIC0gaGVpZ2h0KSAvIDI7CisKKwlkcmF3X3NoYWRvdyhzdGRzY3IsIHksIHgsIGhlaWdodCwgd2lkdGgpOworCisJZGlhbG9nID0gbmV3d2luKGhlaWdodCwgd2lkdGgsIHksIHgpOworCWtleXBhZChkaWFsb2csIFRSVUUpOworCisJZHJhd19ib3goZGlhbG9nLCAwLCAwLCBoZWlnaHQsIHdpZHRoLCBkaWFsb2dfYXR0ciwgYm9yZGVyX2F0dHIpOworCisJcHJpbnRfdGl0bGUoZGlhbG9nLCB0aXRsZSwgd2lkdGgpOworCisJd2F0dHJzZXQoZGlhbG9nLCBkaWFsb2dfYXR0cik7CisJcHJpbnRfYXV0b3dyYXAoZGlhbG9nLCBwcm9tcHQsIHdpZHRoIC0gMiwgMSwgMik7CisKKwlpZiAocGF1c2UpIHsKKwkJd2F0dHJzZXQoZGlhbG9nLCBib3JkZXJfYXR0cik7CisJCW12d2FkZGNoKGRpYWxvZywgaGVpZ2h0IC0gMywgMCwgQUNTX0xURUUpOworCQlmb3IgKGkgPSAwOyBpIDwgd2lkdGggLSAyOyBpKyspCisJCQl3YWRkY2goZGlhbG9nLCBBQ1NfSExJTkUpOworCQl3YXR0cnNldChkaWFsb2csIGRpYWxvZ19hdHRyKTsKKwkJd2FkZGNoKGRpYWxvZywgQUNTX1JURUUpOworCisJCXByaW50X2J1dHRvbihkaWFsb2csICIgIE9rICAiLCBoZWlnaHQgLSAyLCB3aWR0aCAvIDIgLSA0LCBUUlVFKTsKKworCQl3cmVmcmVzaChkaWFsb2cpOworCQl3aGlsZSAoa2V5ICE9IEVTQyAmJiBrZXkgIT0gJ1xuJyAmJiBrZXkgIT0gJyAnICYmCisJCSAgICAgICBrZXkgIT0gJ08nICYmIGtleSAhPSAnbycgJiYga2V5ICE9ICdYJyAmJiBrZXkgIT0gJ3gnKQorCQkJa2V5ID0gd2dldGNoKGRpYWxvZyk7CisJfSBlbHNlIHsKKwkJa2V5ID0gJ1xuJzsKKwkJd3JlZnJlc2goZGlhbG9nKTsKKwl9CisKKwlkZWx3aW4oZGlhbG9nKTsKKwlyZXR1cm4ga2V5ID09IEVTQyA/IC0xIDogMDsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy90ZXh0Ym94LmMgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvdGV4dGJveC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNGFlNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvdGV4dGJveC5jCkBAIC0wLDAgKzEsNTMxIEBACisvKgorICogIHRleHRib3guYyAtLSBpbXBsZW1lbnRzIHRoZSB0ZXh0IGJveAorICoKKyAqICBPUklHSU5BTCBBVVRIT1I6IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspCisgKiAgTU9ESUZJRUQgRk9SIExJTlVYIEtFUk5FTCBDT05GSUcgQlk6IFdpbGxpYW0gUm9hZGNhcCAocm9hZGNhcEBjZncuY29tKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImRpYWxvZy5oIgorCitzdGF0aWMgdm9pZCBiYWNrX2xpbmVzKGludCBuKTsKK3N0YXRpYyB2b2lkIHByaW50X3BhZ2UoV0lORE9XICogd2luLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpOworc3RhdGljIHZvaWQgcHJpbnRfbGluZShXSU5ET1cgKiB3aW4sIGludCByb3csIGludCB3aWR0aCk7CitzdGF0aWMgY2hhciAqZ2V0X2xpbmUodm9pZCk7CitzdGF0aWMgdm9pZCBwcmludF9wb3NpdGlvbihXSU5ET1cgKiB3aW4sIGludCBoZWlnaHQsIGludCB3aWR0aCk7CisKK3N0YXRpYyBpbnQgaHNjcm9sbCwgZmQsIGZpbGVfc2l6ZSwgYnl0ZXNfcmVhZDsKK3N0YXRpYyBpbnQgYmVnaW5fcmVhY2hlZCA9IDEsIGVuZF9yZWFjaGVkLCBwYWdlX2xlbmd0aDsKK3N0YXRpYyBjaGFyICpidWYsICpwYWdlOworCisvKgorICogRGlzcGxheSB0ZXh0IGZyb20gYSBmaWxlIGluIGEgZGlhbG9nIGJveC4KKyAqLworaW50IGRpYWxvZ190ZXh0Ym94KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpCit7CisJaW50IGksIHgsIHksIGN1cl94LCBjdXJfeSwgZnBvcywga2V5ID0gMDsKKwlpbnQgcGFzc2VkX2VuZDsKKwlXSU5ET1cgKmRpYWxvZywgKnRleHQ7CisKKwkvKiBPcGVuIGlucHV0IGZpbGUgZm9yIHJlYWRpbmcgKi8KKwlpZiAoKGZkID0gb3BlbihmaWxlLCBPX1JET05MWSkpID09IC0xKSB7CisJCWVuZHdpbigpOworCQlmcHJpbnRmKHN0ZGVyciwgIlxuQ2FuJ3Qgb3BlbiBpbnB1dCBmaWxlIGluIGRpYWxvZ190ZXh0Ym94KCkuXG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCS8qIEdldCBmaWxlIHNpemUuIEFjdHVhbGx5LCAnZmlsZV9zaXplJyBpcyB0aGUgcmVhbCBmaWxlIHNpemUgLSAxLAorCSAgIHNpbmNlIGl0J3Mgb25seSB0aGUgbGFzdCBieXRlIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgKi8KKwlpZiAoKGZpbGVfc2l6ZSA9IGxzZWVrKGZkLCAwLCBTRUVLX0VORCkpID09IC0xKSB7CisJCWVuZHdpbigpOworCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgZ2V0dGluZyBmaWxlIHNpemUgaW4gZGlhbG9nX3RleHRib3goKS5cbiIpOworCQlleGl0KC0xKTsKKwl9CisJLyogUmVzdG9yZSBmaWxlIHBvaW50ZXIgdG8gYmVnaW5uaW5nIG9mIGZpbGUgYWZ0ZXIgZ2V0dGluZyBmaWxlIHNpemUgKi8KKwlpZiAobHNlZWsoZmQsIDAsIFNFRUtfU0VUKSA9PSAtMSkgeworCQllbmR3aW4oKTsKKwkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIG1vdmluZyBmaWxlIHBvaW50ZXIgaW4gZGlhbG9nX3RleHRib3goKS5cbiIpOworCQlleGl0KC0xKTsKKwl9CisJLyogQWxsb2NhdGUgc3BhY2UgZm9yIHJlYWQgYnVmZmVyICovCisJaWYgKChidWYgPSBtYWxsb2MoQlVGX1NJWkUgKyAxKSkgPT0gTlVMTCkgeworCQllbmR3aW4oKTsKKwkJZnByaW50ZihzdGRlcnIsICJcbkNhbid0IGFsbG9jYXRlIG1lbW9yeSBpbiBkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJCWV4aXQoLTEpOworCX0KKwlpZiAoKGJ5dGVzX3JlYWQgPSByZWFkKGZkLCBidWYsIEJVRl9TSVpFKSkgPT0gLTEpIHsKKwkJZW5kd2luKCk7CisJCWZwcmludGYoc3RkZXJyLCAiXG5FcnJvciByZWFkaW5nIGZpbGUgaW4gZGlhbG9nX3RleHRib3goKS5cbiIpOworCQlleGl0KC0xKTsKKwl9CisJYnVmW2J5dGVzX3JlYWRdID0gJ1wwJzsJLyogbWFyayBlbmQgb2YgdmFsaWQgZGF0YSAqLworCXBhZ2UgPSBidWY7CQkvKiBwYWdlIGlzIHBvaW50ZXIgdG8gc3RhcnQgb2YgcGFnZSB0byBiZSBkaXNwbGF5ZWQgKi8KKworCS8qIGNlbnRlciBkaWFsb2cgYm94IG9uIHNjcmVlbiAqLworCXggPSAoQ09MUyAtIHdpZHRoKSAvIDI7CisJeSA9IChMSU5FUyAtIGhlaWdodCkgLyAyOworCisJZHJhd19zaGFkb3coc3Rkc2NyLCB5LCB4LCBoZWlnaHQsIHdpZHRoKTsKKworCWRpYWxvZyA9IG5ld3dpbihoZWlnaHQsIHdpZHRoLCB5LCB4KTsKKwlrZXlwYWQoZGlhbG9nLCBUUlVFKTsKKworCS8qIENyZWF0ZSB3aW5kb3cgZm9yIHRleHQgcmVnaW9uLCB1c2VkIGZvciBzY3JvbGxpbmcgdGV4dCAqLworCXRleHQgPSBzdWJ3aW4oZGlhbG9nLCBoZWlnaHQgLSA0LCB3aWR0aCAtIDIsIHkgKyAxLCB4ICsgMSk7CisJd2F0dHJzZXQodGV4dCwgZGlhbG9nX2F0dHIpOworCXdia2dkc2V0KHRleHQsIGRpYWxvZ19hdHRyICYgQV9DT0xPUik7CisKKwlrZXlwYWQodGV4dCwgVFJVRSk7CisKKwkvKiByZWdpc3RlciB0aGUgbmV3IHdpbmRvdywgYWxvbmcgd2l0aCBpdHMgYm9yZGVycyAqLworCWRyYXdfYm94KGRpYWxvZywgMCwgMCwgaGVpZ2h0LCB3aWR0aCwgZGlhbG9nX2F0dHIsIGJvcmRlcl9hdHRyKTsKKworCXdhdHRyc2V0KGRpYWxvZywgYm9yZGVyX2F0dHIpOworCW12d2FkZGNoKGRpYWxvZywgaGVpZ2h0IC0gMywgMCwgQUNTX0xURUUpOworCWZvciAoaSA9IDA7IGkgPCB3aWR0aCAtIDI7IGkrKykKKwkJd2FkZGNoKGRpYWxvZywgQUNTX0hMSU5FKTsKKwl3YXR0cnNldChkaWFsb2csIGRpYWxvZ19hdHRyKTsKKwl3YmtnZHNldChkaWFsb2csIGRpYWxvZ19hdHRyICYgQV9DT0xPUik7CisJd2FkZGNoKGRpYWxvZywgQUNTX1JURUUpOworCisJcHJpbnRfdGl0bGUoZGlhbG9nLCB0aXRsZSwgd2lkdGgpOworCisJcHJpbnRfYnV0dG9uKGRpYWxvZywgIiBFeGl0ICIsIGhlaWdodCAtIDIsIHdpZHRoIC8gMiAtIDQsIFRSVUUpOworCXdub3V0cmVmcmVzaChkaWFsb2cpOworCWdldHl4KGRpYWxvZywgY3VyX3ksIGN1cl94KTsJLyogU2F2ZSBjdXJzb3IgcG9zaXRpb24gKi8KKworCS8qIFByaW50IGZpcnN0IHBhZ2Ugb2YgdGV4dCAqLworCWF0dHJfY2xlYXIodGV4dCwgaGVpZ2h0IC0gNCwgd2lkdGggLSAyLCBkaWFsb2dfYXR0cik7CisJcHJpbnRfcGFnZSh0ZXh0LCBoZWlnaHQgLSA0LCB3aWR0aCAtIDIpOworCXByaW50X3Bvc2l0aW9uKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCk7CisJd21vdmUoZGlhbG9nLCBjdXJfeSwgY3VyX3gpOwkvKiBSZXN0b3JlIGN1cnNvciBwb3NpdGlvbiAqLworCXdyZWZyZXNoKGRpYWxvZyk7CisKKwl3aGlsZSAoKGtleSAhPSBFU0MpICYmIChrZXkgIT0gJ1xuJykpIHsKKwkJa2V5ID0gd2dldGNoKGRpYWxvZyk7CisJCXN3aXRjaCAoa2V5KSB7CisJCWNhc2UgJ0UnOgkvKiBFeGl0ICovCisJCWNhc2UgJ2UnOgorCQljYXNlICdYJzoKKwkJY2FzZSAneCc6CisJCQlkZWx3aW4oZGlhbG9nKTsKKwkJCWZyZWUoYnVmKTsKKwkJCWNsb3NlKGZkKTsKKwkJCXJldHVybiAwOworCQljYXNlICdnJzoJLyogRmlyc3QgcGFnZSAqLworCQljYXNlIEtFWV9IT01FOgorCQkJaWYgKCFiZWdpbl9yZWFjaGVkKSB7CisJCQkJYmVnaW5fcmVhY2hlZCA9IDE7CisJCQkJLyogRmlyc3QgcGFnZSBub3QgaW4gYnVmZmVyPyAqLworCQkJCWlmICgoZnBvcyA9IGxzZWVrKGZkLCAwLCBTRUVLX0NVUikpID09IC0xKSB7CisJCQkJCWVuZHdpbigpOworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciBpbiBkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJCQkJCWV4aXQoLTEpOworCQkJCX0KKwkJCQlpZiAoZnBvcyA+IGJ5dGVzX3JlYWQpIHsJLyogWWVzLCB3ZSBoYXZlIHRvIHJlYWQgaXQgaW4gKi8KKwkJCQkJaWYgKGxzZWVrKGZkLCAwLCBTRUVLX1NFVCkgPT0gLTEpIHsKKwkJCQkJCWVuZHdpbigpOworCQkJCQkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIG1vdmluZyBmaWxlIHBvaW50ZXIgaW4gIgorCQkJCQkJCSAgICAgICAgImRpYWxvZ190ZXh0Ym94KCkuXG4iKTsKKwkJCQkJCWV4aXQoLTEpOworCQkJCQl9CisJCQkJCWlmICgoYnl0ZXNfcmVhZCA9CisJCQkJCSAgICAgcmVhZChmZCwgYnVmLCBCVUZfU0laRSkpID09IC0xKSB7CisJCQkJCQllbmR3aW4oKTsKKwkJCQkJCWZwcmludGYoc3RkZXJyLCAiXG5FcnJvciByZWFkaW5nIGZpbGUgaW4gZGlhbG9nX3RleHRib3goKS5cbiIpOworCQkJCQkJZXhpdCgtMSk7CisJCQkJCX0KKwkJCQkJYnVmW2J5dGVzX3JlYWRdID0gJ1wwJzsKKwkJCQl9CisJCQkJcGFnZSA9IGJ1ZjsKKwkJCQlwcmludF9wYWdlKHRleHQsIGhlaWdodCAtIDQsIHdpZHRoIC0gMik7CisJCQkJcHJpbnRfcG9zaXRpb24oZGlhbG9nLCBoZWlnaHQsIHdpZHRoKTsKKwkJCQl3bW92ZShkaWFsb2csIGN1cl95LCBjdXJfeCk7CS8qIFJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uICovCisJCQkJd3JlZnJlc2goZGlhbG9nKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdHJzoJLyogTGFzdCBwYWdlICovCisJCWNhc2UgS0VZX0VORDoKKworCQkJZW5kX3JlYWNoZWQgPSAxOworCQkJLyogTGFzdCBwYWdlIG5vdCBpbiBidWZmZXI/ICovCisJCQlpZiAoKGZwb3MgPSBsc2VlayhmZCwgMCwgU0VFS19DVVIpKSA9PSAtMSkgeworCQkJCWVuZHdpbigpOworCQkJCWZwcmludGYoc3RkZXJyLCAiXG5FcnJvciBtb3ZpbmcgZmlsZSBwb2ludGVyIGluIGRpYWxvZ190ZXh0Ym94KCkuXG4iKTsKKwkJCQlleGl0KC0xKTsKKwkJCX0KKwkJCWlmIChmcG9zIDwgZmlsZV9zaXplKSB7CS8qIFllcywgd2UgaGF2ZSB0byByZWFkIGl0IGluICovCisJCQkJaWYgKGxzZWVrKGZkLCAtQlVGX1NJWkUsIFNFRUtfRU5EKSA9PSAtMSkgeworCQkJCQllbmR3aW4oKTsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIG1vdmluZyBmaWxlIHBvaW50ZXIgaW4gZGlhbG9nX3RleHRib3goKS5cbiIpOworCQkJCQlleGl0KC0xKTsKKwkJCQl9CisJCQkJaWYgKChieXRlc19yZWFkID0KKwkJCQkgICAgIHJlYWQoZmQsIGJ1ZiwgQlVGX1NJWkUpKSA9PSAtMSkgeworCQkJCQllbmR3aW4oKTsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIHJlYWRpbmcgZmlsZSBpbiBkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJCQkJCWV4aXQoLTEpOworCQkJCX0KKwkJCQlidWZbYnl0ZXNfcmVhZF0gPSAnXDAnOworCQkJfQorCQkJcGFnZSA9IGJ1ZiArIGJ5dGVzX3JlYWQ7CisJCQliYWNrX2xpbmVzKGhlaWdodCAtIDQpOworCQkJcHJpbnRfcGFnZSh0ZXh0LCBoZWlnaHQgLSA0LCB3aWR0aCAtIDIpOworCQkJcHJpbnRfcG9zaXRpb24oZGlhbG9nLCBoZWlnaHQsIHdpZHRoKTsKKwkJCXdtb3ZlKGRpYWxvZywgY3VyX3ksIGN1cl94KTsJLyogUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gKi8KKwkJCXdyZWZyZXNoKGRpYWxvZyk7CisJCQlicmVhazsKKwkJY2FzZSAnSyc6CS8qIFByZXZpb3VzIGxpbmUgKi8KKwkJY2FzZSAnayc6CisJCWNhc2UgS0VZX1VQOgorCQkJaWYgKCFiZWdpbl9yZWFjaGVkKSB7CisJCQkJYmFja19saW5lcyhwYWdlX2xlbmd0aCArIDEpOworCisJCQkJLyogV2UgZG9uJ3QgY2FsbCBwcmludF9wYWdlKCkgaGVyZSBidXQgdXNlIHNjcm9sbGluZyB0byBlbnN1cmUKKwkJCQkgICBmYXN0ZXIgc2NyZWVuIHVwZGF0ZS4gSG93ZXZlciwgJ2VuZF9yZWFjaGVkJyBhbmQKKwkJCQkgICAncGFnZV9sZW5ndGgnIHNob3VsZCBzdGlsbCBiZSB1cGRhdGVkLCBhbmQgJ3BhZ2UnIHNob3VsZAorCQkJCSAgIHBvaW50IHRvIHN0YXJ0IG9mIG5leHQgcGFnZS4gVGhpcyBpcyBkb25lIGJ5IGNhbGxpbmcKKwkJCQkgICBnZXRfbGluZSgpIGluIHRoZSBmb2xsb3dpbmcgJ2ZvcicgbG9vcC4gKi8KKwkJCQlzY3JvbGxvayh0ZXh0LCBUUlVFKTsKKwkJCQl3c2NybCh0ZXh0LCAtMSk7CS8qIFNjcm9sbCB0ZXh0IHJlZ2lvbiBkb3duIG9uZSBsaW5lICovCisJCQkJc2Nyb2xsb2sodGV4dCwgRkFMU0UpOworCQkJCXBhZ2VfbGVuZ3RoID0gMDsKKwkJCQlwYXNzZWRfZW5kID0gMDsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0IC0gNDsgaSsrKSB7CisJCQkJCWlmICghaSkgeworCQkJCQkJLyogcHJpbnQgZmlyc3QgbGluZSBvZiBwYWdlICovCisJCQkJCQlwcmludF9saW5lKHRleHQsIDAsIHdpZHRoIC0gMik7CisJCQkJCQl3bm91dHJlZnJlc2godGV4dCk7CisJCQkJCX0gZWxzZQorCQkJCQkJLyogQ2FsbGVkIHRvIHVwZGF0ZSAnZW5kX3JlYWNoZWQnIGFuZCAncGFnZScgKi8KKwkJCQkJCWdldF9saW5lKCk7CisJCQkJCWlmICghcGFzc2VkX2VuZCkKKwkJCQkJCXBhZ2VfbGVuZ3RoKys7CisJCQkJCWlmIChlbmRfcmVhY2hlZCAmJiAhcGFzc2VkX2VuZCkKKwkJCQkJCXBhc3NlZF9lbmQgPSAxOworCQkJCX0KKworCQkJCXByaW50X3Bvc2l0aW9uKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCk7CisJCQkJd21vdmUoZGlhbG9nLCBjdXJfeSwgY3VyX3gpOwkvKiBSZXN0b3JlIGN1cnNvciBwb3NpdGlvbiAqLworCQkJCXdyZWZyZXNoKGRpYWxvZyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnQic6CS8qIFByZXZpb3VzIHBhZ2UgKi8KKwkJY2FzZSAnYic6CisJCWNhc2UgS0VZX1BQQUdFOgorCQkJaWYgKGJlZ2luX3JlYWNoZWQpCisJCQkJYnJlYWs7CisJCQliYWNrX2xpbmVzKHBhZ2VfbGVuZ3RoICsgaGVpZ2h0IC0gNCk7CisJCQlwcmludF9wYWdlKHRleHQsIGhlaWdodCAtIDQsIHdpZHRoIC0gMik7CisJCQlwcmludF9wb3NpdGlvbihkaWFsb2csIGhlaWdodCwgd2lkdGgpOworCQkJd21vdmUoZGlhbG9nLCBjdXJfeSwgY3VyX3gpOworCQkJd3JlZnJlc2goZGlhbG9nKTsKKwkJCWJyZWFrOworCQljYXNlICdKJzoJLyogTmV4dCBsaW5lICovCisJCWNhc2UgJ2onOgorCQljYXNlIEtFWV9ET1dOOgorCQkJaWYgKCFlbmRfcmVhY2hlZCkgeworCQkJCWJlZ2luX3JlYWNoZWQgPSAwOworCQkJCXNjcm9sbG9rKHRleHQsIFRSVUUpOworCQkJCXNjcm9sbCh0ZXh0KTsJLyogU2Nyb2xsIHRleHQgcmVnaW9uIHVwIG9uZSBsaW5lICovCisJCQkJc2Nyb2xsb2sodGV4dCwgRkFMU0UpOworCQkJCXByaW50X2xpbmUodGV4dCwgaGVpZ2h0IC0gNSwgd2lkdGggLSAyKTsKKwkJCQl3bm91dHJlZnJlc2godGV4dCk7CisJCQkJcHJpbnRfcG9zaXRpb24oZGlhbG9nLCBoZWlnaHQsIHdpZHRoKTsKKwkJCQl3bW92ZShkaWFsb2csIGN1cl95LCBjdXJfeCk7CS8qIFJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uICovCisJCQkJd3JlZnJlc2goZGlhbG9nKTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIEtFWV9OUEFHRToJLyogTmV4dCBwYWdlICovCisJCWNhc2UgJyAnOgorCQkJaWYgKGVuZF9yZWFjaGVkKQorCQkJCWJyZWFrOworCisJCQliZWdpbl9yZWFjaGVkID0gMDsKKwkJCXByaW50X3BhZ2UodGV4dCwgaGVpZ2h0IC0gNCwgd2lkdGggLSAyKTsKKwkJCXByaW50X3Bvc2l0aW9uKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCk7CisJCQl3bW92ZShkaWFsb2csIGN1cl95LCBjdXJfeCk7CisJCQl3cmVmcmVzaChkaWFsb2cpOworCQkJYnJlYWs7CisJCWNhc2UgJzAnOgkvKiBCZWdpbm5pbmcgb2YgbGluZSAqLworCQljYXNlICdIJzoJLyogU2Nyb2xsIGxlZnQgKi8KKwkJY2FzZSAnaCc6CisJCWNhc2UgS0VZX0xFRlQ6CisJCQlpZiAoaHNjcm9sbCA8PSAwKQorCQkJCWJyZWFrOworCisJCQlpZiAoa2V5ID09ICcwJykKKwkJCQloc2Nyb2xsID0gMDsKKwkJCWVsc2UKKwkJCQloc2Nyb2xsLS07CisJCQkvKiBSZXByaW50IGN1cnJlbnQgcGFnZSB0byBzY3JvbGwgaG9yaXpvbnRhbGx5ICovCisJCQliYWNrX2xpbmVzKHBhZ2VfbGVuZ3RoKTsKKwkJCXByaW50X3BhZ2UodGV4dCwgaGVpZ2h0IC0gNCwgd2lkdGggLSAyKTsKKwkJCXdtb3ZlKGRpYWxvZywgY3VyX3ksIGN1cl94KTsKKwkJCXdyZWZyZXNoKGRpYWxvZyk7CisJCQlicmVhazsKKwkJY2FzZSAnTCc6CS8qIFNjcm9sbCByaWdodCAqLworCQljYXNlICdsJzoKKwkJY2FzZSBLRVlfUklHSFQ6CisJCQlpZiAoaHNjcm9sbCA+PSBNQVhfTEVOKQorCQkJCWJyZWFrOworCQkJaHNjcm9sbCsrOworCQkJLyogUmVwcmludCBjdXJyZW50IHBhZ2UgdG8gc2Nyb2xsIGhvcml6b250YWxseSAqLworCQkJYmFja19saW5lcyhwYWdlX2xlbmd0aCk7CisJCQlwcmludF9wYWdlKHRleHQsIGhlaWdodCAtIDQsIHdpZHRoIC0gMik7CisJCQl3bW92ZShkaWFsb2csIGN1cl95LCBjdXJfeCk7CisJCQl3cmVmcmVzaChkaWFsb2cpOworCQkJYnJlYWs7CisJCWNhc2UgRVNDOgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlkZWx3aW4oZGlhbG9nKTsKKwlmcmVlKGJ1Zik7CisJY2xvc2UoZmQpOworCXJldHVybiAtMTsJCS8qIEVTQyBwcmVzc2VkICovCit9CisKKy8qCisgKiBHbyBiYWNrICduJyBsaW5lcyBpbiB0ZXh0IGZpbGUuIENhbGxlZCBieSBkaWFsb2dfdGV4dGJveCgpLgorICogJ3BhZ2UnIHdpbGwgYmUgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgZGVzaXJlZCBsaW5lIGluICdidWYnLgorICovCitzdGF0aWMgdm9pZCBiYWNrX2xpbmVzKGludCBuKQoreworCWludCBpLCBmcG9zOworCisJYmVnaW5fcmVhY2hlZCA9IDA7CisJLyogV2UgaGF2ZSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGVuZF9yZWFjaGVkIGFuZCAhZW5kX3JlYWNoZWQKKwkgICBzaW5jZSBhdCBlbmQgb2YgZmlsZSwgdGhlIGxpbmUgaXMgbm90IGVuZGVkIGJ5IGEgJ1xuJy4KKwkgICBUaGUgY29kZSBpbnNpZGUgJ2lmJyBiYXNpY2FsbHkgZG9lcyBhICctLXBhZ2UnIHRvIG1vdmUgb25lCisJICAgY2hhcmFjdGVyIGJhY2t3YXJkIHNvIGFzIHRvIHNraXAgJ1xuJyBvZiB0aGUgcHJldmlvdXMgbGluZSAqLworCWlmICghZW5kX3JlYWNoZWQpIHsKKwkJLyogRWl0aGVyIGJlZ2lubmluZyBvZiBidWZmZXIgb3IgYmVnaW5uaW5nIG9mIGZpbGUgcmVhY2hlZD8gKi8KKwkJaWYgKHBhZ2UgPT0gYnVmKSB7CisJCQlpZiAoKGZwb3MgPSBsc2VlayhmZCwgMCwgU0VFS19DVVIpKSA9PSAtMSkgeworCQkJCWVuZHdpbigpOworCQkJCWZwcmludGYoc3RkZXJyLCAiXG5FcnJvciBtb3ZpbmcgZmlsZSBwb2ludGVyIGluICIKKwkJCQkJICAgICAgICAiYmFja19saW5lcygpLlxuIik7CisJCQkJZXhpdCgtMSk7CisJCQl9CisJCQlpZiAoZnBvcyA+IGJ5dGVzX3JlYWQpIHsJLyogTm90IGJlZ2lubmluZyBvZiBmaWxlIHlldCAqLworCQkJCS8qIFdlJ3ZlIHJlYWNoZWQgYmVnaW5uaW5nIG9mIGJ1ZmZlciwgYnV0IG5vdCBiZWdpbm5pbmcgb2YKKwkJCQkgICBmaWxlIHlldCwgc28gcmVhZCBwcmV2aW91cyBwYXJ0IG9mIGZpbGUgaW50byBidWZmZXIuCisJCQkJICAgTm90ZSB0aGF0IHdlIG9ubHkgbW92ZSBiYWNrd2FyZCBmb3IgQlVGX1NJWkUvMiBieXRlcywKKwkJCQkgICBidXQgbm90IEJVRl9TSVpFIGJ5dGVzIHRvIGF2b2lkIHJlLXJlYWRpbmcgYWdhaW4gaW4KKwkJCQkgICBwcmludF9wYWdlKCkgbGF0ZXIgKi8KKwkJCQkvKiBSZWFsbHkgcG9zc2libGUgdG8gbW92ZSBiYWNrd2FyZCBCVUZfU0laRS8yIGJ5dGVzPyAqLworCQkJCWlmIChmcG9zIDwgQlVGX1NJWkUgLyAyICsgYnl0ZXNfcmVhZCkgeworCQkJCQkvKiBObywgbW92ZSBsZXNzIHRoZW4gKi8KKwkJCQkJaWYgKGxzZWVrKGZkLCAwLCBTRUVLX1NFVCkgPT0gLTEpIHsKKwkJCQkJCWVuZHdpbigpOworCQkJCQkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIG1vdmluZyBmaWxlIHBvaW50ZXIgaW4gIgorCQkJCQkJICAgICAgICAgICAgICAgICJiYWNrX2xpbmVzKCkuXG4iKTsKKwkJCQkJCWV4aXQoLTEpOworCQkJCQl9CisJCQkJCXBhZ2UgPSBidWYgKyBmcG9zIC0gYnl0ZXNfcmVhZDsKKwkJCQl9IGVsc2UgewkvKiBNb3ZlIGJhY2t3YXJkIEJVRl9TSVpFLzIgYnl0ZXMgKi8KKwkJCQkJaWYgKGxzZWVrIChmZCwgLShCVUZfU0laRSAvIDIgKyBieXRlc19yZWFkKSwgU0VFS19DVVIpID09IC0xKSB7CisJCQkJCQllbmR3aW4oKTsKKwkJCQkJCWZwcmludGYoc3RkZXJyLCAiXG5FcnJvciBtb3ZpbmcgZmlsZSBwb2ludGVyICIKKwkJCQkJCSAgICAgICAgICAgICAgICAiaW4gYmFja19saW5lcygpLlxuIik7CisJCQkJCQlleGl0KC0xKTsKKwkJCQkJfQorCQkJCQlwYWdlID0gYnVmICsgQlVGX1NJWkUgLyAyOworCQkJCX0KKwkJCQlpZiAoKGJ5dGVzX3JlYWQgPQorCQkJCSAgICAgcmVhZChmZCwgYnVmLCBCVUZfU0laRSkpID09IC0xKSB7CisJCQkJCWVuZHdpbigpOworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgcmVhZGluZyBmaWxlIGluIGJhY2tfbGluZXMoKS5cbiIpOworCQkJCQlleGl0KC0xKTsKKwkJCQl9CisJCQkJYnVmW2J5dGVzX3JlYWRdID0gJ1wwJzsKKwkJCX0gZWxzZSB7CS8qIEJlZ2lubmluZyBvZiBmaWxlIHJlYWNoZWQgKi8KKwkJCQliZWdpbl9yZWFjaGVkID0gMTsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJaWYgKCooLS1wYWdlKSAhPSAnXG4nKSB7CS8qICctLXBhZ2UnIGhlcmUgKi8KKwkJCS8qIFNvbWV0aGluZydzIHdyb25nLi4uICovCisJCQllbmR3aW4oKTsKKwkJCWZwcmludGYoc3RkZXJyLCAiXG5JbnRlcm5hbCBlcnJvciBpbiBiYWNrX2xpbmVzKCkuXG4iKTsKKwkJCWV4aXQoLTEpOworCQl9CisJfQorCS8qIEdvIGJhY2sgJ24nIGxpbmVzICovCisJZm9yIChpID0gMDsgaSA8IG47IGkrKykKKwkJZG8geworCQkJaWYgKHBhZ2UgPT0gYnVmKSB7CisJCQkJaWYgKChmcG9zID0gbHNlZWsoZmQsIDAsIFNFRUtfQ1VSKSkgPT0gLTEpIHsKKwkJCQkJZW5kd2luKCk7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiXG5FcnJvciBtb3ZpbmcgZmlsZSBwb2ludGVyIGluIGJhY2tfbGluZXMoKS5cbiIpOworCQkJCQlleGl0KC0xKTsKKwkJCQl9CisJCQkJaWYgKGZwb3MgPiBieXRlc19yZWFkKSB7CisJCQkJCS8qIFJlYWxseSBwb3NzaWJsZSB0byBtb3ZlIGJhY2t3YXJkIEJVRl9TSVpFLzIgYnl0ZXM/ICovCisJCQkJCWlmIChmcG9zIDwgQlVGX1NJWkUgLyAyICsgYnl0ZXNfcmVhZCkgeworCQkJCQkJLyogTm8sIG1vdmUgbGVzcyB0aGVuICovCisJCQkJCQlpZiAobHNlZWsoZmQsIDAsIFNFRUtfU0VUKSA9PSAtMSkgeworCQkJCQkJCWVuZHdpbigpOworCQkJCQkJCWZwcmludGYoc3RkZXJyLCAiXG5FcnJvciBtb3ZpbmcgZmlsZSBwb2ludGVyICIKKwkJCQkJCQkgICAgICAgICAgICAgICAgImluIGJhY2tfbGluZXMoKS5cbiIpOworCQkJCQkJCWV4aXQoLTEpOworCQkJCQkJfQorCQkJCQkJcGFnZSA9IGJ1ZiArIGZwb3MgLSBieXRlc19yZWFkOworCQkJCQl9IGVsc2UgewkvKiBNb3ZlIGJhY2t3YXJkIEJVRl9TSVpFLzIgYnl0ZXMgKi8KKwkJCQkJCWlmIChsc2VlayAoZmQsIC0oQlVGX1NJWkUgLyAyICsgYnl0ZXNfcmVhZCksIFNFRUtfQ1VSKSA9PSAtMSkgeworCQkJCQkJCWVuZHdpbigpOworCQkJCQkJCWZwcmludGYoc3RkZXJyLCAiXG5FcnJvciBtb3ZpbmcgZmlsZSBwb2ludGVyIgorCQkJCQkJCSAgICAgICAgICAgICAgICAiIGluIGJhY2tfbGluZXMoKS5cbiIpOworCQkJCQkJCWV4aXQoLTEpOworCQkJCQkJfQorCQkJCQkJcGFnZSA9IGJ1ZiArIEJVRl9TSVpFIC8gMjsKKwkJCQkJfQorCQkJCQlpZiAoKGJ5dGVzX3JlYWQgPQorCQkJCQkgICAgIHJlYWQoZmQsIGJ1ZiwgQlVGX1NJWkUpKSA9PSAtMSkgeworCQkJCQkJZW5kd2luKCk7CisJCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgcmVhZGluZyBmaWxlIGluICIKKwkJCQkJCSAgICAgICAgICAgICAgICAiYmFja19saW5lcygpLlxuIik7CisJCQkJCQlleGl0KC0xKTsKKwkJCQkJfQorCQkJCQlidWZbYnl0ZXNfcmVhZF0gPSAnXDAnOworCQkJCX0gZWxzZSB7CS8qIEJlZ2lubmluZyBvZiBmaWxlIHJlYWNoZWQgKi8KKwkJCQkJYmVnaW5fcmVhY2hlZCA9IDE7CisJCQkJCXJldHVybjsKKwkJCQl9CisJCQl9CisJCX0gd2hpbGUgKCooLS1wYWdlKSAhPSAnXG4nKTsKKwlwYWdlKys7Cit9CisKKy8qCisgKiBQcmludCBhIG5ldyBwYWdlIG9mIHRleHQuIENhbGxlZCBieSBkaWFsb2dfdGV4dGJveCgpLgorICovCitzdGF0aWMgdm9pZCBwcmludF9wYWdlKFdJTkRPVyAqIHdpbiwgaW50IGhlaWdodCwgaW50IHdpZHRoKQoreworCWludCBpLCBwYXNzZWRfZW5kID0gMDsKKworCXBhZ2VfbGVuZ3RoID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKwkJcHJpbnRfbGluZSh3aW4sIGksIHdpZHRoKTsKKwkJaWYgKCFwYXNzZWRfZW5kKQorCQkJcGFnZV9sZW5ndGgrKzsKKwkJaWYgKGVuZF9yZWFjaGVkICYmICFwYXNzZWRfZW5kKQorCQkJcGFzc2VkX2VuZCA9IDE7CisJfQorCXdub3V0cmVmcmVzaCh3aW4pOworfQorCisvKgorICogUHJpbnQgYSBuZXcgbGluZSBvZiB0ZXh0LiBDYWxsZWQgYnkgZGlhbG9nX3RleHRib3goKSBhbmQgcHJpbnRfcGFnZSgpLgorICovCitzdGF0aWMgdm9pZCBwcmludF9saW5lKFdJTkRPVyAqIHdpbiwgaW50IHJvdywgaW50IHdpZHRoKQoreworCWNoYXIgKmxpbmU7CisKKwlsaW5lID0gZ2V0X2xpbmUoKTsKKwlsaW5lICs9IE1JTihzdHJsZW4obGluZSksIGhzY3JvbGwpOwkvKiBTY3JvbGwgaG9yaXpvbnRhbGx5ICovCisJd21vdmUod2luLCByb3csIDApOwkvKiBtb3ZlIGN1cnNvciB0byBjb3JyZWN0IGxpbmUgKi8KKwl3YWRkY2god2luLCAnICcpOworCXdhZGRuc3RyKHdpbiwgbGluZSwgTUlOKHN0cmxlbihsaW5lKSwgd2lkdGggLSAyKSk7CisKKwkvKiBDbGVhciAncmVzaWR1ZScgb2YgcHJldmlvdXMgbGluZSAqLworI2lmIE9MRF9OQ1VSU0VTCisJeworCQlpbnQgaTsKKwkJaW50IHksIHg7CisKKwkJZ2V0eXgod2luLCB5LCB4KTsKKwkJZm9yIChpID0gMDsgaSA8IHdpZHRoIC0geDsgaSsrKQorCQkJd2FkZGNoKHdpbiwgJyAnKTsKKwl9CisjZWxzZQorCXdjbHJ0b2VvbCh3aW4pOworI2VuZGlmCit9CisKKy8qCisgKiBSZXR1cm4gY3VycmVudCBsaW5lIG9mIHRleHQuIENhbGxlZCBieSBkaWFsb2dfdGV4dGJveCgpIGFuZCBwcmludF9saW5lKCkuCisgKiAncGFnZScgc2hvdWxkIHBvaW50IHRvIHN0YXJ0IG9mIGN1cnJlbnQgbGluZSBiZWZvcmUgY2FsbGluZywgYW5kIHdpbGwgYmUKKyAqIHVwZGF0ZWQgdG8gcG9pbnQgdG8gc3RhcnQgb2YgbmV4dCBsaW5lLgorICovCitzdGF0aWMgY2hhciAqZ2V0X2xpbmUodm9pZCkKK3sKKwlpbnQgaSA9IDAsIGZwb3M7CisJc3RhdGljIGNoYXIgbGluZVtNQVhfTEVOICsgMV07CisKKwllbmRfcmVhY2hlZCA9IDA7CisJd2hpbGUgKCpwYWdlICE9ICdcbicpIHsKKwkJaWYgKCpwYWdlID09ICdcMCcpIHsKKwkJCS8qIEVpdGhlciBlbmQgb2YgZmlsZSBvciBlbmQgb2YgYnVmZmVyIHJlYWNoZWQgKi8KKwkJCWlmICgoZnBvcyA9IGxzZWVrKGZkLCAwLCBTRUVLX0NVUikpID09IC0xKSB7CisJCQkJZW5kd2luKCk7CisJCQkJZnByaW50ZihzdGRlcnIsICJcbkVycm9yIG1vdmluZyBmaWxlIHBvaW50ZXIgaW4gIgorCQkJCSAgICAgICAgICAgICAgICAiZ2V0X2xpbmUoKS5cbiIpOworCQkJCWV4aXQoLTEpOworCQkJfQorCQkJaWYgKGZwb3MgPCBmaWxlX3NpemUpIHsJLyogTm90IGVuZCBvZiBmaWxlIHlldCAqLworCQkJCS8qIFdlJ3ZlIHJlYWNoZWQgZW5kIG9mIGJ1ZmZlciwgYnV0IG5vdCBlbmQgb2YgZmlsZSB5ZXQsCisJCQkJICAgc28gcmVhZCBuZXh0IHBhcnQgb2YgZmlsZSBpbnRvIGJ1ZmZlciAqLworCQkJCWlmICgoYnl0ZXNfcmVhZCA9CisJCQkJICAgICByZWFkKGZkLCBidWYsIEJVRl9TSVpFKSkgPT0gLTEpIHsKKwkJCQkJZW5kd2luKCk7CisJCQkJCWZwcmludGYoc3RkZXJyLCAiXG5FcnJvciByZWFkaW5nIGZpbGUgaW4gZ2V0X2xpbmUoKS5cbiIpOworCQkJCQlleGl0KC0xKTsKKwkJCQl9CisJCQkJYnVmW2J5dGVzX3JlYWRdID0gJ1wwJzsKKwkJCQlwYWdlID0gYnVmOworCQkJfSBlbHNlIHsKKwkJCQlpZiAoIWVuZF9yZWFjaGVkKQorCQkJCQllbmRfcmVhY2hlZCA9IDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSBpZiAoaSA8IE1BWF9MRU4pCisJCQlsaW5lW2krK10gPSAqKHBhZ2UrKyk7CisJCWVsc2UgeworCQkJLyogVHJ1bmNhdGUgbGluZXMgbG9uZ2VyIHRoYW4gTUFYX0xFTiBjaGFyYWN0ZXJzICovCisJCQlpZiAoaSA9PSBNQVhfTEVOKQorCQkJCWxpbmVbaSsrXSA9ICdcMCc7CisJCQlwYWdlKys7CisJCX0KKwl9CisJaWYgKGkgPD0gTUFYX0xFTikKKwkJbGluZVtpXSA9ICdcMCc7CisJaWYgKCFlbmRfcmVhY2hlZCkKKwkJcGFnZSsrOwkJLyogbW92ZSBwYXNzICdcbicgKi8KKworCXJldHVybiBsaW5lOworfQorCisvKgorICogUHJpbnQgY3VycmVudCBwb3NpdGlvbgorICovCitzdGF0aWMgdm9pZCBwcmludF9wb3NpdGlvbihXSU5ET1cgKiB3aW4sIGludCBoZWlnaHQsIGludCB3aWR0aCkKK3sKKwlpbnQgZnBvcywgcGVyY2VudDsKKworCWlmICgoZnBvcyA9IGxzZWVrKGZkLCAwLCBTRUVLX0NVUikpID09IC0xKSB7CisJCWVuZHdpbigpOworCQlmcHJpbnRmKHN0ZGVyciwgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciBpbiBwcmludF9wb3NpdGlvbigpLlxuIik7CisJCWV4aXQoLTEpOworCX0KKwl3YXR0cnNldCh3aW4sIHBvc2l0aW9uX2luZGljYXRvcl9hdHRyKTsKKwl3YmtnZHNldCh3aW4sIHBvc2l0aW9uX2luZGljYXRvcl9hdHRyICYgQV9DT0xPUik7CisJcGVyY2VudCA9ICFmaWxlX3NpemUgPworCSAgICAxMDAgOiAoKGZwb3MgLSBieXRlc19yZWFkICsgcGFnZSAtIGJ1ZikgKiAxMDApIC8gZmlsZV9zaXplOworCXdtb3ZlKHdpbiwgaGVpZ2h0IC0gMywgd2lkdGggLSA5KTsKKwl3cHJpbnR3KHdpbiwgIiglM2QlJSkiLCBwZXJjZW50KTsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9seGRpYWxvZy91dGlsLmMgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvdXRpbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3MmQzZWUKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvdXRpbC5jCkBAIC0wLDAgKzEsMzYyIEBACisvKgorICogIHV0aWwuYworICoKKyAqICBPUklHSU5BTCBBVVRIT1I6IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspCisgKiAgTU9ESUZJRUQgRk9SIExJTlVYIEtFUk5FTCBDT05GSUcgQlk6IFdpbGxpYW0gUm9hZGNhcCAocm9hZGNhcEBjZncuY29tKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImRpYWxvZy5oIgorCisvKiB1c2UgY29sb3JzIGJ5IGRlZmF1bHQ/ICovCitib29sIHVzZV9jb2xvcnMgPSAxOworCitjb25zdCBjaGFyICpiYWNrdGl0bGUgPSBOVUxMOworCisvKgorICogQXR0cmlidXRlIHZhbHVlcywgZGVmYXVsdCBpcyBmb3IgbW9ubyBkaXNwbGF5CisgKi8KK2NodHlwZSBhdHRyaWJ1dGVzW10gPSB7CisJQV9OT1JNQUwsCQkvKiBzY3JlZW5fYXR0ciAqLworCUFfTk9STUFMLAkJLyogc2hhZG93X2F0dHIgKi8KKwlBX05PUk1BTCwJCS8qIGRpYWxvZ19hdHRyICovCisJQV9CT0xELAkJCS8qIHRpdGxlX2F0dHIgKi8KKwlBX05PUk1BTCwJCS8qIGJvcmRlcl9hdHRyICovCisJQV9SRVZFUlNFLAkJLyogYnV0dG9uX2FjdGl2ZV9hdHRyICovCisJQV9ESU0sCQkJLyogYnV0dG9uX2luYWN0aXZlX2F0dHIgKi8KKwlBX1JFVkVSU0UsCQkvKiBidXR0b25fa2V5X2FjdGl2ZV9hdHRyICovCisJQV9CT0xELAkJCS8qIGJ1dHRvbl9rZXlfaW5hY3RpdmVfYXR0ciAqLworCUFfUkVWRVJTRSwJCS8qIGJ1dHRvbl9sYWJlbF9hY3RpdmVfYXR0ciAqLworCUFfTk9STUFMLAkJLyogYnV0dG9uX2xhYmVsX2luYWN0aXZlX2F0dHIgKi8KKwlBX05PUk1BTCwJCS8qIGlucHV0Ym94X2F0dHIgKi8KKwlBX05PUk1BTCwJCS8qIGlucHV0Ym94X2JvcmRlcl9hdHRyICovCisJQV9OT1JNQUwsCQkvKiBzZWFyY2hib3hfYXR0ciAqLworCUFfQk9MRCwJCQkvKiBzZWFyY2hib3hfdGl0bGVfYXR0ciAqLworCUFfTk9STUFMLAkJLyogc2VhcmNoYm94X2JvcmRlcl9hdHRyICovCisJQV9CT0xELAkJCS8qIHBvc2l0aW9uX2luZGljYXRvcl9hdHRyICovCisJQV9OT1JNQUwsCQkvKiBtZW51Ym94X2F0dHIgKi8KKwlBX05PUk1BTCwJCS8qIG1lbnVib3hfYm9yZGVyX2F0dHIgKi8KKwlBX05PUk1BTCwJCS8qIGl0ZW1fYXR0ciAqLworCUFfUkVWRVJTRSwJCS8qIGl0ZW1fc2VsZWN0ZWRfYXR0ciAqLworCUFfQk9MRCwJCQkvKiB0YWdfYXR0ciAqLworCUFfUkVWRVJTRSwJCS8qIHRhZ19zZWxlY3RlZF9hdHRyICovCisJQV9CT0xELAkJCS8qIHRhZ19rZXlfYXR0ciAqLworCUFfUkVWRVJTRSwJCS8qIHRhZ19rZXlfc2VsZWN0ZWRfYXR0ciAqLworCUFfQk9MRCwJCQkvKiBjaGVja19hdHRyICovCisJQV9SRVZFUlNFLAkJLyogY2hlY2tfc2VsZWN0ZWRfYXR0ciAqLworCUFfQk9MRCwJCQkvKiB1YXJyb3dfYXR0ciAqLworCUFfQk9MRAkJCS8qIGRhcnJvd19hdHRyICovCit9OworCisjaW5jbHVkZSAiY29sb3JzLmgiCisKKy8qCisgKiBUYWJsZSBvZiBjb2xvciB2YWx1ZXMKKyAqLworaW50IGNvbG9yX3RhYmxlW11bM10gPSB7CisJe1NDUkVFTl9GRywgU0NSRUVOX0JHLCBTQ1JFRU5fSEx9LAorCXtTSEFET1dfRkcsIFNIQURPV19CRywgU0hBRE9XX0hMfSwKKwl7RElBTE9HX0ZHLCBESUFMT0dfQkcsIERJQUxPR19ITH0sCisJe1RJVExFX0ZHLCBUSVRMRV9CRywgVElUTEVfSEx9LAorCXtCT1JERVJfRkcsIEJPUkRFUl9CRywgQk9SREVSX0hMfSwKKwl7QlVUVE9OX0FDVElWRV9GRywgQlVUVE9OX0FDVElWRV9CRywgQlVUVE9OX0FDVElWRV9ITH0sCisJe0JVVFRPTl9JTkFDVElWRV9GRywgQlVUVE9OX0lOQUNUSVZFX0JHLCBCVVRUT05fSU5BQ1RJVkVfSEx9LAorCXtCVVRUT05fS0VZX0FDVElWRV9GRywgQlVUVE9OX0tFWV9BQ1RJVkVfQkcsIEJVVFRPTl9LRVlfQUNUSVZFX0hMfSwKKwl7QlVUVE9OX0tFWV9JTkFDVElWRV9GRywgQlVUVE9OX0tFWV9JTkFDVElWRV9CRywKKwkgQlVUVE9OX0tFWV9JTkFDVElWRV9ITH0sCisJe0JVVFRPTl9MQUJFTF9BQ1RJVkVfRkcsIEJVVFRPTl9MQUJFTF9BQ1RJVkVfQkcsCisJIEJVVFRPTl9MQUJFTF9BQ1RJVkVfSEx9LAorCXtCVVRUT05fTEFCRUxfSU5BQ1RJVkVfRkcsIEJVVFRPTl9MQUJFTF9JTkFDVElWRV9CRywKKwkgQlVUVE9OX0xBQkVMX0lOQUNUSVZFX0hMfSwKKwl7SU5QVVRCT1hfRkcsIElOUFVUQk9YX0JHLCBJTlBVVEJPWF9ITH0sCisJe0lOUFVUQk9YX0JPUkRFUl9GRywgSU5QVVRCT1hfQk9SREVSX0JHLCBJTlBVVEJPWF9CT1JERVJfSEx9LAorCXtTRUFSQ0hCT1hfRkcsIFNFQVJDSEJPWF9CRywgU0VBUkNIQk9YX0hMfSwKKwl7U0VBUkNIQk9YX1RJVExFX0ZHLCBTRUFSQ0hCT1hfVElUTEVfQkcsIFNFQVJDSEJPWF9USVRMRV9ITH0sCisJe1NFQVJDSEJPWF9CT1JERVJfRkcsIFNFQVJDSEJPWF9CT1JERVJfQkcsIFNFQVJDSEJPWF9CT1JERVJfSEx9LAorCXtQT1NJVElPTl9JTkRJQ0FUT1JfRkcsIFBPU0lUSU9OX0lORElDQVRPUl9CRywgUE9TSVRJT05fSU5ESUNBVE9SX0hMfSwKKwl7TUVOVUJPWF9GRywgTUVOVUJPWF9CRywgTUVOVUJPWF9ITH0sCisJe01FTlVCT1hfQk9SREVSX0ZHLCBNRU5VQk9YX0JPUkRFUl9CRywgTUVOVUJPWF9CT1JERVJfSEx9LAorCXtJVEVNX0ZHLCBJVEVNX0JHLCBJVEVNX0hMfSwKKwl7SVRFTV9TRUxFQ1RFRF9GRywgSVRFTV9TRUxFQ1RFRF9CRywgSVRFTV9TRUxFQ1RFRF9ITH0sCisJe1RBR19GRywgVEFHX0JHLCBUQUdfSEx9LAorCXtUQUdfU0VMRUNURURfRkcsIFRBR19TRUxFQ1RFRF9CRywgVEFHX1NFTEVDVEVEX0hMfSwKKwl7VEFHX0tFWV9GRywgVEFHX0tFWV9CRywgVEFHX0tFWV9ITH0sCisJe1RBR19LRVlfU0VMRUNURURfRkcsIFRBR19LRVlfU0VMRUNURURfQkcsIFRBR19LRVlfU0VMRUNURURfSEx9LAorCXtDSEVDS19GRywgQ0hFQ0tfQkcsIENIRUNLX0hMfSwKKwl7Q0hFQ0tfU0VMRUNURURfRkcsIENIRUNLX1NFTEVDVEVEX0JHLCBDSEVDS19TRUxFQ1RFRF9ITH0sCisJe1VBUlJPV19GRywgVUFSUk9XX0JHLCBVQVJST1dfSEx9LAorCXtEQVJST1dfRkcsIERBUlJPV19CRywgREFSUk9XX0hMfSwKK307CQkJCS8qIGNvbG9yX3RhYmxlICovCisKKy8qCisgKiBTZXQgd2luZG93IHRvIGF0dHJpYnV0ZSAnYXR0cicKKyAqLwordm9pZCBhdHRyX2NsZWFyKFdJTkRPVyAqIHdpbiwgaW50IGhlaWdodCwgaW50IHdpZHRoLCBjaHR5cGUgYXR0cikKK3sKKwlpbnQgaSwgajsKKworCXdhdHRyc2V0KHdpbiwgYXR0cik7CisJZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisJCXdtb3ZlKHdpbiwgaSwgMCk7CisJCWZvciAoaiA9IDA7IGogPCB3aWR0aDsgaisrKQorCQkJd2FkZGNoKHdpbiwgJyAnKTsKKwl9CisJdG91Y2h3aW4od2luKTsKK30KKwordm9pZCBkaWFsb2dfY2xlYXIodm9pZCkKK3sKKwlhdHRyX2NsZWFyKHN0ZHNjciwgTElORVMsIENPTFMsIHNjcmVlbl9hdHRyKTsKKwkvKiBEaXNwbGF5IGJhY2tncm91bmQgdGl0bGUgaWYgaXQgZXhpc3RzIC4uLiAtIFNMSCAqLworCWlmIChiYWNrdGl0bGUgIT0gTlVMTCkgeworCQlpbnQgaTsKKworCQl3YXR0cnNldChzdGRzY3IsIHNjcmVlbl9hdHRyKTsKKwkJbXZ3YWRkc3RyKHN0ZHNjciwgMCwgMSwgKGNoYXIgKiliYWNrdGl0bGUpOworCQl3bW92ZShzdGRzY3IsIDEsIDEpOworCQlmb3IgKGkgPSAxOyBpIDwgQ09MUyAtIDE7IGkrKykKKwkJCXdhZGRjaChzdGRzY3IsIEFDU19ITElORSk7CisJfQorCXdub3V0cmVmcmVzaChzdGRzY3IpOworfQorCisvKgorICogRG8gc29tZSBpbml0aWFsaXphdGlvbiBmb3IgZGlhbG9nCisgKi8KK3ZvaWQgaW5pdF9kaWFsb2codm9pZCkKK3sKKwlpbml0c2NyKCk7CQkvKiBJbml0IGN1cnNlcyAqLworCWtleXBhZChzdGRzY3IsIFRSVUUpOworCWNicmVhaygpOworCW5vZWNobygpOworCisJaWYgKHVzZV9jb2xvcnMpCQkvKiBTZXQgdXAgY29sb3JzICovCisJCWNvbG9yX3NldHVwKCk7CisKKwlkaWFsb2dfY2xlYXIoKTsKK30KKworLyoKKyAqIFNldHVwIGZvciBjb2xvciBkaXNwbGF5CisgKi8KK3ZvaWQgY29sb3Jfc2V0dXAodm9pZCkKK3sKKwlpbnQgaTsKKworCWlmIChoYXNfY29sb3JzKCkpIHsJLyogVGVybWluYWwgc3VwcG9ydHMgY29sb3I/ICovCisJCXN0YXJ0X2NvbG9yKCk7CisKKwkJLyogSW5pdGlhbGl6ZSBjb2xvciBwYWlycyAqLworCQlmb3IgKGkgPSAwOyBpIDwgQVRUUklCVVRFX0NPVU5UOyBpKyspCisJCQlpbml0X3BhaXIoaSArIDEsIGNvbG9yX3RhYmxlW2ldWzBdLCBjb2xvcl90YWJsZVtpXVsxXSk7CisKKwkJLyogU2V0dXAgY29sb3IgYXR0cmlidXRlcyAqLworCQlmb3IgKGkgPSAwOyBpIDwgQVRUUklCVVRFX0NPVU5UOyBpKyspCisJCQlhdHRyaWJ1dGVzW2ldID0gQ19BVFRSKGNvbG9yX3RhYmxlW2ldWzJdLCBpICsgMSk7CisJfQorfQorCisvKgorICogRW5kIHVzaW5nIGRpYWxvZyBmdW5jdGlvbnMuCisgKi8KK3ZvaWQgZW5kX2RpYWxvZyh2b2lkKQoreworCWVuZHdpbigpOworfQorCisvKiBQcmludCB0aGUgdGl0bGUgb2YgdGhlIGRpYWxvZy4gQ2VudGVyIHRoZSB0aXRsZSBhbmQgdHJ1bmNhdGUKKyAqIHRpbGUgaWYgd2lkZXIgdGhhbiBkaWFsb2cgKC0gMiBjaGFycykuCisgKiovCit2b2lkIHByaW50X3RpdGxlKFdJTkRPVyAqZGlhbG9nLCBjb25zdCBjaGFyICp0aXRsZSwgaW50IHdpZHRoKQoreworCWlmICh0aXRsZSkgeworCQlpbnQgdGxlbiA9IE1JTih3aWR0aCAtIDIsIHN0cmxlbih0aXRsZSkpOworCQl3YXR0cnNldChkaWFsb2csIHRpdGxlX2F0dHIpOworCQltdndhZGRjaChkaWFsb2csIDAsICh3aWR0aCAtIHRsZW4pIC8gMiAtIDEsICcgJyk7CisJCW12d2FkZG5zdHIoZGlhbG9nLCAwLCAod2lkdGggLSB0bGVuKS8yLCB0aXRsZSwgdGxlbik7CisJCXdhZGRjaChkaWFsb2csICcgJyk7CisJfQorfQorCisvKgorICogUHJpbnQgYSBzdHJpbmcgb2YgdGV4dCBpbiBhIHdpbmRvdywgYXV0b21hdGljYWxseSB3cmFwIGFyb3VuZCB0byB0aGUKKyAqIG5leHQgbGluZSBpZiB0aGUgc3RyaW5nIGlzIHRvbyBsb25nIHRvIGZpdCBvbiBvbmUgbGluZS4gTmV3bGluZQorICogY2hhcmFjdGVycyAnXG4nIGFyZSByZXBsYWNlZCBieSBzcGFjZXMuICBXZSBzdGFydCBvbiBhIG5ldyBsaW5lCisgKiBpZiB0aGVyZSBpcyBubyByb29tIGZvciBhdCBsZWFzdCA0IG5vbmJsYW5rcyBmb2xsb3dpbmcgYSBkb3VibGUtc3BhY2UuCisgKi8KK3ZvaWQgcHJpbnRfYXV0b3dyYXAoV0lORE9XICogd2luLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCB3aWR0aCwgaW50IHksIGludCB4KQoreworCWludCBuZXdsLCBjdXJfeCwgY3VyX3k7CisJaW50IGksIHByb21wdF9sZW4sIHJvb20sIHdsZW47CisJY2hhciB0ZW1wc3RyW01BWF9MRU4gKyAxXSwgKndvcmQsICpzcCwgKnNwMjsKKworCXN0cmNweSh0ZW1wc3RyLCBwcm9tcHQpOworCisJcHJvbXB0X2xlbiA9IHN0cmxlbih0ZW1wc3RyKTsKKworCS8qCisJICogUmVtb3ZlIG5ld2xpbmVzCisJICovCisJZm9yIChpID0gMDsgaSA8IHByb21wdF9sZW47IGkrKykgeworCQlpZiAodGVtcHN0cltpXSA9PSAnXG4nKQorCQkJdGVtcHN0cltpXSA9ICcgJzsKKwl9CisKKwlpZiAocHJvbXB0X2xlbiA8PSB3aWR0aCAtIHggKiAyKSB7CS8qIElmIHByb21wdCBpcyBzaG9ydCAqLworCQl3bW92ZSh3aW4sIHksICh3aWR0aCAtIHByb21wdF9sZW4pIC8gMik7CisJCXdhZGRzdHIod2luLCB0ZW1wc3RyKTsKKwl9IGVsc2UgeworCQljdXJfeCA9IHg7CisJCWN1cl95ID0geTsKKwkJbmV3bCA9IDE7CisJCXdvcmQgPSB0ZW1wc3RyOworCQl3aGlsZSAod29yZCAmJiAqd29yZCkgeworCQkJc3AgPSBzdHJjaHIod29yZCwgJyAnKTsKKwkJCWlmIChzcCkKKwkJCQkqc3ArKyA9IDA7CisKKwkJCS8qIFdyYXAgdG8gbmV4dCBsaW5lIGlmIGVpdGhlciB0aGUgd29yZCBkb2VzIG5vdCBmaXQsCisJCQkgICBvciBpdCBpcyB0aGUgZmlyc3Qgd29yZCBvZiBhIG5ldyBzZW50ZW5jZSwgYW5kIGl0IGlzCisJCQkgICBzaG9ydCwgYW5kIHRoZSBuZXh0IHdvcmQgZG9lcyBub3QgZml0LiAqLworCQkJcm9vbSA9IHdpZHRoIC0gY3VyX3g7CisJCQl3bGVuID0gc3RybGVuKHdvcmQpOworCQkJaWYgKHdsZW4gPiByb29tIHx8CisJCQkgICAgKG5ld2wgJiYgd2xlbiA8IDQgJiYgc3AKKwkJCSAgICAgJiYgd2xlbiArIDEgKyBzdHJsZW4oc3ApID4gcm9vbQorCQkJICAgICAmJiAoIShzcDIgPSBzdHJjaHIoc3AsICcgJykpCisJCQkJIHx8IHdsZW4gKyAxICsgKHNwMiAtIHNwKSA+IHJvb20pKSkgeworCQkJCWN1cl95Kys7CisJCQkJY3VyX3ggPSB4OworCQkJfQorCQkJd21vdmUod2luLCBjdXJfeSwgY3VyX3gpOworCQkJd2FkZHN0cih3aW4sIHdvcmQpOworCQkJZ2V0eXgod2luLCBjdXJfeSwgY3VyX3gpOworCQkJY3VyX3grKzsKKwkJCWlmIChzcCAmJiAqc3AgPT0gJyAnKSB7CisJCQkJY3VyX3grKzsJLyogZG91YmxlIHNwYWNlICovCisJCQkJd2hpbGUgKCorK3NwID09ICcgJykgOworCQkJCW5ld2wgPSAxOworCQkJfSBlbHNlCisJCQkJbmV3bCA9IDA7CisJCQl3b3JkID0gc3A7CisJCX0KKwl9Cit9CisKKy8qCisgKiBQcmludCBhIGJ1dHRvbgorICovCit2b2lkIHByaW50X2J1dHRvbihXSU5ET1cgKiB3aW4sIGNvbnN0IGNoYXIgKmxhYmVsLCBpbnQgeSwgaW50IHgsIGludCBzZWxlY3RlZCkKK3sKKwlpbnQgaSwgdGVtcDsKKworCXdtb3ZlKHdpbiwgeSwgeCk7CisJd2F0dHJzZXQod2luLCBzZWxlY3RlZCA/IGJ1dHRvbl9hY3RpdmVfYXR0ciA6IGJ1dHRvbl9pbmFjdGl2ZV9hdHRyKTsKKwl3YWRkc3RyKHdpbiwgIjwiKTsKKwl0ZW1wID0gc3Ryc3BuKGxhYmVsLCAiICIpOworCWxhYmVsICs9IHRlbXA7CisJd2F0dHJzZXQod2luLCBzZWxlY3RlZCA/IGJ1dHRvbl9sYWJlbF9hY3RpdmVfYXR0cgorCQkgOiBidXR0b25fbGFiZWxfaW5hY3RpdmVfYXR0cik7CisJZm9yIChpID0gMDsgaSA8IHRlbXA7IGkrKykKKwkJd2FkZGNoKHdpbiwgJyAnKTsKKwl3YXR0cnNldCh3aW4sIHNlbGVjdGVkID8gYnV0dG9uX2tleV9hY3RpdmVfYXR0cgorCQkgOiBidXR0b25fa2V5X2luYWN0aXZlX2F0dHIpOworCXdhZGRjaCh3aW4sIGxhYmVsWzBdKTsKKwl3YXR0cnNldCh3aW4sIHNlbGVjdGVkID8gYnV0dG9uX2xhYmVsX2FjdGl2ZV9hdHRyCisJCSA6IGJ1dHRvbl9sYWJlbF9pbmFjdGl2ZV9hdHRyKTsKKwl3YWRkc3RyKHdpbiwgKGNoYXIgKilsYWJlbCArIDEpOworCXdhdHRyc2V0KHdpbiwgc2VsZWN0ZWQgPyBidXR0b25fYWN0aXZlX2F0dHIgOiBidXR0b25faW5hY3RpdmVfYXR0cik7CisJd2FkZHN0cih3aW4sICI+Iik7CisJd21vdmUod2luLCB5LCB4ICsgdGVtcCArIDEpOworfQorCisvKgorICogRHJhdyBhIHJlY3Rhbmd1bGFyIGJveCB3aXRoIGxpbmUgZHJhd2luZyBjaGFyYWN0ZXJzCisgKi8KK3ZvaWQKK2RyYXdfYm94KFdJTkRPVyAqIHdpbiwgaW50IHksIGludCB4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsCisJIGNodHlwZSBib3gsIGNodHlwZSBib3JkZXIpCit7CisJaW50IGksIGo7CisKKwl3YXR0cnNldCh3aW4sIDApOworCWZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworCQl3bW92ZSh3aW4sIHkgKyBpLCB4KTsKKwkJZm9yIChqID0gMDsgaiA8IHdpZHRoOyBqKyspCisJCQlpZiAoIWkgJiYgIWopCisJCQkJd2FkZGNoKHdpbiwgYm9yZGVyIHwgQUNTX1VMQ09STkVSKTsKKwkJCWVsc2UgaWYgKGkgPT0gaGVpZ2h0IC0gMSAmJiAhaikKKwkJCQl3YWRkY2god2luLCBib3JkZXIgfCBBQ1NfTExDT1JORVIpOworCQkJZWxzZSBpZiAoIWkgJiYgaiA9PSB3aWR0aCAtIDEpCisJCQkJd2FkZGNoKHdpbiwgYm94IHwgQUNTX1VSQ09STkVSKTsKKwkJCWVsc2UgaWYgKGkgPT0gaGVpZ2h0IC0gMSAmJiBqID09IHdpZHRoIC0gMSkKKwkJCQl3YWRkY2god2luLCBib3ggfCBBQ1NfTFJDT1JORVIpOworCQkJZWxzZSBpZiAoIWkpCisJCQkJd2FkZGNoKHdpbiwgYm9yZGVyIHwgQUNTX0hMSU5FKTsKKwkJCWVsc2UgaWYgKGkgPT0gaGVpZ2h0IC0gMSkKKwkJCQl3YWRkY2god2luLCBib3ggfCBBQ1NfSExJTkUpOworCQkJZWxzZSBpZiAoIWopCisJCQkJd2FkZGNoKHdpbiwgYm9yZGVyIHwgQUNTX1ZMSU5FKTsKKwkJCWVsc2UgaWYgKGogPT0gd2lkdGggLSAxKQorCQkJCXdhZGRjaCh3aW4sIGJveCB8IEFDU19WTElORSk7CisJCQllbHNlCisJCQkJd2FkZGNoKHdpbiwgYm94IHwgJyAnKTsKKwl9Cit9CisKKy8qCisgKiBEcmF3IHNoYWRvd3MgYWxvbmcgdGhlIHJpZ2h0IGFuZCBib3R0b20gZWRnZSB0byBnaXZlIGEgbW9yZSAzRCBsb29rCisgKiB0byB0aGUgYm94ZXMKKyAqLwordm9pZCBkcmF3X3NoYWRvdyhXSU5ET1cgKiB3aW4sIGludCB5LCBpbnQgeCwgaW50IGhlaWdodCwgaW50IHdpZHRoKQoreworCWludCBpOworCisJaWYgKGhhc19jb2xvcnMoKSkgewkvKiBXaGV0aGVyIHRlcm1pbmFsIHN1cHBvcnRzIGNvbG9yPyAqLworCQl3YXR0cnNldCh3aW4sIHNoYWRvd19hdHRyKTsKKwkJd21vdmUod2luLCB5ICsgaGVpZ2h0LCB4ICsgMik7CisJCWZvciAoaSA9IDA7IGkgPCB3aWR0aDsgaSsrKQorCQkJd2FkZGNoKHdpbiwgd2luY2god2luKSAmIEFfQ0hBUlRFWFQpOworCQlmb3IgKGkgPSB5ICsgMTsgaSA8IHkgKyBoZWlnaHQgKyAxOyBpKyspIHsKKwkJCXdtb3ZlKHdpbiwgaSwgeCArIHdpZHRoKTsKKwkJCXdhZGRjaCh3aW4sIHdpbmNoKHdpbikgJiBBX0NIQVJURVhUKTsKKwkJCXdhZGRjaCh3aW4sIHdpbmNoKHdpbikgJiBBX0NIQVJURVhUKTsKKwkJfQorCQl3bm91dHJlZnJlc2god2luKTsKKwl9Cit9CisKKy8qCisgKiAgUmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgYWxwaGFiZXRpYyBjaGFyYWN0ZXIgaW4gYSBzdHJpbmcuCisgKi8KK2ludCBmaXJzdF9hbHBoYShjb25zdCBjaGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKmV4ZW1wdCkKK3sKKwlpbnQgaSwgaW5fcGFyZW4gPSAwLCBjOworCisJZm9yIChpID0gMDsgaSA8IHN0cmxlbihzdHJpbmcpOyBpKyspIHsKKwkJYyA9IHRvbG93ZXIoc3RyaW5nW2ldKTsKKworCQlpZiAoc3RyY2hyKCI8WygiLCBjKSkKKwkJCSsraW5fcGFyZW47CisJCWlmIChzdHJjaHIoIj5dKSIsIGMpICYmIGluX3BhcmVuID4gMCkKKwkJCS0taW5fcGFyZW47CisKKwkJaWYgKCghaW5fcGFyZW4pICYmIGlzYWxwaGEoYykgJiYgc3RyY2hyKGV4ZW1wdCwgYykgPT0gMCkKKwkJCXJldHVybiBpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL3llc25vLmMgYi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cveWVzbm8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjI1NjhhCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL2x4ZGlhbG9nL3llc25vLmMKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiAgeWVzbm8uYyAtLSBpbXBsZW1lbnRzIHRoZSB5ZXMvbm8gYm94CisgKgorICogIE9SSUdJTkFMIEFVVEhPUjogU2F2aW8gTGFtIChsYW04MzZAY3MuY3Voay5oaykKKyAqICBNT0RJRklFRCBGT1IgTElOVVggS0VSTkVMIENPTkZJRyBCWTogV2lsbGlhbSBSb2FkY2FwIChyb2FkY2FwQGNmdy5jb20pCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZGlhbG9nLmgiCisKKy8qCisgKiBEaXNwbGF5IHRlcm1pbmF0aW9uIGJ1dHRvbnMKKyAqLworc3RhdGljIHZvaWQgcHJpbnRfYnV0dG9ucyhXSU5ET1cgKiBkaWFsb2csIGludCBoZWlnaHQsIGludCB3aWR0aCwgaW50IHNlbGVjdGVkKQoreworCWludCB4ID0gd2lkdGggLyAyIC0gMTA7CisJaW50IHkgPSBoZWlnaHQgLSAyOworCisJcHJpbnRfYnV0dG9uKGRpYWxvZywgIiBZZXMgIiwgeSwgeCwgc2VsZWN0ZWQgPT0gMCk7CisJcHJpbnRfYnV0dG9uKGRpYWxvZywgIiAgTm8gICIsIHksIHggKyAxMywgc2VsZWN0ZWQgPT0gMSk7CisKKwl3bW92ZShkaWFsb2csIHksIHggKyAxICsgMTMgKiBzZWxlY3RlZCk7CisJd3JlZnJlc2goZGlhbG9nKTsKK30KKworLyoKKyAqIERpc3BsYXkgYSBkaWFsb2cgYm94IHdpdGggdHdvIGJ1dHRvbnMgLSBZZXMgYW5kIE5vCisgKi8KK2ludCBkaWFsb2dfeWVzbm8oY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnByb21wdCwgaW50IGhlaWdodCwgaW50IHdpZHRoKQoreworCWludCBpLCB4LCB5LCBrZXkgPSAwLCBidXR0b24gPSAwOworCVdJTkRPVyAqZGlhbG9nOworCisJLyogY2VudGVyIGRpYWxvZyBib3ggb24gc2NyZWVuICovCisJeCA9IChDT0xTIC0gd2lkdGgpIC8gMjsKKwl5ID0gKExJTkVTIC0gaGVpZ2h0KSAvIDI7CisKKwlkcmF3X3NoYWRvdyhzdGRzY3IsIHksIHgsIGhlaWdodCwgd2lkdGgpOworCisJZGlhbG9nID0gbmV3d2luKGhlaWdodCwgd2lkdGgsIHksIHgpOworCWtleXBhZChkaWFsb2csIFRSVUUpOworCisJZHJhd19ib3goZGlhbG9nLCAwLCAwLCBoZWlnaHQsIHdpZHRoLCBkaWFsb2dfYXR0ciwgYm9yZGVyX2F0dHIpOworCXdhdHRyc2V0KGRpYWxvZywgYm9yZGVyX2F0dHIpOworCW12d2FkZGNoKGRpYWxvZywgaGVpZ2h0IC0gMywgMCwgQUNTX0xURUUpOworCWZvciAoaSA9IDA7IGkgPCB3aWR0aCAtIDI7IGkrKykKKwkJd2FkZGNoKGRpYWxvZywgQUNTX0hMSU5FKTsKKwl3YXR0cnNldChkaWFsb2csIGRpYWxvZ19hdHRyKTsKKwl3YWRkY2goZGlhbG9nLCBBQ1NfUlRFRSk7CisKKwlwcmludF90aXRsZShkaWFsb2csIHRpdGxlLCB3aWR0aCk7CisKKwl3YXR0cnNldChkaWFsb2csIGRpYWxvZ19hdHRyKTsKKwlwcmludF9hdXRvd3JhcChkaWFsb2csIHByb21wdCwgd2lkdGggLSAyLCAxLCAzKTsKKworCXByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCAwKTsKKworCXdoaWxlIChrZXkgIT0gRVNDKSB7CisJCWtleSA9IHdnZXRjaChkaWFsb2cpOworCQlzd2l0Y2ggKGtleSkgeworCQljYXNlICdZJzoKKwkJY2FzZSAneSc6CisJCQlkZWx3aW4oZGlhbG9nKTsKKwkJCXJldHVybiAwOworCQljYXNlICdOJzoKKwkJY2FzZSAnbic6CisJCQlkZWx3aW4oZGlhbG9nKTsKKwkJCXJldHVybiAxOworCisJCWNhc2UgVEFCOgorCQljYXNlIEtFWV9MRUZUOgorCQljYXNlIEtFWV9SSUdIVDoKKwkJCWJ1dHRvbiA9ICgoa2V5ID09IEtFWV9MRUZUID8gLS1idXR0b24gOiArK2J1dHRvbikgPCAwKSA/IDEgOiAoYnV0dG9uID4gMSA/IDAgOiBidXR0b24pOworCisJCQlwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgYnV0dG9uKTsKKwkJCXdyZWZyZXNoKGRpYWxvZyk7CisJCQlicmVhazsKKwkJY2FzZSAnICc6CisJCWNhc2UgJ1xuJzoKKwkJCWRlbHdpbihkaWFsb2cpOworCQkJcmV0dXJuIGJ1dHRvbjsKKwkJY2FzZSBFU0M6CisJCQlicmVhazsKKwkJfQorCX0KKworCWRlbHdpbihkaWFsb2cpOworCXJldHVybiAtMTsJCS8qIEVTQyBwcmVzc2VkICovCit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbWNvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9tY29uZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNmQwMzcKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvbWNvbmYuYwpAQCAtMCwwICsxLDExMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqCisgKiBJbnRyb2R1Y2VkIHNpbmdsZSBtZW51IG1vZGUgKHNob3cgYWxsIHN1Yi1tZW51cyBpbiBvbmUgbGFyZ2UgdHJlZSkuCisgKiAyMDAyLTExLTA2IFBldHIgQmF1ZGlzIDxwYXNreUB1Y3cuY3o+CisgKgorICogaTE4biwgMjAwNSwgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgKi8KKworI2RlZmluZSBfWE9QRU5fU09VUkNFIDcwMAorLyogT24gRGFyd2luLCB0aGlzIG1heSBiZSBuZWVkZWQgdG8gZ2V0IFNJR1dJTkNIOiAqLworI2RlZmluZSBfREFSV0lOX0NfU09VUkNFIDEKKworI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RyaW5ncy5oPiAvKiBmb3Igc3RyY2FzZWNtcCAqLworI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxsb2NhbGUuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworc3RhdGljIGNoYXIgbWVudV9iYWNrdGl0bGVbMTI4XTsKK3N0YXRpYyBjb25zdCBjaGFyIG1jb25mX3JlYWRtZVtdID0gTl8oCisiT3ZlcnZpZXdcbiIKKyItLS0tLS0tLVxuIgorIlNvbWUgZmVhdHVyZXMgbWF5IGJlIGJ1aWx0IGRpcmVjdGx5IGludG8gYnVzeWJveC5cbiIKKyJTb21lIG1heSBiZSBtYWRlIGludG8gc3RhbmRhbG9uZSBhcHBsZXRzLiAgU29tZSBmZWF0dXJlc1xuIgorIm1heSBiZSBjb21wbGV0ZWx5IHJlbW92ZWQgYWx0b2dldGhlci4gIFRoZXJlIGFyZSBhbHNvIGNlcnRhaW5cbiIKKyJwYXJhbWV0ZXJzIHdoaWNoIGFyZSBub3QgcmVhbGx5IGZlYXR1cmVzLCBidXQgbXVzdCBiZVxuIgorImVudGVyZWQgaW4gYXMgZGVjaW1hbCBvciBoZXhhZGVjaW1hbCBudW1iZXJzIG9yIHBvc3NpYmx5IHRleHQuXG4iCisiXG4iCisiTWVudSBpdGVtcyBiZWdpbm5pbmcgd2l0aCBbKl0sIDxNPiBvciBbIF0gcmVwcmVzZW50IGZlYXR1cmVzXG4iCisiY29uZmlndXJlZCB0byBiZSBidWlsdCBpbiwgbW9kdWxhcml6ZWQgb3IgcmVtb3ZlZCByZXNwZWN0aXZlbHkuXG4iCisiUG9pbnRlZCBicmFja2V0cyA8PiByZXByZXNlbnQgbW9kdWxlIGNhcGFibGUgZmVhdHVyZXMuXG4iCisiXG4iCisiVG8gY2hhbmdlIGFueSBvZiB0aGVzZSBmZWF0dXJlcywgaGlnaGxpZ2h0IGl0IHdpdGggdGhlIGN1cnNvclxuIgorImtleXMgYW5kIHByZXNzIDxZPiB0byBidWlsZCBpdCBpbiwgPE0+IHRvIG1ha2UgaXQgYSBtb2R1bGUgb3JcbiIKKyI8Tj4gdG8gcmVtb3ZlZCBpdC4gIFlvdSBtYXkgYWxzbyBwcmVzcyB0aGUgPFNwYWNlIEJhcj4gdG8gY3ljbGVcbiIKKyJ0aHJvdWdoIHRoZSBhdmFpbGFibGUgb3B0aW9ucyAoaWUuIFktPk4tPk0tPlkpLlxuIgorIlxuIgorIlNvbWUgYWRkaXRpb25hbCBrZXlib2FyZCBoaW50czpcbiIKKyJcbiIKKyJNZW51c1xuIgorIi0tLS0tLS0tLS1cbiIKKyJvICBVc2UgdGhlIFVwL0Rvd24gYXJyb3cga2V5cyAoY3Vyc29yIGtleXMpIHRvIGhpZ2hsaWdodCB0aGUgaXRlbVxuIgorIiAgIHlvdSB3aXNoIHRvIGNoYW5nZSBvciBzdWJtZW51IHdpc2ggdG8gc2VsZWN0IGFuZCBwcmVzcyA8RW50ZXI+LlxuIgorIiAgIFN1Ym1lbnVzIGFyZSBkZXNpZ25hdGVkIGJ5IFwiLS0tPlwiLlxuIgorIlxuIgorIiAgIFNob3J0Y3V0OiBQcmVzcyB0aGUgb3B0aW9uJ3MgaGlnaGxpZ2h0ZWQgbGV0dGVyIChob3RrZXkpLlxuIgorIiAgICAgICAgICAgICBQcmVzc2luZyBhIGhvdGtleSBtb3JlIHRoYW4gb25jZSB3aWxsIHNlcXVlbmNlXG4iCisiICAgICAgICAgICAgIHRocm91Z2ggYWxsIHZpc2libGUgaXRlbXMgd2hpY2ggdXNlIHRoYXQgaG90a2V5LlxuIgorIlxuIgorIiAgIFlvdSBtYXkgYWxzbyB1c2UgdGhlIDxQQUdFIFVQPiBhbmQgPFBBR0UgRE9XTj4ga2V5cyB0byBzY3JvbGxcbiIKKyIgICB1bnNlZW4gb3B0aW9ucyBpbnRvIHZpZXcuXG4iCisiXG4iCisibyAgVG8gZXhpdCBhIG1lbnUgdXNlIHRoZSBjdXJzb3Iga2V5cyB0byBoaWdobGlnaHQgdGhlIDxFeGl0PiBidXR0b25cbiIKKyIgICBhbmQgcHJlc3MgPEVOVEVSPi5cbiIKKyJcbiIKKyIgICBTaG9ydGN1dDogUHJlc3MgPEVTQz48RVNDPiBvciA8RT4gb3IgPFg+IGlmIHRoZXJlIGlzIG5vIGhvdGtleVxuIgorIiAgICAgICAgICAgICB1c2luZyB0aG9zZSBsZXR0ZXJzLiAgWW91IG1heSBwcmVzcyBhIHNpbmdsZSA8RVNDPiwgYnV0XG4iCisiICAgICAgICAgICAgIHRoZXJlIGlzIGEgZGVsYXllZCByZXNwb25zZSB3aGljaCB5b3UgbWF5IGZpbmQgYW5ub3lpbmcuXG4iCisiXG4iCisiICAgQWxzbywgdGhlIDxUQUI+IGFuZCBjdXJzb3Iga2V5cyB3aWxsIGN5Y2xlIGJldHdlZW4gPFNlbGVjdD4sXG4iCisiICAgPEV4aXQ+IGFuZCA8SGVscD5cbiIKKyJcbiIKKyJvICBUbyBnZXQgaGVscCB3aXRoIGFuIGl0ZW0sIHVzZSB0aGUgY3Vyc29yIGtleXMgdG8gaGlnaGxpZ2h0IDxIZWxwPlxuIgorIiAgIGFuZCBQcmVzcyA8RU5URVI+LlxuIgorIlxuIgorIiAgIFNob3J0Y3V0OiBQcmVzcyA8SD4gb3IgPD8+LlxuIgorIlxuIgorIlxuIgorIlJhZGlvbGlzdHMgIChDaG9pY2UgbGlzdHMpXG4iCisiLS0tLS0tLS0tLS1cbiIKKyJvICBVc2UgdGhlIGN1cnNvciBrZXlzIHRvIHNlbGVjdCB0aGUgb3B0aW9uIHlvdSB3aXNoIHRvIHNldCBhbmQgcHJlc3NcbiIKKyIgICA8Uz4gb3IgdGhlIDxTUEFDRSBCQVI+LlxuIgorIlxuIgorIiAgIFNob3J0Y3V0OiBQcmVzcyB0aGUgZmlyc3QgbGV0dGVyIG9mIHRoZSBvcHRpb24geW91IHdpc2ggdG8gc2V0IHRoZW5cbiIKKyIgICAgICAgICAgICAgcHJlc3MgPFM+IG9yIDxTUEFDRSBCQVI+LlxuIgorIlxuIgorIm8gIFRvIHNlZSBhdmFpbGFibGUgaGVscCBmb3IgdGhlIGl0ZW0sIHVzZSB0aGUgY3Vyc29yIGtleXMgdG8gaGlnaGxpZ2h0XG4iCisiICAgPEhlbHA+IGFuZCBQcmVzcyA8RU5URVI+LlxuIgorIlxuIgorIiAgIFNob3J0Y3V0OiBQcmVzcyA8SD4gb3IgPD8+LlxuIgorIlxuIgorIiAgIEFsc28sIHRoZSA8VEFCPiBhbmQgY3Vyc29yIGtleXMgd2lsbCBjeWNsZSBiZXR3ZWVuIDxTZWxlY3Q+IGFuZFxuIgorIiAgIDxIZWxwPlxuIgorIlxuIgorIlxuIgorIkRhdGEgRW50cnlcbiIKKyItLS0tLS0tLS0tLVxuIgorIm8gIEVudGVyIHRoZSByZXF1ZXN0ZWQgaW5mb3JtYXRpb24gYW5kIHByZXNzIDxFTlRFUj5cbiIKKyIgICBJZiB5b3UgYXJlIGVudGVyaW5nIGhleGFkZWNpbWFsIHZhbHVlcywgaXQgaXMgbm90IG5lY2Vzc2FyeSB0b1xuIgorIiAgIGFkZCB0aGUgJzB4JyBwcmVmaXggdG8gdGhlIGVudHJ5LlxuIgorIlxuIgorIm8gIEZvciBoZWxwLCB1c2UgdGhlIDxUQUI+IG9yIGN1cnNvciBrZXlzIHRvIGhpZ2hsaWdodCB0aGUgaGVscCBvcHRpb25cbiIKKyIgICBhbmQgcHJlc3MgPEVOVEVSPi4gIFlvdSBjYW4gdHJ5IDxUQUI+PEg+IGFzIHdlbGwuXG4iCisiXG4iCisiXG4iCisiVGV4dCBCb3ggICAgKEhlbHAgV2luZG93KVxuIgorIi0tLS0tLS0tXG4iCisibyAgVXNlIHRoZSBjdXJzb3Iga2V5cyB0byBzY3JvbGwgdXAvZG93bi9sZWZ0L3JpZ2h0LiAgVGhlIFZJIGVkaXRvclxuIgorIiAgIGtleXMgaCxqLGssbCBmdW5jdGlvbiBoZXJlIGFzIGRvIDxTUEFDRSBCQVI+IGFuZCA8Qj4gZm9yIHRob3NlXG4iCisiICAgd2hvIGFyZSBmYW1pbGlhciB3aXRoIGxlc3MgYW5kIGx5bnguXG4iCisiXG4iCisibyAgUHJlc3MgPEU+LCA8WD4sIDxFbnRlcj4gb3IgPEVzYz48RXNjPiB0byBleGl0LlxuIgorIlxuIgorIlxuIgorIkFsdGVybmF0ZSBDb25maWd1cmF0aW9uIEZpbGVzXG4iCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyJNZW51Y29uZmlnIHN1cHBvcnRzIHRoZSB1c2Ugb2YgYWx0ZXJuYXRlIGNvbmZpZ3VyYXRpb24gZmlsZXMgZm9yXG4iCisidGhvc2Ugd2hvLCBmb3IgdmFyaW91cyByZWFzb25zLCBmaW5kIGl0IG5lY2Vzc2FyeSB0byBzd2l0Y2hcbiIKKyJiZXR3ZWVuIGRpZmZlcmVudCBjb25maWd1cmF0aW9ucy5cbiIKKyJcbiIKKyJBdCB0aGUgZW5kIG9mIHRoZSBtYWluIG1lbnUgeW91IHdpbGwgZmluZCB0d28gb3B0aW9ucy4gIE9uZSBpc1xuIgorImZvciBzYXZpbmcgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiB0byBhIGZpbGUgb2YgeW91ciBjaG9vc2luZy5cbiIKKyJUaGUgb3RoZXIgb3B0aW9uIGlzIGZvciBsb2FkaW5nIGEgcHJldmlvdXNseSBzYXZlZCBhbHRlcm5hdGVcbiIKKyJjb25maWd1cmF0aW9uLlxuIgorIlxuIgorIkV2ZW4gaWYgeW91IGRvbid0IHVzZSBhbHRlcm5hdGUgY29uZmlndXJhdGlvbiBmaWxlcywgYnV0IHlvdVxuIgorImZpbmQgZHVyaW5nIGEgTWVudWNvbmZpZyBzZXNzaW9uIHRoYXQgeW91IGhhdmUgY29tcGxldGVseSBtZXNzZWRcbiIKKyJ1cCB5b3VyIHNldHRpbmdzLCB5b3UgbWF5IHVzZSB0aGUgXCJMb2FkIEFsdGVybmF0ZS4uLlwiIG9wdGlvbiB0b1xuIgorInJlc3RvcmUgeW91ciBwcmV2aW91c2x5IHNhdmVkIHNldHRpbmdzIGZyb20gXCIuY29uZmlnXCIgd2l0aG91dFxuIgorInJlc3RhcnRpbmcgTWVudWNvbmZpZy5cbiIKKyJcbiIKKyJPdGhlciBpbmZvcm1hdGlvblxuIgorIi0tLS0tLS0tLS0tLS0tLS0tXG4iCisiSWYgeW91IHVzZSBNZW51Y29uZmlnIGluIGFuIFhURVJNIHdpbmRvdyBtYWtlIHN1cmUgeW91IGhhdmUgeW91clxuIgorIiRURVJNIHZhcmlhYmxlIHNldCB0byBwb2ludCB0byBhIHh0ZXJtIGRlZmluaXRpb24gd2hpY2ggc3VwcG9ydHMgY29sb3IuXG4iCisiT3RoZXJ3aXNlLCBNZW51Y29uZmlnIHdpbGwgbG9vayByYXRoZXIgYmFkLiAgTWVudWNvbmZpZyB3aWxsIG5vdFxuIgorImRpc3BsYXkgY29ycmVjdGx5IGluIGEgUlhWVCB3aW5kb3cgYmVjYXVzZSByeHZ0IGRpc3BsYXlzIG9ubHkgb25lXG4iCisiaW50ZW5zaXR5IG9mIGNvbG9yLCBicmlnaHQuXG4iCisiXG4iCisiTWVudWNvbmZpZyB3aWxsIGRpc3BsYXkgbGFyZ2VyIG1lbnVzIG9uIHNjcmVlbnMgb3IgeHRlcm1zIHdoaWNoIGFyZVxuIgorInNldCB0byBkaXNwbGF5IG1vcmUgdGhhbiB0aGUgc3RhbmRhcmQgMjUgcm93IGJ5IDgwIGNvbHVtbiBnZW9tZXRyeS5cbiIKKyJJbiBvcmRlciBmb3IgdGhpcyB0byB3b3JrLCB0aGUgXCJzdHR5IHNpemVcIiBjb21tYW5kIG11c3QgYmUgYWJsZSB0b1xuIgorImRpc3BsYXkgdGhlIHNjcmVlbidzIGN1cnJlbnQgcm93IGFuZCBjb2x1bW4gZ2VvbWV0cnkuICBJIFNUUk9OR0xZXG4iCisiUkVDT01NRU5EIHRoYXQgeW91IG1ha2Ugc3VyZSB5b3UgZG8gTk9UIGhhdmUgdGhlIHNoZWxsIHZhcmlhYmxlc1xuIgorIkxJTkVTIGFuZCBDT0xVTU5TIGV4cG9ydGVkIGludG8geW91ciBlbnZpcm9ubWVudC4gIFNvbWUgZGlzdHJpYnV0aW9uc1xuIgorImV4cG9ydCB0aG9zZSB2YXJpYWJsZXMgdmlhIC9ldGMvcHJvZmlsZS4gIFNvbWUgbmN1cnNlcyBwcm9ncmFtcyBjYW5cbiIKKyJiZWNvbWUgY29uZnVzZWQgd2hlbiB0aG9zZSB2YXJpYWJsZXMgKExJTkVTICYgQ09MVU1OUykgZG9uJ3QgcmVmbGVjdFxuIgorInRoZSB0cnVlIHNjcmVlbiBzaXplLlxuIgorIlxuIgorIk9wdGlvbmFsIHBlcnNvbmFsaXR5IGF2YWlsYWJsZVxuIgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorIklmIHlvdSBwcmVmZXIgdG8gaGF2ZSBhbGwgb2YgdGhlIG9wdGlvbnMgbGlzdGVkIGluIGEgc2luZ2xlXG4iCisibWVudSwgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQgbXVsdGltZW51IGhpZXJhcmNoeSwgcnVuIHRoZSBtZW51Y29uZmlnXG4iCisid2l0aCBNRU5VQ09ORklHX01PREUgZW52aXJvbm1lbnQgdmFyaWFibGUgc2V0IHRvIHNpbmdsZV9tZW51LiBFeGFtcGxlOlxuIgorIlxuIgorIm1ha2UgTUVOVUNPTkZJR19NT0RFPXNpbmdsZV9tZW51IG1lbnVjb25maWdcbiIKKyJcbiIKKyI8RW50ZXI+IHdpbGwgdGhlbiB1bnJvbGwgdGhlIGFwcHJvcHJpYXRlIGNhdGVnb3J5LCBvciBlbmZvbGQgaXQgaWYgaXRcbiIKKyJpcyBhbHJlYWR5IHVucm9sbGVkLlxuIgorIlxuIgorIk5vdGUgdGhhdCB0aGlzIG1vZGUgY2FuIGV2ZW50dWFsbHkgYmUgYSBsaXR0bGUgbW9yZSBDUFUgZXhwZW5zaXZlXG4iCisiKGVzcGVjaWFsbHkgd2l0aCBhIGxhcmdlciBudW1iZXIgb2YgdW5yb2xsZWQgY2F0ZWdvcmllcykgdGhhbiB0aGVcbiIKKyJkZWZhdWx0IG1vZGUuXG4iKSwKK21lbnVfaW5zdHJ1Y3Rpb25zW10gPSBOXygKKwkiQXJyb3cga2V5cyBuYXZpZ2F0ZSB0aGUgbWVudS4gICIKKwkiPEVudGVyPiBzZWxlY3RzIHN1Ym1lbnVzIC0tLT4uICAiCisJIkhpZ2hsaWdodGVkIGxldHRlcnMgYXJlIGhvdGtleXMuICAiCisJIlByZXNzaW5nIDxZPiBpbmNsdWRlcywgPE4+IGV4Y2x1ZGVzLCA8TT4gbW9kdWxhcml6ZXMgZmVhdHVyZXMuICAiCisJIlByZXNzIDxFc2M+PEVzYz4gdG8gZXhpdCwgPD8+IGZvciBIZWxwLCA8Lz4gZm9yIFNlYXJjaC4gICIKKwkiTGVnZW5kOiBbKl0gYnVpbHQtaW4gIFsgXSBleGNsdWRlZCAgPE0+IG1vZHVsZSAgPCA+IG1vZHVsZSBjYXBhYmxlIiksCityYWRpb2xpc3RfaW5zdHJ1Y3Rpb25zW10gPSBOXygKKwkiVXNlIHRoZSBhcnJvdyBrZXlzIHRvIG5hdmlnYXRlIHRoaXMgd2luZG93IG9yICIKKwkicHJlc3MgdGhlIGhvdGtleSBvZiB0aGUgaXRlbSB5b3Ugd2lzaCB0byBzZWxlY3QgIgorCSJmb2xsb3dlZCBieSB0aGUgPFNQQUNFIEJBUj4uICIKKwkiUHJlc3MgPD8+IGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoaXMgb3B0aW9uLiIpLAoraW5wdXRib3hfaW5zdHJ1Y3Rpb25zX2ludFtdID0gTl8oCisJIlBsZWFzZSBlbnRlciBhIGRlY2ltYWwgdmFsdWUuICIKKwkiRnJhY3Rpb25zIHdpbGwgbm90IGJlIGFjY2VwdGVkLiAgIgorCSJVc2UgdGhlIDxUQUI+IGtleSB0byBtb3ZlIGZyb20gdGhlIGlucHV0IGZpZWxkIHRvIHRoZSBidXR0b25zIGJlbG93IGl0LiIpLAoraW5wdXRib3hfaW5zdHJ1Y3Rpb25zX2hleFtdID0gTl8oCisJIlBsZWFzZSBlbnRlciBhIGhleGFkZWNpbWFsIHZhbHVlLiAiCisJIlVzZSB0aGUgPFRBQj4ga2V5IHRvIG1vdmUgZnJvbSB0aGUgaW5wdXQgZmllbGQgdG8gdGhlIGJ1dHRvbnMgYmVsb3cgaXQuIiksCitpbnB1dGJveF9pbnN0cnVjdGlvbnNfc3RyaW5nW10gPSBOXygKKwkiUGxlYXNlIGVudGVyIGEgc3RyaW5nIHZhbHVlLiAiCisJIlVzZSB0aGUgPFRBQj4ga2V5IHRvIG1vdmUgZnJvbSB0aGUgaW5wdXQgZmllbGQgdG8gdGhlIGJ1dHRvbnMgYmVsb3cgaXQuIiksCitzZXRtb2RfdGV4dFtdID0gTl8oCisJIlRoaXMgZmVhdHVyZSBkZXBlbmRzIG9uIGFub3RoZXIgd2hpY2ggaGFzIGJlZW4gY29uZmlndXJlZCBhcyBhIG1vZHVsZS5cbiIKKwkiQXMgYSByZXN1bHQsIHRoaXMgZmVhdHVyZSB3aWxsIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiIpLAorbm9oZWxwX3RleHRbXSA9IE5fKAorCSJUaGVyZSBpcyBubyBoZWxwIGF2YWlsYWJsZSBmb3IgdGhpcyBvcHRpb24uXG4iKSwKK2xvYWRfY29uZmlnX3RleHRbXSA9IE5fKAorCSJFbnRlciB0aGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHlvdSB3aXNoIHRvIGxvYWQuICAiCisJIkFjY2VwdCB0aGUgbmFtZSBzaG93biB0byByZXN0b3JlIHRoZSBjb25maWd1cmF0aW9uIHlvdSAiCisJImxhc3QgcmV0cmlldmVkLiAgTGVhdmUgYmxhbmsgdG8gYWJvcnQuIiksCitsb2FkX2NvbmZpZ19oZWxwW10gPSBOXygKKwkiXG4iCisJIkZvciB2YXJpb3VzIHJlYXNvbnMsIG9uZSBtYXkgd2lzaCB0byBrZWVwIHNldmVyYWwgZGlmZmVyZW50XG4iCisJImNvbmZpZ3VyYXRpb25zIGF2YWlsYWJsZSBvbiBhIHNpbmdsZSBtYWNoaW5lLlxuIgorCSJcbiIKKwkiSWYgeW91IGhhdmUgc2F2ZWQgYSBwcmV2aW91cyBjb25maWd1cmF0aW9uIGluIGEgZmlsZSBvdGhlciB0aGFuXG4iCisJImRlZmF1bHQsIGVudGVyaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGhlcmUgd2lsbCBhbGxvdyB5b3VcbiIKKwkidG8gbW9kaWZ5IHRoYXQgY29uZmlndXJhdGlvbi5cbiIKKwkiXG4iCisJIklmIHlvdSBhcmUgdW5jZXJ0YWluLCB0aGVuIHlvdSBoYXZlIHByb2JhYmx5IG5ldmVyIHVzZWQgYWx0ZXJuYXRlXG4iCisJImNvbmZpZ3VyYXRpb24gZmlsZXMuICBZb3Ugc2hvdWxkIHRoZXJlZm9yIGxlYXZlIHRoaXMgYmxhbmsgdG8gYWJvcnQuXG4iKSwKK3NhdmVfY29uZmlnX3RleHRbXSA9IE5fKAorCSJFbnRlciBhIGZpbGVuYW1lIHRvIHdoaWNoIHRoaXMgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgc2F2ZWQgIgorCSJhcyBhbiBhbHRlcm5hdGUuICBMZWF2ZSBibGFuayB0byBhYm9ydC4iKSwKK3NhdmVfY29uZmlnX2hlbHBbXSA9IE5fKAorCSJcbiIKKwkiRm9yIHZhcmlvdXMgcmVhc29ucywgb25lIG1heSB3aXNoIHRvIGtlZXAgZGlmZmVyZW50XG4iCisJImNvbmZpZ3VyYXRpb25zIGF2YWlsYWJsZSBvbiBhIHNpbmdsZSBtYWNoaW5lLlxuIgorCSJcbiIKKwkiRW50ZXJpbmcgYSBmaWxlIG5hbWUgaGVyZSB3aWxsIGFsbG93IHlvdSB0byBsYXRlciByZXRyaWV2ZSwgbW9kaWZ5XG4iCisJImFuZCB1c2UgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBhcyBhbiBhbHRlcm5hdGUgdG8gd2hhdGV2ZXJcbiIKKwkiY29uZmlndXJhdGlvbiBvcHRpb25zIHlvdSBoYXZlIHNlbGVjdGVkIGF0IHRoYXQgdGltZS5cbiIKKwkiXG4iCisJIklmIHlvdSBhcmUgdW5jZXJ0YWluIHdoYXQgYWxsIHRoaXMgbWVhbnMgdGhlbiB5b3Ugc2hvdWxkIHByb2JhYmx5XG4iCisJImxlYXZlIHRoaXMgYmxhbmsuXG4iKSwKK3NlYXJjaF9oZWxwW10gPSBOXygKKwkiXG4iCisJIlNlYXJjaCBmb3IgQ09ORklHXyBzeW1ib2xzIGFuZCBkaXNwbGF5IHRoZWlyIHJlbGF0aW9ucy5cbiIKKwkiUmVndWxhciBleHByZXNzaW9ucyBhcmUgYWxsb3dlZC5cbiIKKwkiRXhhbXBsZTogc2VhcmNoIGZvciBcIl5GT09cIlxuIgorCSJSZXN1bHQ6XG4iCisJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisJIlN5bWJvbDogRk9PIFs9bV1cbiIKKwkiUHJvbXB0OiBGb28gYnVzIGlzIHVzZWQgdG8gZHJpdmUgdGhlIGJhciBIV1xuIgorCSJEZWZpbmVkIGF0IGRyaXZlcnMvcGNpL0tjb25maWc6NDdcbiIKKwkiRGVwZW5kcyBvbjogWDg2X0xPQ0FMX0FQSUMgJiYgWDg2X0lPX0FQSUMgfHwgSUE2NFxuIgorCSJMb2NhdGlvbjpcbiIKKwkiICAtPiBCdXMgb3B0aW9ucyAoUENJLCBQQ01DSUEsIEVJU0EsIE1DQSwgSVNBKVxuIgorCSIgICAgLT4gUENJIHN1cHBvcnQgKFBDSSBbPXldKVxuIgorCSIgICAgICAtPiBQQ0kgYWNjZXNzIG1vZGUgKDxjaG9pY2U+IFs9eV0pXG4iCisJIlNlbGVjdHM6IExJQkNSQzMyXG4iCisJIlNlbGVjdGVkIGJ5OiBCQVJcbiIKKwkiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKKwkibyBUaGUgbGluZSAnUHJvbXB0Oicgc2hvd3MgdGhlIHRleHQgdXNlZCBpbiB0aGUgbWVudSBzdHJ1Y3R1cmUgZm9yXG4iCisJIiAgdGhpcyBDT05GSUdfIHN5bWJvbFxuIgorCSJvIFRoZSAnRGVmaW5lZCBhdCcgbGluZSB0ZWxsIGF0IHdoYXQgZmlsZSAvIGxpbmUgbnVtYmVyIHRoZSBzeW1ib2xcbiIKKwkiICBpcyBkZWZpbmVkXG4iCisJIm8gVGhlICdEZXBlbmRzIG9uOicgbGluZSB0ZWxsIHdoYXQgc3ltYm9scyBuZWVkcyB0byBiZSBkZWZpbmVkIGZvclxuIgorCSIgIHRoaXMgc3ltYm9sIHRvIGJlIHZpc2libGUgaW4gdGhlIG1lbnUgKHNlbGVjdGFibGUpXG4iCisJIm8gVGhlICdMb2NhdGlvbjonIGxpbmVzIHRlbGwgd2hlcmUgaW4gdGhlIG1lbnUgc3RydWN0dXJlIHRoaXMgc3ltYm9sXG4iCisJIiAgaXMgbG9jYXRlZFxuIgorCSIgICAgQSBsb2NhdGlvbiBmb2xsb3dlZCBieSBhIFs9eV0gaW5kaWNhdGUgdGhhdCB0aGlzIGlzIGEgc2VsZWN0YWJsZVxuIgorCSIgICAgbWVudSBpdGVtIC0gYW5kIGN1cnJlbnQgdmFsdWUgaXMgZGlzcGxheWVkIGluc2lkZSBicmFja2V0cy5cbiIKKwkibyBUaGUgJ1NlbGVjdHM6JyBsaW5lIHRlbGwgd2hhdCBzeW1ib2wgd2lsbCBiZSBhdXRvbWF0aWNhbGx5XG4iCisJIiAgc2VsZWN0ZWQgaWYgdGhpcyBzeW1ib2wgaXMgc2VsZWN0ZWQgKHkgb3IgbSlcbiIKKwkibyBUaGUgJ1NlbGVjdGVkIGJ5JyBsaW5lIHRlbGwgd2hhdCBzeW1ib2wgaGFzIHNlbGVjdGVkIHRoaXMgc3ltYm9sXG4iCisJIlxuIgorCSJPbmx5IHJlbGV2YW50IGxpbmVzIGFyZSBzaG93bi5cbiIKKwkiXG5cbiIKKwkiU2VhcmNoIGV4YW1wbGVzOlxuIgorCSJFeGFtcGxlczogVVNCCT0+IGZpbmQgYWxsIENPTkZJR18gc3ltYm9scyBjb250YWluaW5nIFVTQlxuIgorCSIgICAgICAgICAgXlVTQiA9PiBmaW5kIGFsbCBDT05GSUdfIHN5bWJvbHMgc3RhcnRpbmcgd2l0aCBVU0JcbiIKKwkiICAgICAgICAgIFVTQiQgPT4gZmluZCBhbGwgQ09ORklHXyBzeW1ib2xzIGVuZGluZyB3aXRoIFVTQlxuIgorCSJcbiIpOworCitzdGF0aWMgY2hhciBidWZbNDA5NioxMF0sICpidWZwdHIgPSBidWY7CitzdGF0aWMgY2hhciBpbnB1dF9idWZbNDA5Nl07CitzdGF0aWMgY29uc3QgY2hhciBmaWxlbmFtZVtdID0gIi5jb25maWciOworc3RhdGljIGNoYXIgKmFyZ3NbMTAyNF0sICoqYXJncHRyID0gYXJnczsKK3N0YXRpYyBpbnQgaW5kZW50Oworc3RhdGljIHN0cnVjdCB0ZXJtaW9zIGlvc19vcmc7CitzdGF0aWMgaW50IHJvd3MgPSAwLCBjb2xzID0gMDsKK3N0YXRpYyBzdHJ1Y3QgbWVudSAqY3VycmVudF9tZW51Oworc3RhdGljIGludCBjaGlsZF9jb3VudDsKK3N0YXRpYyBpbnQgZG9fcmVzaXplOworc3RhdGljIGludCBzaW5nbGVfbWVudV9tb2RlOworCitzdGF0aWMgdm9pZCBjb25mKHN0cnVjdCBtZW51ICptZW51KTsKK3N0YXRpYyB2b2lkIGNvbmZfY2hvaWNlKHN0cnVjdCBtZW51ICptZW51KTsKK3N0YXRpYyB2b2lkIGNvbmZfc3RyaW5nKHN0cnVjdCBtZW51ICptZW51KTsKK3N0YXRpYyB2b2lkIGNvbmZfbG9hZCh2b2lkKTsKK3N0YXRpYyB2b2lkIGNvbmZfc2F2ZSh2b2lkKTsKK3N0YXRpYyB2b2lkIHNob3dfdGV4dGJveChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqdGV4dCwgaW50IHIsIGludCBjKTsKK3N0YXRpYyB2b2lkIHNob3dfaGVscHRleHQoY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnRleHQpOworc3RhdGljIHZvaWQgc2hvd19oZWxwKHN0cnVjdCBtZW51ICptZW51KTsKK3N0YXRpYyB2b2lkIHNob3dfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqdGl0bGUsIGludCByLCBpbnQgYyk7CisKK3N0YXRpYyB2b2lkIGNwcmludF9pbml0KHZvaWQpOworc3RhdGljIGludCBjcHJpbnQxKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK3N0YXRpYyB2b2lkIGNwcmludF9kb25lKHZvaWQpOworc3RhdGljIGludCBjcHJpbnQoY29uc3QgY2hhciAqZm10LCAuLi4pOworCitzdGF0aWMgdm9pZCBpbml0X3dzaXplKHZvaWQpCit7CisJc3RydWN0IHdpbnNpemUgd3M7CisJY2hhciAqZW52OworCisJaWYgKCFpb2N0bChTVERJTl9GSUxFTk8sIFRJT0NHV0lOU1osICZ3cykpIHsKKwkJcm93cyA9IHdzLndzX3JvdzsKKwkJY29scyA9IHdzLndzX2NvbDsKKwl9CisKKwlpZiAoIXJvd3MpIHsKKwkJZW52ID0gZ2V0ZW52KCJMSU5FUyIpOworCQlpZiAoZW52KQorCQkJcm93cyA9IGF0b2koZW52KTsKKwkJaWYgKCFyb3dzKQorCQkJcm93cyA9IDI0OworCX0KKwlpZiAoIWNvbHMpIHsKKwkJZW52ID0gZ2V0ZW52KCJDT0xVTU5TIik7CisJCWlmIChlbnYpCisJCQljb2xzID0gYXRvaShlbnYpOworCQlpZiAoIWNvbHMpCisJCQljb2xzID0gODA7CisJfQorCisJaWYgKHJvd3MgPCAxOSB8fCBjb2xzIDwgODApIHsKKwkJZnByaW50ZihzdGRlcnIsIE5fKCJZb3VyIGRpc3BsYXkgaXMgdG9vIHNtYWxsIHRvIHJ1biBNZW51Y29uZmlnIVxuIikpOworCQlmcHJpbnRmKHN0ZGVyciwgTl8oIkl0IG11c3QgYmUgYXQgbGVhc3QgMTkgbGluZXMgYnkgODAgY29sdW1ucy5cbiIpKTsKKwkJZXhpdCgxKTsKKwl9CisKKwlyb3dzIC09IDQ7CisJY29scyAtPSA1OworfQorCitzdGF0aWMgdm9pZCBjcHJpbnRfaW5pdCh2b2lkKQoreworCWJ1ZnB0ciA9IGJ1ZjsKKwlhcmdwdHIgPSBhcmdzOworCW1lbXNldChhcmdzLCAwLCBzaXplb2YoYXJncykpOworCWluZGVudCA9IDA7CisJY2hpbGRfY291bnQgPSAwOworCWNwcmludCgiLi9zY3JpcHRzL2tjb25maWcvbHhkaWFsb2cvbHhkaWFsb2ciKTsKKwljcHJpbnQoIi0tYmFja3RpdGxlIik7CisJY3ByaW50KG1lbnVfYmFja3RpdGxlKTsKK30KKworc3RhdGljIGludCBjcHJpbnQxKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJaW50IHJlczsKKworCWlmICghKmFyZ3B0cikKKwkJKmFyZ3B0ciA9IGJ1ZnB0cjsKKwl2YV9zdGFydChhcCwgZm10KTsKKwlyZXMgPSB2c3ByaW50ZihidWZwdHIsIGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJYnVmcHRyICs9IHJlczsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIGNwcmludF9kb25lKHZvaWQpCit7CisJKmJ1ZnB0cisrID0gMDsKKwlhcmdwdHIrKzsKK30KKworc3RhdGljIGludCBjcHJpbnQoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwlpbnQgcmVzOworCisJKmFyZ3B0cisrID0gYnVmcHRyOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCXJlcyA9IHZzcHJpbnRmKGJ1ZnB0ciwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlidWZwdHIgKz0gcmVzOworCSpidWZwdHIrKyA9IDA7CisKKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBnZXRfcHJvbXB0X3N0cihzdHJ1Y3QgZ3N0ciAqciwgc3RydWN0IHByb3BlcnR5ICpwcm9wKQoreworCWludCBpLCBqOworCXN0cnVjdCBtZW51ICpzdWJtZW51WzhdLCAqbWVudTsKKworCXN0cl9wcmludGYociwgIlByb21wdDogJXNcbiIsIHByb3AtPnRleHQpOworCXN0cl9wcmludGYociwgIiAgRGVmaW5lZCBhdCAlczolZFxuIiwgcHJvcC0+bWVudS0+ZmlsZS0+bmFtZSwKKwkJcHJvcC0+bWVudS0+bGluZW5vKTsKKwlpZiAoIWV4cHJfaXNfeWVzKHByb3AtPnZpc2libGUuZXhwcikpIHsKKwkJc3RyX2FwcGVuZChyLCAiICBEZXBlbmRzIG9uOiAiKTsKKwkJZXhwcl9nc3RyX3ByaW50KHByb3AtPnZpc2libGUuZXhwciwgcik7CisJCXN0cl9hcHBlbmQociwgIlxuIik7CisJfQorCW1lbnUgPSBwcm9wLT5tZW51LT5wYXJlbnQ7CisJZm9yIChpID0gMDsgbWVudSAhPSAmcm9vdG1lbnUgJiYgaSA8IDg7IG1lbnUgPSBtZW51LT5wYXJlbnQpCisJCXN1Ym1lbnVbaSsrXSA9IG1lbnU7CisJaWYgKGkgPiAwKSB7CisJCXN0cl9wcmludGYociwgIiAgTG9jYXRpb246XG4iKTsKKwkJZm9yIChqID0gNDsgLS1pID49IDA7IGogKz0gMikgeworCQkJbWVudSA9IHN1Ym1lbnVbaV07CisJCQlzdHJfcHJpbnRmKHIsICIlKmMtPiAlcyIsIGosICcgJywgbWVudV9nZXRfcHJvbXB0KG1lbnUpKTsKKwkJCWlmIChtZW51LT5zeW0pIHsKKwkJCQlzdHJfcHJpbnRmKHIsICIgKCVzIFs9JXNdKSIsIG1lbnUtPnN5bS0+bmFtZSA/CisJCQkJCW1lbnUtPnN5bS0+bmFtZSA6ICI8Y2hvaWNlPiIsCisJCQkJCXN5bV9nZXRfc3RyaW5nX3ZhbHVlKG1lbnUtPnN5bSkpOworCQkJfQorCQkJc3RyX2FwcGVuZChyLCAiXG4iKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgZ2V0X3N5bWJvbF9zdHIoc3RydWN0IGdzdHIgKnIsIHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlib29sIGhpdDsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwlzdHJfcHJpbnRmKHIsICJTeW1ib2w6ICVzIFs9JXNdXG4iLCBzeW0tPm5hbWUsCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSkpOworCWZvcl9hbGxfcHJvbXB0cyhzeW0sIHByb3ApCisJCWdldF9wcm9tcHRfc3RyKHIsIHByb3ApOworCWhpdCA9IGZhbHNlOworCWZvcl9hbGxfcHJvcGVydGllcyhzeW0sIHByb3AsIFBfU0VMRUNUKSB7CisJCWlmICghaGl0KSB7CisJCQlzdHJfYXBwZW5kKHIsICIgIFNlbGVjdHM6ICIpOworCQkJaGl0ID0gdHJ1ZTsKKwkJfSBlbHNlCisJCQlzdHJfcHJpbnRmKHIsICIgJiYgIik7CisJCWV4cHJfZ3N0cl9wcmludChwcm9wLT5leHByLCByKTsKKwl9CisJaWYgKGhpdCkKKwkJc3RyX2FwcGVuZChyLCAiXG4iKTsKKwlpZiAoc3ltLT5yZXZfZGVwLmV4cHIpIHsKKwkJc3RyX2FwcGVuZChyLCAiICBTZWxlY3RlZCBieTogIik7CisJCWV4cHJfZ3N0cl9wcmludChzeW0tPnJldl9kZXAuZXhwciwgcik7CisJCXN0cl9hcHBlbmQociwgIlxuIik7CisJfQorCXN0cl9hcHBlbmQociwgIlxuXG4iKTsKK30KKworc3RhdGljIHN0cnVjdCBnc3RyIGdldF9yZWxhdGlvbnNfc3RyKHN0cnVjdCBzeW1ib2wgKipzeW1fYXJyKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgZ3N0ciByZXMgPSBzdHJfbmV3KCk7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBzeW1fYXJyICYmIChzeW0gPSBzeW1fYXJyW2ldKTsgaSsrKQorCQlnZXRfc3ltYm9sX3N0cigmcmVzLCBzeW0pOworCWlmICghaSkKKwkJc3RyX2FwcGVuZCgmcmVzLCAiTm8gbWF0Y2hlcyBmb3VuZC5cbiIpOworCXJldHVybiByZXM7Cit9CisKK3BpZF90IHBpZDsKKworI2lmZGVmIFNJR1dJTkNICitzdGF0aWMgdm9pZCB3aW5jaF9oYW5kbGVyKGludCBzaWcpCit7CisJaWYgKCFkb19yZXNpemUpIHsKKwkJa2lsbChwaWQsIFNJR0lOVCk7CisJCWRvX3Jlc2l6ZSA9IDE7CisJfQorfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgZXhlY19jb25mKHZvaWQpCit7CisJaW50IHBpcGVmZFsyXSwgc3RhdCwgc2l6ZTsKKwlzaWdzZXRfdCBzc2V0LCBvc3NldDsKKworCXNpZ2VtcHR5c2V0KCZzc2V0KTsKKwlzaWdhZGRzZXQoJnNzZXQsIFNJR0lOVCk7CisJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc3NldCwgJm9zc2V0KTsKKworCXNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworCisjaWZkZWYgU0lHV0lOQ0gKKwl7CisJCXN0cnVjdCBzaWdhY3Rpb24gc2E7CisJCXNhLnNhX2hhbmRsZXIgPSB3aW5jaF9oYW5kbGVyOworCQlzaWdlbXB0eXNldCgmc2Euc2FfbWFzayk7CisJCXNhLnNhX2ZsYWdzID0gU0FfUkVTVEFSVDsKKwkJc2lnYWN0aW9uKFNJR1dJTkNILCAmc2EsIE5VTEwpOworCX0KKyNlbmRpZgorCisJKmFyZ3B0cisrID0gTlVMTDsKKworCXBpcGUocGlwZWZkKTsKKwlwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA9PSAwKSB7CisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb3NzZXQsIE5VTEwpOworCQlkdXAyKHBpcGVmZFsxXSwgMik7CisJCWNsb3NlKHBpcGVmZFswXSk7CisJCWNsb3NlKHBpcGVmZFsxXSk7CisJCWV4ZWN2KGFyZ3NbMF0sIGFyZ3MpOworCQlfZXhpdChFWElUX0ZBSUxVUkUpOworCX0KKworCWNsb3NlKHBpcGVmZFsxXSk7CisJYnVmcHRyID0gaW5wdXRfYnVmOworCXdoaWxlICgxKSB7CisJCXNpemUgPSBpbnB1dF9idWYgKyBzaXplb2YoaW5wdXRfYnVmKSAtIGJ1ZnB0cjsKKwkJc2l6ZSA9IHJlYWQocGlwZWZkWzBdLCBidWZwdHIsIHNpemUpOworCQlpZiAoc2l6ZSA8PSAwKSB7CisJCQlpZiAoc2l6ZSA8IDApIHsKKwkJCQlpZiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUFHQUlOKQorCQkJCQljb250aW51ZTsKKwkJCQlwZXJyb3IoInJlYWQiKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCWJ1ZnB0ciArPSBzaXplOworCX0KKwkqYnVmcHRyKysgPSAwOworCWNsb3NlKHBpcGVmZFswXSk7CisJd2FpdHBpZChwaWQsICZzdGF0LCAwKTsKKworCWlmIChkb19yZXNpemUpIHsKKwkJaW5pdF93c2l6ZSgpOworCQlkb19yZXNpemUgPSAwOworCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9zc2V0LCBOVUxMKTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoV0lGU0lHTkFMRUQoc3RhdCkpIHsKKwkJcHJpbnRmKCJcZmludGVycnVwdGVkKCVkKVxuIiwgV1RFUk1TSUcoc3RhdCkpOworCQlleGl0KDEpOworCX0KKyNpZiAwCisJcHJpbnRmKCJcZmV4aXQgc3RhdGU6ICVkXG5leGl0IGRhdGE6ICclcydcbiIsIFdFWElUU1RBVFVTKHN0YXQpLCBpbnB1dF9idWYpOworCXNsZWVwKDEpOworI2VuZGlmCisJc2lncGVuZGluZygmc3NldCk7CisJaWYgKHNpZ2lzbWVtYmVyKCZzc2V0LCBTSUdJTlQpKSB7CisJCXByaW50ZigiXGZpbnRlcnJ1cHRlZFxuIik7CisJCWV4aXQoMSk7CisJfQorCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb3NzZXQsIE5VTEwpOworCisJcmV0dXJuIFdFWElUU1RBVFVTKHN0YXQpOworfQorCitzdGF0aWMgdm9pZCBzZWFyY2hfY29uZih2b2lkKQoreworCXN0cnVjdCBzeW1ib2wgKipzeW1fYXJyOworCWludCBzdGF0OworCXN0cnVjdCBnc3RyIHJlczsKKworYWdhaW46CisJY3ByaW50X2luaXQoKTsKKwljcHJpbnQoIi0tdGl0bGUiKTsKKwljcHJpbnQoXygiU2VhcmNoIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVyIikpOworCWNwcmludCgiLS1pbnB1dGJveCIpOworCWNwcmludChfKCJFbnRlciBDT05GSUdfIChzdWIpc3RyaW5nIHRvIHNlYXJjaCBmb3IgKG9taXQgQ09ORklHXykiKSk7CisJY3ByaW50KCIxMCIpOworCWNwcmludCgiNzUiKTsKKwljcHJpbnQoIiIpOworCXN0YXQgPSBleGVjX2NvbmYoKTsKKwlpZiAoc3RhdCA8IDApCisJCWdvdG8gYWdhaW47CisJc3dpdGNoIChzdGF0KSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIDE6CisJCXNob3dfaGVscHRleHQoXygiU2VhcmNoIENvbmZpZ3VyYXRpb24iKSwgc2VhcmNoX2hlbHApOworCQlnb3RvIGFnYWluOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwlzeW1fYXJyID0gc3ltX3JlX3NlYXJjaChpbnB1dF9idWYpOworCXJlcyA9IGdldF9yZWxhdGlvbnNfc3RyKHN5bV9hcnIpOworCWZyZWUoc3ltX2Fycik7CisJc2hvd190ZXh0Ym94KF8oIlNlYXJjaCBSZXN1bHRzIiksIHN0cl9nZXQoJnJlcyksIDAsIDApOworCXN0cl9mcmVlKCZyZXMpOworfQorCitzdGF0aWMgdm9pZCBidWlsZF9jb25mKHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IG1lbnUgKmNoaWxkOworCWludCB0eXBlLCB0bXAsIGRvaW50ID0gMjsKKwl0cmlzdGF0ZSB2YWw7CisJY2hhciBjaDsKKworCWlmICghbWVudV9pc192aXNpYmxlKG1lbnUpKQorCQlyZXR1cm47CisKKwlzeW0gPSBtZW51LT5zeW07CisJcHJvcCA9IG1lbnUtPnByb21wdDsKKwlpZiAoIXN5bSkgeworCQlpZiAocHJvcCAmJiBtZW51ICE9IGN1cnJlbnRfbWVudSkgeworCQkJY29uc3QgY2hhciAqcHJvbXB0ID0gbWVudV9nZXRfcHJvbXB0KG1lbnUpOworCQkJc3dpdGNoIChwcm9wLT50eXBlKSB7CisJCQljYXNlIFBfTUVOVToKKwkJCQljaGlsZF9jb3VudCsrOworCQkJCWNwcmludCgibSVwIiwgbWVudSk7CisKKwkJCQlpZiAoc2luZ2xlX21lbnVfbW9kZSkgeworCQkJCQljcHJpbnQxKCIlcyUqYyVzIiwKKwkJCQkJCW1lbnUtPmRhdGEgPyAiLS0+IiA6ICIrKz4iLAorCQkJCQkJaW5kZW50ICsgMSwgJyAnLCBwcm9tcHQpOworCQkJCX0gZWxzZQorCQkJCQljcHJpbnQxKCIgICAlKmMlcyAgLS0tPiIsIGluZGVudCArIDEsICcgJywgcHJvbXB0KTsKKworCQkJCWNwcmludF9kb25lKCk7CisJCQkJaWYgKHNpbmdsZV9tZW51X21vZGUgJiYgbWVudS0+ZGF0YSkKKwkJCQkJZ290byBjb25mX2NoaWxkczsKKwkJCQlyZXR1cm47CisJCQlkZWZhdWx0OgorCQkJCWlmIChwcm9tcHQpIHsKKwkJCQkJY2hpbGRfY291bnQrKzsKKwkJCQkJY3ByaW50KCI6JXAiLCBtZW51KTsKKwkJCQkJY3ByaW50KCItLS0lKmMlcyIsIGluZGVudCArIDEsICcgJywgcHJvbXB0KTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZQorCQkJZG9pbnQgPSAwOworCQlnb3RvIGNvbmZfY2hpbGRzOworCX0KKworCXR5cGUgPSBzeW1fZ2V0X3R5cGUoc3ltKTsKKwlpZiAoc3ltX2lzX2Nob2ljZShzeW0pKSB7CisJCXN0cnVjdCBzeW1ib2wgKmRlZl9zeW0gPSBzeW1fZ2V0X2Nob2ljZV92YWx1ZShzeW0pOworCQlzdHJ1Y3QgbWVudSAqZGVmX21lbnUgPSBOVUxMOworCisJCWNoaWxkX2NvdW50Kys7CisJCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworCQkJaWYgKG1lbnVfaXNfdmlzaWJsZShjaGlsZCkgJiYgY2hpbGQtPnN5bSA9PSBkZWZfc3ltKQorCQkJCWRlZl9tZW51ID0gY2hpbGQ7CisJCX0KKworCQl2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJCWlmIChzeW1faXNfY2hhbmdhYmxlKHN5bSkpIHsKKwkJCWNwcmludCgidCVwIiwgbWVudSk7CisJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCWNhc2UgU19CT09MRUFOOgorCQkJCWNwcmludDEoIlslY10iLCB2YWwgPT0gbm8gPyAnICcgOiAnKicpOworCQkJCWJyZWFrOworCQkJY2FzZSBTX1RSSVNUQVRFOgorCQkJCXN3aXRjaCAodmFsKSB7CisJCQkJY2FzZSB5ZXM6IGNoID0gJyonOyBicmVhazsKKwkJCQljYXNlIG1vZDogY2ggPSAnTSc7IGJyZWFrOworCQkJCWRlZmF1bHQ6ICBjaCA9ICcgJzsgYnJlYWs7CisJCQkJfQorCQkJCWNwcmludDEoIjwlYz4iLCBjaCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQljcHJpbnQoIiVjJXAiLCBkZWZfbWVudSA/ICd0JyA6ICc6JywgbWVudSk7CisJCQljcHJpbnQxKCIgICAiKTsKKwkJfQorCisJCWNwcmludDEoIiUqYyVzIiwgaW5kZW50ICsgMSwgJyAnLCBtZW51X2dldF9wcm9tcHQobWVudSkpOworCQlpZiAodmFsID09IHllcykgeworCQkJaWYgKGRlZl9tZW51KSB7CisJCQkJY3ByaW50MSgiICglcykiLCBtZW51X2dldF9wcm9tcHQoZGVmX21lbnUpKTsKKwkJCQljcHJpbnQxKCIgIC0tLT4iKTsKKwkJCQljcHJpbnRfZG9uZSgpOworCQkJCWlmIChkZWZfbWVudS0+bGlzdCkgeworCQkJCQlpbmRlbnQgKz0gMjsKKwkJCQkJYnVpbGRfY29uZihkZWZfbWVudSk7CisJCQkJCWluZGVudCAtPSAyOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWNwcmludF9kb25lKCk7CisJCQlyZXR1cm47CisJCX0KKwkJY3ByaW50X2RvbmUoKTsKKwl9IGVsc2UgeworCQlpZiAobWVudSA9PSBjdXJyZW50X21lbnUpIHsKKwkJCWNwcmludCgiOiVwIiwgbWVudSk7CisJCQljcHJpbnQoIi0tLSUqYyVzIiwgaW5kZW50ICsgMSwgJyAnLCBtZW51X2dldF9wcm9tcHQobWVudSkpOworCQkJZ290byBjb25mX2NoaWxkczsKKwkJfQorCQljaGlsZF9jb3VudCsrOworCQl2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkgJiYgdmFsID09IHllcykgeworCQkJY3ByaW50KCI6JXAiLCBtZW51KTsKKwkJCWNwcmludDEoIiAgICIpOworCQl9IGVsc2UgeworCQkJc3dpdGNoICh0eXBlKSB7CisJCQljYXNlIFNfQk9PTEVBTjoKKwkJCQljcHJpbnQoInQlcCIsIG1lbnUpOworCQkJCWlmIChzeW1faXNfY2hhbmdhYmxlKHN5bSkpCisJCQkJCWNwcmludDEoIlslY10iLCB2YWwgPT0gbm8gPyAnICcgOiAnKicpOworCQkJCWVsc2UKKwkJCQkJY3ByaW50MSgiLS0tIik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNfVFJJU1RBVEU6CisJCQkJY3ByaW50KCJ0JXAiLCBtZW51KTsKKwkJCQlzd2l0Y2ggKHZhbCkgeworCQkJCWNhc2UgeWVzOiBjaCA9ICcqJzsgYnJlYWs7CisJCQkJY2FzZSBtb2Q6IGNoID0gJ00nOyBicmVhazsKKwkJCQlkZWZhdWx0OiAgY2ggPSAnICc7IGJyZWFrOworCQkJCX0KKwkJCQlpZiAoc3ltX2lzX2NoYW5nYWJsZShzeW0pKQorCQkJCQljcHJpbnQxKCI8JWM+IiwgY2gpOworCQkJCWVsc2UKKwkJCQkJY3ByaW50MSgiLS0tIik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWNwcmludCgicyVwIiwgbWVudSk7CisJCQkJdG1wID0gY3ByaW50MSgiKCVzKSIsIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSkpOworCQkJCXRtcCA9IGluZGVudCAtIHRtcCArIDQ7CisJCQkJaWYgKHRtcCA8IDApCisJCQkJCXRtcCA9IDA7CisJCQkJY3ByaW50MSgiJSpjJXMlcyIsIHRtcCwgJyAnLCBtZW51X2dldF9wcm9tcHQobWVudSksCisJCQkJCShzeW1faGFzX3ZhbHVlKHN5bSkgfHwgIXN5bV9pc19jaGFuZ2FibGUoc3ltKSkgPworCQkJCQkiIiA6ICIgKE5FVykiKTsKKwkJCQljcHJpbnRfZG9uZSgpOworCQkJCWdvdG8gY29uZl9jaGlsZHM7CisJCQl9CisJCX0KKwkJY3ByaW50MSgiJSpjJXMlcyIsIGluZGVudCArIDEsICcgJywgbWVudV9nZXRfcHJvbXB0KG1lbnUpLAorCQkJKHN5bV9oYXNfdmFsdWUoc3ltKSB8fCAhc3ltX2lzX2NoYW5nYWJsZShzeW0pKSA/CisJCQkiIiA6ICIgKE5FVykiKTsKKwkJaWYgKG1lbnUtPnByb21wdC0+dHlwZSA9PSBQX01FTlUpIHsKKwkJCWNwcmludDEoIiAgLS0tPiIpOworCQkJY3ByaW50X2RvbmUoKTsKKwkJCXJldHVybjsKKwkJfQorCQljcHJpbnRfZG9uZSgpOworCX0KKworY29uZl9jaGlsZHM6CisJaW5kZW50ICs9IGRvaW50OworCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkKKwkJYnVpbGRfY29uZihjaGlsZCk7CisJaW5kZW50IC09IGRvaW50OworfQorCitzdGF0aWMgdm9pZCBjb25mKHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBtZW51ICpzdWJtZW51OworCWNvbnN0IGNoYXIgKnByb21wdCA9IG1lbnVfZ2V0X3Byb21wdChtZW51KTsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJY2hhciBhY3RpdmVfZW50cnlbNDBdOworCWludCBzdGF0LCB0eXBlLCBpOworCisJdW5saW5rKCJseGRpYWxvZy5zY3JsdG1wIik7CisJYWN0aXZlX2VudHJ5WzBdID0gMDsKKwl3aGlsZSAoMSkgeworCQljcHJpbnRfaW5pdCgpOworCQljcHJpbnQoIi0tdGl0bGUiKTsKKwkJY3ByaW50KCIlcyIsIHByb21wdCA/IHByb21wdCA6IF8oIk1haW4gTWVudSIpKTsKKwkJY3ByaW50KCItLW1lbnUiKTsKKwkJY3ByaW50KF8obWVudV9pbnN0cnVjdGlvbnMpKTsKKwkJY3ByaW50KCIlZCIsIHJvd3MpOworCQljcHJpbnQoIiVkIiwgY29scyk7CisJCWNwcmludCgiJWQiLCByb3dzIC0gMTApOworCQljcHJpbnQoIiVzIiwgYWN0aXZlX2VudHJ5KTsKKwkJY3VycmVudF9tZW51ID0gbWVudTsKKwkJYnVpbGRfY29uZihtZW51KTsKKwkJaWYgKCFjaGlsZF9jb3VudCkKKwkJCWJyZWFrOworCQlpZiAobWVudSA9PSAmcm9vdG1lbnUpIHsKKwkJCWNwcmludCgiOiIpOworCQkJY3ByaW50KCItLS0gIik7CisJCQljcHJpbnQoIkwiKTsKKwkJCWNwcmludChfKCIgICAgTG9hZCBhbiBBbHRlcm5hdGUgQ29uZmlndXJhdGlvbiBGaWxlIikpOworCQkJY3ByaW50KCJTIik7CisJCQljcHJpbnQoXygiICAgIFNhdmUgQ29uZmlndXJhdGlvbiB0byBhbiBBbHRlcm5hdGUgRmlsZSIpKTsKKwkJfQorCQlzdGF0ID0gZXhlY19jb25mKCk7CisJCWlmIChzdGF0IDwgMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzdGF0ID09IDEgfHwgc3RhdCA9PSAyNTUpCisJCQlicmVhazsKKworCQl0eXBlID0gaW5wdXRfYnVmWzBdOworCQlpZiAoIXR5cGUpCisJCQljb250aW51ZTsKKworCQlmb3IgKGkgPSAwOyBpbnB1dF9idWZbaV0gJiYgIWlzc3BhY2UoaW5wdXRfYnVmW2ldKTsgaSsrKQorCQkJOworCQlpZiAoaSA+PSBzaXplb2YoYWN0aXZlX2VudHJ5KSkKKwkJCWkgPSBzaXplb2YoYWN0aXZlX2VudHJ5KSAtIDE7CisJCWlucHV0X2J1ZltpXSA9IDA7CisJCXN0cmNweShhY3RpdmVfZW50cnksIGlucHV0X2J1Zik7CisKKwkJc3ltID0gTlVMTDsKKwkJc3VibWVudSA9IE5VTEw7CisJCWlmIChzc2NhbmYoaW5wdXRfYnVmICsgMSwgIiVwIiwgJnN1Ym1lbnUpID09IDEpCisJCQlzeW0gPSBzdWJtZW51LT5zeW07CisKKwkJc3dpdGNoIChzdGF0KSB7CisJCWNhc2UgMDoKKwkJCXN3aXRjaCAodHlwZSkgeworCQkJY2FzZSAnbSc6CisJCQkJaWYgKHNpbmdsZV9tZW51X21vZGUpCisJCQkJCXN1Ym1lbnUtPmRhdGEgPSAodm9pZCAqKSAobG9uZykgIXN1Ym1lbnUtPmRhdGE7CisJCQkJZWxzZQorCQkJCQljb25mKHN1Ym1lbnUpOworCQkJCWJyZWFrOworCQkJY2FzZSAndCc6CisJCQkJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSAmJiBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkgPT0geWVzKQorCQkJCQljb25mX2Nob2ljZShzdWJtZW51KTsKKwkJCQllbHNlIGlmIChzdWJtZW51LT5wcm9tcHQtPnR5cGUgPT0gUF9NRU5VKQorCQkJCQljb25mKHN1Ym1lbnUpOworCQkJCWJyZWFrOworCQkJY2FzZSAncyc6CisJCQkJY29uZl9zdHJpbmcoc3VibWVudSk7CisJCQkJYnJlYWs7CisJCQljYXNlICdMJzoKKwkJCQljb25mX2xvYWQoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1MnOgorCQkJCWNvbmZfc2F2ZSgpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWlmIChzeW0pCisJCQkJc2hvd19oZWxwKHN1Ym1lbnUpOworCQkJZWxzZQorCQkJCXNob3dfaGVscHRleHQoIlJFQURNRSIsIF8obWNvbmZfcmVhZG1lKSk7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJaWYgKHR5cGUgPT0gJ3QnKSB7CisJCQkJaWYgKHN5bV9zZXRfdHJpc3RhdGVfdmFsdWUoc3ltLCB5ZXMpKQorCQkJCQlicmVhazsKKwkJCQlpZiAoc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIG1vZCkpCisJCQkJCXNob3dfdGV4dGJveChOVUxMLCBzZXRtb2RfdGV4dCwgNiwgNzQpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWlmICh0eXBlID09ICd0JykKKwkJCQlzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbm8pOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCWlmICh0eXBlID09ICd0JykKKwkJCQlzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbW9kKTsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQlpZiAodHlwZSA9PSAndCcpCisJCQkJc3ltX3RvZ2dsZV90cmlzdGF0ZV92YWx1ZShzeW0pOworCQkJZWxzZSBpZiAodHlwZSA9PSAnbScpCisJCQkJY29uZihzdWJtZW51KTsKKwkJCWJyZWFrOworCQljYXNlIDc6CisJCQlzZWFyY2hfY29uZigpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfdGV4dGJveChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqdGV4dCwgaW50IHIsIGludCBjKQoreworCWludCBmZDsKKworCWZkID0gY3JlYXQoIi5oZWxwLnRtcCIsIDA3NzcpOworCXdyaXRlKGZkLCB0ZXh0LCBzdHJsZW4odGV4dCkpOworCWNsb3NlKGZkKTsKKwlzaG93X2ZpbGUoIi5oZWxwLnRtcCIsIHRpdGxlLCByLCBjKTsKKwl1bmxpbmsoIi5oZWxwLnRtcCIpOworfQorCitzdGF0aWMgdm9pZCBzaG93X2hlbHB0ZXh0KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICp0ZXh0KQoreworCXNob3dfdGV4dGJveCh0aXRsZSwgdGV4dCwgMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfaGVscChzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3QgZ3N0ciBoZWxwID0gc3RyX25ldygpOworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKKworCWlmIChzeW0tPmhlbHApCisJeworCQlpZiAoc3ltLT5uYW1lKSB7CisJCQlzdHJfcHJpbnRmKCZoZWxwLCAiQ09ORklHXyVzOlxuXG4iLCBzeW0tPm5hbWUpOworCQkJc3RyX2FwcGVuZCgmaGVscCwgXyhzeW0tPmhlbHApKTsKKwkJCXN0cl9hcHBlbmQoJmhlbHAsICJcbiIpOworCQl9CisJfSBlbHNlIHsKKwkJc3RyX2FwcGVuZCgmaGVscCwgbm9oZWxwX3RleHQpOworCX0KKwlnZXRfc3ltYm9sX3N0cigmaGVscCwgc3ltKTsKKwlzaG93X2hlbHB0ZXh0KG1lbnVfZ2V0X3Byb21wdChtZW51KSwgc3RyX2dldCgmaGVscCkpOworCXN0cl9mcmVlKCZoZWxwKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICp0aXRsZSwgaW50IHIsIGludCBjKQoreworCWRvIHsKKwkJY3ByaW50X2luaXQoKTsKKwkJaWYgKHRpdGxlKSB7CisJCQljcHJpbnQoIi0tdGl0bGUiKTsKKwkJCWNwcmludCgiJXMiLCB0aXRsZSk7CisJCX0KKwkJY3ByaW50KCItLXRleHRib3giKTsKKwkJY3ByaW50KCIlcyIsIGZpbGVuYW1lKTsKKwkJY3ByaW50KCIlZCIsIHIgPyByIDogcm93cyk7CisJCWNwcmludCgiJWQiLCBjID8gYyA6IGNvbHMpOworCX0gd2hpbGUgKGV4ZWNfY29uZigpIDwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZfY2hvaWNlKHN0cnVjdCBtZW51ICptZW51KQoreworCWNvbnN0IGNoYXIgKnByb21wdCA9IG1lbnVfZ2V0X3Byb21wdChtZW51KTsKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisJc3RydWN0IHN5bWJvbCAqYWN0aXZlOworCWludCBzdGF0OworCisJYWN0aXZlID0gc3ltX2dldF9jaG9pY2VfdmFsdWUobWVudS0+c3ltKTsKKwl3aGlsZSAoMSkgeworCQljcHJpbnRfaW5pdCgpOworCQljcHJpbnQoIi0tdGl0bGUiKTsKKwkJY3ByaW50KCIlcyIsIHByb21wdCA/IHByb21wdCA6IF8oIk1haW4gTWVudSIpKTsKKwkJY3ByaW50KCItLXJhZGlvbGlzdCIpOworCQljcHJpbnQoXyhyYWRpb2xpc3RfaW5zdHJ1Y3Rpb25zKSk7CisJCWNwcmludCgiMTUiKTsKKwkJY3ByaW50KCI3MCIpOworCQljcHJpbnQoIjYiKTsKKworCQljdXJyZW50X21lbnUgPSBtZW51OworCQlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKwkJCWlmICghbWVudV9pc192aXNpYmxlKGNoaWxkKSkKKwkJCQljb250aW51ZTsKKwkJCWNwcmludCgiJXAiLCBjaGlsZCk7CisJCQljcHJpbnQoIiVzIiwgbWVudV9nZXRfcHJvbXB0KGNoaWxkKSk7CisJCQlpZiAoY2hpbGQtPnN5bSA9PSBzeW1fZ2V0X2Nob2ljZV92YWx1ZShtZW51LT5zeW0pKQorCQkJCWNwcmludCgiT04iKTsKKwkJCWVsc2UgaWYgKGNoaWxkLT5zeW0gPT0gYWN0aXZlKQorCQkJCWNwcmludCgiU0VMRUNURUQiKTsKKwkJCWVsc2UKKwkJCQljcHJpbnQoIk9GRiIpOworCQl9CisKKwkJc3RhdCA9IGV4ZWNfY29uZigpOworCQlzd2l0Y2ggKHN0YXQpIHsKKwkJY2FzZSAwOgorCQkJaWYgKHNzY2FuZihpbnB1dF9idWYsICIlcCIsICZjaGlsZCkgIT0gMSkKKwkJCQlicmVhazsKKwkJCXN5bV9zZXRfdHJpc3RhdGVfdmFsdWUoY2hpbGQtPnN5bSwgeWVzKTsKKwkJCXJldHVybjsKKwkJY2FzZSAxOgorCQkJaWYgKHNzY2FuZihpbnB1dF9idWYsICIlcCIsICZjaGlsZCkgPT0gMSkgeworCQkJCXNob3dfaGVscChjaGlsZCk7CisJCQkJYWN0aXZlID0gY2hpbGQtPnN5bTsKKwkJCX0gZWxzZQorCQkJCXNob3dfaGVscChtZW51KTsKKwkJCWJyZWFrOworCQljYXNlIDI1NToKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgY29uZl9zdHJpbmcoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJY29uc3QgY2hhciAqcHJvbXB0ID0gbWVudV9nZXRfcHJvbXB0KG1lbnUpOworCWludCBzdGF0OworCisJd2hpbGUgKDEpIHsKKwkJY3ByaW50X2luaXQoKTsKKwkJY3ByaW50KCItLXRpdGxlIik7CisJCWNwcmludCgiJXMiLCBwcm9tcHQgPyBwcm9tcHQgOiBfKCJNYWluIE1lbnUiKSk7CisJCWNwcmludCgiLS1pbnB1dGJveCIpOworCQlzd2l0Y2ggKHN5bV9nZXRfdHlwZShtZW51LT5zeW0pKSB7CisJCWNhc2UgU19JTlQ6CisJCQljcHJpbnQoXyhpbnB1dGJveF9pbnN0cnVjdGlvbnNfaW50KSk7CisJCQlicmVhazsKKwkJY2FzZSBTX0hFWDoKKwkJCWNwcmludChfKGlucHV0Ym94X2luc3RydWN0aW9uc19oZXgpKTsKKwkJCWJyZWFrOworCQljYXNlIFNfU1RSSU5HOgorCQkJY3ByaW50KF8oaW5wdXRib3hfaW5zdHJ1Y3Rpb25zX3N0cmluZykpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBwYW5pYz8gKi87CisJCX0KKwkJY3ByaW50KCIxMCIpOworCQljcHJpbnQoIjc1Iik7CisJCWNwcmludCgiJXMiLCBzeW1fZ2V0X3N0cmluZ192YWx1ZShtZW51LT5zeW0pKTsKKwkJc3RhdCA9IGV4ZWNfY29uZigpOworCQlzd2l0Y2ggKHN0YXQpIHsKKwkJY2FzZSAwOgorCQkJaWYgKHN5bV9zZXRfc3RyaW5nX3ZhbHVlKG1lbnUtPnN5bSwgaW5wdXRfYnVmKSkKKwkJCQlyZXR1cm47CisJCQlzaG93X3RleHRib3goTlVMTCwgXygiWW91IGhhdmUgbWFkZSBhbiBpbnZhbGlkIGVudHJ5LiIpLCA1LCA0Myk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJc2hvd19oZWxwKG1lbnUpOworCQkJYnJlYWs7CisJCWNhc2UgMjU1OgorCQkJcmV0dXJuOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBjb25mX2xvYWQodm9pZCkKK3sKKwlpbnQgc3RhdDsKKworCXdoaWxlICgxKSB7CisJCWNwcmludF9pbml0KCk7CisJCWNwcmludCgiLS1pbnB1dGJveCIpOworCQljcHJpbnQobG9hZF9jb25maWdfdGV4dCk7CisJCWNwcmludCgiMTEiKTsKKwkJY3ByaW50KCI1NSIpOworCQljcHJpbnQoIiVzIiwgZmlsZW5hbWUpOworCQlzdGF0ID0gZXhlY19jb25mKCk7CisJCXN3aXRjaChzdGF0KSB7CisJCWNhc2UgMDoKKwkJCWlmICghaW5wdXRfYnVmWzBdKQorCQkJCXJldHVybjsKKwkJCWlmICghY29uZl9yZWFkKGlucHV0X2J1ZikpCisJCQkJcmV0dXJuOworCQkJc2hvd190ZXh0Ym94KE5VTEwsIF8oIkZpbGUgZG9lcyBub3QgZXhpc3QhIiksIDUsIDM4KTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzaG93X2hlbHB0ZXh0KF8oIkxvYWQgQWx0ZXJuYXRlIENvbmZpZ3VyYXRpb24iKSwgbG9hZF9jb25maWdfaGVscCk7CisJCQlicmVhazsKKwkJY2FzZSAyNTU6CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZfc2F2ZSh2b2lkKQoreworCWludCBzdGF0OworCisJd2hpbGUgKDEpIHsKKwkJY3ByaW50X2luaXQoKTsKKwkJY3ByaW50KCItLWlucHV0Ym94Iik7CisJCWNwcmludChzYXZlX2NvbmZpZ190ZXh0KTsKKwkJY3ByaW50KCIxMSIpOworCQljcHJpbnQoIjU1Iik7CisJCWNwcmludCgiJXMiLCBmaWxlbmFtZSk7CisJCXN0YXQgPSBleGVjX2NvbmYoKTsKKwkJc3dpdGNoKHN0YXQpIHsKKwkJY2FzZSAwOgorCQkJaWYgKCFpbnB1dF9idWZbMF0pCisJCQkJcmV0dXJuOworCQkJaWYgKCFjb25mX3dyaXRlKGlucHV0X2J1ZikpCisJCQkJcmV0dXJuOworCQkJc2hvd190ZXh0Ym94KE5VTEwsIF8oIkNhbid0IGNyZWF0ZSBmaWxlISAgUHJvYmFibHkgYSBub25leGlzdGVudCBkaXJlY3RvcnkuIiksIDUsIDYwKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzaG93X2hlbHB0ZXh0KF8oIlNhdmUgQWx0ZXJuYXRlIENvbmZpZ3VyYXRpb24iKSwgc2F2ZV9jb25maWdfaGVscCk7CisJCQlicmVhazsKKwkJY2FzZSAyNTU6CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZfY2xlYW51cCh2b2lkKQoreworCXRjc2V0YXR0cigxLCBUQ1NBRkxVU0gsICZpb3Nfb3JnKTsKKwl1bmxpbmsoIi5oZWxwLnRtcCIpOworCXVubGluaygibHhkaWFsb2cuc2NybHRtcCIpOworfQorCitpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJY2hhciAqbW9kZTsKKwlpbnQgc3RhdDsKKworCXNldGxvY2FsZShMQ19BTEwsICIiKTsKKwliaW5kdGV4dGRvbWFpbihQQUNLQUdFLCBMT0NBTEVESVIpOworCXRleHRkb21haW4oUEFDS0FHRSk7CisKKwljb25mX3BhcnNlKGF2WzFdKTsKKwljb25mX3JlYWQoTlVMTCk7CisKKwlzeW0gPSBzeW1fbG9va3VwKCJLRVJORUxWRVJTSU9OIiwgMCk7CisJc3ltX2NhbGNfdmFsdWUoc3ltKTsKKwlzcHJpbnRmKG1lbnVfYmFja3RpdGxlLCBfKCJCdXN5Qm94ICVzIENvbmZpZ3VyYXRpb24iKSwKKwkJc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSk7CisKKwltb2RlID0gZ2V0ZW52KCJNRU5VQ09ORklHX01PREUiKTsKKwlpZiAobW9kZSkgeworCQlpZiAoIXN0cmNhc2VjbXAobW9kZSwgInNpbmdsZV9tZW51IikpCisJCQlzaW5nbGVfbWVudV9tb2RlID0gMTsKKwl9CisKKwl0Y2dldGF0dHIoMSwgJmlvc19vcmcpOworCWF0ZXhpdChjb25mX2NsZWFudXApOworCWluaXRfd3NpemUoKTsKKwljb25mKCZyb290bWVudSk7CisKKwlkbyB7CisJCWNwcmludF9pbml0KCk7CisJCWNwcmludCgiLS15ZXNubyIpOworCQljcHJpbnQoXygiRG8geW91IHdpc2ggdG8gc2F2ZSB5b3VyIG5ldyBjb25maWd1cmF0aW9uPyIpKTsKKwkJY3ByaW50KCI1Iik7CisJCWNwcmludCgiNjAiKTsKKwkJc3RhdCA9IGV4ZWNfY29uZigpOworCX0gd2hpbGUgKHN0YXQgPCAwKTsKKworCWlmIChzdGF0ID09IDApIHsKKwkJaWYgKGNvbmZfd3JpdGUoTlVMTCkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCBfKCJcblxuIgorCQkJCSJFcnJvciBkdXJpbmcgd3JpdGluZyBvZiB0aGUgY29uZmlndXJhdGlvbi5cbiIKKwkJCQkiWW91ciBjb25maWd1cmF0aW9uIGNoYW5nZXMgd2VyZSBOT1Qgc2F2ZWQuIgorCQkJCSJcblxuIikpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcHJpbnRmKF8oIlxuXG4iCisJCQkiKioqIEVuZCBvZiBjb25maWd1cmF0aW9uLlxuIgorCQkJIioqKiBFeGVjdXRlICdtYWtlJyB0byBidWlsZCB0aGUgcHJvamVjdCBvciB0cnkgJ21ha2UgaGVscCcuIgorCQkJIlxuXG4iKSk7CisJfSBlbHNlIHsKKwkJZnByaW50ZihzdGRlcnIsIF8oIlxuXG4iCisJCQkiWW91ciBjb25maWd1cmF0aW9uIGNoYW5nZXMgd2VyZSBOT1Qgc2F2ZWQuIgorCQkJIlxuXG4iKSk7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbWVudS5jIGIvc2NyaXB0cy9rY29uZmlnL21lbnUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGNmMmVhCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL21lbnUuYwpAQCAtMCwwICsxLDM5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworc3RydWN0IG1lbnUgcm9vdG1lbnU7CitzdGF0aWMgc3RydWN0IG1lbnUgKipsYXN0X2VudHJ5X3B0cjsKKworc3RydWN0IGZpbGUgKmZpbGVfbGlzdDsKK3N0cnVjdCBmaWxlICpjdXJyZW50X2ZpbGU7CisKK3N0YXRpYyB2b2lkIG1lbnVfd2FybihzdHJ1Y3QgbWVudSAqbWVudSwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwl2YV9zdGFydChhcCwgZm10KTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOndhcm5pbmc6ICIsIG1lbnUtPmZpbGUtPm5hbWUsIG1lbnUtPmxpbmVubyk7CisJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJdmFfZW5kKGFwKTsKK30KKworc3RhdGljIHZvaWQgcHJvcF93YXJuKHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwl2YV9zdGFydChhcCwgZm10KTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOndhcm5pbmc6ICIsIHByb3AtPmZpbGUtPm5hbWUsIHByb3AtPmxpbmVubyk7CisJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJdmFfZW5kKGFwKTsKK30KKwordm9pZCBtZW51X2luaXQodm9pZCkKK3sKKwljdXJyZW50X2VudHJ5ID0gY3VycmVudF9tZW51ID0gJnJvb3RtZW51OworCWxhc3RfZW50cnlfcHRyID0gJnJvb3RtZW51Lmxpc3Q7Cit9CisKK3ZvaWQgbWVudV9hZGRfZW50cnkoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBtZW51ICptZW51OworCisJbWVudSA9IG1hbGxvYyhzaXplb2YoKm1lbnUpKTsKKwltZW1zZXQobWVudSwgMCwgc2l6ZW9mKCptZW51KSk7CisJbWVudS0+c3ltID0gc3ltOworCW1lbnUtPnBhcmVudCA9IGN1cnJlbnRfbWVudTsKKwltZW51LT5maWxlID0gY3VycmVudF9maWxlOworCW1lbnUtPmxpbmVubyA9IHpjb25mX2xpbmVubygpOworCisJKmxhc3RfZW50cnlfcHRyID0gbWVudTsKKwlsYXN0X2VudHJ5X3B0ciA9ICZtZW51LT5uZXh0OworCWN1cnJlbnRfZW50cnkgPSBtZW51OworfQorCit2b2lkIG1lbnVfZW5kX2VudHJ5KHZvaWQpCit7Cit9CisKK3N0cnVjdCBtZW51ICptZW51X2FkZF9tZW51KHZvaWQpCit7CisJbWVudV9lbmRfZW50cnkoKTsKKwlsYXN0X2VudHJ5X3B0ciA9ICZjdXJyZW50X2VudHJ5LT5saXN0OworCXJldHVybiBjdXJyZW50X21lbnUgPSBjdXJyZW50X2VudHJ5OworfQorCit2b2lkIG1lbnVfZW5kX21lbnUodm9pZCkKK3sKKwlsYXN0X2VudHJ5X3B0ciA9ICZjdXJyZW50X21lbnUtPm5leHQ7CisJY3VycmVudF9tZW51ID0gY3VycmVudF9tZW51LT5wYXJlbnQ7Cit9CisKK3N0cnVjdCBleHByICptZW51X2NoZWNrX2RlcChzdHJ1Y3QgZXhwciAqZSkKK3sKKwlpZiAoIWUpCisJCXJldHVybiBlOworCisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX05PVDoKKwkJZS0+bGVmdC5leHByID0gbWVudV9jaGVja19kZXAoZS0+bGVmdC5leHByKTsKKwkJYnJlYWs7CisJY2FzZSBFX09SOgorCWNhc2UgRV9BTkQ6CisJCWUtPmxlZnQuZXhwciA9IG1lbnVfY2hlY2tfZGVwKGUtPmxlZnQuZXhwcik7CisJCWUtPnJpZ2h0LmV4cHIgPSBtZW51X2NoZWNrX2RlcChlLT5yaWdodC5leHByKTsKKwkJYnJlYWs7CisJY2FzZSBFX1NZTUJPTDoKKwkJLyogY2hhbmdlICdtJyBpbnRvICdtJyAmJiBNT0RVTEVTICovCisJCWlmIChlLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX21vZCkKKwkJCXJldHVybiBleHByX2FsbG9jX2FuZChlLCBleHByX2FsbG9jX3N5bWJvbChtb2R1bGVzX3N5bSkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIGU7Cit9CisKK3ZvaWQgbWVudV9hZGRfZGVwKHN0cnVjdCBleHByICpkZXApCit7CisJY3VycmVudF9lbnRyeS0+ZGVwID0gZXhwcl9hbGxvY19hbmQoY3VycmVudF9lbnRyeS0+ZGVwLCBtZW51X2NoZWNrX2RlcChkZXApKTsKK30KKwordm9pZCBtZW51X3NldF90eXBlKGludCB0eXBlKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IGN1cnJlbnRfZW50cnktPnN5bTsKKworCWlmIChzeW0tPnR5cGUgPT0gdHlwZSkKKwkJcmV0dXJuOworCWlmIChzeW0tPnR5cGUgPT0gU19VTktOT1dOKSB7CisJCXN5bS0+dHlwZSA9IHR5cGU7CisJCXJldHVybjsKKwl9CisJbWVudV93YXJuKGN1cnJlbnRfZW50cnksICJ0eXBlIG9mICclcycgcmVkZWZpbmVkIGZyb20gJyVzJyB0byAnJXMnXG4iLAorCSAgICBzeW0tPm5hbWUgPyBzeW0tPm5hbWUgOiAiPGNob2ljZT4iLAorCSAgICBzeW1fdHlwZV9uYW1lKHN5bS0+dHlwZSksIHN5bV90eXBlX25hbWUodHlwZSkpOworfQorCitzdHJ1Y3QgcHJvcGVydHkgKm1lbnVfYWRkX3Byb3AoZW51bSBwcm9wX3R5cGUgdHlwZSwgY2hhciAqcHJvbXB0LCBzdHJ1Y3QgZXhwciAqZXhwciwgc3RydWN0IGV4cHIgKmRlcCkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBwcm9wX2FsbG9jKHR5cGUsIGN1cnJlbnRfZW50cnktPnN5bSk7CisKKwlwcm9wLT5tZW51ID0gY3VycmVudF9lbnRyeTsKKwlwcm9wLT50ZXh0ID0gcHJvbXB0OworCXByb3AtPmV4cHIgPSBleHByOworCXByb3AtPnZpc2libGUuZXhwciA9IG1lbnVfY2hlY2tfZGVwKGRlcCk7CisKKwlpZiAocHJvbXB0KSB7CisJCWlmIChjdXJyZW50X2VudHJ5LT5wcm9tcHQpCisJCQltZW51X3dhcm4oY3VycmVudF9lbnRyeSwgInByb21wdCByZWRlZmluZWRcbiIpOworCQljdXJyZW50X2VudHJ5LT5wcm9tcHQgPSBwcm9wOworCX0KKworCXJldHVybiBwcm9wOworfQorCitzdHJ1Y3QgcHJvcGVydHkgKm1lbnVfYWRkX3Byb21wdChlbnVtIHByb3BfdHlwZSB0eXBlLCBjaGFyICpwcm9tcHQsIHN0cnVjdCBleHByICpkZXApCit7CisJcmV0dXJuIG1lbnVfYWRkX3Byb3AodHlwZSwgcHJvbXB0LCBOVUxMLCBkZXApOworfQorCit2b2lkIG1lbnVfYWRkX2V4cHIoZW51bSBwcm9wX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKmV4cHIsIHN0cnVjdCBleHByICpkZXApCit7CisJbWVudV9hZGRfcHJvcCh0eXBlLCBOVUxMLCBleHByLCBkZXApOworfQorCit2b2lkIG1lbnVfYWRkX3N5bWJvbChlbnVtIHByb3BfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzeW0sIHN0cnVjdCBleHByICpkZXApCit7CisJbWVudV9hZGRfcHJvcCh0eXBlLCBOVUxMLCBleHByX2FsbG9jX3N5bWJvbChzeW0pLCBkZXApOworfQorCitzdGF0aWMgaW50IG1lbnVfcmFuZ2VfdmFsaWRfc3ltKHN0cnVjdCBzeW1ib2wgKnN5bSwgc3RydWN0IHN5bWJvbCAqc3ltMikKK3sKKwlyZXR1cm4gc3ltMi0+dHlwZSA9PSBTX0lOVCB8fCBzeW0yLT50eXBlID09IFNfSEVYIHx8CisJICAgICAgIChzeW0yLT50eXBlID09IFNfVU5LTk9XTiAmJiBzeW1fc3RyaW5nX3ZhbGlkKHN5bSwgc3ltMi0+bmFtZSkpOworfQorCit2b2lkIHN5bV9jaGVja19wcm9wKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IHN5bWJvbCAqc3ltMjsKKwlmb3IgKHByb3AgPSBzeW0tPnByb3A7IHByb3A7IHByb3AgPSBwcm9wLT5uZXh0KSB7CisJCXN3aXRjaCAocHJvcC0+dHlwZSkgeworCQljYXNlIFBfREVGQVVMVDoKKwkJCWlmICgoc3ltLT50eXBlID09IFNfU1RSSU5HIHx8IHN5bS0+dHlwZSA9PSBTX0lOVCB8fCBzeW0tPnR5cGUgPT0gU19IRVgpICYmCisJCQkgICAgcHJvcC0+ZXhwci0+dHlwZSAhPSBFX1NZTUJPTCkKKwkJCQlwcm9wX3dhcm4ocHJvcCwKKwkJCQkgICAgImRlZmF1bHQgZm9yIGNvbmZpZyBzeW1ib2wgJyUnIgorCQkJCSAgICAiIG11c3QgYmUgYSBzaW5nbGUgc3ltYm9sIiwgc3ltLT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIFBfU0VMRUNUOgorCQkJc3ltMiA9IHByb3BfZ2V0X3N5bWJvbChwcm9wKTsKKwkJCWlmIChzeW0tPnR5cGUgIT0gU19CT09MRUFOICYmIHN5bS0+dHlwZSAhPSBTX1RSSVNUQVRFKQorCQkJCXByb3Bfd2Fybihwcm9wLAorCQkJCSAgICAiY29uZmlnIHN5bWJvbCAnJXMnIHVzZXMgc2VsZWN0LCBidXQgaXMgIgorCQkJCSAgICAibm90IGJvb2xlYW4gb3IgdHJpc3RhdGUiLCBzeW0tPm5hbWUpOworCQkJZWxzZSBpZiAoc3ltMi0+dHlwZSA9PSBTX1VOS05PV04pCisJCQkJcHJvcF93YXJuKHByb3AsCisJCQkJICAgICInc2VsZWN0JyB1c2VkIGJ5IGNvbmZpZyBzeW1ib2wgJyVzJyAiCisJCQkJICAgICJyZWZlciB0byB1bmRlZmluZWQgc3ltYm9sICclcyciLAorCQkJCSAgICBzeW0tPm5hbWUsIHN5bTItPm5hbWUpOworCQkJZWxzZSBpZiAoc3ltMi0+dHlwZSAhPSBTX0JPT0xFQU4gJiYgc3ltMi0+dHlwZSAhPSBTX1RSSVNUQVRFKQorCQkJCXByb3Bfd2Fybihwcm9wLAorCQkJCSAgICAiJyVzJyBoYXMgd3JvbmcgdHlwZS4gJ3NlbGVjdCcgb25seSAiCisJCQkJICAgICJhY2NlcHQgYXJndW1lbnRzIG9mIGJvb2xlYW4gYW5kICIKKwkJCQkgICAgInRyaXN0YXRlIHR5cGUiLCBzeW0yLT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIFBfUkFOR0U6CisJCQlpZiAoc3ltLT50eXBlICE9IFNfSU5UICYmIHN5bS0+dHlwZSAhPSBTX0hFWCkKKwkJCQlwcm9wX3dhcm4ocHJvcCwgInJhbmdlIGlzIG9ubHkgYWxsb3dlZCAiCisJCQkJICAgICAgICAgICAgICAgICJmb3IgaW50IG9yIGhleCBzeW1ib2xzIik7CisJCQlpZiAoIW1lbnVfcmFuZ2VfdmFsaWRfc3ltKHN5bSwgcHJvcC0+ZXhwci0+bGVmdC5zeW0pIHx8CisJCQkgICAgIW1lbnVfcmFuZ2VfdmFsaWRfc3ltKHN5bSwgcHJvcC0+ZXhwci0+cmlnaHQuc3ltKSkKKwkJCQlwcm9wX3dhcm4ocHJvcCwgInJhbmdlIGlzIGludmFsaWQiKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJOworCQl9CisJfQorfQorCit2b2lkIG1lbnVfZmluYWxpemUoc3RydWN0IG1lbnUgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgbWVudSAqbWVudSwgKmxhc3RfbWVudTsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBleHByICpwYXJlbnRkZXAsICpiYXNlZGVwLCAqZGVwLCAqZGVwMiwgKiplcDsKKworCXN5bSA9IHBhcmVudC0+c3ltOworCWlmIChwYXJlbnQtPmxpc3QpIHsKKwkJaWYgKHN5bSAmJiBzeW1faXNfY2hvaWNlKHN5bSkpIHsKKwkJCS8qIGZpbmQgdGhlIGZpcnN0IGNob2ljZSB2YWx1ZSBhbmQgZmluZCBvdXQgY2hvaWNlIHR5cGUgKi8KKwkJCWZvciAobWVudSA9IHBhcmVudC0+bGlzdDsgbWVudTsgbWVudSA9IG1lbnUtPm5leHQpIHsKKwkJCQlpZiAobWVudS0+c3ltKSB7CisJCQkJCWN1cnJlbnRfZW50cnkgPSBwYXJlbnQ7CisJCQkJCW1lbnVfc2V0X3R5cGUobWVudS0+c3ltLT50eXBlKTsKKwkJCQkJY3VycmVudF9lbnRyeSA9IG1lbnU7CisJCQkJCW1lbnVfc2V0X3R5cGUoc3ltLT50eXBlKTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJcGFyZW50ZGVwID0gZXhwcl9hbGxvY19zeW1ib2woc3ltKTsKKwkJfSBlbHNlIGlmIChwYXJlbnQtPnByb21wdCkKKwkJCXBhcmVudGRlcCA9IHBhcmVudC0+cHJvbXB0LT52aXNpYmxlLmV4cHI7CisJCWVsc2UKKwkJCXBhcmVudGRlcCA9IHBhcmVudC0+ZGVwOworCisJCWZvciAobWVudSA9IHBhcmVudC0+bGlzdDsgbWVudTsgbWVudSA9IG1lbnUtPm5leHQpIHsKKwkJCWJhc2VkZXAgPSBleHByX3RyYW5zZm9ybShtZW51LT5kZXApOworCQkJYmFzZWRlcCA9IGV4cHJfYWxsb2NfYW5kKGV4cHJfY29weShwYXJlbnRkZXApLCBiYXNlZGVwKTsKKwkJCWJhc2VkZXAgPSBleHByX2VsaW1pbmF0ZV9kdXBzKGJhc2VkZXApOworCQkJbWVudS0+ZGVwID0gYmFzZWRlcDsKKwkJCWlmIChtZW51LT5zeW0pCisJCQkJcHJvcCA9IG1lbnUtPnN5bS0+cHJvcDsKKwkJCWVsc2UKKwkJCQlwcm9wID0gbWVudS0+cHJvbXB0OworCQkJZm9yICg7IHByb3A7IHByb3AgPSBwcm9wLT5uZXh0KSB7CisJCQkJaWYgKHByb3AtPm1lbnUgIT0gbWVudSkKKwkJCQkJY29udGludWU7CisJCQkJZGVwID0gZXhwcl90cmFuc2Zvcm0ocHJvcC0+dmlzaWJsZS5leHByKTsKKwkJCQlkZXAgPSBleHByX2FsbG9jX2FuZChleHByX2NvcHkoYmFzZWRlcCksIGRlcCk7CisJCQkJZGVwID0gZXhwcl9lbGltaW5hdGVfZHVwcyhkZXApOworCQkJCWlmIChtZW51LT5zeW0gJiYgbWVudS0+c3ltLT50eXBlICE9IFNfVFJJU1RBVEUpCisJCQkJCWRlcCA9IGV4cHJfdHJhbnNfYm9vbChkZXApOworCQkJCXByb3AtPnZpc2libGUuZXhwciA9IGRlcDsKKwkJCQlpZiAocHJvcC0+dHlwZSA9PSBQX1NFTEVDVCkgeworCQkJCQlzdHJ1Y3Qgc3ltYm9sICplcyA9IHByb3BfZ2V0X3N5bWJvbChwcm9wKTsKKwkJCQkJZXMtPnJldl9kZXAuZXhwciA9IGV4cHJfYWxsb2Nfb3IoZXMtPnJldl9kZXAuZXhwciwKKwkJCQkJCQlleHByX2FsbG9jX2FuZChleHByX2FsbG9jX3N5bWJvbChtZW51LT5zeW0pLCBleHByX2NvcHkoZGVwKSkpOworCQkJCX0KKwkJCX0KKwkJfQorCQlmb3IgKG1lbnUgPSBwYXJlbnQtPmxpc3Q7IG1lbnU7IG1lbnUgPSBtZW51LT5uZXh0KQorCQkJbWVudV9maW5hbGl6ZShtZW51KTsKKwl9IGVsc2UgaWYgKHN5bSkgeworCQliYXNlZGVwID0gcGFyZW50LT5wcm9tcHQgPyBwYXJlbnQtPnByb21wdC0+dmlzaWJsZS5leHByIDogTlVMTDsKKwkJYmFzZWRlcCA9IGV4cHJfdHJhbnNfY29tcGFyZShiYXNlZGVwLCBFX1VORVFVQUwsICZzeW1ib2xfbm8pOworCQliYXNlZGVwID0gZXhwcl9lbGltaW5hdGVfZHVwcyhleHByX3RyYW5zZm9ybShiYXNlZGVwKSk7CisJCWxhc3RfbWVudSA9IE5VTEw7CisJCWZvciAobWVudSA9IHBhcmVudC0+bmV4dDsgbWVudTsgbWVudSA9IG1lbnUtPm5leHQpIHsKKwkJCWRlcCA9IG1lbnUtPnByb21wdCA/IG1lbnUtPnByb21wdC0+dmlzaWJsZS5leHByIDogbWVudS0+ZGVwOworCQkJaWYgKCFleHByX2NvbnRhaW5zX3N5bWJvbChkZXAsIHN5bSkpCisJCQkJYnJlYWs7CisJCQlpZiAoZXhwcl9kZXBlbmRzX3N5bWJvbChkZXAsIHN5bSkpCisJCQkJZ290byBuZXh0OworCQkJZGVwID0gZXhwcl90cmFuc19jb21wYXJlKGRlcCwgRV9VTkVRVUFMLCAmc3ltYm9sX25vKTsKKwkJCWRlcCA9IGV4cHJfZWxpbWluYXRlX2R1cHMoZXhwcl90cmFuc2Zvcm0oZGVwKSk7CisJCQlkZXAyID0gZXhwcl9jb3B5KGJhc2VkZXApOworCQkJZXhwcl9lbGltaW5hdGVfZXEoJmRlcCwgJmRlcDIpOworCQkJZXhwcl9mcmVlKGRlcCk7CisJCQlpZiAoIWV4cHJfaXNfeWVzKGRlcDIpKSB7CisJCQkJZXhwcl9mcmVlKGRlcDIpOworCQkJCWJyZWFrOworCQkJfQorCQkJZXhwcl9mcmVlKGRlcDIpOworCQluZXh0OgorCQkJbWVudV9maW5hbGl6ZShtZW51KTsKKwkJCW1lbnUtPnBhcmVudCA9IHBhcmVudDsKKwkJCWxhc3RfbWVudSA9IG1lbnU7CisJCX0KKwkJaWYgKGxhc3RfbWVudSkgeworCQkJcGFyZW50LT5saXN0ID0gcGFyZW50LT5uZXh0OworCQkJcGFyZW50LT5uZXh0ID0gbGFzdF9tZW51LT5uZXh0OworCQkJbGFzdF9tZW51LT5uZXh0ID0gTlVMTDsKKwkJfQorCX0KKwlmb3IgKG1lbnUgPSBwYXJlbnQtPmxpc3Q7IG1lbnU7IG1lbnUgPSBtZW51LT5uZXh0KSB7CisJCWlmIChzeW0gJiYgc3ltX2lzX2Nob2ljZShzeW0pICYmIG1lbnUtPnN5bSkgeworCQkJbWVudS0+c3ltLT5mbGFncyB8PSBTWU1CT0xfQ0hPSUNFVkFMOworCQkJaWYgKCFtZW51LT5wcm9tcHQpCisJCQkJbWVudV93YXJuKG1lbnUsICJjaG9pY2UgdmFsdWUgbXVzdCBoYXZlIGEgcHJvbXB0Iik7CisJCQlmb3IgKHByb3AgPSBtZW51LT5zeW0tPnByb3A7IHByb3A7IHByb3AgPSBwcm9wLT5uZXh0KSB7CisJCQkJaWYgKHByb3AtPnR5cGUgPT0gUF9QUk9NUFQgJiYgcHJvcC0+bWVudSAhPSBtZW51KSB7CisJCQkJCXByb3Bfd2Fybihwcm9wLCAiY2hvaWNlIHZhbHVlcyAiCisJCQkJCSAgICAiY3VycmVudGx5IG9ubHkgc3VwcG9ydCBhICIKKwkJCQkJICAgICJzaW5nbGUgcHJvbXB0Iik7CisJCQkJfQorCQkJCWlmIChwcm9wLT50eXBlID09IFBfREVGQVVMVCkKKwkJCQkJcHJvcF93YXJuKHByb3AsICJkZWZhdWx0cyBmb3IgY2hvaWNlICIKKwkJCQkJICAgICJ2YWx1ZXMgbm90IHN1cHBvcnRlZCIpOworCQkJfQorCQkJY3VycmVudF9lbnRyeSA9IG1lbnU7CisJCQltZW51X3NldF90eXBlKHN5bS0+dHlwZSk7CisJCQltZW51X2FkZF9zeW1ib2woUF9DSE9JQ0UsIHN5bSwgTlVMTCk7CisJCQlwcm9wID0gc3ltX2dldF9jaG9pY2VfcHJvcChzeW0pOworCQkJZm9yIChlcCA9ICZwcm9wLT5leHByOyAqZXA7IGVwID0gJigqZXApLT5sZWZ0LmV4cHIpCisJCQkJOworCQkJKmVwID0gZXhwcl9hbGxvY19vbmUoRV9DSE9JQ0UsIE5VTEwpOworCQkJKCplcCktPnJpZ2h0LnN5bSA9IG1lbnUtPnN5bTsKKwkJfQorCQlpZiAobWVudS0+bGlzdCAmJiAoIW1lbnUtPnByb21wdCB8fCAhbWVudS0+cHJvbXB0LT50ZXh0KSkgeworCQkJZm9yIChsYXN0X21lbnUgPSBtZW51LT5saXN0OyA7IGxhc3RfbWVudSA9IGxhc3RfbWVudS0+bmV4dCkgeworCQkJCWxhc3RfbWVudS0+cGFyZW50ID0gcGFyZW50OworCQkJCWlmICghbGFzdF9tZW51LT5uZXh0KQorCQkJCQlicmVhazsKKwkJCX0KKwkJCWxhc3RfbWVudS0+bmV4dCA9IG1lbnUtPm5leHQ7CisJCQltZW51LT5uZXh0ID0gbWVudS0+bGlzdDsKKwkJCW1lbnUtPmxpc3QgPSBOVUxMOworCQl9CisJfQorCisJaWYgKHN5bSAmJiAhKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfV0FSTkVEKSkgeworCQlpZiAoc3ltLT50eXBlID09IFNfVU5LTk9XTikKKwkJCW1lbnVfd2FybihwYXJlbnQsICJjb25maWcgc3ltYm9sIGRlZmluZWQgIgorCQkJICAgICJ3aXRob3V0IHR5cGVcbiIpOworCisJCWlmIChzeW1faXNfY2hvaWNlKHN5bSkgJiYgIXBhcmVudC0+cHJvbXB0KQorCQkJbWVudV93YXJuKHBhcmVudCwgImNob2ljZSBtdXN0IGhhdmUgYSBwcm9tcHRcbiIpOworCisJCS8qIENoZWNrIHByb3BlcnRpZXMgY29ubmVjdGVkIHRvIHRoaXMgc3ltYm9sICovCisJCXN5bV9jaGVja19wcm9wKHN5bSk7CisJCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX1dBUk5FRDsKKwl9CisKKwlpZiAoc3ltICYmICFzeW1faXNfb3B0aW9uYWwoc3ltKSAmJiBwYXJlbnQtPnByb21wdCkgeworCQlzeW0tPnJldl9kZXAuZXhwciA9IGV4cHJfYWxsb2Nfb3Ioc3ltLT5yZXZfZGVwLmV4cHIsCisJCQkJZXhwcl9hbGxvY19hbmQocGFyZW50LT5wcm9tcHQtPnZpc2libGUuZXhwciwKKwkJCQkJZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9tb2QpKSk7CisJfQorfQorCitib29sIG1lbnVfaXNfdmlzaWJsZShzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXRyaXN0YXRlIHZpc2libGU7CisKKwlpZiAoIW1lbnUtPnByb21wdCkKKwkJcmV0dXJuIGZhbHNlOworCXN5bSA9IG1lbnUtPnN5bTsKKwlpZiAoc3ltKSB7CisJCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CisJCXZpc2libGUgPSBtZW51LT5wcm9tcHQtPnZpc2libGUudHJpOworCX0gZWxzZQorCQl2aXNpYmxlID0gbWVudS0+cHJvbXB0LT52aXNpYmxlLnRyaSA9IGV4cHJfY2FsY192YWx1ZShtZW51LT5wcm9tcHQtPnZpc2libGUuZXhwcik7CisKKwlpZiAodmlzaWJsZSAhPSBubykKKwkJcmV0dXJuIHRydWU7CisJaWYgKCFzeW0gfHwgc3ltX2dldF90cmlzdGF0ZV92YWx1ZShtZW51LT5zeW0pID09IG5vKQorCQlyZXR1cm4gZmFsc2U7CisKKwlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpCisJCWlmIChtZW51X2lzX3Zpc2libGUoY2hpbGQpKQorCQkJcmV0dXJuIHRydWU7CisJcmV0dXJuIGZhbHNlOworfQorCitjb25zdCBjaGFyICptZW51X2dldF9wcm9tcHQoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJaWYgKG1lbnUtPnByb21wdCkKKwkJcmV0dXJuIF8obWVudS0+cHJvbXB0LT50ZXh0KTsKKwllbHNlIGlmIChtZW51LT5zeW0pCisJCXJldHVybiBfKG1lbnUtPnN5bS0+bmFtZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBtZW51ICptZW51X2dldF9yb290X21lbnUoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJcmV0dXJuICZyb290bWVudTsKK30KKworc3RydWN0IG1lbnUgKm1lbnVfZ2V0X3BhcmVudF9tZW51KHN0cnVjdCBtZW51ICptZW51KQoreworCWVudW0gcHJvcF90eXBlIHR5cGU7CisKKwlmb3IgKDsgbWVudSAhPSAmcm9vdG1lbnU7IG1lbnUgPSBtZW51LT5wYXJlbnQpIHsKKwkJdHlwZSA9IG1lbnUtPnByb21wdCA/IG1lbnUtPnByb21wdC0+dHlwZSA6IDA7CisJCWlmICh0eXBlID09IFBfTUVOVSkKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gbWVudTsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9xY29uZi5jYyBiL3NjcmlwdHMva2NvbmZpZy9xY29uZi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTE4OWMxCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmNjCkBAIC0wLDAgKzEsMTQyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxxYXBwbGljYXRpb24uaD4KKyNpbmNsdWRlIDxxbWFpbndpbmRvdy5oPgorI2luY2x1ZGUgPHF0b29sYmFyLmg+CisjaW5jbHVkZSA8cXZib3guaD4KKyNpbmNsdWRlIDxxc3BsaXR0ZXIuaD4KKyNpbmNsdWRlIDxxbGlzdHZpZXcuaD4KKyNpbmNsdWRlIDxxdGV4dHZpZXcuaD4KKyNpbmNsdWRlIDxxbGluZWVkaXQuaD4KKyNpbmNsdWRlIDxxbWVudWJhci5oPgorI2luY2x1ZGUgPHFtZXNzYWdlYm94Lmg+CisjaW5jbHVkZSA8cWFjdGlvbi5oPgorI2luY2x1ZGUgPHFoZWFkZXIuaD4KKyNpbmNsdWRlIDxxZmlsZWRpYWxvZy5oPgorI2luY2x1ZGUgPHFyZWdleHAuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAibGtjLmgiCisjaW5jbHVkZSAicWNvbmYuaCIKKworI2luY2x1ZGUgInFjb25mLm1vYyIKKyNpbmNsdWRlICJpbWFnZXMuYyIKKworI2lmZGVmIF8KKyMgdW5kZWYgXworIyBkZWZpbmUgXyBxZ2V0dGV4dAorI2VuZGlmCisKK3N0YXRpYyBRQXBwbGljYXRpb24gKmNvbmZpZ0FwcDsKKworc3RhdGljIGlubGluZSBRU3RyaW5nIHFnZXR0ZXh0KGNvbnN0IGNoYXIqIHN0cikKK3sKKyAgcmV0dXJuIFFTdHJpbmc6OmZyb21Mb2NhbDhCaXQoZ2V0dGV4dChzdHIpKTsKK30KKworc3RhdGljIGlubGluZSBRU3RyaW5nIHFnZXR0ZXh0KGNvbnN0IFFTdHJpbmcmIHN0cikKK3sKKyAgcmV0dXJuIFFTdHJpbmc6OmZyb21Mb2NhbDhCaXQoZ2V0dGV4dChzdHIubGF0aW4xKCkpKTsKK30KKworQ29uZmlnU2V0dGluZ3M6OkNvbmZpZ1NldHRpbmdzKCkKKwk6IHNob3dBbGwoZmFsc2UpLCBzaG93TmFtZShmYWxzZSksIHNob3dSYW5nZShmYWxzZSksIHNob3dEYXRhKGZhbHNlKQoreworfQorCisjaWYgUVRfVkVSU0lPTiA+PSAzMDAKKy8qKgorICogUmVhZHMgdGhlIGxpc3QgY29sdW1uIHNldHRpbmdzIGZyb20gdGhlIGFwcGxpY2F0aW9uIHNldHRpbmdzLgorICovCit2b2lkIENvbmZpZ1NldHRpbmdzOjpyZWFkTGlzdFNldHRpbmdzKCkKK3sKKwlzaG93QWxsID0gcmVhZEJvb2xFbnRyeSgiL2tjb25maWcvcWNvbmYvc2hvd0FsbCIsIGZhbHNlKTsKKwlzaG93TmFtZSA9IHJlYWRCb29sRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dOYW1lIiwgZmFsc2UpOworCXNob3dSYW5nZSA9IHJlYWRCb29sRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dSYW5nZSIsIGZhbHNlKTsKKwlzaG93RGF0YSA9IHJlYWRCb29sRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dEYXRhIiwgZmFsc2UpOworfQorCisvKioKKyAqIFJlYWRzIGEgbGlzdCBvZiBpbnRlZ2VyIHZhbHVlcyBmcm9tIHRoZSBhcHBsaWNhdGlvbiBzZXR0aW5ncy4KKyAqLworUVZhbHVlTGlzdDxpbnQ+IENvbmZpZ1NldHRpbmdzOjpyZWFkU2l6ZXMoY29uc3QgUVN0cmluZyYga2V5LCBib29sICpvaykKK3sKKwlRVmFsdWVMaXN0PGludD4gcmVzdWx0OworCVFTdHJpbmdMaXN0IGVudHJ5TGlzdCA9IHJlYWRMaXN0RW50cnkoa2V5LCBvayk7CisJaWYgKG9rKSB7CisJCVFTdHJpbmdMaXN0OjpJdGVyYXRvciBpdDsKKwkJZm9yIChpdCA9IGVudHJ5TGlzdC5iZWdpbigpOyBpdCAhPSBlbnRyeUxpc3QuZW5kKCk7ICsraXQpCisJCQlyZXN1bHQucHVzaF9iYWNrKCgqaXQpLnRvSW50KCkpOworCX0KKworCXJldHVybiByZXN1bHQ7Cit9CisKKy8qKgorICogV3JpdGVzIGEgbGlzdCBvZiBpbnRlZ2VyIHZhbHVlcyB0byB0aGUgYXBwbGljYXRpb24gc2V0dGluZ3MuCisgKi8KK2Jvb2wgQ29uZmlnU2V0dGluZ3M6OndyaXRlU2l6ZXMoY29uc3QgUVN0cmluZyYga2V5LCBjb25zdCBRVmFsdWVMaXN0PGludD4mIHZhbHVlKQoreworCVFTdHJpbmdMaXN0IHN0cmluZ0xpc3Q7CisJUVZhbHVlTGlzdDxpbnQ+OjpDb25zdEl0ZXJhdG9yIGl0OworCisJZm9yIChpdCA9IHZhbHVlLmJlZ2luKCk7IGl0ICE9IHZhbHVlLmVuZCgpOyArK2l0KQorCQlzdHJpbmdMaXN0LnB1c2hfYmFjayhRU3RyaW5nOjpudW1iZXIoKml0KSk7CisJcmV0dXJuIHdyaXRlRW50cnkoa2V5LCBzdHJpbmdMaXN0KTsKK30KKyNlbmRpZgorCisKKy8qCisgKiB1cGRhdGUgYWxsIHRoZSBjaGlsZHJlbiBvZiBhIG1lbnUgZW50cnkKKyAqICAgcmVtb3Zlcy9hZGRzIHRoZSBlbnRyaWVzIGZyb20gdGhlIHBhcmVudCB3aWRnZXQgYXMgbmVjZXNzYXJ5CisgKgorICogcGFyZW50OiBlaXRoZXIgdGhlIG1lbnUgbGlzdCB3aWRnZXQgb3IgYSBtZW51IGVudHJ5IHdpZGdldAorICogbWVudTogZW50cnkgdG8gYmUgdXBkYXRlZAorICovCit0ZW1wbGF0ZSA8Y2xhc3MgUD4KK3ZvaWQgQ29uZmlnTGlzdDo6dXBkYXRlTWVudUxpc3QoUCogcGFyZW50LCBzdHJ1Y3QgbWVudSogbWVudSkKK3sKKwlzdHJ1Y3QgbWVudSogY2hpbGQ7CisJQ29uZmlnSXRlbSogaXRlbTsKKwlDb25maWdJdGVtKiBsYXN0OworCWJvb2wgdmlzaWJsZTsKKwllbnVtIHByb3BfdHlwZSB0eXBlOworCisJaWYgKCFtZW51KSB7CisJCXdoaWxlICgoaXRlbSA9IHBhcmVudC0+Zmlyc3RDaGlsZCgpKSkKKwkJCWRlbGV0ZSBpdGVtOworCQlyZXR1cm47CisJfQorCisJbGFzdCA9IHBhcmVudC0+Zmlyc3RDaGlsZCgpOworCWlmIChsYXN0ICYmICFsYXN0LT5nb1BhcmVudCkKKwkJbGFzdCA9IDA7CisJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisJCWl0ZW0gPSBsYXN0ID8gbGFzdC0+bmV4dFNpYmxpbmcoKSA6IHBhcmVudC0+Zmlyc3RDaGlsZCgpOworCQl0eXBlID0gY2hpbGQtPnByb21wdCA/IGNoaWxkLT5wcm9tcHQtPnR5cGUgOiBQX1VOS05PV047CisKKwkJc3dpdGNoIChtb2RlKSB7CisJCWNhc2UgbWVudU1vZGU6CisJCQlpZiAoIShjaGlsZC0+ZmxhZ3MgJiBNRU5VX1JPT1QpKQorCQkJCWdvdG8gaGlkZTsKKwkJCWJyZWFrOworCQljYXNlIHN5bWJvbE1vZGU6CisJCQlpZiAoY2hpbGQtPmZsYWdzICYgTUVOVV9ST09UKQorCQkJCWdvdG8gaGlkZTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKworCQl2aXNpYmxlID0gbWVudV9pc192aXNpYmxlKGNoaWxkKTsKKwkJaWYgKHNob3dBbGwgfHwgdmlzaWJsZSkgeworCQkJaWYgKCFpdGVtIHx8IGl0ZW0tPm1lbnUgIT0gY2hpbGQpCisJCQkJaXRlbSA9IG5ldyBDb25maWdJdGVtKHBhcmVudCwgbGFzdCwgY2hpbGQsIHZpc2libGUpOworCQkJZWxzZQorCQkJCWl0ZW0tPnRlc3RVcGRhdGVNZW51KHZpc2libGUpOworCisJCQlpZiAobW9kZSA9PSBmdWxsTW9kZSB8fCBtb2RlID09IG1lbnVNb2RlIHx8IHR5cGUgIT0gUF9NRU5VKQorCQkJCXVwZGF0ZU1lbnVMaXN0KGl0ZW0sIGNoaWxkKTsKKwkJCWVsc2UKKwkJCQl1cGRhdGVNZW51TGlzdChpdGVtLCAwKTsKKwkJCWxhc3QgPSBpdGVtOworCQkJY29udGludWU7CisJCX0KKwloaWRlOgorCQlpZiAoaXRlbSAmJiBpdGVtLT5tZW51ID09IGNoaWxkKSB7CisJCQlsYXN0ID0gcGFyZW50LT5maXJzdENoaWxkKCk7CisJCQlpZiAobGFzdCA9PSBpdGVtKQorCQkJCWxhc3QgPSAwOworCQkJZWxzZSB3aGlsZSAobGFzdC0+bmV4dFNpYmxpbmcoKSAhPSBpdGVtKQorCQkJCWxhc3QgPSBsYXN0LT5uZXh0U2libGluZygpOworCQkJZGVsZXRlIGl0ZW07CisJCX0KKwl9Cit9CisKKyNpZiBRVF9WRVJTSU9OID49IDMwMAorLyoKKyAqIHNldCB0aGUgbmV3IGRhdGEKKyAqIFRPRE8gY2hlY2sgdGhlIHZhbHVlCisgKi8KK3ZvaWQgQ29uZmlnSXRlbTo6b2tSZW5hbWUoaW50IGNvbCkKK3sKKwlQYXJlbnQ6Om9rUmVuYW1lKGNvbCk7CisJc3ltX3NldF9zdHJpbmdfdmFsdWUobWVudS0+c3ltLCB0ZXh0KGRhdGFDb2xJZHgpLmxhdGluMSgpKTsKK30KKyNlbmRpZgorCisvKgorICogdXBkYXRlIHRoZSBkaXNwbGF5ZWQgb2YgYSBtZW51IGVudHJ5CisgKi8KK3ZvaWQgQ29uZmlnSXRlbTo6dXBkYXRlTWVudSh2b2lkKQoreworCUNvbmZpZ0xpc3QqIGxpc3Q7CisJc3RydWN0IHN5bWJvbCogc3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlRU3RyaW5nIHByb21wdDsKKwlpbnQgdHlwZTsKKwl0cmlzdGF0ZSBleHByOworCisJbGlzdCA9IGxpc3RWaWV3KCk7CisJaWYgKGdvUGFyZW50KSB7CisJCXNldFBpeG1hcChwcm9tcHRDb2xJZHgsIGxpc3QtPm1lbnVCYWNrUGl4KTsKKwkJcHJvbXB0ID0gIi4uIjsKKwkJZ290byBzZXRfcHJvbXB0OworCX0KKworCXN5bSA9IG1lbnUtPnN5bTsKKwlwcm9wID0gbWVudS0+cHJvbXB0OworCXByb21wdCA9IFFTdHJpbmc6OmZyb21Mb2NhbDhCaXQobWVudV9nZXRfcHJvbXB0KG1lbnUpKTsKKworCWlmIChwcm9wKSBzd2l0Y2ggKHByb3AtPnR5cGUpIHsKKwljYXNlIFBfTUVOVToKKwkJaWYgKGxpc3QtPm1vZGUgPT0gc2luZ2xlTW9kZSB8fCBsaXN0LT5tb2RlID09IHN5bWJvbE1vZGUpIHsKKwkJCS8qIGEgbWVudWNvbmZpZyBlbnRyeSBpcyBkaXNwbGF5ZWQgZGlmZmVyZW50bHkKKwkJCSAqIGRlcGVuZGluZyB3aGV0aGVyIGl0J3MgYXQgdGhlIHZpZXcgcm9vdCBvciBhIGNoaWxkLgorCQkJICovCisJCQlpZiAoc3ltICYmIGxpc3QtPnJvb3RFbnRyeSA9PSBtZW51KQorCQkJCWJyZWFrOworCQkJc2V0UGl4bWFwKHByb21wdENvbElkeCwgbGlzdC0+bWVudVBpeCk7CisJCX0gZWxzZSB7CisJCQlpZiAoc3ltKQorCQkJCWJyZWFrOworCQkJc2V0UGl4bWFwKHByb21wdENvbElkeCwgMCk7CisJCX0KKwkJZ290byBzZXRfcHJvbXB0OworCWNhc2UgUF9DT01NRU5UOgorCQlzZXRQaXhtYXAocHJvbXB0Q29sSWR4LCAwKTsKKwkJZ290byBzZXRfcHJvbXB0OworCWRlZmF1bHQ6CisJCTsKKwl9CisJaWYgKCFzeW0pCisJCWdvdG8gc2V0X3Byb21wdDsKKworCXNldFRleHQobmFtZUNvbElkeCwgUVN0cmluZzo6ZnJvbUxvY2FsOEJpdChzeW0tPm5hbWUpKTsKKworCXR5cGUgPSBzeW1fZ2V0X3R5cGUoc3ltKTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCWNoYXIgY2g7CisKKwkJaWYgKCFzeW1faXNfY2hhbmdhYmxlKHN5bSkgJiYgIWxpc3QtPnNob3dBbGwpIHsKKwkJCXNldFBpeG1hcChwcm9tcHRDb2xJZHgsIDApOworCQkJc2V0VGV4dChub0NvbElkeCwgUVN0cmluZzo6bnVsbCk7CisJCQlzZXRUZXh0KG1vZENvbElkeCwgUVN0cmluZzo6bnVsbCk7CisJCQlzZXRUZXh0KHllc0NvbElkeCwgUVN0cmluZzo6bnVsbCk7CisJCQlicmVhazsKKwkJfQorCQlleHByID0gc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pOworCQlzd2l0Y2ggKGV4cHIpIHsKKwkJY2FzZSB5ZXM6CisJCQlpZiAoc3ltX2lzX2Nob2ljZV92YWx1ZShzeW0pICYmIHR5cGUgPT0gU19CT09MRUFOKQorCQkJCXNldFBpeG1hcChwcm9tcHRDb2xJZHgsIGxpc3QtPmNob2ljZVllc1BpeCk7CisJCQllbHNlCisJCQkJc2V0UGl4bWFwKHByb21wdENvbElkeCwgbGlzdC0+c3ltYm9sWWVzUGl4KTsKKwkJCXNldFRleHQoeWVzQ29sSWR4LCAiWSIpOworCQkJY2ggPSAnWSc7CisJCQlicmVhazsKKwkJY2FzZSBtb2Q6CisJCQlzZXRQaXhtYXAocHJvbXB0Q29sSWR4LCBsaXN0LT5zeW1ib2xNb2RQaXgpOworCQkJc2V0VGV4dChtb2RDb2xJZHgsICJNIik7CisJCQljaCA9ICdNJzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJaWYgKHN5bV9pc19jaG9pY2VfdmFsdWUoc3ltKSAmJiB0eXBlID09IFNfQk9PTEVBTikKKwkJCQlzZXRQaXhtYXAocHJvbXB0Q29sSWR4LCBsaXN0LT5jaG9pY2VOb1BpeCk7CisJCQllbHNlCisJCQkJc2V0UGl4bWFwKHByb21wdENvbElkeCwgbGlzdC0+c3ltYm9sTm9QaXgpOworCQkJc2V0VGV4dChub0NvbElkeCwgIk4iKTsKKwkJCWNoID0gJ04nOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGV4cHIgIT0gbm8pCisJCQlzZXRUZXh0KG5vQ29sSWR4LCBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbm8pID8gIl8iIDogMCk7CisJCWlmIChleHByICE9IG1vZCkKKwkJCXNldFRleHQobW9kQ29sSWR4LCBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbW9kKSA/ICJfIiA6IDApOworCQlpZiAoZXhwciAhPSB5ZXMpCisJCQlzZXRUZXh0KHllc0NvbElkeCwgc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIHllcykgPyAiXyIgOiAwKTsKKworCQlzZXRUZXh0KGRhdGFDb2xJZHgsIFFDaGFyKGNoKSk7CisJCWJyZWFrOworCWNhc2UgU19JTlQ6CisJY2FzZSBTX0hFWDoKKwljYXNlIFNfU1RSSU5HOgorCQljb25zdCBjaGFyKiBkYXRhOworCisJCWRhdGEgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pOworCisjaWYgUVRfVkVSU0lPTiA+PSAzMDAKKwkJaW50IGkgPSBsaXN0LT5tYXBJZHgoZGF0YUNvbElkeCk7CisJCWlmIChpID49IDApCisJCQlzZXRSZW5hbWVFbmFibGVkKGksIFRSVUUpOworI2VuZGlmCisJCXNldFRleHQoZGF0YUNvbElkeCwgZGF0YSk7CisJCWlmICh0eXBlID09IFNfU1RSSU5HKQorCQkJcHJvbXB0ID0gUVN0cmluZygiJTE6ICUyIikuYXJnKHByb21wdCkuYXJnKGRhdGEpOworCQllbHNlCisJCQlwcm9tcHQgPSBRU3RyaW5nKCIoJTIpICUxIikuYXJnKHByb21wdCkuYXJnKGRhdGEpOworCQlicmVhazsKKwl9CisJaWYgKCFzeW1faGFzX3ZhbHVlKHN5bSkgJiYgdmlzaWJsZSkKKwkJcHJvbXB0ICs9ICIgKE5FVykiOworc2V0X3Byb21wdDoKKwlzZXRUZXh0KHByb21wdENvbElkeCwgcHJvbXB0KTsKK30KKwordm9pZCBDb25maWdJdGVtOjp0ZXN0VXBkYXRlTWVudShib29sIHYpCit7CisJQ29uZmlnSXRlbSogaTsKKworCXZpc2libGUgPSB2OworCWlmICghbWVudSkKKwkJcmV0dXJuOworCisJc3ltX2NhbGNfdmFsdWUobWVudS0+c3ltKTsKKwlpZiAobWVudS0+ZmxhZ3MgJiBNRU5VX0NIQU5HRUQpIHsKKwkJLyogdGhlIG1lbnUgZW50cnkgY2hhbmdlZCwgc28gdXBkYXRlIGFsbCBsaXN0IGl0ZW1zICovCisJCW1lbnUtPmZsYWdzICY9IH5NRU5VX0NIQU5HRUQ7CisJCWZvciAoaSA9IChDb25maWdJdGVtKiltZW51LT5kYXRhOyBpOyBpID0gaS0+bmV4dEl0ZW0pCisJCQlpLT51cGRhdGVNZW51KCk7CisJfSBlbHNlIGlmIChsaXN0VmlldygpLT51cGRhdGVBbGwpCisJCXVwZGF0ZU1lbnUoKTsKK30KKwordm9pZCBDb25maWdJdGVtOjpwYWludENlbGwoUVBhaW50ZXIqIHAsIGNvbnN0IFFDb2xvckdyb3VwJiBjZywgaW50IGNvbHVtbiwgaW50IHdpZHRoLCBpbnQgYWxpZ24pCit7CisJQ29uZmlnTGlzdCogbGlzdCA9IGxpc3RWaWV3KCk7CisKKwlpZiAodmlzaWJsZSkgeworCQlpZiAoaXNTZWxlY3RlZCgpICYmICFsaXN0LT5oYXNGb2N1cygpICYmIGxpc3QtPm1vZGUgPT0gbWVudU1vZGUpCisJCQlQYXJlbnQ6OnBhaW50Q2VsbChwLCBsaXN0LT5pbmFjdGl2ZWRDb2xvckdyb3VwLCBjb2x1bW4sIHdpZHRoLCBhbGlnbik7CisJCWVsc2UKKwkJCVBhcmVudDo6cGFpbnRDZWxsKHAsIGNnLCBjb2x1bW4sIHdpZHRoLCBhbGlnbik7CisJfSBlbHNlCisJCVBhcmVudDo6cGFpbnRDZWxsKHAsIGxpc3QtPmRpc2FibGVkQ29sb3JHcm91cCwgY29sdW1uLCB3aWR0aCwgYWxpZ24pOworfQorCisvKgorICogY29uc3RydWN0IGEgbWVudSBlbnRyeQorICovCit2b2lkIENvbmZpZ0l0ZW06OmluaXQodm9pZCkKK3sKKwlpZiAobWVudSkgeworCQlDb25maWdMaXN0KiBsaXN0ID0gbGlzdFZpZXcoKTsKKwkJbmV4dEl0ZW0gPSAoQ29uZmlnSXRlbSopbWVudS0+ZGF0YTsKKwkJbWVudS0+ZGF0YSA9IHRoaXM7CisKKwkJaWYgKGxpc3QtPm1vZGUgIT0gZnVsbE1vZGUpCisJCQlzZXRPcGVuKFRSVUUpOworCQlzeW1fY2FsY192YWx1ZShtZW51LT5zeW0pOworCX0KKwl1cGRhdGVNZW51KCk7Cit9CisKKy8qCisgKiBkZXN0cnVjdCBhIG1lbnUgZW50cnkKKyAqLworQ29uZmlnSXRlbTo6fkNvbmZpZ0l0ZW0odm9pZCkKK3sKKwlpZiAobWVudSkgeworCQlDb25maWdJdGVtKiogaXAgPSAoQ29uZmlnSXRlbSoqKSZtZW51LT5kYXRhOworCQlmb3IgKDsgKmlwOyBpcCA9ICYoKmlwKS0+bmV4dEl0ZW0pIHsKKwkJCWlmICgqaXAgPT0gdGhpcykgeworCQkJCSppcCA9IG5leHRJdGVtOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCit2b2lkIENvbmZpZ0xpbmVFZGl0OjpzaG93KENvbmZpZ0l0ZW0qIGkpCit7CisJaXRlbSA9IGk7CisJaWYgKHN5bV9nZXRfc3RyaW5nX3ZhbHVlKGl0ZW0tPm1lbnUtPnN5bSkpCisJCXNldFRleHQoUVN0cmluZzo6ZnJvbUxvY2FsOEJpdChzeW1fZ2V0X3N0cmluZ192YWx1ZShpdGVtLT5tZW51LT5zeW0pKSk7CisJZWxzZQorCQlzZXRUZXh0KFFTdHJpbmc6Om51bGwpOworCVBhcmVudDo6c2hvdygpOworCXNldEZvY3VzKCk7Cit9CisKK3ZvaWQgQ29uZmlnTGluZUVkaXQ6OmtleVByZXNzRXZlbnQoUUtleUV2ZW50KiBlKQoreworCXN3aXRjaCAoZS0+a2V5KCkpIHsKKwljYXNlIEtleV9Fc2NhcGU6CisJCWJyZWFrOworCWNhc2UgS2V5X1JldHVybjoKKwljYXNlIEtleV9FbnRlcjoKKwkJc3ltX3NldF9zdHJpbmdfdmFsdWUoaXRlbS0+bWVudS0+c3ltLCB0ZXh0KCkubGF0aW4xKCkpOworCQlwYXJlbnQoKS0+dXBkYXRlTGlzdChpdGVtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJUGFyZW50OjprZXlQcmVzc0V2ZW50KGUpOworCQlyZXR1cm47CisJfQorCWUtPmFjY2VwdCgpOworCXBhcmVudCgpLT5saXN0LT5zZXRGb2N1cygpOworCWhpZGUoKTsKK30KKworQ29uZmlnTGlzdDo6Q29uZmlnTGlzdChDb25maWdWaWV3KiBwLCBDb25maWdNYWluV2luZG93KiBjdiwgQ29uZmlnU2V0dGluZ3MqIGNvbmZpZ1NldHRpbmdzKQorCTogUGFyZW50KHApLCBjdmlldyhjdiksCisJICB1cGRhdGVBbGwoZmFsc2UpLAorCSAgc3ltYm9sWWVzUGl4KHhwbV9zeW1ib2xfeWVzKSwgc3ltYm9sTW9kUGl4KHhwbV9zeW1ib2xfbW9kKSwgc3ltYm9sTm9QaXgoeHBtX3N5bWJvbF9ubyksCisJICBjaG9pY2VZZXNQaXgoeHBtX2Nob2ljZV95ZXMpLCBjaG9pY2VOb1BpeCh4cG1fY2hvaWNlX25vKSwKKwkgIG1lbnVQaXgoeHBtX21lbnUpLCBtZW51SW52UGl4KHhwbV9tZW51X2ludiksIG1lbnVCYWNrUGl4KHhwbV9tZW51YmFjayksIHZvaWRQaXgoeHBtX3ZvaWQpLAorCSAgc2hvd0FsbChmYWxzZSksIHNob3dOYW1lKGZhbHNlKSwgc2hvd1JhbmdlKGZhbHNlKSwgc2hvd0RhdGEoZmFsc2UpLAorCSAgcm9vdEVudHJ5KDApCit7CisJaW50IGk7CisKKwlzZXRTb3J0aW5nKC0xKTsKKwlzZXRSb290SXNEZWNvcmF0ZWQoVFJVRSk7CisJZGlzYWJsZWRDb2xvckdyb3VwID0gcGFsZXR0ZSgpLmFjdGl2ZSgpOworCWRpc2FibGVkQ29sb3JHcm91cC5zZXRDb2xvcihRQ29sb3JHcm91cDo6VGV4dCwgcGFsZXR0ZSgpLmRpc2FibGVkKCkudGV4dCgpKTsKKwlpbmFjdGl2ZWRDb2xvckdyb3VwID0gcGFsZXR0ZSgpLmFjdGl2ZSgpOworCWluYWN0aXZlZENvbG9yR3JvdXAuc2V0Q29sb3IoUUNvbG9yR3JvdXA6OkhpZ2hsaWdodCwgcGFsZXR0ZSgpLmRpc2FibGVkKCkuaGlnaGxpZ2h0KCkpOworCisJY29ubmVjdCh0aGlzLCBTSUdOQUwoc2VsZWN0aW9uQ2hhbmdlZCh2b2lkKSksCisJCVNMT1QodXBkYXRlU2VsZWN0aW9uKHZvaWQpKSk7CisKKwlpZiAoY29uZmlnU2V0dGluZ3MpIHsKKwkJc2hvd0FsbCA9IGNvbmZpZ1NldHRpbmdzLT5zaG93QWxsOworCQlzaG93TmFtZSA9IGNvbmZpZ1NldHRpbmdzLT5zaG93TmFtZTsKKwkJc2hvd1JhbmdlID0gY29uZmlnU2V0dGluZ3MtPnNob3dSYW5nZTsKKwkJc2hvd0RhdGEgPSBjb25maWdTZXR0aW5ncy0+c2hvd0RhdGE7CisJfQorCisJZm9yIChpID0gMDsgaSA8IGNvbE5yOyBpKyspCisJCWNvbE1hcFtpXSA9IGNvbFJldk1hcFtpXSA9IC0xOworCWFkZENvbHVtbihwcm9tcHRDb2xJZHgsICJPcHRpb24iKTsKKworCXJlaW5pdCgpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OnJlaW5pdCh2b2lkKQoreworCXJlbW92ZUNvbHVtbihkYXRhQ29sSWR4KTsKKwlyZW1vdmVDb2x1bW4oeWVzQ29sSWR4KTsKKwlyZW1vdmVDb2x1bW4obW9kQ29sSWR4KTsKKwlyZW1vdmVDb2x1bW4obm9Db2xJZHgpOworCXJlbW92ZUNvbHVtbihuYW1lQ29sSWR4KTsKKworCWlmIChzaG93TmFtZSkKKwkJYWRkQ29sdW1uKG5hbWVDb2xJZHgsICJOYW1lIik7CisJaWYgKHNob3dSYW5nZSkgeworCQlhZGRDb2x1bW4obm9Db2xJZHgsICJOIik7CisJCWFkZENvbHVtbihtb2RDb2xJZHgsICJNIik7CisJCWFkZENvbHVtbih5ZXNDb2xJZHgsICJZIik7CisJfQorCWlmIChzaG93RGF0YSkKKwkJYWRkQ29sdW1uKGRhdGFDb2xJZHgsICJWYWx1ZSIpOworCisJdXBkYXRlTGlzdEFsbCgpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OnVwZGF0ZVNlbGVjdGlvbih2b2lkKQoreworCXN0cnVjdCBtZW51ICptZW51OworCWVudW0gcHJvcF90eXBlIHR5cGU7CisKKwlDb25maWdJdGVtKiBpdGVtID0gKENvbmZpZ0l0ZW0qKXNlbGVjdGVkSXRlbSgpOworCWlmICghaXRlbSkKKwkJcmV0dXJuOworCisJY3ZpZXctPnNldEhlbHAoaXRlbSk7CisKKwltZW51ID0gaXRlbS0+bWVudTsKKwlpZiAoIW1lbnUpCisJCXJldHVybjsKKwl0eXBlID0gbWVudS0+cHJvbXB0ID8gbWVudS0+cHJvbXB0LT50eXBlIDogUF9VTktOT1dOOworCWlmIChtb2RlID09IG1lbnVNb2RlICYmIHR5cGUgPT0gUF9NRU5VKQorCQllbWl0IG1lbnVTZWxlY3RlZChtZW51KTsKK30KKwordm9pZCBDb25maWdMaXN0Ojp1cGRhdGVMaXN0KENvbmZpZ0l0ZW0qIGl0ZW0pCit7CisJQ29uZmlnSXRlbSogbGFzdCA9IDA7CisKKwlpZiAoIXJvb3RFbnRyeSkKKwkJZ290byB1cGRhdGU7CisKKwlpZiAocm9vdEVudHJ5ICE9ICZyb290bWVudSAmJiAobW9kZSA9PSBzaW5nbGVNb2RlIHx8CisJICAgIChtb2RlID09IHN5bWJvbE1vZGUgJiYgcm9vdEVudHJ5LT5wYXJlbnQgIT0gJnJvb3RtZW51KSkpIHsKKwkJaXRlbSA9IGZpcnN0Q2hpbGQoKTsKKwkJaWYgKCFpdGVtKQorCQkJaXRlbSA9IG5ldyBDb25maWdJdGVtKHRoaXMsIDAsIHRydWUpOworCQlsYXN0ID0gaXRlbTsKKwl9CisJaWYgKChtb2RlID09IHNpbmdsZU1vZGUgfHwgKG1vZGUgPT0gc3ltYm9sTW9kZSAmJiAhKHJvb3RFbnRyeS0+ZmxhZ3MgJiBNRU5VX1JPT1QpKSkgJiYKKwkgICAgcm9vdEVudHJ5LT5zeW0gJiYgcm9vdEVudHJ5LT5wcm9tcHQpIHsKKwkJaXRlbSA9IGxhc3QgPyBsYXN0LT5uZXh0U2libGluZygpIDogZmlyc3RDaGlsZCgpOworCQlpZiAoIWl0ZW0pCisJCQlpdGVtID0gbmV3IENvbmZpZ0l0ZW0odGhpcywgbGFzdCwgcm9vdEVudHJ5LCB0cnVlKTsKKwkJZWxzZQorCQkJaXRlbS0+dGVzdFVwZGF0ZU1lbnUodHJ1ZSk7CisKKwkJdXBkYXRlTWVudUxpc3QoaXRlbSwgcm9vdEVudHJ5KTsKKwkJdHJpZ2dlclVwZGF0ZSgpOworCQlyZXR1cm47CisJfQordXBkYXRlOgorCXVwZGF0ZU1lbnVMaXN0KHRoaXMsIHJvb3RFbnRyeSk7CisJdHJpZ2dlclVwZGF0ZSgpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OnNldEFsbE9wZW4oYm9vbCBvcGVuKQoreworCVFMaXN0Vmlld0l0ZW1JdGVyYXRvciBpdCh0aGlzKTsKKworCWZvciAoOyBpdC5jdXJyZW50KCk7IGl0KyspCisJCWl0LmN1cnJlbnQoKS0+c2V0T3BlbihvcGVuKTsKK30KKwordm9pZCBDb25maWdMaXN0OjpzZXRWYWx1ZShDb25maWdJdGVtKiBpdGVtLCB0cmlzdGF0ZSB2YWwpCit7CisJc3RydWN0IHN5bWJvbCogc3ltOworCWludCB0eXBlOworCXRyaXN0YXRlIG9sZHZhbDsKKworCXN5bSA9IGl0ZW0tPm1lbnUgPyBpdGVtLT5tZW51LT5zeW0gOiAwOworCWlmICghc3ltKQorCQlyZXR1cm47CisKKwl0eXBlID0gc3ltX2dldF90eXBlKHN5bSk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQlvbGR2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisKKwkJaWYgKCFzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgdmFsKSkKKwkJCXJldHVybjsKKwkJaWYgKG9sZHZhbCA9PSBubyAmJiBpdGVtLT5tZW51LT5saXN0KQorCQkJaXRlbS0+c2V0T3BlbihUUlVFKTsKKwkJcGFyZW50KCktPnVwZGF0ZUxpc3QoaXRlbSk7CisJCWJyZWFrOworCX0KK30KKwordm9pZCBDb25maWdMaXN0OjpjaGFuZ2VWYWx1ZShDb25maWdJdGVtKiBpdGVtKQoreworCXN0cnVjdCBzeW1ib2wqIHN5bTsKKwlzdHJ1Y3QgbWVudSogbWVudTsKKwlpbnQgdHlwZSwgb2xkZXhwciwgbmV3ZXhwcjsKKworCW1lbnUgPSBpdGVtLT5tZW51OworCWlmICghbWVudSkKKwkJcmV0dXJuOworCXN5bSA9IG1lbnUtPnN5bTsKKwlpZiAoIXN5bSkgeworCQlpZiAoaXRlbS0+bWVudS0+bGlzdCkKKwkJCWl0ZW0tPnNldE9wZW4oIWl0ZW0tPmlzT3BlbigpKTsKKwkJcmV0dXJuOworCX0KKworCXR5cGUgPSBzeW1fZ2V0X3R5cGUoc3ltKTsKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCW9sZGV4cHIgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJCW5ld2V4cHIgPSBzeW1fdG9nZ2xlX3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJCWlmIChpdGVtLT5tZW51LT5saXN0KSB7CisJCQlpZiAob2xkZXhwciA9PSBuZXdleHByKQorCQkJCWl0ZW0tPnNldE9wZW4oIWl0ZW0tPmlzT3BlbigpKTsKKwkJCWVsc2UgaWYgKG9sZGV4cHIgPT0gbm8pCisJCQkJaXRlbS0+c2V0T3BlbihUUlVFKTsKKwkJfQorCQlpZiAob2xkZXhwciAhPSBuZXdleHByKQorCQkJcGFyZW50KCktPnVwZGF0ZUxpc3QoaXRlbSk7CisJCWJyZWFrOworCWNhc2UgU19JTlQ6CisJY2FzZSBTX0hFWDoKKwljYXNlIFNfU1RSSU5HOgorI2lmIFFUX1ZFUlNJT04gPj0gMzAwCisJCWlmIChjb2xNYXBbZGF0YUNvbElkeF0gPj0gMCkKKwkJCWl0ZW0tPnN0YXJ0UmVuYW1lKGNvbE1hcFtkYXRhQ29sSWR4XSk7CisJCWVsc2UKKyNlbmRpZgorCQkJcGFyZW50KCktPmxpbmVFZGl0LT5zaG93KGl0ZW0pOworCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgQ29uZmlnTGlzdDo6c2V0Um9vdE1lbnUoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJZW51bSBwcm9wX3R5cGUgdHlwZTsKKworCWlmIChyb290RW50cnkgPT0gbWVudSkKKwkJcmV0dXJuOworCXR5cGUgPSBtZW51ICYmIG1lbnUtPnByb21wdCA/IG1lbnUtPnByb21wdC0+dHlwZSA6IFBfVU5LTk9XTjsKKwlpZiAodHlwZSAhPSBQX01FTlUpCisJCXJldHVybjsKKwl1cGRhdGVNZW51TGlzdCh0aGlzLCAwKTsKKwlyb290RW50cnkgPSBtZW51OworCXVwZGF0ZUxpc3RBbGwoKTsKKwlzZXRTZWxlY3RlZChjdXJyZW50SXRlbSgpLCBoYXNGb2N1cygpKTsKK30KKwordm9pZCBDb25maWdMaXN0OjpzZXRQYXJlbnRNZW51KHZvaWQpCit7CisJQ29uZmlnSXRlbSogaXRlbTsKKwlzdHJ1Y3QgbWVudSAqb2xkcm9vdDsKKworCW9sZHJvb3QgPSByb290RW50cnk7CisJaWYgKHJvb3RFbnRyeSA9PSAmcm9vdG1lbnUpCisJCXJldHVybjsKKwlzZXRSb290TWVudShtZW51X2dldF9wYXJlbnRfbWVudShyb290RW50cnktPnBhcmVudCkpOworCisJUUxpc3RWaWV3SXRlbUl0ZXJhdG9yIGl0KHRoaXMpOworCWZvciAoOyAoaXRlbSA9IChDb25maWdJdGVtKilpdC5jdXJyZW50KCkpOyBpdCsrKSB7CisJCWlmIChpdGVtLT5tZW51ID09IG9sZHJvb3QpIHsKKwkJCXNldEN1cnJlbnRJdGVtKGl0ZW0pOworCQkJZW5zdXJlSXRlbVZpc2libGUoaXRlbSk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKwordm9pZCBDb25maWdMaXN0OjprZXlQcmVzc0V2ZW50KFFLZXlFdmVudCogZXYpCit7CisJUUxpc3RWaWV3SXRlbSogaSA9IGN1cnJlbnRJdGVtKCk7CisJQ29uZmlnSXRlbSogaXRlbTsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKwllbnVtIHByb3BfdHlwZSB0eXBlOworCisJaWYgKGV2LT5rZXkoKSA9PSBLZXlfRXNjYXBlICYmIG1vZGUgIT0gZnVsbE1vZGUpIHsKKwkJZW1pdCBwYXJlbnRTZWxlY3RlZCgpOworCQlldi0+YWNjZXB0KCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIWkpIHsKKwkJUGFyZW50OjprZXlQcmVzc0V2ZW50KGV2KTsKKwkJcmV0dXJuOworCX0KKwlpdGVtID0gKENvbmZpZ0l0ZW0qKWk7CisKKwlzd2l0Y2ggKGV2LT5rZXkoKSkgeworCWNhc2UgS2V5X1JldHVybjoKKwljYXNlIEtleV9FbnRlcjoKKwkJaWYgKGl0ZW0tPmdvUGFyZW50KSB7CisJCQllbWl0IHBhcmVudFNlbGVjdGVkKCk7CisJCQlicmVhazsKKwkJfQorCQltZW51ID0gaXRlbS0+bWVudTsKKwkJaWYgKCFtZW51KQorCQkJYnJlYWs7CisJCXR5cGUgPSBtZW51LT5wcm9tcHQgPyBtZW51LT5wcm9tcHQtPnR5cGUgOiBQX1VOS05PV047CisJCWlmICh0eXBlID09IFBfTUVOVSAmJiByb290RW50cnkgIT0gbWVudSAmJgorCQkgICAgbW9kZSAhPSBmdWxsTW9kZSAmJiBtb2RlICE9IG1lbnVNb2RlKSB7CisJCQllbWl0IG1lbnVTZWxlY3RlZChtZW51KTsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBLZXlfU3BhY2U6CisJCWNoYW5nZVZhbHVlKGl0ZW0pOworCQlicmVhazsKKwljYXNlIEtleV9OOgorCQlzZXRWYWx1ZShpdGVtLCBubyk7CisJCWJyZWFrOworCWNhc2UgS2V5X006CisJCXNldFZhbHVlKGl0ZW0sIG1vZCk7CisJCWJyZWFrOworCWNhc2UgS2V5X1k6CisJCXNldFZhbHVlKGl0ZW0sIHllcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBhcmVudDo6a2V5UHJlc3NFdmVudChldik7CisJCXJldHVybjsKKwl9CisJZXYtPmFjY2VwdCgpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OmNvbnRlbnRzTW91c2VQcmVzc0V2ZW50KFFNb3VzZUV2ZW50KiBlKQoreworCS8vUVBvaW50IHAoY29udGVudHNUb1ZpZXdwb3J0KGUtPnBvcygpKSk7CisJLy9wcmludGYoImNvbnRlbnRzTW91c2VQcmVzc0V2ZW50OiAlZCwlZFxuIiwgcC54KCksIHAueSgpKTsKKwlQYXJlbnQ6OmNvbnRlbnRzTW91c2VQcmVzc0V2ZW50KGUpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OmNvbnRlbnRzTW91c2VSZWxlYXNlRXZlbnQoUU1vdXNlRXZlbnQqIGUpCit7CisJUVBvaW50IHAoY29udGVudHNUb1ZpZXdwb3J0KGUtPnBvcygpKSk7CisJQ29uZmlnSXRlbSogaXRlbSA9IChDb25maWdJdGVtKilpdGVtQXQocCk7CisJc3RydWN0IG1lbnUgKm1lbnU7CisJZW51bSBwcm9wX3R5cGUgcHR5cGU7CisJY29uc3QgUVBpeG1hcCogcG07CisJaW50IGlkeCwgeDsKKworCWlmICghaXRlbSkKKwkJZ290byBza2lwOworCisJbWVudSA9IGl0ZW0tPm1lbnU7CisJeCA9IGhlYWRlcigpLT5vZmZzZXQoKSArIHAueCgpOworCWlkeCA9IGNvbFJldk1hcFtoZWFkZXIoKS0+c2VjdGlvbkF0KHgpXTsKKwlzd2l0Y2ggKGlkeCkgeworCWNhc2UgcHJvbXB0Q29sSWR4OgorCQlwbSA9IGl0ZW0tPnBpeG1hcChwcm9tcHRDb2xJZHgpOworCQlpZiAocG0pIHsKKwkJCWludCBvZmYgPSBoZWFkZXIoKS0+c2VjdGlvblBvcygwKSArIGl0ZW1NYXJnaW4oKSArCisJCQkJdHJlZVN0ZXBTaXplKCkgKiAoaXRlbS0+ZGVwdGgoKSArIChyb290SXNEZWNvcmF0ZWQoKSA/IDEgOiAwKSk7CisJCQlpZiAoeCA+PSBvZmYgJiYgeCA8IG9mZiArIHBtLT53aWR0aCgpKSB7CisJCQkJaWYgKGl0ZW0tPmdvUGFyZW50KSB7CisJCQkJCWVtaXQgcGFyZW50U2VsZWN0ZWQoKTsKKwkJCQkJYnJlYWs7CisJCQkJfSBlbHNlIGlmICghbWVudSkKKwkJCQkJYnJlYWs7CisJCQkJcHR5cGUgPSBtZW51LT5wcm9tcHQgPyBtZW51LT5wcm9tcHQtPnR5cGUgOiBQX1VOS05PV047CisJCQkJaWYgKHB0eXBlID09IFBfTUVOVSAmJiByb290RW50cnkgIT0gbWVudSAmJgorCQkJCSAgICBtb2RlICE9IGZ1bGxNb2RlICYmIG1vZGUgIT0gbWVudU1vZGUpCisJCQkJCWVtaXQgbWVudVNlbGVjdGVkKG1lbnUpOworCQkJCWVsc2UKKwkJCQkJY2hhbmdlVmFsdWUoaXRlbSk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBub0NvbElkeDoKKwkJc2V0VmFsdWUoaXRlbSwgbm8pOworCQlicmVhazsKKwljYXNlIG1vZENvbElkeDoKKwkJc2V0VmFsdWUoaXRlbSwgbW9kKTsKKwkJYnJlYWs7CisJY2FzZSB5ZXNDb2xJZHg6CisJCXNldFZhbHVlKGl0ZW0sIHllcyk7CisJCWJyZWFrOworCWNhc2UgZGF0YUNvbElkeDoKKwkJY2hhbmdlVmFsdWUoaXRlbSk7CisJCWJyZWFrOworCX0KKworc2tpcDoKKwkvL3ByaW50ZigiY29udGVudHNNb3VzZVJlbGVhc2VFdmVudDogJWQsJWRcbiIsIHAueCgpLCBwLnkoKSk7CisJUGFyZW50Ojpjb250ZW50c01vdXNlUmVsZWFzZUV2ZW50KGUpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OmNvbnRlbnRzTW91c2VNb3ZlRXZlbnQoUU1vdXNlRXZlbnQqIGUpCit7CisJLy9RUG9pbnQgcChjb250ZW50c1RvVmlld3BvcnQoZS0+cG9zKCkpKTsKKwkvL3ByaW50ZigiY29udGVudHNNb3VzZU1vdmVFdmVudDogJWQsJWRcbiIsIHAueCgpLCBwLnkoKSk7CisJUGFyZW50Ojpjb250ZW50c01vdXNlTW92ZUV2ZW50KGUpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OmNvbnRlbnRzTW91c2VEb3VibGVDbGlja0V2ZW50KFFNb3VzZUV2ZW50KiBlKQoreworCVFQb2ludCBwKGNvbnRlbnRzVG9WaWV3cG9ydChlLT5wb3MoKSkpOworCUNvbmZpZ0l0ZW0qIGl0ZW0gPSAoQ29uZmlnSXRlbSopaXRlbUF0KHApOworCXN0cnVjdCBtZW51ICptZW51OworCWVudW0gcHJvcF90eXBlIHB0eXBlOworCisJaWYgKCFpdGVtKQorCQlnb3RvIHNraXA7CisJaWYgKGl0ZW0tPmdvUGFyZW50KSB7CisJCWVtaXQgcGFyZW50U2VsZWN0ZWQoKTsKKwkJZ290byBza2lwOworCX0KKwltZW51ID0gaXRlbS0+bWVudTsKKwlpZiAoIW1lbnUpCisJCWdvdG8gc2tpcDsKKwlwdHlwZSA9IG1lbnUtPnByb21wdCA/IG1lbnUtPnByb21wdC0+dHlwZSA6IFBfVU5LTk9XTjsKKwlpZiAocHR5cGUgPT0gUF9NRU5VICYmIChtb2RlID09IHNpbmdsZU1vZGUgfHwgbW9kZSA9PSBzeW1ib2xNb2RlKSkKKwkJZW1pdCBtZW51U2VsZWN0ZWQobWVudSk7CisJZWxzZSBpZiAobWVudS0+c3ltKQorCQljaGFuZ2VWYWx1ZShpdGVtKTsKKworc2tpcDoKKwkvL3ByaW50ZigiY29udGVudHNNb3VzZURvdWJsZUNsaWNrRXZlbnQ6ICVkLCVkXG4iLCBwLngoKSwgcC55KCkpOworCVBhcmVudDo6Y29udGVudHNNb3VzZURvdWJsZUNsaWNrRXZlbnQoZSk7Cit9CisKK3ZvaWQgQ29uZmlnTGlzdDo6Zm9jdXNJbkV2ZW50KFFGb2N1c0V2ZW50ICplKQoreworCVBhcmVudDo6Zm9jdXNJbkV2ZW50KGUpOworCisJUUxpc3RWaWV3SXRlbSogaXRlbSA9IGN1cnJlbnRJdGVtKCk7CisJaWYgKCFpdGVtKQorCQlyZXR1cm47CisKKwlzZXRTZWxlY3RlZChpdGVtLCBUUlVFKTsKKwllbWl0IGdvdEZvY3VzKCk7Cit9CisKK0NvbmZpZ1ZpZXcqIENvbmZpZ1ZpZXc6OnZpZXdMaXN0OworCitDb25maWdWaWV3OjpDb25maWdWaWV3KFFXaWRnZXQqIHBhcmVudCwgQ29uZmlnTWFpbldpbmRvdyogY3ZpZXcsCisJCSAgICAgICBDb25maWdTZXR0aW5ncyAqY29uZmlnU2V0dGluZ3MpCisJOiBQYXJlbnQocGFyZW50KQoreworCWxpc3QgPSBuZXcgQ29uZmlnTGlzdCh0aGlzLCBjdmlldywgY29uZmlnU2V0dGluZ3MpOworCWxpbmVFZGl0ID0gbmV3IENvbmZpZ0xpbmVFZGl0KHRoaXMpOworCWxpbmVFZGl0LT5oaWRlKCk7CisKKwl0aGlzLT5uZXh0VmlldyA9IHZpZXdMaXN0OworCXZpZXdMaXN0ID0gdGhpczsKK30KKworQ29uZmlnVmlldzo6fkNvbmZpZ1ZpZXcodm9pZCkKK3sKKwlDb25maWdWaWV3KiogdnA7CisKKwlmb3IgKHZwID0gJnZpZXdMaXN0OyAqdnA7IHZwID0gJigqdnApLT5uZXh0VmlldykgeworCQlpZiAoKnZwID09IHRoaXMpIHsKKwkJCSp2cCA9IG5leHRWaWV3OworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3ZvaWQgQ29uZmlnVmlldzo6dXBkYXRlTGlzdChDb25maWdJdGVtKiBpdGVtKQoreworCUNvbmZpZ1ZpZXcqIHY7CisKKwlmb3IgKHYgPSB2aWV3TGlzdDsgdjsgdiA9IHYtPm5leHRWaWV3KQorCQl2LT5saXN0LT51cGRhdGVMaXN0KGl0ZW0pOworfQorCit2b2lkIENvbmZpZ1ZpZXc6OnVwZGF0ZUxpc3RBbGwodm9pZCkKK3sKKwlDb25maWdWaWV3KiB2OworCisJZm9yICh2ID0gdmlld0xpc3Q7IHY7IHYgPSB2LT5uZXh0VmlldykKKwkJdi0+bGlzdC0+dXBkYXRlTGlzdEFsbCgpOworfQorCisvKgorICogQ29uc3RydWN0IHRoZSBjb21wbGV0ZSBjb25maWcgd2lkZ2V0CisgKi8KK0NvbmZpZ01haW5XaW5kb3c6OkNvbmZpZ01haW5XaW5kb3codm9pZCkKK3sKKwlRTWVudUJhciogbWVudTsKKwlib29sIG9rOworCWludCB4LCB5LCB3aWR0aCwgaGVpZ2h0OworCisJUVdpZGdldCAqZCA9IGNvbmZpZ0FwcC0+ZGVza3RvcCgpOworCisJQ29uZmlnU2V0dGluZ3MqIGNvbmZpZ1NldHRpbmdzID0gbmV3IENvbmZpZ1NldHRpbmdzKCk7CisjaWYgUVRfVkVSU0lPTiA+PSAzMDAKKwl3aWR0aCA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkTnVtRW50cnkoIi9rY29uZmlnL3Fjb25mL3dpbmRvdyB3aWR0aCIsIGQtPndpZHRoKCkgLSA2NCk7CisJaGVpZ2h0ID0gY29uZmlnU2V0dGluZ3MtPnJlYWROdW1FbnRyeSgiL2tjb25maWcvcWNvbmYvd2luZG93IGhlaWdodCIsIGQtPmhlaWdodCgpIC0gNjQpOworCXJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKwl4ID0gY29uZmlnU2V0dGluZ3MtPnJlYWROdW1FbnRyeSgiL2tjb25maWcvcWNvbmYvd2luZG93IHgiLCAwLCAmb2spOworCWlmIChvaykKKwkJeSA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkTnVtRW50cnkoIi9rY29uZmlnL3Fjb25mL3dpbmRvdyB5IiwgMCwgJm9rKTsKKwlpZiAob2spCisJCW1vdmUoeCwgeSk7CisJc2hvd0RlYnVnID0gY29uZmlnU2V0dGluZ3MtPnJlYWRCb29sRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dEZWJ1ZyIsIGZhbHNlKTsKKworCS8vIHJlYWQgbGlzdCBzZXR0aW5ncyBpbnRvIGNvbmZpZ1NldHRpbmdzLCB3aWxsIGJlIHVzZWQgbGF0ZXIgZm9yIENvbmZpZ0xpc3Qgc2V0dXAKKwljb25maWdTZXR0aW5ncy0+cmVhZExpc3RTZXR0aW5ncygpOworI2Vsc2UKKwl3aWR0aCA9IGQtPndpZHRoKCkgLSA2NDsKKwloZWlnaHQgPSBkLT5oZWlnaHQoKSAtIDY0OworCXJlc2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKwlzaG93RGVidWcgPSBmYWxzZTsKKyNlbmRpZgorCisJc3BsaXQxID0gbmV3IFFTcGxpdHRlcih0aGlzKTsKKwlzcGxpdDEtPnNldE9yaWVudGF0aW9uKFFTcGxpdHRlcjo6SG9yaXpvbnRhbCk7CisJc2V0Q2VudHJhbFdpZGdldChzcGxpdDEpOworCisJbWVudVZpZXcgPSBuZXcgQ29uZmlnVmlldyhzcGxpdDEsIHRoaXMsIGNvbmZpZ1NldHRpbmdzKTsKKwltZW51TGlzdCA9IG1lbnVWaWV3LT5saXN0OworCisJc3BsaXQyID0gbmV3IFFTcGxpdHRlcihzcGxpdDEpOworCXNwbGl0Mi0+c2V0T3JpZW50YXRpb24oUVNwbGl0dGVyOjpWZXJ0aWNhbCk7CisKKwkvLyBjcmVhdGUgY29uZmlnIHRyZWUKKwljb25maWdWaWV3ID0gbmV3IENvbmZpZ1ZpZXcoc3BsaXQyLCB0aGlzLCBjb25maWdTZXR0aW5ncyk7CisJY29uZmlnTGlzdCA9IGNvbmZpZ1ZpZXctPmxpc3Q7CisKKwloZWxwVGV4dCA9IG5ldyBRVGV4dFZpZXcoc3BsaXQyKTsKKwloZWxwVGV4dC0+c2V0VGV4dEZvcm1hdChRdDo6UmljaFRleHQpOworCisJc2V0VGFiT3JkZXIoY29uZmlnTGlzdCwgaGVscFRleHQpOworCWNvbmZpZ0xpc3QtPnNldEZvY3VzKCk7CisKKwltZW51ID0gbWVudUJhcigpOworCXRvb2xCYXIgPSBuZXcgUVRvb2xCYXIoIlRvb2xzIiwgdGhpcyk7CisKKwliYWNrQWN0aW9uID0gbmV3IFFBY3Rpb24oIkJhY2siLCBRUGl4bWFwKHhwbV9iYWNrKSwgIkJhY2siLCAwLCB0aGlzKTsKKwkgIGNvbm5lY3QoYmFja0FjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChnb0JhY2soKSkpOworCSAgYmFja0FjdGlvbi0+c2V0RW5hYmxlZChGQUxTRSk7CisJUUFjdGlvbiAqcXVpdEFjdGlvbiA9IG5ldyBRQWN0aW9uKCJRdWl0IiwgIiZRdWl0IiwgQ1RSTCtLZXlfUSwgdGhpcyk7CisJICBjb25uZWN0KHF1aXRBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1QoY2xvc2UoKSkpOworCVFBY3Rpb24gKmxvYWRBY3Rpb24gPSBuZXcgUUFjdGlvbigiTG9hZCIsIFFQaXhtYXAoeHBtX2xvYWQpLCAiJkxvYWQiLCBDVFJMK0tleV9MLCB0aGlzKTsKKwkgIGNvbm5lY3QobG9hZEFjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChsb2FkQ29uZmlnKCkpKTsKKwlRQWN0aW9uICpzYXZlQWN0aW9uID0gbmV3IFFBY3Rpb24oIlNhdmUiLCBRUGl4bWFwKHhwbV9zYXZlKSwgIiZTYXZlIiwgQ1RSTCtLZXlfUywgdGhpcyk7CisJICBjb25uZWN0KHNhdmVBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1Qoc2F2ZUNvbmZpZygpKSk7CisJUUFjdGlvbiAqc2F2ZUFzQWN0aW9uID0gbmV3IFFBY3Rpb24oIlNhdmUgQXMuLi4iLCAiU2F2ZSAmQXMuLi4iLCAwLCB0aGlzKTsKKwkgIGNvbm5lY3Qoc2F2ZUFzQWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKHNhdmVDb25maWdBcygpKSk7CisJUUFjdGlvbiAqc2luZ2xlVmlld0FjdGlvbiA9IG5ldyBRQWN0aW9uKCJTaW5nbGUgVmlldyIsIFFQaXhtYXAoeHBtX3NpbmdsZV92aWV3KSwgIlNwbGl0IFZpZXciLCAwLCB0aGlzKTsKKwkgIGNvbm5lY3Qoc2luZ2xlVmlld0FjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChzaG93U2luZ2xlVmlldygpKSk7CisJUUFjdGlvbiAqc3BsaXRWaWV3QWN0aW9uID0gbmV3IFFBY3Rpb24oIlNwbGl0IFZpZXciLCBRUGl4bWFwKHhwbV9zcGxpdF92aWV3KSwgIlNwbGl0IFZpZXciLCAwLCB0aGlzKTsKKwkgIGNvbm5lY3Qoc3BsaXRWaWV3QWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKHNob3dTcGxpdFZpZXcoKSkpOworCVFBY3Rpb24gKmZ1bGxWaWV3QWN0aW9uID0gbmV3IFFBY3Rpb24oIkZ1bGwgVmlldyIsIFFQaXhtYXAoeHBtX3RyZWVfdmlldyksICJGdWxsIFZpZXciLCAwLCB0aGlzKTsKKwkgIGNvbm5lY3QoZnVsbFZpZXdBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1Qoc2hvd0Z1bGxWaWV3KCkpKTsKKworCVFBY3Rpb24gKnNob3dOYW1lQWN0aW9uID0gbmV3IFFBY3Rpb24oTlVMTCwgIlNob3cgTmFtZSIsIDAsIHRoaXMpOworCSAgc2hvd05hbWVBY3Rpb24tPnNldFRvZ2dsZUFjdGlvbihUUlVFKTsKKwkgIHNob3dOYW1lQWN0aW9uLT5zZXRPbihjb25maWdMaXN0LT5zaG93TmFtZSk7CisJICBjb25uZWN0KHNob3dOYW1lQWN0aW9uLCBTSUdOQUwodG9nZ2xlZChib29sKSksIFNMT1Qoc2V0U2hvd05hbWUoYm9vbCkpKTsKKwlRQWN0aW9uICpzaG93UmFuZ2VBY3Rpb24gPSBuZXcgUUFjdGlvbihOVUxMLCAiU2hvdyBSYW5nZSIsIDAsIHRoaXMpOworCSAgc2hvd1JhbmdlQWN0aW9uLT5zZXRUb2dnbGVBY3Rpb24oVFJVRSk7CisJICBzaG93UmFuZ2VBY3Rpb24tPnNldE9uKGNvbmZpZ0xpc3QtPnNob3dSYW5nZSk7CisJICBjb25uZWN0KHNob3dSYW5nZUFjdGlvbiwgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBTTE9UKHNldFNob3dSYW5nZShib29sKSkpOworCVFBY3Rpb24gKnNob3dEYXRhQWN0aW9uID0gbmV3IFFBY3Rpb24oTlVMTCwgIlNob3cgRGF0YSIsIDAsIHRoaXMpOworCSAgc2hvd0RhdGFBY3Rpb24tPnNldFRvZ2dsZUFjdGlvbihUUlVFKTsKKwkgIHNob3dEYXRhQWN0aW9uLT5zZXRPbihjb25maWdMaXN0LT5zaG93RGF0YSk7CisJICBjb25uZWN0KHNob3dEYXRhQWN0aW9uLCBTSUdOQUwodG9nZ2xlZChib29sKSksIFNMT1Qoc2V0U2hvd0RhdGEoYm9vbCkpKTsKKwlRQWN0aW9uICpzaG93QWxsQWN0aW9uID0gbmV3IFFBY3Rpb24oTlVMTCwgIlNob3cgQWxsIE9wdGlvbnMiLCAwLCB0aGlzKTsKKwkgIHNob3dBbGxBY3Rpb24tPnNldFRvZ2dsZUFjdGlvbihUUlVFKTsKKwkgIHNob3dBbGxBY3Rpb24tPnNldE9uKGNvbmZpZ0xpc3QtPnNob3dBbGwpOworCSAgY29ubmVjdChzaG93QWxsQWN0aW9uLCBTSUdOQUwodG9nZ2xlZChib29sKSksIFNMT1Qoc2V0U2hvd0FsbChib29sKSkpOworCVFBY3Rpb24gKnNob3dEZWJ1Z0FjdGlvbiA9IG5ldyBRQWN0aW9uKE5VTEwsICJTaG93IERlYnVnIEluZm8iLCAwLCB0aGlzKTsKKwkgIHNob3dEZWJ1Z0FjdGlvbi0+c2V0VG9nZ2xlQWN0aW9uKFRSVUUpOworCSAgc2hvd0RlYnVnQWN0aW9uLT5zZXRPbihzaG93RGVidWcpOworCSAgY29ubmVjdChzaG93RGVidWdBY3Rpb24sIFNJR05BTCh0b2dnbGVkKGJvb2wpKSwgU0xPVChzZXRTaG93RGVidWcoYm9vbCkpKTsKKworCVFBY3Rpb24gKnNob3dJbnRyb0FjdGlvbiA9IG5ldyBRQWN0aW9uKE5VTEwsICJJbnRyb2R1Y3Rpb24iLCAwLCB0aGlzKTsKKwkgIGNvbm5lY3Qoc2hvd0ludHJvQWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKHNob3dJbnRybygpKSk7CisJUUFjdGlvbiAqc2hvd0Fib3V0QWN0aW9uID0gbmV3IFFBY3Rpb24oTlVMTCwgIkFib3V0IiwgMCwgdGhpcyk7CisJICBjb25uZWN0KHNob3dBYm91dEFjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChzaG93QWJvdXQoKSkpOworCisJLy8gaW5pdCB0b29sIGJhcgorCWJhY2tBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCXRvb2xCYXItPmFkZFNlcGFyYXRvcigpOworCWxvYWRBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCXNhdmVBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCXRvb2xCYXItPmFkZFNlcGFyYXRvcigpOworCXNpbmdsZVZpZXdBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCXNwbGl0Vmlld0FjdGlvbi0+YWRkVG8odG9vbEJhcik7CisJZnVsbFZpZXdBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCisJLy8gY3JlYXRlIGNvbmZpZyBtZW51CisJUVBvcHVwTWVudSogY29uZmlnID0gbmV3IFFQb3B1cE1lbnUodGhpcyk7CisJbWVudS0+aW5zZXJ0SXRlbSgiJkZpbGUiLCBjb25maWcpOworCWxvYWRBY3Rpb24tPmFkZFRvKGNvbmZpZyk7CisJc2F2ZUFjdGlvbi0+YWRkVG8oY29uZmlnKTsKKwlzYXZlQXNBY3Rpb24tPmFkZFRvKGNvbmZpZyk7CisJY29uZmlnLT5pbnNlcnRTZXBhcmF0b3IoKTsKKwlxdWl0QWN0aW9uLT5hZGRUbyhjb25maWcpOworCisJLy8gY3JlYXRlIG9wdGlvbnMgbWVudQorCVFQb3B1cE1lbnUqIG9wdGlvbk1lbnUgPSBuZXcgUVBvcHVwTWVudSh0aGlzKTsKKwltZW51LT5pbnNlcnRJdGVtKCImT3B0aW9uIiwgb3B0aW9uTWVudSk7CisJc2hvd05hbWVBY3Rpb24tPmFkZFRvKG9wdGlvbk1lbnUpOworCXNob3dSYW5nZUFjdGlvbi0+YWRkVG8ob3B0aW9uTWVudSk7CisJc2hvd0RhdGFBY3Rpb24tPmFkZFRvKG9wdGlvbk1lbnUpOworCW9wdGlvbk1lbnUtPmluc2VydFNlcGFyYXRvcigpOworCXNob3dBbGxBY3Rpb24tPmFkZFRvKG9wdGlvbk1lbnUpOworCXNob3dEZWJ1Z0FjdGlvbi0+YWRkVG8ob3B0aW9uTWVudSk7CisKKwkvLyBjcmVhdGUgaGVscCBtZW51CisJUVBvcHVwTWVudSogaGVscE1lbnUgPSBuZXcgUVBvcHVwTWVudSh0aGlzKTsKKwltZW51LT5pbnNlcnRTZXBhcmF0b3IoKTsKKwltZW51LT5pbnNlcnRJdGVtKCImSGVscCIsIGhlbHBNZW51KTsKKwlzaG93SW50cm9BY3Rpb24tPmFkZFRvKGhlbHBNZW51KTsKKwlzaG93QWJvdXRBY3Rpb24tPmFkZFRvKGhlbHBNZW51KTsKKworCWNvbm5lY3QoY29uZmlnTGlzdCwgU0lHTkFMKG1lbnVTZWxlY3RlZChzdHJ1Y3QgbWVudSAqKSksCisJCVNMT1QoY2hhbmdlTWVudShzdHJ1Y3QgbWVudSAqKSkpOworCWNvbm5lY3QoY29uZmlnTGlzdCwgU0lHTkFMKHBhcmVudFNlbGVjdGVkKCkpLAorCQlTTE9UKGdvQmFjaygpKSk7CisJY29ubmVjdChtZW51TGlzdCwgU0lHTkFMKG1lbnVTZWxlY3RlZChzdHJ1Y3QgbWVudSAqKSksCisJCVNMT1QoY2hhbmdlTWVudShzdHJ1Y3QgbWVudSAqKSkpOworCisJY29ubmVjdChjb25maWdMaXN0LCBTSUdOQUwoZ290Rm9jdXModm9pZCkpLAorCQlTTE9UKGxpc3RGb2N1c0NoYW5nZWQodm9pZCkpKTsKKwljb25uZWN0KG1lbnVMaXN0LCBTSUdOQUwoZ290Rm9jdXModm9pZCkpLAorCQlTTE9UKGxpc3RGb2N1c0NoYW5nZWQodm9pZCkpKTsKKworI2lmIFFUX1ZFUlNJT04gPj0gMzAwCisJUVN0cmluZyBsaXN0TW9kZSA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkRW50cnkoIi9rY29uZmlnL3Fjb25mL2xpc3RNb2RlIiwgInN5bWJvbCIpOworCWlmIChsaXN0TW9kZSA9PSAic2luZ2xlIikKKwkJc2hvd1NpbmdsZVZpZXcoKTsKKwllbHNlIGlmIChsaXN0TW9kZSA9PSAiZnVsbCIpCisJCXNob3dGdWxsVmlldygpOworCWVsc2UgLyppZiAobGlzdE1vZGUgPT0gInNwbGl0IikqLworCQlzaG93U3BsaXRWaWV3KCk7CisKKwkvLyBVSSBzZXR1cCBkb25lLCByZXN0b3JlIHNwbGl0dGVyIHBvc2l0aW9ucworCVFWYWx1ZUxpc3Q8aW50PiBzaXplcyA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkU2l6ZXMoIi9rY29uZmlnL3Fjb25mL3NwbGl0MSIsICZvayk7CisJaWYgKG9rKQorCQlzcGxpdDEtPnNldFNpemVzKHNpemVzKTsKKworCXNpemVzID0gY29uZmlnU2V0dGluZ3MtPnJlYWRTaXplcygiL2tjb25maWcvcWNvbmYvc3BsaXQyIiwgJm9rKTsKKwlpZiAob2spCisJCXNwbGl0Mi0+c2V0U2l6ZXMoc2l6ZXMpOworI2Vsc2UKKwlzaG93U3BsaXRWaWV3KCk7CisjZW5kaWYKKwlkZWxldGUgY29uZmlnU2V0dGluZ3M7Cit9CisKK3N0YXRpYyBRU3RyaW5nIHByaW50X2ZpbHRlcihjb25zdCBRU3RyaW5nICZzdHIpCit7CisJUVJlZ0V4cCByZSgiWzw+JlwiXFxuXSIpOworCVFTdHJpbmcgcmVzID0gc3RyOworCWZvciAoaW50IGkgPSAwOyAoaSA9IHJlcy5maW5kKHJlLCBpKSkgPj0gMDspIHsKKwkJc3dpdGNoIChyZXNbaV0ubGF0aW4xKCkpIHsKKwkJY2FzZSAnPCc6CisJCQlyZXMucmVwbGFjZShpLCAxLCAiJmx0OyIpOworCQkJaSArPSA0OworCQkJYnJlYWs7CisJCWNhc2UgJz4nOgorCQkJcmVzLnJlcGxhY2UoaSwgMSwgIiZndDsiKTsKKwkJCWkgKz0gNDsKKwkJCWJyZWFrOworCQljYXNlICcmJzoKKwkJCXJlcy5yZXBsYWNlKGksIDEsICImYW1wOyIpOworCQkJaSArPSA1OworCQkJYnJlYWs7CisJCWNhc2UgJyInOgorCQkJcmVzLnJlcGxhY2UoaSwgMSwgIiZxdW90OyIpOworCQkJaSArPSA2OworCQkJYnJlYWs7CisJCWNhc2UgJ1xuJzoKKwkJCXJlcy5yZXBsYWNlKGksIDEsICI8YnI+Iik7CisJCQlpICs9IDQ7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBleHByX3ByaW50X2hlbHAodm9pZCAqZGF0YSwgY29uc3QgY2hhciAqc3RyKQoreworCXJlaW50ZXJwcmV0X2Nhc3Q8UVN0cmluZyo+KGRhdGEpLT5hcHBlbmQocHJpbnRfZmlsdGVyKHN0cikpOworfQorCisvKgorICogZGlzcGxheSBhIG5ldyBoZWxwIGVudHJ5IGFzIHNvb24gYXMgYSBuZXcgbWVudSBlbnRyeSBpcyBzZWxlY3RlZAorICovCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNldEhlbHAoUUxpc3RWaWV3SXRlbSogaXRlbSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sKiBzeW07CisJc3RydWN0IG1lbnUqIG1lbnUgPSAwOworCisJY29uZmlnTGlzdC0+cGFyZW50KCktPmxpbmVFZGl0LT5oaWRlKCk7CisJaWYgKGl0ZW0pCisJCW1lbnUgPSAoKENvbmZpZ0l0ZW0qKWl0ZW0pLT5tZW51OworCWlmICghbWVudSkgeworCQloZWxwVGV4dC0+c2V0VGV4dChRU3RyaW5nOjpudWxsKTsKKwkJcmV0dXJuOworCX0KKworCVFTdHJpbmcgaGVhZCwgZGVidWcsIGhlbHA7CisJbWVudSA9ICgoQ29uZmlnSXRlbSopaXRlbSktPm1lbnU7CisJc3ltID0gbWVudS0+c3ltOworCWlmIChzeW0pIHsKKwkJaWYgKG1lbnUtPnByb21wdCkgeworCQkJaGVhZCArPSAiPGJpZz48Yj4iOworCQkJaGVhZCArPSBwcmludF9maWx0ZXIoXyhtZW51LT5wcm9tcHQtPnRleHQpKTsKKwkJCWhlYWQgKz0gIjwvYj48L2JpZz4iOworCQkJaWYgKHN5bS0+bmFtZSkgeworCQkJCWhlYWQgKz0gIiAoIjsKKwkJCQloZWFkICs9IHByaW50X2ZpbHRlcihfKHN5bS0+bmFtZSkpOworCQkJCWhlYWQgKz0gIikiOworCQkJfQorCQl9IGVsc2UgaWYgKHN5bS0+bmFtZSkgeworCQkJaGVhZCArPSAiPGJpZz48Yj4iOworCQkJaGVhZCArPSBwcmludF9maWx0ZXIoXyhzeW0tPm5hbWUpKTsKKwkJCWhlYWQgKz0gIjwvYj48L2JpZz4iOworCQl9CisJCWhlYWQgKz0gIjxicj48YnI+IjsKKworCQlpZiAoc2hvd0RlYnVnKSB7CisJCQlkZWJ1ZyArPSAidHlwZTogIjsKKwkJCWRlYnVnICs9IHByaW50X2ZpbHRlcihzeW1fdHlwZV9uYW1lKHN5bS0+dHlwZSkpOworCQkJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSkKKwkJCQlkZWJ1ZyArPSAiIChjaG9pY2UpIjsKKwkJCWRlYnVnICs9ICI8YnI+IjsKKwkJCWlmIChzeW0tPnJldl9kZXAuZXhwcikgeworCQkJCWRlYnVnICs9ICJyZXZlcnNlIGRlcDogIjsKKwkJCQlleHByX3ByaW50KHN5bS0+cmV2X2RlcC5leHByLCBleHByX3ByaW50X2hlbHAsICZkZWJ1ZywgRV9OT05FKTsKKwkJCQlkZWJ1ZyArPSAiPGJyPiI7CisJCQl9CisJCQlmb3IgKHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCA9IHN5bS0+cHJvcDsgcHJvcDsgcHJvcCA9IHByb3AtPm5leHQpIHsKKwkJCQlzd2l0Y2ggKHByb3AtPnR5cGUpIHsKKwkJCQljYXNlIFBfUFJPTVBUOgorCQkJCWNhc2UgUF9NRU5VOgorCQkJCQlkZWJ1ZyArPSAicHJvbXB0OiAiOworCQkJCQlkZWJ1ZyArPSBwcmludF9maWx0ZXIoXyhwcm9wLT50ZXh0KSk7CisJCQkJCWRlYnVnICs9ICI8YnI+IjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBQX0RFRkFVTFQ6CisJCQkJCWRlYnVnICs9ICJkZWZhdWx0OiAiOworCQkJCQlleHByX3ByaW50KHByb3AtPmV4cHIsIGV4cHJfcHJpbnRfaGVscCwgJmRlYnVnLCBFX05PTkUpOworCQkJCQlkZWJ1ZyArPSAiPGJyPiI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUF9DSE9JQ0U6CisJCQkJCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpIHsKKwkJCQkJCWRlYnVnICs9ICJjaG9pY2U6ICI7CisJCQkJCQlleHByX3ByaW50KHByb3AtPmV4cHIsIGV4cHJfcHJpbnRfaGVscCwgJmRlYnVnLCBFX05PTkUpOworCQkJCQkJZGVidWcgKz0gIjxicj4iOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUF9TRUxFQ1Q6CisJCQkJCWRlYnVnICs9ICJzZWxlY3Q6ICI7CisJCQkJCWV4cHJfcHJpbnQocHJvcC0+ZXhwciwgZXhwcl9wcmludF9oZWxwLCAmZGVidWcsIEVfTk9ORSk7CisJCQkJCWRlYnVnICs9ICI8YnI+IjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBQX1JBTkdFOgorCQkJCQlkZWJ1ZyArPSAicmFuZ2U6ICI7CisJCQkJCWV4cHJfcHJpbnQocHJvcC0+ZXhwciwgZXhwcl9wcmludF9oZWxwLCAmZGVidWcsIEVfTk9ORSk7CisJCQkJCWRlYnVnICs9ICI8YnI+IjsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJZGVidWcgKz0gInVua25vd24gcHJvcGVydHk6ICI7CisJCQkJCWRlYnVnICs9IHByb3BfZ2V0X3R5cGVfbmFtZShwcm9wLT50eXBlKTsKKwkJCQkJZGVidWcgKz0gIjxicj4iOworCQkJCX0KKwkJCQlpZiAocHJvcC0+dmlzaWJsZS5leHByKSB7CisJCQkJCWRlYnVnICs9ICImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtkZXA6ICI7CisJCQkJCWV4cHJfcHJpbnQocHJvcC0+dmlzaWJsZS5leHByLCBleHByX3ByaW50X2hlbHAsICZkZWJ1ZywgRV9OT05FKTsKKwkJCQkJZGVidWcgKz0gIjxicj4iOworCQkJCX0KKwkJCX0KKwkJCWRlYnVnICs9ICI8YnI+IjsKKwkJfQorCisJCWhlbHAgPSBwcmludF9maWx0ZXIoXyhzeW0tPmhlbHApKTsKKwl9IGVsc2UgaWYgKG1lbnUtPnByb21wdCkgeworCQloZWFkICs9ICI8YmlnPjxiPiI7CisJCWhlYWQgKz0gcHJpbnRfZmlsdGVyKF8obWVudS0+cHJvbXB0LT50ZXh0KSk7CisJCWhlYWQgKz0gIjwvYj48L2JpZz48YnI+PGJyPiI7CisJCWlmIChzaG93RGVidWcpIHsKKwkJCWlmIChtZW51LT5wcm9tcHQtPnZpc2libGUuZXhwcikgeworCQkJCWRlYnVnICs9ICImbmJzcDsmbmJzcDtkZXA6ICI7CisJCQkJZXhwcl9wcmludChtZW51LT5wcm9tcHQtPnZpc2libGUuZXhwciwgZXhwcl9wcmludF9oZWxwLCAmZGVidWcsIEVfTk9ORSk7CisJCQkJZGVidWcgKz0gIjxicj48YnI+IjsKKwkJCX0KKwkJfQorCX0KKwlpZiAoc2hvd0RlYnVnKQorCQlkZWJ1ZyArPSBRU3RyaW5nKCkuc3ByaW50ZigiZGVmaW5lZCBhdCAlczolZDxicj48YnI+IiwgbWVudS0+ZmlsZS0+bmFtZSwgbWVudS0+bGluZW5vKTsKKwloZWxwVGV4dC0+c2V0VGV4dChoZWFkICsgZGVidWcgKyBoZWxwKTsKK30KKwordm9pZCBDb25maWdNYWluV2luZG93Ojpsb2FkQ29uZmlnKHZvaWQpCit7CisJUVN0cmluZyBzID0gUUZpbGVEaWFsb2c6OmdldE9wZW5GaWxlTmFtZSgiLmNvbmZpZyIsIE5VTEwsIHRoaXMpOworCWlmIChzLmlzTnVsbCgpKQorCQlyZXR1cm47CisJaWYgKGNvbmZfcmVhZChRRmlsZTo6ZW5jb2RlTmFtZShzKSkpCisJCVFNZXNzYWdlQm94OjppbmZvcm1hdGlvbih0aGlzLCAicWNvbmYiLCAiVW5hYmxlIHRvIGxvYWQgY29uZmlndXJhdGlvbiEiKTsKKwlDb25maWdWaWV3Ojp1cGRhdGVMaXN0QWxsKCk7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2F2ZUNvbmZpZyh2b2lkKQoreworCWlmIChjb25mX3dyaXRlKE5VTEwpKQorCQlRTWVzc2FnZUJveDo6aW5mb3JtYXRpb24odGhpcywgInFjb25mIiwgIlVuYWJsZSB0byBzYXZlIGNvbmZpZ3VyYXRpb24hIik7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2F2ZUNvbmZpZ0FzKHZvaWQpCit7CisJUVN0cmluZyBzID0gUUZpbGVEaWFsb2c6OmdldFNhdmVGaWxlTmFtZSgiLmNvbmZpZyIsIE5VTEwsIHRoaXMpOworCWlmIChzLmlzTnVsbCgpKQorCQlyZXR1cm47CisJaWYgKGNvbmZfd3JpdGUoUUZpbGU6OmVuY29kZU5hbWUocykpKQorCQlRTWVzc2FnZUJveDo6aW5mb3JtYXRpb24odGhpcywgInFjb25mIiwgIlVuYWJsZSB0byBzYXZlIGNvbmZpZ3VyYXRpb24hIik7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6Y2hhbmdlTWVudShzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwljb25maWdMaXN0LT5zZXRSb290TWVudShtZW51KTsKKwliYWNrQWN0aW9uLT5zZXRFbmFibGVkKFRSVUUpOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6Omxpc3RGb2N1c0NoYW5nZWQodm9pZCkKK3sKKwlpZiAobWVudUxpc3QtPmhhc0ZvY3VzKCkpIHsKKwkJaWYgKG1lbnVMaXN0LT5tb2RlID09IG1lbnVNb2RlKQorCQkJY29uZmlnTGlzdC0+Y2xlYXJTZWxlY3Rpb24oKTsKKwkJc2V0SGVscChtZW51TGlzdC0+c2VsZWN0ZWRJdGVtKCkpOworCX0gZWxzZSBpZiAoY29uZmlnTGlzdC0+aGFzRm9jdXMoKSkgeworCQlzZXRIZWxwKGNvbmZpZ0xpc3QtPnNlbGVjdGVkSXRlbSgpKTsKKwl9Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6Z29CYWNrKHZvaWQpCit7CisJQ29uZmlnSXRlbSogaXRlbTsKKworCWNvbmZpZ0xpc3QtPnNldFBhcmVudE1lbnUoKTsKKwlpZiAoY29uZmlnTGlzdC0+cm9vdEVudHJ5ID09ICZyb290bWVudSkKKwkJYmFja0FjdGlvbi0+c2V0RW5hYmxlZChGQUxTRSk7CisJaXRlbSA9IChDb25maWdJdGVtKiltZW51TGlzdC0+c2VsZWN0ZWRJdGVtKCk7CisJd2hpbGUgKGl0ZW0pIHsKKwkJaWYgKGl0ZW0tPm1lbnUgPT0gY29uZmlnTGlzdC0+cm9vdEVudHJ5KSB7CisJCQltZW51TGlzdC0+c2V0U2VsZWN0ZWQoaXRlbSwgVFJVRSk7CisJCQlicmVhazsKKwkJfQorCQlpdGVtID0gKENvbmZpZ0l0ZW0qKWl0ZW0tPnBhcmVudCgpOworCX0KK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpzaG93U2luZ2xlVmlldyh2b2lkKQoreworCW1lbnVWaWV3LT5oaWRlKCk7CisJbWVudUxpc3QtPnNldFJvb3RNZW51KDApOworCWNvbmZpZ0xpc3QtPm1vZGUgPSBzaW5nbGVNb2RlOworCWlmIChjb25maWdMaXN0LT5yb290RW50cnkgPT0gJnJvb3RtZW51KQorCQljb25maWdMaXN0LT51cGRhdGVMaXN0QWxsKCk7CisJZWxzZQorCQljb25maWdMaXN0LT5zZXRSb290TWVudSgmcm9vdG1lbnUpOworCWNvbmZpZ0xpc3QtPnNldEFsbE9wZW4oVFJVRSk7CisJY29uZmlnTGlzdC0+c2V0Rm9jdXMoKTsKK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpzaG93U3BsaXRWaWV3KHZvaWQpCit7CisJY29uZmlnTGlzdC0+bW9kZSA9IHN5bWJvbE1vZGU7CisJaWYgKGNvbmZpZ0xpc3QtPnJvb3RFbnRyeSA9PSAmcm9vdG1lbnUpCisJCWNvbmZpZ0xpc3QtPnVwZGF0ZUxpc3RBbGwoKTsKKwllbHNlCisJCWNvbmZpZ0xpc3QtPnNldFJvb3RNZW51KCZyb290bWVudSk7CisJY29uZmlnTGlzdC0+c2V0QWxsT3BlbihUUlVFKTsKKwljb25maWdBcHAtPnByb2Nlc3NFdmVudHMoKTsKKwltZW51TGlzdC0+bW9kZSA9IG1lbnVNb2RlOworCW1lbnVMaXN0LT5zZXRSb290TWVudSgmcm9vdG1lbnUpOworCW1lbnVMaXN0LT5zZXRBbGxPcGVuKFRSVUUpOworCW1lbnVWaWV3LT5zaG93KCk7CisJbWVudUxpc3QtPnNldEZvY3VzKCk7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2hvd0Z1bGxWaWV3KHZvaWQpCit7CisJbWVudVZpZXctPmhpZGUoKTsKKwltZW51TGlzdC0+c2V0Um9vdE1lbnUoMCk7CisJY29uZmlnTGlzdC0+bW9kZSA9IGZ1bGxNb2RlOworCWlmIChjb25maWdMaXN0LT5yb290RW50cnkgPT0gJnJvb3RtZW51KQorCQljb25maWdMaXN0LT51cGRhdGVMaXN0QWxsKCk7CisJZWxzZQorCQljb25maWdMaXN0LT5zZXRSb290TWVudSgmcm9vdG1lbnUpOworCWNvbmZpZ0xpc3QtPnNldEFsbE9wZW4oRkFMU0UpOworCWNvbmZpZ0xpc3QtPnNldEZvY3VzKCk7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2V0U2hvd0FsbChib29sIGIpCit7CisJaWYgKGNvbmZpZ0xpc3QtPnNob3dBbGwgPT0gYikKKwkJcmV0dXJuOworCWNvbmZpZ0xpc3QtPnNob3dBbGwgPSBiOworCWNvbmZpZ0xpc3QtPnVwZGF0ZUxpc3RBbGwoKTsKKwltZW51TGlzdC0+c2hvd0FsbCA9IGI7CisJbWVudUxpc3QtPnVwZGF0ZUxpc3RBbGwoKTsKK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpzZXRTaG93RGVidWcoYm9vbCBiKQoreworCWlmIChzaG93RGVidWcgPT0gYikKKwkJcmV0dXJuOworCXNob3dEZWJ1ZyA9IGI7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2V0U2hvd05hbWUoYm9vbCBiKQoreworCWlmIChjb25maWdMaXN0LT5zaG93TmFtZSA9PSBiKQorCQlyZXR1cm47CisJY29uZmlnTGlzdC0+c2hvd05hbWUgPSBiOworCWNvbmZpZ0xpc3QtPnJlaW5pdCgpOworCW1lbnVMaXN0LT5zaG93TmFtZSA9IGI7CisJbWVudUxpc3QtPnJlaW5pdCgpOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNldFNob3dSYW5nZShib29sIGIpCit7CisJaWYgKGNvbmZpZ0xpc3QtPnNob3dSYW5nZSA9PSBiKQorCQlyZXR1cm47CisJY29uZmlnTGlzdC0+c2hvd1JhbmdlID0gYjsKKwljb25maWdMaXN0LT5yZWluaXQoKTsKKwltZW51TGlzdC0+c2hvd1JhbmdlID0gYjsKKwltZW51TGlzdC0+cmVpbml0KCk7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2V0U2hvd0RhdGEoYm9vbCBiKQoreworCWlmIChjb25maWdMaXN0LT5zaG93RGF0YSA9PSBiKQorCQlyZXR1cm47CisJY29uZmlnTGlzdC0+c2hvd0RhdGEgPSBiOworCWNvbmZpZ0xpc3QtPnJlaW5pdCgpOworCW1lbnVMaXN0LT5zaG93RGF0YSA9IGI7CisJbWVudUxpc3QtPnJlaW5pdCgpOworfQorCisvKgorICogYXNrIGZvciBzYXZpbmcgY29uZmlndXJhdGlvbiBiZWZvcmUgcXVpdHRpbmcKKyAqIFRPRE8gYXNrIG9ubHkgd2hlbiBzb21ldGhpbmcgY2hhbmdlZAorICovCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OmNsb3NlRXZlbnQoUUNsb3NlRXZlbnQqIGUpCit7CisJaWYgKCFzeW1fY2hhbmdlX2NvdW50KSB7CisJCWUtPmFjY2VwdCgpOworCQlyZXR1cm47CisJfQorCVFNZXNzYWdlQm94IG1iKCJxY29uZiIsICJTYXZlIGNvbmZpZ3VyYXRpb24/IiwgUU1lc3NhZ2VCb3g6Oldhcm5pbmcsCisJCQlRTWVzc2FnZUJveDo6WWVzIHwgUU1lc3NhZ2VCb3g6OkRlZmF1bHQsIFFNZXNzYWdlQm94OjpObywgUU1lc3NhZ2VCb3g6OkNhbmNlbCB8IFFNZXNzYWdlQm94OjpFc2NhcGUpOworCW1iLnNldEJ1dHRvblRleHQoUU1lc3NhZ2VCb3g6OlllcywgIiZTYXZlIENoYW5nZXMiKTsKKwltYi5zZXRCdXR0b25UZXh0KFFNZXNzYWdlQm94OjpObywgIiZEaXNjYXJkIENoYW5nZXMiKTsKKwltYi5zZXRCdXR0b25UZXh0KFFNZXNzYWdlQm94OjpDYW5jZWwsICJDYW5jZWwgRXhpdCIpOworCXN3aXRjaCAobWIuZXhlYygpKSB7CisJY2FzZSBRTWVzc2FnZUJveDo6WWVzOgorCQljb25mX3dyaXRlKE5VTEwpOworCWNhc2UgUU1lc3NhZ2VCb3g6Ok5vOgorCQllLT5hY2NlcHQoKTsKKwkJYnJlYWs7CisJY2FzZSBRTWVzc2FnZUJveDo6Q2FuY2VsOgorCQllLT5pZ25vcmUoKTsKKwkJYnJlYWs7CisJfQorfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNob3dJbnRybyh2b2lkKQoreworCXN0YXRpYyBjaGFyIHN0cltdID0gIldlbGNvbWUgdG8gdGhlIHFjb25mIGdyYXBoaWNhbCBjb25maWd1cmF0aW9uIHRvb2wuXG5cbiIKKwkJIkZvciBlYWNoIG9wdGlvbiwgYSBibGFuayBib3ggaW5kaWNhdGVzIHRoZSBmZWF0dXJlIGlzIGRpc2FibGVkLCBhIGNoZWNrXG4iCisJCSJpbmRpY2F0ZXMgaXQgaXMgZW5hYmxlZCwgYW5kIGEgZG90IGluZGljYXRlcyB0aGF0IGl0IGlzIHRvIGJlIGNvbXBpbGVkXG4iCisJCSJhcyBhIG1vZHVsZS4gIENsaWNraW5nIG9uIHRoZSBib3ggd2lsbCBjeWNsZSB0aHJvdWdoIHRoZSB0aHJlZSBzdGF0ZXMuXG5cbiIKKwkJIklmIHlvdSBkbyBub3Qgc2VlIGFuIG9wdGlvbiAoZS5nLiwgYSBkZXZpY2UgZHJpdmVyKSB0aGF0IHlvdSBiZWxpZXZlXG4iCisJCSJzaG91bGQgYmUgcHJlc2VudCwgdHJ5IHR1cm5pbmcgb24gU2hvdyBBbGwgT3B0aW9ucyB1bmRlciB0aGUgT3B0aW9ucyBtZW51LlxuIgorCQkiQWx0aG91Z2ggdGhlcmUgaXMgbm8gY3Jvc3MgcmVmZXJlbmNlIHlldCB0byBoZWxwIHlvdSBmaWd1cmUgb3V0IHdoYXQgb3RoZXJcbiIKKwkJIm9wdGlvbnMgbXVzdCBiZSBlbmFibGVkIHRvIHN1cHBvcnQgdGhlIG9wdGlvbiB5b3UgYXJlIGludGVyZXN0ZWQgaW4sIHlvdSBjYW5cbiIKKwkJInN0aWxsIHZpZXcgdGhlIGhlbHAgb2YgYSBncmF5ZWQtb3V0IG9wdGlvbi5cblxuIgorCQkiVG9nZ2xpbmcgU2hvdyBEZWJ1ZyBJbmZvIHVuZGVyIHRoZSBPcHRpb25zIG1lbnUgd2lsbCBzaG93IHRoZSBkZXBlbmRlbmNpZXMsXG4iCisJCSJ3aGljaCB5b3UgY2FuIHRoZW4gbWF0Y2ggYnkgZXhhbWluaW5nIG90aGVyIG9wdGlvbnMuXG5cbiI7CisKKwlRTWVzc2FnZUJveDo6aW5mb3JtYXRpb24odGhpcywgInFjb25mIiwgc3RyKTsKK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpzaG93QWJvdXQodm9pZCkKK3sKKwlzdGF0aWMgY2hhciBzdHJbXSA9ICJxY29uZiBpcyBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+LlxuIjsKKworCVFNZXNzYWdlQm94OjppbmZvcm1hdGlvbih0aGlzLCAicWNvbmYiLCBzdHIpOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNhdmVTZXR0aW5ncyh2b2lkKQoreworI2lmIFFUX1ZFUlNJT04gPj0gMzAwCisJQ29uZmlnU2V0dGluZ3MgKmNvbmZpZ1NldHRpbmdzID0gbmV3IENvbmZpZ1NldHRpbmdzOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi93aW5kb3cgeCIsIHBvcygpLngoKSk7CisJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9rY29uZmlnL3Fjb25mL3dpbmRvdyB5IiwgcG9zKCkueSgpKTsKKwljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL2tjb25maWcvcWNvbmYvd2luZG93IHdpZHRoIiwgc2l6ZSgpLndpZHRoKCkpOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi93aW5kb3cgaGVpZ2h0Iiwgc2l6ZSgpLmhlaWdodCgpKTsKKwljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL2tjb25maWcvcWNvbmYvc2hvd05hbWUiLCBjb25maWdMaXN0LT5zaG93TmFtZSk7CisJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dSYW5nZSIsIGNvbmZpZ0xpc3QtPnNob3dSYW5nZSk7CisJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dEYXRhIiwgY29uZmlnTGlzdC0+c2hvd0RhdGEpOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi9zaG93QWxsIiwgY29uZmlnTGlzdC0+c2hvd0FsbCk7CisJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dEZWJ1ZyIsIHNob3dEZWJ1Zyk7CisKKwlRU3RyaW5nIGVudHJ5OworCXN3aXRjaChjb25maWdMaXN0LT5tb2RlKSB7CisJY2FzZSBzaW5nbGVNb2RlIDoKKwkJZW50cnkgPSAic2luZ2xlIjsKKwkJYnJlYWs7CisKKwljYXNlIHN5bWJvbE1vZGUgOgorCQllbnRyeSA9ICJzcGxpdCI7CisJCWJyZWFrOworCisJY2FzZSBmdWxsTW9kZSA6CisJCWVudHJ5ID0gImZ1bGwiOworCQlicmVhazsKKwl9CisJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9rY29uZmlnL3Fjb25mL2xpc3RNb2RlIiwgZW50cnkpOworCisJY29uZmlnU2V0dGluZ3MtPndyaXRlU2l6ZXMoIi9rY29uZmlnL3Fjb25mL3NwbGl0MSIsIHNwbGl0MS0+c2l6ZXMoKSk7CisJY29uZmlnU2V0dGluZ3MtPndyaXRlU2l6ZXMoIi9rY29uZmlnL3Fjb25mL3NwbGl0MiIsIHNwbGl0Mi0+c2l6ZXMoKSk7CisKKwlkZWxldGUgY29uZmlnU2V0dGluZ3M7CisjZW5kaWYKK30KKwordm9pZCBmaXh1cF9yb290bWVudShzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisJc3RhdGljIGludCBtZW51X2NudCA9IDA7CisKKwltZW51LT5mbGFncyB8PSBNRU5VX1JPT1Q7CisJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisJCWlmIChjaGlsZC0+cHJvbXB0ICYmIGNoaWxkLT5wcm9tcHQtPnR5cGUgPT0gUF9NRU5VKSB7CisJCQltZW51X2NudCsrOworCQkJZml4dXBfcm9vdG1lbnUoY2hpbGQpOworCQkJbWVudV9jbnQtLTsKKwkJfSBlbHNlIGlmICghbWVudV9jbnQpCisJCQlmaXh1cF9yb290bWVudShjaGlsZCk7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqcHJvZ25hbWU7CisKK3N0YXRpYyB2b2lkIHVzYWdlKHZvaWQpCit7CisJcHJpbnRmKCIlcyA8Y29uZmlnPlxuIiwgcHJvZ25hbWUpOworCWV4aXQoMCk7Cit9CisKK2ludCBtYWluKGludCBhYywgY2hhcioqIGF2KQoreworCUNvbmZpZ01haW5XaW5kb3cqIHY7CisJY29uc3QgY2hhciAqbmFtZTsKKworCWJpbmR0ZXh0ZG9tYWluKFBBQ0tBR0UsIExPQ0FMRURJUik7CisJdGV4dGRvbWFpbihQQUNLQUdFKTsKKworI2lmbmRlZiBMS0NfRElSRUNUX0xJTksKKwlrY29uZmlnX2xvYWQoKTsKKyNlbmRpZgorCisJcHJvZ25hbWUgPSBhdlswXTsKKwljb25maWdBcHAgPSBuZXcgUUFwcGxpY2F0aW9uKGFjLCBhdik7CisJaWYgKGFjID4gMSAmJiBhdlsxXVswXSA9PSAnLScpIHsKKwkJc3dpdGNoIChhdlsxXVsxXSkgeworCQljYXNlICdoJzoKKwkJY2FzZSAnPyc6CisJCQl1c2FnZSgpOworCQl9CisJCW5hbWUgPSBhdlsyXTsKKwl9IGVsc2UKKwkJbmFtZSA9IGF2WzFdOworCWlmICghbmFtZSkKKwkJdXNhZ2UoKTsKKworCWNvbmZfcGFyc2UobmFtZSk7CisJZml4dXBfcm9vdG1lbnUoJnJvb3RtZW51KTsKKwljb25mX3JlYWQoTlVMTCk7CisJLy96Y29uZmR1bXAoc3Rkb3V0KTsKKworCXYgPSBuZXcgQ29uZmlnTWFpbldpbmRvdygpOworCisJLy96Y29uZmR1bXAoc3Rkb3V0KTsKKwl2LT5zaG93KCk7CisJY29uZmlnQXBwLT5jb25uZWN0KGNvbmZpZ0FwcCwgU0lHTkFMKGxhc3RXaW5kb3dDbG9zZWQoKSksIFNMT1QocXVpdCgpKSk7CisJY29uZmlnQXBwLT5jb25uZWN0KGNvbmZpZ0FwcCwgU0lHTkFMKGFib3V0VG9RdWl0KCkpLCB2LCBTTE9UKHNhdmVTZXR0aW5ncygpKSk7CisJY29uZmlnQXBwLT5leGVjKCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9xY29uZi5oIGIvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUyZjNlOQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9xY29uZi5oCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2luY2x1ZGUgPHFsaXN0dmlldy5oPgorI2lmIFFUX1ZFUlNJT04gPj0gMzAwCisjaW5jbHVkZSA8cXNldHRpbmdzLmg+CisjZWxzZQorY2xhc3MgUVNldHRpbmdzIHsgfTsKKyNlbmRpZgorCitjbGFzcyBDb25maWdMaXN0OworY2xhc3MgQ29uZmlnSXRlbTsKK2NsYXNzIENvbmZpZ0xpbmVFZGl0OworY2xhc3MgQ29uZmlnTWFpbldpbmRvdzsKKworCitjbGFzcyBDb25maWdTZXR0aW5ncyA6IHB1YmxpYyBRU2V0dGluZ3MgeworcHVibGljOgorCUNvbmZpZ1NldHRpbmdzKCk7CisKKyNpZiBRVF9WRVJTSU9OID49IDMwMAorCXZvaWQgcmVhZExpc3RTZXR0aW5ncygpOworCVFWYWx1ZUxpc3Q8aW50PiByZWFkU2l6ZXMoY29uc3QgUVN0cmluZyYga2V5LCBib29sICpvayk7CisJYm9vbCB3cml0ZVNpemVzKGNvbnN0IFFTdHJpbmcmIGtleSwgY29uc3QgUVZhbHVlTGlzdDxpbnQ+JiB2YWx1ZSk7CisjZW5kaWYKKworCWJvb2wgc2hvd0FsbDsKKwlib29sIHNob3dOYW1lOworCWJvb2wgc2hvd1JhbmdlOworCWJvb2wgc2hvd0RhdGE7Cit9OworCitjbGFzcyBDb25maWdWaWV3IDogcHVibGljIFFWQm94IHsKKwlRX09CSkVDVAorCXR5cGVkZWYgY2xhc3MgUVZCb3ggUGFyZW50OworcHVibGljOgorCUNvbmZpZ1ZpZXcoUVdpZGdldCogcGFyZW50LCBDb25maWdNYWluV2luZG93KiBjdmlldywgQ29uZmlnU2V0dGluZ3MqIGNvbmZpZ1NldHRpbmdzKTsKKwl+Q29uZmlnVmlldyh2b2lkKTsKKwlzdGF0aWMgdm9pZCB1cGRhdGVMaXN0KENvbmZpZ0l0ZW0qIGl0ZW0pOworCXN0YXRpYyB2b2lkIHVwZGF0ZUxpc3RBbGwodm9pZCk7CisKK3B1YmxpYzoKKwlDb25maWdMaXN0KiBsaXN0OworCUNvbmZpZ0xpbmVFZGl0KiBsaW5lRWRpdDsKKworCXN0YXRpYyBDb25maWdWaWV3KiB2aWV3TGlzdDsKKwlDb25maWdWaWV3KiBuZXh0VmlldzsKK307CisKK2VudW0gY29sSWR4IHsKKwlwcm9tcHRDb2xJZHgsIG5hbWVDb2xJZHgsIG5vQ29sSWR4LCBtb2RDb2xJZHgsIHllc0NvbElkeCwgZGF0YUNvbElkeCwgY29sTnIKK307CitlbnVtIGxpc3RNb2RlIHsKKwlzaW5nbGVNb2RlLCBtZW51TW9kZSwgc3ltYm9sTW9kZSwgZnVsbE1vZGUKK307CisKK2NsYXNzIENvbmZpZ0xpc3QgOiBwdWJsaWMgUUxpc3RWaWV3IHsKKwlRX09CSkVDVAorCXR5cGVkZWYgY2xhc3MgUUxpc3RWaWV3IFBhcmVudDsKK3B1YmxpYzoKKwlDb25maWdMaXN0KENvbmZpZ1ZpZXcqIHAsIENvbmZpZ01haW5XaW5kb3cqIGN2aWV3LCBDb25maWdTZXR0aW5ncyAqY29uZmlnU2V0dGluZ3MpOworCXZvaWQgcmVpbml0KHZvaWQpOworCUNvbmZpZ1ZpZXcqIHBhcmVudCh2b2lkKSBjb25zdAorCXsKKwkJcmV0dXJuIChDb25maWdWaWV3KilQYXJlbnQ6OnBhcmVudCgpOworCX0KKworcHJvdGVjdGVkOgorCUNvbmZpZ01haW5XaW5kb3cqIGN2aWV3OworCisJdm9pZCBrZXlQcmVzc0V2ZW50KFFLZXlFdmVudCAqZSk7CisJdm9pZCBjb250ZW50c01vdXNlUHJlc3NFdmVudChRTW91c2VFdmVudCAqZSk7CisJdm9pZCBjb250ZW50c01vdXNlUmVsZWFzZUV2ZW50KFFNb3VzZUV2ZW50ICplKTsKKwl2b2lkIGNvbnRlbnRzTW91c2VNb3ZlRXZlbnQoUU1vdXNlRXZlbnQgKmUpOworCXZvaWQgY29udGVudHNNb3VzZURvdWJsZUNsaWNrRXZlbnQoUU1vdXNlRXZlbnQgKmUpOworCXZvaWQgZm9jdXNJbkV2ZW50KFFGb2N1c0V2ZW50ICplKTsKK3B1YmxpYyBzbG90czoKKwl2b2lkIHNldFJvb3RNZW51KHN0cnVjdCBtZW51ICptZW51KTsKKworCXZvaWQgdXBkYXRlTGlzdChDb25maWdJdGVtICppdGVtKTsKKwl2b2lkIHNldFZhbHVlKENvbmZpZ0l0ZW0qIGl0ZW0sIHRyaXN0YXRlIHZhbCk7CisJdm9pZCBjaGFuZ2VWYWx1ZShDb25maWdJdGVtKiBpdGVtKTsKKwl2b2lkIHVwZGF0ZVNlbGVjdGlvbih2b2lkKTsKK3NpZ25hbHM6CisJdm9pZCBtZW51U2VsZWN0ZWQoc3RydWN0IG1lbnUgKm1lbnUpOworCXZvaWQgcGFyZW50U2VsZWN0ZWQodm9pZCk7CisJdm9pZCBnb3RGb2N1cyh2b2lkKTsKKworcHVibGljOgorCXZvaWQgdXBkYXRlTGlzdEFsbCh2b2lkKQorCXsKKwkJdXBkYXRlQWxsID0gdHJ1ZTsKKwkJdXBkYXRlTGlzdChOVUxMKTsKKwkJdXBkYXRlQWxsID0gZmFsc2U7CisJfQorCUNvbmZpZ0xpc3QqIGxpc3RWaWV3KCkKKwl7CisJCXJldHVybiB0aGlzOworCX0KKwlDb25maWdJdGVtKiBmaXJzdENoaWxkKCkgY29uc3QKKwl7CisJCXJldHVybiAoQ29uZmlnSXRlbSAqKVBhcmVudDo6Zmlyc3RDaGlsZCgpOworCX0KKwlpbnQgbWFwSWR4KGNvbElkeCBpZHgpCisJeworCQlyZXR1cm4gY29sTWFwW2lkeF07CisJfQorCXZvaWQgYWRkQ29sdW1uKGNvbElkeCBpZHgsIGNvbnN0IFFTdHJpbmcmIGxhYmVsKQorCXsKKwkJY29sTWFwW2lkeF0gPSBQYXJlbnQ6OmFkZENvbHVtbihsYWJlbCk7CisJCWNvbFJldk1hcFtjb2xNYXBbaWR4XV0gPSBpZHg7CisJfQorCXZvaWQgcmVtb3ZlQ29sdW1uKGNvbElkeCBpZHgpCisJeworCQlpbnQgY29sID0gY29sTWFwW2lkeF07CisJCWlmIChjb2wgPj0gMCkgeworCQkJUGFyZW50OjpyZW1vdmVDb2x1bW4oY29sKTsKKwkJCWNvbFJldk1hcFtjb2xdID0gY29sTWFwW2lkeF0gPSAtMTsKKwkJfQorCX0KKwl2b2lkIHNldEFsbE9wZW4oYm9vbCBvcGVuKTsKKwl2b2lkIHNldFBhcmVudE1lbnUodm9pZCk7CisKKwl0ZW1wbGF0ZSA8Y2xhc3MgUD4KKwl2b2lkIHVwZGF0ZU1lbnVMaXN0KFAqLCBzdHJ1Y3QgbWVudSopOworCisJYm9vbCB1cGRhdGVBbGw7CisKKwlRUGl4bWFwIHN5bWJvbFllc1BpeCwgc3ltYm9sTW9kUGl4LCBzeW1ib2xOb1BpeDsKKwlRUGl4bWFwIGNob2ljZVllc1BpeCwgY2hvaWNlTm9QaXg7CisJUVBpeG1hcCBtZW51UGl4LCBtZW51SW52UGl4LCBtZW51QmFja1BpeCwgdm9pZFBpeDsKKworCWJvb2wgc2hvd0FsbCwgc2hvd05hbWUsIHNob3dSYW5nZSwgc2hvd0RhdGE7CisJZW51bSBsaXN0TW9kZSBtb2RlOworCXN0cnVjdCBtZW51ICpyb290RW50cnk7CisJUUNvbG9yR3JvdXAgZGlzYWJsZWRDb2xvckdyb3VwOworCVFDb2xvckdyb3VwIGluYWN0aXZlZENvbG9yR3JvdXA7CisKK3ByaXZhdGU6CisJaW50IGNvbE1hcFtjb2xOcl07CisJaW50IGNvbFJldk1hcFtjb2xOcl07Cit9OworCitjbGFzcyBDb25maWdJdGVtIDogcHVibGljIFFMaXN0Vmlld0l0ZW0geworCXR5cGVkZWYgY2xhc3MgUUxpc3RWaWV3SXRlbSBQYXJlbnQ7CitwdWJsaWM6CisJQ29uZmlnSXRlbShRTGlzdFZpZXcgKnBhcmVudCwgQ29uZmlnSXRlbSAqYWZ0ZXIsIHN0cnVjdCBtZW51ICptLCBib29sIHYpCisJOiBQYXJlbnQocGFyZW50LCBhZnRlciksIG1lbnUobSksIHZpc2libGUodiksIGdvUGFyZW50KGZhbHNlKQorCXsKKwkJaW5pdCgpOworCX0KKwlDb25maWdJdGVtKENvbmZpZ0l0ZW0gKnBhcmVudCwgQ29uZmlnSXRlbSAqYWZ0ZXIsIHN0cnVjdCBtZW51ICptLCBib29sIHYpCisJOiBQYXJlbnQocGFyZW50LCBhZnRlciksIG1lbnUobSksIHZpc2libGUodiksIGdvUGFyZW50KGZhbHNlKQorCXsKKwkJaW5pdCgpOworCX0KKwlDb25maWdJdGVtKFFMaXN0VmlldyAqcGFyZW50LCBDb25maWdJdGVtICphZnRlciwgYm9vbCB2KQorCTogUGFyZW50KHBhcmVudCwgYWZ0ZXIpLCBtZW51KDApLCB2aXNpYmxlKHYpLCBnb1BhcmVudCh0cnVlKQorCXsKKwkJaW5pdCgpOworCX0KKwl+Q29uZmlnSXRlbSh2b2lkKTsKKwl2b2lkIGluaXQodm9pZCk7CisjaWYgUVRfVkVSU0lPTiA+PSAzMDAKKwl2b2lkIG9rUmVuYW1lKGludCBjb2wpOworI2VuZGlmCisJdm9pZCB1cGRhdGVNZW51KHZvaWQpOworCXZvaWQgdGVzdFVwZGF0ZU1lbnUoYm9vbCB2KTsKKwlDb25maWdMaXN0KiBsaXN0VmlldygpIGNvbnN0CisJeworCQlyZXR1cm4gKENvbmZpZ0xpc3QqKVBhcmVudDo6bGlzdFZpZXcoKTsKKwl9CisJQ29uZmlnSXRlbSogZmlyc3RDaGlsZCgpIGNvbnN0CisJeworCQlyZXR1cm4gKENvbmZpZ0l0ZW0gKilQYXJlbnQ6OmZpcnN0Q2hpbGQoKTsKKwl9CisJQ29uZmlnSXRlbSogbmV4dFNpYmxpbmcoKSBjb25zdAorCXsKKwkJcmV0dXJuIChDb25maWdJdGVtICopUGFyZW50OjpuZXh0U2libGluZygpOworCX0KKwl2b2lkIHNldFRleHQoY29sSWR4IGlkeCwgY29uc3QgUVN0cmluZyYgdGV4dCkKKwl7CisJCVBhcmVudDo6c2V0VGV4dChsaXN0VmlldygpLT5tYXBJZHgoaWR4KSwgdGV4dCk7CisJfQorCVFTdHJpbmcgdGV4dChjb2xJZHggaWR4KSBjb25zdAorCXsKKwkJcmV0dXJuIFBhcmVudDo6dGV4dChsaXN0VmlldygpLT5tYXBJZHgoaWR4KSk7CisJfQorCXZvaWQgc2V0UGl4bWFwKGNvbElkeCBpZHgsIGNvbnN0IFFQaXhtYXAmIHBtKQorCXsKKwkJUGFyZW50OjpzZXRQaXhtYXAobGlzdFZpZXcoKS0+bWFwSWR4KGlkeCksIHBtKTsKKwl9CisJY29uc3QgUVBpeG1hcCogcGl4bWFwKGNvbElkeCBpZHgpIGNvbnN0CisJeworCQlyZXR1cm4gUGFyZW50OjpwaXhtYXAobGlzdFZpZXcoKS0+bWFwSWR4KGlkeCkpOworCX0KKwl2b2lkIHBhaW50Q2VsbChRUGFpbnRlciogcCwgY29uc3QgUUNvbG9yR3JvdXAmIGNnLCBpbnQgY29sdW1uLCBpbnQgd2lkdGgsIGludCBhbGlnbik7CisKKwlDb25maWdJdGVtKiBuZXh0SXRlbTsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKwlib29sIHZpc2libGU7CisJYm9vbCBnb1BhcmVudDsKK307CisKK2NsYXNzIENvbmZpZ0xpbmVFZGl0IDogcHVibGljIFFMaW5lRWRpdCB7CisJUV9PQkpFQ1QKKwl0eXBlZGVmIGNsYXNzIFFMaW5lRWRpdCBQYXJlbnQ7CitwdWJsaWM6CisJQ29uZmlnTGluZUVkaXQoQ29uZmlnVmlldyogcGFyZW50KQorCTogUGFyZW50KHBhcmVudCkKKwl7IH0KKwlDb25maWdWaWV3KiBwYXJlbnQodm9pZCkgY29uc3QKKwl7CisJCXJldHVybiAoQ29uZmlnVmlldyopUGFyZW50OjpwYXJlbnQoKTsKKwl9CisJdm9pZCBzaG93KENvbmZpZ0l0ZW0gKmkpOworCXZvaWQga2V5UHJlc3NFdmVudChRS2V5RXZlbnQgKmUpOworCitwdWJsaWM6CisJQ29uZmlnSXRlbSAqaXRlbTsKK307CisKK2NsYXNzIENvbmZpZ01haW5XaW5kb3cgOiBwdWJsaWMgUU1haW5XaW5kb3cgeworCVFfT0JKRUNUCitwdWJsaWM6CisJQ29uZmlnTWFpbldpbmRvdyh2b2lkKTsKK3B1YmxpYyBzbG90czoKKwl2b2lkIHNldEhlbHAoUUxpc3RWaWV3SXRlbSogaXRlbSk7CisJdm9pZCBjaGFuZ2VNZW51KHN0cnVjdCBtZW51ICopOworCXZvaWQgbGlzdEZvY3VzQ2hhbmdlZCh2b2lkKTsKKwl2b2lkIGdvQmFjayh2b2lkKTsKKwl2b2lkIGxvYWRDb25maWcodm9pZCk7CisJdm9pZCBzYXZlQ29uZmlnKHZvaWQpOworCXZvaWQgc2F2ZUNvbmZpZ0FzKHZvaWQpOworCXZvaWQgc2hvd1NpbmdsZVZpZXcodm9pZCk7CisJdm9pZCBzaG93U3BsaXRWaWV3KHZvaWQpOworCXZvaWQgc2hvd0Z1bGxWaWV3KHZvaWQpOworCXZvaWQgc2V0U2hvd0FsbChib29sKTsKKwl2b2lkIHNldFNob3dEZWJ1Zyhib29sKTsKKwl2b2lkIHNldFNob3dSYW5nZShib29sKTsKKwl2b2lkIHNldFNob3dOYW1lKGJvb2wpOworCXZvaWQgc2V0U2hvd0RhdGEoYm9vbCk7CisJdm9pZCBzaG93SW50cm8odm9pZCk7CisJdm9pZCBzaG93QWJvdXQodm9pZCk7CisJdm9pZCBzYXZlU2V0dGluZ3Modm9pZCk7CisKK3Byb3RlY3RlZDoKKwl2b2lkIGNsb3NlRXZlbnQoUUNsb3NlRXZlbnQgKmUpOworCisJQ29uZmlnVmlldyAqbWVudVZpZXc7CisJQ29uZmlnTGlzdCAqbWVudUxpc3Q7CisJQ29uZmlnVmlldyAqY29uZmlnVmlldzsKKwlDb25maWdMaXN0ICpjb25maWdMaXN0OworCVFUZXh0VmlldyAqaGVscFRleHQ7CisJUVRvb2xCYXIgKnRvb2xCYXI7CisJUUFjdGlvbiAqYmFja0FjdGlvbjsKKwlRU3BsaXR0ZXIqIHNwbGl0MTsKKwlRU3BsaXR0ZXIqIHNwbGl0MjsKKworCWJvb2wgc2hvd0RlYnVnOworfTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYyBiL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDc4NzdhCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL3N5bWJvbC5jCkBAIC0wLDAgKzEsODgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8cmVnZXguaD4KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgorCisjZGVmaW5lIExLQ19ESVJFQ1RfTElOSworI2luY2x1ZGUgImxrYy5oIgorCitzdHJ1Y3Qgc3ltYm9sIHN5bWJvbF95ZXMgPSB7CisJLm5hbWUgPSAieSIsCisJLmN1cnIgPSB7ICJ5IiwgeWVzIH0sCisJLmZsYWdzID0gU1lNQk9MX1lFU3xTWU1CT0xfVkFMSUQsCit9LCBzeW1ib2xfbW9kID0geworCS5uYW1lID0gIm0iLAorCS5jdXJyID0geyAibSIsIG1vZCB9LAorCS5mbGFncyA9IFNZTUJPTF9NT0R8U1lNQk9MX1ZBTElELAorfSwgc3ltYm9sX25vID0geworCS5uYW1lID0gIm4iLAorCS5jdXJyID0geyAibiIsIG5vIH0sCisJLmZsYWdzID0gU1lNQk9MX05PfFNZTUJPTF9WQUxJRCwKK30sIHN5bWJvbF9lbXB0eSA9IHsKKwkubmFtZSA9ICIiLAorCS5jdXJyID0geyAiIiwgbm8gfSwKKwkuZmxhZ3MgPSBTWU1CT0xfVkFMSUQsCit9OworCitpbnQgc3ltX2NoYW5nZV9jb3VudDsKK3N0cnVjdCBzeW1ib2wgKm1vZHVsZXNfc3ltOwordHJpc3RhdGUgbW9kdWxlc192YWw7CisKK3ZvaWQgc3ltX2FkZF9kZWZhdWx0KHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqZGVmKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcCA9IHByb3BfYWxsb2MoUF9ERUZBVUxULCBzeW0pOworCisJcHJvcC0+ZXhwciA9IGV4cHJfYWxsb2Nfc3ltYm9sKHN5bV9sb29rdXAoZGVmLCAxKSk7Cit9CisKK3ZvaWQgc3ltX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IHV0c25hbWUgdXRzOworCWNoYXIgKnA7CisJc3RhdGljIGJvb2wgaW5pdGVkID0gZmFsc2U7CisKKwlpZiAoaW5pdGVkKQorCQlyZXR1cm47CisJaW5pdGVkID0gdHJ1ZTsKKworCXVuYW1lKCZ1dHMpOworCisJc3ltID0gc3ltX2xvb2t1cCgiQVJDSCIsIDApOworCXN5bS0+dHlwZSA9IFNfU1RSSU5HOworCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0FVVE87CisJcCA9IGdldGVudigiQVJDSCIpOworCWlmIChwKQorCQlzeW1fYWRkX2RlZmF1bHQoc3ltLCBwKTsKKworCXN5bSA9IHN5bV9sb29rdXAoIktFUk5FTFZFUlNJT04iLCAwKTsKKwlzeW0tPnR5cGUgPSBTX1NUUklORzsKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9BVVRPOworCXAgPSBnZXRlbnYoIktFUk5FTFZFUlNJT04iKTsKKwlpZiAocCkKKwkJc3ltX2FkZF9kZWZhdWx0KHN5bSwgcCk7CisKKwlzeW0gPSBzeW1fbG9va3VwKCJVTkFNRV9SRUxFQVNFIiwgMCk7CisJc3ltLT50eXBlID0gU19TVFJJTkc7CisJc3ltLT5mbGFncyB8PSBTWU1CT0xfQVVUTzsKKwlzeW1fYWRkX2RlZmF1bHQoc3ltLCB1dHMucmVsZWFzZSk7Cit9CisKK2VudW0gc3ltYm9sX3R5cGUgc3ltX2dldF90eXBlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwllbnVtIHN5bWJvbF90eXBlIHR5cGUgPSBzeW0tPnR5cGU7CisKKwlpZiAodHlwZSA9PSBTX1RSSVNUQVRFKSB7CisJCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkgJiYgc3ltLT52aXNpYmxlID09IHllcykKKwkJCXR5cGUgPSBTX0JPT0xFQU47CisJCWVsc2UgaWYgKG1vZHVsZXNfdmFsID09IG5vKQorCQkJdHlwZSA9IFNfQk9PTEVBTjsKKwl9CisJcmV0dXJuIHR5cGU7Cit9CisKK2NvbnN0IGNoYXIgKnN5bV90eXBlX25hbWUoZW51bSBzeW1ib2xfdHlwZSB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU19CT09MRUFOOgorCQlyZXR1cm4gImJvb2xlYW4iOworCWNhc2UgU19UUklTVEFURToKKwkJcmV0dXJuICJ0cmlzdGF0ZSI7CisJY2FzZSBTX0lOVDoKKwkJcmV0dXJuICJpbnRlZ2VyIjsKKwljYXNlIFNfSEVYOgorCQlyZXR1cm4gImhleCI7CisJY2FzZSBTX1NUUklORzoKKwkJcmV0dXJuICJzdHJpbmciOworCWNhc2UgU19VTktOT1dOOgorCQlyZXR1cm4gInVua25vd24iOworCWNhc2UgU19PVEhFUjoKKwkJYnJlYWs7CisJfQorCXJldHVybiAiPz8/IjsKK30KKworc3RydWN0IHByb3BlcnR5ICpzeW1fZ2V0X2Nob2ljZV9wcm9wKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwlmb3JfYWxsX2Nob2ljZXMoc3ltLCBwcm9wKQorCQlyZXR1cm4gcHJvcDsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IHByb3BlcnR5ICpzeW1fZ2V0X2RlZmF1bHRfcHJvcChzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJZm9yX2FsbF9kZWZhdWx0cyhzeW0sIHByb3ApIHsKKwkJcHJvcC0+dmlzaWJsZS50cmkgPSBleHByX2NhbGNfdmFsdWUocHJvcC0+dmlzaWJsZS5leHByKTsKKwkJaWYgKHByb3AtPnZpc2libGUudHJpICE9IG5vKQorCQkJcmV0dXJuIHByb3A7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgcHJvcGVydHkgKnN5bV9nZXRfcmFuZ2VfcHJvcChzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJZm9yX2FsbF9wcm9wZXJ0aWVzKHN5bSwgcHJvcCwgUF9SQU5HRSkgeworCQlwcm9wLT52aXNpYmxlLnRyaSA9IGV4cHJfY2FsY192YWx1ZShwcm9wLT52aXNpYmxlLmV4cHIpOworCQlpZiAocHJvcC0+dmlzaWJsZS50cmkgIT0gbm8pCisJCQlyZXR1cm4gcHJvcDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgc3ltX2dldF9yYW5nZV92YWwoc3RydWN0IHN5bWJvbCAqc3ltLCBpbnQgYmFzZSkKK3sKKwlzeW1fY2FsY192YWx1ZShzeW0pOworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0lOVDoKKwkJYmFzZSA9IDEwOworCQlicmVhazsKKwljYXNlIFNfSEVYOgorCQliYXNlID0gMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gc3RydG9sKHN5bS0+Y3Vyci52YWwsIE5VTEwsIGJhc2UpOworfQorCitzdGF0aWMgdm9pZCBzeW1fdmFsaWRhdGVfcmFuZ2Uoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlpbnQgYmFzZSwgdmFsLCB2YWwyOworCWNoYXIgc3RyWzY0XTsKKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0lOVDoKKwkJYmFzZSA9IDEwOworCQlicmVhazsKKwljYXNlIFNfSEVYOgorCQliYXNlID0gMTY7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisJcHJvcCA9IHN5bV9nZXRfcmFuZ2VfcHJvcChzeW0pOworCWlmICghcHJvcCkKKwkJcmV0dXJuOworCXZhbCA9IHN0cnRvbChzeW0tPmN1cnIudmFsLCBOVUxMLCBiYXNlKTsKKwl2YWwyID0gc3ltX2dldF9yYW5nZV92YWwocHJvcC0+ZXhwci0+bGVmdC5zeW0sIGJhc2UpOworCWlmICh2YWwgPj0gdmFsMikgeworCQl2YWwyID0gc3ltX2dldF9yYW5nZV92YWwocHJvcC0+ZXhwci0+cmlnaHQuc3ltLCBiYXNlKTsKKwkJaWYgKHZhbCA8PSB2YWwyKQorCQkJcmV0dXJuOworCX0KKwlpZiAoc3ltLT50eXBlID09IFNfSU5UKQorCQlzcHJpbnRmKHN0ciwgIiVkIiwgdmFsMik7CisJZWxzZQorCQlzcHJpbnRmKHN0ciwgIjB4JXgiLCB2YWwyKTsKKwlzeW0tPmN1cnIudmFsID0gc3RyZHVwKHN0cik7Cit9CisKK3N0YXRpYyB2b2lkIHN5bV9jYWxjX3Zpc2liaWxpdHkoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwl0cmlzdGF0ZSB0cmk7CisKKwkvKiBhbnkgcHJvbXB0IHZpc2libGU/ICovCisJdHJpID0gbm87CisJZm9yX2FsbF9wcm9tcHRzKHN5bSwgcHJvcCkgeworCQlwcm9wLT52aXNpYmxlLnRyaSA9IGV4cHJfY2FsY192YWx1ZShwcm9wLT52aXNpYmxlLmV4cHIpOworCQl0cmkgPSBFX09SKHRyaSwgcHJvcC0+dmlzaWJsZS50cmkpOworCX0KKwlpZiAodHJpID09IG1vZCAmJiAoc3ltLT50eXBlICE9IFNfVFJJU1RBVEUgfHwgbW9kdWxlc192YWwgPT0gbm8pKQorCQl0cmkgPSB5ZXM7CisJaWYgKHN5bS0+dmlzaWJsZSAhPSB0cmkpIHsKKwkJc3ltLT52aXNpYmxlID0gdHJpOworCQlzeW1fc2V0X2NoYW5nZWQoc3ltKTsKKwl9CisJaWYgKHN5bV9pc19jaG9pY2VfdmFsdWUoc3ltKSkKKwkJcmV0dXJuOworCXRyaSA9IG5vOworCWlmIChzeW0tPnJldl9kZXAuZXhwcikKKwkJdHJpID0gZXhwcl9jYWxjX3ZhbHVlKHN5bS0+cmV2X2RlcC5leHByKTsKKwlpZiAodHJpID09IG1vZCAmJiBzeW1fZ2V0X3R5cGUoc3ltKSA9PSBTX0JPT0xFQU4pCisJCXRyaSA9IHllczsKKwlpZiAoc3ltLT5yZXZfZGVwLnRyaSAhPSB0cmkpIHsKKwkJc3ltLT5yZXZfZGVwLnRyaSA9IHRyaTsKKwkJc3ltX3NldF9jaGFuZ2VkKHN5bSk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHN5bWJvbCAqc3ltX2NhbGNfY2hvaWNlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpkZWZfc3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgZXhwciAqZTsKKworCS8qIGlzIHRoZSB1c2VyIGNob2ljZSB2aXNpYmxlPyAqLworCWRlZl9zeW0gPSBzeW0tPnVzZXIudmFsOworCWlmIChkZWZfc3ltKSB7CisJCXN5bV9jYWxjX3Zpc2liaWxpdHkoZGVmX3N5bSk7CisJCWlmIChkZWZfc3ltLT52aXNpYmxlICE9IG5vKQorCQkJcmV0dXJuIGRlZl9zeW07CisJfQorCisJLyogYW55IG9mIHRoZSBkZWZhdWx0cyB2aXNpYmxlPyAqLworCWZvcl9hbGxfZGVmYXVsdHMoc3ltLCBwcm9wKSB7CisJCXByb3AtPnZpc2libGUudHJpID0gZXhwcl9jYWxjX3ZhbHVlKHByb3AtPnZpc2libGUuZXhwcik7CisJCWlmIChwcm9wLT52aXNpYmxlLnRyaSA9PSBubykKKwkJCWNvbnRpbnVlOworCQlkZWZfc3ltID0gcHJvcF9nZXRfc3ltYm9sKHByb3ApOworCQlzeW1fY2FsY192aXNpYmlsaXR5KGRlZl9zeW0pOworCQlpZiAoZGVmX3N5bS0+dmlzaWJsZSAhPSBubykKKwkJCXJldHVybiBkZWZfc3ltOworCX0KKworCS8qIGp1c3QgZ2V0IHRoZSBmaXJzdCB2aXNpYmxlIHZhbHVlICovCisJcHJvcCA9IHN5bV9nZXRfY2hvaWNlX3Byb3Aoc3ltKTsKKwlmb3IgKGUgPSBwcm9wLT5leHByOyBlOyBlID0gZS0+bGVmdC5leHByKSB7CisJCWRlZl9zeW0gPSBlLT5yaWdodC5zeW07CisJCXN5bV9jYWxjX3Zpc2liaWxpdHkoZGVmX3N5bSk7CisJCWlmIChkZWZfc3ltLT52aXNpYmxlICE9IG5vKQorCQkJcmV0dXJuIGRlZl9zeW07CisJfQorCisJLyogbm8gY2hvaWNlPyByZXNldCB0cmlzdGF0ZSB2YWx1ZSAqLworCXN5bS0+Y3Vyci50cmkgPSBubzsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBzeW1fY2FsY192YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IHN5bWJvbF92YWx1ZSBuZXd2YWwsIG9sZHZhbDsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IGV4cHIgKmU7CisKKwlpZiAoIXN5bSkKKwkJcmV0dXJuOworCisJaWYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfVkFMSUQpCisJCXJldHVybjsKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9WQUxJRDsKKworCW9sZHZhbCA9IHN5bS0+Y3VycjsKKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0lOVDoKKwljYXNlIFNfSEVYOgorCWNhc2UgU19TVFJJTkc6CisJCW5ld3ZhbCA9IHN5bWJvbF9lbXB0eS5jdXJyOworCQlicmVhazsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCW5ld3ZhbCA9IHN5bWJvbF9uby5jdXJyOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlzeW0tPmN1cnIudmFsID0gc3ltLT5uYW1lOworCQlzeW0tPmN1cnIudHJpID0gbm87CisJCXJldHVybjsKKwl9CisJaWYgKCFzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkpCisJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9XUklURTsKKworCXN5bV9jYWxjX3Zpc2liaWxpdHkoc3ltKTsKKworCS8qIHNldCBkZWZhdWx0IGlmIHJlY3Vyc2l2ZWx5IGNhbGxlZCAqLworCXN5bS0+Y3VyciA9IG5ld3ZhbDsKKworCXN3aXRjaCAoc3ltX2dldF90eXBlKHN5bSkpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkgJiYgc3ltLT52aXNpYmxlID09IHllcykgeworCQkJcHJvcCA9IHN5bV9nZXRfY2hvaWNlX3Byb3Aoc3ltKTsKKwkJCW5ld3ZhbC50cmkgPSAocHJvcF9nZXRfc3ltYm9sKHByb3ApLT5jdXJyLnZhbCA9PSBzeW0pID8geWVzIDogbm87CisJCX0gZWxzZSBpZiAoRV9PUihzeW0tPnZpc2libGUsIHN5bS0+cmV2X2RlcC50cmkpICE9IG5vKSB7CisJCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9XUklURTsKKwkJCWlmIChzeW1faGFzX3ZhbHVlKHN5bSkpCisJCQkJbmV3dmFsLnRyaSA9IHN5bS0+dXNlci50cmk7CisJCQllbHNlIGlmICghc3ltX2lzX2Nob2ljZShzeW0pKSB7CisJCQkJcHJvcCA9IHN5bV9nZXRfZGVmYXVsdF9wcm9wKHN5bSk7CisJCQkJaWYgKHByb3ApCisJCQkJCW5ld3ZhbC50cmkgPSBleHByX2NhbGNfdmFsdWUocHJvcC0+ZXhwcik7CisJCQl9CisJCQluZXd2YWwudHJpID0gRV9PUihFX0FORChuZXd2YWwudHJpLCBzeW0tPnZpc2libGUpLCBzeW0tPnJldl9kZXAudHJpKTsKKwkJfSBlbHNlIGlmICghc3ltX2lzX2Nob2ljZShzeW0pKSB7CisJCQlwcm9wID0gc3ltX2dldF9kZWZhdWx0X3Byb3Aoc3ltKTsKKwkJCWlmIChwcm9wKSB7CisJCQkJc3ltLT5mbGFncyB8PSBTWU1CT0xfV1JJVEU7CisJCQkJbmV3dmFsLnRyaSA9IGV4cHJfY2FsY192YWx1ZShwcm9wLT5leHByKTsKKwkJCX0KKwkJfQorCQlpZiAobmV3dmFsLnRyaSA9PSBtb2QgJiYgc3ltX2dldF90eXBlKHN5bSkgPT0gU19CT09MRUFOKQorCQkJbmV3dmFsLnRyaSA9IHllczsKKwkJYnJlYWs7CisJY2FzZSBTX1NUUklORzoKKwljYXNlIFNfSEVYOgorCWNhc2UgU19JTlQ6CisJCWlmIChzeW0tPnZpc2libGUgIT0gbm8pIHsKKwkJCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX1dSSVRFOworCQkJaWYgKHN5bV9oYXNfdmFsdWUoc3ltKSkgeworCQkJCW5ld3ZhbC52YWwgPSBzeW0tPnVzZXIudmFsOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCXByb3AgPSBzeW1fZ2V0X2RlZmF1bHRfcHJvcChzeW0pOworCQlpZiAocHJvcCkgeworCQkJc3RydWN0IHN5bWJvbCAqZHMgPSBwcm9wX2dldF9zeW1ib2wocHJvcCk7CisJCQlpZiAoZHMpIHsKKwkJCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9XUklURTsKKwkJCQlzeW1fY2FsY192YWx1ZShkcyk7CisJCQkJbmV3dmFsLnZhbCA9IGRzLT5jdXJyLnZhbDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQk7CisJfQorCisJc3ltLT5jdXJyID0gbmV3dmFsOworCWlmIChzeW1faXNfY2hvaWNlKHN5bSkgJiYgbmV3dmFsLnRyaSA9PSB5ZXMpCisJCXN5bS0+Y3Vyci52YWwgPSBzeW1fY2FsY19jaG9pY2Uoc3ltKTsKKwlzeW1fdmFsaWRhdGVfcmFuZ2Uoc3ltKTsKKworCWlmIChtZW1jbXAoJm9sZHZhbCwgJnN5bS0+Y3Vyciwgc2l6ZW9mKG9sZHZhbCkpKQorCQlzeW1fc2V0X2NoYW5nZWQoc3ltKTsKKwlpZiAobW9kdWxlc19zeW0gPT0gc3ltKQorCQltb2R1bGVzX3ZhbCA9IG1vZHVsZXNfc3ltLT5jdXJyLnRyaTsKKworCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpIHsKKwkJaW50IGZsYWdzID0gc3ltLT5mbGFncyAmIChTWU1CT0xfQ0hBTkdFRCB8IFNZTUJPTF9XUklURSk7CisJCXByb3AgPSBzeW1fZ2V0X2Nob2ljZV9wcm9wKHN5bSk7CisJCWZvciAoZSA9IHByb3AtPmV4cHI7IGU7IGUgPSBlLT5sZWZ0LmV4cHIpIHsKKwkJCWUtPnJpZ2h0LnN5bS0+ZmxhZ3MgfD0gZmxhZ3M7CisJCQlpZiAoZmxhZ3MgJiBTWU1CT0xfQ0hBTkdFRCkKKwkJCQlzeW1fc2V0X2NoYW5nZWQoZS0+cmlnaHQuc3ltKTsKKwkJfQorCX0KK30KKwordm9pZCBzeW1fY2xlYXJfYWxsX3ZhbGlkKHZvaWQpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCWludCBpOworCisJZm9yX2FsbF9zeW1ib2xzKGksIHN5bSkKKwkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX1ZBTElEOworCXN5bV9jaGFuZ2VfY291bnQrKzsKKwlpZiAobW9kdWxlc19zeW0pCisJCXN5bV9jYWxjX3ZhbHVlKG1vZHVsZXNfc3ltKTsKK30KKwordm9pZCBzeW1fc2V0X2NoYW5nZWQoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKworCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0NIQU5HRUQ7CisJZm9yIChwcm9wID0gc3ltLT5wcm9wOyBwcm9wOyBwcm9wID0gcHJvcC0+bmV4dCkgeworCQlpZiAocHJvcC0+bWVudSkKKwkJCXByb3AtPm1lbnUtPmZsYWdzIHw9IE1FTlVfQ0hBTkdFRDsKKwl9Cit9CisKK3ZvaWQgc3ltX3NldF9hbGxfY2hhbmdlZCh2b2lkKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlpbnQgaTsKKworCWZvcl9hbGxfc3ltYm9scyhpLCBzeW0pCisJCXN5bV9zZXRfY2hhbmdlZChzeW0pOworfQorCitib29sIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3RydWN0IHN5bWJvbCAqc3ltLCB0cmlzdGF0ZSB2YWwpCit7CisJaW50IHR5cGUgPSBzeW1fZ2V0X3R5cGUoc3ltKTsKKworCWlmIChzeW0tPnZpc2libGUgPT0gbm8pCisJCXJldHVybiBmYWxzZTsKKworCWlmICh0eXBlICE9IFNfQk9PTEVBTiAmJiB0eXBlICE9IFNfVFJJU1RBVEUpCisJCXJldHVybiBmYWxzZTsKKworCWlmICh0eXBlID09IFNfQk9PTEVBTiAmJiB2YWwgPT0gbW9kKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKHN5bS0+dmlzaWJsZSA8PSBzeW0tPnJldl9kZXAudHJpKQorCQlyZXR1cm4gZmFsc2U7CisJaWYgKHN5bV9pc19jaG9pY2VfdmFsdWUoc3ltKSAmJiBzeW0tPnZpc2libGUgPT0geWVzKQorCQlyZXR1cm4gdmFsID09IHllczsKKwlyZXR1cm4gdmFsID49IHN5bS0+cmV2X2RlcC50cmkgJiYgdmFsIDw9IHN5bS0+dmlzaWJsZTsKK30KKworYm9vbCBzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSwgdHJpc3RhdGUgdmFsKQoreworCXRyaXN0YXRlIG9sZHZhbCA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKKworCWlmIChvbGR2YWwgIT0gdmFsICYmICFzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgdmFsKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfTkVXKSB7CisJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9ORVc7CisJCXN5bV9zZXRfY2hhbmdlZChzeW0pOworCX0KKwkvKgorCSAqIHNldHRpbmcgYSBjaG9pY2UgdmFsdWUgYWxzbyByZXNldHMgdGhlIG5ldyBmbGFnIG9mIHRoZSBjaG9pY2UKKwkgKiBzeW1ib2wgYW5kIGFsbCBvdGhlciBjaG9pY2UgdmFsdWVzLgorCSAqLworCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkgJiYgdmFsID09IHllcykgeworCQlzdHJ1Y3Qgc3ltYm9sICpjcyA9IHByb3BfZ2V0X3N5bWJvbChzeW1fZ2V0X2Nob2ljZV9wcm9wKHN5bSkpOworCQlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJCXN0cnVjdCBleHByICplOworCisJCWNzLT51c2VyLnZhbCA9IHN5bTsKKwkJY3MtPmZsYWdzICY9IH5TWU1CT0xfTkVXOworCQlwcm9wID0gc3ltX2dldF9jaG9pY2VfcHJvcChjcyk7CisJCWZvciAoZSA9IHByb3AtPmV4cHI7IGU7IGUgPSBlLT5sZWZ0LmV4cHIpIHsKKwkJCWlmIChlLT5yaWdodC5zeW0tPnZpc2libGUgIT0gbm8pCisJCQkJZS0+cmlnaHQuc3ltLT5mbGFncyAmPSB+U1lNQk9MX05FVzsKKwkJfQorCX0KKworCXN5bS0+dXNlci50cmkgPSB2YWw7CisJaWYgKG9sZHZhbCAhPSB2YWwpIHsKKwkJc3ltX2NsZWFyX2FsbF92YWxpZCgpOworCQlpZiAoc3ltID09IG1vZHVsZXNfc3ltKQorCQkJc3ltX3NldF9hbGxfY2hhbmdlZCgpOworCX0KKworCXJldHVybiB0cnVlOworfQorCit0cmlzdGF0ZSBzeW1fdG9nZ2xlX3RyaXN0YXRlX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwl0cmlzdGF0ZSBvbGR2YWwsIG5ld3ZhbDsKKworCW9sZHZhbCA9IG5ld3ZhbCA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKKwlkbyB7CisJCXN3aXRjaCAobmV3dmFsKSB7CisJCWNhc2Ugbm86CisJCQluZXd2YWwgPSBtb2Q7CisJCQlicmVhazsKKwkJY2FzZSBtb2Q6CisJCQluZXd2YWwgPSB5ZXM7CisJCQlicmVhazsKKwkJY2FzZSB5ZXM6CisJCQluZXd2YWwgPSBubzsKKwkJCWJyZWFrOworCQl9CisJCWlmIChzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbmV3dmFsKSkKKwkJCWJyZWFrOworCX0gd2hpbGUgKG9sZHZhbCAhPSBuZXd2YWwpOworCXJldHVybiBuZXd2YWw7Cit9CisKK2Jvb2wgc3ltX3N0cmluZ192YWxpZChzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlzaWduZWQgY2hhciBjaDsKKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX1NUUklORzoKKwkJcmV0dXJuIHRydWU7CisJY2FzZSBTX0lOVDoKKwkJY2ggPSAqc3RyKys7CisJCWlmIChjaCA9PSAnLScpCisJCQljaCA9ICpzdHIrKzsKKwkJaWYgKCFpc2RpZ2l0KGNoKSkKKwkJCXJldHVybiBmYWxzZTsKKwkJaWYgKGNoID09ICcwJyAmJiAqc3RyICE9IDApCisJCQlyZXR1cm4gZmFsc2U7CisJCXdoaWxlICgoY2ggPSAqc3RyKyspKSB7CisJCQlpZiAoIWlzZGlnaXQoY2gpKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCQlyZXR1cm4gdHJ1ZTsKKwljYXNlIFNfSEVYOgorCQlpZiAoc3RyWzBdID09ICcwJyAmJiAoc3RyWzFdID09ICd4JyB8fCBzdHJbMV0gPT0gJ1gnKSkKKwkJCXN0ciArPSAyOworCQljaCA9ICpzdHIrKzsKKwkJZG8geworCQkJaWYgKCFpc3hkaWdpdChjaCkpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9IHdoaWxlICgoY2ggPSAqc3RyKyspKTsKKwkJcmV0dXJuIHRydWU7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQlzd2l0Y2ggKHN0clswXSkgeworCQljYXNlICd5JzogY2FzZSAnWSc6CisJCWNhc2UgJ20nOiBjYXNlICdNJzoKKwkJY2FzZSAnbic6IGNhc2UgJ04nOgorCQkJcmV0dXJuIHRydWU7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK2Jvb2wgc3ltX3N0cmluZ193aXRoaW5fcmFuZ2Uoc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpzdHIpCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCWludCB2YWw7CisKKwlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCWNhc2UgU19TVFJJTkc6CisJCXJldHVybiBzeW1fc3RyaW5nX3ZhbGlkKHN5bSwgc3RyKTsKKwljYXNlIFNfSU5UOgorCQlpZiAoIXN5bV9zdHJpbmdfdmFsaWQoc3ltLCBzdHIpKQorCQkJcmV0dXJuIGZhbHNlOworCQlwcm9wID0gc3ltX2dldF9yYW5nZV9wcm9wKHN5bSk7CisJCWlmICghcHJvcCkKKwkJCXJldHVybiB0cnVlOworCQl2YWwgPSBzdHJ0b2woc3RyLCBOVUxMLCAxMCk7CisJCXJldHVybiB2YWwgPj0gc3ltX2dldF9yYW5nZV92YWwocHJvcC0+ZXhwci0+bGVmdC5zeW0sIDEwKSAmJgorCQkgICAgICAgdmFsIDw9IHN5bV9nZXRfcmFuZ2VfdmFsKHByb3AtPmV4cHItPnJpZ2h0LnN5bSwgMTApOworCWNhc2UgU19IRVg6CisJCWlmICghc3ltX3N0cmluZ192YWxpZChzeW0sIHN0cikpCisJCQlyZXR1cm4gZmFsc2U7CisJCXByb3AgPSBzeW1fZ2V0X3JhbmdlX3Byb3Aoc3ltKTsKKwkJaWYgKCFwcm9wKQorCQkJcmV0dXJuIHRydWU7CisJCXZhbCA9IHN0cnRvbChzdHIsIE5VTEwsIDE2KTsKKwkJcmV0dXJuIHZhbCA+PSBzeW1fZ2V0X3JhbmdlX3ZhbChwcm9wLT5leHByLT5sZWZ0LnN5bSwgMTYpICYmCisJCSAgICAgICB2YWwgPD0gc3ltX2dldF9yYW5nZV92YWwocHJvcC0+ZXhwci0+cmlnaHQuc3ltLCAxNik7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQlzd2l0Y2ggKHN0clswXSkgeworCQljYXNlICd5JzogY2FzZSAnWSc6CisJCQlyZXR1cm4gc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIHllcyk7CisJCWNhc2UgJ20nOiBjYXNlICdNJzoKKwkJCXJldHVybiBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbW9kKTsKKwkJY2FzZSAnbic6IGNhc2UgJ04nOgorCQkJcmV0dXJuIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCBubyk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK2Jvb2wgc3ltX3NldF9zdHJpbmdfdmFsdWUoc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpuZXd2YWwpCit7CisJY29uc3QgY2hhciAqb2xkdmFsOworCWNoYXIgKnZhbDsKKwlpbnQgc2l6ZTsKKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQlzd2l0Y2ggKG5ld3ZhbFswXSkgeworCQljYXNlICd5JzogY2FzZSAnWSc6CisJCQlyZXR1cm4gc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIHllcyk7CisJCWNhc2UgJ20nOiBjYXNlICdNJzoKKwkJCXJldHVybiBzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbW9kKTsKKwkJY2FzZSAnbic6IGNhc2UgJ04nOgorCQkJcmV0dXJuIHN5bV9zZXRfdHJpc3RhdGVfdmFsdWUoc3ltLCBubyk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCWRlZmF1bHQ6CisJCTsKKwl9CisKKwlpZiAoIXN5bV9zdHJpbmdfd2l0aGluX3JhbmdlKHN5bSwgbmV3dmFsKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfTkVXKSB7CisJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9ORVc7CisJCXN5bV9zZXRfY2hhbmdlZChzeW0pOworCX0KKworCW9sZHZhbCA9IHN5bS0+dXNlci52YWw7CisJc2l6ZSA9IHN0cmxlbihuZXd2YWwpICsgMTsKKwlpZiAoc3ltLT50eXBlID09IFNfSEVYICYmIChuZXd2YWxbMF0gIT0gJzAnIHx8IChuZXd2YWxbMV0gIT0gJ3gnICYmIG5ld3ZhbFsxXSAhPSAnWCcpKSkgeworCQlzaXplICs9IDI7CisJCXN5bS0+dXNlci52YWwgPSB2YWwgPSBtYWxsb2Moc2l6ZSk7CisJCSp2YWwrKyA9ICcwJzsKKwkJKnZhbCsrID0gJ3gnOworCX0gZWxzZSBpZiAoIW9sZHZhbCB8fCBzdHJjbXAob2xkdmFsLCBuZXd2YWwpKQorCQlzeW0tPnVzZXIudmFsID0gdmFsID0gbWFsbG9jKHNpemUpOworCWVsc2UKKwkJcmV0dXJuIHRydWU7CisKKwlzdHJjcHkodmFsLCBuZXd2YWwpOworCWZyZWUoKHZvaWQgKilvbGR2YWwpOworCXN5bV9jbGVhcl9hbGxfdmFsaWQoKTsKKworCXJldHVybiB0cnVlOworfQorCitjb25zdCBjaGFyICpzeW1fZ2V0X3N0cmluZ192YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJdHJpc3RhdGUgdmFsOworCisJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCXZhbCA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKKwkJc3dpdGNoICh2YWwpIHsKKwkJY2FzZSBubzoKKwkJCXJldHVybiAibiI7CisJCWNhc2UgbW9kOgorCQkJcmV0dXJuICJtIjsKKwkJY2FzZSB5ZXM6CisJCQlyZXR1cm4gInkiOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsKKwl9CisJcmV0dXJuIChjb25zdCBjaGFyICopc3ltLT5jdXJyLnZhbDsKK30KKworYm9vbCBzeW1faXNfY2hhbmdhYmxlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlyZXR1cm4gc3ltLT52aXNpYmxlID4gc3ltLT5yZXZfZGVwLnRyaTsKK30KKworc3RydWN0IHN5bWJvbCAqc3ltX2xvb2t1cChjb25zdCBjaGFyICpuYW1lLCBpbnQgaXNjb25zdCkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW1ib2w7CisJY29uc3QgY2hhciAqcHRyOworCWNoYXIgKm5ld19uYW1lOworCWludCBoYXNoID0gMDsKKworCWlmIChuYW1lKSB7CisJCWlmIChuYW1lWzBdICYmICFuYW1lWzFdKSB7CisJCQlzd2l0Y2ggKG5hbWVbMF0pIHsKKwkJCWNhc2UgJ3knOiByZXR1cm4gJnN5bWJvbF95ZXM7CisJCQljYXNlICdtJzogcmV0dXJuICZzeW1ib2xfbW9kOworCQkJY2FzZSAnbic6IHJldHVybiAmc3ltYm9sX25vOworCQkJfQorCQl9CisJCWZvciAocHRyID0gbmFtZTsgKnB0cjsgcHRyKyspCisJCQloYXNoICs9ICpwdHI7CisJCWhhc2ggJj0gMHhmZjsKKworCQlmb3IgKHN5bWJvbCA9IHN5bWJvbF9oYXNoW2hhc2hdOyBzeW1ib2w7IHN5bWJvbCA9IHN5bWJvbC0+bmV4dCkgeworCQkJaWYgKCFzdHJjbXAoc3ltYm9sLT5uYW1lLCBuYW1lKSkgeworCQkJCWlmICgoaXNjb25zdCAmJiBzeW1ib2wtPmZsYWdzICYgU1lNQk9MX0NPTlNUKSB8fAorCQkJCSAgICAoIWlzY29uc3QgJiYgIShzeW1ib2wtPmZsYWdzICYgU1lNQk9MX0NPTlNUKSkpCisJCQkJCXJldHVybiBzeW1ib2w7CisJCQl9CisJCX0KKwkJbmV3X25hbWUgPSBzdHJkdXAobmFtZSk7CisJfSBlbHNlIHsKKwkJbmV3X25hbWUgPSBOVUxMOworCQloYXNoID0gMjU2OworCX0KKworCXN5bWJvbCA9IG1hbGxvYyhzaXplb2YoKnN5bWJvbCkpOworCW1lbXNldChzeW1ib2wsIDAsIHNpemVvZigqc3ltYm9sKSk7CisJc3ltYm9sLT5uYW1lID0gbmV3X25hbWU7CisJc3ltYm9sLT50eXBlID0gU19VTktOT1dOOworCXN5bWJvbC0+ZmxhZ3MgPSBTWU1CT0xfTkVXOworCWlmIChpc2NvbnN0KQorCQlzeW1ib2wtPmZsYWdzIHw9IFNZTUJPTF9DT05TVDsKKworCXN5bWJvbC0+bmV4dCA9IHN5bWJvbF9oYXNoW2hhc2hdOworCXN5bWJvbF9oYXNoW2hhc2hdID0gc3ltYm9sOworCisJcmV0dXJuIHN5bWJvbDsKK30KKworc3RydWN0IHN5bWJvbCAqc3ltX2ZpbmQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW1ib2wgPSBOVUxMOworCWNvbnN0IGNoYXIgKnB0cjsKKwlpbnQgaGFzaCA9IDA7CisKKwlpZiAoIW5hbWUpCisJCXJldHVybiBOVUxMOworCisJaWYgKG5hbWVbMF0gJiYgIW5hbWVbMV0pIHsKKwkJc3dpdGNoIChuYW1lWzBdKSB7CisJCWNhc2UgJ3knOiByZXR1cm4gJnN5bWJvbF95ZXM7CisJCWNhc2UgJ20nOiByZXR1cm4gJnN5bWJvbF9tb2Q7CisJCWNhc2UgJ24nOiByZXR1cm4gJnN5bWJvbF9ubzsKKwkJfQorCX0KKwlmb3IgKHB0ciA9IG5hbWU7ICpwdHI7IHB0cisrKQorCQloYXNoICs9ICpwdHI7CisJaGFzaCAmPSAweGZmOworCisJZm9yIChzeW1ib2wgPSBzeW1ib2xfaGFzaFtoYXNoXTsgc3ltYm9sOyBzeW1ib2wgPSBzeW1ib2wtPm5leHQpIHsKKwkJaWYgKCFzdHJjbXAoc3ltYm9sLT5uYW1lLCBuYW1lKSAmJgorCQkgICAgIShzeW1ib2wtPmZsYWdzICYgU1lNQk9MX0NPTlNUKSkKKwkJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3ltYm9sOworfQorCitzdHJ1Y3Qgc3ltYm9sICoqc3ltX3JlX3NlYXJjaChjb25zdCBjaGFyICpwYXR0ZXJuKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bSwgKipzeW1fYXJyID0gTlVMTDsKKwlpbnQgaSwgY250LCBzaXplOworCXJlZ2V4X3QgcmU7CisKKwljbnQgPSBzaXplID0gMDsKKwkvKiBTa2lwIGlmIGVtcHR5ICovCisJaWYgKHN0cmxlbihwYXR0ZXJuKSA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAocmVnY29tcCgmcmUsIHBhdHRlcm4sIFJFR19FWFRFTkRFRHxSRUdfTk9TVUJ8UkVHX0lDQVNFKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSB7CisJCWlmIChzeW0tPmZsYWdzICYgU1lNQk9MX0NPTlNUIHx8ICFzeW0tPm5hbWUpCisJCQljb250aW51ZTsKKwkJaWYgKHJlZ2V4ZWMoJnJlLCBzeW0tPm5hbWUsIDAsIE5VTEwsIDApKQorCQkJY29udGludWU7CisJCWlmIChjbnQgKyAxID49IHNpemUpIHsKKwkJCXZvaWQgKnRtcCA9IHN5bV9hcnI7CisJCQlzaXplICs9IDE2OworCQkJc3ltX2FyciA9IHJlYWxsb2Moc3ltX2Fyciwgc2l6ZSAqIHNpemVvZihzdHJ1Y3Qgc3ltYm9sICopKTsKKwkJCWlmICghc3ltX2FycikgeworCQkJCWZyZWUodG1wKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCQlzeW1fYXJyW2NudCsrXSA9IHN5bTsKKwl9CisJaWYgKHN5bV9hcnIpCisJCXN5bV9hcnJbY250XSA9IE5VTEw7CisJcmVnZnJlZSgmcmUpOworCisJcmV0dXJuIHN5bV9hcnI7Cit9CisKKworc3RydWN0IHN5bWJvbCAqc3ltX2NoZWNrX2RlcHMoc3RydWN0IHN5bWJvbCAqc3ltKTsKKworc3RhdGljIHN0cnVjdCBzeW1ib2wgKnN5bV9jaGVja19leHByX2RlcHMoc3RydWN0IGV4cHIgKmUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCisJaWYgKCFlKQorCQlyZXR1cm4gTlVMTDsKKwlzd2l0Y2ggKGUtPnR5cGUpIHsKKwljYXNlIEVfT1I6CisJY2FzZSBFX0FORDoKKwkJc3ltID0gc3ltX2NoZWNrX2V4cHJfZGVwcyhlLT5sZWZ0LmV4cHIpOworCQlpZiAoc3ltKQorCQkJcmV0dXJuIHN5bTsKKwkJcmV0dXJuIHN5bV9jaGVja19leHByX2RlcHMoZS0+cmlnaHQuZXhwcik7CisJY2FzZSBFX05PVDoKKwkJcmV0dXJuIHN5bV9jaGVja19leHByX2RlcHMoZS0+bGVmdC5leHByKTsKKwljYXNlIEVfRVFVQUw6CisJY2FzZSBFX1VORVFVQUw6CisJCXN5bSA9IHN5bV9jaGVja19kZXBzKGUtPmxlZnQuc3ltKTsKKwkJaWYgKHN5bSkKKwkJCXJldHVybiBzeW07CisJCXJldHVybiBzeW1fY2hlY2tfZGVwcyhlLT5yaWdodC5zeW0pOworCWNhc2UgRV9TWU1CT0w6CisJCXJldHVybiBzeW1fY2hlY2tfZGVwcyhlLT5sZWZ0LnN5bSk7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXByaW50ZigiT29wcyEgSG93IHRvIGNoZWNrICVkP1xuIiwgZS0+dHlwZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBzeW1ib2wgKnN5bV9jaGVja19kZXBzKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0yOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKworCWlmIChzeW0tPmZsYWdzICYgU1lNQk9MX0NIRUNLKSB7CisJCXByaW50ZigiV2FybmluZyEgRm91bmQgcmVjdXJzaXZlIGRlcGVuZGVuY3k6ICVzIiwgc3ltLT5uYW1lKTsKKwkJcmV0dXJuIHN5bTsKKwl9CisJaWYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfQ0hFQ0tFRCkKKwkJcmV0dXJuIE5VTEw7CisKKwlzeW0tPmZsYWdzIHw9IChTWU1CT0xfQ0hFQ0sgfCBTWU1CT0xfQ0hFQ0tFRCk7CisJc3ltMiA9IHN5bV9jaGVja19leHByX2RlcHMoc3ltLT5yZXZfZGVwLmV4cHIpOworCWlmIChzeW0yKQorCQlnb3RvIG91dDsKKworCWZvciAocHJvcCA9IHN5bS0+cHJvcDsgcHJvcDsgcHJvcCA9IHByb3AtPm5leHQpIHsKKwkJaWYgKHByb3AtPnR5cGUgPT0gUF9DSE9JQ0UgfHwgcHJvcC0+dHlwZSA9PSBQX1NFTEVDVCkKKwkJCWNvbnRpbnVlOworCQlzeW0yID0gc3ltX2NoZWNrX2V4cHJfZGVwcyhwcm9wLT52aXNpYmxlLmV4cHIpOworCQlpZiAoc3ltMikKKwkJCWdvdG8gb3V0OworCQlpZiAocHJvcC0+dHlwZSAhPSBQX0RFRkFVTFQgfHwgc3ltX2lzX2Nob2ljZShzeW0pKQorCQkJY29udGludWU7CisJCXN5bTIgPSBzeW1fY2hlY2tfZXhwcl9kZXBzKHByb3AtPmV4cHIpOworCQlpZiAoc3ltMikKKwkJCWdvdG8gb3V0OworCX0KK291dDoKKwlpZiAoc3ltMikgeworCQlwcmludGYoIiAlcyIsIHN5bS0+bmFtZSk7CisJCWlmIChzeW0yID09IHN5bSkgeworCQkJcHJpbnRmKCJcbiIpOworCQkJc3ltMiA9IE5VTEw7CisJCX0KKwl9CisJc3ltLT5mbGFncyAmPSB+U1lNQk9MX0NIRUNLOworCXJldHVybiBzeW0yOworfQorCitzdHJ1Y3QgcHJvcGVydHkgKnByb3BfYWxsb2MoZW51bSBwcm9wX3R5cGUgdHlwZSwgc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgcHJvcGVydHkgKipwcm9wcDsKKworCXByb3AgPSBtYWxsb2Moc2l6ZW9mKCpwcm9wKSk7CisJbWVtc2V0KHByb3AsIDAsIHNpemVvZigqcHJvcCkpOworCXByb3AtPnR5cGUgPSB0eXBlOworCXByb3AtPnN5bSA9IHN5bTsKKwlwcm9wLT5maWxlID0gY3VycmVudF9maWxlOworCXByb3AtPmxpbmVubyA9IHpjb25mX2xpbmVubygpOworCisJLyogYXBwZW5kIHByb3BlcnR5IHRvIHRoZSBwcm9wIGxpc3Qgb2Ygc3ltYm9sICovCisJaWYgKHN5bSkgeworCQlmb3IgKHByb3BwID0gJnN5bS0+cHJvcDsgKnByb3BwOyBwcm9wcCA9ICYoKnByb3BwKS0+bmV4dCkKKwkJCTsKKwkJKnByb3BwID0gcHJvcDsKKwl9CisKKwlyZXR1cm4gcHJvcDsKK30KKworc3RydWN0IHN5bWJvbCAqcHJvcF9nZXRfc3ltYm9sKHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCkKK3sKKwlpZiAocHJvcC0+ZXhwciAmJiAocHJvcC0+ZXhwci0+dHlwZSA9PSBFX1NZTUJPTCB8fAorCQkJICAgcHJvcC0+ZXhwci0+dHlwZSA9PSBFX0NIT0lDRSkpCisJCXJldHVybiBwcm9wLT5leHByLT5sZWZ0LnN5bTsKKwlyZXR1cm4gTlVMTDsKK30KKworY29uc3QgY2hhciAqcHJvcF9nZXRfdHlwZV9uYW1lKGVudW0gcHJvcF90eXBlIHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBQX1BST01QVDoKKwkJcmV0dXJuICJwcm9tcHQiOworCWNhc2UgUF9DT01NRU5UOgorCQlyZXR1cm4gImNvbW1lbnQiOworCWNhc2UgUF9NRU5VOgorCQlyZXR1cm4gIm1lbnUiOworCWNhc2UgUF9ERUZBVUxUOgorCQlyZXR1cm4gImRlZmF1bHQiOworCWNhc2UgUF9DSE9JQ0U6CisJCXJldHVybiAiY2hvaWNlIjsKKwljYXNlIFBfU0VMRUNUOgorCQlyZXR1cm4gInNlbGVjdCI7CisJY2FzZSBQX1JBTkdFOgorCQlyZXR1cm4gInJhbmdlIjsKKwljYXNlIFBfVU5LTk9XTjoKKwkJYnJlYWs7CisJfQorCXJldHVybiAidW5rbm93biI7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvdXRpbC5jIGIvc2NyaXB0cy9rY29uZmlnL3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzM2OWU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL3V0aWwuYwpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgU2FtIFJhdm5ib3JnIDxzYW1AcmF2bmJvcmcub3JnPgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlICJsa2MuaCIKKworLyogZmlsZSBhbHJlYWR5IHByZXNlbnQgaW4gbGlzdD8gSWYgbm90IGFkZCBpdCAqLworc3RydWN0IGZpbGUgKmZpbGVfbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGZpbGUgKmZpbGU7CisKKwlmb3IgKGZpbGUgPSBmaWxlX2xpc3Q7IGZpbGU7IGZpbGUgPSBmaWxlLT5uZXh0KSB7CisJCWlmICghc3RyY21wKG5hbWUsIGZpbGUtPm5hbWUpKQorCQkJcmV0dXJuIGZpbGU7CisJfQorCisJZmlsZSA9IG1hbGxvYyhzaXplb2YoKmZpbGUpKTsKKwltZW1zZXQoZmlsZSwgMCwgc2l6ZW9mKCpmaWxlKSk7CisJZmlsZS0+bmFtZSA9IHN0cmR1cChuYW1lKTsKKwlmaWxlLT5uZXh0ID0gZmlsZV9saXN0OworCWZpbGVfbGlzdCA9IGZpbGU7CisJcmV0dXJuIGZpbGU7Cit9CisKKy8qIHdyaXRlIGEgZGVwZW5kZW5jeSBmaWxlIGFzIHVzZWQgYnkga2J1aWxkIHRvIHRyYWNrIGRlcGVuZGVuY2llcyAqLworaW50IGZpbGVfd3JpdGVfZGVwKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJRklMRSAqb3V0OworCisJaWYgKCFuYW1lKQorCQluYW1lID0gIi5rY29uZmlnLmQiOworCW91dCA9IGZvcGVuKCIuLmNvbmZpZy50bXAiLCAidyIpOworCWlmICghb3V0KQorCQlyZXR1cm4gMTsKKwlmcHJpbnRmKG91dCwgImRlcHNfY29uZmlnIDo9IFxcXG4iKTsKKwlmb3IgKGZpbGUgPSBmaWxlX2xpc3Q7IGZpbGU7IGZpbGUgPSBmaWxlLT5uZXh0KSB7CisJCWlmIChmaWxlLT5uZXh0KQorCQkJZnByaW50ZihvdXQsICJcdCVzIFxcXG4iLCBmaWxlLT5uYW1lKTsKKwkJZWxzZQorCQkJZnByaW50ZihvdXQsICJcdCVzXG4iLCBmaWxlLT5uYW1lKTsKKwl9CisJZnByaW50ZihvdXQsCisJCSJcbiIKKwkJIi5jb25maWcgaW5jbHVkZS9hdXRvY29uZi5oOiAkKGRlcHNfY29uZmlnKVxuIgorCQkiXG4iCisJCSJpbmNsdWRlL2F1dG9jb25mLmg6IC5jb25maWdcbiIgLyogYmJveCAqLworCQkiXG4iCisJCSIkKGRlcHNfY29uZmlnKTpcbiIpOworCWZjbG9zZShvdXQpOworCXJlbmFtZSgiLi5jb25maWcudG1wIiwgbmFtZSk7CisJcmV0dXJuIDA7Cit9CisKKworLyogQWxsb2NhdGUgaW5pdGlhbCBncm93YWJsZSBzdHJpbmcgKi8KK3N0cnVjdCBnc3RyIHN0cl9uZXcodm9pZCkKK3sKKwlzdHJ1Y3QgZ3N0ciBnczsKKwlncy5zID0gbWFsbG9jKHNpemVvZihjaGFyKSAqIDY0KTsKKwlncy5sZW4gPSAxNjsKKwlzdHJjcHkoZ3MucywgIlwwIik7CisJcmV0dXJuIGdzOworfQorCisvKiBBbGxvY2F0ZSBhbmQgYXNzaWduIGdyb3dhYmxlIHN0cmluZyAqLworc3RydWN0IGdzdHIgc3RyX2Fzc2lnbihjb25zdCBjaGFyICpzKQoreworCXN0cnVjdCBnc3RyIGdzOworCWdzLnMgPSBzdHJkdXAocyk7CisJZ3MubGVuID0gc3RybGVuKHMpICsgMTsKKwlyZXR1cm4gZ3M7Cit9CisKKy8qIEZyZWUgc3RvcmFnZSBmb3IgZ3Jvd2FibGUgc3RyaW5nICovCit2b2lkIHN0cl9mcmVlKHN0cnVjdCBnc3RyICpncykKK3sKKwlmcmVlKGdzLT5zKTsKKwlncy0+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+bmV4dCkgeworCQkJCW1lbnUgPSBtZW51LT5uZXh0OworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorfQorCisjaW5jbHVkZSAibGV4Lnpjb25mLmMiCisjaW5jbHVkZSAidXRpbC5jIgorI2luY2x1ZGUgImNvbmZkYXRhLmMiCisjaW5jbHVkZSAiZXhwci5jIgorI2luY2x1ZGUgInN5bWJvbC5jIgorI2luY2x1ZGUgIm1lbnUuYyIKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWVtdXNhZ2UgYi9zY3JpcHRzL21lbXVzYWdlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRlZjU2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL21lbXVzYWdlCkBAIC0wLDAgKzEsMTYgQEAKKyMhL2Jpbi9zaAorCitidXN5Ym94PS4uL2J1c3lib3gKKworaT00MDAwCitlY2hvICJCZWZvcmUgd2Ugc3RhcnRlZCAkaSBjb3BpZXMgb2YgJyRidXN5Ym94IHNsZWVwIDEwJzoiCiskYnVzeWJveCBubWV0ZXIgJyV0ICVbcG5dICVtJyB8IGhlYWQgLTMKKword2hpbGUgdGVzdCAkaSAhPSAwOyBkbworICAgICRidXN5Ym94IHNsZWVwIDEwICYKKyAgICBpPSQoKGktMSkpCitkb25lCitzbGVlcCAxCisKK2VjaG8gIkFmdGVyOiIKKyRidXN5Ym94IG5tZXRlciAnJXQgJVtwbl0gJW0nIHwgaGVhZCAtMwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ta2NvbmZpZ3MgYi9zY3JpcHRzL21rY29uZmlncwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42YTI2ZmUxCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9ta2NvbmZpZ3MKQEAgLTAsMCArMSw3NiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoQykgMjAwMiBLaGFsaWQgQXppeiA8a2hhbGlkX2F6aXogYXQgaHAuY29tPgorIyBDb3B5cmlnaHQgKEMpIDIwMDIgUmFuZHkgRHVubGFwIDxyZGR1bmxhcCBhdCBvc2RsLm9yZz4KKyMgQ29weXJpZ2h0IChDKSAyMDAyIEFsIFN0b25lIDxhaHMzIGF0IGZjLmhwLmNvbT4KKyMgQ29weXJpZ2h0IChDKSAyMDAyIEhld2xldHQtUGFja2FyZCBDb21wYW55CisjCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyMKKyMgICBCdXN5Ym94IHZlcnNpb24gYnkgTWF0dGVvIENyb2NlIDwzMjk3NjI3Nzk5IGF0IHdpbmQuaXQ+CisjCisjIFJ1bGVzIHRvIGdlbmVyYXRlIGJiY29uZmlnb3B0cy5oIGZyb20gLmNvbmZpZzoKKyMgICAgICAtIFJldGFpbiBsaW5lcyB0aGF0IGJlZ2luIHdpdGggIkNPTkZJR18iCisjICAgICAgLSBSZXRhaW4gbGluZXMgdGhhdCBiZWdpbiB3aXRoICIjIENPTkZJR18iCisjICAgICAgLSBsaW5lcyB0aGF0IHVzZSBkb3VibGUtcXVvdGVzIG11c3QgXFwtZXNjYXBlLXF1b3RlIHRoZW0KKworY29uZmlnPS5jb25maWcKKworeworZWNobyAiXAorI2lmbmRlZiBfQkJDT05GSUdPUFRTX0gKKyNkZWZpbmUgX0JCQ09ORklHT1BUU19ICisvKgorICogYnVzeWJveCBjb25maWd1cmF0aW9uIHNldHRpbmdzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHNjcmlwdHMvbWtjb25maWdzLgorICogRG8gbm90IGVkaXQuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGJiY29uZmlnX2NvbmZpZ1tdIEFMSUdOMSA9IgorCitncmVwIC1lICdeIyBDT05GSUdfJyAtZSAnXkNPTkZJR18nICIkY29uZmlnIiBcCit8IHNlZCAtZSAncy9cIi9cXFwiL2cnIC1lICdzL14vIi8nIC1lICdzLyQvXFxuIi8nCisKK2VjaG8gIjsiCitlY2hvICIjZW5kaWYiCit9ID4iJDEiCisKK3sKK2VjaG8gIlwKKyNpZm5kZWYgX0JCQ09ORklHT1BUU19CWjJfSAorI2RlZmluZSBfQkJDT05GSUdPUFRTX0JaMl9ICisvKgorICogYnVzeWJveCBjb25maWd1cmF0aW9uIHNldHRpbmdzLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHNjcmlwdHMvbWtjb25maWdzLgorICogRG8gbm90IGVkaXQuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyIGJiY29uZmlnX2NvbmZpZ19iejJbXSBBTElHTjEgPSB7IgorCitncmVwIC1lICdeIyBDT05GSUdfJyAtZSAnXkNPTkZJR18nICIkY29uZmlnIiBcCit8IGJ6aXAyIC0xIHwgZGQgYnM9MiBza2lwPTEgMj4vZGV2L251bGwgXAorfCBvZCAtdiAtYiBcCit8IHNlZCAtZSAncy9eW14gXSovLycgXAorICAgICAgICAtZSAncy8gLy9nJyBcCisgICAgICAgIC1lICcvXiQvZCcgXAorICAgICAgICAtZSAncy9cKC4uLlwpLzBcMSwvZycKKworZWNobyAifTsiCitlY2hvICIjZW5kaWYiCit9ID4iJDIiCmRpZmYgLS1naXQgYS9zY3JpcHRzL21rZGlmZl9vYmogYi9zY3JpcHRzL21rZGlmZl9vYmoKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzA3NDc0OAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbWtkaWZmX29iagpAQCAtMCwwICsxLDQ2IEBACisjIS9iaW4vc2gKKwordXNhZ2UoKSB7CisJZWNobyAiVXNhZ2U6ICR7MCMjKi99IERJUjEgRElSMiIKKwllY2hvCisJZWNobyAiQ29tcGFyZXMgYWxsIG9iamVjdCBmaWxlcyByZWN1cnNpdmVsdHkgZm91bmQgaW4gRElSMSBhbmQgRElSMi4iCisJZWNobyAiUHJpbnRzIGRpZmYgb2YgdGhlaXIgZGlzYXNzZW1ibHkuIgorCWVjaG8KKwlleGl0ICQxCit9CisKK2ZpbHRlcigpIHsKKwkjIHNlZCByZW1vdmVzICIgYWRkcmVzczogIiBwcmVmaXhlcyB3aGljaCBtZXNzIHVwIGRpZmYKKwlzZWQgJCdzL15cXChcdCpcXClbIF0qWzAtOWEtZl1bMC05YS1mXSo6WyBcdF0qL1xcMS8nIFwKKwl8IHNlZCAncy9fX0dJXy8vZycKK30KKwordGVzdCAtZCAiJDEiIHx8IHVzYWdlIDEKK3Rlc3QgLWQgIiQyIiB8fCB1c2FnZSAxCisKK3sKKwkoCisJCWNkICIkMSIgfHwgZXhpdCAxCisJCWZpbmQgLW5hbWUgJyoubycgIyAtbyAtbmFtZSAnKi5vcycgIyAtbyAtbmFtZSAnKi5zbycKKwkpCisJKAorCQljZCAiJDIiIHx8IGV4aXQgMQorCQlmaW5kIC1uYW1lICcqLm8nICMgLW8gLW5hbWUgJyoub3MnICMgLW8gLW5hbWUgJyouc28nCisJKQorfSB8IHNlZCAnczpeXC4vOjonIHwgc29ydCB8IHVuaXEgfCBcCisoCit3aGlsZSBJRlM9JycgcmVhZCAtciBvbmFtZTsgZG8KKwlpZiAhIHRlc3QgLWYgIiQxLyRvbmFtZSI7IHRoZW4KKwkJZWNobyAiT25seSAkMi8kb25hbWUiCisJCWNvbnRpbnVlCisJZmkKKwlpZiAhIHRlc3QgLWYgIiQyLyRvbmFtZSI7IHRoZW4KKwkJZWNobyAiT25seSAkMS8kb25hbWUiCisJCWNvbnRpbnVlCisJZmkKKwlkaWZmIC1xIC0tICIkMS8kb25hbWUiICIkMi8kb25hbWUiID4vZGV2L251bGwgJiYgY29udGludWUKKwkoY2QgIiQxIiAmJiB7IHNpemUgIiRvbmFtZSI7IG9iamR1bXAgLWRyICIkb25hbWUiIHwgZmlsdGVyOyB9ID4iJG9uYW1lLmRpc2FzbSIpCisJKGNkICIkMiIgJiYgeyBzaXplICIkb25hbWUiOyBvYmpkdW1wIC1kciAiJG9uYW1lIiB8IGZpbHRlcjsgfSA+IiRvbmFtZS5kaXNhc20iKQorCWRpZmYgLXUgLS0gIiQxLyRvbmFtZS5kaXNhc20iICIkMi8kb25hbWUuZGlzYXNtIgorZG9uZQorKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ta2RpZmZfb2JqX2Jsb2F0IGIvc2NyaXB0cy9ta2RpZmZfb2JqX2Jsb2F0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYzYjJjMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL21rZGlmZl9vYmpfYmxvYXQKQEAgLTAsMCArMSwzMyBAQAorIyEvYmluL3NoCisKK3Rlc3QgLWQgIiQxIiB8fCBleGl0IDEKK3Rlc3QgLWQgIiQyIiB8fCBleGl0IDEKKworeworCSgKKwkJY2QgIiQxIiB8fCBleGl0IDEKKwkJZmluZCAtbmFtZSAnKi5vJyAtbyAtbmFtZSAnKi5vcycgIyAtbyAtbmFtZSAnKi5zbycKKwkpCisJKAorCQljZCAiJDIiIHx8IGV4aXQgMQorCQlmaW5kIC1uYW1lICcqLm8nIC1vIC1uYW1lICcqLm9zJyAjIC1vIC1uYW1lICcqLnNvJworCSkKK30gfCBzZWQgJ3M6XlwuLzo6JyB8IHNvcnQgfCB1bmlxIHwgXAordGVlIExTVCB8IFwKKygKK0lGUz0nJword2hpbGUgcmVhZCAtciBvbmFtZTsgZG8KKwlpZiAhIHRlc3QgLWYgIiQxLyRvbmFtZSI7IHRoZW4KKwkJZWNobyAiT25seSAkMi8kb25hbWUiCisJCWNvbnRpbnVlCisJZmkKKwlpZiAhIHRlc3QgLWYgIiQyLyRvbmFtZSI7IHRoZW4KKwkJZWNobyAiT25seSAkMS8kb25hbWUiCisJCWNvbnRpbnVlCisJZmkKKwkkMS9zY3JpcHRzL2Jsb2F0LW8tbWV0ZXIgJDEvJG9uYW1lICQyLyRvbmFtZSB8IGdyZXAgJ290YWw6IDAgYnl0ZScgPi9kZXYvbnVsbCAmJiBjb250aW51ZQorCSQxL3NjcmlwdHMvYmxvYXQtby1tZXRlciAkMS8kb25hbWUgJDIvJG9uYW1lCisJc2l6ZSAkMS8kb25hbWUgJDIvJG9uYW1lCisJZWNobworZG9uZQorKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ta21ha2VmaWxlIGIvc2NyaXB0cy9ta21ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjlmYzUxYTcKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL21rbWFrZWZpbGUKQEAgLTAsMCArMSwzOSBAQAorIyEvYmluL3NoCisjIEdlbmVyYXRlcyBhIHNtYWxsIE1ha2VmaWxlIHVzZWQgaW4gdGhlIHJvb3Qgb2YgdGhlIG91dHB1dAorIyBkaXJlY3RvcnksIHRvIGFsbG93IG1ha2UgdG8gYmUgc3RhcnRlZCBmcm9tIHRoZXJlLgorIyBUaGUgTWFrZWZpbGUgYWxzbyBhbGxvdyBmb3IgbW9yZSBjb252aW5pZW50IGJ1aWxkIG9mIGV4dGVybmFsIG1vZHVsZXMKKworIyBVc2FnZQorIyAkMSAtIEtlcm5lbCBzcmMgZGlyZWN0b3J5CisjICQyIC0gT3V0cHV0IGRpcmVjdG9yeQorIyAkMyAtIHZlcnNpb24KKyMgJDQgLSBwYXRjaGxldmVsCisKKwordGVzdCAhIC1yICQyL01ha2VmaWxlIC1vIC1PICQyL01ha2VmaWxlIHx8IGV4aXQgMAorZWNobyAiICBHRU4gICAgICQyL01ha2VmaWxlIgorCitjYXQgPDwgRU9GID4gJDIvTWFrZWZpbGUKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgJDA6IGRvbid0IGVkaXQKKworVkVSU0lPTiA9ICQzCitQQVRDSExFVkVMID0gJDQKKworS0VSTkVMU1JDICAgIDo9ICQxCitLRVJORUxPVVRQVVQgOj0gJDIKKworTUFLRUZMQUdTICs9IC0tbm8tcHJpbnQtZGlyZWN0b3J5CisKKy5QSE9OWTogYWxsIFwkKE1BS0VDTURHT0FMUykKKworYWxsOgorCVwkKE1BS0UpIC1DIFwkKEtFUk5FTFNSQykgTz1cJChLRVJORUxPVVRQVVQpCisKK01ha2VmaWxlOjsKKworXCQoZmlsdGVyLW91dCBhbGwgTWFrZWZpbGUsXCQoTUFLRUNNREdPQUxTKSk6CisJXCQoTUFLRSkgLUMgXCQoS0VSTkVMU1JDKSBPPVwkKEtFUk5FTE9VVFBVVCkgXCRACisKKyUvOgorCVwkKE1BS0UpIC1DIFwkKEtFUk5FTFNSQykgTz1cJChLRVJORUxPVVRQVVQpIFwkQAorRU9GCmRpZmYgLS1naXQgYS9zY3JpcHRzL29ianNpemVzIGIvc2NyaXB0cy9vYmpzaXplcwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZGYwYzRmCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9vYmpzaXplcwpAQCAtMCwwICsxLDE5IEBACisjIS9iaW4vc2gKKwordF90ZXh0PTAKK3RfZGF0YT0wCit0X2Jzcz0wCisKK3ByaW50ZiAiJTlzICUxMXMgJTlzICU5cyAlc1xuIiAidGV4dCtkYXRhIiAidGV4dCtyb2RhdGEiIHJ3ZGF0YSBic3MgZmlsZW5hbWUKKworZmluZCAtbmFtZSAnKi5vJyB8IGdyZXAgLXYgJ15cLi9zY3JpcHRzLycgfCBncmVwIC12RiBidWlsdC1pbi5vIFwKK3wgc2VkICdzOl5cLi86OicgfCB4YXJncyAiJHtDUk9TU19DT01QSUxFfXNpemUiIHwgZ3JlcCAnXiAqWzAtOV0nIFwKK3wgeword2hpbGUgcmVhZCB0ZXh0IGRhdGEgYnNzIGRlYyBoZXggZmlsZW5hbWU7IGRvCisgICAgdF90ZXh0PSQoKHRfdGV4dCt0ZXh0KSkKKyAgICB0X2RhdGE9JCgodF9kYXRhK2RhdGEpKQorICAgIHRfYnNzPSQoKHRfYnNzK2JzcykpCisgICAgcHJpbnRmICIlOWQgJTExZCAlOWQgJTlkICVzXG4iICQoKHRleHQrZGF0YSkpICR0ZXh0ICRkYXRhICRic3MgIiRmaWxlbmFtZSIKK2RvbmUKK3ByaW50ZiAiJTlkICUxMWQgJTlkICU5ZCAlc1xuIiAkKCh0X3RleHQrdF9kYXRhKSkgJHRfdGV4dCAkdF9kYXRhICR0X2JzcyAiVE9UQUwiCit9IHwgZW52IC11TEFORyAtdUxDX0FMTCBzb3J0IC1yCmRpZmYgLS1naXQgYS9zY3JpcHRzL3JhbmRvbXRlc3QgYi9zY3JpcHRzL3JhbmRvbXRlc3QKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTI1MTNkMAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvcmFuZG9tdGVzdApAQCAtMCwwICsxLDEwMCBAQAorIyEvYmluL3NoCisKKyMgSWYgbm90IHNwZWNpZmllZCBpbiBlbnZpcm9ubWVudC4uLgoraWYgISB0ZXN0ICIkTElCQyI7IHRoZW4KKwkjIFNlbGVjdCB3aGljaCBsaWJjIHRvIGJ1aWxkIGFnYWluc3QKKwlMSUJDPSJnbGliYyIKKwlMSUJDPSJ1Y2xpYmMiCitmaQorIyB4ODYgMzItYml0OgorI0NST1NTX0NPTVBJTEVSX1BSRUZJWD0iaTQ4Ni1saW51eC11Y2xpYmMtIgorIyBNeSBzeXN0ZW0gaGFzIHN0cmFuZ2UgcHJlZml4IGZvciB4ODYgNjQtYml0IHVjbGliYzoKKyNDUk9TU19DT01QSUxFUl9QUkVGSVg9Ing4Nl82NC1wYy1saW51eC1nbnUtIgorCitpZiB0ZXN0ICQjIC1sdCAyIHx8ICEgdGVzdCAtZCAiJDEiIHx8IHRlc3QgLWUgIiQyIjsgdGhlbgorCWVjaG8gIlVzYWdlOiAkMCBTUkNfRElSIFRNUF9ESVIiCisJZWNobworCWVjaG8gIlNSQ19ESVIgd2lsbCBiZSBjb3BpZWQgdG8gVE1QX0RJUiBkaXJlY3RvcnkuIgorCWVjaG8gIlRoZW4gYSByYW5kb20gYnVpbGQgd2lsbCBiZSBwZXJmb3JtZWQuIgorCWVjaG8KKwllY2hvICJVc2VmdWwgdmFyaWFibGVzOiIKKwllY2hvICJcJExJQkMsIFwkQ1JPU1NfQ09NUElMRVJfUFJFRklYLCBcJE1BS0VPUFRTIgorCWV4aXQgMQorZmkKKworY3AgLWRwciAtLSAiJDEiICIkMiIgfHwgeyBlY2hvICJjb3B5IGVycm9yIjsgZXhpdCAxOyB9CitjZCAtLSAiJDIiIHx8IHsgZWNobyAiY2QgJGRpciBlcnJvciI7IGV4aXQgMTsgfQorCisjIEdlbmVyYXRlIHJhbmRvbSBjb25maWcKK21ha2UgcmFuZGNvbmZpZyA+L2Rldi9udWxsIHx8IHsgZWNobyAicmFuZGNvbmZpZyBlcnJvciI7IGV4aXQgMTsgfQorCisjIFR3ZWFrIHJlc3VsdGluZyBjb25maWcKK2NhdCAuY29uZmlnIFwKK3wgZ3JlcCAtdiBDT05GSUdfREVCVUdfUEVTU0lNSVpFIFwKK3wgZ3JlcCAtdiBDT05GSUdfV0VSUk9SIFwKK3wgZ3JlcCAtdiBDT05GSUdfQ1JPU1NfQ09NUElMRVJfUFJFRklYIFwKK3wgZ3JlcCAtdiBDT05GSUdfU0VMSU5VWCBcCit8IGdyZXAgLXYgQ09ORklHX0VGRU5DRSBcCit8IGdyZXAgLXYgQ09ORklHX0RNQUxMT0MgXAorXAorfCBncmVwIC12IENPTkZJR19SRktJTEwgXAorPi5jb25maWcubmV3CittdiAuY29uZmlnLm5ldyAuY29uZmlnCitlY2hvICcjIENPTkZJR19ERUJVR19QRVNTSU1JWkUgaXMgbm90IHNldCcgPj4uY29uZmlnCitlY2hvICcjIENPTkZJR19XRVJST1IgaXMgbm90IHNldCcgPj4uY29uZmlnCitlY2hvICJDT05GSUdfQ1JPU1NfQ09NUElMRVJfUFJFRklYPVwiJHtDUk9TU19DT01QSUxFUl9QUkVGSVh9XCIiID4+LmNvbmZpZworZWNobyAnIyBDT05GSUdfU0VMSU5VWCBpcyBub3Qgc2V0JyA+Pi5jb25maWcKK2VjaG8gJyMgQ09ORklHX0VGRU5DRSBpcyBub3Qgc2V0JyA+Pi5jb25maWcKK2VjaG8gJyMgQ09ORklHX0RNQUxMT0MgaXMgbm90IHNldCcgPj4uY29uZmlnCitlY2hvICcjIENPTkZJR19SRktJTEwgaXMgbm90IHNldCcgPj4uY29uZmlnCisKKyMgSWYgZ2xpYmMsIGRvbid0IGJ1aWxkIHN0YXRpYworaWYgdGVzdCB4IiRMSUJDIiA9IHgiZ2xpYmMiOyB0aGVuCisJY2F0IC5jb25maWcgXAorCXwgZ3JlcCAtdiBDT05GSUdfU1RBVElDIFwKKwk+LmNvbmZpZy5uZXcKKwltdiAuY29uZmlnLm5ldyAuY29uZmlnCisJZWNobyAnIyBDT05GSUdfU1RBVElDIGlzIG5vdCBzZXQnID4+LmNvbmZpZworZmkKKworIyBJZiB1Y2xpYmMsIGJ1aWxkIHN0YXRpYywgYW5kIHJlbW92ZSBzb21lIHRoaW5ncworIyBsaWtlbHkgdG8gbm90IHdvcmsgb24gdWNsaWJjLgoraWYgdGVzdCB4IiRMSUJDIiA9IHgidWNsaWJjIjsgdGhlbgorCWNhdCAuY29uZmlnIFwKKwl8IGdyZXAgLXYgQ09ORklHX1NUQVRJQyBcCisJfCBncmVwIC12IENPTkZJR19CVUlMRF9MSUJCVVNZQk9YIFwKKwl8IGdyZXAgLXYgQ09ORklHX1BJRSBcCisJXAorCXwgZ3JlcCAtdiBDT05GSUdfRkVBVFVSRV8yXzRfTU9EVUxFUyBcCisJfCBncmVwIC12IENPTkZJR19GRUFUVVJFX1NZTkNfRkFOQ1kgXAorCXwgZ3JlcCAtdiBDT05GSUdfRkVBVFVSRV9UT1VDSF9OT0RFUkVGIFwKKwk+LmNvbmZpZy5uZXcKKwltdiAuY29uZmlnLm5ldyAuY29uZmlnCisJZWNobyAnQ09ORklHX1NUQVRJQz15JyA+Pi5jb25maWcKKwllY2hvICcjIENPTkZJR19CVUlMRF9MSUJCVVNZQk9YIGlzIG5vdCBzZXQnID4+LmNvbmZpZworCWVjaG8gJyMgQ09ORklHX1BJRSBpcyBub3Qgc2V0JyA+Pi5jb25maWcKKwllY2hvICcjIENPTkZJR19GRUFUVVJFXzJfNF9NT0RVTEVTIGlzIG5vdCBzZXQnID4+LmNvbmZpZworCWVjaG8gJyMgQ09ORklHX0ZFQVRVUkVfU1lOQ19GQU5DWSBpcyBub3Qgc2V0JyA+Pi5jb25maWcKKwllY2hvICcjIENPTkZJR19GRUFUVVJFX1RPVUNIX05PREVSRUYgaXMgbm90IHNldCcgPj4uY29uZmlnCitmaQorCisjIElmIFNUQVRJQywgcmVtb3ZlIHNvbWUgdGhpbmdzLgorIyBQQU0gd2l0aCBzdGF0aWMgbGlua2luZyBpcyBwcm9iYWJseSBwb2ludGxlc3MKKyMgKGJ1dCBJIG5lZWQgdG8gdHJ5IC0gbm93IEkgZG9uJ3QgaGF2ZSBsaWJwYW0uYSBvbiBteSBzeXN0ZW0sIG9ubHkgbGlicGFtLnNvKQoraWYgZ3JlcCAtcSAiXkNPTkZJR19TVEFUSUM9eSIgLmNvbmZpZzsgdGhlbgorCWNhdCAuY29uZmlnIFwKKwl8IGdyZXAgLXYgQ09ORklHX1BBTSBcCisJPi5jb25maWcubmV3CisJbXYgLmNvbmZpZy5uZXcgLmNvbmZpZworCWVjaG8gJyMgQ09ORklHX1BBTSBpcyBub3Qgc2V0JyA+Pi5jb25maWcKK2ZpCisKKyMgUmVnZW5lcmF0ZSAuY29uZmlnIHdpdGggZGVmYXVsdCBhbnN3ZXJzIGZvciB5YW5rZWQtb2ZmIG9wdGlvbnMKKyMgKG1vc3Qgb2YgZGVmYXVsdCBhbnN3ZXJzIGFyZSAibm8iKS4KK3sgeWVzICIiIHwgbWFrZSBvbGRjb25maWcgPi9kZXYvbnVsbDsgfSB8fCB7IGVjaG8gIm9sZGNvbmZpZyBlcnJvciI7IGV4aXQgMTsgfQorCisjIEJ1aWxkIQorbmljZSAtbiAxMCBtYWtlICRNQUtFT1BUUyAyPiYxIHwgdGVlIG1ha2UubG9nCisKKyMgUmV0dXJuIGV4aXRjb2RlIDEgaWYgYnVzeWJveCBleGVjdXRhYmxlIGRvZXMgbm90IGV4aXN0Cit0ZXN0IC14IGJ1c3lib3gKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcmFuZG9tdGVzdC5sb29wIGIvc2NyaXB0cy9yYW5kb210ZXN0Lmxvb3AKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzU4YThlOAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvcmFuZG9tdGVzdC5sb29wCkBAIC0wLDAgKzEsNDQgQEAKKyMhL2Jpbi9zaAorCitydW5fdGVzdHN1aXRlPXRydWUKKwordGVzdCAtZCAiJDEiIHx8IHsgZWNobyAiJyQxJyBpcyBub3QgYSBkaXJlY3RvcnkiOyBleGl0IDE7IH0KK3Rlc3QgLXggIiQxL3NjcmlwdHMvcmFuZG9tdGVzdCIgfHwgeyBlY2hvICJObyBzY3JpcHRzL3JhbmRvbXRlc3QgaW4gJyQxJyI7IGV4aXQgMTsgfQorCitleHBvcnQgTElCQz0idWNsaWJjIgorZXhwb3J0IENST1NTX0NPTVBJTEVSX1BSRUZJWD0iaTY4Ni0iCitleHBvcnQgTUFLRU9QVFM9Ii1qOSIKKworY250PTAKK2ZhaWw9MAord2hpbGUgc2xlZXAgMTsgZG8KKwllY2hvICJQYXNzZXM6ICRjbnQgRmFpbHVyZXM6ICRmYWlsIgorCWRpcj0idGVzdC4kJCIKKwl3aGlsZSB0ZXN0IC1lICIkZGlyIiAtbyAtZSAiZmFpbGVkLiRkaXIiOyBkbworCQlkaXI9InRlc3QuJCQuJFJBTkRPTSIKKwlkb25lCisJZWNobyAiUnVubmluZyByYW5kY29uZmlnIHRlc3QgaW4gJGRpci4uLiIKKwlpZiAhICIkMS9zY3JpcHRzL3JhbmRvbXRlc3QiICIkMSIgIiRkaXIiID4vZGV2L251bGw7IHRoZW4KKwkJbXYgLS0gIiRkaXIiICJmYWlsZWQuJGRpciIKKwkJZWNobyAiRmFpbGVkIGJ1aWxkIGluOiBmYWlsZWQuJGRpciIKKwkJZXhpdCAxICMgeW91IG1heSBjb21tZW50IHRoaXMgb3V0Li4uCisJCWxldCBmYWlsKysKKwkJY29udGludWUKKwlmaQorCWlmICRydW5fdGVzdHN1aXRlOyB0aGVuCisJCSgKKwkJCWNkIC0tICIkZGlyL3Rlc3RzdWl0ZSIgfHwgZXhpdCAxCisJCQllY2hvICJSdW5uaW5nIHRlc3RzdWl0ZSBpbiAkZGlyLi4uIgorCQkJU0tJUF9LTk9XTl9CVUdTPTEgU0tJUF9JTlRFUk5FVF9URVNUUz0xIC4vcnVudGVzdCAtdiA+cnVudGVzdC5sb2cgMj4mMQorCQkpCisJCWlmIHRlc3QgJD8gIT0gMDsgdGhlbgorCQkJZWNobyAiRmFpbGVkIHJ1bnRlc3QgaW4gJGRpciIKKwkJCWV4aXQgMSAjIHlvdSBtYXkgY29tbWVudCB0aGlzIG91dC4uLgorCQkJbGV0IGZhaWwrKworCQkJY29udGludWUKKwkJZmkKKwkJdGFpbCAtbjEwIC0tICIkZGlyL3Rlc3RzdWl0ZS9ydW50ZXN0LmxvZyIKKwlmaQorCXJtIC1yZiAtLSAiJGRpciIKKwlsZXQgY250KysKK2RvbmUKZGlmZiAtLWdpdCBhL3NjcmlwdHMvc2FtcGxlX3BtYXAgYi9zY3JpcHRzL3NhbXBsZV9wbWFwCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU3ZmI0NTcKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL3NhbXBsZV9wbWFwCkBAIC0wLDAgKzEsMTEgQEAKKyMhL2Jpbi9zaAorCitidXN5Ym94PS4uL2J1c3lib3gKKworJGJ1c3lib3ggc2xlZXAgMTAgJgorcGlkPSQhCitzbGVlcCAxCisKK2VjaG8gIk1lbW9yeSBtYXAgb2YgJyRidXN5Ym94IHNsZWVwIDEwJzoiCitzaXplICRidXN5Ym94CitwbWFwICRwaWQgfCBlbnYgLSBncmVwICJeWzAtOWEtZl1bMC05YS1mXSogIiB8IHNvcnQgLXIgLXQgIiAiIC1rMiw5OTkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvc2hvd2FzbSBiL3NjcmlwdHMvc2hvd2FzbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNjFhYjk4Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9zaG93YXNtCkBAIC0wLDAgKzEsMjAgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDA2IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKyMgRHVtYiBsaXR0bGUgdXRpbGl0eSBmdW5jdGlvbiB0byBwcmludCBvdXQgdGhlIGFzc2VtYmx5IGR1bXAgb2YgYSBzaW5nbGUKKyMgZnVuY3Rpb24sIG9yIGxpc3QgdGhlIGZ1bmN0aW9ucyBzbyBkdW1wYWJsZSBpbiBhbiBleGVjdXRhYmxlLiAgWW91J2QgdGhpbmsKKyMgdGhlcmUgd291bGQgYmUgYSB3YXkgdG8gZ2V0IG9iamR1bXAgdG8gZG8gdGhpcywgYnV0IEkgY2FuJ3QgZmluZCBpdC4KKworWyAkIyAtbHQgMSBdIHx8IFsgJCMgLWd0IDIgXSAmJiB7IGVjaG8gInVzYWdlOiBzaG93YXNtIGZpbGUgZnVuY3Rpb24iOyBleGl0IDE7IH0KKworWyAhIC1mICQxIF0gJiYgeyBlY2hvICJGaWxlICQxIG5vdCBmb3VuZCI7IGV4aXQgMTsgfQorCitpZiBbICQjIC1lcSAxIF0KK3RoZW4KKyAgb2JqZHVtcCAtZCAkMSB8IHNlZCAtbiAtZSAncy9eWzAtOWEtZkEtRl0qIDxcKC4qXCk+OiQvXDEvcCcKKyAgZXhpdCAwCitmaQorCitvYmpkdW1wIC1kICQxIHwgc2VkIC1uIC1lICcvLi97SDskIWR9JyAtZSAieDsvXi5bMC05YS1mQS1GXSogPCQyPjovcCIKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdGVzdF9tYWtlX08gYi9zY3JpcHRzL3Rlc3RfbWFrZV9PCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmEwZWU2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL3Rlc3RfbWFrZV9PCkBAIC0wLDAgKzEsMTEgQEAKKyMhL2Jpbi9zaAorCitiPWBiYXNlbmFtZSAkUFdEYAordGVzdCAiJHtiI2J1c3lib3h9IiAhPSAiJGIiIHx8IHsgZWNobyAiTXVzdCBiZSBydW4gaW4gYnVzeWJveCB0cmVlIjsgZXhpdCAxOyB9CisKK3JtIC1yZiAuLi90ZXN0ZGlyX21ha2VfTy4kJAorbWtkaXIgLi4vdGVzdGRpcl9tYWtlX08uJCQKK29kaXI9YGNkIC4uL3Rlc3RkaXJfbWFrZV9PLiQkICYmIHB3ZGAKK3Rlc3QgLWQgIiRvZGlyIiB8fCBleGl0IDEKKworbWFrZSBPPSIkb2RpciIgJE1BS0VPUFRTICIkQCIgZGVmY29uZmlnIGJ1c3lib3ggMj4mMSB8IHRlZSB0ZXN0X21ha2VfTy5sb2cKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdGVzdF9tYWtlX2NsZWFuIGIvc2NyaXB0cy90ZXN0X21ha2VfY2xlYW4KbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmEzYTU0MwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvdGVzdF9tYWtlX2NsZWFuCkBAIC0wLDAgKzEsMTQgQEAKKyMhL2Jpbi9zaAorCitiPWBiYXNlbmFtZSAkUFdEYAordGVzdCAiJHtiI2J1c3lib3h9IiAhPSAiJGIiIHx8IHsgZWNobyAiTXVzdCBiZSBydW4gaW4gYnVzeWJveCB0cmVlIjsgZXhpdCAxOyB9CisKK2NkIC4uCitjcCAtcFBSICIkYiIgYnVzeWJveC4kJC50ZXN0X3RyZWUKK2NkIGJ1c3lib3guJCQudGVzdF90cmVlCittYWtlIGRlZmNvbmZpZworbWFrZSAkTUFLRU9QVFMKK21ha2UgY2xlYW4KK2NkIC4uCitkaWZmIC11cnAgIiRiIiBidXN5Ym94LiQkLnRlc3RfdHJlZSA+YnVzeWJveC4kJC50ZXN0X3RyZWUuZGlmZgorY2F0IGJ1c3lib3guJCQudGVzdF90cmVlLmRpZmYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvdHJ5bGluayBiL3NjcmlwdHMvdHJ5bGluawpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNTdhYTYyCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy90cnlsaW5rCkBAIC0wLDAgKzEsMzIzIEBACisjIS9iaW4vc2gKKworZGVidWc9ZmFsc2UKKworIyBMaW5rZXIgZmxhZ3MgdXNlZDoKKyMKKyMgSW5mb3JtYXRpb25hbDoKKyMgLS13YXJuLWNvbW1vbgorIyAtTWFwICRFWEUubWFwCisjIC0tdmVyYm9zZQorIworIyBPcHRpbWl6YXRpb25zOgorIyAtLXNvcnQtY29tbW9uICAgICAgICAgICAgICAgICByZWR1Y2VzIHBhZGRpbmcKKyMgLS1zb3J0LXNlY3Rpb24gYWxpZ25tZW50ICAgICAgcmVkdWNlcyBwYWRkaW5nCisjIC0tZ2Mtc2VjdGlvbnMgICAgICAgICAgICAgICAgIHRocm93cyBvdXQgdW51c2VkIHNlY3Rpb25zLAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCB3b3JrIGZvciBzaGFyZWQgbGlicworIyAtT24gICAgICAgICAgICAgICAgICAgICAgICAgICBOb3QgdXNlZCwgbWF5YmUgdXNlZnVsPworIworIyBMaXN0IG9mIGZpbGVzIHRvIGxpbms6CisjICRsX2xpc3QgICAgICAgICAgICAgICAgICAgICAgID09IC0tc3RhcnQtZ3JvdXAgLWxsaWIxIC1sbGliMiAtLWVuZC1ncm91cAorIyAtLXN0YXJ0LWdyb3VwICRPX0ZJTEVTICRBX0ZJTEVTIC0tZW5kLWdyb3VwCisjCisjIFNoYXJlZCBsaWJyYXJ5IGxpbms6CisjIC1zaGFyZWQgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtZXhwbGFuYXRvcnkKKyMgLWZQSUMgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24taW5kZXBlbmRlbnQgY29kZQorIyAtLWVuYWJsZS1uZXctZHRhZ3MgICAgICAgICAgICA/CisjIC16LGNvbWJyZWxvYyAgICAgICAgICAgICAgICAgID8KKyMgLXNvbmFtZT0ibGliYnVzeWJveC5zby4kQkJfVkVSIgorIyAtLXVuZGVmaW5lZD1sYmJfbWFpbiAgICAgICAgICBTZWVkIG5hbWUgdG8gc3RhcnQgcHVsbGluZyBmcm9tCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdGhlcndpc2Ugd2UnbGwgbmVlZCAtLXdob2xlLWFyY2hpdmUpCisjIC1zdGF0aWMgICAgICAgICAgICAgICAgICAgICAgIE5vdCB1c2VkLCBidXQgbWF5IGJlIHVzZWZ1bCEgbWFucGFnZToKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4uLiBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB3aXRoIC1zaGFyZWQuCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvaW5nIHNvIG1lYW5zIHRoYXQgYSBzaGFyZWQgbGlicmFyeQorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBiZWluZyBjcmVhdGVkIGJ1dCB0aGF0IGFsbCBvZiB0aGUgbGlicmFyeSdzCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVybmFsIHJlZmVyZW5jZXMgbXVzdCBiZSByZXNvbHZlZCBieSBwdWxsaW5nCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIGVudHJpZXMgZnJvbSBzdGF0aWMgbGlicmFyaWVzLiIKKworCit0cnkoKSB7CisgICAgcHJpbnRmICIlc1xuIiAiT3V0cHV0IG9mOiIgPiRFWEUub3V0CisgICAgcHJpbnRmICIlc1xuIiAiJCoiID4+JEVYRS5vdXQKKyAgICBwcmludGYgIiVzXG4iICI9PT09PT09PT09IiA+PiRFWEUub3V0CisgICAgJGRlYnVnICYmIGVjaG8gIlRyeWluZzogJCoiCisgICAgJEAgPj4kRVhFLm91dCAyPiYxCisgICAgcmV0dXJuICQ/Cit9CisKK2NoZWNrX2NjKCkgeworICAgIGxvY2FsIHRlbXBuYW1lPSIkKG1rdGVtcCkiCisgICAgbG9jYWwgcgorICAgIGVjaG8gImludCBtYWluKGludCBhcmdjLGNoYXIqKmFyZ3Ype3JldHVybiBhcmd2P2FyZ2M6MDt9IiA+IiR0ZW1wbmFtZSIuYworICAgICMgQ2FuIHVzZSAiLW8gL2Rldi9udWxsIiwgYnV0IG9sZGVyIGdjYyB0ZW5kIHRvICp1bmxpbmsgaXQqIG9uIGZhaWx1cmUhIDooCisgICAgIyBXYXMgdXNpbmcgIi14YyAvZGV2L251bGwiLCBidXQgd2UgbmVlZCBhIHZhbGlkIEMgcHJvZ3JhbS4KKyAgICAjICJldmFsIiBtYXkgYmUgbmVlZGVkIGlmIENGTEFHUyBjYW4gY29udGFpbgorICAgICMgJy4uLiAtRCJCQl9WRVI9S0JVSUxEX1NUUigxLk4uTSkiIC4uLicKKyAgICAjIGFuZCB3ZSBuZWVkIHNoZWxsIHRvIHByb2Nlc3MgcXVvdGVzIQorICAgICRDQyAkQ0ZMQUdTICQxICIkdGVtcG5hbWUiLmMgLW8gIiR0ZW1wbmFtZSIgPi9kZXYvbnVsbCAyPiYxCisgICAgcj0kPworICAgIHJtIC1mICIkdGVtcG5hbWUiICIkdGVtcG5hbWUiLmMgIiR0ZW1wbmFtZSIubworICAgIHJldHVybiAkcgorfQorCitjaGVja19saWJjX2lzX2dsaWJjKCkgeworICAgIGxvY2FsIHRlbXBuYW1lPSIkKG1rdGVtcCkiCisgICAgbG9jYWwgcgorICAgIGVjaG8gIlwKKwkjaW5jbHVkZSA8c3RkbGliLmg+CisJLyogQXBwYXJlbnRseSB1Y2xpYmMgZGVmaW5lcyBfX0dMSUJDX18gKGNvbXBhdCB0cmljaz8pLiBPaCB3ZWxsLiAqLworCSNpZiBkZWZpbmVkKF9fR0xJQkNfXykgJiYgIWRlZmluZWQoX19VQ0xJQkNfXykKKwlzeW50YXggZXJyb3IgaGVyZQorCSNlbmRpZgorCSIgPiIkdGVtcG5hbWUiLmMKKyAgICAhICRDQyAkQ0ZMQUdTICIkdGVtcG5hbWUiLmMgLWMgLW8gIiR0ZW1wbmFtZSIubyA+L2Rldi9udWxsIDI+JjEKKyAgICByPSQ/CisgICAgcm0gLWYgIiR0ZW1wbmFtZSIgIiR0ZW1wbmFtZSIuYyAiJHRlbXBuYW1lIi5vCisgICAgcmV0dXJuICRyCit9CisKK0VYRT0iJDEiCitDQz0iJDIiCitDRkxBR1M9IiQzIgorTERGTEFHUz0iJDQiCitPX0ZJTEVTPSIkNSIKK0FfRklMRVM9IiQ2IgorTERMSUJTPSIkNyIKKworIyBUaGUgLS1zb3J0LXNlY3Rpb24gb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgYnkgb2xkZXIgdmVyc2lvbnMgb2YgbGQKK1NPUlRfU0VDVElPTj0iLVdsLC0tc29ydC1zZWN0aW9uLGFsaWdubWVudCIKK2lmICEgY2hlY2tfY2MgIi1XbCwtLXNvcnQtc2VjdGlvbixhbGlnbm1lbnQiOyB0aGVuCisgICAgZWNobyAiWW91ciBsaW5rZXIgZG9lcyBub3Qgc3VwcG9ydCAtLXNvcnQtc2VjdGlvbixhbGlnbm1lbnQiCisgICAgU09SVF9TRUNUSU9OPSIiCitmaQorCitTVEFSVF9HUk9VUD0iLVdsLC0tc3RhcnQtZ3JvdXAiCitFTkRfR1JPVVA9Ii1XbCwtLWVuZC1ncm91cCIKK0lORk9fT1BUUz0iLVdsLC0td2Fybi1jb21tb24gLVdsLC1NYXAsJEVYRS5tYXAgLVdsLC0tdmVyYm9zZSIKKworIyBnb2xkIG1heSBub3Qgc3VwcG9ydCAtLXNvcnQtY29tbW9uICh5ZXQpCitTT1JUX0NPTU1PTj0iLVdsLC0tc29ydC1jb21tb24iCitpZiAhIGNoZWNrX2NjICItV2wsLS1zb3J0LWNvbW1vbiI7IHRoZW4KKyAgICBlY2hvICJZb3VyIGxpbmtlciBkb2VzIG5vdCBzdXBwb3J0IC0tc29ydC1jb21tb24iCisgICAgU09SVF9DT01NT049IiIKK2ZpCisKKyMgU3RhdGljIGxpbmtpbmcgYWdhaW5zdCBnbGliYyBwcm9kdWNlcyBidWdneSBleGVjdXRhYmxlcworIyAoZ2xpYmMgZG9lcyBub3QgY29wZSB3ZWxsIHdpdGggbGQgLS1nYy1zZWN0aW9ucykuCisjIFNlZSBzb3VyY2VzLnJlZGhhdC5jb20vYnVnemlsbGEvc2hvd19idWcuY2dpP2lkPTM0MDAKKyMgTm90ZSB0aGF0IGdsaWJjIGlzIHVuc3VpdGFibGUgZm9yIHN0YXRpYyBsaW5raW5nIGFueXdheS4KKyMgV2UgYXJlIHJlbW92aW5nIC1XbCwtLWdjLXNlY3Rpb25zIGZyb20gbGluayBjb21tYW5kIGxpbmUuCitHQ19TRUNUSU9OUz0iLVdsLC0tZ2Mtc2VjdGlvbnMiCitpZiAoLiAuLy5jb25maWcgJiYgdGVzdCB4IiRDT05GSUdfU1RBVElDIiA9IHgieSIpIHRoZW4KKyAgICBpZiBjaGVja19saWJjX2lzX2dsaWJjOyB0aGVuCisJZWNobyAiU3RhdGljIGxpbmtpbmcgYWdhaW5zdCBnbGliYywgY2FuJ3QgdXNlIC0tZ2Mtc2VjdGlvbnMiCisjCUdDX1NFQ1RJT05TPSIiCisgICAgZmkKK2ZpCisjIFRoZSAtLWdjLXNlY3Rpb25zIG9wdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IG9sZGVyIHZlcnNpb25zIG9mIGxkCitpZiB0ZXN0IC1uICIkR0NfU0VDVElPTlMiOyB0aGVuCisgICAgaWYgISBjaGVja19jYyAiJEdDX1NFQ1RJT05TIjsgdGhlbgorCWVjaG8gIllvdXIgbGlua2VyIGRvZXMgbm90IHN1cHBvcnQgJEdDX1NFQ1RJT05TIgorCUdDX1NFQ1RJT05TPSIiCisgICAgZmkKK2ZpCisKKyMgU2FuaXRpemUgbGliIGxpc3QgKGR1cHMsIGV4dHJhIHNwYWNlcyBldGMpCitMRExJQlM9YGVjaG8gIiRMRExJQlMiIHwgeGFyZ3MgLW4xIHwgc29ydCB8IHVuaXEgfCB4YXJnc2AKKworIyBGaXJzdCBsaW5rIHdpdGggYWxsIGxpYnMuIElmIGl0IGZhaWxzLCBiYWlsIG91dAorZWNobyAiVHJ5aW5nIGxpYnJhcmllczogJExETElCUyIKKyMgImxpYjEgbGliMiBsaWIzIiAtPiAiLWxsaWIxIC1sbGliMiAtbGxpYjMiCitsX2xpc3Q9YGVjaG8gIiAkTERMSUJTICIgfCBzZWQgLWUgJ3M6IFwoW14tIF1bXiBdKlwpOiAtbFwxOmcnYAordGVzdCAieCRsX2xpc3QiICE9ICJ4IiAmJiBsX2xpc3Q9IiRTVEFSVF9HUk9VUCAkbF9saXN0ICRFTkRfR1JPVVAiCit0cnkgJENDICRDRkxBR1MgJExERkxBR1MgXAorCS1vICRFWEUgXAorCSRTT1JUX0NPTU1PTiBcCisJJFNPUlRfU0VDVElPTiBcCisJJEdDX1NFQ1RJT05TIFwKKwkkU1RBUlRfR1JPVVAgJE9fRklMRVMgJEFfRklMRVMgJEVORF9HUk9VUCBcCisJJGxfbGlzdCBcCit8fCB7CisgICAgZWNobyAiRmFpbGVkOiAkbF9saXN0IgorICAgIGNhdCAkRVhFLm91dAorICAgIGV4aXQgMQorfQorCisjIE5vdyB0cnkgdG8gcmVtb3ZlIGVhY2ggbGliIGFuZCBidWlsZCB3aXRob3V0IGl0LgorIyBTdG9wIHdoZW4gbm8gbGliIGNhbiBiZSByZW1vdmVkLgord2hpbGUgdGVzdCAiJExETElCUyI7IGRvCisgICAgJGRlYnVnICYmIGVjaG8gIlRyeWluZyBsaWJyYXJpZXM6ICRMRExJQlMiCisgICAgYWxsX25lZWRlZD10cnVlCisgICAgbGFzdF9uZWVkZWQ9ZmFsc2UKKyAgICBmb3Igb25lIGluICRMRExJQlM7IGRvCisJd2l0aG91dF9vbmU9YGVjaG8gIiAkTERMSUJTICIgfCBzZWQgInMvICRvbmUgLyAvZyIgfCB4YXJnc2AKKwkjICJsaWIxIGxpYjIgbGliMyIgLT4gIi1sbGliMSAtbGxpYjIgLWxsaWIzIgorCWxfbGlzdD1gZWNobyAiICR3aXRob3V0X29uZSAiIHwgc2VkIC1lICdzOiBcKFteLSBdW14gXSpcKTogLWxcMTpnJ2AKKwl0ZXN0IHgiJGxfbGlzdCIgIT0geCIiICYmIGxfbGlzdD0iJFNUQVJUX0dST1VQICRsX2xpc3QgJEVORF9HUk9VUCIKKwkkZGVidWcgJiYgZWNobyAiVHJ5aW5nIC1sIG9wdGlvbnM6ICckbF9saXN0JyIKKwl0cnkgJENDICRDRkxBR1MgJExERkxBR1MgXAorCQktbyAkRVhFIFwKKwkJJFNPUlRfQ09NTU9OIFwKKwkJJFNPUlRfU0VDVElPTiBcCisJCSRHQ19TRUNUSU9OUyBcCisJCSRTVEFSVF9HUk9VUCAkT19GSUxFUyAkQV9GSUxFUyAkRU5EX0dST1VQIFwKKwkJJGxfbGlzdAorCWlmIHRlc3QgJD8gPSAwOyB0aGVuCisJICAgIGVjaG8gIiBMaWJyYXJ5ICRvbmUgaXMgbm90IG5lZWRlZCwgZXhjbHVkaW5nIGl0IgorCSAgICBMRExJQlM9IiR3aXRob3V0X29uZSIKKwkgICAgYWxsX25lZWRlZD1mYWxzZQorCSAgICBsYXN0X25lZWRlZD1mYWxzZQorCWVsc2UKKwkgICAgZWNobyAiIExpYnJhcnkgJG9uZSBpcyBuZWVkZWQsIGNhbid0IGV4Y2x1ZGUgaXQgKHlldCkiCisJICAgIGxhc3RfbmVlZGVkPXRydWUKKwlmaQorICAgIGRvbmUKKyAgICAjIEFsbCBsaWJzIHdlcmUgbmVlZGVkLCBjYW4ndCByZW1vdmUgYW55CisgICAgJGFsbF9uZWVkZWQgJiYgYnJlYWsKKyAgICAjIE9wdGltaXphdGlvbjogd2FzIHRoZSBsYXN0IHRyaWVkIGxpYiBuZWVkZWQ/CisgICAgaWYgJGxhc3RfbmVlZGVkOyB0aGVuCisJIyBXYXMgaXQgdGhlIG9ubHkgb25lIGxpYiBsZWZ0PyBEb24ndCB0ZXN0IGFnYWluIHRoZW4uCisJeyBlY2hvICIkTERMSUJTIiB8IGdyZXAgLXEgJyAnOyB9IHx8IGJyZWFrCisgICAgZmkKK2RvbmUKKworIyBNYWtlIHRoZSBiaW5hcnkgd2l0aCBmaW5hbCwgbWluaW1hbCBsaXN0IG9mIGxpYnMKK2VjaG8gIkZpbmFsIGxpbmsgd2l0aDogJHtMRExJQlM6LTxub25lPn0iCitsX2xpc3Q9YGVjaG8gIiAkTERMSUJTICIgfCBzZWQgLWUgJ3M6IFwoW14tIF1bXiBdKlwpOiAtbFwxOmcnYAordGVzdCAieCRsX2xpc3QiICE9ICJ4IiAmJiBsX2xpc3Q9IiRTVEFSVF9HUk9VUCAkbF9saXN0ICRFTkRfR1JPVVAiCisjIC0tdmVyYm9zZSBnaXZlcyB1cyBnb2JzIG9mIGluZm8gdG8gc3Rkb3V0IChlLmcuIGxpbmtlciBzY3JpcHQgdXNlZCkKK2lmICEgdGVzdCAtZiBidXN5Ym94X2xkc2NyaXB0OyB0aGVuCisgICAgdHJ5ICRDQyAkQ0ZMQUdTICRMREZMQUdTIFwKKwkgICAgLW8gJEVYRSBcCisJICAgICRTT1JUX0NPTU1PTiBcCisJICAgICRTT1JUX1NFQ1RJT04gXAorCSAgICAkR0NfU0VDVElPTlMgXAorCSAgICAkU1RBUlRfR1JPVVAgJE9fRklMRVMgJEFfRklMRVMgJEVORF9HUk9VUCBcCisJICAgICRsX2xpc3QgXAorCSAgICAkSU5GT19PUFRTIFwKKyAgICB8fCB7CisJY2F0ICRFWEUub3V0CisJZXhpdCAxCisgICAgfQorZWxzZQorICAgIGVjaG8gIkN1c3RvbSBsaW5rZXIgc2NyaXB0ICdidXN5Ym94X2xkc2NyaXB0JyBmb3VuZCwgdXNpbmcgaXQiCisgICAgIyBBZGQgU09SVF9CWV9BTElHTk1FTlQgdG8gbGlua2VyIHNjcmlwdCAoZm91bmQgaW4gJEVYRS5vdXQpOgorICAgICMgIC5yb2RhdGEgICAgICAgICA6IHsgKigucm9kYXRhIFNPUlRfQllfQUxJR05NRU5UKC5yb2RhdGEuKikgLmdudS5saW5rb25jZS5yLiopIH0KKyAgICAjICAqKC5kYXRhIFNPUlRfQllfQUxJR05NRU5UKC5kYXRhLiopIC5nbnUubGlua29uY2UuZC4qKQorICAgICMgICooLmJzcyBTT1JUX0JZX0FMSUdOTUVOVCguYnNzLiopIC5nbnUubGlua29uY2UuYi4qKQorICAgICMgVGhpcyB3aWxsIGVsaW1pbmF0ZSBtb3N0IG9mIHRoZSBwYWRkaW5nICh+M2tiKS4KKyAgICAjIEhtbSwgImxkIC0tc29ydC1zZWN0aW9uIGFsaWdubWVudCIgc2hvdWxkIGRvIGl0IHRvby4KKyAgICB0cnkgJENDICRDRkxBR1MgJExERkxBR1MgXAorCSAgICAtbyAkRVhFIFwKKwkgICAgJFNPUlRfQ09NTU9OIFwKKwkgICAgJFNPUlRfU0VDVElPTiBcCisJICAgICRHQ19TRUNUSU9OUyBcCisJICAgIC1XbCwtVCxidXN5Ym94X2xkc2NyaXB0IFwKKwkgICAgJFNUQVJUX0dST1VQICRPX0ZJTEVTICRBX0ZJTEVTICRFTkRfR1JPVVAgXAorCSAgICAkbF9saXN0IFwKKwkgICAgJElORk9fT1BUUyBcCisgICAgfHwgeworCWNhdCAkRVhFLm91dAorCWV4aXQgMQorICAgIH0KK2ZpCisKKy4gLi8uY29uZmlnCisKK3NoYXJlZGxpYl9kaXI9IjBfbGliIgorCitpZiB0ZXN0ICIkQ09ORklHX0JVSUxEX0xJQkJVU1lCT1giID0geTsgdGhlbgorICAgIG1rZGlyICIkc2hhcmVkbGliX2RpciIgMj4vZGV2L251bGwKKyAgICB0ZXN0IC1kICIkc2hhcmVkbGliX2RpciIgfHwgeworCWVjaG8gIkNhbm5vdCBtYWtlIGRpcmVjdG9yeSAkc2hhcmVkbGliX2RpciIKKwlleGl0IDEKKyAgICB9CisgICAgbG4gLXMgImxpYmJ1c3lib3guc28uJEJCX1ZFUiIgIiRzaGFyZWRsaWJfZGlyIi9saWJidXN5Ym94LnNvIDI+L2Rldi9udWxsCisKKyAgICBFWEU9IiRzaGFyZWRsaWJfZGlyL2xpYmJ1c3lib3guc28uJHtCQl9WRVJ9X3Vuc3RyaXBwZWQiCisgICAgdHJ5ICRDQyAkQ0ZMQUdTICRMREZMQUdTIFwKKwkgICAgLW8gJEVYRSBcCisJICAgIC1zaGFyZWQgLWZQSUMgXAorCSAgICAtV2wsLS1lbmFibGUtbmV3LWR0YWdzIFwKKwkgICAgLVdsLC16LGNvbWJyZWxvYyBcCisJICAgIC1XbCwtc29uYW1lPSJsaWJidXN5Ym94LnNvLiRCQl9WRVIiIFwKKwkgICAgLVdsLC0tdW5kZWZpbmVkPWxiYl9tYWluIFwKKwkgICAgJFNPUlRfQ09NTU9OIFwKKwkgICAgJFNPUlRfU0VDVElPTiBcCisJICAgICRTVEFSVF9HUk9VUCAkQV9GSUxFUyAkRU5EX0dST1VQIFwKKwkgICAgJGxfbGlzdCBcCisJICAgICRJTkZPX09QVFMgXAorICAgIHx8IHsKKwllY2hvICJMaW5raW5nICRFWEUgZmFpbGVkIgorCWNhdCAkRVhFLm91dAorCWV4aXQgMQorICAgIH0KKyAgICAkU1RSSVAgLXMgLS1yZW1vdmUtc2VjdGlvbj0ubm90ZSAtLXJlbW92ZS1zZWN0aW9uPS5jb21tZW50ICRFWEUgLW8gIiRzaGFyZWRsaWJfZGlyL2xpYmJ1c3lib3guc28uJEJCX1ZFUiIKKyAgICBjaG1vZCBhK3ggIiRzaGFyZWRsaWJfZGlyL2xpYmJ1c3lib3guc28uJEJCX1ZFUiIKKyAgICBlY2hvICJsaWJidXN5Ym94OiAkc2hhcmVkbGliX2Rpci9saWJidXN5Ym94LnNvLiRCQl9WRVIiCitmaQorCitpZiB0ZXN0ICIkQ09ORklHX0ZFQVRVUkVfU0hBUkVEX0JVU1lCT1giID0geTsgdGhlbgorICAgIEVYRT0iJHNoYXJlZGxpYl9kaXIvYnVzeWJveF91bnN0cmlwcGVkIgorICAgIHRyeSAkQ0MgJENGTEFHUyAkTERGTEFHUyBcCisJICAgIC1vICRFWEUgXAorCSAgICAkU09SVF9DT01NT04gXAorCSAgICAkU09SVF9TRUNUSU9OIFwKKwkgICAgJEdDX1NFQ1RJT05TIFwKKwkgICAgJFNUQVJUX0dST1VQICRPX0ZJTEVTICRFTkRfR1JPVVAgXAorCSAgICAtTCIkc2hhcmVkbGliX2RpciIgLWxidXN5Ym94IFwKKwkgICAgJGxfbGlzdCBcCisJICAgICRJTkZPX09QVFMgXAorICAgIHx8IHsKKwllY2hvICJMaW5raW5nICRFWEUgZmFpbGVkIgorCWNhdCAkRVhFLm91dAorCWV4aXQgMQorICAgIH0KKyAgICAkU1RSSVAgLXMgLS1yZW1vdmUtc2VjdGlvbj0ubm90ZSAtLXJlbW92ZS1zZWN0aW9uPS5jb21tZW50ICRFWEUgLW8gIiRzaGFyZWRsaWJfZGlyL2J1c3lib3giCisgICAgZWNobyAiYnVzeWJveCBsaW5rZWQgYWdhaW5zdCBsaWJidXN5Ym94OiAkc2hhcmVkbGliX2Rpci9idXN5Ym94IgorZmkKKworaWYgdGVzdCAiJENPTkZJR19GRUFUVVJFX0lORElWSURVQUwiID0geTsgdGhlbgorICAgIGVjaG8gIkxpbmtpbmcgaW5kaXZpZHVhbCBhcHBsZXRzIGFnYWluc3QgbGliYnVzeWJveCAoc2VlICRzaGFyZWRsaWJfZGlyLyopIgorICAgIGdjYyAtRE5BTUVfTUFJTiAtRSAtaW5jbHVkZSBpbmNsdWRlL2F1dG9jb25mLmggaW5jbHVkZS9hcHBsZXRzLmggXAorICAgIHwgZ3JlcCAtdiAiXiMiIFwKKyAgICB8IGdyZXAgLXYgIl4kIiBcCisgICAgPiBhcHBsZXRfbHN0LnRtcAorICAgIHdoaWxlIHJlYWQgbmFtZSBtYWluIGp1bms7IGRvCisKKwllY2hvICJcCit2b2lkIGxiYl9wcmVwYXJlKGNvbnN0IGNoYXIgKmFwcGxldCwgY2hhciAqKmFyZ3YpOworaW50ICRtYWluKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlsYmJfcHJlcGFyZShcIiRuYW1lXCIsIGFyZ3YpOworCXJldHVybiAkbWFpbihhcmdjLCBhcmd2KTsKK30KKyIgPiIkc2hhcmVkbGliX2Rpci9hcHBsZXQuYyIKKworCUVYRT0iJHNoYXJlZGxpYl9kaXIvJG5hbWUiCisJdHJ5ICRDQyAkQ0ZMQUdTICRMREZMQUdTICIkc2hhcmVkbGliX2Rpci9hcHBsZXQuYyIgXAorCQktbyAkRVhFIFwKKwkJJFNPUlRfQ09NTU9OIFwKKwkJJFNPUlRfU0VDVElPTiBcCisJCSRHQ19TRUNUSU9OUyBcCisJCS1MIiRzaGFyZWRsaWJfZGlyIiAtbGJ1c3lib3ggXAorCQktV2wsLS13YXJuLWNvbW1vbiBcCisJfHwgeworCSAgICBlY2hvICJMaW5raW5nICRFWEUgZmFpbGVkIgorCSAgICBjYXQgJEVYRS5vdXQKKwkgICAgZXhpdCAxCisJfQorCXJtIC0tICIkc2hhcmVkbGliX2Rpci9hcHBsZXQuYyIgJEVYRS5vdXQKKwkkU1RSSVAgLXMgLS1yZW1vdmUtc2VjdGlvbj0ubm90ZSAtLXJlbW92ZS1zZWN0aW9uPS5jb21tZW50ICRFWEUKKwkjIExldCB1c2VyIHNlZSB0aGF0IHdlIGRvIHNvbWV0aGluZyAtIGxpc3QgdGhlIG5hbWVzIG9mIGNyZWF0ZWQgYmluYXJpZXM6CisJZWNobyAiJEVYRSIKKworICAgIGRvbmUgPGFwcGxldF9sc3QudG1wCitmaQorCisjIGxpYmJ1c3lib3guc28gaXMgbmVlZGVkIG9ubHkgZm9yIC1sYnVzeWJveCBhdCBsaW5rIHRpbWUsCisjIGl0IGlzIG5vdCBuZWVkZWQgYXQgcnVudGltZS4gRGVsZXRpbmcgdG8gcmVkdWNlIGNvbmZ1c2lvbi4KK3JtICIkc2hhcmVkbGliX2RpciIvbGliYnVzeWJveC5zbyAyPi9kZXYvbnVsbAorZXhpdCAwICMgb3IgZWxzZSB3ZSBtYXkgY29uZnVzZSBtYWtlCmRpZmYgLS1naXQgYS9zZWxpbnV4L0NvbmZpZy5zcmMgYi9zZWxpbnV4L0NvbmZpZy5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ3MDFmNgotLS0gL2Rldi9udWxsCisrKyBiL3NlbGludXgvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDEyNCBAQAorIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiU0VMaW51eCBVdGlsaXRpZXMiCisJZGVwZW5kcyBvbiBTRUxJTlVYCisKK0lOU0VSVAorCitjb25maWcgQ0hDT04KKwlib29sICJjaGNvbiIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCB0byBjaGFuZ2UgdGhlIHNlY3VyaXR5IGNvbnRleHQgb2YgZmlsZS4KKworY29uZmlnIEZFQVRVUkVfQ0hDT05fTE9OR19PUFRJT05TCisJYm9vbCAiRW5hYmxlIGxvbmcgb3B0aW9ucyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIENIQ09OICYmIExPTkdfT1BUUworCWhlbHAKKwkgIFN1cHBvcnQgbG9uZyBvcHRpb25zIGZvciB0aGUgY2hjb24gYXBwbGV0LgorCitjb25maWcgR0VURU5GT1JDRQorCWJvb2wgImdldGVuZm9yY2UiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBTRUxJTlVYCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgdG8gZ2V0IHRoZSBjdXJyZW50IG1vZGUgb2YgU0VMaW51eC4KKworY29uZmlnIEdFVFNFQk9PTAorCWJvb2wgImdldHNlYm9vbCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCB0byBnZXQgU0VMaW51eCBib29sZWFuIHZhbHVlcy4KKworY29uZmlnIExPQURfUE9MSUNZCisJYm9vbCAibG9hZF9wb2xpY3kiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBTRUxJTlVYCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgdG8gbG9hZCBTRUxpbnV4IHBvbGljeS4KKworY29uZmlnIE1BVENIUEFUSENPTgorCWJvb2wgIm1hdGNocGF0aGNvbiIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCB0byBnZXQgZGVmYXVsdCBzZWN1cml0eSBjb250ZXh0IG9mIHRoZQorCSAgc3BlY2lmaWVkIHBhdGggZnJvbSB0aGUgZmlsZSBjb250ZXh0cyBjb25maWd1cmF0aW9uLgorCitjb25maWcgUkVTVE9SRUNPTgorCWJvb2wgInJlc3RvcmVjb24iCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBTRUxJTlVYCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgdG8gcmVsYWJlbCBmaWxlcy4gVGhlIGZlYXR1cmUgaXMgYWxtb3N0CisJICB0aGUgc2FtZSBhcyBzZXRmaWxlcywgYnV0IHVzYWdlIGlzIGEgbGl0dGxlIGRpZmZlcmVudC4KKworY29uZmlnIFJVTkNPTgorCWJvb2wgInJ1bmNvbiIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCB0byBydW4gY29tbWFuZCBpbiBzcGVjaWZpZWQgc2VjdXJpdHkgY29udGV4dC4KKworY29uZmlnIEZFQVRVUkVfUlVOQ09OX0xPTkdfT1BUSU9OUworCWJvb2wgIkVuYWJsZSBsb25nIG9wdGlvbnMiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBSVU5DT04gJiYgTE9OR19PUFRTCisJaGVscAorCSAgU3VwcG9ydCBsb25nIG9wdGlvbnMgZm9yIHRoZSBydW5jb24gYXBwbGV0LgorCitjb25maWcgU0VMSU5VWEVOQUJMRUQKKwlib29sICJzZWxpbnV4ZW5hYmxlZCIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3IgdGhpcyBjb21tYW5kIHRvIGJlIHVzZWQgd2l0aGluIHNoZWxsIHNjcmlwdHMKKwkgIHRvIGRldGVybWluZSBpZiBzZWxpbnV4IGlzIGVuYWJsZWQuCisKK2NvbmZpZyBTRVRFTkZPUkNFCisJYm9vbCAic2V0ZW5mb3JjZSIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCB0byBtb2RpZnkgdGhlIG1vZGUgU0VMaW51eCBpcyBydW5uaW5nIGluLgorCitjb25maWcgU0VURklMRVMKKwlib29sICJzZXRmaWxlcyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIFNFTElOVVgKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCB0byBtb2RpZnkgdG8gcmVsYWJlbCBmaWxlcy4KKwkgIE5vdGljZTogSWYgeW91IGJ1aWx0IGxpYnNlbGludXggd2l0aCAtRF9GSUxFX09GRlNFVF9CSVRTPTY0LAorCSAgKEl0IGlzIGRlZmF1bHQgaW4gbGlic2VsaW51eCdzIE1ha2VmaWxlKSwgeW91IF9tdXN0XyBlbmFibGUKKwkgIENPTkZJR19MRlMuCisKK2NvbmZpZyBGRUFUVVJFX1NFVEZJTEVTX0NIRUNLX09QVElPTgorCWJvb2wgIkVuYWJsZSBjaGVjayBvcHRpb24iCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBTRVRGSUxFUworCWhlbHAKKwkgIFN1cHBvcnQgIi1jIiBvcHRpb24gKGNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgY29udGV4dHMgYWdhaW5zdAorCSAgdGhlIHNwZWNpZmllZCBiaW5hcnkgcG9saWN5KSBmb3Igc2V0ZmlsZXMuIFJlcXVpcmVzIGxpYnNlcG9sLgorCitjb25maWcgU0VUU0VCT09MCisJYm9vbCAic2V0c2Vib29sIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gU0VMSU5VWAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBjaGFuZ2UgYm9vbGVhbi4KKwkgIHNlbWFuYWdlIGFuZCAtUCBvcHRpb24gaXMgbm90IHN1cHBvcnRlZCB5ZXQuCisKK2NvbmZpZyBTRVNUQVRVUworCWJvb2wgInNlc3RhdHVzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gU0VMSU5VWAorCWhlbHAKKwkgIERpc3BsYXlzIHRoZSBzdGF0dXMgb2YgU0VMaW51eC4KKworZW5kbWVudQpkaWZmIC0tZ2l0IGEvc2VsaW51eC9LYnVpbGQuc3JjIGIvc2VsaW51eC9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZDVmMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWxpbnV4L0tidWlsZC5zcmMKQEAgLTAsMCArMSwyMiBAQAorIyBNYWtlZmlsZSBmb3IgYnVzeWJveAorIworIyBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNSBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisjIENvcHlyaWdodCAoQykgMjAwNyBieSBLYWlHYWkgS29oZWkgPGthaWdhaUBrYWlnYWkuZ3IuanA+CisjCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK2xpYi15Oj0KKworSU5TRVJUCitsaWItJChDT05GSUdfQ0hDT04pCQkrPSBjaGNvbi5vCitsaWItJChDT05GSUdfR0VURU5GT1JDRSkJKz0gZ2V0ZW5mb3JjZS5vCitsaWItJChDT05GSUdfR0VUU0VCT09MKQkJKz0gZ2V0c2Vib29sLm8KK2xpYi0kKENPTkZJR19MT0FEX1BPTElDWSkJKz0gbG9hZF9wb2xpY3kubworbGliLSQoQ09ORklHX01BVENIUEFUSENPTikJKz0gbWF0Y2hwYXRoY29uLm8KK2xpYi0kKENPTkZJR19SVU5DT04pCQkrPSBydW5jb24ubworbGliLSQoQ09ORklHX1NFTElOVVhFTkFCTEVEKQkrPSBzZWxpbnV4ZW5hYmxlZC5vCitsaWItJChDT05GSUdfU0VURU5GT1JDRSkJKz0gc2V0ZW5mb3JjZS5vCitsaWItJChDT05GSUdfU0VURklMRVMpCQkrPSBzZXRmaWxlcy5vCitsaWItJChDT05GSUdfUkVTVE9SRUNPTikJKz0gc2V0ZmlsZXMubworbGliLSQoQ09ORklHX1NFVFNFQk9PTCkJCSs9IHNldHNlYm9vbC5vCitsaWItJChDT05GSUdfU0VTVEFUVVMpCQkrPSBzZXN0YXR1cy5vCmRpZmYgLS1naXQgYS9zZWxpbnV4L2NoY29uLmMgYi9zZWxpbnV4L2NoY29uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk0N2MyYwotLS0gL2Rldi9udWxsCisrKyBiL3NlbGludXgvY2hjb24uYwpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIGNoY29uIC0tIGNoYW5nZSBzZWN1cml0eSBjb250ZXh0LCBiYXNlZCBvbiBjb3JldXRpbHMtNS45Ny0xMworICoKKyAqIFBvcnQgdG8gYnVzeWJveDogS2FpR2FpIEtvaGVpIDxrYWlnYWlAa2FpZ2FpLmdyLmpwPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiAtIDIwMDcgS2FpR2FpIEtvaGVpIDxrYWlnYWlAa2FpZ2FpLmdyLmpwPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGNoY29uX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gQ09OVEVYVCBGSUxFLi4uIgorLy91c2FnZTogICAgICAgIlxuCWNoY29uIFtPUFRJT05TXSBbLXUgVVNFUl0gWy1yIFJPTEVdIFstbCBSQU5HRV0gWy10IFRZUEVdIEZJTEUuLi4iCisvL3VzYWdlOglJRl9GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAgICJcbgljaGNvbiBbT1BUSU9OU10gLS1yZWZlcmVuY2U9UkZJTEUgRklMRS4uLiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6I2RlZmluZSBjaGNvbl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkNoYW5nZSB0aGUgc2VjdXJpdHkgY29udGV4dCBvZiBlYWNoIEZJTEUgdG8gQ09OVEVYVFxuIgorLy91c2FnZToJSUZfRkVBVFVSRV9DSENPTl9MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgIlxuCS12LC0tdmVyYm9zZQkJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWMsLS1jaGFuZ2VzCQlSZXBvcnQgY2hhbmdlcyBtYWRlIgorLy91c2FnZTogICAgICJcbgktaCwtLW5vLWRlcmVmZXJlbmNlCUFmZmVjdCBzeW1saW5rcyBpbnN0ZWFkIG9mIHRoZWlyIHRhcmdldHMiCisvL3VzYWdlOiAgICAgIlxuCS1mLC0tc2lsZW50LC0tcXVpZXQJU3VwcHJlc3MgbW9zdCBlcnJvciBtZXNzYWdlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLS1yZWZlcmVuY2U9UkZJTEUJVXNlIFJGSUxFJ3MgZ3JvdXAgaW5zdGVhZCBvZiB1c2luZyBhIENPTlRFWFQgdmFsdWUiCisvL3VzYWdlOiAgICAgIlxuCS11LC0tdXNlcj1VU0VSCQlTZXQgdXNlci9yb2xlL3R5cGUvcmFuZ2UgaW4gdGhlIHRhcmdldCIKKy8vdXNhZ2U6ICAgICAiXG4JLXIsLS1yb2xlPVJPTEUJCXNlY3VyaXR5IGNvbnRleHQiCisvL3VzYWdlOiAgICAgIlxuCS10LC0tdHlwZT1UWVBFIgorLy91c2FnZTogICAgICJcbgktbCwtLXJhbmdlPVJBTkdFIgorLy91c2FnZTogICAgICJcbgktUiwtLXJlY3Vyc2l2ZQkJUmVjdXJzZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG4JLXYJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJUmVwb3J0IGNoYW5nZXMgbWFkZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWgJQWZmZWN0IHN5bWxpbmtzIGluc3RlYWQgb2YgdGhlaXIgdGFyZ2V0cyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJU3VwcHJlc3MgbW9zdCBlcnJvciBtZXNzYWdlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXUgVVNFUglTZXQgdXNlci9yb2xlL3R5cGUvcmFuZ2UgaW4gdGhlIHRhcmdldCBzZWN1cml0eSBjb250ZXh0IgorLy91c2FnZTogICAgICJcbgktciBST0xFIgorLy91c2FnZTogICAgICJcbgktdCBUWVBFIgorLy91c2FnZTogICAgICJcbgktbCBSTkciCisvL3VzYWdlOiAgICAgIlxuCS1SCVJlY3Vyc2UiCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlIDxzZWxpbnV4L2NvbnRleHQuaD4KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNkZWZpbmUgT1BUX1JFQ1VSU0lWRQkJKDE8PDApCS8qICdSJyAqLworI2RlZmluZSBPUFRfQ0hBTkhFUwkJKDE8PDEpCS8qICdjJyAqLworI2RlZmluZSBPUFRfTk9ERVJFRkVSRU5DRQkoMTw8MikJLyogJ2gnICovCisjZGVmaW5lIE9QVF9RVUlFVAkJKDE8PDMpCS8qICdmJyAqLworI2RlZmluZSBPUFRfVVNFUgkJKDE8PDQpCS8qICd1JyAqLworI2RlZmluZSBPUFRfUk9MRQkJKDE8PDUpCS8qICdyJyAqLworI2RlZmluZSBPUFRfVFlQRQkJKDE8PDYpCS8qICd0JyAqLworI2RlZmluZSBPUFRfUkFOR0UJCSgxPDw3KQkvKiAnbCcgKi8KKyNkZWZpbmUgT1BUX1ZFUkJPU0UJCSgxPDw4KQkvKiAndicgKi8KKyNkZWZpbmUgT1BUX1JFRkVSRU5DRQkJKCgxPDw5KSAqIEVOQUJMRV9GRUFUVVJFX0NIQ09OX0xPTkdfT1BUSU9OUykKKyNkZWZpbmUgT1BUX0NPTVBPTkVOVF9TUEVDSUZJRUQJKE9QVF9VU0VSIHwgT1BUX1JPTEUgfCBPUFRfVFlQRSB8IE9QVF9SQU5HRSkKKworc3RhdGljIGNoYXIgKnVzZXIgPSBOVUxMOworc3RhdGljIGNoYXIgKnJvbGUgPSBOVUxMOworc3RhdGljIGNoYXIgKnR5cGUgPSBOVUxMOworc3RhdGljIGNoYXIgKnJhbmdlID0gTlVMTDsKK3N0YXRpYyBjaGFyICpzcGVjaWZpZWRfY29udGV4dCA9IE5VTEw7CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGNoYW5nZV9maWxlZGlyX2NvbnRleHQoCisJCWNvbnN0IGNoYXIgKmZuYW1lLAorCQlzdHJ1Y3Qgc3RhdCAqc3RidWYgVU5VU0VEX1BBUkFNLAorCQl2b2lkICp1c2VyRGF0YSBVTlVTRURfUEFSQU0sCisJCWludCBkZXB0aCBVTlVTRURfUEFSQU0pCit7CisJY29udGV4dF90IGNvbnRleHQgPSBOVUxMOworCXNlY3VyaXR5X2NvbnRleHRfdCBmaWxlX2NvbnRleHQgPSBOVUxMOworCXNlY3VyaXR5X2NvbnRleHRfdCBjb250ZXh0X3N0cmluZzsKKwlpbnQgcmMgPSBGQUxTRTsKKwlpbnQgc3RhdHVzID0gMDsKKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX05PREVSRUZFUkVOQ0UpIHsKKwkJc3RhdHVzID0gbGdldGZpbGVjb24oZm5hbWUsICZmaWxlX2NvbnRleHQpOworCX0gZWxzZSB7CisJCXN0YXR1cyA9IGdldGZpbGVjb24oZm5hbWUsICZmaWxlX2NvbnRleHQpOworCX0KKwlpZiAoc3RhdHVzIDwgMCAmJiBlcnJubyAhPSBFTk9EQVRBKSB7CisJCWlmICgob3B0aW9uX21hc2szMiAmIE9QVF9RVUlFVCkgPT0gMCkKKwkJCWJiX2Vycm9yX21zZygiY2FuJ3Qgb2J0YWluIHNlY3VyaXR5IGNvbnRleHQ6ICVzIiwgZm5hbWUpOworCQlnb3RvIHNraXA7CisJfQorCisJaWYgKGZpbGVfY29udGV4dCA9PSBOVUxMICYmIHNwZWNpZmllZF9jb250ZXh0ID09IE5VTEwpIHsKKwkJYmJfZXJyb3JfbXNnKCJjYW4ndCBhcHBseSBwYXJ0aWFsIGNvbnRleHQgdG8gdW5sYWJlbGVkIGZpbGUgJXMiLCBmbmFtZSk7CisJCWdvdG8gc2tpcDsKKwl9CisKKwlpZiAoc3BlY2lmaWVkX2NvbnRleHQgPT0gTlVMTCkgeworCQljb250ZXh0ID0gc2V0X3NlY3VyaXR5X2NvbnRleHRfY29tcG9uZW50KGZpbGVfY29udGV4dCwKKwkJCQkJCQl1c2VyLCByb2xlLCB0eXBlLCByYW5nZSk7CisJCWlmICghY29udGV4dCkgeworCQkJYmJfZXJyb3JfbXNnKCJjYW4ndCBjb21wdXRlIHNlY3VyaXR5IGNvbnRleHQgZnJvbSAlcyIsIGZpbGVfY29udGV4dCk7CisJCQlnb3RvIHNraXA7CisJCX0KKwl9IGVsc2UgeworCQljb250ZXh0ID0gY29udGV4dF9uZXcoc3BlY2lmaWVkX2NvbnRleHQpOworCQlpZiAoIWNvbnRleHQpIHsKKwkJCWJiX2Vycm9yX21zZygiaW52YWxpZCBjb250ZXh0OiAlcyIsIHNwZWNpZmllZF9jb250ZXh0KTsKKwkJCWdvdG8gc2tpcDsKKwkJfQorCX0KKworCWNvbnRleHRfc3RyaW5nID0gY29udGV4dF9zdHIoY29udGV4dCk7CisJaWYgKCFjb250ZXh0X3N0cmluZykgeworCQliYl9lcnJvcl9tc2coImNhbid0IG9idGFpbiBzZWN1cml0eSBjb250ZXh0IGluIHRleHQgZXhwcmVzc2lvbiIpOworCQlnb3RvIHNraXA7CisJfQorCisJaWYgKGZpbGVfY29udGV4dCA9PSBOVUxMIHx8IHN0cmNtcChjb250ZXh0X3N0cmluZywgZmlsZV9jb250ZXh0KSAhPSAwKSB7CisJCWludCBmYWlsOworCisJCWlmIChvcHRpb25fbWFzazMyICYgT1BUX05PREVSRUZFUkVOQ0UpIHsKKwkJCWZhaWwgPSBsc2V0ZmlsZWNvbihmbmFtZSwgY29udGV4dF9zdHJpbmcpOworCQl9IGVsc2UgeworCQkJZmFpbCA9IHNldGZpbGVjb24oZm5hbWUsIGNvbnRleHRfc3RyaW5nKTsKKwkJfQorCQlpZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfVkVSQk9TRSkgfHwgKChvcHRpb25fbWFzazMyICYgT1BUX0NIQU5IRVMpICYmICFmYWlsKSkgeworCQkJcHJpbnRmKCFmYWlsCisJCQkJPyAiY29udGV4dCBvZiAlcyBjaGFuZ2VkIHRvICVzXG4iCisJCQkJOiAiY2FuJ3QgY2hhbmdlIGNvbnRleHQgb2YgJXMgdG8gJXNcbiIsCisJCQkJZm5hbWUsIGNvbnRleHRfc3RyaW5nKTsKKwkJfQorCQlpZiAoIWZhaWwpIHsKKwkJCXJjID0gVFJVRTsKKwkJfSBlbHNlIGlmICgob3B0aW9uX21hc2szMiAmIE9QVF9RVUlFVCkgPT0gMCkgeworCQkJYmJfZXJyb3JfbXNnKCJjYW4ndCBjaGFuZ2UgY29udGV4dCBvZiAlcyB0byAlcyIsCisJCQkJCWZuYW1lLCBjb250ZXh0X3N0cmluZyk7CisJCX0KKwl9IGVsc2UgaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfVkVSQk9TRSkgeworCQlwcmludGYoImNvbnRleHQgb2YgJXMgcmV0YWluZWQgYXMgJXNcbiIsIGZuYW1lLCBjb250ZXh0X3N0cmluZyk7CisJCXJjID0gVFJVRTsKKwl9Citza2lwOgorCWNvbnRleHRfZnJlZShjb250ZXh0KTsKKwlmcmVlY29uKGZpbGVfY29udGV4dCk7CisKKwlyZXR1cm4gcmM7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSENPTl9MT05HX09QVElPTlMKK3N0YXRpYyBjb25zdCBjaGFyIGNoY29uX2xvbmdvcHRzW10gQUxJR04xID0KKwkicmVjdXJzaXZlXDAiICAgICAgTm9fYXJndW1lbnQgICAgICAgIlIiCisJImNoYW5nZXNcMCIgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJjIgorCSJuby1kZXJlZmVyZW5jZVwwIiBOb19hcmd1bWVudCAgICAgICAiaCIKKwkic2lsZW50XDAiICAgICAgICAgTm9fYXJndW1lbnQgICAgICAgImYiCisJInF1aWV0XDAiICAgICAgICAgIE5vX2FyZ3VtZW50ICAgICAgICJmIgorCSJ1c2VyXDAiICAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAidSIKKwkicm9sZVwwIiAgICAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInIiCisJInR5cGVcMCIgICAgICAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ0IgorCSJyYW5nZVwwIiAgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAibCIKKwkidmVyYm9zZVwwIiAgICAgICAgTm9fYXJndW1lbnQgICAgICAgInYiCisJInJlZmVyZW5jZVwwIiAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJceGZmIiAvKiBubyBzaG9ydCBvcHRpb24gKi8KKwk7CisjZW5kaWYKKworaW50IGNoY29uX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBjaGNvbl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqcmVmZXJlbmNlX2ZpbGU7CisJY2hhciAqZm5hbWU7CisJaW50IGksIGVycm9ycyA9IDA7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSENPTl9MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gY2hjb25fbG9uZ29wdHM7CisjZW5kaWYKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMSIgIC8qIGF0IGxlYXN0IDEgcGFyYW0gKi8KKwkJIjo/IiAgLyogZXJyb3IgaWYgZXhjbHVzaXZpdHkgY29uc3RyYWludHMgYXJlIHZpb2xhdGVkICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0hDT05fTE9OR19PUFRJT05TCisJCSI6XHhmZi0tdXJ0bDp1LS1ceGZmOnItLVx4ZmY6dC0tXHhmZjpsLS1ceGZmIgorI2VuZGlmCisJCSI6Zi0tdjp2LS1mIjsgIC8qICd2ZXJib3NlJyBhbmQgJ3F1aWV0JyBhcmUgZXhjbHVzaXZlICovCisJZ2V0b3B0MzIoYXJndiwgIlJjaGZ1OnI6dDpsOnYiLAorCQkmdXNlciwgJnJvbGUsICZ0eXBlLCAmcmFuZ2UsICZyZWZlcmVuY2VfZmlsZSk7CisJYXJndiArPSBvcHRpbmQ7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9DSENPTl9MT05HX09QVElPTlMKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9SRUZFUkVOQ0UpIHsKKwkJLyogRklYTUU6IGxnZXRmaWxlY29uKCkgc2hvdWxkIGJlIHVzZWQgd2hlbiAnLWgnIGlzIHNwZWNpZmllZC4KKwkJICogQnV0IGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZm9sbG93cyB0aGUgb3JpZ2luYWwgb25lLiAqLworCQlpZiAoZ2V0ZmlsZWNvbihyZWZlcmVuY2VfZmlsZSwgJnNwZWNpZmllZF9jb250ZXh0KSA8IDApCisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImdldGZpbGVjb24oJyVzJykgZmFpbGVkIiwgcmVmZXJlbmNlX2ZpbGUpOworCX0gZWxzZQorI2VuZGlmCisJaWYgKChvcHRpb25fbWFzazMyICYgT1BUX0NPTVBPTkVOVF9TUEVDSUZJRUQpID09IDApIHsKKwkJc3BlY2lmaWVkX2NvbnRleHQgPSAqYXJndisrOworCQkvKiBzcGVjaWZpZWRfY29udGV4dCBpcyBuZXZlciBOVUxMIC0KKwkJICogIi0xIiBpbiBvcHRfY29tcGxlbWVudGFyeSBwcmV2ZW50cyB0aGlzLiAqLworCQlpZiAoIWFyZ3ZbMF0pCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidG9vIGZldyBhcmd1bWVudHMiKTsKKwl9CisKKwlmb3IgKGkgPSAwOyAoZm5hbWUgPSBhcmd2W2ldKSAhPSBOVUxMOyBpKyspIHsKKwkJaW50IGZuYW1lX2xlbiA9IHN0cmxlbihmbmFtZSk7CisJCXdoaWxlIChmbmFtZV9sZW4gPiAxICYmIGZuYW1lW2ZuYW1lX2xlbiAtIDFdID09ICcvJykKKwkJCWZuYW1lX2xlbi0tOworCQlmbmFtZVtmbmFtZV9sZW5dID0gJ1wwJzsKKworCQlpZiAocmVjdXJzaXZlX2FjdGlvbihmbmFtZSwKKwkJCQkJMTw8b3B0aW9uX21hc2szMiAmIE9QVF9SRUNVUlNJVkUsCisJCQkJCWNoYW5nZV9maWxlZGlyX2NvbnRleHQsCisJCQkJCWNoYW5nZV9maWxlZGlyX2NvbnRleHQsCisJCQkJCU5VTEwsIDApICE9IFRSVUUpCisJCQllcnJvcnMgPSAxOworCX0KKwlyZXR1cm4gZXJyb3JzOworfQpkaWZmIC0tZ2l0IGEvc2VsaW51eC9nZXRlbmZvcmNlLmMgYi9zZWxpbnV4L2dldGVuZm9yY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjYxMWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VsaW51eC9nZXRlbmZvcmNlLmMKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIGdldGVuZm9yY2UKKyAqCisgKiBCYXNlZCBvbiBsaWJzZWxpbnV4IDEuMzMuMQorICogUG9ydCB0byBCdXN5Qm94ICBIaXJvc2hpIFNoaW5qaSA8c2hpcm9zaGlAbXkuZW1haWwubmUuanA+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZ2V0ZW5mb3JjZV90cml2aWFsX3VzYWdlIE5PVVNBR0VfU1RSCisvL3VzYWdlOiNkZWZpbmUgZ2V0ZW5mb3JjZV9mdWxsX3VzYWdlICIiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgZ2V0ZW5mb3JjZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZ2V0ZW5mb3JjZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCWludCByYzsKKworCXJjID0gaXNfc2VsaW51eF9lbmFibGVkKCk7CisJaWYgKHJjIDwgMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImlzX3NlbGludXhfZW5hYmxlZCgpIGZhaWxlZCIpOworCisJaWYgKHJjID09IDEpIHsKKwkJcmMgPSBzZWN1cml0eV9nZXRlbmZvcmNlKCk7CisJCWlmIChyYyA8IDApCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZ2V0ZW5mb3JjZSgpIGZhaWxlZCIpOworCisJCWlmIChyYykKKwkJCXB1dHMoIkVuZm9yY2luZyIpOworCQllbHNlCisJCQlwdXRzKCJQZXJtaXNzaXZlIik7CisJfSBlbHNlIHsKKwkJcHV0cygiRGlzYWJsZWQiKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NlbGludXgvZ2V0c2Vib29sLmMgYi9zZWxpbnV4L2dldHNlYm9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZjBmZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWxpbnV4L2dldHNlYm9vbC5jCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBnZXRzZWJvb2wKKyAqCisgKiBCYXNlZCBvbiBsaWJzZWxpbnV4IDEuMzMuMQorICogUG9ydCB0byBCdXN5Qm94ICBIaXJvc2hpIFNoaW5qaSA8c2hpcm9zaGlAbXkuZW1haWwubmUuanA+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZ2V0c2Vib29sX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICItYSBvciBnZXRzZWJvb2wgYm9vbGVhbi4uLiIKKy8vdXNhZ2U6I2RlZmluZSBnZXRzZWJvb2xfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLWEJU2hvdyBhbGwgc2VsaW51eCBib29sZWFucyIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBnZXRzZWJvb2xfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGdldHNlYm9vbF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgcmMgPSAwLCBhY3RpdmUsIHBlbmRpbmcsIGxlbiA9IDA7CisJY2hhciAqKm5hbWVzOworCXVuc2lnbmVkIG9wdDsKKworCXNlbGludXhfb3JfZGllKCk7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImEiKTsKKworCWlmIChvcHQpIHsgLyogLWEgKi8KKwkJaWYgKGFyZ2MgPiAyKQorCQkJYmJfc2hvd191c2FnZSgpOworCisJCXJjID0gc2VjdXJpdHlfZ2V0X2Jvb2xlYW5fbmFtZXMoJm5hbWVzLCAmbGVuKTsKKwkJaWYgKHJjKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBnZXQgYm9vbGVhbiBuYW1lcyIpOworCisJCWlmICghbGVuKSB7CisJCQlwdXRzKCJObyBib29sZWFucyIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwlpZiAoIWxlbikgeworCQlpZiAoYXJnYyA8IDIpCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWxlbiA9IGFyZ2MgLSAxOworCQluYW1lcyA9IHhtYWxsb2Moc2l6ZW9mKGNoYXIgKikgKiBsZW4pOworCQlmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspCisJCQluYW1lc1tpXSA9IHhzdHJkdXAoYXJndltpICsgMV0pOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlhY3RpdmUgPSBzZWN1cml0eV9nZXRfYm9vbGVhbl9hY3RpdmUobmFtZXNbaV0pOworCQlpZiAoYWN0aXZlIDwgMCkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImVycm9yIGdldHRpbmcgYWN0aXZlIHZhbHVlIGZvciAlcyIsIG5hbWVzW2ldKTsKKwkJfQorCQlwZW5kaW5nID0gc2VjdXJpdHlfZ2V0X2Jvb2xlYW5fcGVuZGluZyhuYW1lc1tpXSk7CisJCWlmIChwZW5kaW5nIDwgMCkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImVycm9yIGdldHRpbmcgcGVuZGluZyB2YWx1ZSBmb3IgJXMiLCBuYW1lc1tpXSk7CisJCX0KKwkJcHJpbnRmKCIlcyAtLT4gJXMiLCBuYW1lc1tpXSwgKGFjdGl2ZSA/ICJvbiIgOiAib2ZmIikpOworCQlpZiAocGVuZGluZyAhPSBhY3RpdmUpCisJCQlwcmludGYoIiBwZW5kaW5nOiAlcyIsIChwZW5kaW5nID8gIm9uIiA6ICJvZmYiKSk7CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykKKwkJCWZyZWUobmFtZXNbaV0pOworCQlmcmVlKG5hbWVzKTsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9zZWxpbnV4L2xvYWRfcG9saWN5LmMgYi9zZWxpbnV4L2xvYWRfcG9saWN5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UxMzlkYgotLS0gL2Rldi9udWxsCisrKyBiL3NlbGludXgvbG9hZF9wb2xpY3kuYwpAQCAtMCwwICsxLDI4IEBACisvKgorICogbG9hZF9wb2xpY3kKKyAqIEF1dGhvcjogWXVpY2hpIE5ha2FtdXJhIDx5bmFrYW1AaGl0YWNoaXNvZnQuanA+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbG9hZF9wb2xpY3lfdHJpdmlhbF91c2FnZSBOT1VTQUdFX1NUUgorLy91c2FnZTojZGVmaW5lIGxvYWRfcG9saWN5X2Z1bGxfdXNhZ2UgIiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBsb2FkX3BvbGljeV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbG9hZF9wb2xpY3lfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlpbnQgcmM7CisKKwlpZiAoYXJndlsxXSkgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJcmMgPSBzZWxpbnV4X21rbG9hZF9wb2xpY3koMSk7CisJaWYgKHJjIDwgMCkgeworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGxvYWQgcG9saWN5Iik7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zZWxpbnV4L21hdGNocGF0aGNvbi5jIGIvc2VsaW51eC9tYXRjaHBhdGhjb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTU3MjhlCi0tLSAvZGV2L251bGwKKysrIGIvc2VsaW51eC9tYXRjaHBhdGhjb24uYwpAQCAtMCwwICsxLDk3IEBACisvKiBtYXRjaHBhdGhjb24gIC0gIGdldCB0aGUgZGVmYXVsdCBzZWN1cml0eSBjb250ZXh0IGZvciB0aGUgc3BlY2lmaWVkCisgKiAgICAgICAgICAgICAgICAgIHBhdGggZnJvbSB0aGUgZmlsZSBjb250ZXh0cyBjb25maWd1cmF0aW9uLgorICogICAgICAgICAgICAgICAgICBiYXNlZCBvbiBsaWJzZWxpbnV4LTEuMzIKKyAqIFBvcnQgdG8gYnVzeWJveDogS2FpR2FpIEtvaGVpIDxrYWlnYWlAa2FpZ2FpLmdyLmpwPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG1hdGNocGF0aGNvbl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1uXSBbLU5dIFstZiBmaWxlX2NvbnRleHRzX2ZpbGVdIFstcCBwcmVmaXhdIFstVl0iCisvL3VzYWdlOiNkZWZpbmUgbWF0Y2hwYXRoY29uX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1uCURvbid0IGRpc3BsYXkgcGF0aCIKKy8vdXNhZ2U6ICAgICAiXG4JLU4JRG9uJ3QgdXNlIHRyYW5zbGF0aW9ucyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJVXNlIGFsdGVybmF0ZSBmaWxlX2NvbnRleHQgZmlsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJVXNlIHByZWZpeCB0byBzcGVlZCB0cmFuc2xhdGlvbnMiCisvL3VzYWdlOiAgICAgIlxuCS1WCVZlcmlmeSBmaWxlIGNvbnRleHQgb24gZGlzayBtYXRjaGVzIGRlZmF1bHRzIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RhdGljIGludCBwcmludF9tYXRjaHBhdGhjb24oY2hhciAqcGF0aCwgaW50IG5vcHJpbnQpCit7CisJY2hhciAqYnVmOworCWludCByYyA9IG1hdGNocGF0aGNvbihwYXRoLCAwLCAmYnVmKTsKKwlpZiAocmMgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2coIm1hdGNocGF0aGNvbiglcykgZmFpbGVkIiwgcGF0aCk7CisJCXJldHVybiAxOworCX0KKwlpZiAoIW5vcHJpbnQpCisJCXByaW50ZigiJXNcdCVzXG4iLCBwYXRoLCBidWYpOworCWVsc2UKKwkJcHV0cyhidWYpOworCisJZnJlZWNvbihidWYpOworCXJldHVybiAwOworfQorCisjZGVmaW5lIE9QVF9OT1RfUFJJTlQgICAoMTw8MCkgIC8qIC1uICovCisjZGVmaW5lIE9QVF9OT1RfVFJBTlMgICAoMTw8MSkgIC8qIC1OICovCisjZGVmaW5lIE9QVF9GQ09OVEVYVCAgICAoMTw8MikgIC8qIC1mICovCisjZGVmaW5lIE9QVF9QUkVGSVggICAgICAoMTw8MykgIC8qIC1wICovCisjZGVmaW5lIE9QVF9WRVJJRlkgICAgICAoMTw8NCkgIC8qIC1WICovCisKK2ludCBtYXRjaHBhdGhjb25fbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1hdGNocGF0aGNvbl9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGVycm9yID0gMDsKKwl1bnNpZ25lZCBvcHRzOworCWNoYXIgKmZjb250ZXh0LCAqcHJlZml4LCAqcGF0aDsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIiAvKiBhdCBsZWFzdCBvbmUgcGFyYW0gcmVxZCAqLworCQkiOj86Zi0tcDpwLS1mIjsgLyogbXV0dWFsbHkgZXhjbHVzaXZlICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJuTmY6cDpWIiwgJmZjb250ZXh0LCAmcHJlZml4KTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChvcHRzICYgT1BUX05PVF9UUkFOUykgeworCQlzZXRfbWF0Y2hwYXRoY29uX2ZsYWdzKE1BVENIUEFUSENPTl9OT1RSQU5TKTsKKwl9CisJaWYgKG9wdHMgJiBPUFRfRkNPTlRFWFQpIHsKKwkJaWYgKG1hdGNocGF0aGNvbl9pbml0KGZjb250ZXh0KSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3Igd2hpbGUgcHJvY2Vzc2luZyAlcyIsIGZjb250ZXh0KTsKKwl9CisJaWYgKG9wdHMgJiBPUFRfUFJFRklYKSB7CisJCWlmIChtYXRjaHBhdGhjb25faW5pdF9wcmVmaXgoTlVMTCwgcHJlZml4KSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiZXJyb3Igd2hpbGUgcHJvY2Vzc2luZyAlcyIsIHByZWZpeCk7CisJfQorCisJd2hpbGUgKChwYXRoID0gKmFyZ3YrKykgIT0gTlVMTCkgeworCQlzZWN1cml0eV9jb250ZXh0X3QgY29uOworCQlpbnQgcmM7CisKKwkJaWYgKCEob3B0cyAmIE9QVF9WRVJJRlkpKSB7CisJCQllcnJvciArPSBwcmludF9tYXRjaHBhdGhjb24ocGF0aCwgb3B0cyAmIE9QVF9OT1RfUFJJTlQpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc2VsaW51eF9maWxlX2NvbnRleHRfdmVyaWZ5KHBhdGgsIDApKSB7CisJCQlwcmludGYoIiVzIHZlcmlmaWVkXG4iLCBwYXRoKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKG9wdHMgJiBPUFRfTk9UX1RSQU5TKQorCQkJcmMgPSBsZ2V0ZmlsZWNvbl9yYXcocGF0aCwgJmNvbik7CisJCWVsc2UKKwkJCXJjID0gbGdldGZpbGVjb24ocGF0aCwgJmNvbik7CisKKwkJaWYgKHJjID49IDApIHsKKwkJCXByaW50ZigiJXMgaGFzIGNvbnRleHQgJXMsIHNob3VsZCBiZSAiLCBwYXRoLCBjb24pOworCQkJZXJyb3IgKz0gcHJpbnRfbWF0Y2hwYXRoY29uKHBhdGgsIDEpOworCQkJZnJlZWNvbihjb24pOworCQkJY29udGludWU7CisJCX0KKwkJcHJpbnRmKCJhY3R1YWwgY29udGV4dCB1bmtub3duOiAlcywgc2hvdWxkIGJlICIsIHN0cmVycm9yKGVycm5vKSk7CisJCWVycm9yICs9IHByaW50X21hdGNocGF0aGNvbihwYXRoLCAxKTsKKwl9CisJbWF0Y2hwYXRoY29uX2ZpbmkoKTsKKwlyZXR1cm4gZXJyb3I7Cit9CmRpZmYgLS1naXQgYS9zZWxpbnV4L3J1bmNvbi5jIGIvc2VsaW51eC9ydW5jb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2YyYmUzCi0tLSAvZGV2L251bGwKKysrIGIvc2VsaW51eC9ydW5jb24uYwpAQCAtMCwwICsxLDE1NyBAQAorLyoKKyAqIHJ1bmNvbiBbIGNvbnRleHQgfAorICogICAgICAgICAoIFsgLWMgXSBbIC1yIHJvbGUgXSBbLXQgdHlwZV0gWyAtdSB1c2VyIF0gWyAtbCBsZXZlbHJhbmdlIF0gKQorICogICAgICAgICBjb21tYW5kIFthcmcxIFthcmcyIC4uLl0gXQorICoKKyAqIGF0dGVtcHQgdG8gcnVuIHRoZSBzcGVjaWZpZWQgY29tbWFuZCB3aXRoIHRoZSBzcGVjaWZpZWQgY29udGV4dC4KKyAqCisgKiAtciByb2xlICA6IHVzZSB0aGUgY3VycmVudCBjb250ZXh0IHdpdGggdGhlIHNwZWNpZmllZCByb2xlCisgKiAtdCB0eXBlICA6IHVzZSB0aGUgY3VycmVudCBjb250ZXh0IHdpdGggdGhlIHNwZWNpZmllZCB0eXBlCisgKiAtdSB1c2VyICA6IHVzZSB0aGUgY3VycmVudCBjb250ZXh0IHdpdGggdGhlIHNwZWNpZmllZCB1c2VyCisgKiAtbCBsZXZlbCA6IHVzZSB0aGUgY3VycmVudCBjb250ZXh0IHdpdGggdGhlIHNwZWNpZmllZCBsZXZlbCByYW5nZQorICogLWMgICAgICAgOiBjb21wdXRlIHByb2Nlc3MgdHJhbnNpdGlvbiBjb250ZXh0IGJlZm9yZSBtb2RpZnlpbmcKKyAqCisgKiBDb250ZXh0cyBhcmUgaW50ZXJwcmV0ZWQgYXMgZm9sbG93czoKKyAqCisgKiBOdW1iZXIgb2YgICAgICAgTUxTCisgKiBjb21wb25lbnRzICAgIHN5c3RlbT8KKyAqCisgKiAgICAgMSAgICAgICAgICAgIC0gICAgICAgICB0eXBlCisgKiAgICAgMiAgICAgICAgICAgIC0gICAgICAgICByb2xlOnR5cGUKKyAqICAgICAzICAgICAgICAgICAgWSAgICAgICAgIHJvbGU6dHlwZTpyYW5nZQorICogICAgIDMgICAgICAgICAgICBOICAgICAgICAgdXNlcjpyb2xlOnR5cGUKKyAqICAgICA0ICAgICAgICAgICAgWSAgICAgICAgIHVzZXI6cm9sZTp0eXBlOnJhbmdlCisgKiAgICAgNCAgICAgICAgICAgIE4gICAgICAgICBlcnJvcgorICoKKyAqIFBvcnQgdG8gYnVzeWJveDogS2FpR2FpIEtvaGVpIDxrYWlnYWlAa2FpZ2FpLmdyLmpwPgorICogICAgICAgICAgICAgICAgICAtIGJhc2VkIG9uIGNvcmV1dGlscy01Ljk3IChpbiBGZWRvcmEgQ29yZSA2KQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHJ1bmNvbl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jXSBbLXUgVVNFUl0gWy1yIFJPTEVdIFstdCBUWVBFXSBbLWwgUkFOR0VdIFBST0cgQVJHU1xuIgorLy91c2FnZTogICAgICAgInJ1bmNvbiBDT05URVhUIFBST0cgQVJHUyIKKy8vdXNhZ2U6I2RlZmluZSBydW5jb25fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSdW4gUFJPRyBpbiBhIGRpZmZlcmVudCBzZWN1cml0eSBjb250ZXh0XG4iCisvL3VzYWdlOiAgICAgIlxuCUNPTlRFWFQJCUNvbXBsZXRlIHNlY3VyaXR5IGNvbnRleHRcbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfUlVOQ09OX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG4JLWMsLS1jb21wdXRlCUNvbXB1dGUgcHJvY2VzcyB0cmFuc2l0aW9uIGNvbnRleHQgYmVmb3JlIG1vZGlmeWluZyIKKy8vdXNhZ2U6ICAgICAiXG4JLXQsLS10eXBlPVRZUEUJVHlwZSAoZm9yIHNhbWUgcm9sZSBhcyBwYXJlbnQpIgorLy91c2FnZTogICAgICJcbgktdSwtLXVzZXI9VVNFUglVc2VyIGlkZW50aXR5IgorLy91c2FnZTogICAgICJcbgktciwtLXJvbGU9Uk9MRQlSb2xlIgorLy91c2FnZTogICAgICJcbgktbCwtLXJhbmdlPVJORwlMZXZlbHJhbmdlIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfUlVOQ09OX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAiXG4JLWMJQ29tcHV0ZSBwcm9jZXNzIHRyYW5zaXRpb24gY29udGV4dCBiZWZvcmUgbW9kaWZ5aW5nIgorLy91c2FnZTogICAgICJcbgktdCBUWVBFCVR5cGUgKGZvciBzYW1lIHJvbGUgYXMgcGFyZW50KSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUgVVNFUglVc2VyIGlkZW50aXR5IgorLy91c2FnZTogICAgICJcbgktciBST0xFCVJvbGUiCisvL3VzYWdlOiAgICAgIlxuCS1sIFJORwlMZXZlbHJhbmdlIgorLy91c2FnZToJKQorCisjaW5jbHVkZSA8c2VsaW51eC9jb250ZXh0Lmg+CisjaW5jbHVkZSA8c2VsaW51eC9mbGFzay5oPgorCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RhdGljIGNvbnRleHRfdCBydW5jb25fY29tcHV0ZV9uZXdfY29udGV4dChjaGFyICp1c2VyLCBjaGFyICpyb2xlLCBjaGFyICp0eXBlLCBjaGFyICpyYW5nZSwKKwkJCWNoYXIgKmNvbW1hbmQsIGludCBjb21wdXRlX3RyYW5zKQoreworCWNvbnRleHRfdCBjb247CisJc2VjdXJpdHlfY29udGV4dF90IGN1cl9jb250ZXh0OworCisJaWYgKGdldGNvbigmY3VyX2NvbnRleHQpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZ2V0IGN1cnJlbnQgY29udGV4dCIpOworCisJaWYgKGNvbXB1dGVfdHJhbnMpIHsKKwkJc2VjdXJpdHlfY29udGV4dF90IGZpbGVfY29udGV4dCwgbmV3X2NvbnRleHQ7CisKKwkJaWYgKGdldGZpbGVjb24oY29tbWFuZCwgJmZpbGVfY29udGV4dCkgPCAwKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJldHJpZXZlIGF0dHJpYnV0ZXMgb2YgJyVzJyIsCisJCQkJCWNvbW1hbmQpOworCQlpZiAoc2VjdXJpdHlfY29tcHV0ZV9jcmVhdGUoY3VyX2NvbnRleHQsIGZpbGVfY29udGV4dCwKKwkJCQkJU0VDQ0xBU1NfUFJPQ0VTUywgJm5ld19jb250ZXh0KSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmFibGUgdG8gY29tcHV0ZSBhIG5ldyBjb250ZXh0Iik7CisJCWN1cl9jb250ZXh0ID0gbmV3X2NvbnRleHQ7CisJfQorCisJY29uID0gY29udGV4dF9uZXcoY3VyX2NvbnRleHQpOworCWlmICghY29uKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJyVzJyBpcyBub3QgYSB2YWxpZCBjb250ZXh0IiwgY3VyX2NvbnRleHQpOworCWlmICh1c2VyICYmIGNvbnRleHRfdXNlcl9zZXQoY29uLCB1c2VyKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHNldCBuZXcgdXNlciAnJXMnIiwgdXNlcik7CisJaWYgKHR5cGUgJiYgY29udGV4dF90eXBlX3NldChjb24sIHR5cGUpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc2V0IG5ldyB0eXBlICclcyciLCB0eXBlKTsKKwlpZiAocmFuZ2UgJiYgY29udGV4dF9yYW5nZV9zZXQoY29uLCByYW5nZSkpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzZXQgbmV3IHJhbmdlICclcyciLCByYW5nZSk7CisJaWYgKHJvbGUgJiYgY29udGV4dF9yb2xlX3NldChjb24sIHJvbGUpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc2V0IG5ldyByb2xlICclcyciLCByb2xlKTsKKworCXJldHVybiBjb247Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9SVU5DT05fTE9OR19PUFRJT05TCitzdGF0aWMgY29uc3QgY2hhciBydW5jb25fbG9uZ29wdHNbXSBBTElHTjEgPQorCSJ1c2VyXDAiICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ1IgorCSJyb2xlXDAiICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJyIgorCSJ0eXBlXDAiICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJ0IgorCSJyYW5nZVwwIiAgIFJlcXVpcmVkX2FyZ3VtZW50ICJsIgorCSJjb21wdXRlXDAiIE5vX2FyZ3VtZW50ICJjIgorCSJoZWxwXDAiICAgIE5vX2FyZ3VtZW50ICJoIgorCTsKKyNlbmRpZgorCisjZGVmaW5lIE9QVFNfUk9MRQkoMTw8MCkJLyogciAqLworI2RlZmluZSBPUFRTX1RZUEUJKDE8PDEpCS8qIHQgKi8KKyNkZWZpbmUgT1BUU19VU0VSCSgxPDwyKQkvKiB1ICovCisjZGVmaW5lIE9QVFNfUkFOR0UJKDE8PDMpCS8qIGwgKi8KKyNkZWZpbmUgT1BUU19DT01QVVRFCSgxPDw0KQkvKiBjICovCisjZGVmaW5lIE9QVFNfSEVMUAkoMTw8NSkJLyogaCAqLworI2RlZmluZSBPUFRTX0NPTlRFWFRfQ09NUE9ORU5UCQkoT1BUU19ST0xFIHwgT1BUU19UWVBFIHwgT1BUU19VU0VSIHwgT1BUU19SQU5HRSkKKworaW50IHJ1bmNvbl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcnVuY29uX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpyb2xlID0gTlVMTDsKKwljaGFyICpyYW5nZSA9IE5VTEw7CisJY2hhciAqdXNlciA9IE5VTEw7CisJY2hhciAqdHlwZSA9IE5VTEw7CisJY2hhciAqY29udGV4dCA9IE5VTEw7CisJdW5zaWduZWQgb3B0czsKKwljb250ZXh0X3QgY29uOworCisJc2VsaW51eF9vcl9kaWUoKTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1JVTkNPTl9MT05HX09QVElPTlMKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gcnVuY29uX2xvbmdvcHRzOworI2VuZGlmCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiLTEiOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAicjp0OnU6bDpjaCIsICZyb2xlLCAmdHlwZSwgJnVzZXIsICZyYW5nZSk7CisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoIShvcHRzICYgT1BUU19DT05URVhUX0NPTVBPTkVOVCkpIHsKKwkJY29udGV4dCA9ICphcmd2Kys7CisJCWlmICghYXJndlswXSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyBjb21tYW5kIGdpdmVuIik7CisJfQorCisJaWYgKGNvbnRleHQpIHsKKwkJY29uID0gY29udGV4dF9uZXcoY29udGV4dCk7CisJCWlmICghY29uKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiclcycgaXMgbm90IGEgdmFsaWQgY29udGV4dCIsIGNvbnRleHQpOworCX0gZWxzZSB7CisJCWNvbiA9IHJ1bmNvbl9jb21wdXRlX25ld19jb250ZXh0KHVzZXIsIHJvbGUsIHR5cGUsIHJhbmdlLAorCQkJCWFyZ3ZbMF0sIG9wdHMgJiBPUFRTX0NPTVBVVEUpOworCX0KKworCWlmIChzZWN1cml0eV9jaGVja19jb250ZXh0KGNvbnRleHRfc3RyKGNvbikpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJyVzJyBpcyBub3QgYSB2YWxpZCBjb250ZXh0IiwKKwkJCQljb250ZXh0X3N0cihjb24pKTsKKworCWlmIChzZXRleGVjY29uKGNvbnRleHRfc3RyKGNvbikpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc2V0IHVwIHNlY3VyaXR5IGNvbnRleHQgJyVzJyIsCisJCQkJY29udGV4dF9zdHIoY29uKSk7CisKKwlCQl9FWEVDVlBfb3JfZGllKGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvc2VsaW51eC9zZWxpbnV4ZW5hYmxlZC5jIGIvc2VsaW51eC9zZWxpbnV4ZW5hYmxlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlODMwZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWxpbnV4L3NlbGludXhlbmFibGVkLmMKQEAgLTAsMCArMSwxOSBAQAorLyoKKyAqIHNlbGludXhlbmFibGVkCisgKgorICogQmFzZWQgb24gbGlic2VsaW51eCAxLjMzLjEKKyAqIFBvcnQgdG8gQnVzeUJveCAgSGlyb3NoaSBTaGluamkgPHNoaXJvc2hpQG15LmVtYWlsLm5lLmpwPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHNlbGludXhlbmFibGVkX3RyaXZpYWxfdXNhZ2UgTk9VU0FHRV9TVFIKKy8vdXNhZ2U6I2RlZmluZSBzZWxpbnV4ZW5hYmxlZF9mdWxsX3VzYWdlICIiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgc2VsaW51eGVuYWJsZWRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNlbGludXhlbmFibGVkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJcmV0dXJuICFpc19zZWxpbnV4X2VuYWJsZWQoKTsKK30KZGlmZiAtLWdpdCBhL3NlbGludXgvc2VzdGF0dXMuYyBiL3NlbGludXgvc2VzdGF0dXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTk0MzE4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VsaW51eC9zZXN0YXR1cy5jCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogc2VzdGF0dXMgLS0gZGlzcGxheXMgdGhlIHN0YXR1cyBvZiBTRUxpbnV4CisgKgorICogUG9ydGVkIHRvIGJ1c3lib3g6IEthaUdhaSBLb2hlaSA8a2FpZ2FpQGFrLmpwLm5lYy5jb20+CisgKgorICogQ29weXJpZ2h0IChDKSBLYWlHYWkgS29oZWkgPGthaWdhaUBhay5qcC5uZWMuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHNlc3RhdHVzX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXZiXSIKKy8vdXNhZ2U6I2RlZmluZSBzZXN0YXR1c19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgktdglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktYglEaXNwbGF5IGN1cnJlbnQgc3RhdGUgb2YgYm9vbGVhbnMiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCitleHRlcm4gY2hhciAqc2VsaW51eF9tbnQ7CisKKyNkZWZpbmUgT1BUX1ZFUkJPU0UgICgxIDw8IDApCisjZGVmaW5lIE9QVF9CT09MRUFOICAoMSA8PCAxKQorCisjZGVmaW5lIENPTF9GTVQgICIlLTMxcyAiCisKK3N0YXRpYyB2b2lkIGRpc3BsYXlfYm9vbGVhbih2b2lkKQoreworCWNoYXIgKipib29sczsKKwlpbnQgaSwgYWN0aXZlLCBwZW5kaW5nLCBuYm9vbDsKKworCWlmIChzZWN1cml0eV9nZXRfYm9vbGVhbl9uYW1lcygmYm9vbHMsICZuYm9vbCkgPCAwKQorCQlyZXR1cm47CisKKwlwdXRzKCJcblBvbGljeSBib29sZWFuczoiKTsKKworCWZvciAoaSA9IDA7IGkgPCBuYm9vbDsgaSsrKSB7CisJCWFjdGl2ZSA9IHNlY3VyaXR5X2dldF9ib29sZWFuX2FjdGl2ZShib29sc1tpXSk7CisJCWlmIChhY3RpdmUgPCAwKQorCQkJZ290byBza2lwOworCQlwZW5kaW5nID0gc2VjdXJpdHlfZ2V0X2Jvb2xlYW5fcGVuZGluZyhib29sc1tpXSk7CisJCWlmIChwZW5kaW5nIDwgMCkKKwkJCWdvdG8gc2tpcDsKKwkJcHJpbnRmKENPTF9GTVQgIiVzIiwKKwkJCQlib29sc1tpXSwgYWN0aXZlID09IDAgPyAib2ZmIiA6ICJvbiIpOworCQlpZiAoYWN0aXZlICE9IHBlbmRpbmcpCisJCQlwcmludGYoIiAoJXNhY3RpdmF0ZSBwZW5kaW5nKSIsIHBlbmRpbmcgPT0gMCA/ICJpbiIgOiAiIik7CisJCWJiX3B1dGNoYXIoJ1xuJyk7Cisgc2tpcDoKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZShib29sc1tpXSk7CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZnJlZShib29scyk7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfY29uZmlnKGNoYXIgKipwYywgaW50IG5wYywgY2hhciAqKmZjLCBpbnQgbmZjKQoreworCWNoYXIgKmJ1ZjsKKwlwYXJzZXJfdCAqcGFyc2VyOworCWludCBwY19vZnMgPSAwLCBmY19vZnMgPSAwLCBzZWN0aW9uID0gLTE7CisKKwlwY1swXSA9IGZjWzBdID0gTlVMTDsKKworCXBhcnNlciA9IGNvbmZpZ19vcGVuKCIvZXRjL3Nlc3RhdHVzLmNvbmYiKTsKKwl3aGlsZSAoY29uZmlnX3JlYWQocGFyc2VyLCAmYnVmLCAxLCAxLCAiIyBcdCIsIFBBUlNFX05PUk1BTCkpIHsKKwkJaWYgKHN0cmNtcChidWYsICJbcHJvY2Vzc10iKSA9PSAwKSB7CisJCQlzZWN0aW9uID0gMTsKKwkJfSBlbHNlIGlmIChzdHJjbXAoYnVmLCAiW2ZpbGVzXSIpID09IDApIHsKKwkJCXNlY3Rpb24gPSAyOworCQl9IGVsc2UgeworCQkJaWYgKHNlY3Rpb24gPT0gMSAmJiBwY19vZnMgPCBucGMgLTEpIHsKKwkJCQlwY1twY19vZnMrK10gPSB4c3RyZHVwKGJ1Zik7CisJCQkJcGNbcGNfb2ZzXSA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKHNlY3Rpb24gPT0gMiAmJiBmY19vZnMgPCBuZmMgLSAxKSB7CisJCQkJZmNbZmNfb2ZzKytdID0geHN0cmR1cChidWYpOworCQkJCWZjW2ZjX29mc10gPSBOVUxMOworCQkJfQorCQl9CisJfQorCWNvbmZpZ19jbG9zZShwYXJzZXIpOworfQorCitzdGF0aWMgdm9pZCBkaXNwbGF5X3ZlcmJvc2Uodm9pZCkKK3sKKwlzZWN1cml0eV9jb250ZXh0X3QgY29uLCBfY29uOworCWNoYXIgKmZjWzUwXSwgKnBjWzUwXSwgKmN0ZXJtOworCXBpZF90ICpwaWRMaXN0OworCWludCBpOworCisJcmVhZF9jb25maWcocGMsIEFSUkFZX1NJWkUocGMpLCBmYywgQVJSQVlfU0laRShmYykpOworCisJLyogcHJvY2VzcyBjb250ZXh0cyAqLworCXB1dHMoIlxuUHJvY2VzcyBjb250ZXh0czoiKTsKKworCS8qIGN1cnJlbnQgY29udGV4dCAqLworCWlmIChnZXRjb24oJmNvbikgPT0gMCkgeworCQlwcmludGYoQ09MX0ZNVCAiJXNcbiIsICJDdXJyZW50IGNvbnRleHQ6IiwgY29uKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZWNvbihjb24pOworCX0KKwkvKiAvc2Jpbi9pbml0IGNvbnRleHQgKi8KKwlpZiAoZ2V0cGlkY29uKDEsICZjb24pID09IDApIHsKKwkJcHJpbnRmKENPTF9GTVQgIiVzXG4iLCAiSW5pdCBjb250ZXh0OiIsIGNvbik7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZyZWVjb24oY29uKTsKKwl9CisKKwkvKiBbcHJvY2Vzc10gY29udGV4dCAqLworCWZvciAoaSA9IDA7IHBjW2ldICE9IE5VTEw7IGkrKykgeworCQlwaWRMaXN0ID0gZmluZF9waWRfYnlfbmFtZShiYl9iYXNlbmFtZShwY1tpXSkpOworCQlpZiAocGlkTGlzdFswXSA+IDAgJiYgZ2V0cGlkY29uKHBpZExpc3RbMF0sICZjb24pID09IDApIHsKKwkJCXByaW50ZihDT0xfRk1UICIlc1xuIiwgcGNbaV0sIGNvbik7CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJZnJlZWNvbihjb24pOworCQl9CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWZyZWUocGlkTGlzdCk7CisJfQorCisJLyogZmlsZXMgY29udGV4dHMgKi8KKwlwdXRzKCJcbkZpbGUgY29udGV4dHM6Iik7CisKKwljdGVybSA9IHhtYWxsb2NfdHR5bmFtZSgwKTsKKy8vRklYTUU6IGlmIGN0ZXJtID09IE5VTEwsIHdlIHNlZ2ZhdWx0IT8/CisJcHV0cyhjdGVybSk7CisJaWYgKGN0ZXJtICYmIGxnZXRmaWxlY29uKGN0ZXJtLCAmY29uKSA+PSAwKSB7CisJCXByaW50ZihDT0xfRk1UICIlc1xuIiwgIkNvbnRyb2xsaW5nIHRlcm06IiwgY29uKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZWNvbihjb24pOworCX0KKworCWZvciAoaSA9IDA7IGZjW2ldICE9IE5VTEw7IGkrKykgeworCQlzdHJ1Y3Qgc3RhdCBzdGJ1ZjsKKworCQlpZiAobGdldGZpbGVjb24oZmNbaV0sICZjb24pIDwgMCkKKwkJCWNvbnRpbnVlOworCQlpZiAobHN0YXQoZmNbaV0sICZzdGJ1ZikgPT0gMCkgeworCQkJaWYgKFNfSVNMTksoc3RidWYuc3RfbW9kZSkpIHsKKwkJCQlpZiAoZ2V0ZmlsZWNvbihmY1tpXSwgJl9jb24pID49IDApIHsKKwkJCQkJcHJpbnRmKENPTF9GTVQgIiVzIC0+ICVzXG4iLCBmY1tpXSwgX2NvbiwgY29uKTsKKwkJCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJCQkJZnJlZWNvbihfY29uKTsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCXByaW50ZihDT0xfRk1UICIlc1xuIiwgZmNbaV0sIGNvbik7CisJCQl9CisJCX0KKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZWNvbihjb24pOworCX0KK30KKworaW50IHNlc3RhdHVzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZXN0YXR1c19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0czsKKwljb25zdCBjaGFyICpwb2xfcGF0aDsKKwlpbnQgcmM7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI/MCI7ICAvKiBubyBhcmd1bWVudHMgYXJlIHJlcXVpcmVkLiAqLworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAidmIiKTsKKworCS8qIFNFTGludXggc3RhdHVzOiBsaW5lICovCisJcmMgPSBpc19zZWxpbnV4X2VuYWJsZWQoKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycm9yOworCXByaW50ZihDT0xfRk1UICIlc1xuIiwgIlNFTGludXggc3RhdHVzOiIsCisJICAgICAgIHJjID09IDEgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKworCS8qIFNFTGludXhmcyBtb3VudDogbGluZSAqLworCWlmICghc2VsaW51eF9tbnQpCisJCWdvdG8gZXJyb3I7CisJcHJpbnRmKENPTF9GTVQgIiVzXG4iLCAiU0VMaW51eGZzIG1vdW50OiIsCisJICAgICAgIHNlbGludXhfbW50KTsKKworCS8qIEN1cnJlbnQgbW9kZTogbGluZSAqLworCXJjID0gc2VjdXJpdHlfZ2V0ZW5mb3JjZSgpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyb3I7CisJcHJpbnRmKENPTF9GTVQgIiVzXG4iLCAiQ3VycmVudCBtb2RlOiIsCisJICAgICAgIHJjID09IDAgPyAicGVybWlzc2l2ZSIgOiAiZW5mb3JjaW5nIik7CisKKwkvKiBNb2RlIGZyb20gY29uZmlnIGZpbGU6IGxpbmUgKi8KKwlpZiAoc2VsaW51eF9nZXRlbmZvcmNlbW9kZSgmcmMpICE9IDApCisJCWdvdG8gZXJyb3I7CisJcHJpbnRmKENPTF9GTVQgIiVzXG4iLCAiTW9kZSBmcm9tIGNvbmZpZyBmaWxlOiIsCisJICAgICAgIHJjIDwgMCA/ICJkaXNhYmxlZCIgOiAocmMgPT0gMCA/ICJwZXJtaXNzaXZlIiA6ICJlbmZvcmNpbmciKSk7CisKKwkvKiBQb2xpY3kgdmVyc2lvbjogbGluZSAqLworCXJjID0gc2VjdXJpdHlfcG9saWN5dmVycygpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyb3I7CisJcHJpbnRmKENPTF9GTVQgIiV1XG4iLCAiUG9saWN5IHZlcnNpb246IiwgcmMpOworCisJLyogUG9saWN5IGZyb20gY29uZmlnIGZpbGU6IGxpbmUgKi8KKwlwb2xfcGF0aCA9IHNlbGludXhfcG9saWN5X3Jvb3QoKTsKKwlpZiAoIXBvbF9wYXRoKQorCQlnb3RvIGVycm9yOworCXByaW50ZihDT0xfRk1UICIlc1xuIiwgIlBvbGljeSBmcm9tIGNvbmZpZyBmaWxlOiIsCisJICAgICAgIGJiX2Jhc2VuYW1lKHBvbF9wYXRoKSk7CisKKwlpZiAob3B0cyAmIE9QVF9CT09MRUFOKQorCQlkaXNwbGF5X2Jvb2xlYW4oKTsKKwlpZiAob3B0cyAmIE9QVF9WRVJCT1NFKQorCQlkaXNwbGF5X3ZlcmJvc2UoKTsKKworCXJldHVybiAwOworCisgIGVycm9yOgorCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgibGlic2VsaW51eCByZXR1cm5zIHVua25vd24gc3RhdGUiKTsKK30KZGlmZiAtLWdpdCBhL3NlbGludXgvc2V0ZW5mb3JjZS5jIGIvc2VsaW51eC9zZXRlbmZvcmNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzViYzBhNQotLS0gL2Rldi9udWxsCisrKyBiL3NlbGludXgvc2V0ZW5mb3JjZS5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBzZXRlbmZvcmNlCisgKgorICogQmFzZWQgb24gbGlic2VsaW51eCAxLjMzLjEKKyAqIFBvcnQgdG8gQnVzeUJveCAgSGlyb3NoaSBTaGluamkgPHNoaXJvc2hpQG15LmVtYWlsLm5lLmpwPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHNldGVuZm9yY2VfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltFbmZvcmNpbmcgfCBQZXJtaXNzaXZlIHwgMSB8IDBdIgorLy91c2FnZTojZGVmaW5lIHNldGVuZm9yY2VfZnVsbF91c2FnZSAiIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogVGhlc2Ugc3RyaW5ncyBhcmUgYXJyYW5nZWQgc28gdGhhdCBvZGQgb25lcworICogcmVzdWx0IGluIHNlY3VyaXR5X3NldGVuZm9yY2UoMSkgYmVpbmcgZG9uZSwKKyAqIHRoZSByZXN0IHdpbGwgZG8gc2VjdXJpdHlfc2V0ZW5mb3JjZSgwKSAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHNldGVuZm9yY2VfY21kW10gPSB7CisJIjAiLAorCSIxIiwKKwkicGVybWlzc2l2ZSIsCisJImVuZm9yY2luZyIsCisJTlVMTCwKK307CisKK2ludCBzZXRlbmZvcmNlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZXRlbmZvcmNlX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaSwgcmM7CisKKwlpZiAoIWFyZ3ZbMV0gfHwgYXJndlsyXSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJc2VsaW51eF9vcl9kaWUoKTsKKworCWZvciAoaSA9IDA7IHNldGVuZm9yY2VfY21kW2ldOyBpKyspIHsKKwkJaWYgKHN0cmNhc2VjbXAoYXJndlsxXSwgc2V0ZW5mb3JjZV9jbWRbaV0pICE9IDApCisJCQljb250aW51ZTsKKwkJcmMgPSBzZWN1cml0eV9zZXRlbmZvcmNlKGkgJiAxKTsKKwkJaWYgKHJjIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2V0ZW5mb3JjZSgpIGZhaWxlZCIpOworCQlyZXR1cm4gMDsKKwl9CisKKwliYl9zaG93X3VzYWdlKCk7Cit9CmRpZmYgLS1naXQgYS9zZWxpbnV4L3NldGZpbGVzLmMgYi9zZWxpbnV4L3NldGZpbGVzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk3NGM0YQotLS0gL2Rldi9udWxsCisrKyBiL3NlbGludXgvc2V0ZmlsZXMuYwpAQCAtMCwwICsxLDY4MCBAQAorLyoKKyAgc2V0ZmlsZXM6IGJhc2VkIG9uIHBvbGljeWNvcmV1dGlscyAyLjAuMTkKKyAgcG9saWN5Y29yZXV0aWxzIHdhcyByZWxlYXNlZCB1bmRlciBHUEwgMi4KKyAgUG9ydCB0byBCdXN5Qm94IChjKSAyMDA3IGJ5IFl1aWNoaSBOYWthbXVyYSA8eW5ha2FtQGhpdGFjaGlzb2Z0LmpwPgorKi8KKworLy91c2FnZTojZGVmaW5lIHNldGZpbGVzX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWRucHFzdlddIFstZSBESVJdLi4uIFstbyBGSUxFXSBbLXIgYWx0X3Jvb3RfcGF0aF0iCisvL3VzYWdlOglJRl9GRUFUVVJFX1NFVEZJTEVTX0NIRUNLX09QVElPTigKKy8vdXNhZ2U6ICAgICAgICIgWy1jIHBvbGljeWZpbGVdIHNwZWNfZmlsZSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAgICIgcGF0aG5hbWUiCisvL3VzYWdlOiNkZWZpbmUgc2V0ZmlsZXNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJSZXNldCBmaWxlIGNvbnRleHRzIHVuZGVyIHBhdGhuYW1lIGFjY29yZGluZyB0byBzcGVjX2ZpbGVcbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU0VURklMRVNfQ0hFQ0tfT1BUSU9OKAorLy91c2FnZTogICAgICJcbgktYyBGSUxFCUNoZWNrIHRoZSB2YWxpZGl0eSBvZiB0aGUgY29udGV4dHMgYWdhaW5zdCB0aGUgc3BlY2lmaWVkIGJpbmFyeSBwb2xpY3kiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1kCVNob3cgd2hpY2ggc3BlY2lmaWNhdGlvbiBtYXRjaGVkIGVhY2ggZmlsZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWwJTG9nIGNoYW5nZXMgaW4gZmlsZSBsYWJlbHMgdG8gc3lzbG9nIgorLy91c2FnZTogICAgICJcbgktbglEb24ndCBjaGFuZ2UgYW55IGZpbGUgbGFiZWxzIgorLy91c2FnZTogICAgICJcbgktcQlTdXBwcmVzcyB3YXJuaW5ncyIKKy8vdXNhZ2U6ICAgICAiXG4JLXIgRElSCVVzZSBhbiBhbHRlcm5hdGUgcm9vdCBwYXRoIgorLy91c2FnZTogICAgICJcbgktZSBESVIJRXhjbHVkZSBESVIiCisvL3VzYWdlOiAgICAgIlxuCS1GCUZvcmNlIHJlc2V0IG9mIGNvbnRleHQgdG8gbWF0Y2ggZmlsZV9jb250ZXh0IGZvciBjdXN0b21pemFibGUgZmlsZXMiCisvL3VzYWdlOiAgICAgIlxuCS1vIEZJTEUJU2F2ZSBsaXN0IG9mIGZpbGVzIHdpdGggaW5jb3JyZWN0IGNvbnRleHQiCisvL3VzYWdlOiAgICAgIlxuCS1zCVRha2UgYSBsaXN0IG9mIGZpbGVzIGZyb20gc3RkaW4gKGluc3RlYWQgb2YgY29tbWFuZCBsaW5lKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXYJU2hvdyBjaGFuZ2VzIGluIGZpbGUgbGFiZWxzLCBpZiB0eXBlIG9yIHJvbGUgYXJlIGNoYW5naW5nIgorLy91c2FnZTogICAgICJcbgktdnYJU2hvdyBjaGFuZ2VzIGluIGZpbGUgbGFiZWxzLCBpZiB0eXBlLCByb2xlLCBvciB1c2VyIGFyZSBjaGFuZ2luZyIKKy8vdXNhZ2U6ICAgICAiXG4JLVcJRGlzcGxheSB3YXJuaW5ncyBhYm91dCBlbnRyaWVzIHRoYXQgaGFkIG5vIG1hdGNoaW5nIGZpbGVzIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSByZXN0b3JlY29uX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWlGblJ2XSBbLWUgRVhDTFVERURJUl0uLi4gWy1vIEZJTEVdIFstZiBGSUxFXSIKKy8vdXNhZ2U6I2RlZmluZSByZXN0b3JlY29uX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUmVzZXQgc2VjdXJpdHkgY29udGV4dHMgb2YgZmlsZXMgaW4gcGF0aG5hbWVcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWkJSWdub3JlIGZpbGVzIHRoYXQgZG9uJ3QgZXhpc3QiCisvL3VzYWdlOiAgICAgIlxuCS1mIEZJTEUJRmlsZSB3aXRoIGxpc3Qgb2YgZmlsZXMgdG8gcHJvY2VzcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWUgRElSCURpcmVjdG9yeSB0byBleGNsdWRlIgorLy91c2FnZTogICAgICJcbgktUiwtcglSZWN1cnNlIgorLy91c2FnZTogICAgICJcbgktbglEb24ndCBjaGFuZ2UgYW55IGZpbGUgbGFiZWxzIgorLy91c2FnZTogICAgICJcbgktbyBGSUxFCVNhdmUgbGlzdCBvZiBmaWxlcyB3aXRoIGluY29ycmVjdCBjb250ZXh0IgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktdnYJU2hvdyBjaGFuZ2VkIGxhYmVscyIKKy8vdXNhZ2U6ICAgICAiXG4JLUYJRm9yY2UgcmVzZXQgb2YgY29udGV4dCB0byBtYXRjaCBmaWxlX2NvbnRleHQiCisvL3VzYWdlOiAgICAgIlxuCQlmb3IgY3VzdG9taXphYmxlIGZpbGVzLCBvciB0aGUgdXNlciBzZWN0aW9uLCIKKy8vdXNhZ2U6ICAgICAiXG4JCWlmIGl0IGhhcyBjaGFuZ2VkIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpZiBFTkFCTEVfRkVBVFVSRV9TRVRGSUxFU19DSEVDS19PUFRJT04KKyNpbmNsdWRlIDxzZXBvbC9zZXBvbC5oPgorI2VuZGlmCisKKyNkZWZpbmUgTUFYX0VYQ0xVREVTIDUwCisKK3N0cnVjdCBlZGlyIHsKKwljaGFyICpkaXJlY3Rvcnk7CisJc2l6ZV90IHNpemU7Cit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJRklMRSAqb3V0ZmlsZTsKKwljaGFyICpwb2xpY3lmaWxlOworCWNoYXIgKnJvb3RwYXRoOworCWludCByb290cGF0aGxlbjsKKwl1bnNpZ25lZCBjb3VudDsKKwlpbnQgZXhjbHVkZUN0cjsKKwlpbnQgZXJyb3JzOworCWludCB2ZXJib3NlOyAvKiBnZXRvcHQzMiB1c2VzIGl0LCBoYXMgdG8gYmUgaW50ICovCisJc21hbGxpbnQgcmVjdXJzZTsgLyogUmVjdXJzaXZlIGRlc2NlbnQgKi8KKwlzbWFsbGludCBmb2xsb3dfbW91bnRzOworCS8qIEJlaGF2aW9yIGZsYWdzIGRldGVybWluZWQgYmFzZWQgb24gc2V0ZmlsZXMgdnMuIHJlc3RvcmVjb24gKi8KKwlzbWFsbGludCBleHBhbmRfcmVhbHBhdGg7ICAvKiBFeHBhbmQgcGF0aHMgdmlhIHJlYWxwYXRoICovCisJc21hbGxpbnQgYWJvcnRfb25fZXJyb3I7IC8qIEFib3J0IHRoZSBmaWxlIHRyZWUgd2FsayB1cG9uIGFuIGVycm9yICovCisJaW50IGFkZF9hc3NvYzsgLyogVHJhY2sgaW5vZGUgYXNzb2NpYXRpb25zIGZvciBjb25mbGljdCBkZXRlY3Rpb24gKi8KKwlpbnQgbWF0Y2hwYXRoY29uX2ZsYWdzOyAvKiBGbGFncyB0byBtYXRjaHBhdGhjb24gKi8KKwlkZXZfdCBkZXZfaWQ7IC8qIERldmljZSBpZCB3aGVyZSB0YXJnZXQgZmlsZSBleGlzdHMgKi8KKwlpbnQgbmVycjsKKwlzdHJ1Y3QgZWRpciBleGNsdWRlQXJyYXlbTUFYX0VYQ0xVREVTXTsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCit2b2lkIEJVR19zZXRmaWxlc19nbG9iYWxzX3Rvb19iaWcodm9pZCk7CisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCWlmIChzaXplb2YoRykgPiBDT01NT05fQlVGU0laRSkgXAorCQlCVUdfc2V0ZmlsZXNfZ2xvYmFsc190b29fYmlnKCk7IFwKKwkvKiBtZW1zZXQoJkcsIDAsIHNpemVvZihHKSk7IC0gYWxyZWFkeSBpcyAqLyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBvdXRmaWxlICAgICAgICAgICAgKEcub3V0ZmlsZSAgICAgICAgICAgKQorI2RlZmluZSBwb2xpY3lmaWxlICAgICAgICAgKEcucG9saWN5ZmlsZSAgICAgICAgKQorI2RlZmluZSByb290cGF0aCAgICAgICAgICAgKEcucm9vdHBhdGggICAgICAgICAgKQorI2RlZmluZSByb290cGF0aGxlbiAgICAgICAgKEcucm9vdHBhdGhsZW4gICAgICAgKQorI2RlZmluZSBjb3VudCAgICAgICAgICAgICAgKEcuY291bnQgICAgICAgICAgICAgKQorI2RlZmluZSBleGNsdWRlQ3RyICAgICAgICAgKEcuZXhjbHVkZUN0ciAgICAgICAgKQorI2RlZmluZSBlcnJvcnMgICAgICAgICAgICAgKEcuZXJyb3JzICAgICAgICAgICAgKQorI2RlZmluZSB2ZXJib3NlICAgICAgICAgICAgKEcudmVyYm9zZSAgICAgICAgICAgKQorI2RlZmluZSByZWN1cnNlICAgICAgICAgICAgKEcucmVjdXJzZSAgICAgICAgICAgKQorI2RlZmluZSBmb2xsb3dfbW91bnRzICAgICAgKEcuZm9sbG93X21vdW50cyAgICAgKQorI2RlZmluZSBleHBhbmRfcmVhbHBhdGggICAgKEcuZXhwYW5kX3JlYWxwYXRoICAgKQorI2RlZmluZSBhYm9ydF9vbl9lcnJvciAgICAgKEcuYWJvcnRfb25fZXJyb3IgICAgKQorI2RlZmluZSBhZGRfYXNzb2MgICAgICAgICAgKEcuYWRkX2Fzc29jICAgICAgICAgKQorI2RlZmluZSBtYXRjaHBhdGhjb25fZmxhZ3MgKEcubWF0Y2hwYXRoY29uX2ZsYWdzKQorI2RlZmluZSBkZXZfaWQgICAgICAgICAgICAgKEcuZGV2X2lkICAgICAgICAgICAgKQorI2RlZmluZSBuZXJyICAgICAgICAgICAgICAgKEcubmVyciAgICAgICAgICAgICAgKQorI2RlZmluZSBleGNsdWRlQXJyYXkgICAgICAgKEcuZXhjbHVkZUFycmF5ICAgICAgKQorCisvKiBNdXN0IG1hdGNoIGdldG9wdDMyIHN0cmluZyEgKi8KK2VudW0geworCU9QVF9kID0gKDEgPDwgMCksCisJT1BUX2UgPSAoMSA8PCAxKSwKKwlPUFRfZiA9ICgxIDw8IDIpLAorCU9QVF9pID0gKDEgPDwgMyksCisJT1BUX2wgPSAoMSA8PCA0KSwKKwlPUFRfbiA9ICgxIDw8IDUpLAorCU9QVF9wID0gKDEgPDwgNiksCisJT1BUX3EgPSAoMSA8PCA3KSwKKwlPUFRfciA9ICgxIDw8IDgpLAorCU9QVF9zID0gKDEgPDwgOSksCisJT1BUX3YgPSAoMSA8PCAxMCksCisJT1BUX28gPSAoMSA8PCAxMSksCisJT1BUX0YgPSAoMSA8PCAxMiksCisJT1BUX1cgPSAoMSA8PCAxMyksCisJT1BUX2MgPSAoMSA8PCAxNCksIC8qIGMgb25seSBmb3Igc2V0ZmlsZXMgKi8KKwlPUFRfUiA9ICgxIDw8IDE0KSwgLyogUiBvbmx5IGZvciByZXN0b3JlY29uICovCit9OworI2RlZmluZSBGTEFHX2RfZGVidWcgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9kKQorI2RlZmluZSBGTEFHX2UgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9lKQorI2RlZmluZSBGTEFHX2YgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9mKQorI2RlZmluZSBGTEFHX2lfaWdub3JlX2Vub2VudCAob3B0aW9uX21hc2szMiAmIE9QVF9pKQorI2RlZmluZSBGTEFHX2xfdGFrZV9sb2cgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9sKQorI2RlZmluZSBGTEFHX25fZHJ5X3J1biAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9uKQorI2RlZmluZSBGTEFHX3BfcHJvZ3Jlc3MgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9wKQorI2RlZmluZSBGTEFHX3FfcXVpZXQgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9xKQorI2RlZmluZSBGTEFHX3IgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9yKQorI2RlZmluZSBGTEFHX3MgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9zKQorI2RlZmluZSBGTEFHX3YgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF92KQorI2RlZmluZSBGTEFHX28gICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9vKQorI2RlZmluZSBGTEFHX0ZfZm9yY2UgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9GKQorI2RlZmluZSBGTEFHX1dfd2Fybl9ub19tYXRjaCAob3B0aW9uX21hc2szMiAmIE9QVF9XKQorI2RlZmluZSBGTEFHX2MgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9jKQorI2RlZmluZSBGTEFHX1IgICAgICAgICAgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9SKQorCisKK3N0YXRpYyB2b2lkIHFwcmludGYoY29uc3QgY2hhciAqZm10IFVOVVNFRF9QQVJBTSwgLi4uKQoreworCS8qIHF1aWV0LCBkbyBub3RoaW5nICovCit9CisKK3N0YXRpYyB2b2lkIGluY19lcnIodm9pZCkKK3sKKwluZXJyKys7CisJaWYgKG5lcnIgPiA5ICYmICFGTEFHX2RfZGVidWcpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImV4aXRpbmcgYWZ0ZXIgMTAgZXJyb3JzIik7CisJfQorfQorCitzdGF0aWMgdm9pZCBhZGRfZXhjbHVkZShjb25zdCBjaGFyICpkaXJlY3RvcnkpCit7CisJc3RydWN0IHN0YXQgc2I7CisJc2l6ZV90IGxlbjsKKworCWlmIChkaXJlY3RvcnkgPT0gTlVMTCB8fCBkaXJlY3RvcnlbMF0gIT0gJy8nKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJmdWxsIHBhdGggcmVxdWlyZWQgZm9yIGV4Y2x1ZGU6ICVzIiwgZGlyZWN0b3J5KTsKKwl9CisJaWYgKGxzdGF0KGRpcmVjdG9yeSwgJnNiKSkgeworCQliYl9lcnJvcl9tc2coImRpcmVjdG9yeSBcIiVzXCIgbm90IGZvdW5kLCBpZ25vcmluZyIsIGRpcmVjdG9yeSk7CisJCXJldHVybjsKKwl9CisJaWYgKChzYi5zdF9tb2RlICYgU19JRkRJUikgPT0gMCkgeworCQliYl9lcnJvcl9tc2coIlwiJXNcIiBpcyBub3QgYSBkaXJlY3Rvcnk6IG1vZGUgJW8sIGlnbm9yaW5nIiwKKwkJCWRpcmVjdG9yeSwgc2Iuc3RfbW9kZSk7CisJCXJldHVybjsKKwl9CisJaWYgKGV4Y2x1ZGVDdHIgPT0gTUFYX0VYQ0xVREVTKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtYXhpbXVtIGV4Y2x1ZGVzICVkIGV4Y2VlZGVkIiwgTUFYX0VYQ0xVREVTKTsKKwl9CisKKwlsZW4gPSBzdHJsZW4oZGlyZWN0b3J5KTsKKwl3aGlsZSAobGVuID4gMSAmJiBkaXJlY3RvcnlbbGVuIC0gMV0gPT0gJy8nKSB7CisJCWxlbi0tOworCX0KKwlleGNsdWRlQXJyYXlbZXhjbHVkZUN0cl0uZGlyZWN0b3J5ID0geHN0cm5kdXAoZGlyZWN0b3J5LCBsZW4pOworCWV4Y2x1ZGVBcnJheVtleGNsdWRlQ3RyKytdLnNpemUgPSBsZW47Cit9CisKK3N0YXRpYyBib29sIGV4Y2x1ZGUoY29uc3QgY2hhciAqZmlsZSkKK3sKKwlpbnQgaSA9IDA7CisJZm9yIChpID0gMDsgaSA8IGV4Y2x1ZGVDdHI7IGkrKykgeworCQlpZiAoc3RybmNtcChmaWxlLCBleGNsdWRlQXJyYXlbaV0uZGlyZWN0b3J5LAorCQkJCQlleGNsdWRlQXJyYXlbaV0uc2l6ZSkgPT0gMCkgeworCQkJaWYgKGZpbGVbZXhjbHVkZUFycmF5W2ldLnNpemVdID09ICdcMCcKKwkJCSB8fCBmaWxlW2V4Y2x1ZGVBcnJheVtpXS5zaXplXSA9PSAnLycpIHsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBtYXRjaChjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgc3RhdCAqc2IsIGNoYXIgKipjb24pCit7CisJaW50IHJldDsKKwljaGFyIHBhdGhbUEFUSF9NQVggKyAxXTsKKwljaGFyICp0bXBfcGF0aCA9IHhzdHJkdXAobmFtZSk7CisKKwlpZiAoZXhjbHVkZUN0ciA+IDAgJiYgZXhjbHVkZShuYW1lKSkgeworCQlnb3RvIGVycjsKKwl9CisJcmV0ID0gbHN0YXQobmFtZSwgc2IpOworCWlmIChyZXQpIHsKKwkJaWYgKEZMQUdfaV9pZ25vcmVfZW5vZW50ICYmIGVycm5vID09IEVOT0VOVCkgeworCQkJZnJlZSh0bXBfcGF0aCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQliYl9lcnJvcl9tc2coInN0YXQoJXMpIiwgbmFtZSk7CisJCWdvdG8gZXJyOworCX0KKworCWlmIChleHBhbmRfcmVhbHBhdGgpIHsKKwkJaWYgKFNfSVNMTksoc2ItPnN0X21vZGUpKSB7CisJCQljaGFyICpwID0gTlVMTDsKKwkJCWNoYXIgKmZpbGVfc2VwOworCisJCQlzaXplX3QgbGVuID0gMDsKKworCQkJaWYgKHZlcmJvc2UgPiAxKQorCQkJCWJiX2Vycm9yX21zZygid2FybmluZyEgJXMgcmVmZXJzIHRvIGEgc3ltYm9saWMgbGluaywgbm90IGZvbGxvd2luZyBsYXN0IGNvbXBvbmVudCIsIG5hbWUpOworCisJCQlmaWxlX3NlcCA9IHN0cnJjaHIodG1wX3BhdGgsICcvJyk7CisJCQlpZiAoZmlsZV9zZXAgPT0gdG1wX3BhdGgpIHsKKwkJCQlmaWxlX3NlcCsrOworCQkJCXBhdGhbMF0gPSAnXDAnOworCQkJCXAgPSBwYXRoOworCQkJfSBlbHNlIGlmIChmaWxlX3NlcCkgeworCQkJCSpmaWxlX3NlcCsrID0gJ1wwJzsKKwkJCQlwID0gcmVhbHBhdGgodG1wX3BhdGgsIHBhdGgpOworCQkJfSBlbHNlIHsKKwkJCQlmaWxlX3NlcCA9IHRtcF9wYXRoOworCQkJCXAgPSByZWFscGF0aCgiLi8iLCBwYXRoKTsKKwkJCX0KKwkJCWlmIChwKQorCQkJCWxlbiA9IHN0cmxlbihwKTsKKwkJCWlmICghcCB8fCBsZW4gKyBzdHJsZW4oZmlsZV9zZXApICsgMiA+IFBBVEhfTUFYKSB7CisJCQkJYmJfcGVycm9yX21zZygicmVhbHBhdGgoJXMpIGZhaWxlZCIsIG5hbWUpOworCQkJCWdvdG8gZXJyOworCQkJfQorCQkJcCArPSBsZW47CisJCQkvKiBlbnN1cmUgdHJhaWxpbmcgc2xhc2ggb2YgZGlyZWN0b3J5IG5hbWUgKi8KKwkJCWlmIChsZW4gPT0gMCB8fCBwWy0xXSAhPSAnLycpIHsKKwkJCQkqcCsrID0gJy8nOworCQkJfQorCQkJc3RyY3B5KHAsIGZpbGVfc2VwKTsKKwkJCW5hbWUgPSBwYXRoOworCQkJaWYgKGV4Y2x1ZGVDdHIgPiAwICYmIGV4Y2x1ZGUobmFtZSkpCisJCQkJZ290byBlcnI7CisJCX0gZWxzZSB7CisJCQljaGFyICpwOworCQkJcCA9IHJlYWxwYXRoKG5hbWUsIHBhdGgpOworCQkJaWYgKCFwKSB7CisJCQkJYmJfcGVycm9yX21zZygicmVhbHBhdGgoJXMpIiwgbmFtZSk7CisJCQkJZ290byBlcnI7CisJCQl9CisJCQluYW1lID0gcDsKKwkJCWlmIChleGNsdWRlQ3RyID4gMCAmJiBleGNsdWRlKG5hbWUpKQorCQkJCWdvdG8gZXJyOworCQl9CisJfQorCisJLyogbmFtZSB3aWxsIGJlIHdoYXQgaXMgbWF0Y2hlZCBpbiB0aGUgcG9saWN5ICovCisJaWYgKE5VTEwgIT0gcm9vdHBhdGgpIHsKKwkJaWYgKDAgIT0gc3RybmNtcChyb290cGF0aCwgbmFtZSwgcm9vdHBhdGhsZW4pKSB7CisJCQliYl9lcnJvcl9tc2coIiVzIGlzIG5vdCBsb2NhdGVkIGluICVzIiwKKwkJCQluYW1lLCByb290cGF0aCk7CisJCQlnb3RvIGVycjsKKwkJfQorCQluYW1lICs9IHJvb3RwYXRobGVuOworCX0KKworCWZyZWUodG1wX3BhdGgpOworCWlmIChyb290cGF0aCAhPSBOVUxMICYmIG5hbWVbMF0gPT0gJ1wwJykKKwkJLyogdGhpcyBpcyBhY3R1YWxseSB0aGUgcm9vdCBkaXIgb2YgdGhlIGFsdCByb290ICovCisJCXJldHVybiBtYXRjaHBhdGhjb25faW5kZXgoIi8iLCBzYi0+c3RfbW9kZSwgY29uKTsKKwlyZXR1cm4gbWF0Y2hwYXRoY29uX2luZGV4KG5hbWUsIHNiLT5zdF9tb2RlLCBjb24pOworIGVycjoKKwlmcmVlKHRtcF9wYXRoKTsKKwlyZXR1cm4gLTE7Cit9CisKKy8qIENvbXBhcmUgdHdvIGNvbnRleHRzIHRvIHNlZSBpZiB0aGVpciBkaWZmZXJlbmNlcyBhcmUgInNpZ25pZmljYW50IiwKKyAqIG9yIHdoZXRoZXIgdGhlIG9ubHkgZGlmZmVyZW5jZSBpcyBpbiB0aGUgdXNlci4gKi8KK3N0YXRpYyBib29sIG9ubHlfY2hhbmdlZF91c2VyKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIpCit7CisJaWYgKEZMQUdfRl9mb3JjZSkKKwkJcmV0dXJuIDA7CisJaWYgKCFhIHx8ICFiKQorCQlyZXR1cm4gMDsKKwlhID0gc3RyY2hyKGEsICc6Jyk7IC8qIFJlc3Qgb2YgdGhlIGNvbnRleHQgYWZ0ZXIgdGhlIHVzZXIgKi8KKwliID0gc3RyY2hyKGIsICc6Jyk7CisJaWYgKCFhIHx8ICFiKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gKHN0cmNtcChhLCBiKSA9PSAwKTsKK30KKworc3RhdGljIGludCByZXN0b3JlKGNvbnN0IGNoYXIgKmZpbGUpCit7CisJY2hhciAqbXlfZmlsZTsKKwlzdHJ1Y3Qgc3RhdCBteV9zYjsKKwlpbnQgaSwgaiwgcmV0OworCWNoYXIgKmNvbnRleHQgPSBOVUxMOworCWNoYXIgKm5ld2NvbiA9IE5VTEw7CisJYm9vbCB1c2VyX29ubHlfY2hhbmdlZCA9IDA7CisJaW50IHJldHZhbCA9IDA7CisKKwlteV9maWxlID0gYmJfc2ltcGxpZnlfcGF0aChmaWxlKTsKKworCWkgPSBtYXRjaChteV9maWxlLCAmbXlfc2IsICZuZXdjb24pOworCisJaWYgKGkgPCAwKSAvKiBObyBtYXRjaGluZyBzcGVjaWZpY2F0aW9uLiAqLworCQlnb3RvIG91dDsKKworCWlmIChGTEFHX3BfcHJvZ3Jlc3MpIHsKKwkJY291bnQrKzsKKwkJaWYgKGNvdW50ICUgMHg0MDAgPT0gMCkgeyAvKiBldmVyeSAxMDI0IHRpbWVzICovCisJCQljb3VudCA9IChjb3VudCAlICg4MCoweDQwMCkpOworCQkJaWYgKGNvdW50ID09IDApCisJCQkJYmJfcHV0Y2hhcignXG4nKTsKKwkJCWJiX3B1dGNoYXIoJyonKTsKKwkJCWZmbHVzaF9hbGwoKTsKKwkJfQorCX0KKworCS8qCisJICogVHJ5IHRvIGFkZCBhbiBhc3NvY2lhdGlvbiBiZXR3ZWVuIHRoaXMgaW5vZGUgYW5kCisJICogdGhpcyBzcGVjaWZpY2F0aW9uLiBJZiB0aGVyZSBpcyBhbHJlYWR5IGFuIGFzc29jaWF0aW9uCisJICogZm9yIHRoaXMgaW5vZGUgYW5kIGl0IGNvbmZsaWN0cyB3aXRoIHRoaXMgc3BlY2lmaWNhdGlvbiwKKwkgKiB0aGVuIHVzZSB0aGUgbGFzdCBtYXRjaGluZyBzcGVjaWZpY2F0aW9uLgorCSAqLworCWlmIChhZGRfYXNzb2MpIHsKKwkJaiA9IG1hdGNocGF0aGNvbl9maWxlc3BlY19hZGQobXlfc2Iuc3RfaW5vLCBpLCBteV9maWxlKTsKKwkJaWYgKGogPCAwKQorCQkJZ290byBlcnI7CisKKwkJaWYgKGogIT0gaSkgeworCQkJLyogVGhlcmUgd2FzIGFscmVhZHkgYW4gYXNzb2NpYXRpb24gYW5kIGl0IHRvb2sgcHJlY2VkZW5jZS4gKi8KKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKEZMQUdfZF9kZWJ1ZykKKwkJcHJpbnRmKCIlczogJXMgbWF0Y2hlZCBieSAlc1xuIiwgYXBwbGV0X25hbWUsIG15X2ZpbGUsIG5ld2Nvbik7CisKKwkvKiBHZXQgdGhlIGN1cnJlbnQgY29udGV4dCBvZiB0aGUgZmlsZS4gKi8KKwlyZXQgPSBsZ2V0ZmlsZWNvbl9yYXcobXlfZmlsZSwgJmNvbnRleHQpOworCWlmIChyZXQgPCAwKSB7CisJCWlmIChlcnJubyA9PSBFTk9EQVRBKSB7CisJCQljb250ZXh0ID0gTlVMTDsgLyogcGFyYW5vaWEgKi8KKwkJfSBlbHNlIHsKKwkJCWJiX3BlcnJvcl9tc2coImxnZXRmaWxlY29uX3JhdyBvbiAlcyIsIG15X2ZpbGUpOworCQkJZ290byBlcnI7CisJCX0KKwkJdXNlcl9vbmx5X2NoYW5nZWQgPSAwOworCX0gZWxzZQorCQl1c2VyX29ubHlfY2hhbmdlZCA9IG9ubHlfY2hhbmdlZF91c2VyKGNvbnRleHQsIG5ld2Nvbik7CisKKwkvKgorCSAqIERvIG5vdCByZWxhYmVsIHRoZSBmaWxlIGlmIHRoZSBtYXRjaGluZyBzcGVjaWZpY2F0aW9uIGlzCisJICogPDxub25lPj4gb3IgdGhlIGZpbGUgaXMgYWxyZWFkeSBsYWJlbGVkIGFjY29yZGluZyB0byB0aGUKKwkgKiBzcGVjaWZpY2F0aW9uLgorCSAqLworCWlmICgoc3RyY21wKG5ld2NvbiwgIjw8bm9uZT4+IikgPT0gMCkKKwkgfHwgKGNvbnRleHQgJiYgKHN0cmNtcChjb250ZXh0LCBuZXdjb24pID09IDApICYmICFGTEFHX0ZfZm9yY2UpKSB7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghRkxBR19GX2ZvcmNlICYmIGNvbnRleHQgJiYgKGlzX2NvbnRleHRfY3VzdG9taXphYmxlKGNvbnRleHQpID4gMCkpIHsKKwkJaWYgKHZlcmJvc2UgPiAxKSB7CisJCQliYl9lcnJvcl9tc2coInNraXBwaW5nICVzLiAlcyBpcyBjdXN0b21pemFibGVfdHlwZXMiLAorCQkJCW15X2ZpbGUsIGNvbnRleHQpOworCQl9CisJCWdvdG8gb3V0OworCX0KKworCWlmICh2ZXJib3NlKSB7CisJCS8qIElmIHdlJ3JlIGp1c3QgZG9pbmcgIi12IiwgdHJpbSBvdXQgYW55IHJlbGFiZWxzIHdoZXJlCisJCSAqIHRoZSB1c2VyIGhhcyBjaGFuZ2VkIGJ1dCB0aGUgcm9sZSBhbmQgdHlwZSBhcmUgdGhlCisJCSAqIHNhbWUuICBGb3IgIi12diIsIGVtaXQgZXZlcnl0aGluZy4gKi8KKwkJaWYgKHZlcmJvc2UgPiAxIHx8ICF1c2VyX29ubHlfY2hhbmdlZCkgeworCQkJYmJfaW5mb19tc2coIiVzOiByZXNldCAlcyBjb250ZXh0ICVzLT4lcyIsCisJCQkJYXBwbGV0X25hbWUsIG15X2ZpbGUsIGNvbnRleHQgPyBjb250ZXh0IDogIiIsIG5ld2Nvbik7CisJCX0KKwl9CisKKwlpZiAoRkxBR19sX3Rha2VfbG9nICYmICF1c2VyX29ubHlfY2hhbmdlZCkgeworCQlpZiAoY29udGV4dCkKKwkJCWJiX2luZm9fbXNnKCJyZWxhYmVsaW5nICVzIGZyb20gJXMgdG8gJXMiLCBteV9maWxlLCBjb250ZXh0LCBuZXdjb24pOworCQllbHNlCisJCQliYl9pbmZvX21zZygibGFiZWxpbmcgJXMgdG8gJXMiLCBteV9maWxlLCBuZXdjb24pOworCX0KKworCWlmIChvdXRmaWxlICYmICF1c2VyX29ubHlfY2hhbmdlZCkKKwkJZnByaW50ZihvdXRmaWxlLCAiJXNcbiIsIG15X2ZpbGUpOworCisJLyoKKwkgKiBEbyBub3QgcmVsYWJlbCB0aGUgZmlsZSBpZiAtbiB3YXMgdXNlZC4KKwkgKi8KKwlpZiAoRkxBR19uX2RyeV9ydW4gfHwgdXNlcl9vbmx5X2NoYW5nZWQpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBSZWxhYmVsIHRoZSBmaWxlIHRvIHRoZSBzcGVjaWZpZWQgY29udGV4dC4KKwkgKi8KKwlyZXQgPSBsc2V0ZmlsZWNvbihteV9maWxlLCBuZXdjb24pOworCWlmIChyZXQpIHsKKwkJYmJfcGVycm9yX21zZygibHNldGZpbGVjb25vbiglcywlcykiLCBteV9maWxlLCBuZXdjb24pOworCQlnb3RvIGVycjsKKwl9CisKKyBvdXQ6CisJZnJlZWNvbihjb250ZXh0KTsKKwlmcmVlY29uKG5ld2Nvbik7CisJZnJlZShteV9maWxlKTsKKwlyZXR1cm4gcmV0dmFsOworIGVycjoKKwlyZXR2YWwtLTsgLyogLTEgKi8KKwlnb3RvIG91dDsKK30KKworLyoKKyAqIEFwcGx5IHRoZSBsYXN0IG1hdGNoaW5nIHNwZWNpZmljYXRpb24gdG8gYSBmaWxlLgorICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYnkgcmVjdXJzaXZlX2FjdGlvbiBvbiBlYWNoIGZpbGUgZHVyaW5nCisgKiB0aGUgZGlyZWN0b3J5IHRyYXZlcnNhbC4KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMgYXBwbHlfc3BlYygKKwkJY29uc3QgY2hhciAqZmlsZSwKKwkJc3RydWN0IHN0YXQgKnNiLAorCQl2b2lkICp1c2VyRGF0YSBVTlVTRURfUEFSQU0sCisJCWludCBkZXB0aCBVTlVTRURfUEFSQU0pCit7CisJaWYgKCFmb2xsb3dfbW91bnRzKSB7CisJCS8qIHNldGZpbGVzIGRvZXMgbm90IHByb2Nlc3MgYWNyb3NzIGRpZmZlcmVudCBtb3VudCBwb2ludHMgKi8KKwkJaWYgKHNiLT5zdF9kZXYgIT0gZGV2X2lkKSB7CisJCQlyZXR1cm4gU0tJUDsKKwkJfQorCX0KKwllcnJvcnMgfD0gcmVzdG9yZShmaWxlKTsKKwlpZiAoYWJvcnRfb25fZXJyb3IgJiYgZXJyb3JzKQorCQlyZXR1cm4gRkFMU0U7CisJcmV0dXJuIFRSVUU7Cit9CisKKworc3RhdGljIGludCBjYW5vbmNvbihjb25zdCBjaGFyICpwYXRoLCB1bnNpZ25lZCBsaW5lbm8sIGNoYXIgKipjb250ZXh0cCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBlcnJfbXNnW10gQUxJR04xID0gIiVzOiBsaW5lICV1IGhhcyBpbnZhbGlkIGNvbnRleHQgJXMiOworCisJY2hhciAqdG1wY29uOworCWNoYXIgKmNvbnRleHQgPSAqY29udGV4dHA7CisJaW50IGludmFsaWQgPSAwOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0VURklMRVNfQ0hFQ0tfT1BUSU9OCisJaWYgKHBvbGljeWZpbGUpIHsKKwkJaWYgKHNlcG9sX2NoZWNrX2NvbnRleHQoY29udGV4dCkgPj0gMCkKKwkJCXJldHVybiAwOworCQkvKiBFeGl0IGltbWVkaWF0ZWx5IGlmIHdlJ3JlIGluIGNoZWNraW5nIG1vZGUuICovCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKGVycl9tc2csIHBhdGgsIGxpbmVubywgY29udGV4dCk7CisJfQorI2VuZGlmCisKKwlpZiAoc2VjdXJpdHlfY2Fub25pY2FsaXplX2NvbnRleHRfcmF3KGNvbnRleHQsICZ0bXBjb24pIDwgMCkgeworCQlpZiAoZXJybm8gIT0gRU5PRU5UKSB7CisJCQlpbnZhbGlkID0gMTsKKwkJCWluY19lcnIoKTsKKwkJfQorCX0gZWxzZSB7CisJCWZyZWUoY29udGV4dCk7CisJCSpjb250ZXh0cCA9IHRtcGNvbjsKKwl9CisKKwlpZiAoaW52YWxpZCkgeworCQliYl9lcnJvcl9tc2coZXJyX21zZywgcGF0aCwgbGluZW5vLCBjb250ZXh0KTsKKwl9CisKKwlyZXR1cm4gaW52YWxpZDsKK30KKworc3RhdGljIGludCBwcm9jZXNzX29uZShjaGFyICpuYW1lKQoreworCXN0cnVjdCBzdGF0IHNiOworCWludCByYzsKKworCXJjID0gbHN0YXQobmFtZSwgJnNiKTsKKwlpZiAocmMgPCAwKSB7CisJCWlmIChGTEFHX2lfaWdub3JlX2Vub2VudCAmJiBlcnJubyA9PSBFTk9FTlQpCisJCQlyZXR1cm4gMDsKKwkJYmJfcGVycm9yX21zZygic3RhdCglcykiLCBuYW1lKTsKKwkJZ290byBlcnI7CisJfQorCWRldl9pZCA9IHNiLnN0X2RldjsKKworCWlmIChTX0lTRElSKHNiLnN0X21vZGUpICYmIHJlY3Vyc2UpIHsKKwkJaWYgKHJlY3Vyc2l2ZV9hY3Rpb24obmFtZSwKKwkJCQlBQ1RJT05fUkVDVVJTRSwKKwkJCQlhcHBseV9zcGVjLAorCQkJCWFwcGx5X3NwZWMsCisJCQkJTlVMTCwgMCkgIT0gVFJVRQorCQkpIHsKKwkJCWJiX2Vycm9yX21zZygiZXJyb3Igd2hpbGUgbGFiZWxpbmcgJXMiLCBuYW1lKTsKKwkJCWdvdG8gZXJyOworCQl9CisJfSBlbHNlIHsKKwkJcmMgPSByZXN0b3JlKG5hbWUpOworCQlpZiAocmMpCisJCQlnb3RvIGVycjsKKwl9CisKKyBvdXQ6CisJaWYgKGFkZF9hc3NvYykgeworCQlpZiAoRkxBR19xX3F1aWV0KQorCQkJc2V0X21hdGNocGF0aGNvbl9wcmludGYoJnFwcmludGYpOworCQltYXRjaHBhdGhjb25fZmlsZXNwZWNfZXZhbCgpOworCQlzZXRfbWF0Y2hwYXRoY29uX3ByaW50ZihOVUxMKTsKKwkJbWF0Y2hwYXRoY29uX2ZpbGVzcGVjX2Rlc3Ryb3koKTsKKwl9CisKKwlyZXR1cm4gcmM7CisKKyBlcnI6CisJcmMgPSAtMTsKKwlnb3RvIG91dDsKK30KKworaW50IHNldGZpbGVzX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZXRmaWxlc19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHN0YXQgc2I7CisJaW50IHJjLCBpID0gMDsKKwljb25zdCBjaGFyICppbnB1dF9maWxlbmFtZSA9IE5VTEw7CisJY2hhciAqYnVmID0gTlVMTDsKKwlzaXplX3QgYnVmX2xlbjsKKwlpbnQgZmxhZ3M7CisJbGxpc3RfdCAqZXhjbHVkZV9kaXIgPSBOVUxMOworCWNoYXIgKm91dF9maWxlbmFtZSA9IE5VTEw7CisKKwlJTklUX0coKTsKKworCWlmIChhcHBsZXRfbmFtZVswXSA9PSAncycpIHsgLyogInNldGZpbGVzIiAqLworCQkvKgorCQkgKiBzZXRmaWxlczoKKwkJICogUmVjdXJzaXZlIGRlc2NlbnQsCisJCSAqIERvZXMgbm90IGV4cGFuZCBwYXRocyB2aWEgcmVhbHBhdGgsCisJCSAqIEFib3J0cyBvbiBlcnJvcnMgZHVyaW5nIHRoZSBmaWxlIHRyZWUgd2FsaywKKwkJICogVHJ5IHRvIHRyYWNrIGlub2RlIGFzc29jaWF0aW9ucyBmb3IgY29uZmxpY3QgZGV0ZWN0aW9uLAorCQkgKiBEb2VzIG5vdCBmb2xsb3cgbW91bnRzLAorCQkgKiBWYWxpZGF0ZXMgYWxsIGZpbGUgY29udGV4dHMgYXQgaW5pdCB0aW1lLgorCQkgKi8KKwkJcmVjdXJzZSA9IDE7CisJCWFib3J0X29uX2Vycm9yID0gMTsKKwkJYWRkX2Fzc29jID0gMTsKKwkJLyogZm9sbG93X21vdW50cyA9IDA7IC0gYWxyZWFkeSBpcyAqLworCQltYXRjaHBhdGhjb25fZmxhZ3MgPSBNQVRDSFBBVEhDT05fVkFMSURBVEUgfCBNQVRDSFBBVEhDT05fTk9UUkFOUzsKKwl9IGVsc2UgeworCQkvKgorCQkgKiByZXN0b3JlY29uOgorCQkgKiBObyByZWN1cnNpdmUgZGVzY2VudCB1bmxlc3MgLXIvLVIsCisJCSAqIEV4cGFuZHMgcGF0aHMgdmlhIHJlYWxwYXRoLAorCQkgKiBEbyBub3QgYWJvcnQgb24gZXJyb3JzIGR1cmluZyB0aGUgZmlsZSB0cmVlIHdhbGssCisJCSAqIERvIG5vdCB0cnkgdG8gdHJhY2sgaW5vZGUgYXNzb2NpYXRpb25zIGZvciBjb25mbGljdCBkZXRlY3Rpb24sCisJCSAqIEZvbGxvd3MgbW91bnRzLAorCQkgKiBEb2VzIGxhenkgdmFsaWRhdGlvbiBvZiBjb250ZXh0cyB1cG9uIHVzZS4KKwkJICovCisJCWV4cGFuZF9yZWFscGF0aCA9IDE7CisJCWZvbGxvd19tb3VudHMgPSAxOworCQltYXRjaHBhdGhjb25fZmxhZ3MgPSBNQVRDSFBBVEhDT05fTk9UUkFOUzsKKwkJLyogcmVzdG9yZWNvbiBvbmx5ICovCisJCXNlbGludXhfb3JfZGllKCk7CisJfQorCisJc2V0X21hdGNocGF0aGNvbl9mbGFncyhtYXRjaHBhdGhjb25fZmxhZ3MpOworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiZTo6dnY6di0tcDpwLS12OnYtLXE6cS0tdiI7CisJLyogT3B0aW9uIG9yZGVyIG11c3QgbWF0Y2ggT1BUX3ggZGVmaW5pdGlvbnMhICovCisJaWYgKGFwcGxldF9uYW1lWzBdID09ICdyJykgeyAvKiByZXN0b3JlY29uICovCisJCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgImRlOmY6aWxucHFyc3ZvOkZXUiIsCisJCQkmZXhjbHVkZV9kaXIsICZpbnB1dF9maWxlbmFtZSwgJm91dF9maWxlbmFtZSwgJnZlcmJvc2UpOworCX0gZWxzZSB7IC8qIHNldGZpbGVzICovCisJCWZsYWdzID0gZ2V0b3B0MzIoYXJndiwgImRlOmY6aWxucHFyOnN2bzpGVyIKKwkJCQlJRl9GRUFUVVJFX1NFVEZJTEVTX0NIRUNLX09QVElPTigiYzoiKSwKKwkJCSZleGNsdWRlX2RpciwgJmlucHV0X2ZpbGVuYW1lLCAmcm9vdHBhdGgsICZvdXRfZmlsZW5hbWUsCisJCQkJSUZfRkVBVFVSRV9TRVRGSUxFU19DSEVDS19PUFRJT04oJnBvbGljeWZpbGUsKQorCQkJJnZlcmJvc2UpOworCX0KKwlhcmd2ICs9IG9wdGluZDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NFVEZJTEVTX0NIRUNLX09QVElPTgorCWlmICgoYXBwbGV0X25hbWVbMF0gPT0gJ3MnKSAmJiAoZmxhZ3MgJiBPUFRfYykpIHsKKwkJRklMRSAqcG9saWN5c3RyZWFtOworCisJCXBvbGljeXN0cmVhbSA9IHhmb3Blbl9mb3JfcmVhZChwb2xpY3lmaWxlKTsKKwkJaWYgKHNlcG9sX3NldF9wb2xpY3lkYl9mcm9tX2ZpbGUocG9saWN5c3RyZWFtKSA8IDApIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJzZXBvbF9zZXRfcG9saWN5ZGJfZnJvbV9maWxlIG9uICVzIiwgcG9saWN5ZmlsZSk7CisJCX0KKwkJZmNsb3NlKHBvbGljeXN0cmVhbSk7CisKKwkJLyogT25seSBwcm9jZXNzIHRoZSBzcGVjaWZpZWQgZmlsZV9jb250ZXh0cyBmaWxlLCBub3QKKwkJICogYW55IC5ob21lZGlycyBvciAubG9jYWwgZmlsZXMsIGFuZCBkbyBub3QgcGVyZm9ybQorCQkgKiBjb250ZXh0IHRyYW5zbGF0aW9ucy4gKi8KKwkJc2V0X21hdGNocGF0aGNvbl9mbGFncyhNQVRDSFBBVEhDT05fQkFTRU9OTFkgfAorCQkJCSAgICAgICBNQVRDSFBBVEhDT05fTk9UUkFOUyB8CisJCQkJICAgICAgIE1BVENIUEFUSENPTl9WQUxJREFURSk7CisJfQorI2VuZGlmCisKKwl3aGlsZSAoZXhjbHVkZV9kaXIpCisJCWFkZF9leGNsdWRlKGxsaXN0X3BvcCgmZXhjbHVkZV9kaXIpKTsKKworCWlmIChmbGFncyAmIE9QVF9vKSB7CisJCW91dGZpbGUgPSBzdGRvdXQ7CisJCWlmIChOT1RfTE9ORV9DSEFSKG91dF9maWxlbmFtZSwgJy0nKSkgeworCQkJb3V0ZmlsZSA9IHhmb3Blbl9mb3Jfd3JpdGUob3V0X2ZpbGVuYW1lKTsKKwkJfQorCX0KKwlpZiAoYXBwbGV0X25hbWVbMF0gPT0gJ3InKSB7IC8qIHJlc3RvcmVjb24gKi8KKwkJaWYgKGZsYWdzICYgKE9QVF9yIHwgT1BUX1IpKQorCQkJcmVjdXJzZSA9IDE7CisJfSBlbHNlIHsgLyogc2V0ZmlsZXMgKi8KKwkJaWYgKGZsYWdzICYgT1BUX3IpCisJCQlyb290cGF0aGxlbiA9IHN0cmxlbihyb290cGF0aCk7CisJfQorCWlmIChmbGFncyAmIE9QVF9zKSB7CisJCWlucHV0X2ZpbGVuYW1lID0gIi0iOworCQlhZGRfYXNzb2MgPSAwOworCX0KKworCWlmIChhcHBsZXRfbmFtZVswXSA9PSAncycpIHsgLyogc2V0ZmlsZXMgKi8KKwkJLyogVXNlIG91ciBvd24gaW52YWxpZCBjb250ZXh0IGNoZWNraW5nIGZ1bmN0aW9uIHNvIHRoYXQKKwkJICogd2UgY2FuIHN1cHBvcnQgZWl0aGVyIGNoZWNraW5nIGFnYWluc3QgdGhlIGFjdGl2ZSBwb2xpY3kgb3IKKwkJICogY2hlY2tpbmcgYWdhaW5zdCBhIGJpbmFyeSBwb2xpY3kgZmlsZS4gKi8KKwkJc2V0X21hdGNocGF0aGNvbl9jYW5vbmNvbigmY2Fub25jb24pOworCQlpZiAoIWFyZ3ZbMF0pCisJCQliYl9zaG93X3VzYWdlKCk7CisJCXhzdGF0KGFyZ3ZbMF0sICZzYik7CisJCWlmICghU19JU1JFRyhzYi5zdF9tb2RlKSkgeworCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInNwZWMgZmlsZSAlcyBpcyBub3QgYSByZWd1bGFyIGZpbGUiLCBhcmd2WzBdKTsKKwkJfQorCQkvKiBMb2FkIHRoZSBmaWxlIGNvbnRleHRzIGNvbmZpZ3VyYXRpb24gYW5kIGNoZWNrIGl0LiAqLworCQlyYyA9IG1hdGNocGF0aGNvbl9pbml0KGFyZ3ZbMF0pOworCQlpZiAocmMgPCAwKSB7CisJCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKGFyZ3ZbMF0pOworCQl9CisJCWlmIChuZXJyKQorCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQlhcmd2Kys7CisJfQorCisJaWYgKGlucHV0X2ZpbGVuYW1lKSB7CisJCXNzaXplX3QgbGVuOworCQlGSUxFICpmID0gc3RkaW47CisKKwkJaWYgKE5PVF9MT05FX0NIQVIoaW5wdXRfZmlsZW5hbWUsICctJykpCisJCQlmID0geGZvcGVuX2Zvcl9yZWFkKGlucHV0X2ZpbGVuYW1lKTsKKwkJd2hpbGUgKChsZW4gPSBnZXRsaW5lKCZidWYsICZidWZfbGVuLCBmKSkgPiAwKSB7CisJCQlidWZbbGVuIC0gMV0gPSAnXDAnOworCQkJZXJyb3JzIHw9IHByb2Nlc3Nfb25lKGJ1Zik7CisJCX0KKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZmNsb3NlX2lmX25vdF9zdGRpbihmKTsKKwl9IGVsc2UgeworCQlpZiAoIWFyZ3ZbMF0pCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWZvciAoaSA9IDA7IGFyZ3ZbaV07IGkrKykgeworCQkJZXJyb3JzIHw9IHByb2Nlc3Nfb25lKGFyZ3ZbaV0pOworCQl9CisJfQorCisJaWYgKEZMQUdfV193YXJuX25vX21hdGNoKQorCQltYXRjaHBhdGhjb25fY2hlY2ttYXRjaGVzKGFyZ3ZbMF0pOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQICYmIG91dGZpbGUpCisJCWZjbG9zZShvdXRmaWxlKTsKKworCXJldHVybiBlcnJvcnM7Cit9CmRpZmYgLS1naXQgYS9zZWxpbnV4L3NldHNlYm9vbC5jIGIvc2VsaW51eC9zZXRzZWJvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzY4MmU1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VsaW51eC9zZXRzZWJvb2wuYwpAQCAtMCwwICsxLDQxIEBACisvKgorICogc2V0c2Vib29sCisgKiBTaW1wbGUgc2V0c2Vib29sCisgKiBOT1RFOiAtUCBvcHRpb24gcmVxdWlyZXMgbGlic2VtYW5hZ2UsIHNvIHRoaXMgZmVhdHVyZSBpcworICogb21pdHRlZCBpbiB0aGlzIHZlcnNpb24KKyAqIFl1aWNoaSBOYWthbXVyYSA8eW5ha2FtQGhpdGFjaGlzb2Z0LmpwPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHNldHNlYm9vbF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiYm9vbGVhbiB2YWx1ZSIKKy8vdXNhZ2U6I2RlZmluZSBzZXRzZWJvb2xfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDaGFuZ2UgYm9vbGVhbiBzZXR0aW5nIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IHNldHNlYm9vbF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc2V0c2Vib29sX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKnA7CisJaW50IHZhbHVlOworCisJaWYgKGFyZ2MgIT0gMykKKwkJYmJfc2hvd191c2FnZSgpOworCisJcCA9IGFyZ3ZbMl07CisKKwlpZiAoTE9ORV9DSEFSKHAsICcxJykgfHwgc3RyY2FzZWNtcChwLCAidHJ1ZSIpID09IDAgfHwgc3RyY2FzZWNtcChwLCAib24iKSA9PSAwKSB7CisJCXZhbHVlID0gMTsKKwl9IGVsc2UgaWYgKExPTkVfQ0hBUihwLCAnMCcpIHx8IHN0cmNhc2VjbXAocCwgImZhbHNlIikgPT0gMCB8fCBzdHJjYXNlY21wKHAsICJvZmYiKSA9PSAwKSB7CisJCXZhbHVlID0gMDsKKwl9IGVsc2UgeworCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJaWYgKHNlY3VyaXR5X3NldF9ib29sZWFuKGFyZ3ZbMV0sIHZhbHVlKSA8IDApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBzZXQgYm9vbGVhbiIpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zaGVsbC9Db25maWcuc3JjIGIvc2hlbGwvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzFlNjJkCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDE0OSBAQAorIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiU2hlbGxzIgorCitJTlNFUlQKKworCitjaG9pY2UKKwlwcm9tcHQgIkNob29zZSB3aGljaCBzaGVsbCBpcyBhbGlhc2VkIHRvICdzaCcgbmFtZSIKKwlkZWZhdWx0IEZFQVRVUkVfU0hfSVNfQVNICisJaGVscAorCSAgQ2hvb3NlIHdoaWNoIHNoZWxsIHlvdSB3YW50IHRvIGJlIGV4ZWN1dGVkIGJ5ICdzaCcgYWxpYXMuCisJICBUaGUgYXNoIHNoZWxsIGlzIHRoZSBtb3N0IGJhc2ggY29tcGF0aWJsZSBhbmQgZnVsbCBmZWF0dXJlZCBvbmUuCisKKyMgbm90ZTogY2Fubm90IHVzZSAic2VsZWN0IEFTSCIgaGVyZSwgaXQgYnJlYWtzICJtYWtlIGFsbG5vY29uZmlnIgorY29uZmlnIEZFQVRVUkVfU0hfSVNfQVNICisJZGVwZW5kcyBvbiBBU0gKKwlib29sICJhc2giCisJZGVwZW5kcyBvbiAhTk9NTVUKKworY29uZmlnIEZFQVRVUkVfU0hfSVNfSFVTSAorCWRlcGVuZHMgb24gSFVTSAorCWJvb2wgImh1c2giCisKK2NvbmZpZyBGRUFUVVJFX1NIX0lTX05PTkUKKwlib29sICJub25lIgorCitlbmRjaG9pY2UKKworY2hvaWNlCisJcHJvbXB0ICJDaG9vc2Ugd2hpY2ggc2hlbGwgaXMgYWxpYXNlZCB0byAnYmFzaCcgbmFtZSIKKwlkZWZhdWx0IEZFQVRVUkVfQkFTSF9JU19OT05FCisJaGVscAorCSAgQ2hvb3NlIHdoaWNoIHNoZWxsIHlvdSB3YW50IHRvIGJlIGV4ZWN1dGVkIGJ5ICdiYXNoJyBhbGlhcy4KKwkgIFRoZSBhc2ggc2hlbGwgaXMgdGhlIG1vc3QgYmFzaCBjb21wYXRpYmxlIGFuZCBmdWxsIGZlYXR1cmVkIG9uZS4KKworCSAgTm90ZSB0aGF0IHNlbGVjdGluZyB0aGlzIG9wdGlvbiBkb2VzIG5vdCBzd2l0Y2ggb24gYW55IGJhc2gKKwkgIGNvbXBhdGliaWxpdHkgY29kZS4gSXQgbWVyZWx5IG1ha2VzIGl0IHBvc3NpYmxlIHRvIGluc3RhbGwKKwkgIC9iaW4vYmFzaCAoc3ltKWxpbmsgYW5kIHJ1biBzY3JpcHRzIHdoaWNoIHN0YXJ0IHdpdGgKKwkgICMhL2Jpbi9iYXNoIGxpbmUuCisKKwkgIE1hbnkgc3lzdGVtcyB1c2UgaXQgaW4gc2NyaXB0cyB3aGljaCB1c2UgYmFzaC1zcGVjaWZpYyBmZWF0dXJlcywKKwkgIGV2ZW4gc2ltcGxlIG9uZXMgbGlrZSAkUkFORE9NLiBXaXRob3V0IHRoaXMgb3B0aW9uLCBidXN5Ym94CisJICBjYW4ndCBiZSB1c2VkIGZvciBydW5uaW5nIHRoZW0gYmVjYXVzZSBpdCB3b24ndCByZWNvbmduaXplCisJICAiYmFzaCIgYXMgYSBzdXBwb3J0ZWQgYXBwbGV0IG5hbWUuCisKK2NvbmZpZyBGRUFUVVJFX0JBU0hfSVNfQVNICisJZGVwZW5kcyBvbiBBU0gKKwlib29sICJhc2giCisJZGVwZW5kcyBvbiAhTk9NTVUKKworY29uZmlnIEZFQVRVUkVfQkFTSF9JU19IVVNICisJZGVwZW5kcyBvbiBIVVNICisJYm9vbCAiaHVzaCIKKworY29uZmlnIEZFQVRVUkVfQkFTSF9JU19OT05FCisJYm9vbCAibm9uZSIKKworZW5kY2hvaWNlCisKKworY29uZmlnIFNIX01BVEhfU1VQUE9SVAorCWJvb2wgIlBPU0lYIG1hdGggc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEFTSCB8fCBIVVNICisJaGVscAorCSAgRW5hYmxlIG1hdGggc3VwcG9ydCBpbiB0aGUgc2hlbGwgdmlhICQoKC4uLikpIHN5bnRheC4KKworY29uZmlnIFNIX01BVEhfU1VQUE9SVF82NAorCWJvb2wgIkV4dGVuZCBQT1NJWCBtYXRoIHN1cHBvcnQgdG8gNjQgYml0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU0hfTUFUSF9TVVBQT1JUCisJaGVscAorCSAgRW5hYmxlIDY0LWJpdCBtYXRoIHN1cHBvcnQgaW4gdGhlIHNoZWxsLiBUaGlzIHdpbGwgbWFrZSB0aGUgc2hlbGwKKwkgIHNsaWdodGx5IGxhcmdlciwgYnV0IHdpbGwgYWxsb3cgY29tcHV0YXRpb24gd2l0aCB2ZXJ5IGxhcmdlIG51bWJlcnMuCisJICBUaGlzIGlzIG5vdCBpbiBQT1NJWCwgc28gZG8gbm90IHJlbHkgb24gdGhpcyBpbiBwb3J0YWJsZSBjb2RlLgorCitjb25maWcgRkVBVFVSRV9TSF9FWFRSQV9RVUlFVAorCWJvb2wgIkhpZGUgbWVzc2FnZSBvbiBpbnRlcmFjdGl2ZSBzaGVsbCBzdGFydHVwIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gSFVTSCB8fCBBU0gKKwloZWxwCisJICBSZW1vdmUgdGhlIGJ1c3lib3ggaW50cm9kdWN0aW9uIHdoZW4gc3RhcnRpbmcgYSBzaGVsbC4KKworY29uZmlnIEZFQVRVUkVfU0hfU1RBTkRBTE9ORQorCWJvb2wgIlN0YW5kYWxvbmUgc2hlbGwiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiAoSFVTSCB8fCBBU0gpICYmIEZFQVRVUkVfUFJFRkVSX0FQUExFVFMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBjYXVzZXMgYnVzeWJveCBzaGVsbHMgdG8gdXNlIGJ1c3lib3ggYXBwbGV0cworCSAgaW4gcHJlZmVyZW5jZSB0byBleGVjdXRhYmxlcyBpbiB0aGUgUEFUSCB3aGVuZXZlciBwb3NzaWJsZS4gRm9yCisJICBleGFtcGxlLCBlbnRlcmluZyB0aGUgY29tbWFuZCAnaWZjb25maWcnIGludG8gdGhlIHNoZWxsIHdvdWxkIGNhdXNlCisJICBidXN5Ym94IHRvIHVzZSB0aGUgaWZjb25maWcgYnVzeWJveCBhcHBsZXQuIFNwZWNpZnlpbmcgdGhlIGZ1bGx5CisJICBxdWFsaWZpZWQgZXhlY3V0YWJsZSBuYW1lLCBzdWNoIGFzICcvc2Jpbi9pZmNvbmZpZycgd2lsbCBzdGlsbAorCSAgZXhlY3V0ZSB0aGUgL3NiaW4vaWZjb25maWcgZXhlY3V0YWJsZSBvbiB0aGUgZmlsZXN5c3RlbS4gVGhpcyBvcHRpb24KKwkgIGlzIGdlbmVyYWxseSB1c2VkIHdoZW4gY3JlYXRpbmcgYSBzdGF0aWNhbGx5IGxpbmtlZCB2ZXJzaW9uIG9mIGJ1c3lib3gKKwkgIGZvciB1c2UgYXMgYSByZXNjdWUgc2hlbGwsIGluIHRoZSBldmVudCB0aGF0IHlvdSBzY3JldyB1cCB5b3VyIHN5c3RlbS4KKworCSAgVGhpcyBpcyBpbXBsZW1lbnRlZCBieSByZS1leGVjaW5nIC9wcm9jL3NlbGYvZXhlICh0eXBpY2FsbHkpCisJICB3aXRoIHJpZ2h0IHBhcmFtZXRlcnMuIFNvbWUgc2VsZWN0ZWQgYXBwbGV0cyAoIk5PRk9SSyIgYXBwbGV0cykKKwkgIGNhbiBldmVuIGJlIGV4ZWN1dGVkIHdpdGhvdXQgY3JlYXRpbmcgbmV3IHByb2Nlc3MuCisJICBJbnN0ZWFkLCBidXN5Ym94IHdpbGwgY2FsbCA8YXBwbGV0Pl9tYWluKCkgaW50ZXJuYWxseS4KKworCSAgSG93ZXZlciwgdGhpcyBjYXVzZXMgcHJvYmxlbXMgaW4gY2hyb290IGphaWxzIHdpdGhvdXQgbW91bnRlZCAvcHJvYworCSAgYW5kIHdpdGggcHMvdG9wIChjb21tYW5kIG5hbWUgY2FuIGJlIHNob3duIGFzICdleGUnIGZvciBhcHBsZXRzCisJICBzdGFydGVkIHRoaXMgd2F5KS4KKyMgdW50cnVlPworIwkgIE5vdGUgdGhhdCB0aGlzIHdpbGwgKmFsc28qIGNhdXNlIGFwcGxldHMgdG8gdGFrZSBwcmVjZWRlbmNlCisjCSAgb3ZlciBzaGVsbCBidWlsdGlucyBvZiB0aGUgc2FtZSBuYW1lLiBTbyB0dXJuaW5nIHRoaXMgb24gd2lsbAorIwkgIGVsaW1pbmF0ZSBhbnkgcGVyZm9ybWFuY2UgZ2FpbmVkIGJ5IHR1cm5pbmcgb24gdGhlIGJ1aWx0aW4gImVjaG8iCisjCSAgYW5kICJ0ZXN0IiBjb21tYW5kcyBpbiBhc2guCisjIHVudHJ1ZT8KKyMJICBOb3RlIHRoYXQgd2hlbiB1c2luZyB0aGlzIG9wdGlvbiwgdGhlIHNoZWxsIHdpbGwgYXR0ZW1wdCB0byBkaXJlY3RseQorIwkgIHJ1biAnL2Jpbi9idXN5Ym94Jy4gSWYgeW91IGRvIG5vdCBoYXZlIHRoZSBidXN5Ym94IGJpbmFyeSBzaXR0aW5nIGluCisjCSAgdGhhdCBleGFjdCBsb2NhdGlvbiB3aXRoIHRoYXQgZXhhY3QgbmFtZSwgdGhpcyBvcHRpb24gd2lsbCBub3Qgd29yayBhdAorIwkgIGFsbC4KKworY29uZmlnIEZFQVRVUkVfU0hfTk9GT1JLCisJYm9vbCAiUnVuICdub2ZvcmsnIGFwcGxldHMgZGlyZWN0bHkiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiAoSFVTSCB8fCBBU0gpICYmIEZFQVRVUkVfUFJFRkVSX0FQUExFVFMKKwloZWxwCisJICBUaGlzIG9wdGlvbiBjYXVzZXMgYnVzeWJveCBzaGVsbHMgdG8gbm90IGV4ZWN1dGUgdHlwaWNhbAorCSAgZm9yay9leGVjL3dhaXQgc2VxdWVuY2UsIGJ1dCBjYWxsIDxhcHBsZXQ+X21haW4gZGlyZWN0bHksCisJICBpZiBwb3NzaWJsZS4gKFNvbWV0aW1lcyBpdCBpcyBub3QgcG9zc2libGU6IGZvciBleGFtcGxlLAorCSAgdGhpcyBpcyBub3QgcG9zc2libGUgaW4gcGlwZXMpLgorCisJICBUaGlzIHdpbGwgYmUgZG9uZSBvbmx5IGZvciBzb21lIGFwcGxldHMgKHRob3NlIHdoaWNoIGFyZSBtYXJrZWQKKwkgIE5PRk9SSyBpbiBpbmNsdWRlL2FwcGxldHMuaCkuCisKKwkgIFRoaXMgbWF5IHNpZ25pZmljYW50bHkgc3BlZWQgdXAgc29tZSBzaGVsbCBzY3JpcHRzLgorCisJICBUaGlzIGZlYXR1cmUgaXMgcmVsYXRpdmVseSBuZXcuIFVzZSB3aXRoIGNhcmUuIFJlcG9ydCBidWdzCisJICB0byBwcm9qZWN0IG1haWxpbmcgbGlzdC4KKworY29uZmlnIEZFQVRVUkVfU0hfSElTVEZJTEVTSVpFCisJYm9vbCAiVXNlICRISVNURklMRVNJWkUiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIVVNIIHx8IEFTSAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIG1ha2VzIGJ1c3lib3ggc2hlbGxzIHRvIHVzZSAkSElTVEZJTEVTSVpFIHZhcmlhYmxlCisJICB0byBzZXQgc2hlbGwgaGlzdG9yeSBzaXplLiBOb3RlIHRoYXQgaXRzIG1heCB2YWx1ZSBpcyBjYXBwZWQKKwkgIGJ5ICJIaXN0b3J5IHNpemUiIHNldHRpbmcgaW4gbGlicmFyeSB0dW5pbmcgc2VjdGlvbi4KKworCitlbmRtZW51CmRpZmYgLS1naXQgYS9zaGVsbC9LYnVpbGQuc3JjIGIvc2hlbGwvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDBhZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDExIEBACisjIE1ha2VmaWxlIGZvciBidXN5Ym94CisjCisjIENvcHlyaWdodCAoQykgMTk5OS0yMDA1IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworbGliLXk6PQorCitJTlNFUlQKKworbGliLSQoQ09ORklHX1NIX01BVEhfU1VQUE9SVCkgKz0gbWF0aC5vCmRpZmYgLS1naXQgYS9zaGVsbC9SRUFETUUgYi9zaGVsbC9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE5ZjViNgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL1JFQURNRQpAQCAtMCwwICsxLDgyIEBACitodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5LworT3BlbiBHcm91cCBCYXNlIFNwZWNpZmljYXRpb25zIElzc3VlIDcKKworCitodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9WM19jaGFwMDEuaHRtbAorU2hlbGwgJiBVdGlsaXRpZXMKKworSXQgc2F5cyB0aGF0IGFueSBvZiB0aGUgc3RhbmRhcmQgdXRpbGl0aWVzIG1heSBiZSBpbXBsZW1lbnRlZAorYXMgYSByZWd1bGFyIHNoZWxsIGJ1aWx0LWluLiBJdCBnaXZlcyBhIGxpc3Qgb2YgdXRpbGl0aWVzIHdoaWNoCithcmUgdXN1YWxseSBpbXBsZW1lbnRlZCB0aGF0IHdheSAoYW5kIHNvbWUgb2YgdGhlbSBjYW4gb25seQorYmUgaW1wbGVtZW50ZWQgYXMgYnVpbHQtaW5zLCBsaWtlICJhbGlhcyIpOgorCithbGlhcworYmcKK2NkCitjb21tYW5kCitmYWxzZQorZmMKK2ZnCitnZXRvcHRzCitqb2JzCitraWxsCituZXdncnAKK3B3ZAorcmVhZAordHJ1ZQordW1hc2sKK3VuYWxpYXMKK3dhaXQKKworCitodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9WM19jaGFwMDIuaHRtbAorU2hlbGwgQ29tbWFuZCBMYW5ndWFnZQorCitJdCBzYXlzIHRoYXQgc2hlbGwgbXVzdCBpbXBsZW1lbnQgc3BlY2lhbCBidWlsdC1pbnMuIFNwZWNpYWwgYnVpbHQtaW5zCitkaWZmZXIgZnJvbSByZWd1bGFyIG9uZXMgYnkgdGhlIGZhY3QgdGhhdCB2YXJpYWJsZSBhc3NpZ25tZW50cworZG9uZSBvbiBzcGVjaWFsIGJ1aWx0aW4gYXJlICpQUkVTRVJWRUQqLiBUaGF0IGlzLAorCitWQVI9VkFMIHNwZWNpYWxfYnVpbHRpbjsgZWNobyAkVkFSCisKK3Nob3VsZCBwcmludCBWQUwuCisKKyhBbm90aGVyIGRpc3RpbmN0aW9uIGlzIHRoYXQgYW4gZXJyb3IgaW4gc3BlY2lhbCBidWlsdC1pbiBzaG91bGQKK2Fib3J0IHRoZSBzaGVsbCwgYnV0IHRoaXMgaXMgbm90IHN1Y2ggYSBjcml0aWNhbCBkaWZmZXJlbmNlLAorYW5kIG1vcmVvdmVyLCBhdCBsZWFzdCBiYXNoJ3MgInNldCIgZG9lcyBub3QgZm9sbG93IHRoaXMgcnVsZSwKK3doaWNoIGlzIGV2ZW4gY29kaWZpZWQgaW4gYXV0b2NvbmYgY29uZmlndXJlIGxvZ2ljIG5vdy4uLikKKworTGlzdCBvZiBzcGVjaWFsIGJ1aWx0aW5zOgorCisuIGZpbGUKKzogW2FyZ3VtZW50Li4uXQorYnJlYWsgW25dCitjb250aW51ZSBbbl0KK2V2YWwgW2FyZ3VtZW50Li4uXQorZXhlYyBbY29tbWFuZCBbYXJndW1lbnQuLi5dXQorZXhpdCBbbl0KK2V4cG9ydCBuYW1lWz13b3JkXS4uLgorZXhwb3J0IC1wCityZWFkb25seSBuYW1lWz13b3JkXS4uLgorcmVhZG9ubHkgLXAKK3JldHVybiBbbl0KK3NldCBbLWFiQ2VmaG1udXZ4XSBbLW8gb3B0aW9uXSBbYXJndW1lbnQuLi5dCitzZXQgWythYkNlZmhtbnV2eF0gWytvIG9wdGlvbl0gW2FyZ3VtZW50Li4uXQorc2V0IC0tIFthcmd1bWVudC4uLl0KK3NldCAtbworc2V0ICtvCitzaGlmdCBbbl0KK3RpbWVzCit0cmFwIG4gW2NvbmRpdGlvbi4uLl0KK3RyYXAgW2FjdGlvbiBjb25kaXRpb24uLi5dCit1bnNldCBbLWZ2XSBuYW1lLi4uCisKK0luIHByYWN0aWNlLCBubyBvbmUgdXNlcyB0aGlzIG9ic2N1cmUgZmVhdHVyZSAtIG5vbmUgb2YgdGhlc2UgYnVpbHRpbnMKK2dpdmVzIGFueSBzcGVjaWFsIHJlYXNvbnMgdG8gcGxheSBzdWNoIGRpcnR5IHRyaWNrcy4KKworSG93ZXZlci4gVGhpcyBzZWN0aW9uIGFsc28gc2F5cyB0aGF0ICpmdW5jdGlvbiBpbnZvY2F0aW9uKiBzaG91bGQgYWN0CitzaW1pbGFyIHRvIHNwZWNpYWwgYnVpbHQtaW4uIFRoYXQgaXMsIHZhcmlhYmxlIGFzc2lnbm1lbnRzCitkb25lIG9uIGZ1bmN0aW9uIGludm9jYXRpb24gc2hvdWxkIGJlIHByZXNlcnZlZCBhZnRlciBmdW5jdGlvbiBpbnZvY2F0aW9uLgorCitUaGlzIGlzIHNpZ25pZmljYW50OiBpdCBpcyBub3QgdW50aGlua2FibGUgdG8gd2FudCB0byBydW4gYSBmdW5jdGlvbgord2l0aCBzb21lIHZhcmlhYmxlcyBzZXQgdG8gc3BlY2lhbCB2YWx1ZXMuIEJ1dCBiZWNhdXNlIG9mIHRoZSBhYm92ZSwKK2l0IGRvZXMgbm90IHdvcms6IHZhcmlhYmxlIHdpbGwgImxlYWsiIG91dCBvZiB0aGUgZnVuY3Rpb24uCmRpZmYgLS1naXQgYS9zaGVsbC9SRUFETUUuam9iIGIvc2hlbGwvUkVBRE1FLmpvYgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWJhOTY1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvUkVBRE1FLmpvYgpAQCAtMCwwICsxLDMwNCBAQAorc3RyYWNlIG9mICJzbGVlcCAxIHwgc2xlZXAgMiIgYmVpbmcgcnVuIGZyb20gaW50ZXJhY3RpdmUgYmFzaCAzLjAKKworCitTeW5vcHNpczoKK29wZW4gL2Rldi90dHkgWywgaWYgZmFpbHMsIG9wZW4gdHR5bmFtZSgwKV07IGNsb3NlIC8qIGhlbHBzIHJlLWVzdGFibGlzaCBjdHR5ICovCitnZXQgY3VycmVudCBzaWduYWwgbWFzaworVENHRVRTIG9uIGZkIyAwCitUQ0dFVFMgb24gZmQjIDIgLyogTkI6IGlmIHJldHVybnMgRU5PVFRZICgyPi9kZXYvbnVsbCksIHNoIHNlZW1zIHRvIGRpc2FibGUgam9iIGNvbnRyb2wsCisgICAgICAgICAgICAgICAgICAgZG9lcyBub3Qgc2hvdyBwcm9tcHQsIGJ1dCBzdGlsbCBleGVjdXRlcyBjbWRzIGZyb20gZmQjIDAgKi8KK2luc3RhbGwgZGVmYXVsdCBoYW5kbGVycyBmb3IgQ0hMRCBRVUlUIFRFUk0KK2luc3RhbGwgY29tbW9uIGhhbmRsZXIgZm9yIEhVUCBJTlQgSUxMIFRSQVAgQUJSVCBGUEUgQlVTIFNFR1YgU1lTIFBJUEUgQUxSTSBURVJNIFhDUFUgWEZTWiBWVEFMUk0gVVNSMSBVU1IyCitpZ25vcmUgUVVJVAoraW5zdGFsbCBoYW5kbGVyIGZvciBJTlQKK2lnbm9yZSBURVJNCitpbnN0YWxsIGhhbmRsZXIgZm9yIElOVAoraWdub3JlIFRTVFAgVFRPVSBUVElOCitpbnN0YWxsIGhhbmRsZXIgZm9yIFdJTkNICitnZXQgcGlkLCBwcGlkCitibG9jayBhbGwgc2lnbmFscwordW5ibG9jayBhbGwgc2lnbmFscworZ2V0IG91ciBwcHJvY2VzcyBncm91cAorICAgIG1pbmlkb2M6CisgICAgRWFjaCBwcm9jZXNzIGdyb3VwIGlzIGEgbWVtYmVyIG9mIGEgc2Vzc2lvbiBhbmQgZWFjaCBwcm9jZXNzIGlzIGEgbWVtYmVyCisgICAgb2YgdGhlIHNlc3Npb24gb2Ygd2hpY2ggaXRzIHByb2Nlc3MgZ3JvdXAgaXMgYSBtZW1iZXIuCisgICAgUHJvY2VzcyBncm91cHMgYXJlIHVzZWQgZm9yIGRpc3RyaWJ1dGlvbiBvZiBzaWduYWxzLCBhbmQgYnkgdGVybWluYWxzCisgICAgdG8gYXJiaXRyYXRlIHJlcXVlc3RzIGZvciB0aGVpciBpbnB1dDogcHJvY2Vzc2VzIHRoYXQgaGF2ZSB0aGUgc2FtZQorICAgIHByb2Nlc3MgZ3JvdXAgYXMgdGhlIHRlcm1pbmFsIGFyZSBmb3JlZ3JvdW5kIGFuZCBtYXkgcmVhZCwgd2hpbGUgb3RoZXJzCisgICAgd2lsbCBibG9jayB3aXRoIGEgc2lnbmFsIGlmIHRoZXkgYXR0ZW1wdCB0byByZWFkLiAgVGhlc2UgY2FsbHMgYXJlIHRodXMgdXNlZAorICAgIGJ5IHByb2dyYW1zIChzaGVsbHMpIHRvIGNyZWF0ZSBwcm9jZXNzIGdyb3VwcyBpbiBpbXBsZW1lbnRpbmcgam9iIGNvbnRyb2wuCisgICAgVGhlIFRJT0NHUEdSUCBhbmQgVElPQ1NQR1JQIGNhbGxzIGRlc2NyaWJlZCBpbiB0ZXJtaW9zKDMpIGFyZSB1c2VkIHRvIGdldC9zZXQKKyAgICB0aGUgcHJvY2VzcyBncm91cCBvZiB0aGUgY29udHJvbCB0ZXJtaW5hbC4KKyAgICBJZiBhIHNlc3Npb24gaGFzIGEgY29udHJvbGxpbmcgdGVybWluYWwsIENMT0NBTCBpcyBub3Qgc2V0IGFuZCBhIGhhbmd1cCBvY2N1cnMsCisgICAgdGhlbiB0aGUgc2Vzc2lvbiBsZWFkZXIgaXMgc2VudCBhIFNJR0hVUC4gIElmIHRoZSBzZXNzaW9uIGxlYWRlciBleGl0cywKKyAgICB0aGUgU0lHSFVQIHNpZ25hbCB3aWxsIGJlIHNlbnQgdG8gZWFjaCBwcm9jZXNzIGluIHRoZSBmb3JlZ3JvdW5kIHByb2Nlc3MKKyAgICBncm91cCBvZiB0aGUgY29udHJvbGxpbmcgdGVybWluYWwuCisgICAgSWYgdGhlIGV4aXQgb2YgdGhlIHByb2Nlc3MgY2F1c2VzIGEgcHJvY2VzcyBncm91cCB0byBiZWNvbWUgb3JwaGFuZWQsCisgICAgYW5kIGlmIGFueSBtZW1iZXIgb2YgdGhlIG5ld2x5LW9ycGhhbmVkIHByb2Nlc3MgZ3JvdXAgaXMgc3RvcHBlZCwgdGhlbiBhIFNJR0hVUAorICAgIHNpZ25hbCBmb2xsb3dlZCBieSBhIFNJR0NPTlQgc2lnbmFsIHdpbGwgYmUgc2VudCB0byBlYWNoIHByb2Nlc3MKKyAgICBpbiB0aGUgbmV3bHktb3JwaGFuZWQgcHJvY2VzcyBncm91cC4KKy4uLgorZHVwIHN0ZGVyciB0byBmZCMgMjU1Cittb3ZlIG91cnNlbGYgdG8gb3VyIG93biBwcm9jZXNzIGdyb3VwCitibG9jayBDSExEIFRTVFAgVFRJTiBUVE9VCitzZXQgdHR5J3MgKDI1NSwgc3RkZXJyJ3MpIGZvcmVncm91bmQgcHJvY2VzcyBncm91cCB0byBvdXIgZ3JvdXAKK2FsbG93IGFsbCBzaWduYWxzCittYXJrIDI1NSBDTE9FWEVDCitzZXQgQ0hMRCBoYW5kbGVyCitnZXQgc2lnbmFsIG1hc2sKK2dldCBmZCMwIGZsYWdzCitnZXQgc2lnbmFsIG1hc2sKK3NldCBJTlQgaGFuZGxlcgorYmxvY2sgQ0hMRCBUU1RQIFRUSU4gVFRPVQorc2V0IGZkICMyNTUgZm9yZWdyb3VuZCBwcm9jZXNzIGdyb3VwIHRvIG91ciBncm91cAorYWxsb3cgYWxsIHNpZ25hbHMKK3NldCBJTlQgaGFuZGxlcgorYmxvY2sgYWxsIHNpZ25hbHMKK2FsbG93IGFsbCBzaWduYWxzCitibG9jayBJTlQKK2FsbG93IGFsbCBzaWduYWxzCitsb3RzYSBzaWdhY3Rpb25zOiBzZXQgSU5ULEFMUk0sV0lOQ0ggaGFuZGxlcnMsIGlnbm9yZSBURVJNLFFVSVQsVFNUUCxUVE9VLFRUSU4KK2Jsb2NrIGFsbCBzaWduYWxzCithbGxvdyBhbGwgc2lnbmFscworYmxvY2sgYWxsIHNpZ25hbHMKK2FsbG93IGFsbCBzaWduYWxzCitibG9jayBhbGwgc2lnbmFscworYWxsb3cgYWxsIHNpZ25hbHMKK3JlYWQgInNsZWVwIDEgfCBzbGVlcCAyXG4iCitibG9jayBJTlQKK1RDU0VUU1cgb24gZmQjIDAKK2FsbG93IGFsbCBzaWduYWxzCitsb3RzYSBzaWdhY3Rpb25zOiBzZXQgSU5ULEFMUk0sV0lOQ0ggaGFuZGxlcnMsIGlnbm9yZSBURVJNLFFVSVQsVFNUUCxUVE9VLFRUSU4KK2Jsb2NrIENITEQKK3BpcGUoWzQsIDVdKSAgLyogb29wcyBzZWVtcyBJIGxvc3QgYW5vdGhlciBwaXBlKCkgaW4gZWRpdGluZy4uLiAqLworZm9yayBjaGlsZCAjMQorcHV0IGNoaWxkIGluIGl0J3Mgb3duIHByb2Nlc3MgZ3JvdXAKK2Jsb2NrIG9ubHkgQ0hMRAorY2xvc2UoNSkKK2Jsb2NrIG9ubHkgSU5UIENITEQKK2ZvcmsgY2hpbGQgIzIKK3B1dCBjaGlsZCBpbiB0aGUgc2FtZSBwcm9jZXNzIGdyb3VwIGFzIGZpcnN0IG9uZQorYmxvY2sgb25seSBDSExECitjbG9zZSg0KQorYmxvY2sgb25seSBDSExECitibG9jayBvbmx5IENITEQgVFNUUCBUVElOIFRUT1UKK3NldCBmZCMgMjU1IGZvcmVncm91bmQgcHJvY2VzcyBncm91cCB0byBmaXJzdCBjaGlsZCdzIG9uZQorYmxvY2sgb25seSBDSExECitibG9jayBvbmx5IENITEQKK2Jsb2NrIG9ubHkgQ0hMRAorLyogbm90ZTogYmVjYXVzZSBzaGVsbCBpcyBub3QgaW4gZm9yZWdyb3VuZCBub3csIGUuZy4gQ3RybC1DIHdpbGwgc2VuZCBJTlQgdG8gY2hpbGRyZW4gb25seSEgKi8KK3dhaXQ0IGZvciBjaGlsZHJlbiB0byBkaWUgb3Igc3RvcCAtIGZpcnN0IGNoaWxkIGV4aXRzCit3YWl0NCBmb3IgY2hpbGRyZW4gdG8gZGllIG9yIHN0b3AgLSBzZWNvbmQgY2hpbGQgZXhpdHMKK2Jsb2NrIENITEQgVFNUUCBUVElOIFRUT1UKK3NldCBmZCMgMjU1IGZvcmVncm91bmQgcHJvY2VzcyBncm91cCB0byBvdXIgb3duIG9uZQorYmxvY2sgb25seSBDSExECitibG9jayBvbmx5IENITEQKK2Jsb2NrIG5vdGhpbmcKKy0tLSBTSUdDSExEIChDaGlsZCBleGl0ZWQpIEAgMCAoMCkgLS0tCisgICAgd2FpdCBmb3IgaXQgLSBubyBjaGlsZCAoYWxyZWFkeSB3YWl0ZWQgZm9yKQorICAgIHNpZ3JldHVybigpCityZWFkIHNpZ25hbCBtYXNrCitsb3RzYSBzaWdhY3Rpb25zLi4uCityZWFkIG5leHQgY29tbWFuZAorCisKK2V4ZWN2ZSgiL2Jpbi9zaCIsIFsic2giXSwgWy8qIDM0IHZhcnMgKi9dKSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgTlVMTCwgW10sIDgpID0gMAoraW9jdGwoMCwgU05EQ1RMX1RNUl9USU1FQkFTRSBvciBUQ0dFVFMsIHtCMzg0MDAgb3Bvc3QgaXNpZyBpY2Fub24gZWNobyAuLi59KSA9IDAKK2lvY3RsKDIsIFNORENUTF9UTVJfVElNRUJBU0Ugb3IgVENHRVRTLCB7QjM4NDAwIG9wb3N0IGlzaWcgaWNhbm9uIGVjaG8gLi4ufSkgPSAwCitydF9zaWdhY3Rpb24oU0lHQ0hMRCwge1NJR19ERkx9LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1FVSVQsIHtTSUdfREZMfSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdURVJNLCB7U0lHX0RGTH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHSFVQLCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHSU5ULCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHSUxMLCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFJBUCwgezB4ODA4Zjc1MiwgW0hVUCBJTlQgSUxMIFRSQVAgQUJSVCBCVVMgRlBFIFVTUjEgU0VHViBVU1IyIFBJUEUgQUxSTSBURVJNIFhDUFUgWEZTWiBWVEFMUk0gU1lTXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0FCUlQsIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdGUEUsIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdCVVMsIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdTRUdWLCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHU1lTLCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHUElQRSwgezB4ODA4Zjc1MiwgW0hVUCBJTlQgSUxMIFRSQVAgQUJSVCBCVVMgRlBFIFVTUjEgU0VHViBVU1IyIFBJUEUgQUxSTSBURVJNIFhDUFUgWEZTWiBWVEFMUk0gU1lTXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0FMUk0sIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdURVJNLCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHWENQVSwgezB4ODA4Zjc1MiwgW0hVUCBJTlQgSUxMIFRSQVAgQUJSVCBCVVMgRlBFIFVTUjEgU0VHViBVU1IyIFBJUEUgQUxSTSBURVJNIFhDUFUgWEZTWiBWVEFMUk0gU1lTXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1hGU1osIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdWVEFMUk0sIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdVU1IxLCB7MHg4MDhmNzUyLCBbSFVQIElOVCBJTEwgVFJBUCBBQlJUIEJVUyBGUEUgVVNSMSBTRUdWIFVTUjIgUElQRSBBTFJNIFRFUk0gWENQVSBYRlNaIFZUQUxSTSBTWVNdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVVNSMiwgezB4ODA4Zjc1MiwgW0hVUCBJTlQgSUxMIFRSQVAgQUJSVCBCVVMgRlBFIFVTUjEgU0VHViBVU1IyIFBJUEUgQUxSTSBURVJNIFhDUFUgWEZTWiBWVEFMUk0gU1lTXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBOVUxMLCBbXSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHUVVJVCwge1NJR19JR059LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0lOVCwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgezB4ODA4Zjc1MiwgW0hVUCBJTlQgSUxMIFRSQVAgQUJSVCBCVVMgRlBFIFVTUjEgU0VHViBVU1IyIFBJUEUgQUxSTSBURVJNIFhDUFUgWEZTWiBWVEFMUk0gU1lTXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdURVJNLCB7U0lHX0lHTn0sIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHSU5ULCB7MHg4MDhmN2Q3LCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7MHg4MDhmN2Q3LCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUU1RQLCB7U0lHX0lHTn0sIHtTSUdfREZMfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFRPVSwge1NJR19JR059LCB7U0lHX0RGTH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RUSU4sIHtTSUdfSUdOfSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdXSU5DSCwgezB4ODA3ZGMzMywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19ERkx9LCA4KSA9IDAKK2dldHBpZCgpICAgICAgICAgICAgICAgID0gMTk0NzMKK2dldHBwaWQoKSAgICAgICAgICAgICAgID0gMTk0NzIKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgfltdLCBbXSwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgW10sIE5VTEwsIDgpID0gMAorZ2V0cGdycCgpICAgICAgICAgICAgICAgPSAxODY1CitkdXAoMikgICAgICAgICAgICAgICAgICA9IDQKK2ZjbnRsNjQoMjU1LCBGX0dFVEZEKSAgID0gLTEgRUJBREYgKEJhZCBmaWxlIGRlc2NyaXB0b3IpCitkdXAyKDQsIDI1NSkgICAgICAgICAgICA9IDI1NQorY2xvc2UoNCkgICAgICAgICAgICAgICAgPSAwCitpb2N0bCgyNTUsIFRJT0NHUEdSUCwgWzE4NjVdKSA9IDAKK2dldHBpZCgpICAgICAgICAgICAgICAgID0gMTk0NzMKK3NldHBnaWQoMCwgMTk0NzMpICAgICAgID0gMAorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBbQ0hMRCBUU1RQIFRUSU4gVFRPVV0sIFtdLCA4KSA9IDAKK2lvY3RsKDI1NSwgVElPQ1NQR1JQLCBbMTk0NzNdKSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbXSwgTlVMTCwgOCkgPSAwCitmY250bDY0KDI1NSwgRl9TRVRGRCwgRkRfQ0xPRVhFQykgPSAwCitydF9zaWdhY3Rpb24oU0lHQ0hMRCwgezB4ODA3YzkyMiwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19ERkx9LCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgTlVMTCwgW10sIDgpID0gMAorZmNudGw2NCgwLCBGX0dFVEZMKSAgICAgPSAweDIgKGZsYWdzIE9fUkRXUikKKy4uLgorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBOVUxMLCBbXSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHSU5ULCB7MHg4MDhmN2Q3LCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7MHg4MDhmN2Q3LCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgW0NITEQgVFNUUCBUVElOIFRUT1VdLCBbXSwgOCkgPSAwCitpb2N0bCgyNTUsIFRJT0NTUEdSUCwgWzE5NDczXSkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgW10sIE5VTEwsIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0lOVCwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIH5bXSwgW10sIDgpID0gMAorcnRfc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIFtdLCBOVUxMLCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgW0lOVF0sIFtdLCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbXSwgTlVMTCwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHSU5ULCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7MHg4MDhmN2Q3LCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdURVJNLCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RFUk0sIHtTSUdfSUdOfSwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHUVVJVCwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdRVUlULCB7U0lHX0lHTn0sIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0FMUk0sIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFNUUCwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUU1RQLCB7U0lHX0lHTn0sIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RUT1UsIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfSUdOfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFRPVSwge1NJR19JR059LCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUVElOLCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RUSU4sIHtTSUdfSUdOfSwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHV0lOQ0gsIHsweDgwY2E1Y2QsIFtdLCBTQV9SRVNUT1JFUnxTQV9SRVNUQVJULCAweDZmZjdhNGY4fSwgezB4ODA3ZGMzMywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIH5bXSwgW10sIDgpID0gMAorcnRfc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIFtdLCBOVUxMLCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgfltdLCBbXSwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgW10sIE5VTEwsIDgpID0gMAorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCB+W10sIFtdLCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbXSwgTlVMTCwgOCkgPSAwCit3cml0ZSgyLCAic2gtMy4wMCMgIiwgOSkgPSA5CitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIE5VTEwsIFtdLCA4KSA9IDAKK3JlYWQoMCwgInMiLCAxKSAgICAgICAgID0gMQord3JpdGUoMiwgInMiLCAxKSAgICAgICAgPSAxCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIE5VTEwsIFtdLCA4KSA9IDAKK3JlYWQoMCwgImwiLCAxKSAgICAgICAgID0gMQord3JpdGUoMiwgImwiLCAxKSAgICAgICAgPSAxCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIE5VTEwsIFtdLCA4KSA9IDAKKy4uLiByZXN0IG9mICJzbGVlcCAxIHwgc2xlZXAgMiIgZW50ZXJlZC4uLgorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBOVUxMLCBbXSwgOCkgPSAwCityZWFkKDAsICIyIiwgMSkgICAgICAgICA9IDEKK3dyaXRlKDIsICIyIiwgMSkgICAgICAgID0gMQorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBOVUxMLCBbXSwgOCkgPSAwCityZWFkKDAsICJcciIsIDEpICAgICAgICA9IDEKK3dyaXRlKDIsICJcbiIsIDEpICAgICAgID0gMQorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBbSU5UXSwgW10sIDgpID0gMAoraW9jdGwoMCwgU05EQ1RMX1RNUl9TVE9QIG9yIFRDU0VUU1csIHtCMzg0MDAgb3Bvc3QgaXNpZyBpY2Fub24gZWNobyAuLi59KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbXSwgTlVMTCwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHSU5ULCB7MHg4MDhmN2Q3LCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdURVJNLCB7U0lHX0lHTn0sIHtTSUdfSUdOfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHUVVJVCwge1NJR19JR059LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0FMUk0sIHsweDgwOGY3NTIsIFtIVVAgSU5UIElMTCBUUkFQIEFCUlQgQlVTIEZQRSBVU1IxIFNFR1YgVVNSMiBQSVBFIEFMUk0gVEVSTSBYQ1BVIFhGU1ogVlRBTFJNIFNZU10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFNUUCwge1NJR19JR059LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RUT1UsIHtTSUdfSUdOfSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUVElOLCB7U0lHX0lHTn0sIHtTSUdfSUdOfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHV0lOQ0gsIHsweDgwN2RjMzMsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHsweDgwY2E1Y2QsIFtdLCBTQV9SRVNUT1JFUnxTQV9SRVNUQVJULCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHSU5ULCB7MHg4MDhmN2Q3LCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7MHg4MDhmN2Q3LCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgW0NITERdLCBbXSwgOCkgPSAwCitwaXBlKFs0LCA1XSkgICAgICAgICAgICA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgW0lOVCBDSExEXSwgW0NITERdLCA4KSA9IDAKK2ZvcmsoKSAgICAgICAgICAgICAgICAgID0gMTk3NTUKK3NldHBnaWQoMTk3NTUsIDE5NzU1KSAgICAgICAgICAgICAgICA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbQ0hMRF0sIE5VTEwsIDgpID0gMAorY2xvc2UoNSkgICAgICAgICAgICAgICAgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIFtJTlQgQ0hMRF0sIFtDSExEXSwgOCkgPSAwCitmb3JrKCkgICAgICAgICAgICAgICAgICA9IDE5NzU2CitzZXRwZ2lkKDE5NzU2LCAxOTc1NSkgICA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbQ0hMRF0sIE5VTEwsIDgpID0gMAorY2xvc2UoNCkgICAgICAgICAgICAgICAgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIFtDSExEXSwgW0NITERdLCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgW0NITEQgVFNUUCBUVElOIFRUT1VdLCBbQ0hMRF0sIDgpID0gMAoraW9jdGwoMjU1LCBUSU9DU1BHUlAsIFsxOTc1NV0pID0gMAorcnRfc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIFtDSExEXSwgTlVMTCwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgW0NITERdLCBOVUxMLCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgW0NITERdLCBbQ0hMRF0sIDgpID0gMAord2FpdDQoLTEsIFt7V0lGRVhJVEVEKHMpICYmIFdFWElUU1RBVFVTKHMpID09IDB9XSwgV1VOVFJBQ0VELCBOVUxMKSA9IDE5NzU1Cit3YWl0NCgtMSwgW3tXSUZFWElURUQocykgJiYgV0VYSVRTVEFUVVMocykgPT0gMH1dLCBXVU5UUkFDRUQsIE5VTEwpID0gMTk3NTYKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgW0NITEQgVFNUUCBUVElOIFRUT1VdLCBbQ0hMRF0sIDgpID0gMAoraW9jdGwoMjU1LCBUSU9DU1BHUlAsIFsxOTQ3M10pID0gMAorcnRfc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIFtDSExEXSwgTlVMTCwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgW0NITERdLCBOVUxMLCA4KSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbXSwgTlVMTCwgOCkgPSAwCistLS0gU0lHQ0hMRCAoQ2hpbGQgZXhpdGVkKSBAIDAgKDApIC0tLQord2FpdDQoLTEsIDB4NzdmYzljNTQsIFdOT0hBTkd8V1VOVFJBQ0VELCBOVUxMKSA9IC0xIEVDSElMRCAoTm8gY2hpbGQgcHJvY2Vzc2VzKQorc2lncmV0dXJuKCkgICAgICAgICAgICAgPSA/IChtYXNrIG5vdyBbXSkKK3J0X3NpZ3Byb2NtYXNrKFNJR19CTE9DSywgTlVMTCwgW10sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR0lOVCwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIFtDSExEIFRTVFAgVFRJTiBUVE9VXSwgW10sIDgpID0gMAoraW9jdGwoMjU1LCBUSU9DU1BHUlAsIFsxOTQ3M10pID0gMAorcnRfc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIFtdLCBOVUxMLCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdJTlQsIHsweDgwOGY3ZDcsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHsweDgwOGY3ZDcsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBbSU5UXSwgW10sIDgpID0gMAorcnRfc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIFtdLCBOVUxMLCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdJTlQsIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHsweDgwOGY3ZDcsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RFUk0sIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfSUdOfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVEVSTSwge1NJR19JR059LCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdRVUlULCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1FVSVQsIHtTSUdfSUdOfSwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHQUxSTSwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgezB4ODA4Zjc1MiwgW0hVUCBJTlQgSUxMIFRSQVAgQUJSVCBCVVMgRlBFIFVTUjEgU0VHViBVU1IyIFBJUEUgQUxSTSBURVJNIFhDUFUgWEZTWiBWVEFMUk0gU1lTXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUU1RQLCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RTVFAsIHtTSUdfSUdOfSwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFRPVSwgezB4ODBjYTUzMCwgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUVE9VLCB7U0lHX0lHTn0sIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RUSU4sIHsweDgwY2E1MzAsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIHtTSUdfSUdOfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFRJTiwge1NJR19JR059LCB7MHg4MGNhNTMwLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdXSU5DSCwgezB4ODBjYTVjZCwgW10sIFNBX1JFU1RPUkVSfFNBX1JFU1RBUlQsIDB4NmZmN2E0Zjh9LCB7MHg4MDdkYzMzLCBbXSwgU0FfUkVTVE9SRVIsIDB4NmZmN2E0Zjh9LCA4KSA9IDAKK3dyaXRlKDIsICJzaC0zLjAwIyAiLCA5KSA9IDkKKworCitnZXRwaWQoKSA9IDE5NzU1CitydF9zaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgW10sIE5VTEwsIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RTVFAsIHtTSUdfREZMfSwge1NJR19JR059LCA4KSAgICA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUVElOLCB7U0lHX0RGTH0sIHtTSUdfSUdOfSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFRPVSwge1NJR19ERkx9LCB7U0lHX0lHTn0sIDgpID0gMAorc2V0cGdpZCgxOTc1NSwgMTk3NTUpID0gMAorcnRfc2lncHJvY21hc2soU0lHX0JMT0NLLCBbQ0hMRCBUU1RQIFRUSU4gVFRPVV0sIFtdLCA4KSA9IDAKK2lvY3RsKDI1NSwgVElPQ1NQR1JQLCBbMTk3NTVdKSA9IDAKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbXSwgTlVMTCwgOCkgPSAwCitjbG9zZSg0KSAgID0gMAorZHVwMig1LCAxKSA9IDEKK2Nsb3NlKDUpICAgICAgICAgICAgICA9IDAKK3J0X3NpZ2FjdGlvbihTSUdJTlQsIHtTSUdfREZMfSwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHUVVJVCwge1NJR19ERkx9LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RFUk0sIHtTSUdfREZMfSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdDSExELCB7U0lHX0RGTH0sIHsweDgwN2M5MjIsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorZXhlY3ZlKCIvYmluL3NsZWVwIiwgWyJzbGVlcCIsICIxIl0sIFsvKiAzNCB2YXJzICovXSkgPSAwCisuLi4KK19leGl0KDApICAgICAgICAgICAgICAgID0gPworCisKK2dldHBpZCgpID0gMTk3NTYKK3J0X3NpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCBbXSwgTlVMTCwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHVFNUUCwge1NJR19ERkx9LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RUSU4sIHtTSUdfREZMfSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdUVE9VLCB7U0lHX0RGTH0sIHtTSUdfSUdOfSwgOCkgPSAwCitzZXRwZ2lkKDE5NzU2LCAxOTc1NSkgPSAwCitydF9zaWdwcm9jbWFzayhTSUdfQkxPQ0ssIFtDSExEIFRTVFAgVFRJTiBUVE9VXSwgW10sIDgpID0gMAoraW9jdGwoMjU1LCBUSU9DU1BHUlAsIFsxOTc1NV0pID0gMAorcnRfc2lncHJvY21hc2soU0lHX1NFVE1BU0ssIFtdLCBOVUxMLCA4KSA9IDAKK2R1cDIoNCwgMCkgPSAwCitjbG9zZSg0KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdJTlQsIHtTSUdfREZMfSwgezB4ODA4ZjdkNywgW10sIFNBX1JFU1RPUkVSLCAweDZmZjdhNGY4fSwgOCkgPSAwCitydF9zaWdhY3Rpb24oU0lHUVVJVCwge1NJR19ERkx9LCB7U0lHX0lHTn0sIDgpID0gMAorcnRfc2lnYWN0aW9uKFNJR1RFUk0sIHtTSUdfREZMfSwge1NJR19JR059LCA4KSA9IDAKK3J0X3NpZ2FjdGlvbihTSUdDSExELCB7U0lHX0RGTH0sIHsweDgwN2M5MjIsIFtdLCBTQV9SRVNUT1JFUiwgMHg2ZmY3YTRmOH0sIDgpID0gMAorZXhlY3ZlKCIvYmluL3NsZWVwIiwgWyJzbGVlcCIsICIyIl0sIFsvKiAzNCB2YXJzICovXSkgPSAwCisuLi4KK19leGl0KDApICAgICAgICAgICAgICAgID0gPwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoLmMgYi9zaGVsbC9hc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTE2MjhlCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoLmMKQEAgLTAsMCArMSwxMzI2NiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogYXNoIHNoZWxsIHBvcnQgZm9yIGJ1c3lib3gKKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIE9yaWdpbmFsIEJTRCBjb3B5cmlnaHQgbm90aWNlIGlzIHJldGFpbmVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MSwgMTk5MywgMTk5NAorICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNSBIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+CisgKiB3YXMgcmUtcG9ydGVkIGZyb20gTmV0QlNEIGFuZCBkZWJpYW5pemVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgc2hvdWxkIGJlIHNldCB0byByZWZsZWN0IHRoZSB0eXBlIG9mIHN5c3RlbSB5b3UgaGF2ZToKKyAqICAgICAgSk9CUyAtPiAxIGlmIHlvdSBoYXZlIEJlcmtlbGV5IGpvYiBjb250cm9sLCAwIG90aGVyd2lzZS4KKyAqICAgICAgZGVmaW5lIFNZU1YgaWYgeW91IGFyZSBydW5uaW5nIHVuZGVyIFN5c3RlbSBWLgorICogICAgICBkZWZpbmUgREVCVUc9MSB0byBjb21waWxlIGluIGRlYnVnZ2luZyAoJ3NldCAtbyBkZWJ1ZycgdG8gdHVybiBvbikKKyAqICAgICAgZGVmaW5lIERFQlVHPTIgdG8gY29tcGlsZSBpbiBhbmQgdHVybiBvbiBkZWJ1Z2dpbmcuCisgKgorICogV2hlbiBkZWJ1Z2dpbmcgaXMgb24gKERFQlVHIGlzIDEgYW5kICJzZXQgLW8gZGVidWciIHdhcyBleGVjdXRlZCksCisgKiBkZWJ1Z2dpbmcgaW5mbyB3aWxsIGJlIHdyaXR0ZW4gdG8gLi90cmFjZSBhbmQgYSBxdWl0IHNpZ25hbAorICogd2lsbCBnZW5lcmF0ZSBhIGNvcmUgZHVtcC4KKyAqLworI2RlZmluZSBERUJVRyAwCisvKiBUd2VhayBkZWJ1ZyBvdXRwdXQgdmVyYm9zaXR5IGhlcmUgKi8KKyNkZWZpbmUgREVCVUdfVElNRSAwCisjZGVmaW5lIERFQlVHX1BJRCAxCisjZGVmaW5lIERFQlVHX1NJRyAxCisKKyNkZWZpbmUgUFJPRklMRSAwCisKKyNkZWZpbmUgSk9CUyBFTkFCTEVfQVNIX0pPQl9DT05UUk9MCisKKyNpbmNsdWRlIDxwYXRocy5oPgorI2luY2x1ZGUgPHNldGptcC5oPgorI2luY2x1ZGUgPGZubWF0Y2guaD4KKyNpbmNsdWRlIDxzeXMvdGltZXMuaD4KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPiAvKiBmb3Igc2V0dGluZyAkSE9TVE5BTUUgKi8KKworI2luY2x1ZGUgImJ1c3lib3guaCIgLyogZm9yIGFwcGxldF9uYW1lcyAqLworI2luY2x1ZGUgInVuaWNvZGUuaCIKKworI2luY2x1ZGUgInNoZWxsX2NvbW1vbi5oIgorI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKKyMgaW5jbHVkZSAibWF0aC5oIgorI2VuZGlmCisjaWYgRU5BQkxFX0FTSF9SQU5ET01fU1VQUE9SVAorIyBpbmNsdWRlICJyYW5kb20uaCIKKyNlbHNlCisjIGRlZmluZSBDTEVBUl9SQU5ET01fVChybmQpICgodm9pZCkwKQorI2VuZGlmCisKKyNpbmNsdWRlICJOVU1fQVBQTEVUUy5oIgorI2lmIE5VTV9BUFBMRVRTID09IDEKKy8qIFNUQU5EQUxPTkUgZG9lcyBub3QgbWFrZSBzZW5zZSwgYW5kIHdvbid0IGNvbXBpbGUgKi8KKyMgdW5kZWYgQ09ORklHX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORQorIyB1bmRlZiBFTkFCTEVfRkVBVFVSRV9TSF9TVEFOREFMT05FCisjIHVuZGVmIElGX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORQorIyB1bmRlZiBJRl9OT1RfRkVBVFVSRV9TSF9TVEFOREFMT05FCisjIGRlZmluZSBFTkFCTEVfRkVBVFVSRV9TSF9TVEFOREFMT05FIDAKKyMgZGVmaW5lIElGX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORSguLi4pCisjIGRlZmluZSBJRl9OT1RfRkVBVFVSRV9TSF9TVEFOREFMT05FKC4uLikgX19WQV9BUkdTX18KKyNlbmRpZgorCisjaWZuZGVmIFBJUEVfQlVGCisjIGRlZmluZSBQSVBFX0JVRiA0MDk2ICAgICAgICAgICAvKiBhbW91bnQgb2YgYnVmZmVyaW5nIGluIGEgcGlwZSAqLworI2VuZGlmCisKKyNpZiAhQkJfTU1VCisjIGVycm9yICJEbyBub3QgZXZlbiBib3RoZXIsIGFzaCB3aWxsIG5vdCBydW4gb24gTk9NTVUgbWFjaGluZSIKKyNlbmRpZgorCisvL2NvbmZpZzpjb25maWcgQVNICisvL2NvbmZpZzoJYm9vbCAiYXNoIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gIU5PTU1VCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVGhhICdhc2gnIHNoZWxsIGFkZHMgYWJvdXQgNjBrIGluIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gYW5kIGlzCisvL2NvbmZpZzoJICB0aGUgbW9zdCBjb21wbGV0ZSBhbmQgbW9zdCBwZWRhbnRpY2FsbHkgY29ycmVjdCBzaGVsbCBpbmNsdWRlZCB3aXRoCisvL2NvbmZpZzoJICBidXN5Ym94LiBUaGlzIHNoZWxsIGlzIGFjdHVhbGx5IGEgZGVyaXZhdGl2ZSBvZiB0aGUgRGViaWFuICdkYXNoJworLy9jb25maWc6CSAgc2hlbGwgKGJ5IEhlcmJlcnQgWHUpLCB3aGljaCB3YXMgY3JlYXRlZCBieSBwb3J0aW5nIHRoZSAnYXNoJyBzaGVsbAorLy9jb25maWc6CSAgKHdyaXR0ZW4gYnkgS2VubmV0aCBBbG1xdWlzdCkgZnJvbSBOZXRCU0QuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBBU0hfQkFTSF9DT01QQVQKKy8vY29uZmlnOglib29sICJiYXNoLWNvbXBhdGlibGUgZXh0ZW5zaW9ucyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEFTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBiYXNoLWNvbXBhdGlibGUgZXh0ZW5zaW9ucy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEFTSF9JRExFX1RJTUVPVVQKKy8vY29uZmlnOglib29sICJJZGxlIHRpbWVvdXQgdmFyaWFibGUiCisvL2NvbmZpZzoJZGVmYXVsdCBuCisvL2NvbmZpZzoJZGVwZW5kcyBvbiBBU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGVzIGJhc2gtbGlrZSBhdXRvLWxvZ291dCBhZnRlciAkVE1PVVQgc2Vjb25kcyBvZiBpZGxlIHRpbWUuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBBU0hfSk9CX0NPTlRST0wKKy8vY29uZmlnOglib29sICJKb2IgY29udHJvbCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEFTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBqb2IgY29udHJvbCBpbiB0aGUgYXNoIHNoZWxsLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgQVNIX0FMSUFTCisvL2NvbmZpZzoJYm9vbCAiQWxpYXMgc3VwcG9ydCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEFTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBhbGlhcyBzdXBwb3J0IGluIHRoZSBhc2ggc2hlbGwuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBBU0hfR0VUT1BUUworLy9jb25maWc6CWJvb2wgIkJ1aWx0aW4gZ2V0b3B0IHRvIHBhcnNlIHBvc2l0aW9uYWwgcGFyYW1ldGVycyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEFTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBzdXBwb3J0IGZvciBnZXRvcHRzIGJ1aWx0aW4gaW4gYXNoLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgQVNIX0JVSUxUSU5fRUNITworLy9jb25maWc6CWJvb2wgIkJ1aWx0aW4gdmVyc2lvbiBvZiAnZWNobyciCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBBU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgc3VwcG9ydCBmb3IgZWNobyBidWlsdGluIGluIGFzaC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEFTSF9CVUlMVElOX1BSSU5URgorLy9jb25maWc6CWJvb2wgIkJ1aWx0aW4gdmVyc2lvbiBvZiAncHJpbnRmJyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEFTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBzdXBwb3J0IGZvciBwcmludGYgYnVpbHRpbiBpbiBhc2guCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBBU0hfQlVJTFRJTl9URVNUCisvL2NvbmZpZzoJYm9vbCAiQnVpbHRpbiB2ZXJzaW9uIG9mICd0ZXN0JyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEFTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBzdXBwb3J0IGZvciB0ZXN0IGJ1aWx0aW4gaW4gYXNoLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgQVNIX0hFTFAKKy8vY29uZmlnOglib29sICJoZWxwIGJ1aWx0aW4iCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBBU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgaGVscCBidWlsdGluIGluIGFzaC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEFTSF9DTURDTUQKKy8vY29uZmlnOglib29sICInY29tbWFuZCcgY29tbWFuZCB0byBvdmVycmlkZSBzaGVsbCBidWlsdGlucyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEFTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBzdXBwb3J0IGZvciB0aGUgYXNoICdjb21tYW5kJyBidWlsdGluLCB3aGljaCBhbGxvd3MKKy8vY29uZmlnOgkgIHlvdSB0byBydW4gdGhlIHNwZWNpZmllZCBjb21tYW5kIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMsCisvL2NvbmZpZzoJICBldmVuIHdoZW4gdGhlcmUgaXMgYW4gYXNoIGJ1aWx0aW4gY29tbWFuZCB3aXRoIHRoZSBzYW1lIG5hbWUuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBBU0hfTUFJTAorLy9jb25maWc6CWJvb2wgIkNoZWNrIGZvciBuZXcgbWFpbCBvbiBpbnRlcmFjdGl2ZSBzaGVsbHMiCisvL2NvbmZpZzoJZGVmYXVsdCBuCisvL2NvbmZpZzoJZGVwZW5kcyBvbiBBU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgImNoZWNrIGZvciBuZXcgbWFpbCIgZnVuY3Rpb24gaW4gdGhlIGFzaCBzaGVsbC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEFTSF9PUFRJTUlaRV9GT1JfU0laRQorLy9jb25maWc6CWJvb2wgIk9wdGltaXplIGZvciBzaXplIGluc3RlYWQgb2Ygc3BlZWQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBBU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBDb21waWxlIGFzaCBmb3IgcmVkdWNlZCBzaXplIGF0IHRoZSBwcmljZSBvZiBzcGVlZC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEFTSF9SQU5ET01fU1VQUE9SVAorLy9jb25maWc6CWJvb2wgIlBzZXVkb3JhbmRvbSBnZW5lcmF0b3IgYW5kICRSQU5ET00gdmFyaWFibGUiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBBU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgcHNldWRvcmFuZG9tIGdlbmVyYXRvciBhbmQgZHluYW1pYyB2YXJpYWJsZSAiJFJBTkRPTSIuCisvL2NvbmZpZzoJICBFYWNoIHJlYWQgb2YgIiRSQU5ET00iIHdpbGwgZ2VuZXJhdGUgYSBuZXcgcHNldWRvcmFuZG9tIHZhbHVlLgorLy9jb25maWc6CSAgWW91IGNhbiByZXNldCB0aGUgZ2VuZXJhdG9yIGJ5IHVzaW5nIGEgc3BlY2lmaWVkIHN0YXJ0IHZhbHVlLgorLy9jb25maWc6CSAgQWZ0ZXIgInVuc2V0IFJBTkRPTSIgdGhlIGdlbmVyYXRvciB3aWxsIHN3aXRjaCBvZmYgYW5kIHRoaXMKKy8vY29uZmlnOgkgIHZhcmlhYmxlIHdpbGwgbm8gbG9uZ2VyIGhhdmUgc3BlY2lhbCB0cmVhdG1lbnQuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBBU0hfRVhQQU5EX1BSTVQKKy8vY29uZmlnOglib29sICJFeHBhbmQgcHJvbXB0IHN0cmluZyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEFTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgICJQUyMiIG1heSBjb250YWluIHZvbGF0aWxlIGNvbnRlbnQsIHN1Y2ggYXMgYmFja3F1b3RlIGNvbW1hbmRzLgorLy9jb25maWc6CSAgVGhpcyBvcHRpb24gcmVjcmVhdGVzIHRoZSBwcm9tcHQgc3RyaW5nIGZyb20gdGhlIGVudmlyb25tZW50CisvL2NvbmZpZzoJICB2YXJpYWJsZSBlYWNoIHRpbWUgaXQgaXMgZGlzcGxheWVkLgorLy9jb25maWc6CisKKy8vYXBwbGV0OklGX0FTSChBUFBMRVQoYXNoLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorLy9hcHBsZXQ6SUZfRkVBVFVSRV9TSF9JU19BU0goQVBQTEVUX09ERE5BTUUoc2gsIGFzaCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBzaCkpCisvL2FwcGxldDpJRl9GRUFUVVJFX0JBU0hfSVNfQVNIKEFQUExFVF9PREROQU1FKGJhc2gsIGFzaCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBiYXNoKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0FTSCkgKz0gYXNoLm8gYXNoX3B0cl9oYWNrLm8gc2hlbGxfY29tbW9uLm8KKy8va2J1aWxkOmxpYi0kKENPTkZJR19BU0hfUkFORE9NX1NVUFBPUlQpICs9IHJhbmRvbS5vCisKKworLyogPT09PT09PT09PT09IEhhc2ggdGFibGUgc2l6ZXMuIENvbmZpZ3VyYWJsZS4gKi8KKworI2RlZmluZSBWVEFCU0laRSAzOQorI2RlZmluZSBBVEFCU0laRSAzOQorI2RlZmluZSBDTURUQUJMRVNJWkUgMzEgICAgICAgICAvKiBzaG91bGQgYmUgcHJpbWUgKi8KKworCisvKiA9PT09PT09PT09PT0gU2hlbGwgb3B0aW9ucyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgb3B0bGV0dGVyc19vcHRuYW1lc1tdID0geworCSJlIiAgICJlcnJleGl0IiwKKwkiZiIgICAibm9nbG9iIiwKKwkiSSIgICAiaWdub3JlZW9mIiwKKwkiaSIgICAiaW50ZXJhY3RpdmUiLAorCSJtIiAgICJtb25pdG9yIiwKKwkibiIgICAibm9leGVjIiwKKwkicyIgICAic3RkaW4iLAorCSJ4IiAgICJ4dHJhY2UiLAorCSJ2IiAgICJ2ZXJib3NlIiwKKwkiQyIgICAibm9jbG9iYmVyIiwKKwkiYSIgICAiYWxsZXhwb3J0IiwKKwkiYiIgICAibm90aWZ5IiwKKwkidSIgICAibm91bnNldCIsCisJIlwwIiAgInZpIgorI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwksIlwwIiAgInBpcGVmYWlsIgorI2VuZGlmCisjaWYgREVCVUcKKwksIlwwIiAgIm5vbG9nIgorCSwiXDAiICAiZGVidWciCisjZW5kaWYKK307CisKKyNkZWZpbmUgb3B0bGV0dGVycyhuKSAgb3B0bGV0dGVyc19vcHRuYW1lc1tuXVswXQorI2RlZmluZSBvcHRuYW1lcyhuKSAgIChvcHRsZXR0ZXJzX29wdG5hbWVzW25dICsgMSkKKworZW51bSB7IE5PUFRTID0gQVJSQVlfU0laRShvcHRsZXR0ZXJzX29wdG5hbWVzKSB9OworCisKKy8qID09PT09PT09PT09PSBNaXNjIGRhdGEgKi8KKworI2RlZmluZSBtc2dfaWxsbnVtICJJbGxlZ2FsIG51bWJlcjogJXMiCisKKy8qCisgKiBXZSBlbmNsb3NlIGptcF9idWYgaW4gYSBzdHJ1Y3R1cmUgc28gdGhhdCB3ZSBjYW4gZGVjbGFyZSBwb2ludGVycyB0bworICoganVtcCBsb2NhdGlvbnMuICBUaGUgZ2xvYmFsIHZhcmlhYmxlIGhhbmRsZXIgY29udGFpbnMgdGhlIGxvY2F0aW9uIHRvCisgKiBqdW1wIHRvIHdoZW4gYW4gZXhjZXB0aW9uIG9jY3VycywgYW5kIHRoZSBnbG9iYWwgdmFyaWFibGUgZXhjZXB0aW9uX3R5cGUKKyAqIGNvbnRhaW5zIGEgY29kZSBpZGVudGlmeWluZyB0aGUgZXhjZXB0aW9uLiAgVG8gaW1wbGVtZW50IG5lc3RlZAorICogZXhjZXB0aW9uIGhhbmRsZXJzLCB0aGUgdXNlciBzaG91bGQgc2F2ZSB0aGUgdmFsdWUgb2YgaGFuZGxlciBvbiBlbnRyeQorICogdG8gYW4gaW5uZXIgc2NvcGUsIHNldCBoYW5kbGVyIHRvIHBvaW50IHRvIGEgam1wbG9jIHN0cnVjdHVyZSBmb3IgdGhlCisgKiBpbm5lciBzY29wZSwgYW5kIHJlc3RvcmUgaGFuZGxlciBvbiBleGl0IGZyb20gdGhlIHNjb3BlLgorICovCitzdHJ1Y3Qgam1wbG9jIHsKKwlqbXBfYnVmIGxvYzsKK307CisKK3N0cnVjdCBnbG9iYWxzX21pc2MgeworCS8qIHBpZCBvZiBtYWluIHNoZWxsICovCisJaW50IHJvb3RwaWQ7CisJLyogc2hlbGwgbGV2ZWw6IDAgZm9yIHRoZSBtYWluIHNoZWxsLCAxIGZvciBpdHMgY2hpbGRyZW4sIGFuZCBzbyBvbiAqLworCWludCBzaGx2bDsKKyNkZWZpbmUgcm9vdHNoZWxsICghc2hsdmwpCisJY2hhciAqbWludXNjOyAgLyogYXJndW1lbnQgdG8gLWMgb3B0aW9uICovCisKKwljaGFyICpjdXJkaXI7IC8vID0gbnVsbHN0cjsgICAgIC8qIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKi8KKwljaGFyICpwaHlzZGlyOyAvLyA9IG51bGxzdHI7ICAgIC8qIHBoeXNpY2FsIHdvcmtpbmcgZGlyZWN0b3J5ICovCisKKwljaGFyICphcmcwOyAvKiB2YWx1ZSBvZiAkMCAqLworCisJc3RydWN0IGptcGxvYyAqZXhjZXB0aW9uX2hhbmRsZXI7CisKKwl2b2xhdGlsZSBpbnQgc3VwcHJlc3NfaW50OyAvKiBjb3VudGVyICovCisJdm9sYXRpbGUgLypzaWdfYXRvbWljX3QqLyBzbWFsbGludCBwZW5kaW5nX2ludDsgLyogMSA9IGdvdCBTSUdJTlQgKi8KKwkvKiBsYXN0IHBlbmRpbmcgc2lnbmFsICovCisJdm9sYXRpbGUgLypzaWdfYXRvbWljX3QqLyBzbWFsbGludCBwZW5kaW5nX3NpZzsKKwlzbWFsbGludCBleGNlcHRpb25fdHlwZTsgLyoga2luZCBvZiBleGNlcHRpb24gKDAuLjUpICovCisJLyogZXhjZXB0aW9ucyAqLworI2RlZmluZSBFWElOVCAwICAgICAgICAgLyogU0lHSU5UIHJlY2VpdmVkICovCisjZGVmaW5lIEVYRVJST1IgMSAgICAgICAvKiBhIGdlbmVyaWMgZXJyb3IgKi8KKyNkZWZpbmUgRVhTSEVMTFBST0MgMiAgIC8qIGV4ZWN1dGUgYSBzaGVsbCBwcm9jZWR1cmUgKi8KKyNkZWZpbmUgRVhFWEVDIDMgICAgICAgIC8qIGNvbW1hbmQgZXhlY3V0aW9uIGZhaWxlZCAqLworI2RlZmluZSBFWEVYSVQgNCAgICAgICAgLyogZXhpdCB0aGUgc2hlbGwgKi8KKyNkZWZpbmUgRVhTSUcgNSAgICAgICAgIC8qIHRyYXBwZWQgc2lnbmFsIGluIHdhaXQoMSkgKi8KKworCXNtYWxsaW50IGlzbG9naW5zaDsKKwljaGFyIG51bGxzdHJbMV07ICAgICAgICAvKiB6ZXJvIGxlbmd0aCBzdHJpbmcgKi8KKworCWNoYXIgb3B0bGlzdFtOT1BUU107CisjZGVmaW5lIGVmbGFnIG9wdGxpc3RbMF0KKyNkZWZpbmUgZmZsYWcgb3B0bGlzdFsxXQorI2RlZmluZSBJZmxhZyBvcHRsaXN0WzJdCisjZGVmaW5lIGlmbGFnIG9wdGxpc3RbM10KKyNkZWZpbmUgbWZsYWcgb3B0bGlzdFs0XQorI2RlZmluZSBuZmxhZyBvcHRsaXN0WzVdCisjZGVmaW5lIHNmbGFnIG9wdGxpc3RbNl0KKyNkZWZpbmUgeGZsYWcgb3B0bGlzdFs3XQorI2RlZmluZSB2ZmxhZyBvcHRsaXN0WzhdCisjZGVmaW5lIENmbGFnIG9wdGxpc3RbOV0KKyNkZWZpbmUgYWZsYWcgb3B0bGlzdFsxMF0KKyNkZWZpbmUgYmZsYWcgb3B0bGlzdFsxMV0KKyNkZWZpbmUgdWZsYWcgb3B0bGlzdFsxMl0KKyNkZWZpbmUgdmlmbGFnIG9wdGxpc3RbMTNdCisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorIyBkZWZpbmUgcGlwZWZhaWwgb3B0bGlzdFsxNF0KKyNlbHNlCisjIGRlZmluZSBwaXBlZmFpbCAwCisjZW5kaWYKKyNpZiBERUJVRworIyBkZWZpbmUgbm9sb2cgb3B0bGlzdFsxNCArIEVOQUJMRV9BU0hfQkFTSF9DT01QQVRdCisjIGRlZmluZSBkZWJ1ZyBvcHRsaXN0WzE1ICsgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVF0KKyNlbmRpZgorCisJLyogdHJhcCBoYW5kbGVyIGNvbW1hbmRzICovCisJLyoKKwkgKiBTaWdtb2RlIHJlY29yZHMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHNpZ25hbCBoYW5kbGVycyBmb3IgdGhlIHZhcmlvdXMKKwkgKiBtb2Rlcy4gIEEgdmFsdWUgb2YgemVybyBtZWFucyB0aGF0IHRoZSBjdXJyZW50IGhhbmRsZXIgaXMgbm90IGtub3duLgorCSAqIFNfSEFSRF9JR04gaW5kaWNhdGVzIHRoYXQgdGhlIHNpZ25hbCB3YXMgaWdub3JlZCBvbiBlbnRyeSB0byB0aGUgc2hlbGwuCisJICovCisJY2hhciBzaWdtb2RlW05TSUcgLSAxXTsKKyNkZWZpbmUgU19ERkwgICAgICAxICAgICAgICAgICAgLyogZGVmYXVsdCBzaWduYWwgaGFuZGxpbmcgKFNJR19ERkwpICovCisjZGVmaW5lIFNfQ0FUQ0ggICAgMiAgICAgICAgICAgIC8qIHNpZ25hbCBpcyBjYXVnaHQgKi8KKyNkZWZpbmUgU19JR04gICAgICAzICAgICAgICAgICAgLyogc2lnbmFsIGlzIGlnbm9yZWQgKFNJR19JR04pICovCisjZGVmaW5lIFNfSEFSRF9JR04gNCAgICAgICAgICAgIC8qIHNpZ25hbCBpcyBpZ25vcmVkIHBlcm1lbmFudGx5ICovCisKKwkvKiBpbmRpY2F0ZXMgc3BlY2lmaWVkIHNpZ25hbCByZWNlaXZlZCAqLworCXVpbnQ4X3QgZ290c2lnW05TSUcgLSAxXTsgLyogb2Zmc2V0IGJ5IDE6ICJzaWduYWwiIDAgaXMgbWVhbmluZ2xlc3MgKi8KKwl1aW50OF90IG1heV9oYXZlX3RyYXBzOyAvKiAwOiBkZWZpbml0ZWx5IG5vIHRyYXBzIGFyZSBzZXQsIDE6IHNvbWUgdHJhcHMgbWF5IGJlIHNldCAqLworCWNoYXIgKnRyYXBbTlNJR107CisJY2hhciAqKnRyYXBfcHRyOyAgICAgICAgLyogdXNlZCBvbmx5IGJ5ICJ0cmFwIGhhY2siICovCisKKwkvKiBSYXJlbHkgcmVmZXJlbmNlZCBzdHVmZiAqLworI2lmIEVOQUJMRV9BU0hfUkFORE9NX1NVUFBPUlQKKwlyYW5kb21fdCByYW5kb21fZ2VuOworI2VuZGlmCisJcGlkX3QgYmFja2duZHBpZDsgICAgICAgIC8qIHBpZCBvZiBsYXN0IGJhY2tncm91bmQgcHJvY2VzcyAqLworCXNtYWxsaW50IGpvYl93YXJuaW5nOyAgICAvKiB1c2VyIHdhcyB3YXJuZWQgYWJvdXQgc3RvcHBlZCBqb2JzIChjYW4gYmUgMiwgMSBvciAwKS4gKi8KK307CitleHRlcm4gc3RydWN0IGdsb2JhbHNfbWlzYyAqY29uc3QgYXNoX3B0cl90b19nbG9iYWxzX21pc2M7CisjZGVmaW5lIEdfbWlzYyAoKmFzaF9wdHJfdG9fZ2xvYmFsc19taXNjKQorI2RlZmluZSByb290cGlkICAgICAoR19taXNjLnJvb3RwaWQgICAgKQorI2RlZmluZSBzaGx2bCAgICAgICAoR19taXNjLnNobHZsICAgICAgKQorI2RlZmluZSBtaW51c2MgICAgICAoR19taXNjLm1pbnVzYyAgICAgKQorI2RlZmluZSBjdXJkaXIgICAgICAoR19taXNjLmN1cmRpciAgICAgKQorI2RlZmluZSBwaHlzZGlyICAgICAoR19taXNjLnBoeXNkaXIgICAgKQorI2RlZmluZSBhcmcwICAgICAgICAoR19taXNjLmFyZzAgICAgICAgKQorI2RlZmluZSBleGNlcHRpb25faGFuZGxlciAoR19taXNjLmV4Y2VwdGlvbl9oYW5kbGVyKQorI2RlZmluZSBleGNlcHRpb25fdHlwZSAgICAoR19taXNjLmV4Y2VwdGlvbl90eXBlICAgKQorI2RlZmluZSBzdXBwcmVzc19pbnQgICAgICAoR19taXNjLnN1cHByZXNzX2ludCAgICAgKQorI2RlZmluZSBwZW5kaW5nX2ludCAgICAgICAoR19taXNjLnBlbmRpbmdfaW50ICAgICAgKQorI2RlZmluZSBwZW5kaW5nX3NpZyAgICAgICAoR19taXNjLnBlbmRpbmdfc2lnICAgICAgKQorI2RlZmluZSBpc2xvZ2luc2ggICAoR19taXNjLmlzbG9naW5zaCAgKQorI2RlZmluZSBudWxsc3RyICAgICAoR19taXNjLm51bGxzdHIgICAgKQorI2RlZmluZSBvcHRsaXN0ICAgICAoR19taXNjLm9wdGxpc3QgICAgKQorI2RlZmluZSBzaWdtb2RlICAgICAoR19taXNjLnNpZ21vZGUgICAgKQorI2RlZmluZSBnb3RzaWcgICAgICAoR19taXNjLmdvdHNpZyAgICAgKQorI2RlZmluZSBtYXlfaGF2ZV90cmFwcyAgICAoR19taXNjLm1heV9oYXZlX3RyYXBzICAgKQorI2RlZmluZSB0cmFwICAgICAgICAoR19taXNjLnRyYXAgICAgICAgKQorI2RlZmluZSB0cmFwX3B0ciAgICAoR19taXNjLnRyYXBfcHRyICAgKQorI2RlZmluZSByYW5kb21fZ2VuICAoR19taXNjLnJhbmRvbV9nZW4gKQorI2RlZmluZSBiYWNrZ25kcGlkICAoR19taXNjLmJhY2tnbmRwaWQgKQorI2RlZmluZSBqb2Jfd2FybmluZyAoR19taXNjLmpvYl93YXJuaW5nKQorI2RlZmluZSBJTklUX0dfbWlzYygpIGRvIHsgXAorCSgqKHN0cnVjdCBnbG9iYWxzX21pc2MqKikmYXNoX3B0cl90b19nbG9iYWxzX21pc2MpID0geHphbGxvYyhzaXplb2YoR19taXNjKSk7IFwKKwliYXJyaWVyKCk7IFwKKwljdXJkaXIgPSBudWxsc3RyOyBcCisJcGh5c2RpciA9IG51bGxzdHI7IFwKKwl0cmFwX3B0ciA9IHRyYXA7IFwKK30gd2hpbGUgKDApCisKKworLyogPT09PT09PT09PT09IERFQlVHICovCisjaWYgREVCVUcKK3N0YXRpYyB2b2lkIHRyYWNlX3ByaW50Zihjb25zdCBjaGFyICpmbXQsIC4uLik7CitzdGF0aWMgdm9pZCB0cmFjZV92cHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCB2YSk7CisjIGRlZmluZSBUUkFDRShwYXJhbSkgICAgdHJhY2VfcHJpbnRmIHBhcmFtCisjIGRlZmluZSBUUkFDRVYocGFyYW0pICAgdHJhY2VfdnByaW50ZiBwYXJhbQorIyBkZWZpbmUgY2xvc2UoZmQpIGRvIHsgXAorCWludCBkZmQgPSAoZmQpOyBcCisJaWYgKGNsb3NlKGRmZCkgPCAwKSBcCisJCWJiX2Vycm9yX21zZygiYnVnIG9uICVkOiBjbG9zaW5nICVkKDB4JXgpIiwgXAorCQkJX19MSU5FX18sIGRmZCwgZGZkKTsgXAorfSB3aGlsZSAoMCkKKyNlbHNlCisjIGRlZmluZSBUUkFDRShwYXJhbSkKKyMgZGVmaW5lIFRSQUNFVihwYXJhbSkKKyNlbmRpZgorCisKKy8qID09PT09PT09PT09PSBVdGlsaXR5IGZ1bmN0aW9ucyAqLworI2RlZmluZSB4YmFycmllcigpIGRvIHsgX19hc21fXyBfX3ZvbGF0aWxlX18gKCIiOiA6IDoibWVtb3J5Iik7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgaXNfbmFtZShjKSAgICAgICgoYykgPT0gJ18nIHx8IGlzYWxwaGEoKHVuc2lnbmVkIGNoYXIpKGMpKSkKKyNkZWZpbmUgaXNfaW5fbmFtZShjKSAgICgoYykgPT0gJ18nIHx8IGlzYWxudW0oKHVuc2lnbmVkIGNoYXIpKGMpKSkKKworc3RhdGljIGludCBpc2RpZ2l0X3N0cjkoY29uc3QgY2hhciAqc3RyKQoreworCWludCBtYXhsZW4gPSA5ICsgMTsgLyogbWF4IDkgZGlnaXRzOiA5OTk5OTk5OTkgKi8KKwl3aGlsZSAoLS1tYXhsZW4gJiYgaXNkaWdpdCgqc3RyKSkKKwkJc3RyKys7CisJcmV0dXJuICgqc3RyID09ICdcMCcpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqdmFyX2VuZChjb25zdCBjaGFyICp2YXIpCit7CisJd2hpbGUgKCp2YXIpCisJCWlmICgqdmFyKysgPT0gJz0nKQorCQkJYnJlYWs7CisJcmV0dXJuIHZhcjsKK30KKworCisvKiA9PT09PT09PT09PT0gSW50ZXJydXB0cyAvIGV4Y2VwdGlvbnMgKi8KKworc3RhdGljIHZvaWQgZXhpdHNoZWxsKHZvaWQpIE5PUkVUVVJOOworCisvKgorICogVGhlc2UgbWFjcm9zIGFsbG93IHRoZSB1c2VyIHRvIHN1c3BlbmQgdGhlIGhhbmRsaW5nIG9mIGludGVycnVwdCBzaWduYWxzCisgKiBvdmVyIGEgcGVyaW9kIG9mIHRpbWUuICBUaGlzIGlzIHNpbWlsYXIgdG8gU0lHSE9MRCBvciB0byBzaWdibG9jaywgYnV0CisgKiBtdWNoIG1vcmUgZWZmaWNpZW50IGFuZCBwb3J0YWJsZS4gIChCdXQgaGFja2luZyB0aGUga2VybmVsIGlzIHNvIG11Y2gKKyAqIG1vcmUgZnVuIHRoYW4gd29ycnlpbmcgYWJvdXQgZWZmaWNpZW5jeSBhbmQgcG9ydGFiaWxpdHkuIDotKSkKKyAqLworI2RlZmluZSBJTlRfT0ZGIGRvIHsgXAorCXN1cHByZXNzX2ludCsrOyBcCisJeGJhcnJpZXIoKTsgXAorfSB3aGlsZSAoMCkKKworLyoKKyAqIENhbGxlZCB0byByYWlzZSBhbiBleGNlcHRpb24uICBTaW5jZSBDIGRvZXNuJ3QgaW5jbHVkZSBleGNlcHRpb25zLCB3ZQorICoganVzdCBkbyBhIGxvbmdqbXAgdG8gdGhlIGV4Y2VwdGlvbiBoYW5kbGVyLiAgVGhlIHR5cGUgb2YgZXhjZXB0aW9uIGlzCisgKiBzdG9yZWQgaW4gdGhlIGdsb2JhbCB2YXJpYWJsZSAiZXhjZXB0aW9uX3R5cGUiLgorICovCitzdGF0aWMgdm9pZCByYWlzZV9leGNlcHRpb24oaW50KSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkCityYWlzZV9leGNlcHRpb24oaW50IGUpCit7CisjaWYgREVCVUcKKwlpZiAoZXhjZXB0aW9uX2hhbmRsZXIgPT0gTlVMTCkKKwkJYWJvcnQoKTsKKyNlbmRpZgorCUlOVF9PRkY7CisJZXhjZXB0aW9uX3R5cGUgPSBlOworCWxvbmdqbXAoZXhjZXB0aW9uX2hhbmRsZXItPmxvYywgMSk7Cit9CisjaWYgREVCVUcKKyNkZWZpbmUgcmFpc2VfZXhjZXB0aW9uKGUpIGRvIHsgXAorCVRSQUNFKCgicmFpc2luZyBleGNlcHRpb24gJWQgb24gbGluZSAlZFxuIiwgKGUpLCBfX0xJTkVfXykpOyBcCisJcmFpc2VfZXhjZXB0aW9uKGUpOyBcCit9IHdoaWxlICgwKQorI2VuZGlmCisKKy8qCisgKiBDYWxsZWQgZnJvbSB0cmFwLmMgd2hlbiBhIFNJR0lOVCBpcyByZWNlaXZlZC4gIChJZiB0aGUgdXNlciBzcGVjaWZpZXMKKyAqIHRoYXQgU0lHSU5UIGlzIHRvIGJlIHRyYXBwZWQgb3IgaWdub3JlZCB1c2luZyB0aGUgdHJhcCBidWlsdGluLCB0aGVuCisgKiB0aGlzIHJvdXRpbmUgaXMgbm90IGNhbGxlZC4pICBTdXBwcmVzc2ludCBpcyBub256ZXJvIHdoZW4gaW50ZXJydXB0cworICogYXJlIGhlbGQgdXNpbmcgdGhlIElOVF9PRkYgbWFjcm8uICAoVGhlIHRlc3QgZm9yIGlmbGFnIGlzIGp1c3QKKyAqIGRlZmVuc2l2ZSBwcm9ncmFtbWluZy4pCisgKi8KK3N0YXRpYyB2b2lkIHJhaXNlX2ludGVycnVwdCh2b2lkKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkCityYWlzZV9pbnRlcnJ1cHQodm9pZCkKK3sKKwlpbnQgZXhfdHlwZTsKKworCXBlbmRpbmdfaW50ID0gMDsKKwkvKiBTaWduYWwgaXMgbm90IGF1dG9tYXRpY2FsbHkgdW5tYXNrZWQgYWZ0ZXIgaXQgaXMgcmFpc2VkLAorCSAqIGRvIGl0IG91cnNlbGYgLSB1bm1hc2sgYWxsIHNpZ25hbHMgKi8KKwlzaWdwcm9jbWFza19hbGxzaWdzKFNJR19VTkJMT0NLKTsKKwkvKiBwZW5kaW5nX3NpZyA9IDA7IC0gbm93IGRvbmUgaW4gc2lnbmFsX2hhbmRsZXIoKSAqLworCisJZXhfdHlwZSA9IEVYU0lHOworCWlmIChnb3RzaWdbU0lHSU5UIC0gMV0gJiYgIXRyYXBbU0lHSU5UXSkgeworCQlpZiAoIShyb290c2hlbGwgJiYgaWZsYWcpKSB7CisJCQkvKiBLaWxsIG91cnNlbGYgd2l0aCBTSUdJTlQgKi8KKwkJCXNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworCQkJcmFpc2UoU0lHSU5UKTsKKwkJfQorCQlleF90eXBlID0gRVhJTlQ7CisJfQorCXJhaXNlX2V4Y2VwdGlvbihleF90eXBlKTsKKwkvKiBOT1RSRUFDSEVEICovCit9CisjaWYgREVCVUcKKyNkZWZpbmUgcmFpc2VfaW50ZXJydXB0KCkgZG8geyBcCisJVFJBQ0UoKCJyYWlzaW5nIGludGVycnVwdCBvbiBsaW5lICVkXG4iLCBfX0xJTkVfXykpOyBcCisJcmFpc2VfaW50ZXJydXB0KCk7IFwKK30gd2hpbGUgKDApCisjZW5kaWYKKworc3RhdGljIElGX0FTSF9PUFRJTUlaRV9GT1JfU0laRShpbmxpbmUpIHZvaWQKK2ludF9vbih2b2lkKQoreworCXhiYXJyaWVyKCk7CisJaWYgKC0tc3VwcHJlc3NfaW50ID09IDAgJiYgcGVuZGluZ19pbnQpIHsKKwkJcmFpc2VfaW50ZXJydXB0KCk7CisJfQorfQorI2RlZmluZSBJTlRfT04gaW50X29uKCkKK3N0YXRpYyBJRl9BU0hfT1BUSU1JWkVfRk9SX1NJWkUoaW5saW5lKSB2b2lkCitmb3JjZV9pbnRfb24odm9pZCkKK3sKKwl4YmFycmllcigpOworCXN1cHByZXNzX2ludCA9IDA7CisJaWYgKHBlbmRpbmdfaW50KQorCQlyYWlzZV9pbnRlcnJ1cHQoKTsKK30KKyNkZWZpbmUgRk9SQ0VfSU5UX09OIGZvcmNlX2ludF9vbigpCisKKyNkZWZpbmUgU0FWRV9JTlQodikgKCh2KSA9IHN1cHByZXNzX2ludCkKKworI2RlZmluZSBSRVNUT1JFX0lOVCh2KSBkbyB7IFwKKwl4YmFycmllcigpOyBcCisJc3VwcHJlc3NfaW50ID0gKHYpOyBcCisJaWYgKHN1cHByZXNzX2ludCA9PSAwICYmIHBlbmRpbmdfaW50KSBcCisJCXJhaXNlX2ludGVycnVwdCgpOyBcCit9IHdoaWxlICgwKQorCisKKy8qID09PT09PT09PT09PSBTdGRvdXQvc3RkZXJyIG91dHB1dCAqLworCitzdGF0aWMgdm9pZAorb3V0c3RyKGNvbnN0IGNoYXIgKnAsIEZJTEUgKmZpbGUpCit7CisJSU5UX09GRjsKKwlmcHV0cyhwLCBmaWxlKTsKKwlJTlRfT047Cit9CisKK3N0YXRpYyB2b2lkCitmbHVzaF9zdGRvdXRfc3RkZXJyKHZvaWQpCit7CisJSU5UX09GRjsKKwlmZmx1c2hfYWxsKCk7CisJSU5UX09OOworfQorCisvKiBXYXMgY2FsbGVkIG91dGNzbG93KGMsRklMRSopLCBidXQgYyB3YXMgYWx3YXlzICdcbicgKi8KK3N0YXRpYyB2b2lkCituZXdsaW5lX2FuZF9mbHVzaChGSUxFICpkZXN0KQoreworCUlOVF9PRkY7CisJcHV0YygnXG4nLCBkZXN0KTsKKwlmZmx1c2goZGVzdCk7CisJSU5UX09OOworfQorCitzdGF0aWMgaW50IG91dDFmbXQoY29uc3QgY2hhciAqLCAuLi4pIF9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18oX19wcmludGZfXywxLDIpKSk7CitzdGF0aWMgaW50CitvdXQxZm10KGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXA7CisJaW50IHI7CisKKwlJTlRfT0ZGOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCXIgPSB2cHJpbnRmKGZtdCwgYXApOworCXZhX2VuZChhcCk7CisJSU5UX09OOworCXJldHVybiByOworfQorCitzdGF0aWMgaW50IGZtdHN0cihjaGFyICosIHNpemVfdCwgY29uc3QgY2hhciAqLCAuLi4pIF9fYXR0cmlidXRlX18oKF9fZm9ybWF0X18oX19wcmludGZfXywzLDQpKSk7CitzdGF0aWMgaW50CitmbXRzdHIoY2hhciAqb3V0YnVmLCBzaXplX3QgbGVuZ3RoLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWludCByZXQ7CisKKwl2YV9zdGFydChhcCwgZm10KTsKKwlJTlRfT0ZGOworCXJldCA9IHZzbnByaW50ZihvdXRidWYsIGxlbmd0aCwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlJTlRfT047CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQKK291dDFzdHIoY29uc3QgY2hhciAqcCkKK3sKKwlvdXRzdHIocCwgc3Rkb3V0KTsKK30KKworc3RhdGljIHZvaWQKK291dDJzdHIoY29uc3QgY2hhciAqcCkKK3sKKwlvdXRzdHIocCwgc3RkZXJyKTsKKwlmbHVzaF9zdGRvdXRfc3RkZXJyKCk7Cit9CisKKworLyogPT09PT09PT09PT09IFBhcnNlciBzdHJ1Y3R1cmVzICovCisKKy8qIGNvbnRyb2wgY2hhcmFjdGVycyBpbiBhcmd1bWVudCBzdHJpbmdzICovCisjZGVmaW5lIENUTF9GSVJTVCBDVExFU0MKKyNkZWZpbmUgQ1RMRVNDICAgICAgICgodW5zaWduZWQgY2hhciknXDIwMScpICAgIC8qIGVzY2FwZSBuZXh0IGNoYXJhY3RlciAqLworI2RlZmluZSBDVExWQVIgICAgICAgKCh1bnNpZ25lZCBjaGFyKSdcMjAyJykgICAgLyogdmFyaWFibGUgZGVmbiAqLworI2RlZmluZSBDVExFTkRWQVIgICAgKCh1bnNpZ25lZCBjaGFyKSdcMjAzJykKKyNkZWZpbmUgQ1RMQkFDS1EgICAgICgodW5zaWduZWQgY2hhciknXDIwNCcpCisjZGVmaW5lIENUTEFSSSAgICAgICAoKHVuc2lnbmVkIGNoYXIpJ1wyMDYnKSAgICAvKiBhcml0aG1ldGljIGV4cHJlc3Npb24gKi8KKyNkZWZpbmUgQ1RMRU5EQVJJICAgICgodW5zaWduZWQgY2hhciknXDIwNycpCisjZGVmaW5lIENUTFFVT1RFTUFSSyAoKHVuc2lnbmVkIGNoYXIpJ1wyMTAnKQorI2RlZmluZSBDVExfTEFTVCBDVExRVU9URU1BUksKKworLyogdmFyaWFibGUgc3Vic3RpdHV0aW9uIGJ5dGUgKGZvbGxvd3MgQ1RMVkFSKSAqLworI2RlZmluZSBWU1RZUEUgIDB4MGYgICAgICAgICAgICAvKiB0eXBlIG9mIHZhcmlhYmxlIHN1YnN0aXR1dGlvbiAqLworI2RlZmluZSBWU05VTCAgIDB4MTAgICAgICAgICAgICAvKiBjb2xvbi0tdHJlYXQgdGhlIGVtcHR5IHN0cmluZyBhcyB1bnNldCAqLworCisvKiB2YWx1ZXMgb2YgVlNUWVBFIGZpZWxkICovCisjZGVmaW5lIFZTTk9STUFMICAgICAgICAweDEgICAgIC8qIG5vcm1hbCB2YXJpYWJsZTogICR2YXIgb3IgJHt2YXJ9ICovCisjZGVmaW5lIFZTTUlOVVMgICAgICAgICAweDIgICAgIC8qICR7dmFyLXRleHR9ICovCisjZGVmaW5lIFZTUExVUyAgICAgICAgICAweDMgICAgIC8qICR7dmFyK3RleHR9ICovCisjZGVmaW5lIFZTUVVFU1RJT04gICAgICAweDQgICAgIC8qICR7dmFyP21lc3NhZ2V9ICovCisjZGVmaW5lIFZTQVNTSUdOICAgICAgICAweDUgICAgIC8qICR7dmFyPXRleHR9ICovCisjZGVmaW5lIFZTVFJJTVJJR0hUICAgICAweDYgICAgIC8qICR7dmFyJXBhdHRlcm59ICovCisjZGVmaW5lIFZTVFJJTVJJR0hUTUFYICAweDcgICAgIC8qICR7dmFyJSVwYXR0ZXJufSAqLworI2RlZmluZSBWU1RSSU1MRUZUICAgICAgMHg4ICAgICAvKiAke3ZhciNwYXR0ZXJufSAqLworI2RlZmluZSBWU1RSSU1MRUZUTUFYICAgMHg5ICAgICAvKiAke3ZhciMjcGF0dGVybn0gKi8KKyNkZWZpbmUgVlNMRU5HVEggICAgICAgIDB4YSAgICAgLyogJHsjdmFyfSAqLworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKyNkZWZpbmUgVlNTVUJTVFIgICAgICAgIDB4YyAgICAgLyogJHt2YXI6cG9zaXRpb246bGVuZ3RofSAqLworI2RlZmluZSBWU1JFUExBQ0UgICAgICAgMHhkICAgICAvKiAke3Zhci9wYXR0ZXJuL3JlcGxhY2VtZW50fSAqLworI2RlZmluZSBWU1JFUExBQ0VBTEwgICAgMHhlICAgICAvKiAke3Zhci8vcGF0dGVybi9yZXBsYWNlbWVudH0gKi8KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgY2hhciBkb2xhdHN0cltdIEFMSUdOMSA9IHsKKwlDVExRVU9URU1BUkssIENUTFZBUiwgVlNOT1JNQUwsICdAJywgJz0nLCBDVExRVU9URU1BUkssICdcMCcKK307CisjZGVmaW5lIERPTEFUU1RSTEVOIDYKKworI2RlZmluZSBOQ01EICAgICAgMAorI2RlZmluZSBOUElQRSAgICAgMQorI2RlZmluZSBOUkVESVIgICAgMgorI2RlZmluZSBOQkFDS0dORCAgMworI2RlZmluZSBOU1VCU0hFTEwgNAorI2RlZmluZSBOQU5EICAgICAgNQorI2RlZmluZSBOT1IgICAgICAgNgorI2RlZmluZSBOU0VNSSAgICAgNworI2RlZmluZSBOSUYgICAgICAgOAorI2RlZmluZSBOV0hJTEUgICAgOQorI2RlZmluZSBOVU5USUwgICAxMAorI2RlZmluZSBORk9SICAgICAxMQorI2RlZmluZSBOQ0FTRSAgICAxMgorI2RlZmluZSBOQ0xJU1QgICAxMworI2RlZmluZSBOREVGVU4gICAxNAorI2RlZmluZSBOQVJHICAgICAxNQorI2RlZmluZSBOVE8gICAgICAxNgorI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKyNkZWZpbmUgTlRPMiAgICAgMTcKKyNlbmRpZgorI2RlZmluZSBOQ0xPQkJFUiAxOAorI2RlZmluZSBORlJPTSAgICAxOQorI2RlZmluZSBORlJPTVRPICAyMAorI2RlZmluZSBOQVBQRU5EICAyMQorI2RlZmluZSBOVE9GRCAgICAyMgorI2RlZmluZSBORlJPTUZEICAyMworI2RlZmluZSBOSEVSRSAgICAyNAorI2RlZmluZSBOWEhFUkUgICAyNQorI2RlZmluZSBOTk9UICAgICAyNgorI2RlZmluZSBOX05VTUJFUiAyNworCit1bmlvbiBub2RlOworCitzdHJ1Y3QgbmNtZCB7CisJc21hbGxpbnQgdHlwZTsgLyogTnh4eHggKi8KKwl1bmlvbiBub2RlICphc3NpZ247CisJdW5pb24gbm9kZSAqYXJnczsKKwl1bmlvbiBub2RlICpyZWRpcmVjdDsKK307CisKK3N0cnVjdCBucGlwZSB7CisJc21hbGxpbnQgdHlwZTsKKwlzbWFsbGludCBwaXBlX2JhY2tnbmQ7CisJc3RydWN0IG5vZGVsaXN0ICpjbWRsaXN0OworfTsKKworc3RydWN0IG5yZWRpciB7CisJc21hbGxpbnQgdHlwZTsKKwl1bmlvbiBub2RlICpuOworCXVuaW9uIG5vZGUgKnJlZGlyZWN0OworfTsKKworc3RydWN0IG5iaW5hcnkgeworCXNtYWxsaW50IHR5cGU7CisJdW5pb24gbm9kZSAqY2gxOworCXVuaW9uIG5vZGUgKmNoMjsKK307CisKK3N0cnVjdCBuaWYgeworCXNtYWxsaW50IHR5cGU7CisJdW5pb24gbm9kZSAqdGVzdDsKKwl1bmlvbiBub2RlICppZnBhcnQ7CisJdW5pb24gbm9kZSAqZWxzZXBhcnQ7Cit9OworCitzdHJ1Y3QgbmZvciB7CisJc21hbGxpbnQgdHlwZTsKKwl1bmlvbiBub2RlICphcmdzOworCXVuaW9uIG5vZGUgKmJvZHk7CisJY2hhciAqdmFyOworfTsKKworc3RydWN0IG5jYXNlIHsKKwlzbWFsbGludCB0eXBlOworCXVuaW9uIG5vZGUgKmV4cHI7CisJdW5pb24gbm9kZSAqY2FzZXM7Cit9OworCitzdHJ1Y3QgbmNsaXN0IHsKKwlzbWFsbGludCB0eXBlOworCXVuaW9uIG5vZGUgKm5leHQ7CisJdW5pb24gbm9kZSAqcGF0dGVybjsKKwl1bmlvbiBub2RlICpib2R5OworfTsKKworc3RydWN0IG5hcmcgeworCXNtYWxsaW50IHR5cGU7CisJdW5pb24gbm9kZSAqbmV4dDsKKwljaGFyICp0ZXh0OworCXN0cnVjdCBub2RlbGlzdCAqYmFja3F1b3RlOworfTsKKworLyogbmZpbGUgYW5kIG5kdXAgbGF5b3V0IG11c3QgbWF0Y2ghCisgKiBOVE9GRCAoPiZmZG51bSkgdXNlcyBuZHVwIHN0cnVjdHVyZSwgYnV0IHdlIG1heSBkaXNjb3ZlciBtaWQtZmxpZ2h0CisgKiB0aGF0IGl0IGlzIGFjdHVhbGx5IE5UTzIgKD4mZmlsZSksIGFuZCBjaGFuZ2UgaXRzIHR5cGUuCisgKi8KK3N0cnVjdCBuZmlsZSB7CisJc21hbGxpbnQgdHlwZTsKKwl1bmlvbiBub2RlICpuZXh0OworCWludCBmZDsKKwlpbnQgX3VudXNlZF9kdXBmZDsKKwl1bmlvbiBub2RlICpmbmFtZTsKKwljaGFyICpleHBmbmFtZTsKK307CisKK3N0cnVjdCBuZHVwIHsKKwlzbWFsbGludCB0eXBlOworCXVuaW9uIG5vZGUgKm5leHQ7CisJaW50IGZkOworCWludCBkdXBmZDsKKwl1bmlvbiBub2RlICp2bmFtZTsKKwljaGFyICpfdW51c2VkX2V4cGZuYW1lOworfTsKKworc3RydWN0IG5oZXJlIHsKKwlzbWFsbGludCB0eXBlOworCXVuaW9uIG5vZGUgKm5leHQ7CisJaW50IGZkOworCXVuaW9uIG5vZGUgKmRvYzsKK307CisKK3N0cnVjdCBubm90IHsKKwlzbWFsbGludCB0eXBlOworCXVuaW9uIG5vZGUgKmNvbTsKK307CisKK3VuaW9uIG5vZGUgeworCXNtYWxsaW50IHR5cGU7CisJc3RydWN0IG5jbWQgbmNtZDsKKwlzdHJ1Y3QgbnBpcGUgbnBpcGU7CisJc3RydWN0IG5yZWRpciBucmVkaXI7CisJc3RydWN0IG5iaW5hcnkgbmJpbmFyeTsKKwlzdHJ1Y3QgbmlmIG5pZjsKKwlzdHJ1Y3QgbmZvciBuZm9yOworCXN0cnVjdCBuY2FzZSBuY2FzZTsKKwlzdHJ1Y3QgbmNsaXN0IG5jbGlzdDsKKwlzdHJ1Y3QgbmFyZyBuYXJnOworCXN0cnVjdCBuZmlsZSBuZmlsZTsKKwlzdHJ1Y3QgbmR1cCBuZHVwOworCXN0cnVjdCBuaGVyZSBuaGVyZTsKKwlzdHJ1Y3Qgbm5vdCBubm90OworfTsKKworLyoKKyAqIE5PREVfRU9GIGlzIHJldHVybmVkIGJ5IHBhcnNlY21kIHdoZW4gaXQgZW5jb3VudGVycyBhbiBlbmQgb2YgZmlsZS4KKyAqIEl0IG11c3QgYmUgZGlzdGluY3QgZnJvbSBOVUxMLgorICovCisjZGVmaW5lIE5PREVfRU9GICgodW5pb24gbm9kZSAqKSAtMUwpCisKK3N0cnVjdCBub2RlbGlzdCB7CisJc3RydWN0IG5vZGVsaXN0ICpuZXh0OworCXVuaW9uIG5vZGUgKm47Cit9OworCitzdHJ1Y3QgZnVuY25vZGUgeworCWludCBjb3VudDsKKwl1bmlvbiBub2RlIG47Cit9OworCisvKgorICogRnJlZSBhIHBhcnNlIHRyZWUuCisgKi8KK3N0YXRpYyB2b2lkCitmcmVlZnVuYyhzdHJ1Y3QgZnVuY25vZGUgKmYpCit7CisJaWYgKGYgJiYgLS1mLT5jb3VudCA8IDApCisJCWZyZWUoZik7Cit9CisKKworLyogPT09PT09PT09PT09IERlYnVnZ2luZyBvdXRwdXQgKi8KKworI2lmIERFQlVHCisKK3N0YXRpYyBGSUxFICp0cmFjZWZpbGU7CisKK3N0YXRpYyB2b2lkCit0cmFjZV9wcmludGYoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCB2YTsKKworCWlmIChkZWJ1ZyAhPSAxKQorCQlyZXR1cm47CisJaWYgKERFQlVHX1RJTUUpCisJCWZwcmludGYodHJhY2VmaWxlLCAiJXUgIiwgKGludCkgdGltZShOVUxMKSk7CisJaWYgKERFQlVHX1BJRCkKKwkJZnByaW50Zih0cmFjZWZpbGUsICJbJXVdICIsIChpbnQpIGdldHBpZCgpKTsKKwlpZiAoREVCVUdfU0lHKQorCQlmcHJpbnRmKHRyYWNlZmlsZSwgInBlbmRpbmcgczolZCBpOiVkKHN1cHA6JWQpICIsIHBlbmRpbmdfc2lnLCBwZW5kaW5nX2ludCwgc3VwcHJlc3NfaW50KTsKKwl2YV9zdGFydCh2YSwgZm10KTsKKwl2ZnByaW50Zih0cmFjZWZpbGUsIGZtdCwgdmEpOworCXZhX2VuZCh2YSk7Cit9CisKK3N0YXRpYyB2b2lkCit0cmFjZV92cHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCB2YSkKK3sKKwlpZiAoZGVidWcgIT0gMSkKKwkJcmV0dXJuOworCWlmIChERUJVR19USU1FKQorCQlmcHJpbnRmKHRyYWNlZmlsZSwgIiV1ICIsIChpbnQpIHRpbWUoTlVMTCkpOworCWlmIChERUJVR19QSUQpCisJCWZwcmludGYodHJhY2VmaWxlLCAiWyV1XSAiLCAoaW50KSBnZXRwaWQoKSk7CisJaWYgKERFQlVHX1NJRykKKwkJZnByaW50Zih0cmFjZWZpbGUsICJwZW5kaW5nIHM6JWQgaTolZChzdXBwOiVkKSAiLCBwZW5kaW5nX3NpZywgcGVuZGluZ19pbnQsIHN1cHByZXNzX2ludCk7CisJdmZwcmludGYodHJhY2VmaWxlLCBmbXQsIHZhKTsKK30KKworc3RhdGljIHZvaWQKK3RyYWNlX3B1dHMoY29uc3QgY2hhciAqcykKK3sKKwlpZiAoZGVidWcgIT0gMSkKKwkJcmV0dXJuOworCWZwdXRzKHMsIHRyYWNlZmlsZSk7Cit9CisKK3N0YXRpYyB2b2lkCit0cmFjZV9wdXRzX3F1b3RlZChjaGFyICpzKQoreworCWNoYXIgKnA7CisJY2hhciBjOworCisJaWYgKGRlYnVnICE9IDEpCisJCXJldHVybjsKKwlwdXRjKCciJywgdHJhY2VmaWxlKTsKKwlmb3IgKHAgPSBzOyAqcDsgcCsrKSB7CisJCXN3aXRjaCAoKHVuc2lnbmVkIGNoYXIpKnApIHsKKwkJY2FzZSAnXG4nOiBjID0gJ24nOyBnb3RvIGJhY2tzbGFzaDsKKwkJY2FzZSAnXHQnOiBjID0gJ3QnOyBnb3RvIGJhY2tzbGFzaDsKKwkJY2FzZSAnXHInOiBjID0gJ3InOyBnb3RvIGJhY2tzbGFzaDsKKwkJY2FzZSAnXCInOiBjID0gJ1wiJzsgZ290byBiYWNrc2xhc2g7CisJCWNhc2UgJ1xcJzogYyA9ICdcXCc7IGdvdG8gYmFja3NsYXNoOworCQljYXNlIENUTEVTQzogYyA9ICdlJzsgZ290byBiYWNrc2xhc2g7CisJCWNhc2UgQ1RMVkFSOiBjID0gJ3YnOyBnb3RvIGJhY2tzbGFzaDsKKwkJY2FzZSBDVExCQUNLUTogYyA9ICdxJzsgZ290byBiYWNrc2xhc2g7CisgYmFja3NsYXNoOgorCQkJcHV0YygnXFwnLCB0cmFjZWZpbGUpOworCQkJcHV0YyhjLCB0cmFjZWZpbGUpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoKnAgPj0gJyAnICYmICpwIDw9ICd+JykKKwkJCQlwdXRjKCpwLCB0cmFjZWZpbGUpOworCQkJZWxzZSB7CisJCQkJcHV0YygnXFwnLCB0cmFjZWZpbGUpOworCQkJCXB1dGMoKCpwID4+IDYpICYgMDMsIHRyYWNlZmlsZSk7CisJCQkJcHV0YygoKnAgPj4gMykgJiAwNywgdHJhY2VmaWxlKTsKKwkJCQlwdXRjKCpwICYgMDcsIHRyYWNlZmlsZSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KKwlwdXRjKCciJywgdHJhY2VmaWxlKTsKK30KKworc3RhdGljIHZvaWQKK3RyYWNlX3B1dHNfYXJncyhjaGFyICoqYXApCit7CisJaWYgKGRlYnVnICE9IDEpCisJCXJldHVybjsKKwlpZiAoISphcCkKKwkJcmV0dXJuOworCXdoaWxlICgxKSB7CisJCXRyYWNlX3B1dHNfcXVvdGVkKCphcCk7CisJCWlmICghKisrYXApIHsKKwkJCXB1dGMoJ1xuJywgdHJhY2VmaWxlKTsKKwkJCWJyZWFrOworCQl9CisJCXB1dGMoJyAnLCB0cmFjZWZpbGUpOworCX0KK30KKworc3RhdGljIHZvaWQKK29wZW50cmFjZSh2b2lkKQoreworCWNoYXIgc1sxMDBdOworI2lmZGVmIE9fQVBQRU5ECisJaW50IGZsYWdzOworI2VuZGlmCisKKwlpZiAoZGVidWcgIT0gMSkgeworCQlpZiAodHJhY2VmaWxlKQorCQkJZmZsdXNoKHRyYWNlZmlsZSk7CisJCS8qIGxlYXZlIG9wZW4gYmVjYXVzZSBsaWJlZGl0IG1pZ2h0IGJlIHVzaW5nIGl0ICovCisJCXJldHVybjsKKwl9CisJc3RyY3B5KHMsICIuL3RyYWNlIik7CisJaWYgKHRyYWNlZmlsZSkgeworCQlpZiAoIWZyZW9wZW4ocywgImEiLCB0cmFjZWZpbGUpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbid0IHJlLW9wZW4gJXNcbiIsIHMpOworCQkJZGVidWcgPSAwOworCQkJcmV0dXJuOworCQl9CisJfSBlbHNlIHsKKwkJdHJhY2VmaWxlID0gZm9wZW4ocywgImEiKTsKKwkJaWYgKHRyYWNlZmlsZSA9PSBOVUxMKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIkNhbid0IG9wZW4gJXNcbiIsIHMpOworCQkJZGVidWcgPSAwOworCQkJcmV0dXJuOworCQl9CisJfQorI2lmZGVmIE9fQVBQRU5ECisJZmxhZ3MgPSBmY250bChmaWxlbm8odHJhY2VmaWxlKSwgRl9HRVRGTCk7CisJaWYgKGZsYWdzID49IDApCisJCWZjbnRsKGZpbGVubyh0cmFjZWZpbGUpLCBGX1NFVEZMLCBmbGFncyB8IE9fQVBQRU5EKTsKKyNlbmRpZgorCXNldGxpbmVidWYodHJhY2VmaWxlKTsKKwlmcHV0cygiXG5UcmFjaW5nIHN0YXJ0ZWQuXG4iLCB0cmFjZWZpbGUpOworfQorCitzdGF0aWMgdm9pZAoraW5kZW50KGludCBhbW91bnQsIGNoYXIgKnBmeCwgRklMRSAqZnApCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgYW1vdW50OyBpKyspIHsKKwkJaWYgKHBmeCAmJiBpID09IGFtb3VudCAtIDEpCisJCQlmcHV0cyhwZngsIGZwKTsKKwkJcHV0YygnXHQnLCBmcCk7CisJfQorfQorCisvKiBsaXR0bGUgY2lyY3VsYXIgcmVmZXJlbmNlcyBoZXJlLi4uICovCitzdGF0aWMgdm9pZCBzaHRyZWUodW5pb24gbm9kZSAqbiwgaW50IGluZCwgY2hhciAqcGZ4LCBGSUxFICpmcCk7CisKK3N0YXRpYyB2b2lkCitzaGFyZyh1bmlvbiBub2RlICphcmcsIEZJTEUgKmZwKQoreworCWNoYXIgKnA7CisJc3RydWN0IG5vZGVsaXN0ICpicWxpc3Q7CisJdW5zaWduZWQgY2hhciBzdWJ0eXBlOworCisJaWYgKGFyZy0+dHlwZSAhPSBOQVJHKSB7CisJCW91dDFmbXQoIjxub2RlIHR5cGUgJWQ+XG4iLCBhcmctPnR5cGUpOworCQlhYm9ydCgpOworCX0KKwlicWxpc3QgPSBhcmctPm5hcmcuYmFja3F1b3RlOworCWZvciAocCA9IGFyZy0+bmFyZy50ZXh0OyAqcDsgcCsrKSB7CisJCXN3aXRjaCAoKHVuc2lnbmVkIGNoYXIpKnApIHsKKwkJY2FzZSBDVExFU0M6CisJCQlwKys7CisJCQlwdXRjKCpwLCBmcCk7CisJCQlicmVhazsKKwkJY2FzZSBDVExWQVI6CisJCQlwdXRjKCckJywgZnApOworCQkJcHV0YygneycsIGZwKTsKKwkJCXN1YnR5cGUgPSAqKytwOworCQkJaWYgKHN1YnR5cGUgPT0gVlNMRU5HVEgpCisJCQkJcHV0YygnIycsIGZwKTsKKworCQkJd2hpbGUgKCpwICE9ICc9JykgeworCQkJCXB1dGMoKnAsIGZwKTsKKwkJCQlwKys7CisJCQl9CisKKwkJCWlmIChzdWJ0eXBlICYgVlNOVUwpCisJCQkJcHV0YygnOicsIGZwKTsKKworCQkJc3dpdGNoIChzdWJ0eXBlICYgVlNUWVBFKSB7CisJCQljYXNlIFZTTk9STUFMOgorCQkJCXB1dGMoJ30nLCBmcCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTTUlOVVM6CisJCQkJcHV0YygnLScsIGZwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNQTFVTOgorCQkJCXB1dGMoJysnLCBmcCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFZTUVVFU1RJT046CisJCQkJcHV0YygnPycsIGZwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNBU1NJR046CisJCQkJcHV0YygnPScsIGZwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNUUklNTEVGVDoKKwkJCQlwdXRjKCcjJywgZnApOworCQkJCWJyZWFrOworCQkJY2FzZSBWU1RSSU1MRUZUTUFYOgorCQkJCXB1dGMoJyMnLCBmcCk7CisJCQkJcHV0YygnIycsIGZwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNUUklNUklHSFQ6CisJCQkJcHV0YygnJScsIGZwKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgVlNUUklNUklHSFRNQVg6CisJCQkJcHV0YygnJScsIGZwKTsKKwkJCQlwdXRjKCclJywgZnApOworCQkJCWJyZWFrOworCQkJY2FzZSBWU0xFTkdUSDoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJb3V0MWZtdCgiPHN1YnR5cGUgJWQ+Iiwgc3VidHlwZSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDVExFTkRWQVI6CisJCQlwdXRjKCd9JywgZnApOworCQkJYnJlYWs7CisJCWNhc2UgQ1RMQkFDS1E6CisJCQlwdXRjKCckJywgZnApOworCQkJcHV0YygnKCcsIGZwKTsKKwkJCXNodHJlZShicWxpc3QtPm4sIC0xLCBOVUxMLCBmcCk7CisJCQlwdXRjKCcpJywgZnApOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwdXRjKCpwLCBmcCk7CisJCQlicmVhazsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK3NoY21kKHVuaW9uIG5vZGUgKmNtZCwgRklMRSAqZnApCit7CisJdW5pb24gbm9kZSAqbnA7CisJaW50IGZpcnN0OworCWNvbnN0IGNoYXIgKnM7CisJaW50IGRmdGZkOworCisJZmlyc3QgPSAxOworCWZvciAobnAgPSBjbWQtPm5jbWQuYXJnczsgbnA7IG5wID0gbnAtPm5hcmcubmV4dCkgeworCQlpZiAoIWZpcnN0KQorCQkJcHV0YygnICcsIGZwKTsKKwkJc2hhcmcobnAsIGZwKTsKKwkJZmlyc3QgPSAwOworCX0KKwlmb3IgKG5wID0gY21kLT5uY21kLnJlZGlyZWN0OyBucDsgbnAgPSBucC0+bmZpbGUubmV4dCkgeworCQlpZiAoIWZpcnN0KQorCQkJcHV0YygnICcsIGZwKTsKKwkJZGZ0ZmQgPSAwOworCQlzd2l0Y2ggKG5wLT5uZmlsZS50eXBlKSB7CisJCWNhc2UgTlRPOiAgICAgIHMgPSAiPj4iKzE7IGRmdGZkID0gMTsgYnJlYWs7CisJCWNhc2UgTkNMT0JCRVI6IHMgPSAiPnwiOyBkZnRmZCA9IDE7IGJyZWFrOworCQljYXNlIE5BUFBFTkQ6ICBzID0gIj4+IjsgZGZ0ZmQgPSAxOyBicmVhazsKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJCWNhc2UgTlRPMjoKKyNlbmRpZgorCQljYXNlIE5UT0ZEOiAgICBzID0gIj4mIjsgZGZ0ZmQgPSAxOyBicmVhazsKKwkJY2FzZSBORlJPTTogICAgcyA9ICI8IjsgYnJlYWs7CisJCWNhc2UgTkZST01GRDogIHMgPSAiPCYiOyBicmVhazsKKwkJY2FzZSBORlJPTVRPOiAgcyA9ICI8PiI7IGJyZWFrOworCQlkZWZhdWx0OiAgICAgICBzID0gIiplcnJvcioiOyBicmVhazsKKwkJfQorCQlpZiAobnAtPm5maWxlLmZkICE9IGRmdGZkKQorCQkJZnByaW50ZihmcCwgIiVkIiwgbnAtPm5maWxlLmZkKTsKKwkJZnB1dHMocywgZnApOworCQlpZiAobnAtPm5maWxlLnR5cGUgPT0gTlRPRkQgfHwgbnAtPm5maWxlLnR5cGUgPT0gTkZST01GRCkgeworCQkJZnByaW50ZihmcCwgIiVkIiwgbnAtPm5kdXAuZHVwZmQpOworCQl9IGVsc2UgeworCQkJc2hhcmcobnAtPm5maWxlLmZuYW1lLCBmcCk7CisJCX0KKwkJZmlyc3QgPSAwOworCX0KK30KKworc3RhdGljIHZvaWQKK3NodHJlZSh1bmlvbiBub2RlICpuLCBpbnQgaW5kLCBjaGFyICpwZngsIEZJTEUgKmZwKQoreworCXN0cnVjdCBub2RlbGlzdCAqbHA7CisJY29uc3QgY2hhciAqczsKKworCWlmIChuID09IE5VTEwpCisJCXJldHVybjsKKworCWluZGVudChpbmQsIHBmeCwgZnApOworCisJaWYgKG4gPT0gTk9ERV9FT0YpIHsKKwkJZnB1dHMoIjxFT0Y+IiwgZnApOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChuLT50eXBlKSB7CisJY2FzZSBOU0VNSToKKwkJcyA9ICI7ICI7CisJCWdvdG8gYmlub3A7CisJY2FzZSBOQU5EOgorCQlzID0gIiAmJiAiOworCQlnb3RvIGJpbm9wOworCWNhc2UgTk9SOgorCQlzID0gIiB8fCAiOworIGJpbm9wOgorCQlzaHRyZWUobi0+bmJpbmFyeS5jaDEsIGluZCwgTlVMTCwgZnApOworCQkvKiBpZiAoaW5kIDwgMCkgKi8KKwkJCWZwdXRzKHMsIGZwKTsKKwkJc2h0cmVlKG4tPm5iaW5hcnkuY2gyLCBpbmQsIE5VTEwsIGZwKTsKKwkJYnJlYWs7CisJY2FzZSBOQ01EOgorCQlzaGNtZChuLCBmcCk7CisJCWlmIChpbmQgPj0gMCkKKwkJCXB1dGMoJ1xuJywgZnApOworCQlicmVhazsKKwljYXNlIE5QSVBFOgorCQlmb3IgKGxwID0gbi0+bnBpcGUuY21kbGlzdDsgbHA7IGxwID0gbHAtPm5leHQpIHsKKwkJCXNodHJlZShscC0+biwgMCwgTlVMTCwgZnApOworCQkJaWYgKGxwLT5uZXh0KQorCQkJCWZwdXRzKCIgfCAiLCBmcCk7CisJCX0KKwkJaWYgKG4tPm5waXBlLnBpcGVfYmFja2duZCkKKwkJCWZwdXRzKCIgJiIsIGZwKTsKKwkJaWYgKGluZCA+PSAwKQorCQkJcHV0YygnXG4nLCBmcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwcmludGYoZnAsICI8bm9kZSB0eXBlICVkPiIsIG4tPnR5cGUpOworCQlpZiAoaW5kID49IDApCisJCQlwdXRjKCdcbicsIGZwKTsKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgdm9pZAorc2hvd3RyZWUodW5pb24gbm9kZSAqbikKK3sKKwl0cmFjZV9wdXRzKCJzaG93dHJlZSBjYWxsZWRcbiIpOworCXNodHJlZShuLCAxLCBOVUxMLCBzdGRlcnIpOworfQorCisjZW5kaWYgLyogREVCVUcgKi8KKworCisvKiA9PT09PT09PT09PT0gUGFyc2VyIGRhdGEgKi8KKworLyoKKyAqIGFzaF92bXNnKCkgbmVlZHMgcGFyc2VmaWxlLT5mZCwgaGVuY2UgcGFyc2VmaWxlIGRlZmluaXRpb24gaXMgbW92ZWQgdXAuCisgKi8KK3N0cnVjdCBzdHJsaXN0IHsKKwlzdHJ1Y3Qgc3RybGlzdCAqbmV4dDsKKwljaGFyICp0ZXh0OworfTsKKworc3RydWN0IGFsaWFzOworCitzdHJ1Y3Qgc3RycHVzaCB7CisJc3RydWN0IHN0cnB1c2ggKnByZXY7ICAgLyogcHJlY2VkaW5nIHN0cmluZyBvbiBzdGFjayAqLworCWNoYXIgKnByZXZfc3RyaW5nOworCWludCBwcmV2X2xlZnRfaW5fbGluZTsKKyNpZiBFTkFCTEVfQVNIX0FMSUFTCisJc3RydWN0IGFsaWFzICphcDsgICAgICAgLyogaWYgcHVzaCB3YXMgYXNzb2NpYXRlZCB3aXRoIGFuIGFsaWFzICovCisjZW5kaWYKKwljaGFyICpzdHJpbmc7ICAgICAgICAgICAvKiByZW1lbWJlciB0aGUgc3RyaW5nIHNpbmNlIGl0IG1heSBjaGFuZ2UgKi8KK307CisKK3N0cnVjdCBwYXJzZWZpbGUgeworCXN0cnVjdCBwYXJzZWZpbGUgKnByZXY7IC8qIHByZWNlZGluZyBmaWxlIG9uIHN0YWNrICovCisJaW50IGxpbm5vOyAgICAgICAgICAgICAgLyogY3VycmVudCBsaW5lICovCisJaW50IHBmX2ZkOyAgICAgICAgICAgICAgLyogZmlsZSBkZXNjcmlwdG9yIChvciAtMSBpZiBzdHJpbmcpICovCisJaW50IGxlZnRfaW5fbGluZTsgICAgICAgLyogbnVtYmVyIG9mIGNoYXJzIGxlZnQgaW4gdGhpcyBsaW5lICovCisJaW50IGxlZnRfaW5fYnVmZmVyOyAgICAgLyogbnVtYmVyIG9mIGNoYXJzIGxlZnQgaW4gdGhpcyBidWZmZXIgcGFzdCB0aGUgbGluZSAqLworCWNoYXIgKm5leHRfdG9fcGdldGM7ICAgIC8qIG5leHQgY2hhciBpbiBidWZmZXIgKi8KKwljaGFyICpidWY7ICAgICAgICAgICAgICAvKiBpbnB1dCBidWZmZXIgKi8KKwlzdHJ1Y3Qgc3RycHVzaCAqc3RycHVzaDsgLyogZm9yIHB1c2hpbmcgc3RyaW5ncyBhdCB0aGlzIGxldmVsICovCisJc3RydWN0IHN0cnB1c2ggYmFzZXN0cnB1c2g7IC8qIHNvIHB1c2hpbmcgb25lIGlzIGZhc3QgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgcGFyc2VmaWxlIGJhc2VwZjsgICAgICAgIC8qIHRvcCBsZXZlbCBpbnB1dCBmaWxlICovCitzdGF0aWMgc3RydWN0IHBhcnNlZmlsZSAqZ19wYXJzZWZpbGUgPSAmYmFzZXBmOyAgLyogY3VycmVudCBpbnB1dCBmaWxlICovCitzdGF0aWMgaW50IHN0YXJ0bGlubm87ICAgICAgICAgICAgICAgICAvKiBsaW5lICMgd2hlcmUgbGFzdCB0b2tlbiBzdGFydGVkICovCitzdGF0aWMgY2hhciAqY29tbWFuZG5hbWU7ICAgICAgICAgICAgICAvKiBjdXJyZW50bHkgZXhlY3V0aW5nIGNvbW1hbmQgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3RybGlzdCAqY21kZW52aXJvbjsgICAgIC8qIGVudmlyb25tZW50IGZvciBidWlsdGluIGNvbW1hbmQgKi8KK3N0YXRpYyB1aW50OF90IGV4aXRzdGF0dXM7ICAgICAgICAgICAgIC8qIGV4aXQgc3RhdHVzIG9mIGxhc3QgY29tbWFuZCAqLworCisKKy8qID09PT09PT09PT09PSBNZXNzYWdlIHByaW50aW5nICovCisKK3N0YXRpYyB2b2lkCithc2hfdm1zZyhjb25zdCBjaGFyICptc2csIHZhX2xpc3QgYXApCit7CisJZnByaW50ZihzdGRlcnIsICIlczogIiwgYXJnMCk7CisJaWYgKGNvbW1hbmRuYW1lKSB7CisJCWlmIChzdHJjbXAoYXJnMCwgY29tbWFuZG5hbWUpKQorCQkJZnByaW50ZihzdGRlcnIsICIlczogIiwgY29tbWFuZG5hbWUpOworCQlpZiAoIWlmbGFnIHx8IGdfcGFyc2VmaWxlLT5wZl9mZCA+IDApCisJCQlmcHJpbnRmKHN0ZGVyciwgImxpbmUgJWQ6ICIsIHN0YXJ0bGlubm8pOworCX0KKwl2ZnByaW50ZihzdGRlcnIsIG1zZywgYXApOworCW5ld2xpbmVfYW5kX2ZsdXNoKHN0ZGVycik7Cit9CisKKy8qCisgKiBFeHZlcnJvciBpcyBjYWxsZWQgdG8gcmFpc2UgdGhlIGVycm9yIGV4Y2VwdGlvbi4gIElmIHRoZSBzZWNvbmQgYXJndW1lbnQKKyAqIGlzIG5vdCBOVUxMIHRoZW4gZXJyb3IgcHJpbnRzIGFuIGVycm9yIG1lc3NhZ2UgdXNpbmcgcHJpbnRmIHN0eWxlCisgKiBmb3JtYXR0aW5nLiAgSXQgdGhlbiByYWlzZXMgdGhlIGVycm9yIGV4Y2VwdGlvbi4KKyAqLworc3RhdGljIHZvaWQgYXNoX3Ztc2dfYW5kX3JhaXNlKGludCwgY29uc3QgY2hhciAqLCB2YV9saXN0KSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkCithc2hfdm1zZ19hbmRfcmFpc2UoaW50IGNvbmQsIGNvbnN0IGNoYXIgKm1zZywgdmFfbGlzdCBhcCkKK3sKKyNpZiBERUJVRworCWlmIChtc2cpIHsKKwkJVFJBQ0UoKCJhc2hfdm1zZ19hbmRfcmFpc2UoJWQsIFwiIiwgY29uZCkpOworCQlUUkFDRVYoKG1zZywgYXApKTsKKwkJVFJBQ0UoKCJcIikgcGlkPSVkXG4iLCBnZXRwaWQoKSkpOworCX0gZWxzZQorCQlUUkFDRSgoImFzaF92bXNnX2FuZF9yYWlzZSglZCwgTlVMTCkgcGlkPSVkXG4iLCBjb25kLCBnZXRwaWQoKSkpOworCWlmIChtc2cpCisjZW5kaWYKKwkJYXNoX3Ztc2cobXNnLCBhcCk7CisKKwlmbHVzaF9zdGRvdXRfc3RkZXJyKCk7CisJcmFpc2VfZXhjZXB0aW9uKGNvbmQpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworc3RhdGljIHZvaWQgYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoY29uc3QgY2hhciAqLCAuLi4pIE5PUkVUVVJOOworc3RhdGljIHZvaWQKK2FzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKGNvbnN0IGNoYXIgKm1zZywgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgbXNnKTsKKwlhc2hfdm1zZ19hbmRfcmFpc2UoRVhFUlJPUiwgbXNnLCBhcCk7CisJLyogTk9UUkVBQ0hFRCAqLworCXZhX2VuZChhcCk7Cit9CisKK3N0YXRpYyB2b2lkIHJhaXNlX2Vycm9yX3N5bnRheChjb25zdCBjaGFyICopIE5PUkVUVVJOOworc3RhdGljIHZvaWQKK3JhaXNlX2Vycm9yX3N5bnRheChjb25zdCBjaGFyICptc2cpCit7CisJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoInN5bnRheCBlcnJvcjogJXMiLCBtc2cpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworc3RhdGljIHZvaWQgYXNoX21zZ19hbmRfcmFpc2UoaW50LCBjb25zdCBjaGFyICosIC4uLikgTk9SRVRVUk47CitzdGF0aWMgdm9pZAorYXNoX21zZ19hbmRfcmFpc2UoaW50IGNvbmQsIGNvbnN0IGNoYXIgKm1zZywgLi4uKQoreworCXZhX2xpc3QgYXA7CisKKwl2YV9zdGFydChhcCwgbXNnKTsKKwlhc2hfdm1zZ19hbmRfcmFpc2UoY29uZCwgbXNnLCBhcCk7CisJLyogTk9UUkVBQ0hFRCAqLworCXZhX2VuZChhcCk7Cit9CisKKy8qCisgKiBlcnJvci93YXJuaW5nIHJvdXRpbmVzIGZvciBleHRlcm5hbCBidWlsdGlucworICovCitzdGF0aWMgdm9pZAorYXNoX21zZyhjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJYXNoX3Ztc2coZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKK30KKworLyoKKyAqIFJldHVybiBhIHN0cmluZyBkZXNjcmliaW5nIGFuIGVycm9yLiAgVGhlIHJldHVybmVkIHN0cmluZyBtYXkgYmUgYQorICogcG9pbnRlciB0byBhIHN0YXRpYyBidWZmZXIgdGhhdCB3aWxsIGJlIG92ZXJ3cml0dGVuIG9uIHRoZSBuZXh0IGNhbGwuCisgKiBBY3Rpb24gZGVzY3JpYmVzIHRoZSBvcGVyYXRpb24gdGhhdCBnb3QgdGhlIGVycm9yLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCitlcnJtc2coaW50IGUsIGNvbnN0IGNoYXIgKmVtKQoreworCWlmIChlID09IEVOT0VOVCB8fCBlID09IEVOT1RESVIpIHsKKwkJcmV0dXJuIGVtOworCX0KKwlyZXR1cm4gc3RyZXJyb3IoZSk7Cit9CisKKworLyogPT09PT09PT09PT09IE1lbW9yeSBhbGxvY2F0aW9uICovCisKKyNpZiAwCisvKiBJIGNvbnNpZGVyIHRoZXNlIHdyYXBwZXJzIG5lYXJseSB1c2VsZXNzOgorICogb2ssIHRoZXkgcmV0dXJuIHlvdSB0byBuZWFyZXN0IGV4Y2VwdGlvbiBoYW5kbGVyLCBidXQKKyAqIGhvdyBtdWNoIG1lbW9yeSBkbyB5b3UgbGVhayBpbiB0aGUgcHJvY2VzcywgbWFraW5nCisgKiBtZW1vcnkgc3RhcnZhdGlvbiB3b3JzZT8KKyAqLworc3RhdGljIHZvaWQgKgorY2tyZWFsbG9jKHZvaWQgKiBwLCBzaXplX3QgbmJ5dGVzKQoreworCXAgPSByZWFsbG9jKHAsIG5ieXRlcyk7CisJaWYgKCFwKQorCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcihiYl9tc2dfbWVtb3J5X2V4aGF1c3RlZCk7CisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyB2b2lkICoKK2NrbWFsbG9jKHNpemVfdCBuYnl0ZXMpCit7CisJcmV0dXJuIGNrcmVhbGxvYyhOVUxMLCBuYnl0ZXMpOworfQorCitzdGF0aWMgdm9pZCAqCitja3phbGxvYyhzaXplX3QgbmJ5dGVzKQoreworCXJldHVybiBtZW1zZXQoY2ttYWxsb2MobmJ5dGVzKSwgMCwgbmJ5dGVzKTsKK30KKworc3RhdGljIGNoYXIgKgorY2tzdHJkdXAoY29uc3QgY2hhciAqcykKK3sKKwljaGFyICpwID0gc3RyZHVwKHMpOworCWlmICghcCkKKwkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoYmJfbXNnX21lbW9yeV9leGhhdXN0ZWQpOworCXJldHVybiBwOworfQorI2Vsc2UKKy8qIFVzaW5nIGJib3ggZXF1aXZhbGVudHMuIFRoZXkgZXhpdCBpZiBvdXQgb2YgbWVtb3J5ICovCisjIGRlZmluZSBja3JlYWxsb2MgeHJlYWxsb2MKKyMgZGVmaW5lIGNrbWFsbG9jICB4bWFsbG9jCisjIGRlZmluZSBja3phbGxvYyAgeHphbGxvYworIyBkZWZpbmUgY2tzdHJkdXAgIHhzdHJkdXAKKyNlbmRpZgorCisvKgorICogSXQgYXBwZWFycyB0aGF0IGdyYWJzdGFja3N0cigpIHdpbGwgYmFyZiB3aXRoIHN1Y2ggYWxpZ25tZW50cworICogYmVjYXVzZSBzdGFsbG9jKCkgd2lsbCByZXR1cm4gYSBzdHJpbmcgYWxsb2NhdGVkIGluIGEgbmV3IHN0YWNrYmxvY2suCisgKi8KKyNkZWZpbmUgU0hFTExfQUxJR04obmJ5dGVzKSAoKChuYnl0ZXMpICsgU0hFTExfU0laRSkgJiB+U0hFTExfU0laRSkKK2VudW0geworCS8qIE1vc3QgbWFjaGluZXMgcmVxdWlyZSB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBtYWxsb2MgdG8gYmUgYWxpZ25lZAorCSAqIGluIHNvbWUgd2F5LiAgVGhlIGZvbGxvd2luZyBtYWNybyB3aWxsIGdldCB0aGlzIHJpZ2h0CisJICogb24gbWFueSBtYWNoaW5lcy4gICovCisJU0hFTExfU0laRSA9IHNpemVvZih1bmlvbiB7IGludCBpOyBjaGFyICpjcDsgZG91YmxlIGQ7IH0pIC0gMSwKKwkvKiBNaW5pbXVtIHNpemUgb2YgYSBibG9jayAqLworCU1JTlNJWkUgPSBTSEVMTF9BTElHTig1MDQpLAorfTsKKworc3RydWN0IHN0YWNrX2Jsb2NrIHsKKwlzdHJ1Y3Qgc3RhY2tfYmxvY2sgKnByZXY7CisJY2hhciBzcGFjZVtNSU5TSVpFXTsKK307CisKK3N0cnVjdCBzdGFja21hcmsgeworCXN0cnVjdCBzdGFja19ibG9jayAqc3RhY2twOworCWNoYXIgKnN0YWNrbnh0OworCXNpemVfdCBzdGFja25sZWZ0OworCXN0cnVjdCBzdGFja21hcmsgKm1hcmtuZXh0OworfTsKKworCitzdHJ1Y3QgZ2xvYmFsc19tZW1zdGFjayB7CisJc3RydWN0IHN0YWNrX2Jsb2NrICpnX3N0YWNrcDsgLy8gPSAmc3RhY2tiYXNlOworCXN0cnVjdCBzdGFja21hcmsgKm1hcmtwOworCWNoYXIgKmdfc3RhY2tueHQ7IC8vID0gc3RhY2tiYXNlLnNwYWNlOworCWNoYXIgKnNzdHJlbmQ7IC8vID0gc3RhY2tiYXNlLnNwYWNlICsgTUlOU0laRTsKKwlzaXplX3QgZ19zdGFja25sZWZ0OyAvLyA9IE1JTlNJWkU7CisJaW50ICAgIGhlcmVmZDsgLy8gPSAtMTsKKwlzdHJ1Y3Qgc3RhY2tfYmxvY2sgc3RhY2tiYXNlOworfTsKK2V4dGVybiBzdHJ1Y3QgZ2xvYmFsc19tZW1zdGFjayAqY29uc3QgYXNoX3B0cl90b19nbG9iYWxzX21lbXN0YWNrOworI2RlZmluZSBHX21lbXN0YWNrICgqYXNoX3B0cl90b19nbG9iYWxzX21lbXN0YWNrKQorI2RlZmluZSBnX3N0YWNrcCAgICAgKEdfbWVtc3RhY2suZ19zdGFja3AgICAgKQorI2RlZmluZSBtYXJrcCAgICAgICAgKEdfbWVtc3RhY2subWFya3AgICAgICAgKQorI2RlZmluZSBnX3N0YWNrbnh0ICAgKEdfbWVtc3RhY2suZ19zdGFja254dCAgKQorI2RlZmluZSBzc3RyZW5kICAgICAgKEdfbWVtc3RhY2suc3N0cmVuZCAgICAgKQorI2RlZmluZSBnX3N0YWNrbmxlZnQgKEdfbWVtc3RhY2suZ19zdGFja25sZWZ0KQorI2RlZmluZSBoZXJlZmQgICAgICAgKEdfbWVtc3RhY2suaGVyZWZkICAgICAgKQorI2RlZmluZSBzdGFja2Jhc2UgICAgKEdfbWVtc3RhY2suc3RhY2tiYXNlICAgKQorI2RlZmluZSBJTklUX0dfbWVtc3RhY2soKSBkbyB7IFwKKwkoKihzdHJ1Y3QgZ2xvYmFsc19tZW1zdGFjayoqKSZhc2hfcHRyX3RvX2dsb2JhbHNfbWVtc3RhY2spID0geHphbGxvYyhzaXplb2YoR19tZW1zdGFjaykpOyBcCisJYmFycmllcigpOyBcCisJZ19zdGFja3AgPSAmc3RhY2tiYXNlOyBcCisJZ19zdGFja254dCA9IHN0YWNrYmFzZS5zcGFjZTsgXAorCWdfc3RhY2tubGVmdCA9IE1JTlNJWkU7IFwKKwlzc3RyZW5kID0gc3RhY2tiYXNlLnNwYWNlICsgTUlOU0laRTsgXAorCWhlcmVmZCA9IC0xOyBcCit9IHdoaWxlICgwKQorCisKKyNkZWZpbmUgc3RhY2tibG9jaygpICAgICAoKHZvaWQgKilnX3N0YWNrbnh0KQorI2RlZmluZSBzdGFja2Jsb2Nrc2l6ZSgpIGdfc3RhY2tubGVmdAorCisvKgorICogUGFyc2UgdHJlZXMgZm9yIGNvbW1hbmRzIGFyZSBhbGxvY2F0ZWQgaW4gbGlmbyBvcmRlciwgc28gd2UgdXNlIGEgc3RhY2sKKyAqIHRvIG1ha2UgdGhpcyBtb3JlIGVmZmljaWVudCwgYW5kIGFsc28gdG8gYXZvaWQgYWxsIHNvcnRzIG9mIGV4Y2VwdGlvbgorICogaGFuZGxpbmcgY29kZSB0byBoYW5kbGUgaW50ZXJydXB0cyBpbiB0aGUgbWlkZGxlIG9mIGEgcGFyc2UuCisgKgorICogVGhlIHNpemUgNTA0IHdhcyBjaG9zZW4gYmVjYXVzZSB0aGUgVWx0cml4IG1hbGxvYyBoYW5kbGVzIHRoYXQgc2l6ZQorICogd2VsbC4KKyAqLworc3RhdGljIHZvaWQgKgorc3RhbGxvYyhzaXplX3QgbmJ5dGVzKQoreworCWNoYXIgKnA7CisJc2l6ZV90IGFsaWduZWQ7CisKKwlhbGlnbmVkID0gU0hFTExfQUxJR04obmJ5dGVzKTsKKwlpZiAoYWxpZ25lZCA+IGdfc3RhY2tubGVmdCkgeworCQlzaXplX3QgbGVuOworCQlzaXplX3QgYmxvY2tzaXplOworCQlzdHJ1Y3Qgc3RhY2tfYmxvY2sgKnNwOworCisJCWJsb2Nrc2l6ZSA9IGFsaWduZWQ7CisJCWlmIChibG9ja3NpemUgPCBNSU5TSVpFKQorCQkJYmxvY2tzaXplID0gTUlOU0laRTsKKwkJbGVuID0gc2l6ZW9mKHN0cnVjdCBzdGFja19ibG9jaykgLSBNSU5TSVpFICsgYmxvY2tzaXplOworCQlpZiAobGVuIDwgYmxvY2tzaXplKQorCQkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoYmJfbXNnX21lbW9yeV9leGhhdXN0ZWQpOworCQlJTlRfT0ZGOworCQlzcCA9IGNrbWFsbG9jKGxlbik7CisJCXNwLT5wcmV2ID0gZ19zdGFja3A7CisJCWdfc3RhY2tueHQgPSBzcC0+c3BhY2U7CisJCWdfc3RhY2tubGVmdCA9IGJsb2Nrc2l6ZTsKKwkJc3N0cmVuZCA9IGdfc3RhY2tueHQgKyBibG9ja3NpemU7CisJCWdfc3RhY2twID0gc3A7CisJCUlOVF9PTjsKKwl9CisJcCA9IGdfc3RhY2tueHQ7CisJZ19zdGFja254dCArPSBhbGlnbmVkOworCWdfc3RhY2tubGVmdCAtPSBhbGlnbmVkOworCXJldHVybiBwOworfQorCitzdGF0aWMgdm9pZCAqCitzdHphbGxvYyhzaXplX3QgbmJ5dGVzKQoreworCXJldHVybiBtZW1zZXQoc3RhbGxvYyhuYnl0ZXMpLCAwLCBuYnl0ZXMpOworfQorCitzdGF0aWMgdm9pZAorc3R1bmFsbG9jKHZvaWQgKnApCit7CisjaWYgREVCVUcKKwlpZiAoIXAgfHwgKGdfc3RhY2tueHQgPCAoY2hhciAqKXApIHx8ICgoY2hhciAqKXAgPCBnX3N0YWNrcC0+c3BhY2UpKSB7CisJCXdyaXRlKFNUREVSUl9GSUxFTk8sICJzdHVuYWxsb2NcbiIsIDEwKTsKKwkJYWJvcnQoKTsKKwl9CisjZW5kaWYKKwlnX3N0YWNrbmxlZnQgKz0gZ19zdGFja254dCAtIChjaGFyICopcDsKKwlnX3N0YWNrbnh0ID0gcDsKK30KKworLyoKKyAqIExpa2Ugc3RyZHVwIGJ1dCB3b3JrcyB3aXRoIHRoZSBhc2ggc3RhY2suCisgKi8KK3N0YXRpYyBjaGFyICoKK3N0c3RyZHVwKGNvbnN0IGNoYXIgKnApCit7CisJc2l6ZV90IGxlbiA9IHN0cmxlbihwKSArIDE7CisJcmV0dXJuIG1lbWNweShzdGFsbG9jKGxlbiksIHAsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRzdGFja21hcmsoc3RydWN0IHN0YWNrbWFyayAqbWFyaykKK3sKKwltYXJrLT5zdGFja3AgPSBnX3N0YWNrcDsKKwltYXJrLT5zdGFja254dCA9IGdfc3RhY2tueHQ7CisJbWFyay0+c3RhY2tubGVmdCA9IGdfc3RhY2tubGVmdDsKKwltYXJrLT5tYXJrbmV4dCA9IG1hcmtwOworCW1hcmtwID0gbWFyazsKK30KKworc3RhdGljIHZvaWQKK3BvcHN0YWNrbWFyayhzdHJ1Y3Qgc3RhY2ttYXJrICptYXJrKQoreworCXN0cnVjdCBzdGFja19ibG9jayAqc3A7CisKKwlpZiAoIW1hcmstPnN0YWNrcCkKKwkJcmV0dXJuOworCisJSU5UX09GRjsKKwltYXJrcCA9IG1hcmstPm1hcmtuZXh0OworCXdoaWxlIChnX3N0YWNrcCAhPSBtYXJrLT5zdGFja3ApIHsKKwkJc3AgPSBnX3N0YWNrcDsKKwkJZ19zdGFja3AgPSBzcC0+cHJldjsKKwkJZnJlZShzcCk7CisJfQorCWdfc3RhY2tueHQgPSBtYXJrLT5zdGFja254dDsKKwlnX3N0YWNrbmxlZnQgPSBtYXJrLT5zdGFja25sZWZ0OworCXNzdHJlbmQgPSBtYXJrLT5zdGFja254dCArIG1hcmstPnN0YWNrbmxlZnQ7CisJSU5UX09OOworfQorCisvKgorICogV2hlbiB0aGUgcGFyc2VyIHJlYWRzIGluIGEgc3RyaW5nLCBpdCB3YW50cyB0byBzdGljayB0aGUgc3RyaW5nIG9uIHRoZQorICogc3RhY2sgYW5kIG9ubHkgYWRqdXN0IHRoZSBzdGFjayBwb2ludGVyIHdoZW4gaXQga25vd3MgaG93IGJpZyB0aGUKKyAqIHN0cmluZyBpcy4gIFN0YWNrYmxvY2sgKGRlZmluZWQgaW4gc3RhY2suaCkgcmV0dXJucyBhIHBvaW50ZXIgdG8gYSBibG9jaworICogb2Ygc3BhY2Ugb24gdG9wIG9mIHRoZSBzdGFjayBhbmQgc3RhY2tibG9ja2xlbiByZXR1cm5zIHRoZSBsZW5ndGggb2YKKyAqIHRoaXMgYmxvY2suICBHcm93c3RhY2tibG9jayB3aWxsIGdyb3cgdGhpcyBzcGFjZSBieSBhdCBsZWFzdCBvbmUgYnl0ZSwKKyAqIHBvc3NpYmx5IG1vdmluZyBpdCAobGlrZSByZWFsbG9jKS4gIEdyYWJzdGFja2Jsb2NrIGFjdHVhbGx5IGFsbG9jYXRlcyB0aGUKKyAqIHBhcnQgb2YgdGhlIGJsb2NrIHRoYXQgaGFzIGJlZW4gdXNlZC4KKyAqLworc3RhdGljIHZvaWQKK2dyb3dzdGFja2Jsb2NrKHZvaWQpCit7CisJc2l6ZV90IG5ld2xlbjsKKworCW5ld2xlbiA9IGdfc3RhY2tubGVmdCAqIDI7CisJaWYgKG5ld2xlbiA8IGdfc3RhY2tubGVmdCkKKwkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoYmJfbXNnX21lbW9yeV9leGhhdXN0ZWQpOworCWlmIChuZXdsZW4gPCAxMjgpCisJCW5ld2xlbiArPSAxMjg7CisKKwlpZiAoZ19zdGFja254dCA9PSBnX3N0YWNrcC0+c3BhY2UgJiYgZ19zdGFja3AgIT0gJnN0YWNrYmFzZSkgeworCQlzdHJ1Y3Qgc3RhY2tfYmxvY2sgKm9sZHN0YWNrcDsKKwkJc3RydWN0IHN0YWNrbWFyayAqeG1hcms7CisJCXN0cnVjdCBzdGFja19ibG9jayAqc3A7CisJCXN0cnVjdCBzdGFja19ibG9jayAqcHJldnN0YWNrcDsKKwkJc2l6ZV90IGdyb3NzbGVuOworCisJCUlOVF9PRkY7CisJCW9sZHN0YWNrcCA9IGdfc3RhY2twOworCQlzcCA9IGdfc3RhY2twOworCQlwcmV2c3RhY2twID0gc3AtPnByZXY7CisJCWdyb3NzbGVuID0gbmV3bGVuICsgc2l6ZW9mKHN0cnVjdCBzdGFja19ibG9jaykgLSBNSU5TSVpFOworCQlzcCA9IGNrcmVhbGxvYyhzcCwgZ3Jvc3NsZW4pOworCQlzcC0+cHJldiA9IHByZXZzdGFja3A7CisJCWdfc3RhY2twID0gc3A7CisJCWdfc3RhY2tueHQgPSBzcC0+c3BhY2U7CisJCWdfc3RhY2tubGVmdCA9IG5ld2xlbjsKKwkJc3N0cmVuZCA9IHNwLT5zcGFjZSArIG5ld2xlbjsKKworCQkvKgorCQkgKiBTdGFjayBtYXJrcyBwb2ludGluZyB0byB0aGUgc3RhcnQgb2YgdGhlIG9sZCBibG9jaworCQkgKiBtdXN0IGJlIHJlbG9jYXRlZCB0byBwb2ludCB0byB0aGUgbmV3IGJsb2NrCisJCSAqLworCQl4bWFyayA9IG1hcmtwOworCQl3aGlsZSAoeG1hcmsgIT0gTlVMTCAmJiB4bWFyay0+c3RhY2twID09IG9sZHN0YWNrcCkgeworCQkJeG1hcmstPnN0YWNrcCA9IGdfc3RhY2twOworCQkJeG1hcmstPnN0YWNrbnh0ID0gZ19zdGFja254dDsKKwkJCXhtYXJrLT5zdGFja25sZWZ0ID0gZ19zdGFja25sZWZ0OworCQkJeG1hcmsgPSB4bWFyay0+bWFya25leHQ7CisJCX0KKwkJSU5UX09OOworCX0gZWxzZSB7CisJCWNoYXIgKm9sZHNwYWNlID0gZ19zdGFja254dDsKKwkJc2l6ZV90IG9sZGxlbiA9IGdfc3RhY2tubGVmdDsKKwkJY2hhciAqcCA9IHN0YWxsb2MobmV3bGVuKTsKKworCQkvKiBmcmVlIHRoZSBzcGFjZSB3ZSBqdXN0IGFsbG9jYXRlZCAqLworCQlnX3N0YWNrbnh0ID0gbWVtY3B5KHAsIG9sZHNwYWNlLCBvbGRsZW4pOworCQlnX3N0YWNrbmxlZnQgKz0gbmV3bGVuOworCX0KK30KKworc3RhdGljIHZvaWQKK2dyYWJzdGFja2Jsb2NrKHNpemVfdCBsZW4pCit7CisJbGVuID0gU0hFTExfQUxJR04obGVuKTsKKwlnX3N0YWNrbnh0ICs9IGxlbjsKKwlnX3N0YWNrbmxlZnQgLT0gbGVuOworfQorCisvKgorICogVGhlIGZvbGxvd2luZyByb3V0aW5lcyBhcmUgc29tZXdoYXQgZWFzaWVyIHRvIHVzZSB0aGFuIHRoZSBhYm92ZS4KKyAqIFRoZSB1c2VyIGRlY2xhcmVzIGEgdmFyaWFibGUgb2YgdHlwZSBTVEFDS1NUUiwgd2hpY2ggbWF5IGJlIGRlY2xhcmVkCisgKiB0byBiZSBhIHJlZ2lzdGVyLiAgVGhlIG1hY3JvIFNUQVJUU1RBQ0tTVFIgaW5pdGlhbGl6ZXMgdGhpbmdzLiAgVGhlbgorICogdGhlIHVzZXIgdXNlcyB0aGUgbWFjcm8gU1RQVVRDIHRvIGFkZCBjaGFyYWN0ZXJzIHRvIHRoZSBzdHJpbmcuICBJbgorICogZWZmZWN0LCBTVFBVVEMoYywgcCkgaXMgdGhlIHNhbWUgYXMgKnArKyA9IGMgZXhjZXB0IHRoYXQgdGhlIHN0YWNrIGlzCisgKiBncm93biBhcyBuZWNlc3NhcnkuICBXaGVuIHRoZSB1c2VyIGlzIGRvbmUsIHNoZSBjYW4ganVzdCBsZWF2ZSB0aGUKKyAqIHN0cmluZyB0aGVyZSBhbmQgcmVmZXIgdG8gaXQgdXNpbmcgc3RhY2tibG9jaygpLiAgT3Igc2hlIGNhbiBhbGxvY2F0ZQorICogdGhlIHNwYWNlIGZvciBpdCB1c2luZyBncmFic3RhY2tzdHIoKS4gIElmIGl0IGlzIG5lY2Vzc2FyeSB0byBhbGxvdworICogc29tZW9uZSBlbHNlIHRvIHVzZSB0aGUgc3RhY2sgdGVtcG9yYXJpbHkgYW5kIHRoZW4gY29udGludWUgdG8gZ3JvdworICogdGhlIHN0cmluZywgdGhlIHVzZXIgc2hvdWxkIHVzZSBncmFic3RhY2sgdG8gYWxsb2NhdGUgdGhlIHNwYWNlLCBhbmQKKyAqIHRoZW4gY2FsbCB1bmdyYWJzdHIocCkgdG8gcmV0dXJuIHRvIHRoZSBwcmV2aW91cyBtb2RlIG9mIG9wZXJhdGlvbi4KKyAqCisgKiBVU1RQVVRDIGlzIGxpa2UgU1RQVVRDIGV4Y2VwdCB0aGF0IGl0IGRvZXNuJ3QgY2hlY2sgZm9yIG92ZXJmbG93LgorICogQ0hFQ0tTVEFDS1NQQUNFIGNhbiBiZSBjYWxsZWQgYmVmb3JlIFVTVFBVVEMgdG8gZW5zdXJlIHRoYXQgdGhlcmUKKyAqIGlzIHNwYWNlIGZvciBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyLgorICovCitzdGF0aWMgdm9pZCAqCitncm93c3RhY2tzdHIodm9pZCkKK3sKKwlzaXplX3QgbGVuID0gc3RhY2tibG9ja3NpemUoKTsKKwlpZiAoaGVyZWZkID49IDAgJiYgbGVuID49IDEwMjQpIHsKKwkJZnVsbF93cml0ZShoZXJlZmQsIHN0YWNrYmxvY2soKSwgbGVuKTsKKwkJcmV0dXJuIHN0YWNrYmxvY2soKTsKKwl9CisJZ3Jvd3N0YWNrYmxvY2soKTsKKwlyZXR1cm4gKGNoYXIgKilzdGFja2Jsb2NrKCkgKyBsZW47Cit9CisKKy8qCisgKiBDYWxsZWQgZnJvbSBDSEVDS1NUUlNQQUNFLgorICovCitzdGF0aWMgY2hhciAqCittYWtlc3Ryc3BhY2Uoc2l6ZV90IG5ld2xlbiwgY2hhciAqcCkKK3sKKwlzaXplX3QgbGVuID0gcCAtIGdfc3RhY2tueHQ7CisJc2l6ZV90IHNpemUgPSBzdGFja2Jsb2Nrc2l6ZSgpOworCisJZm9yICg7OykgeworCQlzaXplX3QgbmxlZnQ7CisKKwkJc2l6ZSA9IHN0YWNrYmxvY2tzaXplKCk7CisJCW5sZWZ0ID0gc2l6ZSAtIGxlbjsKKwkJaWYgKG5sZWZ0ID49IG5ld2xlbikKKwkJCWJyZWFrOworCQlncm93c3RhY2tibG9jaygpOworCX0KKwlyZXR1cm4gKGNoYXIgKilzdGFja2Jsb2NrKCkgKyBsZW47Cit9CisKK3N0YXRpYyBjaGFyICoKK3N0YWNrX25wdXRzdHIoY29uc3QgY2hhciAqcywgc2l6ZV90IG4sIGNoYXIgKnApCit7CisJcCA9IG1ha2VzdHJzcGFjZShuLCBwKTsKKwlwID0gKGNoYXIgKiltZW1jcHkocCwgcywgbikgKyBuOworCXJldHVybiBwOworfQorCitzdGF0aWMgY2hhciAqCitzdGFja19wdXRzdHIoY29uc3QgY2hhciAqcywgY2hhciAqcCkKK3sKKwlyZXR1cm4gc3RhY2tfbnB1dHN0cihzLCBzdHJsZW4ocyksIHApOworfQorCitzdGF0aWMgY2hhciAqCitfU1RQVVRDKGludCBjLCBjaGFyICpwKQoreworCWlmIChwID09IHNzdHJlbmQpCisJCXAgPSBncm93c3RhY2tzdHIoKTsKKwkqcCsrID0gYzsKKwlyZXR1cm4gcDsKK30KKworI2RlZmluZSBTVEFSVFNUQUNLU1RSKHApICAgICAgICAoKHApID0gc3RhY2tibG9jaygpKQorI2RlZmluZSBTVFBVVEMoYywgcCkgICAgICAgICAgICAoKHApID0gX1NUUFVUQygoYyksIChwKSkpCisjZGVmaW5lIENIRUNLU1RSU1BBQ0UobiwgcCkgZG8geyBcCisJY2hhciAqcSA9IChwKTsgXAorCXNpemVfdCBsID0gKG4pOyBcCisJc2l6ZV90IG0gPSBzc3RyZW5kIC0gcTsgXAorCWlmIChsID4gbSkgXAorCQkocCkgPSBtYWtlc3Ryc3BhY2UobCwgcSk7IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIFVTVFBVVEMoYywgcCkgICAgICAgICAgICgqKHApKysgPSAoYykpCisjZGVmaW5lIFNUQUNLU1RSTlVMKHApIGRvIHsgXAorCWlmICgocCkgPT0gc3N0cmVuZCkgXAorCQkocCkgPSBncm93c3RhY2tzdHIoKTsgXAorCSoocCkgPSAnXDAnOyBcCit9IHdoaWxlICgwKQorI2RlZmluZSBTVFVOUFVUQyhwKSAgICAgICAgICAgICAoLS0ocCkpCisjZGVmaW5lIFNUVE9QQyhwKSAgICAgICAgICAgICAgICgocClbLTFdKQorI2RlZmluZSBTVEFESlVTVChhbW91bnQsIHApICAgICAoKHApICs9IChhbW91bnQpKQorCisjZGVmaW5lIGdyYWJzdGFja3N0cihwKSAgICAgICAgIHN0YWxsb2MoKGNoYXIgKikocCkgLSAoY2hhciAqKXN0YWNrYmxvY2soKSkKKyNkZWZpbmUgdW5ncmFic3RhY2tzdHIocywgcCkgICAgc3R1bmFsbG9jKHMpCisjZGVmaW5lIHN0YWNrc3RyZW5kKCkgICAgICAgICAgICgodm9pZCAqKXNzdHJlbmQpCisKKworLyogPT09PT09PT09PT09IFN0cmluZyBoZWxwZXJzICovCisKKy8qCisgKiBwcmVmaXggLS0gc2VlIGlmIHBmeCBpcyBhIHByZWZpeCBvZiBzdHJpbmcuCisgKi8KK3N0YXRpYyBjaGFyICoKK3ByZWZpeChjb25zdCBjaGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKnBmeCkKK3sKKwl3aGlsZSAoKnBmeCkgeworCQlpZiAoKnBmeCsrICE9ICpzdHJpbmcrKykKKwkJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gKGNoYXIgKikgc3RyaW5nOworfQorCisvKgorICogQ2hlY2sgZm9yIGEgdmFsaWQgbnVtYmVyLiAgVGhpcyBzaG91bGQgYmUgZWxzZXdoZXJlLgorICovCitzdGF0aWMgaW50Citpc19udW1iZXIoY29uc3QgY2hhciAqcCkKK3sKKwlkbyB7CisJCWlmICghaXNkaWdpdCgqcCkpCisJCQlyZXR1cm4gMDsKKwl9IHdoaWxlICgqKytwICE9ICdcMCcpOworCXJldHVybiAxOworfQorCisvKgorICogQ29udmVydCBhIHN0cmluZyBvZiBkaWdpdHMgdG8gYW4gaW50ZWdlciwgcHJpbnRpbmcgYW4gZXJyb3IgbWVzc2FnZSBvbgorICogZmFpbHVyZS4KKyAqLworc3RhdGljIGludAorbnVtYmVyKGNvbnN0IGNoYXIgKnMpCit7CisJaWYgKCFpc19udW1iZXIocykpCisJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKG1zZ19pbGxudW0sIHMpOworCXJldHVybiBhdG9pKHMpOworfQorCisvKgorICogUHJvZHVjZSBhIHBvc3NpYmx5IHNpbmdsZSBxdW90ZWQgc3RyaW5nIHN1aXRhYmxlIGFzIGlucHV0IHRvIHRoZSBzaGVsbC4KKyAqIFRoZSByZXR1cm4gc3RyaW5nIGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suCisgKi8KK3N0YXRpYyBjaGFyICoKK3NpbmdsZV9xdW90ZShjb25zdCBjaGFyICpzKQoreworCWNoYXIgKnA7CisKKwlTVEFSVFNUQUNLU1RSKHApOworCisJZG8geworCQljaGFyICpxOworCQlzaXplX3QgbGVuOworCisJCWxlbiA9IHN0cmNocm51bChzLCAnXCcnKSAtIHM7CisKKwkJcSA9IHAgPSBtYWtlc3Ryc3BhY2UobGVuICsgMywgcCk7CisKKwkJKnErKyA9ICdcJyc7CisJCXEgPSAoY2hhciAqKW1lbWNweShxLCBzLCBsZW4pICsgbGVuOworCQkqcSsrID0gJ1wnJzsKKwkJcyArPSBsZW47CisKKwkJU1RBREpVU1QocSAtIHAsIHApOworCisJCWlmICgqcyAhPSAnXCcnKQorCQkJYnJlYWs7CisJCWxlbiA9IDA7CisJCWRvIGxlbisrOyB3aGlsZSAoKisrcyA9PSAnXCcnKTsKKworCQlxID0gcCA9IG1ha2VzdHJzcGFjZShsZW4gKyAzLCBwKTsKKworCQkqcSsrID0gJyInOworCQlxID0gKGNoYXIgKiltZW1jcHkocSwgcyAtIGxlbiwgbGVuKSArIGxlbjsKKwkJKnErKyA9ICciJzsKKworCQlTVEFESlVTVChxIC0gcCwgcCk7CisJfSB3aGlsZSAoKnMpOworCisJVVNUUFVUQygnXDAnLCBwKTsKKworCXJldHVybiBzdGFja2Jsb2NrKCk7Cit9CisKKworLyogPT09PT09PT09PT09IG5leHRvcHQgKi8KKworc3RhdGljIGNoYXIgKiphcmdwdHI7ICAgICAgICAgICAgICAgICAgLyogYXJndW1lbnQgbGlzdCBmb3IgYnVpbHRpbiBjb21tYW5kcyAqLworc3RhdGljIGNoYXIgKm9wdGlvbmFyZzsgICAgICAgICAgICAgICAgLyogc2V0IGJ5IG5leHRvcHQgKGxpa2UgZ2V0b3B0KSAqLworc3RhdGljIGNoYXIgKm9wdHB0cjsgICAgICAgICAgICAgICAgICAgLyogdXNlZCBieSBuZXh0b3B0ICovCisKKy8qCisgKiBYWFggLSBzaG91bGQgZ2V0IHJpZCBvZi4gSGF2ZSBhbGwgYnVpbHRpbnMgdXNlIGdldG9wdCgzKS4KKyAqIFRoZSBsaWJyYXJ5IGdldG9wdCBtdXN0IGhhdmUgdGhlIEJTRCBleHRlbnNpb24gc3RhdGljIHZhcmlhYmxlCisgKiAib3B0cmVzZXQiLCBvdGhlcndpc2UgaXQgY2FuJ3QgYmUgdXNlZCB3aXRoaW4gdGhlIHNoZWxsIHNhZmVseS4KKyAqCisgKiBTdGFuZGFyZCBvcHRpb24gcHJvY2Vzc2luZyAoYSBsYSBnZXRvcHQpIGZvciBidWlsdGluIHJvdXRpbmVzLgorICogVGhlIG9ubHkgYXJndW1lbnQgdGhhdCBpcyBwYXNzZWQgdG8gbmV4dG9wdCBpcyB0aGUgb3B0aW9uIHN0cmluZzsKKyAqIHRoZSBvdGhlciBhcmd1bWVudHMgYXJlIHVubmVjZXNzYXJ5LiBJdCByZXR1cm5zIHRoZSBjaGFyYWN0ZXIsCisgKiBvciAnXDAnIG9uIGVuZCBvZiBpbnB1dC4KKyAqLworc3RhdGljIGludAorbmV4dG9wdChjb25zdCBjaGFyICpvcHRzdHJpbmcpCit7CisJY2hhciAqcDsKKwljb25zdCBjaGFyICpxOworCWNoYXIgYzsKKworCXAgPSBvcHRwdHI7CisJaWYgKHAgPT0gTlVMTCB8fCAqcCA9PSAnXDAnKSB7CisJCS8qIFdlIGF0ZSBlbnRpcmUgIi1wYXJhbSIsIHRha2UgbmV4dCBvbmUgKi8KKwkJcCA9ICphcmdwdHI7CisJCWlmIChwID09IE5VTEwpCisJCQlyZXR1cm4gJ1wwJzsKKwkJaWYgKCpwICE9ICctJykKKwkJCXJldHVybiAnXDAnOworCQlpZiAoKisrcCA9PSAnXDAnKSAvKiBqdXN0ICItIiA/ICovCisJCQlyZXR1cm4gJ1wwJzsKKwkJYXJncHRyKys7CisJCWlmIChMT05FX0RBU0gocCkpIC8qICItLSIgPyAqLworCQkJcmV0dXJuICdcMCc7CisJCS8qIHAgPT4gbmV4dCAiLXBhcmFtIiAqLworCX0KKwkvKiBwID0+IHNvbWUgb3B0aW9uIGNoYXIgaW4gdGhlIG1pZGRsZSBvZiBhICItcGFyYW0iICovCisJYyA9ICpwKys7CisJZm9yIChxID0gb3B0c3RyaW5nOyAqcSAhPSBjOykgeworCQlpZiAoKnEgPT0gJ1wwJykKKwkJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCJpbGxlZ2FsIG9wdGlvbiAtJWMiLCBjKTsKKwkJaWYgKCorK3EgPT0gJzonKQorCQkJcSsrOworCX0KKwlpZiAoKisrcSA9PSAnOicpIHsKKwkJaWYgKCpwID09ICdcMCcpIHsKKwkJCXAgPSAqYXJncHRyKys7CisJCQlpZiAocCA9PSBOVUxMKQorCQkJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCJubyBhcmcgZm9yIC0lYyBvcHRpb24iLCBjKTsKKwkJfQorCQlvcHRpb25hcmcgPSBwOworCQlwID0gTlVMTDsKKwl9CisJb3B0cHRyID0gcDsKKwlyZXR1cm4gYzsKK30KKworCisvKiA9PT09PT09PT09PT0gU2hlbGwgdmFyaWFibGVzICovCisKKy8qCisgKiBUaGUgcGFyc2VmaWxlIHN0cnVjdHVyZSBwb2ludGVkIHRvIGJ5IHRoZSBnbG9iYWwgdmFyaWFibGUgcGFyc2VmaWxlCisgKiBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBmaWxlIGJlaW5nIHJlYWQuCisgKi8KK3N0cnVjdCBzaHBhcmFtIHsKKwlpbnQgbnBhcmFtOyAgICAgICAgICAgICAvKiAjIG9mIHBvc2l0aW9uYWwgcGFyYW1ldGVycyAod2l0aG91dCAkMCkgKi8KKyNpZiBFTkFCTEVfQVNIX0dFVE9QVFMKKwlpbnQgb3B0aW5kOyAgICAgICAgICAgICAvKiBuZXh0IHBhcmFtZXRlciB0byBiZSBwcm9jZXNzZWQgYnkgZ2V0b3B0cyAqLworCWludCBvcHRvZmY7ICAgICAgICAgICAgIC8qIHVzZWQgYnkgZ2V0b3B0cyAqLworI2VuZGlmCisJdW5zaWduZWQgY2hhciBtYWxsb2NlZDsgLyogaWYgcGFyYW1ldGVyIGxpc3QgZHluYW1pY2FsbHkgYWxsb2NhdGVkICovCisJY2hhciAqKnA7ICAgICAgICAgICAgICAgLyogcGFyYW1ldGVyIGxpc3QgKi8KK307CisKKy8qCisgKiBGcmVlIHRoZSBsaXN0IG9mIHBvc2l0aW9uYWwgcGFyYW1ldGVycy4KKyAqLworc3RhdGljIHZvaWQKK2ZyZWVwYXJhbSh2b2xhdGlsZSBzdHJ1Y3Qgc2hwYXJhbSAqcGFyYW0pCit7CisJaWYgKHBhcmFtLT5tYWxsb2NlZCkgeworCQljaGFyICoqYXAsICoqYXAxOworCQlhcCA9IGFwMSA9IHBhcmFtLT5wOworCQl3aGlsZSAoKmFwKQorCQkJZnJlZSgqYXArKyk7CisJCWZyZWUoYXAxKTsKKwl9Cit9CisKKyNpZiBFTkFCTEVfQVNIX0dFVE9QVFMKK3N0YXRpYyB2b2lkIEZBU1RfRlVOQyBnZXRvcHRzcmVzZXQoY29uc3QgY2hhciAqdmFsdWUpOworI2VuZGlmCisKK3N0cnVjdCB2YXIgeworCXN0cnVjdCB2YXIgKm5leHQ7ICAgICAgICAgICAgICAgLyogbmV4dCBlbnRyeSBpbiBoYXNoIGxpc3QgKi8KKwlpbnQgZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qIGZsYWdzIGFyZSBkZWZpbmVkIGFib3ZlICovCisJY29uc3QgY2hhciAqdmFyX3RleHQ7ICAgICAgICAgICAvKiBuYW1lPXZhbHVlICovCisJdm9pZCAoKnZhcl9mdW5jKShjb25zdCBjaGFyICopIEZBU1RfRlVOQzsgLyogZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gICovCisJCQkJCS8qIHRoZSB2YXJpYWJsZSBnZXRzIHNldC91bnNldCAqLworfTsKKworc3RydWN0IGxvY2FsdmFyIHsKKwlzdHJ1Y3QgbG9jYWx2YXIgKm5leHQ7ICAgICAgICAgIC8qIG5leHQgbG9jYWwgdmFyaWFibGUgaW4gbGlzdCAqLworCXN0cnVjdCB2YXIgKnZwOyAgICAgICAgICAgICAgICAgLyogdGhlIHZhcmlhYmxlIHRoYXQgd2FzIG1hZGUgbG9jYWwgKi8KKwlpbnQgZmxhZ3M7ICAgICAgICAgICAgICAgICAgICAgIC8qIHNhdmVkIGZsYWdzICovCisJY29uc3QgY2hhciAqdGV4dDsgICAgICAgICAgICAgICAvKiBzYXZlZCB0ZXh0ICovCit9OworCisvKiBmbGFncyAqLworI2RlZmluZSBWRVhQT1JUICAgICAgICAgMHgwMSAgICAvKiB2YXJpYWJsZSBpcyBleHBvcnRlZCAqLworI2RlZmluZSBWUkVBRE9OTFkgICAgICAgMHgwMiAgICAvKiB2YXJpYWJsZSBjYW5ub3QgYmUgbW9kaWZpZWQgKi8KKyNkZWZpbmUgVlNUUkZJWEVEICAgICAgIDB4MDQgICAgLyogdmFyaWFibGUgc3RydWN0IGlzIHN0YXRpY2FsbHkgYWxsb2NhdGVkICovCisjZGVmaW5lIFZURVhURklYRUQgICAgICAweDA4ICAgIC8qIHRleHQgaXMgc3RhdGljYWxseSBhbGxvY2F0ZWQgKi8KKyNkZWZpbmUgVlNUQUNLICAgICAgICAgIDB4MTAgICAgLyogdGV4dCBpcyBhbGxvY2F0ZWQgb24gdGhlIHN0YWNrICovCisjZGVmaW5lIFZVTlNFVCAgICAgICAgICAweDIwICAgIC8qIHRoZSB2YXJpYWJsZSBpcyBub3Qgc2V0ICovCisjZGVmaW5lIFZOT0ZVTkMgICAgICAgICAweDQwICAgIC8qIGRvbid0IGNhbGwgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisjZGVmaW5lIFZOT1NFVCAgICAgICAgICAweDgwICAgIC8qIGRvIG5vdCBzZXQgdmFyaWFibGUgLSBqdXN0IHJlYWRvbmx5IHRlc3QgKi8KKyNkZWZpbmUgVk5PU0FWRSAgICAgICAgIDB4MTAwICAgLyogd2hlbiB0ZXh0IGlzIG9uIHRoZSBoZWFwIGJlZm9yZSBzZXR2YXJlcSAqLworI2lmIEVOQUJMRV9BU0hfUkFORE9NX1NVUFBPUlQKKyMgZGVmaW5lIFZEWU5BTUlDICAgICAgIDB4MjAwICAgLyogZHluYW1pYyB2YXJpYWJsZSAqLworI2Vsc2UKKyMgZGVmaW5lIFZEWU5BTUlDICAgICAgIDAKKyNlbmRpZgorCisKKy8qIE5lZWQgdG8gYmUgYmVmb3JlIHZhcmluaXRfZGF0YVtdICovCisjaWYgRU5BQkxFX0xPQ0FMRV9TVVBQT1JUCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMKK2NoYW5nZV9sY19hbGwoY29uc3QgY2hhciAqdmFsdWUpCit7CisJaWYgKHZhbHVlICYmICp2YWx1ZSAhPSAnXDAnKQorCQlzZXRsb2NhbGUoTENfQUxMLCB2YWx1ZSk7Cit9CitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMKK2NoYW5nZV9sY19jdHlwZShjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpZiAodmFsdWUgJiYgKnZhbHVlICE9ICdcMCcpCisJCXNldGxvY2FsZShMQ19DVFlQRSwgdmFsdWUpOworfQorI2VuZGlmCisjaWYgRU5BQkxFX0FTSF9NQUlMCitzdGF0aWMgdm9pZCBjaGttYWlsKHZvaWQpOworc3RhdGljIHZvaWQgY2hhbmdlbWFpbChjb25zdCBjaGFyICp2YXJfdmFsdWUpIEZBU1RfRlVOQzsKKyNlbHNlCisjIGRlZmluZSBjaGttYWlsKCkgICgodm9pZCkwKQorI2VuZGlmCitzdGF0aWMgdm9pZCBjaGFuZ2VwYXRoKGNvbnN0IGNoYXIgKikgRkFTVF9GVU5DOworI2lmIEVOQUJMRV9BU0hfUkFORE9NX1NVUFBPUlQKK3N0YXRpYyB2b2lkIGNoYW5nZV9yYW5kb20oY29uc3QgY2hhciAqKSBGQVNUX0ZVTkM7CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHN0cnVjdCB7CisJaW50IGZsYWdzOworCWNvbnN0IGNoYXIgKnZhcl90ZXh0OworCXZvaWQgKCp2YXJfZnVuYykoY29uc3QgY2hhciAqKSBGQVNUX0ZVTkM7Cit9IHZhcmluaXRfZGF0YVtdID0geworCS8qCisJICogTm90ZTogVkVYUE9SVCB3b3VsZCBub3Qgd29yayBjb3JyZWN0bHkgaGVyZSBmb3IgTk9GT1JLIGFwcGxldHM6CisJICogc29tZSBlbnZpcm9ubWVudCBzdHJpbmdzIG1heSBiZSBjb25zdGFudC4KKwkgKi8KKwl7IFZTVFJGSVhFRHxWVEVYVEZJWEVEICAgICAgICwgZGVmaWZzdmFyICAgLCBOVUxMICAgICAgICAgICAgfSwKKyNpZiBFTkFCTEVfQVNIX01BSUwKKwl7IFZTVFJGSVhFRHxWVEVYVEZJWEVEfFZVTlNFVCwgIk1BSUwiICAgICAgLCBjaGFuZ2VtYWlsICAgICAgfSwKKwl7IFZTVFJGSVhFRHxWVEVYVEZJWEVEfFZVTlNFVCwgIk1BSUxQQVRIIiAgLCBjaGFuZ2VtYWlsICAgICAgfSwKKyNlbmRpZgorCXsgVlNUUkZJWEVEfFZURVhURklYRUQgICAgICAgLCBiYl9QQVRIX3Jvb3RfcGF0aCwgY2hhbmdlcGF0aCB9LAorCXsgVlNUUkZJWEVEfFZURVhURklYRUQgICAgICAgLCAiUFMxPSQgIiAgICAsIE5VTEwgICAgICAgICAgICB9LAorCXsgVlNUUkZJWEVEfFZURVhURklYRUQgICAgICAgLCAiUFMyPT4gIiAgICAsIE5VTEwgICAgICAgICAgICB9LAorCXsgVlNUUkZJWEVEfFZURVhURklYRUQgICAgICAgLCAiUFM0PSsgIiAgICAsIE5VTEwgICAgICAgICAgICB9LAorI2lmIEVOQUJMRV9BU0hfR0VUT1BUUworCXsgVlNUUkZJWEVEfFZURVhURklYRUQgICAgICAgLCAiT1BUSU5EPTEiICAsIGdldG9wdHNyZXNldCAgICB9LAorI2VuZGlmCisjaWYgRU5BQkxFX0FTSF9SQU5ET01fU1VQUE9SVAorCXsgVlNUUkZJWEVEfFZURVhURklYRUR8VlVOU0VUfFZEWU5BTUlDLCAiUkFORE9NIiwgY2hhbmdlX3JhbmRvbSB9LAorI2VuZGlmCisjaWYgRU5BQkxFX0xPQ0FMRV9TVVBQT1JUCisJeyBWU1RSRklYRUR8VlRFWFRGSVhFRHxWVU5TRVQsICJMQ19BTEwiICAgICwgY2hhbmdlX2xjX2FsbCAgIH0sCisJeyBWU1RSRklYRUR8VlRFWFRGSVhFRHxWVU5TRVQsICJMQ19DVFlQRSIgICwgY2hhbmdlX2xjX2N0eXBlIH0sCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1NBVkVISVNUT1JZCisJeyBWU1RSRklYRUR8VlRFWFRGSVhFRHxWVU5TRVQsICJISVNURklMRSIgICwgTlVMTCAgICAgICAgICAgIH0sCisjZW5kaWYKK307CisKK3N0cnVjdCByZWRpcnRhYjsKKworc3RydWN0IGdsb2JhbHNfdmFyIHsKKwlzdHJ1Y3Qgc2hwYXJhbSBzaGVsbHBhcmFtOyAgICAgIC8qICRAIGN1cnJlbnQgcG9zaXRpb25hbCBwYXJhbWV0ZXJzICovCisJc3RydWN0IHJlZGlydGFiICpyZWRpcmxpc3Q7CisJaW50IGdfbnVsbHJlZGlyczsKKwlpbnQgcHJldmVycm91dF9mZDsgICAvKiBzYXZlIGZkMiBiZWZvcmUgcHJpbnQgZGVidWcgaWYgeGZsYWcgaXMgc2V0LiAqLworCXN0cnVjdCB2YXIgKnZhcnRhYltWVEFCU0laRV07CisJc3RydWN0IHZhciB2YXJpbml0W0FSUkFZX1NJWkUodmFyaW5pdF9kYXRhKV07Cit9OworZXh0ZXJuIHN0cnVjdCBnbG9iYWxzX3ZhciAqY29uc3QgYXNoX3B0cl90b19nbG9iYWxzX3ZhcjsKKyNkZWZpbmUgR192YXIgKCphc2hfcHRyX3RvX2dsb2JhbHNfdmFyKQorI2RlZmluZSBzaGVsbHBhcmFtICAgIChHX3Zhci5zaGVsbHBhcmFtICAgKQorLy8jZGVmaW5lIHJlZGlybGlzdCAgICAgKEdfdmFyLnJlZGlybGlzdCAgICApCisjZGVmaW5lIGdfbnVsbHJlZGlycyAgKEdfdmFyLmdfbnVsbHJlZGlycyApCisjZGVmaW5lIHByZXZlcnJvdXRfZmQgKEdfdmFyLnByZXZlcnJvdXRfZmQpCisjZGVmaW5lIHZhcnRhYiAgICAgICAgKEdfdmFyLnZhcnRhYiAgICAgICApCisjZGVmaW5lIHZhcmluaXQgICAgICAgKEdfdmFyLnZhcmluaXQgICAgICApCisjZGVmaW5lIElOSVRfR192YXIoKSBkbyB7IFwKKwl1bnNpZ25lZCBpOyBcCisJKCooc3RydWN0IGdsb2JhbHNfdmFyKiopJmFzaF9wdHJfdG9fZ2xvYmFsc192YXIpID0geHphbGxvYyhzaXplb2YoR192YXIpKTsgXAorCWJhcnJpZXIoKTsgXAorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHZhcmluaXRfZGF0YSk7IGkrKykgeyBcCisJCXZhcmluaXRbaV0uZmxhZ3MgICAgPSB2YXJpbml0X2RhdGFbaV0uZmxhZ3M7IFwKKwkJdmFyaW5pdFtpXS52YXJfdGV4dCA9IHZhcmluaXRfZGF0YVtpXS52YXJfdGV4dDsgXAorCQl2YXJpbml0W2ldLnZhcl9mdW5jID0gdmFyaW5pdF9kYXRhW2ldLnZhcl9mdW5jOyBcCisJfSBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIHZpZnMgICAgICB2YXJpbml0WzBdCisjaWYgRU5BQkxFX0FTSF9NQUlMCisjIGRlZmluZSB2bWFpbCAgICAoJnZpZnMpWzFdCisjIGRlZmluZSB2bXBhdGggICAoJnZtYWlsKVsxXQorIyBkZWZpbmUgdnBhdGggICAgKCZ2bXBhdGgpWzFdCisjZWxzZQorIyBkZWZpbmUgdnBhdGggICAgKCZ2aWZzKVsxXQorI2VuZGlmCisjZGVmaW5lIHZwczEgICAgICAoJnZwYXRoKVsxXQorI2RlZmluZSB2cHMyICAgICAgKCZ2cHMxKVsxXQorI2RlZmluZSB2cHM0ICAgICAgKCZ2cHMyKVsxXQorI2lmIEVOQUJMRV9BU0hfR0VUT1BUUworIyBkZWZpbmUgdm9wdGluZCAgKCZ2cHM0KVsxXQorIyBpZiBFTkFCTEVfQVNIX1JBTkRPTV9TVVBQT1JUCisjICBkZWZpbmUgdnJhbmRvbSAoJnZvcHRpbmQpWzFdCisjIGVuZGlmCisjZWxzZQorIyBpZiBFTkFCTEVfQVNIX1JBTkRPTV9TVVBQT1JUCisjICBkZWZpbmUgdnJhbmRvbSAoJnZwczQpWzFdCisjIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIFRoZSBmb2xsb3dpbmcgbWFjcm9zIGFjY2VzcyB0aGUgdmFsdWVzIG9mIHRoZSBhYm92ZSB2YXJpYWJsZXMuCisgKiBUaGV5IGhhdmUgdG8gc2tpcCBvdmVyIHRoZSBuYW1lLiAgVGhleSByZXR1cm4gdGhlIG51bGwgc3RyaW5nCisgKiBmb3IgdW5zZXQgdmFyaWFibGVzLgorICovCisjZGVmaW5lIGlmc3ZhbCgpICAgICAgICAodmlmcy52YXJfdGV4dCArIDQpCisjZGVmaW5lIGlmc3NldCgpICAgICAgICAoKHZpZnMuZmxhZ3MgJiBWVU5TRVQpID09IDApCisjaWYgRU5BQkxFX0FTSF9NQUlMCisjIGRlZmluZSBtYWlsdmFsKCkgICAgICAodm1haWwudmFyX3RleHQgKyA1KQorIyBkZWZpbmUgbXBhdGh2YWwoKSAgICAgKHZtcGF0aC52YXJfdGV4dCArIDkpCisjIGRlZmluZSBtcGF0aHNldCgpICAgICAoKHZtcGF0aC5mbGFncyAmIFZVTlNFVCkgPT0gMCkKKyNlbmRpZgorI2RlZmluZSBwYXRodmFsKCkgICAgICAgKHZwYXRoLnZhcl90ZXh0ICsgNSkKKyNkZWZpbmUgcHMxdmFsKCkgICAgICAgICh2cHMxLnZhcl90ZXh0ICsgNCkKKyNkZWZpbmUgcHMydmFsKCkgICAgICAgICh2cHMyLnZhcl90ZXh0ICsgNCkKKyNkZWZpbmUgcHM0dmFsKCkgICAgICAgICh2cHM0LnZhcl90ZXh0ICsgNCkKKyNpZiBFTkFCTEVfQVNIX0dFVE9QVFMKKyMgZGVmaW5lIG9wdGluZHZhbCgpICAgICh2b3B0aW5kLnZhcl90ZXh0ICsgNykKKyNlbmRpZgorCisjaWYgRU5BQkxFX0FTSF9HRVRPUFRTCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMKK2dldG9wdHNyZXNldChjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlzaGVsbHBhcmFtLm9wdGluZCA9IG51bWJlcih2YWx1ZSk7CisJc2hlbGxwYXJhbS5vcHRvZmYgPSAtMTsKK30KKyNlbmRpZgorCisvKgorICogQ29tcGFyZXMgdHdvIHN0cmluZ3MgdXAgdG8gdGhlIGZpcnN0ID0gb3IgJ1wwJy4gIFRoZSBmaXJzdAorICogc3RyaW5nIG11c3QgYmUgdGVybWluYXRlZCBieSAnPSc7IHRoZSBzZWNvbmQgbWF5IGJlIHRlcm1pbmF0ZWQgYnkKKyAqIGVpdGhlciAnPScgb3IgJ1wwJy4KKyAqLworc3RhdGljIGludAordmFyY21wKGNvbnN0IGNoYXIgKnAsIGNvbnN0IGNoYXIgKnEpCit7CisJaW50IGMsIGQ7CisKKwl3aGlsZSAoKGMgPSAqcCkgPT0gKGQgPSAqcSkpIHsKKwkJaWYgKGMgPT0gJ1wwJyB8fCBjID09ICc9JykKKwkJCWdvdG8gb3V0OworCQlwKys7CisJCXErKzsKKwl9CisJaWYgKGMgPT0gJz0nKQorCQljID0gJ1wwJzsKKwlpZiAoZCA9PSAnPScpCisJCWQgPSAnXDAnOworIG91dDoKKwlyZXR1cm4gYyAtIGQ7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBhcHByb3ByaWF0ZSBlbnRyeSBpbiB0aGUgaGFzaCB0YWJsZSBmcm9tIHRoZSBuYW1lLgorICovCitzdGF0aWMgc3RydWN0IHZhciAqKgoraGFzaHZhcihjb25zdCBjaGFyICpwKQoreworCXVuc2lnbmVkIGhhc2h2YWw7CisKKwloYXNodmFsID0gKCh1bnNpZ25lZCBjaGFyKSAqcCkgPDwgNDsKKwl3aGlsZSAoKnAgJiYgKnAgIT0gJz0nKQorCQloYXNodmFsICs9ICh1bnNpZ25lZCBjaGFyKSAqcCsrOworCXJldHVybiAmdmFydGFiW2hhc2h2YWwgJSBWVEFCU0laRV07Cit9CisKK3N0YXRpYyBpbnQKK3ZwY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJcmV0dXJuIHZhcmNtcCgqKGNvbnN0IGNoYXIgKiopYSwgKihjb25zdCBjaGFyICoqKWIpOworfQorCisvKgorICogVGhpcyByb3V0aW5lIGluaXRpYWxpemVzIHRoZSBidWlsdGluIHZhcmlhYmxlcy4KKyAqLworc3RhdGljIHZvaWQKK2luaXR2YXIodm9pZCkKK3sKKwlzdHJ1Y3QgdmFyICp2cDsKKwlzdHJ1Y3QgdmFyICplbmQ7CisJc3RydWN0IHZhciAqKnZwcDsKKworCS8qCisJICogUFMxIGRlcGVuZHMgb24gdWlkCisJICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElORyAmJiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVAorCXZwczEudmFyX3RleHQgPSAiUFMxPVxcdyBcXCQgIjsKKyNlbHNlCisJaWYgKCFnZXRldWlkKCkpCisJCXZwczEudmFyX3RleHQgPSAiUFMxPSMgIjsKKyNlbmRpZgorCXZwID0gdmFyaW5pdDsKKwllbmQgPSB2cCArIEFSUkFZX1NJWkUodmFyaW5pdCk7CisJZG8geworCQl2cHAgPSBoYXNodmFyKHZwLT52YXJfdGV4dCk7CisJCXZwLT5uZXh0ID0gKnZwcDsKKwkJKnZwcCA9IHZwOworCX0gd2hpbGUgKCsrdnAgPCBlbmQpOworfQorCitzdGF0aWMgc3RydWN0IHZhciAqKgorZmluZHZhcihzdHJ1Y3QgdmFyICoqdnBwLCBjb25zdCBjaGFyICpuYW1lKQoreworCWZvciAoOyAqdnBwOyB2cHAgPSAmKCp2cHApLT5uZXh0KSB7CisJCWlmICh2YXJjbXAoKCp2cHApLT52YXJfdGV4dCwgbmFtZSkgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHZwcDsKK30KKworLyoKKyAqIEZpbmQgdGhlIHZhbHVlIG9mIGEgdmFyaWFibGUuICBSZXR1cm5zIE5VTEwgaWYgbm90IHNldC4KKyAqLworc3RhdGljIGNvbnN0IGNoYXIqIEZBU1RfRlVOQworbG9va3VwdmFyKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHZhciAqdjsKKworCXYgPSAqZmluZHZhcihoYXNodmFyKG5hbWUpLCBuYW1lKTsKKwlpZiAodikgeworI2lmIEVOQUJMRV9BU0hfUkFORE9NX1NVUFBPUlQKKwkvKgorCSAqIER5bmFtaWMgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCByb3VnaGx5IHRoZSBzYW1lIHdheSB0aGV5IGFyZQorCSAqIGluIGJhc2guIE5hbWVseSwgdGhleSdyZSAic3BlY2lhbCIgc28gbG9uZyBhcyB0aGV5IGFyZW4ndCB1bnNldC4KKwkgKiBBcyBzb29uIGFzIHRoZXkncmUgdW5zZXQsIHRoZXkncmUgbm8gbG9uZ2VyIGR5bmFtaWMsIGFuZCBkeW5hbWljCisJICogbG9va3VwIHdpbGwgbm8gbG9uZ2VyIGhhcHBlbiBhdCB0aGF0IHBvaW50LiAtLSBQRk0uCisJICovCisJCWlmICh2LT5mbGFncyAmIFZEWU5BTUlDKQorCQkJdi0+dmFyX2Z1bmMoTlVMTCk7CisjZW5kaWYKKwkJaWYgKCEodi0+ZmxhZ3MgJiBWVU5TRVQpKQorCQkJcmV0dXJuIHZhcl9lbmQodi0+dmFyX3RleHQpOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgcmVpbml0X3VuaWNvZGVfZm9yX2FzaCh2b2lkKQoreworCS8qIFVuaWNvZGUgc3VwcG9ydCBzaG91bGQgYmUgYWN0aXZhdGVkIGV2ZW4gaWYgTEFORyBpcyBzZXQKKwkgKiBfZHVyaW5nXyBzaGVsbCBleGVjdXRpb24sIG5vdCBvbmx5IGlmIGl0IHdhcyBzZXQgd2hlbgorCSAqIHNoZWxsIHdhcyBzdGFydGVkLiBUaGVyZWZvcmUsIHJlLWNoZWNrIExBTkcgZXZlcnkgdGltZToKKwkgKi8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0hFQ0tfVU5JQ09ERV9JTl9FTlYKKwkgfHwgRU5BQkxFX1VOSUNPREVfVVNJTkdfTE9DQUxFCisJKSB7CisJCWNvbnN0IGNoYXIgKnMgPSBsb29rdXB2YXIoIkxDX0FMTCIpOworCQlpZiAoIXMpIHMgPSBsb29rdXB2YXIoIkxDX0NUWVBFIik7CisJCWlmICghcykgcyA9IGxvb2t1cHZhcigiTEFORyIpOworCQlyZWluaXRfdW5pY29kZShzKTsKKwl9Cit9CisKKy8qCisgKiBTZWFyY2ggdGhlIGVudmlyb25tZW50IG9mIGEgYnVpbHRpbiBjb21tYW5kLgorICovCitzdGF0aWMgY29uc3QgY2hhciAqCitibHRpbmxvb2t1cChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBzdHJsaXN0ICpzcDsKKworCWZvciAoc3AgPSBjbWRlbnZpcm9uOyBzcDsgc3AgPSBzcC0+bmV4dCkgeworCQlpZiAodmFyY21wKHNwLT50ZXh0LCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuIHZhcl9lbmQoc3AtPnRleHQpOworCX0KKwlyZXR1cm4gbG9va3VwdmFyKG5hbWUpOworfQorCisvKgorICogU2FtZSBhcyBzZXR2YXIgZXhjZXB0IHRoYXQgdGhlIHZhcmlhYmxlIGFuZCB2YWx1ZSBhcmUgcGFzc2VkIGluCisgKiB0aGUgZmlyc3QgYXJndW1lbnQgYXMgbmFtZT12YWx1ZS4gIFNpbmNlIHRoZSBmaXJzdCBhcmd1bWVudCB3aWxsCisgKiBiZSBhY3R1YWxseSBzdG9yZWQgaW4gdGhlIHRhYmxlLCBpdCBzaG91bGQgbm90IGJlIGEgc3RyaW5nIHRoYXQKKyAqIHdpbGwgZ28gYXdheS4KKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgb2ZmLgorICovCitzdGF0aWMgdm9pZAorc2V0dmFyZXEoY2hhciAqcywgaW50IGZsYWdzKQoreworCXN0cnVjdCB2YXIgKnZwLCAqKnZwcDsKKworCXZwcCA9IGhhc2h2YXIocyk7CisJZmxhZ3MgfD0gKFZFWFBPUlQgJiAoKCh1bnNpZ25lZCkgKDEgLSBhZmxhZykpIC0gMSkpOworCXZwID0gKmZpbmR2YXIodnBwLCBzKTsKKwlpZiAodnApIHsKKwkJaWYgKCh2cC0+ZmxhZ3MgJiAoVlJFQURPTkxZfFZEWU5BTUlDKSkgPT0gVlJFQURPTkxZKSB7CisJCQljb25zdCBjaGFyICpuOworCisJCQlpZiAoZmxhZ3MgJiBWTk9TQVZFKQorCQkJCWZyZWUocyk7CisJCQluID0gdnAtPnZhcl90ZXh0OworCQkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoIiUuKnM6IGlzIHJlYWQgb25seSIsIHN0cmNocm51bChuLCAnPScpIC0gbiwgbik7CisJCX0KKworCQlpZiAoZmxhZ3MgJiBWTk9TRVQpCisJCQlyZXR1cm47CisKKwkJaWYgKHZwLT52YXJfZnVuYyAmJiAhKGZsYWdzICYgVk5PRlVOQykpCisJCQl2cC0+dmFyX2Z1bmModmFyX2VuZChzKSk7CisKKwkJaWYgKCEodnAtPmZsYWdzICYgKFZURVhURklYRUR8VlNUQUNLKSkpCisJCQlmcmVlKChjaGFyKil2cC0+dmFyX3RleHQpOworCisJCWZsYWdzIHw9IHZwLT5mbGFncyAmIH4oVlRFWFRGSVhFRHxWU1RBQ0t8Vk5PU0FWRXxWVU5TRVQpOworCX0gZWxzZSB7CisJCS8qIHZhcmlhYmxlIHMgaXMgbm90IGZvdW5kICovCisJCWlmIChmbGFncyAmIFZOT1NFVCkKKwkJCXJldHVybjsKKwkJdnAgPSBja3phbGxvYyhzaXplb2YoKnZwKSk7CisJCXZwLT5uZXh0ID0gKnZwcDsKKwkJLyp2cC0+ZnVuYyA9IE5VTEw7IC0gY2t6YWxsb2MgZGlkIGl0ICovCisJCSp2cHAgPSB2cDsKKwl9CisJaWYgKCEoZmxhZ3MgJiAoVlRFWFRGSVhFRHxWU1RBQ0t8Vk5PU0FWRSkpKQorCQlzID0gY2tzdHJkdXAocyk7CisJdnAtPnZhcl90ZXh0ID0gczsKKwl2cC0+ZmxhZ3MgPSBmbGFnczsKK30KKworLyoKKyAqIFNldCB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZS4gIFRoZSBmbGFncyBhcmd1bWVudCBpcyBvcmVkIHdpdGggdGhlCisgKiBmbGFncyBvZiB0aGUgdmFyaWFibGUuICBJZiB2YWwgaXMgTlVMTCwgdGhlIHZhcmlhYmxlIGlzIHVuc2V0LgorICovCitzdGF0aWMgdm9pZAorc2V0dmFyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbCwgaW50IGZsYWdzKQoreworCWNvbnN0IGNoYXIgKnE7CisJY2hhciAqcDsKKwljaGFyICpuYW1lZXE7CisJc2l6ZV90IG5hbWVsZW47CisJc2l6ZV90IHZhbGxlbjsKKworCXEgPSBlbmRvZm5hbWUobmFtZSk7CisJcCA9IHN0cmNocm51bChxLCAnPScpOworCW5hbWVsZW4gPSBwIC0gbmFtZTsKKwlpZiAoIW5hbWVsZW4gfHwgcCAhPSBxKQorCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigiJS4qczogYmFkIHZhcmlhYmxlIG5hbWUiLCBuYW1lbGVuLCBuYW1lKTsKKwl2YWxsZW4gPSAwOworCWlmICh2YWwgPT0gTlVMTCkgeworCQlmbGFncyB8PSBWVU5TRVQ7CisJfSBlbHNlIHsKKwkJdmFsbGVuID0gc3RybGVuKHZhbCk7CisJfQorCisJSU5UX09GRjsKKwluYW1lZXEgPSBja21hbGxvYyhuYW1lbGVuICsgdmFsbGVuICsgMik7CisJcCA9IG1lbWNweShuYW1lZXEsIG5hbWUsIG5hbWVsZW4pICsgbmFtZWxlbjsKKwlpZiAodmFsKSB7CisJCSpwKysgPSAnPSc7CisJCXAgPSBtZW1jcHkocCwgdmFsLCB2YWxsZW4pICsgdmFsbGVuOworCX0KKwkqcCA9ICdcMCc7CisJc2V0dmFyZXEobmFtZWVxLCBmbGFncyB8IFZOT1NBVkUpOworCUlOVF9PTjsKK30KKworc3RhdGljIHZvaWQgRkFTVF9GVU5DCitzZXR2YXIwKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZhbCkKK3sKKwlzZXR2YXIobmFtZSwgdmFsLCAwKTsKK30KKworI2lmIEVOQUJMRV9BU0hfR0VUT1BUUworLyoKKyAqIFNhZmUgdmVyc2lvbiBvZiBzZXR2YXIsIHJldHVybnMgMSBvbiBzdWNjZXNzIDAgb24gZmFpbHVyZS4KKyAqLworc3RhdGljIGludAorc2V0dmFyc2FmZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWwsIGludCBmbGFncykKK3sKKwlpbnQgZXJyOworCXZvbGF0aWxlIGludCBzYXZlaW50OworCXN0cnVjdCBqbXBsb2MgKnZvbGF0aWxlIHNhdmVoYW5kbGVyID0gZXhjZXB0aW9uX2hhbmRsZXI7CisJc3RydWN0IGptcGxvYyBqbXBsb2M7CisKKwlTQVZFX0lOVChzYXZlaW50KTsKKwlpZiAoc2V0am1wKGptcGxvYy5sb2MpKQorCQllcnIgPSAxOworCWVsc2UgeworCQlleGNlcHRpb25faGFuZGxlciA9ICZqbXBsb2M7CisJCXNldHZhcihuYW1lLCB2YWwsIGZsYWdzKTsKKwkJZXJyID0gMDsKKwl9CisJZXhjZXB0aW9uX2hhbmRsZXIgPSBzYXZlaGFuZGxlcjsKKwlSRVNUT1JFX0lOVChzYXZlaW50KTsKKwlyZXR1cm4gZXJyOworfQorI2VuZGlmCisKKy8qCisgKiBVbnNldCB0aGUgc3BlY2lmaWVkIHZhcmlhYmxlLgorICovCitzdGF0aWMgaW50Cit1bnNldHZhcihjb25zdCBjaGFyICpzKQoreworCXN0cnVjdCB2YXIgKip2cHA7CisJc3RydWN0IHZhciAqdnA7CisJaW50IHJldHZhbDsKKworCXZwcCA9IGZpbmR2YXIoaGFzaHZhcihzKSwgcyk7CisJdnAgPSAqdnBwOworCXJldHZhbCA9IDI7CisJaWYgKHZwKSB7CisJCWludCBmbGFncyA9IHZwLT5mbGFnczsKKworCQlyZXR2YWwgPSAxOworCQlpZiAoZmxhZ3MgJiBWUkVBRE9OTFkpCisJCQlnb3RvIG91dDsKKyNpZiBFTkFCTEVfQVNIX1JBTkRPTV9TVVBQT1JUCisJCXZwLT5mbGFncyAmPSB+VkRZTkFNSUM7CisjZW5kaWYKKwkJaWYgKGZsYWdzICYgVlVOU0VUKQorCQkJZ290byBvazsKKwkJaWYgKChmbGFncyAmIFZTVFJGSVhFRCkgPT0gMCkgeworCQkJSU5UX09GRjsKKwkJCWlmICgoZmxhZ3MgJiAoVlRFWFRGSVhFRHxWU1RBQ0spKSA9PSAwKQorCQkJCWZyZWUoKGNoYXIqKXZwLT52YXJfdGV4dCk7CisJCQkqdnBwID0gdnAtPm5leHQ7CisJCQlmcmVlKHZwKTsKKwkJCUlOVF9PTjsKKwkJfSBlbHNlIHsKKwkJCXNldHZhcjAocywgTlVMTCk7CisJCQl2cC0+ZmxhZ3MgJj0gflZFWFBPUlQ7CisJCX0KKyBvazoKKwkJcmV0dmFsID0gMDsKKwl9Cisgb3V0OgorCXJldHVybiByZXR2YWw7Cit9CisKKy8qCisgKiBQcm9jZXNzIGEgbGlua2VkIGxpc3Qgb2YgdmFyaWFibGUgYXNzaWdubWVudHMuCisgKi8KK3N0YXRpYyB2b2lkCitsaXN0c2V0dmFyKHN0cnVjdCBzdHJsaXN0ICpsaXN0X3NldF92YXIsIGludCBmbGFncykKK3sKKwlzdHJ1Y3Qgc3RybGlzdCAqbHAgPSBsaXN0X3NldF92YXI7CisKKwlpZiAoIWxwKQorCQlyZXR1cm47CisJSU5UX09GRjsKKwlkbyB7CisJCXNldHZhcmVxKGxwLT50ZXh0LCBmbGFncyk7CisJCWxwID0gbHAtPm5leHQ7CisJfSB3aGlsZSAobHApOworCUlOVF9PTjsKK30KKworLyoKKyAqIEdlbmVyYXRlIGEgbGlzdCBvZiB2YXJpYWJsZXMgc2F0aXNmeWluZyB0aGUgZ2l2ZW4gY29uZGl0aW9ucy4KKyAqLworc3RhdGljIGNoYXIgKioKK2xpc3R2YXJzKGludCBvbiwgaW50IG9mZiwgY2hhciAqKiplbmQpCit7CisJc3RydWN0IHZhciAqKnZwcDsKKwlzdHJ1Y3QgdmFyICp2cDsKKwljaGFyICoqZXA7CisJaW50IG1hc2s7CisKKwlTVEFSVFNUQUNLU1RSKGVwKTsKKwl2cHAgPSB2YXJ0YWI7CisJbWFzayA9IG9uIHwgb2ZmOworCWRvIHsKKwkJZm9yICh2cCA9ICp2cHA7IHZwOyB2cCA9IHZwLT5uZXh0KSB7CisJCQlpZiAoKHZwLT5mbGFncyAmIG1hc2spID09IG9uKSB7CisJCQkJaWYgKGVwID09IHN0YWNrc3RyZW5kKCkpCisJCQkJCWVwID0gZ3Jvd3N0YWNrc3RyKCk7CisJCQkJKmVwKysgPSAoY2hhciopdnAtPnZhcl90ZXh0OworCQkJfQorCQl9CisJfSB3aGlsZSAoKyt2cHAgPCB2YXJ0YWIgKyBWVEFCU0laRSk7CisJaWYgKGVwID09IHN0YWNrc3RyZW5kKCkpCisJCWVwID0gZ3Jvd3N0YWNrc3RyKCk7CisJaWYgKGVuZCkKKwkJKmVuZCA9IGVwOworCSplcCsrID0gTlVMTDsKKwlyZXR1cm4gZ3JhYnN0YWNrc3RyKGVwKTsKK30KKworCisvKiA9PT09PT09PT09PT0gUGF0aCBzZWFyY2ggaGVscGVyCisgKgorICogVGhlIHZhcmlhYmxlIHBhdGggKHBhc3NlZCBieSByZWZlcmVuY2UpIHNob3VsZCBiZSBzZXQgdG8gdGhlIHN0YXJ0CisgKiBvZiB0aGUgcGF0aCBiZWZvcmUgdGhlIGZpcnN0IGNhbGw7IHBhdGhfYWR2YW5jZSB3aWxsIHVwZGF0ZQorICogdGhpcyB2YWx1ZSBhcyBpdCBwcm9jZWVkcy4gIFN1Y2Nlc3NpdmUgY2FsbHMgdG8gcGF0aF9hZHZhbmNlIHdpbGwgcmV0dXJuCisgKiB0aGUgcG9zc2libGUgcGF0aCBleHBhbnNpb25zIGluIHNlcXVlbmNlLiAgSWYgYW4gb3B0aW9uIChpbmRpY2F0ZWQgYnkKKyAqIGEgcGVyY2VudCBzaWduKSBhcHBlYXJzIGluIHRoZSBwYXRoIGVudHJ5IHRoZW4gdGhlIGdsb2JhbCB2YXJpYWJsZQorICogcGF0aG9wdCB3aWxsIGJlIHNldCB0byBwb2ludCB0byBpdDsgb3RoZXJ3aXNlIHBhdGhvcHQgd2lsbCBiZSBzZXQgdG8KKyAqIE5VTEwuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpwYXRob3B0OyAgICAgLyogc2V0IGJ5IHBhdGhfYWR2YW5jZSAqLworCitzdGF0aWMgY2hhciAqCitwYXRoX2FkdmFuY2UoY29uc3QgY2hhciAqKnBhdGgsIGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY29uc3QgY2hhciAqcDsKKwljaGFyICpxOworCWNvbnN0IGNoYXIgKnN0YXJ0OworCXNpemVfdCBsZW47CisKKwlpZiAoKnBhdGggPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJc3RhcnQgPSAqcGF0aDsKKwlmb3IgKHAgPSBzdGFydDsgKnAgJiYgKnAgIT0gJzonICYmICpwICE9ICclJzsgcCsrKQorCQljb250aW51ZTsKKwlsZW4gPSBwIC0gc3RhcnQgKyBzdHJsZW4obmFtZSkgKyAyOyAgICAgLyogIjIiIGlzIGZvciAnLycgYW5kICdcMCcgKi8KKwl3aGlsZSAoc3RhY2tibG9ja3NpemUoKSA8IGxlbikKKwkJZ3Jvd3N0YWNrYmxvY2soKTsKKwlxID0gc3RhY2tibG9jaygpOworCWlmIChwICE9IHN0YXJ0KSB7CisJCW1lbWNweShxLCBzdGFydCwgcCAtIHN0YXJ0KTsKKwkJcSArPSBwIC0gc3RhcnQ7CisJCSpxKysgPSAnLyc7CisJfQorCXN0cmNweShxLCBuYW1lKTsKKwlwYXRob3B0ID0gTlVMTDsKKwlpZiAoKnAgPT0gJyUnKSB7CisJCXBhdGhvcHQgPSArK3A7CisJCXdoaWxlICgqcCAmJiAqcCAhPSAnOicpCisJCQlwKys7CisJfQorCWlmICgqcCA9PSAnOicpCisJCSpwYXRoID0gcCArIDE7CisJZWxzZQorCQkqcGF0aCA9IE5VTEw7CisJcmV0dXJuIHN0YWxsb2MobGVuKTsKK30KKworCisvKiA9PT09PT09PT09PT0gUHJvbXB0ICovCisKK3N0YXRpYyBzbWFsbGludCBkb3Byb21wdDsgICAgICAgICAgICAgICAgICAgLyogaWYgc2V0LCBwcm9tcHQgdGhlIHVzZXIgKi8KK3N0YXRpYyBzbWFsbGludCBuZWVkcHJvbXB0OyAgICAgICAgICAgICAgICAgLyogdHJ1ZSBpZiBpbnRlcmFjdGl2ZSBhbmQgYXQgc3RhcnQgb2YgbGluZSAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElORworc3RhdGljIGxpbmVfaW5wdXRfdCAqbGluZV9pbnB1dF9zdGF0ZTsKK3N0YXRpYyBjb25zdCBjaGFyICpjbWRlZGl0X3Byb21wdDsKK3N0YXRpYyB2b2lkCitwdXRwcm9tcHQoY29uc3QgY2hhciAqcykKK3sKKwlpZiAoRU5BQkxFX0FTSF9FWFBBTkRfUFJNVCkgeworCQlmcmVlKChjaGFyKiljbWRlZGl0X3Byb21wdCk7CisJCWNtZGVkaXRfcHJvbXB0ID0gY2tzdHJkdXAocyk7CisJCXJldHVybjsKKwl9CisJY21kZWRpdF9wcm9tcHQgPSBzOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkCitwdXRwcm9tcHQoY29uc3QgY2hhciAqcykKK3sKKwlvdXQyc3RyKHMpOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfQVNIX0VYUEFORF9QUk1UCisvKiBleHBhbmRzdHIoKSBuZWVkcyBwYXJzaW5nIG1hY2hpbmVyeSwgc28gaXQgaXMgZmFyIGF3YXkgYWhlYWQuLi4gKi8KK3N0YXRpYyBjb25zdCBjaGFyICpleHBhbmRzdHIoY29uc3QgY2hhciAqcHMpOworI2Vsc2UKKyNkZWZpbmUgZXhwYW5kc3RyKHMpIHMKKyNlbmRpZgorCitzdGF0aWMgdm9pZAorc2V0cHJvbXB0X2lmKHNtYWxsaW50IGRvX3NldCwgaW50IHdoaWNocHJvbXB0KQoreworCWNvbnN0IGNoYXIgKnByb21wdDsKKwlJRl9BU0hfRVhQQU5EX1BSTVQoc3RydWN0IHN0YWNrbWFyayBzbWFyazspCisKKwlpZiAoIWRvX3NldCkKKwkJcmV0dXJuOworCisJbmVlZHByb21wdCA9IDA7CisKKwlzd2l0Y2ggKHdoaWNocHJvbXB0KSB7CisJY2FzZSAxOgorCQlwcm9tcHQgPSBwczF2YWwoKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQlwcm9tcHQgPSBwczJ2YWwoKTsKKwkJYnJlYWs7CisJZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAvKiAwICovCisJCXByb21wdCA9IG51bGxzdHI7CisJfQorI2lmIEVOQUJMRV9BU0hfRVhQQU5EX1BSTVQKKwlzZXRzdGFja21hcmsoJnNtYXJrKTsKKwlzdGFsbG9jKHN0YWNrYmxvY2tzaXplKCkpOworI2VuZGlmCisJcHV0cHJvbXB0KGV4cGFuZHN0cihwcm9tcHQpKTsKKyNpZiBFTkFCTEVfQVNIX0VYUEFORF9QUk1UCisJcG9wc3RhY2ttYXJrKCZzbWFyayk7CisjZW5kaWYKK30KKworCisvKiA9PT09PT09PT09PT0gVGhlIGNkIGFuZCBwd2QgY29tbWFuZHMgKi8KKworI2RlZmluZSBDRF9QSFlTSUNBTCAxCisjZGVmaW5lIENEX1BSSU5UIDIKKworc3RhdGljIGludAorY2RvcHQodm9pZCkKK3sKKwlpbnQgZmxhZ3MgPSAwOworCWludCBpLCBqOworCisJaiA9ICdMJzsKKwl3aGlsZSAoKGkgPSBuZXh0b3B0KCJMUCIpKSAhPSAnXDAnKSB7CisJCWlmIChpICE9IGopIHsKKwkJCWZsYWdzIF49IENEX1BIWVNJQ0FMOworCQkJaiA9IGk7CisJCX0KKwl9CisKKwlyZXR1cm4gZmxhZ3M7Cit9CisKKy8qCisgKiBVcGRhdGUgY3VyZGlyICh0aGUgbmFtZSBvZiB0aGUgY3VycmVudCBkaXJlY3RvcnkpIGluIHJlc3BvbnNlIHRvIGEKKyAqIGNkIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICoKK3VwZGF0ZXB3ZChjb25zdCBjaGFyICpkaXIpCit7CisJY2hhciAqbmV3OworCWNoYXIgKnA7CisJY2hhciAqY2Rjb21wcGF0aDsKKwljb25zdCBjaGFyICpsaW07CisKKwljZGNvbXBwYXRoID0gc3RzdHJkdXAoZGlyKTsKKwlTVEFSVFNUQUNLU1RSKG5ldyk7CisJaWYgKCpkaXIgIT0gJy8nKSB7CisJCWlmIChjdXJkaXIgPT0gbnVsbHN0cikKKwkJCXJldHVybiAwOworCQluZXcgPSBzdGFja19wdXRzdHIoY3VyZGlyLCBuZXcpOworCX0KKwluZXcgPSBtYWtlc3Ryc3BhY2Uoc3RybGVuKGRpcikgKyAyLCBuZXcpOworCWxpbSA9IChjaGFyICopc3RhY2tibG9jaygpICsgMTsKKwlpZiAoKmRpciAhPSAnLycpIHsKKwkJaWYgKG5ld1stMV0gIT0gJy8nKQorCQkJVVNUUFVUQygnLycsIG5ldyk7CisJCWlmIChuZXcgPiBsaW0gJiYgKmxpbSA9PSAnLycpCisJCQlsaW0rKzsKKwl9IGVsc2UgeworCQlVU1RQVVRDKCcvJywgbmV3KTsKKwkJY2Rjb21wcGF0aCsrOworCQlpZiAoZGlyWzFdID09ICcvJyAmJiBkaXJbMl0gIT0gJy8nKSB7CisJCQlVU1RQVVRDKCcvJywgbmV3KTsKKwkJCWNkY29tcHBhdGgrKzsKKwkJCWxpbSsrOworCQl9CisJfQorCXAgPSBzdHJ0b2soY2Rjb21wcGF0aCwgIi8iKTsKKwl3aGlsZSAocCkgeworCQlzd2l0Y2ggKCpwKSB7CisJCWNhc2UgJy4nOgorCQkJaWYgKHBbMV0gPT0gJy4nICYmIHBbMl0gPT0gJ1wwJykgeworCQkJCXdoaWxlIChuZXcgPiBsaW0pIHsKKwkJCQkJU1RVTlBVVEMobmV3KTsKKwkJCQkJaWYgKG5ld1stMV0gPT0gJy8nKQorCQkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHBbMV0gPT0gJ1wwJykKKwkJCQlicmVhazsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQlkZWZhdWx0OgorCQkJbmV3ID0gc3RhY2tfcHV0c3RyKHAsIG5ldyk7CisJCQlVU1RQVVRDKCcvJywgbmV3KTsKKwkJfQorCQlwID0gc3RydG9rKDAsICIvIik7CisJfQorCWlmIChuZXcgPiBsaW0pCisJCVNUVU5QVVRDKG5ldyk7CisJKm5ldyA9IDA7CisJcmV0dXJuIHN0YWNrYmxvY2soKTsKK30KKworLyoKKyAqIEZpbmQgb3V0IHdoYXQgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzLiBJZiB3ZSBhbHJlYWR5IGtub3cgdGhlIGN1cnJlbnQKKyAqIGRpcmVjdG9yeSwgdGhpcyByb3V0aW5lIHJldHVybnMgaW1tZWRpYXRlbHkuCisgKi8KK3N0YXRpYyBjaGFyICoKK2dldHB3ZCh2b2lkKQoreworCWNoYXIgKmRpciA9IGdldGN3ZChOVUxMLCAwKTsgLyogaHVoLCB1c2luZyBnbGliYyBleHRlbnNpb24/ICovCisJcmV0dXJuIGRpciA/IGRpciA6IG51bGxzdHI7Cit9CisKK3N0YXRpYyB2b2lkCitzZXRwd2QoY29uc3QgY2hhciAqdmFsLCBpbnQgc2V0b2xkKQoreworCWNoYXIgKm9sZGN1ciwgKmRpcjsKKworCW9sZGN1ciA9IGRpciA9IGN1cmRpcjsKKworCWlmIChzZXRvbGQpIHsKKwkJc2V0dmFyKCJPTERQV0QiLCBvbGRjdXIsIFZFWFBPUlQpOworCX0KKwlJTlRfT0ZGOworCWlmIChwaHlzZGlyICE9IG51bGxzdHIpIHsKKwkJaWYgKHBoeXNkaXIgIT0gb2xkY3VyKQorCQkJZnJlZShwaHlzZGlyKTsKKwkJcGh5c2RpciA9IG51bGxzdHI7CisJfQorCWlmIChvbGRjdXIgPT0gdmFsIHx8ICF2YWwpIHsKKwkJY2hhciAqcyA9IGdldHB3ZCgpOworCQlwaHlzZGlyID0gczsKKwkJaWYgKCF2YWwpCisJCQlkaXIgPSBzOworCX0gZWxzZQorCQlkaXIgPSBja3N0cmR1cCh2YWwpOworCWlmIChvbGRjdXIgIT0gZGlyICYmIG9sZGN1ciAhPSBudWxsc3RyKSB7CisJCWZyZWUob2xkY3VyKTsKKwl9CisJY3VyZGlyID0gZGlyOworCUlOVF9PTjsKKwlzZXR2YXIoIlBXRCIsIGRpciwgVkVYUE9SVCk7Cit9CisKK3N0YXRpYyB2b2lkIGhhc2hjZCh2b2lkKTsKKworLyoKKyAqIEFjdHVhbGx5IGRvIHRoZSBjaGRpci4gIFdlIGFsc28gY2FsbCBoYXNoY2QgdG8gbGV0IHRoZSByb3V0aW5lcyBpbiBleGVjLmMKKyAqIGtub3cgdGhhdCB0aGUgY3VycmVudCBkaXJlY3RvcnkgaGFzIGNoYW5nZWQuCisgKi8KK3N0YXRpYyBpbnQKK2RvY2QoY29uc3QgY2hhciAqZGVzdCwgaW50IGZsYWdzKQoreworCWNvbnN0IGNoYXIgKmRpciA9IE5VTEw7CisJaW50IGVycjsKKworCVRSQUNFKCgiZG9jZChcIiVzXCIsICVkKSBjYWxsZWRcbiIsIGRlc3QsIGZsYWdzKSk7CisKKwlJTlRfT0ZGOworCWlmICghKGZsYWdzICYgQ0RfUEhZU0lDQUwpKSB7CisJCWRpciA9IHVwZGF0ZXB3ZChkZXN0KTsKKwkJaWYgKGRpcikKKwkJCWRlc3QgPSBkaXI7CisJfQorCWVyciA9IGNoZGlyKGRlc3QpOworCWlmIChlcnIpCisJCWdvdG8gb3V0OworCXNldHB3ZChkaXIsIDEpOworCWhhc2hjZCgpOworIG91dDoKKwlJTlRfT047CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMKK2NkY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCWNvbnN0IGNoYXIgKmRlc3Q7CisJY29uc3QgY2hhciAqcGF0aDsKKwljb25zdCBjaGFyICpwOworCWNoYXIgYzsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YjsKKwlpbnQgZmxhZ3M7CisKKwlmbGFncyA9IGNkb3B0KCk7CisJZGVzdCA9ICphcmdwdHI7CisJaWYgKCFkZXN0KQorCQlkZXN0ID0gYmx0aW5sb29rdXAoIkhPTUUiKTsKKwllbHNlIGlmIChMT05FX0RBU0goZGVzdCkpIHsKKwkJZGVzdCA9IGJsdGlubG9va3VwKCJPTERQV0QiKTsKKwkJZmxhZ3MgfD0gQ0RfUFJJTlQ7CisJfQorCWlmICghZGVzdCkKKwkJZGVzdCA9IG51bGxzdHI7CisJaWYgKCpkZXN0ID09ICcvJykKKwkJZ290byBzdGVwNzsKKwlpZiAoKmRlc3QgPT0gJy4nKSB7CisJCWMgPSBkZXN0WzFdOworIGRvdGRvdDoKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ1wwJzoKKwkJY2FzZSAnLyc6CisJCQlnb3RvIHN0ZXA2OworCQljYXNlICcuJzoKKwkJCWMgPSBkZXN0WzJdOworCQkJaWYgKGMgIT0gJy4nKQorCQkJCWdvdG8gZG90ZG90OworCQl9CisJfQorCWlmICghKmRlc3QpCisJCWRlc3QgPSAiLiI7CisJcGF0aCA9IGJsdGlubG9va3VwKCJDRFBBVEgiKTsKKwlpZiAoIXBhdGgpIHsKKyBzdGVwNjoKKyBzdGVwNzoKKwkJcCA9IGRlc3Q7CisJCWdvdG8gZG9jZDsKKwl9CisJZG8geworCQljID0gKnBhdGg7CisJCXAgPSBwYXRoX2FkdmFuY2UoJnBhdGgsIGRlc3QpOworCQlpZiAoc3RhdChwLCAmc3RhdGIpID49IDAgJiYgU19JU0RJUihzdGF0Yi5zdF9tb2RlKSkgeworCQkJaWYgKGMgJiYgYyAhPSAnOicpCisJCQkJZmxhZ3MgfD0gQ0RfUFJJTlQ7CisgZG9jZDoKKwkJCWlmICghZG9jZChwLCBmbGFncykpCisJCQkJZ290byBvdXQ7CisJCQlicmVhazsKKwkJfQorCX0gd2hpbGUgKHBhdGgpOworCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCJjYW4ndCBjZCB0byAlcyIsIGRlc3QpOworCS8qIE5PVFJFQUNIRUQgKi8KKyBvdXQ6CisJaWYgKGZsYWdzICYgQ0RfUFJJTlQpCisJCW91dDFmbXQoIiVzXG4iLCBjdXJkaXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQworcHdkY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCWludCBmbGFnczsKKwljb25zdCBjaGFyICpkaXIgPSBjdXJkaXI7CisKKwlmbGFncyA9IGNkb3B0KCk7CisJaWYgKGZsYWdzKSB7CisJCWlmIChwaHlzZGlyID09IG51bGxzdHIpCisJCQlzZXRwd2QoZGlyLCAwKTsKKwkJZGlyID0gcGh5c2RpcjsKKwl9CisJb3V0MWZtdCgiJXNcbiIsIGRpcik7CisJcmV0dXJuIDA7Cit9CisKKworLyogPT09PT09PT09PT09IC4uLiAqLworCisKKyNkZWZpbmUgSUJVRlNJWiAoRU5BQkxFX0ZFQVRVUkVfRURJVElORyA/IENPTkZJR19GRUFUVVJFX0VESVRJTkdfTUFYX0xFTiA6IDEwMjQpCisKKy8qIFN5bnRheCBjbGFzc2VzICovCisjZGVmaW5lIENXT1JEICAgICAwICAgICAgICAgICAgIC8qIGNoYXJhY3RlciBpcyBub3RoaW5nIHNwZWNpYWwgKi8KKyNkZWZpbmUgQ05MICAgICAgIDEgICAgICAgICAgICAgLyogbmV3bGluZSBjaGFyYWN0ZXIgKi8KKyNkZWZpbmUgQ0JBQ0sgICAgIDIgICAgICAgICAgICAgLyogYSBiYWNrc2xhc2ggY2hhcmFjdGVyICovCisjZGVmaW5lIENTUVVPVEUgICAzICAgICAgICAgICAgIC8qIHNpbmdsZSBxdW90ZSAqLworI2RlZmluZSBDRFFVT1RFICAgNCAgICAgICAgICAgICAvKiBkb3VibGUgcXVvdGUgKi8KKyNkZWZpbmUgQ0VORFFVT1RFIDUgICAgICAgICAgICAgLyogYSB0ZXJtaW5hdGluZyBxdW90ZSAqLworI2RlZmluZSBDQlFVT1RFICAgNiAgICAgICAgICAgICAvKiBiYWNrd2FyZHMgc2luZ2xlIHF1b3RlICovCisjZGVmaW5lIENWQVIgICAgICA3ICAgICAgICAgICAgIC8qIGEgZG9sbGFyIHNpZ24gKi8KKyNkZWZpbmUgQ0VORFZBUiAgIDggICAgICAgICAgICAgLyogYSAnfScgY2hhcmFjdGVyICovCisjZGVmaW5lIENMUCAgICAgICA5ICAgICAgICAgICAgIC8qIGEgbGVmdCBwYXJlbiBpbiBhcml0aG1ldGljICovCisjZGVmaW5lIENSUCAgICAgIDEwICAgICAgICAgICAgIC8qIGEgcmlnaHQgcGFyZW4gaW4gYXJpdGhtZXRpYyAqLworI2RlZmluZSBDRU5ERklMRSAxMSAgICAgICAgICAgICAvKiBlbmQgb2YgZmlsZSAqLworI2RlZmluZSBDQ1RMICAgICAxMiAgICAgICAgICAgICAvKiBsaWtlIENXT1JELCBleGNlcHQgaXQgbXVzdCBiZSBlc2NhcGVkICovCisjZGVmaW5lIENTUENMICAgIDEzICAgICAgICAgICAgIC8qIHRoZXNlIHRlcm1pbmF0ZSBhIHdvcmQgKi8KKyNkZWZpbmUgQ0lHTiAgICAgMTQgICAgICAgICAgICAgLyogY2hhcmFjdGVyIHNob3VsZCBiZSBpZ25vcmVkICovCisKKyNkZWZpbmUgUEVPRiAgICAgMjU2CisjaWYgRU5BQkxFX0FTSF9BTElBUworIyBkZWZpbmUgUEVPQSAgICAyNTcKKyNlbmRpZgorCisjZGVmaW5lIFVTRV9TSVRfRlVOQ1RJT04gRU5BQkxFX0FTSF9PUFRJTUlaRV9GT1JfU0laRQorCisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorIyBkZWZpbmUgU0lUX0lURU0oYSxiLGMsZCkgKGEgfCAoYiA8PCA0KSB8IChjIDw8IDgpIHwgKGQgPDwgMTIpKQorI2Vsc2UKKyMgZGVmaW5lIFNJVF9JVEVNKGEsYixjLGQpIChhIHwgKGIgPDwgNCkgfCAoYyA8PCA4KSkKKyNlbmRpZgorc3RhdGljIGNvbnN0IHVpbnQxNl90IFNfSV9UW10gPSB7CisjaWYgRU5BQkxFX0FTSF9BTElBUworCVNJVF9JVEVNKENTUENMICAgLCBDSUdOICAgICAsIENJR04gLCBDSUdOICAgKSwgICAgLyogMCwgUEVPQSAqLworI2VuZGlmCisJU0lUX0lURU0oQ1NQQ0wgICAsIENXT1JEICAgICwgQ1dPUkQsIENXT1JEICApLCAgICAvKiAxLCAnICcgKi8KKwlTSVRfSVRFTShDTkwgICAgICwgQ05MICAgICAgLCBDTkwgICwgQ05MICAgICksICAgIC8qIDIsIFxuICovCisJU0lUX0lURU0oQ1dPUkQgICAsIENDVEwgICAgICwgQ0NUTCAsIENXT1JEICApLCAgICAvKiAzLCAhKi0vOj0/W11+ICovCisJU0lUX0lURU0oQ0RRVU9URSAsIENFTkRRVU9URSwgQ1dPUkQsIENXT1JEICApLCAgICAvKiA0LCAnIicgKi8KKwlTSVRfSVRFTShDVkFSICAgICwgQ1ZBUiAgICAgLCBDV09SRCwgQ1ZBUiAgICksICAgIC8qIDUsICQgKi8KKwlTSVRfSVRFTShDU1FVT1RFICwgQ1dPUkQgICAgLCBDRU5EUVVPVEUsIENXT1JEKSwgIC8qIDYsICInIiAqLworCVNJVF9JVEVNKENTUENMICAgLCBDV09SRCAgICAsIENXT1JELCBDTFAgICAgKSwgICAgLyogNywgKCAqLworCVNJVF9JVEVNKENTUENMICAgLCBDV09SRCAgICAsIENXT1JELCBDUlAgICAgKSwgICAgLyogOCwgKSAqLworCVNJVF9JVEVNKENCQUNLICAgLCBDQkFDSyAgICAsIENDVEwgLCBDQkFDSyAgKSwgICAgLyogOSwgXCAqLworCVNJVF9JVEVNKENCUVVPVEUgLCBDQlFVT1RFICAsIENXT1JELCBDQlFVT1RFKSwgICAgLyogMTAsIGAgKi8KKwlTSVRfSVRFTShDRU5EVkFSICwgQ0VORFZBUiAgLCBDV09SRCwgQ0VORFZBUiksICAgIC8qIDExLCB9ICovCisjaWYgIVVTRV9TSVRfRlVOQ1RJT04KKwlTSVRfSVRFTShDRU5ERklMRSwgQ0VOREZJTEUgLCBDRU5ERklMRSwgQ0VOREZJTEUpLC8qIDEyLCBQRU9GICovCisJU0lUX0lURU0oQ1dPUkQgICAsIENXT1JEICAgICwgQ1dPUkQsIENXT1JEICApLCAgICAvKiAxMywgMC05QS1aYS16ICovCisJU0lUX0lURU0oQ0NUTCAgICAsIENDVEwgICAgICwgQ0NUTCAsIENDVEwgICApICAgICAvKiAxNCwgQ1RMRVNDIC4uLiAqLworI2VuZGlmCisjdW5kZWYgU0lUX0lURU0KK307CisvKiBDb25zdGFudHMgYmVsb3cgbXVzdCBtYXRjaCB0YWJsZSBhYm92ZSAqLworZW51bSB7CisjaWYgRU5BQkxFX0FTSF9BTElBUworCUNTUENMX0NJR05fQ0lHTl9DSUdOICAgICAgICAgICAgICAgLCAvKiAgMCAqLworI2VuZGlmCisJQ1NQQ0xfQ1dPUkRfQ1dPUkRfQ1dPUkQgICAgICAgICAgICAsIC8qICAxICovCisJQ05MX0NOTF9DTkxfQ05MICAgICAgICAgICAgICAgICAgICAsIC8qICAyICovCisJQ1dPUkRfQ0NUTF9DQ1RMX0NXT1JEICAgICAgICAgICAgICAsIC8qICAzICovCisJQ0RRVU9URV9DRU5EUVVPVEVfQ1dPUkRfQ1dPUkQgICAgICAsIC8qICA0ICovCisJQ1ZBUl9DVkFSX0NXT1JEX0NWQVIgICAgICAgICAgICAgICAsIC8qICA1ICovCisJQ1NRVU9URV9DV09SRF9DRU5EUVVPVEVfQ1dPUkQgICAgICAsIC8qICA2ICovCisJQ1NQQ0xfQ1dPUkRfQ1dPUkRfQ0xQICAgICAgICAgICAgICAsIC8qICA3ICovCisJQ1NQQ0xfQ1dPUkRfQ1dPUkRfQ1JQICAgICAgICAgICAgICAsIC8qICA4ICovCisJQ0JBQ0tfQ0JBQ0tfQ0NUTF9DQkFDSyAgICAgICAgICAgICAsIC8qICA5ICovCisJQ0JRVU9URV9DQlFVT1RFX0NXT1JEX0NCUVVPVEUgICAgICAsIC8qIDEwICovCisJQ0VORFZBUl9DRU5EVkFSX0NXT1JEX0NFTkRWQVIgICAgICAsIC8qIDExICovCisJQ0VOREZJTEVfQ0VOREZJTEVfQ0VOREZJTEVfQ0VOREZJTEUsIC8qIDEyICovCisJQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQgICAgICAgICAgICAsIC8qIDEzICovCisJQ0NUTF9DQ1RMX0NDVExfQ0NUTCAgICAgICAgICAgICAgICAsIC8qIDE0ICovCit9OworCisvKiBjIGluIFNJVChjLCBzeW50YXgpIG11c3QgYmUgYW4gKnVuc2lnbmVkIGNoYXIqIG9yIFBFT0Egb3IgUEVPRiwKKyAqIGNhbGxlciBtdXN0IGVuc3VyZSBwcm9wZXIgY2FzdCBvbiBpdCBpZiBjIGlzICpjaGFyX3B0ciEKKyAqLworLyogVmFsdWVzIGZvciBzeW50YXggcGFyYW0gKi8KKyNkZWZpbmUgQkFTRVNZTlRBWCAwICAgIC8qIG5vdCBpbiBxdW90ZXMgKi8KKyNkZWZpbmUgRFFTWU5UQVggICAxICAgIC8qIGluIGRvdWJsZSBxdW90ZXMgKi8KKyNkZWZpbmUgU1FTWU5UQVggICAyICAgIC8qIGluIHNpbmdsZSBxdW90ZXMgKi8KKyNkZWZpbmUgQVJJU1lOVEFYICAzICAgIC8qIGluIGFyaXRobWV0aWMgKi8KKyNkZWZpbmUgUFNTWU5UQVggICA0ICAgIC8qIHByb21wdC4gbmV2ZXIgcGFzc2VkIHRvIFNJVCgpICovCisKKyNpZiBVU0VfU0lUX0ZVTkNUSU9OCisKK3N0YXRpYyBpbnQKK1NJVChpbnQgYywgaW50IHN5bnRheCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBzcGVjX3N5bWJsc1tdIEFMSUdOMSA9ICJcdFxuICFcIiQmJygpKi0vOjs8PT4/W1xcXWB8fX4iOworIyBpZiBFTkFCTEVfQVNIX0FMSUFTCisJc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3ludGF4X2luZGV4X3RhYmxlW10gQUxJR04xID0geworCQkxLCAyLCAxLCAzLCA0LCA1LCAxLCA2LCAgICAgICAgIC8qICJcdFxuICFcIiQmJyIgKi8KKwkJNywgOCwgMywgMywgMywgMywgMSwgMSwgICAgICAgICAvKiAiKCkqLS86OzwiICovCisJCTMsIDEsIDMsIDMsIDksIDMsIDEwLCAxLCAgICAgICAgLyogIj0+P1tcXF1gfCIgKi8KKwkJMTEsIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAifX4iICovCisJfTsKKyMgZWxzZQorCXN0YXRpYyBjb25zdCB1aW50OF90IHN5bnRheF9pbmRleF90YWJsZVtdIEFMSUdOMSA9IHsKKwkJMCwgMSwgMCwgMiwgMywgNCwgMCwgNSwgICAgICAgICAvKiAiXHRcbiAhXCIkJiciICovCisJCTYsIDcsIDIsIDIsIDIsIDIsIDAsIDAsICAgICAgICAgLyogIigpKi0vOjs8IiAqLworCQkyLCAwLCAyLCAyLCA4LCAyLCA5LCAwLCAgICAgICAgIC8qICI9Pj9bXFxdYHwiICovCisJCTEwLCAyICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIn1+IiAqLworCX07CisjIGVuZGlmCisJY29uc3QgY2hhciAqczsKKwlpbnQgaW5keDsKKworCWlmIChjID09IFBFT0YpCisJCXJldHVybiBDRU5ERklMRTsKKyMgaWYgRU5BQkxFX0FTSF9BTElBUworCWlmIChjID09IFBFT0EpCisJCWluZHggPSAwOworCWVsc2UKKyMgZW5kaWYKKwl7CisJCS8qIENhc3QgaXMgcHVyZWx5IGZvciBwYXJhbm9pYSBoZXJlLAorCQkgKiBqdXN0IGluIGNhc2Ugc29tZW9uZSBwYXNzZWQgc2lnbmVkIGNoYXIgdG8gdXMgKi8KKwkJaWYgKCh1bnNpZ25lZCBjaGFyKWMgPj0gQ1RMX0ZJUlNUCisJCSAmJiAodW5zaWduZWQgY2hhciljIDw9IENUTF9MQVNUCisJCSkgeworCQkJcmV0dXJuIENDVEw7CisJCX0KKwkJcyA9IHN0cmNocm51bChzcGVjX3N5bWJscywgYyk7CisJCWlmICgqcyA9PSAnXDAnKQorCQkJcmV0dXJuIENXT1JEOworCQlpbmR4ID0gc3ludGF4X2luZGV4X3RhYmxlW3MgLSBzcGVjX3N5bWJsc107CisJfQorCXJldHVybiAoU19JX1RbaW5keF0gPj4gKHN5bnRheCo0KSkgJiAweGY7Cit9CisKKyNlbHNlICAgLyogIVVTRV9TSVRfRlVOQ1RJT04gKi8KKworc3RhdGljIGNvbnN0IHVpbnQ4X3Qgc3ludGF4X2luZGV4X3RhYmxlW10gPSB7CisJLyogQkFTRVNZTlRBWF9EUVNZTlRBWF9TUVNZTlRBWF9BUklTWU5UQVggKi8KKwkvKiAgIDAgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgIDEgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgIDIgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgIDMgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgIDQgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgIDUgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgIDYgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgIDcgICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgIDggICAgICAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgIDkgIlx0IiAqLyBDU1BDTF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgMTAgIlxuIiAqLyBDTkxfQ05MX0NOTF9DTkwsCisJLyogIDExICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDEyICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDEzICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDE0ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDE1ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDE2ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDE3ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDE4ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDE5ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDIwICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDIxICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDIyICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDIzICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDI0ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDI1ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDI2ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDI3ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDI4ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDI5ICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDMwICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDMxICAgICAgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDMyICAiICIgKi8gQ1NQQ0xfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDMzICAiISIgKi8gQ1dPUkRfQ0NUTF9DQ1RMX0NXT1JELAorCS8qICAzNCAgIiIiICovIENEUVVPVEVfQ0VORFFVT1RFX0NXT1JEX0NXT1JELAorCS8qICAzNSAgIiMiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAzNiAgIiQiICovIENWQVJfQ1ZBUl9DV09SRF9DVkFSLAorCS8qICAzNyAgIiUiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAzOCAgIiYiICovIENTUENMX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICAzOSAgIiciICovIENTUVVPVEVfQ1dPUkRfQ0VORFFVT1RFX0NXT1JELAorCS8qICA0MCAgIigiICovIENTUENMX0NXT1JEX0NXT1JEX0NMUCwKKwkvKiAgNDEgICIpIiAqLyBDU1BDTF9DV09SRF9DV09SRF9DUlAsCisJLyogIDQyICAiKiIgKi8gQ1dPUkRfQ0NUTF9DQ1RMX0NXT1JELAorCS8qICA0MyAgIisiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA0NCAgIiwiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA0NSAgIi0iICovIENXT1JEX0NDVExfQ0NUTF9DV09SRCwKKwkvKiAgNDYgICIuIiAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgNDcgICIvIiAqLyBDV09SRF9DQ1RMX0NDVExfQ1dPUkQsCisJLyogIDQ4ICAiMCIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDQ5ICAiMSIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDUwICAiMiIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDUxICAiMyIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDUyICAiNCIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDUzICAiNSIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDU0ICAiNiIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDU1ICAiNyIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDU2ICAiOCIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDU3ICAiOSIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDU4ICAiOiIgKi8gQ1dPUkRfQ0NUTF9DQ1RMX0NXT1JELAorCS8qICA1OSAgIjsiICovIENTUENMX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA2MCAgIjwiICovIENTUENMX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA2MSAgIj0iICovIENXT1JEX0NDVExfQ0NUTF9DV09SRCwKKwkvKiAgNjIgICI+IiAqLyBDU1BDTF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAgNjMgICI/IiAqLyBDV09SRF9DQ1RMX0NDVExfQ1dPUkQsCisJLyogIDY0ICAiQCIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDY1ICAiQSIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDY2ICAiQiIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDY3ICAiQyIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDY4ICAiRCIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDY5ICAiRSIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDcwICAiRiIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDcxICAiRyIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDcyICAiSCIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDczICAiSSIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDc0ICAiSiIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDc1ICAiSyIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDc2ICAiTCIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDc3ICAiTSIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDc4ICAiTiIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDc5ICAiTyIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDgwICAiUCIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDgxICAiUSIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDgyICAiUiIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDgzICAiUyIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDg0ICAiVCIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDg1ICAiVSIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDg2ICAiViIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDg3ICAiVyIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDg4ICAiWCIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDg5ICAiWSIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDkwICAiWiIgKi8gQ1dPUkRfQ1dPUkRfQ1dPUkRfQ1dPUkQsCisJLyogIDkxICAiWyIgKi8gQ1dPUkRfQ0NUTF9DQ1RMX0NXT1JELAorCS8qICA5MiAgIlwiICovIENCQUNLX0NCQUNLX0NDVExfQ0JBQ0ssCisJLyogIDkzICAiXSIgKi8gQ1dPUkRfQ0NUTF9DQ1RMX0NXT1JELAorCS8qICA5NCAgIl4iICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA5NSAgIl8iICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA5NiAgImAiICovIENCUVVPVEVfQ0JRVU9URV9DV09SRF9DQlFVT1RFLAorCS8qICA5NyAgImEiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA5OCAgImIiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qICA5OSAgImMiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEwMCAgImQiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEwMSAgImUiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEwMiAgImYiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEwMyAgImciICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEwNCAgImgiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEwNSAgImkiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEwNiAgImoiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEwNyAgImsiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEwOCAgImwiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEwOSAgIm0iICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDExMCAgIm4iICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDExMSAgIm8iICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDExMiAgInAiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDExMyAgInEiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDExNCAgInIiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDExNSAgInMiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDExNiAgInQiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDExNyAgInUiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDExOCAgInYiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDExOSAgInciICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEyMCAgIngiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEyMSAgInkiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEyMiAgInoiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEyMyAgInsiICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEyNCAgInwiICovIENTUENMX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEyNSAgIn0iICovIENFTkRWQVJfQ0VORFZBUl9DV09SRF9DRU5EVkFSLAorCS8qIDEyNiAgIn4iICovIENXT1JEX0NDVExfQ0NUTF9DV09SRCwKKwkvKiAxMjcgIGRlbCAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMjggMHg4MCAqLyBDV09SRF9DV09SRF9DV09SRF9DV09SRCwKKwkvKiAxMjkgQ1RMRVNDICAgICAgICovIENDVExfQ0NUTF9DQ1RMX0NDVEwsCisJLyogMTMwIENUTFZBUiAgICAgICAqLyBDQ1RMX0NDVExfQ0NUTF9DQ1RMLAorCS8qIDEzMSBDVExFTkRWQVIgICAgKi8gQ0NUTF9DQ1RMX0NDVExfQ0NUTCwKKwkvKiAxMzIgQ1RMQkFDS1EgICAgICovIENDVExfQ0NUTF9DQ1RMX0NDVEwsCisJLyogMTMzIENUTFFVT1RFICAgICAqLyBDQ1RMX0NDVExfQ0NUTF9DQ1RMLAorCS8qIDEzNCBDVExBUkkgICAgICAgKi8gQ0NUTF9DQ1RMX0NDVExfQ0NUTCwKKwkvKiAxMzUgQ1RMRU5EQVJJICAgICovIENDVExfQ0NUTF9DQ1RMX0NDVEwsCisJLyogMTM2IENUTFFVT1RFTUFSSyAqLyBDQ1RMX0NDVExfQ0NUTF9DQ1RMLAorCS8qIDEzNyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEzOCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDEzOSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE0MCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE0MSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE0MiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE0MyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE0NCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE0NSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE0NiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE0NyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE0OCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE0OSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE1MCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE1MSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE1MiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE1MyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE1NCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE1NSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE1NiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE1NyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE1OCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE1OSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE2MCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE2MSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE2MiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE2MyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE2NCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE2NSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE2NiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE2NyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE2OCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE2OSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE3MCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE3MSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE3MiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE3MyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE3NCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE3NSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE3NiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE3NyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE3OCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE3OSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE4MCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE4MSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE4MiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE4MyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE4NCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE4NSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE4NiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE4NyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE4OCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE4OSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE5MCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE5MSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE5MiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE5MyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE5NCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE5NSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE5NiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE5NyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE5OCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDE5OSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIwMCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIwMSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIwMiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIwMyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIwNCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIwNSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIwNiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIwNyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIwOCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIwOSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIxMCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIxMSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIxMiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIxMyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIxNCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIxNSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIxNiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIxNyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIxOCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIxOSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIyMCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIyMSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIyMiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIyMyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIyNCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIyNSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIyNiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIyNyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIyOCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIyOSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzMCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzMSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzMiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzMyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzNCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzNSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzNiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzNyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzOCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzOSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDIzMCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI0MSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI0MiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI0MyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI0NCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI0NSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI0NiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI0NyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI0OCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI0OSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI1MCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI1MSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI1MiAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI1MyAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI1NCAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIDI1NSAgICAgICovIENXT1JEX0NXT1JEX0NXT1JEX0NXT1JELAorCS8qIFBFT0YgKi8gICAgIENFTkRGSUxFX0NFTkRGSUxFX0NFTkRGSUxFX0NFTkRGSUxFLAorIyBpZiBFTkFCTEVfQVNIX0FMSUFTCisJLyogUEVPQSAqLyAgICAgQ1NQQ0xfQ0lHTl9DSUdOX0NJR04sCisjIGVuZGlmCit9OworCisjIGRlZmluZSBTSVQoYywgc3ludGF4KSAoKFNfSV9UW3N5bnRheF9pbmRleF90YWJsZVtjXV0gPj4gKChzeW50YXgpKjQpKSAmIDB4ZikKKworI2VuZGlmICAvKiAhVVNFX1NJVF9GVU5DVElPTiAqLworCisKKy8qID09PT09PT09PT09PSBBbGlhcyBoYW5kbGluZyAqLworCisjaWYgRU5BQkxFX0FTSF9BTElBUworCisjZGVmaW5lIEFMSUFTSU5VU0UgMQorI2RlZmluZSBBTElBU0RFQUQgIDIKKworc3RydWN0IGFsaWFzIHsKKwlzdHJ1Y3QgYWxpYXMgKm5leHQ7CisJY2hhciAqbmFtZTsKKwljaGFyICp2YWw7CisJaW50IGZsYWc7Cit9OworCisKK3N0YXRpYyBzdHJ1Y3QgYWxpYXMgKiphdGFiOyAvLyBbQVRBQlNJWkVdOworI2RlZmluZSBJTklUX0dfYWxpYXMoKSBkbyB7IFwKKwlhdGFiID0geHphbGxvYyhBVEFCU0laRSAqIHNpemVvZihhdGFiWzBdKSk7IFwKK30gd2hpbGUgKDApCisKKworc3RhdGljIHN0cnVjdCBhbGlhcyAqKgorX19sb29rdXBhbGlhcyhjb25zdCBjaGFyICpuYW1lKSB7CisJdW5zaWduZWQgaW50IGhhc2h2YWw7CisJc3RydWN0IGFsaWFzICoqYXBwOworCWNvbnN0IGNoYXIgKnA7CisJdW5zaWduZWQgaW50IGNoOworCisJcCA9IG5hbWU7CisKKwljaCA9ICh1bnNpZ25lZCBjaGFyKSpwOworCWhhc2h2YWwgPSBjaCA8PCA0OworCXdoaWxlIChjaCkgeworCQloYXNodmFsICs9IGNoOworCQljaCA9ICh1bnNpZ25lZCBjaGFyKSorK3A7CisJfQorCWFwcCA9ICZhdGFiW2hhc2h2YWwgJSBBVEFCU0laRV07CisKKwlmb3IgKDsgKmFwcDsgYXBwID0gJigqYXBwKS0+bmV4dCkgeworCQlpZiAoc3RyY21wKG5hbWUsICgqYXBwKS0+bmFtZSkgPT0gMCkgeworCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gYXBwOworfQorCitzdGF0aWMgc3RydWN0IGFsaWFzICoKK2xvb2t1cGFsaWFzKGNvbnN0IGNoYXIgKm5hbWUsIGludCBjaGVjaykKK3sKKwlzdHJ1Y3QgYWxpYXMgKmFwID0gKl9fbG9va3VwYWxpYXMobmFtZSk7CisKKwlpZiAoY2hlY2sgJiYgYXAgJiYgKGFwLT5mbGFnICYgQUxJQVNJTlVTRSkpCisJCXJldHVybiBOVUxMOworCXJldHVybiBhcDsKK30KKworc3RhdGljIHN0cnVjdCBhbGlhcyAqCitmcmVlYWxpYXMoc3RydWN0IGFsaWFzICphcCkKK3sKKwlzdHJ1Y3QgYWxpYXMgKm5leHQ7CisKKwlpZiAoYXAtPmZsYWcgJiBBTElBU0lOVVNFKSB7CisJCWFwLT5mbGFnIHw9IEFMSUFTREVBRDsKKwkJcmV0dXJuIGFwOworCX0KKworCW5leHQgPSBhcC0+bmV4dDsKKwlmcmVlKGFwLT5uYW1lKTsKKwlmcmVlKGFwLT52YWwpOworCWZyZWUoYXApOworCXJldHVybiBuZXh0OworfQorCitzdGF0aWMgdm9pZAorc2V0YWxpYXMoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsKQoreworCXN0cnVjdCBhbGlhcyAqYXAsICoqYXBwOworCisJYXBwID0gX19sb29rdXBhbGlhcyhuYW1lKTsKKwlhcCA9ICphcHA7CisJSU5UX09GRjsKKwlpZiAoYXApIHsKKwkJaWYgKCEoYXAtPmZsYWcgJiBBTElBU0lOVVNFKSkgeworCQkJZnJlZShhcC0+dmFsKTsKKwkJfQorCQlhcC0+dmFsID0gY2tzdHJkdXAodmFsKTsKKwkJYXAtPmZsYWcgJj0gfkFMSUFTREVBRDsKKwl9IGVsc2UgeworCQkvKiBub3QgZm91bmQgKi8KKwkJYXAgPSBja3phbGxvYyhzaXplb2Yoc3RydWN0IGFsaWFzKSk7CisJCWFwLT5uYW1lID0gY2tzdHJkdXAobmFtZSk7CisJCWFwLT52YWwgPSBja3N0cmR1cCh2YWwpOworCQkvKmFwLT5mbGFnID0gMDsgLSBja3phbGxvYyBkaWQgaXQgKi8KKwkJLyphcC0+bmV4dCA9IE5VTEw7Ki8KKwkJKmFwcCA9IGFwOworCX0KKwlJTlRfT047Cit9CisKK3N0YXRpYyBpbnQKK3VuYWxpYXMoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgYWxpYXMgKiphcHA7CisKKwlhcHAgPSBfX2xvb2t1cGFsaWFzKG5hbWUpOworCisJaWYgKCphcHApIHsKKwkJSU5UX09GRjsKKwkJKmFwcCA9IGZyZWVhbGlhcygqYXBwKTsKKwkJSU5UX09OOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3JtYWxpYXNlcyh2b2lkKQoreworCXN0cnVjdCBhbGlhcyAqYXAsICoqYXBwOworCWludCBpOworCisJSU5UX09GRjsKKwlmb3IgKGkgPSAwOyBpIDwgQVRBQlNJWkU7IGkrKykgeworCQlhcHAgPSAmYXRhYltpXTsKKwkJZm9yIChhcCA9ICphcHA7IGFwOyBhcCA9ICphcHApIHsKKwkJCSphcHAgPSBmcmVlYWxpYXMoKmFwcCk7CisJCQlpZiAoYXAgPT0gKmFwcCkgeworCQkJCWFwcCA9ICZhcC0+bmV4dDsKKwkJCX0KKwkJfQorCX0KKwlJTlRfT047Cit9CisKK3N0YXRpYyB2b2lkCitwcmludGFsaWFzKGNvbnN0IHN0cnVjdCBhbGlhcyAqYXApCit7CisJb3V0MWZtdCgiJXM9JXNcbiIsIGFwLT5uYW1lLCBzaW5nbGVfcXVvdGUoYXAtPnZhbCkpOworfQorCisvKgorICogVE9ETyAtIHNvcnQgb3V0cHV0CisgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DCithbGlhc2NtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKm4sICp2OworCWludCByZXQgPSAwOworCXN0cnVjdCBhbGlhcyAqYXA7CisKKwlpZiAoIWFyZ3ZbMV0pIHsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IEFUQUJTSVpFOyBpKyspIHsKKwkJCWZvciAoYXAgPSBhdGFiW2ldOyBhcDsgYXAgPSBhcC0+bmV4dCkgeworCQkJCXByaW50YWxpYXMoYXApOworCQkJfQorCQl9CisJCXJldHVybiAwOworCX0KKwl3aGlsZSAoKG4gPSAqKythcmd2KSAhPSBOVUxMKSB7CisJCXYgPSBzdHJjaHIobisxLCAnPScpOworCQlpZiAodiA9PSBOVUxMKSB7IC8qIG4rMTogZnVubnkga3NoIHN0dWZmICovCisJCQlhcCA9ICpfX2xvb2t1cGFsaWFzKG4pOworCQkJaWYgKGFwID09IE5VTEwpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAlcyBub3QgZm91bmRcbiIsICJhbGlhcyIsIG4pOworCQkJCXJldCA9IDE7CisJCQl9IGVsc2UKKwkJCQlwcmludGFsaWFzKGFwKTsKKwkJfSBlbHNlIHsKKwkJCSp2KysgPSAnXDAnOworCQkJc2V0YWxpYXMobiwgdik7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQwordW5hbGlhc2NtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlpbnQgaTsKKworCXdoaWxlICgoaSA9IG5leHRvcHQoImEiKSkgIT0gJ1wwJykgeworCQlpZiAoaSA9PSAnYScpIHsKKwkJCXJtYWxpYXNlcygpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisJZm9yIChpID0gMDsgKmFyZ3B0cjsgYXJncHRyKyspIHsKKwkJaWYgKHVuYWxpYXMoKmFyZ3B0cikpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzIG5vdCBmb3VuZFxuIiwgInVuYWxpYXMiLCAqYXJncHRyKTsKKwkJCWkgPSAxOworCQl9CisJfQorCisJcmV0dXJuIGk7Cit9CisKKyNlbmRpZiAvKiBBU0hfQUxJQVMgKi8KKworCisvKiA9PT09PT09PT09PT0gam9icy5jICovCisKKy8qIE1vZGUgYXJndW1lbnQgdG8gZm9ya3NoZWxsLiAgRG9uJ3QgY2hhbmdlIEZPUktfRkcgb3IgRk9SS19CRy4gKi8KKyNkZWZpbmUgRk9SS19GRyAgICAwCisjZGVmaW5lIEZPUktfQkcgICAgMQorI2RlZmluZSBGT1JLX05PSk9CIDIKKworLyogbW9kZSBmbGFncyBmb3Igc2hvd2pvYihzKSAqLworI2RlZmluZSBTSE9XX09OTFlfUEdJRCAgMHgwMSAgICAvKiBzaG93IG9ubHkgcGdpZCAoam9icyAtcCkgKi8KKyNkZWZpbmUgU0hPV19QSURTICAgICAgIDB4MDIgICAgLyogc2hvdyBpbmRpdmlkdWFsIHBpZHMsIG5vdCBqdXN0IG9uZSBsaW5lIHBlciBqb2IgKi8KKyNkZWZpbmUgU0hPV19DSEFOR0VEICAgIDB4MDQgICAgLyogb25seSBqb2JzIHdob3NlIHN0YXRlIGhhcyBjaGFuZ2VkICovCisjZGVmaW5lIFNIT1dfU1RERVJSICAgICAweDA4ICAgIC8qIHByaW50IHRvIHN0ZGVyciAoZWxzZSBzdGRvdXQpICovCisKKy8qCisgKiBBIGpvYiBzdHJ1Y3R1cmUgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYSBqb2IuICBBIGpvYiBpcyBlaXRoZXIgYQorICogc2luZ2xlIHByb2Nlc3Mgb3IgYSBzZXQgb2YgcHJvY2Vzc2VzIGNvbnRhaW5lZCBpbiBhIHBpcGVsaW5lLiAgSW4gdGhlCisgKiBsYXR0ZXIgY2FzZSwgcGlkbGlzdCB3aWxsIGJlIG5vbi1OVUxMLCBhbmQgd2lsbCBwb2ludCB0byBhIC0xIHRlcm1pbmF0ZWQKKyAqIGFycmF5IG9mIHBpZHMuCisgKi8KK3N0cnVjdCBwcm9jc3RhdCB7CisJcGlkX3QgICBwc19waWQ7ICAgICAgICAgLyogcHJvY2VzcyBpZCAqLworCWludCAgICAgcHNfc3RhdHVzOyAgICAgIC8qIGxhc3QgcHJvY2VzcyBzdGF0dXMgZnJvbSB3YWl0KCkgKi8KKwljaGFyICAgICpwc19jbWQ7ICAgICAgICAvKiB0ZXh0IG9mIGNvbW1hbmQgYmVpbmcgcnVuICovCit9OworCitzdHJ1Y3Qgam9iIHsKKwlzdHJ1Y3QgcHJvY3N0YXQgcHMwOyAgICAvKiBzdGF0dXMgb2YgcHJvY2VzcyAqLworCXN0cnVjdCBwcm9jc3RhdCAqcHM7ICAgIC8qIHN0YXR1cyBvciBwcm9jZXNzZXMgd2hlbiBtb3JlIHRoYW4gb25lICovCisjaWYgSk9CUworCWludCBzdG9wc3RhdHVzOyAgICAgICAgIC8qIHN0YXR1cyBvZiBhIHN0b3BwZWQgam9iICovCisjZW5kaWYKKwl1aW50MzJfdAorCQlucHJvY3M6IDE2LCAgICAgLyogbnVtYmVyIG9mIHByb2Nlc3NlcyAqLworCQlzdGF0ZTogOCwKKyNkZWZpbmUgSk9CUlVOTklORyAgICAgIDAgICAgICAgLyogYXQgbGVhc3Qgb25lIHByb2MgcnVubmluZyAqLworI2RlZmluZSBKT0JTVE9QUEVEICAgICAgMSAgICAgICAvKiBhbGwgcHJvY3MgYXJlIHN0b3BwZWQgKi8KKyNkZWZpbmUgSk9CRE9ORSAgICAgICAgIDIgICAgICAgLyogYWxsIHByb2NzIGFyZSBjb21wbGV0ZWQgKi8KKyNpZiBKT0JTCisJCXNpZ2ludDogMSwgICAgICAvKiBqb2Igd2FzIGtpbGxlZCBieSBTSUdJTlQgKi8KKwkJam9iY3RsOiAxLCAgICAgIC8qIGpvYiBydW5uaW5nIHVuZGVyIGpvYiBjb250cm9sICovCisjZW5kaWYKKwkJd2FpdGVkOiAxLCAgICAgIC8qIHRydWUgaWYgdGhpcyBlbnRyeSBoYXMgYmVlbiB3YWl0ZWQgZm9yICovCisJCXVzZWQ6IDEsICAgICAgICAvKiB0cnVlIGlmIHRoaXMgZW50cnkgaXMgaW4gdXNlZCAqLworCQljaGFuZ2VkOiAxOyAgICAgLyogdHJ1ZSBpZiBzdGF0dXMgaGFzIGNoYW5nZWQgKi8KKwlzdHJ1Y3Qgam9iICpwcmV2X2pvYjsgICAvKiBwcmV2aW91cyBqb2IgKi8KK307CisKK3N0YXRpYyBzdHJ1Y3Qgam9iICptYWtlam9iKC8qdW5pb24gbm9kZSAqLCovIGludCk7CitzdGF0aWMgaW50IGZvcmtzaGVsbChzdHJ1Y3Qgam9iICosIHVuaW9uIG5vZGUgKiwgaW50KTsKK3N0YXRpYyBpbnQgd2FpdGZvcmpvYihzdHJ1Y3Qgam9iICopOworCisjaWYgIUpPQlMKK2VudW0geyBkb2luZ19qb2JjdGwgPSAwIH07CisjZGVmaW5lIHNldGpvYmN0bChvbikgZG8ge30gd2hpbGUgKDApCisjZWxzZQorc3RhdGljIHNtYWxsaW50IGRvaW5nX2pvYmN0bDsgLy9yZWZlcmVuY2VzOjgKK3N0YXRpYyB2b2lkIHNldGpvYmN0bChpbnQpOworI2VuZGlmCisKKy8qCisgKiBJZ25vcmUgYSBzaWduYWwuCisgKi8KK3N0YXRpYyB2b2lkCitpZ25vcmVzaWcoaW50IHNpZ25vKQoreworCS8qIEF2b2lkIHVubmVjZXNzYXJ5IHN5c3RlbSBjYWxscy4gSXMgaXQgYWxyZWFkeSBTSUdfSUdOZWQ/ICovCisJaWYgKHNpZ21vZGVbc2lnbm8gLSAxXSAhPSBTX0lHTiAmJiBzaWdtb2RlW3NpZ25vIC0gMV0gIT0gU19IQVJEX0lHTikgeworCQkvKiBObywgbmVlZCB0byBkbyBpdCAqLworCQlzaWduYWwoc2lnbm8sIFNJR19JR04pOworCX0KKwlzaWdtb2RlW3NpZ25vIC0gMV0gPSBTX0hBUkRfSUdOOworfQorCisvKgorICogT25seSBvbmUgdXNhZ2Ugc2l0ZSAtIGluIHNldHNpZ25hbCgpCisgKi8KK3N0YXRpYyB2b2lkCitzaWduYWxfaGFuZGxlcihpbnQgc2lnbm8pCit7CisJZ290c2lnW3NpZ25vIC0gMV0gPSAxOworCisJaWYgKHNpZ25vID09IFNJR0lOVCAmJiAhdHJhcFtTSUdJTlRdKSB7CisJCWlmICghc3VwcHJlc3NfaW50KSB7CisJCQlwZW5kaW5nX3NpZyA9IDA7CisJCQlyYWlzZV9pbnRlcnJ1cHQoKTsgLyogZG9lcyBub3QgcmV0dXJuICovCisJCX0KKwkJcGVuZGluZ19pbnQgPSAxOworCX0gZWxzZSB7CisJCXBlbmRpbmdfc2lnID0gc2lnbm87CisJfQorfQorCisvKgorICogU2V0IHRoZSBzaWduYWwgaGFuZGxlciBmb3IgdGhlIHNwZWNpZmllZCBzaWduYWwuICBUaGUgcm91dGluZSBmaWd1cmVzCisgKiBvdXQgd2hhdCBpdCBzaG91bGQgYmUgc2V0IHRvLgorICovCitzdGF0aWMgdm9pZAorc2V0c2lnbmFsKGludCBzaWdubykKK3sKKwljaGFyICp0OworCWNoYXIgY3VyX2FjdCwgbmV3X2FjdDsKKwlzdHJ1Y3Qgc2lnYWN0aW9uIGFjdDsKKworCXQgPSB0cmFwW3NpZ25vXTsKKwluZXdfYWN0ID0gU19ERkw7CisJaWYgKHQgIT0gTlVMTCkgeyAvKiB0cmFwIGZvciB0aGlzIHNpZyBpcyBzZXQgKi8KKwkJbmV3X2FjdCA9IFNfQ0FUQ0g7CisJCWlmICh0WzBdID09ICdcMCcpIC8qIHRyYXAgaXMgIiI6IGlnbm9yZSB0aGlzIHNpZyAqLworCQkJbmV3X2FjdCA9IFNfSUdOOworCX0KKworCWlmIChyb290c2hlbGwgJiYgbmV3X2FjdCA9PSBTX0RGTCkgeworCQlzd2l0Y2ggKHNpZ25vKSB7CisJCWNhc2UgU0lHSU5UOgorCQkJaWYgKGlmbGFnIHx8IG1pbnVzYyB8fCBzZmxhZyA9PSAwKQorCQkJCW5ld19hY3QgPSBTX0NBVENIOworCQkJYnJlYWs7CisJCWNhc2UgU0lHUVVJVDoKKyNpZiBERUJVRworCQkJaWYgKGRlYnVnKQorCQkJCWJyZWFrOworI2VuZGlmCisJCQkvKiBtYW4gYmFzaDoKKwkJCSAqICJJbiBhbGwgY2FzZXMsIGJhc2ggaWdub3JlcyBTSUdRVUlULiBOb24tYnVpbHRpbgorCQkJICogY29tbWFuZHMgcnVuIGJ5IGJhc2ggaGF2ZSBzaWduYWwgaGFuZGxlcnMKKwkJCSAqIHNldCB0byB0aGUgdmFsdWVzIGluaGVyaXRlZCBieSB0aGUgc2hlbGwKKwkJCSAqIGZyb20gaXRzIHBhcmVudCIuICovCisJCQluZXdfYWN0ID0gU19JR047CisJCQlicmVhazsKKwkJY2FzZSBTSUdURVJNOgorCQkJaWYgKGlmbGFnKQorCQkJCW5ld19hY3QgPSBTX0lHTjsKKwkJCWJyZWFrOworI2lmIEpPQlMKKwkJY2FzZSBTSUdUU1RQOgorCQljYXNlIFNJR1RUT1U6CisJCQlpZiAobWZsYWcpCisJCQkJbmV3X2FjdCA9IFNfSUdOOworCQkJYnJlYWs7CisjZW5kaWYKKwkJfQorCX0KKy8vVE9ETzogaWYgIXJvb3RzaGVsbCwgd2UgcmVzZXQgU0lHUVVJVCB0byBERkwsCisvL3doZXJlYXMgd2UgaGF2ZSB0byByZXN0b3JlIGl0IHRvIHdoYXQgc2hlbGwgZ290IG9uIGVudHJ5CisvL2Zyb20gdGhlIHBhcmVudC4gU2VlIGNvbW1lbnQgYWJvdmUKKworCXQgPSAmc2lnbW9kZVtzaWdubyAtIDFdOworCWN1cl9hY3QgPSAqdDsKKwlpZiAoY3VyX2FjdCA9PSAwKSB7CisJCS8qIGN1cnJlbnQgc2V0dGluZyBpcyBub3QgeWV0IGtub3duICovCisJCWlmIChzaWdhY3Rpb24oc2lnbm8sIE5VTEwsICZhY3QpKSB7CisJCQkvKiBwcmV0ZW5kIGl0IHdvcmtlZDsgbWF5YmUgd2Ugc2hvdWxkIGdpdmUgYSB3YXJuaW5nLAorCQkJICogYnV0IG90aGVyIHNoZWxscyBkb24ndC4gV2UgZG9uJ3QgYWx0ZXIgc2lnbW9kZSwKKwkJCSAqIHNvIHdlIHJldHJ5IGV2ZXJ5IHRpbWUuCisJCQkgKiBidHcsIGluIExpbnV4IGl0IG5ldmVyIGZhaWxzLiAtLXZkYSAqLworCQkJcmV0dXJuOworCQl9CisJCWlmIChhY3Quc2FfaGFuZGxlciA9PSBTSUdfSUdOKSB7CisJCQljdXJfYWN0ID0gU19IQVJEX0lHTjsKKwkJCWlmIChtZmxhZworCQkJICYmIChzaWdubyA9PSBTSUdUU1RQIHx8IHNpZ25vID09IFNJR1RUSU4gfHwgc2lnbm8gPT0gU0lHVFRPVSkKKwkJCSkgeworCQkJCWN1cl9hY3QgPSBTX0lHTjsgICAvKiBkb24ndCBoYXJkIGlnbm9yZSB0aGVzZSAqLworCQkJfQorCQl9CisJfQorCWlmIChjdXJfYWN0ID09IFNfSEFSRF9JR04gfHwgY3VyX2FjdCA9PSBuZXdfYWN0KQorCQlyZXR1cm47CisKKwlhY3Quc2FfaGFuZGxlciA9IFNJR19ERkw7CisJc3dpdGNoIChuZXdfYWN0KSB7CisJY2FzZSBTX0NBVENIOgorCQlhY3Quc2FfaGFuZGxlciA9IHNpZ25hbF9oYW5kbGVyOworCQlicmVhazsKKwljYXNlIFNfSUdOOgorCQlhY3Quc2FfaGFuZGxlciA9IFNJR19JR047CisJCWJyZWFrOworCX0KKworCS8qIGZsYWdzIGFuZCBtYXNrIG1hdHRlciBvbmx5IGlmICFERkwgYW5kICFJR04sIGJ1dCB3ZSBkbyBpdAorCSAqIGZvciBhbGwgY2FzZXMgZm9yIG1vcmUgZGV0ZXJtaW5pc3RpYyBiZWhhdmlvcjoKKwkgKi8KKwlhY3Quc2FfZmxhZ3MgPSAwOworCXNpZ2ZpbGxzZXQoJmFjdC5zYV9tYXNrKTsKKworCXNpZ2FjdGlvbl9zZXQoc2lnbm8sICZhY3QpOworCisJKnQgPSBuZXdfYWN0OworfQorCisvKiBtb2RlIGZsYWdzIGZvciBzZXRfY3Vyam9iICovCisjZGVmaW5lIENVUl9ERUxFVEUgMgorI2RlZmluZSBDVVJfUlVOTklORyAxCisjZGVmaW5lIENVUl9TVE9QUEVEIDAKKworLyogbW9kZSBmbGFncyBmb3IgZG93YWl0ICovCisjZGVmaW5lIERPV0FJVF9OT05CTE9DSyBXTk9IQU5HCisjZGVmaW5lIERPV0FJVF9CTE9DSyAgICAwCisKKyNpZiBKT0JTCisvKiBwZ3JwIG9mIHNoZWxsIG9uIGludm9jYXRpb24gKi8KK3N0YXRpYyBpbnQgaW5pdGlhbHBncnA7IC8vcmVmZXJlbmNlczoyCitzdGF0aWMgaW50IHR0eWZkID0gLTE7IC8vNQorI2VuZGlmCisvKiBhcnJheSBvZiBqb2JzICovCitzdGF0aWMgc3RydWN0IGpvYiAqam9idGFiOyAvLzUKKy8qIHNpemUgb2YgYXJyYXkgKi8KK3N0YXRpYyB1bnNpZ25lZCBuam9iczsgLy80CisvKiBjdXJyZW50IGpvYiAqLworc3RhdGljIHN0cnVjdCBqb2IgKmN1cmpvYjsgLy9sb3RzCisvKiBudW1iZXIgb2YgcHJlc3VtZWQgbGl2aW5nIHVudHJhY2tlZCBqb2JzICovCitzdGF0aWMgaW50IGpvYmxlc3M7IC8vNAorCitzdGF0aWMgdm9pZAorc2V0X2N1cmpvYihzdHJ1Y3Qgam9iICpqcCwgdW5zaWduZWQgbW9kZSkKK3sKKwlzdHJ1Y3Qgam9iICpqcDE7CisJc3RydWN0IGpvYiAqKmpwcCwgKipjdXJwOworCisJLyogZmlyc3QgcmVtb3ZlIGZyb20gbGlzdCAqLworCWpwcCA9IGN1cnAgPSAmY3Vyam9iOworCXdoaWxlICgxKSB7CisJCWpwMSA9ICpqcHA7CisJCWlmIChqcDEgPT0ganApCisJCQlicmVhazsKKwkJanBwID0gJmpwMS0+cHJldl9qb2I7CisJfQorCSpqcHAgPSBqcDEtPnByZXZfam9iOworCisJLyogVGhlbiByZS1pbnNlcnQgaW4gY29ycmVjdCBwb3NpdGlvbiAqLworCWpwcCA9IGN1cnA7CisJc3dpdGNoIChtb2RlKSB7CisJZGVmYXVsdDoKKyNpZiBERUJVRworCQlhYm9ydCgpOworI2VuZGlmCisJY2FzZSBDVVJfREVMRVRFOgorCQkvKiBqb2IgYmVpbmcgZGVsZXRlZCAqLworCQlicmVhazsKKwljYXNlIENVUl9SVU5OSU5HOgorCQkvKiBuZXdseSBjcmVhdGVkIGpvYiBvciBiYWNrZ3JvdW5kZWQgam9iLAorCQkgKiBwdXQgYWZ0ZXIgYWxsIHN0b3BwZWQgam9icy4KKwkJICovCisJCXdoaWxlICgxKSB7CisJCQlqcDEgPSAqanBwOworI2lmIEpPQlMKKwkJCWlmICghanAxIHx8IGpwMS0+c3RhdGUgIT0gSk9CU1RPUFBFRCkKKyNlbmRpZgorCQkJCWJyZWFrOworCQkJanBwID0gJmpwMS0+cHJldl9qb2I7CisJCX0KKwkJLyogRkFMTFRIUk9VR0ggKi8KKyNpZiBKT0JTCisJY2FzZSBDVVJfU1RPUFBFRDoKKyNlbmRpZgorCQkvKiBuZXdseSBzdG9wcGVkIGpvYiAtIGJlY29tZXMgY3Vyam9iICovCisJCWpwLT5wcmV2X2pvYiA9ICpqcHA7CisJCSpqcHAgPSBqcDsKKwkJYnJlYWs7CisJfQorfQorCisjaWYgSk9CUyB8fCBERUJVRworc3RhdGljIGludAoram9ibm8oY29uc3Qgc3RydWN0IGpvYiAqanApCit7CisJcmV0dXJuIGpwIC0gam9idGFiICsgMTsKK30KKyNlbmRpZgorCisvKgorICogQ29udmVydCBhIGpvYiBuYW1lIHRvIGEgam9iIHN0cnVjdHVyZS4KKyAqLworI2lmICFKT0JTCisjZGVmaW5lIGdldGpvYihuYW1lLCBnZXRjdGwpIGdldGpvYihuYW1lKQorI2VuZGlmCitzdGF0aWMgc3RydWN0IGpvYiAqCitnZXRqb2IoY29uc3QgY2hhciAqbmFtZSwgaW50IGdldGN0bCkKK3sKKwlzdHJ1Y3Qgam9iICpqcDsKKwlzdHJ1Y3Qgam9iICpmb3VuZDsKKwljb25zdCBjaGFyICplcnJfbXNnID0gIiVzOiBubyBzdWNoIGpvYiI7CisJdW5zaWduZWQgbnVtOworCWludCBjOworCWNvbnN0IGNoYXIgKnA7CisJY2hhciAqKCptYXRjaCkoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworCisJanAgPSBjdXJqb2I7CisJcCA9IG5hbWU7CisJaWYgKCFwKQorCQlnb3RvIGN1cnJlbnRqb2I7CisKKwlpZiAoKnAgIT0gJyUnKQorCQlnb3RvIGVycjsKKworCWMgPSAqKytwOworCWlmICghYykKKwkJZ290byBjdXJyZW50am9iOworCisJaWYgKCFwWzFdKSB7CisJCWlmIChjID09ICcrJyB8fCBjID09ICclJykgeworIGN1cnJlbnRqb2I6CisJCQllcnJfbXNnID0gIk5vIGN1cnJlbnQgam9iIjsKKwkJCWdvdG8gY2hlY2s7CisJCX0KKwkJaWYgKGMgPT0gJy0nKSB7CisJCQlpZiAoanApCisJCQkJanAgPSBqcC0+cHJldl9qb2I7CisJCQllcnJfbXNnID0gIk5vIHByZXZpb3VzIGpvYiI7CisgY2hlY2s6CisJCQlpZiAoIWpwKQorCQkJCWdvdG8gZXJyOworCQkJZ290byBnb3RpdDsKKwkJfQorCX0KKworCWlmIChpc19udW1iZXIocCkpIHsKKwkJbnVtID0gYXRvaShwKTsKKwkJaWYgKG51bSA8PSBuam9icykgeworCQkJanAgPSBqb2J0YWIgKyBudW0gLSAxOworCQkJaWYgKGpwLT51c2VkKQorCQkJCWdvdG8gZ290aXQ7CisJCQlnb3RvIGVycjsKKwkJfQorCX0KKworCW1hdGNoID0gcHJlZml4OworCWlmICgqcCA9PSAnPycpIHsKKwkJbWF0Y2ggPSBzdHJzdHI7CisJCXArKzsKKwl9CisKKwlmb3VuZCA9IE5VTEw7CisJd2hpbGUgKGpwKSB7CisJCWlmIChtYXRjaChqcC0+cHNbMF0ucHNfY21kLCBwKSkgeworCQkJaWYgKGZvdW5kKQorCQkJCWdvdG8gZXJyOworCQkJZm91bmQgPSBqcDsKKwkJCWVycl9tc2cgPSAiJXM6IGFtYmlndW91cyI7CisJCX0KKwkJanAgPSBqcC0+cHJldl9qb2I7CisJfQorCWlmICghZm91bmQpCisJCWdvdG8gZXJyOworCWpwID0gZm91bmQ7CisKKyBnb3RpdDoKKyNpZiBKT0JTCisJZXJyX21zZyA9ICJqb2IgJXMgbm90IGNyZWF0ZWQgdW5kZXIgam9iIGNvbnRyb2wiOworCWlmIChnZXRjdGwgJiYganAtPmpvYmN0bCA9PSAwKQorCQlnb3RvIGVycjsKKyNlbmRpZgorCXJldHVybiBqcDsKKyBlcnI6CisJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoZXJyX21zZywgbmFtZSk7Cit9CisKKy8qCisgKiBNYXJrIGEgam9iIHN0cnVjdHVyZSBhcyB1bnVzZWQuCisgKi8KK3N0YXRpYyB2b2lkCitmcmVlam9iKHN0cnVjdCBqb2IgKmpwKQoreworCXN0cnVjdCBwcm9jc3RhdCAqcHM7CisJaW50IGk7CisKKwlJTlRfT0ZGOworCWZvciAoaSA9IGpwLT5ucHJvY3MsIHBzID0ganAtPnBzOyAtLWkgPj0gMDsgcHMrKykgeworCQlpZiAocHMtPnBzX2NtZCAhPSBudWxsc3RyKQorCQkJZnJlZShwcy0+cHNfY21kKTsKKwl9CisJaWYgKGpwLT5wcyAhPSAmanAtPnBzMCkKKwkJZnJlZShqcC0+cHMpOworCWpwLT51c2VkID0gMDsKKwlzZXRfY3Vyam9iKGpwLCBDVVJfREVMRVRFKTsKKwlJTlRfT047Cit9CisKKyNpZiBKT0JTCitzdGF0aWMgdm9pZAoreHRjc2V0cGdycChpbnQgZmQsIHBpZF90IHBncnApCit7CisJaWYgKHRjc2V0cGdycChmZCwgcGdycCkpCisJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCJjYW4ndCBzZXQgdHR5IHByb2Nlc3MgZ3JvdXAgKCVtKSIpOworfQorCisvKgorICogVHVybiBqb2IgY29udHJvbCBvbiBhbmQgb2ZmLgorICoKKyAqIE5vdGU6ICBUaGlzIGNvZGUgYXNzdW1lcyB0aGF0IHRoZSB0aGlyZCBhcmcgdG8gaW9jdGwgaXMgYSBjaGFyYWN0ZXIKKyAqIHBvaW50ZXIsIHdoaWNoIGlzIHRydWUgb24gQmVya2VsZXkgc3lzdGVtcyBidXQgbm90IFN5c3RlbSBWLiAgU2luY2UKKyAqIFN5c3RlbSBWIGRvZXNuJ3QgaGF2ZSBqb2IgY29udHJvbCB5ZXQsIHRoaXMgaXNuJ3QgYSBwcm9ibGVtIG5vdy4KKyAqCisgKiBDYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIG9mZi4KKyAqLworc3RhdGljIHZvaWQKK3NldGpvYmN0bChpbnQgb24pCit7CisJaW50IGZkOworCWludCBwZ3JwOworCisJaWYgKG9uID09IGRvaW5nX2pvYmN0bCB8fCByb290c2hlbGwgPT0gMCkKKwkJcmV0dXJuOworCWlmIChvbikgeworCQlpbnQgb2ZkOworCQlvZmQgPSBmZCA9IG9wZW4oX1BBVEhfVFRZLCBPX1JEV1IpOworCQlpZiAoZmQgPCAwKSB7CisJLyogQlRXLCBiYXNoIHdpbGwgdHJ5IHRvIG9wZW4odHR5bmFtZSgwKSkgaWYgb3BlbigiL2Rldi90dHkiKSBmYWlscy4KKwkgKiBUaGF0IHNvbWV0aW1lcyBoZWxwcyB0byBhY3F1aXJlIGNvbnRyb2xsaW5nIHR0eS4KKwkgKiBPYnZpb3VzbHksIGEgd29ya2Fyb3VuZCBmb3IgYnVncyB3aGVuIHNvbWVvbmUKKwkgKiBmYWlsZWQgdG8gcHJvdmlkZSBhIGNvbnRyb2xsaW5nIHR0eSB0byBiYXNoISA6KSAqLworCQkJZmQgPSAyOworCQkJd2hpbGUgKCFpc2F0dHkoZmQpKQorCQkJCWlmICgtLWZkIDwgMCkKKwkJCQkJZ290byBvdXQ7CisJCX0KKwkJZmQgPSBmY250bChmZCwgRl9EVVBGRCwgMTApOworCQlpZiAob2ZkID49IDApCisJCQljbG9zZShvZmQpOworCQlpZiAoZmQgPCAwKQorCQkJZ290byBvdXQ7CisJCS8qIGZkIGlzIGEgdHR5IGF0IHRoaXMgcG9pbnQgKi8KKwkJY2xvc2Vfb25fZXhlY19vbihmZCk7CisJCXdoaWxlICgxKSB7IC8qIHdoaWxlIHdlIGFyZSBpbiB0aGUgYmFja2dyb3VuZCAqLworCQkJcGdycCA9IHRjZ2V0cGdycChmZCk7CisJCQlpZiAocGdycCA8IDApIHsKKyBvdXQ6CisJCQkJYXNoX21zZygiY2FuJ3QgYWNjZXNzIHR0eTsgam9iIGNvbnRyb2wgdHVybmVkIG9mZiIpOworCQkJCW1mbGFnID0gb24gPSAwOworCQkJCWdvdG8gY2xvc2U7CisJCQl9CisJCQlpZiAocGdycCA9PSBnZXRwZ3JwKCkpCisJCQkJYnJlYWs7CisJCQlraWxscGcoMCwgU0lHVFRJTik7CisJCX0KKwkJaW5pdGlhbHBncnAgPSBwZ3JwOworCisJCXNldHNpZ25hbChTSUdUU1RQKTsKKwkJc2V0c2lnbmFsKFNJR1RUT1UpOworCQlzZXRzaWduYWwoU0lHVFRJTik7CisJCXBncnAgPSByb290cGlkOworCQlzZXRwZ2lkKDAsIHBncnApOworCQl4dGNzZXRwZ3JwKGZkLCBwZ3JwKTsKKwl9IGVsc2UgeworCQkvKiB0dXJuaW5nIGpvYiBjb250cm9sIG9mZiAqLworCQlmZCA9IHR0eWZkOworCQlwZ3JwID0gaW5pdGlhbHBncnA7CisJCS8qIHdhcyB4dGNzZXRwZ3JwLCBidXQgdGhpcyBjYW4gbWFrZSBleGl0aW5nIGFzaAorCQkgKiBsb29wIGZvcmV2ZXIgaWYgcHR5IGlzIGFscmVhZHkgZGVsZXRlZCAqLworCQl0Y3NldHBncnAoZmQsIHBncnApOworCQlzZXRwZ2lkKDAsIHBncnApOworCQlzZXRzaWduYWwoU0lHVFNUUCk7CisJCXNldHNpZ25hbChTSUdUVE9VKTsKKwkJc2V0c2lnbmFsKFNJR1RUSU4pOworIGNsb3NlOgorCQlpZiAoZmQgPj0gMCkKKwkJCWNsb3NlKGZkKTsKKwkJZmQgPSAtMTsKKwl9CisJdHR5ZmQgPSBmZDsKKwlkb2luZ19qb2JjdGwgPSBvbjsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMKK2tpbGxjbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWlmIChhcmd2WzFdICYmIHN0cmNtcChhcmd2WzFdLCAiLWwiKSAhPSAwKSB7CisJCWludCBpID0gMTsKKwkJZG8geworCQkJaWYgKGFyZ3ZbaV1bMF0gPT0gJyUnKSB7CisJCQkJLyoKKwkJCQkgKiAia2lsbCAlTiIgLSBqb2Iga2lsbAorCQkJCSAqIENvbnZlcnRpbmcgdG8gcGdycCAvIHBpZCBraWxsCisJCQkJICovCisJCQkJc3RydWN0IGpvYiAqanA7CisJCQkJY2hhciAqZHN0OworCQkJCWludCBqLCBuOworCisJCQkJanAgPSBnZXRqb2IoYXJndltpXSwgMCk7CisJCQkJLyoKKwkJCQkgKiBJbiBqb2JzIHN0YXJ0ZWQgdW5kZXIgam9iIGNvbnRyb2wsIHdlIHNpZ25hbAorCQkJCSAqIGVudGlyZSBwcm9jZXNzIGdyb3VwIGJ5IGtpbGwgLVBHUlBfSUQuCisJCQkJICogVGhpcyBoYXBwZW5zLCBmLmUuLCBpbiBpbnRlcmFjdGl2ZSBzaGVsbC4KKwkJCQkgKgorCQkJCSAqIE90aGVyd2lzZSwgd2Ugc2lnbmFsIGVhY2ggY2hpbGQgdmlhCisJCQkJICoga2lsbCBQSUQxIFBJRDIgUElEMy4KKwkJCQkgKiBUZXN0Y2FzZXM6CisJCQkJICogc2ggLWMgJ3NsZWVwIDF8c2xlZXAgMSAmIGtpbGwgJTEnCisJCQkJICogc2ggLWMgJ3RydWV8c2xlZXAgMiAmIHNsZWVwIDE7IGtpbGwgJTEnCisJCQkJICogc2ggLWMgJ3RydWV8c2xlZXAgMSAmIHNsZWVwIDI7IGtpbGwgJTEnCisJCQkJICovCisJCQkJbiA9IGpwLT5ucHJvY3M7IC8qIGNhbid0IGJlIDAgKEkgaG9wZSkgKi8KKwkJCQlpZiAoanAtPmpvYmN0bCkKKwkJCQkJbiA9IDE7CisJCQkJZHN0ID0gYWxsb2NhKG4gKiBzaXplb2YoaW50KSo0KTsKKwkJCQlhcmd2W2ldID0gZHN0OworCQkJCWZvciAoaiA9IDA7IGogPCBuOyBqKyspIHsKKwkJCQkJc3RydWN0IHByb2NzdGF0ICpwcyA9ICZqcC0+cHNbal07CisJCQkJCS8qIFNraXAgbm9uLXJ1bm5pbmcgYW5kIG5vdC1zdG9wcGVkIG1lbWJlcnMKKwkJCQkJICogKGkuZS4gZGVhZCBtZW1iZXJzKSBvZiB0aGUgam9iCisJCQkJCSAqLworCQkJCQlpZiAocHMtPnBzX3N0YXR1cyAhPSAtMSAmJiAhV0lGU1RPUFBFRChwcy0+cHNfc3RhdHVzKSkKKwkJCQkJCWNvbnRpbnVlOworCQkJCQkvKgorCQkJCQkgKiBraWxsX21haW4gaGFzIG1hdGNoaW5nIGNvZGUgdG8gZXhwZWN0CisJCQkJCSAqIGxlYWRpbmcgc3BhY2UuIE5lZWRlZCB0byBub3QgY29uZnVzZQorCQkJCQkgKiBuZWdhdGl2ZSBwaWRzIHdpdGggImtpbGwgLVNJR05BTF9OTyIgc3ludGF4CisJCQkJCSAqLworCQkJCQlkc3QgKz0gc3ByaW50Zihkc3QsIGpwLT5qb2JjdGwgPyAiIC0ldSIgOiAiICV1IiwgKGludClwcy0+cHNfcGlkKTsKKwkJCQl9CisJCQkJKmRzdCA9ICdcMCc7CisJCQl9CisJCX0gd2hpbGUgKGFyZ3ZbKytpXSk7CisJfQorCXJldHVybiBraWxsX21haW4oYXJnYywgYXJndik7Cit9CisKK3N0YXRpYyB2b2lkCitzaG93cGlwZShzdHJ1Y3Qgam9iICpqcCAvKiwgRklMRSAqb3V0Ki8pCit7CisJc3RydWN0IHByb2NzdGF0ICpwczsKKwlzdHJ1Y3QgcHJvY3N0YXQgKnBzZW5kOworCisJcHNlbmQgPSBqcC0+cHMgKyBqcC0+bnByb2NzOworCWZvciAocHMgPSBqcC0+cHMgKyAxOyBwcyA8IHBzZW5kOyBwcysrKQorCQlwcmludGYoIiB8ICVzIiwgcHMtPnBzX2NtZCk7CisJbmV3bGluZV9hbmRfZmx1c2goc3Rkb3V0KTsKKwlmbHVzaF9zdGRvdXRfc3RkZXJyKCk7Cit9CisKKworc3RhdGljIGludAorcmVzdGFydGpvYihzdHJ1Y3Qgam9iICpqcCwgaW50IG1vZGUpCit7CisJc3RydWN0IHByb2NzdGF0ICpwczsKKwlpbnQgaTsKKwlpbnQgc3RhdHVzOworCXBpZF90IHBnaWQ7CisKKwlJTlRfT0ZGOworCWlmIChqcC0+c3RhdGUgPT0gSk9CRE9ORSkKKwkJZ290byBvdXQ7CisJanAtPnN0YXRlID0gSk9CUlVOTklORzsKKwlwZ2lkID0ganAtPnBzWzBdLnBzX3BpZDsKKwlpZiAobW9kZSA9PSBGT1JLX0ZHKQorCQl4dGNzZXRwZ3JwKHR0eWZkLCBwZ2lkKTsKKwlraWxscGcocGdpZCwgU0lHQ09OVCk7CisJcHMgPSBqcC0+cHM7CisJaSA9IGpwLT5ucHJvY3M7CisJZG8geworCQlpZiAoV0lGU1RPUFBFRChwcy0+cHNfc3RhdHVzKSkgeworCQkJcHMtPnBzX3N0YXR1cyA9IC0xOworCQl9CisJCXBzKys7CisJfSB3aGlsZSAoLS1pKTsKKyBvdXQ6CisJc3RhdHVzID0gKG1vZGUgPT0gRk9SS19GRykgPyB3YWl0Zm9yam9iKGpwKSA6IDA7CisJSU5UX09OOworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DCitmZ19iZ2NtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBqb2IgKmpwOworCWludCBtb2RlOworCWludCByZXR2YWw7CisKKwltb2RlID0gKCoqYXJndiA9PSAnZicpID8gRk9SS19GRyA6IEZPUktfQkc7CisJbmV4dG9wdChudWxsc3RyKTsKKwlhcmd2ID0gYXJncHRyOworCWRvIHsKKwkJanAgPSBnZXRqb2IoKmFyZ3YsIDEpOworCQlpZiAobW9kZSA9PSBGT1JLX0JHKSB7CisJCQlzZXRfY3Vyam9iKGpwLCBDVVJfUlVOTklORyk7CisJCQlwcmludGYoIlslZF0gIiwgam9ibm8oanApKTsKKwkJfQorCQlvdXQxc3RyKGpwLT5wc1swXS5wc19jbWQpOworCQlzaG93cGlwZShqcCAvKiwgc3Rkb3V0Ki8pOworCQlyZXR2YWwgPSByZXN0YXJ0am9iKGpwLCBtb2RlKTsKKwl9IHdoaWxlICgqYXJndiAmJiAqKythcmd2KTsKKwlyZXR1cm4gcmV0dmFsOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK3NwcmludF9zdGF0dXM0OChjaGFyICpzLCBpbnQgc3RhdHVzLCBpbnQgc2lnb25seSkKK3sKKwlpbnQgY29sOworCWludCBzdDsKKworCWNvbCA9IDA7CisJaWYgKCFXSUZFWElURUQoc3RhdHVzKSkgeworCQlpZiAoSk9CUyAmJiBXSUZTVE9QUEVEKHN0YXR1cykpCisJCQlzdCA9IFdTVE9QU0lHKHN0YXR1cyk7CisJCWVsc2UKKwkJCXN0ID0gV1RFUk1TSUcoc3RhdHVzKTsKKwkJaWYgKHNpZ29ubHkpIHsKKwkJCWlmIChzdCA9PSBTSUdJTlQgfHwgc3QgPT0gU0lHUElQRSkKKwkJCQlnb3RvIG91dDsKKwkJCWlmIChKT0JTICYmIFdJRlNUT1BQRUQoc3RhdHVzKSkKKwkJCQlnb3RvIG91dDsKKwkJfQorCQlzdCAmPSAweDdmOworLy9UT0RPOiB1c2UgYmJveCdzIGdldF9zaWduYW1lPyBzdHJzaWduYWwgYWRkcyB+NjAwIGJ5dGVzIHRvIHRleHQrcm9kYXRhCisJCWNvbCA9IGZtdHN0cihzLCAzMiwgc3Ryc2lnbmFsKHN0KSk7CisJCWlmIChXQ09SRURVTVAoc3RhdHVzKSkgeworCQkJc3RyY3B5KHMgKyBjb2wsICIgKGNvcmUgZHVtcGVkKSIpOworCQkJY29sICs9IHNpemVvZigiIChjb3JlIGR1bXBlZCkiKS0xOworCQl9CisJfSBlbHNlIGlmICghc2lnb25seSkgeworCQlzdCA9IFdFWElUU1RBVFVTKHN0YXR1cyk7CisJCWNvbCA9IGZtdHN0cihzLCAxNiwgKHN0ID8gIkRvbmUoJWQpIiA6ICJEb25lIiksIHN0KTsKKwl9Cisgb3V0OgorCXJldHVybiBjb2w7Cit9CisKK3N0YXRpYyBpbnQKK2Rvd2FpdChpbnQgd2FpdF9mbGFncywgc3RydWN0IGpvYiAqam9iKQoreworCWludCBwaWQ7CisJaW50IHN0YXR1czsKKwlzdHJ1Y3Qgam9iICpqcDsKKwlzdHJ1Y3Qgam9iICp0aGlzam9iOworCisJVFJBQ0UoKCJkb3dhaXQoMHgleCkgY2FsbGVkXG4iLCB3YWl0X2ZsYWdzKSk7CisKKwkvKiBEbyBhIHdhaXQgc3lzdGVtIGNhbGwuIElmIGpvYiBjb250cm9sIGlzIGNvbXBpbGVkIGluLCB3ZSBhY2NlcHQKKwkgKiBzdG9wcGVkIHByb2Nlc3Nlcy4gd2FpdF9mbGFncyBtYXkgaGF2ZSBXTk9IQU5HLCBwcmV2ZW50aW5nIGJsb2NraW5nLgorCSAqIE5COiBfbm90XyBzYWZlX3dhaXRwaWQsIHdlIG5lZWQgdG8gZGV0ZWN0IEVJTlRSICovCisJaWYgKGRvaW5nX2pvYmN0bCkKKwkJd2FpdF9mbGFncyB8PSBXVU5UUkFDRUQ7CisJcGlkID0gd2FpdHBpZCgtMSwgJnN0YXR1cywgd2FpdF9mbGFncyk7CisJVFJBQ0UoKCJ3YWl0IHJldHVybnMgcGlkPSVkLCBzdGF0dXM9MHgleCwgZXJybm89JWQoJXMpXG4iLAorCQkJCXBpZCwgc3RhdHVzLCBlcnJubywgc3RyZXJyb3IoZXJybm8pKSk7CisJaWYgKHBpZCA8PSAwKQorCQlyZXR1cm4gcGlkOworCisJSU5UX09GRjsKKwl0aGlzam9iID0gTlVMTDsKKwlmb3IgKGpwID0gY3Vyam9iOyBqcDsganAgPSBqcC0+cHJldl9qb2IpIHsKKwkJaW50IGpvYnN0YXRlOworCQlzdHJ1Y3QgcHJvY3N0YXQgKnBzOworCQlzdHJ1Y3QgcHJvY3N0YXQgKnBzZW5kOworCQlpZiAoanAtPnN0YXRlID09IEpPQkRPTkUpCisJCQljb250aW51ZTsKKwkJam9ic3RhdGUgPSBKT0JET05FOworCQlwcyA9IGpwLT5wczsKKwkJcHNlbmQgPSBwcyArIGpwLT5ucHJvY3M7CisJCWRvIHsKKwkJCWlmIChwcy0+cHNfcGlkID09IHBpZCkgeworCQkJCVRSQUNFKCgiSm9iICVkOiBjaGFuZ2luZyBzdGF0dXMgb2YgcHJvYyAlZCAiCisJCQkJCSJmcm9tIDB4JXggdG8gMHgleFxuIiwKKwkJCQkJam9ibm8oanApLCBwaWQsIHBzLT5wc19zdGF0dXMsIHN0YXR1cykpOworCQkJCXBzLT5wc19zdGF0dXMgPSBzdGF0dXM7CisJCQkJdGhpc2pvYiA9IGpwOworCQkJfQorCQkJaWYgKHBzLT5wc19zdGF0dXMgPT0gLTEpCisJCQkJam9ic3RhdGUgPSBKT0JSVU5OSU5HOworI2lmIEpPQlMKKwkJCWlmIChqb2JzdGF0ZSA9PSBKT0JSVU5OSU5HKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKFdJRlNUT1BQRUQocHMtPnBzX3N0YXR1cykpIHsKKwkJCQlqcC0+c3RvcHN0YXR1cyA9IHBzLT5wc19zdGF0dXM7CisJCQkJam9ic3RhdGUgPSBKT0JTVE9QUEVEOworCQkJfQorI2VuZGlmCisJCX0gd2hpbGUgKCsrcHMgPCBwc2VuZCk7CisJCWlmICghdGhpc2pvYikKKwkJCWNvbnRpbnVlOworCisJCS8qIEZvdW5kIHRoZSBqb2Igd2hlcmUgb25lIG9mIGl0cyBwcm9jZXNzZXMgY2hhbmdlZCBpdHMgc3RhdGUuCisJCSAqIElzIHRoZXJlIGF0IGxlYXN0IG9uZSBsaXZlIGFuZCBydW5uaW5nIHByb2Nlc3MgaW4gdGhpcyBqb2I/ICovCisJCWlmIChqb2JzdGF0ZSAhPSBKT0JSVU5OSU5HKSB7CisJCQkvKiBOby4gQWxsIGxpdmUgcHJvY2Vzc2VzIGluIHRoZSBqb2IgYXJlIHN0b3BwZWQKKwkJCSAqIChKT0JTVE9QUEVEKSBvciB0aGVyZSBhcmUgbm8gbGl2ZSBwcm9jZXNzZXMgKEpPQkRPTkUpCisJCQkgKi8KKwkJCXRoaXNqb2ItPmNoYW5nZWQgPSAxOworCQkJaWYgKHRoaXNqb2ItPnN0YXRlICE9IGpvYnN0YXRlKSB7CisJCQkJVFJBQ0UoKCJKb2IgJWQ6IGNoYW5naW5nIHN0YXRlIGZyb20gJWQgdG8gJWRcbiIsCisJCQkJCWpvYm5vKHRoaXNqb2IpLCB0aGlzam9iLT5zdGF0ZSwgam9ic3RhdGUpKTsKKwkJCQl0aGlzam9iLT5zdGF0ZSA9IGpvYnN0YXRlOworI2lmIEpPQlMKKwkJCQlpZiAoam9ic3RhdGUgPT0gSk9CU1RPUFBFRCkKKwkJCQkJc2V0X2N1cmpvYih0aGlzam9iLCBDVVJfU1RPUFBFRCk7CisjZW5kaWYKKwkJCX0KKwkJfQorCQlnb3RvIG91dDsKKwl9CisJLyogVGhlIHByb2Nlc3Mgd2Fzbid0IGZvdW5kIGluIGpvYiBsaXN0ICovCisJaWYgKEpPQlMgJiYgIVdJRlNUT1BQRUQoc3RhdHVzKSkKKwkJam9ibGVzcy0tOworIG91dDoKKwlJTlRfT047CisKKwlpZiAodGhpc2pvYiAmJiB0aGlzam9iID09IGpvYikgeworCQljaGFyIHNbNDggKyAxXTsKKwkJaW50IGxlbjsKKworCQlsZW4gPSBzcHJpbnRfc3RhdHVzNDgocywgc3RhdHVzLCAxKTsKKwkJaWYgKGxlbikgeworCQkJc1tsZW5dID0gJ1xuJzsKKwkJCXNbbGVuICsgMV0gPSAnXDAnOworCQkJb3V0MnN0cihzKTsKKwkJfQorCX0KKwlyZXR1cm4gcGlkOworfQorCitzdGF0aWMgaW50CitibG9ja2luZ193YWl0X3dpdGhfcmFpc2Vfb25fc2lnKHZvaWQpCit7CisJcGlkX3QgcGlkID0gZG93YWl0KERPV0FJVF9CTE9DSywgTlVMTCk7CisJaWYgKHBpZCA8PSAwICYmIHBlbmRpbmdfc2lnKQorCQlyYWlzZV9leGNlcHRpb24oRVhTSUcpOworCXJldHVybiBwaWQ7Cit9CisKKyNpZiBKT0JTCitzdGF0aWMgdm9pZAorc2hvd2pvYihzdHJ1Y3Qgam9iICpqcCwgaW50IG1vZGUpCit7CisJc3RydWN0IHByb2NzdGF0ICpwczsKKwlzdHJ1Y3QgcHJvY3N0YXQgKnBzZW5kOworCWludCBjb2w7CisJaW50IGluZGVudF9jb2w7CisJY2hhciBzWzE2ICsgMTYgKyA0OF07CisJRklMRSAqb3V0ID0gKG1vZGUgJiBTSE9XX1NUREVSUiA/IHN0ZGVyciA6IHN0ZG91dCk7CisKKwlwcyA9IGpwLT5wczsKKworCWlmIChtb2RlICYgU0hPV19PTkxZX1BHSUQpIHsgLyogam9icyAtcCAqLworCQkvKiBqdXN0IG91dHB1dCBwcm9jZXNzIChncm91cCkgaWQgb2YgcGlwZWxpbmUgKi8KKwkJZnByaW50ZihvdXQsICIlZFxuIiwgcHMtPnBzX3BpZCk7CisJCXJldHVybjsKKwl9CisKKwljb2wgPSBmbXRzdHIocywgMTYsICJbJWRdICAgIiwgam9ibm8oanApKTsKKwlpbmRlbnRfY29sID0gY29sOworCisJaWYgKGpwID09IGN1cmpvYikKKwkJc1tjb2wgLSAzXSA9ICcrJzsKKwllbHNlIGlmIChjdXJqb2IgJiYganAgPT0gY3Vyam9iLT5wcmV2X2pvYikKKwkJc1tjb2wgLSAzXSA9ICctJzsKKworCWlmIChtb2RlICYgU0hPV19QSURTKQorCQljb2wgKz0gZm10c3RyKHMgKyBjb2wsIDE2LCAiJWQgIiwgcHMtPnBzX3BpZCk7CisKKwlwc2VuZCA9IHBzICsganAtPm5wcm9jczsKKworCWlmIChqcC0+c3RhdGUgPT0gSk9CUlVOTklORykgeworCQlzdHJjcHkocyArIGNvbCwgIlJ1bm5pbmciKTsKKwkJY29sICs9IHNpemVvZigiUnVubmluZyIpIC0gMTsKKwl9IGVsc2UgeworCQlpbnQgc3RhdHVzID0gcHNlbmRbLTFdLnBzX3N0YXR1czsKKwkJaWYgKGpwLT5zdGF0ZSA9PSBKT0JTVE9QUEVEKQorCQkJc3RhdHVzID0ganAtPnN0b3BzdGF0dXM7CisJCWNvbCArPSBzcHJpbnRfc3RhdHVzNDgocyArIGNvbCwgc3RhdHVzLCAwKTsKKwl9CisJLyogQnkgbm93LCAiW0pPQklEXSogIFttYXliZSBQSURdIFNUQVRVUyIgaXMgcHJpbnRlZCAqLworCisJLyogVGhpcyBsb29wIGVpdGhlciBwcmludHMgIjxjbWQxPiB8IDxjbWQyPiB8IDxjbWQzPiIgbGluZQorCSAqIG9yIHByaW50cyBzZXZlcmFsICJQSUQgICAgICAgICAgICAgfCA8Y21kTj4iIGxpbmVzLAorCSAqIGRlcGVuZGluZyBvbiBTSE9XX1BJRFMgYml0LgorCSAqIFdlIGRvIG5vdCBwcmludCBzdGF0dXMgb2YgaW5kaXZpZHVhbCBwcm9jZXNzZXMKKwkgKiBiZXR3ZWVuIFBJRCBhbmQgPGNtZE4+LiBiYXNoIGRvZXMgaXQsIGJ1dCBub3QgdmVyeSB3ZWxsOgorCSAqIGZpcnN0IGxpbmUgc2hvd3Mgb3ZlcmFsbCBqb2Igc3RhdHVzLCBub3QgcHJvY2VzcyBzdGF0dXMsCisJICogbWFraW5nIGl0IGltcG9zc2libGUgdG8ga25vdyAxc3QgcHJvY2VzcyBzdGF0dXMuCisJICovCisJZ290byBzdGFydDsKKwlkbyB7CisJCS8qIGZvciBlYWNoIHByb2Nlc3MgKi8KKwkJc1swXSA9ICdcMCc7CisJCWNvbCA9IDMzOworCQlpZiAobW9kZSAmIFNIT1dfUElEUykKKwkJCWNvbCA9IGZtdHN0cihzLCA0OCwgIlxuJSpjJWQgIiwgaW5kZW50X2NvbCwgJyAnLCBwcy0+cHNfcGlkKSAtIDE7Cisgc3RhcnQ6CisJCWZwcmludGYob3V0LCAiJXMlKmMlcyVzIiwKKwkJCQlzLAorCQkJCTMzIC0gY29sID49IDAgPyAzMyAtIGNvbCA6IDAsICcgJywKKwkJCQlwcyA9PSBqcC0+cHMgPyAiIiA6ICJ8ICIsCisJCQkJcHMtPnBzX2NtZAorCQkpOworCX0gd2hpbGUgKCsrcHMgIT0gcHNlbmQpOworCW5ld2xpbmVfYW5kX2ZsdXNoKG91dCk7CisKKwlqcC0+Y2hhbmdlZCA9IDA7CisKKwlpZiAoanAtPnN0YXRlID09IEpPQkRPTkUpIHsKKwkJVFJBQ0UoKCJzaG93am9iOiBmcmVlaW5nIGpvYiAlZFxuIiwgam9ibm8oanApKSk7CisJCWZyZWVqb2IoanApOworCX0KK30KKworLyoKKyAqIFByaW50IGEgbGlzdCBvZiBqb2JzLiAgSWYgImNoYW5nZSIgaXMgbm9uemVybywgb25seSBwcmludCBqb2JzIHdob3NlCisgKiBzdGF0dXNlcyBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgY2FsbCB0byBzaG93am9icy4KKyAqLworc3RhdGljIHZvaWQKK3Nob3dqb2JzKGludCBtb2RlKQoreworCXN0cnVjdCBqb2IgKmpwOworCisJVFJBQ0UoKCJzaG93am9icygweCV4KSBjYWxsZWRcbiIsIG1vZGUpKTsKKworCS8qIEhhbmRsZSBhbGwgZmluaXNoZWQgam9icyAqLworCXdoaWxlIChkb3dhaXQoRE9XQUlUX05PTkJMT0NLLCBOVUxMKSA+IDApCisJCWNvbnRpbnVlOworCisJZm9yIChqcCA9IGN1cmpvYjsganA7IGpwID0ganAtPnByZXZfam9iKSB7CisJCWlmICghKG1vZGUgJiBTSE9XX0NIQU5HRUQpIHx8IGpwLT5jaGFuZ2VkKSB7CisJCQlzaG93am9iKGpwLCBtb2RlKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMKK2pvYnNjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgbW9kZSwgbTsKKworCW1vZGUgPSAwOworCXdoaWxlICgobSA9IG5leHRvcHQoImxwIikpICE9ICdcMCcpIHsKKwkJaWYgKG0gPT0gJ2wnKQorCQkJbW9kZSB8PSBTSE9XX1BJRFM7CisJCWVsc2UKKwkJCW1vZGUgfD0gU0hPV19PTkxZX1BHSUQ7CisJfQorCisJYXJndiA9IGFyZ3B0cjsKKwlpZiAoKmFyZ3YpIHsKKwkJZG8KKwkJCXNob3dqb2IoZ2V0am9iKCphcmd2LCAwKSwgbW9kZSk7CisJCXdoaWxlICgqKythcmd2KTsKKwl9IGVsc2UgeworCQlzaG93am9icyhtb2RlKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBKT0JTICovCisKKy8qIENhbGxlZCBvbmx5IG9uIGZpbmlzaGVkIG9yIHN0b3BwZWQgam9icyAobm8gbWVtYmVycyBhcmUgcnVubmluZykgKi8KK3N0YXRpYyBpbnQKK2dldHN0YXR1cyhzdHJ1Y3Qgam9iICpqb2IpCit7CisJaW50IHN0YXR1czsKKwlpbnQgcmV0dmFsOworCXN0cnVjdCBwcm9jc3RhdCAqcHM7CisKKwkvKiBGZXRjaCBsYXN0IG1lbWJlcidzIHN0YXR1cyAqLworCXBzID0gam9iLT5wcyArIGpvYi0+bnByb2NzIC0gMTsKKwlzdGF0dXMgPSBwcy0+cHNfc3RhdHVzOworCWlmIChwaXBlZmFpbCkgeworCQkvKiAic2V0IC1vIHBpcGVmYWlsIiBtb2RlOiB1c2UgbGFzdCBfbm9uemVyb18gc3RhdHVzICovCisJCXdoaWxlIChzdGF0dXMgPT0gMCAmJiAtLXBzID49IGpvYi0+cHMpCisJCQlzdGF0dXMgPSBwcy0+cHNfc3RhdHVzOworCX0KKworCXJldHZhbCA9IFdFWElUU1RBVFVTKHN0YXR1cyk7CisJaWYgKCFXSUZFWElURUQoc3RhdHVzKSkgeworI2lmIEpPQlMKKwkJcmV0dmFsID0gV1NUT1BTSUcoc3RhdHVzKTsKKwkJaWYgKCFXSUZTVE9QUEVEKHN0YXR1cykpCisjZW5kaWYKKwkJeworCQkJLyogWFhYOiBsaW1pdHMgbnVtYmVyIG9mIHNpZ25hbHMgKi8KKwkJCXJldHZhbCA9IFdURVJNU0lHKHN0YXR1cyk7CisjaWYgSk9CUworCQkJaWYgKHJldHZhbCA9PSBTSUdJTlQpCisJCQkJam9iLT5zaWdpbnQgPSAxOworI2VuZGlmCisJCX0KKwkJcmV0dmFsICs9IDEyODsKKwl9CisJVFJBQ0UoKCJnZXRzdGF0dXM6IGpvYiAlZCwgbnByb2MgJWQsIHN0YXR1cyAweCV4LCByZXR2YWwgMHgleFxuIiwKKwkJam9ibm8oam9iKSwgam9iLT5ucHJvY3MsIHN0YXR1cywgcmV0dmFsKSk7CisJcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMKK3dhaXRjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3Qgam9iICpqb2I7CisJaW50IHJldHZhbDsKKwlzdHJ1Y3Qgam9iICpqcDsKKworCWlmIChwZW5kaW5nX3NpZykKKwkJcmFpc2VfZXhjZXB0aW9uKEVYU0lHKTsKKworCW5leHRvcHQobnVsbHN0cik7CisJcmV0dmFsID0gMDsKKworCWFyZ3YgPSBhcmdwdHI7CisJaWYgKCEqYXJndikgeworCQkvKiB3YWl0IGZvciBhbGwgam9icyAqLworCQlmb3IgKDs7KSB7CisJCQlqcCA9IGN1cmpvYjsKKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKCFqcCkgLyogbm8gcnVubmluZyBwcm9jcyAqLworCQkJCQlnb3RvIHJldDsKKwkJCQlpZiAoanAtPnN0YXRlID09IEpPQlJVTk5JTkcpCisJCQkJCWJyZWFrOworCQkJCWpwLT53YWl0ZWQgPSAxOworCQkJCWpwID0ganAtPnByZXZfam9iOworCQkJfQorCQkJYmxvY2tpbmdfd2FpdF93aXRoX3JhaXNlX29uX3NpZygpOworCS8qIG1hbiBiYXNoOgorCSAqICJXaGVuIGJhc2ggaXMgd2FpdGluZyBmb3IgYW4gYXN5bmNocm9ub3VzIGNvbW1hbmQgdmlhCisJICogdGhlIHdhaXQgYnVpbHRpbiwgdGhlIHJlY2VwdGlvbiBvZiBhIHNpZ25hbCBmb3Igd2hpY2ggYSB0cmFwCisJICogaGFzIGJlZW4gc2V0IHdpbGwgY2F1c2UgdGhlIHdhaXQgYnVpbHRpbiB0byByZXR1cm4gaW1tZWRpYXRlbHkKKwkgKiB3aXRoIGFuIGV4aXQgc3RhdHVzIGdyZWF0ZXIgdGhhbiAxMjgsIGltbWVkaWF0ZWx5IGFmdGVyIHdoaWNoCisJICogdGhlIHRyYXAgaXMgZXhlY3V0ZWQuIgorCSAqCisJICogYmxvY2tpbmdfd2FpdF93aXRoX3JhaXNlX29uX3NpZyByYWlzZXMgc2lnbmFsIGhhbmRsZXJzCisJICogaWYgaXQgZ2V0cyBubyBwaWQgKHBpZCA8IDApLiBIb3dldmVyLAorCSAqIGlmIGNoaWxkIHNlbmRzIHVzIGEgc2lnbmFsICphbmQgaW1tZWRpYXRlbHkgZXhpdHMqLAorCSAqIGJsb2NraW5nX3dhaXRfd2l0aF9yYWlzZV9vbl9zaWcgZ2V0cyBwaWQgPiAwCisJICogYW5kIGRvZXMgbm90IGhhbmRsZSBwZW5kaW5nX3NpZy4gQ2hlY2sgdGhpcyBjYXNlOiAqLworCQkJaWYgKHBlbmRpbmdfc2lnKQorCQkJCXJhaXNlX2V4Y2VwdGlvbihFWFNJRyk7CisJCX0KKwl9CisKKwlyZXR2YWwgPSAxMjc7CisJZG8geworCQlpZiAoKiphcmd2ICE9ICclJykgeworCQkJcGlkX3QgcGlkID0gbnVtYmVyKCphcmd2KTsKKwkJCWpvYiA9IGN1cmpvYjsKKwkJCXdoaWxlICgxKSB7CisJCQkJaWYgKCFqb2IpCisJCQkJCWdvdG8gcmVwZWF0OworCQkJCWlmIChqb2ItPnBzW2pvYi0+bnByb2NzIC0gMV0ucHNfcGlkID09IHBpZCkKKwkJCQkJYnJlYWs7CisJCQkJam9iID0gam9iLT5wcmV2X2pvYjsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWpvYiA9IGdldGpvYigqYXJndiwgMCk7CisJCX0KKwkJLyogbG9vcCB1bnRpbCBwcm9jZXNzIHRlcm1pbmF0ZWQgb3Igc3RvcHBlZCAqLworCQl3aGlsZSAoam9iLT5zdGF0ZSA9PSBKT0JSVU5OSU5HKQorCQkJYmxvY2tpbmdfd2FpdF93aXRoX3JhaXNlX29uX3NpZygpOworCQlqb2ItPndhaXRlZCA9IDE7CisJCXJldHZhbCA9IGdldHN0YXR1cyhqb2IpOworIHJlcGVhdDogOworCX0gd2hpbGUgKCorK2FyZ3YpOworCisgcmV0OgorCXJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgam9iICoKK2dyb3dqb2J0YWIodm9pZCkKK3sKKwlzaXplX3QgbGVuOworCXB0cmRpZmZfdCBvZmZzZXQ7CisJc3RydWN0IGpvYiAqanAsICpqcTsKKworCWxlbiA9IG5qb2JzICogc2l6ZW9mKCpqcCk7CisJanEgPSBqb2J0YWI7CisJanAgPSBja3JlYWxsb2MoanEsIGxlbiArIDQgKiBzaXplb2YoKmpwKSk7CisKKwlvZmZzZXQgPSAoY2hhciAqKWpwIC0gKGNoYXIgKilqcTsKKwlpZiAob2Zmc2V0KSB7CisJCS8qIFJlbG9jYXRlIHBvaW50ZXJzICovCisJCXNpemVfdCBsID0gbGVuOworCisJCWpxID0gKHN0cnVjdCBqb2IgKikoKGNoYXIgKilqcSArIGwpOworCQl3aGlsZSAobCkgeworCQkJbCAtPSBzaXplb2YoKmpwKTsKKwkJCWpxLS07CisjZGVmaW5lIGpvZmYocCkgKChzdHJ1Y3Qgam9iICopKChjaGFyICopKHApICsgbCkpCisjZGVmaW5lIGptb3ZlKHApIChwKSA9ICh2b2lkICopKChjaGFyICopKHApICsgb2Zmc2V0KQorCQkJaWYgKGpvZmYoanApLT5wcyA9PSAmanEtPnBzMCkKKwkJCQlqbW92ZShqb2ZmKGpwKS0+cHMpOworCQkJaWYgKGpvZmYoanApLT5wcmV2X2pvYikKKwkJCQlqbW92ZShqb2ZmKGpwKS0+cHJldl9qb2IpOworCQl9CisJCWlmIChjdXJqb2IpCisJCQlqbW92ZShjdXJqb2IpOworI3VuZGVmIGpvZmYKKyN1bmRlZiBqbW92ZQorCX0KKworCW5qb2JzICs9IDQ7CisJam9idGFiID0ganA7CisJanAgPSAoc3RydWN0IGpvYiAqKSgoY2hhciAqKWpwICsgbGVuKTsKKwlqcSA9IGpwICsgMzsKKwlkbyB7CisJCWpxLT51c2VkID0gMDsKKwl9IHdoaWxlICgtLWpxID49IGpwKTsKKwlyZXR1cm4ganA7Cit9CisKKy8qCisgKiBSZXR1cm4gYSBuZXcgam9iIHN0cnVjdHVyZS4KKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgb2ZmLgorICovCitzdGF0aWMgc3RydWN0IGpvYiAqCittYWtlam9iKC8qdW5pb24gbm9kZSAqbm9kZSwqLyBpbnQgbnByb2NzKQoreworCWludCBpOworCXN0cnVjdCBqb2IgKmpwOworCisJZm9yIChpID0gbmpvYnMsIGpwID0gam9idGFiOyA7IGpwKyspIHsKKwkJaWYgKC0taSA8IDApIHsKKwkJCWpwID0gZ3Jvd2pvYnRhYigpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGpwLT51c2VkID09IDApCisJCQlicmVhazsKKwkJaWYgKGpwLT5zdGF0ZSAhPSBKT0JET05FIHx8ICFqcC0+d2FpdGVkKQorCQkJY29udGludWU7CisjaWYgSk9CUworCQlpZiAoZG9pbmdfam9iY3RsKQorCQkJY29udGludWU7CisjZW5kaWYKKwkJZnJlZWpvYihqcCk7CisJCWJyZWFrOworCX0KKwltZW1zZXQoanAsIDAsIHNpemVvZigqanApKTsKKyNpZiBKT0JTCisJLyoganAtPmpvYmN0bCBpcyBhIGJpdGZpZWxkLgorCSAqICJqcC0+am9iY3RsIHw9IGpvYmN0bCIgbGlrZWx5IHRvIGdpdmUgYXdmdWwgY29kZSAqLworCWlmIChkb2luZ19qb2JjdGwpCisJCWpwLT5qb2JjdGwgPSAxOworI2VuZGlmCisJanAtPnByZXZfam9iID0gY3Vyam9iOworCWN1cmpvYiA9IGpwOworCWpwLT51c2VkID0gMTsKKwlqcC0+cHMgPSAmanAtPnBzMDsKKwlpZiAobnByb2NzID4gMSkgeworCQlqcC0+cHMgPSBja21hbGxvYyhucHJvY3MgKiBzaXplb2Yoc3RydWN0IHByb2NzdGF0KSk7CisJfQorCVRSQUNFKCgibWFrZWpvYiglZCkgcmV0dXJucyAlJSVkXG4iLCBucHJvY3MsCisJCQkJam9ibm8oanApKSk7CisJcmV0dXJuIGpwOworfQorCisjaWYgSk9CUworLyoKKyAqIFJldHVybiBhIHN0cmluZyBpZGVudGlmeWluZyBhIGNvbW1hbmQgKHRvIGJlIHByaW50ZWQgYnkgdGhlCisgKiBqb2JzIGNvbW1hbmQpLgorICovCitzdGF0aWMgY2hhciAqY21kbmV4dGM7CisKK3N0YXRpYyB2b2lkCitjbWRwdXRzKGNvbnN0IGNoYXIgKnMpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgdnN0eXBlW1ZTVFlQRSArIDFdWzNdID0geworCQkiIiwgIn0iLCAiLSIsICIrIiwgIj8iLCAiPSIsCisJCSIlIiwgIiUlIiwgIiMiLCAiIyMiCisJCUlGX0FTSF9CQVNIX0NPTVBBVCgsICI6IiwgIi8iLCAiLy8iKQorCX07CisKKwljb25zdCBjaGFyICpwLCAqc3RyOworCWNoYXIgY2NbMl07CisJY2hhciAqbmV4dGM7CisJdW5zaWduZWQgY2hhciBjOworCXVuc2lnbmVkIGNoYXIgc3VidHlwZSA9IDA7CisJaW50IHF1b3RlZCA9IDA7CisKKwljY1sxXSA9ICdcMCc7CisJbmV4dGMgPSBtYWtlc3Ryc3BhY2UoKHN0cmxlbihzKSArIDEpICogOCwgY21kbmV4dGMpOworCXAgPSBzOworCXdoaWxlICgoYyA9ICpwKyspICE9ICdcMCcpIHsKKwkJc3RyID0gTlVMTDsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgQ1RMRVNDOgorCQkJYyA9ICpwKys7CisJCQlicmVhazsKKwkJY2FzZSBDVExWQVI6CisJCQlzdWJ0eXBlID0gKnArKzsKKwkJCWlmICgoc3VidHlwZSAmIFZTVFlQRSkgPT0gVlNMRU5HVEgpCisJCQkJc3RyID0gIiR7IyI7CisJCQllbHNlCisJCQkJc3RyID0gIiR7IjsKKwkJCWdvdG8gZG9zdHI7CisJCWNhc2UgQ1RMRU5EVkFSOgorCQkJc3RyID0gIlwifSIgKyAhKHF1b3RlZCAmIDEpOworCQkJcXVvdGVkID4+PSAxOworCQkJc3VidHlwZSA9IDA7CisJCQlnb3RvIGRvc3RyOworCQljYXNlIENUTEJBQ0tROgorCQkJc3RyID0gIiQoLi4uKSI7CisJCQlnb3RvIGRvc3RyOworI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKKwkJY2FzZSBDVExBUkk6CisJCQlzdHIgPSAiJCgoIjsKKwkJCWdvdG8gZG9zdHI7CisJCWNhc2UgQ1RMRU5EQVJJOgorCQkJc3RyID0gIikpIjsKKwkJCWdvdG8gZG9zdHI7CisjZW5kaWYKKwkJY2FzZSBDVExRVU9URU1BUks6CisJCQlxdW90ZWQgXj0gMTsKKwkJCWMgPSAnIic7CisJCQlicmVhazsKKwkJY2FzZSAnPSc6CisJCQlpZiAoc3VidHlwZSA9PSAwKQorCQkJCWJyZWFrOworCQkJaWYgKChzdWJ0eXBlICYgVlNUWVBFKSAhPSBWU05PUk1BTCkKKwkJCQlxdW90ZWQgPDw9IDE7CisJCQlzdHIgPSB2c3R5cGVbc3VidHlwZSAmIFZTVFlQRV07CisJCQlpZiAoc3VidHlwZSAmIFZTTlVMKQorCQkJCWMgPSAnOic7CisJCQllbHNlCisJCQkJZ290byBjaGVja3N0cjsKKwkJCWJyZWFrOworCQljYXNlICdcJyc6CisJCWNhc2UgJ1xcJzoKKwkJY2FzZSAnIic6CisJCWNhc2UgJyQnOgorCQkJLyogVGhlc2UgY2FuIG9ubHkgaGFwcGVuIGluc2lkZSBxdW90ZXMgKi8KKwkJCWNjWzBdID0gYzsKKwkJCXN0ciA9IGNjOworCQkJYyA9ICdcXCc7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJCVVTVFBVVEMoYywgbmV4dGMpOworIGNoZWNrc3RyOgorCQlpZiAoIXN0cikKKwkJCWNvbnRpbnVlOworIGRvc3RyOgorCQl3aGlsZSAoKGMgPSAqc3RyKyspICE9ICdcMCcpIHsKKwkJCVVTVFBVVEMoYywgbmV4dGMpOworCQl9CisJfSAvKiB3aGlsZSAqcCsrIG5vdCBOVUwgKi8KKworCWlmIChxdW90ZWQgJiAxKSB7CisJCVVTVFBVVEMoJyInLCBuZXh0Yyk7CisJfQorCSpuZXh0YyA9IDA7CisJY21kbmV4dGMgPSBuZXh0YzsKK30KKworLyogY21kdHh0KCkgYW5kIGNtZGxpc3QoKSBjYWxsIGVhY2ggb3RoZXIgKi8KK3N0YXRpYyB2b2lkIGNtZHR4dCh1bmlvbiBub2RlICpuKTsKKworc3RhdGljIHZvaWQKK2NtZGxpc3QodW5pb24gbm9kZSAqbnAsIGludCBzZXApCit7CisJZm9yICg7IG5wOyBucCA9IG5wLT5uYXJnLm5leHQpIHsKKwkJaWYgKCFzZXApCisJCQljbWRwdXRzKCIgIik7CisJCWNtZHR4dChucCk7CisJCWlmIChzZXAgJiYgbnAtPm5hcmcubmV4dCkKKwkJCWNtZHB1dHMoIiAiKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjbWR0eHQodW5pb24gbm9kZSAqbikKK3sKKwl1bmlvbiBub2RlICpucDsKKwlzdHJ1Y3Qgbm9kZWxpc3QgKmxwOworCWNvbnN0IGNoYXIgKnA7CisKKwlpZiAoIW4pCisJCXJldHVybjsKKwlzd2l0Y2ggKG4tPnR5cGUpIHsKKwlkZWZhdWx0OgorI2lmIERFQlVHCisJCWFib3J0KCk7CisjZW5kaWYKKwljYXNlIE5QSVBFOgorCQlscCA9IG4tPm5waXBlLmNtZGxpc3Q7CisJCWZvciAoOzspIHsKKwkJCWNtZHR4dChscC0+bik7CisJCQlscCA9IGxwLT5uZXh0OworCQkJaWYgKCFscCkKKwkJCQlicmVhazsKKwkJCWNtZHB1dHMoIiB8ICIpOworCQl9CisJCWJyZWFrOworCWNhc2UgTlNFTUk6CisJCXAgPSAiOyAiOworCQlnb3RvIGJpbm9wOworCWNhc2UgTkFORDoKKwkJcCA9ICIgJiYgIjsKKwkJZ290byBiaW5vcDsKKwljYXNlIE5PUjoKKwkJcCA9ICIgfHwgIjsKKyBiaW5vcDoKKwkJY21kdHh0KG4tPm5iaW5hcnkuY2gxKTsKKwkJY21kcHV0cyhwKTsKKwkJbiA9IG4tPm5iaW5hcnkuY2gyOworCQlnb3RvIGRvbm9kZTsKKwljYXNlIE5SRURJUjoKKwljYXNlIE5CQUNLR05EOgorCQluID0gbi0+bnJlZGlyLm47CisJCWdvdG8gZG9ub2RlOworCWNhc2UgTk5PVDoKKwkJY21kcHV0cygiISIpOworCQluID0gbi0+bm5vdC5jb207CisgZG9ub2RlOgorCQljbWR0eHQobik7CisJCWJyZWFrOworCWNhc2UgTklGOgorCQljbWRwdXRzKCJpZiAiKTsKKwkJY21kdHh0KG4tPm5pZi50ZXN0KTsKKwkJY21kcHV0cygiOyB0aGVuICIpOworCQlpZiAobi0+bmlmLmVsc2VwYXJ0KSB7CisJCQljbWR0eHQobi0+bmlmLmlmcGFydCk7CisJCQljbWRwdXRzKCI7IGVsc2UgIik7CisJCQluID0gbi0+bmlmLmVsc2VwYXJ0OworCQl9IGVsc2UgeworCQkJbiA9IG4tPm5pZi5pZnBhcnQ7CisJCX0KKwkJcCA9ICI7IGZpIjsKKwkJZ290byBkb3RhaWw7CisJY2FzZSBOU1VCU0hFTEw6CisJCWNtZHB1dHMoIigiKTsKKwkJbiA9IG4tPm5yZWRpci5uOworCQlwID0gIikiOworCQlnb3RvIGRvdGFpbDsKKwljYXNlIE5XSElMRToKKwkJcCA9ICJ3aGlsZSAiOworCQlnb3RvIHVudGlsOworCWNhc2UgTlVOVElMOgorCQlwID0gInVudGlsICI7CisgdW50aWw6CisJCWNtZHB1dHMocCk7CisJCWNtZHR4dChuLT5uYmluYXJ5LmNoMSk7CisJCW4gPSBuLT5uYmluYXJ5LmNoMjsKKwkJcCA9ICI7IGRvbmUiOworIGRvZG86CisJCWNtZHB1dHMoIjsgZG8gIik7CisgZG90YWlsOgorCQljbWR0eHQobik7CisJCWdvdG8gZG90YWlsMjsKKwljYXNlIE5GT1I6CisJCWNtZHB1dHMoImZvciAiKTsKKwkJY21kcHV0cyhuLT5uZm9yLnZhcik7CisJCWNtZHB1dHMoIiBpbiAiKTsKKwkJY21kbGlzdChuLT5uZm9yLmFyZ3MsIDEpOworCQluID0gbi0+bmZvci5ib2R5OworCQlwID0gIjsgZG9uZSI7CisJCWdvdG8gZG9kbzsKKwljYXNlIE5ERUZVTjoKKwkJY21kcHV0cyhuLT5uYXJnLnRleHQpOworCQlwID0gIigpIHsgLi4uIH0iOworCQlnb3RvIGRvdGFpbDI7CisJY2FzZSBOQ01EOgorCQljbWRsaXN0KG4tPm5jbWQuYXJncywgMSk7CisJCWNtZGxpc3Qobi0+bmNtZC5yZWRpcmVjdCwgMCk7CisJCWJyZWFrOworCWNhc2UgTkFSRzoKKwkJcCA9IG4tPm5hcmcudGV4dDsKKyBkb3RhaWwyOgorCQljbWRwdXRzKHApOworCQlicmVhazsKKwljYXNlIE5IRVJFOgorCWNhc2UgTlhIRVJFOgorCQlwID0gIjw8Li4uIjsKKwkJZ290byBkb3RhaWwyOworCWNhc2UgTkNBU0U6CisJCWNtZHB1dHMoImNhc2UgIik7CisJCWNtZHB1dHMobi0+bmNhc2UuZXhwci0+bmFyZy50ZXh0KTsKKwkJY21kcHV0cygiIGluICIpOworCQlmb3IgKG5wID0gbi0+bmNhc2UuY2FzZXM7IG5wOyBucCA9IG5wLT5uY2xpc3QubmV4dCkgeworCQkJY21kdHh0KG5wLT5uY2xpc3QucGF0dGVybik7CisJCQljbWRwdXRzKCIpICIpOworCQkJY21kdHh0KG5wLT5uY2xpc3QuYm9keSk7CisJCQljbWRwdXRzKCI7OyAiKTsKKwkJfQorCQlwID0gImVzYWMiOworCQlnb3RvIGRvdGFpbDI7CisJY2FzZSBOVE86CisJCXAgPSAiPiI7CisJCWdvdG8gcmVkaXI7CisJY2FzZSBOQ0xPQkJFUjoKKwkJcCA9ICI+fCI7CisJCWdvdG8gcmVkaXI7CisJY2FzZSBOQVBQRU5EOgorCQlwID0gIj4+IjsKKwkJZ290byByZWRpcjsKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJY2FzZSBOVE8yOgorI2VuZGlmCisJY2FzZSBOVE9GRDoKKwkJcCA9ICI+JiI7CisJCWdvdG8gcmVkaXI7CisJY2FzZSBORlJPTToKKwkJcCA9ICI8IjsKKwkJZ290byByZWRpcjsKKwljYXNlIE5GUk9NRkQ6CisJCXAgPSAiPCYiOworCQlnb3RvIHJlZGlyOworCWNhc2UgTkZST01UTzoKKwkJcCA9ICI8PiI7CisgcmVkaXI6CisJCWNtZHB1dHModXRvYShuLT5uZmlsZS5mZCkpOworCQljbWRwdXRzKHApOworCQlpZiAobi0+dHlwZSA9PSBOVE9GRCB8fCBuLT50eXBlID09IE5GUk9NRkQpIHsKKwkJCWNtZHB1dHModXRvYShuLT5uZHVwLmR1cGZkKSk7CisJCQlicmVhazsKKwkJfQorCQluID0gbi0+bmZpbGUuZm5hbWU7CisJCWdvdG8gZG9ub2RlOworCX0KK30KKworc3RhdGljIGNoYXIgKgorY29tbWFuZHRleHQodW5pb24gbm9kZSAqbikKK3sKKwljaGFyICpuYW1lOworCisJU1RBUlRTVEFDS1NUUihjbWRuZXh0Yyk7CisJY21kdHh0KG4pOworCW5hbWUgPSBzdGFja2Jsb2NrKCk7CisJVFJBQ0UoKCJjb21tYW5kdGV4dDogbmFtZSAlcCwgZW5kICVwXG5cdFwiJXNcIlxuIiwKKwkJCW5hbWUsIGNtZG5leHRjLCBjbWRuZXh0YykpOworCXJldHVybiBja3N0cmR1cChuYW1lKTsKK30KKyNlbmRpZiAvKiBKT0JTICovCisKKy8qCisgKiBGb3JrIG9mZiBhIHN1YnNoZWxsLiAgSWYgd2UgYXJlIGRvaW5nIGpvYiBjb250cm9sLCBnaXZlIHRoZSBzdWJzaGVsbCBpdHMKKyAqIG93biBwcm9jZXNzIGdyb3VwLiAgSnAgaXMgYSBqb2Igc3RydWN0dXJlIHRoYXQgdGhlIGpvYiBpcyB0byBiZSBhZGRlZCB0by4KKyAqIE4gaXMgdGhlIGNvbW1hbmQgdGhhdCB3aWxsIGJlIGV2YWx1YXRlZCBieSB0aGUgY2hpbGQuICBCb3RoIGpwIGFuZCBuIG1heQorICogYmUgTlVMTC4gIFRoZSBtb2RlIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisgKiAgICAgIEZPUktfRkcgLSBGb3JrIG9mZiBhIGZvcmVncm91bmQgcHJvY2Vzcy4KKyAqICAgICAgRk9SS19CRyAtIEZvcmsgb2ZmIGEgYmFja2dyb3VuZCBwcm9jZXNzLgorICogICAgICBGT1JLX05PSk9CIC0gTGlrZSBGT1JLX0ZHLCBidXQgZG9uJ3QgZ2l2ZSB0aGUgcHJvY2VzcyBpdHMgb3duCisgKiAgICAgICAgICAgICAgICAgICBwcm9jZXNzIGdyb3VwIGV2ZW4gaWYgam9iIGNvbnRyb2wgaXMgb24uCisgKgorICogV2hlbiBqb2IgY29udHJvbCBpcyB0dXJuZWQgb2ZmLCBiYWNrZ3JvdW5kIHByb2Nlc3NlcyBoYXZlIHRoZWlyIHN0YW5kYXJkCisgKiBpbnB1dCByZWRpcmVjdGVkIHRvIC9kZXYvbnVsbCAoZXhjZXB0IGZvciB0aGUgc2Vjb25kIGFuZCBsYXRlciBwcm9jZXNzZXMKKyAqIGluIGEgcGlwZWxpbmUpLgorICoKKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgb2ZmLgorICovCisvKgorICogQ2xlYXIgdHJhcHMgb24gYSBmb3JrLgorICovCitzdGF0aWMgdm9pZAorY2xlYXJfdHJhcHModm9pZCkKK3sKKwljaGFyICoqdHA7CisKKwlmb3IgKHRwID0gdHJhcDsgdHAgPCAmdHJhcFtOU0lHXTsgdHArKykgeworCQlpZiAoKnRwICYmICoqdHApIHsgICAgICAvKiB0cmFwIG5vdCBOVUxMIG9yICIiIChTSUdfSUdOKSAqLworCQkJSU5UX09GRjsKKwkJCWlmICh0cmFwX3B0ciA9PSB0cmFwKQorCQkJCWZyZWUoKnRwKTsKKwkJCS8qIGVsc2U6IGl0ICJiZWxvbmdzIiB0byB0cmFwX3B0ciB2ZWN0b3IsIGRvbid0IGZyZWUgKi8KKwkJCSp0cCA9IE5VTEw7CisJCQlpZiAoKHRwIC0gdHJhcCkgIT0gMCkKKwkJCQlzZXRzaWduYWwodHAgLSB0cmFwKTsKKwkJCUlOVF9PTjsKKwkJfQorCX0KKwltYXlfaGF2ZV90cmFwcyA9IDA7Cit9CisKKy8qIExpdmVzIGZhciBhd2F5IGZyb20gaGVyZSwgbmVlZGVkIGZvciBmb3JrY2hpbGQgKi8KK3N0YXRpYyB2b2lkIGNsb3Nlc2NyaXB0KHZvaWQpOworCisvKiBDYWxsZWQgYWZ0ZXIgZm9yaygpLCBpbiBjaGlsZCAqLworc3RhdGljIE5PSU5MSU5FIHZvaWQKK2ZvcmtjaGlsZChzdHJ1Y3Qgam9iICpqcCwgdW5pb24gbm9kZSAqbiwgaW50IG1vZGUpCit7CisJaW50IG9sZGx2bDsKKworCVRSQUNFKCgiQ2hpbGQgc2hlbGwgJWRcbiIsIGdldHBpZCgpKSk7CisJb2xkbHZsID0gc2hsdmw7CisJc2hsdmwrKzsKKworCS8qIG1hbiBiYXNoOiAiTm9uLWJ1aWx0aW4gY29tbWFuZHMgcnVuIGJ5IGJhc2ggaGF2ZSBzaWduYWwgaGFuZGxlcnMKKwkgKiBzZXQgdG8gdGhlIHZhbHVlcyBpbmhlcml0ZWQgYnkgdGhlIHNoZWxsIGZyb20gaXRzIHBhcmVudCIuCisJICogRG8gd2UgZG8gaXQgY29ycmVjdGx5PyAqLworCisJY2xvc2VzY3JpcHQoKTsKKworCWlmIChtb2RlID09IEZPUktfTk9KT0IgICAgICAgICAgLyogaXMgaXQgYHh4eGAgPyAqLworCSAmJiBuICYmIG4tPnR5cGUgPT0gTkNNRCAgICAgICAgLyogaXMgaXQgc2luZ2xlIGNtZD8gKi8KKwkvKiAmJiBuLT5uY21kLmFyZ3MtPnR5cGUgPT0gTkFSRyAtIGFsd2F5cyB0cnVlPyAqLworCSAmJiBuLT5uY21kLmFyZ3MgJiYgc3RyY21wKG4tPm5jbWQuYXJncy0+bmFyZy50ZXh0LCAidHJhcCIpID09IDAKKwkgJiYgbi0+bmNtZC5hcmdzLT5uYXJnLm5leHQgPT0gTlVMTCAvKiAidHJhcCIgd2l0aCBubyBhcmd1bWVudHMgKi8KKwkvKiAmJiBuLT5uY21kLmFyZ3MtPm5hcmcuYmFja3F1b3RlID09IE5VTEwgLSBkbyB3ZSBuZWVkIHRvIGNoZWNrIHRoaXM/ICovCisJKSB7CisJCVRSQUNFKCgiVHJhcCBoYWNrXG4iKSk7CisJCS8qIEF3ZnVsIGhhY2sgZm9yIGB0cmFwYCBvciAkKHRyYXApLgorCQkgKgorCQkgKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDk2OTUzOTkvdXRpbGl0aWVzL3RyYXAuaHRtbAorCQkgKiBjb250YWlucyBhbiBleGFtcGxlIHdoZXJlICJ0cmFwIiBpcyBleGVjdXRlZCBpbiBhIHN1YnNoZWxsOgorCQkgKgorCQkgKiBzYXZlX3RyYXBzPSQodHJhcCkKKwkJICogLi4uCisJCSAqIGV2YWwgIiRzYXZlX3RyYXBzIgorCQkgKgorCQkgKiBTdGFuZGFyZCBkb2VzIG5vdCBzYXkgdGhhdCAidHJhcCIgaW4gc3Vic2hlbGwgc2hhbGwgcHJpbnQKKwkJICogcGFyZW50IHNoZWxsJ3MgdHJhcHMuIEl0IG9ubHkgc2F5cyB0aGF0IGl0cyBvdXRwdXQKKwkJICogbXVzdCBoYXZlIHN1aXRhYmxlIGZvcm0sIGJ1dCB0aGVuLCBpbiB0aGUgYWJvdmUgZXhhbXBsZQorCQkgKiAod2hpY2ggaXMgbm90IHN1cHBvc2VkIHRvIGJlIG5vcm1hdGl2ZSksIGl0IGltcGxpZXMgdGhhdC4KKwkJICoKKwkJICogYmFzaCAoYW5kIHByb2JhYmx5IG90aGVyIHNoZWxsKSBkb2VzIGltcGxlbWVudCBpdAorCQkgKiAodHJhcHMgYXJlIHJlc2V0IHRvIGRlZmF1bHRzLCBidXQgInRyYXAiIHN0aWxsIHNob3dzIHRoZW0pLAorCQkgKiBidXQgYXMgYSByZXN1bHQsICJ0cmFwIiBsb2dpYyBpcyBob3BlbGVzc2x5IG1lc3NlZCB1cDoKKwkJICoKKwkJICogIyB0cmFwCisJCSAqIHRyYXAgLS0gJ2VjaG8gSG8nIFNJR1dJTkNIICA8LS0tIHdlIGhhdmUgYSBoYW5kbGVyCisJCSAqICMgKHRyYXApICAgICAgICA8LS0tIHRyYXAgaXMgaW4gc3Vic2hlbGwgLSBubyBvdXRwdXQgKGNvcnJlY3QsIHRyYXBzIGFyZSByZXNldCkKKwkJICogIyB0cnVlIHwgdHJhcCAgIDwtLS0gdHJhcCBpcyBpbiBzdWJzaGVsbCAtIG5vIG91dHB1dCAoZGl0dG8pCisJCSAqICMgZWNobyBgdHJ1ZSB8IHRyYXBgICAgIDwtLS0gaW4gc3Vic2hlbGwgLSBvdXRwdXQgKGJ1dCB0cmFwcyBhcmUgcmVzZXQhKQorCQkgKiB0cmFwIC0tICdlY2hvIEhvJyBTSUdXSU5DSAorCQkgKiAjIGVjaG8gYCh0cmFwKWAgICAgICAgICA8LS0tIGluIHN1YnNoZWxsIGluIHN1YnNoZWxsIC0gb3V0cHV0CisJCSAqIHRyYXAgLS0gJ2VjaG8gSG8nIFNJR1dJTkNICisJCSAqICMgZWNobyBgdHJ1ZSB8ICh0cmFwKWAgIDwtLS0gaW4gc3Vic2hlbGwgaW4gc3Vic2hlbGwgaW4gc3Vic2hlbGwgLSBvdXRwdXQhCisJCSAqIHRyYXAgLS0gJ2VjaG8gSG8nIFNJR1dJTkNICisJCSAqCisJCSAqIFRoZSBydWxlcyB3aGVuIHRvIGZvcmdldCBhbmQgd2hlbiB0byBub3QgZm9yZ2V0IHRyYXBzCisJCSAqIGdldCByZWFsbHkgY29tcGxleCBhbmQgbm9uc2Vuc2ljYWwuCisJCSAqCisJCSAqIE91ciBzb2x1dGlvbjogT05MWSBiYXJlICQodHJhcCkgb3IgYHRyYXBgIGlzIHNwZWNpYWwuCisJCSAqLworCQkvKiBTYXZlIHRyYXAgaGFuZGxlciBzdHJpbmdzIGZvciB0cmFwIGJ1aWx0aW4gdG8gcHJpbnQgKi8KKwkJdHJhcF9wdHIgPSB4bWVtZHVwKHRyYXAsIHNpemVvZih0cmFwKSk7CisJCS8qIEZhbGwgdGhyb3VnaCBpbnRvIGNsZWFyaW5nIHRyYXBzICovCisJfQorCWNsZWFyX3RyYXBzKCk7CisjaWYgSk9CUworCS8qIGRvIGpvYiBjb250cm9sIG9ubHkgaW4gcm9vdCBzaGVsbCAqLworCWRvaW5nX2pvYmN0bCA9IDA7CisJaWYgKG1vZGUgIT0gRk9SS19OT0pPQiAmJiBqcC0+am9iY3RsICYmIG9sZGx2bCA9PSAwKSB7CisJCXBpZF90IHBncnA7CisKKwkJaWYgKGpwLT5ucHJvY3MgPT0gMCkKKwkJCXBncnAgPSBnZXRwaWQoKTsKKwkJZWxzZQorCQkJcGdycCA9IGpwLT5wc1swXS5wc19waWQ7CisJCS8qIHRoaXMgY2FuIGZhaWwgYmVjYXVzZSB3ZSBhcmUgZG9pbmcgaXQgaW4gdGhlIHBhcmVudCBhbHNvICovCisJCXNldHBnaWQoMCwgcGdycCk7CisJCWlmIChtb2RlID09IEZPUktfRkcpCisJCQl4dGNzZXRwZ3JwKHR0eWZkLCBwZ3JwKTsKKwkJc2V0c2lnbmFsKFNJR1RTVFApOworCQlzZXRzaWduYWwoU0lHVFRPVSk7CisJfSBlbHNlCisjZW5kaWYKKwlpZiAobW9kZSA9PSBGT1JLX0JHKSB7CisJCS8qIG1hbiBiYXNoOiAiV2hlbiBqb2IgY29udHJvbCBpcyBub3QgaW4gZWZmZWN0LAorCQkgKiBhc3luY2hyb25vdXMgY29tbWFuZHMgaWdub3JlIFNJR0lOVCBhbmQgU0lHUVVJVCIgKi8KKwkJaWdub3Jlc2lnKFNJR0lOVCk7CisJCWlnbm9yZXNpZyhTSUdRVUlUKTsKKwkJaWYgKGpwLT5ucHJvY3MgPT0gMCkgeworCQkJY2xvc2UoMCk7CisJCQlpZiAob3BlbihiYl9kZXZfbnVsbCwgT19SRE9OTFkpICE9IDApCisJCQkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoImNhbid0IG9wZW4gJyVzJyIsIGJiX2Rldl9udWxsKTsKKwkJfQorCX0KKwlpZiAob2xkbHZsID09IDApIHsKKwkJaWYgKGlmbGFnKSB7IC8qIHdoeSBpZiBpZmxhZyBvbmx5PyAqLworCQkJc2V0c2lnbmFsKFNJR0lOVCk7CisJCQlzZXRzaWduYWwoU0lHVEVSTSk7CisJCX0KKwkJLyogbWFuIGJhc2g6CisJCSAqICJJbiBhbGwgY2FzZXMsIGJhc2ggaWdub3JlcyBTSUdRVUlULiBOb24tYnVpbHRpbgorCQkgKiBjb21tYW5kcyBydW4gYnkgYmFzaCBoYXZlIHNpZ25hbCBoYW5kbGVycworCQkgKiBzZXQgdG8gdGhlIHZhbHVlcyBpbmhlcml0ZWQgYnkgdGhlIHNoZWxsCisJCSAqIGZyb20gaXRzIHBhcmVudCIuCisJCSAqIFRha2UgY2FyZSBvZiB0aGUgc2Vjb25kIHJ1bGU6ICovCisJCXNldHNpZ25hbChTSUdRVUlUKTsKKwl9CisjaWYgSk9CUworCWlmIChuICYmIG4tPnR5cGUgPT0gTkNNRAorCSAmJiBuLT5uY21kLmFyZ3MgJiYgc3RyY21wKG4tPm5jbWQuYXJncy0+bmFyZy50ZXh0LCAiam9icyIpID09IDAKKwkpIHsKKwkJVFJBQ0UoKCJKb2IgaGFja1xuIikpOworCQkvKiAiam9icyI6IHdlIGRvIG5vdCB3YW50IHRvIGNsZWFyIGpvYiBsaXN0IGZvciBpdCwKKwkJICogaW5zdGVhZCB3ZSByZW1vdmUgb25seSBfaXRzXyBvd25fIGpvYiBmcm9tIGpvYiBsaXN0LgorCQkgKiBUaGlzIG1ha2VzICJqb2JzIC4uLi4gfCBjYXQiIG1vcmUgdXNlZnVsLgorCQkgKi8KKwkJZnJlZWpvYihjdXJqb2IpOworCQlyZXR1cm47CisJfQorI2VuZGlmCisJZm9yIChqcCA9IGN1cmpvYjsganA7IGpwID0ganAtPnByZXZfam9iKQorCQlmcmVlam9iKGpwKTsKKwlqb2JsZXNzID0gMDsKK30KKworLyogQ2FsbGVkIGFmdGVyIGZvcmsoKSwgaW4gcGFyZW50ICovCisjaWYgIUpPQlMKKyNkZWZpbmUgZm9ya3BhcmVudChqcCwgbiwgbW9kZSwgcGlkKSBmb3JrcGFyZW50KGpwLCBtb2RlLCBwaWQpCisjZW5kaWYKK3N0YXRpYyB2b2lkCitmb3JrcGFyZW50KHN0cnVjdCBqb2IgKmpwLCB1bmlvbiBub2RlICpuLCBpbnQgbW9kZSwgcGlkX3QgcGlkKQoreworCVRSQUNFKCgiSW4gcGFyZW50IHNoZWxsOiBjaGlsZCA9ICVkXG4iLCBwaWQpKTsKKwlpZiAoIWpwKSB7CisJCXdoaWxlIChqb2JsZXNzICYmIGRvd2FpdChET1dBSVRfTk9OQkxPQ0ssIE5VTEwpID4gMCkKKwkJCWNvbnRpbnVlOworCQlqb2JsZXNzKys7CisJCXJldHVybjsKKwl9CisjaWYgSk9CUworCWlmIChtb2RlICE9IEZPUktfTk9KT0IgJiYganAtPmpvYmN0bCkgeworCQlpbnQgcGdycDsKKworCQlpZiAoanAtPm5wcm9jcyA9PSAwKQorCQkJcGdycCA9IHBpZDsKKwkJZWxzZQorCQkJcGdycCA9IGpwLT5wc1swXS5wc19waWQ7CisJCS8qIFRoaXMgY2FuIGZhaWwgYmVjYXVzZSB3ZSBhcmUgZG9pbmcgaXQgaW4gdGhlIGNoaWxkIGFsc28gKi8KKwkJc2V0cGdpZChwaWQsIHBncnApOworCX0KKyNlbmRpZgorCWlmIChtb2RlID09IEZPUktfQkcpIHsKKwkJYmFja2duZHBpZCA9IHBpZDsgICAgICAgICAgICAgICAvKiBzZXQgJCEgKi8KKwkJc2V0X2N1cmpvYihqcCwgQ1VSX1JVTk5JTkcpOworCX0KKwlpZiAoanApIHsKKwkJc3RydWN0IHByb2NzdGF0ICpwcyA9ICZqcC0+cHNbanAtPm5wcm9jcysrXTsKKwkJcHMtPnBzX3BpZCA9IHBpZDsKKwkJcHMtPnBzX3N0YXR1cyA9IC0xOworCQlwcy0+cHNfY21kID0gbnVsbHN0cjsKKyNpZiBKT0JTCisJCWlmIChkb2luZ19qb2JjdGwgJiYgbikKKwkJCXBzLT5wc19jbWQgPSBjb21tYW5kdGV4dChuKTsKKyNlbmRpZgorCX0KK30KKworc3RhdGljIGludAorZm9ya3NoZWxsKHN0cnVjdCBqb2IgKmpwLCB1bmlvbiBub2RlICpuLCBpbnQgbW9kZSkKK3sKKwlpbnQgcGlkOworCisJVFJBQ0UoKCJmb3Jrc2hlbGwoJSUlZCwgJXAsICVkKSBjYWxsZWRcbiIsIGpvYm5vKGpwKSwgbiwgbW9kZSkpOworCXBpZCA9IGZvcmsoKTsKKwlpZiAocGlkIDwgMCkgeworCQlUUkFDRSgoIkZvcmsgZmFpbGVkLCBlcnJubz0lZCIsIGVycm5vKSk7CisJCWlmIChqcCkKKwkJCWZyZWVqb2IoanApOworCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigiY2FuJ3QgZm9yayIpOworCX0KKwlpZiAocGlkID09IDApIHsKKwkJQ0xFQVJfUkFORE9NX1QoJnJhbmRvbV9nZW4pOyAvKiBvciBlbHNlICRSQU5ET00gcmVwZWF0cyBpbiBjaGlsZCAqLworCQlmb3JrY2hpbGQoanAsIG4sIG1vZGUpOworCX0gZWxzZSB7CisJCWZvcmtwYXJlbnQoanAsIG4sIG1vZGUsIHBpZCk7CisJfQorCXJldHVybiBwaWQ7Cit9CisKKy8qCisgKiBXYWl0IGZvciBqb2IgdG8gZmluaXNoLgorICoKKyAqIFVuZGVyIGpvYiBjb250cm9sIHdlIGhhdmUgdGhlIHByb2JsZW0gdGhhdCB3aGlsZSBhIGNoaWxkIHByb2Nlc3MKKyAqIGlzIHJ1bm5pbmcgaW50ZXJydXB0cyBnZW5lcmF0ZWQgYnkgdGhlIHVzZXIgYXJlIHNlbnQgdG8gdGhlIGNoaWxkCisgKiBidXQgbm90IHRvIHRoZSBzaGVsbC4gIFRoaXMgbWVhbnMgdGhhdCBhbiBpbmZpbml0ZSBsb29wIHN0YXJ0ZWQgYnkKKyAqIGFuIGludGVyYWN0aXZlIHVzZXIgbWF5IGJlIGhhcmQgdG8ga2lsbC4gIFdpdGggam9iIGNvbnRyb2wgdHVybmVkIG9mZiwKKyAqIGFuIGludGVyYWN0aXZlIHVzZXIgbWF5IHBsYWNlIGFuIGludGVyYWN0aXZlIHByb2dyYW0gaW5zaWRlIGEgbG9vcC4KKyAqIElmIHRoZSBpbnRlcmFjdGl2ZSBwcm9ncmFtIGNhdGNoZXMgaW50ZXJydXB0cywgdGhlIHVzZXIgZG9lc24ndCB3YW50CisgKiB0aGVzZSBpbnRlcnJ1cHRzIHRvIGFsc28gYWJvcnQgdGhlIGxvb3AuICBUaGUgYXBwcm9hY2ggd2UgdGFrZSBoZXJlCisgKiBpcyB0byBoYXZlIHRoZSBzaGVsbCBpZ25vcmUgaW50ZXJydXB0IHNpZ25hbHMgd2hpbGUgd2FpdGluZyBmb3IgYQorICogZm9yZWdyb3VuZCBwcm9jZXNzIHRvIHRlcm1pbmF0ZSwgYW5kIHRoZW4gc2VuZCBpdHNlbGYgYW4gaW50ZXJydXB0CisgKiBzaWduYWwgaWYgdGhlIGNoaWxkIHByb2Nlc3Mgd2FzIHRlcm1pbmF0ZWQgYnkgYW4gaW50ZXJydXB0IHNpZ25hbC4KKyAqIFVuZm9ydHVuYXRlbHksIHNvbWUgcHJvZ3JhbXMgd2FudCB0byBkbyBhIGJpdCBvZiBjbGVhbnVwIGFuZCB0aGVuCisgKiBleGl0IG9uIGludGVycnVwdDsgdW5sZXNzIHRoZXNlIHByb2Nlc3NlcyB0ZXJtaW5hdGUgdGhlbXNlbHZlcyBieQorICogc2VuZGluZyBhIHNpZ25hbCB0byB0aGVtc2VsdmVzIChpbnN0ZWFkIG9mIGNhbGxpbmcgZXhpdCkgdGhleSB3aWxsCisgKiBjb25mdXNlIHRoaXMgYXBwcm9hY2guCisgKgorICogQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBvZmYuCisgKi8KK3N0YXRpYyBpbnQKK3dhaXRmb3Jqb2Ioc3RydWN0IGpvYiAqanApCit7CisJaW50IHN0OworCisJVFJBQ0UoKCJ3YWl0Zm9yam9iKCUlJWQpIGNhbGxlZFxuIiwgam9ibm8oanApKSk7CisKKwlJTlRfT0ZGOworCXdoaWxlIChqcC0+c3RhdGUgPT0gSk9CUlVOTklORykgeworCQkvKiBJbiBub24taW50ZXJhY3RpdmUgc2hlbGxzLCB3ZSBfY2FuXyBnZXQKKwkJICogYSBrZXlib2FyZCBzaWduYWwgaGVyZSBhbmQgYmUgRUlOVFJlZCwKKwkJICogYnV0IHdlIGp1c3QgbG9vcCBiYWNrLCB3YWl0aW5nIGZvciBjb21tYW5kIHRvIGNvbXBsZXRlLgorCQkgKgorCQkgKiBtYW4gYmFzaDoKKwkJICogIklmIGJhc2ggaXMgd2FpdGluZyBmb3IgYSBjb21tYW5kIHRvIGNvbXBsZXRlIGFuZCByZWNlaXZlcworCQkgKiBhIHNpZ25hbCBmb3Igd2hpY2ggYSB0cmFwIGhhcyBiZWVuIHNldCwgdGhlIHRyYXAKKwkJICogd2lsbCBub3QgYmUgZXhlY3V0ZWQgdW50aWwgdGhlIGNvbW1hbmQgY29tcGxldGVzLiIKKwkJICoKKwkJICogUmVhbGl0eSBpcyB0aGF0IGV2ZW4gaWYgdHJhcCBpcyBub3Qgc2V0LCBiYXNoCisJCSAqIHdpbGwgbm90IGFjdCBvbiB0aGUgc2lnbmFsIHVudGlsIGNvbW1hbmQgY29tcGxldGVzLgorCQkgKiBUcnkgdGhpcy4gc2xlZXA1aW50b2ZmLmM6CisJCSAqICNpbmNsdWRlIDxzaWduYWwuaD4KKwkJICogI2luY2x1ZGUgPHVuaXN0ZC5oPgorCQkgKiBpbnQgbWFpbigpIHsKKwkJICogICAgICAgICBzaWdzZXRfdCBzZXQ7CisJCSAqICAgICAgICAgc2lnZW1wdHlzZXQoJnNldCk7CisJCSAqICAgICAgICAgc2lnYWRkc2V0KCZzZXQsIFNJR0lOVCk7CisJCSAqICAgICAgICAgc2lnYWRkc2V0KCZzZXQsIFNJR1FVSVQpOworCQkgKiAgICAgICAgIHNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNldCwgTlVMTCk7CisJCSAqICAgICAgICAgc2xlZXAoNSk7CisJCSAqICAgICAgICAgcmV0dXJuIDA7CisJCSAqIH0KKwkJICogJCBiYXNoIC1jICcuL3NsZWVwNWludG9mZjsgZWNobyBoaScKKwkJICogXkNeQ15DXkMgPC0tLSBwcmVzc2luZyBeQyBvbmNlIGEgc2Vjb25kCisJCSAqICQgXworCQkgKiAkIGJhc2ggLWMgJy4vc2xlZXA1aW50b2ZmOyBlY2hvIGhpJworCQkgKiBeXF5cXlxeXGhpIDwtLS0gcHJlc3NpbmcgXlwgKFNJR1FVSVQpCisJCSAqICQgXworCQkgKi8KKwkJZG93YWl0KERPV0FJVF9CTE9DSywganApOworCX0KKwlJTlRfT047CisKKwlzdCA9IGdldHN0YXR1cyhqcCk7CisjaWYgSk9CUworCWlmIChqcC0+am9iY3RsKSB7CisJCXh0Y3NldHBncnAodHR5ZmQsIHJvb3RwaWQpOworCQkvKgorCQkgKiBUaGlzIGlzIHRydWx5IGdyb3NzLgorCQkgKiBJZiB3ZSdyZSBkb2luZyBqb2IgY29udHJvbCwgdGhlbiB3ZSBkaWQgYSBUSU9DU1BHUlAgd2hpY2gKKwkJICogY2F1c2VkIHVzICh0aGUgc2hlbGwpIHRvIG5vIGxvbmdlciBiZSBpbiB0aGUgY29udHJvbGxpbmcKKwkJICogc2Vzc2lvbiAtLSBzbyB3ZSB3b3VsZG4ndCBoYXZlIHNlZW4gYW55IF5DL1NJR0lOVC4gIFNvLCB3ZQorCQkgKiBpbnR1aXQgZnJvbSB0aGUgc3VicHJvY2VzcyBleGl0IHN0YXR1cyB3aGV0aGVyIGEgU0lHSU5UCisJCSAqIG9jY3VycmVkLCBhbmQgaWYgc28gaW50ZXJydXB0IG91cnNlbHZlcy4gIFl1Y2suICAtIG15Y3JvZnQKKwkJICovCisJCWlmIChqcC0+c2lnaW50KSAvKiBUT0RPOiBkbyB0aGUgc2FtZSB3aXRoIGFsbCBzaWduYWxzICovCisJCQlyYWlzZShTSUdJTlQpOyAvKiAuLi4gYnkgcmFpc2UoanAtPnNpZykgaW5zdGVhZD8gKi8KKwl9CisJaWYgKGpwLT5zdGF0ZSA9PSBKT0JET05FKQorI2VuZGlmCisJCWZyZWVqb2IoanApOworCXJldHVybiBzdDsKK30KKworLyoKKyAqIHJldHVybiAxIGlmIHRoZXJlIGFyZSBzdG9wcGVkIGpvYnMsIG90aGVyd2lzZSAwCisgKi8KK3N0YXRpYyBpbnQKK3N0b3BwZWRqb2JzKHZvaWQpCit7CisJc3RydWN0IGpvYiAqanA7CisJaW50IHJldHZhbDsKKworCXJldHZhbCA9IDA7CisJaWYgKGpvYl93YXJuaW5nKQorCQlnb3RvIG91dDsKKwlqcCA9IGN1cmpvYjsKKwlpZiAoanAgJiYganAtPnN0YXRlID09IEpPQlNUT1BQRUQpIHsKKwkJb3V0MnN0cigiWW91IGhhdmUgc3RvcHBlZCBqb2JzLlxuIik7CisJCWpvYl93YXJuaW5nID0gMjsKKwkJcmV0dmFsKys7CisJfQorIG91dDoKKwlyZXR1cm4gcmV0dmFsOworfQorCisKKy8qID09PT09PT09PT09PSByZWRpci5jCisgKgorICogQ29kZSBmb3IgZGVhbGluZyB3aXRoIGlucHV0L291dHB1dCByZWRpcmVjdGlvbi4KKyAqLworCisjdW5kZWYgRU1QVFkKKyN1bmRlZiBDTE9TRUQKKyNkZWZpbmUgRU1QVFkgLTIgICAgICAgICAgICAgICAgLyogbWFya3MgYW4gdW51c2VkIHNsb3QgaW4gcmVkaXJ0YWIgKi8KKyNkZWZpbmUgQ0xPU0VEIC0zICAgICAgICAgICAgICAgLyogbWFya3MgYSBzbG90IG9mIHByZXZpb3VzbHktY2xvc2VkIGZkICovCisKKy8qCisgKiBPcGVuIGEgZmlsZSBpbiBub2Nsb2JiZXIgbW9kZS4KKyAqIFRoZSBjb2RlIHdhcyBjb3BpZWQgZnJvbSBiYXNoLgorICovCitzdGF0aWMgaW50Citub2Nsb2JiZXJvcGVuKGNvbnN0IGNoYXIgKmZuYW1lKQoreworCWludCByLCBmZDsKKwlzdHJ1Y3Qgc3RhdCBmaW5mbywgZmluZm8yOworCisJLyoKKwkgKiBJZiB0aGUgZmlsZSBleGlzdHMgYW5kIGlzIGEgcmVndWxhciBmaWxlLCByZXR1cm4gYW4gZXJyb3IKKwkgKiBpbW1lZGlhdGVseS4KKwkgKi8KKwlyID0gc3RhdChmbmFtZSwgJmZpbmZvKTsKKwlpZiAociA9PSAwICYmIFNfSVNSRUcoZmluZm8uc3RfbW9kZSkpIHsKKwkJZXJybm8gPSBFRVhJU1Q7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIElmIHRoZSBmaWxlIHdhcyBub3QgcHJlc2VudCAociAhPSAwKSwgbWFrZSBzdXJlIHdlIG9wZW4gaXQKKwkgKiBleGNsdXNpdmVseSBzbyB0aGF0IGlmIGl0IGlzIGNyZWF0ZWQgYmVmb3JlIHdlIG9wZW4gaXQsIG91ciBvcGVuCisJICogd2lsbCBmYWlsLiAgTWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90IHRydW5jYXRlIGFuIGV4aXN0aW5nIGZpbGUuCisJICogTm90ZSB0aGF0IHdlIGRvbid0IHR1cm4gb24gT19FWENMIHVubGVzcyB0aGUgc3RhdCBmYWlsZWQgLS0gaWYgdGhlCisJICogZmlsZSB3YXMgbm90IGEgcmVndWxhciBmaWxlLCB3ZSBsZWF2ZSBPX0VYQ0wgb2ZmLgorCSAqLworCWlmIChyICE9IDApCisJCXJldHVybiBvcGVuKGZuYW1lLCBPX1dST05MWXxPX0NSRUFUfE9fRVhDTCwgMDY2Nik7CisJZmQgPSBvcGVuKGZuYW1lLCBPX1dST05MWXxPX0NSRUFULCAwNjY2KTsKKworCS8qIElmIHRoZSBvcGVuIGZhaWxlZCwgcmV0dXJuIHRoZSBmaWxlIGRlc2NyaXB0b3IgcmlnaHQgYXdheS4gKi8KKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gZmQ7CisKKwkvKgorCSAqIE9LLCB0aGUgb3BlbiBzdWNjZWVkZWQsIGJ1dCB0aGUgZmlsZSBtYXkgaGF2ZSBiZWVuIGNoYW5nZWQgZnJvbSBhCisJICogbm9uLXJlZ3VsYXIgZmlsZSB0byBhIHJlZ3VsYXIgZmlsZSBiZXR3ZWVuIHRoZSBzdGF0IGFuZCB0aGUgb3Blbi4KKwkgKiBXZSBhcmUgYXNzdW1pbmcgdGhhdCB0aGUgT19FWENMIG9wZW4gaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBGSUxFTkFNRQorCSAqIGRpZCBub3QgZXhpc3QgYW5kIGlzIHN5bWxpbmtlZCB0byBhbiBleGlzdGluZyBmaWxlIGJldHdlZW4gdGhlIHN0YXQKKwkgKiBhbmQgb3Blbi4KKwkgKi8KKworCS8qCisJICogSWYgd2UgY2FuIG9wZW4gaXQgYW5kIGZzdGF0IHRoZSBmaWxlIGRlc2NyaXB0b3IsIGFuZCBuZWl0aGVyIGNoZWNrCisJICogcmV2ZWFsZWQgdGhhdCBpdCB3YXMgYSByZWd1bGFyIGZpbGUsIGFuZCB0aGUgZmlsZSBoYXMgbm90IGJlZW4KKwkgKiByZXBsYWNlZCwgcmV0dXJuIHRoZSBmaWxlIGRlc2NyaXB0b3IuCisJICovCisJaWYgKGZzdGF0KGZkLCAmZmluZm8yKSA9PSAwCisJICYmICFTX0lTUkVHKGZpbmZvMi5zdF9tb2RlKQorCSAmJiBmaW5mby5zdF9kZXYgPT0gZmluZm8yLnN0X2RldgorCSAmJiBmaW5mby5zdF9pbm8gPT0gZmluZm8yLnN0X2lubworCSkgeworCQlyZXR1cm4gZmQ7CisJfQorCisJLyogVGhlIGZpbGUgaGFzIGJlZW4gcmVwbGFjZWQuICBiYWRuZXNzLiAqLworCWNsb3NlKGZkKTsKKwllcnJubyA9IEVFWElTVDsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBIYW5kbGUgaGVyZSBkb2N1bWVudHMuICBOb3JtYWxseSB3ZSBmb3JrIG9mZiBhIHByb2Nlc3MgdG8gd3JpdGUgdGhlCisgKiBkYXRhIHRvIGEgcGlwZS4gIElmIHRoZSBkb2N1bWVudCBpcyBzaG9ydCwgd2UgY2FuIHN0dWZmIHRoZSBkYXRhIGluCisgKiB0aGUgcGlwZSB3aXRob3V0IGZvcmtpbmcuCisgKi8KKy8qIG9wZW5oZXJlIG5lZWRzIHRoaXMgZm9yd2FyZCByZWZlcmVuY2UgKi8KK3N0YXRpYyB2b2lkIGV4cGFuZGhlcmUodW5pb24gbm9kZSAqYXJnLCBpbnQgZmQpOworc3RhdGljIGludAorb3BlbmhlcmUodW5pb24gbm9kZSAqcmVkaXIpCit7CisJaW50IHBpcFsyXTsKKwlzaXplX3QgbGVuID0gMDsKKworCWlmIChwaXBlKHBpcCkgPCAwKQorCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigicGlwZSBjYWxsIGZhaWxlZCIpOworCWlmIChyZWRpci0+dHlwZSA9PSBOSEVSRSkgeworCQlsZW4gPSBzdHJsZW4ocmVkaXItPm5oZXJlLmRvYy0+bmFyZy50ZXh0KTsKKwkJaWYgKGxlbiA8PSBQSVBFX0JVRikgeworCQkJZnVsbF93cml0ZShwaXBbMV0sIHJlZGlyLT5uaGVyZS5kb2MtPm5hcmcudGV4dCwgbGVuKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCWlmIChmb3Jrc2hlbGwoKHN0cnVjdCBqb2IgKilOVUxMLCAodW5pb24gbm9kZSAqKU5VTEwsIEZPUktfTk9KT0IpID09IDApIHsKKwkJLyogY2hpbGQgKi8KKwkJY2xvc2UocGlwWzBdKTsKKwkJaWdub3Jlc2lnKFNJR0lOVCk7ICAvL3NpZ25hbChTSUdJTlQsIFNJR19JR04pOworCQlpZ25vcmVzaWcoU0lHUVVJVCk7IC8vc2lnbmFsKFNJR1FVSVQsIFNJR19JR04pOworCQlpZ25vcmVzaWcoU0lHSFVQKTsgIC8vc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7CisJCWlnbm9yZXNpZyhTSUdUU1RQKTsgLy9zaWduYWwoU0lHVFNUUCwgU0lHX0lHTik7CisJCXNpZ25hbChTSUdQSVBFLCBTSUdfREZMKTsKKwkJaWYgKHJlZGlyLT50eXBlID09IE5IRVJFKQorCQkJZnVsbF93cml0ZShwaXBbMV0sIHJlZGlyLT5uaGVyZS5kb2MtPm5hcmcudGV4dCwgbGVuKTsKKwkJZWxzZSAvKiBOWEhFUkUgKi8KKwkJCWV4cGFuZGhlcmUocmVkaXItPm5oZXJlLmRvYywgcGlwWzFdKTsKKwkJX2V4aXQoRVhJVF9TVUNDRVNTKTsKKwl9Cisgb3V0OgorCWNsb3NlKHBpcFsxXSk7CisJcmV0dXJuIHBpcFswXTsKK30KKworc3RhdGljIGludAorb3BlbnJlZGlyZWN0KHVuaW9uIG5vZGUgKnJlZGlyKQoreworCWNoYXIgKmZuYW1lOworCWludCBmOworCisJZm5hbWUgPSByZWRpci0+bmZpbGUuZXhwZm5hbWU7CisJc3dpdGNoIChyZWRpci0+bmZpbGUudHlwZSkgeworCWNhc2UgTkZST006CisJCWYgPSBvcGVuKGZuYW1lLCBPX1JET05MWSk7CisJCWlmIChmIDwgMCkKKwkJCWdvdG8gZW9wZW47CisJCWJyZWFrOworCWNhc2UgTkZST01UTzoKKwkJZiA9IG9wZW4oZm5hbWUsIE9fUkRXUnxPX0NSRUFULCAwNjY2KTsKKwkJaWYgKGYgPCAwKQorCQkJZ290byBlY3JlYXRlOworCQlicmVhazsKKwljYXNlIE5UTzoKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJY2FzZSBOVE8yOgorI2VuZGlmCisJCS8qIFRha2UgY2FyZSBvZiBub2Nsb2JiZXIgbW9kZS4gKi8KKwkJaWYgKENmbGFnKSB7CisJCQlmID0gbm9jbG9iYmVyb3BlbihmbmFtZSk7CisJCQlpZiAoZiA8IDApCisJCQkJZ290byBlY3JlYXRlOworCQkJYnJlYWs7CisJCX0KKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIE5DTE9CQkVSOgorCQlmID0gb3BlbihmbmFtZSwgT19XUk9OTFl8T19DUkVBVHxPX1RSVU5DLCAwNjY2KTsKKwkJaWYgKGYgPCAwKQorCQkJZ290byBlY3JlYXRlOworCQlicmVhazsKKwljYXNlIE5BUFBFTkQ6CisJCWYgPSBvcGVuKGZuYW1lLCBPX1dST05MWXxPX0NSRUFUfE9fQVBQRU5ELCAwNjY2KTsKKwkJaWYgKGYgPCAwKQorCQkJZ290byBlY3JlYXRlOworCQlicmVhazsKKwlkZWZhdWx0OgorI2lmIERFQlVHCisJCWFib3J0KCk7CisjZW5kaWYKKwkJLyogRmFsbCB0aHJvdWdoIHRvIGVsaW1pbmF0ZSB3YXJuaW5nLiAqLworLyogT3VyIHNpbmdsZSBjYWxsZXIgZG9lcyB0aGlzIGl0c2VsZiAqLworLy8JY2FzZSBOVE9GRDoKKy8vCWNhc2UgTkZST01GRDoKKy8vCQlmID0gLTE7CisvLwkJYnJlYWs7CisJY2FzZSBOSEVSRToKKwljYXNlIE5YSEVSRToKKwkJZiA9IG9wZW5oZXJlKHJlZGlyKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGY7CisgZWNyZWF0ZToKKwlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigiY2FuJ3QgY3JlYXRlICVzOiAlcyIsIGZuYW1lLCBlcnJtc2coZXJybm8sICJub25leGlzdGVudCBkaXJlY3RvcnkiKSk7CisgZW9wZW46CisJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoImNhbid0IG9wZW4gJXM6ICVzIiwgZm5hbWUsIGVycm1zZyhlcnJubywgIm5vIHN1Y2ggZmlsZSIpKTsKK30KKworLyoKKyAqIENvcHkgYSBmaWxlIGRlc2NyaXB0b3IgdG8gYmUgPj0gdG8uICBSZXR1cm5zIC0xCisgKiBpZiB0aGUgc291cmNlIGZpbGUgZGVzY3JpcHRvciBpcyBjbG9zZWQsIEVNUFRZIGlmIHRoZXJlIGFyZSBubyB1bnVzZWQKKyAqIGZpbGUgZGVzY3JpcHRvcnMgbGVmdC4KKyAqLworLyogMHg4MDAuLjAwOiBiaXQgdG8gc2V0IGluICJ0byIgdG8gcmVxdWVzdCBkdXAyIGluc3RlYWQgb2YgZmNudGwoRl9EVVBGRCkuCisgKiBvbGQgY29kZSB3YXMgZG9pbmcgY2xvc2UodG8pIHByaW9yIHRvIGNvcHlmZCgpIHRvIGFjaGlldmUgdGhlIHNhbWUgKi8KK2VudW0geworCUNPUFlGRF9FWEFDVCAgID0gKGludCl+KElOVF9NQVgpLAorCUNPUFlGRF9SRVNUT1JFID0gKGludCkoKHVuc2lnbmVkKUNPUFlGRF9FWEFDVCA+PiAxKSwKK307CitzdGF0aWMgaW50Citjb3B5ZmQoaW50IGZyb20sIGludCB0bykKK3sKKwlpbnQgbmV3ZmQ7CisKKwlpZiAodG8gJiBDT1BZRkRfRVhBQ1QpIHsKKwkJdG8gJj0gfkNPUFlGRF9FWEFDVDsKKwkJLyppZiAoZnJvbSAhPSB0bykqLworCQkJbmV3ZmQgPSBkdXAyKGZyb20sIHRvKTsKKwl9IGVsc2UgeworCQluZXdmZCA9IGZjbnRsKGZyb20sIEZfRFVQRkQsIHRvKTsKKwl9CisJaWYgKG5ld2ZkIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRU1GSUxFKQorCQkJcmV0dXJuIEVNUFRZOworCQkvKiBIYXBwZW5zIHdoZW4gc291cmNlIGZkIGlzIG5vdCBvcGVuOiB0cnkgImVjaG8gPiY5OSIgKi8KKwkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoIiVkOiAlbSIsIGZyb20pOworCX0KKwlyZXR1cm4gbmV3ZmQ7Cit9CisKKy8qIFN0cnVjdCBkZWYgYW5kIHZhcmlhYmxlIGFyZSBtb3ZlZCBkb3duIHRvIHRoZSBmaXJzdCB1c2FnZSBzaXRlICovCitzdHJ1Y3QgdHdvX2ZkX3QgeworCWludCBvcmlnLCBjb3B5OworfTsKK3N0cnVjdCByZWRpcnRhYiB7CisJc3RydWN0IHJlZGlydGFiICpuZXh0OworCWludCBudWxscmVkaXJzOworCWludCBwYWlyX2NvdW50OworCXN0cnVjdCB0d29fZmRfdCB0d29fZmRbXTsKK307CisjZGVmaW5lIHJlZGlybGlzdCAoR192YXIucmVkaXJsaXN0KQorCitzdGF0aWMgaW50IG5lZWRfdG9fcmVtZW1iZXIoc3RydWN0IHJlZGlydGFiICpycCwgaW50IGZkKQoreworCWludCBpOworCisJaWYgKCFycCkgLyogcmVtZW1iZXJpbmcgd2FzIG5vdCByZXF1ZXN0ZWQgKi8KKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgcnAtPnBhaXJfY291bnQ7IGkrKykgeworCQlpZiAocnAtPnR3b19mZFtpXS5vcmlnID09IGZkKSB7CisJCQkvKiBhbHJlYWR5IHJlbWVtYmVyZWQgKi8KKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAxOworfQorCisvKiAiaGlkZGVuIiBmZCBpcyBhIGZkIHVzZWQgdG8gcmVhZCBzY3JpcHRzLCBvciBhIGNvcHkgb2Ygc3VjaCAqLworc3RhdGljIGludCBpc19oaWRkZW5fZmQoc3RydWN0IHJlZGlydGFiICpycCwgaW50IGZkKQoreworCWludCBpOworCXN0cnVjdCBwYXJzZWZpbGUgKnBmOworCisJaWYgKGZkID09IC0xKQorCQlyZXR1cm4gMDsKKwkvKiBDaGVjayBvcGVuIHNjcmlwdHMnIGZkcyAqLworCXBmID0gZ19wYXJzZWZpbGU7CisJd2hpbGUgKHBmKSB7CisJCS8qIFdlIHNraXAgcGZfZmQgPT0gMCBjYXNlIGJlY2F1c2Ugb2YgdGhlIGZvbGxvd2luZyBjYXNlOgorCQkgKiAkIGFzaCAgIyBydW5uaW5nIGFzaCBpbnRlcmFjdGl2ZWx5CisJCSAqICQgLiAuL3NjcmlwdC5zaAorCQkgKiBhbmQgaW4gc2NyaXB0LnNoOiAiZXhlYyA5PiYwIi4KKwkJICogRXZlbiB0aG91Z2ggdG9wLWxldmVsIHBmX2ZkIF9pc18gMCwKKwkJICogaXQncyBzdGlsbCBvayB0byB1c2UgaXQ6ICJyZWFkIiBidWlsdGluIHVzZXMgaXQsCisJCSAqIHdoeSBzaG91bGQgd2UgY3JpcHBsZSAiZXhlYyIgYnVpbHRpbj8KKwkJICovCisJCWlmIChwZi0+cGZfZmQgPiAwICYmIGZkID09IHBmLT5wZl9mZCkgeworCQkJcmV0dXJuIDE7CisJCX0KKwkJcGYgPSBwZi0+cHJldjsKKwl9CisKKwlpZiAoIXJwKQorCQlyZXR1cm4gMDsKKwkvKiBDaGVjayBzYXZlZCBmZHMgb2YgcmVkaXJlY3RzICovCisJZmQgfD0gQ09QWUZEX1JFU1RPUkU7CisJZm9yIChpID0gMDsgaSA8IHJwLT5wYWlyX2NvdW50OyBpKyspIHsKKwkJaWYgKHJwLT50d29fZmRbaV0uY29weSA9PSBmZCkgeworCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBQcm9jZXNzIGEgbGlzdCBvZiByZWRpcmVjdGlvbiBjb21tYW5kcy4gIElmIHRoZSBSRURJUl9QVVNIIGZsYWcgaXMgc2V0LAorICogb2xkIGZpbGUgZGVzY3JpcHRvcnMgYXJlIHN0YXNoZWQgYXdheSBzbyB0aGF0IHRoZSByZWRpcmVjdGlvbiBjYW4gYmUKKyAqIHVuZG9uZSBieSBjYWxsaW5nIHBvcHJlZGlyLgorICovCisvKiBmbGFncyBwYXNzZWQgdG8gcmVkaXJlY3QgKi8KKyNkZWZpbmUgUkVESVJfUFVTSCAgICAwMSAgICAgICAgLyogc2F2ZSBwcmV2aW91cyB2YWx1ZXMgb2YgZmlsZSBkZXNjcmlwdG9ycyAqLworI2RlZmluZSBSRURJUl9TQVZFRkQyIDAzICAgICAgICAvKiBzZXQgcHJldmVycm91dCAqLworc3RhdGljIHZvaWQKK3JlZGlyZWN0KHVuaW9uIG5vZGUgKnJlZGlyLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHJlZGlydGFiICpzdjsKKwlpbnQgc3ZfcG9zOworCWludCBpOworCWludCBmZDsKKwlpbnQgbmV3ZmQ7CisJaW50IGNvcGllZF9mZDIgPSAtMTsKKworCWdfbnVsbHJlZGlycysrOworCWlmICghcmVkaXIpIHsKKwkJcmV0dXJuOworCX0KKworCXN2ID0gTlVMTDsKKwlzdl9wb3MgPSAwOworCUlOVF9PRkY7CisJaWYgKGZsYWdzICYgUkVESVJfUFVTSCkgeworCQl1bmlvbiBub2RlICp0bXAgPSByZWRpcjsKKwkJZG8geworCQkJc3ZfcG9zKys7CisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCQkJaWYgKHRtcC0+bmZpbGUudHlwZSA9PSBOVE8yKQorCQkJCXN2X3BvcysrOworI2VuZGlmCisJCQl0bXAgPSB0bXAtPm5maWxlLm5leHQ7CisJCX0gd2hpbGUgKHRtcCk7CisJCXN2ID0gY2ttYWxsb2Moc2l6ZW9mKCpzdikgKyBzdl9wb3MgKiBzaXplb2Yoc3YtPnR3b19mZFswXSkpOworCQlzdi0+bmV4dCA9IHJlZGlybGlzdDsKKwkJc3YtPnBhaXJfY291bnQgPSBzdl9wb3M7CisJCXJlZGlybGlzdCA9IHN2OworCQlzdi0+bnVsbHJlZGlycyA9IGdfbnVsbHJlZGlycyAtIDE7CisJCWdfbnVsbHJlZGlycyA9IDA7CisJCXdoaWxlIChzdl9wb3MgPiAwKSB7CisJCQlzdl9wb3MtLTsKKwkJCXN2LT50d29fZmRbc3ZfcG9zXS5vcmlnID0gc3YtPnR3b19mZFtzdl9wb3NdLmNvcHkgPSBFTVBUWTsKKwkJfQorCX0KKworCWRvIHsKKwkJaW50IHJpZ2h0X2ZkID0gLTE7CisJCWZkID0gcmVkaXItPm5maWxlLmZkOworCQlpZiAocmVkaXItPm5maWxlLnR5cGUgPT0gTlRPRkQgfHwgcmVkaXItPm5maWxlLnR5cGUgPT0gTkZST01GRCkgeworCQkJcmlnaHRfZmQgPSByZWRpci0+bmR1cC5kdXBmZDsKKwkJCS8vYmJfZXJyb3JfbXNnKCJkb2luZyAlZCA+ICVkIiwgZmQsIHJpZ2h0X2ZkKTsKKwkJCS8qIHJlZGlyZWN0IGZyb20vdG8gc2FtZSBmaWxlIGRlc2NyaXB0b3I/ICovCisJCQlpZiAocmlnaHRfZmQgPT0gZmQpCisJCQkJY29udGludWU7CisJCQkvKiAiZWNobyA+JjEwIiBhbmQgMTAgaXMgYSBmZCBvcGVuZWQgdG8gYSBzaCBzY3JpcHQ/ICovCisJCQlpZiAoaXNfaGlkZGVuX2ZkKHN2LCByaWdodF9mZCkpIHsKKwkJCQllcnJubyA9IEVCQURGOyAvKiBhcyBpZiBpdCBpcyBjbG9zZWQgKi8KKwkJCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigiJWQ6ICVtIiwgcmlnaHRfZmQpOworCQkJfQorCQkJbmV3ZmQgPSAtMTsKKwkJfSBlbHNlIHsKKwkJCW5ld2ZkID0gb3BlbnJlZGlyZWN0KHJlZGlyKTsgLyogYWx3YXlzID49IDAgKi8KKwkJCWlmIChmZCA9PSBuZXdmZCkgeworCQkJCS8qIERlc2NyaXB0b3Igd2Fzbid0IG9wZW4gYmVmb3JlIHJlZGlyZWN0LgorCQkJCSAqIE1hcmsgaXQgZm9yIGNsb3NlIGluIHRoZSBmdXR1cmUgKi8KKwkJCQlpZiAobmVlZF90b19yZW1lbWJlcihzdiwgZmQpKSB7CisJCQkJCWdvdG8gcmVtZW1iZXJfdG9fY2xvc2U7CisJCQkJfQorCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorIHJlZGlyZWN0X21vcmU6CisjZW5kaWYKKwkJaWYgKG5lZWRfdG9fcmVtZW1iZXIoc3YsIGZkKSkgeworCQkJLyogQ29weSBvbGQgZGVzY3JpcHRvciAqLworCQkJLyogQ2FyZWZ1bCB0byBub3QgYWNjaWRlbnRhbGx5ICJzYXZlIgorCQkJICogdG8gdGhlIHNhbWUgZmQgYXMgcmlnaHQgc2lkZSBmZCBpbiBOPiZNICovCisJCQlpbnQgbWluZmQgPSByaWdodF9mZCA8IDEwID8gMTAgOiByaWdodF9mZCArIDE7CisJCQlpID0gZmNudGwoZmQsIEZfRFVQRkQsIG1pbmZkKTsKKy8qIFlvdSdkIGV4cGVjdCBjb3B5IHRvIGJlIENMT0VYRUNlZC4gQ3VycmVudGx5IHRoZXNlIGV4dHJhICJzYXZlZCIgZmRzCisgKiBhcmUgY2xvc2VkIGluIHBvcHJlZGlyKCkgaW4gdGhlIGNoaWxkLCBwcmV2ZW50aW5nIHRoZW0gZnJvbSBsZWFraW5nCisgKiBpbnRvIGNoaWxkLiAocG9wcmVkaXIoKSBhbHNvIGNsZWFucyB1cCB0aGUgbWVzcyBpbiBjYXNlIG9mIGZhaWx1cmVzKQorICovCisJCQlpZiAoaSA9PSAtMSkgeworCQkJCWkgPSBlcnJubzsKKwkJCQlpZiAoaSAhPSBFQkFERikgeworCQkJCQkvKiBTdHJhbmdlIGVycm9yIChlLmcuICJ0b28gbWFueSBmaWxlcyIgRU1GSUxFPykgKi8KKwkJCQkJaWYgKG5ld2ZkID49IDApCisJCQkJCQljbG9zZShuZXdmZCk7CisJCQkJCWVycm5vID0gaTsKKwkJCQkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoIiVkOiAlbSIsIGZkKTsKKwkJCQkJLyogTk9UUkVBQ0hFRCAqLworCQkJCX0KKwkJCQkvKiBFQkFERjogaXQgaXMgbm90IG9wZW4gLSBnb29kLCByZW1lbWJlciB0byBjbG9zZSBpdCAqLworIHJlbWVtYmVyX3RvX2Nsb3NlOgorCQkJCWkgPSBDTE9TRUQ7CisJCQl9IGVsc2UgeyAvKiBmZCBpcyBvcGVuLCBzYXZlIGl0cyBjb3B5ICovCisJCQkJLyogImV4ZWMgZmQ+Ji0iIHNob3VsZCBub3QgY2xvc2UgZmRzCisJCQkJICogd2hpY2ggcG9pbnQgdG8gc2NyaXB0IGZpbGUocykuCisJCQkJICogRm9yY2UgdGhlbSB0byBiZSByZXN0b3JlZCBhZnRlcndhcmRzICovCisJCQkJaWYgKGlzX2hpZGRlbl9mZChzdiwgZmQpKQorCQkJCQlpIHw9IENPUFlGRF9SRVNUT1JFOworCQkJfQorCQkJaWYgKGZkID09IDIpCisJCQkJY29waWVkX2ZkMiA9IGk7CisJCQlzdi0+dHdvX2ZkW3N2X3Bvc10ub3JpZyA9IGZkOworCQkJc3YtPnR3b19mZFtzdl9wb3NdLmNvcHkgPSBpOworCQkJc3ZfcG9zKys7CisJCX0KKwkJaWYgKG5ld2ZkIDwgMCkgeworCQkJLyogTlRPRkQvTkZST01GRDogY29weSByZWRpci0+bmR1cC5kdXBmZCB0byBmZCAqLworCQkJaWYgKHJlZGlyLT5uZHVwLmR1cGZkIDwgMCkgeyAvKiAiZmQ+Ji0iICovCisJCQkJLyogRG9uJ3Qgd2FudCB0byB0cmlnZ2VyIGRlYnVnZ2luZyAqLworCQkJCWlmIChmZCAhPSAtMSkKKwkJCQkJY2xvc2UoZmQpOworCQkJfSBlbHNlIHsKKwkJCQljb3B5ZmQocmVkaXItPm5kdXAuZHVwZmQsIGZkIHwgQ09QWUZEX0VYQUNUKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChmZCAhPSBuZXdmZCkgeyAvKiBtb3ZlIG5ld2ZkIHRvIGZkICovCisJCQljb3B5ZmQobmV3ZmQsIGZkIHwgQ09QWUZEX0VYQUNUKTsKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJCQlpZiAoIShyZWRpci0+bmZpbGUudHlwZSA9PSBOVE8yICYmIGZkID09IDIpKQorI2VuZGlmCisJCQkJY2xvc2UobmV3ZmQpOworCQl9CisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCQlpZiAocmVkaXItPm5maWxlLnR5cGUgPT0gTlRPMiAmJiBmZCA9PSAxKSB7CisJCQkvKiBXZSBhbHJlYWR5IHJlZGlyZWN0ZWQgaXQgdG8gZmQgMSwgbm93IGNvcHkgaXQgdG8gMiAqLworCQkJbmV3ZmQgPSAxOworCQkJZmQgPSAyOworCQkJZ290byByZWRpcmVjdF9tb3JlOworCQl9CisjZW5kaWYKKwl9IHdoaWxlICgocmVkaXIgPSByZWRpci0+bmZpbGUubmV4dCkgIT0gTlVMTCk7CisKKwlJTlRfT047CisJaWYgKChmbGFncyAmIFJFRElSX1NBVkVGRDIpICYmIGNvcGllZF9mZDIgPj0gMCkKKwkJcHJldmVycm91dF9mZCA9IGNvcGllZF9mZDI7Cit9CisKKy8qCisgKiBVbmRvIHRoZSBlZmZlY3RzIG9mIHRoZSBsYXN0IHJlZGlyZWN0aW9uLgorICovCitzdGF0aWMgdm9pZAorcG9wcmVkaXIoaW50IGRyb3AsIGludCByZXN0b3JlKQoreworCXN0cnVjdCByZWRpcnRhYiAqcnA7CisJaW50IGk7CisKKwlpZiAoLS1nX251bGxyZWRpcnMgPj0gMCkKKwkJcmV0dXJuOworCUlOVF9PRkY7CisJcnAgPSByZWRpcmxpc3Q7CisJZm9yIChpID0gMDsgaSA8IHJwLT5wYWlyX2NvdW50OyBpKyspIHsKKwkJaW50IGZkID0gcnAtPnR3b19mZFtpXS5vcmlnOworCQlpbnQgY29weSA9IHJwLT50d29fZmRbaV0uY29weTsKKwkJaWYgKGNvcHkgPT0gQ0xPU0VEKSB7CisJCQlpZiAoIWRyb3ApCisJCQkJY2xvc2UoZmQpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNvcHkgIT0gRU1QVFkpIHsKKwkJCWlmICghZHJvcCB8fCAocmVzdG9yZSAmJiAoY29weSAmIENPUFlGRF9SRVNUT1JFKSkpIHsKKwkJCQljb3B5ICY9IH5DT1BZRkRfUkVTVE9SRTsKKwkJCQkvKmNsb3NlKGZkKTsqLworCQkJCWNvcHlmZChjb3B5LCBmZCB8IENPUFlGRF9FWEFDVCk7CisJCQl9CisJCQljbG9zZShjb3B5ICYgfkNPUFlGRF9SRVNUT1JFKTsKKwkJfQorCX0KKwlyZWRpcmxpc3QgPSBycC0+bmV4dDsKKwlnX251bGxyZWRpcnMgPSBycC0+bnVsbHJlZGlyczsKKwlmcmVlKHJwKTsKKwlJTlRfT047Cit9CisKKy8qCisgKiBVbmRvIGFsbCByZWRpcmVjdGlvbnMuICBDYWxsZWQgb24gZXJyb3Igb3IgaW50ZXJydXB0LgorICovCisKKy8qCisgKiBEaXNjYXJkIGFsbCBzYXZlZCBmaWxlIGRlc2NyaXB0b3JzLgorICovCitzdGF0aWMgdm9pZAorY2xlYXJyZWRpcihpbnQgZHJvcCkKK3sKKwlmb3IgKDs7KSB7CisJCWdfbnVsbHJlZGlycyA9IDA7CisJCWlmICghcmVkaXJsaXN0KQorCQkJYnJlYWs7CisJCXBvcHJlZGlyKGRyb3AsIC8qcmVzdG9yZToqLyAwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK3JlZGlyZWN0c2FmZSh1bmlvbiBub2RlICpyZWRpciwgaW50IGZsYWdzKQoreworCWludCBlcnI7CisJdm9sYXRpbGUgaW50IHNhdmVpbnQ7CisJc3RydWN0IGptcGxvYyAqdm9sYXRpbGUgc2F2ZWhhbmRsZXIgPSBleGNlcHRpb25faGFuZGxlcjsKKwlzdHJ1Y3Qgam1wbG9jIGptcGxvYzsKKworCVNBVkVfSU5UKHNhdmVpbnQpOworCS8qICJlY2hvIDk+L2Rldi9udWxsOyBlY2hvID4mOTsgZWNobyByZXN1bHQ6ICQ/IiAtIHJlc3VsdCBzaG91bGQgYmUgMSwgbm90IDIhICovCisJZXJyID0gc2V0am1wKGptcGxvYy5sb2MpOyAvLyBodWg/PyB3YXMgPSBzZXRqbXAoam1wbG9jLmxvYykgKiAyOworCWlmICghZXJyKSB7CisJCWV4Y2VwdGlvbl9oYW5kbGVyID0gJmptcGxvYzsKKwkJcmVkaXJlY3QocmVkaXIsIGZsYWdzKTsKKwl9CisJZXhjZXB0aW9uX2hhbmRsZXIgPSBzYXZlaGFuZGxlcjsKKwlpZiAoZXJyICYmIGV4Y2VwdGlvbl90eXBlICE9IEVYRVJST1IpCisJCWxvbmdqbXAoZXhjZXB0aW9uX2hhbmRsZXItPmxvYywgMSk7CisJUkVTVE9SRV9JTlQoc2F2ZWludCk7CisJcmV0dXJuIGVycjsKK30KKworCisvKiA9PT09PT09PT09PT0gUm91dGluZXMgdG8gZXhwYW5kIGFyZ3VtZW50cyB0byBjb21tYW5kcworICoKKyAqIFdlIGhhdmUgdG8gZGVhbCB3aXRoIGJhY2txdW90ZXMsIHNoZWxsIHZhcmlhYmxlcywgYW5kIGZpbGUgbWV0YWNoYXJhY3RlcnMuCisgKi8KKworI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKK3N0YXRpYyBhcml0aF90Cithc2hfYXJpdGgoY29uc3QgY2hhciAqcykKK3sKKwlhcml0aF9zdGF0ZV90IG1hdGhfc3RhdGU7CisJYXJpdGhfdCByZXN1bHQ7CisKKwltYXRoX3N0YXRlLmxvb2t1cHZhciA9IGxvb2t1cHZhcjsKKwltYXRoX3N0YXRlLnNldHZhciAgICA9IHNldHZhcjA7CisJLy9tYXRoX3N0YXRlLmVuZG9mbmFtZSA9IGVuZG9mbmFtZTsKKworCUlOVF9PRkY7CisJcmVzdWx0ID0gYXJpdGgoJm1hdGhfc3RhdGUsIHMpOworCWlmIChtYXRoX3N0YXRlLmVycm1zZykKKwkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IobWF0aF9zdGF0ZS5lcnJtc2cpOworCUlOVF9PTjsKKworCXJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKworLyoKKyAqIGV4cGFuZGFyZyBmbGFncworICovCisjZGVmaW5lIEVYUF9GVUxMICAgICAgICAweDEgICAgIC8qIHBlcmZvcm0gd29yZCBzcGxpdHRpbmcgJiBmaWxlIGdsb2JiaW5nICovCisjZGVmaW5lIEVYUF9USUxERSAgICAgICAweDIgICAgIC8qIGRvIG5vcm1hbCB0aWxkZSBleHBhbnNpb24gKi8KKyNkZWZpbmUgRVhQX1ZBUlRJTERFICAgIDB4NCAgICAgLyogZXhwYW5kIHRpbGRlcyBpbiBhbiBhc3NpZ25tZW50ICovCisjZGVmaW5lIEVYUF9SRURJUiAgICAgICAweDggICAgIC8qIGZpbGUgZ2xvYiBmb3IgYSByZWRpcmVjdGlvbiAoMSBtYXRjaCBvbmx5KSAqLworI2RlZmluZSBFWFBfQ0FTRSAgICAgICAgMHgxMCAgICAvKiBrZWVwcyBxdW90ZXMgYXJvdW5kIGZvciBDQVNFIHBhdHRlcm4gKi8KKyNkZWZpbmUgRVhQX1FQQVQgICAgICAgIDB4MjAgICAgLyogcGF0dGVybiBpbiBxdW90ZWQgcGFyYW1ldGVyIGV4cGFuc2lvbiAqLworI2RlZmluZSBFWFBfVkFSVElMREUyICAgMHg0MCAgICAvKiBleHBhbmQgdGlsZGVzIGFmdGVyIGNvbG9ucyBvbmx5ICovCisjZGVmaW5lIEVYUF9XT1JEICAgICAgICAweDgwICAgIC8qIGV4cGFuZCB3b3JkIGluIHBhcmFtZXRlciBleHBhbnNpb24gKi8KKyNkZWZpbmUgRVhQX1FVT1RFRCAgICAgIDB4MTAwICAgLyogZXhwYW5kIHdvcmQgaW4gZG91YmxlIHF1b3RlcyAqLworLyoKKyAqIHJtZXNjYXBlKCkgZmxhZ3MKKyAqLworI2RlZmluZSBSTUVTQ0FQRV9BTExPQyAgMHgxICAgICAvKiBBbGxvY2F0ZSBhIG5ldyBzdHJpbmcgKi8KKyNkZWZpbmUgUk1FU0NBUEVfR0xPQiAgIDB4MiAgICAgLyogQWRkIGJhY2tzbGFzaGVzIGZvciBnbG9iICovCisjZGVmaW5lIFJNRVNDQVBFX0dST1cgICAweDggICAgIC8qIEdyb3cgc3RyaW5ncyBpbnN0ZWFkIG9mIHN0YWxsb2MgKi8KKyNkZWZpbmUgUk1FU0NBUEVfSEVBUCAgIDB4MTAgICAgLyogTWFsbG9jIHN0cmluZ3MgaW5zdGVhZCBvZiBzdGFsbG9jICovCisjZGVmaW5lIFJNRVNDQVBFX1NMQVNIICAweDIwICAgIC8qIFN0b3AgZ2xvYmJpbmcgYWZ0ZXIgc2xhc2ggKi8KKworLyogQWRkIENUTEVTQyB3aGVuIG5lY2Vzc2FyeS4gKi8KKyNkZWZpbmUgUVVPVEVTX0VTQyAgICAgKEVYUF9GVUxMIHwgRVhQX0NBU0UgfCBFWFBfUVBBVCB8IEVYUF9SRURJUikKKy8qIERvIG5vdCBza2lwIE5VTCBjaGFyYWN0ZXJzLiAqLworI2RlZmluZSBRVU9URVNfS0VFUE5VTCBFWFBfVElMREUKKworLyoKKyAqIFN0cnVjdHVyZSBzcGVjaWZ5aW5nIHdoaWNoIHBhcnRzIG9mIHRoZSBzdHJpbmcgc2hvdWxkIGJlIHNlYXJjaGVkCisgKiBmb3IgSUZTIGNoYXJhY3RlcnMuCisgKi8KK3N0cnVjdCBpZnNyZWdpb24geworCXN0cnVjdCBpZnNyZWdpb24gKm5leHQ7IC8qIG5leHQgcmVnaW9uIGluIGxpc3QgKi8KKwlpbnQgYmVnb2ZmOyAgICAgICAgICAgICAvKiBvZmZzZXQgb2Ygc3RhcnQgb2YgcmVnaW9uICovCisJaW50IGVuZG9mZjsgICAgICAgICAgICAgLyogb2Zmc2V0IG9mIGVuZCBvZiByZWdpb24gKi8KKwlpbnQgbnVsb25seTsgICAgICAgICAgICAvKiBzZWFyY2ggZm9yIG51bCBieXRlcyBvbmx5ICovCit9OworCitzdHJ1Y3QgYXJnbGlzdCB7CisJc3RydWN0IHN0cmxpc3QgKmxpc3Q7CisJc3RydWN0IHN0cmxpc3QgKipsYXN0cDsKK307CisKKy8qIG91dHB1dCBvZiBjdXJyZW50IHN0cmluZyAqLworc3RhdGljIGNoYXIgKmV4cGRlc3Q7CisvKiBsaXN0IG9mIGJhY2sgcXVvdGUgZXhwcmVzc2lvbnMgKi8KK3N0YXRpYyBzdHJ1Y3Qgbm9kZWxpc3QgKmFyZ2JhY2txOworLyogZmlyc3Qgc3RydWN0IGluIGxpc3Qgb2YgaWZzIHJlZ2lvbnMgKi8KK3N0YXRpYyBzdHJ1Y3QgaWZzcmVnaW9uIGlmc2ZpcnN0OworLyogbGFzdCBzdHJ1Y3QgaW4gbGlzdCAqLworc3RhdGljIHN0cnVjdCBpZnNyZWdpb24gKmlmc2xhc3RwOworLyogaG9sZHMgZXhwYW5kZWQgYXJnIGxpc3QgKi8KK3N0YXRpYyBzdHJ1Y3QgYXJnbGlzdCBleHBhcmc7CisKKy8qCisgKiBPdXIgb3duIGl0b2EoKS4KKyAqLworI2lmICFFTkFCTEVfU0hfTUFUSF9TVVBQT1JUCisvKiBjdnRudW0oKSBpcyB1c2VkIGV2ZW4gaWYgbWF0aCBzdXBwb3J0IGlzIG9mZiAodG8gcHJlcGFyZSAkPyB2YWx1ZXMgYW5kIHN1Y2gpICovCit0eXBlZGVmIGxvbmcgYXJpdGhfdDsKKyMgZGVmaW5lIEFSSVRIX0ZNVCAiJWxkIgorI2VuZGlmCitzdGF0aWMgaW50CitjdnRudW0oYXJpdGhfdCBudW0pCit7CisJaW50IGxlbjsKKworCWV4cGRlc3QgPSBtYWtlc3Ryc3BhY2Uoc2l6ZW9mKGFyaXRoX3QpKjMgKyAyLCBleHBkZXN0KTsKKwlsZW4gPSBmbXRzdHIoZXhwZGVzdCwgc2l6ZW9mKGFyaXRoX3QpKjMgKyAyLCBBUklUSF9GTVQsIG51bSk7CisJU1RBREpVU1QobGVuLCBleHBkZXN0KTsKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgc2l6ZV90Citlc2NsZW4oY29uc3QgY2hhciAqc3RhcnQsIGNvbnN0IGNoYXIgKnApCit7CisJc2l6ZV90IGVzYyA9IDA7CisKKwl3aGlsZSAocCA+IHN0YXJ0ICYmICh1bnNpZ25lZCBjaGFyKSotLXAgPT0gQ1RMRVNDKSB7CisJCWVzYysrOworCX0KKwlyZXR1cm4gZXNjOworfQorCisvKgorICogUmVtb3ZlIGFueSBDVExFU0MgY2hhcmFjdGVycyBmcm9tIGEgc3RyaW5nLgorICovCitzdGF0aWMgY2hhciAqCitybWVzY2FwZXMoY2hhciAqc3RyLCBpbnQgZmxhZykKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBxY2hhcnNbXSBBTElHTjEgPSB7CisJCUlGX0FTSF9CQVNIX0NPTVBBVCgnLycsKSBDVExFU0MsIENUTFFVT1RFTUFSSywgJ1wwJyB9OworCisJY2hhciAqcCwgKnEsICpyOworCXVuc2lnbmVkIGlucXVvdGVzOworCXVuc2lnbmVkIHByb3RlY3RfYWdhaW5zdF9nbG9iOworCXVuc2lnbmVkIGdsb2JiaW5nOworCUlGX0FTSF9CQVNIX0NPTVBBVCh1bnNpZ25lZCBzbGFzaCA9IGZsYWcgJiBSTUVTQ0FQRV9TTEFTSDspCisKKwlwID0gc3RycGJyayhzdHIsIHFjaGFycyBJRl9BU0hfQkFTSF9DT01QQVQoKyAhc2xhc2gpKTsKKwlpZiAoIXApCisJCXJldHVybiBzdHI7CisKKwlxID0gcDsKKwlyID0gc3RyOworCWlmIChmbGFnICYgUk1FU0NBUEVfQUxMT0MpIHsKKwkJc2l6ZV90IGxlbiA9IHAgLSBzdHI7CisJCXNpemVfdCBmdWxsbGVuID0gbGVuICsgc3RybGVuKHApICsgMTsKKworCQlpZiAoZmxhZyAmIFJNRVNDQVBFX0dST1cpIHsKKwkJCWludCBzdHJsb2MgPSBzdHIgLSAoY2hhciAqKXN0YWNrYmxvY2soKTsKKwkJCXIgPSBtYWtlc3Ryc3BhY2UoZnVsbGxlbiwgZXhwZGVzdCk7CisJCQkvKiBwIGFuZCBzdHIgbWF5IGJlIGludmFsaWRhdGVkIGJ5IG1ha2VzdHJzcGFjZSAqLworCQkJc3RyID0gKGNoYXIgKilzdGFja2Jsb2NrKCkgKyBzdHJsb2M7CisJCQlwID0gc3RyICsgbGVuOworCQl9IGVsc2UgaWYgKGZsYWcgJiBSTUVTQ0FQRV9IRUFQKSB7CisJCQlyID0gY2ttYWxsb2MoZnVsbGxlbik7CisJCX0gZWxzZSB7CisJCQlyID0gc3RhbGxvYyhmdWxsbGVuKTsKKwkJfQorCQlxID0gcjsKKwkJaWYgKGxlbiA+IDApIHsKKwkJCXEgPSAoY2hhciAqKW1lbWNweShxLCBzdHIsIGxlbikgKyBsZW47CisJCX0KKwl9CisKKwlpbnF1b3RlcyA9IDA7CisJZ2xvYmJpbmcgPSBmbGFnICYgUk1FU0NBUEVfR0xPQjsKKwlwcm90ZWN0X2FnYWluc3RfZ2xvYiA9IGdsb2JiaW5nOworCXdoaWxlICgqcCkgeworCQlpZiAoKHVuc2lnbmVkIGNoYXIpKnAgPT0gQ1RMUVVPVEVNQVJLKSB7CisvLyBOb3RlOiBib3RoIGlucXVvdGVzIGFuZCBwcm90ZWN0X2FnYWluc3RfZ2xvYiBvbmx5IGFmZmVjdCB3aGV0aGVyCisvLyBDVExFU0MsPGNoPiBnZXRzIGNvbnZlcnRlZCB0byA8Y2g+IG9yIHRvIFw8Y2g+CisJCQlpbnF1b3RlcyA9IH5pbnF1b3RlczsKKwkJCXArKzsKKwkJCXByb3RlY3RfYWdhaW5zdF9nbG9iID0gZ2xvYmJpbmc7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKHVuc2lnbmVkIGNoYXIpKnAgPT0gQ1RMRVNDKSB7CisJCQlwKys7CisJCQlpZiAocHJvdGVjdF9hZ2FpbnN0X2dsb2IpIHsKKwkJCQkqcSsrID0gJ1xcJzsKKwkJCX0KKwkJfSBlbHNlIGlmICgqcCA9PSAnXFwnICYmICFpbnF1b3RlcykgeworCQkJLyogbmFrZWQgYmFjayBzbGFzaCAqLworCQkJcHJvdGVjdF9hZ2FpbnN0X2dsb2IgPSAwOworCQkJZ290byBjb3B5OworCQl9CisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCQllbHNlIGlmICgqcCA9PSAnLycgJiYgc2xhc2gpIHsKKwkJCS8qIHN0b3AgaGFuZGxpbmcgZ2xvYmJpbmcgYW5kIG1hcmsgbG9jYXRpb24gb2Ygc2xhc2ggKi8KKwkJCWdsb2JiaW5nID0gc2xhc2ggPSAwOworCQkJKnAgPSBDVExFU0M7CisJCX0KKyNlbmRpZgorCQlwcm90ZWN0X2FnYWluc3RfZ2xvYiA9IGdsb2JiaW5nOworIGNvcHk6CisJCSpxKysgPSAqcCsrOworCX0KKwkqcSA9ICdcMCc7CisJaWYgKGZsYWcgJiBSTUVTQ0FQRV9HUk9XKSB7CisJCWV4cGRlc3QgPSByOworCQlTVEFESlVTVChxIC0gciArIDEsIGV4cGRlc3QpOworCX0KKwlyZXR1cm4gcjsKK30KKyNkZWZpbmUgcG1hdGNoKGEsIGIpICFmbm1hdGNoKChhKSwgKGIpLCAwKQorCisvKgorICogUHJlcGFyZSBhIHBhdHRlcm4gZm9yIGEgZXhwbWV0YSAoaW50ZXJuYWwgZ2xvYigzKSkgY2FsbC4KKyAqCisgKiBSZXR1cm5zIGFuIHN0YWxsb2NlZCBzdHJpbmcuCisgKi8KK3N0YXRpYyBjaGFyICoKK3ByZWdsb2IoY29uc3QgY2hhciAqcGF0dGVybiwgaW50IGZsYWcpCit7CisJcmV0dXJuIHJtZXNjYXBlcygoY2hhciAqKXBhdHRlcm4sIGZsYWcgfCBSTUVTQ0FQRV9HTE9CKTsKK30KKworLyoKKyAqIFB1dCBhIHN0cmluZyBvbiB0aGUgc3RhY2suCisgKi8KK3N0YXRpYyB2b2lkCittZW10b2Rlc3QoY29uc3QgY2hhciAqcCwgc2l6ZV90IGxlbiwgaW50IHN5bnRheCwgaW50IHF1b3RlcykKK3sKKwljaGFyICpxOworCisJaWYgKCFsZW4pCisJCXJldHVybjsKKworCXEgPSBtYWtlc3Ryc3BhY2UoKHF1b3RlcyAmIFFVT1RFU19FU0MpID8gbGVuICogMiA6IGxlbiwgZXhwZGVzdCk7CisKKwlkbyB7CisJCXVuc2lnbmVkIGNoYXIgYyA9ICpwKys7CisJCWlmIChjKSB7CisJCQlpbnQgbiA9IFNJVChjLCBzeW50YXgpOworCQkJaWYgKChxdW90ZXMgJiBRVU9URVNfRVNDKSAmJgorCQkJCQkoKG4gPT0gQ0NUTCkgfHwKKwkJCQkJKCgocXVvdGVzICYgRVhQX0ZVTEwpIHx8IHN5bnRheCAhPSBCQVNFU1lOVEFYKSAmJgorCQkJCQluID09IENCQUNLKSkpCisJCQkJVVNUUFVUQyhDVExFU0MsIHEpOworCQl9IGVsc2UgaWYgKCEocXVvdGVzICYgUVVPVEVTX0tFRVBOVUwpKQorCQkJY29udGludWU7CisJCVVTVFBVVEMoYywgcSk7CisJfSB3aGlsZSAoLS1sZW4pOworCisJZXhwZGVzdCA9IHE7Cit9CisKK3N0YXRpYyBzaXplX3QKK3N0cnRvZGVzdChjb25zdCBjaGFyICpwLCBpbnQgc3ludGF4LCBpbnQgcXVvdGVzKQoreworCXNpemVfdCBsZW4gPSBzdHJsZW4ocCk7CisJbWVtdG9kZXN0KHAsIGxlbiwgc3ludGF4LCBxdW90ZXMpOworCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBSZWNvcmQgdGhlIGZhY3QgdGhhdCB3ZSBoYXZlIHRvIHNjYW4gdGhpcyByZWdpb24gb2YgdGhlCisgKiBzdHJpbmcgZm9yIElGUyBjaGFyYWN0ZXJzLgorICovCitzdGF0aWMgdm9pZAorcmVjb3JkcmVnaW9uKGludCBzdGFydCwgaW50IGVuZCwgaW50IG51bG9ubHkpCit7CisJc3RydWN0IGlmc3JlZ2lvbiAqaWZzcDsKKworCWlmIChpZnNsYXN0cCA9PSBOVUxMKSB7CisJCWlmc3AgPSAmaWZzZmlyc3Q7CisJfSBlbHNlIHsKKwkJSU5UX09GRjsKKwkJaWZzcCA9IGNremFsbG9jKHNpemVvZigqaWZzcCkpOworCQkvKmlmc3AtPm5leHQgPSBOVUxMOyAtIGNremFsbG9jIGRpZCBpdCAqLworCQlpZnNsYXN0cC0+bmV4dCA9IGlmc3A7CisJCUlOVF9PTjsKKwl9CisJaWZzbGFzdHAgPSBpZnNwOworCWlmc2xhc3RwLT5iZWdvZmYgPSBzdGFydDsKKwlpZnNsYXN0cC0+ZW5kb2ZmID0gZW5kOworCWlmc2xhc3RwLT5udWxvbmx5ID0gbnVsb25seTsKK30KKworc3RhdGljIHZvaWQKK3JlbW92ZXJlY29yZHJlZ2lvbnMoaW50IGVuZG9mZikKK3sKKwlpZiAoaWZzbGFzdHAgPT0gTlVMTCkKKwkJcmV0dXJuOworCisJaWYgKGlmc2ZpcnN0LmVuZG9mZiA+IGVuZG9mZikgeworCQl3aGlsZSAoaWZzZmlyc3QubmV4dCkgeworCQkJc3RydWN0IGlmc3JlZ2lvbiAqaWZzcDsKKwkJCUlOVF9PRkY7CisJCQlpZnNwID0gaWZzZmlyc3QubmV4dC0+bmV4dDsKKwkJCWZyZWUoaWZzZmlyc3QubmV4dCk7CisJCQlpZnNmaXJzdC5uZXh0ID0gaWZzcDsKKwkJCUlOVF9PTjsKKwkJfQorCQlpZiAoaWZzZmlyc3QuYmVnb2ZmID4gZW5kb2ZmKSB7CisJCQlpZnNsYXN0cCA9IE5VTEw7CisJCX0gZWxzZSB7CisJCQlpZnNsYXN0cCA9ICZpZnNmaXJzdDsKKwkJCWlmc2ZpcnN0LmVuZG9mZiA9IGVuZG9mZjsKKwkJfQorCQlyZXR1cm47CisJfQorCisJaWZzbGFzdHAgPSAmaWZzZmlyc3Q7CisJd2hpbGUgKGlmc2xhc3RwLT5uZXh0ICYmIGlmc2xhc3RwLT5uZXh0LT5iZWdvZmYgPCBlbmRvZmYpCisJCWlmc2xhc3RwID0gaWZzbGFzdHAtPm5leHQ7CisJd2hpbGUgKGlmc2xhc3RwLT5uZXh0KSB7CisJCXN0cnVjdCBpZnNyZWdpb24gKmlmc3A7CisJCUlOVF9PRkY7CisJCWlmc3AgPSBpZnNsYXN0cC0+bmV4dC0+bmV4dDsKKwkJZnJlZShpZnNsYXN0cC0+bmV4dCk7CisJCWlmc2xhc3RwLT5uZXh0ID0gaWZzcDsKKwkJSU5UX09OOworCX0KKwlpZiAoaWZzbGFzdHAtPmVuZG9mZiA+IGVuZG9mZikKKwkJaWZzbGFzdHAtPmVuZG9mZiA9IGVuZG9mZjsKK30KKworc3RhdGljIGNoYXIgKgorZXhwdGlsZGUoY2hhciAqc3RhcnRwLCBjaGFyICpwLCBpbnQgZmxhZ3MpCit7CisJdW5zaWduZWQgY2hhciBjOworCWNoYXIgKm5hbWU7CisJc3RydWN0IHBhc3N3ZCAqcHc7CisJY29uc3QgY2hhciAqaG9tZTsKKwlpbnQgcXVvdGVzID0gZmxhZ3MgJiBRVU9URVNfRVNDOworCisJbmFtZSA9IHAgKyAxOworCisJd2hpbGUgKChjID0gKisrcCkgIT0gJ1wwJykgeworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSBDVExFU0M6CisJCQlyZXR1cm4gc3RhcnRwOworCQljYXNlIENUTFFVT1RFTUFSSzoKKwkJCXJldHVybiBzdGFydHA7CisJCWNhc2UgJzonOgorCQkJaWYgKGZsYWdzICYgRVhQX1ZBUlRJTERFKQorCQkJCWdvdG8gZG9uZTsKKwkJCWJyZWFrOworCQljYXNlICcvJzoKKwkJY2FzZSBDVExFTkRWQVI6CisJCQlnb3RvIGRvbmU7CisJCX0KKwl9CisgZG9uZToKKwkqcCA9ICdcMCc7CisJaWYgKCpuYW1lID09ICdcMCcpIHsKKwkJaG9tZSA9IGxvb2t1cHZhcigiSE9NRSIpOworCX0gZWxzZSB7CisJCXB3ID0gZ2V0cHduYW0obmFtZSk7CisJCWlmIChwdyA9PSBOVUxMKQorCQkJZ290byBsb3NlOworCQlob21lID0gcHctPnB3X2RpcjsKKwl9CisJaWYgKCFob21lIHx8ICEqaG9tZSkKKwkJZ290byBsb3NlOworCSpwID0gYzsKKwlzdHJ0b2Rlc3QoaG9tZSwgU1FTWU5UQVgsIHF1b3Rlcyk7CisJcmV0dXJuIHA7CisgbG9zZToKKwkqcCA9IGM7CisJcmV0dXJuIHN0YXJ0cDsKK30KKworLyoKKyAqIEV4ZWN1dGUgYSBjb21tYW5kIGluc2lkZSBiYWNrIHF1b3Rlcy4gIElmIGl0J3MgYSBidWlsdGluIGNvbW1hbmQsIHdlCisgKiB3YW50IHRvIHNhdmUgaXRzIG91dHB1dCBpbiBhIGJsb2NrIG9idGFpbmVkIGZyb20gbWFsbG9jLiAgT3RoZXJ3aXNlCisgKiB3ZSBmb3JrIG9mZiBhIHN1YnByb2Nlc3MgYW5kIGdldCB0aGUgb3V0cHV0IG9mIHRoZSBjb21tYW5kIHZpYSBhIHBpcGUuCisgKiBTaG91bGQgYmUgY2FsbGVkIHdpdGggaW50ZXJydXB0cyBvZmYuCisgKi8KK3N0cnVjdCBiYWNrY21kIHsgICAgICAgICAgICAgICAgLyogcmVzdWx0IG9mIGV2YWxiYWNrY21kICovCisJaW50IGZkOyAgICAgICAgICAgICAgICAgLyogZmlsZSBkZXNjcmlwdG9yIHRvIHJlYWQgZnJvbSAqLworCWludCBubGVmdDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjaGFycyBpbiBidWZmZXIgKi8KKwljaGFyICpidWY7ICAgICAgICAgICAgICAvKiBidWZmZXIgKi8KKwlzdHJ1Y3Qgam9iICpqcDsgICAgICAgICAvKiBqb2Igc3RydWN0dXJlIGZvciBjb21tYW5kICovCit9OworCisvKiBUaGVzZSBmb3J3YXJkIGRlY2xzIGFyZSBuZWVkZWQgdG8gdXNlICJldmFsIiBjb2RlIGZvciBiYWNrdGlja3MgaGFuZGxpbmc6ICovCitzdGF0aWMgdWludDhfdCBiYWNrX2V4aXRzdGF0dXM7IC8qIGV4aXQgc3RhdHVzIG9mIGJhY2txdW90ZWQgY29tbWFuZCAqLworI2RlZmluZSBFVl9FWElUIDAxICAgICAgICAgICAgICAvKiBleGl0IGFmdGVyIGV2YWx1YXRpbmcgdHJlZSAqLworc3RhdGljIHZvaWQgZXZhbHRyZWUodW5pb24gbm9kZSAqLCBpbnQpOworCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMKK2V2YWxiYWNrY21kKHVuaW9uIG5vZGUgKm4sIHN0cnVjdCBiYWNrY21kICpyZXN1bHQpCit7CisJaW50IHNhdmVoZXJlZmQ7CisKKwlyZXN1bHQtPmZkID0gLTE7CisJcmVzdWx0LT5idWYgPSBOVUxMOworCXJlc3VsdC0+bmxlZnQgPSAwOworCXJlc3VsdC0+anAgPSBOVUxMOworCWlmIChuID09IE5VTEwpCisJCWdvdG8gb3V0OworCisJc2F2ZWhlcmVmZCA9IGhlcmVmZDsKKwloZXJlZmQgPSAtMTsKKworCXsKKwkJaW50IHBpcFsyXTsKKwkJc3RydWN0IGpvYiAqanA7CisKKwkJaWYgKHBpcGUocGlwKSA8IDApCisJCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigicGlwZSBjYWxsIGZhaWxlZCIpOworCQlqcCA9IG1ha2Vqb2IoLypuLCovIDEpOworCQlpZiAoZm9ya3NoZWxsKGpwLCBuLCBGT1JLX05PSk9CKSA9PSAwKSB7CisJCQlGT1JDRV9JTlRfT047CisJCQljbG9zZShwaXBbMF0pOworCQkJaWYgKHBpcFsxXSAhPSAxKSB7CisJCQkJLypjbG9zZSgxKTsqLworCQkJCWNvcHlmZChwaXBbMV0sIDEgfCBDT1BZRkRfRVhBQ1QpOworCQkJCWNsb3NlKHBpcFsxXSk7CisJCQl9CisJCQllZmxhZyA9IDA7CisJCQlldmFsdHJlZShuLCBFVl9FWElUKTsgLyogYWN0dWFsbHkgZXZhbHRyZWVuci4uLiAqLworCQkJLyogTk9UUkVBQ0hFRCAqLworCQl9CisJCWNsb3NlKHBpcFsxXSk7CisJCXJlc3VsdC0+ZmQgPSBwaXBbMF07CisJCXJlc3VsdC0+anAgPSBqcDsKKwl9CisJaGVyZWZkID0gc2F2ZWhlcmVmZDsKKyBvdXQ6CisJVFJBQ0UoKCJldmFsYmFja2NtZCBkb25lOiBmZD0lZCBidWY9MHgleCBubGVmdD0lZCBqcD0weCV4XG4iLAorCQlyZXN1bHQtPmZkLCByZXN1bHQtPmJ1ZiwgcmVzdWx0LT5ubGVmdCwgcmVzdWx0LT5qcCkpOworfQorCisvKgorICogRXhwYW5kIHN0dWZmIGluIGJhY2t3YXJkcyBxdW90ZXMuCisgKi8KK3N0YXRpYyB2b2lkCitleHBiYWNrcSh1bmlvbiBub2RlICpjbWQsIGludCBmbGFnKQoreworCXN0cnVjdCBiYWNrY21kIGluOworCWludCBpOworCWNoYXIgYnVmWzEyOF07CisJY2hhciAqcDsKKwljaGFyICpkZXN0OworCWludCBzdGFydGxvYzsKKwlpbnQgc3ludGF4ID0gZmxhZyAmIEVYUF9RVU9URUQgPyBEUVNZTlRBWCA6IEJBU0VTWU5UQVg7CisJc3RydWN0IHN0YWNrbWFyayBzbWFyazsKKworCUlOVF9PRkY7CisJc2V0c3RhY2ttYXJrKCZzbWFyayk7CisJZGVzdCA9IGV4cGRlc3Q7CisJc3RhcnRsb2MgPSBkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCk7CisJZ3JhYnN0YWNrc3RyKGRlc3QpOworCWV2YWxiYWNrY21kKGNtZCwgJmluKTsKKwlwb3BzdGFja21hcmsoJnNtYXJrKTsKKworCXAgPSBpbi5idWY7CisJaSA9IGluLm5sZWZ0OworCWlmIChpID09IDApCisJCWdvdG8gcmVhZDsKKwlmb3IgKDs7KSB7CisJCW1lbXRvZGVzdChwLCBpLCBzeW50YXgsIGZsYWcgJiBRVU9URVNfRVNDKTsKKyByZWFkOgorCQlpZiAoaW4uZmQgPCAwKQorCQkJYnJlYWs7CisJCWkgPSBub25ibG9ja19pbW11bmVfcmVhZChpbi5mZCwgYnVmLCBzaXplb2YoYnVmKSk7CisJCVRSQUNFKCgiZXhwYmFja3E6IHJlYWQgcmV0dXJucyAlZFxuIiwgaSkpOworCQlpZiAoaSA8PSAwKQorCQkJYnJlYWs7CisJCXAgPSBidWY7CisJfQorCisJZnJlZShpbi5idWYpOworCWlmIChpbi5mZCA+PSAwKSB7CisJCWNsb3NlKGluLmZkKTsKKwkJYmFja19leGl0c3RhdHVzID0gd2FpdGZvcmpvYihpbi5qcCk7CisJfQorCUlOVF9PTjsKKworCS8qIEVhdCBhbGwgdHJhaWxpbmcgbmV3bGluZXMgKi8KKwlkZXN0ID0gZXhwZGVzdDsKKwlmb3IgKDsgZGVzdCA+IChjaGFyICopc3RhY2tibG9jaygpICYmIGRlc3RbLTFdID09ICdcbic7KQorCQlTVFVOUFVUQyhkZXN0KTsKKwlleHBkZXN0ID0gZGVzdDsKKworCWlmICghKGZsYWcgJiBFWFBfUVVPVEVEKSkKKwkJcmVjb3JkcmVnaW9uKHN0YXJ0bG9jLCBkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCksIDApOworCVRSQUNFKCgiZXZhbGJhY2txOiBzaXplOiVkOiclLipzJ1xuIiwKKwkJKGludCkoKGRlc3QgLSAoY2hhciAqKXN0YWNrYmxvY2soKSkgLSBzdGFydGxvYyksCisJCShpbnQpKChkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCkpIC0gc3RhcnRsb2MpLAorCQlzdGFja2Jsb2NrKCkgKyBzdGFydGxvYykpOworfQorCisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorLyoKKyAqIEV4cGFuZCBhcml0aG1ldGljIGV4cHJlc3Npb24uICBCYWNrdXAgdG8gc3RhcnQgb2YgZXhwcmVzc2lvbiwKKyAqIGV2YWx1YXRlLCBwbGFjZSByZXN1bHQgaW4gKGJhY2tlZCB1cCkgcmVzdWx0LCBhZGp1c3Qgc3RyaW5nIHBvc2l0aW9uLgorICovCitzdGF0aWMgdm9pZAorZXhwYXJpKGludCBmbGFnKQoreworCWNoYXIgKnAsICpzdGFydDsKKwlpbnQgYmVnb2ZmOworCWludCBsZW47CisKKwkvKiBpZnNmcmVlKCk7ICovCisKKwkvKgorCSAqIFRoaXMgcm91dGluZSBpcyBzbGlnaHRseSBvdmVyLWNvbXBsaWNhdGVkIGZvcgorCSAqIGVmZmljaWVuY3kuICBOZXh0IHdlIHNjYW4gYmFja3dhcmRzIGxvb2tpbmcgZm9yIHRoZQorCSAqIHN0YXJ0IG9mIGFyaXRobWV0aWMuCisJICovCisJc3RhcnQgPSBzdGFja2Jsb2NrKCk7CisJcCA9IGV4cGRlc3QgLSAxOworCSpwID0gJ1wwJzsKKwlwLS07CisJd2hpbGUgKDEpIHsKKwkJaW50IGVzYzsKKworCQl3aGlsZSAoKHVuc2lnbmVkIGNoYXIpKnAgIT0gQ1RMQVJJKSB7CisJCQlwLS07CisjaWYgREVCVUcKKwkJCWlmIChwIDwgc3RhcnQpIHsKKwkJCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigibWlzc2luZyBDVExBUkkgKHNob3VsZG4ndCBoYXBwZW4pIik7CisJCQl9CisjZW5kaWYKKwkJfQorCisJCWVzYyA9IGVzY2xlbihzdGFydCwgcCk7CisJCWlmICghKGVzYyAlIDIpKSB7CisJCQlicmVhazsKKwkJfQorCisJCXAgLT0gZXNjICsgMTsKKwl9CisKKwliZWdvZmYgPSBwIC0gc3RhcnQ7CisKKwlyZW1vdmVyZWNvcmRyZWdpb25zKGJlZ29mZik7CisKKwlleHBkZXN0ID0gcDsKKworCWlmIChmbGFnICYgUVVPVEVTX0VTQykKKwkJcm1lc2NhcGVzKHAgKyAxLCAwKTsKKworCWxlbiA9IGN2dG51bShhc2hfYXJpdGgocCArIDEpKTsKKworCWlmICghKGZsYWcgJiBFWFBfUVVPVEVEKSkKKwkJcmVjb3JkcmVnaW9uKGJlZ29mZiwgYmVnb2ZmICsgbGVuLCAwKTsKK30KKyNlbmRpZgorCisvKiBhcmdzdHIgbmVlZHMgaXQgKi8KK3N0YXRpYyBjaGFyICpldmFsdmFyKGNoYXIgKnAsIGludCBmbGFncywgc3RydWN0IHN0cmxpc3QgKnZhcl9zdHJfbGlzdCk7CisKKy8qCisgKiBQZXJmb3JtIHZhcmlhYmxlIGFuZCBjb21tYW5kIHN1YnN0aXR1dGlvbi4gIElmIEVYUF9GVUxMIGlzIHNldCwgb3V0cHV0IENUTEVTQworICogY2hhcmFjdGVycyB0byBhbGxvdyBmb3IgZnVydGhlciBwcm9jZXNzaW5nLiAgT3RoZXJ3aXNlIHRyZWF0CisgKiAkQCBsaWtlICQqIHNpbmNlIG5vIHNwbGl0dGluZyB3aWxsIGJlIHBlcmZvcm1lZC4KKyAqCisgKiB2YXJfc3RyX2xpc3QgKGNhbiBiZSBOVUxMKSBpcyBhIGxpc3Qgb2YgIlZBUj12YWwiIHN0cmluZ3Mgd2hpY2ggdGFrZSBwcmVjZWRlbmNlCisgKiBvdmVyIHNoZWxsIHZhcmFibGVzLiBOZWVkZWQgZm9yICJBPWEgQj0kQTsgZWNobyAkQiIgY2FzZSAtIHdlIHVzZSBpdAorICogZm9yIGNvcnJlY3QgZXhwYW5zaW9uIG9mICJCPSRBIiB3b3JkLgorICovCitzdGF0aWMgdm9pZAorYXJnc3RyKGNoYXIgKnAsIGludCBmbGFncywgc3RydWN0IHN0cmxpc3QgKnZhcl9zdHJfbGlzdCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBzcGNsY2hhcnNbXSBBTElHTjEgPSB7CisJCSc9JywKKwkJJzonLAorCQlDVExRVU9URU1BUkssCisJCUNUTEVORFZBUiwKKwkJQ1RMRVNDLAorCQlDVExWQVIsCisJCUNUTEJBQ0tRLAorI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKKwkJQ1RMRU5EQVJJLAorI2VuZGlmCisJCSdcMCcKKwl9OworCWNvbnN0IGNoYXIgKnJlamVjdCA9IHNwY2xjaGFyczsKKwlpbnQgYnJlYWthbGwgPSAoZmxhZ3MgJiAoRVhQX1dPUkQgfCBFWFBfUVVPVEVEKSkgPT0gRVhQX1dPUkQ7CisJaW50IGlucXVvdGVzOworCXNpemVfdCBsZW5ndGg7CisJaW50IHN0YXJ0bG9jOworCisJaWYgKCEoZmxhZ3MgJiBFWFBfVkFSVElMREUpKSB7CisJCXJlamVjdCArPSAyOworCX0gZWxzZSBpZiAoZmxhZ3MgJiBFWFBfVkFSVElMREUyKSB7CisJCXJlamVjdCsrOworCX0KKwlpbnF1b3RlcyA9IDA7CisJbGVuZ3RoID0gMDsKKwlpZiAoZmxhZ3MgJiBFWFBfVElMREUpIHsKKwkJY2hhciAqcTsKKworCQlmbGFncyAmPSB+RVhQX1RJTERFOworIHRpbGRlOgorCQlxID0gcDsKKwkJaWYgKCpxID09ICd+JykKKwkJCXAgPSBleHB0aWxkZShwLCBxLCBmbGFncyk7CisJfQorIHN0YXJ0OgorCXN0YXJ0bG9jID0gZXhwZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpOworCWZvciAoOzspIHsKKwkJdW5zaWduZWQgY2hhciBjOworCisJCWxlbmd0aCArPSBzdHJjc3BuKHAgKyBsZW5ndGgsIHJlamVjdCk7CisJCWMgPSBwW2xlbmd0aF07CisJCWlmIChjKSB7CisJCQlpZiAoIShjICYgMHg4MCkKKwkJCUlGX1NIX01BVEhfU1VQUE9SVCh8fCBjID09IENUTEVOREFSSSkKKwkJCSkgeworCQkJCS8qIGMgPT0gJz0nIHx8IGMgPT0gJzonIHx8IGMgPT0gQ1RMRU5EQVJJICovCisJCQkJbGVuZ3RoKys7CisJCQl9CisJCX0KKwkJaWYgKGxlbmd0aCA+IDApIHsKKwkJCWludCBuZXdsb2M7CisJCQlleHBkZXN0ID0gc3RhY2tfbnB1dHN0cihwLCBsZW5ndGgsIGV4cGRlc3QpOworCQkJbmV3bG9jID0gZXhwZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpOworCQkJaWYgKGJyZWFrYWxsICYmICFpbnF1b3RlcyAmJiBuZXdsb2MgPiBzdGFydGxvYykgeworCQkJCXJlY29yZHJlZ2lvbihzdGFydGxvYywgbmV3bG9jLCAwKTsKKwkJCX0KKwkJCXN0YXJ0bG9jID0gbmV3bG9jOworCQl9CisJCXAgKz0gbGVuZ3RoICsgMTsKKwkJbGVuZ3RoID0gMDsKKworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnXDAnOgorCQkJZ290byBicmVha2xvb3A7CisJCWNhc2UgJz0nOgorCQkJaWYgKGZsYWdzICYgRVhQX1ZBUlRJTERFMikgeworCQkJCXAtLTsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWZsYWdzIHw9IEVYUF9WQVJUSUxERTI7CisJCQlyZWplY3QrKzsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlICc6JzoKKwkJCS8qCisJCQkgKiBzb3J0IG9mIGEgaGFjayAtIGV4cGFuZCB0aWxkZXMgaW4gdmFyaWFibGUKKwkJCSAqIGFzc2lnbm1lbnRzIChhZnRlciB0aGUgZmlyc3QgJz0nIGFuZCBhZnRlciAnOidzKS4KKwkJCSAqLworCQkJaWYgKCotLXAgPT0gJ34nKSB7CisJCQkJZ290byB0aWxkZTsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgQ1RMRU5EVkFSOiAvKiA/Pz8gKi8KKwkJCWdvdG8gYnJlYWtsb29wOworCQljYXNlIENUTFFVT1RFTUFSSzoKKwkJCWlucXVvdGVzIF49IEVYUF9RVU9URUQ7CisJCQkvKiAiJEAiIHN5bnRheCBhZGhlcmVuY2UgaGFjayAqLworCQkJaWYgKGlucXVvdGVzICYmICFtZW1jbXAocCwgZG9sYXRzdHIgKyAxLCBET0xBVFNUUkxFTiAtIDEpKSB7CisJCQkJcCA9IGV2YWx2YXIocCArIDEsIGZsYWdzIHwgaW5xdW90ZXMsIC8qIHZhcl9zdHJfbGlzdDogKi8gTlVMTCkgKyAxOworCQkJCWdvdG8gc3RhcnQ7CisJCQl9CisgYWRkcXVvdGU6CisJCQlpZiAoZmxhZ3MgJiBRVU9URVNfRVNDKSB7CisJCQkJcC0tOworCQkJCWxlbmd0aCsrOworCQkJCXN0YXJ0bG9jKys7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDVExFU0M6CisJCQlzdGFydGxvYysrOworCQkJbGVuZ3RoKys7CisKKwkJCS8qCisJCQkgKiBRdW90ZWQgcGFyYW1ldGVyIGV4cGFuc2lvbiBwYXR0ZXJuOiByZW1vdmUgcXVvdGUKKwkJCSAqIHVubGVzcyBpbnNpZGUgaW5uZXIgcXVvdGVzIG9yIHdlIGhhdmUgYSBsaXRlcmFsCisJCQkgKiBiYWNrc2xhc2guCisJCQkgKi8KKwkJCWlmICgoKGZsYWdzIHwgaW5xdW90ZXMpICYgKEVYUF9RUEFUIHwgRVhQX1FVT1RFRCkpID09CisJCQkgICAgRVhQX1FQQVQgJiYgKnAgIT0gJ1xcJykKKwkJCQlicmVhazsKKworCQkJZ290byBhZGRxdW90ZTsKKwkJY2FzZSBDVExWQVI6CisJCQlUUkFDRSgoImFyZ3N0cjogZXZhbHZhcignJXMnKVxuIiwgcCkpOworCQkJcCA9IGV2YWx2YXIocCwgZmxhZ3MgfCBpbnF1b3RlcywgdmFyX3N0cl9saXN0KTsKKwkJCVRSQUNFKCgiYXJnc3RyOiBldmFsdmFyOiclcydcbiIsIChjaGFyICopc3RhY2tibG9jaygpKSk7CisJCQlnb3RvIHN0YXJ0OworCQljYXNlIENUTEJBQ0tROgorCQkJZXhwYmFja3EoYXJnYmFja3EtPm4sIGZsYWdzIHwgaW5xdW90ZXMpOworCQkJYXJnYmFja3EgPSBhcmdiYWNrcS0+bmV4dDsKKwkJCWdvdG8gc3RhcnQ7CisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorCQljYXNlIENUTEVOREFSSToKKwkJCXAtLTsKKwkJCWV4cGFyaShmbGFncyB8IGlucXVvdGVzKTsKKwkJCWdvdG8gc3RhcnQ7CisjZW5kaWYKKwkJfQorCX0KKyBicmVha2xvb3A6IDsKK30KKworc3RhdGljIGNoYXIgKgorc2NhbmxlZnQoY2hhciAqc3RhcnRwLCBjaGFyICpybWVzYywgY2hhciAqcm1lc2NlbmQgVU5VU0VEX1BBUkFNLAorCQljaGFyICpwYXR0ZXJuLCBpbnQgcXVvdGVzLCBpbnQgemVybykKK3sKKwljaGFyICpsb2MsICpsb2MyOworCWNoYXIgYzsKKworCWxvYyA9IHN0YXJ0cDsKKwlsb2MyID0gcm1lc2M7CisJZG8geworCQlpbnQgbWF0Y2g7CisJCWNvbnN0IGNoYXIgKnMgPSBsb2MyOworCisJCWMgPSAqbG9jMjsKKwkJaWYgKHplcm8pIHsKKwkJCSpsb2MyID0gJ1wwJzsKKwkJCXMgPSBybWVzYzsKKwkJfQorCQltYXRjaCA9IHBtYXRjaChwYXR0ZXJuLCBzKTsKKworCQkqbG9jMiA9IGM7CisJCWlmIChtYXRjaCkKKwkJCXJldHVybiBsb2M7CisJCWlmIChxdW90ZXMgJiYgKHVuc2lnbmVkIGNoYXIpKmxvYyA9PSBDVExFU0MpCisJCQlsb2MrKzsKKwkJbG9jKys7CisJCWxvYzIrKzsKKwl9IHdoaWxlIChjKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNoYXIgKgorc2NhbnJpZ2h0KGNoYXIgKnN0YXJ0cCwgY2hhciAqcm1lc2MsIGNoYXIgKnJtZXNjZW5kLAorCQljaGFyICpwYXR0ZXJuLCBpbnQgcXVvdGVzLCBpbnQgbWF0Y2hfYXRfc3RhcnQpCit7CisjaWYgIUVOQUJMRV9BU0hfT1BUSU1JWkVfRk9SX1NJWkUKKwlpbnQgdHJ5Mm9wdGltaXplID0gbWF0Y2hfYXRfc3RhcnQ7CisjZW5kaWYKKwlpbnQgZXNjID0gMDsKKwljaGFyICpsb2M7CisJY2hhciAqbG9jMjsKKworCS8qIElmIHdlIGNhbGxlZCBieSAiJHt2L3BhdHRlcm4vcmVwbH0iIG9yICIke3YvL3BhdHRlcm4vcmVwbH0iOgorCSAqIHN0YXJ0cD0iZXNjYXBlZF92YWx1ZV9vZl92IiBybWVzYz0icmF3X3ZhbHVlX29mX3YiCisJICogcm1lc2NlbmQ9IiIocHRyIHRvIE5VTCBpbiBybWVzYykgcGF0dGVybj0icGF0dGVybiIgcXVvdGVzPW1hdGNoX2F0X3N0YXJ0PTEKKwkgKiBMb2dpYzoKKwkgKiBsb2Mgc3RhcnRzIGF0IE5VTCBhdCB0aGUgZW5kIG9mIHN0YXJ0cCwgbG9jMiBzdGFydHMgYXQgdGhlIGVuZCBvZiBybWVzYywKKwkgKiBhbmQgb24gZWFjaCBpdGVyYXRpb24gdGhleSBnbyBiYWNrIHR3by9vbmUgY2hhciB1bnRpbCB0aGV5IHJlYWNoIHRoZSBiZWdpbm5pbmcuCisJICogV2UgdHJ5IHRvIGZpbmQgYSBtYXRjaCBpbiAicmF3X3ZhbHVlX29mX3YiLCAicmF3X3ZhbHVlX29mXyIsICJyYXdfdmFsdWVfb2YiIGV0Yy4KKwkgKi8KKwkvKiBUT0RPOiBkb2N1bWVudCBpbiB3aGF0IG90aGVyIGNpcmN1bXN0YW5jZXMgd2UgYXJlIGNhbGxlZC4gKi8KKworCWZvciAobG9jID0gcGF0dGVybiAtIDEsIGxvYzIgPSBybWVzY2VuZDsgbG9jID49IHN0YXJ0cDsgbG9jMi0tKSB7CisJCWludCBtYXRjaDsKKwkJY2hhciBjID0gKmxvYzI7CisJCWNvbnN0IGNoYXIgKnMgPSBsb2MyOworCQlpZiAobWF0Y2hfYXRfc3RhcnQpIHsKKwkJCSpsb2MyID0gJ1wwJzsKKwkJCXMgPSBybWVzYzsKKwkJfQorCQltYXRjaCA9IHBtYXRjaChwYXR0ZXJuLCBzKTsKKwkJLy9iYl9lcnJvcl9tc2coInBtYXRjaChwYXR0ZXJuOiclcycsczonJXMnKTolZCIsIHBhdHRlcm4sIHMsIG1hdGNoKTsKKwkJKmxvYzIgPSBjOworCQlpZiAobWF0Y2gpCisJCQlyZXR1cm4gbG9jOworI2lmICFFTkFCTEVfQVNIX09QVElNSVpFX0ZPUl9TSVpFCisJCWlmICh0cnkyb3B0aW1pemUpIHsKKwkJCS8qIE1heWJlIHdlIGNhbiBvcHRpbWl6ZSB0aGlzOgorCQkJICogaWYgcGF0dGVybiBlbmRzIHdpdGggdW5lc2NhcGVkICosIHdlIGNhbiBhdm9pZCBjaGVja2luZworCQkJICogc2hvcnRlciBzdHJpbmdzOiBpZiAiZm9vKiIgZG9lc250IG1hdGNoICJyYXdfdmFsdWVfb2ZfdiIsCisJCQkgKiBpdCB3b250IG1hdGNoIHRydW5jYXRlZCAicmF3X3ZhbHVlX29mXyIgc3RyaW5ncyB0b28uCisJCQkgKi8KKwkJCXVuc2lnbmVkIHBsZW4gPSBzdHJsZW4ocGF0dGVybik7CisJCQkvKiBEb2VzIGl0IGVuZCB3aXRoICIqIj8gKi8KKwkJCWlmIChwbGVuICE9IDAgJiYgcGF0dGVyblstLXBsZW5dID09ICcqJykgeworCQkJCS8qICJ4eHh4KiIgaXMgbm90IGVzY2FwZWQgKi8KKwkJCQkvKiAieHh4XCoiIGlzIGVzY2FwZWQgKi8KKwkJCQkvKiAieHhcXCoiIGlzIG5vdCBlc2NhcGVkICovCisJCQkJLyogInhcXFwqIiBpcyBlc2NhcGVkICovCisJCQkJaW50IHNsYXNoZXMgPSAwOworCQkJCXdoaWxlIChwbGVuICE9IDAgJiYgcGF0dGVyblstLXBsZW5dID09ICdcXCcpCisJCQkJCXNsYXNoZXMrKzsKKwkJCQlpZiAoIShzbGFzaGVzICYgMSkpCisJCQkJCWJyZWFrOyAvKiBlbmRzIHdpdGggdW5lc2NhcGVkICIqIiAqLworCQkJfQorCQkJdHJ5Mm9wdGltaXplID0gMDsKKwkJfQorI2VuZGlmCisJCWxvYy0tOworCQlpZiAocXVvdGVzKSB7CisJCQlpZiAoLS1lc2MgPCAwKSB7CisJCQkJZXNjID0gZXNjbGVuKHN0YXJ0cCwgbG9jKTsKKwkJCX0KKwkJCWlmIChlc2MgJSAyKSB7CisJCQkJZXNjLS07CisJCQkJbG9jLS07CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHZhcnVuc2V0KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCkgTk9SRVRVUk47CitzdGF0aWMgdm9pZAordmFydW5zZXQoY29uc3QgY2hhciAqZW5kLCBjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnVtc2csIGludCB2YXJmbGFncykKK3sKKwljb25zdCBjaGFyICptc2c7CisJY29uc3QgY2hhciAqdGFpbDsKKworCXRhaWwgPSBudWxsc3RyOworCW1zZyA9ICJwYXJhbWV0ZXIgbm90IHNldCI7CisJaWYgKHVtc2cpIHsKKwkJaWYgKCh1bnNpZ25lZCBjaGFyKSplbmQgPT0gQ1RMRU5EVkFSKSB7CisJCQlpZiAodmFyZmxhZ3MgJiBWU05VTCkKKwkJCQl0YWlsID0gIiBvciBudWxsIjsKKwkJfSBlbHNlIHsKKwkJCW1zZyA9IHVtc2c7CisJCX0KKwl9CisJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoIiUuKnM6ICVzJXMiLCAoaW50KShlbmQgLSB2YXIgLSAxKSwgdmFyLCBtc2csIHRhaWwpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitzdWJldmFsdmFyKGNoYXIgKnAsIGNoYXIgKnZhcm5hbWUsIGludCBzdHJsb2MsIGludCBzdWJ0eXBlLAorCQlpbnQgc3RhcnRsb2MsIGludCB2YXJmbGFncywgaW50IGZsYWcsIHN0cnVjdCBzdHJsaXN0ICp2YXJfc3RyX2xpc3QpCit7CisJc3RydWN0IG5vZGVsaXN0ICpzYXZlYXJnYmFja3EgPSBhcmdiYWNrcTsKKwlpbnQgcXVvdGVzID0gZmxhZyAmIFFVT1RFU19FU0M7CisJY2hhciAqc3RhcnRwOworCWNoYXIgKmxvYzsKKwljaGFyICpybWVzYywgKnJtZXNjZW5kOworCWNoYXIgKnN0cjsKKwlJRl9BU0hfQkFTSF9DT01QQVQoY2hhciAqcmVwbCA9IE5VTEw7KQorCUlGX0FTSF9CQVNIX0NPTVBBVChpbnQgcG9zLCBsZW4sIG9yaWdfbGVuOykKKwlpbnQgc2F2ZWhlcmVmZCA9IGhlcmVmZDsKKwlpbnQgYW1vdW50LCByZXNldGxvYzsKKwlJRl9BU0hfQkFTSF9DT01QQVQoaW50IHdvcmtsb2M7KQorCWludCB6ZXJvOworCWNoYXIgKigqc2NhbikoY2hhciosIGNoYXIqLCBjaGFyKiwgY2hhciosIGludCwgaW50KTsKKworCS8vYmJfZXJyb3JfbXNnKCJzdWJldmFsdmFyKHA6JyVzJyx2YXJuYW1lOiclcycsc3RybG9jOiVkLHN1YnR5cGU6JWQsc3RhcnRsb2M6JWQsdmFyZmxhZ3M6JXgscXVvdGVzOiVkKSIsCisJLy8JCXAsIHZhcm5hbWUsIHN0cmxvYywgc3VidHlwZSwgc3RhcnRsb2MsIHZhcmZsYWdzLCBxdW90ZXMpOworCisJaGVyZWZkID0gLTE7CisJYXJnc3RyKHAsIEVYUF9USUxERSB8IChzdWJ0eXBlICE9IFZTQVNTSUdOICYmIHN1YnR5cGUgIT0gVlNRVUVTVElPTiA/CisJCQkoZmxhZyAmIChFWFBfUVVPVEVEIHwgRVhQX1FQQVQpID8gRVhQX1FQQVQgOiBFWFBfQ0FTRSkgOiAwKSwKKwkJCXZhcl9zdHJfbGlzdCk7CisJU1RQVVRDKCdcMCcsIGV4cGRlc3QpOworCWhlcmVmZCA9IHNhdmVoZXJlZmQ7CisJYXJnYmFja3EgPSBzYXZlYXJnYmFja3E7CisJc3RhcnRwID0gKGNoYXIgKilzdGFja2Jsb2NrKCkgKyBzdGFydGxvYzsKKworCXN3aXRjaCAoc3VidHlwZSkgeworCWNhc2UgVlNBU1NJR046CisJCXNldHZhcjAodmFybmFtZSwgc3RhcnRwKTsKKwkJYW1vdW50ID0gc3RhcnRwIC0gZXhwZGVzdDsKKwkJU1RBREpVU1QoYW1vdW50LCBleHBkZXN0KTsKKwkJcmV0dXJuIHN0YXJ0cDsKKworCWNhc2UgVlNRVUVTVElPTjoKKwkJdmFydW5zZXQocCwgdmFybmFtZSwgc3RhcnRwLCB2YXJmbGFncyk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwljYXNlIFZTU1VCU1RSOgorCQlsb2MgPSBzdHIgPSBzdGFja2Jsb2NrKCkgKyBzdHJsb2M7CisJCS8qIFJlYWQgUE9TIGluICR7dmFyOlBPUzpMRU59ICovCisJCXBvcyA9IGF0b2kobG9jKTsgLyogbnVtYmVyKGxvYykgZXJyb3JzIG91dCBvbiAiMTo0IiAqLworCQlsZW4gPSBzdHIgLSBzdGFydHAgLSAxOworCisJCS8qICpsb2MgIT0gJ1wwJywgZ3VhcmFudGVlZCBieSBwYXJzZXIgKi8KKwkJaWYgKHF1b3RlcykgeworCQkJY2hhciAqcHRyOworCisJCQkvKiBBZGp1c3QgdGhlIGxlbmd0aCBieSB0aGUgbnVtYmVyIG9mIGVzY2FwZXMgKi8KKwkJCWZvciAocHRyID0gc3RhcnRwOyBwdHIgPCAoc3RyIC0gMSk7IHB0cisrKSB7CisJCQkJaWYgKCh1bnNpZ25lZCBjaGFyKSpwdHIgPT0gQ1RMRVNDKSB7CisJCQkJCWxlbi0tOworCQkJCQlwdHIrKzsKKwkJCQl9CisJCQl9CisJCX0KKwkJb3JpZ19sZW4gPSBsZW47CisKKwkJaWYgKCpsb2MrKyA9PSAnOicpIHsKKwkJCS8qICR7dmFyOjpMRU59ICovCisJCQlsZW4gPSBudW1iZXIobG9jKTsKKwkJfSBlbHNlIHsKKwkJCS8qIFNraXAgUE9TIGluICR7dmFyOlBPUzpMRU59ICovCisJCQlsZW4gPSBvcmlnX2xlbjsKKwkJCXdoaWxlICgqbG9jICYmICpsb2MgIT0gJzonKSB7CisJCQkJLyogVE9ETz8KKwkJCQkgKiBiYXNoIGNvbXBsYWlucyBvbjogdmFyPXF3ZTsgZWNobyAke3ZhcjoxYToxMjN9CisJCQkJaWYgKCFpc2RpZ2l0KCpsb2MpKQorCQkJCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcihtc2dfaWxsbnVtLCBzdHIpOworCQkJCSAqLworCQkJCWxvYysrOworCQkJfQorCQkJaWYgKCpsb2MrKyA9PSAnOicpIHsKKwkJCQlsZW4gPSBudW1iZXIobG9jKTsKKwkJCX0KKwkJfQorCQlpZiAocG9zIDwgMCkgeworCQkJLyogJHtWQVI6JCgoLW4pKTpsfSBzdGFydHMgbiBjaGFycyBmcm9tIHRoZSBlbmQgKi8KKwkJCXBvcyA9IG9yaWdfbGVuICsgcG9zOworCQl9CisJCWlmICgodW5zaWduZWQpcG9zID49IG9yaWdfbGVuKSB7CisJCQkvKiBhcGFydCBmcm9tIG9idmlvdXMgJHtWQVI6OTk5OTk5Omx9LAorCQkJICogY292ZXJzICR7VkFSOiQoKC05OTk5OTk5KSk6bH0gLSByZXN1bHQgaXMgIiIKKwkJCSAqIChiYXNoLWNvbXBhdCkKKwkJCSAqLworCQkJcG9zID0gMDsKKwkJCWxlbiA9IDA7CisJCX0KKwkJaWYgKGxlbiA+IChvcmlnX2xlbiAtIHBvcykpCisJCQlsZW4gPSBvcmlnX2xlbiAtIHBvczsKKworCQlmb3IgKHN0ciA9IHN0YXJ0cDsgcG9zOyBzdHIrKywgcG9zLS0pIHsKKwkJCWlmIChxdW90ZXMgJiYgKHVuc2lnbmVkIGNoYXIpKnN0ciA9PSBDVExFU0MpCisJCQkJc3RyKys7CisJCX0KKwkJZm9yIChsb2MgPSBzdGFydHA7IGxlbjsgbGVuLS0pIHsKKwkJCWlmIChxdW90ZXMgJiYgKHVuc2lnbmVkIGNoYXIpKnN0ciA9PSBDVExFU0MpCisJCQkJKmxvYysrID0gKnN0cisrOworCQkJKmxvYysrID0gKnN0cisrOworCQl9CisJCSpsb2MgPSAnXDAnOworCQlhbW91bnQgPSBsb2MgLSBleHBkZXN0OworCQlTVEFESlVTVChhbW91bnQsIGV4cGRlc3QpOworCQlyZXR1cm4gbG9jOworI2VuZGlmCisJfQorCisJcmVzZXRsb2MgPSBleHBkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCk7CisKKwkvKiBXZSdsbCBjb21lYmFjayBoZXJlIGlmIHdlIGdyb3cgdGhlIHN0YWNrIHdoaWxlIGhhbmRsaW5nCisJICogYSBWU1JFUExBQ0Ugb3IgVlNSRVBMQUNFQUxMLCBzaW5jZSBvdXIgcG9pbnRlcnMgaW50byB0aGUKKwkgKiBzdGFjayB3aWxsIG5lZWQgcmViYXNpbmcsIGFuZCB3ZSdsbCBuZWVkIHRvIHJlbW92ZSBvdXIgd29yaworCSAqIGFyZWFzIGVhY2ggdGltZQorCSAqLworIElGX0FTSF9CQVNIX0NPTVBBVChyZXN0YXJ0OikKKworCWFtb3VudCA9IGV4cGRlc3QgLSAoKGNoYXIgKilzdGFja2Jsb2NrKCkgKyByZXNldGxvYyk7CisJU1RBREpVU1QoLWFtb3VudCwgZXhwZGVzdCk7CisJc3RhcnRwID0gKGNoYXIgKilzdGFja2Jsb2NrKCkgKyBzdGFydGxvYzsKKworCXJtZXNjID0gc3RhcnRwOworCXJtZXNjZW5kID0gKGNoYXIgKilzdGFja2Jsb2NrKCkgKyBzdHJsb2M7CisJaWYgKHF1b3RlcykgeworCQlybWVzYyA9IHJtZXNjYXBlcyhzdGFydHAsIFJNRVNDQVBFX0FMTE9DIHwgUk1FU0NBUEVfR1JPVyk7CisJCWlmIChybWVzYyAhPSBzdGFydHApIHsKKwkJCXJtZXNjZW5kID0gZXhwZGVzdDsKKwkJCXN0YXJ0cCA9IChjaGFyICopc3RhY2tibG9jaygpICsgc3RhcnRsb2M7CisJCX0KKwl9CisJcm1lc2NlbmQtLTsKKwlzdHIgPSAoY2hhciAqKXN0YWNrYmxvY2soKSArIHN0cmxvYzsKKwkvKgorCSAqIEV4YW1wbGU6IHY9J2FcYmMnOyBlY2hvICR7di9cXGIvX1xcX1x6X30KKwkgKiBUaGUgcmVzdWx0IGlzIGFfXF96X2MgKG5vdCBhXF9cX3pfYykhCisJICoKKwkgKiBUaGUgc2VhcmNoIHBhdHRlcm4gYW5kIHJlcGxhY2Ugc3RyaW5nIHRyZWF0IGJhY2tzbGFzaGVzIGRpZmZlcmVudGx5IQorCSAqIFJNRVNDQVBFX1NMQVNIIGNhdXNlcyBwcmVnbG9iIHRvIHdvcmsgZGlmZmVyZW50bHkgb24gdGhlIHBhdHRlcm4KKwkgKiBhbmQgc3RyaW5nLiAgSXQncyBvbmx5IHVzZWQgb24gdGhlIGZpcnN0IGNhbGwuCisJICovCisJcHJlZ2xvYihzdHIsIElGX0FTSF9CQVNIX0NPTVBBVCgKKwkJKHN1YnR5cGUgPT0gVlNSRVBMQUNFIHx8IHN1YnR5cGUgPT0gVlNSRVBMQUNFQUxMKSAmJiAhcmVwbCA/CisJCQlSTUVTQ0FQRV9TTEFTSCA6KSAwKTsKKworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwl3b3JrbG9jID0gZXhwZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpOworCWlmIChzdWJ0eXBlID09IFZTUkVQTEFDRSB8fCBzdWJ0eXBlID09IFZTUkVQTEFDRUFMTCkgeworCQljaGFyICppZHgsICplbmQ7CisKKwkJaWYgKCFyZXBsKSB7CisJCQlpZiAoKHJlcGw9c3RyY2hyKHN0ciwgQ1RMRVNDKSkpCisJCQkJKnJlcGwrKyA9ICdcMCc7CisJCQllbHNlCisJCQkJcmVwbCA9IG51bGxzdHI7CisJCX0KKwkJLy9iYl9lcnJvcl9tc2coInN0cjonJXMnIHJlcGw6JyVzJyIsIHN0ciwgcmVwbCk7CisKKwkJLyogSWYgdGhlcmUncyBubyBwYXR0ZXJuIHRvIG1hdGNoLCByZXR1cm4gdGhlIGV4cGFuc2lvbiB1bm1vbGVzdGVkICovCisJCWlmIChzdHJbMF0gPT0gJ1wwJykKKwkJCXJldHVybiBOVUxMOworCisJCWxlbiA9IDA7CisJCWlkeCA9IHN0YXJ0cDsKKwkJZW5kID0gc3RyIC0gMTsKKwkJd2hpbGUgKGlkeCA8IGVuZCkgeworIHRyeV90b19tYXRjaDoKKwkJCWxvYyA9IHNjYW5yaWdodChpZHgsIHJtZXNjLCBybWVzY2VuZCwgc3RyLCBxdW90ZXMsIDEpOworCQkJLy9iYl9lcnJvcl9tc2coInNjYW5yaWdodCgnJXMnKTonJXMnIiwgc3RyLCBsb2MpOworCQkJaWYgKCFsb2MpIHsKKwkJCQkvKiBObyBtYXRjaCwgYWR2YW5jZSAqLworCQkJCWNoYXIgKnJlc3RhcnRfZGV0ZWN0ID0gc3RhY2tibG9jaygpOworIHNraXBfbWF0Y2hpbmc6CisJCQkJU1RQVVRDKCppZHgsIGV4cGRlc3QpOworCQkJCWlmIChxdW90ZXMgJiYgKHVuc2lnbmVkIGNoYXIpKmlkeCA9PSBDVExFU0MpIHsKKwkJCQkJaWR4Kys7CisJCQkJCWxlbisrOworCQkJCQlTVFBVVEMoKmlkeCwgZXhwZGVzdCk7CisJCQkJfQorCQkJCWlmIChzdGFja2Jsb2NrKCkgIT0gcmVzdGFydF9kZXRlY3QpCisJCQkJCWdvdG8gcmVzdGFydDsKKwkJCQlpZHgrKzsKKwkJCQlsZW4rKzsKKwkJCQlybWVzYysrOworCQkJCS8qIGNvbnRpbnVlOyAtIHByb25lIHRvIHF1YWRyYXRpYyBiZWhhdmlvciwgc21hcnRlciBjb2RlOiAqLworCQkJCWlmIChpZHggPj0gZW5kKQorCQkJCQlicmVhazsKKwkJCQlpZiAoc3RyWzBdID09ICcqJykgeworCQkJCQkvKiBQYXR0ZXJuIGlzICIqZm9vIi4gSWYgIipmb28iIGRvZXMgbm90IG1hdGNoICJsb25nX3N0cmluZyIsCisJCQkJCSAqIGl0IHdvdWxkIG5ldmVyIG1hdGNoICJvbmdfc3RyaW5nIiBldGMsIG5vIHBvaW50IGluIHRyeWluZy4KKwkJCQkJICovCisJCQkJCWdvdG8gc2tpcF9tYXRjaGluZzsKKwkJCQl9CisJCQkJZ290byB0cnlfdG9fbWF0Y2g7CisJCQl9CisKKwkJCWlmIChzdWJ0eXBlID09IFZTUkVQTEFDRUFMTCkgeworCQkJCXdoaWxlIChpZHggPCBsb2MpIHsKKwkJCQkJaWYgKHF1b3RlcyAmJiAodW5zaWduZWQgY2hhcikqaWR4ID09IENUTEVTQykKKwkJCQkJCWlkeCsrOworCQkJCQlpZHgrKzsKKwkJCQkJcm1lc2MrKzsKKwkJCQl9CisJCQl9IGVsc2UgeworCQkJCWlkeCA9IGxvYzsKKwkJCX0KKworCQkJLy9iYl9lcnJvcl9tc2coInJlcGw6JyVzJyIsIHJlcGwpOworCQkJZm9yIChsb2MgPSAoY2hhciopcmVwbDsgKmxvYzsgbG9jKyspIHsKKwkJCQljaGFyICpyZXN0YXJ0X2RldGVjdCA9IHN0YWNrYmxvY2soKTsKKwkJCQlpZiAocXVvdGVzICYmICpsb2MgPT0gJ1xcJykgeworCQkJCQlTVFBVVEMoQ1RMRVNDLCBleHBkZXN0KTsKKwkJCQkJbGVuKys7CisJCQkJfQorCQkJCVNUUFVUQygqbG9jLCBleHBkZXN0KTsKKwkJCQlpZiAoc3RhY2tibG9jaygpICE9IHJlc3RhcnRfZGV0ZWN0KQorCQkJCQlnb3RvIHJlc3RhcnQ7CisJCQkJbGVuKys7CisJCQl9CisKKwkJCWlmIChzdWJ0eXBlID09IFZTUkVQTEFDRSkgeworCQkJCS8vYmJfZXJyb3JfbXNnKCJ0YWlsOiclcycsIHF1b3RlczoleCIsIGlkeCwgcXVvdGVzKTsKKwkJCQl3aGlsZSAoKmlkeCkgeworCQkJCQljaGFyICpyZXN0YXJ0X2RldGVjdCA9IHN0YWNrYmxvY2soKTsKKwkJCQkJU1RQVVRDKCppZHgsIGV4cGRlc3QpOworCQkJCQlpZiAoc3RhY2tibG9jaygpICE9IHJlc3RhcnRfZGV0ZWN0KQorCQkJCQkJZ290byByZXN0YXJ0OworCQkJCQlsZW4rKzsKKwkJCQkJaWR4Kys7CisJCQkJfQorCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogV2UndmUgcHV0IHRoZSByZXBsYWNlZCB0ZXh0IGludG8gYSBidWZmZXIgYXQgd29ya2xvYywgbm93CisJCSAqIG1vdmUgaXQgdG8gdGhlIHJpZ2h0IHBsYWNlIGFuZCBhZGp1c3QgdGhlIHN0YWNrLgorCQkgKi8KKwkJU1RQVVRDKCdcMCcsIGV4cGRlc3QpOworCQlzdGFydHAgPSAoY2hhciAqKXN0YWNrYmxvY2soKSArIHN0YXJ0bG9jOworCQltZW1tb3ZlKHN0YXJ0cCwgKGNoYXIgKilzdGFja2Jsb2NrKCkgKyB3b3JrbG9jLCBsZW4gKyAxKTsKKwkJLy9iYl9lcnJvcl9tc2coInN0YXJ0cDonJXMnIiwgc3RhcnRwKTsKKwkJYW1vdW50ID0gZXhwZGVzdCAtIChzdGFydHAgKyBsZW4pOworCQlTVEFESlVTVCgtYW1vdW50LCBleHBkZXN0KTsKKwkJcmV0dXJuIHN0YXJ0cDsKKwl9CisjZW5kaWYgLyogRU5BQkxFX0FTSF9CQVNIX0NPTVBBVCAqLworCisJc3VidHlwZSAtPSBWU1RSSU1SSUdIVDsKKyNpZiBERUJVRworCWlmIChzdWJ0eXBlIDwgMCB8fCBzdWJ0eXBlID4gNykKKwkJYWJvcnQoKTsKKyNlbmRpZgorCS8qIHplcm8gPSAoc3VidHlwZSA9PSBWU1RSSU1MRUZUIHx8IHN1YnR5cGUgPT0gVlNUUklNTEVGVE1BWCkgKi8KKwl6ZXJvID0gc3VidHlwZSA+PiAxOworCS8qIFZTVFJJTUxFRlQvVlNUUklNUklHSFRNQVggLT4gc2NhbmxlZnQgKi8KKwlzY2FuID0gKHN1YnR5cGUgJiAxKSBeIHplcm8gPyBzY2FubGVmdCA6IHNjYW5yaWdodDsKKworCWxvYyA9IHNjYW4oc3RhcnRwLCBybWVzYywgcm1lc2NlbmQsIHN0ciwgcXVvdGVzLCB6ZXJvKTsKKwlpZiAobG9jKSB7CisJCWlmICh6ZXJvKSB7CisJCQltZW1tb3ZlKHN0YXJ0cCwgbG9jLCBzdHIgLSBsb2MpOworCQkJbG9jID0gc3RhcnRwICsgKHN0ciAtIGxvYykgLSAxOworCQl9CisJCSpsb2MgPSAnXDAnOworCQlhbW91bnQgPSBsb2MgLSBleHBkZXN0OworCQlTVEFESlVTVChhbW91bnQsIGV4cGRlc3QpOworCX0KKwlyZXR1cm4gbG9jOworfQorCisvKgorICogQWRkIHRoZSB2YWx1ZSBvZiBhIHNwZWNpYWxpemVkIHZhcmlhYmxlIHRvIHRoZSBzdGFjayBzdHJpbmcuCisgKiBuYW1lIHBhcmFtZXRlciAoZXhhbXBsZXMpOgorICogYXNoIC1jICdlY2hvICQxJyAgICAgIG5hbWU6JzE9JworICogYXNoIC1jICdlY2hvICRxd2UnICAgIG5hbWU6J3F3ZT0nCisgKiBhc2ggLWMgJ2VjaG8gJCQnICAgICAgbmFtZTonJD0nCisgKiBhc2ggLWMgJ2VjaG8gJHskfScgICAgbmFtZTonJD0nCisgKiBhc2ggLWMgJ2VjaG8gJHskIyNxfScgbmFtZTonJD1xJworICogYXNoIC1jICdlY2hvICR7IyR9JyAgIG5hbWU6JyQ9JworICogbm90ZTogZXhhbXBsZXMgd2l0aCBiYWQgc2hlbGwgc3ludGF4OgorICogYXNoIC1jICdlY2hvICR7IyQxfScgIG5hbWU6JyQ9MScKKyAqIGFzaCAtYyAnZWNobyAkeyMxI30nICBuYW1lOicxPSMnCisgKi8KK3N0YXRpYyBOT0lOTElORSBzc2l6ZV90Cit2YXJ2YWx1ZShjaGFyICpuYW1lLCBpbnQgdmFyZmxhZ3MsIGludCBmbGFncywgc3RydWN0IHN0cmxpc3QgKnZhcl9zdHJfbGlzdCkKK3sKKwljb25zdCBjaGFyICpwOworCWludCBudW07CisJaW50IGk7CisJc3NpemVfdCBsZW4gPSAwOworCWludCBzZXA7CisJaW50IHF1b3RlZCA9IGZsYWdzICYgRVhQX1FVT1RFRDsKKwlpbnQgc3VidHlwZSA9IHZhcmZsYWdzICYgVlNUWVBFOworCWludCBkaXNjYXJkID0gc3VidHlwZSA9PSBWU1BMVVMgfHwgc3VidHlwZSA9PSBWU0xFTkdUSDsKKwlpbnQgcXVvdGVzID0gKGRpc2NhcmQgPyAwIDogKGZsYWdzICYgUVVPVEVTX0VTQykpIHwgUVVPVEVTX0tFRVBOVUw7CisJaW50IHN5bnRheCA9IHF1b3RlZCA/IERRU1lOVEFYIDogQkFTRVNZTlRBWDsKKworCXNlcCA9IHF1b3RlZCA/ICgoZmxhZ3MgJiBFWFBfRlVMTCkgPDwgQ0hBUl9CSVQpIDogMDsKKworCXN3aXRjaCAoKm5hbWUpIHsKKwljYXNlICckJzoKKwkJbnVtID0gcm9vdHBpZDsKKwkJZ290byBudW12YXI7CisJY2FzZSAnPyc6CisJCW51bSA9IGV4aXRzdGF0dXM7CisJCWdvdG8gbnVtdmFyOworCWNhc2UgJyMnOgorCQludW0gPSBzaGVsbHBhcmFtLm5wYXJhbTsKKwkJZ290byBudW12YXI7CisJY2FzZSAnISc6CisJCW51bSA9IGJhY2tnbmRwaWQ7CisJCWlmIChudW0gPT0gMCkKKwkJCXJldHVybiAtMTsKKyBudW12YXI6CisJCWxlbiA9IGN2dG51bShudW0pOworCQlnb3RvIGNoZWNrXzFjaGFyX25hbWU7CisJY2FzZSAnLSc6CisJCWV4cGRlc3QgPSBtYWtlc3Ryc3BhY2UoTk9QVFMsIGV4cGRlc3QpOworCQlmb3IgKGkgPSBOT1BUUyAtIDE7IGkgPj0gMDsgaS0tKSB7CisJCQlpZiAob3B0bGlzdFtpXSkgeworCQkJCVVTVFBVVEMob3B0bGV0dGVycyhpKSwgZXhwZGVzdCk7CisJCQkJbGVuKys7CisJCQl9CisJCX0KKyBjaGVja18xY2hhcl9uYW1lOgorI2lmIDAKKwkJLyogaGFuZGxlcyBjYXNlcyBzaW1pbGFyIHRvICR7IyQxfSAqLworCQlpZiAobmFtZVsyXSAhPSAnXDAnKQorCQkJcmFpc2VfZXJyb3Jfc3ludGF4KCJiYWQgc3Vic3RpdHV0aW9uIik7CisjZW5kaWYKKwkJYnJlYWs7CisJY2FzZSAnQCc6IHsKKwkJY2hhciAqKmFwOworCQljaGFyIHNlcGM7CisKKwkJaWYgKHF1b3RlZCAmJiAoZmxhZ3MgJiBFWFBfRlVMTCkpIHsKKwkJCS8qIG5vdGU6IHRoaXMgaXMgbm90IG1lYW50IGFzIFBFT0YgdmFsdWUgKi8KKwkJCXNlcCA9IDEgPDwgQ0hBUl9CSVQ7CisJCQlnb3RvIHBhcmFtOworCQl9CisJCS8qIGZhbGwgdGhyb3VnaCAqLworCWNhc2UgJyonOgorCQlzZXAgPSBpZnNzZXQoKSA/ICh1bnNpZ25lZCBjaGFyKShpZnN2YWwoKVswXSkgOiAnICc7CisgcGFyYW06CisJCWFwID0gc2hlbGxwYXJhbS5wOworCQlzZXBjID0gc2VwOworCQlpZiAoIWFwKQorCQkJcmV0dXJuIC0xOworCQl3aGlsZSAoKHAgPSAqYXArKykgIT0gTlVMTCkgeworCQkJbGVuICs9IHN0cnRvZGVzdChwLCBzeW50YXgsIHF1b3Rlcyk7CisKKwkJCWlmICgqYXAgJiYgc2VwKSB7CisJCQkJbGVuKys7CisJCQkJbWVtdG9kZXN0KCZzZXBjLCAxLCBzeW50YXgsIHF1b3Rlcyk7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJfSAvKiBjYXNlICdAJyBhbmQgJyonICovCisJY2FzZSAnMCc6CisJY2FzZSAnMSc6CisJY2FzZSAnMic6CisJY2FzZSAnMyc6CisJY2FzZSAnNCc6CisJY2FzZSAnNSc6CisJY2FzZSAnNic6CisJY2FzZSAnNyc6CisJY2FzZSAnOCc6CisJY2FzZSAnOSc6CisJCW51bSA9IGF0b2kobmFtZSk7IC8qIG51bWJlcihuYW1lKSBmYWlscyBvbiAke04jc3RyfSBldGMgKi8KKwkJaWYgKG51bSA8IDAgfHwgbnVtID4gc2hlbGxwYXJhbS5ucGFyYW0pCisJCQlyZXR1cm4gLTE7CisJCXAgPSBudW0gPyBzaGVsbHBhcmFtLnBbbnVtIC0gMV0gOiBhcmcwOworCQlnb3RvIHZhbHVlOworCWRlZmF1bHQ6CisJCS8qIE5COiBuYW1lIGhhcyBmb3JtICJWQVI9Li4uIiAqLworCisJCS8qICJBPWEgQj0kQSIgY2FzZTogdmFyX3N0cl9saXN0IGlzIGEgbGlzdCBvZiAiQT1hIiBzdHJpbmdzCisJCSAqIHdoaWNoIHNob3VsZCBiZSBjb25zaWRlcmVkIGJlZm9yZSB3ZSBjaGVjayB2YXJpYWJsZXMuICovCisJCWlmICh2YXJfc3RyX2xpc3QpIHsKKwkJCXVuc2lnbmVkIG5hbWVfbGVuID0gKHN0cmNocm51bChuYW1lLCAnPScpIC0gbmFtZSkgKyAxOworCQkJcCA9IE5VTEw7CisJCQlkbyB7CisJCQkJY2hhciAqc3RyLCAqZXE7CisJCQkJc3RyID0gdmFyX3N0cl9saXN0LT50ZXh0OworCQkJCWVxID0gc3RyY2hyKHN0ciwgJz0nKTsKKwkJCQlpZiAoIWVxKSAvKiBzdG9wIGF0IGZpcnN0IG5vbi1hc3NpZ25tZW50ICovCisJCQkJCWJyZWFrOworCQkJCWVxKys7CisJCQkJaWYgKG5hbWVfbGVuID09ICh1bnNpZ25lZCkoZXEgLSBzdHIpCisJCQkJICYmIHN0cm5jbXAoc3RyLCBuYW1lLCBuYW1lX2xlbikgPT0gMAorCQkJCSkgeworCQkJCQlwID0gZXE7CisJCQkJCS8qIGdvdG8gdmFsdWU7IC0gV1JPTkchICovCisJCQkJCS8qIHRoaW5rICJBPTEgQT0yIEI9JEEiICovCisJCQkJfQorCQkJCXZhcl9zdHJfbGlzdCA9IHZhcl9zdHJfbGlzdC0+bmV4dDsKKwkJCX0gd2hpbGUgKHZhcl9zdHJfbGlzdCk7CisJCQlpZiAocCkKKwkJCQlnb3RvIHZhbHVlOworCQl9CisJCXAgPSBsb29rdXB2YXIobmFtZSk7CisgdmFsdWU6CisJCWlmICghcCkKKwkJCXJldHVybiAtMTsKKworCQlsZW4gPSBzdHJ0b2Rlc3QocCwgc3ludGF4LCBxdW90ZXMpOworI2lmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwkJaWYgKHN1YnR5cGUgPT0gVlNMRU5HVEggJiYgbGVuID4gMCkgeworCQkJcmVpbml0X3VuaWNvZGVfZm9yX2FzaCgpOworCQkJaWYgKHVuaWNvZGVfc3RhdHVzID09IFVOSUNPREVfT04pIHsKKwkJCQlsZW4gPSB1bmljb2RlX3N0cmxlbihwKTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCWJyZWFrOworCX0KKworCWlmIChkaXNjYXJkKQorCQlTVEFESlVTVCgtbGVuLCBleHBkZXN0KTsKKwlyZXR1cm4gbGVuOworfQorCisvKgorICogRXhwYW5kIGEgdmFyaWFibGUsIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUKKyAqIGlucHV0IHN0cmluZy4KKyAqLworc3RhdGljIGNoYXIgKgorZXZhbHZhcihjaGFyICpwLCBpbnQgZmxhZ3MsIHN0cnVjdCBzdHJsaXN0ICp2YXJfc3RyX2xpc3QpCit7CisJY2hhciB2YXJmbGFnczsKKwljaGFyIHN1YnR5cGU7CisJaW50IHF1b3RlZDsKKwljaGFyIGVhc3k7CisJY2hhciAqdmFyOworCWludCBwYXRsb2M7CisJaW50IHN0YXJ0bG9jOworCXNzaXplX3QgdmFybGVuOworCisJdmFyZmxhZ3MgPSAodW5zaWduZWQgY2hhcikgKnArKzsKKwlzdWJ0eXBlID0gdmFyZmxhZ3MgJiBWU1RZUEU7CisJcXVvdGVkID0gZmxhZ3MgJiBFWFBfUVVPVEVEOworCXZhciA9IHA7CisJZWFzeSA9ICghcXVvdGVkIHx8ICgqdmFyID09ICdAJyAmJiBzaGVsbHBhcmFtLm5wYXJhbSkpOworCXN0YXJ0bG9jID0gZXhwZGVzdCAtIChjaGFyICopc3RhY2tibG9jaygpOworCXAgPSBzdHJjaHIocCwgJz0nKSArIDE7IC8vVE9ETzogdXNlIHZhcl9lbmQocCk/CisKKyBhZ2FpbjoKKwl2YXJsZW4gPSB2YXJ2YWx1ZSh2YXIsIHZhcmZsYWdzLCBmbGFncywgdmFyX3N0cl9saXN0KTsKKwlpZiAodmFyZmxhZ3MgJiBWU05VTCkKKwkJdmFybGVuLS07CisKKwlpZiAoc3VidHlwZSA9PSBWU1BMVVMpIHsKKwkJdmFybGVuID0gLTEgLSB2YXJsZW47CisJCWdvdG8gdnNwbHVzOworCX0KKworCWlmIChzdWJ0eXBlID09IFZTTUlOVVMpIHsKKyB2c3BsdXM6CisJCWlmICh2YXJsZW4gPCAwKSB7CisJCQlhcmdzdHIoCisJCQkJcCwKKwkJCQlmbGFncyB8IEVYUF9USUxERSB8IEVYUF9XT1JELAorCQkJCXZhcl9zdHJfbGlzdAorCQkJKTsKKwkJCWdvdG8gZW5kOworCQl9CisJCWlmIChlYXN5KQorCQkJZ290byByZWNvcmQ7CisJCWdvdG8gZW5kOworCX0KKworCWlmIChzdWJ0eXBlID09IFZTQVNTSUdOIHx8IHN1YnR5cGUgPT0gVlNRVUVTVElPTikgeworCQlpZiAodmFybGVuIDwgMCkgeworCQkJaWYgKHN1YmV2YWx2YXIocCwgdmFyLCAvKiBzdHJsb2M6ICovIDAsCisJCQkJCXN1YnR5cGUsIHN0YXJ0bG9jLCB2YXJmbGFncywKKwkJCQkJLyogcXVvdGVzOiAqLyBmbGFncyAmIH5RVU9URVNfRVNDLAorCQkJCQl2YXJfc3RyX2xpc3QpCisJCQkpIHsKKwkJCQl2YXJmbGFncyAmPSB+VlNOVUw7CisJCQkJLyoKKwkJCQkgKiBSZW1vdmUgYW55IHJlY29yZGVkIHJlZ2lvbnMgYmV5b25kCisJCQkJICogc3RhcnQgb2YgdmFyaWFibGUKKwkJCQkgKi8KKwkJCQlyZW1vdmVyZWNvcmRyZWdpb25zKHN0YXJ0bG9jKTsKKwkJCQlnb3RvIGFnYWluOworCQkJfQorCQkJZ290byBlbmQ7CisJCX0KKwkJaWYgKGVhc3kpCisJCQlnb3RvIHJlY29yZDsKKwkJZ290byBlbmQ7CisJfQorCisJaWYgKHZhcmxlbiA8IDAgJiYgdWZsYWcpCisJCXZhcnVuc2V0KHAsIHZhciwgMCwgMCk7CisKKwlpZiAoc3VidHlwZSA9PSBWU0xFTkdUSCkgeworCQljdnRudW0odmFybGVuID4gMCA/IHZhcmxlbiA6IDApOworCQlnb3RvIHJlY29yZDsKKwl9CisKKwlpZiAoc3VidHlwZSA9PSBWU05PUk1BTCkgeworCQlpZiAoZWFzeSkKKwkJCWdvdG8gcmVjb3JkOworCQlnb3RvIGVuZDsKKwl9CisKKyNpZiBERUJVRworCXN3aXRjaCAoc3VidHlwZSkgeworCWNhc2UgVlNUUklNTEVGVDoKKwljYXNlIFZTVFJJTUxFRlRNQVg6CisJY2FzZSBWU1RSSU1SSUdIVDoKKwljYXNlIFZTVFJJTVJJR0hUTUFYOgorI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwljYXNlIFZTU1VCU1RSOgorCWNhc2UgVlNSRVBMQUNFOgorCWNhc2UgVlNSRVBMQUNFQUxMOgorI2VuZGlmCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWFib3J0KCk7CisJfQorI2VuZGlmCisKKwlpZiAodmFybGVuID49IDApIHsKKwkJLyoKKwkJICogVGVybWluYXRlIHRoZSBzdHJpbmcgYW5kIHN0YXJ0IHJlY29yZGluZyB0aGUgcGF0dGVybgorCQkgKiByaWdodCBhZnRlciBpdAorCQkgKi8KKwkJU1RQVVRDKCdcMCcsIGV4cGRlc3QpOworCQlwYXRsb2MgPSBleHBkZXN0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCk7CisJCWlmIChOVUxMID09IHN1YmV2YWx2YXIocCwgLyogdmFybmFtZTogKi8gTlVMTCwgcGF0bG9jLCBzdWJ0eXBlLAorCQkJCXN0YXJ0bG9jLCB2YXJmbGFncywgZmxhZ3MsIHZhcl9zdHJfbGlzdCkpIHsKKwkJCWludCBhbW91bnQgPSBleHBkZXN0IC0gKAorCQkJCShjaGFyICopc3RhY2tibG9jaygpICsgcGF0bG9jIC0gMQorCQkJKTsKKwkJCVNUQURKVVNUKC1hbW91bnQsIGV4cGRlc3QpOworCQl9CisJCS8qIFJlbW92ZSBhbnkgcmVjb3JkZWQgcmVnaW9ucyBiZXlvbmQgc3RhcnQgb2YgdmFyaWFibGUgKi8KKwkJcmVtb3ZlcmVjb3JkcmVnaW9ucyhzdGFydGxvYyk7CisgcmVjb3JkOgorCQlyZWNvcmRyZWdpb24oc3RhcnRsb2MsIGV4cGRlc3QgLSAoY2hhciAqKXN0YWNrYmxvY2soKSwgcXVvdGVkKTsKKwl9CisKKyBlbmQ6CisJaWYgKHN1YnR5cGUgIT0gVlNOT1JNQUwpIHsgICAgICAvKiBza2lwIHRvIGVuZCBvZiBhbHRlcm5hdGl2ZSAqLworCQlpbnQgbmVzdGluZyA9IDE7CisJCWZvciAoOzspIHsKKwkJCXVuc2lnbmVkIGNoYXIgYyA9ICpwKys7CisJCQlpZiAoYyA9PSBDVExFU0MpCisJCQkJcCsrOworCQkJZWxzZSBpZiAoYyA9PSBDVExCQUNLUSkgeworCQkJCWlmICh2YXJsZW4gPj0gMCkKKwkJCQkJYXJnYmFja3EgPSBhcmdiYWNrcS0+bmV4dDsKKwkJCX0gZWxzZSBpZiAoYyA9PSBDVExWQVIpIHsKKwkJCQlpZiAoKCpwKysgJiBWU1RZUEUpICE9IFZTTk9STUFMKQorCQkJCQluZXN0aW5nKys7CisJCQl9IGVsc2UgaWYgKGMgPT0gQ1RMRU5EVkFSKSB7CisJCQkJaWYgKC0tbmVzdGluZyA9PSAwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcDsKK30KKworLyoKKyAqIEJyZWFrIHRoZSBhcmd1bWVudCBzdHJpbmcgaW50byBwaWVjZXMgYmFzZWQgdXBvbiBJRlMgYW5kIGFkZCB0aGUKKyAqIHN0cmluZ3MgdG8gdGhlIGFyZ3VtZW50IGxpc3QuICBUaGUgcmVnaW9ucyBvZiB0aGUgc3RyaW5nIHRvIGJlCisgKiBzZWFyY2hlZCBmb3IgSUZTIGNoYXJhY3RlcnMgaGF2ZSBiZWVuIHN0b3JlZCBieSByZWNvcmRyZWdpb24uCisgKi8KK3N0YXRpYyB2b2lkCitpZnNicmVha3VwKGNoYXIgKnN0cmluZywgc3RydWN0IGFyZ2xpc3QgKmFyZ2xpc3QpCit7CisJc3RydWN0IGlmc3JlZ2lvbiAqaWZzcDsKKwlzdHJ1Y3Qgc3RybGlzdCAqc3A7CisJY2hhciAqc3RhcnQ7CisJY2hhciAqcDsKKwljaGFyICpxOworCWNvbnN0IGNoYXIgKmlmcywgKnJlYWxpZnM7CisJaW50IGlmc3NwYzsKKwlpbnQgbnVsb25seTsKKworCXN0YXJ0ID0gc3RyaW5nOworCWlmIChpZnNsYXN0cCAhPSBOVUxMKSB7CisJCWlmc3NwYyA9IDA7CisJCW51bG9ubHkgPSAwOworCQlyZWFsaWZzID0gaWZzc2V0KCkgPyBpZnN2YWwoKSA6IGRlZmlmczsKKwkJaWZzcCA9ICZpZnNmaXJzdDsKKwkJZG8geworCQkJcCA9IHN0cmluZyArIGlmc3AtPmJlZ29mZjsKKwkJCW51bG9ubHkgPSBpZnNwLT5udWxvbmx5OworCQkJaWZzID0gbnVsb25seSA/IG51bGxzdHIgOiByZWFsaWZzOworCQkJaWZzc3BjID0gMDsKKwkJCXdoaWxlIChwIDwgc3RyaW5nICsgaWZzcC0+ZW5kb2ZmKSB7CisJCQkJcSA9IHA7CisJCQkJaWYgKCh1bnNpZ25lZCBjaGFyKSpwID09IENUTEVTQykKKwkJCQkJcCsrOworCQkJCWlmICghc3RyY2hyKGlmcywgKnApKSB7CisJCQkJCXArKzsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJCWlmICghbnVsb25seSkKKwkJCQkJaWZzc3BjID0gKHN0cmNocihkZWZpZnMsICpwKSAhPSBOVUxMKTsKKwkJCQkvKiBJZ25vcmUgSUZTIHdoaXRlc3BhY2UgYXQgc3RhcnQgKi8KKwkJCQlpZiAocSA9PSBzdGFydCAmJiBpZnNzcGMpIHsKKwkJCQkJcCsrOworCQkJCQlzdGFydCA9IHA7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQkqcSA9ICdcMCc7CisJCQkJc3AgPSBzdHphbGxvYyhzaXplb2YoKnNwKSk7CisJCQkJc3AtPnRleHQgPSBzdGFydDsKKwkJCQkqYXJnbGlzdC0+bGFzdHAgPSBzcDsKKwkJCQlhcmdsaXN0LT5sYXN0cCA9ICZzcC0+bmV4dDsKKwkJCQlwKys7CisJCQkJaWYgKCFudWxvbmx5KSB7CisJCQkJCWZvciAoOzspIHsKKwkJCQkJCWlmIChwID49IHN0cmluZyArIGlmc3AtPmVuZG9mZikgeworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJcSA9IHA7CisJCQkJCQlpZiAoKHVuc2lnbmVkIGNoYXIpKnAgPT0gQ1RMRVNDKQorCQkJCQkJCXArKzsKKwkJCQkJCWlmIChzdHJjaHIoaWZzLCAqcCkgPT0gTlVMTCkgeworCQkJCQkJCXAgPSBxOworCQkJCQkJCWJyZWFrOworCQkJCQkJfQorCQkJCQkJaWYgKHN0cmNocihkZWZpZnMsICpwKSA9PSBOVUxMKSB7CisJCQkJCQkJaWYgKGlmc3NwYykgeworCQkJCQkJCQlwKys7CisJCQkJCQkJCWlmc3NwYyA9IDA7CisJCQkJCQkJfSBlbHNlIHsKKwkJCQkJCQkJcCA9IHE7CisJCQkJCQkJCWJyZWFrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZQorCQkJCQkJCXArKzsKKwkJCQkJfQorCQkJCX0KKwkJCQlzdGFydCA9IHA7CisJCQl9IC8qIHdoaWxlICovCisJCQlpZnNwID0gaWZzcC0+bmV4dDsKKwkJfSB3aGlsZSAoaWZzcCAhPSBOVUxMKTsKKwkJaWYgKG51bG9ubHkpCisJCQlnb3RvIGFkZDsKKwl9CisKKwlpZiAoISpzdGFydCkKKwkJcmV0dXJuOworCisgYWRkOgorCXNwID0gc3R6YWxsb2Moc2l6ZW9mKCpzcCkpOworCXNwLT50ZXh0ID0gc3RhcnQ7CisJKmFyZ2xpc3QtPmxhc3RwID0gc3A7CisJYXJnbGlzdC0+bGFzdHAgPSAmc3AtPm5leHQ7Cit9CisKK3N0YXRpYyB2b2lkCitpZnNmcmVlKHZvaWQpCit7CisJc3RydWN0IGlmc3JlZ2lvbiAqcDsKKworCUlOVF9PRkY7CisJcCA9IGlmc2ZpcnN0Lm5leHQ7CisJZG8geworCQlzdHJ1Y3QgaWZzcmVnaW9uICppZnNwOworCQlpZnNwID0gcC0+bmV4dDsKKwkJZnJlZShwKTsKKwkJcCA9IGlmc3A7CisJfSB3aGlsZSAocCk7CisJaWZzbGFzdHAgPSBOVUxMOworCWlmc2ZpcnN0Lm5leHQgPSBOVUxMOworCUlOVF9PTjsKK30KKworLyoKKyAqIEFkZCBhIGZpbGUgbmFtZSB0byB0aGUgbGlzdC4KKyAqLworc3RhdGljIHZvaWQKK2FkZGZuYW1lKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHN0cmxpc3QgKnNwOworCisJc3AgPSBzdHphbGxvYyhzaXplb2YoKnNwKSk7CisJc3AtPnRleHQgPSBzdHN0cmR1cChuYW1lKTsKKwkqZXhwYXJnLmxhc3RwID0gc3A7CisJZXhwYXJnLmxhc3RwID0gJnNwLT5uZXh0OworfQorCisvKgorICogRG8gbWV0YWNoYXJhY3RlciAoaS5lLiAqLCA/LCBbLi4uXSkgZXhwYW5zaW9uLgorICovCitzdGF0aWMgdm9pZAorZXhwbWV0YShjaGFyICpleHBkaXIsIGNoYXIgKmVuZGRpciwgY2hhciAqbmFtZSkKK3sKKwljaGFyICpwOworCWNvbnN0IGNoYXIgKmNwOworCWNoYXIgKnN0YXJ0OworCWNoYXIgKmVuZG5hbWU7CisJaW50IG1ldGFmbGFnOworCXN0cnVjdCBzdGF0IHN0YXRiOworCURJUiAqZGlycDsKKwlzdHJ1Y3QgZGlyZW50ICpkcDsKKwlpbnQgYXRlbmQ7CisJaW50IG1hdGNoZG90OworCWludCBlc2M7CisKKwltZXRhZmxhZyA9IDA7CisJc3RhcnQgPSBuYW1lOworCWZvciAocCA9IG5hbWU7IGVzYyA9IDAsICpwOyBwICs9IGVzYyArIDEpIHsKKwkJaWYgKCpwID09ICcqJyB8fCAqcCA9PSAnPycpCisJCQltZXRhZmxhZyA9IDE7CisJCWVsc2UgaWYgKCpwID09ICdbJykgeworCQkJY2hhciAqcSA9IHAgKyAxOworCQkJaWYgKCpxID09ICchJykKKwkJCQlxKys7CisJCQlmb3IgKDs7KSB7CisJCQkJaWYgKCpxID09ICdcXCcpCisJCQkJCXErKzsKKwkJCQlpZiAoKnEgPT0gJy8nIHx8ICpxID09ICdcMCcpCisJCQkJCWJyZWFrOworCQkJCWlmICgqKytxID09ICddJykgeworCQkJCQltZXRhZmxhZyA9IDE7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmICgqcCA9PSAnXFwnKQorCQkJCWVzYysrOworCQkJaWYgKHBbZXNjXSA9PSAnLycpIHsKKwkJCQlpZiAobWV0YWZsYWcpCisJCQkJCWJyZWFrOworCQkJCXN0YXJ0ID0gcCArIGVzYyArIDE7CisJCQl9CisJCX0KKwl9CisJaWYgKG1ldGFmbGFnID09IDApIHsgICAgLyogd2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBmaWxlIG5hbWUgKi8KKwkJaWYgKGVuZGRpciAhPSBleHBkaXIpCisJCQltZXRhZmxhZysrOworCQlwID0gbmFtZTsKKwkJZG8geworCQkJaWYgKCpwID09ICdcXCcpCisJCQkJcCsrOworCQkJKmVuZGRpcisrID0gKnA7CisJCX0gd2hpbGUgKCpwKyspOworCQlpZiAobWV0YWZsYWcgPT0gMCB8fCBsc3RhdChleHBkaXIsICZzdGF0YikgPj0gMCkKKwkJCWFkZGZuYW1lKGV4cGRpcik7CisJCXJldHVybjsKKwl9CisJZW5kbmFtZSA9IHA7CisJaWYgKG5hbWUgPCBzdGFydCkgeworCQlwID0gbmFtZTsKKwkJZG8geworCQkJaWYgKCpwID09ICdcXCcpCisJCQkJcCsrOworCQkJKmVuZGRpcisrID0gKnArKzsKKwkJfSB3aGlsZSAocCA8IHN0YXJ0KTsKKwl9CisJaWYgKGVuZGRpciA9PSBleHBkaXIpIHsKKwkJY3AgPSAiLiI7CisJfSBlbHNlIGlmIChlbmRkaXIgPT0gZXhwZGlyICsgMSAmJiAqZXhwZGlyID09ICcvJykgeworCQljcCA9ICIvIjsKKwl9IGVsc2UgeworCQljcCA9IGV4cGRpcjsKKwkJZW5kZGlyWy0xXSA9ICdcMCc7CisJfQorCWRpcnAgPSBvcGVuZGlyKGNwKTsKKwlpZiAoZGlycCA9PSBOVUxMKQorCQlyZXR1cm47CisJaWYgKGVuZGRpciAhPSBleHBkaXIpCisJCWVuZGRpclstMV0gPSAnLyc7CisJaWYgKCplbmRuYW1lID09IDApIHsKKwkJYXRlbmQgPSAxOworCX0gZWxzZSB7CisJCWF0ZW5kID0gMDsKKwkJKmVuZG5hbWUgPSAnXDAnOworCQllbmRuYW1lICs9IGVzYyArIDE7CisJfQorCW1hdGNoZG90ID0gMDsKKwlwID0gc3RhcnQ7CisJaWYgKCpwID09ICdcXCcpCisJCXArKzsKKwlpZiAoKnAgPT0gJy4nKQorCQltYXRjaGRvdCsrOworCXdoaWxlICghcGVuZGluZ19pbnQgJiYgKGRwID0gcmVhZGRpcihkaXJwKSkgIT0gTlVMTCkgeworCQlpZiAoZHAtPmRfbmFtZVswXSA9PSAnLicgJiYgIW1hdGNoZG90KQorCQkJY29udGludWU7CisJCWlmIChwbWF0Y2goc3RhcnQsIGRwLT5kX25hbWUpKSB7CisJCQlpZiAoYXRlbmQpIHsKKwkJCQlzdHJjcHkoZW5kZGlyLCBkcC0+ZF9uYW1lKTsKKwkJCQlhZGRmbmFtZShleHBkaXIpOworCQkJfSBlbHNlIHsKKwkJCQlmb3IgKHAgPSBlbmRkaXIsIGNwID0gZHAtPmRfbmFtZTsgKCpwKysgPSAqY3ArKykgIT0gJ1wwJzspCisJCQkJCWNvbnRpbnVlOworCQkJCXBbLTFdID0gJy8nOworCQkJCWV4cG1ldGEoZXhwZGlyLCBwLCBlbmRuYW1lKTsKKwkJCX0KKwkJfQorCX0KKwljbG9zZWRpcihkaXJwKTsKKwlpZiAoIWF0ZW5kKQorCQllbmRuYW1lWy1lc2MgLSAxXSA9IGVzYyA/ICdcXCcgOiAnLyc7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3RybGlzdCAqCittc29ydChzdHJ1Y3Qgc3RybGlzdCAqbGlzdCwgaW50IGxlbikKK3sKKwlzdHJ1Y3Qgc3RybGlzdCAqcCwgKnEgPSBOVUxMOworCXN0cnVjdCBzdHJsaXN0ICoqbHBwOworCWludCBoYWxmOworCWludCBuOworCisJaWYgKGxlbiA8PSAxKQorCQlyZXR1cm4gbGlzdDsKKwloYWxmID0gbGVuID4+IDE7CisJcCA9IGxpc3Q7CisJZm9yIChuID0gaGFsZjsgLS1uID49IDA7KSB7CisJCXEgPSBwOworCQlwID0gcC0+bmV4dDsKKwl9CisJcS0+bmV4dCA9IE5VTEw7ICAgICAgICAgICAgICAgICAvKiB0ZXJtaW5hdGUgZmlyc3QgaGFsZiBvZiBsaXN0ICovCisJcSA9IG1zb3J0KGxpc3QsIGhhbGYpOyAgICAgICAgICAvKiBzb3J0IGZpcnN0IGhhbGYgb2YgbGlzdCAqLworCXAgPSBtc29ydChwLCBsZW4gLSBoYWxmKTsgICAgICAgICAgICAgICAvKiBzb3J0IHNlY29uZCBoYWxmICovCisJbHBwID0gJmxpc3Q7CisJZm9yICg7OykgeworI2lmIEVOQUJMRV9MT0NBTEVfU1VQUE9SVAorCQlpZiAoc3RyY29sbChwLT50ZXh0LCBxLT50ZXh0KSA8IDApCisjZWxzZQorCQlpZiAoc3RyY21wKHAtPnRleHQsIHEtPnRleHQpIDwgMCkKKyNlbmRpZgorCQkJCQkJeworCQkJKmxwcCA9IHA7CisJCQlscHAgPSAmcC0+bmV4dDsKKwkJCXAgPSAqbHBwOworCQkJaWYgKHAgPT0gTlVMTCkgeworCQkJCSpscHAgPSBxOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJKmxwcCA9IHE7CisJCQlscHAgPSAmcS0+bmV4dDsKKwkJCXEgPSAqbHBwOworCQkJaWYgKHEgPT0gTlVMTCkgeworCQkJCSpscHAgPSBwOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCXJldHVybiBsaXN0OworfQorCisvKgorICogU29ydCB0aGUgcmVzdWx0cyBvZiBmaWxlIG5hbWUgZXhwYW5zaW9uLiAgSXQgY2FsY3VsYXRlcyB0aGUgbnVtYmVyIG9mCisgKiBzdHJpbmdzIHRvIHNvcnQgYW5kIHRoZW4gY2FsbHMgbXNvcnQgKHNob3J0IGZvciBtZXJnZSBzb3J0KSB0byBkbyB0aGUKKyAqIHdvcmsuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgc3RybGlzdCAqCitleHBzb3J0KHN0cnVjdCBzdHJsaXN0ICpzdHIpCit7CisJaW50IGxlbjsKKwlzdHJ1Y3Qgc3RybGlzdCAqc3A7CisKKwlsZW4gPSAwOworCWZvciAoc3AgPSBzdHI7IHNwOyBzcCA9IHNwLT5uZXh0KQorCQlsZW4rKzsKKwlyZXR1cm4gbXNvcnQoc3RyLCBsZW4pOworfQorCitzdGF0aWMgdm9pZAorZXhwYW5kbWV0YShzdHJ1Y3Qgc3RybGlzdCAqc3RyIC8qLCBpbnQgZmxhZyovKQoreworCXN0YXRpYyBjb25zdCBjaGFyIG1ldGFjaGFyc1tdIEFMSUdOMSA9IHsKKwkJJyonLCAnPycsICdbJywgMAorCX07CisJLyogVE9ETyAtIEVYUF9SRURJUiAqLworCisJd2hpbGUgKHN0cikgeworCQljaGFyICpleHBkaXI7CisJCXN0cnVjdCBzdHJsaXN0ICoqc2F2ZWxhc3RwOworCQlzdHJ1Y3Qgc3RybGlzdCAqc3A7CisJCWNoYXIgKnA7CisKKwkJaWYgKGZmbGFnKQorCQkJZ290byBub21ldGE7CisJCWlmICghc3RycGJyayhzdHItPnRleHQsIG1ldGFjaGFycykpCisJCQlnb3RvIG5vbWV0YTsKKwkJc2F2ZWxhc3RwID0gZXhwYXJnLmxhc3RwOworCisJCUlOVF9PRkY7CisJCXAgPSBwcmVnbG9iKHN0ci0+dGV4dCwgUk1FU0NBUEVfQUxMT0MgfCBSTUVTQ0FQRV9IRUFQKTsKKwkJeworCQkJaW50IGkgPSBzdHJsZW4oc3RyLT50ZXh0KTsKKwkJCWV4cGRpciA9IGNrbWFsbG9jKGkgPCAyMDQ4ID8gMjA0OCA6IGkpOyAvKiBYWFggKi8KKwkJfQorCQlleHBtZXRhKGV4cGRpciwgZXhwZGlyLCBwKTsKKwkJZnJlZShleHBkaXIpOworCQlpZiAocCAhPSBzdHItPnRleHQpCisJCQlmcmVlKHApOworCQlJTlRfT047CisJCWlmIChleHBhcmcubGFzdHAgPT0gc2F2ZWxhc3RwKSB7CisJCQkvKgorCQkJICogbm8gbWF0Y2hlcworCQkJICovCisgbm9tZXRhOgorCQkJKmV4cGFyZy5sYXN0cCA9IHN0cjsKKwkJCXJtZXNjYXBlcyhzdHItPnRleHQsIDApOworCQkJZXhwYXJnLmxhc3RwID0gJnN0ci0+bmV4dDsKKwkJfSBlbHNlIHsKKwkJCSpleHBhcmcubGFzdHAgPSBOVUxMOworCQkJKnNhdmVsYXN0cCA9IHNwID0gZXhwc29ydCgqc2F2ZWxhc3RwKTsKKwkJCXdoaWxlIChzcC0+bmV4dCAhPSBOVUxMKQorCQkJCXNwID0gc3AtPm5leHQ7CisJCQlleHBhcmcubGFzdHAgPSAmc3AtPm5leHQ7CisJCX0KKwkJc3RyID0gc3RyLT5uZXh0OworCX0KK30KKworLyoKKyAqIFBlcmZvcm0gdmFyaWFibGUgc3Vic3RpdHV0aW9uIGFuZCBjb21tYW5kIHN1YnN0aXR1dGlvbiBvbiBhbiBhcmd1bWVudCwKKyAqIHBsYWNpbmcgdGhlIHJlc3VsdGluZyBsaXN0IG9mIGFyZ3VtZW50cyBpbiBhcmdsaXN0LiAgSWYgRVhQX0ZVTEwgaXMgdHJ1ZSwKKyAqIHBlcmZvcm0gc3BsaXR0aW5nIGFuZCBmaWxlIG5hbWUgZXhwYW5zaW9uLiAgV2hlbiBhcmdsaXN0IGlzIE5VTEwsIHBlcmZvcm0KKyAqIGhlcmUgZG9jdW1lbnQgZXhwYW5zaW9uLgorICovCitzdGF0aWMgdm9pZAorZXhwYW5kYXJnKHVuaW9uIG5vZGUgKmFyZywgc3RydWN0IGFyZ2xpc3QgKmFyZ2xpc3QsIGludCBmbGFnKQoreworCXN0cnVjdCBzdHJsaXN0ICpzcDsKKwljaGFyICpwOworCisJYXJnYmFja3EgPSBhcmctPm5hcmcuYmFja3F1b3RlOworCVNUQVJUU1RBQ0tTVFIoZXhwZGVzdCk7CisJaWZzZmlyc3QubmV4dCA9IE5VTEw7CisJaWZzbGFzdHAgPSBOVUxMOworCVRSQUNFKCgiZXhwYW5kYXJnOiBhcmdzdHIoJyVzJyxmbGFnczoleClcbiIsIGFyZy0+bmFyZy50ZXh0LCBmbGFnKSk7CisJYXJnc3RyKGFyZy0+bmFyZy50ZXh0LCBmbGFnLAorCQkJLyogdmFyX3N0cl9saXN0OiAqLyBhcmdsaXN0ID8gYXJnbGlzdC0+bGlzdCA6IE5VTEwpOworCXAgPSBfU1RQVVRDKCdcMCcsIGV4cGRlc3QpOworCWV4cGRlc3QgPSBwIC0gMTsKKwlpZiAoYXJnbGlzdCA9PSBOVUxMKSB7CisJCXJldHVybjsgICAgICAgICAgICAgICAgIC8qIGhlcmUgZG9jdW1lbnQgZXhwYW5kZWQgKi8KKwl9CisJcCA9IGdyYWJzdGFja3N0cihwKTsKKwlUUkFDRSgoImV4cGFuZGFyZzogcDonJXMnXG4iLCBwKSk7CisJZXhwYXJnLmxhc3RwID0gJmV4cGFyZy5saXN0OworCS8qCisJICogVE9ETyAtIEVYUF9SRURJUgorCSAqLworCWlmIChmbGFnICYgRVhQX0ZVTEwpIHsKKwkJaWZzYnJlYWt1cChwLCAmZXhwYXJnKTsKKwkJKmV4cGFyZy5sYXN0cCA9IE5VTEw7CisJCWV4cGFyZy5sYXN0cCA9ICZleHBhcmcubGlzdDsKKwkJZXhwYW5kbWV0YShleHBhcmcubGlzdCAvKiwgZmxhZyovKTsKKwl9IGVsc2UgeworCQlpZiAoZmxhZyAmIEVYUF9SRURJUikgeyAvKlhYWCAtIGZvciBub3csIGp1c3QgcmVtb3ZlIGVzY2FwZXMgKi8KKwkJCXJtZXNjYXBlcyhwLCAwKTsKKwkJCVRSQUNFKCgiZXhwYW5kYXJnOiBybWVzY2FwZXM6JyVzJ1xuIiwgcCkpOworCQl9CisJCXNwID0gc3R6YWxsb2Moc2l6ZW9mKCpzcCkpOworCQlzcC0+dGV4dCA9IHA7CisJCSpleHBhcmcubGFzdHAgPSBzcDsKKwkJZXhwYXJnLmxhc3RwID0gJnNwLT5uZXh0OworCX0KKwlpZiAoaWZzZmlyc3QubmV4dCkKKwkJaWZzZnJlZSgpOworCSpleHBhcmcubGFzdHAgPSBOVUxMOworCWlmIChleHBhcmcubGlzdCkgeworCQkqYXJnbGlzdC0+bGFzdHAgPSBleHBhcmcubGlzdDsKKwkJYXJnbGlzdC0+bGFzdHAgPSBleHBhcmcubGFzdHA7CisJfQorfQorCisvKgorICogRXhwYW5kIHNoZWxsIHZhcmlhYmxlcyBhbmQgYmFja3F1b3RlcyBpbnNpZGUgYSBoZXJlIGRvY3VtZW50LgorICovCitzdGF0aWMgdm9pZAorZXhwYW5kaGVyZSh1bmlvbiBub2RlICphcmcsIGludCBmZCkKK3sKKwloZXJlZmQgPSBmZDsKKwlleHBhbmRhcmcoYXJnLCAoc3RydWN0IGFyZ2xpc3QgKilOVUxMLCBFWFBfUVVPVEVEKTsKKwlmdWxsX3dyaXRlKGZkLCBzdGFja2Jsb2NrKCksIGV4cGRlc3QgLSAoY2hhciAqKXN0YWNrYmxvY2soKSk7Cit9CisKKy8qCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHBhdHRlcm4gbWF0Y2hlcyB0aGUgc3RyaW5nLgorICovCitzdGF0aWMgaW50CitwYXRtYXRjaChjaGFyICpwYXR0ZXJuLCBjb25zdCBjaGFyICpzdHJpbmcpCit7CisJcmV0dXJuIHBtYXRjaChwcmVnbG9iKHBhdHRlcm4sIDApLCBzdHJpbmcpOworfQorCisvKgorICogU2VlIGlmIGEgcGF0dGVybiBtYXRjaGVzIGluIGEgY2FzZSBzdGF0ZW1lbnQuCisgKi8KK3N0YXRpYyBpbnQKK2Nhc2VtYXRjaCh1bmlvbiBub2RlICpwYXR0ZXJuLCBjaGFyICp2YWwpCit7CisJc3RydWN0IHN0YWNrbWFyayBzbWFyazsKKwlpbnQgcmVzdWx0OworCisJc2V0c3RhY2ttYXJrKCZzbWFyayk7CisJYXJnYmFja3EgPSBwYXR0ZXJuLT5uYXJnLmJhY2txdW90ZTsKKwlTVEFSVFNUQUNLU1RSKGV4cGRlc3QpOworCWlmc2xhc3RwID0gTlVMTDsKKwlhcmdzdHIocGF0dGVybi0+bmFyZy50ZXh0LCBFWFBfVElMREUgfCBFWFBfQ0FTRSwKKwkJCS8qIHZhcl9zdHJfbGlzdDogKi8gTlVMTCk7CisJU1RBQ0tTVFJOVUwoZXhwZGVzdCk7CisJcmVzdWx0ID0gcGF0bWF0Y2goc3RhY2tibG9jaygpLCB2YWwpOworCXBvcHN0YWNrbWFyaygmc21hcmspOworCXJldHVybiByZXN1bHQ7Cit9CisKKworLyogPT09PT09PT09PT09IGZpbmRfY29tbWFuZCAqLworCitzdHJ1Y3QgYnVpbHRpbmNtZCB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCpidWlsdGluKShpbnQsIGNoYXIgKiopIEZBU1RfRlVOQzsKKwkvKiB1bnNpZ25lZCBmbGFnczsgKi8KK307CisjZGVmaW5lIElTX0JVSUxUSU5fU1BFQ0lBTChiKSAoKGIpLT5uYW1lWzBdICYgMSkKKy8qICJyZWd1bGFyIiBidWlsdGlucyBhbHdheXMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgY29tbWFuZHMsCisgKiByZWdhcmRsZXNzIG9mIFBBVEg9Li4uLiVidWlsdGluLi4uIHBvc2l0aW9uICovCisjZGVmaW5lIElTX0JVSUxUSU5fUkVHVUxBUihiKSAoKGIpLT5uYW1lWzBdICYgMikKKyNkZWZpbmUgSVNfQlVJTFRJTl9BU1NJR04oYikgICgoYiktPm5hbWVbMF0gJiA0KQorCitzdHJ1Y3QgY21kZW50cnkgeworCXNtYWxsaW50IGNtZHR5cGU7ICAgICAgIC8qIENNRHh4eCAqLworCXVuaW9uIHBhcmFtIHsKKwkJaW50IGluZGV4OworCQkvKiBpbmRleCA+PSAwIGZvciBjb21tYW5kcyB3aXRob3V0IHBhdGggKHNsYXNoZXMpICovCisJCS8qIChUT0RPOiB3aGF0IGV4YWN0bHkgZG9lcyB0aGUgdmFsdWUgbWVhbj8gUEFUSCBwb3NpdGlvbj8pICovCisJCS8qIGluZGV4ID09IC0xIGZvciBjb21tYW5kcyB3aXRoIHNsYXNoZXMgKi8KKwkJLyogaW5kZXggPT0gKC0yIC0gYXBwbGV0X25vKSBmb3IgTk9GT1JLIGFwcGxldHMgKi8KKwkJY29uc3Qgc3RydWN0IGJ1aWx0aW5jbWQgKmNtZDsKKwkJc3RydWN0IGZ1bmNub2RlICpmdW5jOworCX0gdTsKK307CisvKiB2YWx1ZXMgb2YgY21kdHlwZSAqLworI2RlZmluZSBDTURVTktOT1dOICAgICAgLTEgICAgICAvKiBubyBlbnRyeSBpbiB0YWJsZSBmb3IgY29tbWFuZCAqLworI2RlZmluZSBDTUROT1JNQUwgICAgICAgMCAgICAgICAvKiBjb21tYW5kIGlzIGFuIGV4ZWN1dGFibGUgcHJvZ3JhbSAqLworI2RlZmluZSBDTURGVU5DVElPTiAgICAgMSAgICAgICAvKiBjb21tYW5kIGlzIGEgc2hlbGwgZnVuY3Rpb24gKi8KKyNkZWZpbmUgQ01EQlVJTFRJTiAgICAgIDIgICAgICAgLyogY29tbWFuZCBpcyBhIHNoZWxsIGJ1aWx0aW4gKi8KKworLyogYWN0aW9uIHRvIGZpbmRfY29tbWFuZCgpICovCisjZGVmaW5lIERPX0VSUiAgICAgICAgICAweDAxICAgIC8qIHByaW50cyBlcnJvcnMgKi8KKyNkZWZpbmUgRE9fQUJTICAgICAgICAgIDB4MDIgICAgLyogY2hlY2tzIGFic29sdXRlIHBhdGhzICovCisjZGVmaW5lIERPX05PRlVOQyAgICAgICAweDA0ICAgIC8qIGRvbid0IHJldHVybiBzaGVsbCBmdW5jdGlvbnMsIGZvciBjb21tYW5kICovCisjZGVmaW5lIERPX0FMVFBBVEggICAgICAweDA4ICAgIC8qIHVzaW5nIGFsdGVybmF0ZSBwYXRoICovCisjZGVmaW5lIERPX0FMVEJMVElOICAgICAweDIwICAgIC8qICVidWlsdGluIGluIGFsdC4gcGF0aCAqLworCitzdGF0aWMgdm9pZCBmaW5kX2NvbW1hbmQoY2hhciAqLCBzdHJ1Y3QgY21kZW50cnkgKiwgaW50LCBjb25zdCBjaGFyICopOworCisKKy8qID09PT09PT09PT09PSBIYXNoaW5nIGNvbW1hbmRzICovCisKKy8qCisgKiBXaGVuIGNvbW1hbmRzIGFyZSBmaXJzdCBlbmNvdW50ZXJlZCwgdGhleSBhcmUgZW50ZXJlZCBpbiBhIGhhc2ggdGFibGUuCisgKiBUaGlzIGVuc3VyZXMgdGhhdCBhIGZ1bGwgcGF0aCBzZWFyY2ggd2lsbCBub3QgaGF2ZSB0byBiZSBkb25lIGZvciB0aGVtCisgKiBvbiBlYWNoIGludm9jYXRpb24uCisgKgorICogV2Ugc2hvdWxkIGludmVzdGlnYXRlIGNvbnZlcnRpbmcgdG8gYSBsaW5lYXIgc2VhcmNoLCBldmVuIHRob3VnaCB0aGF0CisgKiB3b3VsZCBtYWtlIHRoZSBjb21tYW5kIG5hbWUgImhhc2giIGEgbWlzbm9tZXIuCisgKi8KKworc3RydWN0IHRibGVudHJ5IHsKKwlzdHJ1Y3QgdGJsZW50cnkgKm5leHQ7ICAvKiBuZXh0IGVudHJ5IGluIGhhc2ggY2hhaW4gKi8KKwl1bmlvbiBwYXJhbSBwYXJhbTsgICAgICAvKiBkZWZpbml0aW9uIG9mIGJ1aWx0aW4gZnVuY3Rpb24gKi8KKwlzbWFsbGludCBjbWR0eXBlOyAgICAgICAvKiBDTUR4eHggKi8KKwljaGFyIHJlaGFzaDsgICAgICAgICAgICAvKiBpZiBzZXQsIGNkIGRvbmUgc2luY2UgZW50cnkgY3JlYXRlZCAqLworCWNoYXIgY21kbmFtZVsxXTsgICAgICAgIC8qIG5hbWUgb2YgY29tbWFuZCAqLworfTsKKworc3RhdGljIHN0cnVjdCB0YmxlbnRyeSAqKmNtZHRhYmxlOworI2RlZmluZSBJTklUX0dfY21kdGFibGUoKSBkbyB7IFwKKwljbWR0YWJsZSA9IHh6YWxsb2MoQ01EVEFCTEVTSVpFICogc2l6ZW9mKGNtZHRhYmxlWzBdKSk7IFwKK30gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQgYnVpbHRpbmxvYyA9IC0xOyAgICAgLyogaW5kZXggaW4gcGF0aCBvZiAlYnVpbHRpbiwgb3IgLTEgKi8KKworCitzdGF0aWMgdm9pZAordHJ5ZXhlYyhJRl9GRUFUVVJFX1NIX1NUQU5EQUxPTkUoaW50IGFwcGxldF9ubywpIGNoYXIgKmNtZCwgY2hhciAqKmFyZ3YsIGNoYXIgKiplbnZwKQoreworI2lmIEVOQUJMRV9GRUFUVVJFX1NIX1NUQU5EQUxPTkUKKwlpZiAoYXBwbGV0X25vID49IDApIHsKKwkJaWYgKEFQUExFVF9JU19OT0VYRUMoYXBwbGV0X25vKSkgeworCQkJY2xlYXJlbnYoKTsKKwkJCXdoaWxlICgqZW52cCkKKwkJCQlwdXRlbnYoKmVudnArKyk7CisJCQlydW5fYXBwbGV0X25vX2FuZF9leGl0KGFwcGxldF9ubywgYXJndik7CisJCX0KKwkJLyogcmUtZXhlYyBvdXJzZWx2ZXMgd2l0aCB0aGUgbmV3IGFyZ3VtZW50cyAqLworCQlleGVjdmUoYmJfYnVzeWJveF9leGVjX3BhdGgsIGFyZ3YsIGVudnApOworCQkvKiBJZiB0aGV5IGNhbGxlZCBjaHJvb3Qgb3Igb3RoZXJ3aXNlIG1hZGUgdGhlIGJpbmFyeSBubyBsb25nZXIKKwkJICogZXhlY3V0YWJsZSwgZmFsbCB0aHJvdWdoICovCisJfQorI2VuZGlmCisKKyByZXBlYXQ6CisjaWZkZWYgU1lTVgorCWRvIHsKKwkJZXhlY3ZlKGNtZCwgYXJndiwgZW52cCk7CisJfSB3aGlsZSAoZXJybm8gPT0gRUlOVFIpOworI2Vsc2UKKwlleGVjdmUoY21kLCBhcmd2LCBlbnZwKTsKKyNlbmRpZgorCWlmIChjbWQgPT0gKGNoYXIqKSBiYl9idXN5Ym94X2V4ZWNfcGF0aCkgeworCQkvKiBXZSBhbHJlYWR5IHZpc2l0ZWQgRU5PRVhFQyBicmFuY2ggYmVsb3csIGRvbid0IGRvIGl0IGFnYWluICovCisvL1RPRE86IHRyeSBleGVjdmUoaW5pdGlhbF9hcmd2MF9vZl9zaGVsbCwgYXJndiwgZW52cCkgYmVmb3JlIGdpdmluZyB1cD8KKwkJZnJlZShhcmd2KTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZXJybm8gPT0gRU5PRVhFQykgeworCQkvKiBSdW4gImNtZCIgYXMgYSBzaGVsbCBzY3JpcHQ6CisJCSAqIGh0dHA6Ly9wdWJzLm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9WM19jaGFwMDIuaHRtbAorCQkgKiAiSWYgdGhlIGV4ZWN2ZSgpIGZ1bmN0aW9uIGZhaWxzIHdpdGggRU5PRVhFQywgdGhlIHNoZWxsCisJCSAqIHNoYWxsIGV4ZWN1dGUgYSBjb21tYW5kIGVxdWl2YWxlbnQgdG8gaGF2aW5nIGEgc2hlbGwgaW52b2tlZAorCQkgKiB3aXRoIHRoZSBjb21tYW5kIG5hbWUgYXMgaXRzIGZpcnN0IG9wZXJhbmQsCisJCSAqIHdpdGggYW55IHJlbWFpbmluZyBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBuZXcgc2hlbGwiCisJCSAqCisJCSAqIFRoYXQgaXMsIGRvIG5vdCB1c2UgJFNIRUxMLCB1c2VyJ3Mgc2hlbGwsIG9yIC9iaW4vc2g7CisJCSAqIGp1c3QgY2FsbCBvdXJzZWx2ZXMuCisJCSAqCisJCSAqIE5vdGUgdGhhdCBiYXNoIHJlYWRzIH44MCBjaGFycyBvZiB0aGUgZmlsZSwgYW5kIGlmIGl0IHNlZXMKKwkJICogYSB6ZXJvIGJ5dGUgYmVmb3JlIGl0IHNlZXMgbmV3bGluZSwgaXQgZG9lc24ndCB0cnkgdG8KKwkJICogaW50ZXJwcmV0IGl0LCBidXQgZmFpbHMgd2l0aCAiY2Fubm90IGV4ZWN1dGUgYmluYXJ5IGZpbGUiCisJCSAqIG1lc3NhZ2UgYW5kIGV4aXQgY29kZSAxMjYuIEZvciBvbmUsIHRoaXMgcHJldmVudHMgYXR0ZW1wdHMKKwkJICogdG8gaW50ZXJwcmV0IGZvcmVpZ24gRUxGIGJpbmFyaWVzIGFzIHNoZWxsIHNjcmlwdHMuCisJCSAqLworCQljaGFyICoqYXA7CisJCWNoYXIgKipuZXc7CisKKwkJZm9yIChhcCA9IGFyZ3Y7ICphcDsgYXArKykKKwkJCWNvbnRpbnVlOworCQluZXcgPSBja21hbGxvYygoYXAgLSBhcmd2ICsgMikgKiBzaXplb2YobmV3WzBdKSk7CisJCW5ld1swXSA9IChjaGFyKikgImFzaCI7CisJCW5ld1sxXSA9IGNtZDsKKwkJYXAgPSBuZXcgKyAyOworCQl3aGlsZSAoKCphcCsrID0gKisrYXJndikgIT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQljbWQgPSAoY2hhciopIGJiX2J1c3lib3hfZXhlY19wYXRoOworCQlhcmd2ID0gbmV3OworCQlnb3RvIHJlcGVhdDsKKwl9Cit9CisKKy8qCisgKiBFeGVjIGEgcHJvZ3JhbS4gIE5ldmVyIHJldHVybnMuICBJZiB5b3UgY2hhbmdlIHRoaXMgcm91dGluZSwgeW91IG1heQorICogaGF2ZSB0byBjaGFuZ2UgdGhlIGZpbmRfY29tbWFuZCByb3V0aW5lIGFzIHdlbGwuCisgKi8KK3N0YXRpYyB2b2lkIHNoZWxsZXhlYyhjaGFyICoqLCBjb25zdCBjaGFyICosIGludCkgTk9SRVRVUk47CitzdGF0aWMgdm9pZAorc2hlbGxleGVjKGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwYXRoLCBpbnQgaWR4KQoreworCWNoYXIgKmNtZG5hbWU7CisJaW50IGU7CisJY2hhciAqKmVudnA7CisJaW50IGV4ZXJybm87CisJaW50IGFwcGxldF9ubyA9IC0xOyAvKiB1c2VkIG9ubHkgYnkgRkVBVFVSRV9TSF9TVEFOREFMT05FICovCisKKwljbGVhcnJlZGlyKC8qZHJvcDoqLyAxKTsKKwllbnZwID0gbGlzdHZhcnMoVkVYUE9SVCwgVlVOU0VULCAvKmVuZDoqLyBOVUxMKTsKKwlpZiAoc3RyY2hyKGFyZ3ZbMF0sICcvJykgIT0gTlVMTAorI2lmIEVOQUJMRV9GRUFUVVJFX1NIX1NUQU5EQUxPTkUKKwkgfHwgKGFwcGxldF9ubyA9IGZpbmRfYXBwbGV0X2J5X25hbWUoYXJndlswXSkpID49IDAKKyNlbmRpZgorCSkgeworCQl0cnlleGVjKElGX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORShhcHBsZXRfbm8sKSBhcmd2WzBdLCBhcmd2LCBlbnZwKTsKKwkJaWYgKGFwcGxldF9ubyA+PSAwKSB7CisJCQkvKiBXZSB0cmllZCBleGVjaW5nIG91cnNlbGYsIGJ1dCBpdCBkaWRuJ3Qgd29yay4KKwkJCSAqIE1heWJlIC9wcm9jL3NlbGYvZXhlIGRvZXNuJ3QgZXhpc3Q/CisJCQkgKiBUcnkgJFBBVEggc2VhcmNoLgorCQkJICovCisJCQlnb3RvIHRyeV9QQVRIOworCQl9CisJCWUgPSBlcnJubzsKKwl9IGVsc2UgeworIHRyeV9QQVRIOgorCQllID0gRU5PRU5UOworCQl3aGlsZSAoKGNtZG5hbWUgPSBwYXRoX2FkdmFuY2UoJnBhdGgsIGFyZ3ZbMF0pKSAhPSBOVUxMKSB7CisJCQlpZiAoLS1pZHggPCAwICYmIHBhdGhvcHQgPT0gTlVMTCkgeworCQkJCXRyeWV4ZWMoSUZfRkVBVFVSRV9TSF9TVEFOREFMT05FKC0xLCkgY21kbmFtZSwgYXJndiwgZW52cCk7CisJCQkJaWYgKGVycm5vICE9IEVOT0VOVCAmJiBlcnJubyAhPSBFTk9URElSKQorCQkJCQllID0gZXJybm87CisJCQl9CisJCQlzdHVuYWxsb2MoY21kbmFtZSk7CisJCX0KKwl9CisKKwkvKiBNYXAgdG8gUE9TSVggZXJyb3JzICovCisJc3dpdGNoIChlKSB7CisJY2FzZSBFQUNDRVM6CisJCWV4ZXJybm8gPSAxMjY7CisJCWJyZWFrOworCWNhc2UgRU5PRU5UOgorCQlleGVycm5vID0gMTI3OworCQlicmVhazsKKwlkZWZhdWx0OgorCQlleGVycm5vID0gMjsKKwkJYnJlYWs7CisJfQorCWV4aXRzdGF0dXMgPSBleGVycm5vOworCVRSQUNFKCgic2hlbGxleGVjIGZhaWxlZCBmb3IgJXMsIGVycm5vICVkLCBzdXBwcmVzc19pbnQgJWRcbiIsCisJCWFyZ3ZbMF0sIGUsIHN1cHByZXNzX2ludCkpOworCWFzaF9tc2dfYW5kX3JhaXNlKEVYRVhFQywgIiVzOiAlcyIsIGFyZ3ZbMF0sIGVycm1zZyhlLCAibm90IGZvdW5kIikpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KKworc3RhdGljIHZvaWQKK3ByaW50ZW50cnkoc3RydWN0IHRibGVudHJ5ICpjbWRwKQoreworCWludCBpZHg7CisJY29uc3QgY2hhciAqcGF0aDsKKwljaGFyICpuYW1lOworCisJaWR4ID0gY21kcC0+cGFyYW0uaW5kZXg7CisJcGF0aCA9IHBhdGh2YWwoKTsKKwlkbyB7CisJCW5hbWUgPSBwYXRoX2FkdmFuY2UoJnBhdGgsIGNtZHAtPmNtZG5hbWUpOworCQlzdHVuYWxsb2MobmFtZSk7CisJfSB3aGlsZSAoLS1pZHggPj0gMCk7CisJb3V0MWZtdCgiJXMlc1xuIiwgbmFtZSwgKGNtZHAtPnJlaGFzaCA/ICIqIiA6IG51bGxzdHIpKTsKK30KKworLyoKKyAqIENsZWFyIG91dCBjb21tYW5kIGVudHJpZXMuICBUaGUgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSBmaXJzdCBlbnRyeSBpbgorICogUEFUSCB3aGljaCBoYXMgY2hhbmdlZC4KKyAqLworc3RhdGljIHZvaWQKK2NsZWFyY21kZW50cnkoaW50IGZpcnN0Y2hhbmdlKQoreworCXN0cnVjdCB0YmxlbnRyeSAqKnRibHA7CisJc3RydWN0IHRibGVudHJ5ICoqcHA7CisJc3RydWN0IHRibGVudHJ5ICpjbWRwOworCisJSU5UX09GRjsKKwlmb3IgKHRibHAgPSBjbWR0YWJsZTsgdGJscCA8ICZjbWR0YWJsZVtDTURUQUJMRVNJWkVdOyB0YmxwKyspIHsKKwkJcHAgPSB0YmxwOworCQl3aGlsZSAoKGNtZHAgPSAqcHApICE9IE5VTEwpIHsKKwkJCWlmICgoY21kcC0+Y21kdHlwZSA9PSBDTUROT1JNQUwgJiYKKwkJCSAgICAgY21kcC0+cGFyYW0uaW5kZXggPj0gZmlyc3RjaGFuZ2UpCisJCQkgfHwgKGNtZHAtPmNtZHR5cGUgPT0gQ01EQlVJTFRJTiAmJgorCQkJICAgICBidWlsdGlubG9jID49IGZpcnN0Y2hhbmdlKQorCQkJKSB7CisJCQkJKnBwID0gY21kcC0+bmV4dDsKKwkJCQlmcmVlKGNtZHApOworCQkJfSBlbHNlIHsKKwkJCQlwcCA9ICZjbWRwLT5uZXh0OworCQkJfQorCQl9CisJfQorCUlOVF9PTjsKK30KKworLyoKKyAqIExvY2F0ZSBhIGNvbW1hbmQgaW4gdGhlIGNvbW1hbmQgaGFzaCB0YWJsZS4gIElmICJhZGQiIGlzIG5vbnplcm8sCisgKiBhZGQgdGhlIGNvbW1hbmQgdG8gdGhlIHRhYmxlIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHByZXNlbnQuICBUaGUKKyAqIHZhcmlhYmxlICJsYXN0Y21kZW50cnkiIGlzIHNldCB0byBwb2ludCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgbGluaworICogcG9pbnRpbmcgdG8gdGhlIGVudHJ5LCBzbyB0aGF0IGRlbGV0ZV9jbWRfZW50cnkgY2FuIGRlbGV0ZSB0aGUKKyAqIGVudHJ5LgorICoKKyAqIEludGVycnVwdHMgbXVzdCBiZSBvZmYgaWYgY2FsbGVkIHdpdGggYWRkICE9IDAuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgdGJsZW50cnkgKipsYXN0Y21kZW50cnk7CisKK3N0YXRpYyBzdHJ1Y3QgdGJsZW50cnkgKgorY21kbG9va3VwKGNvbnN0IGNoYXIgKm5hbWUsIGludCBhZGQpCit7CisJdW5zaWduZWQgaW50IGhhc2h2YWw7CisJY29uc3QgY2hhciAqcDsKKwlzdHJ1Y3QgdGJsZW50cnkgKmNtZHA7CisJc3RydWN0IHRibGVudHJ5ICoqcHA7CisKKwlwID0gbmFtZTsKKwloYXNodmFsID0gKHVuc2lnbmVkIGNoYXIpKnAgPDwgNDsKKwl3aGlsZSAoKnApCisJCWhhc2h2YWwgKz0gKHVuc2lnbmVkIGNoYXIpKnArKzsKKwloYXNodmFsICY9IDB4N0ZGRjsKKwlwcCA9ICZjbWR0YWJsZVtoYXNodmFsICUgQ01EVEFCTEVTSVpFXTsKKwlmb3IgKGNtZHAgPSAqcHA7IGNtZHA7IGNtZHAgPSBjbWRwLT5uZXh0KSB7CisJCWlmIChzdHJjbXAoY21kcC0+Y21kbmFtZSwgbmFtZSkgPT0gMCkKKwkJCWJyZWFrOworCQlwcCA9ICZjbWRwLT5uZXh0OworCX0KKwlpZiAoYWRkICYmIGNtZHAgPT0gTlVMTCkgeworCQljbWRwID0gKnBwID0gY2t6YWxsb2Moc2l6ZW9mKHN0cnVjdCB0YmxlbnRyeSkKKwkJCQkrIHN0cmxlbihuYW1lKQorCQkJCS8qICsgMSAtIGFscmVhZHkgZG9uZSBiZWNhdXNlCisJCQkJICogdGJsZW50cnk6OmNtZG5hbWUgaXMgY2hhclsxXSAqLyk7CisJCS8qY21kcC0+bmV4dCA9IE5VTEw7IC0gY2t6YWxsb2MgZGlkIGl0ICovCisJCWNtZHAtPmNtZHR5cGUgPSBDTURVTktOT1dOOworCQlzdHJjcHkoY21kcC0+Y21kbmFtZSwgbmFtZSk7CisJfQorCWxhc3RjbWRlbnRyeSA9IHBwOworCXJldHVybiBjbWRwOworfQorCisvKgorICogRGVsZXRlIHRoZSBjb21tYW5kIGVudHJ5IHJldHVybmVkIG9uIHRoZSBsYXN0IGxvb2t1cC4KKyAqLworc3RhdGljIHZvaWQKK2RlbGV0ZV9jbWRfZW50cnkodm9pZCkKK3sKKwlzdHJ1Y3QgdGJsZW50cnkgKmNtZHA7CisKKwlJTlRfT0ZGOworCWNtZHAgPSAqbGFzdGNtZGVudHJ5OworCSpsYXN0Y21kZW50cnkgPSBjbWRwLT5uZXh0OworCWlmIChjbWRwLT5jbWR0eXBlID09IENNREZVTkNUSU9OKQorCQlmcmVlZnVuYyhjbWRwLT5wYXJhbS5mdW5jKTsKKwlmcmVlKGNtZHApOworCUlOVF9PTjsKK30KKworLyoKKyAqIEFkZCBhIG5ldyBjb21tYW5kIGVudHJ5LCByZXBsYWNpbmcgYW55IGV4aXN0aW5nIGNvbW1hbmQgZW50cnkgZm9yCisgKiB0aGUgc2FtZSBuYW1lIC0gZXhjZXB0IHNwZWNpYWwgYnVpbHRpbnMuCisgKi8KK3N0YXRpYyB2b2lkCithZGRjbWRlbnRyeShjaGFyICpuYW1lLCBzdHJ1Y3QgY21kZW50cnkgKmVudHJ5KQoreworCXN0cnVjdCB0YmxlbnRyeSAqY21kcDsKKworCWNtZHAgPSBjbWRsb29rdXAobmFtZSwgMSk7CisJaWYgKGNtZHAtPmNtZHR5cGUgPT0gQ01ERlVOQ1RJT04pIHsKKwkJZnJlZWZ1bmMoY21kcC0+cGFyYW0uZnVuYyk7CisJfQorCWNtZHAtPmNtZHR5cGUgPSBlbnRyeS0+Y21kdHlwZTsKKwljbWRwLT5wYXJhbSA9IGVudHJ5LT51OworCWNtZHAtPnJlaGFzaCA9IDA7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DCitoYXNoY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCB0YmxlbnRyeSAqKnBwOworCXN0cnVjdCB0YmxlbnRyeSAqY21kcDsKKwlpbnQgYzsKKwlzdHJ1Y3QgY21kZW50cnkgZW50cnk7CisJY2hhciAqbmFtZTsKKworCWlmIChuZXh0b3B0KCJyIikgIT0gJ1wwJykgeworCQljbGVhcmNtZGVudHJ5KDApOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoKmFyZ3B0ciA9PSBOVUxMKSB7CisJCWZvciAocHAgPSBjbWR0YWJsZTsgcHAgPCAmY21kdGFibGVbQ01EVEFCTEVTSVpFXTsgcHArKykgeworCQkJZm9yIChjbWRwID0gKnBwOyBjbWRwOyBjbWRwID0gY21kcC0+bmV4dCkgeworCQkJCWlmIChjbWRwLT5jbWR0eXBlID09IENNRE5PUk1BTCkKKwkJCQkJcHJpbnRlbnRyeShjbWRwKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwljID0gMDsKKwl3aGlsZSAoKG5hbWUgPSAqYXJncHRyKSAhPSBOVUxMKSB7CisJCWNtZHAgPSBjbWRsb29rdXAobmFtZSwgMCk7CisJCWlmIChjbWRwICE9IE5VTEwKKwkJICYmIChjbWRwLT5jbWR0eXBlID09IENNRE5PUk1BTAorCQkgICAgIHx8IChjbWRwLT5jbWR0eXBlID09IENNREJVSUxUSU4gJiYgYnVpbHRpbmxvYyA+PSAwKSkKKwkJKSB7CisJCQlkZWxldGVfY21kX2VudHJ5KCk7CisJCX0KKwkJZmluZF9jb21tYW5kKG5hbWUsICZlbnRyeSwgRE9fRVJSLCBwYXRodmFsKCkpOworCQlpZiAoZW50cnkuY21kdHlwZSA9PSBDTURVTktOT1dOKQorCQkJYyA9IDE7CisJCWFyZ3B0cisrOworCX0KKwlyZXR1cm4gYzsKK30KKworLyoKKyAqIENhbGxlZCB3aGVuIGEgY2QgaXMgZG9uZS4gIE1hcmtzIGFsbCBjb21tYW5kcyBzbyB0aGUgbmV4dCB0aW1lIHRoZXkKKyAqIGFyZSBleGVjdXRlZCB0aGV5IHdpbGwgYmUgcmVoYXNoZWQuCisgKi8KK3N0YXRpYyB2b2lkCitoYXNoY2Qodm9pZCkKK3sKKwlzdHJ1Y3QgdGJsZW50cnkgKipwcDsKKwlzdHJ1Y3QgdGJsZW50cnkgKmNtZHA7CisKKwlmb3IgKHBwID0gY21kdGFibGU7IHBwIDwgJmNtZHRhYmxlW0NNRFRBQkxFU0laRV07IHBwKyspIHsKKwkJZm9yIChjbWRwID0gKnBwOyBjbWRwOyBjbWRwID0gY21kcC0+bmV4dCkgeworCQkJaWYgKGNtZHAtPmNtZHR5cGUgPT0gQ01ETk9STUFMCisJCQkgfHwgKGNtZHAtPmNtZHR5cGUgPT0gQ01EQlVJTFRJTgorCQkJICAgICAmJiAhSVNfQlVJTFRJTl9SRUdVTEFSKGNtZHAtPnBhcmFtLmNtZCkKKwkJCSAgICAgJiYgYnVpbHRpbmxvYyA+IDApCisJCQkpIHsKKwkJCQljbWRwLT5yZWhhc2ggPSAxOworCQkJfQorCQl9CisJfQorfQorCisvKgorICogRml4IGNvbW1hbmQgaGFzaCB0YWJsZSB3aGVuIFBBVEggY2hhbmdlZC4KKyAqIENhbGxlZCBiZWZvcmUgUEFUSCBpcyBjaGFuZ2VkLiAgVGhlIGFyZ3VtZW50IGlzIHRoZSBuZXcgdmFsdWUgb2YgUEFUSDsKKyAqIHBhdGh2YWwoKSBzdGlsbCByZXR1cm5zIHRoZSBvbGQgdmFsdWUgYXQgdGhpcyBwb2ludC4KKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgb2ZmLgorICovCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMKK2NoYW5nZXBhdGgoY29uc3QgY2hhciAqbmV3KQoreworCWNvbnN0IGNoYXIgKm9sZDsKKwlpbnQgZmlyc3RjaGFuZ2U7CisJaW50IGlkeDsKKwlpbnQgaWR4X2JsdGluOworCisJb2xkID0gcGF0aHZhbCgpOworCWZpcnN0Y2hhbmdlID0gOTk5OTsgICAgIC8qIGFzc3VtZSBubyBjaGFuZ2UgKi8KKwlpZHggPSAwOworCWlkeF9ibHRpbiA9IC0xOworCWZvciAoOzspIHsKKwkJaWYgKCpvbGQgIT0gKm5ldykgeworCQkJZmlyc3RjaGFuZ2UgPSBpZHg7CisJCQlpZiAoKCpvbGQgPT0gJ1wwJyAmJiAqbmV3ID09ICc6JykKKwkJCSB8fCAoKm9sZCA9PSAnOicgJiYgKm5ldyA9PSAnXDAnKQorCQkJKSB7CisJCQkJZmlyc3RjaGFuZ2UrKzsKKwkJCX0KKwkJCW9sZCA9IG5ldzsgICAgICAvKiBpZ25vcmUgc3Vic2VxdWVudCBkaWZmZXJlbmNlcyAqLworCQl9CisJCWlmICgqbmV3ID09ICdcMCcpCisJCQlicmVhazsKKwkJaWYgKCpuZXcgPT0gJyUnICYmIGlkeF9ibHRpbiA8IDAgJiYgcHJlZml4KG5ldyArIDEsICJidWlsdGluIikpCisJCQlpZHhfYmx0aW4gPSBpZHg7CisJCWlmICgqbmV3ID09ICc6JykKKwkJCWlkeCsrOworCQluZXcrKzsKKwkJb2xkKys7CisJfQorCWlmIChidWlsdGlubG9jIDwgMCAmJiBpZHhfYmx0aW4gPj0gMCkKKwkJYnVpbHRpbmxvYyA9IGlkeF9ibHRpbjsgICAgICAgICAgICAgLyogemFwIGJ1aWx0aW5zICovCisJaWYgKGJ1aWx0aW5sb2MgPj0gMCAmJiBpZHhfYmx0aW4gPCAwKQorCQlmaXJzdGNoYW5nZSA9IDA7CisJY2xlYXJjbWRlbnRyeShmaXJzdGNoYW5nZSk7CisJYnVpbHRpbmxvYyA9IGlkeF9ibHRpbjsKK30KKworI2RlZmluZSBURU9GIDAKKyNkZWZpbmUgVE5MIDEKKyNkZWZpbmUgVFJFRElSIDIKKyNkZWZpbmUgVFdPUkQgMworI2RlZmluZSBUU0VNSSA0CisjZGVmaW5lIFRCQUNLR05EIDUKKyNkZWZpbmUgVEFORCA2CisjZGVmaW5lIFRPUiA3CisjZGVmaW5lIFRQSVBFIDgKKyNkZWZpbmUgVExQIDkKKyNkZWZpbmUgVFJQIDEwCisjZGVmaW5lIFRFTkRDQVNFIDExCisjZGVmaW5lIFRFTkRCUVVPVEUgMTIKKyNkZWZpbmUgVE5PVCAxMworI2RlZmluZSBUQ0FTRSAxNAorI2RlZmluZSBURE8gMTUKKyNkZWZpbmUgVERPTkUgMTYKKyNkZWZpbmUgVEVMSUYgMTcKKyNkZWZpbmUgVEVMU0UgMTgKKyNkZWZpbmUgVEVTQUMgMTkKKyNkZWZpbmUgVEZJIDIwCisjZGVmaW5lIFRGT1IgMjEKKyNkZWZpbmUgVElGIDIyCisjZGVmaW5lIFRJTiAyMworI2RlZmluZSBUVEhFTiAyNAorI2RlZmluZSBUVU5USUwgMjUKKyNkZWZpbmUgVFdISUxFIDI2CisjZGVmaW5lIFRCRUdJTiAyNworI2RlZmluZSBURU5EIDI4Cit0eXBlZGVmIHNtYWxsaW50IHRva2VuX2lkX3Q7CisKKy8qIGZpcnN0IGNoYXIgaXMgaW5kaWNhdGluZyB3aGljaCB0b2tlbnMgbWFyayB0aGUgZW5kIG9mIGEgbGlzdCAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRva25hbWVfYXJyYXlbXSA9IHsKKwkiXDFlbmQgb2YgZmlsZSIsCisJIlwwbmV3bGluZSIsCisJIlwwcmVkaXJlY3Rpb24iLAorCSJcMHdvcmQiLAorCSJcMDsiLAorCSJcMCYiLAorCSJcMCYmIiwKKwkiXDB8fCIsCisJIlwwfCIsCisJIlwwKCIsCisJIlwxKSIsCisJIlwxOzsiLAorCSJcMWAiLAorI2RlZmluZSBLV0RPRkZTRVQgMTMKKwkvKiB0aGUgZm9sbG93aW5nIGFyZSBrZXl3b3JkcyAqLworCSJcMCEiLAorCSJcMGNhc2UiLAorCSJcMWRvIiwKKwkiXDFkb25lIiwKKwkiXDFlbGlmIiwKKwkiXDFlbHNlIiwKKwkiXDFlc2FjIiwKKwkiXDFmaSIsCisJIlwwZm9yIiwKKwkiXDBpZiIsCisJIlwwaW4iLAorCSJcMXRoZW4iLAorCSJcMHVudGlsIiwKKwkiXDB3aGlsZSIsCisJIlwweyIsCisJIlwxfSIsCit9OworCisvKiBXcmFwcGVyIGFyb3VuZCBzdHJjbXAgZm9yIHFzb3J0L2JzZWFyY2gvLi4uICovCitzdGF0aWMgaW50Citwc3RyY21wKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisJcmV0dXJuIHN0cmNtcCgoY2hhciopIGEsICgqKGNoYXIqKikgYikgKyAxKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0ICoKK2ZpbmRrd2QoY29uc3QgY2hhciAqcykKK3sKKwlyZXR1cm4gYnNlYXJjaChzLCB0b2tuYW1lX2FycmF5ICsgS1dET0ZGU0VULAorCQkJQVJSQVlfU0laRSh0b2tuYW1lX2FycmF5KSAtIEtXRE9GRlNFVCwKKwkJCXNpemVvZih0b2tuYW1lX2FycmF5WzBdKSwgcHN0cmNtcCk7Cit9CisKKy8qCisgKiBMb2NhdGUgYW5kIHByaW50IHdoYXQgYSB3b3JkIGlzLi4uCisgKi8KK3N0YXRpYyBpbnQKK2Rlc2NyaWJlX2NvbW1hbmQoY2hhciAqY29tbWFuZCwgaW50IGRlc2NyaWJlX2NvbW1hbmRfdmVyYm9zZSkKK3sKKwlzdHJ1Y3QgY21kZW50cnkgZW50cnk7CisJc3RydWN0IHRibGVudHJ5ICpjbWRwOworI2lmIEVOQUJMRV9BU0hfQUxJQVMKKwljb25zdCBzdHJ1Y3QgYWxpYXMgKmFwOworI2VuZGlmCisJY29uc3QgY2hhciAqcGF0aCA9IHBhdGh2YWwoKTsKKworCWlmIChkZXNjcmliZV9jb21tYW5kX3ZlcmJvc2UpIHsKKwkJb3V0MXN0cihjb21tYW5kKTsKKwl9CisKKwkvKiBGaXJzdCBsb29rIGF0IHRoZSBrZXl3b3JkcyAqLworCWlmIChmaW5ka3dkKGNvbW1hbmQpKSB7CisJCW91dDFzdHIoZGVzY3JpYmVfY29tbWFuZF92ZXJib3NlID8gIiBpcyBhIHNoZWxsIGtleXdvcmQiIDogY29tbWFuZCk7CisJCWdvdG8gb3V0OworCX0KKworI2lmIEVOQUJMRV9BU0hfQUxJQVMKKwkvKiBUaGVuIGxvb2sgYXQgdGhlIGFsaWFzZXMgKi8KKwlhcCA9IGxvb2t1cGFsaWFzKGNvbW1hbmQsIDApOworCWlmIChhcCAhPSBOVUxMKSB7CisJCWlmICghZGVzY3JpYmVfY29tbWFuZF92ZXJib3NlKSB7CisJCQlvdXQxc3RyKCJhbGlhcyAiKTsKKwkJCXByaW50YWxpYXMoYXApOworCQkJcmV0dXJuIDA7CisJCX0KKwkJb3V0MWZtdCgiIGlzIGFuIGFsaWFzIGZvciAlcyIsIGFwLT52YWwpOworCQlnb3RvIG91dDsKKwl9CisjZW5kaWYKKwkvKiBUaGVuIGNoZWNrIGlmIGl0IGlzIGEgdHJhY2tlZCBhbGlhcyAqLworCWNtZHAgPSBjbWRsb29rdXAoY29tbWFuZCwgMCk7CisJaWYgKGNtZHAgIT0gTlVMTCkgeworCQllbnRyeS5jbWR0eXBlID0gY21kcC0+Y21kdHlwZTsKKwkJZW50cnkudSA9IGNtZHAtPnBhcmFtOworCX0gZWxzZSB7CisJCS8qIEZpbmFsbHkgdXNlIGJydXRlIGZvcmNlICovCisJCWZpbmRfY29tbWFuZChjb21tYW5kLCAmZW50cnksIERPX0FCUywgcGF0aCk7CisJfQorCisJc3dpdGNoIChlbnRyeS5jbWR0eXBlKSB7CisJY2FzZSBDTUROT1JNQUw6IHsKKwkJaW50IGogPSBlbnRyeS51LmluZGV4OworCQljaGFyICpwOworCQlpZiAoaiA8IDApIHsKKwkJCXAgPSBjb21tYW5kOworCQl9IGVsc2UgeworCQkJZG8geworCQkJCXAgPSBwYXRoX2FkdmFuY2UoJnBhdGgsIGNvbW1hbmQpOworCQkJCXN0dW5hbGxvYyhwKTsKKwkJCX0gd2hpbGUgKC0taiA+PSAwKTsKKwkJfQorCQlpZiAoZGVzY3JpYmVfY29tbWFuZF92ZXJib3NlKSB7CisJCQlvdXQxZm10KCIgaXMlcyAlcyIsCisJCQkJKGNtZHAgPyAiIGEgdHJhY2tlZCBhbGlhcyBmb3IiIDogbnVsbHN0ciksIHAKKwkJCSk7CisJCX0gZWxzZSB7CisJCQlvdXQxc3RyKHApOworCQl9CisJCWJyZWFrOworCX0KKworCWNhc2UgQ01ERlVOQ1RJT046CisJCWlmIChkZXNjcmliZV9jb21tYW5kX3ZlcmJvc2UpIHsKKwkJCW91dDFzdHIoIiBpcyBhIHNoZWxsIGZ1bmN0aW9uIik7CisJCX0gZWxzZSB7CisJCQlvdXQxc3RyKGNvbW1hbmQpOworCQl9CisJCWJyZWFrOworCisJY2FzZSBDTURCVUlMVElOOgorCQlpZiAoZGVzY3JpYmVfY29tbWFuZF92ZXJib3NlKSB7CisJCQlvdXQxZm10KCIgaXMgYSAlc3NoZWxsIGJ1aWx0aW4iLAorCQkJCUlTX0JVSUxUSU5fU1BFQ0lBTChlbnRyeS51LmNtZCkgPworCQkJCQkic3BlY2lhbCAiIDogbnVsbHN0cgorCQkJKTsKKwkJfSBlbHNlIHsKKwkJCW91dDFzdHIoY29tbWFuZCk7CisJCX0KKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlpZiAoZGVzY3JpYmVfY29tbWFuZF92ZXJib3NlKSB7CisJCQlvdXQxc3RyKCI6IG5vdCBmb3VuZFxuIik7CisJCX0KKwkJcmV0dXJuIDEyNzsKKwl9Cisgb3V0OgorCW91dDFzdHIoIlxuIik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DCit0eXBlY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IGkgPSAxOworCWludCBlcnIgPSAwOworCWludCB2ZXJib3NlID0gMTsKKworCS8qIHR5cGUgLXAgLi4uID8gKHdlIGRvbid0IGJvdGhlciBjaGVja2luZyBmb3IgJ3AnKSAqLworCWlmIChhcmd2WzFdICYmIGFyZ3ZbMV1bMF0gPT0gJy0nKSB7CisJCWkrKzsKKwkJdmVyYm9zZSA9IDA7CisJfQorCXdoaWxlIChhcmd2W2ldKSB7CisJCWVyciB8PSBkZXNjcmliZV9jb21tYW5kKGFyZ3ZbaSsrXSwgdmVyYm9zZSk7CisJfQorCXJldHVybiBlcnI7Cit9CisKKyNpZiBFTkFCTEVfQVNIX0NNRENNRAorc3RhdGljIGludCBGQVNUX0ZVTkMKK2NvbW1hbmRjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJaW50IGM7CisJZW51bSB7CisJCVZFUklGWV9CUklFRiA9IDEsCisJCVZFUklGWV9WRVJCT1NFID0gMiwKKwl9IHZlcmlmeSA9IDA7CisKKwl3aGlsZSAoKGMgPSBuZXh0b3B0KCJwdlYiKSkgIT0gJ1wwJykKKwkJaWYgKGMgPT0gJ1YnKQorCQkJdmVyaWZ5IHw9IFZFUklGWV9WRVJCT1NFOworCQllbHNlIGlmIChjID09ICd2JykKKwkJCXZlcmlmeSB8PSBWRVJJRllfQlJJRUY7CisjaWYgREVCVUcKKwkJZWxzZSBpZiAoYyAhPSAncCcpCisJCQlhYm9ydCgpOworI2VuZGlmCisJLyogTWltaWMgYmFzaDoganVzdCAiY29tbWFuZCAtdiIgZG9lc24ndCBjb21wbGFpbiwgaXQncyBhIG5vcCAqLworCWlmICh2ZXJpZnkgJiYgKCphcmdwdHIgIT0gTlVMTCkpIHsKKwkJcmV0dXJuIGRlc2NyaWJlX2NvbW1hbmQoKmFyZ3B0ciwgdmVyaWZ5IC0gVkVSSUZZX0JSSUVGKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisKKy8qID09PT09PT09PT09PSBldmFsLmMgKi8KKworc3RhdGljIGludCBmdW5jYmxvY2tzaXplOyAgICAgICAvKiBzaXplIG9mIHN0cnVjdHVyZXMgaW4gZnVuY3Rpb24gKi8KK3N0YXRpYyBpbnQgZnVuY3N0cmluZ3NpemU7ICAgICAgLyogc2l6ZSBvZiBzdHJpbmdzIGluIG5vZGUgKi8KK3N0YXRpYyB2b2lkICpmdW5jYmxvY2s7ICAgICAgICAgLyogYmxvY2sgdG8gYWxsb2NhdGUgZnVuY3Rpb24gZnJvbSAqLworc3RhdGljIGNoYXIgKmZ1bmNzdHJpbmc7ICAgICAgICAvKiBibG9jayB0byBhbGxvY2F0ZSBzdHJpbmdzIGZyb20gKi8KKworLyogZmxhZ3MgaW4gYXJndW1lbnQgdG8gZXZhbHRyZWUgKi8KKyNkZWZpbmUgRVZfRVhJVCAgICAwMSAgICAgICAgICAgLyogZXhpdCBhZnRlciBldmFsdWF0aW5nIHRyZWUgKi8KKyNkZWZpbmUgRVZfVEVTVEVEICAwMiAgICAgICAgICAgLyogZXhpdCBzdGF0dXMgaXMgY2hlY2tlZDsgaWdub3JlIC1lIGZsYWcgKi8KKyNkZWZpbmUgRVZfQkFDS0NNRCAwNCAgICAgICAgICAgLyogY29tbWFuZCBleGVjdXRpbmcgd2l0aGluIGJhY2sgcXVvdGVzICovCisKK3N0YXRpYyBjb25zdCB1aW50OF90IG5vZGVzaXplW05fTlVNQkVSXSA9IHsKKwlbTkNNRCAgICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmNtZCkpLAorCVtOUElQRSAgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBucGlwZSkpLAorCVtOUkVESVIgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBucmVkaXIpKSwKKwlbTkJBQ0tHTkQgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbnJlZGlyKSksCisJW05TVUJTSEVMTF0gPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5yZWRpcikpLAorCVtOQU5EICAgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuYmluYXJ5KSksCisJW05PUiAgICAgIF0gPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5iaW5hcnkpKSwKKwlbTlNFTUkgICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmJpbmFyeSkpLAorCVtOSUYgICAgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuaWYpKSwKKwlbTldISUxFICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmJpbmFyeSkpLAorCVtOVU5USUwgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuYmluYXJ5KSksCisJW05GT1IgICAgIF0gPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5mb3IpKSwKKwlbTkNBU0UgICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmNhc2UpKSwKKwlbTkNMSVNUICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmNsaXN0KSksCisJW05ERUZVTiAgIF0gPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5hcmcpKSwKKwlbTkFSRyAgICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmFyZykpLAorCVtOVE8gICAgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuZmlsZSkpLAorI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwlbTlRPMiAgICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmZpbGUpKSwKKyNlbmRpZgorCVtOQ0xPQkJFUiBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuZmlsZSkpLAorCVtORlJPTSAgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuZmlsZSkpLAorCVtORlJPTVRPICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuZmlsZSkpLAorCVtOQVBQRU5EICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuZmlsZSkpLAorCVtOVE9GRCAgICBdID0gU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBuZHVwKSksCisJW05GUk9NRkQgIF0gPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5kdXApKSwKKwlbTkhFUkUgICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmhlcmUpKSwKKwlbTlhIRVJFICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3QgbmhlcmUpKSwKKwlbTk5PVCAgICAgXSA9IFNIRUxMX0FMSUdOKHNpemVvZihzdHJ1Y3Qgbm5vdCkpLAorfTsKKworc3RhdGljIHZvaWQgY2FsY3NpemUodW5pb24gbm9kZSAqbik7CisKK3N0YXRpYyB2b2lkCitzaXplbm9kZWxpc3Qoc3RydWN0IG5vZGVsaXN0ICpscCkKK3sKKwl3aGlsZSAobHApIHsKKwkJZnVuY2Jsb2Nrc2l6ZSArPSBTSEVMTF9BTElHTihzaXplb2Yoc3RydWN0IG5vZGVsaXN0KSk7CisJCWNhbGNzaXplKGxwLT5uKTsKKwkJbHAgPSBscC0+bmV4dDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjYWxjc2l6ZSh1bmlvbiBub2RlICpuKQoreworCWlmIChuID09IE5VTEwpCisJCXJldHVybjsKKwlmdW5jYmxvY2tzaXplICs9IG5vZGVzaXplW24tPnR5cGVdOworCXN3aXRjaCAobi0+dHlwZSkgeworCWNhc2UgTkNNRDoKKwkJY2FsY3NpemUobi0+bmNtZC5yZWRpcmVjdCk7CisJCWNhbGNzaXplKG4tPm5jbWQuYXJncyk7CisJCWNhbGNzaXplKG4tPm5jbWQuYXNzaWduKTsKKwkJYnJlYWs7CisJY2FzZSBOUElQRToKKwkJc2l6ZW5vZGVsaXN0KG4tPm5waXBlLmNtZGxpc3QpOworCQlicmVhazsKKwljYXNlIE5SRURJUjoKKwljYXNlIE5CQUNLR05EOgorCWNhc2UgTlNVQlNIRUxMOgorCQljYWxjc2l6ZShuLT5ucmVkaXIucmVkaXJlY3QpOworCQljYWxjc2l6ZShuLT5ucmVkaXIubik7CisJCWJyZWFrOworCWNhc2UgTkFORDoKKwljYXNlIE5PUjoKKwljYXNlIE5TRU1JOgorCWNhc2UgTldISUxFOgorCWNhc2UgTlVOVElMOgorCQljYWxjc2l6ZShuLT5uYmluYXJ5LmNoMik7CisJCWNhbGNzaXplKG4tPm5iaW5hcnkuY2gxKTsKKwkJYnJlYWs7CisJY2FzZSBOSUY6CisJCWNhbGNzaXplKG4tPm5pZi5lbHNlcGFydCk7CisJCWNhbGNzaXplKG4tPm5pZi5pZnBhcnQpOworCQljYWxjc2l6ZShuLT5uaWYudGVzdCk7CisJCWJyZWFrOworCWNhc2UgTkZPUjoKKwkJZnVuY3N0cmluZ3NpemUgKz0gc3RybGVuKG4tPm5mb3IudmFyKSArIDE7CisJCWNhbGNzaXplKG4tPm5mb3IuYm9keSk7CisJCWNhbGNzaXplKG4tPm5mb3IuYXJncyk7CisJCWJyZWFrOworCWNhc2UgTkNBU0U6CisJCWNhbGNzaXplKG4tPm5jYXNlLmNhc2VzKTsKKwkJY2FsY3NpemUobi0+bmNhc2UuZXhwcik7CisJCWJyZWFrOworCWNhc2UgTkNMSVNUOgorCQljYWxjc2l6ZShuLT5uY2xpc3QuYm9keSk7CisJCWNhbGNzaXplKG4tPm5jbGlzdC5wYXR0ZXJuKTsKKwkJY2FsY3NpemUobi0+bmNsaXN0Lm5leHQpOworCQlicmVhazsKKwljYXNlIE5ERUZVTjoKKwljYXNlIE5BUkc6CisJCXNpemVub2RlbGlzdChuLT5uYXJnLmJhY2txdW90ZSk7CisJCWZ1bmNzdHJpbmdzaXplICs9IHN0cmxlbihuLT5uYXJnLnRleHQpICsgMTsKKwkJY2FsY3NpemUobi0+bmFyZy5uZXh0KTsKKwkJYnJlYWs7CisJY2FzZSBOVE86CisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCWNhc2UgTlRPMjoKKyNlbmRpZgorCWNhc2UgTkNMT0JCRVI6CisJY2FzZSBORlJPTToKKwljYXNlIE5GUk9NVE86CisJY2FzZSBOQVBQRU5EOgorCQljYWxjc2l6ZShuLT5uZmlsZS5mbmFtZSk7CisJCWNhbGNzaXplKG4tPm5maWxlLm5leHQpOworCQlicmVhazsKKwljYXNlIE5UT0ZEOgorCWNhc2UgTkZST01GRDoKKwkJY2FsY3NpemUobi0+bmR1cC52bmFtZSk7CisJCWNhbGNzaXplKG4tPm5kdXAubmV4dCk7CisJYnJlYWs7CisJY2FzZSBOSEVSRToKKwljYXNlIE5YSEVSRToKKwkJY2FsY3NpemUobi0+bmhlcmUuZG9jKTsKKwkJY2FsY3NpemUobi0+bmhlcmUubmV4dCk7CisJCWJyZWFrOworCWNhc2UgTk5PVDoKKwkJY2FsY3NpemUobi0+bm5vdC5jb20pOworCQlicmVhazsKKwl9OworfQorCitzdGF0aWMgY2hhciAqCitub2RlY2tzdHJkdXAoY2hhciAqcykKK3sKKwljaGFyICpydG4gPSBmdW5jc3RyaW5nOworCisJc3RyY3B5KGZ1bmNzdHJpbmcsIHMpOworCWZ1bmNzdHJpbmcgKz0gc3RybGVuKHMpICsgMTsKKwlyZXR1cm4gcnRuOworfQorCitzdGF0aWMgdW5pb24gbm9kZSAqY29weW5vZGUodW5pb24gbm9kZSAqKTsKKworc3RhdGljIHN0cnVjdCBub2RlbGlzdCAqCitjb3B5bm9kZWxpc3Qoc3RydWN0IG5vZGVsaXN0ICpscCkKK3sKKwlzdHJ1Y3Qgbm9kZWxpc3QgKnN0YXJ0OworCXN0cnVjdCBub2RlbGlzdCAqKmxwcDsKKworCWxwcCA9ICZzdGFydDsKKwl3aGlsZSAobHApIHsKKwkJKmxwcCA9IGZ1bmNibG9jazsKKwkJZnVuY2Jsb2NrID0gKGNoYXIgKikgZnVuY2Jsb2NrICsgU0hFTExfQUxJR04oc2l6ZW9mKHN0cnVjdCBub2RlbGlzdCkpOworCQkoKmxwcCktPm4gPSBjb3B5bm9kZShscC0+bik7CisJCWxwID0gbHAtPm5leHQ7CisJCWxwcCA9ICYoKmxwcCktPm5leHQ7CisJfQorCSpscHAgPSBOVUxMOworCXJldHVybiBzdGFydDsKK30KKworc3RhdGljIHVuaW9uIG5vZGUgKgorY29weW5vZGUodW5pb24gbm9kZSAqbikKK3sKKwl1bmlvbiBub2RlICpuZXc7CisKKwlpZiAobiA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKwluZXcgPSBmdW5jYmxvY2s7CisJZnVuY2Jsb2NrID0gKGNoYXIgKikgZnVuY2Jsb2NrICsgbm9kZXNpemVbbi0+dHlwZV07CisKKwlzd2l0Y2ggKG4tPnR5cGUpIHsKKwljYXNlIE5DTUQ6CisJCW5ldy0+bmNtZC5yZWRpcmVjdCA9IGNvcHlub2RlKG4tPm5jbWQucmVkaXJlY3QpOworCQluZXctPm5jbWQuYXJncyA9IGNvcHlub2RlKG4tPm5jbWQuYXJncyk7CisJCW5ldy0+bmNtZC5hc3NpZ24gPSBjb3B5bm9kZShuLT5uY21kLmFzc2lnbik7CisJCWJyZWFrOworCWNhc2UgTlBJUEU6CisJCW5ldy0+bnBpcGUuY21kbGlzdCA9IGNvcHlub2RlbGlzdChuLT5ucGlwZS5jbWRsaXN0KTsKKwkJbmV3LT5ucGlwZS5waXBlX2JhY2tnbmQgPSBuLT5ucGlwZS5waXBlX2JhY2tnbmQ7CisJCWJyZWFrOworCWNhc2UgTlJFRElSOgorCWNhc2UgTkJBQ0tHTkQ6CisJY2FzZSBOU1VCU0hFTEw6CisJCW5ldy0+bnJlZGlyLnJlZGlyZWN0ID0gY29weW5vZGUobi0+bnJlZGlyLnJlZGlyZWN0KTsKKwkJbmV3LT5ucmVkaXIubiA9IGNvcHlub2RlKG4tPm5yZWRpci5uKTsKKwkJYnJlYWs7CisJY2FzZSBOQU5EOgorCWNhc2UgTk9SOgorCWNhc2UgTlNFTUk6CisJY2FzZSBOV0hJTEU6CisJY2FzZSBOVU5USUw6CisJCW5ldy0+bmJpbmFyeS5jaDIgPSBjb3B5bm9kZShuLT5uYmluYXJ5LmNoMik7CisJCW5ldy0+bmJpbmFyeS5jaDEgPSBjb3B5bm9kZShuLT5uYmluYXJ5LmNoMSk7CisJCWJyZWFrOworCWNhc2UgTklGOgorCQluZXctPm5pZi5lbHNlcGFydCA9IGNvcHlub2RlKG4tPm5pZi5lbHNlcGFydCk7CisJCW5ldy0+bmlmLmlmcGFydCA9IGNvcHlub2RlKG4tPm5pZi5pZnBhcnQpOworCQluZXctPm5pZi50ZXN0ID0gY29weW5vZGUobi0+bmlmLnRlc3QpOworCQlicmVhazsKKwljYXNlIE5GT1I6CisJCW5ldy0+bmZvci52YXIgPSBub2RlY2tzdHJkdXAobi0+bmZvci52YXIpOworCQluZXctPm5mb3IuYm9keSA9IGNvcHlub2RlKG4tPm5mb3IuYm9keSk7CisJCW5ldy0+bmZvci5hcmdzID0gY29weW5vZGUobi0+bmZvci5hcmdzKTsKKwkJYnJlYWs7CisJY2FzZSBOQ0FTRToKKwkJbmV3LT5uY2FzZS5jYXNlcyA9IGNvcHlub2RlKG4tPm5jYXNlLmNhc2VzKTsKKwkJbmV3LT5uY2FzZS5leHByID0gY29weW5vZGUobi0+bmNhc2UuZXhwcik7CisJCWJyZWFrOworCWNhc2UgTkNMSVNUOgorCQluZXctPm5jbGlzdC5ib2R5ID0gY29weW5vZGUobi0+bmNsaXN0LmJvZHkpOworCQluZXctPm5jbGlzdC5wYXR0ZXJuID0gY29weW5vZGUobi0+bmNsaXN0LnBhdHRlcm4pOworCQluZXctPm5jbGlzdC5uZXh0ID0gY29weW5vZGUobi0+bmNsaXN0Lm5leHQpOworCQlicmVhazsKKwljYXNlIE5ERUZVTjoKKwljYXNlIE5BUkc6CisJCW5ldy0+bmFyZy5iYWNrcXVvdGUgPSBjb3B5bm9kZWxpc3Qobi0+bmFyZy5iYWNrcXVvdGUpOworCQluZXctPm5hcmcudGV4dCA9IG5vZGVja3N0cmR1cChuLT5uYXJnLnRleHQpOworCQluZXctPm5hcmcubmV4dCA9IGNvcHlub2RlKG4tPm5hcmcubmV4dCk7CisJCWJyZWFrOworCWNhc2UgTlRPOgorI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwljYXNlIE5UTzI6CisjZW5kaWYKKwljYXNlIE5DTE9CQkVSOgorCWNhc2UgTkZST006CisJY2FzZSBORlJPTVRPOgorCWNhc2UgTkFQUEVORDoKKwkJbmV3LT5uZmlsZS5mbmFtZSA9IGNvcHlub2RlKG4tPm5maWxlLmZuYW1lKTsKKwkJbmV3LT5uZmlsZS5mZCA9IG4tPm5maWxlLmZkOworCQluZXctPm5maWxlLm5leHQgPSBjb3B5bm9kZShuLT5uZmlsZS5uZXh0KTsKKwkJYnJlYWs7CisJY2FzZSBOVE9GRDoKKwljYXNlIE5GUk9NRkQ6CisJCW5ldy0+bmR1cC52bmFtZSA9IGNvcHlub2RlKG4tPm5kdXAudm5hbWUpOworCQluZXctPm5kdXAuZHVwZmQgPSBuLT5uZHVwLmR1cGZkOworCQluZXctPm5kdXAuZmQgPSBuLT5uZHVwLmZkOworCQluZXctPm5kdXAubmV4dCA9IGNvcHlub2RlKG4tPm5kdXAubmV4dCk7CisJCWJyZWFrOworCWNhc2UgTkhFUkU6CisJY2FzZSBOWEhFUkU6CisJCW5ldy0+bmhlcmUuZG9jID0gY29weW5vZGUobi0+bmhlcmUuZG9jKTsKKwkJbmV3LT5uaGVyZS5mZCA9IG4tPm5oZXJlLmZkOworCQluZXctPm5oZXJlLm5leHQgPSBjb3B5bm9kZShuLT5uaGVyZS5uZXh0KTsKKwkJYnJlYWs7CisJY2FzZSBOTk9UOgorCQluZXctPm5ub3QuY29tID0gY29weW5vZGUobi0+bm5vdC5jb20pOworCQlicmVhazsKKwl9OworCW5ldy0+dHlwZSA9IG4tPnR5cGU7CisJcmV0dXJuIG5ldzsKK30KKworLyoKKyAqIE1ha2UgYSBjb3B5IG9mIGEgcGFyc2UgdHJlZS4KKyAqLworc3RhdGljIHN0cnVjdCBmdW5jbm9kZSAqCitjb3B5ZnVuYyh1bmlvbiBub2RlICpuKQoreworCXN0cnVjdCBmdW5jbm9kZSAqZjsKKwlzaXplX3QgYmxvY2tzaXplOworCisJZnVuY2Jsb2Nrc2l6ZSA9IG9mZnNldG9mKHN0cnVjdCBmdW5jbm9kZSwgbik7CisJZnVuY3N0cmluZ3NpemUgPSAwOworCWNhbGNzaXplKG4pOworCWJsb2Nrc2l6ZSA9IGZ1bmNibG9ja3NpemU7CisJZiA9IGNrbWFsbG9jKGJsb2Nrc2l6ZSArIGZ1bmNzdHJpbmdzaXplKTsKKwlmdW5jYmxvY2sgPSAoY2hhciAqKSBmICsgb2Zmc2V0b2Yoc3RydWN0IGZ1bmNub2RlLCBuKTsKKwlmdW5jc3RyaW5nID0gKGNoYXIgKikgZiArIGJsb2Nrc2l6ZTsKKwljb3B5bm9kZShuKTsKKwlmLT5jb3VudCA9IDA7CisJcmV0dXJuIGY7Cit9CisKKy8qCisgKiBEZWZpbmUgYSBzaGVsbCBmdW5jdGlvbi4KKyAqLworc3RhdGljIHZvaWQKK2RlZnVuKGNoYXIgKm5hbWUsIHVuaW9uIG5vZGUgKmZ1bmMpCit7CisJc3RydWN0IGNtZGVudHJ5IGVudHJ5OworCisJSU5UX09GRjsKKwllbnRyeS5jbWR0eXBlID0gQ01ERlVOQ1RJT047CisJZW50cnkudS5mdW5jID0gY29weWZ1bmMoZnVuYyk7CisJYWRkY21kZW50cnkobmFtZSwgJmVudHJ5KTsKKwlJTlRfT047Cit9CisKKy8qIFJlYXNvbnMgZm9yIHNraXBwaW5nIGNvbW1hbmRzIChzZWUgY29tbWVudCBvbiBicmVha2NtZCByb3V0aW5lKSAqLworI2RlZmluZSBTS0lQQlJFQUsgICAgICAoMSA8PCAwKQorI2RlZmluZSBTS0lQQ09OVCAgICAgICAoMSA8PCAxKQorI2RlZmluZSBTS0lQRlVOQyAgICAgICAoMSA8PCAyKQorI2RlZmluZSBTS0lQRklMRSAgICAgICAoMSA8PCAzKQorI2RlZmluZSBTS0lQRVZBTCAgICAgICAoMSA8PCA0KQorc3RhdGljIHNtYWxsaW50IGV2YWxza2lwOyAgICAgICAvKiBzZXQgdG8gU0tJUHh4eCBpZiB3ZSBhcmUgc2tpcHBpbmcgY29tbWFuZHMgKi8KK3N0YXRpYyBpbnQgc2tpcGNvdW50OyAgICAgICAgICAgLyogbnVtYmVyIG9mIGxldmVscyB0byBza2lwICovCitzdGF0aWMgaW50IGZ1bmNuZXN0OyAgICAgICAgICAgIC8qIGRlcHRoIG9mIGZ1bmN0aW9uIGNhbGxzICovCitzdGF0aWMgaW50IGxvb3BuZXN0OyAgICAgICAgICAgIC8qIGN1cnJlbnQgbG9vcCBuZXN0aW5nIGxldmVsICovCisKKy8qIEZvcndhcmQgZGVjbCB3YXkgb3V0IHRvIHBhcnNpbmcgY29kZSAtIGRvdHJhcCBuZWVkcyBpdCAqLworc3RhdGljIGludCBldmFsc3RyaW5nKGNoYXIgKnMsIGludCBtYXNrKTsKKworLyogQ2FsbGVkIHRvIGV4ZWN1dGUgYSB0cmFwLgorICogU2luZ2xlIGNhbGxzaXRlIC0gYXQgdGhlIGVuZCBvZiBldmFsdHJlZSgpLgorICogSWYgd2UgcmV0dXJuIG5vbi16ZXJvLCBldmFsdHJlZSByYWlzZXMgRVhFWElUIGV4Y2VwdGlvbi4KKyAqCisgKiBQZXJoYXBzIHdlIHNob3VsZCBhdm9pZCBlbnRlcmluZyBuZXcgdHJhcCBoYW5kbGVycworICogd2hpbGUgd2UgYXJlIGV4ZWN1dGluZyBhIHRyYXAgaGFuZGxlci4gW2lzIGl0IGEgVE9ETz9dCisgKi8KK3N0YXRpYyBpbnQKK2RvdHJhcCh2b2lkKQoreworCXVpbnQ4X3QgKmc7CisJaW50IHNpZzsKKwl1aW50OF90IHNhdmVzdGF0dXM7CisKKwlzYXZlc3RhdHVzID0gZXhpdHN0YXR1czsKKwlwZW5kaW5nX3NpZyA9IDA7CisJeGJhcnJpZXIoKTsKKworCVRSQUNFKCgiZG90cmFwIGVudGVyZWRcbiIpKTsKKwlmb3IgKHNpZyA9IDEsIGcgPSBnb3RzaWc7IHNpZyA8IE5TSUc7IHNpZysrLCBnKyspIHsKKwkJaW50IHdhbnRfZXhleGl0OworCQljaGFyICp0OworCisJCWlmICgqZyA9PSAwKQorCQkJY29udGludWU7CisJCXQgPSB0cmFwW3NpZ107CisJCS8qIG5vbi10cmFwcGVkIFNJR0lOVCBpcyBoYW5kbGVkIHNlcGFyYXRlbHkgYnkgcmFpc2VfaW50ZXJydXB0LAorCQkgKiBkb24ndCB1cHNldCBpdCBieSByZXNldHRpbmcgZ290c2lnW1NJR0lOVC0xXSAqLworCQlpZiAoc2lnID09IFNJR0lOVCAmJiAhdCkKKwkJCWNvbnRpbnVlOworCisJCVRSQUNFKCgic2lnICVkIGlzIGFjdGl2ZSwgd2lsbCBydW4gaGFuZGxlciAnJXMnXG4iLCBzaWcsIHQpKTsKKwkJKmcgPSAwOworCQlpZiAoIXQpCisJCQljb250aW51ZTsKKwkJd2FudF9leGV4aXQgPSBldmFsc3RyaW5nKHQsIFNLSVBFVkFMKTsKKwkJZXhpdHN0YXR1cyA9IHNhdmVzdGF0dXM7CisJCWlmICh3YW50X2V4ZXhpdCkgeworCQkJVFJBQ0UoKCJkb3RyYXAgcmV0dXJucyAlZFxuIiwgd2FudF9leGV4aXQpKTsKKwkJCXJldHVybiB3YW50X2V4ZXhpdDsKKwkJfQorCX0KKworCVRSQUNFKCgiZG90cmFwIHJldHVybnMgMFxuIikpOworCXJldHVybiAwOworfQorCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9ucyAtIGV2YWx1YXRpb24gaXMgZmFpcmx5IHJlY3Vyc2l2ZSBidXNpbmVzcy4uLiAqLworc3RhdGljIHZvaWQgZXZhbGxvb3AodW5pb24gbm9kZSAqLCBpbnQpOworc3RhdGljIHZvaWQgZXZhbGZvcih1bmlvbiBub2RlICosIGludCk7CitzdGF0aWMgdm9pZCBldmFsY2FzZSh1bmlvbiBub2RlICosIGludCk7CitzdGF0aWMgdm9pZCBldmFsc3Vic2hlbGwodW5pb24gbm9kZSAqLCBpbnQpOworc3RhdGljIHZvaWQgZXhwcmVkaXIodW5pb24gbm9kZSAqKTsKK3N0YXRpYyB2b2lkIGV2YWxwaXBlKHVuaW9uIG5vZGUgKiwgaW50KTsKK3N0YXRpYyB2b2lkIGV2YWxjb21tYW5kKHVuaW9uIG5vZGUgKiwgaW50KTsKK3N0YXRpYyBpbnQgZXZhbGJsdGluKGNvbnN0IHN0cnVjdCBidWlsdGluY21kICosIGludCwgY2hhciAqKik7CitzdGF0aWMgdm9pZCBwcmVoYXNoKHVuaW9uIG5vZGUgKik7CisKKy8qCisgKiBFdmFsdWF0ZSBhIHBhcnNlIHRyZWUuICBUaGUgdmFsdWUgaXMgbGVmdCBpbiB0aGUgZ2xvYmFsIHZhcmlhYmxlCisgKiBleGl0c3RhdHVzLgorICovCitzdGF0aWMgdm9pZAorZXZhbHRyZWUodW5pb24gbm9kZSAqbiwgaW50IGZsYWdzKQoreworCXN0cnVjdCBqbXBsb2MgKnZvbGF0aWxlIHNhdmVoYW5kbGVyID0gZXhjZXB0aW9uX2hhbmRsZXI7CisJc3RydWN0IGptcGxvYyBqbXBsb2M7CisJaW50IGNoZWNrZXhpdCA9IDA7CisJdm9pZCAoKmV2YWxmbikodW5pb24gbm9kZSAqLCBpbnQpOworCWludCBzdGF0dXM7CisJaW50IGludF9sZXZlbDsKKworCVNBVkVfSU5UKGludF9sZXZlbCk7CisKKwlpZiAobiA9PSBOVUxMKSB7CisJCVRSQUNFKCgiZXZhbHRyZWUoTlVMTCkgY2FsbGVkXG4iKSk7CisJCWdvdG8gb3V0MTsKKwl9CisJVFJBQ0UoKCJldmFsdHJlZSglcDogJWQsICVkKSBjYWxsZWRcbiIsIG4sIG4tPnR5cGUsIGZsYWdzKSk7CisKKwlleGNlcHRpb25faGFuZGxlciA9ICZqbXBsb2M7CisJeworCQlpbnQgZXJyID0gc2V0am1wKGptcGxvYy5sb2MpOworCQlpZiAoZXJyKSB7CisJCQkvKiBpZiBpdCB3YXMgYSBzaWduYWwsIGNoZWNrIGZvciB0cmFwIGhhbmRsZXJzICovCisJCQlpZiAoZXhjZXB0aW9uX3R5cGUgPT0gRVhTSUcpIHsKKwkJCQlUUkFDRSgoImV4Y2VwdGlvbiAlZCAoRVhTSUcpIGluIGV2YWx0cmVlLCBlcnI9JWRcbiIsCisJCQkJCQlleGNlcHRpb25fdHlwZSwgZXJyKSk7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQkvKiBjb250aW51ZSBvbiB0aGUgd2F5IG91dCAqLworCQkJVFJBQ0UoKCJleGNlcHRpb24gJWQgaW4gZXZhbHRyZWUsIHByb3BhZ2F0aW5nIGVycj0lZFxuIiwKKwkJCQkJZXhjZXB0aW9uX3R5cGUsIGVycikpOworCQkJZXhjZXB0aW9uX2hhbmRsZXIgPSBzYXZlaGFuZGxlcjsKKwkJCWxvbmdqbXAoZXhjZXB0aW9uX2hhbmRsZXItPmxvYywgZXJyKTsKKwkJfQorCX0KKworCXN3aXRjaCAobi0+dHlwZSkgeworCWRlZmF1bHQ6CisjaWYgREVCVUcKKwkJb3V0MWZtdCgiTm9kZSB0eXBlID0gJWRcbiIsIG4tPnR5cGUpOworCQlmZmx1c2hfYWxsKCk7CisJCWJyZWFrOworI2VuZGlmCisJY2FzZSBOTk9UOgorCQlldmFsdHJlZShuLT5ubm90LmNvbSwgRVZfVEVTVEVEKTsKKwkJc3RhdHVzID0gIWV4aXRzdGF0dXM7CisJCWdvdG8gc2V0c3RhdHVzOworCWNhc2UgTlJFRElSOgorCQlleHByZWRpcihuLT5ucmVkaXIucmVkaXJlY3QpOworCQlzdGF0dXMgPSByZWRpcmVjdHNhZmUobi0+bnJlZGlyLnJlZGlyZWN0LCBSRURJUl9QVVNIKTsKKwkJaWYgKCFzdGF0dXMpIHsKKwkJCWV2YWx0cmVlKG4tPm5yZWRpci5uLCBmbGFncyAmIEVWX1RFU1RFRCk7CisJCQlzdGF0dXMgPSBleGl0c3RhdHVzOworCQl9CisJCXBvcHJlZGlyKC8qZHJvcDoqLyAwLCAvKnJlc3RvcmU6Ki8gMCAvKiBub3Qgc3VyZSAqLyk7CisJCWdvdG8gc2V0c3RhdHVzOworCWNhc2UgTkNNRDoKKwkJZXZhbGZuID0gZXZhbGNvbW1hbmQ7CisgY2hlY2tleGl0OgorCQlpZiAoZWZsYWcgJiYgIShmbGFncyAmIEVWX1RFU1RFRCkpCisJCQljaGVja2V4aXQgPSB+MDsKKwkJZ290byBjYWxsZXZhbDsKKwljYXNlIE5GT1I6CisJCWV2YWxmbiA9IGV2YWxmb3I7CisJCWdvdG8gY2FsbGV2YWw7CisJY2FzZSBOV0hJTEU6CisJY2FzZSBOVU5USUw6CisJCWV2YWxmbiA9IGV2YWxsb29wOworCQlnb3RvIGNhbGxldmFsOworCWNhc2UgTlNVQlNIRUxMOgorCWNhc2UgTkJBQ0tHTkQ6CisJCWV2YWxmbiA9IGV2YWxzdWJzaGVsbDsKKwkJZ290byBjYWxsZXZhbDsKKwljYXNlIE5QSVBFOgorCQlldmFsZm4gPSBldmFscGlwZTsKKwkJZ290byBjaGVja2V4aXQ7CisJY2FzZSBOQ0FTRToKKwkJZXZhbGZuID0gZXZhbGNhc2U7CisJCWdvdG8gY2FsbGV2YWw7CisJY2FzZSBOQU5EOgorCWNhc2UgTk9SOgorCWNhc2UgTlNFTUk6IHsKKworI2lmIE5BTkQgKyAxICE9IE5PUgorI2Vycm9yIE5BTkQgKyAxICE9IE5PUgorI2VuZGlmCisjaWYgTk9SICsgMSAhPSBOU0VNSQorI2Vycm9yIE5PUiArIDEgIT0gTlNFTUkKKyNlbmRpZgorCQl1bnNpZ25lZCBpc19vciA9IG4tPnR5cGUgLSBOQU5EOworCQlldmFsdHJlZSgKKwkJCW4tPm5iaW5hcnkuY2gxLAorCQkJKGZsYWdzIHwgKChpc19vciA+PiAxKSAtIDEpKSAmIEVWX1RFU1RFRAorCQkpOworCQlpZiAoIWV4aXRzdGF0dXMgPT0gaXNfb3IpCisJCQlicmVhazsKKwkJaWYgKCFldmFsc2tpcCkgeworCQkJbiA9IG4tPm5iaW5hcnkuY2gyOworIGV2YWxuOgorCQkJZXZhbGZuID0gZXZhbHRyZWU7CisgY2FsbGV2YWw6CisJCQlldmFsZm4obiwgZmxhZ3MpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWNhc2UgTklGOgorCQlldmFsdHJlZShuLT5uaWYudGVzdCwgRVZfVEVTVEVEKTsKKwkJaWYgKGV2YWxza2lwKQorCQkJYnJlYWs7CisJCWlmIChleGl0c3RhdHVzID09IDApIHsKKwkJCW4gPSBuLT5uaWYuaWZwYXJ0OworCQkJZ290byBldmFsbjsKKwkJfQorCQlpZiAobi0+bmlmLmVsc2VwYXJ0KSB7CisJCQluID0gbi0+bmlmLmVsc2VwYXJ0OworCQkJZ290byBldmFsbjsKKwkJfQorCQlnb3RvIHN1Y2Nlc3M7CisJY2FzZSBOREVGVU46CisJCWRlZnVuKG4tPm5hcmcudGV4dCwgbi0+bmFyZy5uZXh0KTsKKyBzdWNjZXNzOgorCQlzdGF0dXMgPSAwOworIHNldHN0YXR1czoKKwkJZXhpdHN0YXR1cyA9IHN0YXR1czsKKwkJYnJlYWs7CisJfQorCisgb3V0OgorCWV4Y2VwdGlvbl9oYW5kbGVyID0gc2F2ZWhhbmRsZXI7CisKKyBvdXQxOgorCS8qIE9yZGVyIG9mIGNoZWNrcyBiZWxvdyBpcyBpbXBvcnRhbnQ6CisJICogc2lnbmFsIGhhbmRsZXJzIHRyaWdnZXIgYmVmb3JlIGV4aXQgY2F1c2VkIGJ5ICJzZXQgLWUiLgorCSAqLworCWlmIChwZW5kaW5nX3NpZyAmJiBkb3RyYXAoKSkKKwkJZ290byBleGV4aXQ7CisJaWYgKGNoZWNrZXhpdCAmIGV4aXRzdGF0dXMpCisJCWV2YWxza2lwIHw9IFNLSVBFVkFMOworCisJaWYgKGZsYWdzICYgRVZfRVhJVCkgeworIGV4ZXhpdDoKKwkJcmFpc2VfZXhjZXB0aW9uKEVYRVhJVCk7CisJfQorCisJUkVTVE9SRV9JTlQoaW50X2xldmVsKTsKKwlUUkFDRSgoImxlYXZpbmcgZXZhbHRyZWUgKG5vIGludGVycnVwdHMpXG4iKSk7Cit9CisKKyNpZiAhZGVmaW5lZChfX2FscGhhX18pIHx8IChkZWZpbmVkKF9fR05VQ19fKSAmJiBfX0dOVUNfXyA+PSAzKQorc3RhdGljCisjZW5kaWYKK3ZvaWQgZXZhbHRyZWVucih1bmlvbiBub2RlICosIGludCkgX19hdHRyaWJ1dGVfXyAoKGFsaWFzKCJldmFsdHJlZSIpLF9fbm9yZXR1cm5fXykpOworCitzdGF0aWMgdm9pZAorZXZhbGxvb3AodW5pb24gbm9kZSAqbiwgaW50IGZsYWdzKQoreworCWludCBzdGF0dXM7CisKKwlsb29wbmVzdCsrOworCXN0YXR1cyA9IDA7CisJZmxhZ3MgJj0gRVZfVEVTVEVEOworCWZvciAoOzspIHsKKwkJaW50IGk7CisKKwkJZXZhbHRyZWUobi0+bmJpbmFyeS5jaDEsIEVWX1RFU1RFRCk7CisJCWlmIChldmFsc2tpcCkgeworIHNraXBwaW5nOgorCQkJaWYgKGV2YWxza2lwID09IFNLSVBDT05UICYmIC0tc2tpcGNvdW50IDw9IDApIHsKKwkJCQlldmFsc2tpcCA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoZXZhbHNraXAgPT0gU0tJUEJSRUFLICYmIC0tc2tpcGNvdW50IDw9IDApCisJCQkJZXZhbHNraXAgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJaSA9IGV4aXRzdGF0dXM7CisJCWlmIChuLT50eXBlICE9IE5XSElMRSkKKwkJCWkgPSAhaTsKKwkJaWYgKGkgIT0gMCkKKwkJCWJyZWFrOworCQlldmFsdHJlZShuLT5uYmluYXJ5LmNoMiwgZmxhZ3MpOworCQlzdGF0dXMgPSBleGl0c3RhdHVzOworCQlpZiAoZXZhbHNraXApCisJCQlnb3RvIHNraXBwaW5nOworCX0KKwlsb29wbmVzdC0tOworCWV4aXRzdGF0dXMgPSBzdGF0dXM7Cit9CisKK3N0YXRpYyB2b2lkCitldmFsZm9yKHVuaW9uIG5vZGUgKm4sIGludCBmbGFncykKK3sKKwlzdHJ1Y3QgYXJnbGlzdCBhcmdsaXN0OworCXVuaW9uIG5vZGUgKmFyZ3A7CisJc3RydWN0IHN0cmxpc3QgKnNwOworCXN0cnVjdCBzdGFja21hcmsgc21hcms7CisKKwlzZXRzdGFja21hcmsoJnNtYXJrKTsKKwlhcmdsaXN0Lmxpc3QgPSBOVUxMOworCWFyZ2xpc3QubGFzdHAgPSAmYXJnbGlzdC5saXN0OworCWZvciAoYXJncCA9IG4tPm5mb3IuYXJnczsgYXJncDsgYXJncCA9IGFyZ3AtPm5hcmcubmV4dCkgeworCQlleHBhbmRhcmcoYXJncCwgJmFyZ2xpc3QsIEVYUF9GVUxMIHwgRVhQX1RJTERFKTsKKwkJLyogWFhYICovCisJCWlmIChldmFsc2tpcCkKKwkJCWdvdG8gb3V0OworCX0KKwkqYXJnbGlzdC5sYXN0cCA9IE5VTEw7CisKKwlleGl0c3RhdHVzID0gMDsKKwlsb29wbmVzdCsrOworCWZsYWdzICY9IEVWX1RFU1RFRDsKKwlmb3IgKHNwID0gYXJnbGlzdC5saXN0OyBzcDsgc3AgPSBzcC0+bmV4dCkgeworCQlzZXR2YXIwKG4tPm5mb3IudmFyLCBzcC0+dGV4dCk7CisJCWV2YWx0cmVlKG4tPm5mb3IuYm9keSwgZmxhZ3MpOworCQlpZiAoZXZhbHNraXApIHsKKwkJCWlmIChldmFsc2tpcCA9PSBTS0lQQ09OVCAmJiAtLXNraXBjb3VudCA8PSAwKSB7CisJCQkJZXZhbHNraXAgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGV2YWxza2lwID09IFNLSVBCUkVBSyAmJiAtLXNraXBjb3VudCA8PSAwKQorCQkJCWV2YWxza2lwID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCWxvb3BuZXN0LS07Cisgb3V0OgorCXBvcHN0YWNrbWFyaygmc21hcmspOworfQorCitzdGF0aWMgdm9pZAorZXZhbGNhc2UodW5pb24gbm9kZSAqbiwgaW50IGZsYWdzKQoreworCXVuaW9uIG5vZGUgKmNwOworCXVuaW9uIG5vZGUgKnBhdHA7CisJc3RydWN0IGFyZ2xpc3QgYXJnbGlzdDsKKwlzdHJ1Y3Qgc3RhY2ttYXJrIHNtYXJrOworCisJc2V0c3RhY2ttYXJrKCZzbWFyayk7CisJYXJnbGlzdC5saXN0ID0gTlVMTDsKKwlhcmdsaXN0Lmxhc3RwID0gJmFyZ2xpc3QubGlzdDsKKwlleHBhbmRhcmcobi0+bmNhc2UuZXhwciwgJmFyZ2xpc3QsIEVYUF9USUxERSk7CisJZXhpdHN0YXR1cyA9IDA7CisJZm9yIChjcCA9IG4tPm5jYXNlLmNhc2VzOyBjcCAmJiBldmFsc2tpcCA9PSAwOyBjcCA9IGNwLT5uY2xpc3QubmV4dCkgeworCQlmb3IgKHBhdHAgPSBjcC0+bmNsaXN0LnBhdHRlcm47IHBhdHA7IHBhdHAgPSBwYXRwLT5uYXJnLm5leHQpIHsKKwkJCWlmIChjYXNlbWF0Y2gocGF0cCwgYXJnbGlzdC5saXN0LT50ZXh0KSkgeworCQkJCWlmIChldmFsc2tpcCA9PSAwKSB7CisJCQkJCWV2YWx0cmVlKGNwLT5uY2xpc3QuYm9keSwgZmxhZ3MpOworCQkJCX0KKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJfQorCX0KKyBvdXQ6CisJcG9wc3RhY2ttYXJrKCZzbWFyayk7Cit9CisKKy8qCisgKiBLaWNrIG9mZiBhIHN1YnNoZWxsIHRvIGV2YWx1YXRlIGEgdHJlZS4KKyAqLworc3RhdGljIHZvaWQKK2V2YWxzdWJzaGVsbCh1bmlvbiBub2RlICpuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IGpvYiAqanA7CisJaW50IGJhY2tnbmQgPSAobi0+dHlwZSA9PSBOQkFDS0dORCk7CisJaW50IHN0YXR1czsKKworCWV4cHJlZGlyKG4tPm5yZWRpci5yZWRpcmVjdCk7CisJaWYgKCFiYWNrZ25kICYmIChmbGFncyAmIEVWX0VYSVQpICYmICFtYXlfaGF2ZV90cmFwcykKKwkJZ290byBub2Zvcms7CisJSU5UX09GRjsKKwlqcCA9IG1ha2Vqb2IoLypuLCovIDEpOworCWlmIChmb3Jrc2hlbGwoanAsIG4sIGJhY2tnbmQpID09IDApIHsKKwkJLyogY2hpbGQgKi8KKwkJSU5UX09OOworCQlmbGFncyB8PSBFVl9FWElUOworCQlpZiAoYmFja2duZCkKKwkJCWZsYWdzICY9IH5FVl9URVNURUQ7Cisgbm9mb3JrOgorCQlyZWRpcmVjdChuLT5ucmVkaXIucmVkaXJlY3QsIDApOworCQlldmFsdHJlZW5yKG4tPm5yZWRpci5uLCBmbGFncyk7CisJCS8qIG5ldmVyIHJldHVybnMgKi8KKwl9CisJc3RhdHVzID0gMDsKKwlpZiAoIWJhY2tnbmQpCisJCXN0YXR1cyA9IHdhaXRmb3Jqb2IoanApOworCWV4aXRzdGF0dXMgPSBzdGF0dXM7CisJSU5UX09OOworfQorCisvKgorICogQ29tcHV0ZSB0aGUgbmFtZXMgb2YgdGhlIGZpbGVzIGluIGEgcmVkaXJlY3Rpb24gbGlzdC4KKyAqLworc3RhdGljIHZvaWQgZml4cmVkaXIodW5pb24gbm9kZSAqLCBjb25zdCBjaGFyICosIGludCk7CitzdGF0aWMgdm9pZAorZXhwcmVkaXIodW5pb24gbm9kZSAqbikKK3sKKwl1bmlvbiBub2RlICpyZWRpcjsKKworCWZvciAocmVkaXIgPSBuOyByZWRpcjsgcmVkaXIgPSByZWRpci0+bmZpbGUubmV4dCkgeworCQlzdHJ1Y3QgYXJnbGlzdCBmbjsKKworCQlmbi5saXN0ID0gTlVMTDsKKwkJZm4ubGFzdHAgPSAmZm4ubGlzdDsKKwkJc3dpdGNoIChyZWRpci0+dHlwZSkgeworCQljYXNlIE5GUk9NVE86CisJCWNhc2UgTkZST006CisJCWNhc2UgTlRPOgorI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwkJY2FzZSBOVE8yOgorI2VuZGlmCisJCWNhc2UgTkNMT0JCRVI6CisJCWNhc2UgTkFQUEVORDoKKwkJCWV4cGFuZGFyZyhyZWRpci0+bmZpbGUuZm5hbWUsICZmbiwgRVhQX1RJTERFIHwgRVhQX1JFRElSKTsKKwkJCVRSQUNFKCgiZXhwcmVkaXIgZXhwYW5kZWQgdG8gJyVzJ1xuIiwgZm4ubGlzdC0+dGV4dCkpOworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKyBzdG9yZV9leHBmbmFtZToKKyNlbmRpZgorI2lmIDAKKy8vIEJ5IHRoZSBkZXNpZ24gb2Ygc3RhY2sgYWxsb2NhdG9yLCB0aGUgbG9vcCBvZiB0aGlzIGtpbmQ6CisvLwl3aGlsZSB0cnVlOyBkbyB3aGlsZSB0cnVlOyBkbyBicmVhazsgZG9uZSA8L2Rldi9udWxsOyBkb25lCisvLyB3aWxsIGxvb2sgbGlrZSBhIG1lbW9yeSBsZWFrOiBhc2ggcGxhbnMgdG8gZnJlZSBleHBmbmFtZSdzCisvLyBvZiAiL2Rldi9udWxsIiBhcyBzb29uIGFzIGl0IGZpbmlzaGVzIHJ1bm5pbmcgdGhlIGxvb3AKKy8vIChpbiB0aGlzIGNhc2UsIG5ldmVyKS4KKy8vIFRoaXMgImZpeCIgaXMgd3Jvbmc6CisJCQlpZiAocmVkaXItPm5maWxlLmV4cGZuYW1lKQorCQkJCXN0dW5hbGxvYyhyZWRpci0+bmZpbGUuZXhwZm5hbWUpOworLy8gSXQgcmVzdWx0cyBpbiBjb3JydXB0ZWQgc3RhdGUgb2Ygc3RhY2tlZCBhbGxvY2F0aW9ucy4KKyNlbmRpZgorCQkJcmVkaXItPm5maWxlLmV4cGZuYW1lID0gZm4ubGlzdC0+dGV4dDsKKwkJCWJyZWFrOworCQljYXNlIE5GUk9NRkQ6CisJCWNhc2UgTlRPRkQ6IC8qID4mICovCisJCQlpZiAocmVkaXItPm5kdXAudm5hbWUpIHsKKwkJCQlleHBhbmRhcmcocmVkaXItPm5kdXAudm5hbWUsICZmbiwgRVhQX0ZVTEwgfCBFWFBfVElMREUpOworCQkJCWlmIChmbi5saXN0ID09IE5VTEwpCisJCQkJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCJyZWRpciBlcnJvciIpOworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKy8vRklYTUU6IHdlIHVzZWQgZXhwYW5kYXJnIHdpdGggZGlmZmVyZW50IGFyZ3MhCisJCQkJaWYgKCFpc2RpZ2l0X3N0cjkoZm4ubGlzdC0+dGV4dCkpIHsKKwkJCQkJLyogPiZmaWxlLCBub3QgPiZmZCAqLworCQkJCQlpZiAocmVkaXItPm5maWxlLmZkICE9IDEpIC8qIDEyMz4mZmlsZSAtIEJBRCAqLworCQkJCQkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoInJlZGlyIGVycm9yIik7CisJCQkJCXJlZGlyLT50eXBlID0gTlRPMjsKKwkJCQkJZ290byBzdG9yZV9leHBmbmFtZTsKKwkJCQl9CisjZW5kaWYKKwkJCQlmaXhyZWRpcihyZWRpciwgZm4ubGlzdC0+dGV4dCwgMSk7CisJCQl9CisJCQlicmVhazsKKwkJfQorCX0KK30KKworLyoKKyAqIEV2YWx1YXRlIGEgcGlwZWxpbmUuICBBbGwgdGhlIHByb2Nlc3NlcyBpbiB0aGUgcGlwZWxpbmUgYXJlIGNoaWxkcmVuCisgKiBvZiB0aGUgcHJvY2VzcyBjcmVhdGluZyB0aGUgcGlwZWxpbmUuICAoVGhpcyBkaWZmZXJzIGZyb20gc29tZSB2ZXJzaW9ucworICogb2YgdGhlIHNoZWxsLCB3aGljaCBtYWtlIHRoZSBsYXN0IHByb2Nlc3MgaW4gYSBwaXBlbGluZSB0aGUgcGFyZW50CisgKiBvZiBhbGwgdGhlIHJlc3QuKQorICovCitzdGF0aWMgdm9pZAorZXZhbHBpcGUodW5pb24gbm9kZSAqbiwgaW50IGZsYWdzKQoreworCXN0cnVjdCBqb2IgKmpwOworCXN0cnVjdCBub2RlbGlzdCAqbHA7CisJaW50IHBpcGVsZW47CisJaW50IHByZXZmZDsKKwlpbnQgcGlwWzJdOworCisJVFJBQ0UoKCJldmFscGlwZSgweCVseCkgY2FsbGVkXG4iLCAobG9uZyluKSk7CisJcGlwZWxlbiA9IDA7CisJZm9yIChscCA9IG4tPm5waXBlLmNtZGxpc3Q7IGxwOyBscCA9IGxwLT5uZXh0KQorCQlwaXBlbGVuKys7CisJZmxhZ3MgfD0gRVZfRVhJVDsKKwlJTlRfT0ZGOworCWpwID0gbWFrZWpvYigvKm4sKi8gcGlwZWxlbik7CisJcHJldmZkID0gLTE7CisJZm9yIChscCA9IG4tPm5waXBlLmNtZGxpc3Q7IGxwOyBscCA9IGxwLT5uZXh0KSB7CisJCXByZWhhc2gobHAtPm4pOworCQlwaXBbMV0gPSAtMTsKKwkJaWYgKGxwLT5uZXh0KSB7CisJCQlpZiAocGlwZShwaXApIDwgMCkgeworCQkJCWNsb3NlKHByZXZmZCk7CisJCQkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoInBpcGUgY2FsbCBmYWlsZWQiKTsKKwkJCX0KKwkJfQorCQlpZiAoZm9ya3NoZWxsKGpwLCBscC0+biwgbi0+bnBpcGUucGlwZV9iYWNrZ25kKSA9PSAwKSB7CisJCQlJTlRfT047CisJCQlpZiAocGlwWzFdID49IDApIHsKKwkJCQljbG9zZShwaXBbMF0pOworCQkJfQorCQkJaWYgKHByZXZmZCA+IDApIHsKKwkJCQlkdXAyKHByZXZmZCwgMCk7CisJCQkJY2xvc2UocHJldmZkKTsKKwkJCX0KKwkJCWlmIChwaXBbMV0gPiAxKSB7CisJCQkJZHVwMihwaXBbMV0sIDEpOworCQkJCWNsb3NlKHBpcFsxXSk7CisJCQl9CisJCQlldmFsdHJlZW5yKGxwLT5uLCBmbGFncyk7CisJCQkvKiBuZXZlciByZXR1cm5zICovCisJCX0KKwkJaWYgKHByZXZmZCA+PSAwKQorCQkJY2xvc2UocHJldmZkKTsKKwkJcHJldmZkID0gcGlwWzBdOworCQkvKiBEb24ndCB3YW50IHRvIHRyaWdnZXIgZGVidWdnaW5nICovCisJCWlmIChwaXBbMV0gIT0gLTEpCisJCQljbG9zZShwaXBbMV0pOworCX0KKwlpZiAobi0+bnBpcGUucGlwZV9iYWNrZ25kID09IDApIHsKKwkJZXhpdHN0YXR1cyA9IHdhaXRmb3Jqb2IoanApOworCQlUUkFDRSgoImV2YWxwaXBlOiAgam9iIGRvbmUgZXhpdCBzdGF0dXMgJWRcbiIsIGV4aXRzdGF0dXMpKTsKKwl9CisJSU5UX09OOworfQorCisvKgorICogQ29udHJvbHMgd2hldGhlciB0aGUgc2hlbGwgaXMgaW50ZXJhY3RpdmUgb3Igbm90LgorICovCitzdGF0aWMgdm9pZAorc2V0aW50ZXJhY3RpdmUoaW50IG9uKQoreworCXN0YXRpYyBzbWFsbGludCBpc19pbnRlcmFjdGl2ZTsKKworCWlmICgrK29uID09IGlzX2ludGVyYWN0aXZlKQorCQlyZXR1cm47CisJaXNfaW50ZXJhY3RpdmUgPSBvbjsKKwlzZXRzaWduYWwoU0lHSU5UKTsKKwlzZXRzaWduYWwoU0lHUVVJVCk7CisJc2V0c2lnbmFsKFNJR1RFUk0pOworI2lmICFFTkFCTEVfRkVBVFVSRV9TSF9FWFRSQV9RVUlFVAorCWlmIChpc19pbnRlcmFjdGl2ZSA+IDEpIHsKKwkJLyogTG9va3MgbGlrZSB0aGV5IHdhbnQgYW4gaW50ZXJhY3RpdmUgc2hlbGwgKi8KKwkJc3RhdGljIHNtYWxsaW50IGRpZF9iYW5uZXI7CisKKwkJaWYgKCFkaWRfYmFubmVyKSB7CisJCQkvKiBub3RlOiBhc2ggYW5kIGh1c2ggc2hhcmUgdGhpcyBzdHJpbmcgKi8KKwkJCW91dDFmbXQoIlxuXG4lcyAlc1xuIgorCQkJCUlGX0FTSF9IRUxQKCJFbnRlciAnaGVscCcgZm9yIGEgbGlzdCBvZiBidWlsdC1pbiBjb21tYW5kcy5cbiIpCisJCQkJIlxuIiwKKwkJCQliYl9iYW5uZXIsCisJCQkJImJ1aWx0LWluIHNoZWxsIChhc2gpIgorCQkJKTsKKwkJCWRpZF9iYW5uZXIgPSAxOworCQl9CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkCitvcHRzY2hhbmdlZCh2b2lkKQoreworI2lmIERFQlVHCisJb3BlbnRyYWNlKCk7CisjZW5kaWYKKwlzZXRpbnRlcmFjdGl2ZShpZmxhZyk7CisJc2V0am9iY3RsKG1mbGFnKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1ZJCisJaWYgKHZpZmxhZykKKwkJbGluZV9pbnB1dF9zdGF0ZS0+ZmxhZ3MgfD0gVklfTU9ERTsKKwllbHNlCisJCWxpbmVfaW5wdXRfc3RhdGUtPmZsYWdzICY9IH5WSV9NT0RFOworI2Vsc2UKKwl2aWZsYWcgPSAwOyAvKiBmb3JjaWJseSBrZWVwIHRoZSBvcHRpb24gb2ZmICovCisjZW5kaWYKK30KKworc3RhdGljIHN0cnVjdCBsb2NhbHZhciAqbG9jYWx2YXJzOworCisvKgorICogQ2FsbGVkIGFmdGVyIGEgZnVuY3Rpb24gcmV0dXJucy4KKyAqIEludGVycnVwdHMgbXVzdCBiZSBvZmYuCisgKi8KK3N0YXRpYyB2b2lkCitwb3Bsb2NhbHZhcnModm9pZCkKK3sKKwlzdHJ1Y3QgbG9jYWx2YXIgKmx2cDsKKwlzdHJ1Y3QgdmFyICp2cDsKKworCXdoaWxlICgobHZwID0gbG9jYWx2YXJzKSAhPSBOVUxMKSB7CisJCWxvY2FsdmFycyA9IGx2cC0+bmV4dDsKKwkJdnAgPSBsdnAtPnZwOworCQlUUkFDRSgoInBvcGxvY2FsdmFyICVzXG4iLCB2cCA/IHZwLT52YXJfdGV4dCA6ICItIikpOworCQlpZiAodnAgPT0gTlVMTCkgeyAgICAgICAvKiAkLSBzYXZlZCAqLworCQkJbWVtY3B5KG9wdGxpc3QsIGx2cC0+dGV4dCwgc2l6ZW9mKG9wdGxpc3QpKTsKKwkJCWZyZWUoKGNoYXIqKWx2cC0+dGV4dCk7CisJCQlvcHRzY2hhbmdlZCgpOworCQl9IGVsc2UgaWYgKChsdnAtPmZsYWdzICYgKFZVTlNFVHxWU1RSRklYRUQpKSA9PSBWVU5TRVQpIHsKKwkJCXVuc2V0dmFyKHZwLT52YXJfdGV4dCk7CisJCX0gZWxzZSB7CisJCQlpZiAodnAtPnZhcl9mdW5jKQorCQkJCXZwLT52YXJfZnVuYyh2YXJfZW5kKGx2cC0+dGV4dCkpOworCQkJaWYgKCh2cC0+ZmxhZ3MgJiAoVlRFWFRGSVhFRHxWU1RBQ0spKSA9PSAwKQorCQkJCWZyZWUoKGNoYXIqKXZwLT52YXJfdGV4dCk7CisJCQl2cC0+ZmxhZ3MgPSBsdnAtPmZsYWdzOworCQkJdnAtPnZhcl90ZXh0ID0gbHZwLT50ZXh0OworCQl9CisJCWZyZWUobHZwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQKK2V2YWxmdW4oc3RydWN0IGZ1bmNub2RlICpmdW5jLCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIGludCBmbGFncykKK3sKKwl2b2xhdGlsZSBzdHJ1Y3Qgc2hwYXJhbSBzYXZlcGFyYW07CisJc3RydWN0IGxvY2FsdmFyICp2b2xhdGlsZSBzYXZlbG9jYWx2YXJzOworCXN0cnVjdCBqbXBsb2MgKnZvbGF0aWxlIHNhdmVoYW5kbGVyOworCXN0cnVjdCBqbXBsb2Mgam1wbG9jOworCWludCBlOworCisJc2F2ZXBhcmFtID0gc2hlbGxwYXJhbTsKKwlzYXZlbG9jYWx2YXJzID0gbG9jYWx2YXJzOworCWUgPSBzZXRqbXAoam1wbG9jLmxvYyk7CisJaWYgKGUpIHsKKwkJZ290byBmdW5jZG9uZTsKKwl9CisJSU5UX09GRjsKKwlzYXZlaGFuZGxlciA9IGV4Y2VwdGlvbl9oYW5kbGVyOworCWV4Y2VwdGlvbl9oYW5kbGVyID0gJmptcGxvYzsKKwlsb2NhbHZhcnMgPSBOVUxMOworCXNoZWxscGFyYW0ubWFsbG9jZWQgPSAwOworCWZ1bmMtPmNvdW50Kys7CisJZnVuY25lc3QrKzsKKwlJTlRfT047CisJc2hlbGxwYXJhbS5ucGFyYW0gPSBhcmdjIC0gMTsKKwlzaGVsbHBhcmFtLnAgPSBhcmd2ICsgMTsKKyNpZiBFTkFCTEVfQVNIX0dFVE9QVFMKKwlzaGVsbHBhcmFtLm9wdGluZCA9IDE7CisJc2hlbGxwYXJhbS5vcHRvZmYgPSAtMTsKKyNlbmRpZgorCWV2YWx0cmVlKCZmdW5jLT5uLCBmbGFncyAmIEVWX1RFU1RFRCk7CisgZnVuY2RvbmU6CisJSU5UX09GRjsKKwlmdW5jbmVzdC0tOworCWZyZWVmdW5jKGZ1bmMpOworCXBvcGxvY2FsdmFycygpOworCWxvY2FsdmFycyA9IHNhdmVsb2NhbHZhcnM7CisJZnJlZXBhcmFtKCZzaGVsbHBhcmFtKTsKKwlzaGVsbHBhcmFtID0gc2F2ZXBhcmFtOworCWV4Y2VwdGlvbl9oYW5kbGVyID0gc2F2ZWhhbmRsZXI7CisJSU5UX09OOworCWV2YWxza2lwICY9IH5TS0lQRlVOQzsKKwlyZXR1cm4gZTsKK30KKworI2lmIEVOQUJMRV9BU0hfQ01EQ01ECitzdGF0aWMgY2hhciAqKgorcGFyc2VfY29tbWFuZF9hcmdzKGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICoqcGF0aCkKK3sKKwljaGFyICpjcCwgYzsKKworCWZvciAoOzspIHsKKwkJY3AgPSAqKythcmd2OworCQlpZiAoIWNwKQorCQkJcmV0dXJuIDA7CisJCWlmICgqY3ArKyAhPSAnLScpCisJCQlicmVhazsKKwkJYyA9ICpjcCsrOworCQlpZiAoIWMpCisJCQlicmVhazsKKwkJaWYgKGMgPT0gJy0nICYmICEqY3ApIHsKKwkJCWFyZ3YrKzsKKwkJCWJyZWFrOworCQl9CisJCWRvIHsKKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSAncCc6CisJCQkJKnBhdGggPSBiYl9kZWZhdWx0X3BhdGg7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCS8qIHJ1biAndHlwZWNtZCcgZm9yIG90aGVyIG9wdGlvbnMgKi8KKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJCWMgPSAqY3ArKzsKKwkJfSB3aGlsZSAoYyk7CisJfQorCXJldHVybiBhcmd2OworfQorI2VuZGlmCisKKy8qCisgKiBNYWtlIGEgdmFyaWFibGUgYSBsb2NhbCB2YXJpYWJsZS4gIFdoZW4gYSB2YXJpYWJsZSBpcyBtYWRlIGxvY2FsLCBpdCdzCisgKiB2YWx1ZSBhbmQgZmxhZ3MgYXJlIHNhdmVkIGluIGEgbG9jYWx2YXIgc3RydWN0dXJlLiAgVGhlIHNhdmVkIHZhbHVlcworICogd2lsbCBiZSByZXN0b3JlZCB3aGVuIHRoZSBzaGVsbCBmdW5jdGlvbiByZXR1cm5zLiAgV2UgaGFuZGxlIHRoZSBuYW1lCisgKiAiLSIgYXMgYSBzcGVjaWFsIGNhc2U6IGl0IG1ha2VzIGNoYW5nZXMgdG8gInNldCArLW9wdGlvbnMiIGxvY2FsCisgKiAob3B0aW9ucyB3aWxsIGJlIHJlc3RvcmVkIG9uIHJldHVybiBmcm9tIHRoZSBmdW5jdGlvbikuCisgKi8KK3N0YXRpYyB2b2lkCitta2xvY2FsKGNoYXIgKm5hbWUpCit7CisJc3RydWN0IGxvY2FsdmFyICpsdnA7CisJc3RydWN0IHZhciAqKnZwcDsKKwlzdHJ1Y3QgdmFyICp2cDsKKwljaGFyICplcSA9IHN0cmNocihuYW1lLCAnPScpOworCisJSU5UX09GRjsKKwkvKiBDYXRlciBmb3IgZHVwbGljYXRlICJsb2NhbCIuIEV4YW1wbGVzOgorCSAqIHg9MDsgZigpIHsgbG9jYWwgeD0xOyBlY2hvICR4OyBsb2NhbCB4OyBlY2hvICR4OyB9OyBmOyBlY2hvICR4CisJICogeD0wOyBmKCkgeyBsb2NhbCB4PTE7IGVjaG8gJHg7IGxvY2FsIHg9MjsgZWNobyAkeDsgfTsgZjsgZWNobyAkeAorCSAqLworCWx2cCA9IGxvY2FsdmFyczsKKwl3aGlsZSAobHZwKSB7CisJCWlmIChsdnAtPnZwICYmIHZhcmNtcChsdnAtPnZwLT52YXJfdGV4dCwgbmFtZSkgPT0gMCkgeworCQkJaWYgKGVxKQorCQkJCXNldHZhcmVxKG5hbWUsIDApOworCQkJLyogZWxzZToKKwkJCSAqIGl0J3MgYSBkdXBsaWNhdGUgImxvY2FsIFZBUiIgZGVjbGFyYXRpb24sIGRvIG5vdGhpbmcKKwkJCSAqLworCQkJcmV0dXJuOworCQl9CisJCWx2cCA9IGx2cC0+bmV4dDsKKwl9CisKKwlsdnAgPSBja3phbGxvYyhzaXplb2YoKmx2cCkpOworCWlmIChMT05FX0RBU0gobmFtZSkpIHsKKwkJY2hhciAqcDsKKwkJcCA9IGNrbWFsbG9jKHNpemVvZihvcHRsaXN0KSk7CisJCWx2cC0+dGV4dCA9IG1lbWNweShwLCBvcHRsaXN0LCBzaXplb2Yob3B0bGlzdCkpOworCQl2cCA9IE5VTEw7CisJfSBlbHNlIHsKKwkJdnBwID0gaGFzaHZhcihuYW1lKTsKKwkJdnAgPSAqZmluZHZhcih2cHAsIG5hbWUpOworCQlpZiAodnAgPT0gTlVMTCkgeworCQkJLyogdmFyaWFibGUgZGlkIG5vdCBleGlzdCB5ZXQgKi8KKwkJCWlmIChlcSkKKwkJCQlzZXR2YXJlcShuYW1lLCBWU1RSRklYRUQpOworCQkJZWxzZQorCQkJCXNldHZhcihuYW1lLCBOVUxMLCBWU1RSRklYRUQpOworCQkJdnAgPSAqdnBwOyAgICAgIC8qIHRoZSBuZXcgdmFyaWFibGUgKi8KKwkJCWx2cC0+ZmxhZ3MgPSBWVU5TRVQ7CisJCX0gZWxzZSB7CisJCQlsdnAtPnRleHQgPSB2cC0+dmFyX3RleHQ7CisJCQlsdnAtPmZsYWdzID0gdnAtPmZsYWdzOworCQkJLyogbWFrZSBzdXJlIG5laXRoZXIgInN0cnVjdCB2YXIiIG5vciBzdHJpbmcgZ2V0cyBmcmVlZAorCQkJICogZHVyaW5nICh1bilzZXR0aW5nOgorCQkJICovCisJCQl2cC0+ZmxhZ3MgfD0gVlNUUkZJWEVEfFZURVhURklYRUQ7CisJCQlpZiAoZXEpCisJCQkJc2V0dmFyZXEobmFtZSwgMCk7CisJCQllbHNlCisJCQkJLyogImxvY2FsIFZBUiIgdW5zZXRzIFZBUjogKi8KKwkJCQlzZXR2YXIwKG5hbWUsIE5VTEwpOworCQl9CisJfQorCWx2cC0+dnAgPSB2cDsKKwlsdnAtPm5leHQgPSBsb2NhbHZhcnM7CisJbG9jYWx2YXJzID0gbHZwOworCUlOVF9PTjsKK30KKworLyoKKyAqIFRoZSAibG9jYWwiIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DCitsb2NhbGNtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNoYXIgKm5hbWU7CisKKwlhcmd2ID0gYXJncHRyOworCXdoaWxlICgobmFtZSA9ICphcmd2KyspICE9IE5VTEwpIHsKKwkJbWtsb2NhbChuYW1lKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DCitmYWxzZWNtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMKK3RydWVjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DCitleGVjY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaWYgKGFyZ3ZbMV0pIHsKKwkJaWZsYWcgPSAwOyAgICAgICAgICAgICAgLyogZXhpdCBvbiBlcnJvciAqLworCQltZmxhZyA9IDA7CisJCW9wdHNjaGFuZ2VkKCk7CisJCXNoZWxsZXhlYyhhcmd2ICsgMSwgcGF0aHZhbCgpLCAwKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgcmV0dXJuIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DCityZXR1cm5jbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwkvKgorCSAqIElmIGNhbGxlZCBvdXRzaWRlIGEgZnVuY3Rpb24sIGRvIHdoYXQga3NoIGRvZXM7CisJICogc2tpcCB0aGUgcmVzdCBvZiB0aGUgZmlsZS4KKwkgKi8KKwlldmFsc2tpcCA9IGZ1bmNuZXN0ID8gU0tJUEZVTkMgOiBTS0lQRklMRTsKKwlyZXR1cm4gYXJndlsxXSA/IG51bWJlcihhcmd2WzFdKSA6IGV4aXRzdGF0dXM7Cit9CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zIGZvciBidWlsdGludGFiW10gKi8KK3N0YXRpYyBpbnQgYnJlYWtjbWQoaW50LCBjaGFyICoqKSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IGRvdGNtZChpbnQsIGNoYXIgKiopIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgZXZhbGNtZChpbnQsIGNoYXIgKiopIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgZXhpdGNtZChpbnQsIGNoYXIgKiopIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgZXhwb3J0Y21kKGludCwgY2hhciAqKikgRkFTVF9GVU5DOworI2lmIEVOQUJMRV9BU0hfR0VUT1BUUworc3RhdGljIGludCBnZXRvcHRzY21kKGludCwgY2hhciAqKikgRkFTVF9GVU5DOworI2VuZGlmCisjaWYgRU5BQkxFX0FTSF9IRUxQCitzdGF0aWMgaW50IGhlbHBjbWQoaW50LCBjaGFyICoqKSBGQVNUX0ZVTkM7CisjZW5kaWYKKyNpZiBNQVhfSElTVE9SWQorc3RhdGljIGludCBoaXN0b3J5Y21kKGludCwgY2hhciAqKikgRkFTVF9GVU5DOworI2VuZGlmCisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorc3RhdGljIGludCBsZXRjbWQoaW50LCBjaGFyICoqKSBGQVNUX0ZVTkM7CisjZW5kaWYKK3N0YXRpYyBpbnQgcmVhZGNtZChpbnQsIGNoYXIgKiopIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgc2V0Y21kKGludCwgY2hhciAqKikgRkFTVF9GVU5DOworc3RhdGljIGludCBzaGlmdGNtZChpbnQsIGNoYXIgKiopIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgdGltZXNjbWQoaW50LCBjaGFyICoqKSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IHRyYXBjbWQoaW50LCBjaGFyICoqKSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IHVtYXNrY21kKGludCwgY2hhciAqKikgRkFTVF9GVU5DOworc3RhdGljIGludCB1bnNldGNtZChpbnQsIGNoYXIgKiopIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgdWxpbWl0Y21kKGludCwgY2hhciAqKikgRkFTVF9GVU5DOworCisjZGVmaW5lIEJVSUxUSU5fTk9TUEVDICAgICAgICAgICIwIgorI2RlZmluZSBCVUlMVElOX1NQRUNJQUwgICAgICAgICAiMSIKKyNkZWZpbmUgQlVJTFRJTl9SRUdVTEFSICAgICAgICAgIjIiCisjZGVmaW5lIEJVSUxUSU5fU1BFQ19SRUcgICAgICAgICIzIgorI2RlZmluZSBCVUlMVElOX0FTU0lHTiAgICAgICAgICAiNCIKKyNkZWZpbmUgQlVJTFRJTl9TUEVDX0FTU0cgICAgICAgIjUiCisjZGVmaW5lIEJVSUxUSU5fUkVHX0FTU0cgICAgICAgICI2IgorI2RlZmluZSBCVUlMVElOX1NQRUNfUkVHX0FTU0cgICAiNyIKKworLyogU3R1YnMgZm9yIGNhbGxpbmcgbm9uLUZBU1RfRlVOQydzICovCisjaWYgRU5BQkxFX0FTSF9CVUlMVElOX0VDSE8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGVjaG9jbWQoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSAgIHsgcmV0dXJuIGVjaG9fbWFpbihhcmdjLCBhcmd2KTsgfQorI2VuZGlmCisjaWYgRU5BQkxFX0FTSF9CVUlMVElOX1BSSU5URgorc3RhdGljIGludCBGQVNUX0ZVTkMgcHJpbnRmY21kKGludCBhcmdjLCBjaGFyICoqYXJndikgeyByZXR1cm4gcHJpbnRmX21haW4oYXJnYywgYXJndik7IH0KKyNlbmRpZgorI2lmIEVOQUJMRV9BU0hfQlVJTFRJTl9URVNUCitzdGF0aWMgaW50IEZBU1RfRlVOQyB0ZXN0Y21kKGludCBhcmdjLCBjaGFyICoqYXJndikgICB7IHJldHVybiB0ZXN0X21haW4oYXJnYywgYXJndik7IH0KKyNlbmRpZgorCisvKiBLZWVwIHRoZXNlIGluIHByb3BlciBvcmRlciBzaW5jZSBpdCBpcyBzZWFyY2hlZCB2aWEgYnNlYXJjaCgpICovCitzdGF0aWMgY29uc3Qgc3RydWN0IGJ1aWx0aW5jbWQgYnVpbHRpbnRhYltdID0geworCXsgQlVJTFRJTl9TUEVDX1JFRyAgICAgICIuIiAgICAgICAsIGRvdGNtZCAgICAgfSwKKwl7IEJVSUxUSU5fU1BFQ19SRUcgICAgICAiOiIgICAgICAgLCB0cnVlY21kICAgIH0sCisjaWYgRU5BQkxFX0FTSF9CVUlMVElOX1RFU1QKKwl7IEJVSUxUSU5fUkVHVUxBUiAgICAgICAiWyIgICAgICAgLCB0ZXN0Y21kICAgIH0sCisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCXsgQlVJTFRJTl9SRUdVTEFSICAgICAgICJbWyIgICAgICAsIHRlc3RjbWQgICAgfSwKKyNlbmRpZgorI2VuZGlmCisjaWYgRU5BQkxFX0FTSF9BTElBUworCXsgQlVJTFRJTl9SRUdfQVNTRyAgICAgICJhbGlhcyIgICAsIGFsaWFzY21kICAgfSwKKyNlbmRpZgorI2lmIEpPQlMKKwl7IEJVSUxUSU5fUkVHVUxBUiAgICAgICAiYmciICAgICAgLCBmZ19iZ2NtZCAgIH0sCisjZW5kaWYKKwl7IEJVSUxUSU5fU1BFQ19SRUcgICAgICAiYnJlYWsiICAgLCBicmVha2NtZCAgIH0sCisJeyBCVUlMVElOX1JFR1VMQVIgICAgICAgImNkIiAgICAgICwgY2RjbWQgICAgICB9LAorCXsgQlVJTFRJTl9OT1NQRUMgICAgICAgICJjaGRpciIgICAsIGNkY21kICAgICAgfSwKKyNpZiBFTkFCTEVfQVNIX0NNRENNRAorCXsgQlVJTFRJTl9SRUdVTEFSICAgICAgICJjb21tYW5kIiAsIGNvbW1hbmRjbWQgfSwKKyNlbmRpZgorCXsgQlVJTFRJTl9TUEVDX1JFRyAgICAgICJjb250aW51ZSIsIGJyZWFrY21kICAgfSwKKyNpZiBFTkFCTEVfQVNIX0JVSUxUSU5fRUNITworCXsgQlVJTFRJTl9SRUdVTEFSICAgICAgICJlY2hvIiAgICAsIGVjaG9jbWQgICAgfSwKKyNlbmRpZgorCXsgQlVJTFRJTl9TUEVDX1JFRyAgICAgICJldmFsIiAgICAsIGV2YWxjbWQgICAgfSwKKwl7IEJVSUxUSU5fU1BFQ19SRUcgICAgICAiZXhlYyIgICAgLCBleGVjY21kICAgIH0sCisJeyBCVUlMVElOX1NQRUNfUkVHICAgICAgImV4aXQiICAgICwgZXhpdGNtZCAgICB9LAorCXsgQlVJTFRJTl9TUEVDX1JFR19BU1NHICJleHBvcnQiICAsIGV4cG9ydGNtZCAgfSwKKwl7IEJVSUxUSU5fUkVHVUxBUiAgICAgICAiZmFsc2UiICAgLCBmYWxzZWNtZCAgIH0sCisjaWYgSk9CUworCXsgQlVJTFRJTl9SRUdVTEFSICAgICAgICJmZyIgICAgICAsIGZnX2JnY21kICAgfSwKKyNlbmRpZgorI2lmIEVOQUJMRV9BU0hfR0VUT1BUUworCXsgQlVJTFRJTl9SRUdVTEFSICAgICAgICJnZXRvcHRzIiAsIGdldG9wdHNjbWQgfSwKKyNlbmRpZgorCXsgQlVJTFRJTl9OT1NQRUMgICAgICAgICJoYXNoIiAgICAsIGhhc2hjbWQgICAgfSwKKyNpZiBFTkFCTEVfQVNIX0hFTFAKKwl7IEJVSUxUSU5fTk9TUEVDICAgICAgICAiaGVscCIgICAgLCBoZWxwY21kICAgIH0sCisjZW5kaWYKKyNpZiBNQVhfSElTVE9SWQorCXsgQlVJTFRJTl9OT1NQRUMgICAgICAgICJoaXN0b3J5IiAsIGhpc3RvcnljbWQgfSwKKyNlbmRpZgorI2lmIEpPQlMKKwl7IEJVSUxUSU5fUkVHVUxBUiAgICAgICAiam9icyIgICAgLCBqb2JzY21kICAgIH0sCisJeyBCVUlMVElOX1JFR1VMQVIgICAgICAgImtpbGwiICAgICwga2lsbGNtZCAgICB9LAorI2VuZGlmCisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorCXsgQlVJTFRJTl9OT1NQRUMgICAgICAgICJsZXQiICAgICAsIGxldGNtZCAgICAgfSwKKyNlbmRpZgorCXsgQlVJTFRJTl9BU1NJR04gICAgICAgICJsb2NhbCIgICAsIGxvY2FsY21kICAgfSwKKyNpZiBFTkFCTEVfQVNIX0JVSUxUSU5fUFJJTlRGCisJeyBCVUlMVElOX1JFR1VMQVIgICAgICAgInByaW50ZiIgICwgcHJpbnRmY21kICB9LAorI2VuZGlmCisJeyBCVUlMVElOX05PU1BFQyAgICAgICAgInB3ZCIgICAgICwgcHdkY21kICAgICB9LAorCXsgQlVJTFRJTl9SRUdVTEFSICAgICAgICJyZWFkIiAgICAsIHJlYWRjbWQgICAgfSwKKwl7IEJVSUxUSU5fU1BFQ19SRUdfQVNTRyAicmVhZG9ubHkiLCBleHBvcnRjbWQgIH0sCisJeyBCVUlMVElOX1NQRUNfUkVHICAgICAgInJldHVybiIgICwgcmV0dXJuY21kICB9LAorCXsgQlVJTFRJTl9TUEVDX1JFRyAgICAgICJzZXQiICAgICAsIHNldGNtZCAgICAgfSwKKwl7IEJVSUxUSU5fU1BFQ19SRUcgICAgICAic2hpZnQiICAgLCBzaGlmdGNtZCAgIH0sCisjaWYgRU5BQkxFX0FTSF9CQVNIX0NPTVBBVAorCXsgQlVJTFRJTl9TUEVDX1JFRyAgICAgICJzb3VyY2UiICAsIGRvdGNtZCAgICAgfSwKKyNlbmRpZgorI2lmIEVOQUJMRV9BU0hfQlVJTFRJTl9URVNUCisJeyBCVUlMVElOX1JFR1VMQVIgICAgICAgInRlc3QiICAgICwgdGVzdGNtZCAgICB9LAorI2VuZGlmCisJeyBCVUlMVElOX1NQRUNfUkVHICAgICAgInRpbWVzIiAgICwgdGltZXNjbWQgICB9LAorCXsgQlVJTFRJTl9TUEVDX1JFRyAgICAgICJ0cmFwIiAgICAsIHRyYXBjbWQgICAgfSwKKwl7IEJVSUxUSU5fUkVHVUxBUiAgICAgICAidHJ1ZSIgICAgLCB0cnVlY21kICAgIH0sCisJeyBCVUlMVElOX05PU1BFQyAgICAgICAgInR5cGUiICAgICwgdHlwZWNtZCAgICB9LAorCXsgQlVJTFRJTl9OT1NQRUMgICAgICAgICJ1bGltaXQiICAsIHVsaW1pdGNtZCAgfSwKKwl7IEJVSUxUSU5fUkVHVUxBUiAgICAgICAidW1hc2siICAgLCB1bWFza2NtZCAgIH0sCisjaWYgRU5BQkxFX0FTSF9BTElBUworCXsgQlVJTFRJTl9SRUdVTEFSICAgICAgICJ1bmFsaWFzIiAsIHVuYWxpYXNjbWQgfSwKKyNlbmRpZgorCXsgQlVJTFRJTl9TUEVDX1JFRyAgICAgICJ1bnNldCIgICAsIHVuc2V0Y21kICAgfSwKKwl7IEJVSUxUSU5fUkVHVUxBUiAgICAgICAid2FpdCIgICAgLCB3YWl0Y21kICAgIH0sCit9OworCisvKiBTaG91bGQgbWF0Y2ggdGhlIGFib3ZlIHRhYmxlISAqLworI2RlZmluZSBDT01NQU5EQ01EIChidWlsdGludGFiICsgXAorCTIgKyBcCisJMSAqIEVOQUJMRV9BU0hfQlVJTFRJTl9URVNUICsgXAorCTEgKiBFTkFCTEVfQVNIX0JVSUxUSU5fVEVTVCAqIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQgKyBcCisJMSAqIEVOQUJMRV9BU0hfQUxJQVMgKyBcCisJMSAqIEVOQUJMRV9BU0hfSk9CX0NPTlRST0wgKyBcCisJMykKKyNkZWZpbmUgRVhFQ0NNRCAoYnVpbHRpbnRhYiArIFwKKwkyICsgXAorCTEgKiBFTkFCTEVfQVNIX0JVSUxUSU5fVEVTVCArIFwKKwkxICogRU5BQkxFX0FTSF9CVUlMVElOX1RFU1QgKiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUICsgXAorCTEgKiBFTkFCTEVfQVNIX0FMSUFTICsgXAorCTEgKiBFTkFCTEVfQVNIX0pPQl9DT05UUk9MICsgXAorCTMgKyBcCisJMSAqIEVOQUJMRV9BU0hfQ01EQ01EICsgXAorCTEgKyBcCisJRU5BQkxFX0FTSF9CVUlMVElOX0VDSE8gKyBcCisJMSkKKworLyoKKyAqIFNlYXJjaCB0aGUgdGFibGUgb2YgYnVpbHRpbiBjb21tYW5kcy4KKyAqLworc3RhdGljIHN0cnVjdCBidWlsdGluY21kICoKK2ZpbmRfYnVpbHRpbihjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBidWlsdGluY21kICpicDsKKworCWJwID0gYnNlYXJjaCgKKwkJbmFtZSwgYnVpbHRpbnRhYiwgQVJSQVlfU0laRShidWlsdGludGFiKSwgc2l6ZW9mKGJ1aWx0aW50YWJbMF0pLAorCQlwc3RyY21wCisJKTsKKwlyZXR1cm4gYnA7Cit9CisKKy8qCisgKiBFeGVjdXRlIGEgc2ltcGxlIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpbnQKK2lzYXNzaWdubWVudChjb25zdCBjaGFyICpwKQoreworCWNvbnN0IGNoYXIgKnEgPSBlbmRvZm5hbWUocCk7CisJaWYgKHAgPT0gcSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuICpxID09ICc9JzsKK30KK3N0YXRpYyBpbnQgRkFTVF9GVU5DCitibHRpbmNtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwkvKiBQcmVzZXJ2ZSBleGl0c3RhdHVzIG9mIGEgcHJldmlvdXMgcG9zc2libGUgcmVkaXJlY3Rpb24KKwkgKiBhcyBQT1NJWCBtYW5kYXRlcyAqLworCXJldHVybiBiYWNrX2V4aXRzdGF0dXM7Cit9CitzdGF0aWMgdm9pZAorZXZhbGNvbW1hbmQodW5pb24gbm9kZSAqY21kLCBpbnQgZmxhZ3MpCit7CisJc3RhdGljIGNvbnN0IHN0cnVjdCBidWlsdGluY21kIG51bGxfYmx0aW4gPSB7CisJCSJcMFwwIiwgYmx0aW5jbWQgLyogd2h5IHRocmVlIE5VTHM/ICovCisJfTsKKwlzdHJ1Y3Qgc3RhY2ttYXJrIHNtYXJrOworCXVuaW9uIG5vZGUgKmFyZ3A7CisJc3RydWN0IGFyZ2xpc3QgYXJnbGlzdDsKKwlzdHJ1Y3QgYXJnbGlzdCB2YXJsaXN0OworCWNoYXIgKiphcmd2OworCWludCBhcmdjOworCWNvbnN0IHN0cnVjdCBzdHJsaXN0ICpzcDsKKwlzdHJ1Y3QgY21kZW50cnkgY21kZW50cnk7CisJc3RydWN0IGpvYiAqanA7CisJY2hhciAqbGFzdGFyZzsKKwljb25zdCBjaGFyICpwYXRoOworCWludCBzcGNsYmx0aW47CisJaW50IHN0YXR1czsKKwljaGFyICoqbmFyZ3Y7CisJc3RydWN0IGJ1aWx0aW5jbWQgKmJjbWQ7CisJc21hbGxpbnQgY21kX2lzX2V4ZWM7CisJc21hbGxpbnQgcHNldWRvdmFyZmxhZyA9IDA7CisKKwkvKiBGaXJzdCBleHBhbmQgdGhlIGFyZ3VtZW50cy4gKi8KKwlUUkFDRSgoImV2YWxjb21tYW5kKDB4JWx4LCAlZCkgY2FsbGVkXG4iLCAobG9uZyljbWQsIGZsYWdzKSk7CisJc2V0c3RhY2ttYXJrKCZzbWFyayk7CisJYmFja19leGl0c3RhdHVzID0gMDsKKworCWNtZGVudHJ5LmNtZHR5cGUgPSBDTURCVUlMVElOOworCWNtZGVudHJ5LnUuY21kID0gJm51bGxfYmx0aW47CisJdmFybGlzdC5sYXN0cCA9ICZ2YXJsaXN0Lmxpc3Q7CisJKnZhcmxpc3QubGFzdHAgPSBOVUxMOworCWFyZ2xpc3QubGFzdHAgPSAmYXJnbGlzdC5saXN0OworCSphcmdsaXN0Lmxhc3RwID0gTlVMTDsKKworCWFyZ2MgPSAwOworCWlmIChjbWQtPm5jbWQuYXJncykgeworCQliY21kID0gZmluZF9idWlsdGluKGNtZC0+bmNtZC5hcmdzLT5uYXJnLnRleHQpOworCQlwc2V1ZG92YXJmbGFnID0gYmNtZCAmJiBJU19CVUlMVElOX0FTU0lHTihiY21kKTsKKwl9CisKKwlmb3IgKGFyZ3AgPSBjbWQtPm5jbWQuYXJnczsgYXJncDsgYXJncCA9IGFyZ3AtPm5hcmcubmV4dCkgeworCQlzdHJ1Y3Qgc3RybGlzdCAqKnNwcDsKKworCQlzcHAgPSBhcmdsaXN0Lmxhc3RwOworCQlpZiAocHNldWRvdmFyZmxhZyAmJiBpc2Fzc2lnbm1lbnQoYXJncC0+bmFyZy50ZXh0KSkKKwkJCWV4cGFuZGFyZyhhcmdwLCAmYXJnbGlzdCwgRVhQX1ZBUlRJTERFKTsKKwkJZWxzZQorCQkJZXhwYW5kYXJnKGFyZ3AsICZhcmdsaXN0LCBFWFBfRlVMTCB8IEVYUF9USUxERSk7CisKKwkJZm9yIChzcCA9ICpzcHA7IHNwOyBzcCA9IHNwLT5uZXh0KQorCQkJYXJnYysrOworCX0KKworCWFyZ3YgPSBuYXJndiA9IHN0YWxsb2Moc2l6ZW9mKGNoYXIgKikgKiAoYXJnYyArIDEpKTsKKwlmb3IgKHNwID0gYXJnbGlzdC5saXN0OyBzcDsgc3AgPSBzcC0+bmV4dCkgeworCQlUUkFDRSgoImV2YWxjb21tYW5kIGFyZzogJXNcbiIsIHNwLT50ZXh0KSk7CisJCSpuYXJndisrID0gc3AtPnRleHQ7CisJfQorCSpuYXJndiA9IE5VTEw7CisKKwlsYXN0YXJnID0gTlVMTDsKKwlpZiAoaWZsYWcgJiYgZnVuY25lc3QgPT0gMCAmJiBhcmdjID4gMCkKKwkJbGFzdGFyZyA9IG5hcmd2Wy0xXTsKKworCXByZXZlcnJvdXRfZmQgPSAyOworCWV4cHJlZGlyKGNtZC0+bmNtZC5yZWRpcmVjdCk7CisJc3RhdHVzID0gcmVkaXJlY3RzYWZlKGNtZC0+bmNtZC5yZWRpcmVjdCwgUkVESVJfUFVTSCB8IFJFRElSX1NBVkVGRDIpOworCisJcGF0aCA9IHZwYXRoLnZhcl90ZXh0OworCWZvciAoYXJncCA9IGNtZC0+bmNtZC5hc3NpZ247IGFyZ3A7IGFyZ3AgPSBhcmdwLT5uYXJnLm5leHQpIHsKKwkJc3RydWN0IHN0cmxpc3QgKipzcHA7CisJCWNoYXIgKnA7CisKKwkJc3BwID0gdmFybGlzdC5sYXN0cDsKKwkJZXhwYW5kYXJnKGFyZ3AsICZ2YXJsaXN0LCBFWFBfVkFSVElMREUpOworCisJCS8qCisJCSAqIE1vZGlmeSB0aGUgY29tbWFuZCBsb29rdXAgcGF0aCwgaWYgYSBQQVRIPSBhc3NpZ25tZW50CisJCSAqIGlzIHByZXNlbnQKKwkJICovCisJCXAgPSAoKnNwcCktPnRleHQ7CisJCWlmICh2YXJjbXAocCwgcGF0aCkgPT0gMCkKKwkJCXBhdGggPSBwOworCX0KKworCS8qIFByaW50IHRoZSBjb21tYW5kIGlmIHhmbGFnIGlzIHNldC4gKi8KKwlpZiAoeGZsYWcpIHsKKwkJaW50IG47CisJCWNvbnN0IGNoYXIgKnAgPSAiICVzIiArIDE7CisKKwkJZmRwcmludGYocHJldmVycm91dF9mZCwgcCwgZXhwYW5kc3RyKHBzNHZhbCgpKSk7CisJCXNwID0gdmFybGlzdC5saXN0OworCQlmb3IgKG4gPSAwOyBuIDwgMjsgbisrKSB7CisJCQl3aGlsZSAoc3ApIHsKKwkJCQlmZHByaW50ZihwcmV2ZXJyb3V0X2ZkLCBwLCBzcC0+dGV4dCk7CisJCQkJc3AgPSBzcC0+bmV4dDsKKwkJCQlwID0gIiAlcyI7CisJCQl9CisJCQlzcCA9IGFyZ2xpc3QubGlzdDsKKwkJfQorCQlzYWZlX3dyaXRlKHByZXZlcnJvdXRfZmQsICJcbiIsIDEpOworCX0KKworCWNtZF9pc19leGVjID0gMDsKKwlzcGNsYmx0aW4gPSAtMTsKKworCS8qIE5vdyBsb2NhdGUgdGhlIGNvbW1hbmQuICovCisJaWYgKGFyZ2MpIHsKKwkJaW50IGNtZF9mbGFnID0gRE9fRVJSOworI2lmIEVOQUJMRV9BU0hfQ01EQ01ECisJCWNvbnN0IGNoYXIgKm9sZHBhdGggPSBwYXRoICsgNTsKKyNlbmRpZgorCQlwYXRoICs9IDU7CisJCWZvciAoOzspIHsKKwkJCWZpbmRfY29tbWFuZChhcmd2WzBdLCAmY21kZW50cnksIGNtZF9mbGFnLCBwYXRoKTsKKwkJCWlmIChjbWRlbnRyeS5jbWR0eXBlID09IENNRFVOS05PV04pIHsKKwkJCQlmbHVzaF9zdGRvdXRfc3RkZXJyKCk7CisJCQkJc3RhdHVzID0gMTI3OworCQkJCWdvdG8gYmFpbDsKKwkJCX0KKworCQkJLyogaW1wbGVtZW50IGJsdGluIGFuZCBjb21tYW5kIGhlcmUgKi8KKwkJCWlmIChjbWRlbnRyeS5jbWR0eXBlICE9IENNREJVSUxUSU4pCisJCQkJYnJlYWs7CisJCQlpZiAoc3BjbGJsdGluIDwgMCkKKwkJCQlzcGNsYmx0aW4gPSBJU19CVUlMVElOX1NQRUNJQUwoY21kZW50cnkudS5jbWQpOworCQkJaWYgKGNtZGVudHJ5LnUuY21kID09IEVYRUNDTUQpCisJCQkJY21kX2lzX2V4ZWMgPSAxOworI2lmIEVOQUJMRV9BU0hfQ01EQ01ECisJCQlpZiAoY21kZW50cnkudS5jbWQgPT0gQ09NTUFORENNRCkgeworCQkJCXBhdGggPSBvbGRwYXRoOworCQkJCW5hcmd2ID0gcGFyc2VfY29tbWFuZF9hcmdzKGFyZ3YsICZwYXRoKTsKKwkJCQlpZiAoIW5hcmd2KQorCQkJCQlicmVhazsKKwkJCQlhcmdjIC09IG5hcmd2IC0gYXJndjsKKwkJCQlhcmd2ID0gbmFyZ3Y7CisJCQkJY21kX2ZsYWcgfD0gRE9fTk9GVU5DOworCQkJfSBlbHNlCisjZW5kaWYKKwkJCQlicmVhazsKKwkJfQorCX0KKworCWlmIChzdGF0dXMpIHsKKwkJLyogV2UgaGF2ZSBhIHJlZGlyZWN0aW9uIGVycm9yLiAqLworCQlpZiAoc3BjbGJsdGluID4gMCkKKwkJCXJhaXNlX2V4Y2VwdGlvbihFWEVSUk9SKTsKKyBiYWlsOgorCQlleGl0c3RhdHVzID0gc3RhdHVzOworCQlnb3RvIG91dDsKKwl9CisKKwkvKiBFeGVjdXRlIHRoZSBjb21tYW5kLiAqLworCXN3aXRjaCAoY21kZW50cnkuY21kdHlwZSkgeworCWRlZmF1bHQ6IHsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NIX05PRk9SSworLyogKDEpIEJVRzogaWYgdmFyaWFibGVzIGFyZSBzZXQsIHdlIG5lZWQgdG8gZm9yaywgb3Igc2F2ZS9yZXN0b3JlIHRoZW0KKyAqICAgICBhcm91bmQgcnVuX25vZm9ya19hcHBsZXQoKSBjYWxsLgorICogKDIpIFNob3VsZCB0aGlzIGNoZWNrIGFsc28gYmUgZG9uZSBpbiBmb3Jrc2hlbGwoKT8KKyAqICAgICAocGVyaGFwcyBpdCBzaG91bGQsIHNvIHRoYXQgIlZBUj1WQUwgbm9mb3JrIiBhdCBsZWFzdCBhdm9pZHMgZXhlYy4uLikKKyAqLworCQkvKiBmaW5kX2NvbW1hbmQoKSBlbmNvZGVzIGFwcGxldF9ubyBhcyAoLTIgLSBhcHBsZXRfbm8pICovCisJCWludCBhcHBsZXRfbm8gPSAoLSBjbWRlbnRyeS51LmluZGV4IC0gMik7CisJCWlmIChhcHBsZXRfbm8gPj0gMCAmJiBBUFBMRVRfSVNfTk9GT1JLKGFwcGxldF9ubykpIHsKKwkJCWxpc3RzZXR2YXIodmFybGlzdC5saXN0LCBWRVhQT1JUfFZTVEFDSyk7CisJCQkvKiBydW4gPGFwcGxldD5fbWFpbigpICovCisJCQlleGl0c3RhdHVzID0gcnVuX25vZm9ya19hcHBsZXQoYXBwbGV0X25vLCBhcmd2KTsKKwkJCWJyZWFrOworCQl9CisjZW5kaWYKKwkJLyogQ2FuIHdlIGF2b2lkIGZvcmtpbmcgb2ZmPyBGb3IgZXhhbXBsZSwgdmVyeSBsYXN0IGNvbW1hbmQKKwkJICogaW4gYSBzY3JpcHQgb3IgYSBzdWJzaGVsbCBkb2VzIG5vdCBuZWVkIGZvcmtpbmcsCisJCSAqIHdlIGNhbiBqdXN0IGV4ZWMgaXQuCisJCSAqLworCQlpZiAoIShmbGFncyAmIEVWX0VYSVQpIHx8IG1heV9oYXZlX3RyYXBzKSB7CisJCQkvKiBObywgZm9ya2luZyBvZmYgYSBjaGlsZCBpcyBuZWNlc3NhcnkgKi8KKwkJCUlOVF9PRkY7CisJCQlqcCA9IG1ha2Vqb2IoLypjbWQsKi8gMSk7CisJCQlpZiAoZm9ya3NoZWxsKGpwLCBjbWQsIEZPUktfRkcpICE9IDApIHsKKwkJCQkvKiBwYXJlbnQgKi8KKwkJCQlleGl0c3RhdHVzID0gd2FpdGZvcmpvYihqcCk7CisJCQkJSU5UX09OOworCQkJCVRSQUNFKCgiZm9ya2VkIGNoaWxkIGV4aXRlZCB3aXRoICVkXG4iLCBleGl0c3RhdHVzKSk7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBjaGlsZCAqLworCQkJRk9SQ0VfSU5UX09OOworCQkJLyogZmFsbCB0aHJvdWdoIHRvIGV4ZWMnaW5nIGV4dGVybmFsIHByb2dyYW0gKi8KKwkJfQorCQlsaXN0c2V0dmFyKHZhcmxpc3QubGlzdCwgVkVYUE9SVHxWU1RBQ0spOworCQlzaGVsbGV4ZWMoYXJndiwgcGF0aCwgY21kZW50cnkudS5pbmRleCk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwl9IC8qIGRlZmF1bHQgKi8KKwljYXNlIENNREJVSUxUSU46CisJCWNtZGVudmlyb24gPSB2YXJsaXN0Lmxpc3Q7CisJCWlmIChjbWRlbnZpcm9uKSB7CisJCQlzdHJ1Y3Qgc3RybGlzdCAqbGlzdCA9IGNtZGVudmlyb247CisJCQlpbnQgaSA9IFZOT1NFVDsKKwkJCWlmIChzcGNsYmx0aW4gPiAwIHx8IGFyZ2MgPT0gMCkgeworCQkJCWkgPSAwOworCQkJCWlmIChjbWRfaXNfZXhlYyAmJiBhcmdjID4gMSkKKwkJCQkJaSA9IFZFWFBPUlQ7CisJCQl9CisJCQlsaXN0c2V0dmFyKGxpc3QsIGkpOworCQl9CisJCS8qIFRpZ2h0IGxvb3Agd2l0aCBidWlsdGlucyBvbmx5OgorCQkgKiAid2hpbGUga2lsbCAtMCAkY2hpbGQ7IGRvIHRydWU7IGRvbmUiCisJCSAqIHdpbGwgbmV2ZXIgZXhpdCBldmVuIGlmICRjaGlsZCBkaWVkLCB1bmxlc3Mgd2UgZG8gdGhpcworCQkgKiB0byByZWFwIHRoZSB6b21iaWUgYW5kIG1ha2Uga2lsbCBkZXRlY3QgdGhhdCBpdCdzIGdvbmU6ICovCisJCWRvd2FpdChET1dBSVRfTk9OQkxPQ0ssIE5VTEwpOworCisJCWlmIChldmFsYmx0aW4oY21kZW50cnkudS5jbWQsIGFyZ2MsIGFyZ3YpKSB7CisJCQlpbnQgZXhpdF9zdGF0dXM7CisJCQlpbnQgaSA9IGV4Y2VwdGlvbl90eXBlOworCQkJaWYgKGkgPT0gRVhFWElUKQorCQkJCWdvdG8gcmFpc2U7CisJCQlleGl0X3N0YXR1cyA9IDI7CisJCQlpZiAoaSA9PSBFWElOVCkKKwkJCQlleGl0X3N0YXR1cyA9IDEyOCArIFNJR0lOVDsKKwkJCWlmIChpID09IEVYU0lHKQorCQkJCWV4aXRfc3RhdHVzID0gMTI4ICsgcGVuZGluZ19zaWc7CisJCQlleGl0c3RhdHVzID0gZXhpdF9zdGF0dXM7CisJCQlpZiAoaSA9PSBFWElOVCB8fCBzcGNsYmx0aW4gPiAwKSB7CisgcmFpc2U6CisJCQkJbG9uZ2ptcChleGNlcHRpb25faGFuZGxlci0+bG9jLCAxKTsKKwkJCX0KKwkJCUZPUkNFX0lOVF9PTjsKKwkJfQorCQlicmVhazsKKworCWNhc2UgQ01ERlVOQ1RJT046CisJCWxpc3RzZXR2YXIodmFybGlzdC5saXN0LCAwKTsKKwkJLyogU2VlIGFib3ZlIGZvciB0aGUgcmF0aW9uYWxlICovCisJCWRvd2FpdChET1dBSVRfTk9OQkxPQ0ssIE5VTEwpOworCQlpZiAoZXZhbGZ1bihjbWRlbnRyeS51LmZ1bmMsIGFyZ2MsIGFyZ3YsIGZsYWdzKSkKKwkJCWdvdG8gcmFpc2U7CisJCWJyZWFrOworCX0gLyogc3dpdGNoICovCisKKyBvdXQ6CisJcG9wcmVkaXIoLypkcm9wOiovIGNtZF9pc19leGVjLCAvKnJlc3RvcmU6Ki8gY21kX2lzX2V4ZWMpOworCWlmIChsYXN0YXJnKSB7CisJCS8qIGRzbDogSSB0aGluayB0aGlzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgdG8gc3VwcG9ydAorCQkgKiAnXycgaW4gJ3ZpJyBjb21tYW5kIG1vZGUgZHVyaW5nIGxpbmUgZWRpdGluZy4uLgorCQkgKiBIb3dldmVyIEkgaW1wbGVtZW50ZWQgdGhhdCB3aXRoaW4gbGliZWRpdCBpdHNlbGYuCisJCSAqLworCQlzZXR2YXIwKCJfIiwgbGFzdGFyZyk7CisJfQorCXBvcHN0YWNrbWFyaygmc21hcmspOworfQorCitzdGF0aWMgaW50CitldmFsYmx0aW4oY29uc3Qgc3RydWN0IGJ1aWx0aW5jbWQgKmNtZCwgaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKnZvbGF0aWxlIHNhdmVjbWRuYW1lOworCXN0cnVjdCBqbXBsb2MgKnZvbGF0aWxlIHNhdmVoYW5kbGVyOworCXN0cnVjdCBqbXBsb2Mgam1wbG9jOworCWludCBpOworCisJc2F2ZWNtZG5hbWUgPSBjb21tYW5kbmFtZTsKKwlpID0gc2V0am1wKGptcGxvYy5sb2MpOworCWlmIChpKQorCQlnb3RvIGNtZGRvbmU7CisJc2F2ZWhhbmRsZXIgPSBleGNlcHRpb25faGFuZGxlcjsKKwlleGNlcHRpb25faGFuZGxlciA9ICZqbXBsb2M7CisJY29tbWFuZG5hbWUgPSBhcmd2WzBdOworCWFyZ3B0ciA9IGFyZ3YgKyAxOworCW9wdHB0ciA9IE5VTEw7ICAgICAgICAgICAgICAgICAgLyogaW5pdGlhbGl6ZSBuZXh0b3B0ICovCisJZXhpdHN0YXR1cyA9ICgqY21kLT5idWlsdGluKShhcmdjLCBhcmd2KTsKKwlmbHVzaF9zdGRvdXRfc3RkZXJyKCk7CisgY21kZG9uZToKKwlleGl0c3RhdHVzIHw9IGZlcnJvcihzdGRvdXQpOworCWNsZWFyZXJyKHN0ZG91dCk7CisJY29tbWFuZG5hbWUgPSBzYXZlY21kbmFtZTsKKwlleGNlcHRpb25faGFuZGxlciA9IHNhdmVoYW5kbGVyOworCisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQKK2dvb2RuYW1lKGNvbnN0IGNoYXIgKnApCit7CisJcmV0dXJuIGVuZG9mbmFtZShwKVswXSA9PSAnXDAnOworfQorCisKKy8qCisgKiBTZWFyY2ggZm9yIGEgY29tbWFuZC4gIFRoaXMgaXMgY2FsbGVkIGJlZm9yZSB3ZSBmb3JrIHNvIHRoYXQgdGhlCisgKiBsb2NhdGlvbiBvZiB0aGUgY29tbWFuZCB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUgcGFyZW50IGFzIHdlbGwgYXMKKyAqIHRoZSBjaGlsZC4gIFRoZSBjaGVjayBmb3IgImdvb2RuYW1lIiBpcyBhbiBvdmVybHkgY29uc2VydmF0aXZlCisgKiBjaGVjayB0aGF0IHRoZSBuYW1lIHdpbGwgbm90IGJlIHN1YmplY3QgdG8gZXhwYW5zaW9uLgorICovCitzdGF0aWMgdm9pZAorcHJlaGFzaCh1bmlvbiBub2RlICpuKQoreworCXN0cnVjdCBjbWRlbnRyeSBlbnRyeTsKKworCWlmIChuLT50eXBlID09IE5DTUQgJiYgbi0+bmNtZC5hcmdzICYmIGdvb2RuYW1lKG4tPm5jbWQuYXJncy0+bmFyZy50ZXh0KSkKKwkJZmluZF9jb21tYW5kKG4tPm5jbWQuYXJncy0+bmFyZy50ZXh0LCAmZW50cnksIDAsIHBhdGh2YWwoKSk7Cit9CisKKworLyogPT09PT09PT09PT09IEJ1aWx0aW4gY29tbWFuZHMKKyAqCisgKiBCdWlsdGluIGNvbW1hbmRzIHdob3NlIGZ1bmN0aW9ucyBhcmUgY2xvc2VseSB0aWVkIHRvIGV2YWx1YXRpb24KKyAqIGFyZSBpbXBsZW1lbnRlZCBoZXJlLgorICovCisKKy8qCisgKiBIYW5kbGUgYnJlYWsgYW5kIGNvbnRpbnVlIGNvbW1hbmRzLiAgQnJlYWssIGNvbnRpbnVlLCBhbmQgcmV0dXJuIGFyZQorICogYWxsIGhhbmRsZWQgYnkgc2V0dGluZyB0aGUgZXZhbHNraXAgZmxhZy4gIFRoZSBldmFsdWF0aW9uIHJvdXRpbmVzCisgKiBhYm92ZSBhbGwgY2hlY2sgdGhpcyBmbGFnLCBhbmQgaWYgaXQgaXMgc2V0IHRoZXkgc3RhcnQgc2tpcHBpbmcKKyAqIGNvbW1hbmRzIHJhdGhlciB0aGFuIGV4ZWN1dGluZyB0aGVtLiAgVGhlIHZhcmlhYmxlIHNraXBjb3VudCBpcworICogdGhlIG51bWJlciBvZiBsb29wcyB0byBicmVhay9jb250aW51ZSwgb3IgdGhlIG51bWJlciBvZiBmdW5jdGlvbgorICogbGV2ZWxzIHRvIHJldHVybi4gIChUaGUgbGF0dGVyIGlzIGFsd2F5cyAxLikgIEl0IHNob3VsZCBwcm9iYWJseQorICogYmUgYW4gZXJyb3IgdG8gYnJlYWsgb3V0IG9mIG1vcmUgbG9vcHMgdGhhbiBleGlzdCwgYnV0IGl0IGlzbid0CisgKiBpbiB0aGUgc3RhbmRhcmQgc2hlbGwgc28gd2UgZG9uJ3QgbWFrZSBpdCBvbmUgaGVyZS4KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMKK2JyZWFrY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IG4gPSBhcmd2WzFdID8gbnVtYmVyKGFyZ3ZbMV0pIDogMTsKKworCWlmIChuIDw9IDApCisJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKG1zZ19pbGxudW0sIGFyZ3ZbMV0pOworCWlmIChuID4gbG9vcG5lc3QpCisJCW4gPSBsb29wbmVzdDsKKwlpZiAobiA+IDApIHsKKwkJZXZhbHNraXAgPSAoKiphcmd2ID09ICdjJykgPyBTS0lQQ09OVCA6IFNLSVBCUkVBSzsKKwkJc2tpcGNvdW50ID0gbjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworLyogPT09PT09PT09PT09IGlucHV0LmMKKyAqCisgKiBUaGlzIGltcGxlbWVudHMgdGhlIGlucHV0IHJvdXRpbmVzIHVzZWQgYnkgdGhlIHBhcnNlci4KKyAqLworCitlbnVtIHsKKwlJTlBVVF9QVVNIX0ZJTEUgPSAxLAorCUlOUFVUX05PRklMRV9PSyA9IDIsCit9OworCitzdGF0aWMgc21hbGxpbnQgY2hlY2trd2Q7CisvKiB2YWx1ZXMgb2YgY2hlY2trd2QgdmFyaWFibGUgKi8KKyNkZWZpbmUgQ0hLQUxJQVMgICAgICAgIDB4MQorI2RlZmluZSBDSEtLV0QgICAgICAgICAgMHgyCisjZGVmaW5lIENIS05MICAgICAgICAgICAweDQKKworLyoKKyAqIFB1c2ggYSBzdHJpbmcgYmFjayBvbnRvIHRoZSBpbnB1dCBhdCB0aGlzIGN1cnJlbnQgcGFyc2VmaWxlIGxldmVsLgorICogV2UgaGFuZGxlIGFsaWFzZXMgdGhpcyB3YXkuCisgKi8KKyNpZiAhRU5BQkxFX0FTSF9BTElBUworI2RlZmluZSBwdXNoc3RyaW5nKHMsIGFwKSBwdXNoc3RyaW5nKHMpCisjZW5kaWYKK3N0YXRpYyB2b2lkCitwdXNoc3RyaW5nKGNoYXIgKnMsIHN0cnVjdCBhbGlhcyAqYXApCit7CisJc3RydWN0IHN0cnB1c2ggKnNwOworCWludCBsZW47CisKKwlsZW4gPSBzdHJsZW4ocyk7CisJSU5UX09GRjsKKwlpZiAoZ19wYXJzZWZpbGUtPnN0cnB1c2gpIHsKKwkJc3AgPSBja3phbGxvYyhzaXplb2YoKnNwKSk7CisJCXNwLT5wcmV2ID0gZ19wYXJzZWZpbGUtPnN0cnB1c2g7CisJfSBlbHNlIHsKKwkJc3AgPSAmKGdfcGFyc2VmaWxlLT5iYXNlc3RycHVzaCk7CisJfQorCWdfcGFyc2VmaWxlLT5zdHJwdXNoID0gc3A7CisJc3AtPnByZXZfc3RyaW5nID0gZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGM7CisJc3AtPnByZXZfbGVmdF9pbl9saW5lID0gZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZTsKKyNpZiBFTkFCTEVfQVNIX0FMSUFTCisJc3AtPmFwID0gYXA7CisJaWYgKGFwKSB7CisJCWFwLT5mbGFnIHw9IEFMSUFTSU5VU0U7CisJCXNwLT5zdHJpbmcgPSBzOworCX0KKyNlbmRpZgorCWdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjID0gczsKKwlnX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lID0gbGVuOworCUlOVF9PTjsKK30KKworc3RhdGljIHZvaWQKK3BvcHN0cmluZyh2b2lkKQoreworCXN0cnVjdCBzdHJwdXNoICpzcCA9IGdfcGFyc2VmaWxlLT5zdHJwdXNoOworCisJSU5UX09GRjsKKyNpZiBFTkFCTEVfQVNIX0FMSUFTCisJaWYgKHNwLT5hcCkgeworCQlpZiAoZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGNbLTFdID09ICcgJworCQkgfHwgZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGNbLTFdID09ICdcdCcKKwkJKSB7CisJCQljaGVja2t3ZCB8PSBDSEtBTElBUzsKKwkJfQorCQlpZiAoc3AtPnN0cmluZyAhPSBzcC0+YXAtPnZhbCkgeworCQkJZnJlZShzcC0+c3RyaW5nKTsKKwkJfQorCQlzcC0+YXAtPmZsYWcgJj0gfkFMSUFTSU5VU0U7CisJCWlmIChzcC0+YXAtPmZsYWcgJiBBTElBU0RFQUQpIHsKKwkJCXVuYWxpYXMoc3AtPmFwLT5uYW1lKTsKKwkJfQorCX0KKyNlbmRpZgorCWdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjID0gc3AtPnByZXZfc3RyaW5nOworCWdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUgPSBzcC0+cHJldl9sZWZ0X2luX2xpbmU7CisJZ19wYXJzZWZpbGUtPnN0cnB1c2ggPSBzcC0+cHJldjsKKwlpZiAoc3AgIT0gJihnX3BhcnNlZmlsZS0+YmFzZXN0cnB1c2gpKQorCQlmcmVlKHNwKTsKKwlJTlRfT047Cit9CisKKy8vRklYTUU6IEJBU0hfQ09NUEFUIHdpdGggIi4uLiYiIGRvZXMgVFdPIHB1bmdldGMoKToKKy8vaXQgcGVla3Mgd2hldGhlciBpdCBpcyAmPiwgYW5kIHRoZW4gcHVzaGVzIGJhY2sgYm90aCBjaGFycy4KKy8vVGhpcyBmdW5jdGlvbiBuZWVkcyB0byBzYXZlIGxhc3QgKm5leHRfdG9fcGdldGMgdG8gYnVmWzBdCisvL3RvIG1ha2UgdHdvIHB1bmdldGMoKSByZWxpYWJsZS4gQ3VycmVudGx5LAorLy8gcGdldGMgKG91dCBvZiBidWY6IGRvZXMgcHJlYWRmZCksIHBnZXRjLCBwdW5nZXRjLCBwdW5nZXRjIHdvbid0IHdvcmsuLi4KK3N0YXRpYyBpbnQKK3ByZWFkZmQodm9pZCkKK3sKKwlpbnQgbnI7CisJY2hhciAqYnVmID0gZ19wYXJzZWZpbGUtPmJ1ZjsKKworCWdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjID0gYnVmOworI2lmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkcKKyByZXRyeToKKwlpZiAoIWlmbGFnIHx8IGdfcGFyc2VmaWxlLT5wZl9mZCAhPSBTVERJTl9GSUxFTk8pCisJCW5yID0gbm9uYmxvY2tfaW1tdW5lX3JlYWQoZ19wYXJzZWZpbGUtPnBmX2ZkLCBidWYsIElCVUZTSVogLSAxKTsKKwllbHNlIHsKKwkJaW50IHRpbWVvdXQgPSAtMTsKKyMgaWYgRU5BQkxFX0FTSF9JRExFX1RJTUVPVVQKKwkJaWYgKGlmbGFnKSB7CisJCQljb25zdCBjaGFyICp0bW91dF92YXIgPSBsb29rdXB2YXIoIlRNT1VUIik7CisJCQlpZiAodG1vdXRfdmFyKSB7CisJCQkJdGltZW91dCA9IGF0b2kodG1vdXRfdmFyKSAqIDEwMDA7CisJCQkJaWYgKHRpbWVvdXQgPD0gMCkKKwkJCQkJdGltZW91dCA9IC0xOworCQkJfQorCQl9CisjIGVuZGlmCisjIGlmIEVOQUJMRV9GRUFUVVJFX1RBQl9DT01QTEVUSU9OCisJCWxpbmVfaW5wdXRfc3RhdGUtPnBhdGhfbG9va3VwID0gcGF0aHZhbCgpOworIyBlbmRpZgorCQlyZWluaXRfdW5pY29kZV9mb3JfYXNoKCk7CisJCW5yID0gcmVhZF9saW5lX2lucHV0KGxpbmVfaW5wdXRfc3RhdGUsIGNtZGVkaXRfcHJvbXB0LCBidWYsIElCVUZTSVosIHRpbWVvdXQpOworCQlpZiAobnIgPT0gMCkgeworCQkJLyogQ3RybCtDIHByZXNzZWQgKi8KKwkJCWlmICh0cmFwW1NJR0lOVF0pIHsKKwkJCQlidWZbMF0gPSAnXG4nOworCQkJCWJ1ZlsxXSA9ICdcMCc7CisJCQkJcmFpc2UoU0lHSU5UKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCWdvdG8gcmV0cnk7CisJCX0KKwkJaWYgKG5yIDwgMCkgeworCQkJaWYgKGVycm5vID09IDApIHsKKwkJCQkvKiBDdHJsK0QgcHJlc3NlZCAqLworCQkJCW5yID0gMDsKKwkJCX0KKyMgaWYgRU5BQkxFX0FTSF9JRExFX1RJTUVPVVQKKwkJCWVsc2UgaWYgKGVycm5vID09IEVBR0FJTiAmJiB0aW1lb3V0ID4gMCkgeworCQkJCXB1dHMoIlwwMDd0aW1lZCBvdXQgd2FpdGluZyBmb3IgaW5wdXQ6IGF1dG8tbG9nb3V0Iik7CisJCQkJZXhpdHNoZWxsKCk7CisJCQl9CisjIGVuZGlmCisJCX0KKwl9CisjZWxzZQorCW5yID0gbm9uYmxvY2tfaW1tdW5lX3JlYWQoZ19wYXJzZWZpbGUtPnBmX2ZkLCBidWYsIElCVUZTSVogLSAxKTsKKyNlbmRpZgorCisjaWYgMCAvKiBkaXNhYmxlZDogbm9uYmxvY2tfaW1tdW5lX3JlYWQoKSBoYW5kbGVzIHRoaXMgcHJvYmxlbSAqLworCWlmIChuciA8IDApIHsKKwkJaWYgKHBhcnNlZmlsZS0+ZmQgPT0gMCAmJiBlcnJubyA9PSBFV09VTERCTE9DSykgeworCQkJaW50IGZsYWdzID0gZmNudGwoMCwgRl9HRVRGTCk7CisJCQlpZiAoZmxhZ3MgPj0gMCAmJiAoZmxhZ3MgJiBPX05PTkJMT0NLKSkgeworCQkJCWZsYWdzICY9IH5PX05PTkJMT0NLOworCQkJCWlmIChmY250bCgwLCBGX1NFVEZMLCBmbGFncykgPj0gMCkgeworCQkJCQlvdXQyc3RyKCJzaDogdHVybmluZyBvZmYgTkRFTEFZIG1vZGVcbiIpOworCQkJCQlnb3RvIHJldHJ5OworCQkJCX0KKwkJCX0KKwkJfQorCX0KKyNlbmRpZgorCXJldHVybiBucjsKK30KKworLyoKKyAqIFJlZmlsbCB0aGUgaW5wdXQgYnVmZmVyIGFuZCByZXR1cm4gdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyOgorICoKKyAqIDEpIElmIGEgc3RyaW5nIHdhcyBwdXNoZWQgYmFjayBvbiB0aGUgaW5wdXQsIHBvcCBpdDsKKyAqIDIpIElmIGFuIEVPRiB3YXMgcHVzaGVkIGJhY2sgKGdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUgPCAtQklHTlVNKQorICogICAgb3Igd2UgYXJlIHJlYWRpbmcgZnJvbSBhIHN0cmluZyBzbyB3ZSBjYW4ndCByZWZpbGwgdGhlIGJ1ZmZlciwKKyAqICAgIHJldHVybiBFT0YuCisgKiAzKSBJZiB0aGVyZSBpcyBtb3JlIHN0dWZmIGluIHRoaXMgYnVmZmVyLCB1c2UgaXQgZWxzZSBjYWxsIHJlYWQgdG8gZmlsbCBpdC4KKyAqIDQpIFByb2Nlc3MgaW5wdXQgdXAgdG8gdGhlIG5leHQgbmV3bGluZSwgZGVsZXRpbmcgbnVsIGNoYXJhY3RlcnMuCisgKi8KKy8vI2RlZmluZSBwZ2V0Y19kZWJ1ZyguLi4pIGJiX2Vycm9yX21zZyhfX1ZBX0FSR1NfXykKKyNkZWZpbmUgcGdldGNfZGVidWcoLi4uKSAoKHZvaWQpMCkKK3N0YXRpYyBpbnQKK3ByZWFkYnVmZmVyKHZvaWQpCit7CisJY2hhciAqcTsKKwlpbnQgbW9yZTsKKworCXdoaWxlIChnX3BhcnNlZmlsZS0+c3RycHVzaCkgeworI2lmIEVOQUJMRV9BU0hfQUxJQVMKKwkJaWYgKGdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUgPT0gLTEKKwkJICYmIGdfcGFyc2VmaWxlLT5zdHJwdXNoLT5hcAorCQkgJiYgZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGNbLTFdICE9ICcgJworCQkgJiYgZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGNbLTFdICE9ICdcdCcKKwkJKSB7CisJCQlwZ2V0Y19kZWJ1ZygicHJlYWRidWZmZXIgUEVPQSIpOworCQkJcmV0dXJuIFBFT0E7CisJCX0KKyNlbmRpZgorCQlwb3BzdHJpbmcoKTsKKwkJLyogdHJ5ICJwZ2V0YyIgbm93OiAqLworCQlwZ2V0Y19kZWJ1ZygicHJlYWRidWZmZXIgaW50ZXJuYWwgcGdldGMgYXQgJWQ6JXAnJXMnIiwKKwkJCQlnX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lLAorCQkJCWdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjLAorCQkJCWdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjKTsKKwkJaWYgKC0tZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZSA+PSAwKQorCQkJcmV0dXJuICh1bnNpZ25lZCBjaGFyKSgqZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMrKyk7CisJfQorCS8qIG9uIGJvdGggYnJhbmNoZXMgYWJvdmUgZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZSA8IDAuCisJICogInBnZXRjIiBuZWVkcyByZWZpbGxpbmcuCisJICovCisKKwkvKiAtOTAgaXMgb3VyIC1CSUdOVU0uIEJlbG93IHdlIHVzZSAtOTkgdG8gbWFyayAiRU9GIG9uIHJlYWQiLAorCSAqIHB1bmdldGMoKSBtYXkgaW5jcmVtZW50IGl0IGEgZmV3IHRpbWVzLgorCSAqIEFzc3VtaW5nIGl0IHdvbid0IGluY3JlbWVudCBpdCB0byBsZXNzIHRoYW4gLTkwLgorCSAqLworCWlmIChnX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lIDwgLTkwIHx8IGdfcGFyc2VmaWxlLT5idWYgPT0gTlVMTCkgeworCQlwZ2V0Y19kZWJ1ZygicHJlYWRidWZmZXIgUEVPRjEiKTsKKwkJLyogZXZlbiBpbiBmYWlsdXJlIGtlZXAgbGVmdF9pbl9saW5lIGFuZCBuZXh0X3RvX3BnZXRjCisJCSAqIGluIGxvY2sgc3RlcCwgZm9yIGNvcnJlY3QgbXVsdGktbGF5ZXIgcHVuZ2V0Yy4KKwkJICogbGVmdF9pbl9saW5lIHdhcyBkZWNyZW1lbnRlZCBiZWZvcmUgcHJlYWRidWZmZXIoKSwKKwkJICogbXVzdCBpbmMgbmV4dF90b19wZ2V0YzogKi8KKwkJZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMrKzsKKwkJcmV0dXJuIFBFT0Y7CisJfQorCisJbW9yZSA9IGdfcGFyc2VmaWxlLT5sZWZ0X2luX2J1ZmZlcjsKKwlpZiAobW9yZSA8PSAwKSB7CisJCWZsdXNoX3N0ZG91dF9zdGRlcnIoKTsKKyBhZ2FpbjoKKwkJbW9yZSA9IHByZWFkZmQoKTsKKwkJaWYgKG1vcmUgPD0gMCkgeworCQkJLyogZG9uJ3QgdHJ5IHJlYWRpbmcgYWdhaW4gKi8KKwkJCWdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUgPSAtOTk7CisJCQlwZ2V0Y19kZWJ1ZygicHJlYWRidWZmZXIgUEVPRjIiKTsKKwkJCWdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjKys7CisJCQlyZXR1cm4gUEVPRjsKKwkJfQorCX0KKworCS8qIEZpbmQgb3V0IHdoZXJlJ3MgdGhlIGVuZCBvZiBsaW5lLgorCSAqIFNldCBnX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lCisJICogYW5kIGdfcGFyc2VmaWxlLT5sZWZ0X2luX2J1ZmZlciBhY29yZGluZ2x5LgorCSAqIE5VTCBjaGFycyBhcmUgZGVsZXRlZC4KKwkgKi8KKwlxID0gZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGM7CisJZm9yICg7OykgeworCQljaGFyIGM7CisKKwkJbW9yZS0tOworCisJCWMgPSAqcTsKKwkJaWYgKGMgPT0gJ1wwJykgeworCQkJbWVtbW92ZShxLCBxICsgMSwgbW9yZSk7CisJCX0gZWxzZSB7CisJCQlxKys7CisJCQlpZiAoYyA9PSAnXG4nKSB7CisJCQkJZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZSA9IHEgLSBnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0YyAtIDE7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAobW9yZSA8PSAwKSB7CisJCQlnX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lID0gcSAtIGdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjIC0gMTsKKwkJCWlmIChnX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lIDwgMCkKKwkJCQlnb3RvIGFnYWluOworCQkJYnJlYWs7CisJCX0KKwl9CisJZ19wYXJzZWZpbGUtPmxlZnRfaW5fYnVmZmVyID0gbW9yZTsKKworCWlmICh2ZmxhZykgeworCQljaGFyIHNhdmUgPSAqcTsKKwkJKnEgPSAnXDAnOworCQlvdXQyc3RyKGdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjKTsKKwkJKnEgPSBzYXZlOworCX0KKworCXBnZXRjX2RlYnVnKCJwcmVhZGJ1ZmZlciBhdCAlZDolcCclcyciLAorCQkJZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZSwKKwkJCWdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjLAorCQkJZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMpOworCXJldHVybiAodW5zaWduZWQgY2hhcikqZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMrKzsKK30KKworI2RlZmluZSBwZ2V0Y19hc19tYWNybygpIFwKKwkoLS1nX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lID49IDAgXAorCT8gKHVuc2lnbmVkIGNoYXIpKmdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjKysgXAorCTogcHJlYWRidWZmZXIoKSBcCisJKQorCitzdGF0aWMgaW50CitwZ2V0Yyh2b2lkKQoreworCXBnZXRjX2RlYnVnKCJwZ2V0Y19mYXN0IGF0ICVkOiVwJyVzJyIsCisJCQlnX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lLAorCQkJZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMsCisJCQlnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0Yyk7CisJcmV0dXJuIHBnZXRjX2FzX21hY3JvKCk7Cit9CisKKyNpZiBFTkFCTEVfQVNIX09QVElNSVpFX0ZPUl9TSVpFCisjIGRlZmluZSBwZ2V0Y19mYXN0KCkgcGdldGMoKQorI2Vsc2UKKyMgZGVmaW5lIHBnZXRjX2Zhc3QoKSBwZ2V0Y19hc19tYWNybygpCisjZW5kaWYKKworI2lmIEVOQUJMRV9BU0hfQUxJQVMKK3N0YXRpYyBpbnQKK3BnZXRjX3dpdGhvdXRfUEVPQSh2b2lkKQoreworCWludCBjOworCWRvIHsKKwkJcGdldGNfZGVidWcoInBnZXRjX2Zhc3QgYXQgJWQ6JXAnJXMnIiwKKwkJCQlnX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lLAorCQkJCWdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjLAorCQkJCWdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjKTsKKwkJYyA9IHBnZXRjX2Zhc3QoKTsKKwl9IHdoaWxlIChjID09IFBFT0EpOworCXJldHVybiBjOworfQorI2Vsc2UKKyMgZGVmaW5lIHBnZXRjX3dpdGhvdXRfUEVPQSgpIHBnZXRjKCkKKyNlbmRpZgorCisvKgorICogUmVhZCBhIGxpbmUgZnJvbSB0aGUgc2NyaXB0LgorICovCitzdGF0aWMgY2hhciAqCitwZmdldHMoY2hhciAqbGluZSwgaW50IGxlbikKK3sKKwljaGFyICpwID0gbGluZTsKKwlpbnQgbmxlZnQgPSBsZW47CisJaW50IGM7CisKKwl3aGlsZSAoLS1ubGVmdCA+IDApIHsKKwkJYyA9IHBnZXRjX3dpdGhvdXRfUEVPQSgpOworCQlpZiAoYyA9PSBQRU9GKSB7CisJCQlpZiAocCA9PSBsaW5lKQorCQkJCXJldHVybiBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJKnArKyA9IGM7CisJCWlmIChjID09ICdcbicpCisJCQlicmVhazsKKwl9CisJKnAgPSAnXDAnOworCXJldHVybiBsaW5lOworfQorCisvKgorICogVW5kbyB0aGUgbGFzdCBjYWxsIHRvIHBnZXRjLiAgT25seSBvbmUgY2hhcmFjdGVyIG1heSBiZSBwdXNoZWQgYmFjay4KKyAqIFBFT0YgbWF5IGJlIHB1c2hlZCBiYWNrLgorICovCitzdGF0aWMgdm9pZAorcHVuZ2V0Yyh2b2lkKQoreworCWdfcGFyc2VmaWxlLT5sZWZ0X2luX2xpbmUrKzsKKwlnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0Yy0tOworCXBnZXRjX2RlYnVnKCJwdXNoZWQgYmFjayB0byAlZDolcCclcyciLAorCQkJZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZSwKKwkJCWdfcGFyc2VmaWxlLT5uZXh0X3RvX3BnZXRjLAorCQkJZ19wYXJzZWZpbGUtPm5leHRfdG9fcGdldGMpOworfQorCisvKgorICogVG8gaGFuZGxlIHRoZSAiLiIgY29tbWFuZCwgYSBzdGFjayBvZiBpbnB1dCBmaWxlcyBpcyB1c2VkLiAgUHVzaGZpbGUKKyAqIGFkZHMgYSBuZXcgZW50cnkgdG8gdGhlIHN0YWNrIGFuZCBwb3BmaWxlIHJlc3RvcmVzIHRoZSBwcmV2aW91cyBsZXZlbC4KKyAqLworc3RhdGljIHZvaWQKK3B1c2hmaWxlKHZvaWQpCit7CisJc3RydWN0IHBhcnNlZmlsZSAqcGY7CisKKwlwZiA9IGNremFsbG9jKHNpemVvZigqcGYpKTsKKwlwZi0+cHJldiA9IGdfcGFyc2VmaWxlOworCXBmLT5wZl9mZCA9IC0xOworCS8qcGYtPnN0cnB1c2ggPSBOVUxMOyAtIGNremFsbG9jIGRpZCBpdCAqLworCS8qcGYtPmJhc2VzdHJwdXNoLnByZXYgPSBOVUxMOyovCisJZ19wYXJzZWZpbGUgPSBwZjsKK30KKworc3RhdGljIHZvaWQKK3BvcGZpbGUodm9pZCkKK3sKKwlzdHJ1Y3QgcGFyc2VmaWxlICpwZiA9IGdfcGFyc2VmaWxlOworCisJSU5UX09GRjsKKwlpZiAocGYtPnBmX2ZkID49IDApCisJCWNsb3NlKHBmLT5wZl9mZCk7CisJZnJlZShwZi0+YnVmKTsKKwl3aGlsZSAocGYtPnN0cnB1c2gpCisJCXBvcHN0cmluZygpOworCWdfcGFyc2VmaWxlID0gcGYtPnByZXY7CisJZnJlZShwZik7CisJSU5UX09OOworfQorCisvKgorICogUmV0dXJuIHRvIHRvcCBsZXZlbC4KKyAqLworc3RhdGljIHZvaWQKK3BvcGFsbGZpbGVzKHZvaWQpCit7CisJd2hpbGUgKGdfcGFyc2VmaWxlICE9ICZiYXNlcGYpCisJCXBvcGZpbGUoKTsKK30KKworLyoKKyAqIENsb3NlIHRoZSBmaWxlKHMpIHRoYXQgdGhlIHNoZWxsIGlzIHJlYWRpbmcgY29tbWFuZHMgZnJvbS4gIENhbGxlZAorICogYWZ0ZXIgYSBmb3JrIGlzIGRvbmUuCisgKi8KK3N0YXRpYyB2b2lkCitjbG9zZXNjcmlwdCh2b2lkKQoreworCXBvcGFsbGZpbGVzKCk7CisJaWYgKGdfcGFyc2VmaWxlLT5wZl9mZCA+IDApIHsKKwkJY2xvc2UoZ19wYXJzZWZpbGUtPnBmX2ZkKTsKKwkJZ19wYXJzZWZpbGUtPnBmX2ZkID0gMDsKKwl9Cit9CisKKy8qCisgKiBMaWtlIHNldGlucHV0ZmlsZSwgYnV0IHRha2VzIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yLiAgQ2FsbCB0aGlzIHdpdGgKKyAqIGludGVycnVwdHMgb2ZmLgorICovCitzdGF0aWMgdm9pZAorc2V0aW5wdXRmZChpbnQgZmQsIGludCBwdXNoKQoreworCWNsb3NlX29uX2V4ZWNfb24oZmQpOworCWlmIChwdXNoKSB7CisJCXB1c2hmaWxlKCk7CisJCWdfcGFyc2VmaWxlLT5idWYgPSBOVUxMOworCX0KKwlnX3BhcnNlZmlsZS0+cGZfZmQgPSBmZDsKKwlpZiAoZ19wYXJzZWZpbGUtPmJ1ZiA9PSBOVUxMKQorCQlnX3BhcnNlZmlsZS0+YnVmID0gY2ttYWxsb2MoSUJVRlNJWik7CisJZ19wYXJzZWZpbGUtPmxlZnRfaW5fYnVmZmVyID0gMDsKKwlnX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lID0gMDsKKwlnX3BhcnNlZmlsZS0+bGlubm8gPSAxOworfQorCisvKgorICogU2V0IHRoZSBpbnB1dCB0byB0YWtlIGlucHV0IGZyb20gYSBmaWxlLiAgSWYgcHVzaCBpcyBzZXQsIHB1c2ggdGhlCisgKiBvbGQgaW5wdXQgb250byB0aGUgc3RhY2sgZmlyc3QuCisgKi8KK3N0YXRpYyBpbnQKK3NldGlucHV0ZmlsZShjb25zdCBjaGFyICpmbmFtZSwgaW50IGZsYWdzKQoreworCWludCBmZDsKKwlpbnQgZmQyOworCisJSU5UX09GRjsKKwlmZCA9IG9wZW4oZm5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKSB7CisJCWlmIChmbGFncyAmIElOUFVUX05PRklMRV9PSykKKwkJCWdvdG8gb3V0OworCQlhc2hfbXNnX2FuZF9yYWlzZV9lcnJvcigiY2FuJ3Qgb3BlbiAnJXMnIiwgZm5hbWUpOworCX0KKwlpZiAoZmQgPCAxMCkgeworCQlmZDIgPSBjb3B5ZmQoZmQsIDEwKTsKKwkJY2xvc2UoZmQpOworCQlpZiAoZmQyIDwgMCkKKwkJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCJvdXQgb2YgZmlsZSBkZXNjcmlwdG9ycyIpOworCQlmZCA9IGZkMjsKKwl9CisJc2V0aW5wdXRmZChmZCwgZmxhZ3MgJiBJTlBVVF9QVVNIX0ZJTEUpOworIG91dDoKKwlJTlRfT047CisJcmV0dXJuIGZkOworfQorCisvKgorICogTGlrZSBzZXRpbnB1dGZpbGUsIGJ1dCB0YWtlcyBpbnB1dCBmcm9tIGEgc3RyaW5nLgorICovCitzdGF0aWMgdm9pZAorc2V0aW5wdXRzdHJpbmcoY2hhciAqc3RyaW5nKQoreworCUlOVF9PRkY7CisJcHVzaGZpbGUoKTsKKwlnX3BhcnNlZmlsZS0+bmV4dF90b19wZ2V0YyA9IHN0cmluZzsKKwlnX3BhcnNlZmlsZS0+bGVmdF9pbl9saW5lID0gc3RybGVuKHN0cmluZyk7CisJZ19wYXJzZWZpbGUtPmJ1ZiA9IE5VTEw7CisJZ19wYXJzZWZpbGUtPmxpbm5vID0gMTsKKwlJTlRfT047Cit9CisKKworLyogPT09PT09PT09PT09IG1haWwuYworICoKKyAqIFJvdXRpbmVzIHRvIGNoZWNrIGZvciBtYWlsLgorICovCisKKyNpZiBFTkFCTEVfQVNIX01BSUwKKworLyogSGFzaCBvZiBtdGltZXMgb2YgbWFpbGJveGVzICovCitzdGF0aWMgdW5zaWduZWQgbWFpbHRpbWVfaGFzaDsKKy8qIFNldCBpZiBNQUlMIG9yIE1BSUxQQVRIIGlzIGNoYW5nZWQuICovCitzdGF0aWMgc21hbGxpbnQgbWFpbF92YXJfcGF0aF9jaGFuZ2VkOworCisvKgorICogUHJpbnQgYXBwcm9wcmlhdGUgbWVzc2FnZShzKSBpZiBtYWlsIGhhcyBhcnJpdmVkLgorICogSWYgbWFpbF92YXJfcGF0aF9jaGFuZ2VkIGlzIHNldCwKKyAqIHRoZW4gdGhlIHZhbHVlIG9mIE1BSUwgaGFzIG1haWxfdmFyX3BhdGhfY2hhbmdlZCwKKyAqIHNvIHdlIGp1c3QgdXBkYXRlIHRoZSB2YWx1ZXMuCisgKi8KK3N0YXRpYyB2b2lkCitjaGttYWlsKHZvaWQpCit7CisJY29uc3QgY2hhciAqbXBhdGg7CisJY2hhciAqcDsKKwljaGFyICpxOworCXVuc2lnbmVkIG5ld19oYXNoOworCXN0cnVjdCBzdGFja21hcmsgc21hcms7CisJc3RydWN0IHN0YXQgc3RhdGI7CisKKwlzZXRzdGFja21hcmsoJnNtYXJrKTsKKwltcGF0aCA9IG1wYXRoc2V0KCkgPyBtcGF0aHZhbCgpIDogbWFpbHZhbCgpOworCW5ld19oYXNoID0gMDsKKwlmb3IgKDs7KSB7CisJCXAgPSBwYXRoX2FkdmFuY2UoJm1wYXRoLCBudWxsc3RyKTsKKwkJaWYgKHAgPT0gTlVMTCkKKwkJCWJyZWFrOworCQlpZiAoKnAgPT0gJ1wwJykKKwkJCWNvbnRpbnVlOworCQlmb3IgKHEgPSBwOyAqcTsgcSsrKQorCQkJY29udGludWU7CisjaWYgREVCVUcKKwkJaWYgKHFbLTFdICE9ICcvJykKKwkJCWFib3J0KCk7CisjZW5kaWYKKwkJcVstMV0gPSAnXDAnOyAgICAgICAgICAgICAgICAgICAvKiBkZWxldGUgdHJhaWxpbmcgJy8nICovCisJCWlmIChzdGF0KHAsICZzdGF0YikgPCAwKSB7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBWZXJ5IHNpbXBsaXN0aWMgImhhc2giOiBqdXN0IGEgc3VtIG9mIGFsbCBtdGltZXMgKi8KKwkJbmV3X2hhc2ggKz0gKHVuc2lnbmVkKXN0YXRiLnN0X210aW1lOworCX0KKwlpZiAoIW1haWxfdmFyX3BhdGhfY2hhbmdlZCAmJiBtYWlsdGltZV9oYXNoICE9IG5ld19oYXNoKSB7CisJCWlmIChtYWlsdGltZV9oYXNoICE9IDApCisJCQlvdXQyc3RyKCJ5b3UgaGF2ZSBtYWlsXG4iKTsKKwkJbWFpbHRpbWVfaGFzaCA9IG5ld19oYXNoOworCX0KKwltYWlsX3Zhcl9wYXRoX2NoYW5nZWQgPSAwOworCXBvcHN0YWNrbWFyaygmc21hcmspOworfQorCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMKK2NoYW5nZW1haWwoY29uc3QgY2hhciAqdmFsIFVOVVNFRF9QQVJBTSkKK3sKKwltYWlsX3Zhcl9wYXRoX2NoYW5nZWQgPSAxOworfQorCisjZW5kaWYgLyogQVNIX01BSUwgKi8KKworCisvKiA9PT09PT09PT09PT0gPz8/ICovCisKKy8qCisgKiBTZXQgdGhlIHNoZWxsIHBhcmFtZXRlcnMuCisgKi8KK3N0YXRpYyB2b2lkCitzZXRwYXJhbShjaGFyICoqYXJndikKK3sKKwljaGFyICoqbmV3cGFyYW07CisJY2hhciAqKmFwOworCWludCBucGFyYW07CisKKwlmb3IgKG5wYXJhbSA9IDA7IGFyZ3ZbbnBhcmFtXTsgbnBhcmFtKyspCisJCWNvbnRpbnVlOworCWFwID0gbmV3cGFyYW0gPSBja21hbGxvYygobnBhcmFtICsgMSkgKiBzaXplb2YoKmFwKSk7CisJd2hpbGUgKCphcmd2KSB7CisJCSphcCsrID0gY2tzdHJkdXAoKmFyZ3YrKyk7CisJfQorCSphcCA9IE5VTEw7CisJZnJlZXBhcmFtKCZzaGVsbHBhcmFtKTsKKwlzaGVsbHBhcmFtLm1hbGxvY2VkID0gMTsKKwlzaGVsbHBhcmFtLm5wYXJhbSA9IG5wYXJhbTsKKwlzaGVsbHBhcmFtLnAgPSBuZXdwYXJhbTsKKyNpZiBFTkFCTEVfQVNIX0dFVE9QVFMKKwlzaGVsbHBhcmFtLm9wdGluZCA9IDE7CisJc2hlbGxwYXJhbS5vcHRvZmYgPSAtMTsKKyNlbmRpZgorfQorCisvKgorICogUHJvY2VzcyBzaGVsbCBvcHRpb25zLiAgVGhlIGdsb2JhbCB2YXJpYWJsZSBhcmdwdHIgY29udGFpbnMgYSBwb2ludGVyCisgKiB0byB0aGUgYXJndW1lbnQgbGlzdDsgd2UgYWR2YW5jZSBpdCBwYXN0IHRoZSBvcHRpb25zLgorICoKKyAqIFNVU3YzIHNlY3Rpb24gMi44LjEgIkNvbnNlcXVlbmNlcyBvZiBTaGVsbCBFcnJvcnMiIHNheXM6CisgKiBGb3IgYSBub24taW50ZXJhY3RpdmUgc2hlbGwsIGFuIGVycm9yIGNvbmRpdGlvbiBlbmNvdW50ZXJlZAorICogYnkgYSBzcGVjaWFsIGJ1aWx0LWluIC4uLiBzaGFsbCBjYXVzZSB0aGUgc2hlbGwgdG8gd3JpdGUgYSBkaWFnbm9zdGljIG1lc3NhZ2UKKyAqIHRvIHN0YW5kYXJkIGVycm9yIGFuZCBleGl0IGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisgKiBFcnJvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcGVjaWFsIEJ1aWx0LUluCisgKiAuLi4KKyAqIFV0aWxpdHkgc3ludGF4IGVycm9yIChvcHRpb24gb3Igb3BlcmFuZCBlcnJvcikgIFNoYWxsIGV4aXQKKyAqIC4uLgorICogSG93ZXZlciwgaW4gYnVnIDExNDIgKGh0dHA6Ly9idXN5Ym94Lm5ldC9idWdzL3ZpZXcucGhwP2lkPTExNDIpCisgKiB3ZSBzZWUgdGhhdCBiYXNoIGRvZXMgbm90IGRvIHRoYXQgKHNldCAiZmluaXNoZXMiIHdpdGggZXJyb3IgY29kZSAxIGluc3RlYWQsCisgKiBhbmQgc2hlbGwgY29udGludWVzKSwgYW5kIHBlb3BsZSByZWx5IG9uIHRoaXMgYmVoYXZpb3IhCisgKiBUZXN0Y2FzZToKKyAqIHNldCAtbyBiYXJmb28gMj4vZGV2L251bGwKKyAqIGVjaG8gJD8KKyAqCisgKiBPaCB3ZWxsLiBMZXQncyBtaW1pYyB0aGF0LgorICovCitzdGF0aWMgaW50CitwbHVzX21pbnVzX28oY2hhciAqbmFtZSwgaW50IHZhbCkKK3sKKwlpbnQgaTsKKworCWlmIChuYW1lKSB7CisJCWZvciAoaSA9IDA7IGkgPCBOT1BUUzsgaSsrKSB7CisJCQlpZiAoc3RyY21wKG5hbWUsIG9wdG5hbWVzKGkpKSA9PSAwKSB7CisJCQkJb3B0bGlzdFtpXSA9IHZhbDsKKwkJCQlyZXR1cm4gMDsKKwkJCX0KKwkJfQorCQlhc2hfbXNnKCJpbGxlZ2FsIG9wdGlvbiAlY28gJXMiLCB2YWwgPyAnLScgOiAnKycsIG5hbWUpOworCQlyZXR1cm4gMTsKKwl9CisJZm9yIChpID0gMDsgaSA8IE5PUFRTOyBpKyspIHsKKwkJaWYgKHZhbCkgeworCQkJb3V0MWZtdCgiJS0xNnMlc1xuIiwgb3B0bmFtZXMoaSksIG9wdGxpc3RbaV0gPyAib24iIDogIm9mZiIpOworCQl9IGVsc2UgeworCQkJb3V0MWZtdCgic2V0ICVjbyAlc1xuIiwgb3B0bGlzdFtpXSA/ICctJyA6ICcrJywgb3B0bmFtZXMoaSkpOworCQl9CisJfQorCXJldHVybiAwOworfQorc3RhdGljIHZvaWQKK3NldG9wdGlvbihpbnQgZmxhZywgaW50IHZhbCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBOT1BUUzsgaSsrKSB7CisJCWlmIChvcHRsZXR0ZXJzKGkpID09IGZsYWcpIHsKKwkJCW9wdGxpc3RbaV0gPSB2YWw7CisJCQlyZXR1cm47CisJCX0KKwl9CisJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoImlsbGVnYWwgb3B0aW9uICVjJWMiLCB2YWwgPyAnLScgOiAnKycsIGZsYWcpOworCS8qIE5PVFJFQUNIRUQgKi8KK30KK3N0YXRpYyBpbnQKK29wdGlvbnMoaW50IGNtZGxpbmUpCit7CisJY2hhciAqcDsKKwlpbnQgdmFsOworCWludCBjOworCisJaWYgKGNtZGxpbmUpCisJCW1pbnVzYyA9IE5VTEw7CisJd2hpbGUgKChwID0gKmFyZ3B0cikgIT0gTlVMTCkgeworCQljID0gKnArKzsKKwkJaWYgKGMgIT0gJy0nICYmIGMgIT0gJysnKQorCQkJYnJlYWs7CisJCWFyZ3B0cisrOworCQl2YWwgPSAwOyAvKiB2YWwgPSAwIGlmIGMgPT0gJysnICovCisJCWlmIChjID09ICctJykgeworCQkJdmFsID0gMTsKKwkJCWlmIChwWzBdID09ICdcMCcgfHwgTE9ORV9EQVNIKHApKSB7CisJCQkJaWYgKCFjbWRsaW5lKSB7CisJCQkJCS8qICItIiBtZWFucyB0dXJuIG9mZiAteCBhbmQgLXYgKi8KKwkJCQkJaWYgKHBbMF0gPT0gJ1wwJykKKwkJCQkJCXhmbGFnID0gdmZsYWcgPSAwOworCQkJCQkvKiAiLS0iIG1lYW5zIHJlc2V0IHBhcmFtcyAqLworCQkJCQllbHNlIGlmICgqYXJncHRyID09IE5VTEwpCisJCQkJCQlzZXRwYXJhbShhcmdwdHIpOworCQkJCX0KKwkJCQlicmVhazsgICAgLyogIi0iIG9yICItLSIgdGVybWluYXRlcyBvcHRpb25zICovCisJCQl9CisJCX0KKwkJLyogZmlyc3QgY2hhciB3YXMgKyBvciAtICovCisJCXdoaWxlICgoYyA9ICpwKyspICE9ICdcMCcpIHsKKwkJCS8qIGJhc2ggMy4yIGluZGVlZCBoYW5kbGVzIC1jIENNRCBhbmQgK2MgQ01EIHRoZSBzYW1lICovCisJCQlpZiAoYyA9PSAnYycgJiYgY21kbGluZSkgeworCQkJCW1pbnVzYyA9IHA7ICAgICAvKiBjb21tYW5kIGlzIGFmdGVyIHNoZWxsIGFyZ3MgKi8KKwkJCX0gZWxzZSBpZiAoYyA9PSAnbycpIHsKKwkJCQlpZiAocGx1c19taW51c19vKCphcmdwdHIsIHZhbCkpIHsKKwkJCQkJLyogaXQgYWxyZWFkeSBwcmludGVkIGVyciBtZXNzYWdlICovCisJCQkJCXJldHVybiAxOyAvKiBlcnJvciAqLworCQkJCX0KKwkJCQlpZiAoKmFyZ3B0cikKKwkJCQkJYXJncHRyKys7CisJCQl9IGVsc2UgaWYgKGNtZGxpbmUgJiYgKGMgPT0gJ2wnKSkgeyAvKiAtbCBvciArbCA9PSAtLWxvZ2luICovCisJCQkJaXNsb2dpbnNoID0gMTsKKwkJCS8qIGJhc2ggZG9lcyBub3QgYWNjZXB0ICstbG9naW4sIHdlIGFsc28gd29uJ3QgKi8KKwkJCX0gZWxzZSBpZiAoY21kbGluZSAmJiB2YWwgJiYgKGMgPT0gJy0nKSkgeyAvKiBsb25nIG9wdGlvbnMgKi8KKwkJCQlpZiAoc3RyY21wKHAsICJsb2dpbiIpID09IDApCisJCQkJCWlzbG9naW5zaCA9IDE7CisJCQkJYnJlYWs7CisJCQl9IGVsc2UgeworCQkJCXNldG9wdGlvbihjLCB2YWwpOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCisvKgorICogVGhlIHNoaWZ0IGJ1aWx0aW4gY29tbWFuZC4KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMKK3NoaWZ0Y21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IG47CisJY2hhciAqKmFwMSwgKiphcDI7CisKKwluID0gMTsKKwlpZiAoYXJndlsxXSkKKwkJbiA9IG51bWJlcihhcmd2WzFdKTsKKwlpZiAobiA+IHNoZWxscGFyYW0ubnBhcmFtKQorCQluID0gMDsgLyogYmFzaCBjb21wYXQsIHdhcyA9IHNoZWxscGFyYW0ubnBhcmFtOyAqLworCUlOVF9PRkY7CisJc2hlbGxwYXJhbS5ucGFyYW0gLT0gbjsKKwlmb3IgKGFwMSA9IHNoZWxscGFyYW0ucDsgLS1uID49IDA7IGFwMSsrKSB7CisJCWlmIChzaGVsbHBhcmFtLm1hbGxvY2VkKQorCQkJZnJlZSgqYXAxKTsKKwl9CisJYXAyID0gc2hlbGxwYXJhbS5wOworCXdoaWxlICgoKmFwMisrID0gKmFwMSsrKSAhPSBOVUxMKQorCQljb250aW51ZTsKKyNpZiBFTkFCTEVfQVNIX0dFVE9QVFMKKwlzaGVsbHBhcmFtLm9wdGluZCA9IDE7CisJc2hlbGxwYXJhbS5vcHRvZmYgPSAtMTsKKyNlbmRpZgorCUlOVF9PTjsKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFBPU0lYIHJlcXVpcmVzIHRoYXQgJ3NldCcgKGJ1dCBub3QgZXhwb3J0IG9yIHJlYWRvbmx5KSBvdXRwdXQgdGhlCisgKiB2YXJpYWJsZXMgaW4gbGV4aWNvZ3JhcGhpYyBvcmRlciAtIGJ5IHRoZSBsb2NhbGUncyBjb2xsYXRpbmcgb3JkZXIgKHNpZ2gpLgorICogTWF5YmUgd2UgY291bGQga2VlcCB0aGVtIGluIGFuIG9yZGVyZWQgYmFsYW5jZWQgYmluYXJ5IHRyZWUKKyAqIGluc3RlYWQgb2YgaGFzaGVkIGxpc3RzLgorICogRm9yIG5vdyBqdXN0IHJvbGwgJ2VtIHRocm91Z2ggcXNvcnQgZm9yIHByaW50aW5nLi4uCisgKi8KK3N0YXRpYyBpbnQKK3Nob3d2YXJzKGNvbnN0IGNoYXIgKnNlcF9wcmVmaXgsIGludCBvbiwgaW50IG9mZikKK3sKKwljb25zdCBjaGFyICpzZXA7CisJY2hhciAqKmVwLCAqKmVwZW5kOworCisJZXAgPSBsaXN0dmFycyhvbiwgb2ZmLCAmZXBlbmQpOworCXFzb3J0KGVwLCBlcGVuZCAtIGVwLCBzaXplb2YoY2hhciAqKSwgdnBjbXApOworCisJc2VwID0gKnNlcF9wcmVmaXggPyAiICIgOiBzZXBfcHJlZml4OworCisJZm9yICg7IGVwIDwgZXBlbmQ7IGVwKyspIHsKKwkJY29uc3QgY2hhciAqcDsKKwkJY29uc3QgY2hhciAqcTsKKworCQlwID0gc3RyY2hybnVsKCplcCwgJz0nKTsKKwkJcSA9IG51bGxzdHI7CisJCWlmICgqcCkKKwkJCXEgPSBzaW5nbGVfcXVvdGUoKytwKTsKKwkJb3V0MWZtdCgiJXMlcyUuKnMlc1xuIiwgc2VwX3ByZWZpeCwgc2VwLCAoaW50KShwIC0gKmVwKSwgKmVwLCBxKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUaGUgc2V0IGNvbW1hbmQgYnVpbHRpbi4KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMKK3NldGNtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlpbnQgcmV0dmFsOworCisJaWYgKCFhcmd2WzFdKQorCQlyZXR1cm4gc2hvd3ZhcnMobnVsbHN0ciwgMCwgVlVOU0VUKTsKKworCUlOVF9PRkY7CisJcmV0dmFsID0gb3B0aW9ucygvKmNtZGxpbmU6Ki8gMCk7CisJaWYgKHJldHZhbCA9PSAwKSB7IC8qIGlmIG5vIHBhcnNlIGVycm9yLi4uICovCisJCW9wdHNjaGFuZ2VkKCk7CisJCWlmICgqYXJncHRyICE9IE5VTEwpIHsKKwkJCXNldHBhcmFtKGFyZ3B0cik7CisJCX0KKwl9CisJSU5UX09OOworCXJldHVybiByZXR2YWw7Cit9CisKKyNpZiBFTkFCTEVfQVNIX1JBTkRPTV9TVVBQT1JUCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMKK2NoYW5nZV9yYW5kb20oY29uc3QgY2hhciAqdmFsdWUpCit7CisJdWludDMyX3QgdDsKKworCWlmICh2YWx1ZSA9PSBOVUxMKSB7CisJCS8qICJnZXQiLCBnZW5lcmF0ZSAqLworCQl0ID0gbmV4dF9yYW5kb20oJnJhbmRvbV9nZW4pOworCQkvKiBzZXQgd2l0aG91dCByZWN1cnNpb24gKi8KKwkJc2V0dmFyKHZyYW5kb20udmFyX3RleHQsIHV0b2EodCksIFZOT0ZVTkMpOworCQl2cmFuZG9tLmZsYWdzICY9IH5WTk9GVU5DOworCX0gZWxzZSB7CisJCS8qIHNldC9yZXNldCAqLworCQl0ID0gc3RydG91bCh2YWx1ZSwgTlVMTCwgMTApOworCQlJTklUX1JBTkRPTV9UKCZyYW5kb21fZ2VuLCAodCA/IHQgOiAxKSwgdCk7CisJfQorfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfQVNIX0dFVE9QVFMKK3N0YXRpYyBpbnQKK2dldG9wdHMoY2hhciAqb3B0c3RyLCBjaGFyICpvcHR2YXIsIGNoYXIgKipvcHRmaXJzdCwgaW50ICpwYXJhbV9vcHRpbmQsIGludCAqb3B0b2ZmKQoreworCWNoYXIgKnAsICpxOworCWNoYXIgYyA9ICc/JzsKKwlpbnQgZG9uZSA9IDA7CisJaW50IGVyciA9IDA7CisJY2hhciBzYnVmWzJdOworCWNoYXIgKipvcHRuZXh0OworCisJc2J1ZlsxXSA9ICdcMCc7CisKKwlpZiAoKnBhcmFtX29wdGluZCA8IDEpCisJCXJldHVybiAxOworCW9wdG5leHQgPSBvcHRmaXJzdCArICpwYXJhbV9vcHRpbmQgLSAxOworCisJaWYgKCpwYXJhbV9vcHRpbmQgPD0gMSB8fCAqb3B0b2ZmIDwgMCB8fCAoaW50KXN0cmxlbihvcHRuZXh0Wy0xXSkgPCAqb3B0b2ZmKQorCQlwID0gTlVMTDsKKwllbHNlCisJCXAgPSBvcHRuZXh0Wy0xXSArICpvcHRvZmY7CisJaWYgKHAgPT0gTlVMTCB8fCAqcCA9PSAnXDAnKSB7CisJCS8qIEN1cnJlbnQgd29yZCBpcyBkb25lLCBhZHZhbmNlICovCisJCXAgPSAqb3B0bmV4dDsKKwkJaWYgKHAgPT0gTlVMTCB8fCAqcCAhPSAnLScgfHwgKisrcCA9PSAnXDAnKSB7CisgYXRlbmQ6CisJCQlwID0gTlVMTDsKKwkJCWRvbmUgPSAxOworCQkJZ290byBvdXQ7CisJCX0KKwkJb3B0bmV4dCsrOworCQlpZiAoTE9ORV9EQVNIKHApKSAgICAgICAgLyogY2hlY2sgZm9yICItLSIgKi8KKwkJCWdvdG8gYXRlbmQ7CisJfQorCisJYyA9ICpwKys7CisJZm9yIChxID0gb3B0c3RyOyAqcSAhPSBjOykgeworCQlpZiAoKnEgPT0gJ1wwJykgeworCQkJaWYgKG9wdHN0clswXSA9PSAnOicpIHsKKwkJCQlzYnVmWzBdID0gYzsKKwkJCQkvKnNidWZbMV0gPSAnXDAnOyAtIGFscmVhZHkgaXMgKi8KKwkJCQllcnIgfD0gc2V0dmFyc2FmZSgiT1BUQVJHIiwgc2J1ZiwgMCk7CisJCQl9IGVsc2UgeworCQkJCWZwcmludGYoc3RkZXJyLCAiSWxsZWdhbCBvcHRpb24gLSVjXG4iLCBjKTsKKwkJCQl1bnNldHZhcigiT1BUQVJHIik7CisJCQl9CisJCQljID0gJz8nOworCQkJZ290byBvdXQ7CisJCX0KKwkJaWYgKCorK3EgPT0gJzonKQorCQkJcSsrOworCX0KKworCWlmICgqKytxID09ICc6JykgeworCQlpZiAoKnAgPT0gJ1wwJyAmJiAocCA9ICpvcHRuZXh0KSA9PSBOVUxMKSB7CisJCQlpZiAob3B0c3RyWzBdID09ICc6JykgeworCQkJCXNidWZbMF0gPSBjOworCQkJCS8qc2J1ZlsxXSA9ICdcMCc7IC0gYWxyZWFkeSBpcyAqLworCQkJCWVyciB8PSBzZXR2YXJzYWZlKCJPUFRBUkciLCBzYnVmLCAwKTsKKwkJCQljID0gJzonOworCQkJfSBlbHNlIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIk5vIGFyZyBmb3IgLSVjIG9wdGlvblxuIiwgYyk7CisJCQkJdW5zZXR2YXIoIk9QVEFSRyIpOworCQkJCWMgPSAnPyc7CisJCQl9CisJCQlnb3RvIG91dDsKKwkJfQorCisJCWlmIChwID09ICpvcHRuZXh0KQorCQkJb3B0bmV4dCsrOworCQllcnIgfD0gc2V0dmFyc2FmZSgiT1BUQVJHIiwgcCwgMCk7CisJCXAgPSBOVUxMOworCX0gZWxzZQorCQllcnIgfD0gc2V0dmFyc2FmZSgiT1BUQVJHIiwgbnVsbHN0ciwgMCk7Cisgb3V0OgorCSpvcHRvZmYgPSBwID8gcCAtICoob3B0bmV4dCAtIDEpIDogLTE7CisJKnBhcmFtX29wdGluZCA9IG9wdG5leHQgLSBvcHRmaXJzdCArIDE7CisJZXJyIHw9IHNldHZhcnNhZmUoIk9QVElORCIsIGl0b2EoKnBhcmFtX29wdGluZCksIFZOT0ZVTkMpOworCXNidWZbMF0gPSBjOworCS8qc2J1ZlsxXSA9ICdcMCc7IC0gYWxyZWFkeSBpcyAqLworCWVyciB8PSBzZXR2YXJzYWZlKG9wdHZhciwgc2J1ZiwgMCk7CisJaWYgKGVycikgeworCQkqcGFyYW1fb3B0aW5kID0gMTsKKwkJKm9wdG9mZiA9IC0xOworCQlmbHVzaF9zdGRvdXRfc3RkZXJyKCk7CisJCXJhaXNlX2V4Y2VwdGlvbihFWEVSUk9SKTsKKwl9CisJcmV0dXJuIGRvbmU7Cit9CisKKy8qCisgKiBUaGUgZ2V0b3B0cyBidWlsdGluLiAgU2hlbGxwYXJhbS5vcHRuZXh0IHBvaW50cyB0byB0aGUgbmV4dCBhcmd1bWVudAorICogdG8gYmUgcHJvY2Vzc2VkLiAgU2hlbGxwYXJhbS5vcHRwdHIgcG9pbnRzIHRvIHRoZSBuZXh0IGNoYXJhY3RlciB0bworICogYmUgcHJvY2Vzc2VkIGluIHRoZSBjdXJyZW50IGFyZ3VtZW50LiAgSWYgc2hlbGxwYXJhbS5vcHRuZXh0IGlzIE5VTEwsCisgKiB0aGVuIGl0J3MgdGhlIGZpcnN0IHRpbWUgZ2V0b3B0cyBoYXMgYmVlbiBjYWxsZWQuCisgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DCitnZXRvcHRzY21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICoqb3B0YmFzZTsKKworCWlmIChhcmdjIDwgMykKKwkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoInVzYWdlOiBnZXRvcHRzIG9wdHN0cmluZyB2YXIgW2FyZ10iKTsKKwlpZiAoYXJnYyA9PSAzKSB7CisJCW9wdGJhc2UgPSBzaGVsbHBhcmFtLnA7CisJCWlmIChzaGVsbHBhcmFtLm9wdGluZCA+IHNoZWxscGFyYW0ubnBhcmFtICsgMSkgeworCQkJc2hlbGxwYXJhbS5vcHRpbmQgPSAxOworCQkJc2hlbGxwYXJhbS5vcHRvZmYgPSAtMTsKKwkJfQorCX0gZWxzZSB7CisJCW9wdGJhc2UgPSAmYXJndlszXTsKKwkJaWYgKHNoZWxscGFyYW0ub3B0aW5kID4gYXJnYyAtIDIpIHsKKwkJCXNoZWxscGFyYW0ub3B0aW5kID0gMTsKKwkJCXNoZWxscGFyYW0ub3B0b2ZmID0gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gZ2V0b3B0cyhhcmd2WzFdLCBhcmd2WzJdLCBvcHRiYXNlLCAmc2hlbGxwYXJhbS5vcHRpbmQsCisJCQkmc2hlbGxwYXJhbS5vcHRvZmYpOworfQorI2VuZGlmIC8qIEFTSF9HRVRPUFRTICovCisKKworLyogPT09PT09PT09PT09IFNoZWxsIHBhcnNlciAqLworCitzdHJ1Y3QgaGVyZWRvYyB7CisJc3RydWN0IGhlcmVkb2MgKm5leHQ7ICAgLyogbmV4dCBoZXJlIGRvY3VtZW50IGluIGxpc3QgKi8KKwl1bmlvbiBub2RlICpoZXJlOyAgICAgICAvKiByZWRpcmVjdGlvbiBub2RlICovCisJY2hhciAqZW9mbWFyazsgICAgICAgICAgLyogc3RyaW5nIGluZGljYXRpbmcgZW5kIG9mIGlucHV0ICovCisJc21hbGxpbnQgc3RyaXB0YWJzOyAgICAgLyogaWYgc2V0LCBzdHJpcCBsZWFkaW5nIHRhYnMgKi8KK307CisKK3N0YXRpYyBzbWFsbGludCB0b2twdXNoYmFjazsgICAgICAgICAgIC8qIGxhc3QgdG9rZW4gcHVzaGVkIGJhY2sgKi8KK3N0YXRpYyBzbWFsbGludCBxdW90ZWZsYWc7ICAgICAgICAgICAgIC8qIHNldCBpZiAocGFydCBvZikgbGFzdCB0b2tlbiB3YXMgcXVvdGVkICovCitzdGF0aWMgdG9rZW5faWRfdCBsYXN0dG9rZW47ICAgICAgICAgICAvKiBsYXN0IHRva2VuIHJlYWQgKGludGVnZXIgaWQgVHh4eCkgKi8KK3N0YXRpYyBzdHJ1Y3QgaGVyZWRvYyAqaGVyZWRvY2xpc3Q7ICAgIC8qIGxpc3Qgb2YgaGVyZSBkb2N1bWVudHMgdG8gcmVhZCAqLworc3RhdGljIGNoYXIgKndvcmR0ZXh0OyAgICAgICAgICAgICAgICAgLyogdGV4dCBvZiBsYXN0IHdvcmQgcmV0dXJuZWQgYnkgcmVhZHRva2VuICovCitzdGF0aWMgc3RydWN0IG5vZGVsaXN0ICpiYWNrcXVvdGVsaXN0Oworc3RhdGljIHVuaW9uIG5vZGUgKnJlZGlybm9kZTsKK3N0YXRpYyBzdHJ1Y3QgaGVyZWRvYyAqaGVyZWRvYzsKKworc3RhdGljIGNvbnN0IGNoYXIgKgordG9rbmFtZShjaGFyICpidWYsIGludCB0b2spCit7CisJaWYgKHRvayA8IFRTRU1JKQorCQlyZXR1cm4gdG9rbmFtZV9hcnJheVt0b2tdICsgMTsKKwlzcHJpbnRmKGJ1ZiwgIlwiJXNcIiIsIHRva25hbWVfYXJyYXlbdG9rXSArIDEpOworCXJldHVybiBidWY7Cit9CisKKy8qIHJhaXNlX2Vycm9yX3VuZXhwZWN0ZWRfc3ludGF4OgorICogQ2FsbGVkIHdoZW4gYW4gdW5leHBlY3RlZCB0b2tlbiBpcyByZWFkIGR1cmluZyB0aGUgcGFyc2UuICBUaGUgYXJndW1lbnQKKyAqIGlzIHRoZSB0b2tlbiB0aGF0IGlzIGV4cGVjdGVkLCBvciAtMSBpZiBtb3JlIHRoYW4gb25lIHR5cGUgb2YgdG9rZW4gY2FuCisgKiBvY2N1ciBhdCB0aGlzIHBvaW50LgorICovCitzdGF0aWMgdm9pZCByYWlzZV9lcnJvcl91bmV4cGVjdGVkX3N5bnRheChpbnQpIE5PUkVUVVJOOworc3RhdGljIHZvaWQKK3JhaXNlX2Vycm9yX3VuZXhwZWN0ZWRfc3ludGF4KGludCB0b2tlbikKK3sKKwljaGFyIG1zZ1s2NF07CisJY2hhciBidWZbMTZdOworCWludCBsOworCisJbCA9IHNwcmludGYobXNnLCAidW5leHBlY3RlZCAlcyIsIHRva25hbWUoYnVmLCBsYXN0dG9rZW4pKTsKKwlpZiAodG9rZW4gPj0gMCkKKwkJc3ByaW50Zihtc2cgKyBsLCAiIChleHBlY3RpbmcgJXMpIiwgdG9rbmFtZShidWYsIHRva2VuKSk7CisJcmFpc2VfZXJyb3Jfc3ludGF4KG1zZyk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisjZGVmaW5lIEVPRk1BUktMRU4gNzkKKworLyogcGFyc2luZyBpcyBoZWF2aWx5IGNyb3NzLXJlY3Vyc2l2ZSwgbmVlZCB0aGVzZSBmb3J3YXJkIGRlY2xzICovCitzdGF0aWMgdW5pb24gbm9kZSAqYW5kb3Iodm9pZCk7CitzdGF0aWMgdW5pb24gbm9kZSAqcGlwZWxpbmUodm9pZCk7CitzdGF0aWMgdW5pb24gbm9kZSAqcGFyc2VfY29tbWFuZCh2b2lkKTsKK3N0YXRpYyB2b2lkIHBhcnNlaGVyZWRvYyh2b2lkKTsKK3N0YXRpYyBjaGFyIG5leHR0b2tlbl9lbmRzX2xpc3Qodm9pZCk7CitzdGF0aWMgaW50IHJlYWR0b2tlbih2b2lkKTsKKworc3RhdGljIHVuaW9uIG5vZGUgKgorbGlzdChpbnQgbmxmbGFnKQoreworCXVuaW9uIG5vZGUgKm4xLCAqbjIsICpuMzsKKwlpbnQgdG9rOworCisJY2hlY2trd2QgPSBDSEtOTCB8IENIS0tXRCB8IENIS0FMSUFTOworCWlmIChubGZsYWcgPT0gMiAmJiBuZXh0dG9rZW5fZW5kc19saXN0KCkpCisJCXJldHVybiBOVUxMOworCW4xID0gTlVMTDsKKwlmb3IgKDs7KSB7CisJCW4yID0gYW5kb3IoKTsKKwkJdG9rID0gcmVhZHRva2VuKCk7CisJCWlmICh0b2sgPT0gVEJBQ0tHTkQpIHsKKwkJCWlmIChuMi0+dHlwZSA9PSBOUElQRSkgeworCQkJCW4yLT5ucGlwZS5waXBlX2JhY2tnbmQgPSAxOworCQkJfSBlbHNlIHsKKwkJCQlpZiAobjItPnR5cGUgIT0gTlJFRElSKSB7CisJCQkJCW4zID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBucmVkaXIpKTsKKwkJCQkJbjMtPm5yZWRpci5uID0gbjI7CisJCQkJCS8qbjMtPm5yZWRpci5yZWRpcmVjdCA9IE5VTEw7IC0gc3R6YWxsb2MgZGlkIGl0ICovCisJCQkJCW4yID0gbjM7CisJCQkJfQorCQkJCW4yLT50eXBlID0gTkJBQ0tHTkQ7CisJCQl9CisJCX0KKwkJaWYgKG4xID09IE5VTEwpIHsKKwkJCW4xID0gbjI7CisJCX0gZWxzZSB7CisJCQluMyA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbmJpbmFyeSkpOworCQkJbjMtPnR5cGUgPSBOU0VNSTsKKwkJCW4zLT5uYmluYXJ5LmNoMSA9IG4xOworCQkJbjMtPm5iaW5hcnkuY2gyID0gbjI7CisJCQluMSA9IG4zOworCQl9CisJCXN3aXRjaCAodG9rKSB7CisJCWNhc2UgVEJBQ0tHTkQ6CisJCWNhc2UgVFNFTUk6CisJCQl0b2sgPSByZWFkdG9rZW4oKTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIFROTDoKKwkJCWlmICh0b2sgPT0gVE5MKSB7CisJCQkJcGFyc2VoZXJlZG9jKCk7CisJCQkJaWYgKG5sZmxhZyA9PSAxKQorCQkJCQlyZXR1cm4gbjE7CisJCQl9IGVsc2UgeworCQkJCXRva3B1c2hiYWNrID0gMTsKKwkJCX0KKwkJCWNoZWNra3dkID0gQ0hLTkwgfCBDSEtLV0QgfCBDSEtBTElBUzsKKwkJCWlmIChuZXh0dG9rZW5fZW5kc19saXN0KCkpIHsKKwkJCQkvKiBUZXN0Y2FzZTogIjw8RU9GOyB0aGVuIDxXIi4KKwkJCQkgKiBJdCB1c2VkIHRvIHNlZ2ZhdWx0IHcvbyB0aGlzIGNoZWNrOgorCQkJCSAqLworCQkJCWlmIChoZXJlZG9jbGlzdCkgeworCQkJCQlyYWlzZV9lcnJvcl91bmV4cGVjdGVkX3N5bnRheCgtMSk7CisJCQkJfQorCQkJCXJldHVybiBuMTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRFT0Y6CisJCQlpZiAoaGVyZWRvY2xpc3QpCisJCQkJcGFyc2VoZXJlZG9jKCk7CisJCQllbHNlCisJCQkJcHVuZ2V0YygpOyAgICAgICAgICAgICAgLyogcHVzaCBiYWNrIEVPRiBvbiBpbnB1dCAqLworCQkJcmV0dXJuIG4xOworCQlkZWZhdWx0OgorCQkJaWYgKG5sZmxhZyA9PSAxKQorCQkJCXJhaXNlX2Vycm9yX3VuZXhwZWN0ZWRfc3ludGF4KC0xKTsKKwkJCXRva3B1c2hiYWNrID0gMTsKKwkJCXJldHVybiBuMTsKKwkJfQorCX0KK30KKworc3RhdGljIHVuaW9uIG5vZGUgKgorYW5kb3Iodm9pZCkKK3sKKwl1bmlvbiBub2RlICpuMSwgKm4yLCAqbjM7CisJaW50IHQ7CisKKwluMSA9IHBpcGVsaW5lKCk7CisJZm9yICg7OykgeworCQl0ID0gcmVhZHRva2VuKCk7CisJCWlmICh0ID09IFRBTkQpIHsKKwkJCXQgPSBOQU5EOworCQl9IGVsc2UgaWYgKHQgPT0gVE9SKSB7CisJCQl0ID0gTk9SOworCQl9IGVsc2UgeworCQkJdG9rcHVzaGJhY2sgPSAxOworCQkJcmV0dXJuIG4xOworCQl9CisJCWNoZWNra3dkID0gQ0hLTkwgfCBDSEtLV0QgfCBDSEtBTElBUzsKKwkJbjIgPSBwaXBlbGluZSgpOworCQluMyA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbmJpbmFyeSkpOworCQluMy0+dHlwZSA9IHQ7CisJCW4zLT5uYmluYXJ5LmNoMSA9IG4xOworCQluMy0+bmJpbmFyeS5jaDIgPSBuMjsKKwkJbjEgPSBuMzsKKwl9Cit9CisKK3N0YXRpYyB1bmlvbiBub2RlICoKK3BpcGVsaW5lKHZvaWQpCit7CisJdW5pb24gbm9kZSAqbjEsICpuMiwgKnBpcGVub2RlOworCXN0cnVjdCBub2RlbGlzdCAqbHAsICpwcmV2OworCWludCBuZWdhdGU7CisKKwluZWdhdGUgPSAwOworCVRSQUNFKCgicGlwZWxpbmU6IGVudGVyZWRcbiIpKTsKKwlpZiAocmVhZHRva2VuKCkgPT0gVE5PVCkgeworCQluZWdhdGUgPSAhbmVnYXRlOworCQljaGVja2t3ZCA9IENIS0tXRCB8IENIS0FMSUFTOworCX0gZWxzZQorCQl0b2twdXNoYmFjayA9IDE7CisJbjEgPSBwYXJzZV9jb21tYW5kKCk7CisJaWYgKHJlYWR0b2tlbigpID09IFRQSVBFKSB7CisJCXBpcGVub2RlID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBucGlwZSkpOworCQlwaXBlbm9kZS0+dHlwZSA9IE5QSVBFOworCQkvKnBpcGVub2RlLT5ucGlwZS5waXBlX2JhY2tnbmQgPSAwOyAtIHN0emFsbG9jIGRpZCBpdCAqLworCQlscCA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3Qgbm9kZWxpc3QpKTsKKwkJcGlwZW5vZGUtPm5waXBlLmNtZGxpc3QgPSBscDsKKwkJbHAtPm4gPSBuMTsKKwkJZG8geworCQkJcHJldiA9IGxwOworCQkJbHAgPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IG5vZGVsaXN0KSk7CisJCQljaGVja2t3ZCA9IENIS05MIHwgQ0hLS1dEIHwgQ0hLQUxJQVM7CisJCQlscC0+biA9IHBhcnNlX2NvbW1hbmQoKTsKKwkJCXByZXYtPm5leHQgPSBscDsKKwkJfSB3aGlsZSAocmVhZHRva2VuKCkgPT0gVFBJUEUpOworCQlscC0+bmV4dCA9IE5VTEw7CisJCW4xID0gcGlwZW5vZGU7CisJfQorCXRva3B1c2hiYWNrID0gMTsKKwlpZiAobmVnYXRlKSB7CisJCW4yID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBubm90KSk7CisJCW4yLT50eXBlID0gTk5PVDsKKwkJbjItPm5ub3QuY29tID0gbjE7CisJCXJldHVybiBuMjsKKwl9CisJcmV0dXJuIG4xOworfQorCitzdGF0aWMgdW5pb24gbm9kZSAqCittYWtlbmFtZSh2b2lkKQoreworCXVuaW9uIG5vZGUgKm47CisKKwluID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuYXJnKSk7CisJbi0+dHlwZSA9IE5BUkc7CisJLypuLT5uYXJnLm5leHQgPSBOVUxMOyAtIHN0emFsbG9jIGRpZCBpdCAqLworCW4tPm5hcmcudGV4dCA9IHdvcmR0ZXh0OworCW4tPm5hcmcuYmFja3F1b3RlID0gYmFja3F1b3RlbGlzdDsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHZvaWQKK2ZpeHJlZGlyKHVuaW9uIG5vZGUgKm4sIGNvbnN0IGNoYXIgKnRleHQsIGludCBlcnIpCit7CisJaW50IGZkOworCisJVFJBQ0UoKCJGaXggcmVkaXIgJXMgJWRcbiIsIHRleHQsIGVycikpOworCWlmICghZXJyKQorCQluLT5uZHVwLnZuYW1lID0gTlVMTDsKKworCWZkID0gYmJfc3RydG91KHRleHQsIE5VTEwsIDEwKTsKKwlpZiAoIWVycm5vICYmIGZkID49IDApCisJCW4tPm5kdXAuZHVwZmQgPSBmZDsKKwllbHNlIGlmIChMT05FX0RBU0godGV4dCkpCisJCW4tPm5kdXAuZHVwZmQgPSAtMTsKKwllbHNlIHsKKwkJaWYgKGVycikKKwkJCXJhaXNlX2Vycm9yX3N5bnRheCgiYmFkIGZkIG51bWJlciIpOworCQluLT5uZHVwLnZuYW1lID0gbWFrZW5hbWUoKTsKKwl9Cit9CisKKy8qCisgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRleHQgY29udGFpbnMgbm90aGluZyB0byBleHBhbmQgKG5vIGRvbGxhciBzaWducworICogb3IgYmFja3F1b3RlcykuCisgKi8KK3N0YXRpYyBpbnQKK25vZXhwYW5kKGNvbnN0IGNoYXIgKnRleHQpCit7CisJdW5zaWduZWQgY2hhciBjOworCisJd2hpbGUgKChjID0gKnRleHQrKykgIT0gJ1wwJykgeworCQlpZiAoYyA9PSBDVExRVU9URU1BUkspCisJCQljb250aW51ZTsKKwkJaWYgKGMgPT0gQ1RMRVNDKQorCQkJdGV4dCsrOworCQllbHNlIGlmIChTSVQoYywgQkFTRVNZTlRBWCkgPT0gQ0NUTCkKKwkJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3BhcnNlZm5hbWUodm9pZCkKK3sKKwl1bmlvbiBub2RlICpuID0gcmVkaXJub2RlOworCisJaWYgKHJlYWR0b2tlbigpICE9IFRXT1JEKQorCQlyYWlzZV9lcnJvcl91bmV4cGVjdGVkX3N5bnRheCgtMSk7CisJaWYgKG4tPnR5cGUgPT0gTkhFUkUpIHsKKwkJc3RydWN0IGhlcmVkb2MgKmhlcmUgPSBoZXJlZG9jOworCQlzdHJ1Y3QgaGVyZWRvYyAqcDsKKwkJaW50IGk7CisKKwkJaWYgKHF1b3RlZmxhZyA9PSAwKQorCQkJbi0+dHlwZSA9IE5YSEVSRTsKKwkJVFJBQ0UoKCJIZXJlIGRvY3VtZW50ICVkXG4iLCBuLT50eXBlKSk7CisJCWlmICghbm9leHBhbmQod29yZHRleHQpIHx8IChpID0gc3RybGVuKHdvcmR0ZXh0KSkgPT0gMCB8fCBpID4gRU9GTUFSS0xFTikKKwkJCXJhaXNlX2Vycm9yX3N5bnRheCgiaWxsZWdhbCBlb2YgbWFya2VyIGZvciA8PCByZWRpcmVjdGlvbiIpOworCQlybWVzY2FwZXMod29yZHRleHQsIDApOworCQloZXJlLT5lb2ZtYXJrID0gd29yZHRleHQ7CisJCWhlcmUtPm5leHQgPSBOVUxMOworCQlpZiAoaGVyZWRvY2xpc3QgPT0gTlVMTCkKKwkJCWhlcmVkb2NsaXN0ID0gaGVyZTsKKwkJZWxzZSB7CisJCQlmb3IgKHAgPSBoZXJlZG9jbGlzdDsgcC0+bmV4dDsgcCA9IHAtPm5leHQpCisJCQkJY29udGludWU7CisJCQlwLT5uZXh0ID0gaGVyZTsKKwkJfQorCX0gZWxzZSBpZiAobi0+dHlwZSA9PSBOVE9GRCB8fCBuLT50eXBlID09IE5GUk9NRkQpIHsKKwkJZml4cmVkaXIobiwgd29yZHRleHQsIDApOworCX0gZWxzZSB7CisJCW4tPm5maWxlLmZuYW1lID0gbWFrZW5hbWUoKTsKKwl9Cit9CisKK3N0YXRpYyB1bmlvbiBub2RlICoKK3NpbXBsZWNtZCh2b2lkKQoreworCXVuaW9uIG5vZGUgKmFyZ3MsICoqYXBwOworCXVuaW9uIG5vZGUgKm4gPSBOVUxMOworCXVuaW9uIG5vZGUgKnZhcnMsICoqdnBwOworCXVuaW9uIG5vZGUgKipycHAsICpyZWRpcjsKKwlpbnQgc2F2ZWNoZWNra3dkOworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwlzbWFsbGludCBkb3VibGVfYnJhY2tldHNfZmxhZyA9IDA7CisjZW5kaWYKKworCWFyZ3MgPSBOVUxMOworCWFwcCA9ICZhcmdzOworCXZhcnMgPSBOVUxMOworCXZwcCA9ICZ2YXJzOworCXJlZGlyID0gTlVMTDsKKwlycHAgPSAmcmVkaXI7CisKKwlzYXZlY2hlY2trd2QgPSBDSEtBTElBUzsKKwlmb3IgKDs7KSB7CisJCWludCB0OworCQljaGVja2t3ZCA9IHNhdmVjaGVja2t3ZDsKKwkJdCA9IHJlYWR0b2tlbigpOworCQlzd2l0Y2ggKHQpIHsKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJCWNhc2UgVEFORDogLyogIiYmIiAqLworCQljYXNlIFRPUjogLyogInx8IiAqLworCQkJaWYgKCFkb3VibGVfYnJhY2tldHNfZmxhZykgeworCQkJCXRva3B1c2hiYWNrID0gMTsKKwkJCQlnb3RvIG91dDsKKwkJCX0KKwkJCXdvcmR0ZXh0ID0gKGNoYXIgKikgKHQgPT0gVEFORCA/ICItYSIgOiAiLW8iKTsKKyNlbmRpZgorCQljYXNlIFRXT1JEOgorCQkJbiA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbmFyZykpOworCQkJbi0+dHlwZSA9IE5BUkc7CisJCQkvKm4tPm5hcmcubmV4dCA9IE5VTEw7IC0gc3R6YWxsb2MgZGlkIGl0ICovCisJCQluLT5uYXJnLnRleHQgPSB3b3JkdGV4dDsKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJCQlpZiAoc3RyY21wKCJbWyIsIHdvcmR0ZXh0KSA9PSAwKQorCQkJCWRvdWJsZV9icmFja2V0c19mbGFnID0gMTsKKwkJCWVsc2UgaWYgKHN0cmNtcCgiXV0iLCB3b3JkdGV4dCkgPT0gMCkKKwkJCQlkb3VibGVfYnJhY2tldHNfZmxhZyA9IDA7CisjZW5kaWYKKwkJCW4tPm5hcmcuYmFja3F1b3RlID0gYmFja3F1b3RlbGlzdDsKKwkJCWlmIChzYXZlY2hlY2trd2QgJiYgaXNhc3NpZ25tZW50KHdvcmR0ZXh0KSkgeworCQkJCSp2cHAgPSBuOworCQkJCXZwcCA9ICZuLT5uYXJnLm5leHQ7CisJCQl9IGVsc2UgeworCQkJCSphcHAgPSBuOworCQkJCWFwcCA9ICZuLT5uYXJnLm5leHQ7CisJCQkJc2F2ZWNoZWNra3dkID0gMDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFRSRURJUjoKKwkJCSpycHAgPSBuID0gcmVkaXJub2RlOworCQkJcnBwID0gJm4tPm5maWxlLm5leHQ7CisJCQlwYXJzZWZuYW1lKCk7ICAgLyogcmVhZCBuYW1lIG9mIHJlZGlyZWN0aW9uIGZpbGUgKi8KKwkJCWJyZWFrOworCQljYXNlIFRMUDoKKwkJCWlmIChhcmdzICYmIGFwcCA9PSAmYXJncy0+bmFyZy5uZXh0CisJCQkgJiYgIXZhcnMgJiYgIXJlZGlyCisJCQkpIHsKKwkJCQlzdHJ1Y3QgYnVpbHRpbmNtZCAqYmNtZDsKKwkJCQljb25zdCBjaGFyICpuYW1lOworCisJCQkJLyogV2UgaGF2ZSBhIGZ1bmN0aW9uICovCisJCQkJaWYgKHJlYWR0b2tlbigpICE9IFRSUCkKKwkJCQkJcmFpc2VfZXJyb3JfdW5leHBlY3RlZF9zeW50YXgoVFJQKTsKKwkJCQluYW1lID0gbi0+bmFyZy50ZXh0OworCQkJCWlmICghZ29vZG5hbWUobmFtZSkKKwkJCQkgfHwgKChiY21kID0gZmluZF9idWlsdGluKG5hbWUpKSAmJiBJU19CVUlMVElOX1NQRUNJQUwoYmNtZCkpCisJCQkJKSB7CisJCQkJCXJhaXNlX2Vycm9yX3N5bnRheCgiYmFkIGZ1bmN0aW9uIG5hbWUiKTsKKwkJCQl9CisJCQkJbi0+dHlwZSA9IE5ERUZVTjsKKwkJCQljaGVja2t3ZCA9IENIS05MIHwgQ0hLS1dEIHwgQ0hLQUxJQVM7CisJCQkJbi0+bmFyZy5uZXh0ID0gcGFyc2VfY29tbWFuZCgpOworCQkJCXJldHVybiBuOworCQkJfQorCQkJLyogZmFsbCB0aHJvdWdoICovCisJCWRlZmF1bHQ6CisJCQl0b2twdXNoYmFjayA9IDE7CisJCQlnb3RvIG91dDsKKwkJfQorCX0KKyBvdXQ6CisJKmFwcCA9IE5VTEw7CisJKnZwcCA9IE5VTEw7CisJKnJwcCA9IE5VTEw7CisJbiA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbmNtZCkpOworCW4tPnR5cGUgPSBOQ01EOworCW4tPm5jbWQuYXJncyA9IGFyZ3M7CisJbi0+bmNtZC5hc3NpZ24gPSB2YXJzOworCW4tPm5jbWQucmVkaXJlY3QgPSByZWRpcjsKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIHVuaW9uIG5vZGUgKgorcGFyc2VfY29tbWFuZCh2b2lkKQoreworCXVuaW9uIG5vZGUgKm4xLCAqbjI7CisJdW5pb24gbm9kZSAqYXAsICoqYXBwOworCXVuaW9uIG5vZGUgKmNwLCAqKmNwcDsKKwl1bmlvbiBub2RlICpyZWRpciwgKipycHA7CisJdW5pb24gbm9kZSAqKnJwcDI7CisJaW50IHQ7CisKKwlyZWRpciA9IE5VTEw7CisJcnBwMiA9ICZyZWRpcjsKKworCXN3aXRjaCAocmVhZHRva2VuKCkpIHsKKwlkZWZhdWx0OgorCQlyYWlzZV9lcnJvcl91bmV4cGVjdGVkX3N5bnRheCgtMSk7CisJCS8qIE5PVFJFQUNIRUQgKi8KKwljYXNlIFRJRjoKKwkJbjEgPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IG5pZikpOworCQluMS0+dHlwZSA9IE5JRjsKKwkJbjEtPm5pZi50ZXN0ID0gbGlzdCgwKTsKKwkJaWYgKHJlYWR0b2tlbigpICE9IFRUSEVOKQorCQkJcmFpc2VfZXJyb3JfdW5leHBlY3RlZF9zeW50YXgoVFRIRU4pOworCQluMS0+bmlmLmlmcGFydCA9IGxpc3QoMCk7CisJCW4yID0gbjE7CisJCXdoaWxlIChyZWFkdG9rZW4oKSA9PSBURUxJRikgeworCQkJbjItPm5pZi5lbHNlcGFydCA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbmlmKSk7CisJCQluMiA9IG4yLT5uaWYuZWxzZXBhcnQ7CisJCQluMi0+dHlwZSA9IE5JRjsKKwkJCW4yLT5uaWYudGVzdCA9IGxpc3QoMCk7CisJCQlpZiAocmVhZHRva2VuKCkgIT0gVFRIRU4pCisJCQkJcmFpc2VfZXJyb3JfdW5leHBlY3RlZF9zeW50YXgoVFRIRU4pOworCQkJbjItPm5pZi5pZnBhcnQgPSBsaXN0KDApOworCQl9CisJCWlmIChsYXN0dG9rZW4gPT0gVEVMU0UpCisJCQluMi0+bmlmLmVsc2VwYXJ0ID0gbGlzdCgwKTsKKwkJZWxzZSB7CisJCQluMi0+bmlmLmVsc2VwYXJ0ID0gTlVMTDsKKwkJCXRva3B1c2hiYWNrID0gMTsKKwkJfQorCQl0ID0gVEZJOworCQlicmVhazsKKwljYXNlIFRXSElMRToKKwljYXNlIFRVTlRJTDogeworCQlpbnQgZ290OworCQluMSA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbmJpbmFyeSkpOworCQluMS0+dHlwZSA9IChsYXN0dG9rZW4gPT0gVFdISUxFKSA/IE5XSElMRSA6IE5VTlRJTDsKKwkJbjEtPm5iaW5hcnkuY2gxID0gbGlzdCgwKTsKKwkJZ290ID0gcmVhZHRva2VuKCk7CisJCWlmIChnb3QgIT0gVERPKSB7CisJCQlUUkFDRSgoImV4cGVjdGluZyBETyBnb3QgJyVzJyAlc1xuIiwgdG9rbmFtZV9hcnJheVtnb3RdICsgMSwKKwkJCQkJZ290ID09IFRXT1JEID8gd29yZHRleHQgOiAiIikpOworCQkJcmFpc2VfZXJyb3JfdW5leHBlY3RlZF9zeW50YXgoVERPKTsKKwkJfQorCQluMS0+bmJpbmFyeS5jaDIgPSBsaXN0KDApOworCQl0ID0gVERPTkU7CisJCWJyZWFrOworCX0KKwljYXNlIFRGT1I6CisJCWlmIChyZWFkdG9rZW4oKSAhPSBUV09SRCB8fCBxdW90ZWZsYWcgfHwgIWdvb2RuYW1lKHdvcmR0ZXh0KSkKKwkJCXJhaXNlX2Vycm9yX3N5bnRheCgiYmFkIGZvciBsb29wIHZhcmlhYmxlIik7CisJCW4xID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuZm9yKSk7CisJCW4xLT50eXBlID0gTkZPUjsKKwkJbjEtPm5mb3IudmFyID0gd29yZHRleHQ7CisJCWNoZWNra3dkID0gQ0hLS1dEIHwgQ0hLQUxJQVM7CisJCWlmIChyZWFkdG9rZW4oKSA9PSBUSU4pIHsKKwkJCWFwcCA9ICZhcDsKKwkJCXdoaWxlIChyZWFkdG9rZW4oKSA9PSBUV09SRCkgeworCQkJCW4yID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuYXJnKSk7CisJCQkJbjItPnR5cGUgPSBOQVJHOworCQkJCS8qbjItPm5hcmcubmV4dCA9IE5VTEw7IC0gc3R6YWxsb2MgZGlkIGl0ICovCisJCQkJbjItPm5hcmcudGV4dCA9IHdvcmR0ZXh0OworCQkJCW4yLT5uYXJnLmJhY2txdW90ZSA9IGJhY2txdW90ZWxpc3Q7CisJCQkJKmFwcCA9IG4yOworCQkJCWFwcCA9ICZuMi0+bmFyZy5uZXh0OworCQkJfQorCQkJKmFwcCA9IE5VTEw7CisJCQluMS0+bmZvci5hcmdzID0gYXA7CisJCQlpZiAobGFzdHRva2VuICE9IFROTCAmJiBsYXN0dG9rZW4gIT0gVFNFTUkpCisJCQkJcmFpc2VfZXJyb3JfdW5leHBlY3RlZF9zeW50YXgoLTEpOworCQl9IGVsc2UgeworCQkJbjIgPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IG5hcmcpKTsKKwkJCW4yLT50eXBlID0gTkFSRzsKKwkJCS8qbjItPm5hcmcubmV4dCA9IE5VTEw7IC0gc3R6YWxsb2MgZGlkIGl0ICovCisJCQluMi0+bmFyZy50ZXh0ID0gKGNoYXIgKilkb2xhdHN0cjsKKwkJCS8qbjItPm5hcmcuYmFja3F1b3RlID0gTlVMTDsqLworCQkJbjEtPm5mb3IuYXJncyA9IG4yOworCQkJLyoKKwkJCSAqIE5ld2xpbmUgb3Igc2VtaWNvbG9uIGhlcmUgaXMgb3B0aW9uYWwgKGJ1dCBub3RlCisJCQkgKiB0aGF0IHRoZSBvcmlnaW5hbCBCb3VybmUgc2hlbGwgb25seSBhbGxvd2VkIE5MKS4KKwkJCSAqLworCQkJaWYgKGxhc3R0b2tlbiAhPSBUTkwgJiYgbGFzdHRva2VuICE9IFRTRU1JKQorCQkJCXRva3B1c2hiYWNrID0gMTsKKwkJfQorCQljaGVja2t3ZCA9IENIS05MIHwgQ0hLS1dEIHwgQ0hLQUxJQVM7CisJCWlmIChyZWFkdG9rZW4oKSAhPSBURE8pCisJCQlyYWlzZV9lcnJvcl91bmV4cGVjdGVkX3N5bnRheChURE8pOworCQluMS0+bmZvci5ib2R5ID0gbGlzdCgwKTsKKwkJdCA9IFRET05FOworCQlicmVhazsKKwljYXNlIFRDQVNFOgorCQluMSA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbmNhc2UpKTsKKwkJbjEtPnR5cGUgPSBOQ0FTRTsKKwkJaWYgKHJlYWR0b2tlbigpICE9IFRXT1JEKQorCQkJcmFpc2VfZXJyb3JfdW5leHBlY3RlZF9zeW50YXgoVFdPUkQpOworCQluMS0+bmNhc2UuZXhwciA9IG4yID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuYXJnKSk7CisJCW4yLT50eXBlID0gTkFSRzsKKwkJLypuMi0+bmFyZy5uZXh0ID0gTlVMTDsgLSBzdHphbGxvYyBkaWQgaXQgKi8KKwkJbjItPm5hcmcudGV4dCA9IHdvcmR0ZXh0OworCQluMi0+bmFyZy5iYWNrcXVvdGUgPSBiYWNrcXVvdGVsaXN0OworCQlkbyB7CisJCQljaGVja2t3ZCA9IENIS0tXRCB8IENIS0FMSUFTOworCQl9IHdoaWxlIChyZWFkdG9rZW4oKSA9PSBUTkwpOworCQlpZiAobGFzdHRva2VuICE9IFRJTikKKwkJCXJhaXNlX2Vycm9yX3VuZXhwZWN0ZWRfc3ludGF4KFRJTik7CisJCWNwcCA9ICZuMS0+bmNhc2UuY2FzZXM7CisgbmV4dF9jYXNlOgorCQljaGVja2t3ZCA9IENIS05MIHwgQ0hLS1dEOworCQl0ID0gcmVhZHRva2VuKCk7CisJCXdoaWxlICh0ICE9IFRFU0FDKSB7CisJCQlpZiAobGFzdHRva2VuID09IFRMUCkKKwkJCQlyZWFkdG9rZW4oKTsKKwkJCSpjcHAgPSBjcCA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbmNsaXN0KSk7CisJCQljcC0+dHlwZSA9IE5DTElTVDsKKwkJCWFwcCA9ICZjcC0+bmNsaXN0LnBhdHRlcm47CisJCQlmb3IgKDs7KSB7CisJCQkJKmFwcCA9IGFwID0gc3R6YWxsb2Moc2l6ZW9mKHN0cnVjdCBuYXJnKSk7CisJCQkJYXAtPnR5cGUgPSBOQVJHOworCQkJCS8qYXAtPm5hcmcubmV4dCA9IE5VTEw7IC0gc3R6YWxsb2MgZGlkIGl0ICovCisJCQkJYXAtPm5hcmcudGV4dCA9IHdvcmR0ZXh0OworCQkJCWFwLT5uYXJnLmJhY2txdW90ZSA9IGJhY2txdW90ZWxpc3Q7CisJCQkJaWYgKHJlYWR0b2tlbigpICE9IFRQSVBFKQorCQkJCQlicmVhazsKKwkJCQlhcHAgPSAmYXAtPm5hcmcubmV4dDsKKwkJCQlyZWFkdG9rZW4oKTsKKwkJCX0KKwkJCS8vYXAtPm5hcmcubmV4dCA9IE5VTEw7CisJCQlpZiAobGFzdHRva2VuICE9IFRSUCkKKwkJCQlyYWlzZV9lcnJvcl91bmV4cGVjdGVkX3N5bnRheChUUlApOworCQkJY3AtPm5jbGlzdC5ib2R5ID0gbGlzdCgyKTsKKworCQkJY3BwID0gJmNwLT5uY2xpc3QubmV4dDsKKworCQkJY2hlY2trd2QgPSBDSEtOTCB8IENIS0tXRDsKKwkJCXQgPSByZWFkdG9rZW4oKTsKKwkJCWlmICh0ICE9IFRFU0FDKSB7CisJCQkJaWYgKHQgIT0gVEVORENBU0UpCisJCQkJCXJhaXNlX2Vycm9yX3VuZXhwZWN0ZWRfc3ludGF4KFRFTkRDQVNFKTsKKwkJCQlnb3RvIG5leHRfY2FzZTsKKwkJCX0KKwkJfQorCQkqY3BwID0gTlVMTDsKKwkJZ290byByZWRpcjsKKwljYXNlIFRMUDoKKwkJbjEgPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IG5yZWRpcikpOworCQluMS0+dHlwZSA9IE5TVUJTSEVMTDsKKwkJbjEtPm5yZWRpci5uID0gbGlzdCgwKTsKKwkJLypuMS0+bnJlZGlyLnJlZGlyZWN0ID0gTlVMTDsgLSBzdHphbGxvYyBkaWQgaXQgKi8KKwkJdCA9IFRSUDsKKwkJYnJlYWs7CisJY2FzZSBUQkVHSU46CisJCW4xID0gbGlzdCgwKTsKKwkJdCA9IFRFTkQ7CisJCWJyZWFrOworCWNhc2UgVFdPUkQ6CisJY2FzZSBUUkVESVI6CisJCXRva3B1c2hiYWNrID0gMTsKKwkJcmV0dXJuIHNpbXBsZWNtZCgpOworCX0KKworCWlmIChyZWFkdG9rZW4oKSAhPSB0KQorCQlyYWlzZV9lcnJvcl91bmV4cGVjdGVkX3N5bnRheCh0KTsKKworIHJlZGlyOgorCS8qIE5vdyBjaGVjayBmb3IgcmVkaXJlY3Rpb24gd2hpY2ggbWF5IGZvbGxvdyBjb21tYW5kICovCisJY2hlY2trd2QgPSBDSEtLV0QgfCBDSEtBTElBUzsKKwlycHAgPSBycHAyOworCXdoaWxlIChyZWFkdG9rZW4oKSA9PSBUUkVESVIpIHsKKwkJKnJwcCA9IG4yID0gcmVkaXJub2RlOworCQlycHAgPSAmbjItPm5maWxlLm5leHQ7CisJCXBhcnNlZm5hbWUoKTsKKwl9CisJdG9rcHVzaGJhY2sgPSAxOworCSpycHAgPSBOVUxMOworCWlmIChyZWRpcikgeworCQlpZiAobjEtPnR5cGUgIT0gTlNVQlNIRUxMKSB7CisJCQluMiA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbnJlZGlyKSk7CisJCQluMi0+dHlwZSA9IE5SRURJUjsKKwkJCW4yLT5ucmVkaXIubiA9IG4xOworCQkJbjEgPSBuMjsKKwkJfQorCQluMS0+bnJlZGlyLnJlZGlyZWN0ID0gcmVkaXI7CisJfQorCXJldHVybiBuMTsKK30KKworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKK3N0YXRpYyBpbnQgZGVjb2RlX2RvbGxhcl9zcXVvdGUodm9pZCkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciBDX2VzY2FwZXNbXSBBTElHTjEgPSAibnJidGZhdiIieFxcMDEyMzQ1NjciOworCWludCBjLCBjbnQ7CisJY2hhciAqcDsKKwljaGFyIGJ1Zls0XTsKKworCWMgPSBwZ2V0YygpOworCXAgPSBzdHJjaHIoQ19lc2NhcGVzLCBjKTsKKwlpZiAocCkgeworCQlidWZbMF0gPSBjOworCQlwID0gYnVmOworCQljbnQgPSAzOworCQlpZiAoKHVuc2lnbmVkIGNoYXIpKGMgLSAnMCcpIDw9IDcpIHsgLyogXG9vbyAqLworCQkJZG8geworCQkJCWMgPSBwZ2V0YygpOworCQkJCSorK3AgPSBjOworCQkJfSB3aGlsZSAoKHVuc2lnbmVkIGNoYXIpKGMgLSAnMCcpIDw9IDcgJiYgLS1jbnQpOworCQkJcHVuZ2V0YygpOworCQl9IGVsc2UgaWYgKGMgPT0gJ3gnKSB7IC8qIFx4SEggKi8KKwkJCWRvIHsKKwkJCQljID0gcGdldGMoKTsKKwkJCQkqKytwID0gYzsKKwkJCX0gd2hpbGUgKGlzeGRpZ2l0KGMpICYmIC0tY250KTsKKwkJCXB1bmdldGMoKTsKKwkJCWlmIChjbnQgPT0gMykgeyAvKiBceCBidXQgbmV4dCBjaGFyIGlzICJiYWQiICovCisJCQkJYyA9ICd4JzsKKwkJCQlnb3RvIHVucmVjb2duaXplZDsKKwkJCX0KKwkJfSBlbHNlIHsgLyogc2ltcGxlIHNlcSBsaWtlIFxcIG9yIFx0ICovCisJCQlwKys7CisJCX0KKwkJKnAgPSAnXDAnOworCQlwID0gYnVmOworCQljID0gYmJfcHJvY2Vzc19lc2NhcGVfc2VxdWVuY2UoKHZvaWQqKSZwKTsKKwl9IGVsc2UgeyAvKiB1bnJlY29nbml6ZWQgIlx6IjogcHJpbnQgYm90aCBjaGFycyB1bmxlc3MgJyBvciAiICovCisJCWlmIChjICE9ICdcJycgJiYgYyAhPSAnIicpIHsKKyB1bnJlY29nbml6ZWQ6CisJCQljIHw9IDB4MTAwOyAvKiAicGxlYXNlIGVuY29kZSBcLCB0aGVuIG1lIiAqLworCQl9CisJfQorCXJldHVybiBjOworfQorI2VuZGlmCisKKy8qCisgKiBJZiBlb2ZtYXJrIGlzIE5VTEwsIHJlYWQgYSB3b3JkIG9yIGEgcmVkaXJlY3Rpb24gc3ltYm9sLiAgSWYgZW9mbWFyaworICogaXMgbm90IE5VTEwsIHJlYWQgYSBoZXJlIGRvY3VtZW50LiAgSW4gdGhlIGxhdHRlciBjYXNlLCBlb2ZtYXJrIGlzIHRoZQorICogd29yZCB3aGljaCBtYXJrcyB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudCBhbmQgc3RyaXB0YWJzIGlzIHRydWUgaWYKKyAqIGxlYWRpbmcgdGFicyBzaG91bGQgYmUgc3RyaXBwZWQgZnJvbSB0aGUgZG9jdW1lbnQuICBUaGUgYXJndW1lbnQgYworICogaXMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiB0aGUgaW5wdXQgdG9rZW4gb3IgZG9jdW1lbnQuCisgKgorICogQmVjYXVzZSBDIGRvZXMgbm90IGhhdmUgaW50ZXJuYWwgc3Vicm91dGluZXMsIEkgaGF2ZSBzaW11bGF0ZWQgdGhlbQorICogdXNpbmcgZ290bydzIHRvIGltcGxlbWVudCB0aGUgc3Vicm91dGluZSBsaW5rYWdlLiAgVGhlIGZvbGxvd2luZyBtYWNyb3MKKyAqIHdpbGwgcnVuIGNvZGUgdGhhdCBhcHBlYXJzIGF0IHRoZSBlbmQgb2YgcmVhZHRva2VuMS4KKyAqLworI2RlZmluZSBDSEVDS0VORCgpICAgICAge2dvdG8gY2hlY2tlbmQ7IGNoZWNrZW5kX3JldHVybjo7fQorI2RlZmluZSBQQVJTRVJFRElSKCkgICAge2dvdG8gcGFyc2VyZWRpcjsgcGFyc2VyZWRpcl9yZXR1cm46O30KKyNkZWZpbmUgUEFSU0VTVUIoKSAgICAgIHtnb3RvIHBhcnNlc3ViOyBwYXJzZXN1Yl9yZXR1cm46O30KKyNkZWZpbmUgUEFSU0VCQUNLUU9MRCgpIHtvbGRzdHlsZSA9IDE7IGdvdG8gcGFyc2ViYWNrcTsgcGFyc2ViYWNrcV9vbGRyZXR1cm46O30KKyNkZWZpbmUgUEFSU0VCQUNLUU5FVygpIHtvbGRzdHlsZSA9IDA7IGdvdG8gcGFyc2ViYWNrcTsgcGFyc2ViYWNrcV9uZXdyZXR1cm46O30KKyNkZWZpbmUgUEFSU0VBUklUSCgpICAgIHtnb3RvIHBhcnNlYXJpdGg7IHBhcnNlYXJpdGhfcmV0dXJuOjt9CitzdGF0aWMgaW50CityZWFkdG9rZW4xKGludCBjLCBpbnQgc3ludGF4LCBjaGFyICplb2ZtYXJrLCBpbnQgc3RyaXB0YWJzKQoreworCS8qIE5COiBzeW50YXggcGFyYW1ldGVyIGZpdHMgaW50byBzbWFsbGludCAqLworCS8qIGMgcGFyYW1ldGVyIGlzIGFuIHVuc2lnbmVkIGNoYXIgb3IgUEVPRiBvciBQRU9BICovCisJY2hhciAqb3V0OworCWludCBsZW47CisJY2hhciBsaW5lW0VPRk1BUktMRU4gKyAxXTsKKwlzdHJ1Y3Qgbm9kZWxpc3QgKmJxbGlzdDsKKwlzbWFsbGludCBxdW90ZWY7CisJc21hbGxpbnQgZGJscXVvdGU7CisJc21hbGxpbnQgb2xkc3R5bGU7CisJc21hbGxpbnQgcHJldnN5bnRheDsgLyogc3ludGF4IGJlZm9yZSBhcml0aG1ldGljICovCisjaWYgRU5BQkxFX0FTSF9FWFBBTkRfUFJNVAorCXNtYWxsaW50IHBzc3ludGF4OyAgIC8qIHdlIGFyZSBleHBhbmRpbmcgYSBwcm9tcHQgc3RyaW5nICovCisjZW5kaWYKKwlpbnQgdmFybmVzdDsgICAgICAgICAvKiBsZXZlbHMgb2YgdmFyaWFibGVzIGV4cGFuc2lvbiAqLworCWludCBhcmluZXN0OyAgICAgICAgIC8qIGxldmVscyBvZiBhcml0aG1ldGljIGV4cGFuc2lvbiAqLworCWludCBwYXJlbmxldmVsOyAgICAgIC8qIGxldmVscyBvZiBwYXJlbnMgaW4gYXJpdGhtZXRpYyAqLworCWludCBkcXZhcm5lc3Q7ICAgICAgIC8qIGxldmVscyBvZiB2YXJpYWJsZXMgZXhwYW5zaW9uIHdpdGhpbiBkb3VibGUgcXVvdGVzICovCisKKwlJRl9BU0hfQkFTSF9DT01QQVQoc21hbGxpbnQgYmFzaF9kb2xsYXJfc3F1b3RlID0gMDspCisKKwlzdGFydGxpbm5vID0gZ19wYXJzZWZpbGUtPmxpbm5vOworCWJxbGlzdCA9IE5VTEw7CisJcXVvdGVmID0gMDsKKwlwcmV2c3ludGF4ID0gMDsKKyNpZiBFTkFCTEVfQVNIX0VYUEFORF9QUk1UCisJcHNzeW50YXggPSAoc3ludGF4ID09IFBTU1lOVEFYKTsKKwlpZiAocHNzeW50YXgpCisJCXN5bnRheCA9IERRU1lOVEFYOworI2VuZGlmCisJZGJscXVvdGUgPSAoc3ludGF4ID09IERRU1lOVEFYKTsKKwl2YXJuZXN0ID0gMDsKKwlhcmluZXN0ID0gMDsKKwlwYXJlbmxldmVsID0gMDsKKwlkcXZhcm5lc3QgPSAwOworCisJU1RBUlRTVEFDS1NUUihvdXQpOworIGxvb3A6CisJLyogRm9yIGVhY2ggbGluZSwgdW50aWwgZW5kIG9mIHdvcmQgKi8KKwlDSEVDS0VORCgpOyAgICAgLyogc2V0IGMgdG8gUEVPRiBpZiBhdCBlbmQgb2YgaGVyZSBkb2N1bWVudCAqLworCWZvciAoOzspIHsgICAgICAvKiB1bnRpbCBlbmQgb2YgbGluZSBvciBlbmQgb2Ygd29yZCAqLworCQlDSEVDS1NUUlNQQUNFKDQsIG91dCk7ICAvKiBwZXJtaXQgNCBjYWxscyB0byBVU1RQVVRDICovCisJCXN3aXRjaCAoU0lUKGMsIHN5bnRheCkpIHsKKwkJY2FzZSBDTkw6ICAgICAgIC8qICdcbicgKi8KKwkJCWlmIChzeW50YXggPT0gQkFTRVNZTlRBWCkKKwkJCQlnb3RvIGVuZHdvcmQ7ICAgLyogZXhpdCBvdXRlciBsb29wICovCisJCQlVU1RQVVRDKGMsIG91dCk7CisJCQlnX3BhcnNlZmlsZS0+bGlubm8rKzsKKwkJCXNldHByb21wdF9pZihkb3Byb21wdCwgMik7CisJCQljID0gcGdldGMoKTsKKwkJCWdvdG8gbG9vcDsgICAgICAgICAgICAgIC8qIGNvbnRpbnVlIG91dGVyIGxvb3AgKi8KKwkJY2FzZSBDV09SRDoKKwkJCVVTVFBVVEMoYywgb3V0KTsKKwkJCWJyZWFrOworCQljYXNlIENDVEw6CisJCQlpZiAoZW9mbWFyayA9PSBOVUxMIHx8IGRibHF1b3RlKQorCQkJCVVTVFBVVEMoQ1RMRVNDLCBvdXQpOworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwkJCWlmIChjID09ICdcXCcgJiYgYmFzaF9kb2xsYXJfc3F1b3RlKSB7CisJCQkJYyA9IGRlY29kZV9kb2xsYXJfc3F1b3RlKCk7CisJCQkJaWYgKGMgJiAweDEwMCkgeworCQkJCQlVU1RQVVRDKCdcXCcsIG91dCk7CisJCQkJCWMgPSAodW5zaWduZWQgY2hhciljOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQkJVVNUUFVUQyhjLCBvdXQpOworCQkJYnJlYWs7CisJCWNhc2UgQ0JBQ0s6ICAgICAvKiBiYWNrc2xhc2ggKi8KKwkJCWMgPSBwZ2V0Y193aXRob3V0X1BFT0EoKTsKKwkJCWlmIChjID09IFBFT0YpIHsKKwkJCQlVU1RQVVRDKENUTEVTQywgb3V0KTsKKwkJCQlVU1RQVVRDKCdcXCcsIG91dCk7CisJCQkJcHVuZ2V0YygpOworCQkJfSBlbHNlIGlmIChjID09ICdcbicpIHsKKwkJCQlzZXRwcm9tcHRfaWYoZG9wcm9tcHQsIDIpOworCQkJfSBlbHNlIHsKKyNpZiBFTkFCTEVfQVNIX0VYUEFORF9QUk1UCisJCQkJaWYgKGMgPT0gJyQnICYmIHBzc3ludGF4KSB7CisJCQkJCVVTVFBVVEMoQ1RMRVNDLCBvdXQpOworCQkJCQlVU1RQVVRDKCdcXCcsIG91dCk7CisJCQkJfQorI2VuZGlmCisJCQkJLyogQmFja3NsYXNoIGlzIHJldGFpbmVkIGlmIHdlIGFyZSBpbiAic3RyIiBhbmQgbmV4dCBjaGFyIGlzbid0IHNwZWNpYWwgKi8KKwkJCQlpZiAoZGJscXVvdGUKKwkJCQkgJiYgYyAhPSAnXFwnCisJCQkJICYmIGMgIT0gJ2AnCisJCQkJICYmIGMgIT0gJyQnCisJCQkJICYmIChjICE9ICciJyB8fCBlb2ZtYXJrICE9IE5VTEwpCisJCQkJKSB7CisJCQkJCVVTVFBVVEMoJ1xcJywgb3V0KTsKKwkJCQl9CisJCQkJVVNUUFVUQyhDVExFU0MsIG91dCk7CisJCQkJVVNUUFVUQyhjLCBvdXQpOworCQkJCXF1b3RlZiA9IDE7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDU1FVT1RFOgorCQkJc3ludGF4ID0gU1FTWU5UQVg7CisgcXVvdGVtYXJrOgorCQkJaWYgKGVvZm1hcmsgPT0gTlVMTCkgeworCQkJCVVTVFBVVEMoQ1RMUVVPVEVNQVJLLCBvdXQpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgQ0RRVU9URToKKwkJCXN5bnRheCA9IERRU1lOVEFYOworCQkJZGJscXVvdGUgPSAxOworCQkJZ290byBxdW90ZW1hcms7CisJCWNhc2UgQ0VORFFVT1RFOgorCQkJSUZfQVNIX0JBU0hfQ09NUEFUKGJhc2hfZG9sbGFyX3NxdW90ZSA9IDA7KQorCQkJaWYgKGVvZm1hcmsgIT0gTlVMTCAmJiB2YXJuZXN0ID09IDApIHsKKwkJCQlVU1RQVVRDKGMsIG91dCk7CisJCQl9IGVsc2UgeworCQkJCWlmIChkcXZhcm5lc3QgPT0gMCkgeworCQkJCQlzeW50YXggPSBCQVNFU1lOVEFYOworCQkJCQlkYmxxdW90ZSA9IDA7CisJCQkJfQorCQkJCXF1b3RlZiA9IDE7CisJCQkJZ290byBxdW90ZW1hcms7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBDVkFSOiAgICAgIC8qICckJyAqLworCQkJUEFSU0VTVUIoKTsgICAgICAgICAgICAgLyogcGFyc2Ugc3Vic3RpdHV0aW9uICovCisJCQlicmVhazsKKwkJY2FzZSBDRU5EVkFSOiAgIC8qICd9JyAqLworCQkJaWYgKHZhcm5lc3QgPiAwKSB7CisJCQkJdmFybmVzdC0tOworCQkJCWlmIChkcXZhcm5lc3QgPiAwKSB7CisJCQkJCWRxdmFybmVzdC0tOworCQkJCX0KKwkJCQljID0gQ1RMRU5EVkFSOworCQkJfQorCQkJVVNUUFVUQyhjLCBvdXQpOworCQkJYnJlYWs7CisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorCQljYXNlIENMUDogICAgICAgLyogJygnIGluIGFyaXRobWV0aWMgKi8KKwkJCXBhcmVubGV2ZWwrKzsKKwkJCVVTVFBVVEMoYywgb3V0KTsKKwkJCWJyZWFrOworCQljYXNlIENSUDogICAgICAgLyogJyknIGluIGFyaXRobWV0aWMgKi8KKwkJCWlmIChwYXJlbmxldmVsID4gMCkgeworCQkJCXBhcmVubGV2ZWwtLTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKHBnZXRjKCkgPT0gJyknKSB7CisJCQkJCWMgPSBDVExFTkRBUkk7CisJCQkJCWlmICgtLWFyaW5lc3QgPT0gMCkgeworCQkJCQkJc3ludGF4ID0gcHJldnN5bnRheDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCS8qCisJCQkJCSAqIHVuYmFsYW5jZWQgcGFyZW5zCisJCQkJCSAqIChkb24ndCAybmQgZ3Vlc3MgLSBubyBlcnJvcikKKwkJCQkJICovCisJCQkJCXB1bmdldGMoKTsKKwkJCQl9CisJCQl9CisJCQlVU1RQVVRDKGMsIG91dCk7CisJCQlicmVhazsKKyNlbmRpZgorCQljYXNlIENCUVVPVEU6ICAgLyogJ2AnICovCisJCQlQQVJTRUJBQ0tRT0xEKCk7CisJCQlicmVhazsKKwkJY2FzZSBDRU5ERklMRToKKwkJCWdvdG8gZW5kd29yZDsgICAgICAgICAgIC8qIGV4aXQgb3V0ZXIgbG9vcCAqLworCQljYXNlIENJR046CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmICh2YXJuZXN0ID09IDApIHsKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJCQkJaWYgKGMgPT0gJyYnKSB7CisJCQkJCWlmIChwZ2V0YygpID09ICc+JykKKwkJCQkJCWMgPSAweDEwMCArICc+JzsgLyogZmxhZyAmPiAqLworCQkJCQlwdW5nZXRjKCk7CisJCQkJfQorI2VuZGlmCisJCQkJZ290byBlbmR3b3JkOyAgIC8qIGV4aXQgb3V0ZXIgbG9vcCAqLworCQkJfQorCQkJSUZfQVNIX0FMSUFTKGlmIChjICE9IFBFT0EpKQorCQkJCVVTVFBVVEMoYywgb3V0KTsKKwkJfQorCQljID0gcGdldGNfZmFzdCgpOworCX0gLyogZm9yICg7OykgKi8KKyBlbmR3b3JkOgorCisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorCWlmIChzeW50YXggPT0gQVJJU1lOVEFYKQorCQlyYWlzZV9lcnJvcl9zeW50YXgoIm1pc3NpbmcgJykpJyIpOworI2VuZGlmCisJaWYgKHN5bnRheCAhPSBCQVNFU1lOVEFYICYmIGVvZm1hcmsgPT0gTlVMTCkKKwkJcmFpc2VfZXJyb3Jfc3ludGF4KCJ1bnRlcm1pbmF0ZWQgcXVvdGVkIHN0cmluZyIpOworCWlmICh2YXJuZXN0ICE9IDApIHsKKwkJc3RhcnRsaW5ubyA9IGdfcGFyc2VmaWxlLT5saW5ubzsKKwkJLyogeyAqLworCQlyYWlzZV9lcnJvcl9zeW50YXgoIm1pc3NpbmcgJ30nIik7CisJfQorCVVTVFBVVEMoJ1wwJywgb3V0KTsKKwlsZW4gPSBvdXQgLSAoY2hhciAqKXN0YWNrYmxvY2soKTsKKwlvdXQgPSBzdGFja2Jsb2NrKCk7CisJaWYgKGVvZm1hcmsgPT0gTlVMTCkgeworCQlpZiAoKGMgPT0gJz4nIHx8IGMgPT0gJzwnIElGX0FTSF9CQVNIX0NPTVBBVCggfHwgYyA9PSAweDEwMCArICc+JykpCisJCSAmJiBxdW90ZWYgPT0gMAorCQkpIHsKKwkJCWlmIChpc2RpZ2l0X3N0cjkob3V0KSkgeworCQkJCVBBUlNFUkVESVIoKTsgLyogcGFzc2VkIGFzIHBhcmFtczogb3V0LCBjICovCisJCQkJbGFzdHRva2VuID0gVFJFRElSOworCQkJCXJldHVybiBsYXN0dG9rZW47CisJCQl9CisJCQkvKiBlbHNlOiBub24tbnVtYmVyIFggc2VlbiwgaW50ZXJwcmV0IGl0CisJCQkgKiBhcyAiTk5OWD5maWxlIiA9ICJOTk5YID5maWxlIiAqLworCQl9CisJCXB1bmdldGMoKTsKKwl9CisJcXVvdGVmbGFnID0gcXVvdGVmOworCWJhY2txdW90ZWxpc3QgPSBicWxpc3Q7CisJZ3JhYnN0YWNrYmxvY2sobGVuKTsKKwl3b3JkdGV4dCA9IG91dDsKKwlsYXN0dG9rZW4gPSBUV09SRDsKKwlyZXR1cm4gbGFzdHRva2VuOworLyogZW5kIG9mIHJlYWR0b2tlbiByb3V0aW5lICovCisKKy8qCisgKiBDaGVjayB0byBzZWUgd2hldGhlciB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgaGVyZSBkb2N1bWVudC4gIFdoZW4gdGhpcworICogaXMgY2FsbGVkLCBjIGlzIHNldCB0byB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBuZXh0IGlucHV0IGxpbmUuICBJZgorICogd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGhlcmUgZG9jdW1lbnQsIHRoaXMgcm91dGluZSBzZXRzIHRoZSBjIHRvIFBFT0YuCisgKi8KK2NoZWNrZW5kOiB7CisJaWYgKGVvZm1hcmspIHsKKyNpZiBFTkFCTEVfQVNIX0FMSUFTCisJCWlmIChjID09IFBFT0EpCisJCQljID0gcGdldGNfd2l0aG91dF9QRU9BKCk7CisjZW5kaWYKKwkJaWYgKHN0cmlwdGFicykgeworCQkJd2hpbGUgKGMgPT0gJ1x0JykgeworCQkJCWMgPSBwZ2V0Y193aXRob3V0X1BFT0EoKTsKKwkJCX0KKwkJfQorCQlpZiAoYyA9PSAqZW9mbWFyaykgeworCQkJaWYgKHBmZ2V0cyhsaW5lLCBzaXplb2YobGluZSkpICE9IE5VTEwpIHsKKwkJCQljaGFyICpwLCAqcTsKKworCQkJCXAgPSBsaW5lOworCQkJCWZvciAocSA9IGVvZm1hcmsgKyAxOyAqcSAmJiAqcCA9PSAqcTsgcCsrLCBxKyspCisJCQkJCWNvbnRpbnVlOworCQkJCWlmICgqcCA9PSAnXG4nICYmICpxID09ICdcMCcpIHsKKwkJCQkJYyA9IFBFT0Y7CisJCQkJCWdfcGFyc2VmaWxlLT5saW5ubysrOworCQkJCQluZWVkcHJvbXB0ID0gZG9wcm9tcHQ7CisJCQkJfSBlbHNlIHsKKwkJCQkJcHVzaHN0cmluZyhsaW5lLCBOVUxMKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJZ290byBjaGVja2VuZF9yZXR1cm47Cit9CisKKy8qCisgKiBQYXJzZSBhIHJlZGlyZWN0aW9uIG9wZXJhdG9yLiAgVGhlIHZhcmlhYmxlICJvdXQiIHBvaW50cyB0byBhIHN0cmluZworICogc3BlY2lmeWluZyB0aGUgZmQgdG8gYmUgcmVkaXJlY3RlZC4gIFRoZSB2YXJpYWJsZSAiYyIgY29udGFpbnMgdGhlCisgKiBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIHJlZGlyZWN0aW9uIG9wZXJhdG9yLgorICovCitwYXJzZXJlZGlyOiB7CisJLyogb3V0IGlzIGFscmVhZHkgY2hlY2tlZCB0byBiZSBhIHZhbGlkIG51bWJlciBvciAiIiAqLworCWludCBmZCA9ICgqb3V0ID09ICdcMCcgPyAtMSA6IGF0b2kob3V0KSk7CisJdW5pb24gbm9kZSAqbnA7CisKKwlucCA9IHN0emFsbG9jKHNpemVvZihzdHJ1Y3QgbmZpbGUpKTsKKwlpZiAoYyA9PSAnPicpIHsKKwkJbnAtPm5maWxlLmZkID0gMTsKKwkJYyA9IHBnZXRjKCk7CisJCWlmIChjID09ICc+JykKKwkJCW5wLT50eXBlID0gTkFQUEVORDsKKwkJZWxzZSBpZiAoYyA9PSAnfCcpCisJCQlucC0+dHlwZSA9IE5DTE9CQkVSOworCQllbHNlIGlmIChjID09ICcmJykKKwkJCW5wLT50eXBlID0gTlRPRkQ7CisJCQkvKiBpdCBhbHNvIGNhbiBiZSBOVE8yICg+JmZpbGUpLCBidXQgd2UgY2FuJ3QgZmlndXJlIGl0IG91dCB5ZXQgKi8KKwkJZWxzZSB7CisJCQlucC0+dHlwZSA9IE5UTzsKKwkJCXB1bmdldGMoKTsKKwkJfQorCX0KKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJZWxzZSBpZiAoYyA9PSAweDEwMCArICc+JykgeyAvKiB0aGlzIGZsYWdzICY+IHJlZGlyZWN0aW9uICovCisJCW5wLT5uZmlsZS5mZCA9IDE7CisJCXBnZXRjKCk7IC8qIHRoaXMgaXMgJz4nLCBubyBuZWVkIHRvIGNoZWNrICovCisJCW5wLT50eXBlID0gTlRPMjsKKwl9CisjZW5kaWYKKwllbHNlIHsgLyogYyA9PSAnPCcgKi8KKwkJLypucC0+bmZpbGUuZmQgPSAwOyAtIHN0emFsbG9jIGRpZCBpdCAqLworCQljID0gcGdldGMoKTsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJzwnOgorCQkJaWYgKHNpemVvZihzdHJ1Y3QgbmZpbGUpICE9IHNpemVvZihzdHJ1Y3QgbmhlcmUpKSB7CisJCQkJbnAgPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IG5oZXJlKSk7CisJCQkJLypucC0+bmZpbGUuZmQgPSAwOyAtIHN0emFsbG9jIGRpZCBpdCAqLworCQkJfQorCQkJbnAtPnR5cGUgPSBOSEVSRTsKKwkJCWhlcmVkb2MgPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IGhlcmVkb2MpKTsKKwkJCWhlcmVkb2MtPmhlcmUgPSBucDsKKwkJCWMgPSBwZ2V0YygpOworCQkJaWYgKGMgPT0gJy0nKSB7CisJCQkJaGVyZWRvYy0+c3RyaXB0YWJzID0gMTsKKwkJCX0gZWxzZSB7CisJCQkJLypoZXJlZG9jLT5zdHJpcHRhYnMgPSAwOyAtIHN0emFsbG9jIGRpZCBpdCAqLworCQkJCXB1bmdldGMoKTsKKwkJCX0KKwkJCWJyZWFrOworCisJCWNhc2UgJyYnOgorCQkJbnAtPnR5cGUgPSBORlJPTUZEOworCQkJYnJlYWs7CisKKwkJY2FzZSAnPic6CisJCQlucC0+dHlwZSA9IE5GUk9NVE87CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJbnAtPnR5cGUgPSBORlJPTTsKKwkJCXB1bmdldGMoKTsKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChmZCA+PSAwKQorCQlucC0+bmZpbGUuZmQgPSBmZDsKKwlyZWRpcm5vZGUgPSBucDsKKwlnb3RvIHBhcnNlcmVkaXJfcmV0dXJuOworfQorCisvKgorICogUGFyc2UgYSBzdWJzdGl0dXRpb24uICBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIHJlYWQgdGhlIGRvbGxhciBzaWduCisgKiBhbmQgbm90aGluZyBlbHNlLgorICovCisKKy8qIGlzX3NwZWNpYWwoYykgZXZhbHVhdGVzIHRvIDEgZm9yIGMgaW4gIiEjJCotMDEyMzQ1Njc4OT9AIjsgMCBvdGhlcndpc2UKKyAqIChhc3N1bWluZyBhc2NpaSBjaGFyIGNvZGVzLCBhcyB0aGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gZGlkKSAqLworI2RlZmluZSBpc19zcGVjaWFsKGMpIFwKKwkoKCh1bnNpZ25lZCkoYykgLSAzMyA8IDMyKSBcCisJCQkmJiAoKDB4YzFmZjkyMGRVID4+ICgodW5zaWduZWQpKGMpIC0gMzMpKSAmIDEpKQorcGFyc2VzdWI6IHsKKwl1bnNpZ25lZCBjaGFyIHN1YnR5cGU7CisJaW50IHR5cGVsb2M7CisJaW50IGZsYWdzOworCisJYyA9IHBnZXRjKCk7CisJaWYgKGMgPiAyNTUgLyogUEVPQSBvciBQRU9GICovCisJIHx8IChjICE9ICcoJyAmJiBjICE9ICd7JyAmJiAhaXNfbmFtZShjKSAmJiAhaXNfc3BlY2lhbChjKSkKKwkpIHsKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJCWlmIChjID09ICdcJycpCisJCQliYXNoX2RvbGxhcl9zcXVvdGUgPSAxOworCQllbHNlCisjZW5kaWYKKwkJCVVTVFBVVEMoJyQnLCBvdXQpOworCQlwdW5nZXRjKCk7CisJfSBlbHNlIGlmIChjID09ICcoJykgeworCQkvKiAkKGNvbW1hbmQpIG9yICQoKGFyaXRoKSkgKi8KKwkJaWYgKHBnZXRjKCkgPT0gJygnKSB7CisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorCQkJUEFSU0VBUklUSCgpOworI2Vsc2UKKwkJCXJhaXNlX2Vycm9yX3N5bnRheCgieW91IGRpc2FibGVkIG1hdGggc3VwcG9ydCBmb3IgJCgoYXJpdGgpKSBzeW50YXgiKTsKKyNlbmRpZgorCQl9IGVsc2UgeworCQkJcHVuZ2V0YygpOworCQkJUEFSU0VCQUNLUU5FVygpOworCQl9CisJfSBlbHNlIHsKKwkJLyogJFZBUiwgJDxzcGVjaWFsY2hhcj4sICR7Li4ufSwgb3IgUEVPQS9QRU9GICovCisJCVVTVFBVVEMoQ1RMVkFSLCBvdXQpOworCQl0eXBlbG9jID0gb3V0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCk7CisJCVVTVFBVVEMoVlNOT1JNQUwsIG91dCk7CisJCXN1YnR5cGUgPSBWU05PUk1BTDsKKwkJaWYgKGMgPT0gJ3snKSB7CisJCQljID0gcGdldGMoKTsKKwkJCWlmIChjID09ICcjJykgeworCQkJCWMgPSBwZ2V0YygpOworCQkJCWlmIChjID09ICd9JykKKwkJCQkJYyA9ICcjJzsgLyogJHsjfSAtIHNhbWUgYXMgJCMgKi8KKwkJCQllbHNlCisJCQkJCXN1YnR5cGUgPSBWU0xFTkdUSDsgLyogJHsjVkFSfSAqLworCQkJfSBlbHNlIHsKKwkJCQlzdWJ0eXBlID0gMDsKKwkJCX0KKwkJfQorCQlpZiAoYyA8PSAyNTUgLyogbm90IFBFT0Egb3IgUEVPRiAqLyAmJiBpc19uYW1lKGMpKSB7CisJCQkvKiAkW3tbI11dTkFNRVt9XSAqLworCQkJZG8geworCQkJCVNUUFVUQyhjLCBvdXQpOworCQkJCWMgPSBwZ2V0YygpOworCQkJfSB3aGlsZSAoYyA8PSAyNTUgLyogbm90IFBFT0Egb3IgUEVPRiAqLyAmJiBpc19pbl9uYW1lKGMpKTsKKwkJfSBlbHNlIGlmIChpc2RpZ2l0KGMpKSB7CisJCQkvKiAkW3tbI11dTlVNW31dICovCisJCQlkbyB7CisJCQkJU1RQVVRDKGMsIG91dCk7CisJCQkJYyA9IHBnZXRjKCk7CisJCQl9IHdoaWxlIChpc2RpZ2l0KGMpKTsKKwkJfSBlbHNlIGlmIChpc19zcGVjaWFsKGMpKSB7CisJCQkvKiAkW3tbI11dPHNwZWNpYWxjaGFyPlt9XSAqLworCQkJVVNUUFVUQyhjLCBvdXQpOworCQkJYyA9IHBnZXRjKCk7CisJCX0gZWxzZSB7CisgYmFkc3ViOgorCQkJcmFpc2VfZXJyb3Jfc3ludGF4KCJiYWQgc3Vic3RpdHV0aW9uIik7CisJCX0KKwkJaWYgKGMgIT0gJ30nICYmIHN1YnR5cGUgPT0gVlNMRU5HVEgpIHsKKwkJCS8qICR7I1ZBUiBkaWRuJ3QgZW5kIHdpdGggfSAqLworCQkJZ290byBiYWRzdWI7CisJCX0KKworCQlTVFBVVEMoJz0nLCBvdXQpOworCQlmbGFncyA9IDA7CisJCWlmIChzdWJ0eXBlID09IDApIHsKKwkJCS8qICR7VkFSLi4ufSBidXQgbm90ICRWQVIgb3IgJHsjVkFSfSAqLworCQkJLyogYyA9PSBmaXJzdCBjaGFyIGFmdGVyIFZBUiAqLworCQkJc3dpdGNoIChjKSB7CisJCQljYXNlICc6JzoKKwkJCQljID0gcGdldGMoKTsKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJCQkJaWYgKGMgPT0gJzonIHx8IGMgPT0gJyQnIHx8IGlzZGlnaXQoYykpIHsKKy8vVE9ETzogc3VwcG9ydCBtb3JlIGdlbmVyYWwgZm9ybWF0ICR7djpFWFBSOkVYUFJ9LAorLy8gd2hlcmUgRVhQUiBmb2xsb3dzICQoKCkpIHJ1bGVzCisJCQkJCXN1YnR5cGUgPSBWU1NVQlNUUjsKKwkJCQkJcHVuZ2V0YygpOworCQkJCQlicmVhazsgLyogImdvdG8gZG9fcHVuZ2V0YyIgaXMgYmlnZ2VyICghKSAqLworCQkJCX0KKyNlbmRpZgorCQkJCWZsYWdzID0gVlNOVUw7CisJCQkJLypGQUxMVEhST1VHSCovCisJCQlkZWZhdWx0OiB7CisJCQkJc3RhdGljIGNvbnN0IGNoYXIgdHlwZXNbXSBBTElHTjEgPSAifS0rPz0iOworCQkJCWNvbnN0IGNoYXIgKnAgPSBzdHJjaHIodHlwZXMsIGMpOworCQkJCWlmIChwID09IE5VTEwpCisJCQkJCWdvdG8gYmFkc3ViOworCQkJCXN1YnR5cGUgPSBwIC0gdHlwZXMgKyBWU05PUk1BTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNhc2UgJyUnOgorCQkJY2FzZSAnIyc6IHsKKwkJCQlpbnQgY2MgPSBjOworCQkJCXN1YnR5cGUgPSAoYyA9PSAnIycgPyBWU1RSSU1MRUZUIDogVlNUUklNUklHSFQpOworCQkJCWMgPSBwZ2V0YygpOworCQkJCWlmIChjICE9IGNjKQorCQkJCQlnb3RvIGRvX3B1bmdldGM7CisJCQkJc3VidHlwZSsrOworCQkJCWJyZWFrOworCQkJfQorI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwkJCWNhc2UgJy8nOgorCQkJCS8qICR7di9bL11wYXR0ZXJuL3JlcGx9ICovCisvL1RPRE86IGVuY29kZSBwYXR0ZXJuIGFuZCByZXBsIHNlcGFyYXRlbHkuCisvLyBDdXJyZW50bHkgJHt2LyR2YXJfd2l0aF9zbGFzaC9yZXBsfSBpcyBob3JyaWJseSBicm9rZW4KKwkJCQlzdWJ0eXBlID0gVlNSRVBMQUNFOworCQkJCWMgPSBwZ2V0YygpOworCQkJCWlmIChjICE9ICcvJykKKwkJCQkJZ290byBkb19wdW5nZXRjOworCQkJCXN1YnR5cGUrKzsgLyogVlNSRVBMQUNFQUxMICovCisJCQkJYnJlYWs7CisjZW5kaWYKKwkJCX0KKwkJfSBlbHNlIHsKKyBkb19wdW5nZXRjOgorCQkJcHVuZ2V0YygpOworCQl9CisJCSgodW5zaWduZWQgY2hhciAqKXN0YWNrYmxvY2soKSlbdHlwZWxvY10gPSBzdWJ0eXBlIHwgZmxhZ3M7CisJCWlmIChzdWJ0eXBlICE9IFZTTk9STUFMKSB7CisJCQl2YXJuZXN0Kys7CisJCQlpZiAoZGJscXVvdGUpIHsKKwkJCQlkcXZhcm5lc3QrKzsKKwkJCX0KKwkJfQorCX0KKwlnb3RvIHBhcnNlc3ViX3JldHVybjsKK30KKworLyoKKyAqIENhbGxlZCB0byBwYXJzZSBjb21tYW5kIHN1YnN0aXR1dGlvbnMuICBOZXdzdHlsZSBpcyBzZXQgaWYgdGhlIGNvbW1hbmQKKyAqIGlzIGVuY2xvc2VkIGluc2lkZSAkKC4uLik7IG5scHAgaXMgYSBwb2ludGVyIHRvIHRoZSBoZWFkIG9mIHRoZSBsaW5rZWQKKyAqIGxpc3Qgb2YgY29tbWFuZHMgKHBhc3NlZCBieSByZWZlcmVuY2UpLCBhbmQgc2F2ZWxlbiBpcyB0aGUgbnVtYmVyIG9mCisgKiBjaGFyYWN0ZXJzIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrIHdoaWNoIG11c3QgYmUgcHJlc2VydmVkLgorICovCitwYXJzZWJhY2txOiB7CisJc3RydWN0IG5vZGVsaXN0ICoqbmxwcDsKKwl1bmlvbiBub2RlICpuOworCWNoYXIgKnN0cjsKKwlzaXplX3Qgc2F2ZWxlbjsKKwlzbWFsbGludCBzYXZlcHJvbXB0ID0gMDsKKworCXN0ciA9IE5VTEw7CisJc2F2ZWxlbiA9IG91dCAtIChjaGFyICopc3RhY2tibG9jaygpOworCWlmIChzYXZlbGVuID4gMCkgeworCQlzdHIgPSBhbGxvY2Eoc2F2ZWxlbik7CisJCW1lbWNweShzdHIsIHN0YWNrYmxvY2soKSwgc2F2ZWxlbik7CisJfQorCWlmIChvbGRzdHlsZSkgeworCQkvKiBXZSBtdXN0IHJlYWQgdW50aWwgdGhlIGNsb3NpbmcgYmFja3F1b3RlLCBnaXZpbmcgc3BlY2lhbAorCQkgKiB0cmVhdG1lbnQgdG8gc29tZSBzbGFzaGVzLCBhbmQgdGhlbiBwdXNoIHRoZSBzdHJpbmcgYW5kCisJCSAqIHJlcmVhZCBpdCBhcyBpbnB1dCwgaW50ZXJwcmV0aW5nIGl0IG5vcm1hbGx5LgorCQkgKi8KKwkJY2hhciAqcG91dDsKKwkJc2l6ZV90IHBzYXZlbGVuOworCQljaGFyICpwc3RyOworCisJCVNUQVJUU1RBQ0tTVFIocG91dCk7CisJCWZvciAoOzspIHsKKwkJCWludCBwYzsKKworCQkJc2V0cHJvbXB0X2lmKG5lZWRwcm9tcHQsIDIpOworCQkJcGMgPSBwZ2V0YygpOworCQkJc3dpdGNoIChwYykgeworCQkJY2FzZSAnYCc6CisJCQkJZ290byBkb25lOworCisJCQljYXNlICdcXCc6CisJCQkJcGMgPSBwZ2V0YygpOworCQkJCWlmIChwYyA9PSAnXG4nKSB7CisJCQkJCWdfcGFyc2VmaWxlLT5saW5ubysrOworCQkJCQlzZXRwcm9tcHRfaWYoZG9wcm9tcHQsIDIpOworCQkJCQkvKgorCQkJCQkgKiBJZiBlYXRpbmcgYSBuZXdsaW5lLCBhdm9pZCBwdXR0aW5nCisJCQkJCSAqIHRoZSBuZXdsaW5lIGludG8gdGhlIG5ldyBjaGFyYWN0ZXIKKwkJCQkJICogc3RyZWFtICh2aWEgdGhlIFNUUFVUQyBhZnRlciB0aGUKKwkJCQkJICogc3dpdGNoKS4KKwkJCQkJICovCisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCQlpZiAocGMgIT0gJ1xcJyAmJiBwYyAhPSAnYCcgJiYgcGMgIT0gJyQnCisJCQkJICYmICghZGJscXVvdGUgfHwgcGMgIT0gJyInKQorCQkJCSkgeworCQkJCQlTVFBVVEMoJ1xcJywgcG91dCk7CisJCQkJfQorCQkJCWlmIChwYyA8PSAyNTUgLyogbm90IFBFT0Egb3IgUEVPRiAqLykgeworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJLyogZmFsbCB0aHJvdWdoICovCisKKwkJCWNhc2UgUEVPRjoKKwkJCUlGX0FTSF9BTElBUyhjYXNlIFBFT0E6KQorCQkJCXN0YXJ0bGlubm8gPSBnX3BhcnNlZmlsZS0+bGlubm87CisJCQkJcmFpc2VfZXJyb3Jfc3ludGF4KCJFT0YgaW4gYmFja3F1b3RlIHN1YnN0aXR1dGlvbiIpOworCisJCQljYXNlICdcbic6CisJCQkJZ19wYXJzZWZpbGUtPmxpbm5vKys7CisJCQkJbmVlZHByb21wdCA9IGRvcHJvbXB0OworCQkJCWJyZWFrOworCisJCQlkZWZhdWx0OgorCQkJCWJyZWFrOworCQkJfQorCQkJU1RQVVRDKHBjLCBwb3V0KTsKKwkJfQorIGRvbmU6CisJCVNUUFVUQygnXDAnLCBwb3V0KTsKKwkJcHNhdmVsZW4gPSBwb3V0IC0gKGNoYXIgKilzdGFja2Jsb2NrKCk7CisJCWlmIChwc2F2ZWxlbiA+IDApIHsKKwkJCXBzdHIgPSBncmFic3RhY2tzdHIocG91dCk7CisJCQlzZXRpbnB1dHN0cmluZyhwc3RyKTsKKwkJfQorCX0KKwlubHBwID0gJmJxbGlzdDsKKwl3aGlsZSAoKm5scHApCisJCW5scHAgPSAmKCpubHBwKS0+bmV4dDsKKwkqbmxwcCA9IHN0emFsbG9jKHNpemVvZigqKm5scHApKTsKKwkvKiAoKm5scHApLT5uZXh0ID0gTlVMTDsgLSBzdHphbGxvYyBkaWQgaXQgKi8KKworCWlmIChvbGRzdHlsZSkgeworCQlzYXZlcHJvbXB0ID0gZG9wcm9tcHQ7CisJCWRvcHJvbXB0ID0gMDsKKwl9CisKKwluID0gbGlzdCgyKTsKKworCWlmIChvbGRzdHlsZSkKKwkJZG9wcm9tcHQgPSBzYXZlcHJvbXB0OworCWVsc2UgaWYgKHJlYWR0b2tlbigpICE9IFRSUCkKKwkJcmFpc2VfZXJyb3JfdW5leHBlY3RlZF9zeW50YXgoVFJQKTsKKworCSgqbmxwcCktPm4gPSBuOworCWlmIChvbGRzdHlsZSkgeworCQkvKgorCQkgKiBTdGFydCByZWFkaW5nIGZyb20gb2xkIGZpbGUgYWdhaW4sIGlnbm9yaW5nIGFueSBwdXNoZWQgYmFjaworCQkgKiB0b2tlbnMgbGVmdCBmcm9tIHRoZSBiYWNrcXVvdGUgcGFyc2luZworCQkgKi8KKwkJcG9wZmlsZSgpOworCQl0b2twdXNoYmFjayA9IDA7CisJfQorCXdoaWxlIChzdGFja2Jsb2Nrc2l6ZSgpIDw9IHNhdmVsZW4pCisJCWdyb3dzdGFja2Jsb2NrKCk7CisJU1RBUlRTVEFDS1NUUihvdXQpOworCWlmIChzdHIpIHsKKwkJbWVtY3B5KG91dCwgc3RyLCBzYXZlbGVuKTsKKwkJU1RBREpVU1Qoc2F2ZWxlbiwgb3V0KTsKKwl9CisJVVNUUFVUQyhDVExCQUNLUSwgb3V0KTsKKwlpZiAob2xkc3R5bGUpCisJCWdvdG8gcGFyc2ViYWNrcV9vbGRyZXR1cm47CisJZ290byBwYXJzZWJhY2txX25ld3JldHVybjsKK30KKworI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKKy8qCisgKiBQYXJzZSBhbiBhcml0aG1ldGljIGV4cGFuc2lvbiAoaW5kaWNhdGUgc3RhcnQgb2Ygb25lIGFuZCBzZXQgc3RhdGUpCisgKi8KK3BhcnNlYXJpdGg6IHsKKwlpZiAoKythcmluZXN0ID09IDEpIHsKKwkJcHJldnN5bnRheCA9IHN5bnRheDsKKwkJc3ludGF4ID0gQVJJU1lOVEFYOworCX0KKwlVU1RQVVRDKENUTEFSSSwgb3V0KTsKKwlnb3RvIHBhcnNlYXJpdGhfcmV0dXJuOworfQorI2VuZGlmCit9IC8qIGVuZCBvZiByZWFkdG9rZW4gKi8KKworLyoKKyAqIFJlYWQgdGhlIG5leHQgaW5wdXQgdG9rZW4uCisgKiBJZiB0aGUgdG9rZW4gaXMgYSB3b3JkLCB3ZSBzZXQgYmFja3F1b3RlbGlzdCB0byB0aGUgbGlzdCBvZiBjbWRzIGluCisgKiAgICAgIGJhY2txdW90ZXMuICBXZSBzZXQgcXVvdGVmbGFnIHRvIHRydWUgaWYgYW55IHBhcnQgb2YgdGhlIHdvcmQgd2FzCisgKiAgICAgIHF1b3RlZC4KKyAqIElmIHRoZSB0b2tlbiBpcyBUUkVESVIsIHRoZW4gd2Ugc2V0IHJlZGlybm9kZSB0byBhIHN0cnVjdHVyZSBjb250YWluaW5nCisgKiAgICAgIHRoZSByZWRpcmVjdGlvbi4KKyAqIEluIGFsbCBjYXNlcywgdGhlIHZhcmlhYmxlIHN0YXJ0bGlubm8gaXMgc2V0IHRvIHRoZSBudW1iZXIgb2YgdGhlIGxpbmUKKyAqICAgICAgb24gd2hpY2ggdGhlIHRva2VuIHN0YXJ0cy4KKyAqCisgKiBbQ2hhbmdlIGNvbW1lbnQ6ICBoZXJlIGRvY3VtZW50cyBhbmQgaW50ZXJuYWwgcHJvY2VkdXJlc10KKyAqIFtSZWFkdG9rZW4gc2hvdWxkbid0IGhhdmUgYW55IGFyZ3VtZW50cy4gIFBlcmhhcHMgd2Ugc2hvdWxkIG1ha2UgdGhlCisgKiAgd29yZCBwYXJzaW5nIGNvZGUgaW50byBhIHNlcGFyYXRlIHJvdXRpbmUuICBJbiB0aGlzIGNhc2UsIHJlYWR0b2tlbgorICogIGRvZXNuJ3QgbmVlZCB0byBoYXZlIGFueSBpbnRlcm5hbCBwcm9jZWR1cmVzLCBidXQgcGFyc2V3b3JkIGRvZXMuCisgKiAgV2UgY291bGQgYWxzbyBtYWtlIHBhcnNlb3BlcmF0b3IgaW4gZXNzZW5jZSB0aGUgbWFpbiByb3V0aW5lLCBhbmQKKyAqICBoYXZlIHBhcnNld29yZCAocmVhZHRva2VuMT8pIGhhbmRsZSBib3RoIHdvcmRzIGFuZCByZWRpcmVjdGlvbi5dCisgKi8KKyNkZWZpbmUgTkVXX3h4cmVhZHRva2VuCisjaWZkZWYgTkVXX3h4cmVhZHRva2VuCisvKiBzaW5nbGVzIG11c3QgYmUgZmlyc3QhICovCitzdGF0aWMgY29uc3QgY2hhciB4eHJlYWR0b2tlbl9jaGFyc1s3XSBBTElHTjEgPSB7CisJJ1xuJywgJygnLCAnKScsIC8qIHNpbmdsZXMgKi8KKwknJicsICd8JywgJzsnLCAgLyogZG91YmxlcyAqLworCTAKK307CisKKyNkZWZpbmUgeHhyZWFkdG9rZW5fc2luZ2xlcyAzCisjZGVmaW5lIHh4cmVhZHRva2VuX2RvdWJsZXMgMworCitzdGF0aWMgY29uc3QgY2hhciB4eHJlYWR0b2tlbl90b2tlbnNbXSBBTElHTjEgPSB7CisJVE5MLCBUTFAsIFRSUCwgICAgICAgICAgLyogb25seSBzaW5nbGUgb2NjdXJyZW5jZSBhbGxvd2VkICovCisJVEJBQ0tHTkQsIFRQSVBFLCBUU0VNSSwgLyogaWYgc2luZ2xlIG9jY3VycmVuY2UgKi8KKwlURU9GLCAgICAgICAgICAgICAgICAgICAvKiBjb3JyZXNwb25kcyB0byB0cmFpbGluZyBudWwgKi8KKwlUQU5ELCBUT1IsIFRFTkRDQVNFICAgICAvKiBpZiBkb3VibGUgb2NjdXJyZW5jZSAqLworfTsKKworc3RhdGljIGludAoreHhyZWFkdG9rZW4odm9pZCkKK3sKKwlpbnQgYzsKKworCWlmICh0b2twdXNoYmFjaykgeworCQl0b2twdXNoYmFjayA9IDA7CisJCXJldHVybiBsYXN0dG9rZW47CisJfQorCXNldHByb21wdF9pZihuZWVkcHJvbXB0LCAyKTsKKwlzdGFydGxpbm5vID0gZ19wYXJzZWZpbGUtPmxpbm5vOworCWZvciAoOzspIHsgICAgICAgICAgICAgICAgICAgICAgLyogdW50aWwgdG9rZW4gb3Igc3RhcnQgb2Ygd29yZCBmb3VuZCAqLworCQljID0gcGdldGNfZmFzdCgpOworCQlpZiAoYyA9PSAnICcgfHwgYyA9PSAnXHQnIElGX0FTSF9BTElBUyggfHwgYyA9PSBQRU9BKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjID09ICcjJykgeworCQkJd2hpbGUgKChjID0gcGdldGMoKSkgIT0gJ1xuJyAmJiBjICE9IFBFT0YpCisJCQkJY29udGludWU7CisJCQlwdW5nZXRjKCk7CisJCX0gZWxzZSBpZiAoYyA9PSAnXFwnKSB7CisJCQlpZiAocGdldGMoKSAhPSAnXG4nKSB7CisJCQkJcHVuZ2V0YygpOworCQkJCWJyZWFrOyAvKiByZXR1cm4gcmVhZHRva2VuMSguLi4pICovCisJCQl9CisJCQlzdGFydGxpbm5vID0gKytnX3BhcnNlZmlsZS0+bGlubm87CisJCQlzZXRwcm9tcHRfaWYoZG9wcm9tcHQsIDIpOworCQl9IGVsc2UgeworCQkJY29uc3QgY2hhciAqcDsKKworCQkJcCA9IHh4cmVhZHRva2VuX2NoYXJzICsgc2l6ZW9mKHh4cmVhZHRva2VuX2NoYXJzKSAtIDE7CisJCQlpZiAoYyAhPSBQRU9GKSB7CisJCQkJaWYgKGMgPT0gJ1xuJykgeworCQkJCQlnX3BhcnNlZmlsZS0+bGlubm8rKzsKKwkJCQkJbmVlZHByb21wdCA9IGRvcHJvbXB0OworCQkJCX0KKworCQkJCXAgPSBzdHJjaHIoeHhyZWFkdG9rZW5fY2hhcnMsIGMpOworCQkJCWlmIChwID09IE5VTEwpCisJCQkJCWJyZWFrOyAvKiByZXR1cm4gcmVhZHRva2VuMSguLi4pICovCisKKwkJCQlpZiAoKGludCkocCAtIHh4cmVhZHRva2VuX2NoYXJzKSA+PSB4eHJlYWR0b2tlbl9zaW5nbGVzKSB7CisJCQkJCWludCBjYyA9IHBnZXRjKCk7CisJCQkJCWlmIChjYyA9PSBjKSB7ICAgIC8qIGRvdWJsZSBvY2N1cnJlbmNlPyAqLworCQkJCQkJcCArPSB4eHJlYWR0b2tlbl9kb3VibGVzICsgMTsKKwkJCQkJfSBlbHNlIHsKKwkJCQkJCXB1bmdldGMoKTsKKyNpZiBFTkFCTEVfQVNIX0JBU0hfQ09NUEFUCisJCQkJCQlpZiAoYyA9PSAnJicgJiYgY2MgPT0gJz4nKSAvKiAmPiAqLworCQkJCQkJCWJyZWFrOyAvKiByZXR1cm4gcmVhZHRva2VuMSguLi4pICovCisjZW5kaWYKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWxhc3R0b2tlbiA9IHh4cmVhZHRva2VuX3Rva2Vuc1twIC0geHhyZWFkdG9rZW5fY2hhcnNdOworCQkJcmV0dXJuIGxhc3R0b2tlbjsKKwkJfQorCX0gLyogZm9yICg7OykgKi8KKworCXJldHVybiByZWFkdG9rZW4xKGMsIEJBU0VTWU5UQVgsIChjaGFyICopIE5VTEwsIDApOworfQorI2Vsc2UgLyogb2xkIHh4cmVhZHRva2VuICovCisjZGVmaW5lIFJFVFVSTih0b2tlbikgICByZXR1cm4gbGFzdHRva2VuID0gdG9rZW4KK3N0YXRpYyBpbnQKK3h4cmVhZHRva2VuKHZvaWQpCit7CisJaW50IGM7CisKKwlpZiAodG9rcHVzaGJhY2spIHsKKwkJdG9rcHVzaGJhY2sgPSAwOworCQlyZXR1cm4gbGFzdHRva2VuOworCX0KKwlzZXRwcm9tcHRfaWYobmVlZHByb21wdCwgMik7CisJc3RhcnRsaW5ubyA9IGdfcGFyc2VmaWxlLT5saW5ubzsKKwlmb3IgKDs7KSB7ICAgICAgLyogdW50aWwgdG9rZW4gb3Igc3RhcnQgb2Ygd29yZCBmb3VuZCAqLworCQljID0gcGdldGNfZmFzdCgpOworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnICc6IGNhc2UgJ1x0JzoKKwkJSUZfQVNIX0FMSUFTKGNhc2UgUEVPQTopCisJCQljb250aW51ZTsKKwkJY2FzZSAnIyc6CisJCQl3aGlsZSAoKGMgPSBwZ2V0YygpKSAhPSAnXG4nICYmIGMgIT0gUEVPRikKKwkJCQljb250aW51ZTsKKwkJCXB1bmdldGMoKTsKKwkJCWNvbnRpbnVlOworCQljYXNlICdcXCc6CisJCQlpZiAocGdldGMoKSA9PSAnXG4nKSB7CisJCQkJc3RhcnRsaW5ubyA9ICsrZ19wYXJzZWZpbGUtPmxpbm5vOworCQkJCXNldHByb21wdF9pZihkb3Byb21wdCwgMik7CisJCQkJY29udGludWU7CisJCQl9CisJCQlwdW5nZXRjKCk7CisJCQlnb3RvIGJyZWFrbG9vcDsKKwkJY2FzZSAnXG4nOgorCQkJZ19wYXJzZWZpbGUtPmxpbm5vKys7CisJCQluZWVkcHJvbXB0ID0gZG9wcm9tcHQ7CisJCQlSRVRVUk4oVE5MKTsKKwkJY2FzZSBQRU9GOgorCQkJUkVUVVJOKFRFT0YpOworCQljYXNlICcmJzoKKwkJCWlmIChwZ2V0YygpID09ICcmJykKKwkJCQlSRVRVUk4oVEFORCk7CisJCQlwdW5nZXRjKCk7CisJCQlSRVRVUk4oVEJBQ0tHTkQpOworCQljYXNlICd8JzoKKwkJCWlmIChwZ2V0YygpID09ICd8JykKKwkJCQlSRVRVUk4oVE9SKTsKKwkJCXB1bmdldGMoKTsKKwkJCVJFVFVSTihUUElQRSk7CisJCWNhc2UgJzsnOgorCQkJaWYgKHBnZXRjKCkgPT0gJzsnKQorCQkJCVJFVFVSTihURU5EQ0FTRSk7CisJCQlwdW5nZXRjKCk7CisJCQlSRVRVUk4oVFNFTUkpOworCQljYXNlICcoJzoKKwkJCVJFVFVSTihUTFApOworCQljYXNlICcpJzoKKwkJCVJFVFVSTihUUlApOworCQlkZWZhdWx0OgorCQkJZ290byBicmVha2xvb3A7CisJCX0KKwl9CisgYnJlYWtsb29wOgorCXJldHVybiByZWFkdG9rZW4xKGMsIEJBU0VTWU5UQVgsIChjaGFyICopTlVMTCwgMCk7CisjdW5kZWYgUkVUVVJOCit9CisjZW5kaWYgLyogb2xkIHh4cmVhZHRva2VuICovCisKK3N0YXRpYyBpbnQKK3JlYWR0b2tlbih2b2lkKQoreworCWludCB0OworI2lmIERFQlVHCisJc21hbGxpbnQgYWxyZWFkeXNlZW4gPSB0b2twdXNoYmFjazsKKyNlbmRpZgorCisjaWYgRU5BQkxFX0FTSF9BTElBUworIHRvcDoKKyNlbmRpZgorCisJdCA9IHh4cmVhZHRva2VuKCk7CisKKwkvKgorCSAqIGVhdCBuZXdsaW5lcworCSAqLworCWlmIChjaGVja2t3ZCAmIENIS05MKSB7CisJCXdoaWxlICh0ID09IFROTCkgeworCQkJcGFyc2VoZXJlZG9jKCk7CisJCQl0ID0geHhyZWFkdG9rZW4oKTsKKwkJfQorCX0KKworCWlmICh0ICE9IFRXT1JEIHx8IHF1b3RlZmxhZykgeworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIGNoZWNrIGZvciBrZXl3b3JkcworCSAqLworCWlmIChjaGVja2t3ZCAmIENIS0tXRCkgeworCQljb25zdCBjaGFyICpjb25zdCAqcHA7CisKKwkJcHAgPSBmaW5ka3dkKHdvcmR0ZXh0KTsKKwkJaWYgKHBwKSB7CisJCQlsYXN0dG9rZW4gPSB0ID0gcHAgLSB0b2tuYW1lX2FycmF5OworCQkJVFJBQ0UoKCJrZXl3b3JkICclcycgcmVjb2duaXplZFxuIiwgdG9rbmFtZV9hcnJheVt0XSArIDEpKTsKKwkJCWdvdG8gb3V0OworCQl9CisJfQorCisJaWYgKGNoZWNra3dkICYgQ0hLQUxJQVMpIHsKKyNpZiBFTkFCTEVfQVNIX0FMSUFTCisJCXN0cnVjdCBhbGlhcyAqYXA7CisJCWFwID0gbG9va3VwYWxpYXMod29yZHRleHQsIDEpOworCQlpZiAoYXAgIT0gTlVMTCkgeworCQkJaWYgKCphcC0+dmFsKSB7CisJCQkJcHVzaHN0cmluZyhhcC0+dmFsLCBhcCk7CisJCQl9CisJCQlnb3RvIHRvcDsKKwkJfQorI2VuZGlmCisJfQorIG91dDoKKwljaGVja2t3ZCA9IDA7CisjaWYgREVCVUcKKwlpZiAoIWFscmVhZHlzZWVuKQorCQlUUkFDRSgoInRva2VuICclcycgJXNcbiIsIHRva25hbWVfYXJyYXlbdF0gKyAxLCB0ID09IFRXT1JEID8gd29yZHRleHQgOiAiIikpOworCWVsc2UKKwkJVFJBQ0UoKCJyZXJlYWQgdG9rZW4gJyVzJyAlc1xuIiwgdG9rbmFtZV9hcnJheVt0XSArIDEsIHQgPT0gVFdPUkQgPyB3b3JkdGV4dCA6ICIiKSk7CisjZW5kaWYKKwlyZXR1cm4gdDsKK30KKworc3RhdGljIGNoYXIKK25leHR0b2tlbl9lbmRzX2xpc3Qodm9pZCkKK3sKKwlpbnQgdDsKKworCXQgPSByZWFkdG9rZW4oKTsKKwl0b2twdXNoYmFjayA9IDE7CisJcmV0dXJuIHRva25hbWVfYXJyYXlbdF1bMF07Cit9CisKKy8qCisgKiBSZWFkIGFuZCBwYXJzZSBhIGNvbW1hbmQuICBSZXR1cm5zIE5PREVfRU9GIG9uIGVuZCBvZiBmaWxlLgorICogKE5VTEwgaXMgYSB2YWxpZCBwYXJzZSB0cmVlIGluZGljYXRpbmcgYSBibGFuayBsaW5lLikKKyAqLworc3RhdGljIHVuaW9uIG5vZGUgKgorcGFyc2VjbWQoaW50IGludGVyYWN0KQoreworCWludCB0OworCisJdG9rcHVzaGJhY2sgPSAwOworCWRvcHJvbXB0ID0gaW50ZXJhY3Q7CisJc2V0cHJvbXB0X2lmKGRvcHJvbXB0LCBkb3Byb21wdCk7CisJbmVlZHByb21wdCA9IDA7CisJdCA9IHJlYWR0b2tlbigpOworCWlmICh0ID09IFRFT0YpCisJCXJldHVybiBOT0RFX0VPRjsKKwlpZiAodCA9PSBUTkwpCisJCXJldHVybiBOVUxMOworCXRva3B1c2hiYWNrID0gMTsKKwlyZXR1cm4gbGlzdCgxKTsKK30KKworLyoKKyAqIElucHV0IGFueSBoZXJlIGRvY3VtZW50cy4KKyAqLworc3RhdGljIHZvaWQKK3BhcnNlaGVyZWRvYyh2b2lkKQoreworCXN0cnVjdCBoZXJlZG9jICpoZXJlOworCXVuaW9uIG5vZGUgKm47CisKKwloZXJlID0gaGVyZWRvY2xpc3Q7CisJaGVyZWRvY2xpc3QgPSBOVUxMOworCisJd2hpbGUgKGhlcmUpIHsKKwkJc2V0cHJvbXB0X2lmKG5lZWRwcm9tcHQsIDIpOworCQlyZWFkdG9rZW4xKHBnZXRjKCksIGhlcmUtPmhlcmUtPnR5cGUgPT0gTkhFUkUgPyBTUVNZTlRBWCA6IERRU1lOVEFYLAorCQkJCWhlcmUtPmVvZm1hcmssIGhlcmUtPnN0cmlwdGFicyk7CisJCW4gPSBzdHphbGxvYyhzaXplb2Yoc3RydWN0IG5hcmcpKTsKKwkJbi0+bmFyZy50eXBlID0gTkFSRzsKKwkJLypuLT5uYXJnLm5leHQgPSBOVUxMOyAtIHN0emFsbG9jIGRpZCBpdCAqLworCQluLT5uYXJnLnRleHQgPSB3b3JkdGV4dDsKKwkJbi0+bmFyZy5iYWNrcXVvdGUgPSBiYWNrcXVvdGVsaXN0OworCQloZXJlLT5oZXJlLT5uaGVyZS5kb2MgPSBuOworCQloZXJlID0gaGVyZS0+bmV4dDsKKwl9Cit9CisKKworLyoKKyAqIGNhbGxlZCBieSBlZGl0bGluZSAtLSBhbnkgZXhwYW5zaW9ucyB0byB0aGUgcHJvbXB0IHNob3VsZCBiZSBhZGRlZCBoZXJlLgorICovCisjaWYgRU5BQkxFX0FTSF9FWFBBTkRfUFJNVAorc3RhdGljIGNvbnN0IGNoYXIgKgorZXhwYW5kc3RyKGNvbnN0IGNoYXIgKnBzKQoreworCXVuaW9uIG5vZGUgbjsKKworCS8qIFhYWCBGaXggKGNoYXIgKikgY2FzdC4gSXQgX2lzXyBhIGJ1Zy4gcHMgaXMgdmFyaWFibGUncyB2YWx1ZSwKKwkgKiBhbmQgdG9rZW4gcHJvY2Vzc2luZyBfY2FuXyBhbHRlciBpdCAoZGVsZXRlIE5VTHMgZXRjKS4gKi8KKwlzZXRpbnB1dHN0cmluZygoY2hhciAqKXBzKTsKKwlyZWFkdG9rZW4xKHBnZXRjKCksIFBTU1lOVEFYLCBudWxsc3RyLCAwKTsKKwlwb3BmaWxlKCk7CisKKwluLm5hcmcudHlwZSA9IE5BUkc7CisJbi5uYXJnLm5leHQgPSBOVUxMOworCW4ubmFyZy50ZXh0ID0gd29yZHRleHQ7CisJbi5uYXJnLmJhY2txdW90ZSA9IGJhY2txdW90ZWxpc3Q7CisKKwlleHBhbmRhcmcoJm4sIE5VTEwsIEVYUF9RVU9URUQpOworCXJldHVybiBzdGFja2Jsb2NrKCk7Cit9CisjZW5kaWYKKworLyoKKyAqIEV4ZWN1dGUgYSBjb21tYW5kIG9yIGNvbW1hbmRzIGNvbnRhaW5lZCBpbiBhIHN0cmluZy4KKyAqLworc3RhdGljIGludAorZXZhbHN0cmluZyhjaGFyICpzLCBpbnQgbWFzaykKK3sKKwl1bmlvbiBub2RlICpuOworCXN0cnVjdCBzdGFja21hcmsgc21hcms7CisJaW50IHNraXA7CisKKwlzZXRpbnB1dHN0cmluZyhzKTsKKwlzZXRzdGFja21hcmsoJnNtYXJrKTsKKworCXNraXAgPSAwOworCXdoaWxlICgobiA9IHBhcnNlY21kKDApKSAhPSBOT0RFX0VPRikgeworCQlldmFsdHJlZShuLCAwKTsKKwkJcG9wc3RhY2ttYXJrKCZzbWFyayk7CisJCXNraXAgPSBldmFsc2tpcDsKKwkJaWYgKHNraXApCisJCQlicmVhazsKKwl9CisJcG9wZmlsZSgpOworCisJc2tpcCAmPSBtYXNrOworCWV2YWxza2lwID0gc2tpcDsKKwlyZXR1cm4gc2tpcDsKK30KKworLyoKKyAqIFRoZSBldmFsIGNvbW1hbmQuCisgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DCitldmFsY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqcDsKKwljaGFyICpjb25jYXQ7CisKKwlpZiAoYXJndlsxXSkgeworCQlwID0gYXJndlsxXTsKKwkJYXJndiArPSAyOworCQlpZiAoYXJndlswXSkgeworCQkJU1RBUlRTVEFDS1NUUihjb25jYXQpOworCQkJZm9yICg7OykgeworCQkJCWNvbmNhdCA9IHN0YWNrX3B1dHN0cihwLCBjb25jYXQpOworCQkJCXAgPSAqYXJndisrOworCQkJCWlmIChwID09IE5VTEwpCisJCQkJCWJyZWFrOworCQkJCVNUUFVUQygnICcsIGNvbmNhdCk7CisJCQl9CisJCQlTVFBVVEMoJ1wwJywgY29uY2F0KTsKKwkJCXAgPSBncmFic3RhY2tzdHIoY29uY2F0KTsKKwkJfQorCQlldmFsc3RyaW5nKHAsIH5TS0lQRVZBTCk7CisJfQorCXJldHVybiBleGl0c3RhdHVzOworfQorCisvKgorICogUmVhZCBhbmQgZXhlY3V0ZSBjb21tYW5kcy4KKyAqICJUb3AiIGlzIG5vbnplcm8gZm9yIHRoZSB0b3AgbGV2ZWwgY29tbWFuZCBsb29wOworICogaXQgdHVybnMgb24gcHJvbXB0aW5nIGlmIHRoZSBzaGVsbCBpcyBpbnRlcmFjdGl2ZS4KKyAqLworc3RhdGljIGludAorY21kbG9vcChpbnQgdG9wKQoreworCXVuaW9uIG5vZGUgKm47CisJc3RydWN0IHN0YWNrbWFyayBzbWFyazsKKwlpbnQgaW50ZXI7CisJaW50IG51bWVvZiA9IDA7CisKKwlUUkFDRSgoImNtZGxvb3AoJWQpIGNhbGxlZFxuIiwgdG9wKSk7CisJZm9yICg7OykgeworCQlpbnQgc2tpcDsKKworCQlzZXRzdGFja21hcmsoJnNtYXJrKTsKKyNpZiBKT0JTCisJCWlmIChkb2luZ19qb2JjdGwpCisJCQlzaG93am9icyhTSE9XX0NIQU5HRUR8U0hPV19TVERFUlIpOworI2VuZGlmCisJCWludGVyID0gMDsKKwkJaWYgKGlmbGFnICYmIHRvcCkgeworCQkJaW50ZXIrKzsKKwkJCWNoa21haWwoKTsKKwkJfQorCQluID0gcGFyc2VjbWQoaW50ZXIpOworI2lmIERFQlVHCisJCWlmIChERUJVRyA+IDIgJiYgZGVidWcgJiYgKG4gIT0gTk9ERV9FT0YpKQorCQkJc2hvd3RyZWUobik7CisjZW5kaWYKKwkJaWYgKG4gPT0gTk9ERV9FT0YpIHsKKwkJCWlmICghdG9wIHx8IG51bWVvZiA+PSA1MCkKKwkJCQlicmVhazsKKwkJCWlmICghc3RvcHBlZGpvYnMoKSkgeworCQkJCWlmICghSWZsYWcpCisJCQkJCWJyZWFrOworCQkJCW91dDJzdHIoIlxuVXNlIFwiZXhpdFwiIHRvIGxlYXZlIHNoZWxsLlxuIik7CisJCQl9CisJCQludW1lb2YrKzsKKwkJfSBlbHNlIGlmIChuZmxhZyA9PSAwKSB7CisJCQkvKiBqb2Jfd2FybmluZyBjYW4gb25seSBiZSAyLDEsMC4gSGVyZSAyLT4xLCAxLzAtPjAgKi8KKwkJCWpvYl93YXJuaW5nID4+PSAxOworCQkJbnVtZW9mID0gMDsKKwkJCWV2YWx0cmVlKG4sIDApOworCQl9CisJCXBvcHN0YWNrbWFyaygmc21hcmspOworCQlza2lwID0gZXZhbHNraXA7CisKKwkJaWYgKHNraXApIHsKKwkJCWV2YWxza2lwID0gMDsKKwkJCXJldHVybiBza2lwICYgU0tJUEVWQUw7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBUYWtlIGNvbW1hbmRzIGZyb20gYSBmaWxlLiAgVG8gYmUgY29tcGF0aWJsZSB3ZSBzaG91bGQgZG8gYSBwYXRoCisgKiBzZWFyY2ggZm9yIHRoZSBmaWxlLCB3aGljaCBpcyBuZWNlc3NhcnkgdG8gZmluZCBzdWItY29tbWFuZHMuCisgKi8KK3N0YXRpYyBjaGFyICoKK2ZpbmRfZG90X2ZpbGUoY2hhciAqbmFtZSkKK3sKKwljaGFyICpmdWxsbmFtZTsKKwljb25zdCBjaGFyICpwYXRoID0gcGF0aHZhbCgpOworCXN0cnVjdCBzdGF0IHN0YXRiOworCisJLyogZG9uJ3QgdHJ5IHRoaXMgZm9yIGFic29sdXRlIG9yIHJlbGF0aXZlIHBhdGhzICovCisJaWYgKHN0cmNocihuYW1lLCAnLycpKQorCQlyZXR1cm4gbmFtZTsKKworCS8qIElJUkMgc3RhbmRhcmRzIGRvIG5vdCBzYXkgd2hldGhlciAuIGlzIHRvIGJlIHNlYXJjaGVkLgorCSAqIEFuZCBpdCBpcyBldmVuIHNtYWxsZXIgdGhpcyB3YXksIG1ha2luZyBpdCB1bmNvbmRpdGlvbmFsIGZvciBub3c6CisJICovCisJaWYgKDEpIHsgLyogRU5BQkxFX0FTSF9CQVNIX0NPTVBBVCAqLworCQlmdWxsbmFtZSA9IG5hbWU7CisJCWdvdG8gdHJ5X2N1cl9kaXI7CisJfQorCisJd2hpbGUgKChmdWxsbmFtZSA9IHBhdGhfYWR2YW5jZSgmcGF0aCwgbmFtZSkpICE9IE5VTEwpIHsKKyB0cnlfY3VyX2RpcjoKKwkJaWYgKChzdGF0KGZ1bGxuYW1lLCAmc3RhdGIpID09IDApICYmIFNfSVNSRUcoc3RhdGIuc3RfbW9kZSkpIHsKKwkJCS8qCisJCQkgKiBEb24ndCBib3RoZXIgZnJlZWluZyBoZXJlLCBzaW5jZSBpdCB3aWxsCisJCQkgKiBiZSBmcmVlZCBieSB0aGUgY2FsbGVyLgorCQkJICovCisJCQlyZXR1cm4gZnVsbG5hbWU7CisJCX0KKwkJaWYgKGZ1bGxuYW1lICE9IG5hbWUpCisJCQlzdHVuYWxsb2MoZnVsbG5hbWUpOworCX0KKworCS8qIG5vdCBmb3VuZCBpbiB0aGUgUEFUSCAqLworCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCIlczogbm90IGZvdW5kIiwgbmFtZSk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQworZG90Y21kKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpmdWxsbmFtZTsKKwlzdHJ1Y3Qgc3RybGlzdCAqc3A7CisJdm9sYXRpbGUgc3RydWN0IHNocGFyYW0gc2F2ZXBhcmFtOworCisJZm9yIChzcCA9IGNtZGVudmlyb247IHNwOyBzcCA9IHNwLT5uZXh0KQorCQlzZXR2YXJlcShja3N0cmR1cChzcC0+dGV4dCksIFZTVFJGSVhFRCB8IFZURVhURklYRUQpOworCisJaWYgKCFhcmd2WzFdKSB7CisJCS8qIGJhc2ggc2F5czogImJhc2g6IC46IGZpbGVuYW1lIGFyZ3VtZW50IHJlcXVpcmVkIiAqLworCQlyZXR1cm4gMjsgLyogYmFzaCBjb21wYXQgKi8KKwl9CisKKwkvKiAiZmFsc2U7IC4gZW1wdHlfZmlsZTsgZWNobyAkPyIgc2hvdWxkIHByaW50IDAsIG5vdCAxOiAqLworCWV4aXRzdGF0dXMgPSAwOworCisJLyogVGhpcyBhYm9ydHMgaWYgZmlsZSBpc24ndCBmb3VuZCwgd2hpY2ggaXMgUE9TSVhseSBjb3JyZWN0LgorCSAqIGJhc2ggcmV0dXJucyBleGl0Y29kZSAxIGluc3RlYWQuCisJICovCisJZnVsbG5hbWUgPSBmaW5kX2RvdF9maWxlKGFyZ3ZbMV0pOworCWFyZ3YgKz0gMjsKKwlhcmdjIC09IDI7CisJaWYgKGFyZ2MpIHsgLyogYXJnYyA+IDAsIGFyZ3ZbMF0gIT0gTlVMTCAqLworCQlzYXZlcGFyYW0gPSBzaGVsbHBhcmFtOworCQlzaGVsbHBhcmFtLm1hbGxvY2VkID0gMDsKKwkJc2hlbGxwYXJhbS5ucGFyYW0gPSBhcmdjOworCQlzaGVsbHBhcmFtLnAgPSBhcmd2OworCX07CisKKwkvKiBUaGlzIGFib3J0cyBpZiBmaWxlIGNhbid0IGJlIG9wZW5lZCwgd2hpY2ggaXMgUE9TSVhseSBjb3JyZWN0LgorCSAqIGJhc2ggcmV0dXJucyBleGl0Y29kZSAxIGluc3RlYWQuCisJICovCisJc2V0aW5wdXRmaWxlKGZ1bGxuYW1lLCBJTlBVVF9QVVNIX0ZJTEUpOworCWNvbW1hbmRuYW1lID0gZnVsbG5hbWU7CisJY21kbG9vcCgwKTsKKwlwb3BmaWxlKCk7CisKKwlpZiAoYXJnYykgeworCQlmcmVlcGFyYW0oJnNoZWxscGFyYW0pOworCQlzaGVsbHBhcmFtID0gc2F2ZXBhcmFtOworCX07CisKKwlyZXR1cm4gZXhpdHN0YXR1czsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMKK2V4aXRjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpZiAoc3RvcHBlZGpvYnMoKSkKKwkJcmV0dXJuIDA7CisJaWYgKGFyZ3ZbMV0pCisJCWV4aXRzdGF0dXMgPSBudW1iZXIoYXJndlsxXSk7CisJcmFpc2VfZXhjZXB0aW9uKEVYRVhJVCk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisvKgorICogUmVhZCBhIGZpbGUgY29udGFpbmluZyBzaGVsbCBmdW5jdGlvbnMuCisgKi8KK3N0YXRpYyB2b2lkCityZWFkY21kZmlsZShjaGFyICpuYW1lKQoreworCXNldGlucHV0ZmlsZShuYW1lLCBJTlBVVF9QVVNIX0ZJTEUpOworCWNtZGxvb3AoMCk7CisJcG9wZmlsZSgpOworfQorCisKKy8qID09PT09PT09PT09PSBmaW5kX2NvbW1hbmQgaW5wbGVtZW50YXRpb24gKi8KKworLyoKKyAqIFJlc29sdmUgYSBjb21tYW5kIG5hbWUuICBJZiB5b3UgY2hhbmdlIHRoaXMgcm91dGluZSwgeW91IG1heSBoYXZlIHRvCisgKiBjaGFuZ2UgdGhlIHNoZWxsZXhlYyByb3V0aW5lIGFzIHdlbGwuCisgKi8KK3N0YXRpYyB2b2lkCitmaW5kX2NvbW1hbmQoY2hhciAqbmFtZSwgc3RydWN0IGNtZGVudHJ5ICplbnRyeSwgaW50IGFjdCwgY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3QgdGJsZW50cnkgKmNtZHA7CisJaW50IGlkeDsKKwlpbnQgcHJldjsKKwljaGFyICpmdWxsbmFtZTsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YjsKKwlpbnQgZTsKKwlpbnQgdXBkYXRldGJsOworCXN0cnVjdCBidWlsdGluY21kICpiY21kOworCisJLyogSWYgbmFtZSBjb250YWlucyBhIHNsYXNoLCBkb24ndCB1c2UgUEFUSCBvciBoYXNoIHRhYmxlICovCisJaWYgKHN0cmNocihuYW1lLCAnLycpICE9IE5VTEwpIHsKKwkJZW50cnktPnUuaW5kZXggPSAtMTsKKwkJaWYgKGFjdCAmIERPX0FCUykgeworCQkJd2hpbGUgKHN0YXQobmFtZSwgJnN0YXRiKSA8IDApIHsKKyNpZmRlZiBTWVNWCisJCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCQljb250aW51ZTsKKyNlbmRpZgorCQkJCWVudHJ5LT5jbWR0eXBlID0gQ01EVU5LTk9XTjsKKwkJCQlyZXR1cm47CisJCQl9CisJCX0KKwkJZW50cnktPmNtZHR5cGUgPSBDTUROT1JNQUw7CisJCXJldHVybjsKKwl9CisKKy8qICNpZiBFTkFCTEVfRkVBVFVSRV9TSF9TVEFOREFMT05FLi4uIG1vdmVkIGFmdGVyIGJ1aWx0aW4gY2hlY2sgKi8KKworCXVwZGF0ZXRibCA9IChwYXRoID09IHBhdGh2YWwoKSk7CisJaWYgKCF1cGRhdGV0YmwpIHsKKwkJYWN0IHw9IERPX0FMVFBBVEg7CisJCWlmIChzdHJzdHIocGF0aCwgIiVidWlsdGluIikgIT0gTlVMTCkKKwkJCWFjdCB8PSBET19BTFRCTFRJTjsKKwl9CisKKwkvKiBJZiBuYW1lIGlzIGluIHRoZSB0YWJsZSwgY2hlY2sgYW5zd2VyIHdpbGwgYmUgb2sgKi8KKwljbWRwID0gY21kbG9va3VwKG5hbWUsIDApOworCWlmIChjbWRwICE9IE5VTEwpIHsKKwkJaW50IGJpdDsKKworCQlzd2l0Y2ggKGNtZHAtPmNtZHR5cGUpIHsKKwkJZGVmYXVsdDoKKyNpZiBERUJVRworCQkJYWJvcnQoKTsKKyNlbmRpZgorCQljYXNlIENNRE5PUk1BTDoKKwkJCWJpdCA9IERPX0FMVFBBVEg7CisJCQlicmVhazsKKwkJY2FzZSBDTURGVU5DVElPTjoKKwkJCWJpdCA9IERPX05PRlVOQzsKKwkJCWJyZWFrOworCQljYXNlIENNREJVSUxUSU46CisJCQliaXQgPSBET19BTFRCTFRJTjsKKwkJCWJyZWFrOworCQl9CisJCWlmIChhY3QgJiBiaXQpIHsKKwkJCXVwZGF0ZXRibCA9IDA7CisJCQljbWRwID0gTlVMTDsKKwkJfSBlbHNlIGlmIChjbWRwLT5yZWhhc2ggPT0gMCkKKwkJCS8qIGlmIG5vdCBpbnZhbGlkYXRlZCBieSBjZCwgd2UncmUgZG9uZSAqLworCQkJZ290byBzdWNjZXNzOworCX0KKworCS8qIElmICVidWlsdGluIG5vdCBpbiBwYXRoLCBjaGVjayBmb3IgYnVpbHRpbiBuZXh0ICovCisJYmNtZCA9IGZpbmRfYnVpbHRpbihuYW1lKTsKKwlpZiAoYmNtZCkgeworCQlpZiAoSVNfQlVJTFRJTl9SRUdVTEFSKGJjbWQpKQorCQkJZ290byBidWlsdGluX3N1Y2Nlc3M7CisJCWlmIChhY3QgJiBET19BTFRQQVRIKSB7CisJCQlpZiAoIShhY3QgJiBET19BTFRCTFRJTikpCisJCQkJZ290byBidWlsdGluX3N1Y2Nlc3M7CisJCX0gZWxzZSBpZiAoYnVpbHRpbmxvYyA8PSAwKSB7CisJCQlnb3RvIGJ1aWx0aW5fc3VjY2VzczsKKwkJfQorCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX1NIX1NUQU5EQUxPTkUKKwl7CisJCWludCBhcHBsZXRfbm8gPSBmaW5kX2FwcGxldF9ieV9uYW1lKG5hbWUpOworCQlpZiAoYXBwbGV0X25vID49IDApIHsKKwkJCWVudHJ5LT5jbWR0eXBlID0gQ01ETk9STUFMOworCQkJZW50cnktPnUuaW5kZXggPSAtMiAtIGFwcGxldF9ubzsKKwkJCXJldHVybjsKKwkJfQorCX0KKyNlbmRpZgorCisJLyogV2UgaGF2ZSB0byBzZWFyY2ggcGF0aC4gKi8KKwlwcmV2ID0gLTE7ICAgICAgICAgICAgICAvKiB3aGVyZSB0byBzdGFydCAqLworCWlmIChjbWRwICYmIGNtZHAtPnJlaGFzaCkgeyAgICAgLyogZG9pbmcgYSByZWhhc2ggKi8KKwkJaWYgKGNtZHAtPmNtZHR5cGUgPT0gQ01EQlVJTFRJTikKKwkJCXByZXYgPSBidWlsdGlubG9jOworCQllbHNlCisJCQlwcmV2ID0gY21kcC0+cGFyYW0uaW5kZXg7CisJfQorCisJZSA9IEVOT0VOVDsKKwlpZHggPSAtMTsKKyBsb29wOgorCXdoaWxlICgoZnVsbG5hbWUgPSBwYXRoX2FkdmFuY2UoJnBhdGgsIG5hbWUpKSAhPSBOVUxMKSB7CisJCXN0dW5hbGxvYyhmdWxsbmFtZSk7CisJCS8qIE5COiBjb2RlIGJlbG93IHdpbGwgc3RpbGwgdXNlIGZ1bGxuYW1lCisJCSAqIGRlc3BpdGUgaXQgYmVpbmcgInVuYWxsb2NhdGVkIiAqLworCQlpZHgrKzsKKwkJaWYgKHBhdGhvcHQpIHsKKwkJCWlmIChwcmVmaXgocGF0aG9wdCwgImJ1aWx0aW4iKSkgeworCQkJCWlmIChiY21kKQorCQkJCQlnb3RvIGJ1aWx0aW5fc3VjY2VzczsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmICgoYWN0ICYgRE9fTk9GVU5DKQorCQkJIHx8ICFwcmVmaXgocGF0aG9wdCwgImZ1bmMiKQorCQkJKSB7ICAgICAvKiBpZ25vcmUgdW5pbXBsZW1lbnRlZCBvcHRpb25zICovCisJCQkJY29udGludWU7CisJCQl9CisJCX0KKwkJLyogaWYgcmVoYXNoLCBkb24ndCByZWRvIGFic29sdXRlIHBhdGggbmFtZXMgKi8KKwkJaWYgKGZ1bGxuYW1lWzBdID09ICcvJyAmJiBpZHggPD0gcHJldikgeworCQkJaWYgKGlkeCA8IHByZXYpCisJCQkJY29udGludWU7CisJCQlUUkFDRSgoInNlYXJjaGV4ZWMgXCIlc1wiOiBubyBjaGFuZ2VcbiIsIG5hbWUpKTsKKwkJCWdvdG8gc3VjY2VzczsKKwkJfQorCQl3aGlsZSAoc3RhdChmdWxsbmFtZSwgJnN0YXRiKSA8IDApIHsKKyNpZmRlZiBTWVNWCisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CisjZW5kaWYKKwkJCWlmIChlcnJubyAhPSBFTk9FTlQgJiYgZXJybm8gIT0gRU5PVERJUikKKwkJCQllID0gZXJybm87CisJCQlnb3RvIGxvb3A7CisJCX0KKwkJZSA9IEVBQ0NFUzsgICAgIC8qIGlmIHdlIGZhaWwsIHRoaXMgd2lsbCBiZSB0aGUgZXJyb3IgKi8KKwkJaWYgKCFTX0lTUkVHKHN0YXRiLnN0X21vZGUpKQorCQkJY29udGludWU7CisJCWlmIChwYXRob3B0KSB7ICAgICAgICAgIC8qIHRoaXMgaXMgYSAlZnVuYyBkaXJlY3RvcnkgKi8KKwkJCXN0YWxsb2Moc3RybGVuKGZ1bGxuYW1lKSArIDEpOworCQkJLyogTkI6IHN0YWxsb2Mgd2lsbCByZXR1cm4gc3BhY2UgcG9pbnRlZCBieSBmdWxsbmFtZQorCQkJICogKGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhbnkgaW50ZXJ2ZW5pbmcgYWxsb2NhdGlvbnMKKwkJCSAqIGJldHdlZW4gc3R1bmFsbG9jIGFib3ZlIGFuZCB0aGlzIHN0YWxsb2MpICovCisJCQlyZWFkY21kZmlsZShmdWxsbmFtZSk7CisJCQljbWRwID0gY21kbG9va3VwKG5hbWUsIDApOworCQkJaWYgKGNtZHAgPT0gTlVMTCB8fCBjbWRwLT5jbWR0eXBlICE9IENNREZVTkNUSU9OKQorCQkJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCIlcyBub3QgZGVmaW5lZCBpbiAlcyIsIG5hbWUsIGZ1bGxuYW1lKTsKKwkJCXN0dW5hbGxvYyhmdWxsbmFtZSk7CisJCQlnb3RvIHN1Y2Nlc3M7CisJCX0KKwkJVFJBQ0UoKCJzZWFyY2hleGVjIFwiJXNcIiByZXR1cm5zIFwiJXNcIlxuIiwgbmFtZSwgZnVsbG5hbWUpKTsKKwkJaWYgKCF1cGRhdGV0YmwpIHsKKwkJCWVudHJ5LT5jbWR0eXBlID0gQ01ETk9STUFMOworCQkJZW50cnktPnUuaW5kZXggPSBpZHg7CisJCQlyZXR1cm47CisJCX0KKwkJSU5UX09GRjsKKwkJY21kcCA9IGNtZGxvb2t1cChuYW1lLCAxKTsKKwkJY21kcC0+Y21kdHlwZSA9IENNRE5PUk1BTDsKKwkJY21kcC0+cGFyYW0uaW5kZXggPSBpZHg7CisJCUlOVF9PTjsKKwkJZ290byBzdWNjZXNzOworCX0KKworCS8qIFdlIGZhaWxlZC4gIElmIHRoZXJlIHdhcyBhbiBlbnRyeSBmb3IgdGhpcyBjb21tYW5kLCBkZWxldGUgaXQgKi8KKwlpZiAoY21kcCAmJiB1cGRhdGV0YmwpCisJCWRlbGV0ZV9jbWRfZW50cnkoKTsKKwlpZiAoYWN0ICYgRE9fRVJSKQorCQlhc2hfbXNnKCIlczogJXMiLCBuYW1lLCBlcnJtc2coZSwgIm5vdCBmb3VuZCIpKTsKKwllbnRyeS0+Y21kdHlwZSA9IENNRFVOS05PV047CisJcmV0dXJuOworCisgYnVpbHRpbl9zdWNjZXNzOgorCWlmICghdXBkYXRldGJsKSB7CisJCWVudHJ5LT5jbWR0eXBlID0gQ01EQlVJTFRJTjsKKwkJZW50cnktPnUuY21kID0gYmNtZDsKKwkJcmV0dXJuOworCX0KKwlJTlRfT0ZGOworCWNtZHAgPSBjbWRsb29rdXAobmFtZSwgMSk7CisJY21kcC0+Y21kdHlwZSA9IENNREJVSUxUSU47CisJY21kcC0+cGFyYW0uY21kID0gYmNtZDsKKwlJTlRfT047Cisgc3VjY2VzczoKKwljbWRwLT5yZWhhc2ggPSAwOworCWVudHJ5LT5jbWR0eXBlID0gY21kcC0+Y21kdHlwZTsKKwllbnRyeS0+dSA9IGNtZHAtPnBhcmFtOworfQorCisKKy8qID09PT09PT09PT09PSB0cmFwLmMgKi8KKworLyoKKyAqIFRoZSB0cmFwIGJ1aWx0aW4uCisgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DCit0cmFwY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCWNoYXIgKmFjdGlvbjsKKwljaGFyICoqYXA7CisJaW50IHNpZ25vLCBleGl0Y29kZTsKKworCW5leHRvcHQobnVsbHN0cik7CisJYXAgPSBhcmdwdHI7CisJaWYgKCEqYXApIHsKKwkJZm9yIChzaWdubyA9IDA7IHNpZ25vIDwgTlNJRzsgc2lnbm8rKykgeworCQkJY2hhciAqdHIgPSB0cmFwX3B0cltzaWdub107CisJCQlpZiAodHIpIHsKKwkJCQkvKiBub3RlOiBiYXNoIGFkZHMgIlNJRyIsIGJ1dCBvbmx5IGlmIGludm9rZWQKKwkJCQkgKiBhcyAiYmFzaCIuIElmIGNhbGxlZCBhcyAic2giLCBvciBpZiBzZXQgLW8gcG9zaXgsCisJCQkJICogdGhlbiBpdCBwcmludHMgc2hvcnQgc2lnbmFsIG5hbWVzLgorCQkJCSAqIFdlIGFyZSBwcmludGluZyBzaG9ydCBuYW1lczogKi8KKwkJCQlvdXQxZm10KCJ0cmFwIC0tICVzICVzXG4iLAorCQkJCQkJc2luZ2xlX3F1b3RlKHRyKSwKKwkJCQkJCWdldF9zaWduYW1lKHNpZ25vKSk7CisJCS8qIHRyYXBfcHRyICE9IHRyYXAgb25seSBpZiB3ZSBhcmUgaW4gc3BlY2lhbC1jYXNlZCBgdHJhcGAgY29kZS4KKwkJICogSW4gdGhpcyBjYXNlLCB3ZSB3aWxsIGV4aXQgdmVyeSBzb29uLCBubyBuZWVkIHRvIGZyZWUoKS4gKi8KKwkJCQkvKiBpZiAodHJhcF9wdHIgIT0gdHJhcCAmJiB0cFswXSkgKi8KKwkJCQkvKglmcmVlKHRyKTsgKi8KKwkJCX0KKwkJfQorCQkvKgorCQlpZiAodHJhcF9wdHIgIT0gdHJhcCkgeworCQkJZnJlZSh0cmFwX3B0cik7CisJCQl0cmFwX3B0ciA9IHRyYXA7CisJCX0KKwkJKi8KKwkJcmV0dXJuIDA7CisJfQorCisJYWN0aW9uID0gTlVMTDsKKwlpZiAoYXBbMV0pCisJCWFjdGlvbiA9ICphcCsrOworCWV4aXRjb2RlID0gMDsKKwl3aGlsZSAoKmFwKSB7CisJCXNpZ25vID0gZ2V0X3NpZ251bSgqYXApOworCQlpZiAoc2lnbm8gPCAwKSB7CisJCQkvKiBNaW1pYyBiYXNoIG1lc3NhZ2UgZXhhY3RseSAqLworCQkJYXNoX21zZygiJXM6IGludmFsaWQgc2lnbmFsIHNwZWNpZmljYXRpb24iLCAqYXApOworCQkJZXhpdGNvZGUgPSAxOworCQkJZ290byBuZXh0OworCQl9CisJCUlOVF9PRkY7CisJCWlmIChhY3Rpb24pIHsKKwkJCWlmIChMT05FX0RBU0goYWN0aW9uKSkKKwkJCQlhY3Rpb24gPSBOVUxMOworCQkJZWxzZQorCQkJCWFjdGlvbiA9IGNrc3RyZHVwKGFjdGlvbik7CisJCX0KKwkJZnJlZSh0cmFwW3NpZ25vXSk7CisJCWlmIChhY3Rpb24pCisJCQltYXlfaGF2ZV90cmFwcyA9IDE7CisJCXRyYXBbc2lnbm9dID0gYWN0aW9uOworCQlpZiAoc2lnbm8gIT0gMCkKKwkJCXNldHNpZ25hbChzaWdubyk7CisJCUlOVF9PTjsKKyBuZXh0OgorCQlhcCsrOworCX0KKwlyZXR1cm4gZXhpdGNvZGU7Cit9CisKKworLyogPT09PT09PT09PT09IEJ1aWx0aW5zICovCisKKyNpZiBFTkFCTEVfQVNIX0hFTFAKK3N0YXRpYyBpbnQgRkFTVF9GVU5DCitoZWxwY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXVuc2lnbmVkIGNvbDsKKwl1bnNpZ25lZCBpOworCisJb3V0MWZtdCgKKwkJIkJ1aWx0LWluIGNvbW1hbmRzOlxuIgorCQkiLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlmb3IgKGNvbCA9IDAsIGkgPSAwOyBpIDwgQVJSQVlfU0laRShidWlsdGludGFiKTsgaSsrKSB7CisJCWNvbCArPSBvdXQxZm10KCIlYyVzIiwgKChjb2wgPT0gMCkgPyAnXHQnIDogJyAnKSwKKwkJCQkJYnVpbHRpbnRhYltpXS5uYW1lICsgMSk7CisJCWlmIChjb2wgPiA2MCkgeworCQkJb3V0MWZtdCgiXG4iKTsKKwkJCWNvbCA9IDA7CisJCX0KKwl9CisjIGlmIEVOQUJMRV9GRUFUVVJFX1NIX1NUQU5EQUxPTkUKKwl7CisJCWNvbnN0IGNoYXIgKmEgPSBhcHBsZXRfbmFtZXM7CisJCXdoaWxlICgqYSkgeworCQkJY29sICs9IG91dDFmbXQoIiVjJXMiLCAoKGNvbCA9PSAwKSA/ICdcdCcgOiAnICcpLCBhKTsKKwkJCWlmIChjb2wgPiA2MCkgeworCQkJCW91dDFmbXQoIlxuIik7CisJCQkJY29sID0gMDsKKwkJCX0KKwkJCWEgKz0gc3RybGVuKGEpICsgMTsKKwkJfQorCX0KKyMgZW5kaWYKKwlvdXQxZm10KCJcblxuIik7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKyNlbmRpZgorCisjaWYgTUFYX0hJU1RPUlkKK3N0YXRpYyBpbnQgRkFTVF9GVU5DCitoaXN0b3J5Y21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXNob3dfaGlzdG9yeShsaW5lX2lucHV0X3N0YXRlKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorI2VuZGlmCisKKy8qCisgKiBUaGUgZXhwb3J0IGFuZCByZWFkb25seSBjb21tYW5kcy4KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMKK2V4cG9ydGNtZChpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB2YXIgKnZwOworCWNoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqcDsKKwljaGFyICoqYXB0cjsKKwljaGFyIG9wdDsKKwlpbnQgZmxhZzsKKwlpbnQgZmxhZ19vZmY7CisKKwkvKiAicmVhZG9ubHkiIGluIGJhc2ggYWNjZXB0cywgYnV0IGlnbm9yZXMgLW4uCisJICogV2UgZG8gdGhlIHNhbWU6IGl0IHNhdmVzIGEgY29uZGl0aW9uYWwgaW4gbmV4dG9wdCdzIHBhcmFtLgorCSAqLworCWZsYWdfb2ZmID0gMDsKKwl3aGlsZSAoKG9wdCA9IG5leHRvcHQoIm5wIikpICE9ICdcMCcpIHsKKwkJaWYgKG9wdCA9PSAnbicpCisJCQlmbGFnX29mZiA9IFZFWFBPUlQ7CisJfQorCWZsYWcgPSBWRVhQT1JUOworCWlmIChhcmd2WzBdWzBdID09ICdyJykgeworCQlmbGFnID0gVlJFQURPTkxZOworCQlmbGFnX29mZiA9IDA7IC8qIHJlYWRvbmx5IGlnbm9yZXMgLW4gKi8KKwl9CisJZmxhZ19vZmYgPSB+ZmxhZ19vZmY7CisKKwkvKmlmIChvcHRfcF9ub3Rfc3BlY2lmaWVkKSAtIGJhc2ggZG9lc250IGNoZWNrIHRoaXMuIFRyeSAiZXhwb3J0IC1wIE5BTUUiICovCisJeworCQlhcHRyID0gYXJncHRyOworCQluYW1lID0gKmFwdHI7CisJCWlmIChuYW1lKSB7CisJCQlkbyB7CisJCQkJcCA9IHN0cmNocihuYW1lLCAnPScpOworCQkJCWlmIChwICE9IE5VTEwpIHsKKwkJCQkJcCsrOworCQkJCX0gZWxzZSB7CisJCQkJCXZwID0gKmZpbmR2YXIoaGFzaHZhcihuYW1lKSwgbmFtZSk7CisJCQkJCWlmICh2cCkgeworCQkJCQkJdnAtPmZsYWdzID0gKCh2cC0+ZmxhZ3MgfCBmbGFnKSAmIGZsYWdfb2ZmKTsKKwkJCQkJCWNvbnRpbnVlOworCQkJCQl9CisJCQkJfQorCQkJCXNldHZhcihuYW1lLCBwLCAoZmxhZyAmIGZsYWdfb2ZmKSk7CisJCQl9IHdoaWxlICgobmFtZSA9ICorK2FwdHIpICE9IE5VTEwpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisKKwkvKiBObyBhcmd1bWVudHMuIFNob3cgdGhlIGxpc3Qgb2YgZXhwb3J0ZWQgb3IgcmVhZG9ubHkgdmFycy4KKwkgKiAtbiBpcyBpZ25vcmVkLgorCSAqLworCXNob3d2YXJzKGFyZ3ZbMF0sIGZsYWcsIDApOworCXJldHVybiAwOworfQorCisvKgorICogRGVsZXRlIGEgZnVuY3Rpb24gaWYgaXQgZXhpc3RzLgorICovCitzdGF0aWMgdm9pZAordW5zZXRmdW5jKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHRibGVudHJ5ICpjbWRwOworCisJY21kcCA9IGNtZGxvb2t1cChuYW1lLCAwKTsKKwlpZiAoY21kcCAhPSBOVUxMICYmIGNtZHAtPmNtZHR5cGUgPT0gQ01ERlVOQ1RJT04pCisJCWRlbGV0ZV9jbWRfZW50cnkoKTsKK30KKworLyoKKyAqIFRoZSB1bnNldCBidWlsdGluIGNvbW1hbmQuICBXZSB1bnNldCB0aGUgZnVuY3Rpb24gYmVmb3JlIHdlIHVuc2V0IHRoZQorICogdmFyaWFibGUgdG8gYWxsb3cgYSBmdW5jdGlvbiB0byBiZSB1bnNldCB3aGVuIHRoZXJlIGlzIGEgcmVhZG9ubHkgdmFyaWFibGUKKyAqIHdpdGggdGhlIHNhbWUgbmFtZS4KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMKK3Vuc2V0Y21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCWNoYXIgKiphcDsKKwlpbnQgaTsKKwlpbnQgZmxhZyA9IDA7CisJaW50IHJldCA9IDA7CisKKwl3aGlsZSAoKGkgPSBuZXh0b3B0KCJ2ZiIpKSAhPSAwKSB7CisJCWZsYWcgPSBpOworCX0KKworCWZvciAoYXAgPSBhcmdwdHI7ICphcDsgYXArKykgeworCQlpZiAoZmxhZyAhPSAnZicpIHsKKwkJCWkgPSB1bnNldHZhcigqYXApOworCQkJcmV0IHw9IGk7CisJCQlpZiAoIShpICYgMikpCisJCQkJY29udGludWU7CisJCX0KKwkJaWYgKGZsYWcgIT0gJ3YnKQorCQkJdW5zZXRmdW5jKCphcCk7CisJfQorCXJldHVybiByZXQgJiAxOworfQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB0aW1lc2NtZF9zdHJbXSBBTElHTjEgPSB7CisJJyAnLCAgb2Zmc2V0b2Yoc3RydWN0IHRtcywgdG1zX3V0aW1lKSwKKwknXG4nLCBvZmZzZXRvZihzdHJ1Y3QgdG1zLCB0bXNfc3RpbWUpLAorCScgJywgIG9mZnNldG9mKHN0cnVjdCB0bXMsIHRtc19jdXRpbWUpLAorCSdcbicsIG9mZnNldG9mKHN0cnVjdCB0bXMsIHRtc19jc3RpbWUpLAorCTAKK307CitzdGF0aWMgaW50IEZBU1RfRlVOQwordGltZXNjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJdW5zaWduZWQgbG9uZyBjbGtfdGNrLCBzLCB0OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKnA7CisJc3RydWN0IHRtcyBidWY7CisKKwljbGtfdGNrID0gYmJfY2xrX3RjaygpOworCXRpbWVzKCZidWYpOworCisJcCA9IHRpbWVzY21kX3N0cjsKKwlkbyB7CisJCXQgPSAqKGNsb2NrX3QgKikoKChjaGFyICopICZidWYpICsgcFsxXSk7CisJCXMgPSB0IC8gY2xrX3RjazsKKwkJdCA9IHQgJSBjbGtfdGNrOworCQlvdXQxZm10KCIlbHVtJWx1LiUwM2x1cyVjIiwKKwkJCXMgLyA2MCwgcyAlIDYwLAorCQkJKHQgKiAxMDAwKSAvIGNsa190Y2ssCisJCQlwWzBdKTsKKwkJcCArPSAyOworCX0gd2hpbGUgKCpwKTsKKworCXJldHVybiAwOworfQorCisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorLyoKKyAqIFRoZSBsZXQgYnVpbHRpbi4gUGFydGlhbGx5IHN0b2xlbiBmcm9tIEdOVSBCYXNoLCB0aGUgQm91cm5lIEFnYWluIFNIZWxsLgorICogQ29weXJpZ2h0IChDKSAxOTg3LCAxOTg5LCAxOTkxIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMyBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+CisgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DCitsZXRjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlhcml0aF90IGk7CisKKwlhcmd2Kys7CisJaWYgKCEqYXJndikKKwkJYXNoX21zZ19hbmRfcmFpc2VfZXJyb3IoImV4cHJlc3Npb24gZXhwZWN0ZWQiKTsKKwlkbyB7CisJCWkgPSBhc2hfYXJpdGgoKmFyZ3YpOworCX0gd2hpbGUgKCorK2FyZ3YpOworCisJcmV0dXJuICFpOworfQorI2VuZGlmCisKKy8qCisgKiBUaGUgcmVhZCBidWlsdGluLiBPcHRpb25zOgorICogICAgICAtciAgICAgICAgICAgICAgRG8gbm90IGludGVycHJldCAnXCcgc3BlY2lhbGx5CisgKiAgICAgIC1zICAgICAgICAgICAgICBUdXJuIG9mZiBlY2hvICh0dHkgb25seSkKKyAqICAgICAgLW4gTkNIQVJTICAgICAgIFJlYWQgTkNIQVJTIG1heAorICogICAgICAtcCBQUk9NUFQgICAgICAgRGlzcGxheSBQUk9NUFQgb24gc3RkZXJyIChpZiBpbnB1dCBpcyBmcm9tIHR0eSkKKyAqICAgICAgLXQgU0VDT05EUyAgICAgIFRpbWVvdXQgYWZ0ZXIgU0VDT05EUyAodHR5IG9yIHBpcGUgb25seSkKKyAqICAgICAgLXUgRkQgICAgICAgICAgIFJlYWQgZnJvbSBnaXZlbiBGRCBpbnN0ZWFkIG9mIGZkIDAKKyAqIFRoaXMgdXNlcyB1bmJ1ZmZlcmVkIGlucHV0LCB3aGljaCBtYXkgYmUgYXZvaWRhYmxlIGluIHNvbWUgY2FzZXMuCisgKiBUT0RPOiBiYXNoIGFsc28gaGFzOgorICogICAgICAtYSBBUlJBWSAgICAgICAgUmVhZCBpbnRvIGFycmF5WzBdLFsxXSxldGMKKyAqICAgICAgLWQgREVMSU0gICAgICAgIEVuZCBvbiBERUxJTSBjaGFyLCBub3QgbmV3bGluZQorICogICAgICAtZSAgICAgICAgICAgICAgVXNlIGxpbmUgZWRpdGluZyAodHR5IG9ubHkpCisgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DCityZWFkY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCWNoYXIgKm9wdF9uID0gTlVMTDsKKwljaGFyICpvcHRfcCA9IE5VTEw7CisJY2hhciAqb3B0X3QgPSBOVUxMOworCWNoYXIgKm9wdF91ID0gTlVMTDsKKwlpbnQgcmVhZF9mbGFncyA9IDA7CisJY29uc3QgY2hhciAqcjsKKwlpbnQgaTsKKworCXdoaWxlICgoaSA9IG5leHRvcHQoInA6dTpydDpuOnMiKSkgIT0gJ1wwJykgeworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSAncCc6CisJCQlvcHRfcCA9IG9wdGlvbmFyZzsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCW9wdF9uID0gb3B0aW9uYXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJcmVhZF9mbGFncyB8PSBCVUlMVElOX1JFQURfU0lMRU5UOworCQkJYnJlYWs7CisJCWNhc2UgJ3QnOgorCQkJb3B0X3QgPSBvcHRpb25hcmc7CisJCQlicmVhazsKKwkJY2FzZSAncic6CisJCQlyZWFkX2ZsYWdzIHw9IEJVSUxUSU5fUkVBRF9SQVc7CisJCQlicmVhazsKKwkJY2FzZSAndSc6CisJCQlvcHRfdSA9IG9wdGlvbmFyZzsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiAicmVhZCAtcyIgbmVlZHMgdG8gc2F2ZS9yZXN0b3JlIHRlcm1pb3MsIGNhbid0IGFsbG93IF5DCisJICogdG8ganVtcCBvdXQgb2YgaXQuCisJICovCisJSU5UX09GRjsKKwlyID0gc2hlbGxfYnVpbHRpbl9yZWFkKHNldHZhcjAsCisJCWFyZ3B0ciwKKwkJYmx0aW5sb29rdXAoIklGUyIpLCAvKiBjYW4gYmUgTlVMTCAqLworCQlyZWFkX2ZsYWdzLAorCQlvcHRfbiwKKwkJb3B0X3AsCisJCW9wdF90LAorCQlvcHRfdQorCSk7CisJSU5UX09OOworCisJaWYgKCh1aW50cHRyX3QpciA+IDEpCisJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKHIpOworCisJcmV0dXJuICh1aW50cHRyX3QpcjsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMKK3VtYXNrY21kKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXN0YXRpYyBjb25zdCBjaGFyIHBlcm11c2VyWzNdIEFMSUdOMSA9ICJvZ3UiOworCisJbW9kZV90IG1hc2s7CisJaW50IHN5bWJvbGljX21vZGUgPSAwOworCisJd2hpbGUgKG5leHRvcHQoIlMiKSAhPSAnXDAnKSB7CisJCXN5bWJvbGljX21vZGUgPSAxOworCX0KKworCUlOVF9PRkY7CisJbWFzayA9IHVtYXNrKDApOworCXVtYXNrKG1hc2spOworCUlOVF9PTjsKKworCWlmICgqYXJncHRyID09IE5VTEwpIHsKKwkJaWYgKHN5bWJvbGljX21vZGUpIHsKKwkJCWNoYXIgYnVmW3NpemVvZigiLHU9cnd4LGc9cnd4LG89cnd4IildOworCQkJY2hhciAqcCA9IGJ1ZjsKKwkJCWludCBpOworCisJCQlpID0gMjsKKwkJCWZvciAoOzspIHsKKwkJCQkqcCsrID0gJywnOworCQkJCSpwKysgPSBwZXJtdXNlcltpXTsKKwkJCQkqcCsrID0gJz0nOworCQkJCS8qIG1hc2sgaXMgMC4uMHV1dWdnZ29vby4gaT0yIHNlbGVjdHMgdXV1IGJpdHMgKi8KKwkJCQlpZiAoIShtYXNrICYgMDQwMCkpICpwKysgPSAncic7CisJCQkJaWYgKCEobWFzayAmIDAyMDApKSAqcCsrID0gJ3cnOworCQkJCWlmICghKG1hc2sgJiAwMTAwKSkgKnArKyA9ICd4JzsKKwkJCQltYXNrIDw8PSAzOworCQkJCWlmICgtLWkgPCAwKQorCQkJCQlicmVhazsKKwkJCX0KKwkJCSpwID0gJ1wwJzsKKwkJCXB1dHMoYnVmICsgMSk7CisJCX0gZWxzZSB7CisJCQlvdXQxZm10KCIlMDRvXG4iLCBtYXNrKTsKKwkJfQorCX0gZWxzZSB7CisJCWNoYXIgKm1vZGVzdHIgPSAqYXJncHRyOworICAgICAgICAgICAgICAgIC8qIG51bWVyaWMgdW1hc2tzIGFyZSB0YWtlbiBhcy1pcyAqLworICAgICAgICAgICAgICAgIC8qIHN5bWJvbGljIHVtYXNrcyBhcmUgaW52ZXJ0ZWQ6ICJ1bWFzayBhPXJ4IiBjYWxscyB1bWFzaygyMjIpICovCisJCWlmICghaXNkaWdpdChtb2Rlc3RyWzBdKSkKKwkJCW1hc2sgXj0gMDc3NzsKKwkJbWFzayA9IGJiX3BhcnNlX21vZGUobW9kZXN0ciwgbWFzayk7CisJCWlmICgodW5zaWduZWQpbWFzayA+IDA3NzcpIHsKKwkJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKCJpbGxlZ2FsIG1vZGU6ICVzIiwgbW9kZXN0cik7CisJCX0KKwkJaWYgKCFpc2RpZ2l0KG1vZGVzdHJbMF0pKQorCQkJbWFzayBePSAwNzc3OworCQl1bWFzayhtYXNrKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DCit1bGltaXRjbWQoaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlyZXR1cm4gc2hlbGxfYnVpbHRpbl91bGltaXQoYXJndik7Cit9CisKKy8qID09PT09PT09PT09PSBtYWluKCkgYW5kIGhlbHBlcnMgKi8KKworLyoKKyAqIENhbGxlZCB0byBleGl0IHRoZSBzaGVsbC4KKyAqLworc3RhdGljIHZvaWQKK2V4aXRzaGVsbCh2b2lkKQoreworCXN0cnVjdCBqbXBsb2MgbG9jOworCWNoYXIgKnA7CisJaW50IHN0YXR1czsKKworI2lmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkdfU0FWRV9PTl9FWElUCisJc2F2ZV9oaXN0b3J5KGxpbmVfaW5wdXRfc3RhdGUpOworI2VuZGlmCisKKwlzdGF0dXMgPSBleGl0c3RhdHVzOworCVRSQUNFKCgicGlkICVkLCBleGl0c2hlbGwoJWQpXG4iLCBnZXRwaWQoKSwgc3RhdHVzKSk7CisJaWYgKHNldGptcChsb2MubG9jKSkgeworCQlpZiAoZXhjZXB0aW9uX3R5cGUgPT0gRVhFWElUKQorLyogZGFzaCBidWc6IGl0IGp1c3QgZG9lcyBfZXhpdChleGl0c3RhdHVzKSBoZXJlCisgKiBidXQgd2UgaGF2ZSB0byBkbyBzZXRqb2JjdGwoMCkgZmlyc3QhCisgKiAoYnVnIGlzIHN0aWxsIG5vdCBmaXhlZCBpbiBkYXNoLTAuNS4zIC0gaWYgeW91IHJ1biBkYXNoCisgKiB1bmRlciBNaWRuaWdodCBDb21tYW5kZXIsIG9uIGV4aXQgZnJvbSBkYXNoIE1DIGlzIGJhY2tncm91bmRlZCkgKi8KKwkJCXN0YXR1cyA9IGV4aXRzdGF0dXM7CisJCWdvdG8gb3V0OworCX0KKwlleGNlcHRpb25faGFuZGxlciA9ICZsb2M7CisJcCA9IHRyYXBbMF07CisJaWYgKHApIHsKKwkJdHJhcFswXSA9IE5VTEw7CisJCWV2YWxzdHJpbmcocCwgMCk7CisJCWZyZWUocCk7CisJfQorCWZsdXNoX3N0ZG91dF9zdGRlcnIoKTsKKyBvdXQ6CisJc2V0am9iY3RsKDApOworCV9leGl0KHN0YXR1cyk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCitzdGF0aWMgdm9pZAoraW5pdCh2b2lkKQoreworCS8qIGZyb20gaW5wdXQuYzogKi8KKwkvKiB3ZSB3aWxsIG5ldmVyIGZyZWUgdGhpcyAqLworCWJhc2VwZi5uZXh0X3RvX3BnZXRjID0gYmFzZXBmLmJ1ZiA9IGNrbWFsbG9jKElCVUZTSVopOworCisJLyogZnJvbSB0cmFwLmM6ICovCisJc2lnbmFsKFNJR0NITEQsIFNJR19ERkwpOworCS8qIGJhc2ggcmUtZW5hYmxlcyBTSUdIVVAgd2hpY2ggaXMgU0lHX0lHTmVkIG9uIGVudHJ5LgorCSAqIFRyeTogInRyYXAgJycgSFVQOyBiYXNoOyBlY2hvIFJFVCIgYW5kIHR5cGUgImtpbGwgLUhVUCAkJCIKKwkgKi8KKwlzaWduYWwoU0lHSFVQLCBTSUdfREZMKTsKKworCS8qIGZyb20gdmFyLmM6ICovCisJeworCQljaGFyICoqZW52cDsKKwkJY29uc3QgY2hhciAqcDsKKwkJc3RydWN0IHN0YXQgc3QxLCBzdDI7CisKKwkJaW5pdHZhcigpOworCQlmb3IgKGVudnAgPSBlbnZpcm9uOyBlbnZwICYmICplbnZwOyBlbnZwKyspIHsKKwkJCWlmIChzdHJjaHIoKmVudnAsICc9JykpIHsKKwkJCQlzZXR2YXJlcSgqZW52cCwgVkVYUE9SVHxWVEVYVEZJWEVEKTsKKwkJCX0KKwkJfQorCisJCXNldHZhcjAoIlBQSUQiLCB1dG9hKGdldHBwaWQoKSkpOworI2lmIEVOQUJMRV9BU0hfQkFTSF9DT01QQVQKKwkJcCA9IGxvb2t1cHZhcigiU0hMVkwiKTsKKwkJc2V0dmFyKCJTSExWTCIsIHV0b2EoKHAgPyBhdG9pKHApIDogMCkgKyAxKSwgVkVYUE9SVCk7CisJCWlmICghbG9va3VwdmFyKCJIT1NUTkFNRSIpKSB7CisJCQlzdHJ1Y3QgdXRzbmFtZSB1dHM7CisJCQl1bmFtZSgmdXRzKTsKKwkJCXNldHZhcjAoIkhPU1ROQU1FIiwgdXRzLm5vZGVuYW1lKTsKKwkJfQorI2VuZGlmCisJCXAgPSBsb29rdXB2YXIoIlBXRCIpOworCQlpZiAocCkgeworCQkJaWYgKCpwICE9ICcvJyB8fCBzdGF0KHAsICZzdDEpIHx8IHN0YXQoIi4iLCAmc3QyKQorCQkJIHx8IHN0MS5zdF9kZXYgIT0gc3QyLnN0X2RldiB8fCBzdDEuc3RfaW5vICE9IHN0Mi5zdF9pbm8KKwkJCSkgeworCQkJCXAgPSAnXDAnOworCQkJfQorCQl9CisJCXNldHB3ZChwLCAwKTsKKwl9Cit9CisKKworLy91c2FnZTojZGVmaW5lIGFzaF90cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiWy0vK09QVElPTlNdIFstLytvIE9QVF0uLi4gWy1jICdTQ1JJUFQnIFtBUkcwIFtBUkdTXV0gLyBGSUxFIFtBUkdTXV0iCisvL3VzYWdlOiNkZWZpbmUgYXNoX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOgkiVW5peCBzaGVsbCBpbnRlcnByZXRlciIKKworLy91c2FnZTojaWYgRU5BQkxFX0ZFQVRVUkVfU0hfSVNfQVNICisvL3VzYWdlOiMgZGVmaW5lIHNoX3RyaXZpYWxfdXNhZ2UgYXNoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6IyBkZWZpbmUgc2hfZnVsbF91c2FnZSAgICBhc2hfZnVsbF91c2FnZQorLy91c2FnZTojZW5kaWYKKy8vdXNhZ2U6I2lmIEVOQUJMRV9GRUFUVVJFX0JBU0hfSVNfQVNICisvL3VzYWdlOiMgZGVmaW5lIGJhc2hfdHJpdmlhbF91c2FnZSBhc2hfdHJpdmlhbF91c2FnZQorLy91c2FnZTojIGRlZmluZSBiYXNoX2Z1bGxfdXNhZ2UgICAgYXNoX2Z1bGxfdXNhZ2UKKy8vdXNhZ2U6I2VuZGlmCisKKy8qCisgKiBQcm9jZXNzIHRoZSBzaGVsbCBjb21tYW5kIGxpbmUgYXJndW1lbnRzLgorICovCitzdGF0aWMgdm9pZAorcHJvY2FyZ3MoY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisJY29uc3QgY2hhciAqeG1pbnVzYzsKKwljaGFyICoqeGFyZ3Y7CisKKwl4YXJndiA9IGFyZ3Y7CisJYXJnMCA9IHhhcmd2WzBdOworCS8qIGlmICh4YXJndlswXSkgLSBtbW0sIHRoaXMgaXMgYWx3YXlzIHRydWUhICovCisJCXhhcmd2Kys7CisJZm9yIChpID0gMDsgaSA8IE5PUFRTOyBpKyspCisJCW9wdGxpc3RbaV0gPSAyOworCWFyZ3B0ciA9IHhhcmd2OworCWlmIChvcHRpb25zKC8qY21kbGluZToqLyAxKSkgeworCQkvKiBpdCBhbHJlYWR5IHByaW50ZWQgZXJyIG1lc3NhZ2UgKi8KKwkJcmFpc2VfZXhjZXB0aW9uKEVYRVJST1IpOworCX0KKwl4YXJndiA9IGFyZ3B0cjsKKwl4bWludXNjID0gbWludXNjOworCWlmICgqeGFyZ3YgPT0gTlVMTCkgeworCQlpZiAoeG1pbnVzYykKKwkJCWFzaF9tc2dfYW5kX3JhaXNlX2Vycm9yKGJiX21zZ19yZXF1aXJlc19hcmcsICItYyIpOworCQlzZmxhZyA9IDE7CisJfQorCWlmIChpZmxhZyA9PSAyICYmIHNmbGFnID09IDEgJiYgaXNhdHR5KDApICYmIGlzYXR0eSgxKSkKKwkJaWZsYWcgPSAxOworCWlmIChtZmxhZyA9PSAyKQorCQltZmxhZyA9IGlmbGFnOworCWZvciAoaSA9IDA7IGkgPCBOT1BUUzsgaSsrKQorCQlpZiAob3B0bGlzdFtpXSA9PSAyKQorCQkJb3B0bGlzdFtpXSA9IDA7CisjaWYgREVCVUcgPT0gMgorCWRlYnVnID0gMTsKKyNlbmRpZgorCS8qIFBPU0lYIDEwMDMuMjogZmlyc3QgYXJnIGFmdGVyIC1jIGNtZCBpcyAkMCwgcmVtYWluZGVyICQxLi4uICovCisJaWYgKHhtaW51c2MpIHsKKwkJbWludXNjID0gKnhhcmd2Kys7CisJCWlmICgqeGFyZ3YpCisJCQlnb3RvIHNldGFyZzA7CisJfSBlbHNlIGlmICghc2ZsYWcpIHsKKwkJc2V0aW5wdXRmaWxlKCp4YXJndiwgMCk7Cisgc2V0YXJnMDoKKwkJYXJnMCA9ICp4YXJndisrOworCQljb21tYW5kbmFtZSA9IGFyZzA7CisJfQorCisJc2hlbGxwYXJhbS5wID0geGFyZ3Y7CisjaWYgRU5BQkxFX0FTSF9HRVRPUFRTCisJc2hlbGxwYXJhbS5vcHRpbmQgPSAxOworCXNoZWxscGFyYW0ub3B0b2ZmID0gLTE7CisjZW5kaWYKKwkvKiBhc3NlcnQoc2hlbGxwYXJhbS5tYWxsb2NlZCA9PSAwICYmIHNoZWxscGFyYW0ubnBhcmFtID09IDApOyAqLworCXdoaWxlICgqeGFyZ3YpIHsKKwkJc2hlbGxwYXJhbS5ucGFyYW0rKzsKKwkJeGFyZ3YrKzsKKwl9CisJb3B0c2NoYW5nZWQoKTsKK30KKworLyoKKyAqIFJlYWQgL2V0Yy9wcm9maWxlIG9yIC5wcm9maWxlLgorICovCitzdGF0aWMgdm9pZAorcmVhZF9wcm9maWxlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJaW50IHNraXA7CisKKwlpZiAoc2V0aW5wdXRmaWxlKG5hbWUsIElOUFVUX1BVU0hfRklMRSB8IElOUFVUX05PRklMRV9PSykgPCAwKQorCQlyZXR1cm47CisJc2tpcCA9IGNtZGxvb3AoMCk7CisJcG9wZmlsZSgpOworCWlmIChza2lwKQorCQlleGl0c2hlbGwoKTsKK30KKworLyoKKyAqIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgd2hlbiBhbiBlcnJvciBvciBhbiBpbnRlcnJ1cHQgb2NjdXJzIGluIGFuCisgKiBpbnRlcmFjdGl2ZSBzaGVsbCBhbmQgY29udHJvbCBpcyByZXR1cm5lZCB0byB0aGUgbWFpbiBjb21tYW5kIGxvb3AuCisgKi8KK3N0YXRpYyB2b2lkCityZXNldCh2b2lkKQoreworCS8qIGZyb20gZXZhbC5jOiAqLworCWV2YWxza2lwID0gMDsKKwlsb29wbmVzdCA9IDA7CisJLyogZnJvbSBpbnB1dC5jOiAqLworCWdfcGFyc2VmaWxlLT5sZWZ0X2luX2J1ZmZlciA9IDA7CisJZ19wYXJzZWZpbGUtPmxlZnRfaW5fbGluZSA9IDA7ICAgICAgLyogY2xlYXIgaW5wdXQgYnVmZmVyICovCisJcG9wYWxsZmlsZXMoKTsKKwkvKiBmcm9tIHBhcnNlci5jOiAqLworCXRva3B1c2hiYWNrID0gMDsKKwljaGVja2t3ZCA9IDA7CisJLyogZnJvbSByZWRpci5jOiAqLworCWNsZWFycmVkaXIoLypkcm9wOiovIDApOworfQorCisjaWYgUFJPRklMRQorc3RhdGljIHNob3J0IHByb2ZpbGVfYnVmWzE2Mzg0XTsKK2V4dGVybiBpbnQgZXRleHQoKTsKKyNlbmRpZgorCisvKgorICogTWFpbiByb3V0aW5lLiAgV2UgaW5pdGlhbGl6ZSB0aGluZ3MsIHBhcnNlIHRoZSBhcmd1bWVudHMsIGV4ZWN1dGUKKyAqIHByb2ZpbGVzIGlmIHdlJ3JlIGEgbG9naW4gc2hlbGwsIGFuZCB0aGVuIGNhbGwgY21kbG9vcCB0byBleGVjdXRlCisgKiBjb21tYW5kcy4gIFRoZSBzZXRqbXAgY2FsbCBzZXRzIHVwIHRoZSBsb2NhdGlvbiB0byBqdW1wIHRvIHdoZW4gYW4KKyAqIGV4Y2VwdGlvbiBvY2N1cnMuICBXaGVuIGFuIGV4Y2VwdGlvbiBvY2N1cnMgdGhlIHZhcmlhYmxlICJzdGF0ZSIKKyAqIGlzIHVzZWQgdG8gZmlndXJlIG91dCBob3cgZmFyIHdlIGhhZCBnb3R0ZW4uCisgKi8KK2ludCBhc2hfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGFzaF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqc2hpbml0OworCXZvbGF0aWxlIHNtYWxsaW50IHN0YXRlOworCXN0cnVjdCBqbXBsb2Mgam1wbG9jOworCXN0cnVjdCBzdGFja21hcmsgc21hcms7CisKKwkvKiBJbml0aWFsaXplIGdsb2JhbCBkYXRhICovCisJSU5JVF9HX21pc2MoKTsKKwlJTklUX0dfbWVtc3RhY2soKTsKKwlJTklUX0dfdmFyKCk7CisjaWYgRU5BQkxFX0FTSF9BTElBUworCUlOSVRfR19hbGlhcygpOworI2VuZGlmCisJSU5JVF9HX2NtZHRhYmxlKCk7CisKKyNpZiBQUk9GSUxFCisJbW9uaXRvcig0LCBldGV4dCwgcHJvZmlsZV9idWYsIHNpemVvZihwcm9maWxlX2J1ZiksIDUwKTsKKyNlbmRpZgorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElORworCWxpbmVfaW5wdXRfc3RhdGUgPSBuZXdfbGluZV9pbnB1dF90KEZPUl9TSEVMTCB8IFdJVEhfUEFUSF9MT09LVVApOworI2VuZGlmCisJc3RhdGUgPSAwOworCWlmIChzZXRqbXAoam1wbG9jLmxvYykpIHsKKwkJc21hbGxpbnQgZTsKKwkJc21hbGxpbnQgczsKKworCQlyZXNldCgpOworCisJCWUgPSBleGNlcHRpb25fdHlwZTsKKwkJaWYgKGUgPT0gRVhFUlJPUikKKwkJCWV4aXRzdGF0dXMgPSAyOworCQlzID0gc3RhdGU7CisJCWlmIChlID09IEVYRVhJVCB8fCBzID09IDAgfHwgaWZsYWcgPT0gMCB8fCBzaGx2bCkgeworCQkJZXhpdHNoZWxsKCk7CisJCX0KKwkJaWYgKGUgPT0gRVhJTlQpIHsKKwkJCW5ld2xpbmVfYW5kX2ZsdXNoKHN0ZGVycik7CisJCX0KKworCQlwb3BzdGFja21hcmsoJnNtYXJrKTsKKwkJRk9SQ0VfSU5UX09OOyAvKiBlbmFibGUgaW50ZXJydXB0cyAqLworCQlpZiAocyA9PSAxKQorCQkJZ290byBzdGF0ZTE7CisJCWlmIChzID09IDIpCisJCQlnb3RvIHN0YXRlMjsKKwkJaWYgKHMgPT0gMykKKwkJCWdvdG8gc3RhdGUzOworCQlnb3RvIHN0YXRlNDsKKwl9CisJZXhjZXB0aW9uX2hhbmRsZXIgPSAmam1wbG9jOworI2lmIERFQlVHCisJb3BlbnRyYWNlKCk7CisJVFJBQ0UoKCJTaGVsbCBhcmdzOiAiKSk7CisJdHJhY2VfcHV0c19hcmdzKGFyZ3YpOworI2VuZGlmCisJcm9vdHBpZCA9IGdldHBpZCgpOworCisJaW5pdCgpOworCXNldHN0YWNrbWFyaygmc21hcmspOworCXByb2NhcmdzKGFyZ3YpOworCisJaWYgKGFyZ3ZbMF0gJiYgYXJndlswXVswXSA9PSAnLScpCisJCWlzbG9naW5zaCA9IDE7CisJaWYgKGlzbG9naW5zaCkgeworCQljb25zdCBjaGFyICpocDsKKworCQlzdGF0ZSA9IDE7CisJCXJlYWRfcHJvZmlsZSgiL2V0Yy9wcm9maWxlIik7Cisgc3RhdGUxOgorCQlzdGF0ZSA9IDI7CisJCWhwID0gbG9va3VwdmFyKCJIT01FIik7CisJCWlmIChocCkgeworCQkJaHAgPSBjb25jYXRfcGF0aF9maWxlKGhwLCAiLnByb2ZpbGUiKTsKKwkJCXJlYWRfcHJvZmlsZShocCk7CisJCQlmcmVlKChjaGFyKilocCk7CisJCX0KKwl9Cisgc3RhdGUyOgorCXN0YXRlID0gMzsKKwlpZiAoCisjaWZuZGVmIGxpbnV4CisJIGdldHVpZCgpID09IGdldGV1aWQoKSAmJiBnZXRnaWQoKSA9PSBnZXRlZ2lkKCkgJiYKKyNlbmRpZgorCSBpZmxhZworCSkgeworCQlzaGluaXQgPSBsb29rdXB2YXIoIkVOViIpOworCQlpZiAoc2hpbml0ICE9IE5VTEwgJiYgKnNoaW5pdCAhPSAnXDAnKSB7CisJCQlyZWFkX3Byb2ZpbGUoc2hpbml0KTsKKwkJfQorCX0KKyBzdGF0ZTM6CisJc3RhdGUgPSA0OworCWlmIChtaW51c2MpIHsKKwkJLyogZXZhbHN0cmluZyBwdXNoZXMgcGFyc2VmaWxlIHN0YWNrLgorCQkgKiBFbnN1cmUgd2UgZG9uJ3QgZmFsc2VseSBjbGFpbSB0aGF0IDAgKHN0ZGluKQorCQkgKiBpcyBvbmUgb2Ygc3RhY2tlZCBzb3VyY2UgZmRzLgorCQkgKiBUZXN0Y2FzZTogYXNoIC1jICdleGVjIDE+JjAnIG11c3Qgbm90IGNvbXBsYWluLiAqLworCQkvLyBpZiAoIXNmbGFnKSBnX3BhcnNlZmlsZS0+cGZfZmQgPSAtMTsKKwkJLy8gXl4gbm90IG5lY2Vzc2FyeSBzaW5jZSBub3cgd2Ugc3BlY2lhbC1jYXNlIGZkIDAKKwkJLy8gaW4gaXNfaGlkZGVuX2ZkKCkgdG8gbm90IGJlIGNvbnNpZGVyZWQgImhpZGRlbiBmZCIKKwkJZXZhbHN0cmluZyhtaW51c2MsIDApOworCX0KKworCWlmIChzZmxhZyB8fCBtaW51c2MgPT0gTlVMTCkgeworI2lmIE1BWF9ISVNUT1JZID4gMCAmJiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1NBVkVISVNUT1JZCisJCWlmIChpZmxhZykgeworCQkJY29uc3QgY2hhciAqaHAgPSBsb29rdXB2YXIoIkhJU1RGSUxFIik7CisJCQlpZiAoIWhwKSB7CisJCQkJaHAgPSBsb29rdXB2YXIoIkhPTUUiKTsKKwkJCQlpZiAoaHApIHsKKwkJCQkJaHAgPSBjb25jYXRfcGF0aF9maWxlKGhwLCAiLmFzaF9oaXN0b3J5Iik7CisJCQkJCXNldHZhcjAoIkhJU1RGSUxFIiwgaHApOworCQkJCQlmcmVlKChjaGFyKilocCk7CisJCQkJCWhwID0gbG9va3VwdmFyKCJISVNURklMRSIpOworCQkJCX0KKwkJCX0KKwkJCWlmIChocCkKKwkJCQlsaW5lX2lucHV0X3N0YXRlLT5oaXN0X2ZpbGUgPSBocDsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfU0hfSElTVEZJTEVTSVpFCisJCQlocCA9IGxvb2t1cHZhcigiSElTVEZJTEVTSVpFIik7CisJCQlsaW5lX2lucHV0X3N0YXRlLT5tYXhfaGlzdG9yeSA9IHNpemVfZnJvbV9ISVNURklMRVNJWkUoaHApOworIyBlbmRpZgorCQl9CisjZW5kaWYKKyBzdGF0ZTQ6IC8qIFhYWCA/Pz8gLSB3aHkgaXNuJ3QgdGhpcyBiZWZvcmUgdGhlICJpZiIgc3RhdGVtZW50ICovCisJCWNtZGxvb3AoMSk7CisJfQorI2lmIFBST0ZJTEUKKwltb25pdG9yKDApOworI2VuZGlmCisjaWZkZWYgR1BST0YKKwl7CisJCWV4dGVybiB2b2lkIF9tY2xlYW51cCh2b2lkKTsKKwkJX21jbGVhbnVwKCk7CisJfQorI2VuZGlmCisJVFJBQ0UoKCJFbmQgb2YgbWFpbiByZWFjaGVkXG4iKSk7CisJZXhpdHNoZWxsKCk7CisJLyogTk9UUkVBQ0hFRCAqLworfQorCisKKy8qLQorICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkxLCAxOTkzLCAxOTk0CisgKiAgICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfZG9jLnR4dCBiL3NoZWxsL2FzaF9kb2MudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYTQ0NDMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfZG9jLnR4dApAQCAtMCwwICsxLDEyMiBAQAorCVdhaXQgKyBzaWduYWxzCisKK1dlIGhhZCBzb21lIGJ1Z3MgaGVyZSB3aGljaCBhcmUgaGFyZCB0byB0ZXN0IGluIHRlc3RzdWl0ZS4KKworQnVnIDEyODAgKGh0dHA6Ly9idXN5Ym94Lm5ldC9idWdzL3ZpZXcucGhwP2lkPTEyODApOgord2FzIG1pc2JlaGF2aW5nIGluIGludGVyYWN0aXZlIGFzaC4gQ29ycmVjdCBiZWhhdmlvcjoKKworJCBzbGVlcCAyMCAmCiskIHdhaXQKK15DCiskIHdhaXQKK15DCiskIHdhaXQKK15DCisuLi4KKworCitCdWcgMTk4NCAoaHR0cDovL2J1c3lib3gubmV0L2J1Z3Mvdmlldy5waHA/aWQ9MTk4NCk6Cit0cmFwcyB3ZXJlIG5vdCB0cmlnZ2VyaW5nOgorCit0cmFwX2hhbmRsZXJfdXNyICgpIHsKKyAgICBlY2hvIHRyYXAgdXNyCit9Cit0cmFwX2hhbmRsZXJfaW50ICgpIHsKKyAgICBlY2hvIHRyYXAgaW50Cit9Cit0cmFwIHRyYXBfaGFuZGxlcl91c3IgVVNSMQordHJhcCB0cmFwX2hhbmRsZXJfaW50IElOVAorc2xlZXAgMzYwMCAmCitlY2hvICJQbGVhc2UgZG86IGtpbGwgLVVTUjEgJCQiCitlY2hvICJvcjoga2lsbCAtSU5UICQkIgord2hpbGUgdHJ1ZTsgZG8gd2FpdDsgZWNobyB3YWl0IGludGVycnVwdGVkOyBkb25lCisKKworQnVnIDE4OSAoaHR0cHM6Ly9idWdzLmJ1c3lib3gubmV0L3Nob3dfYnVnLmNnaT9pZD0xODkpCisKK2Z1bmMoKSB7CisgICAgc2xlZXAgMQorfQord2hpbGUgKHRydWUpOyBkbworICAgIGZ1bmMKKyAgICBlY2hvIExvb3BpbmcKK2RvbmUKKworXkMgd2FzIG9ic2VydmVkIHRvIG1ha2UgYXNoIHByb2Nlc3NlcyBnZW9tZXRyaWNhbGx5IG11bHRpcGx5ICghKSBpbnN0ZWFkCitvZiBleGl0aW5nLiAodHJ1ZSkgaW4gc3Vic2hlbGwgZG9lcyBub3Qgc2VlbSB0byBtYXR0ZXIsIGFzIGFub3RoZXIgdXNlcgorcmVwb3J0cyB0aGUgc2FtZSB3aXRoOgorCit0cmFwICJlY2hvIFVTUjEiIFVTUjEKK3doaWxlIHRydWU7IGRvCisgICAgZWNobyBTbGVlcGluZworICAgIHNsZWVwIDUKK2RvbmUKKworQ29tcGF0IG5vdGUuCitCYXNoIHZlcnNpb24gMy4yLjAoMSkgZXhpdHMgdGhpcyBzY3JpcHQgYXQgdGhlIHJlY2VpcHQgb2YgU0lHSU5UCitfb25seV8gaWYgaXQgaGFkIHR3byBsYXN0IGNoaWxkcmVuIGRpZSBmcm9tIGl0LgorVGhlIGZvbGxvd2luZyB0cmFjZSB3YXMgb2J0YWluZWQgd2hpbGUgcGVyaW9kaWNhbGx5IHJ1bm5pbmcKKyJraWxsYWxsIC1TSUdJTlQgc2xlZXA7IHNsZWVwIDAuMTsga2lsbCAtU0lHSU5UIDxiYXNoX1BJRD4iOgorCisyMzo0ODozMi4zNzY3MDcgY2xvbmUoLi4uKSA9IDEzNTI4CisyMzo0ODozMi4zODg3MDYgd2FpdHBpZCgtMSwgMHhmZmM4MzJlYywgMCkgPSA/IEVSRVNUQVJUU1lTIChUbyBiZSByZXN0YXJ0ZWQpCisyMzo0ODozMi40NTk3NjEgLS0tIFNJR0lOVCAoSW50ZXJydXB0KSBAIDAgKDApIC0tLQorICAgIGtpbGwgLVNJR0lOVCA8YmFzaF9QSUQ+IGlzIGlnbm9yZWQsIGJhY2sgdG8gd2FpdGluZzoKKzIzOjQ4OjMyLjQ2MzcwNiB3YWl0cGlkKC0xLCBbe1dJRkVYSVRFRChzKSAmJiBXRVhJVFNUQVRVUyhzKSA9PSAwfV0sIDApID0gMTM1MjgKKyAgICBzbGVlcCBleGl0ZWQgd2l0aCAwCisyMzo0ODozNy4zNzc1NTcgLS0tIFNJR0NITEQgKENoaWxkIGV4aXRlZCkgQCAwICgwKSAtLS0KKzIzOjQ4OjM3LjM3ODQ1MSBjbG9uZSguLi4pID0gMTM1MzgKKzIzOjQ4OjM3LjM5MDcwOCB3YWl0cGlkKC0xLCBbe1dJRlNJR05BTEVEKHMpICYmIFdURVJNU0lHKHMpID09IFNJR0lOVH1dLCAwKSA9IDEzNTM4CisgICAgc2xlZXAgd2FzIGtpbGxlZCBieSAia2lsbGFsbCAtU0lHSU5UIHNsZWVwIgorMjM6NDg6MzguNTIzOTQ0IC0tLSBTSUdDSExEIChDaGlsZCBleGl0ZWQpIEAgMCAoMCkgLS0tCisyMzo0ODozOC41MjQ4NjEgY2xvbmUoLi4uKSA9IDEzNTQyCisyMzo0ODozOC41Mzg3MDYgd2FpdHBpZCgtMSwgMHhmZmM4MzJlYywgMCkgPSA/IEVSRVNUQVJUU1lTIChUbyBiZSByZXN0YXJ0ZWQpCisyMzo0ODozOC42MjQ3NjEgLS0tIFNJR0lOVCAoSW50ZXJydXB0KSBAIDAgKDApIC0tLQorICAgIGtpbGwgLVNJR0lOVCA8YmFzaF9QSUQ+IGlzIGlnbm9yZWQsIGJhY2sgdG8gd2FpdGluZzoKKzIzOjQ4OjM4LjYyODcwNiB3YWl0cGlkKC0xLCBbe1dJRkVYSVRFRChzKSAmJiBXRVhJVFNUQVRVUyhzKSA9PSAwfV0sIDApID0gMTM1NDIKKyAgICBzbGVlcCBleGl0ZWQgd2l0aCAwCisyMzo0ODo0My41MjU2NzQgLS0tIFNJR0NITEQgKENoaWxkIGV4aXRlZCkgQCAwICgwKSAtLS0KKzIzOjQ4OjQzLjUyNjU2MyBjbG9uZSguLi4pID0gMTM1NDUKKzIzOjQ4OjQzLjUzODcwOSB3YWl0cGlkKC0xLCBbe1dJRlNJR05BTEVEKHMpICYmIFdURVJNU0lHKHMpID09IFNJR0lOVH1dLCAwKSA9IDEzNTQ1CisgICAgc2xlZXAgd2FzIGtpbGxlZCBieSAia2lsbGFsbCAtU0lHSU5UIHNsZWVwIgorMjM6NDg6NDQuNDY2ODQ4IC0tLSBTSUdDSExEIChDaGlsZCBleGl0ZWQpIEAgMCAoMCkgLS0tCisyMzo0ODo0NC40Njc3MzUgY2xvbmUoLi4uKSA9IDEzNTQ5CisyMzo0ODo0NC40ODE3MDYgd2FpdHBpZCgtMSwgMHhmZmM4MzJlYywgMCkgPSA/IEVSRVNUQVJUU1lTIChUbyBiZSByZXN0YXJ0ZWQpCisyMzo0ODo0NC41Njc3NTcgLS0tIFNJR0lOVCAoSW50ZXJydXB0KSBAIDAgKDApIC0tLQorICAgIGtpbGwgLVNJR0lOVCA8YmFzaF9QSUQ+IGlzIGlnbm9yZWQsIGJhY2sgdG8gd2FpdGluZzoKKzIzOjQ4OjQ0LjU3MTcwNiB3YWl0cGlkKC0xLCBbe1dJRkVYSVRFRChzKSAmJiBXRVhJVFNUQVRVUyhzKSA9PSAwfV0sIDApID0gMTM1NDkKKyAgICBzbGVlcCBleGl0ZWQgd2l0aCAwCisyMzo0ODo0OS40Njg1NTMgLS0tIFNJR0NITEQgKENoaWxkIGV4aXRlZCkgQCAwICgwKSAtLS0KKzIzOjQ4OjQ5LjQ2OTQ0NSBjbG9uZSguLi4pID0gMTM1NTEKKzIzOjQ4OjQ5LjQ4MTcwOCB3YWl0cGlkKC0xLCBbe1dJRlNJR05BTEVEKHMpICYmIFdURVJNU0lHKHMpID09IFNJR0lOVH1dLCAwKSA9IDEzNTUxCisgICAgc2xlZXAgd2FzIGtpbGxlZCBieSAia2lsbGFsbCAtU0lHSU5UIHNsZWVwIgorMjM6NDg6NTAuNTE1ODM3IC0tLSBTSUdDSExEIChDaGlsZCBleGl0ZWQpIEAgMCAoMCkgLS0tCisyMzo0ODo1MC41MTY3MTggY2xvbmUoLi4uKSA9IDEzNTU1CisyMzo0ODo1MC41MzA3MDYgd2FpdHBpZCgtMSwgMHhmZmM4MzJlYywgMCkgPSA/IEVSRVNUQVJUU1lTIChUbyBiZSByZXN0YXJ0ZWQpCisyMzo0ODo1MC42MTU3NjEgLS0tIFNJR0lOVCAoSW50ZXJydXB0KSBAIDAgKDApIC0tLQorICAgIGtpbGwgLVNJR0lOVCA8YmFzaF9QSUQ+IGlzIGlnbm9yZWQsIGJhY2sgdG8gd2FpdGluZzoKKzIzOjQ4OjUwLjYxOTcwNSB3YWl0cGlkKC0xLCBbe1dJRlNJR05BTEVEKHMpICYmIFdURVJNU0lHKHMpID09IFNJR0lOVH1dLCAwKSA9IDEzNTU1CisgICAgc2xlZXAgd2FzIGtpbGxlZCBieSAia2lsbGFsbCAtU0lHSU5UIHNsZWVwIi4KKyAgICBUaGlzIGlzIHRoZSBzZWNvbmQgb25lIGluIGEgcm93LiBLaWxsIG91cnNlbGY6CisyMzo0ODo1MS41MDQ2MDQga2lsbCgxMzUxNSwgU0lHSU5UKSAgICAgPSAwCisyMzo0ODo1MS41MDQ2ODkgLS0tIFNJR0lOVCAoSW50ZXJydXB0KSBAIDAgKDApIC0tLQorMjM6NDg6NTEuNTA0OTE1ICsrKyBraWxsZWQgYnkgU0lHSU5UICsrKworCitBcyBsb25nIGFzIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSAic2xlZXAgNSIgd2hpY2ggZXhpdGVkIHN1Y2Nlc3NmdWxseQorKG5vdCBraWxsZWQgYnkgU0lHSU5UKSwgYmFzaCBjb250aW51ZXMuIFRoaXMgaXMgbm90IGRvY3VtZW50ZWQgYW55d2hlcmUKK0FGQUlLUy4KKworV2h5IGtleWJvYXJkIF5DIGFjdHMgZGlmZmVyZW50bHk/CisKKzAwOjA4OjA3LjY1NTk4NSBjbG9uZSguLi4pID0gMTQyNzAKKzAwOjA4OjA3LjY2OTcwNyB3YWl0cGlkKC0xLCBbe1dJRkVYSVRFRChzKSAmJiBXRVhJVFNUQVRVUyhzKSA9PSAwfV0sIDApID0gMTQyNzAKKzAwOjA4OjEyLjY1Njg3MiAtLS0gU0lHQ0hMRCAoQ2hpbGQgZXhpdGVkKSBAIDAgKDApIC0tLQorMDA6MDg6MTIuNjU3NzQzIGNsb25lKC4uLikgPSAxNDI3MworMDA6MDg6MTIuNjcxNzA4IHdhaXRwaWQoLTEsIFt7V0lGU0lHTkFMRUQocykgJiYgV1RFUk1TSUcocykgPT0gU0lHSU5UfV0sIDApID0gMTQyNzMKKzAwOjA4OjEzLjgxMDc3OCAtLS0gU0lHSU5UIChJbnRlcnJ1cHQpIEAgMCAoMCkgLS0tCiswMDowODoxMy44MTg3MDUga2lsbCgxNDI2OSwgU0lHSU5UKSAgICAgPSAwCiswMDowODoxMy44MjAxMDMgLS0tIFNJR0lOVCAoSW50ZXJydXB0KSBAIDAgKDApIC0tLQorMDA6MDg6MTMuODIwOTI1ICsrKyBraWxsZWQgYnkgU0lHSU5UICsrKworCitQZXJoYXBzIGJlY2F1c2UgYXQgdGhlIG1vbWVudCBiYXNoIGdvdCBTSUdJTlQgaXQgaGFkIG5vIGNoaWxkcmVuPworKGl0IGRpZCBub3QgbWFuYWdlIHRvIHNwYXduIG5ldyBzbGVlcCB5ZXQsIHNlZSB0aGUgdHJhY2UpCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfcHRyX2hhY2suYyBiL3NoZWxsL2FzaF9wdHJfaGFjay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2OTg0MDgKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfcHRyX2hhY2suYwpAQCAtMCwwICsxLDI5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKK3N0cnVjdCBnbG9iYWxzX21pc2M7CitzdHJ1Y3QgZ2xvYmFsc19tZW1zdGFjazsKK3N0cnVjdCBnbG9iYWxzX3ZhcjsKKworI2lmbmRlZiBHQ0NfQ09NQklORQorCisvKiBXZSBjaGVhdCBoZXJlLiBUaGV5IGFyZSBkZWNsYXJlZCBhcyBjb25zdCBwdHIgaW4gYXNoLmMsCisgKiBidXQgaGVyZSB3ZSBtYWtlIHRoZW0gbGl2ZSBpbiBSL1cgbWVtb3J5ICovCitzdHJ1Y3QgZ2xvYmFsc19taXNjICAgICAqYXNoX3B0cl90b19nbG9iYWxzX21pc2M7CitzdHJ1Y3QgZ2xvYmFsc19tZW1zdGFjayAqYXNoX3B0cl90b19nbG9iYWxzX21lbXN0YWNrOworc3RydWN0IGdsb2JhbHNfdmFyICAgICAgKmFzaF9wdHJfdG9fZ2xvYmFsc192YXI7CisKKyNlbHNlCisKKy8qIGdjYyAtY29tYmluZSB3aWxsIHNlZSB0aHJvdWdoIGFuZCBjb21wbGFpbiAqLworLyogVXNpbmcgYWx0ZXJuYXRpdmUgbWV0aG9kIHdoaWNoIGlzIG1vcmUgbGlrZWx5IHRvIGJyZWFrCisgKiBvbiB3ZWlyZCBhcmNoaXRlY3R1cmVzLCBjb21waWxlcnMsIGxpbmtlcnMgYW5kIHNvIG9uICovCitzdHJ1Y3QgZ2xvYmFsc19taXNjICAgICAqY29uc3QgYXNoX3B0cl90b19nbG9iYWxzX21pc2MgX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24gKCIuZGF0YSIpKSk7CitzdHJ1Y3QgZ2xvYmFsc19tZW1zdGFjayAqY29uc3QgYXNoX3B0cl90b19nbG9iYWxzX21lbXN0YWNrIF9fYXR0cmlidXRlX18gKChzZWN0aW9uICgiLmRhdGEiKSkpOworc3RydWN0IGdsb2JhbHNfdmFyICAgICAgKmNvbnN0IGFzaF9wdHJfdG9fZ2xvYmFsc192YXIgX19hdHRyaWJ1dGVfXyAoKHNlY3Rpb24gKCIuZGF0YSIpKSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLWFsaWFzL2FsaWFzLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWFsaWFzL2FsaWFzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2NjdiMjEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtYWxpYXMvYWxpYXMucmlnaHQKQEAgLTAsMCArMSw0IEBACithbGlhczogMAorYWxpYXM6IDAKKy4vYWxpYXMudGVzdHM6IGxpbmUgMjU6IHFmb286IG5vdCBmb3VuZAorcXV1eApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLWFsaWFzL2FsaWFzLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWFsaWFzL2FsaWFzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhkMDdiMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtYWxpYXMvYWxpYXMudGVzdHMKQEAgLTAsMCArMSwzNyBAQAorIyBwbGFjZSBob2xkZXIgZm9yIGZ1dHVyZSBhbGlhcyB0ZXN0aW5nCisjYXNoIyBzaG9wdCAtcyBleHBhbmRfYWxpYXNlcworCisjIGFsaWFzL3VuYWxpYXMgdGVzdHMgb3JpZ2luYWxseSBpbiBidWlsdGlucy50ZXN0cworCit1bmFsaWFzIC1hCisjIHRoaXMgc2hvdWxkIHJldHVybiBzdWNjZXNzLCBhY2NvcmRpbmcgdG8gUE9TSVguMgorYWxpYXMKK2VjaG8gYWxpYXM6ICQ/CithbGlhcyBmb289YmFyCit1bmFsaWFzIGZvbworIyB0aGlzIGhhZCBiZXR0ZXIgcmV0dXJuIHN1Y2Nlc3MsIGFjY29yZGluZyB0byBQT1NJWC4yCithbGlhcworZWNobyBhbGlhczogJD8KKworIyBidWcgaW4gYWxsIHZlcnNpb25zIHRocm91Z2ggYmFzaC0yLjA1YgorCit1bmFsaWFzIHFmb28gcWJhciBxYmF6IHF1dXggMj4vZGV2L251bGwKKworYWxpYXMgcWZvbz1xYmFyCithbGlhcyBxYmFyPXFiYXoKK2FsaWFzIHFiYXo9cXV1eAorYWxpYXMgcXV1eD1xZm9vCisKK3Fmb28KKwordW5hbGlhcyBxZm9vIHFiYXIgcWJheiBxdXV4CisKK3VuYWxpYXMgLWEKKworYWxpYXMgZm9vPSdlY2hvICcKK2FsaWFzIGJhcj1iYXoKK2FsaWFzIGJhej1xdXV4CisKK2ZvbyBiYXIKKwordW5hbGlhcyBmb28gYmFyIGJhegpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL1JFQURNRS5hc2ggYi9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvUkVBRE1FLmFzaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGEyMmVmCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL1JFQURNRS5hc2gKQEAgLTAsMCArMSBAQAordGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgKCggKSkgY29uc3RydWN0cyBpbiBhc2gKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aC1iYXNoMS5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aC1iYXNoMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjYxZGExCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoLWJhc2gxLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorMQorMApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoLWJhc2gxLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoLWJhc2gxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmIzN2I3MzAKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgtYmFzaDEudGVzdHMKQEAgLTAsMCArMSw1IEBACisjIGNoZWNrcyBmb3IgW1sgXV0KKworIyAmJiBhbmQgfHwKK1tbIGEgJiYgIiIgXV07IGVjaG8gJD8KK1tbIGEgfHwgIiIgXV07IGVjaG8gJD8KZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aC1mb3IucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgtZm9yLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZGJjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgtZm9yLnJpZ2h0CkBAIC0wLDAgKzEsNzQgQEAKKzAKKzEKKzIKKzAKKzEKKzIKKzAKKzEKKzIKKzAKKzIKKzQKK2Z4IGlzIGEgZnVuY3Rpb24KK2Z4ICgpCit7CisgICAgaT0wOworICAgIGZvciAoKDE7IGkgPCAzOyBpKysgKSkKKyAgICBkbworICAgICAgICBlY2hvICRpOworICAgIGRvbmU7CisgICAgZm9yICgoaT0wOyAxOyBpKysgKSkKKyAgICBkbworICAgICAgICBpZiAoKCBpID49IDMgKSk7IHRoZW4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBmaTsKKyAgICAgICAgZWNobyAkaTsKKyAgICBkb25lOworICAgIGZvciAoKGk9MDsgaTwzOyAxKSkKKyAgICBkbworICAgICAgICBlY2hvICRpOworICAgICAgICAoKCBpKysgKSk7CisgICAgZG9uZTsKKyAgICBpPTA7CisgICAgZm9yICgoMTsgMTsgMSkpCisgICAgZG8KKyAgICAgICAgaWYgKCggaSA+IDIgKSk7IHRoZW4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBmaTsKKyAgICAgICAgZWNobyAkaTsKKyAgICAgICAgKCggaSsrICkpOworICAgIGRvbmU7CisgICAgaT0wOworICAgIGZvciAoKDE7IDE7IDEpKQorICAgIGRvCisgICAgICAgIGlmICgoIGkgPiAyICkpOyB0aGVuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZmk7CisgICAgICAgIGVjaG8gJGk7CisgICAgICAgICgoIGkrKyApKTsKKyAgICBkb25lCit9CiswCisxCisyCiswCisxCisyCiswCisxCisyCiswCisxCisyCiswCisxCisyCisuL2FyaXRoLWZvci50ZXN0czogbGluZSA3Nzogc3ludGF4IGVycm9yOiBhcml0aG1ldGljIGV4cHJlc3Npb24gcmVxdWlyZWQKKy4vYXJpdGgtZm9yLnRlc3RzOiBsaW5lIDc3OiBzeW50YXggZXJyb3I6IGAoKCBpPTA7ICJpIDwgMyIgKSknCisyCisuL2FyaXRoLWZvci50ZXN0czogbGluZSA4Mzogc3ludGF4IGVycm9yOiBgOycgdW5leHBlY3RlZAorLi9hcml0aC1mb3IudGVzdHM6IGxpbmUgODM6IHN5bnRheCBlcnJvcjogYCgoIGk9MDsgaSA8IDM7IGkrKzsgNyApKScKKzIKKzIwCisyMApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoLWZvci50ZXN0c3ggYi9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgtZm9yLnRlc3RzeApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZmEzMGZmCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoLWZvci50ZXN0c3gKQEAgLTAsMCArMSw5NCBAQAorZngoKQoreworaT0wCitmb3IgKCggOyBpIDwgMzsgaSsrICkpCitkbworCWVjaG8gJGkKK2RvbmUKKworZm9yICgoIGk9MDsgOyBpKysgKSkKK2RvCisJaWYgKCggaSA+PSAzICkpOyB0aGVuCisJCWJyZWFrOworCWZpCisJZWNobyAkaQorZG9uZQorCitmb3IgKCggaT0wOyBpPDM7ICkpCitkbworCWVjaG8gJGkKKwkoKCBpKysgKSkKK2RvbmUKKworaT0wCitmb3IgKCggOyA7ICkpCitkbworCWlmICgoIGkgPiAyICkpOyB0aGVuCisJCWJyZWFrOworCWZpCisJZWNobyAkaTsKKwkoKCBpKysgKSkKK2RvbmUKKworaT0wCitmb3IgKCg7OykpCitkbworCWlmICgoIGkgPiAyICkpOyB0aGVuCisJCWJyZWFrOworCWZpCisJZWNobyAkaTsKKwkoKCBpKysgKSkKK2RvbmUKK30KKworZm9yICgoIGk9MDsgImkgPCAzIiA7IGkrKyApKQorZG8KKwllY2hvICRpCitkb25lCisKK2k9MAorZm9yICgoIDsgImkgPCAzIjsgaSsrICkpCitkbworCWVjaG8gJGkKK2RvbmUKKworZm9yICgoIGk9MDsgOyBpKysgKSkKK2RvCisJaWYgKCggaSA+PSAzICkpOyB0aGVuCisJCWJyZWFrOworCWZpCisJZWNobyAkaQorZG9uZQorCitmb3IgKChpID0gMDsgO2krKyApKQorZG8KKwllY2hvICRpCisJaWYgKCggaSA8IDMgKSk7IHRoZW4KKwkJKCggaSsrICkpCisJCWNvbnRpbnVlOworCWZpCisJYnJlYWsKK2RvbmUKKwordHlwZSBmeAorZngKKworIyBlcnJvcnMKK2ZvciAoKCBpPTA7ICJpIDwgMyIgKSkKK2RvCisJZWNobyAkaQorZG9uZQorZWNobyAkPworCitmb3IgKCggaT0wOyBpIDwgMzsgaSsrOyA3ICkpCitkbworCWVjaG8gJGkKK2RvbmUKK2VjaG8gJD8KKworIyBvbmUtbGluZXJzIGFkZGVkIGluIHBvc3QtYmFzaC0yLjA0Citmb3IgICAgICgoaT0wOyBpIDwgMjA7IGkrKykpIGRvIDogOyBkb25lCitlY2hvICRpCisKK2ZvciAgICAgKChpPTA7IGkgPCAyMDsgaSsrKSkgeyA6IDsgfQorZWNobyAkaQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOWNhOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgucmlnaHQKQEAgLTAsMCArMSwxMzggQEAKK0Zvcm1hdDogJ2V4cGVjdGVkIGFjdHVhbCcKKzE2MyAxNjMKKzQgNAorMTYgMTYKKzggOAorMiAyCis0IDQKKzIgMgorMiAyCisxIDEKKzAgMAorMCAwCiswIDAKKzEgMQorMSAxCisyIDIKKy0zIC0zCistMiAtMgorMSAxCiswIDAKKzIgMgorMTMxMDcyIDEzMTA3MgorMjkgMjkKKzMzIDMzCis0OSA0OQorMSAxCisxIDEKKzAgMAorMCAwCisxIDEKKzEgMQorMSAxCisyIDIKKzMgMworMSAxCis1OCA1OAorMiAyCis2MCA2MAorMSAxCisyNTYgMjU2CisxNiAxNgorNjIgNjIKKzQgNAorMjkgMjkKKzUgNQorLTQgLTQKKzQgNAorMSAxCiszMiAzMgorMzIgMzIKKzEgMQorMSAxCiszMiAzMgorMjAgMjAKKzMwIDMwCisyMCAyMAorMzAgMzAKKy4vYXJpdGgudGVzdHM6IGxpbmUgMTE3OiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorNiA2Cis2LDUsMyA2LDUsMworMjYzIDI2MworMjU1IDI1NQorNDAgNDAKKy4vYXJpdGgudGVzdHM6IGxpbmUgMTYzOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorLi9hcml0aC50ZXN0czogbGluZSAxNjU6IGRpdmlkZSBieSB6ZXJvCisuL2FyaXRoLnRlc3RzOiBsZXQ6IGxpbmUgMTY2OiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorLi9hcml0aC50ZXN0czogbGluZSAxNjc6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCisuL2FyaXRoLnRlc3RzOiBsZXQ6IGxpbmUgMTY4OiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorYWJjCitkZWYKK2doaQorLi9hcml0aC50ZXN0czogbGluZSAxOTE6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCisxNiAxNgorLi9hcml0aC50ZXN0czogbGluZSAxOTY6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCisuL2FyaXRoLnRlc3RzOiBsaW5lIDE5NzogbWFsZm9ybWVkID86IG9wZXJhdG9yCisuL2FyaXRoLnRlc3RzOiBsaW5lIDE5ODogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKzkgOQorLi9hcml0aC50ZXN0czogbGluZSAyMDU6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCisuL2FyaXRoLnRlc3RzOiBsaW5lIDIwODogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKzkgOQorOSA5Cis5IDkKKzcgNworNworNCA0CiszMjc2NyAzMjc2NworMzI3NjggMzI3NjgKKzEzMTA3MiAxMzEwNzIKKzIxNDc0ODM2NDcgMjE0NzQ4MzY0NworMSAxCis0IDQKKzQgNAorNSA1Cis1IDUKKzQgNAorMyAzCiszIDMKKzQgNAorNCA0CisuL2FyaXRoLnRlc3RzOiBsaW5lIDI1NzogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKy4vYXJpdGgudGVzdHM6IGxpbmUgMjU5OiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorLi9hcml0aC50ZXN0czogbGluZSAyNjA6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCisuL2FyaXRoLnRlc3RzOiBsaW5lIDI2MjogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKy4vYXJpdGgudGVzdHM6IGxpbmUgMjYzOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorNCA0Cis3IDcKKy03IC03CisuL2FyaXRoMS5zdWI6IGxpbmUgMjogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKy4vYXJpdGgxLnN1YjogbGluZSAzOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorLi9hcml0aDEuc3ViOiBsaW5lIDQ6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCisuL2FyaXRoMS5zdWI6IGxpbmUgNTogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKzYgNgorMyAzCis3IDcKKzQgNAorMCAwCiszIDMKKzcgNworMiAyCistMiAtMgorMSAxCisuL2FyaXRoMS5zdWI6IGxpbmUgMzc6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCisuL2FyaXRoMi5zdWI6IGxpbmUgMjogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKy4vYXJpdGgyLnN1YjogbGluZSAzOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorLi9hcml0aDIuc3ViOiBsaW5lIDQ6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCisuL2FyaXRoMi5zdWI6IGxpbmUgNTogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKzUgNQorMSAxCis0IDQKKzAgMAorLi9hcml0aDIuc3ViOiBsaW5lIDQyOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorLi9hcml0aDIuc3ViOiBsaW5lIDQ3OiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorOCAxMgorLi9hcml0aC50ZXN0czogbGluZSAyOTA6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCis0MgorNDIKKzQyCisuL2FyaXRoLnRlc3RzOiBsaW5lIDMwMjogYVtiW2NdZF09ZTogbm90IGZvdW5kCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDY1NzU4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aC50ZXN0cwpAQCAtMCwwICsxLDMwMiBAQAorI2FzaCMgc2V0ICtvIHBvc2l4CisjYXNoIyBkZWNsYXJlIC1pIGl2IGp2CisKK2VjaG8gIkZvcm1hdDogJ2V4cGVjdGVkIGFjdHVhbCciCisKK2l2PSQoKCAzICsgNSAqIDMyICkpCitlY2hvIDE2MyAkaXYKKyNhc2gjIGl2PWl2KzMKKyNhc2gjIGVjaG8gMTY2ICRpdgoraXY9MgoranY9aXYKKworbGV0ICJqdiAqPSAyIgorZWNobyA0ICRqdgoranY9JCgoICRqdiA8PCAyICkpCitlY2hvIDE2ICRqdgorCitsZXQganY9IiRqdiAvIDIiCitlY2hvIDggJGp2CisjYXNoIyBqdj0ianYgPj4gMiIKKyAgICAgIGxldCBqdj0ianYgPj4gMiIKK2VjaG8gMiAkanYKKworaXY9JCgoaXYrICRqdikpCitlY2hvIDQgJGl2CitlY2hvIDIgJCgoaXYgLT0ganYpKQorZWNobyAyICRpdgorZWNobyAxICQoKCBpdiA9PSBqdiApKQorZWNobyAwICQoKCBpdiAhPSAkanYgKSkKK2VjaG8gMCAkKCggaXYgPCBqdiApKQorZWNobyAwICQoKCAkaXYgPiAkanYgKSkKK2VjaG8gMSAkKCggaXYgPD0gJGp2ICkpCitlY2hvIDEgJCgoICRpdiA+PSBqdiApKQorCitlY2hvIDIgJGp2CitlY2hvIC0zICQoKCB+JGp2ICkpCitlY2hvIC0yICQoKCB+MSApKQorZWNobyAxICQoKCAhIDAgKSkKKworZWNobyAwICQoKCBqdiAlIDIgKSkKK2VjaG8gMiAkKCggJGl2ICUgNCApKQorCitlY2hvIDEzMTA3MiAkKCggaXYgPDw9IDE2ICkpCitlY2hvIDI5ICQoKCBpdiAlPSAzMyApKQorCitlY2hvIDMzICQoKCAzMyAmIDU1ICkpCitlY2hvIDQ5ICQoKCAzMyB8IDE3ICkpCisKK2VjaG8gMSAkKCggaXYgJiYgJGp2ICkpCitlY2hvIDEgJCgoICRpdiB8fCBqdiApKQorCitlY2hvIDAgJCgoIGl2ICYmIDAgKSkKK2VjaG8gMCAkKCggaXYgJiAwICkpCitlY2hvIDEgJCgoIGl2ICYmIDEgKSkKK2VjaG8gMSAkKCggaXYgJiAxICkpCisKK2VjaG8gMSAkKCggJGp2IHx8IDAgKSkKK2VjaG8gMiAkKCgganYgfCAwICkpCitlY2hvIDMgJCgoIGp2IHwgMSApKQorZWNobyAxICQoKCAkanYgfHwgMSApKQorCitsZXQgJ2l2ICo9IGp2JworZWNobyA1OCAkaXYKK2VjaG8gMiAkanYKK2xldCAianYgKz0gJGl2IgorZWNobyA2MCAkanYKKworZWNobyAxICQoKCBqdiAvPSBpdiApKQorZWNobyAyNTYgJCgoIGp2IDw8PSA4ICkpCitlY2hvIDE2ICQoKCBqdiA+Pj0gNCApKQorCitlY2hvIDYyICQoKCBpdiB8PSA0ICkpCitlY2hvIDQgJCgoIGl2ICY9IDQgKSkKKworZWNobyAyOSAkKCggaXYgKz0gKGp2ICsgOSkpKQorZWNobyA1ICQoKCAoaXYgKyA0KSAlIDcgKSkKKworIyB1bmFyeSBwbHVzLCBtaW51cworZWNobyAtNCAkKCggKzQgLSA4ICkpCitlY2hvIDQgJCgoIC00ICsgOCApKQorCisjIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zCitlY2hvIDEgJCgoIDQ8NSA/IDEgOiAzMikpCitlY2hvIDMyICQoKCA0PjUgPyAxIDogMzIpKQorZWNobyAzMiAkKCggND4oMiszKSA/IDEgOiAzMikpCitlY2hvIDEgJCgoIDQ8KDIrMykgPyAxIDogMzIpKQorZWNobyAxICQoKCAoMisyKTwoMiszKSA/IDEgOiAzMikpCitlY2hvIDMyICQoKCAoMisyKT4oMiszKSA/IDEgOiAzMikpCisKKyMgY2hlY2sgdGhhdCB0aGUgdW5ldmFsdWF0ZWQgcGFydCBvZiB0aGUgdGVybmFyeSBvcGVyYXRvciBkb2VzIG5vdCBkbworIyBldmFsdWF0aW9uIG9yIGFzc2lnbm1lbnQKK3g9aSs9MgoreT1qKz0yCisjYXNoIyBkZWNsYXJlIC1pIGk9MSBqPTEKKyAgICAgIGk9MQorICAgICAgaj0xCitlY2hvIDIwICQoKDEgPyAyMCA6ICh4Kz0yKSkpCisjYXNoIyBlY2hvICRpLCR4ICAgICAgICAgICAgICMgYXNoIG1pc2hhbmRsZXMgdGhpcworZWNobyAzMCAkKCgwID8gKHkrPTIpIDogMzApKQorI2FzaCMgZWNobyAkaiwkeSAgICAgICAgICAgICAjIGFzaCBtaXNoYW5kbGVzIHRoaXMKKworeD1pKz0yCit5PWorPTIKKyNhc2gjIGRlY2xhcmUgLWkgaT0xIGo9MQorICAgICAgaT0xCisgICAgICBqPTEKK2VjaG8gMjAgJCgoMSA/IDIwIDogKHgrPTIpKSkKKyNhc2gjIGVjaG8gJGksJHggICAgICAgICAgICAgIyBhc2ggbWlzaGFuZGxlcyB0aGlzCitlY2hvIDMwICQoKDAgPyAoeSs9MikgOiAzMCkpCisjYXNoIyBlY2hvICRpLCR5ICAgICAgICAgICAgICMgYXNoIG1pc2hhbmRsZXMgdGhpcworCisjIGNoZWNrIHByZWNlZGVuY2Ugb2YgYXNzaWdubWVudCB2cy4gY29uZGl0aW9uYWwgb3BlcmF0b3IKKyMgc2hvdWxkIGJlIGFuIGVycm9yCisjYXNoIyBkZWNsYXJlIC1pIHg9MgorICAgICAgeD0yCisjYXNobm90ZSMgYmFzaCByZXBvcnRzIGVycm9yIGJ1dCBjb250aW51ZXMsIGFzaCBhYm9ydHMgLSB1c2luZyBzdWJzaGVsbCB0byAnZW11bGF0ZScgYmFzaDoKKyggIHk9JCgoMSA/IDIwIDogeCs9MikpICApCisKKyMgY2hlY2sgcHJlY2VkZW5jZSBvZiBhc3NpZ25tZW50IHZzLiBjb25kaXRpb25hbCBvcGVyYXRvcgorI2FzaCMgZGVjbGFyZSAtaSB4PTIKKyAgICAgIHg9MgorIyBhc2ggc2F5cyAibGluZSBOTk46IHN5bnRheCBlcnJvcjogMCA/IHgrPTIgOiAyMCIKKyNhc2gjIGVjaG8gMjAgJCgoMCA/IHgrPTIgOiAyMCkpCisKKyMgYXNzb2NpYXRpdml0eSBvZiBhc3NpZ25tZW50LW9wZXJhdG9yIG9wZXJhdG9yCisjYXNoIyBkZWNsYXJlIC1pIGk9MSBqPTIgaz0zCitpPTEKK2o9Mgoraz0zCitlY2hvIDYgJCgoaSArPSBqICs9IGspKQorZWNobyA2LDUsMyAkaSwkaiwkaworCisjIG9jdGFsLCBoZXgKK2VjaG8gMjYzICQoKCAweDEwMCB8IDAwNyApKQorZWNobyAyNTUgJCgoIDB4ZmYgKSkKKyNhc2gjIGVjaG8gMjU1ICQoKCAxNiNmZiApKQorI2FzaCMgZWNobyAxMjcgJCgoIDE2I0ZGLzIgKSkKKyNhc2gjIGVjaG8gMzYgJCgoIDgjNDQgKSkKKworZWNobyA0MCAkKCggOCBeIDMyICkpCisKKyNhc2gjICMgb3RoZXIgYmFzZXMKKyNhc2gjIGVjaG8gMTAgJCgoIDE2I2EgKSkKKyNhc2gjIGVjaG8gMTAgJCgoIDMyI2EgKSkKKyNhc2gjIGVjaG8gMTAgJCgoIDU2I2EgKSkKKyNhc2gjIGVjaG8gMTAgJCgoIDY0I2EgKSkKKyNhc2gjCisjYXNoIyBlY2hvIDEwICQoKCAxNiNBICkpCisjYXNoIyBlY2hvIDEwICQoKCAzMiNBICkpCisjYXNoIyBlY2hvIDM2ICQoKCA1NiNBICkpCisjYXNoIyBlY2hvIDM2ICQoKCA2NCNBICkpCisjYXNoIworI2FzaCMgZWNobyA2MiAkKCggNjQjQCApKQorI2FzaCMgZWNobyA2MyAkKCggNjQjXyApKQorCisjYXNoIyAjIHdlaXJkIGJhc2VzIChlcnJvcikKKyNhc2gjIGVjaG8gJCgoIDM0MjUjNTYgKSkKKworI2FzaCMgIyBtaXNzaW5nIG51bWJlciBhZnRlciBiYXNlCisjYXNoIyBlY2hvIDAgJCgoIDIjICkpCisKKyMgdGhlc2Ugc2hvdWxkIGdlbmVyYXRlIGVycm9ycworKCAgZWNobyAkKCggNyA9IDQzICkpICAgICAgKQorI2FzaCMgZWNobyAkKCggMiM0NCApKQorKCAgZWNobyAkKCggNDQgLyAwICkpICAgICAgKQorKCAgbGV0ICdqdiArPSAkaXYnICAgICAgICAgKQorKCAgZWNobyAkKCgganYgKz0gXCRpdiApKSAgKQorKCAgbGV0ICdydiA9IDcgKyAoNDMgKiA2JyAgKQorCisjYXNoIyAjIG1vcmUgZXJyb3JzCisjYXNoIyBkZWNsYXJlIC1pIGkKKyNhc2gjIGk9MCM0CisjYXNoIyBpPTIjMTEwIzExCisKKygoZWNobyBhYmM7IGVjaG8gZGVmOyk7IGVjaG8gZ2hpKQorCisjYXNoIyBpZiAoKCg0KzQpICsgKDQgKyA3KSkpOyB0aGVuCisjYXNoIyAJZWNobyBvaworI2FzaCMgZmkKKworI2FzaCMgKCgpKQkjIG1ha2Ugc3VyZSB0aGUgbnVsbCBleHByZXNzaW9uIHdvcmtzIE9LCisKKyNhc2gjIGE9KDAgMiA0IDYpCisjYXNoIyBlY2hvIDYgJCgoIGFbMV0gKyBhWzJdICkpCisjYXNoIyBlY2hvIDEgJCgoIChhWzFdICsgYVsyXSkgPT0gYVszXSApKQorI2FzaCMgKCggKGFbMV0gKyBhWzJdKSA9PSBhWzNdICkpIDsgZWNobyAwICQ/CisKKyMgdGVzdCBwdXNoaW5nIGFuZCBwb3BwaW5nIHRoZSBleHByZXNzaW9uIHN0YWNrCit1bnNldCBBCitBPSI0ICsgIgorKCAgZWNobyBBICQoKCAoIDQgKyBBICkgKyA0ICkpICApCitBPSIzICsgNSIKK2VjaG8gMTYgJCgoICggNCArIEEgKSArIDQgKSkKKworIyBiYWRseS1mb3JtZWQgY29uZGl0aW9uYWwgZXhwcmVzc2lvbnMKKyggIGVjaG8gJCgoIDQgPyA6ICRBICkpICApCisoICBlY2hvICQoKCAxID8gMjAgKSkgICAgKQorKCAgZWNobyAkKCggNCA/IDIwIDogKSkgICkKKworIyBwcmVjZWRlbmNlIGFuZCBzaG9ydC1jaXJjdWl0IGV2YWx1YXRpb24KK0I9OQorZWNobyA5ICRCCisKKyMgZXJyb3IKKyggIGVjaG8gJCgoIDAgJiYgQj00MiApKTsgZWNobyA5ICRCICApCisKKyMgZXJyb3IKKyggIGVjaG8gJCgoIDEgfHwgQj04OCApKTsgZWNobyA5ICRCICApCisKKyMgYXNoIG1pc3Rha2VubHkgZXZhbHVhdGVzIEI9Li4uIGJlbG93CisjYXNoIyBlY2hvIDAgJCgoIDAgJiYgKEI9NDIpICkpCitlY2hvIDkgJEIKKyNhc2gjIGVjaG8gMCAkKCggKCR7JH0gLSAkJCkgJiYgKEI9NDIpICkpCitlY2hvIDkgJEIKKyNhc2gjIGVjaG8gMSAkKCggMSB8fCAoQj04OCkgKSkKK2VjaG8gOSAkQgorCisKKyMgdW50aWwgY29tbWFuZCB3aXRoICgoICkpIGNvbW1hbmQKK3g9NworCitlY2hvIDcgJHgKKyNhc2gjIHVudGlsICgoIHggPT0gNCApKQorICAgICAgdW50aWwgdGVzdCAiJHgiID0gNAorZG8KKwllY2hvICR4CisJeD00Citkb25lCisKK2VjaG8gNCAkeAorCisjIGV4cG9uZW50aWF0aW9uCitlY2hvIDMyNzY3ICQoKCAyKioxNSAtIDEpKQorZWNobyAzMjc2OCAkKCggMioqKDE2LTEpKSkKK2VjaG8gMTMxMDcyICQoKCAyKioxNioyICkpCitlY2hvIDIxNDc0ODM2NDcgJCgoIDIqKjMxLTEpKQorZWNobyAxICQoKCAyKiowICkpCisKKyMge3ByZSxwb3N0fS17aW5jLGRlY31yZW1lbnQgYW5kIGFzc29jaWF0ZWQgZXJyb3JzCisKK3g9NAorCitlY2hvIDQgJHgKK2VjaG8gNCAkKCggeCsrICkpCitlY2hvIDUgJHgKK2VjaG8gNSAkKCggeC0tICkpCitlY2hvIDQgJHgKKworZWNobyAzICQoKCAtLXggKSkKK2VjaG8gMyAkeAorCitlY2hvIDQgJCgoICsreCApKQorZWNobyA0ICR4CisKKyMgYmFzaCAzLjIgYXBwYXJlbnRseSB0aGlua3MgdGhhdCArKzcgaXMgNworI2FzaCMgZWNobyA3ICQoKCArKzcgKSkKKyggIGVjaG8gJCgoIDctLSApKSAgICApCisKKyggIGVjaG8gJCgoIC0teD03ICkpICApCisoICBlY2hvICQoKCArK3g9NyApKSAgKQorCisoICBlY2hvICQoKCB4Kys9NyApKSAgKQorKCAgZWNobyAkKCggeC0tPTcgKSkgICkKKworZWNobyA0ICR4CisKK2VjaG8gNyAkKCggKzcgKSkKK2VjaG8gLTcgJCgoIC03ICkpCisKKyMgYmFzaCAzLjIgYXBwYXJlbnRseSB0aGlua3MgdGhhdCArKzcgaXMgNworI2FzaCMgZWNobyAkKCggKys3ICkpCisjYXNoIyBlY2hvICQoKCAtLTcgKSkKKworJHtUSElTX1NIfSAuL2FyaXRoMS5zdWIKKyR7VEhJU19TSH0gLi9hcml0aDIuc3ViCisKK3g9NAoreT03CisKKyNhc2gjICgoIHg9OCAsIHk9MTIgKSkKKyAgICAgIHg9OAorICAgICAgeT0xMgorZWNobyAkeCAkeQorCisjYXNoIyAjIHNob3VsZCBiZSBhbiBlcnJvcgorI2FzaCMgKCggeD05IHk9NDEgKSkKKworIyBUaGVzZSBhcmUgZXJyb3JzCit1bnNldCBiCisoICBlY2hvICQoKGEgYikpICApCisjYXNoIyAoKGEgYikpCisKK249NDIKK3ByaW50ZiAiJWRcbiIgJG4KK3ByaW50ZiAiJWlcbiIgJG4KKyNhc2gjIGVjaG8gJCgoIDgjJChwcmludGYgIiVvXG4iICRuKSApKQorcHJpbnRmICIldVxuIiAkbgorI2FzaCMgZWNobyAkKCggMTYjJChwcmludGYgIiV4XG4iICRuKSApKQorI2FzaCMgZWNobyAkKCggMTYjJChwcmludGYgIiVYXG4iICRuKSApKQorCisjIGNhdXNlcyBsb25nam1wIGJvdGNoZXMgdGhyb3VnaCBiYXNoLTIuMDViCithW2JbY11kXT1lCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgxLnN1YiBiL3NoZWxsL2FzaF90ZXN0L2FzaC1hcml0aC9hcml0aDEuc3ViCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgwYWE5OTkKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgxLnN1YgpAQCAtMCwwICsxLDQwIEBACisjIHRlc3Qgb2YgcmVkb25lIHBvc3QtaW5jcmVtZW50IGFuZCBwb3N0LWRlY3JlbWVudCBjb2RlCisoICBlY2hvICQoKCA0LS0gKSkgICApCisoICBlY2hvICQoKCA0KysgKSkgICApCisoICBlY2hvICQoKCA0IC0tICkpICApCisoICBlY2hvICQoKCA0ICsrICkpICApCisKKyNhc2gjICgoIGFycmF5WzBdKysgKSkKKyNhc2gjIGVjaG8gJHthcnJheX0KKworI2FzaCMgKCggYXJyYXlbMF0gKysgKSkKKyNhc2gjIGVjaG8gJHthcnJheX0KKworI2FzaCMgKCggYSsrICkpCisjYXNoIyBlY2hvICRhCisjYXNoIyAoKCBhICsrICkpCisjYXNoIyBlY2hvICRhCisgICAgICBhPTIKKworZWNobyA2ICQoKCBhICsrICsgNCApKQorZWNobyAzICRhCisKK2VjaG8gNyAkKCggYSsrKzQgKSkKK2VjaG8gNCAkYQorCitlY2hvIDAgJCgoIGEtLS00ICkpCitlY2hvIDMgJGEKKworZWNobyA3ICQoKCBhIC0tICsgNCApKQorZWNobyAyICRhCisKK2VjaG8gLTIgJCgoIGEgLS0gLSA0ICkpCitlY2hvIDEgJGEKKworI2FzaCMgKCggKysgKyA3ICkpCisKKyNhc2gjICgoICsrICkpCisoICBlY2hvICQoKCArKys3ICkpICApCisjIGJhc2ggMy4yIGFwcGFyZW50bHkgdGhpbmtzIHRoYXQgKysgKzcgaXMgNworI2FzaCMgZWNobyAkKCggKysgKyA3ICkpCisjYXNoIyAoKCAtLSApKQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoMi5zdWIgYi9zaGVsbC9hc2hfdGVzdC9hc2gtYXJpdGgvYXJpdGgyLnN1YgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mN2UzYzkyCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWFyaXRoL2FyaXRoMi5zdWIKQEAgLTAsMCArMSw1NyBAQAorIyBiYXNoIDMuMiBhcHBhcmVudGx5IHRoaW5rcyB0aGF0ICsrNyBpcyA3IGV0YworKCAgZWNobyAkKCggLS03ICkpICAgKQorKCAgZWNobyAkKCggKys3ICkpICAgKQorKCAgZWNobyAkKCggLS0gNyApKSAgKQorKCAgZWNobyAkKCggKysgNyApKSAgKQorCisjYXNoIyAoKCsrYXJyYXlbMF0gKSkKKyNhc2gjIGVjaG8gMSAkYXJyYXkKKyNhc2gjICgoICsrIGFycmF5WzBdICkpCisjYXNoIyBlY2hvIDIgJGFycmF5CisKKyNhc2gjICgoICsrYSApKQorI2FzaCMgZWNobyAxICRhCisjYXNoIyAoKCArKyBhICkpCisjYXNoIyBlY2hvIDIgJGEKKworI2FzaCMgKCggLS1hICkpCisjYXNoIyBlY2hvIDEgJGEKKyNhc2gjICgoIC0tIGEgKSkKKyNhc2gjIGVjaG8gMCAkYQorICAgICAgYT0wCisKK2VjaG8gNSAkKCggNCArICsrYSApKQorZWNobyAxICRhCisKKyMgYXNoIGRvZXNuJ3QgaGFuZGxlIGl0IHJpZ2h0Li4uCisjYXNoIyBlY2hvIDYgJCgoIDQrKythICkpCisjYXNoIyBlY2hvIDIgJGEKKyAgICAgIGE9MgorCisjIGFzaCBkb2Vzbid0IGhhbmRsZSBpdCByaWdodC4uLgorI2FzaCMgZWNobyAzICQoKCA0LS0tYSApKQorI2FzaCMgZWNobyAxICRhCisgICAgICBhPTEKKworZWNobyA0ICQoKCA0IC0gLS0gYSApKQorZWNobyAwICRhCisKKyNhc2gjICgoIC0tICkpCisjIGJhc2ggMy4yIGFwcGFyZW50bHkgdGhpbmtzIHRoYXQgLS0tNyBpcyAtNworI2FzaCMgZWNobyAkKCggLS0tNyApKQorKCAgZWNobyAkKCggLS0gLSA3ICkpICApCisKKyNhc2gjICgoICsrICkpCisjIGJhc2ggMy4yOiA3CisjYXNoIyBlY2hvIDcgJCgoICsrNyApKQorKCAgZWNobyAkKCggKysgKyA3ICkpICApCisKKyMgYmFzaCAzLjI6IC03CisjYXNoIyBlY2hvIC03ICQoKCArKy03ICkpCisjIGJhc2ggMy4yOiAtNworI2FzaCMgZWNobyAtNyAkKCggKysgLSA3ICkpCisKKyMgYmFzaCAzLjI6IDcKKyNhc2gjIGVjaG8gNyAkKCggKy0tNyApKQorIyBiYXNoIDMuMjogNworI2FzaCMgZWNobyA3ICQoKCAtLSArIDcgKSkKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1nbG9iL2dsb2IxLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWdsb2IvZ2xvYjEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI5YWI0ZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1nbG9iL2dsb2IxLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorZ2xvYjEudGVzdHMKK2dsb2IxLnRlc3RzCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtZ2xvYi9nbG9iMS50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1nbG9iL2dsb2IxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY5ODBjZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtZ2xvYi9nbG9iMS50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK2VjaG8gKmdsb2IxP3RbZV1zdHMqCitlY2hvICJnbG9iMSI/J3QnW2VdcyoKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1nbG9iL2dsb2IyLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWdsb2IvZ2xvYjIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E3MGMyMgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1nbG9iL2dsb2IyLnJpZ2h0CkBAIC0wLDAgKzEsMTggQEAKK0V4cGVjdGVkIEFjdHVhbAorWlwqICAgIDogWlwqCitaKiAgICAgOiBaKgorWlxmICAgIDogWlxmCitaXCogICAgOiBaXCoKKworWlx6ICAgIDogWlx6CitaeiAgICAgOiBaegorWlx6ICAgIDogWlx6CitaXHogICAgOiBaXHoKKworWlwgICAgIDogWlwKK1pcICAgICA6IFpcCisKK1pcZiBaZiA6IFpcZiBaZgorWlxmIFpmIDogWlxmIFpmCisKK0RvbmU6IDAKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1nbG9iL2dsb2IyLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWdsb2IvZ2xvYjIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDA2MThiOQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1nbG9iL2dsb2IyLnRlc3RzCkBAIC0wLDAgKzEsMjcgQEAKKyMgVGhpcyB0ZXN0IGRlbW9uc3RyYXRlcyB0aGF0IGluIHVucXVvdGVkICR2LCBiYWNrc2xhc2hlcyBleHBhbmQgYnkgdGhpcyBydWxlOgorIyBceiAtPiBcXFx6OyBcPGVvbD4gLT4gXFw8ZW9sPiAoZm9yIGFueSB6LCBzcGVjaWFsIG9yIG5vdCksCisjIGFuZCBzdWJzZXF1ZW50bHkgZ2xvYmJpbmcgY29udmVydHMgXFwgdG8gXCBhbmQgdHJlYXRzIFx6IGFzIGxpdGVyYWwgegorIyBldmVuIGlmIGl0IGlzIGEgc3BlY2lhbCBjaGFyLgorCis+J1pmJworPidaXGYnCisJZWNobyAnRXhwZWN0ZWQnICdBY3R1YWwnCit2PSdcKic7IGVjaG8gJ1pcKiAgICA6JyBaJHYgICAgIyBhc2ggaXMgYnVnZ3kgaGVyZTogcHJpbnRzICdaXGYnCisgICAgICAgIGVjaG8gJ1oqICAgICA6JyBaXCoKKyAgICAgICAgZWNobyAnWlxmICAgIDonIFpcXCoKKyAgICAgICAgZWNobyAnWlwqICAgIDonIFpcXFwqICAjIE5CISBvbmx5IHRoaXMgbWF0Y2hlcyBaJHYgb3V0cHV0CitlY2hvCit2PSdceic7IGVjaG8gJ1pceiAgICA6JyBaJHYKKyAgICAgICAgZWNobyAnWnogICAgIDonIFpcegorICAgICAgICBlY2hvICdaXHogICAgOicgWlxcegorICAgICAgICBlY2hvICdaXHogICAgOicgWlxcXHoKK2VjaG8KK3Y9J1wnOyAgZWNobyAnWlwgICAgIDonIFokdgorICAgICAgICBlY2hvICdaXCAgICAgOicgWlxcCitlY2hvCit2PScqJzsgIGVjaG8gJ1pcZiBaZiA6JyBaJHYKKyAgICAgICAgZWNobyAnWlxmIFpmIDonIFoqCitlY2hvCisKK3JtICdaXGYnICdaZicKK2VjaG8gRG9uZTogJD8KZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1nbG9iL2dsb2IzLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWdsb2IvZ2xvYjMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYxYjU4OQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1nbG9iL2dsb2IzLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorZ2xvYjMudGVzdHMKKy4vZ2xvYjMudGVzdHMKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1nbG9iL2dsb2IzLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWdsb2IvZ2xvYjMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmRmNTQwMAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1nbG9iL2dsb2IzLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorZWNobyAiZ2xvYjMudGVzdCIqCitlY2hvICIuL2dsb2IzLnRlc3QiKgpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLWdsb2IvZ2xvYl9hbmRfYXNzaWduLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWdsb2IvZ2xvYl9hbmRfYXNzaWduLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NmU0NDMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtZ2xvYi9nbG9iX2FuZF9hc3NpZ24ucmlnaHQKQEAgLTAsMCArMSw2IEBACitaVkFSPXoudG1wIFpWQVI9Ki50bXAgWlZBUj1bel0udG1wCitaVkFSPXoudG1wIFpWQVI9Ki50bXAgWlZBUj1bel0udG1wCisqLnRtcAorWlZBUj16LnRtcCB6LnRtcAorWlZBUj16LnRtcCBaVkFSPSoudG1wIFpWQVI9W3pdLnRtcAorWlZBUj16LnRtcCBaVkFSPSoudG1wIFpWQVI9W3pdLnRtcApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLWdsb2IvZ2xvYl9hbmRfYXNzaWduLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWdsb2IvZ2xvYl9hbmRfYXNzaWduLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBiMTU4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtZ2xvYi9nbG9iX2FuZF9hc3NpZ24udGVzdHMKQEAgLTAsMCArMSwxMCBAQAorPlpWQVI9ei50bXAKKz56LnRtcAorWlZBUj0qLnRtcCBlY2hvIFpWQVI9Ki50bXAgIlpWQVI9Ki50bXAiICJaVkFSPVt6XS50bXAiCitaVkFSPSoudG1wIC9iaW4vZWNobyBaVkFSPSoudG1wICJaVkFSPSoudG1wIiAiWlZBUj1bel0udG1wIgorWlZBUj0qLnRtcAorZWNobyAiJFpWQVIiCitlY2hvICRaVkFSCitlY2hvIFpWQVI9Ki50bXAgIlpWQVI9Ki50bXAiICJaVkFSPVt6XS50bXAiCisvYmluL2VjaG8gWlZBUj0qLnRtcCAiWlZBUj0qLnRtcCIgIlpWQVI9W3pdLnRtcCIKK3JtIFpWQVI9ei50bXAgei50bXAKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1nbG9iL2dsb2JfcmVkaXIucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtZ2xvYi9nbG9iX3JlZGlyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZDAzMDkKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtZ2xvYi9nbG9iX3JlZGlyLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorei50bXA6Cis/LnRtcDogVEVTVApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLWdsb2IvZ2xvYl9yZWRpci50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1nbG9iL2dsb2JfcmVkaXIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjIxZDEyMAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1nbG9iL2dsb2JfcmVkaXIudGVzdHMKQEAgLTAsMCArMSw5IEBACisjIFJlZGlyZWN0aW9ucyBhcmUgbm90IGdsb2JiZWQuCisjIGJhc2g6CisjIGlmIHJ1biBhcyAic2giLCB0aGV5IGFyZSBub3QgZ2xvYmJlZCwgYnV0CisjIGlmIHJ1biBhcyAiYmFzaCIsIHRoZXkgYXJlIQorPnoudG1wCitlY2hvIFRFU1QgPj8udG1wCitlY2hvICd6LnRtcDonIGBjYXQgJ3oudG1wJ2AKK2VjaG8gJz8udG1wOicgYGNhdCAnPy50bXAnYAorcm0gJ3oudG1wJyAnPy50bXAnCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtaGVyZWRvYy9oZXJlZG9jLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWhlcmVkb2MvaGVyZWRvYy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWYxMTUxCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWhlcmVkb2MvaGVyZWRvYy5yaWdodApAQCAtMCwwICsxLDIxIEBACit0aGVyZQorb25lIC0gYWxwaGEKK3R3byAtIGJldGEKK3RocmVlIC0gZ2FtbWEKK2hpXAordGhlcmUkYQorc3R1ZmYKK2hpXAordGhlcmUKK0VPXAorRgoraGkKK3RhYiAxCit0YWIgMgordGFiIDMKK2FiYworZGVmIGdoaQoramtsIG1ubworZmZmIGlzIGEgc2hlbGwgZnVuY3Rpb24KK2hpCit0aGVyZQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLWhlcmVkb2MvaGVyZWRvYy50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1oZXJlZG9jL2hlcmVkb2MudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjNjZGMzZgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1oZXJlZG9jL2hlcmVkb2MudGVzdHMKQEAgLTAsMCArMSw5NCBAQAorIyBjaGVjayBvcmRlciBhbmQgY29udGVudCBvZiBtdWx0aXBsZSBoZXJlIGRvY3MKKworY2F0IDw8IEVPRjEgPDwgRU9GMgoraGkKK0VPRjEKK3RoZXJlCitFT0YyCisKK3doaWxlIHJlYWQgbGluZTE7IGRvCisJcmVhZCBsaW5lMiA8JjMKKwllY2hvICRsaW5lMSAtICRsaW5lMgorZG9uZSA8PEVPRjEgMzw8RU9GMgorb25lCit0d28KK3RocmVlCitFT0YxCithbHBoYQorYmV0YQorZ2FtbWEKK0VPRjIKKworCisjIGNoZWNrIHF1b3RlZCBoZXJlLWRvYyBpcyBwcm90ZWN0ZWQKKworYT1mb28KK2NhdCA8PCAnRU9GJworaGlcCit0aGVyZSRhCitzdHVmZgorRU9GCisKKyMgY2hlY2sgdGhhdCBxdW90ZWQgaGVyZS1kb2N1bWVudHMgZG9uJ3QgaGF2ZSBcbmV3bGluZSBwcm9jZXNzaW5nIGRvbmUKKworY2F0IDw8ICdFT0YnCitoaVwKK3RoZXJlCitFT1wKK0YKK0VPRgordHJ1ZQorCisjIGNoZWNrIHRoYXQgXG5ld2xpbmUgaXMgcmVtb3ZlZCBhdCBzdGFydCBvZiBoZXJlLWRvYworY2F0IDw8IEVPXAorRgoraGkKK0VPRgorCisjYXNoIyAjIGNoZWNrIHRoYXQgXG5ld2xpbmUgcmVtb3ZhbCB3b3JrcyBmb3IgaGVyZS1kb2MgZGVsaW1pdGVyCisjYXNoIyBjYXQgPDwgRU9GCisjYXNoIyBoaQorI2FzaCMgRU9cCisjYXNoIyBGCisKKyMgY2hlY2sgb3BlcmF0aW9uIG9mIHRhYiByZW1vdmFsIGluIGhlcmUgZG9jdW1lbnRzCitjYXQgPDwtIEVPRgorCXRhYiAxCisJdGFiIDIKKwl0YWIgMworCUVPRgorCisjIGNoZWNrIGFwcGVuZGluZyBvZiB0ZXh0IHRvIGZpbGUgZnJvbSBoZXJlIGRvY3VtZW50CitybSAtZiAvdG1wL2Jhc2gtenp6CitjYXQgPiAvdG1wL2Jhc2gtenp6IDw8IEVPRgorYWJjCitFT0YKK2NhdCA+PiAvdG1wL2Jhc2gtenp6IDw8IEVPRgorZGVmIGdoaQoramtsIG1ubworRU9GCitjYXQgL3RtcC9iYXNoLXp6egorcm0gLWYgL3RtcC9iYXNoLXp6egorCisjIG1ha2Ugc3VyZSBjb21tYW5kIHByaW50aW5nIHB1dHMgdGhlIGhlcmUtZG9jdW1lbnQgYXMgdGhlIGxhc3QgcmVkaXJlY3Rpb24KKyMgb24gdGhlIGxpbmUsIGFuZCB0aGUgZnVuY3Rpb24gZXhwb3J0IGNvZGUgcHJlc2VydmVzIHN5bnRhY3RpYyBjb3JyZWN0bmVzcworZmZmKCkKK3sKKyAgZWQgL3RtcC9mb28gPDxFTkRPRklOUFVUID4vZGV2L251bGwKKy9ebmFtZS9kCit3CitxCitFTkRPRklOUFVUCithYT0xCit9CisKK3R5cGUgZmZmCisjYXNoIyBleHBvcnQgLWYgZmZmCisjYXNoIyAke1RISVNfU0h9IC1jICd0eXBlIGZmZicKKworIyBjaGVjayB0aGF0IGVuZCBvZiBmaWxlIGRlbGltaXRzIGEgaGVyZS1kb2N1bWVudAorIyBUSElTIE1VU1QgQkUgTEFTVCEKKworY2F0IDw8IEVPRgoraGkKK3RoZXJlCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtaGVyZWRvYy9oZXJlZG9jMS5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1oZXJlZG9jL2hlcmVkb2MxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYWE1YTUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtaGVyZWRvYy9oZXJlZG9jMS5yaWdodApAQCAtMCwwICsxIEBACisuL2hlcmVkb2MxLnRlc3RzOiBsaW5lIDM6IHN5bnRheCBlcnJvcjogdW5leHBlY3RlZCAidGhlbiIKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1oZXJlZG9jL2hlcmVkb2MxLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWhlcmVkb2MvaGVyZWRvYzEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTkxMmE2NwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1oZXJlZG9jL2hlcmVkb2MxLnRlc3RzCkBAIC0wLDAgKzEsMyBAQAorIyBXZSB1c2VkIHRvIFNFR1Ygb24gdGhpczoKKworPDxFT0Y7IHRoZW4gPFcKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1pbnZlcnQvaW52ZXJ0LnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWludmVydC9pbnZlcnQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE5MjM5YQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1pbnZlcnQvaW52ZXJ0LnJpZ2h0CkBAIC0wLDAgKzEsMTAgQEAKKzEKKzEKKzEKKzAKKzAKKzEKKzAKKzEKKzAKKzEKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1pbnZlcnQvaW52ZXJ0LnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLWludmVydC9pbnZlcnQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODM5M2Q5NQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1pbnZlcnQvaW52ZXJ0LnRlc3RzCkBAIC0wLDAgKzEsMTkgQEAKKyMgdGVzdHMgb2YgcmV0dXJuIHZhbHVlIGludmVyc2lvbgorIyBwbGFjZWhvbGRlciBmb3IgZnV0dXJlIGV4cGFuc2lvbgorCisjIHVzZXIgc3Vic2hlbGxzICguLi4pIGRpZCB0aGlzIHdyb25nIGluIGJhc2ggdmVyc2lvbnMgYmVmb3JlIDIuMDQKKworISAoIGVjaG8gaGVsbG8gfCBncmVwIGggPi9kZXYvbnVsbCAyPiYxICk7IGVjaG8gJD8KKyEgZWNobyBoZWxsbyB8IGdyZXAgaCA+L2Rldi9udWxsIDI+JjEgOyBlY2hvICQ/CisKKyEgdHJ1ZSA7IGVjaG8gJD8KKyEgZmFsc2U7IGVjaG8gJD8KKworISAoZmFsc2UpIDsgZWNobyAkPworISAodHJ1ZSk7IGVjaG8gJD8KKworISB0cnVlIHwgZmFsc2UgOyBlY2hvICQ/CishIGZhbHNlIHwgdHJ1ZSA7IGVjaG8gJD8KKworISAodHJ1ZSB8IGZhbHNlKSA7IGVjaG8gJD8KKyEgKGZhbHNlIHwgdHJ1ZSkgOyBlY2hvICQ/CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9lY2hvX3dyaXRlX2Vycm9yLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2MvZWNob193cml0ZV9lcnJvci5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTkxYTEzCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2MvZWNob193cml0ZV9lcnJvci5yaWdodApAQCAtMCwwICsxLDIgQEAKK2FzaDogd3JpdGUgZXJyb3I6IEJyb2tlbiBwaXBlCitPazogMQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2MvZWNob193cml0ZV9lcnJvci50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL2VjaG9fd3JpdGVfZXJyb3IudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGE0MGM5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL2VjaG9fd3JpdGVfZXJyb3IudGVzdHMKQEAgLTAsMCArMSw3IEBACit0cmFwICIiIFBJUEUKKworeworc2xlZXAgMQorZWNobyBDYW50IHdyaXRlIHRoaXMgLSBnZXQgRVBJUEUKK2VjaG8gT2s6ICQ/ID4mMgorfSB8IHsgdHJ1ZTsgfQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2MvbGFzdF9hbXAucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9sYXN0X2FtcC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGEyMWFlCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2MvbGFzdF9hbXAucmlnaHQKQEAgLTAsMCArMSwyIEBACiszCitFbmQKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL2xhc3RfYW1wLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2MvbGFzdF9hbXAudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTYwOTM3NgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL2xhc3RfYW1wLnRlc3RzCkBAIC0wLDAgKzEsOCBAQAorJFRISVNfU0ggLWMgJ2VjaG8gMyYnCitkPWBkYXRlYAord2hpbGUgdGVzdCAiYGRhdGVgIiA9ICIkZCI7IGRvIHRydWU7IGRvbmUKK2QxPWBkYXRlYAorJFRISVNfU0ggLWMgJ3NsZWVwIDEmJworZDI9YGRhdGVgCit0ZXN0ICIkZDEiID0gIiRkMiIgfHwgZWNobyBCQUQKK2VjaG8gRW5kCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9sb2NhbDEucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9sb2NhbDEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJkMTIxZAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL2xvY2FsMS5yaWdodApAQCAtMCwwICsxLDQgQEAKK0ExOidBJworQTI6JycKK0EzOicnCitBNDonQScKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL2xvY2FsMS50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL2xvY2FsMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMWU2NzUwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2MvbG9jYWwxLnRlc3RzCkBAIC0wLDAgKzEsMTEgQEAKK2E9QQorZigpIHsKKwlsb2NhbCBhCisJIyB0aGUgYWJvdmUgbGluZSB1bnNldHMgJGEKKwllY2hvICJBMjonJGEnIgorCXVuc2V0IGEKKwllY2hvICJBMzonJGEnIgorfQorZWNobyAiQTE6JyRhJyIKK2YKK2VjaG8gIkE0OickYSciCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9udWxsdGljazEucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9udWxsdGljazEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkwYjgyMAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL251bGx0aWNrMS5yaWdodApAQCAtMCwwICsxLDMgQEAKK1Rlc3QgMQorVGVzdCAyCitEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9udWxsdGljazEudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9udWxsdGljazEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjgxOTIzZAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL251bGx0aWNrMS50ZXN0cwpAQCAtMCwwICsxLDMgQEAKK2VjaG8gVGVzdCBgIGAgMQorZWNobyBUZXN0IGA8L2Rldi9udWxsYCAyCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL3NoaWZ0MS5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL3NoaWZ0MS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTM0NTNjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2Mvc2hpZnQxLnJpZ2h0CkBAIC0wLDAgKzEsOSBAQAorMiAzIDQKKzA6IHNoaWZ0OiBsaW5lIDE6IElsbGVnYWwgbnVtYmVyOiAtMQorMSAyIDMgNAorMiAzIDQKKzMgNAorNAorCisxIDIgMyA0CisxIDIgMyA0CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9zaGlmdDEudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9zaGlmdDEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDk5MmQ5YgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL3NoaWZ0MS50ZXN0cwpAQCAtMCwwICsxLDEwIEBACiskVEhJU19TSCAtYyAnc2hpZnQ7ICAgIGVjaG8gIiRAIicgMCAxIDIgMyA0CisjV2UgZG8gYWJvcnQgb24gLTEsIGJ1dCB0aGVuIHdlIGFib3J0LiBiYXNoIGV4ZWN1dGVzIGVjaG8uCiskVEhJU19TSCAtYyAnc2hpZnQgLTE7IGVjaG8gIiRAIicgMCAxIDIgMyA0CiskVEhJU19TSCAtYyAnc2hpZnQgIDA7IGVjaG8gIiRAIicgMCAxIDIgMyA0CiskVEhJU19TSCAtYyAnc2hpZnQgIDE7IGVjaG8gIiRAIicgMCAxIDIgMyA0CiskVEhJU19TSCAtYyAnc2hpZnQgIDI7IGVjaG8gIiRAIicgMCAxIDIgMyA0CiskVEhJU19TSCAtYyAnc2hpZnQgIDM7IGVjaG8gIiRAIicgMCAxIDIgMyA0CiskVEhJU19TSCAtYyAnc2hpZnQgIDQ7IGVjaG8gIiRAIicgMCAxIDIgMyA0CiskVEhJU19TSCAtYyAnc2hpZnQgIDU7IGVjaG8gIiRAIicgMCAxIDIgMyA0CiskVEhJU19TSCAtYyAnc2hpZnQgIDY7IGVjaG8gIiRAIicgMCAxIDIgMyA0CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9zb3VyY2UxLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2Mvc291cmNlMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWI3YzU0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2Mvc291cmNlMS5yaWdodApAQCAtMCwwICsxLDIgQEAKK1NvdXJjZWQgb2sKK0RvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL3NvdXJjZTEudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9zb3VyY2UxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUyZTc1YjIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy9zb3VyY2UxLnRlc3RzCkBAIC0wLDAgKzEsNSBAQAorZWNobyAiZWNobyBTb3VyY2VkIG9rIiA+Li4vc291cmNlZC5zaAorUEFUSD0iLi46JFBBVEgiCisuIHNvdXJjZWQuc2gKK3JtIC4uL3NvdXJjZWQuc2gKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2Mvc291cmNlMi5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL3NvdXJjZTIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U3MTcxYwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL3NvdXJjZTIucmlnaHQKQEAgLTAsMCArMSBAQAorRG9uZTogMApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2Mvc291cmNlMi50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL3NvdXJjZTIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTg3MGNkZgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL3NvdXJjZTIudGVzdHMKQEAgLTAsMCArMSwzIEBACitmYWxzZQorLiAvZGV2L251bGwKK2VjaG8gRG9uZTogJD8KZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1taXNjL3RpY2txdW90ZTEucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy90aWNrcXVvdGUxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjYxYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy90aWNrcXVvdGUxLnJpZ2h0CkBAIC0wLDAgKzEgQEAKKy4vdGlja3F1b3RlMS50ZXN0czogbGluZSAxOiBzeW50YXggZXJyb3I6IHVudGVybWluYXRlZCBxdW90ZWQgc3RyaW5nCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtbWlzYy90aWNrcXVvdGUxLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2MvdGlja3F1b3RlMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MGQ1YmJjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLW1pc2MvdGlja3F1b3RlMS50ZXN0cwpAQCAtMCwwICsxIEBACitlY2hvIGAicHdkYApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXF1b3RpbmcvZG9sbGFyX3JlcGxfc2xhc2hfYmFzaDEucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcXVvdGluZy9kb2xsYXJfcmVwbF9zbGFzaF9iYXNoMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjEyYzI0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXF1b3RpbmcvZG9sbGFyX3JlcGxfc2xhc2hfYmFzaDEucmlnaHQKQEAgLTAsMCArMSwxMCBAQAorMTkyXC4xNjhcLjBcLjEKKzE5MlwuMTY4XC4wXC4xWworMTkyXC4xNjhcLjBcLjFbCisxOTJcXC4xNjhcXC4wXFwuMVsKKzE5MlwuMTY4XC4wXC4xWworMTkyXC4xNjhcLjBcLjEKKzE5MlwuMTY4XC4wXC4xWworMTkyXC4xNjhcLjBcLjFbCisxOTJcXC4xNjhcXC4wXFwuMVsKKzE5MlwuMTY4XC4wXC4xWwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXF1b3RpbmcvZG9sbGFyX3JlcGxfc2xhc2hfYmFzaDEudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcXVvdGluZy9kb2xsYXJfcmVwbF9zbGFzaF9iYXNoMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZmEyZjE4Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXF1b3RpbmcvZG9sbGFyX3JlcGxfc2xhc2hfYmFzaDEudGVzdHMKQEAgLTAsMCArMSwyMSBAQAorIyBUaGUgYnVnIGhlcmUgd2FzIHRyaWdnZXJlZCBieToKKyMgKiBwZXJmb3JtaW4gcGF0aG5hbWUgZXhwYW5zaW9uIGJlY2F1c2Ugd2Ugc2VlIFsKKyMgKiByZXBsYWNlIG9wZXJhdG9yIGRpZCBub3QgZXNjYXBlIFwgaW4gcmVwbGFjZSBzdHJpbmcKKworSVA9MTkyLjE2OC4wLjEKKworcm0gLWYgJzE5Mi4xNjguMC4xWycKK2VjaG8gIiR7SVAvLy4vXFwufSIKK2VjaG8gIiR7SVAvLy4vXFwufSInWycgIyBidWcgd2FzIGhlcmUKK2VjaG8gIiR7SVAvLy4vXFwufVsiICAgIyBidWcgd2FzIGhlcmUKK2VjaG8gIiR7SVAvLy4vXFxcXC59WyIgIyBidWcgd2FzIGhlcmUKK2VjaG8gIjE5MlwuMTY4XC4wXC4xWyIKKworZWNobyA+JzE5Mi4xNjguMC4xWycKK2VjaG8gIiR7SVAvLy4vXFwufSIKK2VjaG8gIiR7SVAvLy4vXFwufSInWycgIyBidWcgd2FzIGhlcmUKK2VjaG8gIiR7SVAvLy4vXFwufVsiICAgIyBidWcgd2FzIGhlcmUKK2VjaG8gIiR7SVAvLy4vXFxcXC59WyIgIyBidWcgd2FzIGhlcmUKK2VjaG8gIjE5MlwuMTY4XC4wXC4xWyIKKworcm0gLWYgJzE5Mi4xNjguMC4xWycKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1xdW90aW5nL2RvbGxhcl9zcXVvdGVfYmFzaDEucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcXVvdGluZy9kb2xsYXJfc3F1b3RlX2Jhc2gxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NTM2YjEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcXVvdGluZy9kb2xsYXJfc3F1b3RlX2Jhc2gxLnJpZ2h0CkBAIC0wLDAgKzEsOSBAQAorYQliCithCitiIGMKK2RlZgorYSdiIGMiZCBlXGYKK2EzYiBjM2IgZTMzZgorYVw4MGIgYzA4YgorYTNiIGMzMGIKK3gJeQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXF1b3RpbmcvZG9sbGFyX3NxdW90ZV9iYXNoMS50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1xdW90aW5nL2RvbGxhcl9zcXVvdGVfYmFzaDEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTNhNTZjYQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1xdW90aW5nL2RvbGxhcl9zcXVvdGVfYmFzaDEudGVzdHMKQEAgLTAsMCArMSw3IEBACitlY2hvICQnYVx0YicKK2VjaG8gJCdhXG5iJyAkJ2NcbmQnJ2VmJworZWNobyAkJ2FcJ2InICQnY1wiZCcgJCdlXFxmJworZWNobyAkJ2FcNjNiJyAkJ2NcMDYzYicgJCdlXDA2MzNmJworZWNobyAkJ2FcODBiJyAkJ2NcNjA4YicKK2VjaG8gJCdhXHgzM2InICQnY1x4MzMwYicKK2VjaG8gJCd4XHg5eScKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfUkVQTFkucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX1JFUExZLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZjVkNTQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX1JFUExZLnJpZ2h0CkBAIC0wLDAgKzEsNSBAQAordGVzdCAxOiB8ICBhYmMxICBkZWYgIHwKK3Rlc3QgMjogfCAgXGFiYzIgIGRcZWYgIHwKK3Rlc3QgMzogfGFiYzMgIGRlZnwKK3Rlc3QgNDogfFxhYmM0ICBkXGVmfAorRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF9SRVBMWS50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfUkVQTFkudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmEyMGNhZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfUkVQTFkudGVzdHMKQEAgLTAsMCArMSw1IEBACitlY2hvICcgIFxhYmMxICBkXGVmICAnIHwgKCByZWFkICAgICAgICAgOyBlY2hvICJ0ZXN0IDE6IHwkUkVQTFl8IiApCitlY2hvICcgIFxhYmMyICBkXGVmICAnIHwgKCByZWFkIC1yICAgICAgOyBlY2hvICJ0ZXN0IDI6IHwkUkVQTFl8IiApCitlY2hvICcgIFxhYmMzICBkXGVmICAnIHwgKCByZWFkICAgIFJFUExZOyBlY2hvICJ0ZXN0IDM6IHwkUkVQTFl8IiApCitlY2hvICcgIFxhYmM0ICBkXGVmICAnIHwgKCByZWFkIC1yIFJFUExZOyBlY2hvICJ0ZXN0IDQ6IHwkUkVQTFl8IiApCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfaWZzLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF9pZnMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUyMzM0NAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfaWZzLnJpZ2h0CkBAIC0wLDAgKzEsMTAgQEAKK3Rlc3QgMTogLmEuIC5iLiAuYy4KK3Rlc3QgMjogLmEuIC5iLiAuYy4KK3Rlc3QgMzogLmEuIC4uIC5iLGMuCit0ZXN0IDQ6IC5hLiAuLiAuYixjLgordGVzdCA1OiAuYS4gLi4gLmMuCit0ZXN0IDY6IC5hLiAuLiAuYy4gLmQuCit0ZXN0IDc6IC5hLiAuLiAuYixjLGQgICwgICwuCit0ZXN0IDg6IC4uIC5hLiAuYi4gLmMuCit0ZXN0IDk6IC5hLiAuYi4gLmMuIC4uCit0ZXN0IEE6IC4uIC5hLiAuLiAuYi4gLmMuCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX2lmcy50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfaWZzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZlODMxMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX2lmcy50ZXN0cwpAQCAtMCwwICsxLDEwIEBACitwcmludGYgJ2FcdFx0Ylx0Y1xuJyB8ICggSUZTPSQocHJpbnRmICJcdCIpIHJlYWQgYSBiIGM7ICBlY2hvICJ0ZXN0IDE6IC4kYS4gLiRiLiAuJGMuIiApCitwcmludGYgJ2FcdFx0Ylx0Y1xuJyB8ICggSUZTPSQocHJpbnRmICIgXHQiKSByZWFkIGEgYiBjOyBlY2hvICJ0ZXN0IDI6IC4kYS4gLiRiLiAuJGMuIiApCitwcmludGYgJ2EsLGIsY1xuJyAgICB8ICggSUZTPSIsIiByZWFkIGEgYiBjOyAgZWNobyAidGVzdCAzOiAuJGEuIC4kYi4gLiRjLiIgKQorcHJpbnRmICdhLCxiLGNcbicgICAgfCAoIElGUz0iICwiIHJlYWQgYSBiIGM7IGVjaG8gInRlc3QgNDogLiRhLiAuJGIuIC4kYy4iICkKK3ByaW50ZiAnYSAsLCBjXG4nICAgIHwgKCBJRlM9IiAsIiByZWFkIGEgYiBjOyBlY2hvICJ0ZXN0IDU6IC4kYS4gLiRiLiAuJGMuIiApCitwcmludGYgJ2EgLCwgYyBkXG4nICB8ICggSUZTPSIgLCIgcmVhZCBhIGIgYyBkOyAgICAgZWNobyAidGVzdCA2OiAuJGEuIC4kYi4gLiRjLiAuJGQuIiApCitwcmludGYgJyBhLCxiLGMsZCAgLCAgLFxuJyB8ICggSUZTPSIgLCIgcmVhZCBhIGIgYzsgZWNobyAidGVzdCA3OiAuJGEuIC4kYi4gLiRjLiIgKQorcHJpbnRmICdcdCxcdGFcdCxcdGJcdGMnICAgfCAoIElGUz0kKHByaW50ZiAiIFx0LCIpIHJlYWQgYSBiIGMgZDsgICBlY2hvICJ0ZXN0IDg6IC4kYS4gLiRiLiAuJGMuIC4kZC4iICkKK3ByaW50ZiAnXHRcdGFcdCxcdGJcdGMnICAgIHwgKCBJRlM9JChwcmludGYgIiBcdCwiKSByZWFkIGEgYiBjIGQ7ICAgZWNobyAidGVzdCA5OiAuJGEuIC4kYi4gLiRjLiAuJGQuIiApCitwcmludGYgJ1x0LFx0YVx0LCxcdGJcdGMnICB8ICggSUZTPSQocHJpbnRmICIgXHQsIikgcmVhZCBhIGIgYyBkIGU7IGVjaG8gInRlc3QgQTogLiRhLiAuJGIuIC4kYy4gLiRkLiAuJGUuIiApCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX24ucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX24ucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY4MWFmMAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfbi5yaWdodApAQCAtMCwwICsxLDMgQEAKK3Rlc3QKK3RlcwordGVzCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX24udGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX24udGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTI0MjNiYQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfbi50ZXN0cwpAQCAtMCwwICsxLDMgQEAKK2VjaG8gJ3Rlc3QnIHwgKHJlYWQgcmVwbHk7IGVjaG8gIiRyZXBseSIpCitlY2hvICd0ZXN0JyB8IChyZWFkIC1uIDMgcmVwbHk7IGVjaG8gIiRyZXBseSIpCitlY2hvICd0ZXN0JyB8IChyZWFkIC1uMyByZXBseTsgZWNobyAiJHJlcGx5IikKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfci5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfci5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTM2YmY3Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF9yLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAordGVzdGJlc3QKK3Rlc3RcCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX3IudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX3IudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmM0Y2M2MQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfci50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK2VjaG8gLWUgJ3Rlc3RcXFxuYmVzdCcgfCAocmVhZCByZXBseTsgZWNobyAiJHJlcGx5IikKK2VjaG8gLWUgJ3Rlc3RcXFxuYmVzdCcgfCAocmVhZCAtciByZXBseTsgZWNobyAiJHJlcGx5IikKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfdC5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWFkL3JlYWRfdC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDEyNmNiCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF90LnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorPjwKKz48Cis+dGVzdDwKKz50ZXN0PApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF90LnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlYWQvcmVhZF90LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ2NWYxYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVhZC9yZWFkX3QudGVzdHMKQEAgLTAsMCArMSwxMCBAQAorIyBiYXNoIDMuMiBvdXRwdXRzOgorCisjID48Cit7IGVjaG8gLW4gJ3RlJzsgc2xlZXAgMjsgZWNobyAnc3QnOyB9ICAgfCAocmVhZCAtdCAxIHJlcGx5OyBlY2hvICI+JHJlcGx5PCIpCisjID48Cit7ICAgICAgICAgICAgICAgc2xlZXAgMjsgZWNobyAndGVzdCc7IH0gfCAocmVhZCAtdCAxIHJlcGx5OyBlY2hvICI+JHJlcGx5PCIpCisjID50ZXN0PAoreyBlY2hvIC1uICd0ZSc7IHNsZWVwIDE7IGVjaG8gJ3N0JzsgfSAgIHwgKHJlYWQgLXQgMiByZXBseTsgZWNobyAiPiRyZXBseTwiKQorIyA+dGVzdDwKK3sgICAgICAgICAgICAgICBzbGVlcCAxOyBlY2hvICd0ZXN0JzsgfSB8IChyZWFkIC10IDIgcmVwbHk7IGVjaG8gIj4kcmVwbHk8IikKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpci5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpci5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWE2ZTcyCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorYXNoOiB3cml0ZSBlcnJvcjogQmFkIGZpbGUgZGVzY3JpcHRvcgorVEVTVApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdhMWE2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXIudGVzdHMKQEAgLTAsMCArMSw2IEBACisjIHRlc3Q6IGNsb3NlZCBmZHMgc2hvdWxkIHN0YXkgY2xvc2VkCitleGVjIDE+Ji0KK2VjaG8gVEVTVCA+VEVTVAorZWNobyBKVU5LICMgbG9zdDogc3Rkb3V0IGlzIGNsb3NlZAorY2F0IFRFU1QgPiYyCitybSBURVNUCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXIyLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODZiYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyMi5yaWdodApAQCAtMCwwICsxIEBACitPSwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyMi50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjFjY2VhMwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjIudGVzdHMKQEAgLTAsMCArMSw1IEBACisjIGFzaCBvbmNlIGNvdWxkbid0IHJlZGlyZWN0IGFib3ZlIGZkIzkKK2V4ZWMgMT4vZGV2L251bGwKKyhlY2hvIExPU1QxID4mMjIpIDIyPiYxCisoZWNobyBMT1NUMiA+JjIyKSAyMj4mMQorKGVjaG8gT0sgPiYyMikgMjI+JjIKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjMucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXIzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNjQxYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXIzLnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorVEVTVAorLi9yZWRpcjMudGVzdHM6IGxpbmUgNDogOTogQmFkIGZpbGUgZGVzY3JpcHRvcgorT3V0cHV0IHRvIGZkIzk6IDEKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjMudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXIzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUzN2Q1ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXIzLnRlc3RzCkBAIC0wLDAgKzEsNSBAQAorIyByZWRpcmVjdHMgdG8gY2xvc2VkIGRlc2NyaXB0b3JzIHNob3VsZCBub3QgbGVhdmUgdGhlc2UgZGVzY3JpcHRvcnMKKyMgb3BlbiBhZnRlcndhcmRzCitlY2hvIFRFU1QgOT4vZGV2L251bGwKK2VjaG8gTVVTVCBFUlJPUiBPVVQgPiY5CitlY2hvICJPdXRwdXQgdG8gZmQjOTogJD8iCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI0LnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODZiYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNC5yaWdodApAQCAtMCwwICsxIEBACitPSwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNC50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGJkZjVhZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjQudGVzdHMKQEAgLTAsMCArMSw3MiBAQAorIyBhc2ggdXNlcyBmZCAxMCAodXN1YWxseSkgZm9yIHJlYWRpbmcgdGhlIHNjcmlwdAorZXhlYyAxMz4mLQorZXhlYyAxMj4mLQorZXhlYyAxMT4mLQorZXhlYyAxMD4mLQorIyBzb21lIGFtb3VudCBvZiBpbnB1dCBpcyBwcmVmZXRjaGVkLgorIyBtYWtlIHN1cmUgZmluYWwgZWNobyBpcyBmYXIgZW5vdWdoIHRvIG5vdCBiZSBwcmVmZXRjaGVkLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitlY2hvICJPSyIKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjUucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI1LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMDg3NzcKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI1LnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorLi9yZWRpcjUudGVzdHM6IGxpbmUgMjogMTA6IEJhZCBmaWxlIGRlc2NyaXB0b3IKK09LCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI1LnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MWIwYzFmCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNS50ZXN0cwpAQCAtMCwwICsxLDMgQEAKKyMgYXNoIHVzZXMgZmQgMTAgKHVzdWFsbHkpIGZvciByZWFkaW5nIHRoZSBzY3JpcHQKK2VjaG8gTE9TVCA+JjEwCitlY2hvIE9LCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI2LnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDc1NGRmCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNi5yaWdodApAQCAtMCwwICsxLDIgQEAKK0hlbGxvCitPSwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNi50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjYudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzNiNmQ0YwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjYudGVzdHMKQEAgLTAsMCArMSwzIEBACisjIHdlIGhhZCBhIGJ1ZyB3aGVyZSB0aGlzIHdvdWxkIGhhbmcKKyhoZWFkIC1uIDEgPHJlZGlyNi5yaWdodCkKK2VjaG8gT0sKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjcucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI3LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MzBiMDIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI3LnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorT2sKK09rCitEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI3LnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jYTM5NzlhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyNy50ZXN0cwpAQCAtMCwwICsxLDEyIEBACisjIENoYXJzIGFib3ZlIDB4N2YgYXJlIHVzZWQgYXMgc3BlY2lhbCBjb2Rlcy4KKyMgMHg4MSBpcyBDVExFU0MgKHNlZSBhc2guYykuCisjIFRoZSBidWcgd2FzIHRoYXQgcXVvdGluZyBhbmQgdW5xdW90aW5nIG9mIHRoZW0KKyMgd2FzIG91dCBvZiBzeW5jIGZvciByZWRpcmVjdCBmaWxlbmFtZXMuCisKKz51bmljb2RlLnNoCitlY2hvIC1lICdlY2hvIE9rID51bmlceDgxY29kZScgPj51bmljb2RlLnNoCitlY2hvIC1lICdjYXQgdW5pXHg4MWNvZGUnID4+dW5pY29kZS5zaAorZWNobyAtZSAnY2F0IHVuaT9jb2RlJyA+PnVuaWNvZGUuc2gKKy4gLi91bmljb2RlLnNoCitybSB1bmkqY29kZSoKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyOC5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjgucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQzMGIwMgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjgucmlnaHQKQEAgLTAsMCArMSwzIEBACitPaworT2sKK0RvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjgudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI4LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhjYjQyYzAKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI4LnRlc3RzCkBAIC0wLDAgKzEsMTUgQEAKKyMgQ2hhcnMgYWJvdmUgMHg3ZiBhcmUgdXNlZCBhcyBzcGVjaWFsIGNvZGVzLgorIyAweDgxIGlzIENUTEVTQyAoc2VlIGFzaC5jKS4KKyMgVGhlIGJ1ZyB3YXMgdGhhdCBxdW90aW5nIGFuZCB1bnF1b3Rpbmcgb2YgdGhlbQorIyB3YXMgb3V0IG9mIHN5bmMgZm9yIHJlZGlyZWN0IGZpbGVuYW1lcy4KKworIyBTdWJjYXNlIHdoZW4gcmVkaXJlY3QgZmlsZW5hbWUgaXMgc3BlY2lmaWVkIGluIGEgdmFyaWFibGUuCisKKz51bmljb2RlLnNoCitlY2hvIC1lICd2PXVuaVx4ODFjb2RlJyA+PnVuaWNvZGUuc2gKK2VjaG8gLWUgJ2VjaG8gT2sgPiIkdiInID4+dW5pY29kZS5zaAorZWNobyAtZSAnY2F0IHVuaVx4ODFjb2RlJyA+PnVuaWNvZGUuc2gKK2VjaG8gLWUgJ2NhdCB1bmk/Y29kZScgPj51bmljb2RlLnNoCisuIC4vdW5pY29kZS5zaAorcm0gdW5pKmNvZGUqCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjkucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI5LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0YzI1MTIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXI5LnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorT2sKK0RvbmU6MApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyOS50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjkudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGJlZmE2MQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpcjkudGVzdHMKQEAgLTAsMCArMSw0IEBACitlY2hvIE9rID5maWxlLnRtcAorY2F0IDA8PmZpbGUudG1wCitlY2hvIERvbmU6JD8KK3JtIGZpbGUudG1wCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtcmVkaXIvcmVkaXJBLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyQS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTQwNmUzCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyQS5yaWdodApAQCAtMCwwICsxLDIgQEAKK3RtcDExCit0bXAxMQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXJlZGlyL3JlZGlyQS50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpckEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTY4MzNmOQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1yZWRpci9yZWRpckEudGVzdHMKQEAgLTAsMCArMSwxMSBAQAoreD0idG1wMTE6dG1wMjIiCisKKyMgQnVnIHdhcyBpbmNvcnJlY3RseSBleHBhbmRpbmcgdmFyaWFibGVzIGluID5yZWRpcgorZWNobyAiJHt4JToqfSIgPiIke3glOip9IgorZWNobyB0bXAxKgorcm0gdG1wMSoKKworIyBBbHNvIHRyeSB1bnF1b3RlZAorZWNobyAiJHt4JToqfSIgPiR7eCU6Kn0KK2VjaG8gdG1wMSoKK3JtIHRtcDEqCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9yZWFwMS5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3JlYXAxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMjZkOTYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9yZWFwMS5yaWdodApAQCAtMCwwICsxIEBACitPawpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvcmVhcDEudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9yZWFwMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZjFhMWY5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvcmVhcDEudGVzdHMKQEAgLTAsMCArMSwxNCBAQAorIyEvYmluL3NoCisKKyMgTXVzdCBub3QgZmluZCB1cyBhbGl2ZQoreyBzbGVlcCAyOyBraWxsIC05ICQkOyB9IDI+L2Rldi9udWxsICYKKworc2xlZXAgMSAmCitQSUQ9JCEKKworIyBXZSBtdXN0IGV4aXQgdGhlIGxvb3AgaW4gb25lIHNlY29uZC4KKyMgV2UgaGFkIGJ1ZyA1MzA0OiBidWlsdGlucyBuZXZlciB3YWl0ZWQgZm9yIGV4aXRlZCBjaGlsZHJlbgord2hpbGUga2lsbCAtMCAkUElEID4vZGV2L251bGwgMj4mMTsgZG8KKyAgICB0cnVlCitkb25lCitlY2hvIE9rCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zYXZldHJhcC5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NhdmV0cmFwLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1OTIyNWIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zYXZldHJhcC5yaWdodApAQCAtMCwwICsxLDggQEAKK3RyYXAgLS0gJ2VjaG8gRXhpdGluZycgRVhJVAordHJhcCAtLSAnZWNobyBXSU5DSCEnIFdJTkNICit0cmFwIC0tICdlY2hvIEV4aXRpbmcnIEVYSVQKK3RyYXAgLS0gJ2VjaG8gV0lOQ0ghJyBXSU5DSAordHJhcCAtLSAnZWNobyBFeGl0aW5nJyBFWElUCit0cmFwIC0tICdlY2hvIFdJTkNIIScgV0lOQ0gKK0RvbmUKK0V4aXRpbmcKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NhdmV0cmFwLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2F2ZXRyYXAudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzJiMzEyZgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NhdmV0cmFwLnRlc3RzCkBAIC0wLDAgKzEsOSBAQAordHJhcCAnZWNobyBFeGl0aW5nJyBFWElUCit0cmFwICdlY2hvIFdJTkNIIScgU0lHV0lOQ0gKK3Y9YCB0cmFwICAgYAorZWNobyAiJHYiCit2PSQoCXRyYXAgKQorZWNobyAiJHYiCit2PWB0cmFwYAorZWNobyAiJHYiCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ2ludDEucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWdpbnQxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5MDk0YjAKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWdpbnQxLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK1NlbmRpbmcgU0lHSU5UIHRvIG1haW4gc2hlbGwgUElECmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWdpbnQxLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnaW50MS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zZDQ4M2QzCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnaW50MS50ZXN0cwpAQCAtMCwwICsxLDQxIEBACisjIFdoYXQgc2hvdWxkIGhhcHBlbiBpZiBub24taW50ZXJhY3RpdmUgc2hlbGwgZ2V0cyBTSUdJTlQ/CisKKyhzbGVlcCAxOyBlY2hvIFNlbmRpbmcgU0lHSU5UIHRvIG1haW4gc2hlbGwgUElEOyBleGVjIGtpbGwgLUlOVCAkJCkgJgorCisjIFdlIGNyZWF0ZSBhIGNoaWxkIHdoaWNoIGV4aXRzIHdpdGggMCBldmVuIG9uIFNJR0lOVAorIyAoVGhlIGNvbXBsZXggY29tbWFuZCBpcyBuZWNlc3Nhcnkgb25seSBpZiBTSUdJTlQgaXMgZ2VuZXJhdGVkIGJ5IF5DLAorIyBpbiB0aGlzIHRlc3RjYXNlIGV2ZW4gYmFyZSAic2xlZXAgMiIgd291bGQgZG8gYmVjYXVzZQorIyBpbiB0aGUgdGVzdGNhc2Ugd2UgZG9uJ3Qgc2VuZCBTSUdJTlQgKnRvIHRoZSBjaGlsZCouLi4pCiskVEhJU19TSCAtYyAndHJhcCAiZXhpdCAwIiBTSUdJTlQ7IHNsZWVwIDInCisKKyMgSW4gb25lIHNlY29uZCwgd2UgKG1haW4gc2hlbGwpIGdldCBTSUdJTlQgaGVyZS4KKyMgVGhlIHF1ZXN0aW9uIGlzIHdoZXRoZXIgd2Ugc2hvdWxkLCBvciBzaG91bGQgbm90LCBleGl0LgorCisjIGJhc2ggd2lsbCBub3Qgc3RvcCBoZXJlLiBJdCB3aWxsIGV4ZWN1dGUgbmV4dCBjb21tYW5kKHMpLgorCisjIFRoZSByYXRpb25hbGUgZm9yIHRoaXMgaXMgZGVzY3JpYmVkIGhlcmU6CisjIGh0dHA6Ly93d3cuY29ucy5vcmcvY3JhY2F1ZXIvc2lnaW50Lmh0bWwKKyMKKyMgQmFzaWNhbGx5LCBiYXNoIHdpbGwgbm90IGV4aXQgb24gU0lHSU5UIGltbWVkaWF0ZWx5IGlmIGl0IHdhaXRzCisjIGZvciBhIGNoaWxkLiBJdCB3aWxsIHdhaXQgZm9yIHRoZSBjaGlsZCB0byBleGl0LgorIyBJZiBjaGlsZCBleGl0cyBOT1QgYnkgZHlpbmcgb24gU0lHSU5ULCB0aGVuIGJhc2ggd2lsbCBub3QgZXhpdC4KKyMKKyMgVGhlIGlkZWEgaXMgdGhhdCB0aGUgZm9sbG93aW5nIHNjcmlwdDoKKyMgfCBlbWFjcyBmaWxlLnR4dAorIyB8IG1vcmUgY21kcworIyBVc2VyIG1heSB1c2UgXkMgdG8gaW50ZXJydXB0IGVkaXRvcidzIG9wcyBsaWtlIHNlYXJjaC4gQnV0IHRoZW4KKyMgZW1hY3MgZXhpdHMgbm9ybWFsbHkuIFVzZXIgZXhwZWN0cyB0aGF0IHNjcmlwdCBkb2Vzbid0IHN0b3AuCisjCisjIFRoaXMgaXMgYSBuaWNlIGlkZWEsIGJ1dCBkZXRlY3RpbmcgImRpZCBwcm9jZXNzIHJlYWxseSBleGl0CisjIHdpdGggU0lHSU5UPyIgaXMgcmFjeS4gQ29uc2lkZXI6CisjIHwgYmFzaCAtYyAnd2hpbGUgdHJ1ZTsgZG8gL2Jpbi90cnVlOyBkb25lJworIyBXaGVuIF5DIGlzIHByZXNzZWQgd2hpbGUgYmFzaCB3YWl0cyBmb3IgL2Jpbi90cnVlIHRvIGV4aXQsCisjIGl0IG1heSBoYXBwZW4gdGhhdCAvYmluL3RydWUgZXhpdHMgd2l0aCBleGl0Y29kZSAwIGJlZm9yZQorIyBeQyBpcyBkZWxpdmVyZWQgdG8gaXQgYXMgU0lHSU5ULiBiYXNoIHdpbGwgc2VlIFNJR0lOVCwgdGhlbgorIyBpdCB3aWxsIHNlZSB0aGF0IGNoaWxkIGV4aXRlZCB3aXRoIDAsIGFuZCBiYXNoIHdpbGwgTk9UIEVYSVQuCisKKyMgVGhlcmVmb3JlIHdlIGRvIG5vdCBpbXBsZW1lbnQgYmFzaCBiZWhhdmlvci4KKyMgSSdkIHNheSB0aGF0IGVtYWNzIG5lZWQgdG8gcHV0IGl0c2VsZiBpbnRvIGEgc2VwYXJhdGUgcGdycAorIyB0byBpc29sYXRlIHNoZWxsIGZyb20gZ2V0dGluZyBzdHJheSBTSUdJTlRzIGZyb20gXkMuCisKK2VjaG8gTmV4dCBjb21tYW5kIGFmdGVyIFNJR0lOVCB3YXMgZXhlY3V0ZWQKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDEucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWwxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNDAzYWMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWwxLnJpZ2h0CkBAIC0wLDAgKzEsMjAgQEAKK2dvdCBzaWduYWwKK3RyYXAgLS0gJ2VjaG8gZ290IHNpZ25hbCcgVVNSMQorc2VudCAxIHNpZ25hbAorZ290IHNpZ25hbAord2FpdCBpbnRlcnJ1cHRlZAordHJhcCAtLSAnZWNobyBnb3Qgc2lnbmFsJyBVU1IxCitzZW50IDIgc2lnbmFsCitnb3Qgc2lnbmFsCit3YWl0IGludGVycnVwdGVkCit0cmFwIC0tICdlY2hvIGdvdCBzaWduYWwnIFVTUjEKK3NlbnQgMyBzaWduYWwKK2dvdCBzaWduYWwKK3dhaXQgaW50ZXJydXB0ZWQKK3RyYXAgLS0gJ2VjaG8gZ290IHNpZ25hbCcgVVNSMQorc2VudCA0IHNpZ25hbAorZ290IHNpZ25hbAord2FpdCBpbnRlcnJ1cHRlZAordHJhcCAtLSAnZWNobyBnb3Qgc2lnbmFsJyBVU1IxCitzZW50IDUgc2lnbmFsCitzbGVlcCBjb21wbGV0ZWQKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDEudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWwxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI4YmZjNmEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWwxLnRlc3RzCkBAIC0wLDAgKzEsMjggQEAKK3RyYXAgImVjaG8gZ290IHNpZ25hbCIgVVNSMQorCitmb3IgdHJ5IGluIDEgMiAzIDQgNTsgZG8KKyAgICBraWxsIC1VU1IxICQkCisgICAgc2xlZXAgMC4yCisgICAgZWNobyAic2VudCAkdHJ5IHNpZ25hbCIKK2RvbmUgJgorCisjIEVuc3VyZSAid2FpdCIgaGFzIHNvbWV0aGluZyB0byB3YWl0IGZvcgorc2xlZXAgMiAmCisKKyMgRW5zdXJlIHdlIGRvIG5vdCBleGVjdXRlICJ0cmFwIiBiZWxvdyBiZWZvcmUgImtpbGwgLVVTUjEiIGFib3ZlCisjICh3YXMgZ2V0dGluZyBmYWlsdXJlIG9uIGxvYWRlZCBtYWNoaW5lIHdpdGhvdXQgdGhpcykKK3NsZWVwIDAuMQorCitzbGVlcGluZz10cnVlCit3aGlsZSAkc2xlZXBpbmc7IGRvCisgICAgdHJhcAorICAgIGlmIHdhaXQgJSU7IHRoZW4KKyAgICAgICAgZWNobyAic2xlZXAgY29tcGxldGVkIgorICAgICAgICBzbGVlcGluZz1mYWxzZQorICAgIGVsaWYgWyAkPyA9PSAxMjcgXTsgdGhlbgorICAgICAgICBlY2hvICJCVUc6IG5vIHByb2Nlc3NlcyB0byB3YWl0IGZvcj8hIgorICAgICAgICBzbGVlcGluZz1mYWxzZQorICAgIGVsc2UKKyAgICAgICAgZWNobyAid2FpdCBpbnRlcnJ1cHRlZCIKKyAgICBmaQorZG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsMi5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJhZjkxOQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDIucmlnaHQKQEAgLTAsMCArMSwzIEBACitjaGlsZCBzbGVlcHMKK2NoaWxkIGV4aXRzIGFzIGV4cGVjdGVkCitwYXJlbnQgZXhpdHMKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDIudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWwyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRmNjM5Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWwyLnRlc3RzCkBAIC0wLDAgKzEsMTggQEAKKyMhL2Jpbi9zaAorCiskVEhJU19TSCAtYyAnCitjbGVhbnVwKCkgeworICAgIGVjaG8gImNoaWxkIGV4aXRzIGFzIGV4cGVjdGVkIgorICAgIGV4aXQKK30KK3RyYXAgY2xlYW51cCBIVVAKK2VjaG8gImNoaWxkIHNsZWVwcyIKK3NsZWVwIDEKK2VjaG8gIkJBRCBleGl0IGZyb20gY2hpbGQhIgorJyAmCisKK2NoaWxkPSQhCitzbGVlcCAwLjEgIyBsZXQgY2hpbGQgaW5zdGFsbCBoYW5kbGVyIGZpcnN0CitraWxsIC1IVVAgJGNoaWxkCit3YWl0CitlY2hvICJwYXJlbnQgZXhpdHMiCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWwzLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsMy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTEzYmE1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsMy5yaWdodApAQCAtMCwwICsxLDQgQEAKK2NoaWxkIHNsZWVwcworY2hpbGQgZ290IEhVUAorY2hpbGQgZXhpdHMKK3BhcmVudCBleGl0cwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsMy50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjU2YzJkOQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDMudGVzdHMKQEAgLTAsMCArMSwxNyBAQAorIyEvYmluL3NoCisKKyRUSElTX1NIIC1jICcKK2h1cCgpIHsKKyAgICBlY2hvICJjaGlsZCBnb3QgSFVQIgorfQordHJhcCBodXAgSFVQCitlY2hvICJjaGlsZCBzbGVlcHMiCitzbGVlcCAxCitlY2hvICJjaGlsZCBleGl0cyIKKycgJgorCitjaGlsZD0kIQorc2xlZXAgMC4xICMgbGV0IGNoaWxkIGluc3RhbGwgaGFuZGxlciBmaXJzdAora2lsbCAtSFVQICRjaGlsZAord2FpdAorZWNobyAicGFyZW50IGV4aXRzIgpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNC5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI2MDU4NAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDQucmlnaHQKQEAgLTAsMCArMSw0IEBACisuL3NpZ25hbDQudGVzdHM6IHRyYXA6IGxpbmUgMzogQkFETkFNRTogaW52YWxpZCBzaWduYWwgc3BlY2lmaWNhdGlvbgorMQorVHJhcHBlZAorT2sKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDQudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZmMWM0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw0LnRlc3RzCkBAIC0wLDAgKzEsNSBAQAorIyEvYmluL3NoCisKK3RyYXAgImVjaG8gVHJhcHBlZCIgQkFETkFNRSBURVJNOyBlY2hvICQ/CitraWxsICQkCitlY2hvIE9rCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw1LnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2ZkNDExCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNS5yaWdodApAQCAtMCwwICsxLDEyIEBACitTbGVlcGluZworU2xlZXBpbmcKK1dhaXRpbmcKKzIgc2VjIHBhc3NlZCwgc2VuZGluZyBVU1IxIHRvIHBhcmVudAorVVNSMSByZWNlaXZlZAorV2FpdCBleGl0IGNvZGU6IDEzOAorV2FpdGluZworMyBzZWMgcGFzc2VkLCBzZW5kaW5nIFVTUjEgdG8gcGFyZW50CitVU1IxIHJlY2VpdmVkCitXYWl0IGV4aXQgY29kZTogMTM4CitXYWl0aW5nCitXYWl0IHJldHVybmVkIDAKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDUudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw1LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE3OWJjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw1LnRlc3RzCkBAIC0wLDAgKzEsMTQgQEAKK3RyYXAgImVjaG8gVVNSMSByZWNlaXZlZCIgVVNSMQorc3R1YigpIHsKKyAgICBlY2hvICJTbGVlcGluZyIKKyAgICBzbGVlcCAkMQorICAgIGVjaG8gIiQxIHNlYyBwYXNzZWQsIHNlbmRpbmcgVVNSMSB0byBwYXJlbnQiCisgICAga2lsbCAtVVNSMSAkJAorfQorc3R1YiAzICYKK3N0dWIgMiAmCitzbGVlcCAxCit1bnRpbCB7IGVjaG8gIldhaXRpbmciOyB3YWl0OyB9IGRvCisgICAgZWNobyAiV2FpdCBleGl0IGNvZGU6ICQ/IgorZG9uZQorZWNobyAiV2FpdCByZXR1cm5lZCAwIgpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNi5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDYucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0ZDkzMAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDYucmlnaHQKQEAgLTAsMCArMSwyIEBACitnb3QgVEVSTQorRG9uZTogMApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNi50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDYudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2NlMTUxMAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDYudGVzdHMKQEAgLTAsMCArMSwyIEBACit7IHRyYXAgImVjaG8gZ290IFRFUk0iIFRFUk07IHNsZWVwIDM7IH0mIHNsZWVwIDE7IGtpbGwgJCE7IHdhaXQKK2VjaG8gRG9uZTogJD8KZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDcucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw3LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzQ1M2UKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw3LnJpZ2h0CkBAIC0wLDAgKzEgQEAKK0J1ZyBkZXRlY3RlZDogMApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsNy50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDcudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYzJiMTM4MQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDcudGVzdHMKQEAgLTAsMCArMSwxOCBAQAorYnVnKCkgeworCXRyYXAgOiBleGl0CisJIyBCdWcgd2FzIGNhdXNpbmcgc2ggdG8gYmUgcnVuIGluIHN1YnNoZWxsLAorCSMgYXMgaWYgdGhpcyBsaW5lIGlzIHJlcGxhY2VkIHdpdGggKHNoIC1jIC4uLjsgZXhpdCAkPykgJgorCSMgaGVyZToKKwlzaCAtYyAnZWNobyBSRUFMX0NISUxEPSQkJyAmCisJZWNobyBQQVJFTlRTX0lERUFfT0ZfQ0hJTEQ9JCEKKwl3YWl0ICAjIG1ha2Ugc3VyZSBia2dkIHNoZWxsIGNvbXBsZXRlcworfQorCitidWcgfCB7Cit3aGlsZSByZWFkIHZhcnZhbDsgZG8KKwlldmFsICR2YXJ2YWwKK2RvbmUKK3Rlc3QgeCIkUkVBTF9DSElMRCIgIT0geCIiIFwKKyYmIHRlc3QgeCIkUkVBTF9DSElMRCIgPSB4IiRQQVJFTlRTX0lERUFfT0ZfQ0hJTEQiCitlY2hvICJCdWcgZGV0ZWN0ZWQ6ICQ/IgorfQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsOC5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDgucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk1NzJmMwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDgucmlnaHQKQEAgLTAsMCArMSwzIEBACitSZW1vdmluZyB0cmFwcworRW5kIG9mIGV4aXRfZnVuYworRG9uZTogMApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXNpZ25hbHMvc2lnbmFsOC50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDgudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzMxYWY3NAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDgudGVzdHMKQEAgLTAsMCArMSwxOCBAQAorIiRUSElTX1NIIiAtYyAnCitleGl0X2Z1bmMoKSB7CisgICAgZWNobyAiUmVtb3ZpbmcgdHJhcHMiCisgICAgdHJhcCAtIEVYSVQgVEVSTSBJTlQKKyAgICBlY2hvICJFbmQgb2YgZXhpdF9mdW5jIgorfQorc2V0IC1lCit0cmFwIGV4aXRfZnVuYyBFWElUIFRFUk0gSU5UCitzbGVlcCAyCitleGl0IDc3CisnICYKKworc2xlZXAgMQorIyBCVUc6IGFzaCBraWxscyAtUEdSUCwgYnV0IGluIG5vbi1pbnRlcmFjdGl2ZSBzaGVsbCB3ZSBkbyBub3QgY3JlYXRlIHBncnBzIQorIyBJbiB0aGlzIGNhc2UsIGJhc2gga2lsbHMgYnkgUElELCBub3QgUEdSUC4KK2tpbGwgLVRFUk0gJTEKK3dhaXQKK2VjaG8gRG9uZTogJD8KZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDkucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw5LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NTcyZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw5LnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorUmVtb3ZpbmcgdHJhcHMKK0VuZCBvZiBleGl0X2Z1bmMKK0RvbmU6IDAKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC1zaWduYWxzL3NpZ25hbDkudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw5LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE4ZTcxMDEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc2lnbmFscy9zaWduYWw5LnRlc3RzCkBAIC0wLDAgKzEsMjEgQEAKKyMgTm90ZTogdGhlIGlubmVyIHNjcmlwdCBpcyBhIHRlc3Qgd2hpY2ggY2hlY2tzIGZvciBhIGRpZmZlcmVudCBidWcKKyMgKG9yZGVyaW5nIGJldHdlZW4gSU5UIGhhbmRsZXIgYW5kIGV4aXQgb24gInNldCAtZSIpLAorIyBidXQgc28gZmFyIEkgZGlkIG5vdCBmaWd1cmUgb3V0IGhvdyB0byBzaW11bGF0ZSBpdCBub24taW50ZXJhY3RpdmVseS4KKworIiRUSElTX1NIIiAtYyAnCitleGl0X2Z1bmMoKSB7CisgICAgZWNobyAiUmVtb3ZpbmcgdHJhcHMiCisgICAgdHJhcCAtIEVYSVQgVEVSTSBJTlQKKyAgICBlY2hvICJFbmQgb2YgZXhpdF9mdW5jIgorfQorc2V0IC1lCit0cmFwIGV4aXRfZnVuYyBFWElUIFRFUk0gSU5UCitzbGVlcCAyCitleGl0IDc3CisnICYKKworY2hpbGQ9JCEKK3NsZWVwIDEKK2tpbGwgLVRFUk0gJGNoaWxkCit3YWl0CitlY2hvIERvbmU6ICQ/CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS9ub2V4ZWNfZ2V0c19ub19lbnYucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS9ub2V4ZWNfZ2V0c19ub19lbnYucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUyMmRmZgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zdGFuZGFsb25lL25vZXhlY19nZXRzX25vX2Vudi5yaWdodApAQCAtMCwwICsxLDQgQEAKK1ZBUjc9VkFMCiswCitWQVI4PVZBTAorMApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXN0YW5kYWxvbmUvbm9leGVjX2dldHNfbm9fZW52LnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXN0YW5kYWxvbmUvbm9leGVjX2dldHNfbm9fZW52LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjBkMzQ3YmQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS9ub2V4ZWNfZ2V0c19ub19lbnYudGVzdHMKQEAgLTAsMCArMSw1IEBACitleHBvcnQgVkFSNz1WQUwKK2VudiB8IGdyZXAgXlZBUjc9CitlY2hvICQ/CitWQVI4PVZBTCBlbnYgfCBncmVwIF5WQVI4PQorZWNobyAkPwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXN0YW5kYWxvbmUvbm9mb3JrX3RyYXNoZXNfZ2V0b3B0LnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXN0YW5kYWxvbmUvbm9mb3JrX3RyYXNoZXNfZ2V0b3B0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MzU0MWEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS9ub2ZvcmtfdHJhc2hlc19nZXRvcHQucmlnaHQKQEAgLTAsMCArMSBAQAorMApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXN0YW5kYWxvbmUvbm9mb3JrX3RyYXNoZXNfZ2V0b3B0LnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXN0YW5kYWxvbmUvbm9mb3JrX3RyYXNoZXNfZ2V0b3B0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY0MmM1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS9ub2ZvcmtfdHJhc2hlc19nZXRvcHQudGVzdHMKQEAgLTAsMCArMSw2IEBACisjIEluIHRoaXMgdGVzdCwgcm0gaXMgTk9GT1JLIGFuZCBpdCBtb2RpZmllcyBnZXRvcHQgaW50ZXJuYWwgc3RhdGUKK3JtIC1mIG5vbl9leGlzdGVudF9maWxlCisjIFN1YnNlcXVlbnQgaGV4ZHVtcCBpcyBydW4gYXMgTk9FWEVDLCBhbmQgdGh1cyBzdGlsbCB1c2VzIHRoaXMgc3RhdGUKK2hleGR1bXAgPC9kZXYvbnVsbAorIyBEaWQgaGV4ZHVtcCBzZWdmYXVsdCBldGM/CitlY2hvICQ/CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS92YXJfc3RhbmRhbG9uZTEucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS92YXJfc3RhbmRhbG9uZTEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0NTdmZAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zdGFuZGFsb25lL3Zhcl9zdGFuZGFsb25lMS5yaWdodApAQCAtMCwwICsxIEBACitEb25lOiAxCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS92YXJfc3RhbmRhbG9uZTEudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtc3RhbmRhbG9uZS92YXJfc3RhbmRhbG9uZTEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWU5MDViYQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC1zdGFuZGFsb25lL3Zhcl9zdGFuZGFsb25lMS50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK1ZBUj00MiAkVEhJU19TSCAtYyAndW5zZXQgVkFSOyBlbnYgfCBncmVwIF5WQVInCitlY2hvIERvbmU6ICQ/CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXItZG8tbm90LWNvbGxhcHNlLWFyaXRobWV0aWMtZXhwYW5zaW9uLWF0LXBhcnNlLXRpbWUucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXItZG8tbm90LWNvbGxhcHNlLWFyaXRobWV0aWMtZXhwYW5zaW9uLWF0LXBhcnNlLXRpbWUucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFhMTU4NQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhci1kby1ub3QtY29sbGFwc2UtYXJpdGhtZXRpYy1leHBhbnNpb24tYXQtcGFyc2UtdGltZS5yaWdodApAQCAtMCwwICsxLDIgQEAKKzEyCis5CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXItZG8tbm90LWNvbGxhcHNlLWFyaXRobWV0aWMtZXhwYW5zaW9uLWF0LXBhcnNlLXRpbWUudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXItZG8tbm90LWNvbGxhcHNlLWFyaXRobWV0aWMtZXhwYW5zaW9uLWF0LXBhcnNlLXRpbWUudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTk3YTA4YQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhci1kby1ub3QtY29sbGFwc2UtYXJpdGhtZXRpYy1leHBhbnNpb24tYXQtcGFyc2UtdGltZS50ZXN0cwpAQCAtMCwwICsxLDMgQEAKK3Vuc2V0IGEKK2VjaG8gJCgoMyArICR7YTo9JCgoNCArIDUpKX0pKQorZWNobyAkYQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLWRvLW5vdC1leHBhbmQtdGlsZGUtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi1pbi1xdW90ZXMucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXItZG8tbm90LWV4cGFuZC10aWxkZS1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLWluLXF1b3Rlcy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjliNGYwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLWRvLW5vdC1leHBhbmQtdGlsZGUtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi1pbi1xdW90ZXMucmlnaHQKQEAgLTAsMCArMSBAQAorfnJvb3QKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhci1kby1ub3QtZXhwYW5kLXRpbGRlLWluLXBhcmFtZXRlci1leHBhbnNpb24taW4tcXVvdGVzLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLWRvLW5vdC1leHBhbmQtdGlsZGUtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi1pbi1xdW90ZXMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDhlYjhmYwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhci1kby1ub3QtZXhwYW5kLXRpbGRlLWluLXBhcmFtZXRlci1leHBhbnNpb24taW4tcXVvdGVzLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAordW5zZXQgYQorZWNobyAiJHthOi1+cm9vdH0iCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXItZG8tbm90LXF1b3RlLWJhY2tzbGFzaGVzLWluLXBhcmFtZXRlci1leHBhbnNpb25zLW91dHNpZGUtcXVvdGVzLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLWRvLW5vdC1xdW90ZS1iYWNrc2xhc2hlcy1pbi1wYXJhbWV0ZXItZXhwYW5zaW9ucy1vdXRzaWRlLXF1b3Rlcy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzBlYmRlCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLWRvLW5vdC1xdW90ZS1iYWNrc2xhc2hlcy1pbi1wYXJhbWV0ZXItZXhwYW5zaW9ucy1vdXRzaWRlLXF1b3Rlcy5yaWdodApAQCAtMCwwICsxIEBACisvYi9jLwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLWRvLW5vdC1xdW90ZS1iYWNrc2xhc2hlcy1pbi1wYXJhbWV0ZXItZXhwYW5zaW9ucy1vdXRzaWRlLXF1b3Rlcy50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhci1kby1ub3QtcXVvdGUtYmFja3NsYXNoZXMtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbnMtb3V0c2lkZS1xdW90ZXMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmI5MzcxNAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhci1kby1ub3QtcXVvdGUtYmFja3NsYXNoZXMtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbnMtb3V0c2lkZS1xdW90ZXMudGVzdHMKQEAgLTAsMCArMSwzIEBACithPS9iL2MvKgorYj1cXAorZWNobyAke2ElJGIqfQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLWV4cGFuZC10aWxkZS1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLWV4cGFuZC10aWxkZS1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzNTc3NTAKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXItZXhwYW5kLXRpbGRlLWluLXBhcmFtZXRlci1leHBhbnNpb24ucmlnaHQKQEAgLTAsMCArMSBAQAorOi9yb290CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXItZXhwYW5kLXRpbGRlLWluLXBhcmFtZXRlci1leHBhbnNpb24udGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXItZXhwYW5kLXRpbGRlLWluLXBhcmFtZXRlci1leHBhbnNpb24udGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjYwNTMxNQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhci1leHBhbmQtdGlsZGUtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK2E9fnJvb3Q6fnJvb3QKK2VjaG8gJHthI35yb290fQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi0xLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi0xLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYTMyNzIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXItcGF0dGVybi1yZXBsYWNlbWVudC1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLTEucmlnaHQKQEAgLTAsMCArMSBAQAorYV9cX3pfYwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi0xLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi0xLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU0NTI5YzYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXItcGF0dGVybi1yZXBsYWNlbWVudC1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLTEudGVzdHMKQEAgLTAsMCArMSwyIEBACit2PSJhXGJjIgorZWNobyAke3YvXFxiL19cXF9cel99CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXItcGF0dGVybi1yZXBsYWNlbWVudC1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLTIucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXItcGF0dGVybi1yZXBsYWNlbWVudC1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLTIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ0N2MwYQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhci1wYXR0ZXJuLXJlcGxhY2VtZW50LWluLXBhcmFtZXRlci1leHBhbnNpb24tMi5yaWdodApAQCAtMCwwICsxIEBACitheC95YwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi0yLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi0yLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJkYjFkYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXItcGF0dGVybi1yZXBsYWNlbWVudC1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLTIudGVzdHMKQEAgLTAsMCArMSwyIEBACit2PSJhYmMiCitlY2hvICR7di9iL3gveX0KZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhci1wYXR0ZXJuLXJlcGxhY2VtZW50LWluLXBhcmFtZXRlci1leHBhbnNpb24tMy5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhci1wYXR0ZXJuLXJlcGxhY2VtZW50LWluLXBhcmFtZXRlci1leHBhbnNpb24tMy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWE1ZmY4Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi0zLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK2F4Y2FiYwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi0zLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi0zLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA5MzVlNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXItcGF0dGVybi1yZXBsYWNlbWVudC1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLTMudGVzdHMKQEAgLTAsMCArMSwyIEBACit2PSJhYmNhYmMiCitlY2hvICR7di9iL3h9CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXItcGF0dGVybi1yZXBsYWNlbWVudC1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLTQucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXItcGF0dGVybi1yZXBsYWNlbWVudC1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLTQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZkZDc1MAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhci1wYXR0ZXJuLXJlcGxhY2VtZW50LWluLXBhcmFtZXRlci1leHBhbnNpb24tNC5yaWdodApAQCAtMCwwICsxIEBACitheGNheGMKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhci1wYXR0ZXJuLXJlcGxhY2VtZW50LWluLXBhcmFtZXRlci1leHBhbnNpb24tNC50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhci1wYXR0ZXJuLXJlcGxhY2VtZW50LWluLXBhcmFtZXRlci1leHBhbnNpb24tNC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kOGRlODQzCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi00LnRlc3RzCkBAIC0wLDAgKzEsMiBAQAordj0iYWJjYWJjIgorZWNobyAke3YvL2IveH0KZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhci1wYXR0ZXJuLXJlcGxhY2VtZW50LWluLXBhcmFtZXRlci1leHBhbnNpb24tNS5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhci1wYXR0ZXJuLXJlcGxhY2VtZW50LWluLXBhcmFtZXRlci1leHBhbnNpb24tNS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTliMjdiCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi01LnJpZ2h0CkBAIC0wLDAgKzEgQEAKK2F4YwpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi01LnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi01LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU1MjM4ODgKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXItcGF0dGVybi1yZXBsYWNlbWVudC1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLTUudGVzdHMKQEAgLTAsMCArMSwyIEBACit2PSJhYi9jIgorZWNobyAke3YvYlwvL3h9CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXItcnVudGltZS1xdW90ZS1kZXRlY3Rpb24ucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXItcnVudGltZS1xdW90ZS1kZXRlY3Rpb24ucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1NGQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhci1ydW50aW1lLXF1b3RlLWRldGVjdGlvbi5yaWdodApAQCAtMCwwICsxIEBACis8PgpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLXJ1bnRpbWUtcXVvdGUtZGV0ZWN0aW9uLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyLXJ1bnRpbWUtcXVvdGUtZGV0ZWN0aW9uLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmU1NzA2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXItcnVudGltZS1xdW90ZS1kZXRlY3Rpb24udGVzdHMKQEAgLTAsMCArMSBAQAorZm9vPVxcIGVjaG8gIjwke2ZvbyNbXFxdfT4iCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXIxLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTAxMjkxCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyMS5yaWdodApAQCAtMCwwICsxLDYgQEAKK2E9YSBBPWEKK2E9YSBBPWEKK2E9IEE9CithPSBBPQorYT1hIEE9YQorYT1hIEE9YQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyMS50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3ZhcjEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODAyZTQ4OQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3ZhcjEudGVzdHMKQEAgLTAsMCArMSwxNCBAQAorIyBjaGVjayB0aGF0IGZpcnN0IGFzc2lnbm1lbnQgaGFzIHByb3BlciBlZmZlY3Qgb24gc2Vjb25kIG9uZQorCisoCithPWEgQT0kYQorZWNobyBhPSRhIEE9JEEKKykKKyhhPWEgQT0kYTsgZWNobyBhPSRhIEE9JEEpCisoYT1hIEE9JGEgZWNobyBhPSRhIEE9JEEpCisoYT1hIEE9JGEgL2Jpbi9lY2hvIGE9JGEgQT0kQSkKKworZigpIHsgZWNobyBhPSRhIEE9JEE7IH0KKworKGE9YSBBPSRhIGYpCisoYT1hIEE9JGE7IGYpCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXIyLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZmVkMTM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyMi5yaWdodApAQCAtMCwwICsxIEBACitidXMvdXNiLzEvMgpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyMi50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3ZhcjIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDdmZWFlYgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3ZhcjIudGVzdHMKQEAgLTAsMCArMSBAQAorWD11c2JkZXYxLjIgWD0ke1gjdXNiZGV2fSBCPSR7WCUlLip9IEQ9JHtYIyoufTsgZWNobyBidXMvdXNiLyRCLyRECmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXIzLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyMy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWIwZTMzCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyMy5yaWdodApAQCAtMCwwICsxLDUgQEAKKzEKKzEKKworCiswCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXIzLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyMy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45N2IxMDJjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyMy50ZXN0cwpAQCAtMCwwICsxIEBACit4PTA7IGYoKSB7IGxvY2FsIHg9MTsgZWNobyAkeDsgbG9jYWwgeDsgZWNobyAkeDsgdW5zZXQgeDsgZWNobyAkeDsgbG9jYWwgeDsgZWNobyAkeDsgfTsgZjsgZWNobyAkeApkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2gxLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2gxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYTA3NjkKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDEucmlnaHQKQEAgLTAsMCArMSwxNCBAQAorCisKK2YKK2JjZGVmCithYmNkZWYKK2FiY2RlZgorYmNkZQorYWJjZAorYWJjZAorYWJjZGVmCitiY2RlZgorYWJjZGVmCithYmNkZWYKK2FiY2RlZgpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2gxLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2gxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI0ZDNjOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDEudGVzdHMKQEAgLTAsMCArMSwxOCBAQAordmFyPWFiY2RlZgorCitlY2hvICR7dmFyOjd9CitlY2hvICR7dmFyOjZ9CitlY2hvICR7dmFyOjV9CitlY2hvICR7dmFyOjF9CitlY2hvICR7dmFyOjB9CitlY2hvICR7dmFyOi0xfQorCitlY2hvICR7dmFyOjE6NH0KK2VjaG8gJHt2YXI6MDo0fQorZWNobyAke3Zhcjo6NH0KK2VjaG8gJHt2YXI6LTE6NH0KKworZWNobyAke3ZhcjoxOjd9CitlY2hvICR7dmFyOjA6N30KK2VjaG8gJHt2YXI6Ojd9CitlY2hvICR7dmFyOi0xOjd9CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDIucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiYTVjNgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoMi5yaWdodApAQCAtMCwwICsxLDEwIEBACithYmMxMjN4Y2JhMTIzCithYngxMjNkY2JhMTIzCithYngxMjNkeGJhMTIzCithYmN4MjNkY2JhMTIzCithYmN4eHhkY2JheHh4CithYngKK3hiYTEyMworYWJ4MjMKK2FiYzIzZGNiYTEyMworYWJjZGNiYQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2gyLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2gyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI5YzUyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDIudGVzdHMKQEAgLTAsMCArMSwyNCBAQAordmFyPWFiYzEyM2RjYmExMjMKKworZWNobyAke3Zhci9kL3h9CitlY2hvICR7dmFyL2MveH0KK2VjaG8gJHt2YXIvL2MveH0KK2VjaG8gJHt2YXIvWzEyM10veH0KK2VjaG8gJHt2YXIvL1sxMjNdL3h9CitlY2hvICR7dmFyL2MqL3h9CitlY2hvICR7dmFyLypjL3h9CisKKyMgbXVzdCBtYXRjaCBsb25nZXN0IG1hdGNoOiByZXN1bHQgaXMgImFieDIzIgorZWNobyAke3Zhci9jKjEveH0KKworIyBlbXB0eSByZXBsYWNlbWVudCAtIDJuZCBzbGFzaCBjYW4gYmUgb21pdHRlZAorZWNobyAke3Zhci9bMTIzXX0KK2VjaG8gJHt2YXIvL1sxMjNdfQorCisjIyMgYXNoIGRvZXNuJ3Qgc3VwcG9ydAorIyMjICMgbWF0Y2ggb25seSBhdCB0aGUgYmVnaW5uaW5nOgorIyMjIGVjaG8gJHt2YXIvI2EveH0KKyMjIyBlY2hvICR7dmFyLyNiL3h9ICMgc2hvdWxkIG5vdCBtYXRjaAorIyMjIGVjaG8gJHt2YXIvLyNiL3h9ICMgc2hvdWxkIG5vdCBtYXRjaAorIyMjICMgbWF0Y2ggb25seSBhdCB0aGUgZW5kOgorIyMjIGVjaG8gJHt2YXIvJTMveH0KZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoMy5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoMy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTdjODUwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2gzLnJpZ2h0CkBAIC0wLDAgKzEsMjAgQEAKKzEgYTA0MSNjCisyIGEwNDEjYworMyBhXDA0MSNjCis0IGFcMDQxI2MKKzUgYVwwNDEjYworNiBhXDA0MSNjCis3IGFcMDQxI2MKKzggYVwwNDEjYworOSBhXDA0MSNjCisxMCBhXGMKKzExIGFcYworMTIgYVxjCisxMyBhXFxjCisxNCBhXFxjCisxNSBhXFxjCisxNiBhXHRjCisxNyBhXHRjCisxOCBhXHRjCisxOSBhdGMKKzIwIGFcdGMKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoMy50ZXN0cyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoMy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNDZkYmI2Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2gzLnRlc3RzCkBAIC0wLDAgKzEsNDEgQEAKK2E9J2FiYycKK3I9JHthLy9iL1wwNDEjfQorZWNobyAxICRyCitlY2hvIDIgJHthLy9iL1wwNDEjfQorZWNobyAzICIke2EvL2IvXDA0MSN9IgorCithPSdhYmMnCityPSR7YS8vYi9cXDA0MSN9CitlY2hvIDQgJHIKK2VjaG8gNSAke2EvL2IvXFwwNDEjfQorZWNobyA2ICIke2EvL2IvXFwwNDEjfSIKKworYT0nYWJjJworYj0nXDA0MSMnCityPSR7YS8vYi8kYn0KK2VjaG8gNyAkcgorZWNobyA4ICR7YS8vYi8kYn0KK2VjaG8gOSAiJHthLy9iLyRifSIKKworYT0nYWJjJworYj0nXCcKK3I9IiR7YS8vYi8kYn0iCitlY2hvIDEwICRyCitlY2hvIDExICR7YS8vYi8kYn0KK2VjaG8gMTIgIiR7YS8vYi8kYn0iCisKK2E9J2FiYycKK2I9J1xcJworcj0iJHthLy9iLyRifSIKK2VjaG8gMTMgJHIKK2VjaG8gMTQgJHthLy9iLyRifQorZWNobyAxNSAiJHthLy9iLyRifSIKKworYT0nYWJjJworYj0nXHQnCityPSIke2EvL2IvJGJ9IgorZWNobyAxNiAkcgorZWNobyAxNyAke2EvL2IvJGJ9CitlY2hvIDE4ICIke2EvL2IvJGJ9IgorZWNobyAxOSAke2EvL2IvXHR9CitlY2hvIDIwICIke2EvL2IvXHR9IgpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2g0LnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2Jhc2g0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMGU4NTMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDQucmlnaHQKQEAgLTAsMCArMSwyMyBAQAorU291cmNlOiAgICAgICAgYSpiXCpjCitSZXBsYWNlIHN0cjogICBfXFxfXHpfCitQYXR0ZXJuOiAgICAgICBzaW5nbGUgYmFja3NsYXNoIGFuZCBzdGFyOiAicmVwbGFjZSBsaXRlcmFsIHN0YXIiCitJbiBhc3NpZ25tZW50OiBhX1xfel9iXCpjCitVbnF1b3RlZDogICAgICBhX1xfel9iXCpjCitRdW90ZWQ6ICAgICAgICBhX1xfXHpfYlwqYworUGF0dGVybjogICAgICAgZG91YmxlIGJhY2tzbGFzaCBhbmQgc3RhcjogInJlcGxhY2UgYmFja3NsYXNoIGFuZCBldmVyeXRoaW5nIGFmdGVyIGl0IgorSW4gYXNzaWdubWVudDogYSpiX1xfel8KK1VucXVvdGVkOiAgICAgIGEqYl9cX3pfCitRdW90ZWQ6ICAgICAgICBhKmJfXF9cel8KKworU291cmNlOiAgICAgICAgYVxiYworUmVwbGFjZSBzdHI6ICAgX1xcX1x6XworUGF0dGVybjogICAgICAgc2luZ2xlIGJhY2tzbGFzaCBhbmQgYjogInJlcGxhY2UgYiIKK0luIGFzc2lnbm1lbnQ6IGFcX1xfel9jCitVbnF1b3RlZDogICAgICBhXF9cX3pfYworUXVvdGVkOiAgICAgICAgYVxfXF9cel9jCitQYXR0ZXJuOiAgICAgICBkb3VibGUgYmFja3NsYXNoIGFuZCBiOiAicmVwbGFjZSBiYWNrc2xhc2ggYW5kIGIiCitJbiBhc3NpZ25tZW50OiBhX1xfel9jCitVbnF1b3RlZDogICAgICBhX1xfel9jCitRdW90ZWQ6ICAgICAgICBhX1xfXHpfYworCitEb25lOiAwCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDQudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDU0NzA2MQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoNC50ZXN0cwpAQCAtMCwwICsxLDQ3IEBACisjIFRoaXMgdGVzdGNhc2UgZGVtb25zdHJhdGVzIHRoYXQgYmFja3NsYXNoZXMgYXJlIHRyZWF0ZWQgZGlmZmVyZW50bHkKKyMgaW4gMXN0IGFuZCAybmQgcGFydHMgb2YgJHt2YXIvc2VhcmNoL3JlcGx9OgorIyBpZiBxdW90ZWQgKCIke3Zhci9zZWFyY2gvcmVwbH0iKSwgYW5kIHJlcGwgY29udGFpbnMgXGEgKGEgbm9uLXNwZWNpYWwgY2hhciksCisjIHRoZSBiYWNrc2xhc2ggaW4gcmVwbCBzdGF5czsgaWYgdW5xdW90ZWQsIGJhY2tzbGFzaCBpcyByZW1vdmVkLgorIyBCdXQgc2VhcmNoIHBhcnQgZG9lcyBub3QgYWN0IGxpa2UgdGhhdDogXGEgaXMgYWx3YXlzIGNvbnZlcnRlZCB0byBqdXN0IGEsCisjIGV2ZW4gaW4gcXVvdGVzLgorIworIyBiYXNoNCAoYW5kIHByb2JhYmx5IGJhc2gzIHRvbyk6ICJRdW90ZWQ6IiByZXN1bHRzIGFyZSBkaWZmZXJlbnQgZnJvbQorIyB1bnF1b3RlZCBhbmQgYXNzaWdubWVudCBleHBhbnNpb25zIC0gdGhleSBoYXZlIGEgYmFja3NsYXNoIGJlZm9yZSB6LgorCit2PSdhKmJcKmMnCitlY2hvICdTb3VyY2U6ICAgICAgICcgIiR2IgorZWNobyAnUmVwbGFjZSBzdHI6ICAnICdfXFxfXHpfJworCitlY2hvICdQYXR0ZXJuOiAgICAgICcgJ3NpbmdsZSBiYWNrc2xhc2ggYW5kIHN0YXI6ICJyZXBsYWNlIGxpdGVyYWwgc3RhciInCityPSR7di9cKi9fXFxfXHpffQorZWNobyAnSW4gYXNzaWdubWVudDonICIkciIKK2VjaG8gJ1VucXVvdGVkOiAgICAgJyAke3YvXCovX1xcX1x6X30KK2VjaG8gJ1F1b3RlZDogICAgICAgJyAiJHt2L1wqL19cXF9cel99IgorCitlY2hvICdQYXR0ZXJuOiAgICAgICcgJ2RvdWJsZSBiYWNrc2xhc2ggYW5kIHN0YXI6ICJyZXBsYWNlIGJhY2tzbGFzaCBhbmQgZXZlcnl0aGluZyBhZnRlciBpdCInCityPSR7di9cXCovX1xcX1x6X30KK2VjaG8gJ0luIGFzc2lnbm1lbnQ6JyAiJHIiCitlY2hvICdVbnF1b3RlZDogICAgICcgICR7di9cXCovX1xcX1x6X30KK2VjaG8gJ1F1b3RlZDogICAgICAgJyAiJHt2L1xcKi9fXFxfXHpffSIKKworZWNobworCit2PSdhXGJjJworZWNobyAnU291cmNlOiAgICAgICAnICIkdiIKK2VjaG8gJ1JlcGxhY2Ugc3RyOiAgJyAnX1xcX1x6XycKKworZWNobyAnUGF0dGVybjogICAgICAnICdzaW5nbGUgYmFja3NsYXNoIGFuZCBiOiAicmVwbGFjZSBiIicKK3I9JHt2L1xiL19cXF9cel99CitlY2hvICdJbiBhc3NpZ25tZW50OicgIiRyIgorZWNobyAnVW5xdW90ZWQ6ICAgICAnICAke3YvXGIvX1xcX1x6X30KK2VjaG8gJ1F1b3RlZDogICAgICAgJyAiJHt2L1xiL19cXF9cel99IgorCitlY2hvICdQYXR0ZXJuOiAgICAgICcgJ2RvdWJsZSBiYWNrc2xhc2ggYW5kIGI6ICJyZXBsYWNlIGJhY2tzbGFzaCBhbmQgYiInCityPSR7di9cXGIvX1xcX1x6X30KK2VjaG8gJ0luIGFzc2lnbm1lbnQ6JyAiJHIiCitlY2hvICdVbnF1b3RlZDogICAgICcgICR7di9cXGIvX1xcX1x6X30KK2VjaG8gJ1F1b3RlZDogICAgICAgJyAiJHt2L1xcYi9fXFxfXHpffSIKKworZWNobworCitlY2hvIERvbmU6ICQ/CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDUucmlnaHQgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDUucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc4ZWQzMgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoNS5yaWdodApAQCAtMCwwICsxLDQgQEAKK2EvCithL2QKK2EvZS9mCitEb25lOiAwCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDUudGVzdHMgYi9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfYmFzaDUudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2Y0ODJhNQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9iYXNoNS50ZXN0cwpAQCAtMCwwICsxLDExIEBACisjIFRoaXMgdGVzdGNhc2UgY2hlY2tzIHdoZXRoZXIgc2xhc2hlcyBpbiAke3YvYS9ifSBhcmUgcGFyc2VkIGJlZm9yZQorIyBvciBhZnRlciBleHBhbnNpb25zCisKK3Y9J2EvYi9jJworcz0nYi9jJworcj0nZS9mJworZWNobyAiJHt2LyRzfSIKK2VjaG8gIiR7di8kcy9kfSIKK2VjaG8gIiR7di8kcy8kcn0iCisKK2VjaG8gRG9uZTogJD8KZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9sZWFrLnJpZ2h0IGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2xlYWsucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhNWUzMgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9sZWFrLnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorc2hvdWxkIGJlIGVtcHR5OiAnJworc2hvdWxkIGJlIGVtcHR5OiAnJworc2hvdWxkIGJlIG5vdCBlbXB0eTogJ3ZhbDInCitzaG91bGQgYmUgbm90IGVtcHR5OiAndmFsMycKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9sZWFrLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX2xlYWsudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTI0MmUyNAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9sZWFrLnRlc3RzCkBAIC0wLDAgKzEsMjMgQEAKKyMgY2F0IGlzIGFuIGV4dGVybmFsIHByb2dyYW0sIHZhcmlhYmxlIHNob3VsZCBub3QgbGVhayBvdXQgb2YgaXQuCisjIHRoaXMgY3VycmVudGx5IGZhaWxzIHdpdGggQ09ORklHX0ZFQVRVUkVfU0hfTk9GT1JLPXkKK1ZBUj0nJworVkFSPXZhbDAgY2F0IC9kZXYvbnVsbAorZWNobyAic2hvdWxkIGJlIGVtcHR5OiAnJFZBUiciCisKKyMgdHJ1ZSBpcyBhIHJlZ3VsYXIgYnVpbHRpbiwgdmFyaWFibGUgc2hvdWxkIG5vdCBsZWFrIG91dCBvZiBpdC4KK1ZBUj0nJworVkFSPXZhbDEgdHJ1ZQorZWNobyAic2hvdWxkIGJlIGVtcHR5OiAnJFZBUiciCisKKyMgYXNoIGZvbGxvd3MgdGhlICJzcGVjaWFsIGJ1aWx0aW4gbGVha3MgdmFyaWFibGVzIiBydWxlIGhlcmU6CisjIGV4ZWMgaXMgYSBzcGVjaWFsIGJ1aWx0aW4uIChiYXNoIGRvZXMgbm90IGRvIGl0KQorVkFSPScnCitWQVI9dmFsMiBleGVjIDI+JjEKK2VjaG8gInNob3VsZCBiZSBub3QgZW1wdHk6ICckVkFSJyIKKworIyBhc2ggZm9sbG93cyB0aGUgImZ1bmN0aW9uIGNhbGwgaXMgYSBzcGVjaWFsIGJ1aWx0aW4iIHJ1bGUgaGVyZQorIyAoYmFzaCBkb2VzIG5vdCBkbyBpdCkKK2YoKSB7IHRydWU7IH0KK1ZBUj0nJworVkFSPXZhbDMgZgorZWNobyAic2hvdWxkIGJlIG5vdCBlbXB0eTogJyRWQVInIgpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX3Bvc2l4MS5yaWdodCBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9wb3NpeDEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVmMzU3OQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L2FzaC12YXJzL3Zhcl9wb3NpeDEucmlnaHQKQEAgLTAsMCArMSwxNyBAQAorYWJjZGNkCithYmNkY2QKK2FiY2RjZAorY2RjZAorYmFiY2RjZAorYmFiY2RjZAorYWJhYmNkY2QKKworYWJhYmNkCithYmFiY2QKK2FiYWJjZAorYWJhYgorYWJhYmNkYworYWJhYmNkYworYWJhYmNkY2QKKworZW5kCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9hc2gtdmFycy92YXJfcG9zaXgxLnRlc3RzIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX3Bvc2l4MS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MTM5ZTJjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvYXNoLXZhcnMvdmFyX3Bvc2l4MS50ZXN0cwpAQCAtMCwwICsxLDIxIEBACit2YXI9YWJhYmNkY2QKKworZWNobyAke3ZhciNhYn0KK2VjaG8gJHt2YXIjI2FifQorZWNobyAke3ZhciNhKmJ9CitlY2hvICR7dmFyIyNhKmJ9CitlY2hvICR7dmFyIz99CitlY2hvICR7dmFyIyM/fQorZWNobyAke3ZhciMqfQorZWNobyAke3ZhciMjKn0KKworZWNobyAke3ZhciVjZH0KK2VjaG8gJHt2YXIlJWNkfQorZWNobyAke3ZhciVjKmR9CitlY2hvICR7dmFyJSVjKmR9CitlY2hvICR7dmFyJT99CitlY2hvICR7dmFyJSU/fQorZWNobyAke3ZhciUqfQorZWNobyAke3ZhciUlKn0KKworZWNobyBlbmQKZGlmZiAtLWdpdCBhL3NoZWxsL2FzaF90ZXN0L3ByaW50ZW52LmMgYi9zaGVsbC9hc2hfdGVzdC9wcmludGVudi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0Y2NkYTgKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9hc2hfdGVzdC9wcmludGVudi5jCkBAIC0wLDAgKzEsNjcgQEAKKy8qIHByaW50ZW52IC0tIG1pbmltYWwgY2xvbmUgb2YgQlNEIHByaW50ZW52KDEpLgorCisgICB1c2FnZTogcHJpbnRlbnYgW3Zhcm5hbWVdCisKKyAgIENoZXQgUmFtZXkKKyAgIGNoZXRAcG8uY3dydS5lZHUKKyovCisKKy8qIENvcHlyaWdodCAoQykgMTk5Ny0yMDAyIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgQmFzaCwgdGhlIEJvdXJuZSBBZ2FpbiBTSGVsbC4KKworICAgQmFzaCBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCisgICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZQorICAgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIKKyAgIHZlcnNpb24uCisKKyAgIEJhc2ggaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZCisgICBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvcgorICAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICAgd2l0aCBCYXNoOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExIFVTQS4gKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCitleHRlcm4gY2hhciAqKmVudmlyb247CisKK2ludAorbWFpbiAoYXJnYywgYXJndikKKyAgICAgaW50IGFyZ2M7CisgICAgIGNoYXIgKiphcmd2OworeworICByZWdpc3RlciBjaGFyICoqZW52cCwgKmV2YWw7CisgIGludCBsZW47CisKKyAgYXJndisrOworICBhcmdjLS07CisKKyAgLyogcHJpbnRlbnYgKi8KKyAgaWYgKGFyZ2MgPT0gMCkKKyAgICB7CisgICAgICBmb3IgKGVudnAgPSBlbnZpcm9uOyAqZW52cDsgZW52cCsrKQorCXB1dHMgKCplbnZwKTsKKyAgICAgIGV4aXQoRVhJVF9TVUNDRVNTKTsKKyAgICB9CisKKyAgLyogcHJpbnRlbnYgdmFybmFtZSAqLworICBsZW4gPSBzdHJsZW4gKCphcmd2KTsKKyAgZm9yIChlbnZwID0gZW52aXJvbjsgKmVudnA7IGVudnArKykKKyAgICB7CisgICAgICBpZiAoKiphcmd2ID09ICoqZW52cCAmJiBzdHJuY21wICgqZW52cCwgKmFyZ3YsIGxlbikgPT0gMCkKKwl7CisJICBldmFsID0gKmVudnAgKyBsZW47CisJICAvKiBJZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZG9lc24ndCBoYXZlIGFuIGA9JywgaWdub3JlIGl0LiAqLworCSAgaWYgKCpldmFsID09ICc9JykKKwkgICAgeworCSAgICAgIHB1dHMgKGV2YWwgKyAxKTsKKwkgICAgICBleGl0KEVYSVRfU1VDQ0VTUyk7CisJICAgIH0KKwl9CisgICAgfQorICBleGl0KEVYSVRfRkFJTFVSRSk7Cit9CmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC9yZWNoby5jIGIvc2hlbGwvYXNoX3Rlc3QvcmVjaG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmE1ZmVhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvcmVjaG8uYwpAQCAtMCwwICsxLDU4IEBACisvKgorICAgcmVjaG8gLS0gcmVhbGx5IGVjaG8gYXJncywgYnJhY2tldGVkIHdpdGggPD4gYW5kIHdpdGggaW52aXNpYmxlIGNoYXJzCisJICAgIG1hZGUgdmlzaWJsZS4KKworICAgQ2hldCBSYW1leQorICAgY2hldEBwby5jd3J1LmVkdQorKi8KKworLyogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBCYXNoLCB0aGUgQm91cm5lIEFnYWluIFNIZWxsLgorCisgICBCYXNoIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKKyAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlCisgICBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorICAgdmVyc2lvbi4KKworICAgQmFzaCBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkKKyAgIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yCisgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgICB3aXRoIEJhc2g7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEgVVNBLiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKwordm9pZCBzdHJwcmludCgpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisJCXByaW50ZigiYXJndlslZF0gPSA8IiwgaSk7CisJCXN0cnByaW50KGFyZ3ZbaV0pOworCQlwcmludGYoIj5cbiIpOworCX0KKwlleGl0KEVYSVRfU1VDQ0VTUyk7Cit9CisKK3ZvaWQgc3RycHJpbnQoY2hhciAqc3RyKQoreworCXVuc2lnbmVkIGNoYXIgKnM7CisKKwlmb3IgKHMgPSAodW5zaWduZWQgY2hhciAqKXN0cjsgcyAmJiAqczsgcysrKSB7CisJCWlmICgqcyA8ICcgJykgeworCQkJcHV0Y2hhcignXicpOworCQkJcHV0Y2hhcigqcys2NCk7CisJCX0gZWxzZSBpZiAoKnMgPT0gMTI3KSB7CisJCQlwdXRjaGFyKCdeJyk7CisJCQlwdXRjaGFyKCc/Jyk7CisJCX0gZWxzZQorCQkJcHV0Y2hhcigqcyk7CisJfQorfQpkaWZmIC0tZ2l0IGEvc2hlbGwvYXNoX3Rlc3QvcnVuLWFsbCBiL3NoZWxsL2FzaF90ZXN0L3J1bi1hbGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWQ5M2UyNQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2FzaF90ZXN0L3J1bi1hbGwKQEAgLTAsMCArMSw3NCBAQAorIyEvYmluL3NoCisKK1RPUERJUj0kUFdECisKK3Rlc3QgLXggYXNoIHx8IHsKKyAgICBlY2hvICJObyAuL2FzaCAtIGNyZWF0aW5nIGEgbGluayB0byAuLi8uLi9idXN5Ym94IgorICAgIGxuIC1zIC4uLy4uL2J1c3lib3ggYXNoCit9Cit0ZXN0IC14IHByaW50ZW52IHx8IGdjYyAtTzIgLW8gcHJpbnRlbnYgcHJpbnRlbnYuYyB8fCBleGl0ICQ/Cit0ZXN0IC14IHJlY2hvICAgIHx8IGdjYyAtTzIgLW8gcmVjaG8gICAgcmVjaG8uYyAgICB8fCBleGl0ICQ/Cit0ZXN0IC14IHplY2hvICAgIHx8IGdjYyAtTzIgLW8gemVjaG8gICAgemVjaG8uYyAgICB8fCBleGl0ICQ/CisKK1BBVEg9IiRQV0Q6JFBBVEgiICMgZm9yIGFzaCBhbmQgcmVjaG8vemVjaG8vcHJpbnRlbnYKK2V4cG9ydCBQQVRICisKK1RISVNfU0g9IiRQV0QvYXNoIgorZXhwb3J0IFRISVNfU0gKKworZG9fdGVzdCgpCit7CisgICAgdGVzdCAtZCAiJDEiIHx8IHJldHVybiAwCisjICAgZWNobyBkb190ZXN0ICIkMSIKKyAgICAjICQxIGJ1dCB3aXRoIC8gcmVwbGFjZWQgYnkgIyBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGFzIGZpbGVuYW1lIHBhcnQKKyAgICBub3NsYXNoPWBlY2hvICIkMSIgfCBzZWQgJ3M6LzojOmcnYAorICAgICgKKyAgICBjZCAiJDEiIHx8IHsgZWNobyAiY2Fubm90IGNkICQxISI7IGV4aXQgMTsgfQorICAgIGZvciB4IGluIHJ1bi0qOyBkbworCXRlc3QgLWYgIiR4IiB8fCBjb250aW51ZQorCWNhc2UgIiR4IiBpbgorCSAgICAiJDAifHJ1bi1taW5pbWFsfHJ1bi1ncHJvZikgOzsKKwkgICAgKi5vcmlnfCp+KSA7OworCSAgICAjKikgZWNobyAkeCA7IHNoICR4IDs7CisJICAgICopCisJICAgIHNoICIkeCIgPiIkVE9QRElSLyRub3NsYXNoLSR4LmZhaWwiIDI+JjEgJiYgXAorCSAgICB7IGVjaG8gIiQxLyR4OiBvayI7IHJtICIkVE9QRElSLyRub3NsYXNoLSR4LmZhaWwiOyB9IHx8IGVjaG8gIiQxLyR4OiBmYWlsIjsKKwkgICAgOzsKKwllc2FjCisgICAgZG9uZQorICAgICMgTWFueSBiYXNoIHJ1bi1YWFggc2NyaXB0cyBqdXN0IGRvIHRoaXMsCisgICAgIyBubyBwb2ludCBpbiBkdXBsaWNhdGlvbiBpdCBhbGwgb3ZlciB0aGUgcGxhY2UKKyAgICBmb3IgeCBpbiAqLnRlc3RzOyBkbworCXRlc3QgLXggIiR4IiB8fCBjb250aW51ZQorCW5hbWU9IiR7eCUlLnRlc3RzfSIKKwl0ZXN0IC1mICIkbmFtZS5yaWdodCIgfHwgY29udGludWUKKwl7CisJICAgICIkVEhJU19TSCIgIi4vJHgiID4iJG5hbWUueHgiIDI+JjEKKwkgICAgZGlmZiAtdSAiJG5hbWUueHgiICIkbmFtZS5yaWdodCIgPiIkVE9QRElSLyRub3NsYXNoLSR4LmZhaWwiIFwKKwkgICAgJiYgcm0gLWYgIiRuYW1lLnh4IiAiJFRPUERJUi8kbm9zbGFzaC0keC5mYWlsIgorCX0gJiYgZWNobyAiJDEvJHg6IG9rIiB8fCBlY2hvICIkMS8keDogZmFpbCIKKyAgICBkb25lCisgICAgKQorfQorCisjIG1haW4gcGFydCBvZiB0aGlzIHNjcmlwdAorIyBVc2FnZTogcnVuLWFsbCBbZGlyZWN0b3JpZXNdCisKK2lmIFsgJCMgLWx0IDEgXTsgdGhlbgorICAgICMgQWxsIHN1YiBkaXJlY3RvcmllcworICAgIG1vZHVsZXM9YGxzIC1kIGFzaC0qYAorICAgICMgSWYgeW91IHdhbnQgdG8gdGVzdCBhc2ggYWdhaW5zdCBodXNoIGFuZCBtc2ggdGVzdHN1aXRlcworICAgICMgKGhhdmUgdG8gY29weSBodXNoX3Rlc3QgYW5kIG1zaF90ZXN0IGRpcnMgdG8gY3VycmVudCBkaXIgZmlyc3QpOgorICAgICNtb2R1bGVzPWBscyAtZCBhc2gtKiBodXNoX3Rlc3QvaHVzaC0qIG1zaF90ZXN0L21zaC0qYAorCisgICAgZm9yIG1vZHVsZSBpbiAkbW9kdWxlczsgZG8KKwlkb190ZXN0ICRtb2R1bGUKKyAgICBkb25lCitlbHNlCisgICAgd2hpbGUgWyAkIyAtZ2UgMSBdOyBkbworCWlmIFsgLWQgJDEgXTsgdGhlbgorCSAgICBkb190ZXN0ICQxCisJZmkKKwlzaGlmdAorICAgIGRvbmUKK2ZpCmRpZmYgLS1naXQgYS9zaGVsbC9hc2hfdGVzdC96ZWNoby5jIGIvc2hlbGwvYXNoX3Rlc3QvemVjaG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmFhNTliCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvYXNoX3Rlc3QvemVjaG8uYwpAQCAtMCwwICsxLDM2IEBACisvKiB6ZWNobyAtIGJhcmUtYm9uZXMgZWNobyAqLworCisvKiBDb3B5cmlnaHQgKEMpIDE5OTYtMjAwMiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KKworICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIEJhc2gsIHRoZSBCb3VybmUgQWdhaW4gU0hlbGwuCisKKyAgIEJhc2ggaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcgorICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUKKyAgIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyCisgICB2ZXJzaW9uLgorCisgICBCYXNoIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQorICAgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKKyAgIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAgIHdpdGggQmFzaDsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICBGb3VuZGF0aW9uLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMSBVU0EuICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJYXJndisrOworCisJd2hpbGUgKCphcmd2KSB7CisJCSh2b2lkKXByaW50ZigiJXMiLCAqYXJndik7CisJCWlmICgqKythcmd2KQorCQkJcHV0Y2hhcignICcpOworCX0KKworCXB1dGNoYXIoJ1xuJyk7CisJZXhpdChFWElUX1NVQ0NFU1MpOworfQpkaWZmIC0tZ2l0IGEvc2hlbGwvYnJhY2UudHh0IGIvc2hlbGwvYnJhY2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NDg2MWIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9icmFjZS50eHQKQEAgLTAsMCArMSw1MCBAQAorQnJhY2UgRXhwYW5zaW9uCisKK0JyYWNlIGV4cGFuc2lvbiBpcyBhIG1lY2hhbmlzbSBieSB3aGljaCBhcmJpdHJhcnkgc3RyaW5ncyBtYXkgYmUgZ2VuZXItCithdGVkLiAgIFRoaXMgIG1lY2hhbmlzbSBpcyBzaW1pbGFyIHRvIHBhdGhuYW1lIGV4cGFuc2lvbiwgYnV0IHRoZSBmaWxlLQorbmFtZXMgZ2VuZXJhdGVkIG5lZWQgbm90IGV4aXN0LiAgUGF0dGVybnMgdG8gYmUgYnJhY2UgZXhwYW5kZWQgdGFrZSB0aGUKK2Zvcm0gb2YgYW4gb3B0aW9uYWwgcHJlYW1ibGUsIGZvbGxvd2VkIGJ5IGVpdGhlciBhIHNlcmllcyBvZiBjb21tYS1zZXAtCithcmF0ZWQgc3RyaW5ncyBvciBhIHNlcXVlbmNlIGV4cHJlc3Npb24gYmV0d2VlbiBhIHBhaXIgb2YgYnJhY2VzLCAgZm9sLQorbG93ZWQgIGJ5ICBhbiAgb3B0aW9uYWwgIHBvc3RzY3JpcHQuICAgVGhlIHByZWFtYmxlIGlzIHByZWZpeGVkIHRvIGVhY2gKK3N0cmluZyBjb250YWluZWQgd2l0aGluIHRoZSBicmFjZXMsIGFuZCB0aGUgcG9zdHNjcmlwdCBpcyB0aGVuIGFwcGVuZGVkCit0byBlYWNoIHJlc3VsdGluZyBzdHJpbmcsIGV4cGFuZGluZyBsZWZ0IHRvIHJpZ2h0LgorCitCcmFjZSAgZXhwYW5zaW9ucyAgbWF5ICBiZSBuZXN0ZWQuICBUaGUgcmVzdWx0cyBvZiBlYWNoIGV4cGFuZGVkIHN0cmluZworYXJlIG5vdCBzb3J0ZWQ7ICBsZWZ0ICB0byAgcmlnaHQgIG9yZGVyICBpcyAgcHJlc2VydmVkLiAgIEZvciAgZXhhbXBsZSwKK2F7ZCxjLGJ9ZSBleHBhbmRzIGludG8gYGFkZSBhY2UgYWJlJy4KKworQSAgc2VxdWVuY2UgIGV4cHJlc3Npb24gdGFrZXMgdGhlIGZvcm0ge3guLnl9LCB3aGVyZSB4IGFuZCB5IGFyZSBlaXRoZXIKK2ludGVnZXJzIG9yIHNpbmdsZSBjaGFyYWN0ZXJzLiAgV2hlbiBpbnRlZ2VycyBhcmUgc3VwcGxpZWQsIHRoZSBleHByZXMtCitzaW9uICBleHBhbmRzICB0byBlYWNoIG51bWJlciBiZXR3ZWVuIHggYW5kIHksIGluY2x1c2l2ZS4gIFdoZW4gY2hhcmFjLQordGVycyBhcmUgc3VwcGxpZWQsIHRoZSBleHByZXNzaW9uIGV4cGFuZHMgIHRvICBlYWNoICBjaGFyYWN0ZXIgIGxleGljby0KK2dyYXBoaWNhbGx5IGJldHdlZW4geCBhbmQgeSwgaW5jbHVzaXZlLiAgTm90ZSB0aGF0IGJvdGggeCBhbmQgeSBtdXN0IGJlCitvZiB0aGUgc2FtZSB0eXBlLgorCitCcmFjZSBleHBhbnNpb24gaXMgcGVyZm9ybWVkIGJlZm9yZSBhbnkgb3RoZXIgZXhwYW5zaW9ucywgYW5kIGFueSBjaGFyLQorYWN0ZXJzICBzcGVjaWFsIHRvIG90aGVyIGV4cGFuc2lvbnMgYXJlIHByZXNlcnZlZCBpbiB0aGUgcmVzdWx0LiAgSXQgaXMKK3N0cmljdGx5IHRleHR1YWwuICBCYXNoIGRvZXMgbm90IGFwcGx5IGFueSBzeW50YWN0aWMgaW50ZXJwcmV0YXRpb24gIHRvCit0aGUgY29udGV4dCBvZiB0aGUgZXhwYW5zaW9uIG9yIHRoZSB0ZXh0IGJldHdlZW4gdGhlIGJyYWNlcy4KKworQSAgY29ycmVjdGx5LWZvcm1lZCAgYnJhY2UgIGV4cGFuc2lvbiBtdXN0IGNvbnRhaW4gdW5xdW90ZWQgb3BlbmluZyBhbmQKK2Nsb3NpbmcgYnJhY2VzLCBhbmQgYXQgbGVhc3Qgb25lIHVucXVvdGVkIGNvbW1hICBvciAgYSAgdmFsaWQgIHNlcXVlbmNlCitleHByZXNzaW9uLiAgIEFueSBpbmNvcnJlY3RseSBmb3JtZWQgYnJhY2UgZXhwYW5zaW9uIGlzIGxlZnQgdW5jaGFuZ2VkLgorQSB7IG9yICwgbWF5IGJlIHF1b3RlZCB3aXRoIGEgYmFja3NsYXNoIHRvIHByZXZlbnQgaXRzIGJlaW5nIGNvbnNpZGVyZWQKK3BhcnQgIG9mICBhIGJyYWNlIGV4cHJlc3Npb24uICBUbyBhdm9pZCBjb25mbGljdHMgd2l0aCBwYXJhbWV0ZXIgZXhwYW4tCitzaW9uLCB0aGUgc3RyaW5nICR7IGlzIG5vdCBjb25zaWRlcmVkIGVsaWdpYmxlIGZvciBicmFjZSBleHBhbnNpb24uCisKK1RoaXMgY29uc3RydWN0IGlzIHR5cGljYWxseSB1c2VkIGFzIHNob3J0aGFuZCB3aGVuIHRoZSBjb21tb24gcHJlZml4IG9mCit0aGUgc3RyaW5ncyB0byBiZSBnZW5lcmF0ZWQgaXMgbG9uZ2VyIHRoYW4gaW4gdGhlIGFib3ZlIGV4YW1wbGU6CisKKyAgICAgICBta2RpciAvdXNyL2xvY2FsL3NyYy9iYXNoL3tvbGQsbmV3LGRpc3QsYnVnc30KK29yCisgICAgICAgY2hvd24gcm9vdCAvdXNyL3t1Y2Ive2V4LGVkaXR9LGxpYi97ZXg/Lj8qLGhvd19leH19CisKK0JyYWNlICBleHBhbnNpb24gIGludHJvZHVjZXMgIGEgIHNsaWdodCBpbmNvbXBhdGliaWxpdHkgd2l0aCBoaXN0b3JpY2FsCit2ZXJzaW9ucyBvZiBzaC4gIHNoIGRvZXMgbm90IHRyZWF0IG9wZW5pbmcgb3IgY2xvc2luZyBicmFjZXMgIHNwZWNpYWxseQord2hlbiAgdGhleSAgYXBwZWFyIGFzIHBhcnQgb2YgYSB3b3JkLCBhbmQgcHJlc2VydmVzIHRoZW0gaW4gdGhlIG91dHB1dC4KK0Jhc2ggcmVtb3ZlcyBicmFjZXMgZnJvbSB3b3JkcyBhcyBhICBjb25zZXF1ZW5jZSAgb2YgIGJyYWNlICBleHBhbnNpb24uCitGb3IgIGV4YW1wbGUsICBhIHdvcmQgZW50ZXJlZCB0byBzaCBhcyBmaWxlezEsMn0gYXBwZWFycyBpZGVudGljYWxseSBpbgordGhlIG91dHB1dC4gIFRoZSBzYW1lIHdvcmQgaXMgb3V0cHV0IGFzIGZpbGUxIGZpbGUyIGFmdGVyIGV4cGFuc2lvbiAgYnkKK2Jhc2guICAgSWYgc3RyaWN0IGNvbXBhdGliaWxpdHkgd2l0aCBzaCBpcyBkZXNpcmVkLCBzdGFydCBiYXNoIHdpdGggdGhlCisrQiBvcHRpb24gb3IgZGlzYWJsZSBicmFjZSBleHBhbnNpb24gd2l0aCB0aGUgK0Igb3B0aW9uIHRvIHRoZSBzZXQgY29tLQorbWFuZApkaWZmIC0tZ2l0IGEvc2hlbGwvY3R0eWhhY2suYyBiL3NoZWxsL2N0dHloYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjliNTljMgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2N0dHloYWNrLmMKQEAgLTAsMCArMSwxODggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNyBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorCisvL2FwcGxldDpJRl9DVFRZSEFDSyhBUFBMRVQoY3R0eWhhY2ssIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19DVFRZSEFDSykgKz0gY3R0eWhhY2subworCisvL2NvbmZpZzpjb25maWcgQ1RUWUhBQ0sKKy8vY29uZmlnOglib29sICJjdHR5aGFjayIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBPbmUgY29tbW9uIHByb2JsZW0gcmVwb3J0ZWQgb24gdGhlIG1haWxpbmcgbGlzdCBpcyB0aGUgImNhbid0CisvL2NvbmZpZzoJICBhY2Nlc3MgdHR5OyBqb2IgY29udHJvbCB0dXJuZWQgb2ZmIiBlcnJvciBtZXNzYWdlLCB3aGljaCB0eXBpY2FsbHkKKy8vY29uZmlnOgkgIGFwcGVhcnMgd2hlbiBvbmUgdHJpZXMgdG8gdXNlIGEgc2hlbGwgd2l0aCBzdGRpbi9zdGRvdXQgb24KKy8vY29uZmlnOgkgIC9kZXYvY29uc29sZS4KKy8vY29uZmlnOgkgIFRoaXMgZGV2aWNlIGlzIHNwZWNpYWwgLSBpdCBjYW5ub3QgYmUgYSBjb250cm9sbGluZyB0dHkuCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIFRoZSBwcm9wZXIgc29sdXRpb24gaXMgdG8gdXNlIHRoZSBjb3JyZWN0IGRldmljZSBpbnN0ZWFkIG9mCisvL2NvbmZpZzoJICAvZGV2L2NvbnNvbGUuCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIGN0dHloYWNrIHByb3ZpZGVzIGEgInF1aWNrIGFuZCBkaXJ0eSIgc29sdXRpb24gdG8gdGhpcyBwcm9ibGVtLgorLy9jb25maWc6CSAgSXQgYW5hbHl6ZXMgc3RkaW4gd2l0aCB2YXJpb3VzIGlvY3RscywgdHJ5aW5nIHRvIGRldGVybWluZSB3aGV0aGVyCisvL2NvbmZpZzoJICBpdCBpcyBhIC9kZXYvdHR5TiBvciAvZGV2L3R0eVNOICh2aXJ0dWFsIHRlcm1pbmFsIG9yIHNlcmlhbCBsaW5lKS4KKy8vY29uZmlnOgkgIE9uIExpbnV4IGl0IGFsc28gY2hlY2tzIHN5c2ZzIGZvciBhIHBvaW50ZXIgdG8gdGhlIGFjdGl2ZSBjb25zb2xlLgorLy9jb25maWc6CSAgSWYgY3R0eWhhY2sgaXMgYWJsZSB0byBmaW5kIHRoZSByZWFsIGNvbnNvbGUgZGV2aWNlLCBpdCBjbG9zZXMKKy8vY29uZmlnOgkgIHN0ZGluL291dC9lcnIgYW5kIHJlb3BlbnMgdGhhdCBkZXZpY2UuCisvL2NvbmZpZzoJICBUaGVuIGl0IGV4ZWN1dGVzIHRoZSBnaXZlbiBwcm9ncmFtLiBPcGVuaW5nIHRoZSBkZXZpY2Ugd2lsbCBtYWtlCisvL2NvbmZpZzoJICB0aGF0IGRldmljZSBhIGNvbnRyb2xsaW5nIHR0eS4gVGhpcyBtYXkgcmVxdWlyZSBjdHR5aGFjaworLy9jb25maWc6CSAgdG8gYmUgYSBzZXNzaW9uIGxlYWRlci4KKy8vY29uZmlnOgorLy9jb25maWc6CSAgRXhhbXBsZSBmb3IgL2V0Yy9pbml0dGFiIChmb3IgYnVzeWJveCBpbml0KToKKy8vY29uZmlnOgorLy9jb25maWc6CSAgOjpyZXNwYXduOi9iaW4vY3R0eWhhY2sgL2Jpbi9zaAorLy9jb25maWc6CisvL2NvbmZpZzoJICBTdGFydGluZyBhbiBpbnRlcmFjdGl2ZSBzaGVsbCBmcm9tIGJvb3Qgc2hlbGwgc2NyaXB0OgorLy9jb25maWc6CisvL2NvbmZpZzoJICBzZXRzaWQgY3R0eWhhY2sgc2gKKy8vY29uZmlnOgorLy9jb25maWc6CSAgR2l2aW5nIGNvbnRyb2xsaW5nIHR0eSB0byBzaGVsbCBydW5uaW5nIHdpdGggUElEIDE6CisvL2NvbmZpZzoKKy8vY29uZmlnOgkgICMgZXhlYyBjdHR5aGFjayBzaAorLy9jb25maWc6CisvL2NvbmZpZzoJICBXaXRob3V0IGN0dHloYWNrLCB5b3UgbmVlZCB0byBrbm93IGV4YWN0IHR0eSBuYW1lLAorLy9jb25maWc6CSAgYW5kIGRvIHNvbWV0aGluZyBsaWtlIHRoaXM6CisvL2NvbmZpZzoKKy8vY29uZmlnOgkgICMgZXhlYyBzZXRzaWQgc2ggLWMgJ2V4ZWMgc2ggPC9kZXYvdHR5MSA+L2Rldi90dHkxIDI+JjEnCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIFN0YXJ0aW5nIGdldHR5IG9uIGEgY29udHJvbGxpbmcgdHR5IGZyb20gYSBzaGVsbCBzY3JpcHQ6CisvL2NvbmZpZzoKKy8vY29uZmlnOgkgICMgZ2V0dHkgMTE1MjAwICQoY3R0eWhhY2spCisKKy8vdXNhZ2U6I2RlZmluZSBjdHR5aGFja190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW1BST0cgQVJHU10iCisvL3VzYWdlOiNkZWZpbmUgY3R0eWhhY2tfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJHaXZlIFBST0cgYSBjb250cm9sbGluZyB0dHkgaWYgcG9zc2libGUuIgorLy91c2FnZTogICAgICJcbkV4YW1wbGUgZm9yIC9ldGMvaW5pdHRhYiAoZm9yIGJ1c3lib3ggaW5pdCk6IgorLy91c2FnZTogICAgICJcbgk6OnJlc3Bhd246L2Jpbi9jdHR5aGFjayAvYmluL3NoIgorLy91c2FnZTogICAgICJcbkdpdmluZyBjb250cm9sbGluZyB0dHkgdG8gc2hlbGwgcnVubmluZyB3aXRoIFBJRCAxOiIKKy8vdXNhZ2U6ICAgICAiXG4JJCBleGVjIGN0dHloYWNrIHNoIgorLy91c2FnZTogICAgICJcblN0YXJ0aW5nIGludGVyYWN0aXZlIHNoZWxsIGZyb20gYm9vdCBzaGVsbCBzY3JpcHQ6IgorLy91c2FnZTogICAgICJcbglzZXRzaWQgY3R0eWhhY2sgc2giCisKKyNpZiAhZGVmaW5lZChfX2xpbnV4X18pICYmICFkZWZpbmVkKFRJT0NHU0VSSUFMKSAmJiAhRU5BQkxFX1dFUlJPUgorIyB3YXJuaW5nIGN0dHloYWNrIHdpbGwgbm90IGJlIGFibGUgdG8gZGV0ZWN0IGEgY29udHJvbGxpbmcgdHR5IG9uIHRoaXMgc3lzdGVtCisjZW5kaWYKKworLyogRnJvbSA8bGludXgvdnQuaD4gKi8KK3N0cnVjdCB2dF9zdGF0IHsKKwl1bnNpZ25lZCBzaG9ydCB2X2FjdGl2ZTsgICAgICAgIC8qIGFjdGl2ZSB2dCAqLworCXVuc2lnbmVkIHNob3J0IHZfc2lnbmFsOyAgICAgICAgLyogc2lnbmFsIHRvIHNlbmQgKi8KKwl1bnNpZ25lZCBzaG9ydCB2X3N0YXRlOyAgICAgICAgIC8qIHZ0IGJpdG1hc2sgKi8KK307CitlbnVtIHsgVlRfR0VUU1RBVEUgPSAweDU2MDMgfTsgLyogZ2V0IGdsb2JhbCB2dCBzdGF0ZSBpbmZvICovCisKKy8qIEZyb20gPGxpbnV4L3NlcmlhbC5oPiAqLworc3RydWN0IHNlcmlhbF9zdHJ1Y3QgeworCWludAl0eXBlOworCWludAlsaW5lOworCXVuc2lnbmVkIGludAlwb3J0OworCWludAlpcnE7CisJaW50CWZsYWdzOworCWludAl4bWl0X2ZpZm9fc2l6ZTsKKwlpbnQJY3VzdG9tX2Rpdmlzb3I7CisJaW50CWJhdWRfYmFzZTsKKwl1bnNpZ25lZCBzaG9ydAljbG9zZV9kZWxheTsKKwljaGFyCWlvX3R5cGU7CisJY2hhcglyZXNlcnZlZF9jaGFyWzFdOworCWludAlodWI2OworCXVuc2lnbmVkIHNob3J0CWNsb3Npbmdfd2FpdDsgICAvKiB0aW1lIHRvIHdhaXQgYmVmb3JlIGNsb3NpbmcgKi8KKwl1bnNpZ25lZCBzaG9ydAljbG9zaW5nX3dhaXQyOyAgLyogbm8gbG9uZ2VyIHVzZWQuLi4gKi8KKwl1bnNpZ25lZCBjaGFyCSppb21lbV9iYXNlOworCXVuc2lnbmVkIHNob3J0CWlvbWVtX3JlZ19zaGlmdDsKKwl1bnNpZ25lZCBpbnQJcG9ydF9oaWdoOworCXVuc2lnbmVkIGxvbmcJaW9tYXBfYmFzZTsJLyogY29va2llIHBhc3NlZCBpbnRvIGlvcmVtYXAgKi8KKwlpbnQJcmVzZXJ2ZWRbMV07Cit9OworCitpbnQgY3R0eWhhY2tfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGN0dHloYWNrX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgZmQ7CisJY2hhciBjb25zb2xlW3NpemVvZihpbnQpKjMgKyAxNl07CisJdW5pb24geworCQlzdHJ1Y3QgdnRfc3RhdCB2dDsKKwkJc3RydWN0IHNlcmlhbF9zdHJ1Y3Qgc3I7CisJCWNoYXIgcGFyYW5vaWFbc2l6ZW9mKHN0cnVjdCBzZXJpYWxfc3RydWN0KSAqIDNdOworCX0gdTsKKworCXN0cmNweShjb25zb2xlLCAiL2Rldi90dHkiKTsKKwlmZCA9IG9wZW4oY29uc29sZSwgT19SRFdSKTsKKwlpZiAoZmQgPCAwKSB7CisJCS8qIFdlIGRvbid0IGhhdmUgY3R0eSAob3IgZG9uJ3QgaGF2ZSAiL2Rldi90dHkiIG5vZGUuLi4pICovCisJCWRvIHsKKyNpZmRlZiBfX2xpbnV4X18KKwkJCS8qIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBkb2VzIG5vdCB1c2UgX3N0ZGluXy4KKwkJCSAqIFRodXMsICJjdHR5aGFjayA8L2Rldi9zb21ldGhpbmciIGNhbid0IGJlIHVzZWQuCisJCQkgKiBIb3dldmVyLCB0aGlzIG1ldGhvZCBpcyBtb3JlIHJlbGlhYmxlIHRoYW4KKwkJCSAqIFRJT0NHU0VSSUFMIGNoZWNrLCB3aGljaCBhc3N1bWVzIHRoYXQgYWxsCisJCQkgKiBzZXJpYWwgbGluZXMgZm9sbG93IC9kZXYvdHR5U24gY29udmVudGlvbiAtCisJCQkgKiB3aGljaCBpcyBub3QgYWx3YXlzIHRoZSBjYXNlLgorCQkJICogVGhlcmVmb3JlLCB3ZSB1c2UgdGhpcyBtZXRob2QgZmlyc3Q6CisJCQkgKi8KKwkJCWludCBzID0gb3Blbl9yZWFkX2Nsb3NlKCIvc3lzL2NsYXNzL3R0eS9jb25zb2xlL2FjdGl2ZSIsCisJCQkJY29uc29sZSArIDUsIHNpemVvZihjb25zb2xlKSAtIDUpOworCQkJaWYgKHMgPiAwKSB7CisJCQkJY2hhciAqbGFzdDsKKwkJCQkvKiBGb3VuZCBhY3RpdmUgY29uc29sZSB2aWEgc3lzZnMgKExpbnV4IDIuNi4zOCspLgorCQkJCSAqIEl0IGxvb2tzIGxpa2UgIlt0dHkwIF10dHlTMFxuIiBzbyB6YXAgdGhlIG5ld2xpbmU6CisJCQkJICovCisJCQkJY29uc29sZVs0ICsgc10gPSAnXDAnOworCQkJCS8qIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb25zb2xlcywKKwkJCQkgKiB0YWtlIHRoZSBsYXN0IG9uZToKKwkJCQkgKi8KKwkJCQlsYXN0ID0gc3RycmNocihjb25zb2xlICsgNSwgJyAnKTsKKwkJCQlpZiAobGFzdCkKKwkJCQkJb3ZlcmxhcHBpbmdfc3RyY3B5KGNvbnNvbGUgKyA1LCBsYXN0ICsgMSk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmIChpb2N0bCgwLCBWVF9HRVRTVEFURSwgJnUudnQpID09IDApIHsKKwkJCQkvKiB0aGlzIGlzIGxpbnV4IHZpcnR1YWwgdHR5ICovCisJCQkJc3ByaW50Zihjb25zb2xlICsgOCwgIlMldSIgKyAxLCAoaW50KXUudnQudl9hY3RpdmUpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmCisjaWZkZWYgVElPQ0dTRVJJQUwKKwkJCWlmIChpb2N0bCgwLCBUSU9DR1NFUklBTCwgJnUuc3IpID09IDApIHsKKwkJCQkvKiB0aGlzIGlzIGEgc2VyaWFsIGNvbnNvbGU7IGFzc3VtaW5nIGl0IGlzIG5hbWVkIC9kZXYvdHR5U24gKi8KKwkJCQlzcHJpbnRmKGNvbnNvbGUgKyA4LCAiUyV1IiwgKGludCl1LnNyLmxpbmUpOworCQkJCWJyZWFrOworCQkJfQorI2VuZGlmCisJCQkvKiBub3BlLCBjb3VsZCBub3QgZmluZCBpdCAqLworCQkJY29uc29sZVswXSA9ICdcMCc7CisJCX0gd2hpbGUgKDApOworCX0KKworCWFyZ3YrKzsKKwlpZiAoIWFyZ3ZbMF0pIHsKKwkJaWYgKCFjb25zb2xlWzBdKQorCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJcHV0cyhjb25zb2xlKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwlpZiAoZmQgPCAwKSB7CisJCWZkID0gb3Blbl9vcl93YXJuKGNvbnNvbGUsIE9fUkRXUik7CisJCWlmIChmZCA8IDApCisJCQlnb3RvIHJldDsKKwl9CisJLy9iYl9lcnJvcl9tc2coInN3aXRjaGluZyB0byAnJXMnIiwgY29uc29sZSk7CisJZHVwMihmZCwgMCk7CisJZHVwMihmZCwgMSk7CisJZHVwMihmZCwgMik7CisJd2hpbGUgKGZkID4gMikKKwkJY2xvc2UoZmQtLSk7CisJLyogU29tZSBvdGhlciBzZXNzaW9uIG1heSBoYXZlIGl0IGFzIGN0dHksCisJICogdHJ5IHRvIHN0ZWFsIGl0IGZyb20gdGhlbToKKwkgKi8KKwlpb2N0bCgwLCBUSU9DU0NUVFksIDEpOworIHJldDoKKwlCQl9FWEVDVlBfb3JfZGllKGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaC5jIGIvc2hlbGwvaHVzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYmU4M2EKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoLmMKQEAgLTAsMCArMSw5MTk4IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBBIHByb3RvdHlwZSBCb3VybmUgc2hlbGwgZ3JhbW1hciBwYXJzZXIuCisgKiBJbnRlbmRlZCB0byBmb2xsb3cgdGhlIG9yaWdpbmFsIFRob21wc29uIGFuZCBSaXRjaGllCisgKiAic21hbGwgYW5kIHNpbXBsZSBpcyBiZWF1dGlmdWwiIHBoaWxvc29waHksIHdoaWNoCisgKiBpbmNpZGVudGFsbHkgaXMgYSBnb29kIG1hdGNoIHRvIHRvZGF5J3MgQnVzeUJveC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAsMjAwMSAgTGFycnkgRG9vbGl0dGxlIDxsYXJyeUBkb29saXR0bGUuYm9hLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOCwyMDA5ICBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogQ3JlZGl0czoKKyAqICAgICAgVGhlIHBhcnNlciByb3V0aW5lcyBwcm9wZXIgYXJlIGFsbCBvcmlnaW5hbCBtYXRlcmlhbCwgZmlyc3QKKyAqICAgICAgd3JpdHRlbiBEZWMgMjAwMCBhbmQgSmFuIDIwMDEgYnkgTGFycnkgRG9vbGl0dGxlLiAgVGhlCisgKiAgICAgIGV4ZWN1dGlvbiBlbmdpbmUsIHRoZSBidWlsdGlucywgYW5kIG11Y2ggb2YgdGhlIHVuZGVybHlpbmcKKyAqICAgICAgc3VwcG9ydCBoYXMgYmVlbiBhZGFwdGVkIGZyb20gYnVzeWJveC0wLjQ5cHJlJ3MgbGFzaCwgd2hpY2ggaXMKKyAqICAgICAgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogICAgICB3cml0dGVuIGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4uICBUaGF0LCBpbiB0dXJuLAorICogICAgICBpcyBiYXNlZCBpbiBwYXJ0IG9uIGxhZHNoLmMsIGJ5IE1pY2hhZWwgSy4gSm9obnNvbiBhbmQgRXJpayBXLgorICogICAgICBUcm9hbiwgd2hpY2ggdGhleSBwbGFjZWQgaW4gdGhlIHB1YmxpYyBkb21haW4uICBJIGRvbid0IGtub3cKKyAqICAgICAgaG93IG11Y2ggb2YgdGhlIEpvaG5zb24vVHJvYW4gY29kZSBoYXMgc3Vydml2ZWQgdGhlIHJlcGVhdGVkCisgKiAgICAgIHJld3JpdGVzLgorICoKKyAqIE90aGVyIGNyZWRpdHM6CisgKiAgICAgIG9fYWRkY2hyIGRlcml2ZWQgZnJvbSBzaW1pbGFyIHdfYWRkY2hhciBmdW5jdGlvbiBpbiBnbGliYy0yLjIuCisgKiAgICAgIHBhcnNlX3JlZGlyZWN0LCByZWRpcmVjdF9vcHRfbnVtLCBhbmQgYmlnIGNodW5rcyBvZiBtYWluCisgKiAgICAgIGFuZCBtYW55IGJ1aWx0aW5zIGRlcml2ZWQgZnJvbSBjb250cmlidXRpb25zIGJ5IEVyaWsgQW5kZXJzZW4uCisgKiAgICAgIE1pc2NlbGxhbmVvdXMgYnVnZml4ZXMgZnJvbSBNYXR0IEtyYWFpLgorICoKKyAqIFRoZXJlIGFyZSB0d28gYmlnIChhbmQgcmVsYXRlZCkgYXJjaGl0ZWN0dXJlIGRpZmZlcmVuY2VzIGJldHdlZW4KKyAqIHRoaXMgcGFyc2VyIGFuZCB0aGUgbGFzaCBwYXJzZXIuICBPbmUgaXMgdGhhdCB0aGlzIHZlcnNpb24gaXMKKyAqIGFjdHVhbGx5IGRlc2lnbmVkIGZyb20gdGhlIGdyb3VuZCB1cCB0byB1bmRlcnN0YW5kIG5lYXJseSBhbGwKKyAqIG9mIHRoZSBCb3VybmUgZ3JhbW1hci4gIFRoZSBzZWNvbmQsIGNvbnNlcXVlbnRpYWwgY2hhbmdlIGlzIHRoYXQKKyAqIHRoZSBwYXJzZXIgYW5kIGlucHV0IHJlYWRlciBoYXZlIGJlZW4gdHVybmVkIGluc2lkZSBvdXQuICBOb3csCisgKiB0aGUgcGFyc2VyIGlzIGluIGNvbnRyb2wsIGFuZCBhc2tzIGZvciBpbnB1dCBhcyBuZWVkZWQuICBUaGUgb2xkCisgKiB3YXkgaGFkIHRoZSBpbnB1dCByZWFkZXIgaW4gY29udHJvbCwgYW5kIGl0IGFza2VkIGZvciBwYXJzaW5nIHRvCisgKiB0YWtlIHBsYWNlIGFzIG5lZWRlZC4gIFRoZSBuZXcgd2F5IG1ha2VzIGl0IG11Y2ggZWFzaWVyIHRvIHByb3Blcmx5CisgKiBoYW5kbGUgdGhlIHJlY3Vyc2lvbiBpbXBsaWNpdCBpbiB0aGUgdmFyaW91cyBzdWJzdGl0dXRpb25zLCBlc3BlY2lhbGx5CisgKiBhY3Jvc3MgY29udGludWF0aW9uIGxpbmVzLgorICoKKyAqIFRPRE9zOgorICogICAgICBncmVwIGZvciAiVE9ETyIgYW5kIGZpeCAoc29tZSBvZiB0aGVtIGFyZSBlYXN5KQorICogICAgICBzcGVjaWFsIHZhcmlhYmxlcyAoZG9uZTogUFdELCBQUElELCBSQU5ET00pCisgKiAgICAgIHRpbGRlIGV4cGFuc2lvbgorICogICAgICBhbGlhc2VzCisgKiAgICAgIGZvbGxvdyBJRlMgcnVsZXMgbW9yZSBwcmVjaXNlbHksIGluY2x1ZGluZyB1cGRhdGUgc2VtYW50aWNzCisgKiAgICAgIGJ1aWx0aW5zIG1hbmRhdGVkIGJ5IHN0YW5kYXJkcyB3ZSBkb24ndCBzdXBwb3J0OgorICogICAgICAgICAgW3VuXWFsaWFzLCBjb21tYW5kLCBmYywgZ2V0b3B0cywgbmV3Z3JwLCByZWFkb25seSwgdGltZXMKKyAqICAgICAgbWFrZSBjb21wbGV4ICR7dmFyJS4uLn0gY29uc3RydWN0cyBzdXBwb3J0IG9wdGlvbmFsCisgKiAgICAgIG1ha2UgaGVyZSBkb2N1bWVudHMgb3B0aW9uYWwKKyAqCisgKiBCYXNoIGNvbXBhdCBUT0RPOgorICogICAgICByZWRpcmVjdGlvbiBvZiBzdGRvdXQrc3RkZXJyOiAmPiBhbmQgPiYKKyAqICAgICAgcmVzZXJ2ZWQgd29yZHM6IGZ1bmN0aW9uIHNlbGVjdAorICogICAgICBhZHZhbmNlZCB0ZXN0OiBbWyBdXQorICogICAgICBwcm9jZXNzIHN1YnN0aXR1dGlvbjogPChsaXN0KSBhbmQgPihsaXN0KQorICogICAgICA9fjogcmVnZXggb3BlcmF0b3IKKyAqICAgICAgbGV0IEVYUFIgW0VYUFIuLi5dCisgKiAgICAgICAgICBFYWNoIEVYUFIgaXMgYW4gYXJpdGhtZXRpYyBleHByZXNzaW9uIChBUklUSE1FVElDIEVWQUxVQVRJT04pCisgKiAgICAgICAgICBJZiB0aGUgbGFzdCBhcmcgZXZhbHVhdGVzIHRvIDAsIGxldCByZXR1cm5zIDE7IDAgb3RoZXJ3aXNlLgorICogICAgICAgICAgTkI6IGxldCBgZWNobyAnYT1hICsgMSdgIC0gZXJyb3IgKElPVzogbXVsdGktd29yZCBleHBhbnNpb24gaXMgdXNlZCkKKyAqICAgICAgKChFWFBSKSkKKyAqICAgICAgICAgIFRoZSBFWFBSIGlzIGV2YWx1YXRlZCBhY2NvcmRpbmcgdG8gQVJJVEhNRVRJQyBFVkFMVUFUSU9OLgorICogICAgICAgICAgVGhpcyBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8gbGV0ICJFWFBSIi4KKyAqICAgICAgJFtFWFBSXTogc3lub255bSBmb3IgJCgoRVhQUikpCisgKgorICogV29uJ3QgZG86CisgKiAgICAgIEluIGJhc2gsIGV4cG9ydCBidWlsdGluIGlzIHNwZWNpYWwsIGl0cyBhcmd1bWVudHMgYXJlIGFzc2lnbm1lbnRzCisgKiAgICAgICAgICBhbmQgdGhlcmVmb3JlIGV4cGFuc2lvbiBvZiB0aGVtIHNob3VsZCBiZSAib25lLXdvcmQiIGV4cGFuc2lvbjoKKyAqICAgICAgICAgICAgICAkIGV4cG9ydCBpPWBlY2hvICdhICBiJ2AgIyBleHBvcnQgaGFzIG9uZSBhcmc6ICJpPWEgIGIiCisgKiAgICAgICAgICBjb21wYXJlIHdpdGg6CisgKiAgICAgICAgICAgICAgJCBscyBpPWBlY2hvICdhICBiJ2AgICAgICMgbHMgaGFzIHR3byBhcmdzOiAiaT1hIiBhbmQgImIiCisgKiAgICAgICAgICAgICAgbHM6IGNhbm5vdCBhY2Nlc3MgaT1hOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisgKiAgICAgICAgICAgICAgbHM6IGNhbm5vdCBhY2Nlc3MgYjogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorICogICAgICAgICAgTm90ZTE6IHNhbWUgYXBwbGllcyB0byBsb2NhbCBidWlsdGluLgorICogICAgICAgICAgTm90ZTI6IGJhc2ggMy4yLjMzKDEpIGRvZXMgdGhpcyBvbmx5IGlmIGV4cG9ydCB3b3JkIGl0c2VsZgorICogICAgICAgICAgaXMgbm90IHF1b3RlZDoKKyAqICAgICAgICAgICAgICAkIGV4cG9ydCBpPWBlY2hvICdhYWEgIGJiYidgOyBlY2hvICIkaSIKKyAqICAgICAgICAgICAgICBhYWEgIGJiYgorICogICAgICAgICAgICAgICQgImV4cG9ydCIgaT1gZWNobyAnYWFhICBiYmInYDsgZWNobyAiJGkiCisgKiAgICAgICAgICAgICAgYWFhCisgKi8KKyNpZiAhKGRlZmluZWQoX19GcmVlQlNEX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pIHx8IGRlZmluZWQoX19OZXRCU0RfXykgXAorCXx8IGRlZmluZWQoX19BUFBMRV9fKSBcCisgICAgKQorIyBpbmNsdWRlIDxtYWxsb2MuaD4gICAvKiBmb3IgbWFsbG9jX3RyaW0gKi8KKyNlbmRpZgorI2luY2x1ZGUgPGdsb2IuaD4KKy8qICNpbmNsdWRlIDxkbWFsbG9jLmg+ICovCisjaWYgRU5BQkxFX0hVU0hfQ0FTRQorIyBpbmNsdWRlIDxmbm1hdGNoLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPiAvKiBmb3Igc2V0dGluZyAkSE9TVE5BTUUgKi8KKworI2luY2x1ZGUgImJ1c3lib3guaCIgIC8qIGZvciBBUFBMRVRfSVNfTk9GT1JLL05PRVhFQyAqLworI2luY2x1ZGUgInVuaWNvZGUuaCIKKyNpbmNsdWRlICJzaGVsbF9jb21tb24uaCIKKyNpbmNsdWRlICJtYXRoLmgiCisjaW5jbHVkZSAibWF0Y2guaCIKKyNpZiBFTkFCTEVfSFVTSF9SQU5ET01fU1VQUE9SVAorIyBpbmNsdWRlICJyYW5kb20uaCIKKyNlbHNlCisjIGRlZmluZSBDTEVBUl9SQU5ET01fVChybmQpICgodm9pZCkwKQorI2VuZGlmCisjaWZuZGVmIFBJUEVfQlVGCisjIGRlZmluZSBQSVBFX0JVRiA0MDk2ICAvKiBhbW91bnQgb2YgYnVmZmVyaW5nIGluIGEgcGlwZSAqLworI2VuZGlmCisKKy8vY29uZmlnOmNvbmZpZyBIVVNICisvL2NvbmZpZzoJYm9vbCAiaHVzaCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBodXNoIGlzIGEgc21hbGwgc2hlbGwgKDI1aykuIEl0IGhhbmRsZXMgdGhlIG5vcm1hbCBmbG93IGNvbnRyb2wKKy8vY29uZmlnOgkgIGNvbnN0cnVjdHMgc3VjaCBhcyBpZi90aGVuL2VsaWYvZWxzZS9maSwgZm9yL2luL2RvL2RvbmUsIHdoaWxlIGxvb3BzLAorLy9jb25maWc6CSAgY2FzZS9lc2FjLiBSZWRpcmVjdGlvbnMsIGhlcmUgZG9jdW1lbnRzLCAkKChhcml0aG1ldGljKSkKKy8vY29uZmlnOgkgIGFuZCBmdW5jdGlvbnMgYXJlIHN1cHBvcnRlZC4KKy8vY29uZmlnOgorLy9jb25maWc6CSAgSXQgd2lsbCBjb21waWxlIGFuZCB3b3JrIG9uIG5vLW1tdSBzeXN0ZW1zLgorLy9jb25maWc6CisvL2NvbmZpZzoJICBJdCBkb2VzIG5vdCBoYW5kbGUgc2VsZWN0LCBhbGlhc2VzLCB0aWxkZSBleHBhbnNpb24sCisvL2NvbmZpZzoJICAmPmZpbGUgYW5kID4mZmlsZSByZWRpcmVjdGlvbiBvZiBzdGRvdXQrc3RkZXJyLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgSFVTSF9CQVNIX0NPTVBBVAorLy9jb25maWc6CWJvb2wgImJhc2gtY29tcGF0aWJsZSBleHRlbnNpb25zIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSFVTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBiYXNoLWNvbXBhdGlibGUgZXh0ZW5zaW9ucy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEhVU0hfQlJBQ0VfRVhQQU5TSU9OCisvL2NvbmZpZzoJYm9vbCAiQnJhY2UgZXhwYW5zaW9uIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSFVTSF9CQVNIX0NPTVBBVAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSB7YWJjLGRlZn0gZXh0ZW5zaW9uLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgSFVTSF9IRUxQCisvL2NvbmZpZzoJYm9vbCAiaGVscCBidWlsdGluIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSFVTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBoZWxwIGJ1aWx0aW4gaW4gaHVzaC4gQ29kZSBzaXplICsgfjEga2J5dGUuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBIVVNIX0lOVEVSQUNUSVZFCisvL2NvbmZpZzoJYm9vbCAiSW50ZXJhY3RpdmUgbW9kZSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEhVU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgaW50ZXJhY3RpdmUgbW9kZSAocHJvbXB0IGFuZCBjb21tYW5kIGVkaXRpbmcpLgorLy9jb25maWc6CSAgV2l0aG91dCB0aGlzLCBodXNoIHNpbXBseSByZWFkcyBhbmQgZXhlY3V0ZXMgY29tbWFuZHMKKy8vY29uZmlnOgkgIGZyb20gc3RkaW4ganVzdCBsaWtlIGEgc2hlbGwgc2NyaXB0IGZyb20gYSBmaWxlLgorLy9jb25maWc6CSAgTm8gcHJvbXB0LCBubyBQUzEvUFMyIG1hZ2ljIHNoZWxsIHZhcmlhYmxlcy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEhVU0hfU0FWRUhJU1RPUlkKKy8vY29uZmlnOglib29sICJTYXZlIGNvbW1hbmQgaGlzdG9yeSB0byAuaHVzaF9oaXN0b3J5IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSFVTSF9JTlRFUkFDVElWRSAmJiBGRUFUVVJFX0VESVRJTkdfU0FWRUhJU1RPUlkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgaGlzdG9yeSBzYXZpbmcgaW4gaHVzaC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEhVU0hfSk9CCisvL2NvbmZpZzoJYm9vbCAiSm9iIGNvbnRyb2wiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBIVVNIX0lOVEVSQUNUSVZFCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIGpvYiBjb250cm9sOiBDdHJsLVogYmFja2dyb3VuZHMsIEN0cmwtQyBpbnRlcnJ1cHRzIGN1cnJlbnQKKy8vY29uZmlnOgkgIGNvbW1hbmQgKG5vdCBlbnRpcmUgc2hlbGwpLCBmZy9iZyBidWlsdGlucyB3b3JrLiBXaXRob3V0IHRoaXMgb3B0aW9uLAorLy9jb25maWc6CSAgImNtZCAmIiBzdGlsbCB3b3JrcyBieSBzaW1wbHkgc3Bhd25pbmcgYSBwcm9jZXNzIGFuZCBpbW1lZGlhdGVseQorLy9jb25maWc6CSAgcHJvbXB0aW5nIGZvciBuZXh0IGNvbW1hbmQgKG9yIGV4ZWN1dGluZyBuZXh0IGNvbW1hbmQgaW4gYSBzY3JpcHQpLAorLy9jb25maWc6CSAgYnV0IG5vIHNlcGFyYXRlIHByb2Nlc3MgZ3JvdXAgaXMgZm9ybWVkLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgSFVTSF9USUNLCisvL2NvbmZpZzoJYm9vbCAiUHJvY2VzcyBzdWJzdGl0dXRpb24iCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBIVVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHByb2Nlc3Mgc3Vic3RpdHV0aW9uIGBjb21tYW5kYCBhbmQgJChjb21tYW5kKSBpbiBodXNoLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgSFVTSF9JRgorLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgaWYvdGhlbi9lbGlmL2Vsc2UvZmkiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBIVVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIGlmL3RoZW4vZWxpZi9lbHNlL2ZpIGluIGh1c2guCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBIVVNIX0xPT1BTCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCBmb3IsIHdoaWxlIGFuZCB1bnRpbCBsb29wcyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEhVU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgZm9yLCB3aGlsZSBhbmQgdW50aWwgbG9vcHMgaW4gaHVzaC4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEhVU0hfQ0FTRQorLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgY2FzZSAuLi4gZXNhYyBzdGF0ZW1lbnQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBIVVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIGNhc2UgLi4uIGVzYWMgc3RhdGVtZW50IGluIGh1c2guICs0MDAgYnl0ZXMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBIVVNIX0ZVTkNUSU9OUworLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgZnVuY25hbWUoKSB7IGNvbW1hbmRzOyB9IHN5bnRheCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEhVU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgc3VwcG9ydCBmb3Igc2hlbGwgZnVuY3Rpb25zIGluIGh1c2guICs4MDAgYnl0ZXMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBIVVNIX0xPQ0FMCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCBsb2NhbCBidWlsdGluIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSFVTSF9GVU5DVElPTlMKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBFbmFibGUgc3VwcG9ydCBmb3IgbG9jYWwgdmFyaWFibGVzIGluIGZ1bmN0aW9ucy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEhVU0hfUkFORE9NX1NVUFBPUlQKKy8vY29uZmlnOglib29sICJQc2V1ZG9yYW5kb20gZ2VuZXJhdG9yIGFuZCAkUkFORE9NIHZhcmlhYmxlIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gSFVTSAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBwc2V1ZG9yYW5kb20gZ2VuZXJhdG9yIGFuZCBkeW5hbWljIHZhcmlhYmxlICIkUkFORE9NIi4KKy8vY29uZmlnOgkgIEVhY2ggcmVhZCBvZiAiJFJBTkRPTSIgd2lsbCBnZW5lcmF0ZSBhIG5ldyBwc2V1ZG9yYW5kb20gdmFsdWUuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBIVVNIX0VYUE9SVF9OCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCAnZXhwb3J0IC1uJyBvcHRpb24iCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBIVVNICisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgZXhwb3J0IC1uIHVuZXhwb3J0cyB2YXJpYWJsZXMuIEl0IGlzIGEgYmFzaCBleHRlbnNpb24uCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBIVVNIX01PREVfWAorLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgJ2h1c2ggLXgnIG9wdGlvbiBhbmQgJ3NldCAteCcgY29tbWFuZCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEhVU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGlzIGluc3RydWN0cyBodXNoIHRvIHByaW50IGNvbW1hbmRzIGJlZm9yZSBleGVjdXRpb24uCisvL2NvbmZpZzoJICBBZGRzIH4zMDAgYnl0ZXMuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBNU0gKKy8vY29uZmlnOglib29sICJtc2ggKGRlcHJlY2F0ZWQ6IGFsaWFzZWQgdG8gaHVzaCkiCisvL2NvbmZpZzoJZGVmYXVsdCBuCisvL2NvbmZpZzoJc2VsZWN0IEhVU0gKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBtc2ggaXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkLCBwbGVhc2UgbWlncmF0ZSB0byBodXNoLgorLy9jb25maWc6CisKKy8vYXBwbGV0OklGX0hVU0goQVBQTEVUKGh1c2gsIEJCX0RJUl9CSU4sIEJCX1NVSURfRFJPUCkpCisvL2FwcGxldDpJRl9NU0goQVBQTEVUKG1zaCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKy8vYXBwbGV0OklGX0ZFQVRVUkVfU0hfSVNfSFVTSChBUFBMRVRfT0RETkFNRShzaCwgaHVzaCwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QLCBzaCkpCisvL2FwcGxldDpJRl9GRUFUVVJFX0JBU0hfSVNfSFVTSChBUFBMRVRfT0RETkFNRShiYXNoLCBodXNoLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1AsIGJhc2gpKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfSFVTSCkgKz0gaHVzaC5vIG1hdGNoLm8gc2hlbGxfY29tbW9uLm8KKy8va2J1aWxkOmxpYi0kKENPTkZJR19IVVNIX1JBTkRPTV9TVVBQT1JUKSArPSByYW5kb20ubworCisvKiAtaSAoaW50ZXJhY3RpdmUpIGFuZCAtcyAocmVhZCBzdGRpbikgYXJlIGFsc28gYWNjZXB0ZWQsCisgKiBidXQgY3VycmVudGx5IGRvIG5vdGhpbmcsIHRoZXJlZm9yZSBhcmVuJ3Qgc2hvd24gaW4gaGVscC4KKyAqIE5PTU1VLXNwZWNpZmljIG9wdGlvbnMgYXJlIG5vdCBtZWFudCB0byBiZSB1c2VkIGJ5IHVzZXJzLAorICogdGhlcmVmb3JlIHdlIGRvbid0IHNob3cgdGhlbSBlaXRoZXIuCisgKi8KKy8vdXNhZ2U6I2RlZmluZSBodXNoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSJbLW54bF0gWy1jICdTQ1JJUFQnIFtBUkcwIFtBUkdTXV0gLyBGSUxFIFtBUkdTXV0iCisvL3VzYWdlOiNkZWZpbmUgaHVzaF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZToJIlVuaXggc2hlbGwgaW50ZXJwcmV0ZXIiCisKKy8vdXNhZ2U6I2RlZmluZSBtc2hfdHJpdmlhbF91c2FnZSBodXNoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6I2RlZmluZSBtc2hfZnVsbF91c2FnZSBodXNoX2Z1bGxfdXNhZ2UKKworLy91c2FnZTojaWYgRU5BQkxFX0ZFQVRVUkVfU0hfSVNfSFVTSAorLy91c2FnZTojIGRlZmluZSBzaF90cml2aWFsX3VzYWdlIGh1c2hfdHJpdmlhbF91c2FnZQorLy91c2FnZTojIGRlZmluZSBzaF9mdWxsX3VzYWdlICAgIGh1c2hfZnVsbF91c2FnZQorLy91c2FnZTojZW5kaWYKKy8vdXNhZ2U6I2lmIEVOQUJMRV9GRUFUVVJFX0JBU0hfSVNfSFVTSAorLy91c2FnZTojIGRlZmluZSBiYXNoX3RyaXZpYWxfdXNhZ2UgaHVzaF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiMgZGVmaW5lIGJhc2hfZnVsbF91c2FnZSAgICBodXNoX2Z1bGxfdXNhZ2UKKy8vdXNhZ2U6I2VuZGlmCisKKworLyogQnVpbGQga25vYnMgKi8KKyNkZWZpbmUgTEVBS19IVU5USU5HIDAKKyNkZWZpbmUgQlVJTERfQVNfTk9NTVUgMAorLyogRW5hYmxlL2Rpc2FibGUgc2FuaXR5IGNoZWNrcy4gT2sgdG8gZW5hYmxlIGluIHByb2R1Y3Rpb24sCisgKiBvbmx5IGFkZHMgYSBiaXQgb2YgYmxvYXQuIFNldCB0byA+MSB0byBnZXQgbm9uLXByb2R1Y3Rpb24gbGV2ZWwgdmVyYm9zaXR5LgorICogS2VlcGluZyAxIGZvciBub3cgZXZlbiBpbiByZWxlYXNlZCB2ZXJzaW9ucy4KKyAqLworI2RlZmluZSBIVVNIX0RFQlVHIDEKKy8qIFNsaWdodGx5IGJpZ2dlciAoKzIwMCBieXRlcyksIGJ1dCBmYXN0ZXIgaHVzaC4KKyAqIFNvIGZhciBpdCBvbmx5IGVuYWJsZXMgYSB0cmljayB3aXRoIGNvdW50aW5nIFNJR0NITERzIGFuZCBmb3JrcywKKyAqIHdoaWNoIGFsbG93cyB1cyB0byBkbyBmZXdlciB3YWl0cGlkJ3MuCisgKiAod2UgY2FuIGRldGVjdCBhIGNhc2Ugd2hlcmUgbmVpdGhlciBmb3JrcyB3ZXJlIGRvbmUgbm9yIFNJR0NITERzIGhhcHBlbmVkCisgKiBhbmQgdGhlcmVmb3JlIHdhaXRwaWQgd2lsbCByZXR1cm4gdGhlIHNhbWUgcmVzdWx0IGFzIGxhc3QgdGltZSkKKyAqLworI2RlZmluZSBFTkFCTEVfSFVTSF9GQVNUIDAKKy8qIFRPRE86IGltcGxlbWVudCBzaW1wbGlmaWVkIGNvZGUgZm9yIHVzZXJzIHdoaWNoIGRvIG5vdCBuZWVkICR7dmFyJS4uLn0gb3BzCisgKiBTbyBmYXIgJHt2YXIlLi4ufSBvcHMgYXJlIGFsd2F5cyBlbmFibGVkOgorICovCisjZGVmaW5lIEVOQUJMRV9IVVNIX0RPTExBUl9PUFMgMQorCisKKyNpZiBCVUlMRF9BU19OT01NVQorIyB1bmRlZiBCQl9NTVUKKyMgdW5kZWYgVVNFX0ZPUl9OT01NVQorIyB1bmRlZiBVU0VfRk9SX01NVQorIyBkZWZpbmUgQkJfTU1VIDAKKyMgZGVmaW5lIFVTRV9GT1JfTk9NTVUoLi4uKSBfX1ZBX0FSR1NfXworIyBkZWZpbmUgVVNFX0ZPUl9NTVUoLi4uKQorI2VuZGlmCisKKyNpbmNsdWRlICJOVU1fQVBQTEVUUy5oIgorI2lmIE5VTV9BUFBMRVRTID09IDEKKy8qIFNUQU5EQUxPTkUgZG9lcyBub3QgbWFrZSBzZW5zZSwgYW5kIHdvbid0IGNvbXBpbGUgKi8KKyMgdW5kZWYgQ09ORklHX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORQorIyB1bmRlZiBFTkFCTEVfRkVBVFVSRV9TSF9TVEFOREFMT05FCisjIHVuZGVmIElGX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORQorIyB1bmRlZiBJRl9OT1RfRkVBVFVSRV9TSF9TVEFOREFMT05FCisjIGRlZmluZSBFTkFCTEVfRkVBVFVSRV9TSF9TVEFOREFMT05FIDAKKyMgZGVmaW5lIElGX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORSguLi4pCisjIGRlZmluZSBJRl9OT1RfRkVBVFVSRV9TSF9TVEFOREFMT05FKC4uLikgX19WQV9BUkdTX18KKyNlbmRpZgorCisjaWYgIUVOQUJMRV9IVVNIX0lOVEVSQUNUSVZFCisjIHVuZGVmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkcKKyMgZGVmaW5lIEVOQUJMRV9GRUFUVVJFX0VESVRJTkcgMAorIyB1bmRlZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVAorIyBkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQgMAorIyB1bmRlZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HX1NBVkVfT05fRVhJVAorIyBkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19TQVZFX09OX0VYSVQgMAorI2VuZGlmCisKKy8qIERvIHdlIHN1cHBvcnQgQU5ZIGtleXdvcmRzPyAqLworI2lmIEVOQUJMRV9IVVNIX0lGIHx8IEVOQUJMRV9IVVNIX0xPT1BTIHx8IEVOQUJMRV9IVVNIX0NBU0UKKyMgZGVmaW5lIEhBU19LRVlXT1JEUyAxCisjIGRlZmluZSBJRl9IQVNfS0VZV09SRFMoLi4uKSBfX1ZBX0FSR1NfXworIyBkZWZpbmUgSUZfSEFTX05PX0tFWVdPUkRTKC4uLikKKyNlbHNlCisjIGRlZmluZSBIQVNfS0VZV09SRFMgMAorIyBkZWZpbmUgSUZfSEFTX0tFWVdPUkRTKC4uLikKKyMgZGVmaW5lIElGX0hBU19OT19LRVlXT1JEUyguLi4pIF9fVkFfQVJHU19fCisjZW5kaWYKKworLyogSWYgeW91IGNvbW1lbnQgb3V0IG9uZSBvZiB0aGVzZSBiZWxvdywgaXQgd2lsbCBiZSAjZGVmaW5lZCBsYXRlcgorICogdG8gcGVyZm9ybSBkZWJ1ZyBwcmludGZzIHRvIHN0ZGVycjogKi8KKyNkZWZpbmUgZGVidWdfcHJpbnRmKC4uLikgICAgICAgIGRvIHt9IHdoaWxlICgwKQorLyogRmluZXItZ3JhaW5lZCBkZWJ1ZyBzd2l0Y2hlcyAqLworI2RlZmluZSBkZWJ1Z19wcmludGZfcGFyc2UoLi4uKSAgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGRlYnVnX3ByaW50X3RyZWUoYSwgYikgICBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgZGVidWdfcHJpbnRmX2V4ZWMoLi4uKSAgIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkZWJ1Z19wcmludGZfZW52KC4uLikgICAgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGRlYnVnX3ByaW50Zl9qb2JzKC4uLikgICBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgZGVidWdfcHJpbnRmX2V4cGFuZCguLi4pIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkZWJ1Z19wcmludGZfdmFyZXhwKC4uLikgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGRlYnVnX3ByaW50Zl9nbG9iKC4uLikgICBkbyB7fSB3aGlsZSAoMCkKKyNkZWZpbmUgZGVidWdfcHJpbnRmX2xpc3QoLi4uKSAgIGRvIHt9IHdoaWxlICgwKQorI2RlZmluZSBkZWJ1Z19wcmludGZfc3Vic3QoLi4uKSAgZG8ge30gd2hpbGUgKDApCisjZGVmaW5lIGRlYnVnX3ByaW50Zl9jbGVhbiguLi4pICBkbyB7fSB3aGlsZSAoMCkKKworI2RlZmluZSBFUlJfUFRSICgodm9pZCopKGxvbmcpMSkKKworI2RlZmluZSBKT0JfU1RBVFVTX0ZPUk1BVCAgICAiWyVkXSAlLTIycyAlLjQwc1xuIgorCisjZGVmaW5lIF9TUEVDSUFMX1ZBUlNfU1RSICAgICAiXypAJCE/IyIKKyNkZWZpbmUgU1BFQ0lBTF9WQVJTX1NUUiAgICAgKCJfKkAkIT8jIiArIDEpCisjZGVmaW5lIE5VTUVSSUNfU1BFQ1ZBUlNfU1RSICgiXypAJCE/IyIgKyAzKQorI2lmIEVOQUJMRV9IVVNIX0JBU0hfQ09NUEFUCisvKiBTdXBwb3J0IC8gYW5kIC8vIHJlcGxhY2Ugb3BzICovCisvKiBOb3RlIHRoYXQgLy8gaXMgc3RvcmVkIGFzIFwgaW4gImVuY29kZWQiIHN0cmluZyByZXByZXNlbnRhdGlvbiAqLworIyBkZWZpbmUgVkFSX0VOQ09ERURfU1VCU1RfT1BTICAgICAgIlxcLyUjOi09Kz8iCisjIGRlZmluZSBWQVJfU1VCU1RfT1BTICAgICAgICAgICAgICgiXFwvJSM6LT0rPyIgKyAxKQorIyBkZWZpbmUgTUlOVVNfUExVU19FUVVBTF9RVUVTVElPTiAoIlxcLyUjOi09Kz8iICsgNSkKKyNlbHNlCisjIGRlZmluZSBWQVJfRU5DT0RFRF9TVUJTVF9PUFMgICAgICAiJSM6LT0rPyIKKyMgZGVmaW5lIFZBUl9TVUJTVF9PUFMgICAgICAgICAgICAgICIlIzotPSs/IgorIyBkZWZpbmUgTUlOVVNfUExVU19FUVVBTF9RVUVTVElPTiAoIiUjOi09Kz8iICsgMykKKyNlbmRpZgorCisjZGVmaW5lIFNQRUNJQUxfVkFSX1NZTUJPTCAgIDMKKworc3RydWN0IHZhcmlhYmxlOworCitzdGF0aWMgY29uc3QgY2hhciBodXNoX3ZlcnNpb25fc3RyW10gQUxJR04xID0gIkhVU0hfVkVSU0lPTj0iQkJfVkVSOworCisvKiBUaGlzIHN1cHBvcnRzIHNhdmluZyBwb2ludGVycyBtYWxsb2NlZCBpbiB2Zm9yayBjaGlsZCwKKyAqIHRvIGJlIGZyZWVkIGluIHRoZSBwYXJlbnQuCisgKi8KKyNpZiAhQkJfTU1VCit0eXBlZGVmIHN0cnVjdCBub21tdV9zYXZlX3QgeworCWNoYXIgKipuZXdfZW52OworCXN0cnVjdCB2YXJpYWJsZSAqb2xkX3ZhcnM7CisJY2hhciAqKmFyZ3Y7CisJY2hhciAqKmFyZ3ZfZnJvbV9yZV9leGVjaW5nOworfSBub21tdV9zYXZlX3Q7CisjZW5kaWYKKworZW51bSB7CisJUkVTX05PTkUgID0gMCwKKyNpZiBFTkFCTEVfSFVTSF9JRgorCVJFU19JRiAgICAsCisJUkVTX1RIRU4gICwKKwlSRVNfRUxJRiAgLAorCVJFU19FTFNFICAsCisJUkVTX0ZJICAgICwKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0xPT1BTCisJUkVTX0ZPUiAgICwKKwlSRVNfV0hJTEUgLAorCVJFU19VTlRJTCAsCisJUkVTX0RPICAgICwKKwlSRVNfRE9ORSAgLAorI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfTE9PUFMgfHwgRU5BQkxFX0hVU0hfQ0FTRQorCVJFU19JTiAgICAsCisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9DQVNFCisJUkVTX0NBU0UgICwKKwkvKiB0aHJlZSBwc2V1ZG8ta2V5d29yZHMgc3VwcG9ydCBjb250cml2ZWQgImNhc2UiIHN5bnRheDogKi8KKwlSRVNfQ0FTRV9JTiwgICAvKiAiY2FzZSAuLi4gSU4iLCB0dXJucyBpbnRvIFJFU19NQVRDSCB3aGVuIElOIGlzIG9ic2VydmVkICovCisJUkVTX01BVENIICwgICAgLyogIndvcmQpIiAqLworCVJFU19DQVNFX0JPRFksIC8qICJ0aGlzIGNvbW1hbmQgaXMgaW5zaWRlIENBU0UiICovCisJUkVTX0VTQUMgICwKKyNlbmRpZgorCVJFU19YWFhYICAsCisJUkVTX1NOVFgKK307CisKK3R5cGVkZWYgc3RydWN0IG9fc3RyaW5nIHsKKwljaGFyICpkYXRhOworCWludCBsZW5ndGg7IC8qIHBvc2l0aW9uIHdoZXJlIGRhdGEgaXMgYXBwZW5kZWQgKi8KKwlpbnQgbWF4bGVuOworCWludCBvX2V4cGZsYWdzOworCS8qIEF0IGxlYXN0IHNvbWUgcGFydCBvZiB0aGUgc3RyaW5nIHdhcyBpbnNpZGUgJycgb3IgIiIsCisJICogcG9zc2libHkgZW1wdHkgb25lOiB3b3JkIiIsIHdvJydyZCBldGMuICovCisJc21hbGxpbnQgaGFzX3F1b3RlZF9wYXJ0OworCXNtYWxsaW50IGhhc19lbXB0eV9zbG90OworCXNtYWxsaW50IG9fYXNzaWdubWVudDsgLyogMDptYXliZSwgMTp5ZXMsIDI6bm8gKi8KK30gb19zdHJpbmc7CitlbnVtIHsKKwlFWFBfRkxBR19TSU5HTEVXT1JEICAgICA9IDB4ODAsIC8qIG11c3QgYmUgMHg4MCAqLworCUVYUF9GTEFHX0dMT0IgICAgICAgICAgID0gMHgyLAorCS8qIFByb3RlY3QgbmV3bHkgYWRkZWQgY2hhcnMgYWdhaW5zdCBnbG9iYmluZworCSAqIGJ5IHByZXBlbmRpbmcgXCB0byAqLCA/LCBbLCBcICovCisJRVhQX0ZMQUdfRVNDX0dMT0JfQ0hBUlMgPSAweDEsCit9OworZW51bSB7CisJTUFZQkVfQVNTSUdOTUVOVCAgICAgID0gMCwKKwlERUZJTklURUxZX0FTU0lHTk1FTlQgPSAxLAorCU5PVF9BU1NJR05NRU5UICAgICAgICA9IDIsCisJLyogTm90IGFuIGFzc2lnbm1lbnQsIGJ1dCBuZXh0IHdvcmQgbWF5IGJlOiAiaWYgdj14eXogY21kOyIgKi8KKwlXT1JEX0lTX0tFWVdPUkQgICAgICAgPSAzLAorfTsKKy8qIFVzZWQgZm9yIGluaXRpYWxpemF0aW9uOiBvX3N0cmluZyBmb28gPSBOVUxMX09fU1RSSU5HOyAqLworI2RlZmluZSBOVUxMX09fU1RSSU5HIHsgTlVMTCB9CisKKyNpZm5kZWYgZGVidWdfcHJpbnRmX3BhcnNlCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYXNzaWdubWVudF9mbGFnW10gPSB7CisJIk1BWUJFX0FTU0lHTk1FTlQiLAorCSJERUZJTklURUxZX0FTU0lHTk1FTlQiLAorCSJOT1RfQVNTSUdOTUVOVCIsCisJIldPUkRfSVNfS0VZV09SRCIsCit9OworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGluX3N0ciB7CisJY29uc3QgY2hhciAqcDsKKwkvKiBlb2ZfZmxhZz0xOiBsYXN0IGNoYXIgaW4gLT5wIGlzIHJlYWxseSBhbiBFT0YgKi8KKwljaGFyIGVvZl9mbGFnOyAvKiBtZWFuaW5nbGVzcyBpZiAtPnAgPT0gTlVMTCAqLworCWNoYXIgcGVla19idWZbMl07CisjaWYgRU5BQkxFX0hVU0hfSU5URVJBQ1RJVkUKKwlzbWFsbGludCBwcm9tcHRtb2RlOyAvKiAwOiBQUzEsIDE6IFBTMiAqLworI2VuZGlmCisJaW50IGxhc3RfY2hhcjsKKwlGSUxFICpmaWxlOworCWludCAoKmdldCkgKHN0cnVjdCBpbl9zdHIgKikgRkFTVF9GVU5DOworCWludCAoKnBlZWspIChzdHJ1Y3QgaW5fc3RyICopIEZBU1RfRlVOQzsKK30gaW5fc3RyOworI2RlZmluZSBpX2dldGNoKGlucHV0KSAoKGlucHV0KS0+Z2V0KGlucHV0KSkKKyNkZWZpbmUgaV9wZWVrKGlucHV0KSAoKGlucHV0KS0+cGVlayhpbnB1dCkpCisKKy8qIFRoZSBkZXNjcmlwIG1lbWJlciBvZiB0aGlzIHN0cnVjdHVyZSBpcyBvbmx5IHVzZWQgdG8gbWFrZQorICogZGVidWdnaW5nIG91dHB1dCBwcmV0dHkgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgeworCWludCBtb2RlOworCXNpZ25lZCBjaGFyIGRlZmF1bHRfZmQ7CisJY2hhciBkZXNjcmlwWzNdOworfSByZWRpcl90YWJsZVtdID0geworCXsgT19SRE9OTFksICAgICAgICAgICAgICAgICAgMCwgIjwiICB9LAorCXsgT19DUkVBVHxPX1RSVU5DfE9fV1JPTkxZLCAgMSwgIj4iICB9LAorCXsgT19DUkVBVHxPX0FQUEVORHxPX1dST05MWSwgMSwgIj4+IiB9LAorCXsgT19DUkVBVHxPX1JEV1IsICAgICAgICAgICAgMSwgIjw+IiB9LAorCXsgT19SRE9OTFksICAgICAgICAgICAgICAgICAgMCwgIjw8IiB9LAorLyogU2hvdWxkIG5vdCBiZSBuZWVkZWQuIEJvZ3VzIGRlZmF1bHRfZmQgaGVscHMgaW4gZGVidWdnaW5nICovCisvKgl7IE9fUkRPTkxZLCAgICAgICAgICAgICAgICAgNzcsICI8PCIgfSwgKi8KK307CisKK3N0cnVjdCByZWRpcl9zdHJ1Y3QgeworCXN0cnVjdCByZWRpcl9zdHJ1Y3QgKm5leHQ7CisJY2hhciAqcmRfZmlsZW5hbWU7ICAgICAgICAgIC8qIGZpbGVuYW1lICovCisJaW50IHJkX2ZkOyAgICAgICAgICAgICAgICAgIC8qIGZkIHRvIHJlZGlyZWN0ICovCisJLyogZmQgdG8gcmVkaXJlY3QgdG8sIG9yIC0zIGlmIHJkX2ZkIGlzIHRvIGJlIGNsb3NlZCAobj4mLSkgKi8KKwlpbnQgcmRfZHVwOworCXNtYWxsaW50IHJkX3R5cGU7ICAgICAgICAgICAvKiAoZW51bSByZWRpcl90eXBlKSAqLworCS8qIG5vdGU6IGZvciBoZXJlZG9jcywgcmRfZmlsZW5hbWUgY29udGFpbnMgaGVyZWRvYyBkZWxpbWl0ZXIsCisJICogYW5kIHN1YnNlcXVlbnRseSBoZXJlZG9jIGl0c2VsZjsgYW5kIHJkX2R1cCBpcyBhIGJpdG1hc2s6CisJICogYml0IDA6IGRvIHdlIG5lZWQgdG8gdHJpbSBsZWFkaW5nIHRhYnM/CisJICogYml0IDE6IGlzIGhlcmVkb2MgcXVvdGVkICg8PCdkZWxpbScgc3ludGF4KSA/CisJICovCit9OwordHlwZWRlZiBlbnVtIHJlZGlyX3R5cGUgeworCVJFRElSRUNUX0lOUFVUICAgICA9IDAsCisJUkVESVJFQ1RfT1ZFUldSSVRFID0gMSwKKwlSRURJUkVDVF9BUFBFTkQgICAgPSAyLAorCVJFRElSRUNUX0lPICAgICAgICA9IDMsCisJUkVESVJFQ1RfSEVSRURPQyAgID0gNCwKKwlSRURJUkVDVF9IRVJFRE9DMiAgPSA1LCAvKiBSRURJUkVDVF9IRVJFRE9DIGFmdGVyIGhlcmVkb2MgaXMgbG9hZGVkICovCisKKwlSRURJUkZEX0NMT1NFICAgICAgPSAtMywKKwlSRURJUkZEX1NZTlRBWF9FUlIgPSAtMiwKKwlSRURJUkZEX1RPX0ZJTEUgICAgPSAtMSwKKwkvKiBvdGhlcndpc2UsIHJkX2ZkIGlzIHJlZGlyZWN0ZWQgdG8gcmRfZHVwICovCisKKwlIRVJFRE9DX1NLSVBUQUJTID0gMSwKKwlIRVJFRE9DX1FVT1RFRCAgID0gMiwKK30gcmVkaXJfdHlwZTsKKworCitzdHJ1Y3QgY29tbWFuZCB7CisJcGlkX3QgcGlkOyAgICAgICAgICAgICAgICAgIC8qIDAgaWYgZXhpdGVkICovCisJaW50IGFzc2lnbm1lbnRfY250OyAgICAgICAgIC8qIGhvdyBtYW55IGFyZ3ZbaV0gYXJlIGFzc2lnbm1lbnRzPyAqLworCXNtYWxsaW50IGNtZF90eXBlOyAgICAgICAgICAvKiBDTURfeHh4ICovCisjZGVmaW5lIENNRF9OT1JNQUwgICAwCisjZGVmaW5lIENNRF9TVUJTSEVMTCAxCisjaWYgRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQKKy8qIHVzZWQgZm9yICJbWyBFWFBSIF1dIiAqLworIyBkZWZpbmUgQ01EX1NJTkdMRVdPUkRfTk9HTE9CIDIKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworIyBkZWZpbmUgQ01EX0ZVTkNERUYgMworI2VuZGlmCisKKwlzbWFsbHVpbnQgY21kX2V4aXRjb2RlOworCS8qIGlmIG5vbi1OVUxMLCB0aGlzICJjb21tYW5kIiBpcyB7IGxpc3QgfSwgKCBsaXN0ICksIG9yIGEgY29tcG91bmQgc3RhdGVtZW50ICovCisJc3RydWN0IHBpcGUgKmdyb3VwOworI2lmICFCQl9NTVUKKwljaGFyICpncm91cF9hc19zdHJpbmc7CisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwlzdHJ1Y3QgZnVuY3Rpb24gKmNoaWxkX2Z1bmM7CisvKiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gcHJldmVudCBhIGJ1ZyBoZXJlOgorICogd2hpbGUuLi5kbyBmMSgpIHthO307IGYxOyBmMSgpIHtiO307IGYxOyBkb25lCisgKiBXaGVuIHdlIGV4ZWN1dGUgImYxKCkge2E7fSIgY21kLCB3ZSBjcmVhdGUgbmV3IGZ1bmN0aW9uIGFuZCBjbGVhcgorICogY21kLT5ncm91cCwgY21kLT5ncm91cF9hc19zdHJpbmcsIGNtZC0+YXJndlswXS4KKyAqIFdoZW4gd2UgZXhlY3V0ZSAiZjEoKSB7Yjt9Iiwgd2Ugbm90aWNlIHRoYXQgZjEgZXhpc3RzLAorICogYW5kIHRoYXQgaXRzICJwYXJlbnQgY21kIiBzdHJ1Y3QgaXMgc3RpbGwgImFsaXZlIiwKKyAqIHdlIHB1dCB0aG9zZSBmaWVsZHMgYmFjayBpbnRvIGNtZC0+eHh4CisgKiAoc3RydWN0IGZ1bmN0aW9uIGhhcyAtPnBhcmVudF9jbWQgcHRyIHRvIGZhY2lsaXRhdGUgdGhhdCkuCisgKiBXaGVuIHdlIGxvb3AgYmFjaywgd2UgY2FuIGV4ZWN1dGUgImYxKCkge2E7fSIgYWdhaW4gYW5kIHNldCBmMSBjb3JyZWN0bHkuCisgKiBXaXRob3V0IHRoaXMgdHJpY2ssIGxvb3Agd291bGQgZXhlY3V0ZSBhO2I7YjtiOy4uLgorICogaW5zdGVhZCBvZiBjb3JyZWN0IHNlcXVlbmNlIGE7YjthO2I7Li4uCisgKiBXaGVuIGNvbW1hbmQgaXMgZnJlZWQsIGl0IHNldmVycyB0aGUgbGluaworICogKHNldHMgLT5jaGlsZF9mdW5jLT5wYXJlbnRfY21kIHRvIE5VTEwpLgorICovCisjZW5kaWYKKwljaGFyICoqYXJndjsgICAgICAgICAgICAgICAgLyogY29tbWFuZCBuYW1lIGFuZCBhcmd1bWVudHMgKi8KKy8qIGFyZ3YgdmVjdG9yIG1heSBjb250YWluIHZhcmlhYmxlIHJlZmVyZW5jZXMgKF5DdmFyXkMsIF5DMF5DIGV0YykKKyAqIGFuZCBvbiBleGVjdXRpb24gdGhlc2UgYXJlIHN1YnN0aXR1dGVkIHdpdGggdGhlaXIgdmFsdWVzLgorICogU3Vic3RpdHV0aW9uIGNhbiBtYWtlIF9zZXZlcmFsXyB3b3JkcyBvdXQgb2Ygb25lIGFyZ3Zbbl0hCisgKiBFeGFtcGxlOiBhcmd2WzBdPT0nLl5DKl5DLicgaGVyZTogZWNobyAuJCouCisgKiBSZWZlcmVuY2VzIG9mIHRoZSBmb3JtIF5DYGNtZCBhcmdeQyBhcmUgYGNtZCBhcmdgIHN1YnN0aXR1dGlvbnMuCisgKi8KKwlzdHJ1Y3QgcmVkaXJfc3RydWN0ICpyZWRpcmVjdHM7IC8qIEkvTyByZWRpcmVjdGlvbnMgKi8KK307CisvKiBJcyB0aGVyZSBhbnl0aGluZyBpbiB0aGlzIGNvbW1hbmQgYXQgYWxsPyAqLworI2RlZmluZSBJU19OVUxMX0NNRChjbWQpIFwKKwkoIShjbWQpLT5ncm91cCAmJiAhKGNtZCktPmFyZ3YgJiYgIShjbWQpLT5yZWRpcmVjdHMpCisKK3N0cnVjdCBwaXBlIHsKKwlzdHJ1Y3QgcGlwZSAqbmV4dDsKKwlpbnQgbnVtX2NtZHM7ICAgICAgICAgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIGNvbW1hbmRzIGluIHBpcGUgKi8KKwlpbnQgYWxpdmVfY21kczsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvbW1hbmRzIHJ1bm5pbmcgKG5vdCBleGl0ZWQpICovCisJaW50IHN0b3BwZWRfY21kczsgICAgICAgICAgIC8qIG51bWJlciBvZiBjb21tYW5kcyBhbGl2ZSwgYnV0IHN0b3BwZWQgKi8KKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwlpbnQgam9iaWQ7ICAgICAgICAgICAgICAgICAgLyogam9iIG51bWJlciAqLworCXBpZF90IHBncnA7ICAgICAgICAgICAgICAgICAvKiBwcm9jZXNzIGdyb3VwIElEIGZvciB0aGUgam9iICovCisJY2hhciAqY21kdGV4dDsgICAgICAgICAgICAgIC8qIG5hbWUgb2Ygam9iICovCisjZW5kaWYKKwlzdHJ1Y3QgY29tbWFuZCAqY21kczsgICAgICAgLyogYXJyYXkgb2YgY29tbWFuZHMgaW4gcGlwZSAqLworCXNtYWxsaW50IGZvbGxvd3VwOyAgICAgICAgICAvKiBQSVBFX0JHLCBQSVBFX1NFUSwgUElQRV9PUiwgUElQRV9BTkQgKi8KKwlJRl9IQVNfS0VZV09SRFMoc21hbGxpbnQgcGlfaW52ZXJ0ZWQ7KSAvKiAiISBjbWQgfCBjbWQiICovCisJSUZfSEFTX0tFWVdPUkRTKHNtYWxsaW50IHJlc193b3JkOykgLyogbmVlZGVkIGZvciBpZiwgZm9yLCB3aGlsZSwgdW50aWwuLi4gKi8KK307Cit0eXBlZGVmIGVudW0gcGlwZV9zdHlsZSB7CisJUElQRV9TRVEgPSAxLAorCVBJUEVfQU5EID0gMiwKKwlQSVBFX09SICA9IDMsCisJUElQRV9CRyAgPSA0LAorfSBwaXBlX3N0eWxlOworLyogSXMgdGhlcmUgYW55dGhpbmcgaW4gdGhpcyBwaXBlIGF0IGFsbD8gKi8KKyNkZWZpbmUgSVNfTlVMTF9QSVBFKHBpKSBcCisJKChwaSktPm51bV9jbWRzID09IDAgSUZfSEFTX0tFWVdPUkRTKCAmJiAocGkpLT5yZXNfd29yZCA9PSBSRVNfTk9ORSkpCisKKy8qIFRoaXMgaG9sZHMgcG9pbnRlcnMgdG8gdGhlIHZhcmlvdXMgcmVzdWx0cyBvZiBwYXJzaW5nICovCitzdHJ1Y3QgcGFyc2VfY29udGV4dCB7CisJLyogbGlua2VkIGxpc3Qgb2YgcGlwZXMgKi8KKwlzdHJ1Y3QgcGlwZSAqbGlzdF9oZWFkOworCS8qIGxhc3QgcGlwZSAoYmVpbmcgY29uc3RydWN0ZWQgcmlnaHQgbm93KSAqLworCXN0cnVjdCBwaXBlICpwaXBlOworCS8qIGxhc3QgY29tbWFuZCBpbiBwaXBlIChiZWluZyBjb25zdHJ1Y3RlZCByaWdodCBub3cpICovCisJc3RydWN0IGNvbW1hbmQgKmNvbW1hbmQ7CisJLyogbGFzdCByZWRpcmVjdCBpbiBjb21tYW5kLT5yZWRpcmVjdHMgbGlzdCAqLworCXN0cnVjdCByZWRpcl9zdHJ1Y3QgKnBlbmRpbmdfcmVkaXJlY3Q7CisjaWYgIUJCX01NVQorCW9fc3RyaW5nIGFzX3N0cmluZzsKKyNlbmRpZgorI2lmIEhBU19LRVlXT1JEUworCXNtYWxsaW50IGN0eF9yZXNfdzsKKwlzbWFsbGludCBjdHhfaW52ZXJ0ZWQ7IC8qICIhIGNtZCB8IGNtZCIgKi8KKyNpZiBFTkFCTEVfSFVTSF9DQVNFCisJc21hbGxpbnQgY3R4X2RzZW1pY29sb247IC8qICI7OyIgc2VlbiAqLworI2VuZGlmCisJLyogYml0bWFzayBvZiBGTEFHX3h4eCwgZm9yIGZpZ3VyaW5nIG91dCB2YWxpZCByZXNlcnZlZCB3b3JkcyAqLworCWludCBvbGRfZmxhZzsKKwkvKiBncm91cCB3ZSBhcmUgZW5jbG9zZWQgaW46CisJICogZXhhbXBsZTogImlmIHBpcGUxOyBwaXBlMjsgdGhlbiBwaXBlMzsgZmkiCisJICogd2hlbiB3ZSBzZWUgImlmIiBvciAidGhlbiIsIHdlIG1hbGxvYyBhbmQgY29weSBjdXJyZW50IGNvbnRleHQsCisJICogYW5kIG1ha2UgLT5zdGFjayBwb2ludCB0byBpdC4gdGhlbiB3ZSBwYXJzZSBwaXBlTi4KKwkgKiB3aGVuIGNsb3NpbmcgInRoZW4iIC8gZmkiIC8gd2hhdGV2ZXIgaXMgZm91bmQsCisJICogd2UgbW92ZSBsaXN0X2hlYWQgaW50byAtPnN0YWNrLT5jb21tYW5kLT5ncm91cCwKKwkgKiBjb3B5IC0+c3RhY2sgaW50byBjdXJyZW50IGNvbnRleHQsIGFuZCBkZWxldGUgLT5zdGFjay4KKwkgKiAocGFyc2luZyBvZiB7IGxpc3QgfSBhbmQgKCBsaXN0ICkgZG9lc24ndCB1c2UgdGhpcyBtZXRob2QpCisJICovCisJc3RydWN0IHBhcnNlX2NvbnRleHQgKnN0YWNrOworI2VuZGlmCit9OworCisvKiBPbiBwcm9ncmFtIHN0YXJ0LCBlbnZpcm9uIHBvaW50cyB0byBpbml0aWFsIGVudmlyb25tZW50LgorICogcHV0ZW52IGFkZHMgbmV3IHBvaW50ZXJzIGludG8gaXQsIHVuc2V0ZW52IHJlbW92ZXMgdGhlbS4KKyAqIE5laXRoZXIgb2YgdGhlc2UgKGRlKWFsbG9jYXRlcyB0aGUgc3RyaW5ncy4KKyAqIHNldGVudiBhbGxvY2F0ZXMgbmV3IHN0cmluZ3MgaW4gbWFsbG9jIHNwYWNlIGFuZCBkb2VzIHB1dGVudiwKKyAqIGFuZCB0aHVzIHNldGVudiBpcyB1bnVzYWJsZSAobGVha3kpIGZvciBzaGVsbCdzIHB1cnBvc2VzICovCisjZGVmaW5lIHNldGVudiguLi4pIHNldGVudl9pc19sZWFreV9kb250X3VzZSgpCitzdHJ1Y3QgdmFyaWFibGUgeworCXN0cnVjdCB2YXJpYWJsZSAqbmV4dDsKKwljaGFyICp2YXJzdHI7ICAgICAgICAvKiBwb2ludHMgdG8gIm5hbWU9IiBwb3J0aW9uICovCisjaWYgRU5BQkxFX0hVU0hfTE9DQUwKKwl1bnNpZ25lZCBmdW5jX25lc3RfbGV2ZWw7CisjZW5kaWYKKwlpbnQgbWF4X2xlbjsgICAgICAgICAvKiBpZiA+IDAsIG5hbWUgaXMgcGFydCBvZiBpbml0aWFsIGVudjsgZWxzZSBuYW1lIGlzIG1hbGxvY2VkICovCisJc21hbGxpbnQgZmxnX2V4cG9ydDsgLyogcHV0ZW52IHNob3VsZCBiZSBkb25lIG9uIHRoaXMgdmFyICovCisJc21hbGxpbnQgZmxnX3JlYWRfb25seTsKK307CisKK2VudW0geworCUJDX0JSRUFLID0gMSwKKwlCQ19DT05USU5VRSA9IDIsCit9OworCisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCitzdHJ1Y3QgZnVuY3Rpb24geworCXN0cnVjdCBmdW5jdGlvbiAqbmV4dDsKKwljaGFyICpuYW1lOworCXN0cnVjdCBjb21tYW5kICpwYXJlbnRfY21kOworCXN0cnVjdCBwaXBlICpib2R5OworIyBpZiAhQkJfTU1VCisJY2hhciAqYm9keV9hc19zdHJpbmc7CisjIGVuZGlmCit9OworI2VuZGlmCisKKworLyogc2V0IC0vK28gT1BUIHN1cHBvcnQuIChUT0RPOiBtYWtlIGl0IG9wdGlvbmFsKQorICogYmFzaCBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIG9wdHM6CisgKiBhbGxleHBvcnQgICAgICAgb2ZmCisgKiBicmFjZWV4cGFuZCAgICAgb24KKyAqIGVtYWNzICAgICAgICAgICBvbgorICogZXJyZXhpdCAgICAgICAgIG9mZgorICogZXJydHJhY2UgICAgICAgIG9mZgorICogZnVuY3RyYWNlICAgICAgIG9mZgorICogaGFzaGFsbCAgICAgICAgIG9uCisgKiBoaXN0ZXhwYW5kICAgICAgb2ZmCisgKiBoaXN0b3J5ICAgICAgICAgb24KKyAqIGlnbm9yZWVvZiAgICAgICBvZmYKKyAqIGludGVyYWN0aXZlLWNvbW1lbnRzICAgIG9uCisgKiBrZXl3b3JkICAgICAgICAgb2ZmCisgKiBtb25pdG9yICAgICAgICAgb24KKyAqIG5vY2xvYmJlciAgICAgICBvZmYKKyAqIG5vZXhlYyAgICAgICAgICBvZmYKKyAqIG5vZ2xvYiAgICAgICAgICBvZmYKKyAqIG5vbG9nICAgICAgICAgICBvZmYKKyAqIG5vdGlmeSAgICAgICAgICBvZmYKKyAqIG5vdW5zZXQgICAgICAgICBvZmYKKyAqIG9uZWNtZCAgICAgICAgICBvZmYKKyAqIHBoeXNpY2FsICAgICAgICBvZmYKKyAqIHBpcGVmYWlsICAgICAgICBvZmYKKyAqIHBvc2l4ICAgICAgICAgICBvZmYKKyAqIHByaXZpbGVnZWQgICAgICBvZmYKKyAqIHZlcmJvc2UgICAgICAgICBvZmYKKyAqIHZpICAgICAgICAgICAgICBvZmYKKyAqIHh0cmFjZSAgICAgICAgICBvZmYKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgb19vcHRfc3RyaW5nc1tdIEFMSUdOMSA9CisJInBpcGVmYWlsXDAiCisJIm5vZXhlY1wwIgorI2lmIEVOQUJMRV9IVVNIX01PREVfWAorCSJ4dHJhY2VcMCIKKyNlbmRpZgorCTsKK2VudW0geworCU9QVF9PX1BJUEVGQUlMLAorCU9QVF9PX05PRVhFQywKKyNpZiBFTkFCTEVfSFVTSF9NT0RFX1gKKwlPUFRfT19YVFJBQ0UsCisjZW5kaWYKKwlOVU1fT1BUX08KK307CisKKworLyogIkdsb2JhbHMiIHdpdGhpbiB0aGlzIGZpbGUgKi8KKy8qIFNvcnRlZCByb3VnaGx5IGJ5IHNpemUgKHNtYWxsZXIgb2Zmc2V0cyA9PSBzbWFsbGVyIGNvZGUpICovCitzdHJ1Y3QgZ2xvYmFscyB7CisJLyogaW50ZXJhY3RpdmVfZmQgIT0gMCBtZWFucyB3ZSBhcmUgYW4gaW50ZXJhY3RpdmUgc2hlbGwuCisJICogSWYgd2UgYXJlLCB0aGVuIHNhdmVkX3R0eV9wZ3JwIGNhbiBhbHNvIGJlICE9IDAsIG1lYW5pbmcKKwkgKiB0aGF0IGNvbnRyb2xsaW5nIHR0eSBpcyBhdmFpbGFibGUuIFdpdGggc2F2ZWRfdHR5X3BncnAgPT0gMCwKKwkgKiBqb2IgY29udHJvbCBzdGlsbCB3b3JrcywgYnV0IHRlcm1pbmFsIHNpZ25hbHMKKwkgKiAoXkMsIF5aLCBeWSwgXlwpIHdvbid0IHdvcmsgYXQgYWxsLCBhbmQgYmFja2dyb3VuZAorCSAqIHByb2Nlc3MgZ3JvdXBzIGNhbiBvbmx5IGJlIGNyZWF0ZWQgd2l0aCAiY21kICYiLgorCSAqIFdpdGggc2F2ZWRfdHR5X3BncnAgIT0gMCwgaHVzaCB3aWxsIHVzZSB0Y3NldHBncnAoKQorCSAqIHRvIGdpdmUgdHR5IHRvIHRoZSBmb3JlZ3JvdW5kIHByb2Nlc3MgZ3JvdXAsCisJICogYW5kIHdpbGwgdGFrZSBpdCBiYWNrIHdoZW4gdGhlIGdyb3VwIGlzIHN0b3BwZWQgKF5aKQorCSAqIG9yIGtpbGxlZCAoXkMpLgorCSAqLworI2lmIEVOQUJMRV9IVVNIX0lOVEVSQUNUSVZFCisJLyogJ2ludGVyYWN0aXZlX2ZkJyBpcyBhIGZkIyBvcGVuIHRvIGN0dHksIGlmIHdlIGhhdmUgb25lCisJICogX0FORF8gaWYgd2UgZGVjaWRlZCB0byBhY3QgaW50ZXJhY3RpdmVseSAqLworCWludCBpbnRlcmFjdGl2ZV9mZDsKKwljb25zdCBjaGFyICpQUzE7CisJY29uc3QgY2hhciAqUFMyOworIyBkZWZpbmUgR19pbnRlcmFjdGl2ZV9mZCAoRy5pbnRlcmFjdGl2ZV9mZCkKKyNlbHNlCisjIGRlZmluZSBHX2ludGVyYWN0aXZlX2ZkIDAKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkcKKwlsaW5lX2lucHV0X3QgKmxpbmVfaW5wdXRfc3RhdGU7CisjZW5kaWYKKwlwaWRfdCByb290X3BpZDsKKwlwaWRfdCByb290X3BwaWQ7CisJcGlkX3QgbGFzdF9iZ19waWQ7CisjaWYgRU5BQkxFX0hVU0hfUkFORE9NX1NVUFBPUlQKKwlyYW5kb21fdCByYW5kb21fZ2VuOworI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfSk9CCisJaW50IHJ1bl9saXN0X2xldmVsOworCWludCBsYXN0X2pvYmlkOworCXBpZF90IHNhdmVkX3R0eV9wZ3JwOworCXN0cnVjdCBwaXBlICpqb2JfbGlzdDsKKyMgZGVmaW5lIEdfc2F2ZWRfdHR5X3BncnAgKEcuc2F2ZWRfdHR5X3BncnApCisjZWxzZQorIyBkZWZpbmUgR19zYXZlZF90dHlfcGdycCAwCisjZW5kaWYKKwljaGFyIG9fb3B0W05VTV9PUFRfT107CisjaWYgRU5BQkxFX0hVU0hfTU9ERV9YCisjIGRlZmluZSBHX3hfbW9kZSAoRy5vX29wdFtPUFRfT19YVFJBQ0VdKQorI2Vsc2UKKyMgZGVmaW5lIEdfeF9tb2RlIDAKKyNlbmRpZgorCXNtYWxsaW50IGZsYWdfU0lHSU5UOworI2lmIEVOQUJMRV9IVVNIX0xPT1BTCisJc21hbGxpbnQgZmxhZ19icmVha19jb250aW51ZTsKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCS8qIDA6IG91dHNpZGUgb2YgYSBmdW5jdGlvbiAob3Igc291cmNlZCBmaWxlKQorCSAqIC0xOiBpbnNpZGUgb2YgYSBmdW5jdGlvbiwgb2sgdG8gdXNlIHJldHVybiBidWlsdGluCisJICogMTogcmV0dXJuIGlzIGludm9rZWQsIHNraXAgYWxsIHRpbGwgZW5kIG9mIGZ1bmMKKwkgKi8KKwlzbWFsbGludCBmbGFnX3JldHVybl9pbl9wcm9ncmVzczsKKyNlbmRpZgorCXNtYWxsaW50IGV4aXRpbmc7IC8qIHVzZWQgdG8gcHJldmVudCBFWElUIHRyYXAgcmVjdXJzaW9uICovCisJLyogVGhlc2UgZm91ciBzdXBwb3J0ICQ/LCAkIywgYW5kICQxICovCisJc21hbGx1aW50IGxhc3RfZXhpdGNvZGU7CisJLyogYXJlIGdsb2JhbF9hcmd2IGFuZCBnbG9iYWxfYXJndlsxLi5uXSBtYWxsb2NlZD8gKG5vdGU6IG5vdCBbMF0pICovCisJc21hbGx1aW50IGdsb2JhbF9hcmdzX21hbGxvY2VkOworCS8qIGhvdyBtYW55IG5vbi1OVUxMIGFyZ3YncyB3ZSBoYXZlLiBOQjogJCMgKyAxICovCisJaW50IGdsb2JhbF9hcmdjOworCWNoYXIgKipnbG9iYWxfYXJndjsKKyNpZiAhQkJfTU1VCisJY2hhciAqYXJndjBfZm9yX3JlX2V4ZWNpbmc7CisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9MT09QUworCXVuc2lnbmVkIGRlcHRoX2JyZWFrX2NvbnRpbnVlOworCXVuc2lnbmVkIGRlcHRoX29mX2xvb3A7CisjZW5kaWYKKwljb25zdCBjaGFyICppZnM7CisJY29uc3QgY2hhciAqY3dkOworCXN0cnVjdCB2YXJpYWJsZSAqdG9wX3ZhcjsKKwljaGFyICoqZXhwYW5kZWRfYXNzaWdubWVudHM7CisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJc3RydWN0IGZ1bmN0aW9uICp0b3BfZnVuYzsKKyMgaWYgRU5BQkxFX0hVU0hfTE9DQUwKKwlzdHJ1Y3QgdmFyaWFibGUgKipzaGFkb3dlZF92YXJzX3BwOworCXVuc2lnbmVkIGZ1bmNfbmVzdF9sZXZlbDsKKyMgZW5kaWYKKyNlbmRpZgorCS8qIFNpZ25hbCBhbmQgdHJhcCBoYW5kbGluZyAqLworI2lmIEVOQUJMRV9IVVNIX0ZBU1QKKwl1bnNpZ25lZCBjb3VudF9TSUdDSExEOworCXVuc2lnbmVkIGhhbmRsZWRfU0lHQ0hMRDsKKwlzbWFsbGludCB3ZV9oYXZlX2NoaWxkcmVuOworI2VuZGlmCisJLyogV2hpY2ggc2lnbmFscyBoYXZlIG5vbi1ERkwgaGFuZGxlciAoZXZlbiB3aXRoIG5vIHRyYXBzIHNldCk/CisJICogU2V0IGF0IHRoZSBzdGFydCB0bzoKKwkgKiAoU0lHUVVJVCArIG1heWJlIFNQRUNJQUxfSU5URVJBQ1RJVkVfU0lHUyArIG1heWJlIFNQRUNJQUxfSk9CU1RPUF9TSUdTKQorCSAqIFNQRUNJQUxfSU5URVJBQ1RJVkVfU0lHUyBhcmUgY2xlYXJlZCBhZnRlciBmb3JrLgorCSAqIFRoZSByZXN0IGlzIGNsZWFyZWQgcmlnaHQgYmVmb3JlIGV4ZWN2IHN5c2NhbGxzLgorCSAqIE90aGVyIHRoYW4gdGhlc2UgdHdvIHRpbWVzLCBuZXZlciBtb2RpZmllZC4KKwkgKi8KKwl1bnNpZ25lZCBzcGVjaWFsX3NpZ19tYXNrOworI2lmIEVOQUJMRV9IVVNIX0pPQgorCXVuc2lnbmVkIGZhdGFsX3NpZ19tYXNrOworIyBkZWZpbmUgR19mYXRhbF9zaWdfbWFzayBHLmZhdGFsX3NpZ19tYXNrCisjZWxzZQorIyBkZWZpbmUgR19mYXRhbF9zaWdfbWFzayAwCisjZW5kaWYKKwljaGFyICoqdHJhcHM7IC8qIGNoYXIgKnRyYXBzW05TSUddICovCisJc2lnc2V0X3QgcGVuZGluZ19zZXQ7CisjaWYgSFVTSF9ERUJVRworCXVuc2lnbmVkIGxvbmcgbWVtbGVha192YWx1ZTsKKwlpbnQgZGVidWdfaW5kZW50OworI2VuZGlmCisJc3RydWN0IHNpZ2FjdGlvbiBzYTsKKwljaGFyIHVzZXJfaW5wdXRfYnVmW0VOQUJMRV9GRUFUVVJFX0VESVRJTkcgPyBDT05GSUdfRkVBVFVSRV9FRElUSU5HX01BWF9MRU4gOiAyXTsKK307CisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKy8qIE5vdCAjZGVmaW5pbmcgbmFtZSB0byBHLm5hbWUgLSB0aGlzIHF1aWNrbHkgZ2V0cyB1bndpZWxkeQorICogKHRvbyBtYW55IGRlZmluZXMpLiBBbHNvLCBJIGFjdHVhbGx5IHByZWZlciB0byBzZWUgd2hlbiBhIHZhcmlhYmxlCisgKiBpcyBnbG9iYWwsIHRodXMgIkcuIiBwcmVmaXggaXMgYSB1c2VmdWwgaGludCAqLworI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorCS8qIG1lbXNldCgmRy5zYSwgMCwgc2l6ZW9mKEcuc2EpKTsgKi8gIFwKKwlzaWdmaWxsc2V0KCZHLnNhLnNhX21hc2spOyBcCisJRy5zYS5zYV9mbGFncyA9IFNBX1JFU1RBUlQ7IFwKK30gd2hpbGUgKDApCisKKworLyogRnVuY3Rpb24gcHJvdG90eXBlcyBmb3IgYnVpbHRpbnMgKi8KK3N0YXRpYyBpbnQgYnVpbHRpbl9jZChjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX2VjaG8oY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgYnVpbHRpbl9ldmFsKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IGJ1aWx0aW5fZXhlYyhjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX2V4aXQoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgYnVpbHRpbl9leHBvcnQoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKKyNpZiBFTkFCTEVfSFVTSF9KT0IKK3N0YXRpYyBpbnQgYnVpbHRpbl9mZ19iZyhjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX2pvYnMoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0hFTFAKK3N0YXRpYyBpbnQgYnVpbHRpbl9oZWxwKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CisjZW5kaWYKKyNpZiBNQVhfSElTVE9SWSAmJiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HCitzdGF0aWMgaW50IGJ1aWx0aW5faGlzdG9yeShjaGFyICoqYXJndikgRkFTVF9GVU5DOworI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfTE9DQUwKK3N0YXRpYyBpbnQgYnVpbHRpbl9sb2NhbChjaGFyICoqYXJndikgRkFTVF9GVU5DOworI2VuZGlmCisjaWYgSFVTSF9ERUJVRworc3RhdGljIGludCBidWlsdGluX21lbWxlYWsoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKKyNlbmRpZgorI2lmIEVOQUJMRV9QUklOVEYKK3N0YXRpYyBpbnQgYnVpbHRpbl9wcmludGYoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKKyNlbmRpZgorc3RhdGljIGludCBidWlsdGluX3B3ZChjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX3JlYWQoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgYnVpbHRpbl9zZXQoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgYnVpbHRpbl9zaGlmdChjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX3NvdXJjZShjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX3Rlc3QoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgYnVpbHRpbl90cmFwKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IGJ1aWx0aW5fdHlwZShjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX3RydWUoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgYnVpbHRpbl91bWFzayhjaGFyICoqYXJndikgRkFTVF9GVU5DOworc3RhdGljIGludCBidWlsdGluX3Vuc2V0KGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CitzdGF0aWMgaW50IGJ1aWx0aW5fd2FpdChjaGFyICoqYXJndikgRkFTVF9GVU5DOworI2lmIEVOQUJMRV9IVVNIX0xPT1BTCitzdGF0aWMgaW50IGJ1aWx0aW5fYnJlYWsoY2hhciAqKmFyZ3YpIEZBU1RfRlVOQzsKK3N0YXRpYyBpbnQgYnVpbHRpbl9jb250aW51ZShjaGFyICoqYXJndikgRkFTVF9GVU5DOworI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCitzdGF0aWMgaW50IGJ1aWx0aW5fcmV0dXJuKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CisjZW5kaWYKKworLyogVGFibGUgb2YgYnVpbHQtaW4gZnVuY3Rpb25zLiAgVGhleSBjYW4gYmUgZm9ya2VkIG9yIG5vdCwgZGVwZW5kaW5nIG9uCisgKiBjb250ZXh0OiB3aXRoaW4gcGlwZXMsIHRoZXkgZm9yay4gIEFzIHNpbXBsZSBjb21tYW5kcywgdGhleSBkbyBub3QuCisgKiBXaGVuIHVzZWQgaW4gbm9uLWZvcmtpbmcgY29udGV4dCwgdGhleSBjYW4gY2hhbmdlIGdsb2JhbCB2YXJpYWJsZXMKKyAqIGluIHRoZSBwYXJlbnQgc2hlbGwgcHJvY2Vzcy4gIElmIGZvcmtlZCwgb2YgY291cnNlIHRoZXkgY2Fubm90LgorICogRm9yIGV4YW1wbGUsICd1bnNldCBmb28gfCB3aGF0ZXZlcicgd2lsbCBwYXJzZSBhbmQgcnVuLCBidXQgZm9vIHdpbGwKKyAqIHN0aWxsIGJlIHNldCBhdCB0aGUgZW5kLiAqLworc3RydWN0IGJ1aWx0X2luX2NvbW1hbmQgeworCWNvbnN0IGNoYXIgKmJfY21kOworCWludCAoKmJfZnVuY3Rpb24pKGNoYXIgKiphcmd2KSBGQVNUX0ZVTkM7CisjaWYgRU5BQkxFX0hVU0hfSEVMUAorCWNvbnN0IGNoYXIgKmJfZGVzY3I7CisjIGRlZmluZSBCTFRJTihjbWQsIGZ1bmMsIGhlbHApIHsgY21kLCBmdW5jLCBoZWxwIH0KKyNlbHNlCisjIGRlZmluZSBCTFRJTihjbWQsIGZ1bmMsIGhlbHApIHsgY21kLCBmdW5jIH0KKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBidWlsdF9pbl9jb21tYW5kIGJsdGluczFbXSA9IHsKKwlCTFRJTigiLiIgICAgICAgICwgYnVpbHRpbl9zb3VyY2UgICwgIlJ1biBjb21tYW5kcyBpbiBhIGZpbGUiKSwKKwlCTFRJTigiOiIgICAgICAgICwgYnVpbHRpbl90cnVlICAgICwgTlVMTCksCisjaWYgRU5BQkxFX0hVU0hfSk9CCisJQkxUSU4oImJnIiAgICAgICAsIGJ1aWx0aW5fZmdfYmcgICAsICJSZXN1bWUgYSBqb2IgaW4gdGhlIGJhY2tncm91bmQiKSwKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0xPT1BTCisJQkxUSU4oImJyZWFrIiAgICAsIGJ1aWx0aW5fYnJlYWsgICAsICJFeGl0IGZyb20gYSBsb29wIiksCisjZW5kaWYKKwlCTFRJTigiY2QiICAgICAgICwgYnVpbHRpbl9jZCAgICAgICwgIkNoYW5nZSBkaXJlY3RvcnkiKSwKKyNpZiBFTkFCTEVfSFVTSF9MT09QUworCUJMVElOKCJjb250aW51ZSIgLCBidWlsdGluX2NvbnRpbnVlLCAiU3RhcnQgbmV3IGxvb3AgaXRlcmF0aW9uIiksCisjZW5kaWYKKwlCTFRJTigiZXZhbCIgICAgICwgYnVpbHRpbl9ldmFsICAgICwgIkNvbnN0cnVjdCBhbmQgcnVuIHNoZWxsIGNvbW1hbmQiKSwKKwlCTFRJTigiZXhlYyIgICAgICwgYnVpbHRpbl9leGVjICAgICwgIkV4ZWN1dGUgY29tbWFuZCwgZG9uJ3QgcmV0dXJuIHRvIHNoZWxsIiksCisJQkxUSU4oImV4aXQiICAgICAsIGJ1aWx0aW5fZXhpdCAgICAsICJFeGl0IiksCisJQkxUSU4oImV4cG9ydCIgICAsIGJ1aWx0aW5fZXhwb3J0ICAsICJTZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIiksCisjaWYgRU5BQkxFX0hVU0hfSk9CCisJQkxUSU4oImZnIiAgICAgICAsIGJ1aWx0aW5fZmdfYmcgICAsICJCcmluZyBqb2IgaW50byB0aGUgZm9yZWdyb3VuZCIpLAorI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfSEVMUAorCUJMVElOKCJoZWxwIiAgICAgLCBidWlsdGluX2hlbHAgICAgLCBOVUxMKSwKKyNlbmRpZgorI2lmIE1BWF9ISVNUT1JZICYmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkcKKwlCTFRJTigiaGlzdG9yeSIgICwgYnVpbHRpbl9oaXN0b3J5ICwgIlNob3cgY29tbWFuZCBoaXN0b3J5IiksCisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwlCTFRJTigiam9icyIgICAgICwgYnVpbHRpbl9qb2JzICAgICwgIkxpc3Qgam9icyIpLAorI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfTE9DQUwKKwlCTFRJTigibG9jYWwiICAgICwgYnVpbHRpbl9sb2NhbCAgICwgIlNldCBsb2NhbCB2YXJpYWJsZXMiKSwKKyNlbmRpZgorI2lmIEhVU0hfREVCVUcKKwlCTFRJTigibWVtbGVhayIgICwgYnVpbHRpbl9tZW1sZWFrICwgTlVMTCksCisjZW5kaWYKKwlCTFRJTigicmVhZCIgICAgICwgYnVpbHRpbl9yZWFkICAgICwgIklucHV0IGludG8gdmFyaWFibGUiKSwKKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwlCTFRJTigicmV0dXJuIiAgICwgYnVpbHRpbl9yZXR1cm4gICwgIlJldHVybiBmcm9tIGEgZnVuY3Rpb24iKSwKKyNlbmRpZgorCUJMVElOKCJzZXQiICAgICAgLCBidWlsdGluX3NldCAgICAgLCAiU2V0L3Vuc2V0IHBvc2l0aW9uYWwgcGFyYW1ldGVycyIpLAorCUJMVElOKCJzaGlmdCIgICAgLCBidWlsdGluX3NoaWZ0ICAgLCAiU2hpZnQgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIiksCisjaWYgRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQKKwlCTFRJTigic291cmNlIiAgICwgYnVpbHRpbl9zb3VyY2UgICwgIlJ1biBjb21tYW5kcyBpbiBhIGZpbGUiKSwKKyNlbmRpZgorCUJMVElOKCJ0cmFwIiAgICAgLCBidWlsdGluX3RyYXAgICAgLCAiVHJhcCBzaWduYWxzIiksCisJQkxUSU4oInRydWUiICAgICAsIGJ1aWx0aW5fdHJ1ZSAgICAsIE5VTEwpLAorCUJMVElOKCJ0eXBlIiAgICAgLCBidWlsdGluX3R5cGUgICAgLCAiU2hvdyBjb21tYW5kIHR5cGUiKSwKKwlCTFRJTigidWxpbWl0IiAgICwgc2hlbGxfYnVpbHRpbl91bGltaXQgICwgIkNvbnRyb2wgcmVzb3VyY2UgbGltaXRzIiksCisJQkxUSU4oInVtYXNrIiAgICAsIGJ1aWx0aW5fdW1hc2sgICAsICJTZXQgZmlsZSBjcmVhdGlvbiBtYXNrIiksCisJQkxUSU4oInVuc2V0IiAgICAsIGJ1aWx0aW5fdW5zZXQgICAsICJVbnNldCB2YXJpYWJsZXMiKSwKKwlCTFRJTigid2FpdCIgICAgICwgYnVpbHRpbl93YWl0ICAgICwgIldhaXQgZm9yIHByb2Nlc3MiKSwKK307CisvKiBGb3Igbm93LCBlY2hvIGFuZCB0ZXN0IGFyZSB1bmNvbmRpdGlvbmFsbHkgZW5hYmxlZC4KKyAqIE1heWJlIG1ha2UgaXQgY29uZmlndXJhYmxlPyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBidWlsdF9pbl9jb21tYW5kIGJsdGluczJbXSA9IHsKKwlCTFRJTigiWyIgICAgICAgICwgYnVpbHRpbl90ZXN0ICAgICwgTlVMTCksCisJQkxUSU4oImVjaG8iICAgICAsIGJ1aWx0aW5fZWNobyAgICAsIE5VTEwpLAorI2lmIEVOQUJMRV9QUklOVEYKKwlCTFRJTigicHJpbnRmIiAgICwgYnVpbHRpbl9wcmludGYgICwgTlVMTCksCisjZW5kaWYKKwlCTFRJTigicHdkIiAgICAgICwgYnVpbHRpbl9wd2QgICAgICwgTlVMTCksCisJQkxUSU4oInRlc3QiICAgICAsIGJ1aWx0aW5fdGVzdCAgICAsIE5VTEwpLAorfTsKKworCisvKiBEZWJ1ZyBwcmludG91dHMuCisgKi8KKyNpZiBIVVNIX0RFQlVHCisvKiBwcmV2ZW50IGRpc2FzdGVycyB3aXRoIEcuZGVidWdfaW5kZW50IDwgMCAqLworIyBkZWZpbmUgaW5kZW50KCkgZmRwcmludGYoMiwgIiUqcyIsIChHLmRlYnVnX2luZGVudCAqIDIpICYgMHhmZiwgIiIpCisjIGRlZmluZSBkZWJ1Z19lbnRlcigpIChHLmRlYnVnX2luZGVudCsrKQorIyBkZWZpbmUgZGVidWdfbGVhdmUoKSAoRy5kZWJ1Z19pbmRlbnQtLSkKKyNlbHNlCisjIGRlZmluZSBpbmRlbnQoKSAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgZGVidWdfZW50ZXIoKSAoKHZvaWQpMCkKKyMgZGVmaW5lIGRlYnVnX2xlYXZlKCkgKCh2b2lkKTApCisjZW5kaWYKKworI2lmbmRlZiBkZWJ1Z19wcmludGYKKyMgZGVmaW5lIGRlYnVnX3ByaW50ZiguLi4pIChpbmRlbnQoKSwgZmRwcmludGYoMiwgX19WQV9BUkdTX18pKQorI2VuZGlmCisKKyNpZm5kZWYgZGVidWdfcHJpbnRmX3BhcnNlCisjIGRlZmluZSBkZWJ1Z19wcmludGZfcGFyc2UoLi4uKSAoaW5kZW50KCksIGZkcHJpbnRmKDIsIF9fVkFfQVJHU19fKSkKKyNlbmRpZgorCisjaWZuZGVmIGRlYnVnX3ByaW50Zl9leGVjCisjZGVmaW5lIGRlYnVnX3ByaW50Zl9leGVjKC4uLikgKGluZGVudCgpLCBmZHByaW50ZigyLCBfX1ZBX0FSR1NfXykpCisjZW5kaWYKKworI2lmbmRlZiBkZWJ1Z19wcmludGZfZW52CisjIGRlZmluZSBkZWJ1Z19wcmludGZfZW52KC4uLikgKGluZGVudCgpLCBmZHByaW50ZigyLCBfX1ZBX0FSR1NfXykpCisjZW5kaWYKKworI2lmbmRlZiBkZWJ1Z19wcmludGZfam9icworIyBkZWZpbmUgZGVidWdfcHJpbnRmX2pvYnMoLi4uKSAoaW5kZW50KCksIGZkcHJpbnRmKDIsIF9fVkFfQVJHU19fKSkKKyMgZGVmaW5lIERFQlVHX0pPQlMgMQorI2Vsc2UKKyMgZGVmaW5lIERFQlVHX0pPQlMgMAorI2VuZGlmCisKKyNpZm5kZWYgZGVidWdfcHJpbnRmX2V4cGFuZAorIyBkZWZpbmUgZGVidWdfcHJpbnRmX2V4cGFuZCguLi4pIChpbmRlbnQoKSwgZmRwcmludGYoMiwgX19WQV9BUkdTX18pKQorIyBkZWZpbmUgREVCVUdfRVhQQU5EIDEKKyNlbHNlCisjIGRlZmluZSBERUJVR19FWFBBTkQgMAorI2VuZGlmCisKKyNpZm5kZWYgZGVidWdfcHJpbnRmX3ZhcmV4cAorIyBkZWZpbmUgZGVidWdfcHJpbnRmX3ZhcmV4cCguLi4pIChpbmRlbnQoKSwgZmRwcmludGYoMiwgX19WQV9BUkdTX18pKQorI2VuZGlmCisKKyNpZm5kZWYgZGVidWdfcHJpbnRmX2dsb2IKKyMgZGVmaW5lIGRlYnVnX3ByaW50Zl9nbG9iKC4uLikgKGluZGVudCgpLCBmZHByaW50ZigyLCBfX1ZBX0FSR1NfXykpCisjIGRlZmluZSBERUJVR19HTE9CIDEKKyNlbHNlCisjIGRlZmluZSBERUJVR19HTE9CIDAKKyNlbmRpZgorCisjaWZuZGVmIGRlYnVnX3ByaW50Zl9saXN0CisjIGRlZmluZSBkZWJ1Z19wcmludGZfbGlzdCguLi4pIChpbmRlbnQoKSwgZmRwcmludGYoMiwgX19WQV9BUkdTX18pKQorI2VuZGlmCisKKyNpZm5kZWYgZGVidWdfcHJpbnRmX3N1YnN0CisjIGRlZmluZSBkZWJ1Z19wcmludGZfc3Vic3QoLi4uKSAoaW5kZW50KCksIGZkcHJpbnRmKDIsIF9fVkFfQVJHU19fKSkKKyNlbmRpZgorCisjaWZuZGVmIGRlYnVnX3ByaW50Zl9jbGVhbgorIyBkZWZpbmUgZGVidWdfcHJpbnRmX2NsZWFuKC4uLikgKGluZGVudCgpLCBmZHByaW50ZigyLCBfX1ZBX0FSR1NfXykpCisjIGRlZmluZSBERUJVR19DTEVBTiAxCisjZWxzZQorIyBkZWZpbmUgREVCVUdfQ0xFQU4gMAorI2VuZGlmCisKKyNpZiBERUJVR19FWFBBTkQKK3N0YXRpYyB2b2lkIGRlYnVnX3ByaW50X3N0cmluZ3MoY29uc3QgY2hhciAqcHJlZml4LCBjaGFyICoqdnYpCit7CisJaW5kZW50KCk7CisJZmRwcmludGYoMiwgIiVzOlxuIiwgcHJlZml4KTsKKwl3aGlsZSAoKnZ2KQorCQlmZHByaW50ZigyLCAiICclcydcbiIsICp2disrKTsKK30KKyNlbHNlCisjIGRlZmluZSBkZWJ1Z19wcmludF9zdHJpbmdzKHByZWZpeCwgdnYpICgodm9pZCkwKQorI2VuZGlmCisKKworLyogTGVhayBodW50aW5nLiBVc2UgaHVzaF9sZWFrdG9vbC5zaCBmb3IgcG9zdC1wcm9jZXNzaW5nLgorICovCisjaWYgTEVBS19IVU5USU5HCitzdGF0aWMgdm9pZCAqeHhtYWxsb2MoaW50IGxpbmVubywgc2l6ZV90IHNpemUpCit7CisJdm9pZCAqcHRyID0geG1hbGxvYygoc2l6ZSArIDB4ZmYpICYgfjB4ZmYpOworCWZkcHJpbnRmKDIsICJsaW5lICVkOiBtYWxsb2MgJXBcbiIsIGxpbmVubywgcHRyKTsKKwlyZXR1cm4gcHRyOworfQorc3RhdGljIHZvaWQgKnh4cmVhbGxvYyhpbnQgbGluZW5vLCB2b2lkICpwdHIsIHNpemVfdCBzaXplKQoreworCXB0ciA9IHhyZWFsbG9jKHB0ciwgKHNpemUgKyAweGZmKSAmIH4weGZmKTsKKwlmZHByaW50ZigyLCAibGluZSAlZDogcmVhbGxvYyAlcFxuIiwgbGluZW5vLCBwdHIpOworCXJldHVybiBwdHI7Cit9CitzdGF0aWMgY2hhciAqeHhzdHJkdXAoaW50IGxpbmVubywgY29uc3QgY2hhciAqc3RyKQoreworCWNoYXIgKnB0ciA9IHhzdHJkdXAoc3RyKTsKKwlmZHByaW50ZigyLCAibGluZSAlZDogc3RyZHVwICVwXG4iLCBsaW5lbm8sIHB0cik7CisJcmV0dXJuIHB0cjsKK30KK3N0YXRpYyB2b2lkIHh4ZnJlZSh2b2lkICpwdHIpCit7CisJZmRwcmludGYoMiwgImZyZWUgJXBcbiIsIHB0cik7CisJZnJlZShwdHIpOworfQorIyBkZWZpbmUgeG1hbGxvYyhzKSAgICAgeHhtYWxsb2MoX19MSU5FX18sIHMpCisjIGRlZmluZSB4cmVhbGxvYyhwLCBzKSB4eHJlYWxsb2MoX19MSU5FX18sIHAsIHMpCisjIGRlZmluZSB4c3RyZHVwKHMpICAgICB4eHN0cmR1cChfX0xJTkVfXywgcykKKyMgZGVmaW5lIGZyZWUocCkgICAgICAgIHh4ZnJlZShwKQorI2VuZGlmCisKKworLyogU3ludGF4IGFuZCBydW50aW1lIGVycm9ycy4gVGhleSBhbHdheXMgYWJvcnQgc2NyaXB0cy4KKyAqIEluIGludGVyYWN0aXZlIHVzZSB0aGV5IHVzdWFsbHkgZGlzY2FyZCB1bnBhcnNlZCBhbmQvb3IgdW5leGVjdXRlZCBjb21tYW5kcworICogYW5kIHJldHVybiB0byB0aGUgcHJvbXB0LgorICogSFVTSF9ERUJVRyA+PSAyIHByaW50cyBsaW5lIG51bWJlciBpbiB0aGlzIGZpbGUgd2hlcmUgaXQgd2FzIGRldGVjdGVkLgorICovCisjaWYgSFVTSF9ERUJVRyA8IDIKKyMgZGVmaW5lIGRpZV9pZl9zY3JpcHQobGluZW5vLCAuLi4pICAgICAgICAgICAgIGRpZV9pZl9zY3JpcHQoX19WQV9BUkdTX18pCisjIGRlZmluZSBzeW50YXhfZXJyb3IobGluZW5vLCBtc2cpICAgICAgICAgICAgICBzeW50YXhfZXJyb3IobXNnKQorIyBkZWZpbmUgc3ludGF4X2Vycm9yX2F0KGxpbmVubywgbXNnKSAgICAgICAgICAgc3ludGF4X2Vycm9yX2F0KG1zZykKKyMgZGVmaW5lIHN5bnRheF9lcnJvcl91bnRlcm1fY2gobGluZW5vLCBjaCkgICAgIHN5bnRheF9lcnJvcl91bnRlcm1fY2goY2gpCisjIGRlZmluZSBzeW50YXhfZXJyb3JfdW50ZXJtX3N0cihsaW5lbm8sIHMpICAgICBzeW50YXhfZXJyb3JfdW50ZXJtX3N0cihzKQorIyBkZWZpbmUgc3ludGF4X2Vycm9yX3VuZXhwZWN0ZWRfY2gobGluZW5vLCBjaCkgc3ludGF4X2Vycm9yX3VuZXhwZWN0ZWRfY2goY2gpCisjZW5kaWYKKworc3RhdGljIHZvaWQgZGllX2lmX3NjcmlwdCh1bnNpZ25lZCBsaW5lbm8sIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgcDsKKworI2lmIEhVU0hfREVCVUcgPj0gMgorCWJiX2Vycm9yX21zZygiaHVzaC5jOiV1IiwgbGluZW5vKTsKKyNlbmRpZgorCXZhX3N0YXJ0KHAsIGZtdCk7CisJYmJfdmVycm9yX21zZyhmbXQsIHAsIE5VTEwpOworCXZhX2VuZChwKTsKKwlpZiAoIUdfaW50ZXJhY3RpdmVfZmQpCisJCXhmdW5jX2RpZSgpOworfQorCitzdGF0aWMgdm9pZCBzeW50YXhfZXJyb3IodW5zaWduZWQgbGluZW5vIFVOVVNFRF9QQVJBTSwgY29uc3QgY2hhciAqbXNnKQoreworCWlmIChtc2cpCisJCWJiX2Vycm9yX21zZygic3ludGF4IGVycm9yOiAlcyIsIG1zZyk7CisJZWxzZQorCQliYl9lcnJvcl9tc2coInN5bnRheCBlcnJvciIpOworfQorCitzdGF0aWMgdm9pZCBzeW50YXhfZXJyb3JfYXQodW5zaWduZWQgbGluZW5vIFVOVVNFRF9QQVJBTSwgY29uc3QgY2hhciAqbXNnKQoreworCWJiX2Vycm9yX21zZygic3ludGF4IGVycm9yIGF0ICclcyciLCBtc2cpOworfQorCitzdGF0aWMgdm9pZCBzeW50YXhfZXJyb3JfdW50ZXJtX3N0cih1bnNpZ25lZCBsaW5lbm8gVU5VU0VEX1BBUkFNLCBjb25zdCBjaGFyICpzKQoreworCWJiX2Vycm9yX21zZygic3ludGF4IGVycm9yOiB1bnRlcm1pbmF0ZWQgJXMiLCBzKTsKK30KKworc3RhdGljIHZvaWQgc3ludGF4X2Vycm9yX3VudGVybV9jaCh1bnNpZ25lZCBsaW5lbm8sIGNoYXIgY2gpCit7CisJY2hhciBtc2dbMl0gPSB7IGNoLCAnXDAnIH07CisJc3ludGF4X2Vycm9yX3VudGVybV9zdHIobGluZW5vLCBtc2cpOworfQorCitzdGF0aWMgdm9pZCBzeW50YXhfZXJyb3JfdW5leHBlY3RlZF9jaCh1bnNpZ25lZCBsaW5lbm8gVU5VU0VEX1BBUkFNLCBpbnQgY2gpCit7CisJY2hhciBtc2dbMl07CisJbXNnWzBdID0gY2g7CisJbXNnWzFdID0gJ1wwJzsKKwliYl9lcnJvcl9tc2coInN5bnRheCBlcnJvcjogdW5leHBlY3RlZCAlcyIsIGNoID09IEVPRiA/ICJFT0YiIDogbXNnKTsKK30KKworI2lmIEhVU0hfREVCVUcgPCAyCisjIHVuZGVmIGRpZV9pZl9zY3JpcHQKKyMgdW5kZWYgc3ludGF4X2Vycm9yCisjIHVuZGVmIHN5bnRheF9lcnJvcl9hdAorIyB1bmRlZiBzeW50YXhfZXJyb3JfdW50ZXJtX2NoCisjIHVuZGVmIHN5bnRheF9lcnJvcl91bnRlcm1fc3RyCisjIHVuZGVmIHN5bnRheF9lcnJvcl91bmV4cGVjdGVkX2NoCisjZWxzZQorIyBkZWZpbmUgZGllX2lmX3NjcmlwdCguLi4pICAgICAgICAgICAgIGRpZV9pZl9zY3JpcHQoX19MSU5FX18sIF9fVkFfQVJHU19fKQorIyBkZWZpbmUgc3ludGF4X2Vycm9yKG1zZykgICAgICAgICAgICAgIHN5bnRheF9lcnJvcihfX0xJTkVfXywgbXNnKQorIyBkZWZpbmUgc3ludGF4X2Vycm9yX2F0KG1zZykgICAgICAgICAgIHN5bnRheF9lcnJvcl9hdChfX0xJTkVfXywgbXNnKQorIyBkZWZpbmUgc3ludGF4X2Vycm9yX3VudGVybV9jaChjaCkgICAgIHN5bnRheF9lcnJvcl91bnRlcm1fY2goX19MSU5FX18sIGNoKQorIyBkZWZpbmUgc3ludGF4X2Vycm9yX3VudGVybV9zdHIocykgICAgIHN5bnRheF9lcnJvcl91bnRlcm1fc3RyKF9fTElORV9fLCBzKQorIyBkZWZpbmUgc3ludGF4X2Vycm9yX3VuZXhwZWN0ZWRfY2goY2gpIHN5bnRheF9lcnJvcl91bmV4cGVjdGVkX2NoKF9fTElORV9fLCBjaCkKKyNlbmRpZgorCisKKyNpZiBFTkFCTEVfSFVTSF9JTlRFUkFDVElWRQorc3RhdGljIHZvaWQgY21kZWRpdF91cGRhdGVfcHJvbXB0KHZvaWQpOworI2Vsc2UKKyMgZGVmaW5lIGNtZGVkaXRfdXBkYXRlX3Byb21wdCgpICgodm9pZCkwKQorI2VuZGlmCisKKworLyogVXRpbGl0eSBmdW5jdGlvbnMKKyAqLworLyogUmVwbGFjZSBlYWNoIFx4IHdpdGggeCBpbiBwbGFjZSwgcmV0dXJuIHB0ciBwYXN0IE5VTC4gKi8KK3N0YXRpYyBjaGFyICp1bmJhY2tzbGFzaChjaGFyICpzcmMpCit7CisJY2hhciAqZHN0ID0gc3JjID0gc3RyY2hybnVsKHNyYywgJ1xcJyk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKCpzcmMgPT0gJ1xcJykKKwkJCXNyYysrOworCQlpZiAoKCpkc3QrKyA9ICpzcmMrKykgPT0gJ1wwJykKKwkJCWJyZWFrOworCX0KKwlyZXR1cm4gZHN0OworfQorCitzdGF0aWMgY2hhciAqKmFkZF9zdHJpbmdzX3RvX3N0cmluZ3MoY2hhciAqKnN0cmluZ3MsIGNoYXIgKiphZGQsIGludCBuZWVkX3RvX2R1cCkKK3sKKwlpbnQgaTsKKwl1bnNpZ25lZCBjb3VudDE7CisJdW5zaWduZWQgY291bnQyOworCWNoYXIgKip2OworCisJdiA9IHN0cmluZ3M7CisJY291bnQxID0gMDsKKwlpZiAodikgeworCQl3aGlsZSAoKnYpIHsKKwkJCWNvdW50MSsrOworCQkJdisrOworCQl9CisJfQorCWNvdW50MiA9IDA7CisJdiA9IGFkZDsKKwl3aGlsZSAoKnYpIHsKKwkJY291bnQyKys7CisJCXYrKzsKKwl9CisJdiA9IHhyZWFsbG9jKHN0cmluZ3MsIChjb3VudDEgKyBjb3VudDIgKyAxKSAqIHNpemVvZihjaGFyKikpOworCXZbY291bnQxICsgY291bnQyXSA9IE5VTEw7CisJaSA9IGNvdW50MjsKKwl3aGlsZSAoLS1pID49IDApCisJCXZbY291bnQxICsgaV0gPSAobmVlZF90b19kdXAgPyB4c3RyZHVwKGFkZFtpXSkgOiBhZGRbaV0pOworCXJldHVybiB2OworfQorI2lmIExFQUtfSFVOVElORworc3RhdGljIGNoYXIgKip4eF9hZGRfc3RyaW5nc190b19zdHJpbmdzKGludCBsaW5lbm8sIGNoYXIgKipzdHJpbmdzLCBjaGFyICoqYWRkLCBpbnQgbmVlZF90b19kdXApCit7CisJY2hhciAqKnB0ciA9IGFkZF9zdHJpbmdzX3RvX3N0cmluZ3Moc3RyaW5ncywgYWRkLCBuZWVkX3RvX2R1cCk7CisJZmRwcmludGYoMiwgImxpbmUgJWQ6IGFkZF9zdHJpbmdzX3RvX3N0cmluZ3MgJXBcbiIsIGxpbmVubywgcHRyKTsKKwlyZXR1cm4gcHRyOworfQorI2RlZmluZSBhZGRfc3RyaW5nc190b19zdHJpbmdzKHN0cmluZ3MsIGFkZCwgbmVlZF90b19kdXApIFwKKwl4eF9hZGRfc3RyaW5nc190b19zdHJpbmdzKF9fTElORV9fLCBzdHJpbmdzLCBhZGQsIG5lZWRfdG9fZHVwKQorI2VuZGlmCisKKy8qIE5vdGU6IHRha2VzIG93bmVyc2hpcCBvZiAiYWRkIiBwdHIgKGl0IGlzIG5vdCBzdHJkdXAnZWQpICovCitzdGF0aWMgY2hhciAqKmFkZF9zdHJpbmdfdG9fc3RyaW5ncyhjaGFyICoqc3RyaW5ncywgY2hhciAqYWRkKQoreworCWNoYXIgKnZbMl07CisJdlswXSA9IGFkZDsKKwl2WzFdID0gTlVMTDsKKwlyZXR1cm4gYWRkX3N0cmluZ3NfdG9fc3RyaW5ncyhzdHJpbmdzLCB2LCAvKmR1cDoqLyAwKTsKK30KKyNpZiBMRUFLX0hVTlRJTkcKK3N0YXRpYyBjaGFyICoqeHhfYWRkX3N0cmluZ190b19zdHJpbmdzKGludCBsaW5lbm8sIGNoYXIgKipzdHJpbmdzLCBjaGFyICphZGQpCit7CisJY2hhciAqKnB0ciA9IGFkZF9zdHJpbmdfdG9fc3RyaW5ncyhzdHJpbmdzLCBhZGQpOworCWZkcHJpbnRmKDIsICJsaW5lICVkOiBhZGRfc3RyaW5nX3RvX3N0cmluZ3MgJXBcbiIsIGxpbmVubywgcHRyKTsKKwlyZXR1cm4gcHRyOworfQorI2RlZmluZSBhZGRfc3RyaW5nX3RvX3N0cmluZ3Moc3RyaW5ncywgYWRkKSBcCisJeHhfYWRkX3N0cmluZ190b19zdHJpbmdzKF9fTElORV9fLCBzdHJpbmdzLCBhZGQpCisjZW5kaWYKKworc3RhdGljIHZvaWQgZnJlZV9zdHJpbmdzKGNoYXIgKipzdHJpbmdzKQoreworCWNoYXIgKip2OworCisJaWYgKCFzdHJpbmdzKQorCQlyZXR1cm47CisJdiA9IHN0cmluZ3M7CisJd2hpbGUgKCp2KSB7CisJCWZyZWUoKnYpOworCQl2Kys7CisJfQorCWZyZWUoc3RyaW5ncyk7Cit9CisKKworLyogSGVscGVycyBmb3Igc2V0dGluZyBuZXcgJG4gYW5kIHJlc3RvcmluZyB0aGVtIGJhY2sKKyAqLwordHlwZWRlZiBzdHJ1Y3Qgc2F2ZV9hcmdfdCB7CisJY2hhciAqc3ZfYXJndjA7CisJY2hhciAqKnN2X2dfYXJndjsKKwlpbnQgc3ZfZ19hcmdjOworCXNtYWxsaW50IHN2X2dfbWFsbG9jZWQ7Cit9IHNhdmVfYXJnX3Q7CisKK3N0YXRpYyB2b2lkIHNhdmVfYW5kX3JlcGxhY2VfR19hcmdzKHNhdmVfYXJnX3QgKnN2LCBjaGFyICoqYXJndikKK3sKKwlpbnQgbjsKKworCXN2LT5zdl9hcmd2MCA9IGFyZ3ZbMF07CisJc3YtPnN2X2dfYXJndiA9IEcuZ2xvYmFsX2FyZ3Y7CisJc3YtPnN2X2dfYXJnYyA9IEcuZ2xvYmFsX2FyZ2M7CisJc3YtPnN2X2dfbWFsbG9jZWQgPSBHLmdsb2JhbF9hcmdzX21hbGxvY2VkOworCisJYXJndlswXSA9IEcuZ2xvYmFsX2FyZ3ZbMF07IC8qIHJldGFpbiAkMCAqLworCUcuZ2xvYmFsX2FyZ3YgPSBhcmd2OworCUcuZ2xvYmFsX2FyZ3NfbWFsbG9jZWQgPSAwOworCisJbiA9IDE7CisJd2hpbGUgKCorK2FyZ3YpCisJCW4rKzsKKwlHLmdsb2JhbF9hcmdjID0gbjsKK30KKworc3RhdGljIHZvaWQgcmVzdG9yZV9HX2FyZ3Moc2F2ZV9hcmdfdCAqc3YsIGNoYXIgKiphcmd2KQoreworCWNoYXIgKipwcDsKKworCWlmIChHLmdsb2JhbF9hcmdzX21hbGxvY2VkKSB7CisJCS8qIHNvbWVvbmUgcmFuICJzZXQgLS0gYXJnMSBhcmcyIC4uLiIsIHVuZG8gKi8KKwkJcHAgPSBHLmdsb2JhbF9hcmd2OworCQl3aGlsZSAoKisrcHApIC8qIG5vdGU6IGRvZXMgbm90IGZyZWUgJDAgKi8KKwkJCWZyZWUoKnBwKTsKKwkJZnJlZShHLmdsb2JhbF9hcmd2KTsKKwl9CisJYXJndlswXSA9IHN2LT5zdl9hcmd2MDsKKwlHLmdsb2JhbF9hcmd2ID0gc3YtPnN2X2dfYXJndjsKKwlHLmdsb2JhbF9hcmdjID0gc3YtPnN2X2dfYXJnYzsKKwlHLmdsb2JhbF9hcmdzX21hbGxvY2VkID0gc3YtPnN2X2dfbWFsbG9jZWQ7Cit9CisKKworLyogQmFzaWMgdGhlb3J5IG9mIHNpZ25hbCBoYW5kbGluZyBpbiBzaGVsbAorICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICogVGhpcyBkb2VzIG5vdCBkZXNjcmliZSB3aGF0IGh1c2ggZG9lcywgcmF0aGVyLCBpdCBpcyBjdXJyZW50IHVuZGVyc3RhbmRpbmcKKyAqIHdoYXQgaXQgX3Nob3VsZF8gZG8uIElmIGl0IGRvZXNuJ3QsIGl0J3MgYSBidWcuCisgKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9WM19jaGFwMDIuaHRtbCN0cmFwCisgKgorICogU2lnbmFscyBhcmUgaGFuZGxlZCBvbmx5IGFmdGVyIGVhY2ggcGlwZSAoImNtZCB8IGNtZCB8IGNtZCIgdGhpbmcpCisgKiBpcyBmaW5pc2hlZCBvciBiYWNrZ3JvdW5kZWQuIEl0IGlzIHRoZSBzYW1lIGluIGludGVyYWN0aXZlIGFuZAorICogbm9uLWludGVyYWN0aXZlIHNoZWxscywgYW5kIGlzIHRoZSBzYW1lIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlcgorICogYSB1c2VyIHRyYXAgaGFuZGxlciBpcyBpbnN0YWxsZWQgb3IgYSBzaGVsbCBzcGVjaWFsIG9uZSBpcyBpbiBlZmZlY3QuCisgKiBeQyBvciBeWiBmcm9tIGtleWJvYXJkIHNlZW1zIHRvIGV4ZWN1dGUgImF0IG9uY2UiIGJlY2F1c2UgaXQgdXN1YWxseQorICogYmFja2dyb3VuZHMgKGkuZS4gc3RvcHMpIG9yIGtpbGxzIGFsbCBtZW1iZXJzIG9mIGN1cnJlbnRseSBydW5uaW5nCisgKiBwaXBlLgorICoKKyAqIFdhaXQgYnVpbHRpbiBpcyBpbnRlcnJ1cHRpYmxlIGJ5IHNpZ25hbHMgZm9yIHdoaWNoIHVzZXIgdHJhcCBpcyBzZXQKKyAqIG9yIGJ5IFNJR0lOVCBpbiBpbnRlcmFjdGl2ZSBzaGVsbC4KKyAqCisgKiBUcmFwIGhhbmRsZXJzIHdpbGwgZXhlY3V0ZSBldmVuIHdpdGhpbiB0cmFwIGhhbmRsZXJzLiAocmlnaHQ/KQorICoKKyAqIFVzZXIgdHJhcCBoYW5kbGVycyBhcmUgZm9yZ290dGVuIHdoZW4gc3Vic2hlbGwgKCIoY21kKSIpIGlzIGVudGVyZWQsCisgKiBleGNlcHQgZm9yIGhhbmRsZXJzIHNldCB0byAnJyAoZW1wdHkgc3RyaW5nKS4KKyAqCisgKiBJZiBqb2IgY29udHJvbCBpcyBvZmYsIGJhY2tncm91bmRlZCBjb21tYW5kcyAoImNtZCAmIikKKyAqIGhhdmUgU0lHSU5ULCBTSUdRVUlUIHNldCB0byBTSUdfSUdOLgorICoKKyAqIENvbW1hbmRzIHdoaWNoIGFyZSBydW4gaW4gY29tbWFuZCBzdWJzdGl0dXRpb24gKCJgY21kYCIpCisgKiBoYXZlIFNJR1RUSU4sIFNJR1RUT1UsIFNJR1RTVFAgc2V0IHRvIFNJR19JR04uCisgKgorICogT3JkaW5hcnkgY29tbWFuZHMgaGF2ZSBzaWduYWxzIHNldCB0byBTSUdfSUdOL0RGTCBhcyBpbmhlcml0ZWQKKyAqIGJ5IHRoZSBzaGVsbCBmcm9tIGl0cyBwYXJlbnQuCisgKgorICogU2lnbmFscyB3aGljaCBkaWZmZXIgZnJvbSBTSUdfREZMIGFjdGlvbgorICogKG5vdGU6IGNoaWxkIChpLmUuLCBbdl1mb3JrZWQpIHNoZWxsIGlzIG5vdCBhbiBpbnRlcmFjdGl2ZSBzaGVsbCk6CisgKgorICogU0lHUVVJVDogaWdub3JlCisgKiBTSUdURVJNIChpbnRlcmFjdGl2ZSk6IGlnbm9yZQorICogU0lHSFVQIChpbnRlcmFjdGl2ZSk6CisgKiAgICBzZW5kIFNJR0NPTlQgdG8gc3RvcHBlZCBqb2JzLCBzZW5kIFNJR0hVUCB0byBhbGwgam9icyBhbmQgZXhpdAorICogU0lHVFRJTiwgU0lHVFRPVSwgU0lHVFNUUCAoaWYgam9iIGNvbnRyb2wgaXMgb24pOiBpZ25vcmUKKyAqICAgIE5vdGUgdGhhdCBeWiBpcyBoYW5kbGVkIG5vdCBieSB0cmFwcGluZyBTSUdUU1RQLCBidXQgYnkgc2VlaW5nCisgKiAgICB0aGF0IGFsbCBwaXBlIG1lbWJlcnMgYXJlIHN0b3BwZWQuIFRyeSB0aGlzIGluIGJhc2g6CisgKiAgICB3aGlsZSA6OyBkbyA6OyBkb25lIC0gXlogZG9lcyBub3QgYmFja2dyb3VuZCBpdAorICogICAgKHdoaWxlIDo7IGRvIDo7IGRvbmUpIC0gXlogYmFja2dyb3VuZHMgaXQKKyAqIFNJR0lOVCAoaW50ZXJhY3RpdmUpOiB3YWl0IGZvciBsYXN0IHBpcGUsIGlnbm9yZSB0aGUgcmVzdAorICogICAgb2YgdGhlIGNvbW1hbmQgbGluZSwgc2hvdyBwcm9tcHQuIE5COiBeQyBkb2VzIG5vdCBzZW5kIFNJR0lOVAorICogICAgdG8gaW50ZXJhY3RpdmUgc2hlbGwgd2hpbGUgc2hlbGwgaXMgd2FpdGluZyBmb3IgYSBwaXBlLAorICogICAgc2luY2Ugc2hlbGwgaXMgYmcnZWQgKGlzIG5vdCBpbiBmb3JlZ3JvdW5kIHByb2Nlc3MgZ3JvdXApLgorICogICAgRXhhbXBsZSAxOiB0aGlzIHdhaXRzIDUgc2VjLCBidXQgZG9lcyBub3QgZXhlY3V0ZSBsczoKKyAqICAgICJlY2hvICQkOyBzbGVlcCA1OyBscyAtbCIgKyAia2lsbCAtSU5UIDxwaWQ+IgorICogICAgRXhhbXBsZSAyOiB0aGlzIGRvZXMgbm90IHdhaXQgYW5kIGRvZXMgbm90IGV4ZWN1dGUgbHM6CisgKiAgICAiZWNobyAkJDsgc2xlZXAgNSAmIHdhaXQ7IGxzIC1sIiArICJraWxsIC1JTlQgPHBpZD4iCisgKiAgICBFeGFtcGxlIDM6IHRoaXMgZG9lcyBub3Qgd2FpdCA1IHNlYywgYnV0IGV4ZWN1dGVzIGxzOgorICogICAgInNsZWVwIDU7IGxzIC1sIiArIHByZXNzIF5DCisgKiAgICBFeGFtcGxlIDQ6IHRoaXMgZG9lcyBub3Qgd2FpdCBhbmQgZG9lcyBub3QgZXhlY3V0ZSBsczoKKyAqICAgICJzbGVlcCA1ICYgd2FpdDsgbHMgLWwiICsgcHJlc3MgXkMKKyAqCisgKiAoV2hhdCBoYXBwZW5zIHRvIHNpZ25hbHMgd2hpY2ggYXJlIElHTiBvbiBzaGVsbCBzdGFydD8pCisgKiAoV2hhdCBoYXBwZW5zIHdpdGggc2lnbmFsIG1hc2sgb24gc2hlbGwgc3RhcnQ/KQorICoKKyAqIE9sZCBpbXBsZW1lbnRhdGlvbgorICogPT09PT09PT09PT09PT09PT09CisgKiBXZSB1c2UgaW4ta2VybmVsIHBlbmRpbmcgc2lnbmFsIG1hc2sgdG8gZGV0ZXJtaW5lIHdoaWNoIHNpZ25hbHMgd2VyZSBzZW50LgorICogV2UgYmxvY2sgYWxsIHNpZ25hbHMgd2hpY2ggd2UgZG9uJ3Qgd2FudCB0byB0YWtlIGFjdGlvbiBpbW1lZGlhdGVseSwKKyAqIGkuZS4gd2UgYmxvY2sgYWxsIHNpZ25hbHMgd2hpY2ggbmVlZCB0byBoYXZlIHNwZWNpYWwgaGFuZGxpbmcgYXMgZGVzY3JpYmVkCisgKiBhYm92ZSwgYW5kIGFsbCBzaWduYWxzIHdoaWNoIGhhdmUgdHJhcHMgc2V0LgorICogQWZ0ZXIgZWFjaCBwaXBlIGV4ZWN1dGlvbiwgd2UgZXh0cmFjdCBhbnkgcGVuZGluZyBzaWduYWxzIHZpYSBzaWd0aW1lZHdhaXQoKQorICogYW5kIGFjdCBvbiB0aGVtLgorICoKKyAqIHVuc2lnbmVkIHNwZWNpYWxfc2lnX21hc2s6IGEgbWFzayBvZiBzdWNoICJzcGVjaWFsIiBzaWduYWxzCisgKiBzaWdzZXRfdCBibG9ja2VkX3NldDogIGN1cnJlbnQgYmxvY2tlZCBzaWduYWwgc2V0CisgKgorICogInRyYXAgLSBTSUd4eHgiOgorICogICAgY2xlYXIgYml0IGluIGJsb2NrZWRfc2V0IHVubGVzcyBpdCBpcyBhbHNvIGluIHNwZWNpYWxfc2lnX21hc2sKKyAqICJ0cmFwICdjbWQnIFNJR3h4eCI6CisgKiAgICBzZXQgYml0IGluIGJsb2NrZWRfc2V0IChldmVuIGlmICdjbWQnIGlzICcnKQorICogYWZ0ZXIgW3ZdZm9yaywgaWYgd2UgcGxhbiB0byBiZSBhIHNoZWxsOgorICogICAgdW5ibG9jayBzaWduYWxzIHdpdGggc3BlY2lhbCBpbnRlcmFjdGl2ZSBoYW5kbGluZworICogICAgKGNoaWxkIHNoZWxsIGlzIG5vdCBpbnRlcmFjdGl2ZSksCisgKiAgICB1bnNldCBhbGwgdHJhcHMgZXhjZXB0ICcnIChub3RlOiByZWdhcmRsZXNzIG9mIGNoaWxkIHNoZWxsJ3MgdHlwZSAtIHt9LCAoKSwgZXRjKQorICogYWZ0ZXIgW3ZdZm9yaywgaWYgd2UgcGxhbiB0byBleGVjOgorICogICAgUE9TSVggc2F5cyBmb3JrIGNsZWFycyBwZW5kaW5nIHNpZ25hbCBtYXNrIGluIGNoaWxkIC0gbm8gbmVlZCB0byBjbGVhciBpdC4KKyAqICAgIFJlc3RvcmUgYmxvY2tlZCBzaWduYWwgc2V0IHRvIG9uZSBpbmhlcml0ZWQgYnkgc2hlbGwganVzdCBwcmlvciB0byBleGVjLgorICoKKyAqIE5vdGU6IGFzIGEgcmVzdWx0LCB3ZSBkbyBub3QgdXNlIHNpZ25hbCBoYW5kbGVycyBtdWNoLiBUaGUgb25seSB1c2VzCisgKiBhcmUgdG8gY291bnQgU0lHQ0hMRHMKKyAqIGFuZCB0byByZXN0b3JlIHR0eSBwZ3JwIG9uIHNpZ25hbC1pbmR1Y2VkIGV4aXQuCisgKgorICogTm90ZSAyIChjb21wYXQpOgorICogU3RhbmRhcmQgc2F5cyAiV2hlbiBhIHN1YnNoZWxsIGlzIGVudGVyZWQsIHRyYXBzIHRoYXQgYXJlIG5vdCBiZWluZyBpZ25vcmVkCisgKiBhcmUgc2V0IHRvIHRoZSBkZWZhdWx0IGFjdGlvbnMiLiBiYXNoIGludGVycHJldHMgaXQgc28gdGhhdCB0cmFwcyB3aGljaAorICogYXJlIHNldCB0byAnJyAoaWdub3JlKSBhcmUgTk9UIHJlc2V0IHRvIGRlZmF1bHRzLiBXZSBkbyB0aGUgc2FtZS4KKyAqCisgKiBQcm9ibGVtOiB0aGUgYWJvdmUgYXBwcm9hY2ggbWFrZXMgaXQgdW53aWVsZHkgdG8gY2F0Y2ggc2lnbmFscyB3aGlsZQorICogd2UgYXJlIGluIHJlYWQgYnVpbHRpbiwgb3Igd2hpbGUgd2UgcmVhZCBjb21tYW5kcyBmcm9tIHN0ZGluOgorICogbWFza2VkIHNpZ25hbHMgYXJlIG5vdCB2aXNpYmxlIQorICoKKyAqIE5ldyBpbXBsZW1lbnRhdGlvbgorICogPT09PT09PT09PT09PT09PT09CisgKiBXZSByZWNvcmQgZWFjaCBzaWduYWwgd2UgYXJlIGludGVyZXN0ZWQgaW4gYnkgaW5zdGFsbGluZyBzaWduYWwgaGFuZGxlcgorICogZm9yIHRoZW0gLSBhIGJpdCBsaWtlIGVtdWxhdGluZyBrZXJuZWwgcGVuZGluZyBzaWduYWwgbWFzayBpbiB1c2Vyc3BhY2UuCisgKiBXZSBhcmUgaW50ZXJlc3RlZCBpbjogc2lnbmFscyB3aGljaCBuZWVkIHRvIGhhdmUgc3BlY2lhbCBoYW5kbGluZworICogYXMgZGVzY3JpYmVkIGFib3ZlLCBhbmQgYWxsIHNpZ25hbHMgd2hpY2ggaGF2ZSB0cmFwcyBzZXQuCisgKiBTaWduYWxzIGFyZSByZWNvcmRlZCBpbiBwZW5kaW5nX3NldC4KKyAqIEFmdGVyIGVhY2ggcGlwZSBleGVjdXRpb24sIHdlIGV4dHJhY3QgYW55IHBlbmRpbmcgc2lnbmFscworICogYW5kIGFjdCBvbiB0aGVtLgorICoKKyAqIHVuc2lnbmVkIHNwZWNpYWxfc2lnX21hc2s6IGEgbWFzayBvZiBzaGVsbC1zcGVjaWFsIHNpZ25hbHMuCisgKiB1bnNpZ25lZCBmYXRhbF9zaWdfbWFzazogYSBtYXNrIG9mIHNpZ25hbHMgb24gd2hpY2ggd2UgcmVzdG9yZSB0dHkgcGdycC4KKyAqIGNoYXIgKnRyYXBzW3NpZ10gaWYgdHJhcCBmb3Igc2lnIGlzIHNldCAoZXZlbiBpZiBpdCdzICcnKS4KKyAqIHNpZ3NldF90IHBlbmRpbmdfc2V0OiBzZXQgb2Ygc2lncyB3ZSByZWNlaXZlZC4KKyAqCisgKiAidHJhcCAtIFNJR3h4eCI6CisgKiAgICBpZiBzaWcgaXMgaW4gc3BlY2lhbF9zaWdfbWFzaywgc2V0IGhhbmRsZXIgYmFjayB0bzoKKyAqICAgICAgICByZWNvcmRfcGVuZGluZ19zaWdubywgb3IgdG8gSUdOIGlmIGl0J3MgYSB0dHkgc3RvcCBzaWduYWwKKyAqICAgIGlmIHNpZyBpcyBpbiBmYXRhbF9zaWdfbWFzaywgc2V0IGhhbmRsZXIgYmFjayB0byBzaWdleGl0LgorICogICAgZWxzZTogc2V0IGhhbmRsZXIgYmFjayB0byBTSUdfREZMCisgKiAidHJhcCAnY21kJyBTSUd4eHgiOgorICogICAgc2V0IGhhbmRsZXIgdG8gcmVjb3JkX3BlbmRpbmdfc2lnbm8uCisgKiAidHJhcCAnJyBTSUd4eHgiOgorICogICAgc2V0IGhhbmRsZXIgdG8gU0lHX0lHTi4KKyAqIGFmdGVyIFt2XWZvcmssIGlmIHdlIHBsYW4gdG8gYmUgYSBzaGVsbDoKKyAqICAgIHNldCBzaWduYWxzIHdpdGggc3BlY2lhbCBpbnRlcmFjdGl2ZSBoYW5kbGluZyB0byBTSUdfREZMCisgKiAgICAoYmVjYXVzZSBjaGlsZCBzaGVsbCBpcyBub3QgaW50ZXJhY3RpdmUpLAorICogICAgdW5zZXQgYWxsIHRyYXBzIGV4Y2VwdCAnJyAobm90ZTogcmVnYXJkbGVzcyBvZiBjaGlsZCBzaGVsbCdzIHR5cGUgLSB7fSwgKCksIGV0YykKKyAqIGFmdGVyIFt2XWZvcmssIGlmIHdlIHBsYW4gdG8gZXhlYzoKKyAqICAgIFBPU0lYIHNheXMgZm9yayBjbGVhcnMgcGVuZGluZyBzaWduYWwgbWFzayBpbiBjaGlsZCAtIG5vIG5lZWQgdG8gY2xlYXIgaXQuCisgKgorICogVG8gbWFrZSB3YWl0IGJ1aWx0aW4gaW50ZXJydXB0aWJsZSwgd2UgaGFuZGxlIFNJR0NITEQgYXMgc3BlY2lhbCBzaWduYWwsCisgKiBvdGhlcndpc2UgKGlmIHdlIGxlYXZlIGl0IFNJR19ERkwpIHNpZ3N1c3BlbmQgaW4gd2FpdCBidWlsdGluIHdpbGwgbm90IHdha2UgdXAgb24gaXQuCisgKgorICogTm90ZSAoY29tcGF0KToKKyAqIFN0YW5kYXJkIHNheXMgIldoZW4gYSBzdWJzaGVsbCBpcyBlbnRlcmVkLCB0cmFwcyB0aGF0IGFyZSBub3QgYmVpbmcgaWdub3JlZAorICogYXJlIHNldCB0byB0aGUgZGVmYXVsdCBhY3Rpb25zIi4gYmFzaCBpbnRlcnByZXRzIGl0IHNvIHRoYXQgdHJhcHMgd2hpY2gKKyAqIGFyZSBzZXQgdG8gJycgKGlnbm9yZSkgYXJlIE5PVCByZXNldCB0byBkZWZhdWx0cy4gV2UgZG8gdGhlIHNhbWUuCisgKi8KK2VudW0geworCVNQRUNJQUxfSU5URVJBQ1RJVkVfU0lHUyA9IDAKKwkJfCAoMSA8PCBTSUdURVJNKQorCQl8ICgxIDw8IFNJR0lOVCkKKwkJfCAoMSA8PCBTSUdIVVApCisJCSwKKwlTUEVDSUFMX0pPQlNUT1BfU0lHUyA9IDAKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwkJfCAoMSA8PCBTSUdUVElOKQorCQl8ICgxIDw8IFNJR1RUT1UpCisJCXwgKDEgPDwgU0lHVFNUUCkKKyNlbmRpZgorCQksCit9OworCitzdGF0aWMgdm9pZCByZWNvcmRfcGVuZGluZ19zaWdubyhpbnQgc2lnKQoreworCXNpZ2FkZHNldCgmRy5wZW5kaW5nX3NldCwgc2lnKTsKKyNpZiBFTkFCTEVfSFVTSF9GQVNUCisJaWYgKHNpZyA9PSBTSUdDSExEKSB7CisJCUcuY291bnRfU0lHQ0hMRCsrOworLy9iYl9lcnJvcl9tc2coIlslZF0gU0lHQ0hMRF9oYW5kbGVyOiBHLmNvdW50X1NJR0NITEQ6JWQgRy5oYW5kbGVkX1NJR0NITEQ6JWQiLCBnZXRwaWQoKSwgRy5jb3VudF9TSUdDSExELCBHLmhhbmRsZWRfU0lHQ0hMRCk7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyBzaWdoYW5kbGVyX3QgaW5zdGFsbF9zaWdoYW5kbGVyKGludCBzaWcsIHNpZ2hhbmRsZXJfdCBoYW5kbGVyKQoreworCXN0cnVjdCBzaWdhY3Rpb24gb2xkX3NhOworCisJLyogV2UgY291bGQgdXNlIHNpZ25hbCgpIHRvIGluc3RhbGwgaGFuZGxlcnMuLi4gYWxtb3N0OgorCSAqIGV4Y2VwdCB0aGF0IHdlIG5lZWQgdG8gbWFzayBBTEwgc2lnbmFscyB3aGlsZSBoYW5kbGVycyBydW4uCisJICogSSBzYXcgc2lnbmFsIG5lc3RpbmcgaW4gc3RyYWNlLCByYWNlIHdpbmRvdyBpc24ndCBzbWFsbC4KKwkgKiBTQV9SRVNUQVJUIGlzIGFsc28gbmVlZGVkLCBidXQgaW4gTGludXgsIHNpZ25hbCgpCisJICogc2V0cyBTQV9SRVNUQVJUIHRvby4KKwkgKi8KKwkvKiBtZW1zZXQoJkcuc2EsIDAsIHNpemVvZihHLnNhKSk7IC0gYWxyZWFkeSBkb25lICovCisJLyogc2lnZmlsbHNldCgmRy5zYS5zYV9tYXNrKTsgICAgICAtIGFscmVhZHkgZG9uZSAqLworCS8qIEcuc2Euc2FfZmxhZ3MgPSBTQV9SRVNUQVJUOyAgICAgLSBhbHJlYWR5IGRvbmUgKi8KKwlHLnNhLnNhX2hhbmRsZXIgPSBoYW5kbGVyOworCXNpZ2FjdGlvbihzaWcsICZHLnNhLCAmb2xkX3NhKTsKKwlyZXR1cm4gb2xkX3NhLnNhX2hhbmRsZXI7Cit9CisKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKworc3RhdGljIHZvaWQgeGZ1bmNfaGFzX2RpZWQodm9pZCk7CisvKiBBZnRlciBbdl1mb3JrLCBpbiBjaGlsZDogZG8gbm90IHJlc3RvcmUgdHR5IHBncnAgb24geGZ1bmMgZGVhdGggKi8KKyMgZGVmaW5lIGRpc2FibGVfcmVzdG9yZV90dHlfcGdycF9vbl9leGl0KCkgKGRpZV9mdW5jID0gTlVMTCkKKy8qIEFmdGVyIFt2XWZvcmssIGluIHBhcmVudDogcmVzdG9yZSB0dHkgcGdycCBvbiB4ZnVuYyBkZWF0aCAqLworIyBkZWZpbmUgZW5hYmxlX3Jlc3RvcmVfdHR5X3BncnBfb25fZXhpdCgpICAoZGllX2Z1bmMgPSB4ZnVuY19oYXNfZGllZCkKKworLyogUmVzdG9yZXMgdHR5IGZvcmVncm91bmQgcHJvY2VzcyBncm91cCwgYW5kIGV4aXRzLgorICogTWF5IGJlIGNhbGxlZCBhcyBzaWduYWwgaGFuZGxlciBmb3IgZmF0YWwgc2lnbmFsCisgKiAod2lsbCByZXNlbmQgc2lnbmFsIHRvIGl0c2VsZiwgcHJvZHVjaW5nIGNvcnJlY3QgZXhpdCBzdGF0ZSkKKyAqIG9yIGNhbGxlZCBkaXJlY3RseSB3aXRoIC1FWElUQ09ERS4KKyAqIFdlIGFsc28gY2FsbCBpdCBpZiB4ZnVuYyBpcyBleGl0aW5nLiAqLworc3RhdGljIHZvaWQgc2lnZXhpdChpbnQgc2lnKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIHNpZ2V4aXQoaW50IHNpZykKK3sKKwkvKiBDYXJlZnVsOiB3ZSBjYW4gZW5kIHVwIGhlcmUgYWZ0ZXIgW3ZdZm9yay4gRG8gbm90IHJlc3RvcmUKKwkgKiB0dHkgcGdycCB0aGVuLCBvbmx5IHRvcC1sZXZlbCBzaGVsbCBwcm9jZXNzIGRvZXMgdGhhdCAqLworCWlmIChHX3NhdmVkX3R0eV9wZ3JwICYmIGdldHBpZCgpID09IEcucm9vdF9waWQpIHsKKwkJLyogRGlzYWJsZSBhbGwgc2lnbmFsczogam9iIGNvbnRyb2wsIFNJR1BJUEUsIGV0Yy4KKwkJICogTW9zdGx5IHBhcmFub2lkIG1lYXN1cmUsIHRvIHByZXZlbnQgaW5maW5pdGUgU0lHVFRPVS4KKwkJICovCisJCXNpZ3Byb2NtYXNrX2FsbHNpZ3MoU0lHX0JMT0NLKTsKKwkJdGNzZXRwZ3JwKEdfaW50ZXJhY3RpdmVfZmQsIEdfc2F2ZWRfdHR5X3BncnApOworCX0KKworCS8qIE5vdCBhIHNpZ25hbCwganVzdCBleGl0ICovCisJaWYgKHNpZyA8PSAwKQorCQlfZXhpdCgtIHNpZyk7CisKKwlraWxsX215c2VsZl93aXRoX3NpZyhzaWcpOyAvKiBkb2VzIG5vdCByZXR1cm4gKi8KK30KKyNlbHNlCisKKyMgZGVmaW5lIGRpc2FibGVfcmVzdG9yZV90dHlfcGdycF9vbl9leGl0KCkgKCh2b2lkKTApCisjIGRlZmluZSBlbmFibGVfcmVzdG9yZV90dHlfcGdycF9vbl9leGl0KCkgICgodm9pZCkwKQorCisjZW5kaWYKKworc3RhdGljIHNpZ2hhbmRsZXJfdCBwaWNrX3NpZ2hhbmRsZXIodW5zaWduZWQgc2lnKQoreworCXNpZ2hhbmRsZXJfdCBoYW5kbGVyID0gU0lHX0RGTDsKKwlpZiAoc2lnIDwgc2l6ZW9mKHVuc2lnbmVkKSo4KSB7CisJCXVuc2lnbmVkIHNpZ21hc2sgPSAoMSA8PCBzaWcpOworCisjaWYgRU5BQkxFX0hVU0hfSk9CCisJCS8qIGlzIHNpZyBmYXRhbD8gKi8KKwkJaWYgKEdfZmF0YWxfc2lnX21hc2sgJiBzaWdtYXNrKQorCQkJaGFuZGxlciA9IHNpZ2V4aXQ7CisJCWVsc2UKKyNlbmRpZgorCQkvKiBzaWcgaGFzIHNwZWNpYWwgaGFuZGxpbmc/ICovCisJCWlmIChHLnNwZWNpYWxfc2lnX21hc2sgJiBzaWdtYXNrKSB7CisJCQloYW5kbGVyID0gcmVjb3JkX3BlbmRpbmdfc2lnbm87CisJCQkvKiBUVElOL1RUT1UvVFNUUCBjYW4ndCBiZSBzZXQgdG8gcmVjb3JkX3BlbmRpbmdfc2lnbm8KKwkJCSAqIGluIG9yZGVyIHRvIGlnbm9yZSB0aGVtOiB0aGV5IHdpbGwgYmUgcmFpc2VkCisJCQkgKiBpbiBhbiBlbmRsZXNzIGxvb3Agd2hlbiB3ZSB0cnkgdG8gZG8gc29tZQorCQkJICogdGVybWluYWwgaW9jdGxzISBXZSBkbyBoYXZlIHRvIF9pZ25vcmVfIHRoZXNlLgorCQkJICovCisJCQlpZiAoU1BFQ0lBTF9KT0JTVE9QX1NJR1MgJiBzaWdtYXNrKQorCQkJCWhhbmRsZXIgPSBTSUdfSUdOOworCQl9CisJfQorCXJldHVybiBoYW5kbGVyOworfQorCisvKiBSZXN0b3JlcyB0dHkgZm9yZWdyb3VuZCBwcm9jZXNzIGdyb3VwLCBhbmQgZXhpdHMuICovCitzdGF0aWMgdm9pZCBodXNoX2V4aXQoaW50IGV4aXRjb2RlKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGh1c2hfZXhpdChpbnQgZXhpdGNvZGUpCit7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElOR19TQVZFX09OX0VYSVQKKwlzYXZlX2hpc3RvcnkoRy5saW5lX2lucHV0X3N0YXRlKTsKKyNlbmRpZgorCisJZmZsdXNoX2FsbCgpOworCWlmIChHLmV4aXRpbmcgPD0gMCAmJiBHLnRyYXBzICYmIEcudHJhcHNbMF0gJiYgRy50cmFwc1swXVswXSkgeworCQljaGFyICphcmd2WzNdOworCQkvKiBhcmd2WzBdIGlzIHVudXNlZCAqLworCQlhcmd2WzFdID0gRy50cmFwc1swXTsKKwkJYXJndlsyXSA9IE5VTEw7CisJCUcuZXhpdGluZyA9IDE7IC8qIHByZXZlbnQgRVhJVCB0cmFwIHJlY3Vyc2lvbiAqLworCQkvKiBOb3RlOiBHLnRyYXBzWzBdIGlzIG5vdCBjbGVhcmVkIQorCQkgKiAidHJhcCIgd2lsbCBzdGlsbCBzaG93IGl0LCBpZiBleGVjdXRlZAorCQkgKiBpbiB0aGUgaGFuZGxlciAqLworCQlidWlsdGluX2V2YWwoYXJndik7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVAKKwl7CisJCXN0cnVjdCB2YXJpYWJsZSAqY3VyX3ZhcjsKKwkJaWYgKEcuY3dkICE9IGJiX21zZ191bmtub3duKQorCQkJZnJlZSgoY2hhciopRy5jd2QpOworCQljdXJfdmFyID0gRy50b3BfdmFyOworCQl3aGlsZSAoY3VyX3ZhcikgeworCQkJc3RydWN0IHZhcmlhYmxlICp0bXAgPSBjdXJfdmFyOworCQkJaWYgKCFjdXJfdmFyLT5tYXhfbGVuKQorCQkJCWZyZWUoY3VyX3Zhci0+dmFyc3RyKTsKKwkJCWN1cl92YXIgPSBjdXJfdmFyLT5uZXh0OworCQkJZnJlZSh0bXApOworCQl9CisJfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwlmZmx1c2hfYWxsKCk7CisJc2lnZXhpdCgtIChleGl0Y29kZSAmIDB4ZmYpKTsKKyNlbHNlCisJZXhpdChleGl0Y29kZSk7CisjZW5kaWYKK30KKworc3RhdGljIHZvaWQgeGZ1bmNfaGFzX2RpZWQodm9pZCkgTk9SRVRVUk47CitzdGF0aWMgdm9pZCB4ZnVuY19oYXNfZGllZCh2b2lkKQoreworCS8qIHhmdW5jIGhhcyBmYWlsZWQhIGRpZSBkaWUgZGllICovCisJLyogbm8gRVhJVCB0cmFwcywgdGhpcyBpcyBhbiBlc2NhcGUgaGF0Y2ghICovCisJRy5leGl0aW5nID0gMTsKKwlodXNoX2V4aXQoeGZ1bmNfZXJyb3JfcmV0dmFsKTsKK30KKworCisvL1RPRE86IHJldHVybiBhIG1hc2sgb2YgQUxMIGhhbmRsZWQgc2lncz8KK3N0YXRpYyBpbnQgY2hlY2tfYW5kX3J1bl90cmFwcyh2b2lkKQoreworCWludCBsYXN0X3NpZyA9IDA7CisKKwl3aGlsZSAoMSkgeworCQlpbnQgc2lnOworCisJCWlmIChzaWdpc2VtcHR5c2V0KCZHLnBlbmRpbmdfc2V0KSkKKwkJCWJyZWFrOworCQlzaWcgPSAwOworCQlkbyB7CisJCQlzaWcrKzsKKwkJCWlmIChzaWdpc21lbWJlcigmRy5wZW5kaW5nX3NldCwgc2lnKSkgeworCQkJCXNpZ2RlbHNldCgmRy5wZW5kaW5nX3NldCwgc2lnKTsKKwkJCQlnb3RvIGdvdF9zaWc7CisJCQl9CisJCX0gd2hpbGUgKHNpZyA8IE5TSUcpOworCQlicmVhazsKKyBnb3Rfc2lnOgorCQlpZiAoRy50cmFwcyAmJiBHLnRyYXBzW3NpZ10pIHsKKwkJCWlmIChHLnRyYXBzW3NpZ11bMF0pIHsKKwkJCQkvKiBXZSBoYXZlIHVzZXItZGVmaW5lZCBoYW5kbGVyICovCisJCQkJc21hbGx1aW50IHNhdmVfcmNvZGU7CisJCQkJY2hhciAqYXJndlszXTsKKwkJCQkvKiBhcmd2WzBdIGlzIHVudXNlZCAqLworCQkJCWFyZ3ZbMV0gPSBHLnRyYXBzW3NpZ107CisJCQkJYXJndlsyXSA9IE5VTEw7CisJCQkJc2F2ZV9yY29kZSA9IEcubGFzdF9leGl0Y29kZTsKKwkJCQlidWlsdGluX2V2YWwoYXJndik7CisJCQkJRy5sYXN0X2V4aXRjb2RlID0gc2F2ZV9yY29kZTsKKwkJCQlsYXN0X3NpZyA9IHNpZzsKKwkJCX0gLyogZWxzZTogIiIgdHJhcCwgaWdub3Jpbmcgc2lnbmFsICovCisJCQljb250aW51ZTsKKwkJfQorCQkvKiBub3QgYSB0cmFwOiBzcGVjaWFsIGFjdGlvbiAqLworCQlzd2l0Y2ggKHNpZykgeworCQljYXNlIFNJR0lOVDoKKwkJCS8qIEJ1aWx0aW4gd2FzIF5DJ2VkLCBtYWtlIGl0IGxvb2sgcHJldHRpZXI6ICovCisJCQliYl9wdXRjaGFyKCdcbicpOworCQkJRy5mbGFnX1NJR0lOVCA9IDE7CisJCQlsYXN0X3NpZyA9IHNpZzsKKwkJCWJyZWFrOworI2lmIEVOQUJMRV9IVVNIX0pPQgorCQljYXNlIFNJR0hVUDogeworCQkJc3RydWN0IHBpcGUgKmpvYjsKKwkJCS8qIGJhc2ggaXMgb2JzZXJ2ZWQgdG8gc2lnbmFsIHdob2xlIHByb2Nlc3MgZ3JvdXBzLAorCQkJICogbm90IGluZGl2aWR1YWwgcHJvY2Vzc2VzICovCisJCQlmb3IgKGpvYiA9IEcuam9iX2xpc3Q7IGpvYjsgam9iID0gam9iLT5uZXh0KSB7CisJCQkJaWYgKGpvYi0+cGdycCA8PSAwKQorCQkJCQljb250aW51ZTsKKwkJCQlkZWJ1Z19wcmludGZfZXhlYygiSFVQaW5nIHBncnAgJWRcbiIsIGpvYi0+cGdycCk7CisJCQkJaWYgKGtpbGwoLSBqb2ItPnBncnAsIFNJR0hVUCkgPT0gMCkKKwkJCQkJa2lsbCgtIGpvYi0+cGdycCwgU0lHQ09OVCk7CisJCQl9CisJCQlzaWdleGl0KFNJR0hVUCk7CisJCX0KKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0ZBU1QKKwkJY2FzZSBTSUdDSExEOgorCQkJRy5jb3VudF9TSUdDSExEKys7CisvL2JiX2Vycm9yX21zZygiWyVkXSBjaGVja19hbmRfcnVuX3RyYXBzOiBHLmNvdW50X1NJR0NITEQ6JWQgRy5oYW5kbGVkX1NJR0NITEQ6JWQiLCBnZXRwaWQoKSwgRy5jb3VudF9TSUdDSExELCBHLmhhbmRsZWRfU0lHQ0hMRCk7CisJCQkvKiBOb3RlOgorCQkJICogV2UgZG9udCBkbyAnbGFzdF9zaWcgPSBzaWcnIGhlcmUgLT4gTk9UIHJldHVybmluZyB0aGlzIHNpZy4KKwkJCSAqIFRoaXMgc2ltcGxpZmllcyB3YWl0IGJ1aWx0aW4gYSBiaXQuCisJCQkgKi8KKwkJCWJyZWFrOworI2VuZGlmCisJCWRlZmF1bHQ6IC8qIGlnbm9yZWQ6ICovCisJCQkvKiBTSUdURVJNLCBTSUdRVUlULCBTSUdUVElOLCBTSUdUVE9VLCBTSUdUU1RQICovCisJCQkvKiBOb3RlOgorCQkJICogV2UgZG9udCBkbyAnbGFzdF9zaWcgPSBzaWcnIGhlcmUgLT4gTk9UIHJldHVybmluZyB0aGlzIHNpZy4KKwkJCSAqIEV4YW1wbGU6IHdhaXQgaXMgbm90IGludGVycnVwdGVkIGJ5IFRFUk0KKwkJCSAqIGluIGludGVyYWN0aXZlIHNoZWxsLCBiZWNhdXNlIFRFUk0gaXMgaWdub3JlZC4KKwkJCSAqLworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIGxhc3Rfc2lnOworfQorCisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfY3dkKGludCBmb3JjZSkKK3sKKwlpZiAoZm9yY2UgfHwgRy5jd2QgPT0gTlVMTCkgeworCQkvKiB4cmVhbGxvY19nZXRjd2Rfb3Jfd2FybihhcmcpIGNhbGxzIGZyZWUoYXJnKSwKKwkJICogd2UgbXVzdCBub3QgdHJ5IHRvIGZyZWUoYmJfbXNnX3Vua25vd24pICovCisJCWlmIChHLmN3ZCA9PSBiYl9tc2dfdW5rbm93bikKKwkJCUcuY3dkID0gTlVMTDsKKwkJRy5jd2QgPSB4cmVhbGxvY19nZXRjd2Rfb3Jfd2FybigoY2hhciAqKUcuY3dkKTsKKwkJaWYgKCFHLmN3ZCkKKwkJCUcuY3dkID0gYmJfbXNnX3Vua25vd247CisJfQorCXJldHVybiBHLmN3ZDsKK30KKworCisvKgorICogU2hlbGwgYW5kIGVudmlyb25tZW50IHZhcmlhYmxlIHN1cHBvcnQKKyAqLworc3RhdGljIHN0cnVjdCB2YXJpYWJsZSAqKmdldF9wdHJfdG9fbG9jYWxfdmFyKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGxlbikKK3sKKwlzdHJ1Y3QgdmFyaWFibGUgKipwcDsKKwlzdHJ1Y3QgdmFyaWFibGUgKmN1cjsKKworCXBwID0gJkcudG9wX3ZhcjsKKwl3aGlsZSAoKGN1ciA9ICpwcCkgIT0gTlVMTCkgeworCQlpZiAoc3RybmNtcChjdXItPnZhcnN0ciwgbmFtZSwgbGVuKSA9PSAwICYmIGN1ci0+dmFyc3RyW2xlbl0gPT0gJz0nKQorCQkJcmV0dXJuIHBwOworCQlwcCA9ICZjdXItPm5leHQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgY29uc3QgY2hhciogRkFTVF9GVU5DIGdldF9sb2NhbF92YXJfdmFsdWUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgdmFyaWFibGUgKip2cHA7CisJdW5zaWduZWQgbGVuID0gc3RybGVuKG5hbWUpOworCisJaWYgKEcuZXhwYW5kZWRfYXNzaWdubWVudHMpIHsKKwkJY2hhciAqKmNwcCA9IEcuZXhwYW5kZWRfYXNzaWdubWVudHM7CisJCXdoaWxlICgqY3BwKSB7CisJCQljaGFyICpjcCA9ICpjcHA7CisJCQlpZiAoc3RybmNtcChjcCwgbmFtZSwgbGVuKSA9PSAwICYmIGNwW2xlbl0gPT0gJz0nKQorCQkJCXJldHVybiBjcCArIGxlbiArIDE7CisJCQljcHArKzsKKwkJfQorCX0KKworCXZwcCA9IGdldF9wdHJfdG9fbG9jYWxfdmFyKG5hbWUsIGxlbik7CisJaWYgKHZwcCkKKwkJcmV0dXJuICgqdnBwKS0+dmFyc3RyICsgbGVuICsgMTsKKworCWlmIChzdHJjbXAobmFtZSwgIlBQSUQiKSA9PSAwKQorCQlyZXR1cm4gdXRvYShHLnJvb3RfcHBpZCk7CisJLy8gYmFzaCBjb21wYXQ6IFVJRD8gRVVJRD8KKyNpZiBFTkFCTEVfSFVTSF9SQU5ET01fU1VQUE9SVAorCWlmIChzdHJjbXAobmFtZSwgIlJBTkRPTSIpID09IDApCisJCXJldHVybiB1dG9hKG5leHRfcmFuZG9tKCZHLnJhbmRvbV9nZW4pKTsKKyNlbmRpZgorCXJldHVybiBOVUxMOworfQorCisvKiBzdHIgaG9sZHMgIk5BTUU9VkFMIiBhbmQgaXMgZXhwZWN0ZWQgdG8gYmUgbWFsbG9jZWQuCisgKiBXZSB0YWtlIG93bmVyc2hpcCBvZiBpdC4KKyAqIGZsZ19leHBvcnQ6CisgKiAgMDogZG8gbm90IGNoYW5nZSBleHBvcnQgZmxhZworICogICAgIChpZiBjcmVhdGluZyBuZXcgdmFyaWFibGUsIGZsYWcgd2lsbCBiZSAwKQorICogIDE6IHNldCBleHBvcnQgZmxhZyBhbmQgcHV0ZW52IHRoZSB2YXJpYWJsZQorICogLTE6IGNsZWFyIGV4cG9ydCBmbGFnIGFuZCB1bnNldGVudiB0aGUgdmFyaWFibGUKKyAqIGZsZ19yZWFkX29ubHkgaXMgc2V0IG9ubHkgd2hlbiB3ZSBoYW5kbGUgLVIgdmFyPXZhbAorICovCisjaWYgIUJCX01NVSAmJiBFTkFCTEVfSFVTSF9MT0NBTAorLyogYWxsIHBhcmFtcyBhcmUgdXNlZCAqLworI2VsaWYgQkJfTU1VICYmIEVOQUJMRV9IVVNIX0xPQ0FMCisjZGVmaW5lIHNldF9sb2NhbF92YXIoc3RyLCBmbGdfZXhwb3J0LCBsb2NhbF9sdmwsIGZsZ19yZWFkX29ubHkpIFwKKwlzZXRfbG9jYWxfdmFyKHN0ciwgZmxnX2V4cG9ydCwgbG9jYWxfbHZsKQorI2VsaWYgQkJfTU1VICYmICFFTkFCTEVfSFVTSF9MT0NBTAorI2RlZmluZSBzZXRfbG9jYWxfdmFyKHN0ciwgZmxnX2V4cG9ydCwgbG9jYWxfbHZsLCBmbGdfcmVhZF9vbmx5KSBcCisJc2V0X2xvY2FsX3ZhcihzdHIsIGZsZ19leHBvcnQpCisjZWxpZiAhQkJfTU1VICYmICFFTkFCTEVfSFVTSF9MT0NBTAorI2RlZmluZSBzZXRfbG9jYWxfdmFyKHN0ciwgZmxnX2V4cG9ydCwgbG9jYWxfbHZsLCBmbGdfcmVhZF9vbmx5KSBcCisJc2V0X2xvY2FsX3ZhcihzdHIsIGZsZ19leHBvcnQsIGZsZ19yZWFkX29ubHkpCisjZW5kaWYKK3N0YXRpYyBpbnQgc2V0X2xvY2FsX3ZhcihjaGFyICpzdHIsIGludCBmbGdfZXhwb3J0LCBpbnQgbG9jYWxfbHZsLCBpbnQgZmxnX3JlYWRfb25seSkKK3sKKwlzdHJ1Y3QgdmFyaWFibGUgKip2YXJfcHA7CisJc3RydWN0IHZhcmlhYmxlICpjdXI7CisJY2hhciAqZXFfc2lnbjsKKwlpbnQgbmFtZV9sZW47CisKKwllcV9zaWduID0gc3RyY2hyKHN0ciwgJz0nKTsKKwlpZiAoIWVxX3NpZ24pIHsgLyogbm90IGV4cGVjdGVkIHRvIGV2ZXIgaGFwcGVuPyAqLworCQlmcmVlKHN0cik7CisJCXJldHVybiAtMTsKKwl9CisKKwluYW1lX2xlbiA9IGVxX3NpZ24gLSBzdHIgKyAxOyAvKiBpbmNsdWRpbmcgJz0nICovCisJdmFyX3BwID0gJkcudG9wX3ZhcjsKKwl3aGlsZSAoKGN1ciA9ICp2YXJfcHApICE9IE5VTEwpIHsKKwkJaWYgKHN0cm5jbXAoY3VyLT52YXJzdHIsIHN0ciwgbmFtZV9sZW4pICE9IDApIHsKKwkJCXZhcl9wcCA9ICZjdXItPm5leHQ7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBXZSBmb3VuZCBhbiBleGlzdGluZyB2YXIgd2l0aCB0aGlzIG5hbWUgKi8KKwkJaWYgKGN1ci0+ZmxnX3JlYWRfb25seSkgeworI2lmICFCQl9NTVUKKwkJCWlmICghZmxnX3JlYWRfb25seSkKKyNlbmRpZgorCQkJCWJiX2Vycm9yX21zZygiJXM6IHJlYWRvbmx5IHZhcmlhYmxlIiwgc3RyKTsKKwkJCWZyZWUoc3RyKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlpZiAoZmxnX2V4cG9ydCA9PSAtMSkgeyAvLyAiJiYgY3VyLT5mbGdfZXhwb3J0IiA/CisJCQlkZWJ1Z19wcmludGZfZW52KCIlczogdW5zZXRlbnYgJyVzJ1xuIiwgX19mdW5jX18sIHN0cik7CisJCQkqZXFfc2lnbiA9ICdcMCc7CisJCQl1bnNldGVudihzdHIpOworCQkJKmVxX3NpZ24gPSAnPSc7CisJCX0KKyNpZiBFTkFCTEVfSFVTSF9MT0NBTAorCQlpZiAoY3VyLT5mdW5jX25lc3RfbGV2ZWwgPCBsb2NhbF9sdmwpIHsKKwkJCS8qIE5ldyB2YXJpYWJsZSBpcyBkZWNsYXJlZCBhcyBsb2NhbCwKKwkJCSAqIGFuZCBleGlzdGluZyBvbmUgaXMgZ2xvYmFsLCBvciBsb2NhbAorCQkJICogZnJvbSBlbmNsb3NpbmcgZnVuY3Rpb24uCisJCQkgKiBSZW1vdmUgYW5kIHNhdmUgb2xkIG9uZTogKi8KKwkJCSp2YXJfcHAgPSBjdXItPm5leHQ7CisJCQljdXItPm5leHQgPSAqRy5zaGFkb3dlZF92YXJzX3BwOworCQkJKkcuc2hhZG93ZWRfdmFyc19wcCA9IGN1cjsKKwkJCS8qIGJhc2ggMy4yLjMzKDEpIGFuZCBleHBvcnRlZCB2YXJzOgorCQkJICogIyBleHBvcnQgej16CisJCQkgKiAjIGYoKSB7IGxvY2FsIHo9YTsgZW52IHwgZ3JlcCBeejsgfQorCQkJICogIyBmCisJCQkgKiB6PWEKKwkJCSAqICMgZW52IHwgZ3JlcCBeegorCQkJICogej16CisJCQkgKi8KKwkJCWlmIChjdXItPmZsZ19leHBvcnQpCisJCQkJZmxnX2V4cG9ydCA9IDE7CisJCQlicmVhazsKKwkJfQorI2VuZGlmCisJCWlmIChzdHJjbXAoY3VyLT52YXJzdHIgKyBuYW1lX2xlbiwgZXFfc2lnbiArIDEpID09IDApIHsKKyBmcmVlX2FuZF9leHA6CisJCQlmcmVlKHN0cik7CisJCQlnb3RvIGV4cDsKKwkJfQorCQlpZiAoY3VyLT5tYXhfbGVuICE9IDApIHsKKwkJCWlmIChjdXItPm1heF9sZW4gPj0gc3RybGVuKHN0cikpIHsKKwkJCQkvKiBUaGlzIG9uZSBpcyBmcm9tIHN0YXJ0dXAgZW52LCByZXVzZSBzcGFjZSAqLworCQkJCXN0cmNweShjdXItPnZhcnN0ciwgc3RyKTsKKwkJCQlnb3RvIGZyZWVfYW5kX2V4cDsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIG1heF9sZW4gPT0gMCBzaWduaWZpZXMgIm1hbGxvY2VkIiB2YXIsIHdoaWNoIHdlIGNhbgorCQkJICogKGFuZCBoYXMgdG8pIGZyZWUgKi8KKwkJCWZyZWUoY3VyLT52YXJzdHIpOworCQl9CisJCWN1ci0+bWF4X2xlbiA9IDA7CisJCWdvdG8gc2V0X3N0cl9hbmRfZXhwOworCX0KKworCS8qIE5vdCBmb3VuZCAtIGNyZWF0ZSBuZXcgdmFyaWFibGUgc3RydWN0ICovCisJY3VyID0geHphbGxvYyhzaXplb2YoKmN1cikpOworI2lmIEVOQUJMRV9IVVNIX0xPQ0FMCisJY3VyLT5mdW5jX25lc3RfbGV2ZWwgPSBsb2NhbF9sdmw7CisjZW5kaWYKKwljdXItPm5leHQgPSAqdmFyX3BwOworCSp2YXJfcHAgPSBjdXI7CisKKyBzZXRfc3RyX2FuZF9leHA6CisJY3VyLT52YXJzdHIgPSBzdHI7CisjaWYgIUJCX01NVQorCWN1ci0+ZmxnX3JlYWRfb25seSA9IGZsZ19yZWFkX29ubHk7CisjZW5kaWYKKyBleHA6CisJaWYgKGZsZ19leHBvcnQgPT0gMSkKKwkJY3VyLT5mbGdfZXhwb3J0ID0gMTsKKwlpZiAobmFtZV9sZW4gPT0gNCAmJiBjdXItPnZhcnN0clswXSA9PSAnUCcgJiYgY3VyLT52YXJzdHJbMV0gPT0gJ1MnKQorCQljbWRlZGl0X3VwZGF0ZV9wcm9tcHQoKTsKKwlpZiAoY3VyLT5mbGdfZXhwb3J0KSB7CisJCWlmIChmbGdfZXhwb3J0ID09IC0xKSB7CisJCQljdXItPmZsZ19leHBvcnQgPSAwOworCQkJLyogdW5zZXRlbnYgd2FzIGFscmVhZHkgZG9uZSAqLworCQl9IGVsc2UgeworCQkJZGVidWdfcHJpbnRmX2VudigiJXM6IHB1dGVudiAnJXMnXG4iLCBfX2Z1bmNfXywgY3VyLT52YXJzdHIpOworCQkJcmV0dXJuIHB1dGVudihjdXItPnZhcnN0cik7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIFVzZWQgYXQgc3RhcnR1cCBhbmQgYWZ0ZXIgZWFjaCBjZCAqLworc3RhdGljIHZvaWQgc2V0X3B3ZF92YXIoaW50IGV4cCkKK3sKKwlzZXRfbG9jYWxfdmFyKHhhc3ByaW50ZigiUFdEPSVzIiwgZ2V0X2N3ZCgvKmZvcmNlOiovIDEpKSwKKwkJLypleHA6Ki8gZXhwLCAvKmx2bDoqLyAwLCAvKnJvOiovIDApOworfQorCitzdGF0aWMgaW50IHVuc2V0X2xvY2FsX3Zhcl9sZW4oY29uc3QgY2hhciAqbmFtZSwgaW50IG5hbWVfbGVuKQoreworCXN0cnVjdCB2YXJpYWJsZSAqY3VyOworCXN0cnVjdCB2YXJpYWJsZSAqKnZhcl9wcDsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl2YXJfcHAgPSAmRy50b3BfdmFyOworCXdoaWxlICgoY3VyID0gKnZhcl9wcCkgIT0gTlVMTCkgeworCQlpZiAoc3RybmNtcChjdXItPnZhcnN0ciwgbmFtZSwgbmFtZV9sZW4pID09IDAgJiYgY3VyLT52YXJzdHJbbmFtZV9sZW5dID09ICc9JykgeworCQkJaWYgKGN1ci0+ZmxnX3JlYWRfb25seSkgeworCQkJCWJiX2Vycm9yX21zZygiJXM6IHJlYWRvbmx5IHZhcmlhYmxlIiwgbmFtZSk7CisJCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJCX0KKwkJCSp2YXJfcHAgPSBjdXItPm5leHQ7CisJCQlkZWJ1Z19wcmludGZfZW52KCIlczogdW5zZXRlbnYgJyVzJ1xuIiwgX19mdW5jX18sIGN1ci0+dmFyc3RyKTsKKwkJCWJiX3Vuc2V0ZW52KGN1ci0+dmFyc3RyKTsKKwkJCWlmIChuYW1lX2xlbiA9PSAzICYmIGN1ci0+dmFyc3RyWzBdID09ICdQJyAmJiBjdXItPnZhcnN0clsxXSA9PSAnUycpCisJCQkJY21kZWRpdF91cGRhdGVfcHJvbXB0KCk7CisJCQlpZiAoIWN1ci0+bWF4X2xlbikKKwkJCQlmcmVlKGN1ci0+dmFyc3RyKTsKKwkJCWZyZWUoY3VyKTsKKwkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCX0KKwkJdmFyX3BwID0gJmN1ci0+bmV4dDsKKwl9CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCB1bnNldF9sb2NhbF92YXIoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlyZXR1cm4gdW5zZXRfbG9jYWxfdmFyX2xlbihuYW1lLCBzdHJsZW4obmFtZSkpOworfQorCitzdGF0aWMgdm9pZCB1bnNldF92YXJzKGNoYXIgKipzdHJpbmdzKQoreworCWNoYXIgKip2OworCisJaWYgKCFzdHJpbmdzKQorCQlyZXR1cm47CisJdiA9IHN0cmluZ3M7CisJd2hpbGUgKCp2KSB7CisJCWNvbnN0IGNoYXIgKmVxID0gc3RyY2hybnVsKCp2LCAnPScpOworCQl1bnNldF9sb2NhbF92YXJfbGVuKCp2LCAoaW50KShlcSAtICp2KSk7CisJCXYrKzsKKwl9CisJZnJlZShzdHJpbmdzKTsKK30KKworc3RhdGljIHZvaWQgRkFTVF9GVU5DIHNldF9sb2NhbF92YXJfZnJvbV9oYWx2ZXMoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsKQoreworCWNoYXIgKnZhciA9IHhhc3ByaW50ZigiJXM9JXMiLCBuYW1lLCB2YWwpOworCXNldF9sb2NhbF92YXIodmFyLCAvKmZsYWdzOiovIDAsIC8qbHZsOiovIDAsIC8qcm86Ki8gMCk7Cit9CisKKworLyoKKyAqIEhlbHBlcnMgZm9yICJ2YXIxPXZhbDEgdmFyMj12YWwyIGNtZCIgZmVhdHVyZQorICovCitzdGF0aWMgdm9pZCBhZGRfdmFycyhzdHJ1Y3QgdmFyaWFibGUgKnZhcikKK3sKKwlzdHJ1Y3QgdmFyaWFibGUgKm5leHQ7CisKKwl3aGlsZSAodmFyKSB7CisJCW5leHQgPSB2YXItPm5leHQ7CisJCXZhci0+bmV4dCA9IEcudG9wX3ZhcjsKKwkJRy50b3BfdmFyID0gdmFyOworCQlpZiAodmFyLT5mbGdfZXhwb3J0KSB7CisJCQlkZWJ1Z19wcmludGZfZW52KCIlczogcmVzdG9yaW5nIGV4cG9ydGVkICclcydcbiIsIF9fZnVuY19fLCB2YXItPnZhcnN0cik7CisJCQlwdXRlbnYodmFyLT52YXJzdHIpOworCQl9IGVsc2UgeworCQkJZGVidWdfcHJpbnRmX2VudigiJXM6IHJlc3RvcmluZyB2YXJpYWJsZSAnJXMnXG4iLCBfX2Z1bmNfXywgdmFyLT52YXJzdHIpOworCQl9CisJCXZhciA9IG5leHQ7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHZhcmlhYmxlICpzZXRfdmFyc19hbmRfc2F2ZV9vbGQoY2hhciAqKnN0cmluZ3MpCit7CisJY2hhciAqKnM7CisJc3RydWN0IHZhcmlhYmxlICpvbGQgPSBOVUxMOworCisJaWYgKCFzdHJpbmdzKQorCQlyZXR1cm4gb2xkOworCXMgPSBzdHJpbmdzOworCXdoaWxlICgqcykgeworCQlzdHJ1Y3QgdmFyaWFibGUgKnZhcl9wOworCQlzdHJ1Y3QgdmFyaWFibGUgKip2YXJfcHA7CisJCWNoYXIgKmVxOworCisJCWVxID0gc3RyY2hyKCpzLCAnPScpOworCQlpZiAoZXEpIHsKKwkJCXZhcl9wcCA9IGdldF9wdHJfdG9fbG9jYWxfdmFyKCpzLCBlcSAtICpzKTsKKwkJCWlmICh2YXJfcHApIHsKKwkJCQkvKiBSZW1vdmUgdmFyaWFibGUgZnJvbSBnbG9iYWwgbGlua2VkIGxpc3QgKi8KKwkJCQl2YXJfcCA9ICp2YXJfcHA7CisJCQkJZGVidWdfcHJpbnRmX2VudigiJXM6IHJlbW92aW5nICclcydcbiIsIF9fZnVuY19fLCB2YXJfcC0+dmFyc3RyKTsKKwkJCQkqdmFyX3BwID0gdmFyX3AtPm5leHQ7CisJCQkJLyogQWRkIGl0IHRvIHJldHVybmVkIGxpc3QgKi8KKwkJCQl2YXJfcC0+bmV4dCA9IG9sZDsKKwkJCQlvbGQgPSB2YXJfcDsKKwkJCX0KKwkJCXNldF9sb2NhbF92YXIoKnMsIC8qZXhwOiovIDEsIC8qbHZsOiovIDAsIC8qcm86Ki8gMCk7CisJCX0KKwkJcysrOworCX0KKwlyZXR1cm4gb2xkOworfQorCisKKy8qCisgKiBVbmljb2RlIGhlbHBlcgorICovCitzdGF0aWMgdm9pZCByZWluaXRfdW5pY29kZV9mb3JfaHVzaCh2b2lkKQoreworCS8qIFVuaWNvZGUgc3VwcG9ydCBzaG91bGQgYmUgYWN0aXZhdGVkIGV2ZW4gaWYgTEFORyBpcyBzZXQKKwkgKiBfZHVyaW5nXyBzaGVsbCBleGVjdXRpb24sIG5vdCBvbmx5IGlmIGl0IHdhcyBzZXQgd2hlbgorCSAqIHNoZWxsIHdhcyBzdGFydGVkLiBUaGVyZWZvcmUsIHJlLWNoZWNrIExBTkcgZXZlcnkgdGltZToKKwkgKi8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0hFQ0tfVU5JQ09ERV9JTl9FTlYKKwkgfHwgRU5BQkxFX1VOSUNPREVfVVNJTkdfTE9DQUxFCisgICAgICAgICkgeworCQljb25zdCBjaGFyICpzID0gZ2V0X2xvY2FsX3Zhcl92YWx1ZSgiTENfQUxMIik7CisJCWlmICghcykgcyA9IGdldF9sb2NhbF92YXJfdmFsdWUoIkxDX0NUWVBFIik7CisJCWlmICghcykgcyA9IGdldF9sb2NhbF92YXJfdmFsdWUoIkxBTkciKTsKKwkJcmVpbml0X3VuaWNvZGUocyk7CisJfQorfQorCisKKy8qCisgKiBpbl9zdHIgc3VwcG9ydAorICovCitzdGF0aWMgaW50IEZBU1RfRlVOQyBzdGF0aWNfZ2V0KHN0cnVjdCBpbl9zdHIgKmkpCit7CisJaW50IGNoID0gKmktPnA7CisJaWYgKGNoICE9ICdcMCcpIHsKKwkJaS0+cCsrOworCQlpLT5sYXN0X2NoYXIgPSBjaDsKKwkJcmV0dXJuIGNoOworCX0KKwlyZXR1cm4gRU9GOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBzdGF0aWNfcGVlayhzdHJ1Y3QgaW5fc3RyICppKQoreworCXJldHVybiAqaS0+cDsKK30KKworI2lmIEVOQUJMRV9IVVNIX0lOVEVSQUNUSVZFCisKK3N0YXRpYyB2b2lkIGNtZGVkaXRfdXBkYXRlX3Byb21wdCh2b2lkKQoreworCWlmIChFTkFCTEVfRkVBVFVSRV9FRElUSU5HX0ZBTkNZX1BST01QVCkgeworCQlHLlBTMSA9IGdldF9sb2NhbF92YXJfdmFsdWUoIlBTMSIpOworCQlpZiAoRy5QUzEgPT0gTlVMTCkKKwkJCUcuUFMxID0gIlxcdyBcXCQgIjsKKwkJRy5QUzIgPSBnZXRfbG9jYWxfdmFyX3ZhbHVlKCJQUzIiKTsKKwl9IGVsc2UgeworCQlHLlBTMSA9IE5VTEw7CisJfQorCWlmIChHLlBTMiA9PSBOVUxMKQorCQlHLlBTMiA9ICI+ICI7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpzZXR1cF9wcm9tcHRfc3RyaW5nKGludCBwcm9tcHRtb2RlKQoreworCWNvbnN0IGNoYXIgKnByb21wdF9zdHI7CisJZGVidWdfcHJpbnRmKCJzZXR1cF9wcm9tcHRfc3RyaW5nICVkICIsIHByb21wdG1vZGUpOworCWlmICghRU5BQkxFX0ZFQVRVUkVfRURJVElOR19GQU5DWV9QUk9NUFQpIHsKKwkJLyogU2V0IHVwIHRoZSBwcm9tcHQgKi8KKwkJaWYgKHByb21wdG1vZGUgPT0gMCkgeyAvKiBQUzEgKi8KKwkJCWZyZWUoKGNoYXIqKUcuUFMxKTsKKwkJCS8qIGJhc2ggdXNlcyAkUFdEIHZhbHVlLCBldmVuIGlmIGl0IGlzIHNldCBieSB1c2VyLgorCQkJICogSXQgdXNlcyBjdXJyZW50IGRpciBvbmx5IGlmIFBXRCBpcyB1bnNldC4KKwkJCSAqIFdlIGFsd2F5cyB1c2UgY3VycmVudCBkaXIuICovCisJCQlHLlBTMSA9IHhhc3ByaW50ZigiJXMgJWMgIiwgZ2V0X2N3ZCgwKSwgKGdldGV1aWQoKSAhPSAwKSA/ICckJyA6ICcjJyk7CisJCQlwcm9tcHRfc3RyID0gRy5QUzE7CisJCX0gZWxzZQorCQkJcHJvbXB0X3N0ciA9IEcuUFMyOworCX0gZWxzZQorCQlwcm9tcHRfc3RyID0gKHByb21wdG1vZGUgPT0gMCkgPyBHLlBTMSA6IEcuUFMyOworCWRlYnVnX3ByaW50ZigicmVzdWx0ICclcydcbiIsIHByb21wdF9zdHIpOworCXJldHVybiBwcm9tcHRfc3RyOworfQorCitzdGF0aWMgdm9pZCBnZXRfdXNlcl9pbnB1dChzdHJ1Y3QgaW5fc3RyICppKQoreworCWludCByOworCWNvbnN0IGNoYXIgKnByb21wdF9zdHI7CisKKwlwcm9tcHRfc3RyID0gc2V0dXBfcHJvbXB0X3N0cmluZyhpLT5wcm9tcHRtb2RlKTsKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfRURJVElORworCS8qIEVuYWJsZSBjb21tYW5kIGxpbmUgZWRpdGluZyBvbmx5IHdoaWxlIGEgY29tbWFuZCBsaW5lCisJICogaXMgYWN0dWFsbHkgYmVpbmcgcmVhZCAqLworCWRvIHsKKwkJcmVpbml0X3VuaWNvZGVfZm9yX2h1c2goKTsKKwkJRy5mbGFnX1NJR0lOVCA9IDA7CisJCS8qIGJ1Z2xldDogU0lHSU5UIHdpbGwgbm90IG1ha2UgbmV3IHByb21wdCB0byBhcHBlYXIgX2F0IG9uY2VfLAorCQkgKiBvbmx5IGFmdGVyIDxFbnRlcj4uICheQyB3aWxsIHdvcmspICovCisJCXIgPSByZWFkX2xpbmVfaW5wdXQoRy5saW5lX2lucHV0X3N0YXRlLCBwcm9tcHRfc3RyLCBHLnVzZXJfaW5wdXRfYnVmLCBDT05GSUdfRkVBVFVSRV9FRElUSU5HX01BWF9MRU4tMSwgLyp0aW1lb3V0Ki8gLTEpOworCQkvKiBjYXRjaCAqU0lHSU5UKiBldGMgKF5DIGlzIGhhbmRsZWQgYnkgcmVhZF9saW5lX2lucHV0KSAqLworCQljaGVja19hbmRfcnVuX3RyYXBzKCk7CisJfSB3aGlsZSAociA9PSAwIHx8IEcuZmxhZ19TSUdJTlQpOyAvKiByZXBlYXQgaWYgXkMgb3IgU0lHSU5UICovCisJaS0+ZW9mX2ZsYWcgPSAociA8IDApOworCWlmIChpLT5lb2ZfZmxhZykgeyAvKiBFT0YvZXJyb3IgZGV0ZWN0ZWQgKi8KKwkJRy51c2VyX2lucHV0X2J1ZlswXSA9IEVPRjsgLyogeWVzLCBpdCB3aWxsIGJlIHRydW5jYXRlZCwgaXQncyBvayAqLworCQlHLnVzZXJfaW5wdXRfYnVmWzFdID0gJ1wwJzsKKwl9CisjIGVsc2UKKwlkbyB7CisJCUcuZmxhZ19TSUdJTlQgPSAwOworCQlpZiAoaS0+bGFzdF9jaGFyID09ICdcMCcgfHwgaS0+bGFzdF9jaGFyID09ICdcbicpIHsKKwkJCS8qIFdoeSBjaGVja19hbmRfcnVuX3RyYXBzIGhlcmU/IFRyeSB0aGlzIGludGVyYWN0aXZlbHk6CisJCQkgKiAkIHRyYXAgJ2VjaG8gSU5UJyBJTlQ7IChzbGVlcCAyOyBraWxsIC1JTlQgJCQpICYKKwkJCSAqICQgPFtlbnRlcl0sIHJlcGVhdGVkbHkuLi4+CisJCQkgKiBXaXRob3V0IGNoZWNrX2FuZF9ydW5fdHJhcHMsIGhhbmRsZXIgbmV2ZXIgcnVucy4KKwkJCSAqLworCQkJY2hlY2tfYW5kX3J1bl90cmFwcygpOworCQkJZnB1dHMocHJvbXB0X3N0ciwgc3Rkb3V0KTsKKwkJfQorCQlmZmx1c2hfYWxsKCk7CisJCUcudXNlcl9pbnB1dF9idWZbMF0gPSByID0gZmdldGMoaS0+ZmlsZSk7CisJCS8qRy51c2VyX2lucHV0X2J1ZlsxXSA9ICdcMCc7IC0gYWxyZWFkeSBpcyBhbmQgbmV2ZXIgY2hhbmdlZCAqLworCX0gd2hpbGUgKEcuZmxhZ19TSUdJTlQpOworCWktPmVvZl9mbGFnID0gKHIgPT0gRU9GKTsKKyMgZW5kaWYKKwlpLT5wID0gRy51c2VyX2lucHV0X2J1ZjsKK30KKworI2VuZGlmICAvKiBJTlRFUkFDVElWRSAqLworCisvKiBUaGlzIGlzIHRoZSBtYWdpYyBsb2NhdGlvbiB0aGF0IHByaW50cyBwcm9tcHRzCisgKiBhbmQgZ2V0cyBkYXRhIGJhY2sgZnJvbSB0aGUgdXNlciAqLworc3RhdGljIGludCBGQVNUX0ZVTkMgZmlsZV9nZXQoc3RydWN0IGluX3N0ciAqaSkKK3sKKwlpbnQgY2g7CisKKwkvKiBJZiB0aGVyZSBpcyBkYXRhIHdhaXRpbmcsIGVhdCBpdCB1cCAqLworCWlmIChpLT5wICYmICppLT5wKSB7CisjaWYgRU5BQkxFX0hVU0hfSU5URVJBQ1RJVkUKKyB0YWtlX2NhY2hlZDoKKyNlbmRpZgorCQljaCA9ICppLT5wKys7CisJCWlmIChpLT5lb2ZfZmxhZyAmJiAhKmktPnApCisJCQljaCA9IEVPRjsKKwkJLyogbm90ZTogY2ggaXMgbmV2ZXIgTlVMICovCisJfSBlbHNlIHsKKwkJLyogbmVlZCB0byBkb3VibGUgY2hlY2sgaS0+ZmlsZSBiZWNhdXNlIHdlIG1pZ2h0IGJlIGRvaW5nIHNvbWV0aGluZworCQkgKiBtb3JlIGNvbXBsaWNhdGVkIGJ5IG5vdywgbGlrZSBzb3VyY2luZyBvciBzdWJzdGl0dXRpbmcuICovCisjaWYgRU5BQkxFX0hVU0hfSU5URVJBQ1RJVkUKKwkJaWYgKEdfaW50ZXJhY3RpdmVfZmQgJiYgaS0+ZmlsZSA9PSBzdGRpbikgeworCQkJZG8geworCQkJCWdldF91c2VyX2lucHV0KGkpOworCQkJfSB3aGlsZSAoISppLT5wKTsgLyogbmVlZCBub24tZW1wdHkgbGluZSAqLworCQkJaS0+cHJvbXB0bW9kZSA9IDE7IC8qIFBTMiAqLworCQkJZ290byB0YWtlX2NhY2hlZDsKKwkJfQorI2VuZGlmCisJCWRvIGNoID0gZmdldGMoaS0+ZmlsZSk7IHdoaWxlIChjaCA9PSAnXDAnKTsKKwl9CisJZGVidWdfcHJpbnRmKCJmaWxlX2dldDogZ290ICclYycgJWRcbiIsIGNoLCBjaCk7CisJaS0+bGFzdF9jaGFyID0gY2g7CisJcmV0dXJuIGNoOworfQorCisvKiBBbGwgY2FsbGVycyBndWFyYW50ZWUgdGhpcyByb3V0aW5lIHdpbGwgbmV2ZXIKKyAqIGJlIHVzZWQgcmlnaHQgYWZ0ZXIgYSBuZXdsaW5lLCBzbyBwcm9tcHRpbmcgaXMgbm90IG5lZWRlZC4KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMgZmlsZV9wZWVrKHN0cnVjdCBpbl9zdHIgKmkpCit7CisJaW50IGNoOworCWlmIChpLT5wICYmICppLT5wKSB7CisJCWlmIChpLT5lb2ZfZmxhZyAmJiAhaS0+cFsxXSkKKwkJCXJldHVybiBFT0Y7CisJCXJldHVybiAqaS0+cDsKKwkJLyogbm90ZTogY2ggaXMgbmV2ZXIgTlVMICovCisJfQorCWRvIGNoID0gZmdldGMoaS0+ZmlsZSk7IHdoaWxlIChjaCA9PSAnXDAnKTsKKwlpLT5lb2ZfZmxhZyA9IChjaCA9PSBFT0YpOworCWktPnBlZWtfYnVmWzBdID0gY2g7CisJaS0+cGVla19idWZbMV0gPSAnXDAnOworCWktPnAgPSBpLT5wZWVrX2J1ZjsKKwlkZWJ1Z19wcmludGYoImZpbGVfcGVlazogZ290ICclYycgJWRcbiIsIGNoLCBjaCk7CisJcmV0dXJuIGNoOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9maWxlX2luX3N0cihzdHJ1Y3QgaW5fc3RyICppLCBGSUxFICpmKQoreworCW1lbXNldChpLCAwLCBzaXplb2YoKmkpKTsKKwlpLT5wZWVrID0gZmlsZV9wZWVrOworCWktPmdldCA9IGZpbGVfZ2V0OworCS8qIGktPnByb21wdG1vZGUgPSAwOyAtIFBTMSAobWVtc2V0IGRpZCBpdCkgKi8KKwlpLT5maWxlID0gZjsKKwkvKiBpLT5wID0gTlVMTDsgKi8KK30KKworc3RhdGljIHZvaWQgc2V0dXBfc3RyaW5nX2luX3N0cihzdHJ1Y3QgaW5fc3RyICppLCBjb25zdCBjaGFyICpzKQoreworCW1lbXNldChpLCAwLCBzaXplb2YoKmkpKTsKKwlpLT5wZWVrID0gc3RhdGljX3BlZWs7CisJaS0+Z2V0ID0gc3RhdGljX2dldDsKKwkvKiBpLT5wcm9tcHRtb2RlID0gMDsgLSBQUzEgKG1lbXNldCBkaWQgaXQpICovCisJaS0+cCA9IHM7CisJLyogaS0+ZW9mX2ZsYWcgPSAwOyAqLworfQorCisKKy8qCisgKiBvX3N0cmluZyBzdXBwb3J0CisgKi8KKyNkZWZpbmUgQl9DSFVOSyAgKDMyICogc2l6ZW9mKGNoYXIqKSkKKworc3RhdGljIHZvaWQgb19yZXNldF90b19lbXB0eV91bnF1b3RlZChvX3N0cmluZyAqbykKK3sKKwlvLT5sZW5ndGggPSAwOworCW8tPmhhc19xdW90ZWRfcGFydCA9IDA7CisJaWYgKG8tPmRhdGEpCisJCW8tPmRhdGFbMF0gPSAnXDAnOworfQorCitzdGF0aWMgdm9pZCBvX2ZyZWUob19zdHJpbmcgKm8pCit7CisJZnJlZShvLT5kYXRhKTsKKwltZW1zZXQobywgMCwgc2l6ZW9mKCpvKSk7Cit9CisKK3N0YXRpYyBBTFdBWVNfSU5MSU5FIHZvaWQgb19mcmVlX3Vuc2FmZShvX3N0cmluZyAqbykKK3sKKwlmcmVlKG8tPmRhdGEpOworfQorCitzdGF0aWMgdm9pZCBvX2dyb3dfYnkob19zdHJpbmcgKm8sIGludCBsZW4pCit7CisJaWYgKG8tPmxlbmd0aCArIGxlbiA+IG8tPm1heGxlbikgeworCQlvLT5tYXhsZW4gKz0gKDIqbGVuID4gQl9DSFVOSyA/IDIqbGVuIDogQl9DSFVOSyk7CisJCW8tPmRhdGEgPSB4cmVhbGxvYyhvLT5kYXRhLCAxICsgby0+bWF4bGVuKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG9fYWRkY2hyKG9fc3RyaW5nICpvLCBpbnQgY2gpCit7CisJZGVidWdfcHJpbnRmKCJvX2FkZGNocjogJyVjJyBvLT5sZW5ndGg9JWQgbz0lcFxuIiwgY2gsIG8tPmxlbmd0aCwgbyk7CisJb19ncm93X2J5KG8sIDEpOworCW8tPmRhdGFbby0+bGVuZ3RoXSA9IGNoOworCW8tPmxlbmd0aCsrOworCW8tPmRhdGFbby0+bGVuZ3RoXSA9ICdcMCc7Cit9CisKK3N0YXRpYyB2b2lkIG9fYWRkYmxvY2sob19zdHJpbmcgKm8sIGNvbnN0IGNoYXIgKnN0ciwgaW50IGxlbikKK3sKKwlvX2dyb3dfYnkobywgbGVuKTsKKwltZW1jcHkoJm8tPmRhdGFbby0+bGVuZ3RoXSwgc3RyLCBsZW4pOworCW8tPmxlbmd0aCArPSBsZW47CisJby0+ZGF0YVtvLT5sZW5ndGhdID0gJ1wwJzsKK30KKworc3RhdGljIHZvaWQgb19hZGRzdHIob19zdHJpbmcgKm8sIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlvX2FkZGJsb2NrKG8sIHN0ciwgc3RybGVuKHN0cikpOworfQorCisjaWYgIUJCX01NVQorc3RhdGljIHZvaWQgbm9tbXVfYWRkY2hyKG9fc3RyaW5nICpvLCBpbnQgY2gpCit7CisJaWYgKG8pCisJCW9fYWRkY2hyKG8sIGNoKTsKK30KKyNlbHNlCisjIGRlZmluZSBub21tdV9hZGRjaHIobywgc3RyKSAoKHZvaWQpMCkKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBvX2FkZHN0cl93aXRoX05VTChvX3N0cmluZyAqbywgY29uc3QgY2hhciAqc3RyKQoreworCW9fYWRkYmxvY2sobywgc3RyLCBzdHJsZW4oc3RyKSArIDEpOworfQorCisvKgorICogSFVTSF9CUkFDRV9FWFBBTlNJT04gY29kZSBuZWVkcyBjb3JyZXNwb25kaW5nIHF1b3Rpbmcgb24gdmFyaWFibGUgZXhwYW5zaW9uIHNpZGUuCisgKiBDdXJyZW50bHksICJ2PSd7cSx3fSc7IGVjaG8gJHYiIGVycm9uZW91c2x5IGV4cGFuZHMgYnJhY2VzIGluICR2LgorICogQXBwYXJlbnRseSwgb24gdW5xdW90ZWQgJHYgYmFzaCBzdGlsbCBkb2VzIGdsb2JiaW5nCisgKiAoInY9JyoudHh0JzsgZWNobyAkdiIgcHJpbnRzIGFsbCAudHh0IGZpbGVzKSwKKyAqIGJ1dCBOT1QgYnJhY2UgZXhwYW5zaW9uISBUaHVzLCB0aGVyZSBzaG91bGQgYmUgVFdPIGluZGVwZW5kZW50CisgKiBxdW90aW5nIG1lY2hhbmlzbXMgb24gJHYgZXhwYW5zaW9uIHNpZGU6IG9uZSBwcm90ZWN0cworICogJHYgZnJvbSBicmFjZSBleHBhbnNpb24sIGFuZCBvdGhlciBhZGRpdGlvbmFsbHkgcHJvdGVjdHMgIiR2IiBhZ2FpbnN0IGdsb2JiaW5nLgorICogV2UgaGF2ZSBvbmx5IHNlY29uZCBvbmUuCisgKi8KKworI2lmIEVOQUJMRV9IVVNIX0JSQUNFX0VYUEFOU0lPTgorIyBkZWZpbmUgTUFZQkVfQlJBQ0VTICJ7fSIKKyNlbHNlCisjIGRlZmluZSBNQVlCRV9CUkFDRVMgIiIKKyNlbmRpZgorCisvKiBNeSBhbmFseXNpcyBvZiBxdW90aW5nIHNlbWFudGljcyB0ZWxscyBtZSB0aGF0IHN0YXRlIGluZm9ybWF0aW9uCisgKiBpcyBhc3NvY2lhdGVkIHdpdGggYSBkZXN0aW5hdGlvbiwgbm90IGEgc291cmNlLgorICovCitzdGF0aWMgdm9pZCBvX2FkZHFjaHIob19zdHJpbmcgKm8sIGludCBjaCkKK3sKKwlpbnQgc3ogPSAxOworCWNoYXIgKmZvdW5kID0gc3RyY2hyKCIqP1tcXCIgTUFZQkVfQlJBQ0VTLCBjaCk7CisJaWYgKGZvdW5kKQorCQlzeisrOworCW9fZ3Jvd19ieShvLCBzeik7CisJaWYgKGZvdW5kKSB7CisJCW8tPmRhdGFbby0+bGVuZ3RoXSA9ICdcXCc7CisJCW8tPmxlbmd0aCsrOworCX0KKwlvLT5kYXRhW28tPmxlbmd0aF0gPSBjaDsKKwlvLT5sZW5ndGgrKzsKKwlvLT5kYXRhW28tPmxlbmd0aF0gPSAnXDAnOworfQorCitzdGF0aWMgdm9pZCBvX2FkZFFjaHIob19zdHJpbmcgKm8sIGludCBjaCkKK3sKKwlpbnQgc3ogPSAxOworCWlmICgoby0+b19leHBmbGFncyAmIEVYUF9GTEFHX0VTQ19HTE9CX0NIQVJTKQorCSAmJiBzdHJjaHIoIio/W1xcIiBNQVlCRV9CUkFDRVMsIGNoKQorCSkgeworCQlzeisrOworCQlvLT5kYXRhW28tPmxlbmd0aF0gPSAnXFwnOworCQlvLT5sZW5ndGgrKzsKKwl9CisJb19ncm93X2J5KG8sIHN6KTsKKwlvLT5kYXRhW28tPmxlbmd0aF0gPSBjaDsKKwlvLT5sZW5ndGgrKzsKKwlvLT5kYXRhW28tPmxlbmd0aF0gPSAnXDAnOworfQorCitzdGF0aWMgdm9pZCBvX2FkZHFibG9jayhvX3N0cmluZyAqbywgY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuKQoreworCXdoaWxlIChsZW4pIHsKKwkJY2hhciBjaDsKKwkJaW50IHN6OworCQlpbnQgb3JkaW5hcnlfY250ID0gc3RyY3NwbihzdHIsICIqP1tcXCIgTUFZQkVfQlJBQ0VTKTsKKwkJaWYgKG9yZGluYXJ5X2NudCA+IGxlbikgLyogcGFyYW5vaWEgKi8KKwkJCW9yZGluYXJ5X2NudCA9IGxlbjsKKwkJb19hZGRibG9jayhvLCBzdHIsIG9yZGluYXJ5X2NudCk7CisJCWlmIChvcmRpbmFyeV9jbnQgPT0gbGVuKQorCQkJcmV0dXJuOyAvKiBOVUwgaXMgYWxyZWFkeSBhZGRlZCBieSBvX2FkZGJsb2NrICovCisJCXN0ciArPSBvcmRpbmFyeV9jbnQ7CisJCWxlbiAtPSBvcmRpbmFyeV9jbnQgKyAxOyAvKiB3ZSBhcmUgcHJvY2Vzc2luZyArIDEgY2hhciBiZWxvdyAqLworCisJCWNoID0gKnN0cisrOworCQlzeiA9IDE7CisJCWlmIChjaCkgeyAvKiBpdCBpcyBuZWNlc3NhcmlseSBvbmUgb2YgIio/W1xcIiBNQVlCRV9CUkFDRVMgKi8KKwkJCXN6Kys7CisJCQlvLT5kYXRhW28tPmxlbmd0aF0gPSAnXFwnOworCQkJby0+bGVuZ3RoKys7CisJCX0KKwkJb19ncm93X2J5KG8sIHN6KTsKKwkJby0+ZGF0YVtvLT5sZW5ndGhdID0gY2g7CisJCW8tPmxlbmd0aCsrOworCX0KKwlvLT5kYXRhW28tPmxlbmd0aF0gPSAnXDAnOworfQorCitzdGF0aWMgdm9pZCBvX2FkZFFibG9jayhvX3N0cmluZyAqbywgY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuKQoreworCWlmICghKG8tPm9fZXhwZmxhZ3MgJiBFWFBfRkxBR19FU0NfR0xPQl9DSEFSUykpIHsKKwkJb19hZGRibG9jayhvLCBzdHIsIGxlbik7CisJCXJldHVybjsKKwl9CisJb19hZGRxYmxvY2sobywgc3RyLCBsZW4pOworfQorCitzdGF0aWMgdm9pZCBvX2FkZFFzdHIob19zdHJpbmcgKm8sIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlvX2FkZFFibG9jayhvLCBzdHIsIHN0cmxlbihzdHIpKTsKK30KKworLyogQSBzcGVjaWFsIGtpbmQgb2Ygb19zdHJpbmcgZm9yICRWQVIgYW5kIGBjbWRgIGV4cGFuc2lvbi4KKyAqIEl0IGNvbnRhaW5zIGNoYXIqIGxpc3RbXSBhdCB0aGUgYmVnaW5uaW5nLCB3aGljaCBpcyBncm93biBpbiAxNiBlbGVtZW50CisgKiBpbmNyZW1lbnRzLiBBY3R1YWwgc3RyaW5nIGRhdGEgc3RhcnRzIGF0IHRoZSBuZXh0IG11bHRpcGxlIG9mIDE2ICogKGNoYXIqKS4KKyAqIGxpc3RbaV0gY29udGFpbnMgYW4gSU5ERVggKGludCEpIGludG8gdGhpcyBzdHJpbmcgZGF0YS4KKyAqIEl0IG1lYW5zIHRoYXQgaWYgbGlzdFtdIG5lZWRzIHRvIGdyb3csIGRhdGEgbmVlZHMgdG8gYmUgbW92ZWQgaGlnaGVyIHVwCisgKiBidXQgbGlzdFtpXSdzIG5lZWQgbm90IGJlIG1vZGlmaWVkLgorICogTkI6IHJlbWVtYmVyaW5nIGhvdyBtYW55IGxpc3RbaV0ncyB5b3UgaGF2ZSB0aGVyZSBpcyBjcnVjaWFsLgorICogb19maW5hbGl6ZV9saXN0KCkgb3BlcmF0aW9uIHBvc3QtcHJvY2Vzc2VzIHRoaXMgc3RydWN0dXJlIC0gY2FsY3VsYXRlcworICogYW5kIHN0b3JlcyBhY3R1YWwgY2hhciogcHRycyBpbiBsaXN0W10uIE9oLCBpdCBOVUxMIHRlcm1pbmF0ZXMgaXQgYXMgd2VsbC4KKyAqLworI2lmIERFQlVHX0VYUEFORCB8fCBERUJVR19HTE9CCitzdGF0aWMgdm9pZCBkZWJ1Z19wcmludF9saXN0KGNvbnN0IGNoYXIgKnByZWZpeCwgb19zdHJpbmcgKm8sIGludCBuKQoreworCWNoYXIgKipsaXN0ID0gKGNoYXIqKilvLT5kYXRhOworCWludCBzdHJpbmdfc3RhcnQgPSAoKG4gKyAweGYpICYgfjB4ZikgKiBzaXplb2YobGlzdFswXSk7CisJaW50IGkgPSAwOworCisJaW5kZW50KCk7CisJZmRwcmludGYoMiwgIiVzOiBsaXN0OiVwIG46JWQgc3RyaW5nX3N0YXJ0OiVkIGxlbmd0aDolZCBtYXhsZW46JWQgZ2xvYjolZCBxdW90ZWQ6JWQgZXNjYXBlOiVkXG4iLAorCQkJcHJlZml4LCBsaXN0LCBuLCBzdHJpbmdfc3RhcnQsIG8tPmxlbmd0aCwgby0+bWF4bGVuLAorCQkJISEoby0+b19leHBmbGFncyAmIEVYUF9GTEFHX0dMT0IpLAorCQkJby0+aGFzX3F1b3RlZF9wYXJ0LAorCQkJISEoby0+b19leHBmbGFncyAmIEVYUF9GTEFHX0VTQ19HTE9CX0NIQVJTKSk7CisJd2hpbGUgKGkgPCBuKSB7CisJCWluZGVudCgpOworCQlmZHByaW50ZigyLCAiIGxpc3RbJWRdPSVkICclcycgJXBcbiIsIGksIChpbnQpKHVpbnRwdHJfdClsaXN0W2ldLAorCQkJCW8tPmRhdGEgKyAoaW50KSh1aW50cHRyX3QpbGlzdFtpXSArIHN0cmluZ19zdGFydCwKKwkJCQlvLT5kYXRhICsgKGludCkodWludHB0cl90KWxpc3RbaV0gKyBzdHJpbmdfc3RhcnQpOworCQlpKys7CisJfQorCWlmIChuKSB7CisJCWNvbnN0IGNoYXIgKnAgPSBvLT5kYXRhICsgKGludCkodWludHB0cl90KWxpc3RbbiAtIDFdICsgc3RyaW5nX3N0YXJ0OworCQlpbmRlbnQoKTsKKwkJZmRwcmludGYoMiwgIiB0b3RhbF9zejolbGRcbiIsIChsb25nKSgocCArIHN0cmxlbihwKSArIDEpIC0gby0+ZGF0YSkpOworCX0KK30KKyNlbHNlCisjIGRlZmluZSBkZWJ1Z19wcmludF9saXN0KHByZWZpeCwgbywgbikgKCh2b2lkKTApCisjZW5kaWYKKworLyogbiA9IG9fc2F2ZV9wdHJfaGVscGVyKHN0ciwgbikgInN0YXJ0cyBuZXcgc3RyaW5nIiBieSBzdG9yaW5nIGFuIGluZGV4IHZhbHVlCisgKiBpbiBsaXN0W25dIHNvIHRoYXQgaXQgcG9pbnRzIHBhc3QgbGFzdCBzdG9yZWQgYnl0ZSBzbyBmYXIuCisgKiBJdCByZXR1cm5zIG4rMS4gKi8KK3N0YXRpYyBpbnQgb19zYXZlX3B0cl9oZWxwZXIob19zdHJpbmcgKm8sIGludCBuKQoreworCWNoYXIgKipsaXN0ID0gKGNoYXIqKilvLT5kYXRhOworCWludCBzdHJpbmdfc3RhcnQ7CisJaW50IHN0cmluZ19sZW47CisKKwlpZiAoIW8tPmhhc19lbXB0eV9zbG90KSB7CisJCXN0cmluZ19zdGFydCA9ICgobiArIDB4ZikgJiB+MHhmKSAqIHNpemVvZihsaXN0WzBdKTsKKwkJc3RyaW5nX2xlbiA9IG8tPmxlbmd0aCAtIHN0cmluZ19zdGFydDsKKwkJaWYgKCEobiAmIDB4ZikpIHsgLyogMCwgMHgxMCwgMHgyMC4uLj8gKi8KKwkJCWRlYnVnX3ByaW50Zl9saXN0KCJsaXN0WyVkXT0lZCBzdHJpbmdfc3RhcnQ9JWQgKGdyb3dpbmcpXG4iLCBuLCBzdHJpbmdfbGVuLCBzdHJpbmdfc3RhcnQpOworCQkJLyogbGlzdFtuXSBwb2ludHMgdG8gc3RyaW5nX3N0YXJ0LCBtYWtlIHNwYWNlIGZvciAxNiBtb3JlIHBvaW50ZXJzICovCisJCQlvLT5tYXhsZW4gKz0gMHgxMCAqIHNpemVvZihsaXN0WzBdKTsKKwkJCW8tPmRhdGEgPSB4cmVhbGxvYyhvLT5kYXRhLCBvLT5tYXhsZW4gKyAxKTsKKwkJCWxpc3QgPSAoY2hhcioqKW8tPmRhdGE7CisJCQltZW1tb3ZlKGxpc3QgKyBuICsgMHgxMCwgbGlzdCArIG4sIHN0cmluZ19sZW4pOworCQkJby0+bGVuZ3RoICs9IDB4MTAgKiBzaXplb2YobGlzdFswXSk7CisJCX0gZWxzZSB7CisJCQlkZWJ1Z19wcmludGZfbGlzdCgibGlzdFslZF09JWQgc3RyaW5nX3N0YXJ0PSVkXG4iLAorCQkJCQluLCBzdHJpbmdfbGVuLCBzdHJpbmdfc3RhcnQpOworCQl9CisJfSBlbHNlIHsKKwkJLyogV2UgaGF2ZSBlbXB0eSBzbG90IGF0IGxpc3Rbbl0sIHJldXNlIHdpdGhvdXQgZ3Jvd3RoICovCisJCXN0cmluZ19zdGFydCA9ICgobisxICsgMHhmKSAmIH4weGYpICogc2l6ZW9mKGxpc3RbMF0pOyAvKiBOQjogbisxISAqLworCQlzdHJpbmdfbGVuID0gby0+bGVuZ3RoIC0gc3RyaW5nX3N0YXJ0OworCQlkZWJ1Z19wcmludGZfbGlzdCgibGlzdFslZF09JWQgc3RyaW5nX3N0YXJ0PSVkIChlbXB0eSBzbG90KVxuIiwKKwkJCQluLCBzdHJpbmdfbGVuLCBzdHJpbmdfc3RhcnQpOworCQlvLT5oYXNfZW1wdHlfc2xvdCA9IDA7CisJfQorCW8tPmhhc19xdW90ZWRfcGFydCA9IDA7CisJbGlzdFtuXSA9IChjaGFyKikodWludHB0cl90KXN0cmluZ19sZW47CisJcmV0dXJuIG4gKyAxOworfQorCisvKiAiV2hhdCB3YXMgb3VyIGxhc3Qgb19zYXZlX3B0cidlZCBwb3NpdGlvbiAoYnl0ZSBvZmZzZXQgcmVsYXRpdmUgby0+ZGF0YSk/IiAqLworc3RhdGljIGludCBvX2dldF9sYXN0X3B0cihvX3N0cmluZyAqbywgaW50IG4pCit7CisJY2hhciAqKmxpc3QgPSAoY2hhcioqKW8tPmRhdGE7CisJaW50IHN0cmluZ19zdGFydCA9ICgobiArIDB4ZikgJiB+MHhmKSAqIHNpemVvZihsaXN0WzBdKTsKKworCXJldHVybiAoKGludCkodWludHB0cl90KWxpc3Rbbi0xXSkgKyBzdHJpbmdfc3RhcnQ7Cit9CisKKyNpZiBFTkFCTEVfSFVTSF9CUkFDRV9FWFBBTlNJT04KKy8qIFRoZXJlIGluIGEgR05VIGV4dGVuc2lvbiwgR0xPQl9CUkFDRSwgYnV0IGl0IGlzIG5vdCB1c2FibGU6CisgKiBmaXJzdCwgaXQgcHJvY2Vzc2VzIGV2ZW4ge2F9IChubyBjb21tYXMpLCBzZWNvbmQsCisgKiBJIGRpZG4ndCBtYW5hZ2UgdG8gbWFrZSBpdCByZXR1cm4gc3RyaW5ncyB3aGVuIHRoZXkgZG9uJ3QgbWF0Y2gKKyAqIGV4aXN0aW5nIGZpbGVzLiBOZWVkIHRvIHJlLWltcGxlbWVudCBpdC4KKyAqLworCisvKiBIZWxwZXIgKi8KK3N0YXRpYyBpbnQgZ2xvYl9uZWVkZWQoY29uc3QgY2hhciAqcykKK3sKKwl3aGlsZSAoKnMpIHsKKwkJaWYgKCpzID09ICdcXCcpIHsKKwkJCWlmICghc1sxXSkKKwkJCQlyZXR1cm4gMDsKKwkJCXMgKz0gMjsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgqcyA9PSAnKicgfHwgKnMgPT0gJ1snIHx8ICpzID09ICc/JyB8fCAqcyA9PSAneycpCisJCQlyZXR1cm4gMTsKKwkJcysrOworCX0KKwlyZXR1cm4gMDsKK30KKy8qIFJldHVybiBwb2ludGVyIHRvIG5leHQgY2xvc2luZyBicmFjZSBvciB0byBjb21tYSAqLworc3RhdGljIGNvbnN0IGNoYXIgKm5leHRfYnJhY2Vfc3ViKGNvbnN0IGNoYXIgKmNwKQoreworCXVuc2lnbmVkIGRlcHRoID0gMDsKKwljcCsrOworCXdoaWxlICgqY3AgIT0gJ1wwJykgeworCQlpZiAoKmNwID09ICdcXCcpIHsKKwkJCWlmICgqKytjcCA9PSAnXDAnKQorCQkJCWJyZWFrOworCQkJY3ArKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICgoKmNwID09ICd9JyAmJiBkZXB0aC0tID09IDApIHx8ICgqY3AgPT0gJywnICYmIGRlcHRoID09IDApKQorCQkJYnJlYWs7CisJCWlmICgqY3ArKyA9PSAneycpCisJCQlkZXB0aCsrOworCX0KKworCXJldHVybiAqY3AgIT0gJ1wwJyA/IGNwIDogTlVMTDsKK30KKy8qIFJlY3Vyc2l2ZSBicmFjZSBnbG9iYmVyLiBOb3RlOiBtYXkgZ2FyYmxlIHBhdHRlcm5bXS4gKi8KK3N0YXRpYyBpbnQgZ2xvYl9icmFjZShjaGFyICpwYXR0ZXJuLCBvX3N0cmluZyAqbywgaW50IG4pCit7CisJY2hhciAqbmV3X3BhdHRlcm5fYnVmOworCWNvbnN0IGNoYXIgKmJlZ2luOworCWNvbnN0IGNoYXIgKm5leHQ7CisJY29uc3QgY2hhciAqcmVzdDsKKwljb25zdCBjaGFyICpwOworCXNpemVfdCByZXN0X2xlbjsKKworCWRlYnVnX3ByaW50Zl9nbG9iKCJnbG9iX2JyYWNlKCclcycpXG4iLCBwYXR0ZXJuKTsKKworCWJlZ2luID0gcGF0dGVybjsKKwl3aGlsZSAoMSkgeworCQlpZiAoKmJlZ2luID09ICdcMCcpCisJCQlnb3RvIHNpbXBsZV9nbG9iOworCQlpZiAoKmJlZ2luID09ICd7JykgeworCQkJLyogRmluZCB0aGUgZmlyc3Qgc3ViLXBhdHRlcm4gYW5kIGF0IHRoZSBzYW1lIHRpbWUKKwkJCSAqIGZpbmQgdGhlIHJlc3QgYWZ0ZXIgdGhlIGNsb3NpbmcgYnJhY2UgKi8KKwkJCW5leHQgPSBuZXh0X2JyYWNlX3N1YihiZWdpbik7CisJCQlpZiAobmV4dCA9PSBOVUxMKSB7CisJCQkJLyogQW4gaWxsZWdhbCBleHByZXNzaW9uICovCisJCQkJZ290byBzaW1wbGVfZ2xvYjsKKwkJCX0KKwkJCWlmICgqbmV4dCA9PSAnfScpIHsKKwkJCQkvKiAie2FiY30iIHdpdGggbm8gY29tbWFzIC0gaWxsZWdhbAorCQkJCSAqIGJyYWNlIGV4cHIsIGRpc3JlZ2FyZCBhbmQgc2tpcCBpdCAqLworCQkJCWJlZ2luID0gbmV4dCArIDE7CisJCQkJY29udGludWU7CisJCQl9CisJCQlicmVhazsKKwkJfQorCQlpZiAoKmJlZ2luID09ICdcXCcgJiYgYmVnaW5bMV0gIT0gJ1wwJykKKwkJCWJlZ2luKys7CisJCWJlZ2luKys7CisJfQorCWRlYnVnX3ByaW50Zl9nbG9iKCJiZWdpbjolc1xuIiwgYmVnaW4pOworCWRlYnVnX3ByaW50Zl9nbG9iKCJuZXh0OiVzXG4iLCBuZXh0KTsKKworCS8qIE5vdyBmaW5kIHRoZSBlbmQgb2YgdGhlIHdob2xlIGJyYWNlIGV4cHJlc3Npb24gKi8KKwlyZXN0ID0gbmV4dDsKKwl3aGlsZSAoKnJlc3QgIT0gJ30nKSB7CisJCXJlc3QgPSBuZXh0X2JyYWNlX3N1YihyZXN0KTsKKwkJaWYgKHJlc3QgPT0gTlVMTCkgeworCQkJLyogQW4gaWxsZWdhbCBleHByZXNzaW9uICovCisJCQlnb3RvIHNpbXBsZV9nbG9iOworCQl9CisJCWRlYnVnX3ByaW50Zl9nbG9iKCJyZXN0OiVzXG4iLCByZXN0KTsKKwl9CisJcmVzdF9sZW4gPSBzdHJsZW4oKytyZXN0KSArIDE7CisKKwkvKiBXZSBhcmUgc3VyZSB0aGUgYnJhY2UgZXhwcmVzc2lvbiBpcyB3ZWxsLWZvcm1lZCAqLworCisJLyogQWxsb2NhdGUgd29ya2luZyBidWZmZXIgbGFyZ2UgZW5vdWdoIGZvciBvdXIgd29yayAqLworCW5ld19wYXR0ZXJuX2J1ZiA9IHhtYWxsb2Moc3RybGVuKHBhdHRlcm4pKTsKKworCS8qIFdlIGhhdmUgYSBicmFjZSBleHByZXNzaW9uLiAgQkVHSU4gcG9pbnRzIHRvIHRoZSBvcGVuaW5nIHssCisJICogTkVYVCBwb2ludHMgcGFzdCB0aGUgdGVybWluYXRvciBvZiB0aGUgZmlyc3QgZWxlbWVudCwgYW5kIFJFU1QKKwkgKiBwb2ludHMgcGFzdCB0aGUgZmluYWwgfS4gIFdlIHdpbGwgYWNjdW11bGF0ZSByZXN1bHQgbmFtZXMgZnJvbQorCSAqIHJlY3Vyc2l2ZSBydW5zIGZvciBlYWNoIGJyYWNlIGFsdGVybmF0aXZlIGluIHRoZSBidWZmZXIgdXNpbmcKKwkgKiBHTE9CX0FQUEVORC4gICovCisKKwlwID0gYmVnaW4gKyAxOworCXdoaWxlICgxKSB7CisJCS8qIENvbnN0cnVjdCB0aGUgbmV3IGdsb2IgZXhwcmVzc2lvbiAqLworCQltZW1jcHkoCisJCQltZW1wY3B5KAorCQkJCW1lbXBjcHkobmV3X3BhdHRlcm5fYnVmLAorCQkJCQkvKiBXZSBrbm93IHRoZSBwcmVmaXggZm9yIGFsbCBzdWItcGF0dGVybnMgKi8KKwkJCQkJcGF0dGVybiwgYmVnaW4gLSBwYXR0ZXJuKSwKKwkJCQlwLCBuZXh0IC0gcCksCisJCQlyZXN0LCByZXN0X2xlbik7CisKKwkJLyogTm90ZTogZ2xvYl9icmFjZSgpIG1heSBnYXJibGUgbmV3X3BhdHRlcm5fYnVmW10uCisJCSAqIFRoYXQncyB3aHkgd2UgcmUtY29weSBwcmVmaXggZXZlcnkgdGltZSAoMXN0IG1lbWNweSBhYm92ZSkuCisJCSAqLworCQluID0gZ2xvYl9icmFjZShuZXdfcGF0dGVybl9idWYsIG8sIG4pOworCQlpZiAoKm5leHQgPT0gJ30nKSB7CisJCQkvKiBXZSBzYXcgdGhlIGxhc3QgZW50cnkgKi8KKwkJCWJyZWFrOworCQl9CisJCXAgPSBuZXh0ICsgMTsKKwkJbmV4dCA9IG5leHRfYnJhY2Vfc3ViKG5leHQpOworCX0KKwlmcmVlKG5ld19wYXR0ZXJuX2J1Zik7CisJcmV0dXJuIG47CisKKyBzaW1wbGVfZ2xvYjoKKwl7CisJCWludCBncjsKKwkJZ2xvYl90IGdsb2JkYXRhOworCisJCW1lbXNldCgmZ2xvYmRhdGEsIDAsIHNpemVvZihnbG9iZGF0YSkpOworCQlnciA9IGdsb2IocGF0dGVybiwgMCwgTlVMTCwgJmdsb2JkYXRhKTsKKwkJZGVidWdfcHJpbnRmX2dsb2IoImdsb2IoJyVzJyk6JWRcbiIsIHBhdHRlcm4sIGdyKTsKKwkJaWYgKGdyICE9IDApIHsKKwkJCWlmIChnciA9PSBHTE9CX05PTUFUQ0gpIHsKKwkJCQlnbG9iZnJlZSgmZ2xvYmRhdGEpOworCQkJCS8qIE5COiBnYXJibGVzIHBhcmFtZXRlciAqLworCQkJCXVuYmFja3NsYXNoKHBhdHRlcm4pOworCQkJCW9fYWRkc3RyX3dpdGhfTlVMKG8sIHBhdHRlcm4pOworCQkJCWRlYnVnX3ByaW50Zl9nbG9iKCJnbG9iIHBhdHRlcm4gJyVzJyBpcyBsaXRlcmFsXG4iLCBwYXR0ZXJuKTsKKwkJCQlyZXR1cm4gb19zYXZlX3B0cl9oZWxwZXIobywgbik7CisJCQl9CisJCQlpZiAoZ3IgPT0gR0xPQl9OT1NQQUNFKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19tZW1vcnlfZXhoYXVzdGVkKTsKKwkJCS8qIEdMT0JfQUJPUlRFRD8gT25seSBoYXBwZW5zIHdpdGggR0xPQl9FUlIgZmxhZywKKwkJCSAqIGJ1dCB3ZSBkaWRuJ3Qgc3BlY2lmeSBpdC4gUGFyYW5vaWEgYWdhaW4uICovCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZ2xvYiBlcnJvciAlZCBvbiAnJXMnIiwgZ3IsIHBhdHRlcm4pOworCQl9CisJCWlmIChnbG9iZGF0YS5nbF9wYXRodiAmJiBnbG9iZGF0YS5nbF9wYXRodlswXSkgeworCQkJY2hhciAqKmFyZ3YgPSBnbG9iZGF0YS5nbF9wYXRodjsKKwkJCXdoaWxlICgxKSB7CisJCQkJb19hZGRzdHJfd2l0aF9OVUwobywgKmFyZ3YpOworCQkJCW4gPSBvX3NhdmVfcHRyX2hlbHBlcihvLCBuKTsKKwkJCQlhcmd2Kys7CisJCQkJaWYgKCEqYXJndikKKwkJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJZ2xvYmZyZWUoJmdsb2JkYXRhKTsKKwl9CisJcmV0dXJuIG47Cit9CisvKiBQZXJmb3JtcyBnbG9iYmluZyBvbiBsYXN0IGxpc3RbXSwKKyAqIHNhdmluZyBlYWNoIHJlc3VsdCBhcyBhIG5ldyBsaXN0W10uCisgKi8KK3N0YXRpYyBpbnQgcGVyZm9ybV9nbG9iKG9fc3RyaW5nICpvLCBpbnQgbikKK3sKKwljaGFyICpwYXR0ZXJuLCAqY29weTsKKworCWRlYnVnX3ByaW50Zl9nbG9iKCJzdGFydCBwZXJmb3JtX2dsb2I6IG46JWQgby0+ZGF0YTolcFxuIiwgbiwgby0+ZGF0YSk7CisJaWYgKCFvLT5kYXRhKQorCQlyZXR1cm4gb19zYXZlX3B0cl9oZWxwZXIobywgbik7CisJcGF0dGVybiA9IG8tPmRhdGEgKyBvX2dldF9sYXN0X3B0cihvLCBuKTsKKwlkZWJ1Z19wcmludGZfZ2xvYigiZ2xvYiBwYXR0ZXJuICclcydcbiIsIHBhdHRlcm4pOworCWlmICghZ2xvYl9uZWVkZWQocGF0dGVybikpIHsKKwkJLyogdW5iYWNrc2xhc2ggbGFzdCBzdHJpbmcgaW4gbyBpbiBwbGFjZSwgZml4IGxlbmd0aCAqLworCQlvLT5sZW5ndGggPSB1bmJhY2tzbGFzaChwYXR0ZXJuKSAtIG8tPmRhdGE7CisJCWRlYnVnX3ByaW50Zl9nbG9iKCJnbG9iIHBhdHRlcm4gJyVzJyBpcyBsaXRlcmFsXG4iLCBwYXR0ZXJuKTsKKwkJcmV0dXJuIG9fc2F2ZV9wdHJfaGVscGVyKG8sIG4pOworCX0KKworCWNvcHkgPSB4c3RyZHVwKHBhdHRlcm4pOworCS8qICJmb3JnZXQiIHBhdHRlcm4gaW4gbyAqLworCW8tPmxlbmd0aCA9IHBhdHRlcm4gLSBvLT5kYXRhOworCW4gPSBnbG9iX2JyYWNlKGNvcHksIG8sIG4pOworCWZyZWUoY29weSk7CisJaWYgKERFQlVHX0dMT0IpCisJCWRlYnVnX3ByaW50X2xpc3QoInBlcmZvcm1fZ2xvYiByZXR1cm5pbmciLCBvLCBuKTsKKwlyZXR1cm4gbjsKK30KKworI2Vsc2UgLyogIUhVU0hfQlJBQ0VfRVhQQU5TSU9OICovCisKKy8qIEhlbHBlciAqLworc3RhdGljIGludCBnbG9iX25lZWRlZChjb25zdCBjaGFyICpzKQoreworCXdoaWxlICgqcykgeworCQlpZiAoKnMgPT0gJ1xcJykgeworCQkJaWYgKCFzWzFdKQorCQkJCXJldHVybiAwOworCQkJcyArPSAyOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCpzID09ICcqJyB8fCAqcyA9PSAnWycgfHwgKnMgPT0gJz8nKQorCQkJcmV0dXJuIDE7CisJCXMrKzsKKwl9CisJcmV0dXJuIDA7Cit9CisvKiBQZXJmb3JtcyBnbG9iYmluZyBvbiBsYXN0IGxpc3RbXSwKKyAqIHNhdmluZyBlYWNoIHJlc3VsdCBhcyBhIG5ldyBsaXN0W10uCisgKi8KK3N0YXRpYyBpbnQgcGVyZm9ybV9nbG9iKG9fc3RyaW5nICpvLCBpbnQgbikKK3sKKwlnbG9iX3QgZ2xvYmRhdGE7CisJaW50IGdyOworCWNoYXIgKnBhdHRlcm47CisKKwlkZWJ1Z19wcmludGZfZ2xvYigic3RhcnQgcGVyZm9ybV9nbG9iOiBuOiVkIG8tPmRhdGE6JXBcbiIsIG4sIG8tPmRhdGEpOworCWlmICghby0+ZGF0YSkKKwkJcmV0dXJuIG9fc2F2ZV9wdHJfaGVscGVyKG8sIG4pOworCXBhdHRlcm4gPSBvLT5kYXRhICsgb19nZXRfbGFzdF9wdHIobywgbik7CisJZGVidWdfcHJpbnRmX2dsb2IoImdsb2IgcGF0dGVybiAnJXMnXG4iLCBwYXR0ZXJuKTsKKwlpZiAoIWdsb2JfbmVlZGVkKHBhdHRlcm4pKSB7CisgbGl0ZXJhbDoKKwkJLyogdW5iYWNrc2xhc2ggbGFzdCBzdHJpbmcgaW4gbyBpbiBwbGFjZSwgZml4IGxlbmd0aCAqLworCQlvLT5sZW5ndGggPSB1bmJhY2tzbGFzaChwYXR0ZXJuKSAtIG8tPmRhdGE7CisJCWRlYnVnX3ByaW50Zl9nbG9iKCJnbG9iIHBhdHRlcm4gJyVzJyBpcyBsaXRlcmFsXG4iLCBwYXR0ZXJuKTsKKwkJcmV0dXJuIG9fc2F2ZV9wdHJfaGVscGVyKG8sIG4pOworCX0KKworCW1lbXNldCgmZ2xvYmRhdGEsIDAsIHNpemVvZihnbG9iZGF0YSkpOworCS8qIENhbid0IHVzZSBHTE9CX05PQ0hFQ0s6IGl0IGRvZXMgbm90IHVuZXNjYXBlIHRoZSBzdHJpbmcuCisJICogSWYgd2UgZ2xvYiAiKi5cKiIgYW5kIGRvbid0IGZpbmQgYW55dGhpbmcsIHdlIG5lZWQKKwkgKiB0byBmYWxsIGJhY2sgdG8gdXNpbmcgbGl0ZXJhbCAiKi4qIiwgYnV0IEdMT0JfTk9DSEVDSworCSAqIHdpbGwgcmV0dXJuICIqLlwqIiEKKwkgKi8KKwlnciA9IGdsb2IocGF0dGVybiwgMCwgTlVMTCwgJmdsb2JkYXRhKTsKKwlkZWJ1Z19wcmludGZfZ2xvYigiZ2xvYignJXMnKTolZFxuIiwgcGF0dGVybiwgZ3IpOworCWlmIChnciAhPSAwKSB7CisJCWlmIChnciA9PSBHTE9CX05PTUFUQ0gpIHsKKwkJCWdsb2JmcmVlKCZnbG9iZGF0YSk7CisJCQlnb3RvIGxpdGVyYWw7CisJCX0KKwkJaWYgKGdyID09IEdMT0JfTk9TUEFDRSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ19tZW1vcnlfZXhoYXVzdGVkKTsKKwkJLyogR0xPQl9BQk9SVEVEPyBPbmx5IGhhcHBlbnMgd2l0aCBHTE9CX0VSUiBmbGFnLAorCQkgKiBidXQgd2UgZGlkbid0IHNwZWNpZnkgaXQuIFBhcmFub2lhIGFnYWluLiAqLworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiZ2xvYiBlcnJvciAlZCBvbiAnJXMnIiwgZ3IsIHBhdHRlcm4pOworCX0KKwlpZiAoZ2xvYmRhdGEuZ2xfcGF0aHYgJiYgZ2xvYmRhdGEuZ2xfcGF0aHZbMF0pIHsKKwkJY2hhciAqKmFyZ3YgPSBnbG9iZGF0YS5nbF9wYXRodjsKKwkJLyogImZvcmdldCIgcGF0dGVybiBpbiBvICovCisJCW8tPmxlbmd0aCA9IHBhdHRlcm4gLSBvLT5kYXRhOworCQl3aGlsZSAoMSkgeworCQkJb19hZGRzdHJfd2l0aF9OVUwobywgKmFyZ3YpOworCQkJbiA9IG9fc2F2ZV9wdHJfaGVscGVyKG8sIG4pOworCQkJYXJndisrOworCQkJaWYgKCEqYXJndikKKwkJCQlicmVhazsKKwkJfQorCX0KKwlnbG9iZnJlZSgmZ2xvYmRhdGEpOworCWlmIChERUJVR19HTE9CKQorCQlkZWJ1Z19wcmludF9saXN0KCJwZXJmb3JtX2dsb2IgcmV0dXJuaW5nIiwgbywgbik7CisJcmV0dXJuIG47Cit9CisKKyNlbmRpZiAvKiAhSFVTSF9CUkFDRV9FWFBBTlNJT04gKi8KKworLyogSWYgby0+b19leHBmbGFncyAmIEVYUF9GTEFHX0dMT0IsIGdsb2IgdGhlIHN0cmluZyBzbyBmYXIgcmVtZW1iZXJlZC4KKyAqIE90aGVyd2lzZSwganVzdCBmaW5pc2ggY3VycmVudCBsaXN0W10gYW5kIHN0YXJ0IG5ldyAqLworc3RhdGljIGludCBvX3NhdmVfcHRyKG9fc3RyaW5nICpvLCBpbnQgbikKK3sKKwlpZiAoby0+b19leHBmbGFncyAmIEVYUF9GTEFHX0dMT0IpIHsKKwkJLyogSWYgby0+aGFzX2VtcHR5X3Nsb3QsIGxpc3Rbbl0gd2FzIGFscmVhZHkgZ2xvYmJlZAorCQkgKiAoaWYgaXQgd2FzIHJlcXVlc3RlZCBiYWNrIHRoZW4gd2hlbiBpdCB3YXMgZmlsbGVkKQorCQkgKiBzbyBkb24ndCBkbyB0aGF0IGFnYWluISAqLworCQlpZiAoIW8tPmhhc19lbXB0eV9zbG90KQorCQkJcmV0dXJuIHBlcmZvcm1fZ2xvYihvLCBuKTsgLyogb19zYXZlX3B0cl9oZWxwZXIgaXMgaW5zaWRlICovCisJfQorCXJldHVybiBvX3NhdmVfcHRyX2hlbHBlcihvLCBuKTsKK30KKworLyogIlBsZWFzZSBjb252ZXJ0IGxpc3Rbbl0gdG8gcmVhbCBjaGFyKiBwdHJzLCBhbmQgTlVMTCB0ZXJtaW5hdGUgaXQuIiAqLworc3RhdGljIGNoYXIgKipvX2ZpbmFsaXplX2xpc3Qob19zdHJpbmcgKm8sIGludCBuKQoreworCWNoYXIgKipsaXN0OworCWludCBzdHJpbmdfc3RhcnQ7CisKKwluID0gb19zYXZlX3B0cihvLCBuKTsgLyogZm9yY2UgZ3Jvd3RoIGZvciBsaXN0W25dIGlmIG5lY2Vzc2FyeSAqLworCWlmIChERUJVR19FWFBBTkQpCisJCWRlYnVnX3ByaW50X2xpc3QoImZpbmFsaXplZCIsIG8sIG4pOworCWRlYnVnX3ByaW50Zl9leHBhbmQoImZpbmFsaXplZCBuOiVkXG4iLCBuKTsKKwlsaXN0ID0gKGNoYXIqKilvLT5kYXRhOworCXN0cmluZ19zdGFydCA9ICgobiArIDB4ZikgJiB+MHhmKSAqIHNpemVvZihsaXN0WzBdKTsKKwlsaXN0Wy0tbl0gPSBOVUxMOworCXdoaWxlIChuKSB7CisJCW4tLTsKKwkJbGlzdFtuXSA9IG8tPmRhdGEgKyAoaW50KSh1aW50cHRyX3QpbGlzdFtuXSArIHN0cmluZ19zdGFydDsKKwl9CisJcmV0dXJuIGxpc3Q7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfcGlwZV9saXN0KHN0cnVjdCBwaXBlICpwaSk7CisKKy8qIFJldHVybnMgcGktPm5leHQgLSBuZXh0IHBpcGUgaW4gdGhlIGxpc3QgKi8KK3N0YXRpYyBzdHJ1Y3QgcGlwZSAqZnJlZV9waXBlKHN0cnVjdCBwaXBlICpwaSkKK3sKKwlzdHJ1Y3QgcGlwZSAqbmV4dDsKKwlpbnQgaTsKKworCWRlYnVnX3ByaW50Zl9jbGVhbigiZnJlZV9waXBlIChwaWQgJWQpXG4iLCBnZXRwaWQoKSk7CisJZm9yIChpID0gMDsgaSA8IHBpLT5udW1fY21kczsgaSsrKSB7CisJCXN0cnVjdCBjb21tYW5kICpjb21tYW5kOworCQlzdHJ1Y3QgcmVkaXJfc3RydWN0ICpyLCAqcm5leHQ7CisKKwkJY29tbWFuZCA9ICZwaS0+Y21kc1tpXTsKKwkJZGVidWdfcHJpbnRmX2NsZWFuKCIgIGNvbW1hbmQgJWQ6XG4iLCBpKTsKKwkJaWYgKGNvbW1hbmQtPmFyZ3YpIHsKKwkJCWlmIChERUJVR19DTEVBTikgeworCQkJCWludCBhOworCQkJCWNoYXIgKipwOworCQkJCWZvciAoYSA9IDAsIHAgPSBjb21tYW5kLT5hcmd2OyAqcDsgYSsrLCBwKyspIHsKKwkJCQkJZGVidWdfcHJpbnRmX2NsZWFuKCIgICBhcmd2WyVkXSA9ICVzXG4iLCBhLCAqcCk7CisJCQkJfQorCQkJfQorCQkJZnJlZV9zdHJpbmdzKGNvbW1hbmQtPmFyZ3YpOworCQkJLy9jb21tYW5kLT5hcmd2ID0gTlVMTDsKKwkJfQorCQkvKiBub3QgImVsc2UgaWYiOiBvbiBzeW50YXggZXJyb3IsIHdlIG1heSBoYXZlIGJvdGghICovCisJCWlmIChjb21tYW5kLT5ncm91cCkgeworCQkJZGVidWdfcHJpbnRmX2NsZWFuKCIgICBiZWdpbiBncm91cCAoY21kX3R5cGU6JWQpXG4iLAorCQkJCQljb21tYW5kLT5jbWRfdHlwZSk7CisJCQlmcmVlX3BpcGVfbGlzdChjb21tYW5kLT5ncm91cCk7CisJCQlkZWJ1Z19wcmludGZfY2xlYW4oIiAgIGVuZCBncm91cFxuIik7CisJCQkvL2NvbW1hbmQtPmdyb3VwID0gTlVMTDsKKwkJfQorCQkvKiBlbHNlIGlzIGNydWNpYWwgaGVyZS4KKwkJICogSWYgZ3JvdXAgIT0gTlVMTCwgY2hpbGRfZnVuYyBpcyBtZWFuaW5nbGVzcyAqLworI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCQllbHNlIGlmIChjb21tYW5kLT5jaGlsZF9mdW5jKSB7CisJCQlkZWJ1Z19wcmludGZfZXhlYygiY21kICVwIHJlbGVhc2VzIGNoaWxkIGZ1bmMgYXQgJXBcbiIsIGNvbW1hbmQsIGNvbW1hbmQtPmNoaWxkX2Z1bmMpOworCQkJY29tbWFuZC0+Y2hpbGRfZnVuYy0+cGFyZW50X2NtZCA9IE5VTEw7CisJCX0KKyNlbmRpZgorI2lmICFCQl9NTVUKKwkJZnJlZShjb21tYW5kLT5ncm91cF9hc19zdHJpbmcpOworCQkvL2NvbW1hbmQtPmdyb3VwX2FzX3N0cmluZyA9IE5VTEw7CisjZW5kaWYKKwkJZm9yIChyID0gY29tbWFuZC0+cmVkaXJlY3RzOyByOyByID0gcm5leHQpIHsKKwkJCWRlYnVnX3ByaW50Zl9jbGVhbigiICAgcmVkaXJlY3QgJWQlcyIsCisJCQkJCXItPnJkX2ZkLCByZWRpcl90YWJsZVtyLT5yZF90eXBlXS5kZXNjcmlwKTsKKwkJCS8qIGd1YXJkIGFnYWluc3QgdGhlIGNhc2UgPiRGT08sIHdoZXJlIGZvbyBpcyB1bnNldCBvciBibGFuayAqLworCQkJaWYgKHItPnJkX2ZpbGVuYW1lKSB7CisJCQkJZGVidWdfcHJpbnRmX2NsZWFuKCIgZm5hbWU6JyVzJ1xuIiwgci0+cmRfZmlsZW5hbWUpOworCQkJCWZyZWUoci0+cmRfZmlsZW5hbWUpOworCQkJCS8vci0+cmRfZmlsZW5hbWUgPSBOVUxMOworCQkJfQorCQkJZGVidWdfcHJpbnRmX2NsZWFuKCIgcmRfZHVwOiVkXG4iLCByLT5yZF9kdXApOworCQkJcm5leHQgPSByLT5uZXh0OworCQkJZnJlZShyKTsKKwkJfQorCQkvL2NvbW1hbmQtPnJlZGlyZWN0cyA9IE5VTEw7CisJfQorCWZyZWUocGktPmNtZHMpOyAgIC8qIGNoaWxkcmVuIGFyZSBhbiBhcnJheSwgdGhleSBnZXQgZnJlZWQgYWxsIGF0IG9uY2UgKi8KKwkvL3BpLT5jbWRzID0gTlVMTDsKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwlmcmVlKHBpLT5jbWR0ZXh0KTsKKwkvL3BpLT5jbWR0ZXh0ID0gTlVMTDsKKyNlbmRpZgorCisJbmV4dCA9IHBpLT5uZXh0OworCWZyZWUocGkpOworCXJldHVybiBuZXh0OworfQorCitzdGF0aWMgdm9pZCBmcmVlX3BpcGVfbGlzdChzdHJ1Y3QgcGlwZSAqcGkpCit7CisJd2hpbGUgKHBpKSB7CisjaWYgSEFTX0tFWVdPUkRTCisJCWRlYnVnX3ByaW50Zl9jbGVhbigicGlwZSByZXNlcnZlZCB3b3JkICVkXG4iLCBwaS0+cmVzX3dvcmQpOworI2VuZGlmCisJCWRlYnVnX3ByaW50Zl9jbGVhbigicGlwZSBmb2xsb3d1cCBjb2RlICVkXG4iLCBwaS0+Zm9sbG93dXApOworCQlwaSA9IGZyZWVfcGlwZShwaSk7CisJfQorfQorCisKKy8qKiogUGFyc2luZyByb3V0aW5lcyAqKiovCisKKyNpZm5kZWYgZGVidWdfcHJpbnRfdHJlZQorc3RhdGljIHZvaWQgZGVidWdfcHJpbnRfdHJlZShzdHJ1Y3QgcGlwZSAqcGksIGludCBsdmwpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IFBJUEVbXSA9IHsKKwkJW1BJUEVfU0VRXSA9ICJTRVEiLAorCQlbUElQRV9BTkRdID0gIkFORCIsCisJCVtQSVBFX09SIF0gPSAiT1IiICwKKwkJW1BJUEVfQkcgXSA9ICJCRyIgLAorCX07CisJc3RhdGljIGNvbnN0IGNoYXIgKlJFU1tdID0geworCQlbUkVTX05PTkUgXSA9ICJOT05FIiAsCisjIGlmIEVOQUJMRV9IVVNIX0lGCisJCVtSRVNfSUYgICBdID0gIklGIiAgICwKKwkJW1JFU19USEVOIF0gPSAiVEhFTiIgLAorCQlbUkVTX0VMSUYgXSA9ICJFTElGIiAsCisJCVtSRVNfRUxTRSBdID0gIkVMU0UiICwKKwkJW1JFU19GSSAgIF0gPSAiRkkiICAgLAorIyBlbmRpZgorIyBpZiBFTkFCTEVfSFVTSF9MT09QUworCQlbUkVTX0ZPUiAgXSA9ICJGT1IiICAsCisJCVtSRVNfV0hJTEVdID0gIldISUxFIiwKKwkJW1JFU19VTlRJTF0gPSAiVU5USUwiLAorCQlbUkVTX0RPICAgXSA9ICJETyIgICAsCisJCVtSRVNfRE9ORSBdID0gIkRPTkUiICwKKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0hVU0hfTE9PUFMgfHwgRU5BQkxFX0hVU0hfQ0FTRQorCQlbUkVTX0lOICAgXSA9ICJJTiIgICAsCisjIGVuZGlmCisjIGlmIEVOQUJMRV9IVVNIX0NBU0UKKwkJW1JFU19DQVNFIF0gPSAiQ0FTRSIgLAorCQlbUkVTX0NBU0VfSU4gXSA9ICJDQVNFX0lOIiAsCisJCVtSRVNfTUFUQ0hdID0gIk1BVENIIiwKKwkJW1JFU19DQVNFX0JPRFldID0gIkNBU0VfQk9EWSIsCisJCVtSRVNfRVNBQyBdID0gIkVTQUMiICwKKyMgZW5kaWYKKwkJW1JFU19YWFhYIF0gPSAiWFhYWCIgLAorCQlbUkVTX1NOVFggXSA9ICJTTlRYIiAsCisJfTsKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgQ01EVFlQRVtdID0geworCQkie30iLAorCQkiKCkiLAorCQkiW25vZ2xvYl0iLAorIyBpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwkJImZ1bmMoKSIsCisjIGVuZGlmCisJfTsKKworCWludCBwaW4sIHBybjsKKworCXBpbiA9IDA7CisJd2hpbGUgKHBpKSB7CisJCWZkcHJpbnRmKDIsICIlKnNwaXBlICVkIHJlc193b3JkPSVzIGZvbGxvd3VwPSVkICVzXG4iLCBsdmwqMiwgIiIsCisJCQkJcGluLCBSRVNbcGktPnJlc193b3JkXSwgcGktPmZvbGxvd3VwLCBQSVBFW3BpLT5mb2xsb3d1cF0pOworCQlwcm4gPSAwOworCQl3aGlsZSAocHJuIDwgcGktPm51bV9jbWRzKSB7CisJCQlzdHJ1Y3QgY29tbWFuZCAqY29tbWFuZCA9ICZwaS0+Y21kc1twcm5dOworCQkJY2hhciAqKmFyZ3YgPSBjb21tYW5kLT5hcmd2OworCisJCQlmZHByaW50ZigyLCAiJSpzIGNtZCAlZCBhc3NpZ25tZW50X2NudDolZCIsCisJCQkJCWx2bCoyLCAiIiwgcHJuLAorCQkJCQljb21tYW5kLT5hc3NpZ25tZW50X2NudCk7CisJCQlpZiAoY29tbWFuZC0+Z3JvdXApIHsKKwkJCQlmZHByaW50ZigyLCAiIGdyb3VwICVzOiAoYXJndj0lcCklcyVzXG4iLAorCQkJCQkJQ01EVFlQRVtjb21tYW5kLT5jbWRfdHlwZV0sCisJCQkJCQlhcmd2CisjIGlmICFCQl9NTVUKKwkJCQkJCSwgIiBncm91cF9hc19zdHJpbmc6IiwgY29tbWFuZC0+Z3JvdXBfYXNfc3RyaW5nCisjIGVsc2UKKwkJCQkJCSwgIiIsICIiCisjIGVuZGlmCisJCQkJKTsKKwkJCQlkZWJ1Z19wcmludF90cmVlKGNvbW1hbmQtPmdyb3VwLCBsdmwrMSk7CisJCQkJcHJuKys7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoYXJndikgd2hpbGUgKCphcmd2KSB7CisJCQkJZmRwcmludGYoMiwgIiAnJXMnIiwgKmFyZ3YpOworCQkJCWFyZ3YrKzsKKwkJCX0KKwkJCWZkcHJpbnRmKDIsICJcbiIpOworCQkJcHJuKys7CisJCX0KKwkJcGkgPSBwaS0+bmV4dDsKKwkJcGluKys7CisJfQorfQorI2VuZGlmIC8qIGRlYnVnX3ByaW50X3RyZWUgKi8KKworc3RhdGljIHN0cnVjdCBwaXBlICpuZXdfcGlwZSh2b2lkKQoreworCXN0cnVjdCBwaXBlICpwaTsKKwlwaSA9IHh6YWxsb2Moc2l6ZW9mKHN0cnVjdCBwaXBlKSk7CisJLypwaS0+Zm9sbG93dXAgPSAwOyAtIGRlbGliZXJhdGVseSBpbnZhbGlkIHZhbHVlICovCisJLypwaS0+cmVzX3dvcmQgPSBSRVNfTk9ORTsgLSBSRVNfTk9ORSBpcyAwIGFueXdheSAqLworCXJldHVybiBwaTsKK30KKworLyogQ29tbWFuZCAobWVtYmVyIG9mIGEgcGlwZSkgaXMgY29tcGxldGUsIG9yIHdlIHN0YXJ0IGEgbmV3IHBpcGUKKyAqIGlmIGN0eC0+Y29tbWFuZCBpcyBOVUxMLgorICogTm8gZXJyb3JzIHBvc3NpYmxlIGhlcmUuCisgKi8KK3N0YXRpYyBpbnQgZG9uZV9jb21tYW5kKHN0cnVjdCBwYXJzZV9jb250ZXh0ICpjdHgpCit7CisJLyogVGhlIGNvbW1hbmQgaXMgcmVhbGx5IGFscmVhZHkgaW4gdGhlIHBpcGUgc3RydWN0dXJlLCBzbworCSAqIGFkdmFuY2UgdGhlIHBpcGUgY291bnRlciBhbmQgbWFrZSBhIG5ldywgbnVsbCBjb21tYW5kLiAqLworCXN0cnVjdCBwaXBlICpwaSA9IGN0eC0+cGlwZTsKKwlzdHJ1Y3QgY29tbWFuZCAqY29tbWFuZCA9IGN0eC0+Y29tbWFuZDsKKworCWlmIChjb21tYW5kKSB7CisJCWlmIChJU19OVUxMX0NNRChjb21tYW5kKSkgeworCQkJZGVidWdfcHJpbnRmX3BhcnNlKCJkb25lX2NvbW1hbmQ6IHNraXBwaW5nIG51bGwgY21kLCBudW1fY21kcz0lZFxuIiwgcGktPm51bV9jbWRzKTsKKwkJCWdvdG8gY2xlYXJfYW5kX3JldDsKKwkJfQorCQlwaS0+bnVtX2NtZHMrKzsKKwkJZGVidWdfcHJpbnRmX3BhcnNlKCJkb25lX2NvbW1hbmQ6ICsrbnVtX2NtZHM9JWRcbiIsIHBpLT5udW1fY21kcyk7CisJCS8vZGVidWdfcHJpbnRfdHJlZShjdHgtPmxpc3RfaGVhZCwgMjApOworCX0gZWxzZSB7CisJCWRlYnVnX3ByaW50Zl9wYXJzZSgiZG9uZV9jb21tYW5kOiBpbml0aWFsaXppbmcsIG51bV9jbWRzPSVkXG4iLCBwaS0+bnVtX2NtZHMpOworCX0KKworCS8qIE9ubHkgcmVhbCB0cmlja2luZXNzIGhlcmUgaXMgdGhhdCB0aGUgdW5jb21taXR0ZWQKKwkgKiBjb21tYW5kIHN0cnVjdHVyZSBpcyBub3QgY291bnRlZCBpbiBwaS0+bnVtX2NtZHMuICovCisJcGktPmNtZHMgPSB4cmVhbGxvYyhwaS0+Y21kcywgc2l6ZW9mKCpwaS0+Y21kcykgKiAocGktPm51bV9jbWRzKzEpKTsKKwljdHgtPmNvbW1hbmQgPSBjb21tYW5kID0gJnBpLT5jbWRzW3BpLT5udW1fY21kc107CisgY2xlYXJfYW5kX3JldDoKKwltZW1zZXQoY29tbWFuZCwgMCwgc2l6ZW9mKCpjb21tYW5kKSk7CisJcmV0dXJuIHBpLT5udW1fY21kczsgLyogdXNlZCBvbmx5IGZvciAwL25vbnplcm8gY2hlY2sgKi8KK30KKworc3RhdGljIHZvaWQgZG9uZV9waXBlKHN0cnVjdCBwYXJzZV9jb250ZXh0ICpjdHgsIHBpcGVfc3R5bGUgdHlwZSkKK3sKKwlpbnQgbm90X251bGw7CisKKwlkZWJ1Z19wcmludGZfcGFyc2UoImRvbmVfcGlwZSBlbnRlcmVkLCBmb2xsb3d1cCAlZFxuIiwgdHlwZSk7CisJLyogQ2xvc2UgcHJldmlvdXMgY29tbWFuZCAqLworCW5vdF9udWxsID0gZG9uZV9jb21tYW5kKGN0eCk7CisJY3R4LT5waXBlLT5mb2xsb3d1cCA9IHR5cGU7CisjaWYgSEFTX0tFWVdPUkRTCisJY3R4LT5waXBlLT5waV9pbnZlcnRlZCA9IGN0eC0+Y3R4X2ludmVydGVkOworCWN0eC0+Y3R4X2ludmVydGVkID0gMDsKKwljdHgtPnBpcGUtPnJlc193b3JkID0gY3R4LT5jdHhfcmVzX3c7CisjZW5kaWYKKworCS8qIFdpdGhvdXQgdGhpcyBjaGVjaywgZXZlbiBqdXN0IDxlbnRlcj4gb24gY29tbWFuZCBsaW5lIGdlbmVyYXRlcworCSAqIHRyZWUgb2YgdGhyZWUgTk9QcyAoISkuIFdoaWNoIGlzIGhhcm1sZXNzIGJ1dCBhbm5veWluZy4KKwkgKiBJT1c6IGl0IGlzIHNhZmUgdG8gZG8gaXQgdW5jb25kaXRpb25hbGx5LiAqLworCWlmIChub3RfbnVsbAorI2lmIEVOQUJMRV9IVVNIX0lGCisJIHx8IGN0eC0+Y3R4X3Jlc193ID09IFJFU19GSQorI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfTE9PUFMKKwkgfHwgY3R4LT5jdHhfcmVzX3cgPT0gUkVTX0RPTkUKKwkgfHwgY3R4LT5jdHhfcmVzX3cgPT0gUkVTX0ZPUgorCSB8fCBjdHgtPmN0eF9yZXNfdyA9PSBSRVNfSU4KKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0NBU0UKKwkgfHwgY3R4LT5jdHhfcmVzX3cgPT0gUkVTX0VTQUMKKyNlbmRpZgorCSkgeworCQlzdHJ1Y3QgcGlwZSAqbmV3X3A7CisJCWRlYnVnX3ByaW50Zl9wYXJzZSgiZG9uZV9waXBlOiBhZGRpbmcgbmV3IHBpcGU6ICIKKwkJCQkibm90X251bGw6JWQgY3R4LT5jdHhfcmVzX3c6JWRcbiIsCisJCQkJbm90X251bGwsIGN0eC0+Y3R4X3Jlc193KTsKKwkJbmV3X3AgPSBuZXdfcGlwZSgpOworCQljdHgtPnBpcGUtPm5leHQgPSBuZXdfcDsKKwkJY3R4LT5waXBlID0gbmV3X3A7CisJCS8qIFJFU19USEVOLCBSRVNfRE8gZXRjIGFyZSAic3RpY2t5IiAtCisJCSAqIHRoZXkgcmVtYWluIHNldCBmb3IgcGlwZXMgaW5zaWRlIGlmL3doaWxlLgorCQkgKiBUaGlzIGlzIHVzZWQgdG8gY29udHJvbCBleGVjdXRpb24uCisJCSAqIFJFU19GT1IgYW5kIFJFU19JTiBhcmUgTk9UIHN0aWNreSAobmVlZGVkIHRvIHN1cHBvcnQKKwkJICogY2FzZXMgd2hlcmUgdmFyaWFibGUgb3IgdmFsdWUgaGFwcGVucyB0byBtYXRjaCBhIGtleXdvcmQpOgorCQkgKi8KKyNpZiBFTkFCTEVfSFVTSF9MT09QUworCQlpZiAoY3R4LT5jdHhfcmVzX3cgPT0gUkVTX0ZPUgorCQkgfHwgY3R4LT5jdHhfcmVzX3cgPT0gUkVTX0lOKQorCQkJY3R4LT5jdHhfcmVzX3cgPSBSRVNfTk9ORTsKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0NBU0UKKwkJaWYgKGN0eC0+Y3R4X3Jlc193ID09IFJFU19NQVRDSCkKKwkJCWN0eC0+Y3R4X3Jlc193ID0gUkVTX0NBU0VfQk9EWTsKKwkJaWYgKGN0eC0+Y3R4X3Jlc193ID09IFJFU19DQVNFKQorCQkJY3R4LT5jdHhfcmVzX3cgPSBSRVNfQ0FTRV9JTjsKKyNlbmRpZgorCQljdHgtPmNvbW1hbmQgPSBOVUxMOyAvKiB0cmljayBkb25lX2NvbW1hbmQgYmVsb3cgKi8KKwkJLyogQ3JlYXRlIHRoZSBtZW1vcnkgZm9yIGNvbW1hbmQsIHJvdWdobHk6CisJCSAqIGN0eC0+cGlwZS0+Y21kcyA9IG5ldyBzdHJ1Y3QgY29tbWFuZDsKKwkJICogY3R4LT5jb21tYW5kID0gJmN0eC0+cGlwZS0+Y21kc1swXTsKKwkJICovCisJCWRvbmVfY29tbWFuZChjdHgpOworCQkvL2RlYnVnX3ByaW50X3RyZWUoY3R4LT5saXN0X2hlYWQsIDEwKTsKKwl9CisJZGVidWdfcHJpbnRmX3BhcnNlKCJkb25lX3BpcGUgcmV0dXJuXG4iKTsKK30KKworc3RhdGljIHZvaWQgaW5pdGlhbGl6ZV9jb250ZXh0KHN0cnVjdCBwYXJzZV9jb250ZXh0ICpjdHgpCit7CisJbWVtc2V0KGN0eCwgMCwgc2l6ZW9mKCpjdHgpKTsKKwljdHgtPnBpcGUgPSBjdHgtPmxpc3RfaGVhZCA9IG5ld19waXBlKCk7CisJLyogQ3JlYXRlIHRoZSBtZW1vcnkgZm9yIGNvbW1hbmQsIHJvdWdobHk6CisJICogY3R4LT5waXBlLT5jbWRzID0gbmV3IHN0cnVjdCBjb21tYW5kOworCSAqIGN0eC0+Y29tbWFuZCA9ICZjdHgtPnBpcGUtPmNtZHNbMF07CisJICovCisJZG9uZV9jb21tYW5kKGN0eCk7Cit9CisKKy8qIElmIGEgcmVzZXJ2ZWQgd29yZCBpcyBmb3VuZCBhbmQgcHJvY2Vzc2VkLCBwYXJzZSBjb250ZXh0IGlzIG1vZGlmaWVkCisgKiBhbmQgMSBpcyByZXR1cm5lZC4KKyAqLworI2lmIEhBU19LRVlXT1JEUworc3RydWN0IHJlc2VydmVkX2NvbWJvIHsKKwljaGFyIGxpdGVyYWxbNl07CisJdW5zaWduZWQgY2hhciByZXM7CisJdW5zaWduZWQgY2hhciBhc3NpZ25tZW50X2ZsYWc7CisJaW50IGZsYWc7Cit9OworZW51bSB7CisJRkxBR19FTkQgICA9ICgxIDw8IFJFU19OT05FICksCisjIGlmIEVOQUJMRV9IVVNIX0lGCisJRkxBR19JRiAgICA9ICgxIDw8IFJFU19JRiAgICksCisJRkxBR19USEVOICA9ICgxIDw8IFJFU19USEVOICksCisJRkxBR19FTElGICA9ICgxIDw8IFJFU19FTElGICksCisJRkxBR19FTFNFICA9ICgxIDw8IFJFU19FTFNFICksCisJRkxBR19GSSAgICA9ICgxIDw8IFJFU19GSSAgICksCisjIGVuZGlmCisjIGlmIEVOQUJMRV9IVVNIX0xPT1BTCisJRkxBR19GT1IgICA9ICgxIDw8IFJFU19GT1IgICksCisJRkxBR19XSElMRSA9ICgxIDw8IFJFU19XSElMRSksCisJRkxBR19VTlRJTCA9ICgxIDw8IFJFU19VTlRJTCksCisJRkxBR19ETyAgICA9ICgxIDw8IFJFU19ETyAgICksCisJRkxBR19ET05FICA9ICgxIDw8IFJFU19ET05FICksCisJRkxBR19JTiAgICA9ICgxIDw8IFJFU19JTiAgICksCisjIGVuZGlmCisjIGlmIEVOQUJMRV9IVVNIX0NBU0UKKwlGTEFHX01BVENIID0gKDEgPDwgUkVTX01BVENIKSwKKwlGTEFHX0VTQUMgID0gKDEgPDwgUkVTX0VTQUMgKSwKKyMgZW5kaWYKKwlGTEFHX1NUQVJUID0gKDEgPDwgUkVTX1hYWFggKSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzZXJ2ZWRfY29tYm8qIG1hdGNoX3Jlc2VydmVkX3dvcmQob19zdHJpbmcgKndvcmQpCit7CisJLyogTW9zdGx5IGEgbGlzdCBvZiBhY2NlcHRlZCBmb2xsb3ctdXAgcmVzZXJ2ZWQgd29yZHMuCisJICogRkxBR19FTkQgbWVhbnMgd2UgYXJlIGRvbmUgd2l0aCB0aGUgc2VxdWVuY2UsIGFuZCBhcmUgcmVhZHkKKwkgKiB0byB0dXJuIHRoZSBjb21wb3VuZCBsaXN0IGludG8gYSBjb21tYW5kLgorCSAqIEZMQUdfU1RBUlQgbWVhbnMgdGhlIHdvcmQgbXVzdCBzdGFydCBhIG5ldyBjb21wb3VuZCBsaXN0LgorCSAqLworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzZXJ2ZWRfY29tYm8gcmVzZXJ2ZWRfbGlzdFtdID0geworIyBpZiBFTkFCTEVfSFVTSF9JRgorCQl7ICIhIiwgICAgIFJFU19OT05FLCAgTk9UX0FTU0lHTk1FTlQgICwgMCB9LAorCQl7ICJpZiIsICAgIFJFU19JRiwgICAgTUFZQkVfQVNTSUdOTUVOVCwgRkxBR19USEVOIHwgRkxBR19TVEFSVCB9LAorCQl7ICJ0aGVuIiwgIFJFU19USEVOLCAgTUFZQkVfQVNTSUdOTUVOVCwgRkxBR19FTElGIHwgRkxBR19FTFNFIHwgRkxBR19GSSB9LAorCQl7ICJlbGlmIiwgIFJFU19FTElGLCAgTUFZQkVfQVNTSUdOTUVOVCwgRkxBR19USEVOIH0sCisJCXsgImVsc2UiLCAgUkVTX0VMU0UsICBNQVlCRV9BU1NJR05NRU5ULCBGTEFHX0ZJICAgfSwKKwkJeyAiZmkiLCAgICBSRVNfRkksICAgIE5PVF9BU1NJR05NRU5UICAsIEZMQUdfRU5EICB9LAorIyBlbmRpZgorIyBpZiBFTkFCTEVfSFVTSF9MT09QUworCQl7ICJmb3IiLCAgIFJFU19GT1IsICAgTk9UX0FTU0lHTk1FTlQgICwgRkxBR19JTiB8IEZMQUdfRE8gfCBGTEFHX1NUQVJUIH0sCisJCXsgIndoaWxlIiwgUkVTX1dISUxFLCBNQVlCRV9BU1NJR05NRU5ULCBGTEFHX0RPIHwgRkxBR19TVEFSVCB9LAorCQl7ICJ1bnRpbCIsIFJFU19VTlRJTCwgTUFZQkVfQVNTSUdOTUVOVCwgRkxBR19ETyB8IEZMQUdfU1RBUlQgfSwKKwkJeyAiaW4iLCAgICBSRVNfSU4sICAgIE5PVF9BU1NJR05NRU5UICAsIEZMQUdfRE8gICB9LAorCQl7ICJkbyIsICAgIFJFU19ETywgICAgTUFZQkVfQVNTSUdOTUVOVCwgRkxBR19ET05FIH0sCisJCXsgImRvbmUiLCAgUkVTX0RPTkUsICBOT1RfQVNTSUdOTUVOVCAgLCBGTEFHX0VORCAgfSwKKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0hVU0hfQ0FTRQorCQl7ICJjYXNlIiwgIFJFU19DQVNFLCAgTk9UX0FTU0lHTk1FTlQgICwgRkxBR19NQVRDSCB8IEZMQUdfU1RBUlQgfSwKKwkJeyAiZXNhYyIsICBSRVNfRVNBQywgIE5PVF9BU1NJR05NRU5UICAsIEZMQUdfRU5EICB9LAorIyBlbmRpZgorCX07CisJY29uc3Qgc3RydWN0IHJlc2VydmVkX2NvbWJvICpyOworCisJZm9yIChyID0gcmVzZXJ2ZWRfbGlzdDsgciA8IHJlc2VydmVkX2xpc3QgKyBBUlJBWV9TSVpFKHJlc2VydmVkX2xpc3QpOyByKyspIHsKKwkJaWYgKHN0cmNtcCh3b3JkLT5kYXRhLCByLT5saXRlcmFsKSA9PSAwKQorCQkJcmV0dXJuIHI7CisJfQorCXJldHVybiBOVUxMOworfQorLyogUmV0dXJuIDA6IG5vdCBhIGtleXdvcmQsIDE6IGtleXdvcmQKKyAqLworc3RhdGljIGludCByZXNlcnZlZF93b3JkKG9fc3RyaW5nICp3b3JkLCBzdHJ1Y3QgcGFyc2VfY29udGV4dCAqY3R4KQoreworIyBpZiBFTkFCTEVfSFVTSF9DQVNFCisJc3RhdGljIGNvbnN0IHN0cnVjdCByZXNlcnZlZF9jb21ibyByZXNlcnZlZF9tYXRjaCA9IHsKKwkJIiIsICAgICAgICBSRVNfTUFUQ0gsIE5PVF9BU1NJR05NRU5UICwgRkxBR19NQVRDSCB8IEZMQUdfRVNBQworCX07CisjIGVuZGlmCisJY29uc3Qgc3RydWN0IHJlc2VydmVkX2NvbWJvICpyOworCisJaWYgKHdvcmQtPmhhc19xdW90ZWRfcGFydCkKKwkJcmV0dXJuIDA7CisJciA9IG1hdGNoX3Jlc2VydmVkX3dvcmQod29yZCk7CisJaWYgKCFyKQorCQlyZXR1cm4gMDsKKworCWRlYnVnX3ByaW50ZigiZm91bmQgcmVzZXJ2ZWQgd29yZCAlcywgcmVzICVkXG4iLCByLT5saXRlcmFsLCByLT5yZXMpOworIyBpZiBFTkFCTEVfSFVTSF9DQVNFCisJaWYgKHItPnJlcyA9PSBSRVNfSU4gJiYgY3R4LT5jdHhfcmVzX3cgPT0gUkVTX0NBU0VfSU4pIHsKKwkJLyogImNhc2Ugd29yZCBJTiAuLi4iIC0gSU4gcGFydCBzdGFydHMgZmlyc3QgTUFUQ0ggcGFydCAqLworCQlyID0gJnJlc2VydmVkX21hdGNoOworCX0gZWxzZQorIyBlbmRpZgorCWlmIChyLT5mbGFnID09IDApIHsgLyogJyEnICovCisJCWlmIChjdHgtPmN0eF9pbnZlcnRlZCkgeyAvKiBiYXNoIGRvZXNuJ3QgYWNjZXB0ICchICEgdHJ1ZScgKi8KKwkJCXN5bnRheF9lcnJvcigiISAhIGNvbW1hbmQiKTsKKwkJCWN0eC0+Y3R4X3Jlc193ID0gUkVTX1NOVFg7CisJCX0KKwkJY3R4LT5jdHhfaW52ZXJ0ZWQgPSAxOworCQlyZXR1cm4gMTsKKwl9CisJaWYgKHItPmZsYWcgJiBGTEFHX1NUQVJUKSB7CisJCXN0cnVjdCBwYXJzZV9jb250ZXh0ICpvbGQ7CisKKwkJb2xkID0geG1hbGxvYyhzaXplb2YoKm9sZCkpOworCQlkZWJ1Z19wcmludGZfcGFyc2UoInB1c2ggc3RhY2sgJXBcbiIsIG9sZCk7CisJCSpvbGQgPSAqY3R4OyAgIC8qIHBoeXNpY2FsIGNvcHkgKi8KKwkJaW5pdGlhbGl6ZV9jb250ZXh0KGN0eCk7CisJCWN0eC0+c3RhY2sgPSBvbGQ7CisJfSBlbHNlIGlmICgvKmN0eC0+Y3R4X3Jlc193ID09IFJFU19OT05FIHx8Ki8gIShjdHgtPm9sZF9mbGFnICYgKDEgPDwgci0+cmVzKSkpIHsKKwkJc3ludGF4X2Vycm9yX2F0KHdvcmQtPmRhdGEpOworCQljdHgtPmN0eF9yZXNfdyA9IFJFU19TTlRYOworCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQkvKiAiey4uLn0gZmkiIGlzIG9rLiAiey4uLn0gaWYiIGlzIG5vdAorCQkgKiBFeGFtcGxlOgorCQkgKiBpZiB7IGVjaG8gZm9vOyB9IHRoZW4geyBlY2hvIGJhcjsgfSBmaSAqLworCQlpZiAoY3R4LT5jb21tYW5kLT5ncm91cCkKKwkJCWRvbmVfcGlwZShjdHgsIFBJUEVfU0VRKTsKKwl9CisKKwljdHgtPmN0eF9yZXNfdyA9IHItPnJlczsKKwljdHgtPm9sZF9mbGFnID0gci0+ZmxhZzsKKwl3b3JkLT5vX2Fzc2lnbm1lbnQgPSByLT5hc3NpZ25tZW50X2ZsYWc7CisJZGVidWdfcHJpbnRmX3BhcnNlKCJ3b3JkLT5vX2Fzc2lnbm1lbnQ9JyVzJ1xuIiwgYXNzaWdubWVudF9mbGFnW3dvcmQtPm9fYXNzaWdubWVudF0pOworCisJaWYgKGN0eC0+b2xkX2ZsYWcgJiBGTEFHX0VORCkgeworCQlzdHJ1Y3QgcGFyc2VfY29udGV4dCAqb2xkOworCisJCWRvbmVfcGlwZShjdHgsIFBJUEVfU0VRKTsKKwkJZGVidWdfcHJpbnRmX3BhcnNlKCJwb3Agc3RhY2sgJXBcbiIsIGN0eC0+c3RhY2spOworCQlvbGQgPSBjdHgtPnN0YWNrOworCQlvbGQtPmNvbW1hbmQtPmdyb3VwID0gY3R4LT5saXN0X2hlYWQ7CisJCW9sZC0+Y29tbWFuZC0+Y21kX3R5cGUgPSBDTURfTk9STUFMOworIyBpZiAhQkJfTU1VCisJCS8qIEF0IHRoaXMgcG9pbnQsIHRoZSBjb21wb3VuZCBjb21tYW5kJ3Mgc3RyaW5nIGlzIGluCisJCSAqIGN0eC0+YXNfc3RyaW5nLi4uIGV4Y2VwdCBmb3IgdGhlIGxlYWRpbmcga2V5d29yZCEKKwkJICogQ29uc2lkZXIgdGhpcyBleGFtcGxlOiAiZWNobyBhIHwgaWYgdHJ1ZTsgdGhlbiBlY2hvIGE7IGZpIgorCQkgKiBjdHgtPmFzX3N0cmluZyB3aWxsIGNvbnRhaW4gInRydWU7IHRoZW4gZWNobyBhOyBmaSIsCisJCSAqIHdpdGggImlmICIgcmVtYWluaW5nIGluIG9sZC0+YXNfc3RyaW5nIQorCQkgKi8KKwkJeworCQkJY2hhciAqc3RyOworCQkJaW50IGxlbiA9IG9sZC0+YXNfc3RyaW5nLmxlbmd0aDsKKwkJCS8qIENvbmNhdGVuYXRlIGhhbHZlcyAqLworCQkJb19hZGRzdHIoJm9sZC0+YXNfc3RyaW5nLCBjdHgtPmFzX3N0cmluZy5kYXRhKTsKKwkJCW9fZnJlZV91bnNhZmUoJmN0eC0+YXNfc3RyaW5nKTsKKwkJCS8qIEZpbmQgd2hlcmUgbGVhZGluZyBrZXl3b3JkIHN0YXJ0cyBpbiBmaXJzdCBoYWxmICovCisJCQlzdHIgPSBvbGQtPmFzX3N0cmluZy5kYXRhICsgbGVuOworCQkJaWYgKHN0ciA+IG9sZC0+YXNfc3RyaW5nLmRhdGEpCisJCQkJc3RyLS07IC8qIHNraXAgd2hpdGVzcGFjZSBhZnRlciBrZXl3b3JkICovCisJCQl3aGlsZSAoc3RyID4gb2xkLT5hc19zdHJpbmcuZGF0YSAmJiBpc2FscGhhKHN0clstMV0pKQorCQkJCXN0ci0tOworCQkJLyogVWdoLCB3ZSdyZSBkb25lIHdpdGggdGhpcyBob3JyaWQgaGFjayAqLworCQkJb2xkLT5jb21tYW5kLT5ncm91cF9hc19zdHJpbmcgPSB4c3RyZHVwKHN0cik7CisJCQlkZWJ1Z19wcmludGZfcGFyc2UoInBvcCwgcmVtZW1iZXJpbmcgYXM6JyVzJ1xuIiwKKwkJCQkJb2xkLT5jb21tYW5kLT5ncm91cF9hc19zdHJpbmcpOworCQl9CisjIGVuZGlmCisJCSpjdHggPSAqb2xkOyAgIC8qIHBoeXNpY2FsIGNvcHkgKi8KKwkJZnJlZShvbGQpOworCX0KKwlyZXR1cm4gMTsKK30KKyNlbmRpZiAvKiBIQVNfS0VZV09SRFMgKi8KKworLyogV29yZCBpcyBjb21wbGV0ZSwgbG9vayBhdCBpdCBhbmQgdXBkYXRlIHBhcnNpbmcgY29udGV4dC4KKyAqIE5vcm1hbCByZXR1cm4gaXMgMC4gU3ludGF4IGVycm9ycyByZXR1cm4gMS4KKyAqIE5vdGU6IG9uIHJldHVybiwgd29yZCBpcyByZXNldCwgYnV0IG5vdCBvX2ZyZWUnZCEKKyAqLworc3RhdGljIGludCBkb25lX3dvcmQob19zdHJpbmcgKndvcmQsIHN0cnVjdCBwYXJzZV9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IGNvbW1hbmQgKmNvbW1hbmQgPSBjdHgtPmNvbW1hbmQ7CisKKwlkZWJ1Z19wcmludGZfcGFyc2UoImRvbmVfd29yZCBlbnRlcmVkOiAnJXMnICVwXG4iLCB3b3JkLT5kYXRhLCBjb21tYW5kKTsKKwlpZiAod29yZC0+bGVuZ3RoID09IDAgJiYgIXdvcmQtPmhhc19xdW90ZWRfcGFydCkgeworCQlkZWJ1Z19wcmludGZfcGFyc2UoImRvbmVfd29yZCByZXR1cm4gMDogdHJ1ZSBudWxsLCBpZ25vcmVkXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJaWYgKGN0eC0+cGVuZGluZ19yZWRpcmVjdCkgeworCQkvKiBXZSBkbyBub3QgZ2xvYiBpbiBlLmcuID4qLnRtcCBjYXNlLiBiYXNoIHNlZW1zIHRvIGdsb2IgaGVyZQorCQkgKiBvbmx5IGlmIHJ1biBhcyAiYmFzaCIsIG5vdCAic2giICovCisJCS8qIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS91dGlsaXRpZXMveGN1X2NoYXAwMi5odG1sCisJCSAqICIyLjcgUmVkaXJlY3Rpb24KKwkJICogLi4udGhlIHdvcmQgdGhhdCBmb2xsb3dzIHRoZSByZWRpcmVjdGlvbiBvcGVyYXRvcgorCQkgKiBzaGFsbCBiZSBzdWJqZWN0ZWQgdG8gdGlsZGUgZXhwYW5zaW9uLCBwYXJhbWV0ZXIgZXhwYW5zaW9uLAorCQkgKiBjb21tYW5kIHN1YnN0aXR1dGlvbiwgYXJpdGhtZXRpYyBleHBhbnNpb24sIGFuZCBxdW90ZQorCQkgKiByZW1vdmFsLiBQYXRobmFtZSBleHBhbnNpb24gc2hhbGwgbm90IGJlIHBlcmZvcm1lZAorCQkgKiBvbiB0aGUgd29yZCBieSBhIG5vbi1pbnRlcmFjdGl2ZSBzaGVsbDsgYW4gaW50ZXJhY3RpdmUKKwkJICogc2hlbGwgbWF5IHBlcmZvcm0gaXQsIGJ1dCBzaGFsbCBkbyBzbyBvbmx5IHdoZW4KKwkJICogdGhlIGV4cGFuc2lvbiB3b3VsZCByZXN1bHQgaW4gb25lIHdvcmQuIgorCQkgKi8KKwkJY3R4LT5wZW5kaW5nX3JlZGlyZWN0LT5yZF9maWxlbmFtZSA9IHhzdHJkdXAod29yZC0+ZGF0YSk7CisJCS8qIENhdGVyIGZvciA+XGZpbGUgY2FzZToKKwkJICogPlxhIGNyZWF0ZXMgZmlsZSBhOyA+XFxhLCA+IlxhIiwgPiJcXGEiIGNyZWF0ZSBmaWxlIFxhCisJCSAqIFNhbWUgd2l0aCBoZXJlZG9jczoKKwkJICogZm9yIDw8XEggZGVsaW0gaXMgSDsgPDxcXEgsIDw8IlxIIiwgPDwiXFxIIiAtIFxICisJCSAqLworCQlpZiAoY3R4LT5wZW5kaW5nX3JlZGlyZWN0LT5yZF90eXBlID09IFJFRElSRUNUX0hFUkVET0MpIHsKKwkJCXVuYmFja3NsYXNoKGN0eC0+cGVuZGluZ19yZWRpcmVjdC0+cmRfZmlsZW5hbWUpOworCQkJLyogSXMgaXQgPDwiSEVSRURPQyI/ICovCisJCQlpZiAod29yZC0+aGFzX3F1b3RlZF9wYXJ0KSB7CisJCQkJY3R4LT5wZW5kaW5nX3JlZGlyZWN0LT5yZF9kdXAgfD0gSEVSRURPQ19RVU9URUQ7CisJCQl9CisJCX0KKwkJZGVidWdfcHJpbnRmX3BhcnNlKCJ3b3JkIHN0b3JlZCBpbiByZF9maWxlbmFtZTogJyVzJ1xuIiwgd29yZC0+ZGF0YSk7CisJCWN0eC0+cGVuZGluZ19yZWRpcmVjdCA9IE5VTEw7CisJfSBlbHNlIHsKKyNpZiBIQVNfS0VZV09SRFMKKyMgaWYgRU5BQkxFX0hVU0hfQ0FTRQorCQlpZiAoY3R4LT5jdHhfZHNlbWljb2xvbgorCQkgJiYgc3RyY21wKHdvcmQtPmRhdGEsICJlc2FjIikgIT0gMCAvKiBub3QgIi4uLiBwYXR0ZXJuKSBjbWQ7OyBlc2FjIiAqLworCQkpIHsKKwkJCS8qIGFscmVhZHkgZG9uZSB3aGVuIGN0eF9kc2VtaWNvbG9uIHdhcyBzZXQgdG8gMTogKi8KKwkJCS8qIGN0eC0+Y3R4X3Jlc193ID0gUkVTX01BVENIOyAqLworCQkJY3R4LT5jdHhfZHNlbWljb2xvbiA9IDA7CisJCX0gZWxzZQorIyBlbmRpZgorCQlpZiAoIWNvbW1hbmQtPmFyZ3YgLyogaWYgaXQncyB0aGUgZmlyc3Qgd29yZC4uLiAqLworIyBpZiBFTkFCTEVfSFVTSF9MT09QUworCQkgJiYgY3R4LT5jdHhfcmVzX3cgIT0gUkVTX0ZPUiAvKiAuLi5ub3QgYWZ0ZXIgRk9SIG9yIElOICovCisJCSAmJiBjdHgtPmN0eF9yZXNfdyAhPSBSRVNfSU4KKyMgZW5kaWYKKyMgaWYgRU5BQkxFX0hVU0hfQ0FTRQorCQkgJiYgY3R4LT5jdHhfcmVzX3cgIT0gUkVTX0NBU0UKKyMgZW5kaWYKKwkJKSB7CisJCQlpbnQgcmVzZXJ2ZWQgPSByZXNlcnZlZF93b3JkKHdvcmQsIGN0eCk7CisJCQlkZWJ1Z19wcmludGZfcGFyc2UoImNoZWNraW5nIGZvciByZXNlcnZlZC1uZXNzOiAlZFxuIiwgcmVzZXJ2ZWQpOworCQkJaWYgKHJlc2VydmVkKSB7CisJCQkJb19yZXNldF90b19lbXB0eV91bnF1b3RlZCh3b3JkKTsKKwkJCQlkZWJ1Z19wcmludGZfcGFyc2UoImRvbmVfd29yZCByZXR1cm4gJWRcbiIsCisJCQkJCQkoY3R4LT5jdHhfcmVzX3cgPT0gUkVTX1NOVFgpKTsKKwkJCQlyZXR1cm4gKGN0eC0+Y3R4X3Jlc193ID09IFJFU19TTlRYKTsKKwkJCX0KKyMgaWYgRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQKKwkJCWlmIChzdHJjbXAod29yZC0+ZGF0YSwgIltbIikgPT0gMCkgeworCQkJCWNvbW1hbmQtPmNtZF90eXBlID0gQ01EX1NJTkdMRVdPUkRfTk9HTE9COworCQkJfQorCQkJLyogZmFsbCB0aHJvdWdoICovCisjIGVuZGlmCisJCX0KKyNlbmRpZgorCQlpZiAoY29tbWFuZC0+Z3JvdXApIHsKKwkJCS8qICJ7IGVjaG8gZm9vOyB9IGVjaG8gYmFyIiAtIGJhZCAqLworCQkJc3ludGF4X2Vycm9yX2F0KHdvcmQtPmRhdGEpOworCQkJZGVidWdfcHJpbnRmX3BhcnNlKCJkb25lX3dvcmQgcmV0dXJuIDE6IHN5bnRheCBlcnJvciwgIgorCQkJCQkiZ3JvdXBzIGFuZCBhcmdsaXN0cyBkb24ndCBtaXhcbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKworCQkvKiBJZiB0aGlzIHdvcmQgd2Fzbid0IGFuIGFzc2lnbm1lbnQsIG5leHQgb25lcyBkZWZpbml0ZWx5CisJCSAqIGNhbid0IGJlIGFzc2lnbm1lbnRzLiBFdmVuIGlmIHRoZXkgbG9vayBsaWtlIG9uZXMuICovCisJCWlmICh3b3JkLT5vX2Fzc2lnbm1lbnQgIT0gREVGSU5JVEVMWV9BU1NJR05NRU5UCisJCSAmJiB3b3JkLT5vX2Fzc2lnbm1lbnQgIT0gV09SRF9JU19LRVlXT1JECisJCSkgeworCQkJd29yZC0+b19hc3NpZ25tZW50ID0gTk9UX0FTU0lHTk1FTlQ7CisJCX0gZWxzZSB7CisJCQlpZiAod29yZC0+b19hc3NpZ25tZW50ID09IERFRklOSVRFTFlfQVNTSUdOTUVOVCkgeworCQkJCWNvbW1hbmQtPmFzc2lnbm1lbnRfY250Kys7CisJCQkJZGVidWdfcHJpbnRmX3BhcnNlKCIrK2Fzc2lnbm1lbnRfY250PSVkXG4iLCBjb21tYW5kLT5hc3NpZ25tZW50X2NudCk7CisJCQl9CisJCQlkZWJ1Z19wcmludGZfcGFyc2UoIndvcmQtPm9fYXNzaWdubWVudCB3YXM6JyVzJ1xuIiwgYXNzaWdubWVudF9mbGFnW3dvcmQtPm9fYXNzaWdubWVudF0pOworCQkJd29yZC0+b19hc3NpZ25tZW50ID0gTUFZQkVfQVNTSUdOTUVOVDsKKwkJfQorCQlkZWJ1Z19wcmludGZfcGFyc2UoIndvcmQtPm9fYXNzaWdubWVudD0nJXMnXG4iLCBhc3NpZ25tZW50X2ZsYWdbd29yZC0+b19hc3NpZ25tZW50XSk7CisKKwkJaWYgKHdvcmQtPmhhc19xdW90ZWRfcGFydAorCQkgLyogb3B0aW1pemF0aW9uOiBhbmQgaWYgaXQncyAoIiIgb3IgJycpIG9yICgkdi4uLiBvciBgY21kYC4uLik6ICovCisJCSAmJiAod29yZC0+ZGF0YVswXSA9PSAnXDAnIHx8IHdvcmQtPmRhdGFbMF0gPT0gU1BFQ0lBTF9WQVJfU1lNQk9MKQorCQkgLyogKG90aGVyd2lzZSBpdCdzIGtub3duIHRvIGJlIG5vdCBlbXB0eSBhbmQgaXMgYWxyZWFkeSBzYWZlKSAqLworCQkpIHsKKwkJCS8qIGV4Y2x1ZGUgIiRAIiAtIGl0IGNhbiBleHBhbmQgdG8gbm8gd29yZCBkZXNwaXRlICIiICovCisJCQljaGFyICpwID0gd29yZC0+ZGF0YTsKKwkJCXdoaWxlIChwWzBdID09IFNQRUNJQUxfVkFSX1NZTUJPTAorCQkJICAgICYmIChwWzFdICYgMHg3ZikgPT0gJ0AnCisJCQkgICAgJiYgcFsyXSA9PSBTUEVDSUFMX1ZBUl9TWU1CT0wKKwkJCSkgeworCQkJCXAgKz0gMzsKKwkJCX0KKwkJfQorCQljb21tYW5kLT5hcmd2ID0gYWRkX3N0cmluZ190b19zdHJpbmdzKGNvbW1hbmQtPmFyZ3YsIHhzdHJkdXAod29yZC0+ZGF0YSkpOworCQlkZWJ1Z19wcmludF9zdHJpbmdzKCJ3b3JkIGFwcGVuZGVkIHRvIGFyZ3YiLCBjb21tYW5kLT5hcmd2KTsKKwl9CisKKyNpZiBFTkFCTEVfSFVTSF9MT09QUworCWlmIChjdHgtPmN0eF9yZXNfdyA9PSBSRVNfRk9SKSB7CisJCWlmICh3b3JkLT5oYXNfcXVvdGVkX3BhcnQKKwkJIHx8ICFpc193ZWxsX2Zvcm1lZF92YXJfbmFtZShjb21tYW5kLT5hcmd2WzBdLCAnXDAnKQorCQkpIHsKKwkJCS8qIGJhc2ggc2F5cyBqdXN0ICJub3QgYSB2YWxpZCBpZGVudGlmaWVyIiAqLworCQkJc3ludGF4X2Vycm9yKCJub3QgYSB2YWxpZCBpZGVudGlmaWVyIGluIGZvciIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJLyogRm9yY2UgRk9SIHRvIGhhdmUganVzdCBvbmUgd29yZCAodmFyaWFibGUgbmFtZSkgKi8KKwkJLyogTkI6IGJhc2ljYWxseSwgdGhpcyBtYWtlcyBodXNoIHNlZSAiZm9yIHYgaW4gLi4uIgorCQkgKiBzeW50YXggYXMgaWYgaXQgaXMgImZvciB2OyBpbiAuLi4iLiBGT1IgYW5kIElOIGJlY29tZQorCQkgKiB0d28gcGlwZSBzdHJ1Y3RzIGluIHBhcnNlIHRyZWUuICovCisJCWRvbmVfcGlwZShjdHgsIFBJUEVfU0VRKTsKKwl9CisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9DQVNFCisJLyogRm9yY2UgQ0FTRSB0byBoYXZlIGp1c3Qgb25lIHdvcmQgKi8KKwlpZiAoY3R4LT5jdHhfcmVzX3cgPT0gUkVTX0NBU0UpIHsKKwkJZG9uZV9waXBlKGN0eCwgUElQRV9TRVEpOworCX0KKyNlbmRpZgorCisJb19yZXNldF90b19lbXB0eV91bnF1b3RlZCh3b3JkKTsKKworCWRlYnVnX3ByaW50Zl9wYXJzZSgiZG9uZV93b3JkIHJldHVybiAwXG4iKTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBQZWVrIGFoZWFkIGluIHRoZSBpbnB1dCB0byBmaW5kIG91dCBpZiB3ZSBoYXZlIGEgIiZuIiBjb25zdHJ1Y3QsCisgKiBhcyBpbiAiMj4mMSIsIHRoYXQgcmVwcmVzZW50cyBkdXBsaWNhdGluZyBhIGZpbGUgZGVzY3JpcHRvci4KKyAqIFJldHVybjoKKyAqIFJFRElSRkRfQ0xPU0UgaWYgPiYtICJjbG9zZSBmZCIgY29uc3RydWN0IGlzIHNlZW4sCisgKiBSRURJUkZEX1NZTlRBWF9FUlIgaWYgc3ludGF4IGVycm9yLAorICogUkVESVJGRF9UT19GSUxFIGlmIG5vICYgd2FzIHNlZW4sCisgKiBvciB0aGUgbnVtYmVyIGZvdW5kLgorICovCisjaWYgQkJfTU1VCisjZGVmaW5lIHBhcnNlX3JlZGlyX3JpZ2h0X2ZkKGFzX3N0cmluZywgaW5wdXQpIFwKKwlwYXJzZV9yZWRpcl9yaWdodF9mZChpbnB1dCkKKyNlbmRpZgorc3RhdGljIGludCBwYXJzZV9yZWRpcl9yaWdodF9mZChvX3N0cmluZyAqYXNfc3RyaW5nLCBzdHJ1Y3QgaW5fc3RyICppbnB1dCkKK3sKKwlpbnQgY2gsIGQsIG9rOworCisJY2ggPSBpX3BlZWsoaW5wdXQpOworCWlmIChjaCAhPSAnJicpCisJCXJldHVybiBSRURJUkZEX1RPX0ZJTEU7CisKKwljaCA9IGlfZ2V0Y2goaW5wdXQpOyAgLyogZ2V0IHRoZSAmICovCisJbm9tbXVfYWRkY2hyKGFzX3N0cmluZywgY2gpOworCWNoID0gaV9wZWVrKGlucHV0KTsKKwlpZiAoY2ggPT0gJy0nKSB7CisJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCW5vbW11X2FkZGNocihhc19zdHJpbmcsIGNoKTsKKwkJcmV0dXJuIFJFRElSRkRfQ0xPU0U7CisJfQorCWQgPSAwOworCW9rID0gMDsKKwl3aGlsZSAoY2ggIT0gRU9GICYmIGlzZGlnaXQoY2gpKSB7CisJCWQgPSBkKjEwICsgKGNoLScwJyk7CisJCW9rID0gMTsKKwkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJbm9tbXVfYWRkY2hyKGFzX3N0cmluZywgY2gpOworCQljaCA9IGlfcGVlayhpbnB1dCk7CisJfQorCWlmIChvaykgcmV0dXJuIGQ7CisKKy8vVE9ETzogdGhpcyBpcyB0aGUgcGxhY2UgdG8gY2F0Y2ggIj4mZmlsZSIgYmFzaGlzbSAocmVkaXJlY3QgYm90aCBmZCAxIGFuZCAyKQorCisJYmJfZXJyb3JfbXNnKCJhbWJpZ3VvdXMgcmVkaXJlY3QiKTsKKwlyZXR1cm4gUkVESVJGRF9TWU5UQVhfRVJSOworfQorCisvKiBSZXR1cm4gY29kZSBpcyAwIG5vcm1hbCwgMSBpZiBhIHN5bnRheCBlcnJvciBpcyBkZXRlY3RlZAorICovCitzdGF0aWMgaW50IHBhcnNlX3JlZGlyZWN0KHN0cnVjdCBwYXJzZV9jb250ZXh0ICpjdHgsCisJCWludCBmZCwKKwkJcmVkaXJfdHlwZSBzdHlsZSwKKwkJc3RydWN0IGluX3N0ciAqaW5wdXQpCit7CisJc3RydWN0IGNvbW1hbmQgKmNvbW1hbmQgPSBjdHgtPmNvbW1hbmQ7CisJc3RydWN0IHJlZGlyX3N0cnVjdCAqcmVkaXI7CisJc3RydWN0IHJlZGlyX3N0cnVjdCAqKnJlZGlycDsKKwlpbnQgZHVwX251bTsKKworCWR1cF9udW0gPSBSRURJUkZEX1RPX0ZJTEU7CisJaWYgKHN0eWxlICE9IFJFRElSRUNUX0hFUkVET0MpIHsKKwkJLyogQ2hlY2sgZm9yIGEgJz4mMScgdHlwZSByZWRpcmVjdCAqLworCQlkdXBfbnVtID0gcGFyc2VfcmVkaXJfcmlnaHRfZmQoJmN0eC0+YXNfc3RyaW5nLCBpbnB1dCk7CisJCWlmIChkdXBfbnVtID09IFJFRElSRkRfU1lOVEFYX0VSUikKKwkJCXJldHVybiAxOworCX0gZWxzZSB7CisJCWludCBjaCA9IGlfcGVlayhpbnB1dCk7CisJCWR1cF9udW0gPSAoY2ggPT0gJy0nKTsgLyogSEVSRURPQ19TS0lQVEFCUyBiaXQgaXMgMSAqLworCQlpZiAoZHVwX251bSkgeyAvKiA8PC0uLi4gKi8KKwkJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCQlub21tdV9hZGRjaHIoJmN0eC0+YXNfc3RyaW5nLCBjaCk7CisJCQljaCA9IGlfcGVlayhpbnB1dCk7CisJCX0KKwl9CisKKwlpZiAoc3R5bGUgPT0gUkVESVJFQ1RfT1ZFUldSSVRFICYmIGR1cF9udW0gPT0gUkVESVJGRF9UT19GSUxFKSB7CisJCWludCBjaCA9IGlfcGVlayhpbnB1dCk7CisJCWlmIChjaCA9PSAnfCcpIHsKKwkJCS8qID58RklMRSByZWRpcmVjdCAoImNsb2JiZXJpbmciID4pLgorCQkJICogU2luY2Ugd2UgZG8gbm90IHN1cHBvcnQgInNldCAtbyBub2Nsb2JiZXIiIHlldCwKKwkJCSAqID58IGFuZCA+IGFyZSB0aGUgc2FtZSBmb3Igbm93LiBKdXN0IGVhdCB8LgorCQkJICovCisJCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQkJbm9tbXVfYWRkY2hyKCZjdHgtPmFzX3N0cmluZywgY2gpOworCQl9CisJfQorCisJLyogQ3JlYXRlIGEgbmV3IHJlZGlyX3N0cnVjdCBhbmQgYXBwZW5kIGl0IHRvIHRoZSBsaW5rZWQgbGlzdCAqLworCXJlZGlycCA9ICZjb21tYW5kLT5yZWRpcmVjdHM7CisJd2hpbGUgKChyZWRpciA9ICpyZWRpcnApICE9IE5VTEwpIHsKKwkJcmVkaXJwID0gJihyZWRpci0+bmV4dCk7CisJfQorCSpyZWRpcnAgPSByZWRpciA9IHh6YWxsb2Moc2l6ZW9mKCpyZWRpcikpOworCS8qIHJlZGlyLT5uZXh0ID0gTlVMTDsgKi8KKwkvKiByZWRpci0+cmRfZmlsZW5hbWUgPSBOVUxMOyAqLworCXJlZGlyLT5yZF90eXBlID0gc3R5bGU7CisJcmVkaXItPnJkX2ZkID0gKGZkID09IC0xKSA/IHJlZGlyX3RhYmxlW3N0eWxlXS5kZWZhdWx0X2ZkIDogZmQ7CisKKwlkZWJ1Z19wcmludGZfcGFyc2UoInJlZGlyZWN0IHR5cGUgJWQgJXNcbiIsIHJlZGlyLT5yZF9mZCwKKwkJCQlyZWRpcl90YWJsZVtzdHlsZV0uZGVzY3JpcCk7CisKKwlyZWRpci0+cmRfZHVwID0gZHVwX251bTsKKwlpZiAoc3R5bGUgIT0gUkVESVJFQ1RfSEVSRURPQyAmJiBkdXBfbnVtICE9IFJFRElSRkRfVE9fRklMRSkgeworCQkvKiBFcmlrIGhhZCBhIGNoZWNrIGhlcmUgdGhhdCB0aGUgZmlsZSBkZXNjcmlwdG9yIGluIHF1ZXN0aW9uCisJCSAqIGlzIGxlZ2l0OyBJIHBvc3Rwb25lIHRoYXQgdG8gInJ1biB0aW1lIgorCQkgKiBBICItIiByZXByZXNlbnRhdGlvbiBvZiAiY2xvc2UgbWUiIHNob3dzIHVwIGFzIGEgLTMgaGVyZSAqLworCQlkZWJ1Z19wcmludGZfcGFyc2UoImR1cGxpY2F0aW5nIHJlZGlyZWN0ICclZD4mJWQnXG4iLAorCQkJCXJlZGlyLT5yZF9mZCwgcmVkaXItPnJkX2R1cCk7CisJfSBlbHNlIHsKKwkJLyogU2V0IGN0eC0+cGVuZGluZ19yZWRpcmVjdCwgc28gd2Uga25vdyB3aGF0IHRvIGRvIGF0IHRoZQorCQkgKiBlbmQgb2YgdGhlIG5leHQgcGFyc2VkIHdvcmQuICovCisJCWN0eC0+cGVuZGluZ19yZWRpcmVjdCA9IHJlZGlyOworCX0KKwlyZXR1cm4gMDsKK30KKworLyogSWYgYSByZWRpcmVjdCBpcyBpbW1lZGlhdGVseSBwcmVjZWRlZCBieSBhIG51bWJlciwgdGhhdCBudW1iZXIgaXMKKyAqIHN1cHBvc2VkIHRvIHRlbGwgd2hpY2ggZmlsZSBkZXNjcmlwdG9yIHRvIHJlZGlyZWN0LiAgVGhpcyByb3V0aW5lCisgKiBsb29rcyBmb3Igc3VjaCBwcmVjZWRpbmcgbnVtYmVycy4gIEluIGFuIGlkZWFsIHdvcmxkIHRoaXMgcm91dGluZQorICogbmVlZHMgdG8gaGFuZGxlIGFsbCB0aGUgZm9sbG93aW5nIGNsYXNzZXMgb2YgcmVkaXJlY3RzLi4uCisgKiAgICAgZWNobyAyPmZvbyAgICAgIyByZWRpcmVjdHMgZmQgIDIgdG8gZmlsZSAiZm9vIiwgbm90aGluZyBwYXNzZWQgdG8gZWNobworICogICAgIGVjaG8gNDk+Zm9vICAgICMgcmVkaXJlY3RzIGZkIDQ5IHRvIGZpbGUgImZvbyIsIG5vdGhpbmcgcGFzc2VkIHRvIGVjaG8KKyAqICAgICBlY2hvIC0yPmZvbyAgICAjIHJlZGlyZWN0cyBmZCAgMSB0byBmaWxlICJmb28iLCAgICAiLTIiIHBhc3NlZCB0byBlY2hvCisgKiAgICAgZWNobyA0OXg+Zm9vICAgIyByZWRpcmVjdHMgZmQgIDEgdG8gZmlsZSAiZm9vIiwgICAiNDl4IiBwYXNzZWQgdG8gZWNobworICoKKyAqIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS91dGlsaXRpZXMveGN1X2NoYXAwMi5odG1sCisgKiAiMi43IFJlZGlyZWN0aW9uCisgKiAuLi4gSWYgbiBpcyBxdW90ZWQsIHRoZSBudW1iZXIgc2hhbGwgbm90IGJlIHJlY29nbml6ZWQgYXMgcGFydCBvZgorICogdGhlIHJlZGlyZWN0aW9uIGV4cHJlc3Npb24uIEZvciBleGFtcGxlOgorICogZWNobyBcMj5hCisgKiB3cml0ZXMgdGhlIGNoYXJhY3RlciAyIGludG8gZmlsZSBhIgorICogV2UgYXJlIGdldHRpbmcgaXQgcmlnaHQgYnkgc2V0dGluZyAtPmhhc19xdW90ZWRfcGFydCBvbiBhbnkgXDxjaGFyPgorICoKKyAqIEEgLTEgcmV0dXJuIG1lYW5zIG5vIHZhbGlkIG51bWJlciB3YXMgZm91bmQsCisgKiB0aGUgY2FsbGVyIHNob3VsZCB1c2UgdGhlIGFwcHJvcHJpYXRlIGRlZmF1bHQgZm9yIHRoaXMgcmVkaXJlY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQgcmVkaXJlY3Rfb3B0X251bShvX3N0cmluZyAqbykKK3sKKwlpbnQgbnVtOworCisJaWYgKG8tPmRhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCW51bSA9IGJiX3N0cnRvdShvLT5kYXRhLCBOVUxMLCAxMCk7CisJaWYgKGVycm5vIHx8IG51bSA8IDApCisJCXJldHVybiAtMTsKKwlvX3Jlc2V0X3RvX2VtcHR5X3VucXVvdGVkKG8pOworCXJldHVybiBudW07Cit9CisKKyNpZiBCQl9NTVUKKyNkZWZpbmUgZmV0Y2hfdGlsbF9zdHIoYXNfc3RyaW5nLCBpbnB1dCwgd29yZCwgc2tpcF90YWJzKSBcCisJZmV0Y2hfdGlsbF9zdHIoaW5wdXQsIHdvcmQsIHNraXBfdGFicykKKyNlbmRpZgorc3RhdGljIGNoYXIgKmZldGNoX3RpbGxfc3RyKG9fc3RyaW5nICphc19zdHJpbmcsCisJCXN0cnVjdCBpbl9zdHIgKmlucHV0LAorCQljb25zdCBjaGFyICp3b3JkLAorCQlpbnQgaGVyZWRvY19mbGFncykKK3sKKwlvX3N0cmluZyBoZXJlZG9jID0gTlVMTF9PX1NUUklORzsKKwl1bnNpZ25lZCBwYXN0X0VPTDsKKwlpbnQgcHJldiA9IDA7IC8qIG5vdCBcICovCisJaW50IGNoOworCisJZ290byBqdW1wX2luOworCisJd2hpbGUgKDEpIHsKKwkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJaWYgKGNoICE9IEVPRikKKwkJCW5vbW11X2FkZGNocihhc19zdHJpbmcsIGNoKTsKKwkJaWYgKChjaCA9PSAnXG4nIHx8IGNoID09IEVPRikKKwkJICYmICgoaGVyZWRvY19mbGFncyAmIEhFUkVET0NfUVVPVEVEKSB8fCBwcmV2ICE9ICdcXCcpCisJCSkgeworCQkJaWYgKHN0cmNtcChoZXJlZG9jLmRhdGEgKyBwYXN0X0VPTCwgd29yZCkgPT0gMCkgeworCQkJCWhlcmVkb2MuZGF0YVtwYXN0X0VPTF0gPSAnXDAnOworCQkJCWRlYnVnX3ByaW50Zl9wYXJzZSgicGFyc2VkIGhlcmVkb2MgJyVzJ1xuIiwgaGVyZWRvYy5kYXRhKTsKKwkJCQlyZXR1cm4gaGVyZWRvYy5kYXRhOworCQkJfQorCQkJd2hpbGUgKGNoID09ICdcbicpIHsKKwkJCQlvX2FkZGNocigmaGVyZWRvYywgY2gpOworCQkJCXByZXYgPSBjaDsKKyBqdW1wX2luOgorCQkJCXBhc3RfRU9MID0gaGVyZWRvYy5sZW5ndGg7CisJCQkJZG8geworCQkJCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQkJCQlpZiAoY2ggIT0gRU9GKQorCQkJCQkJbm9tbXVfYWRkY2hyKGFzX3N0cmluZywgY2gpOworCQkJCX0gd2hpbGUgKChoZXJlZG9jX2ZsYWdzICYgSEVSRURPQ19TS0lQVEFCUykgJiYgY2ggPT0gJ1x0Jyk7CisJCQl9CisJCX0KKwkJaWYgKGNoID09IEVPRikgeworCQkJb19mcmVlX3Vuc2FmZSgmaGVyZWRvYyk7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQlvX2FkZGNocigmaGVyZWRvYywgY2gpOworCQlub21tdV9hZGRjaHIoYXNfc3RyaW5nLCBjaCk7CisJCWlmIChwcmV2ID09ICdcXCcgJiYgY2ggPT0gJ1xcJykKKwkJCS8qIENvcnJlY3RseSBoYW5kbGUgZm9vXFw8ZW9sPiAobm90IGEgbGluZSBjb250LikgKi8KKwkJCXByZXYgPSAwOyAvKiBub3QgXCAqLworCQllbHNlCisJCQlwcmV2ID0gY2g7CisJfQorfQorCisvKiBMb29rIGF0IGVudGlyZSBwYXJzZSB0cmVlIGZvciBub3QteWV0LWxvYWRlZCBSRURJUkVDVF9IRVJFRE9DcworICogYW5kIGxvYWQgdGhlbSBhbGwuIFRoZXJlIHNob3VsZCBiZSBleGFjdGx5IGhlcmVkb2NfY250IG9mIHRoZW0uCisgKi8KK3N0YXRpYyBpbnQgZmV0Y2hfaGVyZWRvY3MoaW50IGhlcmVkb2NfY250LCBzdHJ1Y3QgcGFyc2VfY29udGV4dCAqY3R4LCBzdHJ1Y3QgaW5fc3RyICppbnB1dCkKK3sKKwlzdHJ1Y3QgcGlwZSAqcGkgPSBjdHgtPmxpc3RfaGVhZDsKKworCXdoaWxlIChwaSAmJiBoZXJlZG9jX2NudCkgeworCQlpbnQgaTsKKwkJc3RydWN0IGNvbW1hbmQgKmNtZCA9IHBpLT5jbWRzOworCisJCWRlYnVnX3ByaW50Zl9wYXJzZSgiZmV0Y2hfaGVyZWRvY3M6IG51bV9jbWRzOiVkIGNtZCBhcmd2MDonJXMnXG4iLAorCQkJCXBpLT5udW1fY21kcywKKwkJCQljbWQtPmFyZ3YgPyBjbWQtPmFyZ3ZbMF0gOiAiTk9ORSIpOworCQlmb3IgKGkgPSAwOyBpIDwgcGktPm51bV9jbWRzOyBpKyspIHsKKwkJCXN0cnVjdCByZWRpcl9zdHJ1Y3QgKnJlZGlyID0gY21kLT5yZWRpcmVjdHM7CisKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiZmV0Y2hfaGVyZWRvY3M6ICVkIGNtZCBhcmd2MDonJXMnXG4iLAorCQkJCQlpLCBjbWQtPmFyZ3YgPyBjbWQtPmFyZ3ZbMF0gOiAiTk9ORSIpOworCQkJd2hpbGUgKHJlZGlyKSB7CisJCQkJaWYgKHJlZGlyLT5yZF90eXBlID09IFJFRElSRUNUX0hFUkVET0MpIHsKKwkJCQkJY2hhciAqcDsKKworCQkJCQlyZWRpci0+cmRfdHlwZSA9IFJFRElSRUNUX0hFUkVET0MyOworCQkJCQkvKiByZWRpci0+cmRfZHVwIGlzIChhYil1c2VkIHRvIGluZGljYXRlIDw8LSAqLworCQkJCQlwID0gZmV0Y2hfdGlsbF9zdHIoJmN0eC0+YXNfc3RyaW5nLCBpbnB1dCwKKwkJCQkJCQlyZWRpci0+cmRfZmlsZW5hbWUsIHJlZGlyLT5yZF9kdXApOworCQkJCQlpZiAoIXApIHsKKwkJCQkJCXN5bnRheF9lcnJvcigidW5leHBlY3RlZCBFT0YgaW4gaGVyZSBkb2N1bWVudCIpOworCQkJCQkJcmV0dXJuIDE7CisJCQkJCX0KKwkJCQkJZnJlZShyZWRpci0+cmRfZmlsZW5hbWUpOworCQkJCQlyZWRpci0+cmRfZmlsZW5hbWUgPSBwOworCQkJCQloZXJlZG9jX2NudC0tOworCQkJCX0KKwkJCQlyZWRpciA9IHJlZGlyLT5uZXh0OworCQkJfQorCQkJY21kKys7CisJCX0KKwkJcGkgPSBwaS0+bmV4dDsKKwl9CisjaWYgMAorCS8qIFNob3VsZCBiZSAwLiBJZiBpdCBpc24ndCwgaXQncyBhIHBhcnNlIGVycm9yICovCisJaWYgKGhlcmVkb2NfY250KQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaGVyZWRvYyBCVUcgMiIpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBydW5fbGlzdChzdHJ1Y3QgcGlwZSAqcGkpOworI2lmIEJCX01NVQorI2RlZmluZSBwYXJzZV9zdHJlYW0ocHN0cmluZywgaW5wdXQsIGVuZF90cmlnZ2VyKSBcCisJcGFyc2Vfc3RyZWFtKGlucHV0LCBlbmRfdHJpZ2dlcikKKyNlbmRpZgorc3RhdGljIHN0cnVjdCBwaXBlICpwYXJzZV9zdHJlYW0oY2hhciAqKnBzdHJpbmcsCisJCXN0cnVjdCBpbl9zdHIgKmlucHV0LAorCQlpbnQgZW5kX3RyaWdnZXIpOworCisKKyNpZiAhRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisjZGVmaW5lIHBhcnNlX2dyb3VwKGRlc3QsIGN0eCwgaW5wdXQsIGNoKSBcCisJcGFyc2VfZ3JvdXAoY3R4LCBpbnB1dCwgY2gpCisjZW5kaWYKK3N0YXRpYyBpbnQgcGFyc2VfZ3JvdXAob19zdHJpbmcgKmRlc3QsIHN0cnVjdCBwYXJzZV9jb250ZXh0ICpjdHgsCisJc3RydWN0IGluX3N0ciAqaW5wdXQsIGludCBjaCkKK3sKKwkvKiBkZXN0IGNvbnRhaW5zIGNoYXJhY3RlcnMgc2VlbiBwcmlvciB0byAoIG9yIHsuCisJICogVHlwaWNhbGx5IGl0J3MgZW1wdHksIGJ1dCBmb3IgZnVuY3Rpb24gZGVmcywKKwkgKiBpdCBjb250YWlucyBmdW5jdGlvbiBuYW1lICh3aXRob3V0ICcoKScpLiAqLworCXN0cnVjdCBwaXBlICpwaXBlX2xpc3Q7CisJaW50IGVuZGNoOworCXN0cnVjdCBjb21tYW5kICpjb21tYW5kID0gY3R4LT5jb21tYW5kOworCisJZGVidWdfcHJpbnRmX3BhcnNlKCJwYXJzZV9ncm91cCBlbnRlcmVkXG4iKTsKKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwlpZiAoY2ggPT0gJygnICYmICFkZXN0LT5oYXNfcXVvdGVkX3BhcnQpIHsKKwkJaWYgKGRlc3QtPmxlbmd0aCkKKwkJCWlmIChkb25lX3dvcmQoZGVzdCwgY3R4KSkKKwkJCQlyZXR1cm4gMTsKKwkJaWYgKCFjb21tYW5kLT5hcmd2KQorCQkJZ290byBza2lwOyAvKiAoLi4uICovCisJCWlmIChjb21tYW5kLT5hcmd2WzFdKSB7IC8qIHdvcmQgd29yZCAuLi4gKC4uLiAqLworCQkJc3ludGF4X2Vycm9yX3VuZXhwZWN0ZWRfY2goJygnKTsKKwkJCXJldHVybiAxOworCQl9CisJCS8qIGl0IGlzICJ3b3JkKC4uLiIgb3IgIndvcmQgKC4uLiIgKi8KKwkJZG8KKwkJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCXdoaWxlIChjaCA9PSAnICcgfHwgY2ggPT0gJ1x0Jyk7CisJCWlmIChjaCAhPSAnKScpIHsKKwkJCXN5bnRheF9lcnJvcl91bmV4cGVjdGVkX2NoKGNoKTsKKwkJCXJldHVybiAxOworCQl9CisJCW5vbW11X2FkZGNocigmY3R4LT5hc19zdHJpbmcsIGNoKTsKKwkJZG8KKwkJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCXdoaWxlIChjaCA9PSAnICcgfHwgY2ggPT0gJ1x0JyB8fCBjaCA9PSAnXG4nKTsKKwkJaWYgKGNoICE9ICd7JykgeworCQkJc3ludGF4X2Vycm9yX3VuZXhwZWN0ZWRfY2goY2gpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJbm9tbXVfYWRkY2hyKCZjdHgtPmFzX3N0cmluZywgY2gpOworCQljb21tYW5kLT5jbWRfdHlwZSA9IENNRF9GVU5DREVGOworCQlnb3RvIHNraXA7CisJfQorI2VuZGlmCisKKyNpZiAwIC8qIFByZXZlbnRlZCBieSBjYWxsZXIgKi8KKwlpZiAoY29tbWFuZC0+YXJndiAvKiB3b3JkIFt3b3JkXXsuLi4gKi8KKwkgfHwgZGVzdC0+bGVuZ3RoIC8qIHdvcmR7Li4uICovCisJIHx8IGRlc3QtPmhhc19xdW90ZWRfcGFydCAvKiAiInsuLi4gKi8KKwkpIHsKKwkJc3ludGF4X2Vycm9yKE5VTEwpOworCQlkZWJ1Z19wcmludGZfcGFyc2UoInBhcnNlX2dyb3VwIHJldHVybiAxOiAiCisJCQkic3ludGF4IGVycm9yLCBncm91cHMgYW5kIGFyZ2xpc3RzIGRvbid0IG1peFxuIik7CisJCXJldHVybiAxOworCX0KKyNlbmRpZgorCisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisgc2tpcDoKKyNlbmRpZgorCWVuZGNoID0gJ30nOworCWlmIChjaCA9PSAnKCcpIHsKKwkJZW5kY2ggPSAnKSc7CisJCWNvbW1hbmQtPmNtZF90eXBlID0gQ01EX1NVQlNIRUxMOworCX0gZWxzZSB7CisJCS8qIGJhc2ggZG9lcyBub3QgYWxsb3cgIntlY2hvLi4uIiwgcmVxdWlyZXMgd2hpdGVzcGFjZSAqLworCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQlpZiAoY2ggIT0gJyAnICYmIGNoICE9ICdcdCcgJiYgY2ggIT0gJ1xuJykgeworCQkJc3ludGF4X2Vycm9yX3VuZXhwZWN0ZWRfY2goY2gpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJbm9tbXVfYWRkY2hyKCZjdHgtPmFzX3N0cmluZywgY2gpOworCX0KKworCXsKKyNpZiBCQl9NTVUKKyMgZGVmaW5lIGFzX3N0cmluZyBOVUxMCisjZWxzZQorCQljaGFyICphc19zdHJpbmcgPSBOVUxMOworI2VuZGlmCisJCXBpcGVfbGlzdCA9IHBhcnNlX3N0cmVhbSgmYXNfc3RyaW5nLCBpbnB1dCwgZW5kY2gpOworI2lmICFCQl9NTVUKKwkJaWYgKGFzX3N0cmluZykKKwkJCW9fYWRkc3RyKCZjdHgtPmFzX3N0cmluZywgYXNfc3RyaW5nKTsKKyNlbmRpZgorCQkvKiBlbXB0eSAoKS97fSBvciBwYXJzZSBlcnJvcj8gKi8KKwkJaWYgKCFwaXBlX2xpc3QgfHwgcGlwZV9saXN0ID09IEVSUl9QVFIpIHsKKwkJCS8qIHBhcnNlX3N0cmVhbSBhbHJlYWR5IGVtaXR0ZWQgZXJyb3IgbXNnICovCisJCQlpZiAoIUJCX01NVSkKKwkJCQlmcmVlKGFzX3N0cmluZyk7CisJCQlkZWJ1Z19wcmludGZfcGFyc2UoInBhcnNlX2dyb3VwIHJldHVybiAxOiAiCisJCQkJInBhcnNlX3N0cmVhbSByZXR1cm5lZCAlcFxuIiwgcGlwZV9saXN0KTsKKwkJCXJldHVybiAxOworCQl9CisJCWNvbW1hbmQtPmdyb3VwID0gcGlwZV9saXN0OworI2lmICFCQl9NTVUKKwkJYXNfc3RyaW5nW3N0cmxlbihhc19zdHJpbmcpIC0gMV0gPSAnXDAnOyAvKiBwbGluayAnKScgb3IgJ30nICovCisJCWNvbW1hbmQtPmdyb3VwX2FzX3N0cmluZyA9IGFzX3N0cmluZzsKKwkJZGVidWdfcHJpbnRmX3BhcnNlKCJlbmQgb2YgZ3JvdXAsIHJlbWVtYmVyaW5nIGFzOiclcydcbiIsCisJCQkJY29tbWFuZC0+Z3JvdXBfYXNfc3RyaW5nKTsKKyNlbmRpZgorI3VuZGVmIGFzX3N0cmluZworCX0KKwlkZWJ1Z19wcmludGZfcGFyc2UoInBhcnNlX2dyb3VwIHJldHVybiAwXG4iKTsKKwlyZXR1cm4gMDsKKwkvKiBjb21tYW5kIHJlbWFpbnMgIm9wZW4iLCBhdmFpbGFibGUgZm9yIHBvc3NpYmxlIHJlZGlyZWN0cyAqLworfQorCisjaWYgRU5BQkxFX0hVU0hfVElDSyB8fCBFTkFCTEVfU0hfTUFUSF9TVVBQT1JUIHx8IEVOQUJMRV9IVVNIX0RPTExBUl9PUFMKKy8qIFN1YnJvdXRpbmVzIGZvciBjb3B5aW5nICQoLi4uKSBhbmQgYC4uLmAgdGhpbmdzICovCitzdGF0aWMgaW50IGFkZF90aWxsX2JhY2txdW90ZShvX3N0cmluZyAqZGVzdCwgc3RydWN0IGluX3N0ciAqaW5wdXQsIGludCBpbl9kcXVvdGUpOworLyogJy4uLicgKi8KK3N0YXRpYyBpbnQgYWRkX3RpbGxfc2luZ2xlX3F1b3RlKG9fc3RyaW5nICpkZXN0LCBzdHJ1Y3QgaW5fc3RyICppbnB1dCkKK3sKKwl3aGlsZSAoMSkgeworCQlpbnQgY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJaWYgKGNoID09IEVPRikgeworCQkJc3ludGF4X2Vycm9yX3VudGVybV9jaCgnXCcnKTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChjaCA9PSAnXCcnKQorCQkJcmV0dXJuIDE7CisJCW9fYWRkY2hyKGRlc3QsIGNoKTsKKwl9Cit9CisvKiAiLi4uXCIuLi5gLi5gLi4uLiIgLSBkbyB3ZSBuZWVkIHRvIGhhbmRsZSAiLi4uJCguLikuLi4iIHRvbz8gKi8KK3N0YXRpYyBpbnQgYWRkX3RpbGxfZG91YmxlX3F1b3RlKG9fc3RyaW5nICpkZXN0LCBzdHJ1Y3QgaW5fc3RyICppbnB1dCkKK3sKKwl3aGlsZSAoMSkgeworCQlpbnQgY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJaWYgKGNoID09IEVPRikgeworCQkJc3ludGF4X2Vycm9yX3VudGVybV9jaCgnIicpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGNoID09ICciJykKKwkJCXJldHVybiAxOworCQlpZiAoY2ggPT0gJ1xcJykgeyAgLyogXHguIENvcHkgYm90aCBjaGFycy4gKi8KKwkJCW9fYWRkY2hyKGRlc3QsIGNoKTsKKwkJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCX0KKwkJb19hZGRjaHIoZGVzdCwgY2gpOworCQlpZiAoY2ggPT0gJ2AnKSB7CisJCQlpZiAoIWFkZF90aWxsX2JhY2txdW90ZShkZXN0LCBpbnB1dCwgLyppbl9kcXVvdGU6Ki8gMSkpCisJCQkJcmV0dXJuIDA7CisJCQlvX2FkZGNocihkZXN0LCBjaCk7CisJCQljb250aW51ZTsKKwkJfQorCQkvL2lmIChjaCA9PSAnJCcpIC4uLgorCX0KK30KKy8qIFByb2Nlc3MgYGNtZGAgLSBjb3B5IGNvbnRlbnRzIHVudGlsICJgIiBpcyBzZWVuLiBDb21wbGljYXRlZCBieQorICogXGAgcXVvdGluZy4KKyAqICJXaXRoaW4gdGhlIGJhY2txdW90ZWQgc3R5bGUgb2YgY29tbWFuZCBzdWJzdGl0dXRpb24sIGJhY2tzbGFzaAorICogc2hhbGwgcmV0YWluIGl0cyBsaXRlcmFsIG1lYW5pbmcsIGV4Y2VwdCB3aGVuIGZvbGxvd2VkIGJ5OiAnJCcsICdgJywgb3IgJ1wnLgorICogVGhlIHNlYXJjaCBmb3IgdGhlIG1hdGNoaW5nIGJhY2txdW90ZSBzaGFsbCBiZSBzYXRpc2ZpZWQgYnkgdGhlIGZpcnN0CisgKiBiYWNrcXVvdGUgZm91bmQgd2l0aG91dCBhIHByZWNlZGluZyBiYWNrc2xhc2g7IGR1cmluZyB0aGlzIHNlYXJjaCwKKyAqIGlmIGEgbm9uLWVzY2FwZWQgYmFja3F1b3RlIGlzIGVuY291bnRlcmVkIHdpdGhpbiBhIHNoZWxsIGNvbW1lbnQsCisgKiBhIGhlcmUtZG9jdW1lbnQsIGFuIGVtYmVkZGVkIGNvbW1hbmQgc3Vic3RpdHV0aW9uIG9mIHRoZSAkKGNvbW1hbmQpCisgKiBmb3JtLCBvciBhIHF1b3RlZCBzdHJpbmcsIHVuZGVmaW5lZCByZXN1bHRzIG9jY3VyLiBBIHNpbmdsZS1xdW90ZWQKKyAqIG9yIGRvdWJsZS1xdW90ZWQgc3RyaW5nIHRoYXQgYmVnaW5zLCBidXQgZG9lcyBub3QgZW5kLCB3aXRoaW4gdGhlCisgKiAiYC4uLmAiIHNlcXVlbmNlIHByb2R1Y2VzIHVuZGVmaW5lZCByZXN1bHRzLiIKKyAqIEV4YW1wbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0CisgKiBlY2hvIGBlY2hvICdcJ1RFU1RcYGVjaG8gWlpcYEJFU1RgICAgIFxURVNUWlpCRVNUCisgKi8KK3N0YXRpYyBpbnQgYWRkX3RpbGxfYmFja3F1b3RlKG9fc3RyaW5nICpkZXN0LCBzdHJ1Y3QgaW5fc3RyICppbnB1dCwgaW50IGluX2RxdW90ZSkKK3sKKwl3aGlsZSAoMSkgeworCQlpbnQgY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJaWYgKGNoID09ICdgJykKKwkJCXJldHVybiAxOworCQlpZiAoY2ggPT0gJ1xcJykgeworCQkJLyogXHguIENvcHkgYm90aCB1bmxlc3MgaXQgaXMgXGAsIFwkLCBcXCBhbmQgbWF5YmUgXCIgKi8KKwkJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCQlpZiAoY2ggIT0gJ2AnCisJCQkgJiYgY2ggIT0gJyQnCisJCQkgJiYgY2ggIT0gJ1xcJworCQkJICYmICghaW5fZHF1b3RlIHx8IGNoICE9ICciJykKKwkJCSkgeworCQkJCW9fYWRkY2hyKGRlc3QsICdcXCcpOworCQkJfQorCQl9CisJCWlmIChjaCA9PSBFT0YpIHsKKwkJCXN5bnRheF9lcnJvcl91bnRlcm1fY2goJ2AnKTsKKwkJCXJldHVybiAwOworCQl9CisJCW9fYWRkY2hyKGRlc3QsIGNoKTsKKwl9Cit9CisvKiBQcm9jZXNzICQoY21kKSAtIGNvcHkgY29udGVudHMgdW50aWwgIikiIGlzIHNlZW4uIENvbXBsaWNhdGVkIGJ5CisgKiBxdW90aW5nIGFuZCBuZXN0ZWQgKClzLgorICogIldpdGggdGhlICQoY29tbWFuZCkgc3R5bGUgb2YgY29tbWFuZCBzdWJzdGl0dXRpb24sIGFsbCBjaGFyYWN0ZXJzCisgKiBmb2xsb3dpbmcgdGhlIG9wZW4gcGFyZW50aGVzaXMgdG8gdGhlIG1hdGNoaW5nIGNsb3NpbmcgcGFyZW50aGVzaXMKKyAqIGNvbnN0aXR1dGUgdGhlIGNvbW1hbmQuIEFueSB2YWxpZCBzaGVsbCBzY3JpcHQgY2FuIGJlIHVzZWQgZm9yIGNvbW1hbmQsCisgKiBleGNlcHQgYSBzY3JpcHQgY29uc2lzdGluZyBzb2xlbHkgb2YgcmVkaXJlY3Rpb25zIHdoaWNoIHByb2R1Y2VzCisgKiB1bnNwZWNpZmllZCByZXN1bHRzLiIKKyAqIEV4YW1wbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXQKKyAqIGVjaG8gJChlY2hvICcoVEVTVCknIEJFU1QpICAgICAgICAgICAoVEVTVCkgQkVTVAorICogZWNobyAkKGVjaG8gJ1RFU1QpJyBCRVNUKSAgICAgICAgICAgIFRFU1QpIEJFU1QKKyAqIGVjaG8gJChlY2hvIFwoXChURVNUXCkgQkVTVCkgICAgICAgICAoKFRFU1QpIEJFU1QKKyAqCisgKiBBbHNvIGFkYXB0ZWQgdG8gZWF0ICR7dmFyJS4uLn0gYW5kICQoKC4uLikpIGNvbnN0cnVjdHMsIHNpbmNlIC4uLiBwYXJ0CisgKiBjYW4gY29udGFpbiBhcmJpdHJhcnkgY29uc3RydWN0cywganVzdCBsaWtlICQoY21kKS4KKyAqIEluIGJhc2ggY29tcGF0IG1vZGUsIGl0IG5lZWRzIHRvIGFsc28gYmUgYWJsZSB0byBzdG9wIG9uICc6JyBvciAnLycKKyAqIGZvciAke3ZhcjpOWzpNXX0gYW5kICR7dmFyL1BbL1JdfSBwYXJzaW5nLgorICovCisjZGVmaW5lIERPVUJMRV9DTE9TRV9DSEFSX0ZMQUcgMHg4MAorc3RhdGljIGludCBhZGRfdGlsbF9jbG9zaW5nX2JyYWNrZXQob19zdHJpbmcgKmRlc3QsIHN0cnVjdCBpbl9zdHIgKmlucHV0LCB1bnNpZ25lZCBlbmRfY2gpCit7CisJaW50IGNoOworCWNoYXIgZGJsID0gZW5kX2NoICYgRE9VQkxFX0NMT1NFX0NIQVJfRkxBRzsKKyMgaWYgRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQKKwljaGFyIGVuZF9jaGFyMiA9IGVuZF9jaCA+PiA4OworIyBlbmRpZgorCWVuZF9jaCAmPSAoRE9VQkxFX0NMT1NFX0NIQVJfRkxBRyAtIDEpOworCisJd2hpbGUgKDEpIHsKKwkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJaWYgKGNoID09IEVPRikgeworCQkJc3ludGF4X2Vycm9yX3VudGVybV9jaChlbmRfY2gpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGNoID09IGVuZF9jaCAgSUZfSFVTSF9CQVNIX0NPTVBBVCggfHwgY2ggPT0gZW5kX2NoYXIyKSkgeworCQkJaWYgKCFkYmwpCisJCQkJYnJlYWs7CisJCQkvKiB3ZSBsb29rIGZvciBjbG9zaW5nICkpIG9mICQoKEVYUFIpKSAqLworCQkJaWYgKGlfcGVlayhpbnB1dCkgPT0gZW5kX2NoKSB7CisJCQkJaV9nZXRjaChpbnB1dCk7IC8qIGVhdCBzZWNvbmQgJyknICovCisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJb19hZGRjaHIoZGVzdCwgY2gpOworCQlpZiAoY2ggPT0gJygnIHx8IGNoID09ICd7JykgeworCQkJY2ggPSAoY2ggPT0gJygnID8gJyknIDogJ30nKTsKKwkJCWlmICghYWRkX3RpbGxfY2xvc2luZ19icmFja2V0KGRlc3QsIGlucHV0LCBjaCkpCisJCQkJcmV0dXJuIDA7CisJCQlvX2FkZGNocihkZXN0LCBjaCk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoY2ggPT0gJ1wnJykgeworCQkJaWYgKCFhZGRfdGlsbF9zaW5nbGVfcXVvdGUoZGVzdCwgaW5wdXQpKQorCQkJCXJldHVybiAwOworCQkJb19hZGRjaHIoZGVzdCwgY2gpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNoID09ICciJykgeworCQkJaWYgKCFhZGRfdGlsbF9kb3VibGVfcXVvdGUoZGVzdCwgaW5wdXQpKQorCQkJCXJldHVybiAwOworCQkJb19hZGRjaHIoZGVzdCwgY2gpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNoID09ICdgJykgeworCQkJaWYgKCFhZGRfdGlsbF9iYWNrcXVvdGUoZGVzdCwgaW5wdXQsIC8qaW5fZHF1b3RlOiovIDApKQorCQkJCXJldHVybiAwOworCQkJb19hZGRjaHIoZGVzdCwgY2gpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKGNoID09ICdcXCcpIHsKKwkJCS8qIFx4LiBDb3B5IHZlcmJhdGltLiBJbXBvcnRhbnQgZm9yICBcKCwgXCkgKi8KKwkJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCQlpZiAoY2ggPT0gRU9GKSB7CisJCQkJc3ludGF4X2Vycm9yX3VudGVybV9jaCgnKScpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJb19hZGRjaHIoZGVzdCwgY2gpOworCQkJY29udGludWU7CisJCX0KKwl9CisJcmV0dXJuIGNoOworfQorI2VuZGlmIC8qIEVOQUJMRV9IVVNIX1RJQ0sgfHwgRU5BQkxFX1NIX01BVEhfU1VQUE9SVCB8fCBFTkFCTEVfSFVTSF9ET0xMQVJfT1BTICovCisKKy8qIFJldHVybiBjb2RlOiAwIGZvciBPSywgMSBmb3Igc3ludGF4IGVycm9yICovCisjaWYgQkJfTU1VCisjZGVmaW5lIHBhcnNlX2RvbGxhcihhc19zdHJpbmcsIGRlc3QsIGlucHV0LCBxdW90ZV9tYXNrKSBcCisJcGFyc2VfZG9sbGFyKGRlc3QsIGlucHV0LCBxdW90ZV9tYXNrKQorI2RlZmluZSBhc19zdHJpbmcgTlVMTAorI2VuZGlmCitzdGF0aWMgaW50IHBhcnNlX2RvbGxhcihvX3N0cmluZyAqYXNfc3RyaW5nLAorCQlvX3N0cmluZyAqZGVzdCwKKwkJc3RydWN0IGluX3N0ciAqaW5wdXQsIHVuc2lnbmVkIGNoYXIgcXVvdGVfbWFzaykKK3sKKwlpbnQgY2ggPSBpX3BlZWsoaW5wdXQpOyAgLyogZmlyc3QgY2hhcmFjdGVyIGFmdGVyIHRoZSAkICovCisKKwlkZWJ1Z19wcmludGZfcGFyc2UoInBhcnNlX2RvbGxhciBlbnRlcmVkOiBjaD0nJWMnXG4iLCBjaCk7CisJaWYgKGlzYWxwaGEoY2gpKSB7CisJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCW5vbW11X2FkZGNocihhc19zdHJpbmcsIGNoKTsKKyBtYWtlX3ZhcjoKKwkJb19hZGRjaHIoZGVzdCwgU1BFQ0lBTF9WQVJfU1lNQk9MKTsKKwkJd2hpbGUgKDEpIHsKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiOiAnJWMnXG4iLCBjaCk7CisJCQlvX2FkZGNocihkZXN0LCBjaCB8IHF1b3RlX21hc2spOworCQkJcXVvdGVfbWFzayA9IDA7CisJCQljaCA9IGlfcGVlayhpbnB1dCk7CisJCQlpZiAoIWlzYWxudW0oY2gpICYmIGNoICE9ICdfJykKKwkJCQlicmVhazsKKwkJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCQlub21tdV9hZGRjaHIoYXNfc3RyaW5nLCBjaCk7CisJCX0KKwkJb19hZGRjaHIoZGVzdCwgU1BFQ0lBTF9WQVJfU1lNQk9MKTsKKwl9IGVsc2UgaWYgKGlzZGlnaXQoY2gpKSB7CisgbWFrZV9vbmVfY2hhcl92YXI6CisJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCW5vbW11X2FkZGNocihhc19zdHJpbmcsIGNoKTsKKwkJb19hZGRjaHIoZGVzdCwgU1BFQ0lBTF9WQVJfU1lNQk9MKTsKKwkJZGVidWdfcHJpbnRmX3BhcnNlKCI6ICclYydcbiIsIGNoKTsKKwkJb19hZGRjaHIoZGVzdCwgY2ggfCBxdW90ZV9tYXNrKTsKKwkJb19hZGRjaHIoZGVzdCwgU1BFQ0lBTF9WQVJfU1lNQk9MKTsKKwl9IGVsc2Ugc3dpdGNoIChjaCkgeworCWNhc2UgJyQnOiAvKiBwaWQgKi8KKwljYXNlICchJzogLyogbGFzdCBiZyBwaWQgKi8KKwljYXNlICc/JzogLyogbGFzdCBleGl0IGNvZGUgKi8KKwljYXNlICcjJzogLyogbnVtYmVyIG9mIGFyZ3MgKi8KKwljYXNlICcqJzogLyogYXJncyAqLworCWNhc2UgJ0AnOiAvKiBhcmdzICovCisJCWdvdG8gbWFrZV9vbmVfY2hhcl92YXI7CisJY2FzZSAneyc6IHsKKwkJb19hZGRjaHIoZGVzdCwgU1BFQ0lBTF9WQVJfU1lNQk9MKTsKKworCQljaCA9IGlfZ2V0Y2goaW5wdXQpOyAvKiBlYXQgJ3snICovCisJCW5vbW11X2FkZGNocihhc19zdHJpbmcsIGNoKTsKKworCQljaCA9IGlfZ2V0Y2goaW5wdXQpOyAvKiBmaXJzdCBjaGFyIGFmdGVyICd7JyAqLworCQkvKiBJdCBzaG91bGQgYmUgJHs/fSwgb3IgJHsjdmFyfSwKKwkJICogb3IgZXZlbiAkez8rc3Vic3R9IC0gb3BlcmF0b3IgYWN0aW5nIG9uIGEgc3BlY2lhbCB2YXJpYWJsZSwKKwkJICogb3IgdGhlIGJlZ2lubmluZyBvZiB2YXJpYWJsZSBuYW1lLgorCQkgKi8KKwkJaWYgKGNoID09IEVPRgorCQkgfHwgKCFzdHJjaHIoX1NQRUNJQUxfVkFSU19TVFIsIGNoKSAmJiAhaXNhbG51bShjaCkpIC8qIG5vdCBvbmUgb2YgdGhvc2UgKi8KKwkJKSB7CisgYmFkX2RvbGxhcl9zeW50YXg6CisJCQlzeW50YXhfZXJyb3JfdW50ZXJtX3N0cigiJHtuYW1lfSIpOworCQkJZGVidWdfcHJpbnRmX3BhcnNlKCJwYXJzZV9kb2xsYXIgcmV0dXJuIDA6IHVudGVybWluYXRlZCAke25hbWV9XG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCW5vbW11X2FkZGNocihhc19zdHJpbmcsIGNoKTsKKwkJY2ggfD0gcXVvdGVfbWFzazsKKworCQkvKiBJdCdzIHBvc3NpYmxlIHRvIGp1c3QgY2FsbCBhZGRfdGlsbF9jbG9zaW5nX2JyYWNrZXQoKSBhdCB0aGlzIHBvaW50LgorCQkgKiBIb3dldmVyLCB0aGlzIHJlZ3Jlc3NlcyBzb21lIG9mIG91ciB0ZXN0c3VpdGUgY2FzZXMKKwkJICogd2hpY2ggY2hlY2sgaW52YWxpZCBjb25zdHJ1Y3RzIGxpa2UgJHslfS4KKwkJICogT2ggd2VsbC4uLiBsZXQncyBjaGVjayB0aGF0IHRoZSB2YXIgbmFtZSBwYXJ0IGlzIGZpbmUuLi4gKi8KKworCQl3aGlsZSAoMSkgeworCQkJdW5zaWduZWQgcG9zOworCisJCQlvX2FkZGNocihkZXN0LCBjaCk7CisJCQlkZWJ1Z19wcmludGZfcGFyc2UoIjogJyVjJ1xuIiwgY2gpOworCisJCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQkJbm9tbXVfYWRkY2hyKGFzX3N0cmluZywgY2gpOworCQkJaWYgKGNoID09ICd9JykKKwkJCQlicmVhazsKKworCQkJaWYgKCFpc2FsbnVtKGNoKSAmJiBjaCAhPSAnXycpIHsKKwkJCQl1bnNpZ25lZCBlbmRfY2g7CisJCQkJdW5zaWduZWQgY2hhciBsYXN0X2NoOworCQkJCS8qIGhhbmRsZSBwYXJhbWV0ZXIgZXhwYW5zaW9ucworCQkJCSAqIGh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS91dGlsaXRpZXMveGN1X2NoYXAwMi5odG1sI3RhZ18wMl8wNl8wMgorCQkJCSAqLworCQkJCWlmICghc3RyY2hyKFZBUl9TVUJTVF9PUFMsIGNoKSkgLyogJHt2YXI8YmFkX2NoYXI+Li4uICovCisJCQkJCWdvdG8gYmFkX2RvbGxhcl9zeW50YXg7CisKKwkJCQkvKiBFYXQgZXZlcnl0aGluZyB1bnRpbCBjbG9zaW5nICd9JyAob3IgJzonKSAqLworCQkJCWVuZF9jaCA9ICd9JzsKKwkJCQlpZiAoRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQKKwkJCQkgJiYgY2ggPT0gJzonCisJCQkJICYmICFzdHJjaHIoTUlOVVNfUExVU19FUVVBTF9RVUVTVElPTiwgaV9wZWVrKGlucHV0KSkKKwkJCQkpIHsKKwkJCQkJLyogSXQncyAke3ZhcjpOWzpNXX0gdGhpbmcgKi8KKwkJCQkJZW5kX2NoID0gJ30nICogMHgxMDAgKyAnOic7CisJCQkJfQorCQkJCWlmIChFTkFCTEVfSFVTSF9CQVNIX0NPTVBBVAorCQkJCSAmJiBjaCA9PSAnLycKKwkJCQkpIHsKKwkJCQkJLyogSXQncyAke3Zhci9bL11wYXR0ZXJuWy9yZXBsXX0gdGhpbmcgKi8KKwkJCQkJaWYgKGlfcGVlayhpbnB1dCkgPT0gJy8nKSB7IC8qICR7dmFyLy9wYXR0ZXJuWy9yZXBsXX0/ICovCisJCQkJCQlpX2dldGNoKGlucHV0KTsKKwkJCQkJCW5vbW11X2FkZGNocihhc19zdHJpbmcsICcvJyk7CisJCQkJCQljaCA9ICdcXCc7CisJCQkJCX0KKwkJCQkJZW5kX2NoID0gJ30nICogMHgxMDAgKyAnLyc7CisJCQkJfQorCQkJCW9fYWRkY2hyKGRlc3QsIGNoKTsKKyBhZ2FpbjoKKwkJCQlpZiAoIUJCX01NVSkKKwkJCQkJcG9zID0gZGVzdC0+bGVuZ3RoOworI2lmIEVOQUJMRV9IVVNIX0RPTExBUl9PUFMKKwkJCQlsYXN0X2NoID0gYWRkX3RpbGxfY2xvc2luZ19icmFja2V0KGRlc3QsIGlucHV0LCBlbmRfY2gpOworCQkJCWlmIChsYXN0X2NoID09IDApIC8qIGVycm9yPyAqLworCQkJCQlyZXR1cm4gMDsKKyNlbHNlCisjZXJyb3IgU2ltcGxlIGNvZGUgdG8gb25seSBhbGxvdyAke3Zhcn0gaXMgbm90IGltcGxlbWVudGVkCisjZW5kaWYKKwkJCQlpZiAoYXNfc3RyaW5nKSB7CisJCQkJCW9fYWRkc3RyKGFzX3N0cmluZywgZGVzdC0+ZGF0YSArIHBvcyk7CisJCQkJCW9fYWRkY2hyKGFzX3N0cmluZywgbGFzdF9jaCk7CisJCQkJfQorCisJCQkJaWYgKEVOQUJMRV9IVVNIX0JBU0hfQ09NUEFUICYmIChlbmRfY2ggJiAweGZmMDApKSB7CisJCQkJCS8qIGNsb3NlIHRoZSBmaXJzdCBibG9jazogKi8KKwkJCQkJb19hZGRjaHIoZGVzdCwgU1BFQ0lBTF9WQVJfU1lNQk9MKTsKKwkJCQkJLyogd2hpbGUgcGFyc2luZyBOIGZyb20gJHt2YXI6Tls6TV19CisJCQkJCSAqIG9yIHBhdHRlcm4gZnJvbSAke3Zhci9bL11wYXR0ZXJuWy9yZXBsXX0gKi8KKwkJCQkJaWYgKChlbmRfY2ggJiAweGZmKSA9PSBsYXN0X2NoKSB7CisJCQkJCQkvKiBnb3QgJzonIG9yICcvJy0gcGFyc2UgdGhlIHJlc3QgKi8KKwkJCQkJCWVuZF9jaCA9ICd9JzsKKwkJCQkJCWdvdG8gYWdhaW47CisJCQkJCX0KKwkJCQkJLyogZ290ICd9JyAqLworCQkJCQlpZiAoZW5kX2NoID09ICd9JyAqIDB4MTAwICsgJzonKSB7CisJCQkJCQkvKiBpdCdzICR7dmFyOk59IC0gZW11bGF0ZSA6OTk5OTk5OTk5ICovCisJCQkJCQlvX2FkZHN0cihkZXN0LCAiOTk5OTk5OTk5Iik7CisJCQkJCX0gLyogZWxzZTogaXQncyAke3Zhci9bL11wYXR0ZXJufSAqLworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlvX2FkZGNocihkZXN0LCBTUEVDSUFMX1ZBUl9TWU1CT0wpOworCQlicmVhazsKKwl9CisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVCB8fCBFTkFCTEVfSFVTSF9USUNLCisJY2FzZSAnKCc6IHsKKwkJdW5zaWduZWQgcG9zOworCisJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCW5vbW11X2FkZGNocihhc19zdHJpbmcsIGNoKTsKKyMgaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorCQlpZiAoaV9wZWVrKGlucHV0KSA9PSAnKCcpIHsKKwkJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCQlub21tdV9hZGRjaHIoYXNfc3RyaW5nLCBjaCk7CisJCQlvX2FkZGNocihkZXN0LCBTUEVDSUFMX1ZBUl9TWU1CT0wpOworCQkJb19hZGRjaHIoZGVzdCwgLypxdW90ZV9tYXNrIHwqLyAnKycpOworCQkJaWYgKCFCQl9NTVUpCisJCQkJcG9zID0gZGVzdC0+bGVuZ3RoOworCQkJaWYgKCFhZGRfdGlsbF9jbG9zaW5nX2JyYWNrZXQoZGVzdCwgaW5wdXQsICcpJyB8IERPVUJMRV9DTE9TRV9DSEFSX0ZMQUcpKQorCQkJCXJldHVybiAwOyAvKiBlcnJvciAqLworCQkJaWYgKGFzX3N0cmluZykgeworCQkJCW9fYWRkc3RyKGFzX3N0cmluZywgZGVzdC0+ZGF0YSArIHBvcyk7CisJCQkJb19hZGRjaHIoYXNfc3RyaW5nLCAnKScpOworCQkJCW9fYWRkY2hyKGFzX3N0cmluZywgJyknKTsKKwkJCX0KKwkJCW9fYWRkY2hyKGRlc3QsIFNQRUNJQUxfVkFSX1NZTUJPTCk7CisJCQlicmVhazsKKwkJfQorIyBlbmRpZgorIyBpZiBFTkFCTEVfSFVTSF9USUNLCisJCW9fYWRkY2hyKGRlc3QsIFNQRUNJQUxfVkFSX1NZTUJPTCk7CisJCW9fYWRkY2hyKGRlc3QsIHF1b3RlX21hc2sgfCAnYCcpOworCQlpZiAoIUJCX01NVSkKKwkJCXBvcyA9IGRlc3QtPmxlbmd0aDsKKwkJaWYgKCFhZGRfdGlsbF9jbG9zaW5nX2JyYWNrZXQoZGVzdCwgaW5wdXQsICcpJykpCisJCQlyZXR1cm4gMDsgLyogZXJyb3IgKi8KKwkJaWYgKGFzX3N0cmluZykgeworCQkJb19hZGRzdHIoYXNfc3RyaW5nLCBkZXN0LT5kYXRhICsgcG9zKTsKKwkJCW9fYWRkY2hyKGFzX3N0cmluZywgJyknKTsKKwkJfQorCQlvX2FkZGNocihkZXN0LCBTUEVDSUFMX1ZBUl9TWU1CT0wpOworIyBlbmRpZgorCQlicmVhazsKKwl9CisjZW5kaWYKKwljYXNlICdfJzoKKwkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJbm9tbXVfYWRkY2hyKGFzX3N0cmluZywgY2gpOworCQljaCA9IGlfcGVlayhpbnB1dCk7CisJCWlmIChpc2FsbnVtKGNoKSkgeyAvKiBpdCdzICRfbmFtZSBvciAkXzEyMyAqLworCQkJY2ggPSAnXyc7CisJCQlnb3RvIG1ha2VfdmFyOworCQl9CisJCS8qIGVsc2U6IGl0J3MgJF8gKi8KKwkvKiBUT0RPOiAkXyBhbmQgJC06ICovCisJLyogJF8gU2hlbGwgb3Igc2hlbGwgc2NyaXB0IG5hbWU7IG9yIGxhc3QgYXJndW1lbnQgb2YgbGFzdCBjb21tYW5kCisJICogKGlmIGxhc3QgY29tbWFuZCB3YXNuJ3QgYSBwaXBlOyBpZiBpdCB3YXMsIGJhc2ggc2V0cyAkXyB0byAiIik7CisJICogYnV0IGluIGNvbW1hbmQncyBlbnYsIHNldCB0byBmdWxsIHBhdGhuYW1lIHVzZWQgdG8gaW52b2tlIGl0ICovCisJLyogJC0gT3B0aW9uIGZsYWdzIHNldCBieSBzZXQgYnVpbHRpbiBvciBzaGVsbCBvcHRpb25zICgtaSBldGMpICovCisJZGVmYXVsdDoKKwkJb19hZGRRY2hyKGRlc3QsICckJyk7CisJfQorCWRlYnVnX3ByaW50Zl9wYXJzZSgicGFyc2VfZG9sbGFyIHJldHVybiAxIChvaylcbiIpOworCXJldHVybiAxOworI3VuZGVmIGFzX3N0cmluZworfQorCisjaWYgQkJfTU1VCisjIGlmIEVOQUJMRV9IVVNIX0JBU0hfQ09NUEFUCisjZGVmaW5lIGVuY29kZV9zdHJpbmcoYXNfc3RyaW5nLCBkZXN0LCBpbnB1dCwgZHF1b3RlX2VuZCwgcHJvY2Vzc19ia3NsYXNoKSBcCisJZW5jb2RlX3N0cmluZyhkZXN0LCBpbnB1dCwgZHF1b3RlX2VuZCwgcHJvY2Vzc19ia3NsYXNoKQorIyBlbHNlCisvKiBvbmx5ICR7dmFyL3BhdHRlcm4vcmVwbH0gKGl0cyBwYXR0ZXJuIHBhcnQpIG5lZWRzIGFkZGl0aW9uYWwgbW9kZSAqLworI2RlZmluZSBlbmNvZGVfc3RyaW5nKGFzX3N0cmluZywgZGVzdCwgaW5wdXQsIGRxdW90ZV9lbmQsIHByb2Nlc3NfYmtzbGFzaCkgXAorCWVuY29kZV9zdHJpbmcoZGVzdCwgaW5wdXQsIGRxdW90ZV9lbmQpCisjIGVuZGlmCisjZGVmaW5lIGFzX3N0cmluZyBOVUxMCisKKyNlbHNlIC8qICFNTVUgKi8KKworIyBpZiBFTkFCTEVfSFVTSF9CQVNIX0NPTVBBVAorLyogYWxsIHBhcmFtZXRlcnMgYXJlIG5lZWRlZCwgbm8gbWFjcm8gdHJpY2tzICovCisjIGVsc2UKKyNkZWZpbmUgZW5jb2RlX3N0cmluZyhhc19zdHJpbmcsIGRlc3QsIGlucHV0LCBkcXVvdGVfZW5kLCBwcm9jZXNzX2Jrc2xhc2gpIFwKKwllbmNvZGVfc3RyaW5nKGFzX3N0cmluZywgZGVzdCwgaW5wdXQsIGRxdW90ZV9lbmQpCisjIGVuZGlmCisjZW5kaWYKK3N0YXRpYyBpbnQgZW5jb2RlX3N0cmluZyhvX3N0cmluZyAqYXNfc3RyaW5nLAorCQlvX3N0cmluZyAqZGVzdCwKKwkJc3RydWN0IGluX3N0ciAqaW5wdXQsCisJCWludCBkcXVvdGVfZW5kLAorCQlpbnQgcHJvY2Vzc19ia3NsYXNoKQoreworI2lmICFFTkFCTEVfSFVTSF9CQVNIX0NPTVBBVAorCWNvbnN0IGludCBwcm9jZXNzX2Jrc2xhc2ggPSAxOworI2VuZGlmCisJaW50IGNoOworCWludCBuZXh0OworCisgYWdhaW46CisJY2ggPSBpX2dldGNoKGlucHV0KTsKKwlpZiAoY2ggIT0gRU9GKQorCQlub21tdV9hZGRjaHIoYXNfc3RyaW5nLCBjaCk7CisJaWYgKGNoID09IGRxdW90ZV9lbmQpIHsgLyogbWF5IGJlIG9ubHkgJyInIG9yIEVPRiAqLworCQlkZWJ1Z19wcmludGZfcGFyc2UoImVuY29kZV9zdHJpbmcgcmV0dXJuIDEgKG9rKVxuIik7CisJCXJldHVybiAxOworCX0KKwkvKiBub3RlOiBjYW4ndCBtb3ZlIGl0IGFib3ZlIGNoID09IGRxdW90ZV9lbmQgY2hlY2shICovCisJaWYgKGNoID09IEVPRikgeworCQlzeW50YXhfZXJyb3JfdW50ZXJtX2NoKCciJyk7CisJCXJldHVybiAwOyAvKiBlcnJvciAqLworCX0KKwluZXh0ID0gJ1wwJzsKKwlpZiAoY2ggIT0gJ1xuJykgeworCQluZXh0ID0gaV9wZWVrKGlucHV0KTsKKwl9CisJZGVidWdfcHJpbnRmX3BhcnNlKCJcIiBjaD0lYyAoJWQpIGVzY2FwZT0lZFxuIiwKKwkJCWNoLCBjaCwgISEoZGVzdC0+b19leHBmbGFncyAmIEVYUF9GTEFHX0VTQ19HTE9CX0NIQVJTKSk7CisJaWYgKHByb2Nlc3NfYmtzbGFzaCAmJiBjaCA9PSAnXFwnKSB7CisJCWlmIChuZXh0ID09IEVPRikgeworCQkJc3ludGF4X2Vycm9yKCJcXDxlb2Y+Iik7CisJCQl4ZnVuY19kaWUoKTsKKwkJfQorCQkvKiBiYXNoOgorCQkgKiAiVGhlIGJhY2tzbGFzaCByZXRhaW5zIGl0cyBzcGVjaWFsIG1lYW5pbmcgW2luICIuLi4iXQorCQkgKiBvbmx5IHdoZW4gZm9sbG93ZWQgYnkgb25lIG9mIHRoZSBmb2xsb3dpbmcgY2hhcmFjdGVyczoKKwkJICogJCwgYCwgIiwgXCwgb3IgPG5ld2xpbmU+LiAgQSBkb3VibGUgcXVvdGUgbWF5IGJlIHF1b3RlZAorCQkgKiB3aXRoaW4gZG91YmxlIHF1b3RlcyBieSBwcmVjZWRpbmcgaXQgd2l0aCBhIGJhY2tzbGFzaC4iCisJCSAqIE5COiBpbiAodW5xdW90ZWQpIGhlcmVkb2MsIGFib3ZlIGRvZXMgbm90IGFwcGx5IHRvICIsCisJCSAqIHRoZXJlZm9yZSB3ZSBjaGVjayBmb3IgaXQgYnkgIm5leHQgPT0gZHF1b3RlX2VuZCIgY29uZC4KKwkJICovCisJCWlmIChuZXh0ID09IGRxdW90ZV9lbmQgfHwgc3RyY2hyKCIkYFxcXG4iLCBuZXh0KSkgeworCQkJY2ggPSBpX2dldGNoKGlucHV0KTsgLyogZWF0IG5leHQgKi8KKwkJCWlmIChjaCA9PSAnXG4nKQorCQkJCWdvdG8gYWdhaW47IC8qIHNraXAgXDxuZXdsaW5lPiAqLworCQl9IC8qIGVsc2U6IGNoIHJlbWFpbnMgPT0gJ1xcJywgYW5kIHdlIGRvdWJsZSBpdCBiZWxvdzogKi8KKwkJb19hZGRxY2hyKGRlc3QsIGNoKTsgLyogXGMgaWYgYyBpcyBhIGdsb2IgY2hhciwgZWxzZSBqdXN0IGMgKi8KKwkJbm9tbXVfYWRkY2hyKGFzX3N0cmluZywgY2gpOworCQlnb3RvIGFnYWluOworCX0KKwlpZiAoY2ggPT0gJyQnKSB7CisJCWlmICghcGFyc2VfZG9sbGFyKGFzX3N0cmluZywgZGVzdCwgaW5wdXQsIC8qcXVvdGVfbWFzazoqLyAweDgwKSkgeworCQkJZGVidWdfcHJpbnRmX3BhcnNlKCJlbmNvZGVfc3RyaW5nIHJldHVybiAwOiAiCisJCQkJCSJwYXJzZV9kb2xsYXIgcmV0dXJuZWQgMCAoZXJyb3IpXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJCWdvdG8gYWdhaW47CisJfQorI2lmIEVOQUJMRV9IVVNIX1RJQ0sKKwlpZiAoY2ggPT0gJ2AnKSB7CisJCS8vdW5zaWduZWQgcG9zID0gZGVzdC0+bGVuZ3RoOworCQlvX2FkZGNocihkZXN0LCBTUEVDSUFMX1ZBUl9TWU1CT0wpOworCQlvX2FkZGNocihkZXN0LCAweDgwIHwgJ2AnKTsKKwkJaWYgKCFhZGRfdGlsbF9iYWNrcXVvdGUoZGVzdCwgaW5wdXQsIC8qaW5fZHF1b3RlOiovIGRxdW90ZV9lbmQgPT0gJyInKSkKKwkJCXJldHVybiAwOyAvKiBlcnJvciAqLworCQlvX2FkZGNocihkZXN0LCBTUEVDSUFMX1ZBUl9TWU1CT0wpOworCQkvL2RlYnVnX3ByaW50Zl9zdWJzdCgiU1VCU1QgUkVTMyAnJXMnXG4iLCBkZXN0LT5kYXRhICsgcG9zKTsKKwkJZ290byBhZ2FpbjsKKwl9CisjZW5kaWYKKwlvX2FkZFFjaHIoZGVzdCwgY2gpOworCWdvdG8gYWdhaW47CisjdW5kZWYgYXNfc3RyaW5nCit9CisKKy8qCisgKiBTY2FuIGlucHV0IHVudGlsIEVPRiBvciBlbmRfdHJpZ2dlciBjaGFyLgorICogUmV0dXJuIGEgbGlzdCBvZiBwaXBlcyB0byBleGVjdXRlLCBvciBOVUxMIG9uIEVPRgorICogb3IgaWYgZW5kX3RyaWdnZXIgY2hhcmFjdGVyIGlzIG1ldC4KKyAqIE9uIHN5bnRheCBlcnJvciwgZXhpdCBpZiBzaGVsbCBpcyBub3QgaW50ZXJhY3RpdmUsCisgKiByZXNldCBwYXJzaW5nIG1hY2hpbmVyeSBhbmQgc3RhcnQgcGFyc2luZyBhbmV3LAorICogb3IgcmV0dXJuIEVSUl9QVFIuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGlwZSAqcGFyc2Vfc3RyZWFtKGNoYXIgKipwc3RyaW5nLAorCQlzdHJ1Y3QgaW5fc3RyICppbnB1dCwKKwkJaW50IGVuZF90cmlnZ2VyKQoreworCXN0cnVjdCBwYXJzZV9jb250ZXh0IGN0eDsKKwlvX3N0cmluZyBkZXN0ID0gTlVMTF9PX1NUUklORzsKKwlpbnQgaGVyZWRvY19jbnQ7CisKKwkvKiBTaW5nbGUtcXVvdGUgdHJpZ2dlcnMgYSBieXBhc3Mgb2YgdGhlIG1haW4gbG9vcCB1bnRpbCBpdHMgbWF0ZSBpcworCSAqIGZvdW5kLiAgV2hlbiByZWN1cnNpbmcsIHF1b3RlIHN0YXRlIGlzIHBhc3NlZCBpbiB2aWEgZGVzdC0+b19leHBmbGFncy4KKwkgKi8KKwlkZWJ1Z19wcmludGZfcGFyc2UoInBhcnNlX3N0cmVhbSBlbnRlcmVkLCBlbmRfdHJpZ2dlcj0nJWMnXG4iLAorCQkJZW5kX3RyaWdnZXIgPyBlbmRfdHJpZ2dlciA6ICdYJyk7CisJZGVidWdfZW50ZXIoKTsKKworCS8qIElmIHZlcnkgZmlyc3QgYXJnIGlzICIiIG9yICcnLCBkZXN0LmRhdGEgbWF5IGVuZCB1cCBOVUxMLgorCSAqIFByZXZlbnRpbmcgdGhpczogKi8KKwlvX2FkZGNocigmZGVzdCwgJ1wwJyk7CisJZGVzdC5sZW5ndGggPSAwOworCisJLyogV2UgdXNlZCB0byBzZXBhcmF0ZSB3b3JkcyBvbiAkSUZTIGhlcmUuIFRoaXMgd2FzIHdyb25nLgorCSAqICRJRlMgaXMgdXNlZCBvbmx5IGZvciB3b3JkIHNwbGl0dGluZyB3aGVuICR2YXIgaXMgZXhwYW5kZWQsCisJICogaGVyZSB3ZSBzaG91bGQgdXNlIGJsYW5rIGNoYXJzIGFzIHNlcGFyYXRvcnMsIG5vdCAkSUZTCisJICovCisKKwlpZiAoTUFZQkVfQVNTSUdOTUVOVCAhPSAwKQorCQlkZXN0Lm9fYXNzaWdubWVudCA9IE1BWUJFX0FTU0lHTk1FTlQ7CisJaW5pdGlhbGl6ZV9jb250ZXh0KCZjdHgpOworCWhlcmVkb2NfY250ID0gMDsKKwl3aGlsZSAoMSkgeworCQljb25zdCBjaGFyICppc19ibGFuazsKKwkJY29uc3QgY2hhciAqaXNfc3BlY2lhbDsKKwkJaW50IGNoOworCQlpbnQgbmV4dDsKKwkJaW50IHJlZGlyX2ZkOworCQlyZWRpcl90eXBlIHJlZGlyX3N0eWxlOworCisJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCWRlYnVnX3ByaW50Zl9wYXJzZSgiOiBjaD0lYyAoJWQpIGVzY2FwZT0lZFxuIiwKKwkJCQljaCwgY2gsICEhKGRlc3Qub19leHBmbGFncyAmIEVYUF9GTEFHX0VTQ19HTE9CX0NIQVJTKSk7CisJCWlmIChjaCA9PSBFT0YpIHsKKwkJCXN0cnVjdCBwaXBlICpwaTsKKworCQkJaWYgKGhlcmVkb2NfY250KSB7CisJCQkJc3ludGF4X2Vycm9yX3VudGVybV9zdHIoImhlcmUgZG9jdW1lbnQiKTsKKwkJCQlnb3RvIHBhcnNlX2Vycm9yOworCQkJfQorCQkJLyogZW5kX3RyaWdnZXIgPT0gJ30nIGNhc2UgZXJyb3JzIG91dCBlYXJsaWVyLAorCQkJICogY2hlY2tpbmcgb25seSAnKScgKi8KKwkJCWlmIChlbmRfdHJpZ2dlciA9PSAnKScpIHsKKwkJCQlzeW50YXhfZXJyb3JfdW50ZXJtX2NoKCcoJyk7CisJCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCX0KKworCQkJaWYgKGRvbmVfd29yZCgmZGVzdCwgJmN0eCkpIHsKKwkJCQlnb3RvIHBhcnNlX2Vycm9yOworCQkJfQorCQkJb19mcmVlKCZkZXN0KTsKKwkJCWRvbmVfcGlwZSgmY3R4LCBQSVBFX1NFUSk7CisJCQlwaSA9IGN0eC5saXN0X2hlYWQ7CisJCQkvKiBJZiB3ZSBnb3Qgbm90aGluZy4uLiAqLworCQkJLyogKHRoaXMgbWFrZXMgYmFyZSAiJiIgY21kIGEgbm8tb3AuCisJCQkgKiBiYXNoIHNheXM6ICJzeW50YXggZXJyb3IgbmVhciB1bmV4cGVjdGVkIHRva2VuICcmJyIpICovCisJCQlpZiAocGktPm51bV9jbWRzID09IDAKKwkJCUlGX0hBU19LRVlXT1JEUygmJiBwaS0+cmVzX3dvcmQgPT0gUkVTX05PTkUpCisJCQkpIHsKKwkJCQlmcmVlX3BpcGVfbGlzdChwaSk7CisJCQkJcGkgPSBOVUxMOworCQkJfQorI2lmICFCQl9NTVUKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiYXNfc3RyaW5nMSAnJXMnXG4iLCBjdHguYXNfc3RyaW5nLmRhdGEpOworCQkJaWYgKHBzdHJpbmcpCisJCQkJKnBzdHJpbmcgPSBjdHguYXNfc3RyaW5nLmRhdGE7CisJCQllbHNlCisJCQkJb19mcmVlX3Vuc2FmZSgmY3R4LmFzX3N0cmluZyk7CisjZW5kaWYKKwkJCWRlYnVnX2xlYXZlKCk7CisJCQlkZWJ1Z19wcmludGZfcGFyc2UoInBhcnNlX3N0cmVhbSByZXR1cm4gJXBcbiIsIHBpKTsKKwkJCXJldHVybiBwaTsKKwkJfQorCQlub21tdV9hZGRjaHIoJmN0eC5hc19zdHJpbmcsIGNoKTsKKworCQluZXh0ID0gJ1wwJzsKKwkJaWYgKGNoICE9ICdcbicpCisJCQluZXh0ID0gaV9wZWVrKGlucHV0KTsKKworCQlpc19zcGVjaWFsID0gInt9PD47JnwoKSMnIiAvKiBzcGVjaWFsIG91dHNpZGUgb2YgInN0ciIgKi8KKwkJCQkiXFwkXCIiIElGX0hVU0hfVElDSygiYCIpOyAvKiBhbHdheXMgc3BlY2lhbCAqLworCQkvKiBBcmUgeyBhbmQgfSBzcGVjaWFsIGhlcmU/ICovCisJCWlmIChjdHguY29tbWFuZC0+YXJndiAvKiB3b3JkIFt3b3JkXXsuLi4gLSBub24tc3BlY2lhbCAqLworCQkgfHwgZGVzdC5sZW5ndGggICAgICAgLyogd29yZHsuLi4gLSBub24tc3BlY2lhbCAqLworCQkgfHwgZGVzdC5oYXNfcXVvdGVkX3BhcnQgICAgIC8qICIiey4uLiAtIG5vbi1zcGVjaWFsICovCisJCSB8fCAobmV4dCAhPSAnOycgICAgICAgICAgICAgLyogfTsgLSBzcGVjaWFsICovCisJCSAgICAmJiBuZXh0ICE9ICcpJyAgICAgICAgICAgLyogfSkgLSBzcGVjaWFsICovCisJCSAgICAmJiBuZXh0ICE9ICcmJyAgICAgICAgICAgLyogfSYgYW5kIH0mJiAuLi4gLSBzcGVjaWFsICovCisJCSAgICAmJiBuZXh0ICE9ICd8JyAgICAgICAgICAgLyogfXx8IC4uLiAtIHNwZWNpYWwgKi8KKwkJICAgICYmICFzdHJjaHIoZGVmaWZzLCBuZXh0KSAvKiB7d29yZCAtIG5vbi1zcGVjaWFsICovCisJCSAgICApCisJCSkgeworCQkJLyogVGhleSBhcmUgbm90IHNwZWNpYWwsIHNraXAgInt9IiAqLworCQkJaXNfc3BlY2lhbCArPSAyOworCQl9CisJCWlzX3NwZWNpYWwgPSBzdHJjaHIoaXNfc3BlY2lhbCwgY2gpOworCQlpc19ibGFuayA9IHN0cmNocihkZWZpZnMsIGNoKTsKKworCQlpZiAoIWlzX3NwZWNpYWwgJiYgIWlzX2JsYW5rKSB7IC8qIG9yZGluYXJ5IGNoYXIgKi8KKyBvcmRpbmFyeV9jaGFyOgorCQkJb19hZGRRY2hyKCZkZXN0LCBjaCk7CisJCQlpZiAoKGRlc3Qub19hc3NpZ25tZW50ID09IE1BWUJFX0FTU0lHTk1FTlQKKwkJCSAgICB8fCBkZXN0Lm9fYXNzaWdubWVudCA9PSBXT1JEX0lTX0tFWVdPUkQpCisJCQkgJiYgY2ggPT0gJz0nCisJCQkgJiYgaXNfd2VsbF9mb3JtZWRfdmFyX25hbWUoZGVzdC5kYXRhLCAnPScpCisJCQkpIHsKKwkJCQlkZXN0Lm9fYXNzaWdubWVudCA9IERFRklOSVRFTFlfQVNTSUdOTUVOVDsKKwkJCQlkZWJ1Z19wcmludGZfcGFyc2UoImRlc3Qub19hc3NpZ25tZW50PSclcydcbiIsIGFzc2lnbm1lbnRfZmxhZ1tkZXN0Lm9fYXNzaWdubWVudF0pOworCQkJfQorCQkJY29udGludWU7CisJCX0KKworCQlpZiAoaXNfYmxhbmspIHsKKwkJCWlmIChkb25lX3dvcmQoJmRlc3QsICZjdHgpKSB7CisJCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCX0KKwkJCWlmIChjaCA9PSAnXG4nKSB7CisJCQkJLyogSXMgdGhpcyBhIGNhc2Ugd2hlbiBuZXdsaW5lIGlzIHNpbXBseSBpZ25vcmVkPworCQkJCSAqIFNvbWUgZXhhbXBsZXM6CisJCQkJICogImNtZCB8IDxuZXdsaW5lPiBjbWQgLi4uIgorCQkJCSAqICJjYXNlIC4uLiBpbiA8bmV3bGluZT4gd29yZCkgLi4uIgorCQkJCSAqLworCQkJCWlmIChJU19OVUxMX0NNRChjdHguY29tbWFuZCkKKwkJCQkgJiYgZGVzdC5sZW5ndGggPT0gMCAmJiAhZGVzdC5oYXNfcXVvdGVkX3BhcnQKKwkJCQkpIHsKKwkJCQkJLyogVGhpcyBuZXdsaW5lIGNhbiBiZSBpZ25vcmVkLiBCdXQuLi4KKwkJCQkJICogV2l0aG91dCBjaGVjayAjMSwgaW50ZXJhY3RpdmUgc2hlbGwKKwkJCQkJICogaWdub3JlcyBldmVuIGJhcmUgPG5ld2xpbmU+LAorCQkJCQkgKiBhbmQgc2hvd3MgdGhlIGNvbnRpbnVhdGlvbiBwcm9tcHQ6CisJCQkJCSAqIHBzMV9wcm9tcHQkIDxlbnRlcj4KKwkJCQkJICogcHMyPiBfICAgPD09PSB3cm9uZywgc2hvdWxkIGJlIHBzMQorCQkJCQkgKiBXaXRob3V0IGNoZWNrICMyLCAiY21kICYgPG5ld2xpbmU+IgorCQkJCQkgKiBpcyBzaW1pbGFybHkgbWlzdHJlYXRlZC4KKwkJCQkJICogKEJUVywgdGhpcyBtYWtlcyAiY21kICYgY21kIgorCQkJCQkgKiBhbmQgImNtZCAmJiBjbWQiIG5vbi1vcnRob2dvbmFsLgorCQkJCQkgKiBSZWFsbHksIGFzayB5b3Vyc2VsZiwgd2h5CisJCQkJCSAqICJjbWQgJiYgPG5ld2xpbmU+IiBkb2Vzbid0IHN0YXJ0CisJCQkJCSAqIGNtZCBidXQgd2FpdHMgZm9yIG1vcmUgaW5wdXQ/CisJCQkJCSAqIE5vIHJlYXNvbi4uLikKKwkJCQkJICovCisJCQkJCXN0cnVjdCBwaXBlICpwaSA9IGN0eC5saXN0X2hlYWQ7CisJCQkJCWlmIChwaS0+bnVtX2NtZHMgIT0gMCAgICAgICAvKiBjaGVjayAjMSAqLworCQkJCQkgJiYgcGktPmZvbGxvd3VwICE9IFBJUEVfQkcgLyogY2hlY2sgIzIgKi8KKwkJCQkJKSB7CisJCQkJCQljb250aW51ZTsKKwkJCQkJfQorCQkJCX0KKwkJCQkvKiBUcmVhdCBuZXdsaW5lIGFzIGEgY29tbWFuZCBzZXBhcmF0b3IuICovCisJCQkJZG9uZV9waXBlKCZjdHgsIFBJUEVfU0VRKTsKKwkJCQlkZWJ1Z19wcmludGZfcGFyc2UoImhlcmVkb2NfY250OiVkXG4iLCBoZXJlZG9jX2NudCk7CisJCQkJaWYgKGhlcmVkb2NfY250KSB7CisJCQkJCWlmIChmZXRjaF9oZXJlZG9jcyhoZXJlZG9jX2NudCwgJmN0eCwgaW5wdXQpKSB7CisJCQkJCQlnb3RvIHBhcnNlX2Vycm9yOworCQkJCQl9CisJCQkJCWhlcmVkb2NfY250ID0gMDsKKwkJCQl9CisJCQkJZGVzdC5vX2Fzc2lnbm1lbnQgPSBNQVlCRV9BU1NJR05NRU5UOworCQkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiZGVzdC5vX2Fzc2lnbm1lbnQ9JyVzJ1xuIiwgYXNzaWdubWVudF9mbGFnW2Rlc3Qub19hc3NpZ25tZW50XSk7CisJCQkJY2ggPSAnOyc7CisJCQkJLyogbm90ZTogaWYgKGlzX2JsYW5rKSBjb250aW51ZTsKKwkJCQkgKiB3aWxsIHN0aWxsIHRyaWdnZXIgZm9yIHVzICovCisJCQl9CisJCX0KKworCQkvKiAiY21kfSIgb3IgImNtZCB9Li4uIiB3aXRob3V0IHNlbWljb2xvbiBvciAmOgorCQkgKiB9IGlzIGFuIG9yZGluYXJ5IGNoYXIgaW4gdGhpcyBjYXNlLCBldmVuIGluc2lkZSB7IGNtZDsgfQorCQkgKiBQYXRob2xvZ2ljYWwgZXhhbXBsZTogeyAiIn07IH0gc2hvdWxkIGV4ZWMgIn0iIGNtZAorCQkgKi8KKwkJaWYgKGNoID09ICd9JykgeworCQkJaWYgKCFJU19OVUxMX0NNRChjdHguY29tbWFuZCkgLyogY21kIH0gKi8KKwkJCSB8fCBkZXN0Lmxlbmd0aCAhPSAwIC8qIHdvcmR9ICovCisJCQkgfHwgZGVzdC5oYXNfcXVvdGVkX3BhcnQgICAgLyogIiJ9ICovCisJCQkpIHsKKwkJCQlnb3RvIG9yZGluYXJ5X2NoYXI7CisJCQl9CisJCQlpZiAoIUlTX05VTExfUElQRShjdHgucGlwZSkpIC8qIGNtZCB8IH0gKi8KKwkJCQlnb3RvIHNraXBfZW5kX3RyaWdnZXI7CisJCQkvKiBlbHNlOiB9IGRvZXMgdGVybWluYXRlIGEgZ3JvdXAgKi8KKwkJfQorCisJCWlmIChlbmRfdHJpZ2dlciAmJiBlbmRfdHJpZ2dlciA9PSBjaAorCQkgJiYgKGNoICE9ICc7JyB8fCBoZXJlZG9jX2NudCA9PSAwKQorI2lmIEVOQUJMRV9IVVNIX0NBU0UKKwkJICYmIChjaCAhPSAnKScKKwkJICAgIHx8IGN0eC5jdHhfcmVzX3cgIT0gUkVTX01BVENICisJCSAgICB8fCAoIWRlc3QuaGFzX3F1b3RlZF9wYXJ0ICYmIHN0cmNtcChkZXN0LmRhdGEsICJlc2FjIikgPT0gMCkKKwkJICAgICkKKyNlbmRpZgorCQkpIHsKKwkJCWlmIChoZXJlZG9jX2NudCkgeworCQkJCS8qIFRoaXMgaXMgdGVjaG5pY2FsbHkgdmFsaWQ6CisJCQkJICogeyBjYXQgPDxIRVJFOyB9OyBlY2hvIE9rCisJCQkJICogaGVyZWRvYworCQkJCSAqIGhlcmVkb2MKKwkJCQkgKiBIRVJFCisJCQkJICogYnV0IHdlIGRvbid0IHN1cHBvcnQgdGhpcy4KKwkJCQkgKiBXZSByZXF1aXJlIGhlcmVkb2MgdG8gYmUgaW4gZW5jbG9zaW5nIHt9LygpLAorCQkJCSAqIGlmIGFueS4KKwkJCQkgKi8KKwkJCQlzeW50YXhfZXJyb3JfdW50ZXJtX3N0cigiaGVyZSBkb2N1bWVudCIpOworCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQl9CisJCQlpZiAoZG9uZV93b3JkKCZkZXN0LCAmY3R4KSkgeworCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQl9CisJCQlkb25lX3BpcGUoJmN0eCwgUElQRV9TRVEpOworCQkJZGVzdC5vX2Fzc2lnbm1lbnQgPSBNQVlCRV9BU1NJR05NRU5UOworCQkJZGVidWdfcHJpbnRmX3BhcnNlKCJkZXN0Lm9fYXNzaWdubWVudD0nJXMnXG4iLCBhc3NpZ25tZW50X2ZsYWdbZGVzdC5vX2Fzc2lnbm1lbnRdKTsKKwkJCS8qIERvIHdlIHNpdCBvdXRzaWRlIG9mIGFueSBpZidzLCBsb29wcyBvciBjYXNlJ3M/ICovCisJCQlpZiAoIUhBU19LRVlXT1JEUworCQkJSUZfSEFTX0tFWVdPUkRTKHx8IChjdHguY3R4X3Jlc193ID09IFJFU19OT05FICYmIGN0eC5vbGRfZmxhZyA9PSAwKSkKKwkJCSkgeworCQkJCW9fZnJlZSgmZGVzdCk7CisjaWYgIUJCX01NVQorCQkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiYXNfc3RyaW5nMiAnJXMnXG4iLCBjdHguYXNfc3RyaW5nLmRhdGEpOworCQkJCWlmIChwc3RyaW5nKQorCQkJCQkqcHN0cmluZyA9IGN0eC5hc19zdHJpbmcuZGF0YTsKKwkJCQllbHNlCisJCQkJCW9fZnJlZV91bnNhZmUoJmN0eC5hc19zdHJpbmcpOworI2VuZGlmCisJCQkJZGVidWdfbGVhdmUoKTsKKwkJCQlkZWJ1Z19wcmludGZfcGFyc2UoInBhcnNlX3N0cmVhbSByZXR1cm4gJXA6ICIKKwkJCQkJCSJlbmRfdHJpZ2dlciBjaGFyIGZvdW5kXG4iLAorCQkJCQkJY3R4Lmxpc3RfaGVhZCk7CisJCQkJcmV0dXJuIGN0eC5saXN0X2hlYWQ7CisJCQl9CisJCX0KKyBza2lwX2VuZF90cmlnZ2VyOgorCQlpZiAoaXNfYmxhbmspCisJCQljb250aW51ZTsKKworCQkvKiBDYXRjaCA8LCA+IGJlZm9yZSBkZWNpZGluZyB3aGV0aGVyIHRoaXMgd29yZCBpcworCQkgKiBhbiBhc3NpZ25tZW50LiBhPTEgMj56IGI9MjogYj0yIGlzIHN0aWxsIGFzc2lnbm1lbnQgKi8KKwkJc3dpdGNoIChjaCkgeworCQljYXNlICc+JzoKKwkJCXJlZGlyX2ZkID0gcmVkaXJlY3Rfb3B0X251bSgmZGVzdCk7CisJCQlpZiAoZG9uZV93b3JkKCZkZXN0LCAmY3R4KSkgeworCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQl9CisJCQlyZWRpcl9zdHlsZSA9IFJFRElSRUNUX09WRVJXUklURTsKKwkJCWlmIChuZXh0ID09ICc+JykgeworCQkJCXJlZGlyX3N0eWxlID0gUkVESVJFQ1RfQVBQRU5EOworCQkJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCQkJbm9tbXVfYWRkY2hyKCZjdHguYXNfc3RyaW5nLCBjaCk7CisJCQl9CisjaWYgMAorCQkJZWxzZSBpZiAobmV4dCA9PSAnKCcpIHsKKwkJCQlzeW50YXhfZXJyb3IoIj4ocHJvY2Vzcykgbm90IHN1cHBvcnRlZCIpOworCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQl9CisjZW5kaWYKKwkJCWlmIChwYXJzZV9yZWRpcmVjdCgmY3R4LCByZWRpcl9mZCwgcmVkaXJfc3R5bGUsIGlucHV0KSkKKwkJCQlnb3RvIHBhcnNlX2Vycm9yOworCQkJY29udGludWU7IC8qIGJhY2sgdG8gdG9wIG9mIHdoaWxlICgxKSAqLworCQljYXNlICc8JzoKKwkJCXJlZGlyX2ZkID0gcmVkaXJlY3Rfb3B0X251bSgmZGVzdCk7CisJCQlpZiAoZG9uZV93b3JkKCZkZXN0LCAmY3R4KSkgeworCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQl9CisJCQlyZWRpcl9zdHlsZSA9IFJFRElSRUNUX0lOUFVUOworCQkJaWYgKG5leHQgPT0gJzwnKSB7CisJCQkJcmVkaXJfc3R5bGUgPSBSRURJUkVDVF9IRVJFRE9DOworCQkJCWhlcmVkb2NfY250Kys7CisJCQkJZGVidWdfcHJpbnRmX3BhcnNlKCIrK2hlcmVkb2NfY250PSVkXG4iLCBoZXJlZG9jX2NudCk7CisJCQkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJCQlub21tdV9hZGRjaHIoJmN0eC5hc19zdHJpbmcsIGNoKTsKKwkJCX0gZWxzZSBpZiAobmV4dCA9PSAnPicpIHsKKwkJCQlyZWRpcl9zdHlsZSA9IFJFRElSRUNUX0lPOworCQkJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCQkJbm9tbXVfYWRkY2hyKCZjdHguYXNfc3RyaW5nLCBjaCk7CisJCQl9CisjaWYgMAorCQkJZWxzZSBpZiAobmV4dCA9PSAnKCcpIHsKKwkJCQlzeW50YXhfZXJyb3IoIjwocHJvY2Vzcykgbm90IHN1cHBvcnRlZCIpOworCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQl9CisjZW5kaWYKKwkJCWlmIChwYXJzZV9yZWRpcmVjdCgmY3R4LCByZWRpcl9mZCwgcmVkaXJfc3R5bGUsIGlucHV0KSkKKwkJCQlnb3RvIHBhcnNlX2Vycm9yOworCQkJY29udGludWU7IC8qIGJhY2sgdG8gdG9wIG9mIHdoaWxlICgxKSAqLworCQljYXNlICcjJzoKKwkJCWlmIChkZXN0Lmxlbmd0aCA9PSAwICYmICFkZXN0Lmhhc19xdW90ZWRfcGFydCkgeworCQkJCS8qIHNraXAgIiNjb21tZW50IiAqLworCQkJCXdoaWxlICgxKSB7CisJCQkJCWNoID0gaV9wZWVrKGlucHV0KTsKKwkJCQkJaWYgKGNoID09IEVPRiB8fCBjaCA9PSAnXG4nKQorCQkJCQkJYnJlYWs7CisJCQkJCWlfZ2V0Y2goaW5wdXQpOworCQkJCQkvKiBub3RlOiB3ZSBkbyBub3QgYWRkIGl0IHRvICZjdHguYXNfc3RyaW5nICovCisJCQkJfQorCQkJCW5vbW11X2FkZGNocigmY3R4LmFzX3N0cmluZywgJ1xuJyk7CisJCQkJY29udGludWU7IC8qIGJhY2sgdG8gdG9wIG9mIHdoaWxlICgxKSAqLworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ1xcJzoKKwkJCWlmIChuZXh0ID09ICdcbicpIHsKKwkJCQkvKiBJdCdzICJcPG5ld2xpbmU+IiAqLworI2lmICFCQl9NTVUKKwkJCQkvKiBSZW1vdmUgdHJhaWxpbmcgJ1wnIGZyb20gY3R4LmFzX3N0cmluZyAqLworCQkJCWN0eC5hc19zdHJpbmcuZGF0YVstLWN0eC5hc19zdHJpbmcubGVuZ3RoXSA9ICdcMCc7CisjZW5kaWYKKwkJCQljaCA9IGlfZ2V0Y2goaW5wdXQpOyAvKiBlYXQgaXQgKi8KKwkJCQljb250aW51ZTsgLyogYmFjayB0byB0b3Agb2Ygd2hpbGUgKDEpICovCisJCQl9CisJCQlicmVhazsKKwkJfQorCisJCWlmIChkZXN0Lm9fYXNzaWdubWVudCA9PSBNQVlCRV9BU1NJR05NRU5UCisJCSAvKiBjaGVjayB0aGF0IHdlIGFyZSBub3QgaW4gd29yZCBpbiAiYT0xIDI+d29yZCBiPTEiOiAqLworCQkgJiYgIWN0eC5wZW5kaW5nX3JlZGlyZWN0CisJCSkgeworCQkJLyogY2ggaXMgYSBzcGVjaWFsIGNoYXIgYW5kIHRodXMgdGhpcyB3b3JkCisJCQkgKiBjYW5ub3QgYmUgYW4gYXNzaWdubWVudCAqLworCQkJZGVzdC5vX2Fzc2lnbm1lbnQgPSBOT1RfQVNTSUdOTUVOVDsKKwkJCWRlYnVnX3ByaW50Zl9wYXJzZSgiZGVzdC5vX2Fzc2lnbm1lbnQ9JyVzJ1xuIiwgYXNzaWdubWVudF9mbGFnW2Rlc3Qub19hc3NpZ25tZW50XSk7CisJCX0KKworCQkvKiBOb3RlOiBub21tdV9hZGRjaHIoJmN0eC5hc19zdHJpbmcsIGNoKSBpcyBhbHJlYWR5IGRvbmUgKi8KKworCQlzd2l0Y2ggKGNoKSB7CisJCWNhc2UgJyMnOiAvKiBub24tY29tbWVudCAjOiAiZWNobyBhI2IiIGV0YyAqLworCQkJb19hZGRRY2hyKCZkZXN0LCBjaCk7CisJCQlicmVhazsKKwkJY2FzZSAnXFwnOgorCQkJaWYgKG5leHQgPT0gRU9GKSB7CisJCQkJc3ludGF4X2Vycm9yKCJcXDxlb2Y+Iik7CisJCQkJeGZ1bmNfZGllKCk7CisJCQl9CisJCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQkJLyogbm90ZTogY2ggIT0gJ1xuJyAodGhhdCBjYXNlIGRvZXMgbm90IHJlYWNoIHRoaXMgcGxhY2UpICovCisJCQlvX2FkZGNocigmZGVzdCwgJ1xcJyk7CisJCQkvKm5vbW11X2FkZGNocigmY3R4LmFzX3N0cmluZywgJ1xcJyk7IC0gYWxyZWFkeSBkb25lICovCisJCQlvX2FkZGNocigmZGVzdCwgY2gpOworCQkJbm9tbXVfYWRkY2hyKCZjdHguYXNfc3RyaW5nLCBjaCk7CisJCQkvKiBFeGFtcGxlOiBlY2hvIEhlbGxvIFwyPmZpbGUKKwkJCSAqIHdlIG5lZWQgdG8ga25vdyB0aGF0IHdvcmQgMiBpcyBxdW90ZWQgKi8KKwkJCWRlc3QuaGFzX3F1b3RlZF9wYXJ0ID0gMTsKKwkJCWJyZWFrOworCQljYXNlICckJzoKKwkJCWlmICghcGFyc2VfZG9sbGFyKCZjdHguYXNfc3RyaW5nLCAmZGVzdCwgaW5wdXQsIC8qcXVvdGVfbWFzazoqLyAwKSkgeworCQkJCWRlYnVnX3ByaW50Zl9wYXJzZSgicGFyc2Vfc3RyZWFtIHBhcnNlIGVycm9yOiAiCisJCQkJCSJwYXJzZV9kb2xsYXIgcmV0dXJuZWQgMCAoZXJyb3IpXG4iKTsKKwkJCQlnb3RvIHBhcnNlX2Vycm9yOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ1wnJzoKKwkJCWRlc3QuaGFzX3F1b3RlZF9wYXJ0ID0gMTsKKwkJCWlmIChuZXh0ID09ICdcJycgJiYgIWN0eC5wZW5kaW5nX3JlZGlyZWN0KSB7CisgaW5zZXJ0X2VtcHR5X3F1b3RlZF9zdHJfbWFya2VyOgorCQkJCW5vbW11X2FkZGNocigmY3R4LmFzX3N0cmluZywgbmV4dCk7CisJCQkJaV9nZXRjaChpbnB1dCk7IC8qIGVhdCBzZWNvbmQgJyAqLworCQkJCW9fYWRkY2hyKCZkZXN0LCBTUEVDSUFMX1ZBUl9TWU1CT0wpOworCQkJCW9fYWRkY2hyKCZkZXN0LCBTUEVDSUFMX1ZBUl9TWU1CT0wpOworCQkJfSBlbHNlIHsKKwkJCQl3aGlsZSAoMSkgeworCQkJCQljaCA9IGlfZ2V0Y2goaW5wdXQpOworCQkJCQlpZiAoY2ggPT0gRU9GKSB7CisJCQkJCQlzeW50YXhfZXJyb3JfdW50ZXJtX2NoKCdcJycpOworCQkJCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCQkJfQorCQkJCQlub21tdV9hZGRjaHIoJmN0eC5hc19zdHJpbmcsIGNoKTsKKwkJCQkJaWYgKGNoID09ICdcJycpCisJCQkJCQlicmVhazsKKwkJCQkJb19hZGRxY2hyKCZkZXN0LCBjaCk7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJyInOgorCQkJZGVzdC5oYXNfcXVvdGVkX3BhcnQgPSAxOworCQkJaWYgKG5leHQgPT0gJyInICYmICFjdHgucGVuZGluZ19yZWRpcmVjdCkKKwkJCQlnb3RvIGluc2VydF9lbXB0eV9xdW90ZWRfc3RyX21hcmtlcjsKKwkJCWlmIChkZXN0Lm9fYXNzaWdubWVudCA9PSBOT1RfQVNTSUdOTUVOVCkKKwkJCQlkZXN0Lm9fZXhwZmxhZ3MgfD0gRVhQX0ZMQUdfRVNDX0dMT0JfQ0hBUlM7CisJCQlpZiAoIWVuY29kZV9zdHJpbmcoJmN0eC5hc19zdHJpbmcsICZkZXN0LCBpbnB1dCwgJyInLCAvKnByb2Nlc3NfYmtzbGFzaDoqLyAxKSkKKwkJCQlnb3RvIHBhcnNlX2Vycm9yOworCQkJZGVzdC5vX2V4cGZsYWdzICY9IH5FWFBfRkxBR19FU0NfR0xPQl9DSEFSUzsKKwkJCWJyZWFrOworI2lmIEVOQUJMRV9IVVNIX1RJQ0sKKwkJY2FzZSAnYCc6IHsKKwkJCVVTRV9GT1JfTk9NTVUodW5zaWduZWQgcG9zOykKKworCQkJb19hZGRjaHIoJmRlc3QsIFNQRUNJQUxfVkFSX1NZTUJPTCk7CisJCQlvX2FkZGNocigmZGVzdCwgJ2AnKTsKKwkJCVVTRV9GT1JfTk9NTVUocG9zID0gZGVzdC5sZW5ndGg7KQorCQkJaWYgKCFhZGRfdGlsbF9iYWNrcXVvdGUoJmRlc3QsIGlucHV0LCAvKmluX2RxdW90ZToqLyAwKSkKKwkJCQlnb3RvIHBhcnNlX2Vycm9yOworIyBpZiAhQkJfTU1VCisJCQlvX2FkZHN0cigmY3R4LmFzX3N0cmluZywgZGVzdC5kYXRhICsgcG9zKTsKKwkJCW9fYWRkY2hyKCZjdHguYXNfc3RyaW5nLCAnYCcpOworIyBlbmRpZgorCQkJb19hZGRjaHIoJmRlc3QsIFNQRUNJQUxfVkFSX1NZTUJPTCk7CisJCQkvL2RlYnVnX3ByaW50Zl9zdWJzdCgiU1VCU1QgUkVTMyAnJXMnXG4iLCBkZXN0LmRhdGEgKyBwb3MpOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCQljYXNlICc7JzoKKyNpZiBFTkFCTEVfSFVTSF9DQVNFCisgY2FzZV9zZW1pOgorI2VuZGlmCisJCQlpZiAoZG9uZV93b3JkKCZkZXN0LCAmY3R4KSkgeworCQkJCWdvdG8gcGFyc2VfZXJyb3I7CisJCQl9CisJCQlkb25lX3BpcGUoJmN0eCwgUElQRV9TRVEpOworI2lmIEVOQUJMRV9IVVNIX0NBU0UKKwkJCS8qIEVhdCBtdWx0aXBsZSBzZW1pY29sb25zLCBkZXRlY3QKKwkJCSAqIHdoZXRoZXIgaXQgbWVhbnMgc29tZXRoaW5nIHNwZWNpYWwgKi8KKwkJCXdoaWxlICgxKSB7CisJCQkJY2ggPSBpX3BlZWsoaW5wdXQpOworCQkJCWlmIChjaCAhPSAnOycpCisJCQkJCWJyZWFrOworCQkJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCQkJbm9tbXVfYWRkY2hyKCZjdHguYXNfc3RyaW5nLCBjaCk7CisJCQkJaWYgKGN0eC5jdHhfcmVzX3cgPT0gUkVTX0NBU0VfQk9EWSkgeworCQkJCQljdHguY3R4X2RzZW1pY29sb24gPSAxOworCQkJCQljdHguY3R4X3Jlc193ID0gUkVTX01BVENIOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisjZW5kaWYKKyBuZXdfY21kOgorCQkJLyogV2UganVzdCBmaW5pc2hlZCBhIGNtZC4gTmV3IG9uZSBtYXkgc3RhcnQKKwkJCSAqIHdpdGggYW4gYXNzaWdubWVudCAqLworCQkJZGVzdC5vX2Fzc2lnbm1lbnQgPSBNQVlCRV9BU1NJR05NRU5UOworCQkJZGVidWdfcHJpbnRmX3BhcnNlKCJkZXN0Lm9fYXNzaWdubWVudD0nJXMnXG4iLCBhc3NpZ25tZW50X2ZsYWdbZGVzdC5vX2Fzc2lnbm1lbnRdKTsKKwkJCWJyZWFrOworCQljYXNlICcmJzoKKwkJCWlmIChkb25lX3dvcmQoJmRlc3QsICZjdHgpKSB7CisJCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCX0KKwkJCWlmIChuZXh0ID09ICcmJykgeworCQkJCWNoID0gaV9nZXRjaChpbnB1dCk7CisJCQkJbm9tbXVfYWRkY2hyKCZjdHguYXNfc3RyaW5nLCBjaCk7CisJCQkJZG9uZV9waXBlKCZjdHgsIFBJUEVfQU5EKTsKKwkJCX0gZWxzZSB7CisJCQkJZG9uZV9waXBlKCZjdHgsIFBJUEVfQkcpOworCQkJfQorCQkJZ290byBuZXdfY21kOworCQljYXNlICd8JzoKKwkJCWlmIChkb25lX3dvcmQoJmRlc3QsICZjdHgpKSB7CisJCQkJZ290byBwYXJzZV9lcnJvcjsKKwkJCX0KKyNpZiBFTkFCTEVfSFVTSF9DQVNFCisJCQlpZiAoY3R4LmN0eF9yZXNfdyA9PSBSRVNfTUFUQ0gpCisJCQkJYnJlYWs7IC8qIHdlIGFyZSBpbiBjYXNlJ3MgIndvcmQgfCB3b3JkKSIgKi8KKyNlbmRpZgorCQkJaWYgKG5leHQgPT0gJ3wnKSB7IC8qIHx8ICovCisJCQkJY2ggPSBpX2dldGNoKGlucHV0KTsKKwkJCQlub21tdV9hZGRjaHIoJmN0eC5hc19zdHJpbmcsIGNoKTsKKwkJCQlkb25lX3BpcGUoJmN0eCwgUElQRV9PUik7CisJCQl9IGVsc2UgeworCQkJCS8qIHdlIGNvdWxkIHBpY2sgdXAgYSBmaWxlIGRlc2NyaXB0b3IgY2hvaWNlIGhlcmUKKwkJCQkgKiB3aXRoIHJlZGlyZWN0X29wdF9udW0oKSwgYnV0IGJhc2ggZG9lc24ndCBkbyBpdC4KKwkJCQkgKiAiZWNobyBmb28gMnwgY2F0IiB5aWVsZHMgImZvbyAyIi4gKi8KKwkJCQlkb25lX2NvbW1hbmQoJmN0eCk7CisJCQl9CisJCQlnb3RvIG5ld19jbWQ7CisJCWNhc2UgJygnOgorI2lmIEVOQUJMRV9IVVNIX0NBU0UKKwkJCS8qICJjYXNlLi4uIGluIFsoXXdvcmQpLi4uIiAtIHNraXAgJygnICovCisJCQlpZiAoY3R4LmN0eF9yZXNfdyA9PSBSRVNfTUFUQ0gKKwkJCSAmJiBjdHguY29tbWFuZC0+YXJndiA9PSBOVUxMIC8qIG5vdCAod29yZHwoLi4uICovCisJCQkgJiYgZGVzdC5sZW5ndGggPT0gMCAvKiBub3Qgd29yZCguLi4gKi8KKwkJCSAmJiBkZXN0Lmhhc19xdW90ZWRfcGFydCA9PSAwIC8qIG5vdCAiIiguLi4gKi8KKwkJCSkgeworCQkJCWNvbnRpbnVlOworCQkJfQorI2VuZGlmCisJCWNhc2UgJ3snOgorCQkJaWYgKHBhcnNlX2dyb3VwKCZkZXN0LCAmY3R4LCBpbnB1dCwgY2gpICE9IDApIHsKKwkJCQlnb3RvIHBhcnNlX2Vycm9yOworCQkJfQorCQkJZ290byBuZXdfY21kOworCQljYXNlICcpJzoKKyNpZiBFTkFCTEVfSFVTSF9DQVNFCisJCQlpZiAoY3R4LmN0eF9yZXNfdyA9PSBSRVNfTUFUQ0gpCisJCQkJZ290byBjYXNlX3NlbWk7CisjZW5kaWYKKwkJY2FzZSAnfSc6CisJCQkvKiBwcm9wZXIgdXNlIG9mIHRoaXMgY2hhcmFjdGVyIGlzIGNhdWdodCBieSBlbmRfdHJpZ2dlcjoKKwkJCSAqIGlmIHdlIHNlZSB7LCB3ZSBjYWxsIHBhcnNlX2dyb3VwKC4uLiwgZW5kX3RyaWdnZXI9J30nKQorCQkJICogYW5kIGl0IHdpbGwgbWF0Y2ggfSBlYXJsaWVyIChub3QgaGVyZSkuICovCisJCQlzeW50YXhfZXJyb3JfdW5leHBlY3RlZF9jaChjaCk7CisJCQlnb3RvIHBhcnNlX2Vycm9yOworCQlkZWZhdWx0OgorCQkJaWYgKEhVU0hfREVCVUcpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIkJVRzogdW5leHBlY3RlZCAlY1xuIiwgY2gpOworCQl9CisJfSAvKiB3aGlsZSAoMSkgKi8KKworIHBhcnNlX2Vycm9yOgorCXsKKwkJc3RydWN0IHBhcnNlX2NvbnRleHQgKnBjdHg7CisJCUlGX0hBU19LRVlXT1JEUyhzdHJ1Y3QgcGFyc2VfY29udGV4dCAqcDI7KQorCisJCS8qIENsZWFuIHVwIGFsbG9jYXRlZCB0cmVlLgorCQkgKiBTYW1wbGUgZm9yIGZpbmRpbmcgbGVha3Mgb24gc3ludGF4IGVycm9yIHJlY292ZXJ5IHBhdGguCisJCSAqIFJ1biBpdCBmcm9tIGludGVyYWN0aXZlIHNoZWxsLCB3YXRjaCBwbWFwIGBwaWRvZiBodXNoYC4KKwkJICogd2hpbGUgaWYgZmFsc2U7IHRoZW4gZmFsc2U7IGZpOyBkbyBicmVhazsgZmkKKwkJICogU2FtcGxlcyB0byBjYXRjaCBsZWFrcyBhdCBleGVjdXRpb246CisJCSAqIHdoaWxlIGlmICh0cnVlIHwge3RydWU7fSk7IHRoZW4gZWNobyBvazsgZmk7IGRvIGJyZWFrOyBkb25lCisJCSAqIHdoaWxlIGlmICh0cnVlIHwge3RydWU7fSk7IHRoZW4gZWNobyBvazsgZmk7IGRvIChpZiBlY2hvIG9rOyBicmVhazsgdGhlbiA6OyBmaSkgfCBjYXQ7IGJyZWFrOyBkb25lCisJCSAqLworCQlwY3R4ID0gJmN0eDsKKwkJZG8geworCQkJLyogVXBkYXRlIHBpcGUvY29tbWFuZCBjb3VudHMsCisJCQkgKiBvdGhlcndpc2UgZnJlZWluZyBtYXkgbWlzcyBzb21lICovCisJCQlkb25lX3BpcGUocGN0eCwgUElQRV9TRVEpOworCQkJZGVidWdfcHJpbnRmX2NsZWFuKCJmcmVlaW5nIGxpc3QgJXAgZnJvbSBjdHggJXBcbiIsCisJCQkJCXBjdHgtPmxpc3RfaGVhZCwgcGN0eCk7CisJCQlkZWJ1Z19wcmludF90cmVlKHBjdHgtPmxpc3RfaGVhZCwgMCk7CisJCQlmcmVlX3BpcGVfbGlzdChwY3R4LT5saXN0X2hlYWQpOworCQkJZGVidWdfcHJpbnRmX2NsZWFuKCJmcmVlZCBsaXN0ICVwXG4iLCBwY3R4LT5saXN0X2hlYWQpOworI2lmICFCQl9NTVUKKwkJCW9fZnJlZV91bnNhZmUoJnBjdHgtPmFzX3N0cmluZyk7CisjZW5kaWYKKwkJCUlGX0hBU19LRVlXT1JEUyhwMiA9IHBjdHgtPnN0YWNrOykKKwkJCWlmIChwY3R4ICE9ICZjdHgpIHsKKwkJCQlmcmVlKHBjdHgpOworCQkJfQorCQkJSUZfSEFTX0tFWVdPUkRTKHBjdHggPSBwMjspCisJCX0gd2hpbGUgKEhBU19LRVlXT1JEUyAmJiBwY3R4KTsKKworCQlvX2ZyZWUoJmRlc3QpOworCQlHLmxhc3RfZXhpdGNvZGUgPSAxOworI2lmICFCQl9NTVUKKwkJaWYgKHBzdHJpbmcpCisJCQkqcHN0cmluZyA9IE5VTEw7CisjZW5kaWYKKwkJZGVidWdfbGVhdmUoKTsKKwkJcmV0dXJuIEVSUl9QVFI7CisJfQorfQorCisKKy8qKiogRXhlY3V0aW9uIHJvdXRpbmVzICoqKi8KKworLyogRXhwYW5zaW9uIGNhbiByZWN1cnNlLCBuZWVkIGZvcndhcmQgZGVjbHM6ICovCisjaWYgIUVOQUJMRV9IVVNIX0JBU0hfQ09NUEFUCisvKiBvbmx5ICR7dmFyL3BhdHRlcm4vcmVwbH0gKGl0cyBwYXR0ZXJuIHBhcnQpIG5lZWRzIGFkZGl0aW9uYWwgbW9kZSAqLworI2RlZmluZSBleHBhbmRfc3RyaW5nX3RvX3N0cmluZyhzdHIsIGRvX3VuYmFja3NsYXNoKSBcCisJZXhwYW5kX3N0cmluZ190b19zdHJpbmcoc3RyKQorI2VuZGlmCitzdGF0aWMgY2hhciAqZXhwYW5kX3N0cmluZ190b19zdHJpbmcoY29uc3QgY2hhciAqc3RyLCBpbnQgZG9fdW5iYWNrc2xhc2gpOworI2lmIEVOQUJMRV9IVVNIX1RJQ0sKK3N0YXRpYyBpbnQgcHJvY2Vzc19jb21tYW5kX3N1YnMob19zdHJpbmcgKmRlc3QsIGNvbnN0IGNoYXIgKnMpOworI2VuZGlmCisKKy8qIGV4cGFuZF9zdHJ2ZWNfdG9fc3RydmVjKCkgdGFrZXMgYSBsaXN0IG9mIHN0cmluZ3MsIGV4cGFuZHMKKyAqIGFsbCB2YXJpYWJsZSByZWZlcmVuY2VzIHdpdGhpbiBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8KKyAqIGEgbGlzdCBvZiBleHBhbmRlZCBzdHJpbmdzLCBwb3NzaWJseSB3aXRoIGxhcmdlciBudW1iZXIKKyAqIG9mIHN0cmluZ3MuIChUaGluayBWQVI9ImEgYiI7IGVjaG8gJFZBUikuCisgKiBUaGlzIG5ldyBsaXN0IGlzIGFsbG9jYXRlZCBhcyBhIHNpbmdsZSBtYWxsb2MgYmxvY2suCisgKiBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiBjaGFyKiBwb2ludGVycyBpcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGl0LAorICogZm9sbG93ZWQgYnkgc3RyaW5ncyB0aGVtc2VsdmVzLgorICogQ2FsbGVyIGNhbiBkZWFsbG9jYXRlIGVudGlyZSBsaXN0IGJ5IHNpbmdsZSBmcmVlKGxpc3QpLiAqLworCisvKiBBIGhvcmRlIG9mIGl0cyBoZWxwZXJzIGNvbWUgZmlyc3Q6ICovCisKK3N0YXRpYyB2b2lkIG9fYWRkYmxvY2tfZHVwbGljYXRlX2JhY2tzbGFzaChvX3N0cmluZyAqbywgY29uc3QgY2hhciAqc3RyLCBpbnQgbGVuKQoreworCXdoaWxlICgtLWxlbiA+PSAwKSB7CisJCWNoYXIgYyA9ICpzdHIrKzsKKworI2lmIEVOQUJMRV9IVVNIX0JSQUNFX0VYUEFOU0lPTgorCQlpZiAoYyA9PSAneycgfHwgYyA9PSAnfScpIHsKKwkJCS8qIHsgLT4gXHssIH0gLT4gXH0gKi8KKwkJCW9fYWRkY2hyKG8sICdcXCcpOworCQkJLyogQW5kIG5vdyB3ZSB3YW50IHRvIGFkZCB7IG9yIH0gYW5kIGNvbnRpbnVlOgorCQkJICogIG9fYWRkY2hyKG8sIGMpOworCQkJICogIGNvbnRpbnVlOworCQkJICogbHVja2lseSwganVzdCBmYWxsaW5nIHRocm91Z2h0IGFjaGlldmVzIHRoaXMuCisJCQkgKi8KKwkJfQorI2VuZGlmCisJCW9fYWRkY2hyKG8sIGMpOworCQlpZiAoYyA9PSAnXFwnKSB7CisJCQkvKiBceiAtPiBcXFx6OyBcPGVvbD4gLT4gXFw8ZW9sPiAqLworCQkJb19hZGRjaHIobywgJ1xcJyk7CisJCQlpZiAobGVuKSB7CisJCQkJbGVuLS07CisJCQkJb19hZGRjaHIobywgJ1xcJyk7CisJCQkJb19hZGRjaHIobywgKnN0cisrKTsKKwkJCX0KKwkJfQorCX0KK30KKworLyogU3RvcmUgZ2l2ZW4gc3RyaW5nLCBmaW5hbGl6aW5nIHRoZSB3b3JkIGFuZCBzdGFydGluZyBuZXcgb25lIHdoZW5ldmVyCisgKiB3ZSBlbmNvdW50ZXIgSUZTIGNoYXIocykuIFRoaXMgaXMgdXNlZCBmb3IgZXhwYW5kaW5nIHZhcmlhYmxlIHZhbHVlcy4KKyAqIEVuZC1vZi1zdHJpbmcgZG9lcyBOT1QgZmluYWxpemUgd29yZDogdGhpbmsgYWJvdXQgJ2VjaG8gLSRWQVItJy4KKyAqIFJldHVybiBpbiAqZW5kZWRfd2l0aF9pZnM6CisgKiAxIC0gZW5kZWQgd2l0aCBJRlMgY2hhciwgZWxzZSAwICh0aGlzIGluY2x1ZGVzIGNhc2Ugb2YgZW1wdHkgc3RyKS4KKyAqLworc3RhdGljIGludCBleHBhbmRfb25faWZzKGludCAqZW5kZWRfd2l0aF9pZnMsIG9fc3RyaW5nICpvdXRwdXQsIGludCBuLCBjb25zdCBjaGFyICpzdHIpCit7CisJaW50IGxhc3RfaXNfaWZzID0gMDsKKworCXdoaWxlICgxKSB7CisJCWludCB3b3JkX2xlbjsKKworCQlpZiAoISpzdHIpICAvKiBFT0wgLSBkbyBub3QgZmluYWxpemUgd29yZCAqLworCQkJYnJlYWs7CisJCXdvcmRfbGVuID0gc3RyY3NwbihzdHIsIEcuaWZzKTsKKwkJaWYgKHdvcmRfbGVuKSB7CisJCQkvKiBXZSBoYXZlIFdPUkRfTEVOIGxlYWRpbmcgbm9uLUlGUyBjaGFycyAqLworCQkJaWYgKCEob3V0cHV0LT5vX2V4cGZsYWdzICYgRVhQX0ZMQUdfR0xPQikpIHsKKwkJCQlvX2FkZGJsb2NrKG91dHB1dCwgc3RyLCB3b3JkX2xlbik7CisJCQl9IGVsc2UgeworCQkJCS8qIFByb3RlY3QgYmFja3NsYXNoZXMgYWdhaW5zdCBnbG9iYmluZyB1cCA6KQorCQkJCSAqIEV4YW1wbGU6ICJ2PSdcKic7IGVjaG8gYiR2IiBwcmludHMgImJcKiIKKwkJCQkgKiAoYW5kIGRvZXMgbm90IHRyeSB0byBnbG9iIG9uICIqIikKKwkJCQkgKi8KKwkJCQlvX2FkZGJsb2NrX2R1cGxpY2F0ZV9iYWNrc2xhc2gob3V0cHV0LCBzdHIsIHdvcmRfbGVuKTsKKwkJCQkvKi8gV2h5IGNhbid0IHdlIGRvIGl0IGVhc2llcj8gKi8KKwkJCQkvKm9fYWRkYmxvY2sob3V0cHV0LCBzdHIsIHdvcmRfbGVuKTsgLSBXUk9ORzogInY9J1wqJzsgZWNobyBaJHYiIHByaW50cyAiWioiIGluc3RlYWQgb2YgIlpcKiIgKi8KKwkJCQkvKm9fYWRkcWJsb2NrKG91dHB1dCwgc3RyLCB3b3JkX2xlbik7IC0gV1JPTkc6ICJ2PScqJzsgZWNobyBaJHYiIHByaW50cyAiWioiIGluc3RlYWQgb2YgWiogZmlsZXMgKi8KKwkJCX0KKwkJCWxhc3RfaXNfaWZzID0gMDsKKwkJCXN0ciArPSB3b3JkX2xlbjsKKwkJCWlmICghKnN0cikgIC8qIEVPTCAtIGRvIG5vdCBmaW5hbGl6ZSB3b3JkICovCisJCQkJYnJlYWs7CisJCX0KKworCQkvKiBXZSBrbm93IHN0ciBoZXJlIHBvaW50cyB0byBhdCBsZWFzdCBvbmUgSUZTIGNoYXIgKi8KKwkJbGFzdF9pc19pZnMgPSAxOworCQlzdHIgKz0gc3Ryc3BuKHN0ciwgRy5pZnMpOyAvKiBza2lwIElGUyBjaGFycyAqLworCQlpZiAoISpzdHIpICAvKiBFT0wgLSBkbyBub3QgZmluYWxpemUgd29yZCAqLworCQkJYnJlYWs7CisKKwkJLyogU3RhcnQgbmV3IHdvcmQuLi4gYnV0IG5vdCBhbHdheXMhICovCisJCS8qIENhc2UgInY9JyBhJzsgZWNobyAnJyR2Ijogd2UgZG8gbmVlZCB0byBmaW5hbGl6ZSBlbXB0eSB3b3JkOiAqLworCQlpZiAob3V0cHV0LT5oYXNfcXVvdGVkX3BhcnQKKwkJLyogQ2FzZSAidj0nIGEnOyBlY2hvICR2IjoKKwkJICogaGVyZSBub3RoaW5nIHByZWNlZGVzIHRoZSBzcGFjZSBpbiAkdiBleHBhbnNpb24sCisJCSAqIHRoZXJlZm9yZSB3ZSBzaG91bGQgbm90IGZpbmlzaCB0aGUgd29yZAorCQkgKiAoSU9XOiBpZiB0aGVyZSAqaXMqIHdvcmQgdG8gZmluYWxpemUsIG9ubHkgdGhlbiBkbyBpdCk6CisJCSAqLworCQkgfHwgKG4gPiAwICYmIG91dHB1dC0+ZGF0YVtvdXRwdXQtPmxlbmd0aCAtIDFdKQorCQkpIHsKKwkJCW9fYWRkY2hyKG91dHB1dCwgJ1wwJyk7CisJCQlkZWJ1Z19wcmludF9saXN0KCJleHBhbmRfb25faWZzIiwgb3V0cHV0LCBuKTsKKwkJCW4gPSBvX3NhdmVfcHRyKG91dHB1dCwgbik7CisJCX0KKwl9CisKKwlpZiAoZW5kZWRfd2l0aF9pZnMpCisJCSplbmRlZF93aXRoX2lmcyA9IGxhc3RfaXNfaWZzOworCWRlYnVnX3ByaW50X2xpc3QoImV4cGFuZF9vbl9pZnNbMV0iLCBvdXRwdXQsIG4pOworCXJldHVybiBuOworfQorCisvKiBIZWxwZXIgdG8gZXhwYW5kICQoKC4uLikpIGFuZCBoZXJlZG9jIGJvZHkuIFRoZXNlIGFjdCBhcyBpZgorICogdGhleSBhcmUgaW4gZG91YmxlIHF1b3Rlcywgd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgdGhleSBhcmUgbm90IDopLgorICogSnVzdCB0aGUgcnVsZXMgYXJlIHNpbWlsYXI6ICJleHBhbmQgb25seSAkdmFyIGFuZCBgY21kYCIKKyAqCisgKiBSZXR1cm5zIG1hbGxvY2VkIHN0cmluZy4KKyAqIEFzIGFuIG9wdGltaXphdGlvbiwgd2UgcmV0dXJuIE5VTEwgaWYgZXhwYW5zaW9uIGlzIG5vdCBuZWVkZWQuCisgKi8KKyNpZiAhRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQKKy8qIG9ubHkgJHt2YXIvcGF0dGVybi9yZXBsfSAoaXRzIHBhdHRlcm4gcGFydCkgbmVlZHMgYWRkaXRpb25hbCBtb2RlICovCisjZGVmaW5lIGVuY29kZV90aGVuX2V4cGFuZF9zdHJpbmcoc3RyLCBwcm9jZXNzX2Jrc2xhc2gsIGRvX3VuYmFja3NsYXNoKSBcCisJZW5jb2RlX3RoZW5fZXhwYW5kX3N0cmluZyhzdHIpCisjZW5kaWYKK3N0YXRpYyBjaGFyICplbmNvZGVfdGhlbl9leHBhbmRfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50IHByb2Nlc3NfYmtzbGFzaCwgaW50IGRvX3VuYmFja3NsYXNoKQoreworCWNoYXIgKmV4cF9zdHI7CisJc3RydWN0IGluX3N0ciBpbnB1dDsKKwlvX3N0cmluZyBkZXN0ID0gTlVMTF9PX1NUUklORzsKKworCWlmICghc3RyY2hyKHN0ciwgJyQnKQorCSAmJiAhc3RyY2hyKHN0ciwgJ1xcJykKKyNpZiBFTkFCTEVfSFVTSF9USUNLCisJICYmICFzdHJjaHIoc3RyLCAnYCcpCisjZW5kaWYKKwkpIHsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogV2UgbmVlZCB0byBleHBhbmQuIEV4YW1wbGU6CisJICogZWNobyAkKCgkYSArIGBlY2hvIDFgKSkgJCgoMSArICQoKDIpKSApKQorCSAqLworCXNldHVwX3N0cmluZ19pbl9zdHIoJmlucHV0LCBzdHIpOworCWVuY29kZV9zdHJpbmcoTlVMTCwgJmRlc3QsICZpbnB1dCwgRU9GLCBwcm9jZXNzX2Jrc2xhc2gpOworLy9UT0RPOiBlcnJvciBjaGVjayAoZW5jb2RlX3N0cmluZyByZXR1cm5zIDAgb24gZXJyb3IpPworCS8vYmJfZXJyb3JfbXNnKCInJXMnIC0+ICclcyciLCBzdHIsIGRlc3QuZGF0YSk7CisJZXhwX3N0ciA9IGV4cGFuZF9zdHJpbmdfdG9fc3RyaW5nKGRlc3QuZGF0YSwgLyp1bmJhY2tzbGFzaDoqLyBkb191bmJhY2tzbGFzaCk7CisJLy9iYl9lcnJvcl9tc2coIiclcycgLT4gJyVzJyIsIGRlc3QuZGF0YSwgZXhwX3N0cik7CisJb19mcmVlX3Vuc2FmZSgmZGVzdCk7CisJcmV0dXJuIGV4cF9zdHI7Cit9CisKKyNpZiBFTkFCTEVfU0hfTUFUSF9TVVBQT1JUCitzdGF0aWMgYXJpdGhfdCBleHBhbmRfYW5kX2V2YWx1YXRlX2FyaXRoKGNvbnN0IGNoYXIgKmFyZywgY29uc3QgY2hhciAqKmVycm1zZ19wKQoreworCWFyaXRoX3N0YXRlX3QgbWF0aF9zdGF0ZTsKKwlhcml0aF90IHJlczsKKwljaGFyICpleHBfc3RyOworCisJbWF0aF9zdGF0ZS5sb29rdXB2YXIgPSBnZXRfbG9jYWxfdmFyX3ZhbHVlOworCW1hdGhfc3RhdGUuc2V0dmFyID0gc2V0X2xvY2FsX3Zhcl9mcm9tX2hhbHZlczsKKwkvL21hdGhfc3RhdGUuZW5kb2ZuYW1lID0gZW5kb2ZuYW1lOworCWV4cF9zdHIgPSBlbmNvZGVfdGhlbl9leHBhbmRfc3RyaW5nKGFyZywgLypwcm9jZXNzX2Jrc2xhc2g6Ki8gMSwgLyp1bmJhY2tzbGFzaDoqLyAxKTsKKwlyZXMgPSBhcml0aCgmbWF0aF9zdGF0ZSwgZXhwX3N0ciA/IGV4cF9zdHIgOiBhcmcpOworCWZyZWUoZXhwX3N0cik7CisJaWYgKGVycm1zZ19wKQorCQkqZXJybXNnX3AgPSBtYXRoX3N0YXRlLmVycm1zZzsKKwlpZiAobWF0aF9zdGF0ZS5lcnJtc2cpCisJCWRpZV9pZl9zY3JpcHQobWF0aF9zdGF0ZS5lcnJtc2cpOworCXJldHVybiByZXM7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9IVVNIX0JBU0hfQ09NUEFUCisvKiAke3Zhci9bL11wYXR0ZXJuWy9yZXBsXX0gaGVscGVycyAqLworc3RhdGljIGNoYXIgKnN0cnN0cl9wYXR0ZXJuKGNoYXIgKnZhbCwgY29uc3QgY2hhciAqcGF0dGVybiwgaW50ICpzaXplKQoreworCXdoaWxlICgxKSB7CisJCWNoYXIgKmVuZCA9IHNjYW5fYW5kX21hdGNoKHZhbCwgcGF0dGVybiwgU0NBTl9NT1ZFX0ZST01fUklHSFQgKyBTQ0FOX01BVENIX0xFRlRfSEFMRik7CisJCWRlYnVnX3ByaW50Zl92YXJleHAoInZhbDonJXMnIHBhdHRlcm46JyVzJyBlbmQ6JyVzJ1xuIiwgdmFsLCBwYXR0ZXJuLCBlbmQpOworCQlpZiAoZW5kKSB7CisJCQkqc2l6ZSA9IGVuZCAtIHZhbDsKKwkJCXJldHVybiB2YWw7CisJCX0KKwkJaWYgKCp2YWwgPT0gJ1wwJykKKwkJCXJldHVybiBOVUxMOworCQkvKiBPcHRpbWl6YXRpb246IGlmICIqcGF0IiBkaWQgbm90IG1hdGNoIHRoZSBzdGFydCBvZiAic3RyaW5nIiwKKwkJICogd2Uga25vdyB0aGF0ICJ0cmluZyIsICJyaW5nIiBldGMgd2lsbCBub3QgbWF0Y2ggdG9vOgorCQkgKi8KKwkJaWYgKHBhdHRlcm5bMF0gPT0gJyonKQorCQkJcmV0dXJuIE5VTEw7CisJCXZhbCsrOworCX0KK30KK3N0YXRpYyBjaGFyICpyZXBsYWNlX3BhdHRlcm4oY2hhciAqdmFsLCBjb25zdCBjaGFyICpwYXR0ZXJuLCBjb25zdCBjaGFyICpyZXBsLCBjaGFyIGV4cF9vcCkKK3sKKwljaGFyICpyZXN1bHQgPSBOVUxMOworCXVuc2lnbmVkIHJlc19sZW4gPSAwOworCXVuc2lnbmVkIHJlcGxfbGVuID0gc3RybGVuKHJlcGwpOworCisJd2hpbGUgKDEpIHsKKwkJaW50IHNpemU7CisJCWNoYXIgKnMgPSBzdHJzdHJfcGF0dGVybih2YWwsIHBhdHRlcm4sICZzaXplKTsKKwkJaWYgKCFzKQorCQkJYnJlYWs7CisKKwkJcmVzdWx0ID0geHJlYWxsb2MocmVzdWx0LCByZXNfbGVuICsgKHMgLSB2YWwpICsgcmVwbF9sZW4gKyAxKTsKKwkJbWVtY3B5KHJlc3VsdCArIHJlc19sZW4sIHZhbCwgcyAtIHZhbCk7CisJCXJlc19sZW4gKz0gcyAtIHZhbDsKKwkJc3RyY3B5KHJlc3VsdCArIHJlc19sZW4sIHJlcGwpOworCQlyZXNfbGVuICs9IHJlcGxfbGVuOworCQlkZWJ1Z19wcmludGZfdmFyZXhwKCJ2YWw6JyVzJyBzOiclcycgcmVzdWx0OiclcydcbiIsIHZhbCwgcywgcmVzdWx0KTsKKworCQl2YWwgPSBzICsgc2l6ZTsKKwkJaWYgKGV4cF9vcCA9PSAnLycpCisJCQlicmVhazsKKwl9CisJaWYgKHZhbFswXSAmJiByZXN1bHQpIHsKKwkJcmVzdWx0ID0geHJlYWxsb2MocmVzdWx0LCByZXNfbGVuICsgc3RybGVuKHZhbCkgKyAxKTsKKwkJc3RyY3B5KHJlc3VsdCArIHJlc19sZW4sIHZhbCk7CisJCWRlYnVnX3ByaW50Zl92YXJleHAoInZhbDonJXMnIHJlc3VsdDonJXMnXG4iLCB2YWwsIHJlc3VsdCk7CisJfQorCWRlYnVnX3ByaW50Zl92YXJleHAoInJlc3VsdDonJXMnXG4iLCByZXN1bHQpOworCXJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKworLyogSGVscGVyOgorICogSGFuZGxlcyA8U1BFQ0lBTF9WQVJfU1lNQk9MPnZhcm5hbWUuLi48U1BFQ0lBTF9WQVJfU1lNQk9MPiBjb25zdHJ1Y3QuCisgKi8KK3N0YXRpYyBOT0lOTElORSBjb25zdCBjaGFyICpleHBhbmRfb25lX3ZhcihjaGFyICoqdG9fYmVfZnJlZWRfcHAsIGNoYXIgKmFyZywgY2hhciAqKnBwKQoreworCWNvbnN0IGNoYXIgKnZhbCA9IE5VTEw7CisJY2hhciAqdG9fYmVfZnJlZWQgPSBOVUxMOworCWNoYXIgKnAgPSAqcHA7CisJY2hhciAqdmFyOworCWNoYXIgZmlyc3RfY2hhcjsKKwljaGFyIGV4cF9vcDsKKwljaGFyIGV4cF9zYXZlID0gZXhwX3NhdmU7IC8qIGZvciBjb21waWxlciAqLworCWNoYXIgKmV4cF9zYXZlcHRyOyAvKiBwb2ludHMgdG8gZXhwYW5zaW9uIG9wZXJhdG9yICovCisJY2hhciAqZXhwX3dvcmQgPSBleHBfd29yZDsgLyogZm9yIGNvbXBpbGVyICovCisJY2hhciBhcmcwOworCisJKnAgPSAnXDAnOyAvKiByZXBsYWNlIHRyYWlsaW5nIFNQRUNJQUxfVkFSX1NZTUJPTCAqLworCXZhciA9IGFyZzsKKwlleHBfc2F2ZXB0ciA9IGFyZ1sxXSA/IHN0cmNocihWQVJfRU5DT0RFRF9TVUJTVF9PUFMsIGFyZ1sxXSkgOiBOVUxMOworCWFyZzAgPSBhcmdbMF07CisJZmlyc3RfY2hhciA9IGFyZ1swXSA9IGFyZzAgJiAweDdmOworCWV4cF9vcCA9IDA7CisKKwlpZiAoZmlyc3RfY2hhciA9PSAnIycgICAgICAvKiAkeyMuLi4gKi8KKwkgJiYgYXJnWzFdICYmICFleHBfc2F2ZXB0ciAvKiBub3QgJHsjfSBhbmQgbm90ICR7IzxvcF9jaGFyPi4uLn0gKi8KKwkpIHsKKwkJLyogSXQgbXVzdCBiZSBsZW5ndGggb3BlcmF0b3I6ICR7I3Zhcn0gKi8KKwkJdmFyKys7CisJCWV4cF9vcCA9ICdMJzsKKwl9IGVsc2UgeworCQkvKiBNYXliZSBoYW5kbGUgcGFyYW1ldGVyIGV4cGFuc2lvbiAqLworCQlpZiAoZXhwX3NhdmVwdHIgLyogaWYgMm5kIGNoYXIgaXMgb25lIG9mIGV4cGFuc2lvbiBvcGVyYXRvcnMgKi8KKwkJICYmIHN0cmNocihOVU1FUklDX1NQRUNWQVJTX1NUUiwgZmlyc3RfY2hhcikgLyogMXN0IGNoYXIgaXMgc3BlY2lhbCB2YXJpYWJsZSAqLworCQkpIHsKKwkJCS8qICR7PzowfSwgJHsjWzpdJTB9IGV0YyAqLworCQkJZXhwX3NhdmVwdHIgPSB2YXIgKyAxOworCQl9IGVsc2UgeworCQkJLyogJHs/fSwgJHt2YXJ9LCAke3ZhcjowfSwgJHt2YXJbOl0lMH0gZXRjICovCisJCQlleHBfc2F2ZXB0ciA9IHZhcisxICsgc3RyY3Nwbih2YXIrMSwgVkFSX0VOQ09ERURfU1VCU1RfT1BTKTsKKwkJfQorCQlleHBfb3AgPSBleHBfc2F2ZSA9ICpleHBfc2F2ZXB0cjsKKwkJaWYgKGV4cF9vcCkgeworCQkJZXhwX3dvcmQgPSBleHBfc2F2ZXB0ciArIDE7CisJCQlpZiAoZXhwX29wID09ICc6JykgeworCQkJCWV4cF9vcCA9ICpleHBfd29yZCsrOworLy9UT0RPOiB0cnkgJHt2YXI6fSBhbmQgJHt2YXI6Ym9ndXN9IGluIG5vbi1iYXNoIGNvbmZpZworCQkJCWlmIChFTkFCTEVfSFVTSF9CQVNIX0NPTVBBVAorCQkJCSAmJiAoIWV4cF9vcCB8fCAhc3RyY2hyKE1JTlVTX1BMVVNfRVFVQUxfUVVFU1RJT04sIGV4cF9vcCkpCisJCQkJKSB7CisJCQkJCS8qIG9vcHMuLi4gaXQncyAke3ZhcjpOWzpNXX0sIG5vdCAke3Zhcjo/eHh4fSBvciBzb21lIHN1Y2ggKi8KKwkJCQkJZXhwX29wID0gJzonOworCQkJCQlleHBfd29yZC0tOworCQkJCX0KKwkJCX0KKwkJCSpleHBfc2F2ZXB0ciA9ICdcMCc7CisJCX0gLyogZWxzZTogaXQncyBub3QgYW4gZXhwYW5zaW9uIG9wLCBidXQgYmFyZSAke3Zhcn0gKi8KKwl9CisKKwkvKiBMb29rIHVwIHRoZSB2YXJpYWJsZSBpbiBxdWVzdGlvbiAqLworCWlmIChpc2RpZ2l0KHZhclswXSkpIHsKKwkJLyogcGFyc2VfZG9sbGFyIHNob3VsZCBoYXZlIHZldHRlZCB2YXIgZm9yIHVzICovCisJCWludCBuID0geGF0b2lfcG9zaXRpdmUodmFyKTsKKwkJaWYgKG4gPCBHLmdsb2JhbF9hcmdjKQorCQkJdmFsID0gRy5nbG9iYWxfYXJndltuXTsKKwkJLyogZWxzZSB2YWwgcmVtYWlucyBOVUxMOiAkTiB3aXRoIHRvbyBiaWcgTiAqLworCX0gZWxzZSB7CisJCXN3aXRjaCAodmFyWzBdKSB7CisJCWNhc2UgJyQnOiAvKiBwaWQgKi8KKwkJCXZhbCA9IHV0b2EoRy5yb290X3BpZCk7CisJCQlicmVhazsKKwkJY2FzZSAnISc6IC8qIGJnIHBpZCAqLworCQkJdmFsID0gRy5sYXN0X2JnX3BpZCA/IHV0b2EoRy5sYXN0X2JnX3BpZCkgOiAiIjsKKwkJCWJyZWFrOworCQljYXNlICc/JzogLyogZXhpdGNvZGUgKi8KKwkJCXZhbCA9IHV0b2EoRy5sYXN0X2V4aXRjb2RlKTsKKwkJCWJyZWFrOworCQljYXNlICcjJzogLyogYXJnYyAqLworCQkJdmFsID0gdXRvYShHLmdsb2JhbF9hcmdjID8gRy5nbG9iYWxfYXJnYy0xIDogMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXZhbCA9IGdldF9sb2NhbF92YXJfdmFsdWUodmFyKTsKKwkJfQorCX0KKworCS8qIEhhbmRsZSBhbnkgZXhwYW5zaW9ucyAqLworCWlmIChleHBfb3AgPT0gJ0wnKSB7CisJCXJlaW5pdF91bmljb2RlX2Zvcl9odXNoKCk7CisJCWRlYnVnX3ByaW50Zl9leHBhbmQoImV4cGFuZDogbGVuZ3RoKCVzKT0iLCB2YWwpOworCQl2YWwgPSB1dG9hKHZhbCA/IHVuaWNvZGVfc3RybGVuKHZhbCkgOiAwKTsKKwkJZGVidWdfcHJpbnRmX2V4cGFuZCgiJXNcbiIsIHZhbCk7CisJfSBlbHNlIGlmIChleHBfb3ApIHsKKwkJaWYgKGV4cF9vcCA9PSAnJScgfHwgZXhwX29wID09ICcjJykgeworCQkJLyogU3RhbmRhcmQtbWFuZGF0ZWQgc3Vic3RyaW5nIHJlbW92YWwgb3BzOgorCQkJICogJHtwYXJhbWV0ZXIld29yZH0gLSByZW1vdmUgc21hbGxlc3Qgc3VmZml4IHBhdHRlcm4KKwkJCSAqICR7cGFyYW1ldGVyJSV3b3JkfSAtIHJlbW92ZSBsYXJnZXN0IHN1ZmZpeCBwYXR0ZXJuCisJCQkgKiAke3BhcmFtZXRlciN3b3JkfSAtIHJlbW92ZSBzbWFsbGVzdCBwcmVmaXggcGF0dGVybgorCQkJICogJHtwYXJhbWV0ZXIjI3dvcmR9IC0gcmVtb3ZlIGxhcmdlc3QgcHJlZml4IHBhdHRlcm4KKwkJCSAqCisJCQkgKiBXb3JkIGlzIGV4cGFuZGVkIHRvIHByb2R1Y2UgYSBnbG9iIHBhdHRlcm4uCisJCQkgKiBUaGVuIHZhcidzIHZhbHVlIGlzIG1hdGNoZWQgdG8gaXQgYW5kIG1hdGNoaW5nIHBhcnQgcmVtb3ZlZC4KKwkJCSAqLworCQkJaWYgKHZhbCAmJiB2YWxbMF0pIHsKKwkJCQljaGFyICp0OworCQkJCWNoYXIgKmV4cF9leHBfd29yZDsKKwkJCQljaGFyICpsb2M7CisJCQkJdW5zaWduZWQgc2Nhbl9mbGFncyA9IHBpY2tfc2NhbihleHBfb3AsICpleHBfd29yZCk7CisJCQkJaWYgKGV4cF9vcCA9PSAqZXhwX3dvcmQpICAvKiAjIyBvciAlJSAqLworCQkJCQlleHBfd29yZCsrOworCQkJCWV4cF9leHBfd29yZCA9IGVuY29kZV90aGVuX2V4cGFuZF9zdHJpbmcoZXhwX3dvcmQsIC8qcHJvY2Vzc19ia3NsYXNoOiovIDEsIC8qdW5iYWNrc2xhc2g6Ki8gMSk7CisJCQkJaWYgKGV4cF9leHBfd29yZCkKKwkJCQkJZXhwX3dvcmQgPSBleHBfZXhwX3dvcmQ7CisJCQkJLyogSEFDSyBBTEVSVC4gV2UgZGVwZW5kIGhlcmUgb24gdGhlIGZhY3QgdGhhdAorCQkJCSAqIEcuZ2xvYmFsX2FyZ3YgYW5kIHJlc3VsdHMgb2YgdXRvYSBhbmQgZ2V0X2xvY2FsX3Zhcl92YWx1ZQorCQkJCSAqIGFyZSBhY3R1YWxseSBpbiB3cml0YWJsZSBtZW1vcnk6CisJCQkJICogc2Nhbl9hbmRfbWF0Y2ggbW9tZW50YXJpbHkgc3RvcmVzIE5VTHMgdGhlcmUuICovCisJCQkJdCA9IChjaGFyKil2YWw7CisJCQkJbG9jID0gc2Nhbl9hbmRfbWF0Y2godCwgZXhwX3dvcmQsIHNjYW5fZmxhZ3MpOworCQkJCS8vYmJfZXJyb3JfbXNnKCJvcDolYyBzdHI6JyVzJyBwYXQ6JyVzJyByZXM6JyVzJyIsCisJCQkJLy8JCWV4cF9vcCwgdCwgZXhwX3dvcmQsIGxvYyk7CisJCQkJZnJlZShleHBfZXhwX3dvcmQpOworCQkJCWlmIChsb2MpIHsgLyogbWF0Y2ggd2FzIGZvdW5kICovCisJCQkJCWlmIChzY2FuX2ZsYWdzICYgU0NBTl9NQVRDSF9MRUZUX0hBTEYpIC8qICNbI10gKi8KKwkJCQkJCXZhbCA9IGxvYzsgLyogdGFrZSByaWdodCBwYXJ0ICovCisJCQkJCWVsc2UgLyogJVslXSAqLworCQkJCQkJdmFsID0gdG9fYmVfZnJlZWQgPSB4c3RybmR1cCh2YWwsIGxvYyAtIHZhbCk7IC8qIGxlZnQgKi8KKwkJCQl9CisJCQl9CisJCX0KKyNpZiBFTkFCTEVfSFVTSF9CQVNIX0NPTVBBVAorCQllbHNlIGlmIChleHBfb3AgPT0gJy8nIHx8IGV4cF9vcCA9PSAnXFwnKSB7CisJCQkvKiBJdCdzICR7dmFyL1svXXBhdHRlcm5bL3JlcGxdfSB0aGluZy4KKwkJCSAqIE5vdGUgdGhhdCBpbiBlbmNvZGVkIGZvcm0gaXQgaGFzIFRXTyBwYXJ0czoKKwkJCSAqIHZhci9wYXR0ZXJuPFNQRUNJQUxfVkFSX1NZTUJPTD5yZXBsPFNQRUNJQUxfVkFSX1NZTUJPTD4KKwkJCSAqIGFuZCBpZiAvLyBpcyB1c2VkLCBpdCBpcyBlbmNvZGVkIGFzIFw6CisJCQkgKiB2YXJccGF0dGVybjxTUEVDSUFMX1ZBUl9TWU1CT0w+cmVwbDxTUEVDSUFMX1ZBUl9TWU1CT0w+CisJCQkgKi8KKwkJCS8qIEVtcHR5IHZhcmlhYmxlIGFsd2F5cyBnaXZlcyBub3RoaW5nOiAqLworCQkJLy8gInY9Jyc7IGVjaG8gJHt2Lyovd30iIHByaW50cyAiIiwgbm90ICJ3IgorCQkJaWYgKHZhbCAmJiB2YWxbMF0pIHsKKwkJCQkvKiBwYXR0ZXJuIHVzZXMgbm9uLXN0YW5kYXJkIGV4cGFuc2lvbi4KKwkJCQkgKiByZXBsIHNob3VsZCBiZSB1bmJhY2tzbGFzaGVkIGFuZCBnbG9iYmVkCisJCQkJICogYnkgdGhlIHVzdWFsIGV4cGFuc2lvbiBydWxlczoKKwkJCQkgKiA+YXo7ID5iejsKKwkJCQkgKiB2PSdhIGJ6JzsgZWNobyAiJHt2L2Eqei9hKnp9IiBwcmludHMgImEqeiIKKwkJCQkgKiB2PSdhIGJ6JzsgZWNobyAiJHt2L2Eqei9cen0iICBwcmludHMgIlx6IgorCQkJCSAqIHY9J2EgYnonOyBlY2hvICR7di9hKnovYSp6fSAgIHByaW50cyAiYXoiCisJCQkJICogdj0nYSBieic7IGVjaG8gJHt2L2Eqei9cen0gICAgcHJpbnRzICJ6IgorCQkJCSAqIChub3RlIHRoYXQgYSp6IF9wYXR0ZXJuXyBpcyBuZXZlciBnbG9iYmVkISkKKwkJCQkgKi8KKwkJCQljaGFyICpwYXR0ZXJuLCAqcmVwbCwgKnQ7CisJCQkJcGF0dGVybiA9IGVuY29kZV90aGVuX2V4cGFuZF9zdHJpbmcoZXhwX3dvcmQsIC8qcHJvY2Vzc19ia3NsYXNoOiovIDAsIC8qdW5iYWNrc2xhc2g6Ki8gMCk7CisJCQkJaWYgKCFwYXR0ZXJuKQorCQkJCQlwYXR0ZXJuID0geHN0cmR1cChleHBfd29yZCk7CisJCQkJZGVidWdfcHJpbnRmX3ZhcmV4cCgicGF0dGVybjonJXMnLT4nJXMnXG4iLCBleHBfd29yZCwgcGF0dGVybik7CisJCQkJKnArKyA9IFNQRUNJQUxfVkFSX1NZTUJPTDsKKwkJCQlleHBfd29yZCA9IHA7CisJCQkJcCA9IHN0cmNocihwLCBTUEVDSUFMX1ZBUl9TWU1CT0wpOworCQkJCSpwID0gJ1wwJzsKKwkJCQlyZXBsID0gZW5jb2RlX3RoZW5fZXhwYW5kX3N0cmluZyhleHBfd29yZCwgLypwcm9jZXNzX2Jrc2xhc2g6Ki8gYXJnMCAmIDB4ODAsIC8qdW5iYWNrc2xhc2g6Ki8gMSk7CisJCQkJZGVidWdfcHJpbnRmX3ZhcmV4cCgicmVwbDonJXMnLT4nJXMnXG4iLCBleHBfd29yZCwgcmVwbCk7CisJCQkJLyogSEFDSyBBTEVSVC4gV2UgZGVwZW5kIGhlcmUgb24gdGhlIGZhY3QgdGhhdAorCQkJCSAqIEcuZ2xvYmFsX2FyZ3YgYW5kIHJlc3VsdHMgb2YgdXRvYSBhbmQgZ2V0X2xvY2FsX3Zhcl92YWx1ZQorCQkJCSAqIGFyZSBhY3R1YWxseSBpbiB3cml0YWJsZSBtZW1vcnk6CisJCQkJICogcmVwbGFjZV9wYXR0ZXJuIG1vbWVudGFyaWx5IHN0b3JlcyBOVUxzIHRoZXJlLiAqLworCQkJCXQgPSAoY2hhciopdmFsOworCQkJCXRvX2JlX2ZyZWVkID0gcmVwbGFjZV9wYXR0ZXJuKHQsCisJCQkJCQlwYXR0ZXJuLAorCQkJCQkJKHJlcGwgPyByZXBsIDogZXhwX3dvcmQpLAorCQkJCQkJZXhwX29wKTsKKwkJCQlpZiAodG9fYmVfZnJlZWQpIC8qIGF0IGxlYXN0IG9uZSByZXBsYWNlIGhhcHBlbmVkICovCisJCQkJCXZhbCA9IHRvX2JlX2ZyZWVkOworCQkJCWZyZWUocGF0dGVybik7CisJCQkJZnJlZShyZXBsKTsKKwkJCX0KKwkJfQorI2VuZGlmCisJCWVsc2UgaWYgKGV4cF9vcCA9PSAnOicpIHsKKyNpZiBFTkFCTEVfSFVTSF9CQVNIX0NPTVBBVCAmJiBFTkFCTEVfU0hfTUFUSF9TVVBQT1JUCisJCQkvKiBJdCdzICR7dmFyOk5bOk1dfSBiYXNoaXNtLgorCQkJICogTm90ZSB0aGF0IGluIGVuY29kZWQgZm9ybSBpdCBoYXMgVFdPIHBhcnRzOgorCQkJICogdmFyOk48U1BFQ0lBTF9WQVJfU1lNQk9MPk08U1BFQ0lBTF9WQVJfU1lNQk9MPgorCQkJICovCisJCQlhcml0aF90IGJlZywgbGVuOworCQkJY29uc3QgY2hhciAqZXJybXNnOworCisJCQliZWcgPSBleHBhbmRfYW5kX2V2YWx1YXRlX2FyaXRoKGV4cF93b3JkLCAmZXJybXNnKTsKKwkJCWlmIChlcnJtc2cpCisJCQkJZ290byBhcml0aF9lcnI7CisJCQlkZWJ1Z19wcmludGZfdmFyZXhwKCJiZWc6JyVzJz0lbGxkXG4iLCBleHBfd29yZCwgKGxvbmcgbG9uZyliZWcpOworCQkJKnArKyA9IFNQRUNJQUxfVkFSX1NZTUJPTDsKKwkJCWV4cF93b3JkID0gcDsKKwkJCXAgPSBzdHJjaHIocCwgU1BFQ0lBTF9WQVJfU1lNQk9MKTsKKwkJCSpwID0gJ1wwJzsKKwkJCWxlbiA9IGV4cGFuZF9hbmRfZXZhbHVhdGVfYXJpdGgoZXhwX3dvcmQsICZlcnJtc2cpOworCQkJaWYgKGVycm1zZykKKwkJCQlnb3RvIGFyaXRoX2VycjsKKwkJCWRlYnVnX3ByaW50Zl92YXJleHAoImxlbjonJXMnPSVsbGRcbiIsIGV4cF93b3JkLCAobG9uZyBsb25nKWxlbik7CisJCQlpZiAobGVuID49IDApIHsgLyogYmFzaCBjb21wYXQ6IGxlbiA8IDAgaXMgaWxsZWdhbCAqLworCQkJCWlmIChiZWcgPCAwKSAvKiBiYXNoIGNvbXBhdCAqLworCQkJCQliZWcgPSAwOworCQkJCWRlYnVnX3ByaW50Zl92YXJleHAoImZyb20gdmFsOiclcydcbiIsIHZhbCk7CisJCQkJaWYgKGxlbiA9PSAwIHx8ICF2YWwgfHwgYmVnID49IHN0cmxlbih2YWwpKSB7CisgYXJpdGhfZXJyOgorCQkJCQl2YWwgPSBOVUxMOworCQkJCX0gZWxzZSB7CisJCQkJCS8qIFBhcmFub2lhLiBXaGF0IGlmIHVzZXIgZW50ZXJlZCA5OTk5OTk5OTk5OTk5CisJCQkJCSAqIHdoaWNoIGZpdHMgaW4gYXJpdGhfdCBidXQgbm90IGludD8gKi8KKwkJCQkJaWYgKGxlbiA+PSBJTlRfTUFYKQorCQkJCQkJbGVuID0gSU5UX01BWDsKKwkJCQkJdmFsID0gdG9fYmVfZnJlZWQgPSB4c3RybmR1cCh2YWwgKyBiZWcsIGxlbik7CisJCQkJfQorCQkJCWRlYnVnX3ByaW50Zl92YXJleHAoInZhbDonJXMnXG4iLCB2YWwpOworCQkJfSBlbHNlCisjZW5kaWYKKwkJCXsKKwkJCQlkaWVfaWZfc2NyaXB0KCJtYWxmb3JtZWQgJHslczouLi59IiwgdmFyKTsKKwkJCQl2YWwgPSBOVUxMOworCQkJfQorCQl9IGVsc2UgeyAvKiBvbmUgb2YgIi09Kz8iICovCisJCQkvKiBTdGFuZGFyZC1tYW5kYXRlZCBzdWJzdGl0dXRpb24gb3BzOgorCQkJICogJHt2YXI/d29yZH0gLSBpbmRpY2F0ZSBlcnJvciBpZiB1bnNldAorCQkJICogICAgICBJZiB2YXIgaXMgdW5zZXQsIHdvcmQgKG9yIGEgbWVzc2FnZSBpbmRpY2F0aW5nIGl0IGlzIHVuc2V0CisJCQkgKiAgICAgIGlmIHdvcmQgaXMgbnVsbCkgaXMgd3JpdHRlbiB0byBzdGFuZGFyZCBlcnJvcgorCQkJICogICAgICBhbmQgdGhlIHNoZWxsIGV4aXRzIHdpdGggYSBub24temVybyBleGl0IHN0YXR1cy4KKwkJCSAqICAgICAgT3RoZXJ3aXNlLCB0aGUgdmFsdWUgb2YgdmFyIGlzIHN1YnN0aXR1dGVkLgorCQkJICogJHt2YXItd29yZH0gLSB1c2UgZGVmYXVsdCB2YWx1ZQorCQkJICogICAgICBJZiB2YXIgaXMgdW5zZXQsIHdvcmQgaXMgc3Vic3RpdHV0ZWQuCisJCQkgKiAke3Zhcj13b3JkfSAtIGFzc2lnbiBhbmQgdXNlIGRlZmF1bHQgdmFsdWUKKwkJCSAqICAgICAgSWYgdmFyIGlzIHVuc2V0LCB3b3JkIGlzIGFzc2lnbmVkIHRvIHZhci4KKwkJCSAqICAgICAgSW4gYWxsIGNhc2VzLCBmaW5hbCB2YWx1ZSBvZiB2YXIgaXMgc3Vic3RpdHV0ZWQuCisJCQkgKiAke3Zhcit3b3JkfSAtIHVzZSBhbHRlcm5hdGl2ZSB2YWx1ZQorCQkJICogICAgICBJZiB2YXIgaXMgdW5zZXQsIG51bGwgaXMgc3Vic3RpdHV0ZWQuCisJCQkgKiAgICAgIE90aGVyd2lzZSwgd29yZCBpcyBzdWJzdGl0dXRlZC4KKwkJCSAqCisJCQkgKiBXb3JkIGlzIHN1YmplY3RlZCB0byB0aWxkZSBleHBhbnNpb24sIHBhcmFtZXRlciBleHBhbnNpb24sCisJCQkgKiBjb21tYW5kIHN1YnN0aXR1dGlvbiwgYW5kIGFyaXRobWV0aWMgZXhwYW5zaW9uLgorCQkJICogSWYgd29yZCBpcyBub3QgbmVlZGVkLCBpdCBpcyBub3QgZXhwYW5kZWQuCisJCQkgKgorCQkJICogQ29sb24gZm9ybXMgKCR7dmFyOi13b3JkfSwgJHt2YXI6PXdvcmR9IGV0YykgZG8gdGhlIHNhbWUsCisJCQkgKiBidXQgYWxzbyB0cmVhdCBudWxsIHZhciBhcyBpZiBpdCBpcyB1bnNldC4KKwkJCSAqLworCQkJaW50IHVzZV93b3JkID0gKCF2YWwgfHwgKChleHBfc2F2ZSA9PSAnOicpICYmICF2YWxbMF0pKTsKKwkJCWlmIChleHBfb3AgPT0gJysnKQorCQkJCXVzZV93b3JkID0gIXVzZV93b3JkOworCQkJZGVidWdfcHJpbnRmX2V4cGFuZCgiZXhwYW5kOiBvcDolYyAobnVsbDolcykgdGVzdDolaVxuIiwgZXhwX29wLAorCQkJCQkoZXhwX3NhdmUgPT0gJzonKSA/ICJ0cnVlIiA6ICJmYWxzZSIsIHVzZV93b3JkKTsKKwkJCWlmICh1c2Vfd29yZCkgeworCQkJCXRvX2JlX2ZyZWVkID0gZW5jb2RlX3RoZW5fZXhwYW5kX3N0cmluZyhleHBfd29yZCwgLypwcm9jZXNzX2Jrc2xhc2g6Ki8gMSwgLyp1bmJhY2tzbGFzaDoqLyAxKTsKKwkJCQlpZiAodG9fYmVfZnJlZWQpCisJCQkJCWV4cF93b3JkID0gdG9fYmVfZnJlZWQ7CisJCQkJaWYgKGV4cF9vcCA9PSAnPycpIHsKKwkJCQkJLyogbWltaWMgYmFzaCBtZXNzYWdlICovCisJCQkJCWRpZV9pZl9zY3JpcHQoIiVzOiAlcyIsCisJCQkJCQl2YXIsCisJCQkJCQlleHBfd29yZFswXSA/IGV4cF93b3JkIDogInBhcmFtZXRlciBudWxsIG9yIG5vdCBzZXQiCisJCQkJCSk7CisvL1RPRE86IGhvdyBpbnRlcmFjdGl2ZSBiYXNoIGFib3J0cyBleHBhbnNpb24gbWlkLWNvbW1hbmQ/CisJCQkJfSBlbHNlIHsKKwkJCQkJdmFsID0gZXhwX3dvcmQ7CisJCQkJfQorCisJCQkJaWYgKGV4cF9vcCA9PSAnPScpIHsKKwkJCQkJLyogJHt2YXI9W3dvcmRdfSBvciAke3Zhcjo9W3dvcmRdfSAqLworCQkJCQlpZiAoaXNkaWdpdCh2YXJbMF0pIHx8IHZhclswXSA9PSAnIycpIHsKKwkJCQkJCS8qIG1pbWljIGJhc2ggbWVzc2FnZSAqLworCQkJCQkJZGllX2lmX3NjcmlwdCgiJCVzOiBjYW5ub3QgYXNzaWduIGluIHRoaXMgd2F5IiwgdmFyKTsKKwkJCQkJCXZhbCA9IE5VTEw7CisJCQkJCX0gZWxzZSB7CisJCQkJCQljaGFyICpuZXdfdmFyID0geGFzcHJpbnRmKCIlcz0lcyIsIHZhciwgdmFsKTsKKwkJCQkJCXNldF9sb2NhbF92YXIobmV3X3ZhciwgLypleHA6Ki8gMCwgLypsdmw6Ki8gMCwgLypybzoqLyAwKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfSAvKiBvbmUgb2YgIi09Kz8iICovCisKKwkJKmV4cF9zYXZlcHRyID0gZXhwX3NhdmU7CisJfSAvKiBpZiAoZXhwX29wKSAqLworCisJYXJnWzBdID0gYXJnMDsKKworCSpwcCA9IHA7CisJKnRvX2JlX2ZyZWVkX3BwID0gdG9fYmVfZnJlZWQ7CisJcmV0dXJuIHZhbDsKK30KKworLyogRXhwYW5kIGFsbCB2YXJpYWJsZSByZWZlcmVuY2VzIGluIGdpdmVuIHN0cmluZywgYWRkaW5nIHdvcmRzIHRvIGxpc3RbXQorICogYXQgbiwgbisxLC4uLiBwb3NpdGlvbnMuIFJldHVybiB1cGRhdGVkIG4gKHNvIHRoYXQgbGlzdFtuXSBpcyBuZXh0IG9uZQorICogdG8gYmUgZmlsbGVkKS4gVGhpcyByb3V0aW5lIGlzIGV4dHJlbWVseSB0cmlja3k6IGhhcyB0byBkZWFsIHdpdGgKKyAqIHZhcmlhYmxlcy9wYXJhbWV0ZXJzIHdpdGggd2hpdGVzcGFjZSwgJCogYW5kICRALCBhbmQgY29uc3RydWN0cyBsaWtlCisgKiAnZWNobyAtJCotJy4gSWYgeW91IHBsYXkgaGVyZSwgeW91IG11c3QgcnVuIHRlc3RzdWl0ZSBhZnRlcndhcmRzISAqLworc3RhdGljIE5PSU5MSU5FIGludCBleHBhbmRfdmFyc190b19saXN0KG9fc3RyaW5nICpvdXRwdXQsIGludCBuLCBjaGFyICphcmcpCit7CisJLyogb3V0cHV0LT5vX2V4cGZsYWdzICYgRVhQX0ZMQUdfU0lOR0xFV09SRCAoMHg4MCkgaWYgd2UgYXJlIGluCisJICogZXhwYW5zaW9uIG9mIHJpZ2h0LWhhbmQgc2lkZSBvZiBhc3NpZ25tZW50ID09IDEtZWxlbWVudCBleHBhbmQuCisJICovCisJY2hhciBjYW50X2JlX251bGwgPSAwOyAvKiBvbmx5IGJpdCAweDgwIG1hdHRlcnMgKi8KKwlpbnQgZW5kZWRfaW5faWZzID0gMDsgIC8qIGRpZCBsYXN0IHVucXVvdGVkIGV4cGFuc2lvbiBlbmQgd2l0aCBJRlMgY2hhcnM/ICovCisJY2hhciAqcDsKKworCWRlYnVnX3ByaW50Zl9leHBhbmQoImV4cGFuZF92YXJzX3RvX2xpc3Q6IGFyZzonJXMnIHNpbmdsZXdvcmQ6JXhcbiIsIGFyZywKKwkJCSEhKG91dHB1dC0+b19leHBmbGFncyAmIEVYUF9GTEFHX1NJTkdMRVdPUkQpKTsKKwlkZWJ1Z19wcmludF9saXN0KCJleHBhbmRfdmFyc190b19saXN0Iiwgb3V0cHV0LCBuKTsKKwluID0gb19zYXZlX3B0cihvdXRwdXQsIG4pOworCWRlYnVnX3ByaW50X2xpc3QoImV4cGFuZF92YXJzX3RvX2xpc3RbMF0iLCBvdXRwdXQsIG4pOworCisJd2hpbGUgKChwID0gc3RyY2hyKGFyZywgU1BFQ0lBTF9WQVJfU1lNQk9MKSkgIT0gTlVMTCkgeworCQljaGFyIGZpcnN0X2NoOworCQljaGFyICp0b19iZV9mcmVlZCA9IE5VTEw7CisJCWNvbnN0IGNoYXIgKnZhbCA9IE5VTEw7CisjaWYgRU5BQkxFX0hVU0hfVElDSworCQlvX3N0cmluZyBzdWJzdF9yZXN1bHQgPSBOVUxMX09fU1RSSU5HOworI2VuZGlmCisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVAorCQljaGFyIGFyaXRoX2J1ZltzaXplb2YoYXJpdGhfdCkqMyArIDJdOworI2VuZGlmCisKKwkJaWYgKGVuZGVkX2luX2lmcykgeworCQkJb19hZGRjaHIob3V0cHV0LCAnXDAnKTsKKwkJCW4gPSBvX3NhdmVfcHRyKG91dHB1dCwgbik7CisJCQllbmRlZF9pbl9pZnMgPSAwOworCQl9CisKKwkJb19hZGRibG9jayhvdXRwdXQsIGFyZywgcCAtIGFyZyk7CisJCWRlYnVnX3ByaW50X2xpc3QoImV4cGFuZF92YXJzX3RvX2xpc3RbMV0iLCBvdXRwdXQsIG4pOworCQlhcmcgPSArK3A7CisJCXAgPSBzdHJjaHIocCwgU1BFQ0lBTF9WQVJfU1lNQk9MKTsKKworCQkvKiBGZXRjaCBzcGVjaWFsIHZhciBuYW1lIChpZiBpdCBpcyBpbmRlZWQgb25lIG9mIHRoZW0pCisJCSAqIGFuZCBxdW90ZSBiaXQsIGZvcmNlIHRoZSBiaXQgb24gaWYgc2luZ2xld29yZCBleHBhbnNpb24gLQorCQkgKiBpbXBvcnRhbnQgZm9yIG5vdCBnZXR0aW5nIHY9JEAgZXhwYW5kIHRvIG1hbnkgd29yZHMuICovCisJCWZpcnN0X2NoID0gYXJnWzBdIHwgKG91dHB1dC0+b19leHBmbGFncyAmIEVYUF9GTEFHX1NJTkdMRVdPUkQpOworCisJCS8qIElzIHRoaXMgdmFyaWFibGUgcXVvdGVkIGFuZCB0aHVzIGV4cGFuc2lvbiBjYW4ndCBiZSBudWxsPworCQkgKiAiJEAiIGlzIHNwZWNpYWwuIEV2ZW4gaWYgcXVvdGVkLCBpdCBjYW4gc3RpbGwKKwkJICogZXhwYW5kIHRvIG5vdGhpbmcgKG5vdCBldmVuIGFuIGVtcHR5IHN0cmluZyksCisJCSAqIHRodXMgaXQgaXMgZXhjbHVkZWQuICovCisJCWlmICgoZmlyc3RfY2ggJiAweDdmKSAhPSAnQCcpCisJCQljYW50X2JlX251bGwgfD0gZmlyc3RfY2g7CisKKwkJc3dpdGNoIChmaXJzdF9jaCAmIDB4N2YpIHsKKwkJLyogSGlnaGVzdCBiaXQgaW4gZmlyc3RfY2ggaW5kaWNhdGVzIHRoYXQgdmFyIGlzIGRvdWJsZS1xdW90ZWQgKi8KKwkJY2FzZSAnKic6CisJCWNhc2UgJ0AnOiB7CisJCQlpbnQgaTsKKwkJCWlmICghRy5nbG9iYWxfYXJndlsxXSkKKwkJCQlicmVhazsKKwkJCWkgPSAxOworCQkJY2FudF9iZV9udWxsIHw9IGZpcnN0X2NoOyAvKiBkbyBpdCBmb3IgIiRAIiBfbm93Xywgd2hlbiB3ZSBrbm93IGl0J3Mgbm90IGVtcHR5ICovCisJCQlpZiAoIShmaXJzdF9jaCAmIDB4ODApKSB7IC8qIHVucXVvdGVkICQqIG9yICRAICovCisJCQkJd2hpbGUgKEcuZ2xvYmFsX2FyZ3ZbaV0pIHsKKwkJCQkJbiA9IGV4cGFuZF9vbl9pZnMoTlVMTCwgb3V0cHV0LCBuLCBHLmdsb2JhbF9hcmd2W2ldKTsKKwkJCQkJZGVidWdfcHJpbnRmX2V4cGFuZCgiZXhwYW5kX3ZhcnNfdG9fbGlzdDogYXJndiAlZCAobGFzdCAlZClcbiIsIGksIEcuZ2xvYmFsX2FyZ2MgLSAxKTsKKwkJCQkJaWYgKEcuZ2xvYmFsX2FyZ3ZbaSsrXVswXSAmJiBHLmdsb2JhbF9hcmd2W2ldKSB7CisJCQkJCQkvKiB0aGlzIGFyZ3ZbXSBpcyBub3QgZW1wdHkgYW5kIG5vdCBsYXN0OgorCQkJCQkJICogcHV0IHRlcm1pbmF0aW5nIE5VTCwgc3RhcnQgbmV3IHdvcmQgKi8KKwkJCQkJCW9fYWRkY2hyKG91dHB1dCwgJ1wwJyk7CisJCQkJCQlkZWJ1Z19wcmludF9saXN0KCJleHBhbmRfdmFyc190b19saXN0WzJdIiwgb3V0cHV0LCBuKTsKKwkJCQkJCW4gPSBvX3NhdmVfcHRyKG91dHB1dCwgbik7CisJCQkJCQlkZWJ1Z19wcmludF9saXN0KCJleHBhbmRfdmFyc190b19saXN0WzNdIiwgb3V0cHV0LCBuKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0gZWxzZQorCQkJLyogSWYgRVhQX0ZMQUdfU0lOR0xFV09SRCwgd2UgaGFuZGxlIGFzc2lnbm1lbnQgJ2E9Li4uLiRALi4uLi4nCisJCQkgKiBhbmQgaW4gdGhpcyBjYXNlIHNob3VsZCB0cmVhdCBpdCBsaWtlICckKicgLSBzZWUgJ2Vsc2UuLi4nIGJlbG93ICovCisJCQlpZiAoZmlyc3RfY2ggPT0gKCdAJ3wweDgwKSAgLyogcXVvdGVkICRAICovCisJCQkgJiYgIShvdXRwdXQtPm9fZXhwZmxhZ3MgJiBFWFBfRkxBR19TSU5HTEVXT1JEKSAvKiBub3Qgdj0iJEAiIGNhc2UgKi8KKwkJCSkgeworCQkJCXdoaWxlICgxKSB7CisJCQkJCW9fYWRkUXN0cihvdXRwdXQsIEcuZ2xvYmFsX2FyZ3ZbaV0pOworCQkJCQlpZiAoKytpID49IEcuZ2xvYmFsX2FyZ2MpCisJCQkJCQlicmVhazsKKwkJCQkJb19hZGRjaHIob3V0cHV0LCAnXDAnKTsKKwkJCQkJZGVidWdfcHJpbnRfbGlzdCgiZXhwYW5kX3ZhcnNfdG9fbGlzdFs0XSIsIG91dHB1dCwgbik7CisJCQkJCW4gPSBvX3NhdmVfcHRyKG91dHB1dCwgbik7CisJCQkJfQorCQkJfSBlbHNlIHsgLyogcXVvdGVkICQqIChvciB2PSIkQCIgY2FzZSk6IGFkZCBhcyBvbmUgd29yZCAqLworCQkJCXdoaWxlICgxKSB7CisJCQkJCW9fYWRkUXN0cihvdXRwdXQsIEcuZ2xvYmFsX2FyZ3ZbaV0pOworCQkJCQlpZiAoIUcuZ2xvYmFsX2FyZ3ZbKytpXSkKKwkJCQkJCWJyZWFrOworCQkJCQlpZiAoRy5pZnNbMF0pCisJCQkJCQlvX2FkZGNocihvdXRwdXQsIEcuaWZzWzBdKTsKKwkJCQl9CisJCQkJb3V0cHV0LT5oYXNfcXVvdGVkX3BhcnQgPSAxOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSBTUEVDSUFMX1ZBUl9TWU1CT0w6IC8qIDxTUEVDSUFMX1ZBUl9TWU1CT0w+PFNQRUNJQUxfVkFSX1NZTUJPTD4gKi8KKwkJCS8qICJFbXB0eSB2YXJpYWJsZSIsIHVzZWQgdG8gbWFrZSAiIiBldGMgdG8gbm90IGRpc2FwcGVhciAqLworCQkJb3V0cHV0LT5oYXNfcXVvdGVkX3BhcnQgPSAxOworCQkJYXJnKys7CisJCQljYW50X2JlX251bGwgPSAweDgwOworCQkJYnJlYWs7CisjaWYgRU5BQkxFX0hVU0hfVElDSworCQljYXNlICdgJzogLyogPFNQRUNJQUxfVkFSX1NZTUJPTD5gY21kPFNQRUNJQUxfVkFSX1NZTUJPTD4gKi8KKwkJCSpwID0gJ1wwJzsgLyogcmVwbGFjZSB0cmFpbGluZyA8U1BFQ0lBTF9WQVJfU1lNQk9MPiAqLworCQkJYXJnKys7CisJCQkvKiBDYW4ndCBqdXN0IHN0dWZmIGl0IGludG8gb3V0cHV0IG9fc3RyaW5nLAorCQkJICogZXhwYW5kZWQgcmVzdWx0IG1heSBuZWVkIHRvIGJlIGdsb2JiZWQKKwkJCSAqIGFuZCAkSUZTLXNwbGl0dGVkICovCisJCQlkZWJ1Z19wcmludGZfc3Vic3QoIlNVQlNUICclcycgZmlyc3RfY2ggJXhcbiIsIGFyZywgZmlyc3RfY2gpOworCQkJRy5sYXN0X2V4aXRjb2RlID0gcHJvY2Vzc19jb21tYW5kX3N1YnMoJnN1YnN0X3Jlc3VsdCwgYXJnKTsKKwkJCWRlYnVnX3ByaW50Zl9zdWJzdCgiU1VCU1QgUkVTOiVkICclcydcbiIsIEcubGFzdF9leGl0Y29kZSwgc3Vic3RfcmVzdWx0LmRhdGEpOworCQkJdmFsID0gc3Vic3RfcmVzdWx0LmRhdGE7CisJCQlnb3RvIHN0b3JlX3ZhbDsKKyNlbmRpZgorI2lmIEVOQUJMRV9TSF9NQVRIX1NVUFBPUlQKKwkJY2FzZSAnKyc6IHsgLyogPFNQRUNJQUxfVkFSX1NZTUJPTD4rY21kPFNQRUNJQUxfVkFSX1NZTUJPTD4gKi8KKwkJCWFyaXRoX3QgcmVzOworCisJCQlhcmcrKzsgLyogc2tpcCAnKycgKi8KKwkJCSpwID0gJ1wwJzsgLyogcmVwbGFjZSB0cmFpbGluZyA8U1BFQ0lBTF9WQVJfU1lNQk9MPiAqLworCQkJZGVidWdfcHJpbnRmX3N1YnN0KCJBUklUSCAnJXMnIGZpcnN0X2NoICV4XG4iLCBhcmcsIGZpcnN0X2NoKTsKKwkJCXJlcyA9IGV4cGFuZF9hbmRfZXZhbHVhdGVfYXJpdGgoYXJnLCBOVUxMKTsKKwkJCWRlYnVnX3ByaW50Zl9zdWJzdCgiQVJJVEggUkVTICciQVJJVEhfRk1UIidcbiIsIHJlcyk7CisJCQlzcHJpbnRmKGFyaXRoX2J1ZiwgQVJJVEhfRk1ULCByZXMpOworCQkJdmFsID0gYXJpdGhfYnVmOworCQkJYnJlYWs7CisJCX0KKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJdmFsID0gZXhwYW5kX29uZV92YXIoJnRvX2JlX2ZyZWVkLCBhcmcsICZwKTsKKyBJRl9IVVNIX1RJQ0soc3RvcmVfdmFsOikKKwkJCWlmICghKGZpcnN0X2NoICYgMHg4MCkpIHsgLyogdW5xdW90ZWQgJFZBUiAqLworCQkJCWRlYnVnX3ByaW50Zl9leHBhbmQoInVucXVvdGVkICclcycsIG91dHB1dC0+b19lc2NhcGU6JWRcbiIsIHZhbCwKKwkJCQkJCSEhKG91dHB1dC0+b19leHBmbGFncyAmIEVYUF9GTEFHX0VTQ19HTE9CX0NIQVJTKSk7CisJCQkJaWYgKHZhbCAmJiB2YWxbMF0pIHsKKwkJCQkJbiA9IGV4cGFuZF9vbl9pZnMoJmVuZGVkX2luX2lmcywgb3V0cHV0LCBuLCB2YWwpOworCQkJCQl2YWwgPSBOVUxMOworCQkJCX0KKwkJCX0gZWxzZSB7IC8qIHF1b3RlZCAkVkFSLCB2YWwgd2lsbCBiZSBhcHBlbmRlZCBiZWxvdyAqLworCQkJCW91dHB1dC0+aGFzX3F1b3RlZF9wYXJ0ID0gMTsKKwkJCQlkZWJ1Z19wcmludGZfZXhwYW5kKCJxdW90ZWQgJyVzJywgb3V0cHV0LT5vX2VzY2FwZTolZFxuIiwgdmFsLAorCQkJCQkJISEob3V0cHV0LT5vX2V4cGZsYWdzICYgRVhQX0ZMQUdfRVNDX0dMT0JfQ0hBUlMpKTsKKwkJCX0KKwkJCWJyZWFrOworCQl9IC8qIHN3aXRjaCAoY2hhciBhZnRlciA8U1BFQ0lBTF9WQVJfU1lNQk9MPikgKi8KKworCQlpZiAodmFsICYmIHZhbFswXSkgeworCQkJb19hZGRRc3RyKG91dHB1dCwgdmFsKTsKKwkJfQorCQlmcmVlKHRvX2JlX2ZyZWVkKTsKKworCQkvKiBSZXN0b3JlIE5VTEwnZWQgU1BFQ0lBTF9WQVJfU1lNQk9MLgorCQkgKiBEbyB0aGUgY2hlY2sgdG8gYXZvaWQgd3JpdGluZyB0byBhIGNvbnN0IHN0cmluZy4gKi8KKwkJaWYgKCpwICE9IFNQRUNJQUxfVkFSX1NZTUJPTCkKKwkJCSpwID0gU1BFQ0lBTF9WQVJfU1lNQk9MOworCisjaWYgRU5BQkxFX0hVU0hfVElDSworCQlvX2ZyZWUoJnN1YnN0X3Jlc3VsdCk7CisjZW5kaWYKKwkJYXJnID0gKytwOworCX0gLyogZW5kIG9mICJ3aGlsZSAoU1BFQ0lBTF9WQVJfU1lNQk9MIGlzIGZvdW5kKSAuLi4iICovCisKKwlpZiAoYXJnWzBdKSB7CisJCWlmIChlbmRlZF9pbl9pZnMpIHsKKwkJCW9fYWRkY2hyKG91dHB1dCwgJ1wwJyk7CisJCQluID0gb19zYXZlX3B0cihvdXRwdXQsIG4pOworCQl9CisJCWRlYnVnX3ByaW50X2xpc3QoImV4cGFuZF92YXJzX3RvX2xpc3RbYV0iLCBvdXRwdXQsIG4pOworCQkvKiB0aGlzIHBhcnQgaXMgbGl0ZXJhbCwgYW5kIGl0IHdhcyBhbHJlYWR5IHByZS1xdW90ZWQKKwkJICogaWYgbmVlZGVkIChtdWNoIGVhcmxpZXIpLCBkbyBub3QgdXNlIG9fYWRkUXN0ciBoZXJlISAqLworCQlvX2FkZHN0cl93aXRoX05VTChvdXRwdXQsIGFyZyk7CisJCWRlYnVnX3ByaW50X2xpc3QoImV4cGFuZF92YXJzX3RvX2xpc3RbYl0iLCBvdXRwdXQsIG4pOworCX0gZWxzZSBpZiAob3V0cHV0LT5sZW5ndGggPT0gb19nZXRfbGFzdF9wdHIob3V0cHV0LCBuKSAvKiBleHBhbnNpb24gaXMgZW1wdHkgKi8KKwkgJiYgIShjYW50X2JlX251bGwgJiAweDgwKSAvKiBhbmQgYWxsIHZhcnMgd2VyZSBub3QgcXVvdGVkLiAqLworCSkgeworCQluLS07CisJCS8qIGFsbG93IHRvIHJldXNlIGxpc3Rbbl0gbGF0ZXIgd2l0aG91dCByZS1ncm93dGggKi8KKwkJb3V0cHV0LT5oYXNfZW1wdHlfc2xvdCA9IDE7CisJfSBlbHNlIHsKKwkJb19hZGRjaHIob3V0cHV0LCAnXDAnKTsKKwl9CisKKwlyZXR1cm4gbjsKK30KKworc3RhdGljIGNoYXIgKipleHBhbmRfdmFyaWFibGVzKGNoYXIgKiphcmd2LCB1bnNpZ25lZCBleHBmbGFncykKK3sKKwlpbnQgbjsKKwljaGFyICoqbGlzdDsKKwlvX3N0cmluZyBvdXRwdXQgPSBOVUxMX09fU1RSSU5HOworCisJb3V0cHV0Lm9fZXhwZmxhZ3MgPSBleHBmbGFnczsKKworCW4gPSAwOworCXdoaWxlICgqYXJndikgeworCQluID0gZXhwYW5kX3ZhcnNfdG9fbGlzdCgmb3V0cHV0LCBuLCAqYXJndik7CisJCWFyZ3YrKzsKKwl9CisJZGVidWdfcHJpbnRfbGlzdCgiZXhwYW5kX3ZhcmlhYmxlcyIsICZvdXRwdXQsIG4pOworCisJLyogb3V0cHV0LmRhdGEgKG1hbGxvY2VkIGluIG9uZSBibG9jaykgZ2V0cyByZXR1cm5lZCBpbiAibGlzdCIgKi8KKwlsaXN0ID0gb19maW5hbGl6ZV9saXN0KCZvdXRwdXQsIG4pOworCWRlYnVnX3ByaW50X3N0cmluZ3MoImV4cGFuZF92YXJpYWJsZXNbMV0iLCBsaXN0KTsKKwlyZXR1cm4gbGlzdDsKK30KKworc3RhdGljIGNoYXIgKipleHBhbmRfc3RydmVjX3RvX3N0cnZlYyhjaGFyICoqYXJndikKK3sKKwlyZXR1cm4gZXhwYW5kX3ZhcmlhYmxlcyhhcmd2LCBFWFBfRkxBR19HTE9CIHwgRVhQX0ZMQUdfRVNDX0dMT0JfQ0hBUlMpOworfQorCisjaWYgRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQKK3N0YXRpYyBjaGFyICoqZXhwYW5kX3N0cnZlY190b19zdHJ2ZWNfc2luZ2xld29yZF9ub2dsb2IoY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIGV4cGFuZF92YXJpYWJsZXMoYXJndiwgRVhQX0ZMQUdfU0lOR0xFV09SRCk7Cit9CisjZW5kaWYKKworLyogVXNlZCBmb3IgZXhwYW5zaW9uIG9mIHJpZ2h0IGhhbmQgb2YgYXNzaWdubWVudHMsCisgKiAkKCguLi4pKSwgaGVyZWRvY3MsIHZhcmlhYmxlIGVzcGFuc2lvbiBwYXJ0cy4KKyAqCisgKiBOQjogc2hvdWxkIE5PVCBkbyBnbG9iYmluZyEKKyAqICJleHBvcnQgdj0vYmluL2MqOyBlbnYgfCBncmVwIF52PSIgb3V0cHV0cyAidj0vYmluL2MqIgorICovCitzdGF0aWMgY2hhciAqZXhwYW5kX3N0cmluZ190b19zdHJpbmcoY29uc3QgY2hhciAqc3RyLCBpbnQgZG9fdW5iYWNrc2xhc2gpCit7CisjaWYgIUVOQUJMRV9IVVNIX0JBU0hfQ09NUEFUCisJY29uc3QgaW50IGRvX3VuYmFja3NsYXNoID0gMTsKKyNlbmRpZgorCWNoYXIgKmFyZ3ZbMl0sICoqbGlzdDsKKworCWRlYnVnX3ByaW50Zl9leHBhbmQoInN0cmluZ190b19zdHJpbmc8PSclcydcbiIsIHN0cik7CisJLyogVGhpcyBpcyBnZW5lcmFsbHkgYW4gb3B0aW1pemF0aW9uLCBidXQgaXQgYWxzbworCSAqIGhhbmRsZXMgIiIsIHdoaWNoIG90aGVyd2lzZSB0cmlwcyBvdmVyICFsaXN0WzBdIGNoZWNrIGJlbG93LgorCSAqIChpcyB0aGlzIGV2ZXIgaGFwcGVucyB0aGF0IHdlIGFjdHVhbGx5IGdldCBzdHI9IiIgaGVyZT8pCisJICovCisJaWYgKCFzdHJjaHIoc3RyLCBTUEVDSUFMX1ZBUl9TWU1CT0wpICYmICFzdHJjaHIoc3RyLCAnXFwnKSkgeworCQkvL1RPRE86IENhbiB1c2Ugb24gc3RyaW5ncyB3aXRoIFwgdG9vLCBqdXN0IHVuYmFja3NsYXNoKCkgdGhlbT8KKwkJZGVidWdfcHJpbnRmX2V4cGFuZCgic3RyaW5nX3RvX3N0cmluZyhmYXN0KT0+JyVzJ1xuIiwgc3RyKTsKKwkJcmV0dXJuIHhzdHJkdXAoc3RyKTsKKwl9CisKKwlhcmd2WzBdID0gKGNoYXIqKXN0cjsKKwlhcmd2WzFdID0gTlVMTDsKKwlsaXN0ID0gZXhwYW5kX3ZhcmlhYmxlcyhhcmd2LCBkb191bmJhY2tzbGFzaAorCQkJPyBFWFBfRkxBR19FU0NfR0xPQl9DSEFSUyB8IEVYUF9GTEFHX1NJTkdMRVdPUkQKKwkJCTogRVhQX0ZMQUdfU0lOR0xFV09SRAorCSk7CisJaWYgKEhVU0hfREVCVUcpCisJCWlmICghbGlzdFswXSB8fCBsaXN0WzFdKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIkJVRyBpbiB2YXJleHAyIik7CisJLyogYWN0dWFsbHksIGp1c3QgbW92ZSBzdHJpbmcgMipzaXplb2YoY2hhciopIGJ5dGVzIGJhY2sgKi8KKwlvdmVybGFwcGluZ19zdHJjcHkoKGNoYXIqKWxpc3QsIGxpc3RbMF0pOworCWlmIChkb191bmJhY2tzbGFzaCkKKwkJdW5iYWNrc2xhc2goKGNoYXIqKWxpc3QpOworCWRlYnVnX3ByaW50Zl9leHBhbmQoInN0cmluZ190b19zdHJpbmc9PiclcydcbiIsIChjaGFyKilsaXN0KTsKKwlyZXR1cm4gKGNoYXIqKWxpc3Q7Cit9CisKKy8qIFVzZWQgZm9yICJldmFsIiBidWlsdGluICovCitzdGF0aWMgY2hhciogZXhwYW5kX3N0cnZlY190b19zdHJpbmcoY2hhciAqKmFyZ3YpCit7CisJY2hhciAqKmxpc3Q7CisKKwlsaXN0ID0gZXhwYW5kX3ZhcmlhYmxlcyhhcmd2LCBFWFBfRkxBR19TSU5HTEVXT1JEKTsKKwkvKiBDb252ZXJ0IGFsbCBOVUxzIHRvIHNwYWNlcyAqLworCWlmIChsaXN0WzBdKSB7CisJCWludCBuID0gMTsKKwkJd2hpbGUgKGxpc3Rbbl0pIHsKKwkJCWlmIChIVVNIX0RFQlVHKQorCQkJCWlmIChsaXN0W24tMV0gKyBzdHJsZW4obGlzdFtuLTFdKSArIDEgIT0gbGlzdFtuXSkKKwkJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIkJVRyBpbiB2YXJleHAzIik7CisJCQkvKiBiYXNoIHVzZXMgJyAnIHJlZ2FyZGxlc3Mgb2YgJElGUyBjb250ZW50cyAqLworCQkJbGlzdFtuXVstMV0gPSAnICc7CisJCQluKys7CisJCX0KKwl9CisJb3ZlcmxhcHBpbmdfc3RyY3B5KChjaGFyKilsaXN0LCBsaXN0WzBdKTsKKwlkZWJ1Z19wcmludGZfZXhwYW5kKCJzdHJ2ZWNfdG9fc3RyaW5nPSclcydcbiIsIChjaGFyKilsaXN0KTsKKwlyZXR1cm4gKGNoYXIqKWxpc3Q7Cit9CisKK3N0YXRpYyBjaGFyICoqZXhwYW5kX2Fzc2lnbm1lbnRzKGNoYXIgKiphcmd2LCBpbnQgY291bnQpCit7CisJaW50IGk7CisJY2hhciAqKnA7CisKKwlHLmV4cGFuZGVkX2Fzc2lnbm1lbnRzID0gcCA9IE5VTEw7CisJLyogRXhwYW5kIGFzc2lnbm1lbnRzIGludG8gb25lIHN0cmluZyBlYWNoICovCisJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJRy5leHBhbmRlZF9hc3NpZ25tZW50cyA9IHAgPSBhZGRfc3RyaW5nX3RvX3N0cmluZ3MocCwgZXhwYW5kX3N0cmluZ190b19zdHJpbmcoYXJndltpXSwgLyp1bmJhY2tzbGFzaDoqLyAxKSk7CisJfQorCUcuZXhwYW5kZWRfYXNzaWdubWVudHMgPSBOVUxMOworCXJldHVybiBwOworfQorCisKK3N0YXRpYyB2b2lkIHN3aXRjaF9vZmZfc3BlY2lhbF9zaWdzKHVuc2lnbmVkIG1hc2spCit7CisJdW5zaWduZWQgc2lnID0gMDsKKwl3aGlsZSAoKG1hc2sgPj49IDEpICE9IDApIHsKKwkJc2lnKys7CisJCWlmICghKG1hc2sgJiAxKSkKKwkJCWNvbnRpbnVlOworCQlpZiAoRy50cmFwcykgeworCQkJaWYgKEcudHJhcHNbc2lnXSAmJiAhRy50cmFwc1tzaWddWzBdKQorCQkJCS8qIHRyYXAgaXMgJycsIGhhcyB0byByZW1haW4gU0lHX0lHTiAqLworCQkJCWNvbnRpbnVlOworCQkJZnJlZShHLnRyYXBzW3NpZ10pOworCQkJRy50cmFwc1tzaWddID0gTlVMTDsKKwkJfQorCQkvKiBXZSBhcmUgaGVyZSBvbmx5IGlmIG5vIHRyYXAgb3IgdHJhcCB3YXMgbm90ICcnICovCisJCWluc3RhbGxfc2lnaGFuZGxlcihzaWcsIFNJR19ERkwpOworCX0KK30KKworI2lmIEJCX01NVQorLyogbmV2ZXIgY2FsbGVkICovCit2b2lkIHJlX2V4ZWN1dGVfc2hlbGwoY2hhciAqKip0b19mcmVlLCBjb25zdCBjaGFyICpzLAorCQljaGFyICpnX2FyZ3YwLCBjaGFyICoqZ19hcmd2LAorCQljaGFyICoqYnVpbHRpbl9hcmd2KSBOT1JFVFVSTjsKKworc3RhdGljIHZvaWQgcmVzZXRfdHJhcHNfdG9fZGVmYXVsdHModm9pZCkKK3sKKwkvKiBUaGlzIGZ1bmN0aW9uIGlzIGFsd2F5cyBjYWxsZWQgaW4gYSBjaGlsZCBzaGVsbAorCSAqIGFmdGVyIGZvcmsgKG5vdCB2Zm9yaywgTk9NTVUgZG9lc24ndCB1c2UgdGhpcyBmdW5jdGlvbikuCisJICovCisJdW5zaWduZWQgc2lnOworCXVuc2lnbmVkIG1hc2s7CisKKwkvKiBDaGlsZCBzaGVsbHMgYXJlIG5vdCBpbnRlcmFjdGl2ZS4KKwkgKiBTSUdUVElOL1NJR1RUT1UvU0lHVFNUUCBzaG91bGQgbm90IGhhdmUgc3BlY2lhbCBoYW5kbGluZy4KKwkgKiBUZXN0Y2FzZTogKHdoaWxlIDo7IGRvIDo7IGRvbmUpICsgXlogc2hvdWxkIGJhY2tncm91bmQuCisJICogU2FtZSBnb2VzIGZvciBTSUdURVJNLCBTSUdIVVAsIFNJR0lOVC4KKwkgKi8KKwltYXNrID0gKEcuc3BlY2lhbF9zaWdfbWFzayAmIFNQRUNJQUxfSU5URVJBQ1RJVkVfU0lHUykgfCBHX2ZhdGFsX3NpZ19tYXNrOworCWlmICghRy50cmFwcyAmJiAhbWFzaykKKwkJcmV0dXJuOyAvKiBhbHJlYWR5IG5vIHRyYXBzIGFuZCBubyBzcGVjaWFsIHNpZ3MgKi8KKworCS8qIFN3aXRjaCBvZmYgc3BlY2lhbCBzaWdzICovCisJc3dpdGNoX29mZl9zcGVjaWFsX3NpZ3MobWFzayk7CisjaWYgRU5BQkxFX0hVU0hfSk9CCisJR19mYXRhbF9zaWdfbWFzayA9IDA7CisjZW5kaWYKKwlHLnNwZWNpYWxfc2lnX21hc2sgJj0gflNQRUNJQUxfSU5URVJBQ1RJVkVfU0lHUzsKKwkvKiBTSUdRVUlULFNJR0NITEQgYW5kIG1heWJlIFNQRUNJQUxfSk9CU1RPUF9TSUdTCisJICogcmVtYWluIHNldCBpbiBHLnNwZWNpYWxfc2lnX21hc2sgKi8KKworCWlmICghRy50cmFwcykKKwkJcmV0dXJuOworCisJLyogUmVzZXQgYWxsIHNpZ3MgdG8gZGVmYXVsdCBleGNlcHQgb25lcyB3aXRoIGVtcHR5IHRyYXBzICovCisJZm9yIChzaWcgPSAwOyBzaWcgPCBOU0lHOyBzaWcrKykgeworCQlpZiAoIUcudHJhcHNbc2lnXSkKKwkJCWNvbnRpbnVlOyAvKiBubyB0cmFwOiBub3RoaW5nIHRvIGRvICovCisJCWlmICghRy50cmFwc1tzaWddWzBdKQorCQkJY29udGludWU7IC8qIGVtcHR5IHRyYXA6IGhhcyB0byByZW1haW4gU0lHX0lHTiAqLworCQkvKiBzaWcgaGFzIG5vbi1lbXB0eSB0cmFwLCByZXNldCBpdDogKi8KKwkJZnJlZShHLnRyYXBzW3NpZ10pOworCQlHLnRyYXBzW3NpZ10gPSBOVUxMOworCQkvKiBUaGVyZSBpcyBubyBzaWduYWwgZm9yIHRyYXAgMCAoRVhJVCkgKi8KKwkJaWYgKHNpZyA9PSAwKQorCQkJY29udGludWU7CisJCWluc3RhbGxfc2lnaGFuZGxlcihzaWcsIHBpY2tfc2lnaGFuZGxlcihzaWcpKTsKKwl9Cit9CisKKyNlbHNlIC8qICFCQl9NTVUgKi8KKworc3RhdGljIHZvaWQgcmVfZXhlY3V0ZV9zaGVsbChjaGFyICoqKnRvX2ZyZWUsIGNvbnN0IGNoYXIgKnMsCisJCWNoYXIgKmdfYXJndjAsIGNoYXIgKipnX2FyZ3YsCisJCWNoYXIgKipidWlsdGluX2FyZ3YpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgcmVfZXhlY3V0ZV9zaGVsbChjaGFyICoqKnRvX2ZyZWUsIGNvbnN0IGNoYXIgKnMsCisJCWNoYXIgKmdfYXJndjAsIGNoYXIgKipnX2FyZ3YsCisJCWNoYXIgKipidWlsdGluX2FyZ3YpCit7CisjIGRlZmluZSBOT01NVV9IQUNLX0ZNVCAoIi0kJXg6JXg6JXg6JXg6JXg6JWxseCIgSUZfSFVTSF9MT09QUygiOiV4IikpCisJLyogZGVsaW1zICsgMiAqIChudW1iZXIgb2YgYnl0ZXMgaW4gcHJpbnRlZCBoZXggbnVtYmVycykgKi8KKwljaGFyIHBhcmFtX2J1ZltzaXplb2YoTk9NTVVfSEFDS19GTVQpICsgMiAqIChzaXplb2YoaW50KSo2ICsgc2l6ZW9mKGxvbmcgbG9uZykqMSldOworCWNoYXIgKmhlcmVkb2NfYXJndls0XTsKKwlzdHJ1Y3QgdmFyaWFibGUgKmN1cjsKKyMgaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJc3RydWN0IGZ1bmN0aW9uICpmdW5jcDsKKyMgZW5kaWYKKwljaGFyICoqYXJndiwgKipwcDsKKwl1bnNpZ25lZCBjbnQ7CisJdW5zaWduZWQgbG9uZyBsb25nIGVtcHR5X3RyYXBfbWFzazsKKworCWlmICghZ19hcmd2MCkgeyAvKiBoZXJlZG9jICovCisJCWFyZ3YgPSBoZXJlZG9jX2FyZ3Y7CisJCWFyZ3ZbMF0gPSAoY2hhciAqKSBHLmFyZ3YwX2Zvcl9yZV9leGVjaW5nOworCQlhcmd2WzFdID0gKGNoYXIgKikgIi08IjsKKwkJYXJndlsyXSA9IChjaGFyICopIHM7CisJCWFyZ3ZbM10gPSBOVUxMOworCQlwcCA9ICZhcmd2WzNdOyAvKiB1c2VkIGFzIHBvaW50ZXIgdG8gZW1wdHkgZW52aXJvbm1lbnQgKi8KKwkJZ290byBkb19leGVjOworCX0KKworCWNudCA9IDA7CisJcHAgPSBidWlsdGluX2FyZ3Y7CisJaWYgKHBwKSB3aGlsZSAoKnBwKyspCisJCWNudCsrOworCisJZW1wdHlfdHJhcF9tYXNrID0gMDsKKwlpZiAoRy50cmFwcykgeworCQlpbnQgc2lnOworCQlmb3IgKHNpZyA9IDE7IHNpZyA8IE5TSUc7IHNpZysrKSB7CisJCQlpZiAoRy50cmFwc1tzaWddICYmICFHLnRyYXBzW3NpZ11bMF0pCisJCQkJZW1wdHlfdHJhcF9tYXNrIHw9IDFMTCA8PCBzaWc7CisJCX0KKwl9CisKKwlzcHJpbnRmKHBhcmFtX2J1ZiwgTk9NTVVfSEFDS19GTVQKKwkJCSwgKHVuc2lnbmVkKSBHLnJvb3RfcGlkCisJCQksICh1bnNpZ25lZCkgRy5yb290X3BwaWQKKwkJCSwgKHVuc2lnbmVkKSBHLmxhc3RfYmdfcGlkCisJCQksICh1bnNpZ25lZCkgRy5sYXN0X2V4aXRjb2RlCisJCQksIGNudAorCQkJLCBlbXB0eV90cmFwX21hc2sKKwkJCUlGX0hVU0hfTE9PUFMoLCBHLmRlcHRoX29mX2xvb3ApCisJCQkpOworIyB1bmRlZiBOT01NVV9IQUNLX0ZNVAorCS8qIDE6aHVzaCAyOi0kPHBpZD46PHBpZD46PGV4aXRjb2RlPjo8ZXRjLi4uPiA8dmFycy4uLj4gPGZ1bmNzLi4uPgorCSAqIDM6LWMgNDo8Y21kPiA1OjxhcmcwPiA8YXJnTi4uLj4gNjpOVUxMCisJICovCisJY250ICs9IDY7CisJZm9yIChjdXIgPSBHLnRvcF92YXI7IGN1cjsgY3VyID0gY3VyLT5uZXh0KSB7CisJCWlmICghY3VyLT5mbGdfZXhwb3J0IHx8IGN1ci0+ZmxnX3JlYWRfb25seSkKKwkJCWNudCArPSAyOworCX0KKyMgaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJZm9yIChmdW5jcCA9IEcudG9wX2Z1bmM7IGZ1bmNwOyBmdW5jcCA9IGZ1bmNwLT5uZXh0KQorCQljbnQgKz0gMzsKKyMgZW5kaWYKKwlwcCA9IGdfYXJndjsKKwl3aGlsZSAoKnBwKyspCisJCWNudCsrOworCSp0b19mcmVlID0gYXJndiA9IHBwID0geHphbGxvYyhzaXplb2YoYXJndlswXSkgKiBjbnQpOworCSpwcCsrID0gKGNoYXIgKikgRy5hcmd2MF9mb3JfcmVfZXhlY2luZzsKKwkqcHArKyA9IHBhcmFtX2J1ZjsKKwlmb3IgKGN1ciA9IEcudG9wX3ZhcjsgY3VyOyBjdXIgPSBjdXItPm5leHQpIHsKKwkJaWYgKHN0cmNtcChjdXItPnZhcnN0ciwgaHVzaF92ZXJzaW9uX3N0cikgPT0gMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoY3VyLT5mbGdfcmVhZF9vbmx5KSB7CisJCQkqcHArKyA9IChjaGFyICopICItUiI7CisJCQkqcHArKyA9IGN1ci0+dmFyc3RyOworCQl9IGVsc2UgaWYgKCFjdXItPmZsZ19leHBvcnQpIHsKKwkJCSpwcCsrID0gKGNoYXIgKikgIi1WIjsKKwkJCSpwcCsrID0gY3VyLT52YXJzdHI7CisJCX0KKwl9CisjIGlmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCWZvciAoZnVuY3AgPSBHLnRvcF9mdW5jOyBmdW5jcDsgZnVuY3AgPSBmdW5jcC0+bmV4dCkgeworCQkqcHArKyA9IChjaGFyICopICItRiI7CisJCSpwcCsrID0gZnVuY3AtPm5hbWU7CisJCSpwcCsrID0gZnVuY3AtPmJvZHlfYXNfc3RyaW5nOworCX0KKyMgZW5kaWYKKwkvKiBXZSBjYW4gcGFzcyBhY3RpdmF0ZWQgdHJhcHMgaGVyZS4gU2F5LCAtVG5uOnRyYXBfc3RyaW5nCisJICoKKwkgKiBIb3dldmVyLCBQT1NJWCBzYXlzIHRoYXQgc3Vic2hlbGxzIHJlc2V0IHNpZ25hbHMgd2l0aCB0cmFwcworCSAqIHRvIFNJR19ERkwuCisJICogSSB0ZXN0ZWQgYmFzaC0zLjIgYW5kIGl0IG5vdCBvbmx5IGRvZXMgdGhhdCB3aXRoIHRydWUgc3Vic2hlbGxzCisJICogb2YgdGhlIGZvcm0gKCBsaXN0ICksIGJ1dCB3aXRoIGFueSBmb3JrZWQgY2hpbGRyZW4gc2hlbGxzLgorCSAqIEkgc2V0IHRyYXAgImVjaG8gVyIgV0lOQ0g7IGFuZCB0aGVuIHRyaWVkOgorCSAqCisJICogeyBlY2hvIDE7IHNsZWVwIDIwOyBlY2hvIDI7IH0gJgorCSAqIHdoaWxlIHRydWU7IGRvIGVjaG8gMTsgc2xlZXAgMjA7IGVjaG8gMjsgYnJlYWs7IGRvbmUgJgorCSAqIHRydWUgfCB7IGVjaG8gMTsgc2xlZXAgMjA7IGVjaG8gMjsgfSB8IGNhdAorCSAqCisJICogSW4gYWxsIHRoZXNlIGNhc2VzIHNlbmRpbmcgU0lHV0lOQ0ggdG8gdGhlIGNoaWxkIHNoZWxsCisJICogZGlkIG5vdCBydW4gdGhlIHRyYXAuIElmIEkgYWRkIHRyYXAgImVjaG8gViIgV0lOQ0g7CisJICogX2luc2lkZV8gZ3JvdXAgKGp1c3QgYmVmb3JlIGVjaG8gMSksIGl0IHdvcmtzLgorCSAqCisJICogSSBjb25jbHVkZSBpdCBtZWFucyB3ZSBkb24ndCBuZWVkIHRvIHBhc3MgYWN0aXZlIHRyYXBzIGhlcmUuCisJICovCisJKnBwKysgPSAoY2hhciAqKSAiLWMiOworCSpwcCsrID0gKGNoYXIgKikgczsKKwlpZiAoYnVpbHRpbl9hcmd2KSB7CisJCXdoaWxlICgqKytidWlsdGluX2FyZ3YpCisJCQkqcHArKyA9ICpidWlsdGluX2FyZ3Y7CisJCSpwcCsrID0gKGNoYXIgKikgIiI7CisJfQorCSpwcCsrID0gZ19hcmd2MDsKKwl3aGlsZSAoKmdfYXJndikKKwkJKnBwKysgPSAqZ19hcmd2Kys7CisJLyogKnBwID0gTlVMTDsgLSBpcyBhbHJlYWR5IHRoZXJlICovCisJcHAgPSBlbnZpcm9uOworCisgZG9fZXhlYzoKKwlkZWJ1Z19wcmludGZfZXhlYygicmVfZXhlY3V0ZV9zaGVsbCBwaWQ6JWQgY21kOiclcydcbiIsIGdldHBpZCgpLCBzKTsKKwkvKiBEb24ndCBwcm9wYWdhdGUgU0lHX0lHTiB0byB0aGUgY2hpbGQgKi8KKwlpZiAoU1BFQ0lBTF9KT0JTVE9QX1NJR1MgIT0gMCkKKwkJc3dpdGNoX29mZl9zcGVjaWFsX3NpZ3MoRy5zcGVjaWFsX3NpZ19tYXNrICYgU1BFQ0lBTF9KT0JTVE9QX1NJR1MpOworCWV4ZWN2ZShiYl9idXN5Ym94X2V4ZWNfcGF0aCwgYXJndiwgcHApOworCS8qIEZhbGxiYWNrLiBVc2VmdWwgZm9yIGluaXQ9L2Jpbi9odXNoIHVzYWdlIGV0YyAqLworCWlmIChhcmd2WzBdWzBdID09ICcvJykKKwkJZXhlY3ZlKGFyZ3ZbMF0sIGFyZ3YsIHBwKTsKKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSAxMjc7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IHJlLWV4ZWN1dGUgdGhlIHNoZWxsIik7Cit9CisjZW5kaWYgIC8qICFCQl9NTVUgKi8KKworCitzdGF0aWMgaW50IHJ1bl9hbmRfZnJlZV9saXN0KHN0cnVjdCBwaXBlICpwaSk7CisKKy8qIEV4ZWN1dGluZyBmcm9tIHN0cmluZzogZXZhbCwgc2ggLWMgJy4uLicKKyAqICAgICAgICAgIG9yIGZyb20gZmlsZTogL2V0Yy9wcm9maWxlLCAuIGZpbGUsIHNoIDxzY3JpcHQ+LCBzaCAoaW50ZXJlYWN0aXZlKQorICogZW5kX3RyaWdnZXIgY29udHJvbHMgaG93IG9mdGVuIHdlIHN0b3AgcGFyc2luZworICogTlVMOiBwYXJzZSBhbGwsIGV4ZWN1dGUsIHJldHVybgorICogJzsnOiBwYXJzZSB0aWxsICc7JyBvciBuZXdsaW5lLCBleGVjdXRlLCByZXBlYXQgdGlsbCBFT0YKKyAqLworc3RhdGljIHZvaWQgcGFyc2VfYW5kX3J1bl9zdHJlYW0oc3RydWN0IGluX3N0ciAqaW5wLCBpbnQgZW5kX3RyaWdnZXIpCit7CisJLyogV2h5IHdlIG5lZWQgZW1wdHkgZmxhZz8KKwkgKiBBbiBvYnNjdXJlIGNvcm5lciBjYXNlICJmYWxzZTsgYGA7IGVjaG8gJD8iOgorCSAqIGVtcHR5IGNvbW1hbmQgaW4gYGAgc2hvdWxkIHN0aWxsIHNldCAkPyB0byAwLgorCSAqIEJ1dCB3ZSBjYW4ndCBqdXN0IHNldCAkPyB0byAwIGF0IHRoZSBzdGFydCwKKwkgKiB0aGlzIGJyZWFrcyAiZmFsc2U7IGVjaG8gYGVjaG8gJD9gIiBjYXNlLgorCSAqLworCWJvb2wgZW1wdHkgPSAxOworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBwaXBlICpwaXBlX2xpc3Q7CisKKyNpZiBFTkFCTEVfSFVTSF9JTlRFUkFDVElWRQorCQlpZiAoZW5kX3RyaWdnZXIgPT0gJzsnKQorCQkJaW5wLT5wcm9tcHRtb2RlID0gMDsgLyogUFMxICovCisjZW5kaWYKKwkJcGlwZV9saXN0ID0gcGFyc2Vfc3RyZWFtKE5VTEwsIGlucCwgZW5kX3RyaWdnZXIpOworCQlpZiAoIXBpcGVfbGlzdCB8fCBwaXBlX2xpc3QgPT0gRVJSX1BUUikgeyAvKiBFT0YvZXJyb3IgKi8KKwkJCS8qIElmIHdlIGFyZSBpbiAiYmlnIiBzY3JpcHQKKwkJCSAqIChub3QgaW4gYGNtZGAgb3Igc29tZXRoaW5nIHNpbWlsYXIpLi4uCisJCQkgKi8KKwkJCWlmIChwaXBlX2xpc3QgPT0gRVJSX1BUUiAmJiBlbmRfdHJpZ2dlciA9PSAnOycpIHsKKwkJCQkvKiBEaXNjYXJkIGNhY2hlZCBpbnB1dCAocmVzdCBvZiBsaW5lKSAqLworCQkJCWludCBjaCA9IGlucC0+bGFzdF9jaGFyOworCQkJCXdoaWxlIChjaCAhPSBFT0YgJiYgY2ggIT0gJ1xuJykgeworCQkJCQkvL2JiX2Vycm9yX21zZygiRGlzY2FyZGVkOiclYyciLCBjaCk7CisJCQkJCWNoID0gaV9nZXRjaChpbnApOworCQkJCX0KKwkJCQkvKiBGb3JjZSBwcm9tcHQgKi8KKwkJCQlpbnAtPnAgPSBOVUxMOworCQkJCS8qIFRoaXMgc3RyZWFtIGlzbid0IGVtcHR5ICovCisJCQkJZW1wdHkgPSAwOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKCFwaXBlX2xpc3QgJiYgZW1wdHkpCisJCQkJRy5sYXN0X2V4aXRjb2RlID0gMDsKKwkJCWJyZWFrOworCQl9CisJCWRlYnVnX3ByaW50X3RyZWUocGlwZV9saXN0LCAwKTsKKwkJZGVidWdfcHJpbnRmX2V4ZWMoInBhcnNlX2FuZF9ydW5fc3RyZWFtOiBydW5fYW5kX2ZyZWVfbGlzdFxuIik7CisJCXJ1bl9hbmRfZnJlZV9saXN0KHBpcGVfbGlzdCk7CisJCWVtcHR5ID0gMDsKKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwkJaWYgKEcuZmxhZ19yZXR1cm5faW5fcHJvZ3Jlc3MgPT0gMSkKKwkJCWJyZWFrOworI2VuZGlmCisJfQorfQorCitzdGF0aWMgdm9pZCBwYXJzZV9hbmRfcnVuX3N0cmluZyhjb25zdCBjaGFyICpzKQoreworCXN0cnVjdCBpbl9zdHIgaW5wdXQ7CisJc2V0dXBfc3RyaW5nX2luX3N0cigmaW5wdXQsIHMpOworCXBhcnNlX2FuZF9ydW5fc3RyZWFtKCZpbnB1dCwgJ1wwJyk7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX2FuZF9ydW5fZmlsZShGSUxFICpmKQoreworCXN0cnVjdCBpbl9zdHIgaW5wdXQ7CisJc2V0dXBfZmlsZV9pbl9zdHIoJmlucHV0LCBmKTsKKwlwYXJzZV9hbmRfcnVuX3N0cmVhbSgmaW5wdXQsICc7Jyk7Cit9CisKKyNpZiBFTkFCTEVfSFVTSF9USUNLCitzdGF0aWMgRklMRSAqZ2VuZXJhdGVfc3RyZWFtX2Zyb21fc3RyaW5nKGNvbnN0IGNoYXIgKnMsIHBpZF90ICpwaWRfcCkKK3sKKwlwaWRfdCBwaWQ7CisJaW50IGNoYW5uZWxbMl07CisjIGlmICFCQl9NTVUKKwljaGFyICoqdG9fZnJlZSA9IE5VTEw7CisjIGVuZGlmCisKKwl4cGlwZShjaGFubmVsKTsKKwlwaWQgPSBCQl9NTVUgPyB4Zm9yaygpIDogeHZmb3JrKCk7CisJaWYgKHBpZCA9PSAwKSB7IC8qIGNoaWxkICovCisJCWRpc2FibGVfcmVzdG9yZV90dHlfcGdycF9vbl9leGl0KCk7CisJCS8qIFByb2Nlc3Mgc3Vic3RpdHV0aW9uIGlzIG5vdCBjb25zaWRlcmVkIHRvIGJlIHVzdWFsCisJCSAqICdjb21tYW5kIGV4ZWN1dGlvbicuCisJCSAqIFNVU3YzIHNheXMgY3RybC1aIHNob3VsZCBiZSBpZ25vcmVkLCBjdHJsLUMgc2hvdWxkIG5vdC4KKwkJICovCisJCWJiX3NpZ25hbHMoMAorCQkJKyAoMSA8PCBTSUdUU1RQKQorCQkJKyAoMSA8PCBTSUdUVElOKQorCQkJKyAoMSA8PCBTSUdUVE9VKQorCQkJLCBTSUdfSUdOKTsKKwkJQ0xFQVJfUkFORE9NX1QoJkcucmFuZG9tX2dlbik7IC8qIG9yIGVsc2UgJFJBTkRPTSByZXBlYXRzIGluIGNoaWxkICovCisJCWNsb3NlKGNoYW5uZWxbMF0pOyAvKiBOQjogY2xvc2UgX2ZpcnN0XywgdGhlbiBtb3ZlIGZkISAqLworCQl4bW92ZV9mZChjaGFubmVsWzFdLCAxKTsKKwkJLyogUHJldmVudCBpdCBmcm9tIHRyeWluZyB0byBoYW5kbGUgY3RybC16IGV0YyAqLworCQlJRl9IVVNIX0pPQihHLnJ1bl9saXN0X2xldmVsID0gMTspCisJCS8qIEF3ZnVsIGhhY2sgZm9yIGB0cmFwYCBvciAkKHRyYXApLgorCQkgKgorCQkgKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy8wMDk2OTUzOTkvdXRpbGl0aWVzL3RyYXAuaHRtbAorCQkgKiBjb250YWlucyBhbiBleGFtcGxlIHdoZXJlICJ0cmFwIiBpcyBleGVjdXRlZCBpbiBhIHN1YnNoZWxsOgorCQkgKgorCQkgKiBzYXZlX3RyYXBzPSQodHJhcCkKKwkJICogLi4uCisJCSAqIGV2YWwgIiRzYXZlX3RyYXBzIgorCQkgKgorCQkgKiBTdGFuZGFyZCBkb2VzIG5vdCBzYXkgdGhhdCAidHJhcCIgaW4gc3Vic2hlbGwgc2hhbGwgcHJpbnQKKwkJICogcGFyZW50IHNoZWxsJ3MgdHJhcHMuIEl0IG9ubHkgc2F5cyB0aGF0IGl0cyBvdXRwdXQKKwkJICogbXVzdCBoYXZlIHN1aXRhYmxlIGZvcm0sIGJ1dCB0aGVuLCBpbiB0aGUgYWJvdmUgZXhhbXBsZQorCQkgKiAod2hpY2ggaXMgbm90IHN1cHBvc2VkIHRvIGJlIG5vcm1hdGl2ZSksIGl0IGltcGxpZXMgdGhhdC4KKwkJICoKKwkJICogYmFzaCAoYW5kIHByb2JhYmx5IG90aGVyIHNoZWxsKSBkb2VzIGltcGxlbWVudCBpdAorCQkgKiAodHJhcHMgYXJlIHJlc2V0IHRvIGRlZmF1bHRzLCBidXQgInRyYXAiIHN0aWxsIHNob3dzIHRoZW0pLAorCQkgKiBidXQgYXMgYSByZXN1bHQsICJ0cmFwIiBsb2dpYyBpcyBob3BlbGVzc2x5IG1lc3NlZCB1cDoKKwkJICoKKwkJICogIyB0cmFwCisJCSAqIHRyYXAgLS0gJ2VjaG8gSG8nIFNJR1dJTkNIICA8LS0tIHdlIGhhdmUgYSBoYW5kbGVyCisJCSAqICMgKHRyYXApICAgICAgICA8LS0tIHRyYXAgaXMgaW4gc3Vic2hlbGwgLSBubyBvdXRwdXQgKGNvcnJlY3QsIHRyYXBzIGFyZSByZXNldCkKKwkJICogIyB0cnVlIHwgdHJhcCAgIDwtLS0gdHJhcCBpcyBpbiBzdWJzaGVsbCAtIG5vIG91dHB1dCAoZGl0dG8pCisJCSAqICMgZWNobyBgdHJ1ZSB8IHRyYXBgICAgIDwtLS0gaW4gc3Vic2hlbGwgLSBvdXRwdXQgKGJ1dCB0cmFwcyBhcmUgcmVzZXQhKQorCQkgKiB0cmFwIC0tICdlY2hvIEhvJyBTSUdXSU5DSAorCQkgKiAjIGVjaG8gYCh0cmFwKWAgICAgICAgICA8LS0tIGluIHN1YnNoZWxsIGluIHN1YnNoZWxsIC0gb3V0cHV0CisJCSAqIHRyYXAgLS0gJ2VjaG8gSG8nIFNJR1dJTkNICisJCSAqICMgZWNobyBgdHJ1ZSB8ICh0cmFwKWAgIDwtLS0gaW4gc3Vic2hlbGwgaW4gc3Vic2hlbGwgaW4gc3Vic2hlbGwgLSBvdXRwdXQhCisJCSAqIHRyYXAgLS0gJ2VjaG8gSG8nIFNJR1dJTkNICisJCSAqCisJCSAqIFRoZSBydWxlcyB3aGVuIHRvIGZvcmdldCBhbmQgd2hlbiB0byBub3QgZm9yZ2V0IHRyYXBzCisJCSAqIGdldCByZWFsbHkgY29tcGxleCBhbmQgbm9uc2Vuc2ljYWwuCisJCSAqCisJCSAqIE91ciBzb2x1dGlvbjogT05MWSBiYXJlICQodHJhcCkgb3IgYHRyYXBgIGlzIHNwZWNpYWwuCisJCSAqLworCQlzID0gc2tpcF93aGl0ZXNwYWNlKHMpOworCQlpZiAoaXNfcHJlZml4ZWRfd2l0aChzLCAidHJhcCIpCisJCSAmJiBza2lwX3doaXRlc3BhY2UocyArIDQpWzBdID09ICdcMCcKKwkJKSB7CisJCQlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgYXJndltdID0geyBOVUxMLCBOVUxMIH07CisJCQlidWlsdGluX3RyYXAoKGNoYXIqKilhcmd2KTsKKwkJCWV4aXQoMCk7IC8qIG5vdCBfZXhpdCgpIC0gd2UgbmVlZCB0byBmZmx1c2ggKi8KKwkJfQorIyBpZiBCQl9NTVUKKwkJcmVzZXRfdHJhcHNfdG9fZGVmYXVsdHMoKTsKKwkJcGFyc2VfYW5kX3J1bl9zdHJpbmcocyk7CisJCV9leGl0KEcubGFzdF9leGl0Y29kZSk7CisjIGVsc2UKKwkvKiBXZSByZS1leGVjdXRlIGFmdGVyIHZmb3JrIG9uIE5PTU1VLiBUaGlzIG1ha2VzIHRoaXMgc2NyaXB0IHNhZmU6CisJICogeWVzICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIiB8IGRkIGJzPTMyIGNvdW50PTY0ayA+QklHCisJICogaHVnZT1gY2F0IEJJR2AgIyB3YXMgYmxvY2tpbmcgaGVyZSBmb3JldmVyCisJICogZWNobyBPSworCSAqLworCQlyZV9leGVjdXRlX3NoZWxsKCZ0b19mcmVlLAorCQkJCXMsCisJCQkJRy5nbG9iYWxfYXJndlswXSwKKwkJCQlHLmdsb2JhbF9hcmd2ICsgMSwKKwkJCQlOVUxMKTsKKyMgZW5kaWYKKwl9CisKKwkvKiBwYXJlbnQgKi8KKwkqcGlkX3AgPSBwaWQ7CisjIGlmIEVOQUJMRV9IVVNIX0ZBU1QKKwlHLmNvdW50X1NJR0NITEQrKzsKKy8vYmJfZXJyb3JfbXNnKCJbJWRdIGZvcmsgaW4gZ2VuZXJhdGVfc3RyZWFtX2Zyb21fc3RyaW5nOiIKKy8vCQkiIEcuY291bnRfU0lHQ0hMRDolZCBHLmhhbmRsZWRfU0lHQ0hMRDolZCIsCisvLwkJZ2V0cGlkKCksIEcuY291bnRfU0lHQ0hMRCwgRy5oYW5kbGVkX1NJR0NITEQpOworIyBlbmRpZgorCWVuYWJsZV9yZXN0b3JlX3R0eV9wZ3JwX29uX2V4aXQoKTsKKyMgaWYgIUJCX01NVQorCWZyZWUodG9fZnJlZSk7CisjIGVuZGlmCisJY2xvc2UoY2hhbm5lbFsxXSk7CisJY2xvc2Vfb25fZXhlY19vbihjaGFubmVsWzBdKTsKKwlyZXR1cm4geGZkb3Blbl9mb3JfcmVhZChjaGFubmVsWzBdKTsKK30KKworLyogUmV0dXJuIGNvZGUgaXMgZXhpdCBzdGF0dXMgb2YgdGhlIHByb2Nlc3MgdGhhdCBpcyBydW4uICovCitzdGF0aWMgaW50IHByb2Nlc3NfY29tbWFuZF9zdWJzKG9fc3RyaW5nICpkZXN0LCBjb25zdCBjaGFyICpzKQoreworCUZJTEUgKmZwOworCXN0cnVjdCBpbl9zdHIgcGlwZV9zdHI7CisJcGlkX3QgcGlkOworCWludCBzdGF0dXMsIGNoLCBlb2xfY250OworCisJZnAgPSBnZW5lcmF0ZV9zdHJlYW1fZnJvbV9zdHJpbmcocywgJnBpZCk7CisKKwkvKiBOb3cgc2VuZCByZXN1bHRzIG9mIGNvbW1hbmQgYmFjayBpbnRvIG9yaWdpbmFsIGNvbnRleHQgKi8KKwlzZXR1cF9maWxlX2luX3N0cigmcGlwZV9zdHIsIGZwKTsKKwllb2xfY250ID0gMDsKKwl3aGlsZSAoKGNoID0gaV9nZXRjaCgmcGlwZV9zdHIpKSAhPSBFT0YpIHsKKwkJaWYgKGNoID09ICdcbicpIHsKKwkJCWVvbF9jbnQrKzsKKwkJCWNvbnRpbnVlOworCQl9CisJCXdoaWxlIChlb2xfY250KSB7CisJCQlvX2FkZGNocihkZXN0LCAnXG4nKTsKKwkJCWVvbF9jbnQtLTsKKwkJfQorCQlvX2FkZFFjaHIoZGVzdCwgY2gpOworCX0KKworCWRlYnVnX3ByaW50ZigiZG9uZSByZWFkaW5nIGZyb20gYGNtZGAgcGlwZSwgY2xvc2luZyBpdFxuIik7CisJZmNsb3NlKGZwKTsKKwkvKiBXZSBuZWVkIHRvIGV4dHJhY3QgZXhpdGNvZGUuIFRlc3QgY2FzZQorCSAqICJ0cnVlOyBlY2hvIGBzbGVlcCAxOyBmYWxzZWAgJD8iCisJICogc2hvdWxkIHByaW50IDEgKi8KKwlzYWZlX3dhaXRwaWQocGlkLCAmc3RhdHVzLCAwKTsKKwlkZWJ1Z19wcmludGYoImNoaWxkIGV4aXRlZC4gcmV0dXJuaW5nIGl0cyBleGl0Y29kZTolZFxuIiwgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CisJcmV0dXJuIFdFWElUU1RBVFVTKHN0YXR1cyk7Cit9CisjZW5kaWYgLyogRU5BQkxFX0hVU0hfVElDSyAqLworCisKK3N0YXRpYyB2b2lkIHNldHVwX2hlcmVkb2Moc3RydWN0IHJlZGlyX3N0cnVjdCAqcmVkaXIpCit7CisJc3RydWN0IGZkX3BhaXIgcGFpcjsKKwlwaWRfdCBwaWQ7CisJaW50IGxlbiwgd3JpdHRlbjsKKwkvKiB0aGUgX2JvZHlfIG9mIGhlcmVkb2MgKG1pc2xlYWRpbmcgZmllbGQgbmFtZSkgKi8KKwljb25zdCBjaGFyICpoZXJlZG9jID0gcmVkaXItPnJkX2ZpbGVuYW1lOworCWNoYXIgKmV4cGFuZGVkOworI2lmICFCQl9NTVUKKwljaGFyICoqdG9fZnJlZTsKKyNlbmRpZgorCisJZXhwYW5kZWQgPSBOVUxMOworCWlmICghKHJlZGlyLT5yZF9kdXAgJiBIRVJFRE9DX1FVT1RFRCkpIHsKKwkJZXhwYW5kZWQgPSBlbmNvZGVfdGhlbl9leHBhbmRfc3RyaW5nKGhlcmVkb2MsIC8qcHJvY2Vzc19ia3NsYXNoOiovIDEsIC8qdW5iYWNrc2xhc2g6Ki8gMSk7CisJCWlmIChleHBhbmRlZCkKKwkJCWhlcmVkb2MgPSBleHBhbmRlZDsKKwl9CisJbGVuID0gc3RybGVuKGhlcmVkb2MpOworCisJY2xvc2UocmVkaXItPnJkX2ZkKTsgLyogb2Z0ZW4gc2F2ZXMgZHVwMitjbG9zZSBpbiB4bW92ZV9mZCAqLworCXhwaXBlZF9wYWlyKHBhaXIpOworCXhtb3ZlX2ZkKHBhaXIucmQsIHJlZGlyLT5yZF9mZCk7CisKKwkvKiBUcnkgd3JpdGluZyB3aXRob3V0IGZvcmtpbmcuIE5ld2VyIGtlcm5lbHMgaGF2ZQorCSAqIGR5bmFtaWNhbGx5IGdyb3dpbmcgcGlwZXMuIE11c3QgdXNlIG5vbi1ibG9ja2luZyB3cml0ZSEgKi8KKwluZGVsYXlfb24ocGFpci53cik7CisJd2hpbGUgKDEpIHsKKwkJd3JpdHRlbiA9IHdyaXRlKHBhaXIud3IsIGhlcmVkb2MsIGxlbik7CisJCWlmICh3cml0dGVuIDw9IDApCisJCQlicmVhazsKKwkJbGVuIC09IHdyaXR0ZW47CisJCWlmIChsZW4gPT0gMCkgeworCQkJY2xvc2UocGFpci53cik7CisJCQlmcmVlKGV4cGFuZGVkKTsKKwkJCXJldHVybjsKKwkJfQorCQloZXJlZG9jICs9IHdyaXR0ZW47CisJfQorCW5kZWxheV9vZmYocGFpci53cik7CisKKwkvKiBPa2F5LCBwaXBlIGJ1ZmZlciB3YXMgbm90IGJpZyBlbm91Z2ggKi8KKwkvKiBOb3RlOiB3ZSBtdXN0IG5vdCBjcmVhdGUgYSBzdHJheSBjaGlsZCAoYmFzdGFyZD8gOikKKwkgKiBmb3IgdGhlIHVuc3VzcGVjdGluZyBwYXJlbnQgcHJvY2Vzcy4gQ2hpbGQgY3JlYXRlcyBhIGdyYW5kY2hpbGQKKwkgKiBhbmQgZXhpdHMgYmVmb3JlIHBhcmVudCBleGVjcyB0aGUgcHJvY2VzcyB3aGljaCBjb25zdW1lcyBoZXJlZG9jCisJICogKHRoYXQgZXhlYyBoYXBwZW5zIGFmdGVyIHdlIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24pICovCisjaWYgIUJCX01NVQorCXRvX2ZyZWUgPSBOVUxMOworI2VuZGlmCisJcGlkID0geHZmb3JrKCk7CisJaWYgKHBpZCA9PSAwKSB7CisJCS8qIGNoaWxkICovCisJCWRpc2FibGVfcmVzdG9yZV90dHlfcGdycF9vbl9leGl0KCk7CisJCXBpZCA9IEJCX01NVSA/IHhmb3JrKCkgOiB4dmZvcmsoKTsKKwkJaWYgKHBpZCAhPSAwKQorCQkJX2V4aXQoMCk7CisJCS8qIGdyYW5kY2hpbGQgKi8KKwkJY2xvc2UocmVkaXItPnJkX2ZkKTsgLyogcmVhZCBzaWRlIG9mIHRoZSBwaXBlICovCisjaWYgQkJfTU1VCisJCWZ1bGxfd3JpdGUocGFpci53ciwgaGVyZWRvYywgbGVuKTsgLyogbWF5IGxvb3Agb3IgYmxvY2sgKi8KKwkJX2V4aXQoMCk7CisjZWxzZQorCQkvKiBEZWxlZ2F0ZSBibG9ja2luZyB3cml0ZXMgdG8gYW5vdGhlciBwcm9jZXNzICovCisJCXhtb3ZlX2ZkKHBhaXIud3IsIFNURE9VVF9GSUxFTk8pOworCQlyZV9leGVjdXRlX3NoZWxsKCZ0b19mcmVlLCBoZXJlZG9jLCBOVUxMLCBOVUxMLCBOVUxMKTsKKyNlbmRpZgorCX0KKwkvKiBwYXJlbnQgKi8KKyNpZiBFTkFCTEVfSFVTSF9GQVNUCisJRy5jb3VudF9TSUdDSExEKys7CisvL2JiX2Vycm9yX21zZygiWyVkXSBmb3JrIGluIHNldHVwX2hlcmVkb2M6IEcuY291bnRfU0lHQ0hMRDolZCBHLmhhbmRsZWRfU0lHQ0hMRDolZCIsIGdldHBpZCgpLCBHLmNvdW50X1NJR0NITEQsIEcuaGFuZGxlZF9TSUdDSExEKTsKKyNlbmRpZgorCWVuYWJsZV9yZXN0b3JlX3R0eV9wZ3JwX29uX2V4aXQoKTsKKyNpZiAhQkJfTU1VCisJZnJlZSh0b19mcmVlKTsKKyNlbmRpZgorCWNsb3NlKHBhaXIud3IpOworCWZyZWUoZXhwYW5kZWQpOworCXdhaXQoTlVMTCk7IC8qIHdhaXQgdGlsbCBjaGlsZCBoYXMgZGllZCAqLworfQorCisvKiBzcXVpcnJlbCAhPSBOVUxMIG1lYW5zIHdlIHNxdWlycmVsIGF3YXkgY29waWVzIG9mIHN0ZGluLCBzdGRvdXQsCisgKiBhbmQgc3RkZXJyIGlmIHRoZXkgYXJlIHJlZGlyZWN0ZWQuICovCitzdGF0aWMgaW50IHNldHVwX3JlZGlyZWN0cyhzdHJ1Y3QgY29tbWFuZCAqcHJvZywgaW50IHNxdWlycmVsW10pCit7CisJaW50IG9wZW5mZCwgbW9kZTsKKwlzdHJ1Y3QgcmVkaXJfc3RydWN0ICpyZWRpcjsKKworCWZvciAocmVkaXIgPSBwcm9nLT5yZWRpcmVjdHM7IHJlZGlyOyByZWRpciA9IHJlZGlyLT5uZXh0KSB7CisJCWlmIChyZWRpci0+cmRfdHlwZSA9PSBSRURJUkVDVF9IRVJFRE9DMikgeworCQkJLyogcmRfZmQ8PEhFUkUgY2FzZSAqLworCQkJaWYgKHNxdWlycmVsICYmIHJlZGlyLT5yZF9mZCA8IDMKKwkJCSAmJiBzcXVpcnJlbFtyZWRpci0+cmRfZmRdIDwgMAorCQkJKSB7CisJCQkJc3F1aXJyZWxbcmVkaXItPnJkX2ZkXSA9IGR1cChyZWRpci0+cmRfZmQpOworCQkJfQorCQkJLyogZm9yIFJFRElSRUNUX0hFUkVET0MyLCByZF9maWxlbmFtZSBob2xkcyBfY29udGVudHNfCisJCQkgKiBvZiB0aGUgaGVyZWRvYyAqLworCQkJZGVidWdfcHJpbnRmX3BhcnNlKCJzZXQgaGVyZWRvYyAnJXMnXG4iLAorCQkJCQlyZWRpci0+cmRfZmlsZW5hbWUpOworCQkJc2V0dXBfaGVyZWRvYyhyZWRpcik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChyZWRpci0+cmRfZHVwID09IFJFRElSRkRfVE9fRklMRSkgeworCQkJLyogcmRfZmQ8Kj5maWxlIGNhc2UgKDwqPiBpcyA8LD4sPj4sPD4pICovCisJCQljaGFyICpwOworCQkJaWYgKHJlZGlyLT5yZF9maWxlbmFtZSA9PSBOVUxMKSB7CisJCQkJLyogU29tZXRoaW5nIHdlbnQgd3JvbmcgaW4gdGhlIHBhcnNlLgorCQkJCSAqIFByZXRlbmQgaXQgZGlkbid0IGhhcHBlbiAqLworCQkJCWJiX2Vycm9yX21zZygiYnVnIGluIHJlZGlyZWN0IHBhcnNlIik7CisJCQkJY29udGludWU7CisJCQl9CisJCQltb2RlID0gcmVkaXJfdGFibGVbcmVkaXItPnJkX3R5cGVdLm1vZGU7CisJCQlwID0gZXhwYW5kX3N0cmluZ190b19zdHJpbmcocmVkaXItPnJkX2ZpbGVuYW1lLCAvKnVuYmFja3NsYXNoOiovIDEpOworCQkJb3BlbmZkID0gb3Blbl9vcl93YXJuKHAsIG1vZGUpOworCQkJZnJlZShwKTsKKwkJCWlmIChvcGVuZmQgPCAwKSB7CisJCQkvKiB0aGlzIGNvdWxkIGdldCBsb3N0IGlmIHN0ZGVyciBoYXMgYmVlbiByZWRpcmVjdGVkLCBidXQKKwkJCSAqIGJhc2ggYW5kIGFzaCBib3RoIGxvc2UgaXQgYXMgd2VsbCAodGhvdWdoIHpzaCBkb2Vzbid0ISkgKi8KKy8vd2hhdCB0aGUgYWJvdmUgY29tbWVudCB0cmllcyB0byBzYXk/CisJCQkJcmV0dXJuIDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiByZF9mZDwqPnJkX2R1cCBvciByZF9mZDwqPi0gY2FzZXMgKi8KKwkJCW9wZW5mZCA9IHJlZGlyLT5yZF9kdXA7CisJCX0KKworCQlpZiAob3BlbmZkICE9IHJlZGlyLT5yZF9mZCkgeworCQkJaWYgKHNxdWlycmVsICYmIHJlZGlyLT5yZF9mZCA8IDMKKwkJCSAmJiBzcXVpcnJlbFtyZWRpci0+cmRfZmRdIDwgMAorCQkJKSB7CisJCQkJc3F1aXJyZWxbcmVkaXItPnJkX2ZkXSA9IGR1cChyZWRpci0+cmRfZmQpOworCQkJfQorCQkJaWYgKG9wZW5mZCA9PSBSRURJUkZEX0NMT1NFKSB7CisJCQkJLyogIm4+LSIgbWVhbnMgImNsb3NlIG1lIiAqLworCQkJCWNsb3NlKHJlZGlyLT5yZF9mZCk7CisJCQl9IGVsc2UgeworCQkJCXhkdXAyKG9wZW5mZCwgcmVkaXItPnJkX2ZkKTsKKwkJCQlpZiAocmVkaXItPnJkX2R1cCA9PSBSRURJUkZEX1RPX0ZJTEUpCisJCQkJCWNsb3NlKG9wZW5mZCk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHJlc3RvcmVfcmVkaXJlY3RzKGludCBzcXVpcnJlbFtdKQoreworCWludCBpLCBmZDsKKwlmb3IgKGkgPSAwOyBpIDwgMzsgaSsrKSB7CisJCWZkID0gc3F1aXJyZWxbaV07CisJCWlmIChmZCAhPSAtMSkgeworCQkJLyogV2Ugc2ltcGx5IGRpZSBvbiBlcnJvciAqLworCQkJeG1vdmVfZmQoZmQsIGkpOworCQl9CisJfQorfQorCitzdGF0aWMgY2hhciAqZmluZF9pbl9wYXRoKGNvbnN0IGNoYXIgKmFyZykKK3sKKwljaGFyICpyZXQgPSBOVUxMOworCWNvbnN0IGNoYXIgKlBBVEggPSBnZXRfbG9jYWxfdmFyX3ZhbHVlKCJQQVRIIik7CisKKwlpZiAoIVBBVEgpCisJCXJldHVybiBOVUxMOworCisJd2hpbGUgKDEpIHsKKwkJY29uc3QgY2hhciAqZW5kID0gc3RyY2hybnVsKFBBVEgsICc6Jyk7CisJCWludCBzeiA9IGVuZCAtIFBBVEg7IC8qIG11c3QgYmUgaW50ISAqLworCisJCWZyZWUocmV0KTsKKwkJaWYgKHN6ICE9IDApIHsKKwkJCXJldCA9IHhhc3ByaW50ZigiJS4qcy8lcyIsIHN6LCBQQVRILCBhcmcpOworCQl9IGVsc2UgeworCQkJLyogV2UgaGF2ZSB4eHg6Onl5eXkgaW4gJFBBVEgsCisJCQkgKiBpdCBtZWFucyAidXNlIGN1cnJlbnQgZGlyIiAqLworCQkJcmV0ID0geHN0cmR1cChhcmcpOworCQl9CisJCWlmIChhY2Nlc3MocmV0LCBGX09LKSA9PSAwKQorCQkJYnJlYWs7CisKKwkJaWYgKCplbmQgPT0gJ1wwJykgeworCQkJZnJlZShyZXQpOworCQkJcmV0dXJuIE5VTEw7CisJCX0KKwkJUEFUSCA9IGVuZCArIDE7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBidWlsdF9pbl9jb21tYW5kICpmaW5kX2J1aWx0aW5faGVscGVyKGNvbnN0IGNoYXIgKm5hbWUsCisJCWNvbnN0IHN0cnVjdCBidWlsdF9pbl9jb21tYW5kICp4LAorCQljb25zdCBzdHJ1Y3QgYnVpbHRfaW5fY29tbWFuZCAqZW5kKQoreworCXdoaWxlICh4ICE9IGVuZCkgeworCQlpZiAoc3RyY21wKG5hbWUsIHgtPmJfY21kKSAhPSAwKSB7CisJCQl4Kys7CisJCQljb250aW51ZTsKKwkJfQorCQlkZWJ1Z19wcmludGZfZXhlYygiZm91bmQgYnVpbHRpbiAnJXMnXG4iLCBuYW1lKTsKKwkJcmV0dXJuIHg7CisJfQorCXJldHVybiBOVUxMOworfQorc3RhdGljIGNvbnN0IHN0cnVjdCBidWlsdF9pbl9jb21tYW5kICpmaW5kX2J1aWx0aW4xKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIGZpbmRfYnVpbHRpbl9oZWxwZXIobmFtZSwgYmx0aW5zMSwgJmJsdGluczFbQVJSQVlfU0laRShibHRpbnMxKV0pOworfQorc3RhdGljIGNvbnN0IHN0cnVjdCBidWlsdF9pbl9jb21tYW5kICpmaW5kX2J1aWx0aW4oY29uc3QgY2hhciAqbmFtZSkKK3sKKwljb25zdCBzdHJ1Y3QgYnVpbHRfaW5fY29tbWFuZCAqeCA9IGZpbmRfYnVpbHRpbjEobmFtZSk7CisJaWYgKHgpCisJCXJldHVybiB4OworCXJldHVybiBmaW5kX2J1aWx0aW5faGVscGVyKG5hbWUsIGJsdGluczIsICZibHRpbnMyW0FSUkFZX1NJWkUoYmx0aW5zMildKTsKK30KKworI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworc3RhdGljIHN0cnVjdCBmdW5jdGlvbiAqKmZpbmRfZnVuY3Rpb25fc2xvdChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBmdW5jdGlvbiAqKmZ1bmNwcCA9ICZHLnRvcF9mdW5jOworCXdoaWxlICgqZnVuY3BwKSB7CisJCWlmIChzdHJjbXAobmFtZSwgKCpmdW5jcHApLT5uYW1lKSA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCQlmdW5jcHAgPSAmKCpmdW5jcHApLT5uZXh0OworCX0KKwlyZXR1cm4gZnVuY3BwOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZ1bmN0aW9uICpmaW5kX2Z1bmN0aW9uKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJY29uc3Qgc3RydWN0IGZ1bmN0aW9uICpmdW5jcCA9ICpmaW5kX2Z1bmN0aW9uX3Nsb3QobmFtZSk7CisJaWYgKGZ1bmNwKQorCQlkZWJ1Z19wcmludGZfZXhlYygiZm91bmQgZnVuY3Rpb24gJyVzJ1xuIiwgbmFtZSk7CisJcmV0dXJuIGZ1bmNwOworfQorCisvKiBOb3RlOiB0YWtlcyBvd25lcnNoaXAgb24gbmFtZSBwdHIgKi8KK3N0YXRpYyBzdHJ1Y3QgZnVuY3Rpb24gKm5ld19mdW5jdGlvbihjaGFyICpuYW1lKQoreworCXN0cnVjdCBmdW5jdGlvbiAqKmZ1bmNwcCA9IGZpbmRfZnVuY3Rpb25fc2xvdChuYW1lKTsKKwlzdHJ1Y3QgZnVuY3Rpb24gKmZ1bmNwID0gKmZ1bmNwcDsKKworCWlmIChmdW5jcCAhPSBOVUxMKSB7CisJCXN0cnVjdCBjb21tYW5kICpjbWQgPSBmdW5jcC0+cGFyZW50X2NtZDsKKwkJZGVidWdfcHJpbnRmX2V4ZWMoImZ1bmMgJXAgcGFyZW50X2NtZCAlcFxuIiwgZnVuY3AsIGNtZCk7CisJCWlmICghY21kKSB7CisJCQlkZWJ1Z19wcmludGZfZXhlYygiZnJlZWluZyAmIHJlcGxhY2luZyBmdW5jdGlvbiAnJXMnXG4iLCBmdW5jcC0+bmFtZSk7CisJCQlmcmVlKGZ1bmNwLT5uYW1lKTsKKwkJCS8qIE5vdGU6IGlmICFmdW5jcC0+Ym9keSwgZG8gbm90IGZyZWUgYm9keV9hc19zdHJpbmchCisJCQkgKiBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIG9mICItRiBuYW1lIGJvZHkiIGZ1bmN0aW9uOgorCQkJICogYm9keV9hc19zdHJpbmcgd2FzIG5vdCBtYWxsb2NlZCEgKi8KKwkJCWlmIChmdW5jcC0+Ym9keSkgeworCQkJCWZyZWVfcGlwZV9saXN0KGZ1bmNwLT5ib2R5KTsKKyMgaWYgIUJCX01NVQorCQkJCWZyZWUoZnVuY3AtPmJvZHlfYXNfc3RyaW5nKTsKKyMgZW5kaWYKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWRlYnVnX3ByaW50Zl9leGVjKCJyZWluc2VydGluZyBpbiB0cmVlICYgcmVwbGFjaW5nIGZ1bmN0aW9uICclcydcbiIsIGZ1bmNwLT5uYW1lKTsKKwkJCWNtZC0+YXJndlswXSA9IGZ1bmNwLT5uYW1lOworCQkJY21kLT5ncm91cCA9IGZ1bmNwLT5ib2R5OworIyBpZiAhQkJfTU1VCisJCQljbWQtPmdyb3VwX2FzX3N0cmluZyA9IGZ1bmNwLT5ib2R5X2FzX3N0cmluZzsKKyMgZW5kaWYKKwkJfQorCX0gZWxzZSB7CisJCWRlYnVnX3ByaW50Zl9leGVjKCJyZW1lbWJlcmluZyBuZXcgZnVuY3Rpb24gJyVzJ1xuIiwgbmFtZSk7CisJCWZ1bmNwID0gKmZ1bmNwcCA9IHh6YWxsb2Moc2l6ZW9mKCpmdW5jcCkpOworCQkvKmZ1bmNwLT5uZXh0ID0gTlVMTDsqLworCX0KKworCWZ1bmNwLT5uYW1lID0gbmFtZTsKKwlyZXR1cm4gZnVuY3A7Cit9CisKK3N0YXRpYyB2b2lkIHVuc2V0X2Z1bmMoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZnVuY3Rpb24gKipmdW5jcHAgPSBmaW5kX2Z1bmN0aW9uX3Nsb3QobmFtZSk7CisJc3RydWN0IGZ1bmN0aW9uICpmdW5jcCA9ICpmdW5jcHA7CisKKwlpZiAoZnVuY3AgIT0gTlVMTCkgeworCQlkZWJ1Z19wcmludGZfZXhlYygiZnJlZWluZyBmdW5jdGlvbiAnJXMnXG4iLCBmdW5jcC0+bmFtZSk7CisJCSpmdW5jcHAgPSBmdW5jcC0+bmV4dDsKKwkJLyogZnVuY3AgaXMgdW5saW5rZWQgbm93LCBkZWxldGluZyBpdC4KKwkJICogTm90ZTogaWYgIWZ1bmNwLT5ib2R5LCB0aGUgZnVuY3Rpb24gd2FzIGNyZWF0ZWQgYnkKKwkJICogIi1GIG5hbWUgYm9keSIsIGRvIG5vdCBmcmVlIC0+Ym9keV9hc19zdHJpbmcKKwkJICogYW5kIC0+bmFtZSBhcyB0aGV5IHdlcmUgbm90IG1hbGxvY2VkLiAqLworCQlpZiAoZnVuY3AtPmJvZHkpIHsKKwkJCWZyZWVfcGlwZV9saXN0KGZ1bmNwLT5ib2R5KTsKKwkJCWZyZWUoZnVuY3AtPm5hbWUpOworIyBpZiAhQkJfTU1VCisJCQlmcmVlKGZ1bmNwLT5ib2R5X2FzX3N0cmluZyk7CisjIGVuZGlmCisJCX0KKwkJZnJlZShmdW5jcCk7CisJfQorfQorCisjIGlmIEJCX01NVQorI2RlZmluZSBleGVjX2Z1bmN0aW9uKHRvX2ZyZWUsIGZ1bmNwLCBhcmd2KSBcCisJZXhlY19mdW5jdGlvbihmdW5jcCwgYXJndikKKyMgZW5kaWYKK3N0YXRpYyB2b2lkIGV4ZWNfZnVuY3Rpb24oY2hhciAqKip0b19mcmVlLAorCQljb25zdCBzdHJ1Y3QgZnVuY3Rpb24gKmZ1bmNwLAorCQljaGFyICoqYXJndikgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBleGVjX2Z1bmN0aW9uKGNoYXIgKioqdG9fZnJlZSwKKwkJY29uc3Qgc3RydWN0IGZ1bmN0aW9uICpmdW5jcCwKKwkJY2hhciAqKmFyZ3YpCit7CisjIGlmIEJCX01NVQorCWludCBuID0gMTsKKworCWFyZ3ZbMF0gPSBHLmdsb2JhbF9hcmd2WzBdOworCUcuZ2xvYmFsX2FyZ3YgPSBhcmd2OworCXdoaWxlICgqKythcmd2KQorCQluKys7CisJRy5nbG9iYWxfYXJnYyA9IG47CisJLyogT24gTU1VLCBmdW5jcC0+Ym9keSBpcyBhbHdheXMgbm9uLU5VTEwgKi8KKwluID0gcnVuX2xpc3QoZnVuY3AtPmJvZHkpOworCWZmbHVzaF9hbGwoKTsKKwlfZXhpdChuKTsKKyMgZWxzZQorCXJlX2V4ZWN1dGVfc2hlbGwodG9fZnJlZSwKKwkJCWZ1bmNwLT5ib2R5X2FzX3N0cmluZywKKwkJCUcuZ2xvYmFsX2FyZ3ZbMF0sCisJCQlhcmd2ICsgMSwKKwkJCU5VTEwpOworIyBlbmRpZgorfQorCitzdGF0aWMgaW50IHJ1bl9mdW5jdGlvbihjb25zdCBzdHJ1Y3QgZnVuY3Rpb24gKmZ1bmNwLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcmM7CisJc2F2ZV9hcmdfdCBzdjsKKwlzbWFsbGludCBzdl9mbGc7CisKKwlzYXZlX2FuZF9yZXBsYWNlX0dfYXJncygmc3YsIGFyZ3YpOworCisJLyogIndlIGFyZSBpbiBmdW5jdGlvbiwgb2sgdG8gdXNlIHJldHVybiIgKi8KKwlzdl9mbGcgPSBHLmZsYWdfcmV0dXJuX2luX3Byb2dyZXNzOworCUcuZmxhZ19yZXR1cm5faW5fcHJvZ3Jlc3MgPSAtMTsKKyMgaWYgRU5BQkxFX0hVU0hfTE9DQUwKKwlHLmZ1bmNfbmVzdF9sZXZlbCsrOworIyBlbmRpZgorCisJLyogT24gTU1VLCBmdW5jcC0+Ym9keSBpcyBhbHdheXMgbm9uLU5VTEwgKi8KKyMgaWYgIUJCX01NVQorCWlmICghZnVuY3AtPmJvZHkpIHsKKwkJLyogRnVuY3Rpb24gZGVmaW5lZCBieSAtRiAqLworCQlwYXJzZV9hbmRfcnVuX3N0cmluZyhmdW5jcC0+Ym9keV9hc19zdHJpbmcpOworCQlyYyA9IEcubGFzdF9leGl0Y29kZTsKKwl9IGVsc2UKKyMgZW5kaWYKKwl7CisJCXJjID0gcnVuX2xpc3QoZnVuY3AtPmJvZHkpOworCX0KKworIyBpZiBFTkFCTEVfSFVTSF9MT0NBTAorCXsKKwkJc3RydWN0IHZhcmlhYmxlICp2YXI7CisJCXN0cnVjdCB2YXJpYWJsZSAqKnZhcl9wcDsKKworCQl2YXJfcHAgPSAmRy50b3BfdmFyOworCQl3aGlsZSAoKHZhciA9ICp2YXJfcHApICE9IE5VTEwpIHsKKwkJCWlmICh2YXItPmZ1bmNfbmVzdF9sZXZlbCA8IEcuZnVuY19uZXN0X2xldmVsKSB7CisJCQkJdmFyX3BwID0gJnZhci0+bmV4dDsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIFVuZXhwb3J0ICovCisJCQlpZiAodmFyLT5mbGdfZXhwb3J0KQorCQkJCWJiX3Vuc2V0ZW52KHZhci0+dmFyc3RyKTsKKwkJCS8qIFJlbW92ZSBmcm9tIGdsb2JhbCBsaXN0ICovCisJCQkqdmFyX3BwID0gdmFyLT5uZXh0OworCQkJLyogRnJlZSAqLworCQkJaWYgKCF2YXItPm1heF9sZW4pCisJCQkJZnJlZSh2YXItPnZhcnN0cik7CisJCQlmcmVlKHZhcik7CisJCX0KKwkJRy5mdW5jX25lc3RfbGV2ZWwtLTsKKwl9CisjIGVuZGlmCisJRy5mbGFnX3JldHVybl9pbl9wcm9ncmVzcyA9IHN2X2ZsZzsKKworCXJlc3RvcmVfR19hcmdzKCZzdiwgYXJndik7CisKKwlyZXR1cm4gcmM7Cit9CisjZW5kaWYgLyogRU5BQkxFX0hVU0hfRlVOQ1RJT05TICovCisKKworI2lmIEJCX01NVQorI2RlZmluZSBleGVjX2J1aWx0aW4odG9fZnJlZSwgeCwgYXJndikgXAorCWV4ZWNfYnVpbHRpbih4LCBhcmd2KQorI2Vsc2UKKyNkZWZpbmUgZXhlY19idWlsdGluKHRvX2ZyZWUsIHgsIGFyZ3YpIFwKKwlleGVjX2J1aWx0aW4odG9fZnJlZSwgYXJndikKKyNlbmRpZgorc3RhdGljIHZvaWQgZXhlY19idWlsdGluKGNoYXIgKioqdG9fZnJlZSwKKwkJY29uc3Qgc3RydWN0IGJ1aWx0X2luX2NvbW1hbmQgKngsCisJCWNoYXIgKiphcmd2KSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGV4ZWNfYnVpbHRpbihjaGFyICoqKnRvX2ZyZWUsCisJCWNvbnN0IHN0cnVjdCBidWlsdF9pbl9jb21tYW5kICp4LAorCQljaGFyICoqYXJndikKK3sKKyNpZiBCQl9NTVUKKwlpbnQgcmNvZGU7CisJZmZsdXNoX2FsbCgpOworCXJjb2RlID0geC0+Yl9mdW5jdGlvbihhcmd2KTsKKwlmZmx1c2hfYWxsKCk7CisJX2V4aXQocmNvZGUpOworI2Vsc2UKKwlmZmx1c2hfYWxsKCk7CisJLyogT24gTk9NTVUsIHdlIG11c3QgbmV2ZXIgYmxvY2shCisJICogRXhhbXBsZTogeyBzbGVlcCA5OSB8IHJlYWQgbGluZTsgfSAmIGVjaG8gT2sKKwkgKi8KKwlyZV9leGVjdXRlX3NoZWxsKHRvX2ZyZWUsCisJCQlhcmd2WzBdLAorCQkJRy5nbG9iYWxfYXJndlswXSwKKwkJCUcuZ2xvYmFsX2FyZ3YgKyAxLAorCQkJYXJndik7CisjZW5kaWYKK30KKworCitzdGF0aWMgdm9pZCBleGVjdnBfb3JfZGllKGNoYXIgKiphcmd2KSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGV4ZWN2cF9vcl9kaWUoY2hhciAqKmFyZ3YpCit7CisJZGVidWdfcHJpbnRmX2V4ZWMoImV4ZWNpbmcgJyVzJ1xuIiwgYXJndlswXSk7CisJLyogRG9uJ3QgcHJvcGFnYXRlIFNJR19JR04gdG8gdGhlIGNoaWxkICovCisJaWYgKFNQRUNJQUxfSk9CU1RPUF9TSUdTICE9IDApCisJCXN3aXRjaF9vZmZfc3BlY2lhbF9zaWdzKEcuc3BlY2lhbF9zaWdfbWFzayAmIFNQRUNJQUxfSk9CU1RPUF9TSUdTKTsKKwlleGVjdnAoYXJndlswXSwgYXJndik7CisJYmJfcGVycm9yX21zZygiY2FuJ3QgZXhlY3V0ZSAnJXMnIiwgYXJndlswXSk7CisJX2V4aXQoMTI3KTsgLyogYmFzaCBjb21wYXQgKi8KK30KKworI2lmIEVOQUJMRV9IVVNIX01PREVfWAorc3RhdGljIHZvaWQgZHVtcF9jbWRfaW5feF9tb2RlKGNoYXIgKiphcmd2KQoreworCWlmIChHX3hfbW9kZSAmJiBhcmd2KSB7CisJCS8qIFdlIHdhbnQgdG8gb3V0cHV0IHRoZSBsaW5lIGluIG9uZSB3cml0ZSBvcCAqLworCQljaGFyICpidWYsICpwOworCQlpbnQgbGVuOworCQlpbnQgbjsKKworCQlsZW4gPSAzOworCQluID0gMDsKKwkJd2hpbGUgKGFyZ3Zbbl0pCisJCQlsZW4gKz0gc3RybGVuKGFyZ3ZbbisrXSkgKyAxOworCQlidWYgPSB4bWFsbG9jKGxlbik7CisJCWJ1ZlswXSA9ICcrJzsKKwkJcCA9IGJ1ZiArIDE7CisJCW4gPSAwOworCQl3aGlsZSAoYXJndltuXSkKKwkJCXAgKz0gc3ByaW50ZihwLCAiICVzIiwgYXJndltuKytdKTsKKwkJKnArKyA9ICdcbic7CisJCSpwID0gJ1wwJzsKKwkJZnB1dHMoYnVmLCBzdGRlcnIpOworCQlmcmVlKGJ1Zik7CisJfQorfQorI2Vsc2UKKyMgZGVmaW5lIGR1bXBfY21kX2luX3hfbW9kZShhcmd2KSAoKHZvaWQpMCkKKyNlbmRpZgorCisjaWYgQkJfTU1VCisjZGVmaW5lIHBzZXVkb19leGVjX2FyZ3Yobm9tbXVfc2F2ZSwgYXJndiwgYXNzaWdubWVudF9jbnQsIGFyZ3ZfZXhwYW5kZWQpIFwKKwlwc2V1ZG9fZXhlY19hcmd2KGFyZ3YsIGFzc2lnbm1lbnRfY250LCBhcmd2X2V4cGFuZGVkKQorI2RlZmluZSBwc2V1ZG9fZXhlYyhub21tdV9zYXZlLCBjb21tYW5kLCBhcmd2X2V4cGFuZGVkKSBcCisJcHNldWRvX2V4ZWMoY29tbWFuZCwgYXJndl9leHBhbmRlZCkKKyNlbmRpZgorCisvKiBDYWxsZWQgYWZ0ZXIgW3ZdZm9yaygpIGluIHJ1bl9waXBlLCBvciBmcm9tIGJ1aWx0aW5fZXhlYy4KKyAqIE5ldmVyIHJldHVybnMuCisgKiBEb24ndCBleGl0KCkgaGVyZS4gIElmIHlvdSBkb24ndCBleGVjLCB1c2UgX2V4aXQgaW5zdGVhZC4KKyAqIFRoZSBhdF9leGl0IGhhbmRsZXJzIGFwcGFyZW50bHkgY29uZnVzZSB0aGUgY2FsbGluZyBwcm9jZXNzLAorICogaW4gcGFydGljdWxhciBzdGRpbiBoYW5kbGluZy4gIE5vdCBzdXJlIHdoeT8gLS0gYmVjYXVzZSBvZiB2Zm9yayEgKHZkYSkgKi8KK3N0YXRpYyB2b2lkIHBzZXVkb19leGVjX2FyZ3Yobm9tbXVfc2F2ZV90ICpub21tdV9zYXZlLAorCQljaGFyICoqYXJndiwgaW50IGFzc2lnbm1lbnRfY250LAorCQljaGFyICoqYXJndl9leHBhbmRlZCkgTk9SRVRVUk47CitzdGF0aWMgTk9JTkxJTkUgdm9pZCBwc2V1ZG9fZXhlY19hcmd2KG5vbW11X3NhdmVfdCAqbm9tbXVfc2F2ZSwKKwkJY2hhciAqKmFyZ3YsIGludCBhc3NpZ25tZW50X2NudCwKKwkJY2hhciAqKmFyZ3ZfZXhwYW5kZWQpCit7CisJY2hhciAqKm5ld19lbnY7CisKKwluZXdfZW52ID0gZXhwYW5kX2Fzc2lnbm1lbnRzKGFyZ3YsIGFzc2lnbm1lbnRfY250KTsKKwlkdW1wX2NtZF9pbl94X21vZGUobmV3X2Vudik7CisKKwlpZiAoIWFyZ3ZbYXNzaWdubWVudF9jbnRdKSB7CisJCS8qIENhc2Ugd2hlbiB3ZSBhcmUgaGVyZTogLi4uIHwgdmFyPXZhbCB8IC4uLgorCQkgKiAobm90ZSB0aGF0IHdlIGRvIG5vdCBleGl0IGVhcmx5LCBpLmUuLCBkbyBub3Qgb3B0aW1pemUgb3V0CisJCSAqIGV4cGFuZF9hc3NpZ25tZW50cygpOiB0aGluayBhYm91dCAuLi4gfCB2YXI9YHNsZWVwIDFgIHwgLi4uCisJCSAqLworCQlmcmVlX3N0cmluZ3MobmV3X2Vudik7CisJCV9leGl0KEVYSVRfU1VDQ0VTUyk7CisJfQorCisjaWYgQkJfTU1VCisJc2V0X3ZhcnNfYW5kX3NhdmVfb2xkKG5ld19lbnYpOworCWZyZWUobmV3X2Vudik7IC8qIG9wdGlvbmFsICovCisJLyogd2UgY2FuIGFsc28gZGVzdHJveSBzZXRfdmFyc19hbmRfc2F2ZV9vbGQncyByZXR1cm4gdmFsdWUsCisJICogdG8gc2F2ZSBtZW1vcnkgKi8KKyNlbHNlCisJbm9tbXVfc2F2ZS0+bmV3X2VudiA9IG5ld19lbnY7CisJbm9tbXVfc2F2ZS0+b2xkX3ZhcnMgPSBzZXRfdmFyc19hbmRfc2F2ZV9vbGQobmV3X2Vudik7CisjZW5kaWYKKworCWlmIChhcmd2X2V4cGFuZGVkKSB7CisJCWFyZ3YgPSBhcmd2X2V4cGFuZGVkOworCX0gZWxzZSB7CisJCWFyZ3YgPSBleHBhbmRfc3RydmVjX3RvX3N0cnZlYyhhcmd2ICsgYXNzaWdubWVudF9jbnQpOworI2lmICFCQl9NTVUKKwkJbm9tbXVfc2F2ZS0+YXJndiA9IGFyZ3Y7CisjZW5kaWYKKwl9CisJZHVtcF9jbWRfaW5feF9tb2RlKGFyZ3YpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORSB8fCBCQl9NTVUKKwlpZiAoc3RyY2hyKGFyZ3ZbMF0sICcvJykgIT0gTlVMTCkKKwkJZ290byBza2lwOworI2VuZGlmCisKKwkvKiBDaGVjayBpZiB0aGUgY29tbWFuZCBtYXRjaGVzIGFueSBvZiB0aGUgYnVpbHRpbnMuCisJICogRGVwZW5kaW5nIG9uIGNvbnRleHQsIHRoaXMgbWlnaHQgYmUgcmVkdW5kYW50LiAgQnV0IGl0J3MKKwkgKiBlYXNpZXIgdG8gd2FzdGUgYSBmZXcgQ1BVIGN5Y2xlcyB0aGFuIGl0IGlzIHRvIGZpZ3VyZSBvdXQKKwkgKiBpZiB0aGlzIGlzIG9uZSBvZiB0aG9zZSBjYXNlcy4KKwkgKi8KKwl7CisJCS8qIE9uIE5PTU1VLCBpdCBpcyBtb3JlIGV4cGVuc2l2ZSB0byByZS1leGVjdXRlIHNoZWxsCisJCSAqIGp1c3QgaW4gb3JkZXIgdG8gcnVuIGVjaG8gb3IgdGVzdCBidWlsdGluLgorCQkgKiBJdCdzIGJldHRlciB0byBza2lwIGl0IGhlcmUgYW5kIHJ1biBjb3JyZXNwb25kaW5nCisJCSAqIG5vbi1idWlsdGluIGxhdGVyLiAqLworCQljb25zdCBzdHJ1Y3QgYnVpbHRfaW5fY29tbWFuZCAqeDsKKwkJeCA9IEJCX01NVSA/IGZpbmRfYnVpbHRpbihhcmd2WzBdKSA6IGZpbmRfYnVpbHRpbjEoYXJndlswXSk7CisJCWlmICh4KSB7CisJCQlleGVjX2J1aWx0aW4oJm5vbW11X3NhdmUtPmFyZ3ZfZnJvbV9yZV9leGVjaW5nLCB4LCBhcmd2KTsKKwkJfQorCX0KKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwkvKiBDaGVjayBpZiB0aGUgY29tbWFuZCBtYXRjaGVzIGFueSBmdW5jdGlvbnMgKi8KKwl7CisJCWNvbnN0IHN0cnVjdCBmdW5jdGlvbiAqZnVuY3AgPSBmaW5kX2Z1bmN0aW9uKGFyZ3ZbMF0pOworCQlpZiAoZnVuY3ApIHsKKwkJCWV4ZWNfZnVuY3Rpb24oJm5vbW11X3NhdmUtPmFyZ3ZfZnJvbV9yZV9leGVjaW5nLCBmdW5jcCwgYXJndik7CisJCX0KKwl9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NIX1NUQU5EQUxPTkUKKwkvKiBDaGVjayBpZiB0aGUgY29tbWFuZCBtYXRjaGVzIGFueSBidXN5Ym94IGFwcGxldHMgKi8KKwl7CisJCWludCBhID0gZmluZF9hcHBsZXRfYnlfbmFtZShhcmd2WzBdKTsKKwkJaWYgKGEgPj0gMCkgeworIyBpZiBCQl9NTVUgLyogc2VlIGFib3ZlIHdoeSBvbiBOT01NVSBpdCBpcyBub3QgYWxsb3dlZCAqLworCQkJaWYgKEFQUExFVF9JU19OT0VYRUMoYSkpIHsKKwkJCQlkZWJ1Z19wcmludGZfZXhlYygicnVubmluZyBhcHBsZXQgJyVzJ1xuIiwgYXJndlswXSk7CisJCQkJcnVuX2FwcGxldF9ub19hbmRfZXhpdChhLCBhcmd2KTsKKwkJCX0KKyMgZW5kaWYKKwkJCS8qIFJlLWV4ZWMgb3Vyc2VsdmVzICovCisJCQlkZWJ1Z19wcmludGZfZXhlYygicmUtZXhlY2luZyBhcHBsZXQgJyVzJ1xuIiwgYXJndlswXSk7CisJCQkvKiBEb24ndCBwcm9wYWdhdGUgU0lHX0lHTiB0byB0aGUgY2hpbGQgKi8KKwkJCWlmIChTUEVDSUFMX0pPQlNUT1BfU0lHUyAhPSAwKQorCQkJCXN3aXRjaF9vZmZfc3BlY2lhbF9zaWdzKEcuc3BlY2lhbF9zaWdfbWFzayAmIFNQRUNJQUxfSk9CU1RPUF9TSUdTKTsKKwkJCWV4ZWN2KGJiX2J1c3lib3hfZXhlY19wYXRoLCBhcmd2KTsKKwkJCS8qIElmIHRoZXkgY2FsbGVkIGNocm9vdCBvciBvdGhlcndpc2UgbWFkZSB0aGUgYmluYXJ5IG5vIGxvbmdlcgorCQkJICogZXhlY3V0YWJsZSwgZmFsbCB0aHJvdWdoICovCisJCX0KKwl9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NIX1NUQU5EQUxPTkUgfHwgQkJfTU1VCisgc2tpcDoKKyNlbmRpZgorCWV4ZWN2cF9vcl9kaWUoYXJndik7Cit9CisKKy8qIENhbGxlZCBhZnRlciBbdl1mb3JrKCkgaW4gcnVuX3BpcGUKKyAqLworc3RhdGljIHZvaWQgcHNldWRvX2V4ZWMobm9tbXVfc2F2ZV90ICpub21tdV9zYXZlLAorCQlzdHJ1Y3QgY29tbWFuZCAqY29tbWFuZCwKKwkJY2hhciAqKmFyZ3ZfZXhwYW5kZWQpIE5PUkVUVVJOOworc3RhdGljIHZvaWQgcHNldWRvX2V4ZWMobm9tbXVfc2F2ZV90ICpub21tdV9zYXZlLAorCQlzdHJ1Y3QgY29tbWFuZCAqY29tbWFuZCwKKwkJY2hhciAqKmFyZ3ZfZXhwYW5kZWQpCit7CisJaWYgKGNvbW1hbmQtPmFyZ3YpIHsKKwkJcHNldWRvX2V4ZWNfYXJndihub21tdV9zYXZlLCBjb21tYW5kLT5hcmd2LAorCQkJCWNvbW1hbmQtPmFzc2lnbm1lbnRfY250LCBhcmd2X2V4cGFuZGVkKTsKKwl9CisKKwlpZiAoY29tbWFuZC0+Z3JvdXApIHsKKwkJLyogQ2FzZXMgd2hlbiB3ZSBhcmUgaGVyZToKKwkJICogKCBsaXN0ICkKKwkJICogeyBsaXN0IH0gJgorCQkgKiAuLi4gfCAoIGxpc3QgKSB8IC4uLgorCQkgKiAuLi4gfCB7IGxpc3QgfSB8IC4uLgorCQkgKi8KKyNpZiBCQl9NTVUKKwkJaW50IHJjb2RlOworCQlkZWJ1Z19wcmludGZfZXhlYygicHNldWRvX2V4ZWM6IHJ1bl9saXN0XG4iKTsKKwkJcmVzZXRfdHJhcHNfdG9fZGVmYXVsdHMoKTsKKwkJcmNvZGUgPSBydW5fbGlzdChjb21tYW5kLT5ncm91cCk7CisJCS8qIE9LIHRvIGxlYWsgbWVtb3J5IGJ5IG5vdCBjYWxsaW5nIGZyZWVfcGlwZV9saXN0LAorCQkgKiBzaW5jZSB0aGlzIHByb2Nlc3MgaXMgYWJvdXQgdG8gZXhpdCAqLworCQlfZXhpdChyY29kZSk7CisjZWxzZQorCQlyZV9leGVjdXRlX3NoZWxsKCZub21tdV9zYXZlLT5hcmd2X2Zyb21fcmVfZXhlY2luZywKKwkJCQljb21tYW5kLT5ncm91cF9hc19zdHJpbmcsCisJCQkJRy5nbG9iYWxfYXJndlswXSwKKwkJCQlHLmdsb2JhbF9hcmd2ICsgMSwKKwkJCQlOVUxMKTsKKyNlbmRpZgorCX0KKworCS8qIENhc2Ugd2hlbiB3ZSBhcmUgaGVyZTogLi4uIHwgPmZpbGUgKi8KKwlkZWJ1Z19wcmludGZfZXhlYygicHNldWRvX2V4ZWMnZWQgbnVsbCBjb21tYW5kXG4iKTsKKwlfZXhpdChFWElUX1NVQ0NFU1MpOworfQorCisjaWYgRU5BQkxFX0hVU0hfSk9CCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X2NtZHRleHQoc3RydWN0IHBpcGUgKnBpKQoreworCWNoYXIgKiphcmd2OworCWNoYXIgKnA7CisJaW50IGxlbjsKKworCS8qIFRoaXMgaXMgc3VidGxlLiAtPmNtZHRleHQgaXMgY3JlYXRlZCBvbmx5IG9uIGZpcnN0IGJhY2tncm91bmRpbmcuCisJICogKFRoaW5rICJjYXQsIDxjdHJsLXo+LCBmZywgPGN0cmwtej4sIGZnLCA8Y3RybC16Pi4uLi4iIGhlcmUuLi4pCisJICogT24gc3Vic2VxdWVudCBiZyBhcmd2IGlzIHRyYXNoZWQsIGJ1dCB3ZSB3b24ndCB1c2UgaXQgKi8KKwlpZiAocGktPmNtZHRleHQpCisJCXJldHVybiBwaS0+Y21kdGV4dDsKKwlhcmd2ID0gcGktPmNtZHNbMF0uYXJndjsKKwlpZiAoIWFyZ3YgfHwgIWFyZ3ZbMF0pIHsKKwkJcGktPmNtZHRleHQgPSB4emFsbG9jKDEpOworCQlyZXR1cm4gcGktPmNtZHRleHQ7CisJfQorCisJbGVuID0gMDsKKwlkbyB7CisJCWxlbiArPSBzdHJsZW4oKmFyZ3YpICsgMTsKKwl9IHdoaWxlICgqKythcmd2KTsKKwlwID0geG1hbGxvYyhsZW4pOworCXBpLT5jbWR0ZXh0ID0gcDsKKwlhcmd2ID0gcGktPmNtZHNbMF0uYXJndjsKKwlkbyB7CisJCWxlbiA9IHN0cmxlbigqYXJndik7CisJCW1lbWNweShwLCAqYXJndiwgbGVuKTsKKwkJcCArPSBsZW47CisJCSpwKysgPSAnICc7CisJfSB3aGlsZSAoKisrYXJndik7CisJcFstMV0gPSAnXDAnOworCXJldHVybiBwaS0+Y21kdGV4dDsKK30KKworc3RhdGljIHZvaWQgaW5zZXJ0X2JnX2pvYihzdHJ1Y3QgcGlwZSAqcGkpCit7CisJc3RydWN0IHBpcGUgKmpvYiwgKipqb2JwOworCWludCBpOworCisJLyogTGluZWFyIHNlYXJjaCBmb3IgdGhlIElEIG9mIHRoZSBqb2IgdG8gdXNlICovCisJcGktPmpvYmlkID0gMTsKKwlmb3IgKGpvYiA9IEcuam9iX2xpc3Q7IGpvYjsgam9iID0gam9iLT5uZXh0KQorCQlpZiAoam9iLT5qb2JpZCA+PSBwaS0+am9iaWQpCisJCQlwaS0+am9iaWQgPSBqb2ItPmpvYmlkICsgMTsKKworCS8qIEFkZCBqb2IgdG8gdGhlIGxpc3Qgb2YgcnVubmluZyBqb2JzICovCisJam9icCA9ICZHLmpvYl9saXN0OworCXdoaWxlICgoam9iID0gKmpvYnApICE9IE5VTEwpCisJCWpvYnAgPSAmam9iLT5uZXh0OworCWpvYiA9ICpqb2JwID0geG1hbGxvYyhzaXplb2YoKmpvYikpOworCisJKmpvYiA9ICpwaTsgLyogcGh5c2ljYWwgY29weSAqLworCWpvYi0+bmV4dCA9IE5VTEw7CisJam9iLT5jbWRzID0geHphbGxvYyhzaXplb2YocGktPmNtZHNbMF0pICogcGktPm51bV9jbWRzKTsKKwkvKiBDYW5ub3QgY29weSBlbnRpcmUgcGktPmNtZHNbXSB2ZWN0b3IhIFRoaXMgY2F1c2VzIGRvdWJsZSBmcmVlcyAqLworCWZvciAoaSA9IDA7IGkgPCBwaS0+bnVtX2NtZHM7IGkrKykgeworCQlqb2ItPmNtZHNbaV0ucGlkID0gcGktPmNtZHNbaV0ucGlkOworCQkvKiBhbGwgb3RoZXIgZmllbGRzIGFyZSBub3QgdXNlZCBhbmQgc3RheSB6ZXJvICovCisJfQorCWpvYi0+Y21kdGV4dCA9IHhzdHJkdXAoZ2V0X2NtZHRleHQocGkpKTsKKworCWlmIChHX2ludGVyYWN0aXZlX2ZkKQorCQlwcmludGYoIlslZF0gJWQgJXNcbiIsIGpvYi0+am9iaWQsIGpvYi0+Y21kc1swXS5waWQsIGpvYi0+Y21kdGV4dCk7CisJRy5sYXN0X2pvYmlkID0gam9iLT5qb2JpZDsKK30KKworc3RhdGljIHZvaWQgcmVtb3ZlX2JnX2pvYihzdHJ1Y3QgcGlwZSAqcGkpCit7CisJc3RydWN0IHBpcGUgKnByZXZfcGlwZTsKKworCWlmIChwaSA9PSBHLmpvYl9saXN0KSB7CisJCUcuam9iX2xpc3QgPSBwaS0+bmV4dDsKKwl9IGVsc2UgeworCQlwcmV2X3BpcGUgPSBHLmpvYl9saXN0OworCQl3aGlsZSAocHJldl9waXBlLT5uZXh0ICE9IHBpKQorCQkJcHJldl9waXBlID0gcHJldl9waXBlLT5uZXh0OworCQlwcmV2X3BpcGUtPm5leHQgPSBwaS0+bmV4dDsKKwl9CisJaWYgKEcuam9iX2xpc3QpCisJCUcubGFzdF9qb2JpZCA9IEcuam9iX2xpc3QtPmpvYmlkOworCWVsc2UKKwkJRy5sYXN0X2pvYmlkID0gMDsKK30KKworLyogUmVtb3ZlIGEgYmFja2dyb3VuZGVkIGpvYiAqLworc3RhdGljIHZvaWQgZGVsZXRlX2ZpbmlzaGVkX2JnX2pvYihzdHJ1Y3QgcGlwZSAqcGkpCit7CisJcmVtb3ZlX2JnX2pvYihwaSk7CisJZnJlZV9waXBlKHBpKTsKK30KKyNlbmRpZiAvKiBKT0IgKi8KKworLyogQ2hlY2sgdG8gc2VlIGlmIGFueSBwcm9jZXNzZXMgaGF2ZSBleGl0ZWQgLS0gaWYgdGhleQorICogaGF2ZSwgZmlndXJlIG91dCB3aHkgYW5kIHNlZSBpZiBhIGpvYiBoYXMgY29tcGxldGVkICovCitzdGF0aWMgaW50IGNoZWNram9icyhzdHJ1Y3QgcGlwZSAqZmdfcGlwZSkKK3sKKwlpbnQgYXR0cmlidXRlczsKKwlpbnQgc3RhdHVzOworI2lmIEVOQUJMRV9IVVNIX0pPQgorCXN0cnVjdCBwaXBlICpwaTsKKyNlbmRpZgorCXBpZF90IGNoaWxkcGlkOworCWludCByY29kZSA9IDA7CisKKwlkZWJ1Z19wcmludGZfam9icygiY2hlY2tqb2JzICVwXG4iLCBmZ19waXBlKTsKKworCWF0dHJpYnV0ZXMgPSBXVU5UUkFDRUQ7CisJaWYgKGZnX3BpcGUgPT0gTlVMTCkKKwkJYXR0cmlidXRlcyB8PSBXTk9IQU5HOworCisJZXJybm8gPSAwOworI2lmIEVOQUJMRV9IVVNIX0ZBU1QKKwlpZiAoRy5oYW5kbGVkX1NJR0NITEQgPT0gRy5jb3VudF9TSUdDSExEKSB7CisvL2JiX2Vycm9yX21zZygiWyVkXSBjaGVja2pvYnM6IEcuY291bnRfU0lHQ0hMRDolZCBHLmhhbmRsZWRfU0lHQ0hMRDolZCBjaGlsZHJlbj86JWQgZmdfcGlwZTolcCIsCisvL2dldHBpZCgpLCBHLmNvdW50X1NJR0NITEQsIEcuaGFuZGxlZF9TSUdDSExELCBHLndlX2hhdmVfY2hpbGRyZW4sIGZnX3BpcGUpOworCQkvKiBUaGVyZSB3YXMgbmVpdGhlciBmb3JrIG5vciBTSUdDSExEIHNpbmNlIGxhc3Qgd2FpdHBpZCAqLworCQkvKiBBdm9pZCBkb2luZyB3YWl0cGlkIHN5c2NhbGwgaWYgcG9zc2libGUgKi8KKwkJaWYgKCFHLndlX2hhdmVfY2hpbGRyZW4pIHsKKwkJCWVycm5vID0gRUNISUxEOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmIChmZ19waXBlID09IE5VTEwpIHsgLyogaXMgV05PSEFORyBzZXQ/ICovCisJCQkvKiBXZSBoYXZlIGNoaWxkcmVuLCBidXQgdGhleSBkaWQgbm90IGV4aXQKKwkJCSAqIG9yIHN0b3AgeWV0ICh3ZSBzYXcgbm8gU0lHQ0hMRCkgKi8KKwkJCXJldHVybiAwOworCQl9CisJCS8qIGVsc2U6ICFXTk9IQU5HLCB3YWl0cGlkIHdpbGwgYmxvY2ssIGNhbid0IHNob3J0LWNpcmN1aXQgKi8KKwl9CisjZW5kaWYKKworLyogRG8gd2UgZG8gdGhpcyByaWdodD8KKyAqIGJhc2gtMy4wMCMgc2xlZXAgMjAgfCBmYWxzZQorICogPGN0cmwtWiBwcmVzc2VkPgorICogWzNdKyAgU3RvcHBlZCAgICAgICAgICBzbGVlcCAyMCB8IGZhbHNlCisgKiBiYXNoLTMuMDAjIGVjaG8gJD8KKyAqIDEgICA8PT09PT09PT09PSBiZyBwaXBlIGlzIG5vdCBmdWxseSBkb25lLCBidXQgZXhpdGNvZGUgaXMgYWxyZWFkeSBrbm93biEKKyAqIFtodXNoIDEuMTQuMDogeWVzIHdlIGRvIGl0IHJpZ2h0XQorICovCisgd2FpdF9tb3JlOgorCXdoaWxlICgxKSB7CisJCWludCBpOworCQlpbnQgZGVhZDsKKworI2lmIEVOQUJMRV9IVVNIX0ZBU1QKKwkJaSA9IEcuY291bnRfU0lHQ0hMRDsKKyNlbmRpZgorCQljaGlsZHBpZCA9IHdhaXRwaWQoLTEsICZzdGF0dXMsIGF0dHJpYnV0ZXMpOworCQlpZiAoY2hpbGRwaWQgPD0gMCkgeworCQkJaWYgKGNoaWxkcGlkICYmIGVycm5vICE9IEVDSElMRCkKKwkJCQliYl9wZXJyb3JfbXNnKCJ3YWl0cGlkIik7CisjaWYgRU5BQkxFX0hVU0hfRkFTVAorCQkJZWxzZSB7IC8qIFVudGlsIG5leHQgU0lHQ0hMRCwgd2FpdHBpZCdzIGFyZSB1c2VsZXNzICovCisJCQkJRy53ZV9oYXZlX2NoaWxkcmVuID0gKGNoaWxkcGlkID09IDApOworCQkJCUcuaGFuZGxlZF9TSUdDSExEID0gaTsKKy8vYmJfZXJyb3JfbXNnKCJbJWRdIGNoZWNram9iczogd2FpdHBpZCByZXR1cm5lZCA8PSAwLCBHLmNvdW50X1NJR0NITEQ6JWQgRy5oYW5kbGVkX1NJR0NITEQ6JWQiLCBnZXRwaWQoKSwgRy5jb3VudF9TSUdDSExELCBHLmhhbmRsZWRfU0lHQ0hMRCk7CisJCQl9CisjZW5kaWYKKwkJCWJyZWFrOworCQl9CisJCWRlYWQgPSBXSUZFWElURUQoc3RhdHVzKSB8fCBXSUZTSUdOQUxFRChzdGF0dXMpOworCisjaWYgREVCVUdfSk9CUworCQlpZiAoV0lGU1RPUFBFRChzdGF0dXMpKQorCQkJZGVidWdfcHJpbnRmX2pvYnMoInBpZCAlZCBzdG9wcGVkIGJ5IHNpZyAlZCAoZXhpdGNvZGUgJWQpXG4iLAorCQkJCQljaGlsZHBpZCwgV1NUT1BTSUcoc3RhdHVzKSwgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CisJCWlmIChXSUZTSUdOQUxFRChzdGF0dXMpKQorCQkJZGVidWdfcHJpbnRmX2pvYnMoInBpZCAlZCBraWxsZWQgYnkgc2lnICVkIChleGl0Y29kZSAlZClcbiIsCisJCQkJCWNoaWxkcGlkLCBXVEVSTVNJRyhzdGF0dXMpLCBXRVhJVFNUQVRVUyhzdGF0dXMpKTsKKwkJaWYgKFdJRkVYSVRFRChzdGF0dXMpKQorCQkJZGVidWdfcHJpbnRmX2pvYnMoInBpZCAlZCBleGl0ZWQsIGV4aXRjb2RlICVkXG4iLAorCQkJCQljaGlsZHBpZCwgV0VYSVRTVEFUVVMoc3RhdHVzKSk7CisjZW5kaWYKKwkJLyogV2VyZSB3ZSBhc2tlZCB0byB3YWl0IGZvciBmZyBwaXBlPyAqLworCQlpZiAoZmdfcGlwZSkgeworCQkJaSA9IGZnX3BpcGUtPm51bV9jbWRzOworCQkJd2hpbGUgKC0taSA+PSAwKSB7CisJCQkJZGVidWdfcHJpbnRmX2pvYnMoImNoZWNrIHBpZCAlZFxuIiwgZmdfcGlwZS0+Y21kc1tpXS5waWQpOworCQkJCWlmIChmZ19waXBlLT5jbWRzW2ldLnBpZCAhPSBjaGlsZHBpZCkKKwkJCQkJY29udGludWU7CisJCQkJaWYgKGRlYWQpIHsKKwkJCQkJaW50IGV4OworCQkJCQlmZ19waXBlLT5jbWRzW2ldLnBpZCA9IDA7CisJCQkJCWZnX3BpcGUtPmFsaXZlX2NtZHMtLTsKKwkJCQkJZXggPSBXRVhJVFNUQVRVUyhzdGF0dXMpOworCQkJCQkvKiBiYXNoIHByaW50cyBraWxsZXIgc2lnbmFsJ3MgbmFtZSBmb3IgKmxhc3QqCisJCQkJCSAqIHByb2Nlc3MgaW4gcGlwZSAocHJpbnRzIGp1c3QgbmV3bGluZSBmb3IgU0lHSU5UL1NJR1BJUEUpLgorCQkJCQkgKiBNaW1pYyB0aGlzLiBFeGFtcGxlOiAic2xlZXAgNSIgKyAoXlwgb3Iga2lsbCAtUVVJVCkKKwkJCQkJICovCisJCQkJCWlmIChXSUZTSUdOQUxFRChzdGF0dXMpKSB7CisJCQkJCQlpbnQgc2lnID0gV1RFUk1TSUcoc3RhdHVzKTsKKwkJCQkJCWlmIChpID09IGZnX3BpcGUtPm51bV9jbWRzLTEpCisJCQkJCQkJLyogVE9ETzogdXNlIHN0cnNpZ25hbCgpIGluc3RlYWQgZm9yIGJhc2ggY29tcGF0PyBidXQgdGhhdCdzIGJsb2F0Li4uICovCisJCQkJCQkJcHV0cyhzaWcgPT0gU0lHSU5UIHx8IHNpZyA9PSBTSUdQSVBFID8gIiIgOiBnZXRfc2lnbmFtZShzaWcpKTsKKwkJCQkJCS8qIFRPRE86IGlmIChXQ09SRURVTVAoc3RhdHVzKSkgKyAiIChjb3JlIGR1bXBlZCkiOyAqLworCQkJCQkJLyogVE9ETzogTUlQUyBoYXMgMTI4IHNpZ3MgKDEuLjEyOCksIHdoYXQgaWYgc2lnPT0xMjggaGVyZT8KKwkJCQkJCSAqIE1heWJlIHdlIG5lZWQgdG8gdXNlIHNpZyB8IDEyOD8gKi8KKwkJCQkJCWV4ID0gc2lnICsgMTI4OworCQkJCQl9CisJCQkJCWZnX3BpcGUtPmNtZHNbaV0uY21kX2V4aXRjb2RlID0gZXg7CisJCQkJfSBlbHNlIHsKKwkJCQkJZmdfcGlwZS0+c3RvcHBlZF9jbWRzKys7CisJCQkJfQorCQkJCWRlYnVnX3ByaW50Zl9qb2JzKCJmZ19waXBlOiBhbGl2ZV9jbWRzICVkIHN0b3BwZWRfY21kcyAlZFxuIiwKKwkJCQkJCWZnX3BpcGUtPmFsaXZlX2NtZHMsIGZnX3BpcGUtPnN0b3BwZWRfY21kcyk7CisJCQkJaWYgKGZnX3BpcGUtPmFsaXZlX2NtZHMgPT0gZmdfcGlwZS0+c3RvcHBlZF9jbWRzKSB7CisJCQkJCS8qIEFsbCBwcm9jZXNzZXMgaW4gZmcgcGlwZSBoYXZlIGV4aXRlZCBvciBzdG9wcGVkICovCisJCQkJCWkgPSBmZ19waXBlLT5udW1fY21kczsKKwkJCQkJd2hpbGUgKC0taSA+PSAwKSB7CisJCQkJCQlyY29kZSA9IGZnX3BpcGUtPmNtZHNbaV0uY21kX2V4aXRjb2RlOworCQkJCQkJLyogdXN1YWxseSBsYXN0IHByb2Nlc3MgZ2l2ZXMgb3ZlcmFsbCBleGl0c3RhdHVzLAorCQkJCQkJICogYnV0IHdpdGggInNldCAtbyBwaXBlZmFpbCIsIGxhc3QgKmZhaWxlZCogcHJvY2VzcyBkb2VzICovCisJCQkJCQlpZiAoRy5vX29wdFtPUFRfT19QSVBFRkFJTF0gPT0gMCB8fCByY29kZSAhPSAwKQorCQkJCQkJCWJyZWFrOworCQkJCQl9CisJCQkJCUlGX0hBU19LRVlXT1JEUyhpZiAoZmdfcGlwZS0+cGlfaW52ZXJ0ZWQpIHJjb2RlID0gIXJjb2RlOykKKy8qIE5vdGU6ICpub24taW50ZXJhY3RpdmUqIGJhc2ggZG9lcyBub3QgY29udGludWUgaWYgYWxsIHByb2Nlc3NlcyBpbiBmZyBwaXBlCisgKiBhcmUgc3RvcHBlZC4gVGVzdGNhc2U6ICJjYXQgfCBjYXQiIGluIGEgc2NyaXB0IChub3Qgb24gY29tbWFuZCBsaW5lISkKKyAqIGFuZCAia2lsbGFsbCAtU1RPUCBjYXQiICovCisJCQkJCWlmIChHX2ludGVyYWN0aXZlX2ZkKSB7CisjaWYgRU5BQkxFX0hVU0hfSk9CCisJCQkJCQlpZiAoZmdfcGlwZS0+YWxpdmVfY21kcyAhPSAwKQorCQkJCQkJCWluc2VydF9iZ19qb2IoZmdfcGlwZSk7CisjZW5kaWYKKwkJCQkJCXJldHVybiByY29kZTsKKwkJCQkJfQorCQkJCQlpZiAoZmdfcGlwZS0+YWxpdmVfY21kcyA9PSAwKQorCQkJCQkJcmV0dXJuIHJjb2RlOworCQkJCX0KKwkJCQkvKiBUaGVyZSBhcmUgc3RpbGwgcnVubmluZyBwcm9jZXNzZXMgaW4gdGhlIGZnIHBpcGUgKi8KKwkJCQlnb3RvIHdhaXRfbW9yZTsgLyogZG8gd2FpdHBpZCBhZ2FpbiAqLworCQkJfQorCQkJLyogaXQgd2FzbnQgZmdfcGlwZSwgbG9vayBmb3IgcHJvY2VzcyBpbiBiZyBwaXBlcyAqLworCQl9CisKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwkJLyogV2UgYXNrZWQgdG8gd2FpdCBmb3IgYmcgb3Igb3JwaGFuZWQgY2hpbGRyZW4gKi8KKwkJLyogTm8gbmVlZCB0byByZW1lbWJlciBleGl0Y29kZSBpbiB0aGlzIGNhc2UgKi8KKwkJZm9yIChwaSA9IEcuam9iX2xpc3Q7IHBpOyBwaSA9IHBpLT5uZXh0KSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgcGktPm51bV9jbWRzOyBpKyspIHsKKwkJCQlpZiAocGktPmNtZHNbaV0ucGlkID09IGNoaWxkcGlkKQorCQkJCQlnb3RvIGZvdW5kX3BpX2FuZF9wcm9nbnVtOworCQkJfQorCQl9CisJCS8qIEhhcHBlbnMgd2hlbiBzaGVsbCBpcyB1c2VkIGFzIGluaXQgcHJvY2VzcyAoaW5pdD0vYmluL3NoKSAqLworCQlkZWJ1Z19wcmludGYoImNoZWNram9iczogcGlkICVkIHdhcyBub3QgaW4gb3VyIGxpc3QhXG4iLCBjaGlsZHBpZCk7CisJCWNvbnRpbnVlOyAvKiBkbyB3YWl0cGlkIGFnYWluICovCisKKyBmb3VuZF9waV9hbmRfcHJvZ251bToKKwkJaWYgKGRlYWQpIHsKKwkJCS8qIGNoaWxkIGV4aXRlZCAqLworCQkJcGktPmNtZHNbaV0ucGlkID0gMDsKKwkJCXBpLT5hbGl2ZV9jbWRzLS07CisJCQlpZiAoIXBpLT5hbGl2ZV9jbWRzKSB7CisJCQkJaWYgKEdfaW50ZXJhY3RpdmVfZmQpCisJCQkJCXByaW50ZihKT0JfU1RBVFVTX0ZPUk1BVCwgcGktPmpvYmlkLAorCQkJCQkJCSJEb25lIiwgcGktPmNtZHRleHQpOworCQkJCWRlbGV0ZV9maW5pc2hlZF9iZ19qb2IocGkpOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogY2hpbGQgc3RvcHBlZCAqLworCQkJcGktPnN0b3BwZWRfY21kcysrOworCQl9CisjZW5kaWYKKwl9IC8qIHdoaWxlICh3YWl0cGlkIHN1Y2NlZWRzKS4uLiAqLworCisJcmV0dXJuIHJjb2RlOworfQorCisjaWYgRU5BQkxFX0hVU0hfSk9CCitzdGF0aWMgaW50IGNoZWNram9ic19hbmRfZmdfc2hlbGwoc3RydWN0IHBpcGUgKmZnX3BpcGUpCit7CisJcGlkX3QgcDsKKwlpbnQgcmNvZGUgPSBjaGVja2pvYnMoZmdfcGlwZSk7CisJaWYgKEdfc2F2ZWRfdHR5X3BncnApIHsKKwkJLyogSm9iIGZpbmlzaGVkLCBtb3ZlIHRoZSBzaGVsbCB0byB0aGUgZm9yZWdyb3VuZCAqLworCQlwID0gZ2V0cGdycCgpOyAvKiBvdXIgcHJvY2VzcyBncm91cCBpZCAqLworCQlkZWJ1Z19wcmludGZfam9icygiZmcnaW5nIG91cnNlbGY6IGdldHBncnAoKT0lZFxuIiwgKGludClwKTsKKwkJdGNzZXRwZ3JwKEdfaW50ZXJhY3RpdmVfZmQsIHApOworCX0KKwlyZXR1cm4gcmNvZGU7Cit9CisjZW5kaWYKKworLyogU3RhcnQgYWxsIHRoZSBqb2JzLCBidXQgZG9uJ3Qgd2FpdCBmb3IgYW55dGhpbmcgdG8gZmluaXNoLgorICogU2VlIGNoZWNram9icygpLgorICoKKyAqIFJldHVybiBjb2RlIGlzIG5vcm1hbGx5IC0xLCB3aGVuIHRoZSBjYWxsZXIgaGFzIHRvIHdhaXQgZm9yIGNoaWxkcmVuCisgKiB0byBmaW5pc2ggdG8gZGV0ZXJtaW5lIHRoZSBleGl0IHN0YXR1cyBvZiB0aGUgcGlwZS4gIElmIHRoZSBwaXBlCisgKiBpcyBhIHNpbXBsZSBidWlsdGluIGNvbW1hbmQsIGhvd2V2ZXIsIHRoZSBhY3Rpb24gaXMgZG9uZSBieSB0aGUKKyAqIHRpbWUgcnVuX3BpcGUgcmV0dXJucywgYW5kIHRoZSBleGl0IGNvZGUgaXMgcHJvdmlkZWQgYXMgdGhlCisgKiByZXR1cm4gdmFsdWUuCisgKgorICogUmV0dXJucyAtMSBvbmx5IGlmIHN0YXJ0ZWQgc29tZSBjaGlsZHJlbi4gSU9XOiB3ZSBoYXZlIHRvCisgKiBtYXNrIG91dCByZXR2YWxzIG9mIGJ1aWx0aW5zIGV0YyB3aXRoIDB4ZmYhCisgKgorICogVGhlIG9ubHkgY2FzZSB3aGVuIHdlIGRvIG5vdCBuZWVkIHRvIFt2XWZvcmsgaXMgd2hlbiB0aGUgcGlwZQorICogaXMgc2luZ2xlLCBub24tYmFja2dyb3VuZGVkLCBub24tc3Vic2hlbGwgY29tbWFuZC4gRXhhbXBsZXM6CisgKiBjbWQgOyAuLi4gICB7IGxpc3QgfSA7IC4uLgorICogY21kICYmIC4uLiAgeyBsaXN0IH0gJiYgLi4uCisgKiBjbWQgfHwgLi4uICB7IGxpc3QgfSB8fCAuLi4KKyAqIElmIGl0IGlzLCB0aGVuIHdlIGNhbiBydW4gY21kIGFzIGEgYnVpbHRpbiwgTk9GT1JLLAorICogb3IgKGlmIFNIX1NUQU5EQUxPTkUpIGFuIGFwcGxldCwgYW5kIHdlIGNhbiBydW4gdGhlIHsgbGlzdCB9CisgKiB3aXRoIHJ1bl9saXN0LiBJZiBpdCBpc24ndCBvbmUgb2YgdGhlc2UsIHdlIGZvcmsgYW5kIGV4ZWMgY21kLgorICoKKyAqIENhc2VzIHdoZW4gd2UgbXVzdCBmb3JrOgorICogbm9uLXNpbmdsZTogICBjbWQgfCBjbWQKKyAqIGJhY2tncm91bmRlZDogY21kICYgICAgIHsgbGlzdCB9ICYKKyAqIHN1YnNoZWxsOiAgICAgKCBsaXN0ICkgWyZdCisgKi8KKyNpZiAhRU5BQkxFX0hVU0hfTU9ERV9YCisjZGVmaW5lIHJlZGlyZWN0X2FuZF92YXJleHBfaGVscGVyKG5ld19lbnZfcCwgb2xkX3ZhcnNfcCwgY29tbWFuZCwgc3F1aXJyZWwsIGFyZ3ZfZXhwYW5kZWQpIFwKKwlyZWRpcmVjdF9hbmRfdmFyZXhwX2hlbHBlcihuZXdfZW52X3AsIG9sZF92YXJzX3AsIGNvbW1hbmQsIHNxdWlycmVsKQorI2VuZGlmCitzdGF0aWMgaW50IHJlZGlyZWN0X2FuZF92YXJleHBfaGVscGVyKGNoYXIgKioqbmV3X2Vudl9wLAorCQlzdHJ1Y3QgdmFyaWFibGUgKipvbGRfdmFyc19wLAorCQlzdHJ1Y3QgY29tbWFuZCAqY29tbWFuZCwKKwkJaW50IHNxdWlycmVsWzNdLAorCQljaGFyICoqYXJndl9leHBhbmRlZCkKK3sKKwkvKiBzZXR1cF9yZWRpcmVjdHMgYWN0cyBvbiBmaWxlIGRlc2NyaXB0b3JzLCBub3QgRklMRXMuCisJICogVGhpcyBpcyBwZXJmZWN0IGZvciB3b3JrIHRoYXQgY29tZXMgYWZ0ZXIgZXhlYygpLgorCSAqIElzIGl0IHJlYWxseSBzYWZlIGZvciBpbmxpbmUgdXNlPyAgRXhwZXJpbWVudGFsbHksCisJICogdGhpbmdzIHNlZW0gdG8gd29yay4gKi8KKwlpbnQgcmNvZGUgPSBzZXR1cF9yZWRpcmVjdHMoY29tbWFuZCwgc3F1aXJyZWwpOworCWlmIChyY29kZSA9PSAwKSB7CisJCWNoYXIgKipuZXdfZW52ID0gZXhwYW5kX2Fzc2lnbm1lbnRzKGNvbW1hbmQtPmFyZ3YsIGNvbW1hbmQtPmFzc2lnbm1lbnRfY250KTsKKwkJKm5ld19lbnZfcCA9IG5ld19lbnY7CisJCWR1bXBfY21kX2luX3hfbW9kZShuZXdfZW52KTsKKwkJZHVtcF9jbWRfaW5feF9tb2RlKGFyZ3ZfZXhwYW5kZWQpOworCQlpZiAob2xkX3ZhcnNfcCkKKwkJCSpvbGRfdmFyc19wID0gc2V0X3ZhcnNfYW5kX3NhdmVfb2xkKG5ld19lbnYpOworCX0KKwlyZXR1cm4gcmNvZGU7Cit9CitzdGF0aWMgTk9JTkxJTkUgaW50IHJ1bl9waXBlKHN0cnVjdCBwaXBlICpwaSkKK3sKKwlzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbnVsbF9wdHIgPSBOVUxMOworCisJaW50IGNtZF9ubzsKKwlpbnQgbmV4dF9pbmZkOworCXN0cnVjdCBjb21tYW5kICpjb21tYW5kOworCWNoYXIgKiphcmd2X2V4cGFuZGVkOworCWNoYXIgKiphcmd2OworCS8qIGl0IGlzIG5vdCBhbHdheXMgbmVlZGVkLCBidXQgd2UgYWltIHRvIHNtYWxsZXIgY29kZSAqLworCWludCBzcXVpcnJlbFtdID0geyAtMSwgLTEsIC0xIH07CisJaW50IHJjb2RlOworCisJZGVidWdfcHJpbnRmX2V4ZWMoInJ1bl9waXBlIHN0YXJ0OiBtZW1iZXJzOiVkXG4iLCBwaS0+bnVtX2NtZHMpOworCWRlYnVnX2VudGVyKCk7CisKKwkvKiBUZXN0Y2FzZTogc2V0IC0tIHEgdyBlOyAoSUZTPScnIGVjaG8gIiQqIjsgSUZTPScnOyBlY2hvICIkKiIpOyBlY2hvICIkKiIKKwkgKiBSZXN1bHQgc2hvdWxkIGJlIDMgbGluZXM6IHEgdyBlLCBxd2UsIHEgdyBlCisJICovCisJRy5pZnMgPSBnZXRfbG9jYWxfdmFyX3ZhbHVlKCJJRlMiKTsKKwlpZiAoIUcuaWZzKQorCQlHLmlmcyA9IGRlZmlmczsKKworCUlGX0hVU0hfSk9CKHBpLT5wZ3JwID0gLTE7KQorCXBpLT5zdG9wcGVkX2NtZHMgPSAwOworCWNvbW1hbmQgPSAmcGktPmNtZHNbMF07CisJYXJndl9leHBhbmRlZCA9IE5VTEw7CisKKwlpZiAocGktPm51bV9jbWRzICE9IDEKKwkgfHwgcGktPmZvbGxvd3VwID09IFBJUEVfQkcKKwkgfHwgY29tbWFuZC0+Y21kX3R5cGUgPT0gQ01EX1NVQlNIRUxMCisJKSB7CisJCWdvdG8gbXVzdF9mb3JrOworCX0KKworCXBpLT5hbGl2ZV9jbWRzID0gMTsKKworCWRlYnVnX3ByaW50Zl9leGVjKCI6IGdyb3VwOiVwIGFyZ3Y6JyVzJ1xuIiwKKwkJY29tbWFuZC0+Z3JvdXAsIGNvbW1hbmQtPmFyZ3YgPyBjb21tYW5kLT5hcmd2WzBdIDogIk5PTkUiKTsKKworCWlmIChjb21tYW5kLT5ncm91cCkgeworI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCQlpZiAoY29tbWFuZC0+Y21kX3R5cGUgPT0gQ01EX0ZVTkNERUYpIHsKKwkJCS8qICJleGVjdXRpbmciIGZ1bmMgKCkgeyBsaXN0IH0gKi8KKwkJCXN0cnVjdCBmdW5jdGlvbiAqZnVuY3A7CisKKwkJCWZ1bmNwID0gbmV3X2Z1bmN0aW9uKGNvbW1hbmQtPmFyZ3ZbMF0pOworCQkJLyogZnVuY3AtPm5hbWUgaXMgYWxyZWFkeSBzZXQgdG8gYXJndlswXSAqLworCQkJZnVuY3AtPmJvZHkgPSBjb21tYW5kLT5ncm91cDsKKyMgaWYgIUJCX01NVQorCQkJZnVuY3AtPmJvZHlfYXNfc3RyaW5nID0gY29tbWFuZC0+Z3JvdXBfYXNfc3RyaW5nOworCQkJY29tbWFuZC0+Z3JvdXBfYXNfc3RyaW5nID0gTlVMTDsKKyMgZW5kaWYKKwkJCWNvbW1hbmQtPmdyb3VwID0gTlVMTDsKKwkJCWNvbW1hbmQtPmFyZ3ZbMF0gPSBOVUxMOworCQkJZGVidWdfcHJpbnRmX2V4ZWMoImNtZCAlcCBoYXMgY2hpbGQgZnVuYyBhdCAlcFxuIiwgY29tbWFuZCwgZnVuY3ApOworCQkJZnVuY3AtPnBhcmVudF9jbWQgPSBjb21tYW5kOworCQkJY29tbWFuZC0+Y2hpbGRfZnVuYyA9IGZ1bmNwOworCisJCQlkZWJ1Z19wcmludGZfZXhlYygicnVuX3BpcGU6IHJldHVybiBFWElUX1NVQ0NFU1NcbiIpOworCQkJZGVidWdfbGVhdmUoKTsKKwkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCX0KKyNlbmRpZgorCQkvKiB7IGxpc3QgfSAqLworCQlkZWJ1Z19wcmludGYoIm5vbi1zdWJzaGVsbCBncm91cFxuIik7CisJCXJjb2RlID0gMTsgLyogZXhpdGNvZGUgaWYgcmVkaXIgZmFpbGVkICovCisJCWlmIChzZXR1cF9yZWRpcmVjdHMoY29tbWFuZCwgc3F1aXJyZWwpID09IDApIHsKKwkJCWRlYnVnX3ByaW50Zl9leGVjKCI6IHJ1bl9saXN0XG4iKTsKKwkJCXJjb2RlID0gcnVuX2xpc3QoY29tbWFuZC0+Z3JvdXApICYgMHhmZjsKKwkJfQorCQlyZXN0b3JlX3JlZGlyZWN0cyhzcXVpcnJlbCk7CisJCUlGX0hBU19LRVlXT1JEUyhpZiAocGktPnBpX2ludmVydGVkKSByY29kZSA9ICFyY29kZTspCisJCWRlYnVnX2xlYXZlKCk7CisJCWRlYnVnX3ByaW50Zl9leGVjKCJydW5fcGlwZTogcmV0dXJuICVkXG4iLCByY29kZSk7CisJCXJldHVybiByY29kZTsKKwl9CisKKwlhcmd2ID0gY29tbWFuZC0+YXJndiA/IGNvbW1hbmQtPmFyZ3YgOiAoY2hhciAqKikgJm51bGxfcHRyOworCXsKKwkJY29uc3Qgc3RydWN0IGJ1aWx0X2luX2NvbW1hbmQgKng7CisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJCWNvbnN0IHN0cnVjdCBmdW5jdGlvbiAqZnVuY3A7CisjZWxzZQorCQllbnVtIHsgZnVuY3AgPSAwIH07CisjZW5kaWYKKwkJY2hhciAqKm5ld19lbnYgPSBOVUxMOworCQlzdHJ1Y3QgdmFyaWFibGUgKm9sZF92YXJzID0gTlVMTDsKKworCQlpZiAoYXJndltjb21tYW5kLT5hc3NpZ25tZW50X2NudF0gPT0gTlVMTCkgeworCQkJLyogQXNzaWdubWVudHMsIGJ1dCBubyBjb21tYW5kICovCisJCQkvKiBFbnN1cmUgcmVkaXJlY3RzIHRha2UgZWZmZWN0ICh0aGF0IGlzLCBjcmVhdGUgZmlsZXMpLgorCQkJICogVHJ5ICJhPXQgPmZpbGUiICovCisjaWYgMCAvKiBBIGZldyBjYXNlcyBpbiB0ZXN0c3VpdGUgZmFpbCB3aXRoIHRoaXMgY29kZS4gRklYTUUgKi8KKwkJCXJjb2RlID0gcmVkaXJlY3RfYW5kX3ZhcmV4cF9oZWxwZXIoJm5ld19lbnYsIC8qb2xkX3ZhcnM6Ki8gTlVMTCwgY29tbWFuZCwgc3F1aXJyZWwsIC8qYXJndl9leHBhbmRlZDoqLyBOVUxMKTsKKwkJCS8qIFNldCBzaGVsbCB2YXJpYWJsZXMgKi8KKwkJCWlmIChuZXdfZW52KSB7CisJCQkJYXJndiA9IG5ld19lbnY7CisJCQkJd2hpbGUgKCphcmd2KSB7CisJCQkJCXNldF9sb2NhbF92YXIoKmFyZ3YsIC8qZXhwOiovIDAsIC8qbHZsOiovIDAsIC8qcm86Ki8gMCk7CisJCQkJCS8qIERvIHdlIG5lZWQgdG8gZmxhZyBzZXRfbG9jYWxfdmFyKCkgZXJyb3JzPworCQkJCQkgKiAiYXNzaWdubWVudCB0byByZWFkb25seSB2YXIiIGFuZCAicHV0ZW52IGVycm9yIgorCQkJCQkgKi8KKwkJCQkJYXJndisrOworCQkJCX0KKwkJCX0KKwkJCS8qIFJlZGlyZWN0IGVycm9yIHNldHMgJD8gdG8gMS4gT3RoZXJ3aXNlLAorCQkJICogaWYgZXZhbHVhdGluZyBhc3NpZ25tZW50IHZhbHVlIHNldCAkPywgcmV0YWluIGl0LgorCQkJICogVHJ5ICJmYWxzZTsgcT1gZXhpdCAyYDsgZWNobyAkPyIgLSBzaG91bGQgcHJpbnQgMjogKi8KKwkJCWlmIChyY29kZSA9PSAwKQorCQkJCXJjb2RlID0gRy5sYXN0X2V4aXRjb2RlOworCQkJLyogRXhpdCwgX3NraXBwaW5nXyB2YXJpYWJsZSByZXN0b3JpbmcgY29kZTogKi8KKwkJCWdvdG8gY2xlYW5fdXBfYW5kX3JldDA7CisKKyNlbHNlIC8qIE9sZGVyLCBiaWdnZXIsIGJ1dCBtb3JlIGNvcnJlY3QgY29kZSAqLworCisJCQlyY29kZSA9IHNldHVwX3JlZGlyZWN0cyhjb21tYW5kLCBzcXVpcnJlbCk7CisJCQlyZXN0b3JlX3JlZGlyZWN0cyhzcXVpcnJlbCk7CisJCQkvKiBTZXQgc2hlbGwgdmFyaWFibGVzICovCisJCQlpZiAoR194X21vZGUpCisJCQkJYmJfcHV0Y2hhcl9zdGRlcnIoJysnKTsKKwkJCXdoaWxlICgqYXJndikgeworCQkJCWNoYXIgKnAgPSBleHBhbmRfc3RyaW5nX3RvX3N0cmluZygqYXJndiwgLyp1bmJhY2tzbGFzaDoqLyAxKTsKKwkJCQlpZiAoR194X21vZGUpCisJCQkJCWZwcmludGYoc3RkZXJyLCAiICVzIiwgcCk7CisJCQkJZGVidWdfcHJpbnRmX2V4ZWMoInNldCBzaGVsbCB2YXI6JyVzJy0+JyVzJ1xuIiwKKwkJCQkJCSphcmd2LCBwKTsKKwkJCQlzZXRfbG9jYWxfdmFyKHAsIC8qZXhwOiovIDAsIC8qbHZsOiovIDAsIC8qcm86Ki8gMCk7CisJCQkJLyogRG8gd2UgbmVlZCB0byBmbGFnIHNldF9sb2NhbF92YXIoKSBlcnJvcnM/CisJCQkJICogImFzc2lnbm1lbnQgdG8gcmVhZG9ubHkgdmFyIiBhbmQgInB1dGVudiBlcnJvciIKKwkJCQkgKi8KKwkJCQlhcmd2Kys7CisJCQl9CisJCQlpZiAoR194X21vZGUpCisJCQkJYmJfcHV0Y2hhcl9zdGRlcnIoJ1xuJyk7CisJCQkvKiBSZWRpcmVjdCBlcnJvciBzZXRzICQ/IHRvIDEuIE90aGVyd2lzZSwKKwkJCSAqIGlmIGV2YWx1YXRpbmcgYXNzaWdubWVudCB2YWx1ZSBzZXQgJD8sIHJldGFpbiBpdC4KKwkJCSAqIFRyeSAiZmFsc2U7IHE9YGV4aXQgMmA7IGVjaG8gJD8iIC0gc2hvdWxkIHByaW50IDI6ICovCisJCQlpZiAocmNvZGUgPT0gMCkKKwkJCQlyY29kZSA9IEcubGFzdF9leGl0Y29kZTsKKwkJCUlGX0hBU19LRVlXT1JEUyhpZiAocGktPnBpX2ludmVydGVkKSByY29kZSA9ICFyY29kZTspCisJCQlkZWJ1Z19sZWF2ZSgpOworCQkJZGVidWdfcHJpbnRmX2V4ZWMoInJ1bl9waXBlOiByZXR1cm4gJWRcbiIsIHJjb2RlKTsKKwkJCXJldHVybiByY29kZTsKKyNlbmRpZgorCQl9CisKKwkJLyogRXhwYW5kIHRoZSByZXN0IGludG8gKHBvc3NpYmx5KSBtYW55IHN0cmluZ3MgZWFjaCAqLworI2lmIEVOQUJMRV9IVVNIX0JBU0hfQ09NUEFUCisJCWlmIChjb21tYW5kLT5jbWRfdHlwZSA9PSBDTURfU0lOR0xFV09SRF9OT0dMT0IpIHsKKwkJCWFyZ3ZfZXhwYW5kZWQgPSBleHBhbmRfc3RydmVjX3RvX3N0cnZlY19zaW5nbGV3b3JkX25vZ2xvYihhcmd2ICsgY29tbWFuZC0+YXNzaWdubWVudF9jbnQpOworCQl9IGVsc2UKKyNlbmRpZgorCQl7CisJCQlhcmd2X2V4cGFuZGVkID0gZXhwYW5kX3N0cnZlY190b19zdHJ2ZWMoYXJndiArIGNvbW1hbmQtPmFzc2lnbm1lbnRfY250KTsKKwkJfQorCisJCS8qIGlmIHNvbWVvbmUgZ2l2ZXMgdXMgYW4gZW1wdHkgc3RyaW5nOiBgY21kIHdpdGggZW1wdHkgb3V0cHV0YCAqLworCQlpZiAoIWFyZ3ZfZXhwYW5kZWRbMF0pIHsKKwkJCWZyZWUoYXJndl9leHBhbmRlZCk7CisJCQlkZWJ1Z19sZWF2ZSgpOworCQkJcmV0dXJuIEcubGFzdF9leGl0Y29kZTsKKwkJfQorCisJCXggPSBmaW5kX2J1aWx0aW4oYXJndl9leHBhbmRlZFswXSk7CisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJCWZ1bmNwID0gTlVMTDsKKwkJaWYgKCF4KQorCQkJZnVuY3AgPSBmaW5kX2Z1bmN0aW9uKGFyZ3ZfZXhwYW5kZWRbMF0pOworI2VuZGlmCisJCWlmICh4IHx8IGZ1bmNwKSB7CisJCQlpZiAoIWZ1bmNwKSB7CisJCQkJaWYgKHgtPmJfZnVuY3Rpb24gPT0gYnVpbHRpbl9leGVjICYmIGFyZ3ZfZXhwYW5kZWRbMV0gPT0gTlVMTCkgeworCQkJCQlkZWJ1Z19wcmludGYoImV4ZWMgd2l0aCByZWRpcmVjdHMgb25seVxuIik7CisJCQkJCXJjb2RlID0gc2V0dXBfcmVkaXJlY3RzKGNvbW1hbmQsIE5VTEwpOworCQkJCQlnb3RvIGNsZWFuX3VwX2FuZF9yZXQxOworCQkJCX0KKwkJCX0KKwkJCXJjb2RlID0gcmVkaXJlY3RfYW5kX3ZhcmV4cF9oZWxwZXIoJm5ld19lbnYsICZvbGRfdmFycywgY29tbWFuZCwgc3F1aXJyZWwsIGFyZ3ZfZXhwYW5kZWQpOworCQkJaWYgKHJjb2RlID09IDApIHsKKwkJCQlpZiAoIWZ1bmNwKSB7CisJCQkJCWRlYnVnX3ByaW50Zl9leGVjKCI6IGJ1aWx0aW4gJyVzJyAnJXMnLi4uXG4iLAorCQkJCQkJeC0+Yl9jbWQsIGFyZ3ZfZXhwYW5kZWRbMV0pOworCQkJCQlmZmx1c2hfYWxsKCk7CisJCQkJCXJjb2RlID0geC0+Yl9mdW5jdGlvbihhcmd2X2V4cGFuZGVkKSAmIDB4ZmY7CisJCQkJCWZmbHVzaF9hbGwoKTsKKwkJCQl9CisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJCQkJZWxzZSB7CisjIGlmIEVOQUJMRV9IVVNIX0xPQ0FMCisJCQkJCXN0cnVjdCB2YXJpYWJsZSAqKnN2OworCQkJCQlzdiA9IEcuc2hhZG93ZWRfdmFyc19wcDsKKwkJCQkJRy5zaGFkb3dlZF92YXJzX3BwID0gJm9sZF92YXJzOworIyBlbmRpZgorCQkJCQlkZWJ1Z19wcmludGZfZXhlYygiOiBmdW5jdGlvbiAnJXMnICclcycuLi5cbiIsCisJCQkJCQlmdW5jcC0+bmFtZSwgYXJndl9leHBhbmRlZFsxXSk7CisJCQkJCXJjb2RlID0gcnVuX2Z1bmN0aW9uKGZ1bmNwLCBhcmd2X2V4cGFuZGVkKSAmIDB4ZmY7CisjIGlmIEVOQUJMRV9IVVNIX0xPQ0FMCisJCQkJCUcuc2hhZG93ZWRfdmFyc19wcCA9IHN2OworIyBlbmRpZgorCQkJCX0KKyNlbmRpZgorCQkJfQorIGNsZWFuX3VwX2FuZF9yZXQ6CisJCQl1bnNldF92YXJzKG5ld19lbnYpOworCQkJYWRkX3ZhcnMob2xkX3ZhcnMpOworLyogY2xlYW5fdXBfYW5kX3JldDA6ICovCisJCQlyZXN0b3JlX3JlZGlyZWN0cyhzcXVpcnJlbCk7CisgY2xlYW5fdXBfYW5kX3JldDE6CisJCQlmcmVlKGFyZ3ZfZXhwYW5kZWQpOworCQkJSUZfSEFTX0tFWVdPUkRTKGlmIChwaS0+cGlfaW52ZXJ0ZWQpIHJjb2RlID0gIXJjb2RlOykKKwkJCWRlYnVnX2xlYXZlKCk7CisJCQlkZWJ1Z19wcmludGZfZXhlYygicnVuX3BpcGUgcmV0dXJuICVkXG4iLCByY29kZSk7CisJCQlyZXR1cm4gcmNvZGU7CisJCX0KKworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfU0hfTk9GT1JLKSB7CisJCQlpbnQgbiA9IGZpbmRfYXBwbGV0X2J5X25hbWUoYXJndl9leHBhbmRlZFswXSk7CisJCQlpZiAobiA+PSAwICYmIEFQUExFVF9JU19OT0ZPUksobikpIHsKKwkJCQlyY29kZSA9IHJlZGlyZWN0X2FuZF92YXJleHBfaGVscGVyKCZuZXdfZW52LCAmb2xkX3ZhcnMsIGNvbW1hbmQsIHNxdWlycmVsLCBhcmd2X2V4cGFuZGVkKTsKKwkJCQlpZiAocmNvZGUgPT0gMCkgeworCQkJCQlkZWJ1Z19wcmludGZfZXhlYygiOiBydW5fbm9mb3JrX2FwcGxldCAnJXMnICclcycuLi5cbiIsCisJCQkJCQlhcmd2X2V4cGFuZGVkWzBdLCBhcmd2X2V4cGFuZGVkWzFdKTsKKwkJCQkJcmNvZGUgPSBydW5fbm9mb3JrX2FwcGxldChuLCBhcmd2X2V4cGFuZGVkKTsKKwkJCQl9CisJCQkJZ290byBjbGVhbl91cF9hbmRfcmV0OworCQkJfQorCQl9CisJCS8qIEl0IGlzIG5laXRoZXIgYnVpbHRpbiBub3IgYXBwbGV0LiBXZSBtdXN0IGZvcmsuICovCisJfQorCisgbXVzdF9mb3JrOgorCS8qIE5COiBhcmd2X2V4cGFuZGVkIG1heSBhbHJlYWR5IGJlIGNyZWF0ZWQsIGFuZCB0aGF0CisJICogbWlnaHQgaW5jbHVkZSBgY21kYCBydW5zISBEbyBub3QgcmVydW4gaXQhIFdlICptdXN0KgorCSAqIHVzZSBhcmd2X2V4cGFuZGVkIGlmIGl0J3Mgbm9uLU5VTEwgKi8KKworCS8qIEdvaW5nIHRvIGZvcmsgYSBjaGlsZCBwZXIgZWFjaCBwaXBlIG1lbWJlciAqLworCXBpLT5hbGl2ZV9jbWRzID0gMDsKKwluZXh0X2luZmQgPSAwOworCisJY21kX25vID0gMDsKKwl3aGlsZSAoY21kX25vIDwgcGktPm51bV9jbWRzKSB7CisJCXN0cnVjdCBmZF9wYWlyIHBpcGVmZHM7CisjaWYgIUJCX01NVQorCQl2b2xhdGlsZSBub21tdV9zYXZlX3Qgbm9tbXVfc2F2ZTsKKwkJbm9tbXVfc2F2ZS5uZXdfZW52ID0gTlVMTDsKKwkJbm9tbXVfc2F2ZS5vbGRfdmFycyA9IE5VTEw7CisJCW5vbW11X3NhdmUuYXJndiA9IE5VTEw7CisJCW5vbW11X3NhdmUuYXJndl9mcm9tX3JlX2V4ZWNpbmcgPSBOVUxMOworI2VuZGlmCisJCWNvbW1hbmQgPSAmcGktPmNtZHNbY21kX25vXTsKKwkJY21kX25vKys7CisJCWlmIChjb21tYW5kLT5hcmd2KSB7CisJCQlkZWJ1Z19wcmludGZfZXhlYygiOiBwaXBlIG1lbWJlciAnJXMnICclcycuLi5cbiIsCisJCQkJCWNvbW1hbmQtPmFyZ3ZbMF0sIGNvbW1hbmQtPmFyZ3ZbMV0pOworCQl9IGVsc2UgeworCQkJZGVidWdfcHJpbnRmX2V4ZWMoIjogcGlwZSBtZW1iZXIgd2l0aCBubyBhcmd2XG4iKTsKKwkJfQorCisJCS8qIHBpcGVzIGFyZSBpbnNlcnRlZCBiZXR3ZWVuIHBhaXJzIG9mIGNvbW1hbmRzICovCisJCXBpcGVmZHMucmQgPSAwOworCQlwaXBlZmRzLndyID0gMTsKKwkJaWYgKGNtZF9ubyA8IHBpLT5udW1fY21kcykKKwkJCXhwaXBlZF9wYWlyKHBpcGVmZHMpOworCisJCWNvbW1hbmQtPnBpZCA9IEJCX01NVSA/IGZvcmsoKSA6IHZmb3JrKCk7CisJCWlmICghY29tbWFuZC0+cGlkKSB7IC8qIGNoaWxkICovCisjaWYgRU5BQkxFX0hVU0hfSk9CCisJCQlkaXNhYmxlX3Jlc3RvcmVfdHR5X3BncnBfb25fZXhpdCgpOworCQkJQ0xFQVJfUkFORE9NX1QoJkcucmFuZG9tX2dlbik7IC8qIG9yIGVsc2UgJFJBTkRPTSByZXBlYXRzIGluIGNoaWxkICovCisKKwkJCS8qIEV2ZXJ5IGNoaWxkIGFkZHMgaXRzZWxmIHRvIG5ldyBwcm9jZXNzIGdyb3VwCisJCQkgKiB3aXRoIHBnaWQgPT0gcGlkX29mX2ZpcnN0X2NoaWxkX2luX3BpcGUgKi8KKwkJCWlmIChHLnJ1bl9saXN0X2xldmVsID09IDEgJiYgR19pbnRlcmFjdGl2ZV9mZCkgeworCQkJCXBpZF90IHBncnA7CisJCQkJcGdycCA9IHBpLT5wZ3JwOworCQkJCWlmIChwZ3JwIDwgMCkgLyogdHJ1ZSBmb3IgMXN0IHByb2Nlc3Mgb25seSAqLworCQkJCQlwZ3JwID0gZ2V0cGlkKCk7CisJCQkJaWYgKHNldHBnaWQoMCwgcGdycCkgPT0gMAorCQkJCSAmJiBwaS0+Zm9sbG93dXAgIT0gUElQRV9CRworCQkJCSAmJiBHX3NhdmVkX3R0eV9wZ3JwIC8qIHdlIGhhdmUgY3R0eSAqLworCQkJCSkgeworCQkJCQkvKiBXZSBkbyBpdCBpbiAqZXZlcnkqIGNoaWxkLCBub3QganVzdCBmaXJzdCwKKwkJCQkJICogdG8gYXZvaWQgcmFjZXMgKi8KKwkJCQkJdGNzZXRwZ3JwKEdfaW50ZXJhY3RpdmVfZmQsIHBncnApOworCQkJCX0KKwkJCX0KKyNlbmRpZgorCQkJaWYgKHBpLT5hbGl2ZV9jbWRzID09IDAgJiYgcGktPmZvbGxvd3VwID09IFBJUEVfQkcpIHsKKwkJCQkvKiAxc3QgY21kIGluIGJhY2tncm91bmRlZCBwaXBlCisJCQkJICogc2hvdWxkIGhhdmUgaXRzIHN0ZGluIC9kZXYvbnVsbCdlZCAqLworCQkJCWNsb3NlKDApOworCQkJCWlmIChvcGVuKGJiX2Rldl9udWxsLCBPX1JET05MWSkpCisJCQkJCXhvcGVuKCIvIiwgT19SRE9OTFkpOworCQkJfSBlbHNlIHsKKwkJCQl4bW92ZV9mZChuZXh0X2luZmQsIDApOworCQkJfQorCQkJeG1vdmVfZmQocGlwZWZkcy53ciwgMSk7CisJCQlpZiAocGlwZWZkcy5yZCA+IDEpCisJCQkJY2xvc2UocGlwZWZkcy5yZCk7CisJCQkvKiBMaWtlIGJhc2gsIGV4cGxpY2l0IHJlZGlyZWN0cyBvdmVycmlkZSBwaXBlcywKKwkJCSAqIGFuZCB0aGUgcGlwZSBmZCBpcyBhdmFpbGFibGUgZm9yIGR1cCdpbmcuICovCisJCQlpZiAoc2V0dXBfcmVkaXJlY3RzKGNvbW1hbmQsIE5VTEwpKQorCQkJCV9leGl0KDEpOworCisJCQkvKiBTdG9yZXMgdG8gbm9tbXVfc2F2ZSBsaXN0IG9mIGVudiB2YXJzIHB1dGVudidlZAorCQkJICogKE5PTU1VLCBvbiBNTVUgd2UgZG9uJ3QgbmVlZCB0aGF0KSAqLworCQkJLyogY2FzdCBhd2F5IHZvbGF0aWxpdHkuLi4gKi8KKwkJCXBzZXVkb19leGVjKChub21tdV9zYXZlX3QqKSAmbm9tbXVfc2F2ZSwgY29tbWFuZCwgYXJndl9leHBhbmRlZCk7CisJCQkvKiBwc2V1ZG9fZXhlYygpIGRvZXMgbm90IHJldHVybiAqLworCQl9CisKKwkJLyogcGFyZW50IG9yIGVycm9yICovCisjaWYgRU5BQkxFX0hVU0hfRkFTVAorCQlHLmNvdW50X1NJR0NITEQrKzsKKy8vYmJfZXJyb3JfbXNnKCJbJWRdIGZvcmsgaW4gcnVuX3BpcGU6IEcuY291bnRfU0lHQ0hMRDolZCBHLmhhbmRsZWRfU0lHQ0hMRDolZCIsIGdldHBpZCgpLCBHLmNvdW50X1NJR0NITEQsIEcuaGFuZGxlZF9TSUdDSExEKTsKKyNlbmRpZgorCQllbmFibGVfcmVzdG9yZV90dHlfcGdycF9vbl9leGl0KCk7CisjaWYgIUJCX01NVQorCQkvKiBDbGVhbiB1cCBhZnRlciB2Zm9ya2VkIGNoaWxkICovCisJCWZyZWUobm9tbXVfc2F2ZS5hcmd2KTsKKwkJZnJlZShub21tdV9zYXZlLmFyZ3ZfZnJvbV9yZV9leGVjaW5nKTsKKwkJdW5zZXRfdmFycyhub21tdV9zYXZlLm5ld19lbnYpOworCQlhZGRfdmFycyhub21tdV9zYXZlLm9sZF92YXJzKTsKKyNlbmRpZgorCQlmcmVlKGFyZ3ZfZXhwYW5kZWQpOworCQlhcmd2X2V4cGFuZGVkID0gTlVMTDsKKwkJaWYgKGNvbW1hbmQtPnBpZCA8IDApIHsgLyogW3ZdZm9yayBmYWlsZWQgKi8KKwkJCS8qIENsZWFybHkgaW5kaWNhdGUsIHdhcyBpdCBmb3JrIG9yIHZmb3JrICovCisJCQliYl9wZXJyb3JfbXNnKEJCX01NVSA/ICJ2Zm9yayIrMSA6ICJ2Zm9yayIpOworCQl9IGVsc2UgeworCQkJcGktPmFsaXZlX2NtZHMrKzsKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwkJCS8qIFNlY29uZCBhbmQgbmV4dCBjaGlsZHJlbiBuZWVkIHRvIGtub3cgcGlkIG9mIGZpcnN0IG9uZSAqLworCQkJaWYgKHBpLT5wZ3JwIDwgMCkKKwkJCQlwaS0+cGdycCA9IGNvbW1hbmQtPnBpZDsKKyNlbmRpZgorCQl9CisKKwkJaWYgKGNtZF9ubyA+IDEpCisJCQljbG9zZShuZXh0X2luZmQpOworCQlpZiAoY21kX25vIDwgcGktPm51bV9jbWRzKQorCQkJY2xvc2UocGlwZWZkcy53cik7CisJCS8qIFBhc3MgcmVhZCAob3V0cHV0KSBwaXBlIGVuZCB0byBuZXh0IGl0ZXJhdGlvbiAqLworCQluZXh0X2luZmQgPSBwaXBlZmRzLnJkOworCX0KKworCWlmICghcGktPmFsaXZlX2NtZHMpIHsKKwkJZGVidWdfbGVhdmUoKTsKKwkJZGVidWdfcHJpbnRmX2V4ZWMoInJ1bl9waXBlIHJldHVybiAxIChhbGwgZm9ya3MgZmFpbGVkLCBubyBjaGlsZHJlbilcbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkZWJ1Z19sZWF2ZSgpOworCWRlYnVnX3ByaW50Zl9leGVjKCJydW5fcGlwZSByZXR1cm4gLTEgKCV1IGNoaWxkcmVuIHN0YXJ0ZWQpXG4iLCBwaS0+YWxpdmVfY21kcyk7CisJcmV0dXJuIC0xOworfQorCisvKiBOQjogY2FsbGVkIGJ5IHBzZXVkb19leGVjLCBhbmQgdGhlcmVmb3JlIG11c3Qgbm90IG1vZGlmeSBhbnkKKyAqIGdsb2JhbCBkYXRhIHVudGlsIGV4ZWMvX2V4aXQgKHdlIGNhbiBiZSBhIGNoaWxkIGFmdGVyIHZmb3JrISkgKi8KK3N0YXRpYyBpbnQgcnVuX2xpc3Qoc3RydWN0IHBpcGUgKnBpKQoreworI2lmIEVOQUJMRV9IVVNIX0NBU0UKKwljaGFyICpjYXNlX3dvcmQgPSBOVUxMOworI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfTE9PUFMKKwlzdHJ1Y3QgcGlwZSAqbG9vcF90b3AgPSBOVUxMOworCWNoYXIgKipmb3JfbGN1ciA9IE5VTEw7CisJY2hhciAqKmZvcl9saXN0ID0gTlVMTDsKKyNlbmRpZgorCXNtYWxsaW50IGxhc3RfZm9sbG93dXA7CisJc21hbGx1aW50IHJjb2RlOworI2lmIEVOQUJMRV9IVVNIX0lGIHx8IEVOQUJMRV9IVVNIX0NBU0UKKwlzbWFsbHVpbnQgY29uZF9jb2RlID0gMDsKKyNlbHNlCisJZW51bSB7IGNvbmRfY29kZSA9IDAgfTsKKyNlbmRpZgorI2lmIEhBU19LRVlXT1JEUworCXNtYWxsaW50IHJ3b3JkOyAgICAgIC8qIFJFU19mb28gKi8KKwlzbWFsbGludCBsYXN0X3J3b3JkOyAvKiBkaXR0byAqLworI2VuZGlmCisKKwlkZWJ1Z19wcmludGZfZXhlYygicnVuX2xpc3Qgc3RhcnQgbHZsICVkXG4iLCBHLnJ1bl9saXN0X2xldmVsKTsKKwlkZWJ1Z19lbnRlcigpOworCisjaWYgRU5BQkxFX0hVU0hfTE9PUFMKKwkvKiBDaGVjayBzeW50YXggZm9yICJmb3IiICovCisJeworCQlzdHJ1Y3QgcGlwZSAqY3BpcGU7CisJCWZvciAoY3BpcGUgPSBwaTsgY3BpcGU7IGNwaXBlID0gY3BpcGUtPm5leHQpIHsKKwkJCWlmIChjcGlwZS0+cmVzX3dvcmQgIT0gUkVTX0ZPUiAmJiBjcGlwZS0+cmVzX3dvcmQgIT0gUkVTX0lOKQorCQkJCWNvbnRpbnVlOworCQkJLyogY3VycmVudCB3b3JkIGlzIEZPUiBvciBJTiAoQk9MRCBpbiBjb21tZW50cyBiZWxvdykgKi8KKwkJCWlmIChjcGlwZS0+bmV4dCA9PSBOVUxMKSB7CisJCQkJc3ludGF4X2Vycm9yKCJtYWxmb3JtZWQgZm9yIik7CisJCQkJZGVidWdfbGVhdmUoKTsKKwkJCQlkZWJ1Z19wcmludGZfZXhlYygicnVuX2xpc3QgbHZsICVkIHJldHVybiAxXG4iLCBHLnJ1bl9saXN0X2xldmVsKTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKwkJCS8qICJGT1IgdjsgZG8gLi4uIiBhbmQgImZvciB2IElOIGEgYjsgZG8uLi4iIGFyZSBvayAqLworCQkJaWYgKGNwaXBlLT5uZXh0LT5yZXNfd29yZCA9PSBSRVNfRE8pCisJCQkJY29udGludWU7CisJCQkvKiBuZXh0IHdvcmQgaXMgbm90ICJkbyIuIEl0IG11c3QgYmUgImluIiB0aGVuICgiRk9SIHYgaW4gLi4uIikgKi8KKwkJCWlmIChjcGlwZS0+cmVzX3dvcmQgPT0gUkVTX0lOIC8qICJmb3IgdiBJTiBhIGI7IG5vdF9kby4uLiI/ICovCisJCQkgfHwgY3BpcGUtPm5leHQtPnJlc193b3JkICE9IFJFU19JTiAvKiBGT1IgdiBub3RfZG9fYW5kX25vdF9pbi4uLiI/ICovCisJCQkpIHsKKwkJCQlzeW50YXhfZXJyb3IoIm1hbGZvcm1lZCBmb3IiKTsKKwkJCQlkZWJ1Z19sZWF2ZSgpOworCQkJCWRlYnVnX3ByaW50Zl9leGVjKCJydW5fbGlzdCBsdmwgJWQgcmV0dXJuIDFcbiIsIEcucnVuX2xpc3RfbGV2ZWwpOworCQkJCXJldHVybiAxOworCQkJfQorCQl9CisJfQorI2VuZGlmCisKKwkvKiBQYXN0IHRoaXMgcG9pbnQsIGFsbCBjb2RlIHBhdGhzIHNob3VsZCBqdW1wIHRvIHJldDogbGFiZWwKKwkgKiBpbiBvcmRlciB0byByZXR1cm4sIG5vIGRpcmVjdCAicmV0dXJuIiBzdGF0ZW1lbnRzIHBsZWFzZS4KKwkgKiBUaGlzIGhlbHBzIHRvIGVuc3VyZSB0aGF0IG5vIG1lbW9yeSBpcyBsZWFrZWQuICovCisKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwlHLnJ1bl9saXN0X2xldmVsKys7CisjZW5kaWYKKworI2lmIEhBU19LRVlXT1JEUworCXJ3b3JkID0gUkVTX05PTkU7CisJbGFzdF9yd29yZCA9IFJFU19YWFhYOworI2VuZGlmCisJbGFzdF9mb2xsb3d1cCA9IFBJUEVfU0VROworCXJjb2RlID0gRy5sYXN0X2V4aXRjb2RlOworCisJLyogR28gdGhyb3VnaCBsaXN0IG9mIHBpcGVzLCAobWF5YmUpIGV4ZWN1dGluZyB0aGVtLiAqLworCWZvciAoOyBwaTsgcGkgPSBJRl9IVVNIX0xPT1BTKHJ3b3JkID09IFJFU19ET05FID8gbG9vcF90b3AgOiApIHBpLT5uZXh0KSB7CisJCWlmIChHLmZsYWdfU0lHSU5UKQorCQkJYnJlYWs7CisKKwkJSUZfSEFTX0tFWVdPUkRTKHJ3b3JkID0gcGktPnJlc193b3JkOykKKwkJZGVidWdfcHJpbnRmX2V4ZWMoIjogcndvcmQ9JWQgY29uZF9jb2RlPSVkIGxhc3RfcndvcmQ9JWRcbiIsCisJCQkJcndvcmQsIGNvbmRfY29kZSwgbGFzdF9yd29yZCk7CisjaWYgRU5BQkxFX0hVU0hfTE9PUFMKKwkJaWYgKChyd29yZCA9PSBSRVNfV0hJTEUgfHwgcndvcmQgPT0gUkVTX1VOVElMIHx8IHJ3b3JkID09IFJFU19GT1IpCisJCSAmJiBsb29wX3RvcCA9PSBOVUxMIC8qIGF2b2lkIGJ1bXBpbmcgRy5kZXB0aF9vZl9sb29wIHR3aWNlICovCisJCSkgeworCQkJLyogc3RhcnQgb2YgYSBsb29wOiByZW1lbWJlciB3aGVyZSBsb29wIHN0YXJ0cyAqLworCQkJbG9vcF90b3AgPSBwaTsKKwkJCUcuZGVwdGhfb2ZfbG9vcCsrOworCQl9CisjZW5kaWYKKwkJLyogU3RpbGwgaW4gdGhlIHNhbWUgImlmLi4uIiwgInRoZW4uLi4iIG9yICJkby4uLiIgYnJhbmNoPyAqLworCQlpZiAoSUZfSEFTX0tFWVdPUkRTKHJ3b3JkID09IGxhc3RfcndvcmQgJiYpIDEpIHsKKwkJCWlmICgocmNvZGUgPT0gMCAmJiBsYXN0X2ZvbGxvd3VwID09IFBJUEVfT1IpCisJCQkgfHwgKHJjb2RlICE9IDAgJiYgbGFzdF9mb2xsb3d1cCA9PSBQSVBFX0FORCkKKwkJCSkgeworCQkJCS8qIEl0IGlzICI8dHJ1ZT4gfHwgQ01EIiBvciAiPGZhbHNlPiAmJiBDTUQiCisJCQkJICogYW5kIHdlIHNob3VsZCBub3QgZXhlY3V0ZSBDTUQgKi8KKwkJCQlkZWJ1Z19wcmludGZfZXhlYygic2tpcHBlZCBjbWQgYmVjYXVzZSBvZiB8fCBvciAmJlxuIik7CisJCQkJbGFzdF9mb2xsb3d1cCA9IHBpLT5mb2xsb3d1cDsKKwkJCQlnb3RvIGRvbnRfY2hlY2tfam9ic19idXRfY29udGludWU7CisJCQl9CisJCX0KKwkJbGFzdF9mb2xsb3d1cCA9IHBpLT5mb2xsb3d1cDsKKwkJSUZfSEFTX0tFWVdPUkRTKGxhc3RfcndvcmQgPSByd29yZDspCisjaWYgRU5BQkxFX0hVU0hfSUYKKwkJaWYgKGNvbmRfY29kZSkgeworCQkJaWYgKHJ3b3JkID09IFJFU19USEVOKSB7CisJCQkJLyogaWYgZmFsc2U7IHRoZW4gLi4uIGZpIGhhcyBleGl0Y29kZSAwISAqLworCQkJCUcubGFzdF9leGl0Y29kZSA9IHJjb2RlID0gRVhJVF9TVUNDRVNTOworCQkJCS8qICJpZiA8ZmFsc2U+IFRIRU4gY21kIjogc2tpcCBjbWQgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCWlmIChyd29yZCA9PSBSRVNfRUxTRSB8fCByd29yZCA9PSBSRVNfRUxJRikgeworCQkJCS8qICJpZiA8dHJ1ZT4gdGhlbiAuLi4gRUxTRS9FTElGIGNtZCI6CisJCQkJICogc2tpcCBjbWQgYW5kIGFsbCBmb2xsb3dpbmcgb25lcyAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisjZW5kaWYKKyNpZiBFTkFCTEVfSFVTSF9MT09QUworCQlpZiAocndvcmQgPT0gUkVTX0ZPUikgeyAvKiAmJiBwaS0+bnVtX2NtZHMgLSBhbHdheXMgPT0gMSAqLworCQkJaWYgKCFmb3JfbGN1cikgeworCQkJCS8qIGZpcnN0IGxvb3AgdGhyb3VnaCBmb3IgKi8KKworCQkJCXN0YXRpYyBjb25zdCBjaGFyIGVuY29kZWRfZG9sbGFyX2F0W10gQUxJR04xID0geworCQkJCQlTUEVDSUFMX1ZBUl9TWU1CT0wsICdAJyB8IDB4ODAsIFNQRUNJQUxfVkFSX1NZTUJPTCwgJ1wwJworCQkJCX07IC8qIGVuY29kZWQgcmVwcmVzZW50YXRpb24gb2YgIiRAIiAqLworCQkJCXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBlbmNvZGVkX2RvbGxhcl9hdF9hcmd2W10gPSB7CisJCQkJCWVuY29kZWRfZG9sbGFyX2F0LCBOVUxMCisJCQkJfTsgLyogYXJndiBsaXN0IHdpdGggb25lIGVsZW1lbnQ6ICIkQCIgKi8KKwkJCQljaGFyICoqdmFsczsKKworCQkJCXZhbHMgPSAoY2hhcioqKWVuY29kZWRfZG9sbGFyX2F0X2FyZ3Y7CisJCQkJaWYgKHBpLT5uZXh0LT5yZXNfd29yZCA9PSBSRVNfSU4pIHsKKwkJCQkJLyogaWYgbm8gdmFyaWFibGUgdmFsdWVzIGFmdGVyICJpbiIgd2Ugc2tpcCAiZm9yIiAqLworCQkJCQlpZiAoIXBpLT5uZXh0LT5jbWRzWzBdLmFyZ3YpIHsKKwkJCQkJCUcubGFzdF9leGl0Y29kZSA9IHJjb2RlID0gRVhJVF9TVUNDRVNTOworCQkJCQkJZGVidWdfcHJpbnRmX2V4ZWMoIjogbnVsbCBGT1I6IGV4aXRjb2RlIEVYSVRfU1VDQ0VTU1xuIik7CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCQl2YWxzID0gcGktPm5leHQtPmNtZHNbMF0uYXJndjsKKwkJCQl9IC8qIGVsc2U6ICJmb3IgdmFyOyBkby4uLiIgLT4gYXNzdW1lICIkQCIgbGlzdCAqLworCQkJCS8qIGNyZWF0ZSBsaXN0IG9mIHZhcmlhYmxlIHZhbHVlcyAqLworCQkJCWRlYnVnX3ByaW50X3N0cmluZ3MoImZvcl9saXN0IG1hZGUgZnJvbSIsIHZhbHMpOworCQkJCWZvcl9saXN0ID0gZXhwYW5kX3N0cnZlY190b19zdHJ2ZWModmFscyk7CisJCQkJZm9yX2xjdXIgPSBmb3JfbGlzdDsKKwkJCQlkZWJ1Z19wcmludF9zdHJpbmdzKCJmb3JfbGlzdCIsIGZvcl9saXN0KTsKKwkJCX0KKwkJCWlmICghKmZvcl9sY3VyKSB7CisJCQkJLyogImZvciIgbG9vcCBpcyBvdmVyLCBjbGVhbiB1cCAqLworCQkJCWZyZWUoZm9yX2xpc3QpOworCQkJCWZvcl9saXN0ID0gTlVMTDsKKwkJCQlmb3JfbGN1ciA9IE5VTEw7CisJCQkJYnJlYWs7CisJCQl9CisJCQkvKiBJbnNlcnQgbmV4dCB2YWx1ZSBmcm9tIGZvcl9sY3VyICovCisJCQkvKiBub3RlOiAqZm9yX2xjdXIgYWxyZWFkeSBoYXMgcXVvdGVzIHJlbW92ZWQsICR2YXIgZXhwYW5kZWQsIGV0YyAqLworCQkJc2V0X2xvY2FsX3Zhcih4YXNwcmludGYoIiVzPSVzIiwgcGktPmNtZHNbMF0uYXJndlswXSwgKmZvcl9sY3VyKyspLCAvKmV4cDoqLyAwLCAvKmx2bDoqLyAwLCAvKnJvOiovIDApOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKHJ3b3JkID09IFJFU19JTikgeworCQkJY29udGludWU7IC8qICJmb3IgdiBJTiBsaXN0Oy4uLiIgLSAiaW4iIGhhcyBubyBjbWRzIGFueXdheSAqLworCQl9CisJCWlmIChyd29yZCA9PSBSRVNfRE9ORSkgeworCQkJY29udGludWU7IC8qICJkb25lIiBoYXMgbm8gY21kcyB0b28gKi8KKwkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfQ0FTRQorCQlpZiAocndvcmQgPT0gUkVTX0NBU0UpIHsKKwkJCWNhc2Vfd29yZCA9IGV4cGFuZF9zdHJ2ZWNfdG9fc3RyaW5nKHBpLT5jbWRzLT5hcmd2KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChyd29yZCA9PSBSRVNfTUFUQ0gpIHsKKwkJCWNoYXIgKiphcmd2OworCisJCQlpZiAoIWNhc2Vfd29yZCkgLyogImNhc2UgLi4uIG1hdGNoZWRfd29yZCkgLi4uIFdPUkQpIjogd2UgZXhlY3V0ZWQgc2VsZWN0ZWQgYnJhbmNoLCBzdG9wICovCisJCQkJYnJlYWs7CisJCQkvKiBhbGwgcHJldiB3b3JkcyBkaWRuJ3QgbWF0Y2gsIGRvZXMgdGhpcyBvbmUgbWF0Y2g/ICovCisJCQlhcmd2ID0gcGktPmNtZHMtPmFyZ3Y7CisJCQl3aGlsZSAoKmFyZ3YpIHsKKwkJCQljaGFyICpwYXR0ZXJuID0gZXhwYW5kX3N0cmluZ190b19zdHJpbmcoKmFyZ3YsIC8qdW5iYWNrc2xhc2g6Ki8gMSk7CisJCQkJLyogVE9ETzogd2hpY2ggRk5NX3h4eCBmbGFncyB0byB1c2U/ICovCisJCQkJY29uZF9jb2RlID0gKGZubWF0Y2gocGF0dGVybiwgY2FzZV93b3JkLCAvKmZsYWdzOiovIDApICE9IDApOworCQkJCWZyZWUocGF0dGVybik7CisJCQkJaWYgKGNvbmRfY29kZSA9PSAwKSB7IC8qIG1hdGNoISB3ZSB3aWxsIGV4ZWN1dGUgdGhpcyBicmFuY2ggKi8KKwkJCQkJZnJlZShjYXNlX3dvcmQpOyAvKiBtYWtlIGZ1dHVyZSAid29yZCkiIHN0b3AgKi8KKwkJCQkJY2FzZV93b3JkID0gTlVMTDsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJCWFyZ3YrKzsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChyd29yZCA9PSBSRVNfQ0FTRV9CT0RZKSB7IC8qIGluc2lkZSBvZiBhIGNhc2UgYnJhbmNoICovCisJCQlpZiAoY29uZF9jb2RlICE9IDApCisJCQkJY29udGludWU7IC8qIG5vdCBtYXRjaGVkIHlldCwgc2tpcCB0aGlzIHBpcGUgKi8KKwkJfQorI2VuZGlmCisJCS8qIEp1c3QgcHJlc3NpbmcgPGVudGVyPiBpbiBzaGVsbCBzaG91bGQgY2hlY2sgZm9yIGpvYnMuCisJCSAqIE9UT0gsIGluIG5vbi1pbnRlcmFjdGl2ZSBzaGVsbCB0aGlzIGlzIHVzZWxlc3MKKwkJICogYW5kIG9ubHkgbGVhZHMgdG8gZXh0cmEgam9iIGNoZWNrcyAqLworCQlpZiAocGktPm51bV9jbWRzID09IDApIHsKKwkJCWlmIChHX2ludGVyYWN0aXZlX2ZkKQorCQkJCWdvdG8gY2hlY2tfam9ic19hbmRfY29udGludWU7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIEFmdGVyIGFuYWx5emluZyBhbGwga2V5d29yZHMgYW5kIGNvbmRpdGlvbnMsIHdlIGRlY2lkZWQKKwkJICogdG8gZXhlY3V0ZSB0aGlzIHBpcGUuIE5COiBoYXZlIHRvIGRvIGNoZWNram9icyhOVUxMKQorCQkgKiBhZnRlciBydW5fcGlwZSB0byBjb2xsZWN0IGFueSBiYWNrZ3JvdW5kIGNoaWxkcmVuLAorCQkgKiBldmVuIGlmIGxpc3QgZXhlY3V0aW9uIGlzIHRvIGJlIHN0b3BwZWQuICovCisJCWRlYnVnX3ByaW50Zl9leGVjKCI6IHJ1bl9waXBlIHdpdGggJWQgbWVtYmVyc1xuIiwgcGktPm51bV9jbWRzKTsKKwkJeworCQkJaW50IHI7CisjaWYgRU5BQkxFX0hVU0hfTE9PUFMKKwkJCUcuZmxhZ19icmVha19jb250aW51ZSA9IDA7CisjZW5kaWYKKwkJCXJjb2RlID0gciA9IHJ1bl9waXBlKHBpKTsgLyogTkI6IHJjb2RlIGlzIGEgc21hbGxpbnQgKi8KKwkJCWlmIChyICE9IC0xKSB7CisJCQkJLyogV2UgcmFuIGEgYnVpbHRpbiwgZnVuY3Rpb24sIG9yIGdyb3VwLgorCQkJCSAqIHJjb2RlIGlzIGFscmVhZHkga25vd24KKwkJCQkgKiBhbmQgd2UgZG9uJ3QgbmVlZCB0byB3YWl0IGZvciBhbnl0aGluZy4gKi8KKwkJCQlHLmxhc3RfZXhpdGNvZGUgPSByY29kZTsKKwkJCQlkZWJ1Z19wcmludGZfZXhlYygiOiBidWlsdGluL2Z1bmMgZXhpdGNvZGUgJWRcbiIsIHJjb2RlKTsKKwkJCQljaGVja19hbmRfcnVuX3RyYXBzKCk7CisjaWYgRU5BQkxFX0hVU0hfTE9PUFMKKwkJCQkvKiBXYXMgaXQgImJyZWFrIiBvciAiY29udGludWUiPyAqLworCQkJCWlmIChHLmZsYWdfYnJlYWtfY29udGludWUpIHsKKwkJCQkJc21hbGxpbnQgZmJjID0gRy5mbGFnX2JyZWFrX2NvbnRpbnVlOworCQkJCQkvKiBXZSBtaWdodCBmYWxsIGludG8gb3V0ZXIgKmxvb3AqLAorCQkJCQkgKiBkb24ndCB3YW50IHRvIGJyZWFrIGl0IHRvbyAqLworCQkJCQlpZiAobG9vcF90b3ApIHsKKwkJCQkJCUcuZGVwdGhfYnJlYWtfY29udGludWUtLTsKKwkJCQkJCWlmIChHLmRlcHRoX2JyZWFrX2NvbnRpbnVlID09IDApCisJCQkJCQkJRy5mbGFnX2JyZWFrX2NvbnRpbnVlID0gMDsKKwkJCQkJCS8qIGVsc2U6IGUuZy4gImNvbnRpbnVlIDIiIHNob3VsZCAqYnJlYWsqIG9uY2UsICp0aGVuKiBjb250aW51ZSAqLworCQkJCQl9IC8qIGVsc2U6ICJ3aGlsZS4uLiBkby4uLiB7IHdlIGFyZSBoZXJlIChpbm5lcm1vc3QgbGlzdCBpcyBub3QgYSBsb29wISkgfTsuLi5kb25lIiAqLworCQkJCQlpZiAoRy5kZXB0aF9icmVha19jb250aW51ZSAhPSAwIHx8IGZiYyA9PSBCQ19CUkVBSykgeworCQkJCQkJY2hlY2tqb2JzKE5VTEwpOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJLyogImNvbnRpbnVlIjogc2ltdWxhdGUgZW5kIG9mIGxvb3AgKi8KKwkJCQkJcndvcmQgPSBSRVNfRE9ORTsKKwkJCQkJY29udGludWU7CisJCQkJfQorI2VuZGlmCisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJCQkJaWYgKEcuZmxhZ19yZXR1cm5faW5fcHJvZ3Jlc3MgPT0gMSkgeworCQkJCQljaGVja2pvYnMoTlVMTCk7CisJCQkJCWJyZWFrOworCQkJCX0KKyNlbmRpZgorCQkJfSBlbHNlIGlmIChwaS0+Zm9sbG93dXAgPT0gUElQRV9CRykgeworCQkJCS8qIFdoYXQgZG9lcyBiYXNoIGRvIHdpdGggYXR0ZW1wdHMgdG8gYmFja2dyb3VuZCBidWlsdGlucz8gKi8KKwkJCQkvKiBldmVuIGJhc2ggMy4yIGRvZXNuJ3QgZG8gdGhhdCB3ZWxsIHdpdGggbmVzdGVkIGJnOgorCQkJCSAqIHRyeSAieyB7IHNsZWVwIDEwOyBlY2hvIERFRVA7IH0gJiBlY2hvIEhFUkU7IH0gJiIuCisJCQkJICogSSdtIE5PVCB0cmVhdGluZyBpbm5lciAmJ3MgYXMgam9icyAqLworCQkJCWNoZWNrX2FuZF9ydW5fdHJhcHMoKTsKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwkJCQlpZiAoRy5ydW5fbGlzdF9sZXZlbCA9PSAxKQorCQkJCQlpbnNlcnRfYmdfam9iKHBpKTsKKyNlbmRpZgorCQkJCS8qIExhc3QgY29tbWFuZCdzIHBpZCBnb2VzIHRvICQhICovCisJCQkJRy5sYXN0X2JnX3BpZCA9IHBpLT5jbWRzW3BpLT5udW1fY21kcyAtIDFdLnBpZDsKKwkJCQlHLmxhc3RfZXhpdGNvZGUgPSByY29kZSA9IEVYSVRfU1VDQ0VTUzsKKwkJCQlkZWJ1Z19wcmludGZfZXhlYygiOiBjbWQmOiBleGl0Y29kZSBFWElUX1NVQ0NFU1NcbiIpOworCQkJfSBlbHNlIHsKKyNpZiBFTkFCTEVfSFVTSF9KT0IKKwkJCQlpZiAoRy5ydW5fbGlzdF9sZXZlbCA9PSAxICYmIEdfaW50ZXJhY3RpdmVfZmQpIHsKKwkJCQkJLyogV2FpdHMgZm9yIGNvbXBsZXRpb24sIHRoZW4gZmcncyBtYWluIHNoZWxsICovCisJCQkJCXJjb2RlID0gY2hlY2tqb2JzX2FuZF9mZ19zaGVsbChwaSk7CisJCQkJCWRlYnVnX3ByaW50Zl9leGVjKCI6IGNoZWNram9ic19hbmRfZmdfc2hlbGwgZXhpdGNvZGUgJWRcbiIsIHJjb2RlKTsKKwkJCQkJY2hlY2tfYW5kX3J1bl90cmFwcygpOworCQkJCX0gZWxzZQorI2VuZGlmCisJCQkJeyAvKiBUaGlzIG9uZSBqdXN0IHdhaXRzIGZvciBjb21wbGV0aW9uICovCisJCQkJCXJjb2RlID0gY2hlY2tqb2JzKHBpKTsKKwkJCQkJZGVidWdfcHJpbnRmX2V4ZWMoIjogY2hlY2tqb2JzIGV4aXRjb2RlICVkXG4iLCByY29kZSk7CisJCQkJCWNoZWNrX2FuZF9ydW5fdHJhcHMoKTsKKwkJCQl9CisJCQkJRy5sYXN0X2V4aXRjb2RlID0gcmNvZGU7CisJCQl9CisJCX0KKworCQkvKiBBbmFseXplIGhvdyByZXN1bHQgYWZmZWN0cyBzdWJzZXF1ZW50IGNvbW1hbmRzICovCisjaWYgRU5BQkxFX0hVU0hfSUYKKwkJaWYgKHJ3b3JkID09IFJFU19JRiB8fCByd29yZCA9PSBSRVNfRUxJRikKKwkJCWNvbmRfY29kZSA9IHJjb2RlOworI2VuZGlmCisgY2hlY2tfam9ic19hbmRfY29udGludWU6CisJCWNoZWNram9icyhOVUxMKTsKKyBkb250X2NoZWNrX2pvYnNfYnV0X2NvbnRpbnVlOiA7CisjaWYgRU5BQkxFX0hVU0hfTE9PUFMKKwkJLyogQmV3YXJlIG9mICJ3aGlsZSBmYWxzZTsgdHJ1ZTsgZG8gLi4uIiEgKi8KKwkJaWYgKHBpLT5uZXh0CisJCSAmJiAocGktPm5leHQtPnJlc193b3JkID09IFJFU19ETyB8fCBwaS0+bmV4dC0+cmVzX3dvcmQgPT0gUkVTX0RPTkUpCisJCSAvKiBjaGVjayBmb3IgUkVTX0RPTkUgaXMgbmVlZGVkIGZvciAid2hpbGUgLi4uOyBkbyBcbiBkb25lIiBjYXNlICovCisJCSkgeworCQkJaWYgKHJ3b3JkID09IFJFU19XSElMRSkgeworCQkJCWlmIChyY29kZSkgeworCQkJCQkvKiAid2hpbGUgZmFsc2U7IGRvLi4uZG9uZSIgLSBleGl0Y29kZSAwICovCisJCQkJCUcubGFzdF9leGl0Y29kZSA9IHJjb2RlID0gRVhJVF9TVUNDRVNTOworCQkJCQlkZWJ1Z19wcmludGZfZXhlYygiOiB3aGlsZSBleHByIGlzIGZhbHNlOiBicmVha2luZyAoZXhpdGNvZGU6RVhJVF9TVUNDRVNTKVxuIik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCWlmIChyd29yZCA9PSBSRVNfVU5USUwpIHsKKwkJCQlpZiAoIXJjb2RlKSB7CisJCQkJCWRlYnVnX3ByaW50Zl9leGVjKCI6IHVudGlsIGV4cHIgaXMgdHJ1ZTogYnJlYWtpbmdcbiIpOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKyNlbmRpZgorCX0gLyogZm9yIChwaSkgKi8KKworI2lmIEVOQUJMRV9IVVNIX0pPQgorCUcucnVuX2xpc3RfbGV2ZWwtLTsKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0xPT1BTCisJaWYgKGxvb3BfdG9wKQorCQlHLmRlcHRoX29mX2xvb3AtLTsKKwlmcmVlKGZvcl9saXN0KTsKKyNlbmRpZgorI2lmIEVOQUJMRV9IVVNIX0NBU0UKKwlmcmVlKGNhc2Vfd29yZCk7CisjZW5kaWYKKwlkZWJ1Z19sZWF2ZSgpOworCWRlYnVnX3ByaW50Zl9leGVjKCJydW5fbGlzdCBsdmwgJWQgcmV0dXJuICVkXG4iLCBHLnJ1bl9saXN0X2xldmVsICsgMSwgcmNvZGUpOworCXJldHVybiByY29kZTsKK30KKworLyogU2VsZWN0IHdoaWNoIHZlcnNpb24gd2Ugd2lsbCB1c2UgKi8KK3N0YXRpYyBpbnQgcnVuX2FuZF9mcmVlX2xpc3Qoc3RydWN0IHBpcGUgKnBpKQoreworCWludCByY29kZSA9IDA7CisJZGVidWdfcHJpbnRmX2V4ZWMoInJ1bl9hbmRfZnJlZV9saXN0IGVudGVyZWRcbiIpOworCWlmICghRy5vX29wdFtPUFRfT19OT0VYRUNdKSB7CisJCWRlYnVnX3ByaW50Zl9leGVjKCI6IHJ1bl9saXN0OiAxc3QgcGlwZSB3aXRoICVkIGNtZHNcbiIsIHBpLT5udW1fY21kcyk7CisJCXJjb2RlID0gcnVuX2xpc3QocGkpOworCX0KKwkvKiBmcmVlX3BpcGVfbGlzdCBoYXMgdGhlIHNpZGUgZWZmZWN0IG9mIGNsZWFyaW5nIG1lbW9yeS4KKwkgKiBJbiB0aGUgbG9uZyBydW4gdGhhdCBmdW5jdGlvbiBjYW4gYmUgbWVyZ2VkIHdpdGggcnVuX2xpc3QsCisJICogYnV0IGRvaW5nIHRoYXQgbm93IHdvdWxkIGhvYmJsZSB0aGUgZGVidWdnaW5nIGVmZm9ydC4gKi8KKwlmcmVlX3BpcGVfbGlzdChwaSk7CisJZGVidWdfcHJpbnRmX2V4ZWMoInJ1bl9hbmRfZnJlZV9saXN0IHJldHVybiAlZFxuIiwgcmNvZGUpOworCXJldHVybiByY29kZTsKK30KKworCitzdGF0aWMgdm9pZCBpbnN0YWxsX3NpZ2hhbmRsZXJzKHVuc2lnbmVkIG1hc2spCit7CisJc2lnaGFuZGxlcl90IG9sZF9oYW5kbGVyOworCXVuc2lnbmVkIHNpZyA9IDA7CisJd2hpbGUgKChtYXNrID4+PSAxKSAhPSAwKSB7CisJCXNpZysrOworCQlpZiAoIShtYXNrICYgMSkpCisJCQljb250aW51ZTsKKwkJb2xkX2hhbmRsZXIgPSBpbnN0YWxsX3NpZ2hhbmRsZXIoc2lnLCBwaWNrX3NpZ2hhbmRsZXIoc2lnKSk7CisJCS8qIFBPU0lYIGFsbG93cyBzaGVsbCB0byByZS1lbmFibGUgU0lHQ0hMRAorCQkgKiBldmVuIGlmIGl0IHdhcyBTSUdfSUdOIG9uIGVudHJ5LgorCQkgKiBUaGVyZWZvcmUgd2Ugc2tpcCBJR04gY2hlY2sgZm9yIGl0OgorCQkgKi8KKwkJaWYgKHNpZyA9PSBTSUdDSExEKQorCQkJY29udGludWU7CisJCWlmIChvbGRfaGFuZGxlciA9PSBTSUdfSUdOKSB7CisJCQkvKiBvb3BzLi4uIHJlc3RvcmUgYmFjayB0byBJR04sIGFuZCByZWNvcmQgdGhpcyBmYWN0ICovCisJCQlpbnN0YWxsX3NpZ2hhbmRsZXIoc2lnLCBvbGRfaGFuZGxlcik7CisJCQlpZiAoIUcudHJhcHMpCisJCQkJRy50cmFwcyA9IHh6YWxsb2Moc2l6ZW9mKEcudHJhcHNbMF0pICogTlNJRyk7CisJCQlmcmVlKEcudHJhcHNbc2lnXSk7CisJCQlHLnRyYXBzW3NpZ10gPSB4emFsbG9jKDEpOyAvKiA9PSB4c3RyZHVwKCIiKTsgKi8KKwkJfQorCX0KK30KKworLyogQ2FsbGVkIGEgZmV3IHRpbWVzIG9ubHkgKG9yIGV2ZW4gb25jZSBpZiAic2ggLWMiKSAqLworc3RhdGljIHZvaWQgaW5zdGFsbF9zcGVjaWFsX3NpZ2hhbmRsZXJzKHZvaWQpCit7CisJdW5zaWduZWQgbWFzazsKKworCS8qIFdoaWNoIHNpZ25hbHMgYXJlIHNoZWxsLXNwZWNpYWw/ICovCisJbWFzayA9ICgxIDw8IFNJR1FVSVQpIHwgKDEgPDwgU0lHQ0hMRCk7CisJaWYgKEdfaW50ZXJhY3RpdmVfZmQpIHsKKwkJbWFzayB8PSBTUEVDSUFMX0lOVEVSQUNUSVZFX1NJR1M7CisJCWlmIChHX3NhdmVkX3R0eV9wZ3JwKSAvKiB3ZSBoYXZlIGN0dHksIGpvYiBjb250cm9sIHNpZ3Mgd29yayAqLworCQkJbWFzayB8PSBTUEVDSUFMX0pPQlNUT1BfU0lHUzsKKwl9CisJLyogQ2FyZWZ1bCwgZG8gbm90IHJlLWluc3RhbGwgaGFuZGxlcnMgd2UgYWxyZWFkeSBpbnN0YWxsZWQgKi8KKwlpZiAoRy5zcGVjaWFsX3NpZ19tYXNrICE9IG1hc2spIHsKKwkJdW5zaWduZWQgZGlmZiA9IG1hc2sgJiB+Ry5zcGVjaWFsX3NpZ19tYXNrOworCQlHLnNwZWNpYWxfc2lnX21hc2sgPSBtYXNrOworCQlpbnN0YWxsX3NpZ2hhbmRsZXJzKGRpZmYpOworCX0KK30KKworI2lmIEVOQUJMRV9IVVNIX0pPQgorLyogaGVscGVyICovCisvKiBTZXQgaGFuZGxlcnMgdG8gcmVzdG9yZSB0dHkgcGdycCBhbmQgZXhpdCAqLworc3RhdGljIHZvaWQgaW5zdGFsbF9mYXRhbF9zaWdoYW5kbGVycyh2b2lkKQoreworCXVuc2lnbmVkIG1hc2s7CisKKwkvKiBXZSB3aWxsIHJlc3RvcmUgdHR5IHBncnAgb24gdGhlc2Ugc2lnbmFscyAqLworCW1hc2sgPSAwCisJCSsgKDEgPDwgU0lHSUxMICkgKiBIVVNIX0RFQlVHCisJCSsgKDEgPDwgU0lHRlBFICkgKiBIVVNIX0RFQlVHCisJCSsgKDEgPDwgU0lHQlVTICkgKiBIVVNIX0RFQlVHCisJCSsgKDEgPDwgU0lHU0VHVikgKiBIVVNIX0RFQlVHCisJCSsgKDEgPDwgU0lHVFJBUCkgKiBIVVNIX0RFQlVHCisJCSsgKDEgPDwgU0lHQUJSVCkKKwkvKiBiYXNoIDMuMiBzZWVtcyB0byBoYW5kbGUgdGhlc2UganVzdCBsaWtlICdmYXRhbCcgb25lcyAqLworCQkrICgxIDw8IFNJR1BJUEUpCisJCSsgKDEgPDwgU0lHQUxSTSkKKwkvKiBpZiB3ZSBhcmUgaW50ZXJhY3RpdmUsIFNJR0hVUCwgU0lHVEVSTSBhbmQgU0lHSU5UIGFyZSBzcGVjaWFsIHNpZ3MuCisJICogaWYgd2UgYXJlbid0IGludGVyYWN0aXZlLi4uIGJ1dCBpbiB0aGlzIGNhc2UKKwkgKiB3ZSBuZXZlciB3YW50IHRvIHJlc3RvcmUgcGdycCBvbiBleGl0LCBhbmQgdGhpcyBmbiBpcyBub3QgY2FsbGVkCisJICovCisJCS8qKyAoMSA8PCBTSUdIVVAgKSovCisJCS8qKyAoMSA8PCBTSUdURVJNKSovCisJCS8qKyAoMSA8PCBTSUdJTlQgKSovCisJOworCUdfZmF0YWxfc2lnX21hc2sgPSBtYXNrOworCisJaW5zdGFsbF9zaWdoYW5kbGVycyhtYXNrKTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHNldF9tb2RlKGludCBzdGF0ZSwgY2hhciBtb2RlLCBjb25zdCBjaGFyICpvX29wdCkKK3sKKwlpbnQgaWR4OworCXN3aXRjaCAobW9kZSkgeworCWNhc2UgJ24nOgorCQlHLm9fb3B0W09QVF9PX05PRVhFQ10gPSBzdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSAneCc6CisJCUlGX0hVU0hfTU9ERV9YKEdfeF9tb2RlID0gc3RhdGU7KQorCQlicmVhazsKKwljYXNlICdvJzoKKwkJaWYgKCFvX29wdCkgeworCQkJLyogInNldCAtK28iIHdpdGhvdXQgcGFyYW1ldGVyLgorCQkJICogaW4gYmFzaCwgc2V0IC1vIHByb2R1Y2VzIHRoaXMgb3V0cHV0OgorCQkJICogIHBpcGVmYWlsICAgICAgICBvZmYKKwkJCSAqIGFuZCBzZXQgK286CisJCQkgKiAgc2V0ICtvIHBpcGVmYWlsCisJCQkgKiBXZSBhbHdheXMgdXNlIHRoZSBzZWNvbmQgZm9ybS4KKwkJCSAqLworCQkJY29uc3QgY2hhciAqcCA9IG9fb3B0X3N0cmluZ3M7CisJCQlpZHggPSAwOworCQkJd2hpbGUgKCpwKSB7CisJCQkJcHJpbnRmKCJzZXQgJWNvICVzXG4iLCAoRy5vX29wdFtpZHhdID8gJy0nIDogJysnKSwgcCk7CisJCQkJaWR4Kys7CisJCQkJcCArPSBzdHJsZW4ocCkgKyAxOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJaWR4ID0gaW5kZXhfaW5fc3RyaW5ncyhvX29wdF9zdHJpbmdzLCBvX29wdCk7CisJCWlmIChpZHggPj0gMCkgeworCQkJRy5vX29wdFtpZHhdID0gc3RhdGU7CisJCQlicmVhazsKKwkJfQorCWRlZmF1bHQ6CisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKK2ludCBodXNoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBodXNoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWVudW0geworCQlPUFRfbG9naW4gPSAoMSA8PCAwKSwKKwl9OworCXVuc2lnbmVkIGZsYWdzOworCWludCBvcHQ7CisJdW5zaWduZWQgYnVpbHRpbl9hcmdjOworCWNoYXIgKiplOworCXN0cnVjdCB2YXJpYWJsZSAqY3VyX3ZhcjsKKwlzdHJ1Y3QgdmFyaWFibGUgKnNoZWxsX3ZlcjsKKworCUlOSVRfRygpOworCWlmIChFWElUX1NVQ0NFU1MgIT0gMCkgLyogaWYgRVhJVF9TVUNDRVNTID09IDAsIGl0IGlzIGFscmVhZHkgZG9uZSAqLworCQlHLmxhc3RfZXhpdGNvZGUgPSBFWElUX1NVQ0NFU1M7CisjaWYgRU5BQkxFX0hVU0hfRkFTVAorCUcuY291bnRfU0lHQ0hMRCsrOyAvKiBlbnN1cmUgaXQgaXMgIT0gRy5oYW5kbGVkX1NJR0NITEQgKi8KKyNlbmRpZgorI2lmICFCQl9NTVUKKwlHLmFyZ3YwX2Zvcl9yZV9leGVjaW5nID0gYXJndlswXTsKKyNlbmRpZgorCS8qIERlYWwgd2l0aCBIVVNIX1ZFUlNJT04gKi8KKwlzaGVsbF92ZXIgPSB4emFsbG9jKHNpemVvZigqc2hlbGxfdmVyKSk7CisJc2hlbGxfdmVyLT5mbGdfZXhwb3J0ID0gMTsKKwlzaGVsbF92ZXItPmZsZ19yZWFkX29ubHkgPSAxOworCS8qIENvZGUgd2hpY2ggaGFuZGxlcyAke3ZhcjxvcD4uLi59IG5lZWRzIHdyaXRhYmxlIHZhbHVlcyBmb3IgYWxsIHZhcmlhYmxlcywKKwkgKiB0aGVyZWZvcmUgd2UgeHN0cmR1cDogKi8KKwlzaGVsbF92ZXItPnZhcnN0ciA9IHhzdHJkdXAoaHVzaF92ZXJzaW9uX3N0cik7CisJLyogQ3JlYXRlIHNoZWxsIGxvY2FsIHZhcmlhYmxlcyBmcm9tIHRoZSB2YWx1ZXMKKwkgKiBjdXJyZW50bHkgbGl2aW5nIGluIHRoZSBlbnZpcm9ubWVudCAqLworCWRlYnVnX3ByaW50Zl9lbnYoInVuc2V0ZW52ICclcydcbiIsICJIVVNIX1ZFUlNJT04iKTsKKwl1bnNldGVudigiSFVTSF9WRVJTSU9OIik7IC8qIGluIGNhc2UgaXQgZXhpc3RzIGluIGluaXRpYWwgZW52ICovCisJRy50b3BfdmFyID0gc2hlbGxfdmVyOworCWN1cl92YXIgPSBHLnRvcF92YXI7CisJZSA9IGVudmlyb247CisJaWYgKGUpIHdoaWxlICgqZSkgeworCQljaGFyICp2YWx1ZSA9IHN0cmNocigqZSwgJz0nKTsKKwkJaWYgKHZhbHVlKSB7IC8qIHBhcmFub2lhICovCisJCQljdXJfdmFyLT5uZXh0ID0geHphbGxvYyhzaXplb2YoKmN1cl92YXIpKTsKKwkJCWN1cl92YXIgPSBjdXJfdmFyLT5uZXh0OworCQkJY3VyX3Zhci0+dmFyc3RyID0gKmU7CisJCQljdXJfdmFyLT5tYXhfbGVuID0gc3RybGVuKCplKTsKKwkJCWN1cl92YXItPmZsZ19leHBvcnQgPSAxOworCQl9CisJCWUrKzsKKwl9CisJLyogKFJlKWluc2VydCBIVVNIX1ZFUlNJT04gaW50byBlbnYgKEFGVEVSIHdlIHNjYW5uZWQgdGhlIGVudiEpICovCisJZGVidWdfcHJpbnRmX2VudigicHV0ZW52ICclcydcbiIsIHNoZWxsX3Zlci0+dmFyc3RyKTsKKwlwdXRlbnYoc2hlbGxfdmVyLT52YXJzdHIpOworCisJLyogRXhwb3J0IFBXRCAqLworCXNldF9wd2RfdmFyKC8qZXhwOiovIDEpOworCisjaWYgRU5BQkxFX0hVU0hfQkFTSF9DT01QQVQKKwkvKiBTZXQgKGJ1dCBub3QgZXhwb3J0KSBIT1NUTkFNRSB1bmxlc3MgYWxyZWFkeSBzZXQgKi8KKwlpZiAoIWdldF9sb2NhbF92YXJfdmFsdWUoIkhPU1ROQU1FIikpIHsKKwkJc3RydWN0IHV0c25hbWUgdXRzOworCQl1bmFtZSgmdXRzKTsKKwkJc2V0X2xvY2FsX3Zhcl9mcm9tX2hhbHZlcygiSE9TVE5BTUUiLCB1dHMubm9kZW5hbWUpOworCX0KKwkvKiBiYXNoIGFsc28gZXhwb3J0cyBTSExWTCBhbmQgXywKKwkgKiBhbmQgc2V0cyAoYnV0IGRvZXNuJ3QgZXhwb3J0KSB0aGUgZm9sbG93aW5nIHZhcmlhYmxlczoKKwkgKiBCQVNIPS9iaW4vYmFzaAorCSAqIEJBU0hfVkVSU0lORk89KFswXT0iMyIgWzFdPSIyIiBbMl09IjAiIFszXT0iMSIgWzRdPSJyZWxlYXNlIiBbNV09ImkzODYtcGMtbGludXgtZ251IikKKwkgKiBCQVNIX1ZFUlNJT049JzMuMi4wKDEpLXJlbGVhc2UnCisJICogSE9TVFRZUEU9aTM4NgorCSAqIE1BQ0hUWVBFPWkzODYtcGMtbGludXgtZ251CisJICogT1NUWVBFPWxpbnV4LWdudQorCSAqIFBQSUQ9PE5OTk5OPiAtIHdlIGFsc28gZG8gaXQgZWxzZXdoZXJlCisJICogRVVJRD08Tk5OTk4+CisJICogVUlEPTxOTk5OTj4KKwkgKiBHUk9VUFM9KCkKKwkgKiBMSU5FUz08Tk5OPgorCSAqIENPTFVNTlM9PE5OTj4KKwkgKiBCQVNIX0FSR0M9KCkKKwkgKiBCQVNIX0FSR1Y9KCkKKwkgKiBCQVNIX0xJTkVOTz0oKQorCSAqIEJBU0hfU09VUkNFPSgpCisJICogRElSU1RBQ0s9KCkKKwkgKiBQSVBFU1RBVFVTPShbMF09IjAiKQorCSAqIEhJU1RGSUxFPS88eHh4Pi8uYmFzaF9oaXN0b3J5CisJICogSElTVEZJTEVTSVpFPTUwMAorCSAqIEhJU1RTSVpFPTUwMAorCSAqIE1BSUxDSEVDSz02MAorCSAqIFBBVEg9L3Vzci9nbnUvYmluOi91c3IvbG9jYWwvYmluOi9iaW46L3Vzci9iaW46LgorCSAqIFNIRUxMPS9iaW4vYmFzaAorCSAqIFNIRUxMT1BUUz1icmFjZWV4cGFuZDplbWFjczpoYXNoYWxsOmhpc3RleHBhbmQ6aGlzdG9yeTppbnRlcmFjdGl2ZS1jb21tZW50czptb25pdG9yCisJICogVEVSTT1kdW1iCisJICogT1BURVJSPTEKKwkgKiBPUFRJTkQ9MQorCSAqIElGUz0kJyBcdFxuJworCSAqIFBTMT0nXHMtXHZcJCAnCisJICogUFMyPSc+ICcKKwkgKiBQUzQ9JysgJworCSAqLworI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9FRElUSU5HCisJRy5saW5lX2lucHV0X3N0YXRlID0gbmV3X2xpbmVfaW5wdXRfdChGT1JfU0hFTEwpOworI2VuZGlmCisKKwkvKiBJbml0aWFsaXplIHNvbWUgbW9yZSBnbG9iYWxzIHRvIG5vbi16ZXJvIHZhbHVlcyAqLworCWNtZGVkaXRfdXBkYXRlX3Byb21wdCgpOworCisJZGllX2Z1bmMgPSB4ZnVuY19oYXNfZGllZDsKKworCS8qIFNoZWxsIGlzIG5vbi1pbnRlcmFjdGl2ZSBhdCBmaXJzdC4gV2UgbmVlZCB0byBjYWxsCisJICogaW5zdGFsbF9zcGVjaWFsX3NpZ2hhbmRsZXJzKCkgaWYgd2UgYXJlIGdvaW5nIHRvIGV4ZWN1dGUgInNoIDxzY3JpcHQ+IiwKKwkgKiAic2ggLWMgPGNtZHM+IiBvciBsb2dpbiBzaGVsbCdzIC9ldGMvcHJvZmlsZSBhbmQgZnJpZW5kcy4KKwkgKiBJZiB3ZSBsYXRlciBkZWNpZGUgdGhhdCB3ZSBhcmUgaW50ZXJhY3RpdmUsIHdlIHJ1biBpbnN0YWxsX3NwZWNpYWxfc2lnaGFuZGxlcnMoKQorCSAqIGluIG9yZGVyIHRvIGludGVyY2VwdCAobW9yZSkgc2lnbmFscy4KKwkgKi8KKworCS8qIFBhcnNlIG9wdGlvbnMgKi8KKwkvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9zaC5odG1sICovCisJZmxhZ3MgPSAoYXJndlswXSAmJiBhcmd2WzBdWzBdID09ICctJykgPyBPUFRfbG9naW4gOiAwOworCWJ1aWx0aW5fYXJnYyA9IDA7CisJd2hpbGUgKDEpIHsKKwkJb3B0ID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsICIrYzp4aW5zbCIKKyNpZiAhQkJfTU1VCisJCQkJIjw6JDpSOlY6IgorIyBpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwkJCQkiRjoiCisjIGVuZGlmCisjZW5kaWYKKwkJKTsKKwkJaWYgKG9wdCA8PSAwKQorCQkJYnJlYWs7CisJCXN3aXRjaCAob3B0KSB7CisJCWNhc2UgJ2MnOgorCQkJLyogUG9zc2liaWxpdGllczoKKwkJCSAqIHNoIC4uLiAtYyAnc2NyaXB0JworCQkJICogc2ggLi4uIC1jICdzY3JpcHQnIEFSRzAgW0FSRzEuLi5dCisJCQkgKiBPbiBOT01NVSwgaWYgYnVpbHRpbl9hcmdjICE9IDAsCisJCQkgKiBzaCAuLi4gLWMgJ2J1aWx0aW4nIEJBUkdWLi4uICIiIEFSRzAgW0FSRzEuLi5dCisJCQkgKiAiIiBuZWVkcyB0byBiZSByZXBsYWNlZCB3aXRoIE5VTEwKKwkJCSAqIGFuZCBCQVJHViB2ZWN0b3IgZmVkIHRvIGJ1aWx0aW4gZnVuY3Rpb24uCisJCQkgKiBOb3RlOiB0aGUgZm9ybSB3aXRob3V0IEFSRzAgbmV2ZXIgaGFwcGVuczoKKwkJCSAqIHNoIC4uLiAtYyAnYnVpbHRpbicgQkFSR1YuLi4gIiIKKwkJCSAqLworCQkJaWYgKCFHLnJvb3RfcGlkKSB7CisJCQkJRy5yb290X3BpZCA9IGdldHBpZCgpOworCQkJCUcucm9vdF9wcGlkID0gZ2V0cHBpZCgpOworCQkJfQorCQkJRy5nbG9iYWxfYXJndiA9IGFyZ3YgKyBvcHRpbmQ7CisJCQlHLmdsb2JhbF9hcmdjID0gYXJnYyAtIG9wdGluZDsKKwkJCWlmIChidWlsdGluX2FyZ2MpIHsKKwkJCQkvKiAtYyAnYnVpbHRpbicgW0JBUkdWLi4uXSAiIiBBUkcwIFtBUkcxLi4uXSAqLworCQkJCWNvbnN0IHN0cnVjdCBidWlsdF9pbl9jb21tYW5kICp4OworCisJCQkJaW5zdGFsbF9zcGVjaWFsX3NpZ2hhbmRsZXJzKCk7CisJCQkJeCA9IGZpbmRfYnVpbHRpbihvcHRhcmcpOworCQkJCWlmICh4KSB7IC8qIHBhcmFub2lhICovCisJCQkJCUcuZ2xvYmFsX2FyZ2MgLT0gYnVpbHRpbl9hcmdjOyAvKiBza2lwIFtCQVJHVi4uLl0gIiIgKi8KKwkJCQkJRy5nbG9iYWxfYXJndiArPSBidWlsdGluX2FyZ2M7CisJCQkJCUcuZ2xvYmFsX2FyZ3ZbLTFdID0gTlVMTDsgLyogcmVwbGFjZSAiIiAqLworCQkJCQlmZmx1c2hfYWxsKCk7CisJCQkJCUcubGFzdF9leGl0Y29kZSA9IHgtPmJfZnVuY3Rpb24oYXJndiArIG9wdGluZCAtIDEpOworCQkJCX0KKwkJCQlnb3RvIGZpbmFsX3JldHVybjsKKwkJCX0KKwkJCWlmICghRy5nbG9iYWxfYXJndlswXSkgeworCQkJCS8qIC1jICdzY3JpcHQnIChubyBwYXJhbXMpOiBwcmV2ZW50IGVtcHR5ICQwICovCisJCQkJRy5nbG9iYWxfYXJndi0tOyAvKiBwb2ludHMgdG8gYXJndltpXSBvZiAnc2NyaXB0JyAqLworCQkJCUcuZ2xvYmFsX2FyZ3ZbMF0gPSBhcmd2WzBdOworCQkJCUcuZ2xvYmFsX2FyZ2MrKzsKKwkJCX0gLyogZWxzZSAtYyAnc2NyaXB0JyBBUkcwIFtBUkcxLi4uXTogJDAgaXMgQVJHMCAqLworCQkJaW5zdGFsbF9zcGVjaWFsX3NpZ2hhbmRsZXJzKCk7CisJCQlwYXJzZV9hbmRfcnVuX3N0cmluZyhvcHRhcmcpOworCQkJZ290byBmaW5hbF9yZXR1cm47CisJCWNhc2UgJ2knOgorCQkJLyogV2VsbCwgd2UgY2Fubm90IGp1c3QgZGVjbGFyZSBpbnRlcmFjdGl2ZW5lc3MsCisJCQkgKiB3ZSBoYXZlIHRvIGhhdmUgc29tZSBzdHVmZiAoY3R0eSwgZXRjKSAqLworCQkJLyogR19pbnRlcmFjdGl2ZV9mZCsrOyAqLworCQkJYnJlYWs7CisJCWNhc2UgJ3MnOgorCQkJLyogIi1zIiBtZWFucyAicmVhZCBmcm9tIHN0ZGluIiwgYnV0IHRoaXMgaXMgaG93IHdlIGFsd2F5cworCQkJICogb3BlcmF0ZSwgc28gc2ltcGx5IGRvIG5vdGhpbmcgaGVyZS4gKi8KKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCWZsYWdzIHw9IE9QVF9sb2dpbjsKKwkJCWJyZWFrOworI2lmICFCQl9NTVUKKwkJY2FzZSAnPCc6IC8qICJiaWcgaGVyZWRvYyIgc3VwcG9ydCAqLworCQkJZnVsbF93cml0ZTFfc3RyKG9wdGFyZyk7CisJCQlfZXhpdCgwKTsKKwkJY2FzZSAnJCc6IHsKKwkJCXVuc2lnbmVkIGxvbmcgbG9uZyBlbXB0eV90cmFwX21hc2s7CisKKwkJCUcucm9vdF9waWQgPSBiYl9zdHJ0b3Uob3B0YXJnLCAmb3B0YXJnLCAxNik7CisJCQlvcHRhcmcrKzsKKwkJCUcucm9vdF9wcGlkID0gYmJfc3RydG91KG9wdGFyZywgJm9wdGFyZywgMTYpOworCQkJb3B0YXJnKys7CisJCQlHLmxhc3RfYmdfcGlkID0gYmJfc3RydG91KG9wdGFyZywgJm9wdGFyZywgMTYpOworCQkJb3B0YXJnKys7CisJCQlHLmxhc3RfZXhpdGNvZGUgPSBiYl9zdHJ0b3Uob3B0YXJnLCAmb3B0YXJnLCAxNik7CisJCQlvcHRhcmcrKzsKKwkJCWJ1aWx0aW5fYXJnYyA9IGJiX3N0cnRvdShvcHRhcmcsICZvcHRhcmcsIDE2KTsKKwkJCW9wdGFyZysrOworCQkJZW1wdHlfdHJhcF9tYXNrID0gYmJfc3RydG91bGwob3B0YXJnLCAmb3B0YXJnLCAxNik7CisJCQlpZiAoZW1wdHlfdHJhcF9tYXNrICE9IDApIHsKKwkJCQlpbnQgc2lnOworCQkJCWluc3RhbGxfc3BlY2lhbF9zaWdoYW5kbGVycygpOworCQkJCUcudHJhcHMgPSB4emFsbG9jKHNpemVvZihHLnRyYXBzWzBdKSAqIE5TSUcpOworCQkJCWZvciAoc2lnID0gMTsgc2lnIDwgTlNJRzsgc2lnKyspIHsKKwkJCQkJaWYgKGVtcHR5X3RyYXBfbWFzayAmICgxTEwgPDwgc2lnKSkgeworCQkJCQkJRy50cmFwc1tzaWddID0geHphbGxvYygxKTsgLyogPT0geHN0cmR1cCgiIik7ICovCisJCQkJCQlpbnN0YWxsX3NpZ2hhbmRsZXIoc2lnLCBTSUdfSUdOKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKyMgaWYgRU5BQkxFX0hVU0hfTE9PUFMKKwkJCW9wdGFyZysrOworCQkJRy5kZXB0aF9vZl9sb29wID0gYmJfc3RydG91KG9wdGFyZywgJm9wdGFyZywgMTYpOworIyBlbmRpZgorCQkJYnJlYWs7CisJCX0KKwkJY2FzZSAnUic6CisJCWNhc2UgJ1YnOgorCQkJc2V0X2xvY2FsX3Zhcih4c3RyZHVwKG9wdGFyZyksIC8qZXhwOiovIDAsIC8qbHZsOiovIDAsIC8qcm86Ki8gb3B0ID09ICdSJyk7CisJCQlicmVhazsKKyMgaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJCWNhc2UgJ0YnOiB7CisJCQlzdHJ1Y3QgZnVuY3Rpb24gKmZ1bmNwID0gbmV3X2Z1bmN0aW9uKG9wdGFyZyk7CisJCQkvKiBmdW5jcC0+bmFtZSBpcyBhbHJlYWR5IHNldCB0byBvcHRhcmcgKi8KKwkJCS8qIGZ1bmNwLT5ib2R5IGlzIHNldCB0byBOVUxMLiBJdCdzIGEgc3BlY2lhbCBjYXNlLiAqLworCQkJZnVuY3AtPmJvZHlfYXNfc3RyaW5nID0gYXJndltvcHRpbmRdOworCQkJb3B0aW5kKys7CisJCQlicmVhazsKKwkJfQorIyBlbmRpZgorI2VuZGlmCisJCWNhc2UgJ24nOgorCQljYXNlICd4JzoKKwkJCWlmIChzZXRfbW9kZSgxLCBvcHQsIE5VTEwpID09IDApIC8qIG5vIGVycm9yICovCisJCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisjaWZuZGVmIEJCX1ZFUgorCQkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogc2ggW0ZJTEVdLi4uXG4iCisJCQkJCSIgICBvcjogc2ggLWMgY29tbWFuZCBbYXJnc10uLi5cblxuIik7CisJCQlleGl0KEVYSVRfRkFJTFVSRSk7CisjZWxzZQorCQkJYmJfc2hvd191c2FnZSgpOworI2VuZGlmCisJCX0KKwl9IC8qIG9wdGlvbiBwYXJzaW5nIGxvb3AgKi8KKworCS8qIFNraXAgb3B0aW9ucy4gVHJ5ICJodXNoIC1sIjogJDEgc2hvdWxkIG5vdCBiZSAiLWwiISAqLworCUcuZ2xvYmFsX2FyZ2MgPSBhcmdjIC0gKG9wdGluZCAtIDEpOworCUcuZ2xvYmFsX2FyZ3YgPSBhcmd2ICsgKG9wdGluZCAtIDEpOworCUcuZ2xvYmFsX2FyZ3ZbMF0gPSBhcmd2WzBdOworCisJaWYgKCFHLnJvb3RfcGlkKSB7CisJCUcucm9vdF9waWQgPSBnZXRwaWQoKTsKKwkJRy5yb290X3BwaWQgPSBnZXRwcGlkKCk7CisJfQorCisJLyogSWYgd2UgYXJlIGxvZ2luIHNoZWxsLi4uICovCisJaWYgKGZsYWdzICYgT1BUX2xvZ2luKSB7CisJCUZJTEUgKmlucHV0OworCQlkZWJ1Z19wcmludGYoInNvdXJjaW5nIC9ldGMvcHJvZmlsZVxuIik7CisJCWlucHV0ID0gZm9wZW5fZm9yX3JlYWQoIi9ldGMvcHJvZmlsZSIpOworCQlpZiAoaW5wdXQgIT0gTlVMTCkgeworCQkJY2xvc2Vfb25fZXhlY19vbihmaWxlbm8oaW5wdXQpKTsKKwkJCWluc3RhbGxfc3BlY2lhbF9zaWdoYW5kbGVycygpOworCQkJcGFyc2VfYW5kX3J1bl9maWxlKGlucHV0KTsKKwkJCWZjbG9zZShpbnB1dCk7CisJCX0KKwkJLyogYmFzaDogYWZ0ZXIgc291cmNpbmcgL2V0Yy9wcm9maWxlLAorCQkgKiB0cmllcyB0byBzb3VyY2UgKGluIHRoZSBnaXZlbiBvcmRlcik6CisJCSAqIH4vLmJhc2hfcHJvZmlsZSwgfi8uYmFzaF9sb2dpbiwgfi8ucHJvZmlsZSwKKwkJICogc3RvcHBpbmcgb24gZmlyc3QgZm91bmQuIC0tbm9wcm9maWxlIHR1cm5zIHRoaXMgb2ZmLgorCQkgKiBiYXNoIGFsc28gc291cmNlcyB+Ly5iYXNoX2xvZ291dCBvbiBleGl0LgorCQkgKiBJZiBjYWxsZWQgYXMgc2gsIHNraXBzIC5iYXNoX1hYWCBmaWxlcy4KKwkJICovCisJfQorCisJaWYgKEcuZ2xvYmFsX2FyZ3ZbMV0pIHsKKwkJRklMRSAqaW5wdXQ7CisJCS8qCisJCSAqICJiYXNoIDxzY3JpcHQ+IiAod2hpY2ggaXMgbmV2ZXIgaW50ZXJhY3RpdmUgKHVubGVzcyAtaT8pKQorCQkgKiBzb3VyY2VzICRCQVNIX0VOViBoZXJlICh3aXRob3V0IHNjYW5uaW5nICRQQVRIKS4KKwkJICogSWYgY2FsbGVkIGFzIHNoLCBkb2VzIHRoZSBzYW1lIGJ1dCB3aXRoICRFTlYuCisJCSAqLworCQlHLmdsb2JhbF9hcmdjLS07CisJCUcuZ2xvYmFsX2FyZ3YrKzsKKwkJZGVidWdfcHJpbnRmKCJydW5uaW5nIHNjcmlwdCAnJXMnXG4iLCBHLmdsb2JhbF9hcmd2WzBdKTsKKwkJaW5wdXQgPSB4Zm9wZW5fZm9yX3JlYWQoRy5nbG9iYWxfYXJndlswXSk7CisJCWNsb3NlX29uX2V4ZWNfb24oZmlsZW5vKGlucHV0KSk7CisJCWluc3RhbGxfc3BlY2lhbF9zaWdoYW5kbGVycygpOworCQlwYXJzZV9hbmRfcnVuX2ZpbGUoaW5wdXQpOworI2lmIEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQCisJCWZjbG9zZShpbnB1dCk7CisjZW5kaWYKKwkJZ290byBmaW5hbF9yZXR1cm47CisJfQorCisJLyogVXAgdG8gaGVyZSwgc2hlbGwgd2FzIG5vbi1pbnRlcmFjdGl2ZS4gTm93IGl0IG1heSBiZWNvbWUgb25lLgorCSAqIE5COiBkb24ndCBmb3JnZXQgdG8gKHJlKXJ1biBpbnN0YWxsX3NwZWNpYWxfc2lnaGFuZGxlcnMoKSBhcyBuZWVkZWQuCisJICovCisKKwkvKiBBIHNoZWxsIGlzIGludGVyYWN0aXZlIGlmIHRoZSAnLWknIGZsYWcgd2FzIGdpdmVuLAorCSAqIG9yIGlmIGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIG1ldDoKKwkgKiAgICBubyAtYyBjb21tYW5kCisJICogICAgbm8gYXJndW1lbnRzIHJlbWFpbmluZyBvciB0aGUgLXMgZmxhZyBnaXZlbgorCSAqICAgIHN0YW5kYXJkIGlucHV0IGlzIGEgdGVybWluYWwKKwkgKiAgICBzdGFuZGFyZCBvdXRwdXQgaXMgYSB0ZXJtaW5hbAorCSAqIFJlZmVyIHRvIFBvc2l4LjIsIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgJ3NoJyB1dGlsaXR5LgorCSAqLworI2lmIEVOQUJMRV9IVVNIX0pPQgorCWlmIChpc2F0dHkoU1RESU5fRklMRU5PKSAmJiBpc2F0dHkoU1RET1VUX0ZJTEVOTykpIHsKKwkJR19zYXZlZF90dHlfcGdycCA9IHRjZ2V0cGdycChTVERJTl9GSUxFTk8pOworCQlkZWJ1Z19wcmludGYoInNhdmVkX3R0eV9wZ3JwOiVkXG4iLCBHX3NhdmVkX3R0eV9wZ3JwKTsKKwkJaWYgKEdfc2F2ZWRfdHR5X3BncnAgPCAwKQorCQkJR19zYXZlZF90dHlfcGdycCA9IDA7CisKKwkJLyogdHJ5IHRvIGR1cCBzdGRpbiB0byBoaWdoIGZkIywgPj0gMjU1ICovCisJCUdfaW50ZXJhY3RpdmVfZmQgPSBmY250bChTVERJTl9GSUxFTk8sIEZfRFVQRkQsIDI1NSk7CisJCWlmIChHX2ludGVyYWN0aXZlX2ZkIDwgMCkgeworCQkJLyogdHJ5IHRvIGR1cCB0byBhbnkgZmQgKi8KKwkJCUdfaW50ZXJhY3RpdmVfZmQgPSBkdXAoU1RESU5fRklMRU5PKTsKKwkJCWlmIChHX2ludGVyYWN0aXZlX2ZkIDwgMCkgeworCQkJCS8qIGdpdmUgdXAgKi8KKwkJCQlHX2ludGVyYWN0aXZlX2ZkID0gMDsKKwkJCQlHX3NhdmVkX3R0eV9wZ3JwID0gMDsKKwkJCX0KKwkJfQorLy8gVE9ETzogdHJhY2sgJiBkaXNhbGxvdyBhbnkgYXR0ZW1wdHMgb2YgdXNlcgorLy8gdG8gKGluYWR2ZXJ0ZW50bHkpIGNsb3NlL3JlZGlyZWN0IEdfaW50ZXJhY3RpdmVfZmQKKwl9CisJZGVidWdfcHJpbnRmKCJpbnRlcmFjdGl2ZV9mZDolZFxuIiwgR19pbnRlcmFjdGl2ZV9mZCk7CisJaWYgKEdfaW50ZXJhY3RpdmVfZmQpIHsKKwkJY2xvc2Vfb25fZXhlY19vbihHX2ludGVyYWN0aXZlX2ZkKTsKKworCQlpZiAoR19zYXZlZF90dHlfcGdycCkgeworCQkJLyogSWYgd2Ugd2VyZSBydW4gYXMgJ2h1c2ggJicsIHNsZWVwIHVudGlsIHdlIGFyZQorCQkJICogaW4gdGhlIGZvcmVncm91bmQgKHR0eSBwZ3JwID09IG91ciBwZ3JwKS4KKwkJCSAqIElmIHdlIGdldCBzdGFydGVkIHVuZGVyIGEgam9iIGF3YXJlIGFwcCAobGlrZSBiYXNoKSwKKwkJCSAqIG1ha2Ugc3VyZSB3ZSBhcmUgbm93IGluIGNoYXJnZSBzbyB3ZSBkb24ndCBmaWdodCBvdmVyCisJCQkgKiB3aG8gZ2V0cyB0aGUgZm9yZWdyb3VuZCAqLworCQkJd2hpbGUgKDEpIHsKKwkJCQlwaWRfdCBzaGVsbF9wZ3JwID0gZ2V0cGdycCgpOworCQkJCUdfc2F2ZWRfdHR5X3BncnAgPSB0Y2dldHBncnAoR19pbnRlcmFjdGl2ZV9mZCk7CisJCQkJaWYgKEdfc2F2ZWRfdHR5X3BncnAgPT0gc2hlbGxfcGdycCkKKwkJCQkJYnJlYWs7CisJCQkJLyogc2VuZCBUVElOIHRvIG91cnNlbGYgKHNob3VsZCBzdG9wIHVzKSAqLworCQkJCWtpbGwoLSBzaGVsbF9wZ3JwLCBTSUdUVElOKTsKKwkJCX0KKwkJfQorCisJCS8qIEluc3RhbGwgbW9yZSBzaWduYWwgaGFuZGxlcnMgKi8KKwkJaW5zdGFsbF9zcGVjaWFsX3NpZ2hhbmRsZXJzKCk7CisKKwkJaWYgKEdfc2F2ZWRfdHR5X3BncnApIHsKKwkJCS8qIFNldCBvdGhlciBzaWduYWxzIHRvIHJlc3RvcmUgc2F2ZWRfdHR5X3BncnAgKi8KKwkJCWluc3RhbGxfZmF0YWxfc2lnaGFuZGxlcnMoKTsKKwkJCS8qIFB1dCBvdXJzZWx2ZXMgaW4gb3VyIG93biBwcm9jZXNzIGdyb3VwCisJCQkgKiAoYmFzaCwgdG9vLCBkb2VzIHRoaXMgb25seSBpZiBjdHR5IGlzIGF2YWlsYWJsZSkgKi8KKwkJCWJiX3NldHBncnAoKTsgLyogaXMgdGhlIHNhbWUgYXMgc2V0cGdpZChvdXJfcGlkLCBvdXJfcGlkKTsgKi8KKwkJCS8qIEdyYWIgY29udHJvbCBvZiB0aGUgdGVybWluYWwgKi8KKwkJCXRjc2V0cGdycChHX2ludGVyYWN0aXZlX2ZkLCBnZXRwaWQoKSk7CisJCX0KKwkJZW5hYmxlX3Jlc3RvcmVfdHR5X3BncnBfb25fZXhpdCgpOworCisjIGlmIEVOQUJMRV9IVVNIX1NBVkVISVNUT1JZICYmIE1BWF9ISVNUT1JZID4gMAorCQl7CisJCQljb25zdCBjaGFyICpocCA9IGdldF9sb2NhbF92YXJfdmFsdWUoIkhJU1RGSUxFIik7CisJCQlpZiAoIWhwKSB7CisJCQkJaHAgPSBnZXRfbG9jYWxfdmFyX3ZhbHVlKCJIT01FIik7CisJCQkJaWYgKGhwKQorCQkJCQlocCA9IGNvbmNhdF9wYXRoX2ZpbGUoaHAsICIuaHVzaF9oaXN0b3J5Iik7CisJCQl9IGVsc2UgeworCQkJCWhwID0geHN0cmR1cChocCk7CisJCQl9CisJCQlpZiAoaHApIHsKKwkJCQlHLmxpbmVfaW5wdXRfc3RhdGUtPmhpc3RfZmlsZSA9IGhwOworCQkJCS8vc2V0X2xvY2FsX3Zhcih4YXNwcmludGYoIkhJU1RGSUxFPSVzIiwgLi4uKSk7CisJCQl9CisjICBpZiBFTkFCTEVfRkVBVFVSRV9TSF9ISVNURklMRVNJWkUKKwkJCWhwID0gZ2V0X2xvY2FsX3Zhcl92YWx1ZSgiSElTVEZJTEVTSVpFIik7CisJCQlHLmxpbmVfaW5wdXRfc3RhdGUtPm1heF9oaXN0b3J5ID0gc2l6ZV9mcm9tX0hJU1RGSUxFU0laRShocCk7CisjICBlbmRpZgorCQl9CisjIGVuZGlmCisJfSBlbHNlIHsKKwkJaW5zdGFsbF9zcGVjaWFsX3NpZ2hhbmRsZXJzKCk7CisJfQorI2VsaWYgRU5BQkxFX0hVU0hfSU5URVJBQ1RJVkUKKwkvKiBObyBqb2IgY29udHJvbCBjb21waWxlZCBpbiwgb25seSBwcm9tcHQvbGluZSBlZGl0aW5nICovCisJaWYgKGlzYXR0eShTVERJTl9GSUxFTk8pICYmIGlzYXR0eShTVERPVVRfRklMRU5PKSkgeworCQlHX2ludGVyYWN0aXZlX2ZkID0gZmNudGwoU1RESU5fRklMRU5PLCBGX0RVUEZELCAyNTUpOworCQlpZiAoR19pbnRlcmFjdGl2ZV9mZCA8IDApIHsKKwkJCS8qIHRyeSB0byBkdXAgdG8gYW55IGZkICovCisJCQlHX2ludGVyYWN0aXZlX2ZkID0gZHVwKFNURElOX0ZJTEVOTyk7CisJCQlpZiAoR19pbnRlcmFjdGl2ZV9mZCA8IDApCisJCQkJLyogZ2l2ZSB1cCAqLworCQkJCUdfaW50ZXJhY3RpdmVfZmQgPSAwOworCQl9CisJfQorCWlmIChHX2ludGVyYWN0aXZlX2ZkKSB7CisJCWNsb3NlX29uX2V4ZWNfb24oR19pbnRlcmFjdGl2ZV9mZCk7CisJfQorCWluc3RhbGxfc3BlY2lhbF9zaWdoYW5kbGVycygpOworI2Vsc2UKKwkvKiBXZSBoYXZlIGludGVyYWN0aXZlbmVzcyBjb2RlIGRpc2FibGVkICovCisJaW5zdGFsbF9zcGVjaWFsX3NpZ2hhbmRsZXJzKCk7CisjZW5kaWYKKwkvKiBiYXNoOgorCSAqIGlmIGludGVyYWN0aXZlIGJ1dCBub3QgYSBsb2dpbiBzaGVsbCwgc291cmNlcyB+Ly5iYXNocmMKKwkgKiAoLS1ub3JjIHR1cm5zIHRoaXMgb2ZmLCAtLXJjZmlsZSA8ZmlsZT4gb3ZlcnJpZGVzKQorCSAqLworCisJaWYgKCFFTkFCTEVfRkVBVFVSRV9TSF9FWFRSQV9RVUlFVCAmJiBHX2ludGVyYWN0aXZlX2ZkKSB7CisJCS8qIG5vdGU6IGFzaCBhbmQgaHVzaCBzaGFyZSB0aGlzIHN0cmluZyAqLworCQlwcmludGYoIlxuXG4lcyAlc1xuIgorCQkJSUZfSFVTSF9IRUxQKCJFbnRlciAnaGVscCcgZm9yIGEgbGlzdCBvZiBidWlsdC1pbiBjb21tYW5kcy5cbiIpCisJCQkiXG4iLAorCQkJYmJfYmFubmVyLAorCQkJImh1c2ggLSB0aGUgaHVtYmxlIHNoZWxsIgorCQkpOworCX0KKworCXBhcnNlX2FuZF9ydW5fZmlsZShzdGRpbik7CisKKyBmaW5hbF9yZXR1cm46CisJaHVzaF9leGl0KEcubGFzdF9leGl0Y29kZSk7Cit9CisKKworI2lmIEVOQUJMRV9NU0gKK2ludCBtc2hfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1zaF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwkvL2JiX2Vycm9yX21zZygibXNoIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgaHVzaCBpbnN0ZWFkIik7CisJcmV0dXJuIGh1c2hfbWFpbihhcmdjLCBhcmd2KTsKK30KKyNlbmRpZgorCisKKy8qCisgKiBCdWlsdC1pbnMKKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl90cnVlKGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBydW5fYXBwbGV0X21haW4oY2hhciAqKmFyZ3YsIGludCAoKmFwcGxldF9tYWluX2Z1bmMpKGludCBhcmdjLCBjaGFyICoqYXJndikpCit7CisJaW50IGFyZ2MgPSAwOworCXdoaWxlICgqYXJndikgeworCQlhcmdjKys7CisJCWFyZ3YrKzsKKwl9CisJcmV0dXJuIGFwcGxldF9tYWluX2Z1bmMoYXJnYywgYXJndiAtIGFyZ2MpOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX3Rlc3QoY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIHJ1bl9hcHBsZXRfbWFpbihhcmd2LCB0ZXN0X21haW4pOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX2VjaG8oY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIHJ1bl9hcHBsZXRfbWFpbihhcmd2LCBlY2hvX21haW4pOworfQorCisjaWYgRU5BQkxFX1BSSU5URgorc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl9wcmludGYoY2hhciAqKmFyZ3YpCit7CisJcmV0dXJuIHJ1bl9hcHBsZXRfbWFpbihhcmd2LCBwcmludGZfbWFpbik7Cit9CisjZW5kaWYKKworc3RhdGljIGNoYXIgKipza2lwX2Rhc2hfZGFzaChjaGFyICoqYXJndikKK3sKKwlhcmd2Kys7CisJaWYgKGFyZ3ZbMF0gJiYgYXJndlswXVswXSA9PSAnLScgJiYgYXJndlswXVsxXSA9PSAnLScgJiYgYXJndlswXVsyXSA9PSAnXDAnKQorCQlhcmd2Kys7CisJcmV0dXJuIGFyZ3Y7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fZXZhbChjaGFyICoqYXJndikKK3sKKwlpbnQgcmNvZGUgPSBFWElUX1NVQ0NFU1M7CisKKwlhcmd2ID0gc2tpcF9kYXNoX2Rhc2goYXJndik7CisJaWYgKCphcmd2KSB7CisJCWNoYXIgKnN0ciA9IGV4cGFuZF9zdHJ2ZWNfdG9fc3RyaW5nKGFyZ3YpOworCQkvKiBiYXNoOgorCQkgKiBldmFsICJlY2hvIEhpOyBkb25lIiAoImRvbmUiIGlzIHN5bnRheCBlcnJvcik6CisJCSAqICJlY2hvIEhpIiB3aWxsIG5vdCBleGVjdXRlIHRvby4KKwkJICovCisJCXBhcnNlX2FuZF9ydW5fc3RyaW5nKHN0cik7CisJCWZyZWUoc3RyKTsKKwkJcmNvZGUgPSBHLmxhc3RfZXhpdGNvZGU7CisJfQorCXJldHVybiByY29kZTsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl9jZChjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICpuZXdkaXI7CisKKwlhcmd2ID0gc2tpcF9kYXNoX2Rhc2goYXJndik7CisJbmV3ZGlyID0gYXJndlswXTsKKwlpZiAobmV3ZGlyID09IE5VTEwpIHsKKwkJLyogYmFzaCBkb2VzIG5vdGhpbmcgKGV4aXRjb2RlIDApIGlmIEhPTUUgaXMgIiI7IGlmIGl0J3MgdW5zZXQsCisJCSAqIGJhc2ggc2F5cyAiYmFzaDogY2Q6IEhPTUUgbm90IHNldCIgYW5kIGRvZXMgbm90aGluZworCQkgKiAoZXhpdGNvZGUgMSkKKwkJICovCisJCWNvbnN0IGNoYXIgKmhvbWUgPSBnZXRfbG9jYWxfdmFyX3ZhbHVlKCJIT01FIik7CisJCW5ld2RpciA9IGhvbWUgPyBob21lIDogIi8iOworCX0KKwlpZiAoY2hkaXIobmV3ZGlyKSkgeworCQkvKiBNaW1pYyBiYXNoIG1lc3NhZ2UgZXhhY3RseSAqLworCQliYl9wZXJyb3JfbXNnKCJjZDogJXMiLCBuZXdkaXIpOworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKwkvKiBSZWFkIGN1cnJlbnQgZGlyIChnZXRfY3dkKDEpIGlzIGluc2lkZSkgYW5kIHNldCBQV0QuCisJICogTm90ZTogZG8gbm90IGVuZm9yY2UgZXhwb3J0aW5nLiBJZiBQV0Qgd2FzIHVuc2V0IG9yIHVuZXhwb3J0ZWQsCisJICogc2V0IGl0IGFnYWluLCBidXQgZG8gbm90IGV4cG9ydC4gYmFzaCBkb2VzIHRoZSBzYW1lLgorCSAqLworCXNldF9wd2RfdmFyKC8qZXhwOiovIDApOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fZXhlYyhjaGFyICoqYXJndikKK3sKKwlhcmd2ID0gc2tpcF9kYXNoX2Rhc2goYXJndik7CisJaWYgKGFyZ3ZbMF0gPT0gTlVMTCkKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsgLyogYmFzaCBkb2VzIHRoaXMgKi8KKworCS8qIENhcmVmdWw6IHdlIGNhbiBlbmQgdXAgaGVyZSBhZnRlciBbdl1mb3JrLiBEbyBub3QgcmVzdG9yZQorCSAqIHR0eSBwZ3JwIHRoZW4sIG9ubHkgdG9wLWxldmVsIHNoZWxsIHByb2Nlc3MgZG9lcyB0aGF0ICovCisJaWYgKEdfc2F2ZWRfdHR5X3BncnAgJiYgZ2V0cGlkKCkgPT0gRy5yb290X3BpZCkKKwkJdGNzZXRwZ3JwKEdfaW50ZXJhY3RpdmVfZmQsIEdfc2F2ZWRfdHR5X3BncnApOworCisJLyogVE9ETzogaWYgZXhlYyBmYWlscywgYmFzaCBkb2VzIE5PVCBleGl0ISBXZSBkby4KKwkgKiBXZSdsbCBuZWVkIHRvIHVuZG8gdHJhcCBjbGVhbnVwIChpdCdzIGluc2lkZSBleGVjdnBfb3JfZGllKQorCSAqIGFuZCB0Y3NldHBncnAsIGFuZCB0aGlzIGlzIGluaGVyZW50bHkgcmFjeS4KKwkgKi8KKwlleGVjdnBfb3JfZGllKGFyZ3YpOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX2V4aXQoY2hhciAqKmFyZ3YpCit7CisJZGVidWdfcHJpbnRmX2V4ZWMoIiVzKClcbiIsIF9fZnVuY19fKTsKKworCS8qIGludGVyYWN0aXZlIGJhc2g6CisJICogIyB0cmFwICJlY2hvIEVFRSIgRVhJVAorCSAqICMgZXhpdAorCSAqIGV4aXQKKwkgKiBUaGVyZSBhcmUgc3RvcHBlZCBqb2JzLgorCSAqIChpZiB0aGVyZSBhcmUgX3N0b3BwZWRfIGpvYnMsIHJ1bm5pbmcgb25lcyBkb24ndCBjb3VudCkKKwkgKiAjIGV4aXQKKwkgKiBleGl0CisJICogRUVFICh0aGVuIGJhc2ggZXhpdHMpCisJICoKKwkgKiBUT0RPOiB3ZSBjYW4gdXNlIEcuZXhpdGluZyA9IC0xIGFzIGluZGljYXRvciAibGFzdCBjbWQgd2FzIGV4aXQiCisJICovCisKKwkvKiBub3RlOiBFWElUIHRyYXAgaXMgcnVuIGJ5IGh1c2hfZXhpdCAqLworCWFyZ3YgPSBza2lwX2Rhc2hfZGFzaChhcmd2KTsKKwlpZiAoYXJndlswXSA9PSBOVUxMKQorCQlodXNoX2V4aXQoRy5sYXN0X2V4aXRjb2RlKTsKKwkvKiBtaW1pYyBiYXNoOiBleGl0IDEyM2FiYyA9PSBleGl0IDI1NSArIGVycm9yIG1zZyAqLworCXhmdW5jX2Vycm9yX3JldHZhbCA9IDI1NTsKKwkvKiBiYXNoOiBleGl0IC0yID09IGV4aXQgMjU0LCBubyBlcnJvciBtc2cgKi8KKwlodXNoX2V4aXQoeGF0b2koYXJndlswXSkgJiAweGZmKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfZXNjYXBlZChjb25zdCBjaGFyICpzKQoreworCWlmICgqcyA9PSAnXCcnKQorCQlnb3RvIHNxdW90ZTsKKwlkbyB7CisJCWNvbnN0IGNoYXIgKnAgPSBzdHJjaHJudWwocywgJ1wnJyk7CisJCS8qIHByaW50ICd4eHh4JywgcG9zc2libHkganVzdCAnJyAqLworCQlwcmludGYoIiclLipzJyIsIChpbnQpKHAgLSBzKSwgcyk7CisJCWlmICgqcCA9PSAnXDAnKQorCQkJYnJlYWs7CisJCXMgPSBwOworIHNxdW90ZToKKwkJLyogcyBwb2ludHMgdG8gJzsgcHJpbnQgIicnJy4uLicnJyIgKi8KKwkJcHV0Y2hhcignIicpOworCQlkbyBwdXRjaGFyKCdcJycpOyB3aGlsZSAoKisrcyA9PSAnXCcnKTsKKwkJcHV0Y2hhcignIicpOworCX0gd2hpbGUgKCpzKTsKK30KKworI2lmICFFTkFCTEVfSFVTSF9MT0NBTAorI2RlZmluZSBoZWxwZXJfZXhwb3J0X2xvY2FsKGFyZ3YsIGV4cCwgbHZsKSBcCisJaGVscGVyX2V4cG9ydF9sb2NhbChhcmd2LCBleHApCisjZW5kaWYKK3N0YXRpYyB2b2lkIGhlbHBlcl9leHBvcnRfbG9jYWwoY2hhciAqKmFyZ3YsIGludCBleHAsIGludCBsdmwpCit7CisJZG8geworCQljaGFyICpuYW1lID0gKmFyZ3Y7CisJCWNoYXIgKm5hbWVfZW5kID0gc3RyY2hybnVsKG5hbWUsICc9Jyk7CisKKwkJLyogU28gZmFyIHdlIGRvIG5vdCBjaGVjayB0aGF0IG5hbWUgaXMgdmFsaWQgKFRPRE8/KSAqLworCisJCWlmICgqbmFtZV9lbmQgPT0gJ1wwJykgeworCQkJc3RydWN0IHZhcmlhYmxlICp2YXIsICoqdnBwOworCisJCQl2cHAgPSBnZXRfcHRyX3RvX2xvY2FsX3ZhcihuYW1lLCBuYW1lX2VuZCAtIG5hbWUpOworCQkJdmFyID0gdnBwID8gKnZwcCA6IE5VTEw7CisKKwkJCWlmIChleHAgPT0gLTEpIHsgLyogdW5leHBvcnRpbmc/ICovCisJCQkJLyogZXhwb3J0IC1uIE5BTUUgKHdpdGhvdXQgPVZBTFVFKSAqLworCQkJCWlmICh2YXIpIHsKKwkJCQkJdmFyLT5mbGdfZXhwb3J0ID0gMDsKKwkJCQkJZGVidWdfcHJpbnRmX2VudigiJXM6IHVuc2V0ZW52ICclcydcbiIsIF9fZnVuY19fLCBuYW1lKTsKKwkJCQkJdW5zZXRlbnYobmFtZSk7CisJCQkJfSAvKiBlbHNlOiBleHBvcnQgLW4gTk9UX0VYSVNUSU5HX1ZBUjogbm8tb3AgKi8KKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCWlmIChleHAgPT0gMSkgeyAvKiBleHBvcnRpbmc/ICovCisJCQkJLyogZXhwb3J0IE5BTUUgKHdpdGhvdXQgPVZBTFVFKSAqLworCQkJCWlmICh2YXIpIHsKKwkJCQkJdmFyLT5mbGdfZXhwb3J0ID0gMTsKKwkJCQkJZGVidWdfcHJpbnRmX2VudigiJXM6IHB1dGVudiAnJXMnXG4iLCBfX2Z1bmNfXywgdmFyLT52YXJzdHIpOworCQkJCQlwdXRlbnYodmFyLT52YXJzdHIpOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisJCQkvKiBFeHBvcnRpbmcgbm9uLWV4aXN0aW5nIHZhcmlhYmxlLgorCQkJICogYmFzaCBkb2VzIG5vdCBwdXQgaXQgaW4gZW52aXJvbm1lbnQsCisJCQkgKiBidXQgcmVtZW1iZXJzIHRoYXQgaXQgaXMgZXhwb3J0ZWQsCisJCQkgKiBhbmQgZG9lcyBwdXQgaXQgaW4gZW52IHdoZW4gaXQgaXMgc2V0IGxhdGVyLgorCQkJICogV2UganVzdCBzZXQgaXQgdG8gIiIgYW5kIGV4cG9ydC4gKi8KKwkJCS8qIE9yLCBpdCdzICJsb2NhbCBOQU1FIiAod2l0aG91dCA9VkFMVUUpLgorCQkJICogYmFzaCBzZXRzIHRoZSB2YWx1ZSB0byAiIi4gKi8KKwkJCW5hbWUgPSB4YXNwcmludGYoIiVzPSIsIG5hbWUpOworCQl9IGVsc2UgeworCQkJLyogKFVuKWV4cG9ydGluZy9tYWtpbmcgbG9jYWwgTkFNRT1WQUxVRSAqLworCQkJbmFtZSA9IHhzdHJkdXAobmFtZSk7CisJCX0KKwkJc2V0X2xvY2FsX3ZhcihuYW1lLCAvKmV4cDoqLyBleHAsIC8qbHZsOiovIGx2bCwgLypybzoqLyAwKTsKKwl9IHdoaWxlICgqKythcmd2KTsKK30KKworc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl9leHBvcnQoY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0X3VuZXhwb3J0OworCisjaWYgRU5BQkxFX0hVU0hfRVhQT1JUX04KKwkvKiAiISI6IGRvIG5vdCBhYm9ydCBvbiBlcnJvcnMgKi8KKwlvcHRfdW5leHBvcnQgPSBnZXRvcHQzMihhcmd2LCAiIW4iKTsKKwlpZiAob3B0X3VuZXhwb3J0ID09ICh1aW50MzJfdCktMSkKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwlhcmd2ICs9IG9wdGluZDsKKyNlbHNlCisJb3B0X3VuZXhwb3J0ID0gMDsKKwlhcmd2Kys7CisjZW5kaWYKKworCWlmIChhcmd2WzBdID09IE5VTEwpIHsKKwkJY2hhciAqKmUgPSBlbnZpcm9uOworCQlpZiAoZSkgeworCQkJd2hpbGUgKCplKSB7CisjaWYgMAorCQkJCXB1dHMoKmUrKyk7CisjZWxzZQorCQkJCS8qIGFzaCBlbWl0czogZXhwb3J0IFZBUj0nVkFMJworCQkJCSAqIGJhc2g6IGRlY2xhcmUgLXggVkFSPSJWQUwiCisJCQkJICogd2UgZm9sbG93IGFzaCBleGFtcGxlICovCisJCQkJY29uc3QgY2hhciAqcyA9ICplKys7CisJCQkJY29uc3QgY2hhciAqcCA9IHN0cmNocihzLCAnPScpOworCisJCQkJaWYgKCFwKSAvKiB3dGY/IHRha2UgbmV4dCB2YXJpYWJsZSAqLworCQkJCQljb250aW51ZTsKKwkJCQkvKiBleHBvcnQgdmFyPSAqLworCQkJCXByaW50ZigiZXhwb3J0ICUuKnMiLCAoaW50KShwIC0gcykgKyAxLCBzKTsKKwkJCQlwcmludF9lc2NhcGVkKHAgKyAxKTsKKwkJCQlwdXRjaGFyKCdcbicpOworI2VuZGlmCisJCQl9CisJCQkvKmZmbHVzaF9hbGwoKTsgLSBkb25lIGFmdGVyIGVhY2ggYnVpbHRpbiBhbnl3YXkgKi8KKwkJfQorCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCWhlbHBlcl9leHBvcnRfbG9jYWwoYXJndiwgKG9wdF91bmV4cG9ydCA/IC0xIDogMSksIDApOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKworI2lmIEVOQUJMRV9IVVNIX0xPQ0FMCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX2xvY2FsKGNoYXIgKiphcmd2KQoreworCWlmIChHLmZ1bmNfbmVzdF9sZXZlbCA9PSAwKSB7CisJCWJiX2Vycm9yX21zZygiJXM6IG5vdCBpbiBhIGZ1bmN0aW9uIiwgYXJndlswXSk7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7IC8qIGJhc2ggY29tcGF0ICovCisJfQorCWhlbHBlcl9leHBvcnRfbG9jYWwoYXJndiwgMCwgRy5mdW5jX25lc3RfbGV2ZWwpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl90cmFwKGNoYXIgKiphcmd2KQoreworCWludCBzaWc7CisJY2hhciAqbmV3X2NtZDsKKworCWlmICghRy50cmFwcykKKwkJRy50cmFwcyA9IHh6YWxsb2Moc2l6ZW9mKEcudHJhcHNbMF0pICogTlNJRyk7CisKKwlhcmd2Kys7CisJaWYgKCEqYXJndikgeworCQlpbnQgaTsKKwkJLyogTm8gYXJnczogcHJpbnQgYWxsIHRyYXBwZWQgKi8KKwkJZm9yIChpID0gMDsgaSA8IE5TSUc7ICsraSkgeworCQkJaWYgKEcudHJhcHNbaV0pIHsKKwkJCQlwcmludGYoInRyYXAgLS0gIik7CisJCQkJcHJpbnRfZXNjYXBlZChHLnRyYXBzW2ldKTsKKwkJCQkvKiBub3RlOiBiYXNoIGFkZHMgIlNJRyIsIGJ1dCBvbmx5IGlmIGludm9rZWQKKwkJCQkgKiBhcyAiYmFzaCIuIElmIGNhbGxlZCBhcyAic2giLCBvciBpZiBzZXQgLW8gcG9zaXgsCisJCQkJICogdGhlbiBpdCBwcmludHMgc2hvcnQgc2lnbmFsIG5hbWVzLgorCQkJCSAqIFdlIGFyZSBwcmludGluZyBzaG9ydCBuYW1lczogKi8KKwkJCQlwcmludGYoIiAlc1xuIiwgZ2V0X3NpZ25hbWUoaSkpOworCQkJfQorCQl9CisJCS8qZmZsdXNoX2FsbCgpOyAtIGRvbmUgYWZ0ZXIgZWFjaCBidWlsdGluIGFueXdheSAqLworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCW5ld19jbWQgPSBOVUxMOworCS8qIElmIGZpcnN0IGFyZyBpcyBhIG51bWJlcjogcmVzZXQgYWxsIHNwZWNpZmllZCBzaWduYWxzICovCisJc2lnID0gYmJfc3RydG91KCphcmd2LCBOVUxMLCAxMCk7CisJaWYgKGVycm5vID09IDApIHsKKwkJaW50IHJldDsKKyBwcm9jZXNzX3NpZ19saXN0OgorCQlyZXQgPSBFWElUX1NVQ0NFU1M7CisJCXdoaWxlICgqYXJndikgeworCQkJc2lnaGFuZGxlcl90IGhhbmRsZXI7CisKKwkJCXNpZyA9IGdldF9zaWdudW0oKmFyZ3YrKyk7CisJCQlpZiAoc2lnIDwgMCB8fCBzaWcgPj0gTlNJRykgeworCQkJCXJldCA9IEVYSVRfRkFJTFVSRTsKKwkJCQkvKiBNaW1pYyBiYXNoIG1lc3NhZ2UgZXhhY3RseSAqLworCQkJCWJiX3BlcnJvcl9tc2coInRyYXA6ICVzOiBpbnZhbGlkIHNpZ25hbCBzcGVjaWZpY2F0aW9uIiwgYXJndlstMV0pOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQlmcmVlKEcudHJhcHNbc2lnXSk7CisJCQlHLnRyYXBzW3NpZ10gPSB4c3RyZHVwKG5ld19jbWQpOworCisJCQlkZWJ1Z19wcmludGYoInRyYXA6IHNldHRpbmcgU0lHJXMgKCVpKSB0byAnJXMnXG4iLAorCQkJCWdldF9zaWduYW1lKHNpZyksIHNpZywgRy50cmFwc1tzaWddKTsKKworCQkJLyogVGhlcmUgaXMgbm8gc2lnbmFsIGZvciAwIChFWElUKSAqLworCQkJaWYgKHNpZyA9PSAwKQorCQkJCWNvbnRpbnVlOworCisJCQlpZiAobmV3X2NtZCkKKwkJCQloYW5kbGVyID0gKG5ld19jbWRbMF0gPyByZWNvcmRfcGVuZGluZ19zaWdubyA6IFNJR19JR04pOworCQkJZWxzZQorCQkJCS8qIFdlIGFyZSByZW1vdmluZyB0cmFwIGhhbmRsZXIgKi8KKwkJCQloYW5kbGVyID0gcGlja19zaWdoYW5kbGVyKHNpZyk7CisJCQlpbnN0YWxsX3NpZ2hhbmRsZXIoc2lnLCBoYW5kbGVyKTsKKwkJfQorCQlyZXR1cm4gcmV0OworCX0KKworCWlmICghYXJndlsxXSkgeyAvKiBubyBzZWNvbmQgYXJnICovCisJCWJiX2Vycm9yX21zZygidHJhcDogaW52YWxpZCBhcmd1bWVudHMiKTsKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisKKwkvKiBGaXJzdCBhcmcgaXMgIi0iOiByZXNldCBhbGwgc3BlY2lmaWVkIHRvIGRlZmF1bHQgKi8KKwkvKiBGaXJzdCBhcmcgaXMgIi0tIjogc2tpcCBpdCwgdGhlIHJlc3QgaXMgImhhbmRsZXIgU0lHcy4uLiIgKi8KKwkvKiBFdmVyeXRoaW5nIGVsc2U6IHNldCBhcmcgYXMgc2lnbmFsIGhhbmRsZXIKKwkgKiAoaW5jbHVkZXMgIiIgY2FzZSwgd2hpY2ggaWdub3JlcyBzaWduYWwpICovCisJaWYgKGFyZ3ZbMF1bMF0gPT0gJy0nKSB7CisJCWlmIChhcmd2WzBdWzFdID09ICdcMCcpIHsgLyogIi0iICovCisJCQkvKiBuZXdfY21kIHJlbWFpbnMgTlVMTDogInJlc2V0IHRoZXNlIHNpZ3MiICovCisJCQlnb3RvIHJlc2V0X3RyYXBzOworCQl9CisJCWlmIChhcmd2WzBdWzFdID09ICctJyAmJiBhcmd2WzBdWzJdID09ICdcMCcpIHsgLyogIi0tIiAqLworCQkJYXJndisrOworCQl9CisJCS8qIGVsc2U6ICItc29tZXRoaW5nIiwgbm8gc3BlY2lhbCBtZWFuaW5nICovCisJfQorCW5ld19jbWQgPSAqYXJndjsKKyByZXNldF90cmFwczoKKwlhcmd2Kys7CisJZ290byBwcm9jZXNzX3NpZ19saXN0OworfQorCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy90eXBlLmh0bWwgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fdHlwZShjaGFyICoqYXJndikKK3sKKwlpbnQgcmV0ID0gRVhJVF9TVUNDRVNTOworCisJd2hpbGUgKCorK2FyZ3YpIHsKKwkJY29uc3QgY2hhciAqdHlwZTsKKwkJY2hhciAqcGF0aCA9IE5VTEw7CisKKwkJaWYgKDApIHt9IC8qIG1ha2UgY29uZGl0aW9uYWwgY29tcGlsZSBlYXNpZXIgYmVsb3cgKi8KKwkJLyplbHNlIGlmIChmaW5kX2FsaWFzKCphcmd2KSkKKwkJCXR5cGUgPSAiYW4gYWxpYXMiOyovCisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJCWVsc2UgaWYgKGZpbmRfZnVuY3Rpb24oKmFyZ3YpKQorCQkJdHlwZSA9ICJhIGZ1bmN0aW9uIjsKKyNlbmRpZgorCQllbHNlIGlmIChmaW5kX2J1aWx0aW4oKmFyZ3YpKQorCQkJdHlwZSA9ICJhIHNoZWxsIGJ1aWx0aW4iOworCQllbHNlIGlmICgocGF0aCA9IGZpbmRfaW5fcGF0aCgqYXJndikpICE9IE5VTEwpCisJCQl0eXBlID0gcGF0aDsKKwkJZWxzZSB7CisJCQliYl9lcnJvcl9tc2coInR5cGU6ICVzOiBub3QgZm91bmQiLCAqYXJndik7CisJCQlyZXQgPSBFWElUX0ZBSUxVUkU7CisJCQljb250aW51ZTsKKwkJfQorCisJCXByaW50ZigiJXMgaXMgJXNcbiIsICphcmd2LCB0eXBlKTsKKwkJZnJlZShwYXRoKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisjaWYgRU5BQkxFX0hVU0hfSk9CCisvKiBidWlsdC1pbiAnZmcnIGFuZCAnYmcnIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fZmdfYmcoY2hhciAqKmFyZ3YpCit7CisJaW50IGksIGpvYm51bTsKKwlzdHJ1Y3QgcGlwZSAqcGk7CisKKwlpZiAoIUdfaW50ZXJhY3RpdmVfZmQpCisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisKKwkvKiBJZiB0aGV5IGdhdmUgdXMgbm8gYXJncywgYXNzdW1lIHRoZXkgd2FudCB0aGUgbGFzdCBiYWNrZ3JvdW5kZWQgdGFzayAqLworCWlmICghYXJndlsxXSkgeworCQlmb3IgKHBpID0gRy5qb2JfbGlzdDsgcGk7IHBpID0gcGktPm5leHQpIHsKKwkJCWlmIChwaS0+am9iaWQgPT0gRy5sYXN0X2pvYmlkKSB7CisJCQkJZ290byBmb3VuZDsKKwkJCX0KKwkJfQorCQliYl9lcnJvcl9tc2coIiVzOiBubyBjdXJyZW50IGpvYiIsIGFyZ3ZbMF0pOworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKwlpZiAoc3NjYW5mKGFyZ3ZbMV0sICIlJSVkIiwgJmpvYm51bSkgIT0gMSkgeworCQliYl9lcnJvcl9tc2coIiVzOiBiYWQgYXJndW1lbnQgJyVzJyIsIGFyZ3ZbMF0sIGFyZ3ZbMV0pOworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKwlmb3IgKHBpID0gRy5qb2JfbGlzdDsgcGk7IHBpID0gcGktPm5leHQpIHsKKwkJaWYgKHBpLT5qb2JpZCA9PSBqb2JudW0pIHsKKwkJCWdvdG8gZm91bmQ7CisJCX0KKwl9CisJYmJfZXJyb3JfbXNnKCIlczogJWQ6IG5vIHN1Y2ggam9iIiwgYXJndlswXSwgam9ibnVtKTsKKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworIGZvdW5kOgorCS8qIFRPRE86IGJhc2ggcHJpbnRzIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uCisJICogb2Ygam9iIGJlaW5nIGZvcmVncm91bmRlZCAobGlrZSAic2xlZXAgMSB8IGNhdCIpICovCisJaWYgKGFyZ3ZbMF1bMF0gPT0gJ2YnICYmIEdfc2F2ZWRfdHR5X3BncnApIHsKKwkJLyogUHV0IHRoZSBqb2IgaW50byB0aGUgZm9yZWdyb3VuZC4gICovCisJCXRjc2V0cGdycChHX2ludGVyYWN0aXZlX2ZkLCBwaS0+cGdycCk7CisJfQorCisJLyogUmVzdGFydCB0aGUgcHJvY2Vzc2VzIGluIHRoZSBqb2IgKi8KKwlkZWJ1Z19wcmludGZfam9icygicmV2aXZpbmcgJWQgcHJvY3MsIHBncnAgJWRcbiIsIHBpLT5udW1fY21kcywgcGktPnBncnApOworCWZvciAoaSA9IDA7IGkgPCBwaS0+bnVtX2NtZHM7IGkrKykgeworCQlkZWJ1Z19wcmludGZfam9icygicmV2aXZpbmcgcGlkICVkXG4iLCBwaS0+Y21kc1tpXS5waWQpOworCX0KKwlwaS0+c3RvcHBlZF9jbWRzID0gMDsKKworCWkgPSBraWxsKC0gcGktPnBncnAsIFNJR0NPTlQpOworCWlmIChpIDwgMCkgeworCQlpZiAoZXJybm8gPT0gRVNSQ0gpIHsKKwkJCWRlbGV0ZV9maW5pc2hlZF9iZ19qb2IocGkpOworCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJfQorCQliYl9wZXJyb3JfbXNnKCJraWxsIChTSUdDT05UKSIpOworCX0KKworCWlmIChhcmd2WzBdWzBdID09ICdmJykgeworCQlyZW1vdmVfYmdfam9iKHBpKTsKKwkJcmV0dXJuIGNoZWNram9ic19hbmRfZmdfc2hlbGwocGkpOworCX0KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfSFVTSF9IRUxQCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX2hlbHAoY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCWNvbnN0IHN0cnVjdCBidWlsdF9pbl9jb21tYW5kICp4OworCisJcHJpbnRmKAorCQkiQnVpbHQtaW4gY29tbWFuZHM6XG4iCisJCSItLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworCWZvciAoeCA9IGJsdGluczE7IHggIT0gJmJsdGluczFbQVJSQVlfU0laRShibHRpbnMxKV07IHgrKykgeworCQlpZiAoeC0+Yl9kZXNjcikKKwkJCXByaW50ZigiJS0xMHMlc1xuIiwgeC0+Yl9jbWQsIHgtPmJfZGVzY3IpOworCX0KKwliYl9wdXRjaGFyKCdcbicpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisjZW5kaWYKKworI2lmIE1BWF9ISVNUT1JZICYmIEVOQUJMRV9GRUFUVVJFX0VESVRJTkcKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5faGlzdG9yeShjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJc2hvd19oaXN0b3J5KEcubGluZV9pbnB1dF9zdGF0ZSk7CisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KKyNlbmRpZgorCisjaWYgRU5BQkxFX0hVU0hfSk9CCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX2pvYnMoY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCBwaXBlICpqb2I7CisJY29uc3QgY2hhciAqc3RhdHVzX3N0cmluZzsKKworCWZvciAoam9iID0gRy5qb2JfbGlzdDsgam9iOyBqb2IgPSBqb2ItPm5leHQpIHsKKwkJaWYgKGpvYi0+YWxpdmVfY21kcyA9PSBqb2ItPnN0b3BwZWRfY21kcykKKwkJCXN0YXR1c19zdHJpbmcgPSAiU3RvcHBlZCI7CisJCWVsc2UKKwkJCXN0YXR1c19zdHJpbmcgPSAiUnVubmluZyI7CisKKwkJcHJpbnRmKEpPQl9TVEFUVVNfRk9STUFULCBqb2ItPmpvYmlkLCBzdGF0dXNfc3RyaW5nLCBqb2ItPmNtZHRleHQpOworCX0KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorI2VuZGlmCisKKyNpZiBIVVNIX0RFQlVHCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX21lbWxlYWsoY2hhciAqKmFyZ3YgVU5VU0VEX1BBUkFNKQoreworCXZvaWQgKnA7CisJdW5zaWduZWQgbG9uZyBsOworCisjIGlmZGVmIE1fVFJJTV9USFJFU0hPTEQKKwkvKiBPcHRpb25hbC4gUmVkdWNlcyBwcm9iYWJpbGl0eSBvZiBmYWxzZSBwb3NpdGl2ZXMgKi8KKwltYWxsb2NfdHJpbSgwKTsKKyMgZW5kaWYKKwkvKiBDcnVkZSBhdHRlbXB0IHRvIGZpbmQgd2hlcmUgImZyZWUgbWVtb3J5IiBzdGFydHMsCisJICogc2FucyBmcmFnbWVudGF0aW9uLiAqLworCXAgPSBtYWxsb2MoMjQwKTsKKwlsID0gKHVuc2lnbmVkIGxvbmcpcDsKKwlmcmVlKHApOworCXAgPSBtYWxsb2MoMzQwMCk7CisJaWYgKGwgPCAodW5zaWduZWQgbG9uZylwKSBsID0gKHVuc2lnbmVkIGxvbmcpcDsKKwlmcmVlKHApOworCisJaWYgKCFHLm1lbWxlYWtfdmFsdWUpCisJCUcubWVtbGVha192YWx1ZSA9IGw7CisKKwlsIC09IEcubWVtbGVha192YWx1ZTsKKwlpZiAoKGxvbmcpbCA8IDApCisJCWwgPSAwOworCWwgLz0gMTAyNDsKKwlpZiAobCA+IDEyNykKKwkJbCA9IDEyNzsKKworCS8qIEV4aXRjb2RlIGlzICJob3cgbWFueSBraWxvYnl0ZXMgd2UgbGVha2VkIHNpbmNlIDFzdCBjYWxsIiAqLworCXJldHVybiBsOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fcHdkKGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwlwdXRzKGdldF9jd2QoMCkpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKKy8qIEludGVycnVwdGliaWxpdHkgb2YgcmVhZCBidWlsdGluIGluIGJhc2gKKyAqICh0ZXN0ZWQgb24gYmFzaC00LjIuOCBieSBzZW5kaW5nIHNpZ25hbHMgKG5vdCBieSBeQykpOgorICoKKyAqIEVtcHR5IHRyYXAgbWFrZXMgcmVhZCBpZ25vcmUgY29ycmVzcG9uZGluZyBzaWduYWwsIGZvciBhbnkgc2lnbmFsLgorICoKKyAqIFNJR0lOVDoKKyAqIC0gdGVybWluYXRlcyBub24taW50ZXJhY3RpdmUgc2hlbGw7CisgKiAtIGludGVycnVwdHMgcmVhZCBpbiBpbnRlcmFjdGl2ZSBzaGVsbDsKKyAqIGlmIGl0IGhhcyBub24tZW1wdHkgdHJhcDoKKyAqIC0gZXhlY3V0ZXMgdHJhcCBhbmQgcmV0dXJucyB0byBjb21tYW5kIHByb21wdCBpbiBpbnRlcmFjdGl2ZSBzaGVsbDsKKyAqIC0gZXhlY3V0ZXMgdHJhcCBhbmQgcmV0dXJucyB0byByZWFkIGluIG5vbi1pbnRlcmFjdGl2ZSBzaGVsbDsKKyAqIFNJR1RFUk06CisgKiAtIGlzIGlnbm9yZWQgKGRvZXMgbm90IGludGVycnVwdCkgcmVhZCBpbiBpbnRlcmFjdGl2ZSBzaGVsbDsKKyAqIC0gdGVybWluYXRlcyBub24taW50ZXJhY3RpdmUgc2hlbGw7CisgKiBpZiBpdCBoYXMgbm9uLWVtcHR5IHRyYXA6CisgKiAtIGV4ZWN1dGVzIHRyYXAgYW5kIHJldHVybnMgdG8gcmVhZDsKKyAqIFNJR0hVUDoKKyAqIC0gdGVybWluYXRlcyBzaGVsbCAocmVnYXJkbGVzcyBvZiBpbnRlcmFjdGl2aXR5KTsKKyAqIGlmIGl0IGhhcyBub24tZW1wdHkgdHJhcDoKKyAqIC0gZXhlY3V0ZXMgdHJhcCBhbmQgcmV0dXJucyB0byByZWFkOworICovCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX3JlYWQoY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqcjsKKwljaGFyICpvcHRfbiA9IE5VTEw7CisJY2hhciAqb3B0X3AgPSBOVUxMOworCWNoYXIgKm9wdF90ID0gTlVMTDsKKwljaGFyICpvcHRfdSA9IE5VTEw7CisJY29uc3QgY2hhciAqaWZzOworCWludCByZWFkX2ZsYWdzOworCisJLyogIiEiOiBkbyBub3QgYWJvcnQgb24gZXJyb3JzLgorCSAqIE9wdGlvbiBzdHJpbmcgbXVzdCBzdGFydCB3aXRoICJzciIgdG8gbWF0Y2ggQlVJTFRJTl9SRUFEX3h4eAorCSAqLworCXJlYWRfZmxhZ3MgPSBnZXRvcHQzMihhcmd2LCAiIXNybjpwOnQ6dToiLCAmb3B0X24sICZvcHRfcCwgJm9wdF90LCAmb3B0X3UpOworCWlmIChyZWFkX2ZsYWdzID09ICh1aW50MzJfdCktMSkKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwlhcmd2ICs9IG9wdGluZDsKKwlpZnMgPSBnZXRfbG9jYWxfdmFyX3ZhbHVlKCJJRlMiKTsgLyogY2FuIGJlIE5VTEwgKi8KKworIGFnYWluOgorCXIgPSBzaGVsbF9idWlsdGluX3JlYWQoc2V0X2xvY2FsX3Zhcl9mcm9tX2hhbHZlcywKKwkJYXJndiwKKwkJaWZzLAorCQlyZWFkX2ZsYWdzLAorCQlvcHRfbiwKKwkJb3B0X3AsCisJCW9wdF90LAorCQlvcHRfdQorCSk7CisKKwlpZiAoKHVpbnRwdHJfdClyID09IDEgJiYgZXJybm8gPT0gRUlOVFIpIHsKKwkJdW5zaWduZWQgc2lnID0gY2hlY2tfYW5kX3J1bl90cmFwcygpOworCQlpZiAoc2lnICYmIHNpZyAhPSBTSUdJTlQpCisJCQlnb3RvIGFnYWluOworCX0KKworCWlmICgodWludHB0cl90KXIgPiAxKSB7CisJCWJiX2Vycm9yX21zZygiJXMiLCByKTsKKwkJciA9IChjaGFyKikodWludHB0cl90KTE7CisJfQorCisJcmV0dXJuICh1aW50cHRyX3QpcjsKK30KKworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvVjNfY2hhcDAyLmh0bWwjc2V0CisgKiBidWlsdC1pbiAnc2V0JyBoYW5kbGVyCisgKiBTVVN2MyBzYXlzOgorICogc2V0IFstYWJDZWZobW51dnhdIFstbyBvcHRpb25dIFthcmd1bWVudC4uLl0KKyAqIHNldCBbK2FiQ2VmaG1udXZ4XSBbK28gb3B0aW9uXSBbYXJndW1lbnQuLi5dCisgKiBzZXQgLS0gW2FyZ3VtZW50Li4uXQorICogc2V0IC1vCisgKiBzZXQgK28KKyAqIEltcGxlbWVudGF0aW9ucyBzaGFsbCBzdXBwb3J0IHRoZSBvcHRpb25zIGluIGJvdGggdGhlaXIgaHlwaGVuIGFuZAorICogcGx1cy1zaWduIGZvcm1zLiBUaGVzZSBvcHRpb25zIGNhbiBhbHNvIGJlIHNwZWNpZmllZCBhcyBvcHRpb25zIHRvIHNoLgorICogRXhhbXBsZXM6CisgKiBXcml0ZSBvdXQgYWxsIHZhcmlhYmxlcyBhbmQgdGhlaXIgdmFsdWVzOiBzZXQKKyAqIFNldCAkMSwgJDIsIGFuZCAkMyBhbmQgc2V0ICIkIyIgdG8gMzogc2V0IGMgYSBiCisgKiBUdXJuIG9uIHRoZSAteCBhbmQgLXYgb3B0aW9uczogc2V0IC14dgorICogVW5zZXQgYWxsIHBvc2l0aW9uYWwgcGFyYW1ldGVyczogc2V0IC0tCisgKiBTZXQgJDEgdG8gdGhlIHZhbHVlIG9mIHgsIGV2ZW4gaWYgaXQgYmVnaW5zIHdpdGggJy0nIG9yICcrJzogc2V0IC0tICIkeCIKKyAqIFNldCB0aGUgcG9zaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHRoZSBleHBhbnNpb24gb2YgeCwgZXZlbiBpZiB4IGV4cGFuZHMKKyAqIHdpdGggYSBsZWFkaW5nICctJyBvciAnKyc6IHNldCAtLSAkeAorICoKKyAqIFNvIGZhciwgd2Ugb25seSBzdXBwb3J0ICJzZXQgLS0gW2FyZ3VtZW50Li4uXSIgYW5kIHNvbWUgb2YgdGhlIHNob3J0IG5hbWVzLgorICovCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX3NldChjaGFyICoqYXJndikKK3sKKwlpbnQgbjsKKwljaGFyICoqcHAsICoqZ19hcmd2OworCWNoYXIgKmFyZyA9ICorK2FyZ3Y7CisKKwlpZiAoYXJnID09IE5VTEwpIHsKKwkJc3RydWN0IHZhcmlhYmxlICplOworCQlmb3IgKGUgPSBHLnRvcF92YXI7IGU7IGUgPSBlLT5uZXh0KQorCQkJcHV0cyhlLT52YXJzdHIpOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCWRvIHsKKwkJaWYgKHN0cmNtcChhcmcsICItLSIpID09IDApIHsKKwkJCSsrYXJndjsKKwkJCWdvdG8gc2V0X2FyZ3Y7CisJCX0KKwkJaWYgKGFyZ1swXSAhPSAnKycgJiYgYXJnWzBdICE9ICctJykKKwkJCWJyZWFrOworCQlmb3IgKG4gPSAxOyBhcmdbbl07ICsrbikgeworCQkJaWYgKHNldF9tb2RlKChhcmdbMF0gPT0gJy0nKSwgYXJnW25dLCBhcmd2WzFdKSkKKwkJCQlnb3RvIGVycm9yOworCQkJaWYgKGFyZ1tuXSA9PSAnbycgJiYgYXJndlsxXSkKKwkJCQlhcmd2Kys7CisJCX0KKwl9IHdoaWxlICgoYXJnID0gKisrYXJndikgIT0gTlVMTCk7CisJLyogTm93IGFyZ3ZbMF0gaXMgMXN0IGFyZ3VtZW50ICovCisKKwlpZiAoYXJnID09IE5VTEwpCisJCXJldHVybiBFWElUX1NVQ0NFU1M7Cisgc2V0X2FyZ3Y6CisKKwkvKiBOQjogRy5nbG9iYWxfYXJndlswXSAoJDApIGlzIG5ldmVyIGZyZWVkL2NoYW5nZWQgKi8KKwlnX2FyZ3YgPSBHLmdsb2JhbF9hcmd2OworCWlmIChHLmdsb2JhbF9hcmdzX21hbGxvY2VkKSB7CisJCXBwID0gZ19hcmd2OworCQl3aGlsZSAoKisrcHApCisJCQlmcmVlKCpwcCk7CisJCWdfYXJndlsxXSA9IE5VTEw7CisJfSBlbHNlIHsKKwkJRy5nbG9iYWxfYXJnc19tYWxsb2NlZCA9IDE7CisJCXBwID0geHphbGxvYyhzaXplb2YocHBbMF0pICogMik7CisJCXBwWzBdID0gZ19hcmd2WzBdOyAvKiByZXRhaW4gJDAgKi8KKwkJZ19hcmd2ID0gcHA7CisJfQorCS8qIFRoaXMgcmVhbGxvYydzIEcuZ2xvYmFsX2FyZ3YgKi8KKwlHLmdsb2JhbF9hcmd2ID0gcHAgPSBhZGRfc3RyaW5nc190b19zdHJpbmdzKGdfYXJndiwgYXJndiwgLypkdXA6Ki8gMSk7CisKKwluID0gMTsKKwl3aGlsZSAoKisrcHApCisJCW4rKzsKKwlHLmdsb2JhbF9hcmdjID0gbjsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7CisKKwkvKiBOb3RoaW5nIGtub3duLCBzbyBhYm9ydCAqLworIGVycm9yOgorCWJiX2Vycm9yX21zZygic2V0OiAlczogaW52YWxpZCBvcHRpb24iLCBhcmcpOworCXJldHVybiBFWElUX0ZBSUxVUkU7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fc2hpZnQoY2hhciAqKmFyZ3YpCit7CisJaW50IG4gPSAxOworCWFyZ3YgPSBza2lwX2Rhc2hfZGFzaChhcmd2KTsKKwlpZiAoYXJndlswXSkgeworCQluID0gYXRvaShhcmd2WzBdKTsKKwl9CisJaWYgKG4gPj0gMCAmJiBuIDwgRy5nbG9iYWxfYXJnYykgeworCQlpZiAoRy5nbG9iYWxfYXJnc19tYWxsb2NlZCkgeworCQkJaW50IG0gPSAxOworCQkJd2hpbGUgKG0gPD0gbikKKwkJCQlmcmVlKEcuZ2xvYmFsX2FyZ3ZbbSsrXSk7CisJCX0KKwkJRy5nbG9iYWxfYXJnYyAtPSBuOworCQltZW1tb3ZlKCZHLmdsb2JhbF9hcmd2WzFdLCAmRy5nbG9iYWxfYXJndltuKzFdLAorCQkJCUcuZ2xvYmFsX2FyZ2MgKiBzaXplb2YoRy5nbG9iYWxfYXJndlswXSkpOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX3NvdXJjZShjaGFyICoqYXJndikKK3sKKwljaGFyICphcmdfcGF0aCwgKmZpbGVuYW1lOworCUZJTEUgKmlucHV0OworCXNhdmVfYXJnX3Qgc3Y7CisjaWYgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCisJc21hbGxpbnQgc3ZfZmxnOworI2VuZGlmCisKKwlhcmd2ID0gc2tpcF9kYXNoX2Rhc2goYXJndik7CisJZmlsZW5hbWUgPSBhcmd2WzBdOworCWlmICghZmlsZW5hbWUpIHsKKwkJLyogYmFzaCBzYXlzOiAiYmFzaDogLjogZmlsZW5hbWUgYXJndW1lbnQgcmVxdWlyZWQiICovCisJCXJldHVybiAyOyAvKiBiYXNoIGNvbXBhdCAqLworCX0KKwlhcmdfcGF0aCA9IE5VTEw7CisJaWYgKCFzdHJjaHIoZmlsZW5hbWUsICcvJykpIHsKKwkJYXJnX3BhdGggPSBmaW5kX2luX3BhdGgoZmlsZW5hbWUpOworCQlpZiAoYXJnX3BhdGgpCisJCQlmaWxlbmFtZSA9IGFyZ19wYXRoOworCX0KKwlpbnB1dCA9IGZvcGVuX29yX3dhcm4oZmlsZW5hbWUsICJyIik7CisJZnJlZShhcmdfcGF0aCk7CisJaWYgKCFpbnB1dCkgeworCQkvKiBiYl9wZXJyb3JfbXNnKCIlcyIsICphcmd2KTsgLSBkb25lIGJ5IGZvcGVuX29yX3dhcm4gKi8KKwkJLyogUE9TSVg6IG5vbi1pbnRlcmFjdGl2ZSBzaGVsbCBzaG91bGQgYWJvcnQgaGVyZSwKKwkJICogbm90IG1lcmVseSBmYWlsLiBTbyBmYXIgbm8gb25lIGNvbXBsYWluZWQgOikKKwkJICovCisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJfQorCWNsb3NlX29uX2V4ZWNfb24oZmlsZW5vKGlucHV0KSk7CisKKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKKwlzdl9mbGcgPSBHLmZsYWdfcmV0dXJuX2luX3Byb2dyZXNzOworCS8qICJ3ZSBhcmUgaW5zaWRlIHNvdXJjZWQgZmlsZSwgb2sgdG8gdXNlIHJldHVybiIgKi8KKwlHLmZsYWdfcmV0dXJuX2luX3Byb2dyZXNzID0gLTE7CisjZW5kaWYKKwlpZiAoYXJndlsxXSkKKwkJc2F2ZV9hbmRfcmVwbGFjZV9HX2FyZ3MoJnN2LCBhcmd2KTsKKworCXBhcnNlX2FuZF9ydW5fZmlsZShpbnB1dCk7CisJZmNsb3NlKGlucHV0KTsKKworCWlmIChhcmd2WzFdKQorCQlyZXN0b3JlX0dfYXJncygmc3YsIGFyZ3YpOworI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCUcuZmxhZ19yZXR1cm5faW5fcHJvZ3Jlc3MgPSBzdl9mbGc7CisjZW5kaWYKKworCXJldHVybiBHLmxhc3RfZXhpdGNvZGU7Cit9CisKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fdW1hc2soY2hhciAqKmFyZ3YpCit7CisJaW50IHJjOworCW1vZGVfdCBtYXNrOworCisJcmMgPSAxOworCW1hc2sgPSB1bWFzaygwKTsKKwlhcmd2ID0gc2tpcF9kYXNoX2Rhc2goYXJndik7CisJaWYgKGFyZ3ZbMF0pIHsKKwkJbW9kZV90IG9sZF9tYXNrID0gbWFzazsKKworCQkvKiBudW1lcmljIHVtYXNrcyBhcmUgdGFrZW4gYXMtaXMgKi8KKwkJLyogc3ltYm9saWMgdW1hc2tzIGFyZSBpbnZlcnRlZDogInVtYXNrIGE9cngiIGNhbGxzIHVtYXNrKDIyMikgKi8KKwkJaWYgKCFpc2RpZ2l0KGFyZ3ZbMF1bMF0pKQorCQkJbWFzayBePSAwNzc3OworCQltYXNrID0gYmJfcGFyc2VfbW9kZShhcmd2WzBdLCBtYXNrKTsKKwkJaWYgKCFpc2RpZ2l0KGFyZ3ZbMF1bMF0pKQorCQkJbWFzayBePSAwNzc3OworCQlpZiAoKHVuc2lnbmVkKW1hc2sgPiAwNzc3KSB7CisJCQltYXNrID0gb2xkX21hc2s7CisJCQkvKiBiYXNoIG1lc3NhZ2VzOgorCQkJICogYmFzaDogdW1hc2s6ICdxJzogaW52YWxpZCBzeW1ib2xpYyBtb2RlIG9wZXJhdG9yCisJCQkgKiBiYXNoOiB1bWFzazogOTk5OiBvY3RhbCBudW1iZXIgb3V0IG9mIHJhbmdlCisJCQkgKi8KKwkJCWJiX2Vycm9yX21zZygiJXM6IGludmFsaWQgbW9kZSAnJXMnIiwgInVtYXNrIiwgYXJndlswXSk7CisJCQlyYyA9IDA7CisJCX0KKwl9IGVsc2UgeworCQkvKiBNaW1pYyBiYXNoICovCisJCXByaW50ZigiJTA0b1xuIiwgKHVuc2lnbmVkKSBtYXNrKTsKKwkJLyogZmFsbCB0aHJvdWdoIGFuZCByZXN0b3JlIG1hc2sgd2hpY2ggd2Ugc2V0IHRvIDAgKi8KKwl9CisJdW1hc2sobWFzayk7CisKKwlyZXR1cm4gIXJjOyAvKiByYyAhPSAwIC0gc3VjY2VzcyAqLworfQorCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy9WM19jaGFwMDIuaHRtbCN1bnNldCAqLworc3RhdGljIGludCBGQVNUX0ZVTkMgYnVpbHRpbl91bnNldChjaGFyICoqYXJndikKK3sKKwlpbnQgcmV0OworCXVuc2lnbmVkIG9wdHM7CisKKwkvKiAiISI6IGRvIG5vdCBhYm9ydCBvbiBlcnJvcnMgKi8KKwkvKiAiKyI6IHN0b3AgYXQgMXN0IG5vbi1vcHRpb24gKi8KKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgIiErdmYiKTsKKwlpZiAob3B0cyA9PSAodW5zaWduZWQpLTEpCisJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJaWYgKG9wdHMgPT0gMykgeworCQliYl9lcnJvcl9tc2coInVuc2V0OiAtdiBhbmQgLWYgYXJlIGV4Y2x1c2l2ZSIpOworCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCX0KKwlhcmd2ICs9IG9wdGluZDsKKworCXJldCA9IEVYSVRfU1VDQ0VTUzsKKwl3aGlsZSAoKmFyZ3YpIHsKKwkJaWYgKCEob3B0cyAmIDIpKSB7IC8qIG5vdCAtZiAqLworCQkJaWYgKHVuc2V0X2xvY2FsX3ZhcigqYXJndikpIHsKKwkJCQkvKiB1bnNldCA8bm9uZXhpc3RlbnRfdmFyPiBkb2Vzbid0IGZhaWwuCisJCQkJICogRXJyb3IgaXMgd2hlbiBvbmUgdHJpZXMgdG8gdW5zZXQgUk8gdmFyLgorCQkJCSAqIE1lc3NhZ2Ugd2FzIHByaW50ZWQgYnkgdW5zZXRfbG9jYWxfdmFyLiAqLworCQkJCXJldCA9IEVYSVRfRkFJTFVSRTsKKwkJCX0KKwkJfQorI2lmIEVOQUJMRV9IVVNIX0ZVTkNUSU9OUworCQllbHNlIHsKKwkJCXVuc2V0X2Z1bmMoKmFyZ3YpOworCQl9CisjZW5kaWYKKwkJYXJndisrOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L3V0aWxpdGllcy93YWl0Lmh0bWwgKi8KK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fd2FpdChjaGFyICoqYXJndikKK3sKKwlpbnQgcmV0ID0gRVhJVF9TVUNDRVNTOworCWludCBzdGF0dXM7CisKKwlhcmd2ID0gc2tpcF9kYXNoX2Rhc2goYXJndik7CisJaWYgKGFyZ3ZbMF0gPT0gTlVMTCkgeworCQkvKiBEb24ndCBjYXJlIGFib3V0IHdhaXQgcmVzdWx0cyAqLworCQkvKiBOb3RlIDE6IG11c3Qgd2FpdCB1bnRpbCB0aGVyZSBhcmUgbm8gbW9yZSBjaGlsZHJlbiAqLworCQkvKiBOb3RlIDI6IG11c3QgYmUgaW50ZXJydXB0aWJsZSAqLworCQkvKiBFeGFtcGxlczoKKwkJICogJCBzbGVlcCAzICYgc2xlZXAgNiAmIHdhaXQKKwkJICogWzFdIDMwOTM0IHNsZWVwIDMKKwkJICogWzJdIDMwOTM1IHNsZWVwIDYKKwkJICogWzFdIERvbmUgICAgICAgICAgICAgICAgICAgc2xlZXAgMworCQkgKiBbMl0gRG9uZSAgICAgICAgICAgICAgICAgICBzbGVlcCA2CisJCSAqICQgc2xlZXAgMyAmIHNsZWVwIDYgJiB3YWl0CisJCSAqIFsxXSAzMDkzNiBzbGVlcCAzCisJCSAqIFsyXSAzMDkzNyBzbGVlcCA2CisJCSAqIFsxXSBEb25lICAgICAgICAgICAgICAgICAgIHNsZWVwIDMKKwkJICogXkMgPC0tIGFmdGVyIH40IHNlYyBmcm9tIGtleWJvYXJkCisJCSAqICQKKwkJICovCisJCXdoaWxlICgxKSB7CisJCQlpbnQgc2lnOworCQkJc2lnc2V0X3Qgb2xkc2V0LCBhbGxzaWdzOworCisJCQkvKiB3YWl0cGlkIGlzIG5vdCBpbnRlcnJ1cHRpYmxlIGJ5IFNBX1JFU1RBUlRlZAorCQkJICogc2lnbmFscyB3aGljaCB3ZSB1c2UuIFRodXMsIHRoaXMgdWdseSBkYW5jZToKKwkJCSAqLworCisJCQkvKiBNYWtlIHN1cmUgcG9zc2libGUgU0lHQ0hMRCBpcyBzdG9yZWQgaW4ga2VybmVsJ3MKKwkJCSAqIHBlbmRpbmcgc2lnbmFsIG1hc2sgYmVmb3JlIHdlIGNhbGwgd2FpdHBpZC4KKwkJCSAqIE9yIGVsc2Ugd2UgbWF5IHJhY2Ugd2l0aCBTSUdDSExELCBsb3NlIGl0LAorCQkJICogYW5kIGdldCBzdHVjayBpbiBzaWd3YWl0aW5mby4uLgorCQkJICovCisJCQlzaWdmaWxsc2V0KCZhbGxzaWdzKTsKKwkJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmYWxsc2lncywgJm9sZHNldCk7CisKKwkJCWlmICghc2lnaXNlbXB0eXNldCgmRy5wZW5kaW5nX3NldCkpIHsKKwkJCQkvKiBDcmFwISB3ZSByYWNlZCB3aXRoIHNvbWUgc2lnbmFsISAqLworCQkJLy8Jc2lnID0gMDsKKwkJCQlnb3RvIHJlc3RvcmU7CisJCQl9CisKKwkJCWNoZWNram9icyhOVUxMKTsgLyogd2FpdHBpZChXTk9IQU5HKSBpbnNpZGUgKi8KKwkJCWlmIChlcnJubyA9PSBFQ0hJTEQpIHsKKwkJCQlzaWdwcm9jbWFzayhTSUdfU0VUTUFTSywgJm9sZHNldCwgTlVMTCk7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCS8qIFdhaXQgZm9yIFNJR0NITEQgb3IgYW55IG90aGVyIHNpZ25hbCAqLworCQkJLy9zaWcgPSBzaWd3YWl0aW5mbygmYWxsc2lncywgTlVMTCk7CisJCQkvKiBJdCBpcyB2aXRhbGx5IGltcG9ydGFudCBmb3Igc2lnc3VzcGVuZCB0aGF0IFNJR0NITEQgaGFzIG5vbi1ERkwgaGFuZGxlciEgKi8KKwkJCS8qIE5vdGU6IHNpZ3N1c3BlbmQgaW52b2tlcyBzaWduYWwgaGFuZGxlciAqLworCQkJc2lnc3VzcGVuZCgmb2xkc2V0KTsKKyByZXN0b3JlOgorCQkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvbGRzZXQsIE5VTEwpOworCisJCQkvKiBTbywgZGlkIHdlIGdldCBhIHNpZ25hbD8gKi8KKwkJCS8vaWYgKHNpZyA+IDApCisJCQkvLwlyYWlzZShzaWcpOyAvKiBydW4gaGFuZGxlciAqLworCQkJc2lnID0gY2hlY2tfYW5kX3J1bl90cmFwcygpOworCQkJaWYgKHNpZyAvKiYmIHNpZyAhPSBTSUdDSExEIC0gYWx3YXlzIHRydWUgKi8pIHsKKwkJCQkvKiBzZWUgbm90ZSAyICovCisJCQkJcmV0ID0gMTI4ICsgc2lnOworCQkJCWJyZWFrOworCQkJfQorCQkJLyogU0lHQ0hMRCwgb3Igbm8gc2lnbmFsLCBvciBpZ25vcmVkIG9uZSwgc3VjaCBhcyBTSUdRVUlULiBSZXBlYXQgKi8KKwkJfQorCQlyZXR1cm4gcmV0OworCX0KKworCS8qIFRoaXMgaXMgcHJvYmFibHkgYnVnZ3kgd3J0IGludGVycnVwdGlibGUtbmVzcyAqLworCXdoaWxlICgqYXJndikgeworCQlwaWRfdCBwaWQgPSBiYl9zdHJ0b3UoKmFyZ3YsIE5VTEwsIDEwKTsKKwkJaWYgKGVycm5vKSB7CisJCQkvKiBtaW1pYyBiYXNoIG1lc3NhZ2UgKi8KKwkJCWJiX2Vycm9yX21zZygid2FpdDogJyVzJzogbm90IGEgcGlkIG9yIHZhbGlkIGpvYiBzcGVjIiwgKmFyZ3YpOworCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJfQorCQlpZiAod2FpdHBpZChwaWQsICZzdGF0dXMsIDApID09IHBpZCkgeworCQkJcmV0ID0gV0VYSVRTVEFUVVMoc3RhdHVzKTsKKwkJCWlmIChXSUZTSUdOQUxFRChzdGF0dXMpKQorCQkJCXJldCA9IDEyOCArIFdURVJNU0lHKHN0YXR1cyk7CisJCX0gZWxzZSB7CisJCQliYl9wZXJyb3JfbXNnKCJ3YWl0ICVzIiwgKmFyZ3YpOworCQkJcmV0ID0gMTI3OworCQl9CisJCWFyZ3YrKzsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisjaWYgRU5BQkxFX0hVU0hfTE9PUFMgfHwgRU5BQkxFX0hVU0hfRlVOQ1RJT05TCitzdGF0aWMgdW5zaWduZWQgcGFyc2VfbnVtZXJpY19hcmd2MShjaGFyICoqYXJndiwgdW5zaWduZWQgZGVmLCB1bnNpZ25lZCBkZWZfbWluKQoreworCWlmIChhcmd2WzFdKSB7CisJCWRlZiA9IGJiX3N0cnRvdShhcmd2WzFdLCBOVUxMLCAxMCk7CisJCWlmIChlcnJubyB8fCBkZWYgPCBkZWZfbWluIHx8IGFyZ3ZbMl0pIHsKKwkJCWJiX2Vycm9yX21zZygiJXM6IGJhZCBhcmd1bWVudHMiLCBhcmd2WzBdKTsKKwkJCWRlZiA9IFVJTlRfTUFYOworCQl9CisJfQorCXJldHVybiBkZWY7Cit9CisjZW5kaWYKKworI2lmIEVOQUJMRV9IVVNIX0xPT1BTCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX2JyZWFrKGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGRlcHRoOworCWlmIChHLmRlcHRoX29mX2xvb3AgPT0gMCkgeworCQliYl9lcnJvcl9tc2coIiVzOiBvbmx5IG1lYW5pbmdmdWwgaW4gYSBsb29wIiwgYXJndlswXSk7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7IC8qIGJhc2ggY29tcGF0ICovCisJfQorCUcuZmxhZ19icmVha19jb250aW51ZSsrOyAvKiBCQ19CUkVBSyA9IDEgKi8KKworCUcuZGVwdGhfYnJlYWtfY29udGludWUgPSBkZXB0aCA9IHBhcnNlX251bWVyaWNfYXJndjEoYXJndiwgMSwgMSk7CisJaWYgKGRlcHRoID09IFVJTlRfTUFYKQorCQlHLmZsYWdfYnJlYWtfY29udGludWUgPSBCQ19CUkVBSzsKKwlpZiAoRy5kZXB0aF9vZl9sb29wIDwgZGVwdGgpCisJCUcuZGVwdGhfYnJlYWtfY29udGludWUgPSBHLmRlcHRoX29mX2xvb3A7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQorCitzdGF0aWMgaW50IEZBU1RfRlVOQyBidWlsdGluX2NvbnRpbnVlKGNoYXIgKiphcmd2KQoreworCUcuZmxhZ19icmVha19jb250aW51ZSA9IDE7IC8qIEJDX0NPTlRJTlVFID0gMiA9IDErMSAqLworCXJldHVybiBidWlsdGluX2JyZWFrKGFyZ3YpOworfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfSFVTSF9GVU5DVElPTlMKK3N0YXRpYyBpbnQgRkFTVF9GVU5DIGJ1aWx0aW5fcmV0dXJuKGNoYXIgKiphcmd2KQoreworCWludCByYzsKKworCWlmIChHLmZsYWdfcmV0dXJuX2luX3Byb2dyZXNzICE9IC0xKSB7CisJCWJiX2Vycm9yX21zZygiJXM6IG5vdCBpbiBhIGZ1bmN0aW9uIG9yIHNvdXJjZWQgc2NyaXB0IiwgYXJndlswXSk7CisJCXJldHVybiBFWElUX0ZBSUxVUkU7IC8qIGJhc2ggY29tcGF0ICovCisJfQorCisJRy5mbGFnX3JldHVybl9pbl9wcm9ncmVzcyA9IDE7CisKKwkvKiBiYXNoOgorCSAqIG91dCBvZiByYW5nZTogd3JhcHMgYXJvdW5kIGF0IDI1NiwgZG9lcyBub3QgZXJyb3Igb3V0CisJICogbm9uLW51bWVyaWMgcGFyYW06CisJICogZigpIHsgZmFsc2U7IHJldHVybiBxd2U7IH07IGY7IGVjaG8gJD8KKwkgKiBiYXNoOiByZXR1cm46IHF3ZTogbnVtZXJpYyBhcmd1bWVudCByZXF1aXJlZCAgPD09IHdlIGRvIHRoaXMKKwkgKiAyNTUgIDw9PSB3ZSBhbHNvIGRvIHRoaXMKKwkgKi8KKwlyYyA9IHBhcnNlX251bWVyaWNfYXJndjEoYXJndiwgRy5sYXN0X2V4aXRjb2RlLCAwKTsKKwlyZXR1cm4gcmM7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfZG9jLnR4dCBiL3NoZWxsL2h1c2hfZG9jLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjhkYzI0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF9kb2MudHh0CkBAIC0wLDAgKzEsMTQzIEBACisyMDA4LTA3LTE0CisKKwlDb21tYW5kIHBhcnNpbmcKKworQ29tbWFuZCBwYXJzaW5nIHJlc3VsdHMgaW4gYSBsaXN0IG9mICJwaXBlIiBzdHJ1Y3R1cmVzLgorVGhpcyBsaXN0IGNvcnJlc3BvbmQgbm90IG9ubHkgdG8gdXN1YWwgInBpcGUxIHx8IHBpcGUyICYmIHBpcGUzIgorbGlzdHMsIGJ1dCBpdCBhbHNvIGNvbnRyb2xzIGV4ZWN1dGlvbiBvZiBpZiwgd2hpbGUsIGV0YyBzdGF0ZW1lbnRzLgorRXZlcnkgc3VjaCBzdGF0ZW1lbnQgaXMgYSBsaXN0IGZvciBodXNoLiBMaXN0IGNvbnNpc3RzIG9mIHBpcGVzLgorCitzdHJ1Y3QgcGlwZSBmaWVsZHM6CisgIHNtYWxsaW50IHJlc193b3JkIC0gIm5vbmUiIGZvciBub3JtYWwgY29tbWFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgImlmIiBmb3IgaWYgY29uZGl0aW9uIGV0YworICBzdHJ1Y3QgY2hpbGRfcHJvZyBwcm9nc1tdIC0gYXJyYXkgb2YgY29tbWFuZHMgaW4gcGlwZQorICBzbWFsbGludCBmb2xsb3d1cCAtIGhvdyB0aGlzIHBpcGUgaXMgcmVsYXRlZCB0byBuZXh0OiBpcyBpdAorICAgICAgICAgICAgICAgICAgICAgICJwaXBlOyBwaXBlIiwgInBpcGUgJiBwaXBlIiAicGlwZSAmJiBwaXBlIiwKKyAgICAgICAgICAgICAgICAgICAgICAicGlwZSB8fCBwaXBlIj8KKworQmxvY2tzIG9mIGNvbW1hbmRzIHsgcGlwZTsgcGlwZTsgfSBhbmQgKHBpcGU7IHBpcGUpIGFyZSByZXByZXNlbnRlZAorYXMgb25lIHBpcGUgc3RydWN0IHdpdGggb25lIHByb2dzWzBdIGVsZW1lbnQgd2hpY2ggaXMgYSAiZ3JvdXAiIC0KK3N0cnVjdCBjaGlsZF9wcm9nIGNhbiBjb250YWluIGEgbGlzdCBvZiBwaXBlcy4gU29tZXRpbWVzIHRoZXNlCisiZ3JvdXBzIiBhcmUgY3JlYXRlZCBpbXBsaWNpdGx5LCBlLmcuIGV2ZXJ5IGNvbnRyb2wKK3N0YXRlbWVudCAoaWYsIHdoaWxlLCBldGMpIHNpdHMgaW5zaWRlIGl0cyBvd24gZ3JvdXAuCisKK3Jlc193b3JkIGNvbnRyb2xzIHN0YXRlbWVudCBleGVjdXRpb24uIEV4YW1wbGVzOgorCisiZWNobyBIZWxsbyIgLQorcGlwZSAwIHJlc193b3JkPU5PTkUgZm9sbG93dXA9U0VRIHByb2dbMF0gJ2VjaG8nICdIZWxsbycKK3BpcGUgMSByZXNfd29yZD1OT05FIGZvbGxvd3VwPVNFUQorCisiZWNobyBmb28gfHwgZWNobyBiYXIiIC0KK3BpcGUgMCByZXNfd29yZD1OT05FIGZvbGxvd3VwPU9SICBwcm9nWzBdICdlY2hvJyAnZm9vJworcGlwZSAxIHJlc193b3JkPU5PTkUgZm9sbG93dXA9U0VRIHByb2dbMF0gJ2VjaG8nICdiYXInCitwaXBlIDIgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD1TRVEKKworImlmIHRydWU7IHRoZW4gZWNobyBIZWxsbzsgdHJ1ZTsgZmkiIC0KK3Jlc193b3JkPU5PTkUgZm9sbG93dXA9U0VRCisgcHJvZyAwIGdyb3VwIHt9OgorICBwaXBlIDAgcmVzX3dvcmQ9SUYgZm9sbG93dXA9U0VRIHByb2dbMF0gJ3RydWUnCisgIHBpcGUgMSByZXNfd29yZD1USEVOIGZvbGxvd3VwPVNFUSBwcm9nWzBdICdlY2hvJyAnSGVsbG8nCisgIHBpcGUgMiByZXNfd29yZD1USEVOIGZvbGxvd3VwPVNFUSBwcm9nWzBdICd0cnVlJworICBwaXBlIDMgcmVzX3dvcmQ9RkkgZm9sbG93dXA9U0VRCisgIHBpcGUgNCByZXNfd29yZD1OT05FIGZvbGxvd3VwPShudWxsKQorcGlwZSAxIHJlc193b3JkPU5PTkUgZm9sbG93dXA9U0VRCisKK0Fib3ZlIHlvdSBzZWUgdGhhdCBpZiBpcyBhIGxpc3QsIGFuZCBpdCBzaXRzIGluIGEge30gZ3JvdXAKK2ltcGxpY2l0bHkgY3JlYXRlZCBieSBodXNoLiBBbHNvIG5vdGUgdHdvIFRIRU4gcmVzX3dvcmQncyAtCitpdCBpcyBleHBsYWluZWQgYmVsb3cuCisKKyJpZiB0cnVlOyB0aGVuIHsgZWNobyBIZWxsbzsgdHJ1ZTsgfTsgZmkiIC0KK3BpcGUgMCByZXNfd29yZD1OT05FIGZvbGxvd3VwPVNFUQorIHByb2cgMCBncm91cCB7fToKKyAgcGlwZSAwIHJlc193b3JkPUlGIGZvbGxvd3VwPVNFUSBwcm9nWzBdICd0cnVlJworICBwaXBlIDEgcmVzX3dvcmQ9VEhFTiBmb2xsb3d1cD1TRVEKKyAgIHByb2cgMCBncm91cCB7fToKKyAgICBwaXBlIDAgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD1TRVEgcHJvZ1swXSAnZWNobycgJ0hlbGxvJworICAgIHBpcGUgMSByZXNfd29yZD1OT05FIGZvbGxvd3VwPVNFUSBwcm9nWzBdICd0cnVlJworICAgIHBpcGUgMiByZXNfd29yZD1OT05FIGZvbGxvd3VwPVNFUQorICBwaXBlIDIgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD0obnVsbCkKK3BpcGUgMSByZXNfd29yZD1OT05FIGZvbGxvd3VwPVNFUQorCisiZm9yIHYgaW4gYSBiOyBkbyBlY2hvICR2OyB0cnVlOyBkb25lIiAtCitwaXBlIDAgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD1TRVEKKyBwcm9nIDAgZ3JvdXAge306CisgIHBpcGUgMCByZXNfd29yZD1GT1IgZm9sbG93dXA9U0VRIHByb2dbMF0gJ3YnCisgIHBpcGUgMSByZXNfd29yZD1JTiBmb2xsb3d1cD1TRVEgcHJvZ1swXSAnYScgJ2InCisgIHBpcGUgMiByZXNfd29yZD1ETyBmb2xsb3d1cD1TRVEgcHJvZ1swXSAnZWNobycgJyR2JworICBwaXBlIDMgcmVzX3dvcmQ9RE8gZm9sbG93dXA9U0VRIHByb2dbMF0gJ3RydWUnCisgIHBpcGUgNCByZXNfd29yZD1ET05FIGZvbGxvd3VwPVNFUQorICBwaXBlIDUgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD0obnVsbCkKK3BpcGUgMSByZXNfd29yZD1OT05FIGZvbGxvd3VwPVNFUQorCitOb3RlIGhvdyAiVEhFTiIgYW5kICJETyIgZG9lcyBub3QganVzdCBtYXJrIHRoZSBmaXJzdCBwaXBlLAoraXQgInN0aWNrcyIgdG8gYWxsIHBpcGVzIGluIHRoZSBib2R5LiBUaGlzIGlzIHVzZWQgd2hlbgoraHVzaCBleGVjdXRlcyBwYXJzZWQgcGlwZXMuCisKK0R1bW15IHRyYWlsaW5nIHBpcGVzIHdpdGggbm8gY29tbWFuZHMgYXJlIGFydGlmYWN0cyBvZiBpbXBlcmZlY3QKK3BhcnNpbmcgYWxnb3JpdGhtIC0gZG9uZV9waXBlKCkgYXBwZW5kcyBuZXcgcGlwZSBzdHJ1Y3QgYmVmb3JlaGFuZAorYW5kIGxhc3Qgb25lIGVuZHMgdXAgZW1wdHkgYW5kIHVudXNlZC4KKworImZvciIgYW5kICJjYXNlIiBzdGF0ZW1lbnRzIChhYil1c2UgcHJvZ3NbXSB0byBrZWVwIHRoZWlyIGRhdGEKK2luc3RlYWQgb2YgYXJndiB2ZWN0b3IgcHJvZ3NbXSB1c3VhbGx5IGRvLiAiZm9yIiBrZXl3b3JkIGlzIGZvcmNpbmcKK3BpcGUgdGVybWluYXRpb24gYWZ0ZXIgZmlyc3Qgd29yZCwgd2hpY2ggbWFrZXMgaHVzaCBzZWUKKyJmb3IgdiBpbi4uLiIgYXMgImZvciB2OyBpbi4uLiIuICJjYXNlIiBrZXl3b3JkIGRvZXMgdGhlIHNhbWUuCitPdGhlciBqdWRpY2l1b3NseSBwbGFjZWQgaGFja3MgbWFrZSBodXNoIHNlZQorImNhc2Ugd29yZCBpbiBhKSBjbWQxOzsgYikgY21kMjs7IGVzYWMiIGFzIGlmIGl0IHdhcworImNhc2Ugd29yZDsgbWF0Y2ggYTsgY21kOyBtYXRjaCBiOyBjbWQyOyBlc2FjIgorKCJtYXRjaCIgaXMgYSBmaWN0aXRpb3VzIGtleXdvcmQgaGVyZSk6CisKKyJjYXNlIHdvcmQgaW4gYSkgY21kMTs7IGIpIGNtZDI7IGVzYWMiIC0KK3BpcGUgMCByZXNfd29yZD1OT05FIGZvbGxvd3VwPTEgU0VRCisgcHJvZyAwIGdyb3VwIHt9OgorICBwaXBlIDAgcmVzX3dvcmQ9Q0FTRSBmb2xsb3d1cD1TRVEgcHJvZ1swXSAnd29yZCcKKyAgcGlwZSAxIHJlc193b3JkPU1BVENIIGZvbGxvd3VwPVNFUSBwcm9nWzBdICdhJworICBwaXBlIDIgcmVzX3dvcmQ9Q0FTRUkgZm9sbG93dXA9U0VRIHByb2dbMF0gJ2NtZDEnCisgIHBpcGUgMyByZXNfd29yZD1NQVRDSCBmb2xsb3d1cD1TRVEgcHJvZ1swXSAnYicKKyAgcGlwZSA0IHJlc193b3JkPUNBU0VJIGZvbGxvd3VwPVNFUSBwcm9nWzBdICdjbWQyJworICBwaXBlIDUgcmVzX3dvcmQ9Q0FTRUkgZm9sbG93dXA9U0VRIHByb2dbMF0gJ2NtZDMnCisgIHBpcGUgNiByZXNfd29yZD1FU0FDIGZvbGxvd3VwPVNFUQorICBwaXBlIDcgcmVzX3dvcmQ9Tk9ORSBmb2xsb3d1cD0obnVsbCkKK3BpcGUgMSByZXNfd29yZD1OT05FIGZvbGxvd3VwPVNFUQorCisKKzIwMDgtMDEKKworCUNvbW1hbmQgZXhlY3V0aW9uCisKKy8qIGNhbGxzaXRlOiBwcm9jZXNzX2NvbW1hbmRfc3VicyAqLworZ2VuZXJhdGVfc3RyZWFtX2Zyb21fbGlzdChzdHJ1Y3QgcGlwZSAqaGVhZCkgLSBoYW5kbGVzIGBjbWRzYAorICBjcmVhdGUgVU5JWCBwaXBlCisgIFt2XWZvcmsKKyAgY2hpbGQ6CisgIHJlZGlyZWN0IHBpcGUgb3V0cHV0IHRvIHN0ZG91dAorICBfZXhpdChydW5fbGlzdChoZWFkKSk7ICAgLyogbGVha3MgbWVtb3J5ICovCisgIHBhcmVudDoKKyAgcmV0dXJuIFVOSVggcGlwZSdzIG91dHB1dCBmZAorICAvKiBoZWFkIGlzIGZyZWVkIGJ5IHRoZSBjYWxsZXIgKi8KKworLyogY2FsbHNpdGU6IHBhcnNlX2FuZF9ydW5fc3RyZWFtICovCitydW5fYW5kX2ZyZWVfbGlzdChzdHJ1Y3QgcGlwZSAqKQorICBydW5fbGlzdChzdHJ1Y3QgcGlwZSAqKQorICBmcmVlX3BpcGVfbGlzdChzdHJ1Y3QgcGlwZSAqKQorCisvKiBjYWxsc2l0ZXM6IGdlbmVyYXRlX3N0cmVhbV9mcm9tX2xpc3QsIHJ1bl9hbmRfZnJlZV9saXN0LCBwc2V1ZG9fZXhlYywgcnVuX3BpcGUgKi8KK3J1bl9saXN0KHN0cnVjdCBwaXBlICopIC0gaGFuZGxlcyAiY21kOyBjbWQyICYmIGNtZDMiLCB3aGlsZS9mb3IvZG8gbG9vcHMKKyAgcnVuX3BpcGUgLSBmb3IgZXZlcnkgcGlwZSBpbiBsaXN0CisKKy8qIGNhbGxzaXRlOiBydW5fbGlzdCAqLworcnVuX3BpcGUgLSBydW5zICJjbWQxIHwgY21kMiB8IGNtZDMgWyZdIgorICBydW5fbGlzdCAtIHVzZWQgaWYgb25seSBvbmUgY21kIGFuZCBpdCBpcyBvZiB0aGUgZm9ybSAie2NtZHM7fSIKKyAgZm9ya3MgZm9yIGV2ZXJ5IGNtZCBpZiBtb3JlIHRoYW4gb25lIGNtZCBvciBpZiAmIGlzIHRoZXJlCisgIHBzZXVkb19leGVjIC0gcnVucyBlYWNoICJjbWROIiAoaGFuZGxlcyBidWlsdGlucyBldGMpCisKKy8qIGNhbGxzaXRlOiBydW5fcGlwZSAqLworcHNldWRvX2V4ZWMgLSBydW5zICJjbWQiIChoYW5kbGVzIGJ1aWx0aW5zIGV0YykKKyAgZXhlYyAtIGV4ZWNzIGV4dGVybmFsIHByb2dyYW1zCisgIHJ1bl9saXN0IC0gdXNlZCBpZiBjbWROIGlzICIoY21kcykiIG9yICJ7Y21kczt9IgorICAvKiBwcm9ibGVtOiBwdXRlbnYncyBtYWxsb2NlZCBzdHJpbmdzIGludG8gZW52aXJvbiAtCisgICoqIHdpdGggdmZvcmsgdGhleSB3aWxsIGxlYWsgaW50byBwYXJlbnQgcHJvY2VzcworICAqLworICAvKiBwcm9ibGVtIHdpdGggRU5BQkxFX0ZFQVRVUkVfU0hfU1RBTkRBTE9ORToKKyAgKiogcnVuX2FwcGxldF9ub19hbmRfZXhpdChhLCBhcmd2KSB1c2VzIGV4aXQgLSB0aGlzIGNhbiBpbnRlcmZlcmUKKyAgKiogd2l0aCB2Zm9yayAtIHN3aXRjaCB0byBfZXhpdCB0aGVyZT8KKyAgKi8KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfbGVha3Rvb2wuc2ggYi9zaGVsbC9odXNoX2xlYWt0b29sLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNhMzVlYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX2xlYWt0b29sLnNoCkBAIC0wLDAgKzEsMjUgQEAKKyMhL2Jpbi9zaAorCisjIGh1c2gncyBzdGRlcnIgd2l0aCBsZWFrIGRlYnVnIGVuYWJsZWQKK291dHB1dD1vdXRwdXQKKworZnJlZWxpc3Q9YGdyZXAgJ2ZyZWUgMHgnICIkb3V0cHV0IiB8IGN1dCAtZCcgJyAtZjIgfCBzb3J0IHwgdW5pcSB8IHhhcmdzYAorCitncmVwIC12IGZyZWUgIiRvdXRwdXQiID4iJG91dHB1dC5sZWFrZWQiCisKK2k9OAorbGlzdD0KK2ZvciBmcmVlZCBpbiAkZnJlZWxpc3Q7IGRvCisgICAgbGlzdD0iJGxpc3QgLWUgJGZyZWVkIgorICAgIHRlc3QgJCgoLS1pKSkgIT0gMCAmJiBjb250aW51ZQorICAgIGVjaG8gRHJvcHBpbmcgJGxpc3QKKyAgICBncmVwIC1GIC12ICRsaXN0IDwiJG91dHB1dC5sZWFrZWQiID4iJG91dHB1dC50ZW1wIgorICAgIG12ICIkb3V0cHV0LnRlbXAiICIkb3V0cHV0LmxlYWtlZCIKKyAgICBpPTgKKyAgICBsaXN0PQorZG9uZQoraWYgdGVzdCAiJGxpc3QiOyB0aGVuCisgICAgZWNobyBEcm9wcGluZyAkbGlzdAorICAgIGdyZXAgLUYgLXYgJGxpc3QgPCIkb3V0cHV0LmxlYWtlZCIgPiIkb3V0cHV0LnRlbXAiCisgICAgbXYgIiRvdXRwdXQudGVtcCIgIiRvdXRwdXQubGVha2VkIgorZmkKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLWFyaXRoL2FyaXRoLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYXJpdGgvYXJpdGgucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEyMDFmYgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWFyaXRoL2FyaXRoLnJpZ2h0CkBAIC0wLDAgKzEsMTQ3IEBACitGb3JtYXQ6ICdleHBlY3RlZCBhY3R1YWwnCisxNjMgMTYzCis0IDQKKzE2IDE2Cis4IDgKKzIgMgorNCA0CisyIDIKKzIgMgorMSAxCiswIDAKKzAgMAorMCAwCisxIDEKKzEgMQorMiAyCistMyAtMworLTIgLTIKKzEgMQorMCAwCisyIDIKKzEzMTA3MiAxMzEwNzIKKzI5IDI5CiszMyAzMworNDkgNDkKKzEgMQorMSAxCiswIDAKKzAgMAorMSAxCisxIDEKKzEgMQorMiAyCiszIDMKKzEgMQorNTggNTgKKzIgMgorNjAgNjAKKzEgMQorMjU2IDI1NgorMTYgMTYKKzYyIDYyCis0IDQKKzI5IDI5Cis1IDUKK3VuYXJ5IHBsdXMsIG1pbnVzCistNCAtNAorNCA0Citjb25kaXRpb25hbCBleHByZXNzaW9ucworMSAxCiszMiAzMgorMzIgMzIKKzEgMQorMSAxCiszMiAzMgorY2hlY2sgdGhhdCBwYXJlbnRoZXNlcyBpbiBgY21kYCBhcmUgaW50ZXJwcmV0ZWQgY29ycmVjdGx5CiszIDMKK2NoZWNrIHRoYXQgdGhlIHVuZXZhbHVhdGVkIHBhcnQgb2YgdGhlIHRlcm5hcnkgb3BlcmF0b3IgZG9lcyBub3QgZG8gZXZhbHVhdGlvbiBvciBhc3NpZ25tZW50CisyMCAyMAorMzAgMzAKKzIwIDIwCiszMCAzMAorY2hlY2sgcHJlY2VkZW5jZSBvZiBhc3NpZ25tZW50IHZzLiBjb25kaXRpb25hbCBvcGVyYXRvcgoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2NoZWNrIHByZWNlZGVuY2Ugb2YgYXNzaWdubWVudCB2cy4gY29uZGl0aW9uYWwgb3BlcmF0b3IKK2Fzc29jaWF0aXZpdHkgb2YgYXNzaWdubWVudC1vcGVyYXRvciBvcGVyYXRvcgorNiA2Cis2LDUsMyA2LDUsMworb2N0YWwsIGhleAorMjYzIDI2MworMjU1IDI1NQorNDAgNDAKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCitodXNoOiBkaXZpZGUgYnkgemVybworaHVzaDogY2FuJ3QgZXhlY3V0ZSAnbGV0JzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2h1c2g6IGNhbid0IGV4ZWN1dGUgJ2xldCc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKK2FiYworZGVmCitnaGkKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCisxNiAxNgoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2h1c2g6IG1hbGZvcm1lZCA/OiBvcGVyYXRvcgoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKzkgOQoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCis5IDkKKzkgOQorOSA5Cis3IDcKKzcKKzQgNAorMzI3NjcgMzI3NjcKKzMyNzY4IDMyNzY4CisxMzEwNzIgMTMxMDcyCisyMTQ3NDgzNjQ3IDIxNDc0ODM2NDcKKzEgMQorNCA0Cis0IDQKKzUgNQorNSA1Cis0IDQKKzMgMworMyAzCis0IDQKKzQgNAoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCitodXNoOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCis0IDQKKzcgNworLTcgLTcKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCitodXNoOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCis2IDYKKzMgMworNyA3Cis0IDQKKzAgMAorMyAzCis3IDcKKzIgMgorLTIgLTIKKzEgMQoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCitodXNoOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCis1IDUKKzEgMQorNCA0CiswIDAKK2h1c2g6IGFyaXRobWV0aWMgc3ludGF4IGVycm9yCitodXNoOiBhcml0aG1ldGljIHN5bnRheCBlcnJvcgorOCAxMgoraHVzaDogYXJpdGhtZXRpYyBzeW50YXggZXJyb3IKKzQyCis0MgorNDIKK2h1c2g6IGNhbid0IGV4ZWN1dGUgJ2FbYltjXWRdPWUnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1hcml0aC9hcml0aC50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWFyaXRoL2FyaXRoLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJjNmIzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1hcml0aC9hcml0aC50ZXN0cwpAQCAtMCwwICsxLDMwNSBAQAorI2FzaCMgc2V0ICtvIHBvc2l4CisjYXNoIyBkZWNsYXJlIC1pIGl2IGp2CisKK2VjaG8gIkZvcm1hdDogJ2V4cGVjdGVkIGFjdHVhbCciCisKK2l2PSQoKCAzICsgNSAqIDMyICkpCitlY2hvIDE2MyAkaXYKKyNhc2gjIGl2PWl2KzMKKyNhc2gjIGVjaG8gMTY2ICRpdgoraXY9MgoranY9aXYKKworOiAkKChqdiAqPSAyKSkgIyNodXNoIyMgbGV0ICJqdiAqPSAyIgorZWNobyA0ICRqdgoranY9JCgoICRqdiA8PCAyICkpCitlY2hvIDE2ICRqdgorCis6ICQoKGp2PSRqdiAvIDIpKSAjI2h1c2gjIyBsZXQganY9IiRqdiAvIDIiCitlY2hvIDggJGp2CisjYXNoIyBqdj0ianYgPj4gMiIKKzogJCgoanY9anYgPj4gMikpICMjaHVzaCMjIGxldCBqdj0ianYgPj4gMiIKK2VjaG8gMiAkanYKKworaXY9JCgoaXYrICRqdikpCitlY2hvIDQgJGl2CitlY2hvIDIgJCgoaXYgLT0ganYpKQorZWNobyAyICRpdgorZWNobyAxICQoKCBpdiA9PSBqdiApKQorZWNobyAwICQoKCBpdiAhPSAkanYgKSkKK2VjaG8gMCAkKCggaXYgPCBqdiApKQorZWNobyAwICQoKCAkaXYgPiAkanYgKSkKK2VjaG8gMSAkKCggaXYgPD0gJGp2ICkpCitlY2hvIDEgJCgoICRpdiA+PSBqdiApKQorCitlY2hvIDIgJGp2CitlY2hvIC0zICQoKCB+JGp2ICkpCitlY2hvIC0yICQoKCB+MSApKQorZWNobyAxICQoKCAhIDAgKSkKKworZWNobyAwICQoKCBqdiAlIDIgKSkKK2VjaG8gMiAkKCggJGl2ICUgNCApKQorCitlY2hvIDEzMTA3MiAkKCggaXYgPDw9IDE2ICkpCitlY2hvIDI5ICQoKCBpdiAlPSAzMyApKQorCitlY2hvIDMzICQoKCAzMyAmIDU1ICkpCitlY2hvIDQ5ICQoKCAzMyB8IDE3ICkpCisKK2VjaG8gMSAkKCggaXYgJiYgJGp2ICkpCitlY2hvIDEgJCgoICRpdiB8fCBqdiApKQorCitlY2hvIDAgJCgoIGl2ICYmIDAgKSkKK2VjaG8gMCAkKCggaXYgJiAwICkpCitlY2hvIDEgJCgoIGl2ICYmIDEgKSkKK2VjaG8gMSAkKCggaXYgJiAxICkpCisKK2VjaG8gMSAkKCggJGp2IHx8IDAgKSkKK2VjaG8gMiAkKCgganYgfCAwICkpCitlY2hvIDMgJCgoIGp2IHwgMSApKQorZWNobyAxICQoKCAkanYgfHwgMSApKQorCis6ICQoKGl2ICo9IGp2KSkgIyNodXNoIyMgbGV0ICdpdiAqPSBqdicKK2VjaG8gNTggJGl2CitlY2hvIDIgJGp2Cis6ICQoKGp2ICs9ICRpdikpICMjaHVzaCMjIGxldCAianYgKz0gJGl2IgorZWNobyA2MCAkanYKKworZWNobyAxICQoKCBqdiAvPSBpdiApKQorZWNobyAyNTYgJCgoIGp2IDw8PSA4ICkpCitlY2hvIDE2ICQoKCBqdiA+Pj0gNCApKQorCitlY2hvIDYyICQoKCBpdiB8PSA0ICkpCitlY2hvIDQgJCgoIGl2ICY9IDQgKSkKKworZWNobyAyOSAkKCggaXYgKz0gKGp2ICsgOSkpKQorZWNobyA1ICQoKCAoaXYgKyA0KSAlIDcgKSkKKworZWNobyB1bmFyeSBwbHVzLCBtaW51cworZWNobyAtNCAkKCggKzQgLSA4ICkpCitlY2hvIDQgJCgoIC00ICsgOCApKQorCitlY2hvIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zCitlY2hvIDEgJCgoIDQ8NSA/IDEgOiAzMikpCitlY2hvIDMyICQoKCA0PjUgPyAxIDogMzIpKQorZWNobyAzMiAkKCggND4oMiszKSA/IDEgOiAzMikpCitlY2hvIDEgJCgoIDQ8KDIrMykgPyAxIDogMzIpKQorZWNobyAxICQoKCAoMisyKTwoMiszKSA/IDEgOiAzMikpCitlY2hvIDMyICQoKCAoMisyKT4oMiszKSA/IDEgOiAzMikpCisKK2VjaG8gJ2NoZWNrIHRoYXQgcGFyZW50aGVzZXMgaW4gYGNtZGAgYXJlIGludGVycHJldGVkIGNvcnJlY3RseScKKyMgXHgyOCBpcyAnKCcKK2VjaG8gMyAkKCggKCBgcHJpbnRmICcoXHgyOCAxJ2AgKyBgZWNobyAyXClcKWAgKSApKQorCitlY2hvIGNoZWNrIHRoYXQgdGhlIHVuZXZhbHVhdGVkIHBhcnQgb2YgdGhlIHRlcm5hcnkgb3BlcmF0b3IgZG9lcyBub3QgZG8gZXZhbHVhdGlvbiBvciBhc3NpZ25tZW50Cit4PWkrPTIKK3k9ais9MgorI2FzaCMgZGVjbGFyZSAtaSBpPTEgaj0xCisgICAgICBpPTEKKyAgICAgIGo9MQorZWNobyAyMCAkKCgxID8gMjAgOiAoeCs9MikpKQorI2FzaCMgZWNobyAkaSwkeCAgICAgICAgICAgICAjIGFzaCBtaXNoYW5kbGVzIHRoaXMKK2VjaG8gMzAgJCgoMCA/ICh5Kz0yKSA6IDMwKSkKKyNhc2gjIGVjaG8gJGosJHkgICAgICAgICAgICAgIyBhc2ggbWlzaGFuZGxlcyB0aGlzCisKK3g9aSs9MgoreT1qKz0yCisjYXNoIyBkZWNsYXJlIC1pIGk9MSBqPTEKKyAgICAgIGk9MQorICAgICAgaj0xCitlY2hvIDIwICQoKDEgPyAyMCA6ICh4Kz0yKSkpCisjYXNoIyBlY2hvICRpLCR4ICAgICAgICAgICAgICMgYXNoIG1pc2hhbmRsZXMgdGhpcworZWNobyAzMCAkKCgwID8gKHkrPTIpIDogMzApKQorI2FzaCMgZWNobyAkaSwkeSAgICAgICAgICAgICAjIGFzaCBtaXNoYW5kbGVzIHRoaXMKKworZWNobyBjaGVjayBwcmVjZWRlbmNlIG9mIGFzc2lnbm1lbnQgdnMuIGNvbmRpdGlvbmFsIG9wZXJhdG9yCisjIHNob3VsZCBiZSBhbiBlcnJvcgorI2FzaCMgZGVjbGFyZSAtaSB4PTIKKyAgICAgIHg9MgorI2FzaG5vdGUjIGJhc2ggcmVwb3J0cyBlcnJvciBidXQgY29udGludWVzLCBhc2ggYWJvcnRzIC0gdXNpbmcgc3Vic2hlbGwgdG8gJ2VtdWxhdGUnIGJhc2g6CisoICB5PSQoKDEgPyAyMCA6IHgrPTIpKSAgKQorCitlY2hvIGNoZWNrIHByZWNlZGVuY2Ugb2YgYXNzaWdubWVudCB2cy4gY29uZGl0aW9uYWwgb3BlcmF0b3IKKyNhc2gjIGRlY2xhcmUgLWkgeD0yCisgICAgICB4PTIKKyMgYXNoIHNheXMgImxpbmUgTk5OOiBzeW50YXggZXJyb3I6IDAgPyB4Kz0yIDogMjAiCisjYXNoIyBlY2hvIDIwICQoKDAgPyB4Kz0yIDogMjApKQorCitlY2hvIGFzc29jaWF0aXZpdHkgb2YgYXNzaWdubWVudC1vcGVyYXRvciBvcGVyYXRvcgorI2FzaCMgZGVjbGFyZSAtaSBpPTEgaj0yIGs9MworaT0xCitqPTIKK2s9MworZWNobyA2ICQoKGkgKz0gaiArPSBrKSkKK2VjaG8gNiw1LDMgJGksJGosJGsKKworZWNobyBvY3RhbCwgaGV4CitlY2hvIDI2MyAkKCggMHgxMDAgfCAwMDcgKSkKK2VjaG8gMjU1ICQoKCAweGZmICkpCisjYXNoIyBlY2hvIDI1NSAkKCggMTYjZmYgKSkKKyNhc2gjIGVjaG8gMTI3ICQoKCAxNiNGRi8yICkpCisjYXNoIyBlY2hvIDM2ICQoKCA4IzQ0ICkpCisKK2VjaG8gNDAgJCgoIDggXiAzMiApKQorCisjYXNoIyAjIG90aGVyIGJhc2VzCisjYXNoIyBlY2hvIDEwICQoKCAxNiNhICkpCisjYXNoIyBlY2hvIDEwICQoKCAzMiNhICkpCisjYXNoIyBlY2hvIDEwICQoKCA1NiNhICkpCisjYXNoIyBlY2hvIDEwICQoKCA2NCNhICkpCisjYXNoIworI2FzaCMgZWNobyAxMCAkKCggMTYjQSApKQorI2FzaCMgZWNobyAxMCAkKCggMzIjQSApKQorI2FzaCMgZWNobyAzNiAkKCggNTYjQSApKQorI2FzaCMgZWNobyAzNiAkKCggNjQjQSApKQorI2FzaCMKKyNhc2gjIGVjaG8gNjIgJCgoIDY0I0AgKSkKKyNhc2gjIGVjaG8gNjMgJCgoIDY0I18gKSkKKworI2FzaCMgIyB3ZWlyZCBiYXNlcyAoZXJyb3IpCisjYXNoIyBlY2hvICQoKCAzNDI1IzU2ICkpCisKKyNhc2gjICMgbWlzc2luZyBudW1iZXIgYWZ0ZXIgYmFzZQorI2FzaCMgZWNobyAwICQoKCAyIyApKQorCisjIHRoZXNlIHNob3VsZCBnZW5lcmF0ZSBlcnJvcnMKKyggIGVjaG8gJCgoIDcgPSA0MyApKSAgICAgICkKKyNhc2gjIGVjaG8gJCgoIDIjNDQgKSkKKyggIGVjaG8gJCgoIDQ0IC8gMCApKSAgICAgICkKKyggIGxldCAnanYgKz0gJGl2JyAgICAgICAgICkKKyggIGVjaG8gJCgoIGp2ICs9IFwkaXYgKSkgICkKKyggIGxldCAncnYgPSA3ICsgKDQzICogNicgICkKKworI2FzaCMgIyBtb3JlIGVycm9ycworI2FzaCMgZGVjbGFyZSAtaSBpCisjYXNoIyBpPTAjNAorI2FzaCMgaT0yIzExMCMxMQorCisoKGVjaG8gYWJjOyBlY2hvIGRlZjspOyBlY2hvIGdoaSkKKworI2FzaCMgaWYgKCgoNCs0KSArICg0ICsgNykpKTsgdGhlbgorI2FzaCMgCWVjaG8gb2sKKyNhc2gjIGZpCisKKyNhc2gjICgoKSkJIyBtYWtlIHN1cmUgdGhlIG51bGwgZXhwcmVzc2lvbiB3b3JrcyBPSworCisjYXNoIyBhPSgwIDIgNCA2KQorI2FzaCMgZWNobyA2ICQoKCBhWzFdICsgYVsyXSApKQorI2FzaCMgZWNobyAxICQoKCAoYVsxXSArIGFbMl0pID09IGFbM10gKSkKKyNhc2gjICgoIChhWzFdICsgYVsyXSkgPT0gYVszXSApKSA7IGVjaG8gMCAkPworCisjIHRlc3QgcHVzaGluZyBhbmQgcG9wcGluZyB0aGUgZXhwcmVzc2lvbiBzdGFjawordW5zZXQgQQorQT0iNCArICIKKyggIGVjaG8gQSAkKCggKCA0ICsgQSApICsgNCApKSAgKQorQT0iMyArIDUiCitlY2hvIDE2ICQoKCAoIDQgKyBBICkgKyA0ICkpCisKKyMgYmFkbHktZm9ybWVkIGNvbmRpdGlvbmFsIGV4cHJlc3Npb25zCisoICBlY2hvICQoKCA0ID8gOiAkQSApKSAgKQorKCAgZWNobyAkKCggMSA/IDIwICkpICAgICkKKyggIGVjaG8gJCgoIDQgPyAyMCA6ICkpICApCisKKyMgcHJlY2VkZW5jZSBhbmQgc2hvcnQtY2lyY3VpdCBldmFsdWF0aW9uCitCPTkKK2VjaG8gOSAkQgorCisjIGVycm9yCisoICBlY2hvICQoKCAwICYmIEI9NDIgKSk7IGVjaG8gOSAkQiAgKQorCisjIGVycm9yCisoICBlY2hvICQoKCAxIHx8IEI9ODggKSk7IGVjaG8gOSAkQiAgKQorCisjIGFzaCBtaXN0YWtlbmx5IGV2YWx1YXRlcyBCPS4uLiBiZWxvdworI2FzaCMgZWNobyAwICQoKCAwICYmIChCPTQyKSApKQorZWNobyA5ICRCCisjYXNoIyBlY2hvIDAgJCgoICgkeyR9IC0gJCQpICYmIChCPTQyKSApKQorZWNobyA5ICRCCisjYXNoIyBlY2hvIDEgJCgoIDEgfHwgKEI9ODgpICkpCitlY2hvIDkgJEIKKworCisjIHVudGlsIGNvbW1hbmQgd2l0aCAoKCApKSBjb21tYW5kCit4PTcKKworZWNobyA3ICR4CisjYXNoIyB1bnRpbCAoKCB4ID09IDQgKSkKKyAgICAgIHVudGlsIHRlc3QgIiR4IiA9IDQKK2RvCisJZWNobyAkeAorCXg9NAorZG9uZQorCitlY2hvIDQgJHgKKworIyBleHBvbmVudGlhdGlvbgorZWNobyAzMjc2NyAkKCggMioqMTUgLSAxKSkKK2VjaG8gMzI3NjggJCgoIDIqKigxNi0xKSkpCitlY2hvIDEzMTA3MiAkKCggMioqMTYqMiApKQorZWNobyAyMTQ3NDgzNjQ3ICQoKCAyKiozMS0xKSkKK2VjaG8gMSAkKCggMioqMCApKQorCisjIHtwcmUscG9zdH0te2luYyxkZWN9cmVtZW50IGFuZCBhc3NvY2lhdGVkIGVycm9ycworCit4PTQKKworZWNobyA0ICR4CitlY2hvIDQgJCgoIHgrKyApKQorZWNobyA1ICR4CitlY2hvIDUgJCgoIHgtLSApKQorZWNobyA0ICR4CisKK2VjaG8gMyAkKCggLS14ICkpCitlY2hvIDMgJHgKKworZWNobyA0ICQoKCArK3ggKSkKK2VjaG8gNCAkeAorCisjIGJhc2ggMy4yIGFwcGFyZW50bHkgdGhpbmtzIHRoYXQgKys3IGlzIDcKKyNhc2gjIGVjaG8gNyAkKCggKys3ICkpCisoICBlY2hvICQoKCA3LS0gKSkgICAgKQorCisoICBlY2hvICQoKCAtLXg9NyApKSAgKQorKCAgZWNobyAkKCggKyt4PTcgKSkgICkKKworKCAgZWNobyAkKCggeCsrPTcgKSkgICkKKyggIGVjaG8gJCgoIHgtLT03ICkpICApCisKK2VjaG8gNCAkeAorCitlY2hvIDcgJCgoICs3ICkpCitlY2hvIC03ICQoKCAtNyApKQorCisjIGJhc2ggMy4yIGFwcGFyZW50bHkgdGhpbmtzIHRoYXQgKys3IGlzIDcKKyNhc2gjIGVjaG8gJCgoICsrNyApKQorI2FzaCMgZWNobyAkKCggLS03ICkpCisKKyR7VEhJU19TSH0gLi9hcml0aDEuc3ViCiske1RISVNfU0h9IC4vYXJpdGgyLnN1YgorCit4PTQKK3k9NworCisjYXNoIyAoKCB4PTggLCB5PTEyICkpCisgICAgICB4PTgKKyAgICAgIHk9MTIKK2VjaG8gJHggJHkKKworI2FzaCMgIyBzaG91bGQgYmUgYW4gZXJyb3IKKyNhc2gjICgoIHg9OSB5PTQxICkpCisKKyMgVGhlc2UgYXJlIGVycm9ycwordW5zZXQgYgorKCAgZWNobyAkKChhIGIpKSAgKQorI2FzaCMgKChhIGIpKQorCituPTQyCitwcmludGYgIiVkXG4iICRuCitwcmludGYgIiVpXG4iICRuCisjYXNoIyBlY2hvICQoKCA4IyQocHJpbnRmICIlb1xuIiAkbikgKSkKK3ByaW50ZiAiJXVcbiIgJG4KKyNhc2gjIGVjaG8gJCgoIDE2IyQocHJpbnRmICIleFxuIiAkbikgKSkKKyNhc2gjIGVjaG8gJCgoIDE2IyQocHJpbnRmICIlWFxuIiAkbikgKSkKKworIyBjYXVzZXMgbG9uZ2ptcCBib3RjaGVzIHRocm91Z2ggYmFzaC0yLjA1YgorYVtiW2NdZF09ZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYXJpdGgvYXJpdGgxLnN1YiBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWFyaXRoL2FyaXRoMS5zdWIKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODBhYTk5OQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWFyaXRoL2FyaXRoMS5zdWIKQEAgLTAsMCArMSw0MCBAQAorIyB0ZXN0IG9mIHJlZG9uZSBwb3N0LWluY3JlbWVudCBhbmQgcG9zdC1kZWNyZW1lbnQgY29kZQorKCAgZWNobyAkKCggNC0tICkpICAgKQorKCAgZWNobyAkKCggNCsrICkpICAgKQorKCAgZWNobyAkKCggNCAtLSApKSAgKQorKCAgZWNobyAkKCggNCArKyApKSAgKQorCisjYXNoIyAoKCBhcnJheVswXSsrICkpCisjYXNoIyBlY2hvICR7YXJyYXl9CisKKyNhc2gjICgoIGFycmF5WzBdICsrICkpCisjYXNoIyBlY2hvICR7YXJyYXl9CisKKyNhc2gjICgoIGErKyApKQorI2FzaCMgZWNobyAkYQorI2FzaCMgKCggYSArKyApKQorI2FzaCMgZWNobyAkYQorICAgICAgYT0yCisKK2VjaG8gNiAkKCggYSArKyArIDQgKSkKK2VjaG8gMyAkYQorCitlY2hvIDcgJCgoIGErKys0ICkpCitlY2hvIDQgJGEKKworZWNobyAwICQoKCBhLS0tNCApKQorZWNobyAzICRhCisKK2VjaG8gNyAkKCggYSAtLSArIDQgKSkKK2VjaG8gMiAkYQorCitlY2hvIC0yICQoKCBhIC0tIC0gNCApKQorZWNobyAxICRhCisKKyNhc2gjICgoICsrICsgNyApKQorCisjYXNoIyAoKCArKyApKQorKCAgZWNobyAkKCggKysrNyApKSAgKQorIyBiYXNoIDMuMiBhcHBhcmVudGx5IHRoaW5rcyB0aGF0ICsrICs3IGlzIDcKKyNhc2gjIGVjaG8gJCgoICsrICsgNyApKQorI2FzaCMgKCggLS0gKSkKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLWFyaXRoL2FyaXRoMi5zdWIgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1hcml0aC9hcml0aDIuc3ViCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY3ZTNjOTIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1hcml0aC9hcml0aDIuc3ViCkBAIC0wLDAgKzEsNTcgQEAKKyMgYmFzaCAzLjIgYXBwYXJlbnRseSB0aGlua3MgdGhhdCArKzcgaXMgNyBldGMKKyggIGVjaG8gJCgoIC0tNyApKSAgICkKKyggIGVjaG8gJCgoICsrNyApKSAgICkKKyggIGVjaG8gJCgoIC0tIDcgKSkgICkKKyggIGVjaG8gJCgoICsrIDcgKSkgICkKKworI2FzaCMgKCgrK2FycmF5WzBdICkpCisjYXNoIyBlY2hvIDEgJGFycmF5CisjYXNoIyAoKCArKyBhcnJheVswXSApKQorI2FzaCMgZWNobyAyICRhcnJheQorCisjYXNoIyAoKCArK2EgKSkKKyNhc2gjIGVjaG8gMSAkYQorI2FzaCMgKCggKysgYSApKQorI2FzaCMgZWNobyAyICRhCisKKyNhc2gjICgoIC0tYSApKQorI2FzaCMgZWNobyAxICRhCisjYXNoIyAoKCAtLSBhICkpCisjYXNoIyBlY2hvIDAgJGEKKyAgICAgIGE9MAorCitlY2hvIDUgJCgoIDQgKyArK2EgKSkKK2VjaG8gMSAkYQorCisjIGFzaCBkb2Vzbid0IGhhbmRsZSBpdCByaWdodC4uLgorI2FzaCMgZWNobyA2ICQoKCA0KysrYSApKQorI2FzaCMgZWNobyAyICRhCisgICAgICBhPTIKKworIyBhc2ggZG9lc24ndCBoYW5kbGUgaXQgcmlnaHQuLi4KKyNhc2gjIGVjaG8gMyAkKCggNC0tLWEgKSkKKyNhc2gjIGVjaG8gMSAkYQorICAgICAgYT0xCisKK2VjaG8gNCAkKCggNCAtIC0tIGEgKSkKK2VjaG8gMCAkYQorCisjYXNoIyAoKCAtLSApKQorIyBiYXNoIDMuMiBhcHBhcmVudGx5IHRoaW5rcyB0aGF0IC0tLTcgaXMgLTcKKyNhc2gjIGVjaG8gJCgoIC0tLTcgKSkKKyggIGVjaG8gJCgoIC0tIC0gNyApKSAgKQorCisjYXNoIyAoKCArKyApKQorIyBiYXNoIDMuMjogNworI2FzaCMgZWNobyA3ICQoKCArKzcgKSkKKyggIGVjaG8gJCgoICsrICsgNyApKSAgKQorCisjIGJhc2ggMy4yOiAtNworI2FzaCMgZWNobyAtNyAkKCggKystNyApKQorIyBiYXNoIDMuMjogLTcKKyNhc2gjIGVjaG8gLTcgJCgoICsrIC0gNyApKQorCisjIGJhc2ggMy4yOiA3CisjYXNoIyBlY2hvIDcgJCgoICstLTcgKSkKKyMgYmFzaCAzLjI6IDcKKyNhc2gjIGVjaG8gNyAkKCggLS0gKyA3ICkpCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1idWdzL2FuZF9vcl9hbmRfYmFja2dyb3VuZGluZy5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWJ1Z3MvYW5kX29yX2FuZF9iYWNrZ3JvdW5kaW5nLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwY2U2M2UKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1idWdzL2FuZF9vcl9hbmRfYmFja2dyb3VuZGluZy5yaWdodApAQCAtMCwwICsxLDQgQEAKK0ZpcnN0CitTZWNvbmQKK1RoaXJkCitEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1idWdzL2FuZF9vcl9hbmRfYmFja2dyb3VuZGluZy50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWJ1Z3MvYW5kX29yX2FuZF9iYWNrZ3JvdW5kaW5nLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA1YWNmYjgKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1idWdzL2FuZF9vcl9hbmRfYmFja2dyb3VuZGluZy50ZXN0cwpAQCAtMCwwICsxLDMxIEBACisjIFVORklYRUQgQlVHOiBodXNoIHRoaW5rcyB0aGF0IDsgJiYgfHwgJiBoYXZlIHRoZSBzYW1lIHByZWNlZGVuY2UuCisjIEFjY29yZGluZyB0byB0aGlzIGRvYywgJiYgfHwgaGF2ZSBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuIDsgJi4KKyMgU2VlIGV4YW1wbGUgYmVsb3cuCisjIFByZWNlZGVuY2Ugb2YgOyBpcyBub3QgYSBwcm9ibGVtIGluIHByYWN0aWNlLiBQcmVjZWRlbmNlIG9mICYgaXMuCisjCisjaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDA5Njk1Mzk5L3V0aWxpdGllcy94Y3VfY2hhcDAyLmh0bWwKKyMKKyMyLjkuMyBMaXN0cworIworI0FuIEFORC1PUiBsaXN0IGlzIGEgc2VxdWVuY2Ugb2Ygb25lIG9yIG1vcmUgcGlwZWxpbmVzIHNlcGFyYXRlZCBieQorI3RoZSBvcGVyYXRvcnMgIiYmIiBhbmQgInx8IiAuCisjCisjQSBsaXN0IGlzIGEgc2VxdWVuY2Ugb2Ygb25lIG9yIG1vcmUgQU5ELU9SIGxpc3RzIHNlcGFyYXRlZCBieSB0aGUgb3BlcmF0b3JzCisjJzsnIGFuZCAnJicgYW5kIG9wdGlvbmFsbHkgdGVybWluYXRlZCBieSAnOycsICcmJywgb3IgPG5ld2xpbmU+LgorIworI1RoZSBvcGVyYXRvcnMgIiYmIiBhbmQgInx8IiBzaGFsbCBoYXZlIGVxdWFsIHByZWNlZGVuY2UgYW5kIHNoYWxsIGJlCisjZXZhbHVhdGVkIHdpdGggbGVmdCBhc3NvY2lhdGl2aXR5LiBGb3IgZXhhbXBsZSwgYm90aCBvZiB0aGUgZm9sbG93aW5nCisjY29tbWFuZHMgd3JpdGUgc29sZWx5IGJhciB0byBzdGFuZGFyZCBvdXRwdXQ6CisjCisjICAgIGZhbHNlICYmIGVjaG8gZm9vIHx8IGVjaG8gYmFyCisjICAgIHRydWUgfHwgZWNobyBmb28gJiYgZWNobyBiYXIKKyMKKyNBICc7JyBvciA8bmV3bGluZT4gdGVybWluYXRvciBzaGFsbCBjYXVzZSB0aGUgcHJlY2VkaW5nIEFORC1PUiBsaXN0CisjdG8gYmUgZXhlY3V0ZWQgc2VxdWVudGlhbGx5OyBhbiAnJicgc2hhbGwgY2F1c2UgYXN5bmNocm9ub3VzIGV4ZWN1dGlvbgorI29mIHRoZSBwcmVjZWRpbmcgQU5ELU9SIGxpc3QuCisKK2VjaG8gRmlyc3QgJiYgc2xlZXAgMC4yICYmIGVjaG8gVGhpcmQgJgorc2xlZXAgMC4xCitlY2hvIFNlY29uZAord2FpdAorZWNobyBEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1idWdzL2V4cG9ydF9leHAucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1idWdzL2V4cG9ydF9leHAucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdhMmU5MwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWJ1Z3MvZXhwb3J0X2V4cC5yaWdodApAQCAtMCwwICsxLDcgQEAKK2FhMCBiYjAKK2E9YWEwIGI9YmIwCithYTEgYmIxCithPWFhMSBiPWJiMQorenp6PXp6egoreno9KgorRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYnVncy9leHBvcnRfZXhwLnRlc3RzLmRpc2FibGVkIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYnVncy9leHBvcnRfZXhwLnRlc3RzLmRpc2FibGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MTNmZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1idWdzL2V4cG9ydF9leHAudGVzdHMuZGlzYWJsZWQKQEAgLTAsMCArMSwyMiBAQAorIyBUaGlzIHRlc3Qgc2hvd3MgYSB2ZXJ5IHNwZWNpYWwgaGFuZGxpbmcgb2YgZXhwb3J0IGFuZCBsb2NhbAorIyBidWlsdGlucyBieSBiYXNoLgorCit2PSJhPWFhMCBiPWJiMCIKKyMgb25seSAxc3QgYXJnIHNob3VsZCBiZSBleHBhbmRlZCBpbiBtdWx0aXBsZSB3b3JkcworZXhwb3J0ICR2IGM9JHYKK2VjaG8gJGEgJGIKK2VjaG8gJGMKKworIyBvbmx5IDFzdCBhcmcgc2hvdWxkIGJlIGV4cGFuZGVkIGluIG11bHRpcGxlIHdvcmRzCitleHBvcnQgYGVjaG8gYT1hYTEgYj1iYjFgIGM9YGVjaG8gYT1hYTEgYj1iYjFgCitlY2hvICRhICRiCitlY2hvICRjCisKKz56ej16egorPnp6ej16enoKKyMgb25seSAxc3QgYXJnIHNob3VsZCBiZSBnbG9iYmVkCitleHBvcnQgenp6KiB6ej0qCitlbnYgfCBncmVwIF56eiB8IHNvcnQKK3JtIC1yZiB6ej16eiB6eno9enp6CisKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYnVncy92YXIzLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYnVncy92YXIzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlYjBlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1idWdzL3ZhcjMucmlnaHQKQEAgLTAsMCArMSw1IEBACisxCisxCisKKworMApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYnVncy92YXIzLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtYnVncy92YXIzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk3YjEwMmMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1idWdzL3ZhcjMudGVzdHMKQEAgLTAsMCArMSBAQAoreD0wOyBmKCkgeyBsb2NhbCB4PTE7IGVjaG8gJHg7IGxvY2FsIHg7IGVjaG8gJHg7IHVuc2V0IHg7IGVjaG8gJHg7IGxvY2FsIHg7IGVjaG8gJHg7IH07IGY7IGVjaG8gJHgKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvYmFzaF9icmFjZTEucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2Jhc2hfYnJhY2UxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzMzY1YzkKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2Jhc2hfYnJhY2UxLnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorYmFzaF9icmFjZTEudGVzdHMKKyp7YixifXJhY2UxLnQqCitiYXNoX2JyYWNlMS50ZXN0cyBiYXNoX2JyYWNlMS50ZXN0cworRG9uZTogMApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9iYXNoX2JyYWNlMS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvYmFzaF9icmFjZTEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWIyZjBlOQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvYmFzaF9icmFjZTEudGVzdHMKQEAgLTAsMCArMSwxMCBAQAorIyB1bnF1b3RlZCAkdiBzaG91bGQgYmUgZ2xvYmJlZDoKK3Y9JypicmFjZTEudConOyBlY2hvICR2CisKKyMgLi4uYnV0IG5vdCBicmFjZSBleHBhbmRlZDoKK3Y9Jyp7YixifXJhY2UxLnQqJzsgZWNobyAkdgorCisjIHdoZXJlYXMgZGlyZWN0IGJyY2VzIGFyZSBleHBhbmRlZDoKK2VjaG8gKntiLGJ9cmFjZTEudCoKKworZWNobyBEb25lOiAkPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iMS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYjEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI5YWI0ZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYjEucmlnaHQKQEAgLTAsMCArMSwyIEBACitnbG9iMS50ZXN0cworZ2xvYjEudGVzdHMKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYjEudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2dsb2IxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY5ODBjZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2dsb2IxLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorZWNobyAqZ2xvYjE/dFtlXXN0cyoKK2VjaG8gImdsb2IxIj8ndCdbZV1zKgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iMi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYjIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E3MGMyMgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYjIucmlnaHQKQEAgLTAsMCArMSwxOCBAQAorRXhwZWN0ZWQgQWN0dWFsCitaXCogICAgOiBaXCoKK1oqICAgICA6IFoqCitaXGYgICAgOiBaXGYKK1pcKiAgICA6IFpcKgorCitaXHogICAgOiBaXHoKK1p6ICAgICA6IFp6CitaXHogICAgOiBaXHoKK1pceiAgICA6IFpcegorCitaXCAgICAgOiBaXAorWlwgICAgIDogWlwKKworWlxmIFpmIDogWlxmIFpmCitaXGYgWmYgOiBaXGYgWmYKKworRG9uZTogMApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iMi50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYjIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGRiYzkyNQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYjIudGVzdHMKQEAgLTAsMCArMSwyNyBAQAorIyBUaGlzIHRlc3QgZGVtb25zdHJhdGVzIHRoYXQgaW4gdW5xdW90ZWQgJHYsIGJhY2tzbGFzaGVzIGV4cGFuZCBieSB0aGlzIHJ1bGU6CisjIFx6IC0+IFxcXHo7IFw8ZW9sPiAtPiBcXDxlb2w+IChmb3IgYW55IHosIHNwZWNpYWwgb3Igbm90KSwKKyMgYW5kIHN1YnNlcXVlbnRseSBnbG9iYmluZyBjb252ZXJ0cyBcXCB0byBcIGFuZCB0cmVhdHMgXHogYXMgbGl0ZXJhbCB6CisjIGV2ZW4gaWYgaXQgaXMgYSBzcGVjaWFsIGNoYXIuCisKKz4nWmYnCis+J1pcZicKKwllY2hvICdFeHBlY3RlZCcgJ0FjdHVhbCcKK3Y9J1wqJzsgZWNobyAnWlwqICAgIDonIFokdgorICAgICAgICBlY2hvICdaKiAgICAgOicgWlwqCisgICAgICAgIGVjaG8gJ1pcZiAgICA6JyBaXFwqCisgICAgICAgIGVjaG8gJ1pcKiAgICA6JyBaXFxcKiAgIyBOQiEgb25seSB0aGlzIG1hdGNoZXMgWiR2IG91dHB1dAorZWNobwordj0nXHonOyBlY2hvICdaXHogICAgOicgWiR2CisgICAgICAgIGVjaG8gJ1p6ICAgICA6JyBaXHoKKyAgICAgICAgZWNobyAnWlx6ICAgIDonIFpcXHoKKyAgICAgICAgZWNobyAnWlx6ICAgIDonIFpcXFx6CitlY2hvCit2PSdcJzsgIGVjaG8gJ1pcICAgICA6JyBaJHYKKyAgICAgICAgZWNobyAnWlwgICAgIDonIFpcXAorZWNobwordj0nKic7ICBlY2hvICdaXGYgWmYgOicgWiR2CisgICAgICAgIGVjaG8gJ1pcZiBaZiA6JyBaKgorZWNobworCitybSAnWlxmJyAnWmYnCitlY2hvIERvbmU6ICQ/CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2dsb2IzLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iMy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjFiNTg5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iMy5yaWdodApAQCAtMCwwICsxLDIgQEAKK2dsb2IzLnRlc3RzCisuL2dsb2IzLnRlc3RzCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1nbG9iL2dsb2IzLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iMy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZGY1NDAwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iMy50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK2VjaG8gImdsb2IzLnRlc3QiKgorZWNobyAiLi9nbG9iMy50ZXN0IioKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYl9hbmRfYXNzaWduLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iX2FuZF9hc3NpZ24ucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ2ZTQ0MwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYl9hbmRfYXNzaWduLnJpZ2h0CkBAIC0wLDAgKzEsNiBAQAorWlZBUj16LnRtcCBaVkFSPSoudG1wIFpWQVI9W3pdLnRtcAorWlZBUj16LnRtcCBaVkFSPSoudG1wIFpWQVI9W3pdLnRtcAorKi50bXAKK1pWQVI9ei50bXAgei50bXAKK1pWQVI9ei50bXAgWlZBUj0qLnRtcCBaVkFSPVt6XS50bXAKK1pWQVI9ei50bXAgWlZBUj0qLnRtcCBaVkFSPVt6XS50bXAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYl9hbmRfYXNzaWduLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtZ2xvYi9nbG9iX2FuZF9hc3NpZ24udGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGIxNThmMgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLWdsb2IvZ2xvYl9hbmRfYXNzaWduLnRlc3RzCkBAIC0wLDAgKzEsMTAgQEAKKz5aVkFSPXoudG1wCis+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+IiQwLnRtcCIKKworeWVzICIxMjM0NTY3ODkgMTIzNDU2Nzg5IDEyMzQ1Njc4OSAxMjM0NTY3ODkiIHwgaGVhZCAtMzAwMCB8IG1kNXN1bQorLiAiJDAudG1wIgorcm0gIiQwLnRtcCIKK2VjaG8gRW5kCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2lmX2ZhbHNlX2V4aXRjb2RlLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9pZl9mYWxzZV9leGl0Y29kZS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjI0YTM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9pZl9mYWxzZV9leGl0Y29kZS5yaWdodApAQCAtMCwwICsxIEBACitPazowCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL2lmX2ZhbHNlX2V4aXRjb2RlLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9pZl9mYWxzZV9leGl0Y29kZS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMWIzNmIxCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9pZl9mYWxzZV9leGl0Y29kZS50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK2lmIGZhbHNlOyB0aGVuIGVjaG8gQmFkOyBmaQorZWNobyBPazokPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9ub21tdTEucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL25vbW11MS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjA2YTg1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9ub21tdTEucmlnaHQKQEAgLTAsMCArMSw3IEBACitPaworT2sKK09rCitPaworT2sKK09rCitEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL25vbW11MS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvbm9tbXUxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmUxNGFkYTUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL25vbW11MS50ZXN0cwpAQCAtMCwwICsxLDEyIEBACisoZWNobyBcCitPaykKKyggKGVjaG8gXAorT2spICkKKyggKCAoZWNobyBcCitPaykgKSApCisKKyhlY2hvIFxPaykKKyggKGVjaG8gXE9rKSApCisoICggKGVjaG8gXE9rKSApICkKKworZWNobyBEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL25vbW11Mi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvbm9tbXUyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiOGJhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL25vbW11Mi5yaWdodApAQCAtMCwwICsxLDUgQEAKK09rCitPaworT2sKK09rCitEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL25vbW11Mi50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvbm9tbXUyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYxZWQ1Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL25vbW11Mi50ZXN0cwpAQCAtMCwwICsxLDUgQEAKK2VjaG8gTm90IHNob3duIHwgaWYgdHJ1ZTsgdGhlbiBlY2hvICQoZWNobyBPayk7IGZpCitlY2hvIE5vdCBzaG93biB8IGlmIHRydWU7IHRoZW4gZWNobyBgZWNobyBPa2A7IGZpCitlY2hvIE5vdCBzaG93biB8ICggaWYgdHJ1ZTsgdGhlbiBlY2hvICQoZWNobyBPayk7IGZpICkKK2VjaG8gTm90IHNob3duIHwgKCBpZiB0cnVlOyB0aGVuIGVjaG8gYGVjaG8gT2tgOyBmaSApCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvbm9tbXUzLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9ub21tdTMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExNTM0YgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvbm9tbXUzLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorT2sKKzAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvbm9tbXUzLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9ub21tdTMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGFjYTY3YQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvbm9tbXUzLnRlc3RzCkBAIC0wLDAgKzEsMTUgQEAKKyMhL2Jpbi9zaAorCitmdW5jKCkKK3sKKwl3aGlsZSByZWFkIHA7IGRvIGVjaG8gIiRwIjsgZG9uZQorfQorCitwaXBlX3RvX2Z1bmMoKQoreworCSMgV2UgaGFkIGEgTk9NTVUgYnVnIHdoaWNoIGNhdXNlZCAiZWNobyBPayB8IiBwYXJ0IG90IGJlIGxvc3QKKwllY2hvIE9rIHwgZnVuYworfQorCitwaXBlX3RvX2Z1bmMgfCBjYXQKK2VjaG8gJD8KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvb3B0czEucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL29wdHMxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYTc1NzMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL29wdHMxLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorUGFyYW0xOiA+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+c291cmNlZDEKKy4gLi9zb3VyY2VkMQorZWNobyBPazI6JD8KKworcm0gc291cmNlZDEKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc291cmNlMi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc291cmNlMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTg3YmFkCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zb3VyY2UyLnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorMDphcmcwIDE6YXJnMSAyOmFyZzIKK09rMTowCiswOmFyZzAgMTpxIDI6dworT2syOjAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc291cmNlMi50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc291cmNlMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MGI2YjgzCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zb3VyY2UyLnRlc3RzCkBAIC0wLDAgKzEsOCBAQAorZWNobyAnZWNobyAiMDokMCAxOiQxIDI6JDIiJyA+c291cmNlZDEKK3NldCAtLSAxIDIgMworIiRUSElTX1NIIiAtYyAnLiAuL3NvdXJjZWQxJyBhcmcwIGFyZzEgYXJnMgorZWNobyBPazE6JD8KKyIkVEhJU19TSCIgLWMgJy4gLi9zb3VyY2VkMSBxIHcgZScgYXJnMCBhcmcxIGFyZzIKK2VjaG8gT2syOiQ/CisKK3JtIHNvdXJjZWQxCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3N5bnRheF9lcnIucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3N5bnRheF9lcnIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgwZTc5NgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc3ludGF4X2Vyci5yaWdodApAQCAtMCwwICsxLDQgQEAKK3Nob3duCitodXNoOiBzeW50YXggZXJyb3I6IHVudGVybWluYXRlZCAnCit0ZXN0Citub3Qgc2hvd24KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc3ludGF4X2Vyci50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc3ludGF4X2Vyci50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMTBlZDQyCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zeW50YXhfZXJyLnRlc3RzCkBAIC0wLDAgKzEsMyBAQAorZWNobyBzaG93bgorZWNobyB0ZXN0IGBlY2hvICdhYWAKK2VjaG8gbm90IHNob3duCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3N5bnRheF9lcnJfbmVnYXRlLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zeW50YXhfZXJyX25lZ2F0ZS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzcwMTA2Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy9zeW50YXhfZXJyX25lZ2F0ZS5yaWdodApAQCAtMCwwICsxLDIgQEAKK2Jhc2ggMy4yIGZhaWxzIHRoaXMKK2h1c2g6IHN5bnRheCBlcnJvcjogISAhIGNvbW1hbmQKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvc3ludGF4X2Vycl9uZWdhdGUudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3N5bnRheF9lcnJfbmVnYXRlLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ2MWIxYjAKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3N5bnRheF9lcnJfbmVnYXRlLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorZWNobyBiYXNoIDMuMiBmYWlscyB0aGlzCishICEgdHJ1ZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy91bmljb2RlMS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvdW5pY29kZTEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNiYmJmNgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvdW5pY29kZTEucmlnaHQKQEAgLTAsMCArMSwzIEBACisxCisxCitPawpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy91bmljb2RlMS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvdW5pY29kZTEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uODc4OGJhOQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvdW5pY29kZTEudGVzdHMKQEAgLTAsMCArMSwxMyBAQAorTEFORz1lbl9VUy5VVEYtOAorCisjIEEgY29tYmluaW5nIGNoYXJhY3RlciBVKzMwMAorYT1gcHJpbnRmICJceGNjXHg4MCJgCisjIFNob3VsZCBwcmludCAxCitlY2hvICR7I2F9CisKKyMgQSBKYXBhbmVzZSBrYXRha2FuYSBjaGFyYWNodGVyIFUrMzBhMworYT1gcHJpbnRmICJceGUzXHg4Mlx4YTMiYAorIyBTaG91bGQgcHJpbnQgMQorZWNobyAkeyNhfQorCitlY2hvIE9rCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3VudGlsMS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvdW50aWwxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMmRhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3VudGlsMS5yaWdodApAQCAtMCwwICsxLDMgQEAKKzEKKzEKK09rOjAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvdW50aWwxLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy91bnRpbDEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTBhYjI4MwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2MvdW50aWwxLnRlc3RzCkBAIC0wLDAgKzEsMTEgQEAKK3g9MQordW50aWwgdGVzdCAiJHgiID0gNDsgZG8gZWNobyAkeDsgeD00OyBkb25lCisKKyMgV2UgaGFkIGEgYnVnIGluIG11bHRpLWxpbmUgZm9ybQoreD0xCit1bnRpbCB0ZXN0ICIkeCIgPSA0OyBkbworICAgICAgICBlY2hvICR4CisgICAgICAgIHg9NAorZG9uZQorCitlY2hvIE9rOiQ/CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlMS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGUxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNGQ3YmUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlMS5yaWdodApAQCAtMCwwICsxIEBACitPSzowCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlMS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGUxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjExZTIwMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlMS50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK3doaWxlIGZhbHNlOyBkbyBlY2hvIE5PVCBTSE9XTjsgZG9uZQorZWNobyBPSzokPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTIucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzIwN2NjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTIucmlnaHQKQEAgLTAsMCArMSwyIEBACitIZWxsbworT0s6MApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTIudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMjQ3YWRjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTIudGVzdHMKQEAgLTAsMCArMSwyIEBACit3aGlsZSBlY2hvIEhlbGxvOyBmYWxzZTsgZG8gZWNobyBOT1QgU0hPV047IGRvbmUKK2VjaG8gT0s6JD8KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGUzLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M0ZDdiZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGUzLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK09LOjAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGUzLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOTEzMmI1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGUzLnRlc3RzCkBAIC0wLDAgKzEsNCBAQAord2hpbGUgZmFsc2U7IGRvCisgICAgIyBiYXNoIHdpbGwgcmVxdWlyZSBhdCBsZWFzdCAiOiIgaGVyZS4uLgorZG9uZQorZWNobyBPSzokPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTQucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlNC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjI0YTM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTQucmlnaHQKQEAgLTAsMCArMSBAQAorT2s6MApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTQudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlNC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iYTgwZTYwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZTQudGVzdHMKQEAgLTAsMCArMSw2IEBACitmYWxzZQord2hpbGUgZmFsc2UgJiYgZWNobyBOb3QgcmVhY2hlZDsgZG8KKyAgICBlY2hvIEJVRworICAgIGJyZWFrCitkb25lCitlY2hvIE9rOiQ/CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1taXNjL3doaWxlX2luX3N1YnNoZWxsLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZV9pbl9zdWJzaGVsbC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTBkMzliCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZV9pbl9zdWJzaGVsbC5yaWdodApAQCAtMCwwICsxIEBACitPSzogMApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtbWlzYy93aGlsZV9pbl9zdWJzaGVsbC50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGVfaW5fc3Vic2hlbGwudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZGVmOGUwOQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLW1pc2Mvd2hpbGVfaW5fc3Vic2hlbGwudGVzdHMKQEAgLTAsMCArMSwyIEBACisod2hpbGUgdHJ1ZTsgZG8gZXhpdDsgZG9uZSkKK2VjaG8gT0s6ICQ/CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2FyZ3YwLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9hcmd2MC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODZiYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9hcmd2MC5yaWdodApAQCAtMCwwICsxIEBACitPSwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9hcmd2MC50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvYXJndjAudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjVjNDBmNgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvYXJndjAudGVzdHMKQEAgLTAsMCArMSw0IEBACitpZiB0ZXN0ICQjID0gMDsgdGhlbgorICAgIGV4ZWMgIiRUSElTX1NIIiAiJDAiIGFyZworZmkKK2VjaG8gT0sKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvYnJhY2UxLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9icmFjZTEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYxOWY0NQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvYnJhY2UxLnJpZ2h0CkBAIC0wLDAgKzEsNyBAQAore2FiY30KK3sKK30KK2h1c2g6IGNhbid0IGV4ZWN1dGUgJ3tjbWQnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CitodXNoOiBjYW4ndCBleGVjdXRlICd7JzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQoraHVzaDogY2FuJ3QgZXhlY3V0ZSAneyc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKK0RvbmU6IDEyNwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9icmFjZTEudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2JyYWNlMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYjQ1OTI3Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9icmFjZTEudGVzdHMKQEAgLTAsMCArMSw3IEBACitlY2hvIHthYmN9CitlY2hvIHsKK2VjaG8gfQore2NtZAorIiJ7Cit7IiIKK2VjaG8gRG9uZTogJD8KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvYnJhY2UyLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9icmFjZTIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdhOTY2NgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvYnJhY2UyLnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAore3Esd30KK3txLHd9CitEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2JyYWNlMi50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvYnJhY2UyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmVmNzVmMGIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2JyYWNlMi50ZXN0cwpAQCAtMCwwICsxLDUgQEAKK3Y9J3txLHd9JworIyBTaG91bGQgbm90IGJyYWNlLWV4cGFuZCB2IHZhbHVlCitlY2hvICR2CitlY2hvICIkdiIKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9jb21tZW50MS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvY29tbWVudDEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwMmIxZAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvY29tbWVudDEucmlnaHQKQEAgLTAsMCArMSwyIEBACitOb3RoaW5nOgorU3RyaW5nOiAjc2hvdWxkLWJlLWVjaG9lZApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9jb21tZW50MS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvY29tbWVudDEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDI2ODg2MAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvY29tbWVudDEudGVzdHMKQEAgLTAsMCArMSwyIEBACitlY2hvIE5vdGhpbmc6ICNzaG91bGQtbm90LWJlLWVjaG9lZAorZWNobyBTdHJpbmc6ICIiI3Nob3VsZC1iZS1lY2hvZWQKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZW9sMS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZW9sMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWM4OTZmCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lb2wxLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK0RvbmU6MApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lb2wxLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lb2wxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYxYjU1ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VvbDEudGVzdHMKQEAgLTAsMCArMSwxOCBAQAorIyBidWcgd2FzIHRoYXQgd2UgdHJlYXRlZCA8bmV3bGluZT4gYXMgJzsnIGluIHRoaXMgbGluZToKK3RydWUgfHwgZWNobyBmb28gfAorZWNobyBCQUQxIHwgY2F0CisKKyMgdmFyaWF0aW9uIG9uIHRoZSBzYW1lIHRoZW1lCit0cnVlIHx8IGVjaG8gZm9vIHwKKyMgY29tbWVudAorZWNobyBCQUQyIHwgY2F0CisKKyMgdmFyaWF0aW9uIG9uIHRoZSBzYW1lIHRoZW1lCit0cnVlIHx8IGVjaG8gZm9vIHwKKworZWNobyBCQUQzIHwgY2F0CisKKyMgdGhpcyBzaG91bGQgZXJyb3Igb3V0LCBidXQgY3VycmVudGx5IHdvcmtzIGluIGh1c2g6CisjdHJ1ZSB8fCBlY2hvIGZvbyB8OworCitlY2hvIERvbmU6JD8KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlMS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODk5Yjg3Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGUxLnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorXAorYVxiCitcXAorY1xcZApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGUxLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGUxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI1YWM5NmIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTEudGVzdHMKQEAgLTAsMCArMSw2IEBACit0ZXN0ICIkQ09ORklHX0ZFQVRVUkVfRkFOQ1lfRUNITyIgPSAieSIgfHwgZXhpdCA3NworCitlY2hvICJcXCIKK2VjaG8gYSJcXCJiCitlY2hvICdcXCcKK2VjaG8gYydcXCdkCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTIucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1ZmQ0YQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlMi5yaWdodApAQCAtMCwwICsxLDQgQEAKKyo/W2FdKgorYSo/W2FdKmIKKyo/W2FdKgorYyo/W2FdKmQKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlMi50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lZTcxODAxCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGUyLnRlc3RzCkBAIC0wLDAgKzEsNCBAQAorZWNobyAiKj9bYV0qIgorZWNobyBhIio/W2FdKiJiCitlY2hvICcqP1thXSonCitlY2hvIGMnKj9bYV0qJ2QKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlMy5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlMy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTAyYTk3Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGUzLnJpZ2h0CkBAIC0wLDAgKzEsMjMgQEAKK3Y6IGEgXCBiIFxcIGMgXFxcIGQgXFxcXCBlCit2OiBhIFwgYiBcXCBjIFxcXCBkIFxcXFwgZQorVW5xdW90ZWQ6CisuYS4KKy5cLgorLmIuCisuXFwuCisuYy4KKy5cXFwuCisuZC4KKy5cXFxcLgorLmUuCitRdW90ZWQ6CisuYS4KKy5cLgorLmIuCisuXFwuCisuYy4KKy5cXFwuCisuZC4KKy5cXFxcLgorLmUuCitkb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTMudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTg3MDViZAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlMy50ZXN0cwpAQCAtMCwwICsxLDEwIEBACit0ZXN0ICIkQ09ORklHX0ZFQVRVUkVfRkFOQ1lfRUNITyIgPSAieSIgfHwgZXhpdCA3NworCit2PSdhIFwgYiBcXCBjIFxcXCBkIFxcXFwgZScKK2VjaG8gdjogJHYKK2VjaG8gdjogIiR2IgorZWNobyBVbnF1b3RlZDoKK2ZvciBhIGluICR2OyBkbyBlY2hvIC4kYS47IGRvbmUKK2VjaG8gUXVvdGVkOgorZm9yIGEgaW4gJHY7IGRvIGVjaG8gIi4kYS4iOyBkb25lCitlY2hvIGRvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlNC5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlNC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGUzZTBjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGU0LnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorT2sKK0VuZApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGU0LnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9lc2NhcGU0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmRmOGJmMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTQudGVzdHMKQEAgLTAsMCArMSw2IEBACitpXAorZiB0clwKK3VlOyB0aFwKK2VuIGVjaG8gIk9cCitrIjsgZmk7IGVjaG8gIlwKK0VuZCIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTUucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTUucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NkZDM5MwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlNS5yaWdodApAQCAtMCwwICsxLDkgQEAKK2FcbmJcbmNcbgorYQorYgorYworYVxuYlxuY1xuCithCitiCitjCitEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTUudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2VzY2FwZTUudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzM3YTk4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZXNjYXBlNS50ZXN0cwpAQCAtMCwwICsxLDcgQEAKK3Y9ImFcbmJcbmNcbiIKK2VjaG8gIiR2IgorcHJpbnRmICIkdiIKK3Y9J2FcbmJcbmNcbicKK2VjaG8gIiR2IgorcHJpbnRmICIkdiIKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ncm91cDEucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2dyb3VwMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTdjNGJlCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ncm91cDEucmlnaHQKQEAgLTAsMCArMSBAQAord29yZH0gfQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ncm91cDEudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2dyb3VwMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMDYzZmJjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ncm91cDEudGVzdHMKQEAgLTAsMCArMSBAQAoreyBlY2hvIHdvcmR9IH07IH0KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZ3JvdXAyLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ncm91cDIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0ZDkzMAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZ3JvdXAyLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorZ290IFRFUk0KK0RvbmU6IDAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZ3JvdXAyLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ncm91cDIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDk5MTc4NQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvZ3JvdXAyLnRlc3RzCkBAIC0wLDAgKzEsMyBAQAorIyBCdWcgd2FzIGluIGhhbmRsaW5nIG9mICJ9JiIgd2l0aG91dCBzcGFjZQoreyB0cmFwICJlY2hvIGdvdCBURVJNIiBURVJNOyBzbGVlcCAyOyB9JiBzbGVlcCAxOyBraWxsICQhOyB3YWl0CitlY2hvIERvbmU6ICQ/CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2dyb3Vwc19hbmRfa2V5d29yZHMxLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ncm91cHNfYW5kX2tleXdvcmRzMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzQ2NjUwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ncm91cHNfYW5kX2tleXdvcmRzMS5yaWdodApAQCAtMCwwICsxLDExIEBACitTZW1pY29sb25zIGFmdGVyIH0gY2FuIGJlIG9taXR0ZWQgMToKK2ZvbworYmFyCitTZW1pY29sb25zIGFmdGVyIH0gY2FuIGJlIG9taXR0ZWQgMjoKK2ZvbworYmFyCitTZW1pY29sb25zIGFmdGVyIGZpIGNhbiBiZSBvbWl0dGVkOgorZm9vCitiYXIKK2JhegorRG9uZTowCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL2dyb3Vwc19hbmRfa2V5d29yZHMxLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ncm91cHNfYW5kX2tleXdvcmRzMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wMTk0NGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ncm91cHNfYW5kX2tleXdvcmRzMS50ZXN0cwpAQCAtMCwwICsxLDEwIEBACitlY2hvICJTZW1pY29sb25zIGFmdGVyIH0gY2FuIGJlIG9taXR0ZWQgMToiCitpZiB7IGVjaG8gZm9vOyB9IHRoZW4geyBlY2hvIGJhcjsgfSBmaQorCitlY2hvICJTZW1pY29sb25zIGFmdGVyIH0gY2FuIGJlIG9taXR0ZWQgMjoiCit3aGlsZSB7IGVjaG8gZm9vOyB9IGRvIHsgZWNobyBiYXI7IGJyZWFrOyB9IGRvbmUKKworZWNobyAiU2VtaWNvbG9ucyBhZnRlciBmaSBjYW4gYmUgb21pdHRlZDoiCit3aGlsZSBpZiBlY2hvIGZvbzsgdGhlbiBlY2hvIGJhcjsgZmkgZG8gZWNobyBiYXo7IGJyZWFrOyBkb25lCisKK2VjaG8gRG9uZTokPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9uZWdhdGUucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25lZ2F0ZS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWQyZWNkCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9uZWdhdGUucmlnaHQKQEAgLTAsMCArMSwzNiBAQAorISBwcmludGluZyAhCiswCisxCisxCiswCiswCiswCishCithCitiCitjCishIDEKK2EgMQorYiAxCitjIDEKKyEgMQorYSAxCitiIDEKK2MgMQorMAorMAorMAorMAorMQorMQorMQorMQorMAorMAorMAorMAorMQorMQorMQorMQorRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9uZWdhdGUudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25lZ2F0ZS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MTE1MWNiCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9uZWdhdGUudGVzdHMKQEAgLTAsMCArMSwxOSBAQAorZWNobyAhIHByaW50aW5nICEKKyEgZmFsc2UKK2VjaG8gJD8KKyEgdHJ1ZQorZWNobyAkPworaWYgISBmYWxzZTsgdGhlbiBmYWxzZTsgZWNobyAkPzsgZmkKK2VjaG8gJD8KK2lmICEgZmFsc2U7IHRoZW4gISBmYWxzZTsgZWNobyAkPzsgZmkKK2VjaG8gJD8KK1BSSU5URj1gd2hpY2ggcHJpbnRmYAorZm9yIGEgaW4gISBhIGIgYzsgZG8gZWNobyAkYTsgZG9uZQorZm9yIGEgaW4gISBhIGIgYzsgZG8gISBwcmludGYgIiRhICI7IGVjaG8gJD87IGRvbmUKK3Rlc3QgeCIkUFJJTlRGIiA9IHgiIiAmJiBleGl0IDEKK2ZvciBhIGluICEgYSBiIGM7IGRvICEgIiRQUklOVEYiICIkYSAiOyBlY2hvICQ/OyBkb25lCitmb3IgYSBpbiAhIGEgYiBjOyBkbyAhIHByaW50ZiAiJGEgIiB8IGZhbHNlOyBlY2hvICQ/OyBkb25lCitmb3IgYSBpbiAhIGEgYiBjOyBkbyAhIHByaW50ZiAiJGEgIiB8IHRydWU7IGVjaG8gJD87IGRvbmUKK2ZvciBhIGluICEgYSBiIGM7IGRvICEgeyBwcmludGYgIiRhICIgfCBmYWxzZTsgfTsgZWNobyAkPzsgZG9uZQorZm9yIGEgaW4gISBhIGIgYzsgZG8gISB7IHByaW50ZiAiJGEgIiB8IHRydWU7IH07IGVjaG8gJD87IGRvbmUKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ub2VvbC5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbm9lb2wucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQyNzk4NAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbm9lb2wucmlnaHQKQEAgLTAsMCArMSBAQAorSEVMTE8KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbm9lb2wudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25vZW9sLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE5MzExM2EKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25vZW9sLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorIyBuZXh0IGxpbmUgaGFzIG5vIEVPTCEKK2VjaG8gSEVMTE8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25vZW9sMi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbm9lb2wyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMDQ5MWYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25vZW9sMi5yaWdodApAQCAtMCwwICsxIEBACisxCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25vZW9sMi50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvbm9lb2wyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEyMjBmMDUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25vZW9sMi50ZXN0cwpAQCAtMCwwICsxLDcgQEAKKyMgbGFzdCBsaW5lIGhhcyBubyBFT0whCitpZiB0cnVlCit0aGVuCisgIGVjaG8gMQorZWxzZQorICBlY2hvIDIKK2ZpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ub2VvbDMucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25vZW9sMy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmY4NTE1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ub2VvbDMucmlnaHQKQEAgLTAsMCArMSBAQAoraHVzaDogc3ludGF4IGVycm9yOiB1bnRlcm1pbmF0ZWQgIgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ub2VvbDMudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL25vZW9sMy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYzk1OGVkCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9ub2VvbDMudGVzdHMKQEAgLTAsMCArMSwyIEBACisjIGxhc3QgbGluZSBoYXMgbm8gRU9MIQorZWNobyAidW50ZXJtaW5hdGVkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9wcm9jZXNzX3N1YnN0LnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9wcm9jZXNzX3N1YnN0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5N2JjODAKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3Byb2Nlc3Nfc3Vic3QucmlnaHQKQEAgLTAsMCArMSwzIEBACitURVNUenpCRVNUCitURVNUJChlY2hvIHp6KUJFU1QKK1RFU1QnQkVTVApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9wcm9jZXNzX3N1YnN0LnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9wcm9jZXNzX3N1YnN0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjIxOTk2YmMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3Byb2Nlc3Nfc3Vic3QudGVzdHMKQEAgLTAsMCArMSwzIEBACitlY2hvICJURVNUYGVjaG8geno7ZWNobztlY2hvYEJFU1QiCitlY2hvICJURVNUYGVjaG8gJyQoZWNobyB6eiknYEJFU1QiCitlY2hvICJURVNUYGVjaG8gIiciYEJFU1QiCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlMS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGUxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMzgyMDUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlMS5yaWdodApAQCAtMCwwICsxIEBACisnMScKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGUxLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjU1ODk1NAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGUxLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorYT0xCitlY2hvICInJGEnIgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTIucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmM5ZWRjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTIucmlnaHQKQEAgLTAsMCArMSBAQAorPjEKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGUyLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmQ5NjZmMwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGUyLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorYT0xCitlY2hvICI+JGEiCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlMy5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGUzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiZTQ2ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlMy5yaWdodApAQCAtMCwwICsxLDEyIEBACitUZXN0aW5nOiBpbiAiIgorLi4KK1Rlc3Rpbmc6IGluICcnCisuLgorVGVzdGluZzogaW4gJGVtcHR5CitUZXN0aW5nOiBpbiAkZW1wdHkiIgorLi4KK1Rlc3Rpbmc6IGluICRlbXB0eScnCisuLgorVGVzdGluZzogaW4gIiRlbXB0eSIKKy4uCitGaW5pc2hlZApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTMudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlMy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iNWZkNTk3Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTMudGVzdHMKQEAgLTAsMCArMSwyMSBAQAorZW1wdHk9JycKKworZWNobyAnVGVzdGluZzogaW4gIiInCitmb3IgYSBpbiAiIjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gJyInJyIKK2ZvciBhIGluICcnOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiAkZW1wdHknCitmb3IgYSBpbiAkZW1wdHk7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluICRlbXB0eSIiJworZm9yIGEgaW4gJGVtcHR5IiI7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluICRlbXB0eSciJyciCitmb3IgYSBpbiAkZW1wdHknJzsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gIiRlbXB0eSInCitmb3IgYSBpbiAiJGVtcHR5IjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyBGaW5pc2hlZApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTQucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlNC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjkwMWVhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9xdW90ZTQucmlnaHQKQEAgLTAsMCArMSBAQAorYSBiCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlNC50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcXVvdGU0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYxZGFiZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3F1b3RlNC50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK2FfYj0nYSBiJworZWNobyAiJGFfYiIKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvcmVkaXJfc3BhY2UucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3JlZGlyX3NwYWNlLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NDI5NTIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3JlZGlyX3NwYWNlLnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorejEudG1wOiAxCit6Mi50bXA6IDEKKyJ6MS50bXAgejIudG1wIjogVEVTVCAwCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3JlZGlyX3NwYWNlLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9yZWRpcl9zcGFjZS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jMGI1NDMwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9yZWRpcl9zcGFjZS50ZXN0cwpAQCAtMCwwICsxLDYgQEAKK3Y9J3oxLnRtcCB6Mi50bXAnCitlY2hvIFRFU1QgPiR2CitlY2hvICd6MS50bXA6JyBgY2F0ICd6MS50bXAnIDI+L2Rldi9udWxsOyBlY2hvICQ/YAorZWNobyAnejIudG1wOicgYGNhdCAnejIudG1wJyAyPi9kZXYvbnVsbDsgZWNobyAkP2AKK2VjaG8gJyJ6MS50bXAgejIudG1wIjonIGBjYXQgJ3oxLnRtcCB6Mi50bXAnIDI+L2Rldi9udWxsOyBlY2hvICQ/YAorcm0geioudG1wCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3N0YXJxdW90ZWQucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3N0YXJxdW90ZWQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU2MzIzZgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvc3RhcnF1b3RlZC5yaWdodApAQCAtMCwwICsxLDggQEAKKy4xIGFiYyBkIGUgZi4KKy4xLgorLmFiYy4KKy5kIGUgZi4KKy4tMSBhYmMgZCBlIGYtLgorLi0xLgorLmFiYy4KKy5kIGUgZi0uCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3N0YXJxdW90ZWQudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3N0YXJxdW90ZWQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmZlNDliMQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvc3RhcnF1b3RlZC50ZXN0cwpAQCAtMCwwICsxLDggQEAKK2lmIHRlc3QgJCMgPSAwOyB0aGVuCisgICAgZXhlYyAiJFRISVNfU0giICIkMCIgMSBhYmMgJ2QgZSBmJworZmkKKworZm9yIGEgaW4gIiQqIjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKK2ZvciBhIGluICIkQCI7IGRvIGVjaG8gIi4kYS4iOyBkb25lCitmb3IgYSBpbiAiLSQqLSI7IGRvIGVjaG8gIi4kYS4iOyBkb25lCitmb3IgYSBpbiAiLSRALSI7IGRvIGVjaG8gIi4kYS4iOyBkb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wYXJzaW5nL3N0YXJxdW90ZWQyLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9zdGFycXVvdGVkMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmZmNDA4Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9zdGFycXVvdGVkMi5yaWdodApAQCAtMCwwICsxLDggQEAKK1Nob3VsZCBiZSBwcmludGVkCitXb3VsZCBub3QgYmUgcHJpbnRlZCBieSBiYXNoCitXb3VsZCBub3QgYmUgcHJpbnRlZCBieSBiYXNoCitXb3VsZCBub3QgYmUgcHJpbnRlZCBieSBiYXNoCitTaG91bGQgYmUgcHJpbnRlZAorRW1wdHk6CitFbXB0eToKK0VtcHR5OgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcGFyc2luZy9zdGFycXVvdGVkMi50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvc3RhcnF1b3RlZDIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2M1ZmY0NQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBhcnNpbmcvc3RhcnF1b3RlZDIudGVzdHMKQEAgLTAsMCArMSwxOSBAQAoraWYgdGVzdCAkIyAhPSAwOyB0aGVuCisgICAgZXhlYyAiJFRISVNfU0giICIkMCIKK2ZpCisKKyMgTm8gcGFyYW1zIQorZm9yIGEgaW4gIiQqIjsgZG8gZWNobyBTaG91bGQgYmUgcHJpbnRlZDsgZG9uZQorZm9yIGEgaW4gIiRAIjsgZG8gZWNobyBTaG91bGQgbm90IGJlIHByaW50ZWQ7IGRvbmUKKyMgWWVzLCBiZWxpZXZlIGl0IG9yIG5vdCwgYmFzaCBpcyBtZXNtZXJpemVkIGJ5ICIkQCIgYW5kIHN0b3BzCisjIHRyZWF0aW5nICIiIGFzICJ0aGlzIHdvcmQgY2Fubm90IGJlIGV4cGFuZGVkIHRvIG5vdGhpbmcsCisjIGJ1dCBtdXN0IGJlIGF0IGxlYXN0IG51bGwgc3RyaW5nIi4gTm93IGl0IGNhbiBiZSBleHBhbmRlZCB0byBub3RoaW5nLgorZm9yIGEgaW4gIiRAIiIiOyBkbyBlY2hvIFdvdWxkIG5vdCBiZSBwcmludGVkIGJ5IGJhc2g7IGRvbmUKK2ZvciBhIGluICIiIiRAIjsgZG8gZWNobyBXb3VsZCBub3QgYmUgcHJpbnRlZCBieSBiYXNoOyBkb25lCitmb3IgYSBpbiAiIiIkQCInJyIkQCInJzsgZG8gZWNobyBXb3VsZCBub3QgYmUgcHJpbnRlZCBieSBiYXNoOyBkb25lCitmb3IgYSBpbiAiIjsgZG8gZWNobyBTaG91bGQgYmUgcHJpbnRlZDsgZG9uZQorCisjIEJ1ZyAyMDc6ICIkQCIgZXhwYW5kcyB0byBub3RoaW5nLCBhbmQgd2UgZXJyb25lb3VzbHkgZ2xvYiAiJXNcbiIgdHdpY2U6CitwcmludGYgJ0VtcHR5OiVzXG4nICIkQCIKK3ByaW50ZiAiRW1wdHk6JXNcbiIgIiRAIgorcHJpbnRmICJFbXB0eTolc1xcbiIgIiRAIgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L2VtcHR5dGljay5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC9lbXB0eXRpY2sucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUwMGNhYgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC9lbXB0eXRpY2sucmlnaHQKQEAgLTAsMCArMSwxNyBAQAorMAorMAoraHVzaDogY2FuJ3QgZXhlY3V0ZSAnJzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorMTI3CitodXNoOiBjYW4ndCBleGVjdXRlICcnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CisxMjcKKzAKKzAKKzAKKzAKK2h1c2g6IGNhbid0IGV4ZWN1dGUgJyc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKzEyNworaHVzaDogY2FuJ3QgZXhlY3V0ZSAnJzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorMTI3CiswCiswCitodXNoOiBjYW4ndCBleGVjdXRlICcnOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvZW1wdHl0aWNrLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L2VtcHR5dGljay50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYWZmYWZiCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L2VtcHR5dGljay50ZXN0cwpAQCAtMCwwICsxLDE2IEBACit0cnVlOyAgYGA7IGVjaG8gJD8KK2ZhbHNlOyBgYDsgZWNobyAkPwordHJ1ZTsgIGAiImA7IGVjaG8gJD8KK2ZhbHNlOyBgIiJgOyBlY2hvICQ/Cit0cnVlOyAgYCAgICAgYDsgZWNobyAkPworZmFsc2U7IGAgICAgIGA7IGVjaG8gJD8KKwordHJ1ZTsgICQoKTsgZWNobyAkPworZmFsc2U7ICQoKTsgZWNobyAkPwordHJ1ZTsgICQoIiIpOyBlY2hvICQ/CitmYWxzZTsgJCgiIik7IGVjaG8gJD8KK3RydWU7ICAkKCAgICAgKTsgZWNobyAkPworZmFsc2U7ICQoICAgICApOyBlY2hvICQ/CisKK2V4ZWMgJyc7IGVjaG8gJD8KK2VjaG8gTm90IHJlYWNoZWQKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC9mYWxzZXRpY2sucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvZmFsc2V0aWNrLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiOThmYjcKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvZmFsc2V0aWNrLnJpZ2h0CkBAIC0wLDAgKzEsMjcgQEAKKzAKKzAKKzAKKzAKKzIKKzIKKzIKKzIKK2h1c2g6IGNhbid0IG9wZW4gJy9kb2VzL25vdC9leGlzdCc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKzEKK2h1c2g6IGNhbid0IG9wZW4gJy9kb2VzL25vdC9leGlzdCc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKzEKK2h1c2g6IGNhbid0IG9wZW4gJy9kb2VzL25vdC9leGlzdCc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKzEKK2h1c2g6IGNhbid0IG9wZW4gJy9kb2VzL25vdC9leGlzdCc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKzEKK2h1c2g6IGNhbid0IG9wZW4gJy9kb2VzL25vdC9leGlzdCc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKzEKK2h1c2g6IGNhbid0IG9wZW4gJy9kb2VzL25vdC9leGlzdCc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKzEKK2h1c2g6IGNhbid0IG9wZW4gJy9kb2VzL25vdC9leGlzdCc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKzEKK2h1c2g6IGNhbid0IG9wZW4gJy9kb2VzL25vdC9leGlzdCc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKzEKK2h1c2g6IGNhbid0IG9wZW4gJy9kb2VzL25vdC9leGlzdCc6IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkKKzEKK0RvbmU6IGE9YgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L2ZhbHNldGljay50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC9mYWxzZXRpY2sudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDRkMmVhZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC9mYWxzZXRpY2sudGVzdHMKQEAgLTAsMCArMSwyMiBAQAorIyBFeGl0Y29kZSAwIChgYCBoYXMgbm8gZXhpdGNvZGUsIGJ1dCBhc3NpZ25tZW50IGhhcyk6Cit0cnVlOyAgYT1gYDsgZWNobyAkPworZmFsc2U7IGE9YGA7IGVjaG8gJD8KK3RydWU7ICBhPSQoKTsgZWNobyAkPworZmFsc2U7IGE9JCgpOyBlY2hvICQ/CisjIEV4aXRjb2RlIDIgKGBjbWRgIGV4cGFuc2lvbiBzZXRzIGV4aXRjb2RlIGFmdGVyIGFzc2lnbm1lbnQgc2V0IGl0IHRvIDApOgordHJ1ZTsgIGE9YGV4aXQgMmA7IGVjaG8gJD8KK2ZhbHNlOyBhPWBleGl0IDJgOyBlY2hvICQ/Cit0cnVlOyAgYT0kKGV4aXQgMik7IGVjaG8gJD8KK2ZhbHNlOyBhPSQoZXhpdCAyKTsgZWNobyAkPworIyBFeGl0Y29kZSAxIChyZWRpcmVjdCBzZXRzIGV4aXRjb2RlIHRvIDEgb24gZXJyb3IgYWZ0ZXIgdGhlbSk6Cit0cnVlOyAgYT1gYCA+L2RvZXMvbm90L2V4aXN0OyBlY2hvICQ/CitmYWxzZTsgYT1gYCA+L2RvZXMvbm90L2V4aXN0OyBlY2hvICQ/Cit0cnVlOyAgYT0kKCkgPi9kb2VzL25vdC9leGlzdDsgZWNobyAkPworZmFsc2U7IGE9JCgpID4vZG9lcy9ub3QvZXhpc3Q7IGVjaG8gJD8KK3RydWU7ICBhPWBleGl0IDJgID4vZG9lcy9ub3QvZXhpc3Q7IGVjaG8gJD8KK2ZhbHNlOyBhPWBleGl0IDJgID4vZG9lcy9ub3QvZXhpc3Q7IGVjaG8gJD8KK3RydWU7ICBhPSQoZXhpdCAyKSA+L2RvZXMvbm90L2V4aXN0OyBlY2hvICQ/CitmYWxzZTsgYT0kKGV4aXQgMikgPi9kb2VzL25vdC9leGlzdDsgZWNobyAkPworIyAuLi5hbmQgYXNzaWdubWVudCBzdGlsbCBoYXBwZW5zIGRlc3BpdGUgcmVkaXJlY3QgZXJyb3I6Cit0cnVlOyAgYT0kKGVjaG8gYikgPi9kb2VzL25vdC9leGlzdDsgZWNobyAkPworZWNobyAiRG9uZTogYT0kYSIKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2sucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkMjgxYwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorMQorMQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2sudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljay50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xZjc0OWE5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2sudGVzdHMKQEAgLTAsMCArMSw0IEBACit0cnVlCitmYWxzZTsgZWNobyBgZWNobyAkP2AKK3RydWUKK3sgZmFsc2U7IGVjaG8gYGVjaG8gJD9gOyB9CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazIucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2Yzg4MwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrMi5yaWdodApAQCAtMCwwICsxIEBACitCQVoKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrMi50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYjRlOTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2syLnRlc3RzCkBAIC0wLDAgKzEsNSBAQAoraWYgZmFsc2U7IHRoZW4KKyAgICBlY2hvICJGT08iCisgICAgdG1wPWBlY2hvIEJBUiA+JjJgCitmaQorZWNobyBCQVoKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrMy5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrMy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGYyNjdhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2szLnJpZ2h0CkBAIC0wLDAgKzEsNiBAQAorXFRFU1RaWkJFU1QKKyRURVNUCitRCithXGJjCisxMS0kYS1cdC1cLVwiLWAtXC0tXHotXCotXD8tMjIgMzMtJGEtXHQtXC0iLWAtXC0tXHotXCotXD8tNDQKK2RvbmU6MApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2szLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2szLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNhZWIyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazMudGVzdHMKQEAgLTAsMCArMSwxNCBAQAordGVzdCAiJENPTkZJR19GRUFUVVJFX0ZBTkNZX0VDSE8iID0gInkiIHx8IGV4aXQgNzcKKworVEVTVD1RCisjIFxgIGlzIHNwZWNpYWwKK2VjaG8gYGVjaG8gJ1wnVEVTVFxgZWNobyBaWlxgQkVTVGAKKyMgXCQgYW5kIFxcIGFyZSBzcGVjaWFsCitlY2hvIGBlY2hvIFxcJFRFU1RgCitlY2hvIGBlY2hvIFwkVEVTVGAKK2VjaG8gYWBlY2hvIFxcXFxiYGMKKworIyBcIiBpcyBub3Qgc3BlY2lhbCBpZiBpbiB1bnF1b3RlZCBgY21kYCAocGFzc2VkIHZlcmJhdGltIFdJVEggXCksCisjIGJ1dCBpcyBzcGVjaWFsIGluIHF1b3RlZCBvbmUKK2VjaG8gYGVjaG8gMTEnLSRhLVx0LVxcLVwiLVxgLVwtLVx6LVwqLVw/LScyMmAgImBlY2hvIDMzJy0kYS1cdC1cXC1cIi1cYC1cLS1cei1cKi1cPy0nNDRgIgorZWNobyBkb25lOiQ/CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazQucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwMzBlYQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXBzdWJzdC90aWNrNC5yaWdodApAQCAtMCwwICsxLDcgQEAKKyhURVNUKSBCRVNUCitURVNUKSBCRVNUCisoKFRFU1QpIEJFU1QKKykKK2FiYworYSljCitPSzogMApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2s0LnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2s0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYyMzA1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazQudGVzdHMKQEAgLTAsMCArMSw3IEBACitlY2hvICQoZWNobyAnKFRFU1QpJyBCRVNUKQorZWNobyAkKGVjaG8gJ1RFU1QpJyBCRVNUKQorZWNobyAkKGVjaG8gXChcKFRFU1RcKSBCRVNUKQorZWNobyAkKGVjaG8gXCkpCitlY2hvICQoZWNobyBhImBlY2hvICJiImAiYyApCitlY2hvICQoZWNobyBhImBlY2hvICIpImAiYyApCitlY2hvIE9LOiAkPwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2s1LnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2s1LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMDQ5MWYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazUucmlnaHQKQEAgLTAsMCArMSBAQAorMQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2s1LnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2s1LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJkMTYwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGljazUudGVzdHMKQEAgLTAsMCArMSBAQAordHJ1ZTsgZWNobyBgZmFsc2VgICQ/CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGlja19odWdlLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2tfaHVnZS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTc0MGY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2tfaHVnZS5yaWdodApAQCAtMCwwICsxLDMgQEAKKzU0NmVkM2Y1YzgxYzc4MGQzYWI4NmFkYTE0ODI0MjM3ICAtCis1NDZlZDNmNWM4MWM3ODBkM2FiODZhZGExNDgyNDIzNyAgLQorRW5kCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1wc3Vic3QvdGlja19odWdlLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2tfaHVnZS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hY2NlOTJmCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcHN1YnN0L3RpY2tfaHVnZS50ZXN0cwpAQCAtMCwwICsxLDcgQEAKKyMgVGhpcyBjcmVhdGVzIDEyMGsgZmlsZQoreWVzICIxMjM0NTY3ODkgMTIzNDU2Nzg5IDEyMzQ1Njc4OSAxMjM0NTY3ODkiIHwgaGVhZCAtMzAwMCA+PiIkMC50bXAiCisKK2VjaG8gImBjYXQgJDAudG1wYCIgfCBtZDVzdW0KK3JtICIkMC50bXAiCit5ZXMgIjEyMzQ1Njc4OSAxMjM0NTY3ODkgMTIzNDU2Nzg5IDEyMzQ1Njc4OSIgfCBoZWFkIC0zMDAwIHwgbWQ1c3VtCitlY2hvIEVuZApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX1JFUExZLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX1JFUExZLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZjVkNTQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfUkVQTFkucmlnaHQKQEAgLTAsMCArMSw1IEBACit0ZXN0IDE6IHwgIGFiYzEgIGRlZiAgfAordGVzdCAyOiB8ICBcYWJjMiAgZFxlZiAgfAordGVzdCAzOiB8YWJjMyAgZGVmfAordGVzdCA0OiB8XGFiYzQgIGRcZWZ8CitEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfUkVQTFkudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfUkVQTFkudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmEyMGNhZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9SRVBMWS50ZXN0cwpAQCAtMCwwICsxLDUgQEAKK2VjaG8gJyAgXGFiYzEgIGRcZWYgICcgfCAoIHJlYWQgICAgICAgICA7IGVjaG8gInRlc3QgMTogfCRSRVBMWXwiICkKK2VjaG8gJyAgXGFiYzIgIGRcZWYgICcgfCAoIHJlYWQgLXIgICAgICA7IGVjaG8gInRlc3QgMjogfCRSRVBMWXwiICkKK2VjaG8gJyAgXGFiYzMgIGRcZWYgICcgfCAoIHJlYWQgICAgUkVQTFk7IGVjaG8gInRlc3QgMzogfCRSRVBMWXwiICkKK2VjaG8gJyAgXGFiYzQgIGRcZWYgICcgfCAoIHJlYWQgLXIgUkVQTFk7IGVjaG8gInRlc3QgNDogfCRSRVBMWXwiICkKK2VjaG8gRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX2lmcy5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9pZnMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUyMzM0NAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9pZnMucmlnaHQKQEAgLTAsMCArMSwxMCBAQAordGVzdCAxOiAuYS4gLmIuIC5jLgordGVzdCAyOiAuYS4gLmIuIC5jLgordGVzdCAzOiAuYS4gLi4gLmIsYy4KK3Rlc3QgNDogLmEuIC4uIC5iLGMuCit0ZXN0IDU6IC5hLiAuLiAuYy4KK3Rlc3QgNjogLmEuIC4uIC5jLiAuZC4KK3Rlc3QgNzogLmEuIC4uIC5iLGMsZCAgLCAgLC4KK3Rlc3QgODogLi4gLmEuIC5iLiAuYy4KK3Rlc3QgOTogLmEuIC5iLiAuYy4gLi4KK3Rlc3QgQTogLi4gLmEuIC4uIC5iLiAuYy4KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9pZnMudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfaWZzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZlODMxMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfaWZzLnRlc3RzCkBAIC0wLDAgKzEsMTAgQEAKK3ByaW50ZiAnYVx0XHRiXHRjXG4nIHwgKCBJRlM9JChwcmludGYgIlx0IikgcmVhZCBhIGIgYzsgIGVjaG8gInRlc3QgMTogLiRhLiAuJGIuIC4kYy4iICkKK3ByaW50ZiAnYVx0XHRiXHRjXG4nIHwgKCBJRlM9JChwcmludGYgIiBcdCIpIHJlYWQgYSBiIGM7IGVjaG8gInRlc3QgMjogLiRhLiAuJGIuIC4kYy4iICkKK3ByaW50ZiAnYSwsYixjXG4nICAgIHwgKCBJRlM9IiwiIHJlYWQgYSBiIGM7ICBlY2hvICJ0ZXN0IDM6IC4kYS4gLiRiLiAuJGMuIiApCitwcmludGYgJ2EsLGIsY1xuJyAgICB8ICggSUZTPSIgLCIgcmVhZCBhIGIgYzsgZWNobyAidGVzdCA0OiAuJGEuIC4kYi4gLiRjLiIgKQorcHJpbnRmICdhICwsIGNcbicgICAgfCAoIElGUz0iICwiIHJlYWQgYSBiIGM7IGVjaG8gInRlc3QgNTogLiRhLiAuJGIuIC4kYy4iICkKK3ByaW50ZiAnYSAsLCBjIGRcbicgIHwgKCBJRlM9IiAsIiByZWFkIGEgYiBjIGQ7ICAgICBlY2hvICJ0ZXN0IDY6IC4kYS4gLiRiLiAuJGMuIC4kZC4iICkKK3ByaW50ZiAnIGEsLGIsYyxkICAsICAsXG4nIHwgKCBJRlM9IiAsIiByZWFkIGEgYiBjOyBlY2hvICJ0ZXN0IDc6IC4kYS4gLiRiLiAuJGMuIiApCitwcmludGYgJ1x0LFx0YVx0LFx0Ylx0YycgICB8ICggSUZTPSQocHJpbnRmICIgXHQsIikgcmVhZCBhIGIgYyBkOyAgIGVjaG8gInRlc3QgODogLiRhLiAuJGIuIC4kYy4gLiRkLiIgKQorcHJpbnRmICdcdFx0YVx0LFx0Ylx0YycgICAgfCAoIElGUz0kKHByaW50ZiAiIFx0LCIpIHJlYWQgYSBiIGMgZDsgICBlY2hvICJ0ZXN0IDk6IC4kYS4gLiRiLiAuJGMuIC4kZC4iICkKK3ByaW50ZiAnXHQsXHRhXHQsLFx0Ylx0YycgIHwgKCBJRlM9JChwcmludGYgIiBcdCwiKSByZWFkIGEgYiBjIGQgZTsgZWNobyAidGVzdCBBOiAuJGEuIC4kYi4gLiRjLiAuJGQuIC4kZS4iICkKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9uLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX24ucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY4MWFmMAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9uLnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAordGVzdAordGVzCit0ZXMKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9uLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX24udGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTI0MjNiYQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9uLnRlc3RzCkBAIC0wLDAgKzEsMyBAQAorZWNobyAndGVzdCcgfCAocmVhZCByZXBseTsgZWNobyAiJHJlcGx5IikKK2VjaG8gJ3Rlc3QnIHwgKHJlYWQgLW4gMyByZXBseTsgZWNobyAiJHJlcGx5IikKK2VjaG8gJ3Rlc3QnIHwgKHJlYWQgLW4zIHJlcGx5OyBlY2hvICIkcmVwbHkiKQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX3IucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfci5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTM2YmY3Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX3IucmlnaHQKQEAgLTAsMCArMSwyIEBACit0ZXN0YmVzdAordGVzdFwKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9yLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX3IudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmM0Y2M2MQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF9yLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorZWNobyAtZSAndGVzdFxcXG5iZXN0JyB8IChyZWFkIHJlcGx5OyBlY2hvICIkcmVwbHkiKQorZWNobyAtZSAndGVzdFxcXG5iZXN0JyB8IChyZWFkIC1yIHJlcGx5OyBlY2hvICIkcmVwbHkiKQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX3QucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfdC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDEyNmNiCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtcmVhZC9yZWFkX3QucmlnaHQKQEAgLTAsMCArMSw0IEBACis+PAorPjwKKz50ZXN0PAorPnRlc3Q8CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfdC50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXJlYWQvcmVhZF90LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ2NWYxYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC1yZWFkL3JlYWRfdC50ZXN0cwpAQCAtMCwwICsxLDEwIEBACisjIGJhc2ggMy4yIG91dHB1dHM6CisKKyMgPjwKK3sgZWNobyAtbiAndGUnOyBzbGVlcCAyOyBlY2hvICdzdCc7IH0gICB8IChyZWFkIC10IDEgcmVwbHk7IGVjaG8gIj4kcmVwbHk8IikKKyMgPjwKK3sgICAgICAgICAgICAgICBzbGVlcCAyOyBlY2hvICd0ZXN0JzsgfSB8IChyZWFkIC10IDEgcmVwbHk7IGVjaG8gIj4kcmVwbHk8IikKKyMgPnRlc3Q8Cit7IGVjaG8gLW4gJ3RlJzsgc2xlZXAgMTsgZWNobyAnc3QnOyB9ICAgfCAocmVhZCAtdCAyIHJlcGx5OyBlY2hvICI+JHJlcGx5PCIpCisjID50ZXN0PAoreyAgICAgICAgICAgICAgIHNsZWVwIDE7IGVjaG8gJ3Rlc3QnOyB9IHwgKHJlYWQgLXQgMiByZXBseTsgZWNobyAiPiRyZXBseTwiKQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9jYXRjaC5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvY2F0Y2gucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBhMDYyYwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvY2F0Y2gucmlnaHQKQEAgLTAsMCArMSw1IEBACitzZW5kaW5nIFVTUjIKK2NhdWdodAorc2VuZGluZyBVU1IyCitzZW5kaW5nIFVTUjIKK1VTUjIKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvY2F0Y2gudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL2NhdGNoLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQyYTIxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL2NhdGNoLnRlc3RzCkBAIC0wLDAgKzEsMjAgQEAKKyMgYXZvaWQgdWdseSB3YXJuaW5ncyBhYm91dCBzaWduYWxzIG5vdCBiZWluZyBjYXVnaHQKK3RyYXAgIjoiIFVTUjEgVVNSMgorCisiJFRISVNfU0giIC1jICcKK3RyYXAgImVjaG8gY2F1Z2h0IiBVU1IyCitlY2hvICJzZW5kaW5nIFVTUjIiCitraWxsIC1VU1IyICQkCisKK3RyYXAgIiIgVVNSMgorZWNobyAic2VuZGluZyBVU1IyIgora2lsbCAtVVNSMiAkJAorCit0cmFwICItIiBVU1IyCitlY2hvICJzZW5kaW5nIFVTUjIiCitraWxsIC1VU1IyICQkCisKK2VjaG8gIm5vdCByZWFjaGVkIgorJworCit0cmFwICItIiBVU1IxIFVTUjIKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvZXhpdC5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvZXhpdC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDAwNzI1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9leGl0LnJpZ2h0CkBAIC0wLDAgKzEsMTIgQEAKK2NvdworbW9vCitUcmFwczE6Cit0cmFwIC0tICdleGl0ZnVuYycgRVhJVAorVHJhcHMyOgordHJhcCAtLSAnZWNobyBTaG91bGQgbm90IHJ1bicgRVhJVAorQ2hlY2sxOiA0MgorVHJhcHMxOgordHJhcCAtLSAnZXhpdGZ1bmMnIEVYSVQKK1RyYXBzMjoKK3RyYXAgLS0gJ2VjaG8gU2hvdWxkIG5vdCBydW4nIEVYSVQKK0NoZWNrMjogNDIKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvZXhpdC50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvZXhpdC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMDYxMTA1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9leGl0LnRlc3RzCkBAIC0wLDAgKzEsMzQgQEAKKyIkVEhJU19TSCIgLWMgJ3RyYXAgImVjaG8gY293IiAwJworIiRUSElTX1NIIiAtYyAndHJhcCAiZWNobyBtb28iIEVYSVQnCisiJFRISVNfU0giIC1jICd0cmFwICJlY2hvIG5vIiAwOyB0cmFwIDAnCisKKygKK2V4aXRmdW5jKCkgeworICAgICAgICBlY2hvICJUcmFwczE6IgorICAgICAgICB0cmFwCisgICAgICAgICMgRVhJVCB0cmFwIGlzIGRpc2FibGVkIGFmdGVyIGl0IGlzIHRyaWdnZXJlZCwKKyAgICAgICAgIyBpdCBjYW4gbm90IGJlICJyZS1hcm1lZCIgbGlrZSB0aGlzOgorICAgICAgICB0cmFwICJlY2hvIFNob3VsZCBub3QgcnVuIiBFWElUCisgICAgICAgIGVjaG8gIlRyYXBzMjoiCisgICAgICAgIHRyYXAKK30KK3RyYXAgJ2V4aXRmdW5jJyBFWElUCitleGl0IDQyCispCitlY2hvIENoZWNrMTogJD8KKworKAorZXhpdGZ1bmMoKSB7CisgICAgICAgIGVjaG8gIlRyYXBzMToiCisgICAgICAgIHRyYXAKKyAgICAgICAgIyBFWElUIHRyYXAgaXMgZGlzYWJsZWQgYWZ0ZXIgaXQgaXMgdHJpZ2dlcmVkLAorICAgICAgICAjIGl0IGNhbiBub3QgYmUgInJlLWFybWVkIiBsaWtlIHRoaXM6CisgICAgICAgIHRyYXAgImVjaG8gU2hvdWxkIG5vdCBydW4iIEVYSVQKKyAgICAgICAgZWNobyAiVHJhcHMyOiIKKyAgICAgICAgdHJhcAorICAgICAgICBleGl0IDQyCit9Cit0cmFwICdleGl0ZnVuYycgRVhJVAorZXhpdCA2NgorKQorZWNobyBDaGVjazI6ICQ/CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NhdmUtcmV0LnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zYXZlLXJldC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2UxMmNlCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zYXZlLXJldC5yaWdodApAQCAtMCwwICsxLDIgQEAKK1lFQUgKKzAKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2F2ZS1yZXQudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NhdmUtcmV0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjA3ODZiNmQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NhdmUtcmV0LnRlc3RzCkBAIC0wLDAgKzEsNCBAQAorIyBtYWtlIHN1cmUgd2UgZG8gbm90IGNvcnJ1cHQgJD8gYWNyb3NzIHRyYXBzCit0cmFwICJlY2hvIFlFQUg7IGZhbHNlIiBVU1IxCitraWxsIC1VU1IxICQkCitlY2hvICQ/CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NhdmV0cmFwLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zYXZldHJhcC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTkyMjViCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zYXZldHJhcC5yaWdodApAQCAtMCwwICsxLDggQEAKK3RyYXAgLS0gJ2VjaG8gRXhpdGluZycgRVhJVAordHJhcCAtLSAnZWNobyBXSU5DSCEnIFdJTkNICit0cmFwIC0tICdlY2hvIEV4aXRpbmcnIEVYSVQKK3RyYXAgLS0gJ2VjaG8gV0lOQ0ghJyBXSU5DSAordHJhcCAtLSAnZWNobyBFeGl0aW5nJyBFWElUCit0cmFwIC0tICdlY2hvIFdJTkNIIScgV0lOQ0gKK0RvbmUKK0V4aXRpbmcKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2F2ZXRyYXAudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NhdmV0cmFwLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMyYjMxMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NhdmV0cmFwLnRlc3RzCkBAIC0wLDAgKzEsOSBAQAordHJhcCAnZWNobyBFeGl0aW5nJyBFWElUCit0cmFwICdlY2hvIFdJTkNIIScgU0lHV0lOQ0gKK3Y9YCB0cmFwICAgYAorZWNobyAiJHYiCit2PSQoCXRyYXAgKQorZWNobyAiJHYiCit2PWB0cmFwYAorZWNobyAiJHYiCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2lnbmFsNy5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2lnbmFsNy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTc0NTNlCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zaWduYWw3LnJpZ2h0CkBAIC0wLDAgKzEgQEAKK0J1ZyBkZXRlY3RlZDogMApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zaWduYWw3LnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zaWduYWw3LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmMyYjEzODEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NpZ25hbDcudGVzdHMKQEAgLTAsMCArMSwxOCBAQAorYnVnKCkgeworCXRyYXAgOiBleGl0CisJIyBCdWcgd2FzIGNhdXNpbmcgc2ggdG8gYmUgcnVuIGluIHN1YnNoZWxsLAorCSMgYXMgaWYgdGhpcyBsaW5lIGlzIHJlcGxhY2VkIHdpdGggKHNoIC1jIC4uLjsgZXhpdCAkPykgJgorCSMgaGVyZToKKwlzaCAtYyAnZWNobyBSRUFMX0NISUxEPSQkJyAmCisJZWNobyBQQVJFTlRTX0lERUFfT0ZfQ0hJTEQ9JCEKKwl3YWl0ICAjIG1ha2Ugc3VyZSBia2dkIHNoZWxsIGNvbXBsZXRlcworfQorCitidWcgfCB7Cit3aGlsZSByZWFkIHZhcnZhbDsgZG8KKwlldmFsICR2YXJ2YWwKK2RvbmUKK3Rlc3QgeCIkUkVBTF9DSElMRCIgIT0geCIiIFwKKyYmIHRlc3QgeCIkUkVBTF9DSElMRCIgPSB4IiRQQVJFTlRTX0lERUFfT0ZfQ0hJTEQiCitlY2hvICJCdWcgZGV0ZWN0ZWQ6ICQ/IgorfQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zaWduYWxfcmVhZDEucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NpZ25hbF9yZWFkMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODcwYThlCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zaWduYWxfcmVhZDEucmlnaHQKQEAgLTAsMCArMSBAQAorR290IEhVUDowCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NpZ25hbF9yZWFkMS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2lnbmFsX3JlYWQxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjExMDU0NzkKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NpZ25hbF9yZWFkMS50ZXN0cwpAQCAtMCwwICsxLDUgQEAKKyhzbGVlcCAxOyBraWxsIC1IVVAgJCQpICYKK3RyYXAgJ2VjaG8gIkdvdCBIVVA6JD8iOyBleGl0JyBIVVAKK3doaWxlIHRydWU7IGRvCisJcmVhZCBpZ25vcmVkCitkb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NpZ25hbF9yZWFkMi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2lnbmFsX3JlYWQyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxYTZiYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3NpZ25hbF9yZWFkMi5yaWdodApAQCAtMCwwICsxLDIgQEAKK0hVUAorRG9uZToxMjkKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2lnbmFsX3JlYWQyLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zaWduYWxfcmVhZDIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWFiNWI5YgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvc2lnbmFsX3JlYWQyLnRlc3RzCkBAIC0wLDAgKzEsNyBAQAorJFRISVNfU0ggLWMgJworKHNsZWVwIDE7IGtpbGwgLUhVUCAkJCkgJgord2hpbGUgdHJ1ZTsgZG8KKwlyZWFkIGlnbm9yZWQKK2RvbmUKKycKK2VjaG8gIkRvbmU6JD8iCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3N1YnNoZWxsLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zdWJzaGVsbC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODY1YjkzCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zdWJzaGVsbC5yaWdodApAQCAtMCwwICsxLDIxIEBACit0cmFwIC0tICcnIEhVUAordHJhcCAtLSAnJyBRVUlUCit0cmFwIC0tICcnIFNZUworT2sKK3RyYXAgLS0gJycgSFVQCit0cmFwIC0tICcnIFFVSVQKK3RyYXAgLS0gJycgU1lTCitPawordHJhcCAtLSAnJyBIVVAKK3RyYXAgLS0gJycgUVVJVAordHJhcCAtLSAnJyBTWVMKK09rCit0cmFwIC0tICcnIEhVUAordHJhcCAtLSAnJyBRVUlUCit0cmFwIC0tICcnIFNZUworT2sKK3RyYXAgLS0gJycgSFVQCit0cmFwIC0tICcnIFFVSVQKK3RyYXAgLS0gJycgU1lTCitURVJNCitEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3N1YnNoZWxsLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zdWJzaGVsbC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kODc3ZjJiCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC9zdWJzaGVsbC50ZXN0cwpAQCAtMCwwICsxLDE5IEBACisjIE5vbi1lbXB0eSB0cmFwcyBzaG91bGQgYmUgcmVzZXQgaW4gc3Vic2hlbGwKKworIyBIVVAgaXMgc3BlY2lhbCBpbiBpbnRlcmFjdGl2ZSBzaGVsbHMKK3RyYXAgJycgSFVQCisjIFFVSVQgaXMgYWx3YXlzIHNwZWNpYWwKK3RyYXAgJycgUVVJVAorIyBTWVMgaXMgbm90IHNwZWNpYWwKK3RyYXAgJycgU1lTCisjIFdJTkNIIGlzIGhhcm1sZXNzCit0cmFwICdiYWQ6IGNhdWdodCBXSU5DSCcgV0lOQ0gKKyMgV2l0aCBURVJNIHdlJ2xsIGNoZWNrIHdoZXRoZXIgaXQgaXMgcmVzZXQKK3RyYXAgJ2JhZDogY2F1Z2h0IFRFUk0nICBURVJNCisKKyh0cmFwOyAiJFRISVNfU0giIC1jICdraWxsIC1IVVAgICAkUFBJRCc7IGVjaG8gT2spCisodHJhcDsgIiRUSElTX1NIIiAtYyAna2lsbCAtUVVJVCAgJFBQSUQnOyBlY2hvIE9rKQorKHRyYXA7ICIkVEhJU19TSCIgLWMgJ2tpbGwgLVNZUyAgICRQUElEJzsgZWNobyBPaykKKyh0cmFwOyAiJFRISVNfU0giIC1jICdraWxsIC1XSU5DSCAkUFBJRCc7IGVjaG8gT2spCisodHJhcDsgIiRUSElTX1NIIiAtYyAna2lsbCAtVEVSTSAgJFBQSUQnOyBlY2hvIEJhZDogVEVSTSBpcyBub3QgcmVzZXQpCitlY2hvIERvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXRyYXAvdXNhZ2UucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3VzYWdlLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZGJkNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3VzYWdlLnJpZ2h0CkBAIC0wLDAgKzEsMTQgQEAKK19fXworX19fCitfX18KK3RyYXAgLS0gJ2EnIEVYSVQKK3RyYXAgLS0gJ2EnIElOVAordHJhcCAtLSAnYScgVVNSMQordHJhcCAtLSAnYScgVVNSMgorX19fCitfX18KK3RyYXAgLS0gJ2EnIFVTUjEKK3RyYXAgLS0gJ2EnIFVTUjIKK19fXworX19fCit0cmFwIC0tICdhJyBVU1IyCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC10cmFwL3VzYWdlLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC91c2FnZS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMjljNmU3Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdHJhcC91c2FnZS50ZXN0cwpAQCAtMCwwICsxLDIzIEBACisjIG5vIG91dHB1dCAtLSBkZWZhdWx0IHN0YXRlCitlY2hvIF9fXwordHJhcAorCisjIGFzc2lnbiBzb21lIHRyYXBzCitlY2hvIF9fXwordHJhcCAiYSIgRVhJVCBJTlQgVVNSMSBVU1IyCisKKyMgc2hvdyB0aGVtIGFsbAorZWNobyBfX18KK3RyYXAKKworIyBjbGVhciBvbmUKK2VjaG8gX19fCit0cmFwIDAgSU5UCitlY2hvIF9fXwordHJhcAorCisjIGNsZWFyIGFub3RoZXIKK2VjaG8gX19fCit0cmFwICItIiBVU1IxCitlY2hvIF9fXwordHJhcApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9lbXB0eS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvZW1wdHkucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNiM2M3MAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvZW1wdHkucmlnaHQKQEAgLTAsMCArMSwzIEBACithIGIgYyBkIGUgZiAxIDIgMyA0IDUgNiA3IDggOSAwIEEgQiBDIEQgRSBGCithIGIgYyBkIGUgZiAxIDIgMyA0IDUgNiA3IDggOSAwIEEgQiBDIEQgRSBGCithIGIgYyBkIGUgZiAxIDIgMyA0IDUgNiA3IDggOSAwIEEgQiBDIEQgRSBGCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL2VtcHR5LnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9lbXB0eS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOWMyNDdlCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9lbXB0eS50ZXN0cwpAQCAtMCwwICsxLDUgQEAKK2U9CisKK2VjaG8gYSBiIGMgZCBlIGYgMSAyIDMgNCA1IDYgNyA4IDkgMCBBIEIgQyBEIEUgRgorZWNobyBhICRlIGIgJGUgYyAkZSBkICRlIGUgJGUgZiAkZSAxICRlIDIgJGUgMyAkZSA0ICRlIDUgJGUgNiAkZSA3ICRlIDggJGUgOSAkZSAwICRlIEEgJGUgQiAkZSBDICRlIEQgJGUgRSAkZSBGCitlY2hvICRlIGEgJGUgYiAkZSBjICRlIGQgJGUgZSAkZSBmICRlIDEgJGUgMiAkZSAzICRlIDQgJGUgNSAkZSA2ICRlIDcgJGUgOCAkZSA5ICRlIDAgJGUgQSAkZSBCICRlIEMgJGUgRCAkZSBFICRlIEYKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvZ2xvYl9hbmRfdmFycy5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvZ2xvYl9hbmRfdmFycy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWM3ZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9nbG9iX2FuZF92YXJzLnJpZ2h0CkBAIC0wLDAgKzEgQEAKKy4vZ2xvYl9hbmRfdmFycy5yaWdodCAuL2dsb2JfYW5kX3ZhcnMudGVzdHMKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvZ2xvYl9hbmRfdmFycy50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvZ2xvYl9hbmRfdmFycy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ODJjZjlkCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9nbG9iX2FuZF92YXJzLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAordj0uCitlY2hvICR2L2dsb2JfYW5kX3ZhcnMuW3RyXSoKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2FsdC5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2FsdC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2YxOGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfYWx0LnJpZ2h0CkBAIC0wLDAgKzEsOCBAQAoraHVzaDogc3ludGF4IGVycm9yOiB1bnRlcm1pbmF0ZWQgJHtuYW1lfQoraHVzaDogc3ludGF4IGVycm9yOiB1bnRlcm1pbmF0ZWQgJHtuYW1lfQorX18gX18KK18gXyBfIF8gXworX2FhYWEgXyBfIF93b3JkIF93b3JkCitfIF8gXyBfIF8KK18gXyBfIF93b3JkIF8KK19mZmYgXyBfIF93b3JkIF93b3JkCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9hbHQudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9hbHQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2I2NDZiMQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2FsdC50ZXN0cwpAQCAtMCwwICsxLDIyIEBACisjIGZpcnN0IHRyeSBzb21lIGludmFsaWQgcGF0dGVybnMgKGRvIGluIHN1YnNoZWxsIGR1ZSB0byBwYXJzaW5nIGVycm9yKQorIiRUSElTX1NIIiAtYyAnZWNobyAkeyt9ICA7IGVjaG8gbW9vJworIiRUSElTX1NIIiAtYyAnZWNobyAkezorfSA7IGVjaG8gbW9vJworCisjIG5vdyBzb21lIGZ1bmt5IG9uZXMuIChiYXNoIGRvZXNuJ3QgYWNjZXB0ICR7Iyt9KQorZWNobyBfJHsjK31fIF8keyM6K31fCisKKyMgbm93IHNvbWUgdmFsaWQgb25lcworc2V0IC0tCitlY2hvIF8kMSBfJHsxK30gXyR7MTorfSBfJHsxK3dvcmR9IF8kezE6K3dvcmR9CisKK3NldCAtLSBhYWFhCitlY2hvIF8kMSBfJHsxK30gXyR7MTorfSBfJHsxK3dvcmR9IF8kezE6K3dvcmR9CisKK3Vuc2V0IGYKK2VjaG8gXyRmIF8ke2YrfSBfJHtmOit9IF8ke2Yrd29yZH0gXyR7Zjord29yZH0KKworZj0KK2VjaG8gXyRmIF8ke2YrfSBfJHtmOit9IF8ke2Yrd29yZH0gXyR7Zjord29yZH0KKworZj1mZmYKK2VjaG8gXyRmIF8ke2YrfSBfJHtmOit9IF8ke2Yrd29yZH0gXyR7Zjord29yZH0KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2Fzc2lnbi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2Fzc2lnbi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWIyNTgwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfYXNzaWduLnJpZ2h0CkBAIC0wLDAgKzEsMjcgQEAKK2h1c2g6IHN5bnRheCBlcnJvcjogdW50ZXJtaW5hdGVkICR7bmFtZX0KK2h1c2g6IHN5bnRheCBlcnJvcjogdW50ZXJtaW5hdGVkICR7bmFtZX0KKzAKKzAKK2h1c2g6ICQxOiBjYW5ub3QgYXNzaWduIGluIHRoaXMgd2F5CitodXNoOiAkMTogY2Fubm90IGFzc2lnbiBpbiB0aGlzIHdheQoraHVzaDogJDE6IGNhbm5vdCBhc3NpZ24gaW4gdGhpcyB3YXkKK2h1c2g6ICQxOiBjYW5ub3QgYXNzaWduIGluIHRoaXMgd2F5CitfYWEKK19hYQorX2FhCitfYWEKK18KK18KK18KK193b3JkCitfd29yZAorXworXworXworXworX3dvcmQKK19mZmYKK19mZmYKK19mZmYKK19mZmYKK19mZmYKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2Fzc2lnbi50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2Fzc2lnbi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNDljYjIwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfYXNzaWduLnRlc3RzCkBAIC0wLDAgKzEsMzggQEAKKyMgZmlyc3QgdHJ5IHNvbWUgaW52YWxpZCBwYXR0ZXJucyAoZG8gaW4gc3Vic2hlbGwgZHVlIHRvIHBhcnNpbmcgZXJyb3IpCisiJFRISVNfU0giIC1jICdlY2hvICR7PX0nCisiJFRISVNfU0giIC1jICdlY2hvICR7Oj19JworCisjIG5vdyBzb21lIGZ1bmt5IG9uZXMKKyIkVEhJU19TSCIgLWMgJ2VjaG8gJHsjPX0nCisiJFRISVNfU0giIC1jICdlY2hvICR7Izo9fScKKworIyBzaG91bGQgZXJyb3Igb3V0CisiJFRISVNfU0giIC1jICdzZXQgLS07IGVjaG8gXyR7MT19JworIiRUSElTX1NIIiAtYyAnc2V0IC0tOyBlY2hvIF8kezE6PX0nCisiJFRISVNfU0giIC1jICdzZXQgLS07IGVjaG8gXyR7MT13b3JkfScKKyIkVEhJU19TSCIgLWMgJ3NldCAtLTsgZWNobyBfJHsxOj13b3JkfScKKworIyBzaG91bGQgbm90IGVycm9yCisiJFRISVNfU0giIC1jICdzZXQgYWE7IGVjaG8gXyR7MT19JworIiRUSElTX1NIIiAtYyAnc2V0IGFhOyBlY2hvIF8kezE6PX0nCisiJFRISVNfU0giIC1jICdzZXQgYWE7IGVjaG8gXyR7MT13b3JkfScKKyIkVEhJU19TSCIgLWMgJ3NldCBhYTsgZWNobyBfJHsxOj13b3JkfScKKworIyBzaG91bGQgd29yayBmaW5lCit1bnNldCBmOyBlY2hvIF8kZgordW5zZXQgZjsgZWNobyBfJHtmPX0KK3Vuc2V0IGY7IGVjaG8gXyR7Zjo9fQordW5zZXQgZjsgZWNobyBfJHtmPXdvcmR9Cit1bnNldCBmOyBlY2hvIF8ke2Y6PXdvcmR9CisKK2Y9OyBlY2hvIF8kZgorZj07IGVjaG8gXyR7Zj19CitmPTsgZWNobyBfJHtmOj19CitmPTsgZWNobyBfJHtmPXdvcmR9CitmPTsgZWNobyBfJHtmOj13b3JkfQorCitmPWZmZjsgZWNobyBfJGYKK2Y9ZmZmOyBlY2hvIF8ke2Y9fQorZj1mZmY7IGVjaG8gXyR7Zjo9fQorZj1mZmY7IGVjaG8gXyR7Zj13b3JkfQorZj1mZmY7IGVjaG8gXyR7Zjo9d29yZH0KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2Jhc2hfc3Vic3RyaW5nLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfYmFzaF9zdWJzdHJpbmcucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY0YzUxZAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2Jhc2hfc3Vic3RyaW5nLnJpZ2h0CkBAIC0wLDAgKzEsNjQgQEAKK2h1c2g6IHN5bnRheCBlcnJvcjogdW50ZXJtaW5hdGVkICR7bmFtZX0KK2h1c2g6IHN5bnRheCBlcnJvcjogdW50ZXJtaW5hdGVkICR7bmFtZX0KK2h1c2g6IHN5bnRheCBlcnJvcjogdW50ZXJtaW5hdGVkICR7bmFtZX0KK2h1c2g6IHN5bnRheCBlcnJvcjogdW50ZXJtaW5hdGVkICR7bmFtZX0KKzAxMjM0NTY3ODkKKzEgICAgPXx8CisxOjEgID18fAorMToxOjI9fHwKKzE6OjIgPXx8CisxOjE6ID18fAorMTo6ICA9fHwKKzEgICAgPXwwMTIzfAorMToxICA9fDEyM3wKKzE6MToyPXwxMnwKKzE6OjIgPXwwMXwKKzE6MTogPXx8CisxOjogID18fAorZiAgICA9fHwKK2Y6MSAgPXx8CitmOjE6Mj18fAorZjo6MiA9fHwKK2Y6MTogPXx8CitmOjogID18fAorZiAgICA9fHwKK2Y6MSAgPXx8CitmOjE6Mj18fAorZjo6MiA9fHwKK2Y6MTogPXx8CitmOjogID18fAorZiAgICA9fGF8CitmOjEgID18fAorZjoxOjI9fHwKK2Y6OjIgPXxhfAorZjoxOiA9fHwKK2Y6OiAgPXx8CitmICAgID18MDEyMzQ1Njc4OXwKK2Y6MSAgPXwxMjM0NTY3ODl8CitmOjE6Mj18MTJ8CitmOjoyID18MDF8CitmOjE6ID18fAorZjo6ICA9fHwKK1N1YnN0cmluZ3MgZnJvbSBzcGVjaWFsIHZhcnMKKz8gICAgPXwwfAorPzoxICA9fHwKKz86MToyPXx8Cis/OjoyID18MHwKKz86MTogPXx8Cis/OjogID18fAorIyAgICA9fDExfAorIzoxICA9fDF8CisjOjE6Mj18MXwKKyM6OjIgPXwxMXwKKyM6MTogPXx8CisjOjogID18fAorU3Vic3RyaW5ncyB3aXRoIGV4cHJlc3Npb25zCitmICAgICAgICAgICAgPXwwMTIzNDU2N3wKK2Y6MSsxOjIrMiAgICA9fDIzNDV8CitmOi0xOjIrMiAgICAgPXwwMTIzNDU2N3wKK2Y6MTpmICAgICAgICA9fDEyMzQ1Njd8CitmOjE6JGYgICAgICAgPXwxMjM0NTY3fAorZjoxOiR7Zn0gICAgID18MTIzNDU2N3wKK2Y6MToke2Y6MzoxfSA9fDEyM3wKK2Y6MToxYGVjaG8gMWA9fDF8CitEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9iYXNoX3N1YnN0cmluZy50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2Jhc2hfc3Vic3RyaW5nLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjVjOTU1MmQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9iYXNoX3N1YnN0cmluZy50ZXN0cwpAQCAtMCwwICsxLDgzIEBACisjIGZpcnN0IHRyeSBzb21lIGludmFsaWQgcGF0dGVybnMKKyMgZG8gYWxsIG9mIHRoZXNlIGluIHN1YnNoZWxscyBzaW5jZSBpdCdzIHN1cHBvc2VkIHRvIGVycm9yIG91dAorZXhwb3J0IHZhcj0wMTIzNDU2Nzg5CisiJFRISVNfU0giIC1jICdlY2hvICR7On0nCisiJFRISVNfU0giIC1jICdlY2hvICR7Ojp9JworIiRUSElTX1NIIiAtYyAnZWNobyAkezoxfScKKyIkVEhJU19TSCIgLWMgJ2VjaG8gJHs6OjF9JworCisjdGhpcyBhbHNvIGlzIG5vdCB2YWxpZCBpbiBiYXNoLCBidXQgd2UgYWNjZXB0IGl0OgorIiRUSElTX1NIIiAtYyAnZWNobyAke3Zhcjp9JworCisjIHRoZW4gc29tZSBmdW5reSBvbmVzCisjIFVORklYRUQgQlVHOiB0aGlzIHNob3VsZCB3b3JrOiAiJFRISVNfU0giIC1jICdlY2hvICR7PzowfScKKworIyBub3cgc29tZSB2YWxpZCBvbmVzCitzZXQgLS07IGVjaG8gIjEgICAgPXwkezF9fCIKK3NldCAtLTsgZWNobyAiMToxICA9fCR7MToxfXwiCitzZXQgLS07IGVjaG8gIjE6MToyPXwkezE6MToyfXwiCitzZXQgLS07IGVjaG8gIjE6OjIgPXwkezE6OjJ9fCIKK3NldCAtLTsgZWNobyAiMToxOiA9fCR7MToxOn18Igorc2V0IC0tOyBlY2hvICIxOjogID18JHsxOjp9fCIKKworc2V0IC0tIDAxMjM7IGVjaG8gIjEgICAgPXwkezF9fCIKK3NldCAtLSAwMTIzOyBlY2hvICIxOjEgID18JHsxOjF9fCIKK3NldCAtLSAwMTIzOyBlY2hvICIxOjE6Mj18JHsxOjE6Mn18Igorc2V0IC0tIDAxMjM7IGVjaG8gIjE6OjIgPXwkezE6OjJ9fCIKK3NldCAtLSAwMTIzOyBlY2hvICIxOjE6ID18JHsxOjE6fXwiCitzZXQgLS0gMDEyMzsgZWNobyAiMTo6ICA9fCR7MTo6fXwiCisKK3Vuc2V0IGY7IGVjaG8gImYgICAgPXwkZnwiCit1bnNldCBmOyBlY2hvICJmOjEgID18JHtmOjF9fCIKK3Vuc2V0IGY7IGVjaG8gImY6MToyPXwke2Y6MToyfXwiCit1bnNldCBmOyBlY2hvICJmOjoyID18JHtmOjoyfXwiCit1bnNldCBmOyBlY2hvICJmOjE6ID18JHtmOjE6fXwiCit1bnNldCBmOyBlY2hvICJmOjogID18JHtmOjp9fCIKKworZj07IGVjaG8gImYgICAgPXwkZnwiCitmPTsgZWNobyAiZjoxICA9fCR7ZjoxfXwiCitmPTsgZWNobyAiZjoxOjI9fCR7ZjoxOjJ9fCIKK2Y9OyBlY2hvICJmOjoyID18JHtmOjoyfXwiCitmPTsgZWNobyAiZjoxOiA9fCR7ZjoxOn18IgorZj07IGVjaG8gImY6OiAgPXwke2Y6On18IgorCitmPWE7IGVjaG8gImYgICAgPXwkZnwiCitmPWE7IGVjaG8gImY6MSAgPXwke2Y6MX18IgorZj1hOyBlY2hvICJmOjE6Mj18JHtmOjE6Mn18IgorZj1hOyBlY2hvICJmOjoyID18JHtmOjoyfXwiCitmPWE7IGVjaG8gImY6MTogPXwke2Y6MTp9fCIKK2Y9YTsgZWNobyAiZjo6ICA9fCR7Zjo6fXwiCisKK2Y9MDEyMzQ1Njc4OTsgZWNobyAiZiAgICA9fCRmfCIKK2Y9MDEyMzQ1Njc4OTsgZWNobyAiZjoxICA9fCR7ZjoxfXwiCitmPTAxMjM0NTY3ODk7IGVjaG8gImY6MToyPXwke2Y6MToyfXwiCitmPTAxMjM0NTY3ODk7IGVjaG8gImY6OjIgPXwke2Y6OjJ9fCIKK2Y9MDEyMzQ1Njc4OTsgZWNobyAiZjoxOiA9fCR7ZjoxOn18IgorZj0wMTIzNDU2Nzg5OyBlY2hvICJmOjogID18JHtmOjp9fCIKKworZWNobyAiU3Vic3RyaW5ncyBmcm9tIHNwZWNpYWwgdmFycyIKK2VjaG8gJz8gICAgJyI9fCQ/fCIKK2VjaG8gJz86MSAgJyI9fCR7PzoxfXwiCitlY2hvICc/OjE6MiciPXwkez86MToyfXwiCitlY2hvICc/OjoyICciPXwkez86OjJ9fCIKK2VjaG8gJz86MTogJyI9fCR7PzoxOn18IgorZWNobyAnPzo6ICAnIj18JHs/Ojp9fCIKK3NldCAtLSAxIDIgMyA0IDUgNiA3IDggOSAxMCAxMQorZWNobyAnIyAgICAnIj18JCN8IgorZWNobyAnIzoxICAnIj18JHsjOjF9fCIKK2VjaG8gJyM6MToyJyI9fCR7IzoxOjJ9fCIKK2VjaG8gJyM6OjIgJyI9fCR7Izo6Mn18IgorZWNobyAnIzoxOiAnIj18JHsjOjE6fXwiCitlY2hvICcjOjogICciPXwkeyM6On18IgorCitlY2hvICJTdWJzdHJpbmdzIHdpdGggZXhwcmVzc2lvbnMiCitmPTAxMjM0NTY3OyBlY2hvICdmICAgICAgICAgICAgJyI9fCRmfCIKK2Y9MDEyMzQ1Njc7IGVjaG8gJ2Y6MSsxOjIrMiAgICAnIj18JHtmOjErMToyKzJ9fCIKK2Y9MDEyMzQ1Njc7IGVjaG8gJ2Y6LTE6MisyICAgICAnIj18JHtmOi0xOjIrMn18IgorZj0wMTIzNDU2NzsgZWNobyAnZjoxOmYgICAgICAgICciPXwke2Y6MTpmfXwiCitmPTAxMjM0NTY3OyBlY2hvICdmOjE6JGYgICAgICAgJyI9fCR7ZjoxOiRmfXwiCitmPTAxMjM0NTY3OyBlY2hvICdmOjE6JHtmfSAgICAgJyI9fCR7ZjoxOiR7Zn19fCIKK2Y9MDEyMzQ1Njc7IGVjaG8gJ2Y6MToke2Y6MzoxfSAnIj18JHtmOjE6JHtmOjM6MX19fCIKK2Y9MDEyMzQ1Njc7IGVjaG8gJ2Y6MToxYGVjaG8gMWAnIj18JHtmOjE6YGVjaG8gMWB9fCIKKworZWNobyBEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9kZWZhdWx0LnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfZGVmYXVsdC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2M3MTcyCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfZGVmYXVsdC5yaWdodApAQCAtMCwwICsxLDggQEAKK2h1c2g6IHN5bnRheCBlcnJvcjogdW50ZXJtaW5hdGVkICR7bmFtZX0KK2h1c2g6IHN5bnRheCBlcnJvcjogdW50ZXJtaW5hdGVkICR7bmFtZX0KK18wIF8wCitfIF8gXyBfd29yZCBfd29yZAorX2FhYWEgX2FhYWEgX2FhYWEgX2FhYWEgX2FhYWEKK18gXyBfIF93b3JkIF93b3JkCitfIF8gXyBfIF93b3JkCitfZmZmIF9mZmYgX2ZmZiBfZmZmIF9mZmYKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2RlZmF1bHQudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9kZWZhdWx0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFlYTA1MTcKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9kZWZhdWx0LnRlc3RzCkBAIC0wLDAgKzEsMjIgQEAKKyMgZmlyc3QgdHJ5IHNvbWUgaW52YWxpZCBwYXR0ZXJucyAoZG8gaW4gc3Vic2hlbGwgZHVlIHRvIHBhcnNpbmcgZXJyb3IpCisiJFRISVNfU0giIC1jICdlY2hvICR7LX0nCisiJFRISVNfU0giIC1jICdlY2hvICR7Oi19JworCisjIG5vdyBzb21lIGZ1bmt5IG9uZXMKK2VjaG8gXyR7Iy19IF8keyM6LX0KKworIyBub3cgc29tZSB2YWxpZCBvbmVzCitzZXQgLS0KK2VjaG8gXyQxIF8kezEtfSBfJHsxOi19IF8kezEtd29yZH0gXyR7MTotd29yZH0KKworc2V0IC0tIGFhYWEKK2VjaG8gXyQxIF8kezEtfSBfJHsxOi19IF8kezEtd29yZH0gXyR7MTotd29yZH0KKwordW5zZXQgZgorZWNobyBfJGYgXyR7Zi19IF8ke2Y6LX0gXyR7Zi13b3JkfSBfJHtmOi13b3JkfQorCitmPQorZWNobyBfJGYgXyR7Zi19IF8ke2Y6LX0gXyR7Zi13b3JkfSBfJHtmOi13b3JkfQorCitmPWZmZgorZWNobyBfJGYgXyR7Zi19IF8ke2Y6LX0gXyR7Zi13b3JkfSBfJHtmOi13b3JkfQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfaW5kaWNhdGVfZXJyb3IucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9pbmRpY2F0ZV9lcnJvci5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmZjYzUxCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfaW5kaWNhdGVfZXJyb3IucmlnaHQKQEAgLTAsMCArMSw0MyBAQAoraHVzaDogc3ludGF4IGVycm9yOiB1bnRlcm1pbmF0ZWQgJHtuYW1lfQorMAorMAorPT09PQorXworaHVzaDogMTogcGFyYW1ldGVyIG51bGwgb3Igbm90IHNldAoraHVzaDogMTogcGFyYW1ldGVyIG51bGwgb3Igbm90IHNldAoraHVzaDogMTogbWVzc2FnZTEKK2h1c2g6IDE6IG1lc3NhZ2UxCitodXNoOiAxOiB1bnNldCEKK2h1c2g6IDE6IG51bGwgb3IgdW5zZXQhCis9PT09CitfYWFhYQorX2FhYWEKK19hYWFhCitfYWFhYQorX2FhYWEKK19hYWFhCitfYWFhYQorPT09PQorXworaHVzaDogZjogcGFyYW1ldGVyIG51bGwgb3Igbm90IHNldAoraHVzaDogZjogcGFyYW1ldGVyIG51bGwgb3Igbm90IHNldAoraHVzaDogZjogbWVzc2FnZTMKK2h1c2g6IGY6IG1lc3NhZ2UzCitodXNoOiBmOiB1bnNldCEKK2h1c2g6IGY6IG51bGwgb3IgdW5zZXQhCis9PT09CitfCitfCitodXNoOiBmOiBwYXJhbWV0ZXIgbnVsbCBvciBub3Qgc2V0CitfCitodXNoOiBmOiBtZXNzYWdlNAorXworaHVzaDogZjogbnVsbCBvciB1bnNldCEKKz09PT0KK19mZmYKK19mZmYKK19mZmYKK19mZmYKK19mZmYKK19mZmYKK19mZmYKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2luZGljYXRlX2Vycm9yLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfaW5kaWNhdGVfZXJyb3IudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmUxNGIxZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2luZGljYXRlX2Vycm9yLnRlc3RzCkBAIC0wLDAgKzEsNjAgQEAKKyMgZG8gYWxsIG9mIHRoZXNlIGluIHN1YnNoZWxscyBzaW5jZSBpdCdzIHN1cHBvc2VkIHRvIGVycm9yIG91dAorCisjIGZpcnN0IHRyeSBzb21lIGludmFsaWQgcGF0dGVybnMKKyMiJFRISVNfU0giIC1jICdlY2hvICR7P30nIC0tIHRoaXMgaXMgdmFsaWQgYXMgaXQncyB0aGUgc2FtZSBhcyAkPworIiRUSElTX1NIIiAtYyAnZWNobyAkezo/fScKKworIyB0aGVuIHNvbWUgZnVua3kgb25lcworIyBub3RlOiBiYXNoIHByaW50cyAxIC0gdHJlYXRzIGl0IGFzICJsZW5ndGggb2YgJCMiPyBXZSBwcmludCAwCisiJFRISVNfU0giIC1jICdlY2hvICR7Iz99JworIyBiYXNoIHByaW50cyAwCisiJFRISVNfU0giIC1jICdlY2hvICR7Izo/fScKKworIyBub3cgc29tZSB2YWxpZCBvbmVzCitleHBvcnQgbXNnX3Vuc2V0PSJ1bnNldCEiCitleHBvcnQgbXNnX251bGxfb3JfdW5zZXQ9Im51bGwgb3IgdW5zZXQhIgorCitlY2hvID09PT0KKyIkVEhJU19TSCIgLWMgJ3NldCAtLTsgZWNobyBfJDEnCisiJFRISVNfU0giIC1jICdzZXQgLS07IGVjaG8gXyR7MT99JworIiRUSElTX1NIIiAtYyAnc2V0IC0tOyBlY2hvIF8kezE6P30nCisiJFRISVNfU0giIC1jICdzZXQgLS07IGVjaG8gXyR7MT9tZXNzYWdlMX0nCisiJFRISVNfU0giIC1jICdzZXQgLS07IGVjaG8gXyR7MTo/bWVzc2FnZTF9JworIiRUSElTX1NIIiAtYyAnc2V0IC0tOyBlY2hvIF8kezE/JG1zZ191bnNldH0nCisiJFRISVNfU0giIC1jICdzZXQgLS07IGVjaG8gXyR7MTo/JG1zZ19udWxsX29yX3Vuc2V0fScKKworZWNobyA9PT09CisiJFRISVNfU0giIC1jICdzZXQgLS0gYWFhYTsgZWNobyBfJDEnCisiJFRISVNfU0giIC1jICdzZXQgLS0gYWFhYTsgZWNobyBfJHsxP30nCisiJFRISVNfU0giIC1jICdzZXQgLS0gYWFhYTsgZWNobyBfJHsxOj99JworIiRUSElTX1NIIiAtYyAnc2V0IC0tIGFhYWE7IGVjaG8gXyR7MT93b3JkfScKKyIkVEhJU19TSCIgLWMgJ3NldCAtLSBhYWFhOyBlY2hvIF8kezE6P3dvcmR9JworIiRUSElTX1NIIiAtYyAnc2V0IC0tIGFhYWE7IGVjaG8gXyR7MT8kbXNnX3Vuc2V0fScKKyIkVEhJU19TSCIgLWMgJ3NldCAtLSBhYWFhOyBlY2hvIF8kezE6PyRtc2dfbnVsbF9vcl91bnNldH0nCisKK2VjaG8gPT09PQorIiRUSElTX1NIIiAtYyAndW5zZXQgZjsgZWNobyBfJGYnCisiJFRISVNfU0giIC1jICd1bnNldCBmOyBlY2hvIF8ke2Y/fScKKyIkVEhJU19TSCIgLWMgJ3Vuc2V0IGY7IGVjaG8gXyR7Zjo/fScKKyIkVEhJU19TSCIgLWMgJ3Vuc2V0IGY7IGVjaG8gXyR7Zj9tZXNzYWdlM30nCisiJFRISVNfU0giIC1jICd1bnNldCBmOyBlY2hvIF8ke2Y6P21lc3NhZ2UzfScKKyIkVEhJU19TSCIgLWMgJ3Vuc2V0IGY7IGVjaG8gXyR7Zj8kbXNnX3Vuc2V0fScKKyIkVEhJU19TSCIgLWMgJ3Vuc2V0IGY7IGVjaG8gXyR7Zjo/JG1zZ19udWxsX29yX3Vuc2V0fScKKworZWNobyA9PT09CisiJFRISVNfU0giIC1jICdmPTsgZWNobyBfJGYnCisiJFRISVNfU0giIC1jICdmPTsgZWNobyBfJHtmP30nCisiJFRISVNfU0giIC1jICdmPTsgZWNobyBfJHtmOj99JworIiRUSElTX1NIIiAtYyAnZj07IGVjaG8gXyR7Zj93b3JkfScKKyIkVEhJU19TSCIgLWMgJ2Y9OyBlY2hvIF8ke2Y6P21lc3NhZ2U0fScKKyIkVEhJU19TSCIgLWMgJ2Y9OyBlY2hvIF8ke2Y/JG1zZ191bnNldH0nCisiJFRISVNfU0giIC1jICdmPTsgZWNobyBfJHtmOj8kbXNnX251bGxfb3JfdW5zZXR9JworCitlY2hvID09PT0KKyIkVEhJU19TSCIgLWMgJ2Y9ZmZmOyBlY2hvIF8kZicKKyIkVEhJU19TSCIgLWMgJ2Y9ZmZmOyBlY2hvIF8ke2Y/fScKKyIkVEhJU19TSCIgLWMgJ2Y9ZmZmOyBlY2hvIF8ke2Y6P30nCisiJFRISVNfU0giIC1jICdmPWZmZjsgZWNobyBfJHtmP3dvcmR9JworIiRUSElTX1NIIiAtYyAnZj1mZmY7IGVjaG8gXyR7Zjo/d29yZH0nCisiJFRISVNfU0giIC1jICdmPWZmZjsgZWNobyBfJHtmPyRtc2dfdW5zZXR9JworIiRUSElTX1NIIiAtYyAnZj1mZmY7IGVjaG8gXyR7Zjo/JG1zZ19udWxsX29yX3Vuc2V0fScKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2xlbi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2xlbi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmU4Y2I1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9leHBhbmRfbGVuLnJpZ2h0CkBAIC0wLDAgKzEsOSBAQAorMAorMAorMQorTWFrZSBzdXJlIGxlbiBwYXJzaW5nIGRvZXNudCBicmVhayBhcmcgY291bnQKKzAgMAorNCA0CitUZXN0aW5nIGxlbiBvcAorNCAzIDIgMSAwIDAKKzAgMyAwCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9sZW4udGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2V4cGFuZF9sZW4udGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZmUyMGE0NQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZXhwYW5kX2xlbi50ZXN0cwpAQCAtMCwwICsxLDE3IEBACisiJFRISVNfU0giIC1jICdlY2hvICQjJworIiRUSElTX1NIIiAtYyAnZWNobyAkIycgYXJnMAorIiRUSElTX1NIIiAtYyAnZWNobyAkIycgYXJnMCBhcmcxCisKK2VjaG8gTWFrZSBzdXJlIGxlbiBwYXJzaW5nIGRvZXNudCBicmVhayBhcmcgY291bnQKK3NldCAtLQorZWNobyAkIyAkeyN9CitzZXQgLS0gYWFhYSBiYmIgY2MgZAorZWNobyAkIyAkeyN9CisKK2VjaG8gVGVzdGluZyBsZW4gb3AKK2VjaG8gJHsjMX0gJHsjMn0gJHsjM30gJHsjNH0gJHsjNX0gJHsjNn0KKwordW5zZXQgZQorZj1hYmMKK2c9CitlY2hvICR7I2V9ICR7I2Z9ICR7I2d9CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2dsb2IucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX2dsb2IucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRlZThmZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZ2xvYi5yaWdodApAQCAtMCwwICsxLDQgQEAKK3BhcmFtX2dsb2IudGVzdHMKK3BhcmFtX2dsb2IudGVzdHMKK3BhcmFtX2dsb2IudCoKK3BhcmFtX2dsb2IudCoKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZ2xvYi50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fZ2xvYi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZDc0ZmVlCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9nbG9iLnRlc3RzCkBAIC0wLDAgKzEsOSBAQAoraWYgdGVzdCAkIyA9IDA7IHRoZW4KKyAgICBleGVjICIkVEhJU19TSCIgIiQwIiAncGFyYW1fZ2xvYi50KicKKyAgICBlY2hvIE5PVCBTSE9XTgorICAgIGV4aXQKK2ZpCitlY2hvICQqCitlY2hvICRACitlY2hvICIkKiIKK2VjaG8gIiRAIgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9wYXJhbV9zdWJzaGVsbC5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fc3Vic2hlbGwucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNjMzc2NwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fc3Vic2hlbGwucmlnaHQKQEAgLTAsMCArMSw3IEBACisxPTEKKzI9MgorMz0zCis0PTQKKzU9NQorNj02Cis3PTcKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvcGFyYW1fc3Vic2hlbGwudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX3N1YnNoZWxsLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI3ZmRjNWIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3BhcmFtX3N1YnNoZWxsLnRlc3RzCkBAIC0wLDAgKzEsMTUgQEAKK2lmIHRlc3QgJCMgPSAwOyB0aGVuCisgICAgIiRUSElTX1NIIiAiJDAiIDEgMiAzIDQgNSA2IDcgOCA5CisgICAgZXhpdAorZmkKK2VjaG8gMT0kMQoreyBlY2hvIDI9JDI7IH0KK3sgZWNobyAzPSQzOyB9ICYKKyMgY2FudCB1c2UgdXNsZWVwIGFzIGl0IGlzbnQgc3RhbmRhcmQgaW4gJFBBVEggLS0KKyMgd2UgZmFpbCB3aGVuIHRlc3RpbmcgYnVzeWJveCBjb21waWxlZCBzb2xlbHkgYXMgImh1c2giCit3YWl0CisoIGVjaG8gND0kNCApCisoIGVjaG8gNT0kNSApICYKK3dhaXQKK3RydWUgfCBlY2hvIDY9JDYgfCBjYXQKK3RydWUgfCB7IGVjaG8gNz0kNzsgfSB8IGNhdApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9zdGFyLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy9zdGFyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlY2M1NWIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3N0YXIucmlnaHQKQEAgLTAsMCArMSw2IEBACisuMS4KKy5hYmMuCisuZC4KKy5lLgorLmYuCisuMSBhYmMgZCBlIGYuCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3N0YXIudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3N0YXIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTU1NGM0MAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvc3Rhci50ZXN0cwpAQCAtMCwwICsxLDggQEAKK2lmIHRlc3QgJCMgPSAwOyB0aGVuCisgICAgZXhlYyAiJFRISVNfU0giIHN0YXIudGVzdHMgMSBhYmMgJ2QgZSBmJworZmkKKyMgJ2QgZSBmJyBzaG91bGQgYmUgc3BsaXQgaW50byAzIHNlcGFyYXRlIGFyZ3M6Citmb3IgYSBpbiAkKjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworIyBtdXN0IHByb2R1Y2UgLjEgYWJjIGQgZSBmLgorZm9yIGEgaW4gIiQqIjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdW5zZXQucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Vuc2V0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYmU3NmEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Vuc2V0LnJpZ2h0CkBAIC0wLDAgKzEsMTggQEAKKzAKK3Vuc2V0OiBpbnZhbGlkIG9wdGlvbiAtLSBtCisxCiswCitfX18KKzAgZiBnCiswIGcKKzAKK19fXworMCBmIGcKKzAKKzAgZiBnCiswCitfX18KK2h1c2g6IEhVU0hfVkVSU0lPTjogcmVhZG9ubHkgdmFyaWFibGUKKzEgZiBnCitodXNoOiBIVVNIX1ZFUlNJT046IHJlYWRvbmx5IHZhcmlhYmxlCisxCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Vuc2V0LnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy91bnNldC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNTljZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy91bnNldC50ZXN0cwpAQCAtMCwwICsxLDM2IEBACisjIGNoZWNrIGludmFsaWQgb3B0aW9ucyBhcmUgcmVqZWN0ZWQKK3Vuc2V0IC0KK2VjaG8gJD8KK3Vuc2V0IC1tIGEgYiBjCitlY2hvICQ/CisKKyMgY2hlY2sgZnVua3kgdXNhZ2UKK3Vuc2V0CitlY2hvICQ/CisKKyMgY2hlY2sgbm9ybWFsIHVzYWdlCitlY2hvIF9fXworZj1mIGc9ZworZWNobyAkPyAkZiAkZwordW5zZXQgZgorZWNobyAkPyAkZiAkZwordW5zZXQgZworZWNobyAkPyAkZiAkZworCitlY2hvIF9fXworZj1mIGc9ZworZWNobyAkPyAkZiAkZwordW5zZXQgZiBnCitlY2hvICQ/ICRmICRnCitmPWYgZz1nCitlY2hvICQ/ICRmICRnCit1bnNldCAtdiBmIGcKK2VjaG8gJD8gJGYgJGcKKworIyBjaGVjayByZWFkIG9ubHkgdmFycworZWNobyBfX18KK2Y9ZiBnPWcKK3Vuc2V0IEhVU0hfVkVSU0lPTgorZWNobyAkPyAkZiAkZwordW5zZXQgZiBIVVNIX1ZFUlNJT04gZworZWNobyAkPyAkZiAkZwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXItZG8tbm90LWNvbGxhcHNlLWFyaXRobWV0aWMtZXhwYW5zaW9uLWF0LXBhcnNlLXRpbWUucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhci1kby1ub3QtY29sbGFwc2UtYXJpdGhtZXRpYy1leHBhbnNpb24tYXQtcGFyc2UtdGltZS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWExNTg1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXItZG8tbm90LWNvbGxhcHNlLWFyaXRobWV0aWMtZXhwYW5zaW9uLWF0LXBhcnNlLXRpbWUucmlnaHQKQEAgLTAsMCArMSwyIEBACisxMgorOQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXItZG8tbm90LWNvbGxhcHNlLWFyaXRobWV0aWMtZXhwYW5zaW9uLWF0LXBhcnNlLXRpbWUudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhci1kby1ub3QtY29sbGFwc2UtYXJpdGhtZXRpYy1leHBhbnNpb24tYXQtcGFyc2UtdGltZS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lOTdhMDhhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXItZG8tbm90LWNvbGxhcHNlLWFyaXRobWV0aWMtZXhwYW5zaW9uLWF0LXBhcnNlLXRpbWUudGVzdHMKQEAgLTAsMCArMSwzIEBACit1bnNldCBhCitlY2hvICQoKDMgKyAke2E6PSQoKDQgKyA1KSl9KSkKK2VjaG8gJGEKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyLWRvLW5vdC1leHBhbmQtdGlsZGUtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi1pbi1xdW90ZXMucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhci1kby1ub3QtZXhwYW5kLXRpbGRlLWluLXBhcmFtZXRlci1leHBhbnNpb24taW4tcXVvdGVzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOWI0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhci1kby1ub3QtZXhwYW5kLXRpbGRlLWluLXBhcmFtZXRlci1leHBhbnNpb24taW4tcXVvdGVzLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK35yb290CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhci1kby1ub3QtZXhwYW5kLXRpbGRlLWluLXBhcmFtZXRlci1leHBhbnNpb24taW4tcXVvdGVzLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXItZG8tbm90LWV4cGFuZC10aWxkZS1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLWluLXF1b3Rlcy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kOGViOGZjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXItZG8tbm90LWV4cGFuZC10aWxkZS1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLWluLXF1b3Rlcy50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK3Vuc2V0IGEKK2VjaG8gIiR7YTotfnJvb3R9IgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXItZG8tbm90LXF1b3RlLWJhY2tzbGFzaGVzLWluLXBhcmFtZXRlci1leHBhbnNpb25zLW91dHNpZGUtcXVvdGVzLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXItZG8tbm90LXF1b3RlLWJhY2tzbGFzaGVzLWluLXBhcmFtZXRlci1leHBhbnNpb25zLW91dHNpZGUtcXVvdGVzLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMGViZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhci1kby1ub3QtcXVvdGUtYmFja3NsYXNoZXMtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbnMtb3V0c2lkZS1xdW90ZXMucmlnaHQKQEAgLTAsMCArMSBAQAorL2IvYy8KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyLWRvLW5vdC1xdW90ZS1iYWNrc2xhc2hlcy1pbi1wYXJhbWV0ZXItZXhwYW5zaW9ucy1vdXRzaWRlLXF1b3Rlcy50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyLWRvLW5vdC1xdW90ZS1iYWNrc2xhc2hlcy1pbi1wYXJhbWV0ZXItZXhwYW5zaW9ucy1vdXRzaWRlLXF1b3Rlcy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mYjkzNzE0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXItZG8tbm90LXF1b3RlLWJhY2tzbGFzaGVzLWluLXBhcmFtZXRlci1leHBhbnNpb25zLW91dHNpZGUtcXVvdGVzLnRlc3RzCkBAIC0wLDAgKzEsMyBAQAorYT0vYi9jLyoKK2I9XFwKK2VjaG8gJHthJSRiKn0KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi0xLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXItcGF0dGVybi1yZXBsYWNlbWVudC1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLTEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRhMzI3MgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi0xLnJpZ2h0CkBAIC0wLDAgKzEgQEAKK2FfXF96X2MKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi0xLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXItcGF0dGVybi1yZXBsYWNlbWVudC1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLTEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTQ1MjljNgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi0xLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAordj0iYVxiYyIKK2VjaG8gJHt2L1xcYi9fXFxfXHpffQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXItcGF0dGVybi1yZXBsYWNlbWVudC1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLTIucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhci1wYXR0ZXJuLXJlcGxhY2VtZW50LWluLXBhcmFtZXRlci1leHBhbnNpb24tMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDQ3YzBhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXItcGF0dGVybi1yZXBsYWNlbWVudC1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLTIucmlnaHQKQEAgLTAsMCArMSBAQAorYXgveWMKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi0yLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXItcGF0dGVybi1yZXBsYWNlbWVudC1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLTIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMmRiMWRiOAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi0yLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAordj0iYWJjIgorZWNobyAke3YvYi94L3l9CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhci1wYXR0ZXJuLXJlcGxhY2VtZW50LWluLXBhcmFtZXRlci1leHBhbnNpb24tMy5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi0zLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYTVmZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhci1wYXR0ZXJuLXJlcGxhY2VtZW50LWluLXBhcmFtZXRlci1leHBhbnNpb24tMy5yaWdodApAQCAtMCwwICsxIEBACitheGNhYmMKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi0zLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXItcGF0dGVybi1yZXBsYWNlbWVudC1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLTMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDkzNWU0NQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi0zLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAordj0iYWJjYWJjIgorZWNobyAke3YvYi94fQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXItcGF0dGVybi1yZXBsYWNlbWVudC1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLTQucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhci1wYXR0ZXJuLXJlcGxhY2VtZW50LWluLXBhcmFtZXRlci1leHBhbnNpb24tNC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmRkNzUwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXItcGF0dGVybi1yZXBsYWNlbWVudC1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLTQucmlnaHQKQEAgLTAsMCArMSBAQAorYXhjYXhjCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhci1wYXR0ZXJuLXJlcGxhY2VtZW50LWluLXBhcmFtZXRlci1leHBhbnNpb24tNC50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi00LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ4ZGU4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhci1wYXR0ZXJuLXJlcGxhY2VtZW50LWluLXBhcmFtZXRlci1leHBhbnNpb24tNC50ZXN0cwpAQCAtMCwwICsxLDIgQEAKK3Y9ImFiY2FiYyIKK2VjaG8gJHt2Ly9iL3h9CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhci1wYXR0ZXJuLXJlcGxhY2VtZW50LWluLXBhcmFtZXRlci1leHBhbnNpb24tNS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi01LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OWIyN2IKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhci1wYXR0ZXJuLXJlcGxhY2VtZW50LWluLXBhcmFtZXRlci1leHBhbnNpb24tNS5yaWdodApAQCAtMCwwICsxIEBACitheGMKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi01LnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXItcGF0dGVybi1yZXBsYWNlbWVudC1pbi1wYXJhbWV0ZXItZXhwYW5zaW9uLTUudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTUyMzg4OAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyLXBhdHRlcm4tcmVwbGFjZW1lbnQtaW4tcGFyYW1ldGVyLWV4cGFuc2lvbi01LnRlc3RzCkBAIC0wLDAgKzEsMiBAQAordj0iYWIvYyIKK2VjaG8gJHt2L2JcLy94fQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXItcnVudGltZS1xdW90ZS1kZXRlY3Rpb24ucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhci1ydW50aW1lLXF1b3RlLWRldGVjdGlvbi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTU0ZDllCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXItcnVudGltZS1xdW90ZS1kZXRlY3Rpb24ucmlnaHQKQEAgLTAsMCArMSBAQAorPD4KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyLXJ1bnRpbWUtcXVvdGUtZGV0ZWN0aW9uLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXItcnVudGltZS1xdW90ZS1kZXRlY3Rpb24udGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZTU3MDYzMQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyLXJ1bnRpbWUtcXVvdGUtZGV0ZWN0aW9uLnRlc3RzCkBAIC0wLDAgKzEgQEAKK2Zvbz1cXCBlY2hvICI8JHtmb28jW1xcXX0+IgpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXIxLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXIxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NGU3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3ZhcjEucmlnaHQKQEAgLTAsMCArMSw0IEBACitodHRwOi8vYnVzeWJveC5uZXQKK2h0dHA6Ly9idXN5Ym94Lm5ldF9hYmMKKzEgMQorMSAxCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3ZhcjEudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3ZhcjEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDhhNjc4MgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyMS50ZXN0cwpAQCAtMCwwICsxLDkgQEAKK1VSTD1odHRwOi8vYnVzeWJveC5uZXQKKworZWNobyAkVVJMCitlY2hvICR7VVJMfV9hYmMKKwordHJ1ZQorZmFsc2U7IGVjaG8gJD8gJHs/fQordHJ1ZQoreyBmYWxzZTsgZWNobyAkPyAkez99OyB9CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3ZhcjIucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3ZhcjIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBiZjRiZgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyMi5yaWdodApAQCAtMCwwICsxLDIgQEAKK2h0dHA6Ly9idXN5Ym94Lm5ldAoraHR0cDovL2J1c3lib3gubmV0X2FiYwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXIyLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXIyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjEyOTI0MTAKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3ZhcjIudGVzdHMKQEAgLTAsMCArMSw0IEBACitfMT1odHRwOi8vYnVzeWJveC5uZXQKKworZWNobyAkXzEKK2VjaG8gJHtfMX1fYWJjCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3ZhcjMucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3ZhcjMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBlNjdmZAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyMy5yaWdodApAQCAtMCwwICsxLDIgQEAKK2h1c2g6IGludmFsaWQgbnVtYmVyICcxcScKK2h1c2g6IHN5bnRheCBlcnJvcjogdW50ZXJtaW5hdGVkICR7bmFtZX0KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyMy50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyMy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZWEzNmQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXIzLnRlc3RzCkBAIC0wLDAgKzEsNCBAQAorIyByZWplY3QgaW52YWxpZCB2YXJzCisiJFRISVNfU0giIC1jICdlY2hvICR7MXF9JworIiRUSElTX1NIIiAtYyAnZWNobyAkeyZ9JworIyIkVEhJU19TSCIgLWMgJ2VjaG8gJHskfScgLS0gdGhpcyBpcyB2YWxpZCBhcyBpdCdzIHRoZSBzYW1lIGFzICQkCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoMS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2gxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwYTA3NjkKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoMS5yaWdodApAQCAtMCwwICsxLDE0IEBACisKKworZgorYmNkZWYKK2FiY2RlZgorYWJjZGVmCitiY2RlCithYmNkCithYmNkCithYmNkZWYKK2JjZGVmCithYmNkZWYKK2FiY2RlZgorYWJjZGVmCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoMS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2gxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI0ZDNjOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoMS50ZXN0cwpAQCAtMCwwICsxLDE4IEBACit2YXI9YWJjZGVmCisKK2VjaG8gJHt2YXI6N30KK2VjaG8gJHt2YXI6Nn0KK2VjaG8gJHt2YXI6NX0KK2VjaG8gJHt2YXI6MX0KK2VjaG8gJHt2YXI6MH0KK2VjaG8gJHt2YXI6LTF9CisKK2VjaG8gJHt2YXI6MTo0fQorZWNobyAke3ZhcjowOjR9CitlY2hvICR7dmFyOjo0fQorZWNobyAke3ZhcjotMTo0fQorCitlY2hvICR7dmFyOjE6N30KK2VjaG8gJHt2YXI6MDo3fQorZWNobyAke3Zhcjo6N30KK2VjaG8gJHt2YXI6LTE6N30KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2gyLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNiYTVjNgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2gyLnJpZ2h0CkBAIC0wLDAgKzEsMTAgQEAKK2FiYzEyM3hjYmExMjMKK2FieDEyM2RjYmExMjMKK2FieDEyM2R4YmExMjMKK2FiY3gyM2RjYmExMjMKK2FiY3h4eGRjYmF4eHgKK2FieAoreGJhMTIzCithYngyMworYWJjMjNkY2JhMTIzCithYmNkY2JhCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoMi50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2gyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI5YzUyNmMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoMi50ZXN0cwpAQCAtMCwwICsxLDI0IEBACit2YXI9YWJjMTIzZGNiYTEyMworCitlY2hvICR7dmFyL2QveH0KK2VjaG8gJHt2YXIvYy94fQorZWNobyAke3Zhci8vYy94fQorZWNobyAke3Zhci9bMTIzXS94fQorZWNobyAke3Zhci8vWzEyM10veH0KK2VjaG8gJHt2YXIvYyoveH0KK2VjaG8gJHt2YXIvKmMveH0KKworIyBtdXN0IG1hdGNoIGxvbmdlc3QgbWF0Y2g6IHJlc3VsdCBpcyAiYWJ4MjMiCitlY2hvICR7dmFyL2MqMS94fQorCisjIGVtcHR5IHJlcGxhY2VtZW50IC0gMm5kIHNsYXNoIGNhbiBiZSBvbWl0dGVkCitlY2hvICR7dmFyL1sxMjNdfQorZWNobyAke3Zhci8vWzEyM119CisKKyMjIyBhc2ggZG9lc24ndCBzdXBwb3J0CisjIyMgIyBtYXRjaCBvbmx5IGF0IHRoZSBiZWdpbm5pbmc6CisjIyMgZWNobyAke3Zhci8jYS94fQorIyMjIGVjaG8gJHt2YXIvI2IveH0gIyBzaG91bGQgbm90IG1hdGNoCisjIyMgZWNobyAke3Zhci8vI2IveH0gIyBzaG91bGQgbm90IG1hdGNoCisjIyMgIyBtYXRjaCBvbmx5IGF0IHRoZSBlbmQ6CisjIyMgZWNobyAke3Zhci8lMy94fQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDMucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoMy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTdjODUwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDMucmlnaHQKQEAgLTAsMCArMSwyMCBAQAorMSBhMDQxI2MKKzIgYTA0MSNjCiszIGFcMDQxI2MKKzQgYVwwNDEjYworNSBhXDA0MSNjCis2IGFcMDQxI2MKKzcgYVwwNDEjYworOCBhXDA0MSNjCis5IGFcMDQxI2MKKzEwIGFcYworMTEgYVxjCisxMiBhXGMKKzEzIGFcXGMKKzE0IGFcXGMKKzE1IGFcXGMKKzE2IGFcdGMKKzE3IGFcdGMKKzE4IGFcdGMKKzE5IGF0YworMjAgYVx0YwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDMudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoMy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNDZkYmI2Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDMudGVzdHMKQEAgLTAsMCArMSw0MSBAQAorYT0nYWJjJworcj0ke2EvL2IvXDA0MSN9CitlY2hvIDEgJHIKK2VjaG8gMiAke2EvL2IvXDA0MSN9CitlY2hvIDMgIiR7YS8vYi9cMDQxI30iCisKK2E9J2FiYycKK3I9JHthLy9iL1xcMDQxI30KK2VjaG8gNCAkcgorZWNobyA1ICR7YS8vYi9cXDA0MSN9CitlY2hvIDYgIiR7YS8vYi9cXDA0MSN9IgorCithPSdhYmMnCitiPSdcMDQxIycKK3I9JHthLy9iLyRifQorZWNobyA3ICRyCitlY2hvIDggJHthLy9iLyRifQorZWNobyA5ICIke2EvL2IvJGJ9IgorCithPSdhYmMnCitiPSdcJworcj0iJHthLy9iLyRifSIKK2VjaG8gMTAgJHIKK2VjaG8gMTEgJHthLy9iLyRifQorZWNobyAxMiAiJHthLy9iLyRifSIKKworYT0nYWJjJworYj0nXFwnCityPSIke2EvL2IvJGJ9IgorZWNobyAxMyAkcgorZWNobyAxNCAke2EvL2IvJGJ9CitlY2hvIDE1ICIke2EvL2IvJGJ9IgorCithPSdhYmMnCitiPSdcdCcKK3I9IiR7YS8vYi8kYn0iCitlY2hvIDE2ICRyCitlY2hvIDE3ICR7YS8vYi8kYn0KK2VjaG8gMTggIiR7YS8vYi8kYn0iCitlY2hvIDE5ICR7YS8vYi9cdH0KK2VjaG8gMjAgIiR7YS8vYi9cdH0iCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoNC5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2g0LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZjFiZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoNC5yaWdodApAQCAtMCwwICsxLDQwIEBACitTb3VyY2U6ICAgICAgICBhKmJcKmMKK1JlcGxhY2Ugc3RyOiAgIF9cXF9cel8KK1BhdHRlcm46ICAgICAgIHNpbmdsZSBiYWNrc2xhc2ggYW5kIHN0YXI6ICJyZXBsYWNlIGxpdGVyYWwgc3RhciIKK1VucXVvdGVkOiAgICAgIGFfXF96X2JcKmMKK1VucXVvdGVkID06ICAgIGFfXF96X2JcKmMKK1F1b3RlZDogICAgICAgIGFfXF9cel9iXCpjCitRdW90ZWQgPTogICAgICBhX1xfXHpfYlwqYworUGF0dGVybjogICAgICAgZG91YmxlIGJhY2tzbGFzaCBhbmQgc3RhcjogInJlcGxhY2UgYmFja3NsYXNoIGFuZCBldmVyeXRoaW5nIGFmdGVyIGl0IgorVW5xdW90ZWQ6ICAgICAgYSpiX1xfel8KK1VucXVvdGVkID06ICAgIGEqYl9cX3pfCitRdW90ZWQ6ICAgICAgICBhKmJfXF9cel8KK1F1b3RlZCA9OiAgICAgIGEqYl9cX1x6XworCitTb3VyY2U6ICAgICAgICBhXGJjCitSZXBsYWNlIHN0cjogICBfXFxfXHpfCitQYXR0ZXJuOiAgICAgICBzaW5nbGUgYmFja3NsYXNoIGFuZCBiOiAicmVwbGFjZSBiIgorVW5xdW90ZWQ6ICAgICAgYVxfXF96X2MKK1VucXVvdGVkID06ICAgIGFcX1xfel9jCitRdW90ZWQ6ICAgICAgICBhXF9cX1x6X2MKK1F1b3RlZCA9OiAgICAgIGFcX1xfXHpfYworUGF0dGVybjogICAgICAgZG91YmxlIGJhY2tzbGFzaCBhbmQgYjogInJlcGxhY2UgYmFja3NsYXNoIGFuZCBiIgorVW5xdW90ZWQ6ICAgICAgYV9cX3pfYworVW5xdW90ZWQgPTogICAgYV9cX3pfYworUXVvdGVkOiAgICAgICAgYV9cX1x6X2MKK1F1b3RlZCA9OiAgICAgIGFfXF9cel9jCisKK1NvdXJjZTogICAgICAgIGFcYmMKK1JlcGxhY2Ugc3RyOiAgIF9cXF9cel8gKGFzIHZhcmlhYmxlICRzKQorUGF0dGVybjogICAgICAgc2luZ2xlIGJhY2tzbGFzaCBhbmQgYjogInJlcGxhY2UgYiIKK1VucXVvdGVkOiAgICAgIGFcX1xcX1x6X2MKK1VucXVvdGVkID06ICAgIGFcX1xcX1x6X2MKK1F1b3RlZDogICAgICAgIGFcX1xcX1x6X2MKK1F1b3RlZCA9OiAgICAgIGFcX1xcX1x6X2MKK1BhdHRlcm46ICAgICAgIGRvdWJsZSBiYWNrc2xhc2ggYW5kIGI6ICJyZXBsYWNlIGJhY2tzbGFzaCBhbmQgYiIKK1VucXVvdGVkOiAgICAgIGFfXFxfXHpfYworVW5xdW90ZWQgPTogICAgYV9cXF9cel9jCitRdW90ZWQ6ICAgICAgICBhX1xcX1x6X2MKK1F1b3RlZCA9OiAgICAgIGFfXFxfXHpfYworCitEb25lOiAwCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoNC50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2g0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMyYWEyYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoNC50ZXN0cwpAQCAtMCwwICsxLDgxIEBACisjIFRoaXMgdGVzdGNhc2UgZGVtb25zdHJhdGVzIHRoYXQgYmFja3NsYXNoZXMgYXJlIHRyZWF0ZWQgZGlmZmVyZW50bHkKKyMgaW4gMXN0IGFuZCAybmQgcGFydHMgb2YgJHt2YXIvc2VhcmNoL3JlcGx9OgorIyBpZiBxdW90ZWQgKCIke3Zhci9zZWFyY2gvcmVwbH0iKSwgYW5kIHJlcGwgY29udGFpbnMgXGEgKGEgbm9uLXNwZWNpYWwgY2hhciksCisjIHRoZSBiYWNrc2xhc2ggaW4gcmVwbCBzdGF5czsgaWYgdW5xdW90ZWQsIGJhY2tzbGFzaCBpcyByZW1vdmVkLgorIyBCdXQgc2VhcmNoIHBhcnQgZG9lcyBub3QgYWN0IGxpa2UgdGhhdDogXGEgaXMgYWx3YXlzIGNvbnZlcnRlZCB0byBqdXN0IGEsCisjIGV2ZW4gaW4gcXVvdGVzLgorIworIyBiYXNoNCAoYW5kIHByb2JhYmx5IGJhc2gzIHRvbyk6ICJRdW90ZWQ6IiByZXN1bHRzIGFyZSBkaWZmZXJlbnQgZnJvbQorIyB1bnF1b3RlZCBleHBhbnNpb25zIC0gdGhleSBoYXZlIGEgYmFja3NsYXNoIGJlZm9yZSB6LgorIworIyBUaGUgZGlmZmVyZW5jZSBvbmx5IGV4aXN0cyBpZiByZXBsIGlzIGEgbGl0ZXJhbC4gSWYgaXQgaXMgYSB2YXJpYWJsZToKKyMgJHt2Ly4uLi8kc30sIHRoZW4gYWxsIGJhY2tzbGFzaGVzIGFyZSBwcmVzZXJ2ZWQgaW4gYm90aCBjYXNlcy4KKwordj0nYSpiXCpjJworZWNobyAnU291cmNlOiAgICAgICAnICIkdiIKK2VjaG8gJ1JlcGxhY2Ugc3RyOiAgJyAnX1xcX1x6XycKKworZWNobyAnUGF0dGVybjogICAgICAnICdzaW5nbGUgYmFja3NsYXNoIGFuZCBzdGFyOiAicmVwbGFjZSBsaXRlcmFsIHN0YXIiJworZWNobyAnVW5xdW90ZWQ6ICAgICAnICR7di9cKi9fXFxfXHpffQorcj0ke3YvXCovX1xcX1x6X30KK2VjaG8gJ1VucXVvdGVkID06ICAgJyAiJHIiCitlY2hvICdRdW90ZWQ6ICAgICAgICcgIiR7di9cKi9fXFxfXHpffSIKK3I9IiR7di9cKi9fXFxfXHpffSIKK2VjaG8gJ1F1b3RlZCA9OiAgICAgJyAiJHIiCisKK2VjaG8gJ1BhdHRlcm46ICAgICAgJyAnZG91YmxlIGJhY2tzbGFzaCBhbmQgc3RhcjogInJlcGxhY2UgYmFja3NsYXNoIGFuZCBldmVyeXRoaW5nIGFmdGVyIGl0IicKK2VjaG8gJ1VucXVvdGVkOiAgICAgJyAgJHt2L1xcKi9fXFxfXHpffQorcj0ke3YvXFwqL19cXF9cel99CitlY2hvICdVbnF1b3RlZCA9OiAgICcgIiRyIgorZWNobyAnUXVvdGVkOiAgICAgICAnICIke3YvXFwqL19cXF9cel99Igorcj0iJHt2L1xcKi9fXFxfXHpffSIKK2VjaG8gJ1F1b3RlZCA9OiAgICAgJyAiJHIiCisKK2VjaG8KKwordj0nYVxiYycKK2VjaG8gJ1NvdXJjZTogICAgICAgJyAiJHYiCitlY2hvICdSZXBsYWNlIHN0cjogICcgJ19cXF9cel8nCisKK2VjaG8gJ1BhdHRlcm46ICAgICAgJyAnc2luZ2xlIGJhY2tzbGFzaCBhbmQgYjogInJlcGxhY2UgYiInCitlY2hvICdVbnF1b3RlZDogICAgICcgICR7di9cYi9fXFxfXHpffQorcj0ke3YvXGIvX1xcX1x6X30KK2VjaG8gJ1VucXVvdGVkID06ICAgJyAiJHIiCitlY2hvICdRdW90ZWQ6ICAgICAgICcgIiR7di9cYi9fXFxfXHpffSIKK3I9IiR7di9cYi9fXFxfXHpffSIKK2VjaG8gJ1F1b3RlZCA9OiAgICAgJyAiJHIiCisKK2VjaG8gJ1BhdHRlcm46ICAgICAgJyAnZG91YmxlIGJhY2tzbGFzaCBhbmQgYjogInJlcGxhY2UgYmFja3NsYXNoIGFuZCBiIicKK2VjaG8gJ1VucXVvdGVkOiAgICAgJyAgJHt2L1xcYi9fXFxfXHpffQorcj0ke3YvXFxiL19cXF9cel99CitlY2hvICdVbnF1b3RlZCA9OiAgICcgIiRyIgorZWNobyAnUXVvdGVkOiAgICAgICAnICIke3YvXFxiL19cXF9cel99Igorcj0iJHt2L1xcYi9fXFxfXHpffSIKK2VjaG8gJ1F1b3RlZCA9OiAgICAgJyAiJHIiCisKK2VjaG8KKwordj0nYVxiYycKK3M9J19cXF9cel8nCitlY2hvICdTb3VyY2U6ICAgICAgICcgIiR2IgorZWNobyAnUmVwbGFjZSBzdHI6ICAnICIkcyIgJyhhcyB2YXJpYWJsZSAkcyknCisKK2VjaG8gJ1BhdHRlcm46ICAgICAgJyAnc2luZ2xlIGJhY2tzbGFzaCBhbmQgYjogInJlcGxhY2UgYiInCitlY2hvICdVbnF1b3RlZDogICAgICcgICR7di9cYi8kc30KK3I9JHt2L1xiLyRzfQorZWNobyAnVW5xdW90ZWQgPTogICAnICIkciIKK2VjaG8gJ1F1b3RlZDogICAgICAgJyAiJHt2L1xiLyRzfSIKK3I9IiR7di9cYi8kc30iCitlY2hvICdRdW90ZWQgPTogICAgICcgIiRyIgorCitlY2hvICdQYXR0ZXJuOiAgICAgICcgJ2RvdWJsZSBiYWNrc2xhc2ggYW5kIGI6ICJyZXBsYWNlIGJhY2tzbGFzaCBhbmQgYiInCitlY2hvICdVbnF1b3RlZDogICAgICcgICR7di9cXGIvJHN9CityPSR7di9cXGIvJHN9CitlY2hvICdVbnF1b3RlZCA9OiAgICcgIiRyIgorZWNobyAnUXVvdGVkOiAgICAgICAnICIke3YvXFxiLyRzfSIKK3I9IiR7di9cXGIvJHN9IgorZWNobyAnUXVvdGVkID06ICAgICAnICIkciIKKworZWNobworCitlY2hvIERvbmU6ICQ/CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoNS5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2g1LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5OTA5MDIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoNS5yaWdodApAQCAtMCwwICsxLDExIEBACisxIGEvCisyIGEvZAorMyBhL2UvZgorNCBhXAorNSBhXGQKKzYgYVxlXGYKKzcgYVxcCis4IGFcXGQKKzkgYVxcZVxcZgorYSBhYgorRG9uZTogMApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDUudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoNS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NzQ4YjRhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDUudGVzdHMKQEAgLTAsMCArMSwyOSBAQAorIyBUaGlzIHRlc3RjYXNlIGNoZWNrcyB3aGV0aGVyIHNsYXNoZXMgaW4gJHt2L2EvYn0gYXJlIHBhcnNlZCBiZWZvcmUKKyMgb3IgYWZ0ZXIgZXhwYW5zaW9ucworCit2PSdhL2IvYycKK3M9J2IvYycKK3I9J2UvZicKK2VjaG8gIjEgJHt2LyRzfSIKK2VjaG8gIjIgJHt2LyRzL2R9IgorZWNobyAiMyAke3YvJHMvJHJ9IgorCit2PSdhXGJcYycKK3M9J2JcXGMnCityPSdlXGYnCitlY2hvICI0ICR7di8kc30iCitlY2hvICI1ICR7di8kcy9kfSIKK2VjaG8gIjYgJHt2LyRzLyRyfSIKKwordj0nYVxcYlxcYycKK3M9J2JcXFxcYycKK3I9J2VcXGYnCitlY2hvICI3ICR7di8kc30iCitlY2hvICI4ICR7di8kcy9kfSIKK2VjaG8gIjkgJHt2LyRzLyRyfSIKKwordj0nYS0kYS1cdC1cXC1cIi1cYC1cLS1cei1cKi1cPy1iJworcz0nLSRhLVxcdC1cXFxcLVxcIi1cXGAtXFwtLVxcei1cXFwqLVxcXD8tJworZWNobyAiYSAke3YvJHN9IgorCitlY2hvIERvbmU6ICQ/CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoNi5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2Jhc2g2LnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZmMyM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoNi5yaWdodApAQCAtMCwwICsxLDUgQEAKK0V4cGVjdGVkIEFjdHVhbAorYSp6ICAgIDogYSp6CitceiAgICAgOiBcegorYTF6IGEyejogYTF6IGEyegoreiAgICAgIDogegpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDYudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9iYXNoNi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jZjJlNGYwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfYmFzaDYudGVzdHMKQEAgLTAsMCArMSw5IEBACisjIFRoaXMgdGVzdGNhc2UgY2hlY2tzIGdsb2JiaW5nIGNvcnJlY3RuZXNzIGluICR7di9hL2J9CisKKz5hMXo7ID5hMno7CisgICAgICAgICAgZWNobyAnRXhwZWN0ZWQnICdBY3R1YWwnCit2PSdhIGJ6JzsgZWNobyAnYSp6ICAgIDonICIke3YvYSp6L2Eqen0iCit2PSdhIGJ6JzsgZWNobyAnXHogICAgIDonICIke3YvYSp6L1x6fSIKK3Y9J2EgYnonOyBlY2hvICdhMXogYTJ6OicgJHt2L2Eqei9hKnp9Cit2PSdhIGJ6JzsgZWNobyAneiAgICAgIDonICR7di9hKnovXHp9CitybSBhMXogYTJ6CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9leHBhbmRfaW5fYXNzaWduLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfZXhwYW5kX2luX2Fzc2lnbi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTIyMTBkCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfZXhwYW5kX2luX2Fzc2lnbi5yaWdodApAQCAtMCwwICsxLDUgQEAKKy4gLgorLmFiYyBkIGUuCisuYWJjIGQgZS4KKy5hYmMgZCBlLgorLmFiYyBkIGUuCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9leHBhbmRfaW5fYXNzaWduLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfZXhwYW5kX2luX2Fzc2lnbi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xOGNkYzc0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfZXhwYW5kX2luX2Fzc2lnbi50ZXN0cwpAQCAtMCwwICsxLDE1IEBACitpZiB0ZXN0ICQjID0gMDsgdGhlbgorICAgIGV4ZWMgIiRUSElTX1NIIiAiJDAiIGFiYyAiZCBlIgorZmkKKworc3BhY2U9JyAnCitlY2hvIC4kc3BhY2UuCisKK2E9JCoKK2VjaG8gLiRhLgorYT0kQAorZWNobyAuJGEuCithPSIkKiIKK2VjaG8gLiRhLgorYT0iJEAiCitlY2hvIC4kYS4KZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2V4cGFuZF9pbl9yZWRpci5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2V4cGFuZF9pbl9yZWRpci5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjMyOTljCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfZXhwYW5kX2luX3JlZGlyLnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorVEVTVDEKK1RFU1QyCitURVNUMwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfZXhwYW5kX2luX3JlZGlyLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfZXhwYW5kX2luX3JlZGlyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJkYTZiZGQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9leHBhbmRfaW5fcmVkaXIudGVzdHMKQEAgLTAsMCArMSwxMyBAQAoraWYgdGVzdCAkIyA9IDA7IHRoZW4KKyAgICBleGVjICIkVEhJU19TSCIgIiQwIiBhYmMgImQgZSIKK2ZpCisKK2VjaG8gVEVTVDEgPiIkMS5vdXQiCitlY2hvIFRFU1QyID4iJDIub3V0IgorIyBiYXNoIHNheXM6ICIkQC5vdXQiOiBhbWJpZ3VvdXMgcmVkaXJlY3QKKyMgYXNoIGhhbmRsZXMgaXQgYXMgaWYgaXQgaXMgJyQqJyAtIHdlIGRvIHRoZSBzYW1lCitlY2hvIFRFU1QzID4iJEAub3V0IgorCitjYXQgYWJjLm91dCAiZCBlLm91dCIgImFiYyBkIGUub3V0IgorCitybSBhYmMub3V0ICJkIGUub3V0IiAiYWJjIGQgZS5vdXQiCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9leHBhbmRfb25faWZzLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfZXhwYW5kX29uX2lmcy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWQyMDY5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfZXhwYW5kX29uX2lmcy5yaWdodApAQCAtMCwwICsxLDkgQEAKKzEgYSBiIGMKKzIgYSArIGIgYworMyBhIGIgYworNCBhICBiIGMKKzUgYSAgYiBjCis2IGEgYiArIGMKKzcgYSBiIGMKKzggYSBiICBjCis5IGEgYiAgYwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfZXhwYW5kX29uX2lmcy50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2V4cGFuZF9vbl9pZnMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTEyZmY4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2V4cGFuZF9vbl9pZnMudGVzdHMKQEAgLTAsMCArMSwxMSBAQAorYj0nIGIgJworZT0nJworZWNobyAxIGEgJGIgYworZWNobyAyIGEgKyRiIGMKK2VjaG8gMyBhICRlJGIgYworZWNobyA0IGEgIiRlIiRiIGMKK2VjaG8gNSBhICIiJGIgYworZWNobyA2IGEgJGIrIGMKK2VjaG8gNyBhICRiJGUgYworZWNobyA4IGEgJGIiJGUiIGMKK2VjaG8gOSBhICRiIiIgYwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfaW5fcGlwZXMucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9pbl9waXBlcy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWY2NWJlCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfaW5fcGlwZXMucmlnaHQKQEAgLTAsMCArMSw2IEBACitiPTEKK2I9MgorYj0zCitiPTQKK2I9NQorYj02CmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9pbl9waXBlcy50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2luX3BpcGVzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNmOGNkMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9pbl9waXBlcy50ZXN0cwpAQCAtMCwwICsxLDcgQEAKK2I9MSBlbnYgfCBncmVwIF5iPQordHJ1ZSB8IGI9MiBlbnYgfCBncmVwIF5iPQorYT0xIHRydWUgfCBiPTMgZW52IHwgZ3JlcCBeYj0KKworKGI9NCBlbnYpIHwgZ3JlcCBeYj0KKyh0cnVlIHwgYj01IGVudikgfCBncmVwIF5iPQorKGE9MSB0cnVlIHwgYj02IGVudikgfCBncmVwIF5iPQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfbGVha3MucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9sZWFrcy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODZiYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfbGVha3MucmlnaHQKQEAgLTAsMCArMSBAQAorT0sKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2xlYWtzLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfbGVha3MudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjdjOGM2NQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX2xlYWtzLnRlc3RzCkBAIC0wLDAgKzEsMTQgQEAKKyMgZXh0ZXJuYWwgcHJvZ3JhbQorYT1iIC9iaW4vdHJ1ZQorZW52IHwgZ3JlcCBeYT0KKworIyBidWlsdGluCithPWIgdHJ1ZQorZW52IHwgZ3JlcCBeYT0KKworIyBleGVjIHdpdGggcmVkaXJlY3Rpb24gb25seQorIyBpbiBiYXNoLCB0aGlzIGxlYWtzIQorYT1iIGV4ZWMgMT4mMQorZW52IHwgZ3JlcCBeYT0KKworZWNobyBPSwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfcG9zaXgxLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfcG9zaXgxLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZjYxOGEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9wb3NpeDEucmlnaHQKQEAgLTAsMCArMSw0MSBAQAorRW1wdHk6CitFbXB0eToKK0VtcHR5OgorRW1wdHk6CitFbXB0eToKK0VtcHR5OgorRW1wdHk6CitFbXB0eToKK0VtcHR5OgorRW1wdHk6CitFbXB0eToKK0VtcHR5OgorRW1wdHk6CitFbXB0eToKK0VtcHR5OgorRW1wdHk6CithYmNkY2QKK2FiY2RjZAorYWJjZGNkCitjZGNkCitiYWJjZGNkCitiYWJjZGNkCithYmFiY2RjZAorRW1wdHk6CithYmFiY2RjZH1fdGFpbAorYWJhYmNkY2RfdGFpbAorYWJhYmNkCithYmFiY2QKK2FiYWJjZAorYWJhYgorYWJhYmNkYworYWJhYmNkYworYWJhYmNkY2QKK0VtcHR5OgorYWJhYmNkY2R9X3RhaWwKK2FiYWJjZGNkX3RhaWwKK2FiYWJjZGNkCithYgorYWIKK2FiCitFbmQKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3Bvc2l4MS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3Bvc2l4MS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44MmFiZTgxCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfcG9zaXgxLnRlc3RzCkBAIC0wLDAgKzEsNTIgQEAKK3Vuc2V0IHZhcgorCitlY2hvIEVtcHR5OiR7dmFyI30KK2VjaG8gRW1wdHk6JHt2YXIjI30KK2VjaG8gRW1wdHk6JHt2YXIjKn0KK2VjaG8gRW1wdHk6JHt2YXIjIyp9CitlY2hvIEVtcHR5OiR7dmFyJX0KK2VjaG8gRW1wdHk6JHt2YXIlJX0KK2VjaG8gRW1wdHk6JHt2YXIlKn0KK2VjaG8gRW1wdHk6JHt2YXIlJSp9CisKK3Zhcj0KKworZWNobyBFbXB0eToke3ZhciN9CitlY2hvIEVtcHR5OiR7dmFyIyN9CitlY2hvIEVtcHR5OiR7dmFyIyp9CitlY2hvIEVtcHR5OiR7dmFyIyMqfQorZWNobyBFbXB0eToke3ZhciV9CitlY2hvIEVtcHR5OiR7dmFyJSV9CitlY2hvIEVtcHR5OiR7dmFyJSp9CitlY2hvIEVtcHR5OiR7dmFyJSUqfQorCit2YXI9YWJhYmNkY2QKKworZWNobyAke3ZhciNhYn0KK2VjaG8gJHt2YXIjI2FifQorZWNobyAke3ZhciNhKmJ9CitlY2hvICR7dmFyIyNhKmJ9CitlY2hvICR7dmFyIz99CitlY2hvICR7dmFyIyM/fQorZWNobyAke3ZhciMqfQorZWNobyBFbXB0eToke3ZhciMjKn0KK2VjaG8gJHt2YXIjfX1fdGFpbAorZWNobyAke3ZhciNcfX1fdGFpbAorCitlY2hvICR7dmFyJWNkfQorZWNobyAke3ZhciUlY2R9CitlY2hvICR7dmFyJWMqZH0KK2VjaG8gJHt2YXIlJWMqZH0KK2VjaG8gJHt2YXIlP30KK2VjaG8gJHt2YXIlJT99CitlY2hvICR7dmFyJSp9CitlY2hvIEVtcHR5OiR7dmFyJSUqfQorZWNobyAke3ZhciN9fV90YWlsCitlY2hvICR7dmFyI1x9fV90YWlsCitlY2hvICR7dmFyJVxcKn0KKworYT1hYn07IGVjaG8gJHthJVx9fTsKK2E9YWJjOyBjPWM7IGVjaG8gJHthJSR7Y319CithPWFie3tjOyBlY2hvICR7YSVgZWNobyB7e2NgfQorCitlY2hvIEVuZApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfcHJlc2VydmVkLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfcHJlc2VydmVkLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhOTkxN2MKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9wcmVzZXJ2ZWQucmlnaHQKQEAgLTAsMCArMSw0IEBACithPWIKK2E9YgorYT1iCitPSwpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfcHJlc2VydmVkLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfcHJlc2VydmVkLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFiZGRkODcKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9wcmVzZXJ2ZWQudGVzdHMKQEAgLTAsMCArMSwxNiBAQAorZXhwb3J0IGE9YgorCisjIGV4dGVybmFsIHByb2dyYW0KK2E9YyAvYmluL3RydWUKK2VudiB8IGdyZXAgXmE9CisKKyMgYnVpbHRpbgorYT1kIHRydWUKK2VudiB8IGdyZXAgXmE9CisKKyMgZXhlYyB3aXRoIHJlZGlyZWN0aW9uIG9ubHkKKyMgaW4gYmFzaCwgdGhpcyBsZWFrcyEKK2E9ZSBleGVjIDE+JjEKK2VudiB8IGdyZXAgXmE9CisKK2VjaG8gT0sKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3NlcmlhbC5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3NlcmlhbC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmFhMzMwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfc2VyaWFsLnJpZ2h0CkBAIC0wLDAgKzEsNSBAQAorQXNzaWdubWVudHMgb25seTogYz1hCitBc3NpZ25tZW50cyBhbmQgYSBjb21tYW5kOiBjPWEKK0Fzc2lnbm1lbnRzIGFuZCBhIGJ1aWx0aW46IGM9YQorQXNzaWdubWVudHMgYW5kIGEgZnVuY3Rpb246IGM9YQorRG9uZQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfc2VyaWFsLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfc2VyaWFsLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjZiNGE0Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9zZXJpYWwudGVzdHMKQEAgLTAsMCArMSwyMiBAQAorYT1hCisKK2I9YgorYz1jCisjIFNlY29uZCBhc3NpZ25tZW50IGRlcGVuZHMgb24gdGhlIGZpcnN0OgorYj0kYSBjPSRiCitlY2hvIEFzc2lnbm1lbnRzIG9ubHk6IGM9JGMKKworYj1iCitjPWMKK2I9JGEgYz0kYiAiJFRISVNfU0giIC1jICdlY2hvIEFzc2lnbm1lbnRzIGFuZCBhIGNvbW1hbmQ6IGM9JGMnCisKK2I9YgorYz1jCitiPSRhIGM9JGIgZXZhbCAnZWNobyBBc3NpZ25tZW50cyBhbmQgYSBidWlsdGluOiBjPSRjJworCitiPWIKK2M9YworZigpIHsgZWNobyBBc3NpZ25tZW50cyBhbmQgYSBmdW5jdGlvbjogYz0kYzsgfQorYj0kYSBjPSRiIGYKKworZWNobyBEb25lCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9zdWJzdF9pbl9mb3IucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl9zdWJzdF9pbl9mb3IucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhY2ExYwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3N1YnN0X2luX2Zvci5yaWdodApAQCAtMCwwICsxLDQwIEBACitUZXN0aW5nOiBpbiB4IHkgegorLnguCisueS4KKy56LgorVGVzdGluZzogaW4gdSAkZW1wdHkgdgorLnUuCisudi4KK1Rlc3Rpbmc6IGluIHUgIiAkZW1wdHkiIHYKKy51LgorLiAuCisudi4KK1Rlc3Rpbmc6IGluIHUgJGVtcHR5ICRlbXB0eSRhIHYKKy51LgorLmEuCisudi4KK1Rlc3Rpbmc6IGluICRhX2IKKy5hLgorLmIuCitUZXN0aW5nOiBpbiAkKgorLmFiYy4KKy5kLgorLmUuCitUZXN0aW5nOiBpbiAkQAorLmFiYy4KKy5kLgorLmUuCitUZXN0aW5nOiBpbiAtJCotCisuLWFiYy4KKy5kLgorLmUtLgorVGVzdGluZzogaW4gLSRALQorLi1hYmMuCisuZC4KKy5lLS4KK1Rlc3Rpbmc6IGluICRhX2IgLSRhX2ItCisuYS4KKy5iLgorLi1hLgorLmItLgorRmluaXNoZWQKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3N1YnN0X2luX2Zvci50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3N1YnN0X2luX2Zvci50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MzNjNjA2Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfc3Vic3RfaW5fZm9yLnRlc3RzCkBAIC0wLDAgKzEsNDAgQEAKK2lmIHRlc3QgJCMgPSAwOyB0aGVuCisgICAgZXhlYyAiJFRISVNfU0giICIkMCIgYWJjICJkIGUiCitmaQorCitlY2hvICdUZXN0aW5nOiBpbiB4IHkgeicKK2ZvciBhIGluIHggeSB6OyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiB1ICRlbXB0eSB2JworZW1wdHk9JycKK2ZvciBhIGluIHUgJGVtcHR5IHY7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluIHUgIiAkZW1wdHkiIHYnCitlbXB0eT0nJworZm9yIGEgaW4gdSAiICRlbXB0eSIgdjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gdSAkZW1wdHkgJGVtcHR5JGEgdicKK2E9J2EnCitmb3IgYSBpbiB1ICRlbXB0eSAkZW1wdHkkYSB2OyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiAkYV9iJworYV9iPSdhIGInCitmb3IgYSBpbiAkYV9iOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiAkKicKK2ZvciBhIGluICQqOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiAkQCcKK2ZvciBhIGluICRAOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiAtJCotJworZm9yIGEgaW4gLSQqLTsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gLSRALScKK2ZvciBhIGluIC0kQC07IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluICRhX2IgLSRhX2ItJworYV9iPSdhIGInCitmb3IgYSBpbiAkYV9iIC0kYV9iLTsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyBGaW5pc2hlZApkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfdW5iYWNrc2xhc2gucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl91bmJhY2tzbGFzaC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmM4MzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtdmFycy92YXJfdW5iYWNrc2xhc2gucmlnaHQKQEAgLTAsMCArMSwxMSBAQAorYjE9LXF3ZXJ0eS10LVwtIi1gLS0tei0qLT8tCitiMT0tcXdlcnR5LXQtXC0iLWAtLS16LSotPy0KK2IyPS1xd2VydHktXHQtXC0iLWAtXC0tXHotXCotXD8tCitiMj0tcXdlcnR5LVx0LVwtIi1gLVwtLVx6LVwqLVw/LQorYjM9LSRhLVx0LVxcLVwiLVxgLVwtLVx6LVwqLVw/LQorYjM9LSRhLVx0LVxcLVwiLVxgLVwtLVx6LVwqLVw/LQorYz0tJGEtXHQtXFwtXCItXGAtXC0tXHotXCotXD8tCitjPS0kYS1cdC1cXC1cIi1cYC1cLS1cei1cKi1cPy0KK2M9LSRhLVx0LVxcLVwiLVxgLVwtLVx6LVwqLVw/LQorYz0tJGEtXHQtXFwtXCItXGAtXC0tXHotXCotXD8tCitEb25lOiAwCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl91bmJhY2tzbGFzaC50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXZhcnMvdmFyX3VuYmFja3NsYXNoLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJiNTJhZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC12YXJzL3Zhcl91bmJhY2tzbGFzaC50ZXN0cwpAQCAtMCwwICsxLDIzIEBACisjIFRlc3QgZm9yIGNvcnJlY3QgaGFuZGxpbmcgb2YgYmFja3NsYXNoZXMKK2E9cXdlcnR5CisKK2I9LSRhLVx0LVxcLVwiLVxgLVwtLVx6LVwqLVw/LQorZWNobyBiMT0kYgorZWNobyAiYjE9JGIiCitiPSItJGEtXHQtXFwtXCItXGAtXC0tXHotXCotXD8tIgorZWNobyBiMj0kYgorZWNobyAiYjI9JGIiCitiPSctJGEtXHQtXFwtXCItXGAtXC0tXHotXCotXD8tJworZWNobyBiMz0kYgorZWNobyAiYjM9JGIiCisKK2M9JGIKK2VjaG8gImM9JGMiCitjPSR7Yn0KK2VjaG8gImM9JGMiCitjPSIkYiIKK2VjaG8gImM9JGMiCitjPSIke2J9IgorZWNobyAiYz0kYyIKKworZWNobyAiRG9uZTogJD8iCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19hbGwxLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfYWxsMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmYwMzM0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfYWxsMS5yaWdodApAQCAtMCwwICsxLDMgQEAKK1dhcm0gdXAKK01lYXN1cmluZyBtZW1vcnkgbGVhay4uLgorT2sKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2FsbDEudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19hbGwxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY4MjA3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19hbGwxLnRlc3RzCkBAIC0wLDAgKzEsMTQ4IEBACisjICJDaGVjayBtYW55IGxlYWtzIiB0ZXN0ICMxCisjIENyYW1taW5nIGFsbCBraW5kcyBvZiB3ZWlyZCBjb21tYW5kcyBpbiBoZXJlLgorIyBBcyB5b3UgZmluZCBsZWFrcywgcGxlYXNlIGNyZWF0ZSBzZXBhcmF0ZSwgc21hbGwgdGVzdAorIyBmb3IgZWFjaCBsZWFrLgorIyBOYXJyb3dpbmcgZG93biB0aGUgbGVhayB1c2luZyB0aGlzIGxhcmdlIHRlc3QgbWF5IGJlIGRpZmZpY3VsdC4KKyMgSXQgaXMgaW50ZW5kZWQgdG8gYmUgYSBibGFua2V0ICJpcyBldmVyeXRoaW5nIG9rPyIgdGVzdAorCitlY2hvICJXYXJtIHVwIgoraT0xCitsPTEKK3Q9MQorZXhwb3J0IHQKK3doaWxlIHRlc3QgJGkgIT0gOTk7IGRvCisgICAgdD12YWx1ZTFfJGk7IHQ9dmFsdWUyXyRpIHRydWU7IHQ9dmFsdWUzXyRpIC9iaW4vdHJ1ZTsgdD12YWx1ZTRfJGkgZXhlYyAxPiYxCisgICAgeyB0PXZhbHVlM18kaSAvYmluL3RydWU7IH0gPC9kZXYvbnVsbAorICAgIGlmIHRydWU7IHQ9dmFsdWVBXyRpIGZhbHNlID4+L2Rldi9udWxsOyB0cnVlOyB0aGVuCisJOiA8PCBIRVJFID4vZGV2L251bGw7IHRydWUgPDxIRVJFCitIZWxsbyBidWlsdGluIDoKK0hFUkUKK0hlbGxvICRpIHRydWUKK0hFUkUKKyAgICBlbGlmIGZhbHNlOyB0aGVuCisJdHJ1ZTsgZWNobyBEb2VzbnQgcnVuCisgICAgZWxzZQorCXsgdHJ1ZTsgfTsgZWNobyBEb2VzbnQgcnVuIHRvbyA+Pi9mb28vYmFyCisgICAgZmkKKyAgICB7IDogL2Jpbi8qOyB9CisgICAgdW5zZXQgdmFyCisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyI30KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjI30KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjKn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjIyp9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJX0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlJX0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlKn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlJSp9CisgICAgdmFyPQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciN9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyN9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyp9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyMqfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciV9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSV9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSp9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSUqfQorICAgIHZhcj1hYmFiY2RjZAorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciNhYn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjI2FifQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciNhKmJ9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyNhKmJ9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIz99CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyM/fQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMqfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMjKn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlY2R9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSVjZH0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlYypkfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUlYypkfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciU/fQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUlP30KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlKn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlJSp9CisgICAgc2V0IC0tIHBhcjFfJGkgcGFyMl8kaSBwYXIzXyRpIHBhcjRfJGkKKyAgICB0cmFwICJlY2hvIHRyYXAkaSIgV0lOQ0gKKyAgICBmKCkgeyB0cnVlOyB0cnVlOyB0cnVlOyB0cnVlOyB0cnVlOyB0cnVlOyB0cnVlOyB0cnVlOyB9CisgICAgZigpIHsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgZWNobyAkMTsgfQorICAgIGk9aWlpJGkgdD10dHQkaSB6PXp6eiRpIGYgPi9kZXYvbnVsbAorICAgIDogJCgoaSsrKSkKK2RvbmUKK3Vuc2V0IGkgbCB0Cit1bnNldCAtZiBmCisKK21lbWxlYWsKKworZWNobyAiTWVhc3VyaW5nIG1lbW9yeSBsZWFrLi4uIgorIyBQbGVhc2UgY29weSB0aGUgZW50aXJlIGJsb2NrIGZyb20gYWJvdmUgdmVyYmF0aW0KK2k9MQorbD0xCit0PTEKK2V4cG9ydCB0Cit3aGlsZSB0ZXN0ICRpICE9IDk5OyBkbworICAgIHQ9dmFsdWUxXyRpOyB0PXZhbHVlMl8kaSB0cnVlOyB0PXZhbHVlM18kaSAvYmluL3RydWU7IHQ9dmFsdWU0XyRpIGV4ZWMgMT4mMQorICAgIHsgdD12YWx1ZTNfJGkgL2Jpbi90cnVlOyB9IDwvZGV2L251bGwKKyAgICBpZiB0cnVlOyB0PXZhbHVlQV8kaSBmYWxzZSA+Pi9kZXYvbnVsbDsgdHJ1ZTsgdGhlbgorCTogPDwgSEVSRSA+L2Rldi9udWxsOyB0cnVlIDw8SEVSRQorSGVsbG8gYnVpbHRpbiA6CitIRVJFCitIZWxsbyAkaSB0cnVlCitIRVJFCisgICAgZWxpZiBmYWxzZTsgdGhlbgorCXRydWU7IGVjaG8gRG9lc250IHJ1bgorICAgIGVsc2UKKwl7IHRydWU7IH07IGVjaG8gRG9lc250IHJ1biB0b28gPj4vZm9vL2JhcgorICAgIGZpCisgICAgeyA6IC9iaW4vKjsgfQorICAgIHVuc2V0IHZhcgorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciN9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyN9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyp9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyMqfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciV9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSV9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSp9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSUqfQorICAgIHZhcj0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMjfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMqfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMjKn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUlfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUqfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUlKn0KKyAgICB2YXI9YWJhYmNkY2QKKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjYWJ9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyIyNhYn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjYSpifQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMjYSpifQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciM/fQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciMjP30KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjKn0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIjIyp9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJWNkfQorICAgIGVjaG8gPi9kZXYvbnVsbCAke3ZhciUlY2R9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJWMqZH0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlJWMqZH0KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlP30KKyAgICBlY2hvID4vZGV2L251bGwgJHt2YXIlJT99CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSp9CisgICAgZWNobyA+L2Rldi9udWxsICR7dmFyJSUqfQorICAgIHNldCAtLSBwYXIxXyRpIHBhcjJfJGkgcGFyM18kaSBwYXI0XyRpCisgICAgdHJhcCAiZWNobyB0cmFwJGkiIFdJTkNICisgICAgZigpIHsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgdHJ1ZTsgfQorICAgIGYoKSB7IHRydWU7IHRydWU7IHRydWU7IHRydWU7IHRydWU7IHRydWU7IHRydWU7IHRydWU7IGVjaG8gJDE7IH0KKyAgICBpPWlpaSRpIHQ9dHR0JGkgej16enokaSBmID4vZGV2L251bGwKKyAgICA6ICQoKGkrKykpCitkb25lCit1bnNldCBpIGwgdAordW5zZXQgLWYgZgorCisKK21lbWxlYWsKK2tiPSQ/CitpZiB0ZXN0ICRrYiAtbGUgNDsgdGhlbgorICAgIGVjaG8gT2sgIyRrYgorZWxzZQorICAgIGVjaG8gIkJhZDogJGtiIGtiIGxlYWtlZCIKK2ZpCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19hbGwyLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfYWxsMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmYwMzM0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfYWxsMi5yaWdodApAQCAtMCwwICsxLDMgQEAKK1dhcm0gdXAKK01lYXN1cmluZyBtZW1vcnkgbGVhay4uLgorT2sKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2FsbDIudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19hbGwyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQ1MWVhODAKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19hbGwyLnRlc3RzCkBAIC0wLDAgKzEsOTMgQEAKKyMgIkNoZWNrIG1hbnkgbGVha3MiIHRlc3QgIzIKKyMgQ3JhbW1pbmcgYWxsIGtpbmRzIG9mIHdlaXJkIGNvbW1hbmRzIGluIGhlcmUuCisjIEFzIHlvdSBmaW5kIGxlYWtzLCBwbGVhc2UgY3JlYXRlIHNlcGFyYXRlLCBzbWFsbCB0ZXN0CisjIGZvciBlYWNoIGxlYWsuCisjIE5hcnJvd2luZyBkb3duIHRoZSBsZWFrIHVzaW5nIHRoaXMgbGFyZ2UgdGVzdCBtYXkgYmUgZGlmZmljdWx0LgorIyBJdCBpcyBpbnRlbmRlZCB0byBiZSBhIGJsYW5rZXQgImlzIGV2ZXJ5dGhpbmcgb2s/IiB0ZXN0CisKK2VjaG8gIldhcm0gdXAiCitsb2NhbF92YXI9ImxvY2FsIHZhbCIKK2V4cG9ydCBkZXZfbnVsbD0iL2Rldi9udWxsIgorPiRkZXZfbnVsbAorZWNobyBoaTEgJGxvY2FsX3ZhciBgZWNobyBob2AgPj4vZGV2L251bGwKK2VjaG8gaGkyICRsb2NhbF92YXIgPC9kZXYvbnVsbCB8IGVjaG8gMj4mLSB8IGNhdCAxPD4vZGV2L251bGwKK3sgZWNobyBoaTQgJGxvY2FsX3ZhciBgZWNobyBob2AgMTw+L2Rldi9udWxsOyB9CisoIGVjaG8gaGk0ICRsb2NhbF92YXIgYGVjaG8gaG9gIDE8Pi9kZXYvbnVsbCApCitpZiBlY2hvICRsb2NhbF92YXI7IGZhbHNlCisgICAgdGhlbiBlY2hvIG5vdCBydW4KKyAgICBlbGlmIGZhbHNlIDwkZGV2X251bGwKKyAgICB0aGVuIG5vbmUKKyAgICBlbHNlIGNhdCAwPD4kZGV2X251bGwgMTw+IiRkZXZfbnVsbCIKK2ZpID4+L2Rldi9udWxsCit7CisgICAgaWYgZWNobyAkbG9jYWxfdmFyOyB0aGVuIGNhdCA8PEhFUkUKK0hpIGNhdAorSEVSRQorICAgIGZpID4+L2Rldi9udWxsCit9IDE8Pi9kZXYvbnVsbAord2hpbGUgeyBlY2hvICRkZXZfbnVsbCA+PiRkZXZfbnVsbDsgfTsgZG8gY2F0IDwiJGRldl9udWxsIjsgYnJlYWs7IGRvbmUKKyggdW50aWwgeyBlY2hvICRkZXZfbnVsbCA+PiRkZXZfbnVsbCB8IGZhbHNlOyB9OyBkbyBjYXQgPCIkZGV2X251bGwiOyBicmVhazsgZG9uZSApIDwkZGV2X251bGwKK2YoKSB7IGVjaG8gJDE7IH0KK2YgPi9kZXYvbnVsbAorCittZW1sZWFrCisKK2VjaG8gIk1lYXN1cmluZyBtZW1vcnkgbGVhay4uLiIKKyMgUGxlYXNlIGNvcHkgdGhlIGVudGlyZSBibG9jayBmcm9tIGFib3ZlIHZlcmJhdGltCitsb2NhbF92YXI9ImxvY2FsIHZhbCIKK2V4cG9ydCBkZXZfbnVsbD0iL2Rldi9udWxsIgorPiRkZXZfbnVsbAorZWNobyBoaTEgJGxvY2FsX3ZhciBgZWNobyBob2AgPj4vZGV2L251bGwKK2VjaG8gaGkyICRsb2NhbF92YXIgPC9kZXYvbnVsbCB8IGVjaG8gMj4mLSB8IGNhdCAxPD4vZGV2L251bGwKK3sgZWNobyBoaTQgJGxvY2FsX3ZhciBgZWNobyBob2AgMTw+L2Rldi9udWxsOyB9CisoIGVjaG8gaGk0ICRsb2NhbF92YXIgYGVjaG8gaG9gIDE8Pi9kZXYvbnVsbCApCitpZiBlY2hvICRsb2NhbF92YXI7IGZhbHNlCisgICAgdGhlbiBlY2hvIG5vdCBydW4KKyAgICBlbGlmIGZhbHNlIDwkZGV2X251bGwKKyAgICB0aGVuIG5vbmUKKyAgICBlbHNlIGNhdCAwPD4kZGV2X251bGwgMTw+IiRkZXZfbnVsbCIKK2ZpID4+L2Rldi9udWxsCit7CisgICAgaWYgZWNobyAkbG9jYWxfdmFyOyB0aGVuIGNhdCA8PEhFUkUKK0hpIGNhdAorSEVSRQorICAgIGZpID4+L2Rldi9udWxsCit9IDE8Pi9kZXYvbnVsbAord2hpbGUgeyBlY2hvICRkZXZfbnVsbCA+PiRkZXZfbnVsbDsgfTsgZG8gY2F0IDwiJGRldl9udWxsIjsgYnJlYWs7IGRvbmUKKyggdW50aWwgeyBlY2hvICRkZXZfbnVsbCA+PiRkZXZfbnVsbCB8IGZhbHNlOyB9OyBkbyBjYXQgPCIkZGV2X251bGwiOyBicmVhazsgZG9uZSApIDwkZGV2X251bGwKK2YoKSB7IGVjaG8gJDE7IH0KK2YgPi9kZXYvbnVsbAorCisjIEFuZCBzYW1lIGFnYWluCisKK2xvY2FsX3Zhcj0ibG9jYWwgdmFsIgorZXhwb3J0IGRldl9udWxsPSIvZGV2L251bGwiCis+JGRldl9udWxsCitlY2hvIGhpMSAkbG9jYWxfdmFyIGBlY2hvIGhvYCA+Pi9kZXYvbnVsbAorZWNobyBoaTIgJGxvY2FsX3ZhciA8L2Rldi9udWxsIHwgZWNobyAyPiYtIHwgY2F0IDE8Pi9kZXYvbnVsbAoreyBlY2hvIGhpNCAkbG9jYWxfdmFyIGBlY2hvIGhvYCAxPD4vZGV2L251bGw7IH0KKyggZWNobyBoaTQgJGxvY2FsX3ZhciBgZWNobyBob2AgMTw+L2Rldi9udWxsICkKK2lmIGVjaG8gJGxvY2FsX3ZhcjsgZmFsc2UKKyAgICB0aGVuIGVjaG8gbm90IHJ1bgorICAgIGVsaWYgZmFsc2UgPCRkZXZfbnVsbAorICAgIHRoZW4gbm9uZQorICAgIGVsc2UgY2F0IDA8PiRkZXZfbnVsbCAxPD4iJGRldl9udWxsIgorZmkgPj4vZGV2L251bGwKK3sKKyAgICBpZiBlY2hvICRsb2NhbF92YXI7IHRoZW4gY2F0IDw8SEVSRQorSGkgY2F0CitIRVJFCisgICAgZmkgPj4vZGV2L251bGwKK30gMTw+L2Rldi9udWxsCit3aGlsZSB7IGVjaG8gJGRldl9udWxsID4+JGRldl9udWxsOyB9OyBkbyBjYXQgPCIkZGV2X251bGwiOyBicmVhazsgZG9uZQorKCB1bnRpbCB7IGVjaG8gJGRldl9udWxsID4+JGRldl9udWxsIHwgZmFsc2U7IH07IGRvIGNhdCA8IiRkZXZfbnVsbCI7IGJyZWFrOyBkb25lICkgPCRkZXZfbnVsbAorZigpIHsgZWNobyAkMTsgfQorZiA+L2Rldi9udWxsCisKK21lbWxlYWsKK2tiPSQ/CitpZiB0ZXN0ICRrYiAtbGUgNDsgdGhlbgorICAgIGVjaG8gT2sgIyRrYgorZWxzZQorICAgIGVjaG8gIkJhZDogJGtiIGtiIChvciBtb3JlKSBsZWFrZWQiCitmaQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfZW1wdHlfdGljay5yaWdodCBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2VtcHR5X3RpY2sucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZmMDMzNAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2VtcHR5X3RpY2sucmlnaHQKQEAgLTAsMCArMSwzIEBACitXYXJtIHVwCitNZWFzdXJpbmcgbWVtb3J5IGxlYWsuLi4KK09rCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19lbXB0eV90aWNrLnRlc3RzIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfZW1wdHlfdGljay50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZTM3NTc5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfZW1wdHlfdGljay50ZXN0cwpAQCAtMCwwICsxLDI4IEBACitlY2hvICJXYXJtIHVwIgoraT0xCit3aGlsZSB0ZXN0ICRpICE9IDk7IGRvCisgICAgYHRydWVgCisgICAgOiAkKChpKyspKQorZG9uZQorCittZW1sZWFrCisKK2VjaG8gIk1lYXN1cmluZyBtZW1vcnkgbGVhay4uLiIKK2k9MQord2hpbGUgdGVzdCAkaSAhPSAxOTk7IGRvCisgICAgYHRydWVgCisgICAgOiAkKChpKyspKQorZG9uZQoraT0xCit3aGlsZSB0ZXN0ICRpICE9IDE5OTsgZG8KKyAgICBgdHJ1ZWAKKyAgICA6ICQoKGkrKykpCitkb25lCisKK21lbWxlYWsKK2tiPSQ/CitpZiB0ZXN0ICRrYiAtbGUgNDsgdGhlbgorICAgIGVjaG8gT2sgIyRrYgorZWxzZQorICAgIGVjaG8gIkJhZDogJGtiIGtiIChvciBtb3JlKSBsZWFrZWQiCitmaQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfaGVyZWRvYzEucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19oZXJlZG9jMS5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmYwMzM0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfaGVyZWRvYzEucmlnaHQKQEAgLTAsMCArMSwzIEBACitXYXJtIHVwCitNZWFzdXJpbmcgbWVtb3J5IGxlYWsuLi4KK09rCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19oZXJlZG9jMS50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX2hlcmVkb2MxLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjI2Y2JiMjgKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha19oZXJlZG9jMS50ZXN0cwpAQCAtMCwwICsxLDM0IEBACitlY2hvICJXYXJtIHVwIgoraT0xCit3aGlsZSB0ZXN0ICRpICE9IDk5OyBkbworICAgIDogPDxIRVJFCitIZWxsbyAkaSBgZWNobyBidWlsdGluXyRpYAorSEVSRQorICAgIDogJCgoaSsrKSkKK2RvbmUKKworbWVtbGVhaworCitlY2hvICJNZWFzdXJpbmcgbWVtb3J5IGxlYWsuLi4iCitpPTEKK3doaWxlIHRlc3QgJGkgIT0gOTk7IGRvCisgICAgOiA8PEhFUkUKK0hlbGxvICRpIGBlY2hvIGJ1aWx0aW5fJGlgCitIRVJFCisgICAgOiAkKChpKyspKQorZG9uZQoraT0xCit3aGlsZSB0ZXN0ICRpICE9IDk5OyBkbworICAgIDogPDxIRVJFCitIZWxsbyAkaSBgZWNobyBidWlsdGluXyRpYAorSEVSRQorICAgIDogJCgoaSsrKSkKK2RvbmUKKworbWVtbGVhawora2I9JD8KK2lmIHRlc3QgJGtiIC1sZSA0OyB0aGVuCisgICAgZWNobyBPayAjJGtiCitlbHNlCisgICAgZWNobyAiQmFkOiAka2Iga2IgKG9yIG1vcmUpIGxlYWtlZCIKK2ZpCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha192YXIucmlnaHQgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha192YXIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0ZDZmZgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX3Zhci5yaWdodApAQCAtMCwwICsxLDIgQEAKK01lYXN1cmluZyBtZW1vcnkgbGVhay4uLgorT2sKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX3Zhci50ZXN0cyBiL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX3Zhci50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40MWMwOWU0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfdmFyLnRlc3RzCkBAIC0wLDAgKzEsNDcgQEAKK2VjaG8gIk1lYXN1cmluZyBtZW1vcnkgbGVhay4uLiIKK2k9MQord2hpbGUgdGVzdCAkaSAhPSBYOyBkbworICAgIHVuc2V0IHQKKyAgICB0PTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorICAgIGV4cG9ydCB0CisgICAgdW5zZXQgdAorICAgIHQ9MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCisgICAgZXhwb3J0IHQKKyAgICB1bnNldCB0CisgICAgdD0xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEKKyAgICBleHBvcnQgdAorICAgIHVuc2V0IHQKKyAgICB0PTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorICAgIGV4cG9ydCB0CisgICAgdW5zZXQgdAorICAgIHQ9MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExCisgICAgZXhwb3J0IHQKKyAgICBpPTEkaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExOyB0aGVuIGk9MjsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjsgdGhlbiBpPTM7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTM7IHRoZW4gaT00OyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE0OyB0aGVuIGk9NTsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExNTsgdGhlbiBpPTY7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTY7IHRoZW4gaT03OyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE3OyB0aGVuIGk9ODsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExODsgdGhlbiBpPTk7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTk7IHRoZW4gaT1hOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFhOyB0aGVuIGk9YjsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExYjsgdGhlbiBpPWM7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWM7IHRoZW4gaT1kOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFkOyB0aGVuIGk9ZTsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExZTsgdGhlbiBpPWY7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWY7IHRoZW4gaT1nOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFnOyB0aGVuIGk9aDsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExaDsgdGhlbiBpPWk7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMWk7IHRoZW4gaT1qOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTFqOyB0aGVuIGk9WDsgZmkKKyAgICBtZW1sZWFrCitkb25lCittZW1sZWFrCitrYj0kPworaWYgdGVzdCAka2IgLWxlIDQ7IHRoZW4KKyAgICBlY2hvIE9rCitlbHNlCisgICAgZWNobyAiQmFkOiAka2Iga2IgKG9yIG1vcmUpIGxlYWtlZCIKK2ZpCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha192YXIyLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfdmFyMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmYwMzM0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfdmFyMi5yaWdodApAQCAtMCwwICsxLDMgQEAKK1dhcm0gdXAKK01lYXN1cmluZyBtZW1vcnkgbGVhay4uLgorT2sKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX3ZhcjIudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha192YXIyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjYxMTY2NmMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha192YXIyLnRlc3RzCkBAIC0wLDAgKzEsNDMgQEAKK2VjaG8gIldhcm0gdXAiCit0PTEKK2V4cG9ydCB0CitpPTEKK3doaWxlIHRlc3QgJGkgIT0gWDsgZG8KKyAgICB0PTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMCRpCisgICAgdD0xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEkaSB0cnVlCisgICAgdD0xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTIkaSAvYmluL3RydWUKKyAgICB0PTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMyRpIGV4ZWMgMT4mMQorICAgIGk9MSRpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE7IHRoZW4gaT0yOyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyOyB0aGVuIGk9MzsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMzsgdGhlbiBpPTQ7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTQ7IHRoZW4gaT1YOyBmaQorZG9uZQordW5zZXQgdCBpCisKK21lbWxlYWsKKworZWNobyAiTWVhc3VyaW5nIG1lbW9yeSBsZWFrLi4uIgordD0xCitleHBvcnQgdAoraT0xCit3aGlsZSB0ZXN0ICRpICE9IFg7IGRvCisgICAgdD0xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTAkaQorICAgIHQ9MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExJGkgdHJ1ZQorICAgIHQ9MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEyJGkgL2Jpbi90cnVlCisgICAgdD0xMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTMkaSBleGVjIDE+JjEKKyAgICBpPTEkaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExOyB0aGVuIGk9MjsgZmkKKyAgICBpZiB0ZXN0ICRpID0gMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMjsgdGhlbiBpPTM7IGZpCisgICAgaWYgdGVzdCAkaSA9IDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTM7IHRoZW4gaT00OyBmaQorICAgIGlmIHRlc3QgJGkgPSAxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE0OyB0aGVuIGk9WDsgZmkKK2RvbmUKK3Vuc2V0IHQgaQorCittZW1sZWFrCitrYj0kPworaWYgdGVzdCAka2IgLWxlIDQ7IHRoZW4KKyAgICBlY2hvIE9rCitlbHNlCisgICAgZWNobyAiQmFkOiAka2Iga2IgKG9yIG1vcmUpIGxlYWtlZCIKK2ZpCmRpZmYgLS1naXQgYS9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha192YXIzLnJpZ2h0IGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfdmFyMy5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmYwMzM0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L2h1c2gtel9zbG93L2xlYWtfdmFyMy5yaWdodApAQCAtMCwwICsxLDMgQEAKK1dhcm0gdXAKK01lYXN1cmluZyBtZW1vcnkgbGVhay4uLgorT2sKZGlmZiAtLWdpdCBhL3NoZWxsL2h1c2hfdGVzdC9odXNoLXpfc2xvdy9sZWFrX3ZhcjMudGVzdHMgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha192YXIzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk1NTRjNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9odXNoX3Rlc3QvaHVzaC16X3Nsb3cvbGVha192YXIzLnRlc3RzCkBAIC0wLDAgKzEsNDEgQEAKKyMgV2FzIHNlZW4gbGVha2luZyBvbiBOT01NVSBidWlsZAorCitlY2hvICJXYXJtIHVwIgoraT0xOyB0PTE7IGV4cG9ydCB0Cit3aGlsZSB0ZXN0ICRpICE9IDQwMDsgZG8KKyAgICB0PXZhbHVlQV8kaSB0cnVlCisgICAgOiAkKChpKyspKQorZG9uZQorCittZW1sZWFrCitlY2hvICJNZWFzdXJpbmcgbWVtb3J5IGxlYWsuLi4iCisKKyMgUGxlYXNlIGNvcHkgdGhlIGVudGlyZSBibG9jayBmcm9tIGFib3ZlIHZlcmJhdGltCitpPTE7IHQ9MTsgZXhwb3J0IHQKK3doaWxlIHRlc3QgJGkgIT0gNDAwOyBkbworICAgIHQ9dmFsdWVBXyRpIHRydWUKKyAgICA6ICQoKGkrKykpCitkb25lCitpPTE7IHQ9MTsgZXhwb3J0IHQKK3doaWxlIHRlc3QgJGkgIT0gNDAwOyBkbworICAgIHQ9dmFsdWVBXyRpIHRydWUKKyAgICA6ICQoKGkrKykpCitkb25lCitpPTE7IHQ9MTsgZXhwb3J0IHQKK3doaWxlIHRlc3QgJGkgIT0gNDAwOyBkbworICAgIHQ9dmFsdWVBXyRpIHRydWUKKyAgICA6ICQoKGkrKykpCitkb25lCitpPTE7IHQ9MTsgZXhwb3J0IHQKK3doaWxlIHRlc3QgJGkgIT0gNDAwOyBkbworICAgIHQ9dmFsdWVBXyRpIHRydWUKKyAgICA6ICQoKGkrKykpCitkb25lCisKK21lbWxlYWsKK2tiPSQ/CitpZiB0ZXN0ICRrYiAtbGUgNDsgdGhlbgorICAgIGVjaG8gT2sgIyRrYgorZWxzZQorICAgIGVjaG8gIkJhZDogJGtiIGtiIChvciBtb3JlKSBsZWFrZWQiCitmaQpkaWZmIC0tZ2l0IGEvc2hlbGwvaHVzaF90ZXN0L3J1bi1hbGwgYi9zaGVsbC9odXNoX3Rlc3QvcnVuLWFsbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42NGE3YWJjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvaHVzaF90ZXN0L3J1bi1hbGwKQEAgLTAsMCArMSwxMDUgQEAKKyMhL2Jpbi9zaAorCit1bnNldCBMQU5HIExBTkdVQUdFCit1bnNldCBMQ19DT0xMQVRFCit1bnNldCBMQ19DVFlQRQordW5zZXQgTENfTU9ORVRBUlkKK3Vuc2V0IExDX01FU1NBR0VTCit1bnNldCBMQ19OVU1FUklDCit1bnNldCBMQ19USU1FCit1bnNldCBMQ19BTEwKKworaWYgdGVzdCAhIC14IGh1c2g7IHRoZW4KKwlpZiB0ZXN0ICEgLXggLi4vLi4vYnVzeWJveDsgdGhlbgorCQllY2hvICJDYW4ndCBydW4gdGVzdHMuIFB1dCBodXNoIGJpbmFyeSBpbnRvIHRoaXMgZGlyZWN0b3J5IChgcHdkYCkiCisJCWV4aXQgMQorCWZpCisJZWNobyAiTm8gLi9odXNoIC0gY3JlYXRpbmcgYSBsaW5rIHRvIC4uLy4uL2J1c3lib3giCisJbG4gLXMgLi4vLi4vYnVzeWJveCBodXNoCitmaQoraWYgdGVzdCAhIC1mIC5jb25maWc7IHRoZW4KKwlpZiB0ZXN0ICEgLWYgLi4vLi4vLmNvbmZpZzsgdGhlbgorCQllY2hvICJNaXNzaW5nIC5jb25maWcgZmlsZSIKKwkJZXhpdCAxCisJZmkKKwljcCAuLi8uLi8uY29uZmlnIC4gfHwgZXhpdCAxCitmaQorCitldmFsICQoc2VkIC1lICcvXiMvZCcgLWUgJy9eJC9kJyAtZSAnczpeOmV4cG9ydCA6JyAuY29uZmlnKQorCitQQVRIPSJgcHdkYDokUEFUSCIgIyBmb3IgaHVzaCBhbmQgcmVjaG8vemVjaG8vcHJpbnRlbnYKK2V4cG9ydCBQQVRICisKK1RISVNfU0g9ImBwd2RgL2h1c2giCitleHBvcnQgVEhJU19TSAorCitkb190ZXN0KCkKK3sKKwl0ZXN0IC1kICIkMSIgfHwgcmV0dXJuIDAKKwlkPSR7ZCUvfQorIwllY2hvIFJ1bm5pbmcgdGVzdHMgaW4gZGlyZWN0b3J5ICIkMSIKKwkoCisJdHJldD0wCisJY2QgIiQxIiB8fCB7IGVjaG8gImNhbm5vdCBjZCAkMSEiOyBleGl0IDE7IH0KKwlmb3IgeCBpbiBydW4tKjsgZG8KKwkJdGVzdCAtZiAiJHgiIHx8IGNvbnRpbnVlCisJCWNhc2UgIiR4IiBpbgorCQkJIiQwInxydW4tbWluaW1hbHxydW4tZ3Byb2YpIDs7CisJCQkqLm9yaWd8Kn4pIDs7CisJCQkjKikgZWNobyAkeCA7IHNoICR4IDs7CisJCQkqKQorCQkJZWNobyAtbiAiJDEvJHg6IgorCQkJc2ggIiR4IiA+Ii4uLyQxLSR4LmZhaWwiIDI+JjEgJiYgXAorCQkJeyB7IGVjaG8gIiBvayI7IHJtICIuLi8kMS0keC5mYWlsIjsgfSB8fCBlY2hvICIgZmFpbCI7IH0KKwkJCTs7CisJCWVzYWMKKwlkb25lCisJIyBNYW55IGJhc2ggcnVuLVhYWCBzY3JpcHRzIGp1c3QgZG8gdGhpcywKKwkjIG5vIHBvaW50IGluIGR1cGxpY2F0aW9uIGl0IGFsbCBvdmVyIHRoZSBwbGFjZQorCWZvciB4IGluICoudGVzdHM7IGRvCisJdGVzdCAteCAiJHgiIHx8IGNvbnRpbnVlCisJbmFtZT0iJHt4JSUudGVzdHN9IgorCXRlc3QgLWYgIiRuYW1lLnJpZ2h0IiB8fCBjb250aW51ZQorIwllY2hvIFJ1bm5pbmcgdGVzdDogIiR4IgorCWVjaG8gLW4gIiQxLyR4OiIKKwkoCisJCSIkVEhJU19TSCIgIi4vJHgiID4iJG5hbWUueHgiIDI+JjEKKwkJIyBmaWx0ZXIgQyBsaWJyYXJ5IGRpZmZlcmVuY2VzCisJCXNlZCAtaSBcCisJCQktZSAiLzogaW52YWxpZCBvcHRpb24gL3M6Jzo6ZyIgXAorCQkJIiRuYW1lLnh4IgorCQl0ZXN0ICQ/IC1lcSA3NyAmJiBybSAtZiAiLi4vJDEtJHguZmFpbCIgJiYgZXhpdCA3NworCQlkaWZmIC11ICIkbmFtZS54eCIgIiRuYW1lLnJpZ2h0IiA+Ii4uLyQxLSR4LmZhaWwiICYmIHJtIC1mICIkbmFtZS54eCIgIi4uLyQxLSR4LmZhaWwiCisJKQorCWNhc2UgJD8gaW4KKwkJMCkgIGVjaG8gIiBvayI7OworCQk3NykgZWNobyAiIHNraXAgKGZlYXR1cmUgZGlzYWJsZWQpIjs7CisJCSopICBlY2hvICIgZmFpbCI7IHRyZXQ9MTs7CisJZXNhYworCWRvbmUKKwlleGl0ICR7dHJldH0KKwkpCit9CisKKyMgTWFpbiBwYXJ0IG9mIHRoaXMgc2NyaXB0CisjIFVzYWdlOiBydW4tYWxsIFtkaXJlY3Rvcmllc10KKworcmV0PTAKKworaWYgWyAkIyAtbHQgMSBdOyB0aGVuCisJIyBBbGwgc3ViIGRpcmVjdG9yaWVzCisJbW9kdWxlcz1gbHMgLWQgaHVzaC0qYAorCisJZm9yIG1vZHVsZSBpbiAkbW9kdWxlczsgZG8KKwlkb190ZXN0ICRtb2R1bGUgfHwgcmV0PTEKKwlkb25lCitlbHNlCisJd2hpbGUgWyAkIyAtZ2UgMSBdOyBkbworCWlmIFsgLWQgJDEgXTsgdGhlbgorCQlkb190ZXN0ICQxIHx8IHJldD0xCisJZmkKKwlzaGlmdAorCWRvbmUKK2ZpCisKK2V4aXQgJHtyZXR9CmRpZmYgLS1naXQgYS9zaGVsbC9tYXRjaC5jIGIvc2hlbGwvbWF0Y2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWUzY2YyCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbWF0Y2guYwpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqICMjLyUlIHZhcmlhYmxlIG1hdGNoaW5nIGNvZGUgcmlwcGVkIG91dCBvZiBhc2ggc2hlbGwgZm9yIGNvZGUgc2hhcmluZworICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5ODksIDE5OTEsIDE5OTMsIDE5OTQKKyAqICAgICAgVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTk3LTIwMDUgSGVyYmVydCBYdSA8aGVyYmVydEBnb25kb3IuYXBhbmEub3JnLmF1PgorICogd2FzIHJlLXBvcnRlZCBmcm9tIE5ldEJTRCBhbmQgZGViaWFuaXplZC4KKyAqLworI2lmZGVmIFNUQU5EQUxPTkUKKyMgaW5jbHVkZSA8c3RkYm9vbC5oPgorIyBpbmNsdWRlIDxzdGRpby5oPgorIyBpbmNsdWRlIDxzdGRsaWIuaD4KKyMgaW5jbHVkZSA8c3RyaW5nLmg+CisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBkZWZpbmUgRkFTVF9GVU5DIC8qIG5vdGhpbmcgKi8KKyMgZGVmaW5lIFBVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTiAvKiBub3RoaW5nICovCisjIGRlZmluZSBQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWSAvKiBub3RoaW5nICovCisjZWxzZQorIyBpbmNsdWRlICJsaWJiYi5oIgorI2VuZGlmCisjaW5jbHVkZSA8Zm5tYXRjaC5oPgorI2luY2x1ZGUgIm1hdGNoLmgiCisKK2NoYXIqIEZBU1RfRlVOQyBzY2FuX2FuZF9tYXRjaChjaGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKnBhdHRlcm4sIHVuc2lnbmVkIGZsYWdzKQoreworCWNoYXIgKmxvYzsKKwljaGFyICplbmQ7CisJdW5zaWduZWQgbGVuID0gc3RybGVuKHN0cmluZyk7CisJaW50IGVhcmx5X2V4aXQ7CisKKwkvKiBXZSBjYW4gc3RvcCB0aGUgc2NhbiBlYXJseSBvbmx5IGlmIHRoZSBzdHJpbmcgcGFydAorCSAqIHdlIGFyZSBtYXRjaGluZyBhZ2FpbnN0IGlzIHNocmlua2luZywgYW5kIHRoZSBwYXR0ZXJuIGhhcworCSAqIGFuIHVucXVvdGVkICJzdGFyIiBhdCB0aGUgY29ycmVzcG9uZGluZyBlbmQuIFRoZXJlIGFyZSB0d28gY2FzZXMuCisJICogQ2FzZSAxOgorCSAqICJxd2VydHkiIGRvZXMgbm90IG1hdGNoIGFnYWluc3QgcGF0dGVybiAiKnp5IiwKKwkgKiBubyBwb2ludCBpbiB0cnlpbmcgdG8gbWF0Y2ggIndlcnR5IiwgImVydHkiIGV0YzoKKwkgKi8KKwllYXJseV9leGl0ID0gKGZsYWdzID09IChTQ0FOX01PVkVfRlJPTV9MRUZUICsgU0NBTl9NQVRDSF9SSUdIVF9IQUxGKSAmJiBwYXR0ZXJuWzBdID09ICcqJyk7CisKKwlpZiAoZmxhZ3MgJiBTQ0FOX01PVkVfRlJPTV9MRUZUKSB7CisJCWxvYyA9IHN0cmluZzsKKwkJZW5kID0gc3RyaW5nICsgbGVuICsgMTsKKwl9IGVsc2UgeworCQlsb2MgPSBzdHJpbmcgKyBsZW47CisJCWVuZCA9IHN0cmluZyAtIDE7CisJCWlmIChmbGFncyA9PSAoU0NBTl9NT1ZFX0ZST01fUklHSFQgKyBTQ0FOX01BVENIX0xFRlRfSEFMRikpIHsKKwkJCS8qIENhc2UgMjoKKwkJCSAqICJxd2VydHkiIGRvZXMgbm90IG1hdGNoIGFnYWluc3QgcGF0dGVybiAicXoqIiwKKwkJCSAqIG5vIHBvaW50IGluIHRyeWluZyB0byBtYXRjaCAicXdlcnQiLCAicXdlciIgZXRjOgorCQkJICovCisJCQljb25zdCBjaGFyICpwID0gcGF0dGVybiArIHN0cmxlbihwYXR0ZXJuKTsKKwkJCWlmICgtLXAgPj0gcGF0dGVybiAmJiAqcCA9PSAnKicpIHsKKwkJCQllYXJseV9leGl0ID0gMTsKKwkJCQl3aGlsZSAoLS1wID49IHBhdHRlcm4gJiYgKnAgPT0gJ1xcJykKKwkJCQkJZWFybHlfZXhpdCBePSAxOworCQkJfQorCQl9CisJfQorCisJd2hpbGUgKGxvYyAhPSBlbmQpIHsKKwkJY2hhciBjOworCQlpbnQgcjsKKworCQljID0gKmxvYzsKKwkJaWYgKGZsYWdzICYgU0NBTl9NQVRDSF9MRUZUX0hBTEYpIHsKKwkJCSpsb2MgPSAnXDAnOworCQkJciA9IGZubWF0Y2gocGF0dGVybiwgc3RyaW5nLCAwKTsKKwkJCSpsb2MgPSBjOworCQl9IGVsc2UgeworCQkJciA9IGZubWF0Y2gocGF0dGVybiwgbG9jLCAwKTsKKwkJfQorCQlpZiAociA9PSAwKSAvKiBtYXRjaCBmb3VuZCAqLworCQkJcmV0dXJuIGxvYzsKKwkJaWYgKGVhcmx5X2V4aXQpIHsKKyNpZmRlZiBTVEFOREFMT05FCisJCQlwcmludGYoIihlYXJseSBleGl0KSAiKTsKKyNlbmRpZgorCQkJYnJlYWs7CisJCX0KKworCQlpZiAoZmxhZ3MgJiBTQ0FOX01PVkVfRlJPTV9MRUZUKSB7CisJCQlsb2MrKzsKKwkJfSBlbHNlIHsKKwkJCWxvYy0tOworCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCisjaWZkZWYgU1RBTkRBTE9ORQoraW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwljaGFyICpzdHJpbmc7CisJY2hhciAqb3A7CisJY2hhciAqcGF0dGVybjsKKwljaGFyICpsb2M7CisKKwlzZXR2YnVmKHN0ZG91dCwgTlVMTCwgX0lPTkJGLCAwKTsKKworCWlmICghYXJndlsxXSkgeworCQlwdXRzKAorCQkJIlVzYWdlOiBtYXRjaCA8dGVzdD4gW3Rlc3QuLi5dXG5cbiIKKwkJCSJXaGVyZSBhIDx0ZXN0PiBpcyB0aGUgZm9ybTogPHN0cmluZz48b3A+PG1hdGNoPlxuIgorCQkJIlRoaXMgaXMgdG8gdGVzdCB0aGUgc2hlbGwgJHt2YXIjdmFsfSBleHByZXNzaW9uIHR5cGUuXG5cbiIKKwkJCSJlLmcuIGBtYXRjaCAnYWJjI2EqJ2AgLT4gYmMiCisJCSk7CisJCXJldHVybiAxOworCX0KKworCXdoaWxlICgqKythcmd2KSB7CisJCXNpemVfdCBvZmY7CisJCXVuc2lnbmVkIHNjYW5fZmxhZ3M7CisKKwkJc3RyaW5nID0gKmFyZ3Y7CisJCW9mZiA9IHN0cmNzcG4oc3RyaW5nLCAiIyUiKTsKKwkJaWYgKCFvZmYpIHsKKwkJCXByaW50ZigiaW52YWxpZCBmb3JtYXRcbiIpOworCQkJY29udGludWU7CisJCX0KKwkJb3AgPSBzdHJpbmcgKyBvZmY7CisJCXNjYW5fZmxhZ3MgPSBwaWNrX3NjYW4ob3BbMF0sIG9wWzFdKTsKKworCQlwcmludGYoIiclcyc6IGZsYWdzOiV4LCAiLCBzdHJpbmcsIHNjYW5fZmxhZ3MpOworCQlwYXR0ZXJuID0gb3AgKyAxOworCQlpZiAob3BbMF0gPT0gb3BbMV0pCisJCQlwYXR0ZXJuKys7CisJCW9wWzBdID0gJ1wwJzsKKworCQlsb2MgPSBzY2FuX2FuZF9tYXRjaChzdHJpbmcsIHBhdHRlcm4sIHNjYW5fZmxhZ3MpOworCisJCWlmIChzY2FuX2ZsYWdzICYgU0NBTl9NQVRDSF9MRUZUX0hBTEYpIHsKKwkJCXByaW50ZigiJyVzJ1xuIiwgbG9jKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChsb2MpCisJCQkJKmxvYyA9ICdcMCc7CisJCQlwcmludGYoIiclcydcbiIsIHN0cmluZyk7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2hlbGwvbWF0Y2guaCBiL3NoZWxsL21hdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWEzOTNlZAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21hdGNoLmgKQEAgLTAsMCArMSwzNCBAQAorLyogbWF0Y2guaCAtIGludGVyZmFjZSB0byBzaGVsbCAjIy8lJSBtYXRjaGluZyBjb2RlICovCisKKyNpZm5kZWYgU0hFTExfTUFUQ0hfSAorI2RlZmluZSBTSEVMTF9NQVRDSF9IIDEKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKKy8vVE9ETyEgV2h5IGFzaC5jIHN0aWxsIHVzZXMgaW50ZXJuYWwgdmVyc2lvbj8hCisKK2VudW0geworCVNDQU5fTU9WRV9GUk9NX0xFRlQgPSAoMSA8PCAwKSwKKwlTQ0FOX01PVkVfRlJPTV9SSUdIVCA9ICgxIDw8IDEpLAorCVNDQU5fTUFUQ0hfTEVGVF9IQUxGID0gKDEgPDwgMiksCisJU0NBTl9NQVRDSF9SSUdIVF9IQUxGID0gKDEgPDwgMyksCit9OworCitjaGFyKiBGQVNUX0ZVTkMgc2Nhbl9hbmRfbWF0Y2goY2hhciAqc3RyaW5nLCBjb25zdCBjaGFyICpwYXR0ZXJuLCB1bnNpZ25lZCBmbGFncyk7CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgcGlja19zY2FuKGNoYXIgb3AxLCBjaGFyIG9wMikKK3sKKwl1bnNpZ25lZCBzY2FuX2ZsYWdzOworCWlmIChvcDEgPT0gJyMnKSB7CisJCXNjYW5fZmxhZ3MgPSBTQ0FOX01BVENIX0xFRlRfSEFMRiArCisJCQkob3AxID09IG9wMiA/IFNDQU5fTU9WRV9GUk9NX1JJR0hUIDogU0NBTl9NT1ZFX0ZST01fTEVGVCk7CisJfSBlbHNlIHsgLyogJSAqLworCQlzY2FuX2ZsYWdzID0gU0NBTl9NQVRDSF9SSUdIVF9IQUxGICsKKwkJCShvcDEgPT0gb3AyID8gU0NBTl9NT1ZFX0ZST01fTEVGVCA6IFNDQU5fTU9WRV9GUk9NX1JJR0hUKTsKKwl9CisJcmV0dXJuIHNjYW5fZmxhZ3M7Cit9CisKK1BPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2hlbGwvbWF0aC5jIGIvc2hlbGwvbWF0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwNjIyMWIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tYXRoLmMKQEAgLTAsMCArMSw3NTcgQEAKKy8qCisgKiBBcml0aG1ldGljIGNvZGUgcmlwcGVkIG91dCBvZiBhc2ggc2hlbGwgZm9yIGNvZGUgc2hhcmluZy4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIE9yaWdpbmFsIEJTRCBjb3B5cmlnaHQgbm90aWNlIGlzIHJldGFpbmVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MSwgMTk5MywgMTk5NAorICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNSBIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+CisgKiB3YXMgcmUtcG9ydGVkIGZyb20gTmV0QlNEIGFuZCBkZWJpYW5pemVkLgorICoKKyAqIHJld3JpdGUgYXJpdGgueSB0byBtaWNybyBzdGFjayBiYXNlZCBjcnlwdGljIGFsZ29yaXRobSBieQorICogQ29weXJpZ2h0IChjKSAyMDAxIEFhcm9uIExlaG1hbm4gPGFhcm9ubEB2aXRlbHVzLmNvbT4KKyAqCisgKiBNb2RpZmllZCBieSBQYXVsIE11bmR0IDxsZXRoYWxAbGludXgtc2gub3JnPiAoYykgMjAwNCB0byBzdXBwb3J0CisgKiBkeW5hbWljIHZhcmlhYmxlcy4KKyAqCisgKiBNb2RpZmllZCBieSBWbGFkaW1pciBPbGV5bmlrIDxkem9Ac2ltdHJlYXMucnU+IChjKSAyMDAxLTIwMDUgdG8gYmUKKyAqIHVzZWQgaW4gYnVzeWJveCBhbmQgc2l6ZSBvcHRpbWl6YXRpb25zLAorICogcmV3cm90ZSBhcml0aCAoc2VlIG5vdGVzIHRvIHRoaXMpLCBhZGRlZCBsb2NhbGUgc3VwcG9ydCwKKyAqIHJld3JvdGUgZHluYW1pYyB2YXJpYWJsZXMuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworLyogQ29weXJpZ2h0IChjKSAyMDAxIEFhcm9uIExlaG1hbm4gPGFhcm9ubEB2aXRlbHVzLmNvbT4KKyAqCisgKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcKKyAqIGEgY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZQorICogIlNvZnR3YXJlIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZworICogd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLAorICogZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvCisgKiBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8KKyAqIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZQorICogaW5jbHVkZWQgaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsCisgKiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YKKyAqIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4KKyAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZCisgKiBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULAorICogVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUKKyAqIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICovCisKKy8qIFRoaXMgaXMgbXkgaW5maXggcGFyc2VyL2V2YWx1YXRvci4gSXQgaXMgb3B0aW1pemVkIGZvciBzaXplLCBpbnRlbmRlZAorICogYXMgYSByZXBsYWNlbWVudCBmb3IgeWFjYy1iYXNlZCBwYXJzZXJzLiBIb3dldmVyLCBpdCBtYXkgd2VsbCBiZSBmYXN0ZXIKKyAqIHRoYW4gYSBjb21wYXJhYmxlIHBhcnNlciB3cml0dGVuIGluIHlhY2MuIFRoZSBzdXBwb3J0ZWQgb3BlcmF0b3JzIGFyZQorICogbGlzdGVkIGluICNkZWZpbmVzIGJlbG93LiBQYXJlbnMsIG9yZGVyIG9mIG9wZXJhdGlvbnMsIGFuZCBlcnJvciBoYW5kbGluZworICogYXJlIHN1cHBvcnRlZC4gVGhpcyBjb2RlIGlzIHRocmVhZCBzYWZlLiBUaGUgZXhhY3QgZXhwcmVzc2lvbiBmb3JtYXQgc2hvdWxkCisgKiBiZSB0aGF0IHdoaWNoIFBPU0lYIHNwZWNpZmllcyBmb3Igc2hlbGxzLgorICoKKyAqIFRoZSBjb2RlIHVzZXMgYSBzaW1wbGUgdHdvLXN0YWNrIGFsZ29yaXRobS4gU2VlCisgKiBodHRwOi8vd3d3Lm9udGhlbmV0LmNvbS5hdS9+Z3JhaGFtaXMvaW50MjAwOC93ZWVrMDIvbGVjdDAyLmh0bWwKKyAqIGZvciBhIGRldGFpbGVkIGV4cGxhbmF0aW9uIG9mIHRoZSBpbmZpeC10by1wb3N0Zml4IGFsZ29yaXRobSBvbiB3aGljaAorICogdGhpcyBpcyBiYXNlZCAodGhpcyBjb2RlIGRpZmZlcnMgaW4gdGhhdCBpdCBhcHBsaWVzIG9wZXJhdG9ycyBpbW1lZGlhdGVseQorICogdG8gdGhlIHN0YWNrIGluc3RlYWQgb2YgYWRkaW5nIHRoZW0gdG8gYSBxdWV1ZSB0byBlbmQgdXAgd2l0aCBhbgorICogZXhwcmVzc2lvbikuCisgKi8KKworLyoKKyAqIEF1ZyAyNCwgMjAwMSAgICAgICAgICAgICAgTWFudWVsIE5vdm9hIElJSQorICoKKyAqIFJlZHVjZWQgdGhlIGdlbmVyYXRlZCBjb2RlIHNpemUgYnkgYWJvdXQgMzAlIChpMzg2KSBhbmQgZml4ZWQgc2V2ZXJhbCBidWdzLgorICoKKyAqIDEpIEluIGFyaXRoX2FwcGx5KCk6CisgKiAgICBhKSBDYWNoZWQgdmFsdWVzIG9mICpudW1wdHIgYW5kICYobnVtcHRyWy0xXSkuCisgKiAgICBiKSBSZW1vdmVkIHJlZHVuZGFudCB0ZXN0IGZvciB6ZXJvIGRlbm9taW5hdG9yLgorICoKKyAqIDIpIEluIGFyaXRoKCk6CisgKiAgICBhKSBFbGltaW5hdGVkIHJlZHVuZGFudCBjb2RlIGZvciBwcm9jZXNzaW5nIG9wZXJhdG9yIHRva2VucyBieSBtb3ZpbmcKKyAqICAgICAgIHRvIGEgdGFibGUtYmFzZWQgaW1wbGVtZW50YXRpb24uICBBbHNvIGZvbGRlZCBoYW5kbGluZyBvZiBwYXJlbnMKKyAqICAgICAgIGludG8gdGhlIHRhYmxlLgorICogICAgYikgQ29tYmluZWQgYWxsIDMgbG9vcHMgd2hpY2ggY2FsbGVkIGFyaXRoX2FwcGx5IHRvIHJlZHVjZSBnZW5lcmF0ZWQKKyAqICAgICAgIGNvZGUgc2l6ZSBhdCB0aGUgY29zdCBvZiBzcGVlZC4KKyAqCisgKiAzKSBUaGUgZm9sbG93aW5nIGV4cHJlc3Npb25zIHdlcmUgdHJlYXRlZCBhcyB2YWxpZCBieSB0aGUgb3JpZ2luYWwgY29kZToKKyAqICAgICAgIDEoKSAgLCAgICAwISAgLCAgICAxICggKjMgKSAgIC4KKyAqICAgIFRoZXNlIGJ1Z3MgaGF2ZSBiZWVuIGZpeGVkIGJ5IGludGVybmFsbHkgZW5jbG9zaW5nIHRoZSBleHByZXNzaW9uIGluCisgKiAgICBwYXJlbnMgYW5kIHRoZW4gY2hlY2tpbmcgdGhhdCBhbGwgYmluYXJ5IG9wcyBhbmQgcmlnaHQgcGFyZW5zIGFyZQorICogICAgcHJlY2VkZWQgYnkgYSB2YWxpZCBleHByZXNzaW9uIChOVU1fVE9LRU4pLgorICoKKyAqIE5vdGU6IEl0IG1heSBiZSBkZXNpcmFibGUgdG8gcmVwbGFjZSBBYXJvbidzIHRlc3QgZm9yIHdoaXRlc3BhY2Ugd2l0aAorICogY3R5cGUncyBpc3NwYWNlKCkgaWYgaXQgaXMgdXNlZCBieSBhbm90aGVyIGJ1c3lib3ggYXBwbGV0IG9yIGlmIGFkZGl0aW9uYWwKKyAqIHdoaXRlc3BhY2UgY2hhcnMgc2hvdWxkIGJlIGNvbnNpZGVyZWQuICBMb29rIGJlbG93IHRoZSAiI2luY2x1ZGUicyBmb3IgYQorICogcHJlY29tcGlsZXIgdGVzdC4KKyAqLworLyoKKyAqIEF1ZyAyNiwgMjAwMSAgICAgICAgICAgICAgTWFudWVsIE5vdm9hIElJSQorICoKKyAqIFJldHVybiAwIGZvciBudWxsIGV4cHJlc3Npb25zLiAgUG9pbnRlZCBvdXQgYnkgVmxhZGltaXIgT2xleW5pay4KKyAqCisgKiBNZXJnZSBpbiBBYXJvbidzIGNvbW1lbnRzIHByZXZpb3VzbHkgcG9zdGVkIHRvIHRoZSBidXN5Ym94IGxpc3QsCisgKiBtb2RpZmllZCBzbGlnaHRseSB0byB0YWtlIGFjY291bnQgb2YgbXkgY2hhbmdlcyB0byB0aGUgY29kZS4KKyAqCisgKi8KKy8qCisgKiAgKEMpIDIwMDMgVmxhZGltaXIgT2xleW5payA8ZHpvQHNpbXRyZWFzLnJ1PgorICoKKyAqIC0gYWxsb3cgYWNjZXNzIHRvIHZhcmlhYmxlLAorICogICB1c2UgcmVjdXJzaXZlIHZhbHVlIGluZGlyZWN0aW9uOiBjPSIyKjIiOyBhPSJjIjsgZWNobyAkKChhKz0yKSkgcHJvZHVjZSA2CisgKiAtIGltcGxlbWVudCBhc3NpZ24gc3ludGF4IChWQVI9ZXhwciwgKz0sICo9IGV0YykKKyAqIC0gaW1wbGVtZW50IGV4cG9uZW50aWF0aW9uICgqKiBvcGVyYXRvcikKKyAqIC0gaW1wbGVtZW50IGNvbW1hIHNlcGFyYXRlZCAtIGV4cHIsIGV4cHIKKyAqIC0gaW1wbGVtZW50ICsrZXhwciAtLWV4cHIgZXhwcisrIGV4cHItLQorICogLSBpbXBsZW1lbnQgZXhwciA/IGV4cHIgOiBleHByIChidXQgc2Vjb25kIGV4cHIgaXMgYWx3YXlzIGNhbGN1bGF0ZWQpCisgKiAtIGFsbG93IGhleGFkZWNpbWFsIGFuZCBvY3RhbCBudW1iZXJzCisgKiAtIHJlc3RvcmUgbG9zdCBYT1Igb3BlcmF0b3IKKyAqIC0gcHJvdGVjdCAkKChudW0gbnVtKSkgYXMgdHJ1ZSB6ZXJvIGV4cHIgKE1hbnVlbCdzIGVycm9yKQorICogLSBhbHdheXMgdXNlIHNwZWNpYWwgaXNzcGFjZSgpLCBzZWUgY29tbWVudCBmcm9tIGJhc2ggOy0pCisgKi8KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgIm1hdGguaCIKKworI2RlZmluZSBsb29rdXB2YXIgKG1hdGhfc3RhdGUtPmxvb2t1cHZhcikKKyNkZWZpbmUgc2V0dmFyICAgIChtYXRoX3N0YXRlLT5zZXR2YXIgICApCisvLyNkZWZpbmUgZW5kb2ZuYW1lIChtYXRoX3N0YXRlLT5lbmRvZm5hbWUpCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBvcGVyYXRvcjsKKworLyogQW4gb3BlcmF0b3IncyB0b2tlbiBpZCBpcyBhIGJpdCBvZiBhIGJpdGZpZWxkLiBUaGUgbG93ZXIgNSBiaXRzIGFyZSB0aGUKKyAqIHByZWNlZGVuY2UsIGFuZCAzIGhpZ2ggYml0cyBhcmUgYW4gSUQgdW5pcXVlIGFjcm9zcyBvcGVyYXRvcnMgb2YgdGhhdAorICogcHJlY2VkZW5jZS4gVGhlIElEIHBvcnRpb24gaXMgc28gdGhhdCBtdWx0aXBsZSBvcGVyYXRvcnMgY2FuIGhhdmUgdGhlCisgKiBzYW1lIHByZWNlZGVuY2UsIGVuc3VyaW5nIHRoYXQgdGhlIGxlZnRtb3N0IG9uZSBpcyBldmFsdWF0ZWQgZmlyc3QuCisgKiBDb25zaWRlciAqIGFuZCAvCisgKi8KKyNkZWZpbmUgdG9rX2RlY2wocHJlYyxpZCkgICAgICAgKCgoaWQpPDw1KSB8IChwcmVjKSkKKyNkZWZpbmUgUFJFQyhvcCkgICAgICAgICAgICAgICAgKChvcCkgJiAweDFGKQorCisjZGVmaW5lIFRPS19MUEFSRU4gICAgICAgICAgICAgIHRva19kZWNsKDAsMCkKKworI2RlZmluZSBUT0tfQ09NTUEgICAgICAgICAgICAgICB0b2tfZGVjbCgxLDApCisKKy8qIEFsbCBhc3NpZ25tZW50cyBhcmUgcmlnaHQgYXNzb2NpYXRpdmUgYW5kIGhhdmUgdGhlIHNhbWUgcHJlY2VkZW5jZSwKKyAqIGJ1dCB0aGVyZSBhcmUgMTEgb2YgdGhlbSwgd2hpY2ggZG9lc24ndCBmaXQgaW50byAzIGJpdHMgZm9yIHVuaXF1ZSBpZC4KKyAqIEFidXNpbmcgYW5vdGhlciBwcmVjZWRlbmNlIGxldmVsOgorICovCisjZGVmaW5lIFRPS19BU1NJR04gICAgICAgICAgICAgIHRva19kZWNsKDIsMCkKKyNkZWZpbmUgVE9LX0FORF9BU1NJR04gICAgICAgICAgdG9rX2RlY2woMiwxKQorI2RlZmluZSBUT0tfT1JfQVNTSUdOICAgICAgICAgICB0b2tfZGVjbCgyLDIpCisjZGVmaW5lIFRPS19YT1JfQVNTSUdOICAgICAgICAgIHRva19kZWNsKDIsMykKKyNkZWZpbmUgVE9LX1BMVVNfQVNTSUdOICAgICAgICAgdG9rX2RlY2woMiw0KQorI2RlZmluZSBUT0tfTUlOVVNfQVNTSUdOICAgICAgICB0b2tfZGVjbCgyLDUpCisjZGVmaW5lIFRPS19MU0hJRlRfQVNTSUdOICAgICAgIHRva19kZWNsKDIsNikKKyNkZWZpbmUgVE9LX1JTSElGVF9BU1NJR04gICAgICAgdG9rX2RlY2woMiw3KQorCisjZGVmaW5lIFRPS19NVUxfQVNTSUdOICAgICAgICAgIHRva19kZWNsKDMsMCkKKyNkZWZpbmUgVE9LX0RJVl9BU1NJR04gICAgICAgICAgdG9rX2RlY2woMywxKQorI2RlZmluZSBUT0tfUkVNX0FTU0lHTiAgICAgICAgICB0b2tfZGVjbCgzLDIpCisKKyNkZWZpbmUgZml4X2Fzc2lnbm1lbnRfcHJlYyhwcmVjKSBkbyB7IGlmIChwcmVjID09IDMpIHByZWMgPSAyOyB9IHdoaWxlICgwKQorCisvKiBUZXJuYXJ5IGNvbmRpdGlvbmFsIG9wZXJhdG9yIGlzIHJpZ2h0IGFzc29jaWF0aXZlIHRvbyAqLworI2RlZmluZSBUT0tfQ09ORElUSU9OQUwgICAgICAgICB0b2tfZGVjbCg0LDApCisjZGVmaW5lIFRPS19DT05ESVRJT05BTF9TRVAgICAgIHRva19kZWNsKDQsMSkKKworI2RlZmluZSBUT0tfT1IgICAgICAgICAgICAgICAgICB0b2tfZGVjbCg1LDApCisKKyNkZWZpbmUgVE9LX0FORCAgICAgICAgICAgICAgICAgdG9rX2RlY2woNiwwKQorCisjZGVmaW5lIFRPS19CT1IgICAgICAgICAgICAgICAgIHRva19kZWNsKDcsMCkKKworI2RlZmluZSBUT0tfQlhPUiAgICAgICAgICAgICAgICB0b2tfZGVjbCg4LDApCisKKyNkZWZpbmUgVE9LX0JBTkQgICAgICAgICAgICAgICAgdG9rX2RlY2woOSwwKQorCisjZGVmaW5lIFRPS19FUSAgICAgICAgICAgICAgICAgIHRva19kZWNsKDEwLDApCisjZGVmaW5lIFRPS19ORSAgICAgICAgICAgICAgICAgIHRva19kZWNsKDEwLDEpCisKKyNkZWZpbmUgVE9LX0xUICAgICAgICAgICAgICAgICAgdG9rX2RlY2woMTEsMCkKKyNkZWZpbmUgVE9LX0dUICAgICAgICAgICAgICAgICAgdG9rX2RlY2woMTEsMSkKKyNkZWZpbmUgVE9LX0dFICAgICAgICAgICAgICAgICAgdG9rX2RlY2woMTEsMikKKyNkZWZpbmUgVE9LX0xFICAgICAgICAgICAgICAgICAgdG9rX2RlY2woMTEsMykKKworI2RlZmluZSBUT0tfTFNISUZUICAgICAgICAgICAgICB0b2tfZGVjbCgxMiwwKQorI2RlZmluZSBUT0tfUlNISUZUICAgICAgICAgICAgICB0b2tfZGVjbCgxMiwxKQorCisjZGVmaW5lIFRPS19BREQgICAgICAgICAgICAgICAgIHRva19kZWNsKDEzLDApCisjZGVmaW5lIFRPS19TVUIgICAgICAgICAgICAgICAgIHRva19kZWNsKDEzLDEpCisKKyNkZWZpbmUgVE9LX01VTCAgICAgICAgICAgICAgICAgdG9rX2RlY2woMTQsMCkKKyNkZWZpbmUgVE9LX0RJViAgICAgICAgICAgICAgICAgdG9rX2RlY2woMTQsMSkKKyNkZWZpbmUgVE9LX1JFTSAgICAgICAgICAgICAgICAgdG9rX2RlY2woMTQsMikKKworLyogRXhwb25lbnQgaXMgcmlnaHQgYXNzb2NpYXRpdmUgKi8KKyNkZWZpbmUgVE9LX0VYUE9ORU5UICAgICAgICAgICAgdG9rX2RlY2woMTUsMSkKKworLyogVW5hcnkgb3BlcmF0b3JzICovCisjZGVmaW5lIFVOQVJZUFJFQyAgICAgICAgICAgICAgIDE2CisjZGVmaW5lIFRPS19CTk9UICAgICAgICAgICAgICAgIHRva19kZWNsKFVOQVJZUFJFQywwKQorI2RlZmluZSBUT0tfTk9UICAgICAgICAgICAgICAgICB0b2tfZGVjbChVTkFSWVBSRUMsMSkKKworI2RlZmluZSBUT0tfVU1JTlVTICAgICAgICAgICAgICB0b2tfZGVjbChVTkFSWVBSRUMrMSwwKQorI2RlZmluZSBUT0tfVVBMVVMgICAgICAgICAgICAgICB0b2tfZGVjbChVTkFSWVBSRUMrMSwxKQorCisjZGVmaW5lIFBSRUNfUFJFICAgICAgICAgICAgICAgIChVTkFSWVBSRUMrMikKKworI2RlZmluZSBUT0tfUFJFX0lOQyAgICAgICAgICAgICB0b2tfZGVjbChQUkVDX1BSRSwgMCkKKyNkZWZpbmUgVE9LX1BSRV9ERUMgICAgICAgICAgICAgdG9rX2RlY2woUFJFQ19QUkUsIDEpCisKKyNkZWZpbmUgUFJFQ19QT1NUICAgICAgICAgICAgICAgKFVOQVJZUFJFQyszKQorCisjZGVmaW5lIFRPS19QT1NUX0lOQyAgICAgICAgICAgIHRva19kZWNsKFBSRUNfUE9TVCwgMCkKKyNkZWZpbmUgVE9LX1BPU1RfREVDICAgICAgICAgICAgdG9rX2RlY2woUFJFQ19QT1NULCAxKQorCisjZGVmaW5lIFNQRUNfUFJFQyAgICAgICAgICAgICAgIChVTkFSWVBSRUMrNCkKKworI2RlZmluZSBUT0tfTlVNICAgICAgICAgICAgICAgICB0b2tfZGVjbChTUEVDX1BSRUMsIDApCisjZGVmaW5lIFRPS19SUEFSRU4gICAgICAgICAgICAgIHRva19kZWNsKFNQRUNfUFJFQywgMSkKKworc3RhdGljIGludAoraXNfYXNzaWduX29wKG9wZXJhdG9yIG9wKQoreworCW9wZXJhdG9yIHByZWMgPSBQUkVDKG9wKTsKKwlmaXhfYXNzaWdubWVudF9wcmVjKHByZWMpOworCXJldHVybiBwcmVjID09IFBSRUMoVE9LX0FTU0lHTikKKwl8fCBwcmVjID09IFBSRUNfUFJFCisJfHwgcHJlYyA9PSBQUkVDX1BPU1Q7Cit9CisKK3N0YXRpYyBpbnQKK2lzX3JpZ2h0X2Fzc29jaWF0aXZlKG9wZXJhdG9yIHByZWMpCit7CisJcmV0dXJuIHByZWMgPT0gUFJFQyhUT0tfQVNTSUdOKQorCXx8IHByZWMgPT0gUFJFQyhUT0tfRVhQT05FTlQpCisJfHwgcHJlYyA9PSBQUkVDKFRPS19DT05ESVRJT05BTCk7Cit9CisKKwordHlwZWRlZiBzdHJ1Y3QgeworCWFyaXRoX3QgdmFsOworCS8qIFdlIGFjcXVpcmUgc2Vjb25kX3ZhbCBvbmx5IHdoZW4gImV4cHIxIDogZXhwcjIiIHBhcnQKKwkgKiBvZiB0ZXJuYXJ5ID86IG9wIGlzIGV2YWx1YXRlZC4KKwkgKiBXZSB0cmVhdCA/OiBhcyB0d28gYmluYXJ5IG9wczogKGV4cHIgPyAoZXhwcjEgOiBleHByMikpLgorCSAqICc6JyBwcm9kdWNlcyBhIG5ldyB2YWx1ZSB3aGljaCBoYXMgdHdvIHBhcnRzLCB2YWwgYW5kIHNlY29uZF92YWw7CisJICogdGhlbiAnPycgc2VsZWN0cyBvbmUgb2YgdGhlbSBiYXNlZCBvbiBpdHMgbGVmdCBzaWRlLgorCSAqLworCWFyaXRoX3Qgc2Vjb25kX3ZhbDsKKwljaGFyIHNlY29uZF92YWxfcHJlc2VudDsKKwkvKiBJZiBOVUxMIHRoZW4gaXQncyBqdXN0IGEgbnVtYmVyLCBlbHNlIGl0J3MgYSBuYW1lZCB2YXJpYWJsZSAqLworCWNoYXIgKnZhcjsKK30gdmFyX29yX251bV90OworCit0eXBlZGVmIHN0cnVjdCByZW1lbWJlcmVkX25hbWUgeworCXN0cnVjdCByZW1lbWJlcmVkX25hbWUgKm5leHQ7CisJY29uc3QgY2hhciAqdmFyOworfSByZW1lbWJlcmVkX25hbWU7CisKKworc3RhdGljIGFyaXRoX3QgRkFTVF9GVU5DCitldmFsdWF0ZV9zdHJpbmcoYXJpdGhfc3RhdGVfdCAqbWF0aF9zdGF0ZSwgY29uc3QgY2hhciAqZXhwcik7CisKK3N0YXRpYyBjb25zdCBjaGFyKgorYXJpdGhfbG9va3VwX3ZhbChhcml0aF9zdGF0ZV90ICptYXRoX3N0YXRlLCB2YXJfb3JfbnVtX3QgKnQpCit7CisJaWYgKHQtPnZhcikgeworCQljb25zdCBjaGFyICpwID0gbG9va3VwdmFyKHQtPnZhcik7CisJCWlmIChwKSB7CisJCQlyZW1lbWJlcmVkX25hbWUgKmN1cjsKKwkJCXJlbWVtYmVyZWRfbmFtZSBjdXJfc2F2ZTsKKworCQkJLyogZGlkIHdlIGFscmVhZHkgc2VlIHRoaXMgbmFtZT8KKwkJCSAqIHRlc3RjYXNlOiBhPWI7IGI9YTsgZWNobyAkKChhKSkKKwkJCSAqLworCQkJZm9yIChjdXIgPSBtYXRoX3N0YXRlLT5saXN0X29mX3JlY3Vyc2VkX25hbWVzOyBjdXI7IGN1ciA9IGN1ci0+bmV4dCkgeworCQkJCWlmIChzdHJjbXAoY3VyLT52YXIsIHQtPnZhcikgPT0gMCkgeworCQkJCQkvKiBZZXMgKi8KKwkJCQkJcmV0dXJuICJleHByZXNzaW9uIHJlY3Vyc2lvbiBsb29wIGRldGVjdGVkIjsKKwkJCQl9CisJCQl9CisKKwkJCS8qIHB1c2ggY3VycmVudCB2YXIgbmFtZSAqLworCQkJY3VyID0gbWF0aF9zdGF0ZS0+bGlzdF9vZl9yZWN1cnNlZF9uYW1lczsKKwkJCWN1cl9zYXZlLnZhciA9IHQtPnZhcjsKKwkJCWN1cl9zYXZlLm5leHQgPSBjdXI7CisJCQltYXRoX3N0YXRlLT5saXN0X29mX3JlY3Vyc2VkX25hbWVzID0gJmN1cl9zYXZlOworCisJCQkvKiByZWN1cnNpdmVseSBldmFsdWF0ZSBwIGFzIGV4cHJlc3Npb24gKi8KKwkJCXQtPnZhbCA9IGV2YWx1YXRlX3N0cmluZyhtYXRoX3N0YXRlLCBwKTsKKworCQkJLyogcG9wIGN1cnJlbnQgdmFyIG5hbWUgKi8KKwkJCW1hdGhfc3RhdGUtPmxpc3Rfb2ZfcmVjdXJzZWRfbmFtZXMgPSBjdXI7CisKKwkJCXJldHVybiBtYXRoX3N0YXRlLT5lcnJtc2c7CisJCX0KKwkJLyogdHJlYXQgdW5kZWZpbmVkIHZhciBhcyAwICovCisJCXQtPnZhbCA9IDA7CisJfQorCXJldHVybiAwOworfQorCisvKiAiQXBwbHlpbmciIGEgdG9rZW4gbWVhbnMgcGVyZm9ybWluZyBpdCBvbiB0aGUgdG9wIGVsZW1lbnRzIG9uIHRoZSBpbnRlZ2VyCisgKiBzdGFjay4gRm9yIGFuIHVuYXJ5IG9wZXJhdG9yIGl0IHdpbGwgb25seSBjaGFuZ2UgdGhlIHRvcCBlbGVtZW50LCBidXQgYQorICogYmluYXJ5IG9wZXJhdG9yIHdpbGwgcG9wIHR3byBhcmd1bWVudHMgYW5kIHB1c2ggdGhlIHJlc3VsdCAqLworc3RhdGljIE5PSU5MSU5FIGNvbnN0IGNoYXIqCithcml0aF9hcHBseShhcml0aF9zdGF0ZV90ICptYXRoX3N0YXRlLCBvcGVyYXRvciBvcCwgdmFyX29yX251bV90ICpudW1zdGFjaywgdmFyX29yX251bV90ICoqbnVtc3RhY2twdHIpCit7CisjZGVmaW5lIE5VTVBUUiAoKm51bXN0YWNrcHRyKQorCisJdmFyX29yX251bV90ICp0b3Bfb2Zfc3RhY2s7CisJYXJpdGhfdCByZXo7CisJY29uc3QgY2hhciAqZXJyOworCisJLyogVGhlcmUgaXMgbm8gb3BlcmF0b3IgdGhhdCBjYW4gd29yayB3aXRob3V0IGFyZ3VtZW50cyAqLworCWlmIChOVU1QVFIgPT0gbnVtc3RhY2spCisJCWdvdG8gZXJyOworCisJdG9wX29mX3N0YWNrID0gTlVNUFRSIC0gMTsKKworCS8qIFJlc29sdmUgbmFtZSB0byB2YWx1ZSwgaWYgbmVlZGVkICovCisJZXJyID0gYXJpdGhfbG9va3VwX3ZhbChtYXRoX3N0YXRlLCB0b3Bfb2Zfc3RhY2spOworCWlmIChlcnIpCisJCXJldHVybiBlcnI7CisKKwlyZXogPSB0b3Bfb2Zfc3RhY2stPnZhbDsKKwlpZiAob3AgPT0gVE9LX1VNSU5VUykKKwkJcmV6ID0gLXJlejsKKwllbHNlIGlmIChvcCA9PSBUT0tfTk9UKQorCQlyZXogPSAhcmV6OworCWVsc2UgaWYgKG9wID09IFRPS19CTk9UKQorCQlyZXogPSB+cmV6OworCWVsc2UgaWYgKG9wID09IFRPS19QT1NUX0lOQyB8fCBvcCA9PSBUT0tfUFJFX0lOQykKKwkJcmV6Kys7CisJZWxzZSBpZiAob3AgPT0gVE9LX1BPU1RfREVDIHx8IG9wID09IFRPS19QUkVfREVDKQorCQlyZXotLTsKKwllbHNlIGlmIChvcCAhPSBUT0tfVVBMVVMpIHsKKwkJLyogQmluYXJ5IG9wZXJhdG9ycyAqLworCQlhcml0aF90IHJpZ2h0X3NpZGVfdmFsOworCQljaGFyIGJhZF9zZWNvbmRfdmFsOworCisJCS8qIEJpbmFyeSBvcGVyYXRvcnMgbmVlZCB0d28gYXJndW1lbnRzICovCisJCWlmICh0b3Bfb2Zfc3RhY2sgPT0gbnVtc3RhY2spCisJCQlnb3RvIGVycjsKKwkJLyogLi4uYW5kIHRoZXkgcG9wIG9uZSAqLworCQlOVU1QVFIgPSB0b3Bfb2Zfc3RhY2s7IC8qIHRoaXMgZGVjcmVtZW50cyBOVU1QVFIgKi8KKworCQliYWRfc2Vjb25kX3ZhbCA9IHRvcF9vZl9zdGFjay0+c2Vjb25kX3ZhbF9wcmVzZW50OworCQlpZiAob3AgPT0gVE9LX0NPTkRJVElPTkFMKSB7IC8qID8gb3BlcmF0aW9uICovCisJCQkvKiBNYWtlIG5leHQgaWYgKC4uLikgcHJvdGVjdCBhZ2FpbnN0CisJCQkgKiAkKChleHByMSA/IGV4cHIyKSkgLSB0aGF0IGlzLCBtaXNzaW5nICI6IGV4cHIiICovCisJCQliYWRfc2Vjb25kX3ZhbCA9ICFiYWRfc2Vjb25kX3ZhbDsKKwkJfQorCQlpZiAoYmFkX3NlY29uZF92YWwpIHsKKwkJCS8qIFByb3RlY3QgYWdhaW5zdCAkKChleHByIDxub3RfP19vcD4gZXhwcjEgOiBleHByMikpICovCisJCQlyZXR1cm4gIm1hbGZvcm1lZCA/OiBvcGVyYXRvciI7CisJCX0KKworCQl0b3Bfb2Zfc3RhY2stLTsgLyogbm93IHBvaW50cyB0byBsZWZ0IHNpZGUgKi8KKworCQlpZiAob3AgIT0gVE9LX0FTU0lHTikgeworCQkJLyogUmVzb2x2ZSBsZWZ0IHNpZGUgdmFsdWUgKHVubGVzcyB0aGUgb3AgaXMgJz0nKSAqLworCQkJZXJyID0gYXJpdGhfbG9va3VwX3ZhbChtYXRoX3N0YXRlLCB0b3Bfb2Zfc3RhY2spOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCQl9CisKKwkJcmlnaHRfc2lkZV92YWwgPSByZXo7CisJCXJleiA9IHRvcF9vZl9zdGFjay0+dmFsOworCQlpZiAob3AgPT0gVE9LX0NPTkRJVElPTkFMKSAvKiA/IG9wZXJhdGlvbiAqLworCQkJcmV6ID0gKHJleiA/IHJpZ2h0X3NpZGVfdmFsIDogdG9wX29mX3N0YWNrWzFdLnNlY29uZF92YWwpOworCQllbHNlIGlmIChvcCA9PSBUT0tfQ09ORElUSU9OQUxfU0VQKSB7IC8qIDogb3BlcmF0aW9uICovCisJCQlpZiAodG9wX29mX3N0YWNrID09IG51bXN0YWNrKSB7CisJCQkJLyogUHJvdGVjdCBhZ2FpbnN0ICQoKGV4cHIgOiBleHByKSkgKi8KKwkJCQlyZXR1cm4gIm1hbGZvcm1lZCA/OiBvcGVyYXRvciI7CisJCQl9CisJCQl0b3Bfb2Zfc3RhY2stPnNlY29uZF92YWxfcHJlc2VudCA9IG9wOworCQkJdG9wX29mX3N0YWNrLT5zZWNvbmRfdmFsID0gcmlnaHRfc2lkZV92YWw7CisJCX0KKwkJZWxzZSBpZiAob3AgPT0gVE9LX0JPUiB8fCBvcCA9PSBUT0tfT1JfQVNTSUdOKQorCQkJcmV6IHw9IHJpZ2h0X3NpZGVfdmFsOworCQllbHNlIGlmIChvcCA9PSBUT0tfT1IpCisJCQlyZXogPSByaWdodF9zaWRlX3ZhbCB8fCByZXo7CisJCWVsc2UgaWYgKG9wID09IFRPS19CQU5EIHx8IG9wID09IFRPS19BTkRfQVNTSUdOKQorCQkJcmV6ICY9IHJpZ2h0X3NpZGVfdmFsOworCQllbHNlIGlmIChvcCA9PSBUT0tfQlhPUiB8fCBvcCA9PSBUT0tfWE9SX0FTU0lHTikKKwkJCXJleiBePSByaWdodF9zaWRlX3ZhbDsKKwkJZWxzZSBpZiAob3AgPT0gVE9LX0FORCkKKwkJCXJleiA9IHJleiAmJiByaWdodF9zaWRlX3ZhbDsKKwkJZWxzZSBpZiAob3AgPT0gVE9LX0VRKQorCQkJcmV6ID0gKHJleiA9PSByaWdodF9zaWRlX3ZhbCk7CisJCWVsc2UgaWYgKG9wID09IFRPS19ORSkKKwkJCXJleiA9IChyZXogIT0gcmlnaHRfc2lkZV92YWwpOworCQllbHNlIGlmIChvcCA9PSBUT0tfR0UpCisJCQlyZXogPSAocmV6ID49IHJpZ2h0X3NpZGVfdmFsKTsKKwkJZWxzZSBpZiAob3AgPT0gVE9LX1JTSElGVCB8fCBvcCA9PSBUT0tfUlNISUZUX0FTU0lHTikKKwkJCXJleiA+Pj0gcmlnaHRfc2lkZV92YWw7CisJCWVsc2UgaWYgKG9wID09IFRPS19MU0hJRlQgfHwgb3AgPT0gVE9LX0xTSElGVF9BU1NJR04pCisJCQlyZXogPDw9IHJpZ2h0X3NpZGVfdmFsOworCQllbHNlIGlmIChvcCA9PSBUT0tfR1QpCisJCQlyZXogPSAocmV6ID4gcmlnaHRfc2lkZV92YWwpOworCQllbHNlIGlmIChvcCA9PSBUT0tfTFQpCisJCQlyZXogPSAocmV6IDwgcmlnaHRfc2lkZV92YWwpOworCQllbHNlIGlmIChvcCA9PSBUT0tfTEUpCisJCQlyZXogPSAocmV6IDw9IHJpZ2h0X3NpZGVfdmFsKTsKKwkJZWxzZSBpZiAob3AgPT0gVE9LX01VTCB8fCBvcCA9PSBUT0tfTVVMX0FTU0lHTikKKwkJCXJleiAqPSByaWdodF9zaWRlX3ZhbDsKKwkJZWxzZSBpZiAob3AgPT0gVE9LX0FERCB8fCBvcCA9PSBUT0tfUExVU19BU1NJR04pCisJCQlyZXogKz0gcmlnaHRfc2lkZV92YWw7CisJCWVsc2UgaWYgKG9wID09IFRPS19TVUIgfHwgb3AgPT0gVE9LX01JTlVTX0FTU0lHTikKKwkJCXJleiAtPSByaWdodF9zaWRlX3ZhbDsKKwkJZWxzZSBpZiAob3AgPT0gVE9LX0FTU0lHTiB8fCBvcCA9PSBUT0tfQ09NTUEpCisJCQlyZXogPSByaWdodF9zaWRlX3ZhbDsKKwkJZWxzZSBpZiAob3AgPT0gVE9LX0VYUE9ORU5UKSB7CisJCQlhcml0aF90IGM7CisJCQlpZiAocmlnaHRfc2lkZV92YWwgPCAwKQorCQkJCXJldHVybiAiZXhwb25lbnQgbGVzcyB0aGFuIDAiOworCQkJYyA9IDE7CisJCQl3aGlsZSAoLS1yaWdodF9zaWRlX3ZhbCA+PSAwKQorCQkJCWMgKj0gcmV6OworCQkJcmV6ID0gYzsKKwkJfQorCQllbHNlIGlmIChyaWdodF9zaWRlX3ZhbCA9PSAwKQorCQkJcmV0dXJuICJkaXZpZGUgYnkgemVybyI7CisJCWVsc2UgaWYgKG9wID09IFRPS19ESVYgfHwgb3AgPT0gVE9LX0RJVl9BU1NJR04KKwkJICAgICAgfHwgb3AgPT0gVE9LX1JFTSB8fCBvcCA9PSBUT0tfUkVNX0FTU0lHTikgeworCQkJLyoKKwkJCSAqIGJhc2ggNC4yLjQ1IHg4NiA2NGJpdDogU0VHViBvbiAnZWNobyAkKCgyKio2MyAvIC0xKSknCisJCQkgKgorCQkJICogTUFYX05FR0FUSVZFX0lOVCAvIC0xID0gTUFYX1BPU0lUSVZFX0lOVCsxCisJCQkgKiBhbmQgdGh1cyBpcyBub3QgcmVwcmVzZW50YWJsZS4KKwkJCSAqIFNvbWUgQ1BVcyBzZWdmYXVsdCB0cnlpbmcgc3VjaCBvcC4KKwkJCSAqIE90aGVycyBvdmVyZmxvdyBNQVhfUE9TSVRJVkVfSU5UKzEgdG8KKwkJCSAqIE1BWF9ORUdBVElWRV9JTlQgKDB4N2ZmZisxID0gMHg4MDAwKS4KKwkJCSAqIE1ha2Ugc3VyZSB0byBhdCBsZWFzdCBub3QgU0VHViBoZXJlOgorCQkJICovCisJCQlpZiAocmlnaHRfc2lkZV92YWwgPT0gLTEKKwkJCSAmJiByZXogPDwgMSA9PSAwIC8qIE1BWF9ORUdBVElWRV9JTlQgb3IgMCAqLworCQkJKSB7CisJCQkJcmlnaHRfc2lkZV92YWwgPSAxOworCQkJfQorCQkJaWYgKG9wID09IFRPS19ESVYgfHwgb3AgPT0gVE9LX0RJVl9BU1NJR04pCisJCQkJcmV6IC89IHJpZ2h0X3NpZGVfdmFsOworCQkJZWxzZSB7CisJCQkJcmV6ICU9IHJpZ2h0X3NpZGVfdmFsOworCQkJfQorCQl9CisJfQorCisJaWYgKGlzX2Fzc2lnbl9vcChvcCkpIHsKKwkJY2hhciBidWZbc2l6ZW9mKGFyaXRoX3QpKjMgKyAyXTsKKworCQlpZiAodG9wX29mX3N0YWNrLT52YXIgPT0gTlVMTCkgeworCQkJLyogSG1tLCAxPTIgPyAqLworLy9UT0RPOiBhY3R1YWxseSwgYmFzaCBhbGxvd3MgKys3IGJ1dCBmb3Igc29tZSByZWFzb24gaXQgZXZhbHMgdG8gNywgbm90IDgKKwkJCWdvdG8gZXJyOworCQl9CisJCS8qIFNhdmUgdG8gc2hlbGwgdmFyaWFibGUgKi8KKwkJc3ByaW50ZihidWYsIEFSSVRIX0ZNVCwgcmV6KTsKKwkJc2V0dmFyKHRvcF9vZl9zdGFjay0+dmFyLCBidWYpOworCQkvKiBBZnRlciBzYXZpbmcsIG1ha2UgcHJldmlvdXMgdmFsdWUgZm9yIHYrKyBvciB2LS0gKi8KKwkJaWYgKG9wID09IFRPS19QT1NUX0lOQykKKwkJCXJlei0tOworCQllbHNlIGlmIChvcCA9PSBUT0tfUE9TVF9ERUMpCisJCQlyZXorKzsKKwl9CisKKwl0b3Bfb2Zfc3RhY2stPnZhbCA9IHJlejsKKwkvKiBFcmFzZSB2YXIgbmFtZSwgaXQgaXMganVzdCBhIG51bWJlciBub3cgKi8KKwl0b3Bfb2Zfc3RhY2stPnZhciA9IE5VTEw7CisJcmV0dXJuIE5VTEw7CisgZXJyOgorCXJldHVybiAiYXJpdGhtZXRpYyBzeW50YXggZXJyb3IiOworI3VuZGVmIE5VTVBUUgorfQorCisvKiBsb25nZXN0IG11c3QgYmUgZmlyc3QgKi8KK3N0YXRpYyBjb25zdCBjaGFyIG9wX3Rva2Vuc1tdIEFMSUdOMSA9IHsKKwknPCcsJzwnLCc9JywwLCBUT0tfTFNISUZUX0FTU0lHTiwKKwknPicsJz4nLCc9JywwLCBUT0tfUlNISUZUX0FTU0lHTiwKKwknPCcsJzwnLCAgICAwLCBUT0tfTFNISUZULAorCSc+JywnPicsICAgIDAsIFRPS19SU0hJRlQsCisJJ3wnLCd8JywgICAgMCwgVE9LX09SLAorCScmJywnJicsICAgIDAsIFRPS19BTkQsCisJJyEnLCc9JywgICAgMCwgVE9LX05FLAorCSc8JywnPScsICAgIDAsIFRPS19MRSwKKwknPicsJz0nLCAgICAwLCBUT0tfR0UsCisJJz0nLCc9JywgICAgMCwgVE9LX0VRLAorCSd8JywnPScsICAgIDAsIFRPS19PUl9BU1NJR04sCisJJyYnLCc9JywgICAgMCwgVE9LX0FORF9BU1NJR04sCisJJyonLCc9JywgICAgMCwgVE9LX01VTF9BU1NJR04sCisJJy8nLCc9JywgICAgMCwgVE9LX0RJVl9BU1NJR04sCisJJyUnLCc9JywgICAgMCwgVE9LX1JFTV9BU1NJR04sCisJJysnLCc9JywgICAgMCwgVE9LX1BMVVNfQVNTSUdOLAorCSctJywnPScsICAgIDAsIFRPS19NSU5VU19BU1NJR04sCisJJy0nLCctJywgICAgMCwgVE9LX1BPU1RfREVDLAorCSdeJywnPScsICAgIDAsIFRPS19YT1JfQVNTSUdOLAorCScrJywnKycsICAgIDAsIFRPS19QT1NUX0lOQywKKwknKicsJyonLCAgICAwLCBUT0tfRVhQT05FTlQsCisJJyEnLCAgICAgICAgMCwgVE9LX05PVCwKKwknPCcsICAgICAgICAwLCBUT0tfTFQsCisJJz4nLCAgICAgICAgMCwgVE9LX0dULAorCSc9JywgICAgICAgIDAsIFRPS19BU1NJR04sCisJJ3wnLCAgICAgICAgMCwgVE9LX0JPUiwKKwknJicsICAgICAgICAwLCBUT0tfQkFORCwKKwknKicsICAgICAgICAwLCBUT0tfTVVMLAorCScvJywgICAgICAgIDAsIFRPS19ESVYsCisJJyUnLCAgICAgICAgMCwgVE9LX1JFTSwKKwknKycsICAgICAgICAwLCBUT0tfQURELAorCSctJywgICAgICAgIDAsIFRPS19TVUIsCisJJ14nLCAgICAgICAgMCwgVE9LX0JYT1IsCisJLyogdW5pcSAqLworCSd+JywgICAgICAgIDAsIFRPS19CTk9ULAorCScsJywgICAgICAgIDAsIFRPS19DT01NQSwKKwknPycsICAgICAgICAwLCBUT0tfQ09ORElUSU9OQUwsCisJJzonLCAgICAgICAgMCwgVE9LX0NPTkRJVElPTkFMX1NFUCwKKwknKScsICAgICAgICAwLCBUT0tfUlBBUkVOLAorCScoJywgICAgICAgIDAsIFRPS19MUEFSRU4sCisJMAorfTsKKyNkZWZpbmUgcHRyX3RvX3JwYXJlbiAoJm9wX3Rva2Vuc1tzaXplb2Yob3BfdG9rZW5zKS03XSkKKworc3RhdGljIGFyaXRoX3QgRkFTVF9GVU5DCitldmFsdWF0ZV9zdHJpbmcoYXJpdGhfc3RhdGVfdCAqbWF0aF9zdGF0ZSwgY29uc3QgY2hhciAqZXhwcikKK3sKKwlvcGVyYXRvciBsYXN0dG9rOworCWNvbnN0IGNoYXIgKmVycm1zZzsKKwljb25zdCBjaGFyICpzdGFydF9leHByID0gZXhwciA9IHNraXBfd2hpdGVzcGFjZShleHByKTsKKwl1bnNpZ25lZCBleHByX2xlbiA9IHN0cmxlbihleHByKSArIDI7CisJLyogU3RhY2sgb2YgaW50ZWdlcnMgKi8KKwkvKiBUaGUgcHJvb2YgdGhhdCB0aGVyZSBjYW4gYmUgbm8gbW9yZSB0aGFuIHN0cmxlbihzdGFydGJ1ZikvMisxCisJICogaW50ZWdlcnMgaW4gYW55IGdpdmVuIGNvcnJlY3Qgb3IgaW5jb3JyZWN0IGV4cHJlc3Npb24KKwkgKiBpcyBsZWZ0IGFzIGFuIGV4ZXJjaXNlIHRvIHRoZSByZWFkZXIuICovCisJdmFyX29yX251bV90ICpjb25zdCBudW1zdGFjayA9IGFsbG9jYSgoZXhwcl9sZW4gLyAyKSAqIHNpemVvZihudW1zdGFja1swXSkpOworCXZhcl9vcl9udW1fdCAqbnVtc3RhY2twdHIgPSBudW1zdGFjazsKKwkvKiBTdGFjayBvZiBvcGVyYXRvciB0b2tlbnMgKi8KKwlvcGVyYXRvciAqY29uc3Qgc3RhY2sgPSBhbGxvY2EoZXhwcl9sZW4gKiBzaXplb2Yoc3RhY2tbMF0pKTsKKwlvcGVyYXRvciAqc3RhY2twdHIgPSBzdGFjazsKKworCS8qIFN0YXJ0IHdpdGggYSBsZWZ0IHBhcmVuICovCisJKnN0YWNrcHRyKysgPSBsYXN0dG9rID0gVE9LX0xQQVJFTjsKKwllcnJtc2cgPSBOVUxMOworCisJd2hpbGUgKDEpIHsKKwkJY29uc3QgY2hhciAqcDsKKwkJb3BlcmF0b3Igb3A7CisJCW9wZXJhdG9yIHByZWM7CisJCWNoYXIgYXJpdGh2YWw7CisKKwkJZXhwciA9IHNraXBfd2hpdGVzcGFjZShleHByKTsKKwkJYXJpdGh2YWwgPSAqZXhwcjsKKwkJaWYgKGFyaXRodmFsID09ICdcMCcpIHsKKwkJCWlmIChleHByID09IHN0YXJ0X2V4cHIpIHsKKwkJCQkvKiBOdWxsIGV4cHJlc3Npb24gKi8KKwkJCQludW1zdGFjay0+dmFsID0gMDsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKworCQkJLyogVGhpcyBpcyBvbmx5IHJlYWNoZWQgYWZ0ZXIgYWxsIHRva2VucyBoYXZlIGJlZW4gZXh0cmFjdGVkIGZyb20gdGhlCisJCQkgKiBpbnB1dCBzdHJlYW0uIElmIHRoZXJlIGFyZSBzdGlsbCB0b2tlbnMgb24gdGhlIG9wZXJhdG9yIHN0YWNrLCB0aGV5CisJCQkgKiBhcmUgdG8gYmUgYXBwbGllZCBpbiBvcmRlci4gQXQgdGhlIGVuZCwgdGhlcmUgc2hvdWxkIGJlIGEgZmluYWwKKwkJCSAqIHJlc3VsdCBvbiB0aGUgaW50ZWdlciBzdGFjayAqLworCisJCQlpZiAoZXhwciAhPSBwdHJfdG9fcnBhcmVuICsgMSkgeworCQkJCS8qIElmIHdlIGhhdmVuJ3QgZG9uZSBzbyBhbHJlYWR5LAorCQkJCSAqIGFwcGVuZCBhIGNsb3NpbmcgcmlnaHQgcGFyZW4KKwkJCQkgKiBhbmQgbGV0IHRoZSBsb29wIHByb2Nlc3MgaXQgKi8KKwkJCQlleHByID0gcHRyX3RvX3JwYXJlbjsKKwkJCQljb250aW51ZTsKKwkJCX0KKwkJCS8qIEF0IHRoaXMgcG9pbnQsIHdlJ3JlIGRvbmUgd2l0aCB0aGUgZXhwcmVzc2lvbiAqLworCQkJaWYgKG51bXN0YWNrcHRyICE9IG51bXN0YWNrICsgMSkgeworCQkJCS8qIC4uLmJ1dCBpZiB0aGVyZSBpc24ndCwgaXQncyBiYWQgKi8KKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCWlmIChudW1zdGFjay0+dmFyKSB7CisJCQkJLyogZXhwcmVzc2lvbiBpcyAkKCh2YXIpKSBvbmx5LCBsb29rdXAgbm93ICovCisJCQkJZXJybXNnID0gYXJpdGhfbG9va3VwX3ZhbChtYXRoX3N0YXRlLCBudW1zdGFjayk7CisJCQl9CisJCQlnb3RvIHJldDsKKwkJfQorCisJCXAgPSBlbmRvZm5hbWUoZXhwcik7CisJCWlmIChwICE9IGV4cHIpIHsKKwkJCS8qIE5hbWUgKi8KKwkJCXNpemVfdCB2YXJfbmFtZV9zaXplID0gKHAtZXhwcikgKyAxOyAgLyogKzEgZm9yIE5VTCAqLworCQkJbnVtc3RhY2twdHItPnZhciA9IGFsbG9jYSh2YXJfbmFtZV9zaXplKTsKKwkJCXNhZmVfc3RybmNweShudW1zdGFja3B0ci0+dmFyLCBleHByLCB2YXJfbmFtZV9zaXplKTsKKwkJCWV4cHIgPSBwOworIG51bToKKwkJCW51bXN0YWNrcHRyLT5zZWNvbmRfdmFsX3ByZXNlbnQgPSAwOworCQkJbnVtc3RhY2twdHIrKzsKKwkJCWxhc3R0b2sgPSBUT0tfTlVNOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoaXNkaWdpdChhcml0aHZhbCkpIHsKKwkJCS8qIE51bWJlciAqLworCQkJbnVtc3RhY2twdHItPnZhciA9IE5VTEw7CisJCQllcnJubyA9IDA7CisJCQludW1zdGFja3B0ci0+dmFsID0gc3RydG9fYXJpdGhfdChleHByLCAoY2hhcioqKSAmZXhwciwgMCk7CisJCQlpZiAoZXJybm8pCisJCQkJbnVtc3RhY2twdHItPnZhbCA9IDA7IC8qIGJhc2ggY29tcGF0ICovCisJCQlnb3RvIG51bTsKKwkJfQorCisJCS8qIFNob3VsZCBiZSBhbiBvcGVyYXRvciAqLworCQlwID0gb3BfdG9rZW5zOworCQl3aGlsZSAoMSkgeworLy8gVE9ETzogYmFzaCBhbGxvd3MgNysrK3YsIHRyZWF0cyBpdCBhcyA3ICsgKyt2CisvLyB3ZSB0cmVhdCBpdCBhcyA3KysgKyB2IGFuZCByZWplY3QKKwkJCS8qIENvbXBhcmUgZXhwciB0byBjdXJyZW50IG9wX3Rva2Vuc1tdIGVsZW1lbnQgKi8KKwkJCWNvbnN0IGNoYXIgKmUgPSBleHByOworCQkJd2hpbGUgKDEpIHsKKwkJCQlpZiAoKnAgPT0gJ1wwJykgeworCQkJCQkvKiBNYXRjaDogb3BlcmF0b3IgaXMgZm91bmQgKi8KKwkJCQkJZXhwciA9IGU7CisJCQkJCWdvdG8gdG9rX2ZvdW5kOworCQkJCX0KKwkJCQlpZiAoKnAgIT0gKmUpCisJCQkJCWJyZWFrOworCQkJCXArKzsKKwkJCQllKys7CisJCQl9CisJCQkvKiBObyBtYXRjaCwgZ28gdG8gbmV4dCBlbGVtZW50IG9mIG9wX3Rva2Vuc1tdICovCisJCQl3aGlsZSAoKnApCisJCQkJcCsrOworCQkJcCArPSAyOyAvKiBza2lwIE5VTCBhbmQgVE9LX2ZvbyBieXRlcyAqLworCQkJaWYgKCpwID09ICdcMCcpIHsKKwkJCQkvKiBObyBuZXh0IGVsZW1lbnQsIG9wZXJhdG9yIG5vdCBmb3VuZCAqLworCQkJCS8vbWF0aF9zdGF0ZS0+c3ludGF4X2Vycm9yX2F0ID0gZXhwcjsKKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJfQorIHRva19mb3VuZDoKKwkJb3AgPSBwWzFdOyAvKiBmZXRjaCBUT0tfZm9vIHZhbHVlICovCisJCS8qIE5COiBleHByIG5vdyBwb2ludHMgcGFzdCB0aGUgb3BlcmF0b3IgKi8KKworCQkvKiBwb3N0IGdyYW1tYXI6IGErKyByZWR1Y2UgdG8gbnVtICovCisJCWlmIChsYXN0dG9rID09IFRPS19QT1NUX0lOQyB8fCBsYXN0dG9rID09IFRPS19QT1NUX0RFQykKKwkJCWxhc3R0b2sgPSBUT0tfTlVNOworCisJCS8qIFBsdXMgYW5kIG1pbnVzIGFyZSBiaW5hcnkgKG5vdCB1bmFyeSkgX29ubHlfIGlmIHRoZSBsYXN0CisJCSAqIHRva2VuIHdhcyBhIG51bWJlciwgb3IgYSByaWdodCBwYXJlbiAod2hpY2ggcHJldGVuZHMgdG8gYmUKKwkJICogYSBudW1iZXIsIHNpbmNlIGl0IGV2YWx1YXRlcyB0byBvbmUpLiBUaGluayBhYm91dCBpdC4KKwkJICogSXQgbWFrZXMgc2Vuc2UuICovCisJCWlmIChsYXN0dG9rICE9IFRPS19OVU0pIHsKKwkJCXN3aXRjaCAob3ApIHsKKwkJCWNhc2UgVE9LX0FERDoKKwkJCQlvcCA9IFRPS19VUExVUzsKKwkJCQlicmVhazsKKwkJCWNhc2UgVE9LX1NVQjoKKwkJCQlvcCA9IFRPS19VTUlOVVM7CisJCQkJYnJlYWs7CisJCQljYXNlIFRPS19QT1NUX0lOQzoKKwkJCQlvcCA9IFRPS19QUkVfSU5DOworCQkJCWJyZWFrOworCQkJY2FzZSBUT0tfUE9TVF9ERUM6CisJCQkJb3AgPSBUT0tfUFJFX0RFQzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQkvKiBXZSBkb24ndCB3YW50IGFuIHVuYXJ5IG9wZXJhdG9yIHRvIGNhdXNlIHJlY3Vyc2l2ZSBkZXNjZW50IG9uIHRoZQorCQkgKiBzdGFjaywgYmVjYXVzZSB0aGVyZSBjYW4gYmUgbWFueSBpbiBhIHJvdyBhbmQgaXQgY291bGQgY2F1c2UgYW4KKwkJICogb3BlcmF0b3IgdG8gYmUgZXZhbHVhdGVkIGJlZm9yZSBpdHMgYXJndW1lbnQgaXMgcHVzaGVkIG9udG8gdGhlCisJCSAqIGludGVnZXIgc3RhY2suCisJCSAqIEJ1dCBmb3IgYmluYXJ5IG9wZXJhdG9ycywgImFwcGx5IiBldmVyeXRoaW5nIG9uIHRoZSBvcGVyYXRvcgorCQkgKiBzdGFjayB1bnRpbCB3ZSBmaW5kIGFuIG9wZXJhdG9yIHdpdGggYSBsZXNzZXIgcHJpb3JpdHkgdGhhbiB0aGUKKwkJICogb25lIHdlIGhhdmUganVzdCBleHRyYWN0ZWQuIElmIG9wIGlzIHJpZ2h0LWFzc29jaWF0aXZlLAorCQkgKiB0aGVuIHN0b3AgImFwcGx5aW5nIiBvbiB0aGUgZXF1YWwgcHJpb3JpdHkgdG9vLgorCQkgKiBMZWZ0IHBhcmVuIGlzIGdpdmVuIHRoZSBsb3dlc3QgcHJpb3JpdHkgc28gaXQgd2lsbCBuZXZlciBiZQorCQkgKiAiYXBwbGllZCIgaW4gdGhpcyB3YXkuCisJCSAqLworCQlwcmVjID0gUFJFQyhvcCk7CisJCWlmICgocHJlYyA+IDAgJiYgcHJlYyA8IFVOQVJZUFJFQykgfHwgcHJlYyA9PSBTUEVDX1BSRUMpIHsKKwkJCS8qIG5vdCBsZWZ0IHBhcmVuIG9yIHVuYXJ5ICovCisJCQlpZiAobGFzdHRvayAhPSBUT0tfTlVNKSB7CisJCQkJLyogYmluYXJ5IG9wIG11c3QgYmUgcHJlY2VkZWQgYnkgYSBudW0gKi8KKwkJCQlnb3RvIGVycjsKKwkJCX0KKwkJCXdoaWxlIChzdGFja3B0ciAhPSBzdGFjaykgeworCQkJCW9wZXJhdG9yIHByZXZfb3AgPSAqLS1zdGFja3B0cjsKKwkJCQlpZiAob3AgPT0gVE9LX1JQQVJFTikgeworCQkJCQkvKiBUaGUgYWxnb3JpdGhtIGVtcGxveWVkIGhlcmUgaXMgc2ltcGxlOiB3aGlsZSB3ZSBkb24ndAorCQkJCQkgKiBoaXQgYW4gb3BlbiBwYXJlbiBub3IgdGhlIGJvdHRvbSBvZiB0aGUgc3RhY2ssIHBvcAorCQkJCQkgKiB0b2tlbnMgYW5kIGFwcGx5IHRoZW0gKi8KKwkJCQkJaWYgKHByZXZfb3AgPT0gVE9LX0xQQVJFTikgeworCQkJCQkJLyogQW55IG9wZXJhdG9yIGRpcmVjdGx5IGFmdGVyIGEKKwkJCQkJCSAqIGNsb3NlIHBhcmVuIHNob3VsZCBjb25zaWRlciBpdHNlbGYgYmluYXJ5ICovCisJCQkJCQlsYXN0dG9rID0gVE9LX05VTTsKKwkJCQkJCWdvdG8gbmV4dDsKKwkJCQkJfQorCQkJCX0gZWxzZSB7CisJCQkJCW9wZXJhdG9yIHByZXZfcHJlYyA9IFBSRUMocHJldl9vcCk7CisJCQkJCWZpeF9hc3NpZ25tZW50X3ByZWMocHJlYyk7CisJCQkJCWZpeF9hc3NpZ25tZW50X3ByZWMocHJldl9wcmVjKTsKKwkJCQkJaWYgKHByZXZfcHJlYyA8IHByZWMKKwkJCQkJIHx8IChwcmV2X3ByZWMgPT0gcHJlYyAmJiBpc19yaWdodF9hc3NvY2lhdGl2ZShwcmVjKSkKKwkJCQkJKSB7CisJCQkJCQlzdGFja3B0cisrOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQl9CisJCQkJZXJybXNnID0gYXJpdGhfYXBwbHkobWF0aF9zdGF0ZSwgcHJldl9vcCwgbnVtc3RhY2ssICZudW1zdGFja3B0cik7CisJCQkJaWYgKGVycm1zZykKKwkJCQkJZ290byBlcnJfd2l0aF9jdXN0b21fbXNnOworCQkJfQorCQkJaWYgKG9wID09IFRPS19SUEFSRU4pCisJCQkJZ290byBlcnI7CisJCX0KKworCQkvKiBQdXNoIHRoaXMgb3BlcmF0b3IgdG8gdGhlIHN0YWNrIGFuZCByZW1lbWJlciBpdCAqLworCQkqc3RhY2twdHIrKyA9IGxhc3R0b2sgPSBvcDsKKyBuZXh0OiA7CisJfSAvKiB3aGlsZSAoMSkgKi8KKworIGVycjoKKwllcnJtc2cgPSAiYXJpdGhtZXRpYyBzeW50YXggZXJyb3IiOworIGVycl93aXRoX2N1c3RvbV9tc2c6CisJbnVtc3RhY2stPnZhbCA9IC0xOworIHJldDoKKwltYXRoX3N0YXRlLT5lcnJtc2cgPSBlcnJtc2c7CisJcmV0dXJuIG51bXN0YWNrLT52YWw7Cit9CisKK2FyaXRoX3QgRkFTVF9GVU5DCithcml0aChhcml0aF9zdGF0ZV90ICptYXRoX3N0YXRlLCBjb25zdCBjaGFyICpleHByKQoreworCW1hdGhfc3RhdGUtPmVycm1zZyA9IE5VTEw7CisJbWF0aF9zdGF0ZS0+bGlzdF9vZl9yZWN1cnNlZF9uYW1lcyA9IE5VTEw7CisJcmV0dXJuIGV2YWx1YXRlX3N0cmluZyhtYXRoX3N0YXRlLCBleHByKTsKK30KKworLyoKKyAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MSwgMTk5MywgMTk5NAorICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKKyAqICAgIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZQorICogICAgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgUkVHRU5UUyBBTkQgQ09OVFJJQlVUT1JTIGBgQVMgSVMnJyBBTkQKKyAqIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIFJFR0VOVFMgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQorICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKKyAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCisgKiBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikKKyAqIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUCisgKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCisgKiBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCisgKiBTVUNIIERBTUFHRS4KKyAqLwpkaWZmIC0tZ2l0IGEvc2hlbGwvbWF0aC5oIGIvc2hlbGwvbWF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NGJlZTYKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tYXRoLmgKQEAgLTAsMCArMSw5MiBAQAorLyogbWF0aC5oIC0gaW50ZXJmYWNlIHRvIHNoZWxsIG1hdGggImxpYnJhcnkiIC0tIHRoaXMgYWxsb3dzIHNoZWxscyB0byBzaGFyZQorICogICAgICAgICAgdGhlIGltcGxlbWVudGF0aW9uIG9mIGFyaXRobWV0aWMgJCgoLi4uKSkgZXhwYW5zaW9ucy4KKyAqCisgKiBUaGlzIGFpbXMgdG8gYmUgYSBQT1NJWCBzaGVsbCBtYXRoIGxpYnJhcnkgYXMgZG9jdW1lbnRlZCBoZXJlOgorICoJaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvVjNfY2hhcDAyLmh0bWwjdGFnXzE4XzA2XzA0CisgKgorICogU2VlIG1hdGguYyBmb3IgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbi4KKyAqLworCisvKiBUaGUgbWF0aCBsaWJyYXJ5IGhhcyBqdXN0IG9uZSBmdW5jdGlvbjoKKyAqCisgKiBhcml0aF90IGFyaXRoKGFyaXRoX3N0YXRlX3QgKnN0YXRlLCBjb25zdCBjaGFyICpleHByKTsKKyAqCisgKiBUaGUgZXhwciBhcmd1bWVudCBpcyB0aGUgbWF0aCBzdHJpbmcgdG8gcGFyc2UuICBBbGwgbm9ybWFsIGV4cGFuc2lvbnMgbXVzdAorICogYmUgZG9uZSBhbHJlYWR5LiAgaS5lLiBubyBkb2xsYXIgc3ltYm9scyBzaG91bGQgYmUgcHJlc2VudC4KKyAqCisgKiBUaGUgc3RhdGUgYXJndW1lbnQgaXMgYSBwb2ludGVyIHRvIGEgc3RydWN0IG9mIGhvb2tzIGZvciB5b3VyIHNoZWxsIChzZWUgYmVsb3cpLAorICogYW5kIGFuIGVycm9yIG1lc3NhZ2Ugc3RyaW5nIChOVUxMIGlmIG5vIGVycm9yKS4KKyAqCisgKiBUaGUgZnVuY3Rpb24gcmV0dXJucyB0aGUgYW5zd2VyIHRvIHRoZSBleHByZXNzaW9uLiAgU28gaWYgeW91IGNhbGxlZCBpdAorICogd2l0aCB0aGUgZXhwcmVzc2lvbjoKKyAqICIxICsgMiArIDMiCisgKiB5b3Ugd291bGQgb2J2aW91c2x5IGdldCBiYWNrIDYuCisgKi8KKworLyogVG8gYWRkIHN1cHBvcnQgdG8gYSBzaGVsbCwgeW91IG5lZWQgdG8gaW1wbGVtZW50IHRocmVlIGZ1bmN0aW9uczoKKyAqCisgKiBsb29rdXB2YXIoKSAtIGxvb2sgdXAgYW5kIHJldHVybiB0aGUgdmFsdWUgb2YgYSB2YXJpYWJsZQorICoKKyAqCUlmIHRoZSBzaGVsbCBkb2VzOgorICoJCWZvbz0xMjMKKyAqCVRoZW4gdGhlIGNvZGU6CisgKgkJY29uc3QgY2hhciAqdmFsID0gbG9va3VwdmFyKCJmb28iKTsKKyAqCXdpbGwgcmVzdWx0IGluIHZhbCBwb2ludGluZyB0byAiMTIzIgorICoKKyAqIHNldHZhcigpIC0gc2V0IGEgdmFyaWFibGUgdG8gc29tZSB2YWx1ZQorICoKKyAqCUlmIHRoZSBhcml0aG1ldGljIGV4cGFuc2lvbiBkb2VzIHNvbWV0aGluZyBsaWtlOgorICoJCSQoKCBpID0gMSkpCisgKgl0aGVuIHRoZSBtYXRoIGNvZGUgd2lsbCBtYWtlIGEgY2FsbCBsaWtlIHNvOgorICoJCXNldHZhcigiaSIsICIxIiwgMCk7CisgKglUaGUgc3RvcmFnZSBmb3IgdGhlIGZpcnN0IHR3byBwYXJhbWV0ZXJzIGFyZSBub3QgYWxsb2NhdGVkLCBzbyB5b3VyCisgKglzaGVsbCBpbXBsZW1lbnRhdGlvbiB3aWxsIG1vc3QgbGlrZWx5IG5lZWQgdG8gc3RyZHVwKCkgdGhlbSB0byBzYXZlLgorICoKKyAqIGVuZG9mbmFtZSgpIC0gcmV0dXJuIHRoZSBlbmQgb2YgYSB2YXJpYWJsZSBuYW1lIGZyb20gaW5wdXQKKyAqCisgKglUaGUgYXJpdGhtZXRpYyBjb2RlIGRvZXMgbm90IGtub3cgYWJvdXQgdmFyaWFibGUgbmFtaW5nIGNvbnZlbnRpb25zLgorICoJU28gd2hlbiBpdCBpcyBnaXZlbiBhbiBleHBlcmVzc2lvbiwgaXQga25vd3Mgc29tZXRoaW5nIGlzIG5vdCBudW1lcmljLAorICoJYnV0IGl0IGlzIHVwIHRvIHRoZSBzaGVsbCB0byBkaWN0YXRlIHdoYXQgaXMgYSB2YWxpZCBpZGVudGlmaWVycy4KKyAqCVNvIHdoZW4gaXQgZW5jb3VudGVycyBzb21ldGhpbmcgbGlrZToKKyAqCQkkKCggc29tZV92YXIgKyAxMjMgKSkKKyAqCUl0IHdpbGwgbWFrZSBhIGNhbGwgbGlrZSBzbzoKKyAqCQllbmQgPSBlbmRvZm5hbWUoInNvbWVfdmFyICsgMTIzIik7CisgKglTbyB0aGUgc2hlbGwgbmVlZHMgdG8gc2NhbiB0aGUgaW5wdXQgc3RyaW5nIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZQorICoJZmlyc3Qgbm9uLWlkZW50aWZpZXIgc3RyaW5nLiAgSW4gdGhpcyBjYXNlLCBpdCBzaG91bGQgcmV0dXJuIHRoZSBpbnB1dAorICoJcG9pbnRlciB3aXRoIGFuIG9mZnNldCBwb2ludGluZyB0byB0aGUgZmlyc3Qgc3BhY2UuICBUaGUgdHlwaWNhbAorICoJaW1wbGVtZW50YXRpb24gd2lsbCByZXR1cm4gdGhlIG9mZnNldCBvZiBmaXJzdCBjaGFyIHRoYXQgZG9lcyBub3QgbWF0Y2gKKyAqCXRoZSByZWdleCAoaW4gQyBsb2NhbGUpOiBeW2EtekEtWl9dW2EtekEtWl8wLTldKgorICovCisKKyNpZm5kZWYgU0hFTExfTUFUSF9ICisjZGVmaW5lIFNIRUxMX01BVEhfSCAxCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCisjaWYgRU5BQkxFX1NIX01BVEhfU1VQUE9SVF82NAordHlwZWRlZiBsb25nIGxvbmcgYXJpdGhfdDsKKyNkZWZpbmUgQVJJVEhfRk1UICIlbGxkIgorI2RlZmluZSBzdHJ0b19hcml0aF90IHN0cnRvdWxsCisjZWxzZQordHlwZWRlZiBsb25nIGFyaXRoX3Q7CisjZGVmaW5lIEFSSVRIX0ZNVCAiJWxkIgorI2RlZmluZSBzdHJ0b19hcml0aF90IHN0cnRvdWwKKyNlbmRpZgorCit0eXBlZGVmIGNvbnN0IGNoYXIqIEZBU1RfRlVOQyAoKmFyaXRoX3Zhcl9sb29rdXBfdCkoY29uc3QgY2hhciAqbmFtZSk7Cit0eXBlZGVmIHZvaWQgICAgICAgIEZBU1RfRlVOQyAoKmFyaXRoX3Zhcl9zZXRfdCkoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsKTsKKy8vdHlwZWRlZiBjb25zdCBjaGFyKiBGQVNUX0ZVTkMgKCphcml0aF92YXJfZW5kb2ZuYW1lX3QpKGNvbnN0IGNoYXIgKm5hbWUpOworCit0eXBlZGVmIHN0cnVjdCBhcml0aF9zdGF0ZV90IHsKKwljb25zdCBjaGFyICAgICAgICAgICAqZXJybXNnOworCWFyaXRoX3Zhcl9sb29rdXBfdCAgICBsb29rdXB2YXI7CisJYXJpdGhfdmFyX3NldF90ICAgICAgIHNldHZhcjsKKy8vCWFyaXRoX3Zhcl9lbmRvZm5hbWVfdCBlbmRvZm5hbWU7CisJdm9pZCAgICAgICAgICAgICAgICAgKmxpc3Rfb2ZfcmVjdXJzZWRfbmFtZXM7Cit9IGFyaXRoX3N0YXRlX3Q7CisKK2FyaXRoX3QgRkFTVF9GVU5DIGFyaXRoKGFyaXRoX3N0YXRlX3QgKnN0YXRlLCBjb25zdCBjaGFyICpleHByKTsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9ub2VvbDMucmlnaHQgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9ub2VvbDMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZmODUxNQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL25vZW9sMy5yaWdodApAQCAtMCwwICsxIEBACitodXNoOiBzeW50YXggZXJyb3I6IHVudGVybWluYXRlZCAiCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9ub2VvbDMudGVzdHMgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9ub2VvbDMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZWM5NThlZAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL25vZW9sMy50ZXN0cwpAQCAtMCwwICsxLDIgQEAKKyMgbGFzdCBsaW5lIGhhcyBubyBFT0whCitlY2hvICJ1bnRlcm1pbmF0ZWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9wcm9jZXNzX3N1YnN0LnJpZ2h0IGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvcHJvY2Vzc19zdWJzdC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTdiYzgwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvcHJvY2Vzc19zdWJzdC5yaWdodApAQCAtMCwwICsxLDMgQEAKK1RFU1R6ekJFU1QKK1RFU1QkKGVjaG8genopQkVTVAorVEVTVCdCRVNUCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9wcm9jZXNzX3N1YnN0LnRlc3RzIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvcHJvY2Vzc19zdWJzdC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yMTk5NmJjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvcHJvY2Vzc19zdWJzdC50ZXN0cwpAQCAtMCwwICsxLDMgQEAKK2VjaG8gIlRFU1RgZWNobyB6ejtlY2hvO2VjaG9gQkVTVCIKK2VjaG8gIlRFU1RgZWNobyAnJChlY2hvIHp6KSdgQkVTVCIKK2VjaG8gIlRFU1RgZWNobyAiJyJgQkVTVCIKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3JlYWQucmlnaHQgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9yZWFkLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNTBlMmEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9yZWFkLnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAorcmVhZAorY2F0CitlY2hvICJSRVBMWT0kUkVQTFkiCitSRVBMWT1leGVjIDxyZWFkLnRlc3RzCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9yZWFkLnRlc3RzIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvcmVhZC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mZjFhY2JkCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvcmVhZC50ZXN0cwpAQCAtMCwwICsxLDQgQEAKK2V4ZWMgPHJlYWQudGVzdHMKK3JlYWQKK2NhdAorZWNobyAiUkVQTFk9JFJFUExZIgpkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvc2hpZnQucmlnaHQgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9zaGlmdC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjgxZTM1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3Mvc2hpZnQucmlnaHQKQEAgLTAsMCArMSw2IEBACisuL3NoaWZ0LnRlc3RzIGFiYyBkIGUKKy4vc2hpZnQudGVzdHMgZCBlIDEyMworLi9zaGlmdC50ZXN0cyBkIGUgMTIzCisuL3NoaWZ0LnRlc3RzCisuL3NoaWZ0LnRlc3RzCisuL3NoaWZ0LnRlc3RzCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9zaGlmdC50ZXN0cyBiL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3NoaWZ0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUzZWYyNDkKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9zaGlmdC50ZXN0cwpAQCAtMCwwICsxLDE0IEBACitpZiB0ZXN0ICQjID0gMDsgdGhlbgorICAgIGV4ZWMgIiRUSElTX1NIIiAkMCBhYmMgImQgZSIgMTIzCitmaQorZWNobyAkMCAkMSAkMgorc2hpZnQKK2VjaG8gJDAgJDEgJDIKK3NoaWZ0IDk5OQorZWNobyAkMCAkMSAkMgorc2hpZnQgMgorZWNobyAkMCAkMSAkMgorc2hpZnQgMgorZWNobyAkMCAkMSAkMgorc2hpZnQKK2VjaG8gJDAgJDEgJDIKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3N0YXJxdW90ZWQucmlnaHQgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9zdGFycXVvdGVkLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NjMyM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9zdGFycXVvdGVkLnJpZ2h0CkBAIC0wLDAgKzEsOCBAQAorLjEgYWJjIGQgZSBmLgorLjEuCisuYWJjLgorLmQgZSBmLgorLi0xIGFiYyBkIGUgZi0uCisuLTEuCisuYWJjLgorLmQgZSBmLS4KZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3N0YXJxdW90ZWQudGVzdHMgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9zdGFycXVvdGVkLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJmZTQ5YjEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9zdGFycXVvdGVkLnRlc3RzCkBAIC0wLDAgKzEsOCBAQAoraWYgdGVzdCAkIyA9IDA7IHRoZW4KKyAgICBleGVjICIkVEhJU19TSCIgIiQwIiAxIGFiYyAnZCBlIGYnCitmaQorCitmb3IgYSBpbiAiJCoiOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorZm9yIGEgaW4gIiRAIjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKK2ZvciBhIGluICItJCotIjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKK2ZvciBhIGluICItJEAtIjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3N5bnRheF9lcnIucmlnaHQgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9zeW50YXhfZXJyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YTI3MGMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9zeW50YXhfZXJyLnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorc2hvd24KK2h1c2g6IHN5bnRheCBlcnJvcjogdW50ZXJtaW5hdGVkICcKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3N5bnRheF9lcnIudGVzdHMgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9zeW50YXhfZXJyLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQxMGVkNDIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy9zeW50YXhfZXJyLnRlc3RzCkBAIC0wLDAgKzEsMyBAQAorZWNobyBzaG93bgorZWNobyB0ZXN0IGBlY2hvICdhYWAKK2VjaG8gbm90IHNob3duCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy92YXJfZXhwYW5kX2luX2Fzc2lnbi5yaWdodCBiL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3Zhcl9leHBhbmRfaW5fYXNzaWduLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MjIxMGQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy92YXJfZXhwYW5kX2luX2Fzc2lnbi5yaWdodApAQCAtMCwwICsxLDUgQEAKKy4gLgorLmFiYyBkIGUuCisuYWJjIGQgZS4KKy5hYmMgZCBlLgorLmFiYyBkIGUuCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy92YXJfZXhwYW5kX2luX2Fzc2lnbi50ZXN0cyBiL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3Zhcl9leHBhbmRfaW5fYXNzaWduLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjE4Y2RjNzQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy92YXJfZXhwYW5kX2luX2Fzc2lnbi50ZXN0cwpAQCAtMCwwICsxLDE1IEBACitpZiB0ZXN0ICQjID0gMDsgdGhlbgorICAgIGV4ZWMgIiRUSElTX1NIIiAiJDAiIGFiYyAiZCBlIgorZmkKKworc3BhY2U9JyAnCitlY2hvIC4kc3BhY2UuCisKK2E9JCoKK2VjaG8gLiRhLgorYT0kQAorZWNobyAuJGEuCithPSIkKiIKK2VjaG8gLiRhLgorYT0iJEAiCitlY2hvIC4kYS4KZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3Zhcl9leHBhbmRfaW5fcmVkaXIucmlnaHQgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy92YXJfZXhwYW5kX2luX3JlZGlyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMzI5OWMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtYnVncy92YXJfZXhwYW5kX2luX3JlZGlyLnJpZ2h0CkBAIC0wLDAgKzEsMyBAQAorVEVTVDEKK1RFU1QyCitURVNUMwpkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLWJ1Z3MvdmFyX2V4cGFuZF9pbl9yZWRpci50ZXN0cyBiL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3Zhcl9leHBhbmRfaW5fcmVkaXIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmRhNmJkZAotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1idWdzL3Zhcl9leHBhbmRfaW5fcmVkaXIudGVzdHMKQEAgLTAsMCArMSwxMyBAQAoraWYgdGVzdCAkIyA9IDA7IHRoZW4KKyAgICBleGVjICIkVEhJU19TSCIgIiQwIiBhYmMgImQgZSIKK2ZpCisKK2VjaG8gVEVTVDEgPiIkMS5vdXQiCitlY2hvIFRFU1QyID4iJDIub3V0IgorIyBiYXNoIHNheXM6ICIkQC5vdXQiOiBhbWJpZ3VvdXMgcmVkaXJlY3QKKyMgYXNoIGhhbmRsZXMgaXQgYXMgaWYgaXQgaXMgJyQqJyAtIHdlIGRvIHRoZSBzYW1lCitlY2hvIFRFU1QzID4iJEAub3V0IgorCitjYXQgYWJjLm91dCAiZCBlLm91dCIgImFiYyBkIGUub3V0IgorCitybSBhYmMub3V0ICJkIGUub3V0IiAiYWJjIGQgZS5vdXQiCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL2V4aXRjb2RlX0VBQ0NFUy5yaWdodCBiL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vZXhpdGNvZGVfRUFDQ0VTLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNTQ4MGIKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL2V4aXRjb2RlX0VBQ0NFUy5yaWdodApAQCAtMCwwICsxLDIgQEAKKy4vOiBjYW4ndCBleGVjdXRlCisxMjYKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vZXhpdGNvZGVfRUFDQ0VTLnRlc3RzIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9leGl0Y29kZV9FQUNDRVMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMjZiNWM2MQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vZXhpdGNvZGVfRUFDQ0VTLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorLi8KK2VjaG8gJD8KZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vZXhpdGNvZGVfRU5PRU5ULnJpZ2h0IGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9leGl0Y29kZV9FTk9FTlQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGQ0OWQyYwotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vZXhpdGNvZGVfRU5PRU5ULnJpZ2h0CkBAIC0wLDAgKzEsMiBAQAorLi9kb2VzX25vdF9leGlzdF9mb3Jfc3VyZTogbm90IGZvdW5kCisxMjcKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vZXhpdGNvZGVfRU5PRU5ULnRlc3RzIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9leGl0Y29kZV9FTk9FTlQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2YxYjg4YQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vZXhpdGNvZGVfRU5PRU5ULnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorLi9kb2VzX25vdF9leGlzdF9mb3Jfc3VyZQorZWNobyAkPwpkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9tYW55X2NvbnRpbnVlcy5yaWdodCBiL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vbWFueV9jb250aW51ZXMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg2YmFjOQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vbWFueV9jb250aW51ZXMucmlnaHQKQEAgLTAsMCArMSBAQAorT0sKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1leGVjdXRpb24vbWFueV9jb250aW51ZXMudGVzdHMgYi9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL21hbnlfY29udGludWVzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjg2YzcyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL21hbnlfY29udGludWVzLnRlc3RzCkBAIC0wLDAgKzEsMTUgQEAKK2lmIHRlc3QgJCMgPSAwOyB0aGVuCisgICAgIyBDaGlsZCB3aWxsIGtpbGwgdXMgaW4gMSBzZWNvbmQKKyAgICAiJFRISVNfU0giICIkMCIgJCQgJgorCisgICAgIyBMb29wIG1hbnksIG1hbnkgdGltZXMKKyAgICB0cmFwICdlY2hvIE9LOyBleGl0IDAnIDE1CisgICAgd2hpbGUgdHJ1ZTsgZG8KKwljb250aW51ZQorICAgIGRvbmUKKyAgICBlY2hvIEJBRAorICAgIGV4aXQgMQorZmkKKworc2xlZXAgMQora2lsbCAkMQpkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9uZXN0ZWRfYnJlYWsucmlnaHQgYi9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL25lc3RlZF9icmVhay5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZThiNmIwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9uZXN0ZWRfYnJlYWsucmlnaHQKQEAgLTAsMCArMSw4IEBACitBCitCCitpdGVyYXRpb24KK0MKK0EKK0IKK2l0ZXJhdGlvbgorRApkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9uZXN0ZWRfYnJlYWsudGVzdHMgYi9zaGVsbC9tc2hfdGVzdC9tc2gtZXhlY3V0aW9uL25lc3RlZF9icmVhay50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xYTk1NGQyCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLWV4ZWN1dGlvbi9uZXN0ZWRfYnJlYWsudGVzdHMKQEAgLTAsMCArMSwxNyBAQAorIyBUZXN0Y2FzZSBmb3IgaHR0cDovL2J1Z3MuYnVzeWJveC5uZXQvdmlldy5waHA/aWQ9ODQ2CisKK249MAord2hpbGUgOgorZG8KKwllY2hvIEEKKwl3aGlsZSA6CisJZG8KKwkJZWNobyBCCisJCWJyZWFrCisJZG9uZQorCWVjaG8gaXRlcmF0aW9uCisJWyAkbiA9IDEgXSAmJiBicmVhaworCWVjaG8gQworCW49YGV4cHIgJG4gKyAxYAorZG9uZQorZWNobyBECmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtbWlzYy90aWNrLnJpZ2h0IGIvc2hlbGwvbXNoX3Rlc3QvbXNoLW1pc2MvdGljay5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWQyODFjCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLW1pc2MvdGljay5yaWdodApAQCAtMCwwICsxLDIgQEAKKzEKKzEKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1taXNjL3RpY2sudGVzdHMgYi9zaGVsbC9tc2hfdGVzdC9tc2gtbWlzYy90aWNrLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFmNzQ5YTkKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtbWlzYy90aWNrLnRlc3RzCkBAIC0wLDAgKzEsNCBAQAordHJ1ZQorZmFsc2U7IGVjaG8gYGVjaG8gJD9gCit0cnVlCit7IGZhbHNlOyBlY2hvIGBlY2hvICQ/YDsgfQpkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvYXJndjAucmlnaHQgYi9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9hcmd2MC5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODZiYWM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvYXJndjAucmlnaHQKQEAgLTAsMCArMSBAQAorT0sKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL2FyZ3YwLnRlc3RzIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvYXJndjAudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjVjNDBmNgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL2FyZ3YwLnRlc3RzCkBAIC0wLDAgKzEsNCBAQAoraWYgdGVzdCAkIyA9IDA7IHRoZW4KKyAgICBleGVjICIkVEhJU19TSCIgIiQwIiBhcmcKK2ZpCitlY2hvIE9LCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9ub2VvbC5yaWdodCBiL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL25vZW9sLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0Mjc5ODQKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9ub2VvbC5yaWdodApAQCAtMCwwICsxIEBACitIRUxMTwpkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvbm9lb2wudGVzdHMgYi9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9ub2VvbC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOTMxMTNhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvbm9lb2wudGVzdHMKQEAgLTAsMCArMSwyIEBACisjIG5leHQgbGluZSBoYXMgbm8gRU9MIQorZWNobyBIRUxMTwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL25vZW9sMi5yaWdodCBiL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL25vZW9sMi5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDA0OTFmCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvbm9lb2wyLnJpZ2h0CkBAIC0wLDAgKzEgQEAKKzEKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL25vZW9sMi50ZXN0cyBiL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL25vZW9sMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xMjIwZjA1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvbm9lb2wyLnRlc3RzCkBAIC0wLDAgKzEsNyBAQAorIyBsYXN0IGxpbmUgaGFzIG5vIEVPTCEKK2lmIHRydWUKK3RoZW4KKyAgZWNobyAxCitlbHNlCisgIGVjaG8gMgorZmkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTEucmlnaHQgYi9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTEucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2IzODIwNQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlMS5yaWdodApAQCAtMCwwICsxIEBACisnMScKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlMS50ZXN0cyBiL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlMS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNTU4OTU0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGUxLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorYT0xCitlY2hvICInJGEnIgpkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGUyLnJpZ2h0IGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGUyLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYzllZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTIucmlnaHQKQEAgLTAsMCArMSBAQAorPjEKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlMi50ZXN0cyBiL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iZDk2NmYzCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGUyLnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorYT0xCitlY2hvICI+JGEiCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTMucmlnaHQgYi9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTMucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY5YTQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlMy5yaWdodApAQCAtMCwwICsxLDMgQEAKK1Rlc3Rpbmc6IGluICRlbXB0eSIiCisuLgorRmluaXNoZWQKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlMy50ZXN0cyBiL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlMy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNzVlNzg1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGUzLnRlc3RzCkBAIC0wLDAgKzEsOCBAQAoraWYgdGVzdCAkIyA9IDA7IHRoZW4KKyAgICBleGVjICIkVEhJU19TSCIgcXVvdGUzLnRlc3RzIGFiYyAiZCBlIgorZmkKKworZWNobyAnVGVzdGluZzogaW4gJGVtcHR5IiInCitlbXB0eT0nJworZm9yIGEgaW4gJGVtcHR5IiI7IGRvIGVjaG8gIi4kYS4iOyBkb25lCitlY2hvIEZpbmlzaGVkCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTQucmlnaHQgYi9zaGVsbC9tc2hfdGVzdC9tc2gtcGFyc2luZy9xdW90ZTQucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI5MDFlYQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlNC5yaWdodApAQCAtMCwwICsxIEBACithIGIKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlNC50ZXN0cyBiL3NoZWxsL21zaF90ZXN0L21zaC1wYXJzaW5nL3F1b3RlNC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mMWRhYmZhCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXBhcnNpbmcvcXVvdGU0LnRlc3RzCkBAIC0wLDAgKzEsMiBAQAorYV9iPSdhIGInCitlY2hvICIkYV9iIgpkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLXZhcnMvc3Rhci5yaWdodCBiL3NoZWxsL21zaF90ZXN0L21zaC12YXJzL3N0YXIucmlnaHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVjYzU1YgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC12YXJzL3N0YXIucmlnaHQKQEAgLTAsMCArMSw2IEBACisuMS4KKy5hYmMuCisuZC4KKy5lLgorLmYuCisuMSBhYmMgZCBlIGYuCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtdmFycy9zdGFyLnRlc3RzIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXZhcnMvc3Rhci50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NTU0YzQwCi0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXZhcnMvc3Rhci50ZXN0cwpAQCAtMCwwICsxLDggQEAKK2lmIHRlc3QgJCMgPSAwOyB0aGVuCisgICAgZXhlYyAiJFRISVNfU0giIHN0YXIudGVzdHMgMSBhYmMgJ2QgZSBmJworZmkKKyMgJ2QgZSBmJyBzaG91bGQgYmUgc3BsaXQgaW50byAzIHNlcGFyYXRlIGFyZ3M6Citmb3IgYSBpbiAkKjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworIyBtdXN0IHByb2R1Y2UgLjEgYWJjIGQgZSBmLgorZm9yIGEgaW4gIiQqIjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC12YXJzL3Zhci5yaWdodCBiL3NoZWxsL21zaF90ZXN0L21zaC12YXJzL3Zhci5yaWdodApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGIyMzE0Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvbXNoLXZhcnMvdmFyLnJpZ2h0CkBAIC0wLDAgKzEsNCBAQAoraHR0cDovL2J1c3lib3gubmV0CitodHRwOi8vYnVzeWJveC5uZXRfYWJjCisxCisxCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9tc2gtdmFycy92YXIudGVzdHMgYi9zaGVsbC9tc2hfdGVzdC9tc2gtdmFycy92YXIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGE2MzY5NgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC12YXJzL3Zhci50ZXN0cwpAQCAtMCwwICsxLDkgQEAKK1VSTD1odHRwOi8vYnVzeWJveC5uZXQKKworZWNobyAkVVJMCitlY2hvICR7VVJMfV9hYmMKKwordHJ1ZQorZmFsc2U7IGVjaG8gJD8KK3RydWUKK3sgZmFsc2U7IGVjaG8gJD87IH0KZGlmZiAtLWdpdCBhL3NoZWxsL21zaF90ZXN0L21zaC12YXJzL3Zhcl9zdWJzdF9pbl9mb3IucmlnaHQgYi9zaGVsbC9tc2hfdGVzdC9tc2gtdmFycy92YXJfc3Vic3RfaW5fZm9yLnJpZ2h0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YWNhMWMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9tc2hfdGVzdC9tc2gtdmFycy92YXJfc3Vic3RfaW5fZm9yLnJpZ2h0CkBAIC0wLDAgKzEsNDAgQEAKK1Rlc3Rpbmc6IGluIHggeSB6CisueC4KKy55LgorLnouCitUZXN0aW5nOiBpbiB1ICRlbXB0eSB2CisudS4KKy52LgorVGVzdGluZzogaW4gdSAiICRlbXB0eSIgdgorLnUuCisuIC4KKy52LgorVGVzdGluZzogaW4gdSAkZW1wdHkgJGVtcHR5JGEgdgorLnUuCisuYS4KKy52LgorVGVzdGluZzogaW4gJGFfYgorLmEuCisuYi4KK1Rlc3Rpbmc6IGluICQqCisuYWJjLgorLmQuCisuZS4KK1Rlc3Rpbmc6IGluICRACisuYWJjLgorLmQuCisuZS4KK1Rlc3Rpbmc6IGluIC0kKi0KKy4tYWJjLgorLmQuCisuZS0uCitUZXN0aW5nOiBpbiAtJEAtCisuLWFiYy4KKy5kLgorLmUtLgorVGVzdGluZzogaW4gJGFfYiAtJGFfYi0KKy5hLgorLmIuCisuLWEuCisuYi0uCitGaW5pc2hlZApkaWZmIC0tZ2l0IGEvc2hlbGwvbXNoX3Rlc3QvbXNoLXZhcnMvdmFyX3N1YnN0X2luX2Zvci50ZXN0cyBiL3NoZWxsL21zaF90ZXN0L21zaC12YXJzL3Zhcl9zdWJzdF9pbl9mb3IudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNGQxYzExMgotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL21zaF90ZXN0L21zaC12YXJzL3Zhcl9zdWJzdF9pbl9mb3IudGVzdHMKQEAgLTAsMCArMSw0MCBAQAoraWYgdGVzdCAkIyA9IDA7IHRoZW4KKyAgICBleGVjICIkVEhJU19TSCIgdmFyX3N1YnN0X2luX2Zvci50ZXN0cyBhYmMgImQgZSIKK2ZpCisKK2VjaG8gJ1Rlc3Rpbmc6IGluIHggeSB6JworZm9yIGEgaW4geCB5IHo7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluIHUgJGVtcHR5IHYnCitlbXB0eT0nJworZm9yIGEgaW4gdSAkZW1wdHkgdjsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gdSAiICRlbXB0eSIgdicKK2VtcHR5PScnCitmb3IgYSBpbiB1ICIgJGVtcHR5IiB2OyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiB1ICRlbXB0eSAkZW1wdHkkYSB2JworYT0nYScKK2ZvciBhIGluIHUgJGVtcHR5ICRlbXB0eSRhIHY7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluICRhX2InCithX2I9J2EgYicKK2ZvciBhIGluICRhX2I7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluICQqJworZm9yIGEgaW4gJCo7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluICRAJworZm9yIGEgaW4gJEA7IGRvIGVjaG8gIi4kYS4iOyBkb25lCisKK2VjaG8gJ1Rlc3Rpbmc6IGluIC0kKi0nCitmb3IgYSBpbiAtJCotOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvICdUZXN0aW5nOiBpbiAtJEAtJworZm9yIGEgaW4gLSRALTsgZG8gZWNobyAiLiRhLiI7IGRvbmUKKworZWNobyAnVGVzdGluZzogaW4gJGFfYiAtJGFfYi0nCithX2I9J2EgYicKK2ZvciBhIGluICRhX2IgLSRhX2ItOyBkbyBlY2hvICIuJGEuIjsgZG9uZQorCitlY2hvIEZpbmlzaGVkCmRpZmYgLS1naXQgYS9zaGVsbC9tc2hfdGVzdC9ydW4tYWxsIGIvc2hlbGwvbXNoX3Rlc3QvcnVuLWFsbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yOWY2MmE1Ci0tLSAvZGV2L251bGwKKysrIGIvc2hlbGwvbXNoX3Rlc3QvcnVuLWFsbApAQCAtMCwwICsxLDY0IEBACisjIS9iaW4vc2gKKwordGVzdCAteCBtc2ggfHwgeworICAgIGVjaG8gIk5vIC4vbXNoIC0gY3JlYXRpbmcgYSBsaW5rIHRvIC4uLy4uL2J1c3lib3giCisgICAgbG4gLXMgLi4vLi4vYnVzeWJveCBtc2gKK30KKworUEFUSD0iJFBXRDokUEFUSCIgIyBmb3IgbXNoCitleHBvcnQgUEFUSAorCitUSElTX1NIPSIkUFdEL21zaCIKK2V4cG9ydCBUSElTX1NICisKK2RvX3Rlc3QoKQoreworICAgIHRlc3QgLWQgIiQxIiB8fCByZXR1cm4gMAorIyAgIGVjaG8gUnVubmluZyB0ZXN0cyBpbiBkaXJlY3RvcnkgIiQxIgorICAgICgKKyAgICBjZCAiJDEiIHx8IHsgZWNobyAiY2Fubm90IGNkICQxISI7IGV4aXQgMTsgfQorICAgIGZvciB4IGluIHJ1bi0qOyBkbworCXRlc3QgLWYgIiR4IiB8fCBjb250aW51ZQorCWNhc2UgIiR4IiBpbgorCSAgICAiJDAifHJ1bi1taW5pbWFsfHJ1bi1ncHJvZikgOzsKKwkgICAgKi5vcmlnfCp+KSA7OworCSAgICAjKikgZWNobyAkeCA7IHNoICR4IDs7CisJICAgICopCisJICAgIHNoICIkeCIgPiIuLi8kMS0keC5mYWlsIiAyPiYxICYmIFwKKwkgICAgeyBlY2hvICIkMS8keDogb2siOyBybSAiLi4vJDEtJHguZmFpbCI7IH0gfHwgZWNobyAiJDEvJHg6IGZhaWwiOworCSAgICA7OworCWVzYWMKKyAgICBkb25lCisgICAgIyBNYW55IGJhc2ggcnVuLVhYWCBzY3JpcHRzIGp1c3QgZG8gdGhpcywKKyAgICAjIG5vIHBvaW50IGluIGR1cGxpY2F0aW9uIGl0IGFsbCBvdmVyIHRoZSBwbGFjZQorICAgIGZvciB4IGluICoudGVzdHM7IGRvCisJdGVzdCAteCAiJHgiIHx8IGNvbnRpbnVlCisJbmFtZT0iJHt4JSUudGVzdHN9IgorCXRlc3QgLWYgIiRuYW1lLnJpZ2h0IiB8fCBjb250aW51ZQorIwllY2hvIFJ1bm5pbmcgdGVzdDogIiRuYW1lLnJpZ2h0IgorCXsKKwkgICAgIiRUSElTX1NIIiAiLi8keCIgPiIkbmFtZS54eCIgMj4mMQorCSAgICBkaWZmIC11ICIkbmFtZS54eCIgIiRuYW1lLnJpZ2h0IiA+Ii4uLyQxLSR4LmZhaWwiICYmIHJtIC1mICIkbmFtZS54eCIgIi4uLyQxLSR4LmZhaWwiCisJfSAmJiBlY2hvICIkMS8keDogb2siIHx8IGVjaG8gIiQxLyR4OiBmYWlsIgorICAgIGRvbmUKKyAgICApCit9CisKKyMgTWFpbiBwYXJ0IG9mIHRoaXMgc2NyaXB0CisjIFVzYWdlOiBydW4tYWxsIFtkaXJlY3Rvcmllc10KKworaWYgWyAkIyAtbHQgMSBdOyB0aGVuCisgICAgIyBBbGwgc3ViIGRpcmVjdG9yaWVzCisgICAgbW9kdWxlcz1gbHMgLWQgbXNoLSpgCisKKyAgICBmb3IgbW9kdWxlIGluICRtb2R1bGVzOyBkbworCWRvX3Rlc3QgJG1vZHVsZQorICAgIGRvbmUKK2Vsc2UKKyAgICB3aGlsZSBbICQjIC1nZSAxIF07IGRvCisJaWYgWyAtZCAkMSBdOyB0aGVuCisJICAgIGRvX3Rlc3QgJDEKKwlmaQorCXNoaWZ0CisgICAgZG9uZQorZmkKZGlmZiAtLWdpdCBhL3NoZWxsL3JhbmRvbS5jIGIvc2hlbGwvcmFuZG9tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQzNjIwNQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL3JhbmRvbS5jCkBAIC0wLDAgKzEsMTYwIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiAkUkFORE9NIHN1cHBvcnQuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKiBGb3IgdGVzdGluZyBhZ2FpbnN0IGRpZWhhcmRlciwgeW91IG5lZWQgb25seSByYW5kb20ue2MsaH0KKyAqIEhvd3RvOgorICogZ2NjIC1PMiAtV2FsbCAtRFJBTkRURVNUIHJhbmRvbS5jIC1vIHJhbmRvbQorICogLi9yYW5kb20gfCBkaWVoYXJkZXIgLWcgMjAwIC1hCisgKi8KKworI2lmICFkZWZpbmVkIFJBTkRURVNUCisKKyMgaW5jbHVkZSAibGliYmIuaCIKKyMgaW5jbHVkZSAicmFuZG9tLmgiCisjIGRlZmluZSBSQU5EX0JBU0hfTUFTSyAweDdmZmYKKworI2Vsc2UKKyMgaW5jbHVkZSA8c3RkaW50Lmg+CisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBpbmNsdWRlIDxzdGRpby5oPgorIyBpbmNsdWRlIDx0aW1lLmg+CisjIGRlZmluZSBGQVNUX0ZVTkMgLyogbm90aGluZyAqLworIyBkZWZpbmUgUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOIC8qIG5vdGhpbmcgKi8KKyMgZGVmaW5lIFBPUF9TQVZFRF9GVU5DVElPTl9WSVNJQklMSVRZIC8qIG5vdGhpbmcgKi8KKyMgZGVmaW5lIG1vbm90b25pY191cygpIHRpbWUoTlVMTCkKKyMgaW5jbHVkZSAicmFuZG9tLmgiCisjIGRlZmluZSBSQU5EX0JBU0hfTUFTSyAweGZmZmZmZmZmIC8qIG9mZiAqLworI2VuZGlmCisKK3VpbnQzMl90IEZBU1RfRlVOQworbmV4dF9yYW5kb20ocmFuZG9tX3QgKnJuZCkKK3sKKwkvKiBHYWxvaXMgTEZTUiBwYXJhbWV0ZXI6CisJICogVGFwcyBhdCAzMiAzMSAyOSAxOgorCSAqLworCWVudW0geyBNQVNLID0gMHg4MDAwMDAwYiB9OworCS8qIEFub3RoZXIgZXhhbXBsZSAtIHRhcHMgYXQgMzIgMzEgMzAgMTA6ICovCisJLyogZW51bSB7IE1BU0sgPSAweDAwNDAwMDA3IH07ICovCisKKwkvKiBYb3JzaGlmdCBwYXJhbWV0ZXJzOgorCSAqIENob2ljZXMgZm9yIGEsYixjOiAxMCwxMywxMDsgOCw5LDIyOyAyLDcsMzsgMjMsMywyNAorCSAqIChnaXZlbiBieSBhbGdvcml0aG0gYXV0aG9yKQorCSAqLworICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgICAgICBhID0gMiwKKyAgICAgICAgICAgICAgICBiID0gNywKKyAgICAgICAgICAgICAgICBjID0gMywKKyAgICAgICAgfTsKKworCXVpbnQzMl90IHQ7CisKKwlpZiAoVU5JTklURURfUkFORE9NX1Qocm5kKSkgeworCQkvKiBDYW4gdXNlIG1vbm90b25pY19ucygpIGZvciBiZXR0ZXIgcmFuZG9tbmVzcyBidXQgZm9yIG5vdworCQkgKiBpdCBpcyBub3QgdXNlZCBhbnl3aGVyZSBlbHNlIGluIGJ1c3lib3guLi4gc28gYXZvaWQgYmxvYXQKKwkJICovCisJCUlOSVRfUkFORE9NX1Qocm5kLCBnZXRwaWQoKSwgbW9ub3RvbmljX3VzKCkpOworCX0KKworCS8qIExDRzogcGVyaW9kIG9mIDJeMzIsIGJ1dCBxdWl0ZSB3ZWFrOgorCSAqIGJpdCAwIGFsdGVybmF0ZXMgYmVldHdlZW4gMCBhbmQgMSAocGF0dGVybiBvZiBsZW5ndGggMikKKwkgKiBiaXQgMSBoYXMgYSByZXBlYXRpbmcgcGF0dGVybiBvZiBsZW5ndGggNAorCSAqIGJpdCAyIGhhcyBhIHJlcGVhdGluZyBwYXR0ZXJuIG9mIGxlbmd0aCA4CisJICogZXRjLi4uCisJICovCisJcm5kLT5MQ0cgPSAxNjY0NTI1ICogcm5kLT5MQ0cgKyAxMDEzOTA0MjIzOworCisJLyogR2Fsb2lzIExGU1I6CisJICogcGVyaW9kIG9mIDJeMzItMSA9IDMgKiA1ICogMTcgKiAyNTcgKiA2NTUzNy4KKwkgKiBTdWNjZXNzaXZlIHZhbHVlcyBhcmUgcmlnaHQtc2hpZnRlZCBvbmUgYml0CisJICogYW5kIHBvc3NpYmx5IHhvcmVkIHdpdGggYSBzcGFyc2UgY29uc3RhbnQuCisJICovCisJdCA9IChybmQtPmdhbG9pc19MRlNSIDw8IDEpOworCWlmIChybmQtPmdhbG9pc19MRlNSIDwgMCkgLyogaWYgd2UganVzdCBzaGlmdGVkIDEgb3V0IG9mIG1zYi4uLiAqLworCQl0IF49IE1BU0s7CisJcm5kLT5nYWxvaXNfTEZTUiA9IHQ7CisKKwkvKiBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1hvcnNoaWZ0CisJICogTW9kZXJhdGVseSBnb29kIHN0YXRpc3RpY2FsIHByb3BlcnRpZXM6CisJICogZmFpbHMgdGhlIGZvbGxvd2luZyAiZGllaGFyZGVyIC1nIDIwMCAtYSIgdGVzdHM6CisJICogICAgICAgZGllaGFyZF9vcGVybTV8ICAgMAorCSAqICAgICAgICAgZGllaGFyZF9vcXNvfCAgIDAKKwkgKiBkaWVoYXJkX2NvdW50XzFzX2J5dHwgICAwCisJICogICAgIGRpZWhhcmRfM2RzcGhlcmV8ICAgMworCSAqICAgICAgZGllaGFyZF9zcXVlZXplfCAgIDAKKwkgKiAgICAgICAgIGRpZWhhcmRfcnVuc3wgICAwCisJICogICAgICAgICBkaWVoYXJkX3J1bnN8ICAgMAorCSAqICAgICAgICBkaWVoYXJkX2NyYXBzfCAgIDAKKwkgKiAgICAgICAgZGllaGFyZF9jcmFwc3wgICAwCisJICogcmdiX21pbmltdW1fZGlzdGFuY2V8ICAgMworCSAqIHJnYl9taW5pbXVtX2Rpc3RhbmNlfCAgIDQKKwkgKiByZ2JfbWluaW11bV9kaXN0YW5jZXwgICA1CisJICogICAgIHJnYl9wZXJtdXRhdGlvbnN8ICAgMworCSAqICAgICByZ2JfcGVybXV0YXRpb25zfCAgIDQKKwkgKiAgICAgcmdiX3Blcm11dGF0aW9uc3wgICA1CisJICogICAgICAgICBkYWJfZmlsbHRyZWV8ICAzMgorCSAqICAgICAgICAgZGFiX2ZpbGx0cmVlfCAgMzIKKwkgKiAgICAgICAgIGRhYl9tb25vYml0MnwgIDEyCisJICovCisgYWdhaW46CisJdCA9IHJuZC0+eHM2NF94IF4gKHJuZC0+eHM2NF94IDw8IGEpOworCXJuZC0+eHM2NF94ID0gcm5kLT54czY0X3k7CisJcm5kLT54czY0X3kgPSBybmQtPnhzNjRfeSBeIChybmQtPnhzNjRfeSA+PiBjKSBeIHQgXiAodCA+PiBiKTsKKwkvKgorCSAqIFBlcmlvZCAyXjY0LTEgPSAyXjMyKzEgKiAyXjMyLTEgaGFzIGEgY29tbW9uIGRpdmlzb3Igd2l0aCBHYWxvaXMgTEZTUi4KKwkgKiBCeSBza2lwcGluZyB0d28gcG9zc2libGUgc3RhdGVzICgweDEgYW5kIDB4Mikgd2UgcmVkdWNlIHBlcmlvZCB0bworCSAqIDJeNjQtMyA9IDEzICogMzg4OSAqIDM2NDg3MDIyNzE0MzgwOSB3aGljaCBoYXMgbm8gY29tbW9uIGRpdmlzb3JzOgorCSAqLworCWlmIChybmQtPnhzNjRfeSA9PSAwICYmIHJuZC0+eHM2NF94IDw9IDIpCisJCWdvdG8gYWdhaW47CisKKwkvKiBDb21iaW5lZCBMQ0cgKyBHYWxvaXMgTEZTUiBybmcgaGFzIDJeMzIgKiAyXjMyLTEgcGVyaW9kLgorCSAqIFN0cmVuZ3RoOgorCSAqIGluZGl2aWR1YWxseSwgYm90aCBhcmUgZXh0cmVtZWx5IHdlYWsgY3J5cHRvZ3JhcGh5Y2FsbHk7CisJICogd2hlbiBjb21iaW5lZCwgdGhleSBmYWlsIHRoZSBmb2xsb3dpbmcgImRpZWhhcmRlciAtZyAyMDAgLWEiIHRlc3RzOgorCSAqICAgICBkaWVoYXJkX3JhbmtfNng4fCAgIDAKKwkgKiAgICAgICAgIGRpZWhhcmRfb3Fzb3wgICAwCisJICogICAgICAgICAgZGllaGFyZF9kbmF8ICAgMAorCSAqIGRpZWhhcmRfY291bnRfMXNfYnl0fCAgIDAKKwkgKiAgICAgICAgICByZ2JfYml0ZGlzdHwgICAyCisJICogICAgICAgICBkYWJfbW9ub2JpdDJ8ICAxMgorCSAqCisJICogQ29tYmluaW5nIHRoZW0gd2l0aCB4b3JzaGlmdC02NCBpbmNyZWFzZXMgcGVyaW9kIHRvCisJICogMl4zMiAqIDJeMzItMSAqIDJeNjQtMworCSAqIHdoaWNoIGlzIGFib3V0IDJeMTI4LCBvciBpbiBiYXNlIDEwIH4zLjQwKjEwXjM4LgorCSAqIFN0cmVuZ3RoIG9mIHRoZSBjb21iaW5hdGlvbjoKKwkgKiBwYXNzZXMgYWxsICJkaWVoYXJkZXIgLWcgMjAwIC1hIiB0ZXN0cy4KKwkgKgorCSAqIENvbWJpbmluZyB3aXRoIHN1YnRyYWN0aW9uIGFuZCBhZGRpdGlvbiBpcyBqdXN0IGZvciBmdW4uCisJICogSXQgZG9lcyBub3QgYWRkIG1lYW5pbmdmdWwgc3RyZW5ndGgsIGNvdWxkIHVzZSB4b3Igb3BlcmF0aW9uIGluc3RlYWQuCisJICovCisJdCA9IHJuZC0+Z2Fsb2lzX0xGU1IgLSBybmQtPkxDRyArIHJuZC0+eHM2NF95OworCisJLyogYmFzaCBjb21wYXQgJFJBTkRPTSByYW5nZTogKi8KKwlyZXR1cm4gdCAmIFJBTkRfQkFTSF9NQVNLOworfQorCisjaWZkZWYgUkFORFRFU1QKK3N0YXRpYyByYW5kb21fdCBybmQ7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgaTsKKwl1aW50MzJfdCBidWZbNDA5Nl07CisKKwlmb3IgKDs7KSB7CisJCWZvciAoaSA9IDA7IGkgPCBzaXplb2YoYnVmKSAvIHNpemVvZihidWZbMF0pOyBpKyspIHsKKwkJCWJ1ZltpXSA9IG5leHRfcmFuZG9tKCZybmQpOworCQl9CisJCXdyaXRlKDEsIGJ1Ziwgc2l6ZW9mKGJ1ZikpOworCX0KKworICAgICAgICByZXR1cm4gMDsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaGVsbC9yYW5kb20uaCBiL3NoZWxsL3JhbmRvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZWI0NGMKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9yYW5kb20uaApAQCAtMCwwICsxLDQxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiAkUkFORE9NIHN1cHBvcnQuCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5IERlbnlzIFZsYXNlbmtvCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2lmbmRlZiBTSEVMTF9SQU5ET01fSAorI2RlZmluZSBTSEVMTF9SQU5ET01fSCAxCisKK1BVU0hfQU5EX1NFVF9GVU5DVElPTl9WSVNJQklMSVRZX1RPX0hJRERFTgorCit0eXBlZGVmIHN0cnVjdCByYW5kb21fdCB7CisJLyogU3RhdGUgb2YgcmFuZG9tIG51bWJlciBnZW5lcmF0b3JzOiAqLworCisJLyogR2Fsb2lzIExGU1IgKGZhc3QgYnV0IHdlYWspICovCisJaW50MzJfdCBnYWxvaXNfTEZTUjsgLyogbXVzdCBiZSBzaWduZWQhICovCisKKwkvKiBMQ0cgKGZhc3QgYnV0IHdlYWspICovCisJdWludDMyX3QgTENHOworCisJLyogNjQtYml0IHhvcnNoaWZ0IChmYXN0LCBtb2RlcmF0ZSBzdHJlbmd0aCkgKi8KKwl1aW50MzJfdCB4czY0X3g7CisJdWludDMyX3QgeHM2NF95OworfSByYW5kb21fdDsKKworI2RlZmluZSBVTklOSVRFRF9SQU5ET01fVChybmQpIFwKKwkoKHJuZCktPmdhbG9pc19MRlNSID09IDApCisKKyNkZWZpbmUgSU5JVF9SQU5ET01fVChybmQsIG5vbnplcm8sIHYpIFwKKwkoKHJuZCktPmdhbG9pc19MRlNSID0gKHJuZCktPnhzNjRfeCA9IChub256ZXJvKSwgKHJuZCktPkxDRyA9IChybmQpLT54czY0X3kgPSAodikpCisKKyNkZWZpbmUgQ0xFQVJfUkFORE9NX1Qocm5kKSBcCisJKChybmQpLT5nYWxvaXNfTEZTUiA9IDApCisKK3VpbnQzMl90IG5leHRfcmFuZG9tKHJhbmRvbV90ICpybmQpIEZBU1RfRlVOQzsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zaGVsbC9zaGVsbF9jb21tb24uYyBiL3NoZWxsL3NoZWxsX2NvbW1vbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOTYwN2MKLS0tIC9kZXYvbnVsbAorKysgYi9zaGVsbC9zaGVsbF9jb21tb24uYwpAQCAtMCwwICsxLDQ5OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogQWRhcHRlZCBmcm9tIGFzaCBhcHBsZXQgY29kZQorICoKKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gc29mdHdhcmUgY29udHJpYnV0ZWQgdG8gQmVya2VsZXkgYnkKKyAqIEtlbm5ldGggQWxtcXVpc3QuCisgKgorICogQ29weXJpZ2h0IChjKSAxOTg5LCAxOTkxLCAxOTkzLCAxOTk0CisgKiAgICAgIFRoZSBSZWdlbnRzIG9mIHRoZSBVbml2ZXJzaXR5IG9mIENhbGlmb3JuaWEuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIENvcHlyaWdodCAoYykgMTk5Ny0yMDA1IEhlcmJlcnQgWHUgPGhlcmJlcnRAZ29uZG9yLmFwYW5hLm9yZy5hdT4KKyAqIHdhcyByZS1wb3J0ZWQgZnJvbSBOZXRCU0QgYW5kIGRlYmlhbml6ZWQuCisgKgorICogQ29weXJpZ2h0IChjKSAyMDEwIERlbnlzIFZsYXNlbmtvCisgKiBTcGxpdCBmcm9tIGFzaC5jCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAic2hlbGxfY29tbW9uLmgiCisjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+IC8qIGdldHJsaW1pdCAqLworCitjb25zdCBjaGFyIGRlZmlmc3ZhcltdIEFMSUdOMSA9ICJJRlM9IFx0XG4iOworCisKK2ludCBGQVNUX0ZVTkMgaXNfd2VsbF9mb3JtZWRfdmFyX25hbWUoY29uc3QgY2hhciAqcywgY2hhciB0ZXJtaW5hdG9yKQoreworCWlmICghcyB8fCAhKGlzYWxwaGEoKnMpIHx8ICpzID09ICdfJykpCisJCXJldHVybiAwOworCisJZG8KKwkJcysrOworCXdoaWxlIChpc2FsbnVtKCpzKSB8fCAqcyA9PSAnXycpOworCisJcmV0dXJuICpzID09IHRlcm1pbmF0b3I7Cit9CisKKy8qIHJlYWQgYnVpbHRpbiAqLworCisvKiBOZWVkcyB0byBiZSBpbnRlcnJ1cHRpYmxlOiBzaGVsbCBtdXN0IGhhbmRsZSB0cmFwcyBhbmQgc2hlbGwtc3BlY2lhbCBzaWduYWxzCisgKiB3aGlsZSBpbnNpZGUgcmVhZC4gVG8gaW1wbGVtZW50IHRoaXMsIGJlIHN1cmUgdG8gbm90IGxvb3Agb24gRUlOVFIKKyAqIGFuZCByZXR1cm4gZXJybm8gPT0gRUlOVFIgcmVsaWFibHkuCisgKi8KKy8vVE9ETzogdXNlIG1vcmUgZWZmaWNpZW50IHNldHZhcigpIHdoaWNoIHRha2VzIGEgcG9pbnRlciB0byBtYWxsb2NlZCAiVkFSPVZBTCIKKy8vc3RyaW5nLiBodXNoIG5hdHVyYWxseSBoYXMgaXQsIGFuZCBhc2ggaGFzIHNldHZhcmVxKCkuCisvL0hlcmUgd2UgY2FuIHNpbXBseSBzdG9yZSAiVkFSPSIgYXQgYnVmZmVyIHN0YXJ0IGFuZCBzdG9yZSByZWFkIGRhdGEgZGlyZWN0bHkKKy8vYWZ0ZXIgIj0iLCB0aGVuIHBhc3MgYnVmZmVyIHRvIHNldHZhcigpIHRvIGNvbnN1bWUuCitjb25zdCBjaGFyKiBGQVNUX0ZVTkMKK3NoZWxsX2J1aWx0aW5fcmVhZCh2b2lkIEZBU1RfRlVOQyAoKnNldHZhcikoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsKSwKKwljaGFyICAgICAgICoqYXJndiwKKwljb25zdCBjaGFyICppZnMsCisJaW50ICAgICAgICByZWFkX2ZsYWdzLAorCWNvbnN0IGNoYXIgKm9wdF9uLAorCWNvbnN0IGNoYXIgKm9wdF9wLAorCWNvbnN0IGNoYXIgKm9wdF90LAorCWNvbnN0IGNoYXIgKm9wdF91CispCit7CisJdW5zaWduZWQgZXJyOworCXVuc2lnbmVkIGVuZF9tczsgLyogLXQgVElNRU9VVCAqLworCWludCBmZDsgLyogLXUgRkQgKi8KKwlpbnQgbmNoYXJzOyAvKiAtbiBOVU0gKi8KKwljaGFyICoqcHA7CisJY2hhciAqYnVmZmVyOworCXN0cnVjdCB0ZXJtaW9zIHR0eSwgb2xkX3R0eTsKKwljb25zdCBjaGFyICpyZXR2YWw7CisJaW50IGJ1ZnBvczsgLyogbmVlZCB0byBiZSBhYmxlIHRvIGhvbGQgLTEgKi8KKwlpbnQgc3RhcnR3b3JkOworCXNtYWxsaW50IGJhY2tzbGFzaDsKKworCWVycm5vID0gZXJyID0gMDsKKworCXBwID0gYXJndjsKKwl3aGlsZSAoKnBwKSB7CisJCWlmICghaXNfd2VsbF9mb3JtZWRfdmFyX25hbWUoKnBwLCAnXDAnKSkgeworCQkJLyogTWltaWMgYmFzaCBtZXNzYWdlICovCisJCQliYl9lcnJvcl9tc2coInJlYWQ6ICclcyc6IG5vdCBhIHZhbGlkIGlkZW50aWZpZXIiLCAqcHApOworCQkJcmV0dXJuIChjb25zdCBjaGFyICopKHVpbnRwdHJfdCkxOworCQl9CisJCXBwKys7CisJfQorCisJbmNoYXJzID0gMDsgLyogaWYgIT0gMCwgLW4gaXMgaW4gZWZmZWN0ICovCisJaWYgKG9wdF9uKSB7CisJCW5jaGFycyA9IGJiX3N0cnRvdShvcHRfbiwgTlVMTCwgMTApOworCQlpZiAobmNoYXJzIDwgMCB8fCBlcnJubykKKwkJCXJldHVybiAiaW52YWxpZCBjb3VudCI7CisJCS8qIG5vdGU6ICItbiAwIjogb2ZmIChiYXNoIDMuMiBkb2VzIHRoaXMgdG9vKSAqLworCX0KKwllbmRfbXMgPSAwOworCWlmIChvcHRfdCkgeworCQllbmRfbXMgPSBiYl9zdHJ0b3Uob3B0X3QsIE5VTEwsIDEwKTsKKwkJaWYgKGVycm5vIHx8IGVuZF9tcyA+IFVJTlRfTUFYIC8gMjA0OCkKKwkJCXJldHVybiAiaW52YWxpZCB0aW1lb3V0IjsKKwkJZW5kX21zICo9IDEwMDA7CisjaWYgMCAvKiBldmVuIGJhc2ggaGFzIG5vIC10IE4uTk5OIHN1cHBvcnQgKi8KKwkJdHMudHZfc2VjID0gYmJfc3RydG91KG9wdF90LCAmcCwgMTApOworCQl0cy50dl91c2VjID0gMDsKKwkJLyogRUlOVkFMIG1lYW5zIG51bWJlciBpcyBvaywgYnV0IG5vdCB0ZXJtaW5hdGVkIGJ5IE5VTCAqLworCQlpZiAoKnAgPT0gJy4nICYmIGVycm5vID09IEVJTlZBTCkgeworCQkJY2hhciAqcDI7CisJCQlpZiAoKisrcCkgeworCQkJCWludCBzY2FsZTsKKwkJCQl0cy50dl91c2VjID0gYmJfc3RydG91KHAsICZwMiwgMTApOworCQkJCWlmIChlcnJubykKKwkJCQkJcmV0dXJuICJpbnZhbGlkIHRpbWVvdXQiOworCQkJCXNjYWxlID0gcDIgLSBwOworCQkJCS8qIG5vcm1hbGl6ZSB0byB1c2VjICovCisJCQkJaWYgKHNjYWxlID4gNikKKwkJCQkJcmV0dXJuICJpbnZhbGlkIHRpbWVvdXQiOworCQkJCXdoaWxlIChzY2FsZSsrIDwgNikKKwkJCQkJdHMudHZfdXNlYyAqPSAxMDsKKwkJCX0KKwkJfSBlbHNlIGlmICh0cy50dl9zZWMgPCAwIHx8IGVycm5vKSB7CisJCQlyZXR1cm4gImludmFsaWQgdGltZW91dCI7CisJCX0KKwkJaWYgKCEodHMudHZfc2VjIHwgdHMudHZfdXNlYykpIHsgLyogYm90aCBhcmUgMD8gKi8KKwkJCXJldHVybiAiaW52YWxpZCB0aW1lb3V0IjsKKwkJfQorI2VuZGlmIC8qIGlmIDAgKi8KKwl9CisJZmQgPSBTVERJTl9GSUxFTk87CisJaWYgKG9wdF91KSB7CisJCWZkID0gYmJfc3RydG91KG9wdF91LCBOVUxMLCAxMCk7CisJCWlmIChmZCA8IDAgfHwgZXJybm8pCisJCQlyZXR1cm4gImludmFsaWQgZmlsZSBkZXNjcmlwdG9yIjsKKwl9CisKKwlpZiAob3B0X3AgJiYgaXNhdHR5KGZkKSkgeworCQlmcHV0cyhvcHRfcCwgc3RkZXJyKTsKKwkJZmZsdXNoX2FsbCgpOworCX0KKworCWlmIChpZnMgPT0gTlVMTCkKKwkJaWZzID0gZGVmaWZzOworCisJaWYgKG5jaGFycyB8fCAocmVhZF9mbGFncyAmIEJVSUxUSU5fUkVBRF9TSUxFTlQpKSB7CisJCXRjZ2V0YXR0cihmZCwgJnR0eSk7CisJCW9sZF90dHkgPSB0dHk7CisJCWlmIChuY2hhcnMpIHsKKwkJCXR0eS5jX2xmbGFnICY9IH5JQ0FOT047CisJCQkvLyBTZXR0aW5nIGl0IHRvIG1vcmUgdGhhbiAxIGJyZWFrcyBwb2xsKCk6CisJCQkvLyBpdCBibG9ja3MgZXZlbiBpZiB0aGVyZSdzIGRhdGEuICE/PworCQkJLy90dHkuY19jY1tWTUlOXSA9IG5jaGFycyA8IDI1NiA/IG5jaGFycyA6IDI1NTsKKwkJCS8qIHJlYWRzIHdvdWxkIGJsb2NrIG9ubHkgaWYgPCAxIGNoYXIgaXMgYXZhaWxhYmxlICovCisJCQl0dHkuY19jY1tWTUlOXSA9IDE7CisJCQkvKiBubyB0aW1lb3V0IChyZWFkcyBibG9jayBmb3JldmVyKSAqLworCQkJdHR5LmNfY2NbVlRJTUVdID0gMDsKKwkJfQorCQlpZiAocmVhZF9mbGFncyAmIEJVSUxUSU5fUkVBRF9TSUxFTlQpIHsKKwkJCXR0eS5jX2xmbGFnICY9IH4oRUNITyB8IEVDSE9LIHwgRUNIT05MKTsKKwkJfQorCQkvKiBUaGlzIGZvcmNlcyBleGVjdXRpb24gb2YgInJlc3RvcmluZyIgdGNnZXRhdHRyIGxhdGVyICovCisJCXJlYWRfZmxhZ3MgfD0gQlVJTFRJTl9SRUFEX1NJTEVOVDsKKwkJLyogaWYgdGNnZXRhdHRyIGZhaWxlZCwgdGNzZXRhdHRyIHdpbGwgZmFpbCB0b28uCisJCSAqIElnbm9yaW5nLCBpdCdzIGhhcm1sZXNzLiAqLworCQl0Y3NldGF0dHIoZmQsIFRDU0FOT1csICZ0dHkpOworCX0KKworCXJldHZhbCA9IChjb25zdCBjaGFyICopKHVpbnRwdHJfdCkwOworCXN0YXJ0d29yZCA9IDE7CisJYmFja3NsYXNoID0gMDsKKwlpZiAoZW5kX21zKSAvKiBOQjogZW5kX21zIHN0YXlzIG5vbnplcm86ICovCisJCWVuZF9tcyA9ICgodW5zaWduZWQpbW9ub3RvbmljX21zKCkgKyBlbmRfbXMpIHwgMTsKKwlidWZmZXIgPSBOVUxMOworCWJ1ZnBvcyA9IDA7CisJZG8geworCQljaGFyIGM7CisJCXN0cnVjdCBwb2xsZmQgcGZkWzFdOworCQlpbnQgdGltZW91dDsKKworCQlpZiAoKGJ1ZnBvcyAmIDB4ZmYpID09IDApCisJCQlidWZmZXIgPSB4cmVhbGxvYyhidWZmZXIsIGJ1ZnBvcyArIDB4MTAxKTsKKworCQl0aW1lb3V0ID0gLTE7CisJCWlmIChlbmRfbXMpIHsKKwkJCXRpbWVvdXQgPSBlbmRfbXMgLSAodW5zaWduZWQpbW9ub3RvbmljX21zKCk7CisJCQlpZiAodGltZW91dCA8PSAwKSB7IC8qIGFscmVhZHkgbGF0ZT8gKi8KKwkJCQlyZXR2YWwgPSAoY29uc3QgY2hhciAqKSh1aW50cHRyX3QpMTsKKwkJCQlnb3RvIHJldDsKKwkJCX0KKwkJfQorCisJCS8qIFdlIG11c3QgcG9sbCBldmVuIGlmIHRpbWVvdXQgaXMgLTE6CisJCSAqIHdlIHdhbnQgdG8gYmUgaW50ZXJydXB0ZWQgaWYgc2lnbmFsIGFycml2ZXMsCisJCSAqIHJlZ2FyZGxlc3Mgb2YgU0FfUkVTVEFSVC1uZXNzIG9mIHRoYXQgc2lnbmFsIQorCQkgKi8KKwkJZXJybm8gPSAwOworCQlwZmRbMF0uZmQgPSBmZDsKKwkJcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKwkJaWYgKHBvbGwocGZkLCAxLCB0aW1lb3V0KSAhPSAxKSB7CisJCQkvKiB0aW1lZCBvdXQsIG9yIEVJTlRSICovCisJCQllcnIgPSBlcnJubzsKKwkJCXJldHZhbCA9IChjb25zdCBjaGFyICopKHVpbnRwdHJfdCkxOworCQkJZ290byByZXQ7CisJCX0KKwkJaWYgKHJlYWQoZmQsICZidWZmZXJbYnVmcG9zXSwgMSkgIT0gMSkgeworCQkJZXJyID0gZXJybm87CisJCQlyZXR2YWwgPSAoY29uc3QgY2hhciAqKSh1aW50cHRyX3QpMTsKKwkJCWJyZWFrOworCQl9CisKKwkJYyA9IGJ1ZmZlcltidWZwb3NdOworCQlpZiAoYyA9PSAnXDAnKQorCQkJY29udGludWU7CisJCWlmIChiYWNrc2xhc2gpIHsKKwkJCWJhY2tzbGFzaCA9IDA7CisJCQlpZiAoYyAhPSAnXG4nKQorCQkJCWdvdG8gcHV0OworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCEocmVhZF9mbGFncyAmIEJVSUxUSU5fUkVBRF9SQVcpICYmIGMgPT0gJ1xcJykgeworCQkJYmFja3NsYXNoID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID09ICdcbicpCisJCQlicmVhazsKKworCQkvKiAkSUZTIHNwbGl0dGluZy4gTk9UIGRvbmUgaWYgd2UgcnVuICJyZWFkIgorCQkgKiB3aXRob3V0IHZhcmlhYmxlIG5hbWVzIChiYXNoIGNvbXBhdCkuCisJCSAqIFRodXMsICJyZWFkIiBhbmQgInJlYWQgUkVQTFkiIGFyZSBub3QgdGhlIHNhbWUuCisJCSAqLworCQlpZiAoYXJndlswXSkgeworLyogaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvOTY5OTkxOTc5OS91dGlsaXRpZXMvVjNfY2hhcDAyLmh0bWwjdGFnXzE4XzA2XzA1ICovCisJCQljb25zdCBjaGFyICppc19pZnMgPSBzdHJjaHIoaWZzLCBjKTsKKwkJCWlmIChzdGFydHdvcmQgJiYgaXNfaWZzKSB7CisJCQkJaWYgKGlzc3BhY2UoYykpCisJCQkJCWNvbnRpbnVlOworCQkJCS8qIGl0IGlzIGEgbm9uLXNwYWNlIGlmcyBjaGFyICovCisJCQkJc3RhcnR3b3JkLS07CisJCQkJaWYgKHN0YXJ0d29yZCA9PSAxKSAvKiBmaXJzdCBvbmU/ICovCisJCQkJCWNvbnRpbnVlOyAvKiB5ZXMsIGl0IGlzIG5vdCBuZXh0IHdvcmQgeWV0ICovCisJCQl9CisJCQlzdGFydHdvcmQgPSAwOworCQkJaWYgKGFyZ3ZbMV0gIT0gTlVMTCAmJiBpc19pZnMpIHsKKwkJCQlidWZmZXJbYnVmcG9zXSA9ICdcMCc7CisJCQkJYnVmcG9zID0gMDsKKwkJCQlzZXR2YXIoKmFyZ3YsIGJ1ZmZlcik7CisJCQkJYXJndisrOworCQkJCS8qIGNhbiB3ZSBza2lwIG9uZSBub24tc3BhY2UgaWZzIGNoYXI/ICgyOiB5ZXMpICovCisJCQkJc3RhcnR3b3JkID0gaXNzcGFjZShjKSA/IDIgOiAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisgcHV0OgorCQlidWZwb3MrKzsKKwl9IHdoaWxlICgtLW5jaGFycyk7CisKKwlpZiAoYXJndlswXSkgeworCQkvKiBSZW1vdmUgdHJhaWxpbmcgc3BhY2UgJElGUyBjaGFycyAqLworCQl3aGlsZSAoLS1idWZwb3MgPj0gMCAmJiBpc3NwYWNlKGJ1ZmZlcltidWZwb3NdKSAmJiBzdHJjaHIoaWZzLCBidWZmZXJbYnVmcG9zXSkgIT0gTlVMTCkKKwkJCWNvbnRpbnVlOworCQlidWZmZXJbYnVmcG9zICsgMV0gPSAnXDAnOworCQkvKiBVc2UgdGhlIHJlbWFpbmRlciBhcyBhIHZhbHVlIGZvciB0aGUgbmV4dCB2YXJpYWJsZSAqLworCQlzZXR2YXIoKmFyZ3YsIGJ1ZmZlcik7CisJCS8qIFNldCB0aGUgcmVzdCB0byAiIiAqLworCQl3aGlsZSAoKisrYXJndikKKwkJCXNldHZhcigqYXJndiwgIiIpOworCX0gZWxzZSB7CisJCS8qIE5vdGU6IG5vICRJRlMgcmVtb3ZhbCAqLworCQlidWZmZXJbYnVmcG9zXSA9ICdcMCc7CisJCXNldHZhcigiUkVQTFkiLCBidWZmZXIpOworCX0KKworIHJldDoKKwlmcmVlKGJ1ZmZlcik7CisJaWYgKHJlYWRfZmxhZ3MgJiBCVUlMVElOX1JFQURfU0lMRU5UKQorCQl0Y3NldGF0dHIoZmQsIFRDU0FOT1csICZvbGRfdHR5KTsKKworCWVycm5vID0gZXJyOworCXJldHVybiByZXR2YWw7Cit9CisKKy8qIHVsaW1pdCBidWlsdGluICovCisKK3N0cnVjdCBsaW1pdHMgeworCXVpbnQ4X3QgY21kOyAgICAgICAgICAgIC8qIFJMSU1JVF94eHggZml0IGludG8gaXQgKi8KKwl1aW50OF90IGZhY3Rvcl9zaGlmdDsgICAvKiBzaGlmdCBieSB0byBnZXQgcmxpbV97Y3VyLG1heH0gdmFsdWVzICovCisJY2hhciBvcHRpb247CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbGltaXRzIGxpbWl0c190YmxbXSA9IHsKKyNpZmRlZiBSTElNSVRfRlNJWkUKKwl7IFJMSU1JVF9GU0laRSwJCTksCSdmJywJImZpbGUgc2l6ZSAoYmxvY2tzKSIgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9DUFUKKwl7IFJMSU1JVF9DUFUsCQkwLAkndCcsCSJjcHUgdGltZSAoc2Vjb25kcykiIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfREFUQQorCXsgUkxJTUlUX0RBVEEsCQkxMCwJJ2QnLAkiZGF0YSBzZWcgc2l6ZSAoa2IpIiB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX1NUQUNLCisJeyBSTElNSVRfU1RBQ0ssCQkxMCwJJ3MnLAkic3RhY2sgc2l6ZSAoa2IpIiB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0NPUkUKKwl7IFJMSU1JVF9DT1JFLAkJOSwJJ2MnLAkiY29yZSBmaWxlIHNpemUgKGJsb2NrcykiIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfUlNTCisJeyBSTElNSVRfUlNTLAkJMTAsCSdtJywJInJlc2lkZW50IHNldCBzaXplIChrYikiIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfTUVNTE9DSworCXsgUkxJTUlUX01FTUxPQ0ssCTEwLAknbCcsCSJsb2NrZWQgbWVtb3J5IChrYikiIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfTlBST0MKKwl7IFJMSU1JVF9OUFJPQywJCTAsCSdwJywJInByb2Nlc3NlcyIgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9OT0ZJTEUKKwl7IFJMSU1JVF9OT0ZJTEUsCTAsCSduJywJImZpbGUgZGVzY3JpcHRvcnMiIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfQVMKKwl7IFJMSU1JVF9BUywJCTEwLAkndicsCSJhZGRyZXNzIHNwYWNlIChrYikiIH0sCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfTE9DS1MKKwl7IFJMSU1JVF9MT0NLUywJCTAsCSd3JywJImxvY2tzIiB9LAorI2VuZGlmCisjaWZkZWYgUkxJTUlUX05JQ0UKKwl7IFJMSU1JVF9OSUNFLAkJMCwJJ2UnLAkic2NoZWR1bGluZyBwcmlvcml0eSIgfSwKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9SVFBSSU8KKwl7IFJMSU1JVF9SVFBSSU8sCTAsCSdyJywJInJlYWwtdGltZSBwcmlvcml0eSIgfSwKKyNlbmRpZgorfTsKKworZW51bSB7CisJT1BUX2hhcmQgPSAoMSA8PCAwKSwKKwlPUFRfc29mdCA9ICgxIDw8IDEpLAorfTsKKworLyogIi0iOiB0cmVhdCBhcmdzIGFzIHBhcmFtZXRlcnMgb2Ygb3B0aW9uIHdpdGggQVNDSUkgY29kZSAxICovCitzdGF0aWMgY29uc3QgY2hhciB1bGltaXRfb3B0X3N0cmluZ1tdID0gIi1IU2EiCisjaWZkZWYgUkxJTUlUX0ZTSVpFCisJCQkiZjo6IgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0NQVQorCQkJInQ6OiIKKyNlbmRpZgorI2lmZGVmIFJMSU1JVF9EQVRBCisJCQkiZDo6IgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX1NUQUNLCisJCQkiczo6IgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0NPUkUKKwkJCSJjOjoiCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfUlNTCisJCQkibTo6IgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX01FTUxPQ0sKKwkJCSJsOjoiCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfTlBST0MKKwkJCSJwOjoiCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfTk9GSUxFCisJCQkibjo6IgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0FTCisJCQkidjo6IgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX0xPQ0tTCisJCQkidzo6IgorI2VuZGlmCisjaWZkZWYgUkxJTUlUX05JQ0UKKwkJCSJlOjoiCisjZW5kaWYKKyNpZmRlZiBSTElNSVRfUlRQUklPCisJCQkicjo6IgorI2VuZGlmCisJCQk7CisKK3N0YXRpYyB2b2lkIHByaW50bGltKHVuc2lnbmVkIG9wdHMsIGNvbnN0IHN0cnVjdCBybGltaXQgKmxpbWl0LAorCQkJY29uc3Qgc3RydWN0IGxpbWl0cyAqbCkKK3sKKwlybGltX3QgdmFsOworCisJdmFsID0gbGltaXQtPnJsaW1fbWF4OworCWlmICghKG9wdHMgJiBPUFRfaGFyZCkpCisJCXZhbCA9IGxpbWl0LT5ybGltX2N1cjsKKworCWlmICh2YWwgPT0gUkxJTV9JTkZJTklUWSkKKwkJcHV0cygidW5saW1pdGVkIik7CisJZWxzZSB7CisJCXZhbCA+Pj0gbC0+ZmFjdG9yX3NoaWZ0OworCQlwcmludGYoIiVsbHVcbiIsIChsb25nIGxvbmcpIHZhbCk7CisJfQorfQorCitpbnQgRkFTVF9GVU5DCitzaGVsbF9idWlsdGluX3VsaW1pdChjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBvcHRzOworCXVuc2lnbmVkIGFyZ2M7CisKKwkvKiBXZSBjYW4ndCB1c2UgZ2V0b3B0MzI6IG5lZWQgdG8gaGFuZGxlIGNvbW1hbmRzIGxpa2UKKwkgKiB1bGltaXQgMTIzIC1jMiAtbCA0NTYKKwkgKi8KKworCS8qIEluIGNhc2UgZ2V0b3B0IHdhcyBhbHJlYWR5IGNhbGxlZDoKKwkgKiByZXNldCB0aGUgbGliYyBnZXRvcHQoKSBmdW5jdGlvbiwgd2hpY2gga2VlcHMgaW50ZXJuYWwgc3RhdGUuCisJICovCisjaWZkZWYgX19HTElCQ19fCisJb3B0aW5kID0gMDsKKyNlbHNlIC8qIEJTRCBzdHlsZSAqLworCW9wdGluZCA9IDE7CisJLyogb3B0cmVzZXQgPSAxOyAqLworI2VuZGlmCisJLyogb3B0YXJnID0gTlVMTDsgb3B0ZXJyID0gMDsgb3B0b3B0ID0gMDsgLSBkbyB3ZSBuZWVkIHRoaXM/PyAqLworCisJYXJnYyA9IDE7CisJd2hpbGUgKGFyZ3ZbYXJnY10pCisJCWFyZ2MrKzsKKworCW9wdHMgPSAwOworCXdoaWxlICgxKSB7CisJCXN0cnVjdCBybGltaXQgbGltaXQ7CisJCWNvbnN0IHN0cnVjdCBsaW1pdHMgKmw7CisJCWludCBvcHRfY2hhciA9IGdldG9wdChhcmdjLCBhcmd2LCB1bGltaXRfb3B0X3N0cmluZyk7CisKKwkJaWYgKG9wdF9jaGFyID09IC0xKQorCQkJYnJlYWs7CisJCWlmIChvcHRfY2hhciA9PSAnSCcpIHsKKwkJCW9wdHMgfD0gT1BUX2hhcmQ7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAob3B0X2NoYXIgPT0gJ1MnKSB7CisJCQlvcHRzIHw9IE9QVF9zb2Z0OworCQkJY29udGludWU7CisJCX0KKworCQlpZiAob3B0X2NoYXIgPT0gJ2EnKSB7CisJCQlmb3IgKGwgPSBsaW1pdHNfdGJsOyBsICE9ICZsaW1pdHNfdGJsW0FSUkFZX1NJWkUobGltaXRzX3RibCldOyBsKyspIHsKKwkJCQlnZXRybGltaXQobC0+Y21kLCAmbGltaXQpOworCQkJCXByaW50ZigiLSVjOiAlLTMwcyAiLCBsLT5vcHRpb24sIGwtPm5hbWUpOworCQkJCXByaW50bGltKG9wdHMsICZsaW1pdCwgbCk7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChvcHRfY2hhciA9PSAxKQorCQkJb3B0X2NoYXIgPSAnZic7CisJCWZvciAobCA9IGxpbWl0c190Ymw7IGwgIT0gJmxpbWl0c190YmxbQVJSQVlfU0laRShsaW1pdHNfdGJsKV07IGwrKykgeworCQkJaWYgKG9wdF9jaGFyID09IGwtPm9wdGlvbikgeworCQkJCWNoYXIgKnZhbF9zdHI7CisKKwkJCQlnZXRybGltaXQobC0+Y21kLCAmbGltaXQpOworCisJCQkJdmFsX3N0ciA9IG9wdGFyZzsKKwkJCQlpZiAoIXZhbF9zdHIgJiYgYXJndltvcHRpbmRdICYmIGFyZ3Zbb3B0aW5kXVswXSAhPSAnLScpCisJCQkJCXZhbF9zdHIgPSBhcmd2W29wdGluZCsrXTsgLyogKysgc2tpcHMgTk4gaW4gIi1jIE5OIiBjYXNlICovCisJCQkJaWYgKHZhbF9zdHIpIHsKKwkJCQkJcmxpbV90IHZhbDsKKworCQkJCQlpZiAoc3RyY21wKHZhbF9zdHIsICJ1bmxpbWl0ZWQiKSA9PSAwKQorCQkJCQkJdmFsID0gUkxJTV9JTkZJTklUWTsKKwkJCQkJZWxzZSB7CisJCQkJCQlpZiAoc2l6ZW9mKHZhbCkgPT0gc2l6ZW9mKGludCkpCisJCQkJCQkJdmFsID0gYmJfc3RydG91KHZhbF9zdHIsIE5VTEwsIDEwKTsKKwkJCQkJCWVsc2UgaWYgKHNpemVvZih2YWwpID09IHNpemVvZihsb25nKSkKKwkJCQkJCQl2YWwgPSBiYl9zdHJ0b3VsKHZhbF9zdHIsIE5VTEwsIDEwKTsKKwkJCQkJCWVsc2UKKwkJCQkJCQl2YWwgPSBiYl9zdHJ0b3VsbCh2YWxfc3RyLCBOVUxMLCAxMCk7CisJCQkJCQlpZiAoZXJybm8pIHsKKwkJCQkJCQliYl9lcnJvcl9tc2coImludmFsaWQgbnVtYmVyICclcyciLCB2YWxfc3RyKTsKKwkJCQkJCQlyZXR1cm4gRVhJVF9GQUlMVVJFOworCQkJCQkJfQorCQkJCQkJdmFsIDw8PSBsLT5mYWN0b3Jfc2hpZnQ7CisJCQkJCX0KKy8vYmJfZXJyb3JfbXNnKCJvcHQgJWMgdmFsX3N0cjonJXMnIHZhbDolbGxkIiwgb3B0X2NoYXIsIHZhbF9zdHIsIChsb25nIGxvbmcpdmFsKTsKKwkJCQkJLyogZnJvbSBtYW4gYmFzaDogIklmIG5laXRoZXIgLUggbm9yIC1TCisJCQkJCSAqIGlzIHNwZWNpZmllZCwgYm90aCB0aGUgc29mdCBhbmQgaGFyZAorCQkJCQkgKiBsaW1pdHMgYXJlIHNldC4gKi8KKwkJCQkJaWYgKCFvcHRzKQorCQkJCQkJb3B0cyA9IE9QVF9oYXJkICsgT1BUX3NvZnQ7CisJCQkJCWlmIChvcHRzICYgT1BUX2hhcmQpCisJCQkJCQlsaW1pdC5ybGltX21heCA9IHZhbDsKKwkJCQkJaWYgKG9wdHMgJiBPUFRfc29mdCkKKwkJCQkJCWxpbWl0LnJsaW1fY3VyID0gdmFsOworLy9iYl9lcnJvcl9tc2coInNldHJsaW1pdCglZCwgJWxsZCwgJWxsZCkiLCBsLT5jbWQsIChsb25nIGxvbmcpbGltaXQucmxpbV9jdXIsIChsb25nIGxvbmcpbGltaXQucmxpbV9tYXgpOworCQkJCQlpZiAoc2V0cmxpbWl0KGwtPmNtZCwgJmxpbWl0KSA8IDApIHsKKwkJCQkJCWJiX3BlcnJvcl9tc2coImVycm9yIHNldHRpbmcgbGltaXQiKTsKKwkJCQkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJCQkJCX0KKwkJCQl9IGVsc2UgeworCQkJCQlwcmludGxpbShvcHRzLCAmbGltaXQsIGwpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCX0KKwkJfSAvKiBmb3IgKGV2ZXJ5IHBvc3NpYmxlIG9wdCkgKi8KKworCQlpZiAobCA9PSAmbGltaXRzX3RibFtBUlJBWV9TSVpFKGxpbWl0c190YmwpXSkgeworCQkJLyogYmFkIG9wdGlvbi4gZ2V0b3B0IGFscmVhZHkgY29tcGxhaW5lZC4gKi8KKwkJCWJyZWFrOworCQl9CisJfSAvKiB3aGlsZSAodGhlcmUgYXJlIG9wdGlvbnMpICovCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NoZWxsL3NoZWxsX2NvbW1vbi5oIGIvc2hlbGwvc2hlbGxfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkzZWQ1OQotLS0gL2Rldi9udWxsCisrKyBiL3NoZWxsL3NoZWxsX2NvbW1vbi5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIEFkYXB0ZWQgZnJvbSBhc2ggYXBwbGV0IGNvZGUKKyAqCisgKiBUaGlzIGNvZGUgaXMgZGVyaXZlZCBmcm9tIHNvZnR3YXJlIGNvbnRyaWJ1dGVkIHRvIEJlcmtlbGV5IGJ5CisgKiBLZW5uZXRoIEFsbXF1aXN0LgorICoKKyAqIENvcHlyaWdodCAoYykgMTk4OSwgMTk5MSwgMTk5MywgMTk5NAorICogICAgICBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDE5OTctMjAwNSBIZXJiZXJ0IFh1IDxoZXJiZXJ0QGdvbmRvci5hcGFuYS5vcmcuYXU+CisgKiB3YXMgcmUtcG9ydGVkIGZyb20gTmV0QlNEIGFuZCBkZWJpYW5pemVkLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAxMCBEZW55cyBWbGFzZW5rbworICogU3BsaXQgZnJvbSBhc2guYworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKyNpZm5kZWYgU0hFTExfQ09NTU9OX0gKKyNkZWZpbmUgU0hFTExfQ09NTU9OX0ggMQorCitQVVNIX0FORF9TRVRfRlVOQ1RJT05fVklTSUJJTElUWV9UT19ISURERU4KKworZXh0ZXJuIGNvbnN0IGNoYXIgZGVmaWZzdmFyW10gQUxJR04xOyAvKiAiSUZTPSBcdFxuIiAqLworI2RlZmluZSBkZWZpZnMgKGRlZmlmc3ZhciArIDQpCisKK2ludCBGQVNUX0ZVTkMgaXNfd2VsbF9mb3JtZWRfdmFyX25hbWUoY29uc3QgY2hhciAqcywgY2hhciB0ZXJtaW5hdG9yKTsKKworLyogQnVpbHRpbnMgKi8KKworZW51bSB7CisJQlVJTFRJTl9SRUFEX1NJTEVOVCA9IDEgPDwgMCwKKwlCVUlMVElOX1JFQURfUkFXICAgID0gMSA8PCAxLAorfTsKK2NvbnN0IGNoYXIqIEZBU1RfRlVOQworc2hlbGxfYnVpbHRpbl9yZWFkKHZvaWQgRkFTVF9GVU5DICgqc2V0dmFyKShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWwpLAorCWNoYXIgICAgICAgKiphcmd2LAorCWNvbnN0IGNoYXIgKmlmcywKKwlpbnQgICAgICAgIHJlYWRfZmxhZ3MsCisJY29uc3QgY2hhciAqb3B0X24sCisJY29uc3QgY2hhciAqb3B0X3AsCisJY29uc3QgY2hhciAqb3B0X3QsCisJY29uc3QgY2hhciAqb3B0X3UKKyk7CisKK2ludCBGQVNUX0ZVTkMKK3NoZWxsX2J1aWx0aW5fdWxpbWl0KGNoYXIgKiphcmd2KTsKKworUE9QX1NBVkVEX0ZVTkNUSU9OX1ZJU0lCSUxJVFkKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zeXNrbG9nZC9Db25maWcuc3JjIGIvc3lza2xvZ2QvQ29uZmlnLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2Y5OTMwCi0tLSAvZGV2L251bGwKKysrIGIvc3lza2xvZ2QvQ29uZmlnLnNyYwpAQCAtMCwwICsxLDE2OSBAQAorIworIyBGb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgc3ludGF4IG9mIHRoaXMgY29uZmlndXJhdGlvbiBmaWxlLAorIyBzZWUgc2NyaXB0cy9rYnVpbGQvY29uZmlnLWxhbmd1YWdlLnR4dC4KKyMKKworbWVudSAiU3lzdGVtIExvZ2dpbmcgVXRpbGl0aWVzIgorCitJTlNFUlQKKworY29uZmlnIFNZU0xPR0QKKwlib29sICJzeXNsb2dkIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSBzeXNsb2dkIHV0aWxpdHkgaXMgdXNlZCB0byByZWNvcmQgbG9ncyBvZiBhbGwgdGhlCisJICBzaWduaWZpY2FudCBldmVudHMgdGhhdCBvY2N1ciBvbiBhIHN5c3RlbS4gRXZlcnkKKwkgIG1lc3NhZ2UgdGhhdCBpcyBsb2dnZWQgcmVjb3JkcyB0aGUgZGF0ZSBhbmQgdGltZSBvZiB0aGUKKwkgIGV2ZW50LCBhbmQgd2lsbCBnZW5lcmFsbHkgYWxzbyByZWNvcmQgdGhlIG5hbWUgb2YgdGhlCisJICBhcHBsaWNhdGlvbiB0aGF0IGdlbmVyYXRlZCB0aGUgbWVzc2FnZS4gV2hlbiB1c2VkIGluCisJICBjb25qdW5jdGlvbiB3aXRoIGtsb2dkLCBtZXNzYWdlcyBmcm9tIHRoZSBMaW51eCBrZXJuZWwKKwkgIGNhbiBhbHNvIGJlIHJlY29yZGVkLiBUaGlzIGlzIHRlcnJpYmx5IHVzZWZ1bCwKKwkgIGVzcGVjaWFsbHkgZm9yIGZpbmRpbmcgd2hhdCBoYXBwZW5lZCB3aGVuIHNvbWV0aGluZyBnb2VzCisJICB3cm9uZy4gQW5kIHNvbWV0aGluZyBhbG1vc3QgYWx3YXlzIHdpbGwgZ28gd3JvbmcgaWYKKwkgIHlvdSB3YWl0IGxvbmcgZW5vdWdoLi4uLgorCitjb25maWcgRkVBVFVSRV9ST1RBVEVfTE9HRklMRQorCWJvb2wgIlJvdGF0ZSBtZXNzYWdlIGZpbGVzIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU1lTTE9HRAorCWhlbHAKKwkgIFRoaXMgZW5hYmxlcyBzeXNsb2dkIHRvIHJvdGF0ZSB0aGUgbWVzc2FnZSBmaWxlcworCSAgb24gaGlzIG93bi4gTm8gbmVlZCB0byB1c2UgYW4gZXh0ZXJuYWwgcm90YXRlc2NyaXB0LgorCitjb25maWcgRkVBVFVSRV9SRU1PVEVfTE9HCisJYm9vbCAiUmVtb3RlIExvZyBzdXBwb3J0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU1lTTE9HRAorCWhlbHAKKwkgIFdoZW4geW91IGVuYWJsZSB0aGlzIGZlYXR1cmUsIHRoZSBzeXNsb2dkIHV0aWxpdHkgY2FuCisJICBiZSB1c2VkIHRvIHNlbmQgc3lzdGVtIGxvZyBtZXNzYWdlcyB0byBhbm90aGVyIHN5c3RlbQorCSAgY29ubmVjdGVkIHZpYSBhIG5ldHdvcmsuIFRoaXMgYWxsb3dzIHRoZSByZW1vdGUKKwkgIG1hY2hpbmUgdG8gbG9nIGFsbCB0aGUgc3lzdGVtIG1lc3NhZ2VzLCB3aGljaCBjYW4gYmUKKwkgIHRlcnJpYmx5IHVzZWZ1bCBmb3IgcmVkdWNpbmcgdGhlIG51bWJlciBvZiBzZXJpYWwKKwkgIGNhYmxlcyB5b3UgdXNlLiBJdCBjYW4gYWxzbyBiZSBhIHZlcnkgZ29vZCBzZWN1cml0eQorCSAgbWVhc3VyZSB0byBwcmV2ZW50IHN5c3RlbSBsb2dzIGZyb20gYmVpbmcgdGFtcGVyZWQgd2l0aAorCSAgYnkgYW4gaW50cnVkZXIuCisKK2NvbmZpZyBGRUFUVVJFX1NZU0xPR0RfRFVQCisJYm9vbCAiU3VwcG9ydCAtRCAoZHJvcCBkdXBzKSBvcHRpb24iCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBTWVNMT0dECisJaGVscAorCSAgT3B0aW9uIC1EIGluc3RydWN0cyBzeXNsb2dkIHRvIGRyb3AgY29uc2VjdXRpdmUgbWVzc2FnZXMKKwkgIHdoaWNoIGFyZSB0b3RhbGx5IHRoZSBzYW1lLgorCitjb25maWcgRkVBVFVSRV9TWVNMT0dEX0NGRworCWJvb2wgIlN1cHBvcnQgc3lzbG9nLmNvbmYiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBTWVNMT0dECisJaGVscAorCSAgU3VwcG9ydHMgcmVzdHJpY3RlZCBzeXNsb2dkIGNvbmZpZy4gU2VlIGRvY3Mvc3lzbG9nLmNvbmYudHh0CisKK2NvbmZpZyBGRUFUVVJFX1NZU0xPR0RfUkVBRF9CVUZGRVJfU0laRQorCWludCAiUmVhZCBidWZmZXIgc2l6ZSBpbiBieXRlcyIKKwlkZWZhdWx0IDI1NgorCXJhbmdlIDI1NiAyMDAwMAorCWRlcGVuZHMgb24gU1lTTE9HRAorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHNldHMgdGhlIHNpemUgb2YgdGhlIHN5c2xvZyByZWFkIGJ1ZmZlci4KKwkgIEFjdHVhbCBtZW1vcnkgdXNhZ2UgaW5jcmVhc2VzIGFyb3VuZCBmaXZlIHRpbWVzIHRoZQorCSAgY2hhbmdlIGRvbmUgaGVyZS4KKworY29uZmlnIEZFQVRVUkVfSVBDX1NZU0xPRworCWJvb2wgIkNpcmN1bGFyIEJ1ZmZlciBzdXBwb3J0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU1lTTE9HRAorCWhlbHAKKwkgIFdoZW4geW91IGVuYWJsZSB0aGlzIGZlYXR1cmUsIHRoZSBzeXNsb2dkIHV0aWxpdHkgd2lsbAorCSAgdXNlIGEgY2lyY3VsYXIgYnVmZmVyIHRvIHJlY29yZCBzeXN0ZW0gbG9nIG1lc3NhZ2VzLgorCSAgV2hlbiB0aGUgYnVmZmVyIGlzIGZpbGxlZCBpdCB3aWxsIGNvbnRpbnVlIHRvIG92ZXJ3cml0ZQorCSAgdGhlIG9sZGVzdCBtZXNzYWdlcy4gVGhpcyBjYW4gYmUgdmVyeSB1c2VmdWwgZm9yCisJICBzeXN0ZW1zIHdpdGggbGl0dGxlIG9yIG5vIHBlcm1hbmVudCBzdG9yYWdlLCBzaW5jZQorCSAgb3RoZXJ3aXNlIHN5c3RlbSBsb2dzIGNhbiBldmVudHVhbGx5IGZpbGwgdXAgeW91cgorCSAgZW50aXJlIGZpbGVzeXN0ZW0sIHdoaWNoIG1heSBjYXVzZSB5b3VyIHN5c3RlbSB0bworCSAgYnJlYWsgYmFkbHkuCisKK2NvbmZpZyBGRUFUVVJFX0lQQ19TWVNMT0dfQlVGRkVSX1NJWkUKKwlpbnQgIkNpcmN1bGFyIGJ1ZmZlciBzaXplIGluIEtieXRlcyAobWluaW11bSA0S0IpIgorCWRlZmF1bHQgMTYKKwlyYW5nZSA0IDIxNDc0ODM2NDcKKwlkZXBlbmRzIG9uIEZFQVRVUkVfSVBDX1NZU0xPRworCWhlbHAKKwkgIFRoaXMgb3B0aW9uIHNldHMgdGhlIHNpemUgb2YgdGhlIGNpcmN1bGFyIGJ1ZmZlcgorCSAgdXNlZCB0byByZWNvcmQgc3lzdGVtIGxvZyBtZXNzYWdlcy4KKworY29uZmlnIExPR1JFQUQKKwlib29sICJsb2dyZWFkIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkVBVFVSRV9JUENfU1lTTE9HCisJaGVscAorCSAgSWYgeW91IGVuYWJsZWQgQ2lyY3VsYXIgQnVmZmVyIHN1cHBvcnQsIHlvdSBhbG1vc3QKKwkgIGNlcnRhaW5seSB3YW50IHRvIGVuYWJsZSB0aGlzIGZlYXR1cmUgYXMgd2VsbC4gVGhpcworCSAgdXRpbGl0eSB3aWxsIGFsbG93IHlvdSB0byByZWFkIHRoZSBtZXNzYWdlcyB0aGF0IGFyZQorCSAgc3RvcmVkIGluIHRoZSBzeXNsb2dkIGNpcmN1bGFyIGJ1ZmZlci4KKworY29uZmlnIEZFQVRVUkVfTE9HUkVBRF9SRURVQ0VEX0xPQ0tJTkcKKwlib29sICJEb3VibGUgYnVmZmVyaW5nIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTE9HUkVBRAorCWhlbHAKKwkgICdsb2dyZWFkJyBvdXB1dCB0byBzbG93IHNlcmlhbCB0ZXJtaW5hbHMgY2FuIGhhdmUKKwkgIHNpZGUgZWZmZWN0cyBvbiBzeXNsb2cgYmVjYXVzZSBvZiB0aGUgc2VtYXBob3JlLgorCSAgVGhpcyBvcHRpb24gbWFrZSBsb2dyZWFkIHRvIGRvdWJsZSBidWZmZXIgY29weQorCSAgZnJvbSBjaXJjdWxhciBidWZmZXIsIG1pbmltaXppbmcgc2VtYXBob3JlCisJICBjb250ZW50aW9uIGF0IHNvbWUgbWlub3IgbWVtb3J5IGV4cGVuc2UuCisKK2NvbmZpZyBGRUFUVVJFX0tNU0dfU1lTTE9HCisJYm9vbCAiTGludXgga2VybmVsIHByaW50ayBidWZmZXIgc3VwcG9ydCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFNZU0xPR0QKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBXaGVuIHlvdSBlbmFibGUgdGhpcyBmZWF0dXJlLCB0aGUgc3lzbG9nZCB1dGlsaXR5IHdpbGwKKwkgIHdyaXRlIHN5c3RlbSBsb2cgbWVzc2FnZSB0byB0aGUgTGludXgga2VybmVsJ3MgcHJpbnRrIGJ1ZmZlci4KKwkgIFRoaXMgY2FuIGJlIHVzZWQgYXMgYSBzbWFsbGVyIGFsdGVybmF0aXZlIHRvIHRoZSBzeXNsb2dkIElQQworCSAgc3VwcG9ydCwgYXMga2xvZ2QgYW5kIGxvZ3JlYWQgYXJlbid0IG5lZWRlZC4KKworCSAgTk9USUNFOiBTeXNsb2cgZmFjaWxpdGllcyBpbiBsb2cgZW50cmllcyBuZWVkcyBrZXJuZWwgMy41Ky4KKworY29uZmlnIEtMT0dECisJYm9vbCAia2xvZ2QiCisJZGVmYXVsdCB5CisJaGVscAorCSAga2xvZ2QgaXMgYSB1dGlsaXR5IHdoaWNoIGludGVyY2VwdHMgYW5kIGxvZ3MgYWxsCisJICBtZXNzYWdlcyBmcm9tIHRoZSBMaW51eCBrZXJuZWwgYW5kIHNlbmRzIHRoZSBtZXNzYWdlcworCSAgb3V0IHRvIHRoZSAnc3lzbG9nZCcgdXRpbGl0eSBzbyB0aGV5IGNhbiBiZSBsb2dnZWQuIElmCisJICB5b3Ugd2lzaCB0byByZWNvcmQgdGhlIG1lc3NhZ2VzIHByb2R1Y2VkIGJ5IHRoZSBrZXJuZWwsCisJICB5b3Ugc2hvdWxkIGVuYWJsZSB0aGlzIG9wdGlvbi4KKworY29tbWVudCAia2xvZ2Qgc2hvdWxkIG5vdCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggc3lzbG9nIHRvIGtlcm5lbCBwcmludGsgYnVmZmVyIgorCWRlcGVuZHMgb24gS0xPR0QgJiYgRkVBVFVSRV9LTVNHX1NZU0xPRworCitjb25maWcgRkVBVFVSRV9LTE9HRF9LTE9HQ1RMCisJYm9vbCAiVXNlIHRoZSBrbG9nY3RsKCkgaW50ZXJmYWNlIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gS0xPR0QKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGUga2xvZ2QgYXBwbGV0IHN1cHBvcnRzIHR3byBpbnRlcmZhY2VzIGZvciByZWFkaW5nCisJICBrZXJuZWwgbWVzc2FnZXMuIExpbnV4IHByb3ZpZGVzIHRoZSBrbG9nY3RsKCkgaW50ZXJmYWNlCisJICB3aGljaCBhbGxvd3MgcmVhZGluZyBtZXNzYWdlcyBmcm9tIHRoZSBrZXJuZWwgcmluZyBidWZmZXIKKwkgIGluZGVwZW5kZW50bHkgZnJvbSB0aGUgZmlsZSBzeXN0ZW0uCisKKwkgIElmIHlvdSBhbnN3ZXIgJ04nIGhlcmUsIGtsb2dkIHdpbGwgdXNlIHRoZSBtb3JlIHBvcnRhYmxlCisJICBhcHByb2FjaCBvZiByZWFkaW5nIHRoZW0gZnJvbSAvcHJvYyBvciBhIGRldmljZSBub2RlLgorCSAgSG93ZXZlciwgdGhpcyBtZXRob2QgcmVxdWlyZXMgdGhlIGZpbGUgdG8gYmUgYXZhaWxhYmxlLgorCisJICBJZiBpbiBkb3VidCwgc2F5ICdZJy4KKworY29uZmlnIExPR0dFUgorCWJvb2wgImxvZ2dlciIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgRkVBVFVSRV9TWVNMT0cKKwloZWxwCisJICAgIFRoZSBsb2dnZXIgdXRpbGl0eSBhbGxvd3MgeW91IHRvIHNlbmQgYXJiaXRyYXJ5IHRleHQKKwkgICAgbWVzc2FnZXMgdG8gdGhlIHN5c3RlbSBsb2cgKGkuZS4gdGhlICdzeXNsb2dkJyB1dGlsaXR5KSBzbworCSAgICB0aGV5IGNhbiBiZSBsb2dnZWQuIFRoaXMgaXMgZ2VuZXJhbGx5IHVzZWQgdG8gaGVscCBsb2NhdGUKKwkgICAgcHJvYmxlbXMgdGhhdCBvY2N1ciB3aXRoaW4gcHJvZ3JhbXMgYW5kIHNjcmlwdHMuCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL3N5c2tsb2dkL0tidWlsZC5zcmMgYi9zeXNrbG9nZC9LYnVpbGQuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODZjYzIKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNrbG9nZC9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsMTMgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitsaWIteTo9CisKK0lOU0VSVAorbGliLSQoQ09ORklHX0tMT0dEKQkJKz0ga2xvZ2QubworbGliLSQoQ09ORklHX0xPR0dFUikJCSs9IHN5c2xvZ2RfYW5kX2xvZ2dlci5vCitsaWItJChDT05GSUdfTE9HUkVBRCkJCSs9IGxvZ3JlYWQubworbGliLSQoQ09ORklHX1NZU0xPR0QpCQkrPSBzeXNsb2dkX2FuZF9sb2dnZXIubwpkaWZmIC0tZ2l0IGEvc3lza2xvZ2Qva2xvZ2QuYyBiL3N5c2tsb2dkL2tsb2dkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMyZGVkMQotLS0gL2Rldi9udWxsCisrKyBiL3N5c2tsb2dkL2tsb2dkLmMKQEAgLTAsMCArMSwyNjQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkga2xvZ2QgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEgYnkgR2VubmFkeSBGZWxkbWFuIDxnZmVsZG1hbkBnZW5hMDEuY29tPi4KKyAqIENoYW5nZXM6IE1hZGUgdGhpcyBhIHN0YW5kYWxvbmUgYnVzeWJveCBtb2R1bGUgd2hpY2ggdXNlcyBzdGFuZGFsb25lCisgKiBzeXNsb2coKSBjbGllbnQgaW50ZXJmYWNlLgorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgYnkgS2FybCBNLiBIZWdibG9vbSA8a2FybGhlZ0BkZWJpYW4ub3JnPgorICoKKyAqICJjaXJjdWxhciBidWZmZXIiIENvcHlyaWdodCAoQykgMjAwMCBieSBHZW5uYWR5IEZlbGRtYW4gPGdmZWxkbWFuQGdlbmEwMS5jb20+CisgKgorICogTWFpbnRhaW5lcjogR2VubmFkeSBGZWxkbWFuIDxnZmVsZG1hbkBnZW5hMDEuY29tPiBhcyBvZiBNYXIgMTIsIDIwMDEKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBrbG9nZF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jIE5dIFstbl0iCisvL3VzYWdlOiNkZWZpbmUga2xvZ2RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJLZXJuZWwgbG9nZ2VyXG4iCisvL3VzYWdlOiAgICAgIlxuCS1jIE4JUHJpbnQgdG8gY29uc29sZSBtZXNzYWdlcyBtb3JlIHVyZ2VudCB0aGFuIHByaW8gTiAoMS04KSIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JUnVuIGluIGZvcmVncm91bmQiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5c2xvZy5oPgorCisKKy8qIFRoZSBMaW51eC1zcGVjaWZpYyBrbG9nY3RsKDMpIGludGVyZmFjZSBkb2VzIG5vdCByZWx5IG9uIHRoZSBmaWxlc3lzdGVtIGFuZAorICogYWxsb3dzIHVzIHRvIGNoYW5nZSB0aGUgY29uc29sZSBsb2dsZXZlbC4gQWx0ZXJuYXRpdmVseSwgd2UgcmVhZCB0aGUKKyAqIG1lc3NhZ2VzIGZyb20gX1BBVEhfS0xPRy4gKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX0tMT0dEX0tMT0dDVEwKKworIyBpbmNsdWRlIDxzeXMva2xvZy5oPgorCitzdGF0aWMgdm9pZCBrbG9nZF9vcGVuKHZvaWQpCit7CisJLyogIk9wZW4gdGhlIGxvZy4gQ3VycmVudGx5IGEgTk9QIiAqLworCWtsb2djdGwoMSwgTlVMTCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGtsb2dkX3NldGxvZ2xldmVsKGludCBsdmwpCit7CisJLyogInByaW50aygpIHByaW50cyBhIG1lc3NhZ2Ugb24gdGhlIGNvbnNvbGUgb25seSBpZiBpdCBoYXMgYSBsb2dsZXZlbAorCSAqIGxlc3MgdGhhbiBjb25zb2xlX2xvZ2xldmVsIi4gSGVyZSB3ZSBzZXQgY29uc29sZV9sb2dsZXZlbCA9IGx2bC4gKi8KKwlrbG9nY3RsKDgsIE5VTEwsIGx2bCk7Cit9CisKK3N0YXRpYyBpbnQga2xvZ2RfcmVhZChjaGFyICpidWZwLCBpbnQgbGVuKQoreworCXJldHVybiBrbG9nY3RsKDIsIGJ1ZnAsIGxlbik7Cit9CisjIGRlZmluZSBSRUFEX0VSUk9SICJrbG9nY3RsKDIpIGVycm9yIgorCitzdGF0aWMgdm9pZCBrbG9nZF9jbG9zZSh2b2lkKQoreworCS8qIEZZSTogY21kIDcgaXMgZXF1aXZhbGVudCB0byBzZXR0aW5nIGNvbnNvbGVfbG9nbGV2ZWwgdG8gNworCSAqIHZpYSBrbG9nY3RsKDgsIE5VTEwsIDcpLiAqLworCWtsb2djdGwoNywgTlVMTCwgMCk7IC8qICI3IC0tIEVuYWJsZSBwcmludGsncyB0byBjb25zb2xlIiAqLworCWtsb2djdGwoMCwgTlVMTCwgMCk7IC8qICIwIC0tIENsb3NlIHRoZSBsb2cuIEN1cnJlbnRseSBhIE5PUCIgKi8KK30KKworI2Vsc2UKKworIyBpbmNsdWRlIDxwYXRocy5oPgorIyBpZm5kZWYgX1BBVEhfS0xPRworIyAgaWZkZWYgX19HTlVfXworIyAgIGRlZmluZSBfUEFUSF9LTE9HICIvZGV2L2tsb2ciCisjICBlbHNlCisjICAgZXJyb3IgInlvdXIgc3lzdGVtJ3MgX1BBVEhfS0xPRyBpcyB1bmtub3duIgorIyAgZW5kaWYKKyMgZW5kaWYKKyMgZGVmaW5lIFBBVEhfUFJJTlRLICIvcHJvYy9zeXMva2VybmVsL3ByaW50ayIKKworZW51bSB7IGtsb2dmZCA9IDMgfTsKKworc3RhdGljIHZvaWQga2xvZ2Rfb3Blbih2b2lkKQoreworCWludCBmZCA9IHhvcGVuKF9QQVRIX0tMT0csIE9fUkRPTkxZKTsKKwl4bW92ZV9mZChmZCwga2xvZ2ZkKTsKK30KKworc3RhdGljIHZvaWQga2xvZ2Rfc2V0bG9nbGV2ZWwoaW50IGx2bCkKK3sKKwlGSUxFICpmcCA9IGZvcGVuX29yX3dhcm4oUEFUSF9QUklOVEssICJ3Iik7CisJaWYgKGZwKSB7CisJCS8qIFRoaXMgY2hhbmdlcyBvbmx5IGZpcnN0IHZhbHVlOgorCQkgKiAibWVzc2FnZXMgd2l0aCBhIGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoaXMKKwkJICogW3RoYXQgaXMsIHdpdGggbnVtZXJpY2FsbHkgbG93ZXIgdmFsdWVdCisJCSAqIHdpbGwgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZSIuCisJCSAqIFRoZSBvdGhlciB0aHJlZSB2YWx1ZXMgaW4gdGhpcyBwc2V1ZG8tZmlsZSBhcmVuJ3QgY2hhbmdlZC4KKwkJICovCisJCWZwcmludGYoZnAsICIldVxuIiwgbHZsKTsKKwkJZmNsb3NlKGZwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQga2xvZ2RfcmVhZChjaGFyICpidWZwLCBpbnQgbGVuKQoreworCXJldHVybiByZWFkKGtsb2dmZCwgYnVmcCwgbGVuKTsKK30KKyMgZGVmaW5lIFJFQURfRVJST1IgInJlYWQgZXJyb3IiCisKK3N0YXRpYyB2b2lkIGtsb2dkX2Nsb3NlKHZvaWQpCit7CisJa2xvZ2Rfc2V0bG9nbGV2ZWwoNyk7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShrbG9nZmQpOworfQorCisjZW5kaWYKKworI2RlZmluZSBsb2dfYnVmZmVyIGJiX2NvbW1vbl9idWZzaXoxCitlbnVtIHsKKwlLTE9HRF9MT0dCVUZfU0laRSA9IHNpemVvZihsb2dfYnVmZmVyKSwKKwlPUFRfTEVWRUwgICAgICA9ICgxIDw8IDApLAorCU9QVF9GT1JFR1JPVU5EID0gKDEgPDwgMSksCit9OworCisvKiBUT0RPOiBnbGliYyBvcGVubG9nKExPR19LRVJOKSByZXZlcnRzIHRvIExPR19VU0VSIGluc3RlYWQsCisgKiBiZWNhdXNlIHRoYXQncyBob3cgdGhleSBpbnRlcnByZXQgd29yZCAiZGVmYXVsdCIKKyAqIGluIHRoZSBvcGVubG9nKCkgbWFucGFnZToKKyAqICAgICAgTE9HX1VTRVIgKGRlZmF1bHQpCisgKiAgICAgICAgICAgICAgZ2VuZXJpYyB1c2VyLWxldmVsIG1lc3NhZ2VzCisgKiBhbmQgdGhlIGZhY3QgdGhhdCBMT0dfS0VSTiBpcyBhIGNvbnN0YW50IDAuCisgKiBnbGliYyBpbnRlcnByZXRzIGl0IGFzICIwIGluIG9wZW5sb2coKSBjYWxsIG1lYW5zICd1c2UgZGVmYXVsdCciLgorICogSSB0aGluayBpdCBtZWFucyAiaWYgb3BlbmxvZyB3YXNuJ3QgY2FsbGVkIGJlZm9yZSBzeXNsb2coKSBpcyBjYWxsZWQsCisgKiB1c2UgZGVmYXVsdCIuCisgKiBDb252aW5jaW5nIGdsaWJjIG1haW50YWluZXJzIG90aGVyd2lzZSBpcywgYXMgdXN1YWwsIG5lYXJseSBpbXBvc3NpYmxlLgorICogU2hvdWxkIHdlIG9wZW4tY29kZSBzeXNsb2coKSBoZXJlIHRvIHVzZSBjb3JyZWN0IGZhY2lsaXR5PworICovCisKK2ludCBrbG9nZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQga2xvZ2RfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBpID0gMDsKKwljaGFyICpvcHRfYzsKKwlpbnQgb3B0OworCWludCB1c2VkOworCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImM6biIsICZvcHRfYyk7CisJaWYgKG9wdCAmIE9QVF9MRVZFTCkgeworCQkvKiBWYWxpZCBsZXZlbHMgYXJlIGJldHdlZW4gMSBhbmQgOCAqLworCQlpID0geGF0b3VfcmFuZ2Uob3B0X2MsIDEsIDgpOworCX0KKwlpZiAoIShvcHQgJiBPUFRfRk9SRUdST1VORCkpIHsKKwkJYmJfZGFlbW9uaXplX29yX3JleGVjKERBRU1PTl9DSERJUl9ST09ULCBhcmd2KTsKKwl9CisKKwlsb2dtb2RlID0gTE9HTU9ERV9TWVNMT0c7CisKKwkvKiBrbG9nZF9vcGVuKCkgYmVmb3JlIG9wZW5sb2coKSwgc2luY2UgaXQgbWlnaHQgdXNlIGZpeGVkIGZkIDMsCisJICogYW5kIG9wZW5sb2coKSBhbHNvIG1heSB1c2UgdGhlIHNhbWUgZmQgMyBpZiB3ZSBzd2FwIHRoZW06CisJICovCisJa2xvZ2Rfb3BlbigpOworCW9wZW5sb2coImtlcm5lbCIsIDAsIExPR19LRVJOKTsKKwkvKgorCSAqIGdsaWJjIHByb2JsZW06IGZvciBzb21lIHJlYXNvbiwgZ2xpYmMgY2hhbmdlcyBMT0dfS0VSTiB0byBMT0dfVVNFUgorCSAqIGFib3ZlLiBUaGUgbG9naWMgYmVoaW5kIHRoaXMgaXMgdGhhdCBzdGFuZGFyZAorCSAqIGh0dHA6Ly9wdWJzLm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85Njk5OTE5Nzk5L2Z1bmN0aW9ucy9zeXNsb2cuaHRtbAorCSAqIHNheXMgdGhlIGZvbGxvd2luZyBhYm91dCBvcGVubG9nIGFuZCBzeXNsb2c6CisJICogIkxPR19VU0VSCisJICogIE1lc3NhZ2VzIGdlbmVyYXRlZCBieSBhcmJpdHJhcnkgcHJvY2Vzc2VzLgorCSAqICBUaGlzIGlzIHRoZSBkZWZhdWx0IGZhY2lsaXR5IGlkZW50aWZpZXIgaWYgbm9uZSBpcyBzcGVjaWZpZWQuIgorCSAqCisJICogSSBiZWxpZXZlIGdsaWJjIG1pc2ludGVycHJldGVkIHRoaXMgdGV4dCBhcyAiaWYgb3BlbmxvZydzCisJICogdGhpcmQgcGFyYW1ldGVyIGlzIDAgKD1MT0dfS0VSTiksIHRyZWF0IGl0IGFzIExPR19VU0VSIi4KKwkgKiBXaGVyZWFzIGl0IHdhcyBtZWFudCB0byBzYXkgImlmICpzeXNsb2cqIGlzIGNhbGxlZCB3aXRoIGZhY2lsaXR5CisJICogMCBpbiBpdHMgMXN0IHBhcmFtZXRlciB3aXRob3V0IHByaW9yIGNhbGwgdG8gb3BlbmxvZywgdGhlbiBwZXJmb3JtCisJICogaW1wbGljaXQgb3BlbmxvZyhMT0dfVVNFUikiLgorCSAqCisJICogQXMgYSByZXN1bHQgb2YgdGhpcywgZWgsIGZlYXR1cmUsIHN0YW5kYXJkIGtsb2dkIHdhcyBmb3JjZWQKKwkgKiB0byBvcGVuLWNvZGUgaXRzIG93biBvcGVubG9nIGFuZCBzeXNsb2cgaW1wbGVtZW50YXRpb24gKCEpLgorCSAqCisJICogTm90ZSB0aGF0IHByb2hpYml0aW5nIG9wZW5sb2coTE9HX0tFUk4pIG9uIGxpYmMgbGV2ZWwgZG9lcyBub3QKKwkgKiBhZGQgYW55IHNlY3VyaXR5OiBhbnkgcHJvY2VzcyBjYW4gb3BlbiBhIHNvY2tldCB0byAiL2Rldi9sb2ciCisJICogYW5kIHdyaXRlIGEgc3RyaW5nICI8MD5Wb2lsYSwgYSBMT0dfS0VSTiArIExPR19FTUVSRyBtZXNzYWdlIgorCSAqCisJICogR29vZ2xlIGNvZGUgc2VhcmNoIHRlbGxzIG1lIHRoZXJlIGlzIG5vIHdpZGVzcHJlYWQgdXNlIG9mCisJICogb3BlbmxvZygiZm9vIiwgMCwgMCksIHRodXMgZml4aW5nIGdsaWJjIHdvbid0IGJyZWFrIHVzZXJzcGFjZS4KKwkgKgorCSAqIFRoZSBidWcgYWdhaW5zdCBnbGliYyB3YXMgZmlsZWQ6CisJICogYnVnemlsbGEucmVkaGF0LmNvbS9zaG93X2J1Zy5jZ2k/aWQ9NTQ3MDAwCisJICovCisKKwlpZiAoaSkKKwkJa2xvZ2Rfc2V0bG9nbGV2ZWwoaSk7CisKKwlzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsKKwkvKiBXZSB3YW50IGtsb2dkX3JlYWQgdG8gbm90IGJlIHJlc3RhcnRlZCwgdGh1cyBfbm9yZXN0YXJ0OiAqLworCWJiX3NpZ25hbHNfcmVjdXJzaXZlX25vcmVzdGFydChCQl9GQVRBTF9TSUdTLCByZWNvcmRfc2lnbm8pOworCisJc3lzbG9nKExPR19OT1RJQ0UsICJrbG9nZCBzdGFydGVkOiAlcyIsIGJiX2Jhbm5lcik7CisKKwl3cml0ZV9waWRmaWxlKENPTkZJR19QSURfRklMRV9QQVRIICIva2xvZ2QucGlkIik7CisKKwl1c2VkID0gMDsKKwl3aGlsZSAoIWJiX2dvdF9zaWduYWwpIHsKKwkJaW50IG47CisJCWludCBwcmlvcml0eTsKKwkJY2hhciAqc3RhcnQ7CisKKwkJLyogIjIgLS0gUmVhZCBmcm9tIHRoZSBsb2cuIiAqLworCQlzdGFydCA9IGxvZ19idWZmZXIgKyB1c2VkOworCQluID0ga2xvZ2RfcmVhZChzdGFydCwgS0xPR0RfTE9HQlVGX1NJWkUtMSAtIHVzZWQpOworCQlpZiAobiA8IDApIHsKKwkJCWlmIChlcnJubyA9PSBFSU5UUikKKwkJCQljb250aW51ZTsKKwkJCWJiX3BlcnJvcl9tc2coUkVBRF9FUlJPUik7CisJCQlicmVhazsKKwkJfQorCQlzdGFydFtuXSA9ICdcMCc7CisKKwkJLyogUHJvY2VzcyBlYWNoIG5ld2xpbmUtdGVybWluYXRlZCBsaW5lIGluIHRoZSBidWZmZXIgKi8KKwkJc3RhcnQgPSBsb2dfYnVmZmVyOworCQl3aGlsZSAoMSkgeworCQkJY2hhciAqbmV3bGluZSA9IHN0cmNocm51bChzdGFydCwgJ1xuJyk7CisKKwkJCWlmICgqbmV3bGluZSA9PSAnXDAnKSB7CisJCQkJLyogVGhpcyBsaW5lIGlzIGluY29tcGxldGUgKi8KKworCQkJCS8qIG1vdmUgaXQgdG8gdGhlIGZyb250IG9mIHRoZSBidWZmZXIgKi8KKwkJCQlvdmVybGFwcGluZ19zdHJjcHkobG9nX2J1ZmZlciwgc3RhcnQpOworCQkJCXVzZWQgPSBuZXdsaW5lIC0gc3RhcnQ7CisJCQkJaWYgKHVzZWQgPCBLTE9HRF9MT0dCVUZfU0laRS0xKSB7CisJCQkJCS8qIGJ1ZmZlciBpc24ndCBmdWxsICovCisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQkvKiBidWZmZXIgaXMgZnVsbCwgbG9nIGl0IGFueXdheSAqLworCQkJCXVzZWQgPSAwOworCQkJCW5ld2xpbmUgPSBOVUxMOworCQkJfSBlbHNlIHsKKwkJCQkqbmV3bGluZSsrID0gJ1wwJzsKKwkJCX0KKworCQkJLyogRXh0cmFjdCB0aGUgcHJpb3JpdHkgKi8KKwkJCXByaW9yaXR5ID0gTE9HX0lORk87CisJCQlpZiAoKnN0YXJ0ID09ICc8JykgeworCQkJCXN0YXJ0Kys7CisJCQkJaWYgKCpzdGFydCkKKwkJCQkJcHJpb3JpdHkgPSBzdHJ0b3VsKHN0YXJ0LCAmc3RhcnQsIDEwKTsKKwkJCQlpZiAoKnN0YXJ0ID09ICc+JykKKwkJCQkJc3RhcnQrKzsKKwkJCX0KKwkJCS8qIExvZyAob25seSBub24tZW1wdHkgbGluZXMpICovCisJCQlpZiAoKnN0YXJ0KQorCQkJCXN5c2xvZyhwcmlvcml0eSwgIiVzIiwgc3RhcnQpOworCisJCQlpZiAoIW5ld2xpbmUpCisJCQkJYnJlYWs7CisJCQlzdGFydCA9IG5ld2xpbmU7CisJCX0KKwl9CisKKwlrbG9nZF9jbG9zZSgpOworCXN5c2xvZyhMT0dfTk9USUNFLCAia2xvZ2Q6IGV4aXRpbmciKTsKKwlyZW1vdmVfcGlkZmlsZShDT05GSUdfUElEX0ZJTEVfUEFUSCAiL2tsb2dkLnBpZCIpOworCWlmIChiYl9nb3Rfc2lnbmFsKQorCQlraWxsX215c2VsZl93aXRoX3NpZyhiYl9nb3Rfc2lnbmFsKTsKKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvc3lza2xvZ2QvbG9nZ2VyLmMgYi9zeXNrbG9nZC9sb2dnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTcwMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lza2xvZ2QvbG9nZ2VyLmMKQEAgLTAsMCArMSwxNjYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgbG9nZ2VyIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGxvZ2dlcl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW09QVElPTlNdIFtNRVNTQUdFXSIKKy8vdXNhZ2U6I2RlZmluZSBsb2dnZXJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJXcml0ZSBNRVNTQUdFIChvciBzdGRpbikgdG8gc3lzbG9nXG4iCisvL3VzYWdlOiAgICAgIlxuCS1zCUxvZyB0byBzdGRlcnIgYXMgd2VsbCBhcyB0aGUgc3lzdGVtIGxvZyIKKy8vdXNhZ2U6ICAgICAiXG4JLXQgVEFHCUxvZyB1c2luZyB0aGUgc3BlY2lmaWVkIHRhZyAoZGVmYXVsdHMgdG8gdXNlciBuYW1lKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAgUFJJTwlQcmlvcml0eSAobnVtZXJpYyBvciBmYWNpbGl0eS5sZXZlbCBwYWlyKSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbG9nZ2VyX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGxvZ2dlciBcImhlbGxvXCJcbiIKKworLyoKKyAqIERvbmUgaW4gc3lzbG9nZF9hbmRfbG9nZ2VyLmM6CisjaW5jbHVkZSAibGliYmIuaCIKKyNkZWZpbmUgU1lTTE9HX05BTUVTCisjZGVmaW5lIFNZU0xPR19OQU1FU19DT05TVAorI2luY2x1ZGUgPHN5c2xvZy5oPgorKi8KKworLyogRGVjb2RlIGEgc3ltYm9saWMgbmFtZSB0byBhIG51bWVyaWMgdmFsdWUKKyAqIHRoaXMgZnVuY3Rpb24gaXMgYmFzZWQgb24gY29kZQorICogQ29weXJpZ2h0IChjKSAxOTgzLCAxOTkzCisgKiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBPcmlnaW5hbCBjb3B5cmlnaHQgbm90aWNlIGlzIHJldGFpbmVkIGF0IHRoZSBlbmQgb2YgdGhpcyBmaWxlLgorICovCitzdGF0aWMgaW50IGRlY29kZShjaGFyICpuYW1lLCBjb25zdCBDT0RFICpjb2RldGFiKQoreworCWNvbnN0IENPREUgKmM7CisKKwlpZiAoaXNkaWdpdCgqbmFtZSkpCisJCXJldHVybiBhdG9pKG5hbWUpOworCWZvciAoYyA9IGNvZGV0YWI7IGMtPmNfbmFtZTsgYysrKSB7CisJCWlmICghc3RyY2FzZWNtcChuYW1lLCBjLT5jX25hbWUpKSB7CisJCQlyZXR1cm4gYy0+Y192YWw7CisJCX0KKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qIERlY29kZSBhIHN5bWJvbGljIG5hbWUgdG8gYSBudW1lcmljIHZhbHVlCisgKiB0aGlzIGZ1bmN0aW9uIGlzIGJhc2VkIG9uIGNvZGUKKyAqIENvcHlyaWdodCAoYykgMTk4MywgMTk5MworICogVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogT3JpZ2luYWwgY29weXJpZ2h0IG5vdGljZSBpcyByZXRhaW5lZCBhdCB0aGUgZW5kIG9mIHRoaXMgZmlsZS4KKyAqLworc3RhdGljIGludCBwZW5jb2RlKGNoYXIgKnMpCit7CisJY2hhciAqc2F2ZTsKKwlpbnQgbGV2LCBmYWMgPSBMT0dfVVNFUjsKKworCWZvciAoc2F2ZSA9IHM7ICpzICYmICpzICE9ICcuJzsgKytzKQorCQk7CisJaWYgKCpzKSB7CisJCSpzID0gJ1wwJzsKKwkJZmFjID0gZGVjb2RlKHNhdmUsIGZhY2lsaXR5bmFtZXMpOworCQlpZiAoZmFjIDwgMCkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ1bmtub3duICVzIG5hbWU6ICVzIiwgImZhY2lsaXR5Iiwgc2F2ZSk7CisJCSpzKysgPSAnLic7CisJfSBlbHNlIHsKKwkJcyA9IHNhdmU7CisJfQorCWxldiA9IGRlY29kZShzLCBwcmlvcml0eW5hbWVzKTsKKwlpZiAobGV2IDwgMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInVua25vd24gJXMgbmFtZTogJXMiLCAicHJpb3JpdHkiLCBzYXZlKTsKKwlyZXR1cm4gKChsZXYgJiBMT0dfUFJJTUFTSykgfCAoZmFjICYgTE9HX0ZBQ01BU0spKTsKK30KKworI2RlZmluZSBzdHJidWYgYmJfY29tbW9uX2J1ZnNpejEKKworaW50IGxvZ2dlcl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbG9nZ2VyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpzdHJfcCwgKnN0cl90OworCWludCBvcHQ7CisJaW50IGkgPSAwOworCisJLyogRmlsbCBvdXQgdGhlIG5hbWUgc3RyaW5nIGVhcmx5IChtYXkgYmUgb3ZlcndyaXR0ZW4gbGF0ZXIpICovCisJc3RyX3QgPSB1aWQydW5hbWVfdXRvYShnZXRldWlkKCkpOworCisJLyogUGFyc2UgYW55IG9wdGlvbnMgKi8KKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAicDpzdDoiLCAmc3RyX3AsICZzdHJfdCk7CisKKwlpZiAob3B0ICYgMHgyKSAvKiAtcyAqLworCQlpIHw9IExPR19QRVJST1I7CisJLy9pZiAob3B0ICYgMHg0KSAvKiAtdCAqLworCW9wZW5sb2coc3RyX3QsIGksIDApOworCWkgPSBMT0dfVVNFUiB8IExPR19OT1RJQ0U7CisJaWYgKG9wdCAmIDB4MSkgLyogLXAgKi8KKwkJaSA9IHBlbmNvZGUoc3RyX3ApOworCisJYXJndiArPSBvcHRpbmQ7CisJaWYgKCFhcmd2WzBdKSB7CisJCXdoaWxlIChmZ2V0cyhzdHJidWYsIENPTU1PTl9CVUZTSVpFLCBzdGRpbikpIHsKKwkJCWlmIChzdHJidWZbMF0KKwkJCSAmJiBOT1RfTE9ORV9DSEFSKHN0cmJ1ZiwgJ1xuJykKKwkJCSkgeworCQkJCS8qIE5laXRoZXIgIiIgbm9yICJcbiIgKi8KKwkJCQlzeXNsb2coaSwgIiVzIiwgc3RyYnVmKTsKKwkJCX0KKwkJfQorCX0gZWxzZSB7CisJCWNoYXIgKm1lc3NhZ2UgPSBOVUxMOworCQlpbnQgbGVuID0gMDsKKwkJaW50IHBvcyA9IDA7CisJCWRvIHsKKwkJCWxlbiArPSBzdHJsZW4oKmFyZ3YpICsgMTsKKwkJCW1lc3NhZ2UgPSB4cmVhbGxvYyhtZXNzYWdlLCBsZW4gKyAxKTsKKwkJCXNwcmludGYobWVzc2FnZSArIHBvcywgIiAlcyIsICphcmd2KSwKKwkJCXBvcyA9IGxlbjsKKwkJfSB3aGlsZSAoKisrYXJndik7CisJCXN5c2xvZyhpLCAiJXMiLCBtZXNzYWdlICsgMSk7IC8qIHNraXAgbGVhZGluZyAiICIgKi8KKwl9CisKKwljbG9zZWxvZygpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CisKKy8qIENsZWFuIHVwLiBOZWVkZWQgYmVjYXVzZSB3ZSBhcmUgaW5jbHVkZWQgZnJvbSBzeXNsb2dkX2FuZF9sb2dnZXIuYyAqLworI3VuZGVmIHN0cmJ1ZgorCisvKi0KKyAqIENvcHlyaWdodCAoYykgMTk4MywgMTk5MworICogVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBpcyB0aGUgb3JpZ2luYWwgbGljZW5zZSBzdGF0ZW1lbnQgZm9yIHRoZSBkZWNvZGUgYW5kIHBlbmNvZGUgZnVuY3Rpb25zLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICoKKyAqIDMuIEJTRCBBZHZlcnRpc2luZyBDbGF1c2Ugb21pdHRlZCBwZXIgdGhlIEp1bHkgMjIsIDE5OTkgbGljZW5zaW5nIGNoYW5nZQorICogICAgZnRwOi8vZnRwLmNzLmJlcmtlbGV5LmVkdS9wdWIvNGJzZC9SRUFETUUuSW1wdC5MaWNlbnNlLkNoYW5nZQorICoKKyAqIDQuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIFVuaXZlcnNpdHkgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzCisgKiAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUKKyAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIFJFR0VOVFMgQU5EIENPTlRSSUJVVE9SUyBgYEFTIElTJycgQU5ECisgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBSRUdFTlRTIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUKKyAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCisgKiBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUworICogT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pCisgKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAorICogTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWQorICogT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgorICogU1VDSCBEQU1BR0UuCisgKi8KZGlmZiAtLWdpdCBhL3N5c2tsb2dkL2xvZ3JlYWQuYyBiL3N5c2tsb2dkL2xvZ3JlYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTRhNGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvc3lza2xvZ2QvbG9ncmVhZC5jCkBAIC0wLDAgKzEsMjAyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBjaXJjdWxhciBidWZmZXIgc3lzbG9nIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDAwIGJ5IEdlbm5hZHkgRmVsZG1hbiA8Z2ZlbGRtYW5AZ2VuYTAxLmNvbT4KKyAqCisgKiBNYWludGFpbmVyOiBHZW5uYWR5IEZlbGRtYW4gPGdmZWxkbWFuQGdlbmEwMS5jb20+IGFzIG9mIE1hciAxMiwgMjAwMQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGxvZ3JlYWRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZkZdIgorLy91c2FnZTojZGVmaW5lIGxvZ3JlYWRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTaG93IG1lc3NhZ2VzIGluIHN5c2xvZ2QncyBjaXJjdWxhciBidWZmZXJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJT3V0cHV0IGRhdGEgYXMgbG9nIGdyb3dzIgorLy91c2FnZTogICAgICJcbgktRglTYW1lIGFzIC1mLCBidXQgZHVtcCBidWZmZXIgZmlyc3QiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPHN5cy9pcGMuaD4KKyNpbmNsdWRlIDxzeXMvc2VtLmg+CisjaW5jbHVkZSA8c3lzL3NobS5oPgorCisjZGVmaW5lIERFQlVHIDAKKworLyogb3VyIHNoYXJlZCBrZXkgKHN5c2xvZ2QuYyBhbmQgbG9ncmVhZC5jIG11c3QgYmUgaW4gc3luYykgKi8KK2VudW0geyBLRVlfSUQgPSAweDQxNGU0NTQ3IH07IC8qICJHRU5BIiAqLworCitzdHJ1Y3Qgc2hidWZfZHMgeworCWludDMyX3Qgc2l6ZTsgICAgICAgICAgIC8vIHNpemUgb2YgZGF0YSAtIDEKKwlpbnQzMl90IHRhaWw7ICAgICAgICAgICAvLyBlbmQgb2YgbWVzc2FnZSBsaXN0CisJY2hhciBkYXRhWzFdOyAgICAgICAgICAgLy8gbWVzc2FnZXMKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VtYnVmIGluaXRfc2VtWzNdID0geworCXswLCAtMSwgSVBDX05PV0FJVCB8IFNFTV9VTkRPfSwKKwl7MSwgMH0sIHswLCArMSwgU0VNX1VORE99Cit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJc3RydWN0IHNlbWJ1ZiBTTXJ1cFsxXTsgLy8gezAsIC0xLCBJUENfTk9XQUlUIHwgU0VNX1VORE99LAorCXN0cnVjdCBzZW1idWYgU01yZG5bMl07IC8vIHsxLCAwfSwgezAsICsxLCBTRU1fVU5ET30KKwlzdHJ1Y3Qgc2hidWZfZHMgKnNoYnVmOworfSBGSVhfQUxJQVNJTkc7CisjZGVmaW5lIEcgKCooc3RydWN0IGdsb2JhbHMqKSZiYl9jb21tb25fYnVmc2l6MSkKKyNkZWZpbmUgU01ydXAgKEcuU01ydXApCisjZGVmaW5lIFNNcmRuIChHLlNNcmRuKQorI2RlZmluZSBzaGJ1ZiAoRy5zaGJ1ZikKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJbWVtY3B5KFNNcnVwLCBpbml0X3NlbSwgc2l6ZW9mKGluaXRfc2VtKSk7IFwKK30gd2hpbGUgKDApCisKKyNpZiAwCitzdGF0aWMgdm9pZCBlcnJvcl9leGl0KGNvbnN0IGNoYXIgKnN0cikgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBlcnJvcl9leGl0KGNvbnN0IGNoYXIgKnN0cikKK3sKKwkvKiBSZWxlYXNlIGFsbCBhY3F1aXJlZCByZXNvdXJjZXMgKi8KKwlzaG1kdChzaGJ1Zik7CisJYmJfcGVycm9yX21zZ19hbmRfZGllKHN0cik7Cit9CisjZWxzZQorLyogT24gTGludXgsIHNobWR0IGlzIG5vdCBtYW5kYXRvcnkgb24gZXhpdCAqLworIyBkZWZpbmUgZXJyb3JfZXhpdChzdHIpIGJiX3BlcnJvcl9tc2dfYW5kX2RpZShzdHIpCisjZW5kaWYKKworLyoKKyAqIHNlbV91cCAtIHVwKCkncyBhIHNlbWFwaG9yZS4KKyAqLworc3RhdGljIHZvaWQgc2VtX3VwKGludCBzZW1pZCkKK3sKKwlpZiAoc2Vtb3Aoc2VtaWQsIFNNcnVwLCAxKSA9PSAtMSkKKwkJZXJyb3JfZXhpdCgic2Vtb3BbU01ydXBdIik7Cit9CisKK3N0YXRpYyB2b2lkIGludGVycnVwdGVkKGludCBzaWcpCit7CisJLyogc2htZHQoc2hidWYpOyAtIG9uIExpbnV4LCBzaG1kdCBpcyBub3QgbWFuZGF0b3J5IG9uIGV4aXQgKi8KKwlraWxsX215c2VsZl93aXRoX3NpZyhzaWcpOworfQorCitpbnQgbG9ncmVhZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbG9ncmVhZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgY3VyOworCWludCBsb2dfc2VtaWQ7IC8qIGlwYyBzZW1hcGhvcmUgaWQgKi8KKwlpbnQgbG9nX3NobWlkOyAvKiBpcGMgc2hhcmVkIG1lbW9yeSBpZCAqLworCWludCBmb2xsb3cgPSBnZXRvcHQzMihhcmd2LCAiZkYiKTsKKworCUlOSVRfRygpOworCisJbG9nX3NobWlkID0gc2htZ2V0KEtFWV9JRCwgMCwgMCk7CisJaWYgKGxvZ19zaG1pZCA9PSAtMSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCAlcyBzeXNsb2dkIGJ1ZmZlciIsICJmaW5kIik7CisKKwkvKiBBdHRhY2ggc2hhcmVkIG1lbW9yeSB0byBvdXIgY2hhciogKi8KKwlzaGJ1ZiA9IHNobWF0KGxvZ19zaG1pZCwgTlVMTCwgU0hNX1JET05MWSk7CisJaWYgKHNoYnVmID09IE5VTEwpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgJXMgc3lzbG9nZCBidWZmZXIiLCAiYWNjZXNzIik7CisKKwlsb2dfc2VtaWQgPSBzZW1nZXQoS0VZX0lELCAwLCAwKTsKKwlpZiAobG9nX3NlbWlkID09IC0xKQorCQllcnJvcl9leGl0KCJjYW4ndCBnZXQgYWNjZXNzIHRvIHNlbWFwaG9yZXMgZm9yIHN5c2xvZ2QgYnVmZmVyIik7CisKKwliYl9zaWduYWxzKEJCX0ZBVEFMX1NJR1MsIGludGVycnVwdGVkKTsKKworCS8qIFN1cHBvc2UgYXRvbWljIG1lbW9yeSByZWFkICovCisJLyogTWF4IHBvc3NpYmxlIHZhbHVlIGZvciB0YWlsIGlzIHNoYnVmLT5zaXplIC0gMSAqLworCWN1ciA9IHNoYnVmLT50YWlsOworCisJLyogTG9vcCBmb3IgLWYgb3IgLUYsIG9uZSBwYXNzIG90aGVyd2lzZSAqLworCWRvIHsKKwkJdW5zaWduZWQgc2hidWZfc2l6ZTsKKwkJdW5zaWduZWQgc2hidWZfdGFpbDsKKwkJY29uc3QgY2hhciAqc2hidWZfZGF0YTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9MT0dSRUFEX1JFRFVDRURfTE9DS0lORworCQlpbnQgaTsKKwkJaW50IGxlbl9maXJzdF9wYXJ0OworCQlpbnQgbGVuX3RvdGFsID0gbGVuX3RvdGFsOyAvKiBmb3IgZ2NjICovCisJCWNoYXIgKmNvcHkgPSBjb3B5OyAvKiBmb3IgZ2NjICovCisjZW5kaWYKKwkJaWYgKHNlbW9wKGxvZ19zZW1pZCwgU01yZG4sIDIpID09IC0xKQorCQkJZXJyb3JfZXhpdCgic2Vtb3BbU01yZG5dIik7CisKKwkJLyogQ29weSB0aGUgaW5mbywgaGVscHMgZ2NjIHRvIHJlYWxpemUgdGhhdCBpdCBkb2Vzbid0IGNoYW5nZSAqLworCQlzaGJ1Zl9zaXplID0gc2hidWYtPnNpemU7CisJCXNoYnVmX3RhaWwgPSBzaGJ1Zi0+dGFpbDsKKwkJc2hidWZfZGF0YSA9IHNoYnVmLT5kYXRhOyAvKiBwb2ludGVyISAqLworCisJCWlmIChERUJVRykKKwkJCXByaW50ZigiY3VyOiV1IHRhaWw6JXUgc2l6ZToldVxuIiwKKwkJCQkJY3VyLCBzaGJ1Zl90YWlsLCBzaGJ1Zl9zaXplKTsKKworCQlpZiAoIShmb2xsb3cgJiAxKSkgeyAvKiBub3QgLWYgKi8KKwkJCS8qIGlmIC1GLCAiY29udmVydCIgaXQgdG8gLWYsIHNvIHRoYXQgd2UgZG9udAorCQkJICogZHVtcCB0aGUgZW50aXJlIGJ1ZmZlciBvbiBlYWNoIGl0ZXJhdGlvbgorCQkJICovCisJCQlmb2xsb3cgPj49IDE7CisKKwkJCS8qIGFkdmFuY2UgdG8gb2xkZXN0IGNvbXBsZXRlIG1lc3NhZ2UgKi8KKwkJCS8qIGZpbmQgTlVMICovCisJCQljdXIgKz0gc3RybGVuKHNoYnVmX2RhdGEgKyBjdXIpOworCQkJaWYgKGN1ciA+PSBzaGJ1Zl9zaXplKSB7IC8qIGxhc3QgYnl0ZSBpbiBidWZmZXI/ICovCisJCQkJY3VyID0gc3RybmxlbihzaGJ1Zl9kYXRhLCBzaGJ1Zl90YWlsKTsKKwkJCQlpZiAoY3VyID09IHNoYnVmX3RhaWwpCisJCQkJCWdvdG8gdW5sb2NrOyAvKiBubyBjb21wbGV0ZSBtZXNzYWdlcyAqLworCQkJfQorCQkJLyogYWR2YW5jZSB0byBmaXJzdCBieXRlIG9mIHRoZSBtZXNzYWdlICovCisJCQljdXIrKzsKKwkJCWlmIChjdXIgPj0gc2hidWZfc2l6ZSkgLyogbGFzdCBieXRlIGluIGJ1ZmZlcj8gKi8KKwkJCQljdXIgPSAwOworCQl9IGVsc2UgeyAvKiAtZiAqLworCQkJaWYgKGN1ciA9PSBzaGJ1Zl90YWlsKSB7CisJCQkJc2VtX3VwKGxvZ19zZW1pZCk7CisJCQkJZmZsdXNoX2FsbCgpOworCQkJCXNsZWVwKDEpOyAvKiBUT0RPOiByZXBsYWNlIG1lIHdpdGggYSBzbGVlcF9vbiAqLworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisKKwkJLyogUmVhZCBmcm9tIGN1ciB0byB0YWlsICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfTE9HUkVBRF9SRURVQ0VEX0xPQ0tJTkcKKwkJbGVuX2ZpcnN0X3BhcnQgPSBsZW5fdG90YWwgPSBzaGJ1Zl90YWlsIC0gY3VyOworCQlpZiAobGVuX3RvdGFsIDwgMCkgeworCQkJLyogbWVzc2FnZSB3cmFwczogKi8KKwkJCS8qIFtTRUNPTkQgUEFSVC4uLi4uLi4uLkZJUlNUIFBBUlRdICovCisJCQkvKiAgXmRhdGEgICAgICBedGFpbCAgICBeY3VyICAgICAgXnNpemUgKi8KKwkJCWxlbl90b3RhbCArPSBzaGJ1Zl9zaXplOworCQl9CisJCWNvcHkgPSB4bWFsbG9jKGxlbl90b3RhbCArIDEpOworCQlpZiAobGVuX2ZpcnN0X3BhcnQgPCAwKSB7CisJCQkvKiBtZXNzYWdlIHdyYXBzIChzZWUgYWJvdmUpICovCisJCQlsZW5fZmlyc3RfcGFydCA9IHNoYnVmX3NpemUgLSBjdXI7CisJCQltZW1jcHkoY29weSArIGxlbl9maXJzdF9wYXJ0LCBzaGJ1Zl9kYXRhLCBzaGJ1Zl90YWlsKTsKKwkJfQorCQltZW1jcHkoY29weSwgc2hidWZfZGF0YSArIGN1ciwgbGVuX2ZpcnN0X3BhcnQpOworCQljb3B5W2xlbl90b3RhbF0gPSAnXDAnOworCQljdXIgPSBzaGJ1Zl90YWlsOworI2Vsc2UKKwkJd2hpbGUgKGN1ciAhPSBzaGJ1Zl90YWlsKSB7CisJCQlmcHV0cyhzaGJ1Zl9kYXRhICsgY3VyLCBzdGRvdXQpOworCQkJY3VyICs9IHN0cmxlbihzaGJ1Zl9kYXRhICsgY3VyKSArIDE7CisJCQlpZiAoY3VyID49IHNoYnVmX3NpemUpCisJCQkJY3VyID0gMDsKKwkJfQorI2VuZGlmCisgdW5sb2NrOgorCQkvKiByZWxlYXNlIHRoZSBsb2NrIG9uIHRoZSBsb2cgY2hhaW4gKi8KKwkJc2VtX3VwKGxvZ19zZW1pZCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9MT0dSRUFEX1JFRFVDRURfTE9DS0lORworCQlmb3IgKGkgPSAwOyBpIDwgbGVuX3RvdGFsOyBpICs9IHN0cmxlbihjb3B5ICsgaSkgKyAxKSB7CisJCQlmcHV0cyhjb3B5ICsgaSwgc3Rkb3V0KTsKKwkJfQorCQlmcmVlKGNvcHkpOworI2VuZGlmCisJCWZmbHVzaF9hbGwoKTsKKwl9IHdoaWxlIChmb2xsb3cpOworCisJLyogc2htZHQoc2hidWYpOyAtIG9uIExpbnV4LCBzaG1kdCBpcyBub3QgbWFuZGF0b3J5IG9uIGV4aXQgKi8KKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKK30KZGlmZiAtLWdpdCBhL3N5c2tsb2dkL3N5c2xvZ2QuYyBiL3N5c2tsb2dkL3N5c2xvZ2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTZmNDg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3lza2xvZ2Qvc3lzbG9nZC5jCkBAIC0wLDAgKzEsMTA3OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBzeXNsb2dkIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMCBieSBLYXJsIE0uIEhlZ2Jsb29tIDxrYXJsaGVnQGRlYmlhbi5vcmc+CisgKgorICogImNpcmN1bGFyIGJ1ZmZlciIgQ29weXJpZ2h0IChDKSAyMDAxIGJ5IEdlbm5hZHkgRmVsZG1hbiA8Z2ZlbGRtYW5AZ2VuYTAxLmNvbT4KKyAqCisgKiBNYWludGFpbmVyOiBHZW5uYWR5IEZlbGRtYW4gPGdmZWxkbWFuQGdlbmEwMS5jb20+IGFzIG9mIE1hciAxMiwgMjAwMQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHN5c2xvZ2RfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSIKKy8vdXNhZ2U6I2RlZmluZSBzeXNsb2dkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiU3lzdGVtIGxvZ2dpbmcgdXRpbGl0eVxuIgorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfU1lTTE9HRF9DRkcoCisvL3VzYWdlOiAgICAgICAiKHRoaXMgdmVyc2lvbiBvZiBzeXNsb2dkIGlnbm9yZXMgL2V0Yy9zeXNsb2cuY29uZilcbiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLW4JCVJ1biBpbiBmb3JlZ3JvdW5kIgorLy91c2FnZToJSUZfRkVBVFVSRV9SRU1PVEVfTE9HKAorLy91c2FnZTogICAgICJcbgktUiBIT1NUWzpQT1JUXQlMb2cgdG8gSE9TVDpQT1JUIChkZWZhdWx0IFBPUlQ6NTE0KSIKKy8vdXNhZ2U6ICAgICAiXG4JLUwJCUxvZyBsb2NhbGx5IGFuZCB2aWEgbmV0d29yayAoZGVmYXVsdCBpcyBuZXR3b3JrIG9ubHkgaWYgLVIpIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9JUENfU1lTTE9HKAorLyogTkI6IC1Dc2l6ZSBzaG91bGRuJ3QgaGF2ZSBzcGFjZSAoYmVjYXVzZSBzaXplIGlzIG9wdGlvbmFsKSAqLworLy91c2FnZTogICAgICJcbgktQ1tzaXplX2tiXQlMb2cgdG8gc2hhcmVkIG1lbSBidWZmZXIgKHVzZSBsb2dyZWFkIHRvIHJlYWQgaXQpIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfRkVBVFVSRV9LTVNHX1NZU0xPRygKKy8vdXNhZ2U6ICAgICAiXG4JLUsJCUxvZyB0byBrZXJuZWwgcHJpbnRrIGJ1ZmZlciAodXNlIGRtZXNnIHRvIHJlYWQgaXQpIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktTyBGSUxFCQlMb2cgdG8gRklMRSAoZGVmYXVsdDovdmFyL2xvZy9tZXNzYWdlcywgc3Rkb3V0IGlmIC0pIgorLy91c2FnZToJSUZfRkVBVFVSRV9ST1RBVEVfTE9HRklMRSgKKy8vdXNhZ2U6ICAgICAiXG4JLXMgU0laRQkJTWF4IHNpemUgKEtCKSBiZWZvcmUgcm90YXRpb24gKGRlZmF1bHQ6MjAwS0IsIDA9b2ZmKSIKKy8vdXNhZ2U6ICAgICAiXG4JLWIgTgkJTiByb3RhdGVkIGxvZ3MgdG8ga2VlcCAoZGVmYXVsdDoxLCBtYXg9OTksIDA9cHVyZ2UpIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktbCBOCQlMb2cgb25seSBtZXNzYWdlcyBtb3JlIHVyZ2VudCB0aGFuIHByaW8gTiAoMS04KSIKKy8vdXNhZ2U6ICAgICAiXG4JLVMJCVNtYWxsZXIgb3V0cHV0IgorLy91c2FnZToJSUZfRkVBVFVSRV9TWVNMT0dEX0RVUCgKKy8vdXNhZ2U6ICAgICAiXG4JLUQJCURyb3AgZHVwbGljYXRlcyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU1lTTE9HRF9DRkcoCisvL3VzYWdlOiAgICAgIlxuCS1mIEZJTEUJCVVzZSBGSUxFIGFzIGNvbmZpZyAoZGVmYXVsdDovZXRjL3N5c2xvZy5jb25mKSIKKy8vdXNhZ2U6CSkKKy8qIC8vdXNhZ2U6ICAiXG4JLW0gTUlOCQlNaW51dGVzIGJldHdlZW4gTUFSSyBsaW5lcyAoZGVmYXVsdDoyMCwgMD1vZmYpIiAqLworLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBzeXNsb2dkX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIHN5c2xvZ2QgLVIgbWFzdGVybG9nOjUxNFxuIgorLy91c2FnZTogICAgICAgIiQgc3lzbG9nZCAtUiAxOTIuMTY4LjEuMTo2MDFcbiIKKworLyoKKyAqIERvbmUgaW4gc3lzbG9nZF9hbmRfbG9nZ2VyLmM6CisjaW5jbHVkZSAibGliYmIuaCIKKyNkZWZpbmUgU1lTTE9HX05BTUVTCisjZGVmaW5lIFNZU0xPR19OQU1FU19DT05TVAorI2luY2x1ZGUgPHN5c2xvZy5oPgorKi8KKyNpZm5kZWYgX1BBVEhfTE9HCisjZGVmaW5lIF9QQVRIX0xPRwkiL2Rldi9sb2ciCisjZW5kaWYKKworI2luY2x1ZGUgPHN5cy91bi5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKworI2lmIEVOQUJMRV9GRUFUVVJFX1JFTU9URV9MT0cKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0lQQ19TWVNMT0cKKyNpbmNsdWRlIDxzeXMvaXBjLmg+CisjaW5jbHVkZSA8c3lzL3NlbS5oPgorI2luY2x1ZGUgPHN5cy9zaG0uaD4KKyNlbmRpZgorCisKKyNkZWZpbmUgREVCVUcgMAorCisvKiBNQVJLIGNvZGUgaXMgbm90IHZlcnkgdXNlZnVsLCBpcyBibG9hdCwgYW5kIGJyb2tlbjoKKyAqIGNhbiBkZWFkbG9jayBpZiBhbGFybWVkIHRvIG1ha2UgTUFSSyB3aGlsZSB3cml0aW5nIHRvIElQQyBidWZmZXIKKyAqIChzZW1hcGhvcmVzIGFyZSBkb3duIGJ1dCBkb19tYXJrIHJvdXRpbmUgdHJpZXMgdG8gZG93biB0aGVtIGFnYWluKSAqLworI3VuZGVmIFNZU0xPR0RfTUFSSworCisvKiBXcml0ZSBsb2NraW5nIGRvZXMgbm90IHNlZW0gdG8gYmUgdXNlZnVsIGVpdGhlciAqLworI3VuZGVmIFNZU0xPR0RfV1JMT0NLCisKK2VudW0geworCU1BWF9SRUFEID0gQ09ORklHX0ZFQVRVUkVfU1lTTE9HRF9SRUFEX0JVRkZFUl9TSVpFLAorCUROU19XQUlUX1NFQyA9IDIgKiA2MCwKK307CisKKy8qIFNlbWFwaG9yZSBvcGVyYXRpb24gc3RydWN0dXJlcyAqLworc3RydWN0IHNoYnVmX2RzIHsKKwlpbnQzMl90IHNpemU7ICAgLyogc2l6ZSBvZiBkYXRhIC0gMSAqLworCWludDMyX3QgdGFpbDsgICAvKiBlbmQgb2YgbWVzc2FnZSBsaXN0ICovCisJY2hhciBkYXRhWzFdOyAgIC8qIGRhdGEvbWVzc2FnZXMgKi8KK307CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9SRU1PVEVfTE9HCit0eXBlZGVmIHN0cnVjdCB7CisJaW50IHJlbW90ZUZEOworCXVuc2lnbmVkIGxhc3RfZG5zX3Jlc29sdmU7CisJbGVuX2FuZF9zb2NrYWRkciAqcmVtb3RlQWRkcjsKKwljb25zdCBjaGFyICpyZW1vdGVIb3N0bmFtZTsKK30gcmVtb3RlSG9zdF90OworI2VuZGlmCisKK3R5cGVkZWYgc3RydWN0IGxvZ0ZpbGVfdCB7CisJY29uc3QgY2hhciAqcGF0aDsKKwlpbnQgZmQ7CisJdGltZV90IGxhc3RfbG9nX3RpbWU7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUKKwl1bnNpZ25lZCBzaXplOworCXVpbnQ4X3QgaXNSZWd1bGFyOworI2VuZGlmCit9IGxvZ0ZpbGVfdDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NZU0xPR0RfQ0ZHCit0eXBlZGVmIHN0cnVjdCBsb2dSdWxlX3QgeworCXVpbnQ4X3QgZW5hYmxlZF9mYWNpbGl0eV9wcmlvbWFwW0xPR19ORkFDSUxJVElFU107CisJc3RydWN0IGxvZ0ZpbGVfdCAqZmlsZTsKKwlzdHJ1Y3QgbG9nUnVsZV90ICpuZXh0OworfSBsb2dSdWxlX3Q7CisjZW5kaWYKKworLyogQWxsb3dzIHVzIHRvIGhhdmUgc21hbGxlciBpbml0aWFsaXplci4gVWdseS4gKi8KKyNkZWZpbmUgR0xPQkFMUyBcCisJbG9nRmlsZV90IGxvZ0ZpbGU7ICAgICAgICAgICAgICAgICAgICAgIFwKKwkvKiBpbnRlcnZhbCBiZXR3ZWVuIG1hcmtzIGluIHNlY29uZHMgKi8gXAorCS8qaW50IG1hcmtJbnRlcnZhbDsqLyAgICAgICAgICAgICAgICAgICBcCisJLyogbGV2ZWwgb2YgbWVzc2FnZXMgdG8gYmUgbG9nZ2VkICovICAgIFwKKwlpbnQgbG9nTGV2ZWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorSUZfRkVBVFVSRV9ST1RBVEVfTE9HRklMRSggXAorCS8qIG1heCBzaXplIG9mIGZpbGUgYmVmb3JlIHJvdGF0aW9uICovICBcCisJdW5zaWduZWQgbG9nRmlsZVNpemU7ICAgICAgICAgICAgICAgICAgIFwKKwkvKiBudW1iZXIgb2Ygcm90YXRlZCBtZXNzYWdlIGZpbGVzICovICAgXAorCXVuc2lnbmVkIGxvZ0ZpbGVSb3RhdGU7ICAgICAgICAgICAgICAgICBcCispIFwKK0lGX0ZFQVRVUkVfSVBDX1NZU0xPRyggXAorCWludCBzaG1pZDsgLyogaXBjIHNoYXJlZCBtZW1vcnkgaWQgKi8gICBcCisJaW50IHNfc2VtaWQ7IC8qIGlwYyBzZW1hcGhvcmUgaWQgKi8gICAgIFwKKwlpbnQgc2htX3NpemU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCXN0cnVjdCBzZW1idWYgU013dXBbMV07ICAgICAgICAgICAgICAgICBcCisJc3RydWN0IHNlbWJ1ZiBTTXdkblszXTsgICAgICAgICAgICAgICAgIFwKKykgXAorSUZfRkVBVFVSRV9TWVNMT0dEX0NGRyggXAorCWxvZ1J1bGVfdCAqbG9nX3J1bGVzOyBcCispIFwKK0lGX0ZFQVRVUkVfS01TR19TWVNMT0coIFwKKwlpbnQga21zZ2ZkOyBcCisJaW50IHByaW1hc2s7IFwKKykKKworc3RydWN0IGluaXRfZ2xvYmFscyB7CisJR0xPQkFMUworfTsKKworc3RydWN0IGdsb2JhbHMgeworCUdMT0JBTFMKKworI2lmIEVOQUJMRV9GRUFUVVJFX1JFTU9URV9MT0cKKwlsbGlzdF90ICpyZW1vdGVIb3N0czsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0lQQ19TWVNMT0cKKwlzdHJ1Y3Qgc2hidWZfZHMgKnNoYnVmOworI2VuZGlmCisJLyogbG9jYWxob3N0J3MgbmFtZS4gV2UgcHJpbnQgb25seSBmaXJzdCA2NCBjaGFycyAqLworCWNoYXIgKmhvc3RuYW1lOworCisJLyogV2UgcmVjdiBpbnRvIHJlY3ZidWYuLi4gKi8KKwljaGFyIHJlY3ZidWZbTUFYX1JFQUQgKiAoMSArIEVOQUJMRV9GRUFUVVJFX1NZU0xPR0RfRFVQKV07CisJLyogLi4udGhlbiBjb3B5IHRvIHBhcnNlYnVmLCBlc2NhcGluZyBjb250cm9sIGNoYXJzICovCisJLyogKGNhbiBncm93IHgyIG1heCkgKi8KKwljaGFyIHBhcnNlYnVmW01BWF9SRUFEKjJdOworCS8qIC4uLnRoZW4gc3ByaW50ZiBpbnRvIHByaW50YnVmLCBhZGRpbmcgdGltZXN0YW1wICgxNSBjaGFycyksCisJICogaG9zdCAoNjQpLCBmYWMucHJpbyAoMjApIHRvIHRoZSBtZXNzYWdlICovCisJLyogKGdyb3d0aCBieTogMTUgKyA2NCArIDIwICsgZGVsaW1zID0gfjExMCkgKi8KKwljaGFyIHByaW50YnVmW01BWF9SRUFEKjIgKyAxMjhdOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBpbml0X2dsb2JhbHMgaW5pdF9kYXRhID0geworCS5sb2dGaWxlID0geworCQkucGF0aCA9ICIvdmFyL2xvZy9tZXNzYWdlcyIsCisJCS5mZCA9IC0xLAorCX0sCisjaWZkZWYgU1lTTE9HRF9NQVJLCisJLm1hcmtJbnRlcnZhbCA9IDIwICogNjAsCisjZW5kaWYKKwkubG9nTGV2ZWwgPSA4LAorI2lmIEVOQUJMRV9GRUFUVVJFX1JPVEFURV9MT0dGSUxFCisJLmxvZ0ZpbGVTaXplID0gMjAwICogMTAyNCwKKwkubG9nRmlsZVJvdGF0ZSA9IDEsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9JUENfU1lTTE9HCisJLnNobWlkID0gLTEsCisJLnNfc2VtaWQgPSAtMSwKKwkuc2htX3NpemUgPSAoKENPTkZJR19GRUFUVVJFX0lQQ19TWVNMT0dfQlVGRkVSX1NJWkUpKjEwMjQpLCAvKiBkZWZhdWx0IHNobSBzaXplICovCisJLlNNd3VwID0geyB7MSwgLTEsIElQQ19OT1dBSVR9IH0sCisJLlNNd2RuID0geyB7MCwgMH0sIHsxLCAwfSwgezEsICsxfSB9LAorI2VuZGlmCit9OworCisjZGVmaW5lIEcgKCpwdHJfdG9fZ2xvYmFscykKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKG1lbWNweSh4emFsbG9jKHNpemVvZihHKSksICZpbml0X2RhdGEsIHNpemVvZihpbml0X2RhdGEpKSk7IFwKK30gd2hpbGUgKDApCisKKworLyogT3B0aW9ucyAqLworZW51bSB7CisJT1BUQklUX21hcmsgPSAwLCAvLyAtbQorCU9QVEJJVF9ub2ZvcmssIC8vIC1uCisJT1BUQklUX291dGZpbGUsIC8vIC1PCisJT1BUQklUX2xvZ2xldmVsLCAvLyAtbAorCU9QVEJJVF9zbWFsbCwgLy8gLVMKKwlJRl9GRUFUVVJFX1JPVEFURV9MT0dGSUxFKE9QVEJJVF9maWxlc2l6ZSAgICwpCS8vIC1zCisJSUZfRkVBVFVSRV9ST1RBVEVfTE9HRklMRShPUFRCSVRfcm90YXRlY250ICAsKQkvLyAtYgorCUlGX0ZFQVRVUkVfUkVNT1RFX0xPRyggICAgT1BUQklUX3JlbW90ZWxvZyAgLCkJLy8gLVIKKwlJRl9GRUFUVVJFX1JFTU9URV9MT0coICAgIE9QVEJJVF9sb2NhbGxvZyAgICwpCS8vIC1MCisJSUZfRkVBVFVSRV9JUENfU1lTTE9HKCAgICBPUFRCSVRfY2lyY3VsYXJsb2csKQkvLyAtQworCUlGX0ZFQVRVUkVfU1lTTE9HRF9EVVAoICAgT1BUQklUX2R1cCAgICAgICAgLCkJLy8gLUQKKwlJRl9GRUFUVVJFX1NZU0xPR0RfQ0ZHKCAgIE9QVEJJVF9jZmcgICAgICAgICwpCS8vIC1mCisJSUZfRkVBVFVSRV9LTVNHX1NZU0xPRyggICBPUFRCSVRfa21zZyAgICAgICAsKQkvLyAtSworCisJT1BUX21hcmsgICAgICAgID0gMSA8PCBPUFRCSVRfbWFyayAgICAsCisJT1BUX25vZm9yayAgICAgID0gMSA8PCBPUFRCSVRfbm9mb3JrICAsCisJT1BUX291dGZpbGUgICAgID0gMSA8PCBPUFRCSVRfb3V0ZmlsZSAsCisJT1BUX2xvZ2xldmVsICAgID0gMSA8PCBPUFRCSVRfbG9nbGV2ZWwsCisJT1BUX3NtYWxsICAgICAgID0gMSA8PCBPUFRCSVRfc21hbGwgICAsCisJT1BUX2ZpbGVzaXplICAgID0gSUZfRkVBVFVSRV9ST1RBVEVfTE9HRklMRSgoMSA8PCBPUFRCSVRfZmlsZXNpemUgICApKSArIDAsCisJT1BUX3JvdGF0ZWNudCAgID0gSUZfRkVBVFVSRV9ST1RBVEVfTE9HRklMRSgoMSA8PCBPUFRCSVRfcm90YXRlY250ICApKSArIDAsCisJT1BUX3JlbW90ZWxvZyAgID0gSUZfRkVBVFVSRV9SRU1PVEVfTE9HKCAgICAoMSA8PCBPUFRCSVRfcmVtb3RlbG9nICApKSArIDAsCisJT1BUX2xvY2FsbG9nICAgID0gSUZfRkVBVFVSRV9SRU1PVEVfTE9HKCAgICAoMSA8PCBPUFRCSVRfbG9jYWxsb2cgICApKSArIDAsCisJT1BUX2NpcmN1bGFybG9nID0gSUZfRkVBVFVSRV9JUENfU1lTTE9HKCAgICAoMSA8PCBPUFRCSVRfY2lyY3VsYXJsb2cpKSArIDAsCisJT1BUX2R1cCAgICAgICAgID0gSUZfRkVBVFVSRV9TWVNMT0dEX0RVUCggICAoMSA8PCBPUFRCSVRfZHVwICAgICAgICApKSArIDAsCisJT1BUX2NmZyAgICAgICAgID0gSUZfRkVBVFVSRV9TWVNMT0dEX0NGRyggICAoMSA8PCBPUFRCSVRfY2ZnICAgICAgICApKSArIDAsCisJT1BUX2ttc2cgICAgICAgID0gSUZfRkVBVFVSRV9LTVNHX1NZU0xPRyggICAoMSA8PCBPUFRCSVRfa21zZyAgICAgICApKSArIDAsCit9OworI2RlZmluZSBPUFRJT05fU1RSICJtOm5POmw6UyIgXAorCUlGX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUoInM6IiApIFwKKwlJRl9GRUFUVVJFX1JPVEFURV9MT0dGSUxFKCJiOiIgKSBcCisJSUZfRkVBVFVSRV9SRU1PVEVfTE9HKCAgICAiUjoiICkgXAorCUlGX0ZFQVRVUkVfUkVNT1RFX0xPRyggICAgIkwiICApIFwKKwlJRl9GRUFUVVJFX0lQQ19TWVNMT0coICAgICJDOjoiKSBcCisJSUZfRkVBVFVSRV9TWVNMT0dEX0RVUCggICAiRCIgICkgXAorCUlGX0ZFQVRVUkVfU1lTTE9HRF9DRkcoICAgImY6IiApIFwKKwlJRl9GRUFUVVJFX0tNU0dfU1lTTE9HKCAgICJLIiAgKQorI2RlZmluZSBPUFRJT05fREVDTCAqb3B0X20sICpvcHRfbCBcCisJSUZfRkVBVFVSRV9ST1RBVEVfTE9HRklMRSgsKm9wdF9zKSBcCisJSUZfRkVBVFVSRV9ST1RBVEVfTE9HRklMRSgsKm9wdF9iKSBcCisJSUZfRkVBVFVSRV9JUENfU1lTTE9HKCAgICAsKm9wdF9DID0gTlVMTCkgXAorCUlGX0ZFQVRVUkVfU1lTTE9HRF9DRkcoICAgLCpvcHRfZiA9IE5VTEwpCisjZGVmaW5lIE9QVElPTl9QQVJBTSAmb3B0X20sICYoRy5sb2dGaWxlLnBhdGgpLCAmb3B0X2wgXAorCUlGX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUoLCZvcHRfcykgXAorCUlGX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUoLCZvcHRfYikgXAorCUlGX0ZFQVRVUkVfUkVNT1RFX0xPRyggICAgLCZyZW1vdGVBZGRyTGlzdCkgXAorCUlGX0ZFQVRVUkVfSVBDX1NZU0xPRyggICAgLCZvcHRfQykgXAorCUlGX0ZFQVRVUkVfU1lTTE9HRF9DRkcoICAgLCZvcHRfZikKKworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1lTTE9HRF9DRkcKK3N0YXRpYyBjb25zdCBDT0RFKiBmaW5kX2J5X25hbWUoY2hhciAqbmFtZSwgY29uc3QgQ09ERSogY19zZXQpCit7CisJZm9yICg7IGNfc2V0LT5jX25hbWU7IGNfc2V0KyspIHsKKwkJaWYgKHN0cmNtcChuYW1lLCBjX3NldC0+Y19uYW1lKSA9PSAwKQorCQkJcmV0dXJuIGNfc2V0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorc3RhdGljIGNvbnN0IENPREUqIGZpbmRfYnlfdmFsKGludCB2YWwsIGNvbnN0IENPREUqIGNfc2V0KQoreworCWZvciAoOyBjX3NldC0+Y19uYW1lOyBjX3NldCsrKSB7CisJCWlmIChjX3NldC0+Y192YWwgPT0gdmFsKQorCQkJcmV0dXJuIGNfc2V0OworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1NZU0xPR0RfQ0ZHCitzdGF0aWMgdm9pZCBwYXJzZV9zeXNsb2dkY2ZnKGNvbnN0IGNoYXIgKmZpbGUpCit7CisJY2hhciAqdDsKKwlsb2dSdWxlX3QgKipwcF9ydWxlOworCS8qIHRva1swXSBzZXQgb2Ygc2VsZWN0b3JzICovCisJLyogdG9rWzFdIGZpbGUgbmFtZSAqLworCS8qIHRva1syXSBoYXMgdG8gYmUgTlVMTCAqLworCWNoYXIgKnRva1szXTsKKwlwYXJzZXJfdCAqcGFyc2VyOworCisJcGFyc2VyID0gY29uZmlnX29wZW4yKGZpbGUgPyBmaWxlIDogIi9ldGMvc3lzbG9nLmNvbmYiLAorCQkJCWZpbGUgPyB4Zm9wZW5fZm9yX3JlYWQgOiBmb3Blbl9mb3JfcmVhZCk7CisJaWYgKCFwYXJzZXIpCisJCS8qIGRpZG4ndCBmaW5kIGRlZmF1bHQgL2V0Yy9zeXNsb2cuY29uZiAqLworCQkvKiBwcm9jZWVkIGFzIGlmIHdlIGJ1aWx0IGJ1c3lib3ggd2l0aG91dCBjb25maWcgc3VwcG9ydCAqLworCQlyZXR1cm47CisKKwkvKiB1c2UgcHRyIHRvIHB0ciB0byBhdm9pZCBjaGVja2luZyB3aGV0aGVyIGhlYWQgd2FzIGluaXRpYWxpemVkICovCisJcHBfcnVsZSA9ICZHLmxvZ19ydWxlczsKKwkvKiBpdGVyYXRlIHRocm91Z2ggbGluZXMgb2YgY29uZmlnLCBza2lwcGluZyBjb21tZW50cyAqLworCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRvaywgMywgMiwgIiMgXHQiLCBQQVJTRV9OT1JNQUwgfCBQQVJTRV9NSU5fRElFKSkgeworCQljaGFyICpjdXJfc2VsZWN0b3I7CisJCWxvZ1J1bGVfdCAqY3VyX3J1bGU7CisKKwkJLyogdW5leHBlY3RlZCB0cmFpbGluZyB0b2tlbj8gKi8KKwkJaWYgKHRva1syXSkKKwkJCWdvdG8gY2ZnZXJyOworCisJCWN1cl9ydWxlID0gKnBwX3J1bGUgPSB4emFsbG9jKHNpemVvZigqY3VyX3J1bGUpKTsKKworCQljdXJfc2VsZWN0b3IgPSB0b2tbMF07CisJCS8qIGl0ZXJhdGUgdGhyb3VnaCBzZWxlY3RvcnM6ICJrZXJuLmluZm87a2Vybi4hZXJyOy4uLiIgKi8KKwkJZG8geworCQkJY29uc3QgQ09ERSAqY29kZTsKKwkJCWNoYXIgKm5leHRfc2VsZWN0b3I7CisJCQl1aW50OF90IG5lZ2F0ZWRfcHJpbzsgLyogImtlcm4uIWVyciIgKi8KKwkJCXVpbnQ4X3Qgc2luZ2xlX3ByaW87ICAvKiAia2Vybi49ZXJyIiAqLworCQkJdWludDMyX3QgZmFjbWFwOyAvKiBiaXRtYXAgb2YgZW5hYmxlZCBmYWNpbGl0aWVzICovCisJCQl1aW50OF90IHByaW1hcDsgIC8qIGJpdG1hcCBvZiBlbmFibGVkIHByaW9yaXRpZXMgKi8KKwkJCXVuc2lnbmVkIGk7CisKKwkJCW5leHRfc2VsZWN0b3IgPSBzdHJjaHIoY3VyX3NlbGVjdG9yLCAnOycpOworCQkJaWYgKG5leHRfc2VsZWN0b3IpCisJCQkJKm5leHRfc2VsZWN0b3IrKyA9ICdcMCc7CisKKwkJCXQgPSBzdHJjaHIoY3VyX3NlbGVjdG9yLCAnLicpOworCQkJaWYgKCF0KQorCQkJCWdvdG8gY2ZnZXJyOworCQkJKnQrKyA9ICdcMCc7IC8qIHNlcGFyYXRlIGZhY2lsaXR5IGZyb20gcHJpb3JpdHkgKi8KKworCQkJbmVnYXRlZF9wcmlvID0gMDsKKwkJCXNpbmdsZV9wcmlvID0gMDsKKwkJCWlmICgqdCA9PSAnIScpIHsKKwkJCQluZWdhdGVkX3ByaW8gPSAxOworCQkJCSsrdDsKKwkJCX0KKwkJCWlmICgqdCA9PSAnPScpIHsKKwkJCQlzaW5nbGVfcHJpbyA9IDE7CisJCQkJKyt0OworCQkJfQorCisJCQkvKiBwYXJzZSBwcmlvcml0eSAqLworCQkJaWYgKCp0ID09ICcqJykKKwkJCQlwcmltYXAgPSAweGZmOyAvKiBhbGwgOCBsb2cgbGV2ZWxzIGVuYWJsZWQgKi8KKwkJCWVsc2UgeworCQkJCXVpbnQ4X3QgcHJpb3JpdHk7CisJCQkJY29kZSA9IGZpbmRfYnlfbmFtZSh0LCBwcmlvcml0eW5hbWVzKTsKKwkJCQlpZiAoIWNvZGUpCisJCQkJCWdvdG8gY2ZnZXJyOworCQkJCXByaW1hcCA9IDA7CisJCQkJcHJpb3JpdHkgPSBjb2RlLT5jX3ZhbDsKKwkJCQlpZiAocHJpb3JpdHkgPT0gSU5URVJOQUxfTk9QUkkpIHsKKwkJCQkJLyogZW5zdXJlIHdlIHRha2UgImVuYWJsZWRfZmFjaWxpdHlfcHJpb21hcFtmYWNdICY9IDAiIGJyYW5jaCBiZWxvdyAqLworCQkJCQluZWdhdGVkX3ByaW8gPSAxOworCQkJCX0gZWxzZSB7CisJCQkJCXByaW9yaXR5ID0gMSA8PCBwcmlvcml0eTsKKwkJCQkJZG8geworCQkJCQkJcHJpbWFwIHw9IHByaW9yaXR5OworCQkJCQkJaWYgKHNpbmdsZV9wcmlvKQorCQkJCQkJCWJyZWFrOworCQkJCQkJcHJpb3JpdHkgPj49IDE7CisJCQkJCX0gd2hpbGUgKHByaW9yaXR5KTsKKwkJCQkJaWYgKG5lZ2F0ZWRfcHJpbykKKwkJCQkJCXByaW1hcCA9IH5wcmltYXA7CisJCQkJfQorCQkJfQorCisJCQkvKiBwYXJzZSBmYWNpbGl0eSAqLworCQkJaWYgKCpjdXJfc2VsZWN0b3IgPT0gJyonKQorCQkJCWZhY21hcCA9ICgxPDxMT0dfTkZBQ0lMSVRJRVMpIC0gMTsKKwkJCWVsc2UgeworCQkJCWNoYXIgKm5leHRfZmFjaWxpdHk7CisJCQkJZmFjbWFwID0gMDsKKwkJCQl0ID0gY3VyX3NlbGVjdG9yOworCQkJCS8qIGl0ZXJhdGUgdGhyb3VnaCBmYWNpbGl0aWVzOiAia2VybixkYWVtb24uPHByaW9zcGVjPiIgKi8KKwkJCQlkbyB7CisJCQkJCW5leHRfZmFjaWxpdHkgPSBzdHJjaHIodCwgJywnKTsKKwkJCQkJaWYgKG5leHRfZmFjaWxpdHkpCisJCQkJCQkqbmV4dF9mYWNpbGl0eSsrID0gJ1wwJzsKKwkJCQkJY29kZSA9IGZpbmRfYnlfbmFtZSh0LCBmYWNpbGl0eW5hbWVzKTsKKwkJCQkJaWYgKCFjb2RlKQorCQkJCQkJZ290byBjZmdlcnI7CisJCQkJCS8qICJtYXJrIiBpcyBub3QgYSByZWFsIGZhY2lsaXR5LCBza2lwIGl0ICovCisJCQkJCWlmIChjb2RlLT5jX3ZhbCAhPSBJTlRFUk5BTF9NQVJLKQorCQkJCQkJZmFjbWFwIHw9IDE8PChMT0dfRkFDKGNvZGUtPmNfdmFsKSk7CisJCQkJCXQgPSBuZXh0X2ZhY2lsaXR5OworCQkJCX0gd2hpbGUgKHQpOworCQkJfQorCisJCQkvKiBtZXJnZSByZXN1bHQgd2l0aCBwcmV2aW91cyBzZWxlY3RvcnMgKi8KKwkJCWZvciAoaSA9IDA7IGkgPCBMT0dfTkZBQ0lMSVRJRVM7ICsraSkgeworCQkJCWlmICghKGZhY21hcCAmICgxPDxpKSkpCisJCQkJCWNvbnRpbnVlOworCQkJCWlmIChuZWdhdGVkX3ByaW8pCisJCQkJCWN1cl9ydWxlLT5lbmFibGVkX2ZhY2lsaXR5X3ByaW9tYXBbaV0gJj0gcHJpbWFwOworCQkJCWVsc2UKKwkJCQkJY3VyX3J1bGUtPmVuYWJsZWRfZmFjaWxpdHlfcHJpb21hcFtpXSB8PSBwcmltYXA7CisJCQl9CisKKwkJCWN1cl9zZWxlY3RvciA9IG5leHRfc2VsZWN0b3I7CisJCX0gd2hpbGUgKGN1cl9zZWxlY3Rvcik7CisKKwkJLyogY2hlY2sgd2hldGhlciBjdXJyZW50IGZpbGUgbmFtZSB3YXMgbWVudGlvbmVkIGluIHByZXZpb3VzIHJ1bGVzIG9yCisJCSAqIGFzIGdsb2JhbCBsb2dmaWxlIChHLmxvZ0ZpbGUpLgorCQkgKi8KKwkJaWYgKHN0cmNtcChHLmxvZ0ZpbGUucGF0aCwgdG9rWzFdKSA9PSAwKSB7CisJCQljdXJfcnVsZS0+ZmlsZSA9ICZHLmxvZ0ZpbGU7CisJCQlnb3RvIGZvdW5kOworCQl9CisJCS8qIHRlbXBvcmFyaWx5IHVzZSBjdXJfcnVsZSBhcyBpdGVyYXRvciwgYnV0ICpwcF9ydWxlIHN0aWxsIHBvaW50cworCQkgKiB0byBjdXJyZW50bHkgcHJvY2Vzc2luZyBydWxlIGVudHJ5LgorCQkgKiBOT1RFOiAqcHBfcnVsZSBwb2ludHMgdG8gdGhlIGN1cnJlbnQgKGFuZCBsYXN0IGluIHRoZSBsaXN0KSBydWxlLgorCQkgKi8KKwkJZm9yIChjdXJfcnVsZSA9IEcubG9nX3J1bGVzOyBjdXJfcnVsZSAhPSAqcHBfcnVsZTsgY3VyX3J1bGUgPSBjdXJfcnVsZS0+bmV4dCkgeworCQkJaWYgKHN0cmNtcChjdXJfcnVsZS0+ZmlsZS0+cGF0aCwgdG9rWzFdKSA9PSAwKSB7CisJCQkJLyogZm91bmQgLSByZXVzZSB0aGUgc2FtZSBmaWxlIHN0cnVjdHVyZSAqLworCQkJCSgqcHBfcnVsZSktPmZpbGUgPSBjdXJfcnVsZS0+ZmlsZTsKKwkJCQljdXJfcnVsZSA9ICpwcF9ydWxlOworCQkJCWdvdG8gZm91bmQ7CisJCQl9CisJCX0KKwkJY3VyX3J1bGUtPmZpbGUgPSB4emFsbG9jKHNpemVvZigqY3VyX3J1bGUtPmZpbGUpKTsKKwkJY3VyX3J1bGUtPmZpbGUtPmZkID0gLTE7CisJCWN1cl9ydWxlLT5maWxlLT5wYXRoID0geHN0cmR1cCh0b2tbMV0pOworIGZvdW5kOgorCQlwcF9ydWxlID0gJmN1cl9ydWxlLT5uZXh0OworCX0KKwljb25maWdfY2xvc2UocGFyc2VyKTsKKwlyZXR1cm47CisKKyBjZmdlcnI6CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImVycm9yIGluICclcycgYXQgbGluZSAlZCIsCisJCQlmaWxlID8gZmlsZSA6ICIvZXRjL3N5c2xvZy5jb25mIiwKKwkJCXBhcnNlci0+bGluZW5vKTsKK30KKyNlbmRpZgorCisvKiBjaXJjdWxhciBidWZmZXIgdmFyaWFibGVzL3N0cnVjdHVyZXMgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9JUENfU1lTTE9HCisKKyNpZiBDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HX0JVRkZFUl9TSVpFIDwgNAorI2Vycm9yIFNvcnJ5LCB5b3UgbXVzdCBzZXQgdGhlIHN5c2xvZ2QgYnVmZmVyIHNpemUgdG8gYXQgbGVhc3QgNEtCLgorI2Vycm9yIFBsZWFzZSBjaGVjayBDT05GSUdfRkVBVFVSRV9JUENfU1lTTE9HX0JVRkZFUl9TSVpFCisjZW5kaWYKKworLyogb3VyIHNoYXJlZCBrZXkgKHN5c2xvZ2QuYyBhbmQgbG9ncmVhZC5jIG11c3QgYmUgaW4gc3luYykgKi8KK2VudW0geyBLRVlfSUQgPSAweDQxNGU0NTQ3IH07IC8qICJHRU5BIiAqLworCitzdGF0aWMgdm9pZCBpcGNzeXNsb2dfY2xlYW51cCh2b2lkKQoreworCWlmIChHLnNobWlkICE9IC0xKSB7CisJCXNobWR0KEcuc2hidWYpOworCX0KKwlpZiAoRy5zaG1pZCAhPSAtMSkgeworCQlzaG1jdGwoRy5zaG1pZCwgSVBDX1JNSUQsIE5VTEwpOworCX0KKwlpZiAoRy5zX3NlbWlkICE9IC0xKSB7CisJCXNlbWN0bChHLnNfc2VtaWQsIDAsIElQQ19STUlELCAwKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGlwY3N5c2xvZ19pbml0KHZvaWQpCit7CisJaWYgKERFQlVHKQorCQlwcmludGYoInNobWdldCgleCwgJWQsLi4uKVxuIiwgKGludClLRVlfSUQsIEcuc2htX3NpemUpOworCisJRy5zaG1pZCA9IHNobWdldChLRVlfSUQsIEcuc2htX3NpemUsIElQQ19DUkVBVCB8IDA2NDQpOworCWlmIChHLnNobWlkID09IC0xKSB7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2htZ2V0Iik7CisJfQorCisJRy5zaGJ1ZiA9IHNobWF0KEcuc2htaWQsIE5VTEwsIDApOworCWlmIChHLnNoYnVmID09ICh2b2lkKikgLTFMKSB7IC8qIHNobWF0IGhhcyBiaXphcnJlIGVycm9yIHJldHVybiAqLworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNobWF0Iik7CisJfQorCisJbWVtc2V0KEcuc2hidWYsIDAsIEcuc2htX3NpemUpOworCUcuc2hidWYtPnNpemUgPSBHLnNobV9zaXplIC0gb2Zmc2V0b2Yoc3RydWN0IHNoYnVmX2RzLCBkYXRhKSAtIDE7CisJLypHLnNoYnVmLT50YWlsID0gMDsqLworCisJLyogd2UnbGwgdHJ1c3QgdGhlIE9TIHRvIHNldCBpbml0aWFsIHNlbXZhbCB0byAwIChsZXQncyBob3BlKSAqLworCUcuc19zZW1pZCA9IHNlbWdldChLRVlfSUQsIDIsIElQQ19DUkVBVCB8IElQQ19FWENMIHwgMTAyMyk7CisJaWYgKEcuc19zZW1pZCA9PSAtMSkgeworCQlpZiAoZXJybm8gPT0gRUVYSVNUKSB7CisJCQlHLnNfc2VtaWQgPSBzZW1nZXQoS0VZX0lELCAyLCAwKTsKKwkJCWlmIChHLnNfc2VtaWQgIT0gLTEpCisJCQkJcmV0dXJuOworCQl9CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgic2VtZ2V0Iik7CisJfQorfQorCisvKiBXcml0ZSBtZXNzYWdlIHRvIHNoYXJlZCBtZW0gYnVmZmVyICovCitzdGF0aWMgdm9pZCBsb2dfdG9fc2htZW0oY29uc3QgY2hhciAqbXNnKQoreworCWludCBvbGRfdGFpbCwgbmV3X3RhaWw7CisJaW50IGxlbjsKKworCWlmIChzZW1vcChHLnNfc2VtaWQsIEcuU013ZG4sIDMpID09IC0xKSB7CisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiU013ZG4iKTsKKwl9CisKKwkvKiBDaXJjdWxhciBCdWZmZXIgQWxnb3JpdGhtOgorCSAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisJICogdGFpbCA9PSBwb3NpdGlvbiB3aGVyZSB0byBzdG9yZSBuZXh0IHN5c2xvZyBtZXNzYWdlLgorCSAqIHRhaWwncyBtYXggdmFsdWUgaXMgKHNoYnVmLT5zaXplIC0gMSkKKwkgKiBMYXN0IGJ5dGUgb2YgYnVmZmVyIGlzIG5ldmVyIHVzZWQgYW5kIHJlbWFpbnMgTlVMLgorCSAqLworCWxlbiA9IHN0cmxlbihtc2cpICsgMTsgLyogbGVuZ3RoIHdpdGggTlVMIGluY2x1ZGVkICovCisgYWdhaW46CisJb2xkX3RhaWwgPSBHLnNoYnVmLT50YWlsOworCW5ld190YWlsID0gb2xkX3RhaWwgKyBsZW47CisJaWYgKG5ld190YWlsIDwgRy5zaGJ1Zi0+c2l6ZSkgeworCQkvKiBzdG9yZSBtZXNzYWdlLCBzZXQgbmV3IHRhaWwgKi8KKwkJbWVtY3B5KEcuc2hidWYtPmRhdGEgKyBvbGRfdGFpbCwgbXNnLCBsZW4pOworCQlHLnNoYnVmLT50YWlsID0gbmV3X3RhaWw7CisJfSBlbHNlIHsKKwkJLyogayA9PSBhdmFpbGFibGUgYnVmZmVyIHNwYWNlIGFoZWFkIG9mIG9sZCB0YWlsICovCisJCWludCBrID0gRy5zaGJ1Zi0+c2l6ZSAtIG9sZF90YWlsOworCQkvKiBjb3B5IHdoYXQgZml0cyB0byB0aGUgZW5kIG9mIGJ1ZmZlciwgYW5kIHJlcGVhdCAqLworCQltZW1jcHkoRy5zaGJ1Zi0+ZGF0YSArIG9sZF90YWlsLCBtc2csIGspOworCQltc2cgKz0gazsKKwkJbGVuIC09IGs7CisJCUcuc2hidWYtPnRhaWwgPSAwOworCQlnb3RvIGFnYWluOworCX0KKwlpZiAoc2Vtb3AoRy5zX3NlbWlkLCBHLlNNd3VwLCAxKSA9PSAtMSkgeworCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoIlNNd3VwIik7CisJfQorCWlmIChERUJVRykKKwkJcHJpbnRmKCJ0YWlsOiVkXG4iLCBHLnNoYnVmLT50YWlsKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBpcGNzeXNsb2dfY2xlYW51cCh2b2lkKSB7fQorc3RhdGljIHZvaWQgaXBjc3lzbG9nX2luaXQodm9pZCkge30KK3ZvaWQgbG9nX3RvX3NobWVtKGNvbnN0IGNoYXIgKm1zZyk7CisjZW5kaWYgLyogRkVBVFVSRV9JUENfU1lTTE9HICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9LTVNHX1NZU0xPRworc3RhdGljIHZvaWQga21zZ19pbml0KHZvaWQpCit7CisJRy5rbXNnZmQgPSB4b3BlbigiL2Rldi9rbXNnIiwgT19XUk9OTFkpOworCisJLyoKKwkgKiBrZXJuZWwgPCAzLjUgZXhwZWN0cyBzaW5nbGUgY2hhciBwcmludGsgS0VSTl8qIHByaW9yaXR5IHByZWZpeCwKKwkgKiBmcm9tIDMuNSBvbndhcmRzIHRoZSBmdWxsIHN5c2xvZyBmYWNpbGl0eS9wcmlvcml0eSBmb3JtYXQgaXMgc3VwcG9ydGVkCisJICovCisJaWYgKGdldF9saW51eF92ZXJzaW9uX2NvZGUoKSA8IEtFUk5FTF9WRVJTSU9OKDMsNSwwKSkKKwkJRy5wcmltYXNrID0gTE9HX1BSSU1BU0s7CisJZWxzZQorCQlHLnByaW1hc2sgPSAtMTsKK30KKworc3RhdGljIHZvaWQga21zZ19jbGVhbnVwKHZvaWQpCit7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShHLmttc2dmZCk7Cit9CisKKy8qIFdyaXRlIG1lc3NhZ2UgdG8gL2Rldi9rbXNnICovCitzdGF0aWMgdm9pZCBsb2dfdG9fa21zZyhpbnQgcHJpLCBjb25zdCBjaGFyICptc2cpCit7CisJLyoKKwkgKiBrZXJuZWwgPCAzLjUgZXhwZWN0cyBzaW5nbGUgY2hhciBwcmludGsgS0VSTl8qIHByaW9yaXR5IHByZWZpeCwKKwkgKiBmcm9tIDMuNSBvbndhcmRzIHRoZSBmdWxsIHN5c2xvZyBmYWNpbGl0eS9wcmlvcml0eSBmb3JtYXQgaXMgc3VwcG9ydGVkCisJICovCisJcHJpICY9IEcucHJpbWFzazsKKworCWZ1bGxfd3JpdGUoRy5rbXNnZmQsIEcucHJpbnRidWYsIHNwcmludGYoRy5wcmludGJ1ZiwgIjwlZD4lc1xuIiwgcHJpLCBtc2cpKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCBrbXNnX2luaXQodm9pZCkge30KK3N0YXRpYyB2b2lkIGttc2dfY2xlYW51cCh2b2lkKSB7fQorc3RhdGljIHZvaWQgbG9nX3RvX2ttc2coaW50IHByaSBVTlVTRURfUEFSQU0sIGNvbnN0IGNoYXIgKm1zZyBVTlVTRURfUEFSQU0pIHt9CisjZW5kaWYgLyogRkVBVFVSRV9LTVNHX1NZU0xPRyAqLworCisvKiBQcmludCBhIG1lc3NhZ2UgdG8gdGhlIGxvZyBmaWxlLiAqLworc3RhdGljIHZvaWQgbG9nX2xvY2FsbHkodGltZV90IG5vdywgY2hhciAqbXNnLCBsb2dGaWxlX3QgKmxvZ19maWxlKQoreworI2lmZGVmIFNZU0xPR0RfV1JMT0NLCisJc3RydWN0IGZsb2NrIGZsOworI2VuZGlmCisJaW50IGxlbiA9IHN0cmxlbihtc2cpOworCisJLyogZmQgY2FuJ3QgYmUgMCAod2UgY29ubmVjdCBmZCAwIHRvIC9kZXYvbG9nIHNvY2tldCkgKi8KKwkvKiBmZCBpcyAxIGlmICItTyAtIiBpcyBpbiB1c2UgKi8KKwlpZiAobG9nX2ZpbGUtPmZkID4gMSkgeworCQkvKiBSZW9wZW4gbG9nIGZpbGVzIGV2ZXJ5IHNlY29uZC4gVGhpcyBhbGxvd3MgYWRtaW4KKwkJICogdG8gZGVsZXRlIHRoZSBmaWxlcyBhbmQgbm90IHdvcnJ5IGFib3V0IHJlc3RhcnRpbmcgdXMuCisJCSAqIFRoaXMgY29zdHMgYWxtb3N0IG5vdGhpbmcgc2luY2UgaXQgaGFwcGVucworCQkgKiBfYXQgbW9zdF8gb25jZSBhIHNlY29uZCBmb3IgZWFjaCBmaWxlLCBhbmQgaGFwcGVucworCQkgKiBvbmx5IHdoZW4gZWFjaCBmaWxlIGlzIGFjdHVhbGx5IHdyaXR0ZW4uCisJCSAqLworCQlpZiAoIW5vdykKKwkJCW5vdyA9IHRpbWUoTlVMTCk7CisJCWlmIChsb2dfZmlsZS0+bGFzdF9sb2dfdGltZSAhPSBub3cpIHsKKwkJCWxvZ19maWxlLT5sYXN0X2xvZ190aW1lID0gbm93OworCQkJY2xvc2UobG9nX2ZpbGUtPmZkKTsKKwkJCWdvdG8gcmVvcGVuOworCQl9CisJfQorCWVsc2UgaWYgKGxvZ19maWxlLT5mZCA9PSAxKSB7CisJCS8qIFdlIGFyZSBsb2dnaW5nIHRvIHN0ZG91dDogZG8gbm90aGluZyAqLworCX0KKwllbHNlIHsKKwkJaWYgKExPTkVfREFTSChsb2dfZmlsZS0+cGF0aCkpIHsKKwkJCWxvZ19maWxlLT5mZCA9IDE7CisJCQkvKiBsb2dfZmlsZS0+aXNSZWd1bGFyID0gMDsgLSBhbHJlYWR5IGlzICovCisJCX0gZWxzZSB7CisgcmVvcGVuOgorCQkJbG9nX2ZpbGUtPmZkID0gb3Blbihsb2dfZmlsZS0+cGF0aCwgT19XUk9OTFkgfCBPX0NSRUFUCisJCQkJCXwgT19OT0NUVFkgfCBPX0FQUEVORCB8IE9fTk9OQkxPQ0ssCisJCQkJCTA2NjYpOworCQkJaWYgKGxvZ19maWxlLT5mZCA8IDApIHsKKwkJCQkvKiBjYW5ub3Qgb3BlbiBsb2dmaWxlPyAtIHByaW50IHRvIC9kZXYvY29uc29sZSB0aGVuICovCisJCQkJaW50IGZkID0gZGV2aWNlX29wZW4oREVWX0NPTlNPTEUsIE9fV1JPTkxZIHwgT19OT0NUVFkgfCBPX05PTkJMT0NLKTsKKwkJCQlpZiAoZmQgPCAwKQorCQkJCQlmZCA9IDI7IC8qIHRoZW4gc3RkZXJyLCBkYW1taXQgKi8KKwkJCQlmdWxsX3dyaXRlKGZkLCBtc2csIGxlbik7CisJCQkJaWYgKGZkICE9IDIpCisJCQkJCWNsb3NlKGZkKTsKKwkJCQlyZXR1cm47CisJCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfUk9UQVRFX0xPR0ZJTEUKKwkJCXsKKwkJCQlzdHJ1Y3Qgc3RhdCBzdGF0ZjsKKwkJCQlsb2dfZmlsZS0+aXNSZWd1bGFyID0gKGZzdGF0KGxvZ19maWxlLT5mZCwgJnN0YXRmKSA9PSAwICYmIFNfSVNSRUcoc3RhdGYuc3RfbW9kZSkpOworCQkJCS8qIGJ1ZyAobW9zdGx5IGhhcm1sZXNzKTogY2FuIHdyYXAgYXJvdW5kIGlmIGZpbGUgPiA0Z2IgKi8KKwkJCQlsb2dfZmlsZS0+c2l6ZSA9IHN0YXRmLnN0X3NpemU7CisJCQl9CisjZW5kaWYKKwkJfQorCX0KKworI2lmZGVmIFNZU0xPR0RfV1JMT0NLCisJZmwubF93aGVuY2UgPSBTRUVLX1NFVDsKKwlmbC5sX3N0YXJ0ID0gMDsKKwlmbC5sX2xlbiA9IDE7CisJZmwubF90eXBlID0gRl9XUkxDSzsKKwlmY250bChsb2dfZmlsZS0+ZmQsIEZfU0VUTEtXLCAmZmwpOworI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9ST1RBVEVfTE9HRklMRQorCWlmIChHLmxvZ0ZpbGVTaXplICYmIGxvZ19maWxlLT5pc1JlZ3VsYXIgJiYgbG9nX2ZpbGUtPnNpemUgPiBHLmxvZ0ZpbGVTaXplKSB7CisJCWlmIChHLmxvZ0ZpbGVSb3RhdGUpIHsgLyogYWx3YXlzIDAuLjk5ICovCisJCQlpbnQgaSA9IHN0cmxlbihsb2dfZmlsZS0+cGF0aCkgKyAzICsgMTsKKwkJCWNoYXIgb2xkRmlsZVtpXTsKKwkJCWNoYXIgbmV3RmlsZVtpXTsKKwkJCWkgPSBHLmxvZ0ZpbGVSb3RhdGUgLSAxOworCQkJLyogcmVuYW1lOiBmLjggLT4gZi45OyBmLjcgLT4gZi44OyAuLi4gKi8KKwkJCXdoaWxlICgxKSB7CisJCQkJc3ByaW50ZihuZXdGaWxlLCAiJXMuJWQiLCBsb2dfZmlsZS0+cGF0aCwgaSk7CisJCQkJaWYgKGkgPT0gMCkgYnJlYWs7CisJCQkJc3ByaW50ZihvbGRGaWxlLCAiJXMuJWQiLCBsb2dfZmlsZS0+cGF0aCwgLS1pKTsKKwkJCQkvKiBpZ25vcmUgZXJyb3JzIC0gZmlsZSBtaWdodCBiZSBtaXNzaW5nICovCisJCQkJcmVuYW1lKG9sZEZpbGUsIG5ld0ZpbGUpOworCQkJfQorCQkJLyogbmV3RmlsZSA9PSAiZi4wIiBub3cgKi8KKwkJCXJlbmFtZShsb2dfZmlsZS0+cGF0aCwgbmV3RmlsZSk7CisJCX0KKworCQkvKiBXZSBtYXkgb3IgbWF5IG5vdCBoYXZlIGp1c3QgcmVuYW1lZCB0aGUgZmlsZSBhd2F5OworCQkgKiBpZiB3ZSBkaWRuJ3QgcmVuYW1lIGJlY2F1c2Ugd2UgYXJlbid0IGtlZXBpbmcgYW55IGJhY2tsb2csCisJCSAqIHRoZW4gaXQncyB0aW1lIHRvIGNsb2JiZXIgdGhlIGZpbGUuIElmIHdlIGRpZCByZW5hbWUgaXQuLi4sCisJCSAqIGluY3JlZGlibHksIGlmIEYgYW5kIEYuMCBhcmUgaGFyZGxpbmtzLCBQT1NJWCBfZGVtYW5kc18KKwkJICogdGhhdCByZW5hbWUgcmV0dXJucyAwIGJ1dCBkb2VzIG5vdCByZW1vdmUgRiEhIQorCQkgKiAoaGFyZGxpbmtlZCBGL0YuMCBwYWlyIHdhcyBvYnNlcnZlZCBhZnRlcgorCQkgKiBwb3dlciBmYWlsdXJlIGR1cmluZyByZW5hbWUoKSkuCisJCSAqIFNvIGVuc3VyZSBvbGQgZmlsZSBpcyBnb25lIGluIGFueSBjYXNlOgorCQkgKi8KKwkJdW5saW5rKGxvZ19maWxlLT5wYXRoKTsKKyNpZmRlZiBTWVNMT0dEX1dSTE9DSworCQlmbC5sX3R5cGUgPSBGX1VOTENLOworCQlmY250bChsb2dfZmlsZS0+ZmQsIEZfU0VUTEtXLCAmZmwpOworI2VuZGlmCisJCWNsb3NlKGxvZ19maWxlLT5mZCk7CisJCWdvdG8gcmVvcGVuOworCX0KKy8qIFRPRE86IHdoYXQgdG8gZG8gb24gd3JpdGUgZXJyb3JzICgiZGlzayBmdWxsIik/ICovCisJbGVuID0gZnVsbF93cml0ZShsb2dfZmlsZS0+ZmQsIG1zZywgbGVuKTsKKwlpZiAobGVuID4gMCkKKwkJbG9nX2ZpbGUtPnNpemUgKz0gbGVuOworI2Vsc2UKKwlmdWxsX3dyaXRlKGxvZ19maWxlLT5mZCwgbXNnLCBsZW4pOworI2VuZGlmCisKKyNpZmRlZiBTWVNMT0dEX1dSTE9DSworCWZsLmxfdHlwZSA9IEZfVU5MQ0s7CisJZmNudGwobG9nX2ZpbGUtPmZkLCBGX1NFVExLVywgJmZsKTsKKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZCBwYXJzZV9mYWNfcHJpb18yMChpbnQgcHJpLCBjaGFyICpyZXMyMCkKK3sKKwljb25zdCBDT0RFICpjX3ByaSwgKmNfZmFjOworCisJY19mYWMgPSBmaW5kX2J5X3ZhbChMT0dfRkFDKHByaSkgPDwgMywgZmFjaWxpdHluYW1lcyk7CisJaWYgKGNfZmFjKSB7CisJCWNfcHJpID0gZmluZF9ieV92YWwoTE9HX1BSSShwcmkpLCBwcmlvcml0eW5hbWVzKTsKKwkJaWYgKGNfcHJpKSB7CisJCQlzbnByaW50ZihyZXMyMCwgMjAsICIlcy4lcyIsIGNfZmFjLT5jX25hbWUsIGNfcHJpLT5jX25hbWUpOworCQkJcmV0dXJuOworCQl9CisJfQorCXNucHJpbnRmKHJlczIwLCAyMCwgIjwlZD4iLCBwcmkpOworfQorCisvKiBsZW4gcGFyYW1ldGVyIGlzIHVzZWQgb25seSBmb3IgImlzIHRoZXJlIGEgdGltZXN0YW1wPyIgY2hlY2suCisgKiBOQjogc29tZSBjYWxsZXJzIGNoZWF0IGFuZCBzdXBwbHkgbGVuPT0wIHdoZW4gdGhleSBrbm93CisgKiB0aGF0IHRoZXJlIGlzIG5vIHRpbWVzdGFtcCwgc2hvcnQtY2lyY3VpdGluZyB0aGUgdGVzdC4gKi8KK3N0YXRpYyB2b2lkIHRpbWVzdGFtcF9hbmRfbG9nKGludCBwcmksIGNoYXIgKm1zZywgaW50IGxlbikKK3sKKwljaGFyICp0aW1lc3RhbXA7CisJdGltZV90IG5vdzsKKworCS8qIEphbiAxOCAwMDoxMToyMiBtc2cuLi4gKi8KKwkvKiAwMTIzNDU2Nzg5MDEyMzQ1NiAqLworCWlmIChsZW4gPCAxNiB8fCBtc2dbM10gIT0gJyAnIHx8IG1zZ1s2XSAhPSAnICcKKwkgfHwgbXNnWzldICE9ICc6JyB8fCBtc2dbMTJdICE9ICc6JyB8fCBtc2dbMTVdICE9ICcgJworCSkgeworCQl0aW1lKCZub3cpOworCQl0aW1lc3RhbXAgPSBjdGltZSgmbm93KSArIDQ7IC8qIHNraXAgZGF5IG9mIHdlZWsgKi8KKwl9IGVsc2UgeworCQlub3cgPSAwOworCQl0aW1lc3RhbXAgPSBtc2c7CisJCW1zZyArPSAxNjsKKwl9CisJdGltZXN0YW1wWzE1XSA9ICdcMCc7CisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9rbXNnKSB7CisJCWxvZ190b19rbXNnKHByaSwgbXNnKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX3NtYWxsKQorCQlzcHJpbnRmKEcucHJpbnRidWYsICIlcyAlc1xuIiwgdGltZXN0YW1wLCBtc2cpOworCWVsc2UgeworCQljaGFyIHJlc1syMF07CisJCXBhcnNlX2ZhY19wcmlvXzIwKHByaSwgcmVzKTsKKwkJc3ByaW50ZihHLnByaW50YnVmLCAiJXMgJS42NHMgJXMgJXNcbiIsIHRpbWVzdGFtcCwgRy5ob3N0bmFtZSwgcmVzLCBtc2cpOworCX0KKworCS8qIExvZyBtZXNzYWdlIGxvY2FsbHkgKHRvIGZpbGUgb3Igc2hhcmVkIG1lbSkgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9TWVNMT0dEX0NGRworCXsKKwkJYm9vbCBtYXRjaCA9IDA7CisJCWxvZ1J1bGVfdCAqcnVsZTsKKwkJdWludDhfdCBmYWNpbGl0eSA9IExPR19GQUMocHJpKTsKKwkJdWludDhfdCBwcmlvX2JpdCA9IDEgPDwgTE9HX1BSSShwcmkpOworCisJCWZvciAocnVsZSA9IEcubG9nX3J1bGVzOyBydWxlOyBydWxlID0gcnVsZS0+bmV4dCkgeworCQkJaWYgKHJ1bGUtPmVuYWJsZWRfZmFjaWxpdHlfcHJpb21hcFtmYWNpbGl0eV0gJiBwcmlvX2JpdCkgeworCQkJCWxvZ19sb2NhbGx5KG5vdywgRy5wcmludGJ1ZiwgcnVsZS0+ZmlsZSk7CisJCQkJbWF0Y2ggPSAxOworCQkJfQorCQl9CisJCWlmIChtYXRjaCkKKwkJCXJldHVybjsKKwl9CisjZW5kaWYKKwlpZiAoTE9HX1BSSShwcmkpIDwgRy5sb2dMZXZlbCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0lQQ19TWVNMT0cKKwkJaWYgKChvcHRpb25fbWFzazMyICYgT1BUX2NpcmN1bGFybG9nKSAmJiBHLnNoYnVmKSB7CisJCQlsb2dfdG9fc2htZW0oRy5wcmludGJ1Zik7CisJCQlyZXR1cm47CisJCX0KKyNlbmRpZgorCQlsb2dfbG9jYWxseShub3csIEcucHJpbnRidWYsICZHLmxvZ0ZpbGUpOworCX0KK30KKworc3RhdGljIHZvaWQgdGltZXN0YW1wX2FuZF9sb2dfaW50ZXJuYWwoY29uc3QgY2hhciAqbXNnKQoreworCS8qIC1MLCBvciBubyAtUiAqLworCWlmIChFTkFCTEVfRkVBVFVSRV9SRU1PVEVfTE9HICYmICEob3B0aW9uX21hc2szMiAmIE9QVF9sb2NhbGxvZykpCisJCXJldHVybjsKKwl0aW1lc3RhbXBfYW5kX2xvZyhMT0dfU1lTTE9HIHwgTE9HX0lORk8sIChjaGFyKiltc2csIDApOworfQorCisvKiB0bXBidWZbbGVuXSBpcyBhIE5VTCBieXRlIChzZXQgYnkgY2FsbGVyKSwgYnV0IHRoZXJlIGNhbiBiZSBvdGhlciwKKyAqIGVtYmVkZGVkIE5VTHMuIFNwbGl0IG1lc3NhZ2VzIG9uIGVhY2ggb2YgdGhlc2UgTlVMcywgcGFyc2UgcHJpbywKKyAqIGVzY2FwZSBjb250cm9sIGNoYXJzIGFuZCBsb2cgZWFjaCBsb2NhbGx5LiAqLworc3RhdGljIHZvaWQgc3BsaXRfZXNjYXBlX2FuZF9sb2coY2hhciAqdG1wYnVmLCBpbnQgbGVuKQoreworCWNoYXIgKnAgPSB0bXBidWY7CisKKwl0bXBidWYgKz0gbGVuOworCXdoaWxlIChwIDwgdG1wYnVmKSB7CisJCWNoYXIgYzsKKwkJY2hhciAqcSA9IEcucGFyc2VidWY7CisJCWludCBwcmkgPSAoTE9HX1VTRVIgfCBMT0dfTk9USUNFKTsKKworCQlpZiAoKnAgPT0gJzwnKSB7CisJCQkvKiBQYXJzZSB0aGUgbWFnaWMgcHJpb3JpdHkgbnVtYmVyICovCisJCQlwcmkgPSBiYl9zdHJ0b3UocCArIDEsICZwLCAxMCk7CisJCQlpZiAoKnAgPT0gJz4nKQorCQkJCXArKzsKKwkJCWlmIChwcmkgJiB+KExPR19GQUNNQVNLIHwgTE9HX1BSSU1BU0spKQorCQkJCXByaSA9IChMT0dfVVNFUiB8IExPR19OT1RJQ0UpOworCQl9CisKKwkJd2hpbGUgKChjID0gKnArKykpIHsKKwkJCWlmIChjID09ICdcbicpCisJCQkJYyA9ICcgJzsKKwkJCWlmICghKGMgJiB+MHgxZikgJiYgYyAhPSAnXHQnKSB7CisJCQkJKnErKyA9ICdeJzsKKwkJCQljICs9ICdAJzsgLyogXkAsIF5BLCBeQi4uLiAqLworCQkJfQorCQkJKnErKyA9IGM7CisJCX0KKwkJKnEgPSAnXDAnOworCisJCS8qIE5vdyBsb2cgaXQgKi8KKwkJdGltZXN0YW1wX2FuZF9sb2cocHJpLCBHLnBhcnNlYnVmLCBxIC0gRy5wYXJzZWJ1Zik7CisJfQorfQorCisjaWZkZWYgU1lTTE9HRF9NQVJLCitzdGF0aWMgdm9pZCBkb19tYXJrKGludCBzaWcpCit7CisJaWYgKEcubWFya0ludGVydmFsKSB7CisJCXRpbWVzdGFtcF9hbmRfbG9nX2ludGVybmFsKCItLSBNQVJLIC0tIik7CisJCWFsYXJtKEcubWFya0ludGVydmFsKTsKKwl9Cit9CisjZW5kaWYKKworLyogRG9uJ3QgaW5saW5lOiBwcmV2ZW50IHN0cnVjdCBzb2NrYWRkcl91biB0byB0YWtlIHVwIHNwYWNlIG9uIHN0YWNrCisgKiBwZXJtYW5lbnRseSAqLworc3RhdGljIE5PSU5MSU5FIGludCBjcmVhdGVfc29ja2V0KHZvaWQpCit7CisJc3RydWN0IHNvY2thZGRyX3VuIHN1bng7CisJaW50IHNvY2tfZmQ7CisJY2hhciAqZGV2X2xvZ19uYW1lOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1lTVEVNRAorCWlmIChzZF9saXN0ZW5fZmRzKCkgPT0gMSkKKwkJcmV0dXJuIFNEX0xJU1RFTl9GRFNfU1RBUlQ7CisjZW5kaWYKKworCW1lbXNldCgmc3VueCwgMCwgc2l6ZW9mKHN1bngpKTsKKwlzdW54LnN1bl9mYW1pbHkgPSBBRl9VTklYOworCisJLyogVW5saW5rIG9sZCAvZGV2L2xvZyBvciBvYmplY3QgaXQgcG9pbnRzIHRvLiAqLworCS8qIChpZiBpdCBleGlzdHMsIGJpbmQgd2lsbCBmYWlsKSAqLworCXN0cmNweShzdW54LnN1bl9wYXRoLCBfUEFUSF9MT0cpOworCWRldl9sb2dfbmFtZSA9IHhtYWxsb2NfZm9sbG93X3N5bWxpbmtzKF9QQVRIX0xPRyk7CisJaWYgKGRldl9sb2dfbmFtZSkgeworCQlzYWZlX3N0cm5jcHkoc3VueC5zdW5fcGF0aCwgZGV2X2xvZ19uYW1lLCBzaXplb2Yoc3VueC5zdW5fcGF0aCkpOworCQlmcmVlKGRldl9sb2dfbmFtZSk7CisJfQorCXVubGluayhzdW54LnN1bl9wYXRoKTsKKworCXNvY2tfZmQgPSB4c29ja2V0KEFGX1VOSVgsIFNPQ0tfREdSQU0sIDApOworCXhiaW5kKHNvY2tfZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnN1bngsIHNpemVvZihzdW54KSk7CisJY2htb2QoX1BBVEhfTE9HLCAwNjY2KTsKKworCXJldHVybiBzb2NrX2ZkOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfUkVNT1RFX0xPRworc3RhdGljIGludCB0cnlfdG9fcmVzb2x2ZV9yZW1vdGUocmVtb3RlSG9zdF90ICpyaCkKK3sKKwlpZiAoIXJoLT5yZW1vdGVBZGRyKSB7CisJCXVuc2lnbmVkIG5vdyA9IG1vbm90b25pY19zZWMoKTsKKworCQkvKiBEb24ndCByZXNvbHZlIG5hbWUgdG9vIG9mdGVuIC0gRE5TIHRpbWVvdXRzIGNhbiBiZSBiaWcgKi8KKwkJaWYgKChub3cgLSByaC0+bGFzdF9kbnNfcmVzb2x2ZSkgPCBETlNfV0FJVF9TRUMpCisJCQlyZXR1cm4gLTE7CisJCXJoLT5sYXN0X2Ruc19yZXNvbHZlID0gbm93OworCQlyaC0+cmVtb3RlQWRkciA9IGhvc3Qyc29ja2FkZHIocmgtPnJlbW90ZUhvc3RuYW1lLCA1MTQpOworCQlpZiAoIXJoLT5yZW1vdGVBZGRyKQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4geHNvY2tldChyaC0+cmVtb3RlQWRkci0+dS5zYS5zYV9mYW1pbHksIFNPQ0tfREdSQU0sIDApOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGRvX3N5c2xvZ2Qodm9pZCkgTk9SRVRVUk47CitzdGF0aWMgdm9pZCBkb19zeXNsb2dkKHZvaWQpCit7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUkVNT1RFX0xPRworCWxsaXN0X3QgKml0ZW07CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9TWVNMT0dEX0RVUAorCWludCBsYXN0X3N6ID0gLTE7CisJY2hhciAqbGFzdF9idWY7CisJY2hhciAqcmVjdmJ1ZiA9IEcucmVjdmJ1ZjsKKyNlbHNlCisjZGVmaW5lIHJlY3ZidWYgKEcucmVjdmJ1ZikKKyNlbmRpZgorCisJLyogU2V0IHVwIHNpZ25hbCBoYW5kbGVycyAoc28gdGhhdCB0aGV5IGludGVycnVwdCByZWFkKCkpICovCisJc2lnbmFsX25vX1NBX1JFU1RBUlRfZW1wdHlfbWFzayhTSUdURVJNLCByZWNvcmRfc2lnbm8pOworCXNpZ25hbF9ub19TQV9SRVNUQVJUX2VtcHR5X21hc2soU0lHSU5ULCByZWNvcmRfc2lnbm8pOworCS8vc2lnbmFsX25vX1NBX1JFU1RBUlRfZW1wdHlfbWFzayhTSUdRVUlULCByZWNvcmRfc2lnbm8pOworCXNpZ25hbChTSUdIVVAsIFNJR19JR04pOworI2lmZGVmIFNZU0xPR0RfTUFSSworCXNpZ25hbChTSUdBTFJNLCBkb19tYXJrKTsKKwlhbGFybShHLm1hcmtJbnRlcnZhbCk7CisjZW5kaWYKKwl4bW92ZV9mZChjcmVhdGVfc29ja2V0KCksIFNURElOX0ZJTEVOTyk7CisKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9jaXJjdWxhcmxvZykKKwkJaXBjc3lzbG9nX2luaXQoKTsKKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX2ttc2cpCisJCWttc2dfaW5pdCgpOworCisJdGltZXN0YW1wX2FuZF9sb2dfaW50ZXJuYWwoInN5c2xvZ2Qgc3RhcnRlZDogQnVzeUJveCB2IiBCQl9WRVIpOworCisJd2hpbGUgKCFiYl9nb3Rfc2lnbmFsKSB7CisJCXNzaXplX3Qgc3o7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TWVNMT0dEX0RVUAorCQlsYXN0X2J1ZiA9IHJlY3ZidWY7CisJCWlmIChyZWN2YnVmID09IEcucmVjdmJ1ZikKKwkJCXJlY3ZidWYgPSBHLnJlY3ZidWYgKyBNQVhfUkVBRDsKKwkJZWxzZQorCQkJcmVjdmJ1ZiA9IEcucmVjdmJ1ZjsKKyNlbmRpZgorIHJlYWRfYWdhaW46CisJCXN6ID0gcmVhZChTVERJTl9GSUxFTk8sIHJlY3ZidWYsIE1BWF9SRUFEIC0gMSk7CisJCWlmIChzeiA8IDApIHsKKwkJCWlmICghYmJfZ290X3NpZ25hbCkKKwkJCQliYl9wZXJyb3JfbXNnKCJyZWFkIGZyb20gJXMiLCBfUEFUSF9MT0cpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBEcm9wIHRyYWlsaW5nICdcbicgYW5kIE5VTHMgKHR5cGljYWxseSB0aGVyZSBpcyBvbmUgTlVMKSAqLworCQl3aGlsZSAoMSkgeworCQkJaWYgKHN6ID09IDApCisJCQkJZ290byByZWFkX2FnYWluOworCQkJLyogbWFuIDMgc3lzbG9nIHNheXM6ICJBIHRyYWlsaW5nIG5ld2xpbmUgaXMgYWRkZWQgd2hlbiBuZWVkZWQiLgorCQkJICogSG93ZXZlciwgbmVpdGhlciBnbGliYyBub3IgdWNsaWJjIGRvIHRoaXM6CisJCQkgKiBzeXNsb2cocHJpbywgInRlc3QiKSAgIHNlbmRzICJ0ZXN0XDAiIHRvIC9kZXYvbG9nLAorCQkJICogc3lzbG9nKHByaW8sICJ0ZXN0XG4iKSBzZW5kcyAidGVzdFxuXDAiLgorCQkJICogSU9XOiBuZXdsaW5lIGlzIHBhc3NlZCB2ZXJiYXRpbSEKKwkJCSAqIEkgdGFrZSBpdCB0byBtZWFuIHRoYXQgaXQncyBzeXNsb2dkJ3Mgam9iCisJCQkgKiB0byBtYWtlIHRob3NlIGxvb2sgaWRlbnRpY2FsIGluIHRoZSBsb2cgZmlsZXMuICovCisJCQlpZiAocmVjdmJ1Zltzei0xXSAhPSAnXDAnICYmIHJlY3ZidWZbc3otMV0gIT0gJ1xuJykKKwkJCQlicmVhazsKKwkJCXN6LS07CisJCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9TWVNMT0dEX0RVUAorCQlpZiAoKG9wdGlvbl9tYXNrMzIgJiBPUFRfZHVwKSAmJiAoc3ogPT0gbGFzdF9zeikpCisJCQlpZiAobWVtY21wKGxhc3RfYnVmLCByZWN2YnVmLCBzeikgPT0gMCkKKwkJCQljb250aW51ZTsKKwkJbGFzdF9zeiA9IHN6OworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfUkVNT1RFX0xPRworCQkvKiBTdG9jayBzeXNsb2dkIHNlbmRzIGl0ICdcbictdGVybWluYXRlZAorCQkgKiBvdmVyIG5ldHdvcmssIG1pbWljIHRoYXQgKi8KKwkJcmVjdmJ1Zltzel0gPSAnXG4nOworCisJCS8qIFdlIGFyZSBub3QgbW9kaWZ5aW5nIGxvZyBtZXNzYWdlcyBpbiBhbnkgd2F5IGJlZm9yZSBzZW5kICovCisJCS8qIFJlbW90ZSBzaXRlIGNhbm5vdCB0cnVzdCBfdXNfIGFueXdheSBhbmQgbmVlZCB0byBkbyB2YWxpZGF0aW9uIGFnYWluICovCisJCWZvciAoaXRlbSA9IEcucmVtb3RlSG9zdHM7IGl0ZW0gIT0gTlVMTDsgaXRlbSA9IGl0ZW0tPmxpbmspIHsKKwkJCXJlbW90ZUhvc3RfdCAqcmggPSAocmVtb3RlSG9zdF90ICopaXRlbS0+ZGF0YTsKKworCQkJaWYgKHJoLT5yZW1vdGVGRCA9PSAtMSkgeworCQkJCXJoLT5yZW1vdGVGRCA9IHRyeV90b19yZXNvbHZlX3JlbW90ZShyaCk7CisJCQkJaWYgKHJoLT5yZW1vdGVGRCA9PSAtMSkKKwkJCQkJY29udGludWU7CisJCQl9CisKKwkJCS8qIFNlbmQgbWVzc2FnZSB0byByZW1vdGUgbG9nZ2VyLgorCQkJICogT24gc29tZSBlcnJvcnMsIGNsb3NlIGFuZCBzZXQgcmVtb3RlRkQgdG8gLTEKKwkJCSAqIHNvIHRoYXQgRE5TIHJlc29sdXRpb24gaXMgcmV0cmllZC4KKwkJCSAqLworCQkJaWYgKHNlbmR0byhyaC0+cmVtb3RlRkQsIHJlY3ZidWYsIHN6KzEsCisJCQkJCU1TR19ET05UV0FJVCB8IE1TR19OT1NJR05BTCwKKwkJCQkJJihyaC0+cmVtb3RlQWRkci0+dS5zYSksIHJoLT5yZW1vdGVBZGRyLT5sZW4pID09IC0xCisJCQkpIHsKKwkJCQlzd2l0Y2ggKGVycm5vKSB7CisJCQkJY2FzZSBFQ09OTlJFU0VUOgorCQkJCWNhc2UgRU5PVENPTk46IC8qIHBhcmFub2lhICovCisJCQkJY2FzZSBFUElQRToKKwkJCQkJY2xvc2UocmgtPnJlbW90ZUZEKTsKKwkJCQkJcmgtPnJlbW90ZUZEID0gLTE7CisJCQkJCWZyZWUocmgtPnJlbW90ZUFkZHIpOworCQkJCQlyaC0+cmVtb3RlQWRkciA9IE5VTEw7CisJCQkJfQorCQkJfQorCQl9CisjZW5kaWYKKwkJaWYgKCFFTkFCTEVfRkVBVFVSRV9SRU1PVEVfTE9HIHx8IChvcHRpb25fbWFzazMyICYgT1BUX2xvY2FsbG9nKSkgeworCQkJcmVjdmJ1Zltzel0gPSAnXDAnOyAvKiBlbnN1cmUgaXQgKmlzKiBOVUwgdGVybWluYXRlZCAqLworCQkJc3BsaXRfZXNjYXBlX2FuZF9sb2cocmVjdmJ1Ziwgc3opOworCQl9CisJfSAvKiB3aGlsZSAoIWJiX2dvdF9zaWduYWwpICovCisKKwl0aW1lc3RhbXBfYW5kX2xvZ19pbnRlcm5hbCgic3lzbG9nZCBleGl0aW5nIik7CisJcmVtb3ZlX3BpZGZpbGUoQ09ORklHX1BJRF9GSUxFX1BBVEggIi9zeXNsb2dkLnBpZCIpOworCWlwY3N5c2xvZ19jbGVhbnVwKCk7CisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfa21zZykKKwkJa21zZ19jbGVhbnVwKCk7CisJa2lsbF9teXNlbGZfd2l0aF9zaWcoYmJfZ290X3NpZ25hbCk7CisjdW5kZWYgcmVjdmJ1ZgorfQorCitpbnQgc3lzbG9nZF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc3lzbG9nZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IG9wdHM7CisJY2hhciBPUFRJT05fREVDTDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9SRU1PVEVfTE9HCisJbGxpc3RfdCAqcmVtb3RlQWRkckxpc3QgPSBOVUxMOworI2VuZGlmCisKKwlJTklUX0coKTsKKworCS8qIE5vIG5vbi1vcHRpb24gcGFyYW1zLCAtUiBjYW4gb2NjdXIgbXVsdGlwbGUgdGltZXMgKi8KKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MCIgSUZfRkVBVFVSRV9SRU1PVEVfTE9HKCI6Ujo6Iik7CisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsIE9QVElPTl9TVFIsIE9QVElPTl9QQVJBTSk7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUkVNT1RFX0xPRworCXdoaWxlIChyZW1vdGVBZGRyTGlzdCkgeworCQlyZW1vdGVIb3N0X3QgKnJoID0geHphbGxvYyhzaXplb2YoKnJoKSk7CisJCXJoLT5yZW1vdGVIb3N0bmFtZSA9IGxsaXN0X3BvcCgmcmVtb3RlQWRkckxpc3QpOworCQlyaC0+cmVtb3RlRkQgPSAtMTsKKwkJcmgtPmxhc3RfZG5zX3Jlc29sdmUgPSBtb25vdG9uaWNfc2VjKCkgLSBETlNfV0FJVF9TRUMgLSAxOworCQlsbGlzdF9hZGRfdG8oJkcucmVtb3RlSG9zdHMsIHJoKTsKKwl9CisjZW5kaWYKKworI2lmZGVmIFNZU0xPR0RfTUFSSworCWlmIChvcHRzICYgT1BUX21hcmspIC8vIC1tCisJCUcubWFya0ludGVydmFsID0geGF0b3VfcmFuZ2Uob3B0X20sIDAsIElOVF9NQVgvNjApICogNjA7CisjZW5kaWYKKwkvL2lmIChvcHRzICYgT1BUX25vZm9yaykgLy8gLW4KKwkvL2lmIChvcHRzICYgT1BUX291dGZpbGUpIC8vIC1PCisJaWYgKG9wdHMgJiBPUFRfbG9nbGV2ZWwpIC8vIC1sCisJCUcubG9nTGV2ZWwgPSB4YXRvdV9yYW5nZShvcHRfbCwgMSwgOCk7CisJLy9pZiAob3B0cyAmIE9QVF9zbWFsbCkgLy8gLVMKKyNpZiBFTkFCTEVfRkVBVFVSRV9ST1RBVEVfTE9HRklMRQorCWlmIChvcHRzICYgT1BUX2ZpbGVzaXplKSAvLyAtcworCQlHLmxvZ0ZpbGVTaXplID0geGF0b3VfcmFuZ2Uob3B0X3MsIDAsIElOVF9NQVgvMTAyNCkgKiAxMDI0OworCWlmIChvcHRzICYgT1BUX3JvdGF0ZWNudCkgLy8gLWIKKwkJRy5sb2dGaWxlUm90YXRlID0geGF0b3VfcmFuZ2Uob3B0X2IsIDAsIDk5KTsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX0lQQ19TWVNMT0cKKwlpZiAob3B0X0MpIC8vIC1DbgorCQlHLnNobV9zaXplID0geGF0b3VsX3JhbmdlKG9wdF9DLCA0LCBJTlRfTUFYLzEwMjQpICogMTAyNDsKKyNlbmRpZgorCS8qIElmIHRoZXkgaGF2ZSBub3Qgc3BlY2lmaWVkIHJlbW90ZSBsb2dnaW5nLCB0aGVuIGxvZyBsb2NhbGx5ICovCisJaWYgKEVOQUJMRV9GRUFUVVJFX1JFTU9URV9MT0cgJiYgIShvcHRzICYgT1BUX3JlbW90ZWxvZykpIC8vIC1SCisJCW9wdGlvbl9tYXNrMzIgfD0gT1BUX2xvY2FsbG9nOworI2lmIEVOQUJMRV9GRUFUVVJFX1NZU0xPR0RfQ0ZHCisJcGFyc2Vfc3lzbG9nZGNmZyhvcHRfZik7CisjZW5kaWYKKworCS8qIFN0b3JlIGF3YXkgbG9jYWxob3N0J3MgbmFtZSBiZWZvcmUgdGhlIGZvcmsgKi8KKwlHLmhvc3RuYW1lID0gc2FmZV9nZXRob3N0bmFtZSgpOworCSpzdHJjaHJudWwoRy5ob3N0bmFtZSwgJy4nKSA9ICdcMCc7CisKKwlpZiAoIShvcHRzICYgT1BUX25vZm9yaykpIHsKKwkJYmJfZGFlbW9uaXplX29yX3JleGVjKERBRU1PTl9DSERJUl9ST09ULCBhcmd2KTsKKwl9CisKKwkvL3VtYXNrKDApOyAtIHdoeT8/CisJd3JpdGVfcGlkZmlsZShDT05GSUdfUElEX0ZJTEVfUEFUSCAiL3N5c2xvZ2QucGlkIik7CisKKwlkb19zeXNsb2dkKCk7CisJLyogcmV0dXJuIEVYSVRfU1VDQ0VTUzsgKi8KK30KKworLyogQ2xlYW4gdXAuIE5lZWRlZCBiZWNhdXNlIHdlIGFyZSBpbmNsdWRlZCBmcm9tIHN5c2xvZ2RfYW5kX2xvZ2dlci5jICovCisjdW5kZWYgREVCVUcKKyN1bmRlZiBTWVNMT0dEX01BUksKKyN1bmRlZiBTWVNMT0dEX1dSTE9DSworI3VuZGVmIEcKKyN1bmRlZiBHTE9CQUxTCisjdW5kZWYgSU5JVF9HCisjdW5kZWYgT1BUSU9OX1NUUgorI3VuZGVmIE9QVElPTl9ERUNMCisjdW5kZWYgT1BUSU9OX1BBUkFNCmRpZmYgLS1naXQgYS9zeXNrbG9nZC9zeXNsb2dkX2FuZF9sb2dnZXIuYyBiL3N5c2tsb2dkL3N5c2xvZ2RfYW5kX2xvZ2dlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NjRmMjMKLS0tIC9kZXYvbnVsbAorKysgYi9zeXNrbG9nZC9zeXNsb2dkX2FuZF9sb2dnZXIuYwpAQCAtMCwwICsxLDUxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBwcmlvcml0eW5hbWVzW10gYW5kIGZhY2lsaXR5bmFtZXNbXQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2RlZmluZSBTWVNMT0dfTkFNRVMKKyNkZWZpbmUgU1lTTE9HX05BTUVTX0NPTlNUCisjaW5jbHVkZSA8c3lzbG9nLmg+CisKKyNpZiAwCisvKiBGb3IgdGhlIHJlY29yZDogd2l0aCBTWVNMT0dfTkFNRVMgPHN5c2xvZy5oPiBkZWZpbmVzCisgKiAobm90IGRlY2xhcmVzKSB0aGUgZm9sbG93aW5nOgorICovCit0eXBlZGVmIHN0cnVjdCBfY29kZSB7CisJLypjb25zdCovIGNoYXIgKmNfbmFtZTsKKwlpbnQgY192YWw7Cit9IENPREU7CisvKmNvbnN0Ki8gQ09ERSBwcmlvcml0eW5hbWVzW10gPSB7CisgICAgeyAiYWxlcnQiLCBMT0dfQUxFUlQgfSwKKy4uLgorICAgIHsgTlVMTCwgLTEgfQorfTsKKy8qIHNhbWUgZm9yIGZhY2lsaXR5bmFtZXNbXSAqLworCisvKiBUaGlzIE1VU1Qgb2NjdXIgb25seSBvbmNlIHBlciBlbnRpcmUgZXhlY3V0YWJsZSwKKyAqIHRoZXJlZm9yZSB3ZSBjYW4ndCBqdXN0IGRvIGl0IGluIHN5c2xvZ2QuYyBhbmQgbG9nZ2VyLmMgLQorICogdGhlcmUgd2lsbCBiZSB0d28gY29waWVzIG9mIGl0LgorICoKKyAqIFdlIGNhbm5vdCBldmVuIGRvIGl0IGluIHNlcGFyYXRlIGZpbGUgYW5kIHRoZW4ganVzdCByZWZlcmVuY2UKKyAqIHByaW9yaXR5bmFtZXNbXSBmcm9tIHN5c2xvZ2QuYyBhbmQgbG9nZ2VyLmMgLSBiYXJlIDxzeXNsb2cuaD4KKyAqIHdpbGwgbm90IGVtaXQgZXh0ZXJuIGRlY2xzIGZvciBwcmlvcml0eW5hbWVzW10hIEF0dGVtcHRzIHRvCisgKiBlbWl0ICJtYXRjaGluZyIgc3RydWN0IF9jb2RlIGRlY2xhcmF0aW9uIGRlZmVhdCB0aGUgd2hvbGUgcHVycG9zZQorICogb2YgPHN5c2xvZy5oPi4KKyAqCisgKiBGb3Igbm93LCBzeXNsb2dkLmMgYW5kIGxvZ2dlci5jIGFyZSBzaW1wbHkgY29tcGlsZWQgaW50bworICogb25lIG9iamVjdCBmaWxlLgorICovCisjZW5kaWYKKworI2lmIEVOQUJMRV9TWVNMT0dECisjaW5jbHVkZSAic3lzbG9nZC5jIgorI2VuZGlmCisKKyNpZiBFTkFCTEVfTE9HR0VSCisjaW5jbHVkZSAibG9nZ2VyLmMiCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9SRUFETUUgYi90ZXN0c3VpdGUvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NDNhMTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvUkVBRE1FCkBAIC0wLDAgKzEsNTIgQEAKK1RvIHJ1biB0aGUgdGVzdCBzdWl0ZSwgY2hhbmdlIHRvIHRoaXMgZGlyZWN0b3J5IGFuZCBydW4gIi4vcnVudGVzdCIuICBJdCB3aWxsCitydW4gYWxsIG9mIHRoZSB0ZXN0IGNhc2VzLCBhbmQgbGlzdCB0aG9zZSB3aXRoIHVuZXhwZWN0ZWQgb3V0Y29tZXMuICBBZGRpbmcgdGhlCistdiBvcHRpb24gd2lsbCBjYXVzZSBpdCB0byBzaG93IGV4cGVjdGVkIG91dGNvbWVzIGFzIHdlbGwuICBUbyBvbmx5IHJ1biB0aGUgdGVzdAorY2FzZXMgZm9yIHBhcnRpY3VsYXIgYXBwbGV0czoKKworLi9ydW50ZXN0IDxhcHBsZXQxPiA8YXBwbGV0Mj4uLi4KKworU2V0IFNLSVBfS05PV05fQlVHUyBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBhbnkgbm9uLWVtcHR5IHZhbHVlCit0byBleGNsdWRlIHRlc3RzIHdoaWNoIGFyZSBrbm93biB0byBmYWlsLgorCitTZXQgU0tJUF9JTlRFUk5FVF9URVNUUyB0byBleGNsdWRlIHRlc3RzIHdoaWNoIHJlcXVpcmUgd29ya2luZworaW50ZXJuZXQgY29ubmVjdGlvbi4KKworCitDb21tb24gY2F1c2VzIG9mIGZhbHNlIHBvc2l0aXZlczoKKworRm9yIGJ1c3lib3ggYnVpbHQgYWdhaW5zdCB1Y2xpYmMsIC9ldGMvVFogZG9lcyBub3QgZXhpc3Qgb3IgZG9lcyBub3QgbWF0Y2gKK2hvc3Qgc3lzdGVtIHRpbWV6b25lIHNldHRpbmcuIEZvciBnbGliYyBiYXNlZCBob3N0IHN5c3RlbXMsIHRpbWV6b25lIHNldHRpbmdzCithcmUgaW4gL2V0Yy9sb2NhbHRpbWUuCisKK0xBTkcgYW5kIExDX3h4eCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgc2V0IHRvIG5vbi1DIGxvY2FsZS4KKworCitEZXZlbG9wZXIncyBub3RlczoKKworVGhlIHRlc3QgY2FzZXMgZm9yIGFuIGFwcGxldCByZXNpZGUgaW4gdGhlIHN1YmRpcmVjdG9yeSBvZiB0aGUgYXBwbGV0IG5hbWUuCitUaGUgbmFtZSBvZiB0aGUgdGVzdCBjYXNlIHNob3VsZCBiZSB0aGUgYXNzZXJ0aW9uIHRoYXQgaXMgdGVzdGVkLgorVGhlIHRlc3QgY2FzZSBzaG91bGQgYmUgYSBzaGVsbCBmcmFnbWVudCB0aGF0IHJldHVybnMgc3VjY2Vzc2Z1bGx5CitpZiB0aGUgdGVzdCBjYXNlIHBhc3NlcywgYW5kIHVuc3VjY2Vzc2Z1bGx5IG90aGVyd2lzZS4KKworSWYgdGhlIHRlc3QgY2FzZSByZWxpZXMgb24gYSBjZXJ0YWluIGZlYXR1cmUsIGl0IHNob3VsZCBpbmNsdWRlIHRoZSBzdHJpbmcKKyJGRUFUVVJFOiAiIGZvbGxvd2VkIGJ5IHRoZSBuYW1lIG9mIHRoZSBmZWF0dXJlIGluIGEgY29tbWVudC4gIElmIGl0IGlzIGFsd2F5cworZXhwZWN0ZWQgdG8gZmFpbCwgaXQgc2hvdWxkIGluY2x1ZGUgdGhlIHN0cmluZyAiWEZBSUwiIGluIGEgY29tbWVudC4KKworCitGb3IgdGhlIGVudGlyZSB0ZXN0c3VpdGUsIHRoZSBjb3B5cmlnaHQgaXMgYXMgZm9sbG93czoKKworQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyICBNYXR0IEtyYWFpCisKK1RoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKK21vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK1RoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKK0dOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvVE9ETyBiL3Rlc3RzdWl0ZS9UT0RPCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OTU3ZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvVE9ETwpAQCAtMCwwICsxLDI2IEBACitUaGlzIHRlc3RzdWl0ZSBpcyBxdWl0ZSBvYnZpb3VzbHkgYSB3b3JrIGluIHByb2dyZXNzLiAgQXMgc3VjaCwKK3RoZXJlIGFyZSBhIG51bWJlciBvZiBnb29kIGV4dGVuc2lvbnMuICBJZiB5b3UgYXJlIGxvb2tpbmcgZm9yCitzb21ldGhpbmcgdG8gZG8sIGZlZWwgZnJlZSB0byB0YWNrbGUgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZzoKKworTW92aW5nIHRvIHRoZSBuZXcgZm9ybWF0LgorCVRoZSBvbGQgd2F5IHdhcyAibG90cyBvZiBsaXR0bGUgdGVzdHMgZmlsZXMgaW4gYSBkaXJlY3RvcnkiLCB3aGljaAorCWRvZXNuJ3QgaW50ZXJhY3Qgd2VsbCB3aXRoIHNvdXJjZSBjb250cm9sIHN5c3RlbXMuICBUaGUgbmV3IHRlc3QKKwlmb3JtYXQgaXMgY29tbWFuZC50ZXN0cyBmaWxlcyB0aGF0IHVzZSB0ZXN0aW5nLnNoLgorCitFdmVyeSBidXN5Ym94IGFwcGxldCBuZWVkcyBhIGNvcnJlc3BvbmRpbmcgYXBwbGV0LnRlc3RzLgorCitGdWxsIFNVU3YzIHRlc3Qgc3VpdGUuCisJTGV0J3MgbWFrZSB0aGUgTGludXggVGVzdCBQcm9qZWN0IGplYWxvdXMsIHNoYWxsIHdlPyAgRG9uJ3QganVzdAorCWF1ZGl0IHByb2dyYW1zIGZvciBzdGFuZGFyZHMgY29tcGxpYW5jZSwgX3Byb3ZlXyBpdCB3aXRoIGEgcmVncmVzc2lvbgorCXRlc3QgaGFybmVzcy4KKworCWh0dHA6Ly93d3cub3Blbmdyb3VwLm9yZy9vbmxpbmVwdWJzLzAwOTY5NTM5OS91dGlsaXRpZXMvCisKK1NvbWUgdGVzdHMgbmVlZCByb290IGFjY2Vzcy4KKwlJdCdzIGhhcmQgdG8gdGVzdCB0aGluZ3MgbGlrZSBtb3VudCBvciBpbml0IGFzIGEgbm9ybWFsIHVzZXIuCisJUG9zc2libHkgVXNlciBNb2RlIExpbnV4IGNvdWxkIGJlIHVzZWQgZm9yIHRoaXMsIG9yIHBlcmhhcHMKKwlFcmlrJ3MgYnVpbGRyb290LgorCitsaWJiYiB1bml0IHRlc3RpbmcKKwlCZWluZyBhYmxlIHRvIHRlc3QgdGhlIGZ1bmN0aW9ucyBvZiBsaWJiYiBpbmRpdmlkdWFsbHkgbWF5CisJaGVscCB0byBwcmV2ZW50IHJlZ3Jlc3Npb25zLgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2FsbF9zb3VyY2Vjb2RlLnRlc3RzIGIvdGVzdHN1aXRlL2FsbF9zb3VyY2Vjb2RlLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdkY2JiZTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvYWxsX3NvdXJjZWNvZGUudGVzdHMKQEAgLTAsMCArMSw5MiBAQAorIyEvYmluL3NoCisKKyMgVGVzdHMgZm9yIHRoZSBzb3VyY2Vjb2RlIGJhc2UgaXRzZWxmLgorIyBDb3B5cmlnaHQgMjAwNiBieSBNaWtlIEZyeXNpbmdlciA8dmFwaWVyQGdlbnRvby5vcmc+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKK1sgLW4gIiRzcmNkaXIiIF0gfHwgc3JjZGlyPSQocHdkKQorLiAuL3Rlc3Rpbmcuc2gKKworCisjCisjIGlmIHdlIGRvbid0IGhhdmUgdGhlIHNvdXJjZWNvZGUgYXZhaWxhYmxlLCBsZXQncyBqdXN0IGJhaWwKKyMKK1sgLXMgIiRzcmNkaXIvLi4vTWFrZWZpbGUiIF0gfHwgZXhpdCAwCitbIC1zICIkc3JjZGlyLy4uL2luY2x1ZGUvYXBwbGV0cy5oIiBdIHx8IGV4aXQgMAorCisKKyMKKyMgbWFrZSBzdXJlIGFsbCB1c2FnZSBzdHJpbmdzIGFyZSBwcm9wZXJseSBlc2NhcGVkLiAgb2Z0ZW50aW1lcyBwZW9wbGUgbWlzcworIyBhbiBlc2NhcGUgc2VxdWVuY2Ugc28gd2UgZW5kIHVwIHdpdGg6CisjICNkZWZpbmUgZm9vX3VzYWdlIFwKKyMgICAgICAgIiB0aGlzIGxpbmUgaXMgb2siIFwKKyMgICAgICAgIiBhcyBpcyB0aGlzIGxpbmUiCisjICAgICAgICIgYnV0IHRoaXMgb25lIGlzIGJyb2tlbiBhcyB0aGUgXCBpcyBtaXNzaW5nIGZyb20gYWJvdmUiCisjCiske0NST1NTX0NPTVBJTEV9Y3BwIC1kRCAtUCAkc3JjZGlyLy4uL2luY2x1ZGUvdXNhZ2UuaCBcCisJfCBzZWQgLWUgJy9eI2RlZmluZS9kJyAtZSAnL14kL2QnID4gc3JjLnVzYWdlLmVzY2FwZWQKK3Rlc3RpbmcgIlVzYWdlIHN0cmluZ3MgZXNjYXBlZCIgImNhdCBzcmMudXNhZ2UuZXNjYXBlZCIgIiIgIiIgIiIKK3JtIC1mIHNyYy51c2FnZS5lc2NhcGVkCisKKworIworIyB2ZXJpZnkgdGhlIGFwcGxldCBvcmRlciBpcyBjb3JyZWN0IGluIGFwcGxldHMuaCwgb3RoZXJ3aXNlCisjIGFwcGxldHMgd29uJ3QgYmUgY2FsbGVkIHByb3Blcmx5LgorIworc2VkIC1uIC1lICdzOl4vLzo6JyAtZSAnL15JRl9bQS1aXSooQVBQTEVUL3tzOiwuKjo6O3M6LiooOjo7czoiOjpnO3B9JyBcCisJJHNyY2Rpci8uLi9pbmNsdWRlL2FwcGxldHMuaCA+IGFwcGxldC5vcmRlci5jdXJyZW50CitMQ19BTEw9QyBzb3J0IGFwcGxldC5vcmRlci5jdXJyZW50ID4gYXBwbGV0Lm9yZGVyLmNvcnJlY3QKK3Rlc3RpbmcgIkFwcGxldCBvcmRlciIgImRpZmYgLXUgYXBwbGV0Lm9yZGVyLmN1cnJlbnQgYXBwbGV0Lm9yZGVyLmNvcnJlY3QiICIiICIiICIiCitybSAtZiBhcHBsZXQub3JkZXIuY3VycmVudCBhcHBsZXQub3JkZXIuY29ycmVjdAorCisKKyMKKyMgY2hlY2sgZm9yIG1pc2MgY29tbW9uIHR5cG9zCisjCitmaW5kICRzcmNkaXIvLi4vIFwKKwknKCcgLXR5cGUgZCAtYSAnKCcgLW5hbWUgLnN2biAtbyAtbmFtZSB0ZXN0c3VpdGUgJyknIC1wcnVuZSAnKScgXAorCS1vICcoJyAtdHlwZSBmIC1hIC1wcmludDAgJyknIHwgeGFyZ3MgLTAgXAorCWdyZXAgLUkgXAorCQktZSAnXDxjb21wYXRhYmlsaXR5XD4nIFwKKwkJLWUgJ1w8Y29tcGF0YWJsZVw+JyBcCisJCS1lICdcPGZvcmRlZ3JvdW5kXD4nIFwKKwkJLWUgJ1w8ZGVwZW5jeVw+JyAtZSAnXDxkZXBlbmRhbmN5XD4nIC1lICdcPGRlcGVuZGFuY2llc1w+JyBcCisJCS1lICdcPGRlZmFsdFw+JyBcCisJCS1lICdcPHJlbWFpbmdcPicgXAorCQktZSAnXDxxdWV1ZWluZ1w+JyBcCisJCS1lICdcPGRldGF0Y2hcPicgXAorCQktZSAnXDxzZW1wYWhvcmVcPicgXAorCQktZSAnXDxyZXByZW5zdGF0aXZlXD4nIFwKKwkJLWUgJ1w8b3ZlcnJpZGVuXD4nIFwKKwkJLWUgJ1w8cmVhZGVkXD4nIFwKKwkJLWUgJ1w8Zm9ybWF0ZWRcPicgXAorCQktZSAnXDxhbGdvcml0aGljXD4nIFwKKwkJLWUgJ1w8ZGVhbW9uXD4nIFwKKwkJLWUgJ1w8ZGVyZWZlcm5jZVw+JyBcCisJCS1lICdcPGFjb21hZGF0ZVw+JyBcCisJCXwgc2VkIC1lICJzOl4kc3JjZGlyL1wuXC4vOjpnIiA+IHNyYy50eXBvcwordGVzdGluZyAiQ29tbW9uIHR5cG9zIiAiY2F0IHNyYy50eXBvcyIgIiIgIiIgIiIKK3JtIC1mIHNyYy50eXBvcworCisKKyMKKyMgZG9uJ3QgYWxsb3cgb2Jzb2xldGUgZnVuY3Rpb25zCisjCitmaW5kICRzcmNkaXIvLi4gJygnIC1uYW1lICcqLmMnIC1vIC1uYW1lICcqLmgnICcpJyAtcHJpbnQwIHwgeGFyZ3MgLTAgXAorCWdyZXAgLUUgLWUgJ1w8KGJjbXB8YmNvcHl8Ynplcm98Z2V0d2R8aW5kZXh8bWt0ZW1wfHJpbmRleHx1dGltZXxzaWdibG9ja3xzaWdnZXRtYXNrfHNpZ3NldG1hc2spXD5bWzpzcGFjZTpdXSpcKCcgXAorCXwgc2VkIC1lICJzOl4kc3JjZGlyL1wuXC4vOjpnIiA+IHNyYy5vYnNvbGV0ZS5mdW5jcwordGVzdGluZyAiT2Jzb2xldGUgZnVuY3Rpb24gdXNhZ2UiICJjYXQgc3JjLm9ic29sZXRlLmZ1bmNzIiAiIiAiIiAiIgorcm0gLWYgc3JjLm9ic29sZXRlLmZ1bmNzCisKKworIworIyBkb24ndCBhbGxvdyBvYnNvbGV0ZSBoZWFkZXJzCisjCitmaW5kICRzcmNkaXIvLi4gJygnIC1uYW1lICcqLmMnIC1vIC1uYW1lICcqLmgnICcpJyAtcHJpbnQwIHwgeGFyZ3MgLTAgXAorCWdyZXAgLUUgLWUgJ1w8KG1hbGxvY3xtZW1vcnl8c3lzLyhlcnJub3xmY250bHxzaWduYWx8c3Ryb3B0c3x0ZXJtaW9zfHVuaXN0ZCkpXC5oXD4nIFwKKwl8IHNlZCAtZSAiczpeJHNyY2Rpci9cLlwuLzo6ZyIgPiBzcmMub2Jzb2xldGUuaGVhZGVycwordGVzdGluZyAiT2Jzb2xldGUgaGVhZGVycyIgImNhdCBzcmMub2Jzb2xldGUuaGVhZGVycyIgIiIgIiIgIiIKK3JtIC1mIHNyYy5vYnNvbGV0ZS5oZWFkZXJzCisKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvYXIudGVzdHMgYi90ZXN0c3VpdGUvYXIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMGE4ZWI5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9hci50ZXN0cwpAQCAtMCwwICsxLDI3IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IDIwMTAgTm9raWEgQ29ycG9yYXRpb24KKyMgV3JpdHRlbiBieSBBbGV4YW5kZXIgU2hpc2hraW4KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJjb21tYW5kKHMpIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCitvcHRpb25hbCBGRUFUVVJFX0FSX0NSRUFURQorCitybSB0ZXN0LmEgMj4vZGV2L251bGwKK3Rlc3RpbmcgImFyIGNyZWF0ZXMgYXJjaGl2ZXMiIFwKKyAgICAgICAiYXIgcmMgdGVzdC5hIFJFQURNRSAmJiBhciBwIHRlc3QuYSBSRUFETUUgfCBtZDVzdW0iIFwKKyAgICAgICAiJChtZDVzdW0gPFJFQURNRSlcbiIgXAorICAgICAgICIiIFwKKyAgICAgICAiIgorcm0gdGVzdC5hCisKK3Rlc3RpbmcgImFyIHJlcGxhY2VzIHRoaW5ncyBpbiBhcmNoaXZlcyIgXAorICAgICAgICJlY2hvICdibGFoIScgPmZpbGUxICYmIGVjaG8gJ2JsYXN0IScgPmZpbGUyICYmIGFyIGNyIHRlc3QuYSBSRUFETUUgZmlsZTEgZmlsZTIgJiYgbXYgZmlsZTIgZmlsZTEgJiYgYXIgY3IgdGVzdC5hIGZpbGUxICYmIGFyIHAgdGVzdC5hIGZpbGUxIiBcCisgICAgICAgImJsYXN0IVxuIiBcCisgICAgICAgIiIgXAorICAgICAgICIiCitybSB0ZXN0LmEgZmlsZTEgZmlsZTEgMj4vZGV2L251bGwKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvYXNoLnRlc3RzIGIvdGVzdHN1aXRlL2FzaC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYTk5MjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2FzaC50ZXN0cwpAQCAtMCwwICsxLDgzIEBACisjIS9iaW4vc2gKKyMKKyMgVGhlc2UgYXJlIG5vdCBhc2ggdGVzdHMsIHdlIHVzZSBhc2ggYXMgYSB3YXkgdG8gdGVzdCBsaW5lZWRpdCEKKyMKKyMgQ29weXJpZ2h0IDIwMTAgYnkgRGVueXMgVmxhc2Vua28KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKK3Rlc3QgLWYgIiRiaW5kaXIvLmNvbmZpZyIgJiYgLiAiJGJpbmRpci8uY29uZmlnIgorCit0ZXN0IHgiQ09ORklHX1NDUklQVCIgPSB4InkiIHx8IGV4aXQgMAordGVzdCB4IkNPTkZJR19IRVhEVU1QIiA9IHgieSIgfHwgZXhpdCAwCit0ZXN0IHgiQ09ORklHX0ZFQVRVUkVfREVWUFRTIiA9IHgieSIgfHwgZXhpdCAwCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAib3B0aW9ucyIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKworaWYgdGVzdCB4IiRDT05GSUdfVU5JQ09ERV9QUkVTRVJWRV9CUk9LRU4iID0geCJ5IjsgdGhlbgordGVzdGluZyAiT25lIGJ5dGUgd2hpY2ggaXMgbm90IHZhbGlkIHVuaWNvZGUgY2hhciBmb2xsb3dlZCBieSB2YWxpZCBpbnB1dCIgXAorCSJzY3JpcHQgLXEgLWMgJ2FzaCcgL2Rldi9udWxsID4vZGV2L251bGw7IGNhdCBhc2gub3V0cHV0IiBcCisJIlwKKzAwMDAwMDAwICBmZiAyZCAwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwuLS58CiswMDAwMDAwMworIiBcCisJIiIgXAorCSJlY2hvIFx4ZmYtIHwgaGV4ZHVtcCAtQyA+YXNoLm91dHB1dDsgZXhpdDsgZXhpdDsgZXhpdDsgZXhpdFxuIgorCit0ZXN0aW5nICIzMCBieXRlcyB3aGljaCBhcmUgbm90IHZhbGlkIHVuaWNvZGUgY2hhcnMgZm9sbG93ZWQgYnkgdmFsaWQgaW5wdXQiIFwKKwkic2NyaXB0IC1xIC1jICdhc2gnIC9kZXYvbnVsbCA+L2Rldi9udWxsOyBjYXQgYXNoLm91dHB1dCIgXAorCSJcCiswMDAwMDAwMCAgZmYgZmYgZmYgZmYgZmYgZmYgZmYgZmYgIGZmIGZmIGZmIGZmIGZmIGZmIGZmIGZmICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwMDAwMDEwICBmZiBmZiBmZiBmZiBmZiBmZiBmZiBmZiAgZmYgZmYgZmYgZmYgZmYgZmYgMmQgMGEgIHwuLi4uLi4uLi4uLi4uLi0ufAorMDAwMDAwMjAKKyIgXAorCSIiIFwKKwkiZWNobyBceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYtIHwgaGV4ZHVtcCAtQyA+YXNoLm91dHB1dDsgZXhpdDsgZXhpdDsgZXhpdDsgZXhpdFxuIgorZWxzZQordGVzdGluZyAiT25lIGJ5dGUgd2hpY2ggaXMgbm90IHZhbGlkIHVuaWNvZGUgY2hhciBmb2xsb3dlZCBieSB2YWxpZCBpbnB1dCIgXAorCSJzY3JpcHQgLXEgLWMgJ2FzaCcgL2Rldi9udWxsID4vZGV2L251bGw7IGNhdCBhc2gub3V0cHV0IiBcCisJIlwKKzAwMDAwMDAwICAzZiAyZCAwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHw/LS58CiswMDAwMDAwMworIiBcCisJIiIgXAorCSJlY2hvIFx4ZmYtIHwgaGV4ZHVtcCAtQyA+YXNoLm91dHB1dDsgZXhpdDsgZXhpdDsgZXhpdDsgZXhpdFxuIgorCit0ZXN0aW5nICIzMCBieXRlcyB3aGljaCBhcmUgbm90IHZhbGlkIHVuaWNvZGUgY2hhcnMgZm9sbG93ZWQgYnkgdmFsaWQgaW5wdXQiIFwKKwkic2NyaXB0IC1xIC1jICdhc2gnIC9kZXYvbnVsbCA+L2Rldi9udWxsOyBjYXQgYXNoLm91dHB1dCIgXAorCSJcCiswMDAwMDAwMCAgM2YgM2YgM2YgM2YgM2YgM2YgM2YgM2YgIDNmIDNmIDNmIDNmIDNmIDNmIDNmIDNmICB8Pz8/Pz8/Pz8/Pz8/Pz8/P3wKKzAwMDAwMDEwICAzZiAzZiAzZiAzZiAzZiAzZiAzZiAzZiAgM2YgM2YgM2YgM2YgM2YgM2YgMmQgMGEgIHw/Pz8/Pz8/Pz8/Pz8/Py0ufAorMDAwMDAwMjAKKyIgXAorCSIiIFwKKwkiZWNobyBceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmYtIHwgaGV4ZHVtcCAtQyA+YXNoLm91dHB1dDsgZXhpdDsgZXhpdDsgZXhpdDsgZXhpdFxuIgorZmkKKworCisjIE5vdCBzdXJlIHRoaXMgYmVoYXZpb3IgaXMgcGVyZmVjdDogd2UgbG9zZSBhbGwgaW52YWxpZCBpbnB1dCB3aGljaCBwcmVjZWRlcworIyBhcnJvdyBrZXlzIGFuZCBzdWNoLiBJbiB0aGlzIGV4YW1wbGUsIFx4ZmZceGZmIGFyZSBsb3N0Cit0ZXN0aW5nICIyIGJ5dGVzIHdoaWNoIGFyZSBub3QgdmFsaWQgdW5pY29kZSBjaGFycyBmb2xsb3dlZCBieSBsZWZ0IGFycm93IGtleSIgXAorCSJzY3JpcHQgLXEgLWMgJ2FzaCcgL2Rldi9udWxsID4vZGV2L251bGw7IGNhdCBhc2gub3V0cHV0IiBcCisJIlwKKzAwMDAwMDAwICAzZCAyZCAwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHw9LS58CiswMDAwMDAwMworIiBcCisJIiIgXAorCSJlY2hvID0rXHhmZlx4ZmZceDFiXHg1Ylx4NDQtIHwgaGV4ZHVtcCAtQyA+YXNoLm91dHB1dDsgZXhpdDsgZXhpdDsgZXhpdDsgZXhpdFxuIgorCisjIGFzaCBzaG91bGQgc2VlICJlY2hvIFx4ZmZcbiIscGF1c2UgLT4gZXhlY3V0ZSBpdCBhcyAiZWNobyA/IiAod2hpY2ggaXMKKyMgbm90IGNoZWNrZWQgYnkgdGhlIHRlc3QpLCB0aGVuIHJlYWQgYW5kIGV4ZWN1dGUgdGhlIHJlc3Q6ICJlY2hvIEEgfCAuLi4iCisjIFRoZSBidWcgd2FzIHRoYXQgYXNoIHdhcyBlYXRpbmcgdGhlIGJlZ2lubmluZyBvZiAiZWNobyBBIiBkZXNwaXRlIHRoZSBwYXVzZS4KK3Rlc3RpbmcgIkludmFsaWQgdW5pY29kZSBjaGFycyBmb2xsb3dlZCBieSBhIHBhdXNlIGRvIG5vdCBlYXQgbmV4dCBjaGFycyIgXAorCSJ7ICRFQ0hPIC1uZSAnZWNobyBceGZmXG4nOyBzbGVlcCAxOyAkRUNITyAtbmUgJ2VjaG8gQSB8IGhleGR1bXAgLUMgPmFzaC5vdXRwdXQ7IGV4aXQ7IGV4aXQ7IGV4aXQ7IGV4aXRcbic7IH0gXAorICAgICAgICAgfCBzY3JpcHQgLXEgLWMgJ2FzaCcgL2Rldi9udWxsID4vZGV2L251bGw7IGNhdCBhc2gub3V0cHV0IiBcCisJIlwKKzAwMDAwMDAwICA0MSAwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxBLnwKKzAwMDAwMDAyCisiIFwKKwkiIiAiIgorCitybSBhc2gub3V0cHV0CisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2F3ay50ZXN0cyBiL3Rlc3RzdWl0ZS9hd2sudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYWRhYjRhZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9hd2sudGVzdHMKQEAgLTAsMCArMSwzMjEgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDA3IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAiZGVzY3JpcHRpb24iICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK3Rlc3RpbmcgImF3ayAtRiBjYXNlIDAiICJhd2sgLUYgJ1sjXScgJ3sgcHJpbnQgTkYgfSciICIiICAgICIiICIiCit0ZXN0aW5nICJhd2sgLUYgY2FzZSAxIiAiYXdrIC1GICdbI10nICd7IHByaW50IE5GIH0nIiAiMFxuIiAiIiAiXG4iCit0ZXN0aW5nICJhd2sgLUYgY2FzZSAyIiAiYXdrIC1GICdbI10nICd7IHByaW50IE5GIH0nIiAiMlxuIiAiIiAiI1xuIgordGVzdGluZyAiYXdrIC1GIGNhc2UgMyIgImF3ayAtRiAnWyNdJyAneyBwcmludCBORiB9JyIgIjNcbiIgIiIgIiNhYmMjXG4iCit0ZXN0aW5nICJhd2sgLUYgY2FzZSA0IiAiYXdrIC1GICdbI10nICd7IHByaW50IE5GIH0nIiAiM1xuIiAiIiAiI2FiYyN6elxuIgordGVzdGluZyAiYXdrIC1GIGNhc2UgNSIgImF3ayAtRiAnWyNdJyAneyBwcmludCBORiB9JyIgIjRcbiIgIiIgIiNhYmMjI3p6XG4iCit0ZXN0aW5nICJhd2sgLUYgY2FzZSA2IiAiYXdrIC1GICdbI10nICd7IHByaW50IE5GIH0nIiAiNFxuIiAiIiAieiNhYmMjI3p6XG4iCit0ZXN0aW5nICJhd2sgLUYgY2FzZSA3IiAiYXdrIC1GICdbI10nICd7IHByaW50IE5GIH0nIiAiNVxuIiAiIiAieiMjYWJjIyN6elxuIgorCisjIGNvbmRpdGlvbnMgYW5kIG9wZXJhdG9ycwordGVzdGluZyAiYXdrIGlmIG9wZXJhdG9yID09ICIgICJhd2sgJ0JFR0lOe2lmKDIzPT0yMykgcHJpbnQgXCJmb29cIn0nIiAiZm9vXG4iICIiICIiCit0ZXN0aW5nICJhd2sgaWYgb3BlcmF0b3IgIT0gIiAgImF3ayAnQkVHSU57aWYoMjMhPTIzKSBwcmludCBcImJhclwifSciICIiICAgICAgIiIgIiIKK3Rlc3RpbmcgImF3ayBpZiBvcGVyYXRvciA+PSAiICAiYXdrICdCRUdJTntpZigyMz49MjMpIHByaW50IFwiZm9vXCJ9JyIgImZvb1xuIiAiIiAiIgordGVzdGluZyAiYXdrIGlmIG9wZXJhdG9yIDwgIiAgICJhd2sgJ0JFR0lOe2lmKDIgPCAxMykgcHJpbnQgXCJmb29cIn0nIiAiZm9vXG4iICIiICIiCit0ZXN0aW5nICJhd2sgaWYgc3RyaW5nID09ICIgICAgImF3ayAnQkVHSU57aWYoXCJhXCI9PVwiYWJcIikgcHJpbnQgXCJiYXJcIn0nIiAiIiAiIiAiIgorCisjIDQyOTQ5NjcyOTUgPSAweGZmZmZmZmZmCit0ZXN0aW5nICJhd2sgYml0d2lzZSBvcCIgICJhd2sgJ3sgcHJpbnQgb3IoNDI5NDk2NzI5NSwxKSB9JyIgIjQyOTQ5NjcyOTVcbiIgIiIgIlxuIgorCisjIHdlIHdlcmUgdGVzdGluZyBmb3IgYSBub24tZW1wdHkgYm9keSB3aGVuIGRlY2lkaW5nIGlmIGEgZnVuY3Rpb24gd2FzCisjIGRlZmluZWQgb3Igbm90LiBUaGUgdGVzdGNhc2UgYmVsb3cgY2F1c2VkOgorIyBhd2s6IGNtZC4gbGluZTo4OiBDYWxsIHRvIHVuZGVmaW5lZCBmdW5jdGlvbgorcHJnPScKK2Z1bmN0aW9uIGVtcHR5X2Z1bihjb3VudCkgeworICAjIGVtcHR5Cit9CitFTkQgeworICBpPTEKKyAgcHJpbnQgIkwiIGkgIlxuIgorICBlbXB0eV9mdW4oaSArIGkgKyArK2kpCisgIHByaW50ICJMIiBpICJcbiIKK30nCit0ZXN0aW5nICJhd2sgaGFuZGxlcyBlbXB0eSBmdW5jdGlvbiBmKGFyZyl7fSIgXAorCSJhd2sgJyRwcmcnIiBcCisJIkwxXG5cbkwyXG5cbiIgXAorCSIiICIiCisKK3ByZz0nCitmdW5jdGlvbiBvdXRlcl9mdW4oKSB7CisgIHJldHVybiAxCit9CitFTkQgeworICBpPTEKKyAgcHJpbnQgIkwiIGkgIlxuIgorICBpICs9IG91dGVyX2Z1bigpCisgIHByaW50ICJMIiBpICJcbiIKK30nCit0ZXN0aW5nICJhd2sgcHJvcGVybHkgaGFuZGxlcyBmdW5jdGlvbiBmcm9tIG90aGVyIHNjb3BlIiBcCisJImF3ayAnJHByZyciIFwKKwkiTDFcblxuTDJcblxuIiBcCisJIiIgIiIKKworcHJnPScKK0VORCB7CisgIGk9MQorICBwcmludCAiTCIgaSAiXG4iCisgIGkgKyB0cmlnZ2VyX2Vycm9yX2Z1bigpCisgIHByaW50ICJMIiBpICJcbiIKK30nCit0ZXN0aW5nICJhd2sgcHJvcGVybHkgaGFuZGxlcyB1bmRlZmluZWQgZnVuY3Rpb24iIFwKKwkiYXdrICckcHJnJyAyPiYxIiBcCisJIkwxXG5cbmF3azogY21kLiBsaW5lOjU6IENhbGwgdG8gdW5kZWZpbmVkIGZ1bmN0aW9uXG4iIFwKKwkiIiAiIgorCisKK29wdGlvbmFsIERFU0tUT1AKK3Rlc3RpbmcgImF3ayBoZXggY29uc3QgMSIgImF3ayAneyBwcmludCBvcigweGZmZmZmZmZmLDEpIH0nIiAiNDI5NDk2NzI5NVxuIiAiIiAiXG4iCit0ZXN0aW5nICJhd2sgaGV4IGNvbnN0IDIiICJhd2sgJ3sgcHJpbnQgb3IoMHg4MDAwMDAwMCwxKSB9JyIgIjIxNDc0ODM2NDlcbiIgIiIgIlxuIgordGVzdGluZyAiYXdrIG9jdCBjb25zdCIgICAiYXdrICd7IHByaW50IG9yKDAxMjM0LDEpIH0nIiAgICAgICI2NjlcbiIgICAgICAgICAiIiAiXG4iCitTS0lQPQorCisjIGNoZWNrIHRoYXQgImhleC9vY3QgaW50ZWdlciIgaGV1cmlzdGljIGRvZXNuJ3Qga2ljayBpbiBvbiAwME5OLk5OTgordGVzdGluZyAiYXdrIGZsb2F0aW5nIGNvbnN0IHdpdGggbGVhZGluZyB6ZXJvZXMiIFwKKwkiYXdrICd7IHByaW50ZiBcIiVmICVmXG5cIiwgXCIwMDAuMTIzXCIsIFwiMDA5LjEyM1wiIH0nIiBcCisJIjAuMTIzMDAwIDkuMTIzMDAwXG4iIFwKKwkiIiAiXG4iCisKKyMgbG9uZyBmaWVsZCBzZXBzIHJlcXVpcmluZyByZWdleAordGVzdGluZyAiYXdrIGxvbmcgZmllbGQgc2VwIiAiYXdrIC1GLS0gJ3sgcHJpbnQgTkYsIGxlbmd0aChcJE5GKSwgXCRORiB9JyIgXAorCSIyIDAgXG4zIDAgXG40IDAgXG41IDAgXG4iIFwKKwkiIiBcCisJImEtLVxuYS0tYi0tXG5hLS1iLS1jLS1cbmEtLWItLWMtLWQtLSIKKwordGVzdGluZyAiYXdrIC1GIGhhbmRsZXMgZXNjYXBlcyIgImF3ayAtRidcXHgyMScgJ3twcmludCBcJDF9JyIgXAorCSJhXG4iIFwKKwkiIiBcCisJImEhYlxuIgorCisjICdAKHNhbXB8Y29kZXxmaWxlKVx7JyBpcyBhbiBpbnZhbGlkIGV4dGVuZGVkIHJlZ2V4ICh1bm1hdGNoZWQgJ3snKSwKKyMgYnV0IGdhd2sgMy4xLjUgZG9lcyBub3QgYmFpbCBvdXQgb24gaXQuCit0ZXN0aW5nICJhd2sgZ3N1YiBmYWxscyBiYWNrIHRvIG5vbi1leHRlbmRlZC1yZWdleCIgXAorCSJhd2sgJ2dzdWIoXCJAKHNhbXB8Y29kZXxmaWxlKVx7XCIsXCJcIik7JzsgZWNobyBcJD8iICIwXG4iICIiICJIaVxuIgorCitvcHRpb25hbCBUQVIgQlVOWklQMiBGRUFUVVJFX1NFQU1MRVNTX0JaMgordGVzdCB4IiRTS0lQIiAhPSB4IjEiICYmIHRhciB4amYgYXdrX3QxLnRhci5iejIKK3Rlc3RpbmcgImF3ayAnZ2NjIGJ1aWxkIGJ1ZyciIFwKKwkiYXdrIC1mIGF3a190MV9vcHQtZnVuY3Rpb25zLmF3ayAtZiBhd2tfdDFfb3B0aC1nZW4uYXdrIDxhd2tfdDFfaW5wdXQgfCBtZDVzdW0iIFwKKwkiZjg0MmUyNTY0NjFhNWFiMWVjNjBiNThkMTZmMTExNGYgIC1cbiIgXAorCSIiICIiCitybSAtcmYgYXdrX3QxXyogMj4vZGV2L251bGwKK1NLSVA9CisKK1E9JyI6IicKKwordGVzdGluZyAiYXdrIE5GIGluIEJFR0lOIiBcCisJImF3ayAnQkVHSU4geyBwcmludCAke1F9IE5GICR7UX0gXCQwICR7UX0gXCQxICR7UX0gXCQyICR7UX0gfSciIFwKKwkiOjA6Ojo6XG4iIFwKKwkiIiAiIgorCitwcmc9JworZnVuY3Rpb24gYih0bXApIHsKKwl0bXAgPSAwOworCXByaW50ICIiIHRtcDsgI3RoaXMgbGluZSBjYXVzZXMgdGhlIGJ1ZworCXJldHVybiB0bXA7Cit9CitmdW5jdGlvbiBjKHRtcGMpIHsKKwl0bXBjID0gYigpOyByZXR1cm4gdG1wYzsKK30KK0JFR0lOIHsKKwlwcmludCAoYygpID8gInN0cmluZyIgOiAibnVtYmVyIik7Cit9JwordGVzdGluZyAiYXdrIHN0cmluZyBjYXN0IChidWcgNzI1KSIgXAorCSJhd2sgJyRwcmcnIiBcCisJIjBcbm51bWJlclxuIiBcCisJIiIgIiIKKwordGVzdGluZyAiYXdrIGhhbmRsZXMgd2hpdGVzcGFjZSBiZWZvcmUgYXJyYXkgc3Vic2NyaXB0IiBcCisJImF3ayAnQkVHSU4geyBhcnIgWzNdID0gMTsgcHJpbnQgYXJyIFszXSB9JyIgIjFcbiIgIiIgIiIKKworIyBHTlUgYXdrIDMuMS41J3MgInByaW50IEVSUk5PIiBwcmludHMgIk5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkiIGluc3RlYWQgb2YgIjIiLAorIyBkbyB3ZSBuZWVkIHRvIGVtdWxhdGUgdGhhdCBhcyB3ZWxsPwordGVzdGluZyAiYXdrIGhhbmRsZXMgbm9uLWV4aXN0aW5nIGZpbGUgY29ycmVjdGx5IiBcCisJImF3ayAnQkVHSU4geyBnZXRsaW5lIGxpbmUgPFwiZG9lc250X2V4aXN0XCI7IHByaW50IEVSUk5POyBFUlJOTz0wOyBjbG9zZShcImRvZXNudF9leGlzdFwiKTsgcHJpbnQgRVJSTk87IHByaW50IFwiT2tcIiB9JyIgXAorCSIyXG4wXG5Pa1xuIiAiIiAiIgorCitwcmc9JworQkVHSU4geworICB1WyJhIl09MQorICB1WyJiIl09MQorICB1WyJjIl09MQorICB2WyJkIl09MQorICB2WyJlIl09MQorICB2WyJmIl09MQorICBmb3IgKGwgaW4gdSkgeworICAgIHByaW50ICJvdXRlcjEiLCBsOworICAgIGZvciAobCBpbiB2KSB7CisgICAgICBwcmludCAiIGlubmVyIiwgbDsKKyAgICB9CisgICAgcHJpbnQgIm91dGVyMiIsIGw7CisgIH0KKyAgcHJpbnQgImVuZCIsIGw7CisgIGw9ImEiCisgIGV4aXQ7Cit9JwordGVzdGluZyAiYXdrIG5lc3RlZCBsb29wcyB3aXRoIHRoZSBzYW1lIHZhcmlhYmxlIiBcCisJImF3ayAnJHByZyciIFwKKwkiXAorb3V0ZXIxIGEKKyBpbm5lciBkCisgaW5uZXIgZQorIGlubmVyIGYKK291dGVyMiBmCitvdXRlcjEgYgorIGlubmVyIGQKKyBpbm5lciBlCisgaW5uZXIgZgorb3V0ZXIyIGYKK291dGVyMSBjCisgaW5uZXIgZAorIGlubmVyIGUKKyBpbm5lciBmCitvdXRlcjIgZgorZW5kIGYKKyIgXAorCSIiICIiCisKK3ByZz0nCitCRUdJTiB7CisgIHVbImEiXT0xCisgIHVbImIiXT0xCisgIHVbImMiXT0xCisgIHZbImQiXT0xCisgIHZbImUiXT0xCisgIHZbImYiXT0xCisgIGZvciAobCBpbiB1KSB7CisgICAgcHJpbnQgIm91dGVyMSIsIGw7CisgICAgZm9yIChsIGluIHYpIHsKKyAgICAgIHByaW50ICIgaW5uZXIiLCBsOworICAgICAgYnJlYWs7CisgICAgfQorICAgIHByaW50ICJvdXRlcjIiLCBsOworICB9CisgIHByaW50ICJlbmQiLCBsOworICBsPSJhIgorICBleGl0OworfScKKyMgSXQncyBub3QganVzdCBidWdneSwgaXQgZW50ZXJzIGluZmluaXRlIGxvb3AuIFRodXMgZGlzYWJsZWQKK2ZhbHNlICYmIHRlc3QgeCIkU0tJUF9LTk9XTl9CVUdTIiA9IHgiIiAmJiB0ZXN0aW5nICJhd2sgbmVzdGVkIGxvb3BzIHdpdGggdGhlIHNhbWUgdmFyaWFibGUgYW5kIGJyZWFrIiBcCisJImF3ayAnJHByZyciIFwKKwkiXAorb3V0ZXIxIGEKKyBpbm5lciBkCitvdXRlcjIgZAorb3V0ZXIxIGIKKyBpbm5lciBkCitvdXRlcjIgZAorb3V0ZXIxIGMKKyBpbm5lciBkCitvdXRlcjIgZAorZW5kIGQKKyIgXAorCSIiICIiCisKK3ByZz0nCitmdW5jdGlvbiBmKCkgeworICBmb3IgKGwgaW4gdikgeworICAgIHByaW50ICIgaW5uZXIiLCBsOworICAgIHJldHVybjsKKyAgfQorfQorCitCRUdJTiB7CisgIHVbImEiXT0xCisgIHVbImIiXT0xCisgIHVbImMiXT0xCisgIHZbImQiXT0xCisgIHZbImUiXT0xCisgIHZbImYiXT0xCisgIGZvciAobCBpbiB1KSB7CisgICAgcHJpbnQgIm91dGVyMSIsIGw7CisgICAgZigpOworICAgIHByaW50ICJvdXRlcjIiLCBsOworICB9CisgIHByaW50ICJlbmQiLCBsOworICBsPSJhIgorICBleGl0OworfScKKyMgSXQncyBub3QganVzdCBidWdneSwgaXQgZW50ZXJzIGluZmluaXRlIGxvb3AuIFRodXMgZGlzYWJsZWQKK2ZhbHNlICYmIHRlc3QgeCIkU0tJUF9LTk9XTl9CVUdTIiA9IHgiIiAmJiB0ZXN0aW5nICJhd2sgbmVzdGVkIGxvb3BzIHdpdGggdGhlIHNhbWUgdmFyaWFibGUgYW5kIHJldHVybiIgXAorCSJhd2sgJyRwcmcnIiBcCisJIlwKK291dGVyMSBhCisgaW5uZXIgZAorb3V0ZXIyIGQKK291dGVyMSBiCisgaW5uZXIgZAorb3V0ZXIyIGQKK291dGVyMSBjCisgaW5uZXIgZAorb3V0ZXIyIGQKK2VuZCBkCisiIFwKKwkiIiAiIgorCit0ZXN0aW5nICJhd2sgaGFuZGxlcyBlbXB0eSAoKSIgXAorCSJhd2sgJ0JFR0lOIHtwcmludCgpfScgMj4mMSIgImF3azogY21kLiBsaW5lOjE6IEVtcHR5IHNlcXVlbmNlXG4iICIiICIiCisKK3Rlc3RpbmcgImF3ayBGUyBhc3NpZ25tZW50IiAiYXdrICd7RlM9XCI6XCI7IHByaW50IFwkMX0nIiBcCisJImE6YlxuZVxuIiBcCisJIiIgXAorCSJhOmIgYzpkXG5lOmYgZzpoIgorCitvcHRpb25hbCBGRUFUVVJFX0FXS19MSUJNCit0ZXN0aW5nICJhd2sgbGFyZ2UgaW50ZWdlciIgXAorCSJhd2sgJ0JFR0lOe249KDJeMzEpLTE7IHByaW50IG4sIGludChuKSwgbiUxLCArK24sIGludChuKSwgbiUxfSciIFwKKwkiMjE0NzQ4MzY0NyAyMTQ3NDgzNjQ3IDAgMjE0NzQ4MzY0OCAyMTQ3NDgzNjQ4IDBcbiIgXAorCSIiICIiCitTS0lQPQorCit0ZXN0aW5nICJhd2sgbGVuZ3RoKGFycmF5KSIgXAorCSJhd2sgJ0JFR0lOeyBBWzFdPTI7IEFbXCJxd2VcIl09XCJhc2RcIjsgcHJpbnQgbGVuZ3RoKEEpfSciIFwKKwkiMlxuIiBcCisJIiIgIiIKKwordGVzdGluZyAiYXdrIGxlbmd0aCgpIiBcCisJImF3ayAne3ByaW50IGxlbmd0aDsgcHJpbnQgbGVuZ3RoKCk7IHByaW50IGxlbmd0aChcInF3ZVwiKTsgcHJpbnQgbGVuZ3RoKDk5KzkpfSciIFwKKwkiM1xuM1xuM1xuM1xuIiBcCisJIiIgInF3ZSIKKwordGVzdGluZyAiYXdrIC1mIGFuZCBBUkdDIiBcCisJImF3ayAtZiAtIGlucHV0IiBcCisJInJlXG4yXG4iIFwKKwkiZG8gcmUgbWlcbiIgXAorCSd7cHJpbnQgJDI7IHByaW50IEFSR0M7fScgXAorCitvcHRpb25hbCBGRUFUVVJFX0FXS19HTlVfRVhURU5TSU9OUwordGVzdGluZyAiYXdrIC1lIGFuZCBBUkdDIiBcCisJImF3ayAtZSAne3ByaW50IFwkMjsgcHJpbnQgQVJHQzt9JyBpbnB1dCIgXAorCSJyZVxuMlxuIiBcCisJImRvIHJlIG1pXG4iIFwKKwkiIgorU0tJUD0KKworIyBUaGUgZXhhbXBsZXMgYXJlIGluIGZhY3Qgbm90IHZhbGlkIGF3ayBwcm9ncmFtcyAoYnJlYWsvY29udGludWUKKyMgY2FuIG9ubHkgYmUgdXNlZCBpbnNpZGUgbG9vcHMpLgorIyBCdXQgd2UgZG8gYWNjZXB0IHRoZW0gb3V0c2lkZSBvZiBsb29wcy4KKyMgV2UgaGFkIGEgYnVnIHdpdGggbWlzcGFyc2luZyAiYnJlYWsgOyBlbHNlIiBzZXF1ZW5jZS4KKyMgVGVzdCB0aGF0ICp0aGF0KiBidWcgaXMgZml4ZWQsIHVzaW5nIHNpbXBsZXN0IHBvc3NpYmxlIHNjcmlwdHM6Cit0ZXN0aW5nICJhd2sgYnJlYWsiIFwKKwkiYXdrIC1mIC0gMj4mMTsgZWNobyBcJD8iIFwKKwkiMFxuIiBcCisJIiIgXAorCSdCRUdJTiB7IGlmICgxKSBicmVhazsgZWxzZSBhID0gMSB9JwordGVzdGluZyAiYXdrIGNvbnRpbnVlIiBcCisJImF3ayAtZiAtIDI+JjE7IGVjaG8gXCQ/IiBcCisJIjBcbiIgXAorCSIiIFwKKwknQkVHSU4geyBpZiAoMSkgY29udGludWU7IGVsc2UgYSA9IDEgfScKKworIyB0ZXN0aW5nICJkZXNjcmlwdGlvbiIgImNvbW1hbmQiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvYXdrX3QxLnRhci5iejIgYi90ZXN0c3VpdGUvYXdrX3QxLnRhci5iejIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZiOGEwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9hd2tfdDEudGFyLmJ6MgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvYmFzZW5hbWUvYmFzZW5hbWUtZG9lcy1ub3QtcmVtb3ZlLWlkZW50aWNhbC1leHRlbnNpb24gYi90ZXN0c3VpdGUvYmFzZW5hbWUvYmFzZW5hbWUtZG9lcy1ub3QtcmVtb3ZlLWlkZW50aWNhbC1leHRlbnNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0OGZkZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9iYXNlbmFtZS9iYXNlbmFtZS1kb2VzLW5vdC1yZW1vdmUtaWRlbnRpY2FsLWV4dGVuc2lvbgpAQCAtMCwwICsxIEBACit0ZXN0IHhmb28gPSB4YGJ1c3lib3ggYmFzZW5hbWUgZm9vIGZvb2AKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9iYXNlbmFtZS9iYXNlbmFtZS13b3JrcyBiL3Rlc3RzdWl0ZS9iYXNlbmFtZS9iYXNlbmFtZS13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTQwZTk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2Jhc2VuYW1lL2Jhc2VuYW1lLXdvcmtzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgeCQoYmFzZW5hbWUgJChwd2QpKSA9IHgkKGJ1c3lib3ggYmFzZW5hbWUgJChwd2QpKQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2J1bnppcDIudGVzdHMgYi90ZXN0c3VpdGUvYnVuemlwMi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mY2ZjZTFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2J1bnppcDIudGVzdHMKQEAgLTAsMCArMSw1NTcgQEAKKyMhL2Jpbi9zaAorIyBVc2VkIGJ5IGJvdGggZ3VuemlwIGFuZCBidW56aXAyIHRlc3RzCisKK0ZBSUxDT1VOVD0wCisKK2lmIHRlc3QgIiR7MCMjKi99IiA9ICJndW56aXAudGVzdHMiOyB0aGVuCisgICAgdW5wYWNrPWd1bnppcAorICAgIGV4dD1negorZWxpZiB0ZXN0ICIkezAjIyovfSIgPSAiYnVuemlwMi50ZXN0cyI7IHRoZW4KKyAgICB1bnBhY2s9YnVuemlwMgorICAgIGV4dD1iejIKK2Vsc2UKKyAgICBlY2hvICJXVEY/IGFyZ3YwPSckMCciCisgICAgZXhpdCAxCitmaQorCitiYj0iYnVzeWJveCAiCisKK3Vuc2V0IExDX0FMTAordW5zZXQgTENfTUVTU0FHRVMKK3Vuc2V0IExBTkcKK3Vuc2V0IExBTkdVQUdFCisKK2hlbGxvX2d6KCkgeworIyBHemlwcGVkICJIRUxMT1xuIgorI19fX19fX19fX19fX19fX19fX19fX19fX18gdnZ2IHZ2diB2dnYgdnZ2IC0gbXRpbWUKKyRFQ0hPIC1uZSAiXHgxZlx4OGJceDA4XHgwMFx4ODVceDFkXHhlZlx4NDVceDAyXHgwM1x4ZjNceDcwXHhmNVx4ZjFceGYxXHhlNyIKKyRFQ0hPIC1uZSAiXHgwMlx4MDBceDZlXHhkN1x4YWNceGZkXHgwNlx4MDBceDAwXHgwMCIKK30KKworaGVsbG9fYnoyKCkgeworIyBCemlwcGVkICJIRUxMT1xuIgorJEVDSE8gLW5lICJceDQyXHg1YVx4NjhceDM5XHgzMVx4NDFceDU5XHgyNlx4NTNceDU5XHg1Ylx4YjhceGU4XHhhM1x4MDBceDAwIgorJEVDSE8gLW5lICJceDAxXHg0NFx4MDBceDAwXHgxMFx4MDJceDQ0XHhhMFx4MDBceDMwXHhjZFx4MDBceGMzXHg0Nlx4MjlceDk3IgorJEVDSE8gLW5lICJceDE3XHg3Mlx4NDVceDM4XHg1MFx4OTBceDViXHhiOFx4ZThceGEzIgorfQorCisjIFdlIGhhZCBidW56aXAyIGVycm9yIG9uIHRoaXMgLmJ6MiBmaWxlIChmaXhlZCBpbiByZXYgMjI1MjEpCit0ZXN0MV9iejIoKQoreworJEVDSE8gLW5lICJceDQyXHg1YVx4NjhceDM5XHgzMVx4NDFceDU5XHgyNlx4NTNceDU5XHhiZlx4NGJceDk1XHhlN1x4MDBceDE1IgorJEVDSE8gLW5lICJceGExXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmIgorJEVDSE8gLW5lICJceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGZmXHhmZlx4ZmZceGVmXHhmZlx4ZmZceGZiXHhmZlx4ZmZceGZmIgorJEVDSE8gLW5lICJceGZmXHhmZlx4ZmZceGUwXHgxNlx4ZTZceDM3XHhiN1x4NzdceGIwXHhmYlx4MjJceGI1XHg4MVx4NDBceGY1IgorJEVDSE8gLW5lICJceGE3XHg2OVx4YTRceDQ3XHhhYlx4NjFceDRkXHg2YVx4M2RceGVmXHg3NVx4N2JceDIyXHhhZlx4NzFceDliIgorJEVDSE8gLW5lICJceGIzXHg1YVx4OTNceGJiXHg3OFx4MDBceDc5XHhiZFx4YzBceDA3XHhhZVx4MWJceGRiXHhjNVx4YzZceDZiIgorJEVDSE8gLW5lICJceDdhXHg3Ylx4ZDNceGQ3XHgzOFx4YmJceDcwXHg1ZVx4ZjBceGQxXHgwOFx4OWFceDY0XHgyNlx4NTNceDY4IgorJEVDSE8gLW5lICJceDAzXHg1M1x4NGRceDMyXHgzMFx4ZDJceDYxXHgzMVx4MTNceDY4XHhkMVx4YTZceDRjXHg0MVx4ODlceDg0IgorJEVDSE8gLW5lICJceDMxXHg0Zlx4NDBceGQyXHg3OVx4MTRceGYwXHhhM1x4ZGFceDFhXHgwMFx4NjVceDRmXHg1M1x4ZDlceDI4IgorJEVDSE8gLW5lICJceGQzXHhmNFx4NGNceDEzXHgyNlx4NGNceDRjXHg2NFx4MzRceDlhXHg2YVx4N2FceDk5XHgzY1x4MTJceDc4IgorJEVDSE8gLW5lICJceGQyXHg2OFx4ZDRceGRhXHg2YVx4NzlceDMyXHg2NFx4ZDFceGE4XHgxYlx4MTNceDAxXHg0Zlx4MjlceGVhIgorJEVDSE8gLW5lICJceDZjXHhhM1x4ZDJceDA3XHg5NFx4MDZceGE2XHg0NFx4MDFceDRmXHgxMVx4YTNceDRkXHgxM1x4NGRceDMxIgorJEVDSE8gLW5lICJceDMyXHg0Y1x4OThceDBjXHg5YVx4YTZceGRhXHgyOVx4M2RceGE0XHhmMVx4MjRceGZkXHgxYVx4YTNceDdhIgorJEVDSE8gLW5lICJceDkzXHhmNFx4YTdceGI1XHgzZFx4NTFceGUyXHg0N1x4OTRceGYyXHg4Zlx4MjlceGIyXHg5Ylx4MjlceGU5IgorJEVDSE8gLW5lICJceDM0XHg3OVx4NGZceDQ2XHg5ZVx4ODRceDZhXHg2OVx4ZWFceDY5XHhhN1x4YTlceGI1XHgwM1x4MjdceGE4IgorJEVDSE8gLW5lICJceGYxXHg0MFx4MzJceDdhXHgxM1x4MTBceDAwXHgzZFx4NDFceDkwXHgwMFx4ZDBceDFlXHg4NFx4MGRceDFiIgorJEVDSE8gLW5lICJceDUzXHg0MVx4YTNceDIxXHg5M1x4ZDBceDgzXHg1M1x4MTBceDk5XHgzNFx4MjRceGY1XHgzMlx4OTlceDM0IgorJEVDSE8gLW5lICJceGQyXHg3YVx4ODZceGNhXHg2Y1x4MjhceGRhXHg2ZFx4MjlceGE2XHg0ZFx4MzFceDBjXHhkNFx4N2FceDY5IgorJEVDSE8gLW5lICJceDFlXHg5M1x4MjNceGNhXHgxZVx4OTNceDRkXHgwM1x4MjZceDlhXHg2OFx4MDFceGEwXHhjOVx4YTBceDFhIgorJEVDSE8gLW5lICJceDAwXHgzNFx4MDBceDAwXHg2OVx4YTBceGY0XHg4MFx4MGRceDAwXHgwMFx4MzRceDA2XHg4Nlx4ODBceDM0IgorJEVDSE8gLW5lICJceDAwXHgwMFx4MDBceDM0XHgwMFx4NDhceDg4XHg4NFx4NTNceDY4XHg0Zlx4NDVceDNkXHg1MVx4ZmFceDRkIgorJEVDSE8gLW5lICJceDRjXHhkYVx4OWFceDhkXHhiNVx4NGNceGQ0XHhmMlx4MzVceDFiXHg1MVx4YjRceGQzXHgxNFx4ZjVceDBmIgorJEVDSE8gLW5lICJceDUwXHhmNVx4MGZceDI0XHhkM1x4MzJceDIzXHhkNFx4Y2RceDIxXHhhNlx4ZDRceGQwXHhkMFx4NjlceGEwIgorJEVDSE8gLW5lICJceGY0XHg4ZFx4M2RceDQzXHhkM1x4NTFceGVhXHg2Y1x4OTBceGQwXHg2OFx4ZjRceDQwXHgwMFx4MDdceGE4IgorJEVDSE8gLW5lICJceDE5XHgzZFx4NDdceGE4XHgxZVx4YTBceGQwXHgzNFx4MDBceDBkXHgxYVx4MDZceDgwXHgwMVx4ZTlceDAwIgorJEVDSE8gLW5lICJceDY0XHgyMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorJEVDSE8gLW5lICJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorJEVDSE8gLW5lICJceDAwXHgwMFx4NDhceDkyXHgxYVx4NDZceDlhXHgwMlx4OWVceDI0XHhjNVx4NGZceGM5XHg5MVx4NGZceDI5IgorJEVDSE8gLW5lICJceGVjXHhhOVx4ZWFceDM0XHhkM1x4ZDJceDY4XHg2OFx4MDBceGY0XHhkNFx4ZjVceDE5XHgwMFx4MzRceDAwIgorJEVDSE8gLW5lICJceDA2XHg0ZFx4MDBceGQwXHgxYVx4MWFceDAzXHgyMFx4MDFceGEwXHgwMFx4ZjVceDAwXHgwZFx4MDZceDliIgorJEVDSE8gLW5lICJceDUwXHgzNlx4YTNceDM1XHgwMFx4MDNceDQwXHgwM1x4NDBceDY4XHhmNVx4MzRceDAwXHgwMFx4MDBceDcxIgorJEVDSE8gLW5lICJceGU0XHgzY1x4MGNceDBmXHgwZlx4M2RceDIzXHg5YVx4N2ZceDMxXHg4MFx4YWVceDFhXHhlMVx4MDlceDAzIgorJEVDSE8gLW5lICJceDJjXHg2MVx4NjNceDE4XHhmY1x4MWFceDI4XHgwZVx4OWFceDg1XHhjM1x4ODZceDk2XHgxMVx4OTRceDg4IgorJEVDSE8gLW5lICJceDBmXHg5Mlx4MTFceDhhXHgxYVx4YjRceDYxXHg4Y1x4MzhceDMwXHhmM1x4YTlceGZiXHhiZVx4Y2RceDhkIgorJEVDSE8gLW5lICJceGM0XHhiN1x4N2FceDUyXHhhZFx4OTJceDlmXHhkZVx4ZTZceDc1XHg3NFx4YjdceGJiXHgwYlx4ZjVceDRjIgorJEVDSE8gLW5lICJceDk3XHhkOVx4NDlceGM4XHg2M1x4OWJceGE2XHhiYVx4OTVceGU4XHg0Nlx4NzBceDExXHg3MVx4NTVceDY3IgorJEVDSE8gLW5lICJceDE3XHhlM1x4YWJceDkxXHg3ZFx4YmVceDBkXHg1Nlx4NzhceDYxXHg5OFx4NDFceDI4XHgyY1x4YjVceGEzIgorJEVDSE8gLW5lICJceGQxXHhiOFx4NzZceDgwXHhjOFx4YWRceDliXHg3OVx4NmZceDhhXHg3YVx4ODRceDQ0XHgzNVx4MjRceDY0IgorJEVDSE8gLW5lICJceGEwXHhkZVx4MThceDgwXHgxMVx4MTRceGNkXHhiMFx4YzZceGU0XHgzMVx4NDlceDcxXHg1M1x4YWZceDVkIgorJEVDSE8gLW5lICJceDIwXHhjOVx4NTlceGRjXHhhMlx4NTNceDA2XHhmMFx4NGZceGM4XHgwOVx4MjFceDkyXHg2Ylx4ZjJceDM3IgorJEVDSE8gLW5lICJceDMyXHhjYlx4NzVceDkxXHg3NVx4NDFceGMwXHhlOFx4NDdceDAyXHhiM1x4OGVceDBiXHgxN1x4NDdceDQyIgorJEVDSE8gLW5lICJceDc5XHgyMVx4M2NceGVjXHg2Y1x4YjBceDg0XHgyNFx4OTZceDQ1XHg0YVx4OGVceGJiXHhiZVx4YzJceGUwIgorJEVDSE8gLW5lICJceDE2XHg4NVx4NzZceDQzXHgyNlx4ZDVceGQwXHg1OFx4ZGRceGY3XHg4M1x4NjVceDQ0XHg4Zlx4YmVceDZjIgorJEVDSE8gLW5lICJceDcyXHhlMVx4NWJceDFhXHgwZVx4M2FceGJiXHg1MVx4Y2ZceGJkXHg5Ylx4M2FceGQwXHhkNVx4MzlceDViIgorJEVDSE8gLW5lICJceDIzXHg3ZFx4YzlceDBiXHgwOFx4MGFceDIzXHg3Ylx4M2FceDAwXHg2N1x4YTFceDc2XHhhNVx4MTlceGFiIgorJEVDSE8gLW5lICJceDQ4XHhiZFx4NTRceGFhXHg4Zlx4YWZceGI2XHhlOFx4ZDVceDkxXHgwZlx4M2VceDRiXHgzYVx4OGRceGM5IgorJEVDSE8gLW5lICJceDQ4XHgwMlx4YzJceDZiXHhmY1x4ZWZceDBhXHg5Ylx4ZjFceDY3XHhkMFx4NDVceDQ4XHg0NVx4MDVceGMwIgorJEVDSE8gLW5lICJceDA3XHhjNFx4NDdceDk2XHg2ZVx4NzlceGFjXHgzMVx4NDlceGNmXHgxZlx4YThceDNiXHhkY1x4MWRceDQ0IgorJEVDSE8gLW5lICJceDgzXHg4NFx4MDRceDQ5XHg5Zlx4MjVceDAxXHg0Ylx4NDFceDgwXHgxNFx4MWJceDlkXHhhZlx4ZmNceGI1IgorJEVDSE8gLW5lICJceDQ2XHgyMlx4Y2FceDk2XHg0ZVx4ZDVceGUzXHgwOFx4N2RceGFiXHgxN1x4MGJceDY1XHhjZFx4YTdceGQ0IgorJEVDSE8gLW5lICJceDVlXHhkMVx4OGFceDI3XHhjOFx4NjBceGU5XHgxN1x4YTNceGM5XHhiNFx4MjZceGY4XHg1OFx4YjJceDRhIgorJEVDSE8gLW5lICJceDE1XHg1Mlx4OGVceDE1XHgyMFx4NzJceGIyXHgwZVx4NGZceDY0XHhjYlx4MmJceGEzXHhkOVx4ZjBceGE2IgorJEVDSE8gLW5lICJceDZmXHgwYlx4NTBceGVkXHg0ZVx4YTRceDI4XHhlOFx4ZTBceDA1XHgyZFx4MTVceDI2XHgyY1x4M2RceDlmIgorJEVDSE8gLW5lICJceDg3XHhjNFx4ZDFceGQzXHg2OVx4ZTJceDFjXHhlYVx4NDFceDk5XHhiZFx4NDNceDU5XHg5Zlx4MDZceDU3IgorJEVDSE8gLW5lICJceDA2XHhiNFx4NzJceGU3XHg0NVx4MmNceGQyXHhjZlx4NWZceDY2XHhhNVx4ZWJceDU4XHg2YVx4YzBceDM3IgorJEVDSE8gLW5lICJceDgyXHg4MVx4ZjZceGRjXHgxY1x4MzVceDViXHhjNlx4ZjFceDkyXHg0ZVx4ZTBceGUyXHhkMlx4MTJceDgyIgorJEVDSE8gLW5lICJceDkyXHg5N1x4MTRceGU1XHhhY1x4NDlceDlmXHhmZFx4MTZceDQ2XHhjNlx4YzJceGYxXHg0OFx4ODZceDA1IgorJEVDSE8gLW5lICJceGU2XHg3NFx4YWNceDlhXHg1Mlx4NDlceDY0XHg0NVx4MjVceDQzXHgwOFx4MDZceDAzXHg2M1x4NDlceDkxIgorJEVDSE8gLW5lICJceDlhXHg5Mlx4OTZceDViXHhlM1x4MmZceDExXHg1MVx4Y2RceGUzXHhhM1x4OWZceDNlXHg4Zlx4OWZceGFiIgorJEVDSE8gLW5lICJceDkyXHhiY1x4NmRceDM2XHhhM1x4ZDFceDcxXHhhNFx4NGFceGI2XHhlMVx4NDlceGI4XHhkY1x4MmNceDkwIgorJEVDSE8gLW5lICJceGIyXHhkNlx4ZmJceGE2XHhjNlx4ZDlceGE0XHg1Ylx4OWJceGU1XHhkNlx4NTlceGIzXHg3Nlx4MzdceGViIgorJEVDSE8gLW5lICJceGE2XHgzZVx4ZjBceDRjXHg5OFx4MWRceDczXHgwNFx4MDFceDA2XHg4Y1x4MTBceDAwXHgzYlx4MmJceDA0IgorJEVDSE8gLW5lICJceDU1XHhmNFx4ZmRceGVjXHg5ZFx4YWRceGM3XHgyYlx4YmRceGUzXHhkYVx4NGJceGVlXHgyOFx4NWRceDdhIgorJEVDSE8gLW5lICJceGJlXHhhNlx4YjlceGUwXHg4MVx4MTVceGE2XHgwOVx4MjZceDUyXHg2MFx4Y2NceDAzXHgzMFx4NjZceDYwIgorJEVDSE8gLW5lICJceGI5XHhkMFx4NzlceGZkXHhiNlx4YjNceDg1XHhhY1x4ZDFceGM0XHg0Y1x4YmZceDgwXHgyMFx4NDRceDQ1IgorJEVDSE8gLW5lICJceDdmXHg3Mlx4MjdceGZmXHgxNFx4YzJceGMwXHg4MVx4MDJceGFiXHgzMlx4MjBceDQzXHg0Nlx4MDZceDdmIgorJEVDSE8gLW5lICJceGI3XHhjMlx4YjlceGY2XHgzOVx4N2JceDBiXHgwY1x4Y2JceGU3XHg2ZVx4MDNceGUzXHgyMFx4NDZceDgyIgorJEVDSE8gLW5lICJceDRhXHgwMVx4MjNceGJiXHhiMFx4MGNceGI1XHg2Zlx4ZjdceGZiXHhmY1x4ZjVceGYyXHgzY1x4OGVceDdlIgorJEVDSE8gLW5lICJceGNiXHg3N1x4NmZceDdlXHhjM1x4NzFceDdjXHg0NFx4M2ZceGJjXHgzY1x4NTRceGI4XHg0MFx4MjdceDc4IgorJEVDSE8gLW5lICJceDYzXHg0ZFx4ODNceDIyXHg2YVx4MGFceDAwXHgwZVx4OGRceGE1XHhmYVx4NWVceGU1XHg4OVx4NTVceGE0IgorJEVDSE8gLW5lICJceDE4XHg2MFx4YzJceGE2XHhkNlx4MTdceDk4XHgyM1x4ZjBceDA3XHg0NFx4NDVceDE4XHhhNFx4NjhceGQ5IgorJEVDSE8gLW5lICJceGNjXHgwZFx4ZTNceDgxXHgwNlx4MDlceDBjXHgxN1x4YWZceDUyXHhhZFx4ODVceDgzXHg1ZFx4MDlceDMwIgorJEVDSE8gLW5lICJceDBkXHhhOVx4YjNceGU2XHg0NVx4ODVceDllXHgyNlx4NDdceGFiXHg3ZFx4MTRceGUxXHg4YVx4YjlceGZlIgorJEVDSE8gLW5lICJceDBhXHgwZlx4OGRceDY4XHg3M1x4NzNceDVjXHhhM1x4MGJceGI1XHgyOVx4MGNceGQ4XHhkZVx4YzJceDMwIgorJEVDSE8gLW5lICJceGJlXHg2MVx4Y2VceGJkXHg0ZFx4M2FceDAzXHhlZlx4ZTlceDQ1XHhlZlx4ZWJceDA3XHhlOFx4NmJceDdkIgorJEVDSE8gLW5lICJceGQyXHhmNFx4OTJceDhmXHg5MVx4YTFceDZlXHg4NVx4MmJceDczXHhhZlx4MDFceDhhXHhkMlx4MGZceDUyIgorJEVDSE8gLW5lICJceGVkXHg2NVx4OWZceGU2XHgxNVx4NDdceGIyXHg3MVx4ZDNceGJjXHhlZVx4ZGVceGZmXHgxMFx4ZmFceDRkIgorJEVDSE8gLW5lICJceDdmXHg5ZFx4NWFceDRiXHgxM1x4NGFceDkyXHhkNlx4ODVceGIyXHhlZlx4ZTFceGJiXHg5Mlx4ODBceDRhIgorJEVDSE8gLW5lICJceDQ1XHg3MFx4YTBceDRlXHhlNlx4ZjNceDM5XHg5YVx4ZjZceDU1XHhlZVx4ODBceGM1XHhhMFx4ZmZceDlkIgorJEVDSE8gLW5lICJceGI2XHg2Nlx4ZTZceGNjXHg4MVx4YjJceGRjXHhkNlx4MzlceGI3XHgwNlx4MmNceGQ2XHgzYlx4MjdceDBlIgorJEVDSE8gLW5lICJceDVkXHgwMVx4OTJceDVjXHhmM1x4YmVceDNkXHg0Nlx4OGFceDQ2XHhhNFx4ZDRceDAzXHgyMVx4ODZceDhlIgorJEVDSE8gLW5lICJceDY4XHgwNVx4M2JceGYwXHg2Nlx4NjlceDRjXHg2MVx4ZjBceDM5XHgxY1x4OWRceGUyXHg3NFx4M2JceDVmIgorJEVDSE8gLW5lICJceGQ3XHg4N1x4ZGNceGQzXHhlYlx4NTlceDUwXHhiNlx4NmRceDc1XHhjOVx4NWJceGRjXHg0ZFx4YjdceDI5IgorJEVDSE8gLW5lICJceDBjXHg2NFx4OWNceDVjXHgyMlx4ZDFceDQ0XHhkN1x4MDFceDY4XHgwYVx4MjZceDI1XHg3ZFx4NmFceDc2IgorJEVDSE8gLW5lICJceDFjXHgxYlx4YmZceDdhXHhhNVx4ZWJceDQyXHg4Zlx4MmZceDkzXHhhM1x4YzFceGNhXHhlM1x4OWZceDQ2IgorJEVDSE8gLW5lICJceGZkXHg3N1x4MDdceDI3XHgyZFx4YWZceGJiXHgxYVx4MTNceDViXHg4Nlx4OTRceDAwXHg5MFx4ODZceGMxIgorJEVDSE8gLW5lICJceDI0XHg4ZFx4ODZceDIyXHg1Nlx4YmVceDA2XHhlMVx4YTFceDQ0XHg0Y1x4MzZceGUyXHgyMlx4MDhceDIxIgorJEVDSE8gLW5lICJceGIyXHgyMFx4NmRceGI2XHhkYlx4NmNceDZlXHgyNlx4MjZceDA2XHhjMFx4MjZceDA5XHg5NFx4MDlceDc1IgorJEVDSE8gLW5lICJceDJjXHgxMFx4NGJceDQ0XHhiMFx4MWJceDQ0XHgyNlx4MTFceDU4XHgxMFx4ZGZceDJjXHhjMVx4NTVceDhhIgorJEVDSE8gLW5lICJceGFkXHhiMlx4YTNceDA4XHg2N1x4MzRceGU1XHg4M1x4OTVceDBhXHgwOFx4ODJceGMxXHg4YVx4MDZceGRkIgorJEVDSE8gLW5lICJceGIxXHgzMlx4MTRceGE1XHgyN1x4NzhceGNhXHhiNlx4ZDFceDU3XHg1YVx4YzlceDJhXHgwNlx4MDVceDI5IgorJEVDSE8gLW5lICJceDBjXHg4OFx4MjhceGQyXHg4Nlx4YTVceGE5XHg2OVx4NTFceDgxXHg0Nlx4YTFceGE0XHg4MVx4YjFceDhkIgorJEVDSE8gLW5lICJceGIxXHhiMFx4MDFceDgzXHg0OVx4NGJceDE1XHgxYVx4NmVceDEzXHgyNFx4NjhceDU0XHg2MFx4NGJceDRlIgorJEVDSE8gLW5lICJceDIxXHgzOVx4ODJceDFjXHg4ZFx4MDJceDZkXHgyM1x4YzNceDMwXHgyNVx4ODNceDY5XHgwNVx4MTFceDA1IgorJEVDSE8gLW5lICJceDRkXHgyNFx4MDRceDRlXHgwY1x4NTNceDgxXHgyNVx4Y2VceDM0XHgxMFx4ZDBceDA0XHhkNFx4OThceGExIgorJEVDSE8gLW5lICJceDIxXHgwYlx4N2VceGM0XHgwOVx4MTFceDMwXHg4Mlx4OGZceDY4XHhjNFx4MTNceDQ4XHgwYVx4MzBceDE3IgorJEVDSE8gLW5lICJceDRmXHhhZlx4ODBceDUyXHhkMFx4MzZceDIyXHhkNlx4NDNceDQ4XHgxNVx4ZjZceGExXHg4Mlx4ODRceGRjIgorJEVDSE8gLW5lICJceDQ0XHgzNFx4MDdceDUyXHhjNFx4MmNceDU2XHhiN1x4YWZceGE4XHgzYlx4YjFceDA4XHg0Ylx4NmJceDZjIgorJEVDSE8gLW5lICJceDI0XHgwNVx4Y2VceDFhXHgxMFx4ZTJceDAyXHgzMVx4MjJceDI1XHhiOFx4MjNceDY1XHhkMFx4NTJceDliIgorJEVDSE8gLW5lICJceDRhXHhjYlx4NjRceGFlXHhiZFx4ZThceGRhXHgzMFx4YjRceDI1XHg3OVx4YTRceGJjXHhlNlx4ZTBceGYzIgorJEVDSE8gLW5lICJceGRlXHg4Mlx4MjNceDg0XHhjZVx4ZTVceGI5XHhjOVx4ZTlceGViXHg2OVx4NzhceDJmXHhiY1x4NzZceDZkIgorJEVDSE8gLW5lICJceDU4XHg4Nlx4YzRceGE1XHg4Mlx4ZmFceGFkXHg2MVx4NzVceDYyXHgwY1x4YjZceDliXHgwMFx4ZGZceDMwIgorJEVDSE8gLW5lICJceDRhXHhkNlx4ODNceGFhXHg2MFx4OGFceDMzXHg3Y1x4ZDJceDEyXHhmNVx4NmNceDQ4XHg1Mlx4YzVceDg1IgorJEVDSE8gLW5lICJceGUyXHg2Zlx4MzdceDczXHhjN1x4YmNceGFkXHhlYVx4MjdceDI3XHhhOFx4ZWZceGY3XHhlZlx4NTlceDE3IgorJEVDSE8gLW5lICJceDY1XHhiNlx4ZTFceGQ4XHhkZFx4YjVceDkzXHg0Mlx4ZDBceDI5XHg1YVx4MThceDc2XHgwOFx4ZGJceGU1IgorJEVDSE8gLW5lICJceDM4XHhmOVx4YThceGU0XHhhMVx4YTJceGQ0XHg0MFx4YTBceGZkXHg0NVx4MThceDRiXHgzY1x4YTZceDg1IgorJEVDSE8gLW5lICJceDAyXHg5NFx4OGNceDg4XHhhOVx4NzFceDg3XHg0MFx4OTZceDRkXHgyM1x4MjZceGY0XHgxN1x4NDRceGI4IgorJEVDSE8gLW5lICJceDc4XHgxZVx4NzFceGUzXHgzYlx4ZWVceGM2XHg0Ylx4ODdceDg4XHhmZFx4MmJceGI1XHg4Ylx4MWJceDUzIgorJEVDSE8gLW5lICJceDBiXHhhYlx4ZDZceDQ3XHgyM1x4YTdceGNmXHg3OFx4M2FceDI1XHhkN1x4M2NceDc3XHhiM1x4OGVceDAwIgorJEVDSE8gLW5lICJceDM3XHg4M1x4MTFceGJiXHg2OFx4ZjVceGVkXHgwYVx4MWFceDRkXHhhM1x4OTBceDY4XHhlYVx4ZWRceDQ5IgorJEVDSE8gLW5lICJceDhkXHhiNlx4ODBceDY5XHg4M1x4NjdceGNmXHg2NVx4NWFceGVjXHhkYVx4MTJceGU2XHg1YVx4NDdceDVhIgorJEVDSE8gLW5lICJceDNjXHg2M1x4NTBceDQxXHg3M1x4NDBceDgzXHhjN1x4NjlceGJjXHg0Nlx4YTdceGIxXHhlZFx4NzlceDNjIgorJEVDSE8gLW5lICJceGZlXHhkZlx4MjdceDRiXHhiZVx4ZWJceDY4XHhlY1x4ODNceDAwXHg2Ylx4N2JceDA4XHg0YVx4NmVceDBjIgorJEVDSE8gLW5lICJceDJkXHgxNlx4YmFceDFhXHg5Nlx4YTFceDAzXHhjM1x4NjNceDllXHg3YVx4Y2VceDhiXHhlMlx4YWVceDUxIgorJEVDSE8gLW5lICJceGZiXHg3ZFx4ZWRceDVkXHhmYlx4YmNceGVkXHgwNFx4NmZceDFmXHgyMVx4ZmNceDY5XHgzY1x4YjFceGFhIgorJEVDSE8gLW5lICJceGRmXHhiZlx4YTBceGFiXHhjM1x4Y2NceDZhXHhiZlx4ZTdceDk2XHhiZVx4MzZceGIzXHgyM1x4MzJceDFjIgorJEVDSE8gLW5lICJceGI1XHgxOFx4NDRceDU0XHg1MVx4ODFceGI0XHg2M1x4YzdceDk5XHg4NFx4MDZceGNiXHhhZlx4NWJceDA1IgorJEVDSE8gLW5lICJceDRmXHg4Mlx4ZjVceDkzXHhiNFx4YzNceGNmXHhkYlx4NjVceGI4XHg4ZFx4YWVceGExXHhjMlx4ZjBceGRmIgorJEVDSE8gLW5lICJceGE3XHhlNVx4ZjNceDM3XHhkMlx4NTdceDczXHgwZFx4ODlceGI4XHgyMVx4MTBceDlhXHg0M1x4ZTlceGUwIgorJEVDSE8gLW5lICJceDA5XHgxYVx4NDBceDQ5XHhhMFx4Y2NceDAzXHgzMFx4NDZceDY2XHg2Nlx4MGNceDEyXHg0OFx4ODlceGZmIgorJEVDSE8gLW5lICJceDU3XHhlOFx4ZDJceDdjXHgzZVx4OGRceDllXHg0Nlx4N2ZceDk3XHhmY1x4M2JceDEyXHg5NVx4ZDJceGRmIgorJEVDSE8gLW5lICJceDJmXHhiMVx4YzhceDdkXHg2MVx4ZGJceGIyXHg4YVx4ZGRceGJmXHhmM1x4N2VceDA4XHhjY1x4YWRceDE2IgorJEVDSE8gLW5lICJceGJlXHg0NVx4MTNceGYyXHg3Zlx4MTRceDVhXHg3OVx4MmVceGI1XHhiYlx4NzhceDBjXHgyMlx4YzZceDEwIgorJEVDSE8gLW5lICJceDMxXHhjZVx4OWNceDZiXHgxZFx4NDhceDExXHgxNlx4NGNceGRmXHg5OFx4MTJceGYzXHg0MVx4MDVceDgxIgorJEVDSE8gLW5lICJceGQzXHgyNFx4OTRceDkyXHgzN1x4NTFceDVkXHhkY1x4NTFceDA4XHhkM1x4NzNceGJhXHg4OVx4NDJceDNmIgorJEVDSE8gLW5lICJceGNiXHg1Y1x4NGNceGIyXHgxNlx4Y2JceDA0XHhjZFx4ODZceGIyXHgwNVx4OGFceGMzXHg1Nlx4YzhceDgzIgorJEVDSE8gLW5lICJceDBiXHgyZVx4OTBceDMxXHg4Nlx4NWNceDY4XHhiOVx4OGRceGJjXHhiZlx4ZjJceGUyXHhkMlx4YjBceDBiIgorJEVDSE8gLW5lICJceDc2XHgyYlx4M2RceDc5XHhiYVx4M2ZceDliXHhlM1x4OGVceGM0XHhmNVx4ZWRceGUwXHhmN1x4ZGRceGRiIgorJEVDSE8gLW5lICJceDk3XHg1Zlx4OWFceGIzXHhmY1x4NTBceGJmXHg4OVx4ZjRceDdhXHgzOFx4YTNceDQ0XHgwY1x4NTBceDVkIgorJEVDSE8gLW5lICJceDdjXHhiYlx4NjVceDQ3XHhmMVx4MzNceGQ2XHg2N1x4YTRceGUwXHhmMFx4NjhceDU4XHhlOVx4NmNceDQwIgorJEVDSE8gLW5lICJceDAyXHg2Ylx4MDFceDIwXHg0MFx4ODRceDg5XHg4MFx4MDhceGNjXHg1Mlx4YTBceDIwXHg4MVx4OThceDE2IgorJEVDSE8gLW5lICJceGExXHg5MFx4ZjhceGNkXHhiZVx4MWVceGM3XHg2Ylx4MWRceGI1XHg4MVx4NmJceDA0XHhkYlx4NGNceDQzIgorJEVDSE8gLW5lICJceDFhXHhiY1x4ZDRceDBkXHhiNlx4MGRceGIzXHg4Mlx4YzhceGM3XHhmMFx4MTNceGE4XHhjNVx4MjBceGQ1IgorJEVDSE8gLW5lICJceGJkXHhiNFx4YzBceDVhXHhkZFx4ZThceGQxXHgzMVx4NGZceGFkXHg4OFx4NjNceDMwXHg0NFx4MGRceGQ1IgorJEVDSE8gLW5lICJceGM2XHg1Nlx4OTZceDI4XHhlMlx4ZThceGE4XHhhOVx4MTBceGRiXHgxYVx4YTNceDIxXHhhNlx4YzVceGU2IgorJEVDSE8gLW5lICJceGY1XHhiMlx4YTRceDZkXHg4ZFx4YjRceDMxXHhiNVx4YzNceGVjXHgzZVx4OGZceGQwXHhlYlx4MzVceGNlIgorJEVDSE8gLW5lICJceGRiXHgwMlx4OWNceDRlXHg5Nlx4Y2RceDQwXHgxNFx4Y2RceDk3XHhiOVx4MGFceGUzXHgwOVx4ZjVceDQ5IgorJEVDSE8gLW5lICJceGZlXHgxZVx4YzdceGM1XHg1N1x4YjlceDk2XHhlOVx4ZjVceDhhXHg1Nlx4ZGZceDYzXHhkYVx4OGFceGVhIgorJEVDSE8gLW5lICJceDQxXHg5N1x4NzRceDdiXHhhNlx4NTdceDk5XHg4ZFx4YjBceDc4XHg2MFx4ZTRceDA0XHhkN1x4ZTRceGJmIgorJEVDSE8gLW5lICJceDg5XHg3MVx4YTVceGM4XHg5M1x4NDJceDAyXHg1M1x4N2FceDZhXHg5ZFx4OTlceGM5XHhkM1x4MmJceDg3IgorJEVDSE8gLW5lICJceDc1XHhiMlx4OGZceDE5XHg4Nlx4MjhceDJiXHhjM1x4MmJceDY3XHg5NVx4NzJceGZiXHgxM1x4MzlceGI1IgorJEVDSE8gLW5lICJceGNhXHg4Y1x4NDNceDg4XHgxY1x4ZGNceDQ3XHhiNlx4ZGJceDA1XHhhZlx4OGVceDMxXHg1NFx4YjhceGJkIgorJEVDSE8gLW5lICJceDk4XHg4Ylx4MWRceDFmXHgxN1x4ODdceDlkXHg2ZFx4MDVceGNhXHhhOFx4OTBceDQ5XHgxMFx4YmJceDY3IgorJEVDSE8gLW5lICJceDJmXHg5Mlx4NjFceDQzXHhmZVx4ZTJceGQ2XHgxOFx4NmRceDJhXHhjMFx4MTRceDk2XHg5YVx4MmFceDY1IgorJEVDSE8gLW5lICJceDQ4XHgwNFx4YzdceDJkXHg3Nlx4YTZceDFmXHhjNVx4NzlceDM2XHgyOFx4NjlceDZmXHgwOVx4YjZceDkwIgorJEVDSE8gLW5lICJceGMzXHg1NVx4NmRceDk4XHhmMFx4YmRceGNlXHhiMVx4MzdceGY0XHhjNFx4OTBceDFjXHhkZlx4NWFceDI3IgorJEVDSE8gLW5lICJceGJjXHgyNFx4MzhceDUyXHg3NVx4YzBceGVlXHhjOVx4MDVceDVhXHhkN1x4MmJceDYxXHhmZFx4YmFceGZiIgorJEVDSE8gLW5lICJceGVhXHg5Zlx4NjVceDM5XHg5Zlx4ZTdceGM5XHhjM1x4MGVceGE5XHgzYVx4MjBceDUwXHg4N1x4YjZceDA4IgorJEVDSE8gLW5lICJceGM3XHg4MFx4OTJceGUyXHg2MFx4MjFceGQyXHgyZFx4NTFceDEyXHhmOFx4NDZceDYwXHhiZFx4ZjRceDY1IgorJEVDSE8gLW5lICJceGQ1XHg3Ylx4MWFceGE3XHg3OVx4YjdceDczXHg3OVx4ZTlceDBkXHg2MFx4MzRceGMzXHhiMFx4NThceGM4IgorJEVDSE8gLW5lICJceGNjXHg0Mlx4N2JceGIwXHg1Nlx4OGNceGRlXHg2Nlx4NzJceDIzXHhjMlx4NTlceGU2XHg5Zlx4ODNceDZhIgorJEVDSE8gLW5lICJceGVmXHg0YVx4OWVceDFlXHhmM1x4ZDVceGRlXHg1Mlx4MzJceDE0XHg4YVx4MmRceDBiXHhmMFx4MWVceDViIgorJEVDSE8gLW5lICJceDdjXHg0YVx4MzRceDRkXHg3Mlx4NGZceDFkXHg4Zlx4OTdceGU4XHhjOVx4Y2RceGUyXHhiOVx4MDNceDM2IgorJEVDSE8gLW5lICJceDlmXHg4OVx4OTdceGMzXHgxOVx4OGRceDhkXHg4NFx4NDFceDBjXHgwM1x4MzRceDE4XHg0MVx4MjBceDEwIgorJEVDSE8gLW5lICJceDI2XHg0Y1x4MTBceDE4XHg1MFx4NWVceGQ3XHg5M1x4MWZceDMxXHhmN1x4NTRceGIzXHg0M1x4NGRceGQ3IgorJEVDSE8gLW5lICJceDQ4XHg2OVx4Y2ZceDdkXHgyOVx4MmZceDdmXHg4Zlx4MTFceGYyXHg0Y1x4M2ZceGNkXHhlN1x4YTJceGUxIgorJEVDSE8gLW5lICJceDA5XHg5YVx4MWFceDZjXHhjNlx4ZjNceGNmXHgzM1x4ZTVceGI1XHg4Zlx4NmVceDQxXHhmMVx4ODBceDA3IgorJEVDSE8gLW5lICJceDRkXHg3Zlx4YmVceDFiXHgzN1x4ZGRceGUzXHg2NFx4YjhceGEyXHg1OVx4OTBceDJjXHhhMlx4YmVceGY0IgorJEVDSE8gLW5lICJceDgyXHgyYVx4ODBceDQ2XHg0ZFx4MWFceDhjXHg4OFx4NWFceDE4XHgzMFx4NjRceDBhXHg1YVx4NTdceDM3IgorJEVDSE8gLW5lICJceDYzXHhlOVx4NmRceDhhXHg2ZFx4NWZceDg4XHg1ZVx4NmRceDQxXHgzM1x4NjBceGZkXHg0NVx4OTBceDdlIgorJEVDSE8gLW5lICJceDE1XHhhYVx4OTVceDZmXHhiZFx4ZmNceGU5XHgwYlx4MzRceGU0XHgzYlx4YThceDQxXHg3OFx4MWNceDU1IgorJEVDSE8gLW5lICJceDYyXHg1ZFx4YjJceDE5XHhkZFx4ZWJceDY5XHhlYlx4ZWZceGUxXHhiZlx4N2JceGViXHg2Mlx4MjNceDhhIgorJEVDSE8gLW5lICJceDYxXHgxNFx4OWZceDIyXHg1M1x4MDhceDZhXHgzMVx4YmFceDMwXHgyNFx4MWVceDU0XHg4M1x4YWVceGJkIgorJEVDSE8gLW5lICJceDg3XHhhMVx4NzFceGYwXHgzY1x4N2RceDk0XHhhMVx4MmNceGVhXHhmZlx4ODRceDc2XHg3N1x4ZDJceGM5IgorJEVDSE8gLW5lICJceDlmXHgyZlx4OWNceGM3XHg4M1x4M2ZceDg5XHg1ZFx4MWJceDVjXHhjM1x4MGZceGZhXHhkMlx4OTNceDMyIgorJEVDSE8gLW5lICJceGZjXHhlZFx4YTZceDI2XHg4Nlx4OThceDFiXHgwNVx4MTBceDIwXHgyN1x4NGNceDk1XHgzZlx4NmRceDk0IgorJEVDSE8gLW5lICJceDgyXHg1YVx4YThceDY4XHg3Mlx4YWVceGQ3XHhhZVx4ZGJceGFmXHgyNlx4YjZceDVhXHg4OVx4MzBceGU3IgorJEVDSE8gLW5lICJceGQwXHg1YVx4N2NceGM2XHg2Nlx4ZmFceGMzXHg4NVx4N2RceDI2XHhlZVx4YjNceDM0XHhjMlx4YWNceDcwIgorJEVDSE8gLW5lICJceDg4XHgwM1x4MTVceGM2XHhlZVx4NTVceDQ1XHhkZVx4MWNceDEwXHgwMVx4ZTZceDNiXHgzNlx4MjZceDExIgorJEVDSE8gLW5lICJceGJlXHhlY1x4NTRceGVhXHhkOFx4MjBceDFkXHgzNVx4MDBceGQxXHg4Y1x4MDBceGU4XHhmNVx4MjFceDk3IgorJEVDSE8gLW5lICJceDI2XHgwNlx4NjlceDg3XHg1NVx4YTNceGM4XHhmNlx4NThceGNjXHg2MFx4MTJceDMwXHgwYlx4OGFceDUwIgorJEVDSE8gLW5lICJceDAxXHg1N1x4MzBceGRjXHg5YVx4MDFceGQ0XHhhNFx4Y2RceGQ2XHg2OVx4MjNceDBmXHhjM1x4YjhceDg1IgorJEVDSE8gLW5lICJceDEyXHhiYlx4OGVceGRmXHhjNVx4ZjFceGYzXHg3Y1x4YzlceDdhXHgyNFx4MjVceDA3XHg5Y1x4ODZceDk3IgorJEVDSE8gLW5lICJceDY4XHhiNVx4YWRceDBiXHhiYVx4MmVceGU4XHg2Zlx4N2ZceGExXHhlZFx4NGZceDBjXHgzNFx4N2JceGM4IgorJEVDSE8gLW5lICJceDg0XHgxMFx4MDhceDJhXHhjY1x4MTlceDU5XHhiZFx4YmNceGU0XHgzZFx4YThceGQ5XHgzNVx4YWZceDhiIgorJEVDSE8gLW5lICJceGE3XHgwYVx4YWRceDQyXHhlOFx4MDJceDkwXHhlNlx4OGVceDc2XHg1ZFx4MGZceDNiXHg4N1x4YjhceGU0IgorJEVDSE8gLW5lICJceDY1XHg0ZVx4NWZceDBkXHhlOFx4MjZceGFmXHgyYVx4OTRceDlhXHgyZVx4MjFceDlhXHgxOVx4YjlceGEwIgorJEVDSE8gLW5lICJceDhkXHgyNlx4NzhceGExXHg0Ylx4NmVceGY2XHhkN1x4MjlceDY2XHhkYlx4NDlceDA5XHhhMFx4Y2FceDRkIgorJEVDSE8gLW5lICJceDMyXHhiMFx4MzFceGY1XHg3M1x4ZTFceDY3XHhjZVx4ZTBceDVhXHg3OVx4ODRceGE0XHgyMlx4ZDRceGM5IgorJEVDSE8gLW5lICJceDQzXHg1OVx4MDhceGE4XHhkNVx4NWVceDhjXHg3Mlx4NjFceDcwXHg5YVx4YTZceDQyXHhjMFx4NDJceDIyIgorJEVDSE8gLW5lICJceDJkXHhkMFx4YmVceGIxXHg0OVx4NmVceDM2XHhiYlx4OGRceDhmXHgwM1x4OWJceGI0XHhkYlx4NWFceDc3IgorJEVDSE8gLW5lICJceDNlXHgyOVx4OTFceGM2XHg3M1x4ODhceGVmXHg4Y1x4ZjdceGRlXHhlMlx4MmJceGMyXHhjZVx4Y2RceDhjIgorJEVDSE8gLW5lICJceDkyXHg2MFx4OTZceDI5XHg4OVx4OTlceDYyXHg5OVx4ODFceDM2XHg5Ylx4NTBceGM4XHg3MFx4ZDZceDhkIgorJEVDSE8gLW5lICJceGFmXHg2Ylx4MzBceGJhXHhjN1x4N2FceGNhXHg0Y1x4NTZceDY2XHg2Nlx4MmRceGM3XHhhNVx4ZjdceDYzIgorJEVDSE8gLW5lICJceGE0XHg1NVx4OGRceGQ0XHg5Mlx4ZGJceDJiXHg2Ylx4YjFceGExXHg5Nlx4OTlceGQ5XHgyNVx4ZGJceDE0IgorJEVDSE8gLW5lICJceDFjXHg0OVx4MDRceDY3XHgyNVx4NDVceDBhXHg1MFx4MWRceDIwXHhkOFx4OGRceGNmXHhlN1x4MDNceDIwIgorJEVDSE8gLW5lICJceGYwXHhkN1x4YzBceGNjXHg4NFx4MjBceDY4XHg0YVx4NjNceDQxXHhhNFx4NmNceDMyXHgwOFx4YTJceDM3IgorJEVDSE8gLW5lICJceDAzXHg2Ylx4NDJceDEyXHhiZVx4YTlceDRlXHg5Ylx4OTdceDE2XHg5Mlx4NDhceDU2XHgzMlx4YWVceDJjIgorJEVDSE8gLW5lICJceDEwXHhjNlx4MzFceDE0XHg4Y1x4Y2NceGQ2XHgyM1x4MDlceGY0XHg2NFx4MTVceDllXHhmMVx4MzVceDc1IgorJEVDSE8gLW5lICJceDk4XHgzYVx4MGNceDEyXHgyOVx4YWFceGI3XHgyYlx4ODJceGUwXHhmOVx4Y2RceDA1XHhlZFx4YjhceGJlIgorJEVDSE8gLW5lICJceGI2XHhmNVx4NmZceGNjXHg0MVx4YmNceDNhXHg4MVx4MzlceDNiXHgwM1x4ZThceGIyXHhhYlx4YjZceGFhIgorJEVDSE8gLW5lICJceGVkXHhhOFx4NThceGRmXHhjYVx4MDZceGJhXHg2NFx4N2JceGM0XHhlZlx4ZWNceDIzXHgzOFx4NzdceGVjIgorJEVDSE8gLW5lICJceGNmXHhkN1x4ZDJceGViXHg3NVx4M2RceDI2XHhlMlx4ZmFceDY2XHg0OVx4MGJceDRhXHhkY1x4ZTNceDQ4IgorJEVDSE8gLW5lICJceDY0XHgzM1x4YzRceGIzXHg5M1x4ZGFceGRkXHgzY1x4MDhceDgzXHg3ZFx4OTFceDc4XHhlNVx4NjFceDU3IgorJEVDSE8gLW5lICJceDY3XHgzN1x4NzNceGUxXHgwNVx4YmJceDk2XHgzZVx4MjZceGM3XHg2Y1x4NDRceGI1XHhmYlx4ODBceGIyIgorJEVDSE8gLW5lICJceGQ5XHhhMFx4OTlceDZiXHhiZlx4NzRceDYyXHhiN1x4ZjdceDE0XHhlY1x4MDdceDEyXHhmY1x4ZTZceDFiIgorJEVDSE8gLW5lICJceGYxXHgxZFx4MjRceGZlXHhkMFx4YjlceDYxXHg3Nlx4NTZceGEwXHhhNVx4OGNceDYzXHhjZVx4OTZceDVkIgorJEVDSE8gLW5lICJceDY1XHg0Zlx4YWVceGNjXHg3ZFx4ODZceDJkXHhkN1x4NzRceDk2XHg2N1x4YjdceDVjXHg5NFx4YTZceDMwIgorJEVDSE8gLW5lICJceGJkXHhiM1x4ODRceDU2XHg5M1x4MWVceDQ0XHhjNVx4NDNceDVmXHg2NVx4OWRceDFhXHg5Mlx4YjFceDlhIgorJEVDSE8gLW5lICJceDRjXHg0Nlx4MWZceGQyXHg2NFx4NTRceGI2XHg0ZVx4N2VceGIyXHg3MVx4NzVceGY2XHhjZVx4YWNceGRjIgorJEVDSE8gLW5lICJceDVhXHhhMVx4ZDRceGYxXHhmNVx4NzFceDZhXHg5M1x4NTBceGQyXHg4Ylx4YjJceGIxXHg3Zlx4YWZceDIwIgorJEVDSE8gLW5lICJceGQyXHhjOVx4Y2VceGViXHhmYlx4MWRceDRhXHhmZlx4MjZceDg5XHhhMlx4NjBceGVkXHg4YVx4ZWJceGE3IgorJEVDSE8gLW5lICJceDZlXHg5Mlx4ZWFceGI3XHhlZlx4N2FceGNjXHhkOVx4NGJceGJiXHgzZVx4YWRceGM2XHg3YVx4ZmFceGJiIgorJEVDSE8gLW5lICJceGUwXHgyNVx4MGNceDBmXHhlMlx4MTRceGY5XHgyZVx4MGJceDVmXHhkNFx4YmRceDhmXHg1YVx4YWVceGI2IgorJEVDSE8gLW5lICJceGNhXHhjMVx4NWFceDg5XHg0Y1x4NzRceDM2XHhkM1x4MzJceGFiXHg4N1x4YTdceDdkXHg1N1x4N2ZceDQ1IgorJEVDSE8gLW5lICJceDFhXHgxZFx4NDVceGNjXHhjOFx4ZjFceDM2XHg4Y1x4NGRceDZlXHhjOVx4MDFceGI4XHg3YVx4OTlceGRjIgorJEVDSE8gLW5lICJceDRkXHg5YVx4YTFceGMzXHg3YVx4ODFceGFjXHhhOVx4NDBceDIwXHhjMVx4MThceGM3XHgxZVx4MGRceGViIgorJEVDSE8gLW5lICJceGY3XHg1M1x4OWJceGNiXHhlMlx4NjRceDRlXHgxN1x4MWNceDZhXHhkN1x4NzRceDZiXHhlNFx4NGJceGU3IgorJEVDSE8gLW5lICJceDVmXHgwNlx4MzFceGFjXHhlN1x4NWNceDY0XHg5M1x4MDVceDY5XHgxM1x4MWFceDM0XHg1Mlx4M2VceDFhIgorJEVDSE8gLW5lICJceGM4XHhmNlx4ZWRceGRlXHg1ZVx4NzlceGY0XHhlMlx4MDRceGMzXHhiNlx4YjNceDQ5XHhkY1x4N2FceGUzIgorJEVDSE8gLW5lICJceDUyXHgxMlx4MWJceDMyXHhkOVx4ZTJceDVjXHg5NVx4NWZceDY5XHgwMVx4ZGVceDc3XHgxNlx4MzRceGY3IgorJEVDSE8gLW5lICJceGRhXHg0M1x4MmNceDU2XHg3N1x4MjFceGNjXHg4Nlx4YzRceDRhXHgxNFx4YjhceDI5XHgyOFx4MGFceGYxIgorJEVDSE8gLW5lICJceDc5XHg4YVx4OWVceDk0XHg4Nlx4NmNceDZhXHg2Y1x4MGZceDE1XHhlNlx4YjRceDU3XHg5Mlx4ZmNceDFmIgorJEVDSE8gLW5lICJceDZkXHg5OFx4YmZceDJmXHgwYlx4OTdceGIzXHg0Ylx4ZWNceGU2XHhkM1x4ZjdceDk0XHhlNFx4MmNceGYzIgorJEVDSE8gLW5lICJceDIwXHhmYVx4NDJceDY5XHhkOVx4YjZceGIyXHg5Nlx4MzFceDA5XHg2Ylx4Y2JceGQyXHg5Mlx4MTRceDQwIgorJEVDSE8gLW5lICJceDY5XHg3NVx4OWFceDgzXHg0OVx4NDRceGVkXHhlMFx4ZGRceGEzXHgzZFx4MDlceGUwXHhlNFx4Y2ZceDRmIgorJEVDSE8gLW5lICJceDNiXHgxMlx4ODRceGI2XHg0N1x4MmJceDFiXHg3ZVx4YzJceGFjXHg4ZFx4ZjZceDFjXHg3NFx4MjZceGIwIgorJEVDSE8gLW5lICJceDJhXHgyN1x4ZjZceDAzXHhlM1x4ZjlceGUzXHhiYlx4NGFceDFhXHg2Zlx4YTJceGY0XHgxMFx4YjBceGU1IgorJEVDSE8gLW5lICJceDcwXHg5YVx4OWJceGRmXHhhY1x4NDJceDZhXHhkY1x4ODBceGMzXHg4MFx4MGNceDg0XHgyNlx4ZjBceDIzIgorJEVDSE8gLW5lICJceGQ2XHg1Ylx4Y2JceDhiXHgzYlx4ZTFceDY1XHhmZVx4YmFceGFkXHg4NVx4ZTlceDFkXHg4OFx4YTRceGY4IgorJEVDSE8gLW5lICJceDA1XHhiOFx4NThceDBiXHhiMVx4MTNceGE4XHhkOFx4ZWFceGZkXHgwN1x4NjhceGVlXHg2Ylx4NWNceDg4IgorJEVDSE8gLW5lICJceDE3XHg0OVx4ODlceDBlXHhhNVx4N2FceGU2XHhhMFx4OWNceDNhXHgwNlx4MmRceDcxXHg4NFx4MmNceGQyIgorJEVDSE8gLW5lICJceDFiXHgwN1x4ZmRceDQzXHg5Ylx4NDhceDliXHhhZVx4NjBceDU0XHg1ZFx4ZDNceDJiXHhmMVx4YzBceDBkIgorJEVDSE8gLW5lICJceDQ5XHgwMVx4NjRceDM0XHgzNlx4NzdceDJmXHgwZVx4ZTdceDcyXHgzNVx4NDhceDJmXHgwNVx4YWFceGQ1IgorJEVDSE8gLW5lICJceGI0XHg5OFx4NzdceGEzXHgxOVx4YTJceGY0XHhiOFx4MTFceGE3XHhhNlx4MjRceDkxXHhhY1x4MWVceDA5IgorJEVDSE8gLW5lICJceDM4XHgwNFx4YzZceGZmXHgwYlx4N2RceDM2XHhjMlx4Y2JceGI4XHg5Y1x4N2VceDdiXHg0OVx4OGNceDRlIgorJEVDSE8gLW5lICJceGJiXHgzN1x4MTlceDE4XHg4M1x4YzVceDIzXHgwM1x4NmNceGNiXHg1MVx4MjRceGU1XHg0Mlx4ODVceGM3IgorJEVDSE8gLW5lICJceDczXHgxM1x4MmNceGM4XHgyMlx4MjhceDUwXHg4M1x4YmNceDNhXHg4ZVx4NjBceGFjXHhiMVx4ZGFceDE4IgorJEVDSE8gLW5lICJceDI0XHg2ZFx4NjRceGQwXHhhOVx4NjVceGNkXHhkNlx4NWFceGE3XHhhYVx4YzZceGVkXHgzMlx4NzZceDdiIgorJEVDSE8gLW5lICJceDA3XHg5MFx4YjRceDdiXHg1ZFx4MTZceDg4XHg5Ylx4ZDdceDVlXHgwYVx4YjdceGJmXHhiZlx4YzRceDVkIgorJEVDSE8gLW5lICJceDFjXHhiZFx4MzlceGYzXHgxN1x4YWVceDUwXHhhYVx4YzdceGE0XHhlOVx4YWRceGE1XHhhY1x4MDRceGQ5IgorJEVDSE8gLW5lICJceGE0XHgyN1x4NWZceDc5XHg3NVx4MjlceDEwXHg2OVx4NzVceGU5XHgwNlx4NTNceDdjXHg2Nlx4OGJceDgzIgorJEVDSE8gLW5lICJceGY3XHg3Y1x4ZmRceGNkXHgxNlx4YzNceDhjXHg4ZVx4NTFceDZmXHhjYlx4NjhceDBhXHg5Y1x4MzlceDM5IgorJEVDSE8gLW5lICJceGI5XHgwYlx4NmFceDE2XHhjNVx4NGFceDIyXHhjMFx4MzFceDA5XHgyMlx4MjhceGEwXHg2NVx4NjlceDA1IgorJEVDSE8gLW5lICJceDMwXHg5MFx4YzFceDE4XHgyMlx4MDVceDllXHhhZFx4YTlceGMzXHg1NFx4M2VceDI3XHhhOVx4YzRceDQxIgorJEVDSE8gLW5lICJceDJjXHgzOVx4MDNceGQyXHg4ZVx4M2ZceDkxXHg5YVx4NGNceGM4XHg2OFx4MTRceGU0XHgxY1x4YTZceDVmIgorJEVDSE8gLW5lICJceDBiXHg1N1x4MjdceDA5XHg4YVx4N2RceGZmXHg0N1x4NjNceGE3XHg1YVx4MjlceDgyXHhhMFx4M2FceDI4IgorJEVDSE8gLW5lICJceDMwXHg5YVx4MmJceGYzXHg2OVx4NjNceDE4XHhjZFx4ZTJceDMyXHg2Nlx4M2NceGQ3XHg3OVx4ZGRceDEyIgorJEVDSE8gLW5lICJceDg2XHgzNFx4YzZceDllXHg3NVx4MDVceDg3XHgzOVx4MjNceDcyXHg5N1x4NzFceDI3XHg2NFx4Y2RceGQ5IgorJEVDSE8gLW5lICJceGE2XHgyZVx4NjFceGQyXHgzN1x4ZTRceGFlXHhjNlx4YzlceDgxXHhjMFx4MmVceDlmXHhjNlx4ZjlceDdmIgorJEVDSE8gLW5lICJceGQ5XHg1ZVx4ZDBceGE5XHgwOVx4OTdceDM1XHhhMlx4ZTNceDRmXHhlOVx4MTlceDdjXHhhNVx4YzdceDRkIgorJEVDSE8gLW5lICJceDJkXHg5Mlx4ZWNceGQ2XHhlZlx4ZGFceDU1XHhmM1x4YTJceDk1XHgxN1x4MWJceGNlXHhiZVx4NmJceDc0IgorJEVDSE8gLW5lICJceDcwXHhlZVx4ZGJceGE4XHg0Mlx4MjZceGIxXHhjY1x4YzFceDMxXHgwYVx4NjdceDkyXHgxM1x4OWRceDljIgorJEVDSE8gLW5lICJceDEyXHgxOFx4YTRceDA4XHg0ZFx4NGRceGZjXHg3Y1x4ZWJceDU5XHg2Ylx4MjJceDAzXHhhYVx4OTdceGMzIgorJEVDSE8gLW5lICJceDI3XHhhNVx4MjFceDM1XHg2OFx4ZDJceDU3XHg1NFx4Y2FceDU4XHgzOFx4ODJceGM1XHgwNVx4YTBceDcxIgorJEVDSE8gLW5lICJceDAxXHgxYlx4Y2VceDU3XHgxZVx4MjBceGJmXHg4OVx4OTZceDJhXHgzMVx4OGVceDZlXHhhZlx4N2ZceDM1IgorJEVDSE8gLW5lICJceDA4XHgxMFx4ZDlceDBlXHg4YVx4NzhceGIwXHg0OFx4OThceGE0XHg2NFx4MTRceGEyXHhjZlx4MjNceDJkIgorJEVDSE8gLW5lICJceDBhXHg3Ylx4ODRceGU1XHhmZFx4MjlceDQ5XHgxNVx4M2RceDc1XHgzOVx4ZmRceGFhXHhkNlx4YTRceGI5IgorJEVDSE8gLW5lICJceDA1XHgxMlx4NTdceDMxXHgwNFx4ZGNceDI2XHgzNFx4MTZceDNmXHhhN1x4MDNceDMyXHgxZFx4NGJceDFkIgorJEVDSE8gLW5lICJceDc4XHhkY1x4OWJceDc5XHg5Nlx4OWFceDg3XHg2ZVx4YjRceDgwXHhhYVx4MDFceDE5XHgzM1x4OTJceGIwIgorJEVDSE8gLW5lICJceDE2XHhjOVx4OTRceDljXHhlN1x4YTVceDYzXHhlNlx4MThceDEzXHhiMlx4MzRceGJkXHg5OFx4NDFceGQ2IgorJEVDSE8gLW5lICJceGE0XHhjOFx4YjlceDZlXHgwNlx4OWNceDcyXHhmOFx4NDlceGFiXHhkNVx4NDdceDllXHhhMVx4ZTZceGRlIgorJEVDSE8gLW5lICJceDYyXHhkMFx4ZWNceGFmXHhiZlx4MWJceDhhXHhhZlx4NjNceGEwXHgyOVx4YmVceDNkXHg4N1x4YTBceDIyIgorJEVDSE8gLW5lICJceGNlXHg0Nlx4NGVceDE4XHgzMFx4N2JceDNjXHgzZFx4ODZceGUxXHg5ZVx4YjZceDU5XHhlZlx4MWNceDQzIgorJEVDSE8gLW5lICJceDY1XHhkMFx4M2RceDUzXHhkMFx4NDFceDIwXHg0MFx4YjdceDJiXHhiMVx4ZGRceDUyXHgyY1x4ZGRceDY4IgorJEVDSE8gLW5lICJceDQ0XHhjMVx4YmVceDQwXHg3Mlx4NjFceGQ3XHgyNVx4NWRceGY1XHg2OVx4Y2VceDNhXHgzYlx4MmVceDliIgorJEVDSE8gLW5lICJceDEzXHgxOVx4NzlceDFhXHhmMFx4ZWVceGIwXHhlN1x4MTdceDQ0XHg0NVx4ZThceDJkXHg1OVx4NTBceGJjIgorJEVDSE8gLW5lICJceDQwXHg2N1x4NjZceDEyXHgyMFx4Y2NceDQzXHg4YVx4OWNceDFkXHhkZVx4YWNceDJkXHgwMFx4NzZceGIyIgorJEVDSE8gLW5lICJceDk4XHg4YVx4YTlceGRlXHgxY1x4YjZceDhiXHgzMlx4MTlceDY3XHgxY1x4NjdceDk1XHg0MVx4NDBceDYwIgorJEVDSE8gLW5lICJceGYzXHgxM1x4NDRceGI4XHhjNVx4MThceGE3XHhjYVx4ZGRceDhjXHg1YVx4OGZceDcyXHg2OVx4ZjFceDMxIgorJEVDSE8gLW5lICJceGE5XHhkMlx4ZWJceGFjXHgzZVx4MmZceGRjXHhjN1x4ZTBceDAwXHg3OFx4NWRceDcyXHhmZlx4MDFceDk1IgorJEVDSE8gLW5lICJceDg2XHg0YVx4OTBceDJiXHhmOFx4MTBceGM1XHhjMlx4ZDFceDlkXHg3YVx4YzNceDY1XHhiMVx4ZmRceDJkIgorJEVDSE8gLW5lICJceDA5XHgwYlx4Y2RceGRmXHgwM1x4ODBceDNlXHg0NFx4ODFceDY1XHg0OVx4NGZceDUwXHg3ZVx4MWZceDc1IgorJEVDSE8gLW5lICJceDk3XHhjNlx4MDVceGRhXHg1YVx4ZTlceGY2XHhlZVx4ZTVceDY2XHhjY1x4NWVceDE3XHhlMlx4OGNceGIyIgorJEVDSE8gLW5lICJceDA2XHg1Ylx4ZGRceDQxXHgwZFx4MjZceGNjXHg4N1x4MGRceDM3XHgyZVx4MmRceDM1XHhlMFx4NWRceDkzIgorJEVDSE8gLW5lICJceGM1XHhkZlx4MmRceGI0XHhhMlx4YjFceDFiXHgwZVx4OWJceGU2XHg3Nlx4YjRceDI4XHg2OVx4NWNceGU5IgorJEVDSE8gLW5lICJceDRlXHgyN1x4NmZceDUyXHhjYlx4NGRceGIzXHhjOFx4YWFceGVhXHhkM1x4MWFceDU3XHgwMFx4ZGZceDIwIgorJEVDSE8gLW5lICJceDJkXHg0Mlx4ZWFceDZhXHgxOFx4MGFceGFjXHhhZVx4OWFceDMyXHgwOFx4MjNceDk5XHhiN1x4ZDhceGU1IgorJEVDSE8gLW5lICJceDc1XHgzYVx4NjVceDhiXHgyZlx4YWFceDRmXHg3Ylx4NjhceGQ1XHg2Nlx4NzZceGY0XHhlY1x4M2RceGRiIgorJEVDSE8gLW5lICJceGU5XHgzN1x4ZGJceDY5XHg0MFx4NmRceDM1XHg0Zlx4NzdceGZhXHg4Zlx4MDdceDYwXHhhY1x4OGVceDNiIgorJEVDSE8gLW5lICJceDg5XHg0Nlx4M2NceDE2XHhkNFx4NGJceDZlXHg3MVx4NGZceDAwXHgxMFx4MjJceDE0XHgxMlx4Y2FceDcyIgorJEVDSE8gLW5lICJceGUwXHg2Y1x4NTRceDJmXHgwZVx4MzJceDhjXHhiYVx4NTNceGFkXHg1MVx4NDhceGFmXHhlZVx4YjJceGNhIgorJEVDSE8gLW5lICJceDkzXHg0YVx4NDZceDI0XHgxZlx4MDlceDgzXHg2OVx4MWNceDNmXHg3Mlx4NTBceDcwXHhmZlx4MTBceDc0IgorJEVDSE8gLW5lICJceDIxXHhlZlx4NGFceDA4XHgzOFx4MjVceDRjXHg1NFx4YjZceDM0XHg4M1x4NjRceDk5XHgyMlx4MGZceDAyIgorJEVDSE8gLW5lICJceDQ5XHg1OFx4NTBceDc0XHhhM1x4YmVceGMyXHgxN1x4MDVceGE3XHg2MFx4NTVceGM0XHgyMVx4NTJceDBjIgorJEVDSE8gLW5lICJceDU3XHhlZVx4MGZceDY0XHg2YVx4YTlceDczXHgyNVx4YTFceDJhXHg5NFx4MWRceDAwXHhjYVx4NjVceGM0IgorJEVDSE8gLW5lICJceDM5XHhmY1x4NTNceGE4XHhlN1x4NGNceDA3XHg0NFx4NWZceDI5XHgxOVx4OThceDA4XHgxNlx4NTNceDFhIgorJEVDSE8gLW5lICJceGJhXHhlZVx4OGVceDJlXHgxNlx4OTdceDY2XHg1Ylx4N2NceGI1XHg2M1x4MmRceDMxXHgxOFx4ZGJceDY0IgorJEVDSE8gLW5lICJceGM1XHg2OVx4MTVceGE5XHhlOFx4MjNceDVmXHg5Mlx4ZGJceDc1XHg2MFx4OTBceDZhXHhiZlx4YjVceGJhIgorJEVDSE8gLW5lICJceGU1XHhhNVx4NzBceGNlXHgyNlx4ZDBceGMxXHg2M1x4Y2JceDBlXHgyMVx4NjdceDFlXHg4ZVx4MjBceDMyIgorJEVDSE8gLW5lICJceGExXHgyZFx4NTFceGZjXHgzMlx4YTBceGM5XHhkMFx4MzJceDkxXHg5YVx4ZGFceDQ1XHg3M1x4MmVceDk3IgorJEVDSE8gLW5lICJceDA5XHgxN1x4MGNceGVhXHhlNFx4ODlceDk0XHhlOFx4YWRceDY0XHhkNlx4NzhceDAyXHgwN1x4NzlceDA2IgorJEVDSE8gLW5lICJceGE0XHgwMVx4Y2VceGQwXHhjY1x4MzNceDIwXHg4ZFx4YzlceDJkXHg2N1x4ZGZceDg1XHgwNlx4YjVceDIxIgorJEVDSE8gLW5lICJceDc0XHg2MVx4NDlceDk5XHg5OFx4ZWNceDI4XHgwNlx4YzRceGJkXHgyNVx4YjVceDYyXHgyZFx4YjBceGJhIgorJEVDSE8gLW5lICJceDVmXHg0Y1x4YzRceDMzXHg4NVx4NDJceDU4XHgxMVx4ZDRceGZmXHgyN1x4MjFceDNjXHg1N1x4OWVceGQ5IgorJEVDSE8gLW5lICJceGM0XHhiMVx4NmRceDhkXHg0YVx4OGNceDhhXHg4MFx4NmNceDFlXHgxNlx4NWZceGMxXHhjNFx4NjhceDRhIgorJEVDSE8gLW5lICJceGNhXHgyMFx4YjFceDQwXHgxMFx4MWJceDFiXHg2Y1x4ZjdceDgyXHhmOFx4ZDRceDM1XHgyOVx4MTBceDc2IgorJEVDSE8gLW5lICJceDdkXHgzYVx4NGRceDRkXHg0OVx4OWJceDYyXHg2NVx4NjZceGQ0XHhkYVx4ODFceDI0XHhjYVx4NGFceDQ4IgorJEVDSE8gLW5lICJceDQ4XHgyZlx4ODNceDQ4XHhkMVx4MDlceGRmXHgyZlx4MTdceDhiXHhjNVx4MzdceDg5XHg5NFx4MTVceGIxIgorJEVDSE8gLW5lICJceDM2XHg1OFx4Y2RceDgwXHhiNFx4MTlceGM1XHhjNlx4ZGFceGRhXHgxNlx4OTVceDgyXHgxNFx4YzVceDE5IgorJEVDSE8gLW5lICJceDYxXHg2ZVx4YjVceGNjXHgyN1x4YjVceGYzXHhkYlx4ZWZceDZlXHg0NFx4MzdceGJmXHhkY1x4MTFceGY5IgorJEVDSE8gLW5lICJceGEwXHhmMlx4NzhceDMwXHg4NVx4YzBceGMwXHgwN1x4NjdceDAyXHg2Nlx4NTZceDdjXHg3Nlx4ZWVceDdhIgorJEVDSE8gLW5lICJceDk3XHg2ZVx4MDJceDVlXHgwOFx4YzBceDM1XHgwMlx4NGFceDg3XHgzOVx4NGNceGQ2XHhjNFx4ZTBceDk5IgorJEVDSE8gLW5lICJceGNkXHhkOVx4ZGFceDJjXHg0OVx4MThceDVjXHgyMlx4YjZceDUxXHg0Ylx4YTBceDU4XHg4Ylx4N2FceDU1IgorJEVDSE8gLW5lICJceDYxXHhkY1x4YTVceDIxXHg4M1x4MWRceDQ3XHg5Y1x4MGJceGY0XHg3NFx4YmFceDA4XHg4NVx4ZTRceGM4IgorJEVDSE8gLW5lICJceDgwXHhiZVx4ODBceDQ2XHhmY1x4NDZceDg1XHg2MFx4NjRceGE2XHhjNFx4YzFceGFlXHg2OVx4NjdceDBiIgorJEVDSE8gLW5lICJceDhlXHhhY1x4YTJceGMwXHhmNFx4NmJceDZmXHg3YVx4OWVceDAwXHhkZFx4NGRceDU5XHg1N1x4NGFceDc4IgorJEVDSE8gLW5lICJceDA4XHg2NFx4MDhceDg0XHg4MFx4NTBceDM0XHhiMVx4M2JceGM3XHg3MVx4M2ZceDNlXHgxY1x4MWRceDRlIgorJEVDSE8gLW5lICJceDRlXHhhOVx4YjBceDMyXHgwMlx4MTBceDhlXHg4OFx4NzFceGVkXHg4N1x4MmNceDMyXHg0ZFx4NTdceDA1IgorJEVDSE8gLW5lICJceGYxXHhiYVx4YTBceGY5XHg2MVx4MzBceDRiXHgxOFx4NjVceDZlXHgzOFx4ZjlceDQxXHhkZFx4ZjFceDQ4IgorJEVDSE8gLW5lICJceDYzXHgzOFx4NTBceDEwXHhjMVx4YWNceDFiXHhmMlx4NWJceGFhXHgxNVx4ZjRceDg5XHgwZVx4ZTlceDc3IgorJEVDSE8gLW5lICJceDgwXHg1Nlx4NTBceDE4XHg4MVx4NzFceGQ4XHhkYlx4MGRceDZhXHhjZVx4ZDJceGI2XHg3Nlx4YmRceDM1IgorJEVDSE8gLW5lICJceGYwXHg5Nlx4ZTFceDA2XHg4Ylx4MDlceGFiXHg4M1x4MjFceDEwXHgxMFx4MzBceDY4XHgzMFx4YWRceGUwIgorJEVDSE8gLW5lICJceGMyXHg2Mlx4YTJceDk5XHgwYlx4OTJceDE3XHgxOVx4YWJceGUzXHg3YVx4ZDFceDkwXHhhZVx4NWNceDJiIgorJEVDSE8gLW5lICJceDZlXHhiZVx4MzFceGVjXHg3Mlx4NzhceDAzXHg3YVx4ODVceDcwXHhlMFx4NjdceDM2XHhlMFx4ZGJceDYzIgorJEVDSE8gLW5lICJceDZlXHhlZFx4MjZceDk0XHhjY1x4OWJceDRlXHhhOFx4MjNceDU3XHg1Nlx4ZTFceDQ5XHg2MVx4MzFceDVlIgorJEVDSE8gLW5lICJceGM4XHgyYlx4ODFceDA1XHgyM1x4MThceGRiXHg2OFx4MzRceDBiXHg2Y1x4ZjFceGZjXHhjN1x4ZGRceGRmIgorJEVDSE8gLW5lICJceDFhXHgzOVx4ZjhceGY2XHg3Mlx4YjlceDRkXHhjOVx4ODBceGJmXHgyM1x4OTNceDI0XHg3Nlx4ZGRceDZkIgorJEVDSE8gLW5lICJceDBhXHg4Zlx4MThceGUxXHg4MVx4OGZceDQ4XHg3Ylx4NDhceDJlXHhkMFx4YjVceGQwXHhjYlx4YTFceDQ2IgorJEVDSE8gLW5lICJceGFlXHgxY1x4MjZceDAyXHhkMlx4ZTBceGY0XHg1Nlx4OGNceDhhXHgwMVx4OTdceDRlXHg1Zlx4ZDFceGRlIgorJEVDSE8gLW5lICJceDlhXHgxMFx4MzFceDBkXHg0Y1x4YmNceDQwXHgwNlx4YzVceDA0XHg5Mlx4OTFceDg4XHg4MVx4NThceDVkIgorJEVDSE8gLW5lICJceDU1XHgxM1x4YWJceDRmXHhhYVx4YmRceGVlXHhhMFx4NmFceDgwXHhiMlx4ODNceGQwXHg0Nlx4MzFceGEwIgorJEVDSE8gLW5lICJceGJjXHgyY1x4ZjlceDBkXHhhZFx4ZTJceDYyXHhiMFx4YWNceGE0XHg5MVx4ODRceGI4XHgzMVx4OTlceGI5IgorJEVDSE8gLW5lICJceDQ1XHhiM1x4NDdceDFlXHhjMlx4OTZceGM5XHg5ZFx4Y2NceGQzXHhjY1x4NzFceGM0XHhmM1x4OWFceDkyIgorJEVDSE8gLW5lICJceDJiXHhhY1x4YzNceDhjXHhlMVx4ZGNceDQwXHg2Nlx4NjRceGU4XHgyNFx4MzVceDUwXHgyNlx4NjhceDBiIgorJEVDSE8gLW5lICJceDc5XHg5Nlx4ODFceGI2XHgzNlx4YzdceGE0XHg4Mlx4MGRceDMyXHg2NVx4YzNceDRjXHg2MVx4NDlceDMyIgorJEVDSE8gLW5lICJceDA5XHgxNFx4MjJceGFjXHgzN1x4NjlceDM0XHhiNFx4NmNceGRkXHhiY1x4OTVceDU0XHg2Ylx4NTlceDUzIgorJEVDSE8gLW5lICJceGM2XHg1MFx4MzJceDA5XHg5OVx4MTRceDhjXHgxOFx4NzRceGNjXHgwNVx4ODZceDdhXHgwNlx4NDhceDUwIgorJEVDSE8gLW5lICJceDZlXHhlMFx4YWFceDQxXHhiYlx4YjBceGJjXHgxOVx4YWFceDJjXHgxMlx4OWNceGNkXHhhNVx4MWNceDZkIgorJEVDSE8gLW5lICJceDE5XHgwYVx4NjJceDAyXHhmZVx4ZDNceDRhXHhjY1x4N2NceDZhXHhhNVx4NzJceDA2XHgzNVx4ZmJceDhkIgorJEVDSE8gLW5lICJceGY5XHhhYlx4MWVceDBiXHgyOVx4NzNceDcwXHhiNVx4ZThceGY2XHg1NFx4YjZceDRjXHhjOFx4ZWFceDMwIgorJEVDSE8gLW5lICJceDhjXHhhZlx4ZDBceGQzXHhiMFx4MjBceDU5XHg4MFx4NjFceDQwXHhjOFx4MTlceDk5XHg2ZFx4OTdceGIzIgorJEVDSE8gLW5lICJceGNhXHg2Nlx4MWVceDE2XHgzZFx4YTdceDc0XHhhNlx4NThceGYwXHhkNFx4MDBceDY3XHhkY1x4YmJceDhhIgorJEVDSE8gLW5lICJceDRhXHg3Ylx4NzVceGE0XHg2ZVx4ODlceGM0XHg0NFx4NDRceDNkXHg3Mlx4YjRceDUyXHg4YVx4YzBceGMyIgorJEVDSE8gLW5lICJceDExXHg0MFx4MjJceDlhXHgxNFx4MDlceDY2XHhjMlx4MDNceGNjXHgwNFx4ODZceDAyXHgwM1x4YTZceDhhIgorJEVDSE8gLW5lICJceGFiXHg2MFx4ZTBceGU4XHhkY1x4MmJceDVkXHgwZFx4NzNceGI1XHg4Zlx4NzRceGM2XHhjZVx4ZGJceGI1IgorJEVDSE8gLW5lICJceGE4XHhlN1x4OTVceDNmXHg4Ylx4YWZceGI5XHg4N1x4YmNceDYzXHhhYlx4ODRceGVhXHg5M1x4MWVceDlkIgorJEVDSE8gLW5lICJceGI0XHhlMFx4ODNceGM4XHg0YVx4YzlceGM3XHhiOVx4YzdceGYyXHhjNlx4MjVceDEwXHg1OFx4YzBceDIxIgorJEVDSE8gLW5lICJceDY0XHhhMVx4MDhceGQzXHgxMFx4MmZceDk0XHg0MFx4NWFceDU2XHgxN1x4YTFceDBmXHhhNlx4ZmJceGRhIgorJEVDSE8gLW5lICJceGQzXHgxMlx4NDJceDMxXHg3MVx4MDlceGE1XHgyZVx4OGJceGQxXHg2OVx4NWNceDk5XHg1Ylx4MDlceDUyIgorJEVDSE8gLW5lICJceGM2XHg5Ylx4NWFceDE4XHgwY1x4MDZceDQ3XHg0Mlx4OGFceGMzXHhhZFx4ZWZceDlhXHhlOVx4OWRceGY2IgorJEVDSE8gLW5lICJceDJiXHg4MVx4NzJceDQ4XHgwNVx4MjBceDE2XHgxMFx4YTNceGMzXHhjNVx4ZDJceDcxXHgwZVx4Y2FceDA0IgorJEVDSE8gLW5lICJceDE3XHhlZlx4ZGZceDM5XHg2NFx4MjZceDRjXHg5Zlx4MjJceGI0XHgxM1x4MWNceDNkXHhlN1x4NTVceDQwIgorJEVDSE8gLW5lICJceDJlXHhkMVx4OTFceDI4XHhjOFx4MWNceDY4XHg2OVx4NjVceDk3XHgxM1x4NzVceGZlXHg1Ylx4NWNceGIxIgorJEVDSE8gLW5lICJceDliXHg1YVx4ZjdceGQyXHgwMlx4YjJceDBiXHg0MVx4MzZceDY3XHhlN1x4YTlceDEwXHg4MFx4ZDBceDVjIgorJEVDSE8gLW5lICJceDY0XHgwOFx4NjdceGRhXHg1Nlx4MzZceDUzXHg0YVx4YThceGNhXHgxNlx4ODhceGM1XHg3OVx4ZGRceDNlIgorJEVDSE8gLW5lICJceDg3XHg3MVx4MTNceDM5XHhhZVx4ZmRceDJhXHg5M1x4NmVceGJiXHg5Nlx4MDJceDM5XHhlYVx4ZGFceDVhIgorJEVDSE8gLW5lICJceDg3XHhiOFx4ZmFceDU0XHgyY1x4NDlceGEzXHhhMFx4YmJceGE1XHhjNFx4MTBceDVjXHhkMlx4MTBceDEwIgorJEVDSE8gLW5lICJceDBjXHg4OFx4YjJceGQ0XHhmNFx4NjdceDZhXHg5M1x4NWJceGJiXHgyMFx4MDZceGRjXHg3NVx4N2ZceDNhIgorJEVDSE8gLW5lICJceDliXHhhM1x4YjBceDc2XHg5OFx4ZDlceDc3XHgzMlx4OTdceGE1XHhkY1x4NjRceGE0XHg3Ylx4YTVceGFlIgorJEVDSE8gLW5lICJceGFhXHgxNVx4MmRceDU5XHgwY1x4YzFceDdhXHg0MFx4ZDJceGMyXHhiYlx4NDVceDEwXHhlMVx4OWFceDQ2IgorJEVDSE8gLW5lICJceDUyXHg5MVx4ZTRceDI0XHgyMVx4OWNceDQ2XHhlZVx4MDVceDU3XHg0NFx4NWVceDQxXHhhZFx4NWFceDA4IgorJEVDSE8gLW5lICJceDQ2XHgwYlx4YTBceGRmXHhiNFx4NTlceDdhXHhlNFx4NDFceGEzXHgwYVx4NTlceDVlXHgyYlx4MTdceDIwIgorJEVDSE8gLW5lICJceDE5XHgwMlx4NmNceGU2XHhlMlx4NDhceDg1XHg5OVx4YjNceGJhXHhmY1x4OWNceGUzXHhjZFx4ZjlceDMxIgorJEVDSE8gLW5lICJceDViXHhmMVx4ODZceDY0XHg5ZFx4OGZceDkzXHgyNFx4YTNceDI5XHgzOFx4OTRceGNiXHgxZVx4NzFceDg3IgorJEVDSE8gLW5lICJceDU0XHhmMlx4MjdceDIyXHg0ZVx4NTdceDI2XHg5YVx4ODJceGI1XHg2ZVx4NmNceDFjXHhhZFx4MmRceDJiIgorJEVDSE8gLW5lICJceDIyXHg2Mlx4MGFceGQwXHgyM1x4NWRceDVhXHg3NVx4MTVceGFlXHhhMFx4MjZceDA0XHgyMVx4NmRceDJjIgorJEVDSE8gLW5lICJceGZlXHgwNlx4ZDlceDYwXHg2MVx4MjBceDhlXHhlYVx4ZWZceGJhXHg1OVx4MDNceDY0XHhkYVx4ZTVceGIyIgorJEVDSE8gLW5lICJceDMwXHhjMFx4OWNceGRjXHhjZlx4MTFceDc3XHhlOVx4MjNceDU0XHgzM1x4YjhceGU5XHgwNVx4YWJceDRjIgorJEVDSE8gLW5lICJceDViXHhiNVx4NGJceDJkXHgwM1x4MGNceDUxXHhjNVx4ODBceDExXHg1MVx4YWNceGViXHg4ZFx4NGNceDI1IgorJEVDSE8gLW5lICJceDIxXHg5OFx4NzlceGIwXHgzOFx4OTlceDljXHhiY1x4ZTJceDk2XHhlOVx4NGFceGQwXHhhZFx4NTZceDZhIgorJEVDSE8gLW5lICJceDY1XHhlMVx4ZDRceDkwXHgxMlx4NGFceGE1XHg0OFx4MDZceGM2XHg0OFx4MzFceGFjXHhhZlx4MjFceDBhIgorJEVDSE8gLW5lICJceDU2XHhhMlx4OTBceDEyXHhkN1x4NTNceGE4XHg0OFx4MDNceDc1XHgyZVx4MzZceDE0XHhmNFx4NTBceDg5IgorJEVDSE8gLW5lICJceDdjXHg0OVx4NGVceDRhXHgyYVx4YmNceDQ2XHhjM1x4MmRceDE2XHg0ZVx4NDJceDI1XHgyOFx4ZDRceGYyIgorJEVDSE8gLW5lICJceDAxXHg0N1x4YTNceDVhXHhkMVx4NmFceDBjXHgxY1x4MzVceDljXHg1Mlx4YzhceDJkXHhlYlx4YWJceDE1IgorJEVDSE8gLW5lICJceDJhXHg5OVx4NTFceDQ1XHgyMlx4OWNceDc3XHhhZlx4ODVceDc3XHhiY1x4ODRceGIyXHhmNVx4OTlceGU5IgorJEVDSE8gLW5lICJceGQ4XHhkOVx4YzFceDkwXHg4M1x4MDJceGViXHhkZVx4OGZceDkxXHg4Mlx4YTNceDBjXHg3M1x4MWFceDA1IgorJEVDSE8gLW5lICJceDZiXHg5Y1x4OThceDI4XHhjNVx4NTZceDU1XHhlOVx4ZjNceDc0XHgyNFx4ODFceDQ4XHhhZlx4MjFceGI0IgorJEVDSE8gLW5lICJceDg0XHgyZFx4NmJceDQ1XHg4OFx4YzJceDkwXHhiMVx4MTJceDEyXHg2MFx4YzhceDZhXHhlY1x4NjFceDMzIgorJEVDSE8gLW5lICJceGEyXHhjM1x4YjNceDU4XHhiZlx4MjlceDFjXHg0OFx4OTdceDdhXHhlYVx4MjBceDY1XHgwM1x4N2ZceDIyIgorJEVDSE8gLW5lICJceDQ1XHhhNVx4ZGRceDAzXHg1Y1x4NTJceGRjXHgzMFx4ODVceGRlXHhkOVx4NDdceDVlXHhlYlx4MzFceDY1IgorJEVDSE8gLW5lICJceDBiXHhmM1x4MTNceDgwXHhhZVx4M2VceDA3XHg1Mlx4MmFceDQ3XHhiOVx4N2JceDdjXHhhOFx4NDFceDc5IgorJEVDSE8gLW5lICJceDk1XHgyZVx4Y2ZceDNkXHg2MFx4MDhceGU2XHgyNlx4MDBceGQxXHg4Mlx4NjBceDcwXHg0NVx4YTFceDRhIgorJEVDSE8gLW5lICJceDQ4XHhhMlx4MThceDc2XHgzNVx4YjVceGU4XHg2Y1x4MGRceDQyXHhkMlx4YmFceDJjXHgxM1x4NWJceDI1IgorJEVDSE8gLW5lICJceDI3XHhkNFx4OGRceDczXHg3YVx4ZjhceGQ5XHhmZVx4ZjNceGQzXHg4MVx4NzNceDgzXHhlOFx4NjVceDYwIgorJEVDSE8gLW5lICJceGYzXHg1Ylx4MThceDA3XHgxNVx4MDRceDYwXHg2N1x4NTFceGNhXHhhYlx4OTFceDg1XHhkY1x4NjFceDNhIgorJEVDSE8gLW5lICJceGU5XHg3Mlx4YzJceGQxXHhhNFx4NjhceGUyXHgwMFx4YzhceDBjXHg1ZVx4ODJceGEwXHgwYlx4ODJceDE2IgorJEVDSE8gLW5lICJceDQwXHg4Mlx4YjJceDk4XHg3Ylx4NzZceGY4XHg1Ylx4YjVceGY2XHg4ZFx4ZmJceGM5XHgzNlx4OGNceDFlIgorJEVDSE8gLW5lICJceGE2XHhjOVx4YjVceDk1XHhkOFx4MzZceDI4XHgzNlx4ZWVceGE5XHhhMlx4NzJceDY2XHg1OFx4ZjVceDkwIgorJEVDSE8gLW5lICJceDAyXHg5NVx4ZWVceGE4XHhmY1x4NzlceGZhXHg2Zlx4NjZceGY2XHg0N1x4ZDZceDRmXHgxMFx4OTVceDg2IgorJEVDSE8gLW5lICJceDU0XHgwZFx4YTBceDIyXHgyNlx4MDFceGJlXHg2M1x4YzVceGYxXHhhY1x4MzZceDRhXHhlMVx4MGZceDZiIgorJEVDSE8gLW5lICJceGU3XHhiYVx4NGZceDIwXHgxN1x4YzBceGY5XHgwMlx4NWRceGM0XHhjMFx4YWZceGYwXHgxZlx4ODhceDU0IgorJEVDSE8gLW5lICJceGU0XHg2ZVx4YzBceGEyXHhiYlx4NTlceDZmXHg4Mlx4MjFceGJiXHg1MFx4OWNceDRlXHg5Mlx4ODNceDI0IgorJEVDSE8gLW5lICJceDIzXHhmOFx4MjhceDRjXHg0NVx4NzlceDg4XHg3MVx4M2JceDA1XHg3OVx4OThceDRmXHhhMVx4MDBceDJkIgorJEVDSE8gLW5lICJceDZlXHg2OFx4MDhceDQ2XHgzYlx4ZmJceGYwXHg1Y1x4MjJceGYzXHg0Mlx4NDBceDdkXHg1ZVx4NjdceDNmIgorJEVDSE8gLW5lICJceGRmXHhmZlx4MmVceDczXHgwZFx4MzFceGI1XHhjMFx4NzhceDRjXHgwZlx4ODVceDBmXHhkYlx4ZTZceDJiIgorJEVDSE8gLW5lICJceDg2XHgwZlx4YjNceDhmXHg5ZFx4MWFceGU2XHhlMlx4ZGJceDMyXHg2OFx4ZmJceDVhXHg3OVx4MGFceGY0IgorJEVDSE8gLW5lICJceDI1XHgyOFx4MDFceDM5XHhkMlx4N2NceDA1XHg3Ylx4MGJceDE4XHhiYlx4OWNceDY4XHgzMVx4OGRceGIwIgorJEVDSE8gLW5lICJceGZjXHg2OVx4MmRceDE3XHgyY1x4MzNceDYyXHhhNlx4MjRceDZmXHgwZVx4Y2NceGRjXHhmZlx4N2JceGRmIgorJEVDSE8gLW5lICJceDc4XHhkM1x4ODhceDVjXHg0YVx4YmRceGViXHgxNFx4ZGFceGUwXHgwZVx4ZDNceGYzXHg1Ylx4ZDJceGFhIgorJEVDSE8gLW5lICJceGQxXHg2NFx4ODJceDQyXHgwY1x4ZmVceDU0XHg5MFx4NDBceGViXHg3NVx4MTNceDYzXHg2OFx4YjVceDUyIgorJEVDSE8gLW5lICJceDBhXHhkOVx4M2JceGM1XHhkMFx4MTRceGUxXHhkMlx4MzVceGFiXHgyYlx4OGJceGVkXHgyMVx4ZjNceGUxIgorJEVDSE8gLW5lICJceGNiXHhlZFx4YmNceDNlXHg2NFx4ODFceDYzXHg1Zlx4YWFceGYzXHhiOFx4MDVceDEwXHgyOVx4ZTFceDY3IgorJEVDSE8gLW5lICJceGFlXHgwYVx4MTZceGJiXHg3MVx4MDVceDAyXHg0Nlx4YmFceGVmXHgzMFx4ZGFceGU3XHgzYVx4MThceDRiIgorJEVDSE8gLW5lICJceGNiXHgwZVx4OTdceGQxXHhlOVx4ZjVceDdhXHg3M1x4YzFceDYwXHg5MVx4YWZceDYzXHg0YVx4YzhceDU3IgorJEVDSE8gLW5lICJceGE2XHhiMFx4MDlceGI0XHg5NVx4OThceDg3XHhhOVx4YzRceDVlXHgwNFx4ZTdceGVmXHhiZlx4ZTVceDhjIgorJEVDSE8gLW5lICJceDM5XHg4ZVx4ZTJceGRkXHg5YVx4YzBceGJmXHgzN1x4OWNceDM4XHhhM1x4YWRceGM2XHgxNFx4ODZceDNmIgorJEVDSE8gLW5lICJceDdkXHhjMVx4OWRceGI1XHhiYlx4NjhceDU4XHg0Y1x4MTRceDAzXHhmMVx4MzZceGQ0XHhmMlx4Y2VceGI2IgorJEVDSE8gLW5lICJceGJjXHg5ZFx4YjNceDMxXHg1NVx4NjhceDBjXHg1Zlx4ZDBceDMwXHhlMlx4MDVceGFlXHg2OFx4NGVceDExIgorJEVDSE8gLW5lICJceDVhXHgyOFx4MTVceDY4XHg4Zlx4YWNceGEzXHgxYlx4ODlceGFkXHg0OFx4ODlceDA4XHgwOFx4YTNceDNiIgorJEVDSE8gLW5lICJceDI2XHg1ZVx4MzJceDFkXHg2ZFx4NzNceDJiXHgyMFx4OTBceDA4XHg0YVx4MTJceGIwXHgxZlx4ZjFceGEzIgorJEVDSE8gLW5lICJceDM3XHhmOFx4ZWNceDMwXHgyMVx4MDZceGYzXHhiYlx4M2JceDQ2XHhmOVx4YWFceGViXHgxYVx4MzFceDMzIgorJEVDSE8gLW5lICJceDJiXHhhNVx4ODdceDRkXHg0ZFx4YmNceDEzXHhkYVx4YTlceGEwXHg0Y1x4Y2FceDBiXHg0Nlx4YTZceDA5IgorJEVDSE8gLW5lICJceDQxXHg3M1x4YmJceDNmXHg3MVx4OWZceDZhXHg4OFx4NDFceDAyXHgyMFx4M2ZceDU0XHg2ZFx4NDJceGM4IgorJEVDSE8gLW5lICJceDcwXHg2ZVx4NjRceGQwXHg1MFx4ODhceDgzXHhjNFx4MzNceDc4XHg2ZFx4MDRceGI2XHg0M1x4ZWRceDVlIgorJEVDSE8gLW5lICJceDcyXHg3MVx4NmJceGQ1XHg2NVx4ODBceGNmXHg2Nlx4NDZceDI5XHgxMFx4ZGJceDc5XHhkMVx4YTlceDk1IgorJEVDSE8gLW5lICJceGI3XHg5ZFx4ZjRceGE5XHg5M1x4YjRceDVhXHgwMFx4YzZceGIyXHhhZFx4YmZceDdlXHhhYVx4ZTZceDhkIgorJEVDSE8gLW5lICJceDhjXHhjMFx4NmJceGY1XHhjMlx4YWRceDAwXHhmYlx4MDhceDYzXHhlMlx4YjVceGIxXHhlMFx4NzZceGFjIgorJEVDSE8gLW5lICJceDBhXHhlNFx4NzJceGI1XHg3Mlx4YmNceDI0XHg2Ylx4ZWZceDYyXHgwZlx4YWFceGI5XHgyOFx4ZDJceDNjIgorJEVDSE8gLW5lICJceGY2XHgzZVx4MjZceDIwXHg4Ylx4Y2NceGQyXHg2MVx4Y2RceGQ0XHhjN1x4ZWRceDM5XHhhOFx4MzlceDRlIgorJEVDSE8gLW5lICJceDdlXHgwNVx4OTdceGViXHgyOVx4MjRceDNhXHhiMlx4YzlceGJkXHhhZFx4Y2ZceGYwXHgyMlx4YmNceGRkIgorJEVDSE8gLW5lICJceGI4XHg4Y1x4MmVceDZhXHhiZlx4NGZceDY3XHgyZlx4ZmNceDA3XHhkMFx4NTNceDBjXHg1NFx4MzBceDM1IgorJEVDSE8gLW5lICJceGY4XHhmMVx4NzZceDQ1XHgyNlx4NWFceDg2XHgxMVx4MWVceGViXHg1OFx4YzBceDJkXHg2Y1x4M2RceDg3IgorJEVDSE8gLW5lICJceGE2XHhjYVx4OGVceDg5XHg0Zlx4NzVceDg4XHhmOVx4YjlceDlhXHg5OVx4OGJceDY4XHgyMlx4ZTJceDUyIgorJEVDSE8gLW5lICJceDRkXHg0Nlx4OGRceDQ0XHgzMVx4MmJceGMxXHhiMFx4MTlceGE3XHg5MFx4ZmJceDk1XHhkYVx4MTlceDJmIgorJEVDSE8gLW5lICJceDZlXHgwZFx4ZTJceGMxXHg4NVx4ZDBceDFmXHg5Ylx4ZDNceGFlXHgzM1x4ZTNceDU1XHhhNFx4NzdceGYyIgorJEVDSE8gLW5lICJceGYxXHhkN1x4YThceGYwXHg1N1x4MzBceGM0XHgzYlx4ZTZceDU1XHg5N1x4ZjlceGUzXHg4OVx4ODJceGRhIgorJEVDSE8gLW5lICJceGFlXHgwMlx4NDVceGIxXHg4Nlx4OGNceDg0XHg0Y1x4YjJceGNmXHg4Mlx4ZGJceDRlXHgwNFx4NDVceGNjIgorJEVDSE8gLW5lICJceDE5XHg1M1x4OWVceDJmXHg5NVx4YTlceGM3XHhhOFx4MDhceDE3XHg2MVx4YzFceDhjXHgyNlx4N2ZceDliIgorJEVDSE8gLW5lICJceDA3XHg4Y1x4ZTdceDc3XHgyZFx4MTJceGQyXHhjZFx4YzZceDk3XHhjZlx4MjlceDNhXHgxZVx4YWNceDJiIgorJEVDSE8gLW5lICJceDY5XHhiOVx4YjRceDYxXHhlZVx4ZWJceGIzXHhhZVx4NjBceDE4XHhhMFx4M2FceGU1XHhjMFx4YjlceDU4IgorJEVDSE8gLW5lICJceDM4XHg0ZFx4MzJceDU3XHg4MVx4ODlceDk5XHgyOVx4NzNceGRkXHg0N1x4NDNceDJmXHgxZVx4MzlceGM2IgorJEVDSE8gLW5lICJceDA2XHhiZlx4N2ZceDY0XHg5ZVx4OTFceGMzXHg5Zlx4MThceDFiXHhiYVx4ZjhceGI1XHgyOVx4NWRceGUzIgorJEVDSE8gLW5lICJceDQ2XHg3ZVx4YjVceDFhXHhmZFx4OWJceGIwXHgxYlx4ODVceDA2XHhjM1x4YzVceDA5XHhkYlx4ODJceGQwIgorJEVDSE8gLW5lICJceGQxXHhmZlx4ZTFceDBmXHhlYlx4MzdceDFkXHhjZVx4NjVceDZkXHgyNlx4NTVceGUwXHgyMFx4MDBceGM0IgorJEVDSE8gLW5lICJceDM2XHgyZlx4YmFceDg2XHgyNlx4YzZceDdiXHhhNFx4ZTlceGIxXHg0MVx4MjBceDA0XHgxMVx4ZWJceDI0IgorJEVDSE8gLW5lICJceDNjXHg3Mlx4YmZceGQzXHhjNVx4YjNceGJkXHhjZVx4MTRceDQ1XHgyZFx4NTBceDAxXHgwMFx4MjZceDM5IgorJEVDSE8gLW5lICJceDNjXHg4NVx4MTdceDBlXHg0Mlx4NjZceDhhXHgxY1x4OTRceGE4XHg5MFx4MDJceGM0XHg0Mlx4ZDhceGQxIgorJEVDSE8gLW5lICJceGNjXHg5NFx4N2FceDI1XHhhZFx4ZmRceDhkXHhhNFx4MGVceGUwXHhjYlx4OTJceDVlXHg2Zlx4MTRceDJiIgorJEVDSE8gLW5lICJceDI5XHhiZFx4YzBceDgxXHgyMFx4M2ZceDBiXHgyY1x4N2FceDJjXHhlN1x4YmFceDZkXHg5OVx4MTRceGJlIgorJEVDSE8gLW5lICJceGQ1XHgzOVx4YzhceDZmXHgyZVx4YmRceDc5XHg1OVx4MTlceDc1XHhiNlx4ZjVceDRmXHgxMlx4ZjZceDhlIgorJEVDSE8gLW5lICJceDQwXHhhMFx4MDBceDhiXHgxMlx4ZThceGZiXHhiN1x4MjdceGFhXHhkM1x4MzZceDBjXHhmY1x4ZTFceDQwIgorJEVDSE8gLW5lICJceDAxXHhmZlx4OGJceGI5XHgyMlx4OWNceDI4XHg0OFx4NWZceGE1XHhjYVx4ZjNceDgwIgorfQorCitwYnppcF80bV96ZXJvcygpIHsKKyRFQ0hPIC1uZSAiXHg0Mlx4NWFceDY4XHgzMVx4MzFceDQxXHg1OVx4MjZceDUzXHg1OVx4NjNceGUzXHhlY1x4YTJceDAwXHgwNiIKKyRFQ0hPIC1uZSAiXHhlNFx4YzFceDAwXHhjMFx4MDBceDAyXHgwMFx4MDBceDA4XHgyMFx4MDBceDMwXHhjY1x4MDlceGFhXHg2OSIKKyRFQ0hPIC1uZSAiXHg5NFx4YTFceDM2XHhhOVx4MjhceDRmXHgxN1x4NzJceDQ1XHgzOFx4NTBceDkwXHg2M1x4ZTNceGVjXHhhMiIKKyRFQ0hPIC1uZSAiXHg0Mlx4NWFceDY4XHgzMVx4MzFceDQxXHg1OVx4MjZceDUzXHg1OVx4NjNceGUzXHhlY1x4YTJceDAwXHgwNiIKKyRFQ0hPIC1uZSAiXHhlNFx4YzFceDAwXHhjMFx4MDBceDAyXHgwMFx4MDBceDA4XHgyMFx4MDBceDMwXHhjY1x4MDlceGFhXHg2OSIKKyRFQ0hPIC1uZSAiXHg5NFx4YTFceDM2XHhhOVx4MjhceDRmXHgxN1x4NzJceDQ1XHgzOFx4NTBceDkwXHg2M1x4ZTNceGVjXHhhMiIKKyRFQ0hPIC1uZSAiXHg0Mlx4NWFceDY4XHgzMVx4MzFceDQxXHg1OVx4MjZceDUzXHg1OVx4NjNceGUzXHhlY1x4YTJceDAwXHgwNiIKKyRFQ0hPIC1uZSAiXHhlNFx4YzFceDAwXHhjMFx4MDBceDAyXHgwMFx4MDBceDA4XHgyMFx4MDBceDMwXHhjY1x4MDlceGFhXHg2OSIKKyRFQ0hPIC1uZSAiXHg5NFx4YTFceDM2XHhhOVx4MjhceDRmXHgxN1x4NzJceDQ1XHgzOFx4NTBceDkwXHg2M1x4ZTNceGVjXHhhMiIKKyRFQ0hPIC1uZSAiXHg0Mlx4NWFceDY4XHgzMVx4MzFceDQxXHg1OVx4MjZceDUzXHg1OVx4NjNceGUzXHhlY1x4YTJceDAwXHgwNiIKKyRFQ0hPIC1uZSAiXHhlNFx4YzFceDAwXHhjMFx4MDBceDAyXHgwMFx4MDBceDA4XHgyMFx4MDBceDMwXHhjY1x4MDlceGFhXHg2OSIKKyRFQ0hPIC1uZSAiXHg5NFx4YTFceDM2XHhhOVx4MjhceDRmXHgxN1x4NzJceDQ1XHgzOFx4NTBceDkwXHg2M1x4ZTNceGVjXHhhMiIKKyRFQ0hPIC1uZSAiXHg0Mlx4NWFceDY4XHgzMVx4MzFceDQxXHg1OVx4MjZceDUzXHg1OVx4YzlceGI1XHgyMVx4ZWZceDAwXHgwNCIKKyRFQ0hPIC1uZSAiXHg4ZFx4NDBceDIwXHhjMFx4MDBceDAxXHgwMFx4MDBceDA4XHgyMFx4MDBceDMwXHhjY1x4MDVceDI5XHhhNiIKKyRFQ0hPIC1uZSAiXHg0YVx4MTFceGIxXHg0YVx4MTFceGUyXHhlZVx4NDhceGE3XHgwYVx4MTJceDE5XHgzNlx4YTRceDNkXHhlMCIKK30KKworcHJlcCgpIHsKKyAgICBybSAtZiB0KgorICAgIGhlbGxvXyRleHQgPnQxLiRleHQKKyAgICBoZWxsb18kZXh0ID50Mi4kZXh0Cit9CisKK2NoZWNrKCkgeworICAgIGV2YWwgJDIgPnRfYWN0dWFsIDI+JjEKKyAgICBpZiAkRUNITyAtbmUgIiRleHBlY3RlZCIgfCBjbXAgLSB0X2FjdHVhbDsgdGhlbgorCWVjaG8gIlBBU1M6ICQxIgorICAgIGVsc2UKKwllY2hvICJGQUlMOiAkMSIKKwlGQUlMQ09VTlQ9JCgoRkFJTENPVU5UICsgMSkpCisgICAgZmkKK30KKworbWtkaXIgdGVzdGRpciAyPi9kZXYvbnVsbAorKAorY2QgdGVzdGRpciB8fCB7IGVjaG8gImNhbm5vdCBjZCB0ZXN0ZGlyISI7IGV4aXQgMTsgfQorCitleHBlY3RlZD0iJHVucGFjazogejogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorMQorSEVMTE8KKyIKK3ByZXA7IGNoZWNrICIkdW5wYWNrOiBkb2VzbnQgZXhpc3QiICIke2JifSR1bnBhY2sgeiB0MS4kZXh0OyBlY2hvIFwkPzsgY2F0IHQxIgorCisKK2V4cGVjdGVkPSIkdW5wYWNrOiB0Lnp6OiB1bmtub3duIHN1ZmZpeCAtIGlnbm9yZWQKKzEKK0hFTExPCisiCitwcmVwOyA+dC56ejsgY2hlY2sgIiR1bnBhY2s6IHVua25vd24gc3VmZml4IiAiJHtiYn0kdW5wYWNrIHQuenogdDEuJGV4dDsgZWNobyBcJD87IGNhdCB0MSIKKworCisjIEluIHRoaXMgY2FzZSBmaWxlICJ0MSIgZXhpc3RzLCBhbmQgd2Ugc2tpcCB0MS5neiBhbmQgdW5wYWNrIHQyLmd6CitleHBlY3RlZD0iJHVucGFjazogY2FuJ3Qgb3BlbiAndDEnOiBGaWxlIGV4aXN0cworMQorSEVMTE8KKyIKK3ByZXA7ID50MTsgY2hlY2sgIiR1bnBhY2s6IGFscmVhZHkgZXhpc3RzIiAiJHtiYn0kdW5wYWNrIHQxLiRleHQgdDIuJGV4dDsgZWNobyBcJD87IGNhdCB0MSB0MiIKKworCisjIEZyb20gb2xkIHRlc3RzdWl0ZQorZXhwZWN0ZWQ9IkhFTExPXG4wXG4iCitwcmVwOyBjaGVjayAiJHVucGFjazogc3RyZWFtIHVucGFjayIgImNhdCB0MS4kZXh0IHwgJHtiYn0kdW5wYWNrOyBlY2hvIFwkPyIKKworZXhwZWN0ZWQ9Im9rXG4iCitwcmVwOyBjaGVjayAiJHVucGFjazogZGVsZXRlIHNyYyIgIiR7YmJ9JHVucGFjayB0Mi4kZXh0OyB0ZXN0ICEgLWYgdDIuJGV4dCAmJiBlY2hvIG9rIgorCispCitybSAtcmYgdGVzdGRpcgorCisjIFRoaXMgdGVzdCBpcyBvbmx5IGZvciBidW56aXAyCitpZiB0ZXN0ICIkezAjIyovfSIgPSAiYnVuemlwMi50ZXN0cyI7IHRoZW4KKyAgICBpZiB0ZXN0MV9iejIgfCAke2JifWJ1bnppcDIgPi9kZXYvbnVsbCBcCisJJiYgdGVzdCAiYHRlc3QxX2J6MiB8ICR7YmJ9YnVuemlwMiB8IG1kNXN1bWAiID0gIjYxYmJlZWU0YmU5YzZmMTEwYTcxNDQ3ZjU4NGZkYTdiICAtIgorICAgIHRoZW4KKwllY2hvICJQQVNTOiAkdW5wYWNrOiB0ZXN0X2J6MiBmaWxlIgorICAgIGVsc2UKKwllY2hvICJGQUlMOiAkdW5wYWNrOiB0ZXN0X2J6MiBmaWxlIgorCUZBSUxDT1VOVD0kKChGQUlMQ09VTlQgKyAxKSkKKyAgICBmaQorCisgICAgaWYgcGJ6aXBfNG1femVyb3MgfCAke2JifWJ1bnppcDIgPi9kZXYvbnVsbCBcCisJJiYgdGVzdCAiYHBiemlwXzRtX3plcm9zIHwgJHtiYn1idW56aXAyIHwgbWQ1c3VtYCIgPSAiYjVjZmE5ZDZjOGZlYmQ2MThmOTFhYzI4NDNkNTBhMWMgIC0iCisgICAgdGhlbgorCWVjaG8gIlBBU1M6ICR1bnBhY2s6IHBiemlwXzRtX3plcm9zIGZpbGUiCisgICAgZWxzZQorCWVjaG8gIkZBSUw6ICR1bnBhY2s6IHBiemlwXzRtX3plcm9zIGZpbGUiCisJRkFJTENPVU5UPSQoKEZBSUxDT1VOVCArIDEpKQorICAgIGZpCitmaQorCitleGl0ICQoKEZBSUxDT1VOVCA8PSAyNTUgPyBGQUlMQ09VTlQgOiAyNTUpKQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2J1bnppcDIvYnVuemlwMi1yZWFkcy1mcm9tLXN0YW5kYXJkLWlucHV0IGIvdGVzdHN1aXRlL2J1bnppcDIvYnVuemlwMi1yZWFkcy1mcm9tLXN0YW5kYXJkLWlucHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMTJhMTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvYnVuemlwMi9idW56aXAyLXJlYWRzLWZyb20tc3RhbmRhcmQtaW5wdXQKQEAgLTAsMCArMSwyIEBACitlY2hvIGZvbyB8IGJ6aXAyIHwgYnVzeWJveCBidW56aXAyID4gb3V0cHV0CitlY2hvIGZvbyB8IGNtcCAtIG91dHB1dApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2J1bnppcDIvYnVuemlwMi1yZW1vdmVzLWNvbXByZXNzZWQtZmlsZSBiL3Rlc3RzdWl0ZS9idW56aXAyL2J1bnppcDItcmVtb3Zlcy1jb21wcmVzc2VkLWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkMTU1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9idW56aXAyL2J1bnppcDItcmVtb3Zlcy1jb21wcmVzc2VkLWZpbGUKQEAgLTAsMCArMSwzIEBACitlY2hvIGZvbyB8IGJ6aXAyID5mb28uYnoyCitidXN5Ym94IGJ1bnppcDIgZm9vLmJ6MgordGVzdCAhIC1mIGZvby5iejIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9idW56aXAyL2J6Y2F0LWRvZXMtbm90LXJlbW92ZS1jb21wcmVzc2VkLWZpbGUgYi90ZXN0c3VpdGUvYnVuemlwMi9iemNhdC1kb2VzLW5vdC1yZW1vdmUtY29tcHJlc3NlZC1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNDAxNmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvYnVuemlwMi9iemNhdC1kb2VzLW5vdC1yZW1vdmUtY29tcHJlc3NlZC1maWxlCkBAIC0wLDAgKzEsMyBAQAorZWNobyBmb28gfCBiemlwMiA+Zm9vLmJ6MgorYnVzeWJveCBiemNhdCBmb28uYnoyCit0ZXN0IC1mIGZvby5iejIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9idXN5Ym94LnRlc3RzIGIvdGVzdHN1aXRlL2J1c3lib3gudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMDRmZWEzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9idXN5Ym94LnRlc3RzCkBAIC0wLDAgKzEsNDcgQEAKKyMhL2Jpbi9zaAorCisjIFRlc3RzIGZvciBidXN5Ym94IGFwcGxldCBpdHNlbGYuCisjIENvcHlyaWdodCAyMDA1IGJ5IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKK0hFTFBEVU1QPWB0cnVlIHwgYnVzeWJveCAyPiYxIHwgY2F0YAorCisjIFdlIG5lZWQgdG8gdGVzdCB1bmRlciBjYWxsaW5nIHRoZSBiaW5hcnkgdW5kZXIgb3RoZXIgbmFtZXMuCisKK29wdGlvbmFsIEZFQVRVUkVfVkVSQk9TRV9VU0FHRQordGVzdGluZyAiYnVzeWJveCAtLWhlbHAgYnVzeWJveCIgInRydWUgfCBidXN5Ym94IC0taGVscCBidXN5Ym94IDI+JjEgfCBjYXQiICIkSEVMUERVTVBcblxuIiAiIiAiIgorU0tJUD0KKworbG4gLXMgYHdoaWNoIGJ1c3lib3hgIGJ1c3lib3gtc3VmZml4Citmb3IgaSBpbiBidXN5Ym94IC4vYnVzeWJveC1zdWZmaXgKK2RvCisJIyBUaGUgZ3JhdHVpdG91cyAiXG4icyBhcmUgZHVlIHRvIGEgc2hlbGwgaWRpb3N5bmNyYXN5OgorCSMgZW52aXJvbm1lbnQgdmFyaWFibGVzIHNlZW0gdG8gc3RyaXAgdHJhaWxpbmcgd2hpdGVzcGFjZS4KKworCXRlc3RpbmcgIiIgIiRpIiAiJEhFTFBEVU1QXG5cbiIgIiIgIiIKKworCXRlc3RpbmcgIiRpIHVua25vd24iICIkaSB1bmtub3duIDI+JjEiIFwKKwkJInVua25vd246IGFwcGxldCBub3QgZm91bmRcbiIgIiIgIiIKKworCXRlc3RpbmcgIiRpIC0taGVscCIgIiRpIC0taGVscCAyPiYxIiAiJEhFTFBEVU1QXG5cbiIgIiIgIiIKKworCW9wdGlvbmFsIEZFQVRVUkVfVkVSQk9TRV9VU0FHRSBDQVQKKwl0ZXN0aW5nICIiICIkaSBjYXQiICJtb28iICIiICJtb28iCisJdGVzdGluZyAiJGkgLS1oZWxwIGNhdCIgIiRpIC0taGVscCBjYXQgMj4mMSB8IGdyZXAgcHJpbnQiIFwKKwkJIkNvbmNhdGVuYXRlIEZJTEVzIGFuZCBwcmludCB0aGVtIHRvIHN0ZG91dFxuIiAiIiAiIgorCVNLSVA9CisKKwl0ZXN0aW5nICIkaSAtLWhlbHAgdW5rbm93biIgIiRpIC0taGVscCB1bmtub3duIDI+JjEiIFwKKwkJInVua25vd246IGFwcGxldCBub3QgZm91bmRcbiIgIiIgIiIKK2RvbmUKK3JtIGJ1c3lib3gtc3VmZml4CisKK2xuIC1zIGB3aGljaCBidXN5Ym94YCB1bmtub3duCisKK3Rlc3RpbmcgImJ1c3lib3ggYXMgdW5rbm93biBuYW1lIiAiLi91bmtub3duIDI+JjEiIFwKKwkidW5rbm93bjogYXBwbGV0IG5vdCBmb3VuZFxuIiAiIiAiIgorcm0gdW5rbm93bgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9iemNhdC50ZXN0cyBiL3Rlc3RzdWl0ZS9iemNhdC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wYWU1MzBkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2J6Y2F0LnRlc3RzCkBAIC0wLDAgKzEsMTE2IEBACisjIS9iaW4vc2gKKworRkFJTENPVU5UPTAKKworYmI9ImJ1c3lib3ggIgorCit1bnNldCBMQ19BTEwKK3Vuc2V0IExDX01FU1NBR0VTCit1bnNldCBMQU5HCit1bnNldCBMQU5HVUFHRQorCitoZWxsb19aKCkgeworICAgICMgQ29tcHJlc3NlZCAiSEVMTE9cbiIKKyAgICAkRUNITyAtbmUgIlx4MWZceDlkXHg5MFx4NDhceDhhXHgzMFx4NjFceGYyXHg0NFx4MDEiCit9CisKK2hlbGxvX2d6KCkgeworICAgICMgR3ppcHBlZCAiSEVMTE9cbiIKKyAgICAjX19fX19fX19fX19fX19fX19fX19fX19fXyB2dnYgdnZ2IHZ2diB2dnYgLSBtdGltZQorICAgICRFQ0hPIC1uZSAiXHgxZlx4OGJceDA4XHgwMFx4ODVceDFkXHhlZlx4NDVceDAyXHgwM1x4ZjNceDcwXHhmNVx4ZjFceGYxXHhlNyIKKyAgICAkRUNITyAtbmUgIlx4MDJceDAwXHg2ZVx4ZDdceGFjXHhmZFx4MDZceDAwXHgwMFx4MDAiCit9CisKK2hlbGxvX2J6MigpIHsKKyAgICAjIEJ6aXBwZWQgIkhFTExPXG4iCisgICAgJEVDSE8gLW5lICJceDQyXHg1YVx4NjhceDM5XHgzMVx4NDFceDU5XHgyNlx4NTNceDU5XHg1Ylx4YjhceGU4XHhhM1x4MDBceDAwIgorICAgICRFQ0hPIC1uZSAiXHgwMVx4NDRceDAwXHgwMFx4MTBceDAyXHg0NFx4YTBceDAwXHgzMFx4Y2RceDAwXHhjM1x4NDZceDI5XHg5NyIKKyAgICAkRUNITyAtbmUgIlx4MTdceDcyXHg0NVx4MzhceDUwXHg5MFx4NWJceGI4XHhlOFx4YTMiCit9CisKK2ZvciBleHQgaW4gXAorICAgIGB0ZXN0IHgiJENPTkZJR19HVU5aSVAiICAgICA9IHgieSIgJiYgZWNobyBnemAgXAorICAgIGB0ZXN0IHgiJENPTkZJR19CVU5aSVAyIiAgICA9IHgieSIgJiYgZWNobyBiejJgIFwKKyAgICBgdGVzdCB4IiRDT05GSUdfVU5DT01QUkVTUyIgPSB4InkiICYmIGVjaG8gWmAKK2RvCisgICAgcHJlcCgpIHsKKwlybSAtZiB0MS4kZXh0IHQyLiRleHQgdF9hY3R1YWwKKwloZWxsb18kZXh0ID50MS4kZXh0CisJaGVsbG9fJGV4dCA+dDIuJGV4dAorICAgIH0KKworICAgIGNoZWNrKCkgeworCWV2YWwgJDIgPnRfYWN0dWFsIDI+JjEKKwlpZiAkRUNITyAtbmUgIiRleHBlY3RlZCIgfCBjbXAgLSB0X2FjdHVhbDsgdGhlbgorCSAgICBlY2hvICJQQVNTOiAkMSIKKwllbHNlCisJICAgIGVjaG8gIkZBSUw6ICQxIgorCSAgICBGQUlMQ09VTlQ9JCgoRkFJTENPVU5UICsgMSkpCisJZmkKKyAgICB9CisKKyAgICBta2RpciB0ZXN0ZGlyIDI+L2Rldi9udWxsCisgICAgKAorICAgIGNkIHRlc3RkaXIgfHwgeyBlY2hvICJjYW5ub3QgY2QgdGVzdGRpciEiOyBleGl0IDE7IH0KKyAgICBleHBlY3RlZD0iSEVMTE9cbm9rXG4iCisgICAgcHJlcAorICAgIGNoZWNrICJ6Y2F0OiBkb250IGRlbGV0ZSAkZXh0IHNyYyIgIiR7YmJ9emNhdCB0Mi4kZXh0OyB0ZXN0IC1mIHQyLiRleHQgJiYgZWNobyBvayIKKyAgICBleGl0ICRGQUlMQ09VTlQKKyAgICApCisgICAgRkFJTENPVU5UPSQ/CisgICAgcm0gLXJmIHRlc3RkaXIKK2RvbmUKKworCisjIENvcHlyaWdodCAyMDExIGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAiY29tbWFuZCIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKworIyMgYnppcCBhbGdvcml0aG0KKworIyAiaW5wdXQiIGZpbGUgaXMgYnppcHBlZCBmaWxlIHdpdGggImFcbiIgZGF0YQordGVzdGluZyAiYnpjYXQgY2FuIHByaW50IG1hbnkgZmlsZXMiIFwKKyIkRUNITyAtbmUgJyRoZXhkdW1wJyB8IGJ6Y2F0IGlucHV0IGlucHV0OyBlY2hvIFwkPyIgXAorIlwKK2EKK2EKKzAKKyIgIlwKK1x4NDJceDVhXHg2OFx4MzlceDMxXHg0MVx4NTlceDI2XHg1M1x4NTlceDYzXHgzZVx4ZDZceGUyXHgwMFx4MDBcCitceDAwXHhjMVx4MDBceDAwXHgxMFx4MjBceDAwXHgyMFx4MDBceDIxXHgwMFx4ODJceGIxXHg3N1x4MjRceDUzXAorXHg4NVx4MDlceDA2XHgzM1x4ZWRceDZlXHgyMFwKKyIgIiIKKworIyAiaW5wdXQiIGZpbGUgaXMgYnppcHBlZCB6ZXJvIGJ5dGUgZmlsZQordGVzdGluZyAiYnpjYXQgY2FuIGhhbmRsZSBjb21wcmVzc2VkIHplcm8tbGVuZ3RoIGJ6aXAyIGZpbGVzIiBcCisiJEVDSE8gLW5lICckaGV4ZHVtcCcgfCBiemNhdCBpbnB1dCBpbnB1dDsgZWNobyBcJD8iIFwKKyIwXG4iIFwKKyJceDQyXHg1YVx4NjhceDM5XHgxN1x4NzJceDQ1XHgzOFx4NTBceDkwXHgwMFx4MDBceDAwXHgwMCIgIiIKKworIyMgY29tcHJlc3MgYWxnb3JpdGhtCisKKyMgImlucHV0IiBmaWxlIGlzIGNvbXByZXNzZWQgKC5aKSBmaWxlIHdpdGggImFcbiIgZGF0YQordGVzdCB4IiRDT05GSUdfVU5DT01QUkVTUyIgPSB4InkiICYmIFwKK3Rlc3RpbmcgInpjYXQgY2FuIHByaW50IG1hbnkgZmlsZXMiIFwKKyIkRUNITyAtbmUgJyRoZXhkdW1wJyB8IHpjYXQgaW5wdXQgaW5wdXQ7IGVjaG8gXCQ/IiBcCisiXAorYQorYQorMAorIiAiXAorXHgxZlx4OWRceDkwXHg2MVx4MTRceDAwXAorIiAiIgorCisjICJpbnB1dCIgZmlsZSBpcyBjb21wcmVzc2VkICguWikgemVybyBieXRlIGZpbGUKK3Rlc3QgeCIkQ09ORklHX1VOQ09NUFJFU1MiID0geCJ5IiAmJiBcCit0ZXN0aW5nICJ6Y2F0IGNhbiBoYW5kbGUgY29tcHJlc3NlZCB6ZXJvLWxlbmd0aCAoLlopIGZpbGVzIiBcCisiJEVDSE8gLW5lICckaGV4ZHVtcCcgfCB6Y2F0IGlucHV0IGlucHV0OyBlY2hvIFwkPyIgXAorIjBcbiIgXAorIlx4MWZceDlkXHg5MFx4MDAiICIiCisKKworCitleGl0ICQoKEZBSUxDT1VOVCA8PSAyNTUgPyBGQUlMQ09VTlQgOiAyNTUpKQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2NhbC50ZXN0cyBiL3Rlc3RzdWl0ZS9jYWwudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNTUwOWNmMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9jYWwudGVzdHMKQEAgLTAsMCArMSwzOCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDEwIGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCit0ZXN0IC1mICIkYmluZGlyLy5jb25maWciICYmIC4gIiRiaW5kaXIvLmNvbmZpZyIKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJjb21tYW5kIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCit0ZXN0aW5nICJjYWwgMjAwMCIgImNhbCAxIDIwMDAiICJcCisgICAgSmFudWFyeSAyMDAwCitTdSBNbyBUdSBXZSBUaCBGciBTYQorICAgICAgICAgICAgICAgICAgIDEKKyAyICAzICA0ICA1ICA2ICA3ICA4CisgOSAxMCAxMSAxMiAxMyAxNCAxNQorMTYgMTcgMTggMTkgMjAgMjEgMjIKKzIzIDI0IDI1IDI2IDI3IDI4IDI5CiszMCAzMQorIiAiIiAiIgorCit0ZXN0IHgiJENPTkZJR19MT0NBTEVfU1VQUE9SVCIgPSB4InkiIFwKKyYmIHRlc3QgeCIkQ09ORklHX1VOSUNPREVfU1VQUE9SVCIgPSB4InkiIFwKKyYmIHRlc3QgeCIkQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSIiA9IHgiMCIgXAorJiYgdGVzdCB4IiRDT05GSUdfVU5JQ09ERV9XSURFX1dDSEFSUyIgPSB4InkiIFwKKyYmIHRlc3QgeCIkQ09ORklHX1NUQVRJQyIgIT0geCJ5IiBcCismJiB0ZXN0IHgiJENPTkZJR19DUk9TU19DT01QSUxFUl9QUkVGSVgiID0geCIiIFwKKyYmIHRlc3RpbmcgInVuaWNvZGUgY2FsIDIwMDAiICJMQU5HPXpoX1RXLnV0ZjggY2FsIDEgMjAwMCIgIlwKKyAgICDkuIDmnIggMjAwMAor5pelIOS4gCDkuowg5LiJIOWbmyDkupQg5YWtCisgICAgICAgICAgICAgICAgICAgMQorIDIgIDMgIDQgIDUgIDYgIDcgIDgKKyA5IDEwIDExIDEyIDEzIDE0IDE1CisxNiAxNyAxOCAxOSAyMCAyMSAyMgorMjMgMjQgMjUgMjYgMjcgMjggMjkKKzMwIDMxCisiICIiICIiCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2NhdC9jYXQtcHJpbnRzLWEtZmlsZSBiL3Rlc3RzdWl0ZS9jYXQvY2F0LXByaW50cy1hLWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNmMzVhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9jYXQvY2F0LXByaW50cy1hLWZpbGUKQEAgLTAsMCArMSwzIEBACitlY2hvIEkgV0FOVCA+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+L2Rldi9udWxsCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2N1dC50ZXN0cyBiL3Rlc3RzdWl0ZS9jdXQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMTEwMzQwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9jdXQudGVzdHMKQEAgLTAsMCArMSwxOCBAQAorIyEvYmluL3NoCisKKyMgQ29weXJpZ2h0IDIwMDcgYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJvcHRpb25zIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorIyAgIGZpbGUgaW5wdXQgd2lsbCBiZSBmaWxlIGNhbGxlZCAiaW5wdXQiCisjICAgdGVzdCBjYW4gY3JlYXRlIGEgZmlsZSAiYWN0dWFsIiBpbnN0ZWFkIG9mIHdyaXRpbmcgdG8gc3Rkb3V0CisKK3Rlc3RpbmcgImN1dCAnLScgKHN0ZGluKSBhbmQgbXVsdGkgZmlsZSBoYW5kbGluZyIgXAorCSJjdXQgLWQnICcgLWYyIC0gaW5wdXQiIFwKKwkib3ZlclxuIiJxdWlja1xuIiBcCisJInRoZSBxdWljayBicm93biBmb3hcbiIgXAorCSJqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZ1xuIiBcCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2N1dC9jdXQtY3V0cy1hLWNoYXJhY3RlciBiL3Rlc3RzdWl0ZS9jdXQvY3V0LWN1dHMtYS1jaGFyYWN0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjNWVmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9jdXQvY3V0LWN1dHMtYS1jaGFyYWN0ZXIKQEAgLTAsMCArMSBAQAordGVzdCAkKGVjaG8gYWJjZCB8IGJ1c3lib3ggY3V0IC1jIDMpID0gYwpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2N1dC9jdXQtY3V0cy1hLWNsb3NlZC1yYW5nZSBiL3Rlc3RzdWl0ZS9jdXQvY3V0LWN1dHMtYS1jbG9zZWQtcmFuZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4MGI3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9jdXQvY3V0LWN1dHMtYS1jbG9zZWQtcmFuZ2UKQEAgLTAsMCArMSBAQAordGVzdCAkKGVjaG8gYWJjZCB8IGJ1c3lib3ggY3V0IC1jIDEtMikgPSBhYgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2N1dC9jdXQtY3V0cy1hLWZpZWxkIGIvdGVzdHN1aXRlL2N1dC9jdXQtY3V0cy1hLWZpZWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMDBiNmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvY3V0L2N1dC1jdXRzLWEtZmllbGQKQEAgLTAsMCArMSBAQAordGVzdCAkKCRFQ0hPIC1lICJmMVx0ZjJcdGYzIiB8IGJ1c3lib3ggY3V0IC1mIDIpID0gZjIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9jdXQvY3V0LWN1dHMtYW4tb3Blbi1yYW5nZSBiL3Rlc3RzdWl0ZS9jdXQvY3V0LWN1dHMtYW4tb3Blbi1yYW5nZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmJmMjc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2N1dC9jdXQtY3V0cy1hbi1vcGVuLXJhbmdlCkBAIC0wLDAgKzEgQEAKK3Rlc3QgJChlY2hvIGFiY2QgfCBidXN5Ym94IGN1dCAtYyAtMykgPSBhYmMKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9jdXQvY3V0LWN1dHMtYW4tdW5jbG9zZWQtcmFuZ2UgYi90ZXN0c3VpdGUvY3V0L2N1dC1jdXRzLWFuLXVuY2xvc2VkLXJhbmdlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYjBjZGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvY3V0L2N1dC1jdXRzLWFuLXVuY2xvc2VkLXJhbmdlCkBAIC0wLDAgKzEgQEAKK3Rlc3QgJChlY2hvIGFiY2QgfCBidXN5Ym94IGN1dCAtYyAzLSkgPSBjZApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2RhdGUvZGF0ZS1ALXdvcmtzIGIvdGVzdHN1aXRlL2RhdGUvZGF0ZS1ALXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYjRjN2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZGF0ZS9kYXRlLUAtd29ya3MKQEAgLTAsMCArMSwxMyBAQAorIyBUZXN0cyBmb3IgdGltZV90IHZhbHVlICh1bml4IHRpbWUgZm9ybWF0KQorCisjIEp1c3QgYmVmb3JlIERTVCBzd2l0Y2hlZCBvZmYKK3Rlc3QgeCJTdW4gT2N0IDMxIDAzOjU5OjU5IEVFU1QgMjAxMCIgPSB4ImBUWj1FRVQtMkVFU1QsTTMuNS4wLzMsTTEwLjUuMC80IGJ1c3lib3ggZGF0ZSAtZCBAMTI4ODQ4Njc5OWAiCisKKyMgSnVzdCBhZnRlciBEU1Qgc3dpdGNoZWQgb2ZmCit0ZXN0IHgiU3VuIE9jdCAzMSAwMzowMDowMSBFRVQgMjAxMCIgPSB4ImBUWj1FRVQtMkVFU1QsTTMuNS4wLzMsTTEwLjUuMC80IGJ1c3lib3ggZGF0ZSAtZCBAMTI4ODQ4NjgwMWAiCisKKyMgSnVzdCBiZWZvcmUgRFNUIHN3aXRjaGVkIG9uCit0ZXN0IHgiU3VuIE1hciAyOCAwMjo1OTo1OSBFRVQgMjAxMCIgPSB4ImBUWj1FRVQtMkVFU1QsTTMuNS4wLzMsTTEwLjUuMC80IGJ1c3lib3ggZGF0ZSAtZCBAMTI2OTczNzk5OWAiCisKKyMgSnVzdCBhZnRlciBEU1Qgc3dpdGNoZWQgb24KK3Rlc3QgeCJTdW4gTWFyIDI4IDA0OjAwOjAxIEVFU1QgMjAxMCIgPSB4ImBUWj1FRVQtMkVFU1QsTTMuNS4wLzMsTTEwLjUuMC80IGJ1c3lib3ggZGF0ZSAtZCBAMTI2OTczODAwMWAiCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZGF0ZS9kYXRlLVItd29ya3MgYi90ZXN0c3VpdGUvZGF0ZS9kYXRlLVItd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEzNzhjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9kYXRlL2RhdGUtUi13b3JrcwpAQCAtMCwwICsxLDEzIEBACisjIFdoZW4gZGlmZmVyZW50IGRhdGUncyB1c2UgdGltZSgpIGFuZCBjbG9ja19nZXR0aW1lKCksCisjIHNlY29uZHMgdHJhbnNpdGlvbiBtYXkgbm90IGhhcHBlbiBhdCBfZXhhY3RseV8gdGhlIHNhbWUgbW9tZW50LgorIyBUaGVyZWZvcmUgd2UgdHJ5IGl0IHNldmVyYWwgdGltZXMuCisKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK3Rlc3QgeCJgZGF0ZSAtUmAiID0geCJgYnVzeWJveCBkYXRlIC1SYCIgJiYgZXhpdCAwIHx8IHRydWUKK2ZhbHNlCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZGF0ZS9kYXRlLWZvcm1hdC13b3JrcyBiL3Rlc3RzdWl0ZS9kYXRlL2RhdGUtZm9ybWF0LXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYTIwOTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZGF0ZS9kYXRlLWZvcm1hdC13b3JrcwpAQCAtMCwwICsxLDQgQEAKKyMgVE9ETzogZ251IGRhdGUgZG9lc24ndCBhY2NlcHQgJzIwMDAuMTEuMjItMTE6MjI6MzMnIGZvcm1hdCwKKyMgYnV0IGFjY2VwdHMgJzIwMDAtMTEtMjIgMTE6MjI6MzMnLiBXZSBtdXN0IGZvbGxvdy4KK3Rlc3QgeCIwMS8wMS85OSIgPSB4ImBidXN5Ym94IGRhdGUgLWQgMTk5OS4wMS4wMS0xMToyMjozMyAnKyVkLyVtLyV5J2AiCit0ZXN0IHgiMjIvMTEvMDAiID0geCJgYnVzeWJveCBkYXRlIC1kIDIwMDAuMTEuMjItMTE6MjI6MzMgJyslZC8lbS8leSdgIgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2RhdGUvZGF0ZS11LXdvcmtzIGIvdGVzdHN1aXRlL2RhdGUvZGF0ZS11LXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYTZlNWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZGF0ZS9kYXRlLXUtd29ya3MKQEAgLTAsMCArMSBAQAordGVzdCB4IlNhdCBKYW4gIDEgMTE6MjI6MzMgVVRDIDIwMDAiID0geCJgVFo9Q0VULTFDRVNULTIgYnVzeWJveCBkYXRlIC11IC1kIDIwMDAuMDEuMDEtMTE6MjI6MzNgIgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2RhdGUvZGF0ZS13b3JrcyBiL3Rlc3RzdWl0ZS9kYXRlL2RhdGUtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVjMjQ2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9kYXRlL2RhdGUtd29ya3MKQEAgLTAsMCArMSw0NiBAQAorZHQ9YGJ1c3lib3ggZGF0ZWAKKyMgRXhwZWN0ZWQgZm9ybWF0OiBGcmkgQXByIDI1IDAzOjQ3OjU1IENFU1QgMjAwOAorZHQ9YGVjaG8gIiRkdCIgfCBzZWQgJ3MvXlteIF1bXiBdW14gXSBbXiBdW14gXVteIF0gWyAwMTIzXVswLTldIFswMTJdWzAtOV06WzAtNV1bMC05XTpbMC02XVswLTldIFtBLVpdW0EtWl0qIFswMTJdWzAtOV1bMC05XVswLTldJC9PSy8nYAordGVzdCB4IiRkdCIgPSB4Ik9LIgorCitkdD1gYnVzeWJveCBkYXRlIC1kIDE6MmAKK2R0PWBlY2hvICIkZHQiIHwgY3V0IC1iMTItMTlgCit0ZXN0IHgiJGR0IiA9IHgiMDE6MDI6MDAiCisKK2R0PWBidXN5Ym94IGRhdGUgLWQgMToyOjNgCitkdD1gZWNobyAiJGR0IiB8IGN1dCAtYjEyLTE5YAordGVzdCB4IiRkdCIgPSB4IjAxOjAyOjAzIgorCitkdD1gYnVzeWJveCBkYXRlIC1kIDEuMi0zOjRgCitkdD1gZWNobyAiJGR0IiB8IGN1dCAtYjUtMTlgCit0ZXN0IHgiJGR0IiA9IHgiSmFuICAyIDAzOjA0OjAwIgorCitkdD1gYnVzeWJveCBkYXRlIC1kIDEuMi0zOjQ6NWAKK2R0PWBlY2hvICIkZHQiIHwgY3V0IC1iNS0xOWAKK3Rlc3QgeCIkZHQiID0geCJKYW4gIDIgMDM6MDQ6MDUiCisKK2R0PWBidXN5Ym94IGRhdGUgLWQgMTk5OS4xLjItMzo0YAorZHQ9YGVjaG8gIiRkdCIgfCBjdXQgLWIxLTE5YAordGVzdCB4IiRkdCIgPSB4IlNhdCBKYW4gIDIgMDM6MDQ6MDAiCisKK2R0PWBidXN5Ym94IGRhdGUgLWQgMTk5OS4xLjItMzo0OjVgCitkdD1gZWNobyAiJGR0IiB8IGN1dCAtYjEtMTlgCit0ZXN0IHgiJGR0IiA9IHgiU2F0IEphbiAgMiAwMzowNDowNSIKKworZHQ9YGJ1c3lib3ggZGF0ZSAtZCAnMTk5OS0xLTIgMzo0OjUnYAorZHQ9YGVjaG8gIiRkdCIgfCBjdXQgLWIxLTE5YAordGVzdCB4IiRkdCIgPSB4IlNhdCBKYW4gIDIgMDM6MDQ6MDUiCisKKyMgZGF0ZSAoR05VIGNvcmV1dGlscykgOC4xNyBkb2Vzbid0IGFjY2VwdCAwMTIzMTEzMyBlaXRoZXI6CisjIGRhdGU6IGludmFsaWQgZGF0ZSAnMDEyMzExMzMnCisjZHQ9YGJ1c3lib3ggZGF0ZSAtZCAwMTIzMTEzM2AKKyNkdD1gZWNobyAiJGR0IiB8IGN1dCAtYjUtMTlgCisjdGVzdCB4IiRkdCIgPSB4IkphbiAyMyAxMTozMzowMCIKKworZHQ9YGJ1c3lib3ggZGF0ZSAtZCAyMDAwMDEyMzExMzNgCitkdD1gZWNobyAiJGR0IiB8IGN1dCAtYjEtMTlgCit0ZXN0IHgiJGR0IiA9IHgiU3VuIEphbiAyMyAxMTozMzowMCIKKworZHQ9YGJ1c3lib3ggZGF0ZSAtZCAyMDAwMDEyMzExMzMuMzBgCitkdD1gZWNobyAiJGR0IiB8IGN1dCAtYjEtMTlgCit0ZXN0IHgiJGR0IiA9IHgiU3VuIEphbiAyMyAxMTozMzozMCIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9kYXRlL2RhdGUtd29ya3MtMSBiL3Rlc3RzdWl0ZS9kYXRlL2RhdGUtd29ya3MtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjUzOTM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2RhdGUvZGF0ZS13b3Jrcy0xCkBAIC0wLDAgKzEsMTM0IEBACit1bnNldCBMQU5HCit1bnNldCBMQU5HVUFHRQordW5zZXQgTENfVElNRQordW5zZXQgTENfQUxMCisKK2R0PWBidXN5Ym94IGRhdGUgLWQgMToyICslVGAKK3Rlc3QgeCIkZHQiID0geCIwMTowMjowMCIKKworZHQ9YGJ1c3lib3ggZGF0ZSAtZCAxOjI6MyArJVRgCit0ZXN0IHgiJGR0IiA9IHgiMDE6MDI6MDMiCisKK2hvc3RfZGF0ZT0vYmluL2RhdGUKKworIyBkYXRlIChHTlUgY29yZXV0aWxzKSA2LjEwIHJlcG9ydHM6CisjCWRhdGU6IGludmFsaWQgZGF0ZSAnMS4yLTM6NCcKKyMgYnVzeWJveCAxLjExLjAuc3ZuIGRhdGUgcmVwb3J0czoKKyMJZGF0ZTogaW52YWxpZCBkYXRlICcxLzIgMzo0JworCisjIFRPRE86ICgxKSBjb21wYXJlIHdpdGggc3RyaW5ncywgbm90ICJob3N0IGRhdGUiCisjICgyKSBpbXBsZW1lbnQgZC9tWy95XSBoaDptbVs6c3NdIGZtdCBpbiBkYXRlIGFwcGxldAorI2hkdD1gJGhvc3RfZGF0ZSAtZCAnMS8yIDM6NCdgCisjZHQ9YGJ1c3lib3ggZGF0ZSAtZCAxLjItMzo0YAorI3Rlc3QgeCIkaGR0IiA9IHgiJGR0IgorCisjaGR0PWAkaG9zdF9kYXRlIC1kICcxLzIgMzo0OjUnYAorI2R0PWBidXN5Ym94IGRhdGUgLWQgMS4yLTM6NDo1YAorI3Rlc3QgeCIkaGR0IiA9IHgiJGR0IgorCisjaGR0PWAkaG9zdF9kYXRlIC1kICcxLzIvMTk5OSAzOjQnYAorI2R0PWBidXN5Ym94IGRhdGUgLWQgMTk5OS4xLjItMzo0YAorI3Rlc3QgeCIkaGR0IiA9IHgiJGR0IgorCisjaGR0PWAkaG9zdF9kYXRlIC1kICcxLzIvMTk5OSAzOjQ6NSdgCisjZHQ9YGJ1c3lib3ggZGF0ZSAtZCAxOTk5LjEuMi0zOjQ6NWAKKyN0ZXN0IHgiJGhkdCIgPSB4IiRkdCIKKworaGR0PWAkaG9zdF9kYXRlIC1kICcxOTk5LTEtMiAzOjQ6NSdgCitkdD1gYnVzeWJveCBkYXRlIC1kICcxOTk5LTEtMiAzOjQ6NSdgCit0ZXN0IHgiJGhkdCIgPSB4IiRkdCIKKworIyBBdm9pZGluZyB1c2luZyB3ZWVrIGRheSBpbiB0aGlzIGV2YWx1YXRpb24sIGFzIGl0J3MgbW9zdGx5IGRpZmZlcmVudCBldmVyeSB5ZWFyCisjIGRhdGUgKEdOVSBjb3JldXRpbHMpIDYuMTAgcmVwb3J0czoKKyMJZGF0ZTogaW52YWxpZCBkYXRlICcwMTIzMTEzMycKKyNkdD1gYnVzeWJveCBkYXRlIC1kIDAxMjMxMTMzICslY2AKKyNkdD1gZWNobyAiJGR0IiB8IGN1dCAtYjUtMTlgCisjdGVzdCB4IiRkdCIgPSB4IkphbiAyMyAxMTozMzowMCIKKworIyBkYXRlIChHTlUgY29yZXV0aWxzKSA2LjEwIHJlcG9ydHM6CisjCWRhdGU6IGludmFsaWQgZGF0ZSAnMDEyMzExMzMyMDAwJworZHQ9YGJ1c3lib3ggZGF0ZSAtZCAyMDAwMDEyMzExMzMgKyVjYAordGVzdCB4IiRkdCIgPSB4IlN1biBKYW4gMjMgMTE6MzM6MDAgMjAwMCIKKworIyBkYXRlIChHTlUgY29yZXV0aWxzKSA2LjEwIHJlcG9ydHM6CisjCWRhdGU6IGludmFsaWQgZGF0ZSAnMDEyMzExMzMyMDAwJworZHQ9YGJ1c3lib3ggZGF0ZSAtZCAyMDAwMDEyMzExMzMuMzAgKyVjYAordGVzdCB4IiRkdCIgPSB4IlN1biBKYW4gMjMgMTE6MzM6MzAgMjAwMCIKKworbGNiYmQ9IkxDX0FMTD1DIGJ1c3lib3ggZGF0ZSIKK3dkPSQoZXZhbCAkbGNiYmQgKyVhKQkJIyB3ZWVrZGF5IG5hbWUKK21uPSQoZXZhbCAkbGNiYmQgKyViKQkJIyBtb250aCBuYW1lCitkbT0kKGV2YWwgJGxjYmJkICslZSkJCSMgZGF5IG9mIG1vbnRoLCBzcGFjZSBwYWRkZWQKK2g9JChldmFsICRsY2JiZCArJUgpCQkjIGhvdXIsIHplcm8gcGFkZGVkCittPSQoZXZhbCAkbGNiYmQgKyVNKQkJIyBtaW51dGUsIHplcm8gcGFkZGVkCitzPSQoZXZhbCAkbGNiYmQgKyVTKQkJIyBzZWNvbmQsIHplcm8gcGFkZGVkCit6PSQoZXZhbCAkbGNiYmQgLXUgKyVaKQkJIyB0aW1lIHpvbmUgYWJicmV2aWF0aW9uCit5PSQoZXZhbCAkbGNiYmQgKyVZKQkJIyB5ZWFyCisKK3Jlcz1PSworY2FzZSAkd2QgaW4KKwlTdW4pCisJCTs7CisJTW9uKQorCQk7OworCVR1ZSkKKwkJOzsKKwlXZWQpCisJCTs7CisJVGh1KQorCQk7OworCUZyaSkKKwkJOzsKKwlTYXQpCisJCTs7CisJKikKKwkJcmVzPUJBRAorCQk7OworZXNhYworCitjYXNlICRtbiBpbgorCUphbikKKwkJOzsKKwlGZWIpCisJCTs7CisJTWFyKQorCQk7OworCUFwcikKKwkJOzsKKwlNYXkpCisJCTs7CisJSnVuKQorCQk7OworCUp1bCkKKwkJOzsKKwlBdWcpCisJCTs7CisJU2VwKQorCQk7OworCU9jdCkKKwkJOzsKKwlOb3YpCisJCTs7CisJRGVjKQorCQk7OworCSopCisJCXJlcz1CQUQKKwkJOzsKK2VzYWMKKworZG09JHtkbSMgKn0KK1sgJGRtIC1nZSAxIF0gJiYgWyAkZG0gLWxlIDMxIF0gfHwgcmVzPUJBRAoraD0ke2gjMH0KK1sgJGggLWdlIDAgXSAmJiBbICRoIC1sZSAyMyBdIHx8IHJlcz1CQUQKK209JHttIzB9CitbICRtIC1nZSAwIF0gJiYgWyAkbSAtbGUgNTkgXSB8fCByZXM9QkFECitzPSR7cyMwfQorWyAkcyAtZ2UgMCBdICYmIFsgJHMgLWxlIDU5IF0gfHwgcmVzPUJBRAorWyAkeiA9IFVUQyBdIHx8IHJlcz1CQUQKK1sgJHkgLWdlIDE5NzAgXSB8fCByZXM9QkFECisKK3Rlc3QgeCIkcmVzIiA9IHhPSworCisjIFRoaXMgc2hvdWxkIGVycm9yIG91dCAoYnkgc2hvd2luZyB1c2FnZSB0ZXh0KS4gVGVzdGluZyBmb3IgdGhhdAorZHQ9YGJ1c3lib3ggZGF0ZSAtZCAwMTIzMTEzMzIwMDAuMzAgJStjIDI+JjEgfCBoZWFkIC1uIDFgCit0ZXN0IHgiJHtkdCMjQnVzeUJveCAqIG11bHRpLWNhbGwgYmluYXJ5Kn0iID0geCIiCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZGMudGVzdHMgYi90ZXN0c3VpdGUvZGMudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTVkYTUzNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9kYy50ZXN0cwpAQCAtMCwwICsxLDU2IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IDIwMTUgYnkgQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAiY29tbWFuZCIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKwordGVzdGluZyAiZGMgYmFzaWMgc3ludGF4IChzdGRpbiwgbXVsdGlwbGUgYXJncykiIFwKKwkiZGMiIFwKKwkiMzBcbiIgXAorCSIiICIxMCAyMCtwIgorCit0ZXN0aW5nICJkYyBiYXNpYyBzeW50YXggKGFyZ3YsIHNpbmdsZSBhcmcpIiBcCisJImRjICcxMCAyMCtwJyIgXAorCSIzMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAiZGMgYmFzaWMgc3ludGF4IChhcmd2LCBtdWx0aXBsZSBhcmdzKSIgXAorCSJkYyAxMCAyMCtwIiBcCisJIjMwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJkYyBjb21wbGV4IHdpdGggc3BhY2VzIChzaW5nbGUgYXJnKSIgXAorCSJkYyAnOCA4ICogMiAyICsgLyBwJyIgXAorCSIxNlxuIiBcCisJIiIgIiIKKwordGVzdGluZyAiZGMgY29tcGxleCB3aXRob3V0IHNwYWNlcyAoc2luZ2xlIGFyZykiIFwKKwkiZGMgJzggOCoyIDIrL3AnIiBcCisJIjE2XG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJkYyBjb21wbGV4IHdpdGggc3BhY2VzIChtdWx0aXBsZSBhcmdzKSIgXAorCSJkYyA4IDggXCogMiAyICsgLyBwIiBcCisJIjE2XG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJkYyBjb21wbGV4IHdpdGhvdXQgc3BhY2VzIChtdWx0aXBsZSBhcmdzKSIgXAorCSJkYyA4IDhcKjIgMisvcCIgXAorCSIxNlxuIiBcCisJIiIgIiIKKworZXhpdCAkRkFJTENPVU5UCisKKyMgd2UgZG8gbm90IHN1cHBvcnQgYXJndW1lbnRzCit0ZXN0aW5nICJkYyAtZSA8ZXhwcnM+IiBcCisJImRjIC1lICcxMCAyK2YnIiBcCisJIjEyXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJkYyAtZiA8ZXhwcnMtZnJvbS1naXZlbi1maWxlPiIgXAorCSJkYyAtZiBpbnB1dCIgXAorCSIxMlxuIiBcCisJIjEwIDIrZiIgIiIKKwpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2RkL2RkLWFjY2VwdHMtaWYgYi90ZXN0c3VpdGUvZGQvZGQtYWNjZXB0cy1pZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2QxYWY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2RkL2RkLWFjY2VwdHMtaWYKQEAgLTAsMCArMSwyIEBACitlY2hvIEkgV0FOVCA+Zm9vCit0ZXN0ICIkKGJ1c3lib3ggZGQgaWY9Zm9vIDI+L2Rldi9udWxsKSIgPSAiSSBXQU5UIgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2RkL2RkLWFjY2VwdHMtb2YgYi90ZXN0c3VpdGUvZGQvZGQtYWNjZXB0cy1vZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDQwNWU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2RkL2RkLWFjY2VwdHMtb2YKQEAgLTAsMCArMSwyIEBACitlY2hvIEkgV0FOVCB8IGJ1c3lib3ggZGQgb2Y9Zm9vIDI+L2Rldi9udWxsCitlY2hvIEkgV0FOVCB8IGNtcCBmb28gLQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2RkL2RkLWNvcGllcy1mcm9tLXN0YW5kYXJkLWlucHV0LXRvLXN0YW5kYXJkLW91dHB1dCBiL3Rlc3RzdWl0ZS9kZC9kZC1jb3BpZXMtZnJvbS1zdGFuZGFyZC1pbnB1dC10by1zdGFuZGFyZC1vdXRwdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg5MGViMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9kZC9kZC1jb3BpZXMtZnJvbS1zdGFuZGFyZC1pbnB1dC10by1zdGFuZGFyZC1vdXRwdXQKQEAgLTAsMCArMSBAQAordGVzdCAiJChlY2hvIEkgV0FOVCB8IGJ1c3lib3ggZGQgMj4vZGV2L251bGwpIiA9ICJJIFdBTlQiCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZGQvZGQtcHJpbnRzLWNvdW50LXRvLXN0YW5kYXJkLWVycm9yIGIvdGVzdHN1aXRlL2RkL2RkLXByaW50cy1jb3VudC10by1zdGFuZGFyZC1lcnJvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTg3ZGMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2RkL2RkLXByaW50cy1jb3VudC10by1zdGFuZGFyZC1lcnJvcgpAQCAtMCwwICsxLDIgQEAKK2VjaG8gSSBXQU5UIHwgYnVzeWJveCBkZCBvZj1mb28gPi9kZXYvbnVsbCAyPmJhcgorZ3JlcCAtcSByZWNvcmRzIGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2RkL2RkLXJlcG9ydHMtd3JpdGUtZXJyb3JzIGIvdGVzdHN1aXRlL2RkL2RkLXJlcG9ydHMtd3JpdGUtZXJyb3JzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MjA2MDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZGQvZGQtcmVwb3J0cy13cml0ZS1lcnJvcnMKQEAgLTAsMCArMSwyIEBACitidXN5Ym94IGRkIGlmPSIkMCIgb2Y9L2Rldi9mdWxsIDI+L2Rldi9udWxsIHx8IHN0YXR1cz0kPwordGVzdCAkc3RhdHVzID0gMQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2RpZmYudGVzdHMgYi90ZXN0c3VpdGUvZGlmZi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wY2VkMGYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2RpZmYudGVzdHMKQEAgLTAsMCArMSwyNDAgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgMjAwOCBieSBEZW55cyBWbGFzZW5rbworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmRzIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCisjIGRpZmYgb3V0cHV0cyBkYXRlL3RpbWUgaW4gdGhlIGhlYWRlciwgd2hpY2ggc2hvdWxkIG5vdCBiZSBhbmFseXNlZAorIyBOQjogc2VkIGhhcyB0YWIgY2hhcmFjdGVyIGluIHMgY29tbWFuZCEKK1RSSU1fVEFCPSJzZWQgJ3MvCS4qLy8nIgorCit0ZXN0aW5nICJkaWZmIG9mIHN0ZGluIiBcCisJImRpZmYgLXUgLSBpbnB1dCB8ICRUUklNX1RBQiIgXAorIlwKKy0tLSAtCisrKysgaW5wdXQKK0BAIC0xICsxLDMgQEAKKytxd2UKKyBhc2QKKyt6eGMKKyIgXAorCSJxd2VcbmFzZFxuenhjXG4iIFwKKwkiYXNkXG4iCisKK3Rlc3RpbmcgImRpZmYgb2Ygc3RkaW4sIG5vIG5ld2xpbmUgaW4gdGhlIGZpbGUiIFwKKwkiZGlmZiAtdSAtIGlucHV0IHwgJFRSSU1fVEFCIiBcCisiXAorLS0tIC0KKysrKyBpbnB1dAorQEAgLTEgKzEsMyBAQAorK3F3ZQorIGFzZAorK3p4YworXFwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorIiBcCisJInF3ZVxuYXNkXG56eGMiIFwKKwkiYXNkXG4iCisKKyMgd2UgYWxzbyB0ZXN0IHRoYXQgc3RkaW4gaXMgaW4gZmFjdCBOT1QgcmVhZAordGVzdGluZyAiZGlmZiBvZiBzdGRpbiwgdHdpY2UiIFwKKwknZGlmZiAtIC07IGVjaG8gJD87IHdjIC1jJyBcCisJIjBcbjVcbiIgXAorCSIiIFwKKwkic3RkaW4iCisKK3Rlc3RpbmcgImRpZmYgb2YgZW1wdHkgZmlsZSBhZ2FpbnN0IHN0ZGluIiBcCisJImRpZmYgLXUgLSBpbnB1dCB8ICRUUklNX1RBQiIgXAorIlwKKy0tLSAtCisrKysgaW5wdXQKK0BAIC0xICswLDAgQEAKKy1hCisiIFwKKwkiIiBcCisJImFcbiIKKwordGVzdGluZyAiZGlmZiBvZiBlbXB0eSBmaWxlIGFnYWluc3Qgbm9uZW1wdHkgb25lIiBcCisJImRpZmYgLXUgLSBpbnB1dCB8ICRUUklNX1RBQiIgXAorIlwKKy0tLSAtCisrKysgaW5wdXQKK0BAIC0wLDAgKzEgQEAKKythCisiIFwKKwkiYVxuIiBcCisJIiIKKwordGVzdGluZyAiZGlmZiAtYiB0cmVhdHMgRU9GIGFzIHdoaXRlc3BhY2UiIFwKKwknZGlmZiAtdWIgLSBpbnB1dDsgZWNobyAkPycgXAorCSIwXG4iIFwKKwkiYWJjIiBcCisJImFiYyAiCisKK3Rlc3RpbmcgImRpZmYgLWIgdHJlYXRzIGFsbCBzcGFjZXMgYXMgZXF1YWwiIFwKKwknZGlmZiAtdWIgLSBpbnB1dDsgZWNobyAkPycgXAorCSIwXG4iIFwKKwkiYSBcdCBjXG4iIFwKKwkiYVx0IFx0Y1xuIgorCit0ZXN0aW5nICJkaWZmIC1CIGlnbm9yZXMgY2hhbmdlcyB3aG9zZSBsaW5lcyBhcmUgYWxsIGJsYW5rIiBcCisJJ2RpZmYgLXVCIC0gaW5wdXQ7IGVjaG8gJD8nIFwKKwkiMFxuIiBcCisJImFcbiIgXAorCSJcbmFcblxuIgorCit0ZXN0aW5nICJkaWZmIC1CIGRvZXMgbm90IGlnbm9yZSBjaGFuZ2VzIHdob3NlIGxpbmVzIGFyZSBub3QgYWxsIGJsYW5rIiBcCisJImRpZmYgLXVCIC0gaW5wdXQgfCAkVFJJTV9UQUIiIFwKKyJcCistLS0gLQorKysrIGlucHV0CitAQCAtMSwzICsxIEBACistCistYgorLQorK2EKKyIgXAorCSJhXG4iIFwKKwkiXG5iXG5cbiIKKwordGVzdGluZyAiZGlmZiAtQiBpZ25vcmVzIGJsYW5rIHNpbmdsZSBsaW5lIGNoYW5nZSIgXAorCSdkaWZmIC1xQiAtIGlucHV0OyBlY2hvICQ/JyBcCisJIjBcbiIgXAorCSJcbjFcbiIgXAorCSIxXG4iCisKK3Rlc3RpbmcgImRpZmYgLUIgZG9lcyBub3QgaWdub3JlIG5vbi1ibGFuayBzaW5nbGUgbGluZSBjaGFuZ2UiIFwKKwknZGlmZiAtcUIgLSBpbnB1dDsgZWNobyAkPycgXAorCSJGaWxlcyAtIGFuZCBpbnB1dCBkaWZmZXJcbjFcbiIgXAorCSIwXG4iIFwKKwkiMVxuIgorCit0ZXN0aW5nICJkaWZmIGFsd2F5cyB0YWtlcyBjb250ZXh0IGZyb20gb2xkIGZpbGUiIFwKKwkiZGlmZiAtdWIgLSBpbnB1dCB8ICRUUklNX1RBQiIgXAorIlwKKy0tLSAtCisrKysgaW5wdXQKK0BAIC0xICsxLDMgQEAKKythYmMKKyBhIGMKKytkZWYKKyIgXAorCSJhYmNcbmEgIGNcbmRlZlxuIiBcCisJImEgY1xuIgorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmRzIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCisjIGNsZWFuIHVwCitybSAtcmYgZGlmZjEgZGlmZjIKKworbWtkaXIgZGlmZjEgZGlmZjIgZGlmZjIvc3ViZGlyCitlY2hvIHF3ZSA+ZGlmZjEvLQorZWNobyBhc2QgPmRpZmYyL3N1YmRpci8tCitvcHRpb25hbCBGRUFUVVJFX0RJRkZfRElSCit0ZXN0aW5nICJkaWZmIGRpZmYxIGRpZmYyL3N1YmRpciIgXAorCSJkaWZmIC11ciBkaWZmMSBkaWZmMi9zdWJkaXIgfCAkVFJJTV9UQUIiIFwKKyJcCistLS0gZGlmZjEvLQorKysrIGRpZmYyL3N1YmRpci8tCitAQCAtMSArMSBAQAorLXF3ZQorK2FzZAorIiBcCisJIiIgIiIKK1NLSVA9CisKKyMgdXNpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZSBmcm9tIHByZXYgdGVzdC4uLgorb3B0aW9uYWwgRkVBVFVSRV9ESUZGX0RJUgordGVzdGluZyAiZGlmZiBkaXIgZGlyMi9maWxlLy0iIFwKKwkiZGlmZiAtdXIgZGlmZjEgZGlmZjIvc3ViZGlyLy0gfCAkVFJJTV9UQUIiIFwKKyJcCistLS0gZGlmZjEvLQorKysrIGRpZmYyL3N1YmRpci8tCitAQCAtMSArMSBAQAorLXF3ZQorK2FzZAorIiBcCisJIiIgIiIKK1NLSVA9CisKKyMgdXNpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZSBmcm9tIHByZXYgdGVzdC4uLgorbWtkaXIgZGlmZjEvdGVzdAorbWtmaWZvIGRpZmYyL3N1YmRpci90ZXN0CitvcHRpb25hbCBGRUFUVVJFX0RJRkZfRElSCit0ZXN0aW5nICJkaWZmIG9mIGRpciBhbmQgZmlmbyIgXAorCSJkaWZmIC11ciBkaWZmMSBkaWZmMi9zdWJkaXIgfCAkVFJJTV9UQUIiIFwKKyJcCistLS0gZGlmZjEvLQorKysrIGRpZmYyL3N1YmRpci8tCitAQCAtMSArMSBAQAorLXF3ZQorK2FzZAorT25seSBpbiBkaWZmMi9zdWJkaXI6IHRlc3QKKyIgXAorCSIiICIiCitTS0lQPQorCisjIHVzaW5nIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZnJvbSBwcmV2IHRlc3QuLi4KK3JtZGlyIGRpZmYxL3Rlc3QKK2VjaG8gPmRpZmYxL3Rlc3QKK29wdGlvbmFsIEZFQVRVUkVfRElGRl9ESVIKK3Rlc3RpbmcgImRpZmYgb2YgZmlsZSBhbmQgZmlmbyIgXAorCSJkaWZmIC11ciBkaWZmMSBkaWZmMi9zdWJkaXIgfCAkVFJJTV9UQUIiIFwKKyJcCistLS0gZGlmZjEvLQorKysrIGRpZmYyL3N1YmRpci8tCitAQCAtMSArMSBAQAorLXF3ZQorK2FzZAorRmlsZSBkaWZmMi9zdWJkaXIvdGVzdCBpcyBub3QgYSByZWd1bGFyIGZpbGUgb3IgZGlyZWN0b3J5IGFuZCB3YXMgc2tpcHBlZAorIiBcCisJIiIgIiIKK1NLSVA9CisKKyMgdXNpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZSBmcm9tIHByZXYgdGVzdC4uLgorbWtmaWZvIGRpZmYxL3Rlc3QyCitvcHRpb25hbCBGRUFUVVJFX0RJRkZfRElSCit0ZXN0aW5nICJkaWZmIC1yTiBkb2VzIG5vdCByZWFkIG5vbi1yZWd1bGFyIGZpbGVzIiBcCisJImRpZmYgLXVyTiBkaWZmMSBkaWZmMi9zdWJkaXIgfCAkVFJJTV9UQUIiIFwKKyJcCistLS0gZGlmZjEvLQorKysrIGRpZmYyL3N1YmRpci8tCitAQCAtMSArMSBAQAorLXF3ZQorK2FzZAorRmlsZSBkaWZmMi9zdWJkaXIvdGVzdCBpcyBub3QgYSByZWd1bGFyIGZpbGUgb3IgZGlyZWN0b3J5IGFuZCB3YXMgc2tpcHBlZAorRmlsZSBkaWZmMS90ZXN0MiBpcyBub3QgYSByZWd1bGFyIGZpbGUgb3IgZGlyZWN0b3J5IGFuZCB3YXMgc2tpcHBlZAorIiBcCisJIiIgIiIKK1NLSVA9CisKKyMgY2xlYW4gdXAKK3JtIC1yZiBkaWZmMSBkaWZmMgorCisjIE5PVCB1c2luZyBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0Li4uCitta2RpciBkaWZmMSBkaWZmMgorZWNobyBxd2UgPmRpZmYxLy0KK2VjaG8gcnR5ID5kaWZmMi8tCitvcHRpb25hbCBGRUFUVVJFX0RJRkZfRElSCit0ZXN0aW5nICJkaWZmIGRpZmYxIGRpZmYyLyIgXAorCSJkaWZmIC11ciBkaWZmMSBkaWZmMi8gfCAkVFJJTV9UQUI7IGRpZmYgLXVyIC4vLy9kaWZmMSBkaWZmMi8vLy8gfCAkVFJJTV9UQUIiIFwKKyJcCistLS0gZGlmZjEvLQorKysrIGRpZmYyLy0KK0BAIC0xICsxIEBACistcXdlCisrcnR5CistLS0gLi8vL2RpZmYxLy0KKysrKyBkaWZmMi8vLy8tCitAQCAtMSArMSBAQAorLXF3ZQorK3J0eQorIiBcCisJIiIgIiIKK1NLSVA9CisKKyMgY2xlYW4gdXAKK3JtIC1yZiBkaWZmMSBkaWZmMgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1hYnNvbHV0ZS1wYXRoIGIvdGVzdHN1aXRlL2Rpcm5hbWUvZGlybmFtZS1oYW5kbGVzLWFic29sdXRlLXBhdGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ExYTUxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1hYnNvbHV0ZS1wYXRoCkBAIC0wLDAgKzEgQEAKK3Rlc3QgJChidXN5Ym94IGRpcm5hbWUgL2Zvby9iYXIvYmF6KSA9IC9mb28vYmFyCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZGlybmFtZS9kaXJuYW1lLWhhbmRsZXMtZW1wdHktcGF0aCBiL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1lbXB0eS1wYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTM0YTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZGlybmFtZS9kaXJuYW1lLWhhbmRsZXMtZW1wdHktcGF0aApAQCAtMCwwICsxIEBACit0ZXN0ICQoYnVzeWJveCBkaXJuYW1lICcnKSA9IC4KZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1tdWx0aXBsZS1zbGFzaGVzIGIvdGVzdHN1aXRlL2Rpcm5hbWUvZGlybmFtZS1oYW5kbGVzLW11bHRpcGxlLXNsYXNoZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg2ZjI1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1tdWx0aXBsZS1zbGFzaGVzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgJChidXN5Ym94IGRpcm5hbWUgZm9vL2Jhci8vL2JheikgPSBmb28vYmFyCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZGlybmFtZS9kaXJuYW1lLWhhbmRsZXMtcmVsYXRpdmUtcGF0aCBiL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1yZWxhdGl2ZS1wYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmZTRhYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZGlybmFtZS9kaXJuYW1lLWhhbmRsZXMtcmVsYXRpdmUtcGF0aApAQCAtMCwwICsxIEBACit0ZXN0ICQoYnVzeWJveCBkaXJuYW1lIGZvby9iYXIvYmF6KSA9IGZvby9iYXIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1yb290IGIvdGVzdHN1aXRlL2Rpcm5hbWUvZGlybmFtZS1oYW5kbGVzLXJvb3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkNjJiOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1yb290CkBAIC0wLDAgKzEgQEAKK3Rlc3QgJChidXN5Ym94IGRpcm5hbWUgLykgPSAvCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZGlybmFtZS9kaXJuYW1lLWhhbmRsZXMtc2luZ2xlLWNvbXBvbmVudCBiL3Rlc3RzdWl0ZS9kaXJuYW1lL2Rpcm5hbWUtaGFuZGxlcy1zaW5nbGUtY29tcG9uZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZjlhZTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZGlybmFtZS9kaXJuYW1lLWhhbmRsZXMtc2luZ2xlLWNvbXBvbmVudApAQCAtMCwwICsxIEBACit0ZXN0ICQoYnVzeWJveCBkaXJuYW1lIGZvbykgPSAuCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZGlybmFtZS9kaXJuYW1lLXdvcmtzIGIvdGVzdHN1aXRlL2Rpcm5hbWUvZGlybmFtZS13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjczZGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2Rpcm5hbWUvZGlybmFtZS13b3JrcwpAQCAtMCwwICsxIEBACit0ZXN0IHgkKGRpcm5hbWUgJChwd2QpKSA9IHgkKGJ1c3lib3ggZGlybmFtZSAkKHB3ZCkpCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZHUvZHUtaC13b3JrcyBiL3Rlc3RzdWl0ZS9kdS9kdS1oLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNzdiNjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZHUvZHUtaC13b3JrcwpAQCAtMCwwICsxLDQgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUKKworZGQgaWY9L2Rldi96ZXJvIG9mPWZpbGUgYnM9MU0gY291bnQ9MSAyPi9kZXYvbnVsbAordGVzdCB4ImBidXN5Ym94IGR1IC1oIGZpbGVgIiA9IHgiMS4wTQlmaWxlIgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2R1L2R1LWstd29ya3MgYi90ZXN0c3VpdGUvZHUvZHUtay13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTNlOWJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2R1L2R1LWstd29ya3MKQEAgLTAsMCArMSwxMyBAQAorbWtkaXIgZHUudGVzdGRpcgorY2QgZHUudGVzdGRpcgorZGQgaWY9L2Rldi96ZXJvIG9mPWZpbGUxIGJzPTFrIGNvdW50PTY0IDI+L2Rldi9udWxsCitkZCBpZj0vZGV2L3plcm8gb2Y9ZmlsZTIgYnM9MWsgY291bnQ9MTYgMj4vZGV2L251bGwKKyMgZXh0NCBvbiBpbWFnZXMgPDUxMk0gZ2l2ZXMgODFrYgorIyBleHQzIG9uIGltYWdlcyA8NTEyTSBnaXZlcyA4M2tiCisjIGEgYnNkIHN5c3RlbSByZXBvcnRlZGx5IGdpdmVzIDgya2IKK3Rlc3QgeCJgYnVzeWJveCBkdSAtayAuYCIgPSB4IjgwCS4iIFwKKyAgLW8geCJgYnVzeWJveCBkdSAtayAuYCIgPSB4IjgxCS4iIFwKKyAgLW8geCJgYnVzeWJveCBkdSAtayAuYCIgPSB4IjgyCS4iIFwKKyAgLW8geCJgYnVzeWJveCBkdSAtayAuYCIgPSB4IjgzCS4iIFwKKyAgLW8geCJgYnVzeWJveCBkdSAtayAuYCIgPSB4Ijg0CS4iIFwKKyAgLW8geCJgYnVzeWJveCBkdSAtayAuYCIgPSB4Ijg4CS4iCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZHUvZHUtbC13b3JrcyBiL3Rlc3RzdWl0ZS9kdS9kdS1sLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmODczNDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZHUvZHUtbC13b3JrcwpAQCAtMCwwICsxLDEyIEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLCisKK21rZGlyIGR1LnRlc3RkaXIKK2NkIGR1LnRlc3RkaXIKK2RkIGlmPS9kZXYvemVybyBvZj1maWxlMSBicz0xayBjb3VudD02NCAyPi9kZXYvbnVsbAorbG4gZmlsZTEgZmlsZTEuMQorZGQgaWY9L2Rldi96ZXJvIG9mPWZpbGUyIGJzPTFrIGNvdW50PTE2IDI+L2Rldi9udWxsCit0ZXN0IHgiYGJ1c3lib3ggZHUgLWwgLmAiID0geCIxNDQJLiIgXAorICAtbyB4ImBidXN5Ym94IGR1IC1sIC5gIiA9IHgiMTQ2CS4iIFwKKyAgLW8geCJgYnVzeWJveCBkdSAtbCAuYCIgPSB4IjE0OAkuIiBcCisgIC1vIHgiYGJ1c3lib3ggZHUgLWwgLmAiID0geCIxNTIJLiIgXAorICAtbyB4ImBidXN5Ym94IGR1IC1sIC5gIiA9IHgiMTU2CS4iCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZHUvZHUtbS13b3JrcyBiL3Rlc3RzdWl0ZS9kdS9kdS1tLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmYTc0MzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZHUvZHUtbS13b3JrcwpAQCAtMCwwICsxLDQgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfSFVNQU5fUkVBREFCTEUKKworZGQgaWY9L2Rldi96ZXJvIG9mPWZpbGUgYnM9MU0gY291bnQ9MSAyPi9kZXYvbnVsbAordGVzdCB4ImBidXN5Ym94IGR1IC1tIC5gIiA9IHgiMQkuIgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2R1L2R1LXMtd29ya3MgYi90ZXN0c3VpdGUvZHUvZHUtcy13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzQ0MzJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2R1L2R1LXMtd29ya3MKQEAgLTAsMCArMSw4IEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX0RVX0RFRkFVTFRfQkxPQ0tTSVpFXzFLCisKK2Q9L2JpbgorZHUgLXMgIiRkIiA+IGxvZ2ZpbGUuZ251CitidXN5Ym94IGR1IC1zICIkZCIgPiBsb2dmaWxlLmJiCitjbXAgbG9nZmlsZS5nbnUgbG9nZmlsZS5iYiAmJiBleGl0IDAKK2RpZmYgLXUgbG9nZmlsZS5nbnUgbG9nZmlsZS5iYgorZXhpdCAxCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZHUvZHUtd29ya3MgYi90ZXN0c3VpdGUvZHUvZHUtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyMGYxZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9kdS9kdS13b3JrcwpAQCAtMCwwICsxLDggQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfRFVfREVGQVVMVF9CTE9DS1NJWkVfMUsKKworZD0vYmluCitkdSAiJGQiID4gbG9nZmlsZS5nbnUKK2J1c3lib3ggZHUgIiRkIiA+IGxvZ2ZpbGUuYmIKK2NtcCBsb2dmaWxlLmdudSBsb2dmaWxlLmJiICYmIGV4aXQgMAorZGlmZiAtdSBsb2dmaWxlLmdudSBsb2dmaWxlLmJiCitleGl0IDEKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tZG9lcy1ub3QtcHJpbnQtbmV3bGluZSBiL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tZG9lcy1ub3QtcHJpbnQtbmV3bGluZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODU3YzBkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2VjaG8vZWNoby1kb2VzLW5vdC1wcmludC1uZXdsaW5lCkBAIC0wLDAgKzEsMyBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9GQU5DWV9FQ0hPCisKK3Rlc3QgYGJ1c3lib3ggZWNobyAtbiB3b3JkIHwgd2MgLWNgIC1lcSA0CmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1hcmd1bWVudCBiL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLWFyZ3VtZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3OWRhYzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1hcmd1bWVudApAQCAtMCwwICsxIEBACit0ZXN0IHhmdWJhciA9IHhgYnVzeWJveCBlY2hvIGZ1YmFyYApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtYXJndW1lbnRzIGIvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtYXJndW1lbnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNGUzYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1hcmd1bWVudHMKQEAgLTAsMCArMSBAQAordGVzdCAiYGJ1c3lib3ggZWNobyBmb28gYmFyYCIgPSAiZm9vIGJhciIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLWRhc2ggYi90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1kYXNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkY2RiYWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1kYXNoCkBAIC0wLDAgKzEgQEAKK3Rlc3QgImBidXN5Ym94IGVjaG8gLSB8IG9kIC10IHgxIHwgaGVhZCAtbiAxYCIgPSAiMDAwMDAwMCAyZCAwYSIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLW5ld2xpbmUgYi90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1uZXdsaW5lCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzODY3MWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1uZXdsaW5lCkBAIC0wLDAgKzEgQEAKK3Rlc3QgYGJ1c3lib3ggZWNobyB3b3JkIHwgd2MgLWNgIC1lcSA1CmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1ub24tb3B0cyBiL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLW5vbi1vcHRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZDFlMjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1ub24tb3B0cwpAQCAtMCwwICsxIEBACit0ZXN0ICJgYnVzeWJveCBlY2hvIC1uZUVaIHwgb2QgLXQgeDEgfCBoZWFkIC1uIDFgIiA9ICIwMDAwMDAwIDJkIDZlIDY1IDQ1IDVhIDBhIgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtc2xhc2gtemVybyBiL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLXNsYXNoLXplcm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3ZWQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLXNsYXNoLXplcm8KQEAgLTAsMCArMSwzIEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX0ZBTkNZX0VDSE8KKwordGVzdCAiYGJ1c3lib3ggZWNobyAtZSAtbiAnbXNnXG5cMCcgfCBvZCAtdCB4MSB8IGhlYWQgLW4gMWAiID0gIjAwMDAwMDAgNmQgNzMgNjcgMGEgMDAiCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1zbGFzaF8wMDA0MSBiL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLXNsYXNoXzAwMDQxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZmZhYmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1zbGFzaF8wMDA0MQpAQCAtMCwwICsxLDMgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfRkFOQ1lfRUNITworCit0ZXN0ICJgYnVzeWJveCBlY2hvIC1uZSAnXDAwMDQxeicgfCBvZCAtdCB4MSB8IGhlYWQgLW4gMWAiID0gIjAwMDAwMDAgMDQgMzEgN2EiCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1zbGFzaF8wMDQxIGIvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtc2xhc2hfMDA0MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDc0MjlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtc2xhc2hfMDA0MQpAQCAtMCwwICsxLDMgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfRkFOQ1lfRUNITworCit0ZXN0ICJgYnVzeWJveCBlY2hvIC1uZSAnXDAwNDF6JyB8IG9kIC10IHgxIHwgaGVhZCAtbiAxYCIgPSAiMDAwMDAwMCAyMSA3YSIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLXNsYXNoXzA0MSBiL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLXNsYXNoXzA0MQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDcwY2VjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2VjaG8vZWNoby1wcmludHMtc2xhc2hfMDQxCkBAIC0wLDAgKzEsMyBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9GQU5DWV9FQ0hPCisKK3Rlc3QgImBidXN5Ym94IGVjaG8gLW5lICdcMDQxeicgfCBvZCAtdCB4MSB8IGhlYWQgLW4gMWAiID0gIjAwMDAwMDAgMjEgN2EiCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1zbGFzaF80MSBiL3Rlc3RzdWl0ZS9lY2hvL2VjaG8tcHJpbnRzLXNsYXNoXzQxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkODk5OWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZWNoby9lY2hvLXByaW50cy1zbGFzaF80MQpAQCAtMCwwICsxLDMgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfRkFOQ1lfRUNITworCit0ZXN0ICJgYnVzeWJveCBlY2hvIC1uZSAnXDQxeicgfCBvZCAtdCB4MSB8IGhlYWQgLW4gMWAiID0gIjAwMDAwMDAgMjEgN2EiCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZXhwYW5kLnRlc3RzIGIvdGVzdHN1aXRlL2V4cGFuZC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4wNjgyYzI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2V4cGFuZC50ZXN0cwpAQCAtMCwwICsxLDI0IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IDIwMDggYnkgRGVueXMgVmxhc2Vua28KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKK3Rlc3QgLWYgIiRiaW5kaXIvLmNvbmZpZyIgJiYgLiAiJGJpbmRpci8uY29uZmlnIgorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgIm9wdGlvbnMiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKK3Rlc3RpbmcgImV4cGFuZCIgXAorCSJleHBhbmQiIFwKKwkiICAgICAgICAxMjM0NTY3OCAgICAgICAgMTIzNDU2NzhcbiIgXAorCSIiIFwKKwkiXHQxMjM0NTY3OFx0MTIzNDU2NzhcbiIKKwordGVzdCB4IiRDT05GSUdfVU5JQ09ERV9TVVBQT1JUIiA9IHgieSIgXAorJiYgdGVzdCB4IiRDT05GSUdfVU5JQ09ERV9VU0lOR19MT0NBTEUiICE9IHgieSIgXAorJiYgdGVzdGluZyAiZXhwYW5kIHdpdGggdW5pY29kZSBjaGFyYWNoZXIgMHgzOTQiIFwKKwkiZXhwYW5kIiBcCisJIs6UICAgICAgIDEyMzQ1zpTOlM6UICAgICAgICAxMjM0NTY3OFxuIiBcCisJIiIgXAorCSLOlFx0MTIzNDXOlM6UzpRcdDEyMzQ1Njc4XG4iCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2V4cGFuZC9leHBhbmQtd29ya3MtbGlrZS1HTlUgYi90ZXN0c3VpdGUvZXhwYW5kL2V4cGFuZC13b3Jrcy1saWtlLUdOVQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDI3OGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2V4cGFuZC9leHBhbmQtd29ya3MtbGlrZS1HTlUKQEAgLTAsMCArMSwyMCBAQAorIyBGRUFUVVJFOiBDT05GSUdfVU5FWFBBTkQKKworcm0gLWYgZm9vIGJhcgorJEVDSE8gLWUgIlx0eSIgfCBleHBhbmQgLXQgMyAuLi8uLi9idXN5Ym94ID4gZm9vCiskRUNITyAtZSAiXHR5IiB8IGJ1c3lib3ggdW5leHBhbmQgLXQgMyAuLi8uLi9idXN5Ym94ID4gYmFyCitzZXQgK2UKK3Rlc3QgISAtZiBmb28gLWEgLWYgYmFyCitpZiBbICQ/ID0gMCBdIDsgdGhlbgorCXNldCAtZQorCWRpZmYgLXEgZm9vIGJhcgorZmkKK3JtIC1mIGZvbyBiYXIKKyRFQ0hPIC1lICJcdHlcdHgiIHwgZXhwYW5kIC1pdCAzIC4uLy4uL2J1c3lib3ggPiBmb28KKyRFQ0hPIC1lICJcdHlcdHgiIHwgYnVzeWJveCB1bmV4cGFuZCAtaXQgMyAuLi8uLi9idXN5Ym94ID4gYmFyCitzZXQgK2UKK3Rlc3QgISAtZiBmb28gLWEgLWYgYmFyCitpZiBbICQ/ID0gMCBdIDsgdGhlbgorCXNldCAtZQorCWRpZmYgLXEgZm9vIGJhcgorZmkKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9leHByL2V4cHItYmlnIGIvdGVzdHN1aXRlL2V4cHIvZXhwci1iaWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkYmJiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9leHByL2V4cHItYmlnCkBAIC0wLDAgKzEsMTYgQEAKKyMgYnVzeWJveCBleHByCisKKyMgMyoxMDAwKjEwMDAqMTAwMCBvdmVyZmxvd3MgMzItYml0IHNpZ25lZCBpbnQKK3Jlcz1gYnVzeWJveCBleHByIDAgJzwnIDMwMDAwMDAwMDBgCitbIHgiJHJlcyIgPSB4MSBdIHx8IGV4aXQgMQorCisjIDkyMjMzNzIwMzY4NTQ3NzU4MDcgPSAyXjMxLTEKK3Jlcz1gYnVzeWJveCBleHByIDAgJzwnIDkyMjMzNzIwMzY4NTQ3NzU4MDdgCitbIHgiJHJlcyIgPSB4MSBdIHx8IGV4aXQgMQorIyBjb3JldXRpbHMgZmFpbHMgdGhpcyBvbmUhCityZXM9YGJ1c3lib3ggZXhwciAtOTIyMzM3MjAzNjg1NDc3NTgwMCAnPCcgOTIyMzM3MjAzNjg1NDc3NTgwN2AKK1sgeCIkcmVzIiA9IHgxIF0gfHwgZXhpdCAxCisKKyMgVGhpcyBvbmUgd29ya3Mgb25seSBieSBjaGFuY2UKKyMgcmVzPWBidXN5Ym94IGV4cHIgMCAnPCcgOTIyMzM3MjAzNjg1NDc3NTgwOGAKKyMgWyB4IiRyZXMiID0geDEgXSB8fCBleGl0IDEKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9leHByL2V4cHItd29ya3MgYi90ZXN0c3VpdGUvZXhwci9leHByLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMGZmZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZXhwci9leHByLXdvcmtzCkBAIC0wLDAgKzEsNTggQEAKKyMgYnVzeWJveCBleHByCitidXN5Ym94IGV4cHIgMSBcfCAxCitidXN5Ym94IGV4cHIgMSBcfCAwCitidXN5Ym94IGV4cHIgMCBcfCAxCitidXN5Ym94IGV4cHIgMSBcJiAxCitidXN5Ym94IGV4cHIgMCBcPCAxCitidXN5Ym94IGV4cHIgMSBcPiAwCitidXN5Ym94IGV4cHIgMCBcPD0gMQorYnVzeWJveCBleHByIDEgXDw9IDEKK2J1c3lib3ggZXhwciAxIFw+PSAwCitidXN5Ym94IGV4cHIgMSBcPj0gMQorYnVzeWJveCBleHByIDEgKyAyCitidXN5Ym94IGV4cHIgMiAtIDEKK2J1c3lib3ggZXhwciAyIFwqIDMKK2J1c3lib3ggZXhwciAxMiAvIDIKK2J1c3lib3ggZXhwciAxMiAlIDUKKworCitzZXQgK2UKK2J1c3lib3ggZXhwciAwIFx8IDAKK2lmIFsgJD8gIT0gMSBdIDsgdGhlbgorCWV4aXQgMTsKK2ZpOworCitidXN5Ym94IGV4cHIgMSBcJiAwCitpZiBbICQ/ICE9IDEgXSA7IHRoZW4KKwlleGl0IDE7CitmaTsKKworYnVzeWJveCBleHByIDAgXCYgMQoraWYgWyAkPyAhPSAxIF0gOyB0aGVuCisJZXhpdCAxOworZmk7CisKK2J1c3lib3ggZXhwciAwIFwmIDAKK2lmIFsgJD8gIT0gMSBdIDsgdGhlbgorCWV4aXQgMTsKK2ZpOworCitidXN5Ym94IGV4cHIgMSBcPCAwCitpZiBbICQ/ICE9IDEgXSA7IHRoZW4KKwlleGl0IDE7CitmaTsKKworYnVzeWJveCBleHByIDAgXD4gMQoraWYgWyAkPyAhPSAxIF0gOyB0aGVuCisJZXhpdCAxOworZmk7CisKK2J1c3lib3ggZXhwciAxIFw8PSAwCitpZiBbICQ/ICE9IDEgXSA7IHRoZW4KKwlleGl0IDE7CitmaTsKKworYnVzeWJveCBleHByIDAgXD49IDEKK2lmIFsgJD8gIT0gMSBdIDsgdGhlbgorCWV4aXQgMTsKK2ZpOwpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2ZhbHNlL2ZhbHNlLWlzLXNpbGVudCBiL3Rlc3RzdWl0ZS9mYWxzZS9mYWxzZS1pcy1zaWxlbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE5YWEwYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9mYWxzZS9mYWxzZS1pcy1zaWxlbnQKQEAgLTAsMCArMSBAQAorYnVzeWJveCBmYWxzZSAyPiYxIHwgY21wIC0gL2Rldi9udWxsCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZmFsc2UvZmFsc2UtcmV0dXJucy1mYWlsdXJlIGIvdGVzdHN1aXRlL2ZhbHNlL2ZhbHNlLXJldHVybnMtZmFpbHVyZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTA2MWYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2ZhbHNlL2ZhbHNlLXJldHVybnMtZmFpbHVyZQpAQCAtMCwwICsxIEBACishIGJ1c3lib3ggZmFsc2UKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9maW5kLnRlc3RzIGIvdGVzdHN1aXRlL2ZpbmQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNzhkZmExMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9maW5kLnRlc3RzCkBAIC0wLDAgKzEsNDkgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDE0IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAiZGVzY3JpcHRpb24iICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK21rZGlyIC1wIGZpbmQudGVtcGRpcgordG91Y2ggZmluZC50ZW1wZGlyL3Rlc3RmaWxlCisKK29wdGlvbmFsIEZFQVRVUkVfRklORF9UWVBFCit0ZXN0aW5nICJmaW5kIC10eXBlIGYiIFwKKwkiY2QgZmluZC50ZW1wZGlyICYmIGZpbmQgLXR5cGUgZiAyPiYxIiBcCisJIi4vdGVzdGZpbGVcbiIgXAorCSIiICIiCitTS0lQPQorb3B0aW9uYWwgRkVBVFVSRV9GSU5EX0VYRUMKK3Rlc3RpbmcgImZpbmQgLWV4ZWMgZXhpdGNvZGUgMSIgXAorCSJjZCBmaW5kLnRlbXBkaXIgJiYgZmluZCB0ZXN0ZmlsZSAtZXhlYyB0cnVlIHt9IFw7IDI+JjE7IGVjaG8gXCQ/IiBcCisJIjBcbiIgXAorCSIiICIiCitTS0lQPQorb3B0aW9uYWwgRkVBVFVSRV9GSU5EX0VYRUNfUExVUwordGVzdGluZyAiZmluZCAtZXhlYyBleGl0Y29kZSAyIiBcCisJImNkIGZpbmQudGVtcGRpciAmJiBmaW5kIHRlc3RmaWxlIC1leGVjIHRydWUge30gKyAyPiYxOyBlY2hvIFwkPyIgXAorCSIwXG4iIFwKKwkiIiAiIgorU0tJUD0KKyMgU3VycHJpc2luZ2x5LCAiLWV4ZWMgZmFsc2UgOyIgcmVzdWx0cyBpbiBleGl0Y29kZSAwISAiLWV4ZWMgZmFsc2UgKyIgaXMgZGlmZmVyZW50ISEhCitvcHRpb25hbCBGRUFUVVJFX0ZJTkRfRVhFQwordGVzdGluZyAiZmluZCAtZXhlYyBleGl0Y29kZSAzIiBcCisJImNkIGZpbmQudGVtcGRpciAmJiBmaW5kIHRlc3RmaWxlIC1leGVjIGZhbHNlIHt9IFw7IDI+JjE7IGVjaG8gXCQ/IiBcCisJIjBcbiIgXAorCSIiICIiCitTS0lQPQorb3B0aW9uYWwgRkVBVFVSRV9GSU5EX0VYRUNfUExVUwordGVzdGluZyAiZmluZCAtZXhlYyBleGl0Y29kZSA0IiBcCisJImNkIGZpbmQudGVtcGRpciAmJiBmaW5kIHRlc3RmaWxlIC1leGVjIGZhbHNlIHt9ICsgMj4mMTsgZWNobyBcJD8iIFwKKwkiMVxuIiBcCisJIiIgIiIKK1NLSVA9CisKKyMgdGVzdGluZyAiZGVzY3JpcHRpb24iICJjb21tYW5kIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK3JtIC1yZiBmaW5kLnRlbXBkaXIKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZmluZC9maW5kLXN1cHBvcnRzLW1pbnVzLXhkZXYgYi90ZXN0c3VpdGUvZmluZC9maW5kLXN1cHBvcnRzLW1pbnVzLXhkZXYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgwN2ZjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9maW5kL2ZpbmQtc3VwcG9ydHMtbWludXMteGRldgpAQCAtMCwwICsxLDMgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfRklORF9YREVWCisKK2J1c3lib3ggZmluZCAuIC14ZGV2ID4vZGV2L251bGwgMj4mMQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2ZvbGQudGVzdHMgYi90ZXN0c3VpdGUvZm9sZC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lY2Y4YjljCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2ZvbGQudGVzdHMKQEAgLTAsMCArMSw2MiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDA5IGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCit0ZXN0IC1mICIkYmluZGlyLy5jb25maWciICYmIC4gIiRiaW5kaXIvLmNvbmZpZyIKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJvcHRpb25zIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCit0ZXN0aW5nICJmb2xkIC1zIiAiZm9sZCAtdyA3IC1zIiBcCisgICAgICAgICIxMjM0NTZcblx0XG5hc2RmIiBcCisgICAgICAgICIiIFwKKyAgICAgICAgIjEyMzQ1Nlx0YXNkZiIgXAorCit0ZXN0aW5nICJmb2xkIC13MSIgImZvbGQgLXcxIiBcCisJInFcbnFcbiBcbndcbiBcbmVcbmVcbmVcbiBcbnJcbiBcbnRcbnRcbnRcbnRcbiBcbnkiIFwKKwkiIiBcCisJInFxIHcgZWVlIHIgdHR0dCB5IiBcCisKK3Rlc3RpbmcgImZvbGQgd2l0aCBOVUxzIiAiZm9sZCAtc3cyMiIgXAorCSJcCitUaGUgTlVMIGlzIGhlcmU6PlwwPCBcblwKK2FuZCBhbm90aGVyIG9uZSBpcyBcblwKK2hlcmU6PlwwPCAtIHRoZXkgbXVzdCBcblwKK2JlIHByZXNlcnZlZAorIiBcCisJIiIgXAorCSJUaGUgTlVMIGlzIGhlcmU6PlwwPCBhbmQgYW5vdGhlciBvbmUgXAoraXMgaGVyZTo+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+INGH0L7RgNC90YMg0LTRltGA0LrRgy4iCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2dyZXAudGVzdHMgYi90ZXN0c3VpdGUvZ3JlcC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5mNmQ5ZjIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2dyZXAudGVzdHMKQEAgLTAsMCArMSwxOTggQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDA1IGJ5IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKyMgQVVESVQ6CisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAiY29tbWFuZHMiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisjICAgZmlsZSBpbnB1dCB3aWxsIGJlIGZpbGUgY2FsbGVkICJpbnB1dCIKKyMgICB0ZXN0IGNhbiBjcmVhdGUgYSBmaWxlICJhY3R1YWwiIGluc3RlYWQgb2Ygd3JpdGluZyB0byBzdGRvdXQKKworIyBUZXN0IGV4aXQgc3RhdHVzCisKK3Rlc3RpbmcgImdyZXAgKGV4aXQgd2l0aCBlcnJvcikiICJncmVwIG5vbmV4aXN0ZW50IDI+IC9kZXYvbnVsbCA7IGVjaG8gXCQ/IiBcCisJIjFcbiIgIiIgIiIKK3Rlc3RpbmcgImdyZXAgKGV4aXQgc3VjY2VzcykiICJncmVwIGdyZXAgJDAgPiAvZGV2L251bGwgMj4mMSA7IGVjaG8gXCQ/IiAiMFxuIiBcCisJIiIgIiIKKyMgVGVzdCB2YXJpb3VzIGRhdGEgc291cmNlcyBhbmQgZGVzdGluYXRpb25zCisKK3Rlc3RpbmcgImdyZXAgKGRlZmF1bHQgdG8gc3RkaW4pIiAiZ3JlcCB0d28iICJ0d29cbiIgIiIgXAorCSJvbmVcbnR3b1xudGhyZWVcbnRocmVlXG50aHJlZVxuIgordGVzdGluZyAiZ3JlcCAtIChzcGVjaWZ5IHN0ZGluKSIgImdyZXAgdHdvIC0iICJ0d29cbiIgIiIgXAorCSJvbmVcbnR3b1xudGhyZWVcbnRocmVlXG50aHJlZVxuIgordGVzdGluZyAiZ3JlcCBpbnB1dCAoc3BlY2lmeSBmaWxlKSIgImdyZXAgdHdvIGlucHV0IiAidHdvXG4iIFwKKwkib25lXG50d29cbnRocmVlXG50aHJlZVxudGhyZWVcbiIgIiIKKworIyBHTlUgZ3JlcCAyLjUuMyBvdXRwdXRzIGEgbmV3IGxpbmUgY2hhcmFjdGVyIGFmdGVyIHRoZSBsb2NhdGVkIHN0cmluZworIyBldmVuIGlmIHRoZXJlIGlzIG5vIG5ldyBsaW5lIGNoYXJhY3RlciBpbiB0aGUgaW5wdXQKK3Rlc3RpbmcgImdyZXAgKG5vIG5ld2xpbmUgYXQgRU9MKSIgImdyZXAgYnVnIGlucHV0IiAiYnVnXG4iICJidWciICIiCisKKz5lbXB0eQordGVzdGluZyAiZ3JlcCB0d28gZmlsZXMiICJncmVwIHR3byBpbnB1dCBlbXB0eSAyPi9kZXYvbnVsbCIgXAorCSJpbnB1dDp0d29cbiIgIm9uZVxudHdvXG50aHJlZVxudGhyZWVcbnRocmVlXG4iICIiCitybSBlbXB0eQorCit0ZXN0aW5nICJncmVwIC0gaW5maWxlIChzcGVjaWZ5IHN0ZGluIGFuZCBmaWxlKSIgImdyZXAgdHdvIC0gaW5wdXQiIFwKKwkiKHN0YW5kYXJkIGlucHV0KTp0d29cbmlucHV0OnR3b1xuIiAib25lXG50d29cbnRocmVlXG4iIFwKKwkib25lXG50d29cbnRvb1xudGhyZWVcbnRocmVlXG4iCisKKyMgQ2hlY2sgaWYgd2Ugc2VlIHRoZSBjb3JyZWN0IHJldHVybiB2YWx1ZSBpZiBib3RoIHN0ZGluIGFuZCBub24tZXhpc3RpbmcgZmlsZQorIyBhcmUgZ2l2ZW4uCit0ZXN0aW5nICJncmVwIC0gbm9maWxlIChzcGVjaWZ5IHN0ZGluIGFuZCBub25leGlzdGluZyBmaWxlKSIgXAorCSJncmVwIHR3byAtIG5vbmV4aXN0ZW50IDI+IC9kZXYvbnVsbCA7IGVjaG8gXCQ/IiBcCisJIihzdGFuZGFyZCBpbnB1dCk6dHdvXG4oc3RhbmRhcmQgaW5wdXQpOnR3b1xuMlxuIiBcCisJIiIgIm9uZVxudHdvXG50d29cbnRocmVlXG50aHJlZVxudGhyZWVcbiIKK3Rlc3RpbmcgImdyZXAgLXEgLSBub2ZpbGUgKHNwZWNpZnkgc3RkaW4gYW5kIG5vbmV4aXN0aW5nIGZpbGUsIG5vIG1hdGNoKSIgXAorCSJncmVwIC1xIG5vbWF0Y2ggLSBub25leGlzdGVudCAyPiAvZGV2L251bGwgOyBlY2hvIFwkPyIgXAorCSIyXG4iICIiICJvbmVcbnR3b1xudHdvXG50aHJlZVxudGhyZWVcbnRocmVlXG4iCisjIFNVU3YzOiBJZiB0aGUgLXEgb3B0aW9uIGlzIHNwZWNpZmllZCwgdGhlIGV4aXQgc3RhdHVzIHNoYWxsIGJlIHplcm8KKyMgICAgICAgIGlmIGFuIGlucHV0IGxpbmUgaXMgc2VsZWN0ZWQsIGV2ZW4gaWYgYW4gZXJyb3Igd2FzIGRldGVjdGVkLgordGVzdGluZyAiZ3JlcCAtcSAtIG5vZmlsZSAoc3BlY2lmeSBzdGRpbiBhbmQgbm9uZXhpc3RpbmcgZmlsZSwgbWF0Y2gpIiBcCisJImdyZXAgLXEgdHdvIC0gbm9uZXhpc3RlbnQgOyBlY2hvIFwkPyIgXAorCSIwXG4iICIiICJvbmVcbnR3b1xudHdvXG50aHJlZVxudGhyZWVcbnRocmVlXG4iCisKKyMgVGVzdCB2YXJpb3VzIGNvbW1hbmQgbGluZSBvcHRpb25zCisjIC1zIG5vIGVycm9yIG1lc3NhZ2VzCit0ZXN0aW5nICJncmVwIC1zIG5vZmlsZSAobm9uZXhpc3RpbmcgZmlsZSwgbm8gbWF0Y2gpIiBcCisJImdyZXAgLXMgbm9tYXRjaCBub25leGlzdGVudCA7IGVjaG8gXCQ/IiAiMlxuIiAiIiAiIgordGVzdGluZyAiZ3JlcCAtcyBub2ZpbGUgLSAoc3RkaW4gYW5kIG5vbmV4aXN0aW5nIGZpbGUsIG1hdGNoKSIgXAorCSJncmVwIC1zIGRvbWF0Y2ggbm9uZXhpc3RlbnQgLSA7IGVjaG8gXCQ/IiBcCisJIihzdGFuZGFyZCBpbnB1dCk6ZG9tYXRjaFxuMlxuIiAiIiAibm9tYXRjaFxuZG9tYXRjaFxuZW5kXG4iCisKK29wdGlvbmFsIEVYVFJBX0NPTVBBVAordGVzdGluZyAiZ3JlcCBoYW5kbGVzIE5VTCBpbiBmaWxlcyIgImdyZXAgLWEgZm9vIGlucHV0IiAiXDBmb29cbiIgIlwwZm9vXG5cbiIgIiIKK3Rlc3RpbmcgImdyZXAgaGFuZGxlcyBOVUwgb24gc3RkaW4iICJncmVwIC1hIGZvbyIgIlwwZm9vXG4iICIiICJcMGZvb1xuXG4iCisKK3Rlc3RpbmcgImdyZXAgbWF0Y2hlcyBOVUwiICJncmVwIC4gaW5wdXQgPiAvZGV2L251bGwgMj4mMSA7IGVjaG8gXCQ/IiBcCisJIjBcbiIgIlwwXG4iICIiCitTS0lQPQorCisjIC1lIHJlZ2V4Cit0ZXN0aW5nICJncmVwIGhhbmRsZXMgbXVsdGlwbGUgcmVnZXhwcyIgImdyZXAgLWUgb25lIC1lIHR3byBpbnB1dCA7IGVjaG8gXCQ/IiBcCisJIm9uZVxudHdvXG4wXG4iICJvbmVcbnR3b1xuIiAiIgordGVzdGluZyAiZ3JlcCAtRiBoYW5kbGVzIG11bHRpcGxlIGV4cGVzc2lvbnMiICJncmVwIC1GIC1lIG9uZSAtZSB0d28gaW5wdXQgOyBlY2hvIFwkPyIgXAorCSJvbmVcbnR3b1xuMFxuIiAib25lXG50d29cbiIgIiIKK3Rlc3RpbmcgImdyZXAgLUYgaGFuZGxlcyAtaSIgImdyZXAgLUYgLWkgZm9vIGlucHV0IDsgZWNobyBcJD8iIFwKKwkiRk9PXG4wXG4iICJGT09cbiIgIiIKKworIyAtZiBmaWxlLy0KK3Rlc3RpbmcgImdyZXAgY2FuIHJlYWQgcmVnZXhwcyBmcm9tIHN0ZGluIiAiZ3JlcCAtZiAtIGlucHV0IDsgZWNobyBcJD8iIFwKKwkidHdvXG50aHJlZVxuMFxuIiAidHdcbnR3b1xudGhyZWVcbiIgInR3LlxudGhyXG4iCisKKyMgLXggKHdob2xlIGxpbmUgbWF0Y2gpCit0ZXN0aW5nICJncmVwIC14IChmdWxsIG1hdGNoKSIgImdyZXAgLXggZm9vIGlucHV0IDsgZWNobyBcJD8iIFwKKwkiZm9vXG4wXG4iICJmb29cbiIgIiIKK3Rlc3RpbmcgImdyZXAgLXggKHBhcnRpYWwgbWF0Y2ggMSkiICJncmVwIC14IGZvbyBpbnB1dCA7IGVjaG8gXCQ/IiBcCisJIjFcbiIgImZvbyBiYXJcbiIgIiIKK3Rlc3RpbmcgImdyZXAgLXggKHBhcnRpYWwgbWF0Y2ggMikiICJncmVwIC14IGZvbyBpbnB1dCA7IGVjaG8gXCQ/IiBcCisJIjFcbiIgImJhciBmb29cbiIgIiIKK3Rlc3RpbmcgImdyZXAgLXggLUYgKGZ1bGwgbWF0Y2gpIiAiZ3JlcCAteCAtRiBmb28gaW5wdXQgOyBlY2hvIFwkPyIgXAorCSJmb29cbjBcbiIgImZvb1xuIiAiIgordGVzdGluZyAiZ3JlcCAteCAtRiAocGFydGlhbCBtYXRjaCAxKSIgImdyZXAgLXggLUYgZm9vIGlucHV0IDsgZWNobyBcJD8iIFwKKwkiMVxuIiAiZm9vIGJhclxuIiAiIgordGVzdGluZyAiZ3JlcCAteCAtRiAocGFydGlhbCBtYXRjaCAyKSIgImdyZXAgLXggLUYgZm9vIGlucHV0IDsgZWNobyBcJD8iIFwKKwkiMVxuIiAiYmFyIGZvb1xuIiAiIgorCitvcHRpb25hbCBGRUFUVVJFX0dSRVBfRUdSRVBfQUxJQVMKK3Rlc3RpbmcgImdyZXAgLUUgc3VwcG9ydHMgZXh0ZW5kZWQgcmVnZXhwcyIgImdyZXAgLUUgZm8rIiAiZm9vXG4iICIiIFwKKwkiYlxhclxuZm9vXG5iYXoiCit0ZXN0aW5nICJncmVwIGlzIGFsc28gZWdyZXAiICJlZ3JlcCBmb28iICJmb29cbiIgIiIgImZvb1xuYmFyXG4iCit0ZXN0aW5nICJlZ3JlcCBpcyBub3QgY2FzZSBpbnNlbnNpdGl2ZSIgXAorCSJlZ3JlcCBmb28gOyBbIFwkPyAtbmUgMCBdICYmIGVjaG8geWVzIiAieWVzXG4iICIiICJGT09cbiIKK3Rlc3RpbmcgImdyZXAgLUUgLW8gcHJpbnRzIGFsbCBtYXRjaGVzIiBcCisJImdyZXAgLUUgLW8gJyhbWzp4ZGlnaXQ6XV17Mn1bOi1dKXs1fVtbOnhkaWdpdDpdXXsyfSciIFwKKwkiMDA6MTk6M0U6MDA6QUE6NUVcbjAwOjFEOjYwOjNEOjNBOkZCXG4wMDoyMjo0Mzo0OTpGQjpBQVxuIiBcCisJIiIgIjAwOjE5OjNFOjAwOkFBOjVFIDAwOjFEOjYwOjNEOjNBOkZCIDAwOjIyOjQzOjQ5OkZCOkFBXG4iCitTS0lQPQorCit0ZXN0aW5nICJncmVwIC1vIGRvZXMgbm90IGxvb3AgZm9yZXZlciIgXAorCSdncmVwIC1vICJbXi9dKiQiJyBcCisJInRlc3RcbiIgXAorCSIiICIvdmFyL3Rlc3RcbiIKK3Rlc3RpbmcgImdyZXAgLW8gZG9lcyBub3QgbG9vcCBmb3JldmVyIG9uIHplcm8tbGVuZ3RoIG1hdGNoIiBcCisJJ2dyZXAgLW8gIiIgfCBoZWFkIC1uMScgXAorCSIiIFwKKwkiIiAidGVzdFxuIgorCit0ZXN0aW5nICJncmVwIC1mIEVNUFRZX0ZJTEUiIFwKKwkiZ3JlcCAtZiBpbnB1dCIgXAorCSIiIFwKKwkiIiBcCisJInRlc3RcbiIKKwordGVzdGluZyAiZ3JlcCAtdiAtZiBFTVBUWV9GSUxFIiBcCisJImdyZXAgLXYgLWYgaW5wdXQiIFwKKwkidGVzdFxuIiBcCisJIiIgXAorCSJ0ZXN0XG4iCisKK3Rlc3RpbmcgImdyZXAgLUZ3IG1hdGNoZXMgb25seSB3b3JkcyIgXAorCSJncmVwIC1GdyBmb28gaW5wdXQiIFwKKwkiIiBcCisJImZvb3BcbiIgXAorCSIiCisKK3Rlc3RpbmcgImdyZXAgLUZ3IGRvZXNuJ3Qgc3RvcCBvbiAxc3QgbWlzbWF0Y2giIFwKKwkiZ3JlcCAtRncgZm9vIGlucHV0IiBcCisJImZvb3AgZm9vXG4iIFwKKwkiZm9vcCBmb29cbiIgXAorCSIiCisKK3Rlc3RpbmcgImdyZXAgLXcgZG9lc24ndCBzdG9wIG9uIDFzdCBtaXNtYXRjaCIgXAorCSJncmVwIC13IGZvbyBpbnB1dCIgXAorCSJmb29wIGZvb1xuIiBcCisJImZvb3AgZm9vXG4iIFwKKwkiIgorCit0ZXN0aW5nICJncmVwIC13IF5zdHIgZG9lc24ndCBtYXRjaCBzdHIgbm90IGF0IHRoZSBiZWdpbm5pbmciIFwKKwkiZ3JlcCAtdyBec3RyIGlucHV0IiBcCisJIiIgXAorCSJzdHJzdHJcbiIgXAorCSIiCisKK3Rlc3RpbmcgImdyZXAgLXcgXiBkb2Vzbid0IGhhbmciIFwKKwkiZ3JlcCAtdyBeIGlucHV0IiBcCisJIiIgXAorCSJhbnl0aGluZ1xuIiBcCisJIiIKKwordGVzdGluZyAiZ3JlcCAtdyB3b3JkIGRvZXNuJ3QgbWF0Y2ggd29yZHdvcmQiIFwKKwkiZ3JlcCAtdyB3b3JkIGlucHV0IiBcCisJIiIgXAorCSJ3b3Jkd29yZFxuIiBcCisJIiIKKwordGVzdGluZyAiZ3JlcCAtdyB3b3JkIG1hdGNoIHNlY29uZCB3b3JkIiBcCisJImdyZXAgLXcgd29yZCBpbnB1dCIgXAorCSJid29yZCx3b3JkXG4iIndvcmRiLHdvcmRcbiIiYndvcmRiLHdvcmRcbiIgXAorCSJid29yZCx3b3JkXG4iIndvcmRiLHdvcmRcbiIiYndvcmRiLHdvcmRcbiIgXAorCSIiCisKKyMgLXIgb24gc3ltbGluayB0byBkaXIgc2hvdWxkIHJlY3Vyc2UgaW50byBkaXIKK21rZGlyIC1wIGdyZXAudGVzdGRpci9mb28KK2VjaG8gYmFyID4gZ3JlcC50ZXN0ZGlyL2Zvby9maWxlCitsbiAtcyBmb28gZ3JlcC50ZXN0ZGlyL3N5bWZvbwordGVzdGluZyAiZ3JlcCAtciBvbiBzeW1saW5rIHRvIGRpciIgXAorCSJncmVwIC1yIC4gZ3JlcC50ZXN0ZGlyL3N5bWZvbyIgXAorCSJncmVwLnRlc3RkaXIvc3ltZm9vL2ZpbGU6YmFyXG4iIFwKKwkiIiAiIgorcm0gLVJmIGdyZXAudGVzdGRpcgorCisjIEJ1dCAtciBvbiBkaXIvc3ltbGlua190b19kaXIgc2hvdWxkIG5vdCByZWN1cnNlIGludG8gc3ltbGlua190b19kaXIKK21rZGlyIC1wIGdyZXAudGVzdGRpci9mb28KK2VjaG8gYmFyID4gZ3JlcC50ZXN0ZGlyL2Zvby9maWxlCitsbiAtcyBmb28gZ3JlcC50ZXN0ZGlyL3N5bWZvbwordGVzdGluZyAiZ3JlcCAtciBvbiBkaXIvc3ltbGluayB0byBkaXIiIFwKKwkiZ3JlcCAtciAuIGdyZXAudGVzdGRpciIgXAorCSJncmVwLnRlc3RkaXIvZm9vL2ZpbGU6YmFyXG4iIFwKKwkiIiAiIgorcm0gLVJmIGdyZXAudGVzdGRpcgorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmRzIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorIyAgIGZpbGUgaW5wdXQgd2lsbCBiZSBmaWxlIGNhbGxlZCAiaW5wdXQiCisjICAgdGVzdCBjYW4gY3JlYXRlIGEgZmlsZSAiYWN0dWFsIiBpbnN0ZWFkIG9mIHdyaXRpbmcgdG8gc3Rkb3V0CisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2d1bnppcC50ZXN0cyBiL3Rlc3RzdWl0ZS9ndW56aXAudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNjhjMDc1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9ndW56aXAudGVzdHMKQEAgLTAsMCArMSwzIEBACisjIS9iaW4vc2gKKworLiAuL2J1bnppcDIudGVzdHMKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9ndW56aXAvZ3VuemlwLXJlYWRzLWZyb20tc3RhbmRhcmQtaW5wdXQgYi90ZXN0c3VpdGUvZ3VuemlwL2d1bnppcC1yZWFkcy1mcm9tLXN0YW5kYXJkLWlucHV0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNDk4YzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZ3VuemlwL2d1bnppcC1yZWFkcy1mcm9tLXN0YW5kYXJkLWlucHV0CkBAIC0wLDAgKzEsMiBAQAorZWNobyBmb28gfCBnemlwIHwgYnVzeWJveCBndW56aXAgPiBvdXRwdXQKK2VjaG8gZm9vIHwgY21wIC0gb3V0cHV0CmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvZ3ppcC9nemlwLWFjY2VwdHMtbXVsdGlwbGUtZmlsZXMgYi90ZXN0c3VpdGUvZ3ppcC9nemlwLWFjY2VwdHMtbXVsdGlwbGUtZmlsZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYwZDljOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9nemlwL2d6aXAtYWNjZXB0cy1tdWx0aXBsZS1maWxlcwpAQCAtMCwwICsxLDMgQEAKK3RvdWNoIGZvbyBiYXIKK2J1c3lib3ggZ3ppcCBmb28gYmFyCit0ZXN0IC1mIGZvby5neiAtYSAtZiBiYXIuZ3oKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9nemlwL2d6aXAtYWNjZXB0cy1zaW5nbGUtbWludXMgYi90ZXN0c3VpdGUvZ3ppcC9nemlwLWFjY2VwdHMtc2luZ2xlLW1pbnVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNTFmZGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvZ3ppcC9nemlwLWFjY2VwdHMtc2luZ2xlLW1pbnVzCkBAIC0wLDAgKzEgQEAKK2VjaG8gZm9vIHwgYnVzeWJveCBnemlwIC0gPi9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2d6aXAvZ3ppcC1yZW1vdmVzLW9yaWdpbmFsLWZpbGUgYi90ZXN0c3VpdGUvZ3ppcC9nemlwLXJlbW92ZXMtb3JpZ2luYWwtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWNiOTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2d6aXAvZ3ppcC1yZW1vdmVzLW9yaWdpbmFsLWZpbGUKQEAgLTAsMCArMSwzIEBACit0b3VjaCBmb28KK2J1c3lib3ggZ3ppcCBmb28KK3Rlc3QgISAtZiBmb28KZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9oZWFkL2hlYWQtbi13b3JrcyBiL3Rlc3RzdWl0ZS9oZWFkL2hlYWQtbi13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjQzMjU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2hlYWQvaGVhZC1uLXdvcmtzCkBAIC0wLDAgKzEsNCBAQAorWyAtbiAiJGQiIF0gfHwgZD0uLgoraGVhZCAtbiAyICIkZC9SRUFETUUiID4gbG9nZmlsZS5nbnUKK2J1c3lib3ggaGVhZCAtbiAyICIkZC9SRUFETUUiID4gbG9nZmlsZS5iYgorY21wIGxvZ2ZpbGUuZ251IGxvZ2ZpbGUuYmIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9oZWFkL2hlYWQtd29ya3MgYi90ZXN0c3VpdGUvaGVhZC9oZWFkLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YWQzZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvaGVhZC9oZWFkLXdvcmtzCkBAIC0wLDAgKzEsNCBAQAorWyAtbiAiJGQiIF0gfHwgZD0uLgoraGVhZCAiJGQvUkVBRE1FIiA+IGxvZ2ZpbGUuZ251CitidXN5Ym94IGhlYWQgIiRkL1JFQURNRSIgPiBsb2dmaWxlLmJiCitjbXAgbG9nZmlsZS5nbnUgbG9nZmlsZS5iYgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2hvc3RpZC9ob3N0aWQtd29ya3MgYi90ZXN0c3VpdGUvaG9zdGlkL2hvc3RpZC13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzIwYmRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2hvc3RpZC9ob3N0aWQtd29ya3MKQEAgLTAsMCArMSw2IEBACitoPXgkKGJ1c3lib3ggaG9zdGlkKQorIyBJcyAkaCBhIHNlcXVlbmNlIG9mIGhleCBudW1iZXJzPworY2FzZSAiJGgiIGluCisgeCpbITAtOWEtZl0qKSBmYWxzZTs7CisgKikgdHJ1ZTs7Citlc2FjCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvaG9zdG5hbWUvaG9zdG5hbWUtZC13b3JrcyBiL3Rlc3RzdWl0ZS9ob3N0bmFtZS9ob3N0bmFtZS1kLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0YzBhYWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvaG9zdG5hbWUvaG9zdG5hbWUtZC13b3JrcwpAQCAtMCwwICsxLDMgQEAKK2Y9JChidXN5Ym94IGhvc3RuYW1lIC1mKS4KK2Q9JChidXN5Ym94IGhvc3RuYW1lIC1kKQordGVzdCB4IiR7ZiMqLn0iID0geCIkZCR7ZDorLn0iCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvaG9zdG5hbWUvaG9zdG5hbWUtaS13b3JrcyBiL3Rlc3RzdWl0ZS9ob3N0bmFtZS9ob3N0bmFtZS1pLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyOTliZmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvaG9zdG5hbWUvaG9zdG5hbWUtaS13b3JrcwpAQCAtMCwwICsxLDkgQEAKK3Rlc3QgeCIkU0tJUF9LTk9XTl9CVUdTIiAhPSB4IiIgJiYgZXhpdAorCisjIE9ic2VydmVkIGJ1ZzoKKyMgIyAuL2J1c3lib3ggaG9zdG5hbWUgLWkKKyMgMTI3LjAuMC4xCisjICMgaG9zdG5hbWUgLWkKKyMgMTI3LjAuMC4xIDEwLjAuMC4yIDEwLjMyLjEwLjQ1CisKK3Rlc3QgeCQoaG9zdG5hbWUgLWkpID0geCQoYnVzeWJveCBob3N0bmFtZSAtaSkKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9ob3N0bmFtZS9ob3N0bmFtZS1zLXdvcmtzIGIvdGVzdHN1aXRlL2hvc3RuYW1lL2hvc3RuYW1lLXMtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcyYjk0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9ob3N0bmFtZS9ob3N0bmFtZS1zLXdvcmtzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgeCQoaG9zdG5hbWUgLXMpID0geCQoYnVzeWJveCBob3N0bmFtZSAtcykKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9ob3N0bmFtZS9ob3N0bmFtZS13b3JrcyBiL3Rlc3RzdWl0ZS9ob3N0bmFtZS9ob3N0bmFtZS13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTFhNDA2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2hvc3RuYW1lL2hvc3RuYW1lLXdvcmtzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgeCQoaG9zdG5hbWUpID0geCQoYnVzeWJveCBob3N0bmFtZSkKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9pZC9pZC1nLXdvcmtzIGIvdGVzdHN1aXRlL2lkL2lkLWctd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcxZmM1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9pZC9pZC1nLXdvcmtzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgeCQoaWQgLWcpID0geCQoYnVzeWJveCBpZCAtZykKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9pZC9pZC11LXdvcmtzIGIvdGVzdHN1aXRlL2lkL2lkLXUtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM1OGNiMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9pZC9pZC11LXdvcmtzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgeCQoaWQgLXUpID0geCQoYnVzeWJveCBpZCAtdSkKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9pZC9pZC11bi13b3JrcyBiL3Rlc3RzdWl0ZS9pZC9pZC11bi13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjM5MGU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2lkL2lkLXVuLXdvcmtzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgeCQoaWQgLXVuKSA9IHgkKGJ1c3lib3ggaWQgLXVuKQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2lkL2lkLXVyLXdvcmtzIGIvdGVzdHN1aXRlL2lkL2lkLXVyLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMGZjYjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvaWQvaWQtdXItd29ya3MKQEAgLTAsMCArMSBAQAordGVzdCB4JChpZCAtdXIpID0geCQoYnVzeWJveCBpZCAtdXIpCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbG4vbG4tY3JlYXRlcy1oYXJkLWxpbmtzIGIvdGVzdHN1aXRlL2xuL2xuLWNyZWF0ZXMtaGFyZC1saW5rcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjZlMjNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2xuL2xuLWNyZWF0ZXMtaGFyZC1saW5rcwpAQCAtMCwwICsxLDQgQEAKK2VjaG8gZmlsZSBudW1iZXIgb25lID4gZmlsZTEKK2J1c3lib3ggbG4gZmlsZTEgbGluazEKK3Rlc3QgLWYgZmlsZTEKK3Rlc3QgLWYgbGluazEKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9sbi9sbi1jcmVhdGVzLXNvZnQtbGlua3MgYi90ZXN0c3VpdGUvbG4vbG4tY3JlYXRlcy1zb2Z0LWxpbmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NzVlNGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbG4vbG4tY3JlYXRlcy1zb2Z0LWxpbmtzCkBAIC0wLDAgKzEsNCBAQAorZWNobyBmaWxlIG51bWJlciBvbmUgPiBmaWxlMQorYnVzeWJveCBsbiAtcyBmaWxlMSBsaW5rMQordGVzdCAtTCBsaW5rMQordGVzdCB4ZmlsZTEgPSB4YHJlYWRsaW5rIGxpbmsxYApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2xuL2xuLWZvcmNlLWNyZWF0ZXMtaGFyZC1saW5rcyBiL3Rlc3RzdWl0ZS9sbi9sbi1mb3JjZS1jcmVhdGVzLWhhcmQtbGlua3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk2YjdkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9sbi9sbi1mb3JjZS1jcmVhdGVzLWhhcmQtbGlua3MKQEAgLTAsMCArMSw1IEBACitlY2hvIGZpbGUgbnVtYmVyIG9uZSA+IGZpbGUxCitlY2hvIGZpbGUgbnVtYmVyIHR3byA+IGxpbmsxCitidXN5Ym94IGxuIC1mIGZpbGUxIGxpbmsxCit0ZXN0IC1mIGZpbGUxCit0ZXN0IC1mIGxpbmsxCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbG4vbG4tZm9yY2UtY3JlYXRlcy1zb2Z0LWxpbmtzIGIvdGVzdHN1aXRlL2xuL2xuLWZvcmNlLWNyZWF0ZXMtc29mdC1saW5rcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWI4ZDFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2xuL2xuLWZvcmNlLWNyZWF0ZXMtc29mdC1saW5rcwpAQCAtMCwwICsxLDUgQEAKK2VjaG8gZmlsZSBudW1iZXIgb25lID4gZmlsZTEKK2VjaG8gZmlsZSBudW1iZXIgdHdvID4gbGluazEKK2J1c3lib3ggbG4gLWYgLXMgZmlsZTEgbGluazEKK3Rlc3QgLUwgbGluazEKK3Rlc3QgeGZpbGUxID0geGByZWFkbGluayBsaW5rMWAKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9sbi9sbi1wcmVzZXJ2ZXMtaGFyZC1saW5rcyBiL3Rlc3RzdWl0ZS9sbi9sbi1wcmVzZXJ2ZXMtaGFyZC1saW5rcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2ZiOTg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2xuL2xuLXByZXNlcnZlcy1oYXJkLWxpbmtzCkBAIC0wLDAgKzEsOCBAQAorZWNobyBmaWxlIG51bWJlciBvbmUgPiBmaWxlMQorZWNobyBmaWxlIG51bWJlciB0d28gPiBsaW5rMQorc2V0ICtlCitidXN5Ym94IGxuIGZpbGUxIGxpbmsxCitpZiBbICQ/ICE9IDAgXSA7IHRoZW4KKwlleGl0IDA7CitmaQorZXhpdCAxOwpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2xuL2xuLXByZXNlcnZlcy1zb2Z0LWxpbmtzIGIvdGVzdHN1aXRlL2xuL2xuLXByZXNlcnZlcy1zb2Z0LWxpbmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNDliZWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbG4vbG4tcHJlc2VydmVzLXNvZnQtbGlua3MKQEAgLTAsMCArMSw4IEBACitlY2hvIGZpbGUgbnVtYmVyIG9uZSA+IGZpbGUxCitlY2hvIGZpbGUgbnVtYmVyIHR3byA+IGxpbmsxCitzZXQgK2UKK2J1c3lib3ggbG4gLXMgZmlsZTEgbGluazEKK2lmIFsgJD8gIT0gMCBdIDsgdGhlbgorCWV4aXQgMDsKK2ZpCitleGl0IDE7CmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbHMubWtfdW5pX3Rlc3RzIGIvdGVzdHN1aXRlL2xzLm1rX3VuaV90ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTBjMjlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2xzLm1rX3VuaV90ZXN0cwpAQCAtMCwwICsxLDExMSBAQAorIyBETyBOT1QgRURJVCBUSElTIEZJTEUhIE1PU1QgVEVYVCBFRElUT1JTIFdJTEwgREFNQUdFIElUIQorPicwMDAxXzFfX1NvbWVfY29ycmVjdF9VVEYtOF90ZXh0X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMDJfMl9fQm91bmRhcnlfY29uZGl0aW9uX3Rlc3RfY2FzZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAwM18yLjFfX0ZpcnN0X3Bvc3NpYmxlX3NlcXVlbmNlX29mX2FfY2VydGFpbl9sZW5ndGhfX19fX19fX19fX19fX19fX19fX198JworPicwMDA0XzIuMS4yX18yX2J5dGVzX19VLTAwMDAwMDgwXzpfX19fX19fXyLCgCJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDA1XzIuMS4zX18zX2J5dGVzX19VLTAwMDAwODAwXzpfX19fX19fXyLgoIAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAwNl8yLjEuNF9fNF9ieXRlc19fVS0wMDAxMDAwMF86X19fX19fX18i8JCAgCJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDA3XzIuMS41X181X2J5dGVzX19VLTAwMjAwMDAwXzpfX19fX19fXyL4iICAgCJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDA4XzIuMS42X182X2J5dGVzX19VLTA0MDAwMDAwXzpfX19fX19fXyL8hICAgIAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAwOV8yLjJfX0xhc3RfcG9zc2libGVfc2VxdWVuY2Vfb2ZfYV9jZXJ0YWluX2xlbmd0aF9fX19fX19fX19fX19fX19fX19fX198JworPicwMDEwXzIuMi4xX18xX2J5dGVfX19VLTAwMDAwMDdGXzpfX19fX19fXyJ/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMTFfMi4yLjJfXzJfYnl0ZXNfX1UtMDAwMDA3RkZfOl9fX19fX19fIt+/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMTJfMi4yLjNfXzNfYnl0ZXNfX1UtMDAwMEZGRkZfOl9fX19fX19fIu+/vyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDEzXzIuMi40X180X2J5dGVzX19VLTAwMUZGRkZGXzpfX19fX19fXyL3v7+/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMTRfMi4yLjVfXzVfYnl0ZXNfX1UtMDNGRkZGRkZfOl9fX19fX19fIvu/v7+/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMTVfMi4yLjZfXzZfYnl0ZXNfX1UtN0ZGRkZGRkZfOl9fX19fX19fIv2/v7+/vyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDE2XzIuM19fT3RoZXJfYm91bmRhcnlfY29uZGl0aW9uc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMTdfMi4zLjFfX1UtMDAwMEQ3RkZfPV9lZF85Zl9iZl89XyLtn78iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDE4XzIuMy4yX19VLTAwMDBFMDAwXz1fZWVfODBfODBfPV8i7oCAIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAxOV8yLjMuM19fVS0wMDAwRkZGRF89X2VmX2JmX2JkXz1fIu+/vSJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMjBfMi4zLjRfX1UtMDAxMEZGRkZfPV9mNF84Zl9iZl9iZl89XyL0j7+/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAyMV8yLjMuNV9fVS0wMDExMDAwMF89X2Y0XzkwXzgwXzgwXz1fIvSQgIAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDIyXzNfX01hbGZvcm1lZF9zZXF1ZW5jZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMjNfMy4xX19VbmV4cGVjdGVkX2NvbnRpbnVhdGlvbl9ieXRlc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAyNF8zLjEuMV9fRmlyc3RfY29udGludWF0aW9uX2J5dGVfMHg4MDpfIoAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDI1XzMuMS4yX19MYXN0X19jb250aW51YXRpb25fYnl0ZV8weGJmOl8ivyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMjZfMy4xLjNfXzJfY29udGludWF0aW9uX2J5dGVzOl8igL8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAyN18zLjEuNF9fM19jb250aW51YXRpb25fYnl0ZXM6XyKAv4AiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDI4XzMuMS41X180X2NvbnRpbnVhdGlvbl9ieXRlczpfIoC/gL8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMjlfMy4xLjZfXzVfY29udGludWF0aW9uX2J5dGVzOl8igL+Av4AiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAzMF8zLjEuN19fNl9jb250aW51YXRpb25fYnl0ZXM6XyKAv4C/gL8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDMxXzMuMS44X183X2NvbnRpbnVhdGlvbl9ieXRlczpfIoC/gL+Av4AiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMzJfMy4xLjlfX1NlcXVlbmNlX29mX2FsbF82NF9wb3NzaWJsZV9jb250aW51YXRpb25fYnl0ZXNfXzB4ODAtMHhiZl86X19ffCcKKz4nMDAzM19fX18igIGCg4SFhoeIiYqLjI2Oj19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDM0X19fX1+QkZKTlJWWl5iZmpucnZ6fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMzVfX19fX6ChoqOkpaanqKmqq6ytrq9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDAzNl9fX19fsLGys7S1tre4ubq7vL2+vyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDM3XzMuMl9fTG9uZWx5X3N0YXJ0X2NoYXJhY3RlcnNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwMzhfMy4yLjFfX0FsbF8zMl9maXJzdF9ieXRlc19vZl8yLWJ5dGVfc2VxdWVuY2VzX18weGMwLTB4ZGZfLF9fX19fX19fX19ffCcKKz4nMDAzOV9fX19fX19fZWFjaF9mb2xsb3dlZF9ieV9hX3NwYWNlX2NoYXJhY3RlcjpfX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDQwX19fXyLAX8Ffwl/DX8RfxV/GX8dfyF/JX8pfy1/MX81fzl/PX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNDFfX19fX9Bf0V/SX9Nf1F/VX9Zf11/YX9lf2l/bX9xf3V/eX99fIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA0Ml8zLjIuMl9fQWxsXzE2X2ZpcnN0X2J5dGVzX29mXzMtYnl0ZV9zZXF1ZW5jZXNfXzB4ZTAtMHhlZl8sX19fX19fX19fX198JworPicwMDQzX19fX19fX19lYWNoX2ZvbGxvd2VkX2J5X2Ffc3BhY2VfY2hhcmFjdGVyOl9fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNDRfX19fIuBf4V/iX+Nf5F/lX+Zf51/oX+lf6l/rX+xf7V/uX+9fIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA0NV8zLjIuM19fQWxsXzhfZmlyc3RfYnl0ZXNfb2ZfNC1ieXRlX3NlcXVlbmNlc19fMHhmMC0weGY3XyxfX19fX19fX19fX198JworPicwMDQ2X19fX19fX19lYWNoX2ZvbGxvd2VkX2J5X2Ffc3BhY2VfY2hhcmFjdGVyOl9fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNDdfX19fIvBf8V/yX/Nf9F/1X/Zf918iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA0OF8zLjIuNF9fQWxsXzRfZmlyc3RfYnl0ZXNfb2ZfNS1ieXRlX3NlcXVlbmNlc19fMHhmOC0weGZiXyxfX19fX19fX19fX198JworPicwMDQ5X19fX19fX19lYWNoX2ZvbGxvd2VkX2J5X2Ffc3BhY2VfY2hhcmFjdGVyOl9fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNTBfX19fIvhf+V/6X/tfIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA1MV8zLjIuNV9fQWxsXzJfZmlyc3RfYnl0ZXNfb2ZfNi1ieXRlX3NlcXVlbmNlc19fMHhmYy0weGZkXyxfX19fX19fX19fX198JworPicwMDUyX19fX19fX19lYWNoX2ZvbGxvd2VkX2J5X2Ffc3BhY2VfY2hhcmFjdGVyOl9fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNTNfX19fIvxf/V8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA1NF8zLjNfX1NlcXVlbmNlc193aXRoX2xhc3RfY29udGludWF0aW9uX2J5dGVfbWlzc2luZ19fX19fX19fX19fX19fX19fX198JworPicwMDU1XzMuMy4xX18yLWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVSswMDAwXzpfX19fXyLAIl9fX19fX3wnCis+JzAwNTZfMy4zLjJfXzMtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VKzAwMDBfOl9fX19fIuCAIl9fX19fX3wnCis+JzAwNTdfMy4zLjNfXzQtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VKzAwMDBfOl9fX19fIvCAgCJfX19fX198JworPicwMDU4XzMuMy40X181LWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVSswMDAwXzpfX19fXyL4gICAIl9fX19fX3wnCis+JzAwNTlfMy4zLjVfXzYtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VKzAwMDBfOl9fX19fIvyAgICAIl9fX19fX3wnCis+JzAwNjBfMy4zLjZfXzItYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VLTAwMDAwN0ZGXzpfIt8iX19fX19ffCcKKz4nMDA2MV8zLjMuN19fMy1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UtMDAwMEZGRkZfOl8i778iX19fX19ffCcKKz4nMDA2Ml8zLjMuOF9fNC1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UtMDAxRkZGRkZfOl8i97+/Il9fX19fX3wnCis+JzAwNjNfMy4zLjlfXzUtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VLTAzRkZGRkZGXzpfIvu/v78iX19fX19ffCcKKz4nMDA2NF8zLjMuMTBfNi1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UtN0ZGRkZGRkZfOl8i/b+/v78iX19fX19ffCcKKz4nMDA2NV8zLjRfX0NvbmNhdGVuYXRpb25fb2ZfaW5jb21wbGV0ZV9zZXF1ZW5jZXNfX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDY2X19fXyLA4IDwgID4gICA/ICAgIDf77/3v7/7v7+//b+/v78iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA2N18zLjVfX0ltcG9zc2libGVfYnl0ZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDY4XzMuNS4xX19mZV89XyL+Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNjlfMy41LjJfX2ZmXz1fIv8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA3MF8zLjUuM19fZmVfZmVfZmZfZmZfPV8i/v7//yJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDcxXzRfX092ZXJsb25nX3NlcXVlbmNlc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNzJfNC4xX19FeGFtcGxlc19vZl9hbl9vdmVybG9uZ19BU0NJSV9jaGFyYWN0ZXJfX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA3M180LjEuMV9VKzAwMkZfPV9jMF9hZl9fX19fX19fX19fX189XyLAryJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA3NF80LjEuMl9VKzAwMkZfPV9lMF84MF9hZl9fX19fX19fX189XyLggK8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNzVfNC4xLjNfVSswMDJGXz1fZjBfODBfODBfYWZfX19fX19fPV8i8ICAryJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA3Nl80LjEuNF9VKzAwMkZfPV9mOF84MF84MF84MF9hZl9fX189XyL4gICAryJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA3N180LjEuNV9VKzAwMkZfPV9mY184MF84MF84MF84MF9hZl89XyL8gICAgK8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwNzhfNC4yX19NYXhpbXVtX292ZXJsb25nX3NlcXVlbmNlc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA3OV80LjIuMV9fVS0wMDAwMDA3Rl89X2MxX2JmX19fX19fX19fX19fXz1fIsG/Il9fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA4MF80LjIuMl9fVS0wMDAwMDdGRl89X2UwXzlmX2JmX19fX19fX19fXz1fIuCfvyJfX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwODFfNC4yLjNfX1UtMDAwMEZGRkZfPV9mMF84Zl9iZl9iZl9fX19fX189XyLwj7+/Il9fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA4Ml80LjIuNF9fVS0wMDFGRkZGRl89X2Y4Xzg3X2JmX2JmX2JmX19fXz1fIviHv7+/Il9fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA4M180LjIuNV9fVS0wM0ZGRkZGRl89X2ZjXzgzX2JmX2JmX2JmX2JmXz1fIvyDv7+/vyJfX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwODRfNC4zX19PdmVybG9uZ19yZXByZXNlbnRhdGlvbl9vZl90aGVfTlVMX2NoYXJhY3Rlcl9fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA4NV80LjMuMV9fVSswMDAwXz1fYzBfODBfX19fX19fX19fX19fPV8iwIAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA4Nl80LjMuMl9fVSswMDAwXz1fZTBfODBfODBfX19fX19fX19fPV8i4ICAIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwODdfNC4zLjNfX1UrMDAwMF89X2YwXzgwXzgwXzgwX19fX19fXz1fIvCAgIAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA4OF80LjMuNF9fVSswMDAwXz1fZjhfODBfODBfODBfODBfX19fPV8i+ICAgIAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA4OV80LjMuNV9fVSswMDAwXz1fZmNfODBfODBfODBfODBfODBfPV8i/ICAgICAIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwOTBfNV9fSWxsZWdhbF9jb2RlX3Bvc2l0aW9uc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA5MV81LjFfU2luZ2xlX1VURi0xNl9zdXJyb2dhdGVzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDkyXzUuMS4xX19VK0Q4MDBfPV9lZF9hMF84MF89XyLtoIAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA5M181LjEuMl9fVStEQjdGXz1fZWRfYWRfYmZfPV8i7a2/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwOTRfNS4xLjNfX1UrREI4MF89X2VkX2FlXzgwXz1fIu2ugCJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDk1XzUuMS40X19VK0RCRkZfPV9lZF9hZl9iZl89XyLtr78iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA5Nl81LjEuNV9fVStEQzAwXz1fZWRfYjBfODBfPV8i7bCAIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAwOTdfNS4xLjZfX1UrREY4MF89X2VkX2JlXzgwXz1fIu2+gCJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMDk4XzUuMS43X19VK0RGRkZfPV9lZF9iZl9iZl89XyLtv78iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKKz4nMDA5OV81LjJfUGFpcmVkX1VURi0xNl9zdXJyb2dhdGVzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMTAwXzUuMi4xX19VK0Q4MDBfVStEQzAwXz1fZWRfYTBfODBfZWRfYjBfODBfPV8i7aCA7bCAIl9fX19fX19fX19fX19fX19fX19fX198JworPicwMTAxXzUuMi4yX19VK0Q4MDBfVStERkZGXz1fZWRfYTBfODBfZWRfYmZfYmZfPV8i7aCA7b+/Il9fX19fX19fX19fX19fX19fX19fX198JworPicwMTAyXzUuMi4zX19VK0RCN0ZfVStEQzAwXz1fZWRfYWRfYmZfZWRfYjBfODBfPV8i7a2/7bCAIl9fX19fX19fX19fX19fX19fX19fX198JworPicwMTAzXzUuMi40X19VK0RCN0ZfVStERkZGXz1fZWRfYWRfYmZfZWRfYmZfYmZfPV8i7a2/7b+/Il9fX19fX19fX19fX19fX19fX19fX198JworPicwMTA0XzUuMi41X19VK0RCODBfVStEQzAwXz1fZWRfYWVfODBfZWRfYjBfODBfPV8i7a6A7bCAIl9fX19fX19fX19fX19fX19fX19fX198JworPicwMTA1XzUuMi42X19VK0RCODBfVStERkZGXz1fZWRfYWVfODBfZWRfYmZfYmZfPV8i7a6A7b+/Il9fX19fX19fX19fX19fX19fX19fX198JworPicwMTA2XzUuMi43X19VK0RCRkZfVStEQzAwXz1fZWRfYWZfYmZfZWRfYjBfODBfPV8i7a+/7bCAIl9fX19fX19fX19fX19fX19fX19fX198JworPicwMTA3XzUuMi44X19VK0RCRkZfVStERkZGXz1fZWRfYWZfYmZfZWRfYmZfYmZfPV8i7a+/7b+/Il9fX19fX19fX19fX19fX19fX19fX198JworPicwMTA4XzUuM19PdGhlcl9pbGxlZ2FsX2NvZGVfcG9zaXRpb25zX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wnCis+JzAxMDlfNS4zLjFfX1UrRkZGRV89X2VmX2JmX2JlXz1fIu+/viJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198JworPicwMTEwXzUuMy4yX19VK0ZGRkZfPV9lZl9iZl9iZl89XyLvv78iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffCcKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9scy50ZXN0cyBiL3Rlc3RzdWl0ZS9scy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45MzA5ZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2xzLnRlc3RzCkBAIC0wLDAgKzEsMjY4IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IDIwMTAgYnkgRGVueXMgVmxhc2Vua28KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKK3Rlc3QgLWYgIiRiaW5kaXIvLmNvbmZpZyIgJiYgLiAiJGJpbmRpci8uY29uZmlnIgorCitybSAtcmYgbHMudGVzdGRpciAyPi9kZXYvbnVsbAorbWtkaXIgbHMudGVzdGRpciB8fCBleGl0IDEKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJjb21tYW5kIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCisjIFdpdGggVW5pY29kZSBwcm92aWRlZCBieSBsaWJjIGxvY2FsZSwgSSdtIG5vdCBzdXJlIHRoaXMgdGVzdCBjYW4gcGFzcy4KKyMgSSBzdXNwZWN0IHdlIG1pZ2h0IGZhaWwgdG8gc2tpcCBleGFjdGx5IGNvcnJlY3QgbnVtYmVyIG9mIGJ5dGVzCisjIG92ZXIgYnJva2VkIHVuaWNvZGUgc2VxdWVuY2VzLgordGVzdCB4IiRDT05GSUdfVU5JQ09ERV9TVVBQT1JUIiA9IHgieSIgXAorJiYgdGVzdCB4IiRDT05GSUdfVU5JQ09ERV9VU0lOR19MT0NBTEUiICE9IHgieSIgXAorJiYgdGVzdCB4IiRDT05GSUdfU1VCU1RfV0NIQVIiID0geCI2MyIgXAorJiYgdGVzdCB4IiRDT05GSUdfTEFTVF9TVVBQT1JURURfV0NIQVIiID0geCI3NjciIFwKKyYmIHRlc3QgeCIkQ09ORklHX0ZFQVRVUkVfTFNfU09SVEZJTEVTIiA9IHgieSIgXAorJiYgdGVzdGluZyAibHMgdW5pY29kZSB0ZXN0IHdpdGggY29kZXBvaW50cyBsaW1pdGVkIHRvIDc2NyIgXAorIihjZCBscy50ZXN0ZGlyICYmIHNoIC4uL2xzLm1rX3VuaV90ZXN0cykgJiYgbHMgLTEgbHMudGVzdGRpciIgXAorJzAwMDFfMV9fU29tZV9jb3JyZWN0X1VURi04X3RleHRfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAwMl8yX19Cb3VuZGFyeV9jb25kaXRpb25fdGVzdF9jYXNlc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDAzXzIuMV9fRmlyc3RfcG9zc2libGVfc2VxdWVuY2Vfb2ZfYV9jZXJ0YWluX2xlbmd0aF9fX19fX19fX19fX19fX19fX19fX3wKKzAwMDRfMi4xLjJfXzJfYnl0ZXNfX1UtMDAwMDAwODBfOl9fX19fX19fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAwNV8yLjEuM19fM19ieXRlc19fVS0wMDAwMDgwMF86X19fX19fX18iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDA2XzIuMS40X180X2J5dGVzX19VLTAwMDEwMDAwXzpfX19fX19fXyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMDdfMi4xLjVfXzVfYnl0ZXNfX1UtMDAyMDAwMDBfOl9fX19fX19fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAwOF8yLjEuNl9fNl9ieXRlc19fVS0wNDAwMDAwMF86X19fX19fX18iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDA5XzIuMl9fTGFzdF9wb3NzaWJsZV9zZXF1ZW5jZV9vZl9hX2NlcnRhaW5fbGVuZ3RoX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMTBfMi4yLjFfXzFfYnl0ZV9fX1UtMDAwMDAwN0ZfOl9fX19fX19fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAxMV8yLjIuMl9fMl9ieXRlc19fVS0wMDAwMDdGRl86X19fX19fX18iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDEyXzIuMi4zX18zX2J5dGVzX19VLTAwMDBGRkZGXzpfX19fX19fXyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMTNfMi4yLjRfXzRfYnl0ZXNfX1UtMDAxRkZGRkZfOl9fX19fX19fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAxNF8yLjIuNV9fNV9ieXRlc19fVS0wM0ZGRkZGRl86X19fX19fX18iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDE1XzIuMi42X182X2J5dGVzX19VLTdGRkZGRkZGXzpfX19fX19fXyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMTZfMi4zX19PdGhlcl9ib3VuZGFyeV9jb25kaXRpb25zX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAxN18yLjMuMV9fVS0wMDAwRDdGRl89X2VkXzlmX2JmXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDE4XzIuMy4yX19VLTAwMDBFMDAwXz1fZWVfODBfODBfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMTlfMi4zLjNfX1UtMDAwMEZGRkRfPV9lZl9iZl9iZF89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAyMF8yLjMuNF9fVS0wMDEwRkZGRl89X2Y0XzhmX2JmX2JmXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDIxXzIuMy41X19VLTAwMTEwMDAwXz1fZjRfOTBfODBfODBfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMjJfM19fTWFsZm9ybWVkX3NlcXVlbmNlc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAyM18zLjFfX1VuZXhwZWN0ZWRfY29udGludWF0aW9uX2J5dGVzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDI0XzMuMS4xX19GaXJzdF9jb250aW51YXRpb25fYnl0ZV8weDgwOl8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMjVfMy4xLjJfX0xhc3RfX2NvbnRpbnVhdGlvbl9ieXRlXzB4YmY6XyI/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/Il9fX19fX19fX19fX19fX19fX19fX198CiswMTA4XzUuM19PdGhlcl9pbGxlZ2FsX2NvZGVfcG9zaXRpb25zX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAxMDlfNS4zLjFfX1UrRkZGRV89X2VmX2JmX2JlXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDExMF81LjMuMl9fVStGRkZGXz1fZWZfYmZfYmZfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CisnICIiICIiCisKKyMgQ3VycmVudGx5IGZhaWxzIG9uICIwMDgwXzQuMi4yX19VLTAwMDAwN0ZGXz1fZTBfOWZfYmYiIGxpbmUKK3Rlc3QgeCIkQ09ORklHX1VOSUNPREVfU1VQUE9SVCIgPSB4InkiIFwKKyYmIHRlc3QgeCIkQ09ORklHX1VOSUNPREVfVVNJTkdfTE9DQUxFIiAhPSB4InkiIFwKKyYmIHRlc3QgeCIkQ09ORklHX1NVQlNUX1dDSEFSIiA9IHgiNjMiIFwKKyYmIHRlc3QgeCIkQ09ORklHX0xBU1RfU1VQUE9SVEVEX1dDSEFSIiA9IHgiMCIgXAorJiYgdGVzdGluZyAibHMgdW5pY29kZSB0ZXN0IHdpdGggdW5saW1pdGVkIGNvZGVwb2ludHMiIFwKKyIoY2QgbHMudGVzdGRpciAmJiBzaCAuLi9scy5ta191bmlfdGVzdHMpICYmIGxzIC0xIGxzLnRlc3RkaXIiIFwKKycwMDAxXzFfX1NvbWVfY29ycmVjdF9VVEYtOF90ZXh0X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMDJfMl9fQm91bmRhcnlfY29uZGl0aW9uX3Rlc3RfY2FzZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAwM18yLjFfX0ZpcnN0X3Bvc3NpYmxlX3NlcXVlbmNlX29mX2FfY2VydGFpbl9sZW5ndGhfX19fX19fX19fX19fX19fX19fX198CiswMDA0XzIuMS4yX18yX2J5dGVzX19VLTAwMDAwMDgwXzpfX19fX19fXyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMDVfMi4xLjNfXzNfYnl0ZXNfX1UtMDAwMDA4MDBfOl9fX19fX19fIuCggCJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDA2XzIuMS40X180X2J5dGVzX19VLTAwMDEwMDAwXzpfX19fX19fXyLwkICAIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMDdfMi4xLjVfXzVfYnl0ZXNfX1UtMDAyMDAwMDBfOl9fX19fX19fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAwOF8yLjEuNl9fNl9ieXRlc19fVS0wNDAwMDAwMF86X19fX19fX18iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDA5XzIuMl9fTGFzdF9wb3NzaWJsZV9zZXF1ZW5jZV9vZl9hX2NlcnRhaW5fbGVuZ3RoX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMTBfMi4yLjFfXzFfYnl0ZV9fX1UtMDAwMDAwN0ZfOl9fX19fX19fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAxMV8yLjIuMl9fMl9ieXRlc19fVS0wMDAwMDdGRl86X19fX19fX18i378iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAxMl8yLjIuM19fM19ieXRlc19fVS0wMDAwRkZGRl86X19fX19fX18iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDEzXzIuMi40X180X2J5dGVzX19VLTAwMUZGRkZGXzpfX19fX19fXyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMTRfMi4yLjVfXzVfYnl0ZXNfX1UtMDNGRkZGRkZfOl9fX19fX19fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAxNV8yLjIuNl9fNl9ieXRlc19fVS03RkZGRkZGRl86X19fX19fX18iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDE2XzIuM19fT3RoZXJfYm91bmRhcnlfY29uZGl0aW9uc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMTdfMi4zLjFfX1UtMDAwMEQ3RkZfPV9lZF85Zl9iZl89XyLtn78iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDE4XzIuMy4yX19VLTAwMDBFMDAwXz1fZWVfODBfODBfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMTlfMi4zLjNfX1UtMDAwMEZGRkRfPV9lZl9iZl9iZF89XyLvv70iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDIwXzIuMy40X19VLTAwMTBGRkZGXz1fZjRfOGZfYmZfYmZfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMjFfMi4zLjVfX1UtMDAxMTAwMDBfPV9mNF85MF84MF84MF89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAyMl8zX19NYWxmb3JtZWRfc2VxdWVuY2VzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDIzXzMuMV9fVW5leHBlY3RlZF9jb250aW51YXRpb25fYnl0ZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMjRfMy4xLjFfX0ZpcnN0X2NvbnRpbnVhdGlvbl9ieXRlXzB4ODA6XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAyNV8zLjEuMl9fTGFzdF9fY29udGludWF0aW9uX2J5dGVfMHhiZjpfIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDI2XzMuMS4zX18yX2NvbnRpbnVhdGlvbl9ieXRlczpfIj8/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMjdfMy4xLjRfXzNfY29udGludWF0aW9uX2J5dGVzOl8iPz8/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAyOF8zLjEuNV9fNF9jb250aW51YXRpb25fYnl0ZXM6XyI/Pz8/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDI5XzMuMS42X181X2NvbnRpbnVhdGlvbl9ieXRlczpfIj8/Pz8/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMzBfMy4xLjdfXzZfY29udGludWF0aW9uX2J5dGVzOl8iPz8/Pz8/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAzMV8zLjEuOF9fN19jb250aW51YXRpb25fYnl0ZXM6XyI/Pz8/Pz8/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDMyXzMuMS45X19TZXF1ZW5jZV9vZl9hbGxfNjRfcG9zc2libGVfY29udGludWF0aW9uX2J5dGVzX18weDgwLTB4YmZfOl9fX3wKKzAwMzNfX19fIj8/Pz8/Pz8/Pz8/Pz8/Pz9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAzNF9fX19fPz8/Pz8/Pz8/Pz8/Pz8/P19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDM1X19fX18/Pz8/Pz8/Pz8/Pz8/Pz8/X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwMzZfX19fXz8/Pz8/Pz8/Pz8/Pz8/Pz8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDAzN18zLjJfX0xvbmVseV9zdGFydF9jaGFyYWN0ZXJzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDM4XzMuMi4xX19BbGxfMzJfZmlyc3RfYnl0ZXNfb2ZfMi1ieXRlX3NlcXVlbmNlc19fMHhjMC0weGRmXyxfX19fX19fX19fX3wKKzAwMzlfX19fX19fX2VhY2hfZm9sbG93ZWRfYnlfYV9zcGFjZV9jaGFyYWN0ZXI6X19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA0MF9fX18iP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDQxX19fX18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18/XyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNDJfMy4yLjJfX0FsbF8xNl9maXJzdF9ieXRlc19vZl8zLWJ5dGVfc2VxdWVuY2VzX18weGUwLTB4ZWZfLF9fX19fX19fX19ffAorMDA0M19fX19fX19fZWFjaF9mb2xsb3dlZF9ieV9hX3NwYWNlX2NoYXJhY3RlcjpfX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDQ0X19fXyI/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18/Xz9fP18/XyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNDVfMy4yLjNfX0FsbF84X2ZpcnN0X2J5dGVzX29mXzQtYnl0ZV9zZXF1ZW5jZXNfXzB4ZjAtMHhmN18sX19fX19fX19fX19ffAorMDA0Nl9fX19fX19fZWFjaF9mb2xsb3dlZF9ieV9hX3NwYWNlX2NoYXJhY3RlcjpfX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDQ3X19fXyI/Xz9fP18/Xz9fP18/Xz9fIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNDhfMy4yLjRfX0FsbF80X2ZpcnN0X2J5dGVzX29mXzUtYnl0ZV9zZXF1ZW5jZXNfXzB4ZjgtMHhmYl8sX19fX19fX19fX19ffAorMDA0OV9fX19fX19fZWFjaF9mb2xsb3dlZF9ieV9hX3NwYWNlX2NoYXJhY3RlcjpfX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDUwX19fXyI/Xz9fP18/XyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNTFfMy4yLjVfX0FsbF8yX2ZpcnN0X2J5dGVzX29mXzYtYnl0ZV9zZXF1ZW5jZXNfXzB4ZmMtMHhmZF8sX19fX19fX19fX19ffAorMDA1Ml9fX19fX19fZWFjaF9mb2xsb3dlZF9ieV9hX3NwYWNlX2NoYXJhY3RlcjpfX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDUzX19fXyI/Xz9fIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNTRfMy4zX19TZXF1ZW5jZXNfd2l0aF9sYXN0X2NvbnRpbnVhdGlvbl9ieXRlX21pc3NpbmdfX19fX19fX19fX19fX19fX19ffAorMDA1NV8zLjMuMV9fMi1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UrMDAwMF86X19fX18iPyJfX19fX198CiswMDU2XzMuMy4yX18zLWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVSswMDAwXzpfX19fXyI/Il9fX19fX3wKKzAwNTdfMy4zLjNfXzQtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VKzAwMDBfOl9fX19fIj8iX19fX19ffAorMDA1OF8zLjMuNF9fNS1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UrMDAwMF86X19fX18iPyJfX19fX198CiswMDU5XzMuMy41X182LWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVSswMDAwXzpfX19fXyI/Il9fX19fX3wKKzAwNjBfMy4zLjZfXzItYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VLTAwMDAwN0ZGXzpfIj8iX19fX19ffAorMDA2MV8zLjMuN19fMy1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UtMDAwMEZGRkZfOl8iPyJfX19fX198CiswMDYyXzMuMy44X180LWJ5dGVfc2VxdWVuY2Vfd2l0aF9sYXN0X2J5dGVfbWlzc2luZ19fVS0wMDFGRkZGRl86XyI/Il9fX19fX3wKKzAwNjNfMy4zLjlfXzUtYnl0ZV9zZXF1ZW5jZV93aXRoX2xhc3RfYnl0ZV9taXNzaW5nX19VLTAzRkZGRkZGXzpfIj8iX19fX19ffAorMDA2NF8zLjMuMTBfNi1ieXRlX3NlcXVlbmNlX3dpdGhfbGFzdF9ieXRlX21pc3NpbmdfX1UtN0ZGRkZGRkZfOl8iPyJfX19fX198CiswMDY1XzMuNF9fQ29uY2F0ZW5hdGlvbl9vZl9pbmNvbXBsZXRlX3NlcXVlbmNlc19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNjZfX19fIj8/Pz8/Pz8/Pz8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA2N18zLjVfX0ltcG9zc2libGVfYnl0ZXNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDY4XzMuNS4xX19mZV89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNjlfMy41LjJfX2ZmXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA3MF8zLjUuM19fZmVfZmVfZmZfZmZfPV8iPz8/PyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDcxXzRfX092ZXJsb25nX3NlcXVlbmNlc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNzJfNC4xX19FeGFtcGxlc19vZl9hbl9vdmVybG9uZ19BU0NJSV9jaGFyYWN0ZXJfX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA3M180LjEuMV9VKzAwMkZfPV9jMF9hZl9fX19fX19fX19fX189XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDc0XzQuMS4yX1UrMDAyRl89X2UwXzgwX2FmX19fX19fX19fXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNzVfNC4xLjNfVSswMDJGXz1fZjBfODBfODBfYWZfX19fX19fPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA3Nl80LjEuNF9VKzAwMkZfPV9mOF84MF84MF84MF9hZl9fX189XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDc3XzQuMS41X1UrMDAyRl89X2ZjXzgwXzgwXzgwXzgwX2FmXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwNzhfNC4yX19NYXhpbXVtX292ZXJsb25nX3NlcXVlbmNlc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA3OV80LjIuMV9fVS0wMDAwMDA3Rl89X2MxX2JmX19fX19fX19fX19fXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDgwXzQuMi4yX19VLTAwMDAwN0ZGXz1fZTBfOWZfYmZfX19fX19fX19fPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwODFfNC4yLjNfX1UtMDAwMEZGRkZfPV9mMF84Zl9iZl9iZl9fX19fX189XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA4Ml80LjIuNF9fVS0wMDFGRkZGRl89X2Y4Xzg3X2JmX2JmX2JmX19fXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDgzXzQuMi41X19VLTAzRkZGRkZGXz1fZmNfODNfYmZfYmZfYmZfYmZfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwODRfNC4zX19PdmVybG9uZ19yZXByZXNlbnRhdGlvbl9vZl90aGVfTlVMX2NoYXJhY3Rlcl9fX19fX19fX19fX19fX19fX19ffAorMDA4NV80LjMuMV9fVSswMDAwXz1fYzBfODBfX19fX19fX19fX19fPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDg2XzQuMy4yX19VKzAwMDBfPV9lMF84MF84MF9fX19fX19fX189XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwODdfNC4zLjNfX1UrMDAwMF89X2YwXzgwXzgwXzgwX19fX19fXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA4OF80LjMuNF9fVSswMDAwXz1fZjhfODBfODBfODBfODBfX19fPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDg5XzQuMy41X19VKzAwMDBfPV9mY184MF84MF84MF84MF84MF89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwOTBfNV9fSWxsZWdhbF9jb2RlX3Bvc2l0aW9uc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA5MV81LjFfU2luZ2xlX1VURi0xNl9zdXJyb2dhdGVzX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDkyXzUuMS4xX19VK0Q4MDBfPV9lZF9hMF84MF89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwOTNfNS4xLjJfX1UrREI3Rl89X2VkX2FkX2JmXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA5NF81LjEuM19fVStEQjgwXz1fZWRfYWVfODBfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDk1XzUuMS40X19VK0RCRkZfPV9lZF9hZl9iZl89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwOTZfNS4xLjVfX1UrREMwMF89X2VkX2IwXzgwXz1fIj8iX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDA5N181LjEuNl9fVStERjgwXz1fZWRfYmVfODBfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMDk4XzUuMS43X19VK0RGRkZfPV9lZF9iZl9iZl89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKzAwOTlfNS4yX1BhaXJlZF9VVEYtMTZfc3Vycm9nYXRlc19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDEwMF81LjIuMV9fVStEODAwX1UrREMwMF89X2VkX2EwXzgwX2VkX2IwXzgwXz1fIj8/Il9fX19fX19fX19fX19fX19fX19fX198CiswMTAxXzUuMi4yX19VK0Q4MDBfVStERkZGXz1fZWRfYTBfODBfZWRfYmZfYmZfPV8iPz8iX19fX19fX19fX19fX19fX19fX19fX3wKKzAxMDJfNS4yLjNfX1UrREI3Rl9VK0RDMDBfPV9lZF9hZF9iZl9lZF9iMF84MF89XyI/PyJfX19fX19fX19fX19fX19fX19fX19ffAorMDEwM181LjIuNF9fVStEQjdGX1UrREZGRl89X2VkX2FkX2JmX2VkX2JmX2JmXz1fIj8/Il9fX19fX19fX19fX19fX19fX19fX198CiswMTA0XzUuMi41X19VK0RCODBfVStEQzAwXz1fZWRfYWVfODBfZWRfYjBfODBfPV8iPz8iX19fX19fX19fX19fX19fX19fX19fX3wKKzAxMDVfNS4yLjZfX1UrREI4MF9VK0RGRkZfPV9lZF9hZV84MF9lZF9iZl9iZl89XyI/PyJfX19fX19fX19fX19fX19fX19fX19ffAorMDEwNl81LjIuN19fVStEQkZGX1UrREMwMF89X2VkX2FmX2JmX2VkX2IwXzgwXz1fIj8/Il9fX19fX19fX19fX19fX19fX19fX198CiswMTA3XzUuMi44X19VK0RCRkZfVStERkZGXz1fZWRfYWZfYmZfZWRfYmZfYmZfPV8iPz8iX19fX19fX19fX19fX19fX19fX19fX3wKKzAxMDhfNS4zX090aGVyX2lsbGVnYWxfY29kZV9wb3NpdGlvbnNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19ffAorMDEwOV81LjMuMV9fVStGRkZFXz1fZWZfYmZfYmVfPV8iPyJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX198CiswMTEwXzUuMy4yX19VK0ZGRkZfPV9lZl9iZl9iZl89XyI/Il9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX3wKKycgIiIgIiIKKworcm0gLXJmIGxzLnRlc3RkaXIgMj4vZGV2L251bGwKK21rZGlyIGxzLnRlc3RkaXIgfHwgZXhpdCAxCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAiY29tbWFuZCIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKwordGVzdCB4IiRDT05GSUdfRkVBVFVSRV9MU19TT1JURklMRVMiID0geCJ5IiBcCismJiB0ZXN0aW5nICJscyBzeW1saW5rX3RvX2RpciIgXAorInRvdWNoIGxzLnRlc3RkaXIvQSBscy50ZXN0ZGlyL0I7IGxuIC1zIGxzLnRlc3RkaXIgbHMubGluazsgbHMgbHMubGluazsgbHMgLTEgbHMubGluay87IGxzIC0xIGxzLmxpbms7IHJtIC1mIGxzLmxpbmsiIFwKKyJBXG5CXG5BXG5CXG5BXG5CXG4iIFwKKyIiICIiCisKKyMgQ2xlYW4gdXAKK3JtIC1yZiBscy50ZXN0ZGlyIDI+L2Rldi9udWxsCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2xzL2xzLTEtd29ya3MgYi90ZXN0c3VpdGUvbHMvbHMtMS13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWFiOWE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2xzL2xzLTEtd29ya3MKQEAgLTAsMCArMSw2IEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX0xTX1NPUlRGSUxFUworCitbIC1uICIkZCIgXSB8fCBkPS4uCitMQ19BTEw9QyBscyAtMSAiJGQiID4gbG9nZmlsZS5nbnUKK0xDX0FMTD1DIGJ1c3lib3ggbHMgLTEgIiRkIiA+IGxvZ2ZpbGUuYmIKK2RpZmYgLXVidyBsb2dmaWxlLmdudSBsb2dmaWxlLmJiCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbHMvbHMtaC13b3JrcyBiL3Rlc3RzdWl0ZS9scy9scy1oLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMDE2YmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbHMvbHMtaC13b3JrcwpAQCAtMCwwICsxLDYgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfTFNfU09SVEZJTEVTIENPTkZJR19GRUFUVVJFX0hVTUFOX1JFQURBQkxFCisKK1sgLW4gIiRkIiBdIHx8IGQ9Li4KK0xDX0FMTD1DIGxzIC1oICIkZCIgPiBsb2dmaWxlLmdudQorTENfQUxMPUMgYnVzeWJveCBscyAtaCAiJGQiID4gbG9nZmlsZS5iYgorZGlmZiAtdWJ3IGxvZ2ZpbGUuZ251IGxvZ2ZpbGUuYmIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9scy9scy1sLXdvcmtzIGIvdGVzdHN1aXRlL2xzL2xzLWwtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UwODgxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9scy9scy1sLXdvcmtzCkBAIC0wLDAgKzEsOCBAQAordGVzdCB4IiRTS0lQX0tOT1dOX0JVR1MiICE9IHgiIiAmJiBleGl0CisKKyMgYnVzeWJveCBkb2VzIG5vdCBlbWl0ICJ0b3RhbCBOTk4iIGxpbmUKKworWyAtbiAiJGQiIF0gfHwgZD0uLgorTENfQUxMPUMgbHMgLWwgIiRkIiA+IGxvZ2ZpbGUuZ251CitMQ19BTEw9QyBidXN5Ym94IGxzIC1sICIkZCIgPiBsb2dmaWxlLmJiCitkaWZmIC11YncgbG9nZmlsZS5nbnUgbG9nZmlsZS5iYgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL2xzL2xzLXMtd29ya3MgYi90ZXN0c3VpdGUvbHMvbHMtcy13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmY1YzY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL2xzL2xzLXMtd29ya3MKQEAgLTAsMCArMSw4IEBACit0ZXN0IHgiJFNLSVBfS05PV05fQlVHUyIgIT0geCIiICYmIGV4aXQKKworIyBidXN5Ym94IGRvZXMgbm90IGVtaXQgInRvdGFsIE5OTiIgbGluZQorCitbIC1uICIkZCIgXSB8fCBkPS4uCitMQ19BTEw9QyBscyAtMXMgIiRkIiA+IGxvZ2ZpbGUuZ251CitMQ19BTEw9QyBidXN5Ym94IGxzIC0xcyAiJGQiID4gbG9nZmlsZS5iYgorZGlmZiAtdWJ3IGxvZ2ZpbGUuZ251IGxvZ2ZpbGUuYmIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9tYWtlZGV2cy5kZXZpY2VfdGFibGUudHh0IGIvdGVzdHN1aXRlL21ha2VkZXZzLmRldmljZV90YWJsZS50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhhYzIwOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9tYWtlZGV2cy5kZXZpY2VfdGFibGUudHh0CkBAIC0wLDAgKzEsMTcyIEBACisjIFdoZW4gYnVpbGRpbmcgYSB0YXJnZXQgZmlsZXN5c3RlbSwgaXQgaXMgZGVzaXJhYmxlIHRvIG5vdCBoYXZlIHRvCisjIGJlY29tZSByb290IGFuZCB0aGVuIHJ1biAnbWtub2QnIGEgdGhvdXNhbmQgdGltZXMuICBVc2luZyBhIGRldmljZQorIyB0YWJsZSB5b3UgY2FuIGNyZWF0ZSBkZXZpY2Ugbm9kZXMgYW5kIGRpcmVjdG9yaWVzICJvbiB0aGUgZmx5Ii4KKyMKKyMgVGhpcyBpcyBhIHNhbXBsZSBkZXZpY2UgdGFibGUgZmlsZSBmb3IgdXNlIHdpdGggZ2VuZXh0MmZzLiAgWW91IGNhbgorIyBkbyBhbGwgc29ydHMgb2YgaW50ZXJlc3RpbmcgdGhpbmdzIHdpdGggYSBkZXZpY2UgdGFibGUgZmlsZS4gIEZvcgorIyBleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBhZGp1c3QgdGhlIHBlcm1pc3Npb25zIG9uIGEgcGFydGljdWxhciBmaWxlCisjIHlvdSBjYW4ganVzdCBhZGQgYW4gZW50cnkgbGlrZToKKyMgICAvc2Jpbi9mb29iYXIgICAgICAgIGYgICAgICAgMjc1NSAgICAwICAgICAgIDAgICAgICAgLSAgICAgICAtICAgICAgIC0gICAgICAgLSAgICAgICAtCisjIGFuZCAoYXNzdW1pbmcgdGhlIGZpbGUgL3NiaW4vZm9vYmFyIGV4aXN0cykgaXQgd2lsbCBiZSBtYWRlIHNldHVpZAorIyByb290IChyZWdhcmRsZXNzIG9mIHdoYXQgaXRzIHBlcm1pc3Npb25zIGFyZSBvbiB0aGUgaG9zdCBmaWxlc3lzdGVtKS4KKyMgRnVydGhlcm1vcmUsIHlvdSBjYW4gdXNlIGEgc2luZ2xlIHRhYmxlIGVudHJ5IHRvIGNyZWF0ZSBhIG1hbnkgZGV2aWNlCisjIG1pbm9ycy4gIEZvciBleGFtcGxlLCBpZiBJIHdhbnRlZCB0byBjcmVhdGUgL2Rldi9oZGEgYW5kIC9kZXYvaGRhWzAtMTVdCisjIEkgY291bGQganVzdCB1c2UgdGhlIGZvbGxvd2luZyB0d28gdGFibGUgZW50cmllczoKKyMgICAvZGV2L2hkYSAgICBiICAgICAgIDY0MCAgICAgMCAgICAgICAwICAgICAgIDMgICAgICAgMCAgICAgICAwICAgICAgIDAgICAgICAgLQorIyAgIC9kZXYvaGRhICAgIGIgICAgICAgNjQwICAgICAwICAgICAgIDAgICAgICAgMyAgICAgICAxICAgICAgIDEgICAgICAgMSAgICAgICAxNQorIworIyBEZXZpY2UgdGFibGUgZW50cmllcyB0YWtlIHRoZSBmb3JtIG9mOgorIyA8bmFtZT4gICAgPHR5cGU+ICAgICAgPG1vZGU+ICA8dWlkPiAgIDxnaWQ+ICAgPG1ham9yPiA8bWlub3I+IDxzdGFydD4gPGluYz4gICA8Y291bnQ+CisjIHdoZXJlIG5hbWUgaXMgdGhlIGZpbGUgbmFtZSwgIHR5cGUgY2FuIGJlIG9uZSBvZjoKKyMgICAgICAgZiAgICAgICBBIHJlZ3VsYXIgZmlsZQorIyAgICAgICBkICAgICAgIERpcmVjdG9yeQorIyAgICAgICBjICAgICAgIENoYXJhY3RlciBzcGVjaWFsIGRldmljZSBmaWxlCisjICAgICAgIGIgICAgICAgQmxvY2sgc3BlY2lhbCBkZXZpY2UgZmlsZQorIyAgICAgICBwICAgICAgIEZpZm8gKG5hbWVkIHBpcGUpCisjIHVpZCBpcyB0aGUgdXNlciBpZCBmb3IgdGhlIHRhcmdldCBmaWxlLCBnaWQgaXMgdGhlIGdyb3VwIGlkIGZvciB0aGUKKyMgdGFyZ2V0IGZpbGUuICBUaGUgcmVzdCBvZiB0aGUgZW50cmllcyAobWFqb3IsIG1pbm9yLCBldGMpIGFwcGx5IG9ubHkKKyMgdG8gZGV2aWNlIHNwZWNpYWwgZmlsZXMuCisKKyMgSGF2ZSBmdW4KKyMgLUVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyMKKworIzxuYW1lPgkJPHR5cGU+CTxtb2RlPgk8dWlkPgk8Z2lkPgk8bWFqb3I+CTxtaW5vcj4JPHN0YXJ0Pgk8aW5jPgk8Y291bnQ+CisvZGV2CQlkCTc1NQkwCTAJLQktCS0JLQktCisvZGV2L3B0cwlkCTc1NQkwCTAJLQktCS0JLQktCisvZGV2L3NobQlkCTc1NQkwCTAJLQktCS0JLQktCisvdG1wCQlkCTE3NzcJMAkwCS0JLQktCS0JLQorL2V0YwkJZAk3NTUJMAkwCS0JLQktCS0JLQorL2hvbWUvZGVmYXVsdAlkCTI3NTUJMTAwMAkxMDAwCS0JLQktCS0JLQorIzxuYW1lPgkJCQkJPHR5cGU+CTxtb2RlPgk8dWlkPgk8Z2lkPgk8bWFqb3I+CTxtaW5vcj4JPHN0YXJ0Pgk8aW5jPgk8Y291bnQ+CisjIyMvYmluL2J1c3lib3gJCQkJZgk0NzU1CTAJMAktCS0JLQktCS0KKyMjIy9ldGMvc2hhZG93CQkJCWYJNjAwCTAJMAktCS0JLQktCS0KKyMjIy9ldGMvcGFzc3dkCQkJCWYJNjQ0CTAJMAktCS0JLQktCS0KKy9ldGMvbmV0d29yay9pZi11cC5kCQkJZAk3NTUJMAkwCS0JLQktCS0JLQorL2V0Yy9uZXR3b3JrL2lmLXByZS11cC5kCQlkCTc1NQkwCTAJLQktCS0JLQktCisvZXRjL25ldHdvcmsvaWYtZG93bi5kCQkJZAk3NTUJMAkwCS0JLQktCS0JLQorL2V0Yy9uZXR3b3JrL2lmLXBvc3QtZG93bi5kCQlkCTc1NQkwCTAJLQktCS0JLQktCisjIyMvdXNyL3NoYXJlL3VkaGNwYy9kZWZhdWx0LnNjcmlwdAlmCTc1NQkwCTAJLQktCS0JLQktCisjIHVuY29tbWVudCB0aGlzIHRvIGFsbG93IHN0YXJ0aW5nIHggYXMgbm9uLXJvb3QKKyMvdXNyL1gxMVI2L2Jpbi9YZmJkZXYJCWYJNDc1NQkwCTAJLQktCS0JLQktCisKKyMgTm9ybWFsIHN5c3RlbSBkZXZpY2VzCisjIDxuYW1lPiAgICA8dHlwZT4gICAgICA8bW9kZT4gIDx1aWQ+ICAgPGdpZD4gICA8bWFqb3I+IDxtaW5vcj4gPHN0YXJ0PiA8aW5jPiAgIDxjb3VudD4KKy9kZXYvbWVtCWMJNjQwCTAJMAkxCTEJMAkwCS0KKy9kZXYva21lbQljCTY0MAkwCTAJMQkyCTAJMAktCisvZGV2L251bGwJYwk2NjYJMAkwCTEJMwkwCTAJLQorL2Rldi96ZXJvCWMJNjY2CTAJMAkxCTUJMAkwCS0KKy9kZXYvcmFuZG9tCWMJNjY2CTAJMAkxCTgJMAkwCS0KKy9kZXYvdXJhbmRvbQljCTY2NgkwCTAJMQk5CTAJMAktCisvZGV2L3JhbQliCTY0MAkwCTAJMQkxCTAJMAktCisvZGV2L3JhbQliCTY0MAkwCTAJMQkwCTAJMQk0CisvZGV2L2xvb3AJYgk2NDAJMAkwCTcJMAkwCTEJMgorL2Rldi9ydGMJYwk2NDAJMAkwCTEwCTEzNQktCS0JLQorL2Rldi9jb25zb2xlCWMJNjY2CTAJMAk1CTEJLQktCS0KKy9kZXYvdHR5CWMJNjY2CTAJMAk1CTAJLQktCS0KKy9kZXYvdHR5CWMJNjY2CTAJMAk0CTAJMAkxCTgKKy9kZXYvdHR5cAljCTY2NgkwCTAJMwkwCTAJMQkxMAorL2Rldi9wdHlwCWMgICAgICAgNjY2ICAgICAwICAgICAgIDAgICAgICAgMiAgICAgICAwICAgICAgIDAgICAgICAgMSAgICAgICAxMAorL2Rldi9wdG14CWMJNjY2CTAJMAk1CTIJLQktCS0KKy9kZXYvdHR5UAljCTY2NgkwCTAJNTcJMAkwCTEJNAorL2Rldi90dHlTCWMJNjY2CTAJMAk0CTY0CTAJMQk0CisvZGV2L2ZiCQljCTY0MAkwCTUJMjkJMAkwCTMyCTQKKyMvZGV2L3R0eVNBCWMJNjY2CTAJMAkyMDQJNQkwCTEJMworL2Rldi9wc2F1eAljCTY2NgkwCTAJMTAJMQkwCTAJLQorIy9kZXYvcHBwCWMJNjY2CTAJMAkxMDgJMAktCS0JLQorCisjIElucHV0IHN0dWZmCisvZGV2L2lucHV0CWQJNzU1CTAJMAktCS0JLQktCS0KKy9kZXYvaW5wdXQvbWljZQljCTY0MAkwCTAJMTMJNjMJMAkwCS0KKy9kZXYvaW5wdXQvbW91c2UgYwk2NjAJMAkwCTEzCTMyCTAJMQk0CisvZGV2L2lucHV0L2V2ZW50IGMJNjYwCTAJMAkxMwk2NAkwCTEJNAorIy9kZXYvaW5wdXQvanMJYwk2NjAJMAkwCTEzCTAJMAkxCTQKKworCisjIE1URCBzdHVmZgorL2Rldi9tdGQJYwk2NDAJMAkwCTkwCTAJMAkyCTQKKy9kZXYvbXRkYmxvY2sJYgk2NDAJMAkwCTMxCTAJMAkxCTQKKworI1R1bi90YXAgZHJpdmVyCisvZGV2L25ldAlkCTc1NQkwCTAJLQktCS0JLQktCisvZGV2L25ldC90dW4JYwk2NjAJMAkwCTEwCTIwMAktCS0JLQorCisjIEF1ZGlvIHN0dWZmCisjL2Rldi9hdWRpbwljCTY2NgkwCTI5CTE0CTQJLQktCS0KKyMvZGV2L2F1ZGlvMQljCTY2NgkwCTI5CTE0CTIwCS0JLQktCisjL2Rldi9kc3AJYwk2NjYJMAkyOQkxNAkzCS0JLQktCisjL2Rldi9kc3AxCWMJNjY2CTAJMjkJMTQJMTkJLQktCS0KKyMvZGV2L3NuZHN0YXQJYwk2NjYJMAkyOQkxNAk2CS0JLQktCisKKyMgVXNlci1tb2RlIExpbnV4IHN0dWZmCisjL2Rldi91YmRhCWIJNjQwCTAJMAk5OAkwCTAJMAktCisjL2Rldi91YmRhCWIJNjQwCTAJMAk5OAkxCTEJMQkxNQorCisjIElERSBEZXZpY2VzCisvZGV2L2hkYQliCTY0MAkwCTAJMwkwCTAJMAktCisvZGV2L2hkYQliCTY0MAkwCTAJMwkxCTEJMQkxNQorL2Rldi9oZGIJYgk2NDAJMAkwCTMJNjQJMAkwCS0KKy9kZXYvaGRiCWIJNjQwCTAJMAkzCTY1CTEJMQkxNQorIy9kZXYvaGRjCWIJNjQwCTAJMAkyMgkwCTAJMAktCisjL2Rldi9oZGMJYgk2NDAJMAkwCTIyCTEJMQkxCTE1CisjL2Rldi9oZGQJYgk2NDAJMAkwCTIyCTY0CTAJMAktCisjL2Rldi9oZGQJYgk2NDAJMAkwCTIyCTY1CTEJMQkxNQorIy9kZXYvaGRlCWIJNjQwCTAJMAkzMwkwCTAJMAktCisjL2Rldi9oZGUJYgk2NDAJMAkwCTMzCTEJMQkxCTE1CisjL2Rldi9oZGYJYgk2NDAJMAkwCTMzCTY0CTAJMAktCisjL2Rldi9oZGYJYgk2NDAJMAkwCTMzCTY1CTEJMQkxNQorIy9kZXYvaGRnCWIJNjQwCTAJMAkzNAkwCTAJMAktCisjL2Rldi9oZGcJYgk2NDAJMAkwCTM0CTEJMQkxCTE1CisjL2Rldi9oZGgJYgk2NDAJMAkwCTM0CTY0CTAJMAktCisjL2Rldi9oZGgJYgk2NDAJMAkwCTM0CTY1CTEJMQkxNQorCisjIFNDU0kgRGV2aWNlcworIy9kZXYvc2RhCWIJNjQwCTAJMAk4CTAJMAkwCS0KKyMvZGV2L3NkYQliCTY0MAkwCTAJOAkxCTEJMQkxNQorIy9kZXYvc2RiCWIJNjQwCTAJMAk4CTE2CTAJMAktCisjL2Rldi9zZGIJYgk2NDAJMAkwCTgJMTcJMQkxCTE1CisjL2Rldi9zZGMJYgk2NDAJMAkwCTgJMzIJMAkwCS0KKyMvZGV2L3NkYwliCTY0MAkwCTAJOAkzMwkxCTEJMTUKKyMvZGV2L3NkZAliCTY0MAkwCTAJOAk0OAkwCTAJLQorIy9kZXYvc2RkCWIJNjQwCTAJMAk4CTQ5CTEJMQkxNQorIy9kZXYvc2RlCWIJNjQwCTAJMAk4CTY0CTAJMAktCisjL2Rldi9zZGUJYgk2NDAJMAkwCTgJNjUJMQkxCTE1CisjL2Rldi9zZGYJYgk2NDAJMAkwCTgJODAJMAkwCS0KKyMvZGV2L3NkZgliCTY0MAkwCTAJOAk4MQkxCTEJMTUKKyMvZGV2L3NkZwliCTY0MAkwCTAJOAk5NgkwCTAJLQorIy9kZXYvc2RnCWIJNjQwCTAJMAk4CTk3CTEJMQkxNQorIy9kZXYvc2RoCWIJNjQwCTAJMAk4CTExMgkwCTAJLQorIy9kZXYvc2RoCWIJNjQwCTAJMAk4CTExMwkxCTEJMTUKKyMvZGV2L3NnCWMJNjQwCTAJMAkyMQkwCTAJMQkxNQorIy9kZXYvc2NkCWIJNjQwCTAJMAkxMQkwCTAJMQkxNQorIy9kZXYvc3QJYwk2NDAJMAkwCTkJMAkwCTEJOAorIy9kZXYvbnN0CWMJNjQwCTAJMAk5CTEyOAkwCTEJOAorIy9kZXYvc3QJYwk2NDAJMAkwCTkJMzIJMQkxCTQKKyMvZGV2L3N0CWMJNjQwCTAJMAk5CTY0CTEJMQk0CisjL2Rldi9zdAljCTY0MAkwCTAJOQk5NgkxCTEJNAorCisjIEZsb3BweSBkaXNrIGRldmljZXMKKyMvZGV2L2ZkCWIJNjQwCTAJMAkyCTAJMAkxCTIKKyMvZGV2L2ZkMGQzNjAJYgk2NDAJMAkwCTIJNAkwCTAJLQorIy9kZXYvZmQxZDM2MAliCTY0MAkwCTAJMgk1CTAJMAktCisjL2Rldi9mZDBoMTIwMAliCTY0MAkwCTAJMgk4CTAJMAktCisjL2Rldi9mZDFoMTIwMAliCTY0MAkwCTAJMgk5CTAJMAktCisjL2Rldi9mZDB1MTQ0MAliCTY0MAkwCTAJMgkyOAkwCTAJLQorIy9kZXYvZmQxdTE0NDAJYgk2NDAJMAkwCTIJMjkJMAkwCS0KKyMvZGV2L2ZkMHUyODgwCWIJNjQwCTAJMAkyCTMyCTAJMAktCisjL2Rldi9mZDF1Mjg4MAliCTY0MAkwCTAJMgkzMwkwCTAJLQorCisjIEFsbCB0aGUgcHJvcHJpZXRhcnkgY2Ryb20gZGV2aWNlcyBpbiB0aGUgd29ybGQKKyMvZGV2L2F6dGNkCWIJNjQwCTAJMAkyOQkwCTAJMAktCisjL2Rldi9icGNkCWIJNjQwCTAJMAk0MQkwCTAJMAktCisjL2Rldi9jYXBpMjAJYwk2NDAJMAkwCTY4CTAJMAkxCTIKKyMvZGV2L2NkdTMxYQliCTY0MAkwCTAJMTUJMAkwCTAJLQorIy9kZXYvY2R1NTM1CWIJNjQwCTAJMAkyNAkwCTAJMAktCisjL2Rldi9jbTIwNmNkCWIJNjQwCTAJMAkzMgkwCTAJMAktCisjL2Rldi9zamNkCWIJNjQwCTAJMAkxOAkwCTAJMAktCisjL2Rldi9zb255Y2QJYgk2NDAJMAkwCTE1CTAJMAkwCS0KKyMvZGV2L2dzY2QJYgk2NDAJMAkwCTE2CTAJMAkwCS0KKyMvZGV2L3NicGNkCWIJNjQwCTAJMAkyNQkwCTAJMAktCisjL2Rldi9zYnBjZAliCTY0MAkwCTAJMjUJMAkwCTEJNAorIy9kZXYvbWNkCWIJNjQwCTAJMAkyMwkwCTAJMAktCisjL2Rldi9vcHRjZAliCTY0MAkwCTAJMTcJMAkwCTAJLQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL21ha2VkZXZzLnRlc3RzIGIvdGVzdHN1aXRlL21ha2VkZXZzLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI1MWZlMDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbWFrZWRldnMudGVzdHMKQEAgLTAsMCArMSwxNTAgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgMjAwOCBieSBEZW55cyBWbGFzZW5rbworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCit0ZXN0IHgiYGlkIC11YCIgPSB4IjAiIHx8IHsKKwllY2hvICJTS0lQUEVEOiBtYWtlZGV2cyAobXVzdCBiZSByb290IHRvIHRlc3QgdGhpcykiCisJZXhpdCAwCit9CisKK3Vuc2V0IExBTkcKK3Vuc2V0IExDX0NPTExBVEUKK3Vuc2V0IExDX0FMTAorCisjIGxzIC1sbiBpcyBzaG93aW5nIGRhdGUuIE5lZWQgdG8gcmVtb3ZlIHRoYXQsIGl0J3MgdmFyaWFibGUKKyMgc2VkOiAoMSkgIm1haiwgbWluIiAtPiAibWFqLG1pbiIgKDIpIGNvYWxlc2NlIHNwYWNlcworIyBjdXQ6IHJlbW92ZSBkYXRlCitGSUxURVJfTFM9InNlZCAtZSAncy8sICAqLywvZycgLWUgJ3MvICAqLyAvZycgfCBjdXQgLWQnICcgLWYgMS01LDktIgorIyBjdXQ6IHJlbW92ZSBzaXplK2RhdGUKK0ZJTFRFUl9MUzI9InNlZCAtZSAncy8sICAqLywvZycgLWUgJ3MvICAqLyAvZycgfCBjdXQgLWQnICcgLWYgMS00LDktIgorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgIm9wdGlvbnMiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKK3JtIC1yZiBtYWtlZGV2cy50ZXN0ZGlyCitta2RpciBtYWtlZGV2cy50ZXN0ZGlyCisKK29wdGlvbmFsIEZFQVRVUkVfTUFLRURFVlNfVEFCTEUgRkVBVFVSRV9GSU5EX05PVCBGRUFUVVJFX0ZJTkRfVFlQRSBGRUFUVVJFX0xTX1JFQ1VSU0lWRSBGRUFUVVJFX0xTX1NPUlRGSUxFUyBGRUFUVVJFX0xTX1RJTUVTVEFNUFMKK3Rlc3RpbmcgIm1ha2VkZXZzIC1kIC4uL21ha2VkZXZzLmRldmljZV90YWJsZS50eHQgLiIgXAorCSIoY2QgbWFrZWRldnMudGVzdGRpciAmJiBtYWtlZGV2cyAtZCAuLi9tYWtlZGV2cy5kZXZpY2VfdGFibGUudHh0IC4gMj4mMSk7CisJZmluZCBtYWtlZGV2cy50ZXN0ZGlyICEgLXR5cGUgZCB8IHNvcnQgfCB4YXJncyBscyAtbG5SIHwgJEZJTFRFUl9MUyIgXAorIlwKK3Jvb3RkaXI9LgordGFibGU9Jy4uL21ha2VkZXZzLmRldmljZV90YWJsZS50eHQnCitjcnctcnctcnctIDEgMCAwIDUsMSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9jb25zb2xlCitjcnctci0tLS0tIDEgMCA1IDI5LDAgbWFrZWRldnMudGVzdGRpci9kZXYvZmIwCitjcnctci0tLS0tIDEgMCA1IDI5LDMyIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2ZiMQorY3J3LXItLS0tLSAxIDAgNSAyOSw2NCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9mYjIKK2Nydy1yLS0tLS0gMSAwIDUgMjksOTYgbWFrZWRldnMudGVzdGRpci9kZXYvZmIzCiticnctci0tLS0tIDEgMCAwIDMsMCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGEKK2Jydy1yLS0tLS0gMSAwIDAgMywxIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTEKK2Jydy1yLS0tLS0gMSAwIDAgMywxMCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGExMAorYnJ3LXItLS0tLSAxIDAgMCAzLDExIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTExCiticnctci0tLS0tIDEgMCAwIDMsMTIgbWFrZWRldnMudGVzdGRpci9kZXYvaGRhMTIKK2Jydy1yLS0tLS0gMSAwIDAgMywxMyBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGExMworYnJ3LXItLS0tLSAxIDAgMCAzLDE0IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTE0Citicnctci0tLS0tIDEgMCAwIDMsMTUgbWFrZWRldnMudGVzdGRpci9kZXYvaGRhMTUKK2Jydy1yLS0tLS0gMSAwIDAgMywyIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTIKK2Jydy1yLS0tLS0gMSAwIDAgMywzIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTMKK2Jydy1yLS0tLS0gMSAwIDAgMyw0IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTQKK2Jydy1yLS0tLS0gMSAwIDAgMyw1IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTUKK2Jydy1yLS0tLS0gMSAwIDAgMyw2IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTYKK2Jydy1yLS0tLS0gMSAwIDAgMyw3IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTcKK2Jydy1yLS0tLS0gMSAwIDAgMyw4IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTgKK2Jydy1yLS0tLS0gMSAwIDAgMyw5IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYTkKK2Jydy1yLS0tLS0gMSAwIDAgMyw2NCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGIKK2Jydy1yLS0tLS0gMSAwIDAgMyw2NSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGIxCiticnctci0tLS0tIDEgMCAwIDMsNzQgbWFrZWRldnMudGVzdGRpci9kZXYvaGRiMTAKK2Jydy1yLS0tLS0gMSAwIDAgMyw3NSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGIxMQorYnJ3LXItLS0tLSAxIDAgMCAzLDc2IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYjEyCiticnctci0tLS0tIDEgMCAwIDMsNzcgbWFrZWRldnMudGVzdGRpci9kZXYvaGRiMTMKK2Jydy1yLS0tLS0gMSAwIDAgMyw3OCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGIxNAorYnJ3LXItLS0tLSAxIDAgMCAzLDc5IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYjE1Citicnctci0tLS0tIDEgMCAwIDMsNjYgbWFrZWRldnMudGVzdGRpci9kZXYvaGRiMgorYnJ3LXItLS0tLSAxIDAgMCAzLDY3IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYjMKK2Jydy1yLS0tLS0gMSAwIDAgMyw2OCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGI0Citicnctci0tLS0tIDEgMCAwIDMsNjkgbWFrZWRldnMudGVzdGRpci9kZXYvaGRiNQorYnJ3LXItLS0tLSAxIDAgMCAzLDcwIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYjYKK2Jydy1yLS0tLS0gMSAwIDAgMyw3MSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9oZGI3Citicnctci0tLS0tIDEgMCAwIDMsNzIgbWFrZWRldnMudGVzdGRpci9kZXYvaGRiOAorYnJ3LXItLS0tLSAxIDAgMCAzLDczIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2hkYjkKK2Nydy1ydy0tLS0gMSAwIDAgMTMsNjQgbWFrZWRldnMudGVzdGRpci9kZXYvaW5wdXQvZXZlbnQwCitjcnctcnctLS0tIDEgMCAwIDEzLDY1IG1ha2VkZXZzLnRlc3RkaXIvZGV2L2lucHV0L2V2ZW50MQorY3J3LXJ3LS0tLSAxIDAgMCAxMyw2NiBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9pbnB1dC9ldmVudDIKK2Nydy1ydy0tLS0gMSAwIDAgMTMsNjcgbWFrZWRldnMudGVzdGRpci9kZXYvaW5wdXQvZXZlbnQzCitjcnctci0tLS0tIDEgMCAwIDEzLDYzIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2lucHV0L21pY2UKK2Nydy1ydy0tLS0gMSAwIDAgMTMsMzIgbWFrZWRldnMudGVzdGRpci9kZXYvaW5wdXQvbW91c2UwCitjcnctcnctLS0tIDEgMCAwIDEzLDMzIG1ha2VkZXZzLnRlc3RkaXIvZGV2L2lucHV0L21vdXNlMQorY3J3LXJ3LS0tLSAxIDAgMCAxMywzNCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9pbnB1dC9tb3VzZTIKK2Nydy1ydy0tLS0gMSAwIDAgMTMsMzUgbWFrZWRldnMudGVzdGRpci9kZXYvaW5wdXQvbW91c2UzCitjcnctci0tLS0tIDEgMCAwIDEsMiBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9rbWVtCiticnctci0tLS0tIDEgMCAwIDcsMCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9sb29wMAorYnJ3LXItLS0tLSAxIDAgMCA3LDEgbWFrZWRldnMudGVzdGRpci9kZXYvbG9vcDEKK2Nydy1yLS0tLS0gMSAwIDAgMSwxIG1ha2VkZXZzLnRlc3RkaXIvZGV2L21lbQorY3J3LXItLS0tLSAxIDAgMCA5MCwwIG1ha2VkZXZzLnRlc3RkaXIvZGV2L210ZDAKK2Nydy1yLS0tLS0gMSAwIDAgOTAsMiBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9tdGQxCitjcnctci0tLS0tIDEgMCAwIDkwLDQgbWFrZWRldnMudGVzdGRpci9kZXYvbXRkMgorY3J3LXItLS0tLSAxIDAgMCA5MCw2IG1ha2VkZXZzLnRlc3RkaXIvZGV2L210ZDMKK2Jydy1yLS0tLS0gMSAwIDAgMzEsMCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9tdGRibG9jazAKK2Jydy1yLS0tLS0gMSAwIDAgMzEsMSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9tdGRibG9jazEKK2Jydy1yLS0tLS0gMSAwIDAgMzEsMiBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9tdGRibG9jazIKK2Jydy1yLS0tLS0gMSAwIDAgMzEsMyBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9tdGRibG9jazMKK2Nydy1ydy0tLS0gMSAwIDAgMTAsMjAwIG1ha2VkZXZzLnRlc3RkaXIvZGV2L25ldC90dW4KK2Nydy1ydy1ydy0gMSAwIDAgMSwzIG1ha2VkZXZzLnRlc3RkaXIvZGV2L251bGwKK2Nydy1ydy1ydy0gMSAwIDAgMTAsMSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9wc2F1eAorY3J3LXJ3LXJ3LSAxIDAgMCA1LDIgbWFrZWRldnMudGVzdGRpci9kZXYvcHRteAorY3J3LXJ3LXJ3LSAxIDAgMCAyLDAgbWFrZWRldnMudGVzdGRpci9kZXYvcHR5cDAKK2Nydy1ydy1ydy0gMSAwIDAgMiwxIG1ha2VkZXZzLnRlc3RkaXIvZGV2L3B0eXAxCitjcnctcnctcnctIDEgMCAwIDIsMiBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9wdHlwMgorY3J3LXJ3LXJ3LSAxIDAgMCAyLDMgbWFrZWRldnMudGVzdGRpci9kZXYvcHR5cDMKK2Nydy1ydy1ydy0gMSAwIDAgMiw0IG1ha2VkZXZzLnRlc3RkaXIvZGV2L3B0eXA0CitjcnctcnctcnctIDEgMCAwIDIsNSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9wdHlwNQorY3J3LXJ3LXJ3LSAxIDAgMCAyLDYgbWFrZWRldnMudGVzdGRpci9kZXYvcHR5cDYKK2Nydy1ydy1ydy0gMSAwIDAgMiw3IG1ha2VkZXZzLnRlc3RkaXIvZGV2L3B0eXA3CitjcnctcnctcnctIDEgMCAwIDIsOCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9wdHlwOAorY3J3LXJ3LXJ3LSAxIDAgMCAyLDkgbWFrZWRldnMudGVzdGRpci9kZXYvcHR5cDkKK2Jydy1yLS0tLS0gMSAwIDAgMSwxIG1ha2VkZXZzLnRlc3RkaXIvZGV2L3JhbQorYnJ3LXItLS0tLSAxIDAgMCAxLDAgbWFrZWRldnMudGVzdGRpci9kZXYvcmFtMAorYnJ3LXItLS0tLSAxIDAgMCAxLDEgbWFrZWRldnMudGVzdGRpci9kZXYvcmFtMQorYnJ3LXItLS0tLSAxIDAgMCAxLDIgbWFrZWRldnMudGVzdGRpci9kZXYvcmFtMgorYnJ3LXItLS0tLSAxIDAgMCAxLDMgbWFrZWRldnMudGVzdGRpci9kZXYvcmFtMworY3J3LXJ3LXJ3LSAxIDAgMCAxLDggbWFrZWRldnMudGVzdGRpci9kZXYvcmFuZG9tCitjcnctci0tLS0tIDEgMCAwIDEwLDEzNSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi9ydGMKK2Nydy1ydy1ydy0gMSAwIDAgNSwwIG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eQorY3J3LXJ3LXJ3LSAxIDAgMCA0LDAgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5MAorY3J3LXJ3LXJ3LSAxIDAgMCA0LDEgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5MQorY3J3LXJ3LXJ3LSAxIDAgMCA0LDIgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5MgorY3J3LXJ3LXJ3LSAxIDAgMCA0LDMgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5MworY3J3LXJ3LXJ3LSAxIDAgMCA0LDQgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5NAorY3J3LXJ3LXJ3LSAxIDAgMCA0LDUgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5NQorY3J3LXJ3LXJ3LSAxIDAgMCA0LDYgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5NgorY3J3LXJ3LXJ3LSAxIDAgMCA0LDcgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5NworY3J3LXJ3LXJ3LSAxIDAgMCA1NywwIG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eVAwCitjcnctcnctcnctIDEgMCAwIDU3LDEgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5UDEKK2Nydy1ydy1ydy0gMSAwIDAgNTcsMiBtYWtlZGV2cy50ZXN0ZGlyL2Rldi90dHlQMgorY3J3LXJ3LXJ3LSAxIDAgMCA1NywzIG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eVAzCitjcnctcnctcnctIDEgMCAwIDQsNjQgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5UzAKK2Nydy1ydy1ydy0gMSAwIDAgNCw2NSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi90dHlTMQorY3J3LXJ3LXJ3LSAxIDAgMCA0LDY2IG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eVMyCitjcnctcnctcnctIDEgMCAwIDQsNjcgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5UzMKK2Nydy1ydy1ydy0gMSAwIDAgMywwIG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eXAwCitjcnctcnctcnctIDEgMCAwIDMsMSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi90dHlwMQorY3J3LXJ3LXJ3LSAxIDAgMCAzLDIgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5cDIKK2Nydy1ydy1ydy0gMSAwIDAgMywzIG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eXAzCitjcnctcnctcnctIDEgMCAwIDMsNCBtYWtlZGV2cy50ZXN0ZGlyL2Rldi90dHlwNAorY3J3LXJ3LXJ3LSAxIDAgMCAzLDUgbWFrZWRldnMudGVzdGRpci9kZXYvdHR5cDUKK2Nydy1ydy1ydy0gMSAwIDAgMyw2IG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eXA2CitjcnctcnctcnctIDEgMCAwIDMsNyBtYWtlZGV2cy50ZXN0ZGlyL2Rldi90dHlwNworY3J3LXJ3LXJ3LSAxIDAgMCAzLDggbWFrZWRldnMudGVzdGRpci9kZXYvdHR5cDgKK2Nydy1ydy1ydy0gMSAwIDAgMyw5IG1ha2VkZXZzLnRlc3RkaXIvZGV2L3R0eXA5CitjcnctcnctcnctIDEgMCAwIDEsOSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi91cmFuZG9tCitjcnctcnctcnctIDEgMCAwIDEsNSBtYWtlZGV2cy50ZXN0ZGlyL2Rldi96ZXJvCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjbGVhbiB1cAorcm0gLXJmIG1ha2VkZXZzLnRlc3RkaXIKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbWQ1c3VtLnRlc3RzIGIvdGVzdHN1aXRlL21kNXN1bS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42Yzc1YjZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL21kNXN1bS50ZXN0cwpAQCAtMCwwICsxLDQzIEBACisjIS9iaW4vc2gKKyMgVXNlZCBieSB7bXM1LHNoYU59c3VtCisKKyMgV2UgcGlwZSB0ZXh0cyAwLi4uOTk5IGJ5dGVzIGxvbmcsIHttZDUsc2hhTn1zdW0gdGhlbSwKKyMgdGhlbiB7bWQ1LHNoYU59c3VtIHRoZSByZXN1bHRpbmcgbGlzdC4KKyMgVGhlbiB3ZSBjb21wYXJlIHRoZSByZXN1bHQgd2l0aCBleHBlY3RlZCByZXN1bHQuCisjCisjIEhlcmUgYXJlIHRoZSBleHBlY3RlZCByZXN1bHRzOgorIyBlZmUzMGM0ODJlMGI2ODdlMGNjYTA2MTJmNDJjYTI5YgorIyBkNDEzMzdlODM0Mzc3MTQwYWU3Zjk4NDYwZDcxZDkwODU5OGVmMDRmCisjIDhlMWQzZWQ1N2ViYzEzMGYwZjcyNTA4NDQ2NTU5ZWVhZTA2NDUxYWU2ZDYxYjFlOGNlNDYzNzBjZmI4OTYzYzMKKyMgZmU0MTNlMGYxNzczMjRkMTM1Mzg5M2NhMDc3MmNlYmE4M2ZkNDE1MTJiYTYzODk1YTBlZWJiNzAzZWY5ZmVhYzJmYjRlOTJiMmNiNDMwYjNiZGE0MWI0NmIwY2I0ZWE4MzA3MTkwYTVjYzc5NTE1N2NmYjY4MGE5Y2Q2MzVkMGYKKworaWYgISB0ZXN0ICIkMSI7IHRoZW4KKwlzZXQgLS0gbWQ1c3VtIGVmZTMwYzQ4MmUwYjY4N2UwY2NhMDYxMmY0MmNhMjliCitmaQorCitzdW09IiQxIgorZXhwZWN0ZWQ9IiQyIgorCit0ZXN0IC1mICIkYmluZGlyLy5jb25maWciICYmIC4gIiRiaW5kaXIvLmNvbmZpZyIKKwordGVzdCB4IiRDT05GSUdfRkVBVFVSRV9GQU5DWV9IRUFEIiAhPSB4InkiIFwKKyYmIHsgZWNobyAiU0tJUFBFRDogJHN1bSI7IGV4aXQgMDsgfQorCit0ZXh0PSJUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nIgordGV4dD1geWVzICIkdGV4dCIgfCBoZWFkIC1jIDk5OTlgCisKK3Jlc3VsdD1gKAorbj0wCit3aGlsZSB0ZXN0ICRuIC1sZSA5OTk7IGRvCisJZWNobyAiJHRleHQiIHwgaGVhZCAtYyAkbiB8ICIkc3VtIgorCW49JCgoJG4rMSkpCitkb25lIHwgIiRzdW0iCispYAorCitpZiB0ZXN0IHgiJHJlc3VsdCIgPSB4IiRleHBlY3RlZCAgLSI7IHRoZW4KKwllY2hvICJQQVNTOiAkc3VtIgorCWV4aXQgMAorZmkKKworZWNobyAiRkFJTDogJHN1bSAocjokcmVzdWx0IGV4cDokZXhwZWN0ZWQpIgorZXhpdCAxCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbWQ1c3VtL21kNXN1bS12ZXJpZmllcy1ub24tYmluYXJ5LWZpbGUgYi90ZXN0c3VpdGUvbWQ1c3VtL21kNXN1bS12ZXJpZmllcy1ub24tYmluYXJ5LWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRmODE4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9tZDVzdW0vbWQ1c3VtLXZlcmlmaWVzLW5vbi1iaW5hcnktZmlsZQpAQCAtMCwwICsxLDUgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfTUQ1X1NIQTFfU1VNX0NIRUNLCisKK3RvdWNoIGZvbworbWQ1c3VtIGZvbyA+IGJhcgorYnVzeWJveCBtZDVzdW0gLWMgYmFyCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbWRldi50ZXN0cyBiL3Rlc3RzdWl0ZS9tZGV2LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU5ODczMDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbWRldi50ZXN0cwpAQCAtMCwwICsxLDI0NiBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgbHMgLWxuIGlzIHNob3dpbmcgZGF0ZS4gTmVlZCB0byByZW1vdmUgdGhhdCwgaXQncyB2YXJpYWJsZQorIyBzZWQ6ICgxKSAibWFqLCBtaW4iIC0+ICJtYWosbWluIiAoMikgY29hbGVzY2Ugc3BhY2VzCisjIGN1dDogcmVtb3ZlIGRhdGUKK0ZJTFRFUl9MUz0iZ3JlcCAtdiAnXnRvdGFsICcgfCBzZWQgLWUgJ3MvLCAgKi8sL2cnIC1lICdzLyAgKi8gL2cnIHwgY3V0IC1kJyAnIC1mIDEtNSw5LSIKKyMgY3V0OiByZW1vdmUgc2l6ZStkYXRlCitGSUxURVJfTFMyPSJncmVwIC12ICdedG90YWwgJyB8IHNlZCAtZSAncy8sICAqLywvZycgLWUgJ3MvICAqLyAvZycgfCBjdXQgLWQnICcgLWYgMS00LDktIgorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmRzIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCitybSAtcmYgbWRldi50ZXN0ZGlyCitta2RpciBtZGV2LnRlc3RkaXIKKyMgV2UgbmVlZCBtZGV2IGV4ZWN1dGFibGUgdG8gYmUgaW4gY2hyb290IGphaWwhCisjICh3aWxsIHN0aWxsIGZhaWwgd2l0aCBkeW5hbWljYWxseSBsaW5rZWQgb25lLCB0aG91Z2guLi4pCitjcCAuLi9idXN5Ym94IG1kZXYudGVzdGRpci9tZGV2Citta2RpciBtZGV2LnRlc3RkaXIvYmluCitjcCAuLi9idXN5Ym94IG1kZXYudGVzdGRpci9iaW4vc2ggMj4vZGV2L251bGwgIyBmb3IgdGVzdGluZyBjbWQgZmVhdHVyZQorbWtkaXIgbWRldi50ZXN0ZGlyL2V0YworbWtkaXIgbWRldi50ZXN0ZGlyL2RldgorbWtkaXIgLXAgbWRldi50ZXN0ZGlyL3N5cy9ibG9jay9zZGEKK2VjaG8gIjg6MCIgPm1kZXYudGVzdGRpci9zeXMvYmxvY2svc2RhL2RldgorCisjIGVudiAtIFBBVEg9JFBBVEg6IG9uIHNvbWUgc3lzdGVtcyBjaHJvb3QgYmluYXJ5IHdvbid0IG90aGVyd2lzZSBiZSBmb3VuZAorCitvcHRpb25hbCBTVEFUSUMgRkVBVFVSRV9MU19USU1FU1RBTVBTIEZFQVRVUkVfTFNfVVNFUk5BTUUKK3Rlc3RpbmcgIm1kZXYgYWRkIC9ibG9jay9zZGEiIFwKKwkiZW52IC0gUEFUSD0kUEFUSCBBQ1RJT049YWRkIERFVlBBVEg9L2Jsb2NrL3NkYSBjaHJvb3QgbWRldi50ZXN0ZGlyIC9tZGV2IDI+JjE7CisJbHMgLWxuIG1kZXYudGVzdGRpci9kZXYgfCAkRklMVEVSX0xTIiBcCisiXAorYnJ3LXJ3LS0tLSAxIDAgMCA4LDAgc2RhCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjb250aW51aW5nIHRvIHVzZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0CitvcHRpb25hbCBTVEFUSUMgRkVBVFVSRV9NREVWX0NPTkYgRkVBVFVSRV9MU19USU1FU1RBTVBTIEZFQVRVUkVfTFNfVVNFUk5BTUUKK3Rlc3RpbmcgIm1kZXYgZGVsZXRlcyAvYmxvY2svc2RhIiBcCisJImVudiAtIFBBVEg9JFBBVEggQUNUSU9OPXJlbW92ZSBERVZQQVRIPS9ibG9jay9zZGEgY2hyb290IG1kZXYudGVzdGRpciAvbWRldiAyPiYxOworCWxzIC1sbiBtZGV2LnRlc3RkaXIvZGV2IHwgJEZJTFRFUl9MUyIgXAorIlwKKyIgXAorCSIiICIiCitTS0lQPQorCisjIGNvbnRpbnVpbmcgdG8gdXNlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZnJvbSBwcmV2IHRlc3QKK3JtIC1yZiBtZGV2LnRlc3RkaXIvZGV2LyoKK2VjaG8gIi4qIDE6MSA2NjYiID5tZGV2LnRlc3RkaXIvZXRjL21kZXYuY29uZgorZWNobyAic2RhIDI6MiA0NDQiID4+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK29wdGlvbmFsIFNUQVRJQyBGRUFUVVJFX01ERVZfQ09ORiBGRUFUVVJFX0xTX1RJTUVTVEFNUFMgRkVBVFVSRV9MU19VU0VSTkFNRQordGVzdGluZyAibWRldiBzdG9wcyBvbiBmaXJzdCBydWxlIiBcCisJImVudiAtIFBBVEg9JFBBVEggQUNUSU9OPWFkZCBERVZQQVRIPS9ibG9jay9zZGEgY2hyb290IG1kZXYudGVzdGRpciAvbWRldiAyPiYxOworCWxzIC1sbiBtZGV2LnRlc3RkaXIvZGV2IHwgJEZJTFRFUl9MUyIgXAorIlwKK2Jydy1ydy1ydy0gMSAxIDEgOCwwIHNkYQorIiBcCisJIiIgIiIKK1NLSVA9CisKKyMgY29udGludWluZyB0byB1c2UgZGlyZWN0b3J5IHN0cnVjdHVyZSBmcm9tIHByZXYgdGVzdAorcm0gLXJmIG1kZXYudGVzdGRpci9kZXYvKgorZWNobyAiLS4qIDE6MSA2NjYiID5tZGV2LnRlc3RkaXIvZXRjL21kZXYuY29uZgorZWNobyAic2RhIDI6MiA0NDQiID4+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK29wdGlvbmFsIFNUQVRJQyBGRUFUVVJFX01ERVZfQ09ORiBGRUFUVVJFX0xTX1RJTUVTVEFNUFMgRkVBVFVSRV9MU19VU0VSTkFNRQordGVzdGluZyAibWRldiBkb2VzIG5vdCBzdG9wIG9uIGRhc2gtcnVsZSIgXAorCSJlbnYgLSBQQVRIPSRQQVRIIEFDVElPTj1hZGQgREVWUEFUSD0vYmxvY2svc2RhIGNocm9vdCBtZGV2LnRlc3RkaXIgL21kZXYgMj4mMTsKKwlscyAtbG4gbWRldi50ZXN0ZGlyL2RldiB8ICRGSUxURVJfTFMiIFwKKyJcCitici0tci0tci0tIDEgMiAyIDgsMCBzZGEKKyIgXAorCSIiICIiCitTS0lQPQorCisjIGNvbnRpbnVpbmcgdG8gdXNlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZnJvbSBwcmV2IHRlc3QKK3JtIC1yZiBtZGV2LnRlc3RkaXIvZGV2LyoKK2VjaG8gIlwkTU9EQUxJQVM9cXcgIDE6MSA2NjYiID5tZGV2LnRlc3RkaXIvZXRjL21kZXYuY29uZgorZWNobyAiXCRNT0RBTElBUz1xdy4gMjoyIDQ0NCIgPj5tZGV2LnRlc3RkaXIvZXRjL21kZXYuY29uZgorZWNobyAiXCRNT0RBTElBUz1xdy4gMzozIDQwMCIgPj5tZGV2LnRlc3RkaXIvZXRjL21kZXYuY29uZgorb3B0aW9uYWwgU1RBVElDIEZFQVRVUkVfTURFVl9DT05GIEZFQVRVUkVfTFNfVElNRVNUQU1QUyBGRUFUVVJFX0xTX1VTRVJOQU1FCit0ZXN0aW5nICJtZGV2IFwkRU5WVkFSPXJlZ2V4IG1hdGNoIiBcCisJImVudiAtIFBBVEg9JFBBVEggQUNUSU9OPWFkZCBERVZQQVRIPS9ibG9jay9zZGEgTU9EQUxJQVM9cXdlIGNocm9vdCBtZGV2LnRlc3RkaXIgL21kZXYgMj4mMTsKKwlscyAtbG4gbWRldi50ZXN0ZGlyL2RldiB8ICRGSUxURVJfTFMiIFwKKyJcCitici0tci0tci0tIDEgMiAyIDgsMCBzZGEKKyIgXAorCSIiICIiCitTS0lQPQorCisjIGNvbnRpbnVpbmcgdG8gdXNlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZnJvbSBwcmV2IHRlc3QKK3JtIC1yZiBtZGV2LnRlc3RkaXIvZGV2LyoKK2VjaG8gInNkYSAwOjAgNDQ0ID5kaXNrL3Njc2lBIiA+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK29wdGlvbmFsIFNUQVRJQyBGRUFUVVJFX01ERVZfQ09ORiBGRUFUVVJFX01ERVZfUkVOQU1FIEZFQVRVUkVfTFNfUkVDVVJTSVZFIEZFQVRVUkVfTFNfVElNRVNUQU1QUyBGRUFUVVJFX0xTX1VTRVJOQU1FCit0ZXN0aW5nICJtZGV2IG1vdmUvc3ltbGluayBydWxlICc+YmFyL2JheiciIFwKKwkiZW52IC0gUEFUSD0kUEFUSCBBQ1RJT049YWRkIERFVlBBVEg9L2Jsb2NrL3NkYSBjaHJvb3QgbWRldi50ZXN0ZGlyIC9tZGV2IDI+JjE7CisJbHMgLWxuUiBtZGV2LnRlc3RkaXIvZGV2IHwgJEZJTFRFUl9MUzIiIFwKKyJcCittZGV2LnRlc3RkaXIvZGV2OgorZHJ3eHIteHIteCAyIDAgMCBkaXNrCitscnd4cnd4cnd4IDEgMCAwIHNkYSAtPiBkaXNrL3Njc2lBCisKK21kZXYudGVzdGRpci9kZXYvZGlzazoKK2JyLS1yLS1yLS0gMSAwIDAgc2NzaUEKKyIgXAorCSIiICIiCitTS0lQPQorCisjIGNvbnRpbnVpbmcgdG8gdXNlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZnJvbSBwcmV2IHRlc3QKK3JtIC1yZiBtZGV2LnRlc3RkaXIvZGV2LyoKK2VjaG8gInNkYSAwOjAgNDQ0ID5kaXNrLyIgPm1kZXYudGVzdGRpci9ldGMvbWRldi5jb25mCitvcHRpb25hbCBTVEFUSUMgRkVBVFVSRV9NREVWX0NPTkYgRkVBVFVSRV9NREVWX1JFTkFNRSBGRUFUVVJFX0xTX1JFQ1VSU0lWRSBGRUFUVVJFX0xTX1RJTUVTVEFNUFMgRkVBVFVSRV9MU19VU0VSTkFNRQordGVzdGluZyAibWRldiBtb3ZlL3N5bWxpbmsgcnVsZSAnPmJhci8nIiBcCisJImVudiAtIFBBVEg9JFBBVEggQUNUSU9OPWFkZCBERVZQQVRIPS9ibG9jay9zZGEgY2hyb290IG1kZXYudGVzdGRpciAvbWRldiAyPiYxOworCWxzIC1sblIgbWRldi50ZXN0ZGlyL2RldiB8ICRGSUxURVJfTFMyIiBcCisiXAorbWRldi50ZXN0ZGlyL2RldjoKK2Ryd3hyLXhyLXggMiAwIDAgZGlzaworbHJ3eHJ3eHJ3eCAxIDAgMCBzZGEgLT4gZGlzay9zZGEKKworbWRldi50ZXN0ZGlyL2Rldi9kaXNrOgorYnItLXItLXItLSAxIDAgMCBzZGEKKyIgXAorCSIiICIiCitTS0lQPQorCisjIGNvbnRpbnVpbmcgdG8gdXNlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZnJvbSBwcmV2IHRlc3QKK3JtIC1yZiBtZGV2LnRlc3RkaXIvZGV2LyoKK2VjaG8gInNkYSAwOjAgNDQ0ID1kaXNrL3NkL2EiID5tZGV2LnRlc3RkaXIvZXRjL21kZXYuY29uZgorb3B0aW9uYWwgU1RBVElDIEZFQVRVUkVfTURFVl9DT05GIEZFQVRVUkVfTURFVl9SRU5BTUUgRkVBVFVSRV9MU19SRUNVUlNJVkUgRkVBVFVSRV9MU19USU1FU1RBTVBTIEZFQVRVUkVfTFNfVVNFUk5BTUUKK3Rlc3RpbmcgIm1kZXYgbW92ZSBydWxlICc9YmFyL2Jhei9mbmFtZSciIFwKKwkiZW52IC0gUEFUSD0kUEFUSCBBQ1RJT049YWRkIERFVlBBVEg9L2Jsb2NrL3NkYSBjaHJvb3QgbWRldi50ZXN0ZGlyIC9tZGV2IDI+JjE7CisJbHMgLWxuUiBtZGV2LnRlc3RkaXIvZGV2IHwgJEZJTFRFUl9MUzIiIFwKKyJcCittZGV2LnRlc3RkaXIvZGV2OgorZHJ3eHIteHIteCAzIDAgMCBkaXNrCisKK21kZXYudGVzdGRpci9kZXYvZGlzazoKK2Ryd3hyLXhyLXggMiAwIDAgc2QKKworbWRldi50ZXN0ZGlyL2Rldi9kaXNrL3NkOgorYnItLXItLXItLSAxIDAgMCBhCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjb250aW51aW5nIHRvIHVzZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0CitybSAtcmYgbWRldi50ZXN0ZGlyL2Rldi8qCisjIGhlcmUgd2UgY29tcGxpY2F0ZSB0aGluZ3MgYnkgaGF2aW5nIG5vbi1tYXRjaGluZyBncm91cCAxIGFuZCB1c2luZyAlMAorZWNobyAicyhbMC05XSkqZChbYS16XSspIDA6MCA2NDQgPnNkLyUyXyUwIiA+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK29wdGlvbmFsIFNUQVRJQyBGRUFUVVJFX01ERVZfQ09ORiBGRUFUVVJFX01ERVZfUkVOQU1FIEZFQVRVUkVfTURFVl9SRU5BTUVfUkVHRVhQIEZFQVRVUkVfTFNfUkVDVVJTSVZFIEZFQVRVUkVfTFNfVElNRVNUQU1QUyBGRUFUVVJFX0xTX1VTRVJOQU1FIEZFQVRVUkVfTFNfU09SVEZJTEVTCit0ZXN0aW5nICJtZGV2IHJlZ2V4cCBzdWJzdHJpbmcgbWF0Y2ggKyByZXBsYWNlIiBcCisJImVudiAtIFBBVEg9JFBBVEggQUNUSU9OPWFkZCBERVZQQVRIPS9ibG9jay9zZGEgY2hyb290IG1kZXYudGVzdGRpciAvbWRldiAyPiYxOworCWxzIC1sblIgbWRldi50ZXN0ZGlyL2RldiB8ICRGSUxURVJfTFMyIiBcCisiXAorbWRldi50ZXN0ZGlyL2RldjoKK2Ryd3hyLXhyLXggMiAwIDAgc2QKK2xyd3hyd3hyd3ggMSAwIDAgc2RhIC0+IHNkL2Ffc2RhCisKK21kZXYudGVzdGRpci9kZXYvc2Q6Citicnctci0tci0tIDEgMCAwIGFfc2RhCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjb250aW51aW5nIHRvIHVzZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0CitybSAtcmYgbWRldi50ZXN0ZGlyL2Rldi8qCitlY2hvICJzZGEgMDowIDY0NCBAZWNobyBAZWNobyBURVNUIiA+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK29wdGlvbmFsIFNUQVRJQyBGRUFUVVJFX01ERVZfQ09ORiBGRUFUVVJFX01ERVZfRVhFQyBGRUFUVVJFX0xTX1JFQ1VSU0lWRSBGRUFUVVJFX0xTX1RJTUVTVEFNUFMgRkVBVFVSRV9MU19VU0VSTkFNRSBGRUFUVVJFX1NIX0lTX0FTSCBBU0hfQlVJTFRJTl9FQ0hPCit0ZXN0aW5nICJtZGV2IGNvbW1hbmQiIFwKKwkiZW52IC0gUEFUSD0kUEFUSCBBQ1RJT049YWRkIERFVlBBVEg9L2Jsb2NrL3NkYSBjaHJvb3QgbWRldi50ZXN0ZGlyIC9tZGV2IDI+JjE7CisJbHMgLWxuUiBtZGV2LnRlc3RkaXIvZGV2IHwgJEZJTFRFUl9MUyIgXAorIlwKK0BlY2hvIFRFU1QKK21kZXYudGVzdGRpci9kZXY6Citicnctci0tci0tIDEgMCAwIDgsMCBzZGEKKyIgXAorCSIiICIiCitTS0lQPQorCisjIGNvbnRpbnVpbmcgdG8gdXNlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZnJvbSBwcmV2IHRlc3QKK3JtIC1yZiBtZGV2LnRlc3RkaXIvZGV2LyoKK2VjaG8gInNkYSAwOjAgNjQ0ID1ibG9jay8gQGVjaG8gQGVjaG8gVEVTVDpcJE1ERVYiID5tZGV2LnRlc3RkaXIvZXRjL21kZXYuY29uZgorb3B0aW9uYWwgU1RBVElDIEZFQVRVUkVfTURFVl9DT05GIEZFQVRVUkVfTURFVl9SRU5BTUUgRkVBVFVSRV9NREVWX0VYRUMgRkVBVFVSRV9MU19SRUNVUlNJVkUgRkVBVFVSRV9MU19USU1FU1RBTVBTIEZFQVRVUkVfTFNfVVNFUk5BTUUgRkVBVFVSRV9TSF9JU19BU0gKK3Rlc3RpbmcgIm1kZXYgbW92ZSBhbmQgY29tbWFuZCIgXAorCSJlbnYgLSBQQVRIPSRQQVRIIEFDVElPTj1hZGQgREVWUEFUSD0vYmxvY2svc2RhIGNocm9vdCBtZGV2LnRlc3RkaXIgL21kZXYgMj4mMTsKKwlscyAtbG5SIG1kZXYudGVzdGRpci9kZXYgfCAkRklMVEVSX0xTMiIgXAorIlwKK0BlY2hvIFRFU1Q6YmxvY2svc2RhCittZGV2LnRlc3RkaXIvZGV2OgorZHJ3eHIteHIteCAyIDAgMCBibG9jaworCittZGV2LnRlc3RkaXIvZGV2L2Jsb2NrOgorYnJ3LXItLXItLSAxIDAgMCBzZGEKKyIgXAorCSIiICIiCitTS0lQPQorCisjIGNvbnRpbnVpbmcgdG8gdXNlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgZnJvbSBwcmV2IHRlc3QKK3JtIC1yZiBtZGV2LnRlc3RkaXIvZGV2LyoKK2VjaG8gIkA4LDAgMDoxIDY0NCIgPm1kZXYudGVzdGRpci9ldGMvbWRldi5jb25mCitvcHRpb25hbCBTVEFUSUMgRkVBVFVSRV9NREVWX0NPTkYgRkVBVFVSRV9NREVWX1JFTkFNRSBGRUFUVVJFX01ERVZfUkVOQU1FX1JFR0VYUCBGRUFUVVJFX0xTX1JFQ1VSU0lWRSBGRUFUVVJFX0xTX1RJTUVTVEFNUFMgRkVBVFVSRV9MU19VU0VSTkFNRQordGVzdGluZyAibWRldiAjbWFqLG1pbiBhbmQgbm8gZXhwbGljaXQgdWlkIiBcCisJImVudiAtIFBBVEg9JFBBVEggQUNUSU9OPWFkZCBERVZQQVRIPS9ibG9jay9zZGEgY2hyb290IG1kZXYudGVzdGRpciAvbWRldiAyPiYxOworCWxzIC1sblIgbWRldi50ZXN0ZGlyL2RldiB8ICRGSUxURVJfTFMiIFwKKyJcCittZGV2LnRlc3RkaXIvZGV2OgorYnJ3LXItLXItLSAxIDAgMSA4LDAgc2RhCisiIFwKKwkiIiAiIgorU0tJUD0KKworIyBjb250aW51aW5nIHRvIHVzZSBkaXJlY3Rvcnkgc3RydWN0dXJlIGZyb20gcHJldiB0ZXN0CitybSAtcmYgbWRldi50ZXN0ZGlyL2Rldi8qCitta2RpciAtcCBtZGV2LnRlc3RkaXIvc3lzL2NsYXNzL3R0eS9jYXBpCitlY2hvICIxOTE6MCIgPm1kZXYudGVzdGRpci9zeXMvY2xhc3MvdHR5L2NhcGkvZGV2Citta2RpciAtcCBtZGV2LnRlc3RkaXIvc3lzL2NsYXNzL3R0eS9jYXBpMQorZWNobyAiMTkxOjEiID5tZGV2LnRlc3RkaXIvc3lzL2NsYXNzL3R0eS9jYXBpMS9kZXYKK21rZGlyIC1wIG1kZXYudGVzdGRpci9zeXMvY2xhc3MvdHR5L2NhcGkyMAorZWNobyAiMTkxOjIwIiA+bWRldi50ZXN0ZGlyL3N5cy9jbGFzcy90dHkvY2FwaTIwL2RldgorZWNobyAiY2FwaSAgICAgICAgICAgIDA6MCAwNjYwID1jYXBpMjAiICAgICAgPm1kZXYudGVzdGRpci9ldGMvbWRldi5jb25mCitlY2hvICJjYXBpKFswLTldKSAgICAgMDowIDA2NjAgPWNhcGkyMC4wJTEiID4+bWRldi50ZXN0ZGlyL2V0Yy9tZGV2LmNvbmYKK2VjaG8gImNhcGkoWzAtOV0qKSAgICAwOjAgMDY2MCA9Y2FwaTIwLiUxIiAgPj5tZGV2LnRlc3RkaXIvZXRjL21kZXYuY29uZgorIyBtZGV2IGludm9jYXRpb24gd2l0aCBERVZQQVRIPS9jbGFzcy90dHkvY2FwaTIwIHdhcyBkZWxldGluZyAvZGV2L2NhcGkyMAorb3B0aW9uYWwgU1RBVElDIEZFQVRVUkVfTURFVl9DT05GIEZFQVRVUkVfTURFVl9SRU5BTUUgRkVBVFVSRV9NREVWX1JFTkFNRV9SRUdFWFAgRkVBVFVSRV9MU19SRUNVUlNJVkUgRkVBVFVSRV9MU19USU1FU1RBTVBTIEZFQVRVUkVfTFNfVVNFUk5BTUUgRkVBVFVSRV9MU19TT1JURklMRVMKK3Rlc3RpbmcgIm1vdmUgcnVsZSBkb2VzIG5vdCBkZWxldGUgbm9kZSB3aXRoIG5hbWUgPT0gZGV2aWNlX25hbWUiIFwKKwkiXAorCWVudiAtIFBBVEg9JFBBVEggQUNUSU9OPWFkZCBERVZQQVRIPS9jbGFzcy90dHkvY2FwaSBjaHJvb3QgbWRldi50ZXN0ZGlyIC9tZGV2IDI+JjE7CisJZW52IC0gUEFUSD0kUEFUSCBBQ1RJT049YWRkIERFVlBBVEg9L2NsYXNzL3R0eS9jYXBpMSBjaHJvb3QgbWRldi50ZXN0ZGlyIC9tZGV2IDI+JjE7CisJZW52IC0gUEFUSD0kUEFUSCBBQ1RJT049YWRkIERFVlBBVEg9L2NsYXNzL3R0eS9jYXBpMjAgY2hyb290IG1kZXYudGVzdGRpciAvbWRldiAyPiYxOworCWxzIC1sblIgbWRldi50ZXN0ZGlyL2RldiB8ICRGSUxURVJfTFMiIFwKKyJcCittZGV2LnRlc3RkaXIvZGV2OgorY3J3LXJ3LS0tLSAxIDAgMCAxOTEsMCBjYXBpMjAKK2Nydy1ydy0tLS0gMSAwIDAgMTkxLDEgY2FwaTIwLjAxCitjcnctcnctLS0tIDEgMCAwIDE5MSwyMCBjYXBpMjAuMjAKKyIgXAorCSIiICIiCitTS0lQPQorCisjIGNsZWFuIHVwCitybSAtcmYgbWRldi50ZXN0ZGlyCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL21rZGlyL21rZGlyLW1ha2VzLWEtZGlyZWN0b3J5IGIvdGVzdHN1aXRlL21rZGlyL21rZGlyLW1ha2VzLWEtZGlyZWN0b3J5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYTVjNGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbWtkaXIvbWtkaXItbWFrZXMtYS1kaXJlY3RvcnkKQEAgLTAsMCArMSwyIEBACitidXN5Ym94IG1rZGlyIGZvbwordGVzdCAtZCBmb28KZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9ta2Rpci9ta2Rpci1tYWtlcy1wYXJlbnQtZGlyZWN0b3JpZXMgYi90ZXN0c3VpdGUvbWtkaXIvbWtkaXItbWFrZXMtcGFyZW50LWRpcmVjdG9yaWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MmZhY2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbWtkaXIvbWtkaXItbWFrZXMtcGFyZW50LWRpcmVjdG9yaWVzCkBAIC0wLDAgKzEsMiBAQAorYnVzeWJveCBta2RpciAtcCBmb28vYmFyCit0ZXN0IC1kIGZvbyAtYSAtZCBmb28vYmFyCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbWtmcy5taW5peC50ZXN0cyBiL3Rlc3RzdWl0ZS9ta2ZzLm1pbml4LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMyNGVhYWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbWtmcy5taW5peC50ZXN0cwpAQCAtMCwwICsxLDMwIEBACisjIS9iaW4vc2gKKworIyBta2ZzLm1pbml4IHRlc3RzLgorIyBDb3B5cmlnaHQgMjAwNyBieSBEZW55cyBWbGFzZW5rbworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgIm9wdGlvbnMiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKKyMgJ1xuJyBwcm9kdWNlcyAxMCBvbiBsaXR0bGUgZW5kaWFuLCBidXQgbm90IG9uIGJpZyBlbmRpYW4KK2NyPWBlY2hvIHwgb2QgLWkgfCBzZWQgJ3MvICokLy9nO3MvLiogLy9nOzJkJ2AKK2lmIFsgeCIkY3IiID0geCIxMCIgXTsgdGhlbgorCWhhc2g9NGYzNWY3YWZlYmEwN2Q1NjA1NWJlZDFmMjlhZTIwYjcKK2Vsc2UKKwloYXNoPTVhZGJjMWIzY2NkMjBjYTVkMGFiNWJjMWUxM2FjM2ZjCitmaQorCit0ZXN0aW5nICJta2ZzLm1pbml4IiBcCisJImRkIGlmPS9kZXYvemVybyBvZj1pbnB1dCBicz0xayBjb3VudD0xMDI0IDI+L2Rldi9udWxsOyBta2ZzLm1pbml4IGlucHV0OyBtZDVzdW0gPGlucHV0IiBcCisiMzUyIGlub2Rlc1xuIlwKKyIxMDI0IGJsb2Nrc1xuIlwKKyJGaXJzdGRhdGF6b25lPTE1ICgxNSlcbiJcCisiWm9uZXNpemU9MTAyNFxuIlwKKyJNYXhzaXplPTI2ODk2NjkxMlxuIlwKKyIkaGFzaCAgLVxuIiBcCisJIiIgXAorCSIiCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL21vdW50LnRlc3Ryb290IGIvdGVzdHN1aXRlL21vdW50LnRlc3Ryb290Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjRmMzRjNTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbW91bnQudGVzdHJvb3QKQEAgLTAsMCArMSwxODMgQEAKKyMhL2Jpbi9zaAorCisjIFNVU3YzIGNvbXBsaWFudCBtb3VudCBhbmQgdW1vdW50IHRlc3RzLgorIyBDb3B5cmlnaHQgMjAwNSBieSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitpZiBbIC16ICIkVEVTVERJUiIgXQordGhlbgorICBlY2hvICdOZWVkICRURVNURElSJworICBleGl0IDEKK2ZpCisKK2NkICIkVEVTVERJUiIKKworLiB0ZXN0aW5nLnNoCisKKyMgSWYgd2UgYXJlbid0IFBJRCAxLCBiYXJmLgorCisjaWYgWyAkJCAtbmUgMSBdCisjdGhlbgorIyAgZWNobyAiU0tJUFBFRDogbW91bnQgdGVzdCByZXF1aXJlcyBlbXVsYXRpb24gZW52aXJvbm1lbnQiCisjICBleGl0IDAKKyNmaQorCisjIFJ1biB0ZXN0cyB3aXRoaW4gdGhlIGNocm9vdCBlbnZpcm9ubWVudC4KK2RvY2hyb290IGJhc2ggcm0gbHMgbG4gY2F0IHBzIG1rbm9kIG1rZGlyIGRkIGdyZXAgY21wIGRpZmYgdGFpbCBcCisJbWtmcy5leHQyIG1rZnMudmZhdCBtb3VudCB1bW91bnQgbG9zZXR1cCB3YyA8PCBFT0YKKyMhL2Jpbi9iYXNoCisKKy4gL3Rlc3Rpbmcuc2gKKworbWtub2QgL2Rldi9sb29wMCBiIDcgMAorbWtub2QgL2Rldi9sb29wMSBiIDcgMQorCisjIFdlIG5lZWQgL3Byb2MgdG8gZG8gbXVjaC4gIE1ha2Ugc3VyZSB3ZSBjYW4gbW91bnQgaXQgZXhwbGljaXRseS4KKwordGVzdGluZyAibW91bnQgbm8gcHJvYyBbR05VRkFJTF0iICJtb3VudCAyPiAvZGV2L251bGwgfHwgZWNobyB5ZXMiICJ5ZXNcbiIgIiIgIiIKK3Rlc3RpbmcgIm1vdW50IC9wcm9jIiAibW91bnQgLXQgcHJvYyAvcHJvYyAvcHJvYyAmJiBscyAtZCAvcHJvYy8xIiBcCisJIi9wcm9jLzFcbiIgIiIgIiIKKworIyBNYWtlIHN1cmUgdGhlIGxhc3QgdGhpbmcgaW4gdGhlIGxpc3QgaXMgL3Byb2MKKwordGVzdGluZyAibW91bnQgbGlzdDEiICJtb3VudCB8IHRhaWwgLW4gMSIgIi9wcm9jIG9uIC9wcm9jIHR5cGUgcHJvYyAocncpXG4iIFwKKwkiIiAiIgorCisKKyMgQ3JlYXRlIGFuIGV4dDIgaW1hZ2UKKworbWtkaXIgLXAgaW1hZ2VzL3tleHQyLmRpcix2ZmF0LmRpcix0ZXN0MSx0ZXN0Mix0ZXN0M30KK2RkIGlmPS9kZXYvemVybyBvZj1pbWFnZXMvZXh0Mi5pbWcgYnM9MU0gY291bnQ9MSAyPiAvZGV2L251bGwKK21rZnMuZXh0MiAtRiAtYiAxMDI0IGltYWdlcy9leHQyLmltZyA+IC9kZXYvbnVsbCAyPiAvZGV2L251bGwKK2RkIGlmPS9kZXYvemVybyBvZj1pbWFnZXMvdmZhdC5pbWcgYnM9MU0gY291bnQ9MSAyPiAvZGV2L251bGwKK21rZnMudmZhdCBpbWFnZXMvdmZhdC5pbWcgPiAvZGV2L251bGwKKworIyBUZXN0IG1vdW50IGl0CisKK3Rlc3RpbmcgIm1vdW50IHZmYXQgaW1hZ2UgKGV4cGxpY2l0bHkgYXV0b2RldGVjdCB0eXBlKSIgXAorCSJtb3VudCAtdCBhdXRvIGltYWdlcy92ZmF0LmltZyBpbWFnZXMvdmZhdC5kaXIgJiYgbW91bnQgfCB0YWlsIC1uIDEgfCBncmVwIC1vICd2ZmF0LmRpciB0eXBlIHZmYXQnIiBcCisJInZmYXQuZGlyIHR5cGUgdmZhdFxuIiAiIiAiIgordGVzdGluZyAibW91bnQgZXh0MiBpbWFnZSAoYXV0b2RldGVjdCB0eXBlKSIgXAorCSJtb3VudCBpbWFnZXMvZXh0Mi5pbWcgaW1hZ2VzL2V4dDIuZGlyIDI+IC9kZXYvbnVsbCAmJiBtb3VudCB8IHRhaWwgLW4gMSIgXAorCSIvZGV2L2xvb3AxIG9uIC9pbWFnZXMvZXh0Mi5kaXIgdHlwZSBleHQyIChydylcbiIgIiIgIiIKK3Rlc3RpbmcgIm1vdW50IHJlbW91bnQgZXh0MiBpbWFnZSBub2F0aW1lIiBcCisJIm1vdW50IC1vIHJlbW91bnQsbm9hdGltZSBpbWFnZXMvZXh0Mi5kaXIgJiYgbW91bnQgfCB0YWlsIC1uIDEiIFwKKwkiL2Rldi9sb29wMSBvbiAvaW1hZ2VzL2V4dDIuZGlyIHR5cGUgZXh0MiAocncsbm9hdGltZSlcbiIgIiIgIiIKK3Rlc3RpbmcgIm1vdW50IHJlbW91bnQgZXh0MiBpbWFnZSBybyByZW1lbWJlcnMgbm9hdGltZSIgXAorCSJtb3VudCAtbyByZW1vdW50LHJvIGltYWdlcy9leHQyLmRpciAmJiBtb3VudCB8IHRhaWwgLW4gMSIgXAorCSIvZGV2L2xvb3AxIG9uIC9pbWFnZXMvZXh0Mi5kaXIgdHlwZSBleHQyIChybyxub2F0aW1lKVxuIiAiIiAiIgorCit1bW91bnQgLWQgaW1hZ2VzL3ZmYXQuZGlyCit1bW91bnQgLWQgaW1hZ2VzL2V4dDIuZGlyCisKK3Rlc3RpbmcgIm1vdW50IHVtb3VudCBmcmVlZCBsb29wIGRldmljZSIgXAorCSJtb3VudCBpbWFnZXMvZXh0Mi5pbWcgaW1hZ2VzL2V4dDIuZGlyICYmIG1vdW50IHwgdGFpbCAtbiAxIiBcCisJIi9kZXYvbG9vcDAgb24gL2ltYWdlcy9leHQyLmRpciB0eXBlIGV4dDIgKHJ3KVxuIiAiIiAiIgorCit0ZXN0aW5nICJtb3VudCBibG9jayBkZXZpY2UiIFwKKwkibW91bnQgLXQgZXh0MiAvZGV2L2xvb3AwIGltYWdlcy90ZXN0MSAmJiBtb3VudCB8IHRhaWwgLW4gMSIgXAorCSIvZGV2L2xvb3AwIG9uIC9pbWFnZXMvdGVzdDEgdHlwZSBleHQyIChydylcbiIgIiIgIiIKKwordW1vdW50IC1kIGltYWdlcy9leHQyLmRpciBpbWFnZXMvdGVzdDEKKwordGVzdGluZyAibW91bnQgcmVtb3VudCBub25leGlzdGVudCBkaXJlY3RvcnkiIFwKKwkibW91bnQgLW8gcmVtb3VudCxub2F0aW1lIGltYWdlcy9leHQyLmRpciAyPiAvZGV2L251bGwgfHwgZWNobyB5ZXMiIFwKKwkieWVzXG4iICIiICIiCisKKyMgRnVuIHdpdGggbW91bnQgLWEKKwordGVzdGluZyAibW91bnQgLWEgbm8gZnN0YWIiICJtb3VudCAtYSAyPi9kZXYvbnVsbCB8fCBlY2hvIHllcyIgInllc1xuIiAiIiAiIgorCit1bW91bnQgL3Byb2MKKworIyBUaGUgZmlyc3QgZmllbGQgaXMgc3BhY2UgZGVsaW1pdGVkLCB0aGUgcmVzdCB0YWJzLgorCitjYXQgPiAvZXRjL2ZzdGFiIDw8IEZTVEFCCisvcHJvYyAgICAgICAgICAgICAvcHJvYwkJCXByb2MJZGVmYXVsdHMJMAkwCisjIEF1dG9kZXRlY3QgbG9vcCwgYW5kIHByb3ZpZGUgZmxhZ3Mgd2l0aCBjb21tYXMgaW4gdGhlbS4KKy9pbWFnZXMvZXh0Mi5pbWcgIC9pbWFnZXMvZXh0Mi5kaXIJZXh0Mglub2F0aW1lLG5vZGV2CTAJMAorIyBhdXRvZGV0ZWN0IGZpbGVzeXN0ZW0sIGZsYWdzIHdpdGhvdXQgY29tbWFzLgorL2ltYWdlcy92ZmF0LmltZyAgL2ltYWdlcy92ZmF0LmRpcglhdXRvCXJvCQkwCTAKKyMgQSBibG9jayBkZXZpY2UKKy9kZXYvbG9vcDIgICAgICAgIC9pbWFnZXMvdGVzdDEJCWF1dG8JZGVmYXVsdHMJMAkwCisjIHRtcGZzLCBmaWxlc3lzdGVtIHNwZWNpZmljIGZsYWcuCit3YWxydXMJCSAgL2ltYWdlcy90ZXN0MgkJdG1wZnMJc2l6ZT00MgkJMAkwCisjIEF1dG9kZXRlY3QgYSBiaW5kIG1vdW50LgorL2ltYWdlcy90ZXN0MiAgICAgL2ltYWdlcy90ZXN0MwkJYXV0bwlkZWZhdWx0cwkwCTAKK0ZTVEFCCisKKyMgUHV0IHNvbWV0aGluZyBvbiBsb29wMi4KK21rbm9kIC9kZXYvbG9vcDIgYiA3IDIKK2NhdCBpbWFnZXMvZXh0Mi5pbWcgPiBpbWFnZXMvZXh0Mi0yLmltZworbG9zZXR1cCAvZGV2L2xvb3AyIGltYWdlcy9leHQyLTIuaW1nCisKK3Rlc3RpbmcgIm1vdW50IC1hIiAibW91bnQgLWEgJiYgZWNobyBoZWxsbyA+IC9pbWFnZXMvdGVzdDIvYWJjICYmIGNhdCAvaW1hZ2VzL3Rlc3QzL2FiYyAmJiAobW91bnQgfCB3YyAtbCkiICJoZWxsb1xuOFxuIiAiIiAiIgorCit0ZXN0aW5nICJ1bW91bnQgLWEiICJ1bW91bnQgLWEgJiYgbHMgL3Byb2MiICIiICIiICIiCisKKyMvYmluL2Jhc2ggPCAvZGV2L3R0eSA+IC9kZXYvdHR5IDI+IC9kZXYvdHR5Citta25vZCAvZGV2L2NvbnNvbGUgYyA1IDEKKy9iaW4vYmFzaCA8IC9kZXYvY29uc29sZSA+IC9kZXYvY29uc29sZSAyPiAvZGV2L2NvbnNvbGUKK0VPRgorCitleGl0IDAKKworIyBSdW4gc29tZSB0ZXN0cworCitsb3NldHVwIG5vbmV4aXN0ZW50IGRldmljZSAoc2hvdWxkIHJldHVybiBlcnJvciAyKQorbG9zZXR1cCB1bmJvdW5kIGxvb3AgZGV2aWNlIChzaG91bGQgcmV0dXJuIGVycm9yIDEpCitsb3NldHVwIGJpbmQgZmlsZSB0byBsb29wIGRldmljZQorbG9zZXR1cCBib3VuZCBsb29wIGRldmljZSAoZGlzcGxheSkgIChzaG91bGQgcmV0dXJuIGVycm9yIDApCitsb3NldHVwIGZpbGVuYW1lIChlcnJvcikKK2xvc2V0dXAgbm9maWxlIChmaWxlIG5vdCBmb3VuZCkKK2xvc2V0dXAgLWQKK2xvc2V0dXAgYmluZCB3aXRoIG9mZnNldAorbG9zZXR1cCAtZiAocHJpbnQgZmlyc3QgbG9vcCBkZXZpY2UpCitsb3NldHVwIC1mIGZpbGVuYW1lIChhc3NvY2lhdGUgZmlsZSB3aXRoIGZpcnN0IGxvb3AgZGV2aWNlKQorbG9zZXR1cCAtbyAocGFzdCBlbmQgb2YgZmlsZSkgLWYgZmlsZW5hbWUKKworbW91bnQgLWEKKyAgd2l0aCBtdWx0aXBsZSBlbnRyaWVzIGluIGZzdGFiCisgIHdpdGggZHVwbGljYXRlIGVudHJpZXMgaW4gZnN0YWIKKyAgd2l0aCByZWxhdGl2ZSBwYXRocyBpbiBmc3RhYgorICB3aXRoIHVzZXIgZW50cmllcyBpbiBmc3RhYgorbW91bnQgLW8gYXN5bmMsc3luYyxhdGltZSxub2F0aW1lLGRldixub2RldixleGVjLG5vZXhlYyxsb29wLHN1aWQsbm9zdWlkLHJlbW91bnQscm8scncsYmluZCxtb3ZlCittb3VudCAtcgorbW91bnQgLW8gcncgLXIKK21vdW50IC13IC1vIHJvCittb3VudCAtdCBhdXRvCisKK21vdW50IHdpdGggcmVsYXRpdmUgcGF0aCBpbiBmc3RhYgorbW91bnQgYmxvY2sgZGV2aWNlCittb3VudCBjaGFyIGRldmljZQorbW91bnQgZmlsZSAoYXV0b2xvb3ApCittb3VudCBkaXJlY3RvcnkgKGF1dG9iaW5kKQorCisKK3Rlc3RpbmcgInVtb3VudCB3aXRoIG5vIC9wcm9jIgordGVzdGluZyAidW1vdW50IGN1cmRpciIKKworIyBUaGUgYmFzaWMgdGVzdHMuICBUaGVzZSBzaG91bGQgd29yayBldmVuIHdpdGggdGhlIHNtYWxsIGJ1c3lib3guCisKK3Rlc3RpbmcgInNvcnQiICJpbnB1dCIgImFcbmJcbmNcbiIgImNcbmFcbmJcbiIgIiIKK3Rlc3RpbmcgInNvcnQgIzIiICJpbnB1dCIgIjAxMFxuMVxuM1xuIiAiM1xuMVxuMDEwXG4iICIiCit0ZXN0aW5nICJzb3J0IHN0ZGluIiAiIiAiYVxuYlxuY1xuIiAiIiAiYlxuYVxuY1xuIgordGVzdGluZyAic29ydCBudW1lcmljIiAiLW4gaW5wdXQiICIxXG4zXG4wMTBcbiIgIjNcbjFcbjAxMFxuIiAiIgordGVzdGluZyAic29ydCByZXZlcnNlIiAiLXIgaW5wdXQiICJ3b29rXG53YWxydXNcbnBvaW50XG5wYWJzdFxuYWFyZ2hcbiIgXAorCSJwb2ludFxud29va1xucGFic3RcbmFhcmdoXG53YWxydXNcbiIgIiIKKworb3B0aW9uYWwgRkVBVFVSRV9NT1VOVF9MT09QCit0ZXN0aW5nICJ1bW91bnQgLUQiCisKK29wdGlvbmFsIEZFQVRVUkVfTVRBQl9TVVBQT1JUCitvcHRpb25hbCBGRUFUVVJFX01PVU5UX05GUworIyBObyBpZGVhIHdoYXQgdG8gdGVzdCBoZXJlLgorCitvcHRpb25hbCBVTU9VTlQKK29wdGlvbmFsIEZFQVRVUkVfVU1PVU5UX0FMTAordGVzdGluZyAidW1vdW50IC1hIgordGVzdGluZyAidW1vdW50IC1yIgordGVzdGluZyAidW1vdW50IC1sIgordGVzdGluZyAidW1vdW50IC1mIgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9tb3VudC50ZXN0cyBiL3Rlc3RzdWl0ZS9tb3VudC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hMGJjNTA4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL21vdW50LnRlc3RzCkBAIC0wLDAgKzEsMTExIEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IDIwMDcgYnkgRGVueXMgVmxhc2Vua28gPHZkYS5saW51eEBnb29nbGVtYWlsLmNvbT4KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKK3Rlc3QgLWYgIiRiaW5kaXIvLmNvbmZpZyIgJiYgLiAiJGJpbmRpci8uY29uZmlnIgorCit0ZXN0ICJgaWQgLXVgIiA9IDAgfHwgeworCWVjaG8gIlNLSVBQRUQ6IG1vdW50IChtdXN0IGJlIHJvb3QgdG8gdGVzdCB0aGlzKSIKKwlleGl0IDAKK30KKworaWYgdGVzdCB4IiRDT05GSUdfTUtGU19NSU5JWCIgIT0geCJ5IiBcCit8fCB0ZXN0IHgiJENPTkZJR19GRUFUVVJFX01JTklYMiIgIT0geCJ5IiBcCit8fCB0ZXN0IHgiJENPTkZJR19GRUFUVVJFX01PVU5UX0xPT1AiICE9IHgieSIgXAorfHwgdGVzdCB4IiRDT05GSUdfRkVBVFVSRV9NT1VOVF9GTEFHUyIgIT0geCJ5IiBcCit8fCB0ZXN0IHgiJENPTkZJR19GRUFUVVJFX0RFVkZTIiA9IHgieSIgXAorOyB0aGVuCisJZWNobyAiU0tJUFBFRDogbW91bnQiCisJZXhpdCAwCitmaQorCit0ZXN0ZGlyPSIkUFdEL21vdW50LnRlc3RkaXIiCisKK2RkIGlmPS9kZXYvemVybyBvZj1tb3VudC5pbWFnZTFtIGNvdW50PTEgYnM9MU0gMj4vZGV2L251bGwgfHwgeyBlY2hvICJkZCBlcnJvciI7IGV4aXQgMTsgfQorbWtmcy5taW5peCAtdiBtb3VudC5pbWFnZTFtID4vZGV2L251bGwgMj4mMSB8fCB7IGVjaG8gIm1rZnMubWluaXggZXJyb3IiOyBleGl0IDE7IH0KK21vZHByb2JlIG1pbml4IDI+L2Rldi9udWxsCitta2RpciAiJHRlc3RkaXIiIDI+L2Rldi9udWxsCit1bW91bnQgLWQgIiR0ZXN0ZGlyIiAyPi9kZXYvbnVsbAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmQiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisjICAgZmlsZSBpbnB1dCB3aWxsIGJlIGZpbGUgY2FsbGVkICJpbnB1dCIKKyMgICB0ZXN0IGNhbiBjcmVhdGUgYSBmaWxlICJhY3R1YWwiIGluc3RlYWQgb2Ygd3JpdGluZyB0byBzdGRvdXQKKwordGVzdGluZyAibW91bnQgLW8gcmVtb3VudCxtYW5kIiBcCisibW91bnQgLW8gbG9vcCBtb3VudC5pbWFnZTFtICR0ZXN0ZGlyICJcCisiJiYgZ3JlcCAtRmMgJHRlc3RkaXIgPC9wcm9jL21vdW50cyAiXAorIiYmIG1vdW50IC1vIHJlbW91bnQsbWFuZCAkdGVzdGRpciAiXAorIiYmIGdyZXAgLUYgJHRlc3RkaXIgPC9wcm9jL21vdW50cyB8IGdyZXAgLWMgJ1ssIF1tYW5kWywgXSciXAorInx8IGdyZXAgLUYgJHRlc3RkaXIgPC9wcm9jL21vdW50cyIgXAorCSIxXG4iIjFcbiIgXAorCSIiICIiCisKK3Vtb3VudCAtZCAiJHRlc3RkaXIiCitybWRpciAiJHRlc3RkaXIiCitybSBtb3VudC5pbWFnZTFtCisKKworIyBCdWc6IG1vdW50LnNoYXJlZDEgZGlyZWN0b3J5IHNob3dzIG5vIGZpbGVzIChoYXMgdG8gc2hvdyBmaWxlcyBhIGFuZCBiKQorb3B0aW9uYWwgRkVBVFVSRV9MU19SRUNVUlNJVkUgRkVBVFVSRV9MU19TT1JURklMRVMKK3Rlc3RpbmcgIm1vdW50IGJpbmQrcnNoYXJlZCIgIlwKK21rZGlyIC1wIG1vdW50LmRpciBtb3VudC5zaGFyZWQxIG1vdW50LnNoYXJlZDIKK3RvdWNoIG1vdW50LmRpci9hIG1vdW50LmRpci9iCisKK21vdW50IC0tYmluZCAgICAgICAgIG1vdW50LnNoYXJlZDEgbW91bnQuc2hhcmVkMSAyPiYxCittb3VudCAtLW1ha2UtcnNoYXJlZCBtb3VudC5zaGFyZWQxICAgICAgICAgICAgICAgMj4mMQorbW91bnQgLS1iaW5kICAgICAgICAgbW91bnQuc2hhcmVkMiBtb3VudC5zaGFyZWQyIDI+JjEKK21vdW50IC0tbWFrZS1yc2hhcmVkIG1vdW50LnNoYXJlZDIgICAgICAgICAgICAgICAyPiYxCisKK21vdW50IC0tYmluZCBtb3VudC5zaGFyZWQyIG1vdW50LnNoYXJlZDEgICAgICAgICAyPiYxCittb3VudCAtLWJpbmQgbW91bnQuZGlyICAgICBtb3VudC5zaGFyZWQyICAgICAgICAgMj4mMQorCitscyAtUiBtb3VudC5kaXIgbW91bnQuc2hhcmVkMSBtb3VudC5zaGFyZWQyICAgICAgMj4mMQorCit1bW91bnQgbW91bnQuZGlyIG1vdW50LnNoYXJlZDEgbW91bnQuc2hhcmVkMiAyPi9kZXYvbnVsbAordW1vdW50IG1vdW50LmRpciBtb3VudC5zaGFyZWQxIG1vdW50LnNoYXJlZDIgMj4vZGV2L251bGwKK3Vtb3VudCBtb3VudC5kaXIgbW91bnQuc2hhcmVkMSBtb3VudC5zaGFyZWQyIDI+L2Rldi9udWxsCitybSAtZiBtb3VudC5kaXIvYSBtb3VudC5kaXIvYiBtb3VudC5kaXIvYworcm1kaXIgbW91bnQuZGlyIG1vdW50LnNoYXJlZDEgbW91bnQuc2hhcmVkMgorIiBcCisiXAorbW91bnQuZGlyOgorYQorYgorCittb3VudC5zaGFyZWQxOgorYQorYgorCittb3VudC5zaGFyZWQyOgorYQorYgorIiBcCisJIiIgIiIKK1NLSVA9CisKKwordGVzdGluZyAibW91bnQgUk8gbG9vcCIgIlwKK2V4ZWMgMj4mMQordW1vdW50IC1kIG1vdW50LmRpciAyPi9kZXYvbnVsbAorcm1kaXIgbW91bnQuZGlyICAgICAyPi9kZXYvbnVsbAorbWtkaXIgLXAgbW91bnQuZGlyCisoCitjZCBtb3VudC5kaXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgeyBlY2hvICdjZCBlcnJvcic7IGV4aXQgMTsgfQorbWtkaXIgejEgejIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHsgZWNobyAnbWtkaXIgZXJyb3InOyBleGl0IDE7IH0KK21vdW50IC10IHRtcGZzIHRtcGZzIHoxICAgICAgICAgICAgICAgICAgICB8fCB7IGVjaG8gJ21vdW50IHRtcGZzIGVycm9yJzsgZXhpdCAxOyB9CitkZCBpZj0vZGV2L3plcm8gb2Y9ejEvZTJpbWcgY291bnQ9MTAgYnM9MU0gMj4vZGV2L251bGwgfHwgeyBlY2hvICdkZCBlcnJvcic7IGV4aXQgMTsgfQorbWtlMmZzIC1GIHoxL2UyaW1nICAgICAgICAgICAgICAgICAgICAgICAgIDI+L2Rldi9udWxsID4mMiB8fCB7IGVjaG8gJ21rZTJmcyBlcnJvcic7IGV4aXQgMTsgfQorbW91bnQgLXIgLW8gbG9vcCAtdCBleHQyIHoxL2UyaW1nIHoyICAgICAgIHx8IHsgZWNobyAnbW91bnQgLXIgLW8gbG9vcCBlcnJvcic7IGV4aXQgMTsgfQorbW91bnQgLW8gcmVtb3VudCxybyB6MSAgICAgICAgICAgICAgICAgICAgIHx8IHsgZWNobyAnbW91bnQgLW8gcmVtb3VudCxybyBlcnJvcic7IGV4aXQgMTsgfQorKQordW1vdW50IC1kIG1vdW50LmRpci96MgorIyNsb3NldHVwIC1kIC9kZXYvbG9vcCoKK3Vtb3VudCAtZCBtb3VudC5kaXIvejEKK3JtIC1yZiBtb3VudC5kaXIKK2VjaG8gRE9ORQorIiBcCisiRE9ORVxuIiAiIiAiIgorCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL21zaC9tc2gtc3VwcG9ydHMtdW5kZXJzY29yZXMtaW4tdmFyaWFibGUtbmFtZXMgYi90ZXN0c3VpdGUvbXNoL21zaC1zdXBwb3J0cy11bmRlcnNjb3Jlcy1pbi12YXJpYWJsZS1uYW1lcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yzc4MzRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL21zaC9tc2gtc3VwcG9ydHMtdW5kZXJzY29yZXMtaW4tdmFyaWFibGUtbmFtZXMKQEAgLTAsMCArMSBAQAordGVzdCAiYGJ1c3lib3ggbXNoIC1jICdGT09fQkFSPWZvbzsgZWNobyAkRk9PX0JBUidgIiA9IGZvbwpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL212L212LWZpbGVzLXRvLWRpciBiL3Rlc3RzdWl0ZS9tdi9tdi1maWxlcy10by1kaXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI1NjdmNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9tdi9tdi1maWxlcy10by1kaXIKQEAgLTAsMCArMSwxNiBAQAorZWNobyBmaWxlIG51bWJlciBvbmUgPiBmaWxlMQorZWNobyBmaWxlIG51bWJlciB0d28gPiBmaWxlMgorbG4gLXMgZmlsZTIgbGluazEKK21rZGlyIGRpcjEKK1RaPVVUQzAgdG91Y2ggLWQgJzIwMDAtMDEtMzAgMDU6MjQ6MDgnIGRpcjEvZmlsZTMKK21rZGlyIHRoZXJlCitidXN5Ym94IG12IGZpbGUxIGZpbGUyIGxpbmsxIGRpcjEgdGhlcmUKK3Rlc3QgLWYgdGhlcmUvZmlsZTEKK3Rlc3QgLWYgdGhlcmUvZmlsZTIKK3Rlc3QgLWYgdGhlcmUvZGlyMS9maWxlMwordGVzdCAtTCB0aGVyZS9saW5rMQordGVzdCB4ZmlsZTIgPSB4YHJlYWRsaW5rIHRoZXJlL2xpbmsxYAordGVzdCAhIC1lIGZpbGUxCit0ZXN0ICEgLWUgZmlsZTIKK3Rlc3QgISAtZSBsaW5rMQordGVzdCAhIC1lIGRpcjEvZmlsZTMKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9tdi9tdi1mb2xsb3dzLWxpbmtzIGIvdGVzdHN1aXRlL212L212LWZvbGxvd3MtbGlua3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiMzU1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9tdi9tdi1mb2xsb3dzLWxpbmtzCkBAIC0wLDAgKzEsNCBAQAordG91Y2ggZm9vCitsbiAtcyBmb28gYmFyCitidXN5Ym94IG12IGJhciBiYXoKK3Rlc3QgLWYgYmF6CmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtZW1wdHktZmlsZSBiL3Rlc3RzdWl0ZS9tdi9tdi1tb3Zlcy1lbXB0eS1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YWZjYTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtZW1wdHktZmlsZQpAQCAtMCwwICsxLDQgQEAKK3RvdWNoIGZvbworYnVzeWJveCBtdiBmb28gYmFyCit0ZXN0ICEgLWUgZm9vCit0ZXN0IC1mIGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL212L212LW1vdmVzLWZpbGUgYi90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGI0YzM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL212L212LW1vdmVzLWZpbGUKQEAgLTAsMCArMSwzIEBACit0b3VjaCBmb28KK2J1c3lib3ggbXYgZm9vIGJhcgordGVzdCAhIC1mIGZvbyAtYSAtZiBiYXIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9tdi9tdi1tb3Zlcy1oYXJkbGlua3MgYi90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtaGFyZGxpbmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYTgyMTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtaGFyZGxpbmtzCkBAIC0wLDAgKzEsNCBAQAordG91Y2ggZm9vCitsbiBmb28gYmFyCitidXN5Ym94IG12IGJhciBiYXoKK3Rlc3QgISAtZiBiYXIgLWEgLWYgYmF6CmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtbGFyZ2UtZmlsZSBiL3Rlc3RzdWl0ZS9tdi9tdi1tb3Zlcy1sYXJnZS1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZDA4OGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtbGFyZ2UtZmlsZQpAQCAtMCwwICsxLDQgQEAKK2RkIGlmPS9kZXYvemVybyBvZj1mb28gc2Vlaz0xMGsgY291bnQ9MSAyPi9kZXYvbnVsbAorYnVzeWJveCBtdiBmb28gYmFyCit0ZXN0ICEgLWUgZm9vCit0ZXN0IC1mIGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL212L212LW1vdmVzLXNtYWxsLWZpbGUgYi90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtc21hbGwtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjVjN2YxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL212L212LW1vdmVzLXNtYWxsLWZpbGUKQEAgLTAsMCArMSw0IEBACitlY2hvIEkgV0FOVCA+IGZvbworYnVzeWJveCBtdiBmb28gYmFyCit0ZXN0ICEgLWUgZm9vCit0ZXN0IC1mIGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL212L212LW1vdmVzLXN5bWxpbmtzIGIvdGVzdHN1aXRlL212L212LW1vdmVzLXN5bWxpbmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MTNhZjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtc3ltbGlua3MKQEAgLTAsMCArMSw2IEBACit0b3VjaCBmb28KK2xuIC1zIGZvbyBiYXIKK2J1c3lib3ggbXYgYmFyIGJhegordGVzdCAtZiBmb28KK3Rlc3QgISAtZSBiYXIKK3Rlc3QgLUwgYmF6CmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtdW5yZWFkYWJsZS1maWxlcyBiL3Rlc3RzdWl0ZS9tdi9tdi1tb3Zlcy11bnJlYWRhYmxlLWZpbGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjOWMzMTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbXYvbXYtbW92ZXMtdW5yZWFkYWJsZS1maWxlcwpAQCAtMCwwICsxLDUgQEAKK3RvdWNoIGZvbworY2htb2QgYS1yIGZvbworYnVzeWJveCBtdiBmb28gYmFyCit0ZXN0ICEgLWUgZm9vCit0ZXN0IC1mIGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL212L212LXByZXNlcnZlcy1oYXJkLWxpbmtzIGIvdGVzdHN1aXRlL212L212LXByZXNlcnZlcy1oYXJkLWxpbmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYmEzYWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbXYvbXYtcHJlc2VydmVzLWhhcmQtbGlua3MKQEAgLTAsMCArMSw2IEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX1BSRVNFUlZFX0hBUkRMSU5LUwordG91Y2ggZm9vCitsbiBmb28gYmFyCitta2RpciBiYXoKK2J1c3lib3ggbXYgZm9vIGJhciBiYXoKK3Rlc3QgYmF6L2ZvbyAtZWYgYmF6L2JhcgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL212L212LXByZXNlcnZlcy1saW5rcyBiL3Rlc3RzdWl0ZS9tdi9tdi1wcmVzZXJ2ZXMtbGlua3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE1NjVkMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9tdi9tdi1wcmVzZXJ2ZXMtbGlua3MKQEAgLTAsMCArMSw1IEBACit0b3VjaCBmb28KK2xuIC1zIGZvbyBiYXIKK2J1c3lib3ggbXYgYmFyIGJhegordGVzdCAtTCBiYXoKK3Rlc3QgeGZvbyA9IHhgcmVhZGxpbmsgYmF6YApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL212L212LXJlZnVzZXMtbXYtZGlyLXRvLXN1YmRpciBiL3Rlc3RzdWl0ZS9tdi9tdi1yZWZ1c2VzLW12LWRpci10by1zdWJkaXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhZDEzMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9tdi9tdi1yZWZ1c2VzLW12LWRpci10by1zdWJkaXIKQEAgLTAsMCArMSwyMyBAQAorZWNobyBmaWxlIG51bWJlciBvbmUgPiBmaWxlMQorZWNobyBmaWxlIG51bWJlciB0d28gPiBmaWxlMgorbG4gLXMgZmlsZTIgbGluazEKK21rZGlyIGRpcjEKK1RaPVVUQzAgdG91Y2ggLWQgJzIwMDAtMDEtMzAgMDU6MjQ6MDgnIGRpcjEvZmlsZTMKK21rZGlyIHRoZXJlCitidXN5Ym94IG12IGZpbGUxIGZpbGUyIGxpbmsxIGRpcjEgdGhlcmUKK3Rlc3QgLWYgdGhlcmUvZmlsZTEKK3Rlc3QgLWYgdGhlcmUvZmlsZTIKK3Rlc3QgLWYgdGhlcmUvZGlyMS9maWxlMwordGVzdCAtTCB0aGVyZS9saW5rMQordGVzdCB4ZmlsZTIgPSB4YHJlYWRsaW5rIHRoZXJlL2xpbmsxYAordGVzdCAhIC1lIGZpbGUxCit0ZXN0ICEgLWUgZmlsZTIKK3Rlc3QgISAtZSBsaW5rMQordGVzdCAhIC1lIGRpcjEvZmlsZTMKK3NldCArZQorYnVzeWJveCBtdiB0aGVyZSB0aGVyZS9kaXIxCitpZiBbICQ/ICE9IDAgXSA7IHRoZW4KKwlleGl0IDA7CitmaQorCitleGl0IDE7CmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvbXYvbXYtcmVtb3Zlcy1zb3VyY2UtZmlsZSBiL3Rlc3RzdWl0ZS9tdi9tdi1yZW1vdmVzLXNvdXJjZS1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4YWZjYTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvbXYvbXYtcmVtb3Zlcy1zb3VyY2UtZmlsZQpAQCAtMCwwICsxLDQgQEAKK3RvdWNoIGZvbworYnVzeWJveCBtdiBmb28gYmFyCit0ZXN0ICEgLWUgZm9vCit0ZXN0IC1mIGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL29kLnRlc3RzIGIvdGVzdHN1aXRlL29kLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdhOWRhM2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvb2QudGVzdHMKQEAgLTAsMCArMSwzOSBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAiY29tbWFuZHMiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKK29wdGlvbmFsIERFU0tUT1AKK3Rlc3RpbmcgIm9kIC1iIiBcCisJIm9kIC1iIiBcCisiXAorMDAwMDAwMCAxMTAgMTA1IDExNCAxMTQgMTE3CiswMDAwMDA1CisiIFwKKwkiIiAiSEVMTE8iCitTS0lQPQorCitvcHRpb25hbCBERVNLVE9QIExPTkdfT1BUUwordGVzdGluZyAib2QgLWIgLS10cmFkaXRpb25hbCIgXAorCSJvZCAtYiAtLXRyYWRpdGlvbmFsIiBcCisiXAorMDAwMDAwMCAxMTAgMTA1IDExNCAxMTQgMTE3CiswMDAwMDA1CisiIFwKKwkiIiAiSEVMTE8iCitTS0lQPQorCitvcHRpb25hbCBERVNLVE9QIExPTkdfT1BUUwordGVzdGluZyAib2QgLWIgLS10cmFkaXRpb25hbCBGSUxFIiBcCisJIm9kIC1iIC0tdHJhZGl0aW9uYWwgaW5wdXQiIFwKKyJcCiswMDAwMDAwIDExMCAxMDUgMTE0IDExNCAxMTcKKzAwMDAwMDUKKyIgXAorCSJIRUxMTyIgIiIKK1NLSVA9CisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3BhcnNlLnRlc3RzIGIvdGVzdHN1aXRlL3BhcnNlLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjkwNGUxYTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvcGFyc2UudGVzdHMKQEAgLTAsMCArMSwxMTAgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKK0NPTExBUFNFPSQoKCAweDAwMDEwMDAwKSkKK1RSSU09JCgoICAgICAweDAwMDIwMDAwKSkKK0dSRUVEWT0kKCggICAweDAwMDQwMDAwKSkKK01JTl9ESUU9JCgoICAweDAwMTAwMDAwKSkKK0tFRVBfQ09QWT0kKCgweDAwMjAwMDAwKSkKK0VTQ0FQRT0kKCggICAweDAwNDAwMDAwKSkKK05PUk1BTD0kKCggICBDT0xMQVBTRSB8IFRSSU0gfCBHUkVFRFkpKQorCisjIHRlc3RpbmcgImRlc2NyaXB0aW9uIiAiY29tbWFuZCIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCit0ZXN0aW5nICJwYXJzZSBtZGV2LmNvbmYiIFwKKwkicGFyc2UgLW4gNCAtbSAzIC1mICQoKE5PUk1BTCkpIC0iIFwKKwkiW3NkYV1bMDowXVs2NDRdW0BlY2hvIEBlY2hvIFRFU1RdXG4iIFwKKwkiLSIgXAorCSIgc2RhIDA6MCA2NDQgQGVjaG8gQGVjaG8gVEVTVCAjIGVjaG8gdHJhcFxuIgorCit0ZXN0aW5nICJwYXJzZSBub3RyaW0iIFwKKwkicGFyc2UgLW4gNCAtbSAzIC1mICQoKE5PUk1BTCAtIFRSSU0gLSBDT0xMQVBTRSkpIC0iIFwKKwkiW11bc2RhXVswOjBdWzY0NCBAZWNobyBAZWNobyBURVNUIF1cbiIgXAorCSItIiBcCisJIiBzZGEgMDowIDY0NCBAZWNobyBAZWNobyBURVNUIFxuIgorCitGSUxFPV9fcGFyc2UKK2NhdCA+JEZJTEUgPDxFT0YKKyMKKyMgRGV2aWNlICAgICAgICAgUG9pbnQgICAgICAgICAgICAgICBTeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbnMKKyNfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KKy9kZXYvaGRiMyAgICAgICAvICAgICAgICAgICAgICAgICAgICAgICBleHQyICAgICAgICAgICAgICAgICBkZWZhdWx0cyAgICAgIDEgICAgICAgICAgMAorICAgL2Rldi9oZGIxICAgICAgIC9kb3NjICAgICAgICAgICAgICAgaHBmcyAgICAgICAgICAgICAgICAgcm8gICAgICAxICAgICAgICAgIDAKKyAvZGV2L2ZkMCAgICAgICAgICAvZG9zYSAgICAgICAgICAgICAgdmZhdCAgICAgICAgICAgICAgICAgIHJ3LHVzZXIsbm9hdXRvLG5vaGlkZQkgMAkJMAorCS9kZXYvZmQxICAgICAgICAgIC9kb3NiICAgICAgICAgICAgICB2ZmF0ICAgICAgICAgICAgICAgICAgcncsdXNlcixub2F1dG8sbm9oaWRlCSAwCQkwCisjCisgL2Rldi9jZHJvbSAgICAgL2Nkcm9tICAgICAgICAgICAgaXNvOTY2MCAgICAgICAgICBybyx1c2VyLG5vYXV0byxub2hpZGUJIDAJCTAKKy9kZXYvaGRiNSAgICAgICAvcmVkaGF0ICAgICAgICAgICAgZXh0MiAgICAgICAgICAgICAgICAgcncscm9vdCxub2F1dG8sbm9oaWRlCSAwCQkwICNzc3NkCisJL2Rldi9oZGI2ICAgICAgIC93aW4yaG9tZSAgICAgbnRmcyAgICAgICAgICAgICAgICAgIHJ3LHJvb3Qsbm9hdXRvLG5vaGlkZQkgMAkJMCMgc3Nkc2QKKy9kZXYvaGRiNyAgICAgICAvd2luMnNrdWwgICAgICAgIG50ZnMgICAgICAgICAgICAgICAgICBydyxyb290LG5vYXV0byxub2hpZGUgbm9uZQkgMAkJMAorbm9uZSAgICAgL2Rldi9wdHMgICAgICAgICAgIGRldnB0cyAgICAgICAgICAgICBnaWQ9NSxtb2RlPTYyMCAgICAgICAgICAgICAgICAgMCAgICAwIAorICAgICBub25lICAgICAgICAgICAgICAgIC9wcm9jICAgICAgICAgICAgICAgcHJvYyAgICAgICAgICAgICAgICBkZWZhdWx0cyAgICAgMCAgICAgICAgICAwCitFT0YKKworY2F0ID4kRklMRS5yZXMgPDxFT0YKK1svZGV2L2hkYjNdWy9dW2V4dDJdW2RlZmF1bHRzXVsxXVswXQorWy9kZXYvaGRiMV1bL2Rvc2NdW2hwZnNdW3JvXVsxXVswXQorWy9kZXYvZmQwXVsvZG9zYV1bdmZhdF1bcncsdXNlcixub2F1dG8sbm9oaWRlXVswXVswXQorWy9kZXYvZmQxXVsvZG9zYl1bdmZhdF1bcncsdXNlcixub2F1dG8sbm9oaWRlXVswXVswXQorWy9kZXYvY2Ryb21dWy9jZHJvbV1baXNvOTY2MF1bcm8sdXNlcixub2F1dG8sbm9oaWRlXVswXVswXQorWy9kZXYvaGRiNV1bL3JlZGhhdF1bZXh0Ml1bcncscm9vdCxub2F1dG8sbm9oaWRlXVswXVswXQorWy9kZXYvaGRiNl1bL3dpbjJob21lXVtudGZzXVtydyxyb290LG5vYXV0byxub2hpZGVdWzBdWzBdCitbL2Rldi9oZGI3XVsvd2luMnNrdWxdW250ZnNdW3J3LHJvb3Qsbm9hdXRvLG5vaGlkZV1bbm9uZV1bMAkJMF0KK1tub25lXVsvZGV2L3B0c11bZGV2cHRzXVtnaWQ9NSxtb2RlPTYyMF1bMF1bMF0KK1tub25lXVsvcHJvY11bcHJvY11bZGVmYXVsdHNdWzBdWzBdCitFT0YKKwordGVzdGluZyAicGFyc2UgcG9sbHV0ZWQgZnN0YWIiIFwKKwkicGFyc2UgLW4gNiAtbSA2ICRGSUxFIiBcCisJImBjYXQgJEZJTEUucmVzYFxuIiBcCisJIiIgXAorCSIiCitjcCAuLi9leGFtcGxlcy9pbml0dGFiICRGSUxFCitjYXQgPiRGSUxFLnJlcyA8PEVPRgorW11bXVtzeXNpbml0XVsvZXRjL2luaXQuZC9yY1NdCitbXVtdW2Fza2ZpcnN0XVstL2Jpbi9zaF0KK1t0dHkyXVtdW2Fza2ZpcnN0XVstL2Jpbi9zaF0KK1t0dHkzXVtdW2Fza2ZpcnN0XVstL2Jpbi9zaF0KK1t0dHk0XVtdW2Fza2ZpcnN0XVstL2Jpbi9zaF0KK1t0dHk0XVtdW3Jlc3Bhd25dWy9zYmluL2dldHR5IDM4NDAwIHR0eTVdCitbdHR5NV1bXVtyZXNwYXduXVsvc2Jpbi9nZXR0eSAzODQwMCB0dHk2XQorW11bXVtyZXN0YXJ0XVsvc2Jpbi9pbml0XQorW11bXVtjdHJsYWx0ZGVsXVsvc2Jpbi9yZWJvb3RdCitbXVtdW3NodXRkb3duXVsvYmluL3Vtb3VudCAtYSAtcl0KK1tdW11bc2h1dGRvd25dWy9zYmluL3N3YXBvZmYgLWFdCitFT0YKKwordGVzdGluZyAicGFyc2UgaW5pdHRhYiBmcm9tIGV4YW1wbGVzIiBcCisJInBhcnNlIC1uIDQgLW0gNCAtZiAkKChOT1JNQUwgLSBUUklNIC0gQ09MTEFQU0UpKSAtZCcjOicgJEZJTEUiIFwKKwkiYGNhdCAkRklMRS5yZXNgXG4iIFwKKwkiIiBcCisJIiIKKworY3AgLi4vZXhhbXBsZXMvdWRoY3AvdWRoY3BkLmNvbmYgJEZJTEUKK2NhdCA+JEZJTEUucmVzIDw8RU9GCitbc3RhcnRdWzE5Mi4xNjguMC4yMF0KK1tlbmRdWzE5Mi4xNjguMC4yNTRdCitbaW50ZXJmYWNlXVtldGgwXQorW29wdF1bZG5zXVsxOTIuMTY4LjEwLjJdWzE5Mi4xNjguMTAuMTBdCitbb3B0aW9uXVtzdWJuZXRdWzI1NS4yNTUuMjU1LjBdCitbb3B0XVtyb3V0ZXJdWzE5Mi4xNjguMTAuMl0KK1tvcHRdW3dpbnNdWzE5Mi4xNjguMTAuMTBdCitbb3B0aW9uXVtkbnNdWzEyOS4yMTkuMTMuODFdCitbb3B0aW9uXVtkb21haW5dW2xvY2FsXQorW29wdGlvbl1bbGVhc2VdWzg2NDAwMF0KK1tvcHRpb25dWzB4MDhdWzAxMDIwMzA0XQorRU9GCisKK3Rlc3RpbmcgInBhcnNlIHVkaGNwZC5jb25mIGZyb20gZXhhbXBsZXMiIFwKKwkicGFyc2UgLW4gMTI3ICRGSUxFIiBcCisJImBjYXQgJEZJTEUucmVzYFxuIiBcCisJIiIgXAorCSIiCisKK3JtIC1mICRGSUxFICRGSUxFLnJlcworCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9wYXRjaC50ZXN0cyBiL3Rlc3RzdWl0ZS9wYXRjaC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yNzU5ZDJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3BhdGNoLnRlc3RzCkBAIC0wLDAgKzEsMjQ3IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IDIwMDggYnkgRGVueXMgVmxhc2Vua28KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJjb21tYW5kKHMpIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCit0ZXN0aW5nICJwYXRjaCB3aXRoIG9sZF9maWxlID09IG5ld19maWxlIiBcCisJJ3BhdGNoIDI+JjE7IGVjaG8gJD87IGNhdCBpbnB1dCcgXAorIlwKK3BhdGNoaW5nIGZpbGUgaW5wdXQKKzAKK3F3ZQorYXNkCit6eGMKKyIgXAorIlwKK3F3ZQorenhjCisiIFwKKyJcCistLS0gaW5wdXQJSmFuIDAxIDAxOjAxOjAxIDIwMDAKKysrKyBpbnB1dAlKYW4gMDEgMDE6MDE6MDEgMjAwMAorQEAgLTEsMiArMSwzIEBACisgcXdlCisrYXNkCisgenhjCisiIFwKKwordGVzdGluZyAicGF0Y2ggd2l0aCBub25leGlzdGVudCBvbGRfZmlsZSIgXAorCSdwYXRjaCAyPiYxOyBlY2hvICQ/OyBjYXQgaW5wdXQnIFwKKyJcCitwYXRjaGluZyBmaWxlIGlucHV0CiswCitxd2UKK2FzZAorenhjCisiIFwKKyJcCitxd2UKK3p4YworIiBcCisiXAorLS0tIGlucHV0LmRvZXNudF9leGlzdAlKYW4gMDEgMDE6MDE6MDEgMjAwMAorKysrIGlucHV0CUphbiAwMSAwMTowMTowMSAyMDAwCitAQCAtMSwyICsxLDMgQEAKKyBxd2UKKythc2QKKyB6eGMKKyIgXAorCit0ZXN0aW5nICJwYXRjaCAtUiB3aXRoIG5vbmV4aXN0ZW50IG9sZF9maWxlIiBcCisJJ3BhdGNoIC1SIDI+JjE7IGVjaG8gJD87IGNhdCBpbnB1dCcgXAorIlwKK3BhdGNoaW5nIGZpbGUgaW5wdXQKKzAKK3F3ZQorenhjCisiIFwKKyJcCitxd2UKK2FzZAorenhjCisiIFwKKyJcCistLS0gaW5wdXQuZG9lc250X2V4aXN0CUphbiAwMSAwMTowMTowMSAyMDAwCisrKysgaW5wdXQJSmFuIDAxIDAxOjAxOjAxIDIwMDAKK0BAIC0xLDIgKzEsMyBAQAorIHF3ZQorK2FzZAorIHp4YworIiBcCisKK3Rlc3RpbmcgInBhdGNoIGRldGVjdHMgYWxyZWFkeSBhcHBsaWVkIGh1bmsiIFwKKwkncGF0Y2ggMj4mMTsgZWNobyAkPzsgY2F0IGlucHV0JyBcCisiXAorUG9zc2libHkgcmV2ZXJzZWQgaHVuayAxIGF0IDQKK0h1bmsgMSBGQUlMRUQgMS8xLgorIGFiYworK2RlZgorIDEyMworcGF0Y2hpbmcgZmlsZSBpbnB1dAorMQorYWJjCitkZWYKKzEyMworIiBcCisiXAorYWJjCitkZWYKKzEyMworIiBcCisiXAorLS0tIGlucHV0Lm9sZAlKYW4gMDEgMDE6MDE6MDEgMjAwMAorKysrIGlucHV0CUphbiAwMSAwMTowMTowMSAyMDAwCitAQCAtMSwyICsxLDMgQEAKKyBhYmMKKytkZWYKKyAxMjMKKyIgXAorCit0ZXN0aW5nICJwYXRjaCBkZXRlY3RzIGFscmVhZHkgYXBwbGllZCBodW5rIGF0IHRoZSBFT0YiIFwKKwkncGF0Y2ggMj4mMTsgZWNobyAkPzsgY2F0IGlucHV0JyBcCisiXAorUG9zc2libHkgcmV2ZXJzZWQgaHVuayAxIGF0IDQKK0h1bmsgMSBGQUlMRUQgMS8xLgorIGFiYworIDEyMworKzQ1NgorcGF0Y2hpbmcgZmlsZSBpbnB1dAorMQorYWJjCisxMjMKKzQ1NgorIiBcCisiXAorYWJjCisxMjMKKzQ1NgorIiBcCisiXAorLS0tIGlucHV0Lm9sZAlKYW4gMDEgMDE6MDE6MDEgMjAwMAorKysrIGlucHV0CUphbiAwMSAwMTowMTowMSAyMDAwCitAQCAtMSwyICsxLDMgQEAKKyBhYmMKKyAxMjMKKys0NTYKKyIgXAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmQocykiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCit0ZXN0aW5nICJwYXRjaCAtTiBpZ25vcmVzIGFscmVhZHkgYXBwbGllZCBodW5rIiBcCisJJ3BhdGNoIC1OIDI+JjE7IGVjaG8gJD87IGNhdCBpbnB1dCcgXAorIlwKK3BhdGNoaW5nIGZpbGUgaW5wdXQKKzAKK2FiYworZGVmCisxMjMKKyIgXAorIlwKK2FiYworZGVmCisxMjMKKyIgXAorIlwKKy0tLSBpbnB1dAorKysrIGlucHV0CitAQCAtMSwyICsxLDMgQEAKKyBhYmMKKytkZWYKKyAxMjMKKyIgXAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmQocykiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCit0ZXN0aW5nICJwYXRjaCBGSUxFIFBBVENIIiBcCisJJ2NhdCA+YS5wYXRjaDsgcGF0Y2ggaW5wdXQgYS5wYXRjaCAyPiYxOyBlY2hvICQ/OyBjYXQgaW5wdXQ7IHJtIGEucGF0Y2gnIFwKKyJcCitwYXRjaGluZyBmaWxlIGlucHV0CiswCithYmMKK2RlZgorMTIzCisiIFwKKyJcCithYmMKKzEyMworIiBcCisiXAorLS0tIGZvby5vbGQKKysrKyBmb28KK0BAIC0xLDIgKzEsMyBAQAorIGFiYworK2RlZgorIDEyMworIiBcCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAiY29tbWFuZChzKSIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKK3Rlc3RpbmcgInBhdGNoIGF0IHRoZSBiZWdpbm5pbmciIFwKKwkncGF0Y2ggMj4mMTsgY2F0IGlucHV0JyBcCisiXAorcGF0Y2hpbmcgZmlsZSBpbnB1dAorMTExY2hhbmdlZAorNDQ0Cis1NTUKKzY2NgorNzc3Cis4ODgKKzk5OQorIiBcCisiXAorMTExCisyMjIKKzMzMworNDQ0Cis1NTUKKzY2NgorNzc3Cis4ODgKKzk5OQorIiBcCisiXAorLS0tIGlucHV0CisrKysgaW5wdXQKK0BAIC0xLDYgKzEsNCBAQAorLTExMQorLTIyMgorLTMzMworKzExMWNoYW5nZWQKKyA0NDQKKyA1NTUKKyA2NjYKKyIgXAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmQocykiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCit0ZXN0aW5nICJwYXRjaCBjcmVhdGVzIG5ldyBmaWxlIiBcCisJJ3BhdGNoIDI+JjE7IGVjaG8gJD87IGNhdCB0ZXN0ZmlsZTsgcm0gdGVzdGZpbGUnIFwKKyJcCitjcmVhdGluZyB0ZXN0ZmlsZQorMAorcXdlcnR5CisiICIiICJcCistLS0gL2Rldi9udWxsCisrKysgdGVzdGZpbGUKK0BAIC0wLDAgKzEgQEAKKytxd2VydHkKKyIKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJjb21tYW5kKHMpIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgordGVzdGluZyAicGF0Y2ggdW5kZXJzdGFuZHMgLi4uZGlyLy8vZGlyLi4uIiBcCisJJ3BhdGNoIC1wMSAyPiYxOyBlY2hvICQ/JyBcCisiXAorcGF0Y2hpbmcgZmlsZSBkaXIyLy8vZmlsZQorcGF0Y2g6IGNhbid0IG9wZW4gJ2RpcjIvLy9maWxlJzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQorMQorIiAiIiAiXAorLS0tIGJvZ3VzX2Rpci8vL2RpcjIvLy9maWxlCisrKysgYm9ndXNfZGlyLy8vZGlyMi8vL2ZpbGUKK0BAIC0xLDIgKzEsMyBAQAorIHF3ZQorK2FzZAorIHp4YworIgorCitybSBpbnB1dC5vcmlnIDI+L2Rldi9udWxsCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3BpZG9mLnRlc3RzIGIvdGVzdHN1aXRlL3BpZG9mLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjJhMDZkMmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvcGlkb2YudGVzdHMKQEAgLTAsMCArMSwzMyBAQAorIyEvYmluL3NoCisKKyMgcGlkb2YgdGVzdHMuCisjIENvcHlyaWdodCAyMDA1IGJ5IEJlcm5oYXJkIFJldXRuZXItRmlzY2hlcgorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisjIEFVRElUOgorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgIm9wdGlvbnMiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKK3Rlc3RpbmcgInBpZG9mIChleGl0IHdpdGggZXJyb3IpIiBcCisJInBpZG9mIHZlcnl1bmxpa2VseW9jY3VyaW5nYmluYXJ5bmFtZSA7IGVjaG8gXCQ/IiAiMVxuIiAiIiAiIgordGVzdGluZyAicGlkb2YgKGV4aXQgd2l0aCBzdWNjZXNzKSIgInBpZG9mIHBpZG9mID4gL2Rldi9udWxsOyBlY2hvIFwkPyIgXAorCSIwXG4iICIiICIiCisjIFdlIGNhbiBnZXQgYXdheSB3aXRoIHRoaXMgYmVjYXVzZSBpdCBzYXlzICMhL2Jpbi9zaCB1cCB0b3AuCisKK3Rlc3RpbmcgInBpZG9mIHRoaXMiICJwaWRvZiBwaWRvZi50ZXN0cyB8IGdyZXAgLW8gLXcgJCQiICIkJFxuIiAiIiAiIgorCitvcHRpb25hbCBGRUFUVVJFX1BJRE9GX1NJTkdMRQordGVzdGluZyAicGlkb2YgLXMiICJwaWRvZiAtcyBpbml0IiAiMVxuIiAiIiAiIgorU0tJUD0KKworb3B0aW9uYWwgRkVBVFVSRV9QSURPRl9PTUlUIEZFQVRVUkVfUElET0ZfU0lOR0xFCisjIFRoaXMgdGVzdCBmYWlscyBub3cgYmVjYXVzZSBwcm9jZXNzIG5hbWUgbWF0Y2hpbmcgbG9naWMgaGFzIGNoYW5nZWQsCisjIGJ1dCBuZXcgbG9naWMgaXMgbm90ICJ3cm9uZyIgZWl0aGVyLi4uIHNlZSBmaW5kX3BpZF9ieV9uYW1lLmMgY29tbWVudHMKKyN0ZXN0aW5nICJwaWRvZiAtbyAlUFBJRCIgInBpZG9mIC1vICVQUElEIHBpZG9mLnRlc3RzIHwgZ3JlcCAtbyAtdyAkJCIgIiIgIiIgIiIKK3Rlc3RpbmcgInBpZG9mIC1vICVQUElEIE5PUCIgInBpZG9mIC1vICVQUElEIC1zIGluaXQiICIxXG4iICIiICIiCit0ZXN0aW5nICJwaWRvZiAtbyBpbml0IiAicGlkb2YgLW8gMSBpbml0IHwgZ3JlcCAtbyAtdyAxIiAiIiAiIiAiIgorU0tJUD0KKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvcHJpbnRmLnRlc3RzIGIvdGVzdHN1aXRlL3ByaW50Zi50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi45YTNjODc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3ByaW50Zi50ZXN0cwpAQCAtMCwwICsxLDEwOCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDA4IGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgTmVlZCB0aGlzIGluIG9yZGVyIHRvIG5vdCBleGVjdXRlIHNoZWxsIGJ1aWx0aW4KK2JiPSJidXN5Ym94ICIKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJjb21tYW5kIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorCit0ZXN0aW5nICJwcmludGYgcHJvZHVjZXMgbm8gZnVydGhlciBvdXRwdXQgMSIgXAorCSIke2JifXByaW50ZiAnXGMnIGZvbyIgXAorCSIiIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgcHJvZHVjZXMgbm8gZnVydGhlciBvdXRwdXQgMiIgXAorCSIke2JifXByaW50ZiAnJXNcYycgZm9vIGJhciIgXAorCSJmb28iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgcmVwZWF0ZWRseSB1c2VzIHBhdHRlcm4gZm9yIGVhY2ggYXJndiIgXAorCSIke2JifXByaW50ZiAnJXNcbicgZm9vIFwkSE9NRSIgXAorCSJmb29cbiRIT01FXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgdW5kZXJzdGFuZHMgJWIgZXNjYXBlZF9zdHJpbmciIFwKKwkiJHtiYn1wcmludGYgJyViJyAnYVx0YicgJ2NcXGRcbicgMj4mMTsgZWNobyBcJD8iIFwKKwkiYVx0YmNcXGRcbiIiMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAicHJpbnRmIHVuZGVyc3RhbmRzICVkICdcIngnIFwiJ3lcIiBcIid6VEFJTFwiIiBcCisJIiR7YmJ9cHJpbnRmICclZFxuJyAnXCJ4JyBcIid5XCIgXCInelRBSUxcIiAyPiYxOyBlY2hvIFwkPyIgXAorCSIxMjBcbiIiMTIxXG4iIjEyMlxuIiIwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgdW5kZXJzdGFuZHMgJXMgJ1wieCcgXCIneVwiIFwiJ3pUQUlMXCIiIFwKKwkiJHtiYn1wcmludGYgJyVzXG4nICdcIngnIFwiJ3lcIiBcIid6VEFJTFwiIDI+JjE7IGVjaG8gXCQ/IiBcCisJIlwieFxuIiIneVxuIiInelRBSUxcbiIiMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAicHJpbnRmIHVuZGVyc3RhbmRzICUyMy4xMmYiIFwKKwkiJHtiYn1wcmludGYgJ3wlMjMuMTJmfFxuJyA1LjI1IDI+JjE7IGVjaG8gXCQ/IiBcCisJInwgICAgICAgICA1LjI1MDAwMDAwMDAwMHxcbiIiMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAicHJpbnRmIHVuZGVyc3RhbmRzICUqLipmIiBcCisJIiR7YmJ9cHJpbnRmICd8JSouKmZ8XG4nIDIzIDEyIDUuMjUgMj4mMTsgZWNobyBcJD8iIFwKKwkifCAgICAgICAgIDUuMjUwMDAwMDAwMDAwfFxuIiIwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgdW5kZXJzdGFuZHMgJSpmIHdpdGggbmVnYXRpdmUgd2lkdGgiIFwKKwkiJHtiYn1wcmludGYgJ3wlKmZ8XG4nIC0yMyA1LjI1IDI+JjE7IGVjaG8gXCQ/IiBcCisJInw1LjI1MDAwMCAgICAgICAgICAgICAgIHxcbiIiMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAicHJpbnRmIHVuZGVyc3RhbmRzICUuKmYgd2l0aCBuZWdhdGl2ZSBwcmVjaXNpb24iIFwKKwkiJHtiYn1wcmludGYgJ3wlLipmfFxuJyAtMTIgNS4yNSAyPiYxOyBlY2hvIFwkPyIgXAorCSJ8NS4yNTAwMDB8XG4iIjBcbiIgXAorCSIiICIiCisKK3Rlc3RpbmcgInByaW50ZiB1bmRlcnN0YW5kcyAlKi4qZiB3aXRoIG5lZ2F0aXZlIHdpZHRoL3ByZWNpc2lvbiIgXAorCSIke2JifXByaW50ZiAnfCUqLipmfFxuJyAtMjMgLTEyIDUuMjUgMj4mMTsgZWNobyBcJD8iIFwKKwkifDUuMjUwMDAwICAgICAgICAgICAgICAgfFxuIiIwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgdW5kZXJzdGFuZHMgJXpkIiBcCisJIiR7YmJ9cHJpbnRmICclemRcbicgLTUgMj4mMTsgZWNobyBcJD8iIFwKKwkiLTVcbiIiMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAicHJpbnRmIHVuZGVyc3RhbmRzICVsZCIgXAorCSIke2JifXByaW50ZiAnJWxkXG4nIC01IDI+JjE7IGVjaG8gXCQ/IiBcCisJIi01XG4iIjBcbiIgXAorCSIiICIiCisKK3Rlc3RpbmcgInByaW50ZiB1bmRlcnN0YW5kcyAlTGQiIFwKKwkiJHtiYn1wcmludGYgJyVMZFxuJyAtNSAyPiYxOyBlY2hvIFwkPyIgXAorCSItNVxuIiIwXG4iIFwKKwkiIiAiIgorCisjICJGSVhFRCIgbm93IHRvIGFjdCBjb21wYXRpYmx5CisjIyBXZSBhcmUgIm1vcmUgY29ycmVjdCIgaGVyZSB0aGFuIGJhc2gvY29yZXV0aWxzOiB0aGV5IGhhcHBpbHkgcHJpbnQgLTIKKyMjIGFzIGlmIGl0IGlzIGEgaHVnZSB1bnNpZ25lZCBudW1iZXIKKyN0ZXN0aW5nICJwcmludGYgaGFuZGxlcyAldSAtTiIgXAorIwkiJHtiYn1wcmludGYgJyV1XG4nIDEgLTIgMyAyPiYxOyBlY2hvIFwkPyIgXAorIwkiMVxuIiJwcmludGY6IC0yOiBpbnZhbGlkIG51bWJlclxuIiIwXG4iIjNcbiIiMFxuIiBcCisjCSIiICIiCisKK3Rlc3RpbmcgInByaW50ZiBoYW5kbGVzICVkIGJhZF9pbnB1dCIgXAorCSIke2JifXByaW50ZiAnJWRcbicgMSAtIDIgYmFkIDMgMTIzYmFkIDQgMj4mMTsgZWNobyBcJD8iIFwKKyIxXG4iInByaW50ZjogaW52YWxpZCBudW1iZXIgJy0nXG4iIjBcbiJcCisiMlxuIiJwcmludGY6IGludmFsaWQgbnVtYmVyICdiYWQnXG4iIjBcbiJcCisiM1xuIiJwcmludGY6IGludmFsaWQgbnVtYmVyICcxMjNiYWQnXG4iIjBcbiJcCisiNFxuIiIxXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgYWJvcnRzIG9uIGJhcmUgJSIgXAorCSIke2JifXByaW50ZiAnJScgYSBiIGMgMj4mMTsgZWNobyBcJD8iIFwKKwkicHJpbnRmOiAlOiBpbnZhbGlkIGZvcm1hdFxuIiIxXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJwcmludGYgYWJvcnRzIG9uICVyIiBcCisJIiR7YmJ9cHJpbnRmICclcicgYSBiIGMgMj4mMTsgZWNobyBcJD8iIFwKKwkicHJpbnRmOiAlcjogaW52YWxpZCBmb3JtYXRcbiIiMVxuIiBcCisJIiIgIiIKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvcHdkL3B3ZC1wcmludHMtd29ya2luZy1kaXJlY3RvcnkgYi90ZXN0c3VpdGUvcHdkL3B3ZC1wcmludHMtd29ya2luZy1kaXJlY3RvcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTcxYWRiNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9wd2QvcHdkLXByaW50cy13b3JraW5nLWRpcmVjdG9yeQpAQCAtMCwwICsxLDQgQEAKKyMgc2hlbGwncyAkUFdEIG1heSBsZWF2ZSBzeW1saW5rcyB1bnJlc29sdmVkLgorIyAicHdkIiBtYXkgYmUgYSBidWlsdC1pbiBhbmQgaGF2ZSB0aGUgc2FtZSBwcm9ibGVtLgorIyBFeHRlcm5hbCBwd2QgX2Nhbid0XyBoYXZlIHRoYXQgcHJvYmxlbSAoY3VycmVudCBkaXIgb24gVW5peCBpcyBwaHlzaWNhbCkuCit0ZXN0ICQoYHdoaWNoIHB3ZGApID0gJChidXN5Ym94IHB3ZCkKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9yZWFkbGluay50ZXN0cyBiL3Rlc3RzdWl0ZS9yZWFkbGluay50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lOWQ4ZGEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3JlYWRsaW5rLnRlc3RzCkBAIC0wLDAgKzEsMzggQEAKKyMhL2Jpbi9zaAorCisjIFJlYWRsaW5rIHRlc3RzLgorIyBDb3B5cmlnaHQgMjAwNiBieSBOYXRhbmFlbCBDb3BhIDxuQHRhbmFlbC5vcmc+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKK1RFU1RESVI9cmVhZGxpbmtfdGVzdGRpcgorVEVTVEZJTEU9IiRURVNURElSL3Rlc3RmaWxlIgorVEVTVExJTks9InRlc3RsaW5rIgorRkFJTExJTks9IiRURVNURElSLyRURVNURElSL3Rlc3RsaW5rIgorCisjIGNyZWF0ZSB0aGUgZGlyIGFuZCB0ZXN0IGZpbGVzCitta2RpciAtcCAiLi8kVEVTVERJUiIKK3RvdWNoICIuLyRURVNURklMRSIKK2xuIC1zICIuLyRURVNURklMRSIgIi4vJFRFU1RMSU5LIgorCit0ZXN0aW5nICJyZWFkbGluayBvbiBhIGZpbGUiICJyZWFkbGluayAuLyRURVNURklMRSIgIiIgIiIgIiIKK3Rlc3RpbmcgInJlYWRsaW5rIG9uIGEgbGluayIgInJlYWRsaW5rIC4vJFRFU1RMSU5LIiAiLi8kVEVTVEZJTEVcbiIgIiIgIiIKKworb3B0aW9uYWwgRkVBVFVSRV9SRUFETElOS19GT0xMT1cKKworIyBzaGVsbCdzICRQV0QgbWF5IGxlYXZlIHN5bWxpbmtzIHVucmVzb2x2ZWQuCisjICJwd2QiIG1heSBiZSBhIGJ1aWx0LWluIGFuZCBoYXZlIHRoZSBzYW1lIHByb2JsZW0uCisjIEV4dGVybmFsIHB3ZCBfY2FuJ3RfIGhhdmUgdGhhdCBwcm9ibGVtIChjdXJyZW50IGRpciBvbiBVbml4IGlzIHBoeXNpY2FsKS4KK3B3ZD1gd2hpY2ggcHdkYAorcHdkPWAkcHdkYAordGVzdGluZyAicmVhZGxpbmsgLWYgb24gYSBmaWxlIiAicmVhZGxpbmsgLWYgLi8kVEVTVEZJTEUiICIkcHdkLyRURVNURklMRVxuIiAiIiAiIgordGVzdGluZyAicmVhZGxpbmsgLWYgb24gYSBsaW5rIiAicmVhZGxpbmsgLWYgLi8kVEVTVExJTksiICIkcHdkLyRURVNURklMRVxuIiAiIiAiIgordGVzdGluZyAicmVhZGxpbmsgLWYgb24gYW4gaW52YWxpZCBsaW5rIiAicmVhZGxpbmsgLWYgLi8kRkFJTExJTksiICIiICIiICIiCit0ZXN0aW5nICJyZWFkbGluayAtZiBvbiBhIHdpZXJkIGRpciIgInJlYWRsaW5rIC1mICRURVNURElSLy4uLyRURVNURklMRSIgIiRwd2QvJFRFU1RGSUxFXG4iICIiICIiCisKKworIyBjbGVhbiB1cAorcm0gLXIgIiRURVNUTElOSyIgIiRURVNURElSIgorCitleGl0ICQoKEZBSUxDT1VOVCA8PSAyNTUgPyBGQUlMQ09VTlQgOiAyNTUpKQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3JtL3JtLXJlbW92ZXMtZmlsZSBiL3Rlc3RzdWl0ZS9ybS9ybS1yZW1vdmVzLWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1NzFhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9ybS9ybS1yZW1vdmVzLWZpbGUKQEAgLTAsMCArMSwzIEBACit0b3VjaCBmb28KK2J1c3lib3ggcm0gZm9vCit0ZXN0ICEgLWYgZm9vCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvcm1kaXIvcm1kaXItcmVtb3Zlcy1wYXJlbnQtZGlyZWN0b3JpZXMgYi90ZXN0c3VpdGUvcm1kaXIvcm1kaXItcmVtb3Zlcy1wYXJlbnQtZGlyZWN0b3JpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIyZjVkZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9ybWRpci9ybWRpci1yZW1vdmVzLXBhcmVudC1kaXJlY3RvcmllcwpAQCAtMCwwICsxLDMgQEAKK21rZGlyIC1wIGZvby9iYXIKK2J1c3lib3ggcm1kaXIgLXAgZm9vL2JhcgordGVzdCAhIC1kIGZvbwpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3J1bnRlc3QgYi90ZXN0c3VpdGUvcnVudGVzdApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MTU3NWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3J1bnRlc3QKQEAgLTAsMCArMSwxNzEgQEAKKyMhL2Jpbi9zaAorIyBVc2FnZToKKyMgcnVudGVzdCBbYXBwbGV0MV0gW2FwcGxldDIuLi5dCisKKy4gLi90ZXN0aW5nLnNoCisKK3RvdGFsX2ZhaWxlZD0wCisKKyMgUnVuIG9uZSBvbGQtc3R5bGUgdGVzdC4KKyMgVGVzdHMgYXJlIHN0b3JlZCBpbiBhcHBsZXQvdGVzdGNhc2Ugc2hlbGwgc2NyaXB0cy4KKyMgVGhleSBhcmUgcnVuIHVzaW5nICJzaCAteCAtZSBhcHBsZXQvdGVzdGNhc2UiLgorIyBPcHRpb24gLWUgd2lsbCBtYWtlIHRlc3RjYXNlIHN0b3Agb24gdGhlIGZpcnN0IGZhaWxlZCBjb21tYW5kLgorcnVuX2FwcGxldF90ZXN0Y2FzZSgpCit7CisJbG9jYWwgYXBwbGV0PSIkMSIKKwlsb2NhbCB0ZXN0Y2FzZT0iJDIiCisKKwlsb2NhbCBzdGF0dXM9MAorCWxvY2FsIHVjX2FwcGxldD0kKGVjaG8gIiRhcHBsZXQiIHwgdHIgYS16IEEtWikKKwlsb2NhbCB0ZXN0bmFtZT0iJHRlc3RjYXNlIgorCisJdGVzdG5hbWU9IiR7dGVzdG5hbWUjIyovfSIgIyB0YWtlIGJhc2VuYW1lCisJaWYgZ3JlcCAiXiMgQ09ORklHXyR1Y19hcHBsZXQgaXMgbm90IHNldCQiICIkYmluZGlyLy5jb25maWciID4vZGV2L251bGw7IHRoZW4KKwkJZWNobyAiVU5URVNURUQ6ICR0ZXN0bmFtZSIKKwkJcmV0dXJuIDAKKwlmaQorCisJaWYgZ3JlcCAiXiMgRkVBVFVSRTogIiAiJHRlc3RjYXNlIiA+L2Rldi9udWxsOyB0aGVuCisJCWxvY2FsIGZlYXR1cmU9JChzZWQgLW5lICdzL14jIEZFQVRVUkU6IC8vcCcgIiR0ZXN0Y2FzZSIpCisKKwkJZm9yIGYgaW4gJGZlYXR1cmU7IGRvCisJCQlpZiBncmVwICJeIyAkZiBpcyBub3Qgc2V0JCIgIiRiaW5kaXIvLmNvbmZpZyIgPi9kZXYvbnVsbDsgdGhlbgorCQkJCWVjaG8gIlVOVEVTVEVEOiAkdGVzdG5hbWUiCisJCQkJcmV0dXJuIDAKKwkJCWZpCisJCWRvbmUKKwlmaQorCisJcm0gLXJmICIudG1wZGlyLiRhcHBsZXQiCisJbWtkaXIgLXAgIi50bXBkaXIuJGFwcGxldCIKKwljZCAiLnRtcGRpci4kYXBwbGV0IiB8fCByZXR1cm4gMQorCisjCWVjaG8gIlJ1bm5pbmcgdGVzdGNhc2UgJHRlc3RjYXNlIgorCWQ9IiR0c2RpciIgXAorCQlzaCAteCAtZSAiJHRlc3RjYXNlIiA+IiR0ZXN0bmFtZS5zdGRvdXQudHh0IiAyPiYxIHx8IHN0YXR1cz0kPworCWlmIFsgJHN0YXR1cyAtbmUgMCBdOyB0aGVuCisJCWVjaG8gIkZBSUw6ICR0ZXN0bmFtZSIKKwkJaWYgWyB4IiRWRVJCT1NFIiAhPSB4IF07IHRoZW4KKwkJCWNhdCAiJHRlc3RuYW1lLnN0ZG91dC50eHQiCisJCWZpCisJZWxzZQorCQllY2hvICJQQVNTOiAkdGVzdG5hbWUiCisJZmkKKworCWNkIC4uCisJcm0gLXJmICIudG1wZGlyLiRhcHBsZXQiCisKKwlyZXR1cm4gJHN0YXR1cworfQorCisjIFJ1biBhbGwgb2xkLXN0eWxlIHRlc3RzIGZvciBnaXZlbiBhcHBsZXQKK3J1bl9vbGRzdHlsZV9hcHBsZXRfdGVzdHMoKQoreworCWxvY2FsIGFwcGxldD0iJDEiCisJbG9jYWwgc3RhdHVzPTAKKworCWZvciB0ZXN0Y2FzZSBpbiAiJHRzZGlyLyRhcHBsZXQiLyo7IGRvCisJCSMgc3dpdGNoIG9uIGJhc2VuYW1lIG9mICR0ZXN0Y2FzZQorCQljYXNlICIke3Rlc3RjYXNlIyMqL30iIGluCisJCQkuKikgICAgIGNvbnRpbnVlIDs7ICAgICMgLnN2biwgLmdpdCBldGMKKwkJCSp+KSAgICAgY29udGludWUgOzsgICAgIyBiYWNrdXAgZmlsZXMKKwkJCSJDVlMiKSAgY29udGludWUgOzsKKwkJCVwjKikgICAgY29udGludWUgOzsgICAgIyBDVlMgbWVyZ2UgcmVzaWR1ZXMKKwkJCSoubWluZSkgY29udGludWUgOzsgICAgIyBzdm4tcHJvZHVjZWQganVuaworCQkJKi5yWzAtOV0qKSBjb250aW51ZSA7OyAjIHN2bi1wcm9kdWNlZCBqdW5rCisJCWVzYWMKKwkJcnVuX2FwcGxldF90ZXN0Y2FzZSAiJGFwcGxldCIgIiR0ZXN0Y2FzZSIgfHwgeworCQkJc3RhdHVzPTEKKwkJCXRvdGFsX2ZhaWxlZD0kKCh0b3RhbF9mYWlsZWQgKyAxKSkKKwkJfQorCWRvbmUKKwlyZXR1cm4gJHN0YXR1cworfQorCisKKworbGN3ZD0kKHB3ZCkKK1sgeCIkdHNkaXIiICE9IHgiIiBdIHx8IHRzZGlyPSIkbGN3ZCIKK1sgeCIkYmluZGlyIiAhPSB4IiIgXSB8fCBiaW5kaXI9IiR7bGN3ZCUvKn0iICMgb25lIGRpcmVjdG9yeSB1cCBmcm9tICRsY3dkCitQQVRIPSIkYmluZGlyOiRQQVRIIgorZXhwb3J0IGJpbmRpciAgICMgc29tZSB0ZXN0cyBuZWVkIHRvIGxvb2sgYXQgJGJpbmRpci8uY29uZmlnCisKK2lmIFsgeCIkVkVSQk9TRSIgPSB4IF07IHRoZW4KKwlleHBvcnQgVkVSQk9TRT0KK2ZpCisKK2lmIFsgeCIkMSIgPSB4Ii12IiBdOyB0aGVuCisJZXhwb3J0IFZFUkJPU0U9MQorCXNoaWZ0CitmaQorCitpbXBsZW1lbnRlZD0kKAorCXByaW50ZiAiYnVzeWJveCAiICMgYWx3YXlzIGltcGxlbWVudGVkCisJIiRiaW5kaXIvYnVzeWJveCIgMj4mMSB8CisJd2hpbGUgcmVhZCBsaW5lOyBkbworCQlpZiBbIHgiJGxpbmUiID0geCJDdXJyZW50bHkgZGVmaW5lZCBmdW5jdGlvbnM6IiBdOyB0aGVuCisJCQl4YXJncyB8IHNlZCAncy8sLy9nJworCQkJYnJlYWsKKwkJZmkKKwlkb25lCisJKQorCithcHBsZXRzPSIkaW1wbGVtZW50ZWQiCitpZiBbICQjIC1uZSAwIF07IHRoZW4KKwlhcHBsZXRzPSIkQCIKK2ZpCisKKyMgUG9wdWxhdGUgYSBkaXJlY3Rvcnkgd2l0aCBsaW5rcyB0byBhbGwgYnVzeWJveCBhcHBsZXRzCisKK0xJTktTRElSPSIkYmluZGlyL3J1bnRlc3QtdGVtcGRpci1saW5rcyIKKworIyBDb21tZW50IHRoaXMgbGluZSBvdXQgaWYgeW91IGhhdmUgcHV0IGEgZGlmZmVyZW50IGJpbmFyeSBpbiAkTElOS1NESVIKKyMgKHNheSwgYSAic3RhbmRhcmQiIHRvb2wncyBiaW5hcnkpIGluIG9yZGVyIHRvIHJ1biB0ZXN0cyBhZ2FpbnN0IGl0Ogorcm0gLXJmICIkTElOS1NESVIiIDI+L2Rldi9udWxsCisKK21rZGlyICIkTElOS1NESVIiIDI+L2Rldi9udWxsCitmb3IgaSBpbiAkaW1wbGVtZW50ZWQ7IGRvCisJIyBOb3RlOiBpZiAkTElOS1NESVIvYXBwbGV0IGV4aXN0cywgd2UgZG8gbm90IG92ZXJ3cml0ZSBpdC4KKwkjIFVzZWZ1bCBpZiBvbmUgd2FudHMgdG8gcnVuIHRlc3RzIGFnYWluc3QgYSBzdGFuZGFyZCB1dGlsaXR5LAorCSMgbm90IGFuIGFwcGxldC4KKwlsbiAtcyAiJGJpbmRpci9idXN5Ym94IiAiJExJTktTRElSLyRpIiAyPi9kZXYvbnVsbAorZG9uZQorCisjIFNldCB1cCBvcHRpb24gZmxhZ3Mgc28gdGVzdHMgY2FuIGJlIHNlbGVjdGl2ZS4KK2V4cG9ydCBPUFRJT05GTEFHUz06JCgKKwlzZWQgLW5yICdzL15DT05GSUdfLy9wJyAiJGJpbmRpci8uY29uZmlnIiB8CisJc2VkICdzLz0uKi8vJyB8IHhhcmdzIHwgc2VkICdzLyAvOi9nJworCSk6CisKK3N0YXR1cz0wCitmb3IgYXBwbGV0IGluICRhcHBsZXRzOyBkbworCSMgQW55IG9sZC1zdHlsZSB0ZXN0cyBmb3IgdGhpcyBhcHBsZXQ/CisJaWYgWyAtZCAiJHRzZGlyLyRhcHBsZXQiIF07IHRoZW4KKwkJcnVuX29sZHN0eWxlX2FwcGxldF90ZXN0cyAiJGFwcGxldCIgfHwgc3RhdHVzPTEKKwlmaQorCisJIyBJcyB0aGlzIGEgbmV3LXN0eWxlIHRlc3Q/CisJaWYgWyAtZiAiJGFwcGxldC50ZXN0cyIgXTsgdGhlbgorCQlpZiBbICEgLWUgIiRMSU5LU0RJUi8kYXBwbGV0IiBdOyB0aGVuCisJCQkjIChhdm9pZGluZyBiYXNoJ2lzbSAiJHthcHBsZXQ6MDo0fSIpCisJCQlpZiAhIGVjaG8gIiRhcHBsZXQiIHwgZ3JlcCAiXmFsbF8iID4vZGV2L251bGw7IHRoZW4KKwkJCQllY2hvICJTS0lQUEVEOiAkYXBwbGV0IChub3QgYnVpbHQpIgorCQkJCWNvbnRpbnVlCisJCQlmaQorCQlmaQorIwkJZWNobyAiUnVubmluZyB0ZXN0ICR0c2Rpci8kYXBwbGV0LnRlc3RzIgorCQlQQVRIPSIkTElOS1NESVI6JHRzZGlyOiRiaW5kaXI6JFBBVEgiIFwKKwkJCSIkdHNkaXIvJGFwcGxldC50ZXN0cyIKKwkJcmM9JD8KKwkJdG90YWxfZmFpbGVkPSQoKHRvdGFsX2ZhaWxlZCArIHJjKSkKKwkJdGVzdCAkcmMgLW5lIDAgJiYgc3RhdHVzPTEKKwlmaQorZG9uZQorCisjIExlYXZpbmcgdGhlIGRpciBtYWtlcyBpdCBzb21ld2hhdCBlYXNpZXIgdG8gcnVuIGZhaWxlZCB0ZXN0IGJ5IGhhbmQKKyNybSAtcmYgIiRMSU5LU0RJUiIKKworaWYgWyAkc3RhdHVzIC1uZSAwIF0gJiYgWyB4IiRWRVJCT1NFIiA9IHggXTsgdGhlbgorCWVjaG8gIiR0b3RhbF9mYWlsZWQgZmFpbHVyZShzKSBkZXRlY3RlZDsgcnVubmluZyB3aXRoIC12ICh2ZXJib3NlKSB3aWxsIGdpdmUgbW9yZSBpbmZvIgorZmkKK2V4aXQgJHN0YXR1cwpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3J4LnRlc3RzIGIvdGVzdHN1aXRlL3J4LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM3ZmEwMmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvcngudGVzdHMKQEAgLTAsMCArMSwyNyBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDA5IGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAib3B0aW9ucyIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKworIyBTaW1wbGUgb25lLWJsb2NrIGZpbGUgdHJhbnNmZXIKKyMgcnggPT4gJ0MnCisjIHJ4IDw9IFNPSCA8YmxvY2tubz4gPDI1NS1ibG9ja25vPiA8MTI4IGJ5dGUgcGFkZGVkIHdpdGggeDFBPiA8Y3JjPiA8Y3JjPgorIyByeCA9PiBBQ0sKKyMgcnggPD0gRU9UCisjIHJ4ID0+IEFDSwordGVzdGluZyAicngiIFwKKwkicnggcnguT1VURklMRSB8IGhleGR1bXAgLXZDICYmIGNhdCByeC5PVVRGSUxFIiBcCisiXAorMDAwMDAwMDAgIDQzIDA2IDA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfEMuLnxcblwKKzAwMDAwMDAzXG5cCis/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/Pz8iIFwKKwkiIiAiXDAxXDAxXDAzNzZcCis/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/Pz9cCitceDFBXHgxQVx4MUFceDFBXHgxQVx4NEJceEIwXDA0IgorCitybSAtZiByeC5PVVRGSUxFIDI+L2Rldi9udWxsCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3NlZC50ZXN0cyBiL3Rlc3RzdWl0ZS9zZWQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMzQ0NzllNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9zZWQudGVzdHMKQEAgLTAsMCArMSwzNzAgQEAKKyMhL2Jpbi9zaAorCisjIFNVU3YzIGNvbXBsaWFudCBzZWQgdGVzdHMuCisjIENvcHlyaWdodCAyMDA1IGJ5IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAiZGVzY3JpcHRpb24iICJjb21tYW5kcyIgInJlc3VsdCIgImluZmlsZSIgInN0ZGluIgorCisjIENvcm5lciBjYXNlcwordGVzdGluZyAic2VkIG5vIGZpbGVzIChzdGRpbikiICdzZWQgIiInICJoZWxsb1xuIiAiIiAiaGVsbG9cbiIKK3Rlc3RpbmcgInNlZCBleHBsaWNpdCBzdGRpbiIgJ3NlZCAiIiAtJyAiaGVsbG9cbiIgIiIgImhlbGxvXG4iCit0ZXN0aW5nICJzZWQgaGFuZGxlcyBlbXB0eSBsaW5lcyIgInNlZCAtZSAncy9cJC9ALyciICJAXG4iICIiICJcbiIKK3Rlc3RpbmcgInNlZCBzdGRpbiB0d2ljZSIgJ3NlZCAiIiAtIC0nICJoZWxsbyIgIiIgImhlbGxvIgorCisjIFRyYWlsaW5nIEVPRi4KKyMJTWF0Y2ggJCwgYXQgZW5kIG9mIGVhY2ggZmlsZSBvciBhbGwgZmlsZXM/CisKKyMgLWUgY29ybmVyIGNhc2VzCisjCXdpdGhvdXQgLWUKKyMJbXVsdGlwbGUgLWUKKyMJCWludGVyYWN0IHdpdGggYQorIwktZWVlIGFyZzEgYXJnMiBhcmczCisjIC1mIGNvcm5lciBjYXNlcworIwktZSAtZiAtZQorIyAtbiBjb3JuZXIgY2FzZXMKKyMJbm8gbmV3bGluZSBhdCBFT0Y/CisjIC1yIGNvcm5lciBjYXNlcworIwlKdXN0IG1ha2Ugc3VyZSBpdCB3b3Jrcy4KKyMgLWkgY29ybmVyIGNhc2VzOgorIwlzZWQgLWkgLQorIwlwZXJtaXNzaW9ucworIwktaSBvbiBhIHN5bWxpbmsKKyMJb24gYSBkaXJlY3RvcnkKKyMgICAgICAgV2l0aCAkIGxhc3QtbGluZSB0ZXN0CisjIENvbnRpbnVlIHdpdGggXAorIyAgICAgICBFbmQgb2Ygc2NyaXB0IHdpdGggdHJhaWxpbmcgXAorCisjIGNvbW1hbmQgbGlzdAordGVzdGluZyAic2VkIGFjY2VwdHMgYmxhbmtzIGJlZm9yZSBjb21tYW5kIiAic2VkIC1lICcxIGQnIiAiIiAiIiAiIgordGVzdGluZyAic2VkIGFjY2VwdHMgbmV3bGluZXMgaW4gLWUiICJzZWQgLWUgJ2lcCisxCithXAorMyciICIxXG4yXG4zXG4iICIiICIyXG4iCit0ZXN0aW5nICJzZWQgYWNjZXB0cyBtdWx0aXBsZSAtZSIgInNlZCAtZSAnaVwnIC1lICcxJyAtZSAnYVwnIC1lICczJyIgXAorCSIxXG4yXG4zXG4iICIiICIyXG4iCisKKyMgc3Vic3RpdHV0aW9ucwordGVzdGluZyAic2VkIC1uIiAic2VkIC1uIC1lIHMvZm9vL2Jhci8gLWUgcy9iYXIvYmF6LyIgIiIgIiIgImZvb1xuIgordGVzdGluZyAic2VkIHdpdGggZW1wdHkgbWF0Y2giICJzZWQgJ3MveiovL2cnIiAic3RyaW5nXG4iICIiICJzdHJpbmdcbiIKK3Rlc3RpbmcgInNlZCBzLy9wIiAic2VkIC1lIHMvZm9vL2Jhci9wIC1lIHMvYmFyL2Jhei9wIiAiYmFyXG5iYXpcbmJhelxuIiBcCisJIiIgImZvb1xuIgordGVzdGluZyAic2VkIC1uIHMvL3AiICJzZWQgLW5lIHMvYWJjL2RlZi9wIiAiZGVmXG4iICIiICJhYmNcbiIKK3Rlc3RpbmcgInNlZCBzLy9nIChleGhhdXN0aXZlKSIgInNlZCAtZSAncy9bWzpzcGFjZTpdXSovLC9nJyIgIiwxLDIsMyw0LDUsXG4iIFwKKwkiIiAiMTIzNDVcbiIKK3Rlc3RpbmcgInNlZCBzIGFyYml0cmFyeSBkZWxpbWl0ZXIiICJzZWQgLWUgJ3Mgd29vIGJvaW5nICciICJib2luZ1xuIiAiIiAid29vXG4iCit0ZXN0aW5nICJzZWQgcyBjaGFpbnMiICJzZWQgLWUgcy9mb28vYmFyLyAtZSBzL2Jhci9iYXovIiAiYmF6XG4iICIiICJmb29cbiIKK3Rlc3RpbmcgInNlZCBzIGNoYWluczIiICJzZWQgLWUgcy9mb28vYmFyLyAtZSBzL2Jhei9uZWUvIiAiYmFyXG4iICIiICJmb29cbiIKK3Rlc3RpbmcgInNlZCBzIFtkZWxpbWl0ZXJdIiAic2VkIC1lICdzQFtAXUBAJyIgIm9uZXR3byIgIiIgIm9uZUB0d28iCit0ZXN0aW5nICJzZWQgcyB3aXRoIFxcdCAoR05VIGV4dCkiICJzZWQgJ3MvXHQvIC8nIiAib25lIHR3byIgIiIgIm9uZVx0dHdvIgorCisjIGJyYW5jaAordGVzdGluZyAic2VkIGIgKGJyYW5jaCkiICJzZWQgLWUgJ2Igb25lO3A7OiBvbmUnIiAiZm9vXG4iICIiICJmb29cbiIKK3Rlc3RpbmcgInNlZCBiIChicmFuY2ggd2l0aCBubyBsYWJlbCBqdW1wcyB0byBlbmQpIiAic2VkIC1lICdiO3AnIiBcCisJImZvb1xuIiAiIiAiZm9vXG4iCisKKyMgdGVzdCBhbmQgYnJhbmNoCit0ZXN0aW5nICJzZWQgdCAodGVzdC9icmFuY2gpIiAic2VkIC1lICdzL2EvMS87dCBvbmU7cDs6IG9uZTtwJyIgXAorCSIxXG4xXG5iXG5iXG5iXG5jXG5jXG5jXG4iICIiICJhXG5iXG5jXG4iCit0ZXN0aW5nICJzZWQgdCAodGVzdC9icmFuY2ggY2xlYXJzIHRlc3QgYml0KSIgInNlZCAtZSAncy9hL2IvOzpsb29wO3QgbG9vcCciIFwKKwkiYlxuYlxuY1xuIiAiIiAiYVxuYlxuY1xuIgordGVzdGluZyAic2VkIFQgKCF0ZXN0L2JyYW5jaCkiICJzZWQgLWUgJ3MvYS8xLztUIG5vdG9uZTtwOzogbm90b25lO3AnIiBcCisJIjFcbjFcbjFcbmJcbmJcbmNcbmNcbiIgIiIgImFcbmJcbmNcbiIKKwordGVzdCB4IiRTS0lQX0tOT1dOX0JVR1MiID0geCIiICYmIHsKKyMgTm9ybWFsIHNlZCBlbmQtb2Ytc2NyaXB0IGRvZXNuJ3QgcHJpbnQgImMiIGJlY2F1c2UgbiBmbHVzaGVkIHRoZSBwYXR0ZXJuCisjIHNwYWNlLiAgSWYgbiBoaXRzIEVPRiwgcGF0dGVybiBzcGFjZSBpcyBlbXB0eSB3aGVuIHNjcmlwdCBlbmRzLgorIyBRdWVyeTogaG93IGRvZXMgdGhpcyBpbnRlcmFjdCB3aXRoIG5vIG5ld2xpbmUgYXQgRU9GPwordGVzdGluZyAic2VkIG4gKGZsdXNoZXMgcGF0dGVybiBzcGFjZSwgdGVybWluYXRlcyBlYXJseSkiICJzZWQgLWUgJ247cCciIFwKKwkiYVxuYlxuYlxuY1xuIiAiIiAiYVxuYlxuY1xuIgorfQorIyBub24tR05VIHNlZDogTiBkb2VzIF9ub3RfIGZsdXNoIHBhdHRlcm4gc3BhY2UsIHRoZXJlZm9yZSBjIGlzIGVhdGVuIEAgc2NyaXB0IGVuZAorIyBHTlUgc2VkOiBOIGZsdXNoZXMgcGF0dGVybiBzcGFjZSwgdGhlcmVmb3JlIGMgaXMgcHJpbnRlZCB0b28gQCBzY3JpcHQgZW5kCit0ZXN0aW5nICJzZWQgTiAoZmx1c2hlcyBwYXR0ZXJuIHNwYWNlIChHTlUgYmVoYXZpb3IpKSIgInNlZCAtZSAnTjtwJyIgXAorCSJhXG5iXG5hXG5iXG5jXG4iICIiICJhXG5iXG5jXG4iCisKK3Rlc3RpbmcgInNlZCBOIHRlc3QyIiAic2VkICc6YTtOO3MvXG4vIC87dGEnIiBcCisJImEgYiBjXG4iICIiICJhXG5iXG5jXG4iCisKK3Rlc3RpbmcgInNlZCBOIHRlc3QzIiAic2VkICdOO3MvXG4vIC8nIiBcCisJImEgYlxuY1xuIiAiIiAiYVxuYlxuY1xuIgorCit0ZXN0aW5nICJzZWQgYWRkcmVzcyBtYXRjaCBuZXdsaW5lIiAnc2VkICIvYi9OOy9iXFxuYy9pIHdvbyInIFwKKwkiYVxud29vXG5iXG5jXG5kXG4iICIiICJhXG5iXG5jXG5kXG4iCisKKyMgTXVsdGlwbGUgbGluZXMgaW4gcGF0dGVybiBzcGFjZQordGVzdGluZyAic2VkIE4gKHN0b3BzIGF0IGVuZCBvZiBpbnB1dCkgYW5kIFAgKHByaW50cyB0byBmaXJzdCBuZXdsaW5lIG9ubHkpIiBcCisJInNlZCAtbiAnTjtQO3AnIiAiYVxuYVxuYlxuIiAiIiAiYVxuYlxuY1xuIgorCisjIEhvbGQgc3BhY2UKK3Rlc3RpbmcgInNlZCBHIChhcHBlbmQgaG9sZCBzcGFjZSB0byBwYXR0ZXJuIHNwYWNlKSIgJ3NlZCBHJyAiYVxuXG5iXG5cbmNcblxuIiBcCisJIiIgImFcbmJcbmNcbiIKKyN0ZXN0aW5nICJzZWQgZy9HIChzd2FwL2FwcGVuZCBob2xkIGFuZCBwYXR0ZXIgc3BhY2UpIgorI3Rlc3RpbmcgInNlZCBnIChzd2FwIGhvbGQvcGF0dGVybiBzcGFjZSkiCisKK3Rlc3RpbmcgInNlZCBkIGVuZHMgc2NyaXB0IGl0ZXJhdGlvbiIgXAorCSJzZWQgLWUgJy9vb2svZDtzL29vay9waW5nL3A7aSB3b290JyIgIiIgIiIgIm9va1xuIgordGVzdGluZyAic2VkIGQgZW5kcyBzY3JpcHQgaXRlcmF0aW9uICgyKSIgXAorCSJzZWQgLWUgJy9vb2svZDthXCcgLWUgJ2JhbmcnIiAid29vdFxuYmFuZ1xuIiAiIiAib29rXG53b290XG4iCisKKyMgTXVsdGlwbGUgZmlsZXMsIHdpdGggdmFyeWluZyBuZXdsaW5lcyBhbmQgTlVMIGJ5dGVzCit0ZXN0IHgiJFNLSVBfS05PV05fQlVHUyIgPSB4IiIgJiYgewordGVzdGluZyAic2VkIGVtYmVkZGVkIE5VTCIgInNlZCAtZSAncy93b28vYmFuZy8nIiAiXDBiYW5nXDB3b29cMCIgIiIgXAorCSJcMHdvb1wwd29vXDAiCit9Cit0ZXN0aW5nICJzZWQgZW1iZWRkZWQgTlVMIGciICJzZWQgLWUgJ3Mvd29vL2JhbmcvZyciICJiYW5nXDBiYW5nXDAiICIiIFwKKwkid29vXDB3b29cMCIKK3Rlc3QgeCIkU0tJUF9LTk9XTl9CVUdTIiA9IHgiIiAmJiB7CiskRUNITyAtZSAiL3dvby9hIGhlXDBsbG8iID4gc2VkLmNvbW1hbmRzCit0ZXN0aW5nICJzZWQgTlVMIGluIGNvbW1hbmQiICJzZWQgLWYgc2VkLmNvbW1hbmRzIiAid29vXG5oZVwwbGxvXG4iICIiICJ3b28iCitybSBzZWQuY29tbWFuZHMKK30KKworIyBzZWQgaGFzIGZ1bmt5IGJlaGF2aW9yIHdpdGggbmV3bGluZXMgYXQgdGhlIGVuZCBvZiBmaWxlLiAgVGVzdCBsb3RzIG9mCisjIGNvcm5lciBjYXNlcyB3aXRoIHRoZSBvcHRpb25hbCBuZXdsaW5lIGFwcGVuZGluZyBiZWhhdmlvci4KKwordGVzdGluZyAic2VkIG5vcm1hbCBuZXdsaW5lcyIgInNlZCAtZSAncy93b28vYmFuZy8nIGlucHV0IC0iICJiYW5nXG5iYW5nXG4iIFwKKwkid29vXG4iICJ3b29cbiIKK3Rlc3RpbmcgInNlZCBsZWF2ZSBvZmYgdHJhaWxpbmcgbmV3bGluZSIgInNlZCAtZSAncy93b28vYmFuZy8nIGlucHV0IC0iIFwKKwkiYmFuZ1xuYmFuZyIgIndvb1xuIiAid29vIgordGVzdGluZyAic2VkIGF1dG9pbnNlcnQgbmV3bGluZSIgInNlZCAtZSAncy93b28vYmFuZy8nIGlucHV0IC0iICJiYW5nXG5iYW5nIiBcCisJIndvbyIgIndvbyIKK3Rlc3RpbmcgInNlZCBlbXB0eSBmaWxlIHBsdXMgY2F0IiAic2VkIC1lICdzL25vaGl0Ly8nIGlucHV0IC0iICJvbmVcbnR3byIgXAorCSIiICJvbmVcbnR3byIKK3Rlc3RpbmcgInNlZCBjYXQgcGx1cyBlbXB0eSBmaWxlIiAic2VkIC1lICdzL25vaGl0Ly8nIGlucHV0IC0iICJvbmVcbnR3byIgXAorCSJvbmVcbnR3byIgIiIKK3Rlc3QgeCIkU0tJUF9LTk9XTl9CVUdTIiA9IHgiIiAmJiB7Cit0ZXN0aW5nICJzZWQgYXBwZW5kIGF1dG9pbnNlcnRzIG5ld2xpbmUiICJzZWQgLWUgJy93b290L2Egd29vJyAtIiBcCisJIndvb3Rcbndvb1xuIiAiIiAid29vdCIKK30KK3Rlc3RpbmcgInNlZCBpbnNlcnQgZG9lc24ndCBhdXRvaW5zZXJ0IG5ld2xpbmUiICJzZWQgLWUgJy93b290L2kgd29vJyAtIiBcCisJIndvb1xud29vdCIgIiIgIndvb3QiCit0ZXN0aW5nICJzZWQgcHJpbnQgYXV0b2luc2VydCBuZXdsaW5lcyIgInNlZCAtZSAncCcgLSIgIm9uZVxub25lIiAiIiAib25lIgordGVzdGluZyAic2VkIHByaW50IGF1dG9pbnNlcnQgbmV3bGluZXMgdHdvIGZpbGVzIiAic2VkIC1lICdwJyBpbnB1dCAtIiBcCisJIm9uZVxub25lXG50d29cbnR3byIgIm9uZSIgInR3byIKK3Rlc3RpbmcgInNlZCBub3ByaW50LCBubyBtYXRjaCwgbm8gbmV3bGluZSIgInNlZCAtbmUgJ3Mvd29vL2JhbmcvJyBpbnB1dCIgXAorCSIiICJub1xuIiAiIgordGVzdGluZyAic2VkIHNlbGVjdGl2ZSBtYXRjaGVzIHdpdGggb25lIG5sIiAic2VkIC1uZSAncy93b28vYmFuZy9wJyBpbnB1dCAtIiBcCisJImEgYmFuZ1xuYyBiYW5nXG4iICJhIHdvb1xuYiBubyIgImMgd29vXG5kIG5vIgordGVzdGluZyAic2VkIHNlbGVjdGl2ZSBtYXRjaGVzIGluc2VydCBuZXdsaW5lIiBcCisJInNlZCAtbmUgJ3Mvd29vL2JhbmcvcCcgaW5wdXQgLSIgImEgYmFuZ1xuYiBiYW5nXG5kIGJhbmciIFwKKwkiYSB3b29cbmIgd29vIiAiYyBub1xuZCB3b28iCit0ZXN0aW5nICJzZWQgc2VsZWN0aXZlIG1hdGNoZXMgbm9pbnNlcnQgbmV3bGluZSIgXAorCSJzZWQgLW5lICdzL3dvby9iYW5nL3AnIGlucHV0IC0iICJhIGJhbmdcbmIgYmFuZyIgImEgd29vXG5iIHdvbyIgXAorCSJjIG5vXG5kIG5vIgordGVzdGluZyAic2VkIGNsdXN0ZXJuZXdsaW5lIiBcCisJInNlZCAtZSAnL29uZS9hIDExMScgLWUgJy90d28vaSAyMjInIC1lIHAgaW5wdXQgLSIgXAorCSJvbmVcbm9uZVxuMTExXG4yMjJcbnR3b1xudHdvIiAib25lIiAidHdvIgordGVzdGluZyAic2VkIHN1YnN0K3dyaXRlIiBcCisJInNlZCAtZSAncy9pL3ovJyAtZSAnd291dHB1dHcnIGlucHV0IC07ICRFQ0hPIC1uIFg7IGNhdCBvdXRwdXR3IiBcCisJInRoem5neVxuYWdhem5YdGh6bmd5XG5hZ2F6biIgInRoaW5neSIgImFnYWluIgorcm0gb3V0cHV0dwordGVzdGluZyAic2VkIHRyYWlsaW5nIE5VTCIgXAorCSJzZWQgJ3MvaS96LycgaW5wdXQgLSIgXAorCSJhXDBiXDBcbmMiICJhXDBiXDAiICJjIgordGVzdGluZyAic2VkIGVzY2FwZWQgbmV3bGluZSBpbiBjb21tYW5kIiBcCisJInNlZCAncy9hL3pcXAorei8nIGlucHV0IiBcCisJInpcbnoiICJhIiAiIgorCisjIFRlc3QgZW5kLW9mLWZpbGUgbWF0Y2hpbmcgYmVoYXZpb3IKKwordGVzdGluZyAic2VkIG1hdGNoIEVPRiIgInNlZCAtZSAnIickcCciJyIgImhlbGxvXG50aGVyZVxudGhlcmUiICIiIFwKKwkiaGVsbG9cbnRoZXJlIgordGVzdGluZyAic2VkIG1hdGNoIEVPRiB0d28gZmlsZXMiICJzZWQgLWUgJyInJHAnIicgaW5wdXQgLSIgXAorCSJvbmVcbnR3b1xudGhyZWVcbmZvdXJcbmZvdXIiICJvbmVcbnR3byIgInRocmVlXG5mb3VyIgorIyBzZWQgbWF0Y2ggRU9GIGlubGluZTogZ251IHNlZCA0LjEuNSBvdXRwdXRzIHRoaXM6CisjMDAwMDAwMDAgIDZmIDZlIDY1IDBhIDZmIDZmIDZiIDBhICA2ZiA2ZiA2YiAwYSA3NCA3NyA2ZiAwYSAgfG9uZS5vb2sub29rLnR3by58CisjMDAwMDAwMTAgIDBhIDc0IDY4IDcyIDY1IDY1IDBhIDZmICA2ZiA2YiAwYSA2ZiA2ZiA2YiAwYSA2NiAgfC50aHJlZS5vb2sub29rLmZ8CisjMDAwMDAwMjAgIDZmIDc1IDcyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfG91cnwKKyMgd2hpY2ggbG9va3MgYnVnZ3kgdG8gbWUuCiskRUNITyAtbmUgInRocmVlXG5mb3VyIiA+IGlucHV0MgordGVzdGluZyAic2VkIG1hdGNoIEVPRiBpbmxpbmUiIFwKKwkic2VkIC1lICciJyRpIG9vayciJyAtaSBpbnB1dCBpbnB1dDIgJiYgY2F0IGlucHV0IGlucHV0MiIgXAorCSJvbmVcbm9va1xudHdvdGhyZWVcbm9va1xuZm91ciIgIm9uZVxudHdvIiAiIgorcm0gaW5wdXQyCisKKyMgVGVzdCBsaWUtdG8tYXV0b2NvbmYKKwordGVzdGluZyAic2VkIGxpZS10by1hdXRvY29uZiIgInNlZCAtLXZlcnNpb24gfCBncmVwIC1vICdHTlUgc2VkIHZlcnNpb24gJyIgXAorCSJHTlUgc2VkIHZlcnNpb24gXG4iICIiICIiCisKKyMgSnVtcCB0byBub25leGlzdGVudCBsYWJlbAordGVzdCB4IiRTS0lQX0tOT1dOX0JVR1MiID0geCIiICYmIHsKKyMgSW5jb21wYXRpYmlsaXR5OiBpbGxlZ2FsIGp1bXAgaXMgbm90IGRldGVjdGVkIGlmIGlucHV0IGlzICIiCisjICh0aGF0IGlzLCBubyBsaW5lcyBhdCBhbGwpLiBHTlUgc2VkIDQuMS41IGNvbXBsYWlucyBldmVuIGluIHRoaXMgY2FzZQordGVzdGluZyAic2VkIG5vbmV4aXN0ZW50IGxhYmVsIiAic2VkIC1lICdiIHdhbHJ1cycgMj4vZGV2L251bGwgfHwgZWNobyB5ZXMiIFwKKwkieWVzXG4iICIiICIiCit9CisKK3Rlc3RpbmcgInNlZCBiYWNrcmVmIGZyb20gZW1wdHkgcyB1c2VzIHJhbmdlIHJlZ2V4IiBcCisJInNlZCAtZSAnL3dvb3Qvcy8vZWVwIFwwIGVlcC8nIiAiZWVwIHdvb3QgZWVwIiAiIiAid29vdCIKKwordGVzdGluZyAic2VkIGJhY2tyZWYgZnJvbSBlbXB0eSBzIHVzZXMgcmFuZ2UgcmVnZXggd2l0aCBuZXdsaW5lIiBcCisJInNlZCAtZSAnL3dvb3Qvcy8vZWVwIFwwIGVlcC8nIiAiZWVwIHdvb3QgZWVwXG4iICIiICJ3b290XG4iCisKKyMgLWkgd2l0aCBubyBmaWxlbmFtZQorCit0b3VjaCAuLy0gICMgRGV0ZWN0IGdudSBmYWlsdXJlIG1vZGUgaGVyZS4KK3Rlc3RpbmcgInNlZCAtaSB3aXRoIG5vIGFyZyBbR05VRkFJTF0iICJzZWQgLWUgJycgLWkgMj4gL2Rldi9udWxsIHx8IGVjaG8geWVzIiBcCisJInllc1xuIiAiIiAiIgorcm0gLi8tICAgICAjIENsZWFuIHVwCisKK3Rlc3RpbmcgInNlZCBzL3h4eC9bLyIgInNlZCAtZSAncy94eHgvWy8nIiAiW1xuIiAiIiAieHh4XG4iCisKKyMgUG9uZGVyIHRoaXMgYSBiaXQgbW9yZSwgd2h5ICJ3b28gbm90IGZvdW5kIiBmcm9tIGdudSB2ZXJzaW9uPworI3Rlc3RpbmcgInNlZCBkb2Vzbid0IHN1YnN0aXR1dGUgaW4gZGVsZXRlZCBsaW5lIiBcCisjCSJzZWQgLWUgJy9vb2svZDtzL29vay8vO3Qgd29vO2EgYmFuZzsnIiAiYmFuZyIgIiIgIm9va1xuIgorCisjIFRoaXMgbWFrZXMgYm90aCBzZWRzIHZlcnkgdW5oYXBweS4gIFdoeT8KKyN0ZXN0aW5nICJzZWQgLWcgKGV4aGF1c3RpdmUpIiAic2VkIC1lICdzL1tbOnNwYWNlOl1dKi8sL2cnIiAiLDEsMiwzLDQsNSwiIFwKKyMJIiIgIjEyMzQ1IgorCisjIHRlc3RpbmcgImRlc2NyaXB0aW9uIiAiY29tbWFuZHMiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKwordGVzdGluZyAic2VkIG4gY29tbWFuZCBtdXN0IHJlc2V0ICdzdWJzdGl0dXRlZCcgYml0IiBcCisJInNlZCAncy8xL3gvO1Q7bjs6IG5leHQ7cy8zL3kvO3QgcXVpdDtuO2IgbmV4dDs6IHF1aXQ7cSciIFwKKwkiMFxueFxuMlxueVxuIiAiIiAiMFxuMVxuMlxuM1xuIgorCit0ZXN0aW5nICJzZWQgZCBkb2VzIG5vdCBicmVhayBuLG0gbWF0Y2hpbmciIFwKKwkic2VkIC1uICcxZDsxLDNwJyIgXAorCSJzZWNvbmRcbnRoaXJkXG4iICIiICJmaXJzdFxuc2Vjb25kXG50aGlyZFxuZm91cnRoXG4iCisKK3Rlc3RpbmcgInNlZCBkIGRvZXMgbm90IGJyZWFrIG4scmVnZXggbWF0Y2hpbmciIFwKKwkic2VkIC1uICcxZDsxLC9oaXIvcCciIFwKKwkic2Vjb25kXG50aGlyZFxuIiAiIiAiZmlyc3RcbnNlY29uZFxudGhpcmRcbmZvdXJ0aFxuIgorCit0ZXN0aW5nICJzZWQgZCBkb2VzIG5vdCBicmVhayBuLHJlZ2V4IG1hdGNoaW5nICMyIiBcCisJInNlZCAtbiAnMSw1ZDsxLC9oaXIvcCciIFwKKwkic2Vjb25kMlxudGhpcmQyXG4iICIiIFwKKwkiZmlyc3RcbnNlY29uZFxudGhpcmRcbmZvdXJ0aFxuIiJmaXJzdDJcbnNlY29uZDJcbnRoaXJkMlxuZm91cnRoMlxuIgorCit0ZXN0aW5nICJzZWQgMmQ7MiwxcCAoZ251IGNvbXBhdCkiIFwKKwkic2VkIC1uICcyZDsyLDFwJyIgXAorCSJ0aGlyZFxuIiAiIiBcCisJImZpcnN0XG5zZWNvbmRcbnRoaXJkXG5mb3VydGhcbiIKKworIyBSZWdleCBtZWFuczogIm1hdGNoIC8gYXQgQk9MIG9yIG5vdGhpbmcsIHRoZW4gb25lIG9yIG1vcmUgbm90LXNsYXNoZXMiLgorIyBUaGUgYnVnIHdhcyB0aGF0IHNlY29uZCBzbGFzaCBpbiAvdXNyL2xpYiB3YXMgdHJlYXRlZCBhcyAiYXQgQk9MIiB0b28uCit0ZXN0aW5nICJzZWQgYmVnaW5uaW5nICheKSBtYXRjaGVzIG9ubHkgb25jZSIgXAorCSJzZWQgJ3MsXCheL1x8XClbXi9dW14vXSosPlwwPCxnJyIgXAorCSI+L3VzcjwvPmxpYjxcbiIgIiIgXAorCSIvdXNyL2xpYlxuIgorCit0ZXN0aW5nICJzZWQgYyIgXAorCSJzZWQgJ2NyZXBsJyIgXAorCSJyZXBsXG5yZXBsXG4iICIiIFwKKwkiZmlyc3RcbnNlY29uZFxuIgorCit0ZXN0aW5nICJzZWQgbmVzdGVkIHt9cyIgXAorCSJzZWQgJy9hc2QvIHsgcDsgL3MvIHsgcy9zL2MvIH07IHA7IHEgfSciIFwKKwkicXdlXG5hc2RcbmFjZFxuYWNkXG4iICIiIFwKKwkicXdlXG5hc2Rcbnp4Y1xuIgorCit0ZXN0aW5nICJzZWQgYSBjbWQgZW5kZWQgYnkgZG91YmxlIGJhY2tzbGFzaCIgXAorCSJzZWQgLWUgJy98IG9uZSAvYSBcXAorCXwgdGhyZWUgXFxcXCcgLWUgJy98IG9uZS0vYSBcXAorCXwgdGhyZWUtKiBcXFxcJyIgXAorJwl8IG9uZSBcXAorCXwgdGhyZWUgXFwKKwl8IHR3byBcXAorJyAnJyBcCisnCXwgb25lIFxcCisJfCB0d28gXFwKKycKKworIyBmaXJzdCB0aHJlZSBsaW5lcyBhcmUgZGVsZXRlZDsgNHRoIGxpbmUgaXMgbWF0Y2hlZCBhbmQgcHJpbnRlZCBieSAiMiwzIiBhbmQgYnkgIjQiIHJhbmdlcwordGVzdGluZyAic2VkIHdpdGggTiBza2lwcGluZyBsaW5lcyBwYXN0IHJhbmdlcyBvbiBuZXh0IGNtZHMiIFwKKwkic2VkIC1uICcxe047TjtkfTsxcDsyLDNwOzNwOzRwJyIgXAorCSI0XG40XG4iICIiICIxXG4yXG4zXG40XG4iCisKK3Rlc3RpbmcgInNlZCAtaSB3aXRoIGFkZHJlc3MgbW9kaWZpZXMgYWxsIGZpbGVzLCBub3Qgb25seSBmaXJzdCIgXAorCSJjcCBpbnB1dCBpbnB1dDI7IHNlZCAtaSAtZSAnMXMvZm9vL2Jhci8nIGlucHV0IGlucHV0MiAmJiBjYXQgaW5wdXQgaW5wdXQyOyBybSBpbnB1dDIiIFwKKwkiYmFyXG5iYXJcbiIgImZvb1xuIiAiIgorCit0ZXN0aW5nICJzZWQgdW5kZXJzdGFuZHMgXHIiIFwKKwkic2VkICdzL3IvXHIvJyIgXAorCSJccnJyXG4iICIiICJycnJcbiIKKwordGVzdGluZyAic2VkIC1pIGZpbmlzaGVzIHJhbmdlcyBjb3JyZWN0bHkiIFwKKwkic2VkICcxLDJkJyAtaSBpbnB1dDsgZWNobyBcJD87IGNhdCBpbnB1dCIgXAorCSIwXG4zXG40XG4iICIxXG4yXG4zXG40XG4iICIiCisKK3Rlc3RpbmcgInNlZCB6ZXJvIGNoYXJzIG1hdGNoL3JlcGxhY2UgYWR2YW5jZXMgY29ycmVjdGx5IDEiIFwKKwkic2VkICdzL2wqL0AvZyciIFwKKwkiQGhAZUBvQFxuIiAiIiAiaGVsbGxvXG4iCisKK3Rlc3RpbmcgInNlZCB6ZXJvIGNoYXJzIG1hdGNoL3JlcGxhY2UgYWR2YW5jZXMgY29ycmVjdGx5IDIiIFwKKwkic2VkICdzIFteIC5dKiB4IGcnIiBcCisJInggeC54XG4iICIiICIgYS5iXG4iCisKK3Rlc3RpbmcgInNlZCB6ZXJvIGNoYXJzIG1hdGNoL3JlcGxhY2UgbG9naWMgbXVzdCBub3QgZmFsc2VseSB0cmlnZ2VyIGhlcmUgMSIgXAorCSJzZWQgJ3MvYS9BL2cnIiBcCisJIl9BQUExQUFcbiIgIiIgIl9hYWExYWFcbiIKKwordGVzdGluZyAic2VkIHplcm8gY2hhcnMgbWF0Y2gvcmVwbGFjZSBsb2dpYyBtdXN0IG5vdCBmYWxzZWx5IHRyaWdnZXIgaGVyZSAyIiBcCisJInNlZCAncy8gKiQvXy9nJyIgXAorCSJxd2VydHlfXG4iICIiICJxd2VydHlcbiIKKwordGVzdGluZyAic2VkIC9cJF9pbl9yZWdleC8gc2hvdWxkIG5vdCBtYXRjaCBuZXdsaW5lcywgb25seSBlbmQtb2YtbGluZSIgXAorCSJzZWQgJzogdGVzdGNvbnQ7IC9cXFxcJC97ID07IE47IGIgdGVzdGNvbnQgfSciIFwKKwkiXAordGhpcyBpcyBhIHJlZ3VsYXIgbGluZQorMgorbGluZSB3aXRoIFxcCitjb250aW51YXRpb24KK21vcmUgcmVndWxhciBsaW5lcworNQorbGluZSB3aXRoIFxcCitjb250aW51YXRpb24KKyIgXAorCSIiICJcCit0aGlzIGlzIGEgcmVndWxhciBsaW5lCitsaW5lIHdpdGggXFwKK2NvbnRpbnVhdGlvbgorbW9yZSByZWd1bGFyIGxpbmVzCitsaW5lIHdpdGggXFwKK2NvbnRpbnVhdGlvbgorIgorCit0ZXN0aW5nICJzZWQgcy8vL05VTSB0ZXN0IiBcCisJInNlZCAtZSAncy9hL2IvMjsgcy9hL2MvZyciIFwKKwkiY2JcbiIgIiIgImFhXG4iCisKK3Rlc3RpbmcgInNlZCAvcmVnZXgvLE57Li4ufSBhZGRyZXNzZXMgd29yayIgXAorCSJzZWQgL14yLywye2R9IiBcCisJIjFcbjNcbjRcbjVcbiIgXAorCSIiIFwKKwkiMVxuMlxuM1xuNFxuNVxuIgorCit0ZXN0aW5nICJzZWQgL3JlZ2V4LywrTnsuLi59IGFkZHJlc3NlcyB3b3JrIiBcCisJInNlZCAvXjIvLCsye2R9IiBcCisJIjFcbjVcbiIgXAorCSIiIFwKKwkiMVxuMlxuM1xuNFxuNVxuIgorCit0ZXN0aW5nICJzZWQgL3JlZ2V4LywrTnsuLi59IC1pIHdvcmtzIiBcCisJImNhdCAtID5pbnB1dDI7IHNlZCAvXjQvLCsye2R9IC1pIGlucHV0IGlucHV0MjsgZWNobyBcJD87IGNhdCBpbnB1dCBpbnB1dDI7IHJtIGlucHV0MiIgXAorCSIwXG4iIjFcbjJcbjNcbjdcbjhcbiIiMVxuMlxuN1xuOFxuIiBcCisJIjFcbjJcbjNcbjRcbjVcbjZcbjdcbjhcbiIgXAorCSIxXG4yXG40XG41XG42XG43XG44XG4iIFwKKworIyBHTlUgc2VkIDQuMi4xIHdvdWxkIGFsc28gYWNjZXB0ICIvXjQvLCt7ZH0iIHdpdGggdGhlIHNhbWUgbWVhbmluZywgd2UgZG9uJ3QKK3Rlc3RpbmcgInNlZCAvcmVnZXgvLCswey4uLn0gLWkgd29ya3MiIFwKKwkiY2F0IC0gPmlucHV0Mjsgc2VkIC9eNC8sKzB7ZH0gLWkgaW5wdXQgaW5wdXQyOyBlY2hvIFwkPzsgY2F0IGlucHV0IGlucHV0Mjsgcm0gaW5wdXQyIiBcCisJIjBcbiIiMVxuMlxuM1xuNVxuNlxuN1xuOFxuIiIxXG4yXG41XG42XG43XG44XG4iIFwKKwkiMVxuMlxuM1xuNFxuNVxuNlxuN1xuOFxuIiBcCisJIjFcbjJcbjRcbjVcbjZcbjdcbjhcbiIgXAorCisjIEdOVSBzZWQgNC4yLjEgd291bGQgYWxzbyBhY2NlcHQgIi9eNC8sK2QiIHdpdGggdGhlIHNhbWUgbWVhbmluZywgd2UgZG9uJ3QKK3Rlc3RpbmcgInNlZCAvcmVnZXgvLCswPGNtZD4gLWkgd29ya3MiIFwKKwkiY2F0IC0gPmlucHV0Mjsgc2VkIC9eNC8sKzBkIC1pIGlucHV0IGlucHV0MjsgZWNobyBcJD87IGNhdCBpbnB1dCBpbnB1dDI7IHJtIGlucHV0MiIgXAorCSIwXG4iIjFcbjJcbjNcbjVcbjZcbjdcbjhcbiIiMVxuMlxuNVxuNlxuN1xuOFxuIiBcCisJIjFcbjJcbjNcbjRcbjVcbjZcbjdcbjhcbiIgXAorCSIxXG4yXG40XG41XG42XG43XG44XG4iIFwKKworIyB0ZXN0aW5nICJkZXNjcmlwdGlvbiIgImNvbW1hbmRzIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3NlcS50ZXN0cyBiL3Rlc3RzdWl0ZS9zZXEudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWUxMTE2YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9zZXEudGVzdHMKQEAgLTAsMCArMSw0NiBAQAorIyEvYmluL3NoCisKKyMgU1VTdjMgY29tcGxpYW50IHNlcSB0ZXN0cy4KKyMgQ29weXJpZ2h0IDIwMDYgYnkgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworIyBBVURJVDogRnVsbCBTVVN2MyBjb3ZlcmFnZSAoZXhjZXB0IGludGVybmF0aW9uYWxpemF0aW9uKS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJvcHRpb25zIiAiZXhwZWN0ZWQgcmVzdWx0IiAiZmlsZSBpbnB1dCIgInN0ZGluIgorIyAgIGZpbGUgaW5wdXQgd2lsbCBiZSBmaWxlIGNhbGxlZCAiaW5wdXQiCisjICAgdGVzdCBjYW4gY3JlYXRlIGEgZmlsZSAiYWN0dWFsIiBpbnN0ZWFkIG9mIHdyaXRpbmcgdG8gc3Rkb3V0CisKKyMgVGVzdCBleGl0IHN0YXR1cworCit0ZXN0aW5nICJzZXEgKGV4aXQgd2l0aCBlcnJvcikiICJzZXEgMj4gL2Rldi9udWxsIHx8IGVjaG8geWVzIiAieWVzXG4iICIiICIiCit0ZXN0aW5nICJzZXEgKGV4aXQgd2l0aCBlcnJvcikiICJzZXEgMSAyIDMgNCAyPiAvZGV2L251bGwgfHwgZWNobyB5ZXMiIFwKKwkieWVzXG4iICIiICIiCit0ZXN0aW5nICJzZXEgb25lIGFyZ3VtZW50IiAic2VxIDMiICIxXG4yXG4zXG4iICIiICIiCit0ZXN0aW5nICJzZXEgdHdvIGFyZ3VtZW50cyIgInNlcSA1IDciICI1XG42XG43XG4iICIiICIiCit0ZXN0aW5nICJzZXEgdHdvIGFyZ3VtZW50cyByZXZlcnNlZCIgInNlcSA3IDUiICIiICIiICIiCit0ZXN0aW5nICJzZXEgdHdvIGFyZ3VtZW50cyBlcXVhbCIgInNlcSAzIDMiICIzXG4iICIiICIiCit0ZXN0aW5nICJzZXEgdHdvIGFyZ3VtZW50cyBlcXVhbCwgYXJiaXRyYXJ5IG5lZ2F0aXZlIHN0ZXAiICJzZXEgMSAtMTUgMSIgXAorCSIxXG4iICIiICIiCit0ZXN0aW5nICJzZXEgdHdvIGFyZ3VtZW50cyBlcXVhbCwgYXJiaXRyYXJ5IHBvc2l0aXZlIHN0ZXAiICJzZXEgMSArMTUgMSIgXAorCSIxXG4iICIiICIiCit0ZXN0aW5nICJzZXEgY291bnQgdXAgYnkgMiIgInNlcSA0IDIgOCIgIjRcbjZcbjhcbiIgIiIgIiIKK3Rlc3RpbmcgInNlcSBjb3VudCBkb3duIGJ5IDIiICJzZXEgOCAtMiA0IiAiOFxuNlxuNFxuIiAiIiAiIgordGVzdGluZyAic2VxIGNvdW50IHdyb25nIHdheSAjMSIgInNlcSA0IC0yIDgiICIiICIiICIiCit0ZXN0aW5nICJzZXEgY291bnQgd3Jvbmcgd2F5ICMyIiAic2VxIDggMiA0IiAiIiAiIiAiIgordGVzdGluZyAic2VxIGNvdW50IGJ5IC4zIiAic2VxIDMgLjMgNCIgIjMuMFxuMy4zXG4zLjZcbjMuOVxuIiAiIiAiIgordGVzdGluZyAic2VxIGNvdW50IGJ5IC4zMCIgInNlcSAzIC4zMCA0IiAiMy4wMFxuMy4zMFxuMy42MFxuMy45MFxuIiAiIiAiIgordGVzdGluZyAic2VxIGNvdW50IGJ5IC4zMCB0byA0LjAwMCIgInNlcSAzIC4zMCA0LjAwMCIgIjMuMDBcbjMuMzBcbjMuNjBcbjMuOTBcbiIgIiIgIiIKK3Rlc3RpbmcgInNlcSBjb3VudCBieSAtLjkiICJzZXEgLjcgLS45IC0yLjIiICIwLjdcbi0wLjJcbi0xLjFcbi0yLjBcbiIgIiIgIiIKK3Rlc3RpbmcgInNlcSBjb3VudCBieSB6ZXJvIiAic2VxIDQgMCA4IHwgaGVhZCAtbiAxMCIgIjRcbjRcbjRcbjRcbjRcbjRcbjRcbjRcbjRcbjRcbiIgIiIgIiIKKwordGVzdGluZyAic2VxIG9uZSBhcmd1bWVudCB3aXRoIHBhZGRpbmciICJzZXEgLXcgMDAzIiAiMDAxXG4wMDJcbjAwM1xuIiAiIiAiIgordGVzdGluZyAic2VxIHR3byBhcmd1bWVudHMgd2l0aCBwYWRkaW5nIiAic2VxIC13IDAwNSA3IiAiMDA1XG4wMDZcbjAwN1xuIiAiIiAiIgordGVzdGluZyAic2VxIGNvdW50IGRvd24gYnkgMyB3aXRoIHBhZGRpbmciICJzZXEgLXcgOCAtMyAwNCIgIjA4XG4wNVxuIiAiIiAiIgorIyBMb29rcyBsaWtlIGEgYnVnIGluIGNvcmV1dGlscyA2LjEwOiBpdCB1c2VzIHdpZHRoIG9uZSBsZXNzIHRoYW4gbmVlZGVkCisjIFRoZXNlIHRlc3RzIGNvbnRhaW4gdGhlIGV4cGVjdGVkICJmaXhlZCIgb3V0cHV0Cit0ZXN0aW5nICJzZXEgY291bnQgYnkgLjMgd2l0aCBwYWRkaW5nIDEiICJzZXEgLXcgMDkgLjMgMTEiICIwOS4wXG4wOS4zXG4wOS42XG4wOS45XG4xMC4yXG4xMC41XG4xMC44XG4iICIiICIiCit0ZXN0aW5nICJzZXEgY291bnQgYnkgLjMgd2l0aCBwYWRkaW5nIDIiICJzZXEgLXcgMDMgLjMgMDAwNCIgIjAwMDMuMFxuMDAwMy4zXG4wMDAzLjZcbjAwMDMuOVxuIiAiIiAiIgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9zaGExc3VtLnRlc3RzIGIvdGVzdHN1aXRlL3NoYTFzdW0udGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTk2OGZhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9zaGExc3VtLnRlc3RzCkBAIC0wLDAgKzEsMyBAQAorIyEvYmluL3NoCisKKy4gLi9tZDVzdW0udGVzdHMgc2hhMXN1bSBkNDEzMzdlODM0Mzc3MTQwYWU3Zjk4NDYwZDcxZDkwODU5OGVmMDRmCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvc2hhMjU2c3VtLnRlc3RzIGIvdGVzdHN1aXRlL3NoYTI1NnN1bS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMmRkNzhmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3NoYTI1NnN1bS50ZXN0cwpAQCAtMCwwICsxLDMgQEAKKyMhL2Jpbi9zaAorCisuIC4vbWQ1c3VtLnRlc3RzIHNoYTI1NnN1bSA4ZTFkM2VkNTdlYmMxMzBmMGY3MjUwODQ0NjU1OWVlYWUwNjQ1MWFlNmQ2MWIxZThjZTQ2MzcwY2ZiODk2M2MzCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvc2hhM3N1bS50ZXN0cyBiL3Rlc3RzdWl0ZS9zaGEzc3VtLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjgyZmFkYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvc2hhM3N1bS50ZXN0cwpAQCAtMCwwICsxLDMgQEAKKyMhL2Jpbi9zaAorCisuIC4vbWQ1c3VtLnRlc3RzIHNoYTNzdW0gYzI5ZDc3YmM1NDhmYTJiMjBhMDRjODYxNDAwYTUzNjA4NzljNTIxNTZlMmE1NGEzNDE1Yjk5YTlhMzEyM2UxZDVmMzY3MTRhMjRlY2E4YzFmMDVhOGUyZDhiYTg1OWM5MzBkNDExNDFmNjRhMjU1YzY3OTQ0MzZmYzk5YzQ4NmEKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9zaGE1MTJzdW0udGVzdHMgYi90ZXN0c3VpdGUvc2hhNTEyc3VtLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjNiYzdjYWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvc2hhNTEyc3VtLnRlc3RzCkBAIC0wLDAgKzEsMyBAQAorIyEvYmluL3NoCisKKy4gLi9tZDVzdW0udGVzdHMgc2hhNTEyc3VtIGZlNDEzZTBmMTc3MzI0ZDEzNTM4OTNjYTA3NzJjZWJhODNmZDQxNTEyYmE2Mzg5NWEwZWViYjcwM2VmOWZlYWMyZmI0ZTkyYjJjYjQzMGIzYmRhNDFiNDZiMGNiNGVhODMwNzE5MGE1Y2M3OTUxNTdjZmI2ODBhOWNkNjM1ZDBmCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvc29ydC50ZXN0cyBiL3Rlc3RzdWl0ZS9zb3J0LnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM5YzdhZjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvc29ydC50ZXN0cwpAQCAtMCwwICsxLDE3MiBAQAorIyEvYmluL3NoCisKKyMgU1VTdjMgY29tcGxpYW50IHNvcnQgdGVzdHMuCisjIENvcHlyaWdodCAyMDA1IGJ5IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgVGhlIGJhc2ljIHRlc3RzLiAgVGhlc2Ugc2hvdWxkIHdvcmsgZXZlbiB3aXRoIHRoZSBzbWFsbCBidXN5Ym94LgorCit0ZXN0aW5nICJzb3J0IiAic29ydCBpbnB1dCIgImFcbmJcbmNcbiIgImNcbmFcbmJcbiIgIiIKK3Rlc3RpbmcgInNvcnQgIzIiICJzb3J0IGlucHV0IiAiMDEwXG4xXG4zXG4iICIzXG4xXG4wMTBcbiIgIiIKK3Rlc3RpbmcgInNvcnQgc3RkaW4iICJzb3J0IiAiYVxuYlxuY1xuIiAiIiAiYlxuYVxuY1xuIgordGVzdGluZyAic29ydCBudW1lcmljIiAic29ydCAtbiBpbnB1dCIgIjFcbjNcbjAxMFxuIiAiM1xuMVxuMDEwXG4iICIiCit0ZXN0aW5nICJzb3J0IHJldmVyc2UiICJzb3J0IC1yIGlucHV0IiAid29va1xud2FscnVzXG5wb2ludFxucGFic3RcbmFhcmdoXG4iIFwKKwkicG9pbnRcbndvb2tcbnBhYnN0XG5hYXJnaFxud2FscnVzXG4iICIiCisKKyMgVGhlc2UgdGVzdHMgcmVxdWlyZSB0aGUgZnVsbCBvcHRpb24gc2V0LgorCitvcHRpb25hbCBGRUFUVVJFX1NPUlRfQklHCisjIExvbmdpc2ggY2h1bmsgb2YgZGF0YSByZS11c2VkIGJ5IHRoZSBuZXh0IGZldyB0ZXN0cworCitkYXRhPSI0MgkxCTMJd29vdAorNDIJMQkwMTAJem9vbG9neQorZWdnCTEJMglwYXB5cnVzCis3CTMJNDIJc291cAorOTk5CTMJMAlhbGdlYnJhCisiCisKKyMgdGVzdGluZyAiZGVzY3JpcHRpb24iICJjb21tYW5kKHMpIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKKyMgU29ydGluZyB3aXRoIGtleXMKKwordGVzdGluZyAic29ydCBvbmUga2V5IiAic29ydCAtazQsNCBpbnB1dCIgXAorIjk5OQkzCTAJYWxnZWJyYQorZWdnCTEJMglwYXB5cnVzCis3CTMJNDIJc291cAorNDIJMQkzCXdvb3QKKzQyCTEJMDEwCXpvb2xvZ3kKKyIgIiRkYXRhIiAiIgorCit0ZXN0aW5nICJzb3J0IGtleSByYW5nZSB3aXRoIG51bWVyaWMgb3B0aW9uIiAic29ydCAtazIsM24gaW5wdXQiIFwKKyI0MgkxCTAxMAl6b29sb2d5Cis0MgkxCTMJd29vdAorZWdnCTEJMglwYXB5cnVzCis3CTMJNDIJc291cAorOTk5CTMJMAlhbGdlYnJhCisiICIkZGF0YSIgIiIKKwordGVzdGluZyAic29ydCBrZXkgcmFuZ2Ugd2l0aCBudW1lcmljIG9wdGlvbiBhbmQgZ2xvYmFsIHJldmVyc2UiIFwKKyJzb3J0IC1rMiwzbiAtciBpbnB1dCIgXAorImVnZwkxCTIJcGFweXJ1cworNDIJMQkzCXdvb3QKKzQyCTEJMDEwCXpvb2xvZ3kKKzk5OQkzCTAJYWxnZWJyYQorNwkzCTQyCXNvdXAKKyIgIiRkYXRhIiAiIgorCit0ZXN0aW5nICJzb3J0IGtleSByYW5nZSB3aXRoIG11bHRpcGxlIG9wdGlvbnMiICJzb3J0IC1rMiwzcm4gaW5wdXQiIFwKKyI3CTMJNDIJc291cAorOTk5CTMJMAlhbGdlYnJhCis0MgkxCTAxMAl6b29sb2d5Cis0MgkxCTMJd29vdAorZWdnCTEJMglwYXB5cnVzCisiICIkZGF0YSIgIiIKKwordGVzdGluZyAic29ydCBrZXkgcmFuZ2Ugd2l0aCB0d28gLWsgb3B0aW9ucyIgInNvcnQgLWsgMiwybiAtayAxLDFyIGlucHV0IiAiXAorZCAyCitiIDIKK2MgMworIiAiXAorYyAzCitiIDIKK2QgMgorIiAiIgorCit0ZXN0aW5nICJzb3J0IHdpdGggbm9uLWRlZmF1bHQgbGVhZGluZyBkZWxpbSAxIiAic29ydCAtbiAtazIgLXQvIGlucHV0IiAiXAorL2EvMgorL2IvMQorIiAiXAorL2EvMgorL2IvMQorIiAiIgorCit0ZXN0aW5nICJzb3J0IHdpdGggbm9uLWRlZmF1bHQgbGVhZGluZyBkZWxpbSAyIiAic29ydCAtbiAtazMgLXQvIGlucHV0IiAiXAorL2IvMQorL2EvMgorIiAiXAorL2IvMQorL2EvMgorIiAiIgorCit0ZXN0aW5nICJzb3J0IHdpdGggbm9uLWRlZmF1bHQgbGVhZGluZyBkZWxpbSAzIiAic29ydCAtbiAtazMgLXQvIGlucHV0IiAiXAorLy9hLzIKKy8vYi8xCisiICJcCisvL2EvMgorLy9iLzEKKyIgIiIKKwordGVzdGluZyAic29ydCB3aXRoIG5vbi1kZWZhdWx0IGxlYWRpbmcgZGVsaW0gNCIgInNvcnQgLXQ6IC1rMSwxIGlucHV0IiAiXAorYTpiCithL2E6YQorIiAiXAorYS9hOmEKK2E6YgorIiAiIgorCit0ZXN0aW5nICJnbGliYyBidWlsZCBzb3J0IiAic29ydCAtdC4gLWsgMSwxIC1rIDJuLDJuIC1rIDMgaW5wdXQiICJcCitHTElCQ18yLjEKK0dMSUJDXzIuMS4xCitHTElCQ18yLjIKK0dMSUJDXzIuMi4xCitHTElCQ18yLjEwCitHTElCQ18yLjIwCitHTElCQ18yLjIxCisiICJcCitHTElCQ18yLjIxCitHTElCQ18yLjEuMQorR0xJQkNfMi4yLjEKK0dMSUJDXzIuMgorR0xJQkNfMi4yMAorR0xJQkNfMi4xMAorR0xJQkNfMi4xCisiICIiCisKK3Rlc3RpbmcgImdsaWJjIGJ1aWxkIHNvcnQgdW5pcXVlIiAic29ydCAtdSAtdC4gLWsgMSwxIC1rIDJuLDJuIC1rIDMgaW5wdXQiICJcCitHTElCQ18yLjEKK0dMSUJDXzIuMS4xCitHTElCQ18yLjIKK0dMSUJDXzIuMi4xCitHTElCQ18yLjEwCitHTElCQ18yLjIwCitHTElCQ18yLjIxCisiICJcCitHTElCQ18yLjEwCitHTElCQ18yLjIuMQorR0xJQkNfMi4xLjEKK0dMSUJDXzIuMjAKK0dMSUJDXzIuMgorR0xJQkNfMi4xCitHTElCQ18yLjIxCisiICIiCisKK3Rlc3RpbmcgInNvcnQgLXUgc2hvdWxkIGNvbnNpZGVyIGZpZWxkIG9ubHkgd2hlbiBkaXNjYXJkaW5nIiAic29ydCAtdSAtazIgaW5wdXQiICJcCithIGMKKyIgIlwKK2EgYworYiBjCisiICIiCisKK3Rlc3RpbmcgInNvcnQgLXogb3V0cHV0cyBOVUwgdGVybWluYXRlZCBsaW5lcyIgInNvcnQgLXogaW5wdXQiICJcCitvbmVcMHRocmVlXDB0d29cMFwKKyIgIlwKK29uZVwwdHdvXDB0aHJlZVwwXAorIiAiIgorCit0ZXN0aW5nICJzb3J0IGtleSBkb2Vzbid0IHN0cmlwIGxlYWRpbmcgYmxhbmtzLCBkaXNhYmxlcyBmYWxsYmFjayBnbG9iYWwgc29ydCIgXAorInNvcnQgLW4gLWsyIC10ICcgJyIgIiBhIFxuIDEgXG4gMiBcbiIgIiIgIiAyIFxuIDEgXG4gYSBcbiIKKwordGVzdGluZyAic29ydCBmaWxlIGluIHBsYWNlIiBcCisic29ydCAtbyBpbnB1dCBpbnB1dCAmJiBjYXQgaW5wdXQiICJcCisxMTEKKzIyMgorIiAiXAorMjIyCisxMTEKKyIgIiIKKworIyB0ZXN0aW5nICJkZXNjcmlwdGlvbiIgImNvbW1hbmQocykiICJyZXN1bHQiICJpbmZpbGUiICJzdGRpbiIKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvc3RhcnQtc3RvcC1kYWVtb24udGVzdHMgYi90ZXN0c3VpdGUvc3RhcnQtc3RvcC1kYWVtb24udGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDA3YWVlZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS9zdGFydC1zdG9wLWRhZW1vbi50ZXN0cwpAQCAtMCwwICsxLDE5IEBACisjIS9iaW4vc2gKKyMgQ29weXJpZ2h0IDIwMDggYnkgRGVueXMgVmxhc2Vua28KKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJjbWQiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKK3Rlc3RpbmcgInN0YXJ0LXN0b3AtZGFlbW9uIC14IHdpdGhvdXQgLWEiIFwKKwknc3RhcnQtc3RvcC1kYWVtb24gLVMgLXggdHJ1ZSAyPiYxOyBlY2hvICQ/JyBcCisJIjBcbiIgXAorCSIiICIiCisKK3Rlc3RpbmcgInN0YXJ0LXN0b3AtZGFlbW9uIC1hIHdpdGhvdXQgLXgiIFwKKwknc3RhcnQtc3RvcC1kYWVtb24gLVMgLWEgZmFsc2UgMj4mMTsgZWNobyAkPycgXAorCSIxXG4iIFwKKwkiIiAiIgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9zdHJpbmdzL3N0cmluZ3Mtd29ya3MtbGlrZS1HTlUgYi90ZXN0c3VpdGUvc3RyaW5ncy9zdHJpbmdzLXdvcmtzLWxpa2UtR05VCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNjQ3MTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvc3RyaW5ncy9zdHJpbmdzLXdvcmtzLWxpa2UtR05VCkBAIC0wLDAgKzEsOSBAQAorcm0gLWYgZm9vIGJhcgorc3RyaW5ncyAtYWYgLi4vLi4vYnVzeWJveCA+IGZvbworYnVzeWJveCBzdHJpbmdzIC1hZiAuLi8uLi9idXN5Ym94ID4gYmFyCitzZXQgK2UKK3Rlc3QgISAtZiBmb28gLWEgLWYgYmFyCitpZiBbICQ/ID0gMCBdIDsgdGhlbgorCXNldCAtZQorCWRpZmYgLXEgZm9vIGJhcgorZmkKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS9zdW0udGVzdHMgYi90ZXN0c3VpdGUvc3VtLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI5ZjRjYmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvc3VtLnRlc3RzCkBAIC0wLDAgKzEsMjQgQEAKKyMhL2Jpbi9zaAorCisjIHVuaXQgdGVzdCBmb3Igc3VtLgorIyBDb3B5cmlnaHQgMjAwNyBieSBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworIyBBVURJVDogVW5pdCB0ZXN0cyBmb3Igc3VtCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAib3B0aW9ucyIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKyMgICBmaWxlIGlucHV0IHdpbGwgYmUgZmlsZSBjYWxsZWQgImlucHV0IgorIyAgIHRlc3QgY2FuIGNyZWF0ZSBhIGZpbGUgImFjdHVhbCIgaW5zdGVhZCBvZiB3cml0aW5nIHRvIHN0ZG91dAorCit0ZXN0aW5nICJzdW0gLXIgZmlsZSBkb2Vzbid0IHByaW50IGZpbGUncyBuYW1lIiBcCisgICAgICAgICJzdW0gLXIgJDAgfCBncmVwIC1jICQwICYmIGVjaG8gd3JvbmdseV9wcmludGVkX2ZpbGVuYW1lIHx8IGVjaG8geWVzIiBcCisJIjBcbnllc1xuIiAiIiAiIgordGVzdGluZyAic3VtIC1yIGZpbGUgZmlsZSBkb2VzIHByaW50IGJvdGggbmFtZXMiIFwKKyAgICAgICAgInN1bSAtciAkMCAkMCB8IGdyZXAgLWMgJDAgJiYgZWNobyB5ZXMgfHwgZWNobyB3cm9uZ2x5X29taXR0ZWRfZmlsZW5hbWUiIFwKKwkiMlxueWVzXG4iICIiICIiCit0ZXN0aW5nICJzdW0gLXMgZmlsZSBkb2VzIHByaW50IGZpbGUncyBuYW1lIiBcCisgICAgICAgICJzdW0gLXMgJDAgfCBncmVwIC1jICQwICYmIGVjaG8geWVzIHx8IGVjaG8gd3JvbmdseV9vbWl0dGVkX2ZpbGVuYW1lIiBcCisJIjFcbnllc1xuIiAiIiAiIgorZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdGFpbC50ZXN0cyBiL3Rlc3RzdWl0ZS90YWlsLnRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjMwNWE4M2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvdGFpbC50ZXN0cwpAQCAtMCwwICsxLDI1IEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgMjAwOSBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmQiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisjICAgZmlsZSBpbnB1dCB3aWxsIGJlIGZpbGUgY2FsbGVkICJpbnB1dCIKKyMgICB0ZXN0IGNhbiBjcmVhdGUgYSBmaWxlICJhY3R1YWwiIGluc3RlYWQgb2Ygd3JpdGluZyB0byBzdGRvdXQKKwordGVzdGluZyAidGFpbDogK04gd2l0aCBOID4gZmlsZSBsZW5ndGgiIFwKKwkidGFpbCAtYyArNTUgMj4mMTsgZWNobyBcJD8iIFwKKwkiMFxuIiBcCisJIiIgInF3IgorCit0ZXN0aW5nICJ0YWlsOiAtYyArTiB3aXRoIGxhcmdpc2ggTiIgXAorCSIKKwlkZCBpZj0vZGV2L3plcm8gYnM9MTZrIGNvdW50PTEgMj4vZGV2L251bGwgfCB0YWlsIC1jICs4MjAwIHwgd2MgLWM7CisJZGQgaWY9L2Rldi96ZXJvIGJzPTE2ayBjb3VudD0xIDI+L2Rldi9udWxsIHwgdGFpbCAtYyArODIwOCB8IHdjIC1jOworCSIgXAorCSI4MTg1XG44MTc3XG4iIFwKKwkiIiAiIgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90YWlsL3RhaWwtbi13b3JrcyBiL3Rlc3RzdWl0ZS90YWlsL3RhaWwtbi13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTEzMTlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3RhaWwvdGFpbC1uLXdvcmtzCkBAIC0wLDAgKzEsNCBAQAorJEVDSE8gLW5lICJhYmNcbmRlZlxuMTIzXG4iID5pbnB1dAorJEVDSE8gLW5lICJkZWZcbjEyM1xuIiA+bG9nZmlsZS5vaworYnVzeWJveCB0YWlsIC1uIDIgaW5wdXQgPiBsb2dmaWxlLmJiCitjbXAgbG9nZmlsZS5vayBsb2dmaWxlLmJiCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdGFpbC90YWlsLXdvcmtzIGIvdGVzdHN1aXRlL3RhaWwvdGFpbC13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGVjYTEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3RhaWwvdGFpbC13b3JrcwpAQCAtMCwwICsxLDYgQEAKKyMgRkVBVFVSRTogQ09ORklHX0lOQ0xVREVfU1VTdjIKKworJEVDSE8gLW5lICJhYmNcbmRlZlxuMTIzXG4iID5pbnB1dAorJEVDSE8gLW5lICJkZWZcbjEyM1xuIiA+bG9nZmlsZS5vaworYnVzeWJveCB0YWlsIC0yIGlucHV0ID4gbG9nZmlsZS5iYgorY21wIGxvZ2ZpbGUub2sgbG9nZmlsZS5iYgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3Rhci50ZXN0cyBiL3Rlc3RzdWl0ZS90YXIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDkyOWY0ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90YXIudGVzdHMKQEAgLTAsMCArMSwyNTIgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgMjAwOSBieSBEZW55cyBWbGFzZW5rbworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCit1bnNldCBMQU5HCit1bnNldCBMQU5HVUFHRQordW5zZXQgTENfQ09MTEFURQordW5zZXQgTENfQUxMCit1bWFzayAwMjIKKworcm0gLXJmIHRhci50ZW1wZGlyIDI+L2Rldi9udWxsCitta2RpciB0YXIudGVtcGRpciAmJiBjZCB0YXIudGVtcGRpciB8fCBleGl0IDEKKworIyB0ZXN0aW5nICJ0ZXN0IG5hbWUiICJzY3JpcHQiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKK3Rlc3RpbmcgIkVtcHR5IGZpbGUgaXMgbm90IGEgdGFyYmFsbCIgJ1wKK3RhciB4dmYgLSAyPiYxOyBlY2hvICQ/CisnICJcCit0YXI6IHNob3J0IHJlYWQKKzEKKyIgXAorIiIgIiIKK1NLSVA9CisKK29wdGlvbmFsIEZFQVRVUkVfU0VBTUxFU1NfR1oKKyMgSW4gTk9NTVUgY2FzZSwgImludmFsaWQgbWFnaWMiIG1lc3NhZ2UgY29tZXMgZnJvbSBndW56aXAgY2hpbGQgcHJvY2Vzcy4KKyMgT3RoZXJ3aXNlLCBpdCBjb21lcyBmcm9tIHRhci4KKyMgTmVlZCB0byBmaXggb3V0cHV0IHVwIHRvIGF2b2lkIGZhbHNlIHBvc2l0aXZlLgordGVzdGluZyAiRW1wdHkgZmlsZSBpcyBub3QgYSB0YXJiYWxsLnRhci5neiIgJ1wKK3sgdGFyIHh2emYgLSAyPiYxOyBlY2hvICQ/OyB9IHwgZ3JlcCAtRnYgImludmFsaWQgbWFnaWMiCisnICJcCit0YXI6IHNob3J0IHJlYWQKKzEKKyIgXAorIiIgIiIKK1NLSVA9CisKK3Rlc3RpbmcgIlR3byB6ZXJvZWQgYmxvY2tzIGlzIGEgKCd0cnVuY2F0ZWQnKSBlbXB0eSB0YXJiYWxsIiAnXAorZGQgaWY9L2Rldi96ZXJvIGJzPTUxMiBjb3VudD0yIDI+L2Rldi9udWxsIHwgdGFyIHh2ZiAtIDI+JjE7IGVjaG8gJD8KKycgIlwKKzAKKyIgXAorIiIgIiIKK1NLSVA9CisKK3Rlc3RpbmcgIlR3ZW50eSB6ZXJvZWQgYmxvY2tzIGlzIGFuIGVtcHR5IHRhcmJhbGwiICdcCitkZCBpZj0vZGV2L3plcm8gYnM9NTEyIGNvdW50PTIwIDI+L2Rldi9udWxsIHwgdGFyIHh2ZiAtIDI+JjE7IGVjaG8gJD8KKycgIlwKKzAKKyIgXAorIiIgIiIKK1NLSVA9CisKK29wdGlvbmFsIEZFQVRVUkVfVEFSX0NSRUFURSBGRUFUVVJFX0xTX1NPUlRGSUxFUwordGVzdGluZyAidGFyIGhhcmRsaW5rcyBhbmQgcmVwZWF0ZWQgZmlsZXMiICdcCitybSAtcmYgaW5wdXRfKiB0ZXN0LnRhciAyPi9kZXYvbnVsbAorPmlucHV0X2hhcmQxCitsbiBpbnB1dF9oYXJkMSBpbnB1dF9oYXJkMgorbWtkaXIgaW5wdXRfZGlyCis+aW5wdXRfZGlyL2ZpbGUKK2NobW9kIC1SIDY0NCAqCitjaG1vZCAgICA3NTUgaW5wdXRfZGlyCit0YXIgY2YgdGVzdC50YXIgaW5wdXQgaW5wdXRfZGlyLyBpbnB1dF9oYXJkMSBpbnB1dF9oYXJkMiBpbnB1dF9oYXJkMSBpbnB1dF9kaXIvIGlucHV0Cit0YXIgdHZmIHRlc3QudGFyIHwgc2VkICJzLy4qWzAtOV0gaW5wdXQvaW5wdXQvIgordGFyIHhmIHRlc3QudGFyIDI+JjEKK2VjaG8gT2s6ICQ/CitscyAtbCAuIGlucHV0X2Rpci8qIHwgZ3JlcCBpbnB1dF8gfCBzZWQgInMvXFwoXlteIF0qXFwpIC4qIGlucHV0L1xcMSBpbnB1dC8iCisnICJcCitpbnB1dAoraW5wdXRfZGlyLworaW5wdXRfZGlyL2ZpbGUKK2lucHV0X2hhcmQxCitpbnB1dF9oYXJkMiAtPiBpbnB1dF9oYXJkMQoraW5wdXRfaGFyZDEgLT4gaW5wdXRfaGFyZDEKK2lucHV0X2Rpci8KK2lucHV0X2Rpci9maWxlCitpbnB1dAorT2s6IDAKKy1ydy1yLS1yLS0gaW5wdXRfZGlyL2ZpbGUKK2Ryd3hyLXhyLXggaW5wdXRfZGlyCistcnctci0tci0tIGlucHV0X2hhcmQxCistcnctci0tci0tIGlucHV0X2hhcmQyCisiIFwKKyIiICIiCitTS0lQPQorCitvcHRpb25hbCBGRUFUVVJFX1RBUl9DUkVBVEUgRkVBVFVSRV9MU19TT1JURklMRVMKK3Rlc3RpbmcgInRhciBoYXJkbGlua3MgbW9kZSIgJ1wKK3JtIC1yZiBpbnB1dF8qIHRlc3QudGFyIDI+L2Rldi9udWxsCis+aW5wdXRfaGFyZDEKK2NobW9kIDc0MSBpbnB1dF9oYXJkMQorbG4gaW5wdXRfaGFyZDEgaW5wdXRfaGFyZDIKK21rZGlyIGlucHV0X2RpcgorbG4gaW5wdXRfaGFyZDEgaW5wdXRfZGlyCitsbiBpbnB1dF9oYXJkMiBpbnB1dF9kaXIKK2NobW9kIDU1MCBpbnB1dF9kaXIKKyMgT24gc29tZSBmaWxlc3lzdGVtcywgaW5wdXRfZGlyL2lucHV0X2hhcmQyIGlzIHJldHVybmVkIGJ5IHJlYWRkaXIKKyMgQkVGT1JFIGlucHV0X2Rpci9pbnB1dF9oYXJkMSEgVGhhdHMgd2h5IHdlIGNhbnQganVzdCAidGFyIGNmIC4uLiBpbnB1dF8qIjoKK3RhciBjZiB0ZXN0LnRhciBpbnB1dF9kaXIvaW5wdXRfaGFyZCogaW5wdXRfaGFyZCoKK3RhciB0dmYgdGVzdC50YXIgfCBzZWQgInMvLipbMC05XSBpbnB1dC9pbnB1dC8iCitjaG1vZCA3NzAgaW5wdXRfZGlyCitybSAtcmYgaW5wdXRfKgordGFyIHhmIHRlc3QudGFyIDI+JjEKK2VjaG8gT2s6ICQ/CitscyAtbCAuIGlucHV0X2Rpci8qIHwgZ3JlcCAiaW5wdXQuKmhhcmQiIHwgc2VkICJzL1xcKF5bXiBdKlxcKSAuKiBpbnB1dC9cXDEgaW5wdXQvIgorJyAiXAoraW5wdXRfZGlyL2lucHV0X2hhcmQxCitpbnB1dF9kaXIvaW5wdXRfaGFyZDIgLT4gaW5wdXRfZGlyL2lucHV0X2hhcmQxCitpbnB1dF9oYXJkMSAtPiBpbnB1dF9kaXIvaW5wdXRfaGFyZDEKK2lucHV0X2hhcmQyIC0+IGlucHV0X2Rpci9pbnB1dF9oYXJkMQorT2s6IDAKKy1yd3hyLS0tLXggaW5wdXRfZGlyL2lucHV0X2hhcmQxCistcnd4ci0tLS14IGlucHV0X2Rpci9pbnB1dF9oYXJkMgorLXJ3eHItLS0teCBpbnB1dF9oYXJkMQorLXJ3eHItLS0teCBpbnB1dF9oYXJkMgorIiBcCisiIiAiIgorU0tJUD0KKworb3B0aW9uYWwgRkVBVFVSRV9UQVJfQ1JFQVRFIEZFQVRVUkVfTFNfU09SVEZJTEVTCit0ZXN0aW5nICJ0YXIgc3ltbGlua3MgbW9kZSIgJ1wKK3JtIC1yZiBpbnB1dF8qIHRlc3QudGFyIDI+L2Rldi9udWxsCis+aW5wdXRfZmlsZQorY2htb2QgNzQxIGlucHV0X2ZpbGUKK2xuIC1zIGlucHV0X2ZpbGUgaW5wdXRfc29mdAorbWtkaXIgaW5wdXRfZGlyCitsbiBpbnB1dF9maWxlIGlucHV0X2RpcgorbG4gaW5wdXRfc29mdCBpbnB1dF9kaXIKK2NobW9kIDU1MCBpbnB1dF9kaXIKK3RhciBjZiB0ZXN0LnRhciBpbnB1dF9kaXIvKiBpbnB1dF9bZnNdKgordGFyIHR2ZiB0ZXN0LnRhciB8IHNlZCAicy8uKlswLTldIGlucHV0L2lucHV0LyIgfCBzb3J0CitjaG1vZCA3NzAgaW5wdXRfZGlyCitybSAtcmYgaW5wdXRfKgordGFyIHhmIHRlc3QudGFyIDI+JjEKK2VjaG8gT2s6ICQ/CitscyAtbCAuIGlucHV0X2Rpci8qIHwgZ3JlcCAiaW5wdXRfW2ZzXSIgfCBzZWQgInMvXFwoXlteIF0qXFwpIC4qIGlucHV0L1xcMSBpbnB1dC8iCisnICJcCitpbnB1dF9kaXIvaW5wdXRfZmlsZQoraW5wdXRfZGlyL2lucHV0X3NvZnQgLT4gaW5wdXRfZmlsZQoraW5wdXRfZmlsZSAtPiBpbnB1dF9kaXIvaW5wdXRfZmlsZQoraW5wdXRfc29mdCAtPiBpbnB1dF9kaXIvaW5wdXRfc29mdAorT2s6IDAKKy1yd3hyLS0tLXggaW5wdXRfZGlyL2lucHV0X2ZpbGUKK2xyd3hyd3hyd3ggaW5wdXRfZmlsZQorLXJ3eHItLS0teCBpbnB1dF9maWxlCitscnd4cnd4cnd4IGlucHV0X2ZpbGUKKyIgXAorIiIgIiIKK1NLSVA9CisKK29wdGlvbmFsIEZFQVRVUkVfVEFSX0NSRUFURSBGRUFUVVJFX1RBUl9MT05HX09QVElPTlMKK3Rlc3RpbmcgInRhciAtLW92ZXJ3cml0ZSIgIlwKK3JtIC1yZiBpbnB1dF8qIHRlc3QudGFyIDI+L2Rldi9udWxsCitsbiBpbnB1dCBpbnB1dF9oYXJkCit0YXIgY2YgdGVzdC50YXIgaW5wdXRfaGFyZAorZWNobyBXUk9ORyA+aW5wdXQKKyMgLS1vdmVyd3JpdGUgb3BlbnMgJ2lucHV0X2hhcmQnIHdpdGhvdXQgdW5saW5raW5nLAorIyB0aHVzICdpbnB1dF9oYXJkJyBzdGlsbCBsaW5rZWQgdG8gJ2lucHV0JyBhbmQgd2Ugd3JpdGUgJ09rJyBpbnRvIGl0Cit0YXIgeGYgdGVzdC50YXIgLS1vdmVyd3JpdGUgMj4mMSAmJiBjYXQgaW5wdXQKKyIgIlwKK09rCisiIFwKKyJPa1xuIiAiIgorU0tJUD0KKwordGVzdCB4IiRTS0lQX0tOT1dOX0JVR1MiID0geCIiICYmIHsKKyMgTmVlZHMgdG8gYmUgcnVuIHVuZGVyIG5vbi1yb290IGZvciBtZWFuaW5nZnVsIHRlc3QKK29wdGlvbmFsIEZFQVRVUkVfVEFSX0NSRUFURQordGVzdGluZyAidGFyIHdyaXRpbmcgaW50byByZWFkLW9ubHkgZGlyIiAnXAorcm0gLXJmIGlucHV0XyogdGVzdC50YXIgMj4vZGV2L251bGwKK21rZGlyIGlucHV0X2RpcgorPmlucHV0X2Rpci9pbnB1dF9maWxlCitjaG1vZCA1NTAgaW5wdXRfZGlyCit0YXIgY2YgdGVzdC50YXIgaW5wdXRfZGlyCit0YXIgdHZmIHRlc3QudGFyIHwgc2VkICJzLy4qWzAtOV0gaW5wdXQvaW5wdXQvIgorY2htb2QgNzcwIGlucHV0X2Rpcgorcm0gLXJmIGlucHV0XyoKK3RhciB4ZiB0ZXN0LnRhciAyPiYxCitlY2hvIE9rOiAkPworbHMgLWwgaW5wdXRfZGlyLyogLiB8IGdyZXAgaW5wdXRfIHwgc2VkICJzL1xcKF5bXiBdKlxcKSAuKiBpbnB1dC9cXDEgaW5wdXQvIgorY2htb2QgNzcwIGlucHV0X2RpcgorJyAiXAoraW5wdXRfZGlyLworaW5wdXRfZGlyL2lucHV0X2ZpbGUKK09rOiAwCistcnctci0tci0tIGlucHV0X2Rpci9pbnB1dF9maWxlCitkci14ci14LS0tIGlucHV0X2RpcgorIiBcCisiIiAiIgorU0tJUD0KK30KKworIyBIYWQgYSBidWcgd2hlcmUgb24gZXh0cmFjdCBhdXRvZGV0ZWN0IGZpcnN0ICJzd2l0Y2hlZCBvZmYiIC16CisjIGFuZCB0aGVuIGZhaWxlZCB0byByZWNvZ25pemUgLnRneiBleHRlbnNpb24KK29wdGlvbmFsIEZFQVRVUkVfVEFSX0NSRUFURSBGRUFUVVJFX1NFQU1MRVNTX0daCit0ZXN0aW5nICJ0YXIgZXh0cmFjdCB0Z3oiICJcCitkZCBjb3VudD0xIGJzPTFNIGlmPS9kZXYvemVybyBvZj1GMCAyPi9kZXYvbnVsbAordGFyIC1jemYgRjAudGd6IEYwCitybSBGMAordGFyIC14enZmIEYwLnRneiAmJiBlY2hvIE9rCitybSBGMCB8fCBlY2hvIEJBRAorIiAiXAorRjAKK09rCisiIFwKKyIiICIiCitTS0lQPQorCisjIERvIHdlIGRldGVjdCBYWi1jb21wcmVzc2VkIGRhdGEgKGV2ZW4gdy9vIC50YXIueHogb3IgdHh6IGV4dGVuc2lvbik/CisjICh0aGUgdXVlbmNvZGVkIGhlbGxvX3dvcmxkLnR4eiBjb250YWlucyBvbmUgZW1wdHkgZmlsZSBuYW1lZCAiaGVsbG9fd29ybGQiKQorb3B0aW9uYWwgVVVERUNPREUgRkVBVFVSRV9UQVJfQVVUT0RFVEVDVCBGRUFUVVJFX1NFQU1MRVNTX1haCit0ZXN0aW5nICJ0YXIgZXh0cmFjdCB0eHoiICJcCit1dWRlY29kZSAtbyBpbnB1dCAmJiB0YXIgdGYgaW5wdXQgJiYgZWNobyBPaworIiAiXAoraGVsbG9fd29ybGQKK09rCisiIFwKKyIiICJcCitiZWdpbi1iYXNlNjQgNjQ0IGhlbGxvX3dvcmxkLnR4egorL1RkNldGb0FBQVRtMXJSR0FnQWhBUllBQUFCMEwrV2o0QVgvQUVsZEFEUVpTZTZPRElaUTNyU1E4a0FKCitTbk1QVFgrWFdHS1czWXUvUndxZzRJazV3cWdRS2dWSDk3Sjh5QThJdlo0YWhhQ1FvZ1VOSFJrWGlicjIKK1E2MTV3Y2IyRzdmSlU0OUFoV0FBQUFBQVVBOGd1OUR5WGZBQUFXV0FEQUFBQUI1RlhHQ3h4R2Y3QWdBQQorQUFBRVdWbz0KKz09PT0KKyIKK1NLSVA9CisKKyMgT24gZXh0cmFjdCwgZXZlcnl0aGluZyB1cCB0byBhbmQgaW5jbHVkaW5nIGxhc3QgIi4uIiBjb21wb25lbnQgaXMgc3RyaXBwZWQKK29wdGlvbmFsIEZFQVRVUkVfVEFSX0NSRUFURQordGVzdGluZyAidGFyIHN0cmlwcyAvLi4vIG9uIGV4dHJhY3QiICJcCitybSAtcmYgaW5wdXRfKiB0ZXN0LnRhciAyPi9kZXYvbnVsbAorbWtkaXIgaW5wdXRfZGlyCitlY2hvIE9rID5pbnB1dF9kaXIvZmlsZQordGFyIGNmIHRlc3QudGFyIC4vLi4vdGFyLnRlbXBkaXIvaW5wdXRfZGlyLy4uL2lucHV0X2RpciAyPiYxCitybSAtcmYgaW5wdXRfKiAyPi9kZXYvbnVsbAordGFyIC12eGYgdGVzdC50YXIgMj4mMQorY2F0IGlucHV0X2Rpci9maWxlIDI+JjEKKyIgIlwKK3RhcjogcmVtb3ZpbmcgbGVhZGluZyAnLi8uLi90YXIudGVtcGRpci9pbnB1dF9kaXIvLi4vJyBmcm9tIG1lbWJlciBuYW1lcworaW5wdXRfZGlyLworaW5wdXRfZGlyL2ZpbGUKK09rCisiIFwKKyIiICIiCitTS0lQPQorCisKK2NkIC4uICYmIHJtIC1yZiB0YXIudGVtcGRpciB8fCBleGl0IDEKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdGFyL3Rhci1hcmNoaXZlcy1tdWx0aXBsZS1maWxlcyBiL3Rlc3RzdWl0ZS90YXIvdGFyLWFyY2hpdmVzLW11bHRpcGxlLWZpbGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NWQ5ZTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvdGFyL3Rhci1hcmNoaXZlcy1tdWx0aXBsZS1maWxlcwpAQCAtMCwwICsxLDYgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfVEFSX0NSRUFURQordG91Y2ggZm9vIGJhcgorYnVzeWJveCB0YXIgY2YgZm9vLnRhciBmb28gYmFyCitybSBmb28gYmFyCit0YXIgeGYgZm9vLnRhcgordGVzdCAtZiBmb28gLWEgLWYgYmFyCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdGFyL3Rhci1jb21wbGFpbnMtYWJvdXQtbWlzc2luZy1maWxlIGIvdGVzdHN1aXRlL3Rhci90YXItY29tcGxhaW5zLWFib3V0LW1pc3NpbmctZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmU4Y2JiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3Rhci90YXItY29tcGxhaW5zLWFib3V0LW1pc3NpbmctZmlsZQpAQCAtMCwwICsxLDMgQEAKK3RvdWNoIGZvbwordGFyIGNmIGZvby50YXIgZm9vCishIGJ1c3lib3ggdGFyIHhmIGZvby50YXIgYmFyCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdGFyL3Rhci1kZW1hbmRzLWF0LWxlYXN0LW9uZS1jdHggYi90ZXN0c3VpdGUvdGFyL3Rhci1kZW1hbmRzLWF0LWxlYXN0LW9uZS1jdHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVlN2Y2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90YXIvdGFyLWRlbWFuZHMtYXQtbGVhc3Qtb25lLWN0eApAQCAtMCwwICsxIEBACishIGJ1c3lib3ggdGFyIHYKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90YXIvdGFyLWRlbWFuZHMtYXQtbW9zdC1vbmUtY3R4IGIvdGVzdHN1aXRlL3Rhci90YXItZGVtYW5kcy1hdC1tb3N0LW9uZS1jdHgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMwZDBlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90YXIvdGFyLWRlbWFuZHMtYXQtbW9zdC1vbmUtY3R4CkBAIC0wLDAgKzEgQEAKKyEgYnVzeWJveCB0YXIgdHgKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90YXIvdGFyLWV4dHJhY3RzLWFsbC1zdWJkaXJzIGIvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtYWxsLXN1YmRpcnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUzNTFmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90YXIvdGFyLWV4dHJhY3RzLWFsbC1zdWJkaXJzCkBAIC0wLDAgKzEsMTIgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfVEFSX0NSRUFURQorbWtkaXIgLXAgZm9vL3sxLDIsM30KK21rZGlyIC1wIGZvby8xL3sxMCwxMX0KK21rZGlyIC1wIGZvby8xLzEwL3sxMDAsMTAxLDEwMn0KK3RhciBjZiBmb28udGFyIC1DIGZvbyAuCitybSAtcmYgZm9vLyoKK2J1c3lib3ggdGFyIHhmIGZvby50YXIgLUMgZm9vIC4vMS8xMAorZmluZCBmb28gfCBzb3J0ID5sb2dmaWxlLmJiCitybSAtcmYgZm9vLyoKK3RhciB4ZiBmb28udGFyIC1DIGZvbyAuLzEvMTAKK2ZpbmQgZm9vIHwgc29ydCA+bG9nZmlsZS5nbnUKK2RpZmYgLXUgbG9nZmlsZS5nbnUgbG9nZmlsZS5iYgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtZmlsZSBiL3Rlc3RzdWl0ZS90YXIvdGFyLWV4dHJhY3RzLWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3MmYyNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90YXIvdGFyLWV4dHJhY3RzLWZpbGUKQEAgLTAsMCArMSw1IEBACit0b3VjaCBmb28KK3RhciBjZiBmb28udGFyIGZvbworcm0gZm9vCitidXN5Ym94IHRhciB4ZiBmb28udGFyCit0ZXN0IC1mIGZvbwpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtZnJvbS1zdGFuZGFyZC1pbnB1dCBiL3Rlc3RzdWl0ZS90YXIvdGFyLWV4dHJhY3RzLWZyb20tc3RhbmRhcmQtaW5wdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMwZTlmMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90YXIvdGFyLWV4dHJhY3RzLWZyb20tc3RhbmRhcmQtaW5wdXQKQEAgLTAsMCArMSw1IEBACit0b3VjaCBmb28KK3RhciBjZiBmb28udGFyIGZvbworcm0gZm9vCitjYXQgZm9vLnRhciB8IGJ1c3lib3ggdGFyIHgKK3Rlc3QgLWYgZm9vCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdGFyL3Rhci1leHRyYWN0cy1tdWx0aXBsZS1maWxlcyBiL3Rlc3RzdWl0ZS90YXIvdGFyLWV4dHJhY3RzLW11bHRpcGxlLWZpbGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4OTdkODEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvdGFyL3Rhci1leHRyYWN0cy1tdWx0aXBsZS1maWxlcwpAQCAtMCwwICsxLDYgQEAKK3RvdWNoIGZvbyBiYXIKK3RhciBjZiBmb28udGFyIGZvbyBiYXIKK3JtIGZvbyBiYXIKK2J1c3lib3ggdGFyIC14ZiBmb28udGFyCit0ZXN0IC1mIGZvbwordGVzdCAtZiBiYXIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90YXIvdGFyLWV4dHJhY3RzLXRvLXN0YW5kYXJkLW91dHB1dCBiL3Rlc3RzdWl0ZS90YXIvdGFyLWV4dHJhY3RzLXRvLXN0YW5kYXJkLW91dHB1dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTQ4ZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3Rhci90YXItZXh0cmFjdHMtdG8tc3RhbmRhcmQtb3V0cHV0CkBAIC0wLDAgKzEsMyBAQAorZWNobyBmb28gPiBmb28KK3RhciBjZiBmb28udGFyIGZvbworY2F0IGZvby50YXIgfCBidXN5Ym94IHRhciBPeCB8IGNtcCBmb28gLQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3Rhci90YXItaGFuZGxlcy1jei1vcHRpb25zIGIvdGVzdHN1aXRlL3Rhci90YXItaGFuZGxlcy1jei1vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YzYyOGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvdGFyL3Rhci1oYW5kbGVzLWN6LW9wdGlvbnMKQEAgLTAsMCArMSw1IEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX1RBUl9DUkVBVEUKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfU0VBTUxFU1NfR1oKK3RvdWNoIGZvbworYnVzeWJveCB0YXIgY3pmIGZvby50YXIuZ3ogZm9vCitnemlwIC1kIGZvby50YXIuZ3oKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90YXIvdGFyLWhhbmRsZXMtZW1wdHktaW5jbHVkZS1hbmQtbm9uLWVtcHR5LWV4Y2x1ZGUtbGlzdCBiL3Rlc3RzdWl0ZS90YXIvdGFyLWhhbmRsZXMtZW1wdHktaW5jbHVkZS1hbmQtbm9uLWVtcHR5LWV4Y2x1ZGUtbGlzdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDMzNjQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3Rhci90YXItaGFuZGxlcy1lbXB0eS1pbmNsdWRlLWFuZC1ub24tZW1wdHktZXhjbHVkZS1saXN0CkBAIC0wLDAgKzEsNiBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9UQVJfRlJPTQorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9UQVJfQ1JFQVRFCit0b3VjaCBmb28KK3RhciBjZiBmb28udGFyIGZvbworZWNobyBmb28gPmZvby5leGNsdWRlCitidXN5Ym94IHRhciB4ZiBmb28udGFyIC1YIGZvby5leGNsdWRlCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdGFyL3Rhci1oYW5kbGVzLWV4Y2x1ZGUtYW5kLWV4dHJhY3QtbGlzdHMgYi90ZXN0c3VpdGUvdGFyL3Rhci1oYW5kbGVzLWV4Y2x1ZGUtYW5kLWV4dHJhY3QtbGlzdHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRlMGYwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90YXIvdGFyLWhhbmRsZXMtZXhjbHVkZS1hbmQtZXh0cmFjdC1saXN0cwpAQCAtMCwwICsxLDggQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfVEFSX0ZST00KKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfVEFSX0NSRUFURQordG91Y2ggZm9vIGJhciBiYXoKK3RhciBjZiBmb28udGFyIGZvbyBiYXIgYmF6CitlY2hvIGZvbyA+Zm9vLmV4Y2x1ZGUKK3JtIGZvbyBiYXIgYmF6CitidXN5Ym94IHRhciB4ZiBmb28udGFyIGZvbyBiYXIgLVggZm9vLmV4Y2x1ZGUKK3Rlc3QgISAtZiBmb28gLWEgLWYgYmFyIC1hICEgLWYgYmF6CmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdGFyL3Rhci1oYW5kbGVzLW11bHRpcGxlLVgtb3B0aW9ucyBiL3Rlc3RzdWl0ZS90YXIvdGFyLWhhbmRsZXMtbXVsdGlwbGUtWC1vcHRpb25zCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NWIyN2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvdGFyL3Rhci1oYW5kbGVzLW11bHRpcGxlLVgtb3B0aW9ucwpAQCAtMCwwICsxLDEwIEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX1RBUl9GUk9NCisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX1RBUl9DUkVBVEUKK3RvdWNoIGZvbwordG91Y2ggYmFyCit0YXIgY2YgZm9vLnRhciBmb28gYmFyCitlY2hvIGZvbyA+IGZvby5leGNsdWRlCitlY2hvIGJhciA+IGJhci5leGNsdWRlCitybSBmb28gYmFyCitidXN5Ym94IHRhciB4ZiBmb28udGFyIC1YIGZvby5leGNsdWRlIC1YIGJhci5leGNsdWRlCit0ZXN0ICEgLWYgZm9vIC1hICEgLWYgYmFyCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdGFyL3Rhci1oYW5kbGVzLW5lc3RlZC1leGNsdWRlIGIvdGVzdHN1aXRlL3Rhci90YXItaGFuZGxlcy1uZXN0ZWQtZXhjbHVkZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTAxM2ExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3Rhci90YXItaGFuZGxlcy1uZXN0ZWQtZXhjbHVkZQpAQCAtMCwwICsxLDkgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfVEFSX0ZST00KKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfVEFSX0NSRUFURQorbWtkaXIgZm9vCit0b3VjaCBmb28vYmFyCit0YXIgY2YgZm9vLnRhciBmb28KK3JtIC1yZiBmb28KK2VjaG8gZm9vL2JhciA+Zm9vYmFyLmV4Y2x1ZGUKK2J1c3lib3ggdGFyIHhmIGZvby50YXIgZm9vIC1YIGZvb2Jhci5leGNsdWRlCit0ZXN0IC1kIGZvbyAtYSAhIC1mIGZvby9iYXIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90YXIvdGFyX3dpdGhfbGlua193aXRoX3NpemUgYi90ZXN0c3VpdGUvdGFyL3Rhcl93aXRoX2xpbmtfd2l0aF9zaXplCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NGNkNTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvdGFyL3Rhcl93aXRoX2xpbmtfd2l0aF9zaXplCkBAIC0wLDAgKzEsMzEgQEAKKyMgRkVBVFVSRTogQ09ORklHX0ZFQVRVUkVfVEFSX1VOQU1FX0dOQU1FCisKKyMgVGhpcyB0YXJiYWxsIGNvbnRhaW5zIGEgc29mdGxpbmsgd2l0aCBzaXplIGZpZWxkICE9IDAuCisjIElmIG5vdCBpZ25vcmVkLCBpdCBtYWtlcyBoZXh0IGhlYWRlciB0byBiZSBza2lwcGVkCisjIGFuZCBkYXRhIHRvIGJlIHJlYWQgYXMgYSBoZWFkZXIuCisjIEdOVSB0YXIgMS4xNS4xIGhhcyBhIGJ1ZyBoZXJlOiB0ZiB3b24ndCB3b3JrLCBidXQgeGYgd2lsbC4KK3RhcjFfYnoyKCkKK3sKKyAgICAkRUNITyAtbmUgIlx4NDJceDVhXHg2OFx4MzlceDMxXHg0MVx4NTlceDI2XHg1M1x4NTlceDE0XHg0NFx4ZTNceGRkXHgwMFx4MDAiCisgICAgJEVDSE8gLW5lICJceDlhXHhmYlx4OTBceGNhXHgxOFx4MDBceGMwXHg0MFx4MDNceGZmXHg4MFx4MDhceDAwXHg3Ylx4ZTNceGZmIgorICAgICRFQ0hPIC1uZSAiXHg4MFx4MDRceDAwXHgwMFx4MDhceDMwXHgwMFx4ZDZceGIzXHgwOVx4NDVceDE5XHgwZFx4MGRceDQxXHg4NCIKKyAgICAkRUNITyAtbmUgIlx4MWFceDY4XHhkMFx4N2FceDk5XHg5MFx4NGFceDBhXHg2ZFx4NGNceGEzXHgyMFx4N2FceDQxXHhhMFx4MDAiCisgICAgJEVDSE8gLW5lICJceDAwXHg1NVx4MjVceDM0XHgxYVx4MzRceGQwXHgwMFx4NjRceDY0XHgxYVx4MzJceDNmXHg3Nlx4M2NceDFjIgorICAgICRFQ0hPIC1uZSAiXHhkM1x4M2NceGEwXHg4NFx4OWJceDg4XHgwNVx4NzBceDkwXHhiYlx4MThceDI4XHgzOVx4MjlceGIzXHgzMCIKKyAgICAkRUNITyAtbmUgIlx4YThceDBhXHgyMVx4NzBceDBjXHgwMVx4MzJceDNiXHhiZVx4ZGVceGQ3XHgxM1x4MmVceGJkXHgyYVx4OWMiCisgICAgJEVDSE8gLW5lICJceGE4XHg0Mlx4MmFceDkxXHgxNVx4ZTJceGExXHhjZFx4MjRceDM3XHg5Y1x4OTFceGFhXHhjN1x4MTRceGRiIgorICAgICRFQ0hPIC1uZSAiXHg0Y1x4MDhceGFhXHhhZlx4MTJceGViXHg2Y1x4MzdceDk2XHhiMFx4YTRceDI1XHgwY1x4YjRceDRiXHhjNSIKKyAgICAkRUNITyAtbmUgIlx4NTJceDcwXHgzYlx4MjVceDRjXHgwZVx4NDZceDY3XHg1MVx4NTRceDg5XHgxM1x4MTNceGYwXHhhOFx4ZTkiCisgICAgJEVDSE8gLW5lICJceDY4XHg0ZVx4OGNceDgxXHhmY1x4NzlceGUwXHhiMFx4ZDhceDc5XHgzNFx4OTRceDcxXHhhMlx4MGNceGJlIgorICAgICRFQ0hPIC1uZSAiXHg5M1x4NjFceDgyXHg5NVx4MTBceDg4XHhkMVx4YTZceDY5XHhhYVx4MzhceDljXHhiNlx4YzJceGIyXHg5NCIKKyAgICAkRUNITyAtbmUgIlx4OTBceGMzXHg4Mlx4MjlceGU4XHg4Y1x4YjhceDk1XHg4M1x4MzJceDQwXHg2MVx4MTFceDExXHhkM1x4YWEiCisgICAgJEVDSE8gLW5lICJceDNmXHg4Ylx4YjlceDIyXHg5Y1x4MjhceDQ4XHgwYVx4MjJceDcxXHhlZVx4ODAiCit9CityZXMxPSJcCitscnd4cnd4cnd4IHVzZXIvZ3JvdXAgICAgICAgICAwIDIwMDgtMDctMTkgMTU6MDI6MzcgZmlybXdhcmUtMzcyL3NvdXJjZXMvbmF0aXZlL2Jpbi9jaHJvb3Qtc2V0dXAuc2ggLT4gcWVtdS1zZXR1cC5zaAorLXJ3eHIteHIteCB1c2VyL2dyb3VwICAgICAgIDUxMiAyMDA4LTA3LTE5IDE1OjAyOjM3IGZpcm13YXJlLTM3Mi9zb3VyY2VzL25hdGl2ZS9iaW4vcWVtdS1zZXR1cC5zaCIKKworZXhwb3J0IFRaPVVUQy0yCisKK3Q9YHRhcjFfYnoyIHwgYnVuemlwMiB8IGJ1c3lib3ggdGFyIHR2ZiAtYAordGVzdCB4IiRyZXMxIiA9IHgiJHQiCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdGFyL3Rhcl93aXRoX3ByZWZpeF9maWVsZHMgYi90ZXN0c3VpdGUvdGFyL3Rhcl93aXRoX3ByZWZpeF9maWVsZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMxZmRhNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90YXIvdGFyX3dpdGhfcHJlZml4X2ZpZWxkcwpAQCAtMCwwICsxLDI2NCBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9UQVJfVU5BTUVfR05BTUUKKyMgRkVBVFVSRTogQ09ORklHX0RFU0tUT1AKKwordGFyMV9iejIoKQoreworICAgICRFQ0hPIC1uZSAiXHg0Mlx4NWFceDY4XHgzOVx4MzFceDQxXHg1OVx4MjZceDUzXHg1OVx4MTJceGQxXHg4Nlx4MzBceDAwXHgwYyIKKyAgICAkRUNITyAtbmUgIlx4YjhceDdmXHg4MFx4ZmZceDUwXHgwOFx4YTBceDVlXHhmZlx4ZmZceGZkXHg3Zlx4ZmZceGZmXHhlZVx4ZmYiCisgICAgJEVDSE8gLW5lICJceGZmXHhmZlx4ZmFceDAwXHgwOFx4NjBceDBmXHhjNVx4M2VceGY0XHhkY1x4MDBceDAwXHg1OVx4MjVceGJkIgorICAgICRFQ0hPIC1uZSAiXHhiOFx4N2FceDAyXHhiNVx4ODJceDc4XHgyNVx4YjBceDg5XHg1NFx4MTBceDExXHg0NFx4OGJceDM2XHgzNiIKKyAgICAkRUNITyAtbmUgIlx4YzhceDk3XHgwZFx4MzRceDlhXHgyMVx4YTlceDM2XHhhOVx4ZWRceDMyXHgwMlx4OGRceGE2XHg4MVx4OGEiCisgICAgJEVDSE8gLW5lICJceDc5XHgxM1x4NGRceDFhXHgwM1x4MTBceDY5XHhhMFx4ZDNceDQwXHg2NFx4MGZceDQ0XHg2OFx4M2RceDQxIgorICAgICRFQ0hPIC1uZSAiXHgyYVx4N2FceDIwXHgwOVx4YTFceDM0XHg5YVx4MDlceGE0XHhjOFx4ZjVceDRmXHg0Nlx4YTZceDg2XHgzMiIKKyAgICAkRUNITyAtbmUgIlx4NGNceDA4XHgwMFx4MDBceGQwXHgwNlx4OWFceDAwXHhkM1x4ZDRceDExXHg0OVx4YTdceGI1XHgyMFx4MWEiCisgICAgJEVDSE8gLW5lICJceDdhXHg4MFx4MDBceDAwXHgwMFx4MDBceGQwXHg2OFx4MDBceDAwXHgwMFx4MDBceDAwXHg0OVx4YThceDg5IgorICAgICRFQ0hPIC1uZSAiXHhhOVx4MzFceDRmXHgyMlx4YTdceGVhXHg5Ylx4NjFceDUzXHhmNFx4OTNceGYyXHhhM1x4NDdceGE0XHhkMyIKKyAgICAkRUNITyAtbmUgIlx4NDFceGVhXHgwNlx4NDFceGEwXHgwZFx4MDBceDAwXHgwMFx4MWVceGEwXHg3MFx4MzRceGQzXHg0ZFx4MDYiCisgICAgJEVDSE8gLW5lICJceDg2XHg4Nlx4ODZceDQ2XHg4MFx4NjRceDAxXHhhMVx4YTBceDM0XHhkMVx4OTBceDAwXHgwM1x4MDlceDg4IgorICAgICRFQ0hPIC1uZSAiXHgwZFx4MDRceDg5XHgwOFx4MDBceDgyXHg3YVx4NGNceDQyXHg2NFx4YzlceDNkXHgxYVx4MjlceGU5XHhhMiIKKyAgICAkRUNITyAtbmUgIlx4M2RceDQ2XHg5ZVx4NDZceDlhXHgxM1x4MjZceDllXHg1M1x4MTBceDAxXHg5MVx4ZWFceDY4XHgxOVx4ZjAiCisgICAgJEVDSE8gLW5lICJceDczXHhmMlx4ZTBceGQxXHgzY1x4ODBceDAxXHhiMVx4NDhceDQ0XHgwOFx4OWFceGJhXHhmM1x4OWVceDg3IgorICAgICRFQ0hPIC1uZSAiXHhlY1x4YzRceDRiXHgwMlx4OTJceDgwXHg3NVx4MDBceDU2XHg0Mlx4ODhceDEwXHg2OFx4Y2NceDA2XHgyMiIKKyAgICAkRUNITyAtbmUgIlx4N2NceDJiXHhhN1x4YzhceDIxXHg5MVx4MTNceGU1XHg3Mlx4YzBceGU2XHgwY1x4MDNceDEwXHhmMlx4ODkiCisgICAgJEVDSE8gLW5lICJceDljXHg2N1x4NmJceGMzXHhlNlx4YWVceDk4XHg4NVx4MGFceDdmXHgyNVx4MmVceDNkXHg4NFx4NWJceGViIgorICAgICRFQ0hPIC1uZSAiXHhmM1x4ZmZceGIzXHg1Mlx4ZjdceDZlXHhmNlx4OTJceGQ2XHgzM1x4NWZceDRmXHhkMVx4M2RceGI3XHhjNCIKKyAgICAkRUNITyAtbmUgIlx4MGRceDUwXHgwMlx4NDlceDAxXHhhZlx4ZDBceDY5XHhiYlx4ZDNceGU5XHg2M1x4MGFceDY4XHgzNlx4OTIiCisgICAgJEVDSE8gLW5lICJceGYyXHgwM1x4MWRceGYyXHhlMlx4MzVceGJjXHg3M1x4ZDRceDQ0XHhmNlx4YTBceGUwXHgzMVx4ZDdceDdkIgorICAgICRFQ0hPIC1uZSAiXHg1Nlx4OTZceGNiXHg1Mlx4ZmNceDc5XHhlMFx4ZWJceGY3XHgzNFx4ZDhceGRhXHgxOFx4NzJceDMwXHg5NCIKKyAgICAkRUNITyAtbmUgIlx4NTNceDQ1XHhmNVx4NTRceDU2XHg2Y1x4MGJceDUwXHhhMFx4YmNceGJkXHhjY1x4ZDhceDIxXHhhYlx4N2IiCisgICAgJEVDSE8gLW5lICJceGE4XHhhNFx4ZTRceDc4XHgyNVx4NzNceGJmXHg0Ylx4MzBceDM4XHg3MVx4ZTlceDNjXHgxNFx4NWRceGEzIgorICAgICRFQ0hPIC1uZSAiXHgxMlx4MDRceDZiXHgzN1x4OWRceGU1XHhjZVx4YTVceGQ5XHhkMVx4YTVceDY5XHgwOVx4MDhceGM0XHg0OCIKKyAgICAkRUNITyAtbmUgIlx4NGJceDM0XHg1OFx4ODFceDE1XHgxOFx4ODhceGFjXHgxMVx4NTFceDg4XHgzNVx4MGRceGQzXHgxM1x4MTgiCisgICAgJEVDSE8gLW5lICJceDY3XHg3M1x4MjBceDVjXHgyOFx4MDNceDI2XHhjZFx4NmRceDIwXHg5MFx4YmFceGE0XHgxMlx4YjNceDA4IgorICAgICRFQ0hPIC1uZSAiXHgyN1x4NzRceDZhXHg5OVx4ZGZceGIxXHgyMFx4M2RceDg1XHhlN1x4NWZceGFiXHgwZVx4MmVceGRjXHgyMyIKKyAgICAkRUNITyAtbmUgIlx4OTlceGUxXHhlZlx4MzRceDY4XHhjZFx4YTlceGIwXHhiZlx4ZGFceGVjXHg4MVx4ZGRceDY2XHhjYVx4MjEiCisgICAgJEVDSE8gLW5lICJceDEzXHg0N1x4ZDdceGNhXHg0OFx4Y2ZceGViXHgyNVx4YmJceDc5XHg2ZFx4NDBceGQwXHhlNFx4NjlceDNjIgorICAgICRFQ0hPIC1uZSAiXHg4Zlx4MDlceDFlXHg3Ylx4YWFceDRiXHg5MVx4MzlceGFjXHhkNlx4ZDJceDBjXHg4NVx4MWRceGY3XHg3MCIKKyAgICAkRUNITyAtbmUgIlx4MWZceDFlXHg1OFx4YmJceDIyXHgxMVx4MjlceDM5XHgxNFx4NGRceDU4XHg4MVx4OWZceGQ3XHgxZVx4MjIiCisgICAgJEVDSE8gLW5lICJceDIxXHg5MVx4MGFceDQwXHhkMVx4ODdceDI5XHg5OVx4OTNceGY0XHhmM1x4MjVceDQ4XHhiYlx4YjRceDI0IgorICAgICRFQ0hPIC1uZSAiXHgyYVx4MWNceGE3XHgyOFx4YzFceDY4XHgwOFx4MjVceDAwXHhhYVx4M2RceGVlXHhhZVx4YzFceGUxXHg0ZiIKKyAgICAkRUNITyAtbmUgIlx4ZTZceDlhXHgyNlx4NmJceGNmXHhiMVx4M2VceGI5XHg4NVx4MDRceGY0XHhlZlx4ZmZceDdhXHgyZlx4MmEiCisgICAgJEVDSE8gLW5lICJceDA0XHgwOFx4ZTBceDRjXHhiOFx4YmRceDhiXHg4MVx4YmZceGEyXHhiZVx4ODJceDUyXHg5Ylx4NDBceDYzIgorICAgICRFQ0hPIC1uZSAiXHhlNlx4ZjNceGIzXHhlNFx4ZTZceGU1XHg5NFx4NGFceGRkXHhjM1x4MWJceGFmXHg2MVx4ZjNceGJmXHg1YiIKKyAgICAkRUNITyAtbmUgIlx4NmRceGFhXHhhYVx4MjdceGU4XHg1MFx4OGRceDIzXHg5N1x4YTRceGJkXHhjM1x4ZDJceGU2XHhiNVx4NjYiCisgICAgJEVDSE8gLW5lICJceDlhXHgxYVx4OGVceDQ1XHgyYVx4ZWRceDBiXHg3OVx4YjhceDg5XHgzOFx4NGFceDA0XHg4NVx4MGRceDFlIgorICAgICRFQ0hPIC1uZSAiXHgyYlx4NzdceDUxXHg5MVx4NWZceDlmXHhlMFx4MmFceDQ5XHg1Nlx4ZDNceGExXHhkZVx4ZjZceGQ3XHg4OCIKKyAgICAkRUNITyAtbmUgIlx4NWFceDYxXHhlNVx4MDRceDU0XHhkZlx4YTNceDkyXHhlYlx4YmZceDc1XHgzOVx4Y2VceGZhXHhmNVx4ZGUiCisgICAgJEVDSE8gLW5lICJceDMwXHhkN1x4NTZceGQxXHg3ZFx4MmNceGRmXHhkYVx4M2VceDFjXHhjOFx4YzJceDkzXHg2MVx4MjFceDIwIgorICAgICRFQ0hPIC1uZSAiXHhiMlx4MjJceDZkXHhiZVx4MzlceDUyXHg2NFx4ZjZceGIzXHg5MVx4MjFceDg2XHhkYlx4NjdceDcyXHg4ZiIKKyAgICAkRUNITyAtbmUgIlx4NDlceGFkXHhlNFx4OTNceDM5XHg1Y1x4MzRceDhmXHg1OFx4ZGJceDU4XHhkM1x4M2NceDFlXHg0Y1x4NmMiCisgICAgJEVDSE8gLW5lICJceGJiXHg3MFx4NmZceDQyXHhjZlx4OWVceGJmXHhiMVx4Y2JceGE5XHg4ZFx4MDVceGU3XHhlYVx4ZWFceGQ3IgorICAgICRFQ0hPIC1uZSAiXHgzY1x4NjdceDMxXHg2OVx4NDRceDMzXHhhNFx4OTJceDljXHg2NVx4YTRceDg5XHg1YVx4YWVceGNmXHhjOSIKKyAgICAkRUNITyAtbmUgIlx4NTVceDQzXHg2Mlx4NmRceGJmXHgwNVx4M2NceGQxXHgwZlx4MDFceDRhXHhiNVx4MWRceGJiXHgyY1x4ZmIiCisgICAgJEVDSE8gLW5lICJceGE2XHhiN1x4YjNceGIxXHgxZFx4NjZceGQzXHhlYlx4MjJceGQwXHhiNVx4NWFceDRiXHhjNFx4NDdceDQ3IgorICAgICRFQ0hPIC1uZSAiXHg1YVx4NDlceDg1XHgxOFx4YmNceDE1XHgzOVx4M2JceDkyXHhlZVx4NTFceDk4XHgzM1x4MzRceDVkXHhiNSIKKyAgICAkRUNITyAtbmUgIlx4YmJceDhiXHg5NFx4OGNceGRlXHg4ZVx4M2ZceDNkXHgwOVx4NGZceGJhXHhkM1x4ZjZceDc5XHg3NFx4OGUiCisgICAgJEVDSE8gLW5lICJceDgyXHgwZFx4NTZceDg1XHhhMlx4YzdceGM2XHhhNlx4ODlceDI5XHgyNlx4YTNceDUzXHg1ZVx4NTJceGY1IgorICAgICRFQ0hPIC1uZSAiXHg1Nlx4NzRceDhiXHgxN1x4ODJceGVkXHg3YVx4OGJceDY4XHg2MVx4YTVceGM5XHg3Y1x4ZGVceDlmXHg2OCIKKyAgICAkRUNITyAtbmUgIlx4MjdceDRkXHhlYVx4NjVceDY4XHg2Zlx4N2RceDVlXHg4OFx4NzNceDg3XHg2Y1x4OTJceGYyXHhhOVx4MTUiCisgICAgJEVDSE8gLW5lICJceDRlXHhlZVx4NGRceDQxXHhiYlx4OThceDVkXHg4YVx4YWZceGNiXHgxMVx4N2JceDJhXHhjZVx4ZjRceDFlIgorICAgICRFQ0hPIC1uZSAiXHgzYVx4MjhceDQ4XHgxNFx4ZmVceDdmXHgwOVx4NDVceDQ4XHhmMVx4NWJceGMxXHhjYlx4Y2RceDkxXHhiYSIKKyAgICAkRUNITyAtbmUgIlx4M2JceGUyXHg3ZFx4NTdceDg1XHg2Nlx4NjhceGVjXHg1MVx4ODJceDk3XHg4OFx4ZWJceDk0XHgzYlx4NzgiCisgICAgJEVDSE8gLW5lICJceDZjXHhmNFx4ZjFceDNlXHgzOFx4OGRceDIyXHgxNlx4YWJceDNiXHgxM1x4YjNceDFiXHgzOVx4OTRceDBlIgorICAgICRFQ0hPIC1uZSAiXHhhOFx4MjZceGI3XHg4ZFx4ZTlceDdkXHg2Nlx4MjNceDRiXHg2NVx4MDdceGI3XHgyYlx4YzlceDk2XHhiNiIKKyAgICAkRUNITyAtbmUgIlx4OTlceDEyXHgyMlx4YmNceDkwXHhkYVx4NTFceGJjXHhmZFx4OTdceGE1XHg3ZFx4YmNceDEyXHhhNlx4NzIiCisgICAgJEVDSE8gLW5lICJceGQzXHhlM1x4OGNceGM3XHg1OFx4ZTFceGY4XHgyOFx4ZjRceDQ2XHg0OVx4MTRceGQwXHg5ZFx4YjZceGVkIgorICAgICRFQ0hPIC1uZSAiXHhjZVx4OTlceGM2XHhiY1x4ZWRceGEzXHhhYlx4YTBceDhjXHg5ZFx4Y2VceDFhXHgxYVx4YzJceGU2XHg3NyIKKyAgICAkRUNITyAtbmUgIlx4YmFceGFlXHhiYVx4ZDZceGM5XHhiMlx4ZDFceDY1XHgyNFx4N2JceDBkXHhkNFx4ZjJceGFjXHgyOFx4YzMiCisgICAgJEVDSE8gLW5lICJceDFjXHhiZVx4NGFceDU0XHhlM1x4MGZceDhkXHhhZFx4YjJceDM3XHg5ZVx4MWZceDgxXHg3Mlx4MmRceGFiIgorICAgICRFQ0hPIC1uZSAiXHg4Zlx4YjFceGNkXHhmN1x4YjRceDUxXHgyZlx4MWRceGY4XHhhZFx4NzdceDE0XHgzN1x4ZDJceDFhXHg5YSIKKyAgICAkRUNITyAtbmUgIlx4YzBceGYyXHg0OFx4YzZceDRjXHg4ZFx4ZDNceDhkXHhmMVx4ZDlceDJlXHgyY1x4ZGRceDdhXHg5OFx4M2MiCisgICAgJEVDSE8gLW5lICJceDI0XHg3Nlx4YjlceDlkXHgyN1x4Y2RceDcxXHg3ZFx4NmNceGM3XHgxZlx4MGFceDc0XHg4YVx4NmVceDU0IgorICAgICRFQ0hPIC1uZSAiXHhlY1x4NWFceGExXHg3N1x4NjBceDgwXHhlZlx4MDBceGE0XHg1Zlx4OWVceDhiXHgyZlx4MDJceDcyXHg5YyIKKyAgICAkRUNITyAtbmUgIlx4NDZceGQ4XHg3OVx4OTJceDRjXHg4Zlx4NGVceDM3XHhlZFx4MGNceDU4XHhhYlx4NDRceGVlXHgxZFx4ZDEiCisgICAgJEVDSE8gLW5lICJceGExXHhiMFx4YTVceDFmXHhhZlx4YjBceDM5XHgwMVx4MjZceGIyXHg0YVx4MjBceDY4XHg0YVx4MThceDIzIgorICAgICRFQ0hPIC1uZSAiXHhjM1x4MDNceDg0XHgyMlx4MThceGRiXHg2ZFx4ODNceDYwXHhjMVx4MTJceDA5XHgyMVx4ODRceDIyXHg0OCIKKyAgICAkRUNITyAtbmUgIlx4N2ZceDFlXHgxN1x4ZjVceGJlXHhjZVx4NGNceDRmXHg5Zlx4OWZceGVlXHhmNFx4ZmVceGVmXHg5YVx4MzQiCisgICAgJEVDSE8gLW5lICJceDkxXHg4Zlx4MzZceDFkXHhiY1x4NzNceGQ3XHhlYlx4YzhceDJlXHg4MVx4MjVceGZhXHgxOFx4NzZceDM1IgorICAgICRFQ0hPIC1uZSAiXHgxZlx4MTZceGRiXHgyMFx4NGJceDc0XHg2ZFx4OTRceDRlXHhlNVx4MzZceGVkXHhmNVx4NWRceDU5XHhhZiIKKyAgICAkRUNITyAtbmUgIlx4NDZceDcwXHhlYVx4MDNceGFjXHg1MFx4YmJceDI2XHhhYlx4MzlceDlhXHg0Ylx4NmJceDA5XHg4Y1x4NmQiCisgICAgJEVDSE8gLW5lICJceDM0XHhjZlx4ZWRceGFhXHhmN1x4NTZceDQwXHhmMlx4YWJceDA3XHhjYVx4MjJceDcxXHg5N1x4YzdceDM1IgorICAgICRFQ0hPIC1uZSAiXHhlOFx4MDZceDkwXHg3Ylx4ZWNceGMzXHg5Zlx4YTRceGRlXHhkOVx4ZGJceDQzXHhmMVx4ZDVceDA2XHg1OCIKKyAgICAkRUNITyAtbmUgIlx4NzJceDllXHgxZlx4MDhceGI2XHhjMlx4MDVceDBkXHgyNVx4ZmVceDdhXHg4NVx4ZTVceDEwXHgxMlx4NjgiCisgICAgJEVDSE8gLW5lICJceDE4XHg3ZVx4OGNceGEwXHhmYVx4YjRceGM0XHhjN1x4NGVceGE5XHhmMlx4MTNceGQ3XHhjMlx4NTJceGI1IgorICAgICRFQ0hPIC1uZSAiXHhlM1x4NzJceDM3XHgzMVx4MWVceDRmXHg5OVx4ZmRceGFjXHg5N1x4MDhceDg4XHg3MVx4ODhceGViXHgxYSIKKyAgICAkRUNITyAtbmUgIlx4ZjlceGExXHgxMFx4OWNceDQ0XHgwOFx4NTZceDRhXHg3N1x4YWFceDBmXHgxOVx4NWZceDVmXHhiM1x4OTUiCisgICAgJEVDSE8gLW5lICJceGVlXHg5Ylx4OWZceDViXHhiNVx4YzlceDBhXHhmNFx4MjhceDE2XHgyNVx4MzRceDZjXHg3Mlx4ZGFceDkyIgorICAgICRFQ0hPIC1uZSAiXHhiNFx4MmNceGJkXHg1ZVx4YjFceGU4XHhlNVx4MGZceDY4XHhmM1x4NDRceDhhXHhkNVx4ZmFceDczXHg1YyIKKyAgICAkRUNITyAtbmUgIlx4ODlceDJlXHg5OVx4N2RceGVkXHhlM1x4NWJceDNmXHg0OFx4OTdceGViXHhiNlx4NzZceDVjXHhhNVx4OWQiCisgICAgJEVDSE8gLW5lICJceGVmXHgxMlx4MWVceDQyXHg4OVx4NTJceGFkXHgyOFx4OTBceGU1XHgyYlx4ODhceGEwXHg0Zlx4MTFceDkyIgorICAgICRFQ0hPIC1uZSAiXHhjZFx4Y2NceDYzXHg0MFx4MWFceGM3XHgxMFx4MGNceDJmXHhjZFx4MDFceGYyXHgwN1x4MzhceGFjXHgxNCIKKyAgICAkRUNITyAtbmUgIlx4ZTVceDkwXHhjMFx4MzBceDIxXHhlMlx4ZTNceDcyXHgwZVx4M2VceDA0XHhjOFx4OWVceGE3XHgwMFx4ZGIiCisgICAgJEVDSE8gLW5lICJceDkxXHhkZFx4OWRceDgwXHhhNFx4NjlceDJhXHg0OFx4MzdceDk3XHhhNFx4MjZceDVkXHhhZVx4ODRceDFlIgorICAgICRFQ0hPIC1uZSAiXHg4OFx4ZjRceDgzXHgwNFx4MjRceGM5XHgxZlx4OTRceDYxXHgyNVx4ZjlceDgyXHhkZFx4ZWRceDJkXHg5NiIKKyAgICAkRUNITyAtbmUgIlx4YWRceDA2XHg0NVx4ZGRceDg4XHhkN1x4NTBceDQwXHgxNFx4ZGNceDdjXHhkYlx4MGZceDUzXHg5Nlx4MjciCisgICAgJEVDSE8gLW5lICJceGNiXHg2N1x4YWNceGE2XHhjMVx4MTVceDJmXHhjM1x4ZGJceDJjXHhjYVx4OTRceGIzXHhmM1x4ZDFceDZhIgorICAgICRFQ0hPIC1uZSAiXHhiYVx4MzRceDgzXHhkMVx4Y2NceDQwXHgzZVx4NzZceGExXHg2OVx4N2ZceDQ5XHgzM1x4ZGNceGE3XHgzYyIKKyAgICAkRUNITyAtbmUgIlx4NmFceDY3XHgxNVx4YWJceGRiXHg1Mlx4YTBceGI4XHhhNlx4MWVceGNlXHhlM1x4YWZceGY0XHhhMlx4NjIiCisgICAgJEVDSE8gLW5lICJceDM1XHgwZlx4MDNceDQwXHg4ZVx4MjBceDEyXHg5Y1x4YjZceDM0XHg3MVx4M2FceDE1XHg1ZFx4ZTVceDM0IgorICAgICRFQ0hPIC1uZSAiXHhhOFx4ZDRceDA1XHg5OVx4NmJceDlhXHhiNlx4NDFceDBiXHg3OFx4YzRceGQ4XHhkOVx4N2FceDY1XHhkYyIKKyAgICAkRUNITyAtbmUgIlx4ZGJceGUzXHg0Mlx4ZDVceDY2XHhmOVx4YjRceDgzXHg3ZVx4YzBceGY0XHgwMVx4YzRceGNjXHgzYlx4MGUiCisgICAgJEVDSE8gLW5lICJceDE1XHhkY1x4MTVceGMyXHgzZVx4MDRceDJmXHhmY1x4NmJceDcyXHhlYlx4ZjZceGFhXHgxNlx4MjBceGRlIgorICAgICRFQ0hPIC1uZSAiXHhkM1x4M2FceGIxXHgxMFx4YzZceDNjXHhlOFx4MmJceGI4XHhlYVx4ZGFceDE5XHg2ZVx4MzZceGFhXHhhNCIKKyAgICAkRUNITyAtbmUgIlx4MjNceDZkXHhhMFx4NDBceGQxXHg1YVx4MGJceDdlXHhhNFx4ZDVceDJkXHhjYlx4YTlceDE1XHgzNVx4YmEiCisgICAgJEVDSE8gLW5lICJceDkzXHg5Mlx4NDVceDQxXHhiMFx4MWFceGQxXHgxM1x4MzFceGI2XHg0NFx4OThceDc4XHgyOFx4MTVceGU0IgorICAgICRFQ0hPIC1uZSAiXHhhZVx4YmFceDU4XHhkMVx4NzVceDM2XHgzNFx4MWFceGQ4XHgyOFx4ZjFceDRhXHg0Y1x4YmNceDFiXHhhOCIKKyAgICAkRUNITyAtbmUgIlx4ZjdceDU3XHg5Mlx4YmNceGUyXHhiNVx4ZGFceGI2XHhhNlx4MWRceDgzXHgzN1x4OTZceDQzXHgyMFx4ODQiCisgICAgJEVDSE8gLW5lICJceGNiXHhiNlx4ZDlceDNmXHhlYlx4ZmFceGEwXHhmZVx4OWFceDdkXHhlZVx4NDdceDk4XHhjNFx4ZTdceGM0IgorICAgICRFQ0hPIC1uZSAiXHhiZFx4YzZceGYwXHg2ZFx4YjJceDI2XHgxMFx4MWVceDc4XHhlZlx4ZjNceDI4XHgzZVx4MzVceGU2XHhlNCIKKyAgICAkRUNITyAtbmUgIlx4ZTZceGYzXHgwZlx4MjZceDM0XHgxM1x4ODVceGQwXHhjZlx4NTVceDBmXHg4Ylx4ZDdceGU5XHhmNFx4ZGYiCisgICAgJEVDSE8gLW5lICJceDcwXHg2OFx4YzBceGI1XHgzMFx4M2NceGIxXHgwMVx4ZThceDI4XHhhZVx4ODBceDI2XHgwMVx4OGJceDE1IgorICAgICRFQ0hPIC1uZSAiXHgwZlx4ODBceDQ4XHgxOFx4NGJceGUyXHhlZFx4NTlceDkyXHgzMVx4Y2ZceGQyXHg4Zlx4NDJceGJmXHhlZSIKKyAgICAkRUNITyAtbmUgIlx4YmRceDA3XHg5MVx4MjRceGM2XHg2Nlx4NWVceDhjXHg5YVx4NDhceDYzXHhlN1x4YWNceDhhXHgxZVx4YzUiCisgICAgJEVDSE8gLW5lICJceDY5XHgxNlx4OGRceGFjXHg2N1x4ZGNceDc1XHg3NVx4ODJceGNhXHgxOVx4MjhceDM2XHg0ZFx4MTBceGY5IgorICAgICRFQ0hPIC1uZSAiXHg0MVx4Y2JceDE1XHgwNVx4NjRceGM3XHhiMFx4YzNceDY0XHhmM1x4NDhceDcxXHg2MFx4ZjJceGJkXHhjYyIKKyAgICAkRUNITyAtbmUgIlx4MzdceGIxXHgzNlx4YmNceGE3XHgyZVx4NmJceDIwXHgxMVx4NTFceDQyXHhlMVx4OGFceDI5XHhhY1x4NDQiCisgICAgJEVDSE8gLW5lICJceDhmXHg2M1x4NTZceDIzXHhkNFx4ZDRceDA3XHhiNFx4NjBceGE0XHhiOFx4Y2RceGVlXHg0OVx4YTVceDQyIgorICAgICRFQ0hPIC1uZSAiXHhjY1x4NTJceDAwXHg2Zlx4ZGNceDQ0XHgyMFx4NTdceDdkXHgzNlx4ZDdceDQ4XHgxYVx4MjJceDJjXHhkMCIKKyAgICAkRUNITyAtbmUgIlx4MTlceDQzXHg1MVx4NWVceDFjXHg4Y1x4NWZceDcwXHhjMlx4NmJceGNmXHhlYVx4ZDRceDk3XHg2MVx4NzIiCisgICAgJEVDSE8gLW5lICJceDMzXHhjM1x4OWFceGQ0XHgwNlx4ZjFceDhhXHg5YVx4ZmVceDIxXHg4M1x4MGJceGVhXHhmMVx4ZmFceDJjIgorICAgICRFQ0hPIC1uZSAiXHg1Mlx4MjNceDJjXHhiOFx4YzFceGU2XHhjOFx4OWRceDljXHg1Zlx4OGZceGYyXHg0YVx4ODZceDc2XHg5MiIKKyAgICAkRUNITyAtbmUgIlx4NzhceDBmXHg3ZFx4OWRceDA5XHgzOFx4Y2VceGUxXHg5YVx4ZjNceDYwXHhlZFx4NjVceDBiXHgxYVx4NjgiCisgICAgJEVDSE8gLW5lICJceGE2XHg1Mlx4MzlceDE4XHgxZVx4NDVceGUzXHg1ZFx4ZTBceDdkXHhmYlx4YzZceGNjXHg0NFx4MThceDkzIgorICAgICRFQ0hPIC1uZSAiXHhlOVx4NzFceGE4XHgxOFx4MGRceDc0XHg0OFx4OGFceDE4XHgwYlx4NjFceGJmXHhlMVx4YTlceDBlXHg0YyIKKyAgICAkRUNITyAtbmUgIlx4YWRceDFiXHhhZlx4MWFceDM3XHgzOVx4OTJceDRkXHhjY1x4OTZceDg3XHg0Nlx4MGRceDgzXHgwNlx4MzMiCisgICAgJEVDSE8gLW5lICJceDUzXHgzNVx4ZDlceDJjXHgzNlx4OThceDI4XHgxY1x4NTJceGIxXHg4OVx4NTVceDU2XHhjY1x4MzdceDIwIgorICAgICRFQ0hPIC1uZSAiXHg4OVx4ODRceDBlXHgzZFx4MjdceDJmXHhjNlx4ZmFceDc4XHgwNFx4ZTFceGQ1XHhjNlx4OTBceDQ5XHgxNiIKKyAgICAkRUNITyAtbmUgIlx4ZmVceDBhXHgxNlx4NmZceDExXHg1NFx4NDJceDIyXHhhMVx4OTBceDJkXHgxOVx4OTFceDI4XHgwNVx4ZjIiCisgICAgJEVDSE8gLW5lICJceDMwXHg2Y1x4MTRceDE2XHhkNlx4OGFceGNlXHhmNlx4Y2RceDdjXHg2NFx4NzZceDQyXHhlOVx4MjhceGU5IgorICAgICRFQ0hPIC1uZSAiXHgxY1x4ZDFceGI4XHg5ZVx4Y2RceDUzXHhiMlx4NmJceDhkXHg1N1x4NTdceDJhXHhiOFx4NTlceDU4XHg4YyIKKyAgICAkRUNITyAtbmUgIlx4ZDNceDEyXHg1N1x4YTZceGUzXHg0OFx4NzBceGY1XHg1NVx4MGZceDc2XHhiNVx4MjdceDA4XHhkMVx4YTAiCisgICAgJEVDSE8gLW5lICJceGY4XHg2MFx4MDlceGExXHhmMlx4MzBceDQzXHg0YVx4MzBceDQ2XHhmN1x4OTZceDE5XHhlOVx4M2FceDQ0IgorICAgICRFQ0hPIC1uZSAiXHhjMFx4ZDhceGE4XHg1MVx4YWVceDUwXHg5Mlx4ODFceDgxXHhkYVx4MTBceGQzXHgxOFx4NjJceDk0XHhkMCIKKyAgICAkRUNITyAtbmUgIlx4OWVceDU0XHgwYlx4MjJceGNjXHhkMFx4ZmVceDBjXHgzNlx4NDRceDRkXHg0ZFx4NDBceDVjXHhhOFx4MzUiCisgICAgJEVDSE8gLW5lICJceGI2XHg1M1x4OWNceDM2XHg5Y1x4NWFceDBlXHgwZVx4YjBceDVjXHgyOVx4MmFceDM1XHg2Nlx4YWFceDNhIgorICAgICRFQ0hPIC1uZSAiXHhjYlx4MjNceDdiXHhiYlx4YzhceDYwXHhiY1x4YjRceDI4XHhmNFx4NmVceGZlXHg4Nlx4ZmNceDE2XHg4NSIKKyAgICAkRUNITyAtbmUgIlx4MGNceGUwXHgxZFx4Y2ZceGZkXHgxMlx4MjhceGM2XHg2MFx4ZDBceGU2XHgyZlx4NzZceGYwXHgxYVx4NWIiCisgICAgJEVDSE8gLW5lICJceGZhXHhhNlx4YzZceGVhXHg1OFx4YmJceDI2XHgzN1x4ODRceGRkXHg4NVx4ZDVceDM3XHg4Mlx4NzZceGQ5IgorICAgICRFQ0hPIC1uZSAiXHgxNFx4N2FceGNhXHhlZFx4MTNceDcyXHhjM1x4ZTFceGI5XHg2OVx4NDVceGQ0XHhlY1x4NDRceDk0XHgyNiIKKyAgICAkRUNITyAtbmUgIlx4OGVceDBiXHg5MFx4YjZceDhiXHgxZlx4MWVceDAxXHg5Nlx4NWFceGI5XHg1MVx4YTZceDI3XHhhMlx4OWIiCisgICAgJEVDSE8gLW5lICJceDM4XHhkOVx4MjVceDMyXHg5Ylx4NTRceGZjXHg0NVx4ZDFceGE4XHg1OVx4MzVceDFhXHhiMFx4YjJceDFhIgorICAgICRFQ0hPIC1uZSAiXHhjOFx4ODhceDE1XHg0Mlx4OThceDUwXHg5OVx4MTJceDllXHhmNVx4NTlceGIyXHg1Y1x4YzVceGE3XHgzNCIKKyAgICAkRUNITyAtbmUgIlx4MzVceGNhXHhiM1x4ZWRceGRjXHhjOVx4OWZceDNlXHg3N1x4OGZceDZjXHhkZVx4YzhceDQxXHg2YVx4YzUiCisgICAgJEVDSE8gLW5lICJceDI0XHg4NVx4MDRceGExXHgyZlx4ZTNceDQ3XHg4Y1x4NDdceGQ0XHhkYlx4NzRceDhjXHhiNlx4NGNceGVmIgorICAgICRFQ0hPIC1uZSAiXHhlZFx4YWRceDlmXHg4Nlx4MzFceGQ4XHhjOFx4MDdceGM1XHgxMVx4MWNceDM5XHgzYVx4ZjhceDc1XHg3MyIKKyAgICAkRUNITyAtbmUgIlx4YWVceDc4XHg3ZFx4MWRceDM2XHg1Ylx4ZDFceDIzXHg1ZFx4ODRceDE3XHg1ZFx4NGJceGFjXHhkM1x4NzAiCisgICAgJEVDSE8gLW5lICJceDhhXHg4M1x4NDhceDQ4XHg4M1x4N2JceDVjXHg5OVx4OWVceDU2XHhiYlx4ZmNceDBjXHg0Ylx4MDRceGNmIgorICAgICRFQ0hPIC1uZSAiXHg4M1x4NWRceGY4XHgzMVx4MmNceGM0XHg1Y1x4YTFceDY4XHg2YVx4NTZceGUxXHg3Zlx4YmVceGQ2XHg1OSIKKyAgICAkRUNITyAtbmUgIlx4NmNceDU1XHhiMFx4NjNceDQxXHhlYlx4ODhceDY5XHhiNlx4OWJceDUwXHhjNFx4MzFceGVhXHhiMFx4ZDciCisgICAgJEVDSE8gLW5lICJceGUyXHhmYlx4N2JceGViXHhiYlx4NTJceGM0XHg5N1x4MjNceGU5XHgxNlx4MjlceDE4XHg1MFx4NGRceDBlIgorICAgICRFQ0hPIC1uZSAiXHg2OFx4NjJceGZiXHgzZlx4ZDlceDA3XHhiOVx4ODlceDRkXHg1OFx4N2NceDMyXHg2ZFx4MTJceDNlXHg5YiIKKyAgICAkRUNITyAtbmUgIlx4M2FceDE0XHhlZVx4YWNceDNjXHg4ZFx4MDlceDYyXHgzMFx4OGVceGUwXHg4Nlx4ODRceGI5XHhmM1x4MGQiCisgICAgJEVDSE8gLW5lICJceGY4XHhhZFx4NDJceGE2XHhiYlx4N2RceGQxXHhmMlx4ZjNceGMwXHhlMlx4MzJceGM0XHg0MFx4YWFceDhhIgorICAgICRFQ0hPIC1uZSAiXHgyYVx4ZTlceGE5XHg0NVx4ODNceDIzXHhmNlx4OTBceDA1XHgyNFx4NTlceDIyXHg4NFx4NTBceDgyXHhjMCIKKyAgICAkRUNITyAtbmUgIlx4NThceDQxXHg0Mlx4MThceDkxXHgzZFx4ZDhceDgwXHhiMVx4MjZceDY4XHhiMlx4YThceGMwXHgyMVx4MTQiCisgICAgJEVDSE8gLW5lICJceDE4XHhkZlx4M2FceDg2XHgyNVx4ODVceDU2XHhhYlx4MjBceDM4XHhjZFx4ZGNceDk4XHg2ZVx4MDdceGM0IgorICAgICRFQ0hPIC1uZSAiXHg2Ylx4MTZceDU1XHhlMFx4NDFceGUwXHg0MVx4ZGFceDI5XHg2Mlx4OGRceGJhXHhjZVx4YTJceGNiXHhmYyIKKyAgICAkRUNITyAtbmUgIlx4NzBceDc4XHg5OVx4ZjlceDE2XHgwYlx4NWFceDBjXHhjNVx4YWRceDE4XHhlYlx4ZjBceGI1XHhjOVx4MjUiCisgICAgJEVDSE8gLW5lICJceDgyXHgxNlx4ZTBceDVkXHhjMVx4YzRceGM2XHhmMFx4ODRceDZhXHg0NVx4N2RceGRiXHgyOFx4NDZceGFiIgorICAgICRFQ0hPIC1uZSAiXHhlZlx4MzJceGM5XHg0OVx4NTBceDUxXHg2MFx4NzdceDFjXHhmZFx4NThceDljXHgwMVx4M2JceDdhXHhmYSIKKyAgICAkRUNITyAtbmUgIlx4NDlceDQ3XHgzZVx4ODdceDFjXHgzOVx4YTZceDZhXHhhNFx4YjdceDM5XHg5M1x4YWNceGFjXHhiMFx4MzkiCisgICAgJEVDSE8gLW5lICJceDJmXHhiY1x4YWJceDliXHg1Mlx4OTZceDI0XHg0Nlx4YzFceDk1XHhlNFx4MzFceDg5XHgzN1x4MThceGM4IgorICAgICRFQ0hPIC1uZSAiXHgyY1x4MjJceDMyXHgyYVx4OGZceGI2XHg1OFx4NzdceDU3XHg3N1x4MmZceDA5XHhkMFx4N2NceGVkXHg3NCIKKyAgICAkRUNITyAtbmUgIlx4YWFceDdjXHg4Nlx4MjVceDQ1XHgwY1x4NDNceDRkXHgzMVx4YjBceDYzXHg0MFx4Y2ZceDg2XHhmZVx4NzUiCisgICAgJEVDSE8gLW5lICJceDc2XHhlMFx4ZWVceDk5XHhiNVx4NzFceGUyXHg0ZVx4ZTVceGMxXHhmOVx4MmVceDQ4XHhlMlx4YTZceDFiIgorICAgICRFQ0hPIC1uZSAiXHgyOFx4YTVceGEzXHhiZVx4ZmZceDM3XHhkMVx4ZGRceDY2XHhhMlx4ZThceGQzXHg4OFx4NGRceDEzXHhkNSIKKyAgICAkRUNITyAtbmUgIlx4NjhceDUxXHgyN1x4NDFceGMzXHg2Y1x4MWJceDQ4XHg2N1x4NmFceGRmXHgyNVx4MmFceDQwXHhhMVx4ODciCisgICAgJEVDSE8gLW5lICJceDFkXHg1NFx4YjdceGUzXHg5MVx4YzJceDZiXHg1Ylx4YjlceDhjXHhkNVx4MTBceDExXHgxMFx4MTZceGFiIgorICAgICRFQ0hPIC1uZSAiXHg2Ylx4YmVceDY1XHg2Ylx4NzNceGE3XHgzNVx4YTFceDA5XHg2MFx4NjBceGVkXHg5Nlx4MzlceGM5XHg0MCIKKyAgICAkRUNITyAtbmUgIlx4NWRceGRjXHhlZVx4NjBceDQ5XHgwY1x4NjhceDE4XHgzNFx4YjJceDZmXHgyYVx4OTVceDE0XHgyOVx4OTUiCisgICAgJEVDSE8gLW5lICJceDViXHg1OVx4ZDJceDFmXHg2M1x4MmFceGJlXHhmZFx4YWVceDA5XHg1Y1x4ZWVceDExXHhiNVx4MjlceDM2IgorICAgICRFQ0hPIC1uZSAiXHhjYVx4ZGZceDI4XHg4Y1x4NjVceDQyXHg0Nlx4NzRceDBjXHgzOVx4NjhceDMwXHhhY1x4MmNceDJmXHhkMCIKKyAgICAkRUNITyAtbmUgIlx4OWJceGIzXHg5Mlx4MTlceDkwXHhhMVx4MDdceGNjXHhmNlx4ZGVceDY0XHg1Zlx4NmZceGQ3XHhiNlx4Y2MiCisgICAgJEVDSE8gLW5lICJceGUwXHg3MFx4MGZceDBiXHhkMlx4MGVceDc3XHhhMVx4NzBceGUzXHg1Nlx4OTBceDRiXHgyOFx4NThceGQwIgorICAgICRFQ0hPIC1uZSAiXHhkMVx4ZTFceDlkXHgxOFx4OThceGJhXHg2Ylx4MzZceDU0XHhhOVx4NTRceDA5XHg2M1x4NDlceDE4XHg1NSIKKyAgICAkRUNITyAtbmUgIlx4NjBceGJhXHgxMVx4YjFceDBhXHgxNFx4NDVceDFmXHhhZVx4MDhceDUwXHgwOVx4MzNceDAwXHhhMlx4YjIiCisgICAgJEVDSE8gLW5lICJceDcxXHg4MVx4NzVceDg5XHhiN1x4YjlceDBjXHg3M1x4YzBceDRjXHgzMlx4ODlceDcyXHhhY1x4YTlceGEzIgorICAgICRFQ0hPIC1uZSAiXHg0N1x4NWZceDdkXHg0ZVx4MWJceDRkXHhiOVx4ZWFceDg0XHg0NVx4MDBceDM3XHgzY1x4YjNceDdiXHhmOCIKKyAgICAkRUNITyAtbmUgIlx4ZTdceDBmXHhhYVx4MzNceDFhXHg5Ylx4YzJceDBjXHgzNVx4OGFceGQ0XHgwNFx4NDZceDQyXHhjYlx4YWIiCisgICAgJEVDSE8gLW5lICJceGFhXHhjN1x4ZTVceGM5XHgyMFx4NmVceDIxXHhhNlx4OGNceGVkXHg2MVx4ODZceDQyXHg4N1x4MDNceDI1IgorICAgICRFQ0hPIC1uZSAiXHhkZVx4MmNceDRhXHg4NVx4Y2JceGI0XHgzNlx4YzlceGQ0XHg3Mlx4NjBceDYyXHhjMlx4MTlceGQwXHgzMCIKKyAgICAkRUNITyAtbmUgIlx4MTZceDZkXHg1OFx4NjFceDYyXHgxNlx4ZThceGQyXHgwZVx4ZDBceGYzXHhkYlx4NTNceDM3XHgwN1x4MzciCisgICAgJEVDSE8gLW5lICJceDQwXHhjM1x4ZTVceDViXHg5ZFx4MTZceDQ1XHg2MFx4OGVceGZiXHgxMlx4YzRceDVmXHg5Zlx4ZGRceGUxIgorICAgICRFQ0hPIC1uZSAiXHg0NVx4NWRceDQ1XHgzNlx4MjFceGEwXHhjMFx4YjhceDExXHg5OFx4MGZceDY0XHg5OFx4NjdceDFjXHgxMSIKKyAgICAkRUNITyAtbmUgIlx4YTlceGExXHg2NVx4MTBceGI5XHgyMlx4MTJceDkxXHgxMFx4OWJceDEwXHg2Zlx4OTVceDJlXHgzNFx4OTEiCisgICAgJEVDSE8gLW5lICJceDY0XHg4Mlx4YTRceDA1XHgwMlx4ZmNceDRhXHg5Zlx4OWNceDRkXHg2Y1x4OGRceDY3XHgyNlx4OTBceDYzIgorICAgICRFQ0hPIC1uZSAiXHgwNFx4MTJceDZmXHgwZVx4NTVceDNjXHg4ZVx4ZjJceDhkXHhiNFx4NmJceDNkXHhhY1x4Y2ZceDg0XHgyZSIKKyAgICAkRUNITyAtbmUgIlx4NjBceDBmXHg0MFx4NjJceDg4XHgzYVx4Y2ZceGJkXHhlYVx4YWRceDQwXHg0Y1x4MjlceGUxXHhiNVx4YjYiCisgICAgJEVDSE8gLW5lICJceDNlXHgxNVx4ODZceGQ1XHhiZVx4YWRceDI3XHhkZVx4MmJceDMyXHhlZlx4Y2ZceDk3XHg4OFx4OGJceDE3IgorICAgICRFQ0hPIC1uZSAiXHg4MFx4NDNceDBlXHgyMFx4NzlceDNiXHgzNlx4NzNceGI4XHhhZFx4MTJceDBlXHg4N1x4NTlceDVmXHhkMyIKKyAgICAkRUNITyAtbmUgIlx4M2NceDhjXHg4NFx4YzhceDU0XHgyYlx4OTRceGM5XHgyZVx4MzZceDhiXHgzMlx4NDhceGYxXHhlM1x4MDgiCisgICAgJEVDSE8gLW5lICJceGYwXHgzNlx4YzBceGI4XHhjMlx4YTJceGE5XHhlMlx4NTJceDAyXHhmMVx4OWJceGNiXHhkZVx4Y2NceGI1IgorICAgICRFQ0hPIC1uZSAiXHg1YVx4NmNceDA1XHgwNlx4MzFceDQ0XHg0MVx4ODhceGEzXHgwNVx4MDRceDE2XHgwZFx4NGFceDg1XHgyMCIKKyAgICAkRUNITyAtbmUgIlx4NzlceGRhXHg4OVx4ODJceDFkXHg1Zlx4NWFceDExXHg4OFx4ODlceDA2XHgwNVx4ZjVceGY0XHhlZFx4NzUiCisgICAgJEVDSE8gLW5lICJceDYyXHgzOVx4MzdceDY5XHgxMVx4MzJceDNlXHg4ZFx4ZTRceDYwXHg2Mlx4NTJceGM5XHhhZFx4ODJceDlhIgorICAgICRFQ0hPIC1uZSAiXHg5YVx4MmZceDA2XHg0MVx4MjZceGI0XHg0OFx4NzBceDM5XHgyYlx4OGFceGIxXHg1YVx4NTNceGM2XHg0OCIKKyAgICAkRUNITyAtbmUgIlx4NTdceDE3XHhmNVx4ZDhceDVhXHhjNlx4MTlceDgzXHgwNlx4MGJceDliXHgwNFx4YjhceGY1XHhhZlx4MjMiCisgICAgJEVDSE8gLW5lICJceDQ1XHg4N1x4NDhceDUwXHg2ZFx4MTZceGVhXHhiNFx4MjBceGI4XHg0OVx4OTJceDZiXHgwY1x4NzZceDE0IgorICAgICRFQ0hPIC1uZSAiXHg0OFx4NTNceGExXHgyOVx4NzRceGY2XHhkN1x4NDlceDQ0XHgzOVx4YmFceGJkXHg2M1x4YTZceGYyXHg4MSIKKyAgICAkRUNITyAtbmUgIlx4OGZceDViXHg1ZVx4NDZceDBhXHgzNFx4OTVceDMxXHhjMFx4ZGRceDYwXHg1MFx4ZDZceDBhXHhhNlx4MjkiCisgICAgJEVDSE8gLW5lICJceDNkXHgzNlx4M2FceGM3XHhiOFx4Y2ZceDI1XHg1ZVx4ZjdceDgyXHg1NVx4ODhceGMyXHg4Ylx4MzBceGQyIgorICAgICRFQ0hPIC1uZSAiXHg5N1x4OTBceDQ5XHg5NFx4ZGVceGU1XHhhYVx4ZWJceDQyXHg4Y1x4OTRceDJhXHhhMFx4MGRceDliXHhiNSIKKyAgICAkRUNITyAtbmUgIlx4NTlceGJlXHhjYlx4MzVceGEzXHgzN1x4NTRceDc2XHgzNVx4OThceGNiXHgxZlx4MTNceDNmXHg0YVx4ZDEiCisgICAgJEVDSE8gLW5lICJceDQ1XHg4N1x4NjdceGVkXHg2Nlx4MDJceDA2XHg0OVx4MWNceDU5XHg1MVx4MWZceDRkXHg4NVx4MDNceDQ2IgorICAgICRFQ0hPIC1uZSAiXHg2NVx4ODZceDRlXHg0Y1x4NmFceGQyXHgyNFx4MzFceDViXHg2YVx4M2JceDE5XHg0OVx4ZTFceDgzXHgxNCIKKyAgICAkRUNITyAtbmUgIlx4YzFceGYwXHg1Nlx4NjFceDkzXHg4Ylx4MzNceDEzXHg1NFx4NmZceDc4XHg0Y1x4YTBceDg1XHhmMFx4YjMiCisgICAgJEVDSE8gLW5lICJceDE3XHhhYVx4ZjJceDY3XHgwMlx4MGNceDMxXHhlZFx4NWVceDk4XHgwMlx4MjhceGM0XHhlNVx4ODdceGEyIgorICAgICRFQ0hPIC1uZSAiXHg3MFx4ZDFceGQ1XHg5Y1x4ZjhceGVjXHgxOVx4ODhceGE5XHgwZFx4MGVceDRhXHhlM1x4NDdceDgzXHg2ZSIKKyAgICAkRUNITyAtbmUgIlx4ZjdceDcwXHgzZVx4YTRceGE5XHhjMFx4NGNceGZhXHgyYlx4M2JceGQ3XHg2Zlx4OTZceGMzXHg2ZFx4NmQiCisgICAgJEVDSE8gLW5lICJceDcxXHgyYVx4OGRceDYyXHhmMVx4ZDNceGRkXHhiMFx4MzNceGQ0XHg2N1x4MTlceDBkXHgzMFx4ODVceDNhIgorICAgICRFQ0hPIC1uZSAiXHgwNlx4MDRceDg1XHgwMFx4NDhceDVkXHg1M1x4MzVceGEwXHgzMVx4NTZceDg0XHg4Mlx4YTVceGFjXHgyMiIKKyAgICAkRUNITyAtbmUgIlx4MDJceDQ0XHhhZlx4NmRceGMwXHg2MVx4NTlceDIzXHg5Nlx4NzJceDVhXHg4MVx4OWVceDBjXHhlNVx4NzkiCisgICAgJEVDSE8gLW5lICJceGRhXHhkMFx4NDJceDVjXHg4OVx4YTVceDAwXHhlY1x4NTZceDQxXHg2NFx4OGFceDExXHg2MFx4NzlceGIxIgorICAgICRFQ0hPIC1uZSAiXHhlZFx4NTVceDE2XHg1NFx4ZTZceDUxXHgwM1x4MzRceDE0XHg2MFx4MzFceGQyXHhmMFx4MGJceGNlXHhmMiIKKyAgICAkRUNITyAtbmUgIlx4NGVceDRjXHg0NVx4OGNceGViXHgyYVx4ODJceDNhXHhhOFx4NTJceGNlXHg4Zlx4NGVceGYxXHg4OVx4ZWEiCisgICAgJEVDSE8gLW5lICJceDQ0XHg5MVx4NjZceGRkXHg2Ylx4NDlceGEzXHg4M1x4MGJceDE5XHgwZVx4NjZceDVmXHgwMlx4MjJceDU4IgorICAgICRFQ0hPIC1uZSAiXHhlN1x4YzBceGE4XHhjZVx4NTVceDQ4XHhhNlx4MDRceGYzXHgwM1x4YWNceDYyXHhiMlx4YzBceGFhXHhhMCIKKyAgICAkRUNITyAtbmUgIlx4MDlceGFlXHg1Ylx4OTZceGQwXHhkZFx4YTlceDFmXHhmYlx4MmRceDNkXHhmNVx4MDJceGUxXHg4Nlx4MDIiCisgICAgJEVDSE8gLW5lICJceDNlXHhkYVx4ZDBceDVkXHhiYVx4MTZceDM5XHhjZFx4NzVceGEyXHg0N1x4MjZceDc0XHgyNVx4YThceDVlIgorICAgICRFQ0hPIC1uZSAiXHhmM1x4MzZceDBjXHgzN1x4MTlceDE3XHgwNlx4NjZceGQwXHgwYlx4NDJceDQxXHgwYVx4YTBceGRlXHg5MyIKKyAgICAkRUNITyAtbmUgIlx4ZDdceGI0XHg5Zlx4ZmJceGM3XHg0Zlx4NjVceDU0XHhkYVx4YjhceDhiXHgyM1x4ZGVceDljXHg1N1x4Y2YiCisgICAgJEVDSE8gLW5lICJceDJkXHgyYVx4MTJceGRhXHhjY1x4ZjZceDczXHg4M1x4MDJceDRjXHgwZVx4NDJceDg4XHhkYVx4MjdceGI5IgorICAgICRFQ0hPIC1uZSAiXHhjYlx4MDRceGI2XHgwN1x4MjZceDc4XHhhMVx4YTFceDA5XHhhM1x4NmFceDg2XHhiZFx4OWRceGQ0XHhmOSIKKyAgICAkRUNITyAtbmUgIlx4YzBceDgxXHhhNlx4NDlceGE5XHg3Mlx4ZWJceDU2XHhiZFx4ZjlceGVhXHg4OVx4NGZceGFlXHg3Mlx4MjgiCisgICAgJEVDSE8gLW5lICJceGI2XHg1N1x4MzVceGJlXHg5NFx4YWRceGMwXHhmZlx4MWVceGYyXHgzNVx4MjRceGEwXHg0NVx4ZDVceDA5IgorICAgICRFQ0hPIC1uZSAiXHhjMFx4ZTBceDEwXHhkMFx4MTdceDkwXHhlMlx4ZmZceDhiXHhiOVx4MjJceDljXHgyOFx4NDhceDA5XHg2OCIKKyAgICAkRUNITyAtbmUgIlx4YzNceDE4XHgwMCIKK30KKwordGFyMl9iejIoKQoreworICAgICRFQ0hPIC1uZSAiXHg0Mlx4NWFceDY4XHgzOVx4MzFceDQxXHg1OVx4MjZceDUzXHg1OVx4MTZceDA4XHhmZFx4NjBceDAwXHgwMCIKKyAgICAkRUNITyAtbmUgIlx4MDFceGZmXHg4MFx4NDhceDgwXHgwMFx4YTBceDQwXHgwM1x4ZmZceGMwXHg3Mlx4MDBceDg5XHg0MFx4ZmYiCisgICAgJEVDSE8gLW5lICJceGU3XHhkZlx4YzBceDIwXHgwMFx4OTJceDExXHg1M1x4ZjVceDEzXHhkM1x4NTNceDdhXHg0MVx4YThceGYyIgorICAgICRFQ0hPIC1uZSAiXHg5YVx4NjBceDIxXHg5YVx4NDBceGY0XHg5Ylx4ZDJceDBkXHgwOVx4YTVceDNjXHhhNlx4NGZceDQ0XHhmNSIKKyAgICAkRUNITyAtbmUgIlx4MzRceDM0XHhkMVx4YjVceDAxXHhhMFx4M2RceDQxXHhhNFx4ZTFceGViXHg0Y1x4NWFceDAxXHg0N1x4M2IiCisgICAgJEVDSE8gLW5lICJceGQxXHg2N1x4MWFceDRjXHgzYlx4MjFceDg0XHgyM1x4MmNceDVjXHhmN1x4ZTBceGJkXHgyYVx4YTRceGVhIgorICAgICRFQ0hPIC1uZSAiXHhkY1x4ZGJceDcxXHg4MFx4MjZceDk4XHgyMVx4MGVceDc2XHgyMVx4MzBceGNlXHhlNFx4YWRceDhjXHhiNSIKKyAgICAkRUNITyAtbmUgIlx4NjhceDYyXHgzNVx4YTFceGZkXHg4ZVx4N2JceDUxXHg3MFx4OTZceGIxXHgyY1x4YTJceDk5XHg2Y1x4YTEiCisgICAgJEVDSE8gLW5lICJceGMyXHhjZFx4ZWFceGE3XHg1ZVx4NmJceDkxXHg0Zlx4NzNceDk2XHhlNFx4NDhceDNjXHhlN1x4OGNceDBmIgorICAgICRFQ0hPIC1uZSAiXHgwM1x4NjRceDViXHg3YVx4NDNceGMxXHg2OFx4ODZceDQxXHg4M1x4NDZceDBiXHhiYVx4YWFceDZhXHg5YiIKKyAgICAkRUNITyAtbmUgIlx4NTlceDM0XHhmMVx4MWNceDA4XHg2OVx4MWRceDQxXHhmYlx4NGFceDk2XHgxYlx4MTRceDllXHgzMlx4ODkiCisgICAgJEVDSE8gLW5lICJceDY5XHg1Zlx4NjNceDlhXHgyMlx4ZTRceDk2XHgzNFx4ZmZceDEyXHgyMFx4ZDBceDI1XHg3MFx4ZGNceDVkIgorICAgICRFQ0hPIC1uZSAiXHhjOVx4MTRceGUxXHg0Mlx4NDBceDU4XHgyM1x4ZjVceDgwIgorfQorCisjIE5COiB0YXIgZW1pdHMgInRhcjogc2hvcnQgcmVhZCIgb24gc3RkZXJyIGJlY2F1c2UgdGhlc2UgdGVzdCB0YXJzIGFyZQorIyBhbHNvIGxhY2tpbmcgcHJvcGVyIHRlcm1pbmF0aW5nIHplcm9lZCBibG9ja3MuIEJ1dCBleGl0Y29kZSBpcyAwLgorIyBUaGlzIGlzIGludGVuZGVkLgorCitleHBvcnQgVFo9VVRDLTEKKworIyBDYXNlIDE6IGxvbmcgbmFtZSwgd2l0aCBwYXRoIGluIHByZWZpeCBmaWVsZAorcmVzMT0nLXJ3LXItLXItLSBmbTMvdXNlcnMgICAgICA5ODY5IDIwMDctMDMtMTIgMTA6NDQ6NTQgVmlydHVhbEJveC0xLjUuNl9PU0Uvc3JjL2xpYnMveHBjb20xOGE0L2lwYy9pcGNkL2V4dGVuc2lvbnMvdHJhbnNtbmdyL3B1YmxpYy9pcGNJVHJhbnNhY3Rpb25TZXJ2aWNlLmlkbCcKK3Q9YHRhcjFfYnoyIHwgYnVuemlwMiB8IGJ1c3lib3ggdGFyIHR2ZiAtYAordGVzdCB4IiRyZXMxIiA9IHgiJHQiCit0PWB0YXIxX2J6MiB8IGJ1bnppcDIgfCBidXN5Ym94IHRhciB0dmAKK3Rlc3QgeCIkcmVzMSIgPSB4IiR0IgorCisjIENhc2UgMjogbG9uZyBkaXIgbmFtZSwgd2l0aCBFTlRJUkUgcGF0aCBpbiBwcmVmaXggZmllbGQgKG5hbWUgPSAiIikKK3JlczI9J2Ryd3hyLXhyLXggZm0zL3VzZXJzICAgICAgICAgMCAyMDA4LTAyLTE5IDE2OjMzOjIwIFZpcnR1YWxCb3gtMS41LjZfT1NFL3NyYy9WQm94L0FkZGl0aW9ucy9saW51eC94MTFpbmNsdWRlLzQuMy9wcm9ncmFtcy9Yc2VydmVyL2h3L3hmcmVlODYveGYyNF8zMmJwcC8nCit0PWB0YXIyX2J6MiB8IGJ1bnppcDIgfCBidXN5Ym94IHRhciB0dmYgLWAKK3Rlc3QgeCIkcmVzMiIgPSB4IiR0IgordD1gdGFyMl9iejIgfCBidW56aXAyIHwgYnVzeWJveCB0YXIgdHZgCit0ZXN0IHgiJHJlczIiID0geCIkdCIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90YXNrc2V0LnRlc3RzIGIvdGVzdHN1aXRlL3Rhc2tzZXQudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2ZiNWM5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90YXNrc2V0LnRlc3RzCkBAIC0wLDAgKzEsMTYgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgMjAwNiBCZXJuaGFyZCBSZXV0bmVyLUZpc2NoZXIKKyMgTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKworLiAuL3Rlc3Rpbmcuc2gKK2E9InRhc2tzZXQiCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAgICAgICAgICAgICAgIm9wdHMiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucCIgInN0ZGluIgordGVzdGluZyAidGFza3NldCAoZ2V0IGZyb20gcGlkIDEpIiAiJGEgLXAgMSA+L2Rldi9udWxsO2VjaG8gXCQ/IiAiMFxuIiAiIiAiIgordGVzdGluZyAidGFza3NldCAoaW52YWxpZCBwaWQpIiAgICAiJGEgLXAgMCA+L2Rldi9udWxsIDI+JjE7ZWNobyBcJD8iICIxXG4iICIiICIiCit0ZXN0aW5nICJ0YXNrc2V0IChzZXRfYWZmLCBuZWVkcyBDQVBfU1lTX05JQ0UpIiBcCisJIiRhIDB4MSAkU0hFTEwgLWMgJyRhIC1wIFwkXCQgfCBncmVwIFwiY3VycmVudCBhZmZpbml0eSBtYXNrOiAxXCIgPi9kZXYvbnVsbCc7IGVjaG8gXCQ/IiBcCisJIjBcbiIgIiIgIiIKKwordW5zZXQgYQorZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdGVlL3RlZS1hcHBlbmRzLWlucHV0IGIvdGVzdHN1aXRlL3RlZS90ZWUtYXBwZW5kcy1pbnB1dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmYyMGJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3RlZS90ZWUtYXBwZW5kcy1pbnB1dApAQCAtMCwwICsxLDUgQEAKK2VjaG8gaVwnbSBhIGxpdHRsZSB0ZWFwb3QgPmZvbworY3AgZm9vIGJhcgorZWNobyBpXCdtIGEgbGl0dGxlIHRlYXBvdCA+PmZvbworZWNobyBpXCdtIGEgbGl0dGxlIHRlYXBvdCB8IGJ1c3lib3ggdGVlIC1hIGJhciA+L2Rldi9udWxsCitjbXAgZm9vIGJhcgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3RlZS90ZWUtdGVlcy1pbnB1dCBiL3Rlc3RzdWl0ZS90ZWUvdGVlLXRlZXMtaW5wdXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZlMjE3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90ZWUvdGVlLXRlZXMtaW5wdXQKQEAgLTAsMCArMSwzIEBACitlY2hvIGlcJ20gYSBsaXR0bGUgdGVhcG90ID5mb28KK2VjaG8gaVwnbSBhIGxpdHRsZSB0ZWFwb3QgfCBidXN5Ym94IHRlZSBiYXIgPmJhegorY21wIGZvbyBiYXIgJiYgY21wIGZvbyBiYXoKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90ZXN0LnRlc3RzIGIvdGVzdHN1aXRlL3Rlc3QudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uMWMyZWRhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90ZXN0LnRlc3RzCkBAIC0wLDAgKzEsOTkgQEAKKyMhL2Jpbi9zaAorCisjIENvcHlyaWdodCAyMDA3IGJ5IERlbnlzIFZsYXNlbmtvIDx2ZGEubGludXhAZ29vZ2xlbWFpbC5jb20+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAiY29tbWFuZCIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKyMgICBmaWxlIGlucHV0IHdpbGwgYmUgZmlsZSBjYWxsZWQgImlucHV0IgorIyAgIHRlc3QgY2FuIGNyZWF0ZSBhIGZpbGUgImFjdHVhbCIgaW5zdGVhZCBvZiB3cml0aW5nIHRvIHN0ZG91dAorCisjIE5lZWQgdG8gY2FsbCAnYnVzeWJveCB0ZXN0Jywgb3RoZXJ3aXNlIHNoZWxsIGJ1aWx0aW4gaXMgdXNlZAorCit0ZXN0aW5nICJ0ZXN0OiBzaG91bGQgYmUgZmFsc2UgKDEpIiBcCisJImJ1c3lib3ggdGVzdDsgZWNobyBcJD8iIFwKKwkiMVxuIiBcCisJIiIgIiIKKwordGVzdGluZyAidGVzdCAnJzogc2hvdWxkIGJlIGZhbHNlICgxKSIgXAorCSJidXN5Ym94IHRlc3QgJyc7IGVjaG8gXCQ/IiBcCisJIjFcbiIgXAorCSIiICIiCisKK3Rlc3RpbmcgInRlc3QgITogc2hvdWxkIGJlIHRydWUgKDApIiBcCisJImJ1c3lib3ggdGVzdCAhOyBlY2hvIFwkPyIgXAorCSIwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJ0ZXN0IGE6IHNob3VsZCBiZSB0cnVlICgwKSIgXAorCSJidXN5Ym94IHRlc3QgYTsgZWNobyBcJD8iIFwKKwkiMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAidGVzdCAtLWhlbHA6IHNob3VsZCBiZSB0cnVlICgwKSIgXAorCSJidXN5Ym94IHRlc3QgLS1oZWxwOyBlY2hvIFwkPyIgXAorCSIwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJ0ZXN0IC1mOiBzaG91bGQgYmUgdHJ1ZSAoMCkiIFwKKwkiYnVzeWJveCB0ZXN0IC1mOyBlY2hvIFwkPyIgXAorCSIwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJ0ZXN0ICEgLWY6IHNob3VsZCBiZSBmYWxzZSAoMSkiIFwKKwkiYnVzeWJveCB0ZXN0ICEgLWY7IGVjaG8gXCQ/IiBcCisJIjFcbiIgXAorCSIiICIiCisKK3Rlc3RpbmcgInRlc3QgYSA9IGE6IHNob3VsZCBiZSB0cnVlICgwKSIgXAorCSJidXN5Ym94IHRlc3QgYSA9IGE7IGVjaG8gXCQ/IiBcCisJIjBcbiIgXAorCSIiICIiCisKK3Rlc3RpbmcgInRlc3QgLWx0ID0gLWd0OiBzaG91bGQgYmUgZmFsc2UgKDEpIiBcCisJImJ1c3lib3ggdGVzdCAtbHQgPSAtZ3Q7IGVjaG8gXCQ/IiBcCisJIjFcbiIgXAorCSIiICIiCisKK3Rlc3RpbmcgInRlc3QgYSAtYSAhOiBzaG91bGQgYmUgdHJ1ZSAoMCkiIFwKKwkiYnVzeWJveCB0ZXN0IGEgLWEgITsgZWNobyBcJD8iIFwKKwkiMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAidGVzdCAtZiA9IGEgLW8gYjogc2hvdWxkIGJlIHRydWUgKDApIiBcCisJImJ1c3lib3ggdGVzdCAtZiA9IGEgLW8gYjsgZWNobyBcJD8iIFwKKwkiMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAidGVzdCAhIGEgPSBiIC1hICEgYyA9IGM6IHNob3VsZCBiZSBmYWxzZSAoMSkiIFwKKwkiYnVzeWJveCB0ZXN0ICEgYSA9IGIgLWEgISBjID0gYzsgZWNobyBcJD8iIFwKKwkiMVxuIiBcCisJIiIgIiIKKwordGVzdGluZyAidGVzdCAhIGEgPSBiIC1hICEgYyA9IGQ6IHNob3VsZCBiZSB0cnVlICgwKSIgXAorCSJidXN5Ym94IHRlc3QgISBhID0gYiAtYSAhIGMgPSBkOyBlY2hvIFwkPyIgXAorCSIwXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJ0ZXN0ICchJyA9ICchJzogc2hvdWxkIGJlIHRydWUgKDApIiBcCisJImJ1c3lib3ggdGVzdCAnIScgPSAnISc7IGVjaG8gXCQ/IiBcCisJIjBcbiIgXAorCSIiICIiCisKK3Rlc3RpbmcgInRlc3QgJygnID0gJygnOiBzaG91bGQgYmUgdHJ1ZSAoMCkiIFwKKwkiYnVzeWJveCB0ZXN0ICcoJyA9ICcoJzsgZWNobyBcJD8iIFwKKwkiMFxuIiBcCisJIiIgIiIKKwordGVzdGluZyAidGVzdCAnIScgJyEnID0gJyEnOiBzaG91bGQgYmUgZmFsc2UgKDEpIiBcCisJImJ1c3lib3ggdGVzdCAnIScgJyEnID0gJyEnOyBlY2hvIFwkPyIgXAorCSIxXG4iIFwKKwkiIiAiIgorCit0ZXN0aW5nICJ0ZXN0ICchJyAnKCcgPSAnKCc6IHNob3VsZCBiZSBmYWxzZSAoMSkiIFwKKwkiYnVzeWJveCB0ZXN0ICchJyAnKCcgPSAnKCc7IGVjaG8gXCQ/IiBcCisJIjFcbiIgXAorCSIiICIiCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3Rlc3Rpbmcuc2ggYi90ZXN0c3VpdGUvdGVzdGluZy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWI3NTY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3Rlc3Rpbmcuc2gKQEAgLTAsMCArMSwxNzAgQEAKKyMgU2ltcGxlIHRlc3QgaGFybmVzcyBpbmZyYXN0cnVjdHVyZSBmb3IgQnVzeUJveAorIworIyBDb3B5cmlnaHQgMjAwNSBieSBSb2IgTGFuZGxleQorIworIyBMaWNlbnNlIGlzIEdQTHYyLCBzZWUgTElDRU5TRSBpbiB0aGUgYnVzeWJveCB0YXJiYWxsIGZvciBmdWxsIGxpY2Vuc2UgdGV4dC4KKworIyBUaGlzIGZpbGUgZGVmaW5lcyB0d28gZnVuY3Rpb25zLCAidGVzdGluZyIgYW5kICJvcHRpb25hbCIKKyMgYW5kIGEgY291cGxlIG1vcmUuLi4KKworIyBUaGUgZm9sbG93aW5nIGVudmlyb25tZW50IHZhcmlhYmxlcyBtYXkgYmUgc2V0IHRvIGVuYWJsZSBvcHRpb25hbCBiZWhhdmlvcgorIyBpbiAidGVzdGluZyI6CisjICAgIFZFUkJPU0UgLSBQcmludCB0aGUgZGlmZiAtdSBvZiBlYWNoIGZhaWxlZCB0ZXN0IGNhc2UuCisjICAgIERFQlVHIC0gRW5hYmxlIGNvbW1hbmQgdHJhY2luZy4KKyMgICAgU0tJUCAtIGRvIG5vdCBwZXJmb3JtIHRoaXMgdGVzdCAodGhpcyBpcyBzZXQgYnkgIm9wdGlvbmFsIikKKyMKKyMgVGhlICJ0ZXN0aW5nIiBmdW5jdGlvbiB0YWtlcyBmaXZlIGFyZ3VtZW50czoKKyMJJDEpIFRlc3QgZGVzY3JpcHRpb24KKyMJJDIpIENvbW1hbmQocykgdG8gcnVuLiBNYXkgaGF2ZSBwaXBlcywgcmVkaXJlY3RzLCBldGMKKyMJJDMpIEV4cGVjdGVkIHJlc3VsdCBvbiBzdGRvdXQKKyMJJDQpIERhdGEgdG8gYmUgd3JpdHRlbiB0byBmaWxlICJpbnB1dCIKKyMJJDUpIERhdGEgdG8gYmUgd3JpdHRlbiB0byBzdGRpbgorIworIyBUaGUgZXhpdCB2YWx1ZSBvZiB0ZXN0aW5nIGlzIHRoZSBleGl0IHZhbHVlIG9mICQyIGl0IHJhbi4KKyMKKyMgVGhlIGVudmlyb25tZW50IHZhcmlhYmxlICJGQUlMQ09VTlQiIGNvbnRhaW5zIGEgY3VtdWxhdGl2ZSB0b3RhbCBvZiB0aGUKKyMgbnVtYmVyIG9mIGZhaWxlZCB0ZXN0cy4KKworIyBUaGUgIm9wdGlvbmFsIiBmdW5jdGlvbiBpcyB1c2VkIHRvIHNraXAgY2VydGFpbiB0ZXN0cywgYWxhOgorIyAgIG9wdGlvbmFsIEZFQVRVUkVfVEhJTkdZCisjCisjIFRoZSAib3B0aW9uYWwiIGZ1bmN0aW9uIGNoZWNrcyB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgIk9QVElPTkZMQUdTIiwKKyMgd2hpY2ggaXMgZWl0aGVyIGVtcHR5IChpbiB3aGljaCBjYXNlIGl0IGFsd2F5cyBjbGVhcnMgU0tJUCkgb3IKKyMgZWxzZSBjb250YWlucyBhIGNvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIGZlYXR1cmVzIChpbiB3aGljaCBjYXNlIHRoZSBmdW5jdGlvbgorIyBjbGVhcnMgU0tJUCBpZiB0aGUgZmxhZyB3YXMgZm91bmQsIG9yIHNldHMgaXQgdG8gMSBpZiB0aGUgZmxhZyB3YXMgbm90IGZvdW5kKS4KKworZXhwb3J0IEZBSUxDT1VOVD0wCitleHBvcnQgU0tJUD0KKworIyBIZWxwZXIgZm9yIGhlbHBlcnMuIE9oIG15Li4uCisKK3Rlc3QgeCIkRUNITyIgIT0geCIiIHx8IHsKKwlFQ0hPPSJlY2hvIgorCXRlc3QgeCJgZWNobyAtbmVgIiA9IHgiIiB8fCB7CisJCSMgQ29tcGlsZSBhbmQgdXNlIGEgcmVwbGFjZW1lbnQgJ2VjaG8nIHdoaWNoIHVuZGVyc3RhbmRzIC1lIC1uCisJCUVDSE89IiRQV0QvZWNoby1uZSIKKwkJdGVzdCAteCAiJEVDSE8iIHx8IHsKKwkJCWdjYyAtT3MgLW8gIiRFQ0hPIiAuLi9zY3JpcHRzL2VjaG8uYyB8fCBleGl0IDEKKwkJfQorCX0KKwlleHBvcnQgRUNITworfQorCisjIEhlbHBlciBmdW5jdGlvbnMKKworb3B0aW9uYWwoKQoreworCVNLSVA9CisJd2hpbGUgdGVzdCAiJDEiOyBkbworCQljYXNlICIke09QVElPTkZMQUdTfSIgaW4KKwkJCSo6JDE6KikgOzsKKwkJCSopIFNLSVA9MTsgcmV0dXJuIDs7CisJCWVzYWMKKwkJc2hpZnQKKwlkb25lCit9CisKKyMgVGhlIHRlc3RpbmcgZnVuY3Rpb24KKwordGVzdGluZygpCit7CisgIE5BTUU9IiQxIgorICBbIC1uICIkMSIgXSB8fCBOQU1FPSIkMiIKKworICBpZiBbICQjIC1uZSA1IF0KKyAgdGhlbgorICAgIGVjaG8gIlRlc3QgJE5BTUUgaGFzIHdyb25nIG51bWJlciBvZiBhcmd1bWVudHM6ICQjIChtdXN0IGJlIDUpIiA+JjIKKyAgICBleGl0IDEKKyAgZmkKKworICBbIC16ICIkREVCVUciIF0gfHwgc2V0IC14CisKKyAgaWYgWyAtbiAiJFNLSVAiIF0KKyAgdGhlbgorICAgIGVjaG8gIlNLSVBQRUQ6ICROQU1FIgorICAgIHJldHVybiAwCisgIGZpCisKKyAgJEVDSE8gLW5lICIkMyIgPiBleHBlY3RlZAorICAkRUNITyAtbmUgIiQ0IiA+IGlucHV0CisgIFsgLXogIiRWRVJCT1NFIiBdIHx8IGVjaG8gPT09PT09PT09PT09PT09PT09PT09PQorICBbIC16ICIkVkVSQk9TRSIgXSB8fCBlY2hvICJlY2hvIC1uZSAnJDQnID5pbnB1dCIKKyAgWyAteiAiJFZFUkJPU0UiIF0gfHwgZWNobyAiZWNobyAtbmUgJyQ1JyB8ICQyIgorICAkRUNITyAtbmUgIiQ1IiB8IGV2YWwgIiQyIiA+IGFjdHVhbAorICBSRVRWQUw9JD8KKworICBpZiBjbXAgZXhwZWN0ZWQgYWN0dWFsID4vZGV2L251bGwgMj4vZGV2L251bGwKKyAgdGhlbgorICAgIGVjaG8gIlBBU1M6ICROQU1FIgorICBlbHNlCisgICAgRkFJTENPVU5UPSQoKCRGQUlMQ09VTlQgKyAxKSkKKyAgICBlY2hvICJGQUlMOiAkTkFNRSIKKyAgICBbIC16ICIkVkVSQk9TRSIgXSB8fCBkaWZmIC11IGV4cGVjdGVkIGFjdHVhbAorICBmaQorICBybSAtZiBpbnB1dCBleHBlY3RlZCBhY3R1YWwKKworICBbIC16ICIkREVCVUciIF0gfHwgc2V0ICt4CisKKyAgcmV0dXJuICRSRVRWQUwKK30KKworIyBSZWN1cnNpdmVseSBncmFiIGFuIGV4ZWN1dGFibGUgYW5kIGFsbCB0aGUgbGlicmFyaWVzIG5lZWRlZCB0byBydW4gaXQuCisjIFNvdXJjZSBwYXRocyBiZWdpbm5pbmcgd2l0aCAvIHdpbGwgYmUgY29waWVkIGludG8gZGVzdHBhdGgsIG90aGVyd2lzZQorIyB0aGUgZmlsZSBpcyBhc3N1bWVkIHRvIGFscmVhZHkgYmUgdGhlcmUgYW5kIG9ubHkgaXRzIGxpYnJhcnkgZGVwZW5kZW5jaWVzCisjIGFyZSBjb3BpZWQuCisKK21rY2hyb290KCkKK3sKKyAgWyAkIyAtbHQgMiBdICYmIHJldHVybgorCisgICRFQ0hPIC1uIC4KKworICBkZXN0PSQxCisgIHNoaWZ0CisgIGZvciBpIGluICIkQCIKKyAgZG8KKyAgICAjYmFzaGlzbTogWyAiJHtpOjA6MX0iID09ICIvIiBdIHx8IGk9JCh3aGljaCAkaSkKKyAgICBpPSQod2hpY2ggJGkpICMgbm8tb3AgZm9yIC9iaW4vcHJvZworICAgIFsgLWYgIiRkZXN0LyRpIiBdICYmIGNvbnRpbnVlCisgICAgaWYgWyAtZSAiJGkiIF0KKyAgICB0aGVuCisgICAgICBkPWBlY2hvICIkaSIgfCBncmVwIC1vICcuKi8nYCAmJgorICAgICAgbWtkaXIgLXAgIiRkZXN0LyRkIiAmJgorICAgICAgY2F0ICIkaSIgPiAiJGRlc3QvJGkiICYmCisgICAgICBjaG1vZCAreCAiJGRlc3QvJGkiCisgICAgZWxzZQorICAgICAgZWNobyAiTm90IGZvdW5kOiAkaSIKKyAgICBmaQorICAgIG1rY2hyb290ICIkZGVzdCIgJChsZGQgIiRpIiB8IGVncmVwIC1vICcvLiogJykKKyAgZG9uZQorfQorCisjIFNldCB1cCBhIGNocm9vdCBlbnZpcm9ubWVudCBhbmQgcnVuIGNvbW1hbmRzIHdpdGhpbiBpdC4KKyMgTmVlZGVkIGNvbW1hbmRzIGxpc3RlZCBvbiBjb21tYW5kIGxpbmUKKyMgU2NyaXB0IGZlZCB0byBzdGRpbi4KKworZG9jaHJvb3QoKQoreworICBta2RpciB0bXBkaXI0Y2hyb290CisgIG1vdW50IC10IHJhbWZzIHRtcGRpcjRjaHJvb3QgdG1wZGlyNGNocm9vdAorICBta2RpciAtcCB0bXBkaXI0Y2hyb290L3tldGMsc3lzLHByb2MsdG1wLGRldn0KKyAgY3AgLUwgdGVzdGluZy5zaCB0bXBkaXI0Y2hyb290CisKKyAgIyBDb3B5IHV0aWxpdGllcyBmcm9tIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKworICAkRUNITyAtbiAiU2V0dXAgY2hyb290IgorICBta2Nocm9vdCB0bXBkaXI0Y2hyb290ICQqCisgIGVjaG8KKworICBta25vZCB0bXBkaXI0Y2hyb290L2Rldi90dHkgYyA1IDAKKyAgbWtub2QgdG1wZGlyNGNocm9vdC9kZXYvbnVsbCBjIDEgMworICBta25vZCB0bXBkaXI0Y2hyb290L2Rldi96ZXJvIGMgMSA1CisKKyAgIyBDb3B5IHNjcmlwdCBmcm9tIHN0ZGluCisKKyAgY2F0ID4gdG1wZGlyNGNocm9vdC90ZXN0LnNoCisgIGNobW9kICt4IHRtcGRpcjRjaHJvb3QvdGVzdC5zaAorICBjaHJvb3QgdG1wZGlyNGNocm9vdCAvdGVzdC5zaAorICB1bW91bnQgLWwgdG1wZGlyNGNocm9vdAorICBybWRpciB0bXBkaXI0Y2hyb290Cit9CmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdG91Y2gvdG91Y2gtY3JlYXRlcy1maWxlIGIvdGVzdHN1aXRlL3RvdWNoL3RvdWNoLWNyZWF0ZXMtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjQ5MzU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3RvdWNoL3RvdWNoLWNyZWF0ZXMtZmlsZQpAQCAtMCwwICsxLDIgQEAKK2J1c3lib3ggdG91Y2ggZm9vCit0ZXN0IC1mIGZvbwpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3RvdWNoL3RvdWNoLWRvZXMtbm90LWNyZWF0ZS1maWxlIGIvdGVzdHN1aXRlL3RvdWNoL3RvdWNoLWRvZXMtbm90LWNyZWF0ZS1maWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NTI1OTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvdG91Y2gvdG91Y2gtZG9lcy1ub3QtY3JlYXRlLWZpbGUKQEAgLTAsMCArMSwyIEBACitidXN5Ym94IHRvdWNoIC1jIGZvbwordGVzdCAhIC1mIGZvbwpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3RvdWNoL3RvdWNoLXRvdWNoZXMtZmlsZXMtYWZ0ZXItbm9uLWV4aXN0ZW50LWZpbGUgYi90ZXN0c3VpdGUvdG91Y2gvdG91Y2gtdG91Y2hlcy1maWxlcy1hZnRlci1ub24tZXhpc3RlbnQtZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODY5ZWMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3RvdWNoL3RvdWNoLXRvdWNoZXMtZmlsZXMtYWZ0ZXItbm9uLWV4aXN0ZW50LWZpbGUKQEAgLTAsMCArMSwzIEBACit0b3VjaCAtdCAxOTgwMDEwMTAwMDAgYmFyCitidXN5Ym94IHRvdWNoIC1jIGZvbyBiYXIKK3Rlc3QgeCJgZmluZCBiYXIgLW10aW1lIC0xYCIgPSB4YmFyCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdHIudGVzdHMgYi90ZXN0c3VpdGUvdHIudGVzdHMKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNWNjYTI5OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90ci50ZXN0cwpAQCAtMCwwICsxLDM3IEBACisjIS9iaW4vc2gKKworIyBDb3B5cmlnaHQgMjAwOSBieSBEZW55cyBWbGFzZW5rbyA8dmRhLmxpbnV4QGdvb2dsZW1haWwuY29tPgorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgImRlc2NyaXB0aW9uIiAiYXJndW1lbnRzIiAicmVzdWx0IiAiaW5maWxlIiAic3RkaW4iCisKK3Rlc3RpbmcgInRyIGRvZXMgbm90IHRyZWF0IFtdIGluIFthLXpdIGFzIHNwZWNpYWwiIFwKKwkidHIgJ1txLXpdJyAnX1EtWisnIiBcCisJIl9RV2UrIiAiIiAiW3F3ZV0iCisKK3Rlc3RpbmcgInRyIHVuZGVyc3RhbmRzIDAtOUEtRiIgXAorCSJ0ciAtY2QgJ1swLTlBLUZdJyIgXAorCSIxOUFGIiAiIiAiMTlBRkhcbiIKKworb3B0aW9uYWwgRkVBVFVSRV9UUl9DTEFTU0VTCit0ZXN0aW5nICJ0ciB1bmRlcnN0YW5kcyBbOnhkaWdpdDpdIiBcCisJInRyIC1jZCAnWzp4ZGlnaXQ6XSciIFwKKwkiMTlBRiIgIiIgIjE5QUZIXG4iCitTS0lQPQorCitvcHRpb25hbCBGRUFUVVJFX1RSX0NMQVNTRVMKK3Rlc3RpbmcgInRyIGRvZXMgbm90IHN0b3AgYWZ0ZXIgWzpkaWdpdDpdIiBcCisJInRyICdbOmRpZ2l0Ol15LXonIDExMTExMTExMTEyMyIgXAorCSIxMTFhYmN4MjNcbiIgIiIgIjc4OWFiY3h5elxuIgorU0tJUD0KKworb3B0aW9uYWwgRkVBVFVSRV9UUl9DTEFTU0VTCit0ZXN0aW5nICJ0ciBoYXMgY29ycmVjdCB4ZGlnaXQgc2VxdWVuY2UiIFwKKwkidHIgJ1s6eGRpZ2l0Ol1HZycgMTExMTExMTE1MTI0MjIyMjMzMzMzMHhYIiBcCisJIiMxMTExMTExMTUxMjQyMjIyeDMzMzMzMFhcbiIgIiIgXAorCSIjMDEyMzQ1Njc4OUFCQ0RFRkdhYmNkZWZnXG4iCitTS0lQPQorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90ci90ci1kLWFsbnVtLXdvcmtzIGIvdGVzdHN1aXRlL3RyL3RyLWQtYWxudW0td29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU0MGVhNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90ci90ci1kLWFsbnVtLXdvcmtzCkBAIC0wLDAgKzEsNiBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9UUl9DTEFTU0VTCisKK2VjaG8gdGVzdGluZyB8IHRyIC1kICdbWzphbG51bTpdXScgPiBsb2dmaWxlLmdudQorZWNobyB0ZXN0aW5nIHwgYnVzeWJveCB0ciAtZCAnW1s6YWxudW06XV0nID4gbG9nZmlsZS5iYgorCitkaWZmIC11IGxvZ2ZpbGUuZ251IGxvZ2ZpbGUuYmIKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90ci90ci1kLXdvcmtzIGIvdGVzdHN1aXRlL3RyL3RyLWQtd29ya3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg2YmZiZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90ci90ci1kLXdvcmtzCkBAIC0wLDAgKzEsNCBAQAorZWNobyB0ZXN0aW5nIHwgdHIgLWQgYWVpb3UgPiBsb2dmaWxlLmdudQorZWNobyB0ZXN0aW5nIHwgYnVzeWJveCB0ciAtZCBhZWlvdSA+IGxvZ2ZpbGUuYmIKKworZGlmZiAtdSBsb2dmaWxlLmdudSBsb2dmaWxlLmJiCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdHIvdHItbm9uLWdudSBiL3Rlc3RzdWl0ZS90ci90ci1ub24tZ251Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmYTY5NTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvdHIvdHItbm9uLWdudQpAQCAtMCwwICsxIEBACitlY2hvIGZkaHJuenZmdSBiZmZ2c2VudHIgfCBidXN5Ym94IHRyICdbYS16XScgJ1tuLXpdW2EtbV0nCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvdHIvdHItcmVqZWN0cy13cm9uZy1jbGFzcyBiL3Rlc3RzdWl0ZS90ci90ci1yZWplY3RzLXdyb25nLWNsYXNzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkNDg4YTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvdHIvdHItcmVqZWN0cy13cm9uZy1jbGFzcwpAQCAtMCwwICsxLDIxIEBACisjIEZFQVRVUkU6IENPTkZJR19GRUFUVVJFX1RSX0NMQVNTRVMKKworZWNobyB0MTJlc3RpbmcgfCB0ciAtZCAnW1s6YWxwaGE6XV0nID4gbG9nZmlsZS5nbnUKK2VjaG8gdDEyZXN0aW5nIHwgdHIgLWQgJ1s6YWxwaGE6XScgID4+IGxvZ2ZpbGUuZ251CitlY2hvIHQxMmVzdGluZyB8IHRyIC1kICdbWzphbHBoYTpdJyA+PiBsb2dmaWxlLmdudQorZWNobyB0MTJlc3RpbmcgfCB0ciAtZCAnW1s6YWxwaGE6JyA+PiBsb2dmaWxlLmdudQorZWNobyB0MTJlc3RpbmcgfCB0ciAtZCAnW1s6YWxwaGEnID4+IGxvZ2ZpbGUuZ251CitlY2hvIHQxMmVzdGluZyB8IHRyIC1kICdbOmFscGhhOl0nID4+IGxvZ2ZpbGUuZ251CitlY2hvIHQxMmVzdGluZyB8IHRyIC1kICdbOmFscGhhOicgPj4gbG9nZmlsZS5nbnUKK2VjaG8gdDEyZXN0aW5nIHwgdHIgLWQgJ1s6YWxwaGEnID4+IGxvZ2ZpbGUuZ251CisKK2VjaG8gdDEyZXN0aW5nIHwgYnVzeWJveCB0ciAtZCAnW1s6YWxwaGE6XV0nID4gbG9nZmlsZS5iYgorZWNobyB0MTJlc3RpbmcgfCBidXN5Ym94IHRyIC1kICdbOmFscGhhOl0nICA+PiBsb2dmaWxlLmJiCitlY2hvIHQxMmVzdGluZyB8IGJ1c3lib3ggdHIgLWQgJ1tbOmFscGhhOl0nID4+IGxvZ2ZpbGUuYmIKK2VjaG8gdDEyZXN0aW5nIHwgYnVzeWJveCB0ciAtZCAnW1s6YWxwaGE6JyA+PiBsb2dmaWxlLmJiCitlY2hvIHQxMmVzdGluZyB8IGJ1c3lib3ggdHIgLWQgJ1tbOmFscGhhJyA+PiBsb2dmaWxlLmJiCitlY2hvIHQxMmVzdGluZyB8IGJ1c3lib3ggdHIgLWQgJ1s6YWxwaGE6XScgPj4gbG9nZmlsZS5iYgorZWNobyB0MTJlc3RpbmcgfCBidXN5Ym94IHRyIC1kICdbOmFscGhhOicgPj4gbG9nZmlsZS5iYgorZWNobyB0MTJlc3RpbmcgfCBidXN5Ym94IHRyIC1kICdbOmFscGhhJyA+PiBsb2dmaWxlLmJiCisKK2RpZmYgLXUgbG9nZmlsZS5nbnUgbG9nZmlsZS5iYgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3RyL3RyLXdvcmtzIGIvdGVzdHN1aXRlL3RyL3RyLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNGEzMGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvdHIvdHItd29ya3MKQEAgLTAsMCArMSwyOCBAQAorIyBGRUFUVVJFOiBDT05GSUdfRkVBVFVSRV9UUl9DTEFTU0VTCisKK3J1bl90ciAoKQoreworCSRFQ0hPIC1uICJlY2hvICckMScgfCB0ciAnJDInICckMyc6ICIKKwllY2hvICIkMSIgfCAkYmIgdHIgIiQyIiAiJDMiCisJZWNobworfQordHJfdGVzdCAoKQoreworCXJ1bl90ciAiY2JhYWIiCQlhYmMgCQl6eXgKKwlydW5fdHIgIlRFU1RJTkcgQSBCIEMiIAknW0EtWl0nIAknW2Etel0nCisJcnVuX3RyICJhYmNbXSIgCQkiYVtiIiAJCUFYQgorCXJ1bl90ciBhYmMJCSdbOmFscGhhOl0nIAlBLVpBLVoKKwlydW5fdHIgYWJjNTYJCSdbOmFsbnVtOl0nIAlBLVpBLVp4eHh4eHh4eHh4CisJcnVuX3RyIDAxMgkJJ1s6ZGlnaXQ6XScgCWFiY2RlZmdoaQorCXJ1bl90ciBhYmM1NgkJJ1s6bG93ZXI6XScgCSdbOnVwcGVyOl0nCisJcnVuX3RyICIgCSIJJ1s6c3BhY2U6XScgCTEyMzQ1CisJcnVuX3RyICIgCSIJJ1s6Ymxhbms6XScgCTEyCisJcnVuX3RyICdhIGInCQknWz0gPV0nIAlYCisJcnVuX3RyICJbOiIJCSdbOicgCQlhYgorCXJ1bl90ciAiIAkuLDoiCSdbOnB1bmN0Ol0nCTEyCisJcnVuX3RyICIgCS4sOiIJJ1s6Y250cmw6XScJMTIKK30KKworYmI9ICAgICAgICB0cl90ZXN0ID4gbG9nZmlsZS5nbnUKK2JiPWJ1c3lib3ggdHJfdGVzdCA+IGxvZ2ZpbGUuYmIKK2RpZmYgLXUgbG9nZmlsZS5nbnUgbG9nZmlsZS5iYgpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3RydWUvdHJ1ZS1pcy1zaWxlbnQgYi90ZXN0c3VpdGUvdHJ1ZS90cnVlLWlzLXNpbGVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDFiZGIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3RydWUvdHJ1ZS1pcy1zaWxlbnQKQEAgLTAsMCArMSBAQAorYnVzeWJveCB0cnVlIDI+JjEgfCBjbXAgLSAvZGV2L251bGwKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS90cnVlL3RydWUtcmV0dXJucy1zdWNjZXNzIGIvdGVzdHN1aXRlL3RydWUvdHJ1ZS1yZXR1cm5zLXN1Y2Nlc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RmMmQ1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS90cnVlL3RydWUtcmV0dXJucy1zdWNjZXNzCkBAIC0wLDAgKzEgQEAKK2J1c3lib3ggdHJ1ZQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3VtbHdyYXBwZXIuc2ggYi90ZXN0c3VpdGUvdW1sd3JhcHBlci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNTVlNGRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3VtbHdyYXBwZXIuc2gKQEAgLTAsMCArMSwyMCBAQAorIyEvYmluL3NoCisKKyMgV3JhcHBlciBmb3IgVXNlciBNb2RlIExpbnV4IGVtdWxhdGlvbiBlbnZpcm9ubWVudAorCitSVU5GSUxFPSIkKHB3ZCkvJHsxfS50ZXN0cm9vdCIKK2lmIFsgLXogIiRSVU5GSUxFIiBdIHx8IFsgISAteCAiJFJVTkZJTEUiIF0KK3RoZW4KKyAgZWNobyAiQ2FuJ3QgcnVuICckUlVORklMRSciCisgIGV4aXQgMQorZmkKKworc2hpZnQKKworaWYgWyAteiAkKHdoaWNoIGxpbnV4KSBdCit0aGVuCisgIGVjaG8gIk5vIFVzZXIgTW9kZSBMaW51eC4iCisgIGV4aXQgMTsKK2ZpCisKK2xpbnV4IHJvb3Rmc3R5cGU9aG9zdGZzIHJ3IGluaXQ9IiRSVU5GSUxFIiBURVNURElSPWBwd2RgIFBBVEg9IiRQQVRIIiAkKiBxdWlldApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3VuY29tcHJlc3MudGVzdHMgYi90ZXN0c3VpdGUvdW5jb21wcmVzcy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41MWEyMzM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3VuY29tcHJlc3MudGVzdHMKQEAgLTAsMCArMSwyMCBAQAorIyEvYmluL3NoCisjIENvcHlyaWdodCAyMDExIGJ5IERlbnlzIFZsYXNlbmtvCisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAiY29tbWFuZHMiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKK3Rlc3RpbmcgInVuY29tcHJlc3MgPCBceDFmXHg5ZFx4OTAgXHgwMSB4IE4iIFwKKyd1bmNvbXByZXNzIDI+JjEgMT4vZGV2L251bGw7IGVjaG8gJD8nIFwKKyJcCit1bmNvbXByZXNzOiBjb3JydXB0ZWQgZGF0YQorMQorIiBcCisiIiAiXAorXHgxZlx4OWRceDkwXAorXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXDAxXAorIgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS91bmV4cGFuZC50ZXN0cyBiL3Rlc3RzdWl0ZS91bmV4cGFuZC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43YjMyNmRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3VuZXhwYW5kLnRlc3RzCkBAIC0wLDAgKzEsMzkgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgMjAwOCBieSBEZW55cyBWbGFzZW5rbworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAordGVzdCAtZiAiJGJpbmRpci8uY29uZmlnIiAmJiAuICIkYmluZGlyLy5jb25maWciCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAib3B0aW9ucyIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKwordGVzdGluZyAidW5leHBhbmQgY2FzZSAxIiAidW5leHBhbmQiIFwKKwkiXHQxMjM0NTY3OFxuIiAiIiAiICAgICAgICAxMjM0NTY3OFxuIiBcCisKK3Rlc3RpbmcgInVuZXhwYW5kIGNhc2UgMiIgInVuZXhwYW5kIiBcCisJIlx0IDEyMzQ1Njc4XG4iICIiICIgICAgICAgICAxMjM0NTY3OFxuIiBcCisKK3Rlc3RpbmcgInVuZXhwYW5kIGNhc2UgMyIgInVuZXhwYW5kIiBcCisJIlx0ICAxMjM0NTY3OFxuIiAiIiAiICAgICAgICAgIDEyMzQ1Njc4XG4iIFwKKwordGVzdGluZyAidW5leHBhbmQgY2FzZSA0IiAidW5leHBhbmQiIFwKKwkiXHQxMjM0NTY3OFxuIiAiIiAiICAgICAgIFx0MTIzNDU2NzhcbiIgXAorCit0ZXN0aW5nICJ1bmV4cGFuZCBjYXNlIDUiICJ1bmV4cGFuZCIgXAorCSJcdDEyMzQ1Njc4XG4iICIiICIgICAgICBcdDEyMzQ1Njc4XG4iIFwKKwordGVzdGluZyAidW5leHBhbmQgY2FzZSA2IiAidW5leHBhbmQiIFwKKwkiXHQxMjM0NTY3OFxuIiAiIiAiICAgICBcdDEyMzQ1Njc4XG4iIFwKKwordGVzdGluZyAidW5leHBhbmQgY2FzZSA3IiAidW5leHBhbmQiIFwKKwkiMTIzXHQgNDU2NzhcbiIgIiIgIjEyMyBcdCA0NTY3OFxuIiBcCisKK3Rlc3RpbmcgInVuZXhwYW5kIGNhc2UgOCIgInVuZXhwYW5kIiBcCisJImEgYlxuIiAiIiAiYSBiXG4iIFwKKwordGVzdCB4IiRDT05GSUdfVU5JQ09ERV9TVVBQT1JUIiA9IHgieSIgXAorJiYgdGVzdCB4IiRDT05GSUdfVU5JQ09ERV9VU0lOR19MT0NBTEUiICE9IHgieSIgXAorJiYgdGVzdGluZyAidW5leHBhbmQgd2l0aCB1bmljb2RlIGNoYXJhY2hlciAweDM5NCIgInVuZXhwYW5kIiBcCisJIjHOlM6UzpQ1XHQ5OTk5OVxuIiAiIiAiMc6UzpTOlDUgICA5OTk5OVxuIgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS91bmV4cGFuZC91bmV4cGFuZC13b3Jrcy1saWtlLUdOVSBiL3Rlc3RzdWl0ZS91bmV4cGFuZC91bmV4cGFuZC13b3Jrcy1saWtlLUdOVQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTI1ODM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3VuZXhwYW5kL3VuZXhwYW5kLXdvcmtzLWxpa2UtR05VCkBAIC0wLDAgKzEsNTIgQEAKK3JtIC1mIGZvbyBiYXIKK2VjaG8gIiAgICAgICB5IiB8IHVuZXhwYW5kIC4uLy4uL2J1c3lib3ggPiBmb28KK2VjaG8gIiAgICAgICB5IiB8IGJ1c3lib3ggdW5leHBhbmQgLi4vLi4vYnVzeWJveCA+IGJhcgorc2V0ICtlCit0ZXN0ICEgLWYgZm9vIC1hIC1mIGJhcgoraWYgWyAkPyA9IDAgXSA7IHRoZW4KKwlzZXQgLWUKKwlkaWZmIC1xIGZvbyBiYXIKK2ZpCitybSAtZiBmb28gYmFyCitlY2hvICIgICAgICAgIHkiIHwgdW5leHBhbmQgLi4vLi4vYnVzeWJveCA+IGZvbworZWNobyAiICAgICAgICB5IiB8IGJ1c3lib3ggdW5leHBhbmQgLi4vLi4vYnVzeWJveCA+IGJhcgorc2V0ICtlCit0ZXN0ICEgLWYgZm9vIC1hIC1mIGJhcgoraWYgWyAkPyA9IDAgXSA7IHRoZW4KKwlzZXQgLWUKKwlkaWZmIC1xIGZvbyBiYXIKK2ZpCitlY2hvICIgICAgICAgeSAgICAgICB5IiB8IHVuZXhwYW5kIC4uLy4uL2J1c3lib3ggPiBmb28KK2VjaG8gIiAgICAgICB5ICAgICAgIHkiIHwgYnVzeWJveCB1bmV4cGFuZCAuLi8uLi9idXN5Ym94ID4gYmFyCitzZXQgK2UKK3Rlc3QgISAtZiBmb28gLWEgLWYgYmFyCitpZiBbICQ/ID0gMCBdIDsgdGhlbgorCXNldCAtZQorCWRpZmYgLXEgZm9vIGJhcgorZmkKK3JtIC1mIGZvbyBiYXIKK2VjaG8gIiAgICAgICAgeSAgICAgICAgeSIgfCB1bmV4cGFuZCAuLi8uLi9idXN5Ym94ID4gZm9vCitlY2hvICIgICAgICAgIHkgICAgICAgIHkiIHwgYnVzeWJveCB1bmV4cGFuZCAuLi8uLi9idXN5Ym94ID4gYmFyCitzZXQgK2UKK3Rlc3QgISAtZiBmb28gLWEgLWYgYmFyCitpZiBbICQ/ID0gMCBdIDsgdGhlbgorCXNldCAtZQorCWRpZmYgLXEgZm9vIGJhcgorZmkKK2VjaG8gIiAgICAgICB5ICAgICAgIHkiIHwgdW5leHBhbmQgLWEgLi4vLi4vYnVzeWJveCA+IGZvbworZWNobyAiICAgICAgIHkgICAgICAgeSIgfCBidXN5Ym94IHVuZXhwYW5kIC1hIC4uLy4uL2J1c3lib3ggPiBiYXIKK3NldCArZQordGVzdCAhIC1mIGZvbyAtYSAtZiBiYXIKK2lmIFsgJD8gPSAwIF0gOyB0aGVuCisJc2V0IC1lCisJZGlmZiAtcSBmb28gYmFyCitmaQorcm0gLWYgZm9vIGJhcgorZWNobyAiICAgICAgICB5ICAgICAgICB5IiB8IHVuZXhwYW5kIC1hIC4uLy4uL2J1c3lib3ggPiBmb28KK2VjaG8gIiAgICAgICAgeSAgICAgICAgeSIgfCBidXN5Ym94IHVuZXhwYW5kIC1hIC4uLy4uL2J1c3lib3ggPiBiYXIKK3NldCArZQordGVzdCAhIC1mIGZvbyAtYSAtZiBiYXIKK2lmIFsgJD8gPSAwIF0gOyB0aGVuCisJc2V0IC1lCisJZGlmZiAtcSBmb28gYmFyCitmaQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3VuaXEudGVzdHMgYi90ZXN0c3VpdGUvdW5pcS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44M2JmMzgyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3VuaXEudGVzdHMKQEAgLTAsMCArMSw4NyBAQAorIyEvYmluL3NoCisKKyMgU1VTdjMgY29tcGxpYW50IHVuaXEgdGVzdHMuCisjIENvcHlyaWdodCAyMDA1IGJ5IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisjIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisKKyMgQVVESVQ6IEZ1bGwgU1VTdjMgY292ZXJhZ2UgKGV4Y2VwdCBpbnRlcm5hdGlvbmFsaXphdGlvbikuCisKKy4gLi90ZXN0aW5nLnNoCisKKyMgdGVzdGluZyAidGVzdCBuYW1lIiAib3B0aW9ucyIgImV4cGVjdGVkIHJlc3VsdCIgImZpbGUgaW5wdXQiICJzdGRpbiIKKyMgICBmaWxlIGlucHV0IHdpbGwgYmUgZmlsZSBjYWxsZWQgImlucHV0IgorIyAgIHRlc3QgY2FuIGNyZWF0ZSBhIGZpbGUgImFjdHVhbCIgaW5zdGVhZCBvZiB3cml0aW5nIHRvIHN0ZG91dAorCisjIFRlc3QgZXhpdCBzdGF0dXMKKwordGVzdGluZyAidW5pcSAoZXhpdCB3aXRoIGVycm9yKSIgInVuaXEgbm9uZXhpc3RlbnQgMj4gL2Rldi9udWxsIHx8IGVjaG8geWVzIiBcCisJInllc1xuIiAiIiAiIgordGVzdGluZyAidW5pcSAoZXhpdCBzdWNjZXNzKSIgInVuaXEgL2Rldi9udWxsICYmIGVjaG8geWVzIiAieWVzXG4iICIiICIiCisKKyMgVGVzdCB2YXJpb3VzIGRhdGEgc291cmNlcyBhbmQgZGVzdGluYXRpb25zCisKK3Rlc3RpbmcgInVuaXEgKGRlZmF1bHQgdG8gc3RkaW4pIiAidW5pcSIgIm9uZVxudHdvXG50aHJlZVxuIiAiIiBcCisJIm9uZVxudHdvXG50d29cbnRocmVlXG50aHJlZVxudGhyZWVcbiIKK3Rlc3RpbmcgInVuaXEgLSAoc3BlY2lmeSBzdGRpbikiICJ1bmlxIC0iICJvbmVcbnR3b1xudGhyZWVcbiIgIiIgXAorCSJvbmVcbnR3b1xudHdvXG50aHJlZVxudGhyZWVcbnRocmVlXG4iCit0ZXN0aW5nICJ1bmlxIGlucHV0IChzcGVjaWZ5IGZpbGUpIiAidW5pcSBpbnB1dCIgIm9uZVxudHdvXG50aHJlZVxuIiBcCisJIm9uZVxudHdvXG50d29cbnRocmVlXG50aHJlZVxudGhyZWVcbiIgIiIKKwordGVzdGluZyAidW5pcSBpbnB1dCBvdXRmaWxlICh0d28gZmlsZXMpIiAidW5pcSBpbnB1dCBhY3R1YWwgPiAvZGV2L251bGwiIFwKKwkib25lXG50d29cbnRocmVlXG4iICJvbmVcbnR3b1xudHdvXG50aHJlZVxudGhyZWVcbnRocmVlXG4iICIiCit0ZXN0aW5nICJ1bmlxIChzdGRpbikgb3V0ZmlsZSIgInVuaXEgLSBhY3R1YWwiIFwKKwkib25lXG50d29cbnRocmVlXG4iICIiICJvbmVcbnR3b1xudHdvXG50aHJlZVxudGhyZWVcbnRocmVlXG4iCisjIE5vdGU6IFNVU3YzIGRvZXNuJ3Qgc2VlbSB0byByZXF1aXJlIHN1cHBvcnQgZm9yICItIiBvdXRwdXQsIGJ1dCB3ZSBkbyBhbnl3YXkuCit0ZXN0aW5nICJ1bmlxIGlucHV0IC0gKHNwZWNpZnkgc3Rkb3V0KSIgInVuaXEgaW5wdXQgLSIgXAorCSJvbmVcbnR3b1xudGhyZWVcbiIgIm9uZVxudHdvXG50d29cbnRocmVlXG50aHJlZVxudGhyZWVcbiIgIiIKKworCisjLWYgc2tpcCBmaWVsZHMKKyMtcyBza2lwIGNoYXJzCisjLWMgb2NjdXJyZW5jZXMKKyMtZCBkdXBzIG9ubHkKKyMtdQorIy13IG1heCBjaGFycworCisjIFRlc3QgdmFyaW91cyBjb21tYW5kIGxpbmUgb3B0aW9ucworCisjIExlYWRpbmcgd2hpdGVzcGFjZSBpcyBhIG1pbm9yIHRlY2huaWNhbCB2aW9sYXRpb24gb2YgdGhlIHNwZWMsCisjIGJ1dCBzaW5jZSBnbnUgZG9lcyBpdC4uLgordGVzdGluZyAidW5pcSAtYyAob2NjdXJyZW5jZSBjb3VudCkiICJ1bmlxIC1jIHwgc2VkICdzL15bIFx0XSovLyciIFwKKwkiMSBvbmVcbjIgdHdvXG4zIHRocmVlXG4iICIiIFwKKwkib25lXG50d29cbnR3b1xudGhyZWVcbnRocmVlXG50aHJlZVxuIgordGVzdGluZyAidW5pcSAtZCAoZHVwcyBvbmx5KSIgInVuaXEgLWQiICJ0d29cbnRocmVlXG4iICIiIFwKKwkib25lXG50d29cbnR3b1xudGhyZWVcbnRocmVlXG50aHJlZVxuIgorCit0ZXN0aW5nICJ1bmlxIC1mIC1zIChza2lwIGZpZWxkcyBhbmQgY2hhcnMpIiAidW5pcSAtZjIgLXMgMyIgXAorImNjCWRkCWVlOAorYWEJYmIJY2M5CisiICIiIFwKKyJjYwlkZAllZTgKK2JiCWNjCWRkOAorYWEJYmIJY2M5CisiCit0ZXN0aW5nICJ1bmlxIC13IChjb21wYXJlIG1heCBjaGFyYWN0ZXJzKSIgInVuaXEgLXcgMiIgXAorImNjMQorIiAiIiBcCisiY2MxCitjYzIKK2NjMworIgorCit0ZXN0aW5nICJ1bmlxIC1zIC13IChza2lwIGZpZWxkcyBhbmQgY29tcGFyZSBtYXggY2hhcnMpIiBcCisidW5pcSAtcyAyIC13IDIiIFwKKyJhYWNjYWEKKyIgIiIgXAorImFhY2NhYQorYWFjY2JiCitiYmNjYWEKKyIKKworIyAtZCBpcyAiU3VwcHJlc3MgdGhlIHdyaXRpbmcgZm8gbGluZXMgdGhhdCBhcmUgbm90IHJlcGVhdGVkIGluIHRoZSBpbnB1dC4iCisjIC11IGlzICJTdXBwcmVzcyB0aGUgd3JpdGluZyBvZiBsaW5lcyB0aGF0IGFyZSByZXBlYXRlZCBpbiB0aGUgaW5wdXQuIgorIyBUaGVyZWZvcmUsIHRvZ2V0aGVyIHRoaXMgbWVhbnMgdGhleSBzaG91bGQgcHJvZHVjZSBubyBvdXRwdXQuCit0ZXN0aW5nICJ1bmlxIC11IGFuZCAtZCBwcm9kdWNlIG5vIG91dHB1dCIgInVuaXEgLWQgLXUiICIiICIiIFwKKwkib25lXG50d29cbnR3b1xudGhyZWVcbnRocmVlXG50aHJlZVxuIgorCitleGl0ICRGQUlMQ09VTlQKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS91bnppcC50ZXN0cyBiL3Rlc3RzdWl0ZS91bnppcC50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44Njc3YTAzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3VuemlwLnRlc3RzCkBAIC0wLDAgKzEsMzggQEAKKyMhL2Jpbi9zaAorCisjIFRlc3RzIGZvciB1bnppcC4KKyMgQ29weXJpZ2h0IDIwMDYgUm9iIExhbmRsZXkgPHJvYkBsYW5kbGV5Lm5ldD4KKyMgQ29weXJpZ2h0IDIwMDYgR2xlbm4gTWNHcmF0aAorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgIm9wdGlvbnMiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisjICAgZmlsZSBpbnB1dCB3aWxsIGJlIGZpbGUgY2FsbGVkICJpbnB1dCIKKyMgICB0ZXN0IGNhbiBjcmVhdGUgYSBmaWxlICJhY3R1YWwiIGluc3RlYWQgb2Ygd3JpdGluZyB0byBzdGRvdXQKKworIyBDcmVhdGUgYSBzY3JhdGNoIGRpcmVjdG9yeQorCitta2RpciB0ZW1wCitjZCB0ZW1wCisKKyMgQ3JlYXRlIHRlc3QgZmlsZSB0byB3b3JrIHdpdGguCisKK21rZGlyIGZvbwordG91Y2ggZm9vL2JhcgoremlwIGZvby56aXAgZm9vIGZvby9iYXIgPiAvZGV2L251bGwKK3JtIC1mIGZvby9iYXIKK3JtZGlyIGZvbworCisjIFRlc3QgdGhhdCB1bnppcHBpbmcganVzdCBmb28gZG9lc24ndCBjcmVhdGUgYmFyLgordGVzdGluZyAidW56aXAgKHN1YmRpciBvbmx5KSIgInVuemlwIC1xIGZvby56aXAgZm9vLyAmJiB0ZXN0IC1kIGZvbyAmJiB0ZXN0ICEgLWYgZm9vL2JhciAmJiBlY2hvIHllcyIgInllc1xuIiAiIiAiIgorCitybWRpciBmb28KK3JtIGZvby56aXAKKworIyBDbGVhbiB1cCBzY3JhdGNoIGRpcmVjdG9yeS4KKworY2QgLi4KK3JtIC1yZiB0ZW1wCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3VwdGltZS91cHRpbWUtd29ya3MgYi90ZXN0c3VpdGUvdXB0aW1lL3VwdGltZS13b3JrcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjE2OGFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3VwdGltZS91cHRpbWUtd29ya3MKQEAgLTAsMCArMSBAQAorYnVzeWJveCB1cHRpbWUKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS91dWVuY29kZS50ZXN0cyBiL3Rlc3RzdWl0ZS91dWVuY29kZS50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42Y2U3MGY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3V1ZW5jb2RlLnRlc3RzCkBAIC0wLDAgKzEsMTIyIEBACisjIS9iaW4vc2gKKworIyB1bml0IHRlc3QgZm9yIHV1ZW5jb2RlIHRvIHRlc3QgZnVuY3Rpb25hbGl0eS4KKyMgQ29weXJpZ2h0IDIwMDYgYnkgRXJpayBIb3ZsYW5kIDxlcmlrQGhvdmxhbmQub3JnPgorIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisjIEFVRElUOiBVbml0IHRlc3RzIGZvciB1dWVuY29kZQorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmQocykiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisjIGZpbGUgaW5wdXQgd2lsbCBiZSBmaWxlIGNhbGxlZCAiaW5wdXQiCisjIHRlc3QgY2FuIGNyZWF0ZSBhIGZpbGUgImFjdHVhbCIgaW5zdGVhZCBvZiB3cml0aW5nIHRvIHN0ZG91dAorCisjIFRlc3Qgc2V0dXAgb2Ygc3RhbmRhcmQgaW5wdXQKK3VtYXNrIDAKK3Rlc3RpbmcgInV1ZW5jb2RlIHNldHMgc3RhbmRhcmQgaW5wdXQgbW9kZSBjb3JyZWN0bHkiIFwKKyAgICAgICAgInV1ZW5jb2RlIGZvbyA8L2Rldi9udWxsIHwgaGVhZCAtbiAxIHwgZ3JlcCAtcSA2NjYgJiYgZWNobyB5ZXMiICJ5ZXNcbiIgIiIgIiIKK3VtYXNrIDAyMgorCit0ZXN0aW5nICJ1dWVuY29kZSBjb3JyZWN0IGVuY29kaW5nIiAidXVlbmNvZGUgYmJfdXVlbmNfdGVzdC5vdXQiIFwKKyJiZWdpbiA2NDQgYmJfdXVlbmNfdGVzdC5vdXRcbk01JkFFKCY5QTxXMEA5VylFPjIhRjtXQEA6RzVNPCY1RCgmXVY5NyhAPSZBRSgmUUE+R0RAOEcpTz1WWEBcbiU5Jl1HK0BIXGBcblxgXG5lbmRcbiIgXAorICAgICAgICAiIiAiVGhlIGZhc3QgZ3JleSBmb3gganVtcGVkIG92ZXIgdGhlIGxhenkgYnJvd24gZG9nLlxuIgordGVzdGluZyAidXVlbmNvZGUgY29ycmVjdCBiYXNlNjQgZW5jb2RpbmciICJ1dWVuY29kZSAtbSBiYl91dWVuY190ZXN0Lm91dCIgXAorImJlZ2luLWJhc2U2NCA2NDQgYmJfdXVlbmNfdGVzdC5vdXRcblZHaGxJR1poYzNRZ1ozSmxlU0JtYjNnZ2FuVnRjR1ZrSUc5MlpYSWdkR2hsSUd4aGVua2dZbkp2ZDI0Z1xuWkc5bkxnbz1cbj09PT1cbiIgXAorICAgICAgICAiIiAiVGhlIGZhc3QgZ3JleSBmb3gganVtcGVkIG92ZXIgdGhlIGxhenkgYnJvd24gZG9nLlxuIgorCit0ZXN0aW5nICJ1dWVuY29kZSBlbXB0eSBmaWxlIiAncj1gdXVlbmNvZGUgRklMRWA7IGVjaG8gIiRyIjsgZWNobyAiJHIiIHwgdXVkZWNvZGUgLW8gLTsnIFwKKydiZWdpbiA2NDQgRklMRQorYAorZW5kCisnICIiICIiCit0ZXN0aW5nICJ1dWVuY29kZSAtbSBlbXB0eSBmaWxlIiAncj1gdXVlbmNvZGUgLW0gRklMRWA7IGVjaG8gIiRyIjsgZWNobyAiJHIiIHwgdXVkZWNvZGUgLW8gLTsnIFwKKydiZWdpbi1iYXNlNjQgNjQ0IEZJTEUKKz09PT0KKycgIiIgIiIKKwordGVzdGluZyAidXVlbmNvZGUgZmlsZSAnQSciICdyPWB1dWVuY29kZSBGSUxFYDsgZWNobyAiJHIiOyBlY2hvICIkciIgfCB1dWRlY29kZSAtbyAtOycgXAorJ2JlZ2luIDY0NCBGSUxFCishMDBgYAorYAorZW5kCitBJyAiIiAiQSIKK3Rlc3RpbmcgInV1ZW5jb2RlIC1tIGZpbGUgJ0EnIiAncj1gdXVlbmNvZGUgLW0gRklMRWA7IGVjaG8gIiRyIjsgZWNobyAiJHIiIHwgdXVkZWNvZGUgLW8gLTsnIFwKKydiZWdpbi1iYXNlNjQgNjQ0IEZJTEUKK1FRPT0KKz09PT0KK0EnICIiICJBIgorCit0ZXN0aW5nICJ1dWVuY29kZSBmaWxlICdBQiciICdyPWB1dWVuY29kZSBGSUxFYDsgZWNobyAiJHIiOyBlY2hvICIkciIgfCB1dWRlY29kZSAtbyAtOycgXAorJ2JlZ2luIDY0NCBGSUxFCisiMDQoYAorYAorZW5kCitBQicgIiIgIkFCIgordGVzdGluZyAidXVlbmNvZGUgLW0gZmlsZSAnQUInIiAncj1gdXVlbmNvZGUgLW0gRklMRWA7IGVjaG8gIiRyIjsgZWNobyAiJHIiIHwgdXVkZWNvZGUgLW8gLTsnIFwKKydiZWdpbi1iYXNlNjQgNjQ0IEZJTEUKK1FVST0KKz09PT0KK0FCJyAiIiAiQUIiCisKK3Rlc3RpbmcgInV1ZW5jb2RlIGZpbGUgJ0FCQyciICdyPWB1dWVuY29kZSBGSUxFYDsgZWNobyAiJHIiOyBlY2hvICIkciIgfCB1dWRlY29kZSAtbyAtOycgXAorJ2JlZ2luIDY0NCBGSUxFCisjMDQpIworYAorZW5kCitBQkMnICIiICJBQkMiCit0ZXN0aW5nICJ1dWVuY29kZSAtbSBmaWxlICdBQkMnIiAncj1gdXVlbmNvZGUgLW0gRklMRWA7IGVjaG8gIiRyIjsgZWNobyAiJHIiIHwgdXVkZWNvZGUgLW8gLTsnIFwKKydiZWdpbi1iYXNlNjQgNjQ0IEZJTEUKK1FVSkQKKz09PT0KK0FCQycgIiIgIkFCQyIKKwordGVzdGluZyAidXVlbmNvZGUgZmlsZSAnQUJDRCciICdyPWB1dWVuY29kZSBGSUxFYDsgZWNobyAiJHIiOyBlY2hvICIkciIgfCB1dWRlY29kZSAtbyAtOycgXAorJ2JlZ2luIDY0NCBGSUxFCiskMDQpIzFgYGAKK2AKK2VuZAorQUJDRCcgIiIgIkFCQ0QiCit0ZXN0aW5nICJ1dWVuY29kZSAtbSBmaWxlICdBQkNEJyIgJ3I9YHV1ZW5jb2RlIC1tIEZJTEVgOyBlY2hvICIkciI7IGVjaG8gIiRyIiB8IHV1ZGVjb2RlIC1vIC07JyBcCisnYmVnaW4tYmFzZTY0IDY0NCBGSUxFCitRVUpEUkE9PQorPT09PQorQUJDRCcgIiIgIkFCQ0QiCisKK3Rlc3RpbmcgInV1ZW5jb2RlIGZpbGUgJ0FCQ0RFJyIgJ3I9YHV1ZW5jb2RlIEZJTEVgOyBlY2hvICIkciI7IGVjaG8gIiRyIiB8IHV1ZGVjb2RlIC1vIC07JyBcCisnYmVnaW4gNjQ0IEZJTEUKKyUwNCkjMSQ0YAorYAorZW5kCitBQkNERScgIiIgIkFCQ0RFIgordGVzdGluZyAidXVlbmNvZGUgLW0gZmlsZSAnQUJDREUnIiAncj1gdXVlbmNvZGUgLW0gRklMRWA7IGVjaG8gIiRyIjsgZWNobyAiJHIiIHwgdXVkZWNvZGUgLW8gLTsnIFwKKydiZWdpbi1iYXNlNjQgNjQ0IEZJTEUKK1FVSkRSRVU9Cis9PT09CitBQkNERScgIiIgIkFCQ0RFIgorCit0ZXN0aW5nICJ1dWVuY29kZSBmaWxlICdBQkNERUYnIiAncj1gdXVlbmNvZGUgRklMRWA7IGVjaG8gIiRyIjsgZWNobyAiJHIiIHwgdXVkZWNvZGUgLW8gLTsnIFwKKydiZWdpbiA2NDQgRklMRQorJjA0KSMxJDUmCitgCitlbmQKK0FCQ0RFRicgIiIgIkFCQ0RFRiIKK3Rlc3RpbmcgInV1ZW5jb2RlIC1tIGZpbGUgJ0FCQ0RFRiciICdyPWB1dWVuY29kZSAtbSBGSUxFYDsgZWNobyAiJHIiOyBlY2hvICIkciIgfCB1dWRlY29kZSAtbyAtOycgXAorJ2JlZ2luLWJhc2U2NCA2NDQgRklMRQorUVVKRFJFVkcKKz09PT0KK0FCQ0RFRicgIiIgIkFCQ0RFRiIKKwordGVzdGluZyAidXVlbmNvZGUgZmlsZSAnQTxOVUw+PDB4ZmY+WiciICdyPWB1dWVuY29kZSBGSUxFYDsgZWNobyAiJHIiOyBlY2hvICIkciIgfCB1dWRlY29kZSAtbyAtOycgXAorJ2JlZ2luIDY0NCBGSUxFCiskMDAjXzZAYGAKK2AKK2VuZAorQVx4MFx4ZmZaJyAiIiAiQVx4MFx4ZmZaIgordGVzdGluZyAidXVlbmNvZGUgLW0gZmlsZSAnQTxOVUw+PDB4ZmY+WiciICdyPWB1dWVuY29kZSAtbSBGSUxFYDsgZWNobyAiJHIiOyBlY2hvICIkciIgfCB1dWRlY29kZSAtbyAtOycgXAorJ2JlZ2luLWJhc2U2NCA2NDQgRklMRQorUVFEL1dnPT0KKz09PT0KK0FceDBceGZmWicgIiIgIkFceDBceGZmWiIKKworZXhpdCAkRkFJTENPVU5UCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvd2Mvd2MtY291bnRzLWFsbCBiL3Rlc3RzdWl0ZS93Yy93Yy1jb3VudHMtYWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwODM2NDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvd2Mvd2MtY291bnRzLWFsbApAQCAtMCwwICsxLDIgQEAKKyMgMSBsaW5lLCA0IHdvcmRzLCAyMCBjaGFycy4KK3Rlc3QgImBlY2hvIGlcJ20gYSBsaXR0bGUgdGVhcG90IHwgYnVzeWJveCB3YyB8IHNlZCAncy8gICovIC9nJyB8IHNlZCAncy9eIC8vJ2AiID0gJzEgNCAyMCcKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS93Yy93Yy1jb3VudHMtY2hhcmFjdGVycyBiL3Rlc3RzdWl0ZS93Yy93Yy1jb3VudHMtY2hhcmFjdGVycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTU4NjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3djL3djLWNvdW50cy1jaGFyYWN0ZXJzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgYGVjaG8gaVwnbSBhIGxpdHRsZSB0ZWFwb3QgfCBidXN5Ym94IHdjIC1jYCAtZXEgMjAKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS93Yy93Yy1jb3VudHMtbGluZXMgYi90ZXN0c3VpdGUvd2Mvd2MtY291bnRzLWxpbmVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViZTZlZDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvd2Mvd2MtY291bnRzLWxpbmVzCkBAIC0wLDAgKzEgQEAKK3Rlc3QgYGVjaG8gaVwnbSBhIGxpdHRsZSB0ZWFwb3QgfCBidXN5Ym94IHdjIC1sYCAtZXEgMQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3djL3djLWNvdW50cy13b3JkcyBiL3Rlc3RzdWl0ZS93Yy93Yy1jb3VudHMtd29yZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMxNjUwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS93Yy93Yy1jb3VudHMtd29yZHMKQEAgLTAsMCArMSBAQAordGVzdCBgZWNobyBpXCdtIGEgbGl0dGxlIHRlYXBvdCB8IGJ1c3lib3ggd2MgLXdgIC1lcSA0CmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvd2Mvd2MtcHJpbnRzLWxvbmdlc3QtbGluZS1sZW5ndGggYi90ZXN0c3VpdGUvd2Mvd2MtcHJpbnRzLWxvbmdlc3QtbGluZS1sZW5ndGgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg4MzFmYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzdWl0ZS93Yy93Yy1wcmludHMtbG9uZ2VzdC1saW5lLWxlbmd0aApAQCAtMCwwICsxIEBACit0ZXN0IGBlY2hvIGlcJ20gYSBsaXR0bGUgdGVhcG90IHwgYnVzeWJveCB3YyAtTGAgLWVxIDE5CmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvd2dldC93Z2V0LS1PLW92ZXJyaWRlcy0tUCBiL3Rlc3RzdWl0ZS93Z2V0L3dnZXQtLU8tb3ZlcnJpZGVzLS1QCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYTNhOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvd2dldC93Z2V0LS1PLW92ZXJyaWRlcy0tUApAQCAtMCwwICsxLDUgQEAKK3Rlc3QgeCIkU0tJUF9JTlRFUk5FVF9URVNUUyIgIT0geCIiICYmIGV4aXQKKworbWtkaXIgZm9vCitidXN5Ym94IHdnZXQgLXEgLU8gaW5kZXguaHRtbCAtUCBmb28gaHR0cDovL3d3dy5nb29nbGUuY29tLwordGVzdCAtcyBpbmRleC5odG1sCmRpZmYgLS1naXQgYS90ZXN0c3VpdGUvd2dldC93Z2V0LWhhbmRsZXMtZW1wdHktcGF0aCBiL3Rlc3RzdWl0ZS93Z2V0L3dnZXQtaGFuZGxlcy1lbXB0eS1wYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZDYwYmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvd2dldC93Z2V0LWhhbmRsZXMtZW1wdHktcGF0aApAQCAtMCwwICsxLDMgQEAKK3Rlc3QgeCIkU0tJUF9JTlRFUk5FVF9URVNUUyIgIT0geCIiICYmIGV4aXQKKworYnVzeWJveCB3Z2V0IGh0dHA6Ly93d3cuZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3dnZXQvd2dldC1yZXRyaWV2ZXMtZ29vZ2xlLWluZGV4IGIvdGVzdHN1aXRlL3dnZXQvd2dldC1yZXRyaWV2ZXMtZ29vZ2xlLWluZGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZGJiOGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvd2dldC93Z2V0LXJldHJpZXZlcy1nb29nbGUtaW5kZXgKQEAgLTAsMCArMSw0IEBACit0ZXN0IHgiJFNLSVBfSU5URVJORVRfVEVTVFMiICE9IHgiIiAmJiBleGl0CisKK2J1c3lib3ggd2dldCAtcSAtTyBmb28gaHR0cDovL3d3dy5nb29nbGUuY29tLwordGVzdCAtcyBmb28KZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS93Z2V0L3dnZXQtc3VwcG9ydHMtLVAgYi90ZXN0c3VpdGUvd2dldC93Z2V0LXN1cHBvcnRzLS1QCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZTRhYzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvd2dldC93Z2V0LXN1cHBvcnRzLS1QCkBAIC0wLDAgKzEsNSBAQAordGVzdCB4IiRTS0lQX0lOVEVSTkVUX1RFU1RTIiAhPSB4IiIgJiYgZXhpdAorCitta2RpciBmb28KK2J1c3lib3ggd2dldCAtcSAtUCBmb28gaHR0cDovL3d3dy5nb29nbGUuY29tLwordGVzdCAtcyBmb28vaW5kZXguaHRtbApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3doaWNoL3doaWNoLXVzZXMtZGVmYXVsdC1wYXRoIGIvdGVzdHN1aXRlL3doaWNoL3doaWNoLXVzZXMtZGVmYXVsdC1wYXRoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYjYwMTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUvd2hpY2gvd2hpY2gtdXNlcy1kZWZhdWx0LXBhdGgKQEAgLTAsMCArMSw0IEBACitCVVNZQk9YPSQoY29tbWFuZCAtdiBidXN5Ym94KQorU0FWRURfUEFUSD0kUEFUSAordW5zZXQgUEFUSAorJEJVU1lCT1ggd2hpY2ggbHMKZGlmZiAtLWdpdCBhL3Rlc3RzdWl0ZS94YXJncy50ZXN0cyBiL3Rlc3RzdWl0ZS94YXJncy50ZXN0cwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yZDBhMjAxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHN1aXRlL3hhcmdzLnRlc3RzCkBAIC0wLDAgKzEsNDQgQEAKKyMhL2Jpbi9zaAorIyBDb3B5cmlnaHQgMjAwOCBieSBEZW55cyBWbGFzZW5rbworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCisuIC4vdGVzdGluZy5zaAorCisjIHRlc3RpbmcgInRlc3QgbmFtZSIgImNvbW1hbmQiICJleHBlY3RlZCByZXN1bHQiICJmaWxlIGlucHV0IiAic3RkaW4iCisKK3Rlc3RpbmcgInhhcmdzIC1FIF8gc3RvcHMgb24gdW5kZXJzY29yZSIgXAorCSJ4YXJncyAtRSBfIiBcCisJImFcbiIgXAorCSIiICJhXG5fXG5iXG4iCisKK3Rlc3RpbmcgInhhcmdzIC1FICcnIiBcCisJInhhcmdzIC1FICcnIiBcCisJImEgXyBiXG4iIFwKKwkiIiAiYVxuX1xuYlxuIgorCit0ZXN0aW5nICJ4YXJncyAtZSB3aXRob3V0IHBhcmFtIiBcCisJInhhcmdzIC1lIiBcCisJImEgXyBiXG4iIFwKKwkiIiAiYVxuX1xuYlxuIgorCit0ZXN0aW5nICJ4YXJncyBkb2VzIG5vdCBzdG9wIG9uIHVuZGVyc2NvcmUgKCduZXcnIEdOVSBiZWhhdmlvcikiIFwKKwkieGFyZ3MiIFwKKwkiYSBfIGJcbiIgXAorCSIiICJhXG5fXG5iXG4iCisKK3Rlc3RpbmcgInhhcmdzIC1zNyBjYW4gdGFrZSBvbmUtY2hhciBpbnB1dCIgXAorCSJ4YXJncyAtczcgZWNobyIgXAorCSJhXG4iIFwKKwkiIiAiYVxuIgorCit0ZXN0aW5nICJ4YXJncyAtc05VTSB0ZXN0IDEiIFwKKwkieGFyZ3MgLXRzMjUgZWNobyAyPiYxID4vZGV2L251bGwiIFwKKwkiZWNobyAxIDIgMyA0IDUgNiA3IDggOSAwXG4iImVjaG8gMSAyIDMgNCA1IDYgNyA4IDlcbiIiZWNobyAwMFxuIiBcCisJIiIgIjEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMDBcbiIKKwordGVzdGluZyAieGFyZ3MgLXNOVU0gdGVzdCAyIiBcCisJInhhcmdzIC10czI1IGVjaG8gMSAyPiYxID4vZGV2L251bGwiIFwKKwkiZWNobyAxIDIgMyA0IDUgNiA3IDggOSAwXG4iImVjaG8gMSAyIDMgNCA1IDYgNyA4IDlcbiIiZWNobyAxIDAwXG4iIFwKKwkiIiAiMiAzIDQgNSA2IDcgOCA5IDAgMiAzIDQgNSA2IDcgOCA5IDAwXG4iCisKK2V4aXQgJEZBSUxDT1VOVApkaWZmIC0tZ2l0IGEvdGVzdHN1aXRlL3hhcmdzL3hhcmdzLXdvcmtzIGIvdGVzdHN1aXRlL3hhcmdzL3hhcmdzLXdvcmtzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NTg2OWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0c3VpdGUveGFyZ3MveGFyZ3Mtd29ya3MKQEAgLTAsMCArMSw0IEBACitbIC1uICIkZCIgXSB8fCBkPS4uCitmaW5kICIkZCIgLW5hbWUgXCp3b3JrcyAtdHlwZSBmIHwgeGFyZ3MgbWQ1c3VtID4gbG9nZmlsZS5nbnUKK2ZpbmQgIiRkIiAtbmFtZSBcKndvcmtzIC10eXBlIGYgfCBidXN5Ym94IHhhcmdzIG1kNXN1bSA+IGxvZ2ZpbGUuYmIKK2RpZmYgLXUgbG9nZmlsZS5nbnUgbG9nZmlsZS5iYgpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9Db25maWcuc3JjIGIvdXRpbC1saW51eC9Db25maWcuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NGIzNjgKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L0NvbmZpZy5zcmMKQEAgLTAsMCArMSw2MjUgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK21lbnUgIkxpbnV4IFN5c3RlbSBVdGlsaXRpZXMiCisKK0lOU0VSVAorCitjb25maWcgQUNQSUQKKwlib29sICJhY3BpZCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBhY3BpZCBsaXN0ZW5zIHRvIEFDUEkgZXZlbnRzIGNvbWluZyBlaXRoZXIgaW4gdGV4dHVhbCBmb3JtIGZyb20KKwkgIC9wcm9jL2FjcGkvZXZlbnQgKHRob3VnaCBpdCBpcyBtYXJrZWQgZGVwcmVjYXRlZCBpdCBpcyBzdGlsbCB3aWRlbHkKKwkgIHVzZWQgYW5kIF9pc18gYSBzdGFuZGFyZCkgb3IgaW4gYmluYXJ5IGZvcm0gZnJvbSBzcGVjaWZpZWQgZXZkZXZzCisJICAoanVzdCB1c2UgL2Rldi9pbnB1dC9ldmVudCopLgorCisJICBJdCBwYXJzZXMgdGhlIGV2ZW50IHRvIHJldHJpZXZlIEFDVElPTiBhbmQgYSBwb3NzaWJsZSBQQVJBTUVURVIuCisJICBJdCB0aGVuIHNwYXducyAvZXRjL2FjcGkvPEFDVElPTj5bLzxQQVJBTUVURVI+XSBlaXRoZXIgdmlhIHJ1bi1wYXJ0cworCSAgKGlmIHRoZSByZXN1bHRpbmcgcGF0aCBpcyBhIGRpcmVjdG9yeSkgb3IgZGlyZWN0bHkgYXMgYW4gZXhlY3V0YWJsZS4KKworCSAgTi5CLiBhY3BpZCByZWxpZXMgb24gcnVuLXBhcnRzIHNvIGhhdmUgdGhlIGxhdHRlciBpbnN0YWxsZWQuCisKK2NvbmZpZyBGRUFUVVJFX0FDUElEX0NPTVBBVAorCWJvb2wgIkFjY2VwdCBhbmQgaWdub3JlIHJlZHVuZGFudCBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gQUNQSUQKKwloZWxwCisJICBBY2NlcHQgYW5kIGlnbm9yZSBjb21wYXRpYmlsaXR5IG9wdGlvbnMgLWcgLW0gLXMgLVMgLXYuCisKK2NvbmZpZyBCTEtJRAorCWJvb2wgImJsa2lkIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCXNlbGVjdCBWT0xVTUVJRAorCWhlbHAKKwkgIExpc3RzIGxhYmVscyBhbmQgVVVJRHMgb2YgYWxsIGZpbGVzeXN0ZW1zLgorCSAgV0FSTklORzoKKwkgIFdpdGggYWxsIHN1Ym1vZHVsZXMgc2VsZWN0ZWQsIGl0IHdpbGwgYWRkIH44ayB0byBidXN5Ym94LgorCitjb25maWcgRkVBVFVSRV9CTEtJRF9UWVBFCisJYm9vbCAiUHJpbnQgZmlsZXN5c3RlbSB0eXBlIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gQkxLSUQKKwloZWxwCisJICBTaG93IFRZUEU9ImZpbGVzeXN0ZW0gdHlwZSIKKworY29uZmlnIERNRVNHCisJYm9vbCAiZG1lc2ciCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgZG1lc2cgaXMgdXNlZCB0byBleGFtaW5lIG9yIGNvbnRyb2wgdGhlIGtlcm5lbCByaW5nIGJ1ZmZlci4gV2hlbiB0aGUKKwkgIExpbnV4IGtlcm5lbCBwcmludHMgbWVzc2FnZXMgdG8gdGhlIHN5c3RlbSBsb2csIHRoZXkgYXJlIHN0b3JlZCBpbgorCSAgdGhlIGtlcm5lbCByaW5nIGJ1ZmZlci4gWW91IGNhbiB1c2UgZG1lc2cgdG8gcHJpbnQgdGhlIGtlcm5lbCdzIHJpbmcKKwkgIGJ1ZmZlciwgY2xlYXIgdGhlIGtlcm5lbCByaW5nIGJ1ZmZlciwgY2hhbmdlIHRoZSBzaXplIG9mIHRoZSBrZXJuZWwKKwkgIHJpbmcgYnVmZmVyLCBhbmQgY2hhbmdlIHRoZSBwcmlvcml0eSBsZXZlbCBhdCB3aGljaCBrZXJuZWwgbWVzc2FnZXMKKwkgIGFyZSBhbHNvIGxvZ2dlZCB0byB0aGUgc3lzdGVtIGNvbnNvbGUuIEVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3UKKwkgIHdpc2ggdG8gZW5hYmxlIHRoZSAnZG1lc2cnIHV0aWxpdHkuCisKK2NvbmZpZyBGRUFUVVJFX0RNRVNHX1BSRVRUWQorCWJvb2wgIlByZXR0eSBkbWVzZyBvdXRwdXQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBETUVTRworCWhlbHAKKwkgIElmIHlvdSB3aXNoIHRvIHNjcnViIHRoZSBzeXNsb2cgbGV2ZWwgZnJvbSB0aGUgb3V0cHV0LCBzYXkgJ1knIGhlcmUuCisJICBUaGUgc3lzbG9nIGxldmVsIGlzIGEgc3RyaW5nIHByZWZpeGVkIHRvIGV2ZXJ5IGxpbmUgd2l0aCB0aGUgZm9ybQorCSAgIjwjPiIuCisKKwkgIFdpdGggdGhpcyBvcHRpb24geW91IHdpbGwgc2VlOgorCSAgICAjIGRtZXNnCisJICAgIExpbnV4IHZlcnNpb24gMi42LjE3LjQgLi4uLi4KKwkgICAgQklPUy1wcm92aWRlZCBwaHlzaWNhbCBSQU0gbWFwOgorCSAgICAgQklPUy1lODIwOiAwMDAwMDAwMDAwMDAwMDAwIC0gMDAwMDAwMDAwMDA5ZjAwMCAodXNhYmxlKQorCisJICBXaXRob3V0IHRoaXMgb3B0aW9uIHlvdSB3aWxsIHNlZToKKwkgICAgIyBkbWVzZworCSAgICA8NT5MaW51eCB2ZXJzaW9uIDIuNi4xNy40IC4uLi4uCisJICAgIDw2PkJJT1MtcHJvdmlkZWQgcGh5c2ljYWwgUkFNIG1hcDoKKwkgICAgPDY+IEJJT1MtZTgyMDogMDAwMDAwMDAwMDAwMDAwMCAtIDAwMDAwMDAwMDAwOWYwMDAgKHVzYWJsZSkKKworY29uZmlnIEZCU0VUCisJYm9vbCAiZmJzZXQiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgZmJzZXQgaXMgdXNlZCB0byBzaG93IG9yIGNoYW5nZSB0aGUgc2V0dGluZ3Mgb2YgYSBMaW51eCBmcmFtZSBidWZmZXIKKwkgIGRldmljZS4gVGhlIGZyYW1lIGJ1ZmZlciBkZXZpY2UgcHJvdmlkZXMgYSBzaW1wbGUgYW5kIHVuaXF1ZQorCSAgaW50ZXJmYWNlIHRvIGFjY2VzcyBhIGdyYXBoaWNzIGRpc3BsYXkuIEVuYWJsZSB0aGlzIG9wdGlvbgorCSAgaWYgeW91IHdpc2ggdG8gZW5hYmxlIHRoZSAnZmJzZXQnIHV0aWxpdHkuCisKK2NvbmZpZyBGRUFUVVJFX0ZCU0VUX0ZBTkNZCisJYm9vbCAiVHVybiBvbiBleHRyYSBmYnNldCBvcHRpb25zIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkJTRVQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIGV4dGVuZGVkIGZic2V0IG9wdGlvbnMsIGFsbG93aW5nIG9uZSB0byBzZXQgdGhlCisJICBmcmFtZWJ1ZmZlciBzaXplLCBjb2xvciBkZXB0aCwgZXRjLiBpbnRlcmZhY2UgdG8gYWNjZXNzIGEgZ3JhcGhpY3MKKwkgIGRpc3BsYXkuIEVuYWJsZSB0aGlzIG9wdGlvbiBpZiB5b3Ugd2lzaCB0byBlbmFibGUgZXh0ZW5kZWQgZmJzZXQKKwkgIG9wdGlvbnMuCisKK2NvbmZpZyBGRUFUVVJFX0ZCU0VUX1JFQURNT0RFCisJYm9vbCAiVHVybiBvbiBmYnNldCByZWFkbW9kZSBzdXBwb3J0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gRkJTRVQKKwloZWxwCisJICBUaGlzIG9wdGlvbiBhbGxvd3MgZmJzZXQgdG8gcmVhZCB0aGUgdmlkZW8gbW9kZSBkYXRhYmFzZSBzdG9yZWQgYnkKKwkgIGRlZmF1bHQgYXMgL2V0Yy9mYi5tb2Rlcywgd2hpY2ggY2FuIGJlIHVzZWQgdG8gc2V0IGZyYW1lIGJ1ZmZlcgorCSAgZGV2aWNlIHRvIHByZS1kZWZpbmVkIHZpZGVvIG1vZGVzLgorCitjb25maWcgRkRGTFVTSAorCWJvb2wgImZkZmx1c2giCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgZmRmbHVzaCBpcyBvbmx5IG5lZWRlZCB3aGVuIGNoYW5naW5nIG1lZGlhIG9uIHNsaWdodGx5LWJyb2tlbgorCSAgcmVtb3ZhYmxlIG1lZGlhIGRyaXZlcy4gSXQgaXMgdXNlZCB0byBtYWtlIExpbnV4IGJlbGlldmUgdGhhdCBhCisJICBoYXJkd2FyZSBkaXNrLWNoYW5nZSBzd2l0Y2ggaGFzIGJlZW4gYWN0dWF0ZWQsIHdoaWNoIGNhdXNlcyBMaW51eCB0bworCSAgZm9yZ2V0IGFueXRoaW5nIGl0IGhhcyBjYWNoZWQgZnJvbSB0aGUgcHJldmlvdXMgbWVkaWEuIElmIHlvdSBoYXZlCisJICBzdWNoIGEgc2xpZ2h0bHktYnJva2VuIGRyaXZlLCB5b3Ugd2lsbCBuZWVkIHRvIHJ1biBmZGZsdXNoIGV2ZXJ5IHRpbWUKKwkgIHlvdSBjaGFuZ2UgYSBkaXNrLiBNb3N0IHBlb3BsZSBoYXZlIHdvcmtpbmcgaGFyZHdhcmUgYW5kIGNhbiBzYWZlbHkKKwkgIGxlYXZlIHRoaXMgZGlzYWJsZWQuCisKK2NvbmZpZyBGREZPUk1BVAorCWJvb2wgImZkZm9ybWF0IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIGZkZm9ybWF0IGlzIHVzZWQgdG8gbG93LWxldmVsIGZvcm1hdCBhIGZsb3BweSBkaXNrLgorCitjb25maWcgRkRJU0sKKwlib29sICJmZGlzayIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGUgZmRpc2sgdXRpbGl0eSBpcyB1c2VkIHRvIGRpdmlkZSBoYXJkIGRpc2tzIGludG8gb25lIG9yIG1vcmUKKwkgIGxvZ2ljYWwgZGlza3MsIHdoaWNoIGFyZSBnZW5lcmFsbHkgY2FsbGVkIHBhcnRpdGlvbnMuIFRoaXMgdXRpbGl0eQorCSAgY2FuIGJlIHVzZWQgdG8gbGlzdCBhbmQgZWRpdCB0aGUgc2V0IG9mIHBhcnRpdGlvbnMgb3IgQlNEIHN0eWxlCisJICAnZGlzayBzbGljZXMnIHRoYXQgYXJlIGRlZmluZWQgb24gYSBoYXJkIGRyaXZlLgorCitjb25maWcgRkRJU0tfU1VQUE9SVF9MQVJHRV9ESVNLUworCWJvb2wgIlN1cHBvcnQgb3ZlciA0R0IgZGlza3MiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRElTSworCWRlcGVuZHMgb24gIUxGUyAgICMgd2l0aCBMRlMgbm8gc3BlY2lhbCBjb2RlIGlzIG5lZWRlZAorCWhlbHAKKwkgIEVuYWJsZSB0aGlzIG9wdGlvbiB0byBzdXBwb3J0IGxhcmdlIGRpc2tzID4gNEdCLgorCitjb25maWcgRkVBVFVSRV9GRElTS19XUklUQUJMRQorCWJvb2wgIldyaXRlIHN1cHBvcnQiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGRElTSworCWhlbHAKKwkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gY3JlYXRlIG9yIGNoYW5nZSBhIHBhcnRpdGlvbiB0YWJsZQorCSAgYW5kIHdyaXRlIHRob3NlIGNoYW5nZXMgb3V0IHRvIGRpc2suIElmIHlvdSBsZWF2ZSB0aGlzIG9wdGlvbgorCSAgZGlzYWJsZWQsIHlvdSB3aWxsIG9ubHkgYmUgYWJsZSB0byB2aWV3IHRoZSBwYXJ0aXRpb24gdGFibGUuCisKK2NvbmZpZyBGRUFUVVJFX0FJWF9MQUJFTAorCWJvb2wgIlN1cHBvcnQgQUlYIGRpc2tsYWJlbHMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBGRElTSyAmJiBGRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisJaGVscAorCSAgRW5hYmxpbmcgdGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBjcmVhdGUgb3IgY2hhbmdlIEFJWCBkaXNrbGFiZWxzLgorCSAgTW9zdCBwZW9wbGUgY2FuIHNhZmVseSBsZWF2ZSB0aGlzIG9wdGlvbiBkaXNhYmxlZC4KKworY29uZmlnIEZFQVRVUkVfU0dJX0xBQkVMCisJYm9vbCAiU3VwcG9ydCBTR0kgZGlza2xhYmVscyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZESVNLICYmIEZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKwloZWxwCisJICBFbmFibGluZyB0aGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGNyZWF0ZSBvciBjaGFuZ2UgU0dJIGRpc2tsYWJlbHMuCisJICBNb3N0IHBlb3BsZSBjYW4gc2FmZWx5IGxlYXZlIHRoaXMgb3B0aW9uIGRpc2FibGVkLgorCitjb25maWcgRkVBVFVSRV9TVU5fTEFCRUwKKwlib29sICJTdXBwb3J0IFNVTiBkaXNrbGFiZWxzIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gRkRJU0sgJiYgRkVBVFVSRV9GRElTS19XUklUQUJMRQorCWhlbHAKKwkgIEVuYWJsaW5nIHRoaXMgb3B0aW9uIGFsbG93cyB5b3UgdG8gY3JlYXRlIG9yIGNoYW5nZSBTVU4gZGlza2xhYmVscy4KKwkgIE1vc3QgcGVvcGxlIGNhbiBzYWZlbHkgbGVhdmUgdGhpcyBvcHRpb24gZGlzYWJsZWQuCisKK2NvbmZpZyBGRUFUVVJFX09TRl9MQUJFTAorCWJvb2wgIlN1cHBvcnQgQlNEIGRpc2tsYWJlbHMiCisJZGVmYXVsdCBuCisJZGVwZW5kcyBvbiBGRElTSyAmJiBGRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisJaGVscAorCSAgRW5hYmxpbmcgdGhpcyBvcHRpb24gYWxsb3dzIHlvdSB0byBjcmVhdGUgb3IgY2hhbmdlIEJTRCBkaXNrbGFiZWxzCisJICBhbmQgZGVmaW5lIGFuZCBlZGl0IEJTRCBkaXNrIHNsaWNlcy4KKworY29uZmlnIEZFQVRVUkVfR1BUX0xBQkVMCisJYm9vbCAiU3VwcG9ydCBHUFQgZGlza2xhYmVscyIKKwlkZWZhdWx0IG4KKwlkZXBlbmRzIG9uIEZESVNLICYmIEZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKwloZWxwCisJICBFbmFibGluZyB0aGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIHZpZXcgR1VJRCBQYXJ0aXRpb24gVGFibGUKKwkgIGRpc2tsYWJlbHMuCisKK2NvbmZpZyBGRUFUVVJFX0ZESVNLX0FEVkFOQ0VECisJYm9vbCAiU3VwcG9ydCBleHBlcnQgbW9kZSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZESVNLICYmIEZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKwloZWxwCisJICBFbmFibGluZyB0aGlzIG9wdGlvbiBhbGxvd3MgeW91IHRvIGRvIHRlcnJpYmx5IHVuc2FmZSB0aGluZ3MgbGlrZQorCSAgZGVmaW5lIGFyYml0cmFyeSBkcml2ZSBnZW9tZXRyeSwgbW92ZSB0aGUgYmVnaW5uaW5nIG9mIGRhdGEgaW4gYQorCSAgcGFydGl0aW9uLCBhbmQgc2ltaWxhcmx5IGV2aWwgdGhpbmdzLiBVbmxlc3MgeW91IGhhdmUgYSB2ZXJ5IGdvb2QKKwkgIHJlYXNvbiB5b3Ugd291bGQgYmUgd2lzZSB0byBsZWF2ZSB0aGlzIGRpc2FibGVkLgorCitjb25maWcgRklOREZTCisJYm9vbCAiZmluZGZzIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCXNlbGVjdCBWT0xVTUVJRAorCWhlbHAKKwkgIFByaW50cyB0aGUgbmFtZSBvZiBhIGZpbGVzeXN0ZW0gd2l0aCBnaXZlbiBsYWJlbCBvciBVVUlELgorCSAgV0FSTklORzoKKwkgIFdpdGggYWxsIHN1Ym1vZHVsZXMgc2VsZWN0ZWQsIGl0IHdpbGwgYWRkIH44ayB0byBidXN5Ym94LgorCitjb25maWcgRkxPQ0sKKwlib29sICJmbG9jayIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBNYW5hZ2UgbG9ja3MgZnJvbSBzaGVsbCBzY3JpcHRzCisKK2NvbmZpZyBGUkVFUkFNRElTSworCWJvb2wgImZyZWVyYW1kaXNrIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIExpbnV4IGFsbG93cyB5b3UgdG8gY3JlYXRlIHJhbWRpc2tzLiBUaGlzIHV0aWxpdHkgYWxsb3dzIHlvdSB0bworCSAgZGVsZXRlIHRoZW0gYW5kIGNvbXBsZXRlbHkgZnJlZSBhbGwgbWVtb3J5IHRoYXQgd2FzIHVzZWQgZm9yIHRoZQorCSAgcmFtZGlzay4gRm9yIGV4YW1wbGUsIGlmIHlvdSBib290IExpbnV4IGludG8gYSByYW1kaXNrIGFuZCBsYXRlcgorCSAgcGl2b3Rfcm9vdCwgeW91IG1heSB3YW50IHRvIGZyZWUgdGhlIG1lbW9yeSB0aGF0IGlzIGFsbG9jYXRlZCB0byB0aGUKKwkgIHJhbWRpc2suIElmIHlvdSBoYXZlIG5vIHVzZSBmb3IgZnJlZWluZyBtZW1vcnkgZnJvbSBhIHJhbWRpc2ssIGxlYXZlCisJICB0aGlzIGRpc2FibGVkLgorCitjb25maWcgRlNDS19NSU5JWAorCWJvb2wgImZzY2tfbWluaXgiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIG1pbml4IGZpbGVzeXN0ZW0gaXMgYSBuaWNlLCBzbWFsbCwgY29tcGFjdCwgcmVhZC13cml0ZSBmaWxlc3lzdGVtCisJICB3aXRoIGxpdHRsZSBvdmVyaGVhZC4gSXQgaXMgbm90IGEgam91cm5hbGluZyBmaWxlc3lzdGVtIGhvd2V2ZXIgYW5kCisJICBjYW4gZXhwZXJpZW5jZSBjb3JydXB0aW9uIGlmIGl0IGlzIG5vdCBwcm9wZXJseSB1bm1vdW50ZWQgb3IgaWYgdGhlCisJICBwb3dlciBnb2VzIG9mZiBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuIFRoaXMgdXRpbGl0eSBhbGxvd3MgeW91IHRvCisJICBjaGVjayBmb3IgYW5kIGF0dGVtcHQgdG8gcmVwYWlyIGFueSBjb3JydXB0aW9uIHRoYXQgb2NjdXJzIHRvIGEgbWluaXgKKwkgIGZpbGVzeXN0ZW0uCisKK2NvbmZpZyBNS0ZTX0VYVDIKKwlib29sICJta2ZzX2V4dDIiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVXRpbGl0eSB0byBjcmVhdGUgRVhUMiBmaWxlc3lzdGVtcy4KKworY29uZmlnIE1LRlNfTUlOSVgKKwlib29sICJta2ZzX21pbml4IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoZSBtaW5peCBmaWxlc3lzdGVtIGlzIGEgbmljZSwgc21hbGwsIGNvbXBhY3QsIHJlYWQtd3JpdGUgZmlsZXN5c3RlbQorCSAgd2l0aCBsaXR0bGUgb3ZlcmhlYWQuIElmIHlvdSB3aXNoIHRvIGJlIGFibGUgdG8gY3JlYXRlIG1pbml4CisJICBmaWxlc3lzdGVtcyB0aGlzIHV0aWxpdHkgd2lsbCBkbyB0aGUgam9iIGZvciB5b3UuCisKK2NvbmZpZyBGRUFUVVJFX01JTklYMgorCWJvb2wgIlN1cHBvcnQgTWluaXggZnMgdjIgKGZzY2tfbWluaXgvbWtmc19taW5peCkiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBGU0NLX01JTklYIHx8IE1LRlNfTUlOSVgKKwloZWxwCisJICBJZiB5b3Ugd2lzaCB0byBiZSBhYmxlIHRvIGNyZWF0ZSB2ZXJzaW9uIDIgbWluaXggZmlsZXN5c3RlbXMsIGVuYWJsZQorCSAgdGhpcy4gSWYgeW91IGVuYWJsZWQgJ21rZnNfbWluaXgnIHRoZW4geW91IGFsbW9zdCBjZXJ0YWlubHkgd2FudCB0bworCSAgYmUgdXNpbmcgdGhlIHZlcnNpb24gMiBmaWxlc3lzdGVtIHN1cHBvcnQuCisKK2NvbmZpZyBNS0ZTX1JFSVNFUgorCWJvb2wgIm1rZnNfcmVpc2VyIgorCWRlZmF1bHQgbgorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFV0aWxpdHkgdG8gY3JlYXRlIFJlaXNlckZTIGZpbGVzeXN0ZW1zLgorCSAgTm90ZTogdGhpcyBhcHBsZXQgbmVlZHMgYSBsb3Qgb2YgdGVzdGluZyBhbmQgcG9saXNoaW5nLgorCitjb25maWcgTUtGU19WRkFUCisJYm9vbCAibWtmc192ZmF0IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFV0aWxpdHkgdG8gY3JlYXRlIEZBVDMyIGZpbGVzeXN0ZW1zLgorCitjb25maWcgR0VUT1BUCisJYm9vbCAiZ2V0b3B0IgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSBnZXRvcHQgdXRpbGl0eSBpcyB1c2VkIHRvIGJyZWFrIHVwIChwYXJzZSkgb3B0aW9ucyBpbiBjb21tYW5kCisJICBsaW5lcyB0byBtYWtlIGl0IGVhc3kgdG8gd3JpdGUgY29tcGxleCBzaGVsbCBzY3JpcHRzIHRoYXQgYWxzbyBjaGVjaworCSAgZm9yIGxlZ2FsIChhbmQgaWxsZWdhbCkgb3B0aW9ucy4gSWYgeW91IHdhbnQgdG8gd3JpdGUgaG9ycmlibHkKKwkgIGNvbXBsZXggc2hlbGwgc2NyaXB0cywgb3IgdXNlIHNvbWUgaG9ycmlibHkgY29tcGxleCBzaGVsbCBzY3JpcHQKKwkgIHdyaXR0ZW4gYnkgb3RoZXJzLCB0aGlzIHV0aWxpdHkgbWF5IGJlIGZvciB5b3UuIE1vc3QgcGVvcGxlIHdpbGwKKwkgIHdpc2VseSBsZWF2ZSB0aGlzIGRpc2FibGVkLgorCitjb25maWcgRkVBVFVSRV9HRVRPUFRfTE9ORworCWJvb2wgIlN1cHBvcnQgb3B0aW9uIC1sIgorCWRlZmF1bHQgeSBpZiBMT05HX09QVFMKKwlkZXBlbmRzIG9uIEdFVE9QVAorCWhlbHAKKwkgIEVuYWJsZSBzdXBwb3J0IGZvciBsb25nIG9wdGlvbnMgKG9wdGlvbiAtbCkuCisKK2NvbmZpZyBIRVhEVU1QCisJYm9vbCAiaGV4ZHVtcCIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGUgaGV4ZHVtcCB1dGlsaXR5IGlzIHVzZWQgdG8gZGlzcGxheSBiaW5hcnkgZGF0YSBpbiBhIHJlYWRhYmxlCisJICB3YXkgdGhhdCBpcyBjb21wYXJhYmxlIHRvIHRoZSBvdXRwdXQgZnJvbSBtb3N0IGhleCBlZGl0b3JzLgorCitjb25maWcgRkVBVFVSRV9IRVhEVU1QX1JFVkVSU0UKKwlib29sICJTdXBwb3J0IC1SLCByZXZlcnNlIG9mICdoZXhkdW1wIC1DdiciCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBIRVhEVU1QCisJaGVscAorCSAgVGhlIGhleGR1bXAgdXRpbGl0eSBpcyB1c2VkIHRvIGRpc3BsYXkgYmluYXJ5IGRhdGEgaW4gYW4gYXNjaWkKKwkgIHJlYWRhYmxlIHdheS4gVGhpcyBvcHRpb24gY3JlYXRlcyBiaW5hcnkgZGF0YSBmcm9tIGFuIGFzY2lpIGlucHV0LgorCSAgTkI6IHRoaXMgb3B0aW9uIGlzIG5vbi1zdGFuZGFyZC4gSXQncyB1bndpc2UgdG8gdXNlIGl0IGluIHNjcmlwdHMKKwkgIGFpbWVkIHRvIGJlIHBvcnRhYmxlLgorCitjb25maWcgSEQKKwlib29sICJoZCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhFWERVTVAKKwloZWxwCisJICBoZCBpcyBhbiBhbGlhcyB0byBoZXhkdW1wIC1DLgorCitjb25maWcgSFdDTE9DSworCWJvb2wgImh3Y2xvY2siCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhlIGh3Y2xvY2sgdXRpbGl0eSBpcyB1c2VkIHRvIHJlYWQgYW5kIHNldCB0aGUgaGFyZHdhcmUgY2xvY2sKKwkgIG9uIGEgc3lzdGVtLiBUaGlzIGlzIHByaW1hcmlseSB1c2VkIHRvIHNldCB0aGUgY3VycmVudCB0aW1lIG9uCisJICBzaHV0ZG93biBpbiB0aGUgaGFyZHdhcmUgY2xvY2ssIHNvIHRoZSBoYXJkd2FyZSB3aWxsIGtlZXAgdGhlCisJICBjb3JyZWN0IHRpbWUgd2hlbiBMaW51eCBpcyBfbm90XyBydW5uaW5nLgorCitjb25maWcgRkVBVFVSRV9IV0NMT0NLX0xPTkdfT1BUSU9OUworCWJvb2wgIlN1cHBvcnQgbG9uZyBvcHRpb25zICgtLWhjdG9zeXMsLi4uKSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEhXQ0xPQ0sgJiYgTE9OR19PUFRTCisJaGVscAorCSAgQnkgZGVmYXVsdCwgdGhlIGh3Y2xvY2sgdXRpbGl0eSBvbmx5IHVzZXMgc2hvcnQgb3B0aW9ucy4gSWYgeW91CisJICBhcmUgb3Zlcmx5IGZvbmQgb2YgaXRzIGxvbmcgb3B0aW9ucywgc3VjaCBhcyAtLWhjdG9zeXMsIC0tdXRjLCBldGMpCisJICB0aGVuIGVuYWJsZSB0aGlzIG9wdGlvbi4KKworY29uZmlnIEZFQVRVUkVfSFdDTE9DS19BREpUSU1FX0ZIUworCWJvb2wgIlVzZSBGSFMgL3Zhci9saWIvaHdjbG9jay9hZGp0aW1lIgorCWRlZmF1bHQgbiAgIyB1dGlsLWxpbnV4LW5nIGluIEZlZG9yYSAxMyBzdGlsbCB1c2VzIC9ldGMvYWRqdGltZQorCWRlcGVuZHMgb24gSFdDTE9DSworCWhlbHAKKwkgIFN0YXJ0aW5nIHdpdGggRkhTIDIuMywgdGhlIGFkanRpbWUgc3RhdGUgZmlsZSBpcyBzdXBwb3NlZCB0byBleGlzdAorCSAgYXQgL3Zhci9saWIvaHdjbG9jay9hZGp0aW1lIGluc3RlYWQgb2YgL2V0Yy9hZGp0aW1lLiBJZiB5b3Ugd2lzaAorCSAgdG8gdXNlIHRoZSBGSFMgYmVoYXZpb3IsIGFuc3dlciBZIGhlcmUsIG90aGVyd2lzZSBhbnN3ZXIgTiBmb3IgdGhlCisJICBjbGFzc2ljIC9ldGMvYWRqdGltZSBwYXRoLgorCisJICBwYXRobmFtZS5jb20vZmhzL3B1Yi9maHMtMi4zLmh0bWwjVkFSTElCSFdDTE9DS1NUQVRFRElSRUNUT1JZRk9SSFdDTE8KKworY29uZmlnIElQQ1JNCisJYm9vbCAiaXBjcm0iCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIGlwY3JtIHV0aWxpdHkgYWxsb3dzIHRoZSByZW1vdmFsIG9mIFN5c3RlbSBWIGludGVycHJvY2VzcworCSAgY29tbXVuaWNhdGlvbiAoSVBDKSBvYmplY3RzIGFuZCB0aGUgYXNzb2NpYXRlZCBkYXRhIHN0cnVjdHVyZXMKKwkgIGZyb20gdGhlIHN5c3RlbS4KKworY29uZmlnIElQQ1MKKwlib29sICJpcGNzIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoZSBpcGNzIHV0aWxpdHkgaXMgdXNlZCB0byBwcm92aWRlIGluZm9ybWF0aW9uIG9uIHRoZSBjdXJyZW50bHkKKwkgIGFsbG9jYXRlZCBTeXN0ZW0gViBpbnRlcnByb2Nlc3MgKElQQykgb2JqZWN0cyBpbiB0aGUgc3lzdGVtLgorCitjb25maWcgTE9TRVRVUAorCWJvb2wgImxvc2V0dXAiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgbG9zZXR1cCBpcyB1c2VkIHRvIGFzc29jaWF0ZSBvciBkZXRhY2ggYSBsb29wIGRldmljZSB3aXRoIGEgcmVndWxhcgorCSAgZmlsZSBvciBibG9jayBkZXZpY2UsIGFuZCB0byBxdWVyeSB0aGUgc3RhdHVzIG9mIGEgbG9vcCBkZXZpY2UuIFRoaXMKKwkgIHZlcnNpb24gZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgZW5hYmxpbmcgZGF0YSBlbmNyeXB0aW9uLgorCitjb25maWcgTFNQQ0kKKwlib29sICJsc3BjaSIKKwlkZWZhdWx0IHkKKwkjc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgbHNwY2kgaXMgYSB1dGlsaXR5IGZvciBkaXNwbGF5aW5nIGluZm9ybWF0aW9uIGFib3V0IFBDSSBidXNlcyBpbiB0aGUKKwkgIHN5c3RlbSBhbmQgZGV2aWNlcyBjb25uZWN0ZWQgdG8gdGhlbS4KKworCSAgVGhpcyB2ZXJzaW9uIHVzZXMgc3lzZnMgKC9zeXMvYnVzL3BjaS9kZXZpY2VzKSBvbmx5LgorCitjb25maWcgTFNVU0IKKwlib29sICJsc3VzYiIKKwlkZWZhdWx0IHkKKwkjc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgbHN1c2IgaXMgYSB1dGlsaXR5IGZvciBkaXNwbGF5aW5nIGluZm9ybWF0aW9uIGFib3V0IFVTQiBidXNlcyBpbiB0aGUKKwkgIHN5c3RlbSBhbmQgZGV2aWNlcyBjb25uZWN0ZWQgdG8gdGhlbS4KKworCSAgVGhpcyB2ZXJzaW9uIHVzZXMgc3lzZnMgKC9zeXMvYnVzL3VzYi9kZXZpY2VzKSBvbmx5LgorCitjb25maWcgTUtTV0FQCisJYm9vbCAibWtzd2FwIgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSBta3N3YXAgdXRpbGl0eSBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBhIGZpbGUgb3IgZGlzayBwYXJ0aXRpb24gYXMKKwkgIExpbnV4IHN3YXAgc3BhY2UuIFRoaXMgYWxsb3dzIExpbnV4IHRvIHVzZSB0aGUgZW50aXJlIGZpbGUgb3IKKwkgIHBhcnRpdGlvbiBhcyBpZiBpdCB3ZXJlIGFkZGl0aW9uYWwgUkFNLCB3aGljaCBjYW4gZ3JlYXRseSBpbmNyZWFzZQorCSAgdGhlIGNhcGFiaWxpdHkgb2YgbG93LW1lbW9yeSBtYWNoaW5lcy4gVGhpcyBhZGRpdGlvbmFsIG1lbW9yeSBpcworCSAgbXVjaCBzbG93ZXIgdGhhbiByZWFsIFJBTSwgYnV0IGNhbiBiZSB2ZXJ5IGhlbHBmdWwgYXQgcHJldmVudGluZyB5b3VyCisJICBhcHBsaWNhdGlvbnMgYmVpbmcga2lsbGVkIGJ5IHRoZSBMaW51eCBvdXQgb2YgbWVtb3J5IChPT00pIGtpbGxlci4KKwkgIE9uY2UgeW91IGhhdmUgY3JlYXRlZCBzd2FwIHNwYWNlIHVzaW5nICdta3N3YXAnIHlvdSBuZWVkIHRvIGVuYWJsZQorCSAgdGhlIHN3YXAgc3BhY2UgdXNpbmcgdGhlICdzd2Fwb24nIHV0aWxpdHkuCisKK2NvbmZpZyBGRUFUVVJFX01LU1dBUF9VVUlECisJYm9vbCAiVVVJRCBzdXBwb3J0IgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gTUtTV0FQCisJaGVscAorCSAgR2VuZXJhdGUgc3dhcCBzcGFjZXMgd2l0aCB1bml2ZXJzYWxseSB1bmlxdWUgaWRlbnRpZmllcnMuCisKK2NvbmZpZyBNT1JFCisJYm9vbCAibW9yZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBtb3JlIGlzIGEgc2ltcGxlIHV0aWxpdHkgd2hpY2ggYWxsb3dzIHlvdSB0byByZWFkIHRleHQgb25lIHNjcmVlbgorCSAgc2l6ZWQgcGFnZSBhdCBhIHRpbWUuIElmIHlvdSB3YW50IHRvIHJlYWQgdGV4dCB0aGF0IGlzIGxhcmdlciB0aGFuCisJICB0aGUgc2NyZWVuLCBhbmQgeW91IGFyZSB1c2luZyBhbnl0aGluZyBmYXN0ZXIgdGhhbiBhIDMwMCBiYXVkIG1vZGVtLAorCSAgeW91IHdpbGwgcHJvYmFibHkgZmluZCB0aGlzIHV0aWxpdHkgdmVyeSBoZWxwZnVsLiBJZiB5b3UgZG9uJ3QgaGF2ZQorCSAgYW55IG5lZWQgdG8gcmVhZGluZyB0ZXh0IGZpbGVzLCB5b3UgY2FuIGxlYXZlIHRoaXMgZGlzYWJsZWQuCisKK2NvbmZpZyBQSVZPVF9ST09UCisJYm9vbCAicGl2b3Rfcm9vdCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBUaGUgcGl2b3Rfcm9vdCB1dGlsaXR5IHN3YXBzIHRoZSBtb3VudCBwb2ludHMgZm9yIHRoZSByb290IGZpbGVzeXN0ZW0KKwkgIHdpdGggc29tZSBvdGhlciBtb3VudGVkIGZpbGVzeXN0ZW0uIFRoaXMgYWxsb3dzIHlvdSB0byBkbyBhbGwgc29ydHMKKwkgIG9mIHdpbGQgYW5kIGNyYXp5IHRoaW5ncyB3aXRoIHlvdXIgTGludXggc3lzdGVtIGFuZCBpcyBmYXIgbW9yZQorCSAgcG93ZXJmdWwgdGhhbiAnY2hyb290Jy4KKworCSAgTm90ZTogVGhpcyBpcyBmb3IgaW5pdHJkIGluIGxpbnV4IDIuNC4gVW5kZXIgaW5pdHJhbWZzIChpbnRyb2R1Y2VkCisJICBpbiBsaW51eCAyLjYpIHVzZSBzd2l0Y2hfcm9vdCBpbnN0ZWFkLgorCitjb25maWcgUkRBVEUKKwlib29sICJyZGF0ZSIKKwlkZWZhdWx0IHkKKwloZWxwCisJICBUaGUgcmRhdGUgdXRpbGl0eSBhbGxvd3MgeW91IHRvIHN5bmNocm9uaXplIHRoZSBkYXRlIGFuZCB0aW1lIG9mIHlvdXIKKwkgIHN5c3RlbSBjbG9jayB3aXRoIHRoZSBkYXRlIGFuZCB0aW1lIG9mIGEgcmVtb3RlIG5ldHdvcmtlZCBzeXN0ZW0gdXNpbmcKKwkgIHRoZSBSRkM4NjggcHJvdG9jb2wsIHdoaWNoIGlzIGJ1aWx0IGludG8gdGhlIGluZXRkIGRhZW1vbiBvbiBtb3N0CisJICBzeXN0ZW1zLgorCitjb25maWcgUkRFVgorCWJvb2wgInJkZXYiCisJZGVmYXVsdCB5CisJaGVscAorCSAgUHJpbnQgdGhlIGRldmljZSBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmlsZXN5c3RlbSBtb3VudGVkIGF0ICcvJy4KKworY29uZmlnIFJFQURQUk9GSUxFCisJYm9vbCAicmVhZHByb2ZpbGUiCisJZGVmYXVsdCB5CisJI3NlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoaXMgYWxsb3dzIHlvdSB0byBwYXJzZSAvcHJvYy9wcm9maWxlIGZvciBiYXNpYyBwcm9maWxpbmcuCisKK2NvbmZpZyBSVENXQUtFCisJYm9vbCAicnRjd2FrZSIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBFbnRlciBhIHN5c3RlbSBzbGVlcCBzdGF0ZSB1bnRpbCBzcGVjaWZpZWQgd2FrZXVwIHRpbWUuCisKK2NvbmZpZyBTQ1JJUFQKKwlib29sICJzY3JpcHQiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhlIHNjcmlwdCBtYWtlcyB0eXBlc2NyaXB0IG9mIHRlcm1pbmFsIHNlc3Npb24uCisKK2NvbmZpZyBTQ1JJUFRSRVBMQVkKKwlib29sICJzY3JpcHRyZXBsYXkiCisJZGVmYXVsdCB5CisJaGVscAorCSAgVGhpcyBwcm9ncmFtIHJlcGxheXMgYSB0eXBlc2NyaXB0LCB1c2luZyB0aW1pbmcgaW5mb3JtYXRpb24KKwkgIGdpdmVuIGJ5IHNjcmlwdCAtdC4KKworY29uZmlnIFNFVEFSQ0gKKwlib29sICJzZXRhcmNoIgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoZSBsaW51eDMyIHV0aWxpdHkgaXMgdXNlZCB0byBjcmVhdGUgYSAzMmJpdCBlbnZpcm9ubWVudCBmb3IgdGhlCisJICBzcGVjaWZpZWQgcHJvZ3JhbSAodXN1YWxseSBhIHNoZWxsKS4gSXQgb25seSBtYWtlcyBzZW5zZSB0byBoYXZlCisJICB0aGlzIHV0aWwgb24gYSBzeXN0ZW0gdGhhdCBzdXBwb3J0cyBib3RoIDY0Yml0IGFuZCAzMmJpdCB1c2VybGFuZAorCSAgKGxpa2UgYW1kNjQveDg2LCBwcGM2NC9wcGMsIHNwYXJjNjQvc3BhcmMsIGV0Yy4uLikuCisKK2NvbmZpZyBTV0FQT05PRkYKKwlib29sICJzd2Fwb25vZmYiCisJZGVmYXVsdCB5CisJc2VsZWN0IFBMQVRGT1JNX0xJTlVYCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBib3RoIHRoZSAnc3dhcG9uJyBhbmQgdGhlICdzd2Fwb2ZmJyB1dGlsaXRpZXMuCisJICBPbmNlIHlvdSBoYXZlIGNyZWF0ZWQgc29tZSBzd2FwIHNwYWNlIHVzaW5nICdta3N3YXAnLCB5b3UgYWxzbyBuZWVkCisJICB0byBlbmFibGUgeW91ciBzd2FwIHNwYWNlIHdpdGggdGhlICdzd2Fwb24nIHV0aWxpdHkuIFRoZSAnc3dhcG9mZicKKwkgIHV0aWxpdHkgaXMgdXNlZCwgdHlwaWNhbGx5IGF0IHN5c3RlbSBzaHV0ZG93biwgdG8gZGlzYWJsZSBhbnkgc3dhcAorCSAgc3BhY2UuIElmIHlvdSBhcmUgbm90IHVzaW5nIGFueSBzd2FwIHNwYWNlLCB5b3UgY2FuIGxlYXZlIHRoaXMKKwkgIG9wdGlvbiBkaXNhYmxlZC4KKworY29uZmlnIEZFQVRVUkVfU1dBUE9OX0RJU0NBUkQKKwlib29sICJTdXBwb3J0IGRpc2NhcmQgb3B0aW9uIC1kIgorCWRlZmF1bHQgeQorCWRlcGVuZHMgb24gU1dBUE9OT0ZGCisJaGVscAorCSAgRW5hYmxlIHN1cHBvcnQgZm9yIGRpc2NhcmRpbmcgc3dhcCBhcmVhIGJsb2NrcyBhdCBzd2Fwb24gYW5kL29yIGFzCisJICB0aGUga2VybmVsIGZyZWVzIHRoZW0uIFRoaXMgb3B0aW9uIGVuYWJsZXMgYm90aCB0aGUgLWQgb3B0aW9uIG9uCisJICAnc3dhcG9uJyBhbmQgdGhlICdkaXNjYXJkJyBvcHRpb24gZm9yIHN3YXAgZW50cmllcyBpbiAvZXRjL2ZzdGFiLgorCitjb25maWcgRkVBVFVSRV9TV0FQT05fUFJJCisJYm9vbCAiU3VwcG9ydCBwcmlvcml0eSBvcHRpb24gLXAiCisJZGVmYXVsdCB5CisJZGVwZW5kcyBvbiBTV0FQT05PRkYKKwloZWxwCisJICBFbmFibGUgc3VwcG9ydCBmb3Igc2V0dGluZyBzd2FwIGRldmljZSBwcmlvcml0eSBpbiBzd2Fwb24uCisKK2NvbmZpZyBTV0lUQ0hfUk9PVAorCWJvb2wgInN3aXRjaF9yb290IgorCWRlZmF1bHQgeQorCXNlbGVjdCBQTEFURk9STV9MSU5VWAorCWhlbHAKKwkgIFRoZSBzd2l0Y2hfcm9vdCB1dGlsaXR5IGlzIHVzZWQgZnJvbSBpbml0cmFtZnMgdG8gc2VsZWN0IGEgbmV3CisJICByb290IGRldmljZS4gVW5kZXIgaW5pdHJhbWZzLCB5b3UgaGF2ZSB0byB1c2UgdGhpcyBpbnN0ZWFkIG9mCisJICBwaXZvdF9yb290LiAoU3RvcCByZWFkaW5nIGhlcmUgaWYgeW91IGRvbid0IGNhcmUgd2h5LikKKworCSAgQm9vdGluZyB3aXRoIGluaXRyYW1mcyBleHRyYWN0cyBhIGd6aXBwZWQgY3BpbyBhcmNoaXZlIGludG8gcm9vdGZzCisJICAod2hpY2ggaXMgYSB2YXJpYW50IG9mIHJhbWZzL3RtcGZzKS4gQmVjYXVzZSByb290ZnMgY2FuJ3QgYmUgbW92ZWQKKwkgIG9yIHVubW91bnRlZCosIHBpdm90X3Jvb3Qgd2lsbCBub3Qgd29yayBmcm9tIGluaXRyYW1mcy4gSW5zdGVhZCwKKwkgIHN3aXRjaF9yb290IGRlbGV0ZXMgZXZlcnl0aGluZyBvdXQgb2Ygcm9vdGZzIChpbmNsdWRpbmcgaXRzZWxmKSwKKwkgIGRvZXMgYSBtb3VudCAtLW1vdmUgdGhhdCBvdmVybW91bnRzIHJvb3RmcyB3aXRoIHRoZSBuZXcgcm9vdCwgYW5kCisJICB0aGVuIGV4ZWNzIHRoZSBzcGVjaWZpZWQgaW5pdCBwcm9ncmFtLgorCisJICAqIEJlY2F1c2UgdGhlIExpbnV4IGtlcm5lbCB1c2VzIHJvb3RmcyBpbnRlcm5hbGx5IGFzIHRoZSBzdGFydGluZworCSAgYW5kIGVuZGluZyBwb2ludCBmb3Igc2VhcmNoaW5nIHRocm91Z2ggdGhlIGtlcm5lbCdzIGRvdWJseSBsaW5rZWQKKwkgIGxpc3Qgb2YgYWN0aXZlIG1vdW50IHBvaW50cy4gVGhhdCdzIHdoeS4KKworY29uZmlnIFVNT1VOVAorCWJvb2wgInVtb3VudCIKKwlkZWZhdWx0IHkKKwlzZWxlY3QgUExBVEZPUk1fTElOVVgKKwloZWxwCisJICBXaGVuIHlvdSB3YW50IHRvIHJlbW92ZSBhIG1vdW50ZWQgZmlsZXN5c3RlbSBmcm9tIGl0cyBjdXJyZW50IG1vdW50CisJICBwb2ludCwgZm9yIGV4YW1wbGUgd2hlbiB5b3UgYXJlIHNodXR0aW5nIGRvd24gdGhlIHN5c3RlbSwgdGhlCisJICAndW1vdW50JyB1dGlsaXR5IGlzIHRoZSB0b29sIHRvIHVzZS4gSWYgeW91IGVuYWJsZWQgdGhlICdtb3VudCcKKwkgIHV0aWxpdHksIHlvdSBhbG1vc3QgY2VydGFpbmx5IGFsc28gd2FudCB0byBlbmFibGUgJ3Vtb3VudCcuCisKK2NvbmZpZyBGRUFUVVJFX1VNT1VOVF9BTEwKKwlib29sICJTdXBwb3J0IG9wdGlvbiAtYSIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIFVNT1VOVAorCWhlbHAKKwkgIFN1cHBvcnQgLWEgb3B0aW9uIHRvIHVubW91bnQgYWxsIGN1cnJlbnRseSBtb3VudGVkIGZpbGVzeXN0ZW1zLgorCitjb21tZW50ICJDb21tb24gb3B0aW9ucyBmb3IgbW91bnQvdW1vdW50IgorCWRlcGVuZHMgb24gTU9VTlQgfHwgVU1PVU5UCisKK2NvbmZpZyBGRUFUVVJFX01PVU5UX0xPT1AKKwlib29sICJTdXBwb3J0IGxvb3BiYWNrIG1vdW50cyIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIE1PVU5UIHx8IFVNT1VOVAorCWhlbHAKKwkgIEVuYWJsaW5nIHRoaXMgZmVhdHVyZSBhbGxvd3MgYXV0b21hdGljIG1vdW50aW5nIG9mIGZpbGVzIChjb250YWluaW5nCisJICBmaWxlc3lzdGVtIGltYWdlcykgdmlhIHRoZSBsaW51eCBrZXJuZWwncyBsb29wYmFjayBkZXZpY2VzLgorCSAgVGhlIG1vdW50IGNvbW1hbmQgd2lsbCBkZXRlY3QgeW91IGFyZSB0cnlpbmcgdG8gbW91bnQgYSBmaWxlIGluc3RlYWQKKwkgIG9mIGEgYmxvY2sgZGV2aWNlLCBhbmQgdHJhbnNwYXJlbnRseSBhc3NvY2lhdGUgdGhlIGZpbGUgd2l0aCBhCisJICBsb29wYmFjayBkZXZpY2UuIFRoZSB1bW91bnQgY29tbWFuZCB3aWxsIGFsc28gZnJlZSB0aGF0IGxvb3BiYWNrCisJICBkZXZpY2UuCisKKwkgIFlvdSBjYW4gc3RpbGwgdXNlIHRoZSAnbG9zZXR1cCcgdXRpbGl0eSAodG8gbWFudWFsbHkgYXNzb2NpYXRlIGZpbGVzCisJICB3aXRoIGxvb3AgZGV2aWNlcykgaWYgeW91IG5lZWQgdG8gZG8gc29tZXRoaW5nIGFkdmFuY2VkLCBzdWNoIGFzCisJICBzcGVjaWZ5IGFuIG9mZnNldCBvciBjcnlwdG9ncmFwaGljIG9wdGlvbnMgdG8gdGhlIGxvb3BiYWNrIGRldmljZS4KKwkgIChJZiB5b3UgZG9uJ3Qgd2FudCB1bW91bnQgdG8gZnJlZSB0aGUgbG9vcCBkZXZpY2UsIHVzZSAidW1vdW50IC1EIi4pCisKK2NvbmZpZyBGRUFUVVJFX01PVU5UX0xPT1BfQ1JFQVRFCisJYm9vbCAiQ3JlYXRlIG5ldyBsb29wYmFjayBkZXZpY2VzIGlmIG5lZWRlZCIKKwlkZWZhdWx0IHkKKwlkZXBlbmRzIG9uIEZFQVRVUkVfTU9VTlRfTE9PUAorCWhlbHAKKwkgIExpbnV4IGtlcm5lbHMgPj0gMi42LjI0IHN1cHBvcnQgdW5saW1pdGVkIGxvb3BiYWNrIGRldmljZXMuIFRoZXkgYXJlCisJICBhbGxvY2F0ZWQgZm9yIHVzZSB3aGVuIHRyeWluZyB0byB1c2UgYSBsb29wIGRldmljZS4gVGhlIGxvb3AgZGV2aWNlCisJICBtdXN0IGhvd2V2ZXIgZXhpc3QuCisKKwkgIFRoaXMgZmVhdHVyZSBsZXRzIG1vdW50IHRvIHRyeSB0byBjcmVhdGUgbmV4dCAvZGV2L2xvb3BOIGRldmljZQorCSAgaWYgaXQgZG9lcyBub3QgZmluZCBhIGZyZWUgb25lLgorCitjb25maWcgRkVBVFVSRV9NVEFCX1NVUFBPUlQKKwlib29sICJTdXBwb3J0IGZvciB0aGUgb2xkIC9ldGMvbXRhYiBmaWxlIgorCWRlZmF1bHQgbgorCWRlcGVuZHMgb24gTU9VTlQgfHwgVU1PVU5UCisJc2VsZWN0IEZFQVRVUkVfTU9VTlRfRkFLRQorCWhlbHAKKwkgIEhpc3RvcmljYWxseSwgVW5peCBzeXN0ZW1zIGtlcHQgdHJhY2sgb2YgdGhlIGN1cnJlbnRseSBtb3VudGVkCisJICBwYXJ0aXRpb25zIGluIHRoZSBmaWxlICIvZXRjL210YWIiLiBUaGVzZSBkYXlzLCB0aGUga2VybmVsIGV4cG9ydHMKKwkgIHRoZSBsaXN0IG9mIGN1cnJlbnRseSBtb3VudGVkIHBhcnRpdGlvbnMgaW4gIi9wcm9jL21vdW50cyIsIHJlbmRlcmluZworCSAgdGhlIG9sZCBtdGFiIGZpbGUgb2Jzb2xldGUuIChJbiBtb2Rlcm4gc3lzdGVtcywgL2V0Yy9tdGFiIHNob3VsZCBiZQorCSAgYSBzeW1saW5rIHRvIC9wcm9jL21vdW50cy4pCisKKwkgIFRoZSBvbmx5IHJlYXNvbiB0byBoYXZlIG1vdW50IG1haW50YWluIGFuIC9ldGMvbXRhYiBmaWxlIGl0c2VsZiBpcyBpZgorCSAgeW91ciBzdHJpcHBlZC1kb3duIGVtYmVkZGVkIHN5c3RlbSBkb2VzIG5vdCBoYXZlIGEgL3Byb2MgZGlyZWN0b3J5LgorCSAgSWYgeW91IG11c3QgdXNlIHRoaXMsIGtlZXAgaW4gbWluZCBpdCdzIGluaGVyZW50bHkgYnJpdHRsZSAoZm9yCisJICBleGFtcGxlIGEgbW91bnQgdW5kZXIgY2hyb290IHdvbid0IHVwZGF0ZSBpdCksIGNhbid0IGhhbmRsZSBtb2Rlcm4KKwkgIGZlYXR1cmVzIGxpa2Ugc2VwYXJhdGUgcGVyLXByb2Nlc3MgZmlsZXN5c3RlbSBuYW1lc3BhY2VzLCByZXF1aXJlcworCSAgdGhhdCB5b3VyIC9ldGMgZGlyZWN0b3J5IGJlIHdyaXRhYmxlLCB0ZW5kcyB0byBnZXQgZWFzaWx5IGNvbmZ1c2VkCisJICBieSAtLWJpbmQgb3IgLS1tb3ZlIG1vdW50cywgd29uJ3QgdXBkYXRlIGlmIHlvdSByZW5hbWUgYSBkaXJlY3RvcnkKKwkgIHRoYXQgY29udGFpbnMgYSBtb3VudCBwb2ludCwgYW5kIHNvIG9uLiAoSW4gYnJpZWY6IGF2b2lkLikKKworCSAgQWJvdXQgdGhlIG9ubHkgcmVhc29uIHRvIHVzZSB0aGlzIGlzIGlmIHlvdSd2ZSByZW1vdmVkIC9wcm9jIGZyb20KKwkgIHlvdXIga2VybmVsLgorCitzb3VyY2UgdXRpbC1saW51eC92b2x1bWVfaWQvQ29uZmlnLmluCisKK2VuZG1lbnUKZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvS2J1aWxkLnNyYyBiL3V0aWwtbGludXgvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjhmYzZiCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9LYnVpbGQuc3JjCkBAIC0wLDAgKzEsNDYgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitsaWIteTo9CisKK0lOU0VSVAorbGliLSQoQ09ORklHX0FDUElEKSAgICAgICAgICAgICArPSBhY3BpZC5vCitsaWItJChDT05GSUdfQkxLSUQpICAgICAgICAgICAgICs9IGJsa2lkLm8KK2xpYi0kKENPTkZJR19ETUVTRykgICAgICAgICAgICAgKz0gZG1lc2cubworbGliLSQoQ09ORklHX0ZCU0VUKSAgICAgICAgICAgICArPSBmYnNldC5vCitsaWItJChDT05GSUdfRkRGTFVTSCkgICAgICAgICAgICs9IGZyZWVyYW1kaXNrLm8KK2xpYi0kKENPTkZJR19GREZPUk1BVCkgICAgICAgICAgKz0gZmRmb3JtYXQubworbGliLSQoQ09ORklHX0ZESVNLKSAgICAgICAgICAgICArPSBmZGlzay5vCitsaWItJChDT05GSUdfRklOREZTKSAgICAgICAgICAgICs9IGZpbmRmcy5vCitsaWItJChDT05GSUdfRkxPQ0spICAgICAgICAgICAgICs9IGZsb2NrLm8KK2xpYi0kKENPTkZJR19GUkVFUkFNRElTSykgICAgICAgKz0gZnJlZXJhbWRpc2subworbGliLSQoQ09ORklHX0ZTQ0tfTUlOSVgpICAgICAgICArPSBmc2NrX21pbml4Lm8KK2xpYi0kKENPTkZJR19HRVRPUFQpICAgICAgICAgICAgKz0gZ2V0b3B0Lm8KK2xpYi0kKENPTkZJR19IRVhEVU1QKSAgICAgICAgICAgKz0gaGV4ZHVtcC5vCitsaWItJChDT05GSUdfSFdDTE9DSykgICAgICAgICAgICs9IGh3Y2xvY2subworbGliLSQoQ09ORklHX0lQQ1JNKSAgICAgICAgICAgICArPSBpcGNybS5vCitsaWItJChDT05GSUdfSVBDUykgICAgICAgICAgICAgICs9IGlwY3MubworbGliLSQoQ09ORklHX0xPU0VUVVApICAgICAgICAgICArPSBsb3NldHVwLm8KK2xpYi0kKENPTkZJR19MU1BDSSkgICAgICAgICAgICAgKz0gbHNwY2kubworbGliLSQoQ09ORklHX0xTVVNCKSAgICAgICAgICAgICArPSBsc3VzYi5vCitsaWItJChDT05GSUdfTUtGU19FWFQyKSAgICAgICAgICs9IG1rZnNfZXh0Mi5vCitsaWItJChDT05GSUdfTUtGU19NSU5JWCkgICAgICAgICs9IG1rZnNfbWluaXgubworbGliLSQoQ09ORklHX01LRlNfUkVJU0VSKSAgICAgICArPSBta2ZzX3JlaXNlci5vCitsaWItJChDT05GSUdfTUtGU19WRkFUKSAgICAgICAgICs9IG1rZnNfdmZhdC5vCitsaWItJChDT05GSUdfTUtTV0FQKSAgICAgICAgICAgICs9IG1rc3dhcC5vCitsaWItJChDT05GSUdfTU9SRSkgICAgICAgICAgICAgICs9IG1vcmUubworbGliLSQoQ09ORklHX01PVU5UKSAgICAgICAgICAgICArPSBtb3VudC5vCitsaWItJChDT05GSUdfUElWT1RfUk9PVCkgICAgICAgICs9IHBpdm90X3Jvb3QubworbGliLSQoQ09ORklHX1JEQVRFKSAgICAgICAgICAgICArPSByZGF0ZS5vCitsaWItJChDT05GSUdfUkRFVikgICAgICAgICAgICAgICs9IHJkZXYubworbGliLSQoQ09ORklHX1JFQURQUk9GSUxFKSAgICAgICArPSByZWFkcHJvZmlsZS5vCitsaWItJChDT05GSUdfUlRDV0FLRSkgICAgICAgICAgICs9IHJ0Y3dha2UubworbGliLSQoQ09ORklHX1NDUklQVCkgICAgICAgICAgICArPSBzY3JpcHQubworbGliLSQoQ09ORklHX1NDUklQVFJFUExBWSkgICAgICArPSBzY3JpcHRyZXBsYXkubworbGliLSQoQ09ORklHX1NFVEFSQ0gpICAgICAgICAgICArPSBzZXRhcmNoLm8KK2xpYi0kKENPTkZJR19TV0FQT05PRkYpICAgICAgICAgKz0gc3dhcG9ub2ZmLm8KK2xpYi0kKENPTkZJR19TV0lUQ0hfUk9PVCkgICAgICAgKz0gc3dpdGNoX3Jvb3QubworbGliLSQoQ09ORklHX1VNT1VOVCkgICAgICAgICAgICArPSB1bW91bnQubwpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9hY3BpZC5jIGIvdXRpbC1saW51eC9hY3BpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMmNiNmIKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L2FjcGlkLmMKQEAgLTAsMCArMSwzNTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHNpbXBsZSBBQ1BJIGV2ZW50cyBsaXN0ZW5lcgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBieSBWbGFkaW1pciBEcm9ubmlrb3YgPGRyb25uaWtvdkBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgYWNwaWRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstZGZdIFstYyBDT05GRElSXSBbLWwgTE9HRklMRV0gWy1hIEFDVElPTkZJTEVdIFstTSBNQVBGSUxFXSBbLWUgUFJPQ19FVkVOVF9GSUxFXSBbLXAgUElERklMRV0iCisvL3VzYWdlOiNkZWZpbmUgYWNwaWRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJMaXN0ZW4gdG8gQUNQSSBldmVudHMgYW5kIHNwYXduIHNwZWNpZmljIGhlbHBlcnMgb24gZXZlbnQgYXJyaXZhbFxuIgorLy91c2FnZTogICAgICJcbgktZAlMb2cgdG8gc3RkZXJyLCBub3QgbG9nIGZpbGUgKGltcGxpZXMgLWYpIgorLy91c2FnZTogICAgICJcbgktZglSdW4gaW4gZm9yZWdyb3VuZCIKKy8vdXNhZ2U6ICAgICAiXG4JLWMgRElSCUNvbmZpZyBkaXJlY3RvcnkgWy9ldGMvYWNwaV0iCisvL3VzYWdlOiAgICAgIlxuCS1lIEZJTEUJL3Byb2MgZXZlbnQgZmlsZSBbL3Byb2MvYWNwaS9ldmVudF0iCisvL3VzYWdlOiAgICAgIlxuCS1sIEZJTEUJTG9nIGZpbGUgWy92YXIvbG9nL2FjcGlkLmxvZ10iCisvL3VzYWdlOiAgICAgIlxuCS1wIEZJTEUJUGlkIGZpbGUgWy92YXIvcnVuL2FjcGlkLnBpZF0iCisvL3VzYWdlOiAgICAgIlxuCS1hIEZJTEUJQWN0aW9uIGZpbGUgWy9ldGMvYWNwaWQuY29uZl0iCisvL3VzYWdlOiAgICAgIlxuCS1NIEZJTEUgTWFwIGZpbGUgWy9ldGMvYWNwaS5tYXBdIgorLy91c2FnZToJSUZfRkVBVFVSRV9BQ1BJRF9DT01QQVQoCisvL3VzYWdlOiAgICAgIlxuXG5BY2NlcHQgYW5kIGlnbm9yZSBjb21wYXRpYmlsaXR5IG9wdGlvbnMgLWcgLW0gLXMgLVMgLXYiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGFjcGlkX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJXaXRob3V0IC1lIG9wdGlvbiwgYWNwaWQgdXNlcyBhbGwgL2Rldi9pbnB1dC9ldmVudCogZmlsZXNcbiIKKy8vdXNhZ2U6ICAgICAgICIjIGFjcGlkXG4iCisvL3VzYWdlOiAgICAgICAiIyBhY3BpZCAtbCAvdmFyL2xvZy9teS1hY3BpLWxvZ1xuIgorLy91c2FnZTogICAgICAgIiMgYWNwaWQgLWUgL3Byb2MvYWNwaS9ldmVudFxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnB1dC5oPgorCisjaWZuZGVmIEVWX1NXCisjIGRlZmluZSBFVl9TVyAgICAgICAgIDB4MDUKKyNlbmRpZgorI2lmbmRlZiBFVl9LRVkKKyMgZGVmaW5lIEVWX0tFWSAgICAgICAgMHgwMQorI2VuZGlmCisjaWZuZGVmIFNXX0xJRAorIyBkZWZpbmUgU1dfTElEICAgICAgICAweDAwCisjZW5kaWYKKyNpZm5kZWYgU1dfUkZLSUxMX0FMTAorIyBkZWZpbmUgU1dfUkZLSUxMX0FMTCAweDAzCisjZW5kaWYKKyNpZm5kZWYgS0VZX1BPV0VSCisjIGRlZmluZSBLRVlfUE9XRVIgICAgICAxMTYgICAgIC8qIFNDIFN5c3RlbSBQb3dlciBEb3duICovCisjZW5kaWYKKyNpZm5kZWYgS0VZX1NMRUVQCisjIGRlZmluZSBLRVlfU0xFRVAgICAgICAxNDIgICAgIC8qIFNDIFN5c3RlbSBTbGVlcCAqLworI2VuZGlmCisKK2VudW0geworCU9QVF9jID0gKDEgPDwgMCksCisJT1BUX2QgPSAoMSA8PCAxKSwKKwlPUFRfZSA9ICgxIDw8IDIpLAorCU9QVF9mID0gKDEgPDwgMyksCisJT1BUX2wgPSAoMSA8PCA0KSwKKwlPUFRfYSA9ICgxIDw8IDUpLAorCU9QVF9NID0gKDEgPDwgNiksCisJT1BUX3AgPSAoMSA8PCA3KSAqIEVOQUJMRV9GRUFUVVJFX1BJREZJTEUsCit9OworCitzdHJ1Y3QgYWNwaV9ldmVudCB7CisJY29uc3QgY2hhciAqc190eXBlOworCXVpbnQxNl90IG5fdHlwZTsKKwljb25zdCBjaGFyICpzX2NvZGU7CisJdWludDE2X3Qgbl9jb2RlOworCXVpbnQzMl90IHZhbHVlOworCWNvbnN0IGNoYXIgKmRlc2M7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGFjcGlfZXZlbnQgZl9ldnRfdGFiW10gPSB7CisJeyAiRVZfS0VZIiwgMHgwMSwgIktFWV9QT1dFUiIsIDExNiwgMSwgImJ1dHRvbi9wb3dlciBQV1JGIDAwMDAwMDgwIiB9LAorCXsgIkVWX0tFWSIsIDB4MDEsICJLRVlfUE9XRVIiLCAxMTYsIDEsICJidXR0b24vcG93ZXIgUFdSQiAwMDAwMDA4MCIgfSwKKwl7ICJFVl9TVyIsIDB4MDUsICJTV19MSUQiLCAweDAwLCAxLCAiYnV0dG9uL2xpZCBMSUQwIDAwMDAwMDgwIiB9LAorfTsKKworc3RydWN0IGFjcGlfYWN0aW9uIHsKKwljb25zdCBjaGFyICprZXk7CisJY29uc3QgY2hhciAqYWN0aW9uOworfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBhY3BpX2FjdGlvbiBmX2FjdF90YWJbXSA9IHsKKwl7ICJQV1JGIiwgIlBXUkYvMDAwMDAwODAiIH0sCisJeyAiTElEMCIsICJMSUQvMDAwMDAwODAiIH0sCit9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisJc3RydWN0IGFjcGlfYWN0aW9uICphY3RfdGFiOworCWludCBuX2FjdDsKKwlzdHJ1Y3QgYWNwaV9ldmVudCAqZXZ0X3RhYjsKKwlpbnQgbl9ldnQ7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBhY3RfdGFiICAgICAgICAgKEcuYWN0X3RhYikKKyNkZWZpbmUgbl9hY3QgICAgICAgICAgIChHLm5fYWN0ICApCisjZGVmaW5lIGV2dF90YWIgICAgICAgICAoRy5ldnRfdGFiKQorI2RlZmluZSBuX2V2dCAgICAgICAgICAgKEcubl9ldnQgICkKKyNkZWZpbmUgSU5JVF9HKCkgZG8geyBcCisJU0VUX1BUUl9UT19HTE9CQUxTKHh6YWxsb2Moc2l6ZW9mKEcpKSk7IFwKK30gd2hpbGUgKDApCisKKy8qCisgKiBhY3BpZCBsaXN0ZW5zIHRvIEFDUEkgZXZlbnRzIGNvbWluZyBlaXRoZXIgaW4gdGV4dHVhbCBmb3JtCisgKiBmcm9tIC9wcm9jL2FjcGkvZXZlbnQgKHRob3VnaCBpdCBpcyBtYXJrZWQgZGVwcmVjYXRlZCwKKyAqIGl0IGlzIHN0aWxsIHdpZGVseSB1c2VkIGFuZCBfaXNfIGEgc3RhbmRhcmQpIG9yIGluIGJpbmFyeSBmb3JtCisgKiBmcm9tIHNwZWNpZmllZCBldmRldnMgKGp1c3QgdXNlIC9kZXYvaW5wdXQvZXZlbnQqKS4KKyAqIEl0IHBhcnNlcyB0aGUgZXZlbnQgdG8gcmV0cmlldmUgQUNUSU9OIGFuZCBhIHBvc3NpYmxlIFBBUkFNRVRFUi4KKyAqIEl0IHRoZW4gc3Bhd25zIC9ldGMvYWNwaS88QUNUSU9OPlsvPFBBUkFNRVRFUj5dIGVpdGhlciB2aWEgcnVuLXBhcnRzCisgKiAoaWYgdGhlIHJlc3VsdGluZyBwYXRoIGlzIGEgZGlyZWN0b3J5KSBvciBkaXJlY3RseS4KKyAqIElmIHRoZSByZXN1bHRpbmcgcGF0aCBkb2VzIG5vdCBleGlzdCBpdCBsb2dzIGl0IHZpYSBwZXJyb3IKKyAqIGFuZCBjb250aW51ZXMgbGlzdGVuaW5nLgorICovCisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfZXZlbnQoY29uc3QgY2hhciAqZXZlbnQpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJY2hhciAqaGFuZGxlciA9IHhhc3ByaW50ZigiLi8lcyIsIGV2ZW50KTsKKwljb25zdCBjaGFyICphcmdzW10gPSB7ICJydW4tcGFydHMiLCBoYW5kbGVyLCBOVUxMIH07CisKKwkvLyBsb2cgdGhlIGV2ZW50CisJYmJfZXJyb3JfbXNnKCIlcyIsIGV2ZW50KTsKKworCS8vIHNwYXduIGhhbmRsZXIKKwkvLyBOLkIuIHJ1bi1wYXJ0cyB3b3VsZCByZXF1aXJlIHNjcmlwdHMgdG8gaGF2ZSAjIS9iaW4vc2gKKwkvLyBoYW5kbGVyIGlzIGRpcmVjdG9yeT8gLT4gdXNlIHJ1bi1wYXJ0cworCS8vIGhhbmRsZXIgaXMgZmlsZT8gLT4gcnVuIGl0IGRpcmVjdGx5CisJaWYgKDAgPT0gc3RhdChldmVudCwgJnN0KSkKKwkJc3Bhd24oKGNoYXIgKiopYXJncyArICgwPT0oc3Quc3RfbW9kZSAmIFNfSUZESVIpKSk7CisJZWxzZQorCQliYl9zaW1wbGVfcGVycm9yX21zZyhldmVudCk7CisKKwlmcmVlKGhhbmRsZXIpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZmluZF9hY3Rpb24oc3RydWN0IGlucHV0X2V2ZW50ICpldiwgY29uc3QgY2hhciAqYnVmKQoreworCWNvbnN0IGNoYXIgKmFjdGlvbiA9IE5VTEw7CisJaW50IGk7CisKKwkvLyBtYXAgZXZlbnQKKwlmb3IgKGkgPSAwOyBpIDwgbl9ldnQ7IGkrKykgeworCQlpZiAoZXYpIHsKKwkJCWlmIChldi0+dHlwZSA9PSBldnRfdGFiW2ldLm5fdHlwZSAmJiBldi0+Y29kZSA9PSBldnRfdGFiW2ldLm5fY29kZSAmJiBldi0+dmFsdWUgPT0gZXZ0X3RhYltpXS52YWx1ZSkgeworCQkJCWFjdGlvbiA9IGV2dF90YWJbaV0uZGVzYzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChidWYpIHsKKwkJCWlmIChpc19wcmVmaXhlZF93aXRoKGV2dF90YWJbaV0uZGVzYywgYnVmKSkgeworCQkJCWFjdGlvbiA9IGV2dF90YWJbaV0uZGVzYzsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCS8vIGdldCBhY3Rpb24KKwlpZiAoYWN0aW9uKSB7CisJCWZvciAoaSA9IDA7IGkgPCBuX2FjdDsgaSsrKSB7CisJCQlpZiAoc3Ryc3RyKGFjdGlvbiwgYWN0X3RhYltpXS5rZXkpKSB7CisJCQkJYWN0aW9uID0gYWN0X3RhYltpXS5hY3Rpb247CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gYWN0aW9uOworfQorCitzdGF0aWMgdm9pZCBwYXJzZV9jb25mX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJcGFyc2VyX3QgKnBhcnNlcjsKKwljaGFyICp0b2tlbnNbMl07CisKKwlwYXJzZXIgPSBjb25maWdfb3BlbjIoZmlsZW5hbWUsIGZvcGVuX2Zvcl9yZWFkKTsKKworCWlmIChwYXJzZXIpIHsKKwkJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW5zLCAyLCAyLCAiIyBcdCIsIFBBUlNFX05PUk1BTCkpIHsKKwkJCWFjdF90YWIgPSB4cmVhbGxvY192ZWN0b3IoYWN0X3RhYiwgMSwgbl9hY3QpOworCQkJYWN0X3RhYltuX2FjdF0ua2V5ID0geHN0cmR1cCh0b2tlbnNbMF0pOworCQkJYWN0X3RhYltuX2FjdF0uYWN0aW9uID0geHN0cmR1cCh0b2tlbnNbMV0pOworCQkJbl9hY3QrKzsKKwkJfQorCQljb25maWdfY2xvc2UocGFyc2VyKTsKKwl9IGVsc2UgeworCQlhY3RfdGFiID0gKHZvaWQqKWZfYWN0X3RhYjsKKwkJbl9hY3QgPSBBUlJBWV9TSVpFKGZfYWN0X3RhYik7CisJfQorfQorCitzdGF0aWMgdm9pZCBwYXJzZV9tYXBfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSkKK3sKKwlwYXJzZXJfdCAqcGFyc2VyOworCWNoYXIgKnRva2Vuc1s2XTsKKworCXBhcnNlciA9IGNvbmZpZ19vcGVuMihmaWxlbmFtZSwgZm9wZW5fZm9yX3JlYWQpOworCisJaWYgKHBhcnNlcikgeworCQl3aGlsZSAoY29uZmlnX3JlYWQocGFyc2VyLCB0b2tlbnMsIDYsIDYsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQkJZXZ0X3RhYiA9IHhyZWFsbG9jX3ZlY3RvcihldnRfdGFiLCAxLCBuX2V2dCk7CisJCQlldnRfdGFiW25fZXZ0XS5zX3R5cGUgPSB4c3RyZHVwKHRva2Vuc1swXSk7CisJCQlldnRfdGFiW25fZXZ0XS5uX3R5cGUgPSB4c3RydG91KHRva2Vuc1sxXSwgMTYpOworCQkJZXZ0X3RhYltuX2V2dF0uc19jb2RlID0geHN0cmR1cCh0b2tlbnNbMl0pOworCQkJZXZ0X3RhYltuX2V2dF0ubl9jb2RlID0geGF0b3UxNih0b2tlbnNbM10pOworCQkJZXZ0X3RhYltuX2V2dF0udmFsdWUgPSB4YXRvaV9wb3NpdGl2ZSh0b2tlbnNbNF0pOworCQkJZXZ0X3RhYltuX2V2dF0uZGVzYyA9IHhzdHJkdXAodG9rZW5zWzVdKTsKKwkJCW5fZXZ0Kys7CisJCX0KKwkJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisJfSBlbHNlIHsKKwkJZXZ0X3RhYiA9ICh2b2lkKilmX2V2dF90YWI7CisJCW5fZXZ0ID0gQVJSQVlfU0laRShmX2V2dF90YWIpOworCX0KK30KKworLyoKKyAqIGFjcGlkIFstYyBjb25mX2Rpcl0gWy1yIGNvbmZfZmlsZSBdIFstYSBtYXBfZmlsZSBdIFstbCBsb2dfZmlsZV0gWy1lIHByb2NfZXZlbnRfZmlsZV0KKyAqLworCitpbnQgYWNwaWRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGFjcGlkX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgbmZkOworCWludCBvcHRzOworCXN0cnVjdCBwb2xsZmQgKnBmZDsKKwljb25zdCBjaGFyICpvcHRfZGlyID0gIi9ldGMvYWNwaSI7CisJY29uc3QgY2hhciAqb3B0X2lucHV0ID0gIi9kZXYvaW5wdXQvZXZlbnQiOworCWNvbnN0IGNoYXIgKm9wdF9sb2dmaWxlID0gIi92YXIvbG9nL2FjcGlkLmxvZyI7CisJY29uc3QgY2hhciAqb3B0X2FjdGlvbiA9ICIvZXRjL2FjcGlkLmNvbmYiOworCWNvbnN0IGNoYXIgKm9wdF9tYXAgPSAiL2V0Yy9hY3BpLm1hcCI7CisjaWYgRU5BQkxFX0ZFQVRVUkVfUElERklMRQorCWNvbnN0IGNoYXIgKm9wdF9waWRmaWxlID0gQ09ORklHX1BJRF9GSUxFX1BBVEggIi9hY3BpZC5waWQiOworI2VuZGlmCisKKwlJTklUX0coKTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gImRmOmUtLWUiOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiYzpkZTpmbDphOk06IiBJRl9GRUFUVVJFX1BJREZJTEUoInA6IikgSUZfRkVBVFVSRV9BQ1BJRF9DT01QQVQoImc6bTpzOlM6diIpLAorCQkmb3B0X2RpciwgJm9wdF9pbnB1dCwgJm9wdF9sb2dmaWxlLCAmb3B0X2FjdGlvbiwgJm9wdF9tYXAKKwkJSUZfRkVBVFVSRV9QSURGSUxFKCwgJm9wdF9waWRmaWxlKQorCQlJRl9GRUFUVVJFX0FDUElEX0NPTVBBVCgsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwpCisJKTsKKworCWlmICghKG9wdHMgJiBPUFRfZikpIHsKKwkJLyogTm8gLWYgIkZvcmVncm91bmQiLCB3ZSBnbyB0byBiYWNrZ3JvdW5kICovCisJCWJiX2RhZW1vbml6ZV9vcl9yZXhlYyhEQUVNT05fQ0xPU0VfRVhUUkFfRkRTLCBhcmd2KTsKKwl9CisKKwlpZiAoIShvcHRzICYgT1BUX2QpKSB7CisJCS8qIE5vIC1kICJEZWJ1ZyIsIHdlIGxvZyB0byBsb2cgZmlsZS4KKwkJICogVGhpcyBpbmNsdWRlcyBhbnkgb3V0cHV0IGZyb20gY2hpbGRyZW4uCisJCSAqLworCQl4bW92ZV9mZCh4b3BlbihvcHRfbG9nZmlsZSwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19BUFBFTkQpLCBTVERPVVRfRklMRU5PKTsKKwkJeGR1cDIoU1RET1VUX0ZJTEVOTywgU1RERVJSX0ZJTEVOTyk7CisJCS8qIEFsc28sIGFjcGlkJ3MgbWVzc2FnZXMgKGJ1dCBub3QgY2hpbGRyZW4pIHdpbGwgZ28gdG8gc3lzbG9nIHRvbyAqLworCQlvcGVubG9nKGFwcGxldF9uYW1lLCBMT0dfUElELCBMT0dfREFFTU9OKTsKKwkJbG9nbW9kZSA9IExPR01PREVfU1lTTE9HIHwgTE9HTU9ERV9TVERJTzsKKwl9CisJLyogZWxzZTogLWQgIkRlYnVnIiwgbG9nIGlzIG5vdCByZWRpcmVjdGVkICovCisKKwlwYXJzZV9jb25mX2ZpbGUob3B0X2FjdGlvbik7CisJcGFyc2VfbWFwX2ZpbGUob3B0X21hcCk7CisKKwl4Y2hkaXIob3B0X2Rpcik7CisKKwkvKiBXZSBzcGF3biBjaGlsZHJlbiBidXQgZG9uJ3Qgd2FpdCBmb3IgdGhlbS4gUHJldmVudCB6b21iaWVzOiAqLworCWJiX3NpZ25hbHMoKDEgPDwgU0lHQ0hMRCksIFNJR19JR04pOworCS8vIElmIHlvdSBlbmFibGUgdGhpcywgKDEpIGV4cGxhaW4gd2h5LCAoMikKKwkvLyBtYWtlIHN1cmUgd2hpbGUocG9sbCkgbG9vcCBiZWxvdyBpcyBzdGlsbCBpbnRlcnJ1cHRpYmxlCisJLy8gYnkgU0lHVEVSTSBldCBhbDoKKwkvL2JiX3NpZ25hbHMoQkJfRkFUQUxfU0lHUywgcmVjb3JkX3NpZ25vKTsKKworCXBmZCA9IE5VTEw7CisJbmZkID0gMDsKKwl3aGlsZSAoMSkgeworCQlpbnQgZmQ7CisJCWNoYXIgKmRldl9ldmVudDsKKworCQlkZXZfZXZlbnQgPSB4YXNwcmludGYoKG9wdHMgJiBPUFRfZSkgPyAiJXMiIDogIiVzJXUiLCBvcHRfaW5wdXQsIG5mZCk7CisJCWZkID0gb3BlbihkZXZfZXZlbnQsIE9fUkRPTkxZIHwgT19OT05CTE9DSyk7CisJCWlmIChmZCA8IDApIHsKKwkJCWlmIChuZmQgPT0gMCkKKwkJCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKGRldl9ldmVudCk7CisJCQlicmVhazsKKwkJfQorCQlmcmVlKGRldl9ldmVudCk7CisJCXBmZCA9IHhyZWFsbG9jX3ZlY3RvcihwZmQsIDEsIG5mZCk7CisJCXBmZFtuZmRdLmZkID0gZmQ7CisJCXBmZFtuZmRdLmV2ZW50cyA9IFBPTExJTjsKKwkJbmZkKys7CisJfQorCisJd3JpdGVfcGlkZmlsZShvcHRfcGlkZmlsZSk7CisKKwl3aGlsZSAoc2FmZV9wb2xsKHBmZCwgbmZkLCAtMSkgPiAwKSB7CisJCWludCBpOworCQlmb3IgKGkgPSAwOyBpIDwgbmZkOyBpKyspIHsKKwkJCWNvbnN0IGNoYXIgKmV2ZW50OworCisJCQlpZiAoIShwZmRbaV0ucmV2ZW50cyAmIFBPTExJTikpIHsKKwkJCQlpZiAocGZkW2ldLnJldmVudHMgPT0gMCkKKwkJCQkJY29udGludWU7IC8qIHRoaXMgZmQgaGFzIG5vdGhpbmcgKi8KKworCQkJCS8qIExpa2VseSBQT0xMRVJSLCBQT0xMSFVQLCBQT0xMTlZBTC4KKwkJCQkgKiBEbyBub3QgbGlzdGVuIG9uIHRoaXMgZmQgYW55bW9yZS4KKwkJCQkgKi8KKwkJCQljbG9zZShwZmRbaV0uZmQpOworCQkJCW5mZC0tOworCQkJCWZvciAoOyBpIDwgbmZkOyBpKyspCisJCQkJCXBmZFtpXS5mZCA9IHBmZFtpICsgMV0uZmQ7CisJCQkJYnJlYWs7IC8qIGRvIHBvbGwoKSBhZ2FpbiAqLworCQkJfQorCisJCQlldmVudCA9IE5VTEw7CisJCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9lKSB7CisJCQkJY2hhciAqYnVmOworCQkJCWludCBsZW47CisKKwkJCQlidWYgPSB4bWFsbG9jX3JlYWRzKHBmZFtpXS5mZCwgTlVMTCk7CisJCQkJLyogYnVmID0gImJ1dHRvbi9wb3dlciBQV1JCIDAwMDAwMDgwIDAwMDAwMDAwIiAqLworCQkJCWxlbiA9IHN0cmxlbihidWYpIC0gOTsKKwkJCQlpZiAobGVuID49IDApCisJCQkJCWJ1ZltsZW5dID0gJ1wwJzsKKwkJCQlldmVudCA9IGZpbmRfYWN0aW9uKE5VTEwsIGJ1Zik7CisJCQkJZnJlZShidWYpOworCQkJfSBlbHNlIHsKKwkJCQlzdHJ1Y3QgaW5wdXRfZXZlbnQgZXY7CisKKwkJCQlpZiAoc2l6ZW9mKGV2KSAhPSBmdWxsX3JlYWQocGZkW2ldLmZkLCAmZXYsIHNpemVvZihldikpKQorCQkJCQljb250aW51ZTsKKworCQkJCWlmIChldi52YWx1ZSAhPSAxICYmIGV2LnZhbHVlICE9IDApCisJCQkJCWNvbnRpbnVlOworCisJCQkJZXZlbnQgPSBmaW5kX2FjdGlvbigmZXYsIE5VTEwpOworCQkJfQorCQkJaWYgKCFldmVudCkKKwkJCQljb250aW51ZTsKKwkJCS8qIHNwYXduIGV2ZW50IGhhbmRsZXIgKi8KKwkJCXByb2Nlc3NfZXZlbnQoZXZlbnQpOworCQl9CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCXdoaWxlIChuZmQtLSkKKwkJCWNsb3NlKHBmZFtuZmRdLmZkKTsKKwkJZnJlZShwZmQpOworCX0KKwlyZW1vdmVfcGlkZmlsZShvcHRfcGlkZmlsZSk7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9ibGtpZC5jIGIvdXRpbC1saW51eC9ibGtpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYmM4MDMKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L2Jsa2lkLmMKQEAgLTAsMCArMSwzMSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogUHJpbnQgVVVJRHMgb24gYWxsIGZpbGVzeXN0ZW1zCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA4IERlbnlzIFZsYXNlbmtvLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGJsa2lkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbQkxPQ0tERVZdLi4uIgorLy91c2FnZTojZGVmaW5lIGJsa2lkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJpbnQgVVVJRHMgb2YgYWxsIGZpbGVzeXN0ZW1zIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ2b2x1bWVfaWQuaCIKKworaW50IGJsa2lkX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBibGtpZF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJaW50IHNjYW5fZGV2aWNlcyA9IDE7CisKKwl3aGlsZSAoKisrYXJndikgeworCQkvKiBOb3RlOiBib2d1cyBkZXZpY2UgbmFtZXMgZG9uJ3QgY2F1c2UgYW55IGVycm9yIG1lc3NhZ2VzICovCisJCWFkZF90b191dWlkX2NhY2hlKCphcmd2KTsKKwkJc2Nhbl9kZXZpY2VzID0gMDsKKwl9CisKKwlkaXNwbGF5X3V1aWRfY2FjaGUoc2Nhbl9kZXZpY2VzKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvYmxvY2tkZXYuYyBiL3V0aWwtbGludXgvYmxvY2tkZXYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjVlNTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9ibG9ja2Rldi5jCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogYmxvY2tkZXYgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgU2VyZ2V5IE5hdW1vdiA8c2tuYXVtb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9hcHBsZXQ6SUZfQkxPQ0tERVYoQVBQTEVUKGJsb2NrZGV2LCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0JMT0NLREVWKSArPSBibG9ja2Rldi5vCisKKy8vY29uZmlnOmNvbmZpZyBCTE9DS0RFVgorLy9jb25maWc6CWJvb2wgImJsb2NrZGV2IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFBlcmZvcm1zIHNvbWUgaW9jdGxzIHdpdGggYmxvY2sgZGV2aWNlcy4KKworLy91c2FnZTojZGVmaW5lIGJsb2NrZGV2X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6CSJPUFRJT04gQkxPQ0tERVYiCisvL3VzYWdlOiNkZWZpbmUgYmxvY2tkZXZfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLS1zZXRybwkJU2V0IHJvIgorLy91c2FnZTogICAgICJcbgktLXNldHJ3CQlTZXQgcnciCisvL3VzYWdlOiAgICAgIlxuCS0tZ2V0cm8JCUdldCBybyIKKy8vdXNhZ2U6ICAgICAiXG4JLS1nZXRzcwkJR2V0IHNlY3RvciBzaXplIgorLy91c2FnZTogICAgICJcbgktLWdldGJzeglHZXQgYmxvY2sgc2l6ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLS1zZXRic3ogQllURVMJU2V0IGJsb2NrIHNpemUiCisvL3VzYWdlOiAgICAgIlxuCS0tZ2V0c3oJCUdldCBkZXZpY2Ugc2l6ZSBpbiA1MTItYnl0ZSBzZWN0b3JzIgorLyovL3VzYWdlOiAgICAgIlxuCS0tZ2V0c2l6ZQlHZXQgZGV2aWNlIHNpemUgaW4gc2VjdG9ycyAoZGVwcmVjYXRlZCkiKi8KKy8vdXNhZ2U6ICAgICAiXG4JLS1nZXRzaXplNjQJR2V0IGRldmljZSBzaXplIGluIGJ5dGVzIgorLy91c2FnZTogICAgICJcbgktLWZsdXNoYnVmcwlGbHVzaCBidWZmZXJzIgorLy91c2FnZTogICAgICJcbgktLXJlcmVhZHB0CVJlcmVhZCBwYXJ0aXRpb24gdGFibGUiCisKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKworZW51bSB7CisJQVJHX05PTkUgICA9IDAsCisJQVJHX0lOVCAgICA9IDEsCisJQVJHX1VMT05HICA9IDIsCisJLyogWWVzLCBCTEtHRVRTSVpFNjQgdGFrZXMgcG9pbnRlciB0byB1aW50NjRfdCwgbm90IHVsbG9uZyEgKi8KKwlBUkdfVTY0ICAgID0gMywKKwlBUkdfTUFTSyAgID0gMywKKworCUZMX1VTUkFSRyAgID0gNCwgLyogYXJndW1lbnQgaXMgcHJvdmlkZWQgYnkgdXNlciAqLworCUZMX05PUkVTVUxUID0gOCwKKwlGTF9TQ0FMRTUxMiA9IDE2LAorfTsKKworc3RydWN0IGJkYyB7CisJdWludDMyX3QgICBpb2M7ICAgICAgICAgICAgICAgICAgICAgICAvKiBpb2N0bCBjb2RlICovCisJY29uc3QgY2hhciBuYW1lW3NpemVvZigiZmx1c2hidWZzIildOyAvKiAiLS1zZXRmb28iIHdvdGhvdXQgIi0tIiAqLworCXVpbnQ4X3QgICAgZmxhZ3M7CisJaW50OF90ICAgICBhcmd2YWw7ICAgICAgICAgICAgICAgICAgICAvKiBkZWZhdWx0IGFyZ3VtZW50IHZhbHVlICovCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGJkYyBiZGNvbW1hbmRzW10gPSB7CisJeworCQkuaW9jID0gQkxLUk9TRVQsCisJCS5uYW1lID0gInNldHJvIiwKKwkJLmZsYWdzID0gQVJHX0lOVCArIEZMX05PUkVTVUxULAorCQkuYXJndmFsID0gMSwKKwl9LHsKKwkJLmlvYyA9IEJMS1JPU0VULAorCQkubmFtZSA9ICJzZXRydyIsCisJCS5mbGFncyA9IEFSR19JTlQgKyBGTF9OT1JFU1VMVCwKKwkJLmFyZ3ZhbCA9IDAsCisJfSx7CisJCS5pb2MgPSBCTEtST0dFVCwKKwkJLm5hbWUgPSAiZ2V0cm8iLAorCQkuZmxhZ3MgPSBBUkdfSU5ULAorCQkuYXJndmFsID0gLTEsCisJfSx7CisJCS5pb2MgPSBCTEtTU1pHRVQsCisJCS5uYW1lID0gImdldHNzIiwKKwkJLmZsYWdzID0gQVJHX0lOVCwKKwkJLmFyZ3ZhbCA9IC0xLAorCX0seworCQkuaW9jID0gQkxLQlNaR0VULAorCQkubmFtZSA9ICJnZXRic3oiLAorCQkuZmxhZ3MgPSBBUkdfSU5ULAorCQkuYXJndmFsID0gLTEsCisJfSx7CisJCS5pb2MgPSBCTEtCU1pTRVQsCisJCS5uYW1lID0gInNldGJzeiIsCisJCS5mbGFncyA9IEFSR19JTlQgKyBGTF9OT1JFU1VMVCArIEZMX1VTUkFSRywKKwkJLmFyZ3ZhbCA9IDAsCisJfSx7CisJCS5pb2MgPSBCTEtHRVRTSVpFNjQsCisJCS5uYW1lID0gImdldHN6IiwKKwkJLmZsYWdzID0gQVJHX1U2NCArIEZMX1NDQUxFNTEyLAorCQkuYXJndmFsID0gLTEsCisJfSx7CisJCS5pb2MgPSBCTEtHRVRTSVpFLAorCQkubmFtZSA9ICJnZXRzaXplIiwKKwkJLmZsYWdzID0gQVJHX1VMT05HLAorCQkuYXJndmFsID0gLTEsCisJfSx7CisJCS5pb2MgPSBCTEtHRVRTSVpFNjQsCisJCS5uYW1lID0gImdldHNpemU2NCIsCisJCS5mbGFncyA9IEFSR19VNjQsCisJCS5hcmd2YWwgPSAtMSwKKwl9LHsKKwkJLmlvYyA9IEJMS0ZMU0JVRiwKKwkJLm5hbWUgPSAiZmx1c2hidWZzIiwKKwkJLmZsYWdzID0gQVJHX05PTkUgKyBGTF9OT1JFU1VMVCwKKwkJLmFyZ3ZhbCA9IDAsCisJfSx7CisJCS5pb2MgPSBCTEtSUlBBUlQsCisJCS5uYW1lID0gInJlcmVhZHB0IiwKKwkJLmZsYWdzID0gQVJHX05PTkUgKyBGTF9OT1JFU1VMVCwKKwkJLmFyZ3ZhbCA9IDAsCisJfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBiZGMgKmZpbmRfY21kKGNvbnN0IGNoYXIgKnMpCit7CisJY29uc3Qgc3RydWN0IGJkYyAqYmRjbWQgPSBiZGNvbW1hbmRzOworCWlmIChzWzBdID09ICctJyAmJiBzWzFdID09ICctJykgeworCQlzICs9IDI7CisJCWRvIHsKKwkJCWlmIChzdHJjbXAocywgYmRjbWQtPm5hbWUpID09IDApCisJCQkJcmV0dXJuIGJkY21kOworCQkJYmRjbWQrKzsKKwkJfSB3aGlsZSAoYmRjbWQgIT0gYmRjb21tYW5kcyArIEFSUkFZX1NJWkUoYmRjb21tYW5kcykpOworCX0KKwliYl9zaG93X3VzYWdlKCk7Cit9CisKK2ludCBibG9ja2Rldl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgYmxvY2tkZXZfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWNvbnN0IHN0cnVjdCBiZGMgKmJkY21kOworCWludCBmZDsKKwl1aW50NjRfdCB1NjQ7CisJdW5pb24geworCQlpbnQgaTsKKwkJdW5zaWduZWQgbG9uZyBsdTsKKwkJdWludDY0X3QgdTY0OworCX0gaW9jdGxfdmFsX29uX3N0YWNrOworCisJYXJndisrOworCWlmICghYXJndlswXSB8fCAhYXJndlsxXSkgLyogbXVzdCBoYXZlIGF0IGxlYXN0IDIgYXJncyAqLworCQliYl9zaG93X3VzYWdlKCk7CisKKwliZGNtZCA9IGZpbmRfY21kKCphcmd2KTsKKworCXU2NCA9IChpbnQpYmRjbWQtPmFyZ3ZhbDsKKwlpZiAoYmRjbWQtPmZsYWdzICYgRkxfVVNSQVJHKQorCQl1NjQgPSB4YXRvaV9wb3NpdGl2ZSgqKythcmd2KTsKKworCWFyZ3YrKzsKKwlpZiAoIWFyZ3ZbMF0gfHwgYXJndlsxXSkKKwkJYmJfc2hvd191c2FnZSgpOworCWZkID0geG9wZW4oYXJndlswXSwgT19SRE9OTFkpOworCisJaW9jdGxfdmFsX29uX3N0YWNrLnU2NCA9IHU2NDsKKyNpZiBCQl9CSUdfRU5ESUFOCisJLyogU3RvcmUgZGF0YSBwcm9wZXJseSB3cnQgZGF0YSBzaXplLgorCSAqICgxKSBJdCdzIG5vLW9wIGZvciBsaXR0bGUtZW5kaWFuLgorCSAqICgyKSBpdCdzIG5vLW9wIGZvciAwIGFuZCAtMS4gT25seSAtLXNldHJvIHVzZXMgYXJnICE9IDAgYW5kICE9IC0xLAorCSAqIGFuZCBpdCBpcyBBUkdfSU5ULiAtLXNldGJzeiBVU0VSX1ZBTCBpcyBhbHNvIEFSR19JTlQuCisJICogVGh1cywgd2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgQVJHX1VMT05HLgorCSAqLworCXN3aXRjaCAoYmRjbWQtPmZsYWdzICYgQVJHX01BU0spIHsKKwljYXNlIEFSR19JTlQ6CisJCWlvY3RsX3ZhbF9vbl9zdGFjay5pID0gKGludCl1NjQ7CisJCWJyZWFrOworIyBpZiAwIC8qIHVudXNlZCAqLworCWNhc2UgQVJHX1VMT05HOgorCQlpb2N0bF92YWxfb25fc3RhY2subHUgPSAodW5zaWduZWQgbG9uZyl1NjQ7CisJCWJyZWFrOworIyBlbmRpZgorCX0KKyNlbmRpZgorCisJaWYgKGlvY3RsKGZkLCBiZGNtZC0+aW9jLCAmaW9jdGxfdmFsX29uX3N0YWNrLnU2NCkgPT0gLTEpCisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUoKmFyZ3YpOworCisJLyogRmV0Y2ggaXQgaW50byByZWdpc3RlcihzKSAqLworCXU2NCA9IGlvY3RsX3ZhbF9vbl9zdGFjay51NjQ7CisKKwlpZiAoYmRjbWQtPmZsYWdzICYgRkxfU0NBTEU1MTIpCisJCXU2NCA+Pj0gOTsKKworCS8qIFplcm8tIG9yIG9uZS1leHRlbmQgdGhlIHZhbHVlIGlmIG5lZWRlZCwgdGhlbiBwcmludCAqLworCXN3aXRjaCAoYmRjbWQtPmZsYWdzICYgKEFSR19NQVNLK0ZMX05PUkVTVUxUKSkgeworCWNhc2UgQVJHX0lOVDoKKwkJLyogU21hbGxlciBjb2RlIHdoZW4gd2UgdXNlIGxvbmcgbG9uZworCQkgKiAoZ2NjIHRhaWwtbWVyZ2VzIHByaW50ZiBjYWxsKQorCQkgKi8KKwkJcHJpbnRmKCIlbGxkXG4iLCAobG9uZyBsb25nKShpbnQpdTY0KTsKKwkJYnJlYWs7CisJY2FzZSBBUkdfVUxPTkc6CisJCXU2NCA9ICh1bnNpZ25lZCBsb25nKXU2NDsKKwkJLyogRkFMTFRIUk9VR0ggKi8KKwljYXNlIEFSR19VNjQ6CisJCXByaW50ZigiJWxsdVxuIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyl1NjQpOworCQlicmVhazsKKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsb3NlKGZkKTsKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9kbWVzZy5jIGIvdXRpbC1saW51eC9kbWVzZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NDM0NDYKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L2RtZXNnLmMKQEAgLTAsMCArMSw4OCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICoKKyAqIGRtZXNnIC0gZGlzcGxheS9jb250cm9sIGtlcm5lbCByaW5nIGJ1ZmZlci4KKyAqCisgKiBDb3B5cmlnaHQgMjAwNiBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICogQ29weXJpZ2h0IDIwMDYgQmVybmhhcmQgUmV1dG5lci1GaXNjaGVyIDxyZXAubm9wQGFvbi5hdD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBkbWVzZ190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jXSBbLW4gTEVWRUxdIFstcyBTSVpFXSIKKy8vdXNhZ2U6I2RlZmluZSBkbWVzZ19mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IG9yIGNvbnRyb2wgdGhlIGtlcm5lbCByaW5nIGJ1ZmZlclxuIgorLy91c2FnZTogICAgICJcbgktYwkJQ2xlYXIgcmluZyBidWZmZXIgYWZ0ZXIgcHJpbnRpbmciCisvL3VzYWdlOiAgICAgIlxuCS1uIExFVkVMCVNldCBjb25zb2xlIGxvZ2dpbmcgbGV2ZWwiCisvL3VzYWdlOiAgICAgIlxuCS1zIFNJWkUJCUJ1ZmZlciBzaXplIgorLy91c2FnZTogICAgICJcbgktcgkJUHJpbnQgcmF3IG1lc3NhZ2UgYnVmZmVyIgorCisjaW5jbHVkZSA8c3lzL2tsb2cuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgZG1lc2dfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGRtZXNnX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgbGVuLCBsZXZlbDsKKwljaGFyICpidWY7CisJdW5zaWduZWQgb3B0czsKKwllbnVtIHsKKwkJT1BUX2MgPSAxIDw8IDAsCisJCU9QVF9zID0gMSA8PCAxLAorCQlPUFRfbiA9IDEgPDwgMiwKKwkJT1BUX3IgPSAxIDw8IDMKKwl9OworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAicys6bisiOyAvKiBudW1lcmljICovCisJb3B0cyA9IGdldG9wdDMyKGFyZ3YsICJjczpuOnIiLCAmbGVuLCAmbGV2ZWwpOworCWlmIChvcHRzICYgT1BUX24pIHsKKwkJaWYgKGtsb2djdGwoOCwgTlVMTCwgKGxvbmcpIGxldmVsKSkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgia2xvZ2N0bCIpOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKworCWlmICghKG9wdHMgJiBPUFRfcykpCisJCWxlbiA9IGtsb2djdGwoMTAsIE5VTEwsIDApOyAvKiByZWFkIHJpbmcgYnVmZmVyIHNpemUgKi8KKwlpZiAobGVuIDwgMTYqMTAyNCkKKwkJbGVuID0gMTYqMTAyNDsKKwlpZiAobGVuID4gMTYqMTAyNCoxMDI0KQorCQlsZW4gPSAxNioxMDI0KjEwMjQ7CisKKwlidWYgPSB4bWFsbG9jKGxlbik7CisJbGVuID0ga2xvZ2N0bCgzICsgKG9wdHMgJiBPUFRfYyksIGJ1ZiwgbGVuKTsgLyogcmVhZCByaW5nIGJ1ZmZlciAqLworCWlmIChsZW4gPCAwKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImtsb2djdGwiKTsKKwlpZiAobGVuID09IDApCisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisKKworCWlmIChFTkFCTEVfRkVBVFVSRV9ETUVTR19QUkVUVFkgJiYgIShvcHRzICYgT1BUX3IpKSB7CisJCWludCBsYXN0ID0gJ1xuJzsKKwkJaW50IGluID0gMDsKKworCQkvKiBTa2lwIDxbMC05XSs+IGF0IHRoZSBzdGFydCBvZiBsaW5lcyAqLworCQl3aGlsZSAoMSkgeworCQkJaWYgKGxhc3QgPT0gJ1xuJyAmJiBidWZbaW5dID09ICc8JykgeworCQkJCXdoaWxlIChidWZbaW4rK10gIT0gJz4nICYmIGluIDwgbGVuKQorCQkJCQk7CisJCQl9IGVsc2UgeworCQkJCWxhc3QgPSBidWZbaW4rK107CisJCQkJcHV0Y2hhcihsYXN0KTsKKwkJCX0KKwkJCWlmIChpbiA+PSBsZW4pCisJCQkJYnJlYWs7CisJCX0KKwkJLyogTWFrZSBzdXJlIHdlIGVuZCB3aXRoIGEgbmV3bGluZSAqLworCQlpZiAobGFzdCAhPSAnXG4nKQorCQkJYmJfcHV0Y2hhcignXG4nKTsKKwl9IGVsc2UgeworCQlmdWxsX3dyaXRlKFNURE9VVF9GSUxFTk8sIGJ1ZiwgbGVuKTsKKwkJaWYgKGJ1ZltsZW4tMV0gIT0gJ1xuJykKKwkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfQorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBmcmVlKGJ1Zik7CisKKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9mYXRhdHRyLmMgYi91dGlsLWxpbnV4L2ZhdGF0dHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDkzMzg3Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9mYXRhdHRyLmMKQEAgLTAsMCArMSwxMDQgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIERpc3BsYXkgb3IgY2hhbmdlIGZpbGUgYXR0cmlidXRlcyBvbiBhIGZhdCBmaWxlIHN5c3RlbQorICoKKyAqIENvcHlyaWdodCAyMDA1IEguIFBldGVyIEFudmluCisgKiBCdXN5Ym94J2VkICgyMDE0KSBieSBQYXNjYWwgQmVsbGFyZCA8cGFzY2FsLmJlbGxhcmRAYWRzLWx1LmNvbT4KKyAqCisgKiBUaGlzIGZpbGUgY2FuIGJlIHJlZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbAorICogUHVibGljIExpY2Vuc2UKKyAqLworLy9jb25maWc6Y29uZmlnIEZBVEFUVFIKKy8vY29uZmlnOglib29sICJmYXRhdHRyIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CXNlbGVjdCBQTEFURk9STV9MSU5VWAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIGZhdGF0dHIgbGlzdHMgb3IgY2hhbmdlcyB0aGUgZmlsZSBhdHRyaWJ1dGVzIG9uIGEgZmF0IGZpbGUgc3lzdGVtLgorCisvL2FwcGxldDpJRl9GQVRBVFRSKEFQUExFVChmYXRhdHRyLCBCQl9ESVJfQklOLCBCQl9TVUlEX0RST1ApKQorLy9rYnVpbGQ6bGliLSQoQ09ORklHX0ZBVEFUVFIpICs9IGZhdGF0dHIubworCisvL3VzYWdlOiNkZWZpbmUgZmF0YXR0cl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy0rcmhzdmRhXSBGSUxFLi4uIgorLy91c2FnZTojZGVmaW5lIGZhdGF0dHJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDaGFuZ2UgZmlsZSBhdHRyaWJ1dGVzIG9uIEZBVCBmaWxlc3lzdGVtXG4iCisvL3VzYWdlOiAgICAgIlxuCS0JQ2xlYXIgYXR0cmlidXRlcyIKKy8vdXNhZ2U6ICAgICAiXG4JKwlTZXQgYXR0cmlidXRlcyIKKy8vdXNhZ2U6ICAgICAiXG4JcglSZWFkIG9ubHkiCisvL3VzYWdlOiAgICAgIlxuCWgJSGlkZGVuIgorLy91c2FnZTogICAgICJcbglzCVN5c3RlbSIKKy8vdXNhZ2U6ICAgICAiXG4JdglWb2x1bWUgbGFiZWwiCisvL3VzYWdlOiAgICAgIlxuCWQJRGlyZWN0b3J5IgorLy91c2FnZTogICAgICJcbglhCUFyY2hpdmUiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorLyogbGludXgvbXNkb3NfZnMuaCBzYXlzOiAqLworI2lmbmRlZiBGQVRfSU9DVExfR0VUX0FUVFJJQlVURVMKKyMgZGVmaW5lIEZBVF9JT0NUTF9HRVRfQVRUUklCVVRFUyAgICAgICAgX0lPUigncicsIDB4MTAsIHVpbnQzMl90KQorIyBkZWZpbmUgRkFUX0lPQ1RMX1NFVF9BVFRSSUJVVEVTICAgICAgICBfSU9XKCdyJywgMHgxMSwgdWludDMyX3QpCisjZW5kaWYKKworLyogQ3VycmVudGx5IHN1cHBvcnRzIG9ubHkgdGhlIEZBVCBmbGFncywgbm90IHRoZSBOVEZTIG9uZXMuCisgKiBFeHRyYSBzcGFjZSBhdCB0aGUgZW5kIGlzIGEgaGFjayB0byBwcmludCBzcGFjZSBzZXBhcmF0b3IgaW4gZmlsZSBsaXN0aW5nLgorICogTGV0J3MgaG9wZSBubyBvbmUgZXZlciBwYXNzZXMgc3BhY2UgYXMgYW4gb3B0aW9uIGNoYXIgOikKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgYml0X3RvX2NoYXJbXSA9ICJyaHN2ZGE2NyAiOworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X2ZsYWcoY2hhciBjKQoreworCWNvbnN0IGNoYXIgKmZwID0gc3RyY2hyKGJpdF90b19jaGFyLCBjKTsKKwlpZiAoIWZwKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBjaGFyYWN0ZXIgJyVjJyIsIGMpOworCXJldHVybiAxIDw8IChmcCAtIGJpdF90b19jaGFyKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGRlY29kZV9hcmcoY29uc3QgY2hhciAqYXJnKQoreworCXVuc2lnbmVkIGZsID0gMDsKKwl3aGlsZSAoKisrYXJnKQorCQlmbCB8PSBnZXRfZmxhZygqYXJnKTsKKwlyZXR1cm4gZmw7Cit9CisKK2ludCBmYXRhdHRyX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBmYXRhdHRyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBzZXRfbWFzayA9IDA7CisJdW5zaWduZWQgY2xlYXJfbWFzayA9IDA7CisKKwlmb3IgKDs7KSB7CisJCXVuc2lnbmVkIGZsOworCQljaGFyICphcmcgPSAqKythcmd2OworCisJCWlmICghYXJnKQorCQkJYmJfc2hvd191c2FnZSgpOworCQlpZiAoYXJnWzBdICE9ICctJyAmJiBhcmdbMF0gIT0gJysnKQorCQkJYnJlYWs7CisJCWZsID0gZGVjb2RlX2FyZyhhcmcpOworCQlpZiAoYXJnWzBdID09ICcrJykKKwkJCXNldF9tYXNrIHw9IGZsOworCQllbHNlCisJCQljbGVhcl9tYXNrIHw9IGZsOworCX0KKworCWRvIHsKKwkJaW50IGZkLCBpOworCQl1aW50MzJfdCBhdHRyOworCisJCWZkID0geG9wZW4oKmFyZ3YsIE9fUkRPTkxZKTsKKwkJeGlvY3RsKGZkLCBGQVRfSU9DVExfR0VUX0FUVFJJQlVURVMsICZhdHRyKTsKKwkJYXR0ciA9IChhdHRyIHwgc2V0X21hc2spICYgfmNsZWFyX21hc2s7CisJCWlmIChzZXRfbWFzayB8IGNsZWFyX21hc2spCisJCQl4aW9jdGwoZmQsIEZBVF9JT0NUTF9TRVRfQVRUUklCVVRFUywgJmF0dHIpOworCQllbHNlIHsKKwkJCWZvciAoaSA9IDA7IGJpdF90b19jaGFyW2ldOyBpKyspIHsKKwkJCQliYl9wdXRjaGFyKChhdHRyICYgMSkgPyBiaXRfdG9fY2hhcltpXSA6ICcgJyk7CisJCQkJYXR0ciA+Pj0gMTsKKwkJCX0KKwkJCXB1dHMoKmFyZ3YpOworCQl9CisJCWNsb3NlKGZkKTsKKwl9IHdoaWxlICgqKythcmd2KTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2Zic2V0LmMgYi91dGlsLWxpbnV4L2Zic2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMwMDgyZgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvZmJzZXQuYwpAQCAtMCwwICsxLDUzNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBmYnNldCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBieSBSYW5kb2xwaCBDaHVuZyA8dGF1c3FAZGViaWFuLm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICoKKyAqIFRoaXMgaXMgYSBmcm9tLXNjcmF0Y2ggaW1wbGVtZW50YXRpb24gb2YgZmJzZXQ7IGJ1dCB0aGUgZGUgZmFjdG8gZmJzZXQKKyAqIGltcGxlbWVudGF0aW9uIHdhcyBhIGdvb2QgcmVmZXJlbmNlLiBmYnNldCAob3JpZ2luYWwpIGlzIHJlbGVhc2VkIHVuZGVyCisgKiB0aGUgR1BMLCBhbmQgaXMgKGMpIDE5OTUtMTk5OSBieToKKyAqICAgICBHZWVydCBVeXR0ZXJob2V2ZW4gKEdlZXJ0LlV5dHRlcmhvZXZlbkBjcy5rdWxldXZlbi5hYy5iZSkKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZmJzZXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIltPUFRJT05TXSBbTU9ERV0iCisvL3VzYWdlOiNkZWZpbmUgZmJzZXRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTaG93IGFuZCBtb2RpZnkgZnJhbWUgYnVmZmVyIHNldHRpbmdzIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBmYnNldF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBmYnNldFxuIgorLy91c2FnZTogICAgICAgIm1vZGUgXCIxMDI0eDc2OC03NlwiXG4iCisvL3VzYWdlOiAgICAgICAiCSMgRDogNzguNjUzIE1IeiwgSDogNTkuOTQ5IGtIeiwgVjogNzUuNjk0IEh6XG4iCisvL3VzYWdlOiAgICAgICAiCWdlb21ldHJ5IDEwMjQgNzY4IDEwMjQgNzY4IDE2XG4iCisvL3VzYWdlOiAgICAgICAiCXRpbWluZ3MgMTI3MTQgMTI4IDMyIDE2IDQgMTI4IDRcbiIKKy8vdXNhZ2U6ICAgICAgICIJYWNjZWwgZmFsc2VcbiIKKy8vdXNhZ2U6ICAgICAgICIJcmdiYSA1LzExLDYvNSw1LzAsMC8wXG4iCisvL3VzYWdlOiAgICAgICAiZW5kbW9kZVxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworI2RlZmluZSBERUZBVUxURkJERVYgIEZCXzAKKyNkZWZpbmUgREVGQVVMVEZCTU9ERSAiL2V0Yy9mYi5tb2RlcyIKKworLyogU3R1ZmYgc3RvbGVuIGZyb20gdGhlIGtlcm5lbCdzIGZiLmggKi8KKyNkZWZpbmUgRkJfQUNUSVZBVEVfQUxMIDY0CitlbnVtIHsKKwlGQklPR0VUX1ZTQ1JFRU5JTkZPID0gMHg0NjAwLAorCUZCSU9QVVRfVlNDUkVFTklORk8gPSAweDQ2MDEKK307CisKK3N0cnVjdCBmYl9iaXRmaWVsZCB7CisJdWludDMyX3Qgb2Zmc2V0OyAgICAgICAgICAgICAgICAvKiBiZWdpbm5pbmcgb2YgYml0ZmllbGQgKi8KKwl1aW50MzJfdCBsZW5ndGg7ICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBvZiBiaXRmaWVsZCAqLworCXVpbnQzMl90IG1zYl9yaWdodDsgICAgICAgICAgICAgLyogIT0wOiBNb3N0IHNpZ25pZmljYW50IGJpdCBpcyByaWdodCAqLworfTsKK3N0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyB7CisJdWludDMyX3QgeHJlczsgICAgICAgICAgICAgICAgICAvKiB2aXNpYmxlIHJlc29sdXRpb24gKi8KKwl1aW50MzJfdCB5cmVzOworCXVpbnQzMl90IHhyZXNfdmlydHVhbDsgICAgICAgICAgLyogdmlydHVhbCByZXNvbHV0aW9uICovCisJdWludDMyX3QgeXJlc192aXJ0dWFsOworCXVpbnQzMl90IHhvZmZzZXQ7ICAgICAgICAgICAgICAgLyogb2Zmc2V0IGZyb20gdmlydHVhbCB0byB2aXNpYmxlICovCisJdWludDMyX3QgeW9mZnNldDsgICAgICAgICAgICAgICAvKiByZXNvbHV0aW9uICovCisKKwl1aW50MzJfdCBiaXRzX3Blcl9waXhlbDsKKwl1aW50MzJfdCBncmF5c2NhbGU7ICAgICAgICAgICAgIC8qICE9MCBHcmF5bGV2ZWxzIGluc3RlYWQgb2YgY29sb3JzICovCisKKwlzdHJ1Y3QgZmJfYml0ZmllbGQgcmVkOyAgICAgICAgIC8qIGJpdGZpZWxkIGluIGZiIG1lbSBpZiB0cnVlIGNvbG9yLCAqLworCXN0cnVjdCBmYl9iaXRmaWVsZCBncmVlbjsgICAgICAgLyogZWxzZSBvbmx5IGxlbmd0aCBpcyBzaWduaWZpY2FudCAqLworCXN0cnVjdCBmYl9iaXRmaWVsZCBibHVlOworCXN0cnVjdCBmYl9iaXRmaWVsZCB0cmFuc3A7ICAgICAgLyogdHJhbnNwYXJlbmN5ICovCisKKwl1aW50MzJfdCBub25zdGQ7ICAgICAgICAgICAgICAgIC8qICE9MCBOb24gc3RhbmRhcmQgcGl4ZWwgZm9ybWF0ICovCisKKwl1aW50MzJfdCBhY3RpdmF0ZTsgICAgICAgICAgICAgIC8qIHNlZSBGQl9BQ1RJVkFURV94ICovCisKKwl1aW50MzJfdCBoZWlnaHQ7ICAgICAgICAgICAgICAgIC8qIGhlaWdodCBvZiBwaWN0dXJlIGluIG1tICovCisJdWludDMyX3Qgd2lkdGg7ICAgICAgICAgICAgICAgICAvKiB3aWR0aCBvZiBwaWN0dXJlIGluIG1tICovCisKKwl1aW50MzJfdCBhY2NlbF9mbGFnczsgICAgICAgICAgIC8qIGFjY2VsZXJhdGlvbiBmbGFncyAoaGludHMpICovCisKKwkvKiBUaW1pbmc6IEFsbCB2YWx1ZXMgaW4gcGl4Y2xvY2tzLCBleGNlcHQgcGl4Y2xvY2sgKG9mIGNvdXJzZSkgKi8KKwl1aW50MzJfdCBwaXhjbG9jazsgICAgICAgICAgICAgIC8qIHBpeGVsIGNsb2NrIGluIHBzIChwaWNvIHNlY29uZHMpICovCisJdWludDMyX3QgbGVmdF9tYXJnaW47ICAgICAgICAgICAvKiB0aW1lIGZyb20gc3luYyB0byBwaWN0dXJlICovCisJdWludDMyX3QgcmlnaHRfbWFyZ2luOyAgICAgICAgICAvKiB0aW1lIGZyb20gcGljdHVyZSB0byBzeW5jICovCisJdWludDMyX3QgdXBwZXJfbWFyZ2luOyAgICAgICAgICAvKiB0aW1lIGZyb20gc3luYyB0byBwaWN0dXJlICovCisJdWludDMyX3QgbG93ZXJfbWFyZ2luOworCXVpbnQzMl90IGhzeW5jX2xlbjsgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGhvcml6b250YWwgc3luYyAqLworCXVpbnQzMl90IHZzeW5jX2xlbjsgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIHZlcnRpY2FsIHN5bmMgKi8KKwl1aW50MzJfdCBzeW5jOyAgICAgICAgICAgICAgICAgIC8qIHNlZSBGQl9TWU5DX3ggKi8KKwl1aW50MzJfdCB2bW9kZTsgICAgICAgICAgICAgICAgIC8qIHNlZSBGQl9WTU9ERV94ICovCisJdWludDMyX3QgcmVzZXJ2ZWRbNl07ICAgICAgICAgICAvKiBSZXNlcnZlZCBmb3IgZnV0dXJlIGNvbXBhdGliaWxpdHkgKi8KK307CisKK3N0YXRpYyB2b2lkIGNvcHlfaWZfZ3QwKHVpbnQzMl90ICpzcmMsIHVpbnQzMl90ICpkc3QsIHVuc2lnbmVkIGNudCkKK3sKKwlkbyB7CisJCWlmICgoaW50MzJfdCkgKnNyYyA+IDApCisJCQkqZHN0ID0gKnNyYzsKKwkJc3JjKys7CisJCWRzdCsrOworCX0gd2hpbGUgKC0tY250KTsKK30KKworc3RhdGljIE5PSU5MSU5FIHZvaWQgY29weV9jaGFuZ2VkX3ZhbHVlcygKKwkJc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICpiYXNlLAorCQlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnNldCkKK3sKKwkvL2lmICgoaW50MzJfdCkgc2V0LT54cmVzID4gMCkgYmFzZS0+eHJlcyA9IHNldC0+eHJlczsKKwkvL2lmICgoaW50MzJfdCkgc2V0LT55cmVzID4gMCkgYmFzZS0+eXJlcyA9IHNldC0+eXJlczsKKwkvL2lmICgoaW50MzJfdCkgc2V0LT54cmVzX3ZpcnR1YWwgPiAwKSAgIGJhc2UtPnhyZXNfdmlydHVhbCA9IHNldC0+eHJlc192aXJ0dWFsOworCS8vaWYgKChpbnQzMl90KSBzZXQtPnlyZXNfdmlydHVhbCA+IDApICAgYmFzZS0+eXJlc192aXJ0dWFsID0gc2V0LT55cmVzX3ZpcnR1YWw7CisJY29weV9pZl9ndDAoJnNldC0+eHJlcywgJmJhc2UtPnhyZXMsIDQpOworCisJaWYgKChpbnQzMl90KSBzZXQtPmJpdHNfcGVyX3BpeGVsID4gMCkgYmFzZS0+Yml0c19wZXJfcGl4ZWwgPSBzZXQtPmJpdHNfcGVyX3BpeGVsOworCS8vY29weV9pZl9ndDAoJnNldC0+Yml0c19wZXJfcGl4ZWwsICZiYXNlLT5iaXRzX3Blcl9waXhlbCwgMSk7CisKKwkvL2lmICgoaW50MzJfdCkgc2V0LT5waXhjbG9jayA+IDApICAgICAgIGJhc2UtPnBpeGNsb2NrID0gc2V0LT5waXhjbG9jazsKKwkvL2lmICgoaW50MzJfdCkgc2V0LT5sZWZ0X21hcmdpbiA+IDApICAgIGJhc2UtPmxlZnRfbWFyZ2luID0gc2V0LT5sZWZ0X21hcmdpbjsKKwkvL2lmICgoaW50MzJfdCkgc2V0LT5yaWdodF9tYXJnaW4gPiAwKSAgIGJhc2UtPnJpZ2h0X21hcmdpbiA9IHNldC0+cmlnaHRfbWFyZ2luOworCS8vaWYgKChpbnQzMl90KSBzZXQtPnVwcGVyX21hcmdpbiA+IDApICAgYmFzZS0+dXBwZXJfbWFyZ2luID0gc2V0LT51cHBlcl9tYXJnaW47CisJLy9pZiAoKGludDMyX3QpIHNldC0+bG93ZXJfbWFyZ2luID4gMCkgICBiYXNlLT5sb3dlcl9tYXJnaW4gPSBzZXQtPmxvd2VyX21hcmdpbjsKKwkvL2lmICgoaW50MzJfdCkgc2V0LT5oc3luY19sZW4gPiAwKSBiYXNlLT5oc3luY19sZW4gPSBzZXQtPmhzeW5jX2xlbjsKKwkvL2lmICgoaW50MzJfdCkgc2V0LT52c3luY19sZW4gPiAwKSBiYXNlLT52c3luY19sZW4gPSBzZXQtPnZzeW5jX2xlbjsKKwkvL2lmICgoaW50MzJfdCkgc2V0LT5zeW5jID4gMCkgIGJhc2UtPnN5bmMgPSBzZXQtPnN5bmM7CisJLy9pZiAoKGludDMyX3QpIHNldC0+dm1vZGUgPiAwKSBiYXNlLT52bW9kZSA9IHNldC0+dm1vZGU7CisJY29weV9pZl9ndDAoJnNldC0+cGl4Y2xvY2ssICZiYXNlLT5waXhjbG9jaywgOSk7Cit9CisKKworZW51bSB7CisJQ01EX0ZCID0gMSwKKwlDTURfREIgPSAyLAorCUNNRF9HRU9NRVRSWSA9IDMsCisJQ01EX1RJTUlORyA9IDQsCisJQ01EX0FDQ0VMID0gNSwKKwlDTURfSFNZTkMgPSA2LAorCUNNRF9WU1lOQyA9IDcsCisJQ01EX0xBQ0VEID0gOCwKKwlDTURfRE9VQkxFID0gOSwKKy8qCUNNRF9YQ09NUEFUID0gICAgIDEwLCAqLworCUNNRF9BTEwgPSAxMSwKKwlDTURfSU5GTyA9IDEyLAorCUNNRF9TSE9XID0gMTMsCisJQ01EX0NIQU5HRSA9IDE0LAorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkJTRVRfRkFOQ1kKKwlDTURfWFJFUyA9IDEwMCwKKwlDTURfWVJFUyA9IDEwMSwKKwlDTURfVlhSRVMgPSAxMDIsCisJQ01EX1ZZUkVTID0gMTAzLAorCUNNRF9ERVBUSCA9IDEwNCwKKwlDTURfTUFUQ0ggPSAxMDUsCisJQ01EX1BJWENMT0NLID0gMTA2LAorCUNNRF9MRUZUID0gMTA3LAorCUNNRF9SSUdIVCA9IDEwOCwKKwlDTURfVVBQRVIgPSAxMDksCisJQ01EX0xPV0VSID0gMTEwLAorCUNNRF9IU0xFTiA9IDExMSwKKwlDTURfVlNMRU4gPSAxMTIsCisJQ01EX0NTWU5DID0gMTEzLAorCUNNRF9HU1lOQyA9IDExNCwKKwlDTURfRVhUU1lOQyA9IDExNSwKKwlDTURfQkNBU1QgPSAxMTYsCisJQ01EX1JHQkEgPSAxMTcsCisJQ01EX1NURVAgPSAxMTgsCisJQ01EX01PVkUgPSAxMTksCisjZW5kaWYKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgY21kb3B0aW9uc190IHsKKwljb25zdCBjaGFyIG5hbWVbOV07CisJY29uc3QgdW5zaWduZWQgY2hhciBwYXJhbV9jb3VudDsKKwljb25zdCB1bnNpZ25lZCBjaGFyIGNvZGU7Cit9IGdfY21kb3B0aW9uc1tdID0geworCS8qIjEyMzQ1Njc4IiArIE5VTCAqLworCXsgImZiIiAgICAgICwgMSwgQ01EX0ZCICAgICAgIH0sCisJeyAiZGIiICAgICAgLCAxLCBDTURfREIgICAgICAgfSwKKwl7ICJhIiAgICAgICAsIDAsIENNRF9BTEwgICAgICB9LAorCXsgImkiICAgICAgICwgMCwgQ01EX0lORk8gICAgIH0sCisJeyAiZyIgICAgICAgLCA1LCBDTURfR0VPTUVUUlkgfSwKKwl7ICJ0IiAgICAgICAsIDcsIENNRF9USU1JTkcgICB9LAorCXsgImFjY2VsIiAgICwgMSwgQ01EX0FDQ0VMICAgIH0sCisJeyAiaHN5bmMiICAgLCAxLCBDTURfSFNZTkMgICAgfSwKKwl7ICJ2c3luYyIgICAsIDEsIENNRF9WU1lOQyAgICB9LAorCXsgImxhY2VkIiAgICwgMSwgQ01EX0xBQ0VEICAgIH0sCisJeyAiZG91YmxlIiAgLCAxLCBDTURfRE9VQkxFICAgfSwKKwl7ICJzaG93IiAgICAsIDAsIENNRF9TSE9XICAgICB9LAorCXsgInMiICAgICAgICwgMCwgQ01EX1NIT1cgICAgIH0sCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkJTRVRfRkFOQ1kKKwl7ICJhbGwiICAgICAsIDAsIENNRF9BTEwgICAgICB9LAorCXsgInhyZXMiICAgICwgMSwgQ01EX1hSRVMgICAgIH0sCisJeyAieXJlcyIgICAgLCAxLCBDTURfWVJFUyAgICAgfSwKKwl7ICJ2eHJlcyIgICAsIDEsIENNRF9WWFJFUyAgICB9LAorCXsgInZ5cmVzIiAgICwgMSwgQ01EX1ZZUkVTICAgIH0sCisJeyAiZGVwdGgiICAgLCAxLCBDTURfREVQVEggICAgfSwKKwl7ICJtYXRjaCIgICAsIDAsIENNRF9NQVRDSCAgICB9LAorCXsgImdlb21ldHJ5IiwgNSwgQ01EX0dFT01FVFJZIH0sCisJeyAicGl4Y2xvY2siLCAxLCBDTURfUElYQ0xPQ0sgfSwKKwl7ICJsZWZ0IiAgICAsIDEsIENNRF9MRUZUICAgICB9LAorCXsgInJpZ2h0IiAgICwgMSwgQ01EX1JJR0hUICAgIH0sCisJeyAidXBwZXIiICAgLCAxLCBDTURfVVBQRVIgICAgfSwKKwl7ICJsb3dlciIgICAsIDEsIENNRF9MT1dFUiAgICB9LAorCXsgImhzbGVuIiAgICwgMSwgQ01EX0hTTEVOICAgIH0sCisJeyAidnNsZW4iICAgLCAxLCBDTURfVlNMRU4gICAgfSwKKwl7ICJ0aW1pbmdzIiAsIDcsIENNRF9USU1JTkcgICB9LAorCXsgImNzeW5jIiAgICwgMSwgQ01EX0NTWU5DICAgIH0sCisJeyAiZ3N5bmMiICAgLCAxLCBDTURfR1NZTkMgICAgfSwKKwl7ICJleHRzeW5jIiAsIDEsIENNRF9FWFRTWU5DICB9LAorCXsgImJjYXN0IiAgICwgMSwgQ01EX0JDQVNUICAgIH0sCisJeyAicmdiYSIgICAgLCAxLCBDTURfUkdCQSAgICAgfSwKKwl7ICJzdGVwIiAgICAsIDEsIENNRF9TVEVQICAgICB9LAorCXsgIm1vdmUiICAgICwgMSwgQ01EX01PVkUgICAgIH0sCisjZW5kaWYKK307CisKKy8qIHRha2VuIGZyb20gbGludXgvZmIuaCAqLworZW51bSB7CisJRkJfU1lOQ19IT1JfSElHSF9BQ1QgPSAxLCAgICAgICAvKiBob3Jpem9udGFsIHN5bmMgaGlnaCBhY3RpdmUgKi8KKwlGQl9TWU5DX1ZFUlRfSElHSF9BQ1QgPSAyLCAgICAgIC8qIHZlcnRpY2FsIHN5bmMgaGlnaCBhY3RpdmUgKi8KKyNpZiBFTkFCTEVfRkVBVFVSRV9GQlNFVF9SRUFETU9ERQorCUZCX1ZNT0RFX0lOVEVSTEFDRUQgPSAxLCAgICAgICAgLyogaW50ZXJsYWNlZCAqLworCUZCX1ZNT0RFX0RPVUJMRSA9IDIsICAgICAgICAgICAgLyogZG91YmxlIHNjYW4gKi8KKwlGQl9TWU5DX0VYVCA9IDQsICAgICAgICAgICAgICAgIC8qIGV4dGVybmFsIHN5bmMgKi8KKwlGQl9TWU5DX0NPTVBfSElHSF9BQ1QgPSA4LCAgICAgIC8qIGNvbXBvc2l0ZSBzeW5jIGhpZ2ggYWN0aXZlICovCisjZW5kaWYKK307CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GQlNFVF9SRUFETU9ERQorc3RhdGljIHZvaWQgc3ModWludDMyX3QgKngsIHVpbnQzMl90IGZsYWcsIGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqd2hhdCkKK3sKKwlpZiAoc3RyY21wKGJ1Ziwgd2hhdCkgPT0gMCkKKwkJKnggJj0gfmZsYWc7CisJZWxzZQorCQkqeCB8PSBmbGFnOworfQorCisvKiBNb2RlIGRiIGZpbGUgY29udGFpbnMgbW9kZSBkZWZpbml0aW9ucyBsaWtlIHRoaXM6CisgKiBtb2RlICI4MDB4NjAwLTQ4LWxhY2UiCisgKiAgICAgIyBEOiAzNi4wMCBNSHosIEg6IDMzLjgzNSBrSHosIFY6IDk2LjM5IEh6CisgKiAgICAgZ2VvbWV0cnkgODAwIDYwMCA4MDAgNjAwIDgKKyAqICAgICB0aW1pbmdzIDI3Nzc4IDU2IDgwIDc5IDExIDEyOCAxMgorICogICAgIGxhY2VkIHRydWUKKyAqICAgICBoc3luYyBoaWdoCisgKiAgICAgdnN5bmMgaGlnaAorICogZW5kbW9kZQorICovCitzdGF0aWMgaW50IHJlYWRfbW9kZV9kYihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKmJhc2UsIGNvbnN0IGNoYXIgKmZuLAorCQkJCQljb25zdCBjaGFyICptb2RlKQoreworCWNoYXIgKnRva2VuWzJdLCAqcCwgKnM7CisJcGFyc2VyX3QgKnBhcnNlciA9IGNvbmZpZ19vcGVuKGZuKTsKKworCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRva2VuLCAyLCAxLCAiIyBcdFxyIiwgUEFSU0VfTk9STUFMKSkgeworCQlpZiAoc3RyY21wKHRva2VuWzBdLCAibW9kZSIpICE9IDAgfHwgIXRva2VuWzFdKQorCQkJY29udGludWU7CisJCXAgPSBzdHJzdHIodG9rZW5bMV0sIG1vZGUpOworCQlpZiAoIXApCisJCQljb250aW51ZTsKKwkJcyA9IHAgKyBzdHJsZW4obW9kZSk7CisJCS8vYmJfaW5mb19tc2coIkNIRUNLWyVzXVslc11bJWRdIiwgbW9kZSwgcC0xLCAqcyk7CisJCS8qIGV4YWN0IG1hdGNoPyAqLworCQlpZiAoKCghKnMgfHwgaXNzcGFjZSgqcykpICYmICciJyAhPSBzWy0xXSkgLyogZW5kLW9mLXRva2VuICovCisJCSB8fCAoJyInID09ICpzICYmICciJyA9PSBwWy0xXSkgLyogZW5kcyB3aXRoICIgYnV0IHN0YXJ0cyB3aXRoICIgdG9vISAqLworCQkpIHsKKwkJCS8vYmJfaW5mb19tc2coIkZPVU5EWyVzXVslc11bJXNdWyVkXSIsIHRva2VuWzFdLCBwLCBtb2RlLCBpc3NwYWNlKCpzKSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCWlmICghdG9rZW5bMF0pCisJCXJldHVybiAwOworCisJd2hpbGUgKGNvbmZpZ19yZWFkKHBhcnNlciwgdG9rZW4sIDIsIDEsICIjIFx0IiwgUEFSU0VfTk9STUFMKSkgeworCQlpbnQgaTsKKworLy9iYl9pbmZvX21zZygiPz8/WyVzXVslc10iLCB0b2tlblswXSwgdG9rZW5bMV0pOworCQlpZiAoc3RyY21wKHRva2VuWzBdLCAiZW5kbW9kZSIpID09IDApIHsKKy8vYmJfaW5mb19tc2coIk9LWyVzXSIsIG1vZGUpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJcCA9IHRva2VuWzFdOworCQlpID0gaW5kZXhfaW5fc3RyaW5ncygKKwkJCSJnZW9tZXRyeVwwdGltaW5nc1wwaW50ZXJsYWNlZFwwZG91YmxlXDB2c3luY1wwaHN5bmNcMGNzeW5jXDBleHRzeW5jXDByZ2JhXDAiLAorCQkJdG9rZW5bMF0pOworCQlzd2l0Y2ggKGkpIHsKKwkJY2FzZSAwOgorCQkJaWYgKHNpemVvZihpbnQpID09IHNpemVvZihiYXNlLT54cmVzKSkgeworCQkJCXNzY2FuZihwLCAiJWQgJWQgJWQgJWQgJWQiLAorCQkJCQkmYmFzZS0+eHJlcywgJmJhc2UtPnlyZXMsCisJCQkJCSZiYXNlLT54cmVzX3ZpcnR1YWwsICZiYXNlLT55cmVzX3ZpcnR1YWwsCisJCQkJCSZiYXNlLT5iaXRzX3Blcl9waXhlbCk7CisJCQl9IGVsc2UgeworCQkJCWludCBiYXNlX3hyZXMsIGJhc2VfeXJlczsKKwkJCQlpbnQgYmFzZV94cmVzX3ZpcnR1YWwsIGJhc2VfeXJlc192aXJ0dWFsOworCQkJCWludCBiYXNlX2JpdHNfcGVyX3BpeGVsOworCQkJCXNzY2FuZihwLCAiJWQgJWQgJWQgJWQgJWQiLAorCQkJCQkmYmFzZV94cmVzLCAmYmFzZV95cmVzLAorCQkJCQkmYmFzZV94cmVzX3ZpcnR1YWwsICZiYXNlX3lyZXNfdmlydHVhbCwKKwkJCQkJJmJhc2VfYml0c19wZXJfcGl4ZWwpOworCQkJCWJhc2UtPnhyZXMgPSBiYXNlX3hyZXM7CisJCQkJYmFzZS0+eXJlcyA9IGJhc2VfeXJlczsKKwkJCQliYXNlLT54cmVzX3ZpcnR1YWwgPSBiYXNlX3hyZXNfdmlydHVhbDsKKwkJCQliYXNlLT55cmVzX3ZpcnR1YWwgPSBiYXNlX3lyZXNfdmlydHVhbDsKKwkJCQliYXNlLT5iaXRzX3Blcl9waXhlbCA9IGJhc2VfYml0c19wZXJfcGl4ZWw7CisJCQl9CisvL2JiX2luZm9fbXNnKCJHRU9bJXNdIiwgcCk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJaWYgKHNpemVvZihpbnQpID09IHNpemVvZihiYXNlLT54cmVzKSkgeworCQkJCXNzY2FuZihwLCAiJWQgJWQgJWQgJWQgJWQgJWQgJWQiLAorCQkJCQkmYmFzZS0+cGl4Y2xvY2ssCisJCQkJCSZiYXNlLT5sZWZ0X21hcmdpbiwgJmJhc2UtPnJpZ2h0X21hcmdpbiwKKwkJCQkJJmJhc2UtPnVwcGVyX21hcmdpbiwgJmJhc2UtPmxvd2VyX21hcmdpbiwKKwkJCQkJJmJhc2UtPmhzeW5jX2xlbiwgJmJhc2UtPnZzeW5jX2xlbik7CisJCQl9IGVsc2UgeworCQkJCWludCBiYXNlX3BpeGNsb2NrOworCQkJCWludCBiYXNlX2xlZnRfbWFyZ2luLCBiYXNlX3JpZ2h0X21hcmdpbjsKKwkJCQlpbnQgYmFzZV91cHBlcl9tYXJnaW4sIGJhc2VfbG93ZXJfbWFyZ2luOworCQkJCWludCBiYXNlX2hzeW5jX2xlbiwgYmFzZV92c3luY19sZW47CisJCQkJc3NjYW5mKHAsICIlZCAlZCAlZCAlZCAlZCAlZCAlZCIsCisJCQkJCSZiYXNlX3BpeGNsb2NrLAorCQkJCQkmYmFzZV9sZWZ0X21hcmdpbiwgJmJhc2VfcmlnaHRfbWFyZ2luLAorCQkJCQkmYmFzZV91cHBlcl9tYXJnaW4sICZiYXNlX2xvd2VyX21hcmdpbiwKKwkJCQkJJmJhc2VfaHN5bmNfbGVuLCAmYmFzZV92c3luY19sZW4pOworCQkJCWJhc2UtPnBpeGNsb2NrID0gYmFzZV9waXhjbG9jazsKKwkJCQliYXNlLT5sZWZ0X21hcmdpbiA9IGJhc2VfbGVmdF9tYXJnaW47CisJCQkJYmFzZS0+cmlnaHRfbWFyZ2luID0gYmFzZV9yaWdodF9tYXJnaW47CisJCQkJYmFzZS0+dXBwZXJfbWFyZ2luID0gYmFzZV91cHBlcl9tYXJnaW47CisJCQkJYmFzZS0+bG93ZXJfbWFyZ2luID0gYmFzZV9sb3dlcl9tYXJnaW47CisJCQkJYmFzZS0+aHN5bmNfbGVuID0gYmFzZV9oc3luY19sZW47CisJCQkJYmFzZS0+dnN5bmNfbGVuID0gYmFzZV92c3luY19sZW47CisJCQl9CisvL2JiX2luZm9fbXNnKCJUSU1bJXNdIiwgcCk7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQljYXNlIDM6IHsKKwkJCXN0YXRpYyBjb25zdCB1aW50MzJfdCBzeW5jc1tdID0ge0ZCX1ZNT0RFX0lOVEVSTEFDRUQsIEZCX1ZNT0RFX0RPVUJMRX07CisJCQlzcygmYmFzZS0+dm1vZGUsIHN5bmNzW2ktMl0sIHAsICJmYWxzZSIpOworLy9iYl9pbmZvX21zZygiVk1PREVbJXNdIiwgcCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIDQ6CisJCWNhc2UgNToKKwkJY2FzZSA2OiB7CisJCQlzdGF0aWMgY29uc3QgdWludDMyX3Qgc3luY3NbXSA9IHtGQl9TWU5DX1ZFUlRfSElHSF9BQ1QsIEZCX1NZTkNfSE9SX0hJR0hfQUNULCBGQl9TWU5DX0NPTVBfSElHSF9BQ1R9OworCQkJc3MoJmJhc2UtPnN5bmMsIHN5bmNzW2ktNF0sIHAsICJsb3ciKTsKKy8vYmJfaW5mb19tc2coIlNZTkNbJXNdIiwgcCk7CisJCQlicmVhazsKKwkJfQorCQljYXNlIDc6CisJCQlzcygmYmFzZS0+c3luYywgRkJfU1lOQ19FWFQsIHAsICJmYWxzZSIpOworLy9iYl9pbmZvX21zZygiRVhUU1lOQ1slc10iLCBwKTsKKwkJCWJyZWFrOworCQljYXNlIDg6IHsKKwkJCWludCByZWRfb2Zmc2V0LCByZWRfbGVuZ3RoOworCQkJaW50IGdyZWVuX29mZnNldCwgZ3JlZW5fbGVuZ3RoOworCQkJaW50IGJsdWVfb2Zmc2V0LCBibHVlX2xlbmd0aDsKKwkJCWludCB0cmFuc3Bfb2Zmc2V0LCB0cmFuc3BfbGVuZ3RoOworCisJCQlzc2NhbmYocCwgIiVkLyVkLCVkLyVkLCVkLyVkLCVkLyVkIiwKKwkJCQkmcmVkX2xlbmd0aCwgJnJlZF9vZmZzZXQsCisJCQkJJmdyZWVuX2xlbmd0aCwgJmdyZWVuX29mZnNldCwKKwkJCQkmYmx1ZV9sZW5ndGgsICZibHVlX29mZnNldCwKKwkJCQkmdHJhbnNwX2xlbmd0aCwgJnRyYW5zcF9vZmZzZXQpOworCQkJYmFzZS0+cmVkLm9mZnNldCA9IHJlZF9vZmZzZXQ7CisJCQliYXNlLT5yZWQubGVuZ3RoID0gcmVkX2xlbmd0aDsKKwkJCWJhc2UtPnJlZC5tc2JfcmlnaHQgPSAwOworCQkJYmFzZS0+Z3JlZW4ub2Zmc2V0ID0gZ3JlZW5fb2Zmc2V0OworCQkJYmFzZS0+Z3JlZW4ubGVuZ3RoID0gZ3JlZW5fbGVuZ3RoOworCQkJYmFzZS0+Z3JlZW4ubXNiX3JpZ2h0ID0gMDsKKwkJCWJhc2UtPmJsdWUub2Zmc2V0ID0gYmx1ZV9vZmZzZXQ7CisJCQliYXNlLT5ibHVlLmxlbmd0aCA9IGJsdWVfbGVuZ3RoOworCQkJYmFzZS0+Ymx1ZS5tc2JfcmlnaHQgPSAwOworCQkJYmFzZS0+dHJhbnNwLm9mZnNldCA9IHRyYW5zcF9vZmZzZXQ7CisJCQliYXNlLT50cmFuc3AubGVuZ3RoID0gdHJhbnNwX2xlbmd0aDsKKwkJCWJhc2UtPnRyYW5zcC5tc2JfcmlnaHQgPSAwOworCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisjZW5kaWYKKworc3RhdGljIE5PSU5MSU5FIHZvaWQgc2hvd21vZGUoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2KQoreworCWRvdWJsZSBkcmF0ZSA9IDAsIGhyYXRlID0gMCwgdnJhdGUgPSAwOworCisJaWYgKHYtPnBpeGNsb2NrKSB7CisJCWRyYXRlID0gMWUxMiAvIHYtPnBpeGNsb2NrOworCQlocmF0ZSA9IGRyYXRlIC8gKHYtPmxlZnRfbWFyZ2luICsgdi0+eHJlcyArIHYtPnJpZ2h0X21hcmdpbiArIHYtPmhzeW5jX2xlbik7CisJCXZyYXRlID0gaHJhdGUgLyAodi0+dXBwZXJfbWFyZ2luICsgdi0+eXJlcyArIHYtPmxvd2VyX21hcmdpbiArIHYtPnZzeW5jX2xlbik7CisJfQorCXByaW50ZigiXG5tb2RlIFwiJXV4JXUtJXVcIlxuIgorI2lmIEVOQUJMRV9GRUFUVVJFX0ZCU0VUX0ZBTkNZCisJIlx0IyBEOiAlLjNmIE1IeiwgSDogJS4zZiBrSHosIFY6ICUuM2YgSHpcbiIKKyNlbmRpZgorCSJcdGdlb21ldHJ5ICV1ICV1ICV1ICV1ICV1XG4iCisJIlx0dGltaW5ncyAldSAldSAldSAldSAldSAldSAldVxuIgorCSJcdGFjY2VsICVzXG4iCisJIlx0cmdiYSAldS8ldSwldS8ldSwldS8ldSwldS8ldVxuIgorCSJlbmRtb2RlXG5cbiIsCisJCXYtPnhyZXMsIHYtPnlyZXMsIChpbnQpICh2cmF0ZSArIDAuNSksCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkJTRVRfRkFOQ1kKKwkJZHJhdGUgLyAxZTYsIGhyYXRlIC8gMWUzLCB2cmF0ZSwKKyNlbmRpZgorCQl2LT54cmVzLCB2LT55cmVzLCB2LT54cmVzX3ZpcnR1YWwsIHYtPnlyZXNfdmlydHVhbCwgdi0+Yml0c19wZXJfcGl4ZWwsCisJCXYtPnBpeGNsb2NrLCB2LT5sZWZ0X21hcmdpbiwgdi0+cmlnaHRfbWFyZ2luLCB2LT51cHBlcl9tYXJnaW4sIHYtPmxvd2VyX21hcmdpbiwKKwkJCXYtPmhzeW5jX2xlbiwgdi0+dnN5bmNfbGVuLAorCQkodi0+YWNjZWxfZmxhZ3MgPiAwID8gInRydWUiIDogImZhbHNlIiksCisJCXYtPnJlZC5sZW5ndGgsIHYtPnJlZC5vZmZzZXQsIHYtPmdyZWVuLmxlbmd0aCwgdi0+Z3JlZW4ub2Zmc2V0LAorCQkJdi0+Ymx1ZS5sZW5ndGgsIHYtPmJsdWUub2Zmc2V0LCB2LT50cmFuc3AubGVuZ3RoLCB2LT50cmFuc3Aub2Zmc2V0KTsKK30KKworaW50IGZic2V0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBmYnNldF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwllbnVtIHsKKwkJT1BUX0NIQU5HRSAgID0gKDEgPDwgMCksCisJCU9QVF9TSE9XICAgICA9ICgxIDw8IDEpLAorCQlPUFRfUkVBRE1PREUgPSAoMSA8PCAyKSwKKwkJT1BUX0FMTCAgICAgID0gKDEgPDwgMyksCisJfTsKKwlzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gdmFyX29sZCwgdmFyX3NldDsKKwlpbnQgZmgsIGk7CisJdW5zaWduZWQgb3B0aW9ucyA9IDA7CisKKwljb25zdCBjaGFyICpmYmRldiA9IERFRkFVTFRGQkRFVjsKKwljb25zdCBjaGFyICptb2RlZmlsZSA9IERFRkFVTFRGQk1PREU7CisJY2hhciAqdGhpc2FyZzsKKwljaGFyICptb2RlID0gbW9kZTsgLyogZm9yIGNvbXBpbGVyICovCisKKwltZW1zZXQoJnZhcl9zZXQsIDB4ZmYsIHNpemVvZih2YXJfc2V0KSk7IC8qIHNldCBhbGwgdG8gLTEgKi8KKworCS8qIHBhcnNlIGNtZCBhcmdzLi4uLiB3aHkgZG8gdGhleSBoYXZlIHRvIG1ha2UgdGhpbmdzIHNvIGRpZmZpY3VsdD8gKi8KKwlhcmd2Kys7CisJYXJnYy0tOworCWZvciAoOyBhcmdjID4gMCAmJiAodGhpc2FyZyA9ICphcmd2KSAhPSBOVUxMOyBhcmdjLS0sIGFyZ3YrKykgeworCQlpZiAodGhpc2FyZ1swXSAhPSAnLScpIHsKKwkJCWlmICghRU5BQkxFX0ZFQVRVUkVfRkJTRVRfUkVBRE1PREUgfHwgYXJnYyAhPSAxKQorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJCW1vZGUgPSB0aGlzYXJnOworCQkJb3B0aW9ucyB8PSBPUFRfUkVBRE1PREU7CisJCQlnb3RvIGNvbnRpbjsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShnX2NtZG9wdGlvbnMpOyBpKyspIHsKKwkJCWlmIChzdHJjbXAodGhpc2FyZyArIDEsIGdfY21kb3B0aW9uc1tpXS5uYW1lKSAhPSAwKQorCQkJCWNvbnRpbnVlOworCQkJaWYgKGFyZ2MgPD0gZ19jbWRvcHRpb25zW2ldLnBhcmFtX2NvdW50KQorCQkJCWJiX3Nob3dfdXNhZ2UoKTsKKworCQkJc3dpdGNoIChnX2NtZG9wdGlvbnNbaV0uY29kZSkgeworCQkJY2FzZSBDTURfRkI6CisJCQkJZmJkZXYgPSBhcmd2WzFdOworCQkJCWJyZWFrOworCQkJY2FzZSBDTURfREI6CisJCQkJbW9kZWZpbGUgPSBhcmd2WzFdOworCQkJCWJyZWFrOworCQkJY2FzZSBDTURfQUxMOgorCQkJCW9wdGlvbnMgfD0gT1BUX0FMTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01EX1NIT1c6CisJCQkJb3B0aW9ucyB8PSBPUFRfU0hPVzsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01EX0dFT01FVFJZOgorCQkJCXZhcl9zZXQueHJlcyA9IHhhdG91MzIoYXJndlsxXSk7CisJCQkJdmFyX3NldC55cmVzID0geGF0b3UzMihhcmd2WzJdKTsKKwkJCQl2YXJfc2V0LnhyZXNfdmlydHVhbCA9IHhhdG91MzIoYXJndlszXSk7CisJCQkJdmFyX3NldC55cmVzX3ZpcnR1YWwgPSB4YXRvdTMyKGFyZ3ZbNF0pOworCQkJCXZhcl9zZXQuYml0c19wZXJfcGl4ZWwgPSB4YXRvdTMyKGFyZ3ZbNV0pOworCQkJCWJyZWFrOworCQkJY2FzZSBDTURfVElNSU5HOgorCQkJCXZhcl9zZXQucGl4Y2xvY2sgPSB4YXRvdTMyKGFyZ3ZbMV0pOworCQkJCXZhcl9zZXQubGVmdF9tYXJnaW4gPSB4YXRvdTMyKGFyZ3ZbMl0pOworCQkJCXZhcl9zZXQucmlnaHRfbWFyZ2luID0geGF0b3UzMihhcmd2WzNdKTsKKwkJCQl2YXJfc2V0LnVwcGVyX21hcmdpbiA9IHhhdG91MzIoYXJndls0XSk7CisJCQkJdmFyX3NldC5sb3dlcl9tYXJnaW4gPSB4YXRvdTMyKGFyZ3ZbNV0pOworCQkJCXZhcl9zZXQuaHN5bmNfbGVuID0geGF0b3UzMihhcmd2WzZdKTsKKwkJCQl2YXJfc2V0LnZzeW5jX2xlbiA9IHhhdG91MzIoYXJndls3XSk7CisJCQkJYnJlYWs7CisJCQljYXNlIENNRF9BQ0NFTDoKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01EX0hTWU5DOgorCQkJCXZhcl9zZXQuc3luYyB8PSBGQl9TWU5DX0hPUl9ISUdIX0FDVDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01EX1ZTWU5DOgorCQkJCXZhcl9zZXQuc3luYyB8PSBGQl9TWU5DX1ZFUlRfSElHSF9BQ1Q7CisJCQkJYnJlYWs7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRkJTRVRfRkFOQ1kKKwkJCWNhc2UgQ01EX1hSRVM6CisJCQkJdmFyX3NldC54cmVzID0geGF0b3UzMihhcmd2WzFdKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01EX1lSRVM6CisJCQkJdmFyX3NldC55cmVzID0geGF0b3UzMihhcmd2WzFdKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ01EX0RFUFRIOgorCQkJCXZhcl9zZXQuYml0c19wZXJfcGl4ZWwgPSB4YXRvdTMyKGFyZ3ZbMV0pOworCQkJCWJyZWFrOworI2VuZGlmCisJCQl9CisJCQlzd2l0Y2ggKGdfY21kb3B0aW9uc1tpXS5jb2RlKSB7CisJCQljYXNlIENNRF9GQjoKKwkJCWNhc2UgQ01EX0RCOgorCQkJY2FzZSBDTURfQUxMOgorCQkJY2FzZSBDTURfU0hPVzoKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJLyogb3RoZXIgY29tbWFuZHMgaW1wbHkgY2hhbmdlcyAqLworCQkJCW9wdGlvbnMgfD0gT1BUX0NIQU5HRTsKKwkJCX0KKwkJCWFyZ2MgLT0gZ19jbWRvcHRpb25zW2ldLnBhcmFtX2NvdW50OworCQkJYXJndiArPSBnX2NtZG9wdGlvbnNbaV0ucGFyYW1fY291bnQ7CisJCQlnb3RvIGNvbnRpbjsKKwkJfQorCQliYl9zaG93X3VzYWdlKCk7CisgY29udGluOiA7CisJfQorCisJZmggPSB4b3BlbihmYmRldiwgT19SRE9OTFkpOworCXhpb2N0bChmaCwgRkJJT0dFVF9WU0NSRUVOSU5GTywgJnZhcl9vbGQpOworCisJaWYgKG9wdGlvbnMgJiBPUFRfUkVBRE1PREUpIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9GQlNFVF9SRUFETU9ERQorCQlpZiAoIXJlYWRfbW9kZV9kYigmdmFyX29sZCwgbW9kZWZpbGUsIG1vZGUpKSB7CisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidW5rbm93biB2aWRlbyBtb2RlICclcyciLCBtb2RlKTsKKwkJfQorCQlvcHRpb25zIHw9IE9QVF9DSEFOR0U7CisjZW5kaWYKKwl9CisKKwlpZiAob3B0aW9ucyAmIE9QVF9DSEFOR0UpIHsKKwkJY29weV9jaGFuZ2VkX3ZhbHVlcygmdmFyX29sZCwgJnZhcl9zZXQpOworCQlpZiAob3B0aW9ucyAmIE9QVF9BTEwpCisJCQl2YXJfb2xkLmFjdGl2YXRlID0gRkJfQUNUSVZBVEVfQUxMOworCQl4aW9jdGwoZmgsIEZCSU9QVVRfVlNDUkVFTklORk8sICZ2YXJfb2xkKTsKKwl9CisKKwlpZiAob3B0aW9ucyA9PSAwIHx8IChvcHRpb25zICYgT1BUX1NIT1cpKQorCQlzaG93bW9kZSgmdmFyX29sZCk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWNsb3NlKGZoKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2ZkZm9ybWF0LmMgYi91dGlsLWxpbnV4L2ZkZm9ybWF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVmNjQ0NQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvZmRmb3JtYXQuYwpAQCAtMCwwICsxLDEzNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBmZGZvcm1hdC5jICAtICBMb3ctbGV2ZWwgZm9ybWF0cyBhIGZsb3BweSBkaXNrIC0gV2VybmVyIEFsbWVzYmVyZ2VyCisgKiA1IEp1bHkgMjAwMyAtLSBtb2RpZmllZCBmb3IgQnVzeWJveCBieSBFcmlrIEFuZGVyc2VuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZmRmb3JtYXRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstbl0gREVWSUNFIgorLy91c2FnZTojZGVmaW5lIGZkZm9ybWF0X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRm9ybWF0IGZsb3BweSBkaXNrXG4iCisvL3VzYWdlOiAgICAgIlxuCS1uCURvbid0IHZlcmlmeSBhZnRlciBmb3JtYXQiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisKKy8qIFN0dWZmIGV4dHJhY3RlZCBmcm9tIGxpbnV4L2ZkLmggKi8KK3N0cnVjdCBmbG9wcHlfc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQJc2l6ZSwJCS8qIG5yIG9mIHNlY3RvcnMgdG90YWwgKi8KKwkJCXNlY3QsCQkvKiBzZWN0b3JzIHBlciB0cmFjayAqLworCQkJaGVhZCwJCS8qIG5yIG9mIGhlYWRzICovCisJCQl0cmFjaywJCS8qIG5yIG9mIHRyYWNrcyAqLworCQkJc3RyZXRjaDsJLyogIT0wIG1lYW5zIGRvdWJsZSB0cmFjayBzdGVwcyAqLworI2RlZmluZSBGRF9TVFJFVENIIDEKKyNkZWZpbmUgRkRfU1dBUFNJREVTIDIKKworCXVuc2lnbmVkIGNoYXIJZ2FwLAkJLyogZ2FwMSBzaXplICovCisKKwkJCXJhdGUsCQkvKiBkYXRhIHJhdGUuIHw9IDB4NDAgZm9yIHBlcnBlbmRpY3VsYXIgKi8KKyNkZWZpbmUgRkRfMk0gMHg0CisjZGVmaW5lIEZEX1NJWkVDT0RFTUFTSyAweDM4CisjZGVmaW5lIEZEX1NJWkVDT0RFKGZsb3BweSkgKCgoKChmbG9wcHkpLT5yYXRlJkZEX1NJWkVDT0RFTUFTSyk+PiAzKSsgMikgJTgpCisjZGVmaW5lIEZEX1NFQ1RTSVpFKGZsb3BweSkgKCAoZmxvcHB5KS0+cmF0ZSAmIEZEXzJNID8gXAorCQkJICAgICA1MTIgOiAxMjggPDwgRkRfU0laRUNPREUoZmxvcHB5KSApCisjZGVmaW5lIEZEX1BFUlAgMHg0MAorCisJCQlzcGVjMSwJCS8qIHN0ZXBwaW5nIHJhdGUsIGhlYWQgdW5sb2FkIHRpbWUgKi8KKwkJCWZtdF9nYXA7CS8qIGdhcDIgc2l6ZSAqLworCWNvbnN0IGNoYXIJKiBuYW1lOyAvKiB1c2VkIG9ubHkgZm9yIHByZWRlZmluZWQgZm9ybWF0cyAqLworfTsKK3N0cnVjdCBmb3JtYXRfZGVzY3IgeworCXVuc2lnbmVkIGludCBkZXZpY2UsaGVhZCx0cmFjazsKK307CisjZGVmaW5lIEZERk1UQkVHIF9JTygyLDB4NDcpCisjZGVmaW5lIEZERk1UVFJLIF9JT1coMiwweDQ4LCBzdHJ1Y3QgZm9ybWF0X2Rlc2NyKQorI2RlZmluZSBGREZNVEVORCBfSU8oMiwweDQ5KQorI2RlZmluZSBGREdFVFBSTSBfSU9SKDIsIDB4MDQsIHN0cnVjdCBmbG9wcHlfc3RydWN0KQorI2RlZmluZSBGRF9GSUxMX0JZVEUgMHhGNiAvKiBmb3JtYXQgZmlsbCBieXRlLiAqLworCitpbnQgZmRmb3JtYXRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZkZm9ybWF0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgZmQsIG4sIGN5bCwgcmVhZF9ieXRlcywgdmVyaWZ5OworCXVuc2lnbmVkIGNoYXIgKmRhdGE7CisJc3RydWN0IHN0YXQgc3Q7CisJc3RydWN0IGZsb3BweV9zdHJ1Y3QgcGFyYW07CisJc3RydWN0IGZvcm1hdF9kZXNjciBkZXNjcjsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj0xIjsgLyogbXVzdCBoYXZlIDEgcGFyYW0gKi8KKwl2ZXJpZnkgPSAhZ2V0b3B0MzIoYXJndiwgIm4iKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCXhzdGF0KCphcmd2LCAmc3QpOworCWlmICghU19JU0JMSyhzdC5zdF9tb2RlKSkgeworCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6IG5vdCBhIGJsb2NrIGRldmljZSIsICphcmd2KTsKKwkJLyogZG8gbm90IHRlc3QgbWFqb3IgLSBwZXJoYXBzIHRoaXMgd2FzIGFuIFVTQiBmbG9wcHkgKi8KKwl9CisKKwkvKiBPX1JEV1IgZm9yIGZvcm1hdHRpbmcgYW5kIHZlcmlmeWluZyAqLworCWZkID0geG9wZW4oKmFyZ3YsIE9fUkRXUik7CisKKwkvKiBvcmlnaW5hbCBtZXNzYWdlIHdhczogIkNvdWxkIG5vdCBkZXRlcm1pbmUgY3VycmVudCBmb3JtYXQgdHlwZSIgKi8KKwl4aW9jdGwoZmQsIEZER0VUUFJNLCAmcGFyYW0pOworCisJcHJpbnRmKCIlcy1zaWRlZCwgJXUgdHJhY2tzLCAldSBzZWMvdHJhY2suIFRvdGFsIGNhcGFjaXR5ICVkIGtCXG4iLAorCQkocGFyYW0uaGVhZCA9PSAyKSA/ICJEb3VibGUiIDogIlNpbmdsZSIsCisJCXBhcmFtLnRyYWNrLCBwYXJhbS5zZWN0LCBwYXJhbS5zaXplID4+IDEpOworCisJLyogRk9STUFUICovCisJcHJpbnRmKCJGb3JtYXR0aW5nLi4uICIpOworCXhpb2N0bChmZCwgRkRGTVRCRUcsIE5VTEwpOworCisJLyogbiA9PSB0cmFjayAqLworCWZvciAobiA9IDA7IG4gPCBwYXJhbS50cmFjazsgbisrKSB7CisJCWRlc2NyLmhlYWQgPSAwOworCQlkZXNjci50cmFjayA9IG47CisJCXhpb2N0bChmZCwgRkRGTVRUUkssICZkZXNjcik7CisJCXByaW50ZigiJTNkXGJcYlxiIiwgbik7CisJCWlmIChwYXJhbS5oZWFkID09IDIpIHsKKwkJCWRlc2NyLmhlYWQgPSAxOworCQkJeGlvY3RsKGZkLCBGREZNVFRSSywgJmRlc2NyKTsKKwkJfQorCX0KKworCXhpb2N0bChmZCwgRkRGTVRFTkQsIE5VTEwpOworCXB1dHMoIkRvbmUiKTsKKworCS8qIFZFUklGWSAqLworCWlmICh2ZXJpZnkpIHsKKwkJLyogbiA9PSBjeWxfc2l6ZSAqLworCQluID0gcGFyYW0uc2VjdCpwYXJhbS5oZWFkKjUxMjsKKworCQlkYXRhID0geG1hbGxvYyhuKTsKKwkJcHJpbnRmKCJWZXJpZnlpbmcuLi4gIik7CisJCWZvciAoY3lsID0gMDsgY3lsIDwgcGFyYW0udHJhY2s7IGN5bCsrKSB7CisJCQlwcmludGYoIiUzZFxiXGJcYiIsIGN5bCk7CisJCQlyZWFkX2J5dGVzID0gc2FmZV9yZWFkKGZkLCBkYXRhLCBuKTsKKwkJCWlmIChyZWFkX2J5dGVzICE9IG4pIHsKKwkJCQlpZiAocmVhZF9ieXRlcyA8IDApIHsKKwkJCQkJYmJfcGVycm9yX21zZyhiYl9tc2dfcmVhZF9lcnJvcik7CisJCQkJfQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJwcm9ibGVtIHJlYWRpbmcgY3lsaW5kZXIgJWQsICIKKwkJCQkJImV4cGVjdGVkICVkLCByZWFkICVkIiwgY3lsLCBuLCByZWFkX2J5dGVzKTsKKwkJCQkvLyBGSVhNRTogbWF5YmUgYmV0dGVyIHNlZWsgJiBjb250aW51ZT8/CisJCQl9CisJCQkvKiBDaGVjayBiYWNrd2FyZHMgc28gd2UgZG9uJ3QgbmVlZCBhIGNvdW50ZXIgKi8KKwkJCXdoaWxlICgtLXJlYWRfYnl0ZXMgPj0gMCkgeworCQkJCWlmIChkYXRhW3JlYWRfYnl0ZXNdICE9IEZEX0ZJTExfQllURSkgeworCQkJCQlwcmludGYoImJhZCBkYXRhIGluIGN5bCAlZFxuQ29udGludWluZy4uLiAiLCBjeWwpOworCQkJCX0KKwkJCX0KKwkJfQorCQkvKiBUaGVyZSBpcyBubyBwb2ludCBpbiBmcmVlaW5nIGJsb2NrcyBhdCB0aGUgZW5kIG9mIGEgcHJvZ3JhbSwgYmVjYXVzZQorCQlhbGwgb2YgdGhlIHByb2dyYW0ncyBzcGFjZSBpcyBnaXZlbiBiYWNrIHRvIHRoZSBzeXN0ZW0gd2hlbiB0aGUgcHJvY2VzcworCQl0ZXJtaW5hdGVzLiovCisKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBmcmVlKGRhdGEpOworCisJCXB1dHMoIkRvbmUiKTsKKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGNsb3NlKGZkKTsKKworCS8qIERvbid0IGJvdGhlciBjbG9zaW5nLiAgRXhpdCBkb2VzCisJICogdGhhdCwgc28gd2UgY2FuIHNhdmUgYSBmZXcgYnl0ZXMgKi8KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9mZGlzay5jIGIvdXRpbC1saW51eC9mZGlzay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0OWNlOTUKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L2ZkaXNrLmMKQEAgLTAsMCArMSwzMTIyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIGZkaXNrLmMgLS0gUGFydGl0aW9uIHRhYmxlIG1hbmlwdWxhdG9yIGZvciBMaW51eC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTIgIEEuIFYuIExlIEJsYW5jIChMZUJsYW5jQG1jYy5hYy51aykKKyAqIENvcHlyaWdodCAoQykgMjAwMSwyMDAyIFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4gKGluaXRpYWwgYmIgcG9ydCkKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qIExvb2tzIGxpa2Ugc29tZW9uZSBmb3Jnb3QgdG8gYWRkIHRoaXMgdG8gY29uZmlnIHN5c3RlbSAqLworLy91c2FnZTojaWZuZGVmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX0JMS1NJWkUKKy8vdXNhZ2U6IyBkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfQkxLU0laRSAwCisvL3VzYWdlOiMgZGVmaW5lIElGX0ZFQVRVUkVfRkRJU0tfQkxLU0laRShhKQorLy91c2FnZTojZW5kaWYKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZmRpc2tfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstdWwiIElGX0ZFQVRVUkVfRkRJU0tfQkxLU0laRSgicyIpICJdICIKKy8vdXNhZ2U6ICAgICAgICJbLUMgQ1lMSU5ERVJTXSBbLUggSEVBRFNdIFstUyBTRUNUT1JTXSBbLWIgU1NaXSBESVNLIgorLy91c2FnZTojZGVmaW5lIGZkaXNrX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiQ2hhbmdlIHBhcnRpdGlvbiB0YWJsZVxuIgorLy91c2FnZTogICAgICJcbgktdQkJU3RhcnQgYW5kIEVuZCBhcmUgaW4gc2VjdG9ycyAoaW5zdGVhZCBvZiBjeWxpbmRlcnMpIgorLy91c2FnZTogICAgICJcbgktbAkJU2hvdyBwYXJ0aXRpb24gdGFibGUgZm9yIGVhY2ggRElTSywgdGhlbiBleGl0IgorLy91c2FnZToJSUZfRkVBVFVSRV9GRElTS19CTEtTSVpFKAorLy91c2FnZTogICAgICJcbgktcwkJU2hvdyBwYXJ0aXRpb24gc2l6ZXMgaW4ga2IgZm9yIGVhY2ggRElTSywgdGhlbiBleGl0IgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktYiAyMDQ4CQkoZm9yIGNlcnRhaW4gTU8gZGlza3MpIHVzZSAyMDQ4LWJ5dGUgc2VjdG9ycyIKKy8vdXNhZ2U6ICAgICAiXG4JLUMgQ1lMSU5ERVJTCVNldCBudW1iZXIgb2YgY3lsaW5kZXJzL2hlYWRzL3NlY3RvcnMiCisvL3VzYWdlOiAgICAgIlxuCS1IIEhFQURTIgorLy91c2FnZTogICAgICJcbgktUyBTRUNUT1JTIgorCisjaWZuZGVmIF9MQVJHRUZJTEU2NF9TT1VSQ0UKKy8qIEZvciBsc2VlazY0ICovCisjIGRlZmluZSBfTEFSR0VGSUxFNjRfU09VUkNFCisjZW5kaWYKKyNpbmNsdWRlIDxhc3NlcnQuaD4gICAgICAgICAgICAgLyogYXNzZXJ0ICovCisjaW5jbHVkZSA8c3lzL21vdW50Lmg+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+Ym9vdF9pbmQgPSAwOworCXAtPnN5c19pbmQgPSBzeXNpZDsKKwlzZXRfc3RhcnRfc2VjdChwLCBzdGFydCAtIG9mZnNldCk7CisJc2V0X25yX3NlY3RzKHAsIHN0b3AgLSBzdGFydCArIDEpOworCXNldF9oc2Nfc3RhcnRfZW5kKHAsIHN0YXJ0LCBzdG9wKTsKKwlwdGVzW2ldLmNoYW5nZWQgPSAxOworfQorI2VuZGlmCisKK3N0YXRpYyBpbnQKK3dhcm5fZ2VvbWV0cnkodm9pZCkKK3sKKwlpZiAoZ19oZWFkcyAmJiBnX3NlY3RvcnMgJiYgZ19jeWxpbmRlcnMpCisJCXJldHVybiAwOworCisJcHJpbnRmKCJVbmtub3duIHZhbHVlKHMpIGZvcjoiKTsKKwlpZiAoIWdfaGVhZHMpCisJCXByaW50ZigiIGhlYWRzIik7CisJaWYgKCFnX3NlY3RvcnMpCisJCXByaW50ZigiIHNlY3RvcnMiKTsKKwlpZiAoIWdfY3lsaW5kZXJzKQorCQlwcmludGYoIiBjeWxpbmRlcnMiKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorCXB1dHMoIiAoc2V0dGFibGUgaW4gdGhlIGV4dHJhIGZ1bmN0aW9ucyBtZW51KSIpOworI2Vsc2UKKwliYl9wdXRjaGFyKCdcbicpOworI2VuZGlmCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCit1cGRhdGVfdW5pdHModm9pZCkKK3sKKwlpbnQgY3lsX3VuaXRzID0gZ19oZWFkcyAqIGdfc2VjdG9yczsKKworCWlmIChkaXNwbGF5X2luX2N5bF91bml0cyAmJiBjeWxfdW5pdHMpCisJCXVuaXRzX3Blcl9zZWN0b3IgPSBjeWxfdW5pdHM7CisJZWxzZQorCQl1bml0c19wZXJfc2VjdG9yID0gMTsgICAvKiBpbiBzZWN0b3JzICovCit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorc3RhdGljIHZvaWQKK3dhcm5fY3lsaW5kZXJzKHZvaWQpCit7CisJaWYgKExBQkVMX0lTX0RPUyAmJiBnX2N5bGluZGVycyA+IDEwMjQgJiYgIW5vd2FybikKKwkJcHJpbnRmKCJcbiIKKyJUaGUgbnVtYmVyIG9mIGN5bGluZGVycyBmb3IgdGhpcyBkaXNrIGlzIHNldCB0byAldS5cbiIKKyJUaGVyZSBpcyBub3RoaW5nIHdyb25nIHdpdGggdGhhdCwgYnV0IHRoaXMgaXMgbGFyZ2VyIHRoYW4gMTAyNCxcbiIKKyJhbmQgY291bGQgaW4gY2VydGFpbiBzZXR1cHMgY2F1c2UgcHJvYmxlbXMgd2l0aDpcbiIKKyIxKSBzb2Z0d2FyZSB0aGF0IHJ1bnMgYXQgYm9vdCB0aW1lIChlLmcuLCBvbGQgdmVyc2lvbnMgb2YgTElMTylcbiIKKyIyKSBib290aW5nIGFuZCBwYXJ0aXRpb25pbmcgc29mdHdhcmUgZnJvbSBvdGhlciBPU3NcbiIKKyIgICAoZS5nLiwgRE9TIEZESVNLLCBPUy8yIEZESVNLKVxuIiwKKwkJCWdfY3lsaW5kZXJzKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZAorcmVhZF9leHRlbmRlZChpbnQgZXh0KQoreworCWludCBpOworCXN0cnVjdCBwdGUgKnBleDsKKwlzdHJ1Y3QgcGFydGl0aW9uICpwLCAqcTsKKworCWV4dF9pbmRleCA9IGV4dDsKKwlwZXggPSAmcHRlc1tleHRdOworCXBleC0+ZXh0X3BvaW50ZXIgPSBwZXgtPnBhcnRfdGFibGU7CisKKwlwID0gcGV4LT5wYXJ0X3RhYmxlOworCWlmICghZ2V0X3N0YXJ0X3NlY3QocCkpIHsKKwkJcHV0cygiQmFkIG9mZnNldCBpbiBwcmltYXJ5IGV4dGVuZGVkIHBhcnRpdGlvbiIpOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKElTX0VYVEVOREVEKHAtPnN5c19pbmQpKSB7CisJCXN0cnVjdCBwdGUgKnBlID0gJnB0ZXNbZ19wYXJ0aXRpb25zXTsKKworCQlpZiAoZ19wYXJ0aXRpb25zID49IE1BWElNVU1fUEFSVFMpIHsKKwkJCS8qIFRoaXMgaXMgbm90IGEgTGludXggcmVzdHJpY3Rpb24sIGJ1dAorCQkJICAgdGhpcyBwcm9ncmFtIHVzZXMgYXJyYXlzIG9mIHNpemUgTUFYSU1VTV9QQVJUUy4KKwkJCSAgIERvIG5vdCB0cnkgdG8gJ2ltcHJvdmUnIHRoaXMgdGVzdC4gKi8KKwkJCXN0cnVjdCBwdGUgKnByZSA9ICZwdGVzW2dfcGFydGl0aW9ucyAtIDFdOworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisJCQlwcmludGYoIldhcm5pbmc6IGRlbGV0aW5nIHBhcnRpdGlvbnMgYWZ0ZXIgJXVcbiIsCisJCQkJZ19wYXJ0aXRpb25zKTsKKwkJCXByZS0+Y2hhbmdlZCA9IDE7CisjZW5kaWYKKwkJCWNsZWFyX3BhcnRpdGlvbihwcmUtPmV4dF9wb2ludGVyKTsKKwkJCXJldHVybjsKKwkJfQorCisJCXJlYWRfcHRlKHBlLCBleHRlbmRlZF9vZmZzZXQgKyBnZXRfc3RhcnRfc2VjdChwKSk7CisKKwkJaWYgKCFleHRlbmRlZF9vZmZzZXQpCisJCQlleHRlbmRlZF9vZmZzZXQgPSBnZXRfc3RhcnRfc2VjdChwKTsKKworCQlxID0gcCA9IHB0X29mZnNldChwZS0+c2VjdG9yYnVmZmVyLCAwKTsKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKywgcCsrKSBpZiAoZ2V0X25yX3NlY3RzKHApKSB7CisJCQlpZiAoSVNfRVhURU5ERUQocC0+c3lzX2luZCkpIHsKKwkJCQlpZiAocGUtPmV4dF9wb2ludGVyKQorCQkJCQlwcmludGYoIldhcm5pbmc6IGV4dHJhIGxpbmsgIgorCQkJCQkJInBvaW50ZXIgaW4gcGFydGl0aW9uIHRhYmxlIgorCQkJCQkJIiAldVxuIiwgZ19wYXJ0aXRpb25zICsgMSk7CisJCQkJZWxzZQorCQkJCQlwZS0+ZXh0X3BvaW50ZXIgPSBwOworCQkJfSBlbHNlIGlmIChwLT5zeXNfaW5kKSB7CisJCQkJaWYgKHBlLT5wYXJ0X3RhYmxlKQorCQkJCQlwcmludGYoIldhcm5pbmc6IGlnbm9yaW5nIGV4dHJhICIKKwkJCQkJCSAgImRhdGEgaW4gcGFydGl0aW9uIHRhYmxlIgorCQkJCQkJICAiICV1XG4iLCBnX3BhcnRpdGlvbnMgKyAxKTsKKwkJCQllbHNlCisJCQkJCXBlLT5wYXJ0X3RhYmxlID0gcDsKKwkJCX0KKwkJfQorCisJCS8qIHZlcnkgc3RyYW5nZSBjb2RlIGhlcmUuLi4gKi8KKwkJaWYgKCFwZS0+cGFydF90YWJsZSkgeworCQkJaWYgKHEgIT0gcGUtPmV4dF9wb2ludGVyKQorCQkJCXBlLT5wYXJ0X3RhYmxlID0gcTsKKwkJCWVsc2UKKwkJCQlwZS0+cGFydF90YWJsZSA9IHEgKyAxOworCQl9CisJCWlmICghcGUtPmV4dF9wb2ludGVyKSB7CisJCQlpZiAocSAhPSBwZS0+cGFydF90YWJsZSkKKwkJCQlwZS0+ZXh0X3BvaW50ZXIgPSBxOworCQkJZWxzZQorCQkJCXBlLT5leHRfcG9pbnRlciA9IHEgKyAxOworCQl9CisKKwkJcCA9IHBlLT5leHRfcG9pbnRlcjsKKwkJZ19wYXJ0aXRpb25zKys7CisJfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKwkvKiByZW1vdmUgZW1wdHkgbGlua3MgKi8KKyByZW1vdmU6CisJZm9yIChpID0gNDsgaSA8IGdfcGFydGl0aW9uczsgaSsrKSB7CisJCXN0cnVjdCBwdGUgKnBlID0gJnB0ZXNbaV07CisKKwkJaWYgKCFnZXRfbnJfc2VjdHMocGUtPnBhcnRfdGFibGUpCisJCSAmJiAoZ19wYXJ0aXRpb25zID4gNSB8fCBwdGVzWzRdLnBhcnRfdGFibGUtPnN5c19pbmQpCisJCSkgeworCQkJcHJpbnRmKCJPbWl0dGluZyBlbXB0eSBwYXJ0aXRpb24gKCV1KVxuIiwgaSsxKTsKKwkJCWRlbGV0ZV9wYXJ0aXRpb24oaSk7CisJCQlnb3RvIHJlbW92ZTsgICAgLyogbnVtYmVyaW5nIGNoYW5nZWQgKi8KKwkJfQorCX0KKyNlbmRpZgorfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKK3N0YXRpYyB2b2lkCitjcmVhdGVfZG9zbGFiZWwodm9pZCkKK3sKKwlwcmludGYobXNnX2J1aWxkaW5nX25ld19sYWJlbCwgIkRPUyBkaXNrbGFiZWwiKTsKKworCWN1cnJlbnRfbGFiZWxfdHlwZSA9IExBQkVMX0RPUzsKKyNpZiBFTkFCTEVfRkVBVFVSRV9PU0ZfTEFCRUwKKwlwb3NzaWJseV9vc2ZfbGFiZWwgPSAwOworI2VuZGlmCisJZ19wYXJ0aXRpb25zID0gNDsKKworCW1lbXNldCgmTUJSYnVmZmVyWzUxMCAtIDQqMTZdLCAwLCA0KjE2KTsKKwl3cml0ZV9wYXJ0X3RhYmxlX2ZsYWcoTUJSYnVmZmVyKTsKKwlleHRlbmRlZF9vZmZzZXQgPSAwOworCXNldF9hbGxfdW5jaGFuZ2VkKCk7CisJc2V0X2NoYW5nZWQoMCk7CisJZ2V0X2Jvb3QoQ1JFQVRFX0VNUFRZX0RPUyk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2dldF9zZWN0b3JzaXplKHZvaWQpCit7CisJaWYgKCF1c2VyX3NldF9zZWN0b3Jfc2l6ZSkgeworCQlpbnQgYXJnOworCQlpZiAoaW9jdGwoZGV2X2ZkLCBCTEtTU1pHRVQsICZhcmcpID09IDApCisJCQlzZWN0b3Jfc2l6ZSA9IGFyZzsKKwkJaWYgKHNlY3Rvcl9zaXplICE9IERFRkFVTFRfU0VDVE9SX1NJWkUpCisJCQlwcmludGYoIk5vdGU6IHNlY3RvciBzaXplIGlzICV1ICIKKwkJCQkiKG5vdCAiIERFRkFVTFRfU0VDVE9SX1NJWkVfU1RSICIpXG4iLAorCQkJCXNlY3Rvcl9zaXplKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitnZXRfa2VybmVsX2dlb21ldHJ5KHZvaWQpCit7CisJc3RydWN0IGhkX2dlb21ldHJ5IGdlb21ldHJ5OworCisJaWYgKCFpb2N0bChkZXZfZmQsIEhESU9fR0VUR0VPLCAmZ2VvbWV0cnkpKSB7CisJCWtlcm5faGVhZHMgPSBnZW9tZXRyeS5oZWFkczsKKwkJa2Vybl9zZWN0b3JzID0gZ2VvbWV0cnkuc2VjdG9yczsKKwkJLyogbmV2ZXIgdXNlIGdlb21ldHJ5LmN5bGluZGVycyAtIGl0IGlzIHRydW5jYXRlZCAqLworCX0KK30KKworc3RhdGljIHZvaWQKK2dldF9wYXJ0aXRpb25fdGFibGVfZ2VvbWV0cnkodm9pZCkKK3sKKwljb25zdCB1bnNpZ25lZCBjaGFyICpidWZwID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKilNQlJidWZmZXI7CisJc3RydWN0IHBhcnRpdGlvbiAqcDsKKwlpbnQgaSwgaCwgcywgaGgsIHNzOworCWludCBmaXJzdCA9IDE7CisJaW50IGJhZCA9IDA7CisKKwlpZiAoISh2YWxpZF9wYXJ0X3RhYmxlX2ZsYWcoKGNoYXIqKWJ1ZnApKSkKKwkJcmV0dXJuOworCisJaGggPSBzcyA9IDA7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlwID0gcHRfb2Zmc2V0KGJ1ZnAsIGkpOworCQlpZiAocC0+c3lzX2luZCAhPSAwKSB7CisJCQloID0gcC0+ZW5kX2hlYWQgKyAxOworCQkJcyA9IChwLT5lbmRfc2VjdG9yICYgMDc3KTsKKwkJCWlmIChmaXJzdCkgeworCQkJCWhoID0gaDsKKwkJCQlzcyA9IHM7CisJCQkJZmlyc3QgPSAwOworCQkJfSBlbHNlIGlmIChoaCAhPSBoIHx8IHNzICE9IHMpCisJCQkJYmFkID0gMTsKKwkJfQorCX0KKworCWlmICghZmlyc3QgJiYgIWJhZCkgeworCQlwdF9oZWFkcyA9IGhoOworCQlwdF9zZWN0b3JzID0gc3M7CisJfQorfQorCitzdGF0aWMgdm9pZAorZ2V0X2dlb21ldHJ5KHZvaWQpCit7CisJaW50IHNlY19mYWM7CisKKwlnZXRfc2VjdG9yc2l6ZSgpOworCXNlY19mYWMgPSBzZWN0b3Jfc2l6ZSAvIDUxMjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9TVU5fTEFCRUwKKwlndWVzc19kZXZpY2VfdHlwZSgpOworI2VuZGlmCisJZ19oZWFkcyA9IGdfY3lsaW5kZXJzID0gZ19zZWN0b3JzID0gMDsKKwlrZXJuX2hlYWRzID0ga2Vybl9zZWN0b3JzID0gMDsKKwlwdF9oZWFkcyA9IHB0X3NlY3RvcnMgPSAwOworCisJZ2V0X2tlcm5lbF9nZW9tZXRyeSgpOworCWdldF9wYXJ0aXRpb25fdGFibGVfZ2VvbWV0cnkoKTsKKworCWdfaGVhZHMgPSB1c2VyX2hlYWRzID8gdXNlcl9oZWFkcyA6CisJCXB0X2hlYWRzID8gcHRfaGVhZHMgOgorCQlrZXJuX2hlYWRzID8ga2Vybl9oZWFkcyA6IDI1NTsKKwlnX3NlY3RvcnMgPSB1c2VyX3NlY3RvcnMgPyB1c2VyX3NlY3RvcnMgOgorCQlwdF9zZWN0b3JzID8gcHRfc2VjdG9ycyA6CisJCWtlcm5fc2VjdG9ycyA/IGtlcm5fc2VjdG9ycyA6IDYzOworCXRvdGFsX251bWJlcl9vZl9zZWN0b3JzID0gYmJfQkxLR0VUU0laRV9zZWN0b3JzKGRldl9mZCk7CisKKwlzZWN0b3Jfb2Zmc2V0ID0gMTsKKwlpZiAoZG9zX2NvbXBhdGlibGVfZmxhZykKKwkJc2VjdG9yX29mZnNldCA9IGdfc2VjdG9yczsKKworCWdfY3lsaW5kZXJzID0gdG90YWxfbnVtYmVyX29mX3NlY3RvcnMgLyAoZ19oZWFkcyAqIGdfc2VjdG9ycyAqIHNlY19mYWMpOworCWlmICghZ19jeWxpbmRlcnMpCisJCWdfY3lsaW5kZXJzID0gdXNlcl9jeWxpbmRlcnM7Cit9CisKKy8qCisgKiBPcGVucyBkaXNrX2RldmljZSBhbmQgb3B0aW9uYWxseSByZWFkcyBNQlIuCisgKiAgICBJZiB3aGF0ID09IE9QRU5fTUFJTjoKKyAqICAgICAgT3BlbiBkZXZpY2UsIHJlYWQgTUJSLiAgQWJvcnQgcHJvZ3JhbSBvbiBzaG9ydCByZWFkLiAgQ3JlYXRlIGVtcHR5CisgKiAgICAgIGRpc2tsYWJlbCBpZiB0aGUgb24tZGlzayBzdHJ1Y3R1cmUgaXMgaW52YWxpZCAoV1JJVEFCTEUgbW9kZSkuCisgKiAgICBJZiB3aGF0ID09IFRSWV9PTkxZOgorICogICAgICBPcGVuIGRldmljZSwgcmVhZCBNQlIuICBSZXR1cm4gYW4gZXJyb3IgaWYgYW55dGhpbmcgaXMgb3V0IG9mIHBsYWNlLgorICogICAgICBEbyBub3QgY3JlYXRlIGFuIGVtcHR5IGRpc2tsYWJlbC4gIFRoaXMgaXMgdXNlZCBmb3IgdGhlICJsaXN0IgorICogICAgICBvcGVyYXRpb25zOiAiZmRpc2sgLWwgL2Rldi9zZGEiIGFuZCAiZmRpc2sgLWwiIChhbGwgZGV2aWNlcykuCisgKiAgICBJZiB3aGF0ID09IENSRUFURV9FTVBUWV8qOgorICogICAgICBUaGlzIG1lYW5zIHRoYXQgZ2V0X2Jvb3QoKSB3YXMgY2FsbGVkIHJlY3Vyc2l2ZWx5IGZyb20gY3JlYXRlXypsYWJlbCgpLgorICogICAgICBEbyBub3QgcmUtb3BlbiB0aGUgZGV2aWNlOyBqdXN0IHNldCB1cCB0aGUgcHRlcyBhcnJheSBhbmQgcHJpbnQKKyAqICAgICAgZ2VvbWV0cnkgd2FybmluZ3MuCisgKgorICogUmV0dXJuczoKKyAqICAgLTE6IG5vIDB4YWE1NSBmbGFnIHByZXNlbnQgKHBvc3NpYmx5IGVudGlyZSBkaXNrIEJTRCkKKyAqICAgIDA6IGZvdW5kIG9yIGNyZWF0ZWQgbGFiZWwKKyAqICAgIDE6IEkvTyBlcnJvcgorICovCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1VOX0xBQkVMIHx8IEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCitzdGF0aWMgaW50IGdldF9ib290KGVudW0gYWN0aW9uIHdoYXQpCisjZWxzZQorc3RhdGljIGludCBnZXRfYm9vdCh2b2lkKQorI2RlZmluZSBnZXRfYm9vdCh3aGF0KSBnZXRfYm9vdCgpCisjZW5kaWYKK3sKKwlpbnQgaSwgZmQ7CisKKwlnX3BhcnRpdGlvbnMgPSA0OworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJc3RydWN0IHB0ZSAqcGUgPSAmcHRlc1tpXTsKKwkJcGUtPnBhcnRfdGFibGUgPSBwdF9vZmZzZXQoTUJSYnVmZmVyLCBpKTsKKwkJcGUtPmV4dF9wb2ludGVyID0gTlVMTDsKKwkJcGUtPm9mZnNldF9mcm9tX2Rldl9zdGFydCA9IDA7CisJCXBlLT5zZWN0b3JidWZmZXIgPSBNQlJidWZmZXI7CisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKwkJcGUtPmNoYW5nZWQgPSAod2hhdCA9PSBDUkVBVEVfRU1QVFlfRE9TKTsKKyNlbmRpZgorCX0KKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisvLyBBTEVSVCEgaGlnaGx5IGlkaW90aWMgZGVzaWduIQorLy8gV2UgZW5kIHVwIGhlcmUgd2hlbiB3ZSBjYWxsIGdldF9ib290KCkgcmVjdXJzaXZlbHkKKy8vIHZpYSBnZXRfYm9vdCgpIFt0YWJsZSBpcyBiYWRdIC0+IGNyZWF0ZV9kb3NsYWJlbCgpIC0+IGdldF9ib290KENSRUFURV9FTVBUWV9ET1MpLgorLy8gb3IgZ2V0X2Jvb3QoKSBbdGFibGUgaXMgYmFkXSAtPiBjcmVhdGVfc3VubGFiZWwoKSAtPiBnZXRfYm9vdChDUkVBVEVfRU1QVFlfU1VOKS4KKy8vIChqdXN0IGZhY3RvciBvdXQgcmUtaW5pdCBvZiBwdGVzWzAsMSwyLDNdIGluIGEgc2VwYXJhdGUgZm4gaW5zdGVhZD8pCisvLyBTbyBza2lwIG9wZW5pbmcgZGV2aWNlIF9hZ2Fpbl8uLi4KKwlpZiAod2hhdCA9PSBDUkVBVEVfRU1QVFlfRE9TICBJRl9GRUFUVVJFX1NVTl9MQUJFTCh8fCB3aGF0ID09IENSRUFURV9FTVBUWV9TVU4pKQorCQlnb3RvIGNyZWF0ZWRfdGFibGU7CisKKwlmZCA9IG9wZW4oZGlza19kZXZpY2UsIChvcHRpb25fbWFzazMyICYgT1BUX2wpID8gT19SRE9OTFkgOiBPX1JEV1IpOworCisJaWYgKGZkIDwgMCkgeworCQlmZCA9IG9wZW4oZGlza19kZXZpY2UsIE9fUkRPTkxZKTsKKwkJaWYgKGZkIDwgMCkgeworCQkJaWYgKHdoYXQgPT0gVFJZX09OTFkpCisJCQkJcmV0dXJuIDE7CisJCQlmZGlza19mYXRhbCh1bmFibGVfdG9fb3Blbik7CisJCX0KKwkJcHJpbnRmKCInJXMnIGlzIG9wZW5lZCBmb3IgcmVhZCBvbmx5XG4iLCBkaXNrX2RldmljZSk7CisJfQorCXhtb3ZlX2ZkKGZkLCBkZXZfZmQpOworCWlmICg1MTIgIT0gZnVsbF9yZWFkKGRldl9mZCwgTUJSYnVmZmVyLCA1MTIpKSB7CisJCWlmICh3aGF0ID09IFRSWV9PTkxZKSB7CisJCQljbG9zZV9kZXZfZmQoKTsKKwkJCXJldHVybiAxOworCQl9CisJCWZkaXNrX2ZhdGFsKHVuYWJsZV90b19yZWFkKTsKKwl9CisjZWxzZQorCWZkID0gb3BlbihkaXNrX2RldmljZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApCisJCXJldHVybiAxOworCWlmICg1MTIgIT0gZnVsbF9yZWFkKGZkLCBNQlJidWZmZXIsIDUxMikpIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gMTsKKwl9CisJeG1vdmVfZmQoZmQsIGRldl9mZCk7CisjZW5kaWYKKworCWdldF9nZW9tZXRyeSgpOworCXVwZGF0ZV91bml0cygpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1VOX0xBQkVMCisJaWYgKGNoZWNrX3N1bl9sYWJlbCgpKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1NHSV9MQUJFTAorCWlmIChjaGVja19zZ2lfbGFiZWwoKSkKKwkJcmV0dXJuIDA7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9BSVhfTEFCRUwKKwlpZiAoY2hlY2tfYWl4X2xhYmVsKCkpCisJCXJldHVybiAwOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfR1BUX0xBQkVMCisJaWYgKGNoZWNrX2dwdF9sYWJlbCgpKQorCQlyZXR1cm4gMDsKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX09TRl9MQUJFTAorCWlmIChjaGVja19vc2ZfbGFiZWwoKSkgeworCQlwb3NzaWJseV9vc2ZfbGFiZWwgPSAxOworCQlpZiAoIXZhbGlkX3BhcnRfdGFibGVfZmxhZyhNQlJidWZmZXIpKSB7CisJCQljdXJyZW50X2xhYmVsX3R5cGUgPSBMQUJFTF9PU0Y7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlwdXRzKCJUaGlzIGRpc2sgaGFzIGJvdGggRE9TIGFuZCBCU0QgbWFnaWMuXG4iCisJCSAgICAgIkdpdmUgdGhlICdiJyBjb21tYW5kIHRvIGdvIHRvIEJTRCBtb2RlLiIpOworCX0KKyNlbmRpZgorCisjaWYgIUVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisJaWYgKCF2YWxpZF9wYXJ0X3RhYmxlX2ZsYWcoTUJSYnVmZmVyKSkKKwkJcmV0dXJuIC0xOworI2Vsc2UKKwlpZiAoIXZhbGlkX3BhcnRfdGFibGVfZmxhZyhNQlJidWZmZXIpKSB7CisJCWlmICh3aGF0ID09IE9QRU5fTUFJTikgeworCQkJcHV0cygiRGV2aWNlIGNvbnRhaW5zIG5laXRoZXIgYSB2YWxpZCBET1MgIgorCQkJICAgICAicGFydGl0aW9uIHRhYmxlLCBub3IgU3VuLCBTR0ksIE9TRiBvciBHUFQgIgorCQkJICAgICAiZGlza2xhYmVsIik7CisjaWZkZWYgX19zcGFyY19fCisJCQlJRl9GRUFUVVJFX1NVTl9MQUJFTChjcmVhdGVfc3VubGFiZWwoKTspCisjZWxzZQorCQkJY3JlYXRlX2Rvc2xhYmVsKCk7CisjZW5kaWYKKwkJCXJldHVybiAwOworCQl9CisJCS8qIFRSWV9PTkxZOiAqLworCQlyZXR1cm4gLTE7CisJfQorIGNyZWF0ZWRfdGFibGU6CisjZW5kaWYgLyogRkVBVFVSRV9GRElTS19XUklUQUJMRSAqLworCisKKwlJRl9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFKHdhcm5fY3lsaW5kZXJzKCk7KQorCXdhcm5fZ2VvbWV0cnkoKTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKElTX0VYVEVOREVEKHB0ZXNbaV0ucGFydF90YWJsZS0+c3lzX2luZCkpIHsKKwkJCWlmIChnX3BhcnRpdGlvbnMgIT0gNCkKKwkJCQlwcmludGYoIklnbm9yaW5nIGV4dHJhIGV4dGVuZGVkICIKKwkJCQkJInBhcnRpdGlvbiAldVxuIiwgaSArIDEpOworCQkJZWxzZQorCQkJCXJlYWRfZXh0ZW5kZWQoaSk7CisJCX0KKwl9CisKKwlmb3IgKGkgPSAzOyBpIDwgZ19wYXJ0aXRpb25zOyBpKyspIHsKKwkJc3RydWN0IHB0ZSAqcGUgPSAmcHRlc1tpXTsKKwkJaWYgKCF2YWxpZF9wYXJ0X3RhYmxlX2ZsYWcocGUtPnNlY3RvcmJ1ZmZlcikpIHsKKwkJCXByaW50ZigiV2FybmluZzogaW52YWxpZCBmbGFnIDB4JTAyeCwweCUwMnggb2YgcGFydGl0aW9uICIKKwkJCQkidGFibGUgJXUgd2lsbCBiZSBjb3JyZWN0ZWQgYnkgdyhyaXRlKVxuIiwKKwkJCQlwZS0+c2VjdG9yYnVmZmVyWzUxMF0sCisJCQkJcGUtPnNlY3RvcmJ1ZmZlcls1MTFdLAorCQkJCWkgKyAxKTsKKwkJCUlGX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUocGUtPmNoYW5nZWQgPSAxOykKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfV1JJVEFCTEUKKy8qCisgKiBQcmludCB0aGUgbWVzc2FnZSBNRVNHLCB0aGVuIHJlYWQgYW4gaW50ZWdlciBiZXR3ZWVuIExPVyBhbmQgSElHSCAoaW5jbHVzaXZlKS4KKyAqIElmIHRoZSB1c2VyIGhpdHMgRW50ZXIsIERGTFQgaXMgcmV0dXJuZWQuCisgKiBBbnN3ZXJzIGxpa2UgKzEwIGFyZSBpbnRlcnByZXRlZCBhcyBvZmZzZXRzIGZyb20gQkFTRS4KKyAqCisgKiBUaGVyZSBpcyBubyBkZWZhdWx0IGlmIERGTFQgaXMgbm90IGJldHdlZW4gTE9XIGFuZCBISUdILgorICovCitzdGF0aWMgc2VjdG9yX3QKK3JlYWRfaW50KHNlY3Rvcl90IGxvdywgc2VjdG9yX3QgZGZsdCwgc2VjdG9yX3QgaGlnaCwgc2VjdG9yX3QgYmFzZSwgY29uc3QgY2hhciAqbWVzZykKK3sKKwlzZWN0b3JfdCB2YWx1ZTsKKwlpbnQgZGVmYXVsdF9vayA9IDE7CisJY29uc3QgY2hhciAqZm10ID0gIiVzICgldS0ldSwgZGVmYXVsdCAldSk6ICI7CisKKwlpZiAoZGZsdCA8IGxvdyB8fCBkZmx0ID4gaGlnaCkgeworCQlmbXQgPSAiJXMgKCV1LSV1KTogIjsKKwkJZGVmYXVsdF9vayA9IDA7CisJfQorCisJd2hpbGUgKDEpIHsKKwkJaW50IHVzZV9kZWZhdWx0ID0gZGVmYXVsdF9vazsKKworCQkvKiBhc2sgcXVlc3Rpb24gYW5kIHJlYWQgYW5zd2VyICovCisJCWRvIHsKKwkJCXByaW50ZihmbXQsIG1lc2csIGxvdywgaGlnaCwgZGZsdCk7CisJCQlyZWFkX21heWJlX2VtcHR5KCIiKTsKKwkJfSB3aGlsZSAoKmxpbmVfcHRyICE9ICdcbicgJiYgIWlzZGlnaXQoKmxpbmVfcHRyKQorCQkgJiYgKmxpbmVfcHRyICE9ICctJyAmJiAqbGluZV9wdHIgIT0gJysnKTsKKworCQlpZiAoKmxpbmVfcHRyID09ICcrJyB8fCAqbGluZV9wdHIgPT0gJy0nKSB7CisJCQlpbnQgbWludXMgPSAoKmxpbmVfcHRyID09ICctJyk7CisJCQlpbnQgYWJzb2x1dGUgPSAwOworCisJCQl2YWx1ZSA9IGF0b2kobGluZV9wdHIgKyAxKTsKKworCQkJLyogKDEpIGlmIDJuZCBjaGFyIGlzIGRpZ2l0LCB1c2VfZGVmYXVsdCA9IDAuCisJCQkgKiAoMikgbW92ZSBsaW5lX3B0ciB0byBmaXJzdCBub24tZGlnaXQuICovCisJCQl3aGlsZSAoaXNkaWdpdCgqKytsaW5lX3B0cikpCisJCQkJdXNlX2RlZmF1bHQgPSAwOworCisJCQlzd2l0Y2ggKCpsaW5lX3B0cikgeworCQkJY2FzZSAnYyc6CisJCQljYXNlICdDJzoKKwkJCQlpZiAoIWRpc3BsYXlfaW5fY3lsX3VuaXRzKQorCQkJCQl2YWx1ZSAqPSBnX2hlYWRzICogZ19zZWN0b3JzOworCQkJCWJyZWFrOworCQkJY2FzZSAnSyc6CisJCQkJYWJzb2x1dGUgPSAxMDI0OworCQkJCWJyZWFrOworCQkJY2FzZSAnayc6CisJCQkJYWJzb2x1dGUgPSAxMDAwOworCQkJCWJyZWFrOworCQkJY2FzZSAnbSc6CisJCQljYXNlICdNJzoKKwkJCQlhYnNvbHV0ZSA9IDEwMDAwMDA7CisJCQkJYnJlYWs7CisJCQljYXNlICdnJzoKKwkJCWNhc2UgJ0cnOgorCQkJCWFic29sdXRlID0gMTAwMDAwMDAwMDsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAoYWJzb2x1dGUpIHsKKwkJCQl1bGxvbmcgYnl0ZXM7CisJCQkJdW5zaWduZWQgbG9uZyB1bml0OworCisJCQkJYnl0ZXMgPSAodWxsb25nKSB2YWx1ZSAqIGFic29sdXRlOworCQkJCXVuaXQgPSBzZWN0b3Jfc2l6ZSAqIHVuaXRzX3Blcl9zZWN0b3I7CisJCQkJYnl0ZXMgKz0gdW5pdC8yOyAvKiByb3VuZCAqLworCQkJCWJ5dGVzIC89IHVuaXQ7CisJCQkJdmFsdWUgPSBieXRlczsKKwkJCX0KKwkJCWlmIChtaW51cykKKwkJCQl2YWx1ZSA9IC12YWx1ZTsKKwkJCXZhbHVlICs9IGJhc2U7CisJCX0gZWxzZSB7CisJCQl2YWx1ZSA9IGF0b2kobGluZV9wdHIpOworCQkJd2hpbGUgKGlzZGlnaXQoKmxpbmVfcHRyKSkgeworCQkJCWxpbmVfcHRyKys7CisJCQkJdXNlX2RlZmF1bHQgPSAwOworCQkJfQorCQl9CisJCWlmICh1c2VfZGVmYXVsdCkgeworCQkJdmFsdWUgPSBkZmx0OworCQkJcHJpbnRmKCJVc2luZyBkZWZhdWx0IHZhbHVlICV1XG4iLCB2YWx1ZSk7CisJCX0KKwkJaWYgKHZhbHVlID49IGxvdyAmJiB2YWx1ZSA8PSBoaWdoKQorCQkJYnJlYWs7CisJCXB1dHMoIlZhbHVlIGlzIG91dCBvZiByYW5nZSIpOworCX0KKwlyZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB1bnNpZ25lZAorZ2V0X3BhcnRpdGlvbihpbnQgd2FybiwgdW5zaWduZWQgbWF4KQoreworCXN0cnVjdCBwdGUgKnBlOworCXVuc2lnbmVkIGk7CisKKwlpID0gcmVhZF9pbnQoMSwgMCwgbWF4LCAwLCAiUGFydGl0aW9uIG51bWJlciIpIC0gMTsKKwlwZSA9ICZwdGVzW2ldOworCisJaWYgKHdhcm4pIHsKKwkJaWYgKCghTEFCRUxfSVNfU1VOICYmICFMQUJFTF9JU19TR0kgJiYgIXBlLT5wYXJ0X3RhYmxlLT5zeXNfaW5kKQorCQkgfHwgKExBQkVMX0lTX1NVTiAmJiAoIXN1bmxhYmVsLT5wYXJ0aXRpb25zW2ldLm51bV9zZWN0b3JzIHx8ICFzdW5sYWJlbC0+aW5mb3NbaV0uaWQpKQorCQkgfHwgKExBQkVMX0lTX1NHSSAmJiAhc2dpX2dldF9udW1fc2VjdG9ycyhpKSkKKwkJKSB7CisJCQlwcmludGYoIldhcm5pbmc6IHBhcnRpdGlvbiAldSBoYXMgZW1wdHkgdHlwZVxuIiwgaSsxKTsKKwkJfQorCX0KKwlyZXR1cm4gaTsKK30KKworc3RhdGljIGludAorZ2V0X2V4aXN0aW5nX3BhcnRpdGlvbihpbnQgd2FybiwgdW5zaWduZWQgbWF4KQoreworCWludCBwbm8gPSAtMTsKKwl1bnNpZ25lZCBpOworCisJZm9yIChpID0gMDsgaSA8IG1heDsgaSsrKSB7CisJCXN0cnVjdCBwdGUgKnBlID0gJnB0ZXNbaV07CisJCXN0cnVjdCBwYXJ0aXRpb24gKnAgPSBwZS0+cGFydF90YWJsZTsKKworCQlpZiAocCAmJiAhaXNfY2xlYXJlZF9wYXJ0aXRpb24ocCkpIHsKKwkJCWlmIChwbm8gPj0gMCkKKwkJCQlnb3RvIG5vdF91bmlxdWU7CisJCQlwbm8gPSBpOworCQl9CisJfQorCWlmIChwbm8gPj0gMCkgeworCQlwcmludGYoIlNlbGVjdGVkIHBhcnRpdGlvbiAldVxuIiwgcG5vKzEpOworCQlyZXR1cm4gcG5vOworCX0KKwlwdXRzKCJObyBwYXJ0aXRpb24gaXMgZGVmaW5lZCB5ZXQhIik7CisJcmV0dXJuIC0xOworCisgbm90X3VuaXF1ZToKKwlyZXR1cm4gZ2V0X3BhcnRpdGlvbih3YXJuLCBtYXgpOworfQorCitzdGF0aWMgaW50CitnZXRfbm9uZXhpc3RpbmdfcGFydGl0aW9uKGludCB3YXJuLCB1bnNpZ25lZCBtYXgpCit7CisJaW50IHBubyA9IC0xOworCXVuc2lnbmVkIGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWF4OyBpKyspIHsKKwkJc3RydWN0IHB0ZSAqcGUgPSAmcHRlc1tpXTsKKwkJc3RydWN0IHBhcnRpdGlvbiAqcCA9IHBlLT5wYXJ0X3RhYmxlOworCisJCWlmIChwICYmIGlzX2NsZWFyZWRfcGFydGl0aW9uKHApKSB7CisJCQlpZiAocG5vID49IDApCisJCQkJZ290byBub3RfdW5pcXVlOworCQkJcG5vID0gaTsKKwkJfQorCX0KKwlpZiAocG5vID49IDApIHsKKwkJcHJpbnRmKCJTZWxlY3RlZCBwYXJ0aXRpb24gJXVcbiIsIHBubysxKTsKKwkJcmV0dXJuIHBubzsKKwl9CisJcHV0cygiQWxsIHByaW1hcnkgcGFydGl0aW9ucyBoYXZlIGJlZW4gZGVmaW5lZCBhbHJlYWR5ISIpOworCXJldHVybiAtMTsKKworIG5vdF91bmlxdWU6CisJcmV0dXJuIGdldF9wYXJ0aXRpb24od2FybiwgbWF4KTsKK30KKworCitzdGF0aWMgdm9pZAorY2hhbmdlX3VuaXRzKHZvaWQpCit7CisJZGlzcGxheV9pbl9jeWxfdW5pdHMgPSAhZGlzcGxheV9pbl9jeWxfdW5pdHM7CisJdXBkYXRlX3VuaXRzKCk7CisJcHJpbnRmKCJDaGFuZ2luZyBkaXNwbGF5L2VudHJ5IHVuaXRzIHRvICVzXG4iLAorCQlzdHJfdW5pdHMoUExVUkFMKSk7Cit9CisKK3N0YXRpYyB2b2lkCit0b2dnbGVfYWN0aXZlKGludCBpKQoreworCXN0cnVjdCBwdGUgKnBlID0gJnB0ZXNbaV07CisJc3RydWN0IHBhcnRpdGlvbiAqcCA9IHBlLT5wYXJ0X3RhYmxlOworCisJaWYgKElTX0VYVEVOREVEKHAtPnN5c19pbmQpICYmICFwLT5ib290X2luZCkKKwkJcHJpbnRmKCJXQVJOSU5HOiBQYXJ0aXRpb24gJXUgaXMgYW4gZXh0ZW5kZWQgcGFydGl0aW9uXG4iLCBpICsgMSk7CisJcC0+Ym9vdF9pbmQgPSAocC0+Ym9vdF9pbmQgPyAwIDogQUNUSVZFX0ZMQUcpOworCXBlLT5jaGFuZ2VkID0gMTsKK30KKworc3RhdGljIHZvaWQKK3RvZ2dsZV9kb3NfY29tcGF0aWJpbGl0eV9mbGFnKHZvaWQpCit7CisJZG9zX2NvbXBhdGlibGVfZmxhZyA9IDEgLSBkb3NfY29tcGF0aWJsZV9mbGFnOworCWlmIChkb3NfY29tcGF0aWJsZV9mbGFnKSB7CisJCXNlY3Rvcl9vZmZzZXQgPSBnX3NlY3RvcnM7CisJCXByaW50ZigiRE9TIENvbXBhdGliaWxpdHkgZmxhZyBpcyAlc3NldFxuIiwgIiIpOworCX0gZWxzZSB7CisJCXNlY3Rvcl9vZmZzZXQgPSAxOworCQlwcmludGYoIkRPUyBDb21wYXRpYmlsaXR5IGZsYWcgaXMgJXNzZXRcbiIsICJub3QgIik7CisJfQorfQorCitzdGF0aWMgdm9pZAorZGVsZXRlX3BhcnRpdGlvbihpbnQgaSkKK3sKKwlzdHJ1Y3QgcHRlICpwZSA9ICZwdGVzW2ldOworCXN0cnVjdCBwYXJ0aXRpb24gKnAgPSBwZS0+cGFydF90YWJsZTsKKwlzdHJ1Y3QgcGFydGl0aW9uICpxID0gcGUtPmV4dF9wb2ludGVyOworCisvKiBOb3RlIHRoYXQgZm9yIHRoZSBmaWZ0aCBwYXJ0aXRpb24gKGkgPT0gNCkgd2UgZG9uJ3QgYWN0dWFsbHkKKyAqIGRlY3JlbWVudCBwYXJ0aXRpb25zLgorICovCisKKwlpZiAod2Fybl9nZW9tZXRyeSgpKQorCQlyZXR1cm47ICAgICAgICAgLyogQy9IL1Mgbm90IHNldCAqLworCXBlLT5jaGFuZ2VkID0gMTsKKworCWlmIChMQUJFTF9JU19TVU4pIHsKKwkJc3VuX2RlbGV0ZV9wYXJ0aXRpb24oaSk7CisJCXJldHVybjsKKwl9CisJaWYgKExBQkVMX0lTX1NHSSkgeworCQlzZ2lfZGVsZXRlX3BhcnRpdGlvbihpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChpIDwgNCkgeworCQlpZiAoSVNfRVhURU5ERUQocC0+c3lzX2luZCkgJiYgaSA9PSBleHRfaW5kZXgpIHsKKwkJCWdfcGFydGl0aW9ucyA9IDQ7CisJCQlwdGVzW2V4dF9pbmRleF0uZXh0X3BvaW50ZXIgPSBOVUxMOworCQkJZXh0ZW5kZWRfb2Zmc2V0ID0gMDsKKwkJfQorCQljbGVhcl9wYXJ0aXRpb24ocCk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIXEtPnN5c19pbmQgJiYgaSA+IDQpIHsKKwkJLyogdGhlIGxhc3Qgb25lIGluIHRoZSBjaGFpbiAtIGp1c3QgZGVsZXRlICovCisJCS0tZ19wYXJ0aXRpb25zOworCQktLWk7CisJCWNsZWFyX3BhcnRpdGlvbihwdGVzW2ldLmV4dF9wb2ludGVyKTsKKwkJcHRlc1tpXS5jaGFuZ2VkID0gMTsKKwl9IGVsc2UgeworCQkvKiBub3QgdGhlIGxhc3Qgb25lIC0gZnVydGhlciBvbmVzIHdpbGwgYmUgbW92ZWQgZG93biAqLworCQlpZiAoaSA+IDQpIHsKKwkJCS8qIGRlbGV0ZSB0aGlzIGxpbmsgaW4gdGhlIGNoYWluICovCisJCQlwID0gcHRlc1tpLTFdLmV4dF9wb2ludGVyOworCQkJKnAgPSAqcTsKKwkJCXNldF9zdGFydF9zZWN0KHAsIGdldF9zdGFydF9zZWN0KHEpKTsKKwkJCXNldF9ucl9zZWN0cyhwLCBnZXRfbnJfc2VjdHMocSkpOworCQkJcHRlc1tpLTFdLmNoYW5nZWQgPSAxOworCQl9IGVsc2UgaWYgKGdfcGFydGl0aW9ucyA+IDUpIHsgICAgLyogNSB3aWxsIGJlIG1vdmVkIHRvIDQgKi8KKwkJCS8qIHRoZSBmaXJzdCBsb2dpY2FsIGluIGEgbG9uZ2VyIGNoYWluICovCisJCQlwZSA9ICZwdGVzWzVdOworCisJCQlpZiAocGUtPnBhcnRfdGFibGUpIC8qIHByZXZlbnQgU0VHRkFVTFQgKi8KKwkJCQlzZXRfc3RhcnRfc2VjdChwZS0+cGFydF90YWJsZSwKKwkJCQkJCWdldF9wYXJ0aXRpb25fc3RhcnRfZnJvbV9kZXZfc3RhcnQocGUpIC0KKwkJCQkJCWV4dGVuZGVkX29mZnNldCk7CisJCQlwZS0+b2Zmc2V0X2Zyb21fZGV2X3N0YXJ0ID0gZXh0ZW5kZWRfb2Zmc2V0OworCQkJcGUtPmNoYW5nZWQgPSAxOworCQl9CisKKwkJaWYgKGdfcGFydGl0aW9ucyA+IDUpIHsKKwkJCWdfcGFydGl0aW9ucy0tOworCQkJd2hpbGUgKGkgPCBnX3BhcnRpdGlvbnMpIHsKKwkJCQlwdGVzW2ldID0gcHRlc1tpKzFdOworCQkJCWkrKzsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8qIHRoZSBvbmx5IGxvZ2ljYWw6IGNsZWFyIG9ubHkgKi8KKwkJCWNsZWFyX3BhcnRpdGlvbihwdGVzW2ldLnBhcnRfdGFibGUpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorY2hhbmdlX3N5c2lkKHZvaWQpCit7CisJaW50IGksIHN5cywgb3JpZ3N5czsKKwlzdHJ1Y3QgcGFydGl0aW9uICpwOworCisJLyogSWYgc2dpX2xhYmVsIHRoZW4gZG9uJ3QgdXNlIGdldF9leGlzdGluZ19wYXJ0aXRpb24sCisJICAgbGV0IHRoZSB1c2VyIHNlbGVjdCBhIHBhcnRpdGlvbiwgc2luY2UgZ2V0X2V4aXN0aW5nX3BhcnRpdGlvbigpCisJICAgb25seSB3b3JrcyBmb3IgTGludXggbGlrZSBwYXJ0aXRpb24gdGFibGVzLiAqLworCWlmICghTEFCRUxfSVNfU0dJKSB7CisJCWkgPSBnZXRfZXhpc3RpbmdfcGFydGl0aW9uKDAsIGdfcGFydGl0aW9ucyk7CisJfSBlbHNlIHsKKwkJaSA9IGdldF9wYXJ0aXRpb24oMCwgZ19wYXJ0aXRpb25zKTsKKwl9CisJaWYgKGkgPT0gLTEpCisJCXJldHVybjsKKwlwID0gcHRlc1tpXS5wYXJ0X3RhYmxlOworCW9yaWdzeXMgPSBzeXMgPSBnZXRfc3lzaWQoaSk7CisKKwkvKiBpZiBjaGFuZ2luZyB0eXBlcyBUIHRvIDAgaXMgYWxsb3dlZCwgdGhlbgorCSAgIHRoZSByZXZlcnNlIGNoYW5nZSBtdXN0IGJlIGFsbG93ZWQsIHRvbyAqLworCWlmICghc3lzICYmICFMQUJFTF9JU19TR0kgJiYgIUxBQkVMX0lTX1NVTiAmJiAhZ2V0X25yX3NlY3RzKHApKQl7CisJCXByaW50ZigiUGFydGl0aW9uICV1IGRvZXMgbm90IGV4aXN0IHlldCFcbiIsIGkgKyAxKTsKKwkJcmV0dXJuOworCX0KKwl3aGlsZSAoMSkgeworCQlzeXMgPSByZWFkX2hleChnZXRfc3lzX3R5cGVzKCkpOworCisJCWlmICghc3lzICYmICFMQUJFTF9JU19TR0kgJiYgIUxBQkVMX0lTX1NVTikgeworCQkJcHV0cygiVHlwZSAwIG1lYW5zIGZyZWUgc3BhY2UgdG8gbWFueSBzeXN0ZW1zXG4iCisJCQkJIihidXQgbm90IHRvIExpbnV4KS4gSGF2aW5nIHBhcnRpdGlvbnMgb2ZcbiIKKwkJCQkidHlwZSAwIGlzIHByb2JhYmx5IHVud2lzZS4iKTsKKwkJCS8qIGJyZWFrOyAqLworCQl9CisKKwkJaWYgKCFMQUJFTF9JU19TVU4gJiYgIUxBQkVMX0lTX1NHSSkgeworCQkJaWYgKElTX0VYVEVOREVEKHN5cykgIT0gSVNfRVhURU5ERUQocC0+c3lzX2luZCkpIHsKKwkJCQlwdXRzKCJZb3UgY2Fubm90IGNoYW5nZSBhIHBhcnRpdGlvbiBpbnRvIgorCQkJCQkiIGFuIGV4dGVuZGVkIG9uZSBvciB2aWNlIHZlcnNhIik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQlpZiAoc3lzIDwgMjU2KSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfU1VOX0xBQkVMCisJCQlpZiAoTEFCRUxfSVNfU1VOICYmIGkgPT0gMiAmJiBzeXMgIT0gU1VOX1dIT0xFX0RJU0spCisJCQkJcHV0cygiQ29uc2lkZXIgbGVhdmluZyBwYXJ0aXRpb24gMyAiCisJCQkJCSJhcyBXaG9sZSBkaXNrICg1KSxcbiIKKwkJCQkJImFzIFN1bk9TL1NvbGFyaXMgZXhwZWN0cyBpdCBhbmQgIgorCQkJCQkiZXZlbiBMaW51eCBsaWtlcyBpdFxuIik7CisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9TR0lfTEFCRUwKKwkJCWlmIChMQUJFTF9JU19TR0kgJiYKKwkJCQkoCisJCQkJCShpID09IDEwICYmIHN5cyAhPSBTR0lfRU5USVJFX0RJU0spIHx8CisJCQkJCShpID09IDggJiYgc3lzICE9IDApCisJCQkJKQorCQkJKSB7CisJCQkJcHV0cygiQ29uc2lkZXIgbGVhdmluZyBwYXJ0aXRpb24gOSAiCisJCQkJCSJhcyB2b2x1bWUgaGVhZGVyICgwKSxcbmFuZCAiCisJCQkJCSJwYXJ0aXRpb24gMTEgYXMgZW50aXJlIHZvbHVtZSAoNikiCisJCQkJCSJhcyBJUklYIGV4cGVjdHMgaXRcbiIpOworCQkJfQorI2VuZGlmCisJCQlpZiAoc3lzID09IG9yaWdzeXMpCisJCQkJYnJlYWs7CisJCQlpZiAoTEFCRUxfSVNfU1VOKSB7CisJCQkJc3VuX2NoYW5nZV9zeXNpZChpLCBzeXMpOworCQkJfSBlbHNlIGlmIChMQUJFTF9JU19TR0kpIHsKKwkJCQlzZ2lfY2hhbmdlX3N5c2lkKGksIHN5cyk7CisJCQl9IGVsc2UKKwkJCQlwLT5zeXNfaW5kID0gc3lzOworCisJCQlwcmludGYoIkNoYW5nZWQgc3lzdGVtIHR5cGUgb2YgcGFydGl0aW9uICV1ICIKKwkJCQkidG8gJXggKCVzKVxuIiwgaSArIDEsIHN5cywKKwkJCQlwYXJ0aXRpb25fdHlwZShzeXMpKTsKKwkJCXB0ZXNbaV0uY2hhbmdlZCA9IDE7CisJCQkvL2lmIChpc19kb3NfcGFydGl0aW9uKG9yaWdzeXMpIHx8IGlzX2Rvc19wYXJ0aXRpb24oc3lzKSkKKwkJCS8vCWRvc19jaGFuZ2VkID0gMTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorI2VuZGlmIC8qIEZFQVRVUkVfRkRJU0tfV1JJVEFCTEUgKi8KKworCisvKiBjaGVja19jb25zaXN0ZW5jeSgpIGFuZCBsaW5lYXIyY2hzKCkgYWRkZWQgU2F0IE1hciA2IDEyOjI4OjE2IDE5OTMsCisgKiBmYWl0aEBjcy51bmMuZWR1LCBiYXNlZCBvbiBjb2RlIGZyYWdtZW50cyBmcm9tIHBmZGlzayBieSBHb3Jkb24gVy4gUm9zcywKKyAqIEphbi4gIDE5OTAgKHZlcnNpb24gMS4yLjEgYnkgR29yZG9uIFcuIFJvc3MgQXVnLiAxOTkwOyBNb2RpZmllZCBieSBTLgorICogTHVia2luIE9jdC4gIDE5OTEpLiAqLworCitzdGF0aWMgdm9pZAorbGluZWFyMmNocyh1bnNpZ25lZCBscywgdW5zaWduZWQgKmMsIHVuc2lnbmVkICpoLCB1bnNpZ25lZCAqcykKK3sKKwlpbnQgc3BjID0gZ19oZWFkcyAqIGdfc2VjdG9yczsKKworCSpjID0gbHMgLyBzcGM7CisJbHMgPSBscyAlIHNwYzsKKwkqaCA9IGxzIC8gZ19zZWN0b3JzOworCSpzID0gbHMgJSBnX3NlY3RvcnMgKyAxOyAgLyogc2VjdG9ycyBjb3VudCBmcm9tIDEgKi8KK30KKworc3RhdGljIHZvaWQKK2NoZWNrX2NvbnNpc3RlbmN5KGNvbnN0IHN0cnVjdCBwYXJ0aXRpb24gKnAsIGludCBwYXJ0aXRpb24pCit7CisJdW5zaWduZWQgcGJjLCBwYmgsIHBiczsgICAgICAgICAgLyogcGh5c2ljYWwgYmVnaW5uaW5nIGMsIGgsIHMgKi8KKwl1bnNpZ25lZCBwZWMsIHBlaCwgcGVzOyAgICAgICAgICAvKiBwaHlzaWNhbCBlbmRpbmcgYywgaCwgcyAqLworCXVuc2lnbmVkIGxiYywgbGJoLCBsYnM7ICAgICAgICAgIC8qIGxvZ2ljYWwgYmVnaW5uaW5nIGMsIGgsIHMgKi8KKwl1bnNpZ25lZCBsZWMsIGxlaCwgbGVzOyAgICAgICAgICAvKiBsb2dpY2FsIGVuZGluZyBjLCBoLCBzICovCisKKwlpZiAoIWdfaGVhZHMgfHwgIWdfc2VjdG9ycyB8fCAocGFydGl0aW9uID49IDQpKQorCQlyZXR1cm47ICAgICAgICAgLyogZG8gbm90IGNoZWNrIGV4dGVuZGVkIHBhcnRpdGlvbnMgKi8KKworLyogcGh5c2ljYWwgYmVnaW5uaW5nIGMsIGgsIHMgKi8KKwlwYmMgPSAocC0+Y3lsICYgMHhmZikgfCAoKHAtPnNlY3RvciA8PCAyKSAmIDB4MzAwKTsKKwlwYmggPSBwLT5oZWFkOworCXBicyA9IHAtPnNlY3RvciAmIDB4M2Y7CisKKy8qIHBoeXNpY2FsIGVuZGluZyBjLCBoLCBzICovCisJcGVjID0gKHAtPmVuZF9jeWwgJiAweGZmKSB8ICgocC0+ZW5kX3NlY3RvciA8PCAyKSAmIDB4MzAwKTsKKwlwZWggPSBwLT5lbmRfaGVhZDsKKwlwZXMgPSBwLT5lbmRfc2VjdG9yICYgMHgzZjsKKworLyogY29tcHV0ZSBsb2dpY2FsIGJlZ2lubmluZyAoYywgaCwgcykgKi8KKwlsaW5lYXIyY2hzKGdldF9zdGFydF9zZWN0KHApLCAmbGJjLCAmbGJoLCAmbGJzKTsKKworLyogY29tcHV0ZSBsb2dpY2FsIGVuZGluZyAoYywgaCwgcykgKi8KKwlsaW5lYXIyY2hzKGdldF9zdGFydF9zZWN0KHApICsgZ2V0X25yX3NlY3RzKHApIC0gMSwgJmxlYywgJmxlaCwgJmxlcyk7CisKKy8qIFNhbWUgcGh5c2ljYWwgLyBsb2dpY2FsIGJlZ2lubmluZz8gKi8KKwlpZiAoZ19jeWxpbmRlcnMgPD0gMTAyNCAmJiAocGJjICE9IGxiYyB8fCBwYmggIT0gbGJoIHx8IHBicyAhPSBsYnMpKSB7CisJCXByaW50ZigiUGFydGl0aW9uICV1IGhhcyBkaWZmZXJlbnQgcGh5c2ljYWwvbG9naWNhbCAiCisJCQkiYmVnaW5uaW5ncyAobm9uLUxpbnV4Pyk6XG4iLCBwYXJ0aXRpb24gKyAxKTsKKwkJcHJpbnRmKCIgICAgIHBoeXM9KCV1LCAldSwgJXUpICIsIHBiYywgcGJoLCBwYnMpOworCQlwcmludGYoImxvZ2ljYWw9KCV1LCAldSwgJXUpXG4iLCBsYmMsIGxiaCwgbGJzKTsKKwl9CisKKy8qIFNhbWUgcGh5c2ljYWwgLyBsb2dpY2FsIGVuZGluZz8gKi8KKwlpZiAoZ19jeWxpbmRlcnMgPD0gMTAyNCAmJiAocGVjICE9IGxlYyB8fCBwZWggIT0gbGVoIHx8IHBlcyAhPSBsZXMpKSB7CisJCXByaW50ZigiUGFydGl0aW9uICV1IGhhcyBkaWZmZXJlbnQgcGh5c2ljYWwvbG9naWNhbCAiCisJCQkiZW5kaW5nczpcbiIsIHBhcnRpdGlvbiArIDEpOworCQlwcmludGYoIiAgICAgcGh5cz0oJXUsICV1LCAldSkgIiwgcGVjLCBwZWgsIHBlcyk7CisJCXByaW50ZigibG9naWNhbD0oJXUsICV1LCAldSlcbiIsIGxlYywgbGVoLCBsZXMpOworCX0KKworLyogRW5kaW5nIG9uIGN5bGluZGVyIGJvdW5kYXJ5PyAqLworCWlmIChwZWggIT0gKGdfaGVhZHMgLSAxKSB8fCBwZXMgIT0gZ19zZWN0b3JzKSB7CisJCXByaW50ZigiUGFydGl0aW9uICV1IGRvZXMgbm90IGVuZCBvbiBjeWxpbmRlciBib3VuZGFyeVxuIiwKKwkJCXBhcnRpdGlvbiArIDEpOworCX0KK30KKworc3RhdGljIHZvaWQKK2xpc3RfZGlza19nZW9tZXRyeSh2b2lkKQoreworCXVsbG9uZyBieXRlcyA9ICgodWxsb25nKXRvdGFsX251bWJlcl9vZl9zZWN0b3JzIDw8IDkpOworCWxvbmcgbWVnYWJ5dGVzID0gYnl0ZXMgLyAxMDAwMDAwOworCisJaWYgKG1lZ2FieXRlcyA8IDEwMDAwKQorCQlwcmludGYoIlxuRGlzayAlczogJWx1IE1CLCAlbGx1IGJ5dGVzXG4iLAorCQkJZGlza19kZXZpY2UsIG1lZ2FieXRlcywgYnl0ZXMpOworCWVsc2UKKwkJcHJpbnRmKCJcbkRpc2sgJXM6ICVsdS4lbHUgR0IsICVsbHUgYnl0ZXNcbiIsCisJCQlkaXNrX2RldmljZSwgbWVnYWJ5dGVzLzEwMDAsIChtZWdhYnl0ZXMvMTAwKSUxMCwgYnl0ZXMpOworCXByaW50ZigiJXUgaGVhZHMsICV1IHNlY3RvcnMvdHJhY2ssICV1IGN5bGluZGVycyIsCisJCSAgIGdfaGVhZHMsIGdfc2VjdG9ycywgZ19jeWxpbmRlcnMpOworCWlmICh1bml0c19wZXJfc2VjdG9yID09IDEpCisJCXByaW50ZigiLCB0b3RhbCAlIlNFQ1RfRk1UInUgc2VjdG9ycyIsCisJCQl0b3RhbF9udW1iZXJfb2Zfc2VjdG9ycyAvIChzZWN0b3Jfc2l6ZS81MTIpKTsKKwlwcmludGYoIlxuVW5pdHMgPSAlcyBvZiAldSAqICV1ID0gJXUgYnl0ZXNcblxuIiwKKwkJc3RyX3VuaXRzKFBMVVJBTCksCisJCXVuaXRzX3Blcl9zZWN0b3IsIHNlY3Rvcl9zaXplLCB1bml0c19wZXJfc2VjdG9yICogc2VjdG9yX3NpemUpOworfQorCisvKgorICogQ2hlY2sgd2hldGhlciBwYXJ0aXRpb24gZW50cmllcyBhcmUgb3JkZXJlZCBieSB0aGVpciBzdGFydGluZyBwb3NpdGlvbnMuCisgKiBSZXR1cm4gMCBpZiBPSy4gUmV0dXJuIGkgaWYgcGFydGl0aW9uIGkgc2hvdWxkIGhhdmUgYmVlbiBlYXJsaWVyLgorICogVHdvIHNlcGFyYXRlIGNoZWNrczogcHJpbWFyeSBhbmQgbG9naWNhbCBwYXJ0aXRpb25zLgorICovCitzdGF0aWMgaW50Cit3cm9uZ19wX29yZGVyKGludCAqcHJldikKK3sKKwljb25zdCBzdHJ1Y3QgcHRlICpwZTsKKwljb25zdCBzdHJ1Y3QgcGFydGl0aW9uICpwOworCXNlY3Rvcl90IGxhc3RfcF9zdGFydF9wb3MgPSAwLCBwX3N0YXJ0X3BvczsKKwl1bnNpZ25lZCBpLCBsYXN0X2kgPSAwOworCisJZm9yIChpID0gMDsgaSA8IGdfcGFydGl0aW9uczsgaSsrKSB7CisJCWlmIChpID09IDQpIHsKKwkJCWxhc3RfaSA9IDQ7CisJCQlsYXN0X3Bfc3RhcnRfcG9zID0gMDsKKwkJfQorCQlwZSA9ICZwdGVzW2ldOworCQlwID0gcGUtPnBhcnRfdGFibGU7CisJCWlmIChwLT5zeXNfaW5kKSB7CisJCQlwX3N0YXJ0X3BvcyA9IGdldF9wYXJ0aXRpb25fc3RhcnRfZnJvbV9kZXZfc3RhcnQocGUpOworCisJCQlpZiAobGFzdF9wX3N0YXJ0X3BvcyA+IHBfc3RhcnRfcG9zKSB7CisJCQkJaWYgKHByZXYpCisJCQkJCSpwcmV2ID0gbGFzdF9pOworCQkJCXJldHVybiBpOworCQkJfQorCisJCQlsYXN0X3Bfc3RhcnRfcG9zID0gcF9zdGFydF9wb3M7CisJCQlsYXN0X2kgPSBpOworCQl9CisJfQorCXJldHVybiAwOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfQURWQU5DRUQKKy8qCisgKiBGaXggdGhlIGNoYWluIG9mIGxvZ2ljYWxzLgorICogZXh0ZW5kZWRfb2Zmc2V0IGlzIHVuY2hhbmdlZCwgdGhlIHNldCBvZiBzZWN0b3JzIHVzZWQgaXMgdW5jaGFuZ2VkCisgKiBUaGUgY2hhaW4gaXMgc29ydGVkIHNvIHRoYXQgc2VjdG9ycyBpbmNyZWFzZSwgYW5kIHNvIHRoYXQKKyAqIHN0YXJ0aW5nIHNlY3RvcnMgaW5jcmVhc2UuCisgKgorICogQWZ0ZXIgdGhpcyBpdCBtYXkgc3RpbGwgYmUgdGhhdCBjZmRpc2sgZG9lc250IGxpa2UgdGhlIHRhYmxlLgorICogKFRoaXMgaXMgYmVjYXVzZSBjZmRpc2sgY29uc2lkZXJzIGV4cGFuZGVkIHBhcnRzLCBmcm9tIGxpbmsgdG8KKyAqIGVuZCBvZiBwYXJ0aXRpb24sIGFuZCB0aGVzZSBtYXkgc3RpbGwgb3ZlcmxhcC4pCisgKiBOb3cKKyAqICAgc2ZkaXNrIC9kZXYvaGRhID4gb2hkYTsgc2ZkaXNrIC9kZXYvaGRhIDwgb2hkYQorICogbWF5IGhlbHAuCisgKi8KK3N0YXRpYyB2b2lkCitmaXhfY2hhaW5fb2ZfbG9naWNhbHModm9pZCkKK3sKKwlpbnQgaiwgb2osIG9qaiwgc2osIHNqajsKKwlzdHJ1Y3QgcGFydGl0aW9uICpwaiwqcGpqLHRtcDsKKworCS8qIFN0YWdlIDE6IHNvcnQgc2VjdG9ycyBidXQgbGVhdmUgc2VjdG9yIG9mIHBhcnQgNCAqLworCS8qIChJdHMgc2VjdG9yIGlzIHRoZSBnbG9iYWwgZXh0ZW5kZWRfb2Zmc2V0LikgKi8KKyBzdGFnZTE6CisJZm9yIChqID0gNTsgaiA8IGdfcGFydGl0aW9ucyAtIDE7IGorKykgeworCQlvaiA9IHB0ZXNbal0ub2Zmc2V0X2Zyb21fZGV2X3N0YXJ0OworCQlvamogPSBwdGVzW2orMV0ub2Zmc2V0X2Zyb21fZGV2X3N0YXJ0OworCQlpZiAob2ogPiBvamopIHsKKwkJCXB0ZXNbal0ub2Zmc2V0X2Zyb21fZGV2X3N0YXJ0ID0gb2pqOworCQkJcHRlc1tqKzFdLm9mZnNldF9mcm9tX2Rldl9zdGFydCA9IG9qOworCQkJcGogPSBwdGVzW2pdLnBhcnRfdGFibGU7CisJCQlzZXRfc3RhcnRfc2VjdChwaiwgZ2V0X3N0YXJ0X3NlY3QocGopK29qLW9qaik7CisJCQlwamogPSBwdGVzW2orMV0ucGFydF90YWJsZTsKKwkJCXNldF9zdGFydF9zZWN0KHBqaiwgZ2V0X3N0YXJ0X3NlY3QocGpqKStvamotb2opOworCQkJc2V0X3N0YXJ0X3NlY3QocHRlc1tqLTFdLmV4dF9wb2ludGVyLAorCQkJCQkgICBvamotZXh0ZW5kZWRfb2Zmc2V0KTsKKwkJCXNldF9zdGFydF9zZWN0KHB0ZXNbal0uZXh0X3BvaW50ZXIsCisJCQkJCSAgIG9qLWV4dGVuZGVkX29mZnNldCk7CisJCQlnb3RvIHN0YWdlMTsKKwkJfQorCX0KKworCS8qIFN0YWdlIDI6IHNvcnQgc3RhcnRpbmcgc2VjdG9ycyAqLworIHN0YWdlMjoKKwlmb3IgKGogPSA0OyBqIDwgZ19wYXJ0aXRpb25zIC0gMTsgaisrKSB7CisJCXBqID0gcHRlc1tqXS5wYXJ0X3RhYmxlOworCQlwamogPSBwdGVzW2orMV0ucGFydF90YWJsZTsKKwkJc2ogPSBnZXRfc3RhcnRfc2VjdChwaik7CisJCXNqaiA9IGdldF9zdGFydF9zZWN0KHBqaik7CisJCW9qID0gcHRlc1tqXS5vZmZzZXRfZnJvbV9kZXZfc3RhcnQ7CisJCW9qaiA9IHB0ZXNbaisxXS5vZmZzZXRfZnJvbV9kZXZfc3RhcnQ7CisJCWlmIChvaitzaiA+IG9qaitzamopIHsKKwkJCXRtcCA9ICpwajsKKwkJCSpwaiA9ICpwamo7CisJCQkqcGpqID0gdG1wOworCQkJc2V0X3N0YXJ0X3NlY3QocGosIG9qaitzamotb2opOworCQkJc2V0X3N0YXJ0X3NlY3QocGpqLCBvaitzai1vamopOworCQkJZ290byBzdGFnZTI7CisJCX0KKwl9CisKKwkvKiBQcm9iYWJseSBzb21ldGhpbmcgd2FzIGNoYW5nZWQgKi8KKwlmb3IgKGogPSA0OyBqIDwgZ19wYXJ0aXRpb25zOyBqKyspCisJCXB0ZXNbal0uY2hhbmdlZCA9IDE7Cit9CisKKworc3RhdGljIHZvaWQKK2ZpeF9wYXJ0aXRpb25fdGFibGVfb3JkZXIodm9pZCkKK3sKKwlzdHJ1Y3QgcHRlICpwZWksICpwZWs7CisJaW50IGksazsKKworCWlmICghd3JvbmdfcF9vcmRlcihOVUxMKSkgeworCQlwdXRzKCJPcmRlcmluZyBpcyBhbHJlYWR5IGNvcnJlY3RcbiIpOworCQlyZXR1cm47CisJfQorCisJd2hpbGUgKChpID0gd3JvbmdfcF9vcmRlcigmaykpICE9IDAgJiYgaSA8IDQpIHsKKwkJLyogcGFydGl0aW9uIGkgc2hvdWxkIGhhdmUgY29tZSBlYXJsaWVyLCBtb3ZlIGl0ICovCisJCS8qIFdlIGhhdmUgdG8gbW92ZSBkYXRhIGluIHRoZSBNQlIgKi8KKwkJc3RydWN0IHBhcnRpdGlvbiAqcGksICpwaywgKnBlLCBwYnVmOworCQlwZWkgPSAmcHRlc1tpXTsKKwkJcGVrID0gJnB0ZXNba107CisKKwkJcGUgPSBwZWktPmV4dF9wb2ludGVyOworCQlwZWktPmV4dF9wb2ludGVyID0gcGVrLT5leHRfcG9pbnRlcjsKKwkJcGVrLT5leHRfcG9pbnRlciA9IHBlOworCisJCXBpID0gcGVpLT5wYXJ0X3RhYmxlOworCQlwayA9IHBlay0+cGFydF90YWJsZTsKKworCQltZW1tb3ZlKCZwYnVmLCBwaSwgc2l6ZW9mKHN0cnVjdCBwYXJ0aXRpb24pKTsKKwkJbWVtbW92ZShwaSwgcGssIHNpemVvZihzdHJ1Y3QgcGFydGl0aW9uKSk7CisJCW1lbW1vdmUocGssICZwYnVmLCBzaXplb2Yoc3RydWN0IHBhcnRpdGlvbikpOworCisJCXBlaS0+Y2hhbmdlZCA9IHBlay0+Y2hhbmdlZCA9IDE7CisJfQorCisJaWYgKGkpCisJCWZpeF9jaGFpbl9vZl9sb2dpY2FscygpOworCisJcHV0cygiRG9uZSIpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitsaXN0X3RhYmxlKGludCB4dHJhKQoreworCWNvbnN0IHN0cnVjdCBwYXJ0aXRpb24gKnA7CisJaW50IGksIHc7CisKKwlpZiAoTEFCRUxfSVNfU1VOKSB7CisJCXN1bl9saXN0X3RhYmxlKHh0cmEpOworCQlyZXR1cm47CisJfQorCWlmIChMQUJFTF9JU19TR0kpIHsKKwkJc2dpX2xpc3RfdGFibGUoeHRyYSk7CisJCXJldHVybjsKKwl9CisJaWYgKExBQkVMX0lTX0dQVCkgeworCQlncHRfbGlzdF90YWJsZSh4dHJhKTsKKwkJcmV0dXJuOworCX0KKworCWxpc3RfZGlza19nZW9tZXRyeSgpOworCisJaWYgKExBQkVMX0lTX09TRikgeworCQl4YnNkX3ByaW50X2Rpc2tsYWJlbCh4dHJhKTsKKwkJcmV0dXJuOworCX0KKworCS8qIEhldXJpc3RpYzogd2UgbGlzdCBwYXJ0aXRpb24gMyBvZiAvZGV2L2ZvbyBhcyAvZGV2L2ZvbzMsCisJICAgYnV0IGlmIHRoZSBkZXZpY2UgbmFtZSBlbmRzIGluIGEgZGlnaXQsIHNheSAvZGV2L2ZvbzEsCisJICAgdGhlbiB0aGUgcGFydGl0aW9uIGlzIGNhbGxlZCAvZGV2L2ZvbzFwMy4gKi8KKwl3ID0gc3RybGVuKGRpc2tfZGV2aWNlKTsKKwlpZiAodyAmJiBpc2RpZ2l0KGRpc2tfZGV2aWNlW3ctMV0pKQorCQl3Kys7CisJaWYgKHcgPCA1KQorCQl3ID0gNTsKKworCS8vICAgICAgICAgICAgMSAxMjM0NTY3ODkwMSAxMjM0NTY3ODkwMSAxMjM0NTY3ODkwMSAgMTIKKwlwcmludGYoIiUqcyBCb290ICAgICAgU3RhcnQgICAgICAgICBFbmQgICAgICBCbG9ja3MgIElkIFN5c3RlbVxuIiwKKwkJICAgdysxLCAiRGV2aWNlIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ19wYXJ0aXRpb25zOyBpKyspIHsKKwkJY29uc3Qgc3RydWN0IHB0ZSAqcGUgPSAmcHRlc1tpXTsKKwkJc2VjdG9yX3QgcHNlY3RzOworCQlzZWN0b3JfdCBwYmxvY2tzOworCQl1bnNpZ25lZCBwb2RkOworCisJCXAgPSBwZS0+cGFydF90YWJsZTsKKwkJaWYgKCFwIHx8IGlzX2NsZWFyZWRfcGFydGl0aW9uKHApKQorCQkJY29udGludWU7CisKKwkJcHNlY3RzID0gZ2V0X25yX3NlY3RzKHApOworCQlwYmxvY2tzID0gcHNlY3RzOworCQlwb2RkID0gMDsKKworCQlpZiAoc2VjdG9yX3NpemUgPCAxMDI0KSB7CisJCQlwYmxvY2tzIC89ICgxMDI0IC8gc2VjdG9yX3NpemUpOworCQkJcG9kZCA9IHBzZWN0cyAlICgxMDI0IC8gc2VjdG9yX3NpemUpOworCQl9CisJCWlmIChzZWN0b3Jfc2l6ZSA+IDEwMjQpCisJCQlwYmxvY2tzICo9IChzZWN0b3Jfc2l6ZSAvIDEwMjQpOworCisJCXByaW50ZigiJXMgICVjICUxMSJTRUNUX0ZNVCJ1ICUxMSJTRUNUX0ZNVCJ1ICUxMSJTRUNUX0ZNVCJ1JWMgJTJ4ICVzXG4iLAorCQkJcGFydG5hbWUoZGlza19kZXZpY2UsIGkrMSwgdysyKSwKKwkJCSFwLT5ib290X2luZCA/ICcgJyA6IHAtPmJvb3RfaW5kID09IEFDVElWRV9GTEFHIC8qIGJvb3QgZmxhZyAqLworCQkJCT8gJyonIDogJz8nLAorCQkJY3JvdW5kKGdldF9wYXJ0aXRpb25fc3RhcnRfZnJvbV9kZXZfc3RhcnQocGUpKSwgICAgICAgICAgIC8qIHN0YXJ0ICovCisJCQljcm91bmQoZ2V0X3BhcnRpdGlvbl9zdGFydF9mcm9tX2Rldl9zdGFydChwZSkgKyBwc2VjdHMgICAgLyogZW5kICovCisJCQkJLSAocHNlY3RzID8gMSA6IDApKSwKKwkJCXBibG9ja3MsIHBvZGQgPyAnKycgOiAnICcsIC8qIG9kZCBmbGFnIG9uIGVuZCAqLworCQkJcC0+c3lzX2luZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdHlwZSBpZCAqLworCQkJcGFydGl0aW9uX3R5cGUocC0+c3lzX2luZCkpOyAgICAgICAgICAgICAgICAgICAgLyogdHlwZSBuYW1lICovCisKKwkJY2hlY2tfY29uc2lzdGVuY3kocCwgaSk7CisJfQorCisJLyogSXMgcGFydGl0aW9uIHRhYmxlIGluIGRpc2sgb3JkZXI/IEl0IG5lZWQgbm90IGJlLCBidXQuLi4gKi8KKwkvKiBwYXJ0aXRpb24gdGFibGUgZW50cmllcyBhcmUgbm90IGNoZWNrZWQgZm9yIGNvcnJlY3Qgb3JkZXIKKwkgKiBpZiB0aGlzIGlzIGEgc2dpLCBzdW4gb3IgYWl4IGxhYmVsZWQgZGlzay4uLiAqLworCWlmIChMQUJFTF9JU19ET1MgJiYgd3JvbmdfcF9vcmRlcihOVUxMKSkgeworCQkvKiBGSVhNRSAqLworCQlwdXRzKCJcblBhcnRpdGlvbiB0YWJsZSBlbnRyaWVzIGFyZSBub3QgaW4gZGlzayBvcmRlciIpOworCX0KK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX0FEVkFOQ0VECitzdGF0aWMgdm9pZAoreF9saXN0X3RhYmxlKGludCBleHRlbmQpCit7CisJY29uc3Qgc3RydWN0IHB0ZSAqcGU7CisJY29uc3Qgc3RydWN0IHBhcnRpdGlvbiAqcDsKKwlpbnQgaTsKKworCXByaW50ZigiXG5EaXNrICVzOiAldSBoZWFkcywgJXUgc2VjdG9ycywgJXUgY3lsaW5kZXJzXG5cbiIsCisJCWRpc2tfZGV2aWNlLCBnX2hlYWRzLCBnX3NlY3RvcnMsIGdfY3lsaW5kZXJzKTsKKwlwdXRzKCJOciBBRiAgSGQgU2VjICBDeWwgIEhkIFNlYyAgQ3lsICAgICAgU3RhcnQgICAgICAgU2l6ZSBJRCIpOworCWZvciAoaSA9IDA7IGkgPCBnX3BhcnRpdGlvbnM7IGkrKykgeworCQlwZSA9ICZwdGVzW2ldOworCQlwID0gKGV4dGVuZCA/IHBlLT5leHRfcG9pbnRlciA6IHBlLT5wYXJ0X3RhYmxlKTsKKwkJaWYgKHAgIT0gTlVMTCkgeworCQkJcHJpbnRmKCIlMnUgJTAyeCU0dSU0dSU1dSU0dSU0dSU1dSUxMSJTRUNUX0ZNVCJ1JTExIlNFQ1RfRk1UInUgJTAyeFxuIiwKKwkJCQlpICsgMSwgcC0+Ym9vdF9pbmQsIHAtPmhlYWQsCisJCQkJc2VjdG9yKHAtPnNlY3RvciksCisJCQkJY3lsaW5kZXIocC0+c2VjdG9yLCBwLT5jeWwpLCBwLT5lbmRfaGVhZCwKKwkJCQlzZWN0b3IocC0+ZW5kX3NlY3RvciksCisJCQkJY3lsaW5kZXIocC0+ZW5kX3NlY3RvciwgcC0+ZW5kX2N5bCksCisJCQkJZ2V0X3N0YXJ0X3NlY3QocCksIGdldF9ucl9zZWN0cyhwKSwKKwkJCQlwLT5zeXNfaW5kKTsKKwkJCWlmIChwLT5zeXNfaW5kKQorCQkJCWNoZWNrX2NvbnNpc3RlbmN5KHAsIGkpOworCQl9CisJfQorfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorc3RhdGljIHZvaWQKK2ZpbGxfYm91bmRzKHNlY3Rvcl90ICpmaXJzdCwgc2VjdG9yX3QgKmxhc3QpCit7CisJdW5zaWduZWQgaTsKKwljb25zdCBzdHJ1Y3QgcHRlICpwZSA9ICZwdGVzWzBdOworCWNvbnN0IHN0cnVjdCBwYXJ0aXRpb24gKnA7CisKKwlmb3IgKGkgPSAwOyBpIDwgZ19wYXJ0aXRpb25zOyBwZSsrLGkrKykgeworCQlwID0gcGUtPnBhcnRfdGFibGU7CisJCWlmICghcC0+c3lzX2luZCB8fCBJU19FWFRFTkRFRChwLT5zeXNfaW5kKSkgeworCQkJZmlyc3RbaV0gPSAweGZmZmZmZmZmOworCQkJbGFzdFtpXSA9IDA7CisJCX0gZWxzZSB7CisJCQlmaXJzdFtpXSA9IGdldF9wYXJ0aXRpb25fc3RhcnRfZnJvbV9kZXZfc3RhcnQocGUpOworCQkJbGFzdFtpXSA9IGZpcnN0W2ldICsgZ2V0X25yX3NlY3RzKHApIC0gMTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK2NoZWNrKGludCBuLCB1bnNpZ25lZCBoLCB1bnNpZ25lZCBzLCB1bnNpZ25lZCBjLCBzZWN0b3JfdCBzdGFydCkKK3sKKwlzZWN0b3JfdCB0b3RhbCwgcmVhbF9zLCByZWFsX2M7CisKKwlyZWFsX3MgPSBzZWN0b3IocykgLSAxOworCXJlYWxfYyA9IGN5bGluZGVyKHMsIGMpOworCXRvdGFsID0gKHJlYWxfYyAqIGdfc2VjdG9ycyArIHJlYWxfcykgKiBnX2hlYWRzICsgaDsKKwlpZiAoIXRvdGFsKQorCQlwcmludGYoIlBhcnRpdGlvbiAldSBjb250YWlucyBzZWN0b3IgMFxuIiwgbik7CisJaWYgKGggPj0gZ19oZWFkcykKKwkJcHJpbnRmKCJQYXJ0aXRpb24gJXU6IGhlYWQgJXUgZ3JlYXRlciB0aGFuIG1heGltdW0gJXVcbiIsCisJCQluLCBoICsgMSwgZ19oZWFkcyk7CisJaWYgKHJlYWxfcyA+PSBnX3NlY3RvcnMpCisJCXByaW50ZigiUGFydGl0aW9uICV1OiBzZWN0b3IgJXUgZ3JlYXRlciB0aGFuICIKKwkJCSJtYXhpbXVtICV1XG4iLCBuLCBzLCBnX3NlY3RvcnMpOworCWlmIChyZWFsX2MgPj0gZ19jeWxpbmRlcnMpCisJCXByaW50ZigiUGFydGl0aW9uICV1OiBjeWxpbmRlciAlIlNFQ1RfRk1UInUgZ3JlYXRlciB0aGFuICIKKwkJCSJtYXhpbXVtICV1XG4iLCBuLCByZWFsX2MgKyAxLCBnX2N5bGluZGVycyk7CisJaWYgKGdfY3lsaW5kZXJzIDw9IDEwMjQgJiYgc3RhcnQgIT0gdG90YWwpCisJCXByaW50ZigiUGFydGl0aW9uICV1OiBwcmV2aW91cyBzZWN0b3JzICUiU0VDVF9GTVQidSBkaXNhZ3JlZXMgd2l0aCAiCisJCQkidG90YWwgJSJTRUNUX0ZNVCJ1XG4iLCBuLCBzdGFydCwgdG90YWwpOworfQorCitzdGF0aWMgdm9pZAordmVyaWZ5KHZvaWQpCit7CisJaW50IGksIGo7CisJc2VjdG9yX3QgdG90YWwgPSAxOworCXNlY3Rvcl90IGZpcnN0W2dfcGFydGl0aW9uc10sIGxhc3RbZ19wYXJ0aXRpb25zXTsKKwlzdHJ1Y3QgcGFydGl0aW9uICpwOworCisJaWYgKHdhcm5fZ2VvbWV0cnkoKSkKKwkJcmV0dXJuOworCisJaWYgKExBQkVMX0lTX1NVTikgeworCQl2ZXJpZnlfc3VuKCk7CisJCXJldHVybjsKKwl9CisJaWYgKExBQkVMX0lTX1NHSSkgeworCQl2ZXJpZnlfc2dpKDEpOworCQlyZXR1cm47CisJfQorCisJZmlsbF9ib3VuZHMoZmlyc3QsIGxhc3QpOworCWZvciAoaSA9IDA7IGkgPCBnX3BhcnRpdGlvbnM7IGkrKykgeworCQlzdHJ1Y3QgcHRlICpwZSA9ICZwdGVzW2ldOworCisJCXAgPSBwZS0+cGFydF90YWJsZTsKKwkJaWYgKHAtPnN5c19pbmQgJiYgIUlTX0VYVEVOREVEKHAtPnN5c19pbmQpKSB7CisJCQljaGVja19jb25zaXN0ZW5jeShwLCBpKTsKKwkJCWlmIChnZXRfcGFydGl0aW9uX3N0YXJ0X2Zyb21fZGV2X3N0YXJ0KHBlKSA8IGZpcnN0W2ldKQorCQkJCXByaW50ZigiV2FybmluZzogYmFkIHN0YXJ0LW9mLWRhdGEgaW4gIgorCQkJCQkicGFydGl0aW9uICV1XG4iLCBpICsgMSk7CisJCQljaGVjayhpICsgMSwgcC0+ZW5kX2hlYWQsIHAtPmVuZF9zZWN0b3IsIHAtPmVuZF9jeWwsCisJCQkJbGFzdFtpXSk7CisJCQl0b3RhbCArPSBsYXN0W2ldICsgMSAtIGZpcnN0W2ldOworCQkJZm9yIChqID0gMDsgaiA8IGk7IGorKykgeworCQkJCWlmICgoZmlyc3RbaV0gPj0gZmlyc3Rbal0gJiYgZmlyc3RbaV0gPD0gbGFzdFtqXSkKKwkJCQkgfHwgKChsYXN0W2ldIDw9IGxhc3Rbal0gJiYgbGFzdFtpXSA+PSBmaXJzdFtqXSkpKSB7CisJCQkJCXByaW50ZigiV2FybmluZzogcGFydGl0aW9uICV1IG92ZXJsYXBzICIKKwkJCQkJCSJwYXJ0aXRpb24gJXVcbiIsIGogKyAxLCBpICsgMSk7CisJCQkJCXRvdGFsICs9IGZpcnN0W2ldID49IGZpcnN0W2pdID8KKwkJCQkJCWZpcnN0W2ldIDogZmlyc3Rbal07CisJCQkJCXRvdGFsIC09IGxhc3RbaV0gPD0gbGFzdFtqXSA/CisJCQkJCQlsYXN0W2ldIDogbGFzdFtqXTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZiAoZXh0ZW5kZWRfb2Zmc2V0KSB7CisJCXN0cnVjdCBwdGUgKnBleCA9ICZwdGVzW2V4dF9pbmRleF07CisJCXNlY3Rvcl90IGVfbGFzdCA9IGdldF9zdGFydF9zZWN0KHBleC0+cGFydF90YWJsZSkgKworCQkJZ2V0X25yX3NlY3RzKHBleC0+cGFydF90YWJsZSkgLSAxOworCisJCWZvciAoaSA9IDQ7IGkgPCBnX3BhcnRpdGlvbnM7IGkrKykgeworCQkJdG90YWwrKzsKKwkJCXAgPSBwdGVzW2ldLnBhcnRfdGFibGU7CisJCQlpZiAoIXAtPnN5c19pbmQpIHsKKwkJCQlpZiAoaSAhPSA0IHx8IGkgKyAxIDwgZ19wYXJ0aXRpb25zKQorCQkJCQlwcmludGYoIldhcm5pbmc6IHBhcnRpdGlvbiAldSAiCisJCQkJCQkiaXMgZW1wdHlcbiIsIGkgKyAxKTsKKwkJCX0gZWxzZSBpZiAoZmlyc3RbaV0gPCBleHRlbmRlZF9vZmZzZXQgfHwgbGFzdFtpXSA+IGVfbGFzdCkgeworCQkJCXByaW50ZigiTG9naWNhbCBwYXJ0aXRpb24gJXUgbm90IGVudGlyZWx5IGluICIKKwkJCQkJInBhcnRpdGlvbiAldVxuIiwgaSArIDEsIGV4dF9pbmRleCArIDEpOworCQkJfQorCQl9CisJfQorCisJaWYgKHRvdGFsID4gZ19oZWFkcyAqIGdfc2VjdG9ycyAqIGdfY3lsaW5kZXJzKQorCQlwcmludGYoIlRvdGFsIGFsbG9jYXRlZCBzZWN0b3JzICV1IGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSAiCisJCQkiJXVcbiIsIHRvdGFsLCBnX2hlYWRzICogZ19zZWN0b3JzICogZ19jeWxpbmRlcnMpOworCWVsc2UgeworCQl0b3RhbCA9IGdfaGVhZHMgKiBnX3NlY3RvcnMgKiBnX2N5bGluZGVycyAtIHRvdGFsOworCQlpZiAodG90YWwgIT0gMCkKKwkJCXByaW50ZigiJSJTRUNUX0ZNVCJ1IHVuYWxsb2NhdGVkIHNlY3RvcnNcbiIsIHRvdGFsKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCithZGRfcGFydGl0aW9uKGludCBuLCBpbnQgc3lzKQoreworCWNoYXIgbWVzZ1syNTZdOyAgICAgICAgIC8qIDQ4IGRvZXMgbm90IHN1ZmZpY2UgaW4gSmFwYW5lc2UgKi8KKwlpbnQgaSwgbnVtX3JlYWQgPSAwOworCXN0cnVjdCBwYXJ0aXRpb24gKnAgPSBwdGVzW25dLnBhcnRfdGFibGU7CisJc3RydWN0IHBhcnRpdGlvbiAqcSA9IHB0ZXNbZXh0X2luZGV4XS5wYXJ0X3RhYmxlOworCXNlY3Rvcl90IGxpbWl0LCB0ZW1wOworCXNlY3Rvcl90IHN0YXJ0LCBzdG9wID0gMDsKKwlzZWN0b3JfdCBmaXJzdFtnX3BhcnRpdGlvbnNdLCBsYXN0W2dfcGFydGl0aW9uc107CisKKwlpZiAocCAmJiBwLT5zeXNfaW5kKSB7CisJCXByaW50Zihtc2dfcGFydF9hbHJlYWR5X2RlZmluZWQsIG4gKyAxKTsKKwkJcmV0dXJuOworCX0KKwlmaWxsX2JvdW5kcyhmaXJzdCwgbGFzdCk7CisJaWYgKG4gPCA0KSB7CisJCXN0YXJ0ID0gc2VjdG9yX29mZnNldDsKKwkJaWYgKGRpc3BsYXlfaW5fY3lsX3VuaXRzIHx8ICF0b3RhbF9udW1iZXJfb2Zfc2VjdG9ycykKKwkJCWxpbWl0ID0gKHNlY3Rvcl90KSBnX2hlYWRzICogZ19zZWN0b3JzICogZ19jeWxpbmRlcnMgLSAxOworCQllbHNlCisJCQlsaW1pdCA9IHRvdGFsX251bWJlcl9vZl9zZWN0b3JzIC0gMTsKKwkJaWYgKGV4dGVuZGVkX29mZnNldCkgeworCQkJZmlyc3RbZXh0X2luZGV4XSA9IGV4dGVuZGVkX29mZnNldDsKKwkJCWxhc3RbZXh0X2luZGV4XSA9IGdldF9zdGFydF9zZWN0KHEpICsKKwkJCQlnZXRfbnJfc2VjdHMocSkgLSAxOworCQl9CisJfSBlbHNlIHsKKwkJc3RhcnQgPSBleHRlbmRlZF9vZmZzZXQgKyBzZWN0b3Jfb2Zmc2V0OworCQlsaW1pdCA9IGdldF9zdGFydF9zZWN0KHEpICsgZ2V0X25yX3NlY3RzKHEpIC0gMTsKKwl9CisJaWYgKGRpc3BsYXlfaW5fY3lsX3VuaXRzKQorCQlmb3IgKGkgPSAwOyBpIDwgZ19wYXJ0aXRpb25zOyBpKyspCisJCQlmaXJzdFtpXSA9IChjcm91bmQoZmlyc3RbaV0pIC0gMSkgKiB1bml0c19wZXJfc2VjdG9yOworCisJc25wcmludGYobWVzZywgc2l6ZW9mKG1lc2cpLCAiRmlyc3QgJXMiLCBzdHJfdW5pdHMoU0lOR1VMQVIpKTsKKwlkbyB7CisJCXRlbXAgPSBzdGFydDsKKwkJZm9yIChpID0gMDsgaSA8IGdfcGFydGl0aW9uczsgaSsrKSB7CisJCQlpbnQgbGFzdHBsdXNvZmY7CisKKwkJCWlmIChzdGFydCA9PSBwdGVzW2ldLm9mZnNldF9mcm9tX2Rldl9zdGFydCkKKwkJCQlzdGFydCArPSBzZWN0b3Jfb2Zmc2V0OworCQkJbGFzdHBsdXNvZmYgPSBsYXN0W2ldICsgKChuIDwgNCkgPyAwIDogc2VjdG9yX29mZnNldCk7CisJCQlpZiAoc3RhcnQgPj0gZmlyc3RbaV0gJiYgc3RhcnQgPD0gbGFzdHBsdXNvZmYpCisJCQkJc3RhcnQgPSBsYXN0cGx1c29mZiArIDE7CisJCX0KKwkJaWYgKHN0YXJ0ID4gbGltaXQpCisJCQlicmVhazsKKwkJaWYgKHN0YXJ0ID49IHRlbXArdW5pdHNfcGVyX3NlY3RvciAmJiBudW1fcmVhZCkgeworCQkJcHJpbnRmKCJTZWN0b3IgJSJTRUNUX0ZNVCJ1IGlzIGFscmVhZHkgYWxsb2NhdGVkXG4iLCB0ZW1wKTsKKwkJCXRlbXAgPSBzdGFydDsKKwkJCW51bV9yZWFkID0gMDsKKwkJfQorCQlpZiAoIW51bV9yZWFkICYmIHN0YXJ0ID09IHRlbXApIHsKKwkJCXNlY3Rvcl90IHNhdmVkX3N0YXJ0OworCisJCQlzYXZlZF9zdGFydCA9IHN0YXJ0OworCQkJc3RhcnQgPSByZWFkX2ludChjcm91bmQoc2F2ZWRfc3RhcnQpLCBjcm91bmQoc2F2ZWRfc3RhcnQpLCBjcm91bmQobGltaXQpLCAwLCBtZXNnKTsKKwkJCWlmIChkaXNwbGF5X2luX2N5bF91bml0cykgeworCQkJCXN0YXJ0ID0gKHN0YXJ0IC0gMSkgKiB1bml0c19wZXJfc2VjdG9yOworCQkJCWlmIChzdGFydCA8IHNhdmVkX3N0YXJ0KQorCQkJCQlzdGFydCA9IHNhdmVkX3N0YXJ0OworCQkJfQorCQkJbnVtX3JlYWQgPSAxOworCQl9CisJfSB3aGlsZSAoc3RhcnQgIT0gdGVtcCB8fCAhbnVtX3JlYWQpOworCWlmIChuID4gNCkgeyAgICAgICAgICAgICAgICAgICAgLyogTk9UIGZvciBmaWZ0aCBwYXJ0aXRpb24gKi8KKwkJc3RydWN0IHB0ZSAqcGUgPSAmcHRlc1tuXTsKKworCQlwZS0+b2Zmc2V0X2Zyb21fZGV2X3N0YXJ0ID0gc3RhcnQgLSBzZWN0b3Jfb2Zmc2V0OworCQlpZiAocGUtPm9mZnNldF9mcm9tX2Rldl9zdGFydCA9PSBleHRlbmRlZF9vZmZzZXQpIHsgLyogbXVzdCBiZSBjb3JyZWN0ZWQgKi8KKwkJCXBlLT5vZmZzZXRfZnJvbV9kZXZfc3RhcnQrKzsKKwkJCWlmIChzZWN0b3Jfb2Zmc2V0ID09IDEpCisJCQkJc3RhcnQrKzsKKwkJfQorCX0KKworCWZvciAoaSA9IDA7IGkgPCBnX3BhcnRpdGlvbnM7IGkrKykgeworCQlzdHJ1Y3QgcHRlICpwZSA9ICZwdGVzW2ldOworCisJCWlmIChzdGFydCA8IHBlLT5vZmZzZXRfZnJvbV9kZXZfc3RhcnQgJiYgbGltaXQgPj0gcGUtPm9mZnNldF9mcm9tX2Rldl9zdGFydCkKKwkJCWxpbWl0ID0gcGUtPm9mZnNldF9mcm9tX2Rldl9zdGFydCAtIDE7CisJCWlmIChzdGFydCA8IGZpcnN0W2ldICYmIGxpbWl0ID49IGZpcnN0W2ldKQorCQkJbGltaXQgPSBmaXJzdFtpXSAtIDE7CisJfQorCWlmIChzdGFydCA+IGxpbWl0KSB7CisJCXB1dHMoIk5vIGZyZWUgc2VjdG9ycyBhdmFpbGFibGUiKTsKKwkJaWYgKG4gPiA0KQorCQkJZ19wYXJ0aXRpb25zLS07CisJCXJldHVybjsKKwl9CisJaWYgKGNyb3VuZChzdGFydCkgPT0gY3JvdW5kKGxpbWl0KSkgeworCQlzdG9wID0gbGltaXQ7CisJfSBlbHNlIHsKKwkJc25wcmludGYobWVzZywgc2l6ZW9mKG1lc2cpLAorCQkJICJMYXN0ICVzIG9yICtzaXplIG9yICtzaXplTSBvciArc2l6ZUsiLAorCQkJIHN0cl91bml0cyhTSU5HVUxBUikpOworCQlzdG9wID0gcmVhZF9pbnQoY3JvdW5kKHN0YXJ0KSwgY3JvdW5kKGxpbWl0KSwgY3JvdW5kKGxpbWl0KSwgY3JvdW5kKHN0YXJ0KSwgbWVzZyk7CisJCWlmIChkaXNwbGF5X2luX2N5bF91bml0cykgeworCQkJc3RvcCA9IHN0b3AgKiB1bml0c19wZXJfc2VjdG9yIC0gMTsKKwkJCWlmIChzdG9wID5saW1pdCkKKwkJCQlzdG9wID0gbGltaXQ7CisJCX0KKwl9CisKKwlzZXRfcGFydGl0aW9uKG4sIDAsIHN0YXJ0LCBzdG9wLCBzeXMpOworCWlmIChuID4gNCkKKwkJc2V0X3BhcnRpdGlvbihuIC0gMSwgMSwgcHRlc1tuXS5vZmZzZXRfZnJvbV9kZXZfc3RhcnQsIHN0b3AsIEVYVEVOREVEKTsKKworCWlmIChJU19FWFRFTkRFRChzeXMpKSB7CisJCXN0cnVjdCBwdGUgKnBlNCA9ICZwdGVzWzRdOworCQlzdHJ1Y3QgcHRlICpwZW4gPSAmcHRlc1tuXTsKKworCQlleHRfaW5kZXggPSBuOworCQlwZW4tPmV4dF9wb2ludGVyID0gcDsKKwkJcGU0LT5vZmZzZXRfZnJvbV9kZXZfc3RhcnQgPSBleHRlbmRlZF9vZmZzZXQgPSBzdGFydDsKKwkJcGU0LT5zZWN0b3JidWZmZXIgPSB4emFsbG9jKHNlY3Rvcl9zaXplKTsKKwkJcGU0LT5wYXJ0X3RhYmxlID0gcHRfb2Zmc2V0KHBlNC0+c2VjdG9yYnVmZmVyLCAwKTsKKwkJcGU0LT5leHRfcG9pbnRlciA9IHBlNC0+cGFydF90YWJsZSArIDE7CisJCXBlNC0+Y2hhbmdlZCA9IDE7CisJCWdfcGFydGl0aW9ucyA9IDU7CisJfQorfQorCitzdGF0aWMgdm9pZAorYWRkX2xvZ2ljYWwodm9pZCkKK3sKKwlpZiAoZ19wYXJ0aXRpb25zID4gNSB8fCBwdGVzWzRdLnBhcnRfdGFibGUtPnN5c19pbmQpIHsKKwkJc3RydWN0IHB0ZSAqcGUgPSAmcHRlc1tnX3BhcnRpdGlvbnNdOworCisJCXBlLT5zZWN0b3JidWZmZXIgPSB4emFsbG9jKHNlY3Rvcl9zaXplKTsKKwkJcGUtPnBhcnRfdGFibGUgPSBwdF9vZmZzZXQocGUtPnNlY3RvcmJ1ZmZlciwgMCk7CisJCXBlLT5leHRfcG9pbnRlciA9IHBlLT5wYXJ0X3RhYmxlICsgMTsKKwkJcGUtPm9mZnNldF9mcm9tX2Rldl9zdGFydCA9IDA7CisJCXBlLT5jaGFuZ2VkID0gMTsKKwkJZ19wYXJ0aXRpb25zKys7CisJfQorCWFkZF9wYXJ0aXRpb24oZ19wYXJ0aXRpb25zIC0gMSwgTElOVVhfTkFUSVZFKTsKK30KKworc3RhdGljIHZvaWQKK25ld19wYXJ0aXRpb24odm9pZCkKK3sKKwlpbnQgaSwgZnJlZV9wcmltYXJ5ID0gMDsKKworCWlmICh3YXJuX2dlb21ldHJ5KCkpCisJCXJldHVybjsKKworCWlmIChMQUJFTF9JU19TVU4pIHsKKwkJYWRkX3N1bl9wYXJ0aXRpb24oZ2V0X3BhcnRpdGlvbigwLCBnX3BhcnRpdGlvbnMpLCBMSU5VWF9OQVRJVkUpOworCQlyZXR1cm47CisJfQorCWlmIChMQUJFTF9JU19TR0kpIHsKKwkJc2dpX2FkZF9wYXJ0aXRpb24oZ2V0X3BhcnRpdGlvbigwLCBnX3BhcnRpdGlvbnMpLCBMSU5VWF9OQVRJVkUpOworCQlyZXR1cm47CisJfQorCWlmIChMQUJFTF9JU19BSVgpIHsKKwkJcHV0cygiU29ycnkgLSB0aGlzIGZkaXNrIGNhbm5vdCBoYW5kbGUgQUlYIGRpc2sgbGFiZWxzLlxuIgorIklmIHlvdSB3YW50IHRvIGFkZCBET1MtdHlwZSBwYXJ0aXRpb25zLCBjcmVhdGUgYSBuZXcgZW1wdHkgRE9TIHBhcnRpdGlvblxuIgorInRhYmxlIGZpcnN0ICh1c2UgJ28nKS4gVGhpcyB3aWxsIGRlc3Ryb3kgdGhlIHByZXNlbnQgZGlzayBjb250ZW50cy4iKTsKKwkJcmV0dXJuOworCX0KKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspCisJCWZyZWVfcHJpbWFyeSArPSAhcHRlc1tpXS5wYXJ0X3RhYmxlLT5zeXNfaW5kOworCisJaWYgKCFmcmVlX3ByaW1hcnkgJiYgZ19wYXJ0aXRpb25zID49IE1BWElNVU1fUEFSVFMpIHsKKwkJcHV0cygiVGhlIG1heGltdW0gbnVtYmVyIG9mIHBhcnRpdGlvbnMgaGFzIGJlZW4gY3JlYXRlZCIpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFmcmVlX3ByaW1hcnkpIHsKKwkJaWYgKGV4dGVuZGVkX29mZnNldCkKKwkJCWFkZF9sb2dpY2FsKCk7CisJCWVsc2UKKwkJCXB1dHMoIllvdSBtdXN0IGRlbGV0ZSBzb21lIHBhcnRpdGlvbiBhbmQgYWRkICIKKwkJCQkgImFuIGV4dGVuZGVkIHBhcnRpdGlvbiBmaXJzdCIpOworCX0gZWxzZSB7CisJCWNoYXIgYywgbGluZVs4MF07CisJCXNucHJpbnRmKGxpbmUsIHNpemVvZihsaW5lKSwKKwkJCSJDb21tYW5kIGFjdGlvblxuIgorCQkJIiAgICVzXG4iCisJCQkiICAgcCAgIHByaW1hcnkgcGFydGl0aW9uICgxLTQpXG4iLAorCQkJKGV4dGVuZGVkX29mZnNldCA/CisJCQkibCAgIGxvZ2ljYWwgKDUgb3Igb3ZlcikiIDogImUgICBleHRlbmRlZCIpKTsKKwkJd2hpbGUgKDEpIHsKKwkJCWMgPSByZWFkX25vbmVtcHR5KGxpbmUpOworCQkJaWYgKChjIHwgMHgyMCkgPT0gJ3AnKSB7CisJCQkJaSA9IGdldF9ub25leGlzdGluZ19wYXJ0aXRpb24oMCwgNCk7CisJCQkJaWYgKGkgPj0gMCkKKwkJCQkJYWRkX3BhcnRpdGlvbihpLCBMSU5VWF9OQVRJVkUpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChjID09ICdsJyAmJiBleHRlbmRlZF9vZmZzZXQpIHsKKwkJCQlhZGRfbG9naWNhbCgpOworCQkJCXJldHVybjsKKwkJCX0KKwkJCWlmIChjID09ICdlJyAmJiAhZXh0ZW5kZWRfb2Zmc2V0KSB7CisJCQkJaSA9IGdldF9ub25leGlzdGluZ19wYXJ0aXRpb24oMCwgNCk7CisJCQkJaWYgKGkgPj0gMCkKKwkJCQkJYWRkX3BhcnRpdGlvbihpLCBFWFRFTkRFRCk7CisJCQkJcmV0dXJuOworCQkJfQorCQkJcHJpbnRmKCJJbnZhbGlkIHBhcnRpdGlvbiBudW1iZXIgIgorCQkJCQkgImZvciB0eXBlICclYydcbiIsIGMpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorcmVyZWFkX3BhcnRpdGlvbl90YWJsZShpbnQgbGVhdmUpCit7CisJaW50IGk7CisKKwlwdXRzKCJDYWxsaW5nIGlvY3RsKCkgdG8gcmUtcmVhZCBwYXJ0aXRpb24gdGFibGUiKTsKKwlzeW5jKCk7CisJLyogVXNlcnMgd2l0aCBzbG93IGV4dGVybmFsIFVTQiBkaXNrcyBvbiBhIDMyME1IeiBBUk0gc3lzdGVtICh5ZWFyIDIwMTEpCisJICogcmVwb3J0IHRoYXQgc2xlZXAgaXMgbmVlZGVkLCBvdGhlcndpc2UgQkxLUlJQQVJUIG1heSBmYWlsIHdpdGggLUVJTzoKKwkgKi8KKwlzbGVlcCgxKTsKKwlpID0gaW9jdGxfb3JfcGVycm9yKGRldl9mZCwgQkxLUlJQQVJULCBOVUxMLAorCQkJIldBUk5JTkc6IHJlcmVhZGluZyBwYXJ0aXRpb24gdGFibGUgIgorCQkJImZhaWxlZCwga2VybmVsIHN0aWxsIHVzZXMgb2xkIHRhYmxlIik7CisjaWYgMAorCWlmIChkb3NfY2hhbmdlZCkKKwkJcHV0cygKKwkJIlxuV0FSTklORzogSWYgeW91IGhhdmUgY3JlYXRlZCBvciBtb2RpZmllZCBhbnkgRE9TIDYueFxuIgorCQkicGFydGl0aW9ucywgcGxlYXNlIHNlZSB0aGUgZmRpc2sgbWFudWFsIHBhZ2UgZm9yIGFkZGl0aW9uYWxcbiIKKwkJImluZm9ybWF0aW9uIik7CisjZW5kaWYKKworCWlmIChsZWF2ZSkgeworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQljbG9zZV9kZXZfZmQoKTsKKwkJZXhpdChpICE9IDApOworCX0KK30KKworc3RhdGljIHZvaWQKK3dyaXRlX3RhYmxlKHZvaWQpCit7CisJaW50IGk7CisKKwlpZiAoTEFCRUxfSVNfRE9TKSB7CisJCWZvciAoaSA9IDA7IGkgPCAzOyBpKyspCisJCQlpZiAocHRlc1tpXS5jaGFuZ2VkKQorCQkJCXB0ZXNbM10uY2hhbmdlZCA9IDE7CisJCWZvciAoaSA9IDM7IGkgPCBnX3BhcnRpdGlvbnM7IGkrKykgeworCQkJc3RydWN0IHB0ZSAqcGUgPSAmcHRlc1tpXTsKKwkJCWlmIChwZS0+Y2hhbmdlZCkgeworCQkJCXdyaXRlX3BhcnRfdGFibGVfZmxhZyhwZS0+c2VjdG9yYnVmZmVyKTsKKwkJCQl3cml0ZV9zZWN0b3IocGUtPm9mZnNldF9mcm9tX2Rldl9zdGFydCwgcGUtPnNlY3RvcmJ1ZmZlcik7CisJCQl9CisJCX0KKwl9CisJZWxzZSBpZiAoTEFCRUxfSVNfU0dJKSB7CisJCS8qIG5vIHRlc3Qgb24gY2hhbmdlPyB0aGUgImFsdGVyZWQiIG1zZyBiZWxvdyBtaWdodCBiZSBtaXN0YWtlbiAqLworCQlzZ2lfd3JpdGVfdGFibGUoKTsKKwl9CisJZWxzZSBpZiAoTEFCRUxfSVNfU1VOKSB7CisJCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKKwkJCWlmIChwdGVzW2ldLmNoYW5nZWQpIHsKKwkJCQlzdW5fd3JpdGVfdGFibGUoKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCXB1dHMoIlRoZSBwYXJ0aXRpb24gdGFibGUgaGFzIGJlZW4gYWx0ZXJlZC4iKTsKKwlyZXJlYWRfcGFydGl0aW9uX3RhYmxlKDEpOworfQorI2VuZGlmIC8qIEZFQVRVUkVfRkRJU0tfV1JJVEFCTEUgKi8KKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX0FEVkFOQ0VECisjZGVmaW5lIE1BWF9QRVJfTElORSAgICAxNgorc3RhdGljIHZvaWQKK3ByaW50X2J1ZmZlcihjaGFyICpwYnVmZmVyKQoreworCWludCBpLGw7CisKKwlmb3IgKGkgPSAwLCBsID0gMDsgaSA8IHNlY3Rvcl9zaXplOyBpKyssIGwrKykgeworCQlpZiAobCA9PSAwKQorCQkJcHJpbnRmKCIweCUwM1g6IiwgaSk7CisJCXByaW50ZigiICUwMlgiLCAodW5zaWduZWQgY2hhcikgcGJ1ZmZlcltpXSk7CisJCWlmIChsID09IE1BWF9QRVJfTElORSAtIDEpIHsKKwkJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCQlsID0gLTE7CisJCX0KKwl9CisJaWYgKGwgPiAwKQorCQliYl9wdXRjaGFyKCdcbicpOworCWJiX3B1dGNoYXIoJ1xuJyk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9yYXcodm9pZCkKK3sKKwlpbnQgaTsKKworCXByaW50ZigiRGV2aWNlOiAlc1xuIiwgZGlza19kZXZpY2UpOworCWlmIChMQUJFTF9JU19TR0kgfHwgTEFCRUxfSVNfU1VOKQorCQlwcmludF9idWZmZXIoTUJSYnVmZmVyKTsKKwllbHNlIHsKKwkJZm9yIChpID0gMzsgaSA8IGdfcGFydGl0aW9uczsgaSsrKQorCQkJcHJpbnRfYnVmZmVyKHB0ZXNbaV0uc2VjdG9yYnVmZmVyKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCittb3ZlX2JlZ2luKHVuc2lnbmVkIGkpCit7CisJc3RydWN0IHB0ZSAqcGUgPSAmcHRlc1tpXTsKKwlzdHJ1Y3QgcGFydGl0aW9uICpwID0gcGUtPnBhcnRfdGFibGU7CisJc2VjdG9yX3QgbmV3LCBmaXJzdCwgbnJfc2VjdHM7CisKKwlpZiAod2Fybl9nZW9tZXRyeSgpKQorCQlyZXR1cm47CisJbnJfc2VjdHMgPSBnZXRfbnJfc2VjdHMocCk7CisJaWYgKCFwLT5zeXNfaW5kIHx8ICFucl9zZWN0cyB8fCBJU19FWFRFTkRFRChwLT5zeXNfaW5kKSkgeworCQlwcmludGYoIlBhcnRpdGlvbiAldSBoYXMgbm8gZGF0YSBhcmVhXG4iLCBpICsgMSk7CisJCXJldHVybjsKKwl9CisJZmlyc3QgPSBnZXRfcGFydGl0aW9uX3N0YXJ0X2Zyb21fZGV2X3N0YXJ0KHBlKTsgLyogPT0gcGUtPm9mZnNldF9mcm9tX2Rldl9zdGFydCArIGdldF9zdGFydF9zZWN0KHApICovCisJbmV3ID0gcmVhZF9pbnQoMCAvKndhczpmaXJzdCovLCBmaXJzdCwgZmlyc3QgKyBucl9zZWN0cyAtIDEsIGZpcnN0LCAiTmV3IGJlZ2lubmluZyBvZiBkYXRhIik7CisJaWYgKG5ldyAhPSBmaXJzdCkgeworCQlzZWN0b3JfdCBuZXdfcmVsYXRpdmUgPSBuZXcgLSBwZS0+b2Zmc2V0X2Zyb21fZGV2X3N0YXJ0OworCQlucl9zZWN0cyArPSAoZ2V0X3N0YXJ0X3NlY3QocCkgLSBuZXdfcmVsYXRpdmUpOworCQlzZXRfc3RhcnRfc2VjdChwLCBuZXdfcmVsYXRpdmUpOworCQlzZXRfbnJfc2VjdHMocCwgbnJfc2VjdHMpOworCQlyZWFkX25vbmVtcHR5KCJSZWNhbGN1bGF0ZSBDL0gvUyB2YWx1ZXM/IChZL04pOiAiKTsKKwkJaWYgKChsaW5lX3B0clswXSB8IDB4MjApID09ICd5JykKKwkJCXNldF9oc2Nfc3RhcnRfZW5kKHAsIG5ldywgbmV3ICsgbnJfc2VjdHMgLSAxKTsKKwkJcGUtPmNoYW5nZWQgPSAxOworCX0KK30KKworc3RhdGljIHZvaWQKK3hzZWxlY3Qodm9pZCkKK3sKKwljaGFyIGM7CisKKwl3aGlsZSAoMSkgeworCQliYl9wdXRjaGFyKCdcbicpOworCQljID0gMHgyMCB8IHJlYWRfbm9uZW1wdHkoIkV4cGVydCBjb21tYW5kIChtIGZvciBoZWxwKTogIik7CisJCXN3aXRjaCAoYykgeworCQljYXNlICdhJzoKKwkJCWlmIChMQUJFTF9JU19TVU4pCisJCQkJc3VuX3NldF9hbHRfY3lsKCk7CisJCQlicmVhazsKKwkJY2FzZSAnYic6CisJCQlpZiAoTEFCRUxfSVNfRE9TKQorCQkJCW1vdmVfYmVnaW4oZ2V0X3BhcnRpdGlvbigwLCBnX3BhcnRpdGlvbnMpKTsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCXVzZXJfY3lsaW5kZXJzID0gZ19jeWxpbmRlcnMgPQorCQkJCXJlYWRfaW50KDEsIGdfY3lsaW5kZXJzLCAxMDQ4NTc2LCAwLAorCQkJCQkiTnVtYmVyIG9mIGN5bGluZGVycyIpOworCQkJaWYgKExBQkVMX0lTX1NVTikKKwkJCQlzdW5fc2V0X25jeWwoZ19jeWxpbmRlcnMpOworCQkJaWYgKExBQkVMX0lTX0RPUykKKwkJCQl3YXJuX2N5bGluZGVycygpOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJcHJpbnRfcmF3KCk7CisJCQlicmVhazsKKwkJY2FzZSAnZSc6CisJCQlpZiAoTEFCRUxfSVNfU0dJKQorCQkJCXNnaV9zZXRfeGN5bCgpOworCQkJZWxzZSBpZiAoTEFCRUxfSVNfU1VOKQorCQkJCXN1bl9zZXRfeGN5bCgpOworCQkJZWxzZSBpZiAoTEFCRUxfSVNfRE9TKQorCQkJCXhfbGlzdF90YWJsZSgxKTsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCWlmIChMQUJFTF9JU19ET1MpCisJCQkJZml4X3BhcnRpdGlvbl90YWJsZV9vcmRlcigpOworCQkJYnJlYWs7CisJCWNhc2UgJ2cnOgorI2lmIEVOQUJMRV9GRUFUVVJFX1NHSV9MQUJFTAorCQkJY3JlYXRlX3NnaWxhYmVsKCk7CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJCXVzZXJfaGVhZHMgPSBnX2hlYWRzID0gcmVhZF9pbnQoMSwgZ19oZWFkcywgMjU2LCAwLCAiTnVtYmVyIG9mIGhlYWRzIik7CisJCQl1cGRhdGVfdW5pdHMoKTsKKwkJCWJyZWFrOworCQljYXNlICdpJzoKKwkJCWlmIChMQUJFTF9JU19TVU4pCisJCQkJc3VuX3NldF9pbGZhY3QoKTsKKwkJCWJyZWFrOworCQljYXNlICdvJzoKKwkJCWlmIChMQUJFTF9JU19TVU4pCisJCQkJc3VuX3NldF9yc3BlZWQoKTsKKwkJCWJyZWFrOworCQljYXNlICdwJzoKKwkJCWlmIChMQUJFTF9JU19TVU4pCisJCQkJbGlzdF90YWJsZSgxKTsKKwkJCWVsc2UKKwkJCQl4X2xpc3RfdGFibGUoMCk7CisJCQlicmVhazsKKwkJY2FzZSAncSc6CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJY2xvc2VfZGV2X2ZkKCk7CisJCQliYl9wdXRjaGFyKCdcbicpOworCQkJZXhpdChFWElUX1NVQ0NFU1MpOworCQljYXNlICdyJzoKKwkJCXJldHVybjsKKwkJY2FzZSAncyc6CisJCQl1c2VyX3NlY3RvcnMgPSBnX3NlY3RvcnMgPSByZWFkX2ludCgxLCBnX3NlY3RvcnMsIDYzLCAwLCAiTnVtYmVyIG9mIHNlY3RvcnMiKTsKKwkJCWlmIChkb3NfY29tcGF0aWJsZV9mbGFnKSB7CisJCQkJc2VjdG9yX29mZnNldCA9IGdfc2VjdG9yczsKKwkJCQlwdXRzKCJXYXJuaW5nOiBzZXR0aW5nIHNlY3RvciBvZmZzZXQgZm9yIERPUyAiCisJCQkJCSJjb21wYXRpYmxpdHkiKTsKKwkJCX0KKwkJCXVwZGF0ZV91bml0cygpOworCQkJYnJlYWs7CisJCWNhc2UgJ3YnOgorCQkJdmVyaWZ5KCk7CisJCQlicmVhazsKKwkJY2FzZSAndyc6CisJCQl3cml0ZV90YWJsZSgpOyAgLyogZG9lcyBub3QgcmV0dXJuICovCisJCQlicmVhazsKKwkJY2FzZSAneSc6CisJCQlpZiAoTEFCRUxfSVNfU1VOKQorCQkJCXN1bl9zZXRfcGN5bGNvdW50KCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXhtZW51KCk7CisJCX0KKwl9Cit9CisjZW5kaWYgLyogQURWQU5DRUQgbW9kZSAqLworCitzdGF0aWMgaW50Citpc19pZGVfY2Ryb21fb3JfdGFwZShjb25zdCBjaGFyICpkZXZpY2UpCit7CisJRklMRSAqcHJvY2Y7CisJY2hhciBidWZbMTAwXTsKKwlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCWludCBpc19pZGUgPSAwOworCisJLyogTm8gZGV2aWNlIHdhcyBnaXZlbiBleHBsaWNpdGx5LCBhbmQgd2UgYXJlIHRyeWluZyBzb21lCisJICAgbGlrZWx5IHRoaW5ncy4gIEJ1dCBvcGVuaW5nIC9kZXYvaGRjIG1heSBwcm9kdWNlIGVycm9ycyBsaWtlCisJICAgImhkYzogdHJheSBvcGVuIG9yIGRyaXZlIG5vdCByZWFkeSIKKwkgICBpZiBpdCBoYXBwZW5zIHRvIGJlIGEgQ0QtUk9NIGRyaXZlLiBJdCBldmVuIGhhcHBlbnMgdGhhdAorCSAgIHRoZSBwcm9jZXNzIGhhbmdzIG9uIHRoZSBhdHRlbXB0IHRvIHJlYWQgYSBtdXNpYyBDRC4KKwkgICBTbyB0cnkgdG8gYmUgY2FyZWZ1bC4gVGhpcyBvbmx5IHdvcmtzIHNpbmNlIDIuMS43My4gKi8KKworCWlmICghaXNfcHJlZml4ZWRfd2l0aChkZXZpY2UsICIvZGV2L2hkIikpCisJCXJldHVybiAwOworCisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIi9wcm9jL2lkZS8lcy9tZWRpYSIsIGRldmljZSs1KTsKKwlwcm9jZiA9IGZvcGVuX2Zvcl9yZWFkKGJ1Zik7CisJaWYgKHByb2NmICE9IE5VTEwgJiYgZmdldHMoYnVmLCBzaXplb2YoYnVmKSwgcHJvY2YpKQorCQlpc19pZGUgPSAoaXNfcHJlZml4ZWRfd2l0aChidWYsICJjZHJvbSIpIHx8CisJCQkgIGlzX3ByZWZpeGVkX3dpdGgoYnVmLCAidGFwZSIpKTsKKwllbHNlCisJCS8qIE5vdyB3aGVuIHRoaXMgcHJvYyBmaWxlIGRvZXMgbm90IGV4aXN0LCBza2lwIHRoZQorCQkgICBkZXZpY2Ugd2hlbiBpdCBpcyByZWFkLW9ubHkuICovCisJCWlmIChzdGF0KGRldmljZSwgJnN0YXRidWYpID09IDApCisJCQlpc19pZGUgPSAoKHN0YXRidWYuc3RfbW9kZSAmIDAyMjIpID09IDApOworCisJaWYgKHByb2NmKQorCQlmY2xvc2UocHJvY2YpOworCXJldHVybiBpc19pZGU7Cit9CisKKworc3RhdGljIHZvaWQKK29wZW5fbGlzdF9hbmRfY2xvc2UoY29uc3QgY2hhciAqZGV2aWNlLCBpbnQgdXNlcl9zcGVjaWZpZWQpCit7CisJaW50IGdiOworCisJZGlza19kZXZpY2UgPSBkZXZpY2U7CisJaWYgKHNldGptcChsaXN0aW5nYnVmKSkKKwkJcmV0dXJuOworCWlmICghdXNlcl9zcGVjaWZpZWQpCisJCWlmIChpc19pZGVfY2Ryb21fb3JfdGFwZShkZXZpY2UpKQorCQkJcmV0dXJuOworCisJLyogT3BlbiBkaXNrX2RldmljZSwgc2F2ZSBmaWxlIGRlc2NyaXB0b3IgdG8gZGV2X2ZkICovCisJZXJybm8gPSAwOworCWdiID0gZ2V0X2Jvb3QoVFJZX09OTFkpOworCWlmIChnYiA+IDApIHsgICAvKiBJL08gZXJyb3IgKi8KKwkJLyogSWdub3JlIG90aGVyIGVycm9ycywgc2luY2Ugd2UgdHJ5IElERQorCQkgICBhbmQgU0NTSSBoYXJkIGRpc2tzIHdoaWNoIG1heSBub3QgYmUKKwkJICAgaW5zdGFsbGVkIG9uIHRoZSBzeXN0ZW0uICovCisJCWlmICh1c2VyX3NwZWNpZmllZCB8fCBlcnJubyA9PSBFQUNDRVMpCisJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBvcGVuICclcyciLCBkZXZpY2UpOworCQlyZXR1cm47CisJfQorCisJaWYgKGdiIDwgMCkgeyAvKiBubyBET1Mgc2lnbmF0dXJlICovCisJCWxpc3RfZGlza19nZW9tZXRyeSgpOworCQlpZiAoTEFCRUxfSVNfQUlYKQorCQkJZ290byByZXQ7CisjaWYgRU5BQkxFX0ZFQVRVUkVfT1NGX0xBQkVMCisJCWlmIChic2RfdHJ5ZGV2KGRldmljZSkgPCAwKQorI2VuZGlmCisJCQlwcmludGYoIkRpc2sgJXMgZG9lc24ndCBjb250YWluIGEgdmFsaWQgIgorCQkJCSJwYXJ0aXRpb24gdGFibGVcbiIsIGRldmljZSk7CisJfSBlbHNlIHsKKwkJbGlzdF90YWJsZSgwKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorCQlpZiAoIUxBQkVMX0lTX1NVTiAmJiBnX3BhcnRpdGlvbnMgPiA0KSB7CisJCQlkZWxldGVfcGFydGl0aW9uKGV4dF9pbmRleCk7CisJCX0KKyNlbmRpZgorCX0KKyByZXQ6CisJY2xvc2VfZGV2X2ZkKCk7Cit9CisKKy8qIElzIGl0IGEgd2hvbGUgZGlzaz8gVGhlIGRpZ2l0IGNoZWNrIGlzIHN0aWxsIHVzZWZ1bAorICAgZm9yIFhlbiBkZXZpY2VzIGZvciBleGFtcGxlLiAqLworc3RhdGljIGludCBpc193aG9sZV9kaXNrKGNvbnN0IGNoYXIgKmRpc2spCit7CisJdW5zaWduZWQgbGVuOworCWludCBmZCA9IG9wZW4oZGlzaywgT19SRE9OTFkpOworCisJaWYgKGZkICE9IC0xKSB7CisJCXN0cnVjdCBoZF9nZW9tZXRyeSBnZW9tZXRyeTsKKwkJaW50IGVyciA9IGlvY3RsKGZkLCBIRElPX0dFVEdFTywgJmdlb21ldHJ5KTsKKwkJY2xvc2UoZmQpOworCQlpZiAoIWVycikKKwkJCXJldHVybiAoZ2VvbWV0cnkuc3RhcnQgPT0gMCk7CisJfQorCisJLyogVHJlYXQgIm5hbWVOIiBhcyBhIHBhcnRpdGlvbiBuYW1lLCBub3Qgd2hvbGUgZGlzayAqLworCS8qIG5vdGU6IG1tY2JsazAgc2hvdWxkIHdvcmsgZnJvbSB0aGUgZ2VvbWV0cnkgY2hlY2sgYWJvdmUgKi8KKwlsZW4gPSBzdHJsZW4oZGlzayk7CisJaWYgKGxlbiAhPSAwICYmIGlzZGlnaXQoZGlza1tsZW4gLSAxXSkpCisJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKKy8qIGZvciBmZGlzayAtbDogdHJ5IGFsbCB0aGluZ3MgaW4gL3Byb2MvcGFydGl0aW9ucworICAgdGhhdCBsb29rIGxpa2UgYSBwYXJ0aXRpb24gbmFtZSAoZG8gbm90IGVuZCBpbiBhIGRpZ2l0KSAqLworc3RhdGljIHZvaWQKK2xpc3RfZGV2c19pbl9wcm9jX3BhcnRpdGl0b25zKHZvaWQpCit7CisJRklMRSAqcHJvY3B0OworCWNoYXIgbGluZVsxMDBdLCBwdG5hbWVbMTAwXSwgZGV2bmFtZVsxMjBdOworCWludCBtYSwgbWksIHN6OworCisJcHJvY3B0ID0gZm9wZW5fb3Jfd2FybigiL3Byb2MvcGFydGl0aW9ucyIsICJyIik7CisKKwl3aGlsZSAoZmdldHMobGluZSwgc2l6ZW9mKGxpbmUpLCBwcm9jcHQpKSB7CisJCWlmIChzc2NhbmYobGluZSwgIiAldSAldSAldSAlW15cbiBdIiwKKwkJCQkmbWEsICZtaSwgJnN6LCBwdG5hbWUpICE9IDQpCisJCQljb250aW51ZTsKKworCQlzcHJpbnRmKGRldm5hbWUsICIvZGV2LyVzIiwgcHRuYW1lKTsKKwkJaWYgKGlzX3dob2xlX2Rpc2soZGV2bmFtZSkpCisJCQlvcGVuX2xpc3RfYW5kX2Nsb3NlKGRldm5hbWUsIDApOworCX0KKyNpZiBFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUAorCWZjbG9zZShwcm9jcHQpOworI2VuZGlmCit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19XUklUQUJMRQorc3RhdGljIHZvaWQKK3Vua25vd25fY29tbWFuZChpbnQgYykKK3sKKwlwcmludGYoIiVjOiB1bmtub3duIGNvbW1hbmRcbiIsIGMpOworfQorI2VuZGlmCisKK2ludCBmZGlza19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZmRpc2tfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIG9wdDsKKwkvKgorCSAqICBmZGlzayAtdgorCSAqICBmZGlzayAtbCBbLWIgc2VjdG9yc2l6ZV0gWy11XSBkZXZpY2UgLi4uCisJICogIGZkaXNrIC1zIFtwYXJ0aXRpb25dIC4uLgorCSAqICBmZGlzayBbLWIgc2VjdG9yc2l6ZV0gWy11XSBkZXZpY2UKKwkgKgorCSAqIE9wdGlvbnMgLUMsIC1ILCAtUyBzZXQgdGhlIGdlb21ldHJ5LgorCSAqLworCUlOSVRfRygpOworCisJY2xvc2VfZGV2X2ZkKCk7IC8qIG5lZWRlZDogZmQgMyBtdXN0IG5vdCBzdGF5IGNsb3NlZCAqLworCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiYis6Qys6SCs6UysiOyAvKiBudW1lcmljIHBhcmFtcyAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJiOkM6SDpsUzp1IiBJRl9GRUFUVVJFX0ZESVNLX0JMS1NJWkUoInMiKSwKKwkJCQkmc2VjdG9yX3NpemUsICZ1c2VyX2N5bGluZGVycywgJnVzZXJfaGVhZHMsICZ1c2VyX3NlY3RvcnMpOworCWFyZ3YgKz0gb3B0aW5kOworCWlmIChvcHQgJiBPUFRfYikgeworCQkvKiBVZ2x5OiB0aGlzIHNlY3RvciBzaXplIGlzIHJlYWxseSBwZXIgZGV2aWNlLAorCQkgKiBzbyBjYW5ub3QgYmUgY29tYmluZWQgd2l0aCBtdWx0aXBsZSBkaXNrcywKKwkJICogYW5kIHRoZSBzYW1lIGdvZXMgZm9yIHRoZSBDL0gvUyBvcHRpb25zLgorCQkgKi8KKwkJaWYgKHNlY3Rvcl9zaXplIDwgNTEyCisJCSB8fCBzZWN0b3Jfc2l6ZSA+IDB4MTAwMDAKKwkJIHx8IChzZWN0b3Jfc2l6ZSAmIChzZWN0b3Jfc2l6ZS0xKSkgLyogbm90IHBvd2VyIG9mIDIgKi8KKwkJKSB7CisJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKwkJc2VjdG9yX29mZnNldCA9IDI7CisJCXVzZXJfc2V0X3NlY3Rvcl9zaXplID0gMTsKKwl9CisJaWYgKHVzZXJfaGVhZHMgPD0gMCB8fCB1c2VyX2hlYWRzID49IDI1NikKKwkJdXNlcl9oZWFkcyA9IDA7CisJaWYgKHVzZXJfc2VjdG9ycyA8PSAwIHx8IHVzZXJfc2VjdG9ycyA+PSA2NCkKKwkJdXNlcl9zZWN0b3JzID0gMDsKKwlpZiAob3B0ICYgT1BUX3UpCisJCWRpc3BsYXlfaW5fY3lsX3VuaXRzID0gMDsgLy8gLXUKKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisJaWYgKG9wdCAmIE9QVF9sKSB7CisJCW5vd2FybiA9IDE7CisjZW5kaWYKKwkJaWYgKCphcmd2KSB7CisJCQlsaXN0aW5nID0gMTsKKwkJCWRvIHsKKwkJCQlvcGVuX2xpc3RfYW5kX2Nsb3NlKCphcmd2LCAxKTsKKwkJCX0gd2hpbGUgKCorK2FyZ3YpOworCQl9IGVsc2UgeworCQkJLyogd2UgZG9uJ3QgaGF2ZSBkZXZpY2UgbmFtZXMsICovCisJCQkvKiB1c2UgL3Byb2MvcGFydGl0aW9ucyBpbnN0ZWFkICovCisJCQlsaXN0X2RldnNfaW5fcHJvY19wYXJ0aXRpdG9ucygpOworCQl9CisJCXJldHVybiAwOworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisJfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19CTEtTSVpFCisJaWYgKG9wdCAmIE9QVF9zKSB7CisJCWludCBqOworCisJCW5vd2FybiA9IDE7CisJCWlmICghYXJndlswXSkKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJZm9yIChqID0gMDsgYXJndltqXTsgaisrKSB7CisJCQl1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZTsKKwkJCWZkID0geG9wZW4oYXJndltqXSwgT19SRE9OTFkpOworCQkJc2l6ZSA9IGJiX0JMS0dFVFNJWkVfc2VjdG9ycyhmZCkgLyAyOworCQkJY2xvc2UoZmQpOworCQkJaWYgKGFyZ3ZbMV0pCisJCQkJcHJpbnRmKCIlbGx1XG4iLCBzaXplKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiVzOiAlbGx1XG4iLCBhcmd2W2pdLCBzaXplKTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYKKworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX1dSSVRBQkxFCisJaWYgKCFhcmd2WzBdIHx8IGFyZ3ZbMV0pCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCWRpc2tfZGV2aWNlID0gYXJndlswXTsKKwlnZXRfYm9vdChPUEVOX01BSU4pOworCisJaWYgKExBQkVMX0lTX09TRikgeworCQkvKiBPU0YgbGFiZWwsIGFuZCBubyBET1MgbGFiZWwgKi8KKwkJcHJpbnRmKCJEZXRlY3RlZCBhbiBPU0YvMSBkaXNrbGFiZWwgb24gJXMsIGVudGVyaW5nICIKKwkJCSJkaXNrbGFiZWwgbW9kZVxuIiwgZGlza19kZXZpY2UpOworCQlic2Rfc2VsZWN0KCk7CisJCS8qV2h5IGRvIHdlIGRvIHRoaXM/ICBJdCBzZWVtcyB0byBiZSBjb3VudGVyLWludHVpdGl2ZSovCisJCWN1cnJlbnRfbGFiZWxfdHlwZSA9IExBQkVMX0RPUzsKKwkJLyogSWYgd2UgcmV0dXJuIHdlIG1heSB3YW50IHRvIG1ha2UgYW4gZW1wdHkgRE9TIGxhYmVsPyAqLworCX0KKworCXdoaWxlICgxKSB7CisJCWludCBjOworCQliYl9wdXRjaGFyKCdcbicpOworCQljID0gMHgyMCB8IHJlYWRfbm9uZW1wdHkoIkNvbW1hbmQgKG0gZm9yIGhlbHApOiAiKTsKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2EnOgorCQkJaWYgKExBQkVMX0lTX0RPUykKKwkJCQl0b2dnbGVfYWN0aXZlKGdldF9wYXJ0aXRpb24oMSwgZ19wYXJ0aXRpb25zKSk7CisJCQllbHNlIGlmIChMQUJFTF9JU19TVU4pCisJCQkJdG9nZ2xlX3N1bmZsYWdzKGdldF9wYXJ0aXRpb24oMSwgZ19wYXJ0aXRpb25zKSwKKwkJCQkJCTB4MDEpOworCQkJZWxzZSBpZiAoTEFCRUxfSVNfU0dJKQorCQkJCXNnaV9zZXRfYm9vdHBhcnRpdGlvbigKKwkJCQkJZ2V0X3BhcnRpdGlvbigxLCBnX3BhcnRpdGlvbnMpKTsKKwkJCWVsc2UKKwkJCQl1bmtub3duX2NvbW1hbmQoYyk7CisJCQlicmVhazsKKwkJY2FzZSAnYic6CisJCQlpZiAoTEFCRUxfSVNfU0dJKSB7CisJCQkJcHJpbnRmKCJcblRoZSBjdXJyZW50IGJvb3QgZmlsZSBpczogJXNcbiIsCisJCQkJCXNnaV9nZXRfYm9vdGZpbGUoKSk7CisJCQkJaWYgKHJlYWRfbWF5YmVfZW1wdHkoIlBsZWFzZSBlbnRlciB0aGUgbmFtZSBvZiB0aGUgIgorCQkJCQkJIm5ldyBib290IGZpbGU6ICIpID09ICdcbicpCisJCQkJCXB1dHMoIkJvb3QgZmlsZSB1bmNoYW5nZWQiKTsKKwkJCQllbHNlCisJCQkJCXNnaV9zZXRfYm9vdGZpbGUobGluZV9wdHIpOworCQkJfQorI2lmIEVOQUJMRV9GRUFUVVJFX09TRl9MQUJFTAorCQkJZWxzZQorCQkJCWJzZF9zZWxlY3QoKTsKKyNlbmRpZgorCQkJYnJlYWs7CisJCWNhc2UgJ2MnOgorCQkJaWYgKExBQkVMX0lTX0RPUykKKwkJCQl0b2dnbGVfZG9zX2NvbXBhdGliaWxpdHlfZmxhZygpOworCQkJZWxzZSBpZiAoTEFCRUxfSVNfU1VOKQorCQkJCXRvZ2dsZV9zdW5mbGFncyhnZXRfcGFydGl0aW9uKDEsIGdfcGFydGl0aW9ucyksCisJCQkJCQkweDEwKTsKKwkJCWVsc2UgaWYgKExBQkVMX0lTX1NHSSkKKwkJCQlzZ2lfc2V0X3N3YXBwYXJ0aXRpb24oCisJCQkJCQlnZXRfcGFydGl0aW9uKDEsIGdfcGFydGl0aW9ucykpOworCQkJZWxzZQorCQkJCXVua25vd25fY29tbWFuZChjKTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCXsKKwkJCQlpbnQgajsKKwkJCS8qIElmIHNnaV9sYWJlbCB0aGVuIGRvbid0IHVzZSBnZXRfZXhpc3RpbmdfcGFydGl0aW9uLAorCQkJICAgbGV0IHRoZSB1c2VyIHNlbGVjdCBhIHBhcnRpdGlvbiwgc2luY2UKKwkJCSAgIGdldF9leGlzdGluZ19wYXJ0aXRpb24oKSBvbmx5IHdvcmtzIGZvciBMaW51eC1saWtlCisJCQkgICBwYXJ0aXRpb24gdGFibGVzICovCisJCQkJaWYgKCFMQUJFTF9JU19TR0kpIHsKKwkJCQkJaiA9IGdldF9leGlzdGluZ19wYXJ0aXRpb24oMSwgZ19wYXJ0aXRpb25zKTsKKwkJCQl9IGVsc2UgeworCQkJCQlqID0gZ2V0X3BhcnRpdGlvbigxLCBnX3BhcnRpdGlvbnMpOworCQkJCX0KKwkJCQlpZiAoaiA+PSAwKQorCQkJCQlkZWxldGVfcGFydGl0aW9uKGopOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ2knOgorCQkJaWYgKExBQkVMX0lTX1NHSSkKKwkJCQljcmVhdGVfc2dpaW5mbygpOworCQkJZWxzZQorCQkJCXVua25vd25fY29tbWFuZChjKTsKKwkJY2FzZSAnbCc6CisJCQlsaXN0X3R5cGVzKGdldF9zeXNfdHlwZXMoKSk7CisJCQlicmVhazsKKwkJY2FzZSAnbSc6CisJCQltZW51KCk7CisJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQluZXdfcGFydGl0aW9uKCk7CisJCQlicmVhazsKKwkJY2FzZSAnbyc6CisJCQljcmVhdGVfZG9zbGFiZWwoKTsKKwkJCWJyZWFrOworCQljYXNlICdwJzoKKwkJCWxpc3RfdGFibGUoMCk7CisJCQlicmVhazsKKwkJY2FzZSAncSc6CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQkJY2xvc2VfZGV2X2ZkKCk7CisJCQliYl9wdXRjaGFyKCdcbicpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgJ3MnOgorI2lmIEVOQUJMRV9GRUFUVVJFX1NVTl9MQUJFTAorCQkJY3JlYXRlX3N1bmxhYmVsKCk7CisjZW5kaWYKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCWNoYW5nZV9zeXNpZCgpOworCQkJYnJlYWs7CisJCWNhc2UgJ3UnOgorCQkJY2hhbmdlX3VuaXRzKCk7CisJCQlicmVhazsKKwkJY2FzZSAndic6CisJCQl2ZXJpZnkoKTsKKwkJCWJyZWFrOworCQljYXNlICd3JzoKKwkJCXdyaXRlX3RhYmxlKCk7ICAvKiBkb2VzIG5vdCByZXR1cm4gKi8KKwkJCWJyZWFrOworI2lmIEVOQUJMRV9GRUFUVVJFX0ZESVNLX0FEVkFOQ0VECisJCWNhc2UgJ3gnOgorCQkJaWYgKExBQkVMX0lTX1NHSSkgeworCQkJCXB1dHMoIlxuXHRTb3JyeSwgbm8gZXhwZXJ0cyBtZW51IGZvciBTR0kgIgorCQkJCQkicGFydGl0aW9uIHRhYmxlcyBhdmFpbGFibGVcbiIpOworCQkJfSBlbHNlCisJCQkJeHNlbGVjdCgpOworCQkJYnJlYWs7CisjZW5kaWYKKwkJZGVmYXVsdDoKKwkJCXVua25vd25fY29tbWFuZChjKTsKKwkJCW1lbnUoKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKKyNlbmRpZiAvKiBGRUFUVVJFX0ZESVNLX1dSSVRBQkxFICovCit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2ZkaXNrX2FpeC5jIGIvdXRpbC1saW51eC9mZGlza19haXguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTVkZjUwCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9mZGlza19haXguYwpAQCAtMCwwICsxLDc0IEBACisjaWYgRU5BQkxFX0ZFQVRVUkVfQUlYX0xBQkVMCisvKgorICogQ29weXJpZ2h0IChDKSBBbmRyZWFzIE5ldXBlciwgU2VwIDE5OTguCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisJdW5zaWduZWQgaW50ICAgbWFnaWM7ICAgICAgICAvKiBleHBlY3QgQUlYX0xBQkVMX01BR0lDICovCisJdW5zaWduZWQgaW50ICAgZmlsbGJ5dGVzMVsxMjRdOworCXVuc2lnbmVkIGludCAgIHBoeXNpY2FsX3ZvbHVtZV9pZDsKKwl1bnNpZ25lZCBpbnQgICBmaWxsYnl0ZXMyWzEyNF07Cit9IGFpeF9wYXJ0aXRpb247CisKKyNkZWZpbmUgQUlYX0xBQkVMX01BR0lDICAgICAgICAgMHhjOWMyZDRjMQorI2RlZmluZSBBSVhfTEFCRUxfTUFHSUNfU1dBUFBFRCAweGMxZDRjMmM5CisjZGVmaW5lIEFJWF9JTkZPX01BR0lDICAgICAgICAgIDB4MDAwNzI5NTkKKyNkZWZpbmUgQUlYX0lORk9fTUFHSUNfU1dBUFBFRCAgMHg1OTI5MDcwMAorCisjZGVmaW5lIGFpeGxhYmVsICgoYWl4X3BhcnRpdGlvbiAqKU1CUmJ1ZmZlcikKKworCisvKgorICBDaGFuZ2VzOgorICAqIDE5OTktMDMtMjAgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgICogICAgIEludGVybmF0aW9uYWxpemF0aW9uCisgICoKKyAgKiAyMDAzLTAzLTIwIFBoaWxsaXAgS2VzbGluZyA8cGtlc2xpbmdAc2dpLmNvbT4KKyAgKiAgICAgIFNvbWUgZml4ZXMKKyovCisKK3N0YXRpYyBzbWFsbGludCBhaXhfb3RoZXJfZW5kaWFuOyAvKiBib29sICovCitzdGF0aWMgc21hbGxpbnQgYWl4X3ZvbHVtZXMgPSAxOyAvKiBtYXggMTUgKi8KKworLyoKKyAqIG9ubHkgZGVhbGluZyB3aXRoIGZyZWUgYmxvY2tzIGhlcmUKKyAqLworCitzdGF0aWMgdm9pZAorYWl4X2luZm8odm9pZCkKK3sKKwlwdXRzKCJcbiIKKyJUaGVyZSBpcyBhIHZhbGlkIEFJWCBsYWJlbCBvbiB0aGlzIGRpc2suXG4iCisiVW5mb3J0dW5hdGVseSBMaW51eCBjYW5ub3QgaGFuZGxlIHRoZXNlIGRpc2tzIGF0IHRoZSBtb21lbnQuXG4iCisiTmV2ZXJ0aGVsZXNzIHNvbWUgYWR2aWNlOlxuIgorIjEuIGZkaXNrIHdpbGwgZGVzdHJveSBpdHMgY29udGVudHMgb24gd3JpdGUuXG4iCisiMi4gQmUgc3VyZSB0aGF0IHRoaXMgZGlzayBpcyBOT1QgYSBzdGlsbCB2aXRhbCBwYXJ0IG9mIGEgdm9sdW1lIGdyb3VwLlxuIgorIiAgIChPdGhlcndpc2UgeW91IG1heSBlcmFzZSB0aGUgb3RoZXIgZGlza3MgYXMgd2VsbCwgaWYgdW5taXJyb3JlZC4pXG4iCisiMy4gQmVmb3JlIGRlbGV0aW5nIHRoaXMgcGh5c2ljYWwgdm9sdW1lIGJlIHN1cmUgdG8gcmVtb3ZlIHRoZSBkaXNrXG4iCisiICAgbG9naWNhbGx5IGZyb20geW91ciBBSVggbWFjaGluZS4gKE90aGVyd2lzZSB5b3UgYmVjb21lIGFuIEFJWHBlcnQpLlxuIgorCSk7Cit9CisKK3N0YXRpYyBpbnQKK2NoZWNrX2FpeF9sYWJlbCh2b2lkKQoreworCWlmIChhaXhsYWJlbC0+bWFnaWMgIT0gQUlYX0xBQkVMX01BR0lDCisJICYmIGFpeGxhYmVsLT5tYWdpYyAhPSBBSVhfTEFCRUxfTUFHSUNfU1dBUFBFRAorCSkgeworCQljdXJyZW50X2xhYmVsX3R5cGUgPSAwOworCQlhaXhfb3RoZXJfZW5kaWFuID0gMDsKKwkJcmV0dXJuIDA7CisJfQorCWFpeF9vdGhlcl9lbmRpYW4gPSAoYWl4bGFiZWwtPm1hZ2ljID09IEFJWF9MQUJFTF9NQUdJQ19TV0FQUEVEKTsKKwl1cGRhdGVfdW5pdHMoKTsKKwljdXJyZW50X2xhYmVsX3R5cGUgPSBMQUJFTF9BSVg7CisJZ19wYXJ0aXRpb25zID0gMTAxNjsKKwlhaXhfdm9sdW1lcyA9IDE1OworCWFpeF9pbmZvKCk7CisJLyphaXhfbm9sYWJlbCgpOyovICAgICAgICAgICAgICAvKiAlJSAqLworCS8qYWl4X2xhYmVsID0gMTsqLyAgICAgICAgICAgICAgLyogJSUgKi8KKwlyZXR1cm4gMTsKK30KKyNlbmRpZiAgLyogQUlYX0xBQkVMICovCmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2ZkaXNrX2dwdC5jIGIvdXRpbC1saW51eC9mZGlza19ncHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTVlMjI3Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9mZGlza19ncHQuYwpAQCAtMCwwICsxLDE5MyBAQAorI2lmIEVOQUJMRV9GRUFUVVJFX0dQVF9MQUJFTAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBLZXZpbiBDZXJuZWtlZSA8Y2VybmVrZWVAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworI2RlZmluZSBHUFRfTUFHSUMgMHg1NDUyNDE1MDIwNDk0NjQ1VUxMCitlbnVtIHsKKwlMRUdBQ1lfR1BUX1RZUEUgPSAweGVlLAorCUdQVF9NQVhfUEFSVFMgICA9IDI1NiwKKwlHUFRfTUFYX1BBUlRfRU5UUllfTEVOID0gNDA5NiwKKwlHVUlEX0xFTiAgICAgICAgPSAxNiwKK307CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1aW50NjRfdCBtYWdpYzsKKwl1aW50MzJfdCByZXZpc2lvbjsKKwl1aW50MzJfdCBoZHJfc2l6ZTsKKwl1aW50MzJfdCBoZHJfY3JjMzI7CisJdWludDMyX3QgcmVzZXJ2ZWQ7CisJdWludDY0X3QgY3VycmVudF9sYmE7CisJdWludDY0X3QgYmFja3VwX2xiYTsKKwl1aW50NjRfdCBmaXJzdF91c2FibGVfbGJhOworCXVpbnQ2NF90IGxhc3RfdXNhYmxlX2xiYTsKKwl1aW50OF90ICBkaXNrX2d1aWRbR1VJRF9MRU5dOworCXVpbnQ2NF90IGZpcnN0X3BhcnRfbGJhOworCXVpbnQzMl90IG5fcGFydHM7CisJdWludDMyX3QgcGFydF9lbnRyeV9sZW47CisJdWludDMyX3QgcGFydF9hcnJheV9jcmMzMjsKK30gZ3B0X2hlYWRlcjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVpbnQ4X3QgIHR5cGVfZ3VpZFtHVUlEX0xFTl07CisJdWludDhfdCAgcGFydF9ndWlkW0dVSURfTEVOXTsKKwl1aW50NjRfdCBsYmFfc3RhcnQ7CisJdWludDY0X3QgbGJhX2VuZDsKKwl1aW50NjRfdCBmbGFnczsKKwl1aW50MTZfdCBuYW1lWzM2XTsKK30gZ3B0X3BhcnRpdGlvbjsKKworc3RhdGljIGdwdF9oZWFkZXIgKmdwdF9oZHI7CisKK3N0YXRpYyBjaGFyICpwYXJ0X2FycmF5Oworc3RhdGljIHVuc2lnbmVkIGludCBuX3BhcnRzOworc3RhdGljIHVuc2lnbmVkIGludCBwYXJ0X2FycmF5X2xlbjsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGFydF9lbnRyeV9sZW47CisKK3N0YXRpYyBpbmxpbmUgZ3B0X3BhcnRpdGlvbiAqCitncHRfcGFydChpbnQgaSkKK3sKKwlpZiAoaSA+PSBuX3BhcnRzKSB7CisJCXJldHVybiBOVUxMOworCX0KKwlyZXR1cm4gKGdwdF9wYXJ0aXRpb24gKikmcGFydF9hcnJheVtpICogcGFydF9lbnRyeV9sZW5dOworfQorCitzdGF0aWMgdWludDMyX3QKK2dwdF9jcmMzMih2b2lkICpidWYsIGludCBsZW4pCit7CisJcmV0dXJuIH5jcmMzMl9ibG9ja19lbmRpYW4wKDB4ZmZmZmZmZmYsIGJ1ZiwgbGVuLCBnbG9iYWxfY3JjMzJfdGFibGUpOworfQorCitzdGF0aWMgdm9pZAorZ3B0X3ByaW50X2d1aWQodWludDhfdCAqYnVmKQoreworCXByaW50ZigKKwkJIiUwMnglMDJ4JTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMngtJTAyeCUwMnglMDJ4JTAyeCUwMnglMDJ4IiwKKwkJYnVmWzNdLCBidWZbMl0sIGJ1ZlsxXSwgYnVmWzBdLAorCQlidWZbNV0sIGJ1Zls0XSwKKwkJYnVmWzddLCBidWZbNl0sCisJCWJ1Zls4XSwgYnVmWzldLAorCQlidWZbMTBdLCBidWZbMTFdLCBidWZbMTJdLCBidWZbMTNdLCBidWZbMTRdLCBidWZbMTVdKTsKK30KKworLyogVE9ETzogcmVhbCB1bmljb2RlIHN1cHBvcnQgKi8KK3N0YXRpYyB2b2lkCitncHRfcHJpbnRfd2lkZSh1aW50MTZfdCAqcywgaW50IG1heF9sZW4pCit7CisJaW50IGkgPSAwOworCisJd2hpbGUgKGkgPCBtYXhfbGVuKSB7CisJCWlmICgqcyA9PSAwKQorCQkJcmV0dXJuOworCQlmcHV0Yygqcywgc3Rkb3V0KTsKKwkJcysrOworCX0KK30KKworc3RhdGljIHZvaWQKK2dwdF9saXN0X3RhYmxlKGludCB4dHJhIFVOVVNFRF9QQVJBTSkKK3sKKwlpbnQgaTsKKwljaGFyIG51bXN0cjZbNl07CisKKwlzbWFydF91bGx0b2E1KHRvdGFsX251bWJlcl9vZl9zZWN0b3JzICogc2VjdG9yX3NpemUsIG51bXN0cjYsICIgS01HVFBFWlkiKVswXSA9ICdcMCc7CisJcHJpbnRmKCJEaXNrICVzOiAlbGx1IHNlY3RvcnMsICVzXG4iLCBkaXNrX2RldmljZSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZyl0b3RhbF9udW1iZXJfb2Zfc2VjdG9ycywKKwkJbnVtc3RyNik7CisJcHJpbnRmKCJMb2dpY2FsIHNlY3RvciBzaXplOiAldVxuIiwgc2VjdG9yX3NpemUpOworCXByaW50ZigiRGlzayBpZGVudGlmaWVyIChHVUlEKTogIik7CisJZ3B0X3ByaW50X2d1aWQoZ3B0X2hkci0+ZGlza19ndWlkKTsKKwlwcmludGYoIlxuUGFydGl0aW9uIHRhYmxlIGhvbGRzIHVwIHRvICV1IGVudHJpZXNcbiIsCisJCShpbnQpU1dBUF9MRTMyKGdwdF9oZHItPm5fcGFydHMpKTsKKwlwcmludGYoIkZpcnN0IHVzYWJsZSBzZWN0b3IgaXMgJWxsdSwgbGFzdCB1c2FibGUgc2VjdG9yIGlzICVsbHVcblxuIiwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZylTV0FQX0xFNjQoZ3B0X2hkci0+Zmlyc3RfdXNhYmxlX2xiYSksCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpU1dBUF9MRTY0KGdwdF9oZHItPmxhc3RfdXNhYmxlX2xiYSkpOworCisJcHV0cygiTnVtYmVyICBTdGFydCAoc2VjdG9yKSAgICBFbmQgKHNlY3RvcikgIFNpemUgICAgICAgQ29kZSAgTmFtZSIpOworCWZvciAoaSA9IDA7IGkgPCBuX3BhcnRzOyBpKyspIHsKKwkJZ3B0X3BhcnRpdGlvbiAqcCA9IGdwdF9wYXJ0KGkpOworCQlpZiAocC0+bGJhX3N0YXJ0KSB7CisJCQlzbWFydF91bGx0b2E1KCgxICsgU1dBUF9MRTY0KHAtPmxiYV9lbmQpIC0gU1dBUF9MRTY0KHAtPmxiYV9zdGFydCkpICogc2VjdG9yX3NpemUsCisJCQkJbnVtc3RyNiwgIiBLTUdUUEVaWSIpWzBdID0gJ1wwJzsKKwkJCXByaW50ZigiJTR1ICUxNWxsdSAlMTVsbHUgJTExcyAgICUwNHggICIsCisJCQkJaSArIDEsCisJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZylTV0FQX0xFNjQocC0+bGJhX3N0YXJ0KSwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKVNXQVBfTEU2NChwLT5sYmFfZW5kKSwKKwkJCQludW1zdHI2LAorCQkJCTB4MDcwMCAvKiBGSVhNRSAqLyk7CisJCQlncHRfcHJpbnRfd2lkZShwLT5uYW1lLCAxOCk7CisJCQliYl9wdXRjaGFyKCdcbicpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50CitjaGVja19ncHRfbGFiZWwodm9pZCkKK3sKKwlzdHJ1Y3QgcGFydGl0aW9uICpmaXJzdCA9IHB0X29mZnNldChNQlJidWZmZXIsIDApOworCXN0cnVjdCBwdGUgcGU7CisJdWludDMyX3QgY3JjOworCisJLyogTEJBIDAgY29udGFpbnMgdGhlIGxlZ2FjeSBNQlIgKi8KKworCWlmICghdmFsaWRfcGFydF90YWJsZV9mbGFnKE1CUmJ1ZmZlcikKKwkgfHwgZmlyc3QtPnN5c19pbmQgIT0gTEVHQUNZX0dQVF9UWVBFCisJKSB7CisJCWN1cnJlbnRfbGFiZWxfdHlwZSA9IDA7CisJCXJldHVybiAwOworCX0KKworCS8qIExCQSAxIGNvbnRhaW5zIHRoZSBHUFQgaGVhZGVyICovCisKKwlyZWFkX3B0ZSgmcGUsIDEpOworCWdwdF9oZHIgPSAodm9pZCAqKXBlLnNlY3RvcmJ1ZmZlcjsKKworCWlmIChncHRfaGRyLT5tYWdpYyAhPSBTV0FQX0xFNjQoR1BUX01BR0lDKSkgeworCQljdXJyZW50X2xhYmVsX3R5cGUgPSAwOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWdsb2JhbF9jcmMzMl90YWJsZSkgeworCQlnbG9iYWxfY3JjMzJfdGFibGUgPSBjcmMzMl9maWxsdGFibGUoTlVMTCwgMCk7CisJfQorCisJY3JjID0gU1dBUF9MRTMyKGdwdF9oZHItPmhkcl9jcmMzMik7CisJZ3B0X2hkci0+aGRyX2NyYzMyID0gMDsKKwlpZiAoZ3B0X2NyYzMyKGdwdF9oZHIsIFNXQVBfTEUzMihncHRfaGRyLT5oZHJfc2l6ZSkpICE9IGNyYykgeworCQkvKiBGSVhNRTogcmVhZCB0aGUgYmFja3VwIHRhYmxlICovCisJCXB1dHMoIlxud2FybmluZzogR1BUIGhlYWRlciBDUkMgaXMgaW52YWxpZFxuIik7CisJfQorCisJbl9wYXJ0cyA9IFNXQVBfTEUzMihncHRfaGRyLT5uX3BhcnRzKTsKKwlwYXJ0X2VudHJ5X2xlbiA9IFNXQVBfTEUzMihncHRfaGRyLT5wYXJ0X2VudHJ5X2xlbik7CisJaWYgKG5fcGFydHMgPiBHUFRfTUFYX1BBUlRTCisJIHx8IHBhcnRfZW50cnlfbGVuID4gR1BUX01BWF9QQVJUX0VOVFJZX0xFTgorCSB8fCBTV0FQX0xFMzIoZ3B0X2hkci0+aGRyX3NpemUpID4gc2VjdG9yX3NpemUKKwkpIHsKKwkJcHV0cygiXG53YXJuaW5nOiB1bmFibGUgdG8gcGFyc2UgR1BUIGRpc2tsYWJlbFxuIik7CisJCWN1cnJlbnRfbGFiZWxfdHlwZSA9IDA7CisJCXJldHVybiAwOworCX0KKworCXBhcnRfYXJyYXlfbGVuID0gbl9wYXJ0cyAqIHBhcnRfZW50cnlfbGVuOworCXBhcnRfYXJyYXkgPSB4bWFsbG9jKHBhcnRfYXJyYXlfbGVuKTsKKwlzZWVrX3NlY3RvcihTV0FQX0xFNjQoZ3B0X2hkci0+Zmlyc3RfcGFydF9sYmEpKTsKKwlpZiAoZnVsbF9yZWFkKGRldl9mZCwgcGFydF9hcnJheSwgcGFydF9hcnJheV9sZW4pICE9IHBhcnRfYXJyYXlfbGVuKSB7CisJCWZkaXNrX2ZhdGFsKHVuYWJsZV90b19yZWFkKTsKKwl9CisKKwlpZiAoZ3B0X2NyYzMyKHBhcnRfYXJyYXksIHBhcnRfYXJyYXlfbGVuKSAhPSBncHRfaGRyLT5wYXJ0X2FycmF5X2NyYzMyKSB7CisJCS8qIEZJWE1FOiByZWFkIHRoZSBiYWNrdXAgdGFibGUgKi8KKwkJcHV0cygiXG53YXJuaW5nOiBHUFQgYXJyYXkgQ1JDIGlzIGludmFsaWRcbiIpOworCX0KKworCXB1dHMoIkZvdW5kIHZhbGlkIEdQVCB3aXRoIHByb3RlY3RpdmUgTUJSOyB1c2luZyBHUFRcbiIpOworCisJY3VycmVudF9sYWJlbF90eXBlID0gTEFCRUxfR1BUOworCXJldHVybiAxOworfQorCisjZW5kaWYgLyogR1BUX0xBQkVMICovCmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2ZkaXNrX29zZi5jIGIvdXRpbC1saW51eC9mZGlza19vc2YuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjA0Y2ZjCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9mZGlza19vc2YuYwpAQCAtMCwwICsxLDEwNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDE5ODcsIDE5ODggUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLgorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIEFsbCBhZHZlcnRpc2luZyBtYXRlcmlhbHMgbWVudGlvbmluZyBmZWF0dXJlcyBvciB1c2Ugb2YgdGhpcyBzb2Z0d2FyZQorICogICAgbXVzdCBkaXNwbGF5IHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6CisgKiAgICAgIFRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlIFVuaXZlcnNpdHkgb2YKKyAqICAgICAgQ2FsaWZvcm5pYSwgQmVya2VsZXkgYW5kIGl0cyBjb250cmlidXRvcnMuCisgKiA0LiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBVbml2ZXJzaXR5IG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycworICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCisgKiAgICB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAorICogQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCisgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTAorICogREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMKKyAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQorICogSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QKKyAqIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkKKyAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKKyAqIFNVQ0ggREFNQUdFLgorICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9PU0ZfTEFCRUwKKworI2lmbmRlZiBCU0RfRElTS01BR0lDCisjZGVmaW5lIEJTRF9ESVNLTUFHSUMgICAgICgodWludDMyX3QpIDB4ODI1NjQ1NTcpCisjZW5kaWYKKworI2lmbmRlZiBCU0RfTUFYUEFSVElUSU9OUworI2RlZmluZSBCU0RfTUFYUEFSVElUSU9OUyAxNgorI2VuZGlmCisKKyNkZWZpbmUgQlNEX0xJTlVYX0JPT1RESVIgIi91c3IvdWNiL21kZWMiCisKKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykgXAorIHx8IGRlZmluZWQoX19wb3dlcnBjX18pIFwKKyB8fCBkZWZpbmVkKF9faWE2NF9fKSBcCisgfHwgZGVmaW5lZChfX2hwcGFfXykKKyMgZGVmaW5lIEJTRF9MQUJFTFNFQ1RPUiAgIDAKKyMgZGVmaW5lIEJTRF9MQUJFTE9GRlNFVCAgIDY0CisjZWxzZQorIyBkZWZpbmUgQlNEX0xBQkVMU0VDVE9SICAgMQorIyBkZWZpbmUgQlNEX0xBQkVMT0ZGU0VUICAgMAorI2VuZGlmCisKKyNkZWZpbmUgQlNEX0JCU0laRSAgICAgICAgODE5MiAgICAgICAgICAvKiBzaXplIG9mIGJvb3QgYXJlYSwgd2l0aCBsYWJlbCAqLworI2RlZmluZSBCU0RfU0JTSVpFICAgICAgICA4MTkyICAgICAgICAgIC8qIG1heCBzaXplIG9mIGZzIHN1cGVyYmxvY2sgKi8KKworc3RydWN0IHhic2RfZGlza2xhYmVsIHsKKwl1aW50MzJfdCAgIGRfbWFnaWM7ICAgICAgICAgICAgICAgIC8qIHRoZSBtYWdpYyBudW1iZXIgKi8KKwlpbnQxNl90ICAgIGRfdHlwZTsgICAgICAgICAgICAgICAgIC8qIGRyaXZlIHR5cGUgKi8KKwlpbnQxNl90ICAgIGRfc3VidHlwZTsgICAgICAgICAgICAgIC8qIGNvbnRyb2xsZXIvZF90eXBlIHNwZWNpZmljICovCisJY2hhciAgICAgICBkX3R5cGVuYW1lWzE2XTsgICAgICAgICAvKiB0eXBlIG5hbWUsIGUuZy4gImVhZ2xlIiAqLworCWNoYXIgICAgICAgZF9wYWNrbmFtZVsxNl07ICAgICAgICAgLyogcGFjayBpZGVudGlmaWVyICovCisJLyogZGlzayBnZW9tZXRyeTogKi8KKwl1aW50MzJfdCAgIGRfc2Vjc2l6ZTsgICAgICAgICAgICAgIC8qICMgb2YgYnl0ZXMgcGVyIHNlY3RvciAqLworCXVpbnQzMl90ICAgZF9uc2VjdG9yczsgICAgICAgICAgICAgLyogIyBvZiBkYXRhIHNlY3RvcnMgcGVyIHRyYWNrICovCisJdWludDMyX3QgICBkX250cmFja3M7ICAgICAgICAgICAgICAvKiAjIG9mIHRyYWNrcyBwZXIgY3lsaW5kZXIgKi8KKwl1aW50MzJfdCAgIGRfbmN5bGluZGVyczsgICAgICAgICAgIC8qICMgb2YgZGF0YSBjeWxpbmRlcnMgcGVyIHVuaXQgKi8KKwl1aW50MzJfdCAgIGRfc2VjcGVyY3lsOyAgICAgICAgICAgIC8qICMgb2YgZGF0YSBzZWN0b3JzIHBlciBjeWxpbmRlciAqLworCXVpbnQzMl90ICAgZF9zZWNwZXJ1bml0OyAgICAgICAgICAgLyogIyBvZiBkYXRhIHNlY3RvcnMgcGVyIHVuaXQgKi8KKwkvKgorCSAqIFNwYXJlcyAoYmFkIHNlY3RvciByZXBsYWNlbWVudHMpIGJlbG93CisJICogYXJlIG5vdCBjb3VudGVkIGluIGRfbnNlY3RvcnMgb3IgZF9zZWNwZXJjeWwuCisJICogU3BhcmUgc2VjdG9ycyBhcmUgYXNzdW1lZCB0byBiZSBwaHlzaWNhbCBzZWN0b3JzCisJICogd2hpY2ggb2NjdXB5IHNwYWNlIGF0IHRoZSBlbmQgb2YgZWFjaCB0cmFjayBhbmQvb3IgY3lsaW5kZXIuCisJICovCisJdWludDE2X3QgICBkX3NwYXJlc3BlcnRyYWNrOyAgICAgICAvKiAjIG9mIHNwYXJlIHNlY3RvcnMgcGVyIHRyYWNrICovCisJdWludDE2X3QgICBkX3NwYXJlc3BlcmN5bDsgICAgICAgICAvKiAjIG9mIHNwYXJlIHNlY3RvcnMgcGVyIGN5bGluZGVyICovCisJLyoKKwkgKiBBbHRlcm5hdGUgY3lsaW5kZXJzIGluY2x1ZGUgbWFpbnRlbmFuY2UsIHJlcGxhY2VtZW50LAorCSAqIGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb24gYXJlYXMsIGV0Yy4KKwkgKi8KKwl1aW50MzJfdCAgIGRfYWN5bGluZGVyczsgICAgICAgICAgIC8qICMgb2YgYWx0LiBjeWxpbmRlcnMgcGVyIHVuaXQgKi8KKworCS8qIGhhcmR3YXJlIGNoYXJhY3RlcmlzdGljczogKi8KKwkvKgorCSAqIGRfaW50ZXJsZWF2ZSwgZF90cmFja3NrZXcgYW5kIGRfY3lsc2tldyBkZXNjcmliZSBwZXJ0dXJiYXRpb25zCisJICogaW4gdGhlIG1lZGlhIGZvcm1hdCB1c2VkIHRvIGNvbXBlbnNhdGUgZm9yIGEgc2xvdyBjb250cm9sbGVyLgorCSAqIEludGVybGVhdmUgaXMgcGh5c2ljYWwgc2VjdG9yIGludGVybGVhdmUsIHNldCB1cCBieSB0aGUgZm9ybWF0dGVyCisJICogb3IgY29udHJvbGxlciB3aGVuIGZvcm1hdHRpbmcuICBXaGVuIGludGVybGVhdmluZyBpcyBpbiB1c2UsCisJICogbG9naWNhbGx5IGFkamFjZW50IHNlY3RvcnMgYXJlIG5vdCBwaHlzaWNhbGx5IGNvbnRpZ3VvdXMsCisJICogYnV0IGluc3RlYWQgYXJlIHNlcGFyYXRlZCBieSBzb21lIG51bWJlciBvZiBzZWN0b3JzLgorCSAqIEl0IGlzIHNwZWNpZmllZCBhcyB0aGUgcmF0aW8gb2YgcGh5c2ljYWwgc2VjdG9ycyB0cmF2ZXJzZWQKKwkgKiBwZXIgbG9naWNhbCBzZWN0b3IuICBUaHVzIGFuIGludGVybGVhdmUgb2YgMToxIGltcGxpZXMgY29udGlndW91cworCSAqIGxheW91dCwgd2hpbGUgMjoxIGltcGxpZXMgdGhhdCBsb2dpY2FsIHNlY3RvciAwIGlzIHNlcGFyYXRlZAorCSAqIGJ5IG9uZSBzZWN0b3IgZnJvbSBsb2dpY2FsIHNlY3RvciAxLgorCSAqIGRfdHJhY2tza2V3IGlzIHRoZSBvZmZzZXQgb2Ygc2VjdG9yIDAgb24gdHJhY2sgTgorCSAqIHJlbGF0aXZlIHRvIHNlY3RvciAwIG9uIHRyYWNrIE4tMSBvbiB0aGUgc2FtZSBjeWxpbmRlci4KKwkgKiBGaW5hbGx5LCBkX2N5bHNrZXcgaXMgdGhlIG9mZnNldCBvZiBzZWN0b3IgMCBvbiBjeWxpbmRlciBOCisJICogcmVsYXRpdmUgdG8gc2VjdG9yIDAgb24gY3lsaW5kZXIgTi0xLgorCSAqLworCXVpbnQxNl90ICAgZF9ycG07ICAgICAgICAgICAgICAgICAgLyogcm90YXRpb25hbCBzcGVlZCAqLworCXVpbnQxNl90ICAgZF9pbnRlcmxlYXZlOyAgICAgICAgICAgLyogaGFyZHdhcmUgc2VjdG9yIGludGVybGVhdmUgKi8KKwl1aW50MTZfdCAgIGRfdHJhY2tza2V3OyAgICAgICAgICAgIC8qIHNlY3RvciAwIHNrZXcsIHBlciB0cmFjayAqLworCXVpbnQxNl90ICAgZF9jeWxza2V3OyAgICAgICAgICAgICAgLyogc2VjdG9yIDAgc2tldywgcGVyIGN5bGluZGVyICovCisJdWludDMyX3QgICBkX2hlYWRzd2l0Y2g7ICAgICAgICAgICAvKiBoZWFkIHN3aXRjaCB0aW1lLCB1c2VjICovCisJdWludDMyX3QgICBkX3Rya3NlZWs7ICAgICAgICAgICAgICAvKiB0cmFjay10by10cmFjayBzZWVrLCB1c2VjICovCisJdWludDMyX3QgICBkX2ZsYWdzOyAgICAgICAgICAgICAgICAvKiBnZW5lcmljIGZsYWdzICovCisjZGVmaW5lIE5EREFUQSA1CisJdWludDMyX3QgICBkX2RyaXZlZGF0YVtORERBVEFdOyAgICAvKiBkcml2ZS10eXBlIHNwZWNpZmljIGluZm9ybWF0aW9uICovCisjZGVmaW5lIE5TUEFSRSA1CisJdWludDMyX3QgICBkX3NwYXJlW05TUEFSRV07ICAgICAgICAvKiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAqLworCXVpbnQzMl90ICAgZF9tYWdpYzI7ICAgICAgICAgICAgICAgLyogdGhlIG1hZ2ljIG51bWJlciAoYWdhaW4pICovCisJdWludDE2X3QgICBkX2NoZWNrc3VtOyAgICAgICAgICAgICAvKiB4b3Igb2YgZGF0YSBpbmNsLiBwYXJ0aXRpb25zICovCisJLyogZmlsZXN5c3RlbSBhbmQgcGFydGl0aW9uIGluZm9ybWF0aW9uOiAqLworCXVpbnQxNl90ICAgZF9ucGFydGl0aW9uczsgICAgICAgICAgLyogbnVtYmVyIG9mIHBhcnRpdGlvbnMgaW4gZm9sbG93aW5nICovCisJdWludDMyX3QgICBkX2Jic2l6ZTsgICAgICAgICAgICAgICAvKiBzaXplIG9mIGJvb3QgYXJlYSBhdCBzbjAsIGJ5dGVzICovCisJdWludDMyX3QgICBkX3Nic2l6ZTsgICAgICAgICAgICAgICAvKiBtYXggc2l6ZSBvZiBmcyBzdXBlcmJsb2NrLCBieXRlcyAqLworCXN0cnVjdCB4YnNkX3BhcnRpdGlvbiB7IC8qIHRoZSBwYXJ0aXRpb24gdGFibGUgKi8KKwkJdWludDMyX3QgICBwX3NpemU7ICAgICAgICAgLyogbnVtYmVyIG9mIHNlY3RvcnMgaW4gcGFydGl0aW9uICovCisJCXVpbnQzMl90ICAgcF9vZmZzZXQ7ICAgICAgIC8qIHN0YXJ0aW5nIHNlY3RvciAqLworCQl1aW50MzJfdCAgIHBfZnNpemU7ICAgICAgICAvKiBmaWxlc3lzdGVtIGJhc2ljIGZyYWdtZW50IHNpemUgKi8KKwkJdWludDhfdCAgICBwX2ZzdHlwZTsgICAgICAgLyogZmlsZXN5c3RlbSB0eXBlLCBzZWUgYmVsb3cgKi8KKwkJdWludDhfdCAgICBwX2ZyYWc7ICAgICAgICAgLyogZmlsZXN5c3RlbSBmcmFnbWVudHMgcGVyIGJsb2NrICovCisJCXVpbnQxNl90ICAgcF9jcGc7ICAgICAgICAgIC8qIGZpbGVzeXN0ZW0gY3lsaW5kZXJzIHBlciBncm91cCAqLworCX0gZF9wYXJ0aXRpb25zW0JTRF9NQVhQQVJUSVRJT05TXTsgLyogYWN0dWFsbHkgbWF5IGJlIG1vcmUgKi8KK307CisKKy8qIGRfdHlwZSB2YWx1ZXM6ICovCisjZGVmaW5lIEJTRF9EVFlQRV9TTUQgICAgICAgICAgIDEgICAgICAgICAgICAgICAvKiBTTUQsIFhTTUQ7IFZBWCBocC91cCAqLworI2RlZmluZSBCU0RfRFRZUEVfTVNDUCAgICAgICAgICAyICAgICAgICAgICAgICAgLyogTVNDUCAqLworI2RlZmluZSBCU0RfRFRZUEVfREVDICAgICAgICAgICAzICAgICAgICAgICAgICAgLyogb3RoZXIgREVDIChyaywgcmwpICovCisjZGVmaW5lIEJTRF9EVFlQRV9TQ1NJICAgICAgICAgIDQgICAgICAgICAgICAgICAvKiBTQ1NJICovCisjZGVmaW5lIEJTRF9EVFlQRV9FU0RJICAgICAgICAgIDUgICAgICAgICAgICAgICAvKiBFU0RJIGludGVyZmFjZSAqLworI2RlZmluZSBCU0RfRFRZUEVfU1Q1MDYgICAgICAgICA2ICAgICAgICAgICAgICAgLyogU1Q1MDYgZXRjLiAqLworI2RlZmluZSBCU0RfRFRZUEVfSFBJQiAgICAgICAgICA3ICAgICAgICAgICAgICAgLyogQ1MvODAgb24gSFAtSUIgKi8KKyNkZWZpbmUgQlNEX0RUWVBFX0hQRkwgICAgICAgICAgOCAgICAgICAgICAgICAgIC8qIEhQIEZpYmVyLWxpbmsgKi8KKyNkZWZpbmUgQlNEX0RUWVBFX0ZMT1BQWSAgICAgICAgMTAgICAgICAgICAgICAgIC8qIGZsb3BweSAqLworCisvKiBkX3N1YnR5cGUgdmFsdWVzOiAqLworI2RlZmluZSBCU0RfRFNUWVBFX0lORE9TUEFSVCAgICAweDggICAgICAgICAgICAgLyogaXMgaW5zaWRlIGRvcyBwYXJ0aXRpb24gKi8KKyNkZWZpbmUgQlNEX0RTVFlQRV9ET1NQQVJUKHMpICAgKChzKSAmIDMpICAgICAgIC8qIGRvcyBwYXJ0aXRpb24gbnVtYmVyICovCisjZGVmaW5lIEJTRF9EU1RZUEVfR0VPTUVUUlkgICAgIDB4MTAgICAgICAgICAgICAvKiBkcml2ZSBwYXJhbXMgaW4gbGFiZWwgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHhic2RfZGt0eXBlbmFtZXNbXSA9IHsKKwkidW5rbm93biIsCisJIlNNRCIsCisJIk1TQ1AiLAorCSJvbGQgREVDIiwKKwkiU0NTSSIsCisJIkVTREkiLAorCSJTVDUwNiIsCisJIkhQLUlCIiwKKwkiSFAtRkwiLAorCSJ0eXBlIDkiLAorCSJmbG9wcHkiLAorCTAKK307CisKKworLyoKKyAqIEZpbGVzeXN0ZW0gdHlwZSBhbmQgdmVyc2lvbi4KKyAqIFVzZWQgdG8gaW50ZXJwcmV0IG90aGVyIGZpbGVzeXN0ZW0tc3BlY2lmaWMKKyAqIHBlci1wYXJ0aXRpb24gaW5mb3JtYXRpb24uCisgKi8KKyNkZWZpbmUgQlNEX0ZTX1VOVVNFRCAgIDAgICAgICAgICAgICAgICAvKiB1bnVzZWQgKi8KKyNkZWZpbmUgQlNEX0ZTX1NXQVAgICAgIDEgICAgICAgICAgICAgICAvKiBzd2FwICovCisjZGVmaW5lIEJTRF9GU19WNiAgICAgICAyICAgICAgICAgICAgICAgLyogU2l4dGggRWRpdGlvbiAqLworI2RlZmluZSBCU0RfRlNfVjcgICAgICAgMyAgICAgICAgICAgICAgIC8qIFNldmVudGggRWRpdGlvbiAqLworI2RlZmluZSBCU0RfRlNfU1lTViAgICAgNCAgICAgICAgICAgICAgIC8qIFN5c3RlbSBWICovCisjZGVmaW5lIEJTRF9GU19WNzFLICAgICA1ICAgICAgICAgICAgICAgLyogVjcgd2l0aCAxSyBibG9ja3MgKDQuMSwgMi45KSAqLworI2RlZmluZSBCU0RfRlNfVjggICAgICAgNiAgICAgICAgICAgICAgIC8qIEVpZ2h0aCBFZGl0aW9uLCA0SyBibG9ja3MgKi8KKyNkZWZpbmUgQlNEX0ZTX0JTREZGUyAgIDcgICAgICAgICAgICAgICAvKiA0LjJCU0QgZmFzdCBmaWxlIHN5c3RlbSAqLworI2RlZmluZSBCU0RfRlNfQlNETEZTICAgOSAgICAgICAgICAgICAgIC8qIDQuNEJTRCBsb2ctc3RydWN0dXJlZCBmaWxlIHN5c3RlbSAqLworI2RlZmluZSBCU0RfRlNfT1RIRVIgICAgMTAgICAgICAgICAgICAgIC8qIGluIHVzZSwgYnV0IHVua25vd24vdW5zdXBwb3J0ZWQgKi8KKyNkZWZpbmUgQlNEX0ZTX0hQRlMgICAgIDExICAgICAgICAgICAgICAvKiBPUy8yIGhpZ2gtcGVyZm9ybWFuY2UgZmlsZSBzeXN0ZW0gKi8KKyNkZWZpbmUgQlNEX0ZTX0lTTzk2NjAgIDEyICAgICAgICAgICAgICAvKiBJU08tOTY2MCBmaWxlc3lzdGVtIChjZHJvbSkgKi8KKyNkZWZpbmUgQlNEX0ZTX0lTT0ZTICAgIEJTRF9GU19JU085NjYwCisjZGVmaW5lIEJTRF9GU19CT09UICAgICAxMyAgICAgICAgICAgICAgLyogcGFydGl0aW9uIGNvbnRhaW5zIGJvb3RzdHJhcCAqLworI2RlZmluZSBCU0RfRlNfQURPUyAgICAgMTQgICAgICAgICAgICAgIC8qIEFtaWdhRE9TIGZhc3QgZmlsZSBzeXN0ZW0gKi8KKyNkZWZpbmUgQlNEX0ZTX0hGUyAgICAgIDE1ICAgICAgICAgICAgICAvKiBNYWNpbnRvc2ggSEZTICovCisjZGVmaW5lIEJTRF9GU19BRFZGUyAgICAxNiAgICAgICAgICAgICAgLyogRGlnaXRhbCBVbml4IEFkdkZTICovCisKKy8qIHRoaXMgaXMgYW5ub3lpbmcsIGJ1dCBpdCdzIGFsc28gdGhlIHdheSBpdCBpcyA6LSggKi8KKyNpZmRlZiBfX2FscGhhX18KKyNkZWZpbmUgQlNEX0ZTX0VYVDIgICAgIDggICAgICAgICAgICAgICAvKiBleHQyIGZpbGUgc3lzdGVtICovCisjZWxzZQorI2RlZmluZSBCU0RfRlNfTVNET1MgICAgOCAgICAgICAgICAgICAgIC8qIE1TLURPUyBmaWxlIHN5c3RlbSAqLworI2VuZGlmCisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCB4YnNkX2ZzdHlwZXNbXSA9IHsKKwkiXHgwMCIgInVudXNlZCIsICAgICAgICAgICAgLyogQlNEX0ZTX1VOVVNFRCAgKi8KKwkiXHgwMSIgInN3YXAiLCAgICAgICAgICAgICAgLyogQlNEX0ZTX1NXQVAgICAgKi8KKwkiXHgwMiIgIlZlcnNpb24gNiIsICAgICAgICAgLyogQlNEX0ZTX1Y2ICAgICAgKi8KKwkiXHgwMyIgIlZlcnNpb24gNyIsICAgICAgICAgLyogQlNEX0ZTX1Y3ICAgICAgKi8KKwkiXHgwNCIgIlN5c3RlbSBWIiwgICAgICAgICAgLyogQlNEX0ZTX1NZU1YgICAgKi8KKwkiXHgwNSIgIjQuMUJTRCIsICAgICAgICAgICAgLyogQlNEX0ZTX1Y3MUsgICAgKi8KKwkiXHgwNiIgIkVpZ2h0aCBFZGl0aW9uIiwgICAgLyogQlNEX0ZTX1Y4ICAgICAgKi8KKwkiXHgwNyIgIjQuMkJTRCIsICAgICAgICAgICAgLyogQlNEX0ZTX0JTREZGUyAgKi8KKyNpZmRlZiBfX2FscGhhX18KKwkiXHgwOCIgImV4dDIiLCAgICAgICAgICAgICAgLyogQlNEX0ZTX0VYVDIgICAgKi8KKyNlbHNlCisJIlx4MDgiICJNUy1ET1MiLCAgICAgICAgICAgIC8qIEJTRF9GU19NU0RPUyAgICovCisjZW5kaWYKKwkiXHgwOSIgIjQuNExGUyIsICAgICAgICAgICAgLyogQlNEX0ZTX0JTRExGUyAgKi8KKwkiXHgwYSIgInVua25vd24iLCAgICAgICAgICAgLyogQlNEX0ZTX09USEVSICAgKi8KKwkiXHgwYiIgIkhQRlMiLCAgICAgICAgICAgICAgLyogQlNEX0ZTX0hQRlMgICAgKi8KKwkiXHgwYyIgIklTTy05NjYwIiwgICAgICAgICAgLyogQlNEX0ZTX0lTTzk2NjAgKi8KKwkiXHgwZCIgImJvb3QiLCAgICAgICAgICAgICAgLyogQlNEX0ZTX0JPT1QgICAgKi8KKwkiXHgwZSIgIkFET1MiLCAgICAgICAgICAgICAgLyogQlNEX0ZTX0FET1MgICAgKi8KKwkiXHgwZiIgIkhGUyIsICAgICAgICAgICAgICAgLyogQlNEX0ZTX0hGUyAgICAgKi8KKwkiXHgxMCIgIkFkdkZTIiwgICAgICAgICAgICAgLyogQlNEX0ZTX0FEVkZTICAgKi8KKwlOVUxMCit9OworCisKKy8qCisgKiBmbGFncyBzaGFyZWQgYnkgdmFyaW91cyBkcml2ZXM6CisgKi8KKyNkZWZpbmUgQlNEX0RfUkVNT1ZBQkxFIDB4MDEgICAgICAgICAgICAvKiByZW1vdmFibGUgbWVkaWEgKi8KKyNkZWZpbmUgQlNEX0RfRUNDICAgICAgIDB4MDIgICAgICAgICAgICAvKiBzdXBwb3J0cyBFQ0MgKi8KKyNkZWZpbmUgQlNEX0RfQkFEU0VDVCAgIDB4MDQgICAgICAgICAgICAvKiBzdXBwb3J0cyBiYWQgc2VjdG9yIGZvcncuICovCisjZGVmaW5lIEJTRF9EX1JBTURJU0sgICAweDA4ICAgICAgICAgICAgLyogZGlzayBlbXVsYXRvciAqLworI2RlZmluZSBCU0RfRF9DSEFJTiAgICAgMHgxMCAgICAgICAgICAgIC8qIGNhbiBkbyBiYWNrLWJhY2sgdHJhbnNmZXJzICovCisjZGVmaW5lIEJTRF9EX0RPU1BBUlQgICAweDIwICAgICAgICAgICAgLyogd2l0aGluIE1TRE9TIHBhcnRpdGlvbiAqLworCisvKgorICAgQ2hhbmdlczoKKyAgIDE5OTkwMzE5IC0gQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+IC0gaTE4bi9ubHMKKworICAgMjAwMDAxMDEgLSBEYXZpZCBIdWdnaW5zLURhaW5lcyA8ZGh1Z2dpbnNAbGludXhjYXJlLmNvbT4gLSBCZXR0ZXIKKyAgIHN1cHBvcnQgZm9yIE9TRi8xIGRpc2tsYWJlbHMgb24gQWxwaGEuCisgICBBbHNvIGZpeGVkIHVuYWxpZ25lZCBhY2Nlc3NlcyBpbiBhbHBoYV9ib290YmxvY2tfY2hlY2tzdW0oKQorKi8KKworI2RlZmluZSBGUkVFQlNEX1BBUlRJVElPTiAgICAgICAweGE1CisjZGVmaW5lIE5FVEJTRF9QQVJUSVRJT04gICAgICAgIDB4YTkKKworc3RhdGljIHZvaWQgeGJzZF9kZWxldGVfcGFydCh2b2lkKTsKK3N0YXRpYyB2b2lkIHhic2RfbmV3X3BhcnQodm9pZCk7CitzdGF0aWMgdm9pZCB4YnNkX3dyaXRlX2Rpc2tsYWJlbCh2b2lkKTsKK3N0YXRpYyBpbnQgeGJzZF9jcmVhdGVfZGlza2xhYmVsKHZvaWQpOworc3RhdGljIHZvaWQgeGJzZF9lZGl0X2Rpc2tsYWJlbCh2b2lkKTsKK3N0YXRpYyB2b2lkIHhic2Rfd3JpdGVfYm9vdHN0cmFwKHZvaWQpOworc3RhdGljIHZvaWQgeGJzZF9jaGFuZ2VfZnN0eXBlKHZvaWQpOworc3RhdGljIGludCB4YnNkX2dldF9wYXJ0X2luZGV4KGludCBtYXgpOworc3RhdGljIGludCB4YnNkX2NoZWNrX25ld19wYXJ0aXRpb24oaW50ICppKTsKK3N0YXRpYyB2b2lkIHhic2RfbGlzdF90eXBlcyh2b2lkKTsKK3N0YXRpYyB1aW50MTZfdCB4YnNkX2RrY2tzdW0oc3RydWN0IHhic2RfZGlza2xhYmVsICpscCk7CitzdGF0aWMgaW50IHhic2RfaW5pdGxhYmVsKHN0cnVjdCBwYXJ0aXRpb24gKnApOworc3RhdGljIGludCB4YnNkX3JlYWRsYWJlbChzdHJ1Y3QgcGFydGl0aW9uICpwKTsKK3N0YXRpYyBpbnQgeGJzZF93cml0ZWxhYmVsKHN0cnVjdCBwYXJ0aXRpb24gKnApOworCisjaWYgZGVmaW5lZChfX2FscGhhX18pCitzdGF0aWMgdm9pZCBhbHBoYV9ib290YmxvY2tfY2hlY2tzdW0oY2hhciAqYm9vdCk7CisjZW5kaWYKKworI2lmICFkZWZpbmVkKF9fYWxwaGFfXykKK3N0YXRpYyBpbnQgeGJzZF90cmFuc2xhdGVfZnN0eXBlKGludCBsaW51eF90eXBlKTsKK3N0YXRpYyB2b2lkIHhic2RfbGlua19wYXJ0KHZvaWQpOworc3RhdGljIHN0cnVjdCBwYXJ0aXRpb24gKnhic2RfcGFydDsKK3N0YXRpYyBpbnQgeGJzZF9wYXJ0X2luZGV4OworI2VuZGlmCisKKworLyogR3JvdXAgYmlnIGdsb2JhbHMgZGF0YSBhbmQgYWxsb2NhdGUgaXQgaW4gb25lIGdvICovCitzdHJ1Y3QgYnNkX2dsb2JhbHMgeworLyogV2UgYWNjZXNzIHRoaXMgdGhyb3VnaCBhIHVpbnQ2NF90ICogd2hlbiBjaGVja3N1bW1pbmcgKi8KKy8qIGhvcGVmdWxseSB4bWFsbG9jIGdpdmVzIHVzIHJlcXVpcmVkIGFsaWdubWVudCAqLworCWNoYXIgZGlza2xhYmVsYnVmZmVyW0JTRF9CQlNJWkVdOworCXN0cnVjdCB4YnNkX2Rpc2tsYWJlbCB4YnNkX2RsYWJlbDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgYnNkX2dsb2JhbHMgKmJzZF9nbG9iYWxzX3B0cjsKKworI2RlZmluZSBkaXNrbGFiZWxidWZmZXIgKGJzZF9nbG9iYWxzX3B0ci0+ZGlza2xhYmVsYnVmZmVyKQorI2RlZmluZSB4YnNkX2RsYWJlbCAgICAgKGJzZF9nbG9iYWxzX3B0ci0+eGJzZF9kbGFiZWwpCisKKworLyogQ29kZSAqLworCisjZGVmaW5lIGJzZF9jcm91bmQobikgXAorCShkaXNwbGF5X2luX2N5bF91bml0cyA/ICgobikveGJzZF9kbGFiZWwuZF9zZWNwZXJjeWwpICsgMSA6IChuKSkKKworLyoKKyAqIFRlc3Qgd2hldGhlciB0aGUgd2hvbGUgZGlzayBoYXMgQlNEIGRpc2sgbGFiZWwgbWFnaWMuCisgKgorICogTm90ZTogb2Z0ZW4gcmVmb3JtYXR0aW5nIHdpdGggRE9TLXR5cGUgbGFiZWwgbGVhdmVzIHRoZSBCU0QgbWFnaWMsCisgKiBzbyB0aGlzIGRvZXMgbm90IG1lYW4gdGhhdCB0aGVyZSBpcyBhIEJTRCBkaXNrIGxhYmVsLgorICovCitzdGF0aWMgaW50CitjaGVja19vc2ZfbGFiZWwodm9pZCkKK3sKKwlpZiAoeGJzZF9yZWFkbGFiZWwoTlVMTCkgPT0gMCkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQKK2JzZF90cnlkZXYoY29uc3QgY2hhciAqIGRldikKK3sKKwlpZiAoeGJzZF9yZWFkbGFiZWwoTlVMTCkgPT0gMCkKKwkJcmV0dXJuIC0xOworCXByaW50ZigiXG5CU0QgbGFiZWwgZm9yIGRldmljZTogJXNcbiIsIGRldik7CisJeGJzZF9wcmludF9kaXNrbGFiZWwoMCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkCitic2RfbWVudSh2b2lkKQoreworCXB1dHMoIkNvbW1hbmQgQWN0aW9uIik7CisJcHV0cygiZFx0ZGVsZXRlIGEgQlNEIHBhcnRpdGlvbiIpOworCXB1dHMoImVcdGVkaXQgZHJpdmUgZGF0YSIpOworCXB1dHMoImlcdGluc3RhbGwgYm9vdHN0cmFwIik7CisJcHV0cygibFx0bGlzdCBrbm93biBmaWxlc3lzdGVtIHR5cGVzIik7CisJcHV0cygiblx0YWRkIGEgbmV3IEJTRCBwYXJ0aXRpb24iKTsKKwlwdXRzKCJwXHRwcmludCBCU0QgcGFydGl0aW9uIHRhYmxlIik7CisJcHV0cygicVx0cXVpdCB3aXRob3V0IHNhdmluZyBjaGFuZ2VzIik7CisJcHV0cygiclx0cmV0dXJuIHRvIG1haW4gbWVudSIpOworCXB1dHMoInNcdHNob3cgY29tcGxldGUgZGlza2xhYmVsIik7CisJcHV0cygidFx0Y2hhbmdlIGEgcGFydGl0aW9uJ3MgZmlsZXN5c3RlbSBpZCIpOworCXB1dHMoInVcdGNoYW5nZSB1bml0cyAoY3lsaW5kZXJzL3NlY3RvcnMpIik7CisJcHV0cygid1x0d3JpdGUgZGlza2xhYmVsIHRvIGRpc2siKTsKKyNpZiAhZGVmaW5lZChfX2FscGhhX18pCisJcHV0cygieFx0bGluayBCU0QgcGFydGl0aW9uIHRvIG5vbi1CU0QgcGFydGl0aW9uIik7CisjZW5kaWYKK30KKworI2lmICFkZWZpbmVkKF9fYWxwaGFfXykKK3N0YXRpYyBpbnQKK2hpZGRlbihpbnQgdHlwZSkKK3sKKwlyZXR1cm4gdHlwZSBeIDB4MTA7Cit9CisKK3N0YXRpYyBpbnQKK2lzX2JzZF9wYXJ0aXRpb25fdHlwZShpbnQgdHlwZSkKK3sKKwlyZXR1cm4gKHR5cGUgPT0gRlJFRUJTRF9QQVJUSVRJT04gfHwKKwkJdHlwZSA9PSBoaWRkZW4oRlJFRUJTRF9QQVJUSVRJT04pIHx8CisJCXR5cGUgPT0gTkVUQlNEX1BBUlRJVElPTiB8fAorCQl0eXBlID09IGhpZGRlbihORVRCU0RfUEFSVElUSU9OKSk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQKK2JzZF9zZWxlY3Qodm9pZCkKK3sKKyNpZiAhZGVmaW5lZChfX2FscGhhX18pCisJaW50IHQsIHNzOworCXN0cnVjdCBwYXJ0aXRpb24gKnA7CisKKwlmb3IgKHQgPSAwOyB0IDwgNDsgdCsrKSB7CisJCXAgPSBnZXRfcGFydF90YWJsZSh0KTsKKwkJaWYgKHAgJiYgaXNfYnNkX3BhcnRpdGlvbl90eXBlKHAtPnN5c19pbmQpKSB7CisJCQl4YnNkX3BhcnQgPSBwOworCQkJeGJzZF9wYXJ0X2luZGV4ID0gdDsKKwkJCXNzID0gZ2V0X3N0YXJ0X3NlY3QoeGJzZF9wYXJ0KTsKKwkJCWlmIChzcyA9PSAwKSB7CisJCQkJcHJpbnRmKCJQYXJ0aXRpb24gJXMgaGFzIGludmFsaWQgc3RhcnRpbmcgc2VjdG9yIDBcbiIsCisJCQkJCXBhcnRuYW1lKGRpc2tfZGV2aWNlLCB0KzEsIDApKTsKKwkJCQlyZXR1cm47CisJCQl9CisJCQkJcHJpbnRmKCJSZWFkaW5nIGRpc2tsYWJlbCBvZiAlcyBhdCBzZWN0b3IgJXVcbiIsCisJCQkJCXBhcnRuYW1lKGRpc2tfZGV2aWNlLCB0KzEsIDApLCBzcyArIEJTRF9MQUJFTFNFQ1RPUik7CisJCQlpZiAoeGJzZF9yZWFkbGFiZWwoeGJzZF9wYXJ0KSA9PSAwKQorCQkJCWlmICh4YnNkX2NyZWF0ZV9kaXNrbGFiZWwoKSA9PSAwKQorCQkJCQlyZXR1cm47CisJCQkJYnJlYWs7CisJCX0KKwl9CisKKwlpZiAodCA9PSA0KSB7CisJCXByaW50ZigiVGhlcmUgaXMgbm8gKkJTRCBwYXJ0aXRpb24gb24gJXNcbiIsIGRpc2tfZGV2aWNlKTsKKwkJcmV0dXJuOworCX0KKworI2VsaWYgZGVmaW5lZChfX2FscGhhX18pCisKKwlpZiAoeGJzZF9yZWFkbGFiZWwoTlVMTCkgPT0gMCkKKwkJaWYgKHhic2RfY3JlYXRlX2Rpc2tsYWJlbCgpID09IDApCisJCQlleGl0KEVYSVRfU1VDQ0VTUyk7CisKKyNlbmRpZgorCisJd2hpbGUgKDEpIHsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwkJc3dpdGNoICh0b2xvd2VyKHJlYWRfbm9uZW1wdHkoIkJTRCBkaXNrbGFiZWwgY29tbWFuZCAobSBmb3IgaGVscCk6ICIpKSkgeworCQljYXNlICdkJzoKKwkJCXhic2RfZGVsZXRlX3BhcnQoKTsKKwkJCWJyZWFrOworCQljYXNlICdlJzoKKwkJCXhic2RfZWRpdF9kaXNrbGFiZWwoKTsKKwkJCWJyZWFrOworCQljYXNlICdpJzoKKwkJCXhic2Rfd3JpdGVfYm9vdHN0cmFwKCk7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQl4YnNkX2xpc3RfdHlwZXMoKTsKKwkJCWJyZWFrOworCQljYXNlICduJzoKKwkJCXhic2RfbmV3X3BhcnQoKTsKKwkJCWJyZWFrOworCQljYXNlICdwJzoKKwkJCXhic2RfcHJpbnRfZGlza2xhYmVsKDApOworCQkJYnJlYWs7CisJCWNhc2UgJ3EnOgorCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJCWNsb3NlX2Rldl9mZCgpOworCQkJZXhpdChFWElUX1NVQ0NFU1MpOworCQljYXNlICdyJzoKKwkJCXJldHVybjsKKwkJY2FzZSAncyc6CisJCQl4YnNkX3ByaW50X2Rpc2tsYWJlbCgxKTsKKwkJCWJyZWFrOworCQljYXNlICd0JzoKKwkJCXhic2RfY2hhbmdlX2ZzdHlwZSgpOworCQkJYnJlYWs7CisJCWNhc2UgJ3UnOgorCQkJY2hhbmdlX3VuaXRzKCk7CisJCQlicmVhazsKKwkJY2FzZSAndyc6CisJCQl4YnNkX3dyaXRlX2Rpc2tsYWJlbCgpOworCQkJYnJlYWs7CisjaWYgIWRlZmluZWQoX19hbHBoYV9fKQorCQljYXNlICd4JzoKKwkJCXhic2RfbGlua19wYXJ0KCk7CisJCQlicmVhazsKKyNlbmRpZgorCQlkZWZhdWx0OgorCQkJYnNkX21lbnUoKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAoreGJzZF9kZWxldGVfcGFydCh2b2lkKQoreworCWludCBpOworCisJaSA9IHhic2RfZ2V0X3BhcnRfaW5kZXgoeGJzZF9kbGFiZWwuZF9ucGFydGl0aW9ucyk7CisJeGJzZF9kbGFiZWwuZF9wYXJ0aXRpb25zW2ldLnBfc2l6ZSAgID0gMDsKKwl4YnNkX2RsYWJlbC5kX3BhcnRpdGlvbnNbaV0ucF9vZmZzZXQgPSAwOworCXhic2RfZGxhYmVsLmRfcGFydGl0aW9uc1tpXS5wX2ZzdHlwZSA9IEJTRF9GU19VTlVTRUQ7CisJaWYgKHhic2RfZGxhYmVsLmRfbnBhcnRpdGlvbnMgPT0gaSArIDEpCisJCXdoaWxlICh4YnNkX2RsYWJlbC5kX3BhcnRpdGlvbnNbeGJzZF9kbGFiZWwuZF9ucGFydGl0aW9ucy0xXS5wX3NpemUgPT0gMCkKKwkJCXhic2RfZGxhYmVsLmRfbnBhcnRpdGlvbnMtLTsKK30KKworc3RhdGljIHZvaWQKK3hic2RfbmV3X3BhcnQodm9pZCkKK3sKKwlvZmZfdCBiZWdpbiwgZW5kOworCWNoYXIgbWVzZ1syNTZdOworCWludCBpOworCisJaWYgKCF4YnNkX2NoZWNrX25ld19wYXJ0aXRpb24oJmkpKQorCQlyZXR1cm47CisKKyNpZiAhZGVmaW5lZChfX2FscGhhX18pICYmICFkZWZpbmVkKF9fcG93ZXJwY19fKSAmJiAhZGVmaW5lZChfX2hwcGFfXykKKwliZWdpbiA9IGdldF9zdGFydF9zZWN0KHhic2RfcGFydCk7CisJZW5kID0gYmVnaW4gKyBnZXRfbnJfc2VjdHMoeGJzZF9wYXJ0KSAtIDE7CisjZWxzZQorCWJlZ2luID0gMDsKKwllbmQgPSB4YnNkX2RsYWJlbC5kX3NlY3BlcnVuaXQgLSAxOworI2VuZGlmCisKKwlzbnByaW50ZihtZXNnLCBzaXplb2YobWVzZyksICJGaXJzdCAlcyIsIHN0cl91bml0cyhTSU5HVUxBUikpOworCWJlZ2luID0gcmVhZF9pbnQoYnNkX2Nyb3VuZChiZWdpbiksIGJzZF9jcm91bmQoYmVnaW4pLCBic2RfY3JvdW5kKGVuZCksCisJCTAsIG1lc2cpOworCisJaWYgKGRpc3BsYXlfaW5fY3lsX3VuaXRzKQorCQliZWdpbiA9IChiZWdpbiAtIDEpICogeGJzZF9kbGFiZWwuZF9zZWNwZXJjeWw7CisKKwlzbnByaW50ZihtZXNnLCBzaXplb2YobWVzZyksICJMYXN0ICVzIG9yICtzaXplIG9yICtzaXplTSBvciArc2l6ZUsiLAorCQlzdHJfdW5pdHMoU0lOR1VMQVIpKTsKKwllbmQgPSByZWFkX2ludChic2RfY3JvdW5kKGJlZ2luKSwgYnNkX2Nyb3VuZChlbmQpLCBic2RfY3JvdW5kKGVuZCksCisJCWJzZF9jcm91bmQoYmVnaW4pLCBtZXNnKTsKKworCWlmIChkaXNwbGF5X2luX2N5bF91bml0cykKKwkJZW5kID0gZW5kICogeGJzZF9kbGFiZWwuZF9zZWNwZXJjeWwgLSAxOworCisJeGJzZF9kbGFiZWwuZF9wYXJ0aXRpb25zW2ldLnBfc2l6ZSAgID0gZW5kIC0gYmVnaW4gKyAxOworCXhic2RfZGxhYmVsLmRfcGFydGl0aW9uc1tpXS5wX29mZnNldCA9IGJlZ2luOworCXhic2RfZGxhYmVsLmRfcGFydGl0aW9uc1tpXS5wX2ZzdHlwZSA9IEJTRF9GU19VTlVTRUQ7Cit9CisKK3N0YXRpYyB2b2lkCit4YnNkX3ByaW50X2Rpc2tsYWJlbChpbnQgc2hvd19hbGwpCit7CisJc3RydWN0IHhic2RfZGlza2xhYmVsICpscCA9ICZ4YnNkX2RsYWJlbDsKKwlzdHJ1Y3QgeGJzZF9wYXJ0aXRpb24gKnBwOworCWludCBpLCBqOworCisJaWYgKHNob3dfYWxsKSB7CisJCXN0YXRpYyBjb25zdCBpbnQgZF9tYXNrc1tdID0geyBCU0RfRF9SRU1PVkFCTEUsIEJTRF9EX0VDQywgQlNEX0RfQkFEU0VDVCB9OworCisjaWYgZGVmaW5lZChfX2FscGhhX18pCisJCXByaW50ZigiIyAlczpcbiIsIGRpc2tfZGV2aWNlKTsKKyNlbHNlCisJCXByaW50ZigiIyAlczpcbiIsIHBhcnRuYW1lKGRpc2tfZGV2aWNlLCB4YnNkX3BhcnRfaW5kZXgrMSwgMCkpOworI2VuZGlmCisJCWlmICgodW5zaWduZWQpIGxwLT5kX3R5cGUgPCBBUlJBWV9TSVpFKHhic2RfZGt0eXBlbmFtZXMpLTEpCisJCQlwcmludGYoInR5cGU6ICVzXG4iLCB4YnNkX2RrdHlwZW5hbWVzW2xwLT5kX3R5cGVdKTsKKwkJZWxzZQorCQkJcHJpbnRmKCJ0eXBlOiAldVxuIiwgbHAtPmRfdHlwZSk7CisJCXByaW50ZigiZGlzazogJS4qc1xuIiwgKGludCkgc2l6ZW9mKGxwLT5kX3R5cGVuYW1lKSwgbHAtPmRfdHlwZW5hbWUpOworCQlwcmludGYoImxhYmVsOiAlLipzXG4iLCAoaW50KSBzaXplb2YobHAtPmRfcGFja25hbWUpLCBscC0+ZF9wYWNrbmFtZSk7CisJCXByaW50ZigiZmxhZ3M6ICIpOworCQlwcmludF9mbGFnc19zZXBhcmF0ZWQoZF9tYXNrcywgInJlbW92YWJsZVwwIiJlY2NcMCIiYmFkc2VjdFwwIiwgbHAtPmRfZmxhZ3MsICIgIik7CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCS8qIE9uIHZhcmlvdXMgbWFjaGluZXMgdGhlIGZpZWxkcyBvZiAqbHAgYXJlIHNob3J0L2ludC9sb25nICovCisJCS8qIEluIG9yZGVyIHRvIGF2b2lkIHByb2JsZW1zLCB3ZSBjYXN0IHRoZW0gYWxsIHRvIGxvbmcuICovCisJCXByaW50ZigiYnl0ZXMvc2VjdG9yOiAlbHVcbiIsIChsb25nKSBscC0+ZF9zZWNzaXplKTsKKwkJcHJpbnRmKCJzZWN0b3JzL3RyYWNrOiAlbHVcbiIsIChsb25nKSBscC0+ZF9uc2VjdG9ycyk7CisJCXByaW50ZigidHJhY2tzL2N5bGluZGVyOiAlbHVcbiIsIChsb25nKSBscC0+ZF9udHJhY2tzKTsKKwkJcHJpbnRmKCJzZWN0b3JzL2N5bGluZGVyOiAlbHVcbiIsIChsb25nKSBscC0+ZF9zZWNwZXJjeWwpOworCQlwcmludGYoImN5bGluZGVyczogJWx1XG4iLCAobG9uZykgbHAtPmRfbmN5bGluZGVycyk7CisJCXByaW50ZigicnBtOiAldVxuIiwgbHAtPmRfcnBtKTsKKwkJcHJpbnRmKCJpbnRlcmxlYXZlOiAldVxuIiwgbHAtPmRfaW50ZXJsZWF2ZSk7CisJCXByaW50ZigidHJhY2tza2V3OiAldVxuIiwgbHAtPmRfdHJhY2tza2V3KTsKKwkJcHJpbnRmKCJjeWxpbmRlcnNrZXc6ICV1XG4iLCBscC0+ZF9jeWxza2V3KTsKKwkJcHJpbnRmKCJoZWFkc3dpdGNoOiAlbHVcdFx0IyBtaWxsaXNlY29uZHNcbiIsCisJCQkobG9uZykgbHAtPmRfaGVhZHN3aXRjaCk7CisJCXByaW50ZigidHJhY2stdG8tdHJhY2sgc2VlazogJWx1XHQjIG1pbGxpc2Vjb25kc1xuIiwKKwkJCShsb25nKSBscC0+ZF90cmtzZWVrKTsKKwkJcHJpbnRmKCJkcml2ZWRhdGE6ICIpOworCQlmb3IgKGkgPSBORERBVEEgLSAxOyBpID49IDA7IGktLSkKKwkJCWlmIChscC0+ZF9kcml2ZWRhdGFbaV0pCisJCQkJYnJlYWs7CisJCWlmIChpIDwgMCkKKwkJCWkgPSAwOworCQlmb3IgKGogPSAwOyBqIDw9IGk7IGorKykKKwkJCXByaW50ZigiJWx1ICIsIChsb25nKSBscC0+ZF9kcml2ZWRhdGFbal0pOworCX0KKwlwcmludGYoIlxuJXUgcGFydGl0aW9uczpcbiIsIGxwLT5kX25wYXJ0aXRpb25zKTsKKwlwcmludGYoIiMgICAgICAgc3RhcnQgICAgICAgZW5kICAgICAgc2l6ZSAgICAgZnN0eXBlICAgW2ZzaXplIGJzaXplICAgY3BnXVxuIik7CisJcHAgPSBscC0+ZF9wYXJ0aXRpb25zOworCWZvciAoaSA9IDA7IGkgPCBscC0+ZF9ucGFydGl0aW9uczsgaSsrLCBwcCsrKSB7CisJCWlmIChwcC0+cF9zaXplKSB7CisJCQlpZiAoZGlzcGxheV9pbl9jeWxfdW5pdHMgJiYgbHAtPmRfc2VjcGVyY3lsKSB7CisJCQkJcHJpbnRmKCIgICVjOiAlOGx1JWMgJThsdSVjICU4bHUlYyAgIiwKKwkJCQkJJ2EnICsgaSwKKwkJCQkJKHVuc2lnbmVkIGxvbmcpIHBwLT5wX29mZnNldCAvIGxwLT5kX3NlY3BlcmN5bCArIDEsCisJCQkJCShwcC0+cF9vZmZzZXQgJSBscC0+ZF9zZWNwZXJjeWwpID8gJyonIDogJyAnLAorCQkJCQkodW5zaWduZWQgbG9uZykgKHBwLT5wX29mZnNldCArIHBwLT5wX3NpemUgKyBscC0+ZF9zZWNwZXJjeWwgLSAxKSAvIGxwLT5kX3NlY3BlcmN5bCwKKwkJCQkJKChwcC0+cF9vZmZzZXQgKyBwcC0+cF9zaXplKSAlIGxwLT5kX3NlY3BlcmN5bCkgPyAnKicgOiAnICcsCisJCQkJCShsb25nKSBwcC0+cF9zaXplIC8gbHAtPmRfc2VjcGVyY3lsLAorCQkJCQkocHAtPnBfc2l6ZSAlIGxwLT5kX3NlY3BlcmN5bCkgPyAnKicgOiAnICcKKwkJCQkpOworCQkJfSBlbHNlIHsKKwkJCQlwcmludGYoIiAgJWM6ICU4bHUgICU4bHUgICU4bHUgICAiLAorCQkJCQknYScgKyBpLAorCQkJCQkobG9uZykgcHAtPnBfb2Zmc2V0LAorCQkJCQkobG9uZykgcHAtPnBfb2Zmc2V0ICsgcHAtPnBfc2l6ZSAtIDEsCisJCQkJCShsb25nKSBwcC0+cF9zaXplCisJCQkJKTsKKwkJCX0KKworCQkJaWYgKCh1bnNpZ25lZCkgcHAtPnBfZnN0eXBlIDwgQVJSQVlfU0laRSh4YnNkX2ZzdHlwZXMpLTEpCisJCQkJcHJpbnRmKCIlOC44cyIsIHhic2RfZnN0eXBlc1twcC0+cF9mc3R5cGVdKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiU4eCIsIHBwLT5wX2ZzdHlwZSk7CisKKwkJCXN3aXRjaCAocHAtPnBfZnN0eXBlKSB7CisJCQljYXNlIEJTRF9GU19VTlVTRUQ6CisJCQkJcHJpbnRmKCIgICAgJTVsdSAlNWx1ICU1LjVzICIsCisJCQkJCShsb25nKSBwcC0+cF9mc2l6ZSwgKGxvbmcpIHBwLT5wX2ZzaXplICogcHAtPnBfZnJhZywgIiIpOworCQkJCWJyZWFrOworCQkJY2FzZSBCU0RfRlNfQlNERkZTOgorCQkJCXByaW50ZigiICAgICU1bHUgJTVsdSAlNXUgIiwKKwkJCQkJKGxvbmcpIHBwLT5wX2ZzaXplLCAobG9uZykgcHAtPnBfZnNpemUgKiBwcC0+cF9mcmFnLCBwcC0+cF9jcGcpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlwcmludGYoIiUyMi4yMnMiLCAiIik7CisJCQkJYnJlYWs7CisJCQl9CisJCQliYl9wdXRjaGFyKCdcbicpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAoreGJzZF93cml0ZV9kaXNrbGFiZWwodm9pZCkKK3sKKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykKKwlwcmludGYoIldyaXRpbmcgZGlza2xhYmVsIHRvICVzXG4iLCBkaXNrX2RldmljZSk7CisJeGJzZF93cml0ZWxhYmVsKE5VTEwpOworI2Vsc2UKKwlwcmludGYoIldyaXRpbmcgZGlza2xhYmVsIHRvICVzXG4iLAorCQlwYXJ0bmFtZShkaXNrX2RldmljZSwgeGJzZF9wYXJ0X2luZGV4ICsgMSwgMCkpOworCXhic2Rfd3JpdGVsYWJlbCh4YnNkX3BhcnQpOworI2VuZGlmCisJcmVyZWFkX3BhcnRpdGlvbl90YWJsZSgwKTsgICAgICAvKiBubyBleGl0IHlldCAqLworfQorCitzdGF0aWMgaW50Cit4YnNkX2NyZWF0ZV9kaXNrbGFiZWwodm9pZCkKK3sKKwljaGFyIGM7CisKKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykKKwlwcmludGYoIiVzIGNvbnRhaW5zIG5vIGRpc2tsYWJlbFxuIiwgZGlza19kZXZpY2UpOworI2Vsc2UKKwlwcmludGYoIiVzIGNvbnRhaW5zIG5vIGRpc2tsYWJlbFxuIiwKKwkJcGFydG5hbWUoZGlza19kZXZpY2UsIHhic2RfcGFydF9pbmRleCArIDEsIDApKTsKKyNlbmRpZgorCisJd2hpbGUgKDEpIHsKKwkJYyA9IHJlYWRfbm9uZW1wdHkoIkRvIHlvdSB3YW50IHRvIGNyZWF0ZSBhIGRpc2tsYWJlbD8gKHkvbikgIik7CisJCWlmICgoY3wweDIwKSA9PSAneScpIHsKKwkJCWlmICh4YnNkX2luaXRsYWJlbCgKKyNpZiBkZWZpbmVkKF9fYWxwaGFfXykgfHwgZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgZGVmaW5lZChfX2hwcGFfXykgfHwgXAorCWRlZmluZWQoX19zMzkwX18pIHx8IGRlZmluZWQoX19zMzkweF9fKQorCQkJCU5VTEwKKyNlbHNlCisJCQkJeGJzZF9wYXJ0CisjZW5kaWYKKwkJCSkgPT0gMSkgeworCQkJCXhic2RfcHJpbnRfZGlza2xhYmVsKDEpOworCQkJCXJldHVybiAxOworCQkJfQorCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKChjfDB4MjApID09ICduJykKKwkJCXJldHVybiAwOworCX0KK30KKworc3RhdGljIGludAorZWRpdF9pbnQoaW50IGRlZiwgY29uc3QgY2hhciAqbWVzZykKK3sKKwltZXNnID0geGFzcHJpbnRmKCIlcyAoJXUpOiAiLCBtZXNnLCBkZWYpOworCWRvIHsKKwkJaWYgKCFyZWFkX2xpbmUobWVzZykpCisJCQlnb3RvIHJldDsKKwl9IHdoaWxlICghaXNkaWdpdCgqbGluZV9wdHIpKTsKKwlkZWYgPSBhdG9pKGxpbmVfcHRyKTsKKyByZXQ6CisJZnJlZSgoY2hhciopbWVzZyk7CisJcmV0dXJuIGRlZjsKK30KKworc3RhdGljIHZvaWQKK3hic2RfZWRpdF9kaXNrbGFiZWwodm9pZCkKK3sKKwlzdHJ1Y3QgeGJzZF9kaXNrbGFiZWwgKmQ7CisKKwlkID0gJnhic2RfZGxhYmVsOworCisjaWYgZGVmaW5lZChfX2FscGhhX18pIHx8IGRlZmluZWQoX19pYTY0X18pCisJZC0+ZF9zZWNzaXplICAgID0gZWRpdF9pbnQoZC0+ZF9zZWNzaXplICAgICAsICJieXRlcy9zZWN0b3IiKTsKKwlkLT5kX25zZWN0b3JzICAgPSBlZGl0X2ludChkLT5kX25zZWN0b3JzICAgICwgInNlY3RvcnMvdHJhY2siKTsKKwlkLT5kX250cmFja3MgICAgPSBlZGl0X2ludChkLT5kX250cmFja3MgICAgICwgInRyYWNrcy9jeWxpbmRlciIpOworCWQtPmRfbmN5bGluZGVycyA9IGVkaXRfaW50KGQtPmRfbmN5bGluZGVycyAgLCAiY3lsaW5kZXJzIik7CisjZW5kaWYKKworCS8qIGQtPmRfc2VjcGVyY3lsIGNhbiBiZSAhPSBkLT5kX25zZWN0b3JzICogZC0+ZF9udHJhY2tzICovCisJd2hpbGUgKDEpIHsKKwkJZC0+ZF9zZWNwZXJjeWwgPSBlZGl0X2ludChkLT5kX25zZWN0b3JzICogZC0+ZF9udHJhY2tzLAorCQkJCSJzZWN0b3JzL2N5bGluZGVyIik7CisJCWlmIChkLT5kX3NlY3BlcmN5bCA8PSBkLT5kX25zZWN0b3JzICogZC0+ZF9udHJhY2tzKQorCQkJYnJlYWs7CisKKwkJcHJpbnRmKCJNdXN0IGJlIDw9IHNlY3RvcnMvdHJhY2sgKiB0cmFja3MvY3lsaW5kZXIgKGRlZmF1bHQpXG4iKTsKKwl9CisJZC0+ZF9ycG0gICAgICAgID0gZWRpdF9pbnQoZC0+ZF9ycG0gICAgICAgLCAicnBtIik7CisJZC0+ZF9pbnRlcmxlYXZlID0gZWRpdF9pbnQoZC0+ZF9pbnRlcmxlYXZlLCAiaW50ZXJsZWF2ZSIpOworCWQtPmRfdHJhY2tza2V3ICA9IGVkaXRfaW50KGQtPmRfdHJhY2tza2V3ICwgInRyYWNrc2tldyIpOworCWQtPmRfY3lsc2tldyAgICA9IGVkaXRfaW50KGQtPmRfY3lsc2tldyAgICwgImN5bGluZGVyc2tldyIpOworCWQtPmRfaGVhZHN3aXRjaCA9IGVkaXRfaW50KGQtPmRfaGVhZHN3aXRjaCwgImhlYWRzd2l0Y2giKTsKKwlkLT5kX3Rya3NlZWsgICAgPSBlZGl0X2ludChkLT5kX3Rya3NlZWsgICAsICJ0cmFjay10by10cmFjayBzZWVrIik7CisKKwlkLT5kX3NlY3BlcnVuaXQgPSBkLT5kX3NlY3BlcmN5bCAqIGQtPmRfbmN5bGluZGVyczsKK30KKworc3RhdGljIGludAoreGJzZF9nZXRfYm9vdHN0cmFwKGNoYXIgKnBhdGgsIHZvaWQgKnB0ciwgaW50IHNpemUpCit7CisJaW50IGZkYjsKKworCWZkYiA9IG9wZW5fb3Jfd2FybihwYXRoLCBPX1JET05MWSk7CisJaWYgKGZkYiA8IDApIHsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChmdWxsX3JlYWQoZmRiLCBwdHIsIHNpemUpIDwgMCkgeworCQliYl9zaW1wbGVfcGVycm9yX21zZyhwYXRoKTsKKwkJY2xvc2UoZmRiKTsKKwkJcmV0dXJuIDA7CisJfQorCXByaW50ZigiIC4uLiAlc1xuIiwgcGF0aCk7CisJY2xvc2UoZmRiKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQKK3N5bmNfZGlza3Modm9pZCkKK3sKKwlwcmludGYoIlN5bmNpbmcgZGlza3NcbiIpOworCXN5bmMoKTsKKwkvKiBzbGVlcCg0KTsgV2hhdD8gKi8KK30KKworc3RhdGljIHZvaWQKK3hic2Rfd3JpdGVfYm9vdHN0cmFwKHZvaWQpCit7CisJY2hhciBwYXRoW01BWFBBVEhMRU5dOworCWNvbnN0IGNoYXIgKmJvb3RkaXIgPSBCU0RfTElOVVhfQk9PVERJUjsKKwljb25zdCBjaGFyICpka2Jhc2VuYW1lOworCXN0cnVjdCB4YnNkX2Rpc2tsYWJlbCBkbDsKKwljaGFyICpkLCAqcCwgKmU7CisJaW50IHNlY3RvcjsKKworCWlmICh4YnNkX2RsYWJlbC5kX3R5cGUgPT0gQlNEX0RUWVBFX1NDU0kpCisJCWRrYmFzZW5hbWUgPSAic2QiOworCWVsc2UKKwkJZGtiYXNlbmFtZSA9ICJ3ZCI7CisKKwlzbnByaW50ZihwYXRoLCBzaXplb2YocGF0aCksICJCb290c3RyYXA6ICVzYm9vdCAtPiBib290JXMgKCVzKTogIiwKKwkJZGtiYXNlbmFtZSwgZGtiYXNlbmFtZSwgZGtiYXNlbmFtZSk7CisJaWYgKHJlYWRfbGluZShwYXRoKSkgeworCQlka2Jhc2VuYW1lID0gbGluZV9wdHI7CisJfQorCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIiVzLyVzYm9vdCIsIGJvb3RkaXIsIGRrYmFzZW5hbWUpOworCWlmICgheGJzZF9nZXRfYm9vdHN0cmFwKHBhdGgsIGRpc2tsYWJlbGJ1ZmZlciwgKGludCkgeGJzZF9kbGFiZWwuZF9zZWNzaXplKSkKKwkJcmV0dXJuOworCisvKiBXZSBuZWVkIGEgYmFja3VwIG9mIHRoZSBkaXNrbGFiZWwgKHhic2RfZGxhYmVsIG1pZ2h0IGhhdmUgY2hhbmdlZCkuICovCisJZCA9ICZkaXNrbGFiZWxidWZmZXJbQlNEX0xBQkVMU0VDVE9SICogU0VDVE9SX1NJWkVdOworCW1lbW1vdmUoJmRsLCBkLCBzaXplb2Yoc3RydWN0IHhic2RfZGlza2xhYmVsKSk7CisKKy8qIFRoZSBkaXNrbGFiZWwgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSAwJ3MgZnJvbSBib290eHggYW55d2F5ICovCisJbWVtc2V0KGQsIDAsIHNpemVvZihzdHJ1Y3QgeGJzZF9kaXNrbGFiZWwpKTsKKworCXNucHJpbnRmKHBhdGgsIHNpemVvZihwYXRoKSwgIiVzL2Jvb3QlcyIsIGJvb3RkaXIsIGRrYmFzZW5hbWUpOworCWlmICgheGJzZF9nZXRfYm9vdHN0cmFwKHBhdGgsICZkaXNrbGFiZWxidWZmZXJbeGJzZF9kbGFiZWwuZF9zZWNzaXplXSwKKwkJCShpbnQpIHhic2RfZGxhYmVsLmRfYmJzaXplIC0geGJzZF9kbGFiZWwuZF9zZWNzaXplKSkKKwkJcmV0dXJuOworCisJZSA9IGQgKyBzaXplb2Yoc3RydWN0IHhic2RfZGlza2xhYmVsKTsKKwlmb3IgKHAgPSBkOyBwIDwgZTsgcCsrKQorCQlpZiAoKnApIHsKKwkJCXByaW50ZigiQm9vdHN0cmFwIG92ZXJsYXBzIHdpdGggZGlzayBsYWJlbCFcbiIpOworCQkJZXhpdChFWElUX0ZBSUxVUkUpOworCQl9CisKKwltZW1tb3ZlKGQsICZkbCwgc2l6ZW9mKHN0cnVjdCB4YnNkX2Rpc2tsYWJlbCkpOworCisjaWYgZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgZGVmaW5lZChfX2hwcGFfXykKKwlzZWN0b3IgPSAwOworI2VsaWYgZGVmaW5lZChfX2FscGhhX18pCisJc2VjdG9yID0gMDsKKwlhbHBoYV9ib290YmxvY2tfY2hlY2tzdW0oZGlza2xhYmVsYnVmZmVyKTsKKyNlbHNlCisJc2VjdG9yID0gZ2V0X3N0YXJ0X3NlY3QoeGJzZF9wYXJ0KTsKKyNlbmRpZgorCisJc2Vla19zZWN0b3Ioc2VjdG9yKTsKKwl4d3JpdGUoZGV2X2ZkLCBkaXNrbGFiZWxidWZmZXIsIEJTRF9CQlNJWkUpOworCisjaWYgZGVmaW5lZChfX2FscGhhX18pCisJcHJpbnRmKCJCb290c3RyYXAgaW5zdGFsbGVkIG9uICVzXG4iLCBkaXNrX2RldmljZSk7CisjZWxzZQorCXByaW50ZigiQm9vdHN0cmFwIGluc3RhbGxlZCBvbiAlc1xuIiwKKwkJcGFydG5hbWUoZGlza19kZXZpY2UsIHhic2RfcGFydF9pbmRleCsxLCAwKSk7CisjZW5kaWYKKworCXN5bmNfZGlza3MoKTsKK30KKworc3RhdGljIHZvaWQKK3hic2RfY2hhbmdlX2ZzdHlwZSh2b2lkKQoreworCWludCBpOworCisJaSA9IHhic2RfZ2V0X3BhcnRfaW5kZXgoeGJzZF9kbGFiZWwuZF9ucGFydGl0aW9ucyk7CisJeGJzZF9kbGFiZWwuZF9wYXJ0aXRpb25zW2ldLnBfZnN0eXBlID0gcmVhZF9oZXgoeGJzZF9mc3R5cGVzKTsKK30KKworc3RhdGljIGludAoreGJzZF9nZXRfcGFydF9pbmRleChpbnQgbWF4KQoreworCWNoYXIgcHJvbXB0W3NpemVvZigiUGFydGl0aW9uIChhLSVjKTogIikgKyAxNl07CisJY2hhciBsOworCisJc25wcmludGYocHJvbXB0LCBzaXplb2YocHJvbXB0KSwgIlBhcnRpdGlvbiAoYS0lYyk6ICIsICdhJyArIG1heCAtIDEpOworCWRvCisJCWwgPSB0b2xvd2VyKHJlYWRfbm9uZW1wdHkocHJvbXB0KSk7CisJd2hpbGUgKGwgPCAnYScgfHwgbCA+ICdhJyArIG1heCAtIDEpOworCXJldHVybiBsIC0gJ2EnOworfQorCitzdGF0aWMgaW50Cit4YnNkX2NoZWNrX25ld19wYXJ0aXRpb24oaW50ICppKQoreworCS8qIHJvb20gZm9yIG1vcmU/IHZhcmlvdXMgQlNEIGZsYXZvdXJzIGhhdmUgZGlmZmVyZW50IG1heGltYSAqLworCWlmICh4YnNkX2RsYWJlbC5kX25wYXJ0aXRpb25zID09IEJTRF9NQVhQQVJUSVRJT05TKSB7CisJCWludCB0OworCisJCWZvciAodCA9IDA7IHQgPCBCU0RfTUFYUEFSVElUSU9OUzsgdCsrKQorCQkJaWYgKHhic2RfZGxhYmVsLmRfcGFydGl0aW9uc1t0XS5wX3NpemUgPT0gMCkKKwkJCQlicmVhazsKKworCQlpZiAodCA9PSBCU0RfTUFYUEFSVElUSU9OUykgeworCQkJcHJpbnRmKCJUaGUgbWF4aW11bSBudW1iZXIgb2YgcGFydGl0aW9ucyBoYXMgYmVlbiBjcmVhdGVkXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCisJKmkgPSB4YnNkX2dldF9wYXJ0X2luZGV4KEJTRF9NQVhQQVJUSVRJT05TKTsKKworCWlmICgqaSA+PSB4YnNkX2RsYWJlbC5kX25wYXJ0aXRpb25zKQorCQl4YnNkX2RsYWJlbC5kX25wYXJ0aXRpb25zID0gKCppKSArIDE7CisKKwlpZiAoeGJzZF9kbGFiZWwuZF9wYXJ0aXRpb25zWyppXS5wX3NpemUgIT0gMCkgeworCQlwcmludGYoIlRoaXMgcGFydGl0aW9uIGFscmVhZHkgZXhpc3RzXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCit4YnNkX2xpc3RfdHlwZXModm9pZCkKK3sKKwlsaXN0X3R5cGVzKHhic2RfZnN0eXBlcyk7Cit9CisKK3N0YXRpYyB1aW50MTZfdAoreGJzZF9ka2Nrc3VtKHN0cnVjdCB4YnNkX2Rpc2tsYWJlbCAqbHApCit7CisJdWludDE2X3QgKnN0YXJ0LCAqZW5kOworCXVpbnQxNl90IHN1bSA9IDA7CisKKwlzdGFydCA9ICh1aW50MTZfdCAqKSBscDsKKwllbmQgPSAodWludDE2X3QgKikgJmxwLT5kX3BhcnRpdGlvbnNbbHAtPmRfbnBhcnRpdGlvbnNdOworCXdoaWxlIChzdGFydCA8IGVuZCkKKwkJc3VtIF49ICpzdGFydCsrOworCXJldHVybiBzdW07Cit9CisKK3N0YXRpYyBpbnQKK3hic2RfaW5pdGxhYmVsKHN0cnVjdCBwYXJ0aXRpb24gKnApCit7CisJc3RydWN0IHhic2RfZGlza2xhYmVsICpkID0gJnhic2RfZGxhYmVsOworCXN0cnVjdCB4YnNkX3BhcnRpdGlvbiAqcHA7CisKKwlnZXRfZ2VvbWV0cnkoKTsKKwltZW1zZXQoZCwgMCwgc2l6ZW9mKHN0cnVjdCB4YnNkX2Rpc2tsYWJlbCkpOworCisJZC0+ZF9tYWdpYyA9IEJTRF9ESVNLTUFHSUM7CisKKwlpZiAoaXNfcHJlZml4ZWRfd2l0aChkaXNrX2RldmljZSwgIi9kZXYvc2QiKSkKKwkJZC0+ZF90eXBlID0gQlNEX0RUWVBFX1NDU0k7CisJZWxzZQorCQlkLT5kX3R5cGUgPSBCU0RfRFRZUEVfU1Q1MDY7CisKKyNpZiAhZGVmaW5lZChfX2FscGhhX18pCisJZC0+ZF9mbGFncyA9IEJTRF9EX0RPU1BBUlQ7CisjZWxzZQorCWQtPmRfZmxhZ3MgPSAwOworI2VuZGlmCisJZC0+ZF9zZWNzaXplID0gU0VDVE9SX1NJWkU7ICAgICAgICAgICAvKiBieXRlcy9zZWN0b3IgICovCisJZC0+ZF9uc2VjdG9ycyA9IGdfc2VjdG9yczsgICAgICAgICAgICAvKiBzZWN0b3JzL3RyYWNrICovCisJZC0+ZF9udHJhY2tzID0gZ19oZWFkczsgICAgICAgICAgICAgICAvKiB0cmFja3MvY3lsaW5kZXIgKGhlYWRzKSAqLworCWQtPmRfbmN5bGluZGVycyA9IGdfY3lsaW5kZXJzOworCWQtPmRfc2VjcGVyY3lsICA9IGdfc2VjdG9ycyAqIGdfaGVhZHM7Lyogc2VjdG9ycy9jeWxpbmRlciAqLworCWlmIChkLT5kX3NlY3BlcmN5bCA9PSAwKQorCQlkLT5kX3NlY3BlcmN5bCA9IDE7ICAgICAgICAgICAvKiBhdm9pZCBzZWdmYXVsdHMgKi8KKwlkLT5kX3NlY3BlcnVuaXQgPSBkLT5kX3NlY3BlcmN5bCAqIGQtPmRfbmN5bGluZGVyczsKKworCWQtPmRfcnBtID0gMzYwMDsKKwlkLT5kX2ludGVybGVhdmUgPSAxOworCWQtPmRfdHJhY2tza2V3ID0gMDsKKwlkLT5kX2N5bHNrZXcgPSAwOworCWQtPmRfaGVhZHN3aXRjaCA9IDA7CisJZC0+ZF90cmtzZWVrID0gMDsKKworCWQtPmRfbWFnaWMyID0gQlNEX0RJU0tNQUdJQzsKKwlkLT5kX2Jic2l6ZSA9IEJTRF9CQlNJWkU7CisJZC0+ZF9zYnNpemUgPSBCU0RfU0JTSVpFOworCisjaWYgIWRlZmluZWQoX19hbHBoYV9fKQorCWQtPmRfbnBhcnRpdGlvbnMgPSA0OworCXBwID0gJmQtPmRfcGFydGl0aW9uc1syXTsgLyogUGFydGl0aW9uIEMgc2hvdWxkIGJlIE5ldEJTRCBwYXJ0aXRpb24gKi8KKworCXBwLT5wX29mZnNldCA9IGdldF9zdGFydF9zZWN0KHApOworCXBwLT5wX3NpemUgICA9IGdldF9ucl9zZWN0cyhwKTsKKwlwcC0+cF9mc3R5cGUgPSBCU0RfRlNfVU5VU0VEOworCXBwID0gJmQtPmRfcGFydGl0aW9uc1szXTsgLyogUGFydGl0aW9uIEQgc2hvdWxkIGJlIHdob2xlIGRpc2sgKi8KKworCXBwLT5wX29mZnNldCA9IDA7CisJcHAtPnBfc2l6ZSAgID0gZC0+ZF9zZWNwZXJ1bml0OworCXBwLT5wX2ZzdHlwZSA9IEJTRF9GU19VTlVTRUQ7CisjZWxzZQorCWQtPmRfbnBhcnRpdGlvbnMgPSAzOworCXBwID0gJmQtPmRfcGFydGl0aW9uc1syXTsgLyogUGFydGl0aW9uIEMgc2hvdWxkIGJlIHRoZSB3aG9sZSBkaXNrICovCisJcHAtPnBfb2Zmc2V0ID0gMDsKKwlwcC0+cF9zaXplICAgPSBkLT5kX3NlY3BlcnVuaXQ7CisJcHAtPnBfZnN0eXBlID0gQlNEX0ZTX1VOVVNFRDsKKyNlbmRpZgorCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBSZWFkIGEgeGJzZF9kaXNrbGFiZWwgZnJvbSBzZWN0b3IgMCBvciBmcm9tIHRoZSBzdGFydGluZyBzZWN0b3Igb2YgcC4KKyAqIElmIGl0IGhhcyB0aGUgcmlnaHQgbWFnaWMsIHJldHVybiAxLgorICovCitzdGF0aWMgaW50Cit4YnNkX3JlYWRsYWJlbChzdHJ1Y3QgcGFydGl0aW9uICpwKQoreworCXN0cnVjdCB4YnNkX2Rpc2tsYWJlbCAqZDsKKwlpbnQgdCwgc2VjdG9yOworCisJaWYgKCFic2RfZ2xvYmFsc19wdHIpCisJCWJzZF9nbG9iYWxzX3B0ciA9IHh6YWxsb2Moc2l6ZW9mKCpic2RfZ2xvYmFsc19wdHIpKTsKKworCWQgPSAmeGJzZF9kbGFiZWw7CisKKwkvKiBwIGlzIHVzZWQgb25seSB0byBnZXQgdGhlIHN0YXJ0aW5nIHNlY3RvciAqLworI2lmICFkZWZpbmVkKF9fYWxwaGFfXykKKwlzZWN0b3IgPSAocCA/IGdldF9zdGFydF9zZWN0KHApIDogMCk7CisjZWxzZQorCXNlY3RvciA9IDA7CisjZW5kaWYKKworCXNlZWtfc2VjdG9yKHNlY3Rvcik7CisJaWYgKEJTRF9CQlNJWkUgIT0gZnVsbF9yZWFkKGRldl9mZCwgZGlza2xhYmVsYnVmZmVyLCBCU0RfQkJTSVpFKSkKKwkJZmRpc2tfZmF0YWwodW5hYmxlX3RvX3JlYWQpOworCisJbWVtbW92ZShkLCAmZGlza2xhYmVsYnVmZmVyW0JTRF9MQUJFTFNFQ1RPUiAqIFNFQ1RPUl9TSVpFICsgQlNEX0xBQkVMT0ZGU0VUXSwKKwkJCXNpemVvZihzdHJ1Y3QgeGJzZF9kaXNrbGFiZWwpKTsKKworCWlmIChkLT5kX21hZ2ljICE9IEJTRF9ESVNLTUFHSUMgfHwgZC0+ZF9tYWdpYzIgIT0gQlNEX0RJU0tNQUdJQykKKwkJcmV0dXJuIDA7CisKKwlmb3IgKHQgPSBkLT5kX25wYXJ0aXRpb25zOyB0IDwgQlNEX01BWFBBUlRJVElPTlM7IHQrKykgeworCQlkLT5kX3BhcnRpdGlvbnNbdF0ucF9zaXplICAgPSAwOworCQlkLT5kX3BhcnRpdGlvbnNbdF0ucF9vZmZzZXQgPSAwOworCQlkLT5kX3BhcnRpdGlvbnNbdF0ucF9mc3R5cGUgPSBCU0RfRlNfVU5VU0VEOworCX0KKworCWlmIChkLT5kX25wYXJ0aXRpb25zID4gQlNEX01BWFBBUlRJVElPTlMpCisJCXByaW50ZigiV2FybmluZzogdG9vIG1hbnkgcGFydGl0aW9ucyAoJXUsIG1heGltdW0gaXMgJXUpXG4iLAorCQkJZC0+ZF9ucGFydGl0aW9ucywgQlNEX01BWFBBUlRJVElPTlMpOworCXJldHVybiAxOworfQorCitzdGF0aWMgaW50Cit4YnNkX3dyaXRlbGFiZWwoc3RydWN0IHBhcnRpdGlvbiAqcCkKK3sKKwlzdHJ1Y3QgeGJzZF9kaXNrbGFiZWwgKmQgPSAmeGJzZF9kbGFiZWw7CisJdW5zaWduZWQgaW50IHNlY3RvcjsKKworI2lmICFkZWZpbmVkKF9fYWxwaGFfXykgJiYgIWRlZmluZWQoX19wb3dlcnBjX18pICYmICFkZWZpbmVkKF9faHBwYV9fKQorCXNlY3RvciA9IGdldF9zdGFydF9zZWN0KHApICsgQlNEX0xBQkVMU0VDVE9SOworI2Vsc2UKKwkodm9pZClwOyAvKiBzaWxlbmNlIHdhcm5pbmcgKi8KKwlzZWN0b3IgPSBCU0RfTEFCRUxTRUNUT1I7CisjZW5kaWYKKworCWQtPmRfY2hlY2tzdW0gPSAwOworCWQtPmRfY2hlY2tzdW0gPSB4YnNkX2RrY2tzdW0oZCk7CisKKwkvKiBUaGlzIGlzIG5lY2Vzc2FyeSBpZiB3ZSB3YW50IHRvIHdyaXRlIHRoZSBib290c3RyYXAgbGF0ZXIsCisJICAgb3RoZXJ3aXNlIHdlJ2Qgd3JpdGUgdGhlIG9sZCBkaXNrbGFiZWwgd2l0aCB0aGUgYm9vdHN0cmFwLgorCSovCisJbWVtbW92ZSgmZGlza2xhYmVsYnVmZmVyW0JTRF9MQUJFTFNFQ1RPUiAqIFNFQ1RPUl9TSVpFICsgQlNEX0xBQkVMT0ZGU0VUXSwKKwkJZCwgc2l6ZW9mKHN0cnVjdCB4YnNkX2Rpc2tsYWJlbCkpOworCisjaWYgZGVmaW5lZChfX2FscGhhX18pICYmIEJTRF9MQUJFTFNFQ1RPUiA9PSAwCisJYWxwaGFfYm9vdGJsb2NrX2NoZWNrc3VtKGRpc2tsYWJlbGJ1ZmZlcik7CisJc2Vla19zZWN0b3IoMCk7CisJeHdyaXRlKGRldl9mZCwgZGlza2xhYmVsYnVmZmVyLCBCU0RfQkJTSVpFKTsKKyNlbHNlCisJc2Vla19zZWN0b3Ioc2VjdG9yKTsKKwlsc2VlayhkZXZfZmQsIEJTRF9MQUJFTE9GRlNFVCwgU0VFS19DVVIpOworCXh3cml0ZShkZXZfZmQsIGQsIHNpemVvZigqZCkpOworI2VuZGlmCisJc3luY19kaXNrcygpOworCXJldHVybiAxOworfQorCisKKyNpZiAhZGVmaW5lZChfX2FscGhhX18pCitzdGF0aWMgaW50Cit4YnNkX3RyYW5zbGF0ZV9mc3R5cGUoaW50IGxpbnV4X3R5cGUpCit7CisJc3dpdGNoIChsaW51eF90eXBlKSB7CisJY2FzZSAweDAxOiAvKiBET1MgMTItYml0IEZBVCAgICovCisJY2FzZSAweDA0OiAvKiBET1MgMTYtYml0IDwzMk0gICovCisJY2FzZSAweDA2OiAvKiBET1MgMTYtYml0ID49MzJNICovCisJY2FzZSAweGUxOiAvKiBET1MgYWNjZXNzICAgICAgICovCisJY2FzZSAweGUzOiAvKiBET1MgUi9PICAgICAgICAgICovCisJY2FzZSAweGYyOiAvKiBET1Mgc2Vjb25kYXJ5ICAgICovCisJCXJldHVybiBCU0RfRlNfTVNET1M7CisJY2FzZSAweDA3OiAvKiBPUy8yIEhQRlMgICAgICAgICovCisJCXJldHVybiBCU0RfRlNfSFBGUzsKKwlkZWZhdWx0OgorCQlyZXR1cm4gQlNEX0ZTX09USEVSOworCX0KK30KKworc3RhdGljIHZvaWQKK3hic2RfbGlua19wYXJ0KHZvaWQpCit7CisJaW50IGssIGk7CisJc3RydWN0IHBhcnRpdGlvbiAqcDsKKworCWsgPSBnZXRfcGFydGl0aW9uKDEsIGdfcGFydGl0aW9ucyk7CisKKwlpZiAoIXhic2RfY2hlY2tfbmV3X3BhcnRpdGlvbigmaSkpCisJCXJldHVybjsKKworCXAgPSBnZXRfcGFydF90YWJsZShrKTsKKworCXhic2RfZGxhYmVsLmRfcGFydGl0aW9uc1tpXS5wX3NpemUgICA9IGdldF9ucl9zZWN0cyhwKTsKKwl4YnNkX2RsYWJlbC5kX3BhcnRpdGlvbnNbaV0ucF9vZmZzZXQgPSBnZXRfc3RhcnRfc2VjdChwKTsKKwl4YnNkX2RsYWJlbC5kX3BhcnRpdGlvbnNbaV0ucF9mc3R5cGUgPSB4YnNkX3RyYW5zbGF0ZV9mc3R5cGUocC0+c3lzX2luZCk7Cit9CisjZW5kaWYKKworI2lmIGRlZmluZWQoX19hbHBoYV9fKQorc3RhdGljIHZvaWQKK2FscGhhX2Jvb3RibG9ja19jaGVja3N1bShjaGFyICpib290KQoreworCXVpbnQ2NF90ICpkcCwgc3VtOworCWludCBpOworCisJZHAgPSAodWludDY0X3QgKilib290OworCXN1bSA9IDA7CisJZm9yIChpID0gMDsgaSA8IDYzOyBpKyspCisJCXN1bSArPSBkcFtpXTsKKwlkcFs2M10gPSBzdW07Cit9CisjZW5kaWYgLyogX19hbHBoYV9fICovCisKKy8qIFVuZGVmaW5lICdnbG9iYWwnIHRyaWNrcyAqLworI3VuZGVmIGRpc2tsYWJlbGJ1ZmZlcgorI3VuZGVmIHhic2RfZGxhYmVsCisKKyNlbmRpZiAvKiBPU0ZfTEFCRUwgKi8KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvZmRpc2tfc2dpLmMgYi91dGlsLWxpbnV4L2ZkaXNrX3NnaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZWJjNTYKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L2ZkaXNrX3NnaS5jCkBAIC0wLDAgKzEsODg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSBBbmRyZWFzIE5ldXBlciwgU2VwIDE5OTguCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU0dJX0xBQkVMCisKKyNkZWZpbmUgU0dJX0RFQlVHIDAKKworI2RlZmluZSBTR0lfVk9MSERSICAgICAgMHgwMAorLyogMSBhbmQgMiB3ZXJlIHVzZWQgZm9yIGRyaXZlIHR5cGVzIG5vIGxvbmdlciBzdXBwb3J0ZWQgYnkgU0dJICovCisjZGVmaW5lIFNHSV9TV0FQICAgICAgICAweDAzCisvKiA0IGFuZCA1IHdlcmUgZm9yIGZpbGVzeXN0ZW0gdHlwZXMgU0dJIGhhdmVuJ3QgZXZlciBzdXBwb3J0ZWQgb24gTUlQUyBDUFVzICovCisjZGVmaW5lIFNHSV9WT0xVTUUgICAgICAweDA2CisjZGVmaW5lIFNHSV9FRlMgICAgICAgICAweDA3CisjZGVmaW5lIFNHSV9MVk9MICAgICAgICAweDA4CisjZGVmaW5lIFNHSV9STFZPTCAgICAgICAweDA5CisjZGVmaW5lIFNHSV9YRlMgICAgICAgICAweDBhCisjZGVmaW5lIFNHSV9YRlNMT0cgICAgICAweDBiCisjZGVmaW5lIFNHSV9YTFYgICAgICAgICAweDBjCisjZGVmaW5lIFNHSV9YVk0gICAgICAgICAweDBkCisjZGVmaW5lIFNHSV9FTlRJUkVfRElTSyBTR0lfVk9MVU1FCisKK3N0cnVjdCBkZXZpY2VfcGFyYW1ldGVyIHsgLyogNDggYnl0ZXMgKi8KKwl1bnNpZ25lZCBjaGFyICBza2V3OworCXVuc2lnbmVkIGNoYXIgIGdhcDE7CisJdW5zaWduZWQgY2hhciAgZ2FwMjsKKwl1bnNpZ25lZCBjaGFyICBzcGFyZWN5bDsKKwl1bnNpZ25lZCBzaG9ydCBwY3lsY291bnQ7CisJdW5zaWduZWQgc2hvcnQgaGVhZF92b2wwOworCXVuc2lnbmVkIHNob3J0IG50cmtzOyAgIC8qIHRyYWNrcyBpbiBjeWwgMCBvciB2b2wgMCAqLworCXVuc2lnbmVkIGNoYXIgIGNtZF90YWdfcXVldWVfZGVwdGg7CisJdW5zaWduZWQgY2hhciAgdW51c2VkMDsKKwl1bnNpZ25lZCBzaG9ydCB1bnVzZWQxOworCXVuc2lnbmVkIHNob3J0IG5zZWN0OyAgIC8qIHNlY3RvcnMvdHJhY2tzIGluIGN5bCAwIG9yIHZvbCAwICovCisJdW5zaWduZWQgc2hvcnQgYnl0ZXM7CisJdW5zaWduZWQgc2hvcnQgaWxmYWN0OworCXVuc2lnbmVkIGludCAgIGZsYWdzOyAgIC8qIGNvbnRyb2xsZXIgZmxhZ3MgKi8KKwl1bnNpZ25lZCBpbnQgICBkYXRhcmF0ZTsKKwl1bnNpZ25lZCBpbnQgICByZXRyaWVzX29uX2Vycm9yOworCXVuc2lnbmVkIGludCAgIG1zX3Blcl93b3JkOworCXVuc2lnbmVkIHNob3J0IHh5bG9naWNzX2dhcDE7CisJdW5zaWduZWQgc2hvcnQgeHlsb2dpY3Nfc3luY2RlbGF5OworCXVuc2lnbmVkIHNob3J0IHh5bG9naWNzX3JlYWRkZWxheTsKKwl1bnNpZ25lZCBzaG9ydCB4eWxvZ2ljc19nYXAyOworCXVuc2lnbmVkIHNob3J0IHh5bG9naWNzX3JlYWRnYXRlOworCXVuc2lnbmVkIHNob3J0IHh5bG9naWNzX3dyaXRlY29udDsKK307CisKKy8qCisgKiBjb250cm9sbGVyIGZsYWdzCisgKi8KKyNkZWZpbmUgU0VDVE9SX1NMSVAgICAgIDB4MDEKKyNkZWZpbmUgU0VDVE9SX0ZXRCAgICAgIDB4MDIKKyNkZWZpbmUgVFJBQ0tfRldEICAgICAgIDB4MDQKKyNkZWZpbmUgVFJBQ0tfTVVMVElWT0wgIDB4MDgKKyNkZWZpbmUgSUdOT1JFX0VSUk9SUyAgIDB4MTAKKyNkZWZpbmUgUkVTRUVLICAgICAgICAgIDB4MjAKKyNkZWZpbmUgRU5BQkxFX0NNRFRBR1EgIDB4NDAKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCAgIG1hZ2ljOyAgICAgICAgICAgIC8qIGV4cGVjdCBTR0lfTEFCRUxfTUFHSUMgKi8KKwl1bnNpZ25lZCBzaG9ydCBib290X3BhcnQ7ICAgICAgICAvKiBhY3RpdmUgYm9vdCBwYXJ0aXRpb24gKi8KKwl1bnNpZ25lZCBzaG9ydCBzd2FwX3BhcnQ7ICAgICAgICAvKiBhY3RpdmUgc3dhcCBwYXJ0aXRpb24gKi8KKwl1bnNpZ25lZCBjaGFyICBib290X2ZpbGVbMTZdOyAgICAvKiBuYW1lIG9mIHRoZSBib290ZmlsZSAqLworCXN0cnVjdCBkZXZpY2VfcGFyYW1ldGVyIGRldnBhcmFtOyAgICAgICAvKiAgMSAqIDQ4IGJ5dGVzICovCisJc3RydWN0IHZvbHVtZV9kaXJlY3RvcnkgeyAgICAgICAgICAgICAgIC8qIDE1ICogMTYgYnl0ZXMgKi8KKwkJdW5zaWduZWQgY2hhciB2b2xfZmlsZV9uYW1lWzhdOyAvKiBhIGNoYXJhY3RlciBhcnJheSAqLworCQl1bnNpZ25lZCBpbnQgIHZvbF9maWxlX3N0YXJ0OyAgIC8qIG51bWJlciBvZiBsb2dpY2FsIGJsb2NrICovCisJCXVuc2lnbmVkIGludCAgdm9sX2ZpbGVfc2l6ZTsgICAgLyogbnVtYmVyIG9mIGJ5dGVzICovCisJfSBkaXJlY3RvcnlbMTVdOworCXN0cnVjdCBzZ2lfcGFydGluZm8geyAgICAgICAgICAgICAgICAgICAvKiAxNiAqIDEyIGJ5dGVzICovCisJCXVuc2lnbmVkIGludCBudW1fc2VjdG9yczsgICAgICAgLyogbnVtYmVyIG9mIGJsb2NrcyAqLworCQl1bnNpZ25lZCBpbnQgc3RhcnRfc2VjdG9yOyAgICAgIC8qIG11c3QgYmUgY3lsaW5kZXIgYWxpZ25lZCAqLworCQl1bnNpZ25lZCBpbnQgaWQ7CisJfSBwYXJ0aXRpb25zWzE2XTsKKwl1bnNpZ25lZCBpbnQgICBjc3VtOworCXVuc2lnbmVkIGludCAgIGZpbGxieXRlczsKK30gc2dpX3BhcnRpdGlvbjsKKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCAgIG1hZ2ljOyAgICAgICAgICAgLyogbG9va3MgbGlrZSBhIG1hZ2ljIG51bWJlciAqLworCXVuc2lnbmVkIGludCAgIGEyOworCXVuc2lnbmVkIGludCAgIGEzOworCXVuc2lnbmVkIGludCAgIGE0OworCXVuc2lnbmVkIGludCAgIGIxOworCXVuc2lnbmVkIHNob3J0IGIyOworCXVuc2lnbmVkIHNob3J0IGIzOworCXVuc2lnbmVkIGludCAgIGNbMTZdOworCXVuc2lnbmVkIHNob3J0IGRbM107CisJdW5zaWduZWQgY2hhciAgc2NzaV9zdHJpbmdbNTBdOworCXVuc2lnbmVkIGNoYXIgIHNlcmlhbFsxMzddOworCXVuc2lnbmVkIHNob3J0IGNoZWNrMTgxNjsKKwl1bnNpZ25lZCBjaGFyICBpbnN0YWxsZXJbMjI1XTsKK30gc2dpaW5mbzsKKworI2RlZmluZSBTR0lfTEFCRUxfTUFHSUMgICAgICAgICAweDBiZTVhOTQxCisjZGVmaW5lIFNHSV9MQUJFTF9NQUdJQ19TV0FQUEVEIDB4NDFhOWU1MGIKKyNkZWZpbmUgU0dJX0lORk9fTUFHSUMgICAgICAgICAgMHgwMDA3Mjk1OQorI2RlZmluZSBTR0lfSU5GT19NQUdJQ19TV0FQUEVEICAweDU5MjkwNzAwCisKKyNkZWZpbmUgU0dJX1NTV0FQMTYoeCkgKHNnaV9vdGhlcl9lbmRpYW4gPyBmZGlza19zd2FwMTYoeCkgOiAodWludDE2X3QpKHgpKQorI2RlZmluZSBTR0lfU1NXQVAzMih4KSAoc2dpX290aGVyX2VuZGlhbiA/IGZkaXNrX3N3YXAzMih4KSA6ICh1aW50MzJfdCkoeCkpCisKKyNkZWZpbmUgc2dpbGFiZWwgKChzZ2lfcGFydGl0aW9uICopTUJSYnVmZmVyKQorI2RlZmluZSBzZ2lwYXJhbSAoc2dpbGFiZWwtPmRldnBhcmFtKQorCisvKgorICoKKyAqIGZkaXNrc2dpbGFiZWwuYworICoKKyAqIENvcHlyaWdodCAoQykgQW5kcmVhcyBOZXVwZXIsIFNlcCAxOTk4LgorICogICAgICBUaGlzIGZpbGUgbWF5IGJlIG1vZGlmaWVkIGFuZCByZWRpc3RyaWJ1dGVkIHVuZGVyCisgKiAgICAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIFB1YmxpYyBMaWNlbnNlLgorICoKKyAqIFNhdCBNYXIgMjAgRVNUIDE5OTkgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgKiAgICAgIEludGVybmF0aW9uYWxpemF0aW9uCisgKi8KKworCitzdGF0aWMgc21hbGxpbnQgc2dpX290aGVyX2VuZGlhbjsgLyogYm9vbCAqLworc3RhdGljIHNtYWxsaW50IHNnaV92b2x1bWVzID0gMTsgLyogbWF4IDE1ICovCisKKy8qCisgKiBvbmx5IGRlYWxpbmcgd2l0aCBmcmVlIGJsb2NrcyBoZXJlCisgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworCXVuc2lnbmVkIGludCBmaXJzdDsKKwl1bnNpZ25lZCBpbnQgbGFzdDsKK30gZnJlZWJsb2NrczsKK3N0YXRpYyBmcmVlYmxvY2tzIGZyZWVsaXN0WzE3XTsgLyogMTYgcGFydGl0aW9ucyBjYW4gcHJvZHVjZSAxNyB2YWNhbnQgc2xvdHMgKi8KKworc3RhdGljIHZvaWQKK3NldGZyZWVsaXN0KGludCBpLCB1bnNpZ25lZCBpbnQgZiwgdW5zaWduZWQgaW50IGwpCit7CisJZnJlZWxpc3RbaV0uZmlyc3QgPSBmOworCWZyZWVsaXN0W2ldLmxhc3QgPSBsOworfQorCitzdGF0aWMgdm9pZAorYWRkMmZyZWVsaXN0KHVuc2lnbmVkIGludCBmLCB1bnNpZ25lZCBpbnQgbCkKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgMTc7IGkrKykKKwkJaWYgKGZyZWVsaXN0W2ldLmxhc3QgPT0gMCkKKwkJCWJyZWFrOworCXNldGZyZWVsaXN0KGksIGYsIGwpOworfQorCitzdGF0aWMgdm9pZAorY2xlYXJmcmVlbGlzdCh2b2lkKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IDE3OyBpKyspCisJCXNldGZyZWVsaXN0KGksIDAsIDApOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50Citpc2luZnJlZWxpc3QodW5zaWduZWQgaW50IGIpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTc7IGkrKykKKwkJaWYgKGZyZWVsaXN0W2ldLmZpcnN0IDw9IGIgJiYgZnJlZWxpc3RbaV0ubGFzdCA+PSBiKQorCQkJcmV0dXJuIGZyZWVsaXN0W2ldLmxhc3Q7CisJcmV0dXJuIDA7Cit9CisJLyogcmV0dXJuIGxhc3QgdmFjYW50IGJsb2NrIG9mIHRoaXMgc3RyaWRlIChuZXZlciAwKS4gKi8KKwkvKiB0aGUgJz49JyBpcyBub3QgcXVpdGUgY29ycmVjdCwgYnV0IHNpbXBsaWZpZXMgdGhlIGNvZGUgKi8KKy8qCisgKiBlbmQgb2YgZnJlZSBibG9ja3Mgc2VjdGlvbgorICovCisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBzZ2lfc3lzX3R5cGVzW10gPSB7CisvKiBTR0lfVk9MSERSICAgKi8JIlx4MDAiICJTR0kgdm9saGRyIiAgLAorLyogMHgwMSAgICAgICAgICovCSJceDAxIiAiU0dJIHRya3JlcGwiICwKKy8qIDB4MDIgICAgICAgICAqLwkiXHgwMiIgIlNHSSBzZWNyZXBsIiAsCisvKiBTR0lfU1dBUCAgICAgKi8JIlx4MDMiICJTR0kgcmF3IiAgICAgLAorLyogMHgwNCAgICAgICAgICovCSJceDA0IiAiU0dJIGJzZCIgICAgICwKKy8qIDB4MDUgICAgICAgICAqLwkiXHgwNSIgIlNHSSBzeXN2IiAgICAsCisvKiBTR0lfRU5USVJFX0RJU0sgICovCSJceDA2IiAiU0dJIHZvbHVtZSIgICwKKy8qIFNHSV9FRlMgICAgICAqLwkiXHgwNyIgIlNHSSBlZnMiICAgICAsCisvKiAweDA4ICAgICAgICAgKi8JIlx4MDgiICJTR0kgbHZvbCIgICAgLAorLyogMHgwOSAgICAgICAgICovCSJceDA5IiAiU0dJIHJsdm9sIiAgICwKKy8qIFNHSV9YRlMgICAgICAqLwkiXHgwYSIgIlNHSSB4ZnMiICAgICAsCisvKiBTR0lfWEZTTE9HICAgKi8JIlx4MGIiICJTR0kgeGZzbG9nIiAgLAorLyogU0dJX1hMViAgICAgICovCSJceDBjIiAiU0dJIHhsdiIgICAgICwKKy8qIFNHSV9YVk0gICAgICAqLwkiXHgwZCIgIlNHSSB4dm0iICAgICAsCisvKiBMSU5VWF9TV0FQICAgKi8JIlx4ODIiICJMaW51eCBzd2FwIiAgLAorLyogTElOVVhfTkFUSVZFICovCSJceDgzIiAiTGludXggbmF0aXZlIiwKKy8qIExJTlVYX0xWTSAgICAqLwkiXHg4ZCIgIkxpbnV4IExWTSIgICAsCisvKiBMSU5VWF9SQUlEICAgKi8JIlx4ZmQiICJMaW51eCBSQUlEIiAgLAorCQkJTlVMTAorfTsKKworCitzdGF0aWMgaW50CitzZ2lfZ2V0X25zZWN0KHZvaWQpCit7CisJcmV0dXJuIFNHSV9TU1dBUDE2KHNnaWxhYmVsLT5kZXZwYXJhbS5uc2VjdCk7Cit9CisKK3N0YXRpYyBpbnQKK3NnaV9nZXRfbnRya3Modm9pZCkKK3sKKwlyZXR1cm4gU0dJX1NTV0FQMTYoc2dpbGFiZWwtPmRldnBhcmFtLm50cmtzKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAordHdvX3NfY29tcGxlbWVudF8zMmJpdF9zdW0odW5zaWduZWQgaW50KiBiYXNlLCBpbnQgc2l6ZSAvKiBpbiBieXRlcyAqLykKK3sKKwlpbnQgaSA9IDA7CisJdW5zaWduZWQgaW50IHN1bSA9IDA7CisKKwlzaXplIC89IHNpemVvZih1bnNpZ25lZCBpbnQpOworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCXN1bSAtPSBTR0lfU1NXQVAzMihiYXNlW2ldKTsKKwlyZXR1cm4gc3VtOworfQorCit2b2lkIEJVR19iYWRfc2dpX3BhcnRpdGlvbl9zaXplKHZvaWQpOworCitzdGF0aWMgaW50CitjaGVja19zZ2lfbGFiZWwodm9pZCkKK3sKKwlpZiAoc2l6ZW9mKHNnaV9wYXJ0aXRpb24pID4gNTEyKSB7CisJCS8qIEFjY29yZGluZyB0byBNSVBTIENvbXB1dGVyIFN5c3RlbXMsIEluYyB0aGUgbGFiZWwKKwkJICogbXVzdCBub3QgY29udGFpbiBtb3JlIHRoYW4gNTEyIGJ5dGVzICovCisJCUJVR19iYWRfc2dpX3BhcnRpdGlvbl9zaXplKCk7CisJfQorCisJaWYgKHNnaWxhYmVsLT5tYWdpYyAhPSBTR0lfTEFCRUxfTUFHSUMKKwkgJiYgc2dpbGFiZWwtPm1hZ2ljICE9IFNHSV9MQUJFTF9NQUdJQ19TV0FQUEVECisJKSB7CisJCWN1cnJlbnRfbGFiZWxfdHlwZSA9IExBQkVMX0RPUzsKKwkJcmV0dXJuIDA7CisJfQorCisJc2dpX290aGVyX2VuZGlhbiA9IChzZ2lsYWJlbC0+bWFnaWMgPT0gU0dJX0xBQkVMX01BR0lDX1NXQVBQRUQpOworCS8qCisJICogdGVzdCBmb3IgY29ycmVjdCBjaGVja3N1bQorCSAqLworCWlmICh0d29fc19jb21wbGVtZW50XzMyYml0X3N1bSgodW5zaWduZWQgaW50KilzZ2lsYWJlbCwKKwkJCQlzaXplb2YoKnNnaWxhYmVsKSkpIHsKKwkJcHJpbnRmKCJEZXRlY3RlZCBzZ2kgZGlza2xhYmVsIHdpdGggd3JvbmcgY2hlY2tzdW1cbiIpOworCX0KKwl1cGRhdGVfdW5pdHMoKTsKKwljdXJyZW50X2xhYmVsX3R5cGUgPSBMQUJFTF9TR0k7CisJZ19wYXJ0aXRpb25zID0gMTY7CisJc2dpX3ZvbHVtZXMgPSAxNTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorc2dpX2dldF9zdGFydF9zZWN0b3IoaW50IGkpCit7CisJcmV0dXJuIFNHSV9TU1dBUDMyKHNnaWxhYmVsLT5wYXJ0aXRpb25zW2ldLnN0YXJ0X3NlY3Rvcik7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQKK3NnaV9nZXRfbnVtX3NlY3RvcnMoaW50IGkpCit7CisJcmV0dXJuIFNHSV9TU1dBUDMyKHNnaWxhYmVsLT5wYXJ0aXRpb25zW2ldLm51bV9zZWN0b3JzKTsKK30KKworc3RhdGljIGludAorc2dpX2dldF9zeXNpZChpbnQgaSkKK3sKKwlyZXR1cm4gU0dJX1NTV0FQMzIoc2dpbGFiZWwtPnBhcnRpdGlvbnNbaV0uaWQpOworfQorCitzdGF0aWMgaW50CitzZ2lfZ2V0X2Jvb3RwYXJ0aXRpb24odm9pZCkKK3sKKwlyZXR1cm4gU0dJX1NTV0FQMTYoc2dpbGFiZWwtPmJvb3RfcGFydCk7Cit9CisKK3N0YXRpYyBpbnQKK3NnaV9nZXRfc3dhcHBhcnRpdGlvbih2b2lkKQoreworCXJldHVybiBTR0lfU1NXQVAxNihzZ2lsYWJlbC0+c3dhcF9wYXJ0KTsKK30KKworc3RhdGljIHZvaWQKK3NnaV9saXN0X3RhYmxlKGludCB4dHJhKQoreworCWludCBpLCB3LCB3ZDsKKwlpbnQga3BpID0gMDsgICAgICAgICAgICAgICAgLyoga2VybmVsIHBhcnRpdGlvbiBJRCAqLworCisJaWYgKHh0cmEpIHsKKwkJcHJpbnRmKCJcbkRpc2sgJXMgKFNHSSBkaXNrIGxhYmVsKTogJXUgaGVhZHMsICV1IHNlY3RvcnNcbiIKKwkJCSIldSBjeWxpbmRlcnMsICV1IHBoeXNpY2FsIGN5bGluZGVyc1xuIgorCQkJIiV1IGV4dHJhIHNlY3RzL2N5bCwgaW50ZXJsZWF2ZSAldToxXG4iCisJCQkiJXNcbiIKKwkJCSJVbml0cyA9ICVzIG9mICV1ICogNTEyIGJ5dGVzXG5cbiIsCisJCQlkaXNrX2RldmljZSwgZ19oZWFkcywgZ19zZWN0b3JzLCBnX2N5bGluZGVycywKKwkJCVNHSV9TU1dBUDE2KHNnaXBhcmFtLnBjeWxjb3VudCksCisJCQlTR0lfU1NXQVAxNihzZ2lwYXJhbS5zcGFyZWN5bCksCisJCQlTR0lfU1NXQVAxNihzZ2lwYXJhbS5pbGZhY3QpLAorCQkJKGNoYXIgKilzZ2lsYWJlbCwKKwkJCXN0cl91bml0cyhQTFVSQUwpLCB1bml0c19wZXJfc2VjdG9yKTsKKwl9IGVsc2UgeworCQlwcmludGYoIlxuRGlzayAlcyAoU0dJIGRpc2sgbGFiZWwpOiAiCisJCQkiJXUgaGVhZHMsICV1IHNlY3RvcnMsICV1IGN5bGluZGVyc1xuIgorCQkJIlVuaXRzID0gJXMgb2YgJXUgKiA1MTIgYnl0ZXNcblxuIiwKKwkJCWRpc2tfZGV2aWNlLCBnX2hlYWRzLCBnX3NlY3RvcnMsIGdfY3lsaW5kZXJzLAorCQkJc3RyX3VuaXRzKFBMVVJBTCksIHVuaXRzX3Blcl9zZWN0b3IgKTsKKwl9CisKKwl3ID0gc3RybGVuKGRpc2tfZGV2aWNlKTsKKwl3ZCA9IHNpemVvZigiRGV2aWNlIikgLSAxOworCWlmICh3IDwgd2QpCisJdyA9IHdkOworCisJcHJpbnRmKCItLS0tLSBwYXJ0aXRpb25zIC0tLS0tXG4iCisJCSJQdCMgJSpzICBJbmZvICAgICBTdGFydCAgICAgICBFbmQgICBTZWN0b3JzICBJZCAgU3lzdGVtXG4iLAorCQl3ICsgMiwgIkRldmljZSIpOworCWZvciAoaSA9IDA7IGkgPCBnX3BhcnRpdGlvbnM7IGkrKykgeworCQlpZiAoc2dpX2dldF9udW1fc2VjdG9ycyhpKSB8fCBTR0lfREVCVUcpIHsKKwkJCXVpbnQzMl90IHN0YXJ0ID0gc2dpX2dldF9zdGFydF9zZWN0b3IoaSk7CisJCQl1aW50MzJfdCBsZW4gPSBzZ2lfZ2V0X251bV9zZWN0b3JzKGkpOworCQkJa3BpKys7ICAgICAgICAgICAgICAvKiBvbmx5IGNvdW50IG5vbmVtcHR5IHBhcnRpdGlvbnMgKi8KKwkJCXByaW50ZigKKwkJCSIlMnU6ICVzICU0cyAlOWx1ICU5bHUgJTlsdSAgJTJ4ICAlc1xuIiwKKy8qIGZkaXNrIHBhcnQgbnVtYmVyICovCWkrMSwKKy8qIGRldmljZSAqLyAgICAgICAgICAgIHBhcnRuYW1lKGRpc2tfZGV2aWNlLCBrcGksIHcrMyksCisvKiBmbGFncyAqLyAgICAgICAgICAgICAoc2dpX2dldF9zd2FwcGFydGl0aW9uKCkgPT0gaSkgPyAic3dhcCIgOgorLyogZmxhZ3MgKi8gICAgICAgICAgICAgKHNnaV9nZXRfYm9vdHBhcnRpdGlvbigpID09IGkpID8gImJvb3QiIDogIiAgICAiLAorLyogc3RhcnQgKi8gICAgICAgICAgICAgKGxvbmcpIHNjcm91bmQoc3RhcnQpLAorLyogZW5kICovICAgICAgICAgICAgICAgKGxvbmcpIHNjcm91bmQoc3RhcnQrbGVuKS0xLAorLyogbm8gb2RkIGZsYWcgb24gZW5kICovKGxvbmcpIGxlbiwKKy8qIHR5cGUgaWQgKi8gICAgICAgICAgIHNnaV9nZXRfc3lzaWQoaSksCisvKiB0eXBlIG5hbWUgKi8gICAgICAgICBwYXJ0aXRpb25fdHlwZShzZ2lfZ2V0X3N5c2lkKGkpKSk7CisJCX0KKwl9CisJcHJpbnRmKCItLS0tLSBCb290aW5mbyAtLS0tLVxuQm9vdGZpbGU6ICVzXG4iCisJCSItLS0tLSBEaXJlY3RvcnkgRW50cmllcyAtLS0tLVxuIiwKKwkJc2dpbGFiZWwtPmJvb3RfZmlsZSk7CisJZm9yIChpID0gMDsgaSA8IHNnaV92b2x1bWVzOyBpKyspIHsKKwkJaWYgKHNnaWxhYmVsLT5kaXJlY3RvcnlbaV0udm9sX2ZpbGVfc2l6ZSkgeworCQkJdWludDMyX3Qgc3RhcnQgPSBTR0lfU1NXQVAzMihzZ2lsYWJlbC0+ZGlyZWN0b3J5W2ldLnZvbF9maWxlX3N0YXJ0KTsKKwkJCXVpbnQzMl90IGxlbiA9IFNHSV9TU1dBUDMyKHNnaWxhYmVsLT5kaXJlY3RvcnlbaV0udm9sX2ZpbGVfc2l6ZSk7CisJCQl1bnNpZ25lZCBjaGFyICpuYW1lID0gc2dpbGFiZWwtPmRpcmVjdG9yeVtpXS52b2xfZmlsZV9uYW1lOworCisJCQlwcmludGYoIiUydTogJS0xMHMgc2VjdG9yJTV1IHNpemUlOHVcbiIsCisJCQkJaSwgKGNoYXIqKW5hbWUsICh1bnNpZ25lZCBpbnQpIHN0YXJ0LCAodW5zaWduZWQgaW50KSBsZW4pOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorc2dpX3NldF9ib290cGFydGl0aW9uKGludCBpKQoreworCXNnaWxhYmVsLT5ib290X3BhcnQgPSBTR0lfU1NXQVAxNigoKHNob3J0KWkpKTsKK30KKworc3RhdGljIHVuc2lnbmVkIGludAorc2dpX2dldF9sYXN0YmxvY2sodm9pZCkKK3sKKwlyZXR1cm4gZ19oZWFkcyAqIGdfc2VjdG9ycyAqIGdfY3lsaW5kZXJzOworfQorCitzdGF0aWMgdm9pZAorc2dpX3NldF9zd2FwcGFydGl0aW9uKGludCBpKQoreworCXNnaWxhYmVsLT5zd2FwX3BhcnQgPSBTR0lfU1NXQVAxNigoKHNob3J0KWkpKTsKK30KKworc3RhdGljIGludAorc2dpX2NoZWNrX2Jvb3RmaWxlKGNvbnN0IGNoYXIqIGFGaWxlKQoreworCWlmIChzdHJsZW4oYUZpbGUpIDwgMykgLyogIi9hXG4iIGlzIG1pbmltdW0gKi8geworCQlwcmludGYoIlxuSW52YWxpZCBCb290ZmlsZSFcbiIKKwkJCSJcdFRoZSBib290ZmlsZSBtdXN0IGJlIGFuIGFic29sdXRlIG5vbi16ZXJvIHBhdGhuYW1lLFxuIgorCQkJIlx0ZS5nLiBcIi91bml4XCIgb3IgXCIvdW5peC5zYXZlXCIuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChzdHJsZW4oYUZpbGUpID4gMTYpIHsKKwkJcHJpbnRmKCJcbk5hbWUgb2YgQm9vdGZpbGUgdG9vIGxvbmcgKD4xNiBieXRlcylcbiIpOworCQlyZXR1cm4gMDsKKwl9CisJaWYgKGFGaWxlWzBdICE9ICcvJykgeworCQlwcmludGYoIlxuQm9vdGZpbGUgbXVzdCBoYXZlIGEgZnVsbHkgcXVhbGlmaWVkIHBhdGhuYW1lXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCWlmIChzdHJuY21wKGFGaWxlLCAoY2hhciopc2dpbGFiZWwtPmJvb3RfZmlsZSwgMTYpKSB7CisJCXByaW50ZigiXG5CZSBhd2FyZSwgdGhhdCB0aGUgYm9vdGZpbGUgaXMgbm90IGNoZWNrZWQgZm9yIGV4aXN0ZW5jZS5cbiIKKwkJCSAiXHRTR0kncyBkZWZhdWx0IGlzIFwiL3VuaXhcIiBhbmQgZm9yIGJhY2t1cCBcIi91bml4LnNhdmVcIi5cbiIpOworCQkvKiBmaWxlbmFtZSBpcyBjb3JyZWN0IGFuZCBkaWQgY2hhbmdlICovCisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsgICAvKiBmaWxlbmFtZSBkaWQgbm90IGNoYW5nZSAqLworfQorCitzdGF0aWMgY29uc3QgY2hhciAqCitzZ2lfZ2V0X2Jvb3RmaWxlKHZvaWQpCit7CisJcmV0dXJuIChjaGFyKilzZ2lsYWJlbC0+Ym9vdF9maWxlOworfQorCitzdGF0aWMgdm9pZAorc2dpX3NldF9ib290ZmlsZShjb25zdCBjaGFyKiBhRmlsZSkKK3sKKwlpbnQgaSA9IDA7CisKKwlpZiAoc2dpX2NoZWNrX2Jvb3RmaWxlKGFGaWxlKSkgeworCQl3aGlsZSAoaSA8IDE2KSB7CisJCQlpZiAoKGFGaWxlW2ldICE9ICdcbicpICAvKiBpbiBwcmluY2lwbGUgY2F1Z2h0IGFnYWluIGJ5IG5leHQgbGluZSAqLworCQkJICYmIChzdHJsZW4oYUZpbGUpID4gaSkpCisJCQkJc2dpbGFiZWwtPmJvb3RfZmlsZVtpXSA9IGFGaWxlW2ldOworCQkJZWxzZQorCQkJCXNnaWxhYmVsLT5ib290X2ZpbGVbaV0gPSAwOworCQkJaSsrOworCQl9CisJCXByaW50ZigiXG5cdEJvb3RmaWxlIGlzIGNoYW5nZWQgdG8gXCIlc1wiXG4iLCBzZ2lsYWJlbC0+Ym9vdF9maWxlKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitjcmVhdGVfc2dpaW5mbyh2b2lkKQoreworCS8qIEkga2VlcCBTR0kncyBoYWJpdCB0byB3cml0ZSB0aGUgc2dpbGFiZWwgdG8gdGhlIHNlY29uZCBibG9jayAqLworCXNnaWxhYmVsLT5kaXJlY3RvcnlbMF0udm9sX2ZpbGVfc3RhcnQgPSBTR0lfU1NXQVAzMigyKTsKKwlzZ2lsYWJlbC0+ZGlyZWN0b3J5WzBdLnZvbF9maWxlX3NpemUgPSBTR0lfU1NXQVAzMihzaXplb2Yoc2dpaW5mbykpOworCXN0cm5jcHkoKGNoYXIqKXNnaWxhYmVsLT5kaXJlY3RvcnlbMF0udm9sX2ZpbGVfbmFtZSwgInNnaWxhYmVsIiwgOCk7Cit9CisKK3N0YXRpYyBzZ2lpbmZvICpmaWxsX3NnaWluZm8odm9pZCk7CisKK3N0YXRpYyB2b2lkCitzZ2lfd3JpdGVfdGFibGUodm9pZCkKK3sKKwlzZ2lsYWJlbC0+Y3N1bSA9IDA7CisJc2dpbGFiZWwtPmNzdW0gPSBTR0lfU1NXQVAzMih0d29fc19jb21wbGVtZW50XzMyYml0X3N1bSgKKwkJCSh1bnNpZ25lZCBpbnQqKXNnaWxhYmVsLCBzaXplb2YoKnNnaWxhYmVsKSkpOworCWFzc2VydCh0d29fc19jb21wbGVtZW50XzMyYml0X3N1bSgKKwkJKHVuc2lnbmVkIGludCopc2dpbGFiZWwsIHNpemVvZigqc2dpbGFiZWwpKSA9PSAwKTsKKworCXdyaXRlX3NlY3RvcigwLCBzZ2lsYWJlbCk7CisJaWYgKGlzX3ByZWZpeGVkX3dpdGgoKGNoYXIqKXNnaWxhYmVsLT5kaXJlY3RvcnlbMF0udm9sX2ZpbGVfbmFtZSwgInNnaWxhYmVsIikpIHsKKwkJLyoKKwkJICoga2VlcCB0aGlzIGhhYml0IG9mIGZpcnN0IHdyaXRpbmcgdGhlICJzZ2lsYWJlbCIuCisJCSAqIEkgbmV2ZXIgdGVzdGVkIHdoZXRoZXIgaXQgd29ya3Mgd2l0aG91dCAoQU4gOTgxMDAyKS4KKwkJICovCisJCXNnaWluZm8gKmluZm8gPSBmaWxsX3NnaWluZm8oKTsKKwkJaW50IGluZm9zdGFydGJsb2NrID0gU0dJX1NTV0FQMzIoc2dpbGFiZWwtPmRpcmVjdG9yeVswXS52b2xfZmlsZV9zdGFydCk7CisJCXdyaXRlX3NlY3RvcihpbmZvc3RhcnRibG9jaywgaW5mbyk7CisJCWZyZWUoaW5mbyk7CisJfQorfQorCitzdGF0aWMgaW50Citjb21wYXJlX3N0YXJ0KGludCAqeCwgaW50ICp5KQoreworCS8qCisJICogc29ydCBhY2NvcmRpbmcgdG8gc3RhcnQgc2VjdG9ycworCSAqIGFuZCBwcmVmZXJzIGxhcmdlc3QgcGFydGl0aW9uOgorCSAqIGVudHJ5IHplcm8gaXMgZW50aXJlIGRpc2sgZW50cnkKKwkgKi8KKwl1bnNpZ25lZCBpbnQgaSA9ICp4OworCXVuc2lnbmVkIGludCBqID0gKnk7CisJdW5zaWduZWQgaW50IGEgPSBzZ2lfZ2V0X3N0YXJ0X3NlY3RvcihpKTsKKwl1bnNpZ25lZCBpbnQgYiA9IHNnaV9nZXRfc3RhcnRfc2VjdG9yKGopOworCXVuc2lnbmVkIGludCBjID0gc2dpX2dldF9udW1fc2VjdG9ycyhpKTsKKwl1bnNpZ25lZCBpbnQgZCA9IHNnaV9nZXRfbnVtX3NlY3RvcnMoaik7CisKKwlpZiAoYSA9PSBiKQorCQlyZXR1cm4gKGQgPiBjKSA/IDEgOiAoZCA9PSBjKSA/IDAgOiAtMTsKKwlyZXR1cm4gKGEgPiBiKSA/IDEgOiAtMTsKK30KKworCitzdGF0aWMgaW50Cit2ZXJpZnlfc2dpKGludCB2ZXJib3NlKQoreworCWludCBJbmRleFsxNl07ICAgICAgLyogbGlzdCBvZiB2YWxpZCBwYXJ0aXRpb25zICovCisJaW50IHNvcnRjb3VudCA9IDA7ICAvKiBudW1iZXIgb2YgdXNlZCBwYXJ0aXRpb25zLCBpLmUuIG5vbi16ZXJvIGxlbmd0aHMgKi8KKwlpbnQgZW50aXJlID0gMCwgaSA9IDA7CisJdW5zaWduZWQgaW50IHN0YXJ0ID0gMDsKKwlsb25nIGxvbmcgZ2FwID0gMDsgICAgICAvKiBjb3VudCB1bnVzZWQgYmxvY2tzICovCisJdW5zaWduZWQgaW50IGxhc3RibG9jayA9IHNnaV9nZXRfbGFzdGJsb2NrKCk7CisKKwljbGVhcmZyZWVsaXN0KCk7CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJaWYgKHNnaV9nZXRfbnVtX3NlY3RvcnMoaSkgIT0gMCkgeworCQkJSW5kZXhbc29ydGNvdW50KytdID0gaTsKKwkJCWlmIChzZ2lfZ2V0X3N5c2lkKGkpID09IFNHSV9FTlRJUkVfRElTSykgeworCQkJCWlmIChlbnRpcmUrKyA9PSAxKSB7CisJCQkJCWlmICh2ZXJib3NlKQorCQkJCQkJcHJpbnRmKCJNb3JlIHRoYW4gb25lIGVudGlyZSBkaXNrIGVudHJ5IHByZXNlbnRcbiIpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZiAoc29ydGNvdW50ID09IDApIHsKKwkJaWYgKHZlcmJvc2UpCisJCQlwcmludGYoIk5vIHBhcnRpdGlvbnMgZGVmaW5lZFxuIik7CisJCXJldHVybiAobGFzdGJsb2NrID4gMCkgPyAxIDogKGxhc3RibG9jayA9PSAwKSA/IDAgOiAtMTsKKwl9CisJcXNvcnQoSW5kZXgsIHNvcnRjb3VudCwgc2l6ZW9mKEluZGV4WzBdKSwgKHZvaWQqKWNvbXBhcmVfc3RhcnQpOworCWlmIChzZ2lfZ2V0X3N5c2lkKEluZGV4WzBdKSA9PSBTR0lfRU5USVJFX0RJU0spIHsKKwkJaWYgKChJbmRleFswXSAhPSAxMCkgJiYgdmVyYm9zZSkKKwkJCXByaW50ZigiSVJJWCBsaWtlcyB3aGVuIFBhcnRpdGlvbiAxMSBjb3ZlcnMgdGhlIGVudGlyZSBkaXNrXG4iKTsKKwkJaWYgKChzZ2lfZ2V0X3N0YXJ0X3NlY3RvcihJbmRleFswXSkgIT0gMCkgJiYgdmVyYm9zZSkKKwkJCXByaW50ZigiVGhlIGVudGlyZSBkaXNrIHBhcnRpdGlvbiBzaG91bGQgc3RhcnQgIgorCQkJCSJhdCBibG9jayAwLFxuIgorCQkJCSJub3QgYXQgZGlza2Jsb2NrICV1XG4iLAorCQkJCXNnaV9nZXRfc3RhcnRfc2VjdG9yKEluZGV4WzBdKSk7CisJCWlmIChTR0lfREVCVUcpICAgICAgLyogSSBkbyBub3QgdW5kZXJzdGFuZCBob3cgc29tZSBkaXNrcyBmdWxmaWwgaXQgKi8KKwkJCWlmICgoc2dpX2dldF9udW1fc2VjdG9ycyhJbmRleFswXSkgIT0gbGFzdGJsb2NrKSAmJiB2ZXJib3NlKQorCQkJCXByaW50ZigiVGhlIGVudGlyZSBkaXNrIHBhcnRpdGlvbiBpcyBvbmx5ICV1IGRpc2tibG9jayBsYXJnZSxcbiIKKwkJCQkJImJ1dCB0aGUgZGlzayBpcyAldSBkaXNrYmxvY2tzIGxvbmdcbiIsCisJCQkJCXNnaV9nZXRfbnVtX3NlY3RvcnMoSW5kZXhbMF0pLCBsYXN0YmxvY2spOworCQkJbGFzdGJsb2NrID0gc2dpX2dldF9udW1fc2VjdG9ycyhJbmRleFswXSk7CisJfSBlbHNlIHsKKwkJaWYgKHZlcmJvc2UpCisJCQlwcmludGYoIk9uZSBQYXJ0aXRpb24gKCMxMSkgc2hvdWxkIGNvdmVyIHRoZSBlbnRpcmUgZGlza1xuIik7CisJCWlmIChTR0lfREVCVUcgPiAyKQorCQkJcHJpbnRmKCJzeXNpZD0ldVx0cGFydGl0aW9uPSV1XG4iLAorCQkJCXNnaV9nZXRfc3lzaWQoSW5kZXhbMF0pLCBJbmRleFswXSsxKTsKKwl9CisJZm9yIChpID0gMSwgc3RhcnQgPSAwOyBpIDwgc29ydGNvdW50OyBpKyspIHsKKwkJaW50IGN5bHNpemUgPSBzZ2lfZ2V0X25zZWN0KCkgKiBzZ2lfZ2V0X250cmtzKCk7CisKKwkJaWYgKChzZ2lfZ2V0X3N0YXJ0X3NlY3RvcihJbmRleFtpXSkgJSBjeWxzaXplKSAhPSAwKSB7CisJCQlpZiAoU0dJX0RFQlVHKSAgICAgIC8qIEkgZG8gbm90IHVuZGVyc3RhbmQgaG93IHNvbWUgZGlza3MgZnVsZmlsIGl0ICovCisJCQkJaWYgKHZlcmJvc2UpCisJCQkJCXByaW50ZigiUGFydGl0aW9uICV1IGRvZXMgbm90IHN0YXJ0IG9uIGN5bGluZGVyIGJvdW5kYXJ5XG4iLAorCQkJCQkJSW5kZXhbaV0rMSk7CisJCX0KKwkJaWYgKHNnaV9nZXRfbnVtX3NlY3RvcnMoSW5kZXhbaV0pICUgY3lsc2l6ZSAhPSAwKSB7CisJCQlpZiAoU0dJX0RFQlVHKSAgICAgIC8qIEkgZG8gbm90IHVuZGVyc3RhbmQgaG93IHNvbWUgZGlza3MgZnVsZmlsIGl0ICovCisJCQkJaWYgKHZlcmJvc2UpCisJCQkJCXByaW50ZigiUGFydGl0aW9uICV1IGRvZXMgbm90IGVuZCBvbiBjeWxpbmRlciBib3VuZGFyeVxuIiwKKwkJCQkJCUluZGV4W2ldKzEpOworCQl9CisJCS8qIFdlIGNhbm5vdCBoYW5kbGUgc2V2ZXJhbCAiZW50aXJlIGRpc2siIGVudHJpZXMuICovCisJCWlmIChzZ2lfZ2V0X3N5c2lkKEluZGV4W2ldKSA9PSBTR0lfRU5USVJFX0RJU0spIGNvbnRpbnVlOworCQlpZiAoc3RhcnQgPiBzZ2lfZ2V0X3N0YXJ0X3NlY3RvcihJbmRleFtpXSkpIHsKKwkJCWlmICh2ZXJib3NlKQorCQkJCXByaW50ZigiUGFydGl0aW9ucyAldSBhbmQgJXUgb3ZlcmxhcCBieSAldSBzZWN0b3JzXG4iLAorCQkJCQlJbmRleFtpLTFdKzEsIEluZGV4W2ldKzEsCisJCQkJCXN0YXJ0IC0gc2dpX2dldF9zdGFydF9zZWN0b3IoSW5kZXhbaV0pKTsKKwkJCWlmIChnYXAgPiAwKSBnYXAgPSAtZ2FwOworCQkJaWYgKGdhcCA9PSAwKSBnYXAgPSAtMTsKKwkJfQorCQlpZiAoc3RhcnQgPCBzZ2lfZ2V0X3N0YXJ0X3NlY3RvcihJbmRleFtpXSkpIHsKKwkJCWlmICh2ZXJib3NlKQorCQkJCXByaW50ZigiVW51c2VkIGdhcCBvZiAldSBzZWN0b3JzIC0gc2VjdG9ycyAldS0ldVxuIiwKKwkJCQkJc2dpX2dldF9zdGFydF9zZWN0b3IoSW5kZXhbaV0pIC0gc3RhcnQsCisJCQkJCXN0YXJ0LCBzZ2lfZ2V0X3N0YXJ0X3NlY3RvcihJbmRleFtpXSktMSk7CisJCQlnYXAgKz0gc2dpX2dldF9zdGFydF9zZWN0b3IoSW5kZXhbaV0pIC0gc3RhcnQ7CisJCQlhZGQyZnJlZWxpc3Qoc3RhcnQsIHNnaV9nZXRfc3RhcnRfc2VjdG9yKEluZGV4W2ldKSk7CisJCX0KKwkJc3RhcnQgPSBzZ2lfZ2V0X3N0YXJ0X3NlY3RvcihJbmRleFtpXSkKKwkJCSAgICsgc2dpX2dldF9udW1fc2VjdG9ycyhJbmRleFtpXSk7CisJCWlmIChTR0lfREVCVUcgPiAxKSB7CisJCQlpZiAodmVyYm9zZSkKKwkJCQlwcmludGYoIiUydTolMTJ1XHQlMTJ1XHQlMTJ1XG4iLCBJbmRleFtpXSwKKwkJCQkJc2dpX2dldF9zdGFydF9zZWN0b3IoSW5kZXhbaV0pLAorCQkJCQlzZ2lfZ2V0X251bV9zZWN0b3JzKEluZGV4W2ldKSwKKwkJCQkJc2dpX2dldF9zeXNpZChJbmRleFtpXSkpOworCQl9CisJfQorCWlmIChzdGFydCA8IGxhc3RibG9jaykgeworCQlpZiAodmVyYm9zZSkKKwkJCXByaW50ZigiVW51c2VkIGdhcCBvZiAldSBzZWN0b3JzIC0gc2VjdG9ycyAldS0ldVxuIiwKKwkJCQlsYXN0YmxvY2sgLSBzdGFydCwgc3RhcnQsIGxhc3RibG9jay0xKTsKKwkJZ2FwICs9IGxhc3RibG9jayAtIHN0YXJ0OworCQlhZGQyZnJlZWxpc3Qoc3RhcnQsIGxhc3RibG9jayk7CisJfQorCS8qCisJICogRG9uZSB3aXRoIGFyaXRobWV0aWNzCisJICogR28gZm9yIGRldGFpbHMgbm93CisJICovCisJaWYgKHZlcmJvc2UpIHsKKwkJaWYgKCFzZ2lfZ2V0X251bV9zZWN0b3JzKHNnaV9nZXRfYm9vdHBhcnRpdGlvbigpKSkgeworCQkJcHJpbnRmKCJcblRoZSBib290IHBhcnRpdGlvbiBkb2VzIG5vdCBleGlzdFxuIik7CisJCX0KKwkJaWYgKCFzZ2lfZ2V0X251bV9zZWN0b3JzKHNnaV9nZXRfc3dhcHBhcnRpdGlvbigpKSkgeworCQkJcHJpbnRmKCJcblRoZSBzd2FwIHBhcnRpdGlvbiBkb2VzIG5vdCBleGlzdFxuIik7CisJCX0gZWxzZSB7CisJCQlpZiAoKHNnaV9nZXRfc3lzaWQoc2dpX2dldF9zd2FwcGFydGl0aW9uKCkpICE9IFNHSV9TV0FQKQorCQkJICYmIChzZ2lfZ2V0X3N5c2lkKHNnaV9nZXRfc3dhcHBhcnRpdGlvbigpKSAhPSBMSU5VWF9TV0FQKSkKKwkJCQlwcmludGYoIlxuVGhlIHN3YXAgcGFydGl0aW9uIGhhcyBubyBzd2FwIHR5cGVcbiIpOworCQl9CisJCWlmIChzZ2lfY2hlY2tfYm9vdGZpbGUoIi91bml4IikpCisJCQlwcmludGYoIlx0WW91IGhhdmUgY2hvc2VuIGFuIHVudXN1YWwgYm9vdCBmaWxlIG5hbWVcbiIpOworCX0KKwlyZXR1cm4gKGdhcCA+IDApID8gMSA6IChnYXAgPT0gMCkgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbnQKK3NnaV9nYXBzKHZvaWQpCit7CisJLyoKKwkgKiByZXR1cm5lZCB2YWx1ZSBpczoKKwkgKiAgPSAwIDogZGlzayBpcyBwcm9wZXJseSBmaWxsZWQgdG8gdGhlIHJpbQorCSAqICA8IDAgOiB0aGVyZSBpcyBhbiBvdmVybGFwCisJICogID4gMCA6IHRoZXJlIGlzIHN0aWxsIHNvbWUgdmFjYW50IHNwYWNlCisJICovCisJcmV0dXJuIHZlcmlmeV9zZ2koMCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZ2lfY2hhbmdlX3N5c2lkKGludCBpLCBpbnQgc3lzKQoreworCWlmIChzZ2lfZ2V0X251bV9zZWN0b3JzKGkpID09IDApIHsgLyogY2F1Z2h0IGFscmVhZHkgYmVmb3JlLCAuLi4gKi8KKwkJcHJpbnRmKCJTb3JyeSB5b3UgbWF5IGNoYW5nZSB0aGUgVGFnIG9mIG5vbi1lbXB0eSBwYXJ0aXRpb25zXG4iKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoKHN5cyAhPSBTR0lfRU5USVJFX0RJU0spICYmIChzeXMgIT0gU0dJX1ZPTEhEUikKKwkgJiYgKHNnaV9nZXRfc3RhcnRfc2VjdG9yKGkpIDwgMSkKKwkpIHsKKwkJcmVhZF9tYXliZV9lbXB0eSgKKwkJCSJJdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB0aGUgcGFydGl0aW9uIGF0IG9mZnNldCAwXG4iCisJCQkiaXMgb2YgdHlwZSBcIlNHSSB2b2xoZHJcIiwgdGhlIElSSVggc3lzdGVtIHdpbGwgcmVseSBvbiBpdCB0b1xuIgorCQkJInJldHJpZXZlIGZyb20gaXRzIGRpcmVjdG9yeSBzdGFuZGFsb25lIHRvb2xzIGxpa2Ugc2FzaCBhbmQgZnguXG4iCisJCQkiT25seSB0aGUgXCJTR0kgdm9sdW1lXCIgZW50aXJlIGRpc2sgc2VjdGlvbiBtYXkgdmlvbGF0ZSB0aGlzLlxuIgorCQkJIlR5cGUgWUVTIGlmIHlvdSBhcmUgc3VyZSBhYm91dCB0YWdnaW5nIHRoaXMgcGFydGl0aW9uIGRpZmZlcmVudGx5LlxuIik7CisJCWlmIChzdHJjbXAobGluZV9wdHIsICJZRVNcbiIpICE9IDApCisJCQlyZXR1cm47CisJfQorCXNnaWxhYmVsLT5wYXJ0aXRpb25zW2ldLmlkID0gU0dJX1NTV0FQMzIoc3lzKTsKK30KKworLyogcmV0dXJucyBwYXJ0aXRpb24gaW5kZXggb2YgZmlyc3QgZW50cnkgbWFya2VkIGFzIGVudGlyZSBkaXNrICovCitzdGF0aWMgaW50CitzZ2lfZW50aXJlKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykKKwkJaWYgKHNnaV9nZXRfc3lzaWQoaSkgPT0gU0dJX1ZPTFVNRSkKKwkJCXJldHVybiBpOworCXJldHVybiAtMTsKK30KKworc3RhdGljIHZvaWQKK3NnaV9zZXRfcGFydGl0aW9uKGludCBpLCB1bnNpZ25lZCBpbnQgc3RhcnQsIHVuc2lnbmVkIGludCBsZW5ndGgsIGludCBzeXMpCit7CisJc2dpbGFiZWwtPnBhcnRpdGlvbnNbaV0uaWQgPSBTR0lfU1NXQVAzMihzeXMpOworCXNnaWxhYmVsLT5wYXJ0aXRpb25zW2ldLm51bV9zZWN0b3JzID0gU0dJX1NTV0FQMzIobGVuZ3RoKTsKKwlzZ2lsYWJlbC0+cGFydGl0aW9uc1tpXS5zdGFydF9zZWN0b3IgPSBTR0lfU1NXQVAzMihzdGFydCk7CisJc2V0X2NoYW5nZWQoaSk7CisJaWYgKHNnaV9nYXBzKCkgPCAwKSAgICAgLyogcmVidWlsZCBmcmVlbGlzdCAqLworCQlwcmludGYoIlBhcnRpdGlvbiBvdmVybGFwIGRldGVjdGVkXG4iKTsKK30KKworc3RhdGljIHZvaWQKK3NnaV9zZXRfZW50aXJlKHZvaWQpCit7CisJaW50IG47CisKKwlmb3IgKG4gPSAxMDsgbiA8IGdfcGFydGl0aW9uczsgbisrKSB7CisJCWlmICghc2dpX2dldF9udW1fc2VjdG9ycyhuKSApIHsKKwkJCXNnaV9zZXRfcGFydGl0aW9uKG4sIDAsIHNnaV9nZXRfbGFzdGJsb2NrKCksIFNHSV9WT0xVTUUpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitzZ2lfc2V0X3ZvbGhkcih2b2lkKQoreworCWludCBuOworCisJZm9yIChuID0gODsgbiA8IGdfcGFydGl0aW9uczsgbisrKSB7CisJaWYgKCFzZ2lfZ2V0X251bV9zZWN0b3JzKG4pKSB7CisJCS8qCisJCSAqIDUgY3lsaW5kZXJzIGlzIGFuIGFyYml0cmFyeSB2YWx1ZSBJIGxpa2UKKwkJICogSVJJWCA1LjMgc3RvcmVkIGZpbGVzIGluIHRoZSB2b2x1bWUgaGVhZGVyCisJCSAqIChsaWtlIHNhc2gsIHN5bW1vbiwgZngsIGlkZSkgd2l0aCBjYS4gMzIwMAorCQkgKiBzZWN0b3JzLgorCQkgKi8KKwkJaWYgKGdfaGVhZHMgKiBnX3NlY3RvcnMgKiA1IDwgc2dpX2dldF9sYXN0YmxvY2soKSkKKwkJCXNnaV9zZXRfcGFydGl0aW9uKG4sIDAsIGdfaGVhZHMgKiBnX3NlY3RvcnMgKiA1LCBTR0lfVk9MSERSKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZAorc2dpX2RlbGV0ZV9wYXJ0aXRpb24oaW50IGkpCit7CisJc2dpX3NldF9wYXJ0aXRpb24oaSwgMCwgMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitzZ2lfYWRkX3BhcnRpdGlvbihpbnQgbiwgaW50IHN5cykKK3sKKwljaGFyIG1lc2dbMjU2XTsKKwl1bnNpZ25lZCBpbnQgZmlyc3QgPSAwLCBsYXN0ID0gMDsKKworCWlmIChuID09IDEwKSB7CisJCXN5cyA9IFNHSV9WT0xVTUU7CisJfSBlbHNlIGlmIChuID09IDgpIHsKKwkJc3lzID0gMDsKKwl9CisJaWYgKHNnaV9nZXRfbnVtX3NlY3RvcnMobikpIHsKKwkJcHJpbnRmKG1zZ19wYXJ0X2FscmVhZHlfZGVmaW5lZCwgbiArIDEpOworCQlyZXR1cm47CisJfQorCWlmICgoc2dpX2VudGlyZSgpID09IC0xKSAmJiAoc3lzICE9IFNHSV9WT0xVTUUpKSB7CisJCXByaW50ZigiQXR0ZW1wdGluZyB0byBnZW5lcmF0ZSBlbnRpcmUgZGlzayBlbnRyeSBhdXRvbWF0aWNhbGx5XG4iKTsKKwkJc2dpX3NldF9lbnRpcmUoKTsKKwkJc2dpX3NldF92b2xoZHIoKTsKKwl9CisJaWYgKChzZ2lfZ2FwcygpID09IDApICYmIChzeXMgIT0gU0dJX1ZPTFVNRSkpIHsKKwkJcHJpbnRmKCJUaGUgZW50aXJlIGRpc2sgaXMgYWxyZWFkeSBjb3ZlcmVkIHdpdGggcGFydGl0aW9uc1xuIik7CisJCXJldHVybjsKKwl9CisJaWYgKHNnaV9nYXBzKCkgPCAwKSB7CisJCXByaW50ZigiWW91IGdvdCBhIHBhcnRpdGlvbiBvdmVybGFwIG9uIHRoZSBkaXNrLiBGaXggaXQgZmlyc3QhXG4iKTsKKwkJcmV0dXJuOworCX0KKwlzbnByaW50ZihtZXNnLCBzaXplb2YobWVzZyksICJGaXJzdCAlcyIsIHN0cl91bml0cyhTSU5HVUxBUikpOworCXdoaWxlICgxKSB7CisJCWlmIChzeXMgPT0gU0dJX1ZPTFVNRSkgeworCQkJbGFzdCA9IHNnaV9nZXRfbGFzdGJsb2NrKCk7CisJCQlmaXJzdCA9IHJlYWRfaW50KDAsIDAsIGxhc3QtMSwgMCwgbWVzZyk7CisJCQlpZiAoZmlyc3QgIT0gMCkgeworCQkJCXByaW50ZigiSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgZWxldmVudGggcGFydGl0aW9uXG4iCisJCQkJCQkiY292ZXJzIHRoZSBlbnRpcmUgZGlzayBhbmQgaXMgb2YgdHlwZSAnU0dJIHZvbHVtZSdcbiIpOworCQkJfQorCQl9IGVsc2UgeworCQkJZmlyc3QgPSBmcmVlbGlzdFswXS5maXJzdDsKKwkJCWxhc3QgID0gZnJlZWxpc3RbMF0ubGFzdDsKKwkJCWZpcnN0ID0gcmVhZF9pbnQoc2Nyb3VuZChmaXJzdCksIHNjcm91bmQoZmlyc3QpLCBzY3JvdW5kKGxhc3QpLTEsCisJCQkJMCwgbWVzZyk7CisJCX0KKwkJaWYgKGRpc3BsYXlfaW5fY3lsX3VuaXRzKQorCQkJZmlyc3QgKj0gdW5pdHNfcGVyX3NlY3RvcjsKKwkJZWxzZQorCQkJZmlyc3QgPSBmaXJzdDsgLyogYWxpZ24gdG8gY3lsaW5kZXIgaWYgeW91IGtub3cgaG93IC4uLiAqLworCQlpZiAoIWxhc3QgKQorCQkJbGFzdCA9IGlzaW5mcmVlbGlzdChmaXJzdCk7CisJCWlmIChsYXN0ICE9IDApCisJCQlicmVhazsKKwkJcHJpbnRmKCJZb3Ugd2lsbCBnZXQgYSBwYXJ0aXRpb24gb3ZlcmxhcCBvbiB0aGUgZGlzay4gIgorCQkJCSJGaXggaXQgZmlyc3QhXG4iKTsKKwl9CisJc25wcmludGYobWVzZywgc2l6ZW9mKG1lc2cpLCAiIExhc3QgJXMiLCBzdHJfdW5pdHMoU0lOR1VMQVIpKTsKKwlsYXN0ID0gcmVhZF9pbnQoc2Nyb3VuZChmaXJzdCksIHNjcm91bmQobGFzdCktMSwgc2Nyb3VuZChsYXN0KS0xLAorCQkJc2Nyb3VuZChmaXJzdCksIG1lc2cpKzE7CisJaWYgKGRpc3BsYXlfaW5fY3lsX3VuaXRzKQorCQlsYXN0ICo9IHVuaXRzX3Blcl9zZWN0b3I7CisJZWxzZQorCQlsYXN0ID0gbGFzdDsgLyogYWxpZ24gdG8gY3lsaW5kZXIgaWYgWW91IGtub3cgaG93IC4uLiAqLworCWlmICggKHN5cyA9PSBTR0lfVk9MVU1FKSAmJiAoZmlyc3QgIT0gMCB8fCBsYXN0ICE9IHNnaV9nZXRfbGFzdGJsb2NrKCkgKSApCisJCXByaW50ZigiSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgZWxldmVudGggcGFydGl0aW9uXG4iCisJCQkiY292ZXJzIHRoZSBlbnRpcmUgZGlzayBhbmQgaXMgb2YgdHlwZSAnU0dJIHZvbHVtZSdcbiIpOworCXNnaV9zZXRfcGFydGl0aW9uKG4sIGZpcnN0LCBsYXN0LWZpcnN0LCBzeXMpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfRkRJU0tfQURWQU5DRUQKK3N0YXRpYyB2b2lkCitjcmVhdGVfc2dpbGFiZWwodm9pZCkKK3sKKwlzdHJ1Y3QgaGRfZ2VvbWV0cnkgZ2VvbWV0cnk7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IHN0YXJ0OworCQl1bnNpZ25lZCBpbnQgbnNlY3Q7CisJCWludCBzeXNpZDsKKwl9IG9sZFs0XTsKKwlpbnQgaSA9IDA7CisJbG9uZyBsb25nc2VjdG9yczsgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHNlY3RvcnMgb24gdGhlIGRldmljZSAqLworCWludCByZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhlIHJlc3VsdCBmcm9tIHRoZSBpb2N0bCAqLworCWludCBzZWNfZmFjOyAgICAgICAgICAgICAgICAgICAgLyogdGhlIHNlY3RvciBmYWN0b3IgKi8KKworCXNlY19mYWMgPSBzZWN0b3Jfc2l6ZSAvIDUxMjsgICAgLyogZGV0ZXJtaW5lIHRoZSBzZWN0b3IgZmFjdG9yICovCisKKwlwcmludGYobXNnX2J1aWxkaW5nX25ld19sYWJlbCwgIlNHSSBkaXNrbGFiZWwiKTsKKworCXNnaV9vdGhlcl9lbmRpYW4gPSBCQl9MSVRUTEVfRU5ESUFOOworCXJlcyA9IGlvY3RsKGRldl9mZCwgQkxLR0VUU0laRSwgJmxvbmdzZWN0b3JzKTsKKwlpZiAoIWlvY3RsKGRldl9mZCwgSERJT19HRVRHRU8sICZnZW9tZXRyeSkpIHsKKwkJZ19oZWFkcyA9IGdlb21ldHJ5LmhlYWRzOworCQlnX3NlY3RvcnMgPSBnZW9tZXRyeS5zZWN0b3JzOworCQlpZiAocmVzID09IDApIHsKKwkJCS8qIHRoZSBnZXQgZGV2aWNlIHNpemUgaW9jdGwgd2FzIHN1Y2Nlc3NmdWwgKi8KKwkJCWdfY3lsaW5kZXJzID0gbG9uZ3NlY3RvcnMgLyAoZ19oZWFkcyAqIGdfc2VjdG9ycyk7CisJCQlnX2N5bGluZGVycyAvPSBzZWNfZmFjOworCQl9IGVsc2UgeworCQkJLyogb3RoZXJ3aXNlIHByaW50IGVycm9yIGFuZCB1c2UgdHJ1bmNhdGVkIHZlcnNpb24gKi8KKwkJCWdfY3lsaW5kZXJzID0gZ2VvbWV0cnkuY3lsaW5kZXJzOworCQkJcHJpbnRmKAorIldhcm5pbmc6IEJMS0dFVFNJWkUgaW9jdGwgZmFpbGVkIG9uICVzLiAgVXNpbmcgZ2VvbWV0cnkgY3lsaW5kZXIgdmFsdWUgb2YgJXUuXG4iCisiVGhpcyB2YWx1ZSBtYXkgYmUgdHJ1bmNhdGVkIGZvciBkZXZpY2VzID4gMzMuOCBHQi5cbiIsIGRpc2tfZGV2aWNlLCBnX2N5bGluZGVycyk7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlvbGRbaV0uc3lzaWQgPSAwOworCQlpZiAodmFsaWRfcGFydF90YWJsZV9mbGFnKE1CUmJ1ZmZlcikpIHsKKwkJCWlmIChnZXRfcGFydF90YWJsZShpKS0+c3lzX2luZCkgeworCQkJCW9sZFtpXS5zeXNpZCA9IGdldF9wYXJ0X3RhYmxlKGkpLT5zeXNfaW5kOworCQkJCW9sZFtpXS5zdGFydCA9IGdldF9zdGFydF9zZWN0KGdldF9wYXJ0X3RhYmxlKGkpKTsKKwkJCQlvbGRbaV0ubnNlY3QgPSBnZXRfbnJfc2VjdHMoZ2V0X3BhcnRfdGFibGUoaSkpOworCQkJCXByaW50ZigiVHJ5aW5nIHRvIGtlZXAgcGFyYW1ldGVycyBvZiBwYXJ0aXRpb24gJXVcbiIsIGkpOworCQkJCWlmIChTR0lfREVCVUcpCisJCQkJCXByaW50ZigiSUQ9JTAyeFx0U1RBUlQ9JXVcdExFTkdUSD0ldVxuIiwKKwkJCQlvbGRbaV0uc3lzaWQsIG9sZFtpXS5zdGFydCwgb2xkW2ldLm5zZWN0KTsKKwkJCX0KKwkJfQorCX0KKworCW1lbXNldChNQlJidWZmZXIsIDAsIHNpemVvZihNQlJidWZmZXIpKTsKKwkvKiBmaWVsZHMgd2l0aCAnLy8nIGFyZSBhbHJlYWR5IHplcm9lZCBvdXQgYnkgbWVtc2V0IGFib3ZlICovCisKKwlzZ2lsYWJlbC0+bWFnaWMgPSBTR0lfU1NXQVAzMihTR0lfTEFCRUxfTUFHSUMpOworCS8vc2dpbGFiZWwtPmJvb3RfcGFydCA9IFNHSV9TU1dBUDE2KDApOworCXNnaWxhYmVsLT5zd2FwX3BhcnQgPSBTR0lfU1NXQVAxNigxKTsKKworCS8vbWVtc2V0KHNnaWxhYmVsLT5ib290X2ZpbGUsIDAsIDE2KTsKKwlzdHJjcHkoKGNoYXIqKXNnaWxhYmVsLT5ib290X2ZpbGUsICIvdW5peCIpOyAvKiBzaXplb2Yoc2dpbGFiZWwtPmJvb3RfZmlsZSkgPT0gMTYgPiA2ICovCisKKwkvL3NnaWxhYmVsLT5kZXZwYXJhbS5za2V3ICAgICAgICAgICAgICAgICAgICAgPSAoMCk7CisJLy9zZ2lsYWJlbC0+ZGV2cGFyYW0uZ2FwMSAgICAgICAgICAgICAgICAgICAgID0gKDApOworCS8vc2dpbGFiZWwtPmRldnBhcmFtLmdhcDIgICAgICAgICAgICAgICAgICAgICA9ICgwKTsKKwkvL3NnaWxhYmVsLT5kZXZwYXJhbS5zcGFyZWN5bCAgICAgICAgICAgICAgICAgPSAoMCk7CisJc2dpbGFiZWwtPmRldnBhcmFtLnBjeWxjb3VudCAgICAgICAgICAgICAgICA9IFNHSV9TU1dBUDE2KGdlb21ldHJ5LmN5bGluZGVycyk7CisJLy9zZ2lsYWJlbC0+ZGV2cGFyYW0uaGVhZF92b2wwICAgICAgICAgICAgICAgID0gU0dJX1NTV0FQMTYoMCk7CisJLyogdHJhY2tzL2N5bGluZGVyIChoZWFkcykgKi8KKwlzZ2lsYWJlbC0+ZGV2cGFyYW0ubnRya3MgICAgICAgICAgICAgICAgICAgID0gU0dJX1NTV0FQMTYoZ2VvbWV0cnkuaGVhZHMpOworCS8vc2dpbGFiZWwtPmRldnBhcmFtLmNtZF90YWdfcXVldWVfZGVwdGggICAgICA9ICgwKTsKKwkvL3NnaWxhYmVsLT5kZXZwYXJhbS51bnVzZWQwICAgICAgICAgICAgICAgICAgPSAoMCk7CisJLy9zZ2lsYWJlbC0+ZGV2cGFyYW0udW51c2VkMSAgICAgICAgICAgICAgICAgID0gU0dJX1NTV0FQMTYoMCk7CisJLyogc2VjdG9ycy90cmFjayAqLworCXNnaWxhYmVsLT5kZXZwYXJhbS5uc2VjdCAgICAgICAgICAgICAgICAgICAgPSBTR0lfU1NXQVAxNihnZW9tZXRyeS5zZWN0b3JzKTsKKwlzZ2lsYWJlbC0+ZGV2cGFyYW0uYnl0ZXMgICAgICAgICAgICAgICAgICAgID0gU0dJX1NTV0FQMTYoNTEyKTsKKwlzZ2lsYWJlbC0+ZGV2cGFyYW0uaWxmYWN0ICAgICAgICAgICAgICAgICAgID0gU0dJX1NTV0FQMTYoMSk7CisJc2dpbGFiZWwtPmRldnBhcmFtLmZsYWdzICAgICAgICAgICAgICAgICAgICA9IFNHSV9TU1dBUDMyKFRSQUNLX0ZXRHwKKwkJCQkJCQlJR05PUkVfRVJST1JTfFJFU0VFSyk7CisJLy9zZ2lsYWJlbC0+ZGV2cGFyYW0uZGF0YXJhdGUgICAgICAgICAgICAgICAgID0gU0dJX1NTV0FQMzIoMCk7CisJc2dpbGFiZWwtPmRldnBhcmFtLnJldHJpZXNfb25fZXJyb3IgICAgICAgICA9IFNHSV9TU1dBUDMyKDEpOworCS8vc2dpbGFiZWwtPmRldnBhcmFtLm1zX3Blcl93b3JkICAgICAgICAgICAgICA9IFNHSV9TU1dBUDMyKDApOworCS8vc2dpbGFiZWwtPmRldnBhcmFtLnh5bG9naWNzX2dhcDEgICAgICAgICAgICA9IFNHSV9TU1dBUDE2KDApOworCS8vc2dpbGFiZWwtPmRldnBhcmFtLnh5bG9naWNzX3N5bmNkZWxheSAgICAgICA9IFNHSV9TU1dBUDE2KDApOworCS8vc2dpbGFiZWwtPmRldnBhcmFtLnh5bG9naWNzX3JlYWRkZWxheSAgICAgICA9IFNHSV9TU1dBUDE2KDApOworCS8vc2dpbGFiZWwtPmRldnBhcmFtLnh5bG9naWNzX2dhcDIgICAgICAgICAgICA9IFNHSV9TU1dBUDE2KDApOworCS8vc2dpbGFiZWwtPmRldnBhcmFtLnh5bG9naWNzX3JlYWRnYXRlICAgICAgICA9IFNHSV9TU1dBUDE2KDApOworCS8vc2dpbGFiZWwtPmRldnBhcmFtLnh5bG9naWNzX3dyaXRlY29udCAgICAgICA9IFNHSV9TU1dBUDE2KDApOworCS8vbWVtc2V0KCAmKHNnaWxhYmVsLT5kaXJlY3RvcnkpLCAwLCBzaXplb2Yoc3RydWN0IHZvbHVtZV9kaXJlY3RvcnkpKjE1ICk7CisJLy9tZW1zZXQoICYoc2dpbGFiZWwtPnBhcnRpdGlvbnMpLCAwLCBzaXplb2Yoc3RydWN0IHNnaV9wYXJ0aW5mbykqMTYgKTsKKwljdXJyZW50X2xhYmVsX3R5cGUgPSBMQUJFTF9TR0k7CisJZ19wYXJ0aXRpb25zID0gMTY7CisJc2dpX3ZvbHVtZXMgPSAxNTsKKwlzZ2lfc2V0X2VudGlyZSgpOworCXNnaV9zZXRfdm9saGRyKCk7CisJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQlpZiAob2xkW2ldLnN5c2lkKSB7CisJCQlzZ2lfc2V0X3BhcnRpdGlvbihpLCBvbGRbaV0uc3RhcnQsIG9sZFtpXS5uc2VjdCwgb2xkW2ldLnN5c2lkKTsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQKK3NnaV9zZXRfeGN5bCh2b2lkKQoreworCS8qIGRvIG5vdGhpbmcgaW4gdGhlIGJlZ2lubmluZyAqLworfQorI2VuZGlmIC8qIEZFQVRVUkVfRkRJU0tfQURWQU5DRUQgKi8KKworLyogX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXworICovCisKK3N0YXRpYyBzZ2lpbmZvICoKK2ZpbGxfc2dpaW5mbyh2b2lkKQoreworCXNnaWluZm8gKmluZm8gPSB4emFsbG9jKHNpemVvZihzZ2lpbmZvKSk7CisKKwlpbmZvLT5tYWdpYyA9IFNHSV9TU1dBUDMyKFNHSV9JTkZPX01BR0lDKTsKKwlpbmZvLT5iMSA9IFNHSV9TU1dBUDMyKC0xKTsKKwlpbmZvLT5iMiA9IFNHSV9TU1dBUDE2KC0xKTsKKwlpbmZvLT5iMyA9IFNHSV9TU1dBUDE2KDEpOworCS8qIFlvdSBtYXkgd2FudCB0byByZXBsYWNlIHRoaXMgc3RyaW5nICEhISEhISEgKi8KKwlzdHJjcHkoIChjaGFyKilpbmZvLT5zY3NpX3N0cmluZywgIklCTSBPRU0gMDY2MlMxMiAgICAgICAgIDMgMzAiICk7CisJc3RyY3B5KCAoY2hhciopaW5mby0+c2VyaWFsLCAiMDAwMCIgKTsKKwlpbmZvLT5jaGVjazE4MTYgPSBTR0lfU1NXQVAxNigxOCoyNTYgKzE2ICk7CisJc3RyY3B5KCAoY2hhciopaW5mby0+aW5zdGFsbGVyLCAiU2Z4IHZlcnNpb24gNS4zLCBPY3QgMTgsIDE5OTQiICk7CisJcmV0dXJuIGluZm87Cit9CisjZW5kaWYgLyogU0dJX0xBQkVMICovCmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2ZkaXNrX3N1bi5jIGIvdXRpbC1saW51eC9mZGlza19zdW4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzI3NDBkCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9mZGlza19zdW4uYwpAQCAtMCwwICsxLDczMyBAQAorLyoKKyAqIGZkaXNrX3N1bi5jCisgKgorICogSSB0aGluayB0aGlzIGlzIG1vc3RseSwgb3IgZW50aXJlbHksIGR1ZSB0bworICogICAgICBKYWt1YiBKZWxpbmVrIChqakBzdW5zaXRlLm1mZi5jdW5pLmN6KSwgSnVseSAxOTk2CisgKgorICogTWVyZ2VkIHdpdGggZmRpc2sgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMsIGFlYiwgSnVuZSAxOTk4LgorICoKKyAqIFNhdCBNYXIgMjAgRVNUIDE5OTkgQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CisgKiAgICAgIEludGVybmF0aW9uYWxpemF0aW9uCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisjaWYgRU5BQkxFX0ZFQVRVUkVfU1VOX0xBQkVMCisKKyNkZWZpbmUgU1VOT1NfU1dBUCAzCisjZGVmaW5lIFNVTl9XSE9MRV9ESVNLIDUKKworI2RlZmluZSBTVU5fTEFCRUxfTUFHSUMgICAgICAgICAgMHhEQUJFCisjZGVmaW5lIFNVTl9MQUJFTF9NQUdJQ19TV0FQUEVEICAweEJFREEKKyNkZWZpbmUgU1VOX1NTV0FQMTYoeCkgKHN1bl9vdGhlcl9lbmRpYW4gPyBmZGlza19zd2FwMTYoeCkgOiAodWludDE2X3QpKHgpKQorI2RlZmluZSBTVU5fU1NXQVAzMih4KSAoc3VuX290aGVyX2VuZGlhbiA/IGZkaXNrX3N3YXAzMih4KSA6ICh1aW50MzJfdCkoeCkpCisKKy8qIENvcGllZCBmcm9tIGxpbnV4L21ham9yLmggKi8KKyNkZWZpbmUgRkxPUFBZX01BSk9SICAgIDIKKworI2RlZmluZSBTQ1NJX0lPQ1RMX0dFVF9JRExVTiAweDUzODIKKworc3RhdGljIHNtYWxsaW50IHN1bl9vdGhlcl9lbmRpYW47CitzdGF0aWMgc21hbGxpbnQgc2NzaV9kaXNrOworc3RhdGljIHNtYWxsaW50IGZsb3BweTsKKworI2lmbmRlZiBJREUwX01BSk9SCisjZGVmaW5lIElERTBfTUFKT1IgMworI2VuZGlmCisjaWZuZGVmIElERTFfTUFKT1IKKyNkZWZpbmUgSURFMV9NQUpPUiAyMgorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitndWVzc19kZXZpY2VfdHlwZSh2b2lkKQoreworCXN0cnVjdCBzdGF0IGJvb3RzdGF0OworCisJaWYgKGZzdGF0KGRldl9mZCwgJmJvb3RzdGF0KSA8IDApIHsKKwkJc2NzaV9kaXNrID0gMDsKKwkJZmxvcHB5ID0gMDsKKwl9IGVsc2UgaWYgKFNfSVNCTEsoYm9vdHN0YXQuc3RfbW9kZSkKKwkJJiYgKG1ham9yKGJvb3RzdGF0LnN0X3JkZXYpID09IElERTBfTUFKT1IgfHwKKwkJICAgIG1ham9yKGJvb3RzdGF0LnN0X3JkZXYpID09IElERTFfTUFKT1IpKSB7CisJCXNjc2lfZGlzayA9IDA7CisJCWZsb3BweSA9IDA7CisJfSBlbHNlIGlmIChTX0lTQkxLKGJvb3RzdGF0LnN0X21vZGUpCisJCSYmIG1ham9yKGJvb3RzdGF0LnN0X3JkZXYpID09IEZMT1BQWV9NQUpPUikgeworCQlzY3NpX2Rpc2sgPSAwOworCQlmbG9wcHkgPSAxOworCX0gZWxzZSB7CisJCXNjc2lfZGlzayA9IDE7CisJCWZsb3BweSA9IDA7CisJfQorfQorCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgc3VuX3N5c190eXBlc1tdID0geworCSJceDAwIiAiRW1wdHkiICAgICAgICwgLyogMCAgICAgICAgICAgICovCisJIlx4MDEiICJCb290IiAgICAgICAgLCAvKiAxICAgICAgICAgICAgKi8KKwkiXHgwMiIgIlN1bk9TIHJvb3QiICAsIC8qIDIgICAgICAgICAgICAqLworCSJceDAzIiAiU3VuT1Mgc3dhcCIgICwgLyogU1VOT1NfU1dBUCAgICovCisJIlx4MDQiICJTdW5PUyB1c3IiICAgLCAvKiA0ICAgICAgICAgICAgKi8KKwkiXHgwNSIgIldob2xlIGRpc2siICAsIC8qIFNVTl9XSE9MRV9ESVNLICAgKi8KKwkiXHgwNiIgIlN1bk9TIHN0YW5kIiAsIC8qIDYgICAgICAgICAgICAqLworCSJceDA3IiAiU3VuT1MgdmFyIiAgICwgLyogNyAgICAgICAgICAgICovCisJIlx4MDgiICJTdW5PUyBob21lIiAgLCAvKiA4ICAgICAgICAgICAgKi8KKwkiXHg4MiIgIkxpbnV4IHN3YXAiICAsIC8qIExJTlVYX1NXQVAgICAqLworCSJceDgzIiAiTGludXggbmF0aXZlIiwgLyogTElOVVhfTkFUSVZFICovCisJIlx4OGUiICJMaW51eCBMVk0iICAgLCAvKiAweDhlICAgICAgICAgKi8KKy8qIE5ldyAoMi4yLngpIHJhaWQgcGFydGl0aW9uIHdpdGggYXV0b2RldGVjdCB1c2luZyBwZXJzaXN0ZW50IHN1cGVyYmxvY2sgKi8KKwkiXHhmZCIgIkxpbnV4IHJhaWQgYXV0b2RldGVjdCIsIC8qIDB4ZmQgICAgICAgICAqLworCU5VTEwKK307CisKKworc3RhdGljIHZvaWQKK3NldF9zdW5fcGFydGl0aW9uKGludCBpLCB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgc3RvcCwgaW50IHN5c2lkKQoreworCXN1bmxhYmVsLT5pbmZvc1tpXS5pZCA9IHN5c2lkOworCXN1bmxhYmVsLT5wYXJ0aXRpb25zW2ldLnN0YXJ0X2N5bGluZGVyID0KKwkJU1VOX1NTV0FQMzIoc3RhcnQgLyAoZ19oZWFkcyAqIGdfc2VjdG9ycykpOworCXN1bmxhYmVsLT5wYXJ0aXRpb25zW2ldLm51bV9zZWN0b3JzID0KKwkJU1VOX1NTV0FQMzIoc3RvcCAtIHN0YXJ0KTsKKwlzZXRfY2hhbmdlZChpKTsKK30KKworc3RhdGljIGludAorY2hlY2tfc3VuX2xhYmVsKHZvaWQpCit7CisJdW5zaWduZWQgc2hvcnQgKnVzaDsKKwlpbnQgY3N1bTsKKworCWlmIChzdW5sYWJlbC0+bWFnaWMgIT0gU1VOX0xBQkVMX01BR0lDCisJICYmIHN1bmxhYmVsLT5tYWdpYyAhPSBTVU5fTEFCRUxfTUFHSUNfU1dBUFBFRAorCSkgeworCQljdXJyZW50X2xhYmVsX3R5cGUgPSBMQUJFTF9ET1M7CisJCXN1bl9vdGhlcl9lbmRpYW4gPSAwOworCQlyZXR1cm4gMDsKKwl9CisJc3VuX290aGVyX2VuZGlhbiA9IChzdW5sYWJlbC0+bWFnaWMgPT0gU1VOX0xBQkVMX01BR0lDX1NXQVBQRUQpOworCXVzaCA9ICgodW5zaWduZWQgc2hvcnQgKikgKHN1bmxhYmVsICsgMSkpIC0gMTsKKwlmb3IgKGNzdW0gPSAwOyB1c2ggPj0gKHVuc2lnbmVkIHNob3J0ICopc3VubGFiZWw7KSBjc3VtIF49ICp1c2gtLTsKKwlpZiAoY3N1bSkgeworCQlwcmludGYoIkRldGVjdGVkIHN1biBkaXNrbGFiZWwgd2l0aCB3cm9uZyBjaGVja3N1bS5cbiIKKyJQcm9iYWJseSB5b3UnbGwgaGF2ZSB0byBzZXQgYWxsIHRoZSB2YWx1ZXMsXG4iCisiZS5nLiBoZWFkcywgc2VjdG9ycywgY3lsaW5kZXJzIGFuZCBwYXJ0aXRpb25zXG4iCisib3IgZm9yY2UgYSBmcmVzaCBsYWJlbCAocyBjb21tYW5kIGluIG1haW4gbWVudSlcbiIpOworCX0gZWxzZSB7CisJCWdfaGVhZHMgPSBTVU5fU1NXQVAxNihzdW5sYWJlbC0+bnRya3MpOworCQlnX2N5bGluZGVycyA9IFNVTl9TU1dBUDE2KHN1bmxhYmVsLT5uY3lsKTsKKwkJZ19zZWN0b3JzID0gU1VOX1NTV0FQMTYoc3VubGFiZWwtPm5zZWN0KTsKKwl9CisJdXBkYXRlX3VuaXRzKCk7CisJY3VycmVudF9sYWJlbF90eXBlID0gTEFCRUxfU1VOOworCWdfcGFydGl0aW9ucyA9IDg7CisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VuX3ByZWRlZmluZWRfZHJpdmVzIHsKKwljb25zdCBjaGFyICp2ZW5kb3I7CisJY29uc3QgY2hhciAqbW9kZWw7CisJdW5zaWduZWQgc2hvcnQgc3BhcmVjeWw7CisJdW5zaWduZWQgc2hvcnQgbmN5bDsKKwl1bnNpZ25lZCBzaG9ydCBuYWN5bDsKKwl1bnNpZ25lZCBzaG9ydCBwY3lsY291bnQ7CisJdW5zaWduZWQgc2hvcnQgbnRya3M7CisJdW5zaWduZWQgc2hvcnQgbnNlY3Q7CisJdW5zaWduZWQgc2hvcnQgcnNwZWVkOworfSBzdW5fZHJpdmVzW10gPSB7CisJeyAiUXVhbnR1bSIsIlByb0RyaXZlIDgwUyIsMSw4MzIsMiw4MzQsNiwzNCwzNjYyfSwKKwl7ICJRdWFudHVtIiwiUHJvRHJpdmUgMTA1UyIsMSw5NzQsMiwxMDE5LDYsMzUsMzY2Mn0sCisJeyAiQ0RDIiwiV3JlbiBJViA5NDE3MS0zNDQiLDMsMTU0NSwyLDE1NDksOSw0NiwzNjAwfSwKKwl7ICJJQk0iLCJEUEVTLTMxMDgwIiwwLDQ5MDEsMiw0OTAzLDQsMTA4LDU0MDB9LAorCXsgIklCTSIsIkRPUlMtMzIxNjAiLDAsMTAxNSwyLDEwMTcsNjcsNjIsNTQwMH0sCisJeyAiSUJNIiwiRE5FUy0zMTgzNTAiLDAsMTExOTksMiwxMTQ3NCwxMCwzMjAsNzIwMH0sCisJeyAiU0VBR0FURSIsIlNUMzQzNzEiLDAsMzg4MCwyLDM4ODIsMTYsMTM1LDcyMjh9LAorCXsgIiIsIlNVTjAxMDQiLDEsOTc0LDIsMTAxOSw2LDM1LDM2NjJ9LAorCXsgIiIsIlNVTjAyMDciLDQsMTI1NCwyLDEyNzIsOSwzNiwzNjAwfSwKKwl7ICIiLCJTVU4wMzI3IiwzLDE1NDUsMiwxNTQ5LDksNDYsMzYwMH0sCisJeyAiIiwiU1VOMDM0MCIsMCwxNTM4LDIsMTU0NCw2LDcyLDQyMDB9LAorCXsgIiIsIlNVTjA0MjQiLDIsMTE1MSwyLDI1MDAsOSw4MCw0NDAwfSwKKwl7ICIiLCJTVU4wNTM1IiwwLDE4NjYsMiwyNTAwLDcsODAsNTQwMH0sCisJeyAiIiwiU1VOMDY2OSIsNSwxNjE0LDIsMTYzMiwxNSw1NCwzNjAwfSwKKwl7ICIiLCJTVU4xLjBHIiw1LDE3MDMsMiwxOTMxLDE1LDgwLDM1OTd9LAorCXsgIiIsIlNVTjEuMDUiLDAsMjAzNiwyLDIwMzgsMTQsNzIsNTQwMH0sCisJeyAiIiwiU1VOMS4zRyIsNiwxOTY1LDIsMzUwMCwxNyw4MCw1NDAwfSwKKwl7ICIiLCJTVU4yLjFHIiwwLDI3MzMsMiwzNTAwLDE5LDgwLDU0MDB9LAorCXsgIklPTUVHQSIsIkpheiIsMCwxMDE5LDIsMTAyMSw2NCwzMiw1Mzk0fSwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VuX3ByZWRlZmluZWRfZHJpdmVzICoKK3N1bl9hdXRvY29uZmlndXJlX3Njc2kodm9pZCkKK3sKKwljb25zdCBzdHJ1Y3Qgc3VuX3ByZWRlZmluZWRfZHJpdmVzICpwID0gTlVMTDsKKworI2lmZGVmIFNDU0lfSU9DVExfR0VUX0lETFVOCisJdW5zaWduZWQgaW50IGlkWzJdOworCWNoYXIgYnVmZmVyWzIwNDhdOworCWNoYXIgYnVmZmVyMlsyMDQ4XTsKKwlGSUxFICpwZmQ7CisJY2hhciAqdmVuZG9yOworCWNoYXIgKm1vZGVsOworCWNoYXIgKnE7CisJaW50IGk7CisKKwlpZiAoaW9jdGwoZGV2X2ZkLCBTQ1NJX0lPQ1RMX0dFVF9JRExVTiwgJmlkKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlzcHJpbnRmKGJ1ZmZlciwKKwkJIkhvc3Q6IHNjc2kldSBDaGFubmVsOiAlMDJ1IElkOiAlMDJ1IEx1bjogJTAydVxuIiwKKwkJLyogVGhpcyBpcyB2ZXJ5IHdyb25nICh3b3JrcyBvbmx5IGlmIHlvdSBoYXZlIG9uZSBIQkEpLAorCQkgICBidXQgSSBoYXZlbid0IGZvdW5kIGEgd2F5IGhvdyB0byBnZXQgaG9zdG5vCisJCSAgIGZyb20gdGhlIGN1cnJlbnQga2VybmVsICovCisJCTAsCisJCShpZFswXT4+MTYpICYgMHhmZiwKKwkJaWRbMF0gJiAweGZmLAorCQkoaWRbMF0+PjgpICYgMHhmZgorCSk7CisJcGZkID0gZm9wZW5fZm9yX3JlYWQoIi9wcm9jL3Njc2kvc2NzaSIpOworCWlmICghcGZkKSB7CisJCXJldHVybiBOVUxMOworCX0KKwl3aGlsZSAoZmdldHMoYnVmZmVyMiwgMjA0OCwgcGZkKSkgeworCQlpZiAoc3RyY21wKGJ1ZmZlciwgYnVmZmVyMikpCisJCQljb250aW51ZTsKKwkJaWYgKCFmZ2V0cyhidWZmZXIyLCAyMDQ4LCBwZmQpKQorCQkJYnJlYWs7CisJCXEgPSBzdHJzdHIoYnVmZmVyMiwgIlZlbmRvcjogIik7CisJCWlmICghcSkKKwkJCWJyZWFrOworCQlxICs9IDg7CisJCXZlbmRvciA9IHE7CisJCXEgPSBzdHJzdHIocSwgIiAiKTsKKwkJKnErKyA9ICdcMCc7ICAgLyogdHJ1bmNhdGUgdmVuZG9yIG5hbWUgKi8KKwkJcSA9IHN0cnN0cihxLCAiTW9kZWw6ICIpOworCQlpZiAoIXEpCisJCQlicmVhazsKKwkJKnEgPSAnXDAnOworCQlxICs9IDc7CisJCW1vZGVsID0gcTsKKwkJcSA9IHN0cnN0cihxLCAiIFJldjogIik7CisJCWlmICghcSkKKwkJCWJyZWFrOworCQkqcSA9ICdcMCc7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHN1bl9kcml2ZXMpOyBpKyspIHsKKwkJCWlmICgqc3VuX2RyaXZlc1tpXS52ZW5kb3IgJiYgc3RyY2FzZWNtcChzdW5fZHJpdmVzW2ldLnZlbmRvciwgdmVuZG9yKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghc3Ryc3RyKG1vZGVsLCBzdW5fZHJpdmVzW2ldLm1vZGVsKSkKKwkJCQljb250aW51ZTsKKwkJCXByaW50ZigiQXV0b2NvbmZpZ3VyZSBmb3VuZCBhICVzJXMlc1xuIiwKKwkJCQkJc3VuX2RyaXZlc1tpXS52ZW5kb3IsCisJCQkJCSgqc3VuX2RyaXZlc1tpXS52ZW5kb3IpID8gIiAiIDogIiIsCisJCQkJCXN1bl9kcml2ZXNbaV0ubW9kZWwpOworCQkJcCA9IHN1bl9kcml2ZXMgKyBpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJfQorCWZjbG9zZShwZmQpOworI2VuZGlmCisJcmV0dXJuIHA7Cit9CisKK3N0YXRpYyB2b2lkCitjcmVhdGVfc3VubGFiZWwodm9pZCkKK3sKKwlzdHJ1Y3QgaGRfZ2VvbWV0cnkgZ2VvbWV0cnk7CisJdW5zaWduZWQgbmRpdjsKKwl1bnNpZ25lZCBjaGFyIGM7CisJY29uc3Qgc3RydWN0IHN1bl9wcmVkZWZpbmVkX2RyaXZlcyAqcCA9IE5VTEw7CisKKwlwcmludGYobXNnX2J1aWxkaW5nX25ld19sYWJlbCwgInN1biBkaXNrbGFiZWwiKTsKKworCXN1bl9vdGhlcl9lbmRpYW4gPSBCQl9MSVRUTEVfRU5ESUFOOworCW1lbXNldChNQlJidWZmZXIsIDAsIHNpemVvZihNQlJidWZmZXIpKTsKKwlzdW5sYWJlbC0+bWFnaWMgPSBTVU5fU1NXQVAxNihTVU5fTEFCRUxfTUFHSUMpOworCWlmICghZmxvcHB5KSB7CisJCXVuc2lnbmVkIGk7CisJCXB1dHMoIkRyaXZlIHR5cGVcbiIKKwkJICIgICA/ICAgYXV0byBjb25maWd1cmVcbiIKKwkJICIgICAwICAgY3VzdG9tICh3aXRoIGhhcmR3YXJlIGRldGVjdGVkIGRlZmF1bHRzKSIpOworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzdW5fZHJpdmVzKTsgaSsrKSB7CisJCQlwcmludGYoIiAgICVjICAgJXMlcyVzXG4iLAorCQkJCWkgKyAnYScsIHN1bl9kcml2ZXNbaV0udmVuZG9yLAorCQkJCSgqc3VuX2RyaXZlc1tpXS52ZW5kb3IpID8gIiAiIDogIiIsCisJCQkJc3VuX2RyaXZlc1tpXS5tb2RlbCk7CisJCX0KKwkJd2hpbGUgKDEpIHsKKwkJCWMgPSByZWFkX25vbmVtcHR5KCJTZWxlY3QgdHlwZSAoPyBmb3IgYXV0bywgMCBmb3IgY3VzdG9tKTogIik7CisJCQlpZiAoYyA9PSAnMCcpIHsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChjID49ICdhJyAmJiBjIDwgJ2EnICsgQVJSQVlfU0laRShzdW5fZHJpdmVzKSkgeworCQkJCXAgPSBzdW5fZHJpdmVzICsgYyAtICdhJzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChjID49ICdBJyAmJiBjIDwgJ0EnICsgQVJSQVlfU0laRShzdW5fZHJpdmVzKSkgeworCQkJCXAgPSBzdW5fZHJpdmVzICsgYyAtICdBJzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChjID09ICc/JyAmJiBzY3NpX2Rpc2spIHsKKwkJCQlwID0gc3VuX2F1dG9jb25maWd1cmVfc2NzaSgpOworCQkJCWlmIChwKQorCQkJCQlicmVhazsKKwkJCQlwcmludGYoIkF1dG9jb25maWd1cmUgZmFpbGVkXG4iKTsKKwkJCX0KKwkJfQorCX0KKwlpZiAoIXAgfHwgZmxvcHB5KSB7CisJCWlmICghaW9jdGwoZGV2X2ZkLCBIRElPX0dFVEdFTywgJmdlb21ldHJ5KSkgeworCQkJZ19oZWFkcyA9IGdlb21ldHJ5LmhlYWRzOworCQkJZ19zZWN0b3JzID0gZ2VvbWV0cnkuc2VjdG9yczsKKwkJCWdfY3lsaW5kZXJzID0gZ2VvbWV0cnkuY3lsaW5kZXJzOworCQl9IGVsc2UgeworCQkJZ19oZWFkcyA9IDA7CisJCQlnX3NlY3RvcnMgPSAwOworCQkJZ19jeWxpbmRlcnMgPSAwOworCQl9CisJCWlmIChmbG9wcHkpIHsKKwkJCXN1bmxhYmVsLT5uYWN5bCA9IDA7CisJCQlzdW5sYWJlbC0+cGN5bGNvdW50ID0gU1VOX1NTV0FQMTYoZ19jeWxpbmRlcnMpOworCQkJc3VubGFiZWwtPnJzcGVlZCA9IFNVTl9TU1dBUDE2KDMwMCk7CisJCQlzdW5sYWJlbC0+aWxmYWN0ID0gU1VOX1NTV0FQMTYoMSk7CisJCQlzdW5sYWJlbC0+c3BhcmVjeWwgPSAwOworCQl9IGVsc2UgeworCQkJZ19oZWFkcyA9IHJlYWRfaW50KDEsIGdfaGVhZHMsIDEwMjQsIDAsICJIZWFkcyIpOworCQkJZ19zZWN0b3JzID0gcmVhZF9pbnQoMSwgZ19zZWN0b3JzLCAxMDI0LCAwLCAiU2VjdG9ycy90cmFjayIpOworCQlpZiAoZ19jeWxpbmRlcnMpCisJCQlnX2N5bGluZGVycyA9IHJlYWRfaW50KDEsIGdfY3lsaW5kZXJzIC0gMiwgNjU1MzUsIDAsICJDeWxpbmRlcnMiKTsKKwkJZWxzZQorCQkJZ19jeWxpbmRlcnMgPSByZWFkX2ludCgxLCAwLCA2NTUzNSwgMCwgIkN5bGluZGVycyIpOworCQkJc3VubGFiZWwtPm5hY3lsID0gU1VOX1NTV0FQMTYocmVhZF9pbnQoMCwgMiwgNjU1MzUsIDAsICJBbHRlcm5hdGUgY3lsaW5kZXJzIikpOworCQkJc3VubGFiZWwtPnBjeWxjb3VudCA9IFNVTl9TU1dBUDE2KHJlYWRfaW50KDAsIGdfY3lsaW5kZXJzICsgU1VOX1NTV0FQMTYoc3VubGFiZWwtPm5hY3lsKSwgNjU1MzUsIDAsICJQaHlzaWNhbCBjeWxpbmRlcnMiKSk7CisJCQlzdW5sYWJlbC0+cnNwZWVkID0gU1VOX1NTV0FQMTYocmVhZF9pbnQoMSwgNTQwMCwgMTAwMDAwLCAwLCAiUm90YXRpb24gc3BlZWQgKHJwbSkiKSk7CisJCQlzdW5sYWJlbC0+aWxmYWN0ID0gU1VOX1NTV0FQMTYocmVhZF9pbnQoMSwgMSwgMzIsIDAsICJJbnRlcmxlYXZlIGZhY3RvciIpKTsKKwkJCXN1bmxhYmVsLT5zcGFyZWN5bCA9IFNVTl9TU1dBUDE2KHJlYWRfaW50KDAsIDAsIGdfc2VjdG9ycywgMCwgIkV4dHJhIHNlY3RvcnMgcGVyIGN5bGluZGVyIikpOworCQl9CisJfSBlbHNlIHsKKwkJc3VubGFiZWwtPnNwYXJlY3lsID0gU1VOX1NTV0FQMTYocC0+c3BhcmVjeWwpOworCQlzdW5sYWJlbC0+bmN5bCA9IFNVTl9TU1dBUDE2KHAtPm5jeWwpOworCQlzdW5sYWJlbC0+bmFjeWwgPSBTVU5fU1NXQVAxNihwLT5uYWN5bCk7CisJCXN1bmxhYmVsLT5wY3lsY291bnQgPSBTVU5fU1NXQVAxNihwLT5wY3lsY291bnQpOworCQlzdW5sYWJlbC0+bnRya3MgPSBTVU5fU1NXQVAxNihwLT5udHJrcyk7CisJCXN1bmxhYmVsLT5uc2VjdCA9IFNVTl9TU1dBUDE2KHAtPm5zZWN0KTsKKwkJc3VubGFiZWwtPnJzcGVlZCA9IFNVTl9TU1dBUDE2KHAtPnJzcGVlZCk7CisJCXN1bmxhYmVsLT5pbGZhY3QgPSBTVU5fU1NXQVAxNigxKTsKKwkJZ19jeWxpbmRlcnMgPSBwLT5uY3lsOworCQlnX2hlYWRzID0gcC0+bnRya3M7CisJCWdfc2VjdG9ycyA9IHAtPm5zZWN0OworCQlwdXRzKCJZb3UgbWF5IGNoYW5nZSBhbGwgdGhlIGRpc2sgcGFyYW1zIGZyb20gdGhlIHggbWVudSIpOworCX0KKworCXNucHJpbnRmKChjaGFyICopKHN1bmxhYmVsLT5pbmZvKSwgc2l6ZW9mKHN1bmxhYmVsLT5pbmZvKSwKKwkJIiVzJXMlcyBjeWwgJXUgYWx0ICV1IGhkICV1IHNlYyAldSIsCisJCXAgPyBwLT52ZW5kb3IgOiAiIiwgKHAgJiYgKnAtPnZlbmRvcikgPyAiICIgOiAiIiwKKwkJcCA/IHAtPm1vZGVsIDogKGZsb3BweSA/ICIzLDVcIiBmbG9wcHkiIDogIkxpbnV4IGN1c3RvbSIpLAorCQlnX2N5bGluZGVycywgU1VOX1NTV0FQMTYoc3VubGFiZWwtPm5hY3lsKSwgZ19oZWFkcywgZ19zZWN0b3JzKTsKKworCXN1bmxhYmVsLT5udHJrcyA9IFNVTl9TU1dBUDE2KGdfaGVhZHMpOworCXN1bmxhYmVsLT5uc2VjdCA9IFNVTl9TU1dBUDE2KGdfc2VjdG9ycyk7CisJc3VubGFiZWwtPm5jeWwgPSBTVU5fU1NXQVAxNihnX2N5bGluZGVycyk7CisJaWYgKGZsb3BweSkKKwkJc2V0X3N1bl9wYXJ0aXRpb24oMCwgMCwgZ19jeWxpbmRlcnMgKiBnX2hlYWRzICogZ19zZWN0b3JzLCBMSU5VWF9OQVRJVkUpOworCWVsc2UgeworCQlpZiAoZ19jeWxpbmRlcnMgKiBnX2hlYWRzICogZ19zZWN0b3JzID49IDE1MCAqIDIwNDgpIHsKKwkJCW5kaXYgPSBnX2N5bGluZGVycyAtICg1MCAqIDIwNDggLyAoZ19oZWFkcyAqIGdfc2VjdG9ycykpOyAvKiA1ME0gc3dhcCAqLworCQl9IGVsc2UKKwkJCW5kaXYgPSBnX2N5bGluZGVycyAqIDIgLyAzOworCQlzZXRfc3VuX3BhcnRpdGlvbigwLCAwLCBuZGl2ICogZ19oZWFkcyAqIGdfc2VjdG9ycywgTElOVVhfTkFUSVZFKTsKKwkJc2V0X3N1bl9wYXJ0aXRpb24oMSwgbmRpdiAqIGdfaGVhZHMgKiBnX3NlY3RvcnMsIGdfY3lsaW5kZXJzICogZ19oZWFkcyAqIGdfc2VjdG9ycywgTElOVVhfU1dBUCk7CisJCXN1bmxhYmVsLT5pbmZvc1sxXS5mbGFncyB8PSAweDAxOyAvKiBOb3QgbW91bnRhYmxlICovCisJfQorCXNldF9zdW5fcGFydGl0aW9uKDIsIDAsIGdfY3lsaW5kZXJzICogZ19oZWFkcyAqIGdfc2VjdG9ycywgU1VOX1dIT0xFX0RJU0spOworCXsKKwkJdW5zaWduZWQgc2hvcnQgKnVzaCA9ICh1bnNpZ25lZCBzaG9ydCAqKXN1bmxhYmVsOworCQl1bnNpZ25lZCBzaG9ydCBjc3VtID0gMDsKKwkJd2hpbGUgKHVzaCA8ICh1bnNpZ25lZCBzaG9ydCAqKSgmc3VubGFiZWwtPmNzdW0pKQorCQkJY3N1bSBePSAqdXNoKys7CisJCXN1bmxhYmVsLT5jc3VtID0gY3N1bTsKKwl9CisKKwlzZXRfYWxsX3VuY2hhbmdlZCgpOworCXNldF9jaGFuZ2VkKDApOworCWNoZWNrX3N1bl9sYWJlbCgpOworCWdldF9ib290KENSRUFURV9FTVBUWV9TVU4pOworfQorCitzdGF0aWMgdm9pZAordG9nZ2xlX3N1bmZsYWdzKGludCBpLCB1bnNpZ25lZCBjaGFyIG1hc2spCit7CisJaWYgKHN1bmxhYmVsLT5pbmZvc1tpXS5mbGFncyAmIG1hc2spCisJCXN1bmxhYmVsLT5pbmZvc1tpXS5mbGFncyAmPSB+bWFzazsKKwllbHNlCisJCXN1bmxhYmVsLT5pbmZvc1tpXS5mbGFncyB8PSBtYXNrOworCXNldF9jaGFuZ2VkKGkpOworfQorCitzdGF0aWMgdm9pZAorZmV0Y2hfc3VuKHVuc2lnbmVkICpzdGFydHMsIHVuc2lnbmVkICpsZW5zLCB1bnNpZ25lZCAqc3RhcnQsIHVuc2lnbmVkICpzdG9wKQoreworCWludCBpLCBjb250aW51b3VzID0gMTsKKworCSpzdGFydCA9IDA7CisJKnN0b3AgPSBnX2N5bGluZGVycyAqIGdfaGVhZHMgKiBnX3NlY3RvcnM7CisJZm9yIChpID0gMDsgaSA8IGdfcGFydGl0aW9uczsgaSsrKSB7CisJCWlmIChzdW5sYWJlbC0+cGFydGl0aW9uc1tpXS5udW1fc2VjdG9ycworCQkgJiYgc3VubGFiZWwtPmluZm9zW2ldLmlkCisJCSAmJiBzdW5sYWJlbC0+aW5mb3NbaV0uaWQgIT0gU1VOX1dIT0xFX0RJU0spIHsKKwkJCXN0YXJ0c1tpXSA9IFNVTl9TU1dBUDMyKHN1bmxhYmVsLT5wYXJ0aXRpb25zW2ldLnN0YXJ0X2N5bGluZGVyKSAqIGdfaGVhZHMgKiBnX3NlY3RvcnM7CisJCQlsZW5zW2ldID0gU1VOX1NTV0FQMzIoc3VubGFiZWwtPnBhcnRpdGlvbnNbaV0ubnVtX3NlY3RvcnMpOworCQkJaWYgKGNvbnRpbnVvdXMpIHsKKwkJCQlpZiAoc3RhcnRzW2ldID09ICpzdGFydCkKKwkJCQkJKnN0YXJ0ICs9IGxlbnNbaV07CisJCQkJZWxzZSBpZiAoc3RhcnRzW2ldICsgbGVuc1tpXSA+PSAqc3RvcCkKKwkJCQkJKnN0b3AgPSBzdGFydHNbaV07CisJCQkJZWxzZQorCQkJCQljb250aW51b3VzID0gMDsKKwkJCQkJLyogVGhlcmUgd2lsbCBiZSBwcm9iYWJseSBtb3JlIGdhcHMKKwkJCQkJICB0aGFuIG9uZSwgc28gbGV0cyBjaGVjayBhZnRlcndhcmRzICovCisJCQl9CisJCX0gZWxzZSB7CisJCQlzdGFydHNbaV0gPSAwOworCQkJbGVuc1tpXSA9IDA7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCAqdmVyaWZ5X3N1bl9zdGFydHM7CisKK3N0YXRpYyBpbnQKK3ZlcmlmeV9zdW5fY21wKGludCAqYSwgaW50ICpiKQoreworCWlmICgqYSA9PSAtMSkgcmV0dXJuIDE7CisJaWYgKCpiID09IC0xKSByZXR1cm4gLTE7CisJaWYgKHZlcmlmeV9zdW5fc3RhcnRzWyphXSA+IHZlcmlmeV9zdW5fc3RhcnRzWypiXSkgcmV0dXJuIDE7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZAordmVyaWZ5X3N1bih2b2lkKQoreworCXVuc2lnbmVkIHN0YXJ0c1s4XSwgbGVuc1s4XSwgc3RhcnQsIHN0b3A7CisJaW50IGksaixrLHN0YXJ0byxlbmRvOworCWludCBhcnJheVs4XTsKKworCXZlcmlmeV9zdW5fc3RhcnRzID0gc3RhcnRzOworCWZldGNoX3N1bihzdGFydHMsIGxlbnMsICZzdGFydCwgJnN0b3ApOworCWZvciAoayA9IDA7IGsgPCA3OyBrKyspIHsKKwkJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJaWYgKGsgJiYgKGxlbnNbaV0gJSAoZ19oZWFkcyAqIGdfc2VjdG9ycykpKSB7CisJCQkJcHJpbnRmKCJQYXJ0aXRpb24gJXUgZG9lc24ndCBlbmQgb24gY3lsaW5kZXIgYm91bmRhcnlcbiIsIGkrMSk7CisJCQl9CisJCQlpZiAobGVuc1tpXSkgeworCQkJCWZvciAoaiA9IDA7IGogPCBpOyBqKyspCisJCQkJCWlmIChsZW5zW2pdKSB7CisJCQkJCQlpZiAoc3RhcnRzW2pdID09IHN0YXJ0c1tpXStsZW5zW2ldKSB7CisJCQkJCQkJc3RhcnRzW2pdID0gc3RhcnRzW2ldOyBsZW5zW2pdICs9IGxlbnNbaV07CisJCQkJCQkJbGVuc1tpXSA9IDA7CisJCQkJCQl9IGVsc2UgaWYgKHN0YXJ0c1tpXSA9PSBzdGFydHNbal0rbGVuc1tqXSl7CisJCQkJCQkJbGVuc1tqXSArPSBsZW5zW2ldOworCQkJCQkJCWxlbnNbaV0gPSAwOworCQkJCQkJfSBlbHNlIGlmICghaykgeworCQkJCQkJCWlmIChzdGFydHNbaV0gPCBzdGFydHNbal0rbGVuc1tqXQorCQkJCQkJCSAmJiBzdGFydHNbal0gPCBzdGFydHNbaV0rbGVuc1tpXSkgeworCQkJCQkJCQlzdGFydG8gPSBzdGFydHNbaV07CisJCQkJCQkJCWlmIChzdGFydHNbal0gPiBzdGFydG8pCisJCQkJCQkJCQlzdGFydG8gPSBzdGFydHNbal07CisJCQkJCQkJCWVuZG8gPSBzdGFydHNbaV0rbGVuc1tpXTsKKwkJCQkJCQkJaWYgKHN0YXJ0c1tqXStsZW5zW2pdIDwgZW5kbykKKwkJCQkJCQkJCWVuZG8gPSBzdGFydHNbal0rbGVuc1tqXTsKKwkJCQkJCQkJcHJpbnRmKCJQYXJ0aXRpb24gJXUgb3ZlcmxhcHMgd2l0aCBvdGhlcnMgaW4gIgorCQkJCQkJCQkJInNlY3RvcnMgJXUtJXVcbiIsIGkrMSwgc3RhcnRvLCBlbmRvKTsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCWlmIChsZW5zW2ldKQorCQkJYXJyYXlbaV0gPSBpOworCQllbHNlCisJCQlhcnJheVtpXSA9IC0xOworCX0KKwlxc29ydChhcnJheSwgQVJSQVlfU0laRShhcnJheSksIHNpemVvZihhcnJheVswXSksCisJCShpbnQgKCopKGNvbnN0IHZvaWQgKixjb25zdCB2b2lkICopKSB2ZXJpZnlfc3VuX2NtcCk7CisJaWYgKGFycmF5WzBdID09IC0xKSB7CisJCXByaW50ZigiTm8gcGFydGl0aW9ucyBkZWZpbmVkXG4iKTsKKwkJcmV0dXJuOworCX0KKwlzdG9wID0gZ19jeWxpbmRlcnMgKiBnX2hlYWRzICogZ19zZWN0b3JzOworCWlmIChzdGFydHNbYXJyYXlbMF1dKQorCQlwcmludGYoIlVudXNlZCBnYXAgLSBzZWN0b3JzICV1LSV1XG4iLCAwLCBzdGFydHNbYXJyYXlbMF1dKTsKKwlmb3IgKGkgPSAwOyBpIDwgNyAmJiBhcnJheVtpKzFdICE9IC0xOyBpKyspIHsKKwkJcHJpbnRmKCJVbnVzZWQgZ2FwIC0gc2VjdG9ycyAldS0ldVxuIiwgc3RhcnRzW2FycmF5W2ldXStsZW5zW2FycmF5W2ldXSwgc3RhcnRzW2FycmF5W2krMV1dKTsKKwl9CisJc3RhcnQgPSBzdGFydHNbYXJyYXlbaV1dICsgbGVuc1thcnJheVtpXV07CisJaWYgKHN0YXJ0IDwgc3RvcCkKKwkJcHJpbnRmKCJVbnVzZWQgZ2FwIC0gc2VjdG9ycyAldS0ldVxuIiwgc3RhcnQsIHN0b3ApOworfQorCitzdGF0aWMgdm9pZAorYWRkX3N1bl9wYXJ0aXRpb24oaW50IG4sIGludCBzeXMpCit7CisJdW5zaWduZWQgc3RhcnQsIHN0b3AsIHN0b3AyOworCXVuc2lnbmVkIHN0YXJ0c1s4XSwgbGVuc1s4XTsKKwlpbnQgd2hvbGVfZGlzayA9IDA7CisKKwljaGFyIG1lc2dbMjU2XTsKKwlpbnQgaSwgZmlyc3QsIGxhc3Q7CisKKwlpZiAoc3VubGFiZWwtPnBhcnRpdGlvbnNbbl0ubnVtX3NlY3RvcnMgJiYgc3VubGFiZWwtPmluZm9zW25dLmlkKSB7CisJCXByaW50Zihtc2dfcGFydF9hbHJlYWR5X2RlZmluZWQsIG4gKyAxKTsKKwkJcmV0dXJuOworCX0KKworCWZldGNoX3N1bihzdGFydHMsIGxlbnMsICZzdGFydCwgJnN0b3ApOworCWlmIChzdG9wIDw9IHN0YXJ0KSB7CisJCWlmIChuID09IDIpCisJCQl3aG9sZV9kaXNrID0gMTsKKwkJZWxzZSB7CisJCQlwcmludGYoIk90aGVyIHBhcnRpdGlvbnMgYWxyZWFkeSBjb3ZlciB0aGUgd2hvbGUgZGlzay5cbiIKKwkJCQkiRGVsZXRlL3NocmluayB0aGVtIGJlZm9yZSByZXRyeS5cbiIpOworCQkJcmV0dXJuOworCQl9CisJfQorCXNucHJpbnRmKG1lc2csIHNpemVvZihtZXNnKSwgIkZpcnN0ICVzIiwgc3RyX3VuaXRzKFNJTkdVTEFSKSk7CisJd2hpbGUgKDEpIHsKKwkJaWYgKHdob2xlX2Rpc2spCisJCQlmaXJzdCA9IHJlYWRfaW50KDAsIDAsIDAsIDAsIG1lc2cpOworCQllbHNlCisJCQlmaXJzdCA9IHJlYWRfaW50KHNjcm91bmQoc3RhcnQpLCBzY3JvdW5kKHN0b3ApKzEsCisJCQkJCSBzY3JvdW5kKHN0b3ApLCAwLCBtZXNnKTsKKwkJaWYgKGRpc3BsYXlfaW5fY3lsX3VuaXRzKSB7CisJCQlmaXJzdCAqPSB1bml0c19wZXJfc2VjdG9yOworCQl9IGVsc2UgeworCQkJLyogU3RhcnRpbmcgc2VjdG9yIGhhcyB0byBiZSBwcm9wZXJseSBhbGlnbmVkICovCisJCQlmaXJzdCA9IChmaXJzdCArIGdfaGVhZHMgKiBnX3NlY3RvcnMgLSAxKSAvCisJCQkJKGdfaGVhZHMgKiBnX3NlY3RvcnMpOworCQkJZmlyc3QgKj0gZ19oZWFkcyAqIGdfc2VjdG9yczsKKwkJfQorCQlpZiAobiA9PSAyICYmIGZpcnN0ICE9IDApCisJCQlwcmludGYoIlwKK0l0IGlzIGhpZ2hseSByZWNvbW1lbmRlZCB0aGF0IHRoZSB0aGlyZCBwYXJ0aXRpb24gY292ZXJzIHRoZSB3aG9sZSBkaXNrXG5cCithbmQgaXMgb2YgdHlwZSAnV2hvbGUgZGlzaydcbiIpOworCQkvKiBld3QgYXNrcyB0byBhZGQ6ICJkb24ndCBzdGFydCBhIHBhcnRpdGlvbiBhdCBjeWwgMCIKKwkJICAgSG93ZXZlciwgZWRtdW5kb0ByYW5vLmRlbW9uLmNvLnVrIHdyaXRlczoKKwkJICAgIkluIGFkZGl0aW9uIHRvIGhhdmluZyBhIFN1biBwYXJ0aXRpb24gdGFibGUsIHRvIGJlIGFibGUgdG8KKwkJICAgYm9vdCBmcm9tIHRoZSBkaXNjLCB0aGUgZmlyc3QgcGFydGl0aW9uLCAvZGV2L3NkWDEsIG11c3QKKwkJICAgc3RhcnQgYXQgY3lsaW5kZXIgMC4gVGhpcyBtZWFucyB0aGF0IC9kZXYvc2RYMSBjb250YWlucworCQkgICB0aGUgcGFydGl0aW9uIHRhYmxlIGFuZCB0aGUgYm9vdCBibG9jaywgYXMgdGhlc2UgYXJlIHRoZQorCQkgICBmaXJzdCB0d28gc2VjdG9ycyBvZiB0aGUgZGlzYy4gVGhlcmVmb3JlIHlvdSBtdXN0IGJlCisJCSAgIGNhcmVmdWwgd2hhdCB5b3UgdXNlIC9kZXYvc2RYMSBmb3IuIEluIHBhcnRpY3VsYXIsIHlvdSBtdXN0CisJCSAgIG5vdCB1c2UgYSBwYXJ0aXRpb24gc3RhcnRpbmcgYXQgY3lsaW5kZXIgMCBmb3IgTGludXggc3dhcCwKKwkJICAgYXMgdGhhdCB3b3VsZCBvdmVyd3JpdGUgdGhlIHBhcnRpdGlvbiB0YWJsZSBhbmQgdGhlIGJvb3QKKwkJICAgYmxvY2suIFlvdSBtYXksIGhvd2V2ZXIsIHVzZSBzdWNoIGEgcGFydGl0aW9uIGZvciBhIFVGUworCQkgICBvciBFWFQyIGZpbGUgc3lzdGVtLCBhcyB0aGVzZSBmaWxlIHN5c3RlbXMgbGVhdmUgdGhlIGZpcnN0CisJCSAgIDEwMjQgYnl0ZXMgdW5kaXN0dXJiZWQuICovCisJCS8qIE9uIHRoZSBvdGhlciBoYW5kLCBvbmUgc2hvdWxkIG5vdCB1c2UgcGFydGl0aW9ucworCQkgICBzdGFydGluZyBhdCBibG9jayAwIGluIGFuIG1kLCBvciB0aGUgbGFiZWwgd2lsbAorCQkgICBiZSB0cmFzaGVkLiAqLworCQlmb3IgKGkgPSAwOyBpIDwgZ19wYXJ0aXRpb25zOyBpKyspCisJCQlpZiAobGVuc1tpXSAmJiBzdGFydHNbaV0gPD0gZmlyc3QgJiYgc3RhcnRzW2ldICsgbGVuc1tpXSA+IGZpcnN0KQorCQkJCWJyZWFrOworCQlpZiAoaSA8IGdfcGFydGl0aW9ucyAmJiAhd2hvbGVfZGlzaykgeworCQkJaWYgKG4gPT0gMiAmJiAhZmlyc3QpIHsKKwkJCQl3aG9sZV9kaXNrID0gMTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXByaW50ZigiU2VjdG9yICV1IGlzIGFscmVhZHkgYWxsb2NhdGVkXG4iLCBmaXJzdCk7CisJCX0gZWxzZQorCQkJYnJlYWs7CisJfQorCXN0b3AgPSBnX2N5bGluZGVycyAqIGdfaGVhZHMgKiBnX3NlY3RvcnM7CisJc3RvcDIgPSBzdG9wOworCWZvciAoaSA9IDA7IGkgPCBnX3BhcnRpdGlvbnM7IGkrKykgeworCQlpZiAoc3RhcnRzW2ldID4gZmlyc3QgJiYgc3RhcnRzW2ldIDwgc3RvcCkKKwkJCXN0b3AgPSBzdGFydHNbaV07CisJfQorCXNucHJpbnRmKG1lc2csIHNpemVvZihtZXNnKSwKKwkJIkxhc3QgJXMgb3IgK3NpemUgb3IgK3NpemVNIG9yICtzaXplSyIsCisJCXN0cl91bml0cyhTSU5HVUxBUikpOworCWlmICh3aG9sZV9kaXNrKQorCQlsYXN0ID0gcmVhZF9pbnQoc2Nyb3VuZChzdG9wMiksIHNjcm91bmQoc3RvcDIpLCBzY3JvdW5kKHN0b3AyKSwKKwkJCQkwLCBtZXNnKTsKKwllbHNlIGlmIChuID09IDIgJiYgIWZpcnN0KQorCQlsYXN0ID0gcmVhZF9pbnQoc2Nyb3VuZChmaXJzdCksIHNjcm91bmQoc3RvcDIpLCBzY3JvdW5kKHN0b3AyKSwKKwkJCQlzY3JvdW5kKGZpcnN0KSwgbWVzZyk7CisJZWxzZQorCQlsYXN0ID0gcmVhZF9pbnQoc2Nyb3VuZChmaXJzdCksIHNjcm91bmQoc3RvcCksIHNjcm91bmQoc3RvcCksCisJCQkJc2Nyb3VuZChmaXJzdCksIG1lc2cpOworCWlmIChkaXNwbGF5X2luX2N5bF91bml0cykKKwkJbGFzdCAqPSB1bml0c19wZXJfc2VjdG9yOworCWlmIChuID09IDIgJiYgIWZpcnN0KSB7CisJCWlmIChsYXN0ID49IHN0b3AyKSB7CisJCQl3aG9sZV9kaXNrID0gMTsKKwkJCWxhc3QgPSBzdG9wMjsKKwkJfSBlbHNlIGlmIChsYXN0ID4gc3RvcCkgeworCQkJcHJpbnRmKAorIllvdSBoYXZlbid0IGNvdmVyZWQgdGhlIHdob2xlIGRpc2sgd2l0aCB0aGUgM3JkIHBhcnRpdGlvbixcbiIKKyJidXQgeW91ciB2YWx1ZSAldSAlcyBjb3ZlcnMgc29tZSBvdGhlciBwYXJ0aXRpb24uXG4iCisiWW91ciBlbnRyeSBoYXMgYmVlbiBjaGFuZ2VkIHRvICV1ICVzXG4iLAorCQkJCXNjcm91bmQobGFzdCksIHN0cl91bml0cyhTSU5HVUxBUiksCisJCQkJc2Nyb3VuZChzdG9wKSwgc3RyX3VuaXRzKFNJTkdVTEFSKSk7CisJCQlsYXN0ID0gc3RvcDsKKwkJfQorCX0gZWxzZSBpZiAoIXdob2xlX2Rpc2sgJiYgbGFzdCA+IHN0b3ApCisJCWxhc3QgPSBzdG9wOworCisJaWYgKHdob2xlX2Rpc2spCisJCXN5cyA9IFNVTl9XSE9MRV9ESVNLOworCXNldF9zdW5fcGFydGl0aW9uKG4sIGZpcnN0LCBsYXN0LCBzeXMpOworfQorCitzdGF0aWMgdm9pZAorc3VuX2RlbGV0ZV9wYXJ0aXRpb24oaW50IGkpCit7CisJdW5zaWduZWQgaW50IG5zZWM7CisKKwlpZiAoaSA9PSAyCisJICYmIHN1bmxhYmVsLT5pbmZvc1tpXS5pZCA9PSBTVU5fV0hPTEVfRElTSworCSAmJiAhc3VubGFiZWwtPnBhcnRpdGlvbnNbaV0uc3RhcnRfY3lsaW5kZXIKKwkgJiYgKG5zZWMgPSBTVU5fU1NXQVAzMihzdW5sYWJlbC0+cGFydGl0aW9uc1tpXS5udW1fc2VjdG9ycykpID09IGdfaGVhZHMgKiBnX3NlY3RvcnMgKiBnX2N5bGluZGVycykKKwkJcHJpbnRmKCJJZiB5b3Ugd2FudCB0byBtYWludGFpbiBTdW5PUy9Tb2xhcmlzIGNvbXBhdGliaWxpdHksICIKKwkJCSJjb25zaWRlciBsZWF2aW5nIHRoaXNcbiIKKwkJCSJwYXJ0aXRpb24gYXMgV2hvbGUgZGlzayAoNSksIHN0YXJ0aW5nIGF0IDAsIHdpdGggJXUgIgorCQkJInNlY3RvcnNcbiIsIG5zZWMpOworCXN1bmxhYmVsLT5pbmZvc1tpXS5pZCA9IDA7CisJc3VubGFiZWwtPnBhcnRpdGlvbnNbaV0ubnVtX3NlY3RvcnMgPSAwOworfQorCitzdGF0aWMgdm9pZAorc3VuX2NoYW5nZV9zeXNpZChpbnQgaSwgaW50IHN5cykKK3sKKwlpZiAoc3lzID09IExJTlVYX1NXQVAgJiYgIXN1bmxhYmVsLT5wYXJ0aXRpb25zW2ldLnN0YXJ0X2N5bGluZGVyKSB7CisJCXJlYWRfbWF5YmVfZW1wdHkoCisJCQkiSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRoYXQgdGhlIHBhcnRpdGlvbiBhdCBvZmZzZXQgMFxuIgorCQkJImlzIFVGUywgRVhUMkZTIGZpbGVzeXN0ZW0gb3IgU3VuT1Mgc3dhcC4gUHV0dGluZyBMaW51eCBzd2FwXG4iCisJCQkidGhlcmUgbWF5IGRlc3Ryb3kgeW91ciBwYXJ0aXRpb24gdGFibGUgYW5kIGJvb3RibG9jay5cbiIKKwkJCSJUeXBlIFlFUyBpZiB5b3UncmUgdmVyeSBzdXJlIHlvdSB3b3VsZCBsaWtlIHRoYXQgcGFydGl0aW9uXG4iCisJCQkidGFnZ2VkIHdpdGggODIgKExpbnV4IHN3YXApOiAiKTsKKwkJaWYgKHN0cmNtcCAobGluZV9wdHIsICJZRVNcbiIpKQorCQkJcmV0dXJuOworCX0KKwlzd2l0Y2ggKHN5cykgeworCWNhc2UgU1VOT1NfU1dBUDoKKwljYXNlIExJTlVYX1NXQVA6CisJCS8qIHN3YXBzIGFyZSBub3QgbW91bnRhYmxlIGJ5IGRlZmF1bHQgKi8KKwkJc3VubGFiZWwtPmluZm9zW2ldLmZsYWdzIHw9IDB4MDE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCS8qIGFzc3VtZSBvdGhlciB0eXBlcyBhcmUgbW91bnRhYmxlOworCQkgICB1c2VyIGNhbiBjaGFuZ2UgaXQgYW55d2F5ICovCisJCXN1bmxhYmVsLT5pbmZvc1tpXS5mbGFncyAmPSB+MHgwMTsKKwkJYnJlYWs7CisJfQorCXN1bmxhYmVsLT5pbmZvc1tpXS5pZCA9IHN5czsKK30KKworc3RhdGljIHZvaWQKK3N1bl9saXN0X3RhYmxlKGludCB4dHJhKQoreworCWludCBpLCB3OworCisJdyA9IHN0cmxlbihkaXNrX2RldmljZSk7CisJaWYgKHh0cmEpCisJCXByaW50ZigKKwkJIlxuRGlzayAlcyAoU3VuIGRpc2sgbGFiZWwpOiAldSBoZWFkcywgJXUgc2VjdG9ycywgJXUgcnBtXG4iCisJCSIldSBjeWxpbmRlcnMsICV1IGFsdGVybmF0ZSBjeWxpbmRlcnMsICV1IHBoeXNpY2FsIGN5bGluZGVyc1xuIgorCQkiJXUgZXh0cmEgc2VjdHMvY3lsLCBpbnRlcmxlYXZlICV1OjFcbiIKKwkJIiVzXG4iCisJCSJVbml0cyA9ICVzIG9mICV1ICogNTEyIGJ5dGVzXG5cbiIsCisJCQlkaXNrX2RldmljZSwgZ19oZWFkcywgZ19zZWN0b3JzLCBTVU5fU1NXQVAxNihzdW5sYWJlbC0+cnNwZWVkKSwKKwkJCWdfY3lsaW5kZXJzLCBTVU5fU1NXQVAxNihzdW5sYWJlbC0+bmFjeWwpLAorCQkJU1VOX1NTV0FQMTYoc3VubGFiZWwtPnBjeWxjb3VudCksCisJCQlTVU5fU1NXQVAxNihzdW5sYWJlbC0+c3BhcmVjeWwpLAorCQkJU1VOX1NTV0FQMTYoc3VubGFiZWwtPmlsZmFjdCksCisJCQkoY2hhciAqKXN1bmxhYmVsLAorCQkJc3RyX3VuaXRzKFBMVVJBTCksIHVuaXRzX3Blcl9zZWN0b3IpOworCWVsc2UKKwkJcHJpbnRmKAorCSJcbkRpc2sgJXMgKFN1biBkaXNrIGxhYmVsKTogJXUgaGVhZHMsICV1IHNlY3RvcnMsICV1IGN5bGluZGVyc1xuIgorCSJVbml0cyA9ICVzIG9mICV1ICogNTEyIGJ5dGVzXG5cbiIsCisJCQlkaXNrX2RldmljZSwgZ19oZWFkcywgZ19zZWN0b3JzLCBnX2N5bGluZGVycywKKwkJCXN0cl91bml0cyhQTFVSQUwpLCB1bml0c19wZXJfc2VjdG9yKTsKKworCXByaW50ZigiJSpzIEZsYWcgICAgU3RhcnQgICAgICAgRW5kICAgIEJsb2NrcyAgIElkICBTeXN0ZW1cbiIsCisJCXcgKyAxLCAiRGV2aWNlIik7CisJZm9yIChpID0gMDsgaSA8IGdfcGFydGl0aW9uczsgaSsrKSB7CisJCWlmIChzdW5sYWJlbC0+cGFydGl0aW9uc1tpXS5udW1fc2VjdG9ycykgeworCQkJdWludDMyX3Qgc3RhcnQgPSBTVU5fU1NXQVAzMihzdW5sYWJlbC0+cGFydGl0aW9uc1tpXS5zdGFydF9jeWxpbmRlcikgKiBnX2hlYWRzICogZ19zZWN0b3JzOworCQkJdWludDMyX3QgbGVuID0gU1VOX1NTV0FQMzIoc3VubGFiZWwtPnBhcnRpdGlvbnNbaV0ubnVtX3NlY3RvcnMpOworCQkJcHJpbnRmKCIlcyAlYyVjICU5bHUgJTlsdSAlOWx1JWMgICUyeCAgJXNcbiIsCisJCQkJcGFydG5hbWUoZGlza19kZXZpY2UsIGkrMSwgdyksICAgICAgICAgICAgICAgICAgLyogZGV2aWNlICovCisJCQkJKHN1bmxhYmVsLT5pbmZvc1tpXS5mbGFncyAmIDB4MDEpID8gJ3UnIDogJyAnLCAgLyogZmxhZ3MgKi8KKwkJCQkoc3VubGFiZWwtPmluZm9zW2ldLmZsYWdzICYgMHgxMCkgPyAncicgOiAnICcsCisJCQkJKGxvbmcpIHNjcm91bmQoc3RhcnQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RhcnQgKi8KKwkJCQkobG9uZykgc2Nyb3VuZChzdGFydCtsZW4pLCAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgKi8KKwkJCQkobG9uZykgbGVuIC8gMiwgbGVuICYgMSA/ICcrJyA6ICcgJywgICAgICAgICAgICAvKiBvZGQgZmxhZyBvbiBlbmQgKi8KKwkJCQlzdW5sYWJlbC0+aW5mb3NbaV0uaWQsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0eXBlIGlkICovCisJCQkJcGFydGl0aW9uX3R5cGUoc3VubGFiZWwtPmluZm9zW2ldLmlkKSk7ICAgICAgICAgLyogdHlwZSBuYW1lICovCisJCX0KKwl9Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9GRElTS19BRFZBTkNFRAorCitzdGF0aWMgdm9pZAorc3VuX3NldF9hbHRfY3lsKHZvaWQpCit7CisJc3VubGFiZWwtPm5hY3lsID0KKwkJU1VOX1NTV0FQMTYocmVhZF9pbnQoMCwgU1VOX1NTV0FQMTYoc3VubGFiZWwtPm5hY3lsKSwgNjU1MzUsIDAsCisJCQkJIk51bWJlciBvZiBhbHRlcm5hdGUgY3lsaW5kZXJzIikpOworfQorCitzdGF0aWMgdm9pZAorc3VuX3NldF9uY3lsKGludCBjeWwpCit7CisJc3VubGFiZWwtPm5jeWwgPSBTVU5fU1NXQVAxNihjeWwpOworfQorCitzdGF0aWMgdm9pZAorc3VuX3NldF94Y3lsKHZvaWQpCit7CisJc3VubGFiZWwtPnNwYXJlY3lsID0KKwkJU1VOX1NTV0FQMTYocmVhZF9pbnQoMCwgU1VOX1NTV0FQMTYoc3VubGFiZWwtPnNwYXJlY3lsKSwgZ19zZWN0b3JzLCAwLAorCQkJCSJFeHRyYSBzZWN0b3JzIHBlciBjeWxpbmRlciIpKTsKK30KKworc3RhdGljIHZvaWQKK3N1bl9zZXRfaWxmYWN0KHZvaWQpCit7CisJc3VubGFiZWwtPmlsZmFjdCA9CisJCVNVTl9TU1dBUDE2KHJlYWRfaW50KDEsIFNVTl9TU1dBUDE2KHN1bmxhYmVsLT5pbGZhY3QpLCAzMiwgMCwKKwkJCQkiSW50ZXJsZWF2ZSBmYWN0b3IiKSk7Cit9CisKK3N0YXRpYyB2b2lkCitzdW5fc2V0X3JzcGVlZCh2b2lkKQoreworCXN1bmxhYmVsLT5yc3BlZWQgPQorCQlTVU5fU1NXQVAxNihyZWFkX2ludCgxLCBTVU5fU1NXQVAxNihzdW5sYWJlbC0+cnNwZWVkKSwgMTAwMDAwLCAwLAorCQkJCSJSb3RhdGlvbiBzcGVlZCAocnBtKSIpKTsKK30KKworc3RhdGljIHZvaWQKK3N1bl9zZXRfcGN5bGNvdW50KHZvaWQpCit7CisJc3VubGFiZWwtPnBjeWxjb3VudCA9CisJCVNVTl9TU1dBUDE2KHJlYWRfaW50KDAsIFNVTl9TU1dBUDE2KHN1bmxhYmVsLT5wY3lsY291bnQpLCA2NTUzNSwgMCwKKwkJCQkiTnVtYmVyIG9mIHBoeXNpY2FsIGN5bGluZGVycyIpKTsKK30KKyNlbmRpZiAvKiBGRUFUVVJFX0ZESVNLX0FEVkFOQ0VEICovCisKK3N0YXRpYyB2b2lkCitzdW5fd3JpdGVfdGFibGUodm9pZCkKK3sKKwl1bnNpZ25lZCBzaG9ydCAqdXNoID0gKHVuc2lnbmVkIHNob3J0ICopc3VubGFiZWw7CisJdW5zaWduZWQgc2hvcnQgY3N1bSA9IDA7CisKKwl3aGlsZSAodXNoIDwgKHVuc2lnbmVkIHNob3J0ICopKCZzdW5sYWJlbC0+Y3N1bSkpCisJCWNzdW0gXj0gKnVzaCsrOworCXN1bmxhYmVsLT5jc3VtID0gY3N1bTsKKwl3cml0ZV9zZWN0b3IoMCwgc3VubGFiZWwpOworfQorI2VuZGlmIC8qIFNVTl9MQUJFTCAqLwpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9maW5kZnMuYyBiL3V0aWwtbGludXgvZmluZGZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3MzRmMwotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvZmluZGZzLmMKQEAgLTAsMCArMSw0NyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogU3VwcG9ydCBmdW5jdGlvbnMgZm9yIG1vdW50aW5nIGRldmljZXMgYnkgbGFiZWwvdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBieSBKYXNvbiBTY2hvb24gPGZsb3lkcGlua0BnbWFpbC5jb20+CisgKiBTb21lIHBvcnRpb25zIGNyaWJiZWQgZnJvbSBlMmZzcHJvZ3MsIHV0aWwtbGludXgsIGRvc2ZzdG9vbHMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBmaW5kZnNfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIkxBQkVMPWxhYmVsIG9yIFVVSUQ9dXVpZCIKKy8vdXNhZ2U6I2RlZmluZSBmaW5kZnNfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJGaW5kIGEgZmlsZXN5c3RlbSBkZXZpY2UgYmFzZWQgb24gYSBsYWJlbCBvciBVVUlEIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBmaW5kZnNfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgZmluZGZzIExBQkVMPU15RGV2aWNlIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ2b2x1bWVfaWQuaCIKKworaW50IGZpbmRmc19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZmluZGZzX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpkZXYgPSAqKythcmd2OworCisJaWYgKCFkZXYpCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCWlmIChpc19wcmVmaXhlZF93aXRoKGRldiwgIi9kZXYvIikpIHsKKwkJLyogSnVzdCBwYXNzIGFueSAvZGV2L3h4eCBuYW1lIHJpZ2h0IHRocm91Z2guCisJCSAqIFRoaXMgbWlnaHQgYWlkIGluIHNvbWUgc2NyaXB0cyBiZWluZyBhYmxlCisJCSAqIHRvIGNhbGwgdGhpcyB1bmNvbmRpdGlvbmFsbHkgKi8KKwkJZGV2ID0gTlVMTDsKKwl9IGVsc2UgeworCQkvKiBPdGhlcndpc2UsIGhhbmRsZSBMQUJFTD14eHggYW5kIFVVSUQ9eHh4LAorCQkgKiBmYWlsIG9uIGFueXRoaW5nIGVsc2UgKi8KKwkJaWYgKCFyZXNvbHZlX21vdW50X3NwZWMoYXJndikpCisJCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJaWYgKCphcmd2ICE9IGRldikgeworCQlwdXRzKCphcmd2KTsKKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9mbG9jay5jIGIvdXRpbC1saW51eC9mbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YTc0N2YKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L2Zsb2NrLmMKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaW1vIFRlcmFzIDx0aW1vLnRlcmFzQGlraS5maT4KKyAqCisgKiBUaGlzIGlzIGZyZWUgc29mdHdhcmUsIGxpY2Vuc2VkIHVuZGVyIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2Mi4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZmxvY2tfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstc3h1bl0gRkR8e0ZJTEUgWy1jXSBQUk9HIEFSR1N9IgorLy91c2FnZTojZGVmaW5lIGZsb2NrX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiW1VuXWxvY2sgZmlsZSBkZXNjcmlwdG9yLCBvciBsb2NrIEZJTEUsIHJ1biBQUk9HXG4iCisvL3VzYWdlOiAgICAgIlxuCS1zCVNoYXJlZCBsb2NrIgorLy91c2FnZTogICAgICJcbgkteAlFeGNsdXNpdmUgbG9jayAoZGVmYXVsdCkiCisvL3VzYWdlOiAgICAgIlxuCS11CVVubG9jayBGRCIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JRmFpbCByYXRoZXIgdGhhbiB3YWl0IgorCisjaW5jbHVkZSA8c3lzL2ZpbGUuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorCitpbnQgZmxvY2tfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZsb2NrX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgbW9kZSwgb3B0LCBmZDsKKwllbnVtIHsKKwkJT1BUX3MgPSAoMSA8PCAwKSwKKwkJT1BUX3ggPSAoMSA8PCAxKSwKKwkJT1BUX24gPSAoMSA8PCAyKSwKKwkJT1BUX3UgPSAoMSA8PCAzKSwKKwkJT1BUX2MgPSAoMSA8PCA0KSwKKwl9OworCisjaWYgRU5BQkxFX0xPTkdfT1BUUworCXN0YXRpYyBjb25zdCBjaGFyIGdldG9wdF9sb25nb3B0c1tdIEFMSUdOMSA9CisJCSJzaGFyZWRcMCIgICAgICBOb19hcmd1bWVudCAgICAgICAicyIKKwkJImV4Y2x1c2l2ZVwwIiAgIE5vX2FyZ3VtZW50ICAgICAgICJ4IgorCQkidW5sb2NrXDAiICAgICAgTm9fYXJndW1lbnQgICAgICAgInUiCisJCSJub25ibG9ja1wwIiAgICBOb19hcmd1bWVudCAgICAgICAibiIKKwkJOworCWFwcGxldF9sb25nX29wdGlvbnMgPSBnZXRvcHRfbG9uZ29wdHM7CisjZW5kaWYKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMSI7CisKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiK3N4bnUiKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWlmIChhcmd2WzFdKSB7CisJCWZkID0gb3Blbihhcmd2WzBdLCBPX1JET05MWXxPX05PQ1RUWXxPX0NSRUFULCAwNjY2KTsKKwkJaWYgKGZkIDwgMCAmJiBlcnJubyA9PSBFSVNESVIpCisJCQlmZCA9IG9wZW4oYXJndlswXSwgT19SRE9OTFl8T19OT0NUVFkpOworCQlpZiAoZmQgPCAwKQorCQkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBvcGVuICclcyciLCBhcmd2WzBdKTsKKwkJLy9UT0RPPyBjbG9zZV9vbl9leGVjX29uKGZkKTsKKwl9IGVsc2UgeworCQlmZCA9IHhhdG9pX3Bvc2l0aXZlKGFyZ3ZbMF0pOworCX0KKwlhcmd2Kys7CisKKwkvKiBJZiBpdCBpcyAiZmxvY2sgRklMRSAtYyBQUk9HIiwgdGhlbiAtYyBpc24ndCBjYXVnaHQgYnkgZ2V0b3B0MzI6CisJICogd2UgdXNlICIrIiBpbiBvcmRlciB0byBzdXBwb3J0ICJmbG9jayAtb3B0IEZJTEUgUFJPRyAtd2l0aC1vcHRzIiwKKwkgKiB3ZSBuZWVkIHRvIHJlbW92ZSAtYyBieSBoYW5kLgorCSAqIFRPRE86IGluIHVwc3RyZWFtLCAtYyAnUFJPRyBBUkdTJyBtZWFucyAicnVuIHNoIC1jICdQUk9HIEFSR1MnIgorCSAqLworCWlmIChhcmd2WzBdCisJICYmIGFyZ3ZbMF1bMF0gPT0gJy0nCisJICYmICggIChhcmd2WzBdWzFdID09ICdjJyAmJiAhYXJndlswXVsyXSkKKwkgICAgfHwgKEVOQUJMRV9MT05HX09QVFMgJiYgc3RyY21wKGFyZ3ZbMF0gKyAxLCAiLWNvbW1hbmQiKSA9PSAwKQorCSAgICApCisJKSB7CisJCWFyZ3YrKzsKKwl9CisKKwlpZiAoT1BUX3MgPT0gTE9DS19TSCAmJiBPUFRfeCA9PSBMT0NLX0VYICYmIE9QVF9uID09IExPQ0tfTkIgJiYgT1BUX3UgPT0gTE9DS19VTikgeworCQkvKiBXaXRoIHN1aXRhYmx5IG1hdGNoZWQgY29uc3RhbnRzLCBtb2RlIHNldHRpbmcgaXMgbXVjaCBzaW1wbGVyICovCisJCW1vZGUgPSBvcHQgJiAoTE9DS19TSCArIExPQ0tfRVggKyBMT0NLX05CICsgTE9DS19VTik7CisJCWlmICghKG1vZGUgJiB+TE9DS19OQikpCisJCQltb2RlIHw9IExPQ0tfRVg7CisJfSBlbHNlIHsKKwkJaWYgKG9wdCAmIE9QVF91KQorCQkJbW9kZSA9IExPQ0tfVU47CisJCWVsc2UgaWYgKG9wdCAmIE9QVF9zKQorCQkJbW9kZSA9IExPQ0tfU0g7CisJCWVsc2UKKwkJCW1vZGUgPSBMT0NLX0VYOworCQlpZiAob3B0ICYgT1BUX24pCisJCQltb2RlIHw9IExPQ0tfTkI7CisJfQorCisJaWYgKGZsb2NrKGZkLCBtb2RlKSAhPSAwKSB7CisJCWlmIChlcnJubyA9PSBFV09VTERCTE9DSykKKwkJCXJldHVybiBFWElUX0ZBSUxVUkU7CisJCWJiX3BlcnJvcl9ub21zZ19hbmRfZGllKCk7CisJfQorCisJaWYgKGFyZ3ZbMF0pCisJCXJldHVybiBzcGF3bl9hbmRfd2FpdChhcmd2KTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2ZyZWVyYW1kaXNrLmMgYi91dGlsLWxpbnV4L2ZyZWVyYW1kaXNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5YWUxYQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvZnJlZXJhbWRpc2suYwpAQCAtMCwwICsxLDQ1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBmcmVlcmFtZGlzayBhbmQgZmRmbHVzaCBpbXBsZW1lbnRhdGlvbnMgZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDAgYW5kIHdyaXR0ZW4gYnkgRW1hbnVlbGUgQ2FyYXR0aSA8d2l6QGlvbC5pdD4KKyAqIEFkanVzdGVkIGEgYml0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqIFVuaWZpZWQgd2l0aCBmZGZsdXNoIGJ5IFRpdG8gUmFndXNhIDxmYXJtYXRpdG9AdGlzY2FsaS5pdD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBmcmVlcmFtZGlza190cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiREVWSUNFIgorLy91c2FnZTojZGVmaW5lIGZyZWVyYW1kaXNrX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRnJlZSBhbGwgbWVtb3J5IHVzZWQgYnkgdGhlIHNwZWNpZmllZCByYW1kaXNrIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBmcmVlcmFtZGlza19leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBmcmVlcmFtZGlzayAvZGV2L3JhbTJcbiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgZmRmbHVzaF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiREVWSUNFIgorLy91c2FnZTojZGVmaW5lIGZkZmx1c2hfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJGb3JjZSBmbG9wcHkgZGlzayBkcml2ZSB0byBkZXRlY3QgZGlzayBjaGFuZ2UiCisKKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBGcm9tIDxsaW51eC9mZC5oPiAqLworI2RlZmluZSBGREZMVVNIICBfSU8oMiwweDRiKQorCitpbnQgZnJlZXJhbWRpc2tfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZyZWVyYW1kaXNrX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgZmQ7CisKKwlmZCA9IHhvcGVuKHNpbmdsZV9hcmd2KGFyZ3YpLCBPX1JEV1IpOworCisJLy8gQWN0IGxpa2UgZnJlZXJhbWRpc2ssIGZkZmx1c2gsIG9yIGJvdGggZGVwZW5kaW5nIG9uIGNvbmZpZ3VyYXRpb24uCisJaW9jdGxfb3JfcGVycm9yX2FuZF9kaWUoZmQsIChFTkFCTEVfRlJFRVJBTURJU0sgJiYgYXBwbGV0X25hbWVbMV0gPT0gJ3InKQorCQkJfHwgIUVOQUJMRV9GREZMVVNIID8gQkxLRkxTQlVGIDogRkRGTFVTSCwgTlVMTCwgIiVzIiwgYXJndlsxXSk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGNsb3NlKGZkKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2ZzY2tfbWluaXguYyBiL3V0aWwtbGludXgvZnNja19taW5peC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZjM1MjQKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L2ZzY2tfbWluaXguYwpAQCAtMCwwICsxLDEzMTUgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGZzY2suYyAtIGEgZmlsZSBzeXN0ZW0gY29uc2lzdGVuY3kgY2hlY2tlciBmb3IgTGludXguCisgKgorICogKEMpIDE5OTEsIDE5OTIgTGludXMgVG9ydmFsZHMuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorICogMDkuMTEuOTEgIC0gIG1hZGUgdGhlIGZpcnN0IHJ1ZGltZW50YXJ5IGZ1bmN0aW9ucworICoKKyAqIDEwLjExLjkxICAtICB1cGRhdGVkLCBkb2VzIGNoZWNraW5nLCBubyByZXBhaXJzIHlldC4KKyAqCQlTZW50IG91dCB0byB0aGUgbWFpbGluZy1saXN0IGZvciB0ZXN0aW5nLgorICoKKyAqIDE0LjExLjkxICAtICBUZXN0aW5nIHNlZW1zIHRvIGhhdmUgZ29uZSB3ZWxsLiBBZGRlZCBzb21lCisgKgkJY29ycmVjdGlvbi1jb2RlLCBhbmQgY2hhbmdlZCBzb21lIGZ1bmN0aW9ucy4KKyAqCisgKiAxNS4xMS45MSAgLSAgTW9yZSBjb3JyZWN0aW9uIGNvZGUuIEhvcGVmdWxseSBpdCBub3RpY2VzIG1vc3QKKyAqCQljYXNlcyBub3csIGFuZCB0cmllcyB0byBkbyBzb21ldGhpbmcgYWJvdXQgdGhlbS4KKyAqCisgKiAxNi4xMS45MSAgLSAgTW9yZSBjb3JyZWN0aW9ucyAodGhhbmtzIHRvIE1pa2EgSmFsYXZhKS4gTW9zdAorICoJCXRoaW5ncyBzZWVtIHRvIHdvcmsgbm93LiBZZWFoLCBzdXJlLgorICoKKyAqIDE5LjA0LjkyICAtICBIYWQgdG8gc3RhcnQgb3ZlciBhZ2FpbiBmcm9tIHRoaXMgb2xkIHZlcnNpb24sIGFzIGEKKyAqCQlrZXJuZWwgYnVnIGF0ZSBteSBlbmhhbmNlZCBmc2NrIGluIGZlYnJ1YXJ5LgorICoKKyAqIDI4LjAyLjkzICAtICBhZGRlZCBzdXBwb3J0IGZvciBkaWZmZXJlbnQgZGlyZWN0b3J5IGVudHJ5IHNpemVzLi4KKyAqCisgKiBTYXQgTWFyICA2IDE4OjU5OjQyIDE5OTMsIGZhaXRoQGNzLnVuYy5lZHU6IE91dHB1dCBuYW1lbGVuIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXJibG9jayBpbmZvcm1hdGlvbgorICoKKyAqIFNhdCBPY3QgIDkgMTE6MTc6MTEgMTk5MywgZmFpdGhAY3MudW5jLmVkdTogbWFrZSBleGl0IHN0YXR1cyBjb25mb3JtCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoYXQgcmVxdWlyZWQgYnkgZnN1dGlsCisgKgorICogTW9uIEphbiAgMyAxMTowNjo1MiAxOTk0IC0gRHIuIFdldHRzdGVpbiAoZ3JlZyV3aW5kLnV1Y3BAcGxhaW5zLm5vZGFrLmVkdSkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGVkIHN1cHBvcnQgZm9yIGZpbGUgc3lzdGVtIHZhbGlkIGZsYWcuICBBbHNvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZCBwcm9ncmFtX3ZlcnNpb24gdmFyaWFibGUgYW5kIG91dHB1dCBvZgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbSBuYW1lIGFuZCB2ZXJzaW9uIG51bWJlciB3aGVuIHByb2dyYW0KKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGV4ZWN1dGVkLgorICoKKyAqIDMwLjEwLjk0ICAtIGFkZGVkIHN1cHBvcnQgZm9yIHYyIGZpbGVzeXN0ZW0KKyAqICAgICAgICAgICAgIChBbmRyZWFzIFNjaHdhYiwgc2Nod2FiQGlzc2FuLmluZm9ybWF0aWsudW5pLWRvcnRtdW5kLmRlKQorICoKKyAqIDEwLjEyLjk0ICAtIGFkZGVkIHRlc3QgdG8gcHJldmVudCBjaGVja2luZyBvZiBtb3VudGVkIGZzIGFkYXB0ZWQKKyAqICAgICAgICAgICAgIGZyb20gVGhlb2RvcmUgVHMnbydzICh0eXRzb0BhdGhlbmEubWl0LmVkdSkgZTJmc2NrCisgKiAgICAgICAgICAgICBwcm9ncmFtLiAgKERhbmllbCBRdWlubGFuLCBxdWlubGFuQHlnZ2RyYXNpbC5jb20pCisgKgorICogMDEuMDcuOTYgIC0gRml4ZWQgdGhlIHYyIGZzIHN0dWZmIHRvIHVzZSB0aGUgcmlnaHQgI2RlZmluZXMgYW5kIHN1Y2gKKyAqICAgICAgICAgICAgIGZvciBtb2Rlcm4gbGliY3MgKGphbmxAbWF0aC51aW8ubm8sIE5pY29sYWkgTGFuZ2ZlbGR0KQorICoKKyAqIDAyLjA3Ljk2ICAtIEFkZGVkIEMgYml0IGZpZGRsaW5nIHJvdXRpbmVzIGZyb20gcm1rQGVjcy5zb3Rvbi5hYy51aworICogICAgICAgICAgICAgKFJ1c3NlbGwgS2luZykuICBIZSBtYWRlIHRoZW0gZm9yIEFSTS4gIEl0IHdvdWxkIHNlZW0KKyAqICAgICAgICAgICAgIHRoYXQgdGhlIEFSTSBpcyBwb3dlcmZ1bCBlbm91Z2ggdG8gZG8gdGhpcyBpbiBDIHdoZXJlYXMKKyAqICAgICAgICAgICAgIGkzODYgYW5kIG02NGsgbXVzdCB1c2UgYXNzZW1ibHkgdG8gZ2V0IGl0IGZhc3QgPjotKQorICogICAgICAgICAgICAgVGhpcyBzaG91bGQgbWFrZSBtaW5peCBmc2NrIHN5c3RlbS1pbmRlcGVuZGVudC4KKyAqICAgICAgICAgICAgIChqYW5sQG1hdGgudWlvLm5vLCBOaWNvbGFpIExhbmdmZWxkdCkKKyAqCisgKiAwNC4xMS45NiAgLSBBZGRlZCBtaW5vciBmaXhlcyBmcm9tIEFuZHJlYXMgU2Nod2FiIHRvIGF2b2lkIGNvbXBpbGVyCisgKiAgICAgICAgICAgICB3YXJuaW5ncy4gIEFkZGVkIG1jNjhrIGJpdG9wcyBmcm9tCisgKiAgICAgICAgICAgICBKb2VyZyBEb3JjaGFpbiA8ZG9yY2hhaW5AbXBpLXNiLm1wZy5kZT4uCisgKgorICogMDYuMTEuOTYgIC0gQWRkZWQgdjIgY29kZSBzdWJtaXR0ZWQgYnkgSm9lcmcgRG9yY2hhaW4sIGJ1dCB3cml0dGVuIGJ5CisgKiAgICAgICAgICAgICBBbmRyZWFzIFNjaHdhYi4KKyAqCisgKiAxOTk5LTAyLTIyIEFya2FkaXVzeiBNaWNraWV3aWN6IDxtaXNpZWtAbWlzaWVrLmV1Lm9yZz4KKyAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyAqCisgKgorICogSSd2ZSBoYWQgbm8gdGltZSB0byBhZGQgY29tbWVudHMgLSBob3BlZnVsbHkgdGhlIGZ1bmN0aW9uIG5hbWVzCisgKiBhcmUgY29tbWVudHMgZW5vdWdoLiBBcyB3aXRoIGFsbCBmaWxlIHN5c3RlbSBjaGVja2VycywgdGhpcyBhc3N1bWVzCisgKiB0aGUgZmlsZSBzeXN0ZW0gaXMgcXVpZXNjZW50IC0gZG9uJ3QgdXNlIGl0IG9uIGEgbW91bnRlZCBkZXZpY2UKKyAqIHVubGVzcyB5b3UgY2FuIGJlIHN1cmUgbm9ib2R5IGlzIHdyaXRpbmcgdG8gaXQgKGFuZCByZW1lbWJlciB0aGF0IHRoZQorICoga2VybmVsIGNhbiB3cml0ZSB0byBpdCB3aGVuIGl0IHNlYXJjaGVzIGZvciBmaWxlcykuCisgKgorICogVXNhZ2U6IGZzY2sgWy1sYXJ2c21dIGRldmljZQorICoJLWwgZm9yIGEgbGlzdGluZyBvZiBhbGwgdGhlIGZpbGVuYW1lcworICoJLWEgZm9yIGF1dG9tYXRpYyByZXBhaXJzIChub3QgaW1wbGVtZW50ZWQpCisgKgktciBmb3IgcmVwYWlycyAoaW50ZXJhY3RpdmUpIChub3QgaW1wbGVtZW50ZWQpCisgKgktdiBmb3IgdmVyYm9zZSAodGVsbHMgaG93IG1hbnkgZmlsZXMpCisgKgktcyBmb3Igc3VwZXJibG9jayBpbmZvCisgKgktbSBmb3IgbWluaXgtbGlrZSAibW9kZSBub3QgY2xlYXJlZCIgd2FybmluZ3MKKyAqCS1mIGZvcmNlIGZpbGVzeXN0ZW0gY2hlY2sgZXZlbiBpZiBmaWxlc3lzdGVtIG1hcmtlZCBhcyB2YWxpZAorICoKKyAqIFRoZSBkZXZpY2UgbWF5IGJlIGEgYmxvY2sgZGV2aWNlIG9yIGEgaW1hZ2Ugb2Ygb25lLCBidXQgdGhpcyBpc24ndAorICogZW5mb3JjZWQgKGJ1dCBpdCdzIG5vdCBtdWNoIGZ1biBvbiBhIGNoYXJhY3RlciBkZXZpY2UgOi0pLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBmc2NrX21pbml4X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWxhcnZzbWZdIEJMT0NLREVWIgorLy91c2FnZTojZGVmaW5lIGZzY2tfbWluaXhfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJDaGVjayBNSU5JWCBmaWxlc3lzdGVtXG4iCisvL3VzYWdlOiAgICAgIlxuCS1sCUxpc3QgYWxsIGZpbGVuYW1lcyIKKy8vdXNhZ2U6ICAgICAiXG4JLXIJUGVyZm9ybSBpbnRlcmFjdGl2ZSByZXBhaXJzIgorLy91c2FnZTogICAgICJcbgktYQlQZXJmb3JtIGF1dG9tYXRpYyByZXBhaXJzIgorLy91c2FnZTogICAgICJcbgktdglWZXJib3NlIgorLy91c2FnZTogICAgICJcbgktcwlPdXRwdXQgc3VwZXJibG9jayBpbmZvcm1hdGlvbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW0JU2hvdyBcIm1vZGUgbm90IGNsZWFyZWRcIiB3YXJuaW5ncyIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UgZmlsZSBzeXN0ZW0gY2hlY2siCisKKyNpbmNsdWRlIDxtbnRlbnQuaD4KKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgIm1pbml4LmgiCisKKyNpZm5kZWYgQkxLR0VUU0laRQorI2RlZmluZSBCTEtHRVRTSVpFIF9JTygweDEyLDk2KSAgICAvKiByZXR1cm4gZGV2aWNlIHNpemUgKi8KKyNlbmRpZgorCitzdHJ1Y3QgQlVHX2JhZF9pbm9kZV9zaXplIHsKKwljaGFyIEJVR19iYWRfaW5vZGUxX3NpemVbKElOT0RFX1NJWkUxICogTUlOSVgxX0lOT0RFU19QRVJfQkxPQ0sgIT0gQkxPQ0tfU0laRSkgPyAtMSA6IDFdOworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorCWNoYXIgQlVHX2JhZF9pbm9kZTJfc2l6ZVsoSU5PREVfU0laRTIgKiBNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyAhPSBCTE9DS19TSVpFKSA/IC0xIDogMV07CisjZW5kaWYKK307CisKK2VudW0geworI2lmZGVmIFVOVVNFRAorCU1JTklYMV9MSU5LX01BWCA9IDI1MCwKKwlNSU5JWDJfTElOS19NQVggPSA2NTUzMCwKKwlNSU5JWF9JX01BUF9TTE9UUyA9IDgsCisJTUlOSVhfWl9NQVBfU0xPVFMgPSA2NCwKKwlNSU5JWF9WMSA9IDB4MDAwMSwgICAgICAvKiBvcmlnaW5hbCBtaW5peCBmcyAqLworCU1JTklYX1YyID0gMHgwMDAyLCAgICAgIC8qIG1pbml4IFYyIGZzICovCisjZW5kaWYKKwlNSU5JWF9OQU1FX01BWCA9IDI1NSwgICAgICAgICAvKiAjIGNoYXJzIGluIGEgZmlsZSBuYW1lICovCit9OworCisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCitlbnVtIHsgdmVyc2lvbjIgPSAwIH07CisjZW5kaWYKKworZW51bSB7IE1BWF9ERVBUSCA9IDMyIH07CisKK2VudW0geyBkZXZfZmQgPSAzIH07CisKK3N0cnVjdCBnbG9iYWxzIHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKKwlzbWFsbGludCB2ZXJzaW9uMjsKKyNlbmRpZgorCXNtYWxsaW50IGNoYW5nZWQ7ICAvKiBpcyBmaWxlc3lzdGVtIG1vZGlmaWVkPyAqLworCXNtYWxsaW50IGVycm9yc191bmNvcnJlY3RlZDsgIC8qIGZsYWcgaWYgc29tZSBlcnJvciB3YXMgbm90IGNvcnJlY3RlZCAqLworCXNtYWxsaW50IHRlcm1pb3Nfc2V0OworCXNtYWxsaW50IGRpcnNpemU7CisJc21hbGxpbnQgbmFtZWxlbjsKKwljb25zdCBjaGFyICpkZXZpY2VfbmFtZTsKKwlpbnQgZGlyZWN0b3J5LCByZWd1bGFyLCBibG9ja2RldiwgY2hhcmRldiwgbGlua3MsIHN5bWxpbmtzLCB0b3RhbDsKKwljaGFyICppbm9kZV9idWZmZXI7CisKKwljaGFyICppbm9kZV9tYXA7CisJY2hhciAqem9uZV9tYXA7CisKKwl1bnNpZ25lZCBjaGFyICppbm9kZV9jb3VudDsKKwl1bnNpZ25lZCBjaGFyICp6b25lX2NvdW50OworCisJLyogRmlsZS1uYW1lIGRhdGEgKi8KKwlpbnQgbmFtZV9kZXB0aDsKKwljaGFyICpuYW1lX2NvbXBvbmVudFtNQVhfREVQVEgrMV07CisKKwkvKiBCaWdnZXIgc3R1ZmYgKi8KKwlzdHJ1Y3QgdGVybWlvcyBzdl90ZXJtaW9zOworCWNoYXIgc3VwZXJibG9ja19idWZmZXJbQkxPQ0tfU0laRV07CisJY2hhciBhZGRfem9uZV9pbmRfYmxrW0JMT0NLX1NJWkVdOworCWNoYXIgYWRkX3pvbmVfZGluZF9ibGtbQkxPQ0tfU0laRV07CisJSUZfRkVBVFVSRV9NSU5JWDIoY2hhciBhZGRfem9uZV90aW5kX2Jsa1tCTE9DS19TSVpFXTspCisJY2hhciBjaGVja19maWxlX2Jsa1tCTE9DS19TSVpFXTsKKworCS8qIEZpbGUtbmFtZSBkYXRhICovCisJY2hhciBjdXJyZW50X25hbWVbTUFYX0RFUFRIICogTUlOSVhfTkFNRV9NQVhdOworfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorI2RlZmluZSB2ZXJzaW9uMiAgICAgICAgICAgKEcudmVyc2lvbjIgICAgICAgICAgICkKKyNlbmRpZgorI2RlZmluZSBjaGFuZ2VkICAgICAgICAgICAgKEcuY2hhbmdlZCAgICAgICAgICAgICkKKyNkZWZpbmUgZXJyb3JzX3VuY29ycmVjdGVkIChHLmVycm9yc191bmNvcnJlY3RlZCApCisjZGVmaW5lIHRlcm1pb3Nfc2V0ICAgICAgICAoRy50ZXJtaW9zX3NldCAgICAgICAgKQorI2RlZmluZSBkaXJzaXplICAgICAgICAgICAgKEcuZGlyc2l6ZSAgICAgICAgICAgICkKKyNkZWZpbmUgbmFtZWxlbiAgICAgICAgICAgIChHLm5hbWVsZW4gICAgICAgICAgICApCisjZGVmaW5lIGRldmljZV9uYW1lICAgICAgICAoRy5kZXZpY2VfbmFtZSAgICAgICAgKQorI2RlZmluZSBkaXJlY3RvcnkgICAgICAgICAgKEcuZGlyZWN0b3J5ICAgICAgICAgICkKKyNkZWZpbmUgcmVndWxhciAgICAgICAgICAgIChHLnJlZ3VsYXIgICAgICAgICAgICApCisjZGVmaW5lIGJsb2NrZGV2ICAgICAgICAgICAoRy5ibG9ja2RldiAgICAgICAgICAgKQorI2RlZmluZSBjaGFyZGV2ICAgICAgICAgICAgKEcuY2hhcmRldiAgICAgICAgICAgICkKKyNkZWZpbmUgbGlua3MgICAgICAgICAgICAgIChHLmxpbmtzICAgICAgICAgICAgICApCisjZGVmaW5lIHN5bWxpbmtzICAgICAgICAgICAoRy5zeW1saW5rcyAgICAgICAgICAgKQorI2RlZmluZSB0b3RhbCAgICAgICAgICAgICAgKEcudG90YWwgICAgICAgICAgICAgICkKKyNkZWZpbmUgaW5vZGVfYnVmZmVyICAgICAgIChHLmlub2RlX2J1ZmZlciAgICAgICApCisjZGVmaW5lIGlub2RlX21hcCAgICAgICAgICAoRy5pbm9kZV9tYXAgICAgICAgICAgKQorI2RlZmluZSB6b25lX21hcCAgICAgICAgICAgKEcuem9uZV9tYXAgICAgICAgICAgICkKKyNkZWZpbmUgaW5vZGVfY291bnQgICAgICAgIChHLmlub2RlX2NvdW50ICAgICAgICApCisjZGVmaW5lIHpvbmVfY291bnQgICAgICAgICAoRy56b25lX2NvdW50ICAgICAgICAgKQorI2RlZmluZSBuYW1lX2RlcHRoICAgICAgICAgKEcubmFtZV9kZXB0aCAgICAgICAgICkKKyNkZWZpbmUgbmFtZV9jb21wb25lbnQgICAgIChHLm5hbWVfY29tcG9uZW50ICAgICApCisjZGVmaW5lIHN2X3Rlcm1pb3MgICAgICAgICAoRy5zdl90ZXJtaW9zICAgICAgICAgKQorI2RlZmluZSBzdXBlcmJsb2NrX2J1ZmZlciAgKEcuc3VwZXJibG9ja19idWZmZXIgKQorI2RlZmluZSBhZGRfem9uZV9pbmRfYmxrICAgKEcuYWRkX3pvbmVfaW5kX2JsayAgICkKKyNkZWZpbmUgYWRkX3pvbmVfZGluZF9ibGsgIChHLmFkZF96b25lX2RpbmRfYmxrICApCisjZGVmaW5lIGFkZF96b25lX3RpbmRfYmxrICAoRy5hZGRfem9uZV90aW5kX2JsayAgKQorI2RlZmluZSBjaGVja19maWxlX2JsayAgICAgKEcuY2hlY2tfZmlsZV9ibGsgICAgICkKKyNkZWZpbmUgY3VycmVudF9uYW1lICAgICAgIChHLmN1cnJlbnRfbmFtZSAgICAgICApCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCVNFVF9QVFJfVE9fR0xPQkFMUyh4emFsbG9jKHNpemVvZihHKSkpOyBcCisJZGlyc2l6ZSA9IDE2OyBcCisJbmFtZWxlbiA9IDE0OyBcCisJY3VycmVudF9uYW1lWzBdID0gJy8nOyBcCisJLypjdXJyZW50X25hbWVbMV0gPSAnXDAnOyovIFwKKwluYW1lX2NvbXBvbmVudFswXSA9ICZjdXJyZW50X25hbWVbMF07IFwKK30gd2hpbGUgKDApCisKKworI2RlZmluZSBPUFRJT05fU1RSICJsYXJ2c21mIgorZW51bSB7CisJT1BUX2wgPSAoMSA8PCAwKSwKKwlPUFRfYSA9ICgxIDw8IDEpLAorCU9QVF9yID0gKDEgPDwgMiksCisJT1BUX3YgPSAoMSA8PCAzKSwKKwlPUFRfcyA9ICgxIDw8IDQpLAorCU9QVF93ID0gKDEgPDwgNSksCisJT1BUX2YgPSAoMSA8PCA2KSwKK307CisjZGVmaW5lIE9QVF9saXN0ICAgICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfbCkKKyNkZWZpbmUgT1BUX2F1dG9tYXRpYyAob3B0aW9uX21hc2szMiAmIE9QVF9hKQorI2RlZmluZSBPUFRfcmVwYWlyICAgIChvcHRpb25fbWFzazMyICYgT1BUX3IpCisjZGVmaW5lIE9QVF92ZXJib3NlICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfdikKKyNkZWZpbmUgT1BUX3Nob3cgICAgICAob3B0aW9uX21hc2szMiAmIE9QVF9zKQorI2RlZmluZSBPUFRfd2Fybl9tb2RlIChvcHRpb25fbWFzazMyICYgT1BUX3cpCisjZGVmaW5lIE9QVF9mb3JjZSAgICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfZikKKy8qIG5vbi1hdXRvbWF0aWMgcmVwYWlycyByZXF1ZXN0ZWQ/ICovCisjZGVmaW5lIE9QVF9tYW51YWwgICAgKChvcHRpb25fbWFzazMyICYgKE9QVF9hfE9QVF9yKSkgPT0gT1BUX3IpCisKKworI2RlZmluZSBJbm9kZTEgKCgoc3RydWN0IG1pbml4MV9pbm9kZSAqKSBpbm9kZV9idWZmZXIpLTEpCisjZGVmaW5lIElub2RlMiAoKChzdHJ1Y3QgbWluaXgyX2lub2RlICopIGlub2RlX2J1ZmZlciktMSkKKworI2RlZmluZSBTdXBlciAoKihzdHJ1Y3QgbWluaXhfc3VwZXJibG9jayAqKShzdXBlcmJsb2NrX2J1ZmZlcikpCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKKyMgZGVmaW5lIFpPTkVTICAgICgodW5zaWduZWQpKHZlcnNpb24yID8gU3VwZXIuc196b25lcyA6IFN1cGVyLnNfbnpvbmVzKSkKKyNlbHNlCisjIGRlZmluZSBaT05FUyAgICAoKHVuc2lnbmVkKShTdXBlci5zX256b25lcykpCisjZW5kaWYKKyNkZWZpbmUgSU5PREVTICAgICgodW5zaWduZWQpU3VwZXIuc19uaW5vZGVzKQorI2RlZmluZSBJTUFQUyAgICAgKCh1bnNpZ25lZClTdXBlci5zX2ltYXBfYmxvY2tzKQorI2RlZmluZSBaTUFQUyAgICAgKCh1bnNpZ25lZClTdXBlci5zX3ptYXBfYmxvY2tzKQorI2RlZmluZSBGSVJTVFpPTkUgKCh1bnNpZ25lZClTdXBlci5zX2ZpcnN0ZGF0YXpvbmUpCisjZGVmaW5lIFpPTkVTSVpFICAoKHVuc2lnbmVkKVN1cGVyLnNfbG9nX3pvbmVfc2l6ZSkKKyNkZWZpbmUgTUFYU0laRSAgICgodW5zaWduZWQpU3VwZXIuc19tYXhfc2l6ZSkKKyNkZWZpbmUgTUFHSUMgICAgIChTdXBlci5zX21hZ2ljKQorCisvKiBnY2MgbGlrZXMgdGhpcyBtb3JlIChjb2RlIGlzIHNtYWxsZXIpIHRoYW4gbWFjcm8gdmFyaWFudCAqLworc3RhdGljIEFMV0FZU19JTkxJTkUgdW5zaWduZWQgZGl2X3JvdW5kdXAodW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgbikKK3sKKwlyZXR1cm4gKHNpemUgKyBuLTEpIC8gbjsKK30KKworI2lmICFFTkFCTEVfRkVBVFVSRV9NSU5JWDIKKyNkZWZpbmUgSU5PREVfQkxPQ0tTICAgICAgICAgICAgZGl2X3JvdW5kdXAoSU5PREVTLCBNSU5JWDFfSU5PREVTX1BFUl9CTE9DSykKKyNlbHNlCisjZGVmaW5lIElOT0RFX0JMT0NLUyAgICAgICAgICAgIGRpdl9yb3VuZHVwKElOT0RFUywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVyc2lvbjIgPyBNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyA6IE1JTklYMV9JTk9ERVNfUEVSX0JMT0NLKSkKKyNlbmRpZgorCisjZGVmaW5lIElOT0RFX0JVRkZFUl9TSVpFICAgICAgIChJTk9ERV9CTE9DS1MgKiBCTE9DS19TSVpFKQorI2RlZmluZSBOT1JNX0ZJUlNUWk9ORSAgICAgICAgICAoMiArIElNQVBTICsgWk1BUFMgKyBJTk9ERV9CTE9DS1MpCisKKy8qIEJlZm9yZSB5b3UgYXNrICJ3aGVyZSB0aGV5IGNvbWUgZnJvbT8iOiAqLworLyogc2V0Yml0L2NscmJpdCBhcmUgc3VwcGxpZWQgYnkgc3lzL3BhcmFtLmggKi8KKworc3RhdGljIGludCBtaW5peF9iaXQoY29uc3QgY2hhciAqYSwgdW5zaWduZWQgaSkKK3sKKwlyZXR1cm4gKGFbaSA+PiAzXSAmICgxPDwoaSAmIDcpKSk7Cit9CisKK3N0YXRpYyB2b2lkIG1pbml4X3NldGJpdChjaGFyICphLCB1bnNpZ25lZCBpKQoreworCXNldGJpdChhLCBpKTsKKwljaGFuZ2VkID0gMTsKK30KK3N0YXRpYyB2b2lkIG1pbml4X2NscmJpdChjaGFyICphLCB1bnNpZ25lZCBpKQoreworCWNscmJpdChhLCBpKTsKKwljaGFuZ2VkID0gMTsKK30KKworLyogTm90ZTogZG8gbm90IGFzc3VtZSAwLzEsIGl0IGlzIDAvbm9uemVybyAqLworI2RlZmluZSB6b25lX2luX3VzZSh4KSAgKG1pbml4X2JpdCh6b25lX21hcCwoeCktRklSU1RaT05FKzEpKQorI2RlZmluZSBpbm9kZV9pbl91c2UoeCkgKG1pbml4X2JpdChpbm9kZV9tYXAsKHgpKSkKKworI2RlZmluZSBtYXJrX2lub2RlKHgpICAgKG1pbml4X3NldGJpdChpbm9kZV9tYXAsKHgpKSkKKyNkZWZpbmUgdW5tYXJrX2lub2RlKHgpIChtaW5peF9jbHJiaXQoaW5vZGVfbWFwLCh4KSkpCisKKyNkZWZpbmUgbWFya196b25lKHgpICAgIChtaW5peF9zZXRiaXQoem9uZV9tYXAsKHgpLUZJUlNUWk9ORSsxKSkKKyNkZWZpbmUgdW5tYXJrX3pvbmUoeCkgIChtaW5peF9jbHJiaXQoem9uZV9tYXAsKHgpLUZJUlNUWk9ORSsxKSkKKworCitzdGF0aWMgdm9pZCByZWN1cnNpdmVfY2hlY2sodW5zaWduZWQgaW5vKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKK3N0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjazIodW5zaWduZWQgaW5vKTsKKyNlbmRpZgorCitzdGF0aWMgdm9pZCBkaWUoY29uc3QgY2hhciAqc3RyKSBOT1JFVFVSTjsKK3N0YXRpYyB2b2lkIGRpZShjb25zdCBjaGFyICpzdHIpCit7CisJaWYgKHRlcm1pb3Nfc2V0KQorCQl0Y3NldGF0dHJfc3RkaW5fVENTQU5PVygmc3ZfdGVybWlvcyk7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzIiwgc3RyKTsKK30KKworc3RhdGljIHZvaWQgcHVzaF9maWxlbmFtZShjb25zdCBjaGFyICpuYW1lKQoreworCS8vICAvZGlyL2Rpci9kaXIvZmlsZQorCS8vICBeICAgXiAgIF4KKwkvLyBbMF0gWzFdIFsyXSA8LW5hbWVfY29tcG9uZW50W2ldCisJaWYgKG5hbWVfZGVwdGggPCBNQVhfREVQVEgpIHsKKwkJaW50IGxlbjsKKwkJY2hhciAqcCA9IG5hbWVfY29tcG9uZW50W25hbWVfZGVwdGhdOworCQkqcCsrID0gJy8nOworCQlsZW4gPSBzcHJpbnRmKHAsICIlLipzIiwgbmFtZWxlbiwgbmFtZSk7CisJCW5hbWVfY29tcG9uZW50W25hbWVfZGVwdGggKyAxXSA9IHAgKyBsZW47CisJfQorCW5hbWVfZGVwdGgrKzsKK30KKworc3RhdGljIHZvaWQgcG9wX2ZpbGVuYW1lKHZvaWQpCit7CisJbmFtZV9kZXB0aC0tOworCWlmIChuYW1lX2RlcHRoIDwgTUFYX0RFUFRIKSB7CisJCSpuYW1lX2NvbXBvbmVudFtuYW1lX2RlcHRoXSA9ICdcMCc7CisJCWlmICghbmFtZV9kZXB0aCkgeworCQkJY3VycmVudF9uYW1lWzBdID0gJy8nOworCQkJY3VycmVudF9uYW1lWzFdID0gJ1wwJzsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBhc2soY29uc3QgY2hhciAqc3RyaW5nLCBpbnQgZGVmKQoreworCWludCBjOworCisJaWYgKCFPUFRfcmVwYWlyKSB7CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJCXJldHVybiAwOworCX0KKwlpZiAoT1BUX2F1dG9tYXRpYykgeworCQliYl9wdXRjaGFyKCdcbicpOworCQlpZiAoIWRlZikKKwkJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJCXJldHVybiBkZWY7CisJfQorCXByaW50ZihkZWYgPyAiJXMgKHkvbik/ICIgOiAiJXMgKG4veSk/ICIsIHN0cmluZyk7CisJZm9yICg7OykgeworCQlmZmx1c2hfYWxsKCk7CisJCWMgPSBnZXRjaGFyKCk7CisJCWlmIChjID09IEVPRikgeworCQkJaWYgKCFkZWYpCisJCQkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKKwkJCXJldHVybiBkZWY7CisJCX0KKwkJaWYgKGMgPT0gJ1xuJykKKwkJCWJyZWFrOworCQljIHw9IDB4MjA7IC8qIHRvbG93ZXIgKi8KKwkJaWYgKGMgPT0gJ3knKSB7CisJCQlkZWYgPSAxOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGMgPT0gJ24nKSB7CisJCQlkZWYgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKGRlZikKKwkJcHV0cygieSIpOworCWVsc2UgeworCQlwdXRzKCJuIik7CisJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJfQorCXJldHVybiBkZWY7Cit9CisKKy8qCisgKiBNYWtlIGNlcnRhaW4gdGhhdCB3ZSBhcmVuJ3QgY2hlY2tpbmcgYSBmaWxlc3lzdGVtIHRoYXQgaXMgb24gYQorICogbW91bnRlZCBwYXJ0aXRpb24uICBDb2RlIGFkYXB0ZWQgZnJvbSBlMmZzY2ssIENvcHlyaWdodCAoQykgMTk5MywKKyAqIDE5OTQgVGhlb2RvcmUgVHMnby4gIEFsc28gbGljZW5zZWQgdW5kZXIgR1BMLgorICovCitzdGF0aWMgdm9pZCBjaGVja19tb3VudCh2b2lkKQoreworCWlmIChmaW5kX21vdW50X3BvaW50KGRldmljZV9uYW1lLCAwKSkgeworCQlpbnQgY29udDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9NVEFCX1NVUFBPUlQKKwkJLyoKKwkJICogSWYgdGhlIHJvb3QgaXMgbW91bnRlZCByZWFkLW9ubHksIHRoZW4gL2V0Yy9tdGFiIGlzCisJCSAqIHByb2JhYmx5IG5vdCBjb3JyZWN0OyBzbyB3ZSB3b24ndCBpc3N1ZSBhIHdhcm5pbmcgYmFzZWQgb24KKwkJICogaXQuCisJCSAqLworCQlpbnQgZmQgPSBvcGVuKGJiX3BhdGhfbXRhYl9maWxlLCBPX1JEV1IpOworCisJCWlmIChmZCA8IDAgJiYgZXJybm8gPT0gRVJPRlMpCisJCQlyZXR1cm47CisJCWNsb3NlKGZkKTsKKyNlbmRpZgorCQlwcmludGYoIiVzIGlzIG1vdW50ZWQuICIsIGRldmljZV9uYW1lKTsKKwkJY29udCA9IDA7CisJCWlmIChpc2F0dHkoMCkgJiYgaXNhdHR5KDEpKQorCQkJY29udCA9IGFzaygiRG8geW91IHJlYWxseSB3YW50IHRvIGNvbnRpbnVlIiwgMCk7CisJCWlmICghY29udCkgeworCQkJcHV0cygiQ2hlY2sgYWJvcnRlZCIpOworCQkJZXhpdChFWElUX1NVQ0NFU1MpOworCQl9CisJfQorfQorCisvKgorICogY2hlY2tfem9uZV9uciBjaGVja3MgdG8gc2VlIHRoYXQgKm5yIGlzIGEgdmFsaWQgem9uZSBuci4gSWYgaXQKKyAqIGlzbid0LCBpdCB3aWxsIHBvc3NpYmx5IGJlIHJlcGFpcmVkLiBDaGVja196b25lX25yIHNldHMgKmNvcnJlY3RlZAorICogaWYgYW4gZXJyb3Igd2FzIGNvcnJlY3RlZCwgYW5kIHJldHVybnMgdGhlIHpvbmUgKDAgZm9yIG5vIHpvbmUKKyAqIG9yIGEgYmFkIHpvbmUtbnVtYmVyKS4KKyAqLworc3RhdGljIGludCBjaGVja196b25lX25yMih1aW50MzJfdCAqbnIsIHNtYWxsaW50ICpjb3JyZWN0ZWQpCit7CisJY29uc3QgY2hhciAqbXNnOworCWlmICghKm5yKQorCQlyZXR1cm4gMDsKKwlpZiAoKm5yIDwgRklSU1RaT05FKQorCQltc2cgPSAiPCBGSVJTVFpPTkUiOworCWVsc2UgaWYgKCpuciA+PSBaT05FUykKKwkJbXNnID0gIj49IFpPTkVTIjsKKwllbHNlCisJCXJldHVybiAqbnI7CisJcHJpbnRmKCJab25lIG5yICVzIGluIGZpbGUgJyVzJy4gIiwgbXNnLCBjdXJyZW50X25hbWUpOworCWlmIChhc2soIlJlbW92ZSBibG9jayIsIDEpKSB7CisJCSpuciA9IDA7CisJCSpjb3JyZWN0ZWQgPSAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBjaGVja196b25lX25yKHVpbnQxNl90ICpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKK3sKKwl1aW50MzJfdCBucjMyID0gKm5yOworCWludCByID0gY2hlY2tfem9uZV9ucjIoJm5yMzIsIGNvcnJlY3RlZCk7CisJKm5yID0gKHVpbnQxNl90KW5yMzI7CisJcmV0dXJuIHI7Cit9CisKKy8qCisgKiByZWFkLWJsb2NrIHJlYWRzIGJsb2NrIG5yIGludG8gdGhlIGJ1ZmZlciBhdCBhZGRyLgorICovCitzdGF0aWMgdm9pZCByZWFkX2Jsb2NrKHVuc2lnbmVkIG5yLCB2b2lkICphZGRyKQoreworCWlmICghbnIpIHsKKwkJbWVtc2V0KGFkZHIsIDAsIEJMT0NLX1NJWkUpOworCQlyZXR1cm47CisJfQorCXhsc2VlayhkZXZfZmQsIEJMT0NLX1NJWkUgKiBuciwgU0VFS19TRVQpOworCWlmIChCTE9DS19TSVpFICE9IGZ1bGxfcmVhZChkZXZfZmQsIGFkZHIsIEJMT0NLX1NJWkUpKSB7CisJCXByaW50ZigiJXM6IGJhZCBibG9jayAldSBpbiBmaWxlICclcydcbiIsCisJCQkJYmJfbXNnX3JlYWRfZXJyb3IsIG5yLCBjdXJyZW50X25hbWUpOworCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOworCQltZW1zZXQoYWRkciwgMCwgQkxPQ0tfU0laRSk7CisJfQorfQorCisvKgorICogd3JpdGVfYmxvY2sgd3JpdGVzIGJsb2NrIG5yIHRvIGRpc2suCisgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX2Jsb2NrKHVuc2lnbmVkIG5yLCB2b2lkICphZGRyKQoreworCWlmICghbnIpCisJCXJldHVybjsKKwlpZiAobnIgPCBGSVJTVFpPTkUgfHwgbnIgPj0gWk9ORVMpIHsKKwkJcHV0cygiSW50ZXJuYWwgZXJyb3I6IHRyeWluZyB0byB3cml0ZSBiYWQgYmxvY2tcbiIKKwkJCSJXcml0ZSByZXF1ZXN0IGlnbm9yZWQiKTsKKwkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKKwkJcmV0dXJuOworCX0KKwl4bHNlZWsoZGV2X2ZkLCBCTE9DS19TSVpFICogbnIsIFNFRUtfU0VUKTsKKwlpZiAoQkxPQ0tfU0laRSAhPSBmdWxsX3dyaXRlKGRldl9mZCwgYWRkciwgQkxPQ0tfU0laRSkpIHsKKwkJcHJpbnRmKCIlczogYmFkIGJsb2NrICV1IGluIGZpbGUgJyVzJ1xuIiwKKwkJCQliYl9tc2dfd3JpdGVfZXJyb3IsIG5yLCBjdXJyZW50X25hbWUpOworCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOworCX0KK30KKworLyoKKyAqIG1hcF9ibG9jayBjYWxjdWxhdGVzIHRoZSBhYnNvbHV0ZSBibG9jayBuciBvZiBhIGJsb2NrIGluIGEgZmlsZS4KKyAqIEl0IHNldHMgJ2NoYW5nZWQnIGlmIHRoZSBpbm9kZSBoYXMgbmVlZGVkIGNoYW5naW5nLCBhbmQgcmUtd3JpdGVzCisgKiBhbnkgaW5kaXJlY3QgYmxvY2tzIHdpdGggZXJyb3JzLgorICovCitzdGF0aWMgaW50IG1hcF9ibG9jayhzdHJ1Y3QgbWluaXgxX2lub2RlICppbm9kZSwgdW5zaWduZWQgYmxrbnIpCit7CisJdWludDE2X3QgaW5kW0JMT0NLX1NJWkUgPj4gMV07CisJaW50IGJsb2NrLCByZXN1bHQ7CisJc21hbGxpbnQgYmxrX2NoZzsKKworCWlmIChibGtuciA8IDcpCisJCXJldHVybiBjaGVja196b25lX25yKGlub2RlLT5pX3pvbmUgKyBibGtuciwgJmNoYW5nZWQpOworCWJsa25yIC09IDc7CisJaWYgKGJsa25yIDwgNTEyKSB7CisJCWJsb2NrID0gY2hlY2tfem9uZV9ucihpbm9kZS0+aV96b25lICsgNywgJmNoYW5nZWQpOworCQlnb3RvIGNvbW1vbjsKKwl9CisJYmxrbnIgLT0gNTEyOworCWJsb2NrID0gY2hlY2tfem9uZV9ucihpbm9kZS0+aV96b25lICsgOCwgJmNoYW5nZWQpOworCXJlYWRfYmxvY2soYmxvY2ssIGluZCk7IC8qIGRvdWJsZSBpbmRpcmVjdCAqLworCWJsa19jaGcgPSAwOworCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIoJmluZFtibGtuciAvIDUxMl0sICZibGtfY2hnKTsKKwlpZiAoYmxrX2NoZykKKwkJd3JpdGVfYmxvY2soYmxvY2ssIGluZCk7CisJYmxvY2sgPSByZXN1bHQ7CisgY29tbW9uOgorCXJlYWRfYmxvY2soYmxvY2ssIGluZCk7CisJYmxrX2NoZyA9IDA7CisJcmVzdWx0ID0gY2hlY2tfem9uZV9ucigmaW5kW2Jsa25yICUgNTEyXSwgJmJsa19jaGcpOworCWlmIChibGtfY2hnKQorCQl3cml0ZV9ibG9jayhibG9jaywgaW5kKTsKKwlyZXR1cm4gcmVzdWx0OworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCitzdGF0aWMgaW50IG1hcF9ibG9jazIoc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGUsIHVuc2lnbmVkIGJsa25yKQoreworCXVpbnQzMl90IGluZFtCTE9DS19TSVpFID4+IDJdOworCWludCBibG9jaywgcmVzdWx0OworCXNtYWxsaW50IGJsa19jaGc7CisKKwlpZiAoYmxrbnIgPCA3KQorCQlyZXR1cm4gY2hlY2tfem9uZV9ucjIoaW5vZGUtPmlfem9uZSArIGJsa25yLCAmY2hhbmdlZCk7CisJYmxrbnIgLT0gNzsKKwlpZiAoYmxrbnIgPCAyNTYpIHsKKwkJYmxvY2sgPSBjaGVja196b25lX25yMihpbm9kZS0+aV96b25lICsgNywgJmNoYW5nZWQpOworCQlnb3RvIGNvbW1vbjI7CisJfQorCWJsa25yIC09IDI1NjsKKwlpZiAoYmxrbnIgPCAyNTYgKiAyNTYpIHsKKwkJYmxvY2sgPSBjaGVja196b25lX25yMihpbm9kZS0+aV96b25lICsgOCwgJmNoYW5nZWQpOworCQlnb3RvIGNvbW1vbjE7CisJfQorCWJsa25yIC09IDI1NiAqIDI1NjsKKwlibG9jayA9IGNoZWNrX3pvbmVfbnIyKGlub2RlLT5pX3pvbmUgKyA5LCAmY2hhbmdlZCk7CisJcmVhZF9ibG9jayhibG9jaywgaW5kKTsgLyogdHJpcGxlIGluZGlyZWN0ICovCisJYmxrX2NoZyA9IDA7CisJcmVzdWx0ID0gY2hlY2tfem9uZV9ucjIoJmluZFtibGtuciAvICgyNTYgKiAyNTYpXSwgJmJsa19jaGcpOworCWlmIChibGtfY2hnKQorCQl3cml0ZV9ibG9jayhibG9jaywgaW5kKTsKKwlibG9jayA9IHJlc3VsdDsKKyBjb21tb24xOgorCXJlYWRfYmxvY2soYmxvY2ssIGluZCk7IC8qIGRvdWJsZSBpbmRpcmVjdCAqLworCWJsa19jaGcgPSAwOworCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKCZpbmRbKGJsa25yIC8gMjU2KSAlIDI1Nl0sICZibGtfY2hnKTsKKwlpZiAoYmxrX2NoZykKKwkJd3JpdGVfYmxvY2soYmxvY2ssIGluZCk7CisJYmxvY2sgPSByZXN1bHQ7CisgY29tbW9uMjoKKwlyZWFkX2Jsb2NrKGJsb2NrLCBpbmQpOworCWJsa19jaGcgPSAwOworCXJlc3VsdCA9IGNoZWNrX3pvbmVfbnIyKCZpbmRbYmxrbnIgJSAyNTZdLCAmYmxrX2NoZyk7CisJaWYgKGJsa19jaGcpCisJCXdyaXRlX2Jsb2NrKGJsb2NrLCBpbmQpOworCXJldHVybiByZXN1bHQ7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgd3JpdGVfc3VwZXJibG9jayh2b2lkKQoreworCS8qCisJICogU2V0IHRoZSBzdGF0ZSBvZiB0aGUgZmlsZXN5c3RlbSBiYXNlZCBvbiB3aGV0aGVyIG9yIG5vdCB0aGVyZQorCSAqIGFyZSB1bmNvcnJlY3RlZCBlcnJvcnMuICBUaGUgZmlsZXN5c3RlbSB2YWxpZCBmbGFnIGlzCisJICogdW5jb25kaXRpb25hbGx5IHNldCBpZiB3ZSBnZXQgdGhpcyBmYXIuCisJICovCisJU3VwZXIuc19zdGF0ZSB8PSBNSU5JWF9WQUxJRF9GUyB8IE1JTklYX0VSUk9SX0ZTOworCWlmICghZXJyb3JzX3VuY29ycmVjdGVkKQorCQlTdXBlci5zX3N0YXRlICY9IH5NSU5JWF9FUlJPUl9GUzsKKworCXhsc2VlayhkZXZfZmQsIEJMT0NLX1NJWkUsIFNFRUtfU0VUKTsKKwlpZiAoQkxPQ0tfU0laRSAhPSBmdWxsX3dyaXRlKGRldl9mZCwgc3VwZXJibG9ja19idWZmZXIsIEJMT0NLX1NJWkUpKQorCQlkaWUoImNhbid0IHdyaXRlIHN1cGVyYmxvY2siKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfdGFibGVzKHZvaWQpCit7CisJd3JpdGVfc3VwZXJibG9jaygpOworCisJaWYgKElNQVBTICogQkxPQ0tfU0laRSAhPSB3cml0ZShkZXZfZmQsIGlub2RlX21hcCwgSU1BUFMgKiBCTE9DS19TSVpFKSkKKwkJZGllKCJjYW4ndCB3cml0ZSBpbm9kZSBtYXAiKTsKKwlpZiAoWk1BUFMgKiBCTE9DS19TSVpFICE9IHdyaXRlKGRldl9mZCwgem9uZV9tYXAsIFpNQVBTICogQkxPQ0tfU0laRSkpCisJCWRpZSgiY2FuJ3Qgd3JpdGUgem9uZSBtYXAiKTsKKwlpZiAoSU5PREVfQlVGRkVSX1NJWkUgIT0gd3JpdGUoZGV2X2ZkLCBpbm9kZV9idWZmZXIsIElOT0RFX0JVRkZFUl9TSVpFKSkKKwkJZGllKCJjYW4ndCB3cml0ZSBpbm9kZXMiKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X2RpcnNpemUodm9pZCkKK3sKKwlpbnQgYmxvY2s7CisJY2hhciBibGtbQkxPQ0tfU0laRV07CisJaW50IHNpemU7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKKwlpZiAodmVyc2lvbjIpCisJCWJsb2NrID0gSW5vZGUyW01JTklYX1JPT1RfSU5PXS5pX3pvbmVbMF07CisJZWxzZQorI2VuZGlmCisJCWJsb2NrID0gSW5vZGUxW01JTklYX1JPT1RfSU5PXS5pX3pvbmVbMF07CisJcmVhZF9ibG9jayhibG9jaywgYmxrKTsKKwlmb3IgKHNpemUgPSAxNjsgc2l6ZSA8IEJMT0NLX1NJWkU7IHNpemUgPDw9IDEpIHsKKwkJaWYgKHN0cmNtcChibGsgKyBzaXplICsgMiwgIi4uIikgPT0gMCkgeworCQkJZGlyc2l6ZSA9IHNpemU7CisJCQluYW1lbGVuID0gc2l6ZSAtIDI7CisJCQlyZXR1cm47CisJCX0KKwl9CisJLyogdXNlIGRlZmF1bHRzICovCit9CisKK3N0YXRpYyB2b2lkIHJlYWRfc3VwZXJibG9jayh2b2lkKQoreworCXhsc2VlayhkZXZfZmQsIEJMT0NLX1NJWkUsIFNFRUtfU0VUKTsKKwlpZiAoQkxPQ0tfU0laRSAhPSBmdWxsX3JlYWQoZGV2X2ZkLCBzdXBlcmJsb2NrX2J1ZmZlciwgQkxPQ0tfU0laRSkpCisJCWRpZSgiY2FuJ3QgcmVhZCBzdXBlcmJsb2NrIik7CisJLyogYWxyZWFkeSBpbml0aWFsaXplZCB0bzoKKwluYW1lbGVuID0gMTQ7CisJZGlyc2l6ZSA9IDE2OworCXZlcnNpb24yID0gMDsKKwkqLworCWlmIChNQUdJQyA9PSBNSU5JWDFfU1VQRVJfTUFHSUMpIHsKKwl9IGVsc2UgaWYgKE1BR0lDID09IE1JTklYMV9TVVBFUl9NQUdJQzIpIHsKKwkJbmFtZWxlbiA9IDMwOworCQlkaXJzaXplID0gMzI7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCisJfSBlbHNlIGlmIChNQUdJQyA9PSBNSU5JWDJfU1VQRVJfTUFHSUMpIHsKKwkJdmVyc2lvbjIgPSAxOworCX0gZWxzZSBpZiAoTUFHSUMgPT0gTUlOSVgyX1NVUEVSX01BR0lDMikgeworCQluYW1lbGVuID0gMzA7CisJCWRpcnNpemUgPSAzMjsKKwkJdmVyc2lvbjIgPSAxOworI2VuZGlmCisJfSBlbHNlCisJCWRpZSgiYmFkIG1hZ2ljIG51bWJlciBpbiBzdXBlcmJsb2NrIik7CisJaWYgKFpPTkVTSVpFICE9IDAgfHwgQkxPQ0tfU0laRSAhPSAxMDI0KQorCQlkaWUoIm9ubHkgMWsgYmxvY2tzL3pvbmVzIHN1cHBvcnRlZCIpOworCWlmIChJTUFQUyAqIEJMT0NLX1NJWkUgKiA4IDwgSU5PREVTICsgMSkKKwkJZGllKCJiYWQgc19pbWFwX2Jsb2NrcyBmaWVsZCBpbiBzdXBlcmJsb2NrIik7CisJaWYgKFpNQVBTICogQkxPQ0tfU0laRSAqIDggPCBaT05FUyAtIEZJUlNUWk9ORSArIDEpCisJCWRpZSgiYmFkIHNfem1hcF9ibG9ja3MgZmllbGQgaW4gc3VwZXJibG9jayIpOworfQorCitzdGF0aWMgdm9pZCByZWFkX3RhYmxlcyh2b2lkKQoreworCWlub2RlX21hcCA9IHh6YWxsb2MoSU1BUFMgKiBCTE9DS19TSVpFKTsKKwl6b25lX21hcCA9IHh6YWxsb2MoWk1BUFMgKiBCTE9DS19TSVpFKTsKKwlpbm9kZV9idWZmZXIgPSB4bWFsbG9jKElOT0RFX0JVRkZFUl9TSVpFKTsKKwlpbm9kZV9jb3VudCA9IHhtYWxsb2MoSU5PREVTICsgMSk7CisJem9uZV9jb3VudCA9IHhtYWxsb2MoWk9ORVMpOworCWlmIChJTUFQUyAqIEJMT0NLX1NJWkUgIT0gcmVhZChkZXZfZmQsIGlub2RlX21hcCwgSU1BUFMgKiBCTE9DS19TSVpFKSkKKwkJZGllKCJjYW4ndCByZWFkIGlub2RlIG1hcCIpOworCWlmIChaTUFQUyAqIEJMT0NLX1NJWkUgIT0gcmVhZChkZXZfZmQsIHpvbmVfbWFwLCBaTUFQUyAqIEJMT0NLX1NJWkUpKQorCQlkaWUoImNhbid0IHJlYWQgem9uZSBtYXAiKTsKKwlpZiAoSU5PREVfQlVGRkVSX1NJWkUgIT0gcmVhZChkZXZfZmQsIGlub2RlX2J1ZmZlciwgSU5PREVfQlVGRkVSX1NJWkUpKQorCQlkaWUoImNhbid0IHJlYWQgaW5vZGVzIik7CisJaWYgKE5PUk1fRklSU1RaT05FICE9IEZJUlNUWk9ORSkgeworCQlwdXRzKCJ3YXJuaW5nOiBmaXJzdHpvbmUhPW5vcm1fZmlyc3R6b25lIik7CisJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJfQorCWdldF9kaXJzaXplKCk7CisJaWYgKE9QVF9zaG93KSB7CisJCXByaW50ZigiJXUgaW5vZGVzXG4iCisJCQkiJXUgYmxvY2tzXG4iCisJCQkiRmlyc3RkYXRhem9uZT0ldSAoJXUpXG4iCisJCQkiWm9uZXNpemU9JXVcbiIKKwkJCSJNYXhzaXplPSV1XG4iCisJCQkiRmlsZXN5c3RlbSBzdGF0ZT0ldVxuIgorCQkJIm5hbWVsZW49JXVcblxuIiwKKwkJCUlOT0RFUywKKwkJCVpPTkVTLAorCQkJRklSU1RaT05FLCBOT1JNX0ZJUlNUWk9ORSwKKwkJCUJMT0NLX1NJWkUgPDwgWk9ORVNJWkUsCisJCQlNQVhTSVpFLAorCQkJU3VwZXIuc19zdGF0ZSwKKwkJCW5hbWVsZW4pOworCX0KK30KKworc3RhdGljIHZvaWQgZ2V0X2lub2RlX2NvbW1vbih1bnNpZ25lZCBuciwgdWludDE2X3QgaV9tb2RlKQoreworCXRvdGFsKys7CisJaWYgKCFpbm9kZV9jb3VudFtucl0pIHsKKwkJaWYgKCFpbm9kZV9pbl91c2UobnIpKSB7CisJCQlwcmludGYoIklub2RlICV1IGlzIG1hcmtlZCBhcyAndW51c2VkJywgYnV0IGl0IGlzIHVzZWQgIgorCQkJCQkiZm9yIGZpbGUgJyVzJ1xuIiwgbnIsIGN1cnJlbnRfbmFtZSk7CisJCQlpZiAoT1BUX3JlcGFpcikgeworCQkJCWlmIChhc2soIk1hcmsgYXMgJ2luIHVzZSciLCAxKSkKKwkJCQkJbWFya19pbm9kZShucik7CisJCQkJZWxzZQorCQkJCQllcnJvcnNfdW5jb3JyZWN0ZWQgPSAxOworCQkJfQorCQl9CisJCWlmIChTX0lTRElSKGlfbW9kZSkpCisJCQlkaXJlY3RvcnkrKzsKKwkJZWxzZSBpZiAoU19JU1JFRyhpX21vZGUpKQorCQkJcmVndWxhcisrOworCQllbHNlIGlmIChTX0lTQ0hSKGlfbW9kZSkpCisJCQljaGFyZGV2Kys7CisJCWVsc2UgaWYgKFNfSVNCTEsoaV9tb2RlKSkKKwkJCWJsb2NrZGV2Kys7CisJCWVsc2UgaWYgKFNfSVNMTksoaV9tb2RlKSkKKwkJCXN5bWxpbmtzKys7CisJCWVsc2UgaWYgKFNfSVNTT0NLKGlfbW9kZSkpOworCQllbHNlIGlmIChTX0lTRklGTyhpX21vZGUpKTsKKwkJZWxzZSB7CisJCQlwcmludGYoIiVzIGhhcyBtb2RlICUwNW9cbiIsIGN1cnJlbnRfbmFtZSwgaV9tb2RlKTsKKwkJfQorCX0gZWxzZQorCQlsaW5rcysrOworCWlmICghKytpbm9kZV9jb3VudFtucl0pIHsKKwkJcHV0cygiV2FybmluZzogaW5vZGUgY291bnQgdG9vIGJpZyIpOworCQlpbm9kZV9jb3VudFtucl0tLTsKKwkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKKwl9Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWluaXgxX2lub2RlICpnZXRfaW5vZGUodW5zaWduZWQgbnIpCit7CisJc3RydWN0IG1pbml4MV9pbm9kZSAqaW5vZGU7CisKKwlpZiAoIW5yIHx8IG5yID4gSU5PREVTKQorCQlyZXR1cm4gTlVMTDsKKwlpbm9kZSA9IElub2RlMSArIG5yOworCWdldF9pbm9kZV9jb21tb24obnIsIGlub2RlLT5pX21vZGUpOworCXJldHVybiBpbm9kZTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorc3RhdGljIHN0cnVjdCBtaW5peDJfaW5vZGUgKmdldF9pbm9kZTIodW5zaWduZWQgbnIpCit7CisJc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGU7CisKKwlpZiAoIW5yIHx8IG5yID4gSU5PREVTKQorCQlyZXR1cm4gTlVMTDsKKwlpbm9kZSA9IElub2RlMiArIG5yOworCWdldF9pbm9kZV9jb21tb24obnIsIGlub2RlLT5pX21vZGUpOworCXJldHVybiBpbm9kZTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBjaGVja19yb290KHZvaWQpCit7CisJc3RydWN0IG1pbml4MV9pbm9kZSAqaW5vZGUgPSBJbm9kZTEgKyBNSU5JWF9ST09UX0lOTzsKKworCWlmICghaW5vZGUgfHwgIVNfSVNESVIoaW5vZGUtPmlfbW9kZSkpCisJCWRpZSgicm9vdCBpbm9kZSBpc24ndCBhIGRpcmVjdG9yeSIpOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCitzdGF0aWMgdm9pZCBjaGVja19yb290Mih2b2lkKQoreworCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlID0gSW5vZGUyICsgTUlOSVhfUk9PVF9JTk87CisKKwlpZiAoIWlub2RlIHx8ICFTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlkaWUoInJvb3QgaW5vZGUgaXNuJ3QgYSBkaXJlY3RvcnkiKTsKK30KKyNlbHNlCit2b2lkIGNoZWNrX3Jvb3QyKHZvaWQpOworI2VuZGlmCisKK3N0YXRpYyBpbnQgYWRkX3pvbmVfY29tbW9uKGludCBibG9jaywgc21hbGxpbnQgKmNvcnJlY3RlZCkKK3sKKwlpZiAoIWJsb2NrKQorCQlyZXR1cm4gMDsKKwlpZiAoem9uZV9jb3VudFtibG9ja10pIHsKKwkJcHJpbnRmKCJBbHJlYWR5IHVzZWQgYmxvY2sgaXMgcmV1c2VkIGluIGZpbGUgJyVzJy4gIiwKKwkJCQljdXJyZW50X25hbWUpOworCQlpZiAoYXNrKCJDbGVhciIsIDEpKSB7CisJCQlibG9jayA9IDA7CisJCQkqY29ycmVjdGVkID0gMTsKKwkJCXJldHVybiAtMTsgLyogInBsZWFzZSB6ZXJvIG91dCAqem5yIiAqLworCQl9CisJfQorCWlmICghem9uZV9pbl91c2UoYmxvY2spKSB7CisJCXByaW50ZigiQmxvY2sgJWQgaW4gZmlsZSAnJXMnIGlzIG1hcmtlZCBhcyAndW51c2VkJy4gIiwKKwkJCQlibG9jaywgY3VycmVudF9uYW1lKTsKKwkJaWYgKGFzaygiQ29ycmVjdCIsIDEpKQorCQkJbWFya196b25lKGJsb2NrKTsKKwl9CisJaWYgKCErK3pvbmVfY291bnRbYmxvY2tdKQorCQl6b25lX2NvdW50W2Jsb2NrXS0tOworCXJldHVybiBibG9jazsKK30KKworc3RhdGljIGludCBhZGRfem9uZSh1aW50MTZfdCAqem5yLCBzbWFsbGludCAqY29ycmVjdGVkKQoreworCWludCBibG9jazsKKworCWJsb2NrID0gY2hlY2tfem9uZV9ucih6bnIsIGNvcnJlY3RlZCk7CisJYmxvY2sgPSBhZGRfem9uZV9jb21tb24oYmxvY2ssIGNvcnJlY3RlZCk7CisJaWYgKGJsb2NrID09IC0xKSB7CisJCSp6bnIgPSAwOworCQlibG9jayA9IDA7CisJfQorCXJldHVybiBibG9jazsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorc3RhdGljIGludCBhZGRfem9uZTIodWludDMyX3QgKnpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKK3sKKwlpbnQgYmxvY2s7CisKKwlibG9jayA9IGNoZWNrX3pvbmVfbnIyKHpuciwgY29ycmVjdGVkKTsKKwlibG9jayA9IGFkZF96b25lX2NvbW1vbihibG9jaywgY29ycmVjdGVkKTsKKwlpZiAoYmxvY2sgPT0gLTEpIHsKKwkJKnpuciA9IDA7CisJCWJsb2NrID0gMDsKKwl9CisJcmV0dXJuIGJsb2NrOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGFkZF96b25lX2luZCh1aW50MTZfdCAqem5yLCBzbWFsbGludCAqY29ycmVjdGVkKQoreworCWludCBpOworCWludCBibG9jazsKKwlzbWFsbGludCBjaGdfYmxrID0gMDsKKworCWJsb2NrID0gYWRkX3pvbmUoem5yLCBjb3JyZWN0ZWQpOworCWlmICghYmxvY2spCisJCXJldHVybjsKKwlyZWFkX2Jsb2NrKGJsb2NrLCBhZGRfem9uZV9pbmRfYmxrKTsKKwlmb3IgKGkgPSAwOyBpIDwgKEJMT0NLX1NJWkUgPj4gMSk7IGkrKykKKwkJYWRkX3pvbmUoaSArICh1aW50MTZfdCAqKSBhZGRfem9uZV9pbmRfYmxrLCAmY2hnX2Jsayk7CisJaWYgKGNoZ19ibGspCisJCXdyaXRlX2Jsb2NrKGJsb2NrLCBhZGRfem9uZV9pbmRfYmxrKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorc3RhdGljIHZvaWQgYWRkX3pvbmVfaW5kMih1aW50MzJfdCAqem5yLCBzbWFsbGludCAqY29ycmVjdGVkKQoreworCWludCBpOworCWludCBibG9jazsKKwlzbWFsbGludCBjaGdfYmxrID0gMDsKKworCWJsb2NrID0gYWRkX3pvbmUyKHpuciwgY29ycmVjdGVkKTsKKwlpZiAoIWJsb2NrKQorCQlyZXR1cm47CisJcmVhZF9ibG9jayhibG9jaywgYWRkX3pvbmVfaW5kX2Jsayk7CisJZm9yIChpID0gMDsgaSA8IEJMT0NLX1NJWkUgPj4gMjsgaSsrKQorCQlhZGRfem9uZTIoaSArICh1aW50MzJfdCAqKSBhZGRfem9uZV9pbmRfYmxrLCAmY2hnX2Jsayk7CisJaWYgKGNoZ19ibGspCisJCXdyaXRlX2Jsb2NrKGJsb2NrLCBhZGRfem9uZV9pbmRfYmxrKTsKK30KKyNlbmRpZgorCitzdGF0aWMgdm9pZCBhZGRfem9uZV9kaW5kKHVpbnQxNl90ICp6bnIsIHNtYWxsaW50ICpjb3JyZWN0ZWQpCit7CisJaW50IGk7CisJaW50IGJsb2NrOworCXNtYWxsaW50IGNoZ19ibGsgPSAwOworCisJYmxvY2sgPSBhZGRfem9uZSh6bnIsIGNvcnJlY3RlZCk7CisJaWYgKCFibG9jaykKKwkJcmV0dXJuOworCXJlYWRfYmxvY2soYmxvY2ssIGFkZF96b25lX2RpbmRfYmxrKTsKKwlmb3IgKGkgPSAwOyBpIDwgKEJMT0NLX1NJWkUgPj4gMSk7IGkrKykKKwkJYWRkX3pvbmVfaW5kKGkgKyAodWludDE2X3QgKikgYWRkX3pvbmVfZGluZF9ibGssICZjaGdfYmxrKTsKKwlpZiAoY2hnX2JsaykKKwkJd3JpdGVfYmxvY2soYmxvY2ssIGFkZF96b25lX2RpbmRfYmxrKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorc3RhdGljIHZvaWQgYWRkX3pvbmVfZGluZDIodWludDMyX3QgKnpuciwgc21hbGxpbnQgKmNvcnJlY3RlZCkKK3sKKwlpbnQgaTsKKwlpbnQgYmxvY2s7CisJc21hbGxpbnQgY2hnX2JsayA9IDA7CisKKwlibG9jayA9IGFkZF96b25lMih6bnIsIGNvcnJlY3RlZCk7CisJaWYgKCFibG9jaykKKwkJcmV0dXJuOworCXJlYWRfYmxvY2soYmxvY2ssIGFkZF96b25lX2RpbmRfYmxrKTsKKwlmb3IgKGkgPSAwOyBpIDwgQkxPQ0tfU0laRSA+PiAyOyBpKyspCisJCWFkZF96b25lX2luZDIoaSArICh1aW50MzJfdCAqKSBhZGRfem9uZV9kaW5kX2JsaywgJmNoZ19ibGspOworCWlmIChjaGdfYmxrKQorCQl3cml0ZV9ibG9jayhibG9jaywgYWRkX3pvbmVfZGluZF9ibGspOworfQorCitzdGF0aWMgdm9pZCBhZGRfem9uZV90aW5kMih1aW50MzJfdCAqem5yLCBzbWFsbGludCAqY29ycmVjdGVkKQoreworCWludCBpOworCWludCBibG9jazsKKwlzbWFsbGludCBjaGdfYmxrID0gMDsKKworCWJsb2NrID0gYWRkX3pvbmUyKHpuciwgY29ycmVjdGVkKTsKKwlpZiAoIWJsb2NrKQorCQlyZXR1cm47CisJcmVhZF9ibG9jayhibG9jaywgYWRkX3pvbmVfdGluZF9ibGspOworCWZvciAoaSA9IDA7IGkgPCBCTE9DS19TSVpFID4+IDI7IGkrKykKKwkJYWRkX3pvbmVfZGluZDIoaSArICh1aW50MzJfdCAqKSBhZGRfem9uZV90aW5kX2JsaywgJmNoZ19ibGspOworCWlmIChjaGdfYmxrKQorCQl3cml0ZV9ibG9jayhibG9jaywgYWRkX3pvbmVfdGluZF9ibGspOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIGNoZWNrX3pvbmVzKHVuc2lnbmVkIGkpCit7CisJc3RydWN0IG1pbml4MV9pbm9kZSAqaW5vZGU7CisKKwlpZiAoIWkgfHwgaSA+IElOT0RFUykKKwkJcmV0dXJuOworCWlmIChpbm9kZV9jb3VudFtpXSA+IDEpCQkvKiBoYXZlIHdlIGNvdW50ZWQgdGhpcyBmaWxlIGFscmVhZHk/ICovCisJCXJldHVybjsKKwlpbm9kZSA9IElub2RlMSArIGk7CisJaWYgKCFTX0lTRElSKGlub2RlLT5pX21vZGUpCisJICYmICFTX0lTUkVHKGlub2RlLT5pX21vZGUpCisJICYmICFTX0lTTE5LKGlub2RlLT5pX21vZGUpCisJKSB7CisJCXJldHVybjsKKwl9CisJZm9yIChpID0gMDsgaSA8IDc7IGkrKykKKwkJYWRkX3pvbmUoaSArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKKwlhZGRfem9uZV9pbmQoNyArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKKwlhZGRfem9uZV9kaW5kKDggKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKK3N0YXRpYyB2b2lkIGNoZWNrX3pvbmVzMih1bnNpZ25lZCBpKQoreworCXN0cnVjdCBtaW5peDJfaW5vZGUgKmlub2RlOworCisJaWYgKCFpIHx8IGkgPiBJTk9ERVMpCisJCXJldHVybjsKKwlpZiAoaW5vZGVfY291bnRbaV0gPiAxKQkJLyogaGF2ZSB3ZSBjb3VudGVkIHRoaXMgZmlsZSBhbHJlYWR5PyAqLworCQlyZXR1cm47CisJaW5vZGUgPSBJbm9kZTIgKyBpOworCWlmICghU19JU0RJUihpbm9kZS0+aV9tb2RlKSAmJiAhU19JU1JFRyhpbm9kZS0+aV9tb2RlKQorCQkmJiAhU19JU0xOSyhpbm9kZS0+aV9tb2RlKSkKKwkJcmV0dXJuOworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspCisJCWFkZF96b25lMihpICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOworCWFkZF96b25lX2luZDIoNyArIGlub2RlLT5pX3pvbmUsICZjaGFuZ2VkKTsKKwlhZGRfem9uZV9kaW5kMig4ICsgaW5vZGUtPmlfem9uZSwgJmNoYW5nZWQpOworCWFkZF96b25lX3RpbmQyKDkgKyBpbm9kZS0+aV96b25lLCAmY2hhbmdlZCk7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgY2hlY2tfZmlsZShzdHJ1Y3QgbWluaXgxX2lub2RlICpkaXIsIHVuc2lnbmVkIG9mZnNldCkKK3sKKwlzdHJ1Y3QgbWluaXgxX2lub2RlICppbm9kZTsKKwlpbnQgaW5vOworCWNoYXIgKm5hbWU7CisJaW50IGJsb2NrOworCisJYmxvY2sgPSBtYXBfYmxvY2soZGlyLCBvZmZzZXQgLyBCTE9DS19TSVpFKTsKKwlyZWFkX2Jsb2NrKGJsb2NrLCBjaGVja19maWxlX2Jsayk7CisJbmFtZSA9IGNoZWNrX2ZpbGVfYmxrICsgKG9mZnNldCAlIEJMT0NLX1NJWkUpICsgMjsKKwlpbm8gPSAqKHVpbnQxNl90ICopIChuYW1lIC0gMik7CisJaWYgKGlubyA+IElOT0RFUykgeworCQlwcmludGYoIiVzIGNvbnRhaW5zIGEgYmFkIGlub2RlIG51bWJlciBmb3IgZmlsZSAnJS4qcycuICIsCisJCQkJY3VycmVudF9uYW1lLCBuYW1lbGVuLCBuYW1lKTsKKwkJaWYgKGFzaygiUmVtb3ZlIiwgMSkpIHsKKwkJCSoodWludDE2X3QgKikgKG5hbWUgLSAyKSA9IDA7CisJCQl3cml0ZV9ibG9jayhibG9jaywgY2hlY2tfZmlsZV9ibGspOworCQl9CisJCWlubyA9IDA7CisJfQorCXB1c2hfZmlsZW5hbWUobmFtZSk7CisJaW5vZGUgPSBnZXRfaW5vZGUoaW5vKTsKKwlwb3BfZmlsZW5hbWUoKTsKKwlpZiAoIW9mZnNldCkgeworCQlpZiAoaW5vZGUgJiYgTE9ORV9DSEFSKG5hbWUsICcuJykpCisJCQlyZXR1cm47CisJCXByaW50ZigiJXM6IGJhZCBkaXJlY3Rvcnk6ICcuJyBpc24ndCBmaXJzdFxuIiwgY3VycmVudF9uYW1lKTsKKwkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKKwl9CisJaWYgKG9mZnNldCA9PSBkaXJzaXplKSB7CisJCWlmIChpbm9kZSAmJiBzdHJjbXAoIi4uIiwgbmFtZSkgPT0gMCkKKwkJCXJldHVybjsKKwkJcHJpbnRmKCIlczogYmFkIGRpcmVjdG9yeTogJy4uJyBpc24ndCBzZWNvbmRcbiIsIGN1cnJlbnRfbmFtZSk7CisJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJfQorCWlmICghaW5vZGUpCisJCXJldHVybjsKKwlwdXNoX2ZpbGVuYW1lKG5hbWUpOworCWlmIChPUFRfbGlzdCkgeworCQlpZiAoT1BUX3ZlcmJvc2UpCisJCQlwcmludGYoIiU2ZCAlMDdvICUzZCAiLCBpbm8sIGlub2RlLT5pX21vZGUsIGlub2RlLT5pX25saW5rcyk7CisJCXByaW50ZigiJXMlc1xuIiwgY3VycmVudF9uYW1lLCBTX0lTRElSKGlub2RlLT5pX21vZGUpID8gIjoiIDogIiIpOworCX0KKwljaGVja196b25lcyhpbm8pOworCWlmIChpbm9kZSAmJiBTX0lTRElSKGlub2RlLT5pX21vZGUpKQorCQlyZWN1cnNpdmVfY2hlY2soaW5vKTsKKwlwb3BfZmlsZW5hbWUoKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorc3RhdGljIHZvaWQgY2hlY2tfZmlsZTIoc3RydWN0IG1pbml4Ml9pbm9kZSAqZGlyLCB1bnNpZ25lZCBvZmZzZXQpCit7CisJc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGU7CisJaW50IGlubzsKKwljaGFyICpuYW1lOworCWludCBibG9jazsKKworCWJsb2NrID0gbWFwX2Jsb2NrMihkaXIsIG9mZnNldCAvIEJMT0NLX1NJWkUpOworCXJlYWRfYmxvY2soYmxvY2ssIGNoZWNrX2ZpbGVfYmxrKTsKKwluYW1lID0gY2hlY2tfZmlsZV9ibGsgKyAob2Zmc2V0ICUgQkxPQ0tfU0laRSkgKyAyOworCWlubyA9ICoodWludDE2X3QgKikgKG5hbWUgLSAyKTsKKwlpZiAoaW5vID4gSU5PREVTKSB7CisJCXByaW50ZigiJXMgY29udGFpbnMgYSBiYWQgaW5vZGUgbnVtYmVyIGZvciBmaWxlICclLipzJy4gIiwKKwkJCQljdXJyZW50X25hbWUsIG5hbWVsZW4sIG5hbWUpOworCQlpZiAoYXNrKCJSZW1vdmUiLCAxKSkgeworCQkJKih1aW50MTZfdCAqKSAobmFtZSAtIDIpID0gMDsKKwkJCXdyaXRlX2Jsb2NrKGJsb2NrLCBjaGVja19maWxlX2Jsayk7CisJCX0KKwkJaW5vID0gMDsKKwl9CisJcHVzaF9maWxlbmFtZShuYW1lKTsKKwlpbm9kZSA9IGdldF9pbm9kZTIoaW5vKTsKKwlwb3BfZmlsZW5hbWUoKTsKKwlpZiAoIW9mZnNldCkgeworCQlpZiAoaW5vZGUgJiYgTE9ORV9DSEFSKG5hbWUsICcuJykpCisJCQlyZXR1cm47CisJCXByaW50ZigiJXM6IGJhZCBkaXJlY3Rvcnk6ICcuJyBpc24ndCBmaXJzdFxuIiwgY3VycmVudF9uYW1lKTsKKwkJZXJyb3JzX3VuY29ycmVjdGVkID0gMTsKKwl9CisJaWYgKG9mZnNldCA9PSBkaXJzaXplKSB7CisJCWlmIChpbm9kZSAmJiBzdHJjbXAoIi4uIiwgbmFtZSkgPT0gMCkKKwkJCXJldHVybjsKKwkJcHJpbnRmKCIlczogYmFkIGRpcmVjdG9yeTogJy4uJyBpc24ndCBzZWNvbmRcbiIsIGN1cnJlbnRfbmFtZSk7CisJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJfQorCWlmICghaW5vZGUpCisJCXJldHVybjsKKwlwdXNoX2ZpbGVuYW1lKG5hbWUpOworCWlmIChPUFRfbGlzdCkgeworCQlpZiAoT1BUX3ZlcmJvc2UpCisJCQlwcmludGYoIiU2ZCAlMDdvICUzZCAiLCBpbm8sIGlub2RlLT5pX21vZGUsIGlub2RlLT5pX25saW5rcyk7CisJCXByaW50ZigiJXMlc1xuIiwgY3VycmVudF9uYW1lLCBTX0lTRElSKGlub2RlLT5pX21vZGUpID8gIjoiIDogIiIpOworCX0KKwljaGVja196b25lczIoaW5vKTsKKwlpZiAoaW5vZGUgJiYgU19JU0RJUihpbm9kZS0+aV9tb2RlKSkKKwkJcmVjdXJzaXZlX2NoZWNrMihpbm8pOworCXBvcF9maWxlbmFtZSgpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHJlY3Vyc2l2ZV9jaGVjayh1bnNpZ25lZCBpbm8pCit7CisJc3RydWN0IG1pbml4MV9pbm9kZSAqZGlyOworCXVuc2lnbmVkIG9mZnNldDsKKworCWRpciA9IElub2RlMSArIGlubzsKKwlpZiAoIVNfSVNESVIoZGlyLT5pX21vZGUpKQorCQlkaWUoImludGVybmFsIGVycm9yIik7CisJaWYgKGRpci0+aV9zaXplIDwgMiAqIGRpcnNpemUpIHsKKwkJcHJpbnRmKCIlczogYmFkIGRpcmVjdG9yeTogc2l6ZTwzMiIsIGN1cnJlbnRfbmFtZSk7CisJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJfQorCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZGlyLT5pX3NpemU7IG9mZnNldCArPSBkaXJzaXplKQorCQljaGVja19maWxlKGRpciwgb2Zmc2V0KTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorc3RhdGljIHZvaWQgcmVjdXJzaXZlX2NoZWNrMih1bnNpZ25lZCBpbm8pCit7CisJc3RydWN0IG1pbml4Ml9pbm9kZSAqZGlyOworCXVuc2lnbmVkIG9mZnNldDsKKworCWRpciA9IElub2RlMiArIGlubzsKKwlpZiAoIVNfSVNESVIoZGlyLT5pX21vZGUpKQorCQlkaWUoImludGVybmFsIGVycm9yIik7CisJaWYgKGRpci0+aV9zaXplIDwgMiAqIGRpcnNpemUpIHsKKwkJcHJpbnRmKCIlczogYmFkIGRpcmVjdG9yeTogc2l6ZTwzMiIsIGN1cnJlbnRfbmFtZSk7CisJCWVycm9yc191bmNvcnJlY3RlZCA9IDE7CisJfQorCWZvciAob2Zmc2V0ID0gMDsgb2Zmc2V0IDwgZGlyLT5pX3NpemU7IG9mZnNldCArPSBkaXJzaXplKQorCQljaGVja19maWxlMihkaXIsIG9mZnNldCk7Cit9CisjZW5kaWYKKworc3RhdGljIGludCBiYWRfem9uZShpbnQgaSkKK3sKKwljaGFyIGJ1ZmZlcltCTE9DS19TSVpFXTsKKworCXhsc2VlayhkZXZfZmQsIEJMT0NLX1NJWkUgKiBpLCBTRUVLX1NFVCk7CisJcmV0dXJuIChCTE9DS19TSVpFICE9IGZ1bGxfcmVhZChkZXZfZmQsIGJ1ZmZlciwgQkxPQ0tfU0laRSkpOworfQorCitzdGF0aWMgdm9pZCBjaGVja19jb3VudHModm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDE7IGkgPD0gSU5PREVTOyBpKyspIHsKKwkJaWYgKE9QVF93YXJuX21vZGUgJiYgSW5vZGUxW2ldLmlfbW9kZSAmJiAhaW5vZGVfaW5fdXNlKGkpKSB7CisJCQlwcmludGYoIklub2RlICVkIGhhcyBub24temVybyBtb2RlLiAiLCBpKTsKKwkJCWlmIChhc2soIkNsZWFyIiwgMSkpIHsKKwkJCQlJbm9kZTFbaV0uaV9tb2RlID0gMDsKKwkJCQljaGFuZ2VkID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoIWlub2RlX2NvdW50W2ldKSB7CisJCQlpZiAoIWlub2RlX2luX3VzZShpKSkKKwkJCQljb250aW51ZTsKKwkJCXByaW50ZigiVW51c2VkIGlub2RlICVkIGlzIG1hcmtlZCBhcyAndXNlZCcgaW4gdGhlIGJpdG1hcC4gIiwgaSk7CisJCQlpZiAoYXNrKCJDbGVhciIsIDEpKQorCQkJCXVubWFya19pbm9kZShpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghaW5vZGVfaW5fdXNlKGkpKSB7CisJCQlwcmludGYoIklub2RlICVkIGlzIHVzZWQsIGJ1dCBtYXJrZWQgYXMgJ3VudXNlZCcgaW4gdGhlIGJpdG1hcC4gIiwgaSk7CisJCQlpZiAoYXNrKCJTZXQiLCAxKSkKKwkJCQltYXJrX2lub2RlKGkpOworCQl9CisJCWlmIChJbm9kZTFbaV0uaV9ubGlua3MgIT0gaW5vZGVfY291bnRbaV0pIHsKKwkJCXByaW50ZigiSW5vZGUgJWQgKG1vZGU9JTA3byksIGlfbmxpbmtzPSVkLCBjb3VudGVkPSVkLiAiLAorCQkJCWksIElub2RlMVtpXS5pX21vZGUsIElub2RlMVtpXS5pX25saW5rcywKKwkJCQlpbm9kZV9jb3VudFtpXSk7CisJCQlpZiAoYXNrKCJTZXQgaV9ubGlua3MgdG8gY291bnQiLCAxKSkgeworCQkJCUlub2RlMVtpXS5pX25saW5rcyA9IGlub2RlX2NvdW50W2ldOworCQkJCWNoYW5nZWQgPSAxOworCQkJfQorCQl9CisJfQorCWZvciAoaSA9IEZJUlNUWk9ORTsgaSA8IFpPTkVTOyBpKyspIHsKKwkJaWYgKCh6b25lX2luX3VzZShpKSAhPSAwKSA9PSB6b25lX2NvdW50W2ldKQorCQkJY29udGludWU7CisJCWlmICghem9uZV9jb3VudFtpXSkgeworCQkJaWYgKGJhZF96b25lKGkpKQorCQkJCWNvbnRpbnVlOworCQkJcHJpbnRmKCJab25lICVkIGlzIG1hcmtlZCAnaW4gdXNlJywgYnV0IG5vIGZpbGUgdXNlcyBpdC4gIiwgaSk7CisJCQlpZiAoYXNrKCJVbm1hcmsiLCAxKSkKKwkJCQl1bm1hcmtfem9uZShpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXByaW50ZigiWm9uZSAlZDogJXNpbiB1c2UsIGNvdW50ZWQ9JWRcbiIsCisJCQlpLCB6b25lX2luX3VzZShpKSA/ICIiIDogIm5vdCAiLCB6b25lX2NvdW50W2ldKTsKKwl9Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKK3N0YXRpYyB2b2lkIGNoZWNrX2NvdW50czIodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDE7IGkgPD0gSU5PREVTOyBpKyspIHsKKwkJaWYgKE9QVF93YXJuX21vZGUgJiYgSW5vZGUyW2ldLmlfbW9kZSAmJiAhaW5vZGVfaW5fdXNlKGkpKSB7CisJCQlwcmludGYoIklub2RlICVkIGhhcyBub24temVybyBtb2RlLiAiLCBpKTsKKwkJCWlmIChhc2soIkNsZWFyIiwgMSkpIHsKKwkJCQlJbm9kZTJbaV0uaV9tb2RlID0gMDsKKwkJCQljaGFuZ2VkID0gMTsKKwkJCX0KKwkJfQorCQlpZiAoIWlub2RlX2NvdW50W2ldKSB7CisJCQlpZiAoIWlub2RlX2luX3VzZShpKSkKKwkJCQljb250aW51ZTsKKwkJCXByaW50ZigiVW51c2VkIGlub2RlICVkIGlzIG1hcmtlZCBhcyAndXNlZCcgaW4gdGhlIGJpdG1hcC4gIiwgaSk7CisJCQlpZiAoYXNrKCJDbGVhciIsIDEpKQorCQkJCXVubWFya19pbm9kZShpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghaW5vZGVfaW5fdXNlKGkpKSB7CisJCQlwcmludGYoIklub2RlICVkIGlzIHVzZWQsIGJ1dCBtYXJrZWQgYXMgJ3VudXNlZCcgaW4gdGhlIGJpdG1hcC4gIiwgaSk7CisJCQlpZiAoYXNrKCJTZXQiLCAxKSkKKwkJCQltYXJrX2lub2RlKGkpOworCQl9CisJCWlmIChJbm9kZTJbaV0uaV9ubGlua3MgIT0gaW5vZGVfY291bnRbaV0pIHsKKwkJCXByaW50ZigiSW5vZGUgJWQgKG1vZGU9JTA3byksIGlfbmxpbmtzPSVkLCBjb3VudGVkPSVkLiAiLAorCQkJCWksIElub2RlMltpXS5pX21vZGUsIElub2RlMltpXS5pX25saW5rcywKKwkJCQlpbm9kZV9jb3VudFtpXSk7CisJCQlpZiAoYXNrKCJTZXQgaV9ubGlua3MgdG8gY291bnQiLCAxKSkgeworCQkJCUlub2RlMltpXS5pX25saW5rcyA9IGlub2RlX2NvdW50W2ldOworCQkJCWNoYW5nZWQgPSAxOworCQkJfQorCQl9CisJfQorCWZvciAoaSA9IEZJUlNUWk9ORTsgaSA8IFpPTkVTOyBpKyspIHsKKwkJaWYgKCh6b25lX2luX3VzZShpKSAhPSAwKSA9PSB6b25lX2NvdW50W2ldKQorCQkJY29udGludWU7CisJCWlmICghem9uZV9jb3VudFtpXSkgeworCQkJaWYgKGJhZF96b25lKGkpKQorCQkJCWNvbnRpbnVlOworCQkJcHJpbnRmKCJab25lICVkIGlzIG1hcmtlZCAnaW4gdXNlJywgYnV0IG5vIGZpbGUgdXNlcyBpdC4gIiwgaSk7CisJCQlpZiAoYXNrKCJVbm1hcmsiLCAxKSkKKwkJCQl1bm1hcmtfem9uZShpKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXByaW50ZigiWm9uZSAlZDogJXNpbiB1c2UsIGNvdW50ZWQ9JWRcbiIsCisJCQlpLCB6b25lX2luX3VzZShpKSA/ICIiIDogIm5vdCAiLCB6b25lX2NvdW50W2ldKTsKKwl9Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgY2hlY2sodm9pZCkKK3sKKwltZW1zZXQoaW5vZGVfY291bnQsIDAsIChJTk9ERVMgKyAxKSAqIHNpemVvZigqaW5vZGVfY291bnQpKTsKKwltZW1zZXQoem9uZV9jb3VudCwgMCwgWk9ORVMgKiBzaXplb2YoKnpvbmVfY291bnQpKTsKKwljaGVja196b25lcyhNSU5JWF9ST09UX0lOTyk7CisJcmVjdXJzaXZlX2NoZWNrKE1JTklYX1JPT1RfSU5PKTsKKwljaGVja19jb3VudHMoKTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorc3RhdGljIHZvaWQgY2hlY2syKHZvaWQpCit7CisJbWVtc2V0KGlub2RlX2NvdW50LCAwLCAoSU5PREVTICsgMSkgKiBzaXplb2YoKmlub2RlX2NvdW50KSk7CisJbWVtc2V0KHpvbmVfY291bnQsIDAsIFpPTkVTICogc2l6ZW9mKCp6b25lX2NvdW50KSk7CisJY2hlY2tfem9uZXMyKE1JTklYX1JPT1RfSU5PKTsKKwlyZWN1cnNpdmVfY2hlY2syKE1JTklYX1JPT1RfSU5PKTsKKwljaGVja19jb3VudHMyKCk7Cit9CisjZWxzZQordm9pZCBjaGVjazIodm9pZCk7CisjZW5kaWYKKworaW50IGZzY2tfbWluaXhfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGZzY2tfbWluaXhfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCB0ZXJtaW9zIHRtcDsKKwlpbnQgcmV0Y29kZSA9IDA7CisKKwl4ZnVuY19lcnJvcl9yZXR2YWwgPSA4OworCisJSU5JVF9HKCk7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI9MTphciI7IC8qIG9uZSBhcmd1bWVudDsgLWEgYXNzdW1lcyAtciAqLworCWdldG9wdDMyKGFyZ3YsIE9QVElPTl9TVFIpOworCWFyZ3YgKz0gb3B0aW5kOworCWRldmljZV9uYW1lID0gYXJndlswXTsKKworCWNoZWNrX21vdW50KCk7ICAvKiB0cnlpbmcgdG8gY2hlY2sgYSBtb3VudGVkIGZpbGVzeXN0ZW0/ICovCisJaWYgKE9QVF9tYW51YWwpIHsKKwkJaWYgKCFpc2F0dHkoMCkgfHwgIWlzYXR0eSgxKSkKKwkJCWRpZSgibmVlZCB0ZXJtaW5hbCBmb3IgaW50ZXJhY3RpdmUgcmVwYWlycyIpOworCX0KKwl4bW92ZV9mZCh4b3BlbihkZXZpY2VfbmFtZSwgT1BUX3JlcGFpciA/IE9fUkRXUiA6IE9fUkRPTkxZKSwgZGV2X2ZkKTsKKworCS8qc3luYygpOyBwYXJhbm9pYT8gKi8KKwlyZWFkX3N1cGVyYmxvY2soKTsKKworCS8qCisJICogRGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHdlIHNob3VsZCBjb250aW51ZSB3aXRoIHRoZSBjaGVja2luZy4KKwkgKiBUaGlzIGlzIGJhc2VkIG9uIHRoZSBzdGF0dXMgb2YgdGhlIGZpbGVzeXN0ZW0gdmFsaWQgYW5kIGVycm9yCisJICogZmxhZ3MgYW5kIHdoZXRoZXIgb3Igbm90IHRoZSAtZiBzd2l0Y2ggd2FzIHNwZWNpZmllZCBvbiB0aGUKKwkgKiBjb21tYW5kIGxpbmUuCisJICovCisJcHJpbnRmKCIlczogJXNcbiIsIGFwcGxldF9uYW1lLCBiYl9iYW5uZXIpOworCisJaWYgKCEoU3VwZXIuc19zdGF0ZSAmIE1JTklYX0VSUk9SX0ZTKQorCSAmJiAoU3VwZXIuc19zdGF0ZSAmIE1JTklYX1ZBTElEX0ZTKSAmJiAhT1BUX2ZvcmNlCisJKSB7CisJCWlmIChPUFRfcmVwYWlyKQorCQkJcHJpbnRmKCIlcyBpcyBjbGVhbiwgY2hlY2sgaXMgc2tpcHBlZFxuIiwgZGV2aWNlX25hbWUpOworCQlyZXR1cm4gMDsKKwl9IGVsc2UgaWYgKE9QVF9mb3JjZSkKKwkJcHJpbnRmKCJGb3JjaW5nIGZpbGVzeXN0ZW0gY2hlY2sgb24gJXNcbiIsIGRldmljZV9uYW1lKTsKKwllbHNlIGlmIChPUFRfcmVwYWlyKQorCQlwcmludGYoIkZpbGVzeXN0ZW0gb24gJXMgaXMgZGlydHksIG5lZWRzIGNoZWNraW5nXG4iLAorCQkJZGV2aWNlX25hbWUpOworCisJcmVhZF90YWJsZXMoKTsKKworCWlmIChPUFRfbWFudWFsKSB7CisJCXRjZ2V0YXR0cigwLCAmc3ZfdGVybWlvcyk7CisJCXRtcCA9IHN2X3Rlcm1pb3M7CisJCXRtcC5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyk7CisJCXRjc2V0YXR0cl9zdGRpbl9UQ1NBTk9XKCZ0bXApOworCQl0ZXJtaW9zX3NldCA9IDE7CisJfQorCisJaWYgKHZlcnNpb24yKSB7CisJCWNoZWNrX3Jvb3QyKCk7CisJCWNoZWNrMigpOworCX0gZWxzZSB7CisJCWNoZWNrX3Jvb3QoKTsKKwkJY2hlY2soKTsKKwl9CisKKwlpZiAoT1BUX3ZlcmJvc2UpIHsKKwkJaW50IGksIGZyZWVfY250OworCisJCWZvciAoaSA9IDEsIGZyZWVfY250ID0gMDsgaSA8PSBJTk9ERVM7IGkrKykKKwkJCWlmICghaW5vZGVfaW5fdXNlKGkpKQorCQkJCWZyZWVfY250Kys7CisJCXByaW50ZigiXG4lNnUgaW5vZGVzIHVzZWQgKCV1JSUpXG4iLCAoSU5PREVTIC0gZnJlZV9jbnQpLAorCQkJMTAwICogKElOT0RFUyAtIGZyZWVfY250KSAvIElOT0RFUyk7CisJCWZvciAoaSA9IEZJUlNUWk9ORSwgZnJlZV9jbnQgPSAwOyBpIDwgWk9ORVM7IGkrKykKKwkJCWlmICghem9uZV9pbl91c2UoaSkpCisJCQkJZnJlZV9jbnQrKzsKKwkJcHJpbnRmKCIlNnUgem9uZXMgdXNlZCAoJXUlJSlcblxuIgorCQkJIiU2dSByZWd1bGFyIGZpbGVzXG4iCisJCQkiJTZ1IGRpcmVjdG9yaWVzXG4iCisJCQkiJTZ1IGNoYXJhY3RlciBkZXZpY2UgZmlsZXNcbiIKKwkJCSIlNnUgYmxvY2sgZGV2aWNlIGZpbGVzXG4iCisJCQkiJTZ1IGxpbmtzXG4iCisJCQkiJTZ1IHN5bWJvbGljIGxpbmtzXG4iCisJCQkiLS0tLS0tXG4iCisJCQkiJTZ1IGZpbGVzXG4iLAorCQkJKFpPTkVTIC0gZnJlZV9jbnQpLCAxMDAgKiAoWk9ORVMgLSBmcmVlX2NudCkgLyBaT05FUywKKwkJCXJlZ3VsYXIsIGRpcmVjdG9yeSwgY2hhcmRldiwgYmxvY2tkZXYsCisJCQlsaW5rcyAtIDIgKiBkaXJlY3RvcnkgKyAxLCBzeW1saW5rcywKKwkJCXRvdGFsIC0gMiAqIGRpcmVjdG9yeSArIDEpOworCX0KKwlpZiAoY2hhbmdlZCkgeworCQl3cml0ZV90YWJsZXMoKTsKKwkJcHV0cygiRklMRSBTWVNURU0gSEFTIEJFRU4gQ0hBTkdFRCIpOworCQlzeW5jKCk7CisJfSBlbHNlIGlmIChPUFRfcmVwYWlyKQorCQl3cml0ZV9zdXBlcmJsb2NrKCk7CisKKwlpZiAoT1BUX21hbnVhbCkKKwkJdGNzZXRhdHRyX3N0ZGluX1RDU0FOT1coJnN2X3Rlcm1pb3MpOworCisJaWYgKGNoYW5nZWQpCisJCXJldGNvZGUgKz0gMzsKKwlpZiAoZXJyb3JzX3VuY29ycmVjdGVkKQorCQlyZXRjb2RlICs9IDQ7CisJcmV0dXJuIHJldGNvZGU7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2ZzdHJpbS5jIGIvdXRpbC1saW51eC9mc3RyaW0uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTQwMGVmCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9mc3RyaW0uYwpAQCAtMCwwICsxLDExOSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogZnN0cmltLmMgLSBkaXNjYXJkIHRoZSBwYXJ0IChvciB3aG9sZSkgb2YgbW91bnRlZCBmaWxlc3lzdGVtLgorICoKKyAqIDAzIE1hcmNoIDIwMTIgLSBNYWxlayBEZWdhY2hpIDxtYWxlay1kZWdhY2hpQGxhcG9zdGUubmV0PgorICogQWRhcHRlZCBmb3IgYnVzeWJveCBmcm9tIHV0aWwtbGludXgtMi4xMmEuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2NvbmZpZzpjb25maWcgRlNUUklNCisvL2NvbmZpZzoJYm9vbCAiZnN0cmltIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CXNlbGVjdCBQTEFURk9STV9MSU5VWAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIERpc2NhcmQgdW51c2VkIGJsb2NrcyBvbiBhIG1vdW50ZWQgZmlsZXN5c3RlbS4KKworLy9hcHBsZXQ6SUZfRlNUUklNKEFQUExFVChmc3RyaW0sIEJCX0RJUl9TQklOLCBCQl9TVUlEX0RST1ApKQorCisvL2tidWlsZDpsaWItJChDT05GSUdfRlNUUklNKSArPSBmc3RyaW0ubworCisvL3VzYWdlOiNkZWZpbmUgZnN0cmltX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gTU9VTlRQT0lOVCIKKy8vdXNhZ2U6I2RlZmluZSBmc3RyaW1fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6CUlGX0xPTkdfT1BUUygKKy8vdXNhZ2U6ICAgICAgICIJLW8sLS1vZmZzZXQ9T0ZGU0VUCU9mZnNldCBpbiBieXRlcyB0byBkaXNjYXJkIGZyb20iCisvL3VzYWdlOiAgICAgIlxuCS1sLC0tbGVuZ3RoPUxFTgkJQnl0ZXMgdG8gZGlzY2FyZCIKKy8vdXNhZ2U6ICAgICAiXG4JLW0sLS1taW5pbXVtPU1JTglNaW5pbXVtIGV4dGVudCBsZW5ndGgiCisvL3VzYWdlOiAgICAgIlxuCS12LC0tdmVyYm9zZQkJUHJpbnQgbnVtYmVyIG9mIGRpc2NhcmRlZCBieXRlcyIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9MT05HX09QVFMoCisvL3VzYWdlOiAgICAgICAiCS1vIE9GRlNFVAlPZmZzZXQgaW4gYnl0ZXMgdG8gZGlzY2FyZCBmcm9tIgorLy91c2FnZTogICAgICJcbgktbCBMRU4JCUJ5dGVzIHRvIGRpc2NhcmQiCisvL3VzYWdlOiAgICAgIlxuCS1tIE1JTgkJTWluaW11bSBleHRlbnQgbGVuZ3RoIgorLy91c2FnZTogICAgICJcbgktdgkJUHJpbnQgbnVtYmVyIG9mIGRpc2NhcmRlZCBieXRlcyIKKy8vdXNhZ2U6CSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bGludXgvZnMuaD4KKworI2lmbmRlZiBGSVRSSU0KK3N0cnVjdCBmc3RyaW1fcmFuZ2UgeworCXVpbnQ2NF90IHN0YXJ0OworCXVpbnQ2NF90IGxlbjsKKwl1aW50NjRfdCBtaW5sZW47Cit9OworI2RlZmluZSBGSVRSSU0JCV9JT1dSKCdYJywgMTIxLCBzdHJ1Y3QgZnN0cmltX3JhbmdlKQorI2VuZGlmCisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc3VmZml4X211bHQgZnN0cmltX3NmeFtdID0geworCXsgIktpQiIsIDEwMjQgfSwKKwl7ICJraUIiLCAxMDI0IH0sCisJeyAiSyIsIDEwMjQgfSwKKwl7ICJrIiwgMTAyNCB9LAorCXsgIk1pQiIsIDEwNDg1NzYgfSwKKwl7ICJtaUIiLCAxMDQ4NTc2IH0sCisJeyAiTSIsIDEwNDg1NzYgfSwKKwl7ICJtIiwgMTA0ODU3NiB9LAorCXsgIkdpQiIsIDEwNzM3NDE4MjQgfSwKKwl7ICJnaUIiLCAxMDczNzQxODI0IH0sCisJeyAiRyIsIDEwNzM3NDE4MjQgfSwKKwl7ICJnIiwgMTA3Mzc0MTgyNCB9LAorCXsgIktCIiwgMTAwMCB9LAorCXsgIk1CIiwgMTAwMDAwMCB9LAorCXsgIkdCIiwgMTAwMDAwMDAwMCB9LAorCXsgIiIsIDAgfQorfTsKKworaW50IGZzdHJpbV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZnN0cmltX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3QgZnN0cmltX3JhbmdlIHJhbmdlOworCWNoYXIgKmFyZ19vLCAqYXJnX2wsICphcmdfbSwgKm1wOworCXVuc2lnbmVkIG9wdHM7CisJaW50IGZkOworCisJZW51bSB7CisJCU9QVF9vID0gKDEgPDwgMCksCisJCU9QVF9sID0gKDEgPDwgMSksCisJCU9QVF9tID0gKDEgPDwgMiksCisJCU9QVF92ID0gKDEgPDwgMyksCisJfTsKKworI2lmIEVOQUJMRV9MT05HX09QVFMKKwlzdGF0aWMgY29uc3QgY2hhciBnZXRvcHRfbG9uZ29wdHNbXSBBTElHTjEgPQorCQkib2Zmc2V0XDAiICAgIFJlcXVpcmVkX2FyZ3VtZW50ICAgICJvIgorCQkibGVuZ3RoXDAiICAgIFJlcXVpcmVkX2FyZ3VtZW50ICAgICJsIgorCQkibWluaW11bVwwIiAgIFJlcXVpcmVkX2FyZ3VtZW50ICAgICJtIgorCQkidmVyYm9zZVwwIiAgIE5vX2FyZ3VtZW50ICAgICAgICAgICJ2IgorCQk7CisJYXBwbGV0X2xvbmdfb3B0aW9ucyA9IGdldG9wdF9sb25nb3B0czsKKyNlbmRpZgorCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiPTEiOyAvKiBleGFjdGx5IG9uZSBub24tb3B0aW9uIGFyZzogdGhlIG1vdW50cG9pbnQgKi8KKwlvcHRzID0gZ2V0b3B0MzIoYXJndiwgIm86bDptOnYiLCAmYXJnX28sICZhcmdfbCwgJmFyZ19tKTsKKworCW1lbXNldCgmcmFuZ2UsIDAsIHNpemVvZihyYW5nZSkpOworCXJhbmdlLmxlbiA9IFVMTE9OR19NQVg7CisKKwlpZiAob3B0cyAmIE9QVF9vKQorCQlyYW5nZS5zdGFydCA9IHhhdG91bGxfc2Z4KGFyZ19vLCBmc3RyaW1fc2Z4KTsKKwlpZiAob3B0cyAmIE9QVF9sKQorCQlyYW5nZS5sZW4gPSB4YXRvdWxsX3NmeChhcmdfbCwgZnN0cmltX3NmeCk7CisJaWYgKG9wdHMgJiBPUFRfbSkKKwkJcmFuZ2UubWlubGVuID0geGF0b3VsbF9zZngoYXJnX20sIGZzdHJpbV9zZngpOworCisJbXAgPSBhcmd2W29wdGluZF07CisJaWYgKGZpbmRfYmxvY2tfZGV2aWNlKG1wKSkgeworCQlmZCA9IHhvcGVuX25vbmJsb2NraW5nKG1wKTsKKwkJeGlvY3RsKGZkLCBGSVRSSU0sICZyYW5nZSk7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCWNsb3NlKGZkKTsKKworCQlpZiAob3B0cyAmIE9QVF92KQorCQkJcHJpbnRmKCIlczogJWxsdSBieXRlcyB0cmltbWVkXG4iLCBtcCwgKHVuc2lnbmVkIGxvbmcgbG9uZylyYW5nZS5sZW4pOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9nZXRvcHQuYyBiL3V0aWwtbGludXgvZ2V0b3B0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlkYWRmMQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvZ2V0b3B0LmMKQEAgLTAsMCArMSw0MjcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGdldG9wdC5jIC0gRW5oYW5jZWQgaW1wbGVtZW50YXRpb24gb2YgQlNEIGdldG9wdCgxKQorICogICBDb3B5cmlnaHQgKGMpIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAgIEZyb2RvIExvb2lqYWFyZCA8ZnJvZG9sQGRkcy5ubD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qCisgKiBWZXJzaW9uIDEuMC1iNDogVHVlIFNlcCAyMyAxOTk3LiBGaXJzdCBwdWJsaWMgcmVsZWFzZS4KKyAqIFZlcnNpb24gMS4wOiBXZWQgTm92IDE5IDE5OTcuCisgKiAgIEJ1bXBlZCB1cCB0aGUgdmVyc2lvbiBudW1iZXIgdG8gMS4wCisgKiAgIEZpeGVkIG1pbm9yIHR5cG8gKENTSCBpbnN0ZWFkIG9mIFRDU0gpCisgKiBWZXJzaW9uIDEuMC4xOiBUdWUgSnVuIDMgMTk5OAorICogICBGaXhlZCBzaXplb2YgaW5zdGVhZCBvZiBzdHJsZW4gYnVnCisgKiAgIEJ1bXBlZCB1cCB0aGUgdmVyc2lvbiBudW1iZXIgdG8gMS4wLjEKKyAqIFZlcnNpb24gMS4wLjI6IFRodSBKdW4gMTEgMTk5OCAobm90IHByZXNlbnQpCisgKiAgIEZpeGVkIGdjYy0yLjguMSB3YXJuaW5ncworICogICBGaXhlZCAtLXZlcnNpb24vLVYgb3B0aW9uIChub3QgcHJlc2VudCkKKyAqIFZlcnNpb24gMS4wLjU6IFR1ZSBKdW4gMjIgMTk5OQorICogICBNYWtlIC11IG9wdGlvbiB3b3JrIChub3QgcHJlc2VudCkKKyAqIFZlcnNpb24gMS4wLjY6IFR1ZSBKdW4gMjcgMjAwMAorICogICBObyBpbXBvcnRhbnQgY2hhbmdlcworICogVmVyc2lvbiAxLjEuMDogVHVlIEp1biAzMCAyMDAwCisgKiAgIEFkZGVkIE5MUyBzdXBwb3J0IChwYXJ0bHkgd3JpdHRlbiBieSBBcmthZGl1c3ogTWlja2lld2ljegorICogICAgIDxtaXNpZWtAbWlzaWVrLmV1Lm9yZz4pCisgKiBQb3J0ZWQgdG8gQnVzeWJveCAtIEFsZnJlZCBNLiBTem1pZHQgPGFtc0B0cmlsbGlhbi5pdHNsaW51eC5vcmc+CisgKiAgUmVtb3ZlZCAtLXZlcnNpb24vLVYgYW5kIC0taGVscC8taAorICogIFJlbW92ZWQgcGFyc2VfZXJyb3IoKSwgdXNpbmcgYmJfZXJyb3JfbXNnKCkgZnJvbSBCdXN5Ym94IGluc3RlYWQKKyAqICBSZXBsYWNlZCBvdXJfbWFsbG9jIHdpdGggeG1hbGxvYyBhbmQgb3VyX3JlYWxsb2Mgd2l0aCB4cmVhbGxvYworICoKKyAqLworCisvL3VzYWdlOiNkZWZpbmUgZ2V0b3B0X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gWy0tXSBPUFRTVFJJTkcgUEFSQU1TIgorLy91c2FnZTojZGVmaW5lIGdldG9wdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZToJSUZfTE9OR19PUFRTKAorLy91c2FnZToJSUZfRkVBVFVSRV9HRVRPUFRfTE9ORygKKy8vdXNhZ2U6ICAgICAgICIJLWEsLS1hbHRlcm5hdGl2ZQkJQWxsb3cgbG9uZyBvcHRpb25zIHN0YXJ0aW5nIHdpdGggc2luZ2xlIC1cbiIKKy8vdXNhZ2U6ICAgICAgICIJLWwsLS1sb25nb3B0aW9ucz1MT1BUWywuLi5dCUxvbmcgb3B0aW9ucyB0byByZWNvZ25pemVcbiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAgICIJLW4sLS1uYW1lPVBST0dOQU1FCQlUaGUgbmFtZSB1bmRlciB3aGljaCBlcnJvcnMgYXJlIHJlcG9ydGVkIgorLy91c2FnZTogICAgICJcbgktbywtLW9wdGlvbnM9T1BUU1RSSU5HCQlTaG9ydCBvcHRpb25zIHRvIHJlY29nbml6ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXEsLS1xdWlldAkJCU5vIGVycm9yIG1lc3NhZ2VzIG9uIHVucmVjb2duaXplZCBvcHRpb25zIgorLy91c2FnZTogICAgICJcbgktUSwtLXF1aWV0LW91dHB1dAkJTm8gbm9ybWFsIG91dHB1dCIKKy8vdXNhZ2U6ICAgICAiXG4JLXMsLS1zaGVsbD1TSEVMTAkJU2V0IHNoZWxsIHF1b3RpbmcgY29udmVudGlvbnMiCisvL3VzYWdlOiAgICAgIlxuCS1ULC0tdGVzdAkJCVZlcnNpb24gdGVzdCAoZXhpdHMgd2l0aCA0KSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUsLS11bnF1b3RlZAkJCURvbid0IHF1b3RlIG91dHB1dCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX05PVF9MT05HX09QVFMoCisvL3VzYWdlOglJRl9GRUFUVVJFX0dFVE9QVF9MT05HKAorLy91c2FnZTogICAgICAgIgktYQkJQWxsb3cgbG9uZyBvcHRpb25zIHN0YXJ0aW5nIHdpdGggc2luZ2xlIC1cbiIKKy8vdXNhZ2U6ICAgICAgICIJLWwgTE9QVFssLi4uXQlMb25nIG9wdGlvbnMgdG8gcmVjb2duaXplXG4iCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgICAiCS1uIFBST0dOQU1FCVRoZSBuYW1lIHVuZGVyIHdoaWNoIGVycm9ycyBhcmUgcmVwb3J0ZWQiCisvL3VzYWdlOiAgICAgIlxuCS1vIE9QVFNUUklORwlTaG9ydCBvcHRpb25zIHRvIHJlY29nbml6ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXEJCU5vIGVycm9yIG1lc3NhZ2VzIG9uIHVucmVjb2duaXplZCBvcHRpb25zIgorLy91c2FnZTogICAgICJcbgktUQkJTm8gbm9ybWFsIG91dHB1dCIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgU0hFTEwJU2V0IHNoZWxsIHF1b3RpbmcgY29udmVudGlvbnMiCisvL3VzYWdlOiAgICAgIlxuCS1UCQlWZXJzaW9uIHRlc3QgKGV4aXRzIHdpdGggNCkiCisvL3VzYWdlOiAgICAgIlxuCS11CQlEb24ndCBxdW90ZSBvdXRwdXQiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX0dFVE9QVF9MT05HKCAvKiBleGFtcGxlIHVzZXMgLWwsIG5lZWRzIEZFQVRVUkVfR0VUT1BUX0xPTkcgKi8KKy8vdXNhZ2U6ICAgICAiXG4iCisvL3VzYWdlOiAgICAgIlxuRXhhbXBsZToiCisvL3VzYWdlOiAgICAgIlxuIgorLy91c2FnZTogICAgICJcbk89YGdldG9wdCAtbCBiYjogLS0gYWI6Yzo6IFwiJEBcImAgfHwgZXhpdCAxIgorLy91c2FnZTogICAgICJcbmV2YWwgc2V0IC0tIFwiJE9cIiIKKy8vdXNhZ2U6ICAgICAiXG53aGlsZSB0cnVlOyBkbyIKKy8vdXNhZ2U6ICAgICAiXG4JY2FzZSBcIiQxXCIgaW4iCisvL3VzYWdlOiAgICAgIlxuCS1hKQllY2hvIEE7IHNoaWZ0OzsiCisvL3VzYWdlOiAgICAgIlxuCS1ifC0tYmIpIGVjaG8gXCJCOickMidcIjsgc2hpZnQgMjs7IgorLy91c2FnZTogICAgICJcbgktYykJY2FzZSBcIiQyXCIgaW4iCisvL3VzYWdlOiAgICAgIlxuCQlcIlwiKQllY2hvIEM7IHNoaWZ0IDI7OyIKKy8vdXNhZ2U6ICAgICAiXG4JCSopCWVjaG8gXCJDOickMidcIjsgc2hpZnQgMjs7IgorLy91c2FnZTogICAgICJcbgkJZXNhYzs7IgorLy91c2FnZTogICAgICJcbgktLSkJc2hpZnQ7IGJyZWFrOzsiCisvL3VzYWdlOiAgICAgIlxuCSopCWVjaG8gRXJyb3I7IGV4aXQgMTs7IgorLy91c2FnZTogICAgICJcbgllc2FjIgorLy91c2FnZTogICAgICJcbmRvbmUiCisvL3VzYWdlOgkpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGdldG9wdF9leGFtcGxlX3VzYWdlCisvL3VzYWdlOiAgICAgICAiJCBjYXQgZ2V0b3B0LnRlc3RcbiIKKy8vdXNhZ2U6ICAgICAgICIjIS9iaW4vc2hcbiIKKy8vdXNhZ2U6ICAgICAgICJHRVRPUFQ9YGdldG9wdCAtbyBhYjpjOjogLS1sb25nIGEtbG9uZyxiLWxvbmc6LGMtbG9uZzo6IFxcXG4iCisvL3VzYWdlOiAgICAgICAiICAgICAgIC1uICdleGFtcGxlLmJ1c3lib3gnIC0tIFwiJEBcImBcbiIKKy8vdXNhZ2U6ICAgICAgICJpZiBbICQ/ICE9IDAgXTsgdGhlbiBleGl0IDE7IGZpXG4iCisvL3VzYWdlOiAgICAgICAiZXZhbCBzZXQgLS0gXCIkR0VUT1BUXCJcbiIKKy8vdXNhZ2U6ICAgICAgICJ3aGlsZSB0cnVlOyBkb1xuIgorLy91c2FnZTogICAgICAgIiBjYXNlICQxIGluXG4iCisvL3VzYWdlOiAgICAgICAiICAgLWF8LS1hLWxvbmcpIGVjaG8gXCJPcHRpb24gYVwiOyBzaGlmdDs7XG4iCisvL3VzYWdlOiAgICAgICAiICAgLWJ8LS1iLWxvbmcpIGVjaG8gXCJPcHRpb24gYiwgYXJndW1lbnQgJyQyJ1wiOyBzaGlmdCAyOztcbiIKKy8vdXNhZ2U6ICAgICAgICIgICAtY3wtLWMtbG9uZylcbiIKKy8vdXNhZ2U6ICAgICAgICIgICAgIGNhc2UgXCIkMlwiIGluXG4iCisvL3VzYWdlOiAgICAgICAiICAgICAgIFwiXCIpIGVjaG8gXCJPcHRpb24gYywgbm8gYXJndW1lbnRcIjsgc2hpZnQgMjs7XG4iCisvL3VzYWdlOiAgICAgICAiICAgICAgICopICBlY2hvIFwiT3B0aW9uIGMsIGFyZ3VtZW50ICckMidcIjsgc2hpZnQgMjs7XG4iCisvL3VzYWdlOiAgICAgICAiICAgICBlc2FjOztcbiIKKy8vdXNhZ2U6ICAgICAgICIgICAtLSkgc2hpZnQ7IGJyZWFrOztcbiIKKy8vdXNhZ2U6ICAgICAgICIgICAqKSBlY2hvIFwiSW50ZXJuYWwgZXJyb3IhXCI7IGV4aXQgMTs7XG4iCisvL3VzYWdlOiAgICAgICAiIGVzYWNcbiIKKy8vdXNhZ2U6ICAgICAgICJkb25lXG4iCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9HRVRPUFRfTE9ORworIyBpbmNsdWRlIDxnZXRvcHQuaD4KKyNlbmRpZgorI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIE5PTl9PUFQgaXMgdGhlIGNvZGUgdGhhdCBpcyByZXR1cm5lZCB3aGVuIGEgbm9uLW9wdGlvbiBpcyBmb3VuZCBpbiAnKycKKyAgIG1vZGUgKi8KK2VudW0geworCU5PTl9PUFQgPSAxLAorI2lmIEVOQUJMRV9GRUFUVVJFX0dFVE9QVF9MT05HCisvKiBMT05HX09QVCBpcyB0aGUgY29kZSB0aGF0IGlzIHJldHVybmVkIHdoZW4gYSBsb25nIG9wdGlvbiBpcyBmb3VuZC4gKi8KKwlMT05HX09QVCA9IDIKKyNlbmRpZgorfTsKKworLyogRm9yIGZpbmRpbmcgYWN0aXZhdGVkIG9wdGlvbiBmbGFncy4gTXVzdCBtYXRjaCBnZXRvcHQzMiBjYWxsISAqLworZW51bSB7CisJT1BUX28JPSAweDEsCS8vIC1vCisJT1BUX24JPSAweDIsCS8vIC1uCisJT1BUX3EJPSAweDQsCS8vIC1xCisJT1BUX1EJPSAweDgsCS8vIC1RCisJT1BUX3MJPSAweDEwLAkvLyAtcworCU9QVF9UCT0gMHgyMCwJLy8gLVQKKwlPUFRfdQk9IDB4NDAsCS8vIC11CisjaWYgRU5BQkxFX0ZFQVRVUkVfR0VUT1BUX0xPTkcKKwlPUFRfYQk9IDB4ODAsCS8vIC1hCisJT1BUX2wJPSAweDEwMCwgLy8gLWwKKyNlbmRpZgorCVNIRUxMX0lTX1RDU0ggPSAweDgwMDAsIC8qIGhpamFjayB0aGlzIGJpdCBmb3Igb3RoZXIgcHVycG9zZXMgKi8KK307CisKKy8qIDAgaXMgZ2V0b3B0X2xvbmcsIDEgaXMgZ2V0b3B0X2xvbmdfb25seSAqLworI2RlZmluZSBhbHRlcm5hdGl2ZSAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfYSkKKworI2RlZmluZSBxdWlldF9lcnJvcnMgKG9wdGlvbl9tYXNrMzIgJiBPUFRfcSkKKyNkZWZpbmUgcXVpZXRfb3V0cHV0IChvcHRpb25fbWFzazMyICYgT1BUX1EpCisjZGVmaW5lIHF1b3RlICAgICAgICAoIShvcHRpb25fbWFzazMyICYgT1BUX3UpKQorI2RlZmluZSBzaGVsbF9UQ1NIICAgKG9wdGlvbl9tYXNrMzIgJiBTSEVMTF9JU19UQ1NIKQorCisvKgorICogVGhpcyBmdW5jdGlvbiAnbm9ybWFsaXplcycgYSBzaW5nbGUgYXJndW1lbnQ6IGl0IHB1dHMgc2luZ2xlIHF1b3RlcyBhcm91bmQKKyAqIGl0IGFuZCBlc2NhcGVzIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycy4gSWYgcXVvdGUgaXMgZmFsc2UsIGl0IGp1c3QKKyAqIHJldHVybnMgaXRzIGFyZ3VtZW50LgorICogQmFzaCBvbmx5IG5lZWRzIHNwZWNpYWwgdHJlYXRtZW50IGZvciBzaW5nbGUgcXVvdGVzOyB0Y3NoIGFsc28gcmVjb2duaXplcworICogZXhjbGFtYXRpb24gbWFya3Mgd2l0aGluIHNpbmdsZSBxdW90ZXMsIGFuZCBudWtlcyB3aGl0ZXNwYWNlLgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgcG9pbnRlciB0byBhIGJ1ZmZlciB0aGF0IGlzIG92ZXJ3cml0dGVuIGJ5CisgKiBlYWNoIGNhbGwuCisgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpub3JtYWxpemUoY29uc3QgY2hhciAqYXJnKQoreworCWNoYXIgKmJ1ZnB0cjsKKyNpZiBFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUAorCXN0YXRpYyBjaGFyICpCVUZGRVIgPSBOVUxMOworCWZyZWUoQlVGRkVSKTsKKyNlbHNlCisJY2hhciAqQlVGRkVSOworI2VuZGlmCisKKwlpZiAoIXF1b3RlKSB7IC8qIEp1c3QgY29weSBhcmcgKi8KKwkJQlVGRkVSID0geHN0cmR1cChhcmcpOworCQlyZXR1cm4gQlVGRkVSOworCX0KKworCS8qIEVhY2ggY2hhcmFjdGVyIGluIGFyZyBtYXkgdGFrZSB1cCB0byBmb3VyIGNoYXJhY3RlcnMgaW4gdGhlIHJlc3VsdDoKKwkgICBGb3IgYSBxdW90ZSB3ZSBuZWVkIGEgY2xvc2luZyBxdW90ZSwgYSBiYWNrc2xhc2gsIGEgcXVvdGUgYW5kIGFuCisJICAgb3BlbmluZyBxdW90ZSEgV2UgbmVlZCBhbHNvIHRoZSBnbG9iYWwgb3BlbmluZyBhbmQgY2xvc2luZyBxdW90ZSwKKwkgICBhbmQgb25lIGV4dHJhIGNoYXJhY3RlciBmb3IgJ1wwJy4gKi8KKwlCVUZGRVIgPSB4bWFsbG9jKHN0cmxlbihhcmcpKjQgKyAzKTsKKworCWJ1ZnB0ciA9IEJVRkZFUjsKKwkqYnVmcHRyICsrPSAnXCcnOworCisJd2hpbGUgKCphcmcpIHsKKwkJaWYgKCphcmcgPT0gJ1wnJykgeworCQkJLyogUXVvdGU6IHJlcGxhY2UgaXQgd2l0aDogJ1wnJyAqLworCQkJKmJ1ZnB0ciArKz0gJ1wnJzsKKwkJCSpidWZwdHIgKys9ICdcXCc7CisJCQkqYnVmcHRyICsrPSAnXCcnOworCQkJKmJ1ZnB0ciArKz0gJ1wnJzsKKwkJfSBlbHNlIGlmIChzaGVsbF9UQ1NIICYmICphcmcgPT0gJyEnKSB7CisJCQkvKiBFeGNsYW1hdGlvbiBtYXJrOiByZXBsYWNlIGl0IHdpdGg6IFwhICovCisJCQkqYnVmcHRyICsrPSAnXCcnOworCQkJKmJ1ZnB0ciArKz0gJ1xcJzsKKwkJCSpidWZwdHIgKys9ICchJzsKKwkJCSpidWZwdHIgKys9ICdcJyc7CisJCX0gZWxzZSBpZiAoc2hlbGxfVENTSCAmJiAqYXJnID09ICdcbicpIHsKKwkJCS8qIE5ld2xpbmU6IHJlcGxhY2UgaXQgd2l0aDogXG4gKi8KKwkJCSpidWZwdHIgKys9ICdcXCc7CisJCQkqYnVmcHRyICsrPSAnbic7CisJCX0gZWxzZSBpZiAoc2hlbGxfVENTSCAmJiBpc3NwYWNlKCphcmcpKSB7CisJCQkvKiBOb24tbmV3bGluZSB3aGl0ZXNwYWNlOiByZXBsYWNlIGl0IHdpdGggXDx3cz4gKi8KKwkJCSpidWZwdHIgKys9ICdcJyc7CisJCQkqYnVmcHRyICsrPSAnXFwnOworCQkJKmJ1ZnB0ciArKz0gKmFyZzsKKwkJCSpidWZwdHIgKys9ICdcJyc7CisJCX0gZWxzZQorCQkJLyogSnVzdCBjb3B5ICovCisJCQkqYnVmcHRyICsrPSAqYXJnOworCQlhcmcrKzsKKwl9CisJKmJ1ZnB0ciArKz0gJ1wnJzsKKwkqYnVmcHRyICsrPSAnXDAnOworCXJldHVybiBCVUZGRVI7Cit9CisKKy8qCisgKiBHZW5lcmF0ZSB0aGUgb3V0cHV0LiBhcmd2WzBdIGlzIHRoZSBwcm9ncmFtIG5hbWUgKHVzZWQgZm9yIHJlcG9ydGluZyBlcnJvcnMpLgorICogYXJndlsxLi5dIGNvbnRhaW5zIHRoZSBvcHRpb25zIHRvIGJlIHBhcnNlZC4gYXJnYyBtdXN0IGJlIHRoZSBudW1iZXIgb2YKKyAqIGVsZW1lbnRzIGluIGFyZ3YgKGllLiAxIGlmIHRoZXJlIGFyZSBubyBvcHRpb25zLCBvbmx5IHRoZSBwcm9ncmFtIG5hbWUpLAorICogb3B0c3RyIG11c3QgY29udGFpbiB0aGUgc2hvcnQgb3B0aW9ucywgYW5kIGxvbmdvcHRzIHRoZSBsb25nIG9wdGlvbnMuCisgKiBPdGhlciBzZXR0aW5ncyBhcmUgZm91bmQgaW4gZ2xvYmFsIHZhcmlhYmxlcy4KKyAqLworI2lmICFFTkFCTEVfRkVBVFVSRV9HRVRPUFRfTE9ORworI2RlZmluZSBnZW5lcmF0ZV9vdXRwdXQoYXJndixhcmdjLG9wdHN0cixsb25nb3B0cykgXAorCWdlbmVyYXRlX291dHB1dChhcmd2LGFyZ2Msb3B0c3RyKQorI2VuZGlmCitzdGF0aWMgaW50IGdlbmVyYXRlX291dHB1dChjaGFyICoqYXJndiwgaW50IGFyZ2MsIGNvbnN0IGNoYXIgKm9wdHN0ciwgY29uc3Qgc3RydWN0IG9wdGlvbiAqbG9uZ29wdHMpCit7CisJaW50IGV4aXRfY29kZSA9IDA7IC8qIFdlIGFzc3VtZSBldmVyeXRoaW5nIHdpbGwgYmUgT0sgKi8KKworCWlmIChxdWlldF9lcnJvcnMpIC8qIE5vIGVycm9yIHJlcG9ydGluZyBmcm9tIGdldG9wdCgzKSAqLworCQlvcHRlcnIgPSAwOworCisJLyogV2UgdXNlZCBpdCBhbHJlYWR5IGluIG1haW4oKSBpbiBnZXRvcHQzMigpLAorCSAqIHdlICptdXN0KiByZXNldCBnZXRvcHQoMyk6ICovCisjaWZkZWYgX19HTElCQ19fCisJb3B0aW5kID0gMDsKKyNlbHNlIC8qIEJTRCBzdHlsZSAqLworCW9wdGluZCA9IDE7CisJLyogb3B0cmVzZXQgPSAxOyAqLworI2VuZGlmCisKKwl3aGlsZSAoMSkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0dFVE9QVF9MT05HCisJCWludCBsb25naW5kZXg7CisJCWludCBvcHQgPSBhbHRlcm5hdGl2ZQorCQkJPyBnZXRvcHRfbG9uZ19vbmx5KGFyZ2MsIGFyZ3YsIG9wdHN0ciwgbG9uZ29wdHMsICZsb25naW5kZXgpCisJCQk6IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsIG9wdHN0ciwgbG9uZ29wdHMsICZsb25naW5kZXgpCisJCTsKKyNlbHNlCisJCWludCBvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgb3B0c3RyKTsKKyNlbmRpZgorCQlpZiAob3B0ID09IC0xKQorCQkJYnJlYWs7CisJCWlmIChvcHQgPT0gJz8nIHx8IG9wdCA9PSAnOicgKQorCQkJZXhpdF9jb2RlID0gMTsKKwkJZWxzZSBpZiAoIXF1aWV0X291dHB1dCkgeworI2lmIEVOQUJMRV9GRUFUVVJFX0dFVE9QVF9MT05HCisJCQlpZiAob3B0ID09IExPTkdfT1BUKSB7CisJCQkJcHJpbnRmKCIgLS0lcyIsIGxvbmdvcHRzW2xvbmdpbmRleF0ubmFtZSk7CisJCQkJaWYgKGxvbmdvcHRzW2xvbmdpbmRleF0uaGFzX2FyZykKKwkJCQkJcHJpbnRmKCIgJXMiLAorCQkJCQkJbm9ybWFsaXplKG9wdGFyZyA/IG9wdGFyZyA6ICIiKSk7CisJCQl9IGVsc2UKKyNlbmRpZgorCQkJaWYgKG9wdCA9PSBOT05fT1BUKQorCQkJCXByaW50ZigiICVzIiwgbm9ybWFsaXplKG9wdGFyZykpOworCQkJZWxzZSB7CisJCQkJY29uc3QgY2hhciAqY2hhcnB0cjsKKwkJCQlwcmludGYoIiAtJWMiLCBvcHQpOworCQkJCWNoYXJwdHIgPSBzdHJjaHIob3B0c3RyLCBvcHQpOworCQkJCWlmIChjaGFycHRyICYmICorK2NoYXJwdHIgPT0gJzonKQorCQkJCQlwcmludGYoIiAlcyIsCisJCQkJCQlub3JtYWxpemUob3B0YXJnID8gb3B0YXJnIDogIiIpKTsKKwkJCX0KKwkJfQorCX0KKworCWlmICghcXVpZXRfb3V0cHV0KSB7CisJCXVuc2lnbmVkIGlkeDsKKwkJcHJpbnRmKCIgLS0iKTsKKwkJaWR4ID0gb3B0aW5kOworCQl3aGlsZSAoYXJndltpZHhdKQorCQkJcHJpbnRmKCIgJXMiLCBub3JtYWxpemUoYXJndltpZHgrK10pKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9CisJcmV0dXJuIGV4aXRfY29kZTsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0dFVE9QVF9MT05HCisvKgorICogUmVnaXN0ZXIgc2V2ZXJhbCBsb25nIG9wdGlvbnMuIG9wdGlvbnMgaXMgYSBzdHJpbmcgb2YgbG9uZyBvcHRpb25zLAorICogc2VwYXJhdGVkIGJ5IGNvbW1hcyBvciB3aGl0ZXNwYWNlLgorICogVGhpcyBudWtlcyBvcHRpb25zIQorICovCitzdGF0aWMgc3RydWN0IG9wdGlvbiAqYWRkX2xvbmdfb3B0aW9ucyhzdHJ1Y3Qgb3B0aW9uICpsb25nX29wdGlvbnMsIGNoYXIgKm9wdGlvbnMpCit7CisJaW50IGxvbmdfbnIgPSAwOworCWludCBhcmdfb3B0LCB0bGVuOworCWNoYXIgKnRva3B0ciA9IHN0cnRvayhvcHRpb25zLCAiLCBcdFxuIik7CisKKwlpZiAobG9uZ19vcHRpb25zKQorCQl3aGlsZSAobG9uZ19vcHRpb25zW2xvbmdfbnJdLm5hbWUpCisJCQlsb25nX25yKys7CisKKwl3aGlsZSAodG9rcHRyKSB7CisJCWFyZ19vcHQgPSBub19hcmd1bWVudDsKKwkJdGxlbiA9IHN0cmxlbih0b2twdHIpOworCQlpZiAodGxlbikgeworCQkJdGxlbi0tOworCQkJaWYgKHRva3B0clt0bGVuXSA9PSAnOicpIHsKKwkJCQlhcmdfb3B0ID0gcmVxdWlyZWRfYXJndW1lbnQ7CisJCQkJaWYgKHRsZW4gJiYgdG9rcHRyW3RsZW4tMV0gPT0gJzonKSB7CisJCQkJCXRsZW4tLTsKKwkJCQkJYXJnX29wdCA9IG9wdGlvbmFsX2FyZ3VtZW50OworCQkJCX0KKwkJCQl0b2twdHJbdGxlbl0gPSAnXDAnOworCQkJCWlmICh0bGVuID09IDApCisJCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJlbXB0eSBsb25nIG9wdGlvbiBzcGVjaWZpZWQiKTsKKwkJCX0KKwkJCWxvbmdfb3B0aW9ucyA9IHhyZWFsbG9jX3ZlY3Rvcihsb25nX29wdGlvbnMsIDQsIGxvbmdfbnIpOworCQkJbG9uZ19vcHRpb25zW2xvbmdfbnJdLmhhc19hcmcgPSBhcmdfb3B0OworCQkJLypsb25nX29wdGlvbnNbbG9uZ19ucl0uZmxhZyA9IE5VTEw7IC0geHJlYWxsb2NfdmVjdG9yIGRpZCBpdCAqLworCQkJbG9uZ19vcHRpb25zW2xvbmdfbnJdLnZhbCA9IExPTkdfT1BUOworCQkJbG9uZ19vcHRpb25zW2xvbmdfbnJdLm5hbWUgPSB4c3RyZHVwKHRva3B0cik7CisJCQlsb25nX25yKys7CisJCQkvKm1lbXNldCgmbG9uZ19vcHRpb25zW2xvbmdfbnJdLCAwLCBzaXplb2YobG9uZ19vcHRpb25zWzBdKSk7IC0geHJlYWxsb2NfdmVjdG9yIGRpZCBpdCAqLworCQl9CisJCXRva3B0ciA9IHN0cnRvayhOVUxMLCAiLCBcdFxuIik7CisJfQorCXJldHVybiBsb25nX29wdGlvbnM7Cit9CisjZW5kaWYKKworc3RhdGljIHZvaWQgc2V0X3NoZWxsKGNvbnN0IGNoYXIgKm5ld19zaGVsbCkKK3sKKwlpZiAoIXN0cmNtcChuZXdfc2hlbGwsICJiYXNoIikgfHwgIXN0cmNtcChuZXdfc2hlbGwsICJzaCIpKQorCQlyZXR1cm47CisJaWYgKCFzdHJjbXAobmV3X3NoZWxsLCAidGNzaCIpIHx8ICFzdHJjbXAobmV3X3NoZWxsLCAiY3NoIikpCisJCW9wdGlvbl9tYXNrMzIgfD0gU0hFTExfSVNfVENTSDsKKwllbHNlCisJCWJiX2Vycm9yX21zZygidW5rbm93biBzaGVsbCAnJXMnLCBhc3N1bWluZyBiYXNoIiwgbmV3X3NoZWxsKTsKK30KKworCisvKiBFeGl0IGNvZGVzOgorICogICAwKSBObyBlcnJvcnMsIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICogICAxKSBnZXRvcHQoMykgcmV0dXJuZWQgYW4gZXJyb3IuCisgKiAgIDIpIEEgcHJvYmxlbSB3aXRoIHBhcmFtZXRlciBwYXJzaW5nIGZvciBnZXRvcHQoMSkuCisgKiAgIDMpIEludGVybmFsIGVycm9yLCBvdXQgb2YgbWVtb3J5CisgKiAgIDQpIFJldHVybmVkIGZvciAtVAorICovCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9HRVRPUFRfTE9ORworc3RhdGljIGNvbnN0IGNoYXIgZ2V0b3B0X2xvbmdvcHRzW10gQUxJR04xID0KKwkib3B0aW9uc1wwIiAgICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJvIgorCSJsb25nb3B0aW9uc1wwIiAgUmVxdWlyZWRfYXJndW1lbnQgImwiCisJInF1aWV0XDAiICAgICAgICBOb19hcmd1bWVudCAgICAgICAicSIKKwkicXVpZXQtb3V0cHV0XDAiIE5vX2FyZ3VtZW50ICAgICAgICJRIgorCSJzaGVsbFwwIiAgICAgICAgUmVxdWlyZWRfYXJndW1lbnQgInMiCisJInRlc3RcMCIgICAgICAgICBOb19hcmd1bWVudCAgICAgICAiVCIKKwkidW5xdW90ZWRcMCIgICAgIE5vX2FyZ3VtZW50ICAgICAgICJ1IgorCSJhbHRlcm5hdGl2ZVwwIiAgTm9fYXJndW1lbnQgICAgICAgImEiCisJIm5hbWVcMCIgICAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAibiIKKwk7CisjZW5kaWYKKworaW50IGdldG9wdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgZ2V0b3B0X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBuOworCWNoYXIgKm9wdHN0ciA9IE5VTEw7CisJY2hhciAqbmFtZSA9IE5VTEw7CisJdW5zaWduZWQgb3B0OworCWNvbnN0IGNoYXIgKmNvbXBhdGlibGU7CisJY2hhciAqc19hcmc7CisjaWYgRU5BQkxFX0ZFQVRVUkVfR0VUT1BUX0xPTkcKKwlzdHJ1Y3Qgb3B0aW9uICpsb25nX29wdGlvbnMgPSBOVUxMOworCWxsaXN0X3QgKmxfYXJnID0gTlVMTDsKKyNlbmRpZgorCisJY29tcGF0aWJsZSA9IGdldGVudigiR0VUT1BUX0NPTVBBVElCTEUiKTsgLyogdXNlZCBhcyB5ZXMvbm8gZmxhZyAqLworCisJaWYgKCFhcmd2WzFdKSB7CisJCWlmIChjb21wYXRpYmxlKSB7CisJCQkvKiBGb3Igc29tZSByZWFzb24sIHRoZSBvcmlnaW5hbCBnZXRvcHQgZ2F2ZSBubyBlcnJvcgorCQkJICogd2hlbiB0aGVyZSB3ZXJlIG5vIGFyZ3VtZW50cy4gKi8KKwkJCXB1dHMoIiAtLSIpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm1pc3Npbmcgb3B0c3RyaW5nIGFyZ3VtZW50Iik7CisJfQorCisJaWYgKGFyZ3ZbMV1bMF0gIT0gJy0nIHx8IGNvbXBhdGlibGUpIHsKKwkJY2hhciAqcyA9IGFyZ3ZbMV07CisKKwkJb3B0aW9uX21hc2szMiB8PSBPUFRfdTsgLyogcXVvdGluZyBvZmYgKi8KKwkJcyA9IHhzdHJkdXAocyArIHN0cnNwbihzLCAiLSsiKSk7CisJCWFyZ3ZbMV0gPSBhcmd2WzBdOworCQlyZXR1cm4gZ2VuZXJhdGVfb3V0cHV0KGFyZ3YrMSwgYXJnYy0xLCBzLCBsb25nX29wdGlvbnMpOworCX0KKworI2lmICFFTkFCTEVfRkVBVFVSRV9HRVRPUFRfTE9ORworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICIrbzpuOnFRczpUdSIsICZvcHRzdHIsICZuYW1lLCAmc19hcmcpOworI2Vsc2UKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gZ2V0b3B0X2xvbmdvcHRzOworCW9wdF9jb21wbGVtZW50YXJ5ID0gImw6OiI7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgIitvOm46cVFzOlR1YWw6IiwKKwkJCQkJJm9wdHN0ciwgJm5hbWUsICZzX2FyZywgJmxfYXJnKTsKKwkvKiBFZmZlY3R1YXRlIHRoZSByZWFkIG9wdGlvbnMgZm9yIHRoZSBhcHBsZXQgaXRzZWxmICovCisJd2hpbGUgKGxfYXJnKSB7CisJCWxvbmdfb3B0aW9ucyA9IGFkZF9sb25nX29wdGlvbnMobG9uZ19vcHRpb25zLCBsbGlzdF9wb3AoJmxfYXJnKSk7CisJfQorI2VuZGlmCisKKwlpZiAob3B0ICYgT1BUX3MpIHsKKwkJc2V0X3NoZWxsKHNfYXJnKTsKKwl9CisKKwlpZiAob3B0ICYgT1BUX1QpIHsKKwkJcmV0dXJuIDQ7CisJfQorCisJLyogQWxsIG9wdGlvbnMgY29udHJvbGxpbmcgdGhlIGFwcGxldCBoYXZlIG5vdyBiZWVuIHBhcnNlZCAqLworCW4gPSBvcHRpbmQgLSAxOworCWlmICghb3B0c3RyKSB7CisJCW9wdHN0ciA9IGFyZ3ZbKytuXTsKKwkJaWYgKCFvcHRzdHIpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibWlzc2luZyBvcHRzdHJpbmcgYXJndW1lbnQiKTsKKwl9CisKKwlhcmd2W25dID0gbmFtZSA/IG5hbWUgOiBhcmd2WzBdOworCXJldHVybiBnZW5lcmF0ZV9vdXRwdXQoYXJndiArIG4sIGFyZ2MgLSBuLCBvcHRzdHIsIGxvbmdfb3B0aW9ucyk7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2hleGR1bXAuYyBiL3V0aWwtbGludXgvaGV4ZHVtcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjN2UyNGYKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L2hleGR1bXAuYwpAQCAtMCwwICsxLDE3MiBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaGV4ZHVtcCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICogQmFzZWQgb24gY29kZSBmcm9tIHV0aWwtbGludXggdiAyLjExbAorICoKKyAqIENvcHlyaWdodCAoYykgMTk4OQorICogVGhlIFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgaGV4ZHVtcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1iY0NkZWZub3N2eCIgSUZfRkVBVFVSRV9IRVhEVU1QX1JFVkVSU0UoIlIiKSAiXSBbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgaGV4ZHVtcF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkRpc3BsYXkgRklMRXMgKG9yIHN0ZGluKSBpbiBhIHVzZXIgc3BlY2lmaWVkIGZvcm1hdFxuIgorLy91c2FnZTogICAgICJcbgktYgkJT25lLWJ5dGUgb2N0YWwgZGlzcGxheSIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJCU9uZS1ieXRlIGNoYXJhY3RlciBkaXNwbGF5IgorLy91c2FnZTogICAgICJcbgktQwkJQ2Fub25pY2FsIGhleCtBU0NJSSwgMTYgYnl0ZXMgcGVyIGxpbmUiCisvL3VzYWdlOiAgICAgIlxuCS1kCQlUd28tYnl0ZSBkZWNpbWFsIGRpc3BsYXkiCisvL3VzYWdlOiAgICAgIlxuCS1lIEZPUk1BVF9TVFJJTkciCisvL3VzYWdlOiAgICAgIlxuCS1mIEZPUk1BVF9GSUxFIgorLy91c2FnZTogICAgICJcbgktbiBMRU5HVEgJSW50ZXJwcmV0IG9ubHkgTEVOR1RIIGJ5dGVzIG9mIGlucHV0IgorLy91c2FnZTogICAgICJcbgktbwkJVHdvLWJ5dGUgb2N0YWwgZGlzcGxheSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMgT0ZGU0VUCVNraXAgT0ZGU0VUIGJ5dGVzIgorLy91c2FnZTogICAgICJcbgktdgkJRGlzcGxheSBhbGwgaW5wdXQgZGF0YSIKKy8vdXNhZ2U6ICAgICAiXG4JLXgJCVR3by1ieXRlIGhleGFkZWNpbWFsIGRpc3BsYXkiCisvL3VzYWdlOglJRl9GRUFUVVJFX0hFWERVTVBfUkVWRVJTRSgKKy8vdXNhZ2U6ICAgICAiXG4JLVIJCVJldmVyc2Ugb2YgJ2hleGR1bXAgLUN2JyIpCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIGhkX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJGSUxFLi4uIgorLy91c2FnZTojZGVmaW5lIGhkX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiaGQgaXMgYW4gYWxpYXMgZm9yIGhleGR1bXAgLUMiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgImR1bXAuaCIKKworLyogVGhpcyBpcyBhIE5PRVhFQyBhcHBsZXQuIEJlIHZlcnkgY2FyZWZ1bCEgKi8KKworc3RhdGljIHZvaWQgYmJfZHVtcF9hZGRmaWxlKGR1bXBlcl90ICpkdW1wZXIsIGNoYXIgKm5hbWUpCit7CisJY2hhciAqcDsKKwlGSUxFICpmcDsKKwljaGFyICpidWY7CisKKwlmcCA9IHhmb3Blbl9mb3JfcmVhZChuYW1lKTsKKwl3aGlsZSAoKGJ1ZiA9IHhtYWxsb2NfZmdldGxpbmUoZnApKSAhPSBOVUxMKSB7CisJCXAgPSBza2lwX3doaXRlc3BhY2UoYnVmKTsKKwkJaWYgKCpwICYmICgqcCAhPSAnIycpKSB7CisJCQliYl9kdW1wX2FkZChkdW1wZXIsIHApOworCQl9CisJCWZyZWUoYnVmKTsKKwl9CisJZmNsb3NlKGZwKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGFkZF9zdHJpbmdzW10gPSB7CisJIlwiJTA3LjdfYXggXCIgMTYvMSBcIiUwM28gXCIgXCJcXG5cIiIsICAgLyogYiAqLworCSJcIiUwNy43X2F4IFwiIDE2LzEgXCIlM19jIFwiIFwiXFxuXCIiLCAgIC8qIGMgKi8KKwkiXCIlMDcuN19heCBcIiA4LzIgXCIgICUwNXUgXCIgXCJcXG5cIiIsICAvKiBkICovCisJIlwiJTA3LjdfYXggXCIgOC8yIFwiICUwNm8gXCIgXCJcXG5cIiIsICAgLyogbyAqLworCSJcIiUwNy43X2F4IFwiIDgvMiBcIiAgICUwNHggXCIgXCJcXG5cIiIsIC8qIHggKi8KK307CisKK3N0YXRpYyBjb25zdCBjaGFyIGFkZF9maXJzdFtdIEFMSUdOMSA9ICJcIiUwNy43X0F4XG5cIiI7CisKK3N0YXRpYyBjb25zdCBjaGFyIGhleGR1bXBfb3B0c1tdIEFMSUdOMSA9ICJiY2RveENlOmY6bjpzOnYiIElGX0ZFQVRVUkVfSEVYRFVNUF9SRVZFUlNFKCJSIik7CisKK2ludCBoZXhkdW1wX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBoZXhkdW1wX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWR1bXBlcl90ICpkdW1wZXIgPSBhbGxvY19kdW1wZXIoKTsKKwljb25zdCBjaGFyICpwOworCWludCBjaDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9IRVhEVU1QX1JFVkVSU0UKKwlGSUxFICpmcDsKKwlzbWFsbGludCByZHVtcCA9IDA7CisjZW5kaWYKKworCWlmIChFTkFCTEVfSEQgJiYgIWFwcGxldF9uYW1lWzJdKSB7IC8qIHdlIGFyZSAiaGQiICovCisJCWNoID0gJ0MnOworCQlnb3RvIGhkX2FwcGxldDsKKwl9CisKKwkvKiBXZSBjYW5ub3QgdXNlIGdldG9wdDMyOiBpbiBoZXhkdW1wIG9wdGlvbnMgYXJlIGN1bXVsYXRpdmUuCisJICogRS5nLiAiaGV4ZHVtcCAtQyAtQyBmaWxlIiBzaG91bGQgZHVtcCBlYWNoIGxpbmUgdHdpY2UgKi8KKwl3aGlsZSAoKGNoID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIGhleGR1bXBfb3B0cykpID4gMCkgeworCQlwID0gc3RyY2hyKGhleGR1bXBfb3B0cywgY2gpOworCQlpZiAoIXApCisJCQliYl9zaG93X3VzYWdlKCk7CisJCWlmICgocCAtIGhleGR1bXBfb3B0cykgPCA1KSB7CisJCQliYl9kdW1wX2FkZChkdW1wZXIsIGFkZF9maXJzdCk7CisJCQliYl9kdW1wX2FkZChkdW1wZXIsIGFkZF9zdHJpbmdzWyhpbnQpKHAgLSBoZXhkdW1wX29wdHMpXSk7CisJCX0KKwkJLyogU2F2ZSBhIGxpdHRsZSBiaXQgb2Ygc3BhY2UgYmVsb3cgYnkgb21pdHRpbmcgdGhlICdlbHNlJ3MuICovCisJCWlmIChjaCA9PSAnQycpIHsKKyBoZF9hcHBsZXQ6CisJCQliYl9kdW1wX2FkZChkdW1wZXIsICJcIiUwOC44X0F4XG5cIiIpOworCQkJYmJfZHVtcF9hZGQoZHVtcGVyLCAiXCIlMDguOF9heCAgXCIgOC8xIFwiJTAyeCBcIiBcIiAgXCIgOC8xIFwiJTAyeCBcIiAiKTsKKwkJCWJiX2R1bXBfYWRkKGR1bXBlciwgIlwiICB8XCIgMTYvMSBcIiVfcFwiIFwifFxcblwiIik7CisJCX0KKwkJaWYgKGNoID09ICdlJykgeworCQkJYmJfZHVtcF9hZGQoZHVtcGVyLCBvcHRhcmcpOworCQl9IC8qIGVsc2UgKi8KKwkJaWYgKGNoID09ICdmJykgeworCQkJYmJfZHVtcF9hZGRmaWxlKGR1bXBlciwgb3B0YXJnKTsKKwkJfSAvKiBlbHNlICovCisJCWlmIChjaCA9PSAnbicpIHsKKwkJCWR1bXBlci0+ZHVtcF9sZW5ndGggPSB4YXRvaV9wb3NpdGl2ZShvcHRhcmcpOworCQl9IC8qIGVsc2UgKi8KKwkJaWYgKGNoID09ICdzJykgeyAvKiBjb21wYXQ6IC1zIGFjY2VwdHMgaGV4IG51bWJlcnMgdG9vICovCisJCQlkdW1wZXItPmR1bXBfc2tpcCA9IHhzdHJ0b3VsbF9yYW5nZV9zZngoCisJCQkJb3B0YXJnLAorCQkJCS8qYmFzZToqLyAwLAorCQkJCS8qbG86Ki8gMCwgLypoaToqLyBPRkZfVF9NQVgsCisJCQkJYmttX3N1ZmZpeGVzCisJCQkpOworCQl9IC8qIGVsc2UgKi8KKwkJaWYgKGNoID09ICd2JykgeworCQkJZHVtcGVyLT5kdW1wX3ZmbGFnID0gQUxMOworCQl9CisjaWYgRU5BQkxFX0ZFQVRVUkVfSEVYRFVNUF9SRVZFUlNFCisJCWlmIChjaCA9PSAnUicpIHsKKwkJCXJkdW1wID0gMTsKKwkJfQorI2VuZGlmCisJfQorCisJaWYgKCFkdW1wZXItPmZzaGVhZCkgeworCQliYl9kdW1wX2FkZChkdW1wZXIsIGFkZF9maXJzdCk7CisJCWJiX2R1bXBfYWRkKGR1bXBlciwgIlwiJTA3LjdfYXggXCIgOC8yIFwiJTA0eCBcIiBcIlxcblwiIik7CisJfQorCisJYXJndiArPSBvcHRpbmQ7CisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfSEVYRFVNUF9SRVZFUlNFCisJcmV0dXJuIGJiX2R1bXBfZHVtcChkdW1wZXIsIGFyZ3YpOworI2Vsc2UKKwlpZiAoIXJkdW1wKSB7CisJCXJldHVybiBiYl9kdW1wX2R1bXAoZHVtcGVyLCBhcmd2KTsKKwl9CisKKwkvKiAtUjogcmV2ZXJzZSBvZiAnaGV4ZHVtcCAtQ3YnICovCisJZnAgPSBzdGRpbjsKKwlpZiAoISphcmd2KSB7CisJCWFyZ3YtLTsKKwkJZ290byBqdW1wX2luOworCX0KKworCWRvIHsKKwkJY2hhciAqYnVmOworCQlmcCA9IHhmb3Blbl9mb3JfcmVhZCgqYXJndik7CisganVtcF9pbjoKKwkJd2hpbGUgKChidWYgPSB4bWFsbG9jX2ZnZXRsaW5lKGZwKSkgIT0gTlVMTCkgeworCQkJcCA9IGJ1ZjsKKwkJCXdoaWxlICgxKSB7CisJCQkJLyogc2tpcCBhZGRyZXNzIG9yIHByZXZpb3VzIGJ5dGUgKi8KKwkJCQl3aGlsZSAoaXN4ZGlnaXQoKnApKSBwKys7CisJCQkJd2hpbGUgKCpwID09ICcgJykgcCsrOworCQkJCS8qICd8JyBjaGFyIHdpbGwgYnJlYWsgdGhlIGxpbmUgKi8KKwkJCQlpZiAoIWlzeGRpZ2l0KCpwKSB8fCBzc2NhbmYocCwgIiV4ICIsICZjaCkgIT0gMSkKKwkJCQkJYnJlYWs7CisJCQkJcHV0Y2hhcihjaCk7CisJCQl9CisJCQlmcmVlKGJ1Zik7CisJCX0KKwkJZmNsb3NlKGZwKTsKKwl9IHdoaWxlICgqKythcmd2KTsKKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKKyNlbmRpZgorfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9od2Nsb2NrLmMgYi91dGlsLWxpbnV4L2h3Y2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzk5OTc3Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9od2Nsb2NrLmMKQEAgLTAsMCArMSwzMzYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgaHdjbG9jayBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb2JlcnQgR3JpZWJsIDxncmllYmxAZ214LmRlPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisqLworCisjaW5jbHVkZSAibGliYmIuaCIKKy8qIEFmdGVyIGxpYmJiLmgsIHNpbmNlIGl0IG5lZWRzIHN5cy90eXBlcy5oIG9uIHNvbWUgc3lzdGVtcyAqLworI2luY2x1ZGUgPHN5cy91dHNuYW1lLmg+CisjaW5jbHVkZSAicnRjXy5oIgorCisvKiBkaWZmIGNvZGUgaXMgZGlzYWJsZWQ6IGl0J3Mgbm90IHN5cy9odyBjbG9jayBkaWZmLCBpdCdzIHNvbWUgdXNlbGVzcworICogInRpbWUgYmV0d2VlbiBod2Nsb2NrIHdhcyBzdGFydGVkIGFuZCB3ZSBzYXcgQ01PUyB0aWNrIiBxdWFudGl0eS4KKyAqIEl0J3MgdXNlbGVzcyBzaW5jZSBod2Nsb2NrIGlzIHN0YXJ0ZWQgYXQgYSByYW5kb20gbW9tZW50LAorICogdGh1cyB0aGUgcXVhbnRpdHkgaXMgYWxzbyByYW5kb20sIHVzZWxlc3MuIFNob3dpbmcgMC4wMDAwMDAgZG9lcyBub3QKKyAqIGRlcHJpdmUgdXMgZnJvbSBhbnkgdXNlZnVsIGluZm8uCisgKgorICogU0hPV19IV0NMT0NLX0RJRkYgY29kZSBpbiB0aGlzIGZpbGUgc2hvd3MgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBzeXN0ZW0KKyAqIGFuZCBodyBjbG9jay4gSXQgaXMgdXNlZnVsLCBidXQgbm90IGNvbXBhdGlibGUgd2l0aCBzdGFuZGFyZCBod2Nsb2NrLgorICogVGh1cyBkaXNhYmxlZC4KKyAqLworI2RlZmluZSBTSE9XX0hXQ0xPQ0tfRElGRiAwCisKKworI2lmICFTSE9XX0hXQ0xPQ0tfRElGRgorIyBkZWZpbmUgcmVhZF9ydGMocHBfcnRjbmFtZSwgc3lzX3R2LCB1dGMpIHJlYWRfcnRjKHBwX3J0Y25hbWUsIHV0YykKKyNlbmRpZgorc3RhdGljIHRpbWVfdCByZWFkX3J0Yyhjb25zdCBjaGFyICoqcHBfcnRjbmFtZSwgc3RydWN0IHRpbWV2YWwgKnN5c190diwgaW50IHV0YykKK3sKKwlzdHJ1Y3QgdG0gdG1fdGltZTsKKwlpbnQgZmQ7CisKKwlmZCA9IHJ0Y194b3BlbihwcF9ydGNuYW1lLCBPX1JET05MWSk7CisKKwlydGNfcmVhZF90bSgmdG1fdGltZSwgZmQpOworCisjaWYgU0hPV19IV0NMT0NLX0RJRkYKKwl7CisJCWludCBiZWZvcmUgPSB0bV90aW1lLnRtX3NlYzsKKwkJd2hpbGUgKDEpIHsKKwkJCXJ0Y19yZWFkX3RtKCZ0bV90aW1lLCBmZCk7CisJCQlnZXR0aW1lb2ZkYXkoc3lzX3R2LCBOVUxMKTsKKwkJCWlmIChiZWZvcmUgIT0gKGludCl0bV90aW1lLnRtX3NlYykKKwkJCQlicmVhazsKKwkJfQorCX0KKyNlbmRpZgorCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShmZCk7CisKKwlyZXR1cm4gcnRjX3RtMnRpbWUoJnRtX3RpbWUsIHV0Yyk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfY2xvY2soY29uc3QgY2hhciAqKnBwX3J0Y25hbWUsIGludCB1dGMpCit7CisjaWYgU0hPV19IV0NMT0NLX0RJRkYKKwlzdHJ1Y3QgdGltZXZhbCBzeXNfdHY7CisjZW5kaWYKKwl0aW1lX3QgdCA9IHJlYWRfcnRjKHBwX3J0Y25hbWUsICZzeXNfdHYsIHV0Yyk7CisKKyNpZiBFTkFCTEVfTE9DQUxFX1NVUFBPUlQKKwkvKiBTdGFuZGFyZCBod2Nsb2NrIHVzZXMgbG9jYWxlLXNwZWNpZmljIG91dHB1dCBmb3JtYXQgKi8KKwljaGFyIGNwWzY0XTsKKwlzdHJ1Y3QgdG0gKnB0bSA9IGxvY2FsdGltZSgmdCk7CisJc3RyZnRpbWUoY3AsIHNpemVvZihjcCksICIlYyIsIHB0bSk7CisjZWxzZQorCWNoYXIgKmNwID0gY3RpbWUoJnQpOworCWNob21wKGNwKTsKKyNlbmRpZgorCisjaWYgIVNIT1dfSFdDTE9DS19ESUZGCisJcHJpbnRmKCIlcyAgMC4wMDAwMDAgc2Vjb25kc1xuIiwgY3ApOworI2Vsc2UKKwl7CisJCWxvbmcgZGlmZiA9IHN5c190di50dl9zZWMgLSB0OworCQlpZiAoZGlmZiA8IDAgLyomJiB0di50dl91c2VjICE9IDAqLykgeworCQkJLyogV2h5IHdlIG5lZWQgZGlmZisrPyAqLworCQkJLyogZGlmZiA+PSAwIGlzIG9rOiB8IGRpZmYgPCAwLCBjYW4ndCBqdXN0IHVzZSB0di50dl91c2VjOiAqLworCQkJLyogICA0NS41MjA4MjAgICAgICB8ICAgNDMuNTIwODIwICovCisJCQkvKiAtIDQ0LjAwMDAwMCAgICAgIHwgLSA0NS4wMDAwMDAgKi8KKwkJCS8qID0gIDEuNTIwODIwICAgICAgfCA9IC0xLjQ3OTE4MCwgbm90IC0yLjUyMDgyMCEgKi8KKwkJCWRpZmYrKzsKKwkJCS8qIFNob3VsZCBiZSAxMDAwMDAwIC0gdHYudHZfdXNlYywgYnV0IHRoZW4gd2UgbXVzdCBjaGVjayB0di50dl91c2VjICE9IDAgKi8KKwkJCXN5c190di50dl91c2VjID0gOTk5OTk5IC0gc3lzX3R2LnR2X3VzZWM7CisJCX0KKwkJcHJpbnRmKCIlcyAgJWxkLiUwNmx1IHNlY29uZHNcbiIsIGNwLCBkaWZmLCAodW5zaWduZWQgbG9uZylzeXNfdHYudHZfdXNlYyk7CisJfQorI2VuZGlmCit9CisKK3N0YXRpYyB2b2lkIHRvX3N5c19jbG9jayhjb25zdCBjaGFyICoqcHBfcnRjbmFtZSwgaW50IHV0YykKK3sKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlzdHJ1Y3QgdGltZXpvbmUgdHo7CisKKwl0ei50el9taW51dGVzd2VzdCA9IHRpbWV6b25lLzYwOworCS8qIF5eXiB1c2VkIHRvIGFsc28gc3VidHJhY3QgNjAqZGF5bGlnaHQsIGJ1dCBpdCdzIHdyb25nOgorCSAqIGRheWxpZ2h0IT0wIG1lYW5zICJ0aGlzIHRpbWV6b25lIGhhcyBzb21lIERTVAorCSAqIGR1cmluZyB0aGUgeWVhciIsIG5vdCAiRFNUIGlzIGluIGVmZmVjdCBub3ciLgorCSAqLworCXR6LnR6X2RzdHRpbWUgPSAwOworCisJdHYudHZfc2VjID0gcmVhZF9ydGMocHBfcnRjbmFtZSwgTlVMTCwgdXRjKTsKKwl0di50dl91c2VjID0gMDsKKwlpZiAoc2V0dGltZW9mZGF5KCZ0diwgJnR6KSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZXR0aW1lb2ZkYXkiKTsKK30KKworc3RhdGljIHZvaWQgZnJvbV9zeXNfY2xvY2soY29uc3QgY2hhciAqKnBwX3J0Y25hbWUsIGludCB1dGMpCit7CisjaWYgMQorCXN0cnVjdCB0aW1ldmFsIHR2OworCXN0cnVjdCB0bSB0bV90aW1lOworCWludCBydGM7CisKKwlydGMgPSBydGNfeG9wZW4ocHBfcnRjbmFtZSwgT19XUk9OTFkpOworCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCS8qIFByZXBhcmUgdG1fdGltZSAqLworCWlmIChzaXplb2YodGltZV90KSA9PSBzaXplb2YodHYudHZfc2VjKSkgeworCQlpZiAodXRjKQorCQkJZ210aW1lX3IoKHRpbWVfdCopJnR2LnR2X3NlYywgJnRtX3RpbWUpOworCQllbHNlCisJCQlsb2NhbHRpbWVfcigodGltZV90KikmdHYudHZfc2VjLCAmdG1fdGltZSk7CisJfSBlbHNlIHsKKwkJdGltZV90IHQgPSB0di50dl9zZWM7CisJCWlmICh1dGMpCisJCQlnbXRpbWVfcigmdCwgJnRtX3RpbWUpOworCQllbHNlCisJCQlsb2NhbHRpbWVfcigmdCwgJnRtX3RpbWUpOworCX0KKyNlbHNlCisvKiBCbG9hdGVkIGNvZGUgd2hpY2ggdHJpZXMgdG8gc2V0IGh3IGNsb2NrIHdpdGggYmV0dGVyIHByZWNpc2lvbi4KKyAqIE9uIHg4NiwgZXZlbiB0aG91Z2ggY29kZSBkb2VzIHNldCBodyBjbG9jayB3aXRoaW4gPDFtcyBvZiBleGFjdAorICogd2hvbGUgc2Vjb25kcywgYXBwYXJlbnRseSBodyBjbG9jayAoYXQgbGVhc3Qgb24gc29tZSBtYWNoaW5lcykKKyAqIGRvZXNuJ3QgcmVzZXQgaW50ZXJuYWwgZnJhY3Rpb25hbCBzZWNvbmRzIHRvIDAsCisgKiBtYWtpbmcgYWxsIHRoaXMgYSBwb2ludGxlc3MgZXhjZXJjaXNlLgorICovCisJLyogSWYgd2Ugc2VlIHRoYXQgd2UgYXJlIE4gdXNlYyBhd2F5IGZyb20gd2hvbGUgc2Vjb25kLAorCSAqIHdlJ2xsIHNsZWVwIGZvciBOLUFESiB1c2Vjcy4gQURKIGNvcnJlY3RzIGZvciB0aGUgZmFjdAorCSAqIHRoYXQgQ1BVIGlzIG5vdCBpbmZpbml0ZWx5IGZhc3QuCisJICogT24gaW5maW5pdGVseSBmYXN0IENQVSwgbmV4dCB3YWtldXAgd291bGQgYmUKKwkgKiBvbiAoZXhhY3RseV9uZXh0X3dob2xlX3NlY29uZCAtIEFESikuIE9uIHJlYWwgQ1BVcywKKwkgKiB0aGlzIGRpZmZlcmVuY2UgYmV0d2VlbiBjdXJyZW50IHRpbWUgYW5kIHdob2xlIHNlY29uZAorCSAqIGlzIGxlc3MgdGhhbiBBREogKGFzc3VtaW5nIHN5c3RlbSBpc24ndCBoZWF2aWx5IGxvYWRlZCkuCisJICovCisJLyogU21hbGwgdmFsdWUgb2YgMjU2dXMgZ2l2ZXMgdmVyeSBwcmVjaXNlIHN5bmMgZm9yIDIrIEdIeiBDUFVzLgorCSAqIFNsb3dlciBDUFVzIHdpbGwgZmFpbCB0byBzeW5jIGFuZCB3aWxsIGdvIHRvIGJpZ2dlcgorCSAqIEFESiB2YWx1ZXMuIHFlbXUtZW11bGF0ZWQgYXJtdjR0bCB3aXRoIH4xMDAgTUh6CisJICogcGVyZm9ybWFuY2UgZW5kcyB1cCB1c2luZyBBREogfj0gNCoxMDI0IGFuZCBpdCB0YWtlcworCSAqIDIrIHNlY3MgKDIgdHJpZXMgd2l0aCBzdWNjZXNzaXZlbHkgbGFyZ2VyIEFESikKKwkgKiB0byBzeW5jLiBFdmVuIHN0cmFjZWQgb25lIG9uIHRoZSBzYW1lIHFlbXUgKHZlcnkgc2xvdykKKwkgKiB0YWtlcyBvbmx5IDQgdHJpZXMuCisJICovCisjZGVmaW5lIFRXRUFLX1VTRUMgMjU2CisJdW5zaWduZWQgYWRqID0gVFdFQUtfVVNFQzsKKwlzdHJ1Y3QgdG0gdG1fdGltZTsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwlpbnQgcnRjID0gcnRjX3hvcGVuKHBwX3J0Y25hbWUsIE9fV1JPTkxZKTsKKworCS8qIFRyeSB0byBjYXRjaCB0aGUgbW9tZW50IHdoZW4gd2hvbGUgc2Vjb25kIGlzIGNsb3NlICovCisJd2hpbGUgKDEpIHsKKwkJdW5zaWduZWQgcmVtX3VzZWM7CisJCXRpbWVfdCB0OworCisJCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCisJCXQgPSB0di50dl9zZWM7CisJCXJlbV91c2VjID0gMTAwMDAwMCAtIHR2LnR2X3VzZWM7CisJCWlmIChyZW1fdXNlYyA8IGFkaikgeworCQkJLyogQ2xvc2UgZW5vdWdoICovCisgc21hbGxfcmVtOgorCQkJdCsrOworCQl9CisKKwkJLyogUHJlcGFyZSB0bV90aW1lIGZyb20gdCAqLworCQlpZiAodXRjKQorCQkJZ210aW1lX3IoJnQsICZ0bV90aW1lKTsgLyogbWF5IHJlYWQgL2V0Yy94eHggKGl0IHRha2VzIHRpbWUpICovCisJCWVsc2UKKwkJCWxvY2FsdGltZV9yKCZ0LCAmdG1fdGltZSk7IC8qIHNhbWUgKi8KKworCQlpZiAoYWRqID49IDMyKjEwMjQpIHsKKwkJCWJyZWFrOyAvKiAzMiBtcyBkaWZmIGFuZCBzdGlsbCBubyBsdWNrPz8gZ2l2ZSB1cCB0cnlpbmcgdG8gc3luYyAqLworCQl9CisKKwkJLyogZ210aW1lL2xvY2FsdGltZSB0b29rIHNvbWUgdGltZSwgcmUtZ2V0IGN1ciB0aW1lICovCisJCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCisJCWlmICh0di50dl9zZWMgPCB0IC8qIHdlIGFyZSBzdGlsbCBpbiBvbGQgc2Vjb25kICovCisJCSB8fCAodHYudHZfc2VjID09IHQgJiYgdHYudHZfdXNlYyA8IGFkaikgLyogbm90IHRvbyBmYXIgaW50byBuZXh0IHNlY29uZCAqLworCQkpIHsKKwkJCWJyZWFrOyAvKiBnb29kLCB3ZSBhcmUgaW4gc3luYyEgKi8KKwkJfQorCisJCXJlbV91c2VjID0gMTAwMDAwMCAtIHR2LnR2X3VzZWM7CisJCWlmIChyZW1fdXNlYyA8IGFkaikgeworCQkJdCA9IHR2LnR2X3NlYzsKKwkJCWdvdG8gc21hbGxfcmVtOyAvKiBhbHJlYWR5IGNsb3NlIHRvIG5leHQgc2VjLCBkb24ndCBzbGVlcCAqLworCQl9CisKKwkJLyogVHJ5IHRvIHN5bmMgdXAgYnkgc2xlZXBpbmcgKi8KKwkJdXNsZWVwKHJlbV91c2VjIC0gYWRqKTsKKworCQkvKiBKdW1wIHRvIDFtcyBkaWZmLCB0aGVuIGluY3JlYXNlIGZhc3QgKHgyKTogRVZFUlkgbG9vcAorCQkgKiB0YWtlcyB+MSBzZWMsIHBlb3BsZSB3b24ndCBsaWtlIHNsb3dseSBjb252ZXJnaW5nIGNvZGUgaGVyZSEKKwkJICovCisJLy9iYl9lcnJvcl9tc2coImFkajolZCB0di50dl91c2VjOiVkIiwgYWRqLCAoaW50KXR2LnR2X3VzZWMpOworCQlpZiAoYWRqIDwgNTEyKQorCQkJYWRqID0gNTEyOworCQkvKiAuLi4gYW5kIGlmIGxhc3QgIm92ZXJzaG9vdCIgZG9lcyBub3QgbG9vayBpbnNhbmVseSBiaWcsCisJCSAqIGp1c3QgdXNlIGl0IGFzIGFkaiBpbmNyZW1lbnQuIFRoaXMgbWFrZXMgY29udmVyZ2VuY2UgZmFzdGVyLgorCQkgKi8KKwkJaWYgKHR2LnR2X3VzZWMgPCBhZGogKiA4KSB7CisJCQlhZGogKz0gdHYudHZfdXNlYzsKKwkJCWNvbnRpbnVlOworCQl9CisJCWFkaiAqPSAyOworCX0KKwkvKiBEZWJ1ZyBhaWQgdG8gZmluZCAib3B0aW1hbCIgVFdFQUtfVVNFQyB3aXRoIG5lYXJseSBleGFjdCBzeW5jLgorCSAqIExvb2sgZm9yIGEgdmFsdWUgd2hpY2ggbWFrZXMgdHZfdXNlYyBjbG9zZSB0byA5OTk5OTkgb3IgMC4KKwkgKiBGb3IgMi4yMEdIeiBJbnRlbCBDb3JlIDI6IG9wdGltYWwgVFdFQUtfVVNFQyB+PSAyMDAKKwkgKi8KKwkvL2JiX2Vycm9yX21zZygidHYudHZfdXNlYzolZCIsIChpbnQpdHYudHZfdXNlYyk7CisjZW5kaWYKKworCXRtX3RpbWUudG1faXNkc3QgPSAwOworCXhpb2N0bChydGMsIFJUQ19TRVRfVElNRSwgJnRtX3RpbWUpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShydGMpOworfQorCisvKgorICogQXQgc3lzdGVtIGJvb3QsIGtlcm5lbCBtYXkgc2V0IHN5c3RlbSB0aW1lIGZyb20gUlRDLAorICogYnV0IGl0IGtub3dzIG5vdGhpbmcgYWJvdXQgdGltZXpvbmVzLiBJZiBSVEMgaXMgaW4gbG9jYWwgdGltZSwKKyAqIHRoZW4gc3lzdGVtIHRpbWUgaXMgd3JvbmcgLSBpdCBpcyBvZmZzZXQgYnkgdGltZXpvbmUuCisgKiBUaGlzIG9wdGlvbiBjb3JyZWN0cyBzeXN0ZW0gdGltZSBpZiBSVEMgaXMgaW4gbG9jYWwgdGltZSwKKyAqIGFuZCAoYWx3YXlzKSBzZXRzIGluLWtlcm5lbCB0aW1lem9uZS4KKyAqCisgKiBUaGlzIGlzIGFuIGFsdGVybmF0ZSBvcHRpb24gdG8gLS1oY3Rvc3lzIHRoYXQgZG9lcyBub3QgcmVhZCB0aGUKKyAqIGhhcmR3YXJlIGNsb2NrLgorICovCitzdGF0aWMgdm9pZCBzZXRfc3lzdGVtX2Nsb2NrX3RpbWV6b25lKGludCB1dGMpCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJc3RydWN0IHRtICpicm9rZW47CisJc3RydWN0IHRpbWV6b25lIHR6OworCisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJYnJva2VuID0gbG9jYWx0aW1lKCZ0di50dl9zZWMpOworCXR6LnR6X21pbnV0ZXN3ZXN0ID0gdGltZXpvbmUgLyA2MDsKKwlpZiAoYnJva2VuLT50bV9pc2RzdCA+IDApCisJCXR6LnR6X21pbnV0ZXN3ZXN0IC09IDYwOworCXR6LnR6X2RzdHRpbWUgPSAwOworCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCWlmICghdXRjKQorCQl0di50dl9zZWMgKz0gdHoudHpfbWludXRlc3dlc3QgKiA2MDsKKwlpZiAoc2V0dGltZW9mZGF5KCZ0diwgJnR6KSkKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJzZXR0aW1lb2ZkYXkiKTsKK30KKworLy91c2FnZTojZGVmaW5lIGh3Y2xvY2tfdHJpdmlhbF91c2FnZQorLy91c2FnZToJSUZfRkVBVFVSRV9IV0NMT0NLX0xPTkdfT1BUSU9OUygKKy8vdXNhZ2U6ICAgICAgICJbLXJ8LS1zaG93XSBbLXN8LS1oY3Rvc3lzXSBbLXd8LS1zeXN0b2hjXSBbLXR8LS1zeXN0el0iCisvL3VzYWdlOiAgICAgICAiIFstbHwtLWxvY2FsdGltZV0gWy11fC0tdXRjXSIKKy8vdXNhZ2U6ICAgICAgICIgWy1mfC0tcnRjIEZJTEVdIgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfSFdDTE9DS19MT05HX09QVElPTlMoCisvL3VzYWdlOiAgICAgICAiWy1yXSBbLXNdIFstd10gWy10XSBbLWxdIFstdV0gWy1mIEZJTEVdIgorLy91c2FnZToJKQorLy91c2FnZTojZGVmaW5lIGh3Y2xvY2tfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJRdWVyeSBhbmQgc2V0IGhhcmR3YXJlIGNsb2NrIChSVEMpXG4iCisvL3VzYWdlOiAgICAgIlxuCS1yCVNob3cgaGFyZHdhcmUgY2xvY2sgdGltZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJU2V0IHN5c3RlbSB0aW1lIGZyb20gaGFyZHdhcmUgY2xvY2siCisvL3VzYWdlOiAgICAgIlxuCS13CVNldCBoYXJkd2FyZSBjbG9jayBmcm9tIHN5c3RlbSB0aW1lIgorLy91c2FnZTogICAgICJcbgktdAlTZXQgaW4ta2VybmVsIHRpbWV6b25lLCBjb3JyZWN0IHN5c3RlbSB0aW1lIgorLy91c2FnZTogICAgICJcbgkJaWYgaGFyZHdhcmUgY2xvY2sgaXMgaW4gbG9jYWwgdGltZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUJQXNzdW1lIGhhcmR3YXJlIGNsb2NrIGlzIGtlcHQgaW4gVVRDIgorLy91c2FnZTogICAgICJcbgktbAlBc3N1bWUgaGFyZHdhcmUgY2xvY2sgaXMga2VwdCBpbiBsb2NhbCB0aW1lIgorLy91c2FnZTogICAgICJcbgktZiBGSUxFCVVzZSBzcGVjaWZpZWQgZGV2aWNlIChlLmcuIC9kZXYvcnRjMikiCisKKyNkZWZpbmUgSFdDTE9DS19PUFRfTE9DQUxUSU1FICAgMHgwMQorI2RlZmluZSBIV0NMT0NLX09QVF9VVEMgICAgICAgICAweDAyCisjZGVmaW5lIEhXQ0xPQ0tfT1BUX1NIT1cgICAgICAgIDB4MDQKKyNkZWZpbmUgSFdDTE9DS19PUFRfSENUT1NZUyAgICAgMHgwOAorI2RlZmluZSBIV0NMT0NLX09QVF9TWVNUT0hDICAgICAweDEwCisjZGVmaW5lIEhXQ0xPQ0tfT1BUX1NZU1RaICAgICAgIDB4MjAKKyNkZWZpbmUgSFdDTE9DS19PUFRfUlRDRklMRSAgICAgMHg0MAorCitpbnQgaHdjbG9ja19tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgaHdjbG9ja19tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqcnRjbmFtZSA9IE5VTEw7CisJdW5zaWduZWQgb3B0OworCWludCB1dGM7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9IV0NMT0NLX0xPTkdfT1BUSU9OUworCXN0YXRpYyBjb25zdCBjaGFyIGh3Y2xvY2tfbG9uZ29wdHNbXSBBTElHTjEgPQorCQkibG9jYWx0aW1lXDAiIE5vX2FyZ3VtZW50ICJsIiAvKiBzaG9ydCBvcHQgaXMgbm9uLXN0YW5kYXJkICovCisJCSJ1dGNcMCIgICAgICAgTm9fYXJndW1lbnQgInUiCisJCSJzaG93XDAiICAgICAgTm9fYXJndW1lbnQgInIiCisJCSJoY3Rvc3lzXDAiICAgTm9fYXJndW1lbnQgInMiCisJCSJzeXN0b2hjXDAiICAgTm9fYXJndW1lbnQgInciCisJCSJzeXN0elwwIiAgICAgTm9fYXJndW1lbnQgInQiIC8qIHNob3J0IG9wdCBpcyBub24tc3RhbmRhcmQgKi8KKwkJInJ0Y1wwIiAgICAgICBSZXF1aXJlZF9hcmd1bWVudCAiZiIKKwkJOworCWFwcGxldF9sb25nX29wdGlvbnMgPSBod2Nsb2NrX2xvbmdvcHRzOworI2VuZGlmCisKKwkvKiBJbml0aWFsaXplICJ0aW1lem9uZSIgKGxpYmMgZ2xvYmFsIHZhcmlhYmxlKSAqLworCXR6c2V0KCk7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICJyLS13c3Q6dy0tcnN0OnMtLXdydDp0LS1yc3c6bC0tdTp1LS1sIjsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAibHVyc3d0ZjoiLCAmcnRjbmFtZSk7CisKKwkvKiBJZiAtdSBvciAtbCB3YXNuJ3QgZ2l2ZW4gY2hlY2sgaWYgd2UgYXJlIHVzaW5nIHV0YyAqLworCWlmIChvcHQgJiAoSFdDTE9DS19PUFRfVVRDIHwgSFdDTE9DS19PUFRfTE9DQUxUSU1FKSkKKwkJdXRjID0gKG9wdCAmIEhXQ0xPQ0tfT1BUX1VUQyk7CisJZWxzZQorCQl1dGMgPSBydGNfYWRqdGltZV9pc191dGMoKTsKKworCWlmIChvcHQgJiBIV0NMT0NLX09QVF9IQ1RPU1lTKQorCQl0b19zeXNfY2xvY2soJnJ0Y25hbWUsIHV0Yyk7CisJZWxzZSBpZiAob3B0ICYgSFdDTE9DS19PUFRfU1lTVE9IQykKKwkJZnJvbV9zeXNfY2xvY2soJnJ0Y25hbWUsIHV0Yyk7CisJZWxzZSBpZiAob3B0ICYgSFdDTE9DS19PUFRfU1lTVFopCisJCXNldF9zeXN0ZW1fY2xvY2tfdGltZXpvbmUodXRjKTsKKwllbHNlCisJCS8qIGRlZmF1bHQgSFdDTE9DS19PUFRfU0hPVyAqLworCQlzaG93X2Nsb2NrKCZydGNuYW1lLCB1dGMpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2lwY3JtLmMgYi91dGlsLWxpbnV4L2lwY3JtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhkODFhZgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvaXBjcm0uYwpAQCAtMCwwICsxLDIyNyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogaXBjcm0uYyAtIHV0aWxpdHkgdG8gYWxsb3cgcmVtb3ZhbCBvZiBJUEMgb2JqZWN0cyBhbmQgZGF0YSBzdHJ1Y3R1cmVzLgorICoKKyAqIDAxIFNlcHQgMjAwNCAtIFJvZG5leSBSYWRmb3JkIDxycmFkZm9yZEBtaW5kc3ByaW5nLmNvbT4KKyAqIEFkYXB0ZWQgZm9yIGJ1c3lib3ggZnJvbSB1dGlsLWxpbnV4LTIuMTJhLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGlwY3JtX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLU1RUyBrZXldIFstbXFzIGlkXSIKKy8vdXNhZ2U6I2RlZmluZSBpcGNybV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlVwcGVyLWNhc2Ugb3B0aW9ucyBNUVMgcmVtb3ZlIGFuIG9iamVjdCBieSBzaG1rZXkgdmFsdWUuXG4iCisvL3VzYWdlOiAgICAgICAiTG93ZXItY2FzZSBvcHRpb25zIHJlbW92ZSBhbiBvYmplY3QgYnkgc2htaWQgdmFsdWUuXG4iCisvL3VzYWdlOiAgICAgIlxuCS1tTQlSZW1vdmUgbWVtb3J5IHNlZ21lbnQgYWZ0ZXIgbGFzdCBkZXRhY2giCisvL3VzYWdlOiAgICAgIlxuCS1xUQlSZW1vdmUgbWVzc2FnZSBxdWV1ZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXNTCVJlbW92ZSBzZW1hcGhvcmUiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisvKiBYL09QRU4gdGVsbHMgdXMgdG8gdXNlIDxzeXMve3R5cGVzLGlwYyxzZW19Lmg+IGZvciBzZW1jdGwoKSAqLworLyogWC9PUEVOIHRlbGxzIHVzIHRvIHVzZSA8c3lzL3t0eXBlcyxpcGMsbXNnfS5oPiBmb3IgbXNnY3RsKCkgKi8KKyNpbmNsdWRlIDxzeXMvaXBjLmg+CisjaW5jbHVkZSA8c3lzL3NobS5oPgorI2luY2x1ZGUgPHN5cy9tc2cuaD4KKyNpbmNsdWRlIDxzeXMvc2VtLmg+CisKKyNpZiBkZWZpbmVkKF9fR05VX0xJQlJBUllfXykgJiYgIWRlZmluZWQoX1NFTV9TRU1VTl9VTkRFRklORUQpCisvKiB1bmlvbiBzZW11biBpcyBkZWZpbmVkIGJ5IGluY2x1ZGluZyA8c3lzL3NlbS5oPiAqLworI2Vsc2UKKy8qIGFjY29yZGluZyB0byBYL09QRU4gd2UgaGF2ZSB0byBkZWZpbmUgaXQgb3Vyc2VsdmVzICovCit1bmlvbiBzZW11biB7CisJaW50IHZhbDsKKwlzdHJ1Y3Qgc2VtaWRfZHMgKmJ1ZjsKKwl1bnNpZ25lZCBzaG9ydCAqYXJyYXk7CisJc3RydWN0IHNlbWluZm8gKl9fYnVmOworfTsKKyNlbmRpZgorCisjZGVmaW5lIElQQ1JNX0xFR0FDWSAxCisKKworI2lmIElQQ1JNX0xFR0FDWQorCit0eXBlZGVmIGVudW0gdHlwZV9pZCB7CisJU0hNLAorCVNFTSwKKwlNU0cKK30gdHlwZV9pZDsKKworc3RhdGljIGludCByZW1vdmVfaWRzKHR5cGVfaWQgdHlwZSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgbG9uZyBpZDsKKwlpbnQgbmJfZXJyb3JzID0gMDsKKwl1bmlvbiBzZW11biBhcmc7CisKKwlhcmcudmFsID0gMDsKKworCXdoaWxlIChhcmd2WzBdKSB7CisJCWlkID0gYmJfc3RydG91bChhcmd2WzBdLCBOVUxMLCAxMCk7CisJCWlmIChlcnJubyB8fCBpZCA+IElOVF9NQVgpIHsKKwkJCWJiX2Vycm9yX21zZygiaW52YWxpZCBpZDogJXMiLCBhcmd2WzBdKTsKKwkJCW5iX2Vycm9ycysrOworCQl9IGVsc2UgeworCQkJaW50IHJldCA9IDA7CisJCQlpZiAodHlwZSA9PSBTRU0pCisJCQkJcmV0ID0gc2VtY3RsKGlkLCAwLCBJUENfUk1JRCwgYXJnKTsKKwkJCWVsc2UgaWYgKHR5cGUgPT0gTVNHKQorCQkJCXJldCA9IG1zZ2N0bChpZCwgSVBDX1JNSUQsIE5VTEwpOworCQkJZWxzZSBpZiAodHlwZSA9PSAgU0hNKQorCQkJCXJldCA9IHNobWN0bChpZCwgSVBDX1JNSUQsIE5VTEwpOworCisJCQlpZiAocmV0KSB7CisJCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgcmVtb3ZlIGlkICVzIiwgYXJndlswXSk7CisJCQkJbmJfZXJyb3JzKys7CisJCQl9CisJCX0KKwkJYXJndisrOworCX0KKworCXJldHVybiBuYl9lcnJvcnM7Cit9CisjZW5kaWYgLyogSVBDUk1fTEVHQUNZICovCisKKworaW50IGlwY3JtX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBpcGNybV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpbnQgYzsKKwlpbnQgZXJyb3IgPSAwOworCisJLyogaWYgdGhlIGNvbW1hbmQgaXMgZXhlY3V0ZWQgd2l0aG91dCBwYXJhbWV0ZXJzLCBkbyBub3RoaW5nICovCisJaWYgKGFyZ2MgPT0gMSkKKwkJcmV0dXJuIDA7CisjaWYgSVBDUk1fTEVHQUNZCisJLyogY2hlY2sgdG8gc2VlIGlmIHRoZSBjb21tYW5kIGlzIGJlaW5nIGludm9rZWQgaW4gdGhlIG9sZCB3YXkgaWYgc28KKwkgICB0aGVuIHJ1biB0aGUgb2xkIGNvZGUuIFZhbGlkIGNvbW1hbmRzIGFyZSBtc2csIHNobSwgc2VtLiAqLworCXsKKwkJdHlwZV9pZCB3aGF0ID0gMDsgLyogc2lsZW5jZSBnY2MgKi8KKwkJY2hhciB3OworCisJCXcgPSBhcmd2WzFdWzBdOworCQlpZiAoICgodyA9PSAnbScgJiYgYXJndlsxXVsxXSA9PSAncycgJiYgYXJndlsxXVsyXSA9PSAnZycpCisJCSAgICAgICB8fCAoYXJndlsxXVswXSA9PSAncycKKwkJICAgICAgICAgICAmJiAoKHcgPSBhcmd2WzFdWzFdKSA9PSAnaCcgfHwgdyA9PSAnZScpCisJCSAgICAgICAgICAgJiYgYXJndlsxXVsyXSA9PSAnbScpCisJCSAgICAgKSAmJiBhcmd2WzFdWzNdID09ICdcMCcKKwkJKSB7CisJCQlpZiAoYXJnYyA8IDMpCisJCQkJYmJfc2hvd191c2FnZSgpOworCisJCQlpZiAodyA9PSAnaCcpCisJCQkJd2hhdCA9IFNITTsKKwkJCWVsc2UgaWYgKHcgPT0gJ20nKQorCQkJCXdoYXQgPSBNU0c7CisJCQllbHNlIGlmICh3ID09ICdlJykKKwkJCQl3aGF0ID0gU0VNOworCisJCQlpZiAocmVtb3ZlX2lkcyh3aGF0LCAmYXJndlsyXSkpCisJCQkJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChFWElUX0ZBSUxVUkUpOworCQkJcHV0cygicmVzb3VyY2UocykgZGVsZXRlZCIpOworCQkJcmV0dXJuIDA7CisJCX0KKwl9CisjZW5kaWYgLyogSVBDUk1fTEVHQUNZICovCisKKwkvKiBwcm9jZXNzIG5ldyBzeW50YXggdG8gY29uZm9ybSB3aXRoIFNZU1YgaXBjcm0gKi8KKwl3aGlsZSAoKGMgPSBnZXRvcHQoYXJnYywgYXJndiwgInE6bTpzOlE6TTpTOmg/IikpICE9IC0xKSB7CisJCWludCByZXN1bHQ7CisJCWludCBpZCA9IDA7CisJCWludCBpc2tleSA9IGlzdXBwZXIoYyk7CisKKwkJLyogbmVlZGVkIHRvIGRlbGV0ZSBzZW1hcGhvcmVzICovCisJCXVuaW9uIHNlbXVuIGFyZzsKKworCQlhcmcudmFsID0gMDsKKworCQlpZiAoKGMgPT0gJz8nKSB8fCAoYyA9PSAnaCcpKSB7CisJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKworCQkvKiB3ZSBkb24ndCBuZWVkIGNhc2UgaW5mb3JtYXRpb24gYW55IG1vcmUgKi8KKwkJYyA9IHRvbG93ZXIoYyk7CisKKwkJLyogbWFrZSBzdXJlIHRoZSBvcHRpb24gaXMgaW4gcmFuZ2U6IGFsbG93ZWQgYXJlIHEsIG0sIHMgKi8KKwkJaWYgKGMgIT0gJ3EnICYmIGMgIT0gJ20nICYmIGMgIT0gJ3MnKSB7CisJCQliYl9zaG93X3VzYWdlKCk7CisJCX0KKworCQlpZiAoaXNrZXkpIHsKKwkJCS8qIGtleXMgYXJlIGluIGhleCBvciBkZWNpbWFsICovCisJCQlrZXlfdCBrZXkgPSB4c3RydG91bChvcHRhcmcsIDApOworCisJCQlpZiAoa2V5ID09IElQQ19QUklWQVRFKSB7CisJCQkJZXJyb3IrKzsKKwkJCQliYl9lcnJvcl9tc2coImlsbGVnYWwga2V5ICglcykiLCBvcHRhcmcpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBjb252ZXJ0IGtleSB0byBpZCAqLworCQkJaWQgPSAoKGMgPT0gJ3EnKSA/IG1zZ2dldChrZXksIDApIDoKKwkJCQkoYyA9PSAnbScpID8gc2htZ2V0KGtleSwgMCwgMCkgOiBzZW1nZXQoa2V5LCAwLCAwKSk7CisKKwkJCWlmIChpZCA8IDApIHsKKwkJCQljb25zdCBjaGFyICplcnJtc2c7CisKKwkJCQllcnJvcisrOworCQkJCXN3aXRjaCAoZXJybm8pIHsKKwkJCQljYXNlIEVBQ0NFUzoKKwkJCQkJZXJybXNnID0gInBlcm1pc3Npb24gZGVuaWVkIGZvciI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRUlEUk06CisJCQkJCWVycm1zZyA9ICJhbHJlYWR5IHJlbW92ZWQiOworCQkJCQlicmVhazsKKwkJCQljYXNlIEVOT0VOVDoKKwkJCQkJZXJybXNnID0gImludmFsaWQiOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQllcnJtc2cgPSAidW5rbm93biBlcnJvciBpbiI7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQliYl9lcnJvcl9tc2coIiVzICVzICglcykiLCBlcnJtc2csICJrZXkiLCBvcHRhcmcpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogaWRzIGFyZSBpbiBkZWNpbWFsICovCisJCQlpZCA9IHhhdG91bChvcHRhcmcpOworCQl9CisKKwkJcmVzdWx0ID0gKChjID09ICdxJykgPyBtc2djdGwoaWQsIElQQ19STUlELCBOVUxMKSA6CisJCQkJKGMgPT0gJ20nKSA/IHNobWN0bChpZCwgSVBDX1JNSUQsIE5VTEwpIDoKKwkJCQlzZW1jdGwoaWQsIDAsIElQQ19STUlELCBhcmcpKTsKKworCQlpZiAocmVzdWx0KSB7CisJCQljb25zdCBjaGFyICplcnJtc2c7CisJCQljb25zdCBjaGFyICpjb25zdCB3aGF0ID0gaXNrZXkgPyAia2V5IiA6ICJpZCI7CisKKwkJCWVycm9yKys7CisJCQlzd2l0Y2ggKGVycm5vKSB7CisJCQljYXNlIEVBQ0NFUzoKKwkJCWNhc2UgRVBFUk06CisJCQkJZXJybXNnID0gInBlcm1pc3Npb24gZGVuaWVkIGZvciI7CisJCQkJYnJlYWs7CisJCQljYXNlIEVJTlZBTDoKKwkJCQllcnJtc2cgPSAiaW52YWxpZCI7CisJCQkJYnJlYWs7CisJCQljYXNlIEVJRFJNOgorCQkJCWVycm1zZyA9ICJhbHJlYWR5IHJlbW92ZWQiOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQllcnJtc2cgPSAidW5rbm93biBlcnJvciBpbiI7CisJCQkJYnJlYWs7CisJCQl9CisJCQliYl9lcnJvcl9tc2coIiVzICVzICglcykiLCBlcnJtc2csIHdoYXQsIG9wdGFyZyk7CisJCQljb250aW51ZTsKKwkJfQorCX0KKworCS8qIHByaW50IHVzYWdlIGlmIHdlIHN0aWxsIGhhdmUgc29tZSBhcmd1bWVudHMgbGVmdCBvdmVyICovCisJaWYgKG9wdGluZCAhPSBhcmdjKSB7CisJCWJiX3Nob3dfdXNhZ2UoKTsKKwl9CisKKwkvKiBleGl0IHZhbHVlIHJlZmxlY3RzIHRoZSBudW1iZXIgb2YgZXJyb3JzIGVuY291bnRlcmVkICovCisJcmV0dXJuIGVycm9yOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9pcGNzLmMgYi91dGlsLWxpbnV4L2lwY3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2EyNWE4Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9pcGNzLmMKQEAgLTAsMCArMSw2MzcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGlwY3MuYyAtLSBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBhbGxvY2F0ZWQgaXBjIHJlc291cmNlcy4KKyAqCisgKiAwMSBTZXB0IDIwMDQgLSBSb2RuZXkgUmFkZm9yZCA8cnJhZGZvcmRAbWluZHNwcmluZy5jb20+CisgKiBBZGFwdGVkIGZvciBidXN5Ym94IGZyb20gdXRpbC1saW51eC0yLjEyYS4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBpcGNzX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbWy1zbXFdIC1pIHNobWlkXSB8IFtbLWFzbXFdIFstdGNwbHVdXSIKKy8vdXNhZ2U6I2RlZmluZSBpcGNzX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1pCVNob3cgc3BlY2lmaWMgcmVzb3VyY2UiCisvL3VzYWdlOiAgICAgIlxuUmVzb3VyY2Ugc3BlY2lmaWNhdGlvbjoiCisvL3VzYWdlOiAgICAgIlxuCS1tCVNoYXJlZCBtZW1vcnkgc2VnbWVudHMiCisvL3VzYWdlOiAgICAgIlxuCS1xCU1lc3NhZ2UgcXVldWVzIgorLy91c2FnZTogICAgICJcbgktcwlTZW1hcGhvcmUgYXJyYXlzIgorLy91c2FnZTogICAgICJcbgktYQlBbGwgKGRlZmF1bHQpIgorLy91c2FnZTogICAgICJcbk91dHB1dCBmb3JtYXQ6IgorLy91c2FnZTogICAgICJcbgktdAlUaW1lIgorLy91c2FnZTogICAgICJcbgktYwlDcmVhdG9yIgorLy91c2FnZTogICAgICJcbgktcAlQaWQiCisvL3VzYWdlOiAgICAgIlxuCS1sCUxpbWl0cyIKKy8vdXNhZ2U6ICAgICAiXG4JLXUJU3VtbWFyeSIKKworLyogWC9PUEVOIHRlbGxzIHVzIHRvIHVzZSA8c3lzL3t0eXBlcyxpcGMsc2VtfS5oPiBmb3Igc2VtY3RsKCkgKi8KKy8qIFgvT1BFTiB0ZWxscyB1cyB0byB1c2UgPHN5cy97dHlwZXMsaXBjLG1zZ30uaD4gZm9yIG1zZ2N0bCgpICovCisvKiBYL09QRU4gdGVsbHMgdXMgdG8gdXNlIDxzeXMve3R5cGVzLGlwYyxzaG19Lmg+IGZvciBzaG1jdGwoKSAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9pcGMuaD4KKyNpbmNsdWRlIDxzeXMvc2VtLmg+CisjaW5jbHVkZSA8c3lzL21zZy5oPgorI2luY2x1ZGUgPHN5cy9zaG0uaD4KKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBTSE1fREVTVCBhbmQgU0hNX0xPQ0tFRCBhcmUgZGVmaW5lZCBpbiBrZXJuZWwgaGVhZGVycywKKyAgIGJ1dCBpbnNpZGUgI2lmZGVmIF9fS0VSTkVMX18gLi4uICNlbmRpZiAqLworI2lmbmRlZiBTSE1fREVTVAorLyogc2htX21vZGUgdXBwZXIgYnl0ZSBmbGFncyAqLworI2RlZmluZSBTSE1fREVTVCAgICAgICAgMDEwMDAJLyogc2VnbWVudCB3aWxsIGJlIGRlc3Ryb3llZCBvbiBsYXN0IGRldGFjaCAqLworI2RlZmluZSBTSE1fTE9DS0VEICAgICAgMDIwMDAJLyogc2VnbWVudCB3aWxsIG5vdCBiZSBzd2FwcGVkICovCisjZW5kaWYKKworLyogRm9yIG9sZGVyIGtlcm5lbHMgdGhlIHNhbWUgaG9sZHMgZm9yIHRoZSBkZWZpbmVzIGJlbG93ICovCisjaWZuZGVmIE1TR19TVEFUCisjZGVmaW5lIE1TR19TVEFUCTExCisjZGVmaW5lIE1TR19JTkZPCTEyCisjZW5kaWYKKworI2lmbmRlZiBTSE1fU1RBVAorI2RlZmluZSBTSE1fU1RBVCAgICAgICAgMTMKKyNkZWZpbmUgU0hNX0lORk8gICAgICAgIDE0CitzdHJ1Y3Qgc2htX2luZm8geworCWludCB1c2VkX2lkczsKKwl1bnNpZ25lZCBsb25nIHNobV90b3Q7CQkvKiB0b3RhbCBhbGxvY2F0ZWQgc2htICovCisJdW5zaWduZWQgbG9uZyBzaG1fcnNzOwkJLyogdG90YWwgcmVzaWRlbnQgc2htICovCisJdW5zaWduZWQgbG9uZyBzaG1fc3dwOwkJLyogdG90YWwgc3dhcHBlZCBzaG0gKi8KKwl1bnNpZ25lZCBsb25nIHN3YXBfYXR0ZW1wdHM7CisJdW5zaWduZWQgbG9uZyBzd2FwX3N1Y2Nlc3NlczsKK307CisjZW5kaWYKKworI2lmbmRlZiBTRU1fU1RBVAorI2RlZmluZSBTRU1fU1RBVAkxOAorI2RlZmluZSBTRU1fSU5GTwkxOQorI2VuZGlmCisKKy8qIFNvbWUgdmVyc2lvbnMgb2YgbGliYyBvbmx5IGRlZmluZSBJUENfSU5GTyB3aGVuIF9fVVNFX0dOVSBpcyBkZWZpbmVkLiAqLworI2lmbmRlZiBJUENfSU5GTworI2RlZmluZSBJUENfSU5GTyAgICAgICAgMworI2VuZGlmCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisvKiBUaGUgbGFzdCBhcmcgb2Ygc2VtY3RsIGlzIGEgdW5pb24gc2VtdW4sIGJ1dCB3aGVyZSBpcyBpdCBkZWZpbmVkPworICAgWC9PUEVOIHRlbGxzIHVzIHRvIGRlZmluZSBpdCBvdXJzZWx2ZXMsIGJ1dCB1bnRpbCByZWNlbnRseQorICAgTGludXggaW5jbHVkZSBmaWxlcyB3b3VsZCBhbHNvIGRlZmluZSBpdC4gKi8KKyNpZiBkZWZpbmVkKF9fR05VX0xJQlJBUllfXykgJiYgIWRlZmluZWQoX1NFTV9TRU1VTl9VTkRFRklORUQpCisvKiB1bmlvbiBzZW11biBpcyBkZWZpbmVkIGJ5IGluY2x1ZGluZyA8c3lzL3NlbS5oPiAqLworI2Vsc2UKKy8qIGFjY29yZGluZyB0byBYL09QRU4gd2UgaGF2ZSB0byBkZWZpbmUgaXQgb3Vyc2VsdmVzICovCit1bmlvbiBzZW11biB7CisJaW50IHZhbDsKKwlzdHJ1Y3Qgc2VtaWRfZHMgKmJ1ZjsKKwl1bnNpZ25lZCBzaG9ydCAqYXJyYXk7CisJc3RydWN0IHNlbWluZm8gKl9fYnVmOworfTsKKyNlbmRpZgorCisvKiBYL09QRU4gKEphbiAxOTg3KSBkb2VzIG5vdCBkZWZpbmUgZmllbGRzIGtleSwgc2VxIGluIHN0cnVjdCBpcGNfcGVybTsKKyAgIGxpYmMgNC81IGRvZXMgbm90IG1lbnRpb24gc3RydWN0IGlwY190ZXJtIGF0IGFsbCwgYnV0IGluY2x1ZGVzCisgICA8bGludXgvaXBjLmg+LCB3aGljaCBkZWZpbmVzIGEgc3RydWN0IGlwY19wZXJtIHdpdGggc3VjaCBmaWVsZHMuCisgICBnbGliYy0xLjA5IGhhcyBubyBzdXBwb3J0IGZvciBzeXN2IGlwYy4KKyAgIGdsaWJjIDIgdXNlcyBfX2tleSwgX19zZXEgKi8KKyNpZiBkZWZpbmVkKF9fR05VX0xJQlJBUllfXykgJiYgX19HTlVfTElCUkFSWV9fID4gMQorI2RlZmluZSBLRVkgX19rZXkKKyNlbHNlCisjZGVmaW5lIEtFWSBrZXkKKyNlbmRpZgorCisjZGVmaW5lIExJTUlUUyAxCisjZGVmaW5lIFNUQVRVUyAyCisjZGVmaW5lIENSRUFUT1IgMworI2RlZmluZSBUSU1FIDQKKyNkZWZpbmUgUElEIDUKKworc3RhdGljIGNoYXIgZm9ybWF0OworCitzdGF0aWMgdm9pZCBwcmludF9wZXJtcyhpbnQgaWQsIHN0cnVjdCBpcGNfcGVybSAqaXBjcCkKK3sKKwlzdHJ1Y3QgcGFzc3dkICpwdzsKKwlzdHJ1Y3QgZ3JvdXAgKmdyOworCisJcHJpbnRmKCIlLTEwZCAlLTEwbyIsIGlkLCBpcGNwLT5tb2RlICYgMDc3Nyk7CisKKwlwdyA9IGdldHB3dWlkKGlwY3AtPmN1aWQpOworCWlmIChwdykJcHJpbnRmKCIgJS0xMHMiLCBwdy0+cHdfbmFtZSk7CisJZWxzZQlwcmludGYoIiAlLTEwZCIsIGlwY3AtPmN1aWQpOworCWdyID0gZ2V0Z3JnaWQoaXBjcC0+Y2dpZCk7CisJaWYgKGdyKQlwcmludGYoIiAlLTEwcyIsIGdyLT5ncl9uYW1lKTsKKwllbHNlCXByaW50ZigiICUtMTBkIiwgaXBjcC0+Y2dpZCk7CisKKwlwdyA9IGdldHB3dWlkKGlwY3AtPnVpZCk7CisJaWYgKHB3KQlwcmludGYoIiAlLTEwcyIsIHB3LT5wd19uYW1lKTsKKwllbHNlCXByaW50ZigiICUtMTBkIiwgaXBjcC0+dWlkKTsKKwlnciA9IGdldGdyZ2lkKGlwY3AtPmdpZCk7CisJaWYgKGdyKQlwcmludGYoIiAlLTEwc1xuIiwgZ3ItPmdyX25hbWUpOworCWVsc2UJcHJpbnRmKCIgJS0xMGRcbiIsIGlwY3AtPmdpZCk7Cit9CisKKworc3RhdGljIE5PSU5MSU5FIHZvaWQgZG9fc2htKHZvaWQpCit7CisJaW50IG1heGlkLCBzaG1pZCwgaWQ7CisJc3RydWN0IHNobWlkX2RzIHNobXNlZzsKKwlzdHJ1Y3Qgc2htX2luZm8gc2htX2luZm87CisJc3RydWN0IHNobWluZm8gc2htaW5mbzsKKwlzdHJ1Y3QgaXBjX3Blcm0gKmlwY3AgPSAmc2htc2VnLnNobV9wZXJtOworCXN0cnVjdCBwYXNzd2QgKnB3OworCisJbWF4aWQgPSBzaG1jdGwoMCwgU0hNX0lORk8sIChzdHJ1Y3Qgc2htaWRfZHMgKikgKHZvaWQgKikgJnNobV9pbmZvKTsKKwlpZiAobWF4aWQgPCAwKSB7CisJCXByaW50Zigia2VybmVsIG5vdCBjb25maWd1cmVkIGZvciAlc1xuIiwgInNoYXJlZCBtZW1vcnkiKTsKKwkJcmV0dXJuOworCX0KKworCXN3aXRjaCAoZm9ybWF0KSB7CisJY2FzZSBMSU1JVFM6CisJCXByaW50ZigiLS0tLS0tIFNoYXJlZCBNZW1vcnkgJXMgLS0tLS0tLS1cbiIsICJMaW1pdHMiKTsKKwkJaWYgKChzaG1jdGwoMCwgSVBDX0lORk8sIChzdHJ1Y3Qgc2htaWRfZHMgKikgKHZvaWQgKikgJnNobWluZm8pKSA8IDApCisJCQlyZXR1cm47CisJCS8qIGdsaWJjIDIuMS4zIGFuZCBhbGwgZWFybGllciBsaWJjJ3MgaGF2ZSBpbnRzIGFzIGZpZWxkcworCQkgKiBvZiBzdHJ1Y3Qgc2htaW5mbzsgZ2xpYmMgMi4xLjkxIGhhcyB1bnNpZ25lZCBsb25nOyBhY2ggKi8KKwkJcHJpbnRmKCJtYXggbnVtYmVyIG9mIHNlZ21lbnRzID0gJWx1XG4iCisJCQkJIm1heCBzZWcgc2l6ZSAoa2J5dGVzKSA9ICVsdVxuIgorCQkJCSJtYXggdG90YWwgc2hhcmVkIG1lbW9yeSAocGFnZXMpID0gJWx1XG4iCisJCQkJIm1pbiBzZWcgc2l6ZSAoYnl0ZXMpID0gJWx1XG4iLAorCQkJCSh1bnNpZ25lZCBsb25nKSBzaG1pbmZvLnNobW1uaSwKKwkJCQkodW5zaWduZWQgbG9uZykgKHNobWluZm8uc2htbWF4ID4+IDEwKSwKKwkJCQkodW5zaWduZWQgbG9uZykgc2htaW5mby5zaG1hbGwsCisJCQkJKHVuc2lnbmVkIGxvbmcpIHNobWluZm8uc2htbWluKTsKKwkJcmV0dXJuOworCisJY2FzZSBTVEFUVVM6CisJCXByaW50ZigiLS0tLS0tIFNoYXJlZCBNZW1vcnkgJXMgLS0tLS0tLS1cbiIsICJTdGF0dXMiKTsKKwkJcHJpbnRmKCJzZWdtZW50cyBhbGxvY2F0ZWQgJWRcbiIKKwkJCQkicGFnZXMgYWxsb2NhdGVkICVsdVxuIgorCQkJCSJwYWdlcyByZXNpZGVudCAgJWx1XG4iCisJCQkJInBhZ2VzIHN3YXBwZWQgICAlbHVcbiIKKwkJCQkiU3dhcCBwZXJmb3JtYW5jZTogJWx1IGF0dGVtcHRzXHQlbHUgc3VjY2Vzc2VzXG4iLAorCQkJCXNobV9pbmZvLnVzZWRfaWRzLAorCQkJCXNobV9pbmZvLnNobV90b3QsCisJCQkJc2htX2luZm8uc2htX3JzcywKKwkJCQlzaG1faW5mby5zaG1fc3dwLAorCQkJCXNobV9pbmZvLnN3YXBfYXR0ZW1wdHMsIHNobV9pbmZvLnN3YXBfc3VjY2Vzc2VzKTsKKwkJcmV0dXJuOworCisJY2FzZSBDUkVBVE9SOgorCQlwcmludGYoIi0tLS0tLSBTaGFyZWQgTWVtb3J5ICVzIC0tLS0tLS0tXG4iLCAiU2VnbWVudCBDcmVhdG9ycy9Pd25lcnMiKTsKKwkJcHJpbnRmKCIlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwcyAlLTEwc1xuIiwKKwkJCQkic2htaWQiLCAicGVybXMiLCAiY3VpZCIsICJjZ2lkIiwgInVpZCIsICJnaWQiKTsKKwkJYnJlYWs7CisKKwljYXNlIFRJTUU6CisJCXByaW50ZigiLS0tLS0tIFNoYXJlZCBNZW1vcnkgJXMgLS0tLS0tLS1cbiIsICJBdHRhY2gvRGV0YWNoL0NoYW5nZSBUaW1lcyIpOworCQlwcmludGYoIiUtMTBzICUtMTBzICUtMjBzICUtMjBzICUtMjBzXG4iLAorCQkJCSJzaG1pZCIsICJvd25lciIsICJhdHRhY2hlZCIsICJkZXRhY2hlZCIsICJjaGFuZ2VkIik7CisJCWJyZWFrOworCisJY2FzZSBQSUQ6CisJCXByaW50ZigiLS0tLS0tIFNoYXJlZCBNZW1vcnkgJXMgLS0tLS0tLS1cbiIsICJDcmVhdG9yL0xhc3Qtb3AiKTsKKwkJcHJpbnRmKCIlLTEwcyAlLTEwcyAlLTEwcyAlLTEwc1xuIiwKKwkJCQkic2htaWQiLCAib3duZXIiLCAiY3BpZCIsICJscGlkIik7CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcHJpbnRmKCItLS0tLS0gU2hhcmVkIE1lbW9yeSAlcyAtLS0tLS0tLVxuIiwgIlNlZ21lbnRzIik7CisJCXByaW50ZigiJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMnNcbiIsCisJCQkJImtleSIsICJzaG1pZCIsICJvd25lciIsICJwZXJtcyIsICJieXRlcyIsICJuYXR0Y2giLAorCQkJCSJzdGF0dXMiKTsKKwkJYnJlYWs7CisJfQorCisJZm9yIChpZCA9IDA7IGlkIDw9IG1heGlkOyBpZCsrKSB7CisJCXNobWlkID0gc2htY3RsKGlkLCBTSE1fU1RBVCwgJnNobXNlZyk7CisJCWlmIChzaG1pZCA8IDApCisJCQljb250aW51ZTsKKwkJaWYgKGZvcm1hdCA9PSBDUkVBVE9SKSB7CisJCQlwcmludF9wZXJtcyhzaG1pZCwgaXBjcCk7CisJCQljb250aW51ZTsKKwkJfQorCQlwdyA9IGdldHB3dWlkKGlwY3AtPnVpZCk7CisJCXN3aXRjaCAoZm9ybWF0KSB7CisJCWNhc2UgVElNRToKKwkJCWlmIChwdykKKwkJCQlwcmludGYoIiUtMTBkICUtMTAuMTBzIiwgc2htaWQsIHB3LT5wd19uYW1lKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiUtMTBkICUtMTBkIiwgc2htaWQsIGlwY3AtPnVpZCk7CisJCQkvKiBjdGltZSB1c2VzIHN0YXRpYyBidWZmZXI6IHVzZSBzZXBhcmF0ZSBjYWxscyAqLworCQkJcHJpbnRmKCIgJS0yMC4xNnMiLCBzaG1zZWcuc2htX2F0aW1lCisJCQkJCT8gY3RpbWUoJnNobXNlZy5zaG1fYXRpbWUpICsgNCA6ICJOb3Qgc2V0Iik7CisJCQlwcmludGYoIiAlLTIwLjE2cyIsIHNobXNlZy5zaG1fZHRpbWUKKwkJCQkJPyBjdGltZSgmc2htc2VnLnNobV9kdGltZSkgKyA0IDogIk5vdCBzZXQiKTsKKwkJCXByaW50ZigiICUtMjAuMTZzXG4iLCBzaG1zZWcuc2htX2N0aW1lCisJCQkJCT8gY3RpbWUoJnNobXNlZy5zaG1fY3RpbWUpICsgNCA6ICJOb3Qgc2V0Iik7CisJCQlicmVhazsKKwkJY2FzZSBQSUQ6CisJCQlpZiAocHcpCisJCQkJcHJpbnRmKCIlLTEwZCAlLTEwLjEwcyIsIHNobWlkLCBwdy0+cHdfbmFtZSk7CisJCQllbHNlCisJCQkJcHJpbnRmKCIlLTEwZCAlLTEwZCIsIHNobWlkLCBpcGNwLT51aWQpOworCQkJcHJpbnRmKCIgJS0xMGQgJS0xMGRcbiIsIHNobXNlZy5zaG1fY3BpZCwgc2htc2VnLnNobV9scGlkKTsKKwkJCWJyZWFrOworCisJCWRlZmF1bHQ6CisJCQlwcmludGYoIjB4JTA4eCAiLCBpcGNwLT5LRVkpOworCQkJaWYgKHB3KQorCQkJCXByaW50ZigiJS0xMGQgJS0xMC4xMHMiLCBzaG1pZCwgcHctPnB3X25hbWUpOworCQkJZWxzZQorCQkJCXByaW50ZigiJS0xMGQgJS0xMGQiLCBzaG1pZCwgaXBjcC0+dWlkKTsKKwkJCXByaW50ZigiICUtMTBvICUtMTBsdSAlLTEwbGQgJS02cyAlLTZzXG4iLCBpcGNwLT5tb2RlICYgMDc3NywKKwkJCQkJLyoKKwkJCQkJICogZWFybGllcjogaW50LCBBdXN0aW4gaGFzIHNpemVfdAorCQkJCQkgKi8KKwkJCQkJKHVuc2lnbmVkIGxvbmcpIHNobXNlZy5zaG1fc2Vnc3osCisJCQkJCS8qCisJCQkJCSAqIGdsaWJjLTIuMS4zIGFuZCBlYXJsaWVyIGhhcyB1bnNpZ25lZCBzaG9ydDsKKwkJCQkJICogQXVzdGluIGhhcyBzaG1hdHRfdAorCQkJCQkgKi8KKwkJCQkJKGxvbmcpIHNobXNlZy5zaG1fbmF0dGNoLAorCQkJCQlpcGNwLT5tb2RlICYgU0hNX0RFU1QgPyAiZGVzdCIgOiAiICIsCisJCQkJCWlwY3AtPm1vZGUgJiBTSE1fTE9DS0VEID8gImxvY2tlZCIgOiAiICIpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworc3RhdGljIE5PSU5MSU5FIHZvaWQgZG9fc2VtKHZvaWQpCit7CisJaW50IG1heGlkLCBzZW1pZCwgaWQ7CisJc3RydWN0IHNlbWlkX2RzIHNlbWFyeTsKKwlzdHJ1Y3Qgc2VtaW5mbyBzZW1pbmZvOworCXN0cnVjdCBpcGNfcGVybSAqaXBjcCA9ICZzZW1hcnkuc2VtX3Blcm07CisJc3RydWN0IHBhc3N3ZCAqcHc7CisJdW5pb24gc2VtdW4gYXJnOworCisJYXJnLmFycmF5ID0gKHVuc2lnbmVkIHNob3J0ICopICh2b2lkICopICZzZW1pbmZvOworCW1heGlkID0gc2VtY3RsKDAsIDAsIFNFTV9JTkZPLCBhcmcpOworCWlmIChtYXhpZCA8IDApIHsKKwkJcHJpbnRmKCJrZXJuZWwgbm90IGNvbmZpZ3VyZWQgZm9yICVzXG4iLCAic2VtYXBob3JlcyIpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChmb3JtYXQpIHsKKwljYXNlIExJTUlUUzoKKwkJcHJpbnRmKCItLS0tLS0gU2VtYXBob3JlICVzIC0tLS0tLS0tXG4iLCAiTGltaXRzIik7CisJCWFyZy5hcnJheSA9ICh1bnNpZ25lZCBzaG9ydCAqKSAodm9pZCAqKSAmc2VtaW5mbzsJLyogZGFtbiB1bmlvbiAqLworCQlpZiAoKHNlbWN0bCgwLCAwLCBJUENfSU5GTywgYXJnKSkgPCAwKQorCQkJcmV0dXJuOworCQlwcmludGYoIm1heCBudW1iZXIgb2YgYXJyYXlzID0gJWRcbiIKKwkJCQkibWF4IHNlbWFwaG9yZXMgcGVyIGFycmF5ID0gJWRcbiIKKwkJCQkibWF4IHNlbWFwaG9yZXMgc3lzdGVtIHdpZGUgPSAlZFxuIgorCQkJCSJtYXggb3BzIHBlciBzZW1vcCBjYWxsID0gJWRcbiIKKwkJCQkic2VtYXBob3JlIG1heCB2YWx1ZSA9ICVkXG4iLAorCQkJCXNlbWluZm8uc2VtbW5pLAorCQkJCXNlbWluZm8uc2VtbXNsLAorCQkJCXNlbWluZm8uc2VtbW5zLCBzZW1pbmZvLnNlbW9wbSwgc2VtaW5mby5zZW12bXgpOworCQlyZXR1cm47CisKKwljYXNlIFNUQVRVUzoKKwkJcHJpbnRmKCItLS0tLS0gU2VtYXBob3JlICVzIC0tLS0tLS0tXG4iLCAiU3RhdHVzIik7CisJCXByaW50ZigidXNlZCBhcnJheXMgPSAlZFxuIgorCQkJCSJhbGxvY2F0ZWQgc2VtYXBob3JlcyA9ICVkXG4iLAorCQkJCXNlbWluZm8uc2VtdXN6LCBzZW1pbmZvLnNlbWFlbSk7CisJCXJldHVybjsKKworCWNhc2UgQ1JFQVRPUjoKKwkJcHJpbnRmKCItLS0tLS0gU2VtYXBob3JlICVzIC0tLS0tLS0tXG4iLCAiQXJyYXlzIENyZWF0b3JzL093bmVycyIpOworCQlwcmludGYoIiUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzXG4iLAorCQkJCSJzZW1pZCIsICJwZXJtcyIsICJjdWlkIiwgImNnaWQiLCAidWlkIiwgImdpZCIpOworCQlicmVhazsKKworCWNhc2UgVElNRToKKwkJcHJpbnRmKCItLS0tLS0gU2hhcmVkIE1lbW9yeSAlcyAtLS0tLS0tLVxuIiwgIk9wZXJhdGlvbi9DaGFuZ2UgVGltZXMiKTsKKwkJcHJpbnRmKCIlLThzICUtMTBzICUtMjYuMjRzICUtMjYuMjRzXG4iLAorCQkJCSJzaG1pZCIsICJvd25lciIsICJsYXN0LW9wIiwgImxhc3QtY2hhbmdlZCIpOworCQlicmVhazsKKworCWNhc2UgUElEOgorCQlicmVhazsKKworCWRlZmF1bHQ6CisJCXByaW50ZigiLS0tLS0tIFNlbWFwaG9yZSAlcyAtLS0tLS0tLVxuIiwgIkFycmF5cyIpOworCQlwcmludGYoIiUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzXG4iLAorCQkJCSJrZXkiLCAic2VtaWQiLCAib3duZXIiLCAicGVybXMiLCAibnNlbXMiKTsKKwkJYnJlYWs7CisJfQorCisJZm9yIChpZCA9IDA7IGlkIDw9IG1heGlkOyBpZCsrKSB7CisJCWFyZy5idWYgPSAoc3RydWN0IHNlbWlkX2RzICopICZzZW1hcnk7CisJCXNlbWlkID0gc2VtY3RsKGlkLCAwLCBTRU1fU1RBVCwgYXJnKTsKKwkJaWYgKHNlbWlkIDwgMCkKKwkJCWNvbnRpbnVlOworCQlpZiAoZm9ybWF0ID09IENSRUFUT1IpIHsKKwkJCXByaW50X3Blcm1zKHNlbWlkLCBpcGNwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXB3ID0gZ2V0cHd1aWQoaXBjcC0+dWlkKTsKKwkJc3dpdGNoIChmb3JtYXQpIHsKKwkJY2FzZSBUSU1FOgorCQkJaWYgKHB3KQorCQkJCXByaW50ZigiJS04ZCAlLTEwLjEwcyIsIHNlbWlkLCBwdy0+cHdfbmFtZSk7CisJCQllbHNlCisJCQkJcHJpbnRmKCIlLThkICUtMTBkIiwgc2VtaWQsIGlwY3AtPnVpZCk7CisJCQkvKiBjdGltZSB1c2VzIHN0YXRpYyBidWZmZXI6IHVzZSBzZXBhcmF0ZSBjYWxscyAqLworCQkJcHJpbnRmKCIgICUtMjYuMjRzIiwgc2VtYXJ5LnNlbV9vdGltZQorCQkJCQk/IGN0aW1lKCZzZW1hcnkuc2VtX290aW1lKSA6ICJOb3Qgc2V0Iik7CisJCQlwcmludGYoIiAlLTI2LjI0c1xuIiwgc2VtYXJ5LnNlbV9jdGltZQorCQkJCQk/IGN0aW1lKCZzZW1hcnkuc2VtX2N0aW1lKSA6ICJOb3Qgc2V0Iik7CisJCQlicmVhazsKKwkJY2FzZSBQSUQ6CisJCQlicmVhazsKKworCQlkZWZhdWx0OgorCQkJcHJpbnRmKCIweCUwOHggIiwgaXBjcC0+S0VZKTsKKwkJCWlmIChwdykKKwkJCQlwcmludGYoIiUtMTBkICUtMTAuOXMiLCBzZW1pZCwgcHctPnB3X25hbWUpOworCQkJZWxzZQorCQkJCXByaW50ZigiJS0xMGQgJS05ZCIsIHNlbWlkLCBpcGNwLT51aWQpOworCQkJcHJpbnRmKCIgJS0xMG8gJS0xMGxkXG4iLCBpcGNwLT5tb2RlICYgMDc3NywKKwkJCQkJLyoKKwkJCQkJICogZ2xpYmMtMi4xLjMgYW5kIGVhcmxpZXIgaGFzIHVuc2lnbmVkIHNob3J0OworCQkJCQkgKiBnbGliYy0yLjEuOTEgaGFzIHZhcmlhdGlvbiBiZXR3ZWVuCisJCQkJCSAqIHVuc2lnbmVkIHNob3J0IGFuZCB1bnNpZ25lZCBsb25nCisJCQkJCSAqIEF1c3RpbiBwcmVzY3JpYmVzIHVuc2lnbmVkIHNob3J0LgorCQkJCQkgKi8KKwkJCQkJKGxvbmcpIHNlbWFyeS5zZW1fbnNlbXMpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKworc3RhdGljIE5PSU5MSU5FIHZvaWQgZG9fbXNnKHZvaWQpCit7CisJaW50IG1heGlkLCBtc3FpZCwgaWQ7CisJc3RydWN0IG1zcWlkX2RzIG1zZ3F1ZTsKKwlzdHJ1Y3QgbXNnaW5mbyBtc2dpbmZvOworCXN0cnVjdCBpcGNfcGVybSAqaXBjcCA9ICZtc2dxdWUubXNnX3Blcm07CisJc3RydWN0IHBhc3N3ZCAqcHc7CisKKwltYXhpZCA9IG1zZ2N0bCgwLCBNU0dfSU5GTywgKHN0cnVjdCBtc3FpZF9kcyAqKSAodm9pZCAqKSAmbXNnaW5mbyk7CisJaWYgKG1heGlkIDwgMCkgeworCQlwcmludGYoImtlcm5lbCBub3QgY29uZmlndXJlZCBmb3IgJXNcbiIsICJtZXNzYWdlIHF1ZXVlcyIpOworCQlyZXR1cm47CisJfQorCisJc3dpdGNoIChmb3JtYXQpIHsKKwljYXNlIExJTUlUUzoKKwkJaWYgKChtc2djdGwoMCwgSVBDX0lORk8sIChzdHJ1Y3QgbXNxaWRfZHMgKikgKHZvaWQgKikgJm1zZ2luZm8pKSA8IDApCisJCQlyZXR1cm47CisJCXByaW50ZigiLS0tLS0tIE1lc3NhZ2UlcyAtLS0tLS0tLVxuIiwgInM6IExpbWl0cyIpOworCQlwcmludGYoIm1heCBxdWV1ZXMgc3lzdGVtIHdpZGUgPSAlZFxuIgorCQkJCSJtYXggc2l6ZSBvZiBtZXNzYWdlIChieXRlcykgPSAlZFxuIgorCQkJCSJkZWZhdWx0IG1heCBzaXplIG9mIHF1ZXVlIChieXRlcykgPSAlZFxuIiwKKwkJCQltc2dpbmZvLm1zZ21uaSwgbXNnaW5mby5tc2dtYXgsIG1zZ2luZm8ubXNnbW5iKTsKKwkJcmV0dXJuOworCisJY2FzZSBTVEFUVVM6CisJCXByaW50ZigiLS0tLS0tIE1lc3NhZ2UlcyAtLS0tLS0tLVxuIiwgInM6IFN0YXR1cyIpOworCQlwcmludGYoImFsbG9jYXRlZCBxdWV1ZXMgPSAlZFxuIgorCQkJCSJ1c2VkIGhlYWRlcnMgPSAlZFxuIgorCQkJCSJ1c2VkIHNwYWNlID0gJWQgYnl0ZXNcbiIsCisJCQkJbXNnaW5mby5tc2dwb29sLCBtc2dpbmZvLm1zZ21hcCwgbXNnaW5mby5tc2d0cWwpOworCQlyZXR1cm47CisKKwljYXNlIENSRUFUT1I6CisJCXByaW50ZigiLS0tLS0tIE1lc3NhZ2UlcyAtLS0tLS0tLVxuIiwgIiBRdWV1ZXM6IENyZWF0b3JzL093bmVycyIpOworCQlwcmludGYoIiUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzICUtMTBzXG4iLAorCQkJCSJtc3FpZCIsICJwZXJtcyIsICJjdWlkIiwgImNnaWQiLCAidWlkIiwgImdpZCIpOworCQlicmVhazsKKworCWNhc2UgVElNRToKKwkJcHJpbnRmKCItLS0tLS0gTWVzc2FnZSVzIC0tLS0tLS0tXG4iLCAiIFF1ZXVlcyBTZW5kL1JlY3YvQ2hhbmdlIFRpbWVzIik7CisJCXByaW50ZigiJS04cyAlLTEwcyAlLTIwcyAlLTIwcyAlLTIwc1xuIiwKKwkJCQkibXNxaWQiLCAib3duZXIiLCAic2VuZCIsICJyZWN2IiwgImNoYW5nZSIpOworCQlicmVhazsKKworCWNhc2UgUElEOgorCQlwcmludGYoIi0tLS0tLSBNZXNzYWdlJXMgLS0tLS0tLS1cbiIsICIgUXVldWVzIFBJRHMiKTsKKwkJcHJpbnRmKCIlLTEwcyAlLTEwcyAlLTEwcyAlLTEwc1xuIiwKKwkJCQkibXNxaWQiLCAib3duZXIiLCAibHNwaWQiLCAibHJwaWQiKTsKKwkJYnJlYWs7CisKKwlkZWZhdWx0OgorCQlwcmludGYoIi0tLS0tLSBNZXNzYWdlJXMgLS0tLS0tLS1cbiIsICIgUXVldWVzIik7CisJCXByaW50ZigiJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMnMgJS0xMnNcbiIsCisJCQkJImtleSIsICJtc3FpZCIsICJvd25lciIsICJwZXJtcyIsICJ1c2VkLWJ5dGVzIiwgIm1lc3NhZ2VzIik7CisJCWJyZWFrOworCX0KKworCWZvciAoaWQgPSAwOyBpZCA8PSBtYXhpZDsgaWQrKykgeworCQltc3FpZCA9IG1zZ2N0bChpZCwgTVNHX1NUQVQsICZtc2dxdWUpOworCQlpZiAobXNxaWQgPCAwKQorCQkJY29udGludWU7CisJCWlmIChmb3JtYXQgPT0gQ1JFQVRPUikgeworCQkJcHJpbnRfcGVybXMobXNxaWQsIGlwY3ApOworCQkJY29udGludWU7CisJCX0KKwkJcHcgPSBnZXRwd3VpZChpcGNwLT51aWQpOworCQlzd2l0Y2ggKGZvcm1hdCkgeworCQljYXNlIFRJTUU6CisJCQlpZiAocHcpCisJCQkJcHJpbnRmKCIlLThkICUtMTAuMTBzIiwgbXNxaWQsIHB3LT5wd19uYW1lKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiUtOGQgJS0xMGQiLCBtc3FpZCwgaXBjcC0+dWlkKTsKKwkJCXByaW50ZigiICUtMjAuMTZzIiwgbXNncXVlLm1zZ19zdGltZQorCQkJCQk/IGN0aW1lKCZtc2dxdWUubXNnX3N0aW1lKSArIDQgOiAiTm90IHNldCIpOworCQkJcHJpbnRmKCIgJS0yMC4xNnMiLCBtc2dxdWUubXNnX3J0aW1lCisJCQkJCT8gY3RpbWUoJm1zZ3F1ZS5tc2dfcnRpbWUpICsgNCA6ICJOb3Qgc2V0Iik7CisJCQlwcmludGYoIiAlLTIwLjE2c1xuIiwgbXNncXVlLm1zZ19jdGltZQorCQkJCQk/IGN0aW1lKCZtc2dxdWUubXNnX2N0aW1lKSArIDQgOiAiTm90IHNldCIpOworCQkJYnJlYWs7CisJCWNhc2UgUElEOgorCQkJaWYgKHB3KQorCQkJCXByaW50ZigiJS04ZCAlLTEwLjEwcyIsIG1zcWlkLCBwdy0+cHdfbmFtZSk7CisJCQllbHNlCisJCQkJcHJpbnRmKCIlLThkICUtMTBkIiwgbXNxaWQsIGlwY3AtPnVpZCk7CisJCQlwcmludGYoIiAgJTVkICAgICAlNWRcbiIsIG1zZ3F1ZS5tc2dfbHNwaWQsIG1zZ3F1ZS5tc2dfbHJwaWQpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCXByaW50ZigiMHglMDh4ICIsIGlwY3AtPktFWSk7CisJCQlpZiAocHcpCisJCQkJcHJpbnRmKCIlLTEwZCAlLTEwLjEwcyIsIG1zcWlkLCBwdy0+cHdfbmFtZSk7CisJCQllbHNlCisJCQkJcHJpbnRmKCIlLTEwZCAlLTEwZCIsIG1zcWlkLCBpcGNwLT51aWQpOworCQkJcHJpbnRmKCIgJS0xMG8gJS0xMmxkICUtMTJsZFxuIiwgaXBjcC0+bW9kZSAmIDA3NzcsCisJCQkJCS8qCisJCQkJCSAqIGdsaWJjLTIuMS4zIGFuZCBlYXJsaWVyIGhhcyB1bnNpZ25lZCBzaG9ydDsKKwkJCQkJICogZ2xpYmMtMi4xLjkxIGhhcyB2YXJpYXRpb24gYmV0d2VlbgorCQkJCQkgKiB1bnNpZ25lZCBzaG9ydCwgdW5zaWduZWQgbG9uZworCQkJCQkgKiBBdXN0aW4gaGFzIG1zZ3FudW1fdAorCQkJCQkgKi8KKwkJCQkJKGxvbmcpIG1zZ3F1ZS5tc2dfY2J5dGVzLCAobG9uZykgbXNncXVlLm1zZ19xbnVtKTsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCisKK3N0YXRpYyB2b2lkIHByaW50X3NobShpbnQgc2htaWQpCit7CisJc3RydWN0IHNobWlkX2RzIHNobWRzOworCXN0cnVjdCBpcGNfcGVybSAqaXBjcCA9ICZzaG1kcy5zaG1fcGVybTsKKworCWlmIChzaG1jdGwoc2htaWQsIElQQ19TVEFULCAmc2htZHMpID09IC0xKSB7CisJCWJiX3BlcnJvcl9tc2coInNobWN0bCIpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRmKCJcblNoYXJlZCBtZW1vcnkgU2VnbWVudCBzaG1pZD0lZFxuIgorCQkJInVpZD0lZFx0Z2lkPSVkXHRjdWlkPSVkXHRjZ2lkPSVkXG4iCisJCQkibW9kZT0lI29cdGFjY2Vzc19wZXJtcz0lI29cbiIKKwkJCSJieXRlcz0lbGRcdGxwaWQ9JWRcdGNwaWQ9JWRcdG5hdHRjaD0lbGRcbiIsCisJCQlzaG1pZCwKKwkJCWlwY3AtPnVpZCwgaXBjcC0+Z2lkLCBpcGNwLT5jdWlkLCBpcGNwLT5jZ2lkLAorCQkJaXBjcC0+bW9kZSwgaXBjcC0+bW9kZSAmIDA3NzcsCisJCQkobG9uZykgc2htZHMuc2htX3NlZ3N6LCBzaG1kcy5zaG1fbHBpZCwgc2htZHMuc2htX2NwaWQsCisJCQkobG9uZykgc2htZHMuc2htX25hdHRjaCk7CisJcHJpbnRmKCJhdHRfdGltZT0lLTI2LjI0c1xuIiwKKwkJCXNobWRzLnNobV9hdGltZSA/IGN0aW1lKCZzaG1kcy5zaG1fYXRpbWUpIDogIk5vdCBzZXQiKTsKKwlwcmludGYoImRldF90aW1lPSUtMjYuMjRzXG4iLAorCQkJc2htZHMuc2htX2R0aW1lID8gY3RpbWUoJnNobWRzLnNobV9kdGltZSkgOiAiTm90IHNldCIpOworCXByaW50ZigiY2hhbmdlX3RpbWU9JS0yNi4yNHNcblxuIiwgY3RpbWUoJnNobWRzLnNobV9jdGltZSkpOworfQorCisKK3N0YXRpYyB2b2lkIHByaW50X21zZyhpbnQgbXNxaWQpCit7CisJc3RydWN0IG1zcWlkX2RzIGJ1ZjsKKwlzdHJ1Y3QgaXBjX3Blcm0gKmlwY3AgPSAmYnVmLm1zZ19wZXJtOworCisJaWYgKG1zZ2N0bChtc3FpZCwgSVBDX1NUQVQsICZidWYpID09IC0xKSB7CisJCWJiX3BlcnJvcl9tc2coIm1zZ2N0bCIpOworCQlyZXR1cm47CisJfQorCisJcHJpbnRmKCJcbk1lc3NhZ2UgUXVldWUgbXNxaWQ9JWRcbiIKKwkJCSJ1aWQ9JWRcdGdpZD0lZFx0Y3VpZD0lZFx0Y2dpZD0lZFx0bW9kZT0lI29cbiIKKwkJCSJjYnl0ZXM9JWxkXHRxYnl0ZXM9JWxkXHRxbnVtPSVsZFx0bHNwaWQ9JWRcdGxycGlkPSVkXG4iLAorCQkJbXNxaWQsIGlwY3AtPnVpZCwgaXBjcC0+Z2lkLCBpcGNwLT5jdWlkLCBpcGNwLT5jZ2lkLCBpcGNwLT5tb2RlLAorCQkJLyoKKwkJCSAqIGdsaWJjLTIuMS4zIGFuZCBlYXJsaWVyIGhhcyB1bnNpZ25lZCBzaG9ydDsKKwkJCSAqIGdsaWJjLTIuMS45MSBoYXMgdmFyaWF0aW9uIGJldHdlZW4KKwkJCSAqIHVuc2lnbmVkIHNob3J0LCB1bnNpZ25lZCBsb25nCisJCQkgKiBBdXN0aW4gaGFzIG1zZ3FudW1fdCAoZm9yIG1zZ19xYnl0ZXMpCisJCQkgKi8KKwkJCShsb25nKSBidWYubXNnX2NieXRlcywgKGxvbmcpIGJ1Zi5tc2dfcWJ5dGVzLAorCQkJKGxvbmcpIGJ1Zi5tc2dfcW51bSwgYnVmLm1zZ19sc3BpZCwgYnVmLm1zZ19scnBpZCk7CisKKwlwcmludGYoInNlbmRfdGltZT0lLTI2LjI0c1xuIiwKKwkJCWJ1Zi5tc2dfc3RpbWUgPyBjdGltZSgmYnVmLm1zZ19zdGltZSkgOiAiTm90IHNldCIpOworCXByaW50ZigicmN2X3RpbWU9JS0yNi4yNHNcbiIsCisJCQlidWYubXNnX3J0aW1lID8gY3RpbWUoJmJ1Zi5tc2dfcnRpbWUpIDogIk5vdCBzZXQiKTsKKwlwcmludGYoImNoYW5nZV90aW1lPSUtMjYuMjRzXG5cbiIsCisJCQlidWYubXNnX2N0aW1lID8gY3RpbWUoJmJ1Zi5tc2dfY3RpbWUpIDogIk5vdCBzZXQiKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc2VtKGludCBzZW1pZCkKK3sKKwlzdHJ1Y3Qgc2VtaWRfZHMgc2VtZHM7CisJc3RydWN0IGlwY19wZXJtICppcGNwID0gJnNlbWRzLnNlbV9wZXJtOworCXVuaW9uIHNlbXVuIGFyZzsKKwl1bnNpZ25lZCBpbnQgaTsKKworCWFyZy5idWYgPSAmc2VtZHM7CisJaWYgKHNlbWN0bChzZW1pZCwgMCwgSVBDX1NUQVQsIGFyZykpIHsKKwkJYmJfcGVycm9yX21zZygic2VtY3RsIik7CisJCXJldHVybjsKKwl9CisKKwlwcmludGYoIlxuU2VtYXBob3JlIEFycmF5IHNlbWlkPSVkXG4iCisJCQkidWlkPSVkXHQgZ2lkPSVkXHQgY3VpZD0lZFx0IGNnaWQ9JWRcbiIKKwkJCSJtb2RlPSUjbywgYWNjZXNzX3Blcm1zPSUjb1xuIgorCQkJIm5zZW1zID0gJWxkXG4iCisJCQkib3RpbWUgPSAlLTI2LjI0c1xuIiwKKwkJCXNlbWlkLAorCQkJaXBjcC0+dWlkLCBpcGNwLT5naWQsIGlwY3AtPmN1aWQsIGlwY3AtPmNnaWQsCisJCQlpcGNwLT5tb2RlLCBpcGNwLT5tb2RlICYgMDc3NywKKwkJCShsb25nKSBzZW1kcy5zZW1fbnNlbXMsCisJCQlzZW1kcy5zZW1fb3RpbWUgPyBjdGltZSgmc2VtZHMuc2VtX290aW1lKSA6ICJOb3Qgc2V0Iik7CisJcHJpbnRmKCJjdGltZSA9ICUtMjYuMjRzXG4iCisJCQkiJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHMgJS0xMHNcbiIsCisJCQljdGltZSgmc2VtZHMuc2VtX2N0aW1lKSwKKwkJCSJzZW1udW0iLCAidmFsdWUiLCAibmNvdW50IiwgInpjb3VudCIsICJwaWQiKTsKKworCWFyZy52YWwgPSAwOworCWZvciAoaSA9IDA7IGkgPCBzZW1kcy5zZW1fbnNlbXM7IGkrKykgeworCQlpbnQgdmFsLCBuY250LCB6Y250LCBwaWQ7CisKKwkJdmFsID0gc2VtY3RsKHNlbWlkLCBpLCBHRVRWQUwsIGFyZyk7CisJCW5jbnQgPSBzZW1jdGwoc2VtaWQsIGksIEdFVE5DTlQsIGFyZyk7CisJCXpjbnQgPSBzZW1jdGwoc2VtaWQsIGksIEdFVFpDTlQsIGFyZyk7CisJCXBpZCA9IHNlbWN0bChzZW1pZCwgaSwgR0VUUElELCBhcmcpOworCQlpZiAodmFsIDwgMCB8fCBuY250IDwgMCB8fCB6Y250IDwgMCB8fCBwaWQgPCAwKSB7CisJCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoInNlbWN0bCIpOworCQl9CisJCXByaW50ZigiJS0xMHUgJS0xMGQgJS0xMGQgJS0xMGQgJS0xMGRcbiIsIGksIHZhbCwgbmNudCwgemNudCwgcGlkKTsKKwl9CisJYmJfcHV0Y2hhcignXG4nKTsKK30KKworaW50IGlwY3NfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGlwY3NfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBpZCA9IDA7CisJdW5zaWduZWQgZmxhZ3MgPSAwOworCXVuc2lnbmVkIG9wdDsKKwljaGFyICpvcHRfaTsKKyNkZWZpbmUgZmxhZ19wcmludAkoMTw8MCkKKyNkZWZpbmUgZmxhZ19tc2cJKDE8PDEpCisjZGVmaW5lIGZsYWdfc2VtCSgxPDwyKQorI2RlZmluZSBmbGFnX3NobQkoMTw8MykKKworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJpOmFxc210Y3BsdSIsICZvcHRfaSk7CisJaWYgKG9wdCAmIDB4MSkgeyAvLyAtaQorCQlpZCA9IHhhdG9pKG9wdF9pKTsKKwkJZmxhZ3MgfD0gZmxhZ19wcmludDsKKwl9CisJaWYgKG9wdCAmIDB4MikgZmxhZ3MgfD0gZmxhZ19tc2cgfCBmbGFnX3NlbSB8IGZsYWdfc2htOyAvLyAtYQorCWlmIChvcHQgJiAweDQpIGZsYWdzIHw9IGZsYWdfbXNnOyAvLyAtcQorCWlmIChvcHQgJiAweDgpIGZsYWdzIHw9IGZsYWdfc2VtOyAvLyAtcworCWlmIChvcHQgJiAweDEwKSBmbGFncyB8PSBmbGFnX3NobTsgLy8gLW0KKwlpZiAob3B0ICYgMHgyMCkgZm9ybWF0ID0gVElNRTsgLy8gLXQKKwlpZiAob3B0ICYgMHg0MCkgZm9ybWF0ID0gQ1JFQVRPUjsgLy8gLWMKKwlpZiAob3B0ICYgMHg4MCkgZm9ybWF0ID0gUElEOyAvLyAtcAorCWlmIChvcHQgJiAweDEwMCkgZm9ybWF0ID0gTElNSVRTOyAvLyAtbAorCWlmIChvcHQgJiAweDIwMCkgZm9ybWF0ID0gU1RBVFVTOyAvLyAtdQorCisJaWYgKGZsYWdzICYgZmxhZ19wcmludCkgeworCQlpZiAoZmxhZ3MgJiBmbGFnX3NobSkgeworCQkJcHJpbnRfc2htKGlkKTsKKwkJCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKKwkJfQorCQlpZiAoZmxhZ3MgJiBmbGFnX3NlbSkgeworCQkJcHJpbnRfc2VtKGlkKTsKKwkJCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKKwkJfQorCQlpZiAoZmxhZ3MgJiBmbGFnX21zZykgeworCQkJcHJpbnRfbXNnKGlkKTsKKwkJCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQoRVhJVF9TVUNDRVNTKTsKKwkJfQorCQliYl9zaG93X3VzYWdlKCk7CisJfQorCisJaWYgKCEoZmxhZ3MgJiAoZmxhZ19zaG0gfCBmbGFnX21zZyB8IGZsYWdfc2VtKSkpCisJCWZsYWdzIHw9IGZsYWdfbXNnIHwgZmxhZ19zaG0gfCBmbGFnX3NlbTsKKwliYl9wdXRjaGFyKCdcbicpOworCisJaWYgKGZsYWdzICYgZmxhZ19zaG0pIHsKKwkJZG9fc2htKCk7CisJCWJiX3B1dGNoYXIoJ1xuJyk7CisJfQorCWlmIChmbGFncyAmIGZsYWdfc2VtKSB7CisJCWRvX3NlbSgpOworCQliYl9wdXRjaGFyKCdcbicpOworCX0KKwlpZiAoZmxhZ3MgJiBmbGFnX21zZykgeworCQlkb19tc2coKTsKKwkJYmJfcHV0Y2hhcignXG4nKTsKKwl9CisJZmZsdXNoX3N0ZG91dF9hbmRfZXhpdChFWElUX1NVQ0NFU1MpOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9sb3NldHVwLmMgYi91dGlsLWxpbnV4L2xvc2V0dXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDUwYjVhCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9sb3NldHVwLmMKQEAgLTAsMCArMSwxMjYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgbG9zZXR1cCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMiAgTWF0dCBLcmFhaS4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBsb3NldHVwX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLXJdIFstbyBPRlNdIHstZnxMT09QREVWfSBGSUxFIC0gYXNzb2NpYXRlIGxvb3AgZGV2aWNlc1xuIgorLy91c2FnZTogICAgICAgIglsb3NldHVwIC1kIExPT1BERVYgLSBkaXNhc3NvY2lhdGVcbiIKKy8vdXNhZ2U6ICAgICAgICIJbG9zZXR1cCAtYSAtIHNob3cgc3RhdHVzXG4iCisvL3VzYWdlOiAgICAgICAiCWxvc2V0dXAgLWYgLSBzaG93IG5leHQgZnJlZSBsb29wIGRldmljZSIKKy8vdXNhZ2U6I2RlZmluZSBsb3NldHVwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiCS1vIE9GUwlTdGFydCBPRlMgYnl0ZXMgaW50byBGSUxFIgorLy91c2FnZTogICAgICJcbgktcglSZWFkLW9ubHkiCisvL3VzYWdlOiAgICAgIlxuCS1mCVNob3cvdXNlIG5leHQgZnJlZSBsb29wIGRldmljZSIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbG9zZXR1cF9ub3Rlc191c2FnZQorLy91c2FnZTogICAgICAgIk9uZSBhcmd1bWVudCAobG9zZXR1cCAvZGV2L2xvb3AxKSB3aWxsIGRpc3BsYXkgdGhlIGN1cnJlbnQgYXNzb2NpYXRpb25cbiIKKy8vdXNhZ2U6ICAgICAgICIoaWYgYW55KSwgb3IgZGlzYXNzb2NpYXRlIGl0ICh3aXRoIC1kKS4gVGhlIGRpc3BsYXkgc2hvd3MgdGhlIG9mZnNldFxuIgorLy91c2FnZTogICAgICAgImFuZCBmaWxlbmFtZSBvZiB0aGUgZmlsZSB0aGUgbG9vcCBkZXZpY2UgaXMgY3VycmVudGx5IGJvdW5kIHRvLlxuXG4iCisvL3VzYWdlOiAgICAgICAiVHdvIGFyZ3VtZW50cyAobG9zZXR1cCAvZGV2L2xvb3AxIGZpbGUuaW1nKSBjcmVhdGUgYSBuZXcgYXNzb2NpYXRpb24sXG4iCisvL3VzYWdlOiAgICAgICAid2l0aCBhbiBvcHRpb25hbCBvZmZzZXQgKC1vIDEyMzQ1KS4gRW5jcnlwdGlvbiBpcyBub3QgeWV0IHN1cHBvcnRlZC5cbiIKKy8vdXNhZ2U6ICAgICAgICJsb3NldHVwIC1mIHdpbGwgc2hvdyB0aGUgZmlyc3QgbG9vcCBmcmVlIGxvb3AgZGV2aWNlXG5cbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKy8qIDEwNDg1NzUgaXMgYSBtYXggcG9zc2libGUgbWlub3IgbnVtYmVyIGluIExpbnV4IGNpcmNhIDIwMTAgKi8KKy8qIGZvciBub3cgdXNlIHNvbWV0aGluZyBsZXNzIGV4dHJlbWUgKi8KKyNkZWZpbmUgTUFYX0xPT1BfTlVNIDEwMjMKKworaW50IGxvc2V0dXBfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGxvc2V0dXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIG9wdDsKKwljaGFyICpvcHRfbzsKKwljaGFyIGRldltMT09QX05BTUVTSVpFXTsKKwllbnVtIHsKKwkJT1BUX2QgPSAoMSA8PCAwKSwKKwkJT1BUX28gPSAoMSA8PCAxKSwKKwkJT1BUX2YgPSAoMSA8PCAyKSwKKwkJT1BUX2EgPSAoMSA8PCAzKSwKKwkJT1BUX3IgPSAoMSA8PCA0KSwgLyogbXVzdCBiZSBsYXN0ICovCisJfTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIj8yOmQtLW9mYXI6YS0tb2ZyIjsKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCAiZG86ZmFyIiwgJm9wdF9vKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCS8qIExPT1BERVYgKi8KKwlpZiAoIW9wdCAmJiBhcmd2WzBdICYmICFhcmd2WzFdKSB7CisJCWNoYXIgKnM7CisKKwkJcyA9IHF1ZXJ5X2xvb3AoYXJndlswXSk7CisJCWlmICghcykKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUoYXJndlswXSk7CisJCXByaW50ZigiJXM6ICVzXG4iLCBhcmd2WzBdLCBzKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZnJlZShzKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwkvKiAtZCBMT09QREVWICovCisJaWYgKG9wdCA9PSBPUFRfZCAmJiBhcmd2WzBdKSB7CisJCWlmIChkZWxfbG9vcChhcmd2WzBdKSkKKwkJCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUoYXJndlswXSk7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJLyogLWEgKi8KKwlpZiAob3B0ID09IE9QVF9hKSB7CisJCWludCBuOworCQlmb3IgKG4gPSAwOyBuIDwgTUFYX0xPT1BfTlVNOyBuKyspIHsKKwkJCWNoYXIgKnM7CisKKwkJCXNwcmludGYoZGV2LCBMT09QX0ZPUk1BVCwgbik7CisJCQlzID0gcXVlcnlfbG9vcChkZXYpOworCQkJaWYgKHMpIHsKKwkJCQlwcmludGYoIiVzOiAlc1xuIiwgZGV2LCBzKTsKKwkJCQlmcmVlKHMpOworCQkJfQorCQl9CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJLyogY29udGFpbnMgLWYgKi8KKwlpZiAob3B0ICYgT1BUX2YpIHsKKwkJY2hhciAqczsKKwkJaW50IG4gPSAwOworCisJCWRvIHsKKwkJCWlmIChuID4gTUFYX0xPT1BfTlVNKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyBmcmVlIGxvb3AgZGV2aWNlcyIpOworCQkJc3ByaW50ZihkZXYsIExPT1BfRk9STUFULCBuKyspOworCQkJcyA9IHF1ZXJ5X2xvb3AoZGV2KTsKKwkJCWZyZWUocyk7CisJCX0gd2hpbGUgKHMpOworCQkvKiBub3c6IGRldiBpcyBuZXh0IGZyZWUgIi9kZXYvbG9vcE4iICovCisJCWlmICgob3B0ID09IE9QVF9mKSAmJiAhYXJndlswXSkgeworCQkJcHV0cyhkZXYpOworCQkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwkJfQorCX0KKworCS8qIFstcl0gWy1vIE9GU10gey1mfExPT1BERVZ9IEZJTEUgKi8KKwlpZiAoYXJndlswXSAmJiAoKG9wdCAmIE9QVF9mKSB8fCBhcmd2WzFdKSkgeworCQl1bnNpZ25lZCBsb25nIGxvbmcgb2Zmc2V0ID0gMDsKKwkJY2hhciAqZCA9IGRldjsKKworCQlpZiAob3B0ICYgT1BUX28pCisJCQlvZmZzZXQgPSB4YXRvdWxsKG9wdF9vKTsKKwkJaWYgKCEob3B0ICYgT1BUX2YpKQorCQkJZCA9ICphcmd2Kys7CisKKwkJaWYgKGFyZ3ZbMF0pIHsKKwkJCWlmIChzZXRfbG9vcCgmZCwgYXJndlswXSwgb2Zmc2V0LCAob3B0ICYgT1BUX3IpKSA8IDApCisJCQkJYmJfc2ltcGxlX3BlcnJvcl9tc2dfYW5kX2RpZShhcmd2WzBdKTsKKwkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCX0KKwl9CisKKwliYl9zaG93X3VzYWdlKCk7IC8qIGRvZXMgbm90IHJldHVybiAqLworCS8qcmV0dXJuIEVYSVRfRkFJTFVSRTsqLworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9sc3BjaS5jIGIvdXRpbC1saW51eC9sc3BjaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxNDY3OGEKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L2xzcGNpLmMKQEAgLTAsMCArMSwxMTIgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIGxzcGNpIGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBNYWxlayBEZWdhY2hpIDxtYWxlay1kZWdhY2hpQGxhcG9zdGUubmV0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIGxzcGNpX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLW1rXSIKKy8vdXNhZ2U6I2RlZmluZSBsc3BjaV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkxpc3QgYWxsIFBDSSBkZXZpY2VzIgorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLW0JUGFyc2FibGUgb3V0cHV0IgorLy91c2FnZTogICAgICJcbgktawlTaG93IGRyaXZlciIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2VudW0geworCU9QVF9tID0gKDEgPDwgMCksCisJT1BUX2sgPSAoMSA8PCAxKSwKK307CisKKy8qCisgKiBQQ0lfU0xPVF9OQU1FIFBDSV9DTEFTUzogUENJX1ZJRDpQQ0lfRElEIFtQQ0lfU1VCU1lTX1ZJRDpQQ0lfU1VCU1lTX0RJRF0gW0RSSVZFUl0KKyAqLworc3RhdGljIGludCBGQVNUX0ZVTkMgZmlsZUFjdGlvbigKKwkJY29uc3QgY2hhciAqZmlsZU5hbWUsCisJCXN0cnVjdCBzdGF0ICpzdGF0YnVmIFVOVVNFRF9QQVJBTSwKKwkJdm9pZCAqdXNlckRhdGEgVU5VU0VEX1BBUkFNLAorCQlpbnQgZGVwdGggVU5VU0VEX1BBUkFNKQoreworCXBhcnNlcl90ICpwYXJzZXI7CisJY2hhciAqdG9rZW5zWzNdOworCWNoYXIgKnBjaV9zbG90X25hbWUgPSBOVUxMLCAqZHJpdmVyID0gTlVMTDsKKwlpbnQgcGNpX2NsYXNzID0gMCwgcGNpX3ZpZCA9IDAsIHBjaV9kaWQgPSAwOworCWludCBwY2lfc3Vic3lzX3ZpZCA9IDAsIHBjaV9zdWJzeXNfZGlkID0gMDsKKworCWNoYXIgKnVldmVudF9maWxlbmFtZSA9IGNvbmNhdF9wYXRoX2ZpbGUoZmlsZU5hbWUsICIvdWV2ZW50Iik7CisJcGFyc2VyID0gY29uZmlnX29wZW4yKHVldmVudF9maWxlbmFtZSwgZm9wZW5fZm9yX3JlYWQpOworCWZyZWUodWV2ZW50X2ZpbGVuYW1lKTsKKworCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRva2VucywgMywgMiwgIlwwOj0iLCBQQVJTRV9OT1JNQUwpKSB7CisJCWlmIChzdHJjbXAodG9rZW5zWzBdLCAiRFJJVkVSIikgPT0gMCkgeworCQkJZHJpdmVyID0geHN0cmR1cCh0b2tlbnNbMV0pOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc3RyY21wKHRva2Vuc1swXSwgIlBDSV9DTEFTUyIpID09IDApIHsKKwkJCXBjaV9jbGFzcyA9IHhzdHJ0b3UodG9rZW5zWzFdLCAxNik+Pjg7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChzdHJjbXAodG9rZW5zWzBdLCAiUENJX0lEIikgPT0gMCkgeworCQkJcGNpX3ZpZCA9IHhzdHJ0b3UodG9rZW5zWzFdLCAxNik7CisJCQlwY2lfZGlkID0geHN0cnRvdSh0b2tlbnNbMl0sIDE2KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHN0cmNtcCh0b2tlbnNbMF0sICJQQ0lfU1VCU1lTX0lEIikgPT0gMCkgeworCQkJcGNpX3N1YnN5c192aWQgPSB4c3RydG91KHRva2Vuc1sxXSwgMTYpOworCQkJcGNpX3N1YnN5c19kaWQgPSB4c3RydG91KHRva2Vuc1syXSwgMTYpOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAoc3RyY21wKHRva2Vuc1swXSwgIlBDSV9TTE9UX05BTUUiKSA9PSAwKSB7CisJCQlwY2lfc2xvdF9uYW1lID0geHN0cmR1cCh0b2tlbnNbMl0pOworCQkJY29udGludWU7CisJCX0KKwl9CisJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisKKworCWlmIChvcHRpb25fbWFzazMyICYgT1BUX20pIHsKKwkJcHJpbnRmKCIlcyBcIkNsYXNzICUwNHhcIiBcIiUwNHhcIiBcIiUwNHhcIiBcIiUwNHhcIiBcIiUwNHhcIiIsCisJCQlwY2lfc2xvdF9uYW1lLCBwY2lfY2xhc3MsIHBjaV92aWQsIHBjaV9kaWQsCisJCQlwY2lfc3Vic3lzX3ZpZCwgcGNpX3N1YnN5c19kaWQpOworCX0gZWxzZSB7CisJCXByaW50ZigiJXMgQ2xhc3MgJTA0eDogJTA0eDolMDR4IiwKKwkJCXBjaV9zbG90X25hbWUsIHBjaV9jbGFzcywgcGNpX3ZpZCwgcGNpX2RpZCk7CisJfQorCisJaWYgKChvcHRpb25fbWFzazMyICYgT1BUX2spICYmIGRyaXZlcikgeworCQlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9tKSB7CisJCQlwcmludGYoIiBcIiVzXCIiLCBkcml2ZXIpOworCQl9IGVsc2UgeworCQkJcHJpbnRmKCIgJXMiLCBkcml2ZXIpOworCQl9CisJfQorCWJiX3B1dGNoYXIoJ1xuJyk7CisKKwlmcmVlKGRyaXZlcik7CisJZnJlZShwY2lfc2xvdF9uYW1lKTsKKworCXJldHVybiBUUlVFOworfQorCitpbnQgbHNwY2lfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IGxzcGNpX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlnZXRvcHQzMihhcmd2LCAibSIgLypub24tY29tcGF0OiovICJrIiAvKmlnbm9yZWQ6Ki8gIm52Iik7CisKKwlyZWN1cnNpdmVfYWN0aW9uKCIvc3lzL2J1cy9wY2kvZGV2aWNlcyIsCisJCQlBQ1RJT05fUkVDVVJTRSwKKwkJCWZpbGVBY3Rpb24sCisJCQlOVUxMLCAvKiBkaXJBY3Rpb24gKi8KKwkJCU5VTEwsIC8qIHVzZXJEYXRhICovCisJCQkwIC8qIGRlcHRoICovKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L2xzdXNiLmMgYi91dGlsLWxpbnV4L2xzdXNiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQwZjIxZQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvbHN1c2IuYwpAQCAtMCwwICsxLDc1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBsc3VzYiBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgTWFsZWsgRGVnYWNoaSA8bWFsZWstZGVnYWNoaUBsYXBvc3RlLm5ldD4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBsc3VzYl90cml2aWFsX3VzYWdlIE5PVVNBR0VfU1RSCisvL3VzYWdlOiNkZWZpbmUgbHN1c2JfZnVsbF91c2FnZSAiIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworc3RhdGljIGludCBGQVNUX0ZVTkMgZmlsZUFjdGlvbigKKwkJY29uc3QgY2hhciAqZmlsZU5hbWUsCisJCXN0cnVjdCBzdGF0ICpzdGF0YnVmIFVOVVNFRF9QQVJBTSwKKwkJdm9pZCAqdXNlckRhdGEgVU5VU0VEX1BBUkFNLAorCQlpbnQgZGVwdGggVU5VU0VEX1BBUkFNKQoreworCXBhcnNlcl90ICpwYXJzZXI7CisJY2hhciAqdG9rZW5zWzRdOworCWNoYXIgKmJ1c251bSA9IE5VTEwsICpkZXZudW0gPSBOVUxMOworCWludCBwcm9kdWN0X3ZpZCA9IDAsIHByb2R1Y3RfZGlkID0gMDsKKwljaGFyICp1ZXZlbnRfZmlsZW5hbWUgPSBjb25jYXRfcGF0aF9maWxlKGZpbGVOYW1lLCAiL3VldmVudCIpOworCisJcGFyc2VyID0gY29uZmlnX29wZW4yKHVldmVudF9maWxlbmFtZSwgZm9wZW5fZm9yX3JlYWQpOworCWZyZWUodWV2ZW50X2ZpbGVuYW1lKTsKKworCXdoaWxlIChjb25maWdfcmVhZChwYXJzZXIsIHRva2VucywgNCwgMiwgIlxcLz0iLCBQQVJTRV9OT1JNQUwpKSB7CisJCWlmICgocGFyc2VyLT5saW5lbm8gPT0gMSkgJiYgc3RyY21wKHRva2Vuc1swXSwgIkRFVlRZUEUiKSA9PSAwKSB7CisJCQlicmVhazsKKwkJfQorCisJCWlmIChzdHJjbXAodG9rZW5zWzBdLCAiUFJPRFVDVCIpID09IDApIHsKKwkJCXByb2R1Y3RfdmlkID0geHN0cnRvdSh0b2tlbnNbMV0sIDE2KTsKKwkJCXByb2R1Y3RfZGlkID0geHN0cnRvdSh0b2tlbnNbMl0sIDE2KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHN0cmNtcCh0b2tlbnNbMF0sICJCVVNOVU0iKSA9PSAwKSB7CisJCQlidXNudW0gPSB4c3RyZHVwKHRva2Vuc1sxXSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChzdHJjbXAodG9rZW5zWzBdLCAiREVWTlVNIikgPT0gMCkgeworCQkJZGV2bnVtID0geHN0cmR1cCh0b2tlbnNbMV0pOworCQkJY29udGludWU7CisJCX0KKwl9CisJY29uZmlnX2Nsb3NlKHBhcnNlcik7CisKKwlpZiAoYnVzbnVtKSB7CisJCXByaW50ZigiQnVzICVzIERldmljZSAlczogSUQgJTA0eDolMDR4XG4iLCBidXNudW0sIGRldm51bSwgcHJvZHVjdF92aWQsIHByb2R1Y3RfZGlkKTsKKwkJZnJlZShidXNudW0pOworCQlmcmVlKGRldm51bSk7CisJfQorCisJcmV0dXJuIFRSVUU7Cit9CisKK2ludCBsc3VzYl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbHN1c2JfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2IFVOVVNFRF9QQVJBTSkKK3sKKwkvKiBubyBvcHRpb25zLCBubyBnZXRvcHQgKi8KKworCXJlY3Vyc2l2ZV9hY3Rpb24oIi9zeXMvYnVzL3VzYi9kZXZpY2VzIiwKKwkJCUFDVElPTl9SRUNVUlNFLAorCQkJZmlsZUFjdGlvbiwKKwkJCU5VTEwsIC8qIGRpckFjdGlvbiAqLworCQkJTlVMTCwgLyogdXNlckRhdGEgKi8KKwkJCTAgLyogZGVwdGggKi8pOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvbWRldi5jIGIvdXRpbC1saW51eC9tZGV2LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE3ODFkNQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvbWRldi5jCkBAIC0wLDAgKzEsMTE1NSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbWRldiAtIE1pbmkgdWRldiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAyMDA1IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKiBDb3B5cmlnaHQgMjAwNSBGcmFuayBTb3JlbnNvbiA8ZnJhbmtAdHV4cm9ja3MuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9jb25maWc6Y29uZmlnIE1ERVYKKy8vY29uZmlnOglib29sICJtZGV2IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CXNlbGVjdCBQTEFURk9STV9MSU5VWAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIG1kZXYgaXMgYSBtaW5pLXVkZXYgaW1wbGVtZW50YXRpb24gZm9yIGR5bmFtaWNhbGx5IGNyZWF0aW5nIGRldmljZQorLy9jb25maWc6CSAgbm9kZXMgaW4gdGhlIC9kZXYgZGlyZWN0b3J5LgorLy9jb25maWc6CisvL2NvbmZpZzoJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSBkb2NzL21kZXYudHh0CisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX01ERVZfQ09ORgorLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgL2V0Yy9tZGV2LmNvbmYiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBNREVWCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQWRkIHN1cHBvcnQgZm9yIHRoZSBtZGV2IGNvbmZpZyBmaWxlIHRvIGNvbnRyb2wgb3duZXJzaGlwIGFuZAorLy9jb25maWc6CSAgcGVybWlzc2lvbnMgb2YgdGhlIGRldmljZSBub2Rlcy4KKy8vY29uZmlnOgorLy9jb25maWc6CSAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgZG9jcy9tZGV2LnR4dAorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9NREVWX1JFTkFNRQorLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgc3ViZGlycy9zeW1saW5rcyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIEZFQVRVUkVfTURFVl9DT05GCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgQWRkIHN1cHBvcnQgZm9yIHJlbmFtaW5nIGRldmljZXMgYW5kIGNyZWF0aW5nIHN5bWxpbmtzLgorLy9jb25maWc6CisvL2NvbmZpZzoJICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgcGxlYXNlIHNlZSBkb2NzL21kZXYudHh0CisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX01ERVZfUkVOQU1FX1JFR0VYUAorLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgcmVndWxhciBleHByZXNzaW9ucyBzdWJzdGl0dXRpb25zIHdoZW4gcmVuYW1pbmcgZGV2aWNlIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRkVBVFVSRV9NREVWX1JFTkFNRQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEFkZCBzdXBwb3J0IGZvciByZWd1bGFyIGV4cHJlc3Npb25zIHN1YnN0aXR1dGlvbnMgd2hlbiByZW5hbWluZworLy9jb25maWc6CSAgZGV2aWNlLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9NREVWX0VYRUMKKy8vY29uZmlnOglib29sICJTdXBwb3J0IGNvbW1hbmQgZXhlY3V0aW9uIGF0IGRldmljZSBhZGRpdGlvbi9yZW1vdmFsIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gRkVBVFVSRV9NREVWX0NPTkYKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgYW4gb3B0aW9uYWwgZmllbGQgdG8gL2V0Yy9tZGV2LmNvbmYgZm9yCisvL2NvbmZpZzoJICBleGVjdXRpbmcgY29tbWFuZHMgd2hlbiBkZXZpY2VzIGFyZSBjcmVhdGVkL3JlbW92ZWQuCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIGRvY3MvbWRldi50eHQKKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfTURFVl9MT0FEX0ZJUk1XQVJFCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCBsb2FkaW5nIG9mIGZpcm13YXJlcyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIE1ERVYKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTb21lIGRldmljZXMgbmVlZCB0byBsb2FkIGZpcm13YXJlIGJlZm9yZSB0aGV5IGNhbiBiZSB1c2FibGUuCisvL2NvbmZpZzoKKy8vY29uZmlnOgkgIFRoZXNlIGRldmljZXMgd2lsbCByZXF1ZXN0IHVzZXJzcGFjZSBsb29rIHVwIHRoZSBmaWxlcyBpbgorLy9jb25maWc6CSAgL2xpYi9maXJtd2FyZS8gYW5kIGlmIGl0IGV4aXN0cywgc2VuZCBpdCB0byB0aGUga2VybmVsIGZvcgorLy9jb25maWc6CSAgbG9hZGluZyBpbnRvIHRoZSBoYXJkd2FyZS4KKworLy9hcHBsZXQ6SUZfTURFVihBUFBMRVQobWRldiwgQkJfRElSX1NCSU4sIEJCX1NVSURfRFJPUCkpCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19NREVWKSArPSBtZGV2Lm8KKworLy91c2FnZTojZGVmaW5lIG1kZXZfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstc10iCisvL3VzYWdlOiNkZWZpbmUgbWRldl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIm1kZXYgLXMgaXMgdG8gYmUgcnVuIGR1cmluZyBib290IHRvIHNjYW4gL3N5cyBhbmQgcG9wdWxhdGUgL2Rldi5cbiIKKy8vdXNhZ2U6ICAgICAgICJcbiIKKy8vdXNhZ2U6ICAgICAgICJCYXJlIG1kZXYgaXMgYSBrZXJuZWwgaG90cGx1ZyBoZWxwZXIuIFRvIGFjdGl2YXRlIGl0OlxuIgorLy91c2FnZTogICAgICAgIgllY2hvIC9zYmluL21kZXYgPi9wcm9jL3N5cy9rZXJuZWwvaG90cGx1Z1xuIgorLy91c2FnZToJSUZfRkVBVFVSRV9NREVWX0NPTkYoCisvL3VzYWdlOiAgICAgICAiXG4iCisvL3VzYWdlOiAgICAgICAiSXQgdXNlcyAvZXRjL21kZXYuY29uZiB3aXRoIGxpbmVzXG4iCisvL3VzYWdlOiAgICAgICAiCVstXVtFTlY9cmVnZXg7XS4uLkRFVk5BTUUgVUlEOkdJRCBQRVJNIgorLy91c2FnZToJCQlJRl9GRUFUVVJFX01ERVZfUkVOQU1FKCIgWz58PVBBVEhdfFshXSIpCisvL3VzYWdlOgkJCUlGX0ZFQVRVUkVfTURFVl9FWEVDKCIgW0B8JHwqUFJPR10iKQorLy91c2FnZTogICAgICAgIlxuIgorLy91c2FnZTogICAgICAgIndoZXJlIERFVk5BTUUgaXMgZGV2aWNlIG5hbWUgcmVnZXgsIEBtYWpvcixtaW5vclstbWlub3IyXSwgb3JcbiIKKy8vdXNhZ2U6ICAgICAgICJlbnZpcm9ubWVudCB2YXJpYWJsZSByZWdleC4gQSBjb21tb24gdXNlIG9mIHRoZSBsYXR0ZXIgaXNcbiIKKy8vdXNhZ2U6ICAgICAgICJ0byBsb2FkIG1vZHVsZXMgZm9yIGhvdHBsdWdnZWQgZGV2aWNlczpcbiIKKy8vdXNhZ2U6ICAgICAgICIJJE1PREFMSUFTPS4qIDA6MCA2NjAgQG1vZHByb2JlIFwiJE1PREFMSUFTXCJcbiIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAgICJcbiIKKy8vdXNhZ2U6ICAgICAgICJJZiAvZGV2L21kZXYuc2VxIGZpbGUgZXhpc3RzLCBtZGV2IHdpbGwgd2FpdCBmb3IgaXRzIHZhbHVlXG4iCisvL3VzYWdlOiAgICAgICAidG8gbWF0Y2ggJFNFUU5VTSB2YXJpYWJsZS4gVGhpcyBwcmV2ZW50cyBwbHVnL3VucGx1ZyByYWNlcy5cbiIKKy8vdXNhZ2U6ICAgICAgICJUbyBhY3RpdmF0ZSB0aGlzIGZlYXR1cmUsIGNyZWF0ZSBlbXB0eSAvZGV2L21kZXYuc2VxIGF0IGJvb3QuXG4iCisvL3VzYWdlOiAgICAgICAiXG4iCisvL3VzYWdlOiAgICAgICAiSWYgL2Rldi9tZGV2LmxvZyBmaWxlIGV4aXN0cywgZGVidWcgbG9nIHdpbGwgYmUgYXBwZW5kZWQgdG8gaXQuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ4cmVnZXguaCIKKworLyogIm1kZXYgLXMiIHNjYW5zIC9zeXMvY2xhc3MveHh4LCBsb29raW5nIGZvciBkaXJlY3RvcmllcyB3aGljaCBoYXZlIGRldgorICogZmlsZSAoaXQgaXMgb2YgdGhlIGZvcm0gIk06bVxuIikuIEV4YW1wbGU6IC9zeXMvY2xhc3MvdHR5L3R0eTAvZGV2CisgKiBjb250YWlucyAiNDowXG4iLiBEaXJlY3RvcnkgbmFtZSBpcyB0YWtlbiBhcyBkZXZpY2UgbmFtZSwgcGF0aCBjb21wb25lbnQKKyAqIGRpcmVjdGx5IGFmdGVyIC9zeXMvY2xhc3MvIGFzIHN1YnN5c3RlbS4gSW4gdGhpcyBleGFtcGxlLCAidHR5MCIgYW5kICJ0dHkiLgorICogVGhlbiBtZGV2IGNyZWF0ZXMgdGhlIC9kZXYvZGV2aWNlX25hbWUgbm9kZS4KKyAqIElmIC9zeXMvY2xhc3MvLi4uL2RldiBmaWxlIGRvZXMgbm90IGV4aXN0LCBtZGV2IHN0aWxsIG1heSBhY3QKKyAqIG9uIHRoaXMgZGV2aWNlOiBzZWUgIkB8JHwqY29tbWFuZCBhcmdzLi4uIiBwYXJhbWV0ZXIgaW4gY29uZmlnIGZpbGUuCisgKgorICogbWRldiB3L28gcGFyYW1ldGVycyBpcyBjYWxsZWQgYXMgaG90cGx1ZyBoZWxwZXIuIEl0IHRha2VzIGRldmljZQorICogYW5kIHN1YnN5c3RlbSBuYW1lcyBmcm9tICRERVZQQVRIIGFuZCAkU1VCU1lTVEVNLCBleHRyYWN0cworICogbWFqLG1pbiBmcm9tICIvc3lzLyRERVZQQVRIL2RldiIgYW5kIGFsc28gZXhhbWluZXMKKyAqICRBQ1RJT04gKCJhZGQiLyJkZWxldGUiKSBhbmQgJEZJUk1XQVJFLgorICoKKyAqIElmIGFjdGlvbiBpcyAiYWRkIiwgbWRldiBjcmVhdGVzIC9kZXYvZGV2aWNlX25hbWUgc2ltaWxhcmx5IHRvIG1kZXYgLXMuCisgKiAodG9kbzogZXhwbGFpbiAiZGVsZXRlIiBhbmQgJEZJUk1XQVJFKQorICoKKyAqIElmIC9ldGMvbWRldi5jb25mIGV4aXN0cywgaXQgbWF5IG1vZGlmeSAvZGV2L2RldmljZV9uYW1lJ3MgcHJvcGVydGllcy4KKyAqCisgKiBMZWFkaW5nIG1pbnVzIGluIDFzdCBmaWVsZCBtZWFucyAiZG9uJ3Qgc3RvcCBvbiB0aGlzIGxpbmUiLCBvdGhlcndpc2UKKyAqIHNlYXJjaCBpcyBzdG9wcGVkIGFmdGVyIHRoZSBtYXRjaGluZyBsaW5lIGlzIGVuY291bnRlcmVkLgorICoKKyAqICRlbnZ2YXI9cmVnZXggZm9ybWF0IGlzIHVzZWZ1bCBmb3IgbG9hZGluZyBtb2R1bGVzIGZvciBob3QtcGx1Z2dlZCBkZXZpY2VzCisgKiB3aGljaCBkbyBub3QgaGF2ZSBkcml2ZXIgbG9hZGVkIHlldC4gSW4gdGhpcyBjYXNlIC9zeXMvY2xhc3MvLi4uL2RldgorICogZG9lcyBub3QgZXhpc3QsIGJ1dCAkTU9EQUxJQVMgaXMgc2V0IHRvIG5lZWRlZCBtb2R1bGUncyBuYW1lCisgKiAoYWN0dWFsbHksIGFuIGFsaWFzIHRvIGl0KSBieSBrZXJuZWwuIFRoaXMgcnVsZSBpbnN0cnVjdHMgbWRldgorICogdG8gbG9hZCB0aGUgbW9kdWxlIGFuZCBleGl0OgorICogICAgJE1PREFMSUFTPS4qIDA6MCA2NjAgQG1vZHByb2JlICIkTU9EQUxJQVMiCisgKiBUaGUga2VybmVsIHdpbGwgZ2VuZXJhdGUgYW5vdGhlciBob3RwbHVnIGV2ZW50IHdoZW4gL3N5cy9jbGFzcy8uLi4vZGV2CisgKiBmaWxlIGFwcGVhcnMuCisgKgorICogV2hlbiBsaW5lIG1hdGNoZXMsIHRoZSBkZXZpY2Ugbm9kZSBpcyBjcmVhdGVkLCBjaG1vZCdlZCBhbmQgY2hvd24nZWQsCisgKiBtb3ZlZCB0byBwYXRoLCBhbmQgaWYgPnBhdGgsIGEgc3ltbGluayB0byBtb3ZlZCBub2RlIGlzIGNyZWF0ZWQsCisgKiBhbGwgdGhpcyBpZiAvc3lzL2NsYXNzLy4uLi9kZXYgZXhpc3RzLgorICogICAgRXhhbXBsZXM6CisgKiAgICA9bG9vcC8gICAgICAtIG1vdmVzIHRvIC9kZXYvbG9vcAorICogICAgPmRpc2svc2RhJTEgLSBtb3ZlcyB0byAvZGV2L2Rpc2svc2RhTiwgbWFrZXMgL2Rldi9zZGFOIGEgc3ltbGluaworICoKKyAqIFRoZW4gImNvbW1hbmQgYXJncy4uLiIgaXMgZXhlY3V0ZWQgKHZpYSBzaCAtYyAnY29tbWFuZCBhcmdzLi4uJykuCisgKiBAOmV4ZWN1dGUgb24gY3JlYXRpb24sICQ6b24gZGVsZXRpb24sICo6b24gYm90aC4KKyAqIFRoaXMgaGFwcGVucyByZWdhcmRsZXNzIG9mIC9zeXMvY2xhc3MvLi4uL2RldiBleGlzdGVuY2UuCisgKi8KKworLyogS2VybmVsJ3MgaG90cGx1ZyBlbnZpcm9ubWVudCBjb25zdGFudGx5IGNoYW5nZXMuCisgKiBIZXJlIGFyZSBuZXcgY2FzZXMgSSBvYnNlcnZlZCBvbiAzLjEuMDoKKyAqCisgKiBDYXNlIHdpdGggJERFVk5BTUUgYW5kICRERVZJQ0UsIG5vdCBqdXN0ICRERVZQQVRIOgorICogQUNUSU9OPWFkZAorICogQlVTTlVNPTAwMQorICogREVWSUNFPS9wcm9jL2J1cy91c2IvMDAxLzAwMworICogREVWTkFNRT1idXMvdXNiLzAwMS8wMDMKKyAqIERFVk5VTT0wMDMKKyAqIERFVlBBVEg9L2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAwOjAyLjEvdXNiMS8xLTUKKyAqIERFVlRZUEU9dXNiX2RldmljZQorICogTUFKT1I9MTg5CisgKiBNSU5PUj0yCisgKiBQUk9EVUNUPTE4ZDEvNGUxMi8yMjcKKyAqIFNVQlNZU1RFTT11c2IKKyAqIFRZUEU9MC8wLzAKKyAqCisgKiBDYXNlIHdpdGggJERFVklDRSwgYnV0IG5vICRERVZOQU1FIC0gYXBwYXJlbnR5LCB1c2IgaWZhY2Ugbm90aWZpY2F0aW9uPworICogIlBsZWFzZSBsb2FkIG1lIGEgbW9kdWxlIiB0aGluZz8KKyAqIEFDVElPTj1hZGQKKyAqIERFVklDRT0vcHJvYy9idXMvdXNiLzAwMS8wMDMKKyAqIERFVlBBVEg9L2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAwOjAyLjEvdXNiMS8xLTUvMS01OjEuMAorICogREVWVFlQRT11c2JfaW50ZXJmYWNlCisgKiBJTlRFUkZBQ0U9OC82LzgwCisgKiBNT0RBTElBUz11c2I6djE4RDFwNEUxMmQwMjI3ZGMwMGRzYzAwZHAwMGljMDhpc2MwNmlwNTAKKyAqIFBST0RVQ1Q9MThkMS80ZTEyLzIyNworICogU1VCU1lTVEVNPXVzYgorICogVFlQRT0wLzAvMAorICoKKyAqIEFDVElPTj1hZGQKKyAqIERFVlBBVEg9L2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAwOjAyLjEvdXNiMS8xLTUvMS01OjEuMC9ob3N0NQorICogREVWVFlQRT1zY3NpX2hvc3QKKyAqIFNVQlNZU1RFTT1zY3NpCisgKgorICogQUNUSU9OPWFkZAorICogREVWUEFUSD0vZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6MDIuMS91c2IxLzEtNS8xLTU6MS4wL2hvc3Q1L3Njc2lfaG9zdC9ob3N0NQorICogU1VCU1lTVEVNPXNjc2lfaG9zdAorICoKKyAqIEFDVElPTj1hZGQKKyAqIERFVlBBVEg9L2RldmljZXMvcGNpMDAwMDowMC8wMDAwOjAwOjAyLjEvdXNiMS8xLTUvMS01OjEuMC9ob3N0NS90YXJnZXQ1OjA6MAorICogREVWVFlQRT1zY3NpX3RhcmdldAorICogU1VCU1lTVEVNPXNjc2kKKyAqCisgKiBDYXNlIHdpdGggc3RyYW5nZSAkTU9EQUxJQVM6CisgKiBBQ1RJT049YWRkCisgKiBERVZQQVRIPS9kZXZpY2VzL3BjaTAwMDA6MDAvMDAwMDowMDowMi4xL3VzYjEvMS01LzEtNToxLjAvaG9zdDUvdGFyZ2V0NTowOjAvNTowOjA6MAorICogREVWVFlQRT1zY3NpX2RldmljZQorICogTU9EQUxJQVM9c2NzaTp0LTB4MDAKKyAqIFNVQlNZU1RFTT1zY3NpCisgKgorICogQUNUSU9OPWFkZAorICogREVWUEFUSD0vZGV2aWNlcy9wY2kwMDAwOjAwLzAwMDA6MDA6MDIuMS91c2IxLzEtNS8xLTU6MS4wL2hvc3Q1L3RhcmdldDU6MDowLzU6MDowOjAvc2NzaV9kaXNrLzU6MDowOjAKKyAqIFNVQlNZU1RFTT1zY3NpX2Rpc2sKKyAqCisgKiBBQ1RJT049YWRkCisgKiBERVZQQVRIPS9kZXZpY2VzL3BjaTAwMDA6MDAvMDAwMDowMDowMi4xL3VzYjEvMS01LzEtNToxLjAvaG9zdDUvdGFyZ2V0NTowOjAvNTowOjA6MC9zY3NpX2RldmljZS81OjA6MDowCisgKiBTVUJTWVNURU09c2NzaV9kZXZpY2UKKyAqCisgKiBDYXNlIHdpdGggZXhwbGljaXQgJE1BSk9SLyRNSU5PUiAobm8gbmVlZCB0byByZWFkIC9zeXMvJERFVlBBVEgvZGV2Pyk6CisgKiBBQ1RJT049YWRkCisgKiBERVZOQU1FPWJzZy81OjA6MDowCisgKiBERVZQQVRIPS9kZXZpY2VzL3BjaTAwMDA6MDAvMDAwMDowMDowMi4xL3VzYjEvMS01LzEtNToxLjAvaG9zdDUvdGFyZ2V0NTowOjAvNTowOjA6MC9ic2cvNTowOjA6MAorICogTUFKT1I9MjUzCisgKiBNSU5PUj0xCisgKiBTVUJTWVNURU09YnNnCisgKgorICogQUNUSU9OPWFkZAorICogREVWUEFUSD0vZGV2aWNlcy92aXJ0dWFsL2JkaS84OjE2CisgKiBTVUJTWVNURU09YmRpCisgKgorICogQUNUSU9OPWFkZAorICogREVWTkFNRT1zZGIKKyAqIERFVlBBVEg9L2Jsb2NrL3NkYgorICogREVWVFlQRT1kaXNrCisgKiBNQUpPUj04CisgKiBNSU5PUj0xNgorICogU1VCU1lTVEVNPWJsb2NrCisgKgorICogQ2FzZSB3aXRoIEFDVElPTj1jaGFuZ2U6CisgKiBBQ1RJT049Y2hhbmdlCisgKiBERVZOQU1FPXNkYgorICogREVWUEFUSD0vYmxvY2svc2RiCisgKiBERVZUWVBFPWRpc2sKKyAqIERJU0tfTUVESUFfQ0hBTkdFPTEKKyAqIE1BSk9SPTgKKyAqIE1JTk9SPTE2CisgKiBTVUJTWVNURU09YmxvY2sKKyAqLworCisjZGVmaW5lIERFQlVHX0xWTCAyCisKKyNpZiBERUJVR19MVkwgPj0gMQorIyBkZWZpbmUgZGJnMSguLi4pIGRvIHsgaWYgKEcudmVyYm9zZSkgYmJfZXJyb3JfbXNnKF9fVkFfQVJHU19fKTsgfSB3aGlsZSgwKQorI2Vsc2UKKyMgZGVmaW5lIGRiZzEoLi4uKSAoKHZvaWQpMCkKKyNlbmRpZgorI2lmIERFQlVHX0xWTCA+PSAyCisjIGRlZmluZSBkYmcyKC4uLikgZG8geyBpZiAoRy52ZXJib3NlID49IDIpIGJiX2Vycm9yX21zZyhfX1ZBX0FSR1NfXyk7IH0gd2hpbGUoMCkKKyNlbHNlCisjIGRlZmluZSBkYmcyKC4uLikgKCh2b2lkKTApCisjZW5kaWYKKyNpZiBERUJVR19MVkwgPj0gMworIyBkZWZpbmUgZGJnMyguLi4pIGRvIHsgaWYgKEcudmVyYm9zZSA+PSAzKSBiYl9lcnJvcl9tc2coX19WQV9BUkdTX18pOyB9IHdoaWxlKDApCisjZWxzZQorIyBkZWZpbmUgZGJnMyguLi4pICgodm9pZCkwKQorI2VuZGlmCisKKworc3RhdGljIGNvbnN0IGNoYXIga2V5d29yZHNbXSBBTElHTjEgPSAiYWRkXDByZW1vdmVcMCI7IC8vICJjaGFuZ2VcMCIKK2VudW0geyBPUF9hZGQsIE9QX3JlbW92ZSB9OworCitzdHJ1Y3QgZW52bWF0Y2ggeworCXN0cnVjdCBlbnZtYXRjaCAqbmV4dDsKKwljaGFyICplbnZuYW1lOworCXJlZ2V4X3QgbWF0Y2g7Cit9OworCitzdHJ1Y3QgcnVsZSB7CisJYm9vbCBrZWVwX21hdGNoaW5nOworCWJvb2wgcmVnZXhfY29tcGlsZWQ7CisJbW9kZV90IG1vZGU7CisJaW50IG1haiwgbWluMCwgbWluMTsKKwlzdHJ1Y3QgYmJfdWlkZ2lkX3QgdWdpZDsKKwljaGFyICplbnZ2YXI7CisJY2hhciAqcmVuX21vdjsKKwlJRl9GRUFUVVJFX01ERVZfRVhFQyhjaGFyICpyX2NtZDspCisJcmVnZXhfdCBtYXRjaDsKKwlzdHJ1Y3QgZW52bWF0Y2ggKmVudm1hdGNoOworfTsKKworc3RydWN0IGdsb2JhbHMgeworCWludCByb290X21ham9yLCByb290X21pbm9yOworCXNtYWxsaW50IHZlcmJvc2U7CisJY2hhciAqc3Vic3lzdGVtOworCWNoYXIgKnN1YnN5c19lbnY7IC8qIGZvciBwdXRlbnYoIlNVQlNZU1RFTT1zdWJzeXN0ZW0iKSAqLworI2lmIEVOQUJMRV9GRUFUVVJFX01ERVZfQ09ORgorCWNvbnN0IGNoYXIgKmZpbGVuYW1lOworCXBhcnNlcl90ICpwYXJzZXI7CisJc3RydWN0IHJ1bGUgKipydWxlX3ZlYzsKKwl1bnNpZ25lZCBydWxlX2lkeDsKKyNlbmRpZgorCXN0cnVjdCBydWxlIGN1cl9ydWxlOworCWNoYXIgdGltZXN0cltzaXplb2YoIkhIOk1NOlNTLjEyMzQ1NiIpXTsKK30gRklYX0FMSUFTSU5HOworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpIGRvIHsgXAorCUlGX05PVF9GRUFUVVJFX01ERVZfQ09ORihHLmN1cl9ydWxlLm1haiA9IC0xOykgXAorCUlGX05PVF9GRUFUVVJFX01ERVZfQ09ORihHLmN1cl9ydWxlLm1vZGUgPSAwNjYwOykgXAorfSB3aGlsZSAoMCkKKworCisvKiBQcmV2ZW50IGluZmluaXRlIGxvb3BzIGluIC9zeXMgc3ltbGlua3MgKi8KKyNkZWZpbmUgTUFYX1NZU0ZTX0RFUFRIIDMKKworLyogV2UgdXNlIGFkZGl0aW9uYWwgYnl0ZXMgaW4gbWFrZV9kZXZpY2UoKSAqLworI2RlZmluZSBTQ1JBVENIX1NJWkUgMTI4CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NREVWX0NPTkYKKworc3RhdGljIHZvaWQgbWFrZV9kZWZhdWx0X2N1cl9ydWxlKHZvaWQpCit7CisJbWVtc2V0KCZHLmN1cl9ydWxlLCAwLCBzaXplb2YoRy5jdXJfcnVsZSkpOworCUcuY3VyX3J1bGUubWFqID0gLTE7IC8qICJub3QgYSBAbWFqb3IsbWlub3IgcnVsZSIgKi8KKwlHLmN1cl9ydWxlLm1vZGUgPSAwNjYwOworfQorCitzdGF0aWMgdm9pZCBjbGVhbl91cF9jdXJfcnVsZSh2b2lkKQoreworCXN0cnVjdCBlbnZtYXRjaCAqZTsKKworCWZyZWUoRy5jdXJfcnVsZS5lbnZ2YXIpOworCWZyZWUoRy5jdXJfcnVsZS5yZW5fbW92KTsKKwlpZiAoRy5jdXJfcnVsZS5yZWdleF9jb21waWxlZCkKKwkJcmVnZnJlZSgmRy5jdXJfcnVsZS5tYXRjaCk7CisJSUZfRkVBVFVSRV9NREVWX0VYRUMoZnJlZShHLmN1cl9ydWxlLnJfY21kKTspCisJZSA9IEcuY3VyX3J1bGUuZW52bWF0Y2g7CisJd2hpbGUgKGUpIHsKKwkJZnJlZShlLT5lbnZuYW1lKTsKKwkJcmVnZnJlZSgmZS0+bWF0Y2gpOworCQllID0gZS0+bmV4dDsKKwl9CisJbWFrZV9kZWZhdWx0X2N1cl9ydWxlKCk7Cit9CisKK3N0YXRpYyBjaGFyICpwYXJzZV9lbnZtYXRjaF9wZngoY2hhciAqdmFsKQoreworCXN0cnVjdCBlbnZtYXRjaCAqKm5leHRwID0gJkcuY3VyX3J1bGUuZW52bWF0Y2g7CisKKwlmb3IgKDs7KSB7CisJCXN0cnVjdCBlbnZtYXRjaCAqZTsKKwkJY2hhciAqc2VtaWNvbG9uOworCQljaGFyICplcSA9IHN0cmNocih2YWwsICc9Jyk7CisJCWlmICghZXEgLyogfHwgZXEgPT0gdmFsPyAqLykKKwkJCXJldHVybiB2YWw7CisJCWlmIChlbmRvZm5hbWUodmFsKSAhPSBlcSkKKwkJCXJldHVybiB2YWw7CisJCXNlbWljb2xvbiA9IHN0cmNocihlcSwgJzsnKTsKKwkJaWYgKCFzZW1pY29sb24pCisJCQlyZXR1cm4gdmFsOworCQkvKiBFTlZWQVI9cmVnZXg7Li4uICovCisJCSpuZXh0cCA9IGUgPSB4emFsbG9jKHNpemVvZigqZSkpOworCQluZXh0cCA9ICZlLT5uZXh0OworCQllLT5lbnZuYW1lID0geHN0cm5kdXAodmFsLCBlcSAtIHZhbCk7CisJCSpzZW1pY29sb24gPSAnXDAnOworCQl4cmVnY29tcCgmZS0+bWF0Y2gsIGVxICsgMSwgUkVHX0VYVEVOREVEKTsKKwkJKnNlbWljb2xvbiA9ICc7JzsKKwkJdmFsID0gc2VtaWNvbG9uICsgMTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX25leHRfcnVsZSh2b2lkKQoreworCS8qIE5vdGU6IG9uIGVudHJ5LCBHLmN1cl9ydWxlIGlzIHNldCB0byBkZWZhdWx0ICovCisJd2hpbGUgKDEpIHsKKwkJY2hhciAqdG9rZW5zWzRdOworCQljaGFyICp2YWw7CisKKwkJLyogTm8gUEFSU0VfRU9MX0NPTU1FTlRTLCBiZWNhdXNlIGNvbW1hbmQgbWF5IGNvbnRhaW4gJyMnIGNoYXJzICovCisJCWlmICghY29uZmlnX3JlYWQoRy5wYXJzZXIsIHRva2VucywgNCwgMywgIiMgXHQiLCBQQVJTRV9OT1JNQUwgJiB+UEFSU0VfRU9MX0NPTU1FTlRTKSkKKwkJCWJyZWFrOworCisJCS8qIEZpZWxkczogWy1dcmVnZXggdWlkOmdpZCBtb2RlIFthbGlhc10gW2NtZF0gKi8KKwkJZGJnMygidG9rZW4xOiclcyciLCB0b2tlbnNbMV0pOworCisJCS8qIDFzdCBmaWVsZCAqLworCQl2YWwgPSB0b2tlbnNbMF07CisJCUcuY3VyX3J1bGUua2VlcF9tYXRjaGluZyA9ICgnLScgPT0gdmFsWzBdKTsKKwkJdmFsICs9IEcuY3VyX3J1bGUua2VlcF9tYXRjaGluZzsgLyogc3dhbGxvdyBsZWFkaW5nIGRhc2ggKi8KKwkJdmFsID0gcGFyc2VfZW52bWF0Y2hfcGZ4KHZhbCk7CisJCWlmICh2YWxbMF0gPT0gJ0AnKSB7CisJCQkvKiBAbWFqb3IsbWlub3JbLW1pbm9yMl0gKi8KKwkJCS8qICh1c2VmdWwgd2hlbiBuYW1lIGlzIGFtYmlndW91czoKKwkJCSAqICIvc3lzL2NsYXNzL3VzYi9scDAiIGFuZAorCQkJICogIi9zeXMvY2xhc3MvcHJpbnRlci9scDAiKQorCQkJICovCisJCQlpbnQgc2MgPSBzc2NhbmYodmFsLCAiQCV1LCV1LSV1IiwgJkcuY3VyX3J1bGUubWFqLCAmRy5jdXJfcnVsZS5taW4wLCAmRy5jdXJfcnVsZS5taW4xKTsKKwkJCWlmIChzYyA8IDIgfHwgRy5jdXJfcnVsZS5tYWogPCAwKSB7CisJCQkJYmJfZXJyb3JfbXNnKCJiYWQgQG1haixtaW4gb24gbGluZSAlZCIsIEcucGFyc2VyLT5saW5lbm8pOworCQkJCWdvdG8gbmV4dF9ydWxlOworCQkJfQorCQkJaWYgKHNjID09IDIpCisJCQkJRy5jdXJfcnVsZS5taW4xID0gRy5jdXJfcnVsZS5taW4wOworCQl9IGVsc2UgeworCQkJY2hhciAqZXEgPSBzdHJjaHIodmFsLCAnPScpOworCQkJaWYgKHZhbFswXSA9PSAnJCcpIHsKKwkJCQkvKiAkRU5WVkFSPXJlZ2V4IC4uLiAqLworCQkJCXZhbCsrOworCQkJCWlmICghZXEpIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJiYWQgJGVudnZhcj1yZWdleCBvbiBsaW5lICVkIiwgRy5wYXJzZXItPmxpbmVubyk7CisJCQkJCWdvdG8gbmV4dF9ydWxlOworCQkJCX0KKwkJCQlHLmN1cl9ydWxlLmVudnZhciA9IHhzdHJuZHVwKHZhbCwgZXEgLSB2YWwpOworCQkJCXZhbCA9IGVxICsgMTsKKwkJCX0KKwkJCXhyZWdjb21wKCZHLmN1cl9ydWxlLm1hdGNoLCB2YWwsIFJFR19FWFRFTkRFRCk7CisJCQlHLmN1cl9ydWxlLnJlZ2V4X2NvbXBpbGVkID0gMTsKKwkJfQorCisJCS8qIDJuZCBmaWVsZDogdWlkOmdpZCAtIGRldmljZSBvd25lcnNoaXAgKi8KKwkJaWYgKGdldF91aWRnaWQoJkcuY3VyX3J1bGUudWdpZCwgdG9rZW5zWzFdLCAvKmFsbG93X251bWVyaWM6Ki8gMSkgPT0gMCkgeworCQkJYmJfZXJyb3JfbXNnKCJ1bmtub3duIHVzZXIvZ3JvdXAgJyVzJyBvbiBsaW5lICVkIiwgdG9rZW5zWzFdLCBHLnBhcnNlci0+bGluZW5vKTsKKwkJCWdvdG8gbmV4dF9ydWxlOworCQl9CisKKwkJLyogM3JkIGZpZWxkOiBtb2RlIC0gZGV2aWNlIHBlcm1pc3Npb25zICovCisJCUcuY3VyX3J1bGUubW9kZSA9IGJiX3BhcnNlX21vZGUodG9rZW5zWzJdLCBHLmN1cl9ydWxlLm1vZGUpOworCisJCS8qIDR0aCBmaWVsZCAob3B0KTogIj58PWFsaWFzIiBvciAiISIgdG8gbm90IGNyZWF0ZSB0aGUgbm9kZSAqLworCQl2YWwgPSB0b2tlbnNbM107CisJCWlmIChFTkFCTEVfRkVBVFVSRV9NREVWX1JFTkFNRSAmJiB2YWwgJiYgc3RyY2hyKCI+PSEiLCB2YWxbMF0pKSB7CisJCQljaGFyICpzID0gc2tpcF9ub25fd2hpdGVzcGFjZSh2YWwpOworCQkJRy5jdXJfcnVsZS5yZW5fbW92ID0geHN0cm5kdXAodmFsLCBzIC0gdmFsKTsKKwkJCXZhbCA9IHNraXBfd2hpdGVzcGFjZShzKTsKKwkJfQorCisJCWlmIChFTkFCTEVfRkVBVFVSRV9NREVWX0VYRUMgJiYgdmFsICYmIHZhbFswXSkgeworCQkJY29uc3QgY2hhciAqcyA9ICIkQCoiOworCQkJY29uc3QgY2hhciAqczIgPSBzdHJjaHIocywgdmFsWzBdKTsKKwkJCWlmICghczIpIHsKKwkJCQliYl9lcnJvcl9tc2coImJhZCBsaW5lICV1IiwgRy5wYXJzZXItPmxpbmVubyk7CisJCQkJZ290byBuZXh0X3J1bGU7CisJCQl9CisJCQlJRl9GRUFUVVJFX01ERVZfRVhFQyhHLmN1cl9ydWxlLnJfY21kID0geHN0cmR1cCh2YWwpOykKKwkJfQorCisJCXJldHVybjsKKyBuZXh0X3J1bGU6CisJCWNsZWFuX3VwX2N1cl9ydWxlKCk7CisJfSAvKiB3aGlsZSAoY29uZmlnX3JlYWQpICovCisKKwlkYmczKCJjb25maWdfY2xvc2UoRy5wYXJzZXIpIik7CisJY29uZmlnX2Nsb3NlKEcucGFyc2VyKTsKKwlHLnBhcnNlciA9IE5VTEw7CisKKwlyZXR1cm47Cit9CisKKy8qIElmIG1kZXYgLXMsIHdlIHJlbWVtYmVyIHJ1bGVzIGluIEcucnVsZV92ZWNbXS4KKyAqIE90aGVyd2lzZSwgdGhlcmUgaXMgbm8gcG9pbnQgaW4gZG9pbmcgaXQsIGFuZCB3ZSBqdXN0CisgKiBzYXZlIG9ubHkgb25lIHBhcnNlZCBydWxlIGluIEcuY3VyX3J1bGUuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcnVsZSAqbmV4dF9ydWxlKHZvaWQpCit7CisJc3RydWN0IHJ1bGUgKnJ1bGU7CisKKwkvKiBPcGVuIGNvbmYgZmlsZSBpZiB3ZSBkaWRuJ3QgZG8gaXQgeWV0ICovCisJaWYgKCFHLnBhcnNlciAmJiBHLmZpbGVuYW1lKSB7CisJCWRiZzMoImNvbmZpZ19vcGVuKCclcycpIiwgRy5maWxlbmFtZSk7CisJCUcucGFyc2VyID0gY29uZmlnX29wZW4yKEcuZmlsZW5hbWUsIGZvcGVuX2Zvcl9yZWFkKTsKKwkJRy5maWxlbmFtZSA9IE5VTEw7CisJfQorCisJaWYgKEcucnVsZV92ZWMpIHsKKwkJLyogbWRldiAtcyAqLworCQkvKiBEbyB3ZSBoYXZlIHJ1bGUgcGFyc2VkIGFscmVhZHk/ICovCisJCWlmIChHLnJ1bGVfdmVjW0cucnVsZV9pZHhdKSB7CisJCQlkYmczKCI8IEcucnVsZV92ZWNbRy5ydWxlX2lkeDolZF09JXAiLCBHLnJ1bGVfaWR4LCBHLnJ1bGVfdmVjW0cucnVsZV9pZHhdKTsKKwkJCXJldHVybiBHLnJ1bGVfdmVjW0cucnVsZV9pZHgrK107CisJCX0KKwkJbWFrZV9kZWZhdWx0X2N1cl9ydWxlKCk7CisJfSBlbHNlIHsKKwkJLyogbm90IG1kZXYgLXMgKi8KKwkJY2xlYW5fdXBfY3VyX3J1bGUoKTsKKwl9CisKKwkvKiBQYXJzZSBvbmUgbW9yZSBydWxlIGlmIGZpbGUgaXNuJ3QgZnVsbHkgcmVhZCAqLworCXJ1bGUgPSAmRy5jdXJfcnVsZTsKKwlpZiAoRy5wYXJzZXIpIHsKKwkJcGFyc2VfbmV4dF9ydWxlKCk7CisJCWlmIChHLnJ1bGVfdmVjKSB7IC8qIG1kZXYgLXMgKi8KKwkJCXJ1bGUgPSB4bWVtZHVwKCZHLmN1cl9ydWxlLCBzaXplb2YoRy5jdXJfcnVsZSkpOworCQkJRy5ydWxlX3ZlYyA9IHhyZWFsbG9jX3ZlY3RvcihHLnJ1bGVfdmVjLCA0LCBHLnJ1bGVfaWR4KTsKKwkJCUcucnVsZV92ZWNbRy5ydWxlX2lkeCsrXSA9IHJ1bGU7CisJCQlkYmczKCI+IEcucnVsZV92ZWNbRy5ydWxlX2lkeDolZF09JXAiLCBHLnJ1bGVfaWR4LCBHLnJ1bGVfdmVjW0cucnVsZV9pZHhdKTsKKwkJfQorCX0KKworCXJldHVybiBydWxlOworfQorCitzdGF0aWMgaW50IGVudl9tYXRjaGVzKHN0cnVjdCBlbnZtYXRjaCAqZSkKK3sKKwl3aGlsZSAoZSkgeworCQlpbnQgcjsKKwkJY2hhciAqdmFsID0gZ2V0ZW52KGUtPmVudm5hbWUpOworCQlpZiAoIXZhbCkKKwkJCXJldHVybiAwOworCQlyID0gcmVnZXhlYygmZS0+bWF0Y2gsIHZhbCwgLypzaXplKi8gMCwgLypyYW5nZVtdKi8gTlVMTCwgLyplZmxhZ3MqLyAwKTsKKwkJaWYgKHIgIT0gMCkgLyogbm8gbWF0Y2ggKi8KKwkJCXJldHVybiAwOworCQllID0gZS0+bmV4dDsKKwl9CisJcmV0dXJuIDE7Cit9CisKKyNlbHNlCisKKyMgZGVmaW5lIG5leHRfcnVsZSgpICgmRy5jdXJfcnVsZSkKKworI2VuZGlmCisKK3N0YXRpYyB2b2lkIG1rZGlyX3JlY3Vyc2l2ZShjaGFyICpuYW1lKQoreworCS8qIGlmIG5hbWUgaGFzIG1hbnkgbGV2ZWxzICgiZGlyMS9kaXIyIiksCisJICogYmJfbWFrZV9kaXJlY3RvcnkoKSB3aWxsIGNyZWF0ZSBkaXIxIGFjY29yZGluZyB0byB1bWFzaywKKwkgKiBub3QgYWNjb3JkaW5nIHRvIGl0cyAibW9kZSIgcGFyYW1ldGVyLgorCSAqIFNpbmNlIHdlIHJ1biB3aXRoIHVtYXNrPTAsIG5lZWQgdG8gdGVtcG9yYXJpbHkgc3dpdGNoIGl0LgorCSAqLworCXVtYXNrKDAyMik7IC8qICJkaXIxIiAoaWYgYW55KSB3aWxsIGJlIDA3NTUgdG9vICovCisJYmJfbWFrZV9kaXJlY3RvcnkobmFtZSwgMDc1NSwgRklMRVVUSUxTX1JFQ1VSKTsKKwl1bWFzaygwKTsKK30KKworLyogQnVpbGRzIGFuIGFsaWFzIHBhdGguCisgKiBUaGlzIGZ1bmN0aW9uIHBvdGVudGlvbmFsbHkgcmVhbGxvY2F0ZXMgdGhlIGFsaWFzIHBhcmFtZXRlci4KKyAqIE9ubHkgdXNlZCBmb3IgRU5BQkxFX0ZFQVRVUkVfTURFVl9SRU5BTUUKKyAqLworc3RhdGljIGNoYXIgKmJ1aWxkX2FsaWFzKGNoYXIgKmFsaWFzLCBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKK3sKKwljaGFyICpkZXN0OworCisJLyogIj5iYXIvIjogcmVuYW1lIHRvIGJhci9kZXZpY2VfbmFtZSAqLworCS8qICI+YmFyWy9dYmF6IjogcmVuYW1lIHRvIGJhclsvXWJheiAqLworCWRlc3QgPSBzdHJyY2hyKGFsaWFzLCAnLycpOworCWlmIChkZXN0KSB7IC8qICI+YmFyL1tiYXpdIiA/ICovCisJCSpkZXN0ID0gJ1wwJzsgLyogbWtkaXIgYmFyICovCisJCW1rZGlyX3JlY3Vyc2l2ZShhbGlhcyk7CisJCSpkZXN0ID0gJy8nOworCQlpZiAoZGVzdFsxXSA9PSAnXDAnKSB7IC8qICI+YmFyLyIgPT4gIj5iYXIvZGV2aWNlX25hbWUiICovCisJCQlkZXN0ID0gYWxpYXM7CisJCQlhbGlhcyA9IGNvbmNhdF9wYXRoX2ZpbGUoYWxpYXMsIGRldmljZV9uYW1lKTsKKwkJCWZyZWUoZGVzdCk7CisJCX0KKwl9CisKKwlyZXR1cm4gYWxpYXM7Cit9CisKKy8qIG1rbm9kIGluIC9kZXYgYmFzZWQgb24gYSBwYXRoIGxpa2UgIi9zeXMvYmxvY2svaGRhL2hkYTEiCisgKiBOQjE6IHBhdGggcGFyYW1ldGVyIG5lZWRzIHRvIGhhdmUgU0NSQVRDSF9TSVpFIHNjcmF0Y2ggYnl0ZXMKKyAqIGFmdGVyIE5VTCwgYnV0IHdlIHByb21pc2UgdG8gbm90IG1hbmdsZSAoSU9XOiB0byByZXN0b3JlIE5VTCBpZiBuZWVkZWQpCisgKiBwYXRoIHN0cmluZy4KKyAqIE5CMjogIm1kZXYgLXMiIG1heSBjYWxsIHVzIG1hbnkgdGltZXMsIGRvIG5vdCBsZWFrIG1lbW9yeS9mZHMhCisgKgorICogZGV2aWNlX25hbWUgPSAkREVWTkFNRSAobWF5IGJlIE5VTEwpCisgKiBwYXRoICAgICAgICA9IC9zeXMvJERFVlBBVEgKKyAqLworc3RhdGljIHZvaWQgbWFrZV9kZXZpY2UoY2hhciAqZGV2aWNlX25hbWUsIGNoYXIgKnBhdGgsIGludCBvcGVyYXRpb24pCit7CisJaW50IG1ham9yLCBtaW5vciwgdHlwZSwgbGVuOworCWNoYXIgKnBhdGhfZW5kID0gcGF0aCArIHN0cmxlbihwYXRoKTsKKworCS8qIFRyeSB0byByZWFkIG1ham9yL21pbm9yIHN0cmluZy4gIE5vdGUgdGhhdCB0aGUga2VybmVsIHB1dHMgXG4gYWZ0ZXIKKwkgKiB0aGUgZGF0YSwgc28gd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBudWxsIHRlcm1pbmF0aW5nIHRoZSBzdHJpbmcKKwkgKiBiZWNhdXNlIHNzY2FuZigpIHdpbGwgc3RvcCBhdCB0aGUgZmlyc3Qgbm9uZGlnaXQsIHdoaWNoIFxuIGlzLgorCSAqIFdlIGFsc28gZGVwZW5kIG9uIHBhdGggaGF2aW5nIHdyaXRlYWJsZSBzcGFjZSBhZnRlciBpdC4KKwkgKi8KKwltYWpvciA9IC0xOworCWlmIChvcGVyYXRpb24gPT0gT1BfYWRkKSB7CisJCXN0cmNweShwYXRoX2VuZCwgIi9kZXYiKTsKKwkJbGVuID0gb3Blbl9yZWFkX2Nsb3NlKHBhdGgsIHBhdGhfZW5kICsgMSwgU0NSQVRDSF9TSVpFIC0gMSk7CisJCSpwYXRoX2VuZCA9ICdcMCc7CisJCWlmIChsZW4gPCAxKSB7CisJCQlpZiAoIUVOQUJMRV9GRUFUVVJFX01ERVZfRVhFQykKKwkJCQlyZXR1cm47CisJCQkvKiBubyAiZGV2IiBmaWxlLCBidXQgd2UgY2FuIHN0aWxsIHJ1biBzY3JpcHRzCisJCQkgKiBiYXNlZCBvbiBkZXZpY2UgbmFtZSAqLworCQl9IGVsc2UgaWYgKHNzY2FuZihwYXRoX2VuZCArIDEsICIldToldSIsICZtYWpvciwgJm1pbm9yKSA9PSAyKSB7CisJCQlkYmcxKCJkZXYgJXUsJXUiLCBtYWpvciwgbWlub3IpOworCQl9IGVsc2UgeworCQkJbWFqb3IgPSAtMTsKKwkJfQorCX0KKwkvKiBlbHNlOiBmb3IgZGVsZXRlLCAtMSBzdGlsbCBkZWxldGVzIHRoZSBub2RlLCBidXQgPCAtMSBzdXBwcmVzc2VzIHRoYXQgKi8KKworCS8qIERldGVybWluZSBkZXZpY2UgbmFtZSAqLworCWlmICghZGV2aWNlX25hbWUpIHsKKwkJLyoKKwkJICogVGhlcmUgd2FzIG5vICRERVZOQU1FIGVudnZhciAoZm9yIGV4YW1wbGUsIG1kZXYgLXMgbmV2ZXIgaGFzKS4KKwkJICogQnV0IGl0IGlzIHZlcnkgdXNlZnVsOiBpdCBjb250YWlucyB0aGUgKnBhdGgqLCBub3Qgb25seSBiYXNlbmFtZSwKKwkJICogVGhhbmtmdWxseSwgdWV2ZW50IGZpbGUgaGFzIGl0LgorCQkgKiBFeGFtcGxlIG9mIC4uLi9zb3VuZC9jYXJkMC9jb250cm9sQzAvdWV2ZW50IGZpbGUgb24gTGludXgtMy43Ljc6CisJCSAqIE1BSk9SPTExNgorCQkgKiBNSU5PUj03CisJCSAqIERFVk5BTUU9c25kL2NvbnRyb2xDMAorCQkgKi8KKwkJc3RyY3B5KHBhdGhfZW5kLCAiL3VldmVudCIpOworCQlsZW4gPSBvcGVuX3JlYWRfY2xvc2UocGF0aCwgcGF0aF9lbmQgKyAxLCBTQ1JBVENIX1NJWkUgLSAxKTsKKwkJaWYgKGxlbiA8IDApCisJCQlsZW4gPSAwOworCQkqcGF0aF9lbmQgPSAnXDAnOworCQlwYXRoX2VuZFsxICsgbGVuXSA9ICdcMCc7CisJCWRldmljZV9uYW1lID0gc3Ryc3RyKHBhdGhfZW5kICsgMSwgIlxuREVWTkFNRT0iKTsKKwkJaWYgKGRldmljZV9uYW1lKSB7CisJCQlkZXZpY2VfbmFtZSArPSBzaXplb2YoIlxuREVWTkFNRT0iKS0xOworCQkJc3RyY2hybnVsKGRldmljZV9uYW1lLCAnXG4nKVswXSA9ICdcMCc7CisJCX0gZWxzZSB7CisJCQkvKiBGYWxsIGJhY2sgdG8ganVzdCBiYXNlbmFtZSAqLworCQkJZGV2aWNlX25hbWUgPSAoY2hhciopIGJiX2Jhc2VuYW1lKHBhdGgpOworCQl9CisJfQorCS8qIERldGVybWluZSBkZXZpY2UgdHlwZSAqLworCS8qCisJICogaHR0cDovL2tlcm5lbC5vcmcvZG9jL3BlbmRpbmcvaG90cGx1Zy50eHQgc2F5cyB0aGF0IG9ubHkKKwkgKiAiL3N5cy9ibG9jay8uLi4iIGlzIGZvciBibG9jayBkZXZpY2VzLiAiL3N5cy9idXMiIGV0YyBpcyBub3QuCisJICogQnV0IHNpbmNlIDIuNi4yNSBibG9jayBkZXZpY2VzIGFyZSBhbHNvIGluIC9zeXMvY2xhc3MvYmxvY2suCisJICogV2UgdXNlIHN0cnN0cigiL2Jsb2NrLyIpIHRvIGZvcmVzdGFsbCBmdXR1cmUgc3VycHJpc2VzLgorCSAqLworCXR5cGUgPSBTX0lGQ0hSOworCWlmIChzdHJzdHIocGF0aCwgIi9ibG9jay8iKSB8fCAoRy5zdWJzeXN0ZW0gJiYgaXNfcHJlZml4ZWRfd2l0aChHLnN1YnN5c3RlbSwgImJsb2NrIikpKQorCQl0eXBlID0gU19JRkJMSzsKKworI2lmIEVOQUJMRV9GRUFUVVJFX01ERVZfQ09ORgorCUcucnVsZV9pZHggPSAwOyAvKiByZXN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZyAodGhpbmsgbWRldiAtcykgKi8KKyNlbmRpZgorCWZvciAoOzspIHsKKwkJY29uc3QgY2hhciAqc3RyX3RvX21hdGNoOworCQlyZWdtYXRjaF90IG9mZlsxICsgOSAqIEVOQUJMRV9GRUFUVVJFX01ERVZfUkVOQU1FX1JFR0VYUF07CisJCWNoYXIgKmNvbW1hbmQ7CisJCWNoYXIgKmFsaWFzOworCQljaGFyIGFsaWFzbGluayA9IGFsaWFzbGluazsgLyogZm9yIGNvbXBpbGVyICovCisJCWNoYXIgKm5vZGVfbmFtZTsKKwkJY29uc3Qgc3RydWN0IHJ1bGUgKnJ1bGU7CisKKwkJc3RyX3RvX21hdGNoID0gZGV2aWNlX25hbWU7CisKKwkJcnVsZSA9IG5leHRfcnVsZSgpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfTURFVl9DT05GCisJCWlmICghZW52X21hdGNoZXMocnVsZS0+ZW52bWF0Y2gpKQorCQkJY29udGludWU7CisJCWlmIChydWxlLT5tYWogPj0gMCkgeyAgLyogQG1haixtaW4gcnVsZSAqLworCQkJaWYgKG1ham9yICE9IHJ1bGUtPm1haikKKwkJCQljb250aW51ZTsKKwkJCWlmIChtaW5vciA8IHJ1bGUtPm1pbjAgfHwgbWlub3IgPiBydWxlLT5taW4xKQorCQkJCWNvbnRpbnVlOworCQkJbWVtc2V0KG9mZiwgMCwgc2l6ZW9mKG9mZikpOworCQkJZ290byBydWxlX21hdGNoZXM7CisJCX0KKwkJaWYgKHJ1bGUtPmVudnZhcikgeyAvKiAkZW52dmFyPXJlZ2V4IHJ1bGUgKi8KKwkJCXN0cl90b19tYXRjaCA9IGdldGVudihydWxlLT5lbnZ2YXIpOworCQkJZGJnMygiZ2V0ZW52KCclcycpOiclcyciLCBydWxlLT5lbnZ2YXIsIHN0cl90b19tYXRjaCk7CisJCQlpZiAoIXN0cl90b19tYXRjaCkKKwkJCQljb250aW51ZTsKKwkJfQorCQkvKiBlbHNlOiBzdHJfdG9fbWF0Y2ggPSBkZXZpY2VfbmFtZSAqLworCisJCWlmIChydWxlLT5yZWdleF9jb21waWxlZCkgeworCQkJaW50IHJlZ2V4X21hdGNoID0gcmVnZXhlYygmcnVsZS0+bWF0Y2gsIHN0cl90b19tYXRjaCwgQVJSQVlfU0laRShvZmYpLCBvZmYsIDApOworCQkJZGJnMygicmVnZXhfbWF0Y2ggZm9yICclcyc6JWQiLCBzdHJfdG9fbWF0Y2gsIHJlZ2V4X21hdGNoKTsKKwkJCS8vYmJfZXJyb3JfbXNnKCJtYXRjaGVzOiIpOworCQkJLy9mb3IgKGludCBpID0gMDsgaSA8IEFSUkFZX1NJWkUob2ZmKTsgaSsrKSB7CisJCQkvLwlpZiAob2ZmW2ldLnJtX3NvIDwgMCkgY29udGludWU7CisJCQkvLwliYl9lcnJvcl9tc2coIm1hdGNoICVkOiAnJS4qcydcbiIsIGksCisJCQkvLwkJKGludCkob2ZmW2ldLnJtX2VvIC0gb2ZmW2ldLnJtX3NvKSwKKwkJCS8vCQlkZXZpY2VfbmFtZSArIG9mZltpXS5ybV9zbyk7CisJCQkvL30KKworCQkJaWYgKHJlZ2V4X21hdGNoICE9IDAKKwkJCS8qIHJlZ2V4ZWMgcmV0dXJucyB3aG9sZSBwYXR0ZXJuIGFzICJyYW5nZSIgMCAqLworCQkJIHx8IG9mZlswXS5ybV9zbyAhPSAwCisJCQkgfHwgKGludClvZmZbMF0ucm1fZW8gIT0gKGludClzdHJsZW4oc3RyX3RvX21hdGNoKQorCQkJKSB7CisJCQkJY29udGludWU7IC8qIHRoaXMgcnVsZSBkb2Vzbid0IG1hdGNoICovCisJCQl9CisJCX0KKwkJLyogZWxzZTogaXQncyBmaW5hbCBpbXBsaWNpdCAibWF0Y2gtYWxsIiBydWxlICovCisgcnVsZV9tYXRjaGVzOgorCQlkYmcyKCJydWxlIG1hdGNoZWQsIGxpbmUgJWQiLCBHLnBhcnNlciA/IEcucGFyc2VyLT5saW5lbm8gOiAtMSk7CisjZW5kaWYKKwkJLyogQnVpbGQgYWxpYXMgbmFtZSAqLworCQlhbGlhcyA9IE5VTEw7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9NREVWX1JFTkFNRSAmJiBydWxlLT5yZW5fbW92KSB7CisJCQlhbGlhc2xpbmsgPSBydWxlLT5yZW5fbW92WzBdOworCQkJaWYgKGFsaWFzbGluayA9PSAnIScpIHsKKwkJCQkvKiAiISI6IHN1cHByZXNzIG5vZGUgY3JlYXRpb24vZGVsZXRpb24gKi8KKwkJCQltYWpvciA9IC0yOworCQkJfQorCQkJZWxzZSBpZiAoYWxpYXNsaW5rID09ICc+JyB8fCBhbGlhc2xpbmsgPT0gJz0nKSB7CisJCQkJaWYgKEVOQUJMRV9GRUFUVVJFX01ERVZfUkVOQU1FX1JFR0VYUCkgeworCQkJCQljaGFyICpzOworCQkJCQljaGFyICpwOworCQkJCQl1bnNpZ25lZCBuOworCisJCQkJCS8qIHN1YnN0aXR1dGUgJTEuLjkgd2l0aCBvZmZbMS4uOV0sIGlmIGFueSAqLworCQkJCQluID0gMDsKKwkJCQkJcyA9IHJ1bGUtPnJlbl9tb3Y7CisJCQkJCXdoaWxlICgqcykKKwkJCQkJCWlmICgqcysrID09ICclJykKKwkJCQkJCQluKys7CisKKwkJCQkJcCA9IGFsaWFzID0geHphbGxvYyhzdHJsZW4ocnVsZS0+cmVuX21vdikgKyBuICogc3RybGVuKHN0cl90b19tYXRjaCkpOworCQkJCQlzID0gcnVsZS0+cmVuX21vdiArIDE7CisJCQkJCXdoaWxlICgqcykgeworCQkJCQkJKnAgPSAqczsKKwkJCQkJCWlmICgnJScgPT0gKnMpIHsKKwkJCQkJCQl1bnNpZ25lZCBpID0gKHNbMV0gLSAnMCcpOworCQkJCQkJCWlmIChpIDw9IDkgJiYgb2ZmW2ldLnJtX3NvID49IDApIHsKKwkJCQkJCQkJbiA9IG9mZltpXS5ybV9lbyAtIG9mZltpXS5ybV9zbzsKKwkJCQkJCQkJc3RybmNweShwLCBzdHJfdG9fbWF0Y2ggKyBvZmZbaV0ucm1fc28sIG4pOworCQkJCQkJCQlwICs9IG4gLSAxOworCQkJCQkJCQlzKys7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCQkJcCsrOworCQkJCQkJcysrOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJYWxpYXMgPSB4c3RyZHVwKHJ1bGUtPnJlbl9tb3YgKyAxKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZGJnMygiYWxpYXM6JyVzJyIsIGFsaWFzKTsKKworCQljb21tYW5kID0gTlVMTDsKKwkJSUZfRkVBVFVSRV9NREVWX0VYRUMoY29tbWFuZCA9IHJ1bGUtPnJfY21kOykKKwkJaWYgKGNvbW1hbmQpIHsKKwkJCS8qIEFyZSB3ZSBydW5uaW5nIHRoaXMgY29tbWFuZCBub3c/CisJCQkgKiBSdW4gQGNtZCBvbiBjcmVhdGUsICRjbWQgb24gZGVsZXRlLCAqY21kIG9uIGFueQorCQkJICovCisJCQlpZiAoKGNvbW1hbmRbMF0gPT0gJ0AnICYmIG9wZXJhdGlvbiA9PSBPUF9hZGQpCisJCQkgfHwgKGNvbW1hbmRbMF0gPT0gJyQnICYmIG9wZXJhdGlvbiA9PSBPUF9yZW1vdmUpCisJCQkgfHwgKGNvbW1hbmRbMF0gPT0gJyonKQorCQkJKSB7CisJCQkJY29tbWFuZCsrOworCQkJfSBlbHNlIHsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0KKwkJfQorCQlkYmczKCJjb21tYW5kOiclcyciLCBjb21tYW5kKTsKKworCQkvKiAiRXhlY3V0ZSIgdGhlIGxpbmUgd2UgZm91bmQgKi8KKwkJbm9kZV9uYW1lID0gZGV2aWNlX25hbWU7CisJCWlmIChFTkFCTEVfRkVBVFVSRV9NREVWX1JFTkFNRSAmJiBhbGlhcykgeworCQkJbm9kZV9uYW1lID0gYWxpYXMgPSBidWlsZF9hbGlhcyhhbGlhcywgZGV2aWNlX25hbWUpOworCQkJZGJnMygiYWxpYXMyOiclcyciLCBhbGlhcyk7CisJCX0KKworCQlpZiAob3BlcmF0aW9uID09IE9QX2FkZCAmJiBtYWpvciA+PSAwKSB7CisJCQljaGFyICpzbGFzaCA9IHN0cnJjaHIobm9kZV9uYW1lLCAnLycpOworCQkJaWYgKHNsYXNoKSB7CisJCQkJKnNsYXNoID0gJ1wwJzsKKwkJCQlta2Rpcl9yZWN1cnNpdmUobm9kZV9uYW1lKTsKKwkJCQkqc2xhc2ggPSAnLyc7CisJCQl9CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfTURFVl9DT05GKSB7CisJCQkJZGJnMSgibWtub2QgJXMgKCVkLCVkKSAlbyIKKwkJCQkJIiAldToldSIsCisJCQkJCW5vZGVfbmFtZSwgbWFqb3IsIG1pbm9yLCBydWxlLT5tb2RlIHwgdHlwZSwKKwkJCQkJcnVsZS0+dWdpZC51aWQsIHJ1bGUtPnVnaWQuZ2lkCisJCQkJKTsKKwkJCX0gZWxzZSB7CisJCQkJZGJnMSgibWtub2QgJXMgKCVkLCVkKSAlbyIsCisJCQkJCW5vZGVfbmFtZSwgbWFqb3IsIG1pbm9yLCBydWxlLT5tb2RlIHwgdHlwZQorCQkJCSk7CisJCQl9CisJCQlpZiAobWtub2Qobm9kZV9uYW1lLCBydWxlLT5tb2RlIHwgdHlwZSwgbWFrZWRldihtYWpvciwgbWlub3IpKSAmJiBlcnJubyAhPSBFRVhJU1QpCisJCQkJYmJfcGVycm9yX21zZygiY2FuJ3QgY3JlYXRlICclcyciLCBub2RlX25hbWUpOworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX01ERVZfQ09ORikgeworCQkJCWNobW9kKG5vZGVfbmFtZSwgcnVsZS0+bW9kZSk7CisJCQkJY2hvd24obm9kZV9uYW1lLCBydWxlLT51Z2lkLnVpZCwgcnVsZS0+dWdpZC5naWQpOworCQkJfQorCQkJaWYgKG1ham9yID09IEcucm9vdF9tYWpvciAmJiBtaW5vciA9PSBHLnJvb3RfbWlub3IpCisJCQkJc3ltbGluayhub2RlX25hbWUsICJyb290Iik7CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfTURFVl9SRU5BTUUgJiYgYWxpYXMpIHsKKwkJCQlpZiAoYWxpYXNsaW5rID09ICc+JykgeworLy9UT0RPOiBvbiBkZXZ0bXBmcywgZGV2aWNlX25hbWUgYWxyZWFkeSBleGlzdHMgYW5kIHN5bWxpbmsoKSBmYWlscy4KKy8vRW5kIHJlc3VsdCBpcyB0aGF0IGluc3RlYWQgb2Ygc3ltbGluaywgd2UgaGF2ZSB0d28gbm9kZXMuCisvL1doYXQgc2hvdWxkIGJlIGRvbmU/CisJCQkJCWRiZzEoInN5bWxpbms6ICVzIiwgZGV2aWNlX25hbWUpOworCQkJCQlzeW1saW5rKG5vZGVfbmFtZSwgZGV2aWNlX25hbWUpOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWlmIChFTkFCTEVfRkVBVFVSRV9NREVWX0VYRUMgJiYgY29tbWFuZCkgeworCQkJLyogc2V0ZW52IHdpbGwgbGVhayBtZW1vcnksIHVzZSBwdXRlbnYvdW5zZXRlbnYvZnJlZSAqLworCQkJY2hhciAqcyA9IHhhc3ByaW50ZigiJXM9JXMiLCAiTURFViIsIG5vZGVfbmFtZSk7CisJCQlwdXRlbnYocyk7CisJCQlkYmcxKCJydW5uaW5nOiAlcyIsIGNvbW1hbmQpOworCQkJaWYgKHN5c3RlbShjb21tYW5kKSA9PSAtMSkKKwkJCQliYl9wZXJyb3JfbXNnKCJjYW4ndCBydW4gJyVzJyIsIGNvbW1hbmQpOworCQkJYmJfdW5zZXRlbnZfYW5kX2ZyZWUocyk7CisJCX0KKworCQlpZiAob3BlcmF0aW9uID09IE9QX3JlbW92ZSAmJiBtYWpvciA+PSAtMSkgeworCQkJaWYgKEVOQUJMRV9GRUFUVVJFX01ERVZfUkVOQU1FICYmIGFsaWFzKSB7CisJCQkJaWYgKGFsaWFzbGluayA9PSAnPicpIHsKKwkJCQkJZGJnMSgidW5saW5rOiAlcyIsIGRldmljZV9uYW1lKTsKKwkJCQkJdW5saW5rKGRldmljZV9uYW1lKTsKKwkJCQl9CisJCQl9CisJCQlkYmcxKCJ1bmxpbms6ICVzIiwgbm9kZV9uYW1lKTsKKwkJCXVubGluayhub2RlX25hbWUpOworCQl9CisKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX01ERVZfUkVOQU1FKQorCQkJZnJlZShhbGlhcyk7CisKKwkJLyogV2UgZm91bmQgbWF0Y2hpbmcgbGluZS4KKwkJICogU3RvcCB1bmxlc3MgaXQgd2FzIHByZWZpeGVkIHdpdGggJy0nCisJCSAqLworCQlpZiAoIUVOQUJMRV9GRUFUVVJFX01ERVZfQ09ORiB8fCAhcnVsZS0+a2VlcF9tYXRjaGluZykKKwkJCWJyZWFrOworCX0gLyogZm9yICg7OykgKi8KK30KKworLyogRmlsZSBjYWxsYmFjayBmb3IgL3N5cy8gdHJhdmVyc2FsICovCitzdGF0aWMgaW50IEZBU1RfRlVOQyBmaWxlQWN0aW9uKGNvbnN0IGNoYXIgKmZpbGVOYW1lLAorCQlzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZiBVTlVTRURfUEFSQU0sCisJCXZvaWQgKnVzZXJEYXRhLAorCQlpbnQgZGVwdGggVU5VU0VEX1BBUkFNKQoreworCXNpemVfdCBsZW4gPSBzdHJsZW4oZmlsZU5hbWUpIC0gNDsgLyogY2FuJ3QgdW5kZXJmbG93ICovCisJY2hhciAqc2NyYXRjaCA9IHVzZXJEYXRhOworCisJLyogbGVuIGNoZWNrIGlzIGZvciBwYXJhbm9pZCByZWFzb25zICovCisJaWYgKHN0cmNtcChmaWxlTmFtZSArIGxlbiwgIi9kZXYiKSAhPSAwIHx8IGxlbiA+PSBQQVRIX01BWCkKKwkJcmV0dXJuIEZBTFNFOworCisJc3RyY3B5KHNjcmF0Y2gsIGZpbGVOYW1lKTsKKwlzY3JhdGNoW2xlbl0gPSAnXDAnOworCW1ha2VfZGV2aWNlKC8qREVWTkFNRToqLyBOVUxMLCBzY3JhdGNoLCBPUF9hZGQpOworCisJcmV0dXJuIFRSVUU7Cit9CisKKy8qIERpcmVjdG9yeSBjYWxsYmFjayBmb3IgL3N5cy8gdHJhdmVyc2FsICovCitzdGF0aWMgaW50IEZBU1RfRlVOQyBkaXJBY3Rpb24oY29uc3QgY2hhciAqZmlsZU5hbWUgVU5VU0VEX1BBUkFNLAorCQlzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZiBVTlVTRURfUEFSQU0sCisJCXZvaWQgKnVzZXJEYXRhIFVOVVNFRF9QQVJBTSwKKwkJaW50IGRlcHRoKQoreworCS8qIEV4dHJhY3QgZGV2aWNlIHN1YnN5c3RlbSAtLSB0aGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5CisJICogdW5kZXIgL3N5cy9jbGFzcy8gKi8KKwlpZiAoMSA9PSBkZXB0aCkgeworCQlmcmVlKEcuc3Vic3lzdGVtKTsKKwkJaWYgKEcuc3Vic3lzX2VudikgeworCQkJYmJfdW5zZXRlbnZfYW5kX2ZyZWUoRy5zdWJzeXNfZW52KTsKKwkJCUcuc3Vic3lzX2VudiA9IE5VTEw7CisJCX0KKwkJRy5zdWJzeXN0ZW0gPSBzdHJyY2hyKGZpbGVOYW1lLCAnLycpOworCQlpZiAoRy5zdWJzeXN0ZW0pIHsKKwkJCUcuc3Vic3lzdGVtID0geHN0cmR1cChHLnN1YnN5c3RlbSArIDEpOworCQkJRy5zdWJzeXNfZW52ID0geGFzcHJpbnRmKCIlcz0lcyIsICJTVUJTWVNURU0iLCBHLnN1YnN5c3RlbSk7CisJCQlwdXRlbnYoRy5zdWJzeXNfZW52KTsKKwkJfQorCX0KKworCXJldHVybiAoZGVwdGggPj0gTUFYX1NZU0ZTX0RFUFRIID8gU0tJUCA6IFRSVUUpOworfQorCisvKiBGb3IgdGhlIGZ1bGwgZ29yeSBkZXRhaWxzLCBzZWUgbGludXgvRG9jdW1lbnRhdGlvbi9maXJtd2FyZV9jbGFzcy9SRUFETUUKKyAqCisgKiBGaXJtd2FyZSBsb2FkaW5nIHdvcmtzIGxpa2UgdGhpczoKKyAqIC0ga2VybmVsIHNldHMgRklSTVdBUkUgZW52IHZhcgorICogLSB1c2Vyc3BhY2UgY2hlY2tzIC9saWIvZmlybXdhcmUvJEZJUk1XQVJFCisgKiAtIHVzZXJzcGFjZSB3YWl0cyBmb3IgL3N5cy8kREVWUEFUSC9sb2FkaW5nIHRvIGFwcGVhcgorICogLSB1c2Vyc3BhY2Ugd3JpdGVzICIxIiB0byAvc3lzLyRERVZQQVRIL2xvYWRpbmcKKyAqIC0gdXNlcnNwYWNlIGNvcGllcyAvbGliL2Zpcm13YXJlLyRGSVJNV0FSRSBpbnRvIC9zeXMvJERFVlBBVEgvZGF0YQorICogLSB1c2Vyc3BhY2Ugd3JpdGVzICIwIiAod29ya2VkKSBvciAiLTEiIChmYWlsZWQpIHRvIC9zeXMvJERFVlBBVEgvbG9hZGluZworICogLSBrZXJuZWwgbG9hZHMgZmlybXdhcmUgaW50byBkZXZpY2UKKyAqLworc3RhdGljIHZvaWQgbG9hZF9maXJtd2FyZShjb25zdCBjaGFyICpmaXJtd2FyZSwgY29uc3QgY2hhciAqc3lzZnNfcGF0aCkKK3sKKwlpbnQgY250OworCWludCBmaXJtd2FyZV9mZCwgbG9hZGluZ19mZDsKKworCS8qIGNoZWNrIGZvciAvbGliL2Zpcm13YXJlLyRGSVJNV0FSRSAqLworCXhjaGRpcigiL2xpYi9maXJtd2FyZSIpOworCWZpcm13YXJlX2ZkID0gb3BlbihmaXJtd2FyZSwgT19SRE9OTFkpOyAvKiBjYW4gZmFpbCAqLworCisJLyogY2hlY2sgZm9yIC9zeXMvJERFVlBBVEgvbG9hZGluZyAuLi4gZ2l2ZSAzMCBzZWNvbmRzIHRvIGFwcGVhciAqLworCXhjaGRpcihzeXNmc19wYXRoKTsKKwlmb3IgKGNudCA9IDA7IGNudCA8IDMwOyArK2NudCkgeworCQlsb2FkaW5nX2ZkID0gb3BlbigibG9hZGluZyIsIE9fV1JPTkxZKTsKKwkJaWYgKGxvYWRpbmdfZmQgPj0gMCkKKwkJCWdvdG8gbG9hZGluZzsKKwkJc2xlZXAoMSk7CisJfQorCWdvdG8gb3V0OworCisgbG9hZGluZzoKKwljbnQgPSAwOworCWlmIChmaXJtd2FyZV9mZCA+PSAwKSB7CisJCWludCBkYXRhX2ZkOworCisJCS8qIHRlbGwga2VybmVsIHdlJ3JlIGxvYWRpbmcgYnkgImVjaG8gMSA+IC9zeXMvJERFVlBBVEgvbG9hZGluZyIgKi8KKwkJaWYgKGZ1bGxfd3JpdGUobG9hZGluZ19mZCwgIjEiLCAxKSAhPSAxKQorCQkJZ290byBvdXQ7CisKKwkJLyogbG9hZCBmaXJtd2FyZSBpbnRvIC9zeXMvJERFVlBBVEgvZGF0YSAqLworCQlkYXRhX2ZkID0gb3BlbigiZGF0YSIsIE9fV1JPTkxZKTsKKwkJaWYgKGRhdGFfZmQgPCAwKQorCQkJZ290byBvdXQ7CisJCWNudCA9IGJiX2NvcHlmZF9lb2YoZmlybXdhcmVfZmQsIGRhdGFfZmQpOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQljbG9zZShkYXRhX2ZkKTsKKwl9CisKKwkvKiBUZWxsIGtlcm5lbCByZXN1bHQgYnkgImVjaG8gWzB8LTFdID4gL3N5cy8kREVWUEFUSC9sb2FkaW5nIgorCSAqIE5vdGU6IHdlIGVtaXQgLTEgYWxzbyBpZiBmaXJtd2FyZSBmaWxlIHdhc24ndCBmb3VuZC4KKwkgKiBUaGVyZSBhcmUgY2FzZXMgd2hlbiBvdGhlcndpc2Uga2VybmVsIHdvdWxkIHdhaXQgZm9yIG1pbnV0ZXMKKwkgKiBiZWZvcmUgdGltaW5nIG91dC4KKwkgKi8KKwlpZiAoY250ID4gMCkKKwkJZnVsbF93cml0ZShsb2FkaW5nX2ZkLCAiMCIsIDEpOworCWVsc2UKKwkJZnVsbF93cml0ZShsb2FkaW5nX2ZkLCAiLTEiLCAyKTsKKworIG91dDoKKwl4Y2hkaXIoIi9kZXYiKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJY2xvc2UoZmlybXdhcmVfZmQpOworCQljbG9zZShsb2FkaW5nX2ZkKTsKKwl9Cit9CisKK3N0YXRpYyBjaGFyICpjdXJ0aW1lKHZvaWQpCit7CisJc3RydWN0IHRpbWV2YWwgdHY7CisJZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisJc3ByaW50ZigKKwkJc3RyZnRpbWVfSEhNTVNTKEcudGltZXN0ciwgc2l6ZW9mKEcudGltZXN0ciksICZ0di50dl9zZWMpLAorCQkiLiUwNnUiLAorCQkodW5zaWduZWQpdHYudHZfdXNlYworCSk7CisJcmV0dXJuIEcudGltZXN0cjsKK30KKworc3RhdGljIHZvaWQgb3Blbl9tZGV2X2xvZyhjb25zdCBjaGFyICpzZXEsIHVuc2lnbmVkIG15X3BpZCkKK3sKKwlpbnQgbG9nZmQgPSBvcGVuKCJtZGV2LmxvZyIsIE9fV1JPTkxZIHwgT19BUFBFTkQpOworCWlmIChsb2dmZCA+PSAwKSB7CisJCXhtb3ZlX2ZkKGxvZ2ZkLCBTVERFUlJfRklMRU5PKTsKKwkJRy52ZXJib3NlID0gMjsKKwkJYXBwbGV0X25hbWUgPSB4YXNwcmludGYoIiVzWyVzXSIsIGFwcGxldF9uYW1lLCBzZXEgPyBzZXEgOiB1dG9hKG15X3BpZCkpOworCX0KK30KKworLyogSWYgaXQgZXhpc3RzLCBkb2VzIC9kZXYvbWRldi5zZXEgbWF0Y2ggJFNFUU5VTT8KKyAqIElmIGl0IGRvZXMgbm90IG1hdGNoLCBlYXJsaWVyIG1kZXYgaXMgcnVubmluZworICogaW4gcGFyYWxsZWwsIGFuZCB3ZSBuZWVkIHRvIHdhaXQuCisgKiBBY3RpdmUgbWRldiBwb2tlcyB1cyB3aXRoIFNJR0NITEQgdG8gY2hlY2sgdGhlIG5ldyBmaWxlLgorICovCitzdGF0aWMgaW50Cit3YWl0X2Zvcl9zZXFmaWxlKHVuc2lnbmVkIGV4cGVjdGVkX3NlcSkKK3sKKwkvKiBXZSB0aW1lIG91dCBhZnRlciAyIHNlYyAqLworCXN0YXRpYyBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgdHMgPSB7IDAsIDMyKjEwMDAqMTAwMCB9OworCWludCB0aW1lb3V0ID0gMjAwMCAvIDMyOworCWludCBzZXFfZmQgPSAtMTsKKwlpbnQgZG9fb25jZSA9IDE7CisJc2lnc2V0X3Qgc2V0X0NITEQ7CisKKwlzaWdlbXB0eXNldCgmc2V0X0NITEQpOworCXNpZ2FkZHNldCgmc2V0X0NITEQsIFNJR0NITEQpOworCXNpZ3Byb2NtYXNrKFNJR19CTE9DSywgJnNldF9DSExELCBOVUxMKTsKKworCWZvciAoOzspIHsKKwkJaW50IHNlcWxlbjsKKwkJY2hhciBzZXFidWZbc2l6ZW9mKGxvbmcpKjMgKyAyXTsKKwkJdW5zaWduZWQgc2VxYnVmbnVtOworCisJCWlmIChzZXFfZmQgPCAwKSB7CisJCQlzZXFfZmQgPSBvcGVuKCJtZGV2LnNlcSIsIE9fUkRXUik7CisJCQlpZiAoc2VxX2ZkIDwgMCkKKwkJCQlicmVhazsKKwkJCWNsb3NlX29uX2V4ZWNfb24oc2VxX2ZkKTsKKwkJfQorCQlzZXFsZW4gPSBwcmVhZChzZXFfZmQsIHNlcWJ1Ziwgc2l6ZW9mKHNlcWJ1ZikgLSAxLCAwKTsKKwkJaWYgKHNlcWxlbiA8IDApIHsKKwkJCWNsb3NlKHNlcV9mZCk7CisJCQlzZXFfZmQgPSAtMTsKKwkJCWJyZWFrOworCQl9CisJCXNlcWJ1ZltzZXFsZW5dID0gJ1wwJzsKKwkJaWYgKHNlcWJ1ZlswXSA9PSAnXG4nIHx8IHNlcWJ1ZlswXSA9PSAnXDAnKSB7CisJCQkvKiBzZWVkIGZpbGU6IHdyaXRlIG91dCBzZXEgQVNBUCAqLworCQkJeHdyaXRlX3N0cihzZXFfZmQsIHV0b2EoZXhwZWN0ZWRfc2VxKSk7CisJCQl4bHNlZWsoc2VxX2ZkLCAwLCBTRUVLX1NFVCk7CisJCQlkYmcyKCJmaXJzdCBzZXEgd3JpdHRlbiIpOworCQkJYnJlYWs7CisJCX0KKwkJc2VxYnVmbnVtID0gYXRvbGwoc2VxYnVmKTsKKwkJaWYgKHNlcWJ1Zm51bSA9PSBleHBlY3RlZF9zZXEpIHsKKwkJCS8qIGNvcnJlY3QgaWR4ICovCisJCQlicmVhazsKKwkJfQorCQlpZiAoc2VxYnVmbnVtID4gZXhwZWN0ZWRfc2VxKSB7CisJCQkvKiBhIGxhdGVyIG1kZXYgcnVucyBhbHJlYWR5ICh0aGlzIHdhcyBzZWVuIGJ5IHVzZXJzIHRvIGhhcHBlbikgKi8KKwkJCS8qIGRvIG5vdCBvdmVyd3JpdGUgc2VxZmlsZSBvbiBleGl0ICovCisJCQljbG9zZShzZXFfZmQpOworCQkJc2VxX2ZkID0gLTE7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZG9fb25jZSkgeworCQkJZGJnMigiJXMgbWRldi5zZXE9JyVzJywgbmVlZCAnJXUnIiwgY3VydGltZSgpLCBzZXFidWYsIGV4cGVjdGVkX3NlcSk7CisJCQlkb19vbmNlID0gMDsKKwkJfQorCQlpZiAoc2lndGltZWR3YWl0KCZzZXRfQ0hMRCwgTlVMTCwgJnRzKSA+PSAwKSB7CisJCQlkYmczKCJ3b2tlbiB1cCIpOworCQkJY29udGludWU7IC8qIGRvbid0IGRlY3JlbWVudCB0aW1lb3V0ISAqLworCQl9CisJCWlmICgtLXRpbWVvdXQgPT0gMCkgeworCQkJZGJnMSgiJXMgbWRldi5zZXE9JyVzJyIsICJ0aW1lZCBvdXQiLCBzZXFidWYpOworCQkJYnJlYWs7CisJCX0KKwl9CisJc2lncHJvY21hc2soU0lHX1VOQkxPQ0ssICZzZXRfQ0hMRCwgTlVMTCk7CisJcmV0dXJuIHNlcV9mZDsKK30KKworc3RhdGljIHZvaWQgc2lnbmFsX21kZXZzKHVuc2lnbmVkIG15X3BpZCkKK3sKKwlwcm9jcHNfc3RhdHVzX3QqIHAgPSBOVUxMOworCXdoaWxlICgocCA9IHByb2Nwc19zY2FuKHAsIFBTU0NBTl9BUkdWMCkpICE9IE5VTEwpIHsKKwkJaWYgKHAtPnBpZCAhPSBteV9waWQKKwkJICYmIHAtPmFyZ3YwCisJCSAmJiBzdHJjbXAoYmJfYmFzZW5hbWUocC0+YXJndjApLCAibWRldiIpID09IDAKKwkJKSB7CisJCQlraWxsKHAtPnBpZCwgU0lHQ0hMRCk7CisJCX0KKwl9Cit9CisKK2ludCBtZGV2X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBtZGV2X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlSRVNFUlZFX0NPTkZJR19CVUZGRVIodGVtcCwgUEFUSF9NQVggKyBTQ1JBVENIX1NJWkUpOworCisJSU5JVF9HKCk7CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NREVWX0NPTkYKKwlHLmZpbGVuYW1lID0gIi9ldGMvbWRldi5jb25mIjsKKyNlbmRpZgorCisJLyogV2UgY2FuIGJlIGNhbGxlZCBhcyBob3RwbHVnIGhlbHBlciAqLworCS8qIEtlcm5lbCBjYW5ub3QgcHJvdmlkZSBzdWl0YWJsZSBzdGRpbyBmZHMgZm9yIHVzLCBkbyBpdCBvdXJzZWxmICovCisJYmJfc2FuaXRpemVfc3RkaW8oKTsKKworCS8qIEZvcmNlIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgc2V0dGluZ3MgZXhhY3RseSAqLworCXVtYXNrKDApOworCisJeGNoZGlyKCIvZGV2Iik7CisKKwlpZiAoYXJndlsxXSAmJiBzdHJjbXAoYXJndlsxXSwgIi1zIikgPT0gMCkgeworCQkvKgorCQkgKiBTY2FuOiBtZGV2IC1zCisJCSAqLworCQlzdHJ1Y3Qgc3RhdCBzdDsKKworI2lmIEVOQUJMRV9GRUFUVVJFX01ERVZfQ09ORgorCQkvKiBTYW1lIGFzIHhyZWFsbG9jX3ZlY3RvcihOVUxMLCA0LCAwKTogKi8KKwkJRy5ydWxlX3ZlYyA9IHh6YWxsb2MoKDEgPDwgNCkgKiBzaXplb2YoKkcucnVsZV92ZWMpKTsKKyNlbmRpZgorCQl4c3RhdCgiLyIsICZzdCk7CisJCUcucm9vdF9tYWpvciA9IG1ham9yKHN0LnN0X2Rldik7CisJCUcucm9vdF9taW5vciA9IG1pbm9yKHN0LnN0X2Rldik7CisKKwkJcHV0ZW52KChjaGFyKikiQUNUSU9OPWFkZCIpOworCisJCS8qIEFDVElPTl9GT0xMT1dMSU5LUyBpcyBuZWVkZWQgc2luY2UgaW4gbmV3ZXIga2VybmVscworCQkgKiAvc3lzL2Jsb2NrL2xvb3AqIChmb3IgZXhhbXBsZSkgYXJlIHN5bWxpbmtzIHRvIGRpcnMsCisJCSAqIG5vdCByZWFsIGRpcmVjdG9yaWVzLgorCQkgKiAoa2VybmVsJ3MgQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQgbWFrZXMgdGhlbSByZWFsIGRpcnMsCisJCSAqIGJ1dCB3ZSBjYW4ndCBlbmZvcmNlIHRoYXQgb24gdXNlcnMpCisJCSAqLworCQlpZiAoYWNjZXNzKCIvc3lzL2NsYXNzL2Jsb2NrIiwgRl9PSykgIT0gMCkgeworCQkJLyogU2NhbiBvYnNvbGV0ZSAvc3lzL2Jsb2NrIG9ubHkgaWYgL3N5cy9jbGFzcy9ibG9jaworCQkJICogZG9lc24ndCBleGlzdC4gT3RoZXJ3aXNlIHdlJ2xsIGhhdmUgZHVwZXMuCisJCQkgKiBBbHNvLCBkbyBub3QgY29tcGxhaW4gaWYgaXQgZG9lc24ndCBleGlzdC4KKwkJCSAqIFNvbWUgcGVvcGxlIGNvbmZpZ3VyZSBrZXJuZWwgdG8gaGF2ZSBubyBibG9ja2RldnMuCisJCQkgKi8KKwkJCXJlY3Vyc2l2ZV9hY3Rpb24oIi9zeXMvYmxvY2siLAorCQkJCUFDVElPTl9SRUNVUlNFIHwgQUNUSU9OX0ZPTExPV0xJTktTIHwgQUNUSU9OX1FVSUVULAorCQkJCWZpbGVBY3Rpb24sIGRpckFjdGlvbiwgdGVtcCwgMCk7CisJCX0KKwkJcmVjdXJzaXZlX2FjdGlvbigiL3N5cy9jbGFzcyIsCisJCQlBQ1RJT05fUkVDVVJTRSB8IEFDVElPTl9GT0xMT1dMSU5LUywKKwkJCWZpbGVBY3Rpb24sIGRpckFjdGlvbiwgdGVtcCwgMCk7CisJfSBlbHNlIHsKKwkJY2hhciAqZnc7CisJCWNoYXIgKnNlcTsKKwkJY2hhciAqYWN0aW9uOworCQljaGFyICplbnZfZGV2bmFtZTsKKwkJY2hhciAqZW52X2RldnBhdGg7CisJCXVuc2lnbmVkIG15X3BpZDsKKwkJdW5zaWduZWQgc2VxbnVtID0gc2VxbnVtOyAvKiBmb3IgY29tcGlsZXIgKi8KKwkJaW50IHNlcV9mZDsKKwkJc21hbGx1aW50IG9wOworCisJCS8qIEhvdHBsdWc6CisJCSAqIGVudiBBQ1RJT049Li4uIERFVlBBVEg9Li4uIFNVQlNZU1RFTT0uLi4gW1NFUU5VTT0uLi5dIG1kZXYKKwkJICogQUNUSU9OIGNhbiBiZSAiYWRkIiwgInJlbW92ZSIsICJjaGFuZ2UiCisJCSAqIERFVlBBVEggaXMgbGlrZSAiL2Jsb2NrL3NkYSIgb3IgIi9jbGFzcy9pbnB1dC9taWNlIgorCQkgKi8KKwkJZW52X2Rldm5hbWUgPSBnZXRlbnYoIkRFVk5BTUUiKTsgLyogY2FuIGJlIE5VTEwgKi8KKwkJRy5zdWJzeXN0ZW0gPSBnZXRlbnYoIlNVQlNZU1RFTSIpOworCQlhY3Rpb24gPSBnZXRlbnYoIkFDVElPTiIpOworCQllbnZfZGV2cGF0aCA9IGdldGVudigiREVWUEFUSCIpOworCQlpZiAoIWFjdGlvbiB8fCAhZW52X2RldnBhdGggLyp8fCAhRy5zdWJzeXN0ZW0qLykKKwkJCWJiX3Nob3dfdXNhZ2UoKTsKKwkJZncgPSBnZXRlbnYoIkZJUk1XQVJFIik7CisJCXNlcSA9IGdldGVudigiU0VRTlVNIik7CisJCW9wID0gaW5kZXhfaW5fc3RyaW5ncyhrZXl3b3JkcywgYWN0aW9uKTsKKworCQlteV9waWQgPSBnZXRwaWQoKTsKKwkJb3Blbl9tZGV2X2xvZyhzZXEsIG15X3BpZCk7CisKKwkJc2VxX2ZkID0gLTE7CisJCWlmIChzZXEpIHsKKwkJCXNlcW51bSA9IGF0b2xsKHNlcSk7CisJCQlzZXFfZmQgPSB3YWl0X2Zvcl9zZXFmaWxlKHNlcW51bSk7CisJCX0KKworCQlkYmcxKCIlcyAiCisJCQkiQUNUSU9OOiVzIFNVQlNZU1RFTTolcyBERVZOQU1FOiVzIERFVlBBVEg6JXMiCisJCQkiJXMlcyIsCisJCQljdXJ0aW1lKCksCisJCQlhY3Rpb24sIEcuc3Vic3lzdGVtLCBlbnZfZGV2bmFtZSwgZW52X2RldnBhdGgsCisJCQlmdyA/ICIgRlc6IiA6ICIiLCBmdyA/IGZ3IDogIiIKKwkJKTsKKworCQlzbnByaW50Zih0ZW1wLCBQQVRIX01BWCwgIi9zeXMlcyIsIGVudl9kZXZwYXRoKTsKKwkJaWYgKG9wID09IE9QX3JlbW92ZSkgeworCQkJLyogSWdub3JpbmcgInJlbW92ZSBmaXJtd2FyZSIuIEl0IHdhcyByZXBvcnRlZAorCQkJICogdG8gaGFwcGVuIGFuZCB0byBjYXVzZSBlcnJvbmVvdXMgZGVsZXRpb24KKwkJCSAqIG9mIGRldmljZSBub2Rlcy4gKi8KKwkJCWlmICghZncpCisJCQkJbWFrZV9kZXZpY2UoZW52X2Rldm5hbWUsIHRlbXAsIG9wKTsKKwkJfQorCQllbHNlIHsKKwkJCW1ha2VfZGV2aWNlKGVudl9kZXZuYW1lLCB0ZW1wLCBvcCk7CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfTURFVl9MT0FEX0ZJUk1XQVJFKSB7CisJCQkJaWYgKG9wID09IE9QX2FkZCAmJiBmdykKKwkJCQkJbG9hZF9maXJtd2FyZShmdywgdGVtcCk7CisJCQl9CisJCX0KKworCQlkYmcxKCIlcyBleGl0aW5nIiwgY3VydGltZSgpKTsKKwkJaWYgKHNlcV9mZCA+PSAwKSB7CisJCQl4d3JpdGVfc3RyKHNlcV9mZCwgdXRvYShzZXFudW0gKyAxKSk7CisJCQlzaWduYWxfbWRldnMobXlfcGlkKTsKKwkJfQorCX0KKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJUkVMRUFTRV9DT05GSUdfQlVGRkVSKHRlbXApOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvbWluaXguaCBiL3V0aWwtbGludXgvbWluaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGZiY2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9taW5peC5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBUaGlzIGlzIHRoZSBvcmlnaW5hbCBtaW5peCBpbm9kZSBsYXlvdXQgb24gZGlzay4KKyAqIE5vdGUgdGhlIDgtYml0IGdpZCBhbmQgYXRpbWUgYW5kIGN0aW1lLgorICovCitzdHJ1Y3QgbWluaXgxX2lub2RlIHsKKwl1aW50MTZfdCBpX21vZGU7CisJdWludDE2X3QgaV91aWQ7CisJdWludDMyX3QgaV9zaXplOworCXVpbnQzMl90IGlfdGltZTsKKwl1aW50OF90ICBpX2dpZDsKKwl1aW50OF90ICBpX25saW5rczsKKwl1aW50MTZfdCBpX3pvbmVbOV07Cit9OworCisvKgorICogVGhlIG5ldyBtaW5peCBpbm9kZSBoYXMgYWxsIHRoZSB0aW1lIGVudHJpZXMsIGFzIHdlbGwgYXMKKyAqIGxvbmcgYmxvY2sgbnVtYmVycyBhbmQgYSB0aGlyZCBpbmRpcmVjdCBibG9jayAoNysxKzErMQorICogaW5zdGVhZCBvZiA3KzErMSkuIEFsc28sIHNvbWUgcHJldmlvdXNseSA4LWJpdCB2YWx1ZXMgYXJlCisgKiBub3cgMTYtYml0LiBUaGUgaW5vZGUgaXMgbm93IDY0IGJ5dGVzIGluc3RlYWQgb2YgMzIuCisgKi8KK3N0cnVjdCBtaW5peDJfaW5vZGUgeworCXVpbnQxNl90IGlfbW9kZTsKKwl1aW50MTZfdCBpX25saW5rczsKKwl1aW50MTZfdCBpX3VpZDsKKwl1aW50MTZfdCBpX2dpZDsKKwl1aW50MzJfdCBpX3NpemU7CisJdWludDMyX3QgaV9hdGltZTsKKwl1aW50MzJfdCBpX210aW1lOworCXVpbnQzMl90IGlfY3RpbWU7CisJdWludDMyX3QgaV96b25lWzEwXTsKK307CisKKy8qCisgKiBtaW5peCBzdXBlcmJsb2NrIGRhdGEgb24gZGlzaworICovCitzdHJ1Y3QgbWluaXhfc3VwZXJibG9jayB7CisJdWludDE2X3Qgc19uaW5vZGVzOworCXVpbnQxNl90IHNfbnpvbmVzOworCXVpbnQxNl90IHNfaW1hcF9ibG9ja3M7CisJdWludDE2X3Qgc196bWFwX2Jsb2NrczsKKwl1aW50MTZfdCBzX2ZpcnN0ZGF0YXpvbmU7CisJdWludDE2X3Qgc19sb2dfem9uZV9zaXplOworCXVpbnQzMl90IHNfbWF4X3NpemU7CisJdWludDE2X3Qgc19tYWdpYzsKKwl1aW50MTZfdCBzX3N0YXRlOworCXVpbnQzMl90IHNfem9uZXM7Cit9OworCitzdHJ1Y3QgbWluaXhfZGlyX2VudHJ5IHsKKwl1aW50MTZfdCBpbm9kZTsKKwljaGFyIG5hbWVbXTsKK307CisKKy8qIEJlbGlldmUgaXQgb3Igbm90LCBidXQgbW91bnQuaCBoYXMgdGhpcyBvbmUgI2RlZmluZWQgKi8KKyN1bmRlZiBCTE9DS19TSVpFCisKK2VudW0geworCUJMT0NLX1NJWkUgICAgICAgICAgICAgID0gMTAyNCwKKwlCSVRTX1BFUl9CTE9DSyAgICAgICAgICA9IEJMT0NLX1NJWkUgPDwgMywKKworCU1JTklYX1JPT1RfSU5PICAgICAgICAgID0gMSwKKwlNSU5JWF9CQURfSU5PICAgICAgICAgICA9IDIsCisKKwlNSU5JWDFfU1VQRVJfTUFHSUMgICAgICA9IDB4MTM3RiwgICAgICAgLyogb3JpZ2luYWwgbWluaXggZnMgKi8KKwlNSU5JWDFfU1VQRVJfTUFHSUMyICAgICA9IDB4MTM4RiwgICAgICAgLyogbWluaXggZnMsIDMwIGNoYXIgbmFtZXMgKi8KKwlNSU5JWDJfU1VQRVJfTUFHSUMgICAgICA9IDB4MjQ2OCwgICAgICAgLyogbWluaXggVjIgZnMgKi8KKwlNSU5JWDJfU1VQRVJfTUFHSUMyICAgICA9IDB4MjQ3OCwgICAgICAgLyogbWluaXggVjIgZnMsIDMwIGNoYXIgbmFtZXMgKi8KKwlNSU5JWF9WQUxJRF9GUyAgICAgICAgICA9IDB4MDAwMSwgICAgICAgLyogY2xlYW4gZnMgKi8KKwlNSU5JWF9FUlJPUl9GUyAgICAgICAgICA9IDB4MDAwMiwgICAgICAgLyogZnMgaGFzIGVycm9ycyAqLworCisJSU5PREVfU0laRTEgICAgICAgICAgICAgPSBzaXplb2Yoc3RydWN0IG1pbml4MV9pbm9kZSksCisJSU5PREVfU0laRTIgICAgICAgICAgICAgPSBzaXplb2Yoc3RydWN0IG1pbml4Ml9pbm9kZSksCisJTUlOSVgxX0lOT0RFU19QRVJfQkxPQ0sgPSBCTE9DS19TSVpFIC8gc2l6ZW9mKHN0cnVjdCBtaW5peDFfaW5vZGUpLAorCU1JTklYMl9JTk9ERVNfUEVSX0JMT0NLID0gQkxPQ0tfU0laRSAvIHNpemVvZihzdHJ1Y3QgbWluaXgyX2lub2RlKSwKK307CisKKy8qCitCYXNpYyB0ZXN0IHNjcmlwdCBmb3IgcmVncmVzc2lvbnMgaW4gbWtmcy9mc2NrLgorQ29waWVzIGN1cnJlbnQgZGlyIGludG8gaW1hZ2UgKHR5cGljYWxseSBiYm94IGJ1aWxkIHRyZWUpLgorCisjIS9iaW4vc2gKK3RtcGRpcj0vdG1wL21pbml4dGVzdC0kJAordG1waW1nPS90bXAvbWluaXgtaW1nLSQkCisKK21rZGlyICR0bXBkaXIKK2RkIGlmPS9kZXYvemVybyBvZj0kdG1waW1nIGJzPTFNIGNvdW50PTIwIHx8IGV4aXQKKy4vYnVzeWJveCBta2ZzLm1pbml4ICR0bXBpbWcgfHwgZXhpdAorbW91bnQgLW8gbG9vcCAkdG1waW1nICR0bXBkaXIgfHwgZXhpdAorY3AgLWEgIiRQV0QiICR0bXBkaXIKK3Vtb3VudCAkdG1wZGlyIHx8IGV4aXQKKy4vYnVzeWJveCBmc2NrLm1pbml4IC12Zm0gJHRtcGltZyB8fCBleGl0CitlY2hvICJDb250aW51ZT8iCityZWFkIGp1bmsKKy4vYnVzeWJveCBmc2NrLm1pbml4IC12Zm1sICR0bXBpbWcgfHwgZXhpdAorcm1kaXIgJHRtcGRpcgorcm0gJHRtcGltZworCisqLwpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9ta2ZzX2V4dDIuYyBiL3V0aWwtbGludXgvbWtmc19leHQyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI1OGQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvbWtmc19leHQyLmMKQEAgLTAsMCArMSw2OTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIG1rZnNfZXh0MjogdXRpbGl0eSB0byBjcmVhdGUgRVhUMiBmaWxlc3lzdGVtCisgKiBpbnNwaXJlZCBieSBnZW5leHQyZnMKKyAqCisgKiBCdXN5Ym94J2VkICgyMDA5KSBieSBWbGFkaW1pciBEcm9ubmlrb3YgPGRyb25uaWtvdkBnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbWtmc19leHQyX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLUZuXSAiCisvKiAvL3VzYWdlOiAgICAiWy1jfC1sIGZpbGVuYW1lXSAiICovCisvL3VzYWdlOiAgICAgICAiWy1iIEJMS19TSVpFXSAiCisvKiAvL3VzYWdlOiAgICAiWy1mIGZyYWdtZW50LXNpemVdIFstZyBibG9ja3MtcGVyLWdyb3VwXSAiICovCisvL3VzYWdlOiAgICAgICAiWy1pIElOT0RFX1JBVElPXSBbLUkgSU5PREVfU0laRV0gIgorLyogLy91c2FnZTogICAgIlstal0gWy1KIGpvdXJuYWwtb3B0aW9uc10gWy1OIG51bWJlci1vZi1pbm9kZXNdICIgKi8KKy8vdXNhZ2U6ICAgICAgICJbLW0gUkVTRVJWRURfUEVSQ0VOVF0gIgorLyogLy91c2FnZTogICAgIlstbyBjcmVhdG9yLW9zXSBbLU8gZmVhdHVyZVssLi4uXV0gWy1xXSAiICovCisvKiAvL3VzYWdlOiAgICAiW3IgZnMtcmV2aXNpb24tbGV2ZWxdIFstRSBleHRlbmRlZC1vcHRpb25zXSBbLXZdIFstRl0gIiAqLworLy91c2FnZTogICAgICAgIlstTCBMQUJFTF0gIgorLyogLy91c2FnZTogICAgIlstTSBsYXN0LW1vdW50ZWQtZGlyZWN0b3J5XSBbLVNdIFstVCBmaWxlc3lzdGVtLXR5cGVdICIgKi8KKy8vdXNhZ2U6ICAgICAgICJCTE9DS0RFViBbS0JZVEVTXSIKKy8vdXNhZ2U6I2RlZmluZSBta2ZzX2V4dDJfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLWIgQkxLX1NJWkUJQmxvY2sgc2l6ZSwgYnl0ZXMiCisvKiAvL3VzYWdlOiAgIlxuCS1jCQlDaGVjayBkZXZpY2UgZm9yIGJhZCBibG9ja3MiICovCisvKiAvL3VzYWdlOiAgIlxuCS1FIG9wdHMJCVNldCBleHRlbmRlZCBvcHRpb25zIiAqLworLyogLy91c2FnZTogICJcbgktZiBzaXplCQlGcmFnbWVudCBzaXplIGluIGJ5dGVzIiAqLworLy91c2FnZTogICAgICJcbgktRgkJRm9yY2UiCisvKiAvL3VzYWdlOiAgIlxuCS1nIE4JCU51bWJlciBvZiBibG9ja3MgaW4gYSBibG9jayBncm91cCIgKi8KKy8vdXNhZ2U6ICAgICAiXG4JLWkgUkFUSU8JTWF4IG51bWJlciBvZiBmaWxlcyBpcyBmaWxlc3lzdGVtX3NpemUgLyBSQVRJTyIKKy8vdXNhZ2U6ICAgICAiXG4JLUkgQllURVMJSW5vZGUgc2l6ZSAobWluIDEyOCkiCisvKiAvL3VzYWdlOiAgIlxuCS1qCQlDcmVhdGUgYSBqb3VybmFsIChleHQzKSIgKi8KKy8qIC8vdXNhZ2U6ICAiXG4JLUogb3B0cwkJU2V0IGpvdXJuYWwgb3B0aW9ucyAoc2l6ZS9kZXZpY2UpIiAqLworLyogLy91c2FnZTogICJcbgktbCBmaWxlCQlSZWFkIGJhZCBibG9ja3MgbGlzdCBmcm9tIGZpbGUiICovCisvL3VzYWdlOiAgICAgIlxuCS1MIExCTAkJVm9sdW1lIGxhYmVsIgorLy91c2FnZTogICAgICJcbgktbSBQRVJDRU5UCVBlcmNlbnQgb2YgYmxvY2tzIHRvIHJlc2VydmUgZm9yIGFkbWluIgorLyogLy91c2FnZTogICJcbgktTSBkaXIJCVNldCBsYXN0IG1vdW50ZWQgZGlyZWN0b3J5IiAqLworLy91c2FnZTogICAgICJcbgktbgkJRHJ5IHJ1biIKKy8qIC8vdXNhZ2U6ICAiXG4JLU4gTgkJTnVtYmVyIG9mIGlub2RlcyB0byBjcmVhdGUiICovCisvKiAvL3VzYWdlOiAgIlxuCS1vIG9zCQlTZXQgdGhlICdjcmVhdG9yIG9zJyBmaWVsZCIgKi8KKy8qIC8vdXNhZ2U6ICAiXG4JLU8gZmVhdHVyZXMJRGlyX2luZGV4L2ZpbGV0eXBlL2hhc19qb3VybmFsL2pvdXJuYWxfZGV2L3NwYXJzZV9zdXBlciIgKi8KKy8qIC8vdXNhZ2U6ICAiXG4JLXEJCVF1aWV0IiAqLworLyogLy91c2FnZTogICJcbgktciByZXYJCVNldCBmaWxlc3lzdGVtIHJldmlzaW9uIiAqLworLyogLy91c2FnZTogICJcbgktUwkJV3JpdGUgc3VwZXJibG9jayBhbmQgZ3JvdXAgZGVzY3JpcHRvcnMgb25seSIgKi8KKy8qIC8vdXNhZ2U6ICAiXG4JLVQgZnMtdHlwZQlTZXQgdXNhZ2UgdHlwZSAobmV3cy9sYXJnZWZpbGUvbGFyZ2VmaWxlNCkiICovCisvKiAvL3VzYWdlOiAgIlxuCS12CQlWZXJib3NlIiAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgImJiX2UyZnNfZGVmcy5oIgorCisjZGVmaW5lIEVOQUJMRV9GRUFUVVJFX01LRlNfRVhUMl9SRVNFUlZFRF9HRFQgMAorI2RlZmluZSBFTkFCTEVfRkVBVFVSRV9NS0ZTX0VYVDJfRElSX0lOREVYICAgIDEKKworI2RlZmluZSBFWFQyX0hBU0hfSEFMRl9NRDQgICAgICAgMQorI2RlZmluZSBFWFQyX0ZMQUdTX1NJR05FRF9IQVNIICAgMHgwMDAxCisjZGVmaW5lIEVYVDJfRkxBR1NfVU5TSUdORURfSEFTSCAweDAwMDIKKworLy8gc3RvcmFnZSBoZWxwZXJzCitjaGFyIEJVR193cm9uZ19maWVsZF9zaXplKHZvaWQpOworI2RlZmluZSBTVE9SRV9MRShmaWVsZCwgdmFsdWUpIFwKK2RvIHsgXAorCWlmIChzaXplb2YoZmllbGQpID09IDQpIFwKKwkJZmllbGQgPSBTV0FQX0xFMzIodmFsdWUpOyBcCisJZWxzZSBpZiAoc2l6ZW9mKGZpZWxkKSA9PSAyKSBcCisJCWZpZWxkID0gU1dBUF9MRTE2KHZhbHVlKTsgXAorCWVsc2UgaWYgKHNpemVvZihmaWVsZCkgPT0gMSkgXAorCQlmaWVsZCA9ICh2YWx1ZSk7IFwKKwllbHNlIFwKKwkJQlVHX3dyb25nX2ZpZWxkX3NpemUoKTsgXAorfSB3aGlsZSAoMCkKKworI2RlZmluZSBGRVRDSF9MRTMyKGZpZWxkKSBcCisJKHNpemVvZihmaWVsZCkgPT0gNCA/IFNXQVBfTEUzMihmaWVsZCkgOiBCVUdfd3JvbmdfZmllbGRfc2l6ZSgpKQorCisvLyBBbGwgZmllbGRzIGFyZSBsaXR0bGUtZW5kaWFuCitzdHJ1Y3QgZXh0Ml9kaXIgeworCXVpbnQzMl90IGlub2RlMTsKKwl1aW50MTZfdCByZWNfbGVuMTsKKwl1aW50OF90ICBuYW1lX2xlbjE7CisJdWludDhfdCAgZmlsZV90eXBlMTsKKwljaGFyICAgICBuYW1lMVs0XTsKKwl1aW50MzJfdCBpbm9kZTI7CisJdWludDE2X3QgcmVjX2xlbjI7CisJdWludDhfdCAgbmFtZV9sZW4yOworCXVpbnQ4X3QgIGZpbGVfdHlwZTI7CisJY2hhciAgICAgbmFtZTJbNF07CisJdWludDMyX3QgaW5vZGUzOworCXVpbnQxNl90IHJlY19sZW4zOworCXVpbnQ4X3QgIG5hbWVfbGVuMzsKKwl1aW50OF90ICBmaWxlX3R5cGUzOworCWNoYXIgICAgIG5hbWUzWzEyXTsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnRfbG9nMih1bnNpZ25lZCBhcmcpCit7CisJdW5zaWduZWQgciA9IDA7CisJd2hpbGUgKChhcmcgPj49IDEpICE9IDApCisJCXIrKzsKKwlyZXR1cm4gcjsKK30KKworLy8gdGFrZW4gZnJvbSBta2ZzX21pbml4LmMuIGxpYmJiIGNhbmRpZGF0ZT8KKy8vICJ1aW50MzJfdCBzaXplIiwgc2luY2Ugd2UgbmV2ZXIgdXNlIGl0IGZvciBhbnl0aGluZyA+MzIgYml0cworc3RhdGljIHVpbnQzMl90IGRpdl9yb3VuZHVwKHVpbnQzMl90IHNpemUsIHVpbnQzMl90IG4pCit7CisJLy8gT3ZlcmZsb3ctcmVzaXN0YW50CisJdWludDMyX3QgcmVzID0gc2l6ZSAvIG47CisJaWYgKHJlcyAqIG4gIT0gc2l6ZSkKKwkJcmVzKys7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgYWxsb2NhdGUodWludDhfdCAqYml0bWFwLCB1aW50MzJfdCBibG9ja3NpemUsIHVpbnQzMl90IHN0YXJ0LCB1aW50MzJfdCBlbmQpCit7CisJdWludDMyX3QgaTsKKworLy9iYl9pbmZvX21zZygiQUxMT0M6IFsldV1bJXVdWyV1XTogWyV1LSV1XTo9WyV4XSxbJXhdIiwgYmxvY2tzaXplLCBzdGFydCwgZW5kLCBzdGFydC84LCBibG9ja3NpemUgLSBlbmQvOCAtIDEsICgxIDw8IChzdGFydCAmIDcpKSAtIDEsICh1aW50OF90KSgweEZGMDAgPj4gKGVuZCAmIDcpKSk7CisJbWVtc2V0KGJpdG1hcCwgMCwgYmxvY2tzaXplKTsKKwlpID0gc3RhcnQgLyA4OworCW1lbXNldChiaXRtYXAsIDB4RkYsIGkpOworCWJpdG1hcFtpXSA9ICgxIDw8IChzdGFydCAmIDcpKSAtIDE7IC8vMC4uNyA9PiAwMDAwMDAwMC4uMDExMTExMTEKKwlpID0gZW5kIC8gODsKKwliaXRtYXBbYmxvY2tzaXplIC0gaSAtIDFdIHw9IDB4N0YwMCA+PiAoZW5kICYgNyk7IC8vMC4uNyA9PiAwMDAwMDAwMC4uMTExMTExMTAKKwltZW1zZXQoYml0bWFwICsgYmxvY2tzaXplIC0gaSwgMHhGRiwgaSk7IC8vIE4uQi4gbm8gb3ZlcmZsb3cgaGVyZSEKK30KKworc3RhdGljIHVpbnQzMl90IGhhc19zdXBlcih1aW50MzJfdCB4KQoreworCS8vIDAsIDEgYW5kIHBvd2VycyBvZiAzLCA1LCA3IHVwIHRvIDJeMzIgbGltaXQKKwlzdGF0aWMgY29uc3QgdWludDMyX3Qgc3VwZXJzW10gPSB7CisJCTAsIDEsIDMsIDUsIDcsIDksIDI1LCAyNywgNDksIDgxLCAxMjUsIDI0MywgMzQzLCA2MjUsIDcyOSwKKwkJMjE4NywgMjQwMSwgMzEyNSwgNjU2MSwgMTU2MjUsIDE2ODA3LCAxOTY4MywgNTkwNDksIDc4MTI1LAorCQkxMTc2NDksIDE3NzE0NywgMzkwNjI1LCA1MzE0NDEsIDgyMzU0MywgMTU5NDMyMywgMTk1MzEyNSwKKwkJNDc4Mjk2OSwgNTc2NDgwMSwgOTc2NTYyNSwgMTQzNDg5MDcsIDQwMzUzNjA3LCA0MzA0NjcyMSwKKwkJNDg4MjgxMjUsIDEyOTE0MDE2MywgMjQ0MTQwNjI1LCAyODI0NzUyNDksIDM4NzQyMDQ4OSwKKwkJMTE2MjI2MTQ2NywgMTIyMDcwMzEyNSwgMTk3NzMyNjc0MywgMzQ4Njc4NDQwMS8qID4yXjMxICovLAorCX07CisJY29uc3QgdWludDMyX3QgKnNwID0gc3VwZXJzICsgQVJSQVlfU0laRShzdXBlcnMpOworCXdoaWxlICgxKSB7CisJCXNwLS07CisJCWlmICh4ID09ICpzcCkKKwkJCXJldHVybiAxOworCQlpZiAoeCA+ICpzcCkKKwkJCXJldHVybiAwOworCX0KK30KKworI2RlZmluZSBmZCAzCS8qIHByZWRlZmluZWQgb3V0cHV0IGRlc2NyaXB0b3IgKi8KKworc3RhdGljIHZvaWQgUFVUKHVpbnQ2NF90IG9mZiwgdm9pZCAqYnVmLCB1aW50MzJfdCBzaXplKQoreworLy8JYmJfaW5mb19tc2coIlBVVFslbGx1XTpbJXVdIiwgb2ZmLCBzaXplKTsKKwl4bHNlZWsoZmQsIG9mZiwgU0VFS19TRVQpOworCXh3cml0ZShmZCwgYnVmLCBzaXplKTsKK30KKworLy8gMTI4IGFuZCAyNTYtYnl0ZSBpbm9kZXM6CisvLyAxMjgtYnl0ZSBpbm9kZSBpcyBkZXNjcmliZWQgYnkgc3RydWN0IGV4dDJfaW5vZGUuCisvLyAyNTYtYnl0ZSBvbmUganVzdCBoYXMgdGhlc2UgZmllbGRzIGFwcGVuZGVkOgorLy8gICAgICBfX3UxNiAgIGlfZXh0cmFfaXNpemU7CisvLyAgICAgIF9fdTE2ICAgaV9wYWQxOworLy8gICAgICBfX3UzMiAgIGlfY3RpbWVfZXh0cmE7ICAvKiBleHRyYSBDaGFuZ2UgdGltZSAobnNlYyA8PCAyIHwgZXBvY2gpICovCisvLyAgICAgIF9fdTMyICAgaV9tdGltZV9leHRyYTsgIC8qIGV4dHJhIE1vZGlmaWNhdGlvbiB0aW1lIChuc2VjIDw8IDIgfCBlcG9jaCkgKi8KKy8vICAgICAgX191MzIgICBpX2F0aW1lX2V4dHJhOyAgLyogZXh0cmEgQWNjZXNzIHRpbWUgKG5zZWMgPDwgMiB8IGVwb2NoKSAqLworLy8gICAgICBfX3UzMiAgIGlfY3J0aW1lOyAgICAgICAvKiBGaWxlIGNyZWF0aW9uIHRpbWUgKi8KKy8vICAgICAgX191MzIgICBpX2NydGltZV9leHRyYTsgLyogZXh0cmEgRmlsZSBjcmVhdGlvbiB0aW1lIChuc2VjIDw8IDIgfCBlcG9jaCkqLworLy8gICAgICBfX3UzMiAgIGlfdmVyc2lvbl9oaTsgICAvKiBoaWdoIDMyIGJpdHMgZm9yIDY0LWJpdCB2ZXJzaW9uICovCisvLyB0aGUgcmVzdCBpcyBwYWRkaW5nLgorLy8KKy8vIGxpbnV4L2V4dDJfZnMuaCBoYXMgIiNkZWZpbmUgaV9zaXplX2hpZ2ggaV9kaXJfYWNsIiB3aGljaCBzdWdnZXN0cyB0aGF0IGV2ZW4KKy8vIDEyOC1ieXRlIGlub2RlIGlzIGNhcGFibGUgb2YgZGVzY3JpYmluZyBsYXJnZSBmaWxlcyAoaV9kaXJfYWNsIGlzIG1lYW5pbmdmdWwKKy8vIG9ubHkgZm9yIGRpcmVjdG9yaWVzLCB3aGljaCBuZXZlciBuZWVkIGlfc2l6ZV9oaWdoKS4KKy8vCisvLyBTdGFuZGFyZCBta2UyZnMgY3JlYXRlcyBhIGZpbGVzeXN0ZW0gd2l0aCAyNTYtYnl0ZSBpbm9kZXMgaWYgaXQgaXMKKy8vIGJpZ2dlciB0aGFuIDAuNUdCLgorCisvLyBTdGFuZGFyZCBta2UyZnMgMS40MS45OgorLy8gVXNhZ2U6IG1rZTJmcyBbLWN8LWwgZmlsZW5hbWVdIFstYiBibG9jay1zaXplXSBbLWYgZnJhZ21lbnQtc2l6ZV0KKy8vCVstaSBieXRlcy1wZXItaW5vZGVdIFstSSBpbm9kZS1zaXplXSBbLUogam91cm5hbC1vcHRpb25zXQorLy8JWy1HIG1ldGEgZ3JvdXAgc2l6ZV0gWy1OIG51bWJlci1vZi1pbm9kZXNdCisvLwlbLW0gcmVzZXJ2ZWQtYmxvY2tzLXBlcmNlbnRhZ2VdIFstbyBjcmVhdG9yLW9zXQorLy8JWy1nIGJsb2Nrcy1wZXItZ3JvdXBdIFstTCB2b2x1bWUtbGFiZWxdIFstTSBsYXN0LW1vdW50ZWQtZGlyZWN0b3J5XQorLy8JWy1PIGZlYXR1cmVbLC4uLl1dIFstciBmcy1yZXZpc2lvbl0gWy1FIGV4dGVuZGVkLW9wdGlvblssLi4uXV0KKy8vCVstVCBmcy10eXBlXSBbLVUgVVVJRF0gWy1qbnF2RlNWXSBkZXZpY2UgW2Jsb2Nrcy1jb3VudF0KKy8vCisvLyBPcHRpb25zIG5vdCBjb21tZW50ZWQgYmVsb3cgYXJlIHRha2VuIGJ1dCBzaWxlbnRseSBpZ25vcmVkOgorZW51bSB7CisJT1BUX2MgPSAxIDw8IDAsCisJT1BUX2wgPSAxIDw8IDEsCisJT1BUX2IgPSAxIDw8IDIsCQkvLyBibG9jayBzaXplLCBpbiBieXRlcworCU9QVF9mID0gMSA8PCAzLAorCU9QVF9pID0gMSA8PCA0LAkJLy8gYnl0ZXMgcGVyIGlub2RlCisJT1BUX0kgPSAxIDw8IDUsCQkvLyBjdXN0b20gaW5vZGUgc2l6ZSwgaW4gYnl0ZXMKKwlPUFRfSiA9IDEgPDwgNiwKKwlPUFRfRyA9IDEgPDwgNywKKwlPUFRfTiA9IDEgPDwgOCwKKwlPUFRfbSA9IDEgPDwgOSwJCS8vIHBlcmNlbnRhZ2Ugb2YgYmxvY2tzIHJlc2VydmVkIGZvciBzdXBlcnVzZXIKKwlPUFRfbyA9IDEgPDwgMTAsCisJT1BUX2cgPSAxIDw8IDExLAorCU9QVF9MID0gMSA8PCAxMiwJLy8gbGFiZWwKKwlPUFRfTSA9IDEgPDwgMTMsCisJT1BUX08gPSAxIDw8IDE0LAorCU9QVF9yID0gMSA8PCAxNSwKKwlPUFRfRSA9IDEgPDwgMTYsCisJT1BUX1QgPSAxIDw8IDE3LAorCU9QVF9VID0gMSA8PCAxOCwKKwlPUFRfaiA9IDEgPDwgMTksCisJT1BUX24gPSAxIDw8IDIwLAkvLyBkcnkgcnVuOiBkbyBub3Qgd3JpdGUgYW55dGhpbmcKKwlPUFRfcSA9IDEgPDwgMjEsCisJT1BUX3YgPSAxIDw8IDIyLAorCU9QVF9GID0gMSA8PCAyMywKKwlPUFRfUyA9IDEgPDwgMjQsCisJLy9PUFRfViA9IDEgPDwgMjUsCS8vIC1WIHZlcnNpb24uIGJib3ggYXBwbGV0cyBkb24ndCBzdXBwb3J0IHRoYXQKK307CisKK2ludCBta2ZzX2V4dDJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1rZnNfZXh0Ml9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgaSwgcG9zLCBuOworCXVuc2lnbmVkIGJzLCBicGk7CisJdW5zaWduZWQgYmxvY2tzaXplLCBibG9ja3NpemVfbG9nMjsKKwl1bnNpZ25lZCBpbm9kZXNpemUsIHVzZXJfaW5vZGVzaXplOworCXVuc2lnbmVkIHJlc2VydmVkX3BlcmNlbnQgPSA1OworCXVuc2lnbmVkIGxvbmcgbG9uZyBraWxvYnl0ZXM7CisJdWludDMyX3QgbmJsb2NrcywgbmJsb2Nrc19mdWxsOworCXVpbnQzMl90IG5yZXNlcnZlZDsKKwl1aW50MzJfdCBuZ3JvdXBzOworCXVpbnQzMl90IGJ5dGVzX3Blcl9pbm9kZTsKKwl1aW50MzJfdCBmaXJzdF9ibG9jazsKKwl1aW50MzJfdCBpbm9kZXNfcGVyX2dyb3VwOworCXVpbnQzMl90IGdyb3VwX2Rlc2NfYmxvY2tzOworCXVpbnQzMl90IGlub2RlX3RhYmxlX2Jsb2NrczsKKwl1aW50MzJfdCBsb3N0X2FuZF9mb3VuZF9ibG9ja3M7CisJdGltZV90IHRpbWVzdGFtcDsKKwljb25zdCBjaGFyICpsYWJlbCA9ICIiOworCXN0cnVjdCBzdGF0IHN0OworCXN0cnVjdCBleHQyX3N1cGVyX2Jsb2NrICpzYjsgLy8gc3VwZXJibG9jaworCXN0cnVjdCBleHQyX2dyb3VwX2Rlc2MgKmdkOyAvLyBncm91cCBkZXNjcmlwdG9ycworCXN0cnVjdCBleHQyX2lub2RlICppbm9kZTsKKwlzdHJ1Y3QgZXh0Ml9kaXIgKmRpcjsKKwl1aW50OF90ICpidWY7CisKKwkvLyB1c2luZyBnbG9iYWwgIm9wdGlvbl9tYXNrMzIiIGluc3RlYWQgb2YgbG9jYWwgIm9wdHMiOgorCS8vIHdlIGFyZSByZWdpc3RlciBzdGFydmVkIGhlcmUKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMTpiKzppKzpJKzptKyI7CisJLypvcHRzID0qLyBnZXRvcHQzMihhcmd2LCAiY2w6YjpmOmk6STpKOkc6TjptOm86ZzpMOk06TzpyOkU6VDpVOmpucXZGUyIsCisJCS8qbGJmaToqLyBOVUxMLCAmYnMsIE5VTEwsICZicGksCisJCS8qSUpHTjoqLyAmdXNlcl9pbm9kZXNpemUsIE5VTEwsIE5VTEwsIE5VTEwsCisJCS8qbW9nTDoqLyAmcmVzZXJ2ZWRfcGVyY2VudCwgTlVMTCwgTlVMTCwgJmxhYmVsLAorCQkvKk1PckU6Ki8gTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKKwkJLypUVToqLyBOVUxMLCBOVUxMKTsKKwlhcmd2ICs9IG9wdGluZDsgLy8gYXJndlswXSAtLSBkZXZpY2UKKworCS8vIG9wZW4gdGhlIGRldmljZSwgY2hlY2sgdGhlIGRldmljZSBpcyBhIGJsb2NrIGRldmljZQorCXhtb3ZlX2ZkKHhvcGVuKGFyZ3ZbMF0sIE9fV1JPTkxZKSwgZmQpOworCXhmc3RhdChmZCwgJnN0LCBhcmd2WzBdKTsKKwlpZiAoIVNfSVNCTEsoc3Quc3RfbW9kZSkgJiYgIShvcHRpb25fbWFzazMyICYgT1BUX0YpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6IG5vdCBhIGJsb2NrIGRldmljZSIsIGFyZ3ZbMF0pOworCisJLy8gY2hlY2sgaWYgaXQgaXMgbW91bnRlZAorCS8vIE4uQi4gd2hhdCBpZiB3ZSBmb3JtYXQgYSBmaWxlPyBmaW5kX21vdW50X3BvaW50IHdpbGwgcmV0dXJuIGZhbHNlIG5lZ2F0aXZlIHNpbmNlCisJLy8gaXQgaXMgbG9vcCBibG9jayBkZXZpY2Ugd2hpY2ggaXMgbW91bnRlZCEKKwlpZiAoZmluZF9tb3VudF9wb2ludChhcmd2WzBdLCAwKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGZvcm1hdCBtb3VudGVkIGZpbGVzeXN0ZW0iKTsKKworCS8vIGdldCBzaXplIGluIGtieXRlcworCWtpbG9ieXRlcyA9IGdldF92b2x1bWVfc2l6ZV9pbl9ieXRlcyhmZCwgYXJndlsxXSwgMTAyNCwgLypleHRlbmQ6Ki8gIShvcHRpb25fbWFzazMyICYgT1BUX24pKSAvIDEwMjQ7CisKKwlieXRlc19wZXJfaW5vZGUgPSAxNjM4NDsKKwlpZiAoa2lsb2J5dGVzIDwgNTEyKjEwMjQpCisJCWJ5dGVzX3Blcl9pbm9kZSA9IDQwOTY7CisJaWYgKGtpbG9ieXRlcyA8IDMqMTAyNCkKKwkJYnl0ZXNfcGVyX2lub2RlID0gODE5MjsKKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9pKQorCQlieXRlc19wZXJfaW5vZGUgPSBicGk7CisKKwkvLyBEZXRlcm1pbmUgYmxvY2sgc2l6ZSBhbmQgaW5vZGUgc2l6ZQorCS8vIGJsb2NrIHNpemUgaXMgYSBtdWx0aXBsZSBvZiAxMDI0CisJLy8gaW5vZGUgc2l6ZSBpcyBhIG11bHRpcGxlIG9mIDEyOAorCWJsb2Nrc2l6ZSA9IDEwMjQ7CisJaW5vZGVzaXplID0gc2l6ZW9mKHN0cnVjdCBleHQyX2lub2RlKTsgLy8gMTI4CisJaWYgKGtpbG9ieXRlcyA+PSA1MTIqMTAyNCkgeyAvLyBta2UyZnMgMS40MS45IGNvbXBhdAorCQlibG9ja3NpemUgPSA0MDk2OworCQlpbm9kZXNpemUgPSAyNTY7CisJfQorCWlmIChFWFQyX01BWF9CTE9DS19TSVpFID4gNDA5NikgeworCQkvLyBraWxvYnl0ZXMgPj4gMjIgPT0gc2l6ZSBpbiA0Z2lnYWJ5dGUgY2h1bmtzLgorCQkvLyBpZiBzaXplID49IDE2ayBnaWdzLCBibG9ja3NpemUgbXVzdCBiZSBpbmNyZWFzZWQuCisJCS8vIFRyeSAibWtlMmZzIC1GIGltYWdlICQoKDE2ICogMTAyNCoxMDI0KjEwMjQpKSIKKwkJd2hpbGUgKChraWxvYnl0ZXMgPj4gMjIpID49IGJsb2Nrc2l6ZSkKKwkJCWJsb2Nrc2l6ZSAqPSAyOworCX0KKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9iKQorCQlibG9ja3NpemUgPSBiczsKKwlpZiAoYmxvY2tzaXplIDwgRVhUMl9NSU5fQkxPQ0tfU0laRQorCSB8fCBibG9ja3NpemUgPiBFWFQyX01BWF9CTE9DS19TSVpFCisJIHx8IChibG9ja3NpemUgJiAoYmxvY2tzaXplIC0gMSkpIC8vIG5vdCBwb3dlciBvZiAyCisJKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJibG9ja3NpemUgJXUgaXMgYmFkIiwgYmxvY2tzaXplKTsKKwl9CisJLy8gRG8gd2UgaGF2ZSBjdXN0b20gaW5vZGUgc2l6ZT8KKwlpZiAob3B0aW9uX21hc2szMiAmIE9QVF9JKSB7CisJCWlmICh1c2VyX2lub2Rlc2l6ZSA8IHNpemVvZigqaW5vZGUpCisJCSB8fCB1c2VyX2lub2Rlc2l6ZSA+IGJsb2Nrc2l6ZQorCQkgfHwgKHVzZXJfaW5vZGVzaXplICYgKHVzZXJfaW5vZGVzaXplIC0gMSkpIC8vIG5vdCBwb3dlciBvZiAyCisJCSkgeworCQkJYmJfZXJyb3JfbXNnKCItJWMgaXMgYmFkIiwgJ0knKTsKKwkJfSBlbHNlIHsKKwkJCWlub2Rlc2l6ZSA9IHVzZXJfaW5vZGVzaXplOworCQl9CisJfQorCisJaWYgKChpbnQzMl90KWJ5dGVzX3Blcl9pbm9kZSA8IGJsb2Nrc2l6ZSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIi0lYyBpcyBiYWQiLCAnaScpOworCS8vIG51bWJlciBvZiBiaXRzIGluIG9uZSBibG9jaywgaS5lLiA4KmJsb2Nrc2l6ZQorI2RlZmluZSBibG9ja3NfcGVyX2dyb3VwICg4ICogYmxvY2tzaXplKQorCWZpcnN0X2Jsb2NrID0gKEVYVDJfTUlOX0JMT0NLX1NJWkUgPT0gYmxvY2tzaXplKTsKKwlibG9ja3NpemVfbG9nMiA9IGludF9sb2cyKGJsb2Nrc2l6ZSk7CisKKwkvLyBEZXRlcm1pbmUgbnVtYmVyIG9mIGJsb2NrcworCWtpbG9ieXRlcyA+Pj0gKGJsb2Nrc2l6ZV9sb2cyIC0gRVhUMl9NSU5fQkxPQ0tfTE9HX1NJWkUpOworCW5ibG9ja3MgPSBraWxvYnl0ZXM7CisJaWYgKG5ibG9ja3MgIT0ga2lsb2J5dGVzKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmxvY2sgY291bnQgZG9lc24ndCBmaXQgaW4gMzIgYml0cyIpOworI2RlZmluZSBraWxvYnl0ZXMga2lsb2J5dGVzX3VudXNlZF9hZnRlcl90aGlzCisJLy8gRXhwZXJpbWVudGFsbHksIHN0YW5kYXJkIG1rZTJmcyB3b24ndCB3b3JrIG9uIGltYWdlcyBzbWFsbGVyIHRoYW4gNjBrCisJaWYgKG5ibG9ja3MgPCA2MCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5lZWQgPj0gNjAgYmxvY2tzIik7CisKKwkvLyBIb3cgbWFueSByZXNlcnZlZCBibG9ja3M/CisJaWYgKHJlc2VydmVkX3BlcmNlbnQgPiA1MCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIi0lYyBpcyBiYWQiLCAnbScpOworCW5yZXNlcnZlZCA9ICh1aW50NjRfdCluYmxvY2tzICogcmVzZXJ2ZWRfcGVyY2VudCAvIDEwMDsKKworCS8vIE4uQi4ga2lsbGluZyBlMmZzcHJvZ3MgZmVhdHVyZSEgVW51c2VkIGJsb2NrcyBkb24ndCBhY2NvdW50IGluIGNhbGN1bGF0aW9ucworCW5ibG9ja3NfZnVsbCA9IG5ibG9ja3M7CisKKwkvLyBJZiBsYXN0IGJsb2NrIGdyb3VwIGlzIHRvbyBzbWFsbCwgbmJsb2NrcyBtYXkgYmUgZGVjcmVhc2VkIGluIG9yZGVyCisJLy8gdG8gZGlzY2FyZCBpdCwgYW5kIGNvbnRyb2wgcmV0dXJucyBoZXJlIHRvIHJlY2FsY3VsYXRlIHNvbWUKKwkvLyBwYXJhbWV0ZXJzLgorCS8vIE5vdGU6IGJsb2Nrc2l6ZSBhbmQgYnl0ZXNfcGVyX2lub2RlIGFyZSBuZXZlciByZWNhbGN1bGF0ZWQuCisgcmV0cnk6CisJLy8gTi5CLiBhIGJsb2NrIGdyb3VwIGNhbiBoYXZlIG5vIG1vcmUgdGhhbiBibG9ja3NfcGVyX2dyb3VwIGJsb2NrcworCW5ncm91cHMgPSBkaXZfcm91bmR1cChuYmxvY2tzIC0gZmlyc3RfYmxvY2ssIGJsb2Nrc19wZXJfZ3JvdXApOworCisJZ3JvdXBfZGVzY19ibG9ja3MgPSBkaXZfcm91bmR1cChuZ3JvdXBzLCBibG9ja3NpemUgLyBzaXplb2YoKmdkKSk7CisJLy8gVE9ETzogcmVzZXJ2ZWQgYmxvY2tzIG11c3QgYmUgbWFya2VkIGFzIHN1Y2ggaW4gdGhlIGJpdG1hcHMsCisJLy8gb3IgcmVzdWx0aW5nIGZpbGVzeXN0ZW0gaXMgY29ycnVwdAorCWlmIChFTkFCTEVfRkVBVFVSRV9NS0ZTX0VYVDJfUkVTRVJWRURfR0RUKSB7CisJCS8qCisJCSAqIEZyb20gZTJmc3Byb2dzOiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBHRFQgYmxvY2tzIHRvIHJlc2VydmUgZm9yIG9ubGluZQorCQkgKiBmaWxlc3lzdGVtIGdyb3d0aC4KKwkJICogVGhlIGFic29sdXRlIG1heGltdW0gbnVtYmVyIG9mIEdEVCBibG9ja3Mgd2UgY2FuIHJlc2VydmUgaXMgZGV0ZXJtaW5lZCBieQorCQkgKiB0aGUgbnVtYmVyIG9mIGJsb2NrIHBvaW50ZXJzIHRoYXQgY2FuIGZpdCBpbnRvIGEgc2luZ2xlIGJsb2NrLgorCQkgKiBXZSBzZXQgaXQgYXQgMTAyNHggdGhlIGN1cnJlbnQgZmlsZXN5c3RlbSBzaXplLCBvcgorCQkgKiB0aGUgdXBwZXIgYmxvY2sgY291bnQgbGltaXQgKDJeMzIpLCB3aGljaGV2ZXIgaXMgbG93ZXIuCisJCSAqLworCQl1aW50MzJfdCByZXNlcnZlZF9ncm91cF9kZXNjX2Jsb2NrcyA9IDB4RkZGRkZGRkY7IC8vIG1heGltdW0gYmxvY2sgbnVtYmVyCisJCWlmIChuYmxvY2tzIDwgcmVzZXJ2ZWRfZ3JvdXBfZGVzY19ibG9ja3MgLyAxMDI0KQorCQkJcmVzZXJ2ZWRfZ3JvdXBfZGVzY19ibG9ja3MgPSBuYmxvY2tzICogMTAyNDsKKwkJcmVzZXJ2ZWRfZ3JvdXBfZGVzY19ibG9ja3MgPSBkaXZfcm91bmR1cChyZXNlcnZlZF9ncm91cF9kZXNjX2Jsb2NrcyAtIGZpcnN0X2Jsb2NrLCBibG9ja3NfcGVyX2dyb3VwKTsKKwkJcmVzZXJ2ZWRfZ3JvdXBfZGVzY19ibG9ja3MgPSBkaXZfcm91bmR1cChyZXNlcnZlZF9ncm91cF9kZXNjX2Jsb2NrcywgYmxvY2tzaXplIC8gc2l6ZW9mKCpnZCkpIC0gZ3JvdXBfZGVzY19ibG9ja3M7CisJCWlmIChyZXNlcnZlZF9ncm91cF9kZXNjX2Jsb2NrcyA+IGJsb2Nrc2l6ZSAvIHNpemVvZih1aW50MzJfdCkpCisJCQlyZXNlcnZlZF9ncm91cF9kZXNjX2Jsb2NrcyA9IGJsb2Nrc2l6ZSAvIHNpemVvZih1aW50MzJfdCk7CisJCS8vVE9ETzogU1RPUkVfTEUoc2ItPnNfcmVzZXJ2ZWRfZ2R0X2Jsb2NrcywgcmVzZXJ2ZWRfZ3JvdXBfZGVzY19ibG9ja3MpOworCQlncm91cF9kZXNjX2Jsb2NrcyArPSByZXNlcnZlZF9ncm91cF9kZXNjX2Jsb2NrczsKKwl9CisKKwl7CisJCS8vIE4uQi4gZTJmc3Byb2dzIGRvZXMgYXMgZm9sbG93cyEKKwkJdWludDMyX3Qgb3ZlcmhlYWQsIHJlbWFpbmRlcjsKKwkJLy8gbmlub2RlcyBpcyB0aGUgbWF4IG51bWJlciBvZiBpbm9kZXMgaW4gdGhpcyBmaWxlc3lzdGVtCisJCXVpbnQzMl90IG5pbm9kZXMgPSAoKHVpbnQ2NF90KSBuYmxvY2tzX2Z1bGwgKiBibG9ja3NpemUpIC8gYnl0ZXNfcGVyX2lub2RlOworCQlpZiAobmlub2RlcyA8IEVYVDJfR09PRF9PTERfRklSU1RfSU5PKzEpCisJCQluaW5vZGVzID0gRVhUMl9HT09EX09MRF9GSVJTVF9JTk8rMTsKKwkJaW5vZGVzX3Blcl9ncm91cCA9IGRpdl9yb3VuZHVwKG5pbm9kZXMsIG5ncm91cHMpOworCQkvLyBtaW5pbXVtIG51bWJlciBiZWNhdXNlIHRoZSBmaXJzdCBFWFQyX0dPT0RfT0xEX0ZJUlNUX0lOTy0xIGFyZSByZXNlcnZlZAorCQlpZiAoaW5vZGVzX3Blcl9ncm91cCA8IDE2KQorCQkJaW5vZGVzX3Blcl9ncm91cCA9IDE2OworCQkvLyBhIGJsb2NrIGdyb3VwIGNhbid0IGhhdmUgbW9yZSBpbm9kZXMgdGhhbiBibG9ja3MKKwkJaWYgKGlub2Rlc19wZXJfZ3JvdXAgPiBibG9ja3NfcGVyX2dyb3VwKQorCQkJaW5vZGVzX3Blcl9ncm91cCA9IGJsb2Nrc19wZXJfZ3JvdXA7CisJCS8vIGFkanVzdCBpbm9kZXMgcGVyIGdyb3VwIHNvIHRoZXkgY29tcGxldGVseSBmaWxsIHRoZSBpbm9kZSB0YWJsZSBibG9ja3MgaW4gdGhlIGRlc2NyaXB0b3IKKwkJaW5vZGVzX3Blcl9ncm91cCA9IChkaXZfcm91bmR1cChpbm9kZXNfcGVyX2dyb3VwICogaW5vZGVzaXplLCBibG9ja3NpemUpICogYmxvY2tzaXplKSAvIGlub2Rlc2l6ZTsKKwkJLy8gbWFrZSBzdXJlIHRoZSBudW1iZXIgb2YgaW5vZGVzIHBlciBncm91cCBpcyBhIG11bHRpcGxlIG9mIDgKKwkJaW5vZGVzX3Blcl9ncm91cCAmPSB+NzsKKwkJaW5vZGVfdGFibGVfYmxvY2tzID0gZGl2X3JvdW5kdXAoaW5vZGVzX3Blcl9ncm91cCAqIGlub2Rlc2l6ZSwgYmxvY2tzaXplKTsKKworCQkvLyB0byBiZSB1c2VmdWwsIGxvc3QrZm91bmQgc2hvdWxkIG9jY3VweSBhdCBsZWFzdCAyIGJsb2NrcyAoYnV0IG5vdCBleGNlZWRpbmcgMTYqMTAyNCBieXRlcyksCisJCS8vIGFuZCBhdCBtb3N0IEVYVDJfTkRJUl9CTE9DS1MuIFNvIHJlc2VydmUgdGhlc2UgYmxvY2tzIHJpZ2h0IG5vdworCQkvKiBPciBlMmZzcHJvZ3MgY29tbWVudCB2ZXJiYXRpbSAod2hhdCBkb2VzIGl0IG1lYW4/KToKKwkJICogRW5zdXJlIHRoYXQgbG9zdCtmb3VuZCBpcyBhdCBsZWFzdCAyIGJsb2Nrcywgc28gd2UgYWx3YXlzCisJCSAqIHRlc3QgbGFyZ2UgZW1wdHkgYmxvY2tzIGZvciBiaWctYmxvY2sgZmlsZXN5c3RlbXMuICovCisJCWxvc3RfYW5kX2ZvdW5kX2Jsb2NrcyA9IE1JTihFWFQyX05ESVJfQkxPQ0tTLCAxNiA+PiAoYmxvY2tzaXplX2xvZzIgLSBFWFQyX01JTl9CTE9DS19MT0dfU0laRSkpOworCisJCS8vIHRoZSBsYXN0IGdyb3VwIG5lZWRzIG1vcmUgYXR0ZW50aW9uOiBpc24ndCBpdCB0b28gc21hbGwgZm9yIHBvc3NpYmxlIG92ZXJoZWFkPworCQlvdmVyaGVhZCA9IChoYXNfc3VwZXIobmdyb3VwcyAtIDEpID8gKDEvKnNiKi8gKyBncm91cF9kZXNjX2Jsb2NrcykgOiAwKSArIDEvKmJibXAqLyArIDEvKmlibXAqLyArIGlub2RlX3RhYmxlX2Jsb2NrczsKKwkJcmVtYWluZGVyID0gKG5ibG9ja3MgLSBmaXJzdF9ibG9jaykgJSBibG9ja3NfcGVyX2dyb3VwOworCQkvLy8vY2FuJ3QgaGFwcGVuLCBuYmxvY2tzID49IDYwIGd1YXJhbnRlZXMgdGhpcworCQkvLy8vaWYgKCgxID09IG5ncm91cHMpCisJCS8vLy8gJiYgcmVtYWluZGVyCisJCS8vLy8gJiYgKHJlbWFpbmRlciA8IG92ZXJoZWFkICsgMS8qICIvIiAqLyArIGxvc3RfYW5kX2ZvdW5kX2Jsb2NrcykKKwkJLy8vLykgeworCQkvLy8vCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ3YXkgc21hbGwgZGV2aWNlIik7CisJCS8vLy99CisKKwkJLy8gU3RhbmRhcmQgbWtlMmZzIHVzZXMgNTAuIExvb2tzIGxpa2UgYSBidWcgaW4gb3VyIGNhbGN1bGF0aW9uCisJCS8vIG9mICJyZW1haW5kZXIiIG9yICJvdmVyaGVhZCIgLSB3ZSBkb24ndCBtYXRjaCBzdGFuZGFyZCBta2UyZnMKKwkJLy8gd2hlbiB3ZSB0cmFuc2l0aW9uIGZyb20gb25lIGdyb3VwIHRvIHR3byBncm91cHMKKwkJLy8gKGEgYml0IGFmdGVyIDhNIGltYWdlIHNpemUpLCBidXQgaXQgd29ya3MgZm9yIHR3by0+dGhyZWUgZ3JvdXBzCisJCS8vIHRyYW5zaXRpb24gKGF0IDE2TSkuCisJCWlmIChyZW1haW5kZXIgJiYgKHJlbWFpbmRlciA8IG92ZXJoZWFkICsgNTApKSB7CisvL2JiX2luZm9fbXNnKCJDSE9QWyV1XSIsIHJlbWFpbmRlcik7CisJCQluYmxvY2tzIC09IHJlbWFpbmRlcjsKKwkJCWdvdG8gcmV0cnk7CisJCX0KKwl9CisKKwlpZiAobmJsb2Nrc19mdWxsIC0gbmJsb2NrcykKKwkJcHJpbnRmKCJ3YXJuaW5nOiAldSBibG9ja3MgdW51c2VkXG5cbiIsIG5ibG9ja3NfZnVsbCAtIG5ibG9ja3MpOworCXByaW50ZigKKwkJIkZpbGVzeXN0ZW0gbGFiZWw9JXNcbiIKKwkJIk9TIHR5cGU6IExpbnV4XG4iCisJCSJCbG9jayBzaXplPSV1IChsb2c9JXUpXG4iCisJCSJGcmFnbWVudCBzaXplPSV1IChsb2c9JXUpXG4iCisJCSIldSBpbm9kZXMsICV1IGJsb2Nrc1xuIgorCQkiJXUgYmxvY2tzICgldSUlKSByZXNlcnZlZCBmb3IgdGhlIHN1cGVyIHVzZXJcbiIKKwkJIkZpcnN0IGRhdGEgYmxvY2s9JXVcbiIKKwkJIk1heGltdW0gZmlsZXN5c3RlbSBibG9ja3M9JXVcbiIKKwkJIiV1IGJsb2NrIGdyb3Vwc1xuIgorCQkiJXUgYmxvY2tzIHBlciBncm91cCwgJXUgZnJhZ21lbnRzIHBlciBncm91cFxuIgorCQkiJXUgaW5vZGVzIHBlciBncm91cCIKKwkJLCBsYWJlbAorCQksIGJsb2Nrc2l6ZSwgYmxvY2tzaXplX2xvZzIgLSBFWFQyX01JTl9CTE9DS19MT0dfU0laRQorCQksIGJsb2Nrc2l6ZSwgYmxvY2tzaXplX2xvZzIgLSBFWFQyX01JTl9CTE9DS19MT0dfU0laRQorCQksIGlub2Rlc19wZXJfZ3JvdXAgKiBuZ3JvdXBzLCBuYmxvY2tzCisJCSwgbnJlc2VydmVkLCByZXNlcnZlZF9wZXJjZW50CisJCSwgZmlyc3RfYmxvY2sKKwkJLCBncm91cF9kZXNjX2Jsb2NrcyAqIChibG9ja3NpemUgLyAodW5zaWduZWQpc2l6ZW9mKCpnZCkpICogYmxvY2tzX3Blcl9ncm91cAorCQksIG5ncm91cHMKKwkJLCBibG9ja3NfcGVyX2dyb3VwLCBibG9ja3NfcGVyX2dyb3VwCisJCSwgaW5vZGVzX3Blcl9ncm91cAorCSk7CisJeworCQljb25zdCBjaGFyICpmbXQgPSAiXG5TdXBlcmJsb2NrIGJhY2t1cHMgc3RvcmVkIG9uIGJsb2NrczpcbiIKKwkJCSJcdCV1IjsKKwkJcG9zID0gZmlyc3RfYmxvY2s7CisJCWZvciAoaSA9IDE7IGkgPCBuZ3JvdXBzOyBpKyspIHsKKwkJCXBvcyArPSBibG9ja3NfcGVyX2dyb3VwOworCQkJaWYgKGhhc19zdXBlcihpKSkgeworCQkJCXByaW50ZihmbXQsICh1bnNpZ25lZClwb3MpOworCQkJCWZtdCA9ICIsICV1IjsKKwkJCX0KKwkJfQorCX0KKwliYl9wdXRjaGFyKCdcbicpOworCisJaWYgKG9wdGlvbl9tYXNrMzIgJiBPUFRfbikgeworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCQljbG9zZShmZCk7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJLy8gVE9ETzogMy81IHJlZnVzZSBpZiBtb3VudGVkCisJLy8gVE9ETzogNC81IGNvbXBhdCBvcHRpb25zCisJLy8gVE9ETzogMS81IHNhbml0eSBjaGVja3MKKwkvLyBUT0RPOiAwLzUgbW9yZSB2ZXJib3NlIGVycm9yIG1lc3NhZ2VzCisJLy8gVE9ETzogNC81IGJpZ2VuZGlhbm5lc3M6IHJlY2hlY2ssIHdhaXQgZm9yIEFSTSByZXBvcnRlcnMKKwkvLyBUT0RPOiAyLzUgcmVzZXJ2ZWQgR0RUOiBob3cgdG8gbWFyayBidXQgbm90IGFsbG9jYXRlPworCS8vIFRPRE86IDMvNSBkaXJfaW5kZXg/CisKKwkvLyBmaWxsIHRoZSBzdXBlcmJsb2NrCisJc2IgPSB4emFsbG9jKDEwMjQpOworCVNUT1JFX0xFKHNiLT5zX3Jldl9sZXZlbCwgRVhUMl9EWU5BTUlDX1JFVik7IC8vIHJldmlzaW9uIDEgZmlsZXN5c3RlbQorCVNUT1JFX0xFKHNiLT5zX21hZ2ljLCBFWFQyX1NVUEVSX01BR0lDKTsKKwlTVE9SRV9MRShzYi0+c19pbm9kZV9zaXplLCBpbm9kZXNpemUpOworCS8vIHNldCAiUmVxdWlyZWQgZXh0cmEgaXNpemUiIGFuZCAiRGVzaXJlZCBleHRyYSBpc2l6ZSIgZmllbGRzIHRvIDI4CisJaWYgKGlub2Rlc2l6ZSAhPSBzaXplb2YoKmlub2RlKSkgeworCQlTVE9SRV9MRShzYi0+c19taW5fZXh0cmFfaXNpemUsIDB4MDAxYyk7CisJCVNUT1JFX0xFKHNiLT5zX3dhbnRfZXh0cmFfaXNpemUsIDB4MDAxYyk7CisJfQorCVNUT1JFX0xFKHNiLT5zX2ZpcnN0X2lubywgRVhUMl9HT09EX09MRF9GSVJTVF9JTk8pOworCVNUT1JFX0xFKHNiLT5zX2xvZ19ibG9ja19zaXplLCBibG9ja3NpemVfbG9nMiAtIEVYVDJfTUlOX0JMT0NLX0xPR19TSVpFKTsKKwlTVE9SRV9MRShzYi0+c19sb2dfZnJhZ19zaXplLCBibG9ja3NpemVfbG9nMiAtIEVYVDJfTUlOX0JMT0NLX0xPR19TSVpFKTsKKwkvLyBmaXJzdCAxMDI0IGJ5dGVzIG9mIHRoZSBkZXZpY2UgYXJlIGZvciBib290IHJlY29yZC4gSWYgYmxvY2sgc2l6ZSBpcyAxMDI0IGJ5dGVzLCB0aGVuCisJLy8gdGhlIGZpcnN0IGJsb2NrIGlzIDEsIG90aGVyd2lzZSAwCisJU1RPUkVfTEUoc2ItPnNfZmlyc3RfZGF0YV9ibG9jaywgZmlyc3RfYmxvY2spOworCS8vIGJsb2NrIGFuZCBpbm9kZSBiaXRtYXBzIG9jY3VweSBubyBtb3JlIHRoYW4gb25lIGJsb2NrLCBzbyBtYXhpbXVtIG51bWJlciBvZiBibG9ja3MgaXMKKwlTVE9SRV9MRShzYi0+c19ibG9ja3NfcGVyX2dyb3VwLCBibG9ja3NfcGVyX2dyb3VwKTsKKwlTVE9SRV9MRShzYi0+c19mcmFnc19wZXJfZ3JvdXAsIGJsb2Nrc19wZXJfZ3JvdXApOworCS8vIGJsb2NrcworCVNUT1JFX0xFKHNiLT5zX2Jsb2Nrc19jb3VudCwgbmJsb2Nrcyk7CisJLy8gcmVzZXJ2ZSBibG9ja3MgZm9yIHN1cGVydXNlcgorCVNUT1JFX0xFKHNiLT5zX3JfYmxvY2tzX2NvdW50LCBucmVzZXJ2ZWQpOworCS8vIG5pbm9kZXMKKwlTVE9SRV9MRShzYi0+c19pbm9kZXNfcGVyX2dyb3VwLCBpbm9kZXNfcGVyX2dyb3VwKTsKKwlTVE9SRV9MRShzYi0+c19pbm9kZXNfY291bnQsIGlub2Rlc19wZXJfZ3JvdXAgKiBuZ3JvdXBzKTsKKwlTVE9SRV9MRShzYi0+c19mcmVlX2lub2Rlc19jb3VudCwgaW5vZGVzX3Blcl9ncm91cCAqIG5ncm91cHMgLSBFWFQyX0dPT0RfT0xEX0ZJUlNUX0lOTyk7CisJLy8gdGltZXN0YW1wcworCXRpbWVzdGFtcCA9IHRpbWUoTlVMTCk7CisJU1RPUkVfTEUoc2ItPnNfbWtmc190aW1lLCB0aW1lc3RhbXApOworCVNUT1JFX0xFKHNiLT5zX3d0aW1lLCB0aW1lc3RhbXApOworCVNUT1JFX0xFKHNiLT5zX2xhc3RjaGVjaywgdGltZXN0YW1wKTsKKwkvLyBtaXNjLiBWYWx1ZXMgYXJlIGNob3NlbiB0byBtYXRjaCBta2UyZnMgMS40MS45CisJU1RPUkVfTEUoc2ItPnNfc3RhdGUsIDEpOyAvLyBUT0RPOiB3aGF0J3MgMT8KKwlTVE9SRV9MRShzYi0+c19jcmVhdG9yX29zLCBFWFQyX09TX0xJTlVYKTsKKwlTVE9SRV9MRShzYi0+c19jaGVja2ludGVydmFsLCAyNCo2MCo2MCAqIDE4MCk7IC8vIDE4MCBkYXlzCisJU1RPUkVfTEUoc2ItPnNfZXJyb3JzLCBFWFQyX0VSUk9SU19ERUZBVUxUKTsKKwkvLyBta2UyZnMgMS40MS45IGFsc28gc2V0cyBFWFQzX0ZFQVRVUkVfQ09NUEFUX1JFU0laRV9JTk9ERQorCS8vIGFuZCBpZiA+PSAwLjVHQiwgRVhUM19GRUFUVVJFX1JPX0NPTVBBVF9MQVJHRV9GSUxFLgorCS8vIHdlIHVzZSB2YWx1ZXMgd2hpY2ggbWF0Y2ggIm1rZTJmcyAtTyBecmVzaXplX2lub2RlIjoKKwkvLyBpbiB0aGlzIGNhc2UgMS40MS45IG5ldmVyIHNldHMgRVhUM19GRUFUVVJFX1JPX0NPTVBBVF9MQVJHRV9GSUxFLgorCVNUT1JFX0xFKHNiLT5zX2ZlYXR1cmVfY29tcGF0LCBFWFQyX0ZFQVRVUkVfQ09NUEFUX1NVUFAKKwkJfCAoRVhUMl9GRUFUVVJFX0NPTVBBVF9SRVNJWkVfSU5PICogRU5BQkxFX0ZFQVRVUkVfTUtGU19FWFQyX1JFU0VSVkVEX0dEVCkKKwkJfCAoRVhUMl9GRUFUVVJFX0NPTVBBVF9ESVJfSU5ERVggKiBFTkFCTEVfRkVBVFVSRV9NS0ZTX0VYVDJfRElSX0lOREVYKQorCSk7CisJU1RPUkVfTEUoc2ItPnNfZmVhdHVyZV9pbmNvbXBhdCwgRVhUMl9GRUFUVVJFX0lOQ09NUEFUX0ZJTEVUWVBFKTsKKwlTVE9SRV9MRShzYi0+c19mZWF0dXJlX3JvX2NvbXBhdCwgRVhUMl9GRUFUVVJFX1JPX0NPTVBBVF9TUEFSU0VfU1VQRVIpOworCVNUT1JFX0xFKHNiLT5zX2ZsYWdzLCBFWFQyX0ZMQUdTX1VOU0lHTkVEX0hBU0ggKiBFTkFCTEVfRkVBVFVSRV9NS0ZTX0VYVDJfRElSX0lOREVYKTsKKwlnZW5lcmF0ZV91dWlkKHNiLT5zX3V1aWQpOworCWlmIChFTkFCTEVfRkVBVFVSRV9NS0ZTX0VYVDJfRElSX0lOREVYKSB7CisJCVNUT1JFX0xFKHNiLT5zX2RlZl9oYXNoX3ZlcnNpb24sIEVYVDJfSEFTSF9IQUxGX01ENCk7CisJCWdlbmVyYXRlX3V1aWQoKHVpbnQ4X3QgKilzYi0+c19oYXNoX3NlZWQpOworCX0KKwkvKgorCSAqIEZyb20gZTJmc3Byb2dzOiBhZGQgImppdHRlciIgdG8gdGhlIHN1cGVyYmxvY2sncyBjaGVjayBpbnRlcnZhbCBzbyB0aGF0IHdlCisJICogZG9uJ3QgY2hlY2sgYWxsIHRoZSBmaWxlc3lzdGVtcyBhdCB0aGUgc2FtZSB0aW1lLiAgV2UgdXNlIGEKKwkgKiBrbHVkZ3kgaGFjayBvZiB1c2luZyB0aGUgVVVJRCB0byBkZXJpdmUgYSByYW5kb20gaml0dGVyIHZhbHVlLgorCSAqLworCVNUT1JFX0xFKHNiLT5zX21heF9tbnRfY291bnQsCisJCUVYVDJfREZMX01BWF9NTlRfQ09VTlQKKwkJKyAoc2ItPnNfdXVpZFtBUlJBWV9TSVpFKHNiLT5zX3V1aWQpLTFdICUgRVhUMl9ERkxfTUFYX01OVF9DT1VOVCkpOworCisJLy8gd3JpdGUgdGhlIGxhYmVsCisJc2FmZV9zdHJuY3B5KChjaGFyICopc2ItPnNfdm9sdW1lX25hbWUsIGxhYmVsLCBzaXplb2Yoc2ItPnNfdm9sdW1lX25hbWUpKTsKKworCS8vIGNhbGN1bGF0ZSBmaWxlc3lzdGVtIHNrZWxldG9uIHN0cnVjdHVyZXMKKwlnZCA9IHh6YWxsb2MoZ3JvdXBfZGVzY19ibG9ja3MgKiBibG9ja3NpemUpOworCWJ1ZiA9IHhtYWxsb2MoYmxvY2tzaXplKTsKKwlzYi0+c19mcmVlX2Jsb2Nrc19jb3VudCA9IDA7CisJZm9yIChpID0gMCwgcG9zID0gZmlyc3RfYmxvY2ssIG4gPSBuYmxvY2tzIC0gZmlyc3RfYmxvY2s7CisJCWkgPCBuZ3JvdXBzOworCQlpKyssIHBvcyArPSBibG9ja3NfcGVyX2dyb3VwLCBuIC09IGJsb2Nrc19wZXJfZ3JvdXAKKwkpIHsKKwkJdWludDMyX3Qgb3ZlcmhlYWQgPSBwb3MgKyAoaGFzX3N1cGVyKGkpID8gKDEvKnNiKi8gKyBncm91cF9kZXNjX2Jsb2NrcykgOiAwKTsKKwkJdWludDMyX3QgZnJlZV9ibG9ja3M7CisJCS8vIGZpbGwgZ3JvdXAgZGVzY3JpcHRvcnMKKwkJU1RPUkVfTEUoZ2RbaV0uYmdfYmxvY2tfYml0bWFwLCBvdmVyaGVhZCArIDApOworCQlTVE9SRV9MRShnZFtpXS5iZ19pbm9kZV9iaXRtYXAsIG92ZXJoZWFkICsgMSk7CisJCVNUT1JFX0xFKGdkW2ldLmJnX2lub2RlX3RhYmxlLCBvdmVyaGVhZCArIDIpOworCQlvdmVyaGVhZCA9IG92ZXJoZWFkIC0gcG9zICsgMS8qYmJtcCovICsgMS8qaWJtcCovICsgaW5vZGVfdGFibGVfYmxvY2tzOworCQlnZFtpXS5iZ19mcmVlX2lub2Rlc19jb3VudCA9IGlub2Rlc19wZXJfZ3JvdXA7CisJCS8vU1RPUkVfTEUoZ2RbaV0uYmdfdXNlZF9kaXJzX2NvdW50LCAwKTsKKwkJLy8gTi5CLiBib3RoICIvIiBhbmQgIi9sb3N0K2ZvdW5kIiBhcmUgd2l0aGluIHRoZSBmaXJzdCBibG9jayBncm91cAorCQkvLyAiLyIgb2NjdXBpZXMgMSBibG9jaywgIi9sb3N0K2ZvdW5kIiBvY2N1cGllcyBsb3N0X2FuZF9mb3VuZF9ibG9ja3MuLi4KKwkJaWYgKDAgPT0gaSkgeworCQkJLy8gLi4uIHRodXMgaW5jcmVhc2VkIG92ZXJoZWFkIGZvciB0aGUgZmlyc3QgYmxvY2sgZ3JvdXAgLi4uCisJCQlvdmVyaGVhZCArPSAxICsgbG9zdF9hbmRfZm91bmRfYmxvY2tzOworCQkJLy8gLi4uIGFuZCAyIHVzZWQgZGlyZWN0b3JpZXMKKwkJCVNUT1JFX0xFKGdkW2ldLmJnX3VzZWRfZGlyc19jb3VudCwgMik7CisJCQkvLyB3ZWxsIGtub3duIHJlc2VydmVkIGlub2RlcyBiZWxvbmcgdG8gdGhlIGZpcnN0IGJsb2NrIHRvbworCQkJZ2RbaV0uYmdfZnJlZV9pbm9kZXNfY291bnQgLT0gRVhUMl9HT09EX09MRF9GSVJTVF9JTk87CisJCX0KKworCQkvLyBjYWNoZSBmcmVlIGJsb2NrIGNvdW50IG9mIHRoZSBncm91cAorCQlmcmVlX2Jsb2NrcyA9IChuIDwgYmxvY2tzX3Blcl9ncm91cCA/IG4gOiBibG9ja3NfcGVyX2dyb3VwKSAtIG92ZXJoZWFkOworCisJCS8vIG1hcmsgcHJlYWxsb2NhdGVkIGJsb2NrcyBhcyBhbGxvY2F0ZWQKKy8vYmJfaW5mb19tc2coIkFMTE9DOiBbJXVdWyV1XVsldV0iLCBibG9ja3NpemUsIG92ZXJoZWFkLCBibG9ja3NfcGVyX2dyb3VwIC0gKGZyZWVfYmxvY2tzICsgb3ZlcmhlYWQpKTsKKwkJYWxsb2NhdGUoYnVmLCBibG9ja3NpemUsCisJCQkvLyByZXNlcnZlICJvdmVyaGVhZCIgYmxvY2tzCisJCQlvdmVyaGVhZCwKKwkJCS8vIG1hcmsgdW51c2VkIHRyYWlsaW5nIGJsb2NrcworCQkJYmxvY2tzX3Blcl9ncm91cCAtIChmcmVlX2Jsb2NrcyArIG92ZXJoZWFkKQorCQkpOworCQkvLyBkdW1wIGJsb2NrIGJpdG1hcAorCQlQVVQoKHVpbnQ2NF90KShGRVRDSF9MRTMyKGdkW2ldLmJnX2Jsb2NrX2JpdG1hcCkpICogYmxvY2tzaXplLCBidWYsIGJsb2Nrc2l6ZSk7CisJCVNUT1JFX0xFKGdkW2ldLmJnX2ZyZWVfYmxvY2tzX2NvdW50LCBmcmVlX2Jsb2Nrcyk7CisKKwkJLy8gbWFyayBwcmVhbGxvY2F0ZWQgaW5vZGVzIGFzIGFsbG9jYXRlZAorCQlhbGxvY2F0ZShidWYsIGJsb2Nrc2l6ZSwKKwkJCS8vIG1hcmsgcmVzZXJ2ZWQgaW5vZGVzCisJCQlpbm9kZXNfcGVyX2dyb3VwIC0gZ2RbaV0uYmdfZnJlZV9pbm9kZXNfY291bnQsCisJCQkvLyBtYXJrIHVudXNlZCB0cmFpbGluZyBpbm9kZXMKKwkJCWJsb2Nrc19wZXJfZ3JvdXAgLSBpbm9kZXNfcGVyX2dyb3VwCisJCSk7CisJCS8vIGR1bXAgaW5vZGUgYml0bWFwCisJCS8vUFVUKCh1aW50NjRfdCkoRkVUQ0hfTEUzMihnZFtpXS5iZ19ibG9ja19iaXRtYXApKSAqIGJsb2Nrc2l6ZSwgYnVmLCBibG9ja3NpemUpOworCQkvL2J1dCBpdCdzIHJpZ2h0IGFmdGVyIGJsb2NrIGJpdG1hcCwgc28gd2UgY2FuIGp1c3Q6CisJCXh3cml0ZShmZCwgYnVmLCBibG9ja3NpemUpOworCQlTVE9SRV9MRShnZFtpXS5iZ19mcmVlX2lub2Rlc19jb3VudCwgZ2RbaV0uYmdfZnJlZV9pbm9kZXNfY291bnQpOworCisJCS8vIGNvdW50IG92ZXJhbGwgZnJlZSBibG9ja3MKKwkJc2ItPnNfZnJlZV9ibG9ja3NfY291bnQgKz0gZnJlZV9ibG9ja3M7CisJfQorCVNUT1JFX0xFKHNiLT5zX2ZyZWVfYmxvY2tzX2NvdW50LCBzYi0+c19mcmVlX2Jsb2Nrc19jb3VudCk7CisKKwkvLyBkdW1wIGZpbGVzeXN0ZW0gc2tlbGV0b24gc3RydWN0dXJlcworLy8JcHJpbnRmKCJXcml0aW5nIHN1cGVyYmxvY2tzIGFuZCBmaWxlc3lzdGVtIGFjY291bnRpbmcgaW5mb3JtYXRpb246ICIpOworCWZvciAoaSA9IDAsIHBvcyA9IGZpcnN0X2Jsb2NrOyBpIDwgbmdyb3VwczsgaSsrLCBwb3MgKz0gYmxvY2tzX3Blcl9ncm91cCkgeworCQkvLyBkdW1wIHN1cGVyYmxvY2sgYW5kIGdyb3VwIGRlc2NyaXB0b3JzIGFuZCB0aGVpciBiYWNrdXBzCisJCWlmIChoYXNfc3VwZXIoaSkpIHsKKwkJCS8vIE4uQi4gMTAyNCBieXRlIGJsb2NrcyBhcmUgc3BlY2lhbAorCQkJUFVUKCgodWludDY0X3QpcG9zICogYmxvY2tzaXplKSArICgoMCA9PSBpICYmIDEwMjQgIT0gYmxvY2tzaXplKSA/IDEwMjQgOiAwKSwKKwkJCQkJc2IsIDEwMjQpOworCQkJUFVUKCgodWludDY0X3QpcG9zICogYmxvY2tzaXplKSArIGJsb2Nrc2l6ZSwKKwkJCQkJZ2QsIGdyb3VwX2Rlc2NfYmxvY2tzICogYmxvY2tzaXplKTsKKwkJfQorCX0KKworCS8vIHplcm8gYm9vdCBzZWN0b3JzCisJbWVtc2V0KGJ1ZiwgMCwgYmxvY2tzaXplKTsKKwkvLyBEaXNhYmxlZDogc3RhbmRhcmQgbWtlMmZzIGRvZXNuJ3QgZG8gdGhpcywgYW5kCisJLy8gb24gU1BBUkMgdGhpcyBkZXN0cm95cyBTdW4gZGlza2xhYmVsLgorCS8vIFVzZXJzIHdobyBuZWVkL3dhbnQgemVyb2luZyBjYW4gZWFzaWx5IGRvIGl0IHdpdGggZGQuCisJLy9QVVQoMCwgYnVmLCAxMDI0KTsgLy8gTi5CLiAxMDI0IDw9IGJsb2Nrc2l6ZSwgc28gYnVmWzAuLjEwMjNdIGNvbnRhaW5zIHplcm9zCisKKwkvLyB6ZXJvIGlub2RlIHRhYmxlcworCWZvciAoaSA9IDA7IGkgPCBuZ3JvdXBzOyArK2kpCisJCWZvciAobiA9IDA7IG4gPCBpbm9kZV90YWJsZV9ibG9ja3M7ICsrbikKKwkJCVBVVCgodWludDY0X3QpKEZFVENIX0xFMzIoZ2RbaV0uYmdfaW5vZGVfdGFibGUpICsgbikgKiBibG9ja3NpemUsCisJCQkJYnVmLCBibG9ja3NpemUpOworCisJLy8gcHJlcGFyZSBkaXJlY3RvcnkgaW5vZGUKKwlpbm9kZSA9IChzdHJ1Y3QgZXh0Ml9pbm9kZSAqKWJ1ZjsKKwlTVE9SRV9MRShpbm9kZS0+aV9tb2RlLCBTX0lGRElSIHwgU19JUldYVSB8IFNfSVJHUlAgfCBTX0lST1RIIHwgU19JWEdSUCB8IFNfSVhPVEgpOworCVNUT1JFX0xFKGlub2RlLT5pX210aW1lLCB0aW1lc3RhbXApOworCVNUT1JFX0xFKGlub2RlLT5pX2F0aW1lLCB0aW1lc3RhbXApOworCVNUT1JFX0xFKGlub2RlLT5pX2N0aW1lLCB0aW1lc3RhbXApOworCVNUT1JFX0xFKGlub2RlLT5pX3NpemUsIGJsb2Nrc2l6ZSk7CisJLy8gaW5vZGUtPmlfYmxvY2tzIHN0b3JlcyB0aGUgbnVtYmVyIG9mIDUxMiBieXRlIGRhdGEgYmxvY2tzCisJLy8gKDUxMiwgYmVjYXVzZSBpdCBnb2VzIGRpcmVjdGx5IHRvIHN0cnVjdCBzdGF0IHdpdGhvdXQgc2NhbGluZykKKwlTVE9SRV9MRShpbm9kZS0+aV9ibG9ja3MsIGJsb2Nrc2l6ZSAvIDUxMik7CisKKwkvLyBkdW1wIHJvb3QgZGlyIGlub2RlCisJU1RPUkVfTEUoaW5vZGUtPmlfbGlua3NfY291bnQsIDMpOyAvLyAiLy4iLCAiLy4uIiwgIi9sb3N0K2ZvdW5kLy4uIiBwb2ludCB0byB0aGlzIGlub2RlCisJU1RPUkVfTEUoaW5vZGUtPmlfYmxvY2tbMF0sIEZFVENIX0xFMzIoZ2RbMF0uYmdfaW5vZGVfdGFibGUpICsgaW5vZGVfdGFibGVfYmxvY2tzKTsKKwlQVVQoKCh1aW50NjRfdClGRVRDSF9MRTMyKGdkWzBdLmJnX2lub2RlX3RhYmxlKSAqIGJsb2Nrc2l6ZSkgKyAoRVhUMl9ST09UX0lOTy0xKSAqIGlub2Rlc2l6ZSwKKwkJCQlidWYsIGlub2Rlc2l6ZSk7CisKKwkvLyBkdW1wIGxvc3QrZm91bmQgZGlyIGlub2RlCisJU1RPUkVfTEUoaW5vZGUtPmlfbGlua3NfY291bnQsIDIpOyAvLyBib3RoICIvbG9zdCtmb3VuZCIgYW5kICIvbG9zdCtmb3VuZC8uIiBwb2ludCB0byB0aGlzIGlub2RlCisJU1RPUkVfTEUoaW5vZGUtPmlfc2l6ZSwgbG9zdF9hbmRfZm91bmRfYmxvY2tzICogYmxvY2tzaXplKTsKKwlTVE9SRV9MRShpbm9kZS0+aV9ibG9ja3MsIChsb3N0X2FuZF9mb3VuZF9ibG9ja3MgKiBibG9ja3NpemUpIC8gNTEyKTsKKwluID0gRkVUQ0hfTEUzMihpbm9kZS0+aV9ibG9ja1swXSkgKyAxOworCWZvciAoaSA9IDA7IGkgPCBsb3N0X2FuZF9mb3VuZF9ibG9ja3M7ICsraSkKKwkJU1RPUkVfTEUoaW5vZGUtPmlfYmxvY2tbaV0sIGkgKyBuKTsgLy8gdXNlIG5leHQgYmxvY2sKKy8vYmJfaW5mb19tc2coIkxBU1QgQkxPQ0sgVVNFRFsldV0iLCBpICsgbik7CisJUFVUKCgodWludDY0X3QpRkVUQ0hfTEUzMihnZFswXS5iZ19pbm9kZV90YWJsZSkgKiBibG9ja3NpemUpICsgKEVYVDJfR09PRF9PTERfRklSU1RfSU5PLTEpICogaW5vZGVzaXplLAorCQkJCWJ1ZiwgaW5vZGVzaXplKTsKKworCS8vIGR1bXAgZGlyZWN0b3JpZXMKKwltZW1zZXQoYnVmLCAwLCBibG9ja3NpemUpOworCWRpciA9IChzdHJ1Y3QgZXh0Ml9kaXIgKilidWY7CisKKwkvLyBkdW1wIDJuZCsgYmxvY2tzIG9mICIvbG9zdCtmb3VuZCIKKwlTVE9SRV9MRShkaXItPnJlY19sZW4xLCBibG9ja3NpemUpOyAvLyBlMmZzY2sgMS40MS40IGNvbXBhdCAoMS40MS45IGRvZXMgbm90IG5lZWQgdGhpcykKKwlmb3IgKGkgPSAxOyBpIDwgbG9zdF9hbmRfZm91bmRfYmxvY2tzOyArK2kpCisJCVBVVCgodWludDY0X3QpKEZFVENIX0xFMzIoZ2RbMF0uYmdfaW5vZGVfdGFibGUpICsgaW5vZGVfdGFibGVfYmxvY2tzICsgMStpKSAqIGJsb2Nrc2l6ZSwKKwkJCQlidWYsIGJsb2Nrc2l6ZSk7CisKKwkvLyBkdW1wIDFzdCBibG9jayBvZiAiL2xvc3QrZm91bmQiCisJU1RPUkVfTEUoZGlyLT5pbm9kZTEsIEVYVDJfR09PRF9PTERfRklSU1RfSU5PKTsKKwlTVE9SRV9MRShkaXItPnJlY19sZW4xLCAxMik7CisJU1RPUkVfTEUoZGlyLT5uYW1lX2xlbjEsIDEpOworCVNUT1JFX0xFKGRpci0+ZmlsZV90eXBlMSwgRVhUMl9GVF9ESVIpOworCWRpci0+bmFtZTFbMF0gPSAnLic7CisJU1RPUkVfTEUoZGlyLT5pbm9kZTIsIEVYVDJfUk9PVF9JTk8pOworCVNUT1JFX0xFKGRpci0+cmVjX2xlbjIsIGJsb2Nrc2l6ZSAtIDEyKTsKKwlTVE9SRV9MRShkaXItPm5hbWVfbGVuMiwgMik7CisJU1RPUkVfTEUoZGlyLT5maWxlX3R5cGUyLCBFWFQyX0ZUX0RJUik7CisJZGlyLT5uYW1lMlswXSA9ICcuJzsgZGlyLT5uYW1lMlsxXSA9ICcuJzsKKwlQVVQoKHVpbnQ2NF90KShGRVRDSF9MRTMyKGdkWzBdLmJnX2lub2RlX3RhYmxlKSArIGlub2RlX3RhYmxlX2Jsb2NrcyArIDEpICogYmxvY2tzaXplLCBidWYsIGJsb2Nrc2l6ZSk7CisKKwkvLyBkdW1wIHJvb3QgZGlyIGJsb2NrCisJU1RPUkVfTEUoZGlyLT5pbm9kZTEsIEVYVDJfUk9PVF9JTk8pOworCVNUT1JFX0xFKGRpci0+cmVjX2xlbjIsIDEyKTsKKwlTVE9SRV9MRShkaXItPmlub2RlMywgRVhUMl9HT09EX09MRF9GSVJTVF9JTk8pOworCVNUT1JFX0xFKGRpci0+cmVjX2xlbjMsIGJsb2Nrc2l6ZSAtIDEyIC0gMTIpOworCVNUT1JFX0xFKGRpci0+bmFtZV9sZW4zLCAxMCk7CisJU1RPUkVfTEUoZGlyLT5maWxlX3R5cGUzLCBFWFQyX0ZUX0RJUik7CisJc3RyY3B5KGRpci0+bmFtZTMsICJsb3N0K2ZvdW5kIik7CisJUFVUKCh1aW50NjRfdCkoRkVUQ0hfTEUzMihnZFswXS5iZ19pbm9kZV90YWJsZSkgKyBpbm9kZV90YWJsZV9ibG9ja3MgKyAwKSAqIGJsb2Nrc2l6ZSwgYnVmLCBibG9ja3NpemUpOworCisJLy8gY2xlYW51cAorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlmcmVlKGJ1Zik7CisJCWZyZWUoZ2QpOworCQlmcmVlKHNiKTsKKwl9CisKKwl4Y2xvc2UoZmQpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L21rZnNfZXh0Mi50eHQgYi91dGlsLWxpbnV4L21rZnNfZXh0Mi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczZDViNgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvbWtmc19leHQyLnR4dApAQCAtMCwwICsxLDc3IEBACitEaWZmZXJlbmNlIGJldHdlZW4gYmJveCBta2UyZnMgYW5kIHN0YW5kYXJkIG9uZSAoZHVtcGUyZnMgY29tcGFyaXNvbik6CisKK1t1cGQ6IGlub2RlIHNpemUgaGFzIGJlZW4gZml4ZWQgc2luY2UgdGhlbl0KKworVHdvIHNpZ25pZmljYW50IGRpZmZlcmVuY2VzOgorLSBzdGFuZGFyZCBta2UyZnMgaGFzIHJlc2l6ZV9pbm9kZSBmZWF0dXJlIGFuZCB0aHVzIGhhcyByZXNlcnZlZCBHRFQgYmxvY2tzLAorICB3aGljaCBkZWNyZWFzZXMgZnJlZSBibG9ja3M7CistIGlub2RlIHNpemU6IDEyOC8yNTYgKHNpbmNlIDY3OTgwN2sgaXMgPjAuNUcsIHN0YW5kYXJkIG1rZTJmcyB1c2VzICJiaWciIGlub2RlcykKKyAgdGhpcyBhZmZlY3RzIGlub2RlIHRhYmxlIGluIGJsb2NrIGdyb3VwcworCitGaWxlc3lzdGVtIHZvbHVtZSBuYW1lOiAgIDxub25lPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlc3lzdGVtIHZvbHVtZSBuYW1lOiAgIDxub25lPgorTGFzdCBtb3VudGVkIG9uOiAgICAgICAgICA8bm90IGF2YWlsYWJsZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdCBtb3VudGVkIG9uOiAgICAgICAgICA8bm90IGF2YWlsYWJsZT4KK0ZpbGVzeXN0ZW0gVVVJRDogICAgICAgICAgZjQ4Mzk3NjAtYzg5Yi00NGI3LWFjNTItMDhiNGUzMjZjMGI0ICAgICAgICAgIEZpbGVzeXN0ZW0gVVVJRDogICAgICAgICAgNzExNzk1NTgtOGM4ZS00YTU2LWFkNTQtMDE4MDA4ZjVjMzU4CitGaWxlc3lzdGVtIG1hZ2ljIG51bWJlcjogIDB4RUY1MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlc3lzdGVtIG1hZ2ljIG51bWJlcjogIDB4RUY1MworRmlsZXN5c3RlbSByZXZpc2lvbiAjOiAgICAxIChkeW5hbWljKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZXN5c3RlbSByZXZpc2lvbiAjOiAgICAxIChkeW5hbWljKQorRmlsZXN5c3RlbSBmZWF0dXJlczogICAgICBleHRfYXR0ciBkaXJfaW5kZXggZmlsZXR5cGUgc3BhcnNlX3N1cGVyICAgICAgRmlsZXN5c3RlbSBmZWF0dXJlczogICAgICBleHRfYXR0ciByZXNpemVfaW5vZGUgZGlyX2luZGV4IGZpbGV0eXBlIHNwYXJzZV9zdXBlciBsYXJnZV9maWxlCitGaWxlc3lzdGVtIGZsYWdzOiAgICAgICAgIHNpZ25lZF9kaXJlY3RvcnlfaGFzaCAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlc3lzdGVtIGZsYWdzOiAgICAgICAgIHNpZ25lZF9kaXJlY3RvcnlfaGFzaAorRGVmYXVsdCBtb3VudCBvcHRpb25zOiAgICAobm9uZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBtb3VudCBvcHRpb25zOiAgICAobm9uZSkKK0ZpbGVzeXN0ZW0gc3RhdGU6ICAgICAgICAgY2xlYW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVzeXN0ZW0gc3RhdGU6ICAgICAgICAgY2xlYW4KK0Vycm9ycyBiZWhhdmlvcjogICAgICAgICAgQ29udGludWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9ycyBiZWhhdmlvcjogICAgICAgICAgQ29udGludWUKK0ZpbGVzeXN0ZW0gT1MgdHlwZTogICAgICAgTGludXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVzeXN0ZW0gT1MgdHlwZTogICAgICAgTGludXgKK0lub2RlIGNvdW50OiAgICAgICAgICAgICAgNDI2MjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElub2RlIGNvdW50OiAgICAgICAgICAgICAgNDI1MjgKK0Jsb2NrIGNvdW50OiAgICAgICAgICAgICAgMTY5OTUxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrIGNvdW50OiAgICAgICAgICAgICAgMTY5OTUxCitSZXNlcnZlZCBibG9jayBjb3VudDogICAgIDg0OTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZCBibG9jayBjb3VudDogICAgIDg0OTcKK0ZyZWUgYmxvY2tzOiAgICAgICAgICAgICAgMTY4NTk0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWUgYmxvY2tzOiAgICAgICAgICAgICAgMTY3MTAzCitGcmVlIGlub2RlczogICAgICAgICAgICAgIDQyNjEzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmVlIGlub2RlczogICAgICAgICAgICAgIDQyNTE3CitGaXJzdCBibG9jazogICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaXJzdCBibG9jazogICAgICAgICAgICAgIDAKK0Jsb2NrIHNpemU6ICAgICAgICAgICAgICAgNDA5NiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrIHNpemU6ICAgICAgICAgICAgICAgNDA5NgorRnJhZ21lbnQgc2l6ZTogICAgICAgICAgICA0MDk2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhZ21lbnQgc2l6ZTogICAgICAgICAgICA0MDk2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZCBHRFQgYmxvY2tzOiAgICAgIDQxCitCbG9ja3MgcGVyIGdyb3VwOiAgICAgICAgIDMyNzY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja3MgcGVyIGdyb3VwOiAgICAgICAgIDMyNzY4CitGcmFnbWVudHMgcGVyIGdyb3VwOiAgICAgIDMyNzY4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFnbWVudHMgcGVyIGdyb3VwOiAgICAgIDMyNzY4CitJbm9kZXMgcGVyIGdyb3VwOiAgICAgICAgIDcxMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbm9kZXMgcGVyIGdyb3VwOiAgICAgICAgIDcwODgKK0lub2RlIGJsb2NrcyBwZXIgZ3JvdXA6ICAgMjIyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElub2RlIGJsb2NrcyBwZXIgZ3JvdXA6ICAgNDQzCitGaWxlc3lzdGVtIGNyZWF0ZWQ6ICAgICAgIFdlZCBPY3QgMjEgMTM6NDA6NTUgMjAwOSAgICAgICAgICAgICAgICAgICAgICBGaWxlc3lzdGVtIGNyZWF0ZWQ6ICAgICAgIFdlZCBPY3QgMjEgMTM6NDA6NTUgMjAwOQorTGFzdCBtb3VudCB0aW1lOiAgICAgICAgICBuL2EgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFzdCBtb3VudCB0aW1lOiAgICAgICAgICBuL2EKK0xhc3Qgd3JpdGUgdGltZTogICAgICAgICAgV2VkIE9jdCAyMSAxMzo0MDo1NSAyMDA5ICAgICAgICAgICAgICAgICAgICAgIExhc3Qgd3JpdGUgdGltZTogICAgICAgICAgV2VkIE9jdCAyMSAxMzo0MDo1NSAyMDA5CitNb3VudCBjb3VudDogICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb3VudCBjb3VudDogICAgICAgICAgICAgIDAKK01heGltdW0gbW91bnQgY291bnQ6ICAgICAgMjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heGltdW0gbW91bnQgY291bnQ6ICAgICAgMzcKK0xhc3QgY2hlY2tlZDogICAgICAgICAgICAgV2VkIE9jdCAyMSAxMzo0MDo1NSAyMDA5ICAgICAgICAgICAgICAgICAgICAgIExhc3QgY2hlY2tlZDogICAgICAgICAgICAgV2VkIE9jdCAyMSAxMzo0MDo1NSAyMDA5CitDaGVjayBpbnRlcnZhbDogICAgICAgICAgIDE1NTUyMDAwICg2IG1vbnRocykgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVjayBpbnRlcnZhbDogICAgICAgICAgIDE1NTUyMDAwICg2IG1vbnRocykKK05leHQgY2hlY2sgYWZ0ZXI6ICAgICAgICAgTW9uIEFwciAxOSAxMzo0MDo1NSAyMDEwICAgICAgICAgICAgICAgICAgICAgIE5leHQgY2hlY2sgYWZ0ZXI6ICAgICAgICAgTW9uIEFwciAxOSAxMzo0MDo1NSAyMDEwCitSZXNlcnZlZCBibG9ja3MgdWlkOiAgICAgIDAgKHVzZXIgcm9vdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZCBibG9ja3MgdWlkOiAgICAgIDAgKHVzZXIgcm9vdCkKK1Jlc2VydmVkIGJsb2NrcyBnaWQ6ICAgICAgMCAoZ3JvdXAgcm9vdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkIGJsb2NrcyBnaWQ6ICAgICAgMCAoZ3JvdXAgcm9vdCkKK0ZpcnN0IGlub2RlOiAgICAgICAgICAgICAgMTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpcnN0IGlub2RlOiAgICAgICAgICAgICAgMTEKK0lub2RlIHNpemU6ICAgICAgICAgICAgICAgMTI4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElub2RlIHNpemU6ICAgICAgICAgICAgICAgMjU2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1aXJlZCBleHRyYSBpc2l6ZTogICAgIDI4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNpcmVkIGV4dHJhIGlzaXplOiAgICAgIDI4CitEZWZhdWx0IGRpcmVjdG9yeSBoYXNoOiAgIGhhbGZfbWQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0IGRpcmVjdG9yeSBoYXNoOiAgIGhhbGZfbWQ0CitEaXJlY3RvcnkgSGFzaCBTZWVkOiAgICAgIGZmOTRkMDQ3LWM5Y2EtNGZlNS1iNTUzLTkzN2E3NjEwMWE4OSAgICAgICAgICBEaXJlY3RvcnkgSGFzaCBTZWVkOiAgICAgIGMyNzBmZDQzLTk4NjgtNGE5Mi1hZTk5LTA1MDA5OGUxMjgzNQorCisKK0dyb3VwIDA6IChCbG9ja3MgMC0zMjc2NykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwIDA6IChCbG9ja3MgMC0zMjc2NykKKyAgUHJpbWFyeSBzdXBlcmJsb2NrIGF0IDAsIEdyb3VwIGRlc2NyaXB0b3JzIGF0IDEtMSAgICAgICAgICAgICAgICAgICAgICAgUHJpbWFyeSBzdXBlcmJsb2NrIGF0IDAsIEdyb3VwIGRlc2NyaXB0b3JzIGF0IDEtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNlcnZlZCBHRFQgYmxvY2tzIGF0IDItNDIKKyAgQmxvY2sgYml0bWFwIGF0IDIgKCsyKSwgSW5vZGUgYml0bWFwIGF0IDMgKCszKSAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2sgYml0bWFwIGF0IDQzICgrNDMpLCBJbm9kZSBiaXRtYXAgYXQgNDQgKCs0NCkKKyAgSW5vZGUgdGFibGUgYXQgNC0yMjUgKCs0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5vZGUgdGFibGUgYXQgNDUtNDg3ICgrNDUpCisgIDMyNTM3IGZyZWUgYmxvY2tzLCA3MDkzIGZyZWUgaW5vZGVzLCAyIGRpcmVjdG9yaWVzICAgICAgICAgICAgICAgICAgICAgIDMyMjc0IGZyZWUgYmxvY2tzLCA3MDc3IGZyZWUgaW5vZGVzLCAyIGRpcmVjdG9yaWVzCisgIEZyZWUgYmxvY2tzOiAyMzEtMzI3NjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWUgYmxvY2tzOiA0OTQtMzI3NjcKKyAgRnJlZSBpbm9kZXM6IDEyLTcxMDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlZSBpbm9kZXM6IDEyLTcwODgKKworR3JvdXAgMTogKEJsb2NrcyAzMjc2OC02NTUzNSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAgMTogKEJsb2NrcyAzMjc2OC02NTUzNSkKKyAgQmFja3VwIHN1cGVyYmxvY2sgYXQgMzI3NjgsIEdyb3VwIGRlc2NyaXB0b3JzIGF0IDMyNzY5LTMyNzY5ICAgICAgICAgICAgQmFja3VwIHN1cGVyYmxvY2sgYXQgMzI3NjgsIEdyb3VwIGRlc2NyaXB0b3JzIGF0IDMyNzY5LTMyNzY5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc2VydmVkIEdEVCBibG9ja3MgYXQgMzI3NzAtMzI4MTAKKyAgQmxvY2sgYml0bWFwIGF0IDMyNzcwICgrMiksIElub2RlIGJpdG1hcCBhdCAzMjc3MSAoKzMpICAgICAgICAgICAgICAgICAgQmxvY2sgYml0bWFwIGF0IDMyODExICgrNDMpLCBJbm9kZSBiaXRtYXAgYXQgMzI4MTIgKCs0NCkKKyAgSW5vZGUgdGFibGUgYXQgMzI3NzItMzI5OTMgKCs0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5vZGUgdGFibGUgYXQgMzI4MTMtMzMyNTUgKCs0NSkKKyAgMzI1NDIgZnJlZSBibG9ja3MsIDcxMDQgZnJlZSBpbm9kZXMsIDAgZGlyZWN0b3JpZXMgICAgICAgICAgICAgICAgICAgICAgMzIyODAgZnJlZSBibG9ja3MsIDcwODggZnJlZSBpbm9kZXMsIDAgZGlyZWN0b3JpZXMKKyAgRnJlZSBibG9ja3M6IDMyOTk0LTY1NTM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJlZSBibG9ja3M6IDMzMjU2LTY1NTM1CisgIEZyZWUgaW5vZGVzOiA3MTA1LTE0MjA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWUgaW5vZGVzOiA3MDg5LTE0MTc2CisKK0dyb3VwIDI6IChCbG9ja3MgNjU1MzYtOTgzMDMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyb3VwIDI6IChCbG9ja3MgNjU1MzYtOTgzMDMpCisgIEJsb2NrIGJpdG1hcCBhdCA2NTUzNiAoKzApLCBJbm9kZSBiaXRtYXAgYXQgNjU1MzcgKCsxKSAgICAgICAgICAgICAgICAgIEJsb2NrIGJpdG1hcCBhdCA2NTUzNiAoKzApLCBJbm9kZSBiaXRtYXAgYXQgNjU1MzcgKCsxKQorICBJbm9kZSB0YWJsZSBhdCA2NTUzOC02NTc1OSAoKzIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbm9kZSB0YWJsZSBhdCA2NTUzOC02NTk4MCAoKzIpCisgIDMyNTQ0IGZyZWUgYmxvY2tzLCA3MTA0IGZyZWUgaW5vZGVzLCAwIGRpcmVjdG9yaWVzICAgICAgICAgICAgICAgICAgICAgIDMyMzIzIGZyZWUgYmxvY2tzLCA3MDg4IGZyZWUgaW5vZGVzLCAwIGRpcmVjdG9yaWVzCisgIEZyZWUgYmxvY2tzOiA2NTc2MC05ODMwMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyZWUgYmxvY2tzOiA2NTk4MS05ODMwMworICBGcmVlIGlub2RlczogMTQyMDktMjEzMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmVlIGlub2RlczogMTQxNzctMjEyNjQKKy4uLgpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9ta2ZzX2V4dDJfdGVzdC5zaCBiL3V0aWwtbGludXgvbWtmc19leHQyX3Rlc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjUzNDdjYwotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvbWtmc19leHQyX3Rlc3Quc2gKQEAgLTAsMCArMSwxMDQgQEAKKyMhL2Jpbi9zaAorCisjIERpc2FibGluZyBmZWF0dXJlcyB3ZSBkbyBub3QgbWF0Y2ggZXhhY3RseToKK3N5c3RlbV9ta2UyZnM9Jy9zYmluL21rZTJmcyAtTyBecmVzaXplX2lub2RlJworYmJveF9ta2UyZnM9Jy4vYnVzeWJveCBta2UyZnMnCisKK2dlbl9pbWFnZSgpIHsgIyBwYXJhbXM6IG1rZTJmc19pbnZvY2F0aW9uIGltYWdlX25hbWUKKyAgICA+JDIKKyAgICBkZCBzZWVrPSQoKGtpbG9ieXRlcy0xKSkgYnM9MUsgY291bnQ9MSA8L2Rldi96ZXJvIG9mPSQyID4vZGV2L251bGwgMj4mMSB8fCBleGl0IDEKKyAgICAkMSAtRiAkMiAka2lsb2J5dGVzID4kMi5yYXdfb3V0IDI+JjEgfHwgcmV0dXJuIDEKKyAgICBjYXQgJDIucmF3X291dCBcCisgICAgfCBncmVwIC12ICdebWtlMmZzIFswLTldKlwuWzAtOV0qXC5bMC05XSogJyBcCisgICAgfCBncmVwIC12ICdeTWF4aW11bSBmaWxlc3lzdGVtJyBcCisgICAgfCBncmVwIC12ICdeV3JpdGluZyBpbm9kZSB0YWJsZXMnIFwKKyAgICB8IGdyZXAgLXYgJ15Xcml0aW5nIHN1cGVyYmxvY2tzIGFuZCBmaWxlc3lzdGVtIGFjY291bnRpbmcgaW5mb3JtYXRpb24nIFwKKyAgICB8IGdyZXAgLXYgJ15UaGlzIGZpbGVzeXN0ZW0gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNoZWNrZWQgZXZlcnknIFwKKyAgICB8IGdyZXAgLXYgJ14xODAgZGF5cywgd2hpY2hldmVyIGNvbWVzIGZpcnN0JyBcCisgICAgfCBzZWQgJ3MvYmxvY2tzKiB1bnVzZWQuL2Jsb2NrcyB1bnVzZWQvJyBcCisgICAgfCBzZWQgJ3MvYmxvY2sgZ3JvdXBzKi9ibG9jayBncm91cHMvJyBcCisgICAgfCBzZWQgJ3MvICokLy8nIFwKKyAgICB8IHNlZCAncy9ibG9ja3MgKC4qJSkgcmVzZXJ2ZWQvYmxvY2tzIHJlc2VydmVkLycgXAorICAgIHwgZ3JlcCAtdiAnXiQnIFwKKyAgICA+JDIub3V0Cit9CisKK3Rlc3RfbWtlMmZzKCkgeworICAgIGVjaG8gVGVzdGluZyAka2lsb2J5dGVzCisKKyAgICBnZW5faW1hZ2UgIiRzeXN0ZW1fbWtlMmZzIiBpbWFnZV9zdGQgfHwgcmV0dXJuIDEKKyAgICBnZW5faW1hZ2UgIiRiYm94X21rZTJmcyIgICBpbWFnZV9iYiAgfHwgcmV0dXJuIDEKKworICAgIGRpZmYgLXVhIGltYWdlX2JiLm91dCBpbWFnZV9zdGQub3V0ID5pbWFnZS5vdXQuZGlmZiB8fCB7CisJY2F0IGltYWdlLm91dC5kaWZmCisJcmV0dXJuIDEKKyAgICB9CisKKyAgICBlMmZzY2sgLWYgLW4gaW1hZ2VfYmIgPmltYWdlX2JiX2UyZnNjay5vdXQgMj4mMSB8fCB7CisJZWNobyAiZTJmc2NrIGVycm9yIG9uIGltYWdlX2JiIgorCWNhdCBpbWFnZV9iYl9lMmZzY2sub3V0CisJZXhpdCAxCisgICAgfQorfQorCisjIC06YmJveCArOnN0YW5kYXJkCisKKyMga2lsb2J5dGVzPTYwIGlzIHRoZSBtaW5pbWFsIGFsbG93ZWQgc2l6ZQora2lsb2J5dGVzPTYwCit3aGlsZSB0cnVlOyBkbworICAgIHRlc3RfbWtlMmZzIHx8IGV4aXQgMQorICAgIDogJCgoa2lsb2J5dGVzKyspKQorICAgIHRlc3QgJGtpbG9ieXRlcyA9IDIwMCAmJiBicmVhaworZG9uZQorCisjIFRyYW5zaXRpb24gZnJvbSBvbmUgYmxvY2sgZ3JvdXAgdG8gdHdvCisjIGZhaWxzIGluIFs4Mzc4Li44NDEwXSByYW5nZSB1bmxlc3MgLU8gXnJlc2l6ZV9pbm9kZQora2lsb2J5dGVzPSQoKDEgKiA4KjEwMjQgLSA1MCkpCit3aGlsZSB0cnVlOyBkbworICAgIHRlc3RfbWtlMmZzIHx8IGV4aXQgMQorICAgIDogJCgoa2lsb2J5dGVzKyspKQorICAgIHRlc3QgJGtpbG9ieXRlcyA9ICQoKDEgKiA4KjEwMjQgKyAzMDApKSAmJiBicmVhaworZG9uZQorCisjIFRyYW5zaXRpb24gZnJvbSAyIGJsb2NrIGdyb3VwcyB0byAzCisjIHdvcmtzCitraWxvYnl0ZXM9JCgoMiAqIDgqMTAyNCAtIDUwKSkKK3doaWxlIHRydWU7IGRvCisgICAgdGVzdF9ta2UyZnMgfHwgZXhpdCAxCisgICAgOiAkKChraWxvYnl0ZXMrKykpCisgICAgdGVzdCAka2lsb2J5dGVzID0gJCgoMiAqIDgqMTAyNCArIDQwMCkpICYmIGJyZWFrCitkb25lCisKKyMgVHJhbnNpdGlvbiBmcm9tIDMgYmxvY2sgZ3JvdXBzIHRvIDQKKyMgZmFpbHMgaW4gWzI0ODI1Li4yNDkyMl0gcmFuZ2UgdW5sZXNzIC1PIF5yZXNpemVfaW5vZGUKK2tpbG9ieXRlcz0kKCgzICogOCoxMDI0IC0gNTApKQord2hpbGUgdHJ1ZTsgZG8KKyAgICB0ZXN0X21rZTJmcyB8fCBleGl0IDEKKyAgICA6ICQoKGtpbG9ieXRlcysrKSkKKyAgICB0ZXN0ICRraWxvYnl0ZXMgPSAkKCgzICogOCoxMDI0ICsgNTAwKSkgJiYgYnJlYWsKK2RvbmUKKworIyBUcmFuc2l0aW9uIGZyb20gNCBibG9jayBncm91cHMgdG8gNQorIyB3b3Jrcwora2lsb2J5dGVzPSQoKDQgKiA4KjEwMjQgLSA1MCkpCit3aGlsZSB0cnVlOyBkbworICAgIHRlc3RfbWtlMmZzIHx8IGV4aXQgMQorICAgIDogJCgoa2lsb2J5dGVzKyspKQorICAgIHRlc3QgJGtpbG9ieXRlcyA9ICQoKDQgKiA4KjEwMjQgKyA2MDApKSAmJiBicmVhaworZG9uZQorCisjIFRyYW5zaXRpb24gZnJvbSA1IGJsb2NrIGdyb3VwcyB0byA2CisjIGZhaWxzIGluIFs0MTIzMC4uNDEzOTFdIHJhbmdlIHVubGVzcyAtTyBecmVzaXplX2lub2RlCitraWxvYnl0ZXM9JCgoNSAqIDgqMTAyNCAtIDUwKSkKK3doaWxlIHRydWU7IGRvCisgICAgdGVzdF9ta2UyZnMgfHwgZXhpdCAxCisgICAgOiAkKChraWxvYnl0ZXMrKykpCisgICAgdGVzdCAka2lsb2J5dGVzID0gJCgoNSAqIDgqMTAyNCArIDcwMCkpICYmIGJyZWFrCitkb25lCitleGl0CisKKyMgUmFuZG9tIHNpemVzCit3aGlsZSB0cnVlOyBkbworICAgIGtpbG9ieXRlcz0kKCggKFJBTkRPTSpSQU5ET00pICUgNTAwMDAwMCArIDYwKSkKKyAgICB0ZXN0X21rZTJmcyB8fCBleGl0IDEKK2RvbmUKZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvbWtmc19taW5peC5jIGIvdXRpbC1saW51eC9ta2ZzX21pbml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkNzk3NQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvbWtmc19taW5peC5jCkBAIC0wLDAgKzEsNjkxIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBta2ZzLmMgLSBtYWtlIGEgbGludXggKG1pbml4KSBmaWxlLXN5c3RlbS4KKyAqCisgKiAoQykgMTk5MSBMaW51cyBUb3J2YWxkcy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8qCisgKiBERC5NTS5ZWQorICoKKyAqIDI0LjExLjkxICAtCVRpbWUgYmVnYW4uIFVzZWQgdGhlIGZzY2sgc291cmNlcyB0byBnZXQgc3RhcnRlZC4KKyAqCisgKiAyNS4xMS45MSAgLQlDb3JyZWN0ZWQgc29tZSBidWdzLiBBZGRlZCBzdXBwb3J0IGZvciAiLmJhZGJsb2NrcyIKKyAqCQlUaGUgYWxnb3JpdGhtIGZvciAiLmJhZGJsb2NrcyIgaXMgYSBiaXQgd2VpcmQsIGJ1dAorICoJCWl0IHNob3VsZCB3b3JrLiBPaCwgd2VsbC4KKyAqCisgKiAyNS4wMS45MiAgLQlBZGRlZCB0aGUgLWwgb3B0aW9uIGZvciBnZXR0aW5nIHRoZSBsaXN0IG9mIGJhZCBibG9ja3MKKyAqCQlvdXQgb2YgYSBuYW1lZCBmaWxlLiAoRGF2ZSBSaXZlcnMsIHJpdmVyc0Bwb25kcy51dWNwKQorICoKKyAqIDI4LjAyLjkyICAtCUFkZGVkICUtaW5mb3JtYXRpb24gd2hlbiB1c2luZyAtYy4KKyAqCisgKiAyOC4wMi45MyAgLQlBZGRlZCBzdXBwb3J0IGZvciBvdGhlciBuYW1lbGVuZ3RocyB0aGFuIHRoZSBvcmlnaW5hbAorICoJCTE0IGNoYXJhY3RlcnMgc28gdGhhdCBJIGNhbiB0ZXN0IHRoZSBuZXcga2VybmVsIHJvdXRpbmVzLi4KKyAqCisgKiAwOS4xMC45MyAgLQlNYWtlIGV4aXQgc3RhdHVzIGNvbmZvcm0gdG8gdGhhdCByZXF1aXJlZCBieSBmc3V0aWwKKyAqCQkoUmlrIEZhaXRoLCBmYWl0aEBjcy51bmMuZWR1KQorICoKKyAqIDMxLjEwLjkzICAtCUFkZGVkIGlub2RlIHJlcXVlc3QgZmVhdHVyZSwgZm9yIGJhY2t1cCBmbG9wcGllczogdXNlCisgKgkJMzIgaW5vZGVzLCBmb3IgYSBuZXdzIHBhcnRpdGlvbiB1c2UgbW9yZS4KKyAqCQkoU2NvdHQgSGVhdm5lciwgc2RoQHBvLmN3cnUuZWR1KQorICoKKyAqIDAzLjAxLjk0ICAtCUFkZGVkIHN1cHBvcnQgZm9yIGZpbGUgc3lzdGVtIHZhbGlkIGZsYWcuCisgKgkJKERyLiBXZXR0c3RlaW4sIGdyZWcld2luZC51dWNwQHBsYWlucy5ub2Rhay5lZHUpCisgKgorICogMzAuMTAuOTQgIC0gIGFkZGVkIHN1cHBvcnQgZm9yIHYyIGZpbGVzeXN0ZW0KKyAqCSAgICAgICAgKEFuZHJlYXMgU2Nod2FiLCBzY2h3YWJAaXNzYW4uaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGUpCisgKgorICogMDkuMTEuOTQgIC0JQWRkZWQgdGVzdCB0byBwcmV2ZW50IG92ZXJ3cml0ZSBvZiBtb3VudGVkIGZzIGFkYXB0ZWQKKyAqCQlmcm9tIFRoZW9kb3JlIFRzJ28ncyAodHl0c29AYXRoZW5hLm1pdC5lZHUpIG1rZTJmcworICoJCXByb2dyYW0uICAoRGFuaWVsIFF1aW5sYW4sIHF1aW5sYW5AeWdnZHJhc2lsLmNvbSkKKyAqCisgKiAwMy4yMC45NSAgLQlDbGVhciBmaXJzdCA1MTIgYnl0ZXMgb2YgZmlsZXN5c3RlbSB0byBtYWtlIGNlcnRhaW4gdGhhdAorICoJCXRoZSBmaWxlc3lzdGVtIGlzIG5vdCBtaXNpZGVudGlmaWVkIGFzIGEgTVMtRE9TIEZBVCBmaWxlc3lzdGVtLgorICoJCShEYW5pZWwgUXVpbmxhbiwgcXVpbmxhbkB5Z2dkcmFzaWwuY29tKQorICoKKyAqIDAyLjA3Ljk2ICAtICBBZGRlZCBzbWFsbCBwYXRjaCBmcm9tIFJ1c3NlbGwgS2luZyB0byBtYWtlIHRoZSBwcm9ncmFtIGEKKyAqCQlnb29kIGRlYWwgbW9yZSBwb3J0YWJsZSAoamFubEBtYXRoLnVpby5ubykKKyAqCisgKiBVc2FnZTogIG1rZnMgWy1jIHwgLWwgZmlsZW5hbWUgXSBbLXZdIFstblhYXSBbLWlYWF0gZGV2aWNlIFtzaXplLWluLWJsb2Nrc10KKyAqCisgKgktYyBmb3IgcmVhZGFiaWxpdHkgY2hlY2tpbmcgKFNMT1chKQorICogICAgICAtbCBmb3IgZ2V0dGluZyBhIGxpc3Qgb2YgYmFkIGJsb2NrcyBmcm9tIGEgZmlsZS4KKyAqCS1uIGZvciBuYW1lbGVuZ3RoIChjdXJyZW50bHkgdGhlIGtlcm5lbCBvbmx5IHVzZXMgMTQgb3IgMzApCisgKgktaSBmb3IgbnVtYmVyIG9mIGlub2RlcworICoJLXYgZm9yIHYyIGZpbGVzeXN0ZW0KKyAqCisgKiBUaGUgZGV2aWNlIG1heSBiZSBhIGJsb2NrIGRldmljZSBvciBhIGltYWdlIG9mIG9uZSwgYnV0IHRoaXMgaXNuJ3QKKyAqIGVuZm9yY2VkIChidXQgaXQncyBub3QgbXVjaCBmdW4gb24gYSBjaGFyYWN0ZXIgZGV2aWNlIDotKS4KKyAqCisgKiBNb2RpZmllZCBmb3IgQnVzeUJveCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBkZWJpYW4ub3JnPiAtLQorICoJcmVtb3ZlZCBnZXRvcHQgYmFzZWQgcGFyc2VyIGFuZCBhZGRlZCBhIGhhbmQgcm9sbGVkIG9uZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgbWtmc19taW5peF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jIHwgLWwgRklMRV0gWy1uWFhdIFstaVhYXSBCTE9DS0RFViBbS0JZVEVTXSIKKy8vdXNhZ2U6I2RlZmluZSBta2ZzX21pbml4X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTWFrZSBhIE1JTklYIGZpbGVzeXN0ZW1cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMJCUNoZWNrIGRldmljZSBmb3IgYmFkIGJsb2NrcyIKKy8vdXNhZ2U6ICAgICAiXG4JLW4gWzE0fDMwXQlNYXhpbXVtIGxlbmd0aCBvZiBmaWxlbmFtZXMiCisvL3VzYWdlOiAgICAgIlxuCS1pIElOT0RFUwlOdW1iZXIgb2YgaW5vZGVzIGZvciB0aGUgZmlsZXN5c3RlbSIKKy8vdXNhZ2U6ICAgICAiXG4JLWwgRklMRQkJUmVhZCBiYWQgYmxvY2tzIGxpc3QgZnJvbSBGSUxFIgorLy91c2FnZTogICAgICJcbgktdgkJTWFrZSB2ZXJzaW9uIDIgZmlsZXN5c3RlbSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8bW50ZW50Lmg+CisKKyNpbmNsdWRlICJtaW5peC5oIgorCisvKiBTdG9yZSB0aGUgdmVyeSBzYW1lIHRpbWVzL3VpZHMvZ2lkcyBmb3IgaW1hZ2UgY29uc2lzdGVuY3kgKi8KKyNpZiAxCisjIGRlZmluZSBDVVJfVElNRSAwCisjIGRlZmluZSBHRVRVSUQgMAorIyBkZWZpbmUgR0VUR0lEIDAKKyNlbHNlCisvKiBXYXMgdXNpbmcgdGhpcy4gSXMgaXQgdXNlZnVsPyBOQjogdGhpcyB3aWxsIGJyZWFrIHRlc3RzdWl0ZSAqLworIyBkZWZpbmUgQ1VSX1RJTUUgdGltZShOVUxMKQorIyBkZWZpbmUgR0VUVUlEIGdldHVpZCgpCisjIGRlZmluZSBHRVRHSUQgZ2V0Z2lkKCkKKyNlbmRpZgorCitlbnVtIHsKKwlNQVhfR09PRF9CTE9DS1MgICAgICAgICA9IDUxMiwKKwlURVNUX0JVRkZFUl9CTE9DS1MgICAgICA9IDE2LAorfTsKKworI2lmICFFTkFCTEVfRkVBVFVSRV9NSU5JWDIKK2VudW0geyB2ZXJzaW9uMiA9IDAgfTsKKyNlbmRpZgorCitlbnVtIHsgZGV2X2ZkID0gMyB9OworCitzdHJ1Y3QgZ2xvYmFscyB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTUlOSVgyCisJc21hbGxpbnQgdmVyc2lvbjI7CisjZGVmaW5lIHZlcnNpb24yIEcudmVyc2lvbjIKKyNlbmRpZgorCWNoYXIgKmRldmljZV9uYW1lOworCXVpbnQzMl90IHRvdGFsX2Jsb2NrczsKKwlpbnQgYmFkYmxvY2tzOworCWludCBuYW1lbGVuOworCWludCBkaXJzaXplOworCWludCBtYWdpYzsKKwljaGFyICppbm9kZV9idWZmZXI7CisJY2hhciAqaW5vZGVfbWFwOworCWNoYXIgKnpvbmVfbWFwOworCWludCB1c2VkX2dvb2RfYmxvY2tzOworCXVuc2lnbmVkIGxvbmcgcmVxX25yX2lub2RlczsKKwl1bnNpZ25lZCBjdXJyZW50bHlfdGVzdGluZzsKKworCWNoYXIgcm9vdF9ibG9ja1tCTE9DS19TSVpFXTsKKwljaGFyIHN1cGVyYmxvY2tfYnVmZmVyW0JMT0NLX1NJWkVdOworCWNoYXIgYm9vdF9ibG9ja19idWZmZXJbNTEyXTsKKwl1bnNpZ25lZCBzaG9ydCBnb29kX2Jsb2Nrc190YWJsZVtNQVhfR09PRF9CTE9DS1NdOworCS8qIGNoZWNrX2Jsb2NrcygpOiBidWZmZXJbXSB3YXMgdGhlIGJpZ2dlc3Qgc3RhdGljIGluIGVudGlyZSBiYm94ICovCisJY2hhciBjaGVja19ibG9ja3NfYnVmZmVyW0JMT0NLX1NJWkUgKiBURVNUX0JVRkZFUl9CTE9DS1NdOworCisJdW5zaWduZWQgc2hvcnQgaW5kX2Jsb2NrMVtCTE9DS19TSVpFID4+IDFdOworCXVuc2lnbmVkIHNob3J0IGRpbmRfYmxvY2sxW0JMT0NLX1NJWkUgPj4gMV07CisJdW5zaWduZWQgbG9uZyBpbmRfYmxvY2syW0JMT0NLX1NJWkUgPj4gMl07CisJdW5zaWduZWQgbG9uZyBkaW5kX2Jsb2NrMltCTE9DS19TSVpFID4+IDJdOworfTsKKyNkZWZpbmUgRyAoKnB0cl90b19nbG9iYWxzKQorI2RlZmluZSBJTklUX0coKSBkbyB7IFwKKwlTRVRfUFRSX1RPX0dMT0JBTFMoeHphbGxvYyhzaXplb2YoRykpKTsgXAorfSB3aGlsZSAoMCkKKworc3RhdGljIEFMV0FZU19JTkxJTkUgdW5zaWduZWQgZGl2X3JvdW5kdXAodW5zaWduZWQgc2l6ZSwgdW5zaWduZWQgbikKK3sKKwlyZXR1cm4gKHNpemUgKyBuLTEpIC8gbjsKK30KKworI2RlZmluZSBJTk9ERV9CVUYxICAgICAgICAgICAgICAoKChzdHJ1Y3QgbWluaXgxX2lub2RlKilHLmlub2RlX2J1ZmZlcikgLSAxKQorI2RlZmluZSBJTk9ERV9CVUYyICAgICAgICAgICAgICAoKChzdHJ1Y3QgbWluaXgyX2lub2RlKilHLmlub2RlX2J1ZmZlcikgLSAxKQorCisjZGVmaW5lIFNCICAgICAgICAgICAgICAgICAgICAgICgqKHN0cnVjdCBtaW5peF9zdXBlcmJsb2NrKilHLnN1cGVyYmxvY2tfYnVmZmVyKQorCisjZGVmaW5lIFNCX0lOT0RFUyAgICAgICAgICAgICAgIChTQi5zX25pbm9kZXMpCisjZGVmaW5lIFNCX0lNQVBTICAgICAgICAgICAgICAgIChTQi5zX2ltYXBfYmxvY2tzKQorI2RlZmluZSBTQl9aTUFQUyAgICAgICAgICAgICAgICAoU0Iuc196bWFwX2Jsb2NrcykKKyNkZWZpbmUgU0JfRklSU1RaT05FICAgICAgICAgICAgKFNCLnNfZmlyc3RkYXRhem9uZSkKKyNkZWZpbmUgU0JfWk9ORV9TSVpFICAgICAgICAgICAgKFNCLnNfbG9nX3pvbmVfc2l6ZSkKKyNkZWZpbmUgU0JfTUFYU0laRSAgICAgICAgICAgICAgKFNCLnNfbWF4X3NpemUpCisjZGVmaW5lIFNCX01BR0lDICAgICAgICAgICAgICAgIChTQi5zX21hZ2ljKQorCisjaWYgIUVOQUJMRV9GRUFUVVJFX01JTklYMgorIyBkZWZpbmUgU0JfWk9ORVMgICAgICAgICAgICAgICAoU0Iuc19uem9uZXMpCisjIGRlZmluZSBJTk9ERV9CTE9DS1MgICAgICAgICAgIGRpdl9yb3VuZHVwKFNCX0lOT0RFUywgTUlOSVgxX0lOT0RFU19QRVJfQkxPQ0spCisjZWxzZQorIyBkZWZpbmUgU0JfWk9ORVMgICAgICAgICAgICAgICAodmVyc2lvbjIgPyBTQi5zX3pvbmVzIDogU0Iuc19uem9uZXMpCisjIGRlZmluZSBJTk9ERV9CTE9DS1MgICAgICAgICAgIGRpdl9yb3VuZHVwKFNCX0lOT0RFUywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmVyc2lvbjIgPyBNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyA6IE1JTklYMV9JTk9ERVNfUEVSX0JMT0NLKSkKKyNlbmRpZgorCisjZGVmaW5lIElOT0RFX0JVRkZFUl9TSVpFICAgICAgIChJTk9ERV9CTE9DS1MgKiBCTE9DS19TSVpFKQorI2RlZmluZSBOT1JNX0ZJUlNUWk9ORSAgICAgICAgICAoMiArIFNCX0lNQVBTICsgU0JfWk1BUFMgKyBJTk9ERV9CTE9DS1MpCisKKy8qIEJlZm9yZSB5b3UgYXNrICJ3aGVyZSB0aGV5IGNvbWUgZnJvbT8iOiAqLworLyogc2V0Yml0L2NscmJpdCBhcmUgc3VwcGxpZWQgYnkgc3lzL3BhcmFtLmggKi8KKworc3RhdGljIGludCBtaW5peF9iaXQoY29uc3QgY2hhciogYSwgdW5zaWduZWQgaSkKK3sKKwlyZXR1cm4gYVtpID4+IDNdICYgKDE8PChpICYgNykpOworfQorCitzdGF0aWMgdm9pZCBtaW5peF9zZXRiaXQoY2hhciAqYSwgdW5zaWduZWQgaSkKK3sKKwlzZXRiaXQoYSwgaSk7Cit9CitzdGF0aWMgdm9pZCBtaW5peF9jbHJiaXQoY2hhciAqYSwgdW5zaWduZWQgaSkKK3sKKwljbHJiaXQoYSwgaSk7Cit9CisKKy8qIE5vdGU6IGRvIG5vdCBhc3N1bWUgMC8xLCBpdCBpcyAwL25vbnplcm8gKi8KKyNkZWZpbmUgem9uZV9pbl91c2UoeCkgIG1pbml4X2JpdChHLnpvbmVfbWFwLCh4KS1TQl9GSVJTVFpPTkUrMSkKKy8qI2RlZmluZSBpbm9kZV9pbl91c2UoeCkgbWluaXhfYml0KEcuaW5vZGVfbWFwLCh4KSkqLworCisjZGVmaW5lIG1hcmtfaW5vZGUoeCkgICBtaW5peF9zZXRiaXQoRy5pbm9kZV9tYXAsKHgpKQorI2RlZmluZSB1bm1hcmtfaW5vZGUoeCkgbWluaXhfY2xyYml0KEcuaW5vZGVfbWFwLCh4KSkKKyNkZWZpbmUgbWFya196b25lKHgpICAgIG1pbml4X3NldGJpdChHLnpvbmVfbWFwLCh4KS1TQl9GSVJTVFpPTkUrMSkKKyNkZWZpbmUgdW5tYXJrX3pvbmUoeCkgIG1pbml4X2NscmJpdChHLnpvbmVfbWFwLCh4KS1TQl9GSVJTVFpPTkUrMSkKKworI2lmbmRlZiBCTEtHRVRTSVpFCisjIGRlZmluZSBCTEtHRVRTSVpFICAgICBfSU8oMHgxMiw5NikgICAgLyogcmV0dXJuIGRldmljZSBzaXplICovCisjZW5kaWYKKworc3RhdGljIHZvaWQgd3JpdGVfdGFibGVzKHZvaWQpCit7CisJLyogTWFyayB0aGUgc3VwZXJibG9jayB2YWxpZC4gKi8KKwlTQi5zX3N0YXRlIHw9IE1JTklYX1ZBTElEX0ZTOworCVNCLnNfc3RhdGUgJj0gfk1JTklYX0VSUk9SX0ZTOworCisJbXNnX2VvbCA9ICJzZWVrIHRvIDAgZmFpbGVkIjsKKwl4bHNlZWsoZGV2X2ZkLCAwLCBTRUVLX1NFVCk7CisKKwltc2dfZW9sID0gImNhbid0IGNsZWFyIGJvb3Qgc2VjdG9yIjsKKwl4d3JpdGUoZGV2X2ZkLCBHLmJvb3RfYmxvY2tfYnVmZmVyLCA1MTIpOworCisJbXNnX2VvbCA9ICJzZWVrIHRvIEJMT0NLX1NJWkUgZmFpbGVkIjsKKwl4bHNlZWsoZGV2X2ZkLCBCTE9DS19TSVpFLCBTRUVLX1NFVCk7CisKKwltc2dfZW9sID0gImNhbid0IHdyaXRlIHN1cGVyYmxvY2siOworCXh3cml0ZShkZXZfZmQsIEcuc3VwZXJibG9ja19idWZmZXIsIEJMT0NLX1NJWkUpOworCisJbXNnX2VvbCA9ICJjYW4ndCB3cml0ZSBpbm9kZSBtYXAiOworCXh3cml0ZShkZXZfZmQsIEcuaW5vZGVfbWFwLCBTQl9JTUFQUyAqIEJMT0NLX1NJWkUpOworCisJbXNnX2VvbCA9ICJjYW4ndCB3cml0ZSB6b25lIG1hcCI7CisJeHdyaXRlKGRldl9mZCwgRy56b25lX21hcCwgU0JfWk1BUFMgKiBCTE9DS19TSVpFKTsKKworCW1zZ19lb2wgPSAiY2FuJ3Qgd3JpdGUgaW5vZGVzIjsKKwl4d3JpdGUoZGV2X2ZkLCBHLmlub2RlX2J1ZmZlciwgSU5PREVfQlVGRkVSX1NJWkUpOworCisJbXNnX2VvbCA9ICJcbiI7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2Jsb2NrKGludCBibGssIGNoYXIgKmJ1ZmZlcikKK3sKKwl4bHNlZWsoZGV2X2ZkLCBibGsgKiBCTE9DS19TSVpFLCBTRUVLX1NFVCk7CisJeHdyaXRlKGRldl9mZCwgYnVmZmVyLCBCTE9DS19TSVpFKTsKK30KKworc3RhdGljIGludCBnZXRfZnJlZV9ibG9jayh2b2lkKQoreworCWludCBibGs7CisKKwlpZiAoRy51c2VkX2dvb2RfYmxvY2tzICsgMSA+PSBNQVhfR09PRF9CTE9DS1MpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0b28gbWFueSBiYWQgYmxvY2tzIik7CisJaWYgKEcudXNlZF9nb29kX2Jsb2NrcykKKwkJYmxrID0gRy5nb29kX2Jsb2Nrc190YWJsZVtHLnVzZWRfZ29vZF9ibG9ja3MgLSAxXSArIDE7CisJZWxzZQorCQlibGsgPSBTQl9GSVJTVFpPTkU7CisJd2hpbGUgKGJsayA8IFNCX1pPTkVTICYmIHpvbmVfaW5fdXNlKGJsaykpCisJCWJsaysrOworCWlmIChibGsgPj0gU0JfWk9ORVMpCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJub3QgZW5vdWdoIGdvb2QgYmxvY2tzIik7CisJRy5nb29kX2Jsb2Nrc190YWJsZVtHLnVzZWRfZ29vZF9ibG9ja3NdID0gYmxrOworCUcudXNlZF9nb29kX2Jsb2NrcysrOworCXJldHVybiBibGs7Cit9CisKK3N0YXRpYyB2b2lkIG1hcmtfZ29vZF9ibG9ja3Modm9pZCkKK3sKKwlpbnQgYmxrOworCisJZm9yIChibGsgPSAwOyBibGsgPCBHLnVzZWRfZ29vZF9ibG9ja3M7IGJsaysrKQorCQltYXJrX3pvbmUoRy5nb29kX2Jsb2Nrc190YWJsZVtibGtdKTsKK30KKworc3RhdGljIGludCBuZXh0KGludCB6b25lKQoreworCWlmICghem9uZSkKKwkJem9uZSA9IFNCX0ZJUlNUWk9ORSAtIDE7CisJd2hpbGUgKCsrem9uZSA8IFNCX1pPTkVTKQorCQlpZiAoem9uZV9pbl91c2Uoem9uZSkpCisJCQlyZXR1cm4gem9uZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgbWFrZV9iYWRfaW5vZGUodm9pZCkKK3sKKwlzdHJ1Y3QgbWluaXgxX2lub2RlICppbm9kZSA9ICZJTk9ERV9CVUYxW01JTklYX0JBRF9JTk9dOworCWludCBpLCBqLCB6b25lOworCWludCBpbmQgPSAwLCBkaW5kID0gMDsKKwkvKiBtb3ZlZCB0byBnbG9iYWxzIHRvIHJlZHVjZSBzdGFjayB1c2FnZQorCXVuc2lnbmVkIHNob3J0IGluZF9ibG9ja1tCTE9DS19TSVpFID4+IDFdOworCXVuc2lnbmVkIHNob3J0IGRpbmRfYmxvY2tbQkxPQ0tfU0laRSA+PiAxXTsKKwkqLworI2RlZmluZSBpbmRfYmxvY2sgKEcuaW5kX2Jsb2NrMSkKKyNkZWZpbmUgZGluZF9ibG9jayAoRy5kaW5kX2Jsb2NrMSkKKworI2RlZmluZSBORVhUX0JBRCAoem9uZSA9IG5leHQoem9uZSkpCisKKwlpZiAoIUcuYmFkYmxvY2tzKQorCQlyZXR1cm47CisJbWFya19pbm9kZShNSU5JWF9CQURfSU5PKTsKKwlpbm9kZS0+aV9ubGlua3MgPSAxOworCS8qIEJUVywgc2V0dGluZyB0aGlzIG1ha2VzIGFsbCBpbWFnZXMgZGlmZmVyZW50ICovCisJLyogaXQncyBoYXJkZXIgdG8gY2hlY2sgZm9yIGJ1Z3MgdGhlbiAtIGRpZmYgaXNuJ3QgaGVscGZ1bCA6KC4uLiAqLworCWlub2RlLT5pX3RpbWUgPSBDVVJfVElNRTsKKwlpbm9kZS0+aV9tb2RlID0gU19JRlJFRyArIDAwMDA7CisJaW5vZGUtPmlfc2l6ZSA9IEcuYmFkYmxvY2tzICogQkxPQ0tfU0laRTsKKwl6b25lID0gbmV4dCgwKTsKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCWlub2RlLT5pX3pvbmVbaV0gPSB6b25lOworCQlpZiAoIU5FWFRfQkFEKQorCQkJZ290byBlbmRfYmFkOworCX0KKwlpbm9kZS0+aV96b25lWzddID0gaW5kID0gZ2V0X2ZyZWVfYmxvY2soKTsKKwltZW1zZXQoaW5kX2Jsb2NrLCAwLCBCTE9DS19TSVpFKTsKKwlmb3IgKGkgPSAwOyBpIDwgNTEyOyBpKyspIHsKKwkJaW5kX2Jsb2NrW2ldID0gem9uZTsKKwkJaWYgKCFORVhUX0JBRCkKKwkJCWdvdG8gZW5kX2JhZDsKKwl9CisJaW5vZGUtPmlfem9uZVs4XSA9IGRpbmQgPSBnZXRfZnJlZV9ibG9jaygpOworCW1lbXNldChkaW5kX2Jsb2NrLCAwLCBCTE9DS19TSVpFKTsKKwlmb3IgKGkgPSAwOyBpIDwgNTEyOyBpKyspIHsKKwkJd3JpdGVfYmxvY2soaW5kLCAoY2hhciAqKSBpbmRfYmxvY2spOworCQlkaW5kX2Jsb2NrW2ldID0gaW5kID0gZ2V0X2ZyZWVfYmxvY2soKTsKKwkJbWVtc2V0KGluZF9ibG9jaywgMCwgQkxPQ0tfU0laRSk7CisJCWZvciAoaiA9IDA7IGogPCA1MTI7IGorKykgeworCQkJaW5kX2Jsb2NrW2pdID0gem9uZTsKKwkJCWlmICghTkVYVF9CQUQpCisJCQkJZ290byBlbmRfYmFkOworCQl9CisJfQorCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ0b28gbWFueSBiYWQgYmxvY2tzIik7CisgZW5kX2JhZDoKKwlpZiAoaW5kKQorCQl3cml0ZV9ibG9jayhpbmQsIChjaGFyICopIGluZF9ibG9jayk7CisJaWYgKGRpbmQpCisJCXdyaXRlX2Jsb2NrKGRpbmQsIChjaGFyICopIGRpbmRfYmxvY2spOworI3VuZGVmIGluZF9ibG9jaworI3VuZGVmIGRpbmRfYmxvY2sKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX01JTklYMgorc3RhdGljIHZvaWQgbWFrZV9iYWRfaW5vZGUyKHZvaWQpCit7CisJc3RydWN0IG1pbml4Ml9pbm9kZSAqaW5vZGUgPSAmSU5PREVfQlVGMltNSU5JWF9CQURfSU5PXTsKKwlpbnQgaSwgaiwgem9uZTsKKwlpbnQgaW5kID0gMCwgZGluZCA9IDA7CisJLyogbW92ZWQgdG8gZ2xvYmFscyB0byByZWR1Y2Ugc3RhY2sgdXNhZ2UKKwl1bnNpZ25lZCBsb25nIGluZF9ibG9ja1tCTE9DS19TSVpFID4+IDJdOworCXVuc2lnbmVkIGxvbmcgZGluZF9ibG9ja1tCTE9DS19TSVpFID4+IDJdOworCSovCisjZGVmaW5lIGluZF9ibG9jayAoRy5pbmRfYmxvY2syKQorI2RlZmluZSBkaW5kX2Jsb2NrIChHLmRpbmRfYmxvY2syKQorCisJaWYgKCFHLmJhZGJsb2NrcykKKwkJcmV0dXJuOworCW1hcmtfaW5vZGUoTUlOSVhfQkFEX0lOTyk7CisJaW5vZGUtPmlfbmxpbmtzID0gMTsKKwlpbm9kZS0+aV9hdGltZSA9IGlub2RlLT5pX210aW1lID0gaW5vZGUtPmlfY3RpbWUgPSBDVVJfVElNRTsKKwlpbm9kZS0+aV9tb2RlID0gU19JRlJFRyArIDAwMDA7CisJaW5vZGUtPmlfc2l6ZSA9IEcuYmFkYmxvY2tzICogQkxPQ0tfU0laRTsKKwl6b25lID0gbmV4dCgwKTsKKwlmb3IgKGkgPSAwOyBpIDwgNzsgaSsrKSB7CisJCWlub2RlLT5pX3pvbmVbaV0gPSB6b25lOworCQlpZiAoIU5FWFRfQkFEKQorCQkJZ290byBlbmRfYmFkOworCX0KKwlpbm9kZS0+aV96b25lWzddID0gaW5kID0gZ2V0X2ZyZWVfYmxvY2soKTsKKwltZW1zZXQoaW5kX2Jsb2NrLCAwLCBCTE9DS19TSVpFKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJaW5kX2Jsb2NrW2ldID0gem9uZTsKKwkJaWYgKCFORVhUX0JBRCkKKwkJCWdvdG8gZW5kX2JhZDsKKwl9CisJaW5vZGUtPmlfem9uZVs4XSA9IGRpbmQgPSBnZXRfZnJlZV9ibG9jaygpOworCW1lbXNldChkaW5kX2Jsb2NrLCAwLCBCTE9DS19TSVpFKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJd3JpdGVfYmxvY2soaW5kLCAoY2hhciAqKSBpbmRfYmxvY2spOworCQlkaW5kX2Jsb2NrW2ldID0gaW5kID0gZ2V0X2ZyZWVfYmxvY2soKTsKKwkJbWVtc2V0KGluZF9ibG9jaywgMCwgQkxPQ0tfU0laRSk7CisJCWZvciAoaiA9IDA7IGogPCAyNTY7IGorKykgeworCQkJaW5kX2Jsb2NrW2pdID0gem9uZTsKKwkJCWlmICghTkVYVF9CQUQpCisJCQkJZ290byBlbmRfYmFkOworCQl9CisJfQorCS8qIENvdWxkIG1ha2UgdHJpcGxlIGluZGlyZWN0IGJsb2NrIGhlcmUgKi8KKwliYl9lcnJvcl9tc2dfYW5kX2RpZSgidG9vIG1hbnkgYmFkIGJsb2NrcyIpOworIGVuZF9iYWQ6CisJaWYgKGluZCkKKwkJd3JpdGVfYmxvY2soaW5kLCAoY2hhciAqKSBpbmRfYmxvY2spOworCWlmIChkaW5kKQorCQl3cml0ZV9ibG9jayhkaW5kLCAoY2hhciAqKSBkaW5kX2Jsb2NrKTsKKyN1bmRlZiBpbmRfYmxvY2sKKyN1bmRlZiBkaW5kX2Jsb2NrCit9CisjZWxzZQordm9pZCBtYWtlX2JhZF9pbm9kZTIodm9pZCk7CisjZW5kaWYKKworc3RhdGljIHZvaWQgbWFrZV9yb290X2lub2RlKHZvaWQpCit7CisJc3RydWN0IG1pbml4MV9pbm9kZSAqaW5vZGUgPSAmSU5PREVfQlVGMVtNSU5JWF9ST09UX0lOT107CisKKwltYXJrX2lub2RlKE1JTklYX1JPT1RfSU5PKTsKKwlpbm9kZS0+aV96b25lWzBdID0gZ2V0X2ZyZWVfYmxvY2soKTsKKwlpbm9kZS0+aV9ubGlua3MgPSAyOworCWlub2RlLT5pX3RpbWUgPSBDVVJfVElNRTsKKwlpZiAoRy5iYWRibG9ja3MpCisJCWlub2RlLT5pX3NpemUgPSAzICogRy5kaXJzaXplOworCWVsc2UgeworCQlHLnJvb3RfYmxvY2tbMiAqIEcuZGlyc2l6ZV0gPSAnXDAnOworCQlHLnJvb3RfYmxvY2tbMiAqIEcuZGlyc2l6ZSArIDFdID0gJ1wwJzsKKwkJaW5vZGUtPmlfc2l6ZSA9IDIgKiBHLmRpcnNpemU7CisJfQorCWlub2RlLT5pX21vZGUgPSBTX0lGRElSICsgMDc1NTsKKwlpbm9kZS0+aV91aWQgPSBHRVRVSUQ7CisJaWYgKGlub2RlLT5pX3VpZCkKKwkJaW5vZGUtPmlfZ2lkID0gR0VUR0lEOworCXdyaXRlX2Jsb2NrKGlub2RlLT5pX3pvbmVbMF0sIEcucm9vdF9ibG9jayk7Cit9CisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKK3N0YXRpYyB2b2lkIG1ha2Vfcm9vdF9pbm9kZTIodm9pZCkKK3sKKwlzdHJ1Y3QgbWluaXgyX2lub2RlICppbm9kZSA9ICZJTk9ERV9CVUYyW01JTklYX1JPT1RfSU5PXTsKKworCW1hcmtfaW5vZGUoTUlOSVhfUk9PVF9JTk8pOworCWlub2RlLT5pX3pvbmVbMF0gPSBnZXRfZnJlZV9ibG9jaygpOworCWlub2RlLT5pX25saW5rcyA9IDI7CisJaW5vZGUtPmlfYXRpbWUgPSBpbm9kZS0+aV9tdGltZSA9IGlub2RlLT5pX2N0aW1lID0gQ1VSX1RJTUU7CisJaWYgKEcuYmFkYmxvY2tzKQorCQlpbm9kZS0+aV9zaXplID0gMyAqIEcuZGlyc2l6ZTsKKwllbHNlIHsKKwkJRy5yb290X2Jsb2NrWzIgKiBHLmRpcnNpemVdID0gJ1wwJzsKKwkJRy5yb290X2Jsb2NrWzIgKiBHLmRpcnNpemUgKyAxXSA9ICdcMCc7CisJCWlub2RlLT5pX3NpemUgPSAyICogRy5kaXJzaXplOworCX0KKwlpbm9kZS0+aV9tb2RlID0gU19JRkRJUiArIDA3NTU7CisJaW5vZGUtPmlfdWlkID0gR0VUVUlEOworCWlmIChpbm9kZS0+aV91aWQpCisJCWlub2RlLT5pX2dpZCA9IEdFVEdJRDsKKwl3cml0ZV9ibG9jayhpbm9kZS0+aV96b25lWzBdLCBHLnJvb3RfYmxvY2spOworfQorI2Vsc2UKK3ZvaWQgbWFrZV9yb290X2lub2RlMih2b2lkKTsKKyNlbmRpZgorCisvKgorICogUGVyZm9ybSBhIHRlc3Qgb2YgYSBibG9jazsgcmV0dXJuIHRoZSBudW1iZXIgb2YKKyAqIGJsb2NrcyByZWFkYWJsZS4KKyAqLworc3RhdGljIHNpemVfdCBkb19jaGVjayhjaGFyICpidWZmZXIsIHNpemVfdCB0cnksIHVuc2lnbmVkIGN1cnJlbnRfYmxvY2spCit7CisJc3NpemVfdCBnb3Q7CisKKwkvKiBTZWVrIHRvIHRoZSBjb3JyZWN0IGxvYy4gKi8KKwltc2dfZW9sID0gInNlZWsgZmFpbGVkIGR1cmluZyB0ZXN0aW5nIG9mIGJsb2NrcyI7CisJeGxzZWVrKGRldl9mZCwgY3VycmVudF9ibG9jayAqIEJMT0NLX1NJWkUsIFNFRUtfU0VUKTsKKwltc2dfZW9sID0gIlxuIjsKKworCS8qIFRyeSB0aGUgcmVhZCAqLworCWdvdCA9IHJlYWQoZGV2X2ZkLCBidWZmZXIsIHRyeSAqIEJMT0NLX1NJWkUpOworCWlmIChnb3QgPCAwKQorCQlnb3QgPSAwOworCXRyeSA9ICgoc2l6ZV90KWdvdCkgLyBCTE9DS19TSVpFOworCisJaWYgKGdvdCAmIChCTE9DS19TSVpFIC0gMSkpCisJCWZwcmludGYoc3RkZXJyLCAiU2hvcnQgcmVhZCBhdCBibG9jayAldVxuIiwgKHVuc2lnbmVkKShjdXJyZW50X2Jsb2NrICsgdHJ5KSk7CisJcmV0dXJuIHRyeTsKK30KKworc3RhdGljIHZvaWQgYWxhcm1faW50cihpbnQgYWxudW0gVU5VU0VEX1BBUkFNKQoreworCWlmIChHLmN1cnJlbnRseV90ZXN0aW5nID49IFNCX1pPTkVTKQorCQlyZXR1cm47CisJc2lnbmFsKFNJR0FMUk0sIGFsYXJtX2ludHIpOworCWFsYXJtKDUpOworCWlmICghRy5jdXJyZW50bHlfdGVzdGluZykKKwkJcmV0dXJuOworCXByaW50ZigiJWQgLi4uIiwgRy5jdXJyZW50bHlfdGVzdGluZyk7CisJZmZsdXNoX2FsbCgpOworfQorCitzdGF0aWMgdm9pZCBjaGVja19ibG9ja3Modm9pZCkKK3sKKwlzaXplX3QgdHJ5LCBnb3Q7CisKKwlHLmN1cnJlbnRseV90ZXN0aW5nID0gMDsKKwlzaWduYWwoU0lHQUxSTSwgYWxhcm1faW50cik7CisJYWxhcm0oNSk7CisJd2hpbGUgKEcuY3VycmVudGx5X3Rlc3RpbmcgPCBTQl9aT05FUykgeworCQltc2dfZW9sID0gInNlZWsgZmFpbGVkIGluIGNoZWNrX2Jsb2NrcyI7CisJCXhsc2VlayhkZXZfZmQsIEcuY3VycmVudGx5X3Rlc3RpbmcgKiBCTE9DS19TSVpFLCBTRUVLX1NFVCk7CisJCW1zZ19lb2wgPSAiXG4iOworCQl0cnkgPSBURVNUX0JVRkZFUl9CTE9DS1M7CisJCWlmIChHLmN1cnJlbnRseV90ZXN0aW5nICsgdHJ5ID4gU0JfWk9ORVMpCisJCQl0cnkgPSBTQl9aT05FUyAtIEcuY3VycmVudGx5X3Rlc3Rpbmc7CisJCWdvdCA9IGRvX2NoZWNrKEcuY2hlY2tfYmxvY2tzX2J1ZmZlciwgdHJ5LCBHLmN1cnJlbnRseV90ZXN0aW5nKTsKKwkJRy5jdXJyZW50bHlfdGVzdGluZyArPSBnb3Q7CisJCWlmIChnb3QgPT0gdHJ5KQorCQkJY29udGludWU7CisJCWlmIChHLmN1cnJlbnRseV90ZXN0aW5nIDwgU0JfRklSU1RaT05FKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBibG9ja3MgYmVmb3JlIGRhdGEtYXJlYTogY2Fubm90IG1ha2UgZnMiKTsKKwkJbWFya196b25lKEcuY3VycmVudGx5X3Rlc3RpbmcpOworCQlHLmJhZGJsb2NrcysrOworCQlHLmN1cnJlbnRseV90ZXN0aW5nKys7CisJfQorCWFsYXJtKDApOworCXByaW50ZigiJWQgYmFkIGJsb2NrKHMpXG4iLCBHLmJhZGJsb2Nrcyk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9saXN0X2Jsb2NrcyhjaGFyICpmaWxlbmFtZSkKK3sKKwlGSUxFICpsaXN0ZmlsZTsKKwl1bnNpZ25lZCBsb25nIGJsb2Nrbm87CisKKwlsaXN0ZmlsZSA9IHhmb3Blbl9mb3JfcmVhZChmaWxlbmFtZSk7CisJd2hpbGUgKCFmZW9mKGxpc3RmaWxlKSkgeworCQlmc2NhbmYobGlzdGZpbGUsICIlbHVcbiIsICZibG9ja25vKTsKKwkJbWFya196b25lKGJsb2Nrbm8pOworCQlHLmJhZGJsb2NrcysrOworCX0KKwlwcmludGYoIiVkIGJhZCBibG9jayhzKVxuIiwgRy5iYWRibG9ja3MpOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF90YWJsZXModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGlub2RlczsKKwl1bnNpZ25lZCBub3JtX2ZpcnN0em9uZTsKKwl1bnNpZ25lZCBzYl96bWFwczsKKwl1bnNpZ25lZCBpOworCisJLyogbWVtc2V0KEcuc3VwZXJibG9ja19idWZmZXIsIDAsIEJMT0NLX1NJWkUpOyAqLworCS8qIG1lbXNldChHLmJvb3RfYmxvY2tfYnVmZmVyLCAwLCA1MTIpOyAqLworCVNCX01BR0lDID0gRy5tYWdpYzsKKwlTQl9aT05FX1NJWkUgPSAwOworCVNCX01BWFNJWkUgPSB2ZXJzaW9uMiA/IDB4N2ZmZmZmZmYgOiAoNyArIDUxMiArIDUxMiAqIDUxMikgKiAxMDI0OworCWlmICh2ZXJzaW9uMikKKwkJU0Iuc196b25lcyA9IEcudG90YWxfYmxvY2tzOworCWVsc2UKKwkJU0Iuc19uem9uZXMgPSBHLnRvdGFsX2Jsb2NrczsKKworCS8qIHNvbWUgbWFnaWMgbnJzOiAxIGlub2RlIC8gMyBibG9ja3MgKi8KKwlpZiAoRy5yZXFfbnJfaW5vZGVzID09IDApCisJCWlub2RlcyA9IEcudG90YWxfYmxvY2tzIC8gMzsKKwllbHNlCisJCWlub2RlcyA9IEcucmVxX25yX2lub2RlczsKKwkvKiBSb3VuZCB1cCBpbm9kZSBjb3VudCB0byBmaWxsIGJsb2NrIHNpemUgKi8KKwlpZiAodmVyc2lvbjIpCisJCWlub2RlcyA9IChpbm9kZXMgKyBNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyAtIDEpICYKKwkJICAgICAgICAgICAgICAgICB+KE1JTklYMl9JTk9ERVNfUEVSX0JMT0NLIC0gMSk7CisJZWxzZQorCQlpbm9kZXMgPSAoaW5vZGVzICsgTUlOSVgxX0lOT0RFU19QRVJfQkxPQ0sgLSAxKSAmCisJCSAgICAgICAgICAgICAgICAgfihNSU5JWDFfSU5PREVTX1BFUl9CTE9DSyAtIDEpOworCWlmIChpbm9kZXMgPiA2NTUzNSkKKwkJaW5vZGVzID0gNjU1MzU7CisJU0JfSU5PREVTID0gaW5vZGVzOworCVNCX0lNQVBTID0gZGl2X3JvdW5kdXAoU0JfSU5PREVTICsgMSwgQklUU19QRVJfQkxPQ0spOworCisJLyogUmVhbCBiYWQgaGFjayBidXQgb3Zlcndpc2UgbWtmcy5taW5peCBjYW4gYmUgdGhyb3duCisJICogaW4gaW5maW5pdGUgbG9vcC4uLgorCSAqIHRyeToKKwkgKiBkZCBpZj0vZGV2L3plcm8gb2Y9dGVzdC5mcyBjb3VudD0xMCBicz0xMDI0CisJICogbWtmcy5taW5peCAtaSAyMDAgdGVzdC5mcworCSAqLworCS8qIFRoaXMgY29kZSBpcyBub3QgaW5zYW5lOiBOT1JNX0ZJUlNUWk9ORSBpcyBub3QgYSBjb25zdGFudCwKKwkgKiBpdCBpcyBjYWxjdWxhdGVkIGZyb20gU0JfSU5PREVTLCBTQl9JTUFQUyBhbmQgU0JfWk1BUFMgKi8KKwlpID0gOTk5OworCVNCX1pNQVBTID0gMDsKKwlkbyB7CisJCW5vcm1fZmlyc3R6b25lID0gTk9STV9GSVJTVFpPTkU7CisJCXNiX3ptYXBzID0gZGl2X3JvdW5kdXAoRy50b3RhbF9ibG9ja3MgLSBub3JtX2ZpcnN0em9uZSArIDEsIEJJVFNfUEVSX0JMT0NLKTsKKwkJaWYgKFNCX1pNQVBTID09IHNiX3ptYXBzKSBnb3RvIGdvdF9pdDsKKwkJU0JfWk1BUFMgPSBzYl96bWFwczsKKwkJLyogbmV3IFNCX1pNQVBTLCBuZWVkIHRvIHJlY2FsYyBOT1JNX0ZJUlNUWk9ORSAqLworCX0gd2hpbGUgKC0taSk7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImluY29tcGF0aWJsZSBzaXplL2lub2RlIGNvdW50LCB0cnkgZGlmZmVyZW50IC1pIE4iKTsKKyBnb3RfaXQ6CisKKwlTQl9GSVJTVFpPTkUgPSBub3JtX2ZpcnN0em9uZTsKKwlHLmlub2RlX21hcCA9IHhtYWxsb2MoU0JfSU1BUFMgKiBCTE9DS19TSVpFKTsKKwlHLnpvbmVfbWFwID0geG1hbGxvYyhTQl9aTUFQUyAqIEJMT0NLX1NJWkUpOworCW1lbXNldChHLmlub2RlX21hcCwgMHhmZiwgU0JfSU1BUFMgKiBCTE9DS19TSVpFKTsKKwltZW1zZXQoRy56b25lX21hcCwgMHhmZiwgU0JfWk1BUFMgKiBCTE9DS19TSVpFKTsKKwlmb3IgKGkgPSBTQl9GSVJTVFpPTkU7IGkgPCBTQl9aT05FUzsgaSsrKQorCQl1bm1hcmtfem9uZShpKTsKKwlmb3IgKGkgPSBNSU5JWF9ST09UX0lOTzsgaSA8PSBTQl9JTk9ERVM7IGkrKykKKwkJdW5tYXJrX2lub2RlKGkpOworCUcuaW5vZGVfYnVmZmVyID0geHphbGxvYyhJTk9ERV9CVUZGRVJfU0laRSk7CisJcHJpbnRmKCIlbHUgaW5vZGVzXG4iLCAodW5zaWduZWQgbG9uZylTQl9JTk9ERVMpOworCXByaW50ZigiJWx1IGJsb2Nrc1xuIiwgKHVuc2lnbmVkIGxvbmcpU0JfWk9ORVMpOworCXByaW50ZigiRmlyc3RkYXRhem9uZT0lbHUgKCVsdSlcbiIsICh1bnNpZ25lZCBsb25nKVNCX0ZJUlNUWk9ORSwgKHVuc2lnbmVkIGxvbmcpbm9ybV9maXJzdHpvbmUpOworCXByaW50ZigiWm9uZXNpemU9JXVcbiIsIEJMT0NLX1NJWkUgPDwgU0JfWk9ORV9TSVpFKTsKKwlwcmludGYoIk1heHNpemU9JWx1XG4iLCAodW5zaWduZWQgbG9uZylTQl9NQVhTSVpFKTsKK30KKworaW50IG1rZnNfbWluaXhfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1rZnNfbWluaXhfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIG9wdDsKKwljaGFyICp0bXA7CisJY2hhciAqc3RyX2k7CisJY2hhciAqbGlzdGZpbGUgPSBOVUxMOworCisJSU5JVF9HKCk7CisvKiBkZWZhdWx0IChjaGFuZ2VkIHRvIDMwLCBwZXIgTGludXMncyBzdWdnZXN0aW9uLCBTdW4gTm92IDIxIDA4OjA1OjA3IDE5OTMpICovCisJRy5uYW1lbGVuID0gMzA7CisJRy5kaXJzaXplID0gMzI7CisJRy5tYWdpYyA9IE1JTklYMV9TVVBFUl9NQUdJQzI7CisKKwlpZiAoSU5PREVfU0laRTEgKiBNSU5JWDFfSU5PREVTX1BFUl9CTE9DSyAhPSBCTE9DS19TSVpFKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIGlub2RlIHNpemUiKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKKwlpZiAoSU5PREVfU0laRTIgKiBNSU5JWDJfSU5PREVTX1BFUl9CTE9DSyAhPSBCTE9DS19TSVpFKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiYmFkIGlub2RlIHNpemUiKTsKKyNlbmRpZgorCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAibisiOyAvKiAtbiBOICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImNpOmw6bjp2IiwgJnN0cl9pLCAmbGlzdGZpbGUsICZHLm5hbWVsZW4pOworCWFyZ3YgKz0gb3B0aW5kOworCS8vaWYgKG9wdCAmIDEpIC1jCisJaWYgKG9wdCAmIDIpIEcucmVxX25yX2lub2RlcyA9IHhhdG91bChzdHJfaSk7IC8vIC1pCisJLy9pZiAob3B0ICYgNCkgLWwKKwlpZiAob3B0ICYgOCkgeyAvLyAtbgorCQlpZiAoRy5uYW1lbGVuID09IDE0KSBHLm1hZ2ljID0gTUlOSVgxX1NVUEVSX01BR0lDOworCQllbHNlIGlmIChHLm5hbWVsZW4gPT0gMzApIEcubWFnaWMgPSBNSU5JWDFfU1VQRVJfTUFHSUMyOworCQllbHNlIGJiX3Nob3dfdXNhZ2UoKTsKKwkJRy5kaXJzaXplID0gRy5uYW1lbGVuICsgMjsKKwl9CisJaWYgKG9wdCAmIDB4MTApIHsgLy8gLXYKKyNpZiBFTkFCTEVfRkVBVFVSRV9NSU5JWDIKKwkJdmVyc2lvbjIgPSAxOworI2Vsc2UKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm5vdCBjb21waWxlZCB3aXRoIG1pbml4IHYyIHN1cHBvcnQiKTsKKyNlbmRpZgorCX0KKworCUcuZGV2aWNlX25hbWUgPSBhcmd2WzBdOworCWlmICghRy5kZXZpY2VfbmFtZSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJLyogQ2hlY2sgaWYgaXQgaXMgbW91bnRlZCAqLworCWlmIChmaW5kX21vdW50X3BvaW50KEcuZGV2aWNlX25hbWUsIDApKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgZm9ybWF0IG1vdW50ZWQgZmlsZXN5c3RlbSIpOworCisJeG1vdmVfZmQoeG9wZW4oRy5kZXZpY2VfbmFtZSwgT19SRFdSKSwgZGV2X2ZkKTsKKworCUcudG90YWxfYmxvY2tzID0gZ2V0X3ZvbHVtZV9zaXplX2luX2J5dGVzKGRldl9mZCwgYXJndlsxXSwgMTAyNCwgLypleHRlbmQ6Ki8gMSkgLyAxMDI0OworCisJaWYgKEcudG90YWxfYmxvY2tzIDwgMTApCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJtdXN0IGhhdmUgYXQgbGVhc3QgMTAgYmxvY2tzIik7CisKKwlpZiAodmVyc2lvbjIpIHsKKwkJRy5tYWdpYyA9IE1JTklYMl9TVVBFUl9NQUdJQzI7CisJCWlmIChHLm5hbWVsZW4gPT0gMTQpCisJCQlHLm1hZ2ljID0gTUlOSVgyX1NVUEVSX01BR0lDOworCX0gZWxzZSBpZiAoRy50b3RhbF9ibG9ja3MgPiA2NTUzNSkKKwkJRy50b3RhbF9ibG9ja3MgPSA2NTUzNTsKKyNpZiAwCisJc3RydWN0IHN0YXQgc3RhdGJ1ZjsKKwl4ZnN0YXQoZGV2X2ZkLCAmc3RhdGJ1ZiwgRy5kZXZpY2VfbmFtZSk7CisvKiB3aHk/ICovCisJaWYgKCFTX0lTQkxLKHN0YXRidWYuc3RfbW9kZSkpCisJCW9wdCAmPSB+MTsgLy8gY2xlYXIgLWMgKGNoZWNrKQorI2lmIDAKKy8qIEkgZG9uJ3Qga25vdyB3aHkgc29tZW9uZSBoYXMgc3BlY2lhbCBjb2RlIHRvIHByZXZlbnQgbWtmcy5taW5peAorICogb24gSURFIGRldmljZXMuIFdoeSBJREUgYnV0IG5vdCBTQ1NJLCBldGM/Li4uICovCisJZWxzZSBpZiAoc3RhdGJ1Zi5zdF9yZGV2ID09IDB4MDMwMCB8fCBzdGF0YnVmLnN0X3JkZXYgPT0gMHgwMzQwKQorCQkvKiB3aGF0IGlzIHRoaXM/ICovCisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJ3aWxsIG5vdCB0cnkgIgorCQkJInRvIG1ha2UgZmlsZXN5c3RlbSBvbiAnJXMnIiwgRy5kZXZpY2VfbmFtZSk7CisjZW5kaWYKKyNlbmRpZgorCXRtcCA9IEcucm9vdF9ibG9jazsKKwkqKHNob3J0ICopIHRtcCA9IDE7CisJc3RyY3B5KHRtcCArIDIsICIuIik7CisJdG1wICs9IEcuZGlyc2l6ZTsKKwkqKHNob3J0ICopIHRtcCA9IDE7CisJc3RyY3B5KHRtcCArIDIsICIuLiIpOworCXRtcCArPSBHLmRpcnNpemU7CisJKihzaG9ydCAqKSB0bXAgPSAyOworCXN0cmNweSh0bXAgKyAyLCAiLmJhZGJsb2NrcyIpOworCisJc2V0dXBfdGFibGVzKCk7CisKKwlpZiAob3B0ICYgMSkgLy8gLWMgPworCQljaGVja19ibG9ja3MoKTsKKwllbHNlIGlmIChsaXN0ZmlsZSkKKwkJZ2V0X2xpc3RfYmxvY2tzKGxpc3RmaWxlKTsKKworCWlmICh2ZXJzaW9uMikgeworCQltYWtlX3Jvb3RfaW5vZGUyKCk7CisJCW1ha2VfYmFkX2lub2RlMigpOworCX0gZWxzZSB7CisJCW1ha2Vfcm9vdF9pbm9kZSgpOworCQltYWtlX2JhZF9pbm9kZSgpOworCX0KKworCW1hcmtfZ29vZF9ibG9ja3MoKTsKKwl3cml0ZV90YWJsZXMoKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvbWtmc19yZWlzZXIuYyBiL3V0aWwtbGludXgvbWtmc19yZWlzZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmM4ZjBhCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9ta2ZzX3JlaXNlci5jCkBAIC0wLDAgKzEsMzc1IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBta2ZzX3JlaXNlcjogdXRpbGl0eSB0byBjcmVhdGUgUmVpc2VyRlMgZmlsZXN5c3RlbQorICoKKyAqIEJ1c3lib3gnZWQgKDIwMDkpIGJ5IFZsYWRpbWlyIERyb25uaWtvdiA8ZHJvbm5pa292QGdtYWlsLmNvbT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBta2ZzX3JlaXNlcl90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1mXSBbLWwgTEFCRUxdIEJMT0NLREVWIFs0Sy1CTE9DS1NdIgorLy91c2FnZTojZGVmaW5lIG1rZnNfcmVpc2VyX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiTWFrZSBhIFJlaXNlckZTIFYzIGZpbGVzeXN0ZW1cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWYJRm9yY2UiCisvL3VzYWdlOiAgICAgIlxuCS1sIExCTAlWb2x1bWUgbGFiZWwiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKK2NoYXIgQlVHX3dyb25nX2ZpZWxkX3NpemUodm9pZCk7CisjZGVmaW5lIFNUT1JFX0xFKGZpZWxkLCB2YWx1ZSkgXAorZG8geyBcCisJaWYgKHNpemVvZihmaWVsZCkgPT0gNCkgXAorCQlmaWVsZCA9IFNXQVBfTEUzMih2YWx1ZSk7IFwKKwllbHNlIGlmIChzaXplb2YoZmllbGQpID09IDIpIFwKKwkJZmllbGQgPSBTV0FQX0xFMTYodmFsdWUpOyBcCisJZWxzZSBpZiAoc2l6ZW9mKGZpZWxkKSA9PSAxKSBcCisJCWZpZWxkID0gKHZhbHVlKTsgXAorCWVsc2UgXAorCQlCVUdfd3JvbmdfZmllbGRfc2l6ZSgpOyBcCit9IHdoaWxlICgwKQorCisjZGVmaW5lIEZFVENIX0xFMzIoZmllbGQpIFwKKwkoc2l6ZW9mKGZpZWxkKSA9PSA0ID8gU1dBUF9MRTMyKGZpZWxkKSA6IEJVR193cm9uZ19maWVsZF9zaXplKCkpCisKK3N0cnVjdCBqb3VybmFsX3BhcmFtcyB7CisJdWludDMyX3QganBfam91cm5hbF8xc3RfYmxvY2s7ICAgICAgLyogd2hlcmUgZG9lcyBqb3VybmFsIHN0YXJ0IGZyb20gb24gaXRzIGRldmljZSAqLworCXVpbnQzMl90IGpwX2pvdXJuYWxfZGV2OyAgICAgICAgICAgIC8qIGpvdXJuYWwgZGV2aWNlIHN0X3JkZXYgKi8KKwl1aW50MzJfdCBqcF9qb3VybmFsX3NpemU7ICAgICAgICAgICAvKiBzaXplIG9mIHRoZSBqb3VybmFsIG9uIEZTIGNyZWF0aW9uLiB1c2VkIHRvIG1ha2Ugc3VyZSB0aGV5IGRvbid0IG92ZXJmbG93IGl0ICovCisJdWludDMyX3QganBfam91cm5hbF90cmFuc19tYXg7ICAgICAgLyogbWF4IG51bWJlciBvZiBibG9ja3MgaW4gYSB0cmFuc2FjdGlvbi4gICovCisJdWludDMyX3QganBfam91cm5hbF9tYWdpYzsgICAgICAgICAgLyogcmFuZG9tIHZhbHVlIG1hZGUgb24gZnMgY3JlYXRpb24gKHRoaXMgd2FzIHNiX2pvdXJuYWxfYmxvY2tfY291bnQpICovCisJdWludDMyX3QganBfam91cm5hbF9tYXhfYmF0Y2g7ICAgICAgLyogbWF4IG51bWJlciBvZiBibG9ja3MgdG8gYmF0Y2ggaW50byBhIHRyYW5zICovCisJdWludDMyX3QganBfam91cm5hbF9tYXhfY29tbWl0X2FnZTsgLyogaW4gc2Vjb25kcywgaG93IG9sZCBjYW4gYW4gYXN5bmMgY29tbWl0IGJlICovCisJdWludDMyX3QganBfam91cm5hbF9tYXhfdHJhbnNfYWdlOyAgLyogaW4gc2Vjb25kcywgaG93IG9sZCBjYW4gYSB0cmFuc2FjdGlvbiBiZSAqLworfTsKKworc3RydWN0IHJlaXNlcmZzX2pvdXJuYWxfaGVhZGVyIHsKKwl1aW50MzJfdCBqaF9sYXN0X2ZsdXNoX3RyYW5zX2lkOyAgICAvKiBpZCBvZiBsYXN0IGZ1bGx5IGZsdXNoZWQgdHJhbnNhY3Rpb24gKi8KKwl1aW50MzJfdCBqaF9maXJzdF91bmZsdXNoZWRfb2Zmc2V0OyAvKiBvZmZzZXQgaW4gdGhlIGxvZyBvZiB3aGVyZSB0byBzdGFydCByZXBsYXkgYWZ0ZXIgYSBjcmFzaCAqLworCXVpbnQzMl90IGpoX21vdW50X2lkOworCXN0cnVjdCBqb3VybmFsX3BhcmFtcyBqaF9qb3VybmFsOworCXVpbnQzMl90IGpoX2xhc3RfY2hlY2tfbW91bnRfaWQ7ICAgIC8qIHRoZSBtb3VudCBpZCBvZiB0aGUgZnMgZHVyaW5nIHRoZSBsYXN0IHJlaXNlcmZzY2sgLS1jaGVjay4gKi8KK307CisKK3N0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayB7CisJdWludDMyX3Qgc2JfYmxvY2tfY291bnQ7ICAgICAgICAgICAgLyogMCBudW1iZXIgb2YgYmxvY2sgb24gZGF0YSBkZXZpY2UgKi8KKwl1aW50MzJfdCBzYl9mcmVlX2Jsb2NrczsgICAgICAgICAgICAvKiA0IGZyZWUgYmxvY2tzIGNvdW50ICovCisJdWludDMyX3Qgc2Jfcm9vdF9ibG9jazsgICAgICAgICAgICAgLyogOCByb290IG9mIHRoZSB0cmVlICovCisKKwlzdHJ1Y3Qgam91cm5hbF9wYXJhbXMgc2Jfam91cm5hbDsgICAvKiAxMiAqLworCisJdWludDE2X3Qgc2JfYmxvY2tzaXplOyAgICAgICAgICAvKiA0NCAqLworCXVpbnQxNl90IHNiX29pZF9tYXhzaXplOyAgICAgICAgLyogNDYgbWF4IHNpemUgb2Ygb2JqZWN0IGlkIGFycmF5LCBzZWUgZ2V0X29iamVjdGlkKCkgY29tbWVudGFyeSAqLworCXVpbnQxNl90IHNiX29pZF9jdXJzaXplOyAgICAgICAgLyogNDggY3VycmVudCBzaXplIG9mIG9iamVjdCBpZCBhcnJheSAqLworCXVpbnQxNl90IHNiX3Vtb3VudF9zdGF0ZTsgICAgICAgLyogNTAgdGhpcyBpcyBzZXQgdG8gMSB3aGVuIGZpbGVzeXN0ZW0gd2FzIHVtb3VudGVkLCB0byAyIC0gd2hlbiBub3QgKi8KKworCWNoYXIgc19tYWdpY1sxMF07ICAgICAgICAgICAgICAgLyogNTIgIlJlSXNFckZzIiBvciAiUmVJc0VyMkZzIiBvciAiUmVJc0VyM0ZzIiAqLworCXVpbnQxNl90IHNiX2ZzX3N0YXRlOyAgICAgICAgICAgLyogNjIgaXQgaXMgc2V0IHRvIHVzZWQgYnkgZnNjayB0byBtYXJrIHdoaWNoIHBoYXNlIG9mIHJlYnVpbGRpbmcgaXMgZG9uZSAodXNlZCBmb3IgZnNjayBkZWJ1Z2dpbmcpICovCisJdWludDMyX3Qgc2JfaGFzaF9mdW5jdGlvbl9jb2RlOyAvKiA2NCBjb2RlIG9mIGZ1bmN0aW9uIHdoaWNoIHdhcy9pcy93aWxsIGJlIHVzZWQgdG8gc29ydCBuYW1lcyBpbiBhIGRpcmVjdG9yeS4gU2VlIGNvZGVzIGluIGFib3ZlICovCisJdWludDE2X3Qgc2JfdHJlZV9oZWlnaHQ7ICAgICAgICAvKiA2OCBoZWlnaHQgb2YgZmlsZXN5dGVtIHRyZWUuIFRyZWUgY29uc2lzdGluZyBvZiBvbmx5IG9uZSByb290IGJsb2NrIGhhcyAyIGhlcmUgKi8KKwl1aW50MTZfdCBzYl9ibWFwX25yOyAgICAgICAgICAgIC8qIDcwIGFtb3VudCBvZiBiaXRtYXAgYmxvY2tzIG5lZWRlZCB0byBhZGRyZXNzIGVhY2ggYmxvY2sgb2YgZmlsZSBzeXN0ZW0gKi8KKwl1aW50MTZfdCBzYl92ZXJzaW9uOyAgICAgICAgICAgIC8qIDcyIHRoaXMgZmllbGQgaXMgb25seSByZWxpYWJsZSBvbiBmaWxlc3lzdGVtIHdpdGggbm9uLXN0YW5kYXJkIGpvdXJuYWwgKi8KKwl1aW50MTZfdCBzYl9yZXNlcnZlZF9mb3Jfam91cm5hbDsgIC8qIDc0IHNpemUgaW4gYmxvY2tzIG9mIGpvdXJuYWwgYXJlYSBvbiBtYWluIGRldmljZSwgd2UgbmVlZCB0byBrZWVwIGFmdGVyIG5vbi1zdGFuZGFyZCBqb3VybmFsIHJlbG9jYXRpb24gKi8KKwl1aW50MzJfdCBzYl9pbm9kZV9nZW5lcmF0aW9uOyAgIC8qIDc2ICovCisJdWludDMyX3Qgc2JfZmxhZ3M7ICAgICAgICAgICAgICAvKiA4MCBSaWdodCBub3cgdXNlZCBvbmx5IGJ5IGlub2RlLWF0dHJpYnV0ZXMsIGlmIGVuYWJsZWQgKi8KKwl1bnNpZ25lZCBjaGFyIHNfdXVpZFsxNl07ICAgICAgIC8qIDg0IGZpbGVzeXN0ZW0gdW5pcXVlIGlkZW50aWZpZXIgKi8KKwl1bnNpZ25lZCBjaGFyIHNfbGFiZWxbMTZdOyAgICAgIC8qIDEwMCBmaWxlc3lzdGVtIHZvbHVtZSBsYWJlbCAqLworCXVpbnQxNl90IHNiX21udF9jb3VudDsgICAgICAgICAgLyogMTE2ICovCisJdWludDE2X3Qgc2JfbWF4X21udF9jb3VudDsgICAgICAvKiAxMTggKi8KKwl1aW50MzJfdCBzYl9sYXN0Y2hlY2s7ICAgICAgICAgIC8qIDEyMCAqLworCXVpbnQzMl90IHNiX2NoZWNrX2ludGVydmFsOyAgICAgLyogMTI0ICovCisvKiB6ZXJvIGZpbGxlZCBieSBta3JlaXNlcmZzIGFuZCByZWlzZXJmc19jb252ZXJ0X29iamVjdGlkX21hcF92MSgpIHNvIGFueSBhZGRpdGlvbnMgbXVzdCBiZSB1cGRhdGVkIHRoZXJlIGFzIHdlbGwuICovCisJY2hhciBzX3VudXNlZFs3Nl07ICAgICAgICAgICAgICAvKiAxMjggKi8KKwkvKiAyMDQgKi8KK307CisKKy8qIEhlYWRlciBvZiBhIGRpc2sgYmxvY2suICBNb3JlIHByZWNpc2VseSwgaGVhZGVyIG9mIGEgZm9ybWF0dGVkIGxlYWYKKyAgIG9yIGludGVybmFsIG5vZGUsIGFuZCBub3QgdGhlIGhlYWRlciBvZiBhbiB1bmZvcm1hdHRlZCBub2RlLiAqLworc3RydWN0IGJsb2NrX2hlYWQgeworCXVpbnQxNl90IGJsazJfbGV2ZWw7ICAgICAgICAvKiBMZXZlbCBvZiBhIGJsb2NrIGluIHRoZSB0cmVlLiAqLworCXVpbnQxNl90IGJsazJfbnJfaXRlbTsgICAgICAvKiBOdW1iZXIgb2Yga2V5cy9pdGVtcyBpbiBhIGJsb2NrLiAqLworCXVpbnQxNl90IGJsazJfZnJlZV9zcGFjZTsgICAvKiBCbG9jayBmcmVlIHNwYWNlIGluIGJ5dGVzLiAqLworCXVpbnQxNl90IGJsa19yZXNlcnZlZDsKKwl1aW50MzJfdCByZXNlcnZlZFs0XTsKK307CisKKyNkZWZpbmUgUkVJU0VSRlNfRElTS19PRkZTRVRfSU5fQllURVMgKDY0ICogMTAyNCkKKworI2RlZmluZSBSRUlTRVJGU18zXzZfU1VQRVJfTUFHSUNfU1RSSU5HICJSZUlzRXIyRnMiCisjZGVmaW5lIFJFSVNFUkZTX0ZPUk1BVF8zXzYgICAgIDIKKyNkZWZpbmUgREVGQVVMVF9NQVhfTU5UX0NPVU5UICAgMzAgICAgICAgICAgICAgICAgICAgICAgLyogMzAgbW91bnRzICovCisjZGVmaW5lIERFRkFVTFRfQ0hFQ0tfSU5URVJWQUwgICgxODAgKiA2MCAqIDYwICogMjQpICAgIC8qIDE4MCBkYXlzICovCisKKyNkZWZpbmUgRlNfQ0xFQU5MWV9VTU9VTlRFRCAgICAgMSAvKiB0aGlzIHdhcyBSRUlTRVJGU19WQUxJRF9GUyAqLworCisjZGVmaW5lIEpPVVJOQUxfTUlOX1NJWkUgICAgICAgIDUxMgorLyogYmlnZ2VzdCBwb3NzaWJsZSBzaW5nbGUgdHJhbnNhY3Rpb24sIGRvbid0IGNoYW5nZSBmb3Igbm93ICg4LzMvOTkpICovCisjZGVmaW5lIEpPVVJOQUxfVFJBTlNfTUFYICAgICAgIDEwMjQKKyNkZWZpbmUgSk9VUk5BTF9UUkFOU19NSU4gICAgICAgMjU2ICAgICAvKiBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgaXQgd29ya3MgKi8KKyNkZWZpbmUgSk9VUk5BTF9ERUZBVUxUX1JBVElPICAgOCAgICAgICAvKiBkZWZhdWx0IGpvdXJuYWwgc2l6ZSAvIG1heCB0cmFucyBsZW5ndGggKi8KKyNkZWZpbmUgSk9VUk5BTF9NSU5fUkFUSU8gICAgICAgMgorLyogbWF4IGJsb2NrcyB0byBiYXRjaCBpbnRvIG9uZSB0cmFuc2FjdGlvbiwgZG9uJ3QgbWFrZSB0aGlzIGFueSBiaWdnZXIgdGhhbiA5MDAgKi8KKyNkZWZpbmUgSk9VUk5BTF9NQVhfQkFUQ0ggICAgICAgOTAwCisjZGVmaW5lIEpPVVJOQUxfTUFYX0NPTU1JVF9BR0UgIDMwCisKKworLy8gU3RhbmRhcmQgbWtyZWlzZXJmcyAzLjYuMjE6CisvLyAgIC1iIHwgLS1ibG9jay1zaXplIE4gICAgICAgICAgICAgIHNpemUgb2YgZmlsZS1zeXN0ZW0gYmxvY2ssIGluIGJ5dGVzCisvLyAgIC1qIHwgLS1qb3VybmFsLWRldmljZSBGSUxFICAgICAgIHBhdGggdG8gc2VwYXJhdGUgZGV2aWNlIHRvIGhvbGQgam91cm5hbAorLy8gICAtcyB8IC0tam91cm5hbC1zaXplIE4gICAgICAgICAgICBzaXplIG9mIHRoZSBqb3VybmFsIGluIGJsb2NrcworLy8gICAtbyB8IC0tam91cm5hbC1vZmZzZXQgTiAgICAgICAgICBvZmZzZXQgb2YgdGhlIGpvdXJuYWwgZnJvbSB0aGUgc3RhcnQgb2YKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNlcGFyYXRlIGRldmljZSwgaW4gYmxvY2tzCisvLyAgIC10IHwgLS10cmFuc2FjdGlvbi1tYXgtc2l6ZSBOICAgIG1heGltYWwgc2l6ZSBvZiB0cmFuc2FjdGlvbiwgaW4gYmxvY2tzCisvLyAgIC1CIHwgLS1iYWRibG9ja3MgZmlsZSAgICAgICAgICAgIHN0b3JlIGFsbCBiYWQgYmxvY2tzIGdpdmVuIGluIGZpbGUgb24gdGhlIGZzCisvLyAgIC1oIHwgLS1oYXNoIHJ1cGFzb3Z8dGVhfHI1ICAgICAgIGhhc2ggZnVuY3Rpb24gdG8gdXNlIGJ5IGRlZmF1bHQKKy8vICAgLXUgfCAtLXV1aWQgVVVJRCAgICAgICAgICAgICAgICAgc3RvcmUgVVVJRCBpbiB0aGUgc3VwZXJibG9jaworLy8gICAtbCB8IC0tbGFiZWwgTEFCRUwgICAgICAgICAgICAgICBzdG9yZSBMQUJFTCBpbiB0aGUgc3VwZXJibG9jaworLy8gICAtLWZvcm1hdCAzLjV8My42ICAgICAgICAgICAgICAgICBvbGQgMy41IGZvcm1hdCBvciBuZXdlciAzLjYKKy8vICAgLWYgfCAtLWZvcmNlICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIG9uY2UsIG1ha2UgbWtyZWlzZXJmcyB0aGUgd2hvbGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzaywgbm90IGJsb2NrIGRldmljZSBvciBtb3VudGVkIHBhcnRpdGlvbjsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIHR3aWNlLCBkbyBub3QgYXNrIGZvciBjb25maXJtYXRpb24KKy8vICAgLXEgfCAtLXF1aWV0ICAgICAgICAgICAgICAgICAgICAgcXVpZXQgd29yayB3aXRob3V0IG1lc3NhZ2VzLCBwcm9ncmVzcyBhbmQKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlc3Rpb25zLiBVc2VmdWwgaWYgcnVuIGluIGEgc2NyaXB0LiBGb3IgdXNlCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IGVuZCB1c2VycyBvbmx5LgorLy8gICAtZCB8IC0tZGVidWcgICAgICAgICAgICAgICAgICAgICBwcmludCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZHVyaW5nIG1rcmVpc2VyCisvLyAgIC1WICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50IHZlcnNpb24gYW5kIGV4aXQKKworLy8gT3B0aW9ucyBub3QgY29tbWVudGVkIGJlbG93IGFyZSB0YWtlbiBidXQgc2lsZW50bHkgaWdub3JlZDoKK2VudW0geworCU9QVF9iID0gMSA8PCAwLAorCU9QVF9qID0gMSA8PCAxLAorCU9QVF9zID0gMSA8PCAyLAorCU9QVF9vID0gMSA8PCAzLAorCU9QVF90ID0gMSA8PCA0LAorCU9QVF9CID0gMSA8PCA1LAorCU9QVF9oID0gMSA8PCA2LAorCU9QVF91ID0gMSA8PCA3LAorCU9QVF9sID0gMSA8PCA4LAkJLy8gbGFiZWwKKwlPUFRfZiA9IDEgPDwgOSwJCS8vIGFzayBubyBxdWVzdGlvbnMKKwlPUFRfcSA9IDEgPDwgMTAsCisJT1BUX2QgPSAxIDw8IDExLAorCS8vT1BUX1YgPSAxIDw8IDEyLAkvLyAtViB2ZXJzaW9uLiBiYm94IGFwcGxldHMgZG9uJ3Qgc3VwcG9ydCB0aGF0Cit9OworCitpbnQgbWtmc19yZWlzZXJfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1rZnNfcmVpc2VyX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl1bnNpZ25lZCBibG9ja3NpemUgPSA0MDk2OworCXVuc2lnbmVkIGpvdXJuYWxfYmxvY2tzID0gODE5MjsKKwl1bnNpZ25lZCBibG9ja3MsIGJpdG1hcF9ibG9ja3MsIGksIGJsb2NrOworCXRpbWVfdCB0aW1lc3RhbXA7CisJY29uc3QgY2hhciAqbGFiZWwgPSAiIjsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlpbnQgZmQ7CisJdWludDhfdCAqYnVmOworCXN0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGpvdXJuYWxfcGFyYW1zICpqcDsKKwlzdHJ1Y3QgYmxvY2tfaGVhZCAqcm9vdDsKKworCS8vIHVzaW5nIGdsb2JhbCAib3B0aW9uX21hc2szMiIgaW5zdGVhZCBvZiBsb2NhbCAib3B0cyI6CisJLy8gd2UgYXJlIHJlZ2lzdGVyIHN0YXJ2ZWQgaGVyZQorCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xOmIrIjsKKwkvKm9wdHMgPSovIGdldG9wdDMyKGFyZ3YsICJiOmo6czpvOnQ6QjpoOnU6bDpmcWQiLAorCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCAmbGFiZWwpOworCWFyZ3YgKz0gb3B0aW5kOyAvLyBhcmd2WzBdIC0tIGRldmljZQorCisJLy8gY2hlY2sgdGhlIGRldmljZSBpcyBhIGJsb2NrIGRldmljZQorCWZkID0geG9wZW4oYXJndlswXSwgT19XUk9OTFkgfCBPX0VYQ0wpOworCXhmc3RhdChmZCwgJnN0LCBhcmd2WzBdKTsKKwlpZiAoIVNfSVNCTEsoc3Quc3RfbW9kZSkgJiYgIShvcHRpb25fbWFzazMyICYgT1BUX2YpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXM6IG5vdCBhIGJsb2NrIGRldmljZSIsIGFyZ3ZbMF0pOworCisJLy8gY2hlY2sgaWYgaXQgaXMgbW91bnRlZAorCS8vIE4uQi4gd2hhdCBpZiB3ZSBmb3JtYXQgYSBmaWxlPyBmaW5kX21vdW50X3BvaW50IHdpbGwgcmV0dXJuIGZhbHNlIG5lZ2F0aXZlIHNpbmNlCisJLy8gaXQgaXMgbG9vcCBibG9jayBkZXZpY2Ugd2hpY2ggaXMgbW91bnRlZCEKKwlpZiAoZmluZF9tb3VudF9wb2ludChhcmd2WzBdLCAwKSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGZvcm1hdCBtb3VudGVkIGZpbGVzeXN0ZW0iKTsKKworCS8vIG9wZW4gdGhlIGRldmljZSwgZ2V0IHNpemUgaW4gYmxvY2tzCisJYmxvY2tzID0gZ2V0X3ZvbHVtZV9zaXplX2luX2J5dGVzKGZkLCBhcmd2WzFdLCBibG9ja3NpemUsIC8qZXh0ZW5kOiovIDEpIC8gYmxvY2tzaXplOworCisJLy8gYmxvY2sgbnVtYmVyIHNhbml0eSBjaGVjaworCS8vIHdlIGhhdmUgYSBsaW1pdDogc2tpcHBlZCBhcmVhLCBzdXBlciBibG9jaywgam91cm5hbCBhbmQgcm9vdCBibG9jaworCS8vIGFsbCBoYXZlIHRvIGJlIGFkZHJlc3NlZCBieSBvbmUgZmlyc3QgYml0bWFwCisJYmxvY2sgPSBSRUlTRVJGU19ESVNLX09GRlNFVF9JTl9CWVRFUyAvIGJsb2Nrc2l6ZSAvLyBib290IGFyZWEKKwkJKyAxCQkvLyBzYgorCQkrIDEJCS8vIGJpdG1hcCMwCisJCSsgam91cm5hbF9ibG9ja3MrMQkvLyBqb3VybmFsCisJOworCisJLy8gY291bnQgb3ZlcmhlYWQKKwliaXRtYXBfYmxvY2tzID0gKGJsb2NrcyAtIDEpIC8gKGJsb2Nrc2l6ZSAqIDgpICsgMTsKKwlpID0gYmxvY2sgKyBiaXRtYXBfYmxvY2tzOworCisJLy8gY2hlY2sgb3ZlcmhlYWQKKwlpZiAoTUlOKGJsb2Nrc2l6ZSAqIDgsIGJsb2NrcykgPCBpKQorCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgibmVlZCA+PSAldSBibG9ja3MiLCBpKTsKKworCS8vIGFzayBjb25maXJtYXRpb24/CisJLy8gVE9ETzogPz8/CisKKwkvLyB3aXBlIG91dCBmaXJzdCBSRUlTRVJGU19ESVNLX09GRlNFVF9JTl9CWVRFUyBvZiBkZXZpY2UKKwkvLyBUT0RPOiBkbyB3ZSByZWFsbHkgbmVlZCB0byB3aXBlPyEKKwl4bHNlZWsoZmQsIFJFSVNFUkZTX0RJU0tfT0ZGU0VUX0lOX0JZVEVTLCBTRUVLX1NFVCk7CisKKwkvLyBmaWxsIHN1cGVyYmxvY2sKKwlzYiA9IChzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKil4emFsbG9jKGJsb2Nrc2l6ZSk7CisJLy8gYmxvY2sgY291bnQKKwlTVE9SRV9MRShzYi0+c2JfYmxvY2tfY291bnQsIGJsb2Nrcyk7CisJU1RPUkVfTEUoc2ItPnNiX2ZyZWVfYmxvY2tzLCBibG9ja3MgLSBpKTsKKwkvLyBUT0RPOiBkZWN5cGhlciEKKwlTVE9SRV9MRShzYi0+c2Jfcm9vdF9ibG9jaywgYmxvY2spOworCS8vIGZpbGwgam91cm5hbCByZWxhdGVkIGZpZWxkcworCWpwID0gJnNiLT5zYl9qb3VybmFsOworCVNUT1JFX0xFKGpwLT5qcF9qb3VybmFsXzFzdF9ibG9jaywgUkVJU0VSRlNfRElTS19PRkZTRVRfSU5fQllURVMgLyBibG9ja3NpemUgKyAxLypzYiovICsgMS8qYm1wIzAqLyk7CisJdGltZXN0YW1wID0gdGltZShOVUxMKTsKKwlzcmFuZCh0aW1lc3RhbXApOworCVNUT1JFX0xFKGpwLT5qcF9qb3VybmFsX21hZ2ljLCByYW5kKCkpOworCVNUT1JFX0xFKGpwLT5qcF9qb3VybmFsX3NpemUsIGpvdXJuYWxfYmxvY2tzKTsKKwlTVE9SRV9MRShqcC0+anBfam91cm5hbF90cmFuc19tYXgsIEpPVVJOQUxfVFJBTlNfTUFYKTsKKwlTVE9SRV9MRShqcC0+anBfam91cm5hbF9tYXhfYmF0Y2gsIEpPVVJOQUxfTUFYX0JBVENIKTsKKwlTVE9SRV9MRShqcC0+anBfam91cm5hbF9tYXhfY29tbWl0X2FnZSwgSk9VUk5BTF9NQVhfQ09NTUlUX0FHRSk7CisJLy8gc2l6ZXMKKwlTVE9SRV9MRShzYi0+c2JfYmxvY2tzaXplLCBibG9ja3NpemUpOworCVNUT1JFX0xFKHNiLT5zYl9vaWRfbWF4c2l6ZSwgKGJsb2Nrc2l6ZSAtIHNpemVvZigqc2IpKSAvIHNpemVvZih1aW50MzJfdCkgLyAyICogMik7CisJU1RPUkVfTEUoc2ItPnNiX29pZF9jdXJzaXplLCAyKTsgLy8gIi4iIGFuZCAiLi4iCisJc3RyY3B5KHNiLT5zX21hZ2ljLCBSRUlTRVJGU18zXzZfU1VQRVJfTUFHSUNfU1RSSU5HKTsKKwlTVE9SRV9MRShzYi0+c2JfYm1hcF9uciwgKGJpdG1hcF9ibG9ja3MgPiAoKDFMTCA8PCAxNikgLSAxKSkgPyAwIDogYml0bWFwX2Jsb2Nrcyk7CisJLy8gbWlzYworCVNUT1JFX0xFKHNiLT5zYl92ZXJzaW9uLCBSRUlTRVJGU19GT1JNQVRfM182KTsKKwlTVE9SRV9MRShzYi0+c2JfbGFzdGNoZWNrLCB0aW1lc3RhbXApOworCVNUT1JFX0xFKHNiLT5zYl9jaGVja19pbnRlcnZhbCwgREVGQVVMVF9DSEVDS19JTlRFUlZBTCk7CisJU1RPUkVfTEUoc2ItPnNiX21udF9jb3VudCwgMSk7CisJU1RPUkVfTEUoc2ItPnNiX21heF9tbnRfY291bnQsIERFRkFVTFRfTUFYX01OVF9DT1VOVCk7CisJU1RPUkVfTEUoc2ItPnNiX3Vtb3VudF9zdGF0ZSwgRlNfQ0xFQU5MWV9VTU9VTlRFRCk7CisJU1RPUkVfTEUoc2ItPnNiX3RyZWVfaGVpZ2h0LCAyKTsKKwlTVE9SRV9MRShzYi0+c2JfaGFzaF9mdW5jdGlvbl9jb2RlLCAzKTsgLy8gUjVfSEFTSAorCVNUT1JFX0xFKHNiLT5zYl9mbGFncywgMSk7CisJLy9TVE9SRV9MRShzYi0+c2JfcmVzZXJ2ZWRfZm9yX2pvdXJuYWwsIDApOworCS8vIGNyZWF0ZSBVVUlECisJZ2VuZXJhdGVfdXVpZChzYi0+c191dWlkKTsKKwkvLyB3cml0ZSB0aGUgbGFiZWwKKwlzYWZlX3N0cm5jcHkoKGNoYXIgKilzYi0+c19sYWJlbCwgbGFiZWwsIHNpemVvZihzYi0+c19sYWJlbCkpOworCisJLy8gVE9ETzogRU1QSVJJQyEgRU5ESUFOTkVTUyEKKwkvLyBzdXBlcmJsb2NrIGhhcyBvbmx5IDIwNCBieXRlcy4gV2hhdCBhcmUgdGhlc2U/CisJYnVmID0gKHVpbnQ4X3QgKilzYjsKKwlidWZbMjA1XSA9IDE7CisJYnVmWzIwOV0gPSAzOworCisJLy8gcHV0IHN1cGVyYmxvY2sKKwl4d3JpdGUoZmQsIHNiLCBibG9ja3NpemUpOworCisJLy8gY3JlYXRlIGJpdG1hcHMKKwlidWYgPSB4emFsbG9jKGJsb2Nrc2l6ZSk7CisKKwkvLyBiaXRtYXAgIzAgdXNlcyBpbml0aWFsICJibG9jayIrMSBibG9ja3MKKwlpID0gYmxvY2sgKyAxOworCW1lbXNldChidWYsIDB4RkYsIGkgLyA4KTsKKwlidWZbaSAvIDhdID0gKDEgPDwgKGkgJiA3KSkgLSAxOyAvLzAuLjcgPT4gMDAwMDAwMDAuLjAxMTExMTExCisJLy8gbWFyayB0cmFpbGluZyBhYnNlbnQgYmxvY2tzLCBpZiBhbnkKKwlpZiAoYmxvY2tzIDwgOCpibG9ja3NpemUpIHsKKwkJdW5zaWduZWQgbiA9IDgqYmxvY2tzaXplIC0gYmxvY2tzOworCQlpID0gbiAvIDg7CisJCWJ1ZltibG9ja3NpemUgLSBpIC0gMV0gfD0gMHg3RjAwID4+IChuICYgNyk7IC8vMC4uNyA9PiAwMDAwMDAwMC4uMTExMTExMTAKKwkJbWVtc2V0KGJ1ZiArIGJsb2Nrc2l6ZSAtIGksIDB4RkYsIGkpOyAvLyBOLkIuIG5vIG92ZXJmbG93IGhlcmUhCisJfQorCS8vIHB1dCBiaXRtYXAgIzAKKwl4d3JpdGUoZmQsIGJ1ZiwgYmxvY2tzaXplKTsKKworCS8vIG5vdyBnbyBqb3VybmFsIGJsb2NrcworCW1lbXNldChidWYsIDAsIGJsb2Nrc2l6ZSk7CisJZm9yIChpID0gMDsgaSA8IGpvdXJuYWxfYmxvY2tzOyBpKyspCisJCXh3cml0ZShmZCwgYnVmLCBibG9ja3NpemUpOworCS8vIGR1bXAgam91cm5hbCBjb250cm9sIGJsb2NrCisJbWVtY3B5KCYoKHN0cnVjdCByZWlzZXJmc19qb3VybmFsX2hlYWRlciAqKWJ1ZiktPmpoX2pvdXJuYWwsICZzYi0+c2Jfam91cm5hbCwgc2l6ZW9mKHNiLT5zYl9qb3VybmFsKSk7CisJeHdyaXRlKGZkLCBidWYsIGJsb2Nrc2l6ZSk7CisKKwkvLyBvdGhlciBiaXRtYXBzIGFyZSBpbiBldmVyeSAoOCpibG9ja3NpemUpLXRoIGJsb2NrCisJLy8gTi5CLiB0aGV5IHVzZSB0aGUgb25seSBibG9jayAtLSBuYW1lbHkgYml0bWFwIGl0c2VsZiEKKwlidWZbMF0gPSAweDAxOworCS8vIHB1dCBiaXRtYXBzCisJZm9yIChpID0gMTsgaSA8IGJpdG1hcF9ibG9ja3M7IGkrKykgeworCQl4bHNlZWsoZmQsIGkqOCpibG9ja3NpemUgKiBibG9ja3NpemUsIFNFRUtfU0VUKTsKKwkJLy8gbWFyayB0cmFpbGluZyBhYnNlbnQgYmxvY2tzLCBpZiBhbnkKKwkJaWYgKGkgPT0gYml0bWFwX2Jsb2NrcyAtIDEgJiYgKGJsb2NrcyAlICg4KmJsb2Nrc2l6ZSkpKSB7CisJCQl1bnNpZ25lZCBuID0gOCpibG9ja3NpemUgLSBibG9ja3MgJSAoOCpibG9ja3NpemUpOworCQkJdW5zaWduZWQgaiA9IG4gLyA4OworCQkJYnVmW2Jsb2Nrc2l6ZSAtIGogLSAxXSB8PSAweDdGMDAgPj4gKG4gJiA3KTsgLy8wLi43ID0+IDAwMDAwMDAwLi4xMTExMTExMAorCQkJbWVtc2V0KGJ1ZiArIGJsb2Nrc2l6ZSAtIGosIDB4RkYsIGopOyAvLyBOLkIuIG5vIG92ZXJmbG93IGhlcmUhCisJCX0KKwkJeHdyaXRlKGZkLCBidWYsIGJsb2Nrc2l6ZSk7CisJfQorCisJLy8gZmlsbCByb290IGJsb2NrCisJLy8gYmxvY2sgaGVhZAorCW1lbXNldChidWYsIDAsIGJsb2Nrc2l6ZSk7CisJcm9vdCA9IChzdHJ1Y3QgYmxvY2tfaGVhZCAqKWJ1ZjsKKwlTVE9SRV9MRShyb290LT5ibGsyX2xldmVsLCAxKTsgLy8gbGVhZiBub2RlCisJU1RPUkVfTEUocm9vdC0+YmxrMl9ucl9pdGVtLCAyKTsgLy8gIi4iIGFuZCAiLi4iCisJU1RPUkVfTEUocm9vdC0+YmxrMl9mcmVlX3NwYWNlLCBibG9ja3NpemUgLSBzaXplb2Yoc3RydWN0IGJsb2NrX2hlYWQpKTsKKwkvLyBpdGVtIGhlYWQKKwkvLyByb290IGRpcmVjdG9yeQorCS8vIFRPRE86IEVNUElSSUMhIEVORElBTk5FU1MhCisJLy8gVE9ETzogaW5kZW50ZWQgYXNzaWdubWVudHMgc2VlbSB0byBiZSB0aW1lc3RhbXBzCitidWZbNF0gPSAwMTM0OworYnVmWzI0XSA9IDAxOworYnVmWzI4XSA9IDAyOworYnVmWzQyXSA9IDA1NDsKK2J1Zls0NF0gPSAwMzI0OworYnVmWzQ1XSA9IDAxNzsKK2J1Zls0Nl0gPSAwMTsKK2J1Zls0OF0gPSAwMTsKK2J1Zls1Ml0gPSAwMjsKK2J1Zls1Nl0gPSAwMTsKK2J1Zls2MF0gPSAwMzY0OworYnVmWzYxXSA9IDAxOworYnVmWzY0XSA9IDAyOworYnVmWzY2XSA9IDA2MDsKK2J1Zls2OF0gPSAwMjQ0OworYnVmWzY5XSA9IDAxNzsKK2J1Zls0MDA0XSA9IDAxOworYnVmWzQwMDhdID0gMDE7CitidWZbNDAxMl0gPSAwMjsKK2J1Zls0MDE2XSA9IDA1MDsKK2J1Zls0MDE4XSA9IDA0OworYnVmWzQwMjBdID0gMDI7CitidWZbNDAyOF0gPSAwMTsKK2J1Zls0MDMyXSA9IDA0MDsKK2J1Zls0MDM0XSA9IDA0OworCitidWZbNDAzNl0gPSAwNTY7IGJ1Zls0MDM3XSA9IDA1NjsJLy8gIi4uIgorYnVmWzQwNDRdID0gMDU2OwkJCS8vICIuIgorCitidWZbNDA1Ml0gPSAwMzU1OworYnVmWzQwNTNdID0gMDEwMTsKK2J1Zls0MDU2XSA9IDAzOworYnVmWzQwNjBdID0gMDYwOworCQlidWZbNDA3Nl0gPSAwMTczOworCQlidWZbNDA3N10gPSAwMjQwOworCWJ1Zls0MDc4XSA9IDAzNDQ7CisJYnVmWzQwNzldID0gMDExMjsKKwkJYnVmWzQwODBdID0gMDE3MzsKKwkJYnVmWzQwODFdID0gMDI0MDsKKwlidWZbNDA4Ml0gPSAwMzQ0OworCWJ1Zls0MDgzXSA9IDAxMTI7CisJCWJ1Zls0MDg0XSA9IDAxNzM7CisJCWJ1Zls0MDg1XSA9IDAyNDA7CisJYnVmWzQwODZdID0gMDM0NDsKKwlidWZbNDA4N10gPSAwMTEyOworYnVmWzQwODhdID0gMDE7CisKKwkvLyBwdXQgcm9vdCBibG9jaworCXhsc2VlayhmZCwgYmxvY2sgKiBibG9ja3NpemUsIFNFRUtfU0VUKTsKKwl4d3JpdGUoZmQsIGJ1ZiwgYmxvY2tzaXplKTsKKworCS8vIGNsZWFudXAKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZnJlZShidWYpOworCQlmcmVlKHNiKTsKKwl9CisKKwl4Y2xvc2UoZmQpOworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L21rZnNfdmZhdC5jIGIvdXRpbC1saW51eC9ta2ZzX3ZmYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDgxZWQwCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9ta2ZzX3ZmYXQuYwpAQCAtMCwwICsxLDYzMCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbWtmc192ZmF0OiB1dGlsaXR5IHRvIGNyZWF0ZSBGQVQzMiBmaWxlc3lzdGVtCisgKiBpbnNwaXJlZCBieSBkb3Nmc3Rvb2xzCisgKgorICogQnVzeWJveCdlZCAoMjAwOSkgYnkgVmxhZGltaXIgRHJvbm5pa292IDxkcm9ubmlrb3ZAZ21haWwuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG1rZnNfdmZhdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy12XSBbLW4gTEFCRUxdIEJMT0NLREVWIFtLQllURVNdIgorLyogQWNjZXB0ZWQgYnV0IGlnbm9yZWQ6CisgICAgICAgIlstY10gWy1DXSBbLUldIFstbCBiYWQtYmxvY2stZmlsZV0gWy1iIGJhY2t1cC1ib290LXNlY3Rvcl0gIgorICAgICAgICJbLW0gYm9vdC1tc2ctZmlsZV0gWy1pIHZvbHVtZS1pZF0gIgorICAgICAgICJbLXMgc2VjdG9ycy1wZXItY2x1c3Rlcl0gWy1TIGxvZ2ljYWwtc2VjdG9yLXNpemVdIFstZiBudW1iZXItb2YtRkFUc10gIgorICAgICAgICJbLWggaGlkZGVuLXNlY3RvcnNdIFstRiBmYXQtc2l6ZV0gWy1yIHJvb3QtZGlyLWVudHJpZXNdIFstUiByZXNlcnZlZC1zZWN0b3JzXSAiCisqLworLy91c2FnZTojZGVmaW5lIG1rZnNfdmZhdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIk1ha2UgYSBGQVQzMiBmaWxlc3lzdGVtXG4iCisvKiAvL3VzYWdlOiAgIlxuCS1jCUNoZWNrIGRldmljZSBmb3IgYmFkIGJsb2NrcyIgKi8KKy8vdXNhZ2U6ICAgICAiXG4JLXYJVmVyYm9zZSIKKy8qIC8vdXNhZ2U6ICAiXG4JLUkJQWxsb3cgdG8gdXNlIGVudGlyZSBkaXNrIGRldmljZSAoZS5nLiAvZGV2L2hkYSkiICovCisvL3VzYWdlOiAgICAgIlxuCS1uIExCTAlWb2x1bWUgbGFiZWwiCisKKyNpbmNsdWRlICJsaWJiYi5oIgorCisjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4gLyogSERJT19HRVRHRU8gKi8KKyNpbmNsdWRlIDxsaW51eC9mZC5oPiAgICAvKiBGREdFVFBSTSAqLworI2luY2x1ZGUgPHN5cy9tb3VudC5oPiAgIC8qIEJMS1NTWkdFVCAqLworI2lmICFkZWZpbmVkKEJMS1NTWkdFVCkKKyMgZGVmaW5lIEJMS1NTWkdFVCBfSU8oMHgxMiwgMTA0KQorI2VuZGlmCisvLyNpbmNsdWRlIDxsaW51eC9tc2Rvc19mcy5oPgorCisjZGVmaW5lIFNFQ1RPUl9TSVpFICAgICAgICAgICAgIDUxMgorCisjZGVmaW5lIFNFQ1RPUlNfUEVSX0JMT0NLCShCTE9DS19TSVpFIC8gU0VDVE9SX1NJWkUpCisKKy8vIE0kIHNheXMgdGhlIGhpZ2ggNCBiaXRzIG9mIGEgRkFUMzIgRkFUIGVudHJ5IGFyZSByZXNlcnZlZAorI2RlZmluZSBFT0ZfRkFUMzIgICAgICAgMHgwRkZGRkZGOAorI2RlZmluZSBCQURfRkFUMzIgICAgICAgMHgwRkZGRkZGNworI2RlZmluZSBNQVhfQ0xVU1RfMzIgICAgMHgwRkZGRkZGMAorCisjZGVmaW5lIEFUVFJfVk9MVU1FICAgICA4CisKKyNkZWZpbmUgTlVNX0ZBVFMgICAgICAgIDIKKworLyogRkFUMzIgZmlsZXN5c3RlbSBsb29rcyBsaWtlIHRoaXM6CisgKiBzZWN0b3IgLW5uLi4uLTE6ICJoaWRkZW4iIHNlY3RvcnMsIGFsbCBzZWN0b3JzIGJlZm9yZSB0aGlzIHBhcnRpdGlvbgorICogKC1oIGhpZGRlbi1zZWN0b3JzIHNldHMgaXQuIFVzZWZ1bCBvbmx5IGZvciBib290IGxvYWRlcnMsCisgKiAgdGhleSBuZWVkIHRvIGtub3cgX2Rpc2tfIG9mZnNldCBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGNvcnJlY3RseQorICogIGFkZHJlc3Mgc2VjdG9ycyByZWxhdGl2ZSB0byBzdGFydCBvZiBkaXNrKQorICogc2VjdG9yIDA6IGJvb3Qgc2VjdG9yCisgKiBzZWN0b3IgMTogaW5mbyBzZWN0b3IKKyAqIHNlY3RvciAyOiBzZXQgYXNpZGUgZm9yIGJvb3QgY29kZSB3aGljaCBkaWRuJ3QgZml0IGludG8gc2VjdG9yIDAKKyAqIC4uLih6ZXJvLWZpbGxlZCBzZWN0b3JzKS4uLgorICogc2VjdG9yIEI6IGJhY2t1cCBjb3B5IG9mIHNlY3RvciAwIFtCIHNldCBieSAtYiBiYWNrdXAtYm9vdC1zZWN0b3JdCisgKiBzZWN0b3IgQisxOiBiYWNrdXAgY29weSBvZiBzZWN0b3IgMQorICogc2VjdG9yIEIrMjogYmFja3VwIGNvcHkgb2Ygc2VjdG9yIDIKKyAqIC4uLih6ZXJvLWZpbGxlZCBzZWN0b3JzKS4uLgorICogc2VjdG9yIFI6IEZBVCMxIFtSIHNldCBieSAtUiByZXNlcnZlZC1zZWN0b3JzXQorICogLi4uKEZBVCMxKS4uLgorICogc2VjdG9yIFIrZmF0X3NpemU6IEZBVCMyCisgKiAuLi4oRkFUIzIpLi4uCisgKiBzZWN0b3IgUitmYXRfc2l6ZSoyOiBjbHVzdGVyICMyCisgKiAuLi4oY2x1c3RlciAjMikuLi4KKyAqIHNlY3RvciBSK2ZhdF9zaXplKjIrY2x1c3Rfc2l6ZTogY2x1c3RlciAjMworICogLi4uKHRoZSByZXN0IGlzIGZpbGxlZCBieSBjbHVzdGVycyB0aWxsIHRoZSBlbmQpLi4uCisgKi8KKworZW51bSB7CisvLyBQZXJoYXBzIHRoaXMgc2hvdWxkIHJlbWFpbiBjb25zdGFudAorCWluZm9fc2VjdG9yX251bWJlciA9IDEsCisvLyBUT0RPOiBtYWtlIHRoZXNlIGNtZGxpbmUgb3B0aW9ucworLy8gZG9udCBmb3JnZXQgc2FuaXR5IGNoZWNrOiBiYWNrdXBfYm9vdF9zZWN0b3IgKyAzIDw9IHJlc2VydmVkX3NlY3QKKwliYWNrdXBfYm9vdF9zZWN0b3IgPSAzLAorCXJlc2VydmVkX3NlY3QgICAgICA9IDYsCit9OworCisvLyBob3cgbWFueSBibG9ja3Mgd2UgdHJ5IHRvIHJlYWQgd2hpbGUgdGVzdGluZworI2RlZmluZSBURVNUX0JVRkZFUl9CTE9DS1MgICAgICAxNgorCitzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5IHsKKwljaGFyICAgICBuYW1lWzExXTsgICAgICAgLyogMDAwIG5hbWUgYW5kIGV4dGVuc2lvbiAqLworCXVpbnQ4X3QgIGF0dHI7ICAgICAgICAgICAvKiAwMGIgYXR0cmlidXRlIGJpdHMgKi8KKwl1aW50OF90ICBsY2FzZTsgICAgICAgICAgLyogMDBjIGNhc2UgZm9yIGJhc2UgYW5kIGV4dGVuc2lvbiAqLworCXVpbnQ4X3QgIGN0aW1lX2NzOyAgICAgICAvKiAwMGQgY3JlYXRpb24gdGltZSwgY2VudGlzZWNvbmRzICgwLTE5OSkgKi8KKwl1aW50MTZfdCBjdGltZTsgICAgICAgICAgLyogMDBlIGNyZWF0aW9uIHRpbWUgKi8KKwl1aW50MTZfdCBjZGF0ZTsgICAgICAgICAgLyogMDEwIGNyZWF0aW9uIGRhdGUgKi8KKwl1aW50MTZfdCBhZGF0ZTsgICAgICAgICAgLyogMDEyIGxhc3QgYWNjZXNzIGRhdGUgKi8KKwl1aW50MTZfdCBzdGFydGhpOyAgICAgICAgLyogMDE0IGhpZ2ggMTYgYml0cyBvZiBjbHVzdGVyIGluIEZBVDMyICovCisJdWludDE2X3QgdGltZTsgICAgICAgICAgIC8qIDAxNiB0aW1lICovCisJdWludDE2X3QgZGF0ZTsgICAgICAgICAgIC8qIDAxOCBkYXRlICovCisJdWludDE2X3Qgc3RhcnQ7ICAgICAgICAgIC8qIDAxYSBmaXJzdCBjbHVzdGVyICovCisJdWludDMyX3Qgc2l6ZTsgICAgICAgICAgIC8qIDAxYyBmaWxlIHNpemUgaW4gYnl0ZXMgKi8KK30gUEFDS0VEOworCisvKiBFeGFtcGxlIG9mIGJvb3Qgc2VjdG9yJ3MgYmVnaW5uaW5nOgorMDAwMCAgZWIgNTggOTAgNGQgNTMgNTcgNDkgNGUgIDM0IDJlIDMxIDAwIDAyIDA4IDI2IDAwICB8Li4uTVNXSU40LjEuLi4mLnwKKzAwMTAgIDAyIDAwIDAwIDAwIDAwIGY4IDAwIDAwICAzZiAwMCBmZiAwMCAzZiAwMCAwMCAwMCAgfC4uLi4uLi4uPy4uLj8uLi58CiswMDIwICA1NCA5YiBkMCAwMCAwZCAzNCAwMCAwMCAgMDAgMDAgMDAgMDAgMDIgMDAgMDAgMDAgIHxULi4uLjQuLi4uLi4uLi4ufAorMDAzMCAgMDEgMDAgMDYgMDAgMDAgMDAgMDAgMDAgIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwICB8Li4uLi4uLi4uLi4uLi4uLnwKKzAwNDAgIDgwIDAwIDI5IDcxIGRmIDUxIGUwIDRlICA0ZiAyMCA0ZSA0MSA0ZCA0NSAyMCAyMCAgfC4uKXEuUS5OTyBOQU1FICB8CiswMDUwICAyMCAyMCA0NiA0MSA1NCAzMyAzMiAyMCAgMjAgMjAgMzMgYzkgOGUgZDEgYmMgZjQgIHwgIEZBVDMyICAgMy4uLi4ufAorKi8KK3N0cnVjdCBtc2Rvc192b2x1bWVfaW5mbyB7IC8qIChvZmZzZXRzIGFyZSByZWxhdGl2ZSB0byBzdGFydCBvZiBib290IHNlY3RvcikgKi8KKwl1aW50OF90ICBkcml2ZV9udW1iZXI7ICAgIC8qIDA0MCBCSU9TIGRyaXZlIG51bWJlciAqLworCXVpbnQ4X3QgIHJlc2VydmVkOyAgICAgICAgLyogMDQxIHVudXNlZCAqLworCXVpbnQ4X3QgIGV4dF9ib290X3NpZ247CSAgLyogMDQyIDB4MjkgaWYgZmllbGRzIGJlbG93IGV4aXN0IChET1MgMy4zKykgKi8KKwl1aW50MzJfdCB2b2x1bWVfaWQzMjsgICAgIC8qIDA0MyB2b2x1bWUgSUQgbnVtYmVyICovCisJY2hhciAgICAgdm9sdW1lX2xhYmVsWzExXTsvKiAwNDcgdm9sdW1lIGxhYmVsICovCisJY2hhciAgICAgZnNfdHlwZVs4XTsgICAgICAvKiAwNTIgdHlwaWNhbGx5ICJGQVRubiIgKi8KK30gUEFDS0VEOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiAwNWEgZW5kLiBUb3RhbCBzaXplIDI2ICgweDFhKSBieXRlcyAqLworCitzdHJ1Y3QgbXNkb3NfYm9vdF9zZWN0b3IgeworCS8qIFdlIHVzZSBzdHJjcHkgdG8gZmlsbCBib3RoLCBhbmQgZ2NjLTQuNC54IGNvbXBsYWlucyBpZiB0aGV5IGFyZSBzZXBhcmF0ZSAqLworCWNoYXIgICAgIGJvb3RfanVtcF9hbmRfc3lzX2lkWzMrOF07IC8qIDAwMCBzaG9ydCBvciBuZWFyIGp1bXAgaW5zdHJ1Y3Rpb24gKi8KKwkvKmNoYXIgICBzeXN0ZW1faWRbOF07Ki8gICAgIC8qIDAwMyBuYW1lIC0gY2FuIGJlIHVzZWQgdG8gc3BlY2lhbCBjYXNlIHBhcnRpdGlvbiBtYW5hZ2VyIHZvbHVtZXMgKi8KKwl1aW50MTZfdCBieXRlc19wZXJfc2VjdDsgICAgIC8qIDAwYiBieXRlcyBwZXIgbG9naWNhbCBzZWN0b3IgKi8KKwl1aW50OF90ICBzZWN0X3Blcl9jbHVzdDsgICAgIC8qIDAwZCBzZWN0b3JzL2NsdXN0ZXIgKi8KKwl1aW50MTZfdCByZXNlcnZlZF9zZWN0OyAgICAgIC8qIDAwZSByZXNlcnZlZCBzZWN0b3JzIChzZWN0b3Igb2Zmc2V0IG9mIDFzdCBGQVQgcmVsYXRpdmUgdG8gdm9sdW1lIHN0YXJ0KSAqLworCXVpbnQ4X3QgIGZhdHM7ICAgICAgICAgICAgICAgLyogMDEwIG51bWJlciBvZiBGQVRzICovCisJdWludDE2X3QgZGlyX2VudHJpZXM7ICAgICAgICAvKiAwMTEgcm9vdCBkaXJlY3RvcnkgZW50cmllcyAqLworCXVpbnQxNl90IHZvbHVtZV9zaXplX3NlY3Q7ICAgLyogMDEzIHZvbHVtZSBzaXplIGluIHNlY3RvcnMgKi8KKwl1aW50OF90ICBtZWRpYV9ieXRlOyAgICAgICAgIC8qIDAxNSBtZWRpYSBjb2RlICovCisJdWludDE2X3Qgc2VjdF9wZXJfZmF0OyAgICAgICAvKiAwMTYgc2VjdG9ycy9GQVQgKi8KKwl1aW50MTZfdCBzZWN0X3Blcl90cmFjazsgICAgIC8qIDAxOCBzZWN0b3JzIHBlciB0cmFjayAqLworCXVpbnQxNl90IGhlYWRzOyAgICAgICAgICAgICAgLyogMDFhIG51bWJlciBvZiBoZWFkcyAqLworCXVpbnQzMl90IGhpZGRlbjsgICAgICAgICAgICAgLyogMDFjIGhpZGRlbiBzZWN0b3JzIChzZWN0b3Igb2Zmc2V0IG9mIHZvbHVtZSB3aXRoaW4gcGh5c2ljYWwgZGlzaykgKi8KKwl1aW50MzJfdCBmYXQzMl92b2x1bWVfc2l6ZV9zZWN0OyAvKiAwMjAgdm9sdW1lIHNpemUgaW4gc2VjdG9ycyAoaWYgdm9sdW1lX3NpemVfc2VjdCA9PSAwKSAqLworCXVpbnQzMl90IGZhdDMyX3NlY3RfcGVyX2ZhdDsgLyogMDI0IHNlY3RvcnMvRkFUICovCisJdWludDE2X3QgZmF0MzJfZmxhZ3M7ICAgICAgICAvKiAwMjggYml0IDg6IGZhdCBtaXJyb3JpbmcsIGxvdyA0OiBhY3RpdmUgZmF0ICovCisJdWludDhfdCAgZmF0MzJfdmVyc2lvblsyXTsgICAvKiAwMmEgbWFqb3IsIG1pbm9yIGZpbGVzeXN0ZW0gdmVyc2lvbiAoSSBzZWUgMCwwKSAqLworCXVpbnQzMl90IGZhdDMyX3Jvb3RfY2x1c3RlcjsgLyogMDJjIGZpcnN0IGNsdXN0ZXIgaW4gcm9vdCBkaXJlY3RvcnkgKi8KKwl1aW50MTZfdCBmYXQzMl9pbmZvX3NlY3RvcjsgIC8qIDAzMCBmaWxlc3lzdGVtIGluZm8gc2VjdG9yICh1c3VhbGx5IDEpICovCisJdWludDE2X3QgZmF0MzJfYmFja3VwX2Jvb3Q7ICAvKiAwMzIgYmFja3VwIGJvb3Qgc2VjdG9yICh1c3VhbGx5IDYpICovCisJdWludDMyX3QgcmVzZXJ2ZWQyWzNdOyAgICAgICAvKiAwMzQgdW51c2VkICovCisJc3RydWN0IG1zZG9zX3ZvbHVtZV9pbmZvIHZpOyAvKiAwNDAgKi8KKwljaGFyICAgICBib290X2NvZGVbMHgyMDAgLSAweDVhIC0gMl07IC8qIDA1YSAqLworI2RlZmluZSBCT09UX1NJR04gMHhBQTU1CisJdWludDE2X3QgYm9vdF9zaWduOyAgICAgICAgICAvKiAxZmUgKi8KK30gUEFDS0VEOworCisjZGVmaW5lIEZBVF9GU0lORk9fU0lHMSAweDQxNjE1MjUyCisjZGVmaW5lIEZBVF9GU0lORk9fU0lHMiAweDYxNDE3MjcyCitzdHJ1Y3QgZmF0MzJfZnNpbmZvIHsKKwl1aW50MzJfdCBzaWduYXR1cmUxOyAgICAgICAgIC8qIDB4NTIsMHg1MiwweDQxLDB4NjEsICJSUmFBIiAqLworCXVpbnQzMl90IHJlc2VydmVkMVsxMjggLSA4XTsKKwl1aW50MzJfdCBzaWduYXR1cmUyOyAgICAgICAgIC8qIDB4NzIsMHg3MiwweDYxLDB4NDEsICJyckFhIiAqLworCXVpbnQzMl90IGZyZWVfY2x1c3RlcnM7ICAgICAgLyogZnJlZSBjbHVzdGVyIGNvdW50LiAgLTEgaWYgdW5rbm93biAqLworCXVpbnQzMl90IG5leHRfY2x1c3RlcjsgICAgICAgLyogbW9zdCByZWNlbnRseSBhbGxvY2F0ZWQgY2x1c3RlciAqLworCXVpbnQzMl90IHJlc2VydmVkMlszXTsKKwl1aW50MTZfdCByZXNlcnZlZDM7ICAgICAgICAgIC8qIDFmYyAqLworCXVpbnQxNl90IGJvb3Rfc2lnbjsgICAgICAgICAgLyogMWZlICovCit9IFBBQ0tFRDsKKworc3RydWN0IGJ1Z19jaGVjayB7CisJY2hhciBCVUcxW3NpemVvZihzdHJ1Y3QgbXNkb3NfZGlyX2VudHJ5ICApID09IDB4MjAgPyAxIDogLTFdOworCWNoYXIgQlVHMltzaXplb2Yoc3RydWN0IG1zZG9zX3ZvbHVtZV9pbmZvKSA9PSAweDFhID8gMSA6IC0xXTsKKwljaGFyIEJVRzNbc2l6ZW9mKHN0cnVjdCBtc2Rvc19ib290X3NlY3RvcikgPT0gMHgyMDAgPyAxIDogLTFdOworCWNoYXIgQlVHNFtzaXplb2Yoc3RydWN0IGZhdDMyX2ZzaW5mbyAgICAgKSA9PSAweDIwMCA/IDEgOiAtMV07Cit9OworCitzdGF0aWMgY29uc3QgY2hhciBib290X2NvZGVbXSBBTElHTjEgPQorCSJceDBlIiAgICAgICAgICAvKiAwNWE6ICAgICAgICAgcHVzaCAgY3MgKi8KKwkiXHgxZiIgICAgICAgICAgLyogMDViOiAgICAgICAgIHBvcCAgIGRzICovCisJIlx4YmVceDc3XHg3YyIgIC8qICB3cml0ZV9tc2c6ICBtb3YgICBzaSwgb2Zmc2V0IG1lc3NhZ2VfdHh0ICovCisJIlx4YWMiICAgICAgICAgIC8qIDA1ZjogICAgICAgICBsb2RzYiAqLworCSJceDIyXHhjMCIgICAgICAvKiAwNjA6ICAgICAgICAgYW5kICAgYWwsIGFsICovCisJIlx4NzRceDBiIiAgICAgIC8qIDA2MjogICAgICAgICBqeiAgICBrZXlfcHJlc3MgKi8KKwkiXHg1NiIgICAgICAgICAgLyogMDY0OiAgICAgICAgIHB1c2ggIHNpICovCisJIlx4YjRceDBlIiAgICAgIC8qIDA2NTogICAgICAgICBtb3YgICBhaCwgMGVoICovCisJIlx4YmJceDA3XHgwMCIgIC8qIDA2NzogICAgICAgICBtb3YgICBieCwgMDAwN2ggKi8KKwkiXHhjZFx4MTAiICAgICAgLyogMDZhOiAgICAgICAgIGludCAgIDEwaCAqLworCSJceDVlIiAgICAgICAgICAvKiAwNmM6ICAgICAgICAgcG9wICAgc2kgKi8KKwkiXHhlYlx4ZjAiICAgICAgLyogMDZkOiAgICAgICAgIGptcCAgIHdyaXRlX21zZyAqLworCSJceDMyXHhlNCIgICAgICAvKiAga2V5X3ByZXNzOiAgeG9yICAgYWgsIGFoICovCisJIlx4Y2RceDE2IiAgICAgIC8qIDA3MTogICAgICAgICBpbnQgICAxNmggKi8KKwkiXHhjZFx4MTkiICAgICAgLyogMDczOiAgICAgICAgIGludCAgIDE5aCAqLworCSJceGViXHhmZSIgICAgICAvKiAgZm9vOiAgICAgICAgam1wICAgZm9vICovCisJLyogMDc3OiBtZXNzYWdlX3R4dDogKi8KKwkiVGhpcyBpcyBub3QgYSBib290YWJsZSBkaXNrXHJcbiI7CisKKworI2RlZmluZSBNQVJLX0NMVVNURVIoY2x1c3RlciwgdmFsdWUpIFwKKwkoKHVpbnQzMl90ICopZmF0KVtjbHVzdGVyXSA9IFNXQVBfTEUzMih2YWx1ZSkKKwordm9pZCBCVUdfdW5zdXBwb3J0ZWRfZmllbGRfc2l6ZSh2b2lkKTsKKyNkZWZpbmUgU1RPUkVfTEUoZmllbGQsIHZhbHVlKSBcCitkbyB7IFwKKwlpZiAoc2l6ZW9mKGZpZWxkKSA9PSA0KSBcCisJCWZpZWxkID0gU1dBUF9MRTMyKHZhbHVlKTsgXAorCWVsc2UgaWYgKHNpemVvZihmaWVsZCkgPT0gMikgXAorCQlmaWVsZCA9IFNXQVBfTEUxNih2YWx1ZSk7IFwKKwllbHNlIGlmIChzaXplb2YoZmllbGQpID09IDEpIFwKKwkJZmllbGQgPSAodmFsdWUpOyBcCisJZWxzZSBcCisJCUJVR191bnN1cHBvcnRlZF9maWVsZF9zaXplKCk7IFwKK30gd2hpbGUgKDApCisKKy8qIGNvbXBhdDoKKyAqIG1rZG9zZnMgMi4xMSAoMTIgTWFyIDIwMDUpCisgKiBVc2FnZTogbWtkb3NmcyBbLUFdIFstY10gWy1DXSBbLXZdIFstSV0gWy1sIGJhZC1ibG9jay1maWxlXQorICogICAgICAgIFstYiBiYWNrdXAtYm9vdC1zZWN0b3JdCisgKiAgICAgICAgWy1tIGJvb3QtbXNnLWZpbGVdIFstbiB2b2x1bWUtbmFtZV0gWy1pIHZvbHVtZS1pZF0KKyAqICAgICAgICBbLXMgc2VjdG9ycy1wZXItY2x1c3Rlcl0gWy1TIGxvZ2ljYWwtc2VjdG9yLXNpemVdCisgKiAgICAgICAgWy1mIG51bWJlci1vZi1GQVRzXQorICogICAgICAgIFstaCBoaWRkZW4tc2VjdG9yc10gWy1GIGZhdC1zaXplXSBbLXIgcm9vdC1kaXItZW50cmllc10KKyAqICAgICAgICBbLVIgcmVzZXJ2ZWQtc2VjdG9yc10KKyAqICAgICAgICAvZGV2L25hbWUgW2Jsb2Nrc10KKyAqLworaW50IG1rZnNfdmZhdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgbWtmc192ZmF0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwljb25zdCBjaGFyICp2b2x1bWVfbGFiZWwgPSAiIjsKKwljaGFyICpidWY7CisJY2hhciAqZGV2aWNlX25hbWU7CisJdW9mZl90IHZvbHVtZV9zaXplX2J5dGVzOworCXVvZmZfdCB2b2x1bWVfc2l6ZV9zZWN0OworCXVpbnQzMl90IHRvdGFsX2NsdXN0OworCXVpbnQzMl90IHZvbHVtZV9pZDsKKwlpbnQgZGV2OworCXVuc2lnbmVkIGJ5dGVzX3Blcl9zZWN0OworCXVuc2lnbmVkIHNlY3RfcGVyX2ZhdDsKKwl1bnNpZ25lZCBvcHRzOworCXVpbnQxNl90IHNlY3RfcGVyX3RyYWNrOworCXVpbnQ4X3QgbWVkaWFfYnl0ZTsKKwl1aW50OF90IHNlY3RfcGVyX2NsdXN0OworCXVpbnQ4X3QgaGVhZHM7CisJZW51bSB7CisJCU9QVF9BID0gMSA8PCAwLCAgLy8gW0lHTk9SRURdIGF0YXJpIGZvcm1hdAorCQlPUFRfYiA9IDEgPDwgMSwJIC8vIFtJR05PUkVEXSBsb2NhdGlvbiBvZiBiYWNrdXAgYm9vdCBzZWN0b3IKKwkJT1BUX2MgPSAxIDw8IDIsCSAvLyBbSUdOT1JFRF0gY2hlY2sgZmlsZXN5c3RlbQorCQlPUFRfQyA9IDEgPDwgMywJIC8vIFtJR05PUkVEXSBjcmVhdGUgYSBuZXcgZmlsZQorCQlPUFRfZiA9IDEgPDwgNCwJIC8vIFtJR05PUkVEXSBudW1iZXIgb2YgRkFUcworCQlPUFRfRiA9IDEgPDwgNSwJIC8vIFtJR05PUkVELCBpbXBsaWVkIDMyXSBjaG9vc2UgRkFUIHNpemUKKwkJT1BUX2ggPSAxIDw8IDYsCSAvLyBbSUdOT1JFRF0gbnVtYmVyIG9mIGhpZGRlbiBzZWN0b3JzCisJCU9QVF9JID0gMSA8PCA3LAkgLy8gW0lHTk9SRURdIGRvbid0IGJhcmsgYXQgZW50aXJlIGRpc2sgZGV2aWNlcworCQlPUFRfaSA9IDEgPDwgOCwJIC8vIFtJR05PUkVEXSB2b2x1bWUgSUQKKwkJT1BUX2wgPSAxIDw8IDksCSAvLyBbSUdOT1JFRF0gYmFkIGJsb2NrIGZpbGVuYW1lCisJCU9QVF9tID0gMSA8PCAxMCwgLy8gW0lHTk9SRURdIG1lc3NhZ2UgZmlsZQorCQlPUFRfbiA9IDEgPDwgMTEsIC8vIHZvbHVtZSBsYWJlbAorCQlPUFRfciA9IDEgPDwgMTIsIC8vIFtJR05PUkVEXSByb290IGRpcmVjdG9yeSBlbnRyaWVzCisJCU9QVF9SID0gMSA8PCAxMywgLy8gW0lHTk9SRURdIG51bWJlciBvZiByZXNlcnZlZCBzZWN0b3JzCisJCU9QVF9zID0gMSA8PCAxNCwgLy8gW0lHTk9SRURdIHNlY3RvcnMgcGVyIGNsdXN0ZXIKKwkJT1BUX1MgPSAxIDw8IDE1LCAvLyBbSUdOT1JFRF0gc2VjdG9yIHNpemUKKwkJT1BUX3YgPSAxIDw8IDE2LCAvLyB2ZXJib3NlCisJfTsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIjsvLzpiKzpmKzpGKzpoKzpyKzpSKzpzKzpTKzp2djpjLS1sOmwtLWMiOworCW9wdHMgPSBnZXRvcHQzMihhcmd2LCAiQWI6Y0NmOkY6aDpJaTpsOm06bjpyOlI6czpTOnYiLAorCQlOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorCQlOVUxMLCBOVUxMLCAmdm9sdW1lX2xhYmVsLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCS8vIGNhY2hlIGRldmljZSBuYW1lCisJZGV2aWNlX25hbWUgPSBhcmd2WzBdOworCS8vIGRlZmF1bHQgdm9sdW1lIElEID0gY3JlYXRpb24gdGltZQorCXZvbHVtZV9pZCA9IHRpbWUoTlVMTCk7CisKKwlkZXYgPSB4b3BlbihkZXZpY2VfbmFtZSwgT19SRFdSKTsKKwl4ZnN0YXQoZGV2LCAmc3QsIGRldmljZV9uYW1lKTsKKworCS8vCisJLy8gR2V0IGltYWdlIHNpemUgYW5kIHNlY3RvciBzaXplCisJLy8KKwlieXRlc19wZXJfc2VjdCA9IFNFQ1RPUl9TSVpFOworCWlmICghU19JU0JMSyhzdC5zdF9tb2RlKSkgeworCQlpZiAoIVNfSVNSRUcoc3Quc3RfbW9kZSkpIHsKKwkJCWlmICghYXJndlsxXSkKKwkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW1hZ2Ugc2l6ZSBtdXN0IGJlIHNwZWNpZmllZCIpOworCQl9CisJCS8vIG5vdCBhIGJsb2NrIGRldmljZSwgc2tpcCBiYWQgc2VjdG9ycyBjaGVjaworCQlvcHRzICY9IH5PUFRfYzsKKwl9IGVsc2UgeworCQlpbnQgbWluX2J5dGVzX3Blcl9zZWN0OworI2lmIDAKKwkJdW5zaWduZWQgZGV2aWNlX251bTsKKwkJLy8gZm9yIHRydWUgYmxvY2sgZGV2aWNlcyB3ZSBkbyBjaGVjayBzYW5pdHkKKwkJZGV2aWNlX251bSA9IHN0LnN0X3JkZXYgJiAweGZmM2Y7CisJCS8vIGRvIHdlIGFsbG93IHRvIGZvcm1hdCB0aGUgd2hvbGUgZGlzayBkZXZpY2U/CisJCWlmICghKG9wdHMgJiBPUFRfSSkgJiYgKAorCQkJZGV2aWNlX251bSA9PSAweDAzMDAgfHwgLy8gaGRhLCBoZGIKKwkJCShkZXZpY2VfbnVtICYgMHhmZjBmKSA9PSAweDA4MDAgfHwgLy8gc2QKKwkJCWRldmljZV9udW0gPT0gMHgwZDAwIHx8IC8vIHhkCisJCQlkZXZpY2VfbnVtID09IDB4MTYwMCApICAvLyBoZGMsIGhkZAorCQkpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgid2lsbCBub3QgdHJ5IHRvIG1ha2UgZmlsZXN5c3RlbSBvbiBmdWxsLWRpc2sgZGV2aWNlICh1c2UgLUkgaWYgd2FudGVkKSIpOworCQkvLyBjYW4ndCB3b3JrIG9uIG1vdW50ZWQgZmlsZXN5c3RlbXMKKwkJaWYgKGZpbmRfbW91bnRfcG9pbnQoZGV2aWNlX25hbWUsIDApKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGZvcm1hdCBtb3VudGVkIGZpbGVzeXN0ZW0iKTsKKyNlbmRpZgorCQkvLyBnZXQgdHJ1ZSBzZWN0b3Igc2l6ZQorCQkvLyAocGFyYW1ldGVyIG11c3QgYmUgaW50Kiwgbm90IGxvbmcqIG9yIHNpemVfdCopCisJCXhpb2N0bChkZXYsIEJMS1NTWkdFVCwgJm1pbl9ieXRlc19wZXJfc2VjdCk7CisJCWlmIChtaW5fYnl0ZXNfcGVyX3NlY3QgPiBTRUNUT1JfU0laRSkgeworCQkJYnl0ZXNfcGVyX3NlY3QgPSBtaW5fYnl0ZXNfcGVyX3NlY3Q7CisJCQliYl9lcnJvcl9tc2coImZvciB0aGlzIGRldmljZSBzZWN0b3Igc2l6ZSBpcyAldSIsIG1pbl9ieXRlc19wZXJfc2VjdCk7CisJCX0KKwl9CisJdm9sdW1lX3NpemVfYnl0ZXMgPSBnZXRfdm9sdW1lX3NpemVfaW5fYnl0ZXMoZGV2LCBhcmd2WzFdLCAxMDI0LCAvKmV4dGVuZDoqLyAxKTsKKwl2b2x1bWVfc2l6ZV9zZWN0ID0gdm9sdW1lX3NpemVfYnl0ZXMgLyBieXRlc19wZXJfc2VjdDsKKworCS8vCisJLy8gRmluZCBvdXQgb3IgZ3Vlc3MgbWVkaWEgcGFyYW1ldGVycworCS8vCisJbWVkaWFfYnl0ZSA9IDB4Zjg7CisJaGVhZHMgPSAyNTU7CisJc2VjdF9wZXJfdHJhY2sgPSA2MzsKKwlzZWN0X3Blcl9jbHVzdCA9IDE7CisJeworCQlzdHJ1Y3QgaGRfZ2VvbWV0cnkgZ2VvbWV0cnk7CisJCS8vIHNpemUgKGluIHNlY3RvcnMpLCBzZWN0IChwZXIgdHJhY2spLCBoZWFkCisJCXN0cnVjdCBmbG9wcHlfc3RydWN0IHBhcmFtOworCisJCS8vIE4uQi4gd2hldGhlciB0byB1c2UgSERJT19HRVRHRU8gb3IgSERJT19SRVE/CisJCWlmIChpb2N0bChkZXYsIEhESU9fR0VUR0VPLCAmZ2VvbWV0cnkpID09IDAKKwkJICYmIGdlb21ldHJ5LnNlY3RvcnMKKwkJICYmIGdlb21ldHJ5LmhlYWRzCisJCSkgeworCQkJLy8gaGFyZCBkcml2ZQorCQkJc2VjdF9wZXJfdHJhY2sgPSBnZW9tZXRyeS5zZWN0b3JzOworCQkJaGVhZHMgPSBnZW9tZXRyeS5oZWFkczsKKworIHNldF9jbHVzdGVyX3NpemU6CisJCQkvKiBGb3IgRkFUMzIsIHRyeSB0byBkbyB0aGUgc2FtZSBhcyBNJCdzIGZvcm1hdCBjb21tYW5kCisJCQkgKiAoc2VlIGh0dHA6Ly93d3cud2luLnR1ZS5ubC9+YWViL2xpbnV4L2ZzL2ZhdC9mYXRnZW4xMDMucGRmIHAuIDIwKToKKwkJCSAqIGZzIHNpemUgPD0gMjYwTTogMC41ayBjbHVzdGVycworCQkJICogZnMgc2l6ZSA8PSAgIDhHOiA0ayBjbHVzdGVycworCQkJICogZnMgc2l6ZSA8PSAgMTZHOiA4ayBjbHVzdGVycworCQkJICogZnMgc2l6ZSA+ICAgMTZHOiAxNmsgY2x1c3RlcnMKKwkJCSAqLworCQkJc2VjdF9wZXJfY2x1c3QgPSAxOworCQkJaWYgKHZvbHVtZV9zaXplX2J5dGVzID49IDI2MCoxMDI0KjEwMjQpIHsKKwkJCQlzZWN0X3Blcl9jbHVzdCA9IDg7CisJCQkJLyogZmlnaHQgZ2NjOiAqLworCQkJCS8qICJlcnJvcjogaW50ZWdlciBvdmVyZmxvdyBpbiBleHByZXNzaW9uIiAqLworCQkJCS8qICJlcnJvcjogcmlnaHQgc2hpZnQgY291bnQgPj0gd2lkdGggb2YgdHlwZSIgKi8KKwkJCQlpZiAoc2l6ZW9mKG9mZl90KSA+IDQpIHsKKwkJCQkJdW5zaWduZWQgdCA9ICh2b2x1bWVfc2l6ZV9ieXRlcyA+PiAzMSA+PiAxKTsKKwkJCQkJaWYgKHQgPj0gOC80KQorCQkJCQkJc2VjdF9wZXJfY2x1c3QgPSAxNjsKKwkJCQkJaWYgKHQgPj0gMTYvNCkKKwkJCQkJCXNlY3RfcGVyX2NsdXN0ID0gMzI7CisJCQkJfQorCQkJfQorCQl9IGVsc2UgeworCQkJLy8gZmxvcHB5LCBsb29wLCBvciByZWd1bGFyIGZpbGUKKwkJCWludCBub3RfZmxvcHB5ID0gaW9jdGwoZGV2LCBGREdFVFBSTSwgJnBhcmFtKTsKKwkJCWlmIChub3RfZmxvcHB5ID09IDApIHsKKwkJCQkvLyBmbG9wcHkgZGlzaworCQkJCXNlY3RfcGVyX3RyYWNrID0gcGFyYW0uc2VjdDsKKwkJCQloZWFkcyA9IHBhcmFtLmhlYWQ7CisJCQkJdm9sdW1lX3NpemVfc2VjdCA9IHBhcmFtLnNpemU7CisJCQkJdm9sdW1lX3NpemVfYnl0ZXMgPSBwYXJhbS5zaXplICogU0VDVE9SX1NJWkU7CisJCQl9CisJCQkvLyBzZXR1cCB0aGUgbWVkaWEgZGVzY3JpcHRvciBieXRlCisJCQlzd2l0Y2ggKHZvbHVtZV9zaXplX3NlY3QpIHsKKwkJCWNhc2UgMiozNjA6CS8vIDUuMjUiLCAyLCA5LCA0MCAtIDM2MEsKKwkJCQltZWRpYV9ieXRlID0gMHhmZDsKKwkJCQlicmVhazsKKwkJCWNhc2UgMio3MjA6CS8vIDMuNSIsIDIsIDksIDgwIC0gNzIwSworCQkJY2FzZSAyKjEyMDA6CS8vIDUuMjUiLCAyLCAxNSwgODAgLSAxMjAwSworCQkJCW1lZGlhX2J5dGUgPSAweGY5OworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoJLy8gYW55dGhpbmcgZWxzZQorCQkJCWlmIChub3RfZmxvcHB5KQorCQkJCQlnb3RvIHNldF9jbHVzdGVyX3NpemU7CisJCQljYXNlIDIqMTQ0MDoJLy8gMy41IiwgMiwgMTgsIDgwIC0gMTQ0MEsKKwkJCWNhc2UgMioyODgwOgkvLyAzLjUiLCAyLCAzNiwgODAgLSAyODgwSworCQkJCW1lZGlhX2J5dGUgPSAweGYwOworCQkJCWJyZWFrOworCQkJfQorCQkJLy8gbm90IGZsb3BweSwgYnV0IHNpemUgbWF0Y2hlcyBmbG9wcHkgZXhhY3RseS4KKwkJCS8vIHBlcmhhcHMgaXQgaXMgYSBmbG9wcHkgaW1hZ2UuCisJCQkvLyB3ZSBhbHJlYWR5IHNldCBtZWRpYV9ieXRlIGFzIGlmIGl0IGlzIGEgZmxvcHB5LAorCQkJLy8gbm93IHNldCBzZWN0X3Blcl90cmFjayBhbmQgaGVhZHMuCisJCQloZWFkcyA9IDI7CisJCQlzZWN0X3Blcl90cmFjayA9ICh1bnNpZ25lZCl2b2x1bWVfc2l6ZV9zZWN0IC8gMTYwOworCQkJaWYgKHNlY3RfcGVyX3RyYWNrIDwgOSkKKwkJCQlzZWN0X3Blcl90cmFjayA9IDk7CisJCX0KKwl9CisKKwkvLworCS8vIENhbGN1bGF0ZSBudW1iZXIgb2YgY2x1c3RlcnMsIHNlY3RvcnMvY2x1c3Rlciwgc2VjdG9ycy9GQVQKKwkvLyAoYW4gaW5pdGlhbCBndWVzcyBmb3Igc2VjdF9wZXJfY2x1c3Qgc2hvdWxkIGFscmVhZHkgYmUgc2V0KQorCS8vCisJLy8gIm1rZG9zZnMgLXYgLUYgMzIgaW1hZ2U1ayA1IiBpcyB0aGUgbWluaW11bToKKwkvLyAyIHNlY3RvcnMgZm9yIEZBVHMgYW5kIDIgZGF0YSBzZWN0b3JzCisJaWYgKChvZmZfdCkodm9sdW1lX3NpemVfc2VjdCAtIHJlc2VydmVkX3NlY3QpIDwgNCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRoZSBpbWFnZSBpcyB0b28gc21hbGwgZm9yIEZBVDMyIik7CisJc2VjdF9wZXJfZmF0ID0gMTsKKwl3aGlsZSAoMSkgeworCQl3aGlsZSAoMSkgeworCQkJaW50IHNwZl9hZGo7CisJCQl1b2ZmX3QgdGNsID0gKHZvbHVtZV9zaXplX3NlY3QgLSByZXNlcnZlZF9zZWN0IC0gTlVNX0ZBVFMgKiBzZWN0X3Blcl9mYXQpIC8gc2VjdF9wZXJfY2x1c3Q7CisJCQkvLyB0Y2wgbWF5IGJlID4gTUFYX0NMVVNUXzMyIGhlcmUsIGJ1dCBpdCBtYXkgYmUKKwkJCS8vIGJlY2F1c2Ugc2VjdF9wZXJfZmF0IGlzIHVuZGVyZXN0aW1hdGVkLAorCQkJLy8gYW5kIHdpdGggaW5jcmVhc2VkIHNlY3RfcGVyX2ZhdCBpdCBzdGlsbCBtYXkgYmVjb21lCisJCQkvLyA8PSBNQVhfQ0xVU1RfMzIuIFRoZXJlZm9yZSwgd2UgZG8gbm90IGNoZWNrCisJCQkvLyBhZ2FpbnN0IE1BWF9DTFVTVF8zMiwgYnV0IGFnYWluc3QgYSBiaWdnZXIgY29uc3Q6CisJCQlpZiAodGNsID4gMHg4MGZmZmZmZikKKwkJCQlnb3RvIG5leHQ7CisJCQl0b3RhbF9jbHVzdCA9IHRjbDsgLy8gZml0cyBpbiB1aW50MzJfdAorCQkJLy8gRXZlcnkgY2x1c3RlciBuZWVkcyA0IGJ5dGVzIGluIEZBVC4gKzIgZW50cmllcyBzaW5jZQorCQkJLy8gRkFUIGhhcyBzcGFjZSBmb3Igbm9uLWV4aXN0ZW50IGNsdXN0ZXJzIDAgYW5kIDEuCisJCQkvLyBMZXQncyBzZWUgaG93IG1hbnkgc2VjdG9ycyB0aGF0IG5lZWRzLgorCQkJLy9NYXkgb3ZlcmZsb3cgYXQgIio0IjoKKwkJCS8vc3BmX2FkaiA9ICgodG90YWxfY2x1c3QrMikgKiA0ICsgYnl0ZXNfcGVyX3NlY3QtMSkgLyBieXRlc19wZXJfc2VjdCAtIHNlY3RfcGVyX2ZhdDsKKwkJCS8vU2FtZSBpbiB0aGUgbW9yZSBvYnNjdXJlLCBub24tb3ZlcmZsb3dpbmcgZm9ybToKKwkJCXNwZl9hZGogPSAoKHRvdGFsX2NsdXN0KzIpICsgKGJ5dGVzX3Blcl9zZWN0LzQpLTEpIC8gKGJ5dGVzX3Blcl9zZWN0LzQpIC0gc2VjdF9wZXJfZmF0OworI2lmIDAKKwkJCWJiX2Vycm9yX21zZygic2VjdF9wZXJfY2x1c3Q6JXUgc2VjdF9wZXJfZmF0OiV1IHRvdGFsX2NsdXN0OiV1IiwKKwkJCQkJc2VjdF9wZXJfY2x1c3QsIHNlY3RfcGVyX2ZhdCwgKGludCl0Y2wpOworCQkJYmJfZXJyb3JfbXNnKCJhZGp1c3QgdG8gc2VjdF9wZXJfZmF0OiVkIiwgc3BmX2Fkaik7CisjZW5kaWYKKwkJCWlmIChzcGZfYWRqIDw9IDApIHsKKwkJCQkvLyBkbyBub3QgbmVlZCB0byBhZGp1c3Qgc2VjdF9wZXJfZmF0LgorCQkJCS8vIHNvLCB3YXMgdG90YWxfY2x1c3QgdG9vIGJpZyBhZnRlciBhbGw/CisJCQkJaWYgKHRvdGFsX2NsdXN0IDw9IE1BWF9DTFVTVF8zMikKKwkJCQkJZ290byBmb3VuZF90b3RhbF9jbHVzdDsgLy8gbm8KKwkJCQkvLyB5ZXMsIHRvdGFsX2NsdXN0IGlzIF9hIGJpdF8gdG9vIGJpZworCQkJCWdvdG8gbmV4dDsKKwkJCX0KKwkJCS8vIGFkanVzdCBzZWN0X3Blcl9mYXQsIGdvIGJhY2sgYW5kIHJlY2FsYyB0b3RhbF9jbHVzdAorCQkJLy8gKG5vdGU6IGp1c3QgInNlY3RfcGVyX2ZhdCArPSBzcGZfYWRqIiBpc24ndCBvaykKKwkJCXNlY3RfcGVyX2ZhdCArPSAoKHVuc2lnbmVkKXNwZl9hZGogLyAyKSB8IDE7CisJCX0KKyBuZXh0OgorCQlpZiAoc2VjdF9wZXJfY2x1c3QgPT0gMTI4KQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IG1ha2UgRkFUMzIgd2l0aCA+MTI4IHNlY3RvcnMvY2x1c3RlciIpOworCQlzZWN0X3Blcl9jbHVzdCAqPSAyOworCQlzZWN0X3Blcl9mYXQgPSAoc2VjdF9wZXJfZmF0IC8gMikgfCAxOworCX0KKyBmb3VuZF90b3RhbF9jbHVzdDoKKworCS8vCisJLy8gUHJpbnQgaW5mbworCS8vCisJaWYgKG9wdHMgJiBPUFRfdikgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJEZXZpY2UgJyVzJzpcbiIKKwkJCSJoZWFkczoldSwgc2VjdG9ycy90cmFjazoldSwgYnl0ZXMvc2VjdG9yOiV1XG4iCisJCQkibWVkaWEgZGVzY3JpcHRvcjolMDJ4XG4iCisJCQkidG90YWwgc2VjdG9yczolIk9GRl9GTVQidSwgY2x1c3RlcnM6JXUsIHNlY3RvcnMvY2x1c3RlcjoldVxuIgorCQkJIkZBVHM6Miwgc2VjdG9ycy9GQVQ6JXVcbiIKKwkJCSJ2b2x1bWVJRDolMDh4LCBsYWJlbDonJXMnXG4iLAorCQkJZGV2aWNlX25hbWUsCisJCQloZWFkcywgc2VjdF9wZXJfdHJhY2ssIGJ5dGVzX3Blcl9zZWN0LAorCQkJKGludCltZWRpYV9ieXRlLAorCQkJdm9sdW1lX3NpemVfc2VjdCwgKGludCl0b3RhbF9jbHVzdCwgKGludClzZWN0X3Blcl9jbHVzdCwKKwkJCXNlY3RfcGVyX2ZhdCwKKwkJCShpbnQpdm9sdW1lX2lkLCB2b2x1bWVfbGFiZWwKKwkJKTsKKwl9CisKKwkvLworCS8vIFdyaXRlIGZpbGVzeXN0ZW0gaW1hZ2Ugc2VxdWVudGlhbGx5IChubyBzZWVraW5nKQorCS8vCisJeworCQkvLyAoYSB8IGIpIGlzIHBvb3IgbWFuJ3MgbWF4KGEsIGIpCisJCXVuc2lnbmVkIGJ1ZnNpemUgPSByZXNlcnZlZF9zZWN0OworCQkvL2J1ZnNpemUgfD0gc2VjdF9wZXJfZmF0OyAvLyBjYW4gYmUgcXVpdGUgbGFyZ2UKKwkJYnVmc2l6ZSB8PSAyOyAvLyB1c2UgdGhpcyBpbnN0ZWFkCisJCWJ1ZnNpemUgfD0gc2VjdF9wZXJfY2x1c3Q7CisJCWJ1ZiA9IHh6YWxsb2MoYnVmc2l6ZSAqIGJ5dGVzX3Blcl9zZWN0KTsKKwl9CisKKwl7IC8vIGJvb3QgYW5kIGZzaW5mbyBzZWN0b3JzLCBhbmQgdGhlaXIgY29waWVzCisJCXN0cnVjdCBtc2Rvc19ib290X3NlY3RvciAqYm9vdF9ibGsgPSAodm9pZCopYnVmOworCQlzdHJ1Y3QgZmF0MzJfZnNpbmZvICppbmZvID0gKHZvaWQqKShidWYgKyBieXRlc19wZXJfc2VjdCk7CisKKwkJc3RyY3B5KGJvb3RfYmxrLT5ib290X2p1bXBfYW5kX3N5c19pZCwgIlx4ZWJceDU4XHg5MCIgIm1rZG9zZnMiKTsKKwkJU1RPUkVfTEUoYm9vdF9ibGstPmJ5dGVzX3Blcl9zZWN0LCBieXRlc19wZXJfc2VjdCk7CisJCVNUT1JFX0xFKGJvb3RfYmxrLT5zZWN0X3Blcl9jbHVzdCwgc2VjdF9wZXJfY2x1c3QpOworCQkvLyBjYXN0IGluIG5lZWRlZCBvbiBiaWcgZW5kaWFuIHRvIHN1cHByZXNzIGEgd2FybmluZworCQlTVE9SRV9MRShib290X2Jsay0+cmVzZXJ2ZWRfc2VjdCwgKHVpbnQxNl90KXJlc2VydmVkX3NlY3QpOworCQlTVE9SRV9MRShib290X2Jsay0+ZmF0cywgMik7CisJCS8vU1RPUkVfTEUoYm9vdF9ibGstPmRpcl9lbnRyaWVzLCAwKTsgLy8gZm9yIEZBVDMyLCBzdGF5cyAwCisJCWlmICh2b2x1bWVfc2l6ZV9zZWN0IDw9IDB4ZmZmZikKKwkJCVNUT1JFX0xFKGJvb3RfYmxrLT52b2x1bWVfc2l6ZV9zZWN0LCB2b2x1bWVfc2l6ZV9zZWN0KTsKKwkJU1RPUkVfTEUoYm9vdF9ibGstPm1lZGlhX2J5dGUsIG1lZGlhX2J5dGUpOworCQkvLyB3cm9uZzogdGhpcyB3b3VsZCBtYWtlIExpbnV4IHRoaW5rIHRoYXQgaXQncyBmYXQxMi8xNjoKKwkJLy9pZiAoc2VjdF9wZXJfZmF0IDw9IDB4ZmZmZikKKwkJLy8JU1RPUkVfTEUoYm9vdF9ibGstPnNlY3RfcGVyX2ZhdCwgc2VjdF9wZXJfZmF0KTsKKwkJLy8gd29ya3M6CisJCS8vU1RPUkVfTEUoYm9vdF9ibGstPnNlY3RfcGVyX2ZhdCwgMCk7CisJCVNUT1JFX0xFKGJvb3RfYmxrLT5zZWN0X3Blcl90cmFjaywgc2VjdF9wZXJfdHJhY2spOworCQlTVE9SRV9MRShib290X2Jsay0+aGVhZHMsIGhlYWRzKTsKKwkJLy9TVE9SRV9MRShib290X2Jsay0+aGlkZGVuLCAwKTsKKwkJU1RPUkVfTEUoYm9vdF9ibGstPmZhdDMyX3ZvbHVtZV9zaXplX3NlY3QsIHZvbHVtZV9zaXplX3NlY3QpOworCQlTVE9SRV9MRShib290X2Jsay0+ZmF0MzJfc2VjdF9wZXJfZmF0LCBzZWN0X3Blcl9mYXQpOworCQkvL1NUT1JFX0xFKGJvb3RfYmxrLT5mYXQzMl9mbGFncywgMCk7CisJCS8vU1RPUkVfTEUoYm9vdF9ibGstPmZhdDMyX3ZlcnNpb25bMl0sIDAsMCk7CisJCVNUT1JFX0xFKGJvb3RfYmxrLT5mYXQzMl9yb290X2NsdXN0ZXIsIDIpOworCQlTVE9SRV9MRShib290X2Jsay0+ZmF0MzJfaW5mb19zZWN0b3IsIGluZm9fc2VjdG9yX251bWJlcik7CisJCVNUT1JFX0xFKGJvb3RfYmxrLT5mYXQzMl9iYWNrdXBfYm9vdCwgYmFja3VwX2Jvb3Rfc2VjdG9yKTsKKwkJLy9TVE9SRV9MRShib290X2Jsay0+cmVzZXJ2ZWQyWzNdLCAwLDAsMCk7CisJCVNUT1JFX0xFKGJvb3RfYmxrLT52aS5leHRfYm9vdF9zaWduLCAweDI5KTsKKwkJU1RPUkVfTEUoYm9vdF9ibGstPnZpLnZvbHVtZV9pZDMyLCB2b2x1bWVfaWQpOworCQlzdHJuY3B5KGJvb3RfYmxrLT52aS5mc190eXBlLCAiRkFUMzIgICAiLCBzaXplb2YoYm9vdF9ibGstPnZpLmZzX3R5cGUpKTsKKwkJc3RybmNweShib290X2Jsay0+dmkudm9sdW1lX2xhYmVsLCB2b2x1bWVfbGFiZWwsIHNpemVvZihib290X2Jsay0+dmkudm9sdW1lX2xhYmVsKSk7CisJCW1lbWNweShib290X2Jsay0+Ym9vdF9jb2RlLCBib290X2NvZGUsIHNpemVvZihib290X2NvZGUpKTsKKwkJU1RPUkVfTEUoYm9vdF9ibGstPmJvb3Rfc2lnbiwgQk9PVF9TSUdOKTsKKworCQlTVE9SRV9MRShpbmZvLT5zaWduYXR1cmUxLCBGQVRfRlNJTkZPX1NJRzEpOworCQlTVE9SRV9MRShpbmZvLT5zaWduYXR1cmUyLCBGQVRfRlNJTkZPX1NJRzIpOworCQkvLyB3ZSd2ZSBhbGxvY2F0ZWQgY2x1c3RlciAyIGZvciB0aGUgcm9vdCBkaXIKKwkJU1RPUkVfTEUoaW5mby0+ZnJlZV9jbHVzdGVycywgKHRvdGFsX2NsdXN0IC0gMSkpOworCQlTVE9SRV9MRShpbmZvLT5uZXh0X2NsdXN0ZXIsIDIpOworCQlTVE9SRV9MRShpbmZvLT5ib290X3NpZ24sIEJPT1RfU0lHTik7CisKKwkJLy8gMXN0IGNvcHkKKwkJeHdyaXRlKGRldiwgYnVmLCBieXRlc19wZXJfc2VjdCAqIGJhY2t1cF9ib290X3NlY3Rvcik7CisJCS8vIDJuZCBjb3B5IGFuZCBwb3NzaWJseSB6ZXJvIHNlY3RvcnMKKwkJeHdyaXRlKGRldiwgYnVmLCBieXRlc19wZXJfc2VjdCAqIChyZXNlcnZlZF9zZWN0IC0gYmFja3VwX2Jvb3Rfc2VjdG9yKSk7CisJfQorCisJeyAvLyBmaWxlIGFsbG9jYXRpb24gdGFibGVzCisJCXVuc2lnbmVkIGksajsKKwkJdW5zaWduZWQgY2hhciAqZmF0ID0gKHZvaWQqKWJ1ZjsKKworCQltZW1zZXQoYnVmLCAwLCBieXRlc19wZXJfc2VjdCAqIDIpOworCQkvLyBpbml0aWFsIEZBVCBlbnRyaWVzCisJCU1BUktfQ0xVU1RFUigwLCAweDBmZmZmZjAwIHwgbWVkaWFfYnl0ZSk7CisJCU1BUktfQ0xVU1RFUigxLCAweGZmZmZmZmZmKTsKKwkJLy8gbWFyayBjbHVzdGVyIDIgYXMgRU9GICh1c2VkIGZvciByb290IGRpcikKKwkJTUFSS19DTFVTVEVSKDIsIEVPRl9GQVQzMik7CisJCWZvciAoaSA9IDA7IGkgPCBOVU1fRkFUUzsgaSsrKSB7CisJCQl4d3JpdGUoZGV2LCBidWYsIGJ5dGVzX3Blcl9zZWN0KTsKKwkJCWZvciAoaiA9IDE7IGogPCBzZWN0X3Blcl9mYXQ7IGorKykKKwkJCQl4d3JpdGUoZGV2LCBidWYgKyBieXRlc19wZXJfc2VjdCwgYnl0ZXNfcGVyX3NlY3QpOworCQl9CisJfQorCisJLy8gcm9vdCBkaXJlY3RvcnkKKwkvLyBlbXB0eSBkaXJlY3RvcnkgaXMganVzdCBhIHNldCBvZiB6ZXJvIGJ5dGVzCisJbWVtc2V0KGJ1ZiwgMCwgc2VjdF9wZXJfY2x1c3QgKiBieXRlc19wZXJfc2VjdCk7CisJaWYgKHZvbHVtZV9sYWJlbFswXSkgeworCQkvLyBjcmVhdGUgZGlyIGVudHJ5IGZvciB2b2x1bWVfbGFiZWwKKwkJc3RydWN0IG1zZG9zX2Rpcl9lbnRyeSAqZGU7CisjaWYgMAorCQlzdHJ1Y3QgdG0gdG1fdGltZTsKKwkJdWludDE2X3QgdCwgZDsKKyNlbmRpZgorCQlkZSA9ICh2b2lkKilidWY7CisJCXN0cm5jcHkoZGUtPm5hbWUsIHZvbHVtZV9sYWJlbCwgc2l6ZW9mKGRlLT5uYW1lKSk7CisJCVNUT1JFX0xFKGRlLT5hdHRyLCBBVFRSX1ZPTFVNRSk7CisjaWYgMAorCQlsb2NhbHRpbWVfcigmY3JlYXRlX3RpbWUsICZ0bV90aW1lKTsKKwkJdCA9ICh0bV90aW1lLnRtX3NlYyA+PiAxKSArICh0bV90aW1lLnRtX21pbiA8PCA1KSArICh0bV90aW1lLnRtX2hvdXIgPDwgMTEpOworCQlkID0gdG1fdGltZS50bV9tZGF5ICsgKCh0bV90aW1lLnRtX21vbisxKSA8PCA1KSArICgodG1fdGltZS50bV95ZWFyLTgwKSA8PCA5KTsKKwkJU1RPUkVfTEUoZGUtPnRpbWUsIHQpOworCQlTVE9SRV9MRShkZS0+ZGF0ZSwgZCk7CisJCS8vU1RPUkVfTEUoZGUtPmN0aW1lX2NzLCAwKTsKKwkJZGUtPmN0aW1lID0gZGUtPnRpbWU7CisJCWRlLT5jZGF0ZSA9IGRlLT5kYXRlOworCQlkZS0+YWRhdGUgPSBkZS0+ZGF0ZTsKKyNlbmRpZgorCX0KKwl4d3JpdGUoZGV2LCBidWYsIHNlY3RfcGVyX2NsdXN0ICogYnl0ZXNfcGVyX3NlY3QpOworCisjaWYgMAorCWlmIChvcHRzICYgT1BUX2MpIHsKKwkJdW9mZl90IHZvbHVtZV9zaXplX2Jsb2NrczsKKwkJdW5zaWduZWQgc3RhcnRfZGF0YV9zZWN0b3I7CisJCXVuc2lnbmVkIHN0YXJ0X2RhdGFfYmxvY2s7CisJCXVuc2lnbmVkIGJhZGJsb2NrcyA9IDA7CisJCWludCB0cnksIGdvdDsKKwkJb2ZmX3QgY3VycmVudGx5X3Rlc3Rpbmc7CisJCWNoYXIgKmJsa2J1ZiA9IHhtYWxsb2MoQkxPQ0tfU0laRSAqIFRFU1RfQlVGRkVSX0JMT0NLUyk7CisKKwkJdm9sdW1lX3NpemVfYmxvY2tzID0gKHZvbHVtZV9zaXplX2J5dGVzID4+IEJMT0NLX1NJWkVfQklUUyk7CisJCS8vIE4uQi4gdGhlIHR3byBmb2xsb3dpbmcgdmFycyBhcmUgaW4gaGFyZCBzZWN0b3JzLCBpLmUuIFNFQ1RPUl9TSVpFIGJ5dGUgc2VjdG9ycyEKKwkJc3RhcnRfZGF0YV9zZWN0b3IgPSAocmVzZXJ2ZWRfc2VjdCArIE5VTV9GQVRTICogc2VjdF9wZXJfZmF0KSAqIChieXRlc19wZXJfc2VjdCAvIFNFQ1RPUl9TSVpFKTsKKwkJc3RhcnRfZGF0YV9ibG9jayA9IChzdGFydF9kYXRhX3NlY3RvciArIFNFQ1RPUlNfUEVSX0JMT0NLIC0gMSkgLyBTRUNUT1JTX1BFUl9CTE9DSzsKKworCQliYl9pbmZvX21zZygic2VhcmNoaW5nIGZvciBiYWQgYmxvY2tzICIpOworCQljdXJyZW50bHlfdGVzdGluZyA9IDA7CisJCXRyeSA9IFRFU1RfQlVGRkVSX0JMT0NLUzsKKwkJd2hpbGUgKGN1cnJlbnRseV90ZXN0aW5nIDwgdm9sdW1lX3NpemVfYmxvY2tzKSB7CisJCQlpZiAoY3VycmVudGx5X3Rlc3RpbmcgKyB0cnkgPiB2b2x1bWVfc2l6ZV9ibG9ja3MpCisJCQkJdHJ5ID0gdm9sdW1lX3NpemVfYmxvY2tzIC0gY3VycmVudGx5X3Rlc3Rpbmc7CisJCQkvLyBwZXJmb3JtIGEgdGVzdCBvbiBhIGJsb2NrLiByZXR1cm4gdGhlIG51bWJlciBvZiBibG9ja3MKKwkJCS8vIHRoYXQgY291bGQgYmUgcmVhZCBzdWNjZXNzZnVsbHkuCisJCQkvLyBzZWVrIHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uCisJCQl4bHNlZWsoZGV2LCBjdXJyZW50bHlfdGVzdGluZyAqIEJMT0NLX1NJWkUsIFNFRUtfU0VUKTsKKwkJCS8vIHRyeSByZWFkaW5nCisJCQlnb3QgPSByZWFkKGRldiwgYmxrYnVmLCB0cnkgKiBCTE9DS19TSVpFKTsKKwkJCWlmIChnb3QgPCAwKQorCQkJCWdvdCA9IDA7CisJCQlpZiAoZ290ICYgKEJMT0NLX1NJWkUgLSAxKSkKKwkJCQliYl9lcnJvcl9tc2coInVuZXhwZWN0ZWQgdmFsdWVzIGluIGRvX2NoZWNrOiBwcm9iYWJseSBidWdzIik7CisJCQlnb3QgLz0gQkxPQ0tfU0laRTsKKwkJCWN1cnJlbnRseV90ZXN0aW5nICs9IGdvdDsKKwkJCWlmIChnb3QgPT0gdHJ5KSB7CisJCQkJdHJ5ID0gVEVTVF9CVUZGRVJfQkxPQ0tTOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJdHJ5ID0gMTsKKwkJCWlmIChjdXJyZW50bHlfdGVzdGluZyA8IHN0YXJ0X2RhdGFfYmxvY2spCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImJhZCBibG9ja3MgYmVmb3JlIGRhdGEtYXJlYTogY2Fubm90IG1ha2UgZnMiKTsKKworCQkJLy8gbWFyayBhbGwgb2YgdGhlIHNlY3RvcnMgaW4gdGhlIGJsb2NrIGFzIGJhZAorCQkJZm9yIChpID0gMDsgaSA8IFNFQ1RPUlNfUEVSX0JMT0NLOyBpKyspIHsKKwkJCQlpbnQgY2x1c3RlciA9IChjdXJyZW50bHlfdGVzdGluZyAqIFNFQ1RPUlNfUEVSX0JMT0NLICsgaSAtIHN0YXJ0X2RhdGFfc2VjdG9yKSAvIChpbnQpIChzZWN0X3Blcl9jbHVzdCkgLyAoYnl0ZXNfcGVyX3NlY3QgLyBTRUNUT1JfU0laRSk7CisJCQkJaWYgKGNsdXN0ZXIgPCAwKQorCQkJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiaW52YWxpZCBjbHVzdGVyIG51bWJlciBpbiBtYXJrX3NlY3RvcjogcHJvYmFibHkgYnVnISIpOworCQkJCU1BUktfQ0xVU1RFUihjbHVzdGVyLCBCQURfRkFUMzIpOworCQkJfQorCQkJYmFkYmxvY2tzKys7CisJCQljdXJyZW50bHlfdGVzdGluZysrOworCQl9CisJCWZyZWUoYmxrYnVmKTsKKwkJaWYgKGJhZGJsb2NrcykKKwkJCWJiX2luZm9fbXNnKCIlZCBiYWQgYmxvY2socykiLCBiYWRibG9ja3MpOworCX0KKyNlbmRpZgorCisJLy8gY2xlYW51cAorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQlmcmVlKGJ1Zik7CisJCWNsb3NlKGRldik7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L21rc3dhcC5jIGIvdXRpbC1saW51eC9ta3N3YXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWQyYzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9ta3N3YXAuYwpAQCAtMCwwICsxLDE0OSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKiBta3N3YXAuYyAtIGZvcm1hdCBzd2FwIGRldmljZSAoTGludXggdjEgb25seSkKKyAqCisgKiBDb3B5cmlnaHQgMjAwNiBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy91c2FnZTojZGVmaW5lIG1rc3dhcF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1MIExCTF0gQkxPQ0tERVYgW0tCWVRFU10iCisvL3VzYWdlOiNkZWZpbmUgbWtzd2FwX2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiUHJlcGFyZSBCTE9DS0RFViB0byBiZSB1c2VkIGFzIHN3YXAgcGFydGl0aW9uXG4iCisvL3VzYWdlOiAgICAgIlxuCS1MIExCTAlMYWJlbCIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKKyNpZiBFTkFCTEVfU0VMSU5VWAorc3RhdGljIHZvaWQgbWtzd2FwX3NlbGludXhfc2V0Y29udGV4dChpbnQgZmQsIGNvbnN0IGNoYXIgKnBhdGgpCit7CisJc3RydWN0IHN0YXQgc3RidWY7CisKKwlpZiAoIWlzX3NlbGludXhfZW5hYmxlZCgpKQorCQlyZXR1cm47CisKKwl4ZnN0YXQoZmQsICZzdGJ1ZiwgcGF0aCk7CisJaWYgKFNfSVNSRUcoc3RidWYuc3RfbW9kZSkpIHsKKwkJc2VjdXJpdHlfY29udGV4dF90IG5ld2NvbjsKKwkJc2VjdXJpdHlfY29udGV4dF90IG9sZGNvbiA9IE5VTEw7CisJCWNvbnRleHRfdCBjb250ZXh0OworCisJCWlmIChmZ2V0ZmlsZWNvbihmZCwgJm9sZGNvbikgPCAwKSB7CisJCQlpZiAoZXJybm8gIT0gRU5PREFUQSkKKwkJCQlnb3RvIGVycm9yOworCQkJaWYgKG1hdGNocGF0aGNvbihwYXRoLCBzdGJ1Zi5zdF9tb2RlLCAmb2xkY29uKSA8IDApCisJCQkJZ290byBlcnJvcjsKKwkJfQorCQljb250ZXh0ID0gY29udGV4dF9uZXcob2xkY29uKTsKKwkJaWYgKCFjb250ZXh0IHx8IGNvbnRleHRfdHlwZV9zZXQoY29udGV4dCwgInN3YXBmaWxlX3QiKSkKKwkJCWdvdG8gZXJyb3I7CisJCW5ld2NvbiA9IGNvbnRleHRfc3RyKGNvbnRleHQpOworCQlpZiAoIW5ld2NvbikKKwkJCWdvdG8gZXJyb3I7CisJCS8qIGZzZXRmaWxlY29uX3JhdyBpcyBoaWRkZW4gKi8KKwkJaWYgKHN0cmNtcChvbGRjb24sIG5ld2NvbikgIT0gMCAmJiBmc2V0ZmlsZWNvbihmZCwgbmV3Y29uKSA8IDApCisJCQlnb3RvIGVycm9yOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJCWNvbnRleHRfZnJlZShjb250ZXh0KTsKKwkJCWZyZWVjb24ob2xkY29uKTsKKwkJfQorCX0KKwlyZXR1cm47CisgZXJyb3I6CisJYmJfcGVycm9yX21zZ19hbmRfZGllKCJTRUxpbnV4IHJlbGFiZWxpbmcgZmFpbGVkIik7Cit9CisjZWxzZQorIyBkZWZpbmUgbWtzd2FwX3NlbGludXhfc2V0Y29udGV4dChmZCwgcGF0aCkgKCh2b2lkKTApCisjZW5kaWYKKworLyogZnJvbSBMaW51eCAyLjYuMjMgKi8KKy8qCisgKiBNYWdpYyBoZWFkZXIgZm9yIGEgc3dhcCBhcmVhLiAuLi4gTm90ZSB0aGF0IHRoZSBmaXJzdAorICoga2lsb2J5dGUgaXMgcmVzZXJ2ZWQgZm9yIGJvb3QgbG9hZGVyIG9yIGRpc2sgbGFiZWwgc3R1ZmYuCisgKi8KK3N0cnVjdCBzd2FwX2hlYWRlcl92MSB7CisvKgljaGFyICAgICBib290Yml0c1sxMDI0XTsgICAgU3BhY2UgZm9yIGRpc2tsYWJlbCBldGMuICovCisJdWludDMyX3QgdmVyc2lvbjsgICAgICAgIC8qIHNlY29uZCBrYnl0ZSwgd29yZCAwICovCisJdWludDMyX3QgbGFzdF9wYWdlOyAgICAgIC8qIDEgKi8KKwl1aW50MzJfdCBucl9iYWRwYWdlczsgICAgLyogMiAqLworCWNoYXIgICAgIHN3c191dWlkWzE2XTsgICAvKiAzLDQsNSw2ICovCisJY2hhciAgICAgc3dzX3ZvbHVtZVsxNl07IC8qIDcsOCw5LDEwICovCisJdWludDMyX3QgcGFkZGluZ1sxMTddOyAgIC8qIDExLi4xMjcgKi8KKwl1aW50MzJfdCBiYWRwYWdlc1sxXTsgICAgLyogMTI4ICovCisJLyogdG90YWwgMTI5IDMyLWJpdCB3b3JkcyBpbiAybmQga2lsb2J5dGUgKi8KK30gRklYX0FMSUFTSU5HOworCisjZGVmaW5lIE5XT1JEUyAxMjkKKyNkZWZpbmUgaGRyICgoc3RydWN0IHN3YXBfaGVhZGVyX3YxKiliYl9jb21tb25fYnVmc2l6MSkKKworc3RydWN0IEJVR19zaXplcyB7CisJY2hhciBzd2FwX2hlYWRlcl92MV93cm9uZ1tzaXplb2YoKmhkcikgICE9IChOV09SRFMgKiA0KSA/IC0xIDogMV07CisJY2hhciBidWZzaXoxX2lzX3Rvb19zbWFsbFtDT01NT05fQlVGU0laRSA8IChOV09SRFMgKiA0KSA/IC0xIDogMV07Cit9OworCisvKiBTdG9yZWQgd2l0aG91dCB0ZXJtaW5hdGluZyBOVUwgKi8KK3N0YXRpYyBjb25zdCBjaGFyIFNXQVBTUEFDRTJbc2l6ZW9mKCJTV0FQU1BBQ0UyIiktMV0gQUxJR04xID0gIlNXQVBTUEFDRTIiOworCitpbnQgbWtzd2FwX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBta3N3YXBfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCBmZDsKKwl1bnNpZ25lZCBwYWdlc2l6ZTsKKwlvZmZfdCBsZW47CisJY29uc3QgY2hhciAqbGFiZWwgPSAiIjsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIi0xIjsgLyogYXQgbGVhc3Qgb25lIHBhcmFtICovCisJLyogVE9ETzogLXAgUEFHRVNaLCAtVSBVVUlEICovCisJZ2V0b3B0MzIoYXJndiwgIkw6IiwgJmxhYmVsKTsKKwlhcmd2ICs9IG9wdGluZDsKKworCWZkID0geG9wZW4oYXJndlswXSwgT19XUk9OTFkpOworCisJLyogRmlndXJlIG91dCBob3cgYmlnIHRoZSBkZXZpY2UgaXMgKi8KKwlsZW4gPSBnZXRfdm9sdW1lX3NpemVfaW5fYnl0ZXMoZmQsIGFyZ3ZbMV0sIDEwMjQsIC8qZXh0ZW5kOiovIDEpOworCXBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKKwlsZW4gLT0gcGFnZXNpemU7CisKKwkvKiBBbm5vdW5jZSBvdXIgaW50ZW50aW9ucyAqLworCXByaW50ZigiU2V0dGluZyB1cCBzd2Fwc3BhY2UgdmVyc2lvbiAxLCBzaXplID0gJSJPRkZfRk1UInUgYnl0ZXNcbiIsIGxlbik7CisJbWtzd2FwX3NlbGludXhfc2V0Y29udGV4dChmZCwgYXJndlswXSk7CisKKwkvKiBoZHIgaXMgemVyby1maWxsZWQgc28gZmFyLiBDbGVhciB0aGUgZmlyc3Qga2J5dGUsIG9yIGVsc2UKKwkgKiBta3N3YXAtaW5nIGZvcm1lciBGQVQgcGFydGl0aW9uIGRvZXMgTk9UIGVyYXNlIGl0cyBzaWduYXR1cmUuCisJICoKKwkgKiB1dGlsLWxpbnV4LW5nIDIuMTcuMiBjbGFpbXMgdG8gZXJhc2UgaXQgb25seSBpZiBpdCBkb2VzIG5vdCBzZWUKKwkgKiBhIHBhcnRpdGlvbiB0YWJsZSBhbmQgaXMgbm90IHJ1biBvbiB3aG9sZSBkaXNrLiAtZiBmb3JjZXMgaXQuCisJICovCisJeHdyaXRlKGZkLCBoZHIsIDEwMjQpOworCisJLyogRmlsbCB0aGUgaGVhZGVyLiAqLworCWhkci0+dmVyc2lvbiA9IDE7CisJaGRyLT5sYXN0X3BhZ2UgPSAodW9mZl90KWxlbiAvIHBhZ2VzaXplOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX01LU1dBUF9VVUlEKSB7CisJCWNoYXIgdXVpZF9zdHJpbmdbMzJdOworCQlnZW5lcmF0ZV91dWlkKCh2b2lkKiloZHItPnN3c191dWlkKTsKKwkJYmluMmhleCh1dWlkX3N0cmluZywgaGRyLT5zd3NfdXVpZCwgMTYpOworCQkvKiBmLmUuIFVVSUQ9ZGZkOWMxNzMtYmU1Mi00ZDI3LTk5YTUtYzM0YzZjMmZmNTVmICovCisJCXByaW50ZigiVVVJRD0lLjhzIiAgIi0lLjRzLSUuNHMtJS40cy0lLjEyc1xuIiwKKwkJCXV1aWRfc3RyaW5nLAorCQkJdXVpZF9zdHJpbmcrOCwKKwkJCXV1aWRfc3RyaW5nKzgrNCwKKwkJCXV1aWRfc3RyaW5nKzgrNCs0LAorCQkJdXVpZF9zdHJpbmcrOCs0KzQrNAorCQkpOworCX0KKwlzYWZlX3N0cm5jcHkoaGRyLT5zd3Nfdm9sdW1lLCBsYWJlbCwgMTYpOworCisJLyogV3JpdGUgdGhlIGhlYWRlci4gIFN5bmMgdG8gZGlzayBiZWNhdXNlIHNvbWUga2VybmVsIHZlcnNpb25zIGNoZWNrCisJICogc2lnbmF0dXJlIG9uIGRpc2sgKG5vdCBpbiBjYWNoZSkgZHVyaW5nIHN3YXBvbi4gKi8KKwl4d3JpdGUoZmQsIGhkciwgTldPUkRTICogNCk7CisJeGxzZWVrKGZkLCBwYWdlc2l6ZSAtIDEwLCBTRUVLX1NFVCk7CisJeHdyaXRlKGZkLCBTV0FQU1BBQ0UyLCAxMCk7CisJZnN5bmMoZmQpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShmZCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvbW9yZS5jIGIvdXRpbC1saW51eC9tb3JlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5NTcxMwotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvbW9yZS5jCkBAIC0wLDAgKzEsMjEyIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBNaW5pIG1vcmUgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgYnkgQnJ1Y2UgUGVyZW5zIDxicnVjZUBwaXhhci5jb20+LgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICoKKyAqIExhdGVzdCB2ZXJzaW9uIGJsZW5kZWQgdG9nZXRoZXIgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPiwKKyAqIGJhc2VkIG9uIHRoZSBvcmlnaW5hbCBtb3JlIGltcGxlbWVudGF0aW9uIGJ5IEJydWNlLCBhbmQgY29kZSBmcm9tIHRoZQorICogRGViaWFuIGJvb3QtZmxvcHBpZXMgdGVhbS4KKyAqCisgKiBUZXJtaW9zIGNvcnJlY3RzIGJ5IFZsYWRpbWlyIE9sZXluaWsgPGR6b0BzaW10cmVhcy5ydT4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBtb3JlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbRklMRV0uLi4iCisvL3VzYWdlOiNkZWZpbmUgbW9yZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlZpZXcgRklMRSAob3Igc3RkaW4pIG9uZSBzY3JlZW5mdWwgYXQgYSB0aW1lIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBtb3JlX2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIGRtZXNnIHwgbW9yZVxuIgorCisjaW5jbHVkZSAibGliYmIuaCIKKworLyogU3VwcG9ydCBmb3IgRkVBVFVSRV9VU0VfVEVSTUlPUyAqLworCitzdHJ1Y3QgZ2xvYmFscyB7CisJaW50IGNpbl9maWxlbm87CisJc3RydWN0IHRlcm1pb3MgaW5pdGlhbF9zZXR0aW5nczsKKwlzdHJ1Y3QgdGVybWlvcyBuZXdfc2V0dGluZ3M7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIElOSVRfRygpICgodm9pZCkwKQorI2RlZmluZSBpbml0aWFsX3NldHRpbmdzIChHLmluaXRpYWxfc2V0dGluZ3MpCisjZGVmaW5lIG5ld19zZXR0aW5ncyAgICAgKEcubmV3X3NldHRpbmdzICAgICkKKyNkZWZpbmUgY2luX2ZpbGVubyAgICAgICAoRy5jaW5fZmlsZW5vICAgICAgKQorCisjZGVmaW5lIHNldFRlcm1TZXR0aW5ncyhmZCwgYXJncCkgXAorZG8geyBcCisJaWYgKEVOQUJMRV9GRUFUVVJFX1VTRV9URVJNSU9TKSBcCisJCXRjc2V0YXR0cihmZCwgVENTQU5PVywgYXJncCk7IFwKK30gd2hpbGUgKDApCisjZGVmaW5lIGdldFRlcm1TZXR0aW5ncyhmZCwgYXJncCkgdGNnZXRhdHRyKGZkLCBhcmdwKQorCitzdGF0aWMgdm9pZCBnb3RzaWcoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJLyogYmJfcHV0Y2hhcl9zdGRlcnIgZG9lc24ndCB1c2Ugc3RkaW8gYnVmZmVyaW5nLAorCSAqIHRoZXJlZm9yZSBpdCBpcyBzYWZlIGluIHNpZ25hbCBoYW5kbGVyICovCisJYmJfcHV0Y2hhcl9zdGRlcnIoJ1xuJyk7CisJc2V0VGVybVNldHRpbmdzKGNpbl9maWxlbm8sICZpbml0aWFsX3NldHRpbmdzKTsKKwlfZXhpdChFWElUX0ZBSUxVUkUpOworfQorCisjZGVmaW5lIENPTlZFUlRFRF9UQUJfU0laRSA4CisKK2ludCBtb3JlX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBtb3JlX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgYyA9IGM7IC8qIGZvciBjb21waWxlciAqLworCWludCBsaW5lczsKKwlpbnQgaW5wdXQgPSAwOworCWludCBzcGFjZXMgPSAwOworCWludCBwbGVhc2VfZGlzcGxheV9tb3JlX3Byb21wdDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlGSUxFICpmaWxlOworCUZJTEUgKmNpbjsKKwlpbnQgbGVuOworCXVuc2lnbmVkIHRlcm1pbmFsX3dpZHRoOworCXVuc2lnbmVkIHRlcm1pbmFsX2hlaWdodDsKKworCUlOSVRfRygpOworCisJYXJndisrOworCS8qIEFub3RoZXIgcG9wdWxhciBwYWdlciwgbW9zdCwgZGV0ZWN0cyB3aGVuIHN0ZG91dAorCSAqIGlzIG5vdCBhIHR0eSBhbmQgdHVybnMgaW50byBjYXQuIFRoaXMgbWFrZXMgc2Vuc2UuICovCisJaWYgKCFpc2F0dHkoU1RET1VUX0ZJTEVOTykpCisJCXJldHVybiBiYl9jYXQoYXJndik7CisJY2luID0gZm9wZW5fZm9yX3JlYWQoQ1VSUkVOVF9UVFkpOworCWlmICghY2luKQorCQlyZXR1cm4gYmJfY2F0KGFyZ3YpOworCisJaWYgKEVOQUJMRV9GRUFUVVJFX1VTRV9URVJNSU9TKSB7CisJCWNpbl9maWxlbm8gPSBmaWxlbm8oY2luKTsKKwkJZ2V0VGVybVNldHRpbmdzKGNpbl9maWxlbm8sICZpbml0aWFsX3NldHRpbmdzKTsKKwkJbmV3X3NldHRpbmdzID0gaW5pdGlhbF9zZXR0aW5nczsKKwkJbmV3X3NldHRpbmdzLmNfbGZsYWcgJj0gfihJQ0FOT04gfCBFQ0hPKTsKKwkJbmV3X3NldHRpbmdzLmNfY2NbVk1JTl0gPSAxOworCQluZXdfc2V0dGluZ3MuY19jY1tWVElNRV0gPSAwOworCQlzZXRUZXJtU2V0dGluZ3MoY2luX2ZpbGVubywgJm5ld19zZXR0aW5ncyk7CisJCWJiX3NpZ25hbHMoMAorCQkJKyAoMSA8PCBTSUdJTlQpCisJCQkrICgxIDw8IFNJR1FVSVQpCisJCQkrICgxIDw8IFNJR1RFUk0pCisJCQksIGdvdHNpZyk7CisJfQorCisJZG8geworCQlmaWxlID0gc3RkaW47CisJCWlmICgqYXJndikgeworCQkJZmlsZSA9IGZvcGVuX29yX3dhcm4oKmFyZ3YsICJyIik7CisJCQlpZiAoIWZpbGUpCisJCQkJY29udGludWU7CisJCX0KKwkJc3Quc3Rfc2l6ZSA9IDA7CisJCWZzdGF0KGZpbGVubyhmaWxlKSwgJnN0KTsKKworCQlwbGVhc2VfZGlzcGxheV9tb3JlX3Byb21wdCA9IDA7CisJCS8qIG5ldmVyIHJldHVybnMgdywgaCA8PSAxICovCisJCWdldF90ZXJtaW5hbF93aWR0aF9oZWlnaHQoZmlsZW5vKGNpbiksICZ0ZXJtaW5hbF93aWR0aCwgJnRlcm1pbmFsX2hlaWdodCk7CisJCXRlcm1pbmFsX2hlaWdodCAtPSAxOworCisJCWxlbiA9IDA7CisJCWxpbmVzID0gMDsKKwkJd2hpbGUgKHNwYWNlcyB8fCAoYyA9IGdldGMoZmlsZSkpICE9IEVPRikgeworCQkJaW50IHdyYXA7CisJCQlpZiAoc3BhY2VzKQorCQkJCXNwYWNlcy0tOworIGxvb3BfdG9wOgorCQkJaWYgKGlucHV0ICE9ICdyJyAmJiBwbGVhc2VfZGlzcGxheV9tb3JlX3Byb21wdCkgeworCQkJCWxlbiA9IHByaW50ZigiLS1Nb3JlLS0gIik7CisJCQkJaWYgKHN0LnN0X3NpemUgIT0gMCkgeworCQkJCQl1b2ZmX3QgZCA9ICh1b2ZmX3Qpc3Quc3Rfc2l6ZSAvIDEwMDsKKwkJCQkJaWYgKGQgPT0gMCkKKwkJCQkJCWQgPSAxOworCQkJCQlsZW4gKz0gcHJpbnRmKCIoJXUlJSBvZiAlIk9GRl9GTVQidSBieXRlcykiLAorCQkJCQkJKGludCkgKCh1b2ZmX3QpZnRlbGxvKGZpbGUpIC8gZCksCisJCQkJCQlzdC5zdF9zaXplKTsKKwkJCQl9CisJCQkJZmZsdXNoX2FsbCgpOworCisJCQkJLyoKKwkJCQkgKiBXZSd2ZSBqdXN0IGRpc3BsYXllZCB0aGUgIi0tTW9yZS0tIiBwcm9tcHQsIHNvIG5vdyB3ZSBuZWVkCisJCQkJICogdG8gZ2V0IGlucHV0IGZyb20gdGhlIHVzZXIuCisJCQkJICovCisJCQkJZm9yICg7OykgeworCQkJCQlpbnB1dCA9IGdldGMoY2luKTsKKwkJCQkJaW5wdXQgPSB0b2xvd2VyKGlucHV0KTsKKwkJCQkJaWYgKCFFTkFCTEVfRkVBVFVSRV9VU0VfVEVSTUlPUykKKwkJCQkJCXByaW50ZigiXDAzM1tBIik7IC8qIGN1cnNvciB1cCAqLworCQkJCQkvKiBFcmFzZSB0aGUgbGFzdCBtZXNzYWdlICovCisJCQkJCXByaW50ZigiXHIlKnNcciIsIGxlbiwgIiIpOworCisJCQkJCS8qIER1ZSB0byB2YXJpb3VzIG11bHRpYnl0ZSBlc2NhcGUKKwkJCQkJICogc2VxdWVuY2VzLCBpdCdzIG5vdCBvayB0byBhY2NlcHQKKwkJCQkJICogYW55IGlucHV0IGFzIGEgY29tbWFuZCB0byBzY3JvbGwKKwkJCQkJICogdGhlIHNjcmVlbi4gV2Ugb25seSBhbGxvdyBrbm93bgorCQkJCQkgKiBjb21tYW5kcywgZWxzZSB3ZSBzaG93IGhlbHAgbXNnLiAqLworCQkJCQlpZiAoaW5wdXQgPT0gJyAnIHx8IGlucHV0ID09ICdcbicgfHwgaW5wdXQgPT0gJ3EnIHx8IGlucHV0ID09ICdyJykKKwkJCQkJCWJyZWFrOworCQkJCQlsZW4gPSBwcmludGYoIihFbnRlcjpuZXh0IGxpbmUgU3BhY2U6bmV4dCBwYWdlIFE6cXVpdCBSOnNob3cgdGhlIHJlc3QpIik7CisJCQkJfQorCQkJCWxlbiA9IDA7CisJCQkJbGluZXMgPSAwOworCQkJCXBsZWFzZV9kaXNwbGF5X21vcmVfcHJvbXB0ID0gMDsKKworCQkJCWlmIChpbnB1dCA9PSAncScpCisJCQkJCWdvdG8gZW5kOworCisJCQkJLyogVGhlIHVzZXIgbWF5IGhhdmUgcmVzaXplZCB0aGUgdGVybWluYWwuCisJCQkJICogUmUtcmVhZCB0aGUgZGltZW5zaW9ucy4gKi8KKwkJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfVVNFX1RFUk1JT1MpIHsKKwkJCQkJZ2V0X3Rlcm1pbmFsX3dpZHRoX2hlaWdodChjaW5fZmlsZW5vLCAmdGVybWluYWxfd2lkdGgsICZ0ZXJtaW5hbF9oZWlnaHQpOworCQkJCQl0ZXJtaW5hbF9oZWlnaHQgLT0gMTsKKwkJCQl9CisJCQl9CisKKwkJCS8qIENydWRlbHkgY29udmVydCB0YWJzIGludG8gc3BhY2VzLCB3aGljaCBhcmUKKwkJCSAqIGEgYmFqaWxsaW9uIHRpbWVzIGVhc2llciB0byBkZWFsIHdpdGguICovCisJCQlpZiAoYyA9PSAnXHQnKSB7CisJCQkJc3BhY2VzID0gKCh1bnNpZ25lZCl+bGVuKSAlIENPTlZFUlRFRF9UQUJfU0laRTsKKwkJCQljID0gJyAnOworCQkJfQorCisJCQkvKgorCQkJICogVGhlcmUgYXJlIHR3byBpbnB1dCBzdHJlYW1zIHRvIHdvcnJ5IGFib3V0IGhlcmU6CisJCQkgKgorCQkJICogYyAgICA6IHRoZSBjaGFyYWN0ZXIgd2UgYXJlIHJlYWRpbmcgZnJvbSB0aGUgZmlsZSBiZWluZyAibW9yZWQiCisJCQkgKiBpbnB1dDogYSBjaGFyYWN0ZXIgcmVjZWl2ZWQgZnJvbSB0aGUga2V5Ym9hcmQKKwkJCSAqCisJCQkgKiBJZiB3ZSBoaXQgYSBuZXdsaW5lIGluIHRoZSBfZmlsZV8gc3RyZWFtLCB3ZSB3YW50IHRvIHRlc3QgYW5kCisJCQkgKiBzZWUgaWYgYW55IGNoYXJhY3RlcnMgaGF2ZSBiZWVuIGhpdCBpbiB0aGUgX2lucHV0XyBzdHJlYW0uIFRoaXMKKwkJCSAqIGFsbG93cyB0aGUgdXNlciB0byBxdWl0IHdoaWxlIGluIHRoZSBtaWRkbGUgb2YgYSBmaWxlLgorCQkJICovCisJCQl3cmFwID0gKCsrbGVuID4gdGVybWluYWxfd2lkdGgpOworCQkJaWYgKGMgPT0gJ1xuJyB8fCB3cmFwKSB7CisJCQkJLyogVGhlbiBvdXRwdXR0aW5nIHRoaXMgY2hhcmFjdGVyCisJCQkJICogd2lsbCBtb3ZlIHVzIHRvIGEgbmV3IGxpbmUuICovCisJCQkJaWYgKCsrbGluZXMgPj0gdGVybWluYWxfaGVpZ2h0IHx8IGlucHV0ID09ICdcbicpCisJCQkJCXBsZWFzZV9kaXNwbGF5X21vcmVfcHJvbXB0ID0gMTsKKwkJCQlsZW4gPSAwOworCQkJfQorCQkJaWYgKGMgIT0gJ1xuJyAmJiB3cmFwKSB7CisJCQkJLyogVGhlbiBvdXRwdXR0aW5nIHRoaXMgd2lsbCBhbHNvIHB1dCBhIGNoYXJhY3RlciBvbgorCQkJCSAqIHRoZSBiZWdpbm5pbmcgb2YgdGhhdCBuZXcgbGluZS4gVGh1cyB3ZSBmaXJzdCB3YW50IHRvCisJCQkJICogZGlzcGxheSB0aGUgcHJvbXB0IChpZiBhbnkpLCBzbyB3ZSBza2lwIHRoZSBwdXRjaGFyKCkKKwkJCQkgKiBhbmQgZ28gYmFjayB0byB0aGUgdG9wIG9mIHRoZSBsb29wLCB3aXRob3V0IHJlYWRpbmcKKwkJCQkgKiBhIG5ldyBjaGFyYWN0ZXIuICovCisJCQkJZ290byBsb29wX3RvcDsKKwkJCX0KKwkJCS8qIE15IHNtYWxsIG1pbmQgY2Fubm90IGZhdGhvbSBiYWNrc3BhY2VzIGFuZCBVVEYtOCAqLworCQkJcHV0Y2hhcihjKTsKKwkJCWRpZV9pZl9mZXJyb3Jfc3Rkb3V0KCk7IC8qIGlmIHR0eSB3YXMgZGVzdHJveWVkIChjbG9zZWQgeHRlcm0sIGV0YykgKi8KKwkJfQorCQlmY2xvc2UoZmlsZSk7CisJCWZmbHVzaF9hbGwoKTsKKwl9IHdoaWxlICgqYXJndiAmJiAqKythcmd2KTsKKyBlbmQ6CisJc2V0VGVybVNldHRpbmdzKGNpbl9maWxlbm8sICZpbml0aWFsX3NldHRpbmdzKTsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvbW91bnQuYyBiL3V0aWwtbGludXgvbW91bnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDA1OTA5Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9tb3VudC5jCkBAIC0wLDAgKzEsMjQwNSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBtb3VudCBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5NSwgMTk5NiBieSBCcnVjZSBQZXJlbnMgPGJydWNlQHBpeGFyLmNvbT4uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTktMjAwNCBieSBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlbkBjb2RlcG9ldC5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUtMjAwNiBieSBSb2IgTGFuZGxleSA8cm9iQGxhbmRsZXkubmV0PgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKy8vIERlc2lnbiBub3RlczogVGhlcmUgaXMgbm8gc3BlYyBmb3IgbW91bnQuICBSZW1pbmQgbWUgdG8gd3JpdGUgb25lLgorLy8KKy8vIG1vdW50X21haW4oKSBjYWxscyBzaW5nbGVtb3VudCgpIHdoaWNoIGNhbGxzIG1vdW50X2l0X25vdygpLgorLy8KKy8vIG1vdW50X21haW4oKSBjYW4gbG9vcCB0aHJvdWdoIC9ldGMvZnN0YWIgZm9yIG1vdW50IC1hCisvLyBzaW5nbGVtb3VudCgpIGNhbiBsb29wIHRocm91Z2ggL2V0Yy9maWxlc3lzdGVtcyBmb3IgZnN0eXBlIGRldGVjdGlvbi4KKy8vIG1vdW50X2l0X25vdygpIGRvZXMgdGhlIGFjdHVhbCBtb3VudC4KKy8vCisKKy8vY29uZmlnOmNvbmZpZyBNT1VOVAorLy9jb25maWc6CWJvb2wgIm1vdW50IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CXNlbGVjdCBQTEFURk9STV9MSU5VWAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEFsbCBmaWxlcyBhbmQgZmlsZXN5c3RlbXMgaW4gVW5peCBhcmUgYXJyYW5nZWQgaW50byBvbmUgYmlnIGRpcmVjdG9yeQorLy9jb25maWc6CSAgdHJlZS4gVGhlICdtb3VudCcgdXRpbGl0eSBpcyB1c2VkIHRvIGdyYWZ0IGEgZmlsZXN5c3RlbSBvbnRvIGEKKy8vY29uZmlnOgkgIHBhcnRpY3VsYXIgcGFydCBvZiB0aGUgdHJlZS4gQSBmaWxlc3lzdGVtIGNhbiBlaXRoZXIgbGl2ZSBvbiBhIGJsb2NrCisvL2NvbmZpZzoJICBkZXZpY2UsIG9yIGl0IGNhbiBiZSBhY2Nlc3NpYmxlIG92ZXIgdGhlIG5ldHdvcmssIGFzIGlzIHRoZSBjYXNlIHdpdGgKKy8vY29uZmlnOgkgIE5GUyBmaWxlc3lzdGVtcy4gTW9zdCBwZW9wbGUgdXNpbmcgQnVzeUJveCB3aWxsIGFsc28gd2FudCB0byBlbmFibGUKKy8vY29uZmlnOgkgIHRoZSAnbW91bnQnIHV0aWxpdHkuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX01PVU5UX0ZBS0UKKy8vY29uZmlnOglib29sICJTdXBwb3J0IG9wdGlvbiAtZiIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIE1PVU5UCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHN1cHBvcnQgZm9yIGZha2luZyBhIGZpbGUgc3lzdGVtIG1vdW50LgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9NT1VOVF9WRVJCT1NFCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCBvcHRpb24gLXYiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBNT1VOVAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBtdWx0aS1sZXZlbCAtdlt2di4uLl0gdmVyYm9zZSBtZXNzYWdlcy4gVXNlZnVsIGlmIHlvdQorLy9jb25maWc6CSAgZGVidWcgbW91bnQgcHJvYmxlbXMgYW5kIHdhbnQgdG8gc2VlIHdoYXQgaXMgZXhhY3RseSBwYXNzZWQKKy8vY29uZmlnOgkgIHRvIHRoZSBrZXJuZWwuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX01PVU5UX0hFTFBFUlMKKy8vY29uZmlnOglib29sICJTdXBwb3J0IG1vdW50IGhlbHBlcnMiCisvL2NvbmZpZzoJZGVmYXVsdCBuCisvL2NvbmZpZzoJZGVwZW5kcyBvbiBNT1VOVAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBtb3VudGluZyBvZiB2aXJ0dWFsIGZpbGUgc3lzdGVtcyB2aWEgZXh0ZXJuYWwgaGVscGVycy4KKy8vY29uZmlnOgkgIEUuZy4gIm1vdW50IG9iZXhmcyMtYjAwLjExLjIyLjMzLjQ0LjU1IC9tbnQiIHdpbGwgaW4gZWZmZWN0IGNhbGwKKy8vY29uZmlnOgkgICJvYmV4ZnMgLWIwMC4xMS4yMi4zMy40NC41NSAvbW50IgorLy9jb25maWc6CSAgQWxzbyAibW91bnQgLXQgc29tZXR5cGUgWy1vIG9wdHNdIGZzIC9tbnQiIHdpbGwgdHJ5CisvL2NvbmZpZzoJICAic29tZXR5cGUgWy1vIG9wdHNdIGZzIC9tbnQiIGlmIHNpbXBsZSBtb3VudCBzeXNjYWxsIGZhaWxzLgorLy9jb25maWc6CSAgVGhlIGlkZWEgaXMgdG8gdXNlIHN1Y2ggdmlydHVhbCBmaWxlc3lzdGVtcyBpbiAvZXRjL2ZzdGFiLgorLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9NT1VOVF9MQUJFTAorLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgc3BlY2lmeWluZyBkZXZpY2VzIGJ5IGxhYmVsIG9yIFVVSUQiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBNT1VOVAorLy9jb25maWc6CXNlbGVjdCBWT0xVTUVJRAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRoaXMgYWxsb3dzIGZvciBzcGVjaWZ5aW5nIGEgZGV2aWNlIGJ5IGxhYmVsIG9yIHV1aWQsIHJhdGhlciB0aGFuIGJ5CisvL2NvbmZpZzoJICBuYW1lLiBUaGlzIGZlYXR1cmUgdXRpbGl6ZXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBibGtpZC9maW5kZnMuCisvL2NvbmZpZzoJICBUaGlzIGFsc28gZW5hYmxlcyBsYWJlbCBvciB1dWlkIHN1cHBvcnQgZm9yIHN3YXBvbi4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfTU9VTlRfTkZTCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCBtb3VudGluZyBORlMgZmlsZSBzeXN0ZW1zIG9uIExpbnV4IDwgMi42LjIzIgorLy9jb25maWc6CWRlZmF1bHQgbgorLy9jb25maWc6CWRlcGVuZHMgb24gTU9VTlQKKy8vY29uZmlnOglzZWxlY3QgRkVBVFVSRV9IQVZFX1JQQworLy9jb25maWc6CXNlbGVjdCBGRUFUVVJFX1NZU0xPRworLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEVuYWJsZSBtb3VudGluZyBvZiBORlMgZmlsZSBzeXN0ZW1zIG9uIExpbnV4IGtlcm5lbHMgcHJpb3IKKy8vY29uZmlnOgkgIHRvIHZlcnNpb24gMi42LjIzLiBOb3RlIHRoYXQgaW4gdGhpcyBjYXNlIG1vdW50aW5nIG9mIE5GUworLy9jb25maWc6CSAgb3ZlciBJUHY2IHdpbGwgbm90IGJlIHBvc3NpYmxlLgorLy9jb25maWc6CisvL2NvbmZpZzoJICBOb3RlIHRoYXQgdGhpcyBvcHRpb24gbGlua3MgaW4gUlBDIHN1cHBvcnQgZnJvbSBsaWJjLAorLy9jb25maWc6CSAgd2hpY2ggaXMgcmF0aGVyIGxhcmdlICh+MTAga2J5dGVzIG9uIHVjbGliYykuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX01PVU5UX0NJRlMKKy8vY29uZmlnOglib29sICJTdXBwb3J0IG1vdW50aW5nIENJRlMvU01CIGZpbGUgc3lzdGVtcyIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIE1PVU5UCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgRW5hYmxlIHN1cHBvcnQgZm9yIHNhbWJhIG1vdW50cy4KKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfTU9VTlRfRkxBR1MKKy8vY29uZmlnOglkZXBlbmRzIG9uIE1PVU5UCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCBsb3RzIG9mIC1vIGZsYWdzIGluIG1vdW50IgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFdpdGhvdXQgdGhpcywgbW91bnQgb25seSBzdXBwb3J0cyByby9ydy9yZW1vdW50LiBXaXRoIHRoaXMsIGl0CisvL2NvbmZpZzoJICBzdXBwb3J0cyBub3N1aWQsIHN1aWQsIGRldiwgbm9kZXYsIGV4ZWMsIG5vZXhlYywgc3luYywgYXN5bmMsIGF0aW1lLAorLy9jb25maWc6CSAgbm9hdGltZSwgZGlyYXRpbWUsIG5vZGlyYXRpbWUsIGxvdWQsIGJpbmQsIG1vdmUsIHNoYXJlZCwgc2xhdmUsCisvL2NvbmZpZzoJICBwcml2YXRlLCB1bmJpbmRhYmxlLCByc2hhcmVkLCByc2xhdmUsIHJwcml2YXRlLCBhbmQgcnVuYmluZGFibGUuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX01PVU5UX0ZTVEFCCisvL2NvbmZpZzoJZGVwZW5kcyBvbiBNT1VOVAorLy9jb25maWc6CWJvb2wgIlN1cHBvcnQgL2V0Yy9mc3RhYiBhbmQgLWEiCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU3VwcG9ydCBtb3VudCBhbGwgYW5kIGxvb2tpbmcgZm9yIGZpbGVzIGluIC9ldGMvZnN0YWIuCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX01PVU5UX09USEVSVEFCCisvL2NvbmZpZzoJZGVwZW5kcyBvbiBGRUFUVVJFX01PVU5UX0ZTVEFCCisvL2NvbmZpZzoJYm9vbCAiU3VwcG9ydCAtVCA8YWx0X2ZzdGFiPiIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBTdXBwb3J0IG1vdW50IC1UIChzcGVjaWZ5aW5nIGFuIGFsdGVybmF0ZSBmc3RhYikKKworLy91c2FnZTojZGVmaW5lIG1vdW50X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gWy1vIE9QVF0gREVWSUNFIE5PREUiCisvL3VzYWdlOiNkZWZpbmUgbW91bnRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJNb3VudCBhIGZpbGVzeXN0ZW0uIEZpbGVzeXN0ZW0gYXV0b2RldGVjdGlvbiByZXF1aXJlcyAvcHJvYy5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJCU1vdW50IGFsbCBmaWxlc3lzdGVtcyBpbiBmc3RhYiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTU9VTlRfRkFLRSgKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTVRBQl9TVVBQT1JUKAorLy91c2FnZTogICAgICJcbgktZgkJVXBkYXRlIC9ldGMvbXRhYiwgYnV0IGRvbid0IG1vdW50IgorLy91c2FnZToJKQorLy91c2FnZToJSUZfTk9UX0ZFQVRVUkVfTVRBQl9TVVBQT1JUKAorLy91c2FnZTogICAgICJcbgktZgkJRHJ5IHJ1biIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfTU9VTlRfSEVMUEVSUygKKy8vdXNhZ2U6ICAgICAiXG4JLWkJCURvbid0IHJ1biBtb3VudCBoZWxwZXIiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX01UQUJfU1VQUE9SVCgKKy8vdXNhZ2U6ICAgICAiXG4JLW4JCURvbid0IHVwZGF0ZSAvZXRjL210YWIiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX01PVU5UX1ZFUkJPU0UoCisvL3VzYWdlOiAgICAgIlxuCS12CQlWZXJib3NlIgorLy91c2FnZToJKQorLy8vL3VzYWdlOiAgICJcbgktcwkJU2xvcHB5IChpZ25vcmVkKSIKKy8vdXNhZ2U6ICAgICAiXG4JLXIJCVJlYWQtb25seSBtb3VudCIKKy8vLy91c2FnZTogICAgICJcbgktdwkJUmVhZC13cml0ZSBtb3VudCAoZGVmYXVsdCkiCisvL3VzYWdlOiAgICAgIlxuCS10IEZTVFlQRVssLi4uXQlGaWxlc3lzdGVtIHR5cGUocykiCisvL3VzYWdlOglJRl9GRUFUVVJFX01PVU5UX09USEVSVEFCKAorLy91c2FnZTogICAgICJcbgktVCBGSUxFCQlSZWFkIEZJTEUgaW5zdGVhZCBvZiAvZXRjL2ZzdGFiIgorLy91c2FnZToJKQorLy91c2FnZTogICAgICJcbgktTyBPUFQJCU1vdW50IG9ubHkgZmlsZXN5c3RlbXMgd2l0aCBvcHRpb24gT1BUICgtYSBvbmx5KSIKKy8vdXNhZ2U6ICAgICAiXG4tbyBPUFQ6IgorLy91c2FnZToJSUZfRkVBVFVSRV9NT1VOVF9MT09QKAorLy91c2FnZTogICAgICJcbglsb29wCQlJZ25vcmVkIChsb29wIGRldmljZXMgYXJlIGF1dG9kZXRlY3RlZCkiCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX01PVU5UX0ZMQUdTKAorLy91c2FnZTogICAgICJcbglbYV1zeW5jCQlXcml0ZXMgYXJlIFthXXN5bmNocm9ub3VzIgorLy91c2FnZTogICAgICJcbglbbm9dYXRpbWUJRGlzYWJsZS9lbmFibGUgdXBkYXRlcyB0byBpbm9kZSBhY2Nlc3MgdGltZXMiCisvL3VzYWdlOiAgICAgIlxuCVtub11kaXJhdGltZQlEaXNhYmxlL2VuYWJsZSBhdGltZSB1cGRhdGVzIHRvIGRpcmVjdG9yaWVzIgorLy91c2FnZTogICAgICJcbglbbm9dcmVsYXRpbWUJRGlzYWJsZS9lbmFibGUgYXRpbWUgdXBkYXRlcyByZWxhdGl2ZSB0byBtb2RpZmljYXRpb24gdGltZSIKKy8vdXNhZ2U6ICAgICAiXG4JW25vXWRldgkJKERpcylhbGxvdyB1c2Ugb2Ygc3BlY2lhbCBkZXZpY2UgZmlsZXMiCisvL3VzYWdlOiAgICAgIlxuCVtub11leGVjCShEaXMpYWxsb3cgdXNlIG9mIGV4ZWN1dGFibGUgZmlsZXMiCisvL3VzYWdlOiAgICAgIlxuCVtub11zdWlkCShEaXMpYWxsb3cgc2V0LXVzZXItaWQtcm9vdCBwcm9ncmFtcyIKKy8vdXNhZ2U6ICAgICAiXG4JW3Jdc2hhcmVkCUNvbnZlcnQgW3JlY3Vyc2l2ZWx5XSB0byBhIHNoYXJlZCBzdWJ0cmVlIgorLy91c2FnZTogICAgICJcbglbcl1zbGF2ZQlDb252ZXJ0IFtyZWN1cnNpdmVseV0gdG8gYSBzbGF2ZSBzdWJ0cmVlIgorLy91c2FnZTogICAgICJcbglbcl1wcml2YXRlCUNvbnZlcnQgW3JlY3Vyc2l2ZWx5XSB0byBhIHByaXZhdGUgc3VidHJlZSIKKy8vdXNhZ2U6ICAgICAiXG4JW3VuXWJpbmRhYmxlCU1ha2UgbW91bnQgcG9pbnQgW3VuXWFibGUgdG8gYmUgYmluZCBtb3VudGVkIgorLy91c2FnZTogICAgICJcbglbcl1iaW5kCQlCaW5kIGEgZmlsZSBvciBkaXJlY3RvcnkgW3JlY3Vyc2l2ZWx5XSB0byBhbm90aGVyIGxvY2F0aW9uIgorLy91c2FnZTogICAgICJcbgltb3ZlCQlSZWxvY2F0ZSBhbiBleGlzdGluZyBtb3VudCBwb2ludCIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JcmVtb3VudAkJUmVtb3VudCBhIG1vdW50ZWQgZmlsZXN5c3RlbSwgY2hhbmdpbmcgZmxhZ3MiCisvL3VzYWdlOiAgICAgIlxuCXJvCQlTYW1lIGFzIC1yIgorLy91c2FnZTogICAgICJcbiIKKy8vdXNhZ2U6ICAgICAiXG5UaGVyZSBhcmUgZmlsZXN5c3RlbS1zcGVjaWZpYyAtbyBmbGFncy4iCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIG1vdW50X2V4YW1wbGVfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIkIG1vdW50XG4iCisvL3VzYWdlOiAgICAgICAiL2Rldi9oZGEzIG9uIC8gdHlwZSBtaW5peCAocncpXG4iCisvL3VzYWdlOiAgICAgICAicHJvYyBvbiAvcHJvYyB0eXBlIHByb2MgKHJ3KVxuIgorLy91c2FnZTogICAgICAgImRldnB0cyBvbiAvZGV2L3B0cyB0eXBlIGRldnB0cyAocncpXG4iCisvL3VzYWdlOiAgICAgICAiJCBtb3VudCAvZGV2L2ZkMCAvbW50IC10IG1zZG9zIC1vIHJvXG4iCisvL3VzYWdlOiAgICAgICAiJCBtb3VudCAvdG1wL2Rpc2tpbWFnZSAvb3B0IC10IGV4dDIgLW8gbG9vcFxuIgorLy91c2FnZTogICAgICAgIiQgbW91bnQgY2RfaW1hZ2UuaXNvIG15ZGlyXG4iCisvL3VzYWdlOiNkZWZpbmUgbW91bnRfbm90ZXNfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJSZXR1cm5zIDAgZm9yIHN1Y2Nlc3MsIG51bWJlciBvZiBmYWlsZWQgbW91bnRzIGZvciAtYSwgb3IgZXJybm8gZm9yIG9uZSBtb3VudC4iCisKKyNpbmNsdWRlIDxtbnRlbnQuaD4KKyNpbmNsdWRlIDxzeXNsb2cuaD4KKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4KKy8vIEdyYWIgbW9yZSBhcyBuZWVkZWQgZnJvbSB1dGlsLWxpbnV4J3MgbW91bnQvbW91bnRfY29uc3RhbnRzLmgKKyNpZm5kZWYgTVNfRElSU1lOQworIyBkZWZpbmUgTVNfRElSU1lOQyAgICAgKDEgPDwgNykgLy8gRGlyZWN0b3J5IG1vZGlmaWNhdGlvbnMgYXJlIHN5bmNocm9ub3VzCisjZW5kaWYKKyNpZm5kZWYgTVNfVU5JT04KKyMgZGVmaW5lIE1TX1VOSU9OICAgICAgICgxIDw8IDgpCisjZW5kaWYKKyNpZm5kZWYgTVNfQklORAorIyBkZWZpbmUgTVNfQklORCAgICAgICAgKDEgPDwgMTIpCisjZW5kaWYKKyNpZm5kZWYgTVNfTU9WRQorIyBkZWZpbmUgTVNfTU9WRSAgICAgICAgKDEgPDwgMTMpCisjZW5kaWYKKyNpZm5kZWYgTVNfUkVDVVJTSVZFCisjIGRlZmluZSBNU19SRUNVUlNJVkUgICAoMSA8PCAxNCkKKyNlbmRpZgorI2lmbmRlZiBNU19TSUxFTlQKKyMgZGVmaW5lIE1TX1NJTEVOVCAgICAgICgxIDw8IDE1KQorI2VuZGlmCisvLyBUaGUgc2hhcmVkIHN1YnRyZWUgc3R1ZmYsIHdoaWNoIHdlbnQgaW4gYXJvdW5kIDIuNi4xNQorI2lmbmRlZiBNU19VTkJJTkRBQkxFCisjIGRlZmluZSBNU19VTkJJTkRBQkxFICAoMSA8PCAxNykKKyNlbmRpZgorI2lmbmRlZiBNU19QUklWQVRFCisjIGRlZmluZSBNU19QUklWQVRFICAgICAoMSA8PCAxOCkKKyNlbmRpZgorI2lmbmRlZiBNU19TTEFWRQorIyBkZWZpbmUgTVNfU0xBVkUgICAgICAgKDEgPDwgMTkpCisjZW5kaWYKKyNpZm5kZWYgTVNfU0hBUkVECisjIGRlZmluZSBNU19TSEFSRUQgICAgICAoMSA8PCAyMCkKKyNlbmRpZgorI2lmbmRlZiBNU19SRUxBVElNRQorIyBkZWZpbmUgTVNfUkVMQVRJTUUgICAgKDEgPDwgMjEpCisjZW5kaWYKKyNpZm5kZWYgTVNfU1RSSUNUQVRJTUUKKyMgZGVmaW5lIE1TX1NUUklDVEFUSU1FICgxIDw8IDI0KQorI2VuZGlmCisKKy8qIEFueSB+TVNfRk9PIHZhbHVlIGhhcyB0aGlzIGJpdCBzZXQ6ICovCisjZGVmaW5lIEJCX01TX0lOVkVSVEVEX1ZBTFVFICgxdSA8PCAzMSkKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaWYgRU5BQkxFX0ZFQVRVUkVfTU9VTlRfTEFCRUwKKyMgaW5jbHVkZSAidm9sdW1lX2lkLmgiCisjZWxzZQorIyBkZWZpbmUgcmVzb2x2ZV9tb3VudF9zcGVjKGZzbmFtZSkgKCh2b2lkKTApCisjZW5kaWYKKworLy8gTmVlZGVkIGZvciBuZnMgc3VwcG9ydCBvbmx5CisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyN1bmRlZiBUUlVFCisjdW5kZWYgRkFMU0UKKworI2lmIEVOQUJMRV9GRUFUVVJFX01PVU5UX05GUworLyogVGhpcyBpcyBqdXN0IGEgd2FybmluZyBvZiBhIGNvbW1vbiBtaXN0YWtlLiAgUG9zc2libHkgdGhpcyBzaG91bGQgYmUgYQorICogdWNsaWJjIGZhcSBlbnRyeSByYXRoZXIgdGhhbiBpbiBidXN5Ym94Li4uICovCisjIGlmIGRlZmluZWQoX19VQ0xJQkNfXykgJiYgISBkZWZpbmVkKF9fVUNMSUJDX0hBU19SUENfXykKKyMgIGVycm9yICJZb3UgbmVlZCB0byBidWlsZCB1Q2xpYmMgd2l0aCBVQ0xJQkNfSEFTX1JQQyBmb3IgTkZTIHN1cHBvcnQiCisjIGVuZGlmCisjIGluY2x1ZGUgPHJwYy9ycGMuaD4KKyMgaW5jbHVkZSA8cnBjL3BtYXBfcHJvdC5oPgorIyBpbmNsdWRlIDxycGMvcG1hcF9jbG50Lmg+CisjZW5kaWYKKworCisjaWYgZGVmaW5lZChfX2RpZXRsaWJjX18pCisvLyAxNi4xMi4yMDA2LCBTYW1wbyBLZWxsb21ha2kgKHNhbXBvQGlraS5maSkKKy8vIGRpZXRsaWJjLTAuMzAgZG9lcyBub3QgaGF2ZSBpbXBsZW1lbnRhdGlvbiBvZiBnZXRtbnRlbnRfcigpCitzdGF0aWMgc3RydWN0IG1udGVudCAqZ2V0bW50ZW50X3IoRklMRSogc3RyZWFtLCBzdHJ1Y3QgbW50ZW50KiByZXN1bHQsCisJCWNoYXIqIGJ1ZmZlciBVTlVTRURfUEFSQU0sIGludCBidWZzaXplIFVOVVNFRF9QQVJBTSkKK3sKKwlzdHJ1Y3QgbW50ZW50KiBtZW50ID0gZ2V0bW50ZW50KHN0cmVhbSk7CisJcmV0dXJuIG1lbWNweShyZXN1bHQsIG1lbnQsIHNpemVvZigqbWVudCkpOworfQorI2VuZGlmCisKKworLy8gTm90IHJlYWwgZmxhZ3MsIGJ1dCB3ZSB3YW50IHRvIGJlIGFibGUgdG8gY2hlY2sgZm9yIHRoaXMuCitlbnVtIHsKKwlNT1VOVF9VU0VSUyAgPSAoMSA8PCAyOCkgKiBFTkFCTEVfREVTS1RPUCwKKwlNT1VOVF9OT0FVVE8gPSAoMSA8PCAyOSksCisJTU9VTlRfU1dBUCAgID0gKDEgPDwgMzApLAorfTsKKworCisjZGVmaW5lIE9QVElPTl9TVFIgIm86dDpyd2FuZnZzaU86IiBJRl9GRUFUVVJFX01PVU5UX09USEVSVEFCKCJUOiIpCitlbnVtIHsKKwlPUFRfbyA9ICgxIDw8IDApLAorCU9QVF90ID0gKDEgPDwgMSksCisJT1BUX3IgPSAoMSA8PCAyKSwKKwlPUFRfdyA9ICgxIDw8IDMpLAorCU9QVF9hID0gKDEgPDwgNCksCisJT1BUX24gPSAoMSA8PCA1KSwKKwlPUFRfZiA9ICgxIDw8IDYpLAorCU9QVF92ID0gKDEgPDwgNyksCisJT1BUX3MgPSAoMSA8PCA4KSwKKwlPUFRfaSA9ICgxIDw8IDkpLAorCU9QVF9PID0gKDEgPDwgMTApLAorCU9QVF9UID0gKDEgPDwgMTEpLAorfTsKKworI2lmIEVOQUJMRV9GRUFUVVJFX01UQUJfU1VQUE9SVAorI2RlZmluZSBVU0VfTVRBQiAoIShvcHRpb25fbWFzazMyICYgT1BUX24pKQorI2Vsc2UKKyNkZWZpbmUgVVNFX01UQUIgMAorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NT1VOVF9GQUtFCisjZGVmaW5lIEZBS0VfSVQgKG9wdGlvbl9tYXNrMzIgJiBPUFRfZikKKyNlbHNlCisjZGVmaW5lIEZBS0VfSVQgMAorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NT1VOVF9IRUxQRVJTCisjZGVmaW5lIEhFTFBFUlNfQUxMT1dFRCAoIShvcHRpb25fbWFzazMyICYgT1BUX2kpKQorI2Vsc2UKKyNkZWZpbmUgSEVMUEVSU19BTExPV0VEIDAKKyNlbmRpZgorCisKKy8vIFRPRE86IG1vcmUgInVzZXIiIGZsYWcgY29tcGF0aWJpbGl0eS4KKy8vICJ1c2VyIiBvcHRpb24gKGZyb20gbW91bnQgbWFucGFnZSk6CisvLyBPbmx5IHRoZSB1c2VyIHRoYXQgbW91bnRlZCBhIGZpbGVzeXN0ZW0gY2FuIHVubW91bnQgaXQgYWdhaW4uCisvLyBJZiBhbnkgdXNlciBzaG91bGQgYmUgYWJsZSB0byB1bm1vdW50LCB0aGVuIHVzZSB1c2VycyBpbnN0ZWFkIG9mIHVzZXIKKy8vIGluIHRoZSBmc3RhYiBsaW5lLiAgVGhlIG93bmVyIG9wdGlvbiBpcyBzaW1pbGFyIHRvIHRoZSB1c2VyIG9wdGlvbiwKKy8vIHdpdGggdGhlIHJlc3RyaWN0aW9uIHRoYXQgdGhlIHVzZXIgbXVzdCBiZSB0aGUgb3duZXIgb2YgdGhlIHNwZWNpYWwgZmlsZS4KKy8vIFRoaXMgbWF5IGJlIHVzZWZ1bCBlLmcuIGZvciAvZGV2L2ZkIGlmIGEgbG9naW4gc2NyaXB0IG1ha2VzCisvLyB0aGUgY29uc29sZSB1c2VyIG93bmVyIG9mIHRoaXMgZGV2aWNlLgorCisvLyBTdGFuZGFyZCBtb3VudCBvcHRpb25zIChmcm9tIC1vIG9wdGlvbnMgb3IgLS1vcHRpb25zKSwKKy8vIHdpdGggY29ycmVzcG9uZGluZyBmbGFncworc3RhdGljIGNvbnN0IGludDMyX3QgbW91bnRfb3B0aW9uc1tdID0geworCS8vIE1TX0ZMQUdTIHNldCBhIGJpdC4gIH5NU19GTEFHUyBkaXNhYmxlIHRoYXQgYml0LiAgMCBmbGFncyBhcmUgTk9Qcy4KKworCUlGX0ZFQVRVUkVfTU9VTlRfTE9PUCgKKwkJLyogImxvb3AiICovIDAsCisJKQorCisJSUZfRkVBVFVSRV9NT1VOVF9GU1RBQigKKwkJLyogImRlZmF1bHRzIiAqLyAwLAorCQkvKiAicXVpZXQiIDAgLSBkbyBub3QgZmlsdGVyIG91dCwgdmZhdCB3YW50cyB0byBzZWUgaXQgKi8KKwkJLyogIm5vYXV0byIgKi8gTU9VTlRfTk9BVVRPLAorCQkvKiAic3ciICAgICAqLyBNT1VOVF9TV0FQLAorCQkvKiAic3dhcCIgICAqLyBNT1VOVF9TV0FQLAorCQlJRl9ERVNLVE9QKC8qICJ1c2VyIiAgKi8gTU9VTlRfVVNFUlMsKQorCQlJRl9ERVNLVE9QKC8qICJ1c2VycyIgKi8gTU9VTlRfVVNFUlMsKQorCQkvKiAiX25ldGRldiIgKi8gMCwKKwkJSUZfREVTS1RPUCgvKiAiY29tbWVudD0iICovIDAsKSAvKiBzeXN0ZW1kIHVzZXMgdGhpcyBpbiBmc3RhYiAqLworCSkKKworCUlGX0ZFQVRVUkVfTU9VTlRfRkxBR1MoCisJCS8vIHZmcyBmbGFncworCQkvKiAibm9zdWlkIiAgICAgICovIE1TX05PU1VJRCwKKwkJLyogInN1aWQiICAgICAgICAqLyB+TVNfTk9TVUlELAorCQkvKiAiZGV2IiAgICAgICAgICovIH5NU19OT0RFViwKKwkJLyogIm5vZGV2IiAgICAgICAqLyBNU19OT0RFViwKKwkJLyogImV4ZWMiICAgICAgICAqLyB+TVNfTk9FWEVDLAorCQkvKiAibm9leGVjIiAgICAgICovIE1TX05PRVhFQywKKwkJLyogInN5bmMiICAgICAgICAqLyBNU19TWU5DSFJPTk9VUywKKwkJLyogImRpcnN5bmMiICAgICAqLyBNU19ESVJTWU5DLAorCQkvKiAiYXN5bmMiICAgICAgICovIH5NU19TWU5DSFJPTk9VUywKKwkJLyogImF0aW1lIiAgICAgICAqLyB+TVNfTk9BVElNRSwKKwkJLyogIm5vYXRpbWUiICAgICAqLyBNU19OT0FUSU1FLAorCQkvKiAiZGlyYXRpbWUiICAgICovIH5NU19OT0RJUkFUSU1FLAorCQkvKiAibm9kaXJhdGltZSIgICovIE1TX05PRElSQVRJTUUsCisJCS8qICJtYW5kIiAgICAgICAgKi8gTVNfTUFORExPQ0ssCisJCS8qICJub21hbmQiICAgICAgKi8gfk1TX01BTkRMT0NLLAorCQkvKiAicmVsYXRpbWUiICAgICovIE1TX1JFTEFUSU1FLAorCQkvKiAibm9yZWxhdGltZSIgICovIH5NU19SRUxBVElNRSwKKwkJLyogInN0cmljdGF0aW1lIiAqLyBNU19TVFJJQ1RBVElNRSwKKwkJLyogImxvdWQiICAgICAgICAqLyB+TVNfU0lMRU5ULAorCQkvKiAicmJpbmQiICAgICAgICovIE1TX0JJTkR8TVNfUkVDVVJTSVZFLAorCisJCS8vIGFjdGlvbiBmbGFncworCQkvKiAidW5pb24iICAgICAgICovIE1TX1VOSU9OLAorCQkvKiAiYmluZCIgICAgICAgICovIE1TX0JJTkQsCisJCS8qICJtb3ZlIiAgICAgICAgKi8gTVNfTU9WRSwKKwkJLyogInNoYXJlZCIgICAgICAqLyBNU19TSEFSRUQsCisJCS8qICJzbGF2ZSIgICAgICAgKi8gTVNfU0xBVkUsCisJCS8qICJwcml2YXRlIiAgICAgKi8gTVNfUFJJVkFURSwKKwkJLyogInVuYmluZGFibGUiICAqLyBNU19VTkJJTkRBQkxFLAorCQkvKiAicnNoYXJlZCIgICAgICovIE1TX1NIQVJFRHxNU19SRUNVUlNJVkUsCisJCS8qICJyc2xhdmUiICAgICAgKi8gTVNfU0xBVkV8TVNfUkVDVVJTSVZFLAorCQkvKiAicnByaXZhdGUiICAgICovIE1TX1BSSVZBVEV8TVNfUkVDVVJTSVZFLAorCQkvKiAicnVuYmluZGFibGUiICovIE1TX1VOQklOREFCTEV8TVNfUkVDVVJTSVZFLAorCSkKKworCS8vIEFsd2F5cyB1bmRlcnN0b29kLgorCS8qICJybyIgICAgICAqLyBNU19SRE9OTFksICAvLyB2ZnMgZmxhZworCS8qICJydyIgICAgICAqLyB+TVNfUkRPTkxZLCAvLyB2ZnMgZmxhZworCS8qICJyZW1vdW50IiAqLyBNU19SRU1PVU5UICAvLyBhY3Rpb24gZmxhZworfTsKKworc3RhdGljIGNvbnN0IGNoYXIgbW91bnRfb3B0aW9uX3N0cltdID0KKwlJRl9GRUFUVVJFX01PVU5UX0xPT1AoCisJCSJsb29wXDAiCisJKQorCUlGX0ZFQVRVUkVfTU9VTlRfRlNUQUIoCisJCSJkZWZhdWx0c1wwIgorCQkvLyAicXVpZXRcMCIgLSBkbyBub3QgZmlsdGVyIG91dCwgdmZhdCB3YW50cyB0byBzZWUgaXQKKwkJIm5vYXV0b1wwIgorCQkic3dcMCIKKwkJInN3YXBcMCIKKwkJSUZfREVTS1RPUCgidXNlclwwIikKKwkJSUZfREVTS1RPUCgidXNlcnNcMCIpCisJCSJfbmV0ZGV2XDAiCisJCUlGX0RFU0tUT1AoImNvbW1lbnQ9XDAiKSAvKiBzeXN0ZW1kIHVzZXMgdGhpcyBpbiBmc3RhYiAqLworCSkKKwlJRl9GRUFUVVJFX01PVU5UX0ZMQUdTKAorCQkvLyB2ZnMgZmxhZ3MKKwkJIm5vc3VpZFwwIgorCQkic3VpZFwwIgorCQkiZGV2XDAiCisJCSJub2RldlwwIgorCQkiZXhlY1wwIgorCQkibm9leGVjXDAiCisJCSJzeW5jXDAiCisJCSJkaXJzeW5jXDAiCisJCSJhc3luY1wwIgorCQkiYXRpbWVcMCIKKwkJIm5vYXRpbWVcMCIKKwkJImRpcmF0aW1lXDAiCisJCSJub2RpcmF0aW1lXDAiCisJCSJtYW5kXDAiCisJCSJub21hbmRcMCIKKwkJInJlbGF0aW1lXDAiCisJCSJub3JlbGF0aW1lXDAiCisJCSJzdHJpY3RhdGltZVwwIgorCQkibG91ZFwwIgorCQkicmJpbmRcMCIKKworCQkvLyBhY3Rpb24gZmxhZ3MKKwkJInVuaW9uXDAiCisJCSJiaW5kXDAiCisJCSJtb3ZlXDAiCisJCSJtYWtlLXNoYXJlZFwwIgorCQkibWFrZS1zbGF2ZVwwIgorCQkibWFrZS1wcml2YXRlXDAiCisJCSJtYWtlLXVuYmluZGFibGVcMCIKKwkJIm1ha2UtcnNoYXJlZFwwIgorCQkibWFrZS1yc2xhdmVcMCIKKwkJIm1ha2UtcnByaXZhdGVcMCIKKwkJIm1ha2UtcnVuYmluZGFibGVcMCIKKwkpCisKKwkvLyBBbHdheXMgdW5kZXJzdG9vZC4KKwkicm9cMCIgICAgICAgIC8vIHZmcyBmbGFnCisJInJ3XDAiICAgICAgICAvLyB2ZnMgZmxhZworCSJyZW1vdW50XDAiICAgLy8gYWN0aW9uIGZsYWcKKzsKKworCitzdHJ1Y3QgZ2xvYmFscyB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfTU9VTlRfTkZTCisJc21hbGx1aW50IG5mc19tb3VudF92ZXJzaW9uOworI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfTU9VTlRfVkVSQk9TRQorCXVuc2lnbmVkIHZlcmJvc2U7CisjZW5kaWYKKwlsbGlzdF90ICpmc2xpc3Q7CisJY2hhciBnZXRtbnRlbnRfYnVmWzFdOworfSBGSVhfQUxJQVNJTkc7CitlbnVtIHsgR0VUTU5URU5UX0JVRlNJWkUgPSBDT01NT05fQlVGU0laRSAtIG9mZnNldG9mKHN0cnVjdCBnbG9iYWxzLCBnZXRtbnRlbnRfYnVmKSB9OworI2RlZmluZSBHICgqKHN0cnVjdCBnbG9iYWxzKikmYmJfY29tbW9uX2J1ZnNpejEpCisjZGVmaW5lIG5mc19tb3VudF92ZXJzaW9uIChHLm5mc19tb3VudF92ZXJzaW9uKQorI2lmIEVOQUJMRV9GRUFUVVJFX01PVU5UX1ZFUkJPU0UKKyNkZWZpbmUgdmVyYm9zZSAgICAgICAgICAgKEcudmVyYm9zZSAgICAgICAgICApCisjZWxzZQorI2RlZmluZSB2ZXJib3NlICAgICAgICAgICAwCisjZW5kaWYKKyNkZWZpbmUgZnNsaXN0ICAgICAgICAgICAgKEcuZnNsaXN0ICAgICAgICAgICApCisjZGVmaW5lIGdldG1udGVudF9idWYgICAgIChHLmdldG1udGVudF9idWYgICAgKQorI2RlZmluZSBJTklUX0coKSBkbyB7IH0gd2hpbGUgKDApCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NVEFCX1NVUFBPUlQKKy8qCisgKiB1cGRhdGVfbXRhYl9lbnRyeV9vbl9tb3ZlKCkgaXMgdXNlZCB0byB1cGRhdGUgZW50cnkgaW4gY2FzZSBvZiBtb3VudCAtLW1vdmUuCisgKiB3ZSBhcmUgbG9va2luZyBmb3IgZXhpc3RpbmcgZW50cmllcyBtbnRfZGlyIHdoaWNoIGlzIGVxdWFsIHRvIG1udF9mc25hbWUgb2YKKyAqIGlucHV0IG1udGVudCBhbmQgcmVwbGFjZSBpdCBieSBuZXcgb25lLgorICovCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgdXBkYXRlX210YWJfZW50cnlfb25fbW92ZShjb25zdCBzdHJ1Y3QgbW50ZW50ICptcCkKK3sKKwlzdHJ1Y3QgbW50ZW50ICplbnRyaWVzLCAqbTsKKwlpbnQgaSwgY291bnQ7CisJRklMRSAqbW91bnRUYWJsZTsKKworCW1vdW50VGFibGUgPSBzZXRtbnRlbnQoYmJfcGF0aF9tdGFiX2ZpbGUsICJyIik7CisJaWYgKCFtb3VudFRhYmxlKSB7CisJCWJiX3BlcnJvcl9tc2coYmJfcGF0aF9tdGFiX2ZpbGUpOworCQlyZXR1cm47CisJfQorCisJZW50cmllcyA9IE5VTEw7CisJY291bnQgPSAwOworCXdoaWxlICgobSA9IGdldG1udGVudChtb3VudFRhYmxlKSkgIT0gTlVMTCkgeworCQllbnRyaWVzID0geHJlYWxsb2NfdmVjdG9yKGVudHJpZXMsIDMsIGNvdW50KTsKKwkJZW50cmllc1tjb3VudF0ubW50X2ZzbmFtZSA9IHhzdHJkdXAobS0+bW50X2ZzbmFtZSk7CisJCWVudHJpZXNbY291bnRdLm1udF9kaXIgPSB4c3RyZHVwKG0tPm1udF9kaXIpOworCQllbnRyaWVzW2NvdW50XS5tbnRfdHlwZSA9IHhzdHJkdXAobS0+bW50X3R5cGUpOworCQllbnRyaWVzW2NvdW50XS5tbnRfb3B0cyA9IHhzdHJkdXAobS0+bW50X29wdHMpOworCQllbnRyaWVzW2NvdW50XS5tbnRfZnJlcSA9IG0tPm1udF9mcmVxOworCQllbnRyaWVzW2NvdW50XS5tbnRfcGFzc25vID0gbS0+bW50X3Bhc3NubzsKKwkJY291bnQrKzsKKwl9CisJZW5kbW50ZW50KG1vdW50VGFibGUpOworCisJbW91bnRUYWJsZSA9IHNldG1udGVudChiYl9wYXRoX210YWJfZmlsZSwgInciKTsKKwlpZiAobW91bnRUYWJsZSkgeworCQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworCQkJaWYgKHN0cmNtcChlbnRyaWVzW2ldLm1udF9kaXIsIG1wLT5tbnRfZnNuYW1lKSAhPSAwKQorCQkJCWFkZG1udGVudChtb3VudFRhYmxlLCAmZW50cmllc1tpXSk7CisJCQllbHNlCisJCQkJYWRkbW50ZW50KG1vdW50VGFibGUsIG1wKTsKKwkJfQorCQllbmRtbnRlbnQobW91bnRUYWJsZSk7CisJfSBlbHNlIGlmIChlcnJubyAhPSBFUk9GUykKKwkJYmJfcGVycm9yX21zZyhiYl9wYXRoX210YWJfZmlsZSk7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKwkJCWZyZWUoZW50cmllc1tpXS5tbnRfZnNuYW1lKTsKKwkJCWZyZWUoZW50cmllc1tpXS5tbnRfZGlyKTsKKwkJCWZyZWUoZW50cmllc1tpXS5tbnRfdHlwZSk7CisJCQlmcmVlKGVudHJpZXNbaV0ubW50X29wdHMpOworCQl9CisJCWZyZWUoZW50cmllcyk7CisJfQorfQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NT1VOVF9WRVJCT1NFCitzdGF0aWMgaW50IHZlcmJvc2VfbW91bnQoY29uc3QgY2hhciAqc291cmNlLCBjb25zdCBjaGFyICp0YXJnZXQsCisJCWNvbnN0IGNoYXIgKmZpbGVzeXN0ZW10eXBlLAorCQl1bnNpZ25lZCBsb25nIG1vdW50ZmxhZ3MsIGNvbnN0IHZvaWQgKmRhdGEpCit7CisJaW50IHJjOworCisJZXJybm8gPSAwOworCXJjID0gbW91bnQoc291cmNlLCB0YXJnZXQsIGZpbGVzeXN0ZW10eXBlLCBtb3VudGZsYWdzLCBkYXRhKTsKKwlpZiAodmVyYm9zZSA+PSAyKQorCQliYl9wZXJyb3JfbXNnKCJtb3VudCgnJXMnLCclcycsJyVzJywweCUwOGx4LCclcycpOiVkIiwKKwkJCXNvdXJjZSwgdGFyZ2V0LCBmaWxlc3lzdGVtdHlwZSwKKwkJCW1vdW50ZmxhZ3MsIChjaGFyKilkYXRhLCByYyk7CisJcmV0dXJuIHJjOworfQorI2Vsc2UKKyNkZWZpbmUgdmVyYm9zZV9tb3VudCguLi4pIG1vdW50KF9fVkFfQVJHU19fKQorI2VuZGlmCisKKy8vIEFwcGVuZCBtb3VudCBvcHRpb25zIHRvIHN0cmluZworc3RhdGljIHZvaWQgYXBwZW5kX21vdW50X29wdGlvbnMoY2hhciAqKm9sZG9wdHMsIGNvbnN0IGNoYXIgKm5ld29wdHMpCit7CisJaWYgKCpvbGRvcHRzICYmICoqb2xkb3B0cykgeworCQkvLyBEbyBub3QgaW5zZXJ0IG9wdGlvbnMgd2hpY2ggYXJlIGFscmVhZHkgdGhlcmUKKwkJd2hpbGUgKG5ld29wdHNbMF0pIHsKKwkJCWNoYXIgKnA7CisJCQlpbnQgbGVuID0gc3RybGVuKG5ld29wdHMpOworCQkJcCA9IHN0cmNocihuZXdvcHRzLCAnLCcpOworCQkJaWYgKHApIGxlbiA9IHAgLSBuZXdvcHRzOworCQkJcCA9ICpvbGRvcHRzOworCQkJd2hpbGUgKDEpIHsKKwkJCQlpZiAoIXN0cm5jbXAocCwgbmV3b3B0cywgbGVuKQorCQkJCSAmJiAocFtsZW5dID09ICcsJyB8fCBwW2xlbl0gPT0gJ1wwJykpCisJCQkJCWdvdG8gc2tpcDsKKwkJCQlwID0gc3RyY2hyKHAsJywnKTsKKwkJCQlpZiAoIXApIGJyZWFrOworCQkJCXArKzsKKwkJCX0KKwkJCXAgPSB4YXNwcmludGYoIiVzLCUuKnMiLCAqb2xkb3B0cywgbGVuLCBuZXdvcHRzKTsKKwkJCWZyZWUoKm9sZG9wdHMpOworCQkJKm9sZG9wdHMgPSBwOworIHNraXA6CisJCQluZXdvcHRzICs9IGxlbjsKKwkJCXdoaWxlIChuZXdvcHRzWzBdID09ICcsJykgbmV3b3B0cysrOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBmcmVlKCpvbGRvcHRzKTsKKwkJKm9sZG9wdHMgPSB4c3RyZHVwKG5ld29wdHMpOworCX0KK30KKworLy8gVXNlIHRoZSBtb3VudF9vcHRpb25zIGxpc3QgdG8gcGFyc2Ugb3B0aW9ucyBpbnRvIGZsYWdzLgorLy8gQWxzbyB1cGRhdGUgbGlzdCBvZiB1bnJlY29nbml6ZWQgb3B0aW9ucyBpZiB1bnJlY29nbml6ZWQgIT0gTlVMTAorc3RhdGljIHVuc2lnbmVkIGxvbmcgcGFyc2VfbW91bnRfb3B0aW9ucyhjaGFyICpvcHRpb25zLCBjaGFyICoqdW5yZWNvZ25pemVkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3MgPSBNU19TSUxFTlQ7CisKKwkvLyBMb29wIHRocm91Z2ggb3B0aW9ucworCWZvciAoOzspIHsKKwkJdW5zaWduZWQgaTsKKwkJY2hhciAqY29tbWEgPSBzdHJjaHIob3B0aW9ucywgJywnKTsKKwkJY29uc3QgY2hhciAqb3B0aW9uX3N0ciA9IG1vdW50X29wdGlvbl9zdHI7CisKKwkJaWYgKGNvbW1hKSAqY29tbWEgPSAnXDAnOworCisvLyBGSVhNRTogdXNlIGhhc21udG9wdCgpCisJCS8vIEZpbmQgdGhpcyBvcHRpb24gaW4gbW91bnRfb3B0aW9ucworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShtb3VudF9vcHRpb25zKTsgaSsrKSB7CisJCQl1bnNpZ25lZCBvcHRfbGVuID0gc3RybGVuKG9wdGlvbl9zdHIpOworCisJCQlpZiAoc3RybmNhc2VjbXAob3B0aW9uX3N0ciwgb3B0aW9ucywgb3B0X2xlbikgPT0gMAorCQkJICYmIChvcHRpb25zW29wdF9sZW5dID09ICdcMCcKKwkJCSAgICAvKiBvciBpcyBpdCAiY29tbWVudD0iIHRoaW5neSBpbiBmc3RhYj8gKi8KKwkJCSAgICBJRl9GRUFUVVJFX01PVU5UX0ZTVEFCKElGX0RFU0tUT1AoIHx8IG9wdGlvbl9zdHJbb3B0X2xlbi0xXSA9PSAnPScgKSkKKwkJCSAgICApCisJCQkpIHsKKwkJCQl1bnNpZ25lZCBsb25nIGZsID0gbW91bnRfb3B0aW9uc1tpXTsKKwkJCQlpZiAoZmwgJiBCQl9NU19JTlZFUlRFRF9WQUxVRSkKKwkJCQkJZmxhZ3MgJj0gZmw7CisJCQkJZWxzZQorCQkJCQlmbGFncyB8PSBmbDsKKwkJCQlnb3RvIGZvdW5kOworCQkJfQorCQkJb3B0aW9uX3N0ciArPSBvcHRfbGVuICsgMTsKKwkJfQorCQkvLyBXZSBkaWQgbm90IHJlY29nbml6ZSB0aGlzIG9wdGlvbi4KKwkJLy8gSWYgInVucmVjb2duaXplZCIgaXMgbm90IE5VTEwsIGFwcGVuZCBvcHRpb24gdGhlcmUuCisJCS8vIE5vdGUgdGhhdCB3ZSBzaG91bGQgbm90IGFwcGVuZCAqZW1wdHkqIG9wdGlvbiAtCisJCS8vIGluIHRoaXMgY2FzZSB3ZSB3YW50IHRvIHBhc3MgTlVMTCwgbm90ICIiLCB0byAiZGF0YSIKKwkJLy8gcGFyYW1ldGVyIG9mIG1vdW50KDIpIHN5c2NhbGwuCisJCS8vIFRoaXMgaXMgY3J1Y2lhbCBmb3IgZmlsZXN5c3RlbXMgdGhhdCBkb24ndCBhY2NlcHQKKwkJLy8gYW55IGFyYml0cmFyeSBtb3VudCBvcHRpb25zLCBsaWtlIGNncm91cCBmczoKKwkJLy8gIm1vdW50IC10IGNncm91cCBub25lIC9tbnQiCisJCWlmIChvcHRpb25zWzBdICYmIHVucmVjb2duaXplZCkgeworCQkJLy8gQWRkIGl0IHRvIHN0cmZsYWdzLCB0byBwYXNzIG9uIHRvIGtlcm5lbAorCQkJY2hhciAqcCA9ICp1bnJlY29nbml6ZWQ7CisJCQl1bnNpZ25lZCBsZW4gPSBwID8gc3RybGVuKHApIDogMDsKKwkJCSp1bnJlY29nbml6ZWQgPSBwID0geHJlYWxsb2MocCwgbGVuICsgc3RybGVuKG9wdGlvbnMpICsgMik7CisKKwkJCS8vIENvbW1hIHNlcGFyYXRlZCBpZiBpdCdzIG5vdCB0aGUgZmlyc3Qgb25lCisJCQlpZiAobGVuKSBwW2xlbisrXSA9ICcsJzsKKwkJCXN0cmNweShwICsgbGVuLCBvcHRpb25zKTsKKwkJfQorIGZvdW5kOgorCQlpZiAoIWNvbW1hKQorCQkJYnJlYWs7CisJCS8vIEFkdmFuY2UgdG8gbmV4dCBvcHRpb24KKwkJKmNvbW1hID0gJywnOworCQlvcHRpb25zID0gKytjb21tYTsKKwl9CisKKwlyZXR1cm4gZmxhZ3M7Cit9CisKKy8vIFJldHVybiBhIGxpc3Qgb2YgYWxsIGJsb2NrIGRldmljZSBiYWNrZWQgZmlsZXN5c3RlbXMKK3N0YXRpYyBsbGlzdF90ICpnZXRfYmxvY2tfYmFja2VkX2ZpbGVzeXN0ZW1zKHZvaWQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgZmlsZXN5c3RlbXNbMl1bc2l6ZW9mKCIvcHJvYy9maWxlc3lzdGVtcyIpXSA9IHsKKwkJIi9ldGMvZmlsZXN5c3RlbXMiLAorCQkiL3Byb2MvZmlsZXN5c3RlbXMiLAorCX07CisJY2hhciAqZnMsICpidWY7CisJbGxpc3RfdCAqbGlzdCA9IE5VTEw7CisJaW50IGk7CisJRklMRSAqZjsKKworCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspIHsKKwkJZiA9IGZvcGVuX2Zvcl9yZWFkKGZpbGVzeXN0ZW1zW2ldKTsKKwkJaWYgKCFmKSBjb250aW51ZTsKKworCQl3aGlsZSAoKGJ1ZiA9IHhtYWxsb2NfZmdldGxpbmUoZikpICE9IE5VTEwpIHsKKwkJCWlmIChpc19wcmVmaXhlZF93aXRoKGJ1ZiwgIm5vZGV2IikgJiYgaXNzcGFjZShidWZbNV0pKQorCQkJCWdvdG8gbmV4dDsKKwkJCWZzID0gc2tpcF93aGl0ZXNwYWNlKGJ1Zik7CisJCQlpZiAoKmZzID09ICcjJyB8fCAqZnMgPT0gJyonIHx8ICEqZnMpCisJCQkJZ290byBuZXh0OworCisJCQlsbGlzdF9hZGRfdG9fZW5kKCZsaXN0LCB4c3RyZHVwKGZzKSk7CisgbmV4dDoKKwkJCWZyZWUoYnVmKTsKKwkJfQorCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGZjbG9zZShmKTsKKwl9CisKKwlyZXR1cm4gbGlzdDsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQCitzdGF0aWMgdm9pZCBkZWxldGVfYmxvY2tfYmFja2VkX2ZpbGVzeXN0ZW1zKHZvaWQpCit7CisJbGxpc3RfZnJlZShmc2xpc3QsIGZyZWUpOworfQorI2Vsc2UKK3ZvaWQgZGVsZXRlX2Jsb2NrX2JhY2tlZF9maWxlc3lzdGVtcyh2b2lkKTsKKyNlbmRpZgorCisvLyBQZXJmb3JtIGFjdHVhbCBtb3VudCBvZiBzcGVjaWZpYyBmaWxlc3lzdGVtIGF0IHNwZWNpZmljIGxvY2F0aW9uLgorLy8gTkI6IG1wLT54eHggZmllbGRzIG1heSBiZSB0cmFzaGVkIG9uIGV4aXQKK3N0YXRpYyBpbnQgbW91bnRfaXRfbm93KHN0cnVjdCBtbnRlbnQgKm1wLCB1bnNpZ25lZCBsb25nIHZmc2ZsYWdzLCBjaGFyICpmaWx0ZXJvcHRzKQoreworCWludCByYyA9IDA7CisKKwlpZiAoRkFLRV9JVCkgeworCQlpZiAodmVyYm9zZSA+PSAyKQorCQkJYmJfZXJyb3JfbXNnKCJ3b3VsZCBkbyBtb3VudCgnJXMnLCclcycsJyVzJywweCUwOGx4LCclcycpIiwKKwkJCQltcC0+bW50X2ZzbmFtZSwgbXAtPm1udF9kaXIsIG1wLT5tbnRfdHlwZSwKKwkJCQl2ZnNmbGFncywgZmlsdGVyb3B0cyk7CisJCWdvdG8gbXRhYjsKKwl9CisKKwkvLyBNb3VudCwgd2l0aCBmYWxsYmFjayB0byByZWFkLW9ubHkgaWYgbmVjZXNzYXJ5LgorCWZvciAoOzspIHsKKwkJZXJybm8gPSAwOworCQlyYyA9IHZlcmJvc2VfbW91bnQobXAtPm1udF9mc25hbWUsIG1wLT5tbnRfZGlyLCBtcC0+bW50X3R5cGUsCisJCQkJdmZzZmxhZ3MsIGZpbHRlcm9wdHMpOworCisJCS8vIElmIG1vdW50IGZhaWxlZCwgdHJ5CisJCS8vIGhlbHBlciBwcm9ncmFtIG1vdW50LjxtbnRfdHlwZT4KKwkJaWYgKEhFTFBFUlNfQUxMT1dFRCAmJiByYyAmJiBtcC0+bW50X3R5cGUpIHsKKwkJCWNoYXIgKmFyZ3NbOF07CisJCQlpbnQgZXJybm9fc2F2ZSA9IGVycm5vOworCQkJYXJnc1swXSA9IHhhc3ByaW50ZigibW91bnQuJXMiLCBtcC0+bW50X3R5cGUpOworCQkJcmMgPSAxOworCQkJaWYgKEZBS0VfSVQpCisJCQkJYXJnc1tyYysrXSA9IChjaGFyICopIi1mIjsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9NVEFCX1NVUFBPUlQgJiYgIVVTRV9NVEFCKQorCQkJCWFyZ3NbcmMrK10gPSAoY2hhciAqKSItbiI7CisJCQlhcmdzW3JjKytdID0gbXAtPm1udF9mc25hbWU7CisJCQlhcmdzW3JjKytdID0gbXAtPm1udF9kaXI7CisJCQlpZiAoZmlsdGVyb3B0cykgeworCQkJCWFyZ3NbcmMrK10gPSAoY2hhciAqKSItbyI7CisJCQkJYXJnc1tyYysrXSA9IGZpbHRlcm9wdHM7CisJCQl9CisJCQlhcmdzW3JjXSA9IE5VTEw7CisJCQlyYyA9IHNwYXduX2FuZF93YWl0KGFyZ3MpOworCQkJZnJlZShhcmdzWzBdKTsKKwkJCWlmICghcmMpCisJCQkJYnJlYWs7CisJCQllcnJubyA9IGVycm5vX3NhdmU7CisJCX0KKworCQlpZiAoIXJjIHx8ICh2ZnNmbGFncyAmIE1TX1JET05MWSkgfHwgKGVycm5vICE9IEVBQ0NFUyAmJiBlcnJubyAhPSBFUk9GUykpCisJCQlicmVhazsKKwkJaWYgKCEodmZzZmxhZ3MgJiBNU19TSUxFTlQpKQorCQkJYmJfZXJyb3JfbXNnKCIlcyBpcyB3cml0ZS1wcm90ZWN0ZWQsIG1vdW50aW5nIHJlYWQtb25seSIsCisJCQkJCQltcC0+bW50X2ZzbmFtZSk7CisJCXZmc2ZsYWdzIHw9IE1TX1JET05MWTsKKwl9CisKKwkvLyBBYm9ydCBlbnRpcmVseSBpZiBwZXJtaXNzaW9uIGRlbmllZC4KKworCWlmIChyYyAmJiBlcnJubyA9PSBFUEVSTSkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3Blcm1fZGVuaWVkX2FyZV95b3Vfcm9vdCk7CisKKwkvLyBJZiB0aGUgbW91bnQgd2FzIHN1Y2Nlc3NmdWwsIGFuZCB3ZSdyZSBtYWludGFpbmluZyBhbiBvbGQtc3R5bGUKKwkvLyBtdGFiIGZpbGUgYnkgaGFuZCwgYWRkIHRoZSBuZXcgZW50cnkgdG8gaXQgbm93LgorIG10YWI6CisJaWYgKFVTRV9NVEFCICYmICFyYyAmJiAhKHZmc2ZsYWdzICYgTVNfUkVNT1VOVCkpIHsKKwkJY2hhciAqZnNuYW1lOworCQlGSUxFICptb3VudFRhYmxlID0gc2V0bW50ZW50KGJiX3BhdGhfbXRhYl9maWxlLCAiYSsiKTsKKwkJY29uc3QgY2hhciAqb3B0aW9uX3N0ciA9IG1vdW50X29wdGlvbl9zdHI7CisJCWludCBpOworCisJCWlmICghbW91bnRUYWJsZSkgeworCQkJYmJfcGVycm9yX21zZyhiYl9wYXRoX210YWJfZmlsZSk7CisJCQlnb3RvIHJldDsKKwkJfQorCisJCS8vIEFkZCB2ZnMgc3RyaW5nIGZsYWdzCisJCWZvciAoaSA9IDA7IG1vdW50X29wdGlvbnNbaV0gIT0gTVNfUkVNT1VOVDsgaSsrKSB7CisJCQlpZiAobW91bnRfb3B0aW9uc1tpXSA+IDAgJiYgKG1vdW50X29wdGlvbnNbaV0gJiB2ZnNmbGFncykpCisJCQkJYXBwZW5kX21vdW50X29wdGlvbnMoJihtcC0+bW50X29wdHMpLCBvcHRpb25fc3RyKTsKKwkJCW9wdGlvbl9zdHIgKz0gc3RybGVuKG9wdGlvbl9zdHIpICsgMTsKKwkJfQorCisJCS8vIFJlbW92ZSB0cmFpbGluZyAvIChpZiBhbnkpIGZyb20gZGlyZWN0b3J5IHdlIG1vdW50ZWQgb24KKwkJaSA9IHN0cmxlbihtcC0+bW50X2RpcikgLSAxOworCQl3aGlsZSAoaSA+IDAgJiYgbXAtPm1udF9kaXJbaV0gPT0gJy8nKQorCQkJbXAtPm1udF9kaXJbaS0tXSA9ICdcMCc7CisKKwkJLy8gQ29udmVydCB0byBjYW5vbmljYWwgcGF0aG5hbWVzIGFzIG5lZWRlZAorCQltcC0+bW50X2RpciA9IGJiX3NpbXBsaWZ5X3BhdGgobXAtPm1udF9kaXIpOworCQlmc25hbWUgPSBOVUxMOworCQlpZiAoIW1wLT5tbnRfdHlwZSB8fCAhKm1wLT5tbnRfdHlwZSkgeyAvLyBiaW5kIG1vdW50CisJCQltcC0+bW50X2ZzbmFtZSA9IGZzbmFtZSA9IGJiX3NpbXBsaWZ5X3BhdGgobXAtPm1udF9mc25hbWUpOworCQkJbXAtPm1udF90eXBlID0gKGNoYXIqKSJiaW5kIjsKKwkJfQorCQltcC0+bW50X2ZyZXEgPSBtcC0+bW50X3Bhc3NubyA9IDA7CisKKwkJLy8gV3JpdGUgYW5kIGNsb3NlCisjaWYgRU5BQkxFX0ZFQVRVUkVfTVRBQl9TVVBQT1JUCisJCWlmICh2ZnNmbGFncyAmIE1TX01PVkUpCisJCQl1cGRhdGVfbXRhYl9lbnRyeV9vbl9tb3ZlKG1wKTsKKwkJZWxzZQorI2VuZGlmCisJCQlhZGRtbnRlbnQobW91bnRUYWJsZSwgbXApOworCQllbmRtbnRlbnQobW91bnRUYWJsZSk7CisKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSB7CisJCQlmcmVlKG1wLT5tbnRfZGlyKTsKKwkJCWZyZWUoZnNuYW1lKTsKKwkJfQorCX0KKyByZXQ6CisJcmV0dXJuIHJjOworfQorCisjaWYgRU5BQkxFX0ZFQVRVUkVfTU9VTlRfTkZTCisKKy8qCisgKiBMaW51eCBORlMgbW91bnQKKyAqIENvcHlyaWdodCAoQykgMTk5MyBSaWNrIFNsYWRrZXkgPGpyc0B3b3JsZC5zdGQuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICogV2VkIEZlYiAgOCAxMjo1MTo0OCAxOTk1LCBiaXJvQHlnZ2RyYXNpbC5jb20gKFJvc3MgQmlybyk6IGFsbG93IGFsbCBwb3J0CisgKiBudW1iZXJzIHRvIGJlIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorICoKKyAqIEZyaSwgOCBNYXIgMTk5NiAxODowMTozOSwgU3dlbiBUaHVlbW1sZXIgPHN3ZW5AdW5pLXBhZGVyYm9ybi5kZT46CisgKiBPbWl0IHRoZSBjYWxsIHRvIGNvbm5lY3QoKSBmb3IgTGludXggdmVyc2lvbiAxLjMuMTEgb3IgbGF0ZXIuCisgKgorICogV2VkIE9jdCAgMSAyMzo1NToyOCAxOTk3OiBEaWNrIFN0cmVlZmxhbmQgPGRpY2tfc3RyZWVmbGFuZEB0YXNraW5nLmNvbT4KKyAqIEltcGxlbWVudGVkIHRoZSAiYmciLCAiZmciIGFuZCAicmV0cnkiIG1vdW50IG9wdGlvbnMgZm9yIE5GUy4KKyAqCisgKiAxOTk5LTAyLTIyIEFya2FkaXVzeiBNaWNraWV3aWN6IDxtaXNpZWtAbWlzaWVrLmV1Lm9yZz4KKyAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKKyAqCisgKiBNb2RpZmllZCBieSBPbGFmIEtpcmNoIGFuZCBUcm9uZCBNeWtsZWJ1c3QgZm9yIG5ldyBORlMgY29kZSwKKyAqIHBsdXMgTkZTdjMgc3R1ZmYuCisgKi8KKworI2RlZmluZSBNT1VOVFBPUlQgNjM1CisjZGVmaW5lIE1OVFBBVEhMRU4gMTAyNAorI2RlZmluZSBNTlROQU1MRU4gMjU1CisjZGVmaW5lIEZIU0laRSAzMgorI2RlZmluZSBGSFNJWkUzIDY0CisKK3R5cGVkZWYgY2hhciBmaGFuZGxlW0ZIU0laRV07CisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBpbnQgZmhhbmRsZTNfbGVuOworCWNoYXIgKmZoYW5kbGUzX3ZhbDsKK30gZmhhbmRsZTM7CisKK2VudW0gbW91bnRzdGF0MyB7CisJTU5UX09LID0gMCwKKwlNTlQzRVJSX1BFUk0gPSAxLAorCU1OVDNFUlJfTk9FTlQgPSAyLAorCU1OVDNFUlJfSU8gPSA1LAorCU1OVDNFUlJfQUNDRVMgPSAxMywKKwlNTlQzRVJSX05PVERJUiA9IDIwLAorCU1OVDNFUlJfSU5WQUwgPSAyMiwKKwlNTlQzRVJSX05BTUVUT09MT05HID0gNjMsCisJTU5UM0VSUl9OT1RTVVBQID0gMTAwMDQsCisJTU5UM0VSUl9TRVJWRVJGQVVMVCA9IDEwMDA2LAorfTsKK3R5cGVkZWYgZW51bSBtb3VudHN0YXQzIG1vdW50c3RhdDM7CisKK3N0cnVjdCBmaHN0YXR1cyB7CisJdW5zaWduZWQgaW50IGZoc19zdGF0dXM7CisJdW5pb24geworCQlmaGFuZGxlIGZoc19maGFuZGxlOworCX0gZmhzdGF0dXNfdTsKK307Cit0eXBlZGVmIHN0cnVjdCBmaHN0YXR1cyBmaHN0YXR1czsKKworc3RydWN0IG1vdW50cmVzM19vayB7CisJZmhhbmRsZTMgZmhhbmRsZTsKKwlzdHJ1Y3QgeworCQl1bnNpZ25lZCBpbnQgYXV0aF9mbGF2b3Vyc19sZW47CisJCWNoYXIgKmF1dGhfZmxhdm91cnNfdmFsOworCX0gYXV0aF9mbGF2b3VyczsKK307Cit0eXBlZGVmIHN0cnVjdCBtb3VudHJlczNfb2sgbW91bnRyZXMzX29rOworCitzdHJ1Y3QgbW91bnRyZXMzIHsKKwltb3VudHN0YXQzIGZoc19zdGF0dXM7CisJdW5pb24geworCQltb3VudHJlczNfb2sgbW91bnRpbmZvOworCX0gbW91bnRyZXMzX3U7Cit9OwordHlwZWRlZiBzdHJ1Y3QgbW91bnRyZXMzIG1vdW50cmVzMzsKKwordHlwZWRlZiBjaGFyICpkaXJwYXRoOworCit0eXBlZGVmIGNoYXIgKm5hbWU7CisKK3R5cGVkZWYgc3RydWN0IG1vdW50Ym9keSAqbW91bnRsaXN0OworCitzdHJ1Y3QgbW91bnRib2R5IHsKKwluYW1lIG1sX2hvc3RuYW1lOworCWRpcnBhdGggbWxfZGlyZWN0b3J5OworCW1vdW50bGlzdCBtbF9uZXh0OworfTsKK3R5cGVkZWYgc3RydWN0IG1vdW50Ym9keSBtb3VudGJvZHk7CisKK3R5cGVkZWYgc3RydWN0IGdyb3Vwbm9kZSAqZ3JvdXBzOworCitzdHJ1Y3QgZ3JvdXBub2RlIHsKKwluYW1lIGdyX25hbWU7CisJZ3JvdXBzIGdyX25leHQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgZ3JvdXBub2RlIGdyb3Vwbm9kZTsKKwordHlwZWRlZiBzdHJ1Y3QgZXhwb3J0bm9kZSAqZXhwb3J0czsKKworc3RydWN0IGV4cG9ydG5vZGUgeworCWRpcnBhdGggZXhfZGlyOworCWdyb3VwcyBleF9ncm91cHM7CisJZXhwb3J0cyBleF9uZXh0OworfTsKK3R5cGVkZWYgc3RydWN0IGV4cG9ydG5vZGUgZXhwb3J0bm9kZTsKKworc3RydWN0IHBwYXRoY25mIHsKKwlpbnQgcGNfbGlua19tYXg7CisJc2hvcnQgcGNfbWF4X2Nhbm9uOworCXNob3J0IHBjX21heF9pbnB1dDsKKwlzaG9ydCBwY19uYW1lX21heDsKKwlzaG9ydCBwY19wYXRoX21heDsKKwlzaG9ydCBwY19waXBlX2J1ZjsKKwl1aW50OF90IHBjX3ZkaXNhYmxlOworCWNoYXIgcGNfeHh4OworCXNob3J0IHBjX21hc2tbMl07Cit9OwordHlwZWRlZiBzdHJ1Y3QgcHBhdGhjbmYgcHBhdGhjbmY7CisKKyNkZWZpbmUgTU9VTlRQUk9HIDEwMDAwNQorI2RlZmluZSBNT1VOVFZFUlMgMQorCisjZGVmaW5lIE1PVU5UUFJPQ19OVUxMIDAKKyNkZWZpbmUgTU9VTlRQUk9DX01OVCAxCisjZGVmaW5lIE1PVU5UUFJPQ19EVU1QIDIKKyNkZWZpbmUgTU9VTlRQUk9DX1VNTlQgMworI2RlZmluZSBNT1VOVFBST0NfVU1OVEFMTCA0CisjZGVmaW5lIE1PVU5UUFJPQ19FWFBPUlQgNQorI2RlZmluZSBNT1VOVFBST0NfRVhQT1JUQUxMIDYKKworI2RlZmluZSBNT1VOVFZFUlNfUE9TSVggMgorCisjZGVmaW5lIE1PVU5UUFJPQ19QQVRIQ09ORiA3CisKKyNkZWZpbmUgTU9VTlRfVjMgMworCisjZGVmaW5lIE1PVU5UUFJPQzNfTlVMTCAwCisjZGVmaW5lIE1PVU5UUFJPQzNfTU5UIDEKKyNkZWZpbmUgTU9VTlRQUk9DM19EVU1QIDIKKyNkZWZpbmUgTU9VTlRQUk9DM19VTU5UIDMKKyNkZWZpbmUgTU9VTlRQUk9DM19VTU5UQUxMIDQKKyNkZWZpbmUgTU9VTlRQUk9DM19FWFBPUlQgNQorCitlbnVtIHsKKyNpZm5kZWYgTkZTX0ZIU0laRQorCU5GU19GSFNJWkUgPSAzMiwKKyNlbmRpZgorI2lmbmRlZiBORlNfUE9SVAorCU5GU19QT1JUID0gMjA0OQorI2VuZGlmCit9OworCisvKgorICogV2Ugd2FudCB0byBiZSBhYmxlIHRvIGNvbXBpbGUgbW91bnQgb24gb2xkIGtlcm5lbHMgaW4gc3VjaCBhIHdheQorICogdGhhdCB0aGUgYmluYXJ5IHdpbGwgd29yayB3ZWxsIG9uIG1vcmUgcmVjZW50IGtlcm5lbHMuCisgKiBUaHVzLCBpZiBuZWNlc3Nhcnkgd2UgdGVhY2ggbmZzbW91bnQuYyB0aGUgc3RydWN0dXJlIG9mIG5ldyBmaWVsZHMKKyAqIHRoYXQgd2lsbCBjb21lIGxhdGVyLgorICoKKyAqIE1vcmVvdmVyLCB0aGUgbmV3IGtlcm5lbCBpbmNsdWRlcyBjb25mbGljdCB3aXRoIGdsaWJjIGluY2x1ZGVzCisgKiBzbyBpdCBpcyBlYXNpZXN0IHRvIGlnbm9yZSB0aGUga2VybmVsIGFsdG9nZXRoZXIgKGF0IGNvbXBpbGUgdGltZSkuCisgKi8KKworc3RydWN0IG5mczJfZmggeworCWNoYXIgICAgICAgICAgICBkYXRhWzMyXTsKK307CitzdHJ1Y3QgbmZzM19maCB7CisJdW5zaWduZWQgc2hvcnQgIHNpemU7CisJdW5zaWduZWQgY2hhciAgIGRhdGFbNjRdOworfTsKKworc3RydWN0IG5mc19tb3VudF9kYXRhIHsKKwlpbnQJCXZlcnNpb247CS8qIDEgKi8KKwlpbnQJCWZkOwkJLyogMSAqLworCXN0cnVjdCBuZnMyX2ZoCW9sZF9yb290OwkvKiAxICovCisJaW50CQlmbGFnczsJCS8qIDEgKi8KKwlpbnQJCXJzaXplOwkJLyogMSAqLworCWludAkJd3NpemU7CQkvKiAxICovCisJaW50CQl0aW1lbzsJCS8qIDEgKi8KKwlpbnQJCXJldHJhbnM7CS8qIDEgKi8KKwlpbnQJCWFjcmVnbWluOwkvKiAxICovCisJaW50CQlhY3JlZ21heDsJLyogMSAqLworCWludAkJYWNkaXJtaW47CS8qIDEgKi8KKwlpbnQJCWFjZGlybWF4OwkvKiAxICovCisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CS8qIDEgKi8KKwljaGFyCQlob3N0bmFtZVsyNTZdOwkvKiAxICovCisJaW50CQluYW1sZW47CQkvKiAyICovCisJdW5zaWduZWQgaW50CWJzaXplOwkJLyogMyAqLworCXN0cnVjdCBuZnMzX2ZoCXJvb3Q7CQkvKiA0ICovCit9OworCisvKiBiaXRzIGluIHRoZSBmbGFncyBmaWVsZCAqLworZW51bSB7CisJTkZTX01PVU5UX1NPRlQgPSAweDAwMDEsCS8qIDEgKi8KKwlORlNfTU9VTlRfSU5UUiA9IDB4MDAwMiwJLyogMSAqLworCU5GU19NT1VOVF9TRUNVUkUgPSAweDAwMDQsCS8qIDEgKi8KKwlORlNfTU9VTlRfUE9TSVggPSAweDAwMDgsCS8qIDEgKi8KKwlORlNfTU9VTlRfTk9DVE8gPSAweDAwMTAsCS8qIDEgKi8KKwlORlNfTU9VTlRfTk9BQyA9IDB4MDAyMCwJLyogMSAqLworCU5GU19NT1VOVF9UQ1AgPSAweDAwNDAsCQkvKiAyICovCisJTkZTX01PVU5UX1ZFUjMgPSAweDAwODAsCS8qIDMgKi8KKwlORlNfTU9VTlRfS0VSQkVST1MgPSAweDAxMDAsCS8qIDMgKi8KKwlORlNfTU9VTlRfTk9OTE0gPSAweDAyMDAsCS8qIDMgKi8KKwlORlNfTU9VTlRfTk9BQ0wgPSAweDA4MDAsCS8qIDQgKi8KKwlORlNfTU9VTlRfTk9SRElSUExVUyA9IDB4NDAwMAorfTsKKworCisvKgorICogV2UgbmVlZCB0byB0cmFuc2xhdGUgYmV0d2VlbiBuZnMgc3RhdHVzIHJldHVybiB2YWx1ZXMgYW5kCisgKiB0aGUgbG9jYWwgZXJybm8gdmFsdWVzIHdoaWNoIG1heSBub3QgYmUgdGhlIHNhbWUuCisgKgorICogQW5kcmVhcyBTY2h3YWIgPHNjaHdhYkBMUzUuaW5mb3JtYXRpay51bmktZG9ydG11bmQuZGU+OiBjaGFuZ2UgZXJybm86CisgKiAiYWZ0ZXIgI2luY2x1ZGUgPGVycm5vLmg+IHRoZSBzeW1ib2wgZXJybm8gaXMgcmVzZXJ2ZWQgZm9yIGFueSB1c2UsCisgKiAgaXQgY2Fubm90IGV2ZW4gYmUgdXNlZCBhcyBhIHN0cnVjdCB0YWcgb3IgZmllbGQgbmFtZSIuCisgKi8KKyNpZm5kZWYgRURRVU9UCisjIGRlZmluZSBFRFFVT1QgRU5PU1BDCisjZW5kaWYKKy8qIENvbnZlcnQgZWFjaCBORlNFUlJfQkxBSCBpbnRvIEVCTEFIICovCitzdGF0aWMgY29uc3QgdWludDhfdCBuZnNfZXJyX3N0YXRbXSA9IHsKKwkgMSwgIDIsICA1LCAgNiwgMTMsIDE3LAorCTE5LCAyMCwgMjEsIDIyLCAyNywgMjgsCisJMzAsIDYzLCA2NiwgNjksIDcwLCA3MQorfTsKKyNpZiAoIFwKKwlFUEVSTSB8IEVOT0VOVCAgICAgIHwgRUlPICAgICAgfCBFTlhJTyB8IEVBQ0NFU3wgRUVYSVNUIHwgXAorCUVOT0RFVnwgRU5PVERJUiAgICAgfCBFSVNESVIgICB8IEVJTlZBTHwgRUZCSUcgfCBFTk9TUEMgfCBcCisJRVJPRlMgfCBFTkFNRVRPT0xPTkd8IEVOT1RFTVBUWXwgRURRVU9UfCBFU1RBTEV8IEVSRU1PVEUpIDwgMjU2Cit0eXBlZGVmIHVpbnQ4X3QgbmZzX2Vycl90eXBlOworI2Vsc2UKK3R5cGVkZWYgdWludDE2X3QgbmZzX2Vycl90eXBlOworI2VuZGlmCitzdGF0aWMgY29uc3QgbmZzX2Vycl90eXBlIG5mc19lcnJfZXJybnVtW10gPSB7CisJRVBFUk0gLCBFTk9FTlQgICAgICAsIEVJTyAgICAgICwgRU5YSU8gLCBFQUNDRVMsIEVFWElTVCwKKwlFTk9ERVYsIEVOT1RESVIgICAgICwgRUlTRElSICAgLCBFSU5WQUwsIEVGQklHICwgRU5PU1BDLAorCUVST0ZTICwgRU5BTUVUT09MT05HLCBFTk9URU1QVFksIEVEUVVPVCwgRVNUQUxFLCBFUkVNT1RFCit9Oworc3RhdGljIGNoYXIgKm5mc19zdHJlcnJvcihpbnQgc3RhdHVzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobmZzX2Vycl9zdGF0KTsgaSsrKSB7CisJCWlmIChuZnNfZXJyX3N0YXRbaV0gPT0gc3RhdHVzKQorCQkJcmV0dXJuIHN0cmVycm9yKG5mc19lcnJfZXJybnVtW2ldKTsKKwl9CisJcmV0dXJuIHhhc3ByaW50ZigidW5rbm93biBuZnMgc3RhdHVzIHJldHVybiB2YWx1ZTogJWQiLCBzdGF0dXMpOworfQorCitzdGF0aWMgYm9vbF90IHhkcl9maGFuZGxlKFhEUiAqeGRycywgZmhhbmRsZSBvYmpwKQoreworCXJldHVybiB4ZHJfb3BhcXVlKHhkcnMsIG9ianAsIEZIU0laRSk7Cit9CisKK3N0YXRpYyBib29sX3QgeGRyX2Zoc3RhdHVzKFhEUiAqeGRycywgZmhzdGF0dXMgKm9ianApCit7CisJaWYgKCF4ZHJfdV9pbnQoeGRycywgJm9ianAtPmZoc19zdGF0dXMpKQorCQlyZXR1cm4gRkFMU0U7CisJaWYgKG9ianAtPmZoc19zdGF0dXMgPT0gMCkKKwkJcmV0dXJuIHhkcl9maGFuZGxlKHhkcnMsIG9ianAtPmZoc3RhdHVzX3UuZmhzX2ZoYW5kbGUpOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgYm9vbF90IHhkcl9kaXJwYXRoKFhEUiAqeGRycywgZGlycGF0aCAqb2JqcCkKK3sKKwlyZXR1cm4geGRyX3N0cmluZyh4ZHJzLCBvYmpwLCBNTlRQQVRITEVOKTsKK30KKworc3RhdGljIGJvb2xfdCB4ZHJfZmhhbmRsZTMoWERSICp4ZHJzLCBmaGFuZGxlMyAqb2JqcCkKK3sKKwlyZXR1cm4geGRyX2J5dGVzKHhkcnMsIChjaGFyICoqKSZvYmpwLT5maGFuZGxlM192YWwsCisJCQkodW5zaWduZWQgaW50ICopICZvYmpwLT5maGFuZGxlM19sZW4sCisJCQlGSFNJWkUzKTsKK30KKworc3RhdGljIGJvb2xfdCB4ZHJfbW91bnRyZXMzX29rKFhEUiAqeGRycywgbW91bnRyZXMzX29rICpvYmpwKQoreworCWlmICgheGRyX2ZoYW5kbGUzKHhkcnMsICZvYmpwLT5maGFuZGxlKSkKKwkJcmV0dXJuIEZBTFNFOworCXJldHVybiB4ZHJfYXJyYXkoeGRycywgJihvYmpwLT5hdXRoX2ZsYXZvdXJzLmF1dGhfZmxhdm91cnNfdmFsKSwKKwkJCSYob2JqcC0+YXV0aF9mbGF2b3Vycy5hdXRoX2ZsYXZvdXJzX2xlbiksCisJCQl+MCwKKwkJCXNpemVvZihpbnQpLAorCQkJKHhkcnByb2NfdCkgeGRyX2ludCk7Cit9CisKK3N0YXRpYyBib29sX3QgeGRyX21vdW50c3RhdDMoWERSICp4ZHJzLCBtb3VudHN0YXQzICpvYmpwKQoreworCXJldHVybiB4ZHJfZW51bSh4ZHJzLCAoZW51bV90ICopIG9ianApOworfQorCitzdGF0aWMgYm9vbF90IHhkcl9tb3VudHJlczMoWERSICp4ZHJzLCBtb3VudHJlczMgKm9ianApCit7CisJaWYgKCF4ZHJfbW91bnRzdGF0Myh4ZHJzLCAmb2JqcC0+ZmhzX3N0YXR1cykpCisJCXJldHVybiBGQUxTRTsKKwlpZiAob2JqcC0+ZmhzX3N0YXR1cyA9PSBNTlRfT0spCisJCXJldHVybiB4ZHJfbW91bnRyZXMzX29rKHhkcnMsICZvYmpwLT5tb3VudHJlczNfdS5tb3VudGluZm8pOworCXJldHVybiBUUlVFOworfQorCisjZGVmaW5lIE1BWF9ORlNQUk9UICgobmZzX21vdW50X3ZlcnNpb24gPj0gNCkgPyAzIDogMikKKworLyoKKyAqIFVuZm9ydHVuYXRlbHksIHRoZSBrZXJuZWwgcHJpbnRzIGFubm95aW5nIGNvbnNvbGUgbWVzc2FnZXMKKyAqIGluIGNhc2Ugb2YgYW4gdW5leHBlY3RlZCBuZnMgbW91bnQgdmVyc2lvbiAoaW5zdGVhZCBvZgorICoganVzdCByZXR1cm5pbmcgc29tZSBlcnJvcikuICBUaGVyZWZvcmUgd2UnbGwgaGF2ZSB0byB0cnkKKyAqIGFuZCBmaWd1cmUgb3V0IHdoYXQgdmVyc2lvbiB0aGUga2VybmVsIGV4cGVjdHMuCisgKgorICogVmFyaWFibGVzOgorICoJS0VSTkVMX05GU19NT1VOVF9WRVJTSU9OOiBrZXJuZWwgc291cmNlcyBhdCBjb21waWxlIHRpbWUKKyAqCU5GU19NT1VOVF9WRVJTSU9OOiB0aGVzZSBuZnNtb3VudCBzb3VyY2VzIGF0IGNvbXBpbGUgdGltZQorICoJbmZzX21vdW50X3ZlcnNpb246IHZlcnNpb24gdGhpcyBzb3VyY2UgYW5kIHJ1bm5pbmcga2VybmVsIGNhbiBoYW5kbGUKKyAqLworc3RhdGljIHZvaWQKK2ZpbmRfa2VybmVsX25mc19tb3VudF92ZXJzaW9uKHZvaWQpCit7CisJaW50IGtlcm5lbF92ZXJzaW9uOworCisJaWYgKG5mc19tb3VudF92ZXJzaW9uKQorCQlyZXR1cm47CisKKwluZnNfbW91bnRfdmVyc2lvbiA9IDQ7IC8qIGRlZmF1bHQgKi8KKworCWtlcm5lbF92ZXJzaW9uID0gZ2V0X2xpbnV4X3ZlcnNpb25fY29kZSgpOworCWlmIChrZXJuZWxfdmVyc2lvbikgeworCQlpZiAoa2VybmVsX3ZlcnNpb24gPCBLRVJORUxfVkVSU0lPTigyLDIsMTgpKQorCQkJbmZzX21vdW50X3ZlcnNpb24gPSAzOworCQkvKiBlbHNlIHY0IHNpbmNlIDIuMy45OXByZTQgKi8KKwl9Cit9CisKK3N0YXRpYyB2b2lkCitnZXRfbW91bnRwb3J0KHN0cnVjdCBwbWFwICpwbV9tbnQsCisJc3RydWN0IHNvY2thZGRyX2luICpzZXJ2ZXJfYWRkciwKKwlsb25nIHVuc2lnbmVkIHByb2csCisJbG9uZyB1bnNpZ25lZCB2ZXJzaW9uLAorCWxvbmcgdW5zaWduZWQgcHJvdG8sCisJbG9uZyB1bnNpZ25lZCBwb3J0KQoreworCXN0cnVjdCBwbWFwbGlzdCAqcG1hcDsKKworCXNlcnZlcl9hZGRyLT5zaW5fcG9ydCA9IFBNQVBQT1JUOworLyogZ2xpYmMgMi40IChzdGlsbCkgaGFzIHBtYXBfZ2V0bWFwcyhzdHJ1Y3Qgc29ja2FkZHJfaW4gKikuCisgKiBJIHVuZGVyc3RhbmQgaXQgbGlrZSAiSVB2NiBmb3IgdGhpcyBpcyBub3QgMTAwJSByZWFkeSIgKi8KKwlwbWFwID0gcG1hcF9nZXRtYXBzKHNlcnZlcl9hZGRyKTsKKworCWlmICh2ZXJzaW9uID4gTUFYX05GU1BST1QpCisJCXZlcnNpb24gPSBNQVhfTkZTUFJPVDsKKwlpZiAoIXByb2cpCisJCXByb2cgPSBNT1VOVFBST0c7CisJcG1fbW50LT5wbV9wcm9nID0gcHJvZzsKKwlwbV9tbnQtPnBtX3ZlcnMgPSB2ZXJzaW9uOworCXBtX21udC0+cG1fcHJvdCA9IHByb3RvOworCXBtX21udC0+cG1fcG9ydCA9IHBvcnQ7CisKKwl3aGlsZSAocG1hcCkgeworCQlpZiAocG1hcC0+cG1sX21hcC5wbV9wcm9nICE9IHByb2cpCisJCQlnb3RvIG5leHQ7CisJCWlmICghdmVyc2lvbiAmJiBwbV9tbnQtPnBtX3ZlcnMgPiBwbWFwLT5wbWxfbWFwLnBtX3ZlcnMpCisJCQlnb3RvIG5leHQ7CisJCWlmICh2ZXJzaW9uID4gMiAmJiBwbWFwLT5wbWxfbWFwLnBtX3ZlcnMgIT0gdmVyc2lvbikKKwkJCWdvdG8gbmV4dDsKKwkJaWYgKHZlcnNpb24gJiYgdmVyc2lvbiA8PSAyICYmIHBtYXAtPnBtbF9tYXAucG1fdmVycyA+IDIpCisJCQlnb3RvIG5leHQ7CisJCWlmIChwbWFwLT5wbWxfbWFwLnBtX3ZlcnMgPiBNQVhfTkZTUFJPVAorCQkgfHwgKHByb3RvICYmIHBtX21udC0+cG1fcHJvdCAmJiBwbWFwLT5wbWxfbWFwLnBtX3Byb3QgIT0gcHJvdG8pCisJCSB8fCAocG9ydCAmJiBwbWFwLT5wbWxfbWFwLnBtX3BvcnQgIT0gcG9ydCkKKwkJKSB7CisJCQlnb3RvIG5leHQ7CisJCX0KKwkJbWVtY3B5KHBtX21udCwgJnBtYXAtPnBtbF9tYXAsIHNpemVvZigqcG1fbW50KSk7CisgbmV4dDoKKwkJcG1hcCA9IHBtYXAtPnBtbF9uZXh0OworCX0KKwlpZiAoIXBtX21udC0+cG1fdmVycykKKwkJcG1fbW50LT5wbV92ZXJzID0gTU9VTlRWRVJTOworCWlmICghcG1fbW50LT5wbV9wb3J0KQorCQlwbV9tbnQtPnBtX3BvcnQgPSBNT1VOVFBPUlQ7CisJaWYgKCFwbV9tbnQtPnBtX3Byb3QpCisJCXBtX21udC0+cG1fcHJvdCA9IElQUFJPVE9fVENQOworfQorCisjaWYgQkJfTU1VCitzdGF0aWMgaW50IGRhZW1vbml6ZSh2b2lkKQoreworCWludCBwaWQgPSBmb3JrKCk7CisJaWYgKHBpZCA8IDApIC8qIGVycm9yICovCisJCXJldHVybiAtZXJybm87CisJaWYgKHBpZCA+IDApIC8qIHBhcmVudCAqLworCQlyZXR1cm4gMDsKKwkvKiBjaGlsZCAqLworCWNsb3NlKDApOworCXhvcGVuKGJiX2Rldl9udWxsLCBPX1JEV1IpOworCXhkdXAyKDAsIDEpOworCXhkdXAyKDAsIDIpOworCXNldHNpZCgpOworCW9wZW5sb2coYXBwbGV0X25hbWUsIExPR19QSUQsIExPR19EQUVNT04pOworCWxvZ21vZGUgPSBMT0dNT0RFX1NZU0xPRzsKKwlyZXR1cm4gMTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludCBkYWVtb25pemUodm9pZCkgeyByZXR1cm4gLUVOT1NZUzsgfQorI2VuZGlmCisKKy8qIFRPRE8gKi8KK3N0YXRpYyBpbmxpbmUgaW50IHdlX3Nhd190aGlzX2hvc3RfYmVmb3JlKGNvbnN0IGNoYXIgKmhvc3RuYW1lIFVOVVNFRF9QQVJBTSkKK3sKKwlyZXR1cm4gMDsKK30KKworLyogUlBDIHN0cmVycm9yIGFuYWxvZ3MgYXJlIHRlcm1pbmFsbHkgaWRpb3RpYzoKKyAqICptYW5kYXRvcnkqIHByZWZpeCBhbmQgXG4gYXQgZW5kLgorICogVGhpcyBob3BlZnVsbHkgaGVscHMuIFVzYWdlOgorICogZXJyb3JfbXNnX3JwYyhjbG50XyplcnJvciooIiAiKSkgKi8KK3N0YXRpYyB2b2lkIGVycm9yX21zZ19ycGMoY29uc3QgY2hhciAqbXNnKQoreworCWludCBsZW47CisJd2hpbGUgKG1zZ1swXSA9PSAnICcgfHwgbXNnWzBdID09ICc6JykgbXNnKys7CisJbGVuID0gc3RybGVuKG1zZyk7CisJd2hpbGUgKGxlbiAmJiBtc2dbbGVuLTFdID09ICdcbicpIGxlbi0tOworCWJiX2Vycm9yX21zZygiJS4qcyIsIGxlbiwgbXNnKTsKK30KKworLyogTkI6IG1wLT54eHggZmllbGRzIG1heSBiZSB0cmFzaGVkIG9uIGV4aXQgKi8KK3N0YXRpYyBOT0lOTElORSBpbnQgbmZzbW91bnQoc3RydWN0IG1udGVudCAqbXAsIHVuc2lnbmVkIGxvbmcgdmZzZmxhZ3MsIGNoYXIgKmZpbHRlcm9wdHMpCit7CisJQ0xJRU5UICptY2xpZW50OworCWNoYXIgKmhvc3RuYW1lOworCWNoYXIgKnBhdGhuYW1lOworCWNoYXIgKm1vdW50aG9zdDsKKwkvKiBwcmlvciB0byAyLjYuMjMsIGtlcm5lbCB0b29rIE5GUyBvcHRpb25zIGluIGEgZm9ybSBvZiB0aGlzIHN0cnVjdAorCSAqIG9ubHkuIDIuNi4yMysgbG9va3MgYXQgZGF0YS0+dmVyc2lvbiwgYW5kIGlmIGl0J3Mgbm90IDEuLjYsCisJICogdGhlbiBkYXRhIHBvaW50ZXIgaXMgaW50ZXJwcmV0ZWQgYXMgYSBzdHJpbmcuICovCisJc3RydWN0IG5mc19tb3VudF9kYXRhIGRhdGE7CisJY2hhciAqb3B0OworCXN0cnVjdCBob3N0ZW50ICpocDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2VydmVyX2FkZHI7CisJc3RydWN0IHNvY2thZGRyX2luIG1vdW50X3NlcnZlcl9hZGRyOworCWludCBtc29jaywgZnNvY2s7CisJdW5pb24geworCQlzdHJ1Y3QgZmhzdGF0dXMgbmZzdjI7CisJCXN0cnVjdCBtb3VudHJlczMgbmZzdjM7CisJfSBzdGF0dXM7CisJaW50IGRhZW1vbml6ZWQ7CisJY2hhciAqczsKKwlpbnQgcG9ydDsKKwlpbnQgbW91bnRwb3J0OworCWludCBwcm90bzsKKyNpZiBCQl9NTVUKKwlzbWFsbGludCBiZyA9IDA7CisjZWxzZQorCWVudW0geyBiZyA9IDAgfTsKKyNlbmRpZgorCWludCByZXRyeTsKKwlpbnQgbW91bnRwcm9nOworCWludCBtb3VudHZlcnM7CisJaW50IG5mc3Byb2c7CisJaW50IG5mc3ZlcnM7CisJaW50IHJldHZhbDsKKwkvKiB0aGVzZSBhbGwgYXJlIG9uZS1iaXQgcmVhbGx5LiBnY2MgNC4zLjEgbGlrZXMgdGhpcyBjb21iaW5hdGlvbjogKi8KKwlzbWFsbGludCB0Y3A7CisJc21hbGxpbnQgc29mdDsKKwlpbnQgaW50cjsKKwlpbnQgcG9zaXg7CisJaW50IG5vY3RvOworCWludCBub2FjOworCWludCBub3JkaXJwbHVzOworCWludCBub2xvY2s7CisJaW50IG5vYWNsOworCisJZmluZF9rZXJuZWxfbmZzX21vdW50X3ZlcnNpb24oKTsKKworCWRhZW1vbml6ZWQgPSAwOworCW1vdW50aG9zdCA9IE5VTEw7CisJcmV0dmFsID0gRVRJTUVET1VUOworCW1zb2NrID0gZnNvY2sgPSAtMTsKKwltY2xpZW50ID0gTlVMTDsKKworCS8qIE5COiBob3N0bmFtZSwgbW91bnRob3N0LCBmaWx0ZXJvcHRzIG11c3QgYmUgZnJlZSgpZCBwcmlvciB0byByZXR1cm4gKi8KKworCWZpbHRlcm9wdHMgPSB4c3RyZHVwKGZpbHRlcm9wdHMpOyAvKiBnb2luZyB0byB0cmFzaCBpdCBsYXRlci4uLiAqLworCisJaG9zdG5hbWUgPSB4c3RyZHVwKG1wLT5tbnRfZnNuYW1lKTsKKwkvKiBtb3VudF9tYWluKCkgZ3VhcmFudGVlcyB0aGF0ICc6JyBpcyB0aGVyZSAqLworCXMgPSBzdHJjaHIoaG9zdG5hbWUsICc6Jyk7CisJcGF0aG5hbWUgPSBzICsgMTsKKwkqcyA9ICdcMCc7CisJLyogSWdub3JlIGFsbCBidXQgZmlyc3QgaG9zdG5hbWUgaW4gcmVwbGljYXRlZCBtb3VudHMKKwkgKiB1bnRpbCB0aGV5IGNhbiBiZSBmdWxseSBzdXBwb3J0ZWQuIChtYWNrQHNnaS5jb20pICovCisJcyA9IHN0cmNocihob3N0bmFtZSwgJywnKTsKKwlpZiAocykgeworCQkqcyA9ICdcMCc7CisJCWJiX2Vycm9yX21zZygid2FybmluZzogbXVsdGlwbGUgaG9zdG5hbWVzIG5vdCBzdXBwb3J0ZWQiKTsKKwl9CisKKwlzZXJ2ZXJfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlpZiAoIWluZXRfYXRvbihob3N0bmFtZSwgJnNlcnZlcl9hZGRyLnNpbl9hZGRyKSkgeworCQlocCA9IGdldGhvc3RieW5hbWUoaG9zdG5hbWUpOworCQlpZiAoaHAgPT0gTlVMTCkgeworCQkJYmJfaGVycm9yX21zZygiJXMiLCBob3N0bmFtZSk7CisJCQlnb3RvIGZhaWw7CisJCX0KKwkJaWYgKGhwLT5oX2xlbmd0aCAhPSAoaW50KXNpemVvZihzdHJ1Y3QgaW5fYWRkcikpIHsKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJvbmx5IElQdjQgaXMgc3VwcG9ydGVkIik7CisJCX0KKwkJbWVtY3B5KCZzZXJ2ZXJfYWRkci5zaW5fYWRkciwgaHAtPmhfYWRkcl9saXN0WzBdLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKwl9CisKKwltZW1jcHkoJm1vdW50X3NlcnZlcl9hZGRyLCAmc2VydmVyX2FkZHIsIHNpemVvZihtb3VudF9zZXJ2ZXJfYWRkcikpOworCisJLyogYWRkIElQIGFkZHJlc3MgdG8gbXRhYiBvcHRpb25zIGZvciB1c2Ugd2hlbiB1bm1vdW50aW5nICovCisKKwlpZiAoIW1wLT5tbnRfb3B0cykgeyAvKiBUT0RPOiBhY3R1YWxseSBtcC0+bW50X29wdHMgaXMgbmV2ZXIgTlVMTCAqLworCQltcC0+bW50X29wdHMgPSB4YXNwcmludGYoImFkZHI9JXMiLCBpbmV0X250b2Eoc2VydmVyX2FkZHIuc2luX2FkZHIpKTsKKwl9IGVsc2UgeworCQljaGFyICp0bXAgPSB4YXNwcmludGYoIiVzJXNhZGRyPSVzIiwgbXAtPm1udF9vcHRzLAorCQkJCQltcC0+bW50X29wdHNbMF0gPyAiLCIgOiAiIiwKKwkJCQkJaW5ldF9udG9hKHNlcnZlcl9hZGRyLnNpbl9hZGRyKSk7CisJCWZyZWUobXAtPm1udF9vcHRzKTsKKwkJbXAtPm1udF9vcHRzID0gdG1wOworCX0KKworCS8qIFNldCBkZWZhdWx0IG9wdGlvbnMuCisJICogcnNpemUvd3NpemUgKGFuZCBic2l6ZSwgZm9yIHZlciA+PSAzKSBhcmUgbGVmdCAwIGluIG9yZGVyIHRvCisJICogbGV0IHRoZSBrZXJuZWwgZGVjaWRlLgorCSAqIHRpbWVvIGlzIGZpbGxlZCBpbiBhZnRlciB3ZSBrbm93IHdoZXRoZXIgaXQnbGwgYmUgVENQIG9yIFVEUC4gKi8KKwltZW1zZXQoJmRhdGEsIDAsIHNpemVvZihkYXRhKSk7CisJZGF0YS5yZXRyYW5zICA9IDM7CisJZGF0YS5hY3JlZ21pbiA9IDM7CisJZGF0YS5hY3JlZ21heCA9IDYwOworCWRhdGEuYWNkaXJtaW4gPSAzMDsKKwlkYXRhLmFjZGlybWF4ID0gNjA7CisJZGF0YS5uYW1sZW4gICA9IE5BTUVfTUFYOworCisJc29mdCA9IDA7CisJaW50ciA9IDA7CisJcG9zaXggPSAwOworCW5vY3RvID0gMDsKKwlub2xvY2sgPSAwOworCW5vYWMgPSAwOworCW5vcmRpcnBsdXMgPSAwOworCW5vYWNsID0gMDsKKwlyZXRyeSA9IDEwMDAwOwkJLyogMTAwMDAgbWludXRlcyB+IDEgd2VlayAqLworCXRjcCA9IDE7CQkJLyogbmZzLXV0aWxzIHVzZXMgdGNwIHBlciBkZWZhdWx0ICovCisKKwltb3VudHByb2cgPSBNT1VOVFBST0c7CisJbW91bnR2ZXJzID0gMDsKKwlwb3J0ID0gMDsKKwltb3VudHBvcnQgPSAwOworCW5mc3Byb2cgPSAxMDAwMDM7CisJbmZzdmVycyA9IDA7CisKKwkvKiBwYXJzZSBvcHRpb25zICovCisJaWYgKGZpbHRlcm9wdHMpCWZvciAob3B0ID0gc3RydG9rKGZpbHRlcm9wdHMsICIsIik7IG9wdDsgb3B0ID0gc3RydG9rKE5VTEwsICIsIikpIHsKKwkJY2hhciAqb3B0ZXEgPSBzdHJjaHIob3B0LCAnPScpOworCQlpZiAob3B0ZXEpIHsKKwkJCWludCB2YWwsIGlkeDsKKwkJCXN0YXRpYyBjb25zdCBjaGFyIG9wdGlvbnNbXSBBTElHTjEgPQorCQkJCS8qIDAgKi8gInJzaXplXDAiCisJCQkJLyogMSAqLyAid3NpemVcMCIKKwkJCQkvKiAyICovICJ0aW1lb1wwIgorCQkJCS8qIDMgKi8gInJldHJhbnNcMCIKKwkJCQkvKiA0ICovICJhY3JlZ21pblwwIgorCQkJCS8qIDUgKi8gImFjcmVnbWF4XDAiCisJCQkJLyogNiAqLyAiYWNkaXJtaW5cMCIKKwkJCQkvKiA3ICovICJhY2Rpcm1heFwwIgorCQkJCS8qIDggKi8gImFjdGltZW9cMCIKKwkJCQkvKiA5ICovICJyZXRyeVwwIgorCQkJCS8qIDEwICovICJwb3J0XDAiCisJCQkJLyogMTEgKi8gIm1vdW50cG9ydFwwIgorCQkJCS8qIDEyICovICJtb3VudGhvc3RcMCIKKwkJCQkvKiAxMyAqLyAibW91bnRwcm9nXDAiCisJCQkJLyogMTQgKi8gIm1vdW50dmVyc1wwIgorCQkJCS8qIDE1ICovICJuZnNwcm9nXDAiCisJCQkJLyogMTYgKi8gIm5mc3ZlcnNcMCIKKwkJCQkvKiAxNyAqLyAidmVyc1wwIgorCQkJCS8qIDE4ICovICJwcm90b1wwIgorCQkJCS8qIDE5ICovICJuYW1sZW5cMCIKKwkJCQkvKiAyMCAqLyAiYWRkclwwIjsKKworCQkJKm9wdGVxKysgPSAnXDAnOworCQkJaWR4ID0gaW5kZXhfaW5fc3RyaW5ncyhvcHRpb25zLCBvcHQpOworCQkJc3dpdGNoIChpZHgpIHsKKwkJCWNhc2UgMTI6IC8vICJtb3VudGhvc3QiCisJCQkJbW91bnRob3N0ID0geHN0cm5kdXAob3B0ZXEsCisJCQkJCQlzdHJjc3BuKG9wdGVxLCAiIFx0XG5cciwiKSk7CisJCQkJY29udGludWU7CisJCQljYXNlIDE4OiAvLyAicHJvdG8iCisJCQkJaWYgKGlzX3ByZWZpeGVkX3dpdGgob3B0ZXEsICJ0Y3AiKSkKKwkJCQkJdGNwID0gMTsKKwkJCQllbHNlIGlmIChpc19wcmVmaXhlZF93aXRoKG9wdGVxLCAidWRwIikpCisJCQkJCXRjcCA9IDA7CisJCQkJZWxzZQorCQkJCQliYl9lcnJvcl9tc2coIndhcm5pbmc6IHVucmVjb2duaXplZCBwcm90bz0gb3B0aW9uIik7CisJCQkJY29udGludWU7CisJCQljYXNlIDIwOiAvLyAiYWRkciIgLSBpZ25vcmUKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgLTE6IC8vIHVua25vd24KKwkJCQlpZiAodmZzZmxhZ3MgJiBNU19SRU1PVU5UKQorCQkJCQljb250aW51ZTsKKwkJCX0KKworCQkJdmFsID0geGF0b2lfcG9zaXRpdmUob3B0ZXEpOworCQkJc3dpdGNoIChpZHgpIHsKKwkJCWNhc2UgMDogLy8gInJzaXplIgorCQkJCWRhdGEucnNpemUgPSB2YWw7CisJCQkJY29udGludWU7CisJCQljYXNlIDE6IC8vICJ3c2l6ZSIKKwkJCQlkYXRhLndzaXplID0gdmFsOworCQkJCWNvbnRpbnVlOworCQkJY2FzZSAyOiAvLyAidGltZW8iCisJCQkJZGF0YS50aW1lbyA9IHZhbDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgMzogLy8gInJldHJhbnMiCisJCQkJZGF0YS5yZXRyYW5zID0gdmFsOworCQkJCWNvbnRpbnVlOworCQkJY2FzZSA0OiAvLyAiYWNyZWdtaW4iCisJCQkJZGF0YS5hY3JlZ21pbiA9IHZhbDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgNTogLy8gImFjcmVnbWF4IgorCQkJCWRhdGEuYWNyZWdtYXggPSB2YWw7CisJCQkJY29udGludWU7CisJCQljYXNlIDY6IC8vICJhY2Rpcm1pbiIKKwkJCQlkYXRhLmFjZGlybWluID0gdmFsOworCQkJCWNvbnRpbnVlOworCQkJY2FzZSA3OiAvLyAiYWNkaXJtYXgiCisJCQkJZGF0YS5hY2Rpcm1heCA9IHZhbDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgODogLy8gImFjdGltZW8iCisJCQkJZGF0YS5hY3JlZ21pbiA9IHZhbDsKKwkJCQlkYXRhLmFjcmVnbWF4ID0gdmFsOworCQkJCWRhdGEuYWNkaXJtaW4gPSB2YWw7CisJCQkJZGF0YS5hY2Rpcm1heCA9IHZhbDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgOTogLy8gInJldHJ5IgorCQkJCXJldHJ5ID0gdmFsOworCQkJCWNvbnRpbnVlOworCQkJY2FzZSAxMDogLy8gInBvcnQiCisJCQkJcG9ydCA9IHZhbDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgMTE6IC8vICJtb3VudHBvcnQiCisJCQkJbW91bnRwb3J0ID0gdmFsOworCQkJCWNvbnRpbnVlOworCQkJY2FzZSAxMzogLy8gIm1vdW50cHJvZyIKKwkJCQltb3VudHByb2cgPSB2YWw7CisJCQkJY29udGludWU7CisJCQljYXNlIDE0OiAvLyAibW91bnR2ZXJzIgorCQkJCW1vdW50dmVycyA9IHZhbDsKKwkJCQljb250aW51ZTsKKwkJCWNhc2UgMTU6IC8vICJuZnNwcm9nIgorCQkJCW5mc3Byb2cgPSB2YWw7CisJCQkJY29udGludWU7CisJCQljYXNlIDE2OiAvLyAibmZzdmVycyIKKwkJCWNhc2UgMTc6IC8vICJ2ZXJzIgorCQkJCW5mc3ZlcnMgPSB2YWw7CisJCQkJY29udGludWU7CisJCQljYXNlIDE5OiAvLyAibmFtbGVuIgorCQkJCS8vaWYgKG5mc19tb3VudF92ZXJzaW9uID49IDIpCisJCQkJCWRhdGEubmFtbGVuID0gdmFsOworCQkJCS8vZWxzZQorCQkJCS8vCWJiX2Vycm9yX21zZygid2FybmluZzogb3B0aW9uIG5hbWxlbiBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJCQljb250aW51ZTsKKwkJCWRlZmF1bHQ6CisJCQkJYmJfZXJyb3JfbXNnKCJ1bmtub3duIG5mcyBtb3VudCBwYXJhbWV0ZXI6ICVzPSVkIiwgb3B0LCB2YWwpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJfQorCQllbHNlIHsgLyogbm90IG9mIHRoZSBmb3JtIG9wdD12YWwgKi8KKwkJCXN0YXRpYyBjb25zdCBjaGFyIG9wdGlvbnNbXSBBTElHTjEgPQorCQkJCSJiZ1wwIgorCQkJCSJmZ1wwIgorCQkJCSJzb2Z0XDAiCisJCQkJImhhcmRcMCIKKwkJCQkiaW50clwwIgorCQkJCSJwb3NpeFwwIgorCQkJCSJjdG9cMCIKKwkJCQkiYWNcMCIKKwkJCQkidGNwXDAiCisJCQkJInVkcFwwIgorCQkJCSJsb2NrXDAiCisJCQkJInJkaXJwbHVzXDAiCisJCQkJImFjbFwwIjsKKwkJCWludCB2YWwgPSAxOworCQkJaWYgKGlzX3ByZWZpeGVkX3dpdGgob3B0LCAibm8iKSkgeworCQkJCXZhbCA9IDA7CisJCQkJb3B0ICs9IDI7CisJCQl9CisJCQlzd2l0Y2ggKGluZGV4X2luX3N0cmluZ3Mob3B0aW9ucywgb3B0KSkgeworCQkJY2FzZSAwOiAvLyAiYmciCisjaWYgQkJfTU1VCisJCQkJYmcgPSB2YWw7CisjZW5kaWYKKwkJCQlicmVhazsKKwkJCWNhc2UgMTogLy8gImZnIgorI2lmIEJCX01NVQorCQkJCWJnID0gIXZhbDsKKyNlbmRpZgorCQkJCWJyZWFrOworCQkJY2FzZSAyOiAvLyAic29mdCIKKwkJCQlzb2Z0ID0gdmFsOworCQkJCWJyZWFrOworCQkJY2FzZSAzOiAvLyAiaGFyZCIKKwkJCQlzb2Z0ID0gIXZhbDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNDogLy8gImludHIiCisJCQkJaW50ciA9IHZhbDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNTogLy8gInBvc2l4IgorCQkJCXBvc2l4ID0gdmFsOworCQkJCWJyZWFrOworCQkJY2FzZSA2OiAvLyAiY3RvIgorCQkJCW5vY3RvID0gIXZhbDsKKwkJCQlicmVhazsKKwkJCWNhc2UgNzogLy8gImFjIgorCQkJCW5vYWMgPSAhdmFsOworCQkJCWJyZWFrOworCQkJY2FzZSA4OiAvLyAidGNwIgorCQkJCXRjcCA9IHZhbDsKKwkJCQlicmVhazsKKwkJCWNhc2UgOTogLy8gInVkcCIKKwkJCQl0Y3AgPSAhdmFsOworCQkJCWJyZWFrOworCQkJY2FzZSAxMDogLy8gImxvY2siCisJCQkJaWYgKG5mc19tb3VudF92ZXJzaW9uID49IDMpCisJCQkJCW5vbG9jayA9ICF2YWw7CisJCQkJZWxzZQorCQkJCQliYl9lcnJvcl9tc2coIndhcm5pbmc6IG9wdGlvbiBub2xvY2sgaXMgbm90IHN1cHBvcnRlZCIpOworCQkJCWJyZWFrOworCQkJY2FzZSAxMTogLy9yZGlycGx1cworCQkJCW5vcmRpcnBsdXMgPSAhdmFsOworCQkJCWJyZWFrOworCQkJY2FzZSAxMjogLy8gYWNsCisJCQkJbm9hY2wgPSAhdmFsOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQliYl9lcnJvcl9tc2coInVua25vd24gbmZzIG1vdW50IG9wdGlvbjogJXMlcyIsIHZhbCA/ICIiIDogIm5vIiwgb3B0KTsKKwkJCQlnb3RvIGZhaWw7CisJCQl9CisJCX0KKwl9CisJcHJvdG8gPSAodGNwKSA/IElQUFJPVE9fVENQIDogSVBQUk9UT19VRFA7CisKKwlkYXRhLmZsYWdzID0gKHNvZnQgPyBORlNfTU9VTlRfU09GVCA6IDApCisJCXwgKGludHIgPyBORlNfTU9VTlRfSU5UUiA6IDApCisJCXwgKHBvc2l4ID8gTkZTX01PVU5UX1BPU0lYIDogMCkKKwkJfCAobm9jdG8gPyBORlNfTU9VTlRfTk9DVE8gOiAwKQorCQl8IChub2FjID8gTkZTX01PVU5UX05PQUMgOiAwKQorCQl8IChub3JkaXJwbHVzID8gTkZTX01PVU5UX05PUkRJUlBMVVMgOiAwKQorCQl8IChub2FjbCA/IE5GU19NT1VOVF9OT0FDTCA6IDApOworCWlmIChuZnNfbW91bnRfdmVyc2lvbiA+PSAyKQorCQlkYXRhLmZsYWdzIHw9ICh0Y3AgPyBORlNfTU9VTlRfVENQIDogMCk7CisJaWYgKG5mc19tb3VudF92ZXJzaW9uID49IDMpCisJCWRhdGEuZmxhZ3MgfD0gKG5vbG9jayA/IE5GU19NT1VOVF9OT05MTSA6IDApOworCWlmIChuZnN2ZXJzID4gTUFYX05GU1BST1QgfHwgbW91bnR2ZXJzID4gTUFYX05GU1BST1QpIHsKKwkJYmJfZXJyb3JfbXNnKCJORlN2JWQgbm90IHN1cHBvcnRlZCIsIG5mc3ZlcnMpOworCQlnb3RvIGZhaWw7CisJfQorCWlmIChuZnN2ZXJzICYmICFtb3VudHZlcnMpCisJCW1vdW50dmVycyA9IChuZnN2ZXJzIDwgMykgPyAxIDogbmZzdmVyczsKKwlpZiAobmZzdmVycyAmJiBuZnN2ZXJzIDwgbW91bnR2ZXJzKSB7CisJCW1vdW50dmVycyA9IG5mc3ZlcnM7CisJfQorCisJLyogQWRqdXN0IG9wdGlvbnMgaWYgbm9uZSBzcGVjaWZpZWQgKi8KKwlpZiAoIWRhdGEudGltZW8pCisJCWRhdGEudGltZW8gPSB0Y3AgPyA3MCA6IDc7CisKKwlkYXRhLnZlcnNpb24gPSBuZnNfbW91bnRfdmVyc2lvbjsKKworCWlmICh2ZnNmbGFncyAmIE1TX1JFTU9VTlQpCisJCWdvdG8gZG9fbW91bnQ7CisKKwkvKgorCSAqIElmIHRoZSBwcmV2aW91cyBtb3VudCBvcGVyYXRpb24gb24gdGhlIHNhbWUgaG9zdCB3YXMKKwkgKiBiYWNrZ3JvdW5kZWQsIGFuZCB0aGUgImJnIiBmb3IgdGhpcyBtb3VudCBpcyBhbHNvIHNldCwKKwkgKiBnaXZlIHVwIGltbWVkaWF0ZWx5LCB0byBhdm9pZCB0aGUgaW5pdGlhbCB0aW1lb3V0LgorCSAqLworCWlmIChiZyAmJiB3ZV9zYXdfdGhpc19ob3N0X2JlZm9yZShob3N0bmFtZSkpIHsKKwkJZGFlbW9uaXplZCA9IGRhZW1vbml6ZSgpOworCQlpZiAoZGFlbW9uaXplZCA8PSAwKSB7IC8qIHBhcmVudCBvciBlcnJvciAqLworCQkJcmV0dmFsID0gLWRhZW1vbml6ZWQ7CisJCQlnb3RvIHJldDsKKwkJfQorCX0KKworCS8qIENyZWF0ZSBtb3VudCBkYWVtb24gY2xpZW50ICovCisJLyogU2VlIGlmIHRoZSBuZnMgaG9zdCA9IG1vdW50IGhvc3QuICovCisJaWYgKG1vdW50aG9zdCkgeworCQlpZiAobW91bnRob3N0WzBdID49ICcwJyAmJiBtb3VudGhvc3RbMF0gPD0gJzknKSB7CisJCQltb3VudF9zZXJ2ZXJfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwkJCW1vdW50X3NlcnZlcl9hZGRyLnNpbl9hZGRyLnNfYWRkciA9IGluZXRfYWRkcihob3N0bmFtZSk7CisJCX0gZWxzZSB7CisJCQlocCA9IGdldGhvc3RieW5hbWUobW91bnRob3N0KTsKKwkJCWlmIChocCA9PSBOVUxMKSB7CisJCQkJYmJfaGVycm9yX21zZygiJXMiLCBtb3VudGhvc3QpOworCQkJCWdvdG8gZmFpbDsKKwkJCX0KKwkJCWlmIChocC0+aF9sZW5ndGggIT0gKGludClzaXplb2Yoc3RydWN0IGluX2FkZHIpKSB7CisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIm9ubHkgSVB2NCBpcyBzdXBwb3J0ZWQiKTsKKwkJCX0KKwkJCW1vdW50X3NlcnZlcl9hZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCQkJbWVtY3B5KCZtb3VudF9zZXJ2ZXJfYWRkci5zaW5fYWRkciwgaHAtPmhfYWRkcl9saXN0WzBdLCBzaXplb2Yoc3RydWN0IGluX2FkZHIpKTsKKwkJfQorCX0KKworCS8qCisJICogVGhlIGZvbGxvd2luZyBsb29wIGltcGxlbWVudHMgdGhlIG1vdW50IHJldHJpZXMuIFdoZW4gdGhlIG1vdW50CisJICogdGltZXMgb3V0LCBhbmQgdGhlICJiZyIgb3B0aW9uIGlzIHNldCwgd2UgYmFja2dyb3VuZCBvdXJzZWxmCisJICogYW5kIGNvbnRpbnVlIHRyeWluZy4KKwkgKgorCSAqIFRoZSBjYXNlIHdoZXJlIHRoZSBtb3VudCBwb2ludCBpcyBub3QgcHJlc2VudCBhbmQgdGhlICJiZyIKKwkgKiBvcHRpb24gaXMgc2V0LCBpcyB0cmVhdGVkIGFzIGEgdGltZW91dC4gVGhpcyBpcyBkb25lIHRvCisJICogc3VwcG9ydCBuZXN0ZWQgbW91bnRzLgorCSAqCisJICogVGhlICJyZXRyeSIgY291bnQgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyIGlzIHRoZSBudW1iZXIgb2YKKwkgKiBtaW51dGVzIHRvIHJldHJ5IGJlZm9yZSBnaXZpbmcgdXAuCisJICovCisJeworCQlzdHJ1Y3QgdGltZXZhbCB0b3RhbF90aW1lb3V0OworCQlzdHJ1Y3QgdGltZXZhbCByZXRyeV90aW1lb3V0OworCQlzdHJ1Y3QgcG1hcCBwbV9tbnQ7CisJCXRpbWVfdCB0OworCQl0aW1lX3QgcHJldnQ7CisJCXRpbWVfdCB0aW1lb3V0OworCisJCXJldHJ5X3RpbWVvdXQudHZfc2VjID0gMzsKKwkJcmV0cnlfdGltZW91dC50dl91c2VjID0gMDsKKwkJdG90YWxfdGltZW91dC50dl9zZWMgPSAyMDsKKwkJdG90YWxfdGltZW91dC50dl91c2VjID0gMDsKKy8qIEZJWE1FOiB1c2UgbW9ub3RvbmljKCk/ICovCisJCXRpbWVvdXQgPSB0aW1lKE5VTEwpICsgNjAgKiByZXRyeTsKKwkJcHJldnQgPSAwOworCQl0ID0gMzA7CisgcmV0cnk6CisJCS8qIEJlIGNhcmVmdWwgbm90IHRvIHVzZSB0b28gbWFueSBDUFUgY3ljbGVzICovCisJCWlmICh0IC0gcHJldnQgPCAzMCkKKwkJCXNsZWVwKDMwKTsKKworCQlnZXRfbW91bnRwb3J0KCZwbV9tbnQsICZtb3VudF9zZXJ2ZXJfYWRkciwKKwkJCQltb3VudHByb2csCisJCQkJbW91bnR2ZXJzLAorCQkJCXByb3RvLAorCQkJCW1vdW50cG9ydCk7CisJCW5mc3ZlcnMgPSAocG1fbW50LnBtX3ZlcnMgPCAyKSA/IDIgOiBwbV9tbnQucG1fdmVyczsKKworCQkvKiBjb250YWN0IHRoZSBtb3VudCBkYWVtb24gdmlhIFRDUCAqLworCQltb3VudF9zZXJ2ZXJfYWRkci5zaW5fcG9ydCA9IGh0b25zKHBtX21udC5wbV9wb3J0KTsKKwkJbXNvY2sgPSBSUENfQU5ZU09DSzsKKworCQlzd2l0Y2ggKHBtX21udC5wbV9wcm90KSB7CisJCWNhc2UgSVBQUk9UT19VRFA6CisJCQltY2xpZW50ID0gY2xudHVkcF9jcmVhdGUoJm1vdW50X3NlcnZlcl9hZGRyLAorCQkJCQkJcG1fbW50LnBtX3Byb2csCisJCQkJCQlwbV9tbnQucG1fdmVycywKKwkJCQkJCXJldHJ5X3RpbWVvdXQsCisJCQkJCQkmbXNvY2spOworCQkJaWYgKG1jbGllbnQpCisJCQkJYnJlYWs7CisJCQltb3VudF9zZXJ2ZXJfYWRkci5zaW5fcG9ydCA9IGh0b25zKHBtX21udC5wbV9wb3J0KTsKKwkJCW1zb2NrID0gUlBDX0FOWVNPQ0s7CisJCWNhc2UgSVBQUk9UT19UQ1A6CisJCQltY2xpZW50ID0gY2xudHRjcF9jcmVhdGUoJm1vdW50X3NlcnZlcl9hZGRyLAorCQkJCQkJcG1fbW50LnBtX3Byb2csCisJCQkJCQlwbV9tbnQucG1fdmVycywKKwkJCQkJCSZtc29jaywgMCwgMCk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCW1jbGllbnQgPSBOVUxMOworCQl9CisJCWlmICghbWNsaWVudCkgeworCQkJaWYgKCFkYWVtb25pemVkICYmIHByZXZ0ID09IDApCisJCQkJZXJyb3JfbXNnX3JwYyhjbG50X3NwY3JlYXRlZXJyb3IoIiAiKSk7CisJCX0gZWxzZSB7CisJCQllbnVtIGNsbnRfc3RhdCBjbG50X3N0YXQ7CisKKwkJCS8qIFRyeSB0byBtb3VudCBob3N0bmFtZTpwYXRobmFtZSAqLworCQkJbWNsaWVudC0+Y2xfYXV0aCA9IGF1dGh1bml4X2NyZWF0ZV9kZWZhdWx0KCk7CisKKwkJCS8qIE1ha2UgcG9pbnRlcnMgaW4geGRyX21vdW50cmVzMyBOVUxMIHNvCisJCQkgKiB0aGF0IHhkcl9hcnJheSBhbGxvY2F0ZXMgbWVtb3J5IGZvciB1cworCQkJICovCisJCQltZW1zZXQoJnN0YXR1cywgMCwgc2l6ZW9mKHN0YXR1cykpOworCisJCQlpZiAocG1fbW50LnBtX3ZlcnMgPT0gMykKKwkJCQljbG50X3N0YXQgPSBjbG50X2NhbGwobWNsaWVudCwgTU9VTlRQUk9DM19NTlQsCisJCQkJCQkoeGRycHJvY190KSB4ZHJfZGlycGF0aCwKKwkJCQkJCShjYWRkcl90KSAmcGF0aG5hbWUsCisJCQkJCQkoeGRycHJvY190KSB4ZHJfbW91bnRyZXMzLAorCQkJCQkJKGNhZGRyX3QpICZzdGF0dXMsCisJCQkJCQl0b3RhbF90aW1lb3V0KTsKKwkJCWVsc2UKKwkJCQljbG50X3N0YXQgPSBjbG50X2NhbGwobWNsaWVudCwgTU9VTlRQUk9DX01OVCwKKwkJCQkJCSh4ZHJwcm9jX3QpIHhkcl9kaXJwYXRoLAorCQkJCQkJKGNhZGRyX3QpICZwYXRobmFtZSwKKwkJCQkJCSh4ZHJwcm9jX3QpIHhkcl9maHN0YXR1cywKKwkJCQkJCShjYWRkcl90KSAmc3RhdHVzLAorCQkJCQkJdG90YWxfdGltZW91dCk7CisKKwkJCWlmIChjbG50X3N0YXQgPT0gUlBDX1NVQ0NFU1MpCisJCQkJZ290byBwcmVwYXJlX2tlcm5lbF9kYXRhOyAvKiB3ZSdyZSBkb25lICovCisJCQlpZiAoZXJybm8gIT0gRUNPTk5SRUZVU0VEKSB7CisJCQkJZXJyb3JfbXNnX3JwYyhjbG50X3NwZXJyb3IobWNsaWVudCwgIiAiKSk7CisJCQkJZ290byBmYWlsOwkvKiBkb24ndCByZXRyeSAqLworCQkJfQorCQkJLyogQ29ubmVjdGlvbiByZWZ1c2VkICovCisJCQlpZiAoIWRhZW1vbml6ZWQgJiYgcHJldnQgPT0gMCkgLyogcHJpbnQganVzdCBvbmNlICovCisJCQkJZXJyb3JfbXNnX3JwYyhjbG50X3NwZXJyb3IobWNsaWVudCwgIiAiKSk7CisJCQlhdXRoX2Rlc3Ryb3kobWNsaWVudC0+Y2xfYXV0aCk7CisJCQljbG50X2Rlc3Ryb3kobWNsaWVudCk7CisJCQltY2xpZW50ID0gTlVMTDsKKwkJCWNsb3NlKG1zb2NrKTsKKwkJCW1zb2NrID0gLTE7CisJCX0KKworCQkvKiBUaW1lb3V0LiBXZSBhcmUgZ29pbmcgdG8gcmV0cnkuLi4gbWF5YmUgKi8KKwkJaWYgKCFiZykKKwkJCWdvdG8gZmFpbDsKKwkJaWYgKCFkYWVtb25pemVkKSB7CisJCQlkYWVtb25pemVkID0gZGFlbW9uaXplKCk7CisJCQlpZiAoZGFlbW9uaXplZCA8PSAwKSB7IC8qIHBhcmVudCBvciBlcnJvciAqLworCQkJCXJldHZhbCA9IC1kYWVtb25pemVkOworCQkJCWdvdG8gcmV0OworCQkJfQorCQl9CisJCXByZXZ0ID0gdDsKKwkJdCA9IHRpbWUoTlVMTCk7CisJCWlmICh0ID49IHRpbWVvdXQpCisJCQkvKiBUT0RPIGVycm9yIG1lc3NhZ2UgKi8KKwkJCWdvdG8gZmFpbDsKKworCQlnb3RvIHJldHJ5OworCX0KKworIHByZXBhcmVfa2VybmVsX2RhdGE6CisKKwlpZiAobmZzdmVycyA9PSAyKSB7CisJCWlmIChzdGF0dXMubmZzdjIuZmhzX3N0YXR1cyAhPSAwKSB7CisJCQliYl9lcnJvcl9tc2coIiVzOiVzIGZhaWxlZCwgcmVhc29uIGdpdmVuIGJ5IHNlcnZlcjogJXMiLAorCQkJCWhvc3RuYW1lLCBwYXRobmFtZSwKKwkJCQluZnNfc3RyZXJyb3Ioc3RhdHVzLm5mc3YyLmZoc19zdGF0dXMpKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQltZW1jcHkoZGF0YS5yb290LmRhdGEsCisJCQkJKGNoYXIgKikgc3RhdHVzLm5mc3YyLmZoc3RhdHVzX3UuZmhzX2ZoYW5kbGUsCisJCQkJTkZTX0ZIU0laRSk7CisJCWRhdGEucm9vdC5zaXplID0gTkZTX0ZIU0laRTsKKwkJbWVtY3B5KGRhdGEub2xkX3Jvb3QuZGF0YSwKKwkJCQkoY2hhciAqKSBzdGF0dXMubmZzdjIuZmhzdGF0dXNfdS5maHNfZmhhbmRsZSwKKwkJCQlORlNfRkhTSVpFKTsKKwl9IGVsc2UgeworCQlmaGFuZGxlMyAqbXlfZmhhbmRsZTsKKwkJaWYgKHN0YXR1cy5uZnN2My5maHNfc3RhdHVzICE9IDApIHsKKwkJCWJiX2Vycm9yX21zZygiJXM6JXMgZmFpbGVkLCByZWFzb24gZ2l2ZW4gYnkgc2VydmVyOiAlcyIsCisJCQkJaG9zdG5hbWUsIHBhdGhuYW1lLAorCQkJCW5mc19zdHJlcnJvcihzdGF0dXMubmZzdjMuZmhzX3N0YXR1cykpOworCQkJZ290byBmYWlsOworCQl9CisJCW15X2ZoYW5kbGUgPSAmc3RhdHVzLm5mc3YzLm1vdW50cmVzM191Lm1vdW50aW5mby5maGFuZGxlOworCQltZW1zZXQoZGF0YS5vbGRfcm9vdC5kYXRhLCAwLCBORlNfRkhTSVpFKTsKKwkJbWVtc2V0KCZkYXRhLnJvb3QsIDAsIHNpemVvZihkYXRhLnJvb3QpKTsKKwkJZGF0YS5yb290LnNpemUgPSBteV9maGFuZGxlLT5maGFuZGxlM19sZW47CisJCW1lbWNweShkYXRhLnJvb3QuZGF0YSwKKwkJCQkoY2hhciAqKSBteV9maGFuZGxlLT5maGFuZGxlM192YWwsCisJCQkJbXlfZmhhbmRsZS0+ZmhhbmRsZTNfbGVuKTsKKworCQlkYXRhLmZsYWdzIHw9IE5GU19NT1VOVF9WRVIzOworCX0KKworCS8qIENyZWF0ZSBuZnMgc29ja2V0IGZvciBrZXJuZWwgKi8KKwlpZiAodGNwKSB7CisJCWlmIChuZnNfbW91bnRfdmVyc2lvbiA8IDMpIHsKKwkJCWJiX2Vycm9yX21zZygiTkZTIG92ZXIgVENQIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKwkJCWdvdG8gZmFpbDsKKwkJfQorCQlmc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOworCX0gZWxzZQorCQlmc29jayA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7CisJaWYgKGZzb2NrIDwgMCkgeworCQliYl9wZXJyb3JfbXNnKCJuZnMgc29ja2V0Iik7CisJCWdvdG8gZmFpbDsKKwl9CisJaWYgKGJpbmRyZXN2cG9ydChmc29jaywgMCkgPCAwKSB7CisJCWJiX3BlcnJvcl9tc2coIm5mcyBiaW5kcmVzdnBvcnQiKTsKKwkJZ290byBmYWlsOworCX0KKwlpZiAocG9ydCA9PSAwKSB7CisJCXNlcnZlcl9hZGRyLnNpbl9wb3J0ID0gUE1BUFBPUlQ7CisJCXBvcnQgPSBwbWFwX2dldHBvcnQoJnNlcnZlcl9hZGRyLCBuZnNwcm9nLCBuZnN2ZXJzLAorCQkJCQl0Y3AgPyBJUFBST1RPX1RDUCA6IElQUFJPVE9fVURQKTsKKwkJaWYgKHBvcnQgPT0gMCkKKwkJCXBvcnQgPSBORlNfUE9SVDsKKwl9CisJc2VydmVyX2FkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKworCS8qIFByZXBhcmUgZGF0YSBzdHJ1Y3R1cmUgZm9yIGtlcm5lbCAqLworCWRhdGEuZmQgPSBmc29jazsKKwltZW1jcHkoKGNoYXIgKikgJmRhdGEuYWRkciwgKGNoYXIgKikgJnNlcnZlcl9hZGRyLCBzaXplb2YoZGF0YS5hZGRyKSk7CisJc3RybmNweShkYXRhLmhvc3RuYW1lLCBob3N0bmFtZSwgc2l6ZW9mKGRhdGEuaG9zdG5hbWUpKTsKKworCS8qIENsZWFuIHVwICovCisJYXV0aF9kZXN0cm95KG1jbGllbnQtPmNsX2F1dGgpOworCWNsbnRfZGVzdHJveShtY2xpZW50KTsKKwljbG9zZShtc29jayk7CisJbXNvY2sgPSAtMTsKKworCWlmIChiZykgeworCQkvKiBXZSBtdXN0IHdhaXQgdW50aWwgbW91bnQgZGlyZWN0b3J5IGlzIGF2YWlsYWJsZSAqLworCQlzdHJ1Y3Qgc3RhdCBzdGF0YnVmOworCQlpbnQgZGVsYXkgPSAxOworCQl3aGlsZSAoc3RhdChtcC0+bW50X2RpciwgJnN0YXRidWYpID09IC0xKSB7CisJCQlpZiAoIWRhZW1vbml6ZWQpIHsKKwkJCQlkYWVtb25pemVkID0gZGFlbW9uaXplKCk7CisJCQkJaWYgKGRhZW1vbml6ZWQgPD0gMCkgeyAvKiBwYXJlbnQgb3IgZXJyb3IgKi8KKy8qIEZJWE1FOiBwYXJlbnQgZG9lc24ndCBjbG9zZSBmc29jayAtID8/ISAqLworCQkJCQlyZXR2YWwgPSAtZGFlbW9uaXplZDsKKwkJCQkJZ290byByZXQ7CisJCQkJfQorCQkJfQorCQkJc2xlZXAoZGVsYXkpOwkvKiAxLCAyLCA0LCA4LCAxNiwgMzAsIC4uLiAqLworCQkJZGVsYXkgKj0gMjsKKwkJCWlmIChkZWxheSA+IDMwKQorCQkJCWRlbGF5ID0gMzA7CisJCX0KKwl9CisKKwkvKiBQZXJmb3JtIGFjdHVhbCBtb3VudCAqLworIGRvX21vdW50OgorCXJldHZhbCA9IG1vdW50X2l0X25vdyhtcCwgdmZzZmxhZ3MsIChjaGFyKikmZGF0YSk7CisJZ290byByZXQ7CisKKwkvKiBBYm9ydCAqLworIGZhaWw6CisJaWYgKG1zb2NrID49IDApIHsKKwkJaWYgKG1jbGllbnQpIHsKKwkJCWF1dGhfZGVzdHJveShtY2xpZW50LT5jbF9hdXRoKTsKKwkJCWNsbnRfZGVzdHJveShtY2xpZW50KTsKKwkJfQorCQljbG9zZShtc29jayk7CisJfQorCWlmIChmc29jayA+PSAwKQorCQljbG9zZShmc29jayk7CisKKyByZXQ6CisJZnJlZShob3N0bmFtZSk7CisJZnJlZShtb3VudGhvc3QpOworCWZyZWUoZmlsdGVyb3B0cyk7CisJcmV0dXJuIHJldHZhbDsKK30KKworI2Vsc2UgLy8gIUVOQUJMRV9GRUFUVVJFX01PVU5UX05GUworCisvKiBMaW51eCAyLjYuMjMrIHN1cHBvcnRzIG5mcyBtb3VudHMgd2l0aCBvcHRpb25zIHBhc3NlZCBhcyBhIHN0cmluZy4KKyAqIEZvciBvbGRlciBrZXJuZWxzLCB5b3UgbXVzdCBidWlsZCBidXN5Ym94IHdpdGggRU5BQkxFX0ZFQVRVUkVfTU9VTlRfTkZTLgorICogKEhvd2V2ZXIsIG5vdGUgdGhhdCB0aGVuIHlvdSBsb3NlIGFueSBjaGFuY2VzIHRoYXQgTkZTIG92ZXIgSVB2NiB3b3VsZCB3b3JrKS4KKyAqLworc3RhdGljIGludCBuZnNtb3VudChzdHJ1Y3QgbW50ZW50ICptcCwgdW5zaWduZWQgbG9uZyB2ZnNmbGFncywgY2hhciAqZmlsdGVyb3B0cykKK3sKKwlsZW5fYW5kX3NvY2thZGRyICpsc2E7CisJY2hhciAqb3B0czsKKwljaGFyICplbmQ7CisJY2hhciAqZG90dGVkOworCWludCByZXQ7CisKKyMgaWYgRU5BQkxFX0ZFQVRVUkVfSVBWNgorCWVuZCA9IHN0cmNocihtcC0+bW50X2ZzbmFtZSwgJ10nKTsKKwlpZiAoZW5kICYmIGVuZFsxXSA9PSAnOicpCisJCWVuZCsrOworCWVsc2UKKyMgZW5kaWYKKwkJLyogbW91bnRfbWFpbigpIGd1YXJhbnRlZXMgdGhhdCAnOicgaXMgdGhlcmUgKi8KKwkJZW5kID0gc3RyY2hyKG1wLT5tbnRfZnNuYW1lLCAnOicpOworCisJKmVuZCA9ICdcMCc7CisJbHNhID0geGhvc3Qyc29ja2FkZHIobXAtPm1udF9mc25hbWUsIC8qcG9ydDoqLyAwKTsKKwkqZW5kID0gJzonOworCWRvdHRlZCA9IHhtYWxsb2Nfc29ja2FkZHIyZG90dGVkX25vcG9ydCgmbHNhLT51LnNhKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGZyZWUobHNhKTsKKwlvcHRzID0geGFzcHJpbnRmKCIlcyVzYWRkcj0lcyIsCisJCWZpbHRlcm9wdHMgPyBmaWx0ZXJvcHRzIDogIiIsCisJCWZpbHRlcm9wdHMgPyAiLCIgOiAiIiwKKwkJZG90dGVkCisJKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGZyZWUoZG90dGVkKTsKKwlyZXQgPSBtb3VudF9pdF9ub3cobXAsIHZmc2ZsYWdzLCBvcHRzKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGZyZWUob3B0cyk7CisKKwlyZXR1cm4gcmV0OworfQorCisjZW5kaWYgLy8gIUVOQUJMRV9GRUFUVVJFX01PVU5UX05GUworCisvLyBNb3VudCBvbmUgZGlyZWN0b3J5LiAgSGFuZGxlcyBDSUZTLCBORlMsIGxvb3BiYWNrLCBhdXRvYmluZCwgYW5kIGZpbGVzeXN0ZW0KKy8vIHR5cGUgZGV0ZWN0aW9uLiAgUmV0dXJucyAwIGZvciBzdWNjZXNzLCBub256ZXJvIGZvciBmYWlsdXJlLgorLy8gTkI6IG1wLT54eHggZmllbGRzIG1heSBiZSB0cmFzaGVkIG9uIGV4aXQKK3N0YXRpYyBpbnQgc2luZ2xlbW91bnQoc3RydWN0IG1udGVudCAqbXAsIGludCBpZ25vcmVfYnVzeSkKK3sKKwlpbnQgcmMgPSAtMTsKKwl1bnNpZ25lZCBsb25nIHZmc2ZsYWdzOworCWNoYXIgKmxvb3BGaWxlID0gTlVMTCwgKmZpbHRlcm9wdHMgPSBOVUxMOworCWxsaXN0X3QgKmZsID0gTlVMTDsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWVycm5vID0gMDsKKworCXZmc2ZsYWdzID0gcGFyc2VfbW91bnRfb3B0aW9ucyhtcC0+bW50X29wdHMsICZmaWx0ZXJvcHRzKTsKKworCS8vIFRyZWF0IGZzdHlwZSAiYXV0byIgYXMgdW5zcGVjaWZpZWQKKwlpZiAobXAtPm1udF90eXBlICYmIHN0cmNtcChtcC0+bW50X3R5cGUsICJhdXRvIikgPT0gMCkKKwkJbXAtPm1udF90eXBlID0gTlVMTDsKKworCS8vIE1pZ2h0IHRoaXMgYmUgYSB2aXJ0dWFsIGZpbGVzeXN0ZW0/CisJaWYgKEVOQUJMRV9GRUFUVVJFX01PVU5UX0hFTFBFUlMgJiYgc3RyY2hyKG1wLT5tbnRfZnNuYW1lLCAnIycpKSB7CisJCWNoYXIgKmFyZ3NbMzVdOworCQljaGFyICpzOworCQlpbnQgbjsKKwkJLy8gZnNuYW1lOiAiY21kI2FyZzEjYXJnMi4uLiIKKwkJLy8gV0FSTklORzogYWxsb3dzIGV4ZWN1dGlvbiBvZiBhcmJpdHJhcnkgY29tbWFuZHMhCisJCS8vIFRyeSAibW91bnQgJ3NoIy1jI3NoJyBib2d1c19kaXIiLgorCQkvLyBJdCBpcyBzYWZlIE9OTFkgYmVjYXVzZSBub24tcm9vdAorCQkvLyBjYW5ub3QgdXNlIHR3by1hcmd1bWVudCBtb3VudCBjb21tYW5kCisJCS8vIGFuZCB1c2luZyBvbmUtYXJndW1lbnQgIm1vdW50ICdzaCMtYyNzaCciIGRvZXNuJ3Qgd29yazoKKwkJLy8gIm1vdW50OiBjYW4ndCBmaW5kIHNoIy1jI3NoIGluIC9ldGMvZnN0YWIiCisJCS8vIChpZiAvZXRjL2ZzdGFiIGhhcyBpdCwgaXQncyBvazogcm9vdCBzZXRzIHVwIC9ldGMvZnN0YWIpLgorCisJCXMgPSBtcC0+bW50X2ZzbmFtZTsKKwkJbiA9IDA7CisJCWFyZ3NbbisrXSA9IHM7CisJCXdoaWxlICgqcyAmJiBuIDwgMzUgLSAyKSB7CisJCQlpZiAoKnMrKyA9PSAnIycgJiYgKnMgIT0gJyMnKSB7CisJCQkJc1stMV0gPSAnXDAnOworCQkJCWFyZ3NbbisrXSA9IHM7CisJCQl9CisJCX0KKwkJYXJnc1tuKytdID0gbXAtPm1udF9kaXI7CisJCWFyZ3Nbbl0gPSBOVUxMOworCQlyYyA9IHNwYXduX2FuZF93YWl0KGFyZ3MpOworCQlnb3RvIHJlcG9ydF9lcnJvcjsKKwl9CisKKwkvLyBNaWdodCB0aGlzIGJlIGFuIENJRlMgZmlsZXN5c3RlbT8KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfTU9VTlRfQ0lGUworCSAmJiAoIW1wLT5tbnRfdHlwZSB8fCBzdHJjbXAobXAtPm1udF90eXBlLCAiY2lmcyIpID09IDApCisJICYmIChtcC0+bW50X2ZzbmFtZVswXSA9PSAnLycgfHwgbXAtPm1udF9mc25hbWVbMF0gPT0gJ1xcJykKKwkgJiYgbXAtPm1udF9mc25hbWVbMF0gPT0gbXAtPm1udF9mc25hbWVbMV0KKwkpIHsKKwkJaW50IGxlbjsKKwkJY2hhciBjOworCQljaGFyICpob3N0bmFtZSwgKnNoYXJlOworCQljaGFyICpkb3R0ZWQsICppcDsKKwkJbGVuX2FuZF9zb2NrYWRkciAqbHNhOworCisJCS8vIFBhcnNlIG1wLT5tbnRfZnNuYW1lIG9mIHRoZSBmb3JtICIvL2hvc3RuYW1lL3NoYXJlWy9kaXIxL2RpcjJdIgorCisJCWhvc3RuYW1lID0gbXAtPm1udF9mc25hbWUgKyAyOworCQlsZW4gPSBzdHJjc3BuKGhvc3RuYW1lLCAiL1xcIik7CisJCXNoYXJlID0gaG9zdG5hbWUgKyBsZW4gKyAxOworCQlpZiAobGVuID09IDAgICAgICAgICAgLy8gM3JkIGNoYXIgaXMgYSBbYmFja11zbGFzaCAoSU9XOiBlbXB0eSBob3N0bmFtZSkKKwkJIHx8IHNoYXJlWy0xXSA9PSAnXDAnIC8vIG5vIFtiYWNrXXNsYXNoIGFmdGVyIGhvc3RuYW1lCisJCSB8fCBzaGFyZVswXSA9PSAnXDAnICAvLyBlbXB0eSBzaGFyZSBuYW1lCisJCSkgeworCQkJZ290byByZXBvcnRfZXJyb3I7CisJCX0KKwkJYyA9IHNoYXJlWy0xXTsKKwkJc2hhcmVbLTFdID0gJ1wwJzsKKwkJbGVuID0gc3RyY3NwbihzaGFyZSwgIi9cXCIpOworCisJCS8vICJ1bmM9XFxob3N0bmFtZVxzaGFyZSIgb3B0aW9uIGlzIG1hbmRhdG9yeQorCQkvLyBhZnRlciBDSUZTIG9wdGlvbiBwYXJzaW5nIHdhcyByZXdyaXR0ZW4gaW4gTGludXggMy40LgorCQkvLyBNdXN0IHVzZSBiYWNrc2xhc2hlcy4KKwkJLy8gSWYgL2RpcjEvZGlyMiBpcyBwcmVzZW50LCBhbHNvIGFkZCAicHJlZml4cGF0aD1kaXIxL2RpcjIiCisJCXsKKwkJCWNoYXIgKnVuYyA9IHhhc3ByaW50ZigKKwkJCQlzaGFyZVtsZW5dICE9ICdcMCcgIC8qICIvZGlyMS9kaXIyIiBleGlzdHM/ICovCisJCQkJCT8gInVuYz1cXFxcJXNcXCUuKnMscHJlZml4cGF0aD0lcyIKKwkJCQkJOiAidW5jPVxcXFwlc1xcJS4qcyIsCisJCQkJaG9zdG5hbWUsCisJCQkJbGVuLCBzaGFyZSwKKwkJCQlzaGFyZSArIGxlbiArIDEgIC8qICJkaXIxL2RpcjIiICovCisJCQkpOworCQkJcGFyc2VfbW91bnRfb3B0aW9ucyh1bmMsICZmaWx0ZXJvcHRzKTsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgZnJlZSh1bmMpOworCQl9CisKKwkJbHNhID0gaG9zdDJzb2NrYWRkcihob3N0bmFtZSwgMCk7CisJCXNoYXJlWy0xXSA9IGM7CisJCWlmICghbHNhKQorCQkJZ290byByZXBvcnRfZXJyb3I7CisKKwkJLy8gSW5zZXJ0ICJpcD0uLi4iIG9wdGlvbiBpbnRvIG9wdGlvbnMKKwkJZG90dGVkID0geG1hbGxvY19zb2NrYWRkcjJkb3R0ZWRfbm9wb3J0KCZsc2EtPnUuc2EpOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIGZyZWUobHNhKTsKKwkJaXAgPSB4YXNwcmludGYoImlwPSVzIiwgZG90dGVkKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBmcmVlKGRvdHRlZCk7CisJCXBhcnNlX21vdW50X29wdGlvbnMoaXAsICZmaWx0ZXJvcHRzKTsKKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKSBmcmVlKGlwKTsKKworCQltcC0+bW50X3R5cGUgPSAoY2hhciopImNpZnMiOworCQlyYyA9IG1vdW50X2l0X25vdyhtcCwgdmZzZmxhZ3MsIGZpbHRlcm9wdHMpOworCisJCWdvdG8gcmVwb3J0X2Vycm9yOworCX0KKworCS8vIE1pZ2h0IHRoaXMgYmUgYW4gTkZTIGZpbGVzeXN0ZW0/CisJaWYgKCghbXAtPm1udF90eXBlIHx8IGlzX3ByZWZpeGVkX3dpdGgobXAtPm1udF90eXBlLCAibmZzIikpCisJICYmIHN0cmNocihtcC0+bW50X2ZzbmFtZSwgJzonKSAhPSBOVUxMCisJKSB7CisJCWlmICghbXAtPm1udF90eXBlKQorCQkJbXAtPm1udF90eXBlID0gKGNoYXIqKSJuZnMiOworCQlyYyA9IG5mc21vdW50KG1wLCB2ZnNmbGFncywgZmlsdGVyb3B0cyk7CisJCWdvdG8gcmVwb3J0X2Vycm9yOworCX0KKworCS8vIExvb2sgYXQgdGhlIGZpbGUuICAoTm90IGZvdW5kIGlzbid0IGEgZmFpbHVyZSBmb3IgcmVtb3VudCwgb3IgZm9yCisJLy8gYSBzeW50aGV0aWMgZmlsZXN5c3RlbSBsaWtlIHByb2Mgb3Igc3lzZnMuKQorCS8vIChXZSB1c2Ugc3RhdCwgbm90IGxzdGF0LCBpbiBvcmRlciB0byBhbGxvdworCS8vIG1vdW50IHN5bWxpbmtfdG9fZmlsZV9vcl9ibGtkZXYgZGlyKQorCWlmICghc3RhdChtcC0+bW50X2ZzbmFtZSwgJnN0KQorCSAmJiAhKHZmc2ZsYWdzICYgKE1TX1JFTU9VTlQgfCBNU19CSU5EIHwgTVNfTU9WRSkpCisJKSB7CisJCS8vIERvIHdlIG5lZWQgdG8gYWxsb2NhdGUgYSBsb29wYmFjayBkZXZpY2UgZm9yIGl0PworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfTU9VTlRfTE9PUCAmJiBTX0lTUkVHKHN0LnN0X21vZGUpKSB7CisJCQlsb29wRmlsZSA9IGJiX3NpbXBsaWZ5X3BhdGgobXAtPm1udF9mc25hbWUpOworCQkJbXAtPm1udF9mc25hbWUgPSBOVUxMOyAvLyB3aWxsIHJlY2VpdmUgbWFsbG9jZWQgbG9vcCBkZXYgbmFtZQorCQkJaWYgKHNldF9sb29wKCZtcC0+bW50X2ZzbmFtZSwgbG9vcEZpbGUsIDAsIC8qcm86Ki8gKHZmc2ZsYWdzICYgTVNfUkRPTkxZKSkgPCAwKSB7CisJCQkJaWYgKGVycm5vID09IEVQRVJNIHx8IGVycm5vID09IEVBQ0NFUykKKwkJCQkJYmJfZXJyb3JfbXNnKGJiX21zZ19wZXJtX2RlbmllZF9hcmVfeW91X3Jvb3QpOworCQkJCWVsc2UKKwkJCQkJYmJfcGVycm9yX21zZygiY2FuJ3Qgc2V0dXAgbG9vcCBkZXZpY2UiKTsKKwkJCQlyZXR1cm4gZXJybm87CisJCQl9CisKKwkJLy8gQXV0b2RldGVjdCBiaW5kIG1vdW50cworCQl9IGVsc2UgaWYgKFNfSVNESVIoc3Quc3RfbW9kZSkgJiYgIW1wLT5tbnRfdHlwZSkKKwkJCXZmc2ZsYWdzIHw9IE1TX0JJTkQ7CisJfQorCisJLy8gSWYgd2Uga25vdyB0aGUgZnN0eXBlIChvciBkb24ndCBuZWVkIHRvKSwganVtcCBzdHJhaWdodAorCS8vIHRvIHRoZSBhY3R1YWwgbW91bnQuCisJaWYgKG1wLT5tbnRfdHlwZSB8fCAodmZzZmxhZ3MgJiAoTVNfUkVNT1VOVCB8IE1TX0JJTkQgfCBNU19NT1ZFKSkpIHsKKwkJY2hhciAqbmV4dDsKKwkJZm9yICg7OykgeworCQkJbmV4dCA9IG1wLT5tbnRfdHlwZSA/IHN0cmNocihtcC0+bW50X3R5cGUsICcsJykgOiBOVUxMOworCQkJaWYgKG5leHQpCisJCQkJKm5leHQgPSAnXDAnOworCQkJcmMgPSBtb3VudF9pdF9ub3cobXAsIHZmc2ZsYWdzLCBmaWx0ZXJvcHRzKTsKKwkJCWlmIChyYyA9PSAwIHx8ICFuZXh0KQorCQkJCWJyZWFrOworCQkJbXAtPm1udF90eXBlID0gbmV4dCArIDE7CisJCX0KKwl9IGVsc2UgeworCQkvLyBMb29wIHRocm91Z2ggZmlsZXN5c3RlbSB0eXBlcyB1bnRpbCBtb3VudCBzdWNjZWVkcworCQkvLyBvciB3ZSBydW4gb3V0CisKKwkJLy8gSW5pdGlhbGl6ZSBsaXN0IG9mIGJsb2NrIGJhY2tlZCBmaWxlc3lzdGVtcy4KKwkJLy8gVGhpcyBoYXMgdG8gYmUgZG9uZSBoZXJlIHNvIHRoYXQgZHVyaW5nICJtb3VudCAtYSIsCisJCS8vIG1vdW50cyBhZnRlciAvcHJvYyBzaG93cyB1cCBjYW4gYXV0b2RldGVjdC4KKwkJaWYgKCFmc2xpc3QpIHsKKwkJCWZzbGlzdCA9IGdldF9ibG9ja19iYWNrZWRfZmlsZXN5c3RlbXMoKTsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCAmJiBmc2xpc3QpCisJCQkJYXRleGl0KGRlbGV0ZV9ibG9ja19iYWNrZWRfZmlsZXN5c3RlbXMpOworCQl9CisKKwkJZm9yIChmbCA9IGZzbGlzdDsgZmw7IGZsID0gZmwtPmxpbmspIHsKKwkJCW1wLT5tbnRfdHlwZSA9IGZsLT5kYXRhOworCQkJcmMgPSBtb3VudF9pdF9ub3cobXAsIHZmc2ZsYWdzLCBmaWx0ZXJvcHRzKTsKKwkJCWlmIChyYyA9PSAwKQorCQkJCWJyZWFrOworCQl9CisJfQorCisJLy8gSWYgbW91bnQgZmFpbGVkLCBjbGVhbiB1cCBsb29wIGZpbGUgKGlmIGFueSkuCisJaWYgKEVOQUJMRV9GRUFUVVJFX01PVU5UX0xPT1AgJiYgcmMgJiYgbG9vcEZpbGUpIHsKKwkJZGVsX2xvb3AobXAtPm1udF9mc25hbWUpOworCQlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJCWZyZWUobG9vcEZpbGUpOworCQkJZnJlZShtcC0+bW50X2ZzbmFtZSk7CisJCX0KKwl9CisKKyByZXBvcnRfZXJyb3I6CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQlmcmVlKGZpbHRlcm9wdHMpOworCisJaWYgKGVycm5vID09IEVCVVNZICYmIGlnbm9yZV9idXN5KQorCQlyZXR1cm4gMDsKKwlpZiAocmMgIT0gMCkKKwkJYmJfcGVycm9yX21zZygibW91bnRpbmcgJXMgb24gJXMgZmFpbGVkIiwgbXAtPm1udF9mc25hbWUsIG1wLT5tbnRfZGlyKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8vIC1PIHN1cHBvcnQKKy8vICAgIC1PIGludGVycHJldHMgYSBsaXN0IG9mIGZpbHRlciBvcHRpb25zIHdoaWNoIHNlbGVjdCB3aGV0aGVyIGEgbW91bnQKKy8vIHBvaW50IHdpbGwgYmUgbW91bnRlZDogb25seSBtb3VudHMgd2l0aCBvcHRpb25zIG1hdGNoaW5nICphbGwqIGZpbHRlcmluZworLy8gb3B0aW9ucyB3aWxsIGJlIHNlbGVjdGVkLgorLy8gICAgQnkgZGVmYXVsdCBlYWNoIC1PIGZpbHRlciBvcHRpb24gbXVzdCBiZSBwcmVzZW50IGluIHRoZSBsaXN0IG9mIG1vdW50CisvLyBvcHRpb25zLCBidXQgaWYgaXQgaXMgcHJlZml4ZWQgYnkgIm5vIiB0aGVuIGl0IG11c3QgYmUgYWJzZW50LgorLy8gRm9yIGV4YW1wbGUsCisvLyAgLU8gYSxub2IsYyAgbWF0Y2hlcyAgLW8gYSxjICBidXQgZmFpbHMgdG8gbWF0Y2ggIC1vIGEsYixjCisvLyAgICAgICAgICAgICAgKGFuZCBhbHNvIGZhaWxzIHRvIG1hdGNoICAtbyBhICBiZWNhdXNlICAtbyBjICBpcyBhYnNlbnQpLgorLy8KKy8vIEl0IGlzIGRpZmZlcmVudCBmcm9tIC10IGluIHRoYXQgZWFjaCBvcHRpb24gaXMgbWF0Y2hlZCBleGFjdGx5OyBhIGxlYWRpbmcKKy8vICJubyIgYXQgdGhlIGJlZ2lubmluZyBvZiBvbmUgb3B0aW9uIGRvZXMgbm90IG5lZ2F0ZSB0aGUgcmVzdC4KK3N0YXRpYyBpbnQgbWF0Y2hfb3B0KGNvbnN0IGNoYXIgKmZzX29wdF9pbiwgY29uc3QgY2hhciAqT19vcHQpCit7CisJaWYgKCFPX29wdCkKKwkJcmV0dXJuIDE7CisKKwl3aGlsZSAoKk9fb3B0KSB7CisJCWNvbnN0IGNoYXIgKmZzX29wdCA9IGZzX29wdF9pbjsKKwkJaW50IE9fbGVuOworCQlpbnQgbWF0Y2g7CisKKwkJLy8gSWYgb3B0aW9uIGJlZ2lucyB3aXRoICJubyIgdGhlbiB0cmVhdCBhcyBhbiBpbnZlcnRlZCBtYXRjaDoKKwkJLy8gbWF0Y2hpbmcgaXMgYSBmYWlsdXJlCisJCW1hdGNoID0gMDsKKwkJaWYgKE9fb3B0WzBdID09ICduJyAmJiBPX29wdFsxXSA9PSAnbycpIHsKKwkJCW1hdGNoID0gMTsKKwkJCU9fb3B0ICs9IDI7CisJCX0KKwkJLy8gSXNvbGF0ZSB0aGUgY3VycmVudCBPIG9wdGlvbgorCQlPX2xlbiA9IHN0cmNocm51bChPX29wdCwgJywnKSAtIE9fb3B0OworCQkvLyBDaGVjayBmb3IgYSBtYXRjaCBhZ2FpbnN0IGV4aXN0aW5nIG9wdGlvbnMKKwkJd2hpbGUgKDEpIHsKKwkJCWlmIChzdHJuY21wKGZzX29wdCwgT19vcHQsIE9fbGVuKSA9PSAwCisJCQkgJiYgKGZzX29wdFtPX2xlbl0gPT0gJ1wwJyB8fCBmc19vcHRbT19sZW5dID09ICcsJykKKwkJCSkgeworCQkJCWlmIChtYXRjaCkKKwkJCQkJcmV0dXJuIDA7ICAvLyAibm8iIHByZWZpeCwgYnV0IG9wdGlvbiBmb3VuZAorCQkJCW1hdGNoID0gMTsgIC8vIGN1cnJlbnQgTyBvcHRpb24gZm91bmQsIGdvIGNoZWNrIG5leHQgb25lCisJCQkJYnJlYWs7CisJCQl9CisJCQlmc19vcHQgPSBzdHJjaHIoZnNfb3B0LCAnLCcpOworCQkJaWYgKCFmc19vcHQpCisJCQkJYnJlYWs7CisJCQlmc19vcHQrKzsKKwkJfQorCQlpZiAobWF0Y2ggPT0gMCkKKwkJCXJldHVybiAwOyAgICAgLy8gbWF0Y2ggd2FudGVkIGJ1dCBub3QgZm91bmQKKwkJaWYgKE9fb3B0W09fbGVuXSA9PSAnXDAnKSAvLyBlbmQ/CisJCQlicmVhazsKKwkJLy8gU3RlcCB0byB0aGUgbmV4dCBPIG9wdGlvbgorCQlPX29wdCArPSBPX2xlbiArIDE7CisJfQorCS8vIElmIHdlIGdldCBoZXJlIHRoZW4gZXZlcnl0aGluZyBtYXRjaGVkCisJcmV0dXJuIDE7Cit9CisKKy8vIFBhcnNlIG9wdGlvbnMsIGlmIG5lY2Vzc2FyeSBwYXJzZSBmc3RhYi9tdGFiLCBhbmQgY2FsbCBzaW5nbGVtb3VudCBmb3IKKy8vIGVhY2ggZGlyZWN0b3J5IHRvIGJlIG1vdW50ZWQuCitpbnQgbW91bnRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IG1vdW50X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwljaGFyICpjbWRvcHRzID0geHphbGxvYygxKTsKKwljaGFyICpmc3R5cGUgPSBOVUxMOworCWNoYXIgKk9fb3B0bWF0Y2ggPSBOVUxMOworCWNoYXIgKnN0b3JhZ2VfcGF0aDsKKwlsbGlzdF90ICpsc3RfbyA9IE5VTEw7CisJY29uc3QgY2hhciAqZnN0YWJuYW1lID0gIi9ldGMvZnN0YWIiOworCUZJTEUgKmZzdGFiOworCWludCBpLCBqOworCWludCByYyA9IEVYSVRfU1VDQ0VTUzsKKwl1bnNpZ25lZCBsb25nIGNtZG9wdF9mbGFnczsKKwl1bnNpZ25lZCBvcHQ7CisJc3RydWN0IG1udGVudCBtdHBhaXJbMl0sICptdGN1ciA9IG10cGFpcjsKKwlJRl9OT1RfREVTS1RPUChjb25zdCBpbnQgbm9ucm9vdCA9IDA7KQorCisJSUZfREVTS1RPUChpbnQgbm9ucm9vdCA9ICkgc2FuaXRpemVfZW52X2lmX3N1aWQoKTsKKworCUlOSVRfRygpOworCisJLy8gUGFyc2UgbG9uZyBvcHRpb25zLCBsaWtlIC0tYmluZCBhbmQgLS1tb3ZlLiAgTm90ZSB0aGF0IC1vIG9wdGlvbgorCS8vIGFuZCAtLW9wdGlvbiBhcmUgc3lub255bW91cy4gIFllcywgdGhpcyBtZWFucyAtLXJlbW91bnQscncgd29ya3MuCisJZm9yIChpID0gaiA9IDE7IGFyZ3ZbaV07IGkrKykgeworCQlpZiAoYXJndltpXVswXSA9PSAnLScgJiYgYXJndltpXVsxXSA9PSAnLScpCisJCQlhcHBlbmRfbW91bnRfb3B0aW9ucygmY21kb3B0cywgYXJndltpXSArIDIpOworCQllbHNlCisJCQlhcmd2W2orK10gPSBhcmd2W2ldOworCX0KKwlhcmd2W2pdID0gTlVMTDsKKworCS8vIFBhcnNlIHJlbWFpbmluZyBvcHRpb25zCisJLy8gTWF4IDIgcGFyYW1zOyAtbyBpcyBhIGxpc3QsIC12IGlzIGEgY291bnRlcgorCW9wdF9jb21wbGVtZW50YXJ5ID0gIj8ybzo6IiBJRl9GRUFUVVJFX01PVU5UX1ZFUkJPU0UoInZ2Iik7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgT1BUSU9OX1NUUiwgJmxzdF9vLCAmZnN0eXBlLCAmT19vcHRtYXRjaAorCQkJSUZfRkVBVFVSRV9NT1VOVF9PVEhFUlRBQigsICZmc3RhYm5hbWUpCisJCQlJRl9GRUFUVVJFX01PVU5UX1ZFUkJPU0UoLCAmdmVyYm9zZSkpOworCXdoaWxlIChsc3RfbykgYXBwZW5kX21vdW50X29wdGlvbnMoJmNtZG9wdHMsIGxsaXN0X3BvcCgmbHN0X28pKTsgLy8gLW8KKwlpZiAob3B0ICYgT1BUX3IpIGFwcGVuZF9tb3VudF9vcHRpb25zKCZjbWRvcHRzLCAicm8iKTsgLy8gLXIKKwlpZiAob3B0ICYgT1BUX3cpIGFwcGVuZF9tb3VudF9vcHRpb25zKCZjbWRvcHRzLCAicnciKTsgLy8gLXcKKwlhcmd2ICs9IG9wdGluZDsKKworCS8vIElmIHdlIGhhdmUgbm8gYXJndW1lbnRzLCBzaG93IGN1cnJlbnRseSBtb3VudGVkIGZpbGVzeXN0ZW1zCisJaWYgKCFhcmd2WzBdKSB7CisJCWlmICghKG9wdCAmIE9QVF9hKSkgeworCQkJRklMRSAqbW91bnRUYWJsZSA9IHNldG1udGVudChiYl9wYXRoX210YWJfZmlsZSwgInIiKTsKKworCQkJaWYgKCFtb3VudFRhYmxlKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJubyAlcyIsIGJiX3BhdGhfbXRhYl9maWxlKTsKKworCQkJd2hpbGUgKGdldG1udGVudF9yKG1vdW50VGFibGUsICZtdHBhaXJbMF0sIGdldG1udGVudF9idWYsCisJCQkJCQkJCUdFVE1OVEVOVF9CVUZTSVpFKSkKKwkJCXsKKwkJCQkvLyBEb24ndCBzaG93IHJvb3Rmcy4gRklYTUU6IHdoeT8/CisJCQkJLy8gdXRpbC1saW51eCAyLjEyYSBoYXBwaWx5IHNob3dzIHJvb3Rmcy4uLgorCQkJCS8vaWYgKHN0cmNtcChtdHBhaXItPm1udF9mc25hbWUsICJyb290ZnMiKSA9PSAwKSBjb250aW51ZTsKKworCQkJCWlmICghZnN0eXBlIHx8IHN0cmNtcChtdHBhaXItPm1udF90eXBlLCBmc3R5cGUpID09IDApCisJCQkJCXByaW50ZigiJXMgb24gJXMgdHlwZSAlcyAoJXMpXG4iLCBtdHBhaXItPm1udF9mc25hbWUsCisJCQkJCQkJbXRwYWlyLT5tbnRfZGlyLCBtdHBhaXItPm1udF90eXBlLAorCQkJCQkJCW10cGFpci0+bW50X29wdHMpOworCQkJfQorCQkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJCWVuZG1udGVudChtb3VudFRhYmxlKTsKKwkJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJCX0KKwkJc3RvcmFnZV9wYXRoID0gTlVMTDsKKwl9IGVsc2UgeworCQkvLyBXaGVuIHdlIGhhdmUgdHdvIGFyZ3VtZW50cywgdGhlIHNlY29uZCBpcyB0aGUgZGlyZWN0b3J5IGFuZCB3ZSBjYW4KKwkJLy8gc2tpcCBsb29raW5nIGF0IGZzdGFiIGVudGlyZWx5LiAgV2UgY2FuIGFsd2F5cyBhYnNwYXRoKCkgdGhlIGRpcmVjdG9yeQorCQkvLyBhcmd1bWVudCB3aGVuIHdlIGdldCBpdC4KKwkJaWYgKGFyZ3ZbMV0pIHsKKwkJCWlmIChub25yb290KQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ195b3VfbXVzdF9iZV9yb290KTsKKwkJCW10cGFpci0+bW50X2ZzbmFtZSA9IGFyZ3ZbMF07CisJCQltdHBhaXItPm1udF9kaXIgPSBhcmd2WzFdOworCQkJbXRwYWlyLT5tbnRfdHlwZSA9IGZzdHlwZTsKKwkJCW10cGFpci0+bW50X29wdHMgPSBjbWRvcHRzOworCQkJcmVzb2x2ZV9tb3VudF9zcGVjKCZtdHBhaXItPm1udF9mc25hbWUpOworCQkJcmMgPSBzaW5nbGVtb3VudChtdHBhaXIsIC8qaWdub3JlX2J1c3k6Ki8gMCk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJc3RvcmFnZV9wYXRoID0gYmJfc2ltcGxpZnlfcGF0aChhcmd2WzBdKTsgLy8gbWFsbG9jZWQKKwl9CisKKwkvLyBQYXN0IHRoaXMgcG9pbnQsIHdlIGFyZSBoYW5kbGluZyBlaXRoZXIgIm1vdW50IC1hIFtvcHRzXSIKKwkvLyBvciAibW91bnQgW29wdHNdIHNpbmdsZV9wYXJhbSIKKworCWNtZG9wdF9mbGFncyA9IHBhcnNlX21vdW50X29wdGlvbnMoY21kb3B0cywgTlVMTCk7CisJaWYgKG5vbnJvb3QgJiYgKGNtZG9wdF9mbGFncyAmIH5NU19TSUxFTlQpKSAvLyBOb24tcm9vdCB1c2VycyBjYW5ub3Qgc3BlY2lmeSBmbGFncworCQliYl9lcnJvcl9tc2dfYW5kX2RpZShiYl9tc2dfeW91X211c3RfYmVfcm9vdCk7CisKKwkvLyBJZiB3ZSBoYXZlIGEgc2hhcmVkIHN1YnRyZWUgZmxhZywgZG9uJ3Qgd29ycnkgYWJvdXQgZnN0YWIgb3IgbXRhYi4KKwlpZiAoRU5BQkxFX0ZFQVRVUkVfTU9VTlRfRkxBR1MKKwkgJiYgKGNtZG9wdF9mbGFncyAmIChNU19TSEFSRUQgfCBNU19QUklWQVRFIHwgTVNfU0xBVkUgfCBNU19VTkJJTkRBQkxFKSkKKwkpIHsKKwkJLy8gdmVyYm9zZV9tb3VudChzb3VyY2UsIHRhcmdldCwgdHlwZSwgZmxhZ3MsIGRhdGEpCisJCXJjID0gdmVyYm9zZV9tb3VudCgiIiwgYXJndlswXSwgIiIsIGNtZG9wdF9mbGFncywgIiIpOworCQlpZiAocmMpCisJCQliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKGFyZ3ZbMF0pOworCQlyZXR1cm4gcmM7CisJfQorCisJLy8gQSBtYWxpY2lvdXMgdXNlciBjb3VsZCBvdmVybW91bnQgL3VzciB3aXRob3V0IHRoaXMuCisJaWYgKEVOQUJMRV9GRUFUVVJFX01PVU5UX09USEVSVEFCICYmIG5vbnJvb3QpCisJCWZzdGFibmFtZSA9ICIvZXRjL2ZzdGFiIjsKKwkvLyBPcGVuIGVpdGhlciBmc3RhYiBvciBtdGFiCisJaWYgKGNtZG9wdF9mbGFncyAmIE1TX1JFTU9VTlQpIHsKKwkJLy8gV0FSTklORy4gSSBhbSBub3Qgc3VyZSB0aGlzIG1hdGNoZXMgdXRpbC1saW51eCdzCisJCS8vIGJlaGF2aW9yLiBJdCdzIHBvc3NpYmxlIHV0aWwtbGludXggZG9lcyBub3QKKwkJLy8gdGFrZSAtbyBvcHRzIGZyb20gbXRhYiAodGFrZXMgb25seSBtb3VudCBzb3VyY2UpLgorCQlmc3RhYm5hbWUgPSBiYl9wYXRoX210YWJfZmlsZTsKKwl9CisJZnN0YWIgPSBzZXRtbnRlbnQoZnN0YWJuYW1lLCAiciIpOworCWlmICghZnN0YWIpCisJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3QgcmVhZCAnJXMnIiwgZnN0YWJuYW1lKTsKKworCS8vIExvb3AgdGhyb3VnaCBlbnRyaWVzIHVudGlsIHdlIGZpbmQgd2hhdCB3ZSdyZSBsb29raW5nIGZvcgorCW1lbXNldChtdHBhaXIsIDAsIHNpemVvZihtdHBhaXIpKTsKKwlmb3IgKDs7KSB7CisJCXN0cnVjdCBtbnRlbnQgKm10b3RoZXIgPSAobXRjdXI9PW10cGFpciA/IG10cGFpcisxIDogbXRwYWlyKTsKKworCQkvLyBHZXQgbmV4dCBmc3RhYiBlbnRyeQorCQlpZiAoIWdldG1udGVudF9yKGZzdGFiLCBtdGN1ciwgZ2V0bW50ZW50X2J1ZgorCQkJCQkrIChtdGN1cj09bXRwYWlyID8gR0VUTU5URU5UX0JVRlNJWkUvMiA6IDApLAorCQkJCUdFVE1OVEVOVF9CVUZTSVpFLzIpCisJCSkgeyAvLyBFbmQgb2YgZnN0YWIvbXRhYiBpcyByZWFjaGVkCisJCQltdGN1ciA9IG10b3RoZXI7IC8vIHRoZSB0aGluZyB3ZSBmb3VuZCBsYXN0IHRpbWUKKwkJCWJyZWFrOworCQl9CisKKwkJLy8gSWYgd2UncmUgdHJ5aW5nIHRvIG1vdW50IHNvbWV0aGluZyBzcGVjaWZpYyBhbmQgdGhpcyBpc24ndCBpdCwKKwkJLy8gc2tpcCBpdC4gIE5vdGUgd2UgbXVzdCBtYXRjaCB0aGUgZXhhY3QgdGV4dCBpbiBmc3RhYiAoYWxhCisJCS8vICJwcm9jIikgb3IgYSBmdWxsIHBhdGggZnJvbSByb290CisJCWlmIChhcmd2WzBdKSB7CisKKwkJCS8vIElzIHRoaXMgd2hhdCB3ZSdyZSBsb29raW5nIGZvcj8KKwkJCWlmIChzdHJjbXAoYXJndlswXSwgbXRjdXItPm1udF9mc25hbWUpICE9IDAKKwkJCSAmJiBzdHJjbXAoc3RvcmFnZV9wYXRoLCBtdGN1ci0+bW50X2ZzbmFtZSkgIT0gMAorCQkJICYmIHN0cmNtcChhcmd2WzBdLCBtdGN1ci0+bW50X2RpcikgIT0gMAorCQkJICYmIHN0cmNtcChzdG9yYWdlX3BhdGgsIG10Y3VyLT5tbnRfZGlyKSAhPSAwCisJCQkpIHsKKwkJCQljb250aW51ZTsgLy8gbm8KKwkJCX0KKworCQkJLy8gUmVtZW1iZXIgdGhpcyBlbnRyeS4gIFNvbWV0aGluZyBsYXRlciBtYXkgaGF2ZQorCQkJLy8gb3Zlcm1vdW50ZWQgaXQsIGFuZCB3ZSB3YW50IHRoZSBfbGFzdF8gbWF0Y2guCisJCQltdGN1ciA9IG10b3RoZXI7CisKKwkJLy8gSWYgd2UncmUgbW91bnRpbmcgYWxsCisJCX0gZWxzZSB7CisJCQlzdHJ1Y3QgbW50ZW50ICptcDsKKwkJCS8vIE5vLCBtb3VudCAtYSB3b24ndCBtb3VudCBhbnl0aGluZywKKwkJCS8vIGV2ZW4gdXNlciBtb3VudHMsIGZvciBtZXJlIGh1bWFucworCQkJaWYgKG5vbnJvb3QpCisJCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoYmJfbXNnX3lvdV9tdXN0X2JlX3Jvb3QpOworCisJCQkvLyBEb2VzIHR5cGUgbWF0Y2g/IChOVUxMIG1hdGNoZXMgYWx3YXlzKQorCQkJaWYgKCFtYXRjaF9mc3R5cGUobXRjdXIsIGZzdHlwZSkpCisJCQkJY29udGludWU7CisKKwkJCS8vIFNraXAgbm9hdXRvIGFuZCBzd2FwIGFueXdheQorCQkJaWYgKChwYXJzZV9tb3VudF9vcHRpb25zKG10Y3VyLT5tbnRfb3B0cywgTlVMTCkgJiAoTU9VTlRfTk9BVVRPIHwgTU9VTlRfU1dBUCkpCisJCQkvLyBzd2FwIGlzIGJvZ3VzICJmc3R5cGUiLCBwYXJzZV9tb3VudF9vcHRpb25zIGNhbid0IGNoZWNrIGZzdHlwZXMKKwkJCSB8fCBzdHJjYXNlY21wKG10Y3VyLT5tbnRfdHlwZSwgInN3YXAiKSA9PSAwCisJCQkpIHsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJLy8gRG9lcyAoYXQgbGVhc3Qgb25lKSBvcHRpb24gbWF0Y2g/CisJCQkvLyAoTlVMTCBtYXRjaGVzIGFsd2F5cykKKwkJCWlmICghbWF0Y2hfb3B0KG10Y3VyLT5tbnRfb3B0cywgT19vcHRtYXRjaCkpCisJCQkJY29udGludWU7CisKKwkJCXJlc29sdmVfbW91bnRfc3BlYygmbXRjdXItPm1udF9mc25hbWUpOworCisJCQkvLyBORlMgbW91bnRzIHdhbnQgdGhpcyB0byBiZSB4cmVhbGxvYy1hYmxlCisJCQltdGN1ci0+bW50X29wdHMgPSB4c3RyZHVwKG10Y3VyLT5tbnRfb3B0cyk7CisKKwkJCS8vIElmIG5vdGhpbmcgaXMgbW91bnRlZCBvbiB0aGlzIGRpcmVjdG9yeS4uLgorCQkJLy8gKG90aGVyd2lzZSByZXBlYXRlZCAibW91bnQgLWEiIG1vdW50cyBldmVyeXRoaW5nIGFnYWluKQorCQkJbXAgPSBmaW5kX21vdW50X3BvaW50KG10Y3VyLT5tbnRfZGlyLCAvKnN1YmRpcl90b286Ki8gMCk7CisJCQkvLyBXZSBkbyBub3QgY2hlY2sgZnNuYW1lIG1hdGNoIG9mIGZvdW5kIG1vdW50IHBvaW50IC0KKwkJCS8vICIvIiBtYXkgaGF2ZSBmc25hbWUgb2YgIi9kZXYvcm9vdCIgd2hpbGUgZnN0YWIKKwkJCS8vIHNheXMgIi9kZXYvc29tZXRoaW5nX2Vsc2UiLgorCQkJaWYgKG1wKSB7CisJCQkJaWYgKHZlcmJvc2UpIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCJhY2NvcmRpbmcgdG8gJXMsICIKKwkJCQkJCSIlcyBpcyBhbHJlYWR5IG1vdW50ZWQgb24gJXMiLAorCQkJCQkJYmJfcGF0aF9tdGFiX2ZpbGUsCisJCQkJCQltcC0+bW50X2ZzbmFtZSwgbXAtPm1udF9kaXIpOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJLy8gLi4ubW91bnQgdGhpcyB0aGluZworCQkJCWlmIChzaW5nbGVtb3VudChtdGN1ciwgLyppZ25vcmVfYnVzeToqLyAxKSkgeworCQkJCQkvLyBDb3VudCBudW1iZXIgb2YgZmFpbGVkIG1vdW50cworCQkJCQlyYysrOworCQkJCX0KKwkJCX0KKwkJCWZyZWUobXRjdXItPm1udF9vcHRzKTsKKwkJfQorCX0KKworCS8vIEVuZCBvZiBmc3RhYi9tdGFiIGlzIHJlYWNoZWQuCisJLy8gV2VyZSB3ZSBsb29raW5nIGZvciBzb21ldGhpbmcgc3BlY2lmaWM/CisJaWYgKGFyZ3ZbMF0pIHsgLy8geWVzCisJCXVuc2lnbmVkIGxvbmcgbDsKKworCQkvLyBJZiB3ZSBkaWRuJ3QgZmluZCBhbnl0aGluZywgY29tcGxhaW4KKwkJaWYgKCFtdGN1ci0+bW50X2ZzbmFtZSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCJjYW4ndCBmaW5kICVzIGluICVzIiwKKwkJCQlhcmd2WzBdLCBmc3RhYm5hbWUpOworCisJCS8vIFdoYXQgaGFwcGVucyB3aGVuIHdlIHRyeSB0byAibW91bnQgc3dhcF9wYXJ0aXRpb24iPworCQkvLyAoZnN0YWIgY29udGFpbnRzICJzd2FwX3BhcnRpdGlvbiBzd2FwIHN3YXAgZGVmYXVsdHMgMCAwIikKKwkJLy8gdXRpbC1saW51eC1uZyAyLjEzLjEgZG9lcyB0aGlzOgorCQkvLyBzdGF0KCIvc2Jpbi9tb3VudC5zd2FwIiwgMHg3ZmZmNjJhM2EzNTApID0gLTEgRU5PRU5UIChObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5KQorCQkvLyBtb3VudCgic3dhcF9wYXJ0aXRpb24iLCAic3dhcCIsICJzd2FwIiwgTVNfTUdDX1ZBTCwgTlVMTCkgPSAtMSBFTk9FTlQgKE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnkpCisJCS8vIGxzdGF0KCJzd2FwIiwgMHg3ZmZmNjJhM2E2NDApICAgICAgICAgICA9IC0xIEVOT0VOVCAoTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSkKKwkJLy8gd3JpdGUoMiwgIm1vdW50OiBtb3VudCBwb2ludCBzd2FwIGRvZXMgbm90IGV4aXN0XG4iLCAzOSkgPSAzOQorCQkvLyBleGl0X2dyb3VwKDMyKSAgICAgICAgICAgICAgICAgICAgICAgICAgPSA/CisjaWYgMAorCQkvLyBJbiBjYXNlIHdlIHdhbnQgdG8gc2ltcGx5IHNraXAgc3dhcCBwYXJ0aXRpb25zOgorCQlsID0gcGFyc2VfbW91bnRfb3B0aW9ucyhtdGN1ci0+bW50X29wdHMsIE5VTEwpOworCQlpZiAoKGwgJiBNT1VOVF9TV0FQKQorCQkvLyBzd2FwIGlzIGJvZ3VzICJmc3R5cGUiLCBwYXJzZV9tb3VudF9vcHRpb25zIGNhbid0IGNoZWNrIGZzdHlwZXMKKwkJIHx8IHN0cmNhc2VjbXAobXRjdXItPm1udF90eXBlLCAic3dhcCIpID09IDAKKwkJKSB7CisJCQlnb3RvIHJldDsKKwkJfQorI2VuZGlmCisJCWlmIChub25yb290KSB7CisJCQkvLyBmc3RhYiBtdXN0IGhhdmUgInVzZXJzIiBvciAidXNlciIKKwkJCWwgPSBwYXJzZV9tb3VudF9vcHRpb25zKG10Y3VyLT5tbnRfb3B0cywgTlVMTCk7CisJCQlpZiAoIShsICYgTU9VTlRfVVNFUlMpKQorCQkJCWJiX2Vycm9yX21zZ19hbmRfZGllKGJiX21zZ195b3VfbXVzdF9iZV9yb290KTsKKwkJfQorCisJCS8vdXRpbC1saW51eC0yLjEyIGRvZXMgbm90IGRvIHRoaXMgY2hlY2suCisJCS8vLy8gSWYgbm90aGluZyBpcyBtb3VudGVkIG9uIHRoaXMgZGlyZWN0b3J5Li4uCisJCS8vLy8gKG90aGVyd2lzZSByZXBlYXRlZCAibW91bnQgRk9PIiBtb3VudHMgRk9PIGFnYWluKQorCQkvL21wID0gZmluZF9tb3VudF9wb2ludChtdGN1ci0+bW50X2RpciwgLypzdWJkaXJfdG9vOiovIDApOworCQkvL2lmIChtcCkgeworCQkvLwliYl9lcnJvcl9tc2coImFjY29yZGluZyB0byAlcywgIgorCQkvLwkJIiVzIGlzIGFscmVhZHkgbW91bnRlZCBvbiAlcyIsCisJCS8vCQliYl9wYXRoX210YWJfZmlsZSwKKwkJLy8JCW1wLT5tbnRfZnNuYW1lLCBtcC0+bW50X2Rpcik7CisJCS8vfSBlbHNlIHsKKwkJCS8vIC4uLm1vdW50IHRoZSBsYXN0IHRoaW5nIHdlIGZvdW5kCisJCQltdGN1ci0+bW50X29wdHMgPSB4c3RyZHVwKG10Y3VyLT5tbnRfb3B0cyk7CisJCQlhcHBlbmRfbW91bnRfb3B0aW9ucygmKG10Y3VyLT5tbnRfb3B0cyksIGNtZG9wdHMpOworCQkJcmVzb2x2ZV9tb3VudF9zcGVjKCZtdHBhaXItPm1udF9mc25hbWUpOworCQkJcmMgPSBzaW5nbGVtb3VudChtdGN1ciwgLyppZ25vcmVfYnVzeToqLyAwKTsKKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJCQlmcmVlKG10Y3VyLT5tbnRfb3B0cyk7CisJCS8vfQorCX0KKworIC8vcmV0OgorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJZW5kbW50ZW50KGZzdGFiKTsKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJZnJlZShzdG9yYWdlX3BhdGgpOworCQlmcmVlKGNtZG9wdHMpOworCX0KKworLy9UT0RPOiBleGl0Y29kZSBzaG91bGQgYmUgT1JlZCBtYXNrIG9mIChmcm9tICJtYW4gbW91bnQiKToKKy8vIDAgc3VjY2VzcworLy8gMSBpbmNvcnJlY3QgaW52b2NhdGlvbiBvciBwZXJtaXNzaW9ucworLy8gMiBzeXN0ZW0gZXJyb3IgKG91dCBvZiBtZW1vcnksIGNhbm5vdCBmb3JrLCBubyBtb3JlIGxvb3AgZGV2aWNlcykKKy8vIDQgaW50ZXJuYWwgbW91bnQgYnVnIG9yIG1pc3NpbmcgbmZzIHN1cHBvcnQgaW4gbW91bnQKKy8vIDggdXNlciBpbnRlcnJ1cHQKKy8vMTYgcHJvYmxlbXMgd3JpdGluZyBvciBsb2NraW5nIC9ldGMvbXRhYgorLy8zMiBtb3VudCBmYWlsdXJlCisvLzY0IHNvbWUgbW91bnQgc3VjY2VlZGVkCisJcmV0dXJuIHJjOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9waXZvdF9yb290LmMgYi91dGlsLWxpbnV4L3Bpdm90X3Jvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2YwMWZhCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9waXZvdF9yb290LmMKQEAgLTAsMCArMSwzNCBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogcGl2b3Rfcm9vdC5jIC0gQ2hhbmdlIHJvb3QgZmlsZSBzeXN0ZW0uICBCYXNlZCBvbiB1dGlsLWxpbnV4IDIuMTBzCisgKgorICogYnVzeWJveGVkIGJ5IEV2aW4gUm9iZXJ0c29uCisgKiBwaXZvdF9yb290IHN5c2NhbGwgc3R1YmJlZCBieSBFcmlrIEFuZGVyc2VuLCBzbyBpdCB3aWxsIGNvbXBpbGUKKyAqICAgICByZWdhcmRsZXNzIG9mIHRoZSBrZXJuZWwgYmVpbmcgdXNlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBwaXZvdF9yb290X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJORVdfUk9PVCBQVVRfT0xEIgorLy91c2FnZTojZGVmaW5lIHBpdm90X3Jvb3RfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJNb3ZlIHRoZSBjdXJyZW50IHJvb3QgZmlsZSBzeXN0ZW0gdG8gUFVUX09MRCBhbmQgbWFrZSBORVdfUk9PVFxuIgorLy91c2FnZTogICAgICAgInRoZSBuZXcgcm9vdCBmaWxlIHN5c3RlbSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2V4dGVybiBpbnQgcGl2b3Rfcm9vdChjb25zdCBjaGFyICogbmV3X3Jvb3QsY29uc3QgY2hhciAqIHB1dF9vbGQpOworCitpbnQgcGl2b3Rfcm9vdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcGl2b3Rfcm9vdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwlpZiAoYXJnYyAhPSAzKQorCQliYl9zaG93X3VzYWdlKCk7CisKKwlpZiAocGl2b3Rfcm9vdChhcmd2WzFdLCBhcmd2WzJdKSA8IDApIHsKKwkJLyogcHJpbnRzICJwaXZvdF9yb290OiA8c3RyZXJyb3IgdGV4dD4iICovCisJCWJiX3BlcnJvcl9ub21zZ19hbmRfZGllKCk7CisJfQorCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvcmRhdGUuYyBiL3V0aWwtbGludXgvcmRhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDc1ZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9yZGF0ZS5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFRoZSBSZGF0ZSBjb21tYW5kIHdpbGwgYXNrIGEgdGltZSBzZXJ2ZXIgZm9yIHRoZSBSRkMgODY4IHRpbWUKKyAqIGFuZCBvcHRpb25hbGx5IHNldCB0aGUgc3lzdGVtIHRpbWUuCisgKgorICogYnkgU3RlcmxpbmcgSHV4bGV5IDxzdGVybGluZ0BldXJvcGEuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisqLworCisvL3VzYWdlOiNkZWZpbmUgcmRhdGVfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstc3BdIEhPU1QiCisvL3VzYWdlOiNkZWZpbmUgcmRhdGVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJHZXQgYW5kIHBvc3NpYmx5IHNldCBzeXN0ZW0gdGltZSBmcm9tIGEgcmVtb3RlIEhPU1RcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLXMJU2V0IHN5c3RlbSB0aW1lIChkZWZhdWx0KSIKKy8vdXNhZ2U6ICAgICAiXG4JLXAJUHJpbnQgdGltZSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2VudW0geyBSRkNfODY4X0JJQVMgPSAyMjA4OTg4ODAwVUwgfTsKKworc3RhdGljIHZvaWQgc29ja2V0X3RpbWVvdXQoaW50IHNpZyBVTlVTRURfUEFSQU0pCit7CisJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInRpbWVvdXQgY29ubmVjdGluZyB0byB0aW1lIHNlcnZlciIpOworfQorCitzdGF0aWMgdGltZV90IGFza3JlbW90ZWRhdGUoY29uc3QgY2hhciAqaG9zdCkKK3sKKwl1aW50MzJfdCBuZXR0OworCWludCBmZDsKKworCS8qIEFkZCBhIHRpbWVvdXQgZm9yIGRlYWQgb3IgaW5hY2Nlc3NpYmxlIHNlcnZlcnMgKi8KKwlhbGFybSgxMCk7CisJc2lnbmFsKFNJR0FMUk0sIHNvY2tldF90aW1lb3V0KTsKKworCWZkID0gY3JlYXRlX2FuZF9jb25uZWN0X3N0cmVhbV9vcl9kaWUoaG9zdCwgYmJfbG9va3VwX3BvcnQoInRpbWUiLCAidGNwIiwgMzcpKTsKKworCWlmIChzYWZlX3JlYWQoZmQsICZuZXR0LCA0KSAhPSA0KSAgICAvKiByZWFkIHRpbWUgZnJvbSBzZXJ2ZXIgKi8KKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoIiVzOiAlcyIsIGhvc3QsICJzaG9ydCByZWFkIik7CisJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQljbG9zZShmZCk7CisKKwkvKiBDb252ZXJ0IGZyb20gbmV0d29yayBieXRlIG9yZGVyIHRvIGxvY2FsIGJ5dGUgb3JkZXIuCisJICogUkZDIDg2OCB0aW1lIGlzIHRoZSBudW1iZXIgb2Ygc2Vjb25kcworCSAqIHNpbmNlIDAwOjAwIChtaWRuaWdodCkgMSBKYW51YXJ5IDE5MDAgR01UCisJICogdGhlIFJGQyA4NjggdGltZSAyLDIwOCw5ODgsODAwIGNvcnJlc3BvbmRzIHRvIDAwOjAwICAxIEphbiAxOTcwIEdNVAorCSAqIFN1YnRyYWN0IHRoZSBSRkMgODY4IHRpbWUgdG8gZ2V0IExpbnV4IGVwb2NoLgorCSAqLworCisJcmV0dXJuIG50b2hsKG5ldHQpIC0gUkZDXzg2OF9CSUFTOworfQorCitpbnQgcmRhdGVfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHJkYXRlX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwl0aW1lX3QgcmVtb3RlX3RpbWU7CisJdW5zaWduZWQgZmxhZ3M7CisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMSI7CisJZmxhZ3MgPSBnZXRvcHQzMihhcmd2LCAic3AiKTsKKworCXJlbW90ZV90aW1lID0gYXNrcmVtb3RlZGF0ZShhcmd2W29wdGluZF0pOworCisJaWYgKCEoZmxhZ3MgJiAyKSkgeyAvKiBubyAtcCAoLXMgbWF5IGJlIHByZXNlbnQpICovCisJCXRpbWVfdCBjdXJyZW50X3RpbWU7CisKKwkJdGltZSgmY3VycmVudF90aW1lKTsKKwkJaWYgKGN1cnJlbnRfdGltZSA9PSByZW1vdGVfdGltZSkKKwkJCWJiX2Vycm9yX21zZygiY3VycmVudCB0aW1lIG1hdGNoZXMgcmVtb3RlIHRpbWUiKTsKKwkJZWxzZQorCQkJaWYgKHN0aW1lKCZyZW1vdGVfdGltZSkgPCAwKQorCQkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgiY2FuJ3Qgc2V0IHRpbWUgb2YgZGF5Iik7CisJfQorCisJaWYgKGZsYWdzICE9IDEpIC8qIG5vdCBsb25lIC1zICovCisJCXByaW50ZigiJXMiLCBjdGltZSgmcmVtb3RlX3RpbWUpKTsKKworCXJldHVybiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3JkZXYuYyBiL3V0aWwtbGludXgvcmRldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NTI4MTcKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3JkZXYuYwpAQCAtMCwwICsxLDMzIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiByZGV2IC0gcHJpbnQgZGV2aWNlIG5vZGUgYXNzb2NpYXRlZCB3aXRoIGEgZmlsZXN5c3RlbQorICoKKyAqIENvcHlyaWdodCAoYykgMjAwOCBOdW92YXRpb24gU3lzdGVtIERlc2lnbnMsIExMQworICogICBHcmFudCBFcmlja3NvbiA8Z2VyaWNrc29uQG51b3ZhdGlvbnMuY29tPgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICovCisKKy8vdXNhZ2U6I2RlZmluZSByZGV2X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICIiCisvL3VzYWdlOiNkZWZpbmUgcmRldl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlByaW50IHRoZSBkZXZpY2Ugbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbGVzeXN0ZW0gbW91bnRlZCBhdCAnLyciCisvL3VzYWdlOgorLy91c2FnZTojZGVmaW5lIHJkZXZfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgcmRldlxuIgorLy91c2FnZTogICAgICAgIi9kZXYvbXRkYmxvY2s5IC9cbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCByZGV2X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCByZGV2X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndiBVTlVTRURfUEFSQU0pCit7CisJY29uc3QgY2hhciAqcm9vdF9kZXZpY2UgPSBmaW5kX2Jsb2NrX2RldmljZSgiLyIpOworCisJaWYgKHJvb3RfZGV2aWNlKSB7CisJCXByaW50ZigiJXMgL1xuIiwgcm9vdF9kZXZpY2UpOworCQlyZXR1cm4gRVhJVF9TVUNDRVNTOworCX0KKwlyZXR1cm4gRVhJVF9GQUlMVVJFOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9yZWFkcHJvZmlsZS5jIGIvdXRpbC1saW51eC9yZWFkcHJvZmlsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NDU0MDQKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3JlYWRwcm9maWxlLmMKQEAgLTAsMCArMSwyNjMgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqICByZWFkcHJvZmlsZS5jIC0gdXNlZCB0byByZWFkIC9wcm9jL3Byb2ZpbGUKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAxOTk0LDE5OTYgQWxlc3NhbmRybyBSdWJpbmkgKHJ1YmluaUBpcHZ2aXMudW5pcHYuaXQpCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvKgorICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWlja2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CisgKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CisgKiAxOTk5LTA5LTAxIFN0ZXBoYW5lIEVyYW5pYW4gPGVyYW5pYW5AY2VsbG8uaHBsLmhwLmNvbT4KKyAqIC0gNjRiaXQgY2xlYW4gcGF0Y2gKKyAqIDNGZWIyMDAxIEFuZHJldyBNb3J0b24gPGFuZHJld21AdW93LmVkdS5hdT4KKyAqIC0gLU0gb3B0aW9uIHRvIHdyaXRlIHByb2ZpbGUgbXVsdGlwbGllci4KKyAqIDIwMDEtMTEtMDcgV2VybmVyIEFsbWVzYmVyZ2VyIDx3YUBhbG1lc2Jlcmdlci5uZXQ+CisgKiAtIGJ5dGUgb3JkZXIgYXV0by1kZXRlY3Rpb24gYW5kIC1uIG9wdGlvbgorICogMjAwMS0xMS0wOSBXZXJuZXIgQWxtZXNiZXJnZXIgPHdhQGFsbWVzYmVyZ2VyLm5ldD4KKyAqIC0gc2tpcCBzdGVwIHNpemUgKGluZGV4IDApCisgKiAyMDAyLTAzLTA5IEpvaG4gTGV2b24gPG1vekBjb21wc29jLm1hbi5hYy51az4KKyAqIC0gbWFrZSBtYXBsaW5lbm8gZG8gc29tZXRoaW5nCisgKiAyMDAyLTExLTI4IE1hZHMgTWFydGluIEpvZXJnZW5zZW4gKworICogLSBhbHNvIHRyeSAvYm9vdC9TeXN0ZW0ubWFwLWB1bmFtZSAtcmAKKyAqIDIwMDMtMDQtMDkgV2VybmVyIEFsbWVzYmVyZ2VyIDx3YUBhbG1lc2Jlcmdlci5uZXQ+CisgKiAtIGZpeGVkIG9mZi1ieSBlaWdodCBlcnJvciBhbmQgaW1wcm92ZWQgaGV1cmlzdGljcyBpbiBieXRlIG9yZGVyIGRldGVjdGlvbgorICogMjAwMy0wOC0xMiBOaWtpdGEgRGFuaWxvdiA8TmlraXRhQE5hbWVzeXMuQ09NPgorICogLSBhZGRlZCAtcyBvcHRpb247IGV4YW1wbGUgb2YgdXNlOgorICogInJlYWRwcm9maWxlIC1zIC1tIC9ib290L1N5c3RlbS5tYXAtdGVzdCB8IGdyZXAgX19kX2xvb2t1cCB8IHNvcnQgLW4gLWszIgorICoKKyAqIFRha2VuIGZyb20gdXRpbC1saW51eCBhbmQgYWRhcHRlZCBmb3IgYnVzeWJveCBieQorICogUGF1bCBNdW5kdCA8bGV0aGFsQGxpbnV4LXNoLm9yZz4uCisgKi8KKworLy91c2FnZTojZGVmaW5lIHJlYWRwcm9maWxlX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10iCisvL3VzYWdlOiNkZWZpbmUgcmVhZHByb2ZpbGVfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICIJLW0gbWFwZmlsZQkoRGVmYXVsdDogL2Jvb3QvU3lzdGVtLm1hcCkiCisvL3VzYWdlOiAgICAgIlxuCS1wIHByb2ZpbGUJKERlZmF1bHQ6IC9wcm9jL3Byb2ZpbGUpIgorLy91c2FnZTogICAgICJcbgktTSBOVU0JCVNldCB0aGUgcHJvZmlsaW5nIG11bHRpcGxpZXIgdG8gTlVNIgorLy91c2FnZTogICAgICJcbgktaQkJUHJpbnQgb25seSBpbmZvIGFib3V0IHRoZSBzYW1wbGluZyBzdGVwIgorLy91c2FnZTogICAgICJcbgktdgkJVmVyYm9zZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJCVByaW50IGFsbCBzeW1ib2xzLCBldmVuIGlmIGNvdW50IGlzIDAiCisvL3VzYWdlOiAgICAgIlxuCS1iCQlQcmludCBpbmRpdmlkdWFsIGhpc3RvZ3JhbS1iaW4gY291bnRzIgorLy91c2FnZTogICAgICJcbgktcwkJUHJpbnQgaW5kaXZpZHVhbCBjb3VudGVycyB3aXRoaW4gZnVuY3Rpb25zIgorLy91c2FnZTogICAgICJcbgktcgkJUmVzZXQgYWxsIHRoZSBjb3VudGVycyAocm9vdCBvbmx5KSIKKy8vdXNhZ2U6ICAgICAiXG4JLW4JCURpc2FibGUgYnl0ZSBvcmRlciBhdXRvLWRldGVjdGlvbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKworI2RlZmluZSBTX0xFTiAxMjgKKworLyogVGhlc2UgYXJlIHRoZSBkZWZhdWx0cyAqLworc3RhdGljIGNvbnN0IGNoYXIgZGVmYXVsdG1hcFtdIEFMSUdOMSA9ICIvYm9vdC9TeXN0ZW0ubWFwIjsKK3N0YXRpYyBjb25zdCBjaGFyIGRlZmF1bHRwcm9bXSBBTElHTjEgPSAiL3Byb2MvcHJvZmlsZSI7CisKK2ludCByZWFkcHJvZmlsZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcmVhZHByb2ZpbGVfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCUZJTEUgKm1hcDsKKwljb25zdCBjaGFyICptYXBGaWxlLCAqcHJvRmlsZTsKKwl1bnNpZ25lZCBsb25nIGluZHggPSAxOworCXNpemVfdCBsZW47CisJdWludDY0X3QgYWRkMCA9IDA7CisJdW5zaWduZWQgaW50IHN0ZXA7CisJdW5zaWduZWQgaW50ICpidWYsIHRvdGFsLCBmbl9sZW47CisJdW5zaWduZWQgbG9uZyBsb25nIGZuX2FkZCwgbmV4dF9hZGQ7ICAgICAvKiBjdXJyZW50IGFuZCBuZXh0IGFkZHJlc3MgKi8KKwljaGFyIGZuX25hbWVbU19MRU5dLCBuZXh0X25hbWVbU19MRU5dOyAgIC8qIGN1cnJlbnQgYW5kIG5leHQgbmFtZSAqLworCWNoYXIgbWFwbGluZVtTX0xFTl07CisJY2hhciBtb2RlWzhdOworCWludCBtYXBsaW5lbm8gPSAxOworCWludCBoZWFkZXJfcHJpbnRlZDsKKwlpbnQgbXVsdGlwbGllciA9IDA7CisJdW5zaWduZWQgb3B0OworCWVudW0geworCQlPUFRfTSA9ICgxIDw8IDApLAorCQlPUFRfbSA9ICgxIDw8IDEpLAorCQlPUFRfcCA9ICgxIDw8IDIpLAorCQlPUFRfbiA9ICgxIDw8IDMpLAorCQlPUFRfYSA9ICgxIDw8IDQpLAorCQlPUFRfYiA9ICgxIDw8IDUpLAorCQlPUFRfcyA9ICgxIDw8IDYpLAorCQlPUFRfaSA9ICgxIDw8IDcpLAorCQlPUFRfciA9ICgxIDw8IDgpLAorCQlPUFRfdiA9ICgxIDw8IDkpLAorCX07CisjZGVmaW5lIG9wdE11bHQgICAgKG9wdCAmIE9QVF9NKQorI2RlZmluZSBvcHROYXRpdmUgIChvcHQgJiBPUFRfbikKKyNkZWZpbmUgb3B0QWxsICAgICAob3B0ICYgT1BUX2EpCisjZGVmaW5lIG9wdEJpbnMgICAgKG9wdCAmIE9QVF9iKQorI2RlZmluZSBvcHRTdWIgICAgIChvcHQgJiBPUFRfcykKKyNkZWZpbmUgb3B0SW5mbyAgICAob3B0ICYgT1BUX2kpCisjZGVmaW5lIG9wdFJlc2V0ICAgKG9wdCAmIE9QVF9yKQorI2RlZmluZSBvcHRWZXJib3NlIChvcHQgJiBPUFRfdikKKworI2RlZmluZSBuZXh0IChjdXJyZW50XjEpCisKKwlwcm9GaWxlID0gZGVmYXVsdHBybzsKKwltYXBGaWxlID0gZGVmYXVsdG1hcDsKKworCW9wdF9jb21wbGVtZW50YXJ5ID0gIk0rIjsgLyogLU0gTiAqLworCW9wdCA9IGdldG9wdDMyKGFyZ3YsICJNOm06cDpuYWJzaXJ2IiwgJm11bHRpcGxpZXIsICZtYXBGaWxlLCAmcHJvRmlsZSk7CisKKwlpZiAob3B0ICYgKE9QVF9NfE9QVF9yKSkgeyAvKiBtdWx0IG9yIHJlc2V0LCBvciBib3RoICovCisJCWludCBmZCwgdG9fd3JpdGU7CisKKwkJLyoKKwkJICogV2hlbiB3cml0aW5nIHRoZSBtdWx0aXBsaWVyLCBpZiB0aGUgbGVuZ3RoIG9mIHRoZSB3cml0ZSBpcworCQkgKiBub3Qgc2l6ZW9mKGludCksIHRoZSBtdWx0aXBsaWVyIGlzIG5vdCBjaGFuZ2VkCisJCSAqLworCQl0b193cml0ZSA9IHNpemVvZihpbnQpOworCQlpZiAoIW9wdE11bHQpCisJCQl0b193cml0ZSA9IDE7ICAvKiBzdGggZGlmZmVyZW50IGZyb20gc2l6ZW9mKGludCkgKi8KKworCQlmZCA9IHhvcGVuKGRlZmF1bHRwcm8sIE9fV1JPTkxZKTsKKwkJeHdyaXRlKGZkLCAmbXVsdGlwbGllciwgdG9fd3JpdGUpOworCQljbG9zZShmZCk7CisJCXJldHVybiBFWElUX1NVQ0NFU1M7CisJfQorCisJLyoKKwkgKiBVc2UgYW4gZmQgZm9yIHRoZSBwcm9maWxpbmcgYnVmZmVyLCB0byBza2lwIHN0ZGlvIG92ZXJoZWFkCisJICovCisJbGVuID0gTUFYSU5UKHNzaXplX3QpOworCWJ1ZiA9IHhtYWxsb2NfeG9wZW5fcmVhZF9jbG9zZShwcm9GaWxlLCAmbGVuKTsKKwlpZiAoIW9wdE5hdGl2ZSkgeworCQlpbnQgZW50cmllcyA9IGxlbiAvIHNpemVvZigqYnVmKTsKKwkJaW50IGJpZyA9IDAsIHNtYWxsID0gMCwgaTsKKwkJdW5zaWduZWQgKnA7CisKKwkJZm9yIChwID0gYnVmKzE7IHAgPCBidWYrZW50cmllczsgcCsrKSB7CisJCQlpZiAoKnAgJiB+MFUgPDwgKHNpemVvZigqYnVmKSo0KSkKKwkJCQliaWcrKzsKKwkJCWlmICgqcCAmICgoMSA8PCAoc2l6ZW9mKCpidWYpKjQpKS0xKSkKKwkJCQlzbWFsbCsrOworCQl9CisJCWlmIChiaWcgPiBzbWFsbCkgeworCQkJYmJfZXJyb3JfbXNnKCJhc3N1bWluZyByZXZlcnNlZCBieXRlIG9yZGVyLCAiCisJCQkJInVzZSAtbiB0byBmb3JjZSBuYXRpdmUgYnl0ZSBvcmRlciIpOworCQkJZm9yIChwID0gYnVmOyBwIDwgYnVmK2VudHJpZXM7IHArKykKKwkJCQlmb3IgKGkgPSAwOyBpIDwgc2l6ZW9mKCpidWYpLzI7IGkrKykgeworCQkJCQl1bnNpZ25lZCBjaGFyICpiID0gKHVuc2lnbmVkIGNoYXIgKikgcDsKKwkJCQkJdW5zaWduZWQgY2hhciB0bXA7CisKKwkJCQkJdG1wID0gYltpXTsKKwkJCQkJYltpXSA9IGJbc2l6ZW9mKCpidWYpLWktMV07CisJCQkJCWJbc2l6ZW9mKCpidWYpLWktMV0gPSB0bXA7CisJCQkJfQorCQl9CisJfQorCisJc3RlcCA9IGJ1ZlswXTsKKwlpZiAob3B0SW5mbykgeworCQlwcmludGYoIlNhbXBsaW5nX3N0ZXA6ICV1XG4iLCBzdGVwKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwl0b3RhbCA9IDA7CisKKwltYXAgPSB4Zm9wZW5fZm9yX3JlYWQobWFwRmlsZSk7CisKKwl3aGlsZSAoZmdldHMobWFwbGluZSwgU19MRU4sIG1hcCkpIHsKKwkJaWYgKHNzY2FuZihtYXBsaW5lLCAiJWxseCAlcyAlcyIsICZmbl9hZGQsIG1vZGUsIGZuX25hbWUpICE9IDMpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMoJWkpOiB3cm9uZyBtYXAgbGluZSIsCisJCQkJCW1hcEZpbGUsIG1hcGxpbmVubyk7CisKKwkJaWYgKCFzdHJjbXAoZm5fbmFtZSwgIl9zdGV4dCIpKSAvKiBvbmx5IGVsZiB3b3JrcyBsaWtlIHRoaXMgKi8geworCQkJYWRkMCA9IGZuX2FkZDsKKwkJCWJyZWFrOworCQl9CisJCW1hcGxpbmVubysrOworCX0KKworCWlmICghYWRkMCkKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IGZpbmQgXCJfc3RleHRcIiBpbiAlcyIsIG1hcEZpbGUpOworCisJLyoKKwkgKiBNYWluIGxvb3AuCisJICovCisJd2hpbGUgKGZnZXRzKG1hcGxpbmUsIFNfTEVOLCBtYXApKSB7CisJCXVuc2lnbmVkIGludCB0aGlzID0gMDsKKworCQlpZiAoc3NjYW5mKG1hcGxpbmUsICIlbGx4ICVzICVzIiwgJm5leHRfYWRkLCBtb2RlLCBuZXh0X25hbWUpICE9IDMpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgiJXMoJWkpOiB3cm9uZyBtYXAgbGluZSIsCisJCQkJCW1hcEZpbGUsIG1hcGxpbmVubyk7CisKKwkJaGVhZGVyX3ByaW50ZWQgPSAwOworCisJCS8qIGlnbm9yZSBhbnkgTEVBRElORyAoYmVmb3JlIGEgJ1t0VF0nIHN5bWJvbCBpcyBmb3VuZCkKKwkJICAgQWJzb2x1dGUgc3ltYm9scyAqLworCQlpZiAoKCptb2RlID09ICdBJyB8fCAqbW9kZSA9PSAnPycpICYmIHRvdGFsID09IDApIGNvbnRpbnVlOworCQlpZiAoKm1vZGUgIT0gJ1QnICYmICptb2RlICE9ICd0JworCQkgJiYgKm1vZGUgIT0gJ1cnICYmICptb2RlICE9ICd3JworCQkpIHsKKwkJCWJyZWFrOyAgLyogb25seSB0ZXh0IGlzIHByb2ZpbGVkICovCisJCX0KKworCQlpZiAoaW5keCA+PSBsZW4gLyBzaXplb2YoKmJ1ZikpCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgicHJvZmlsZSBhZGRyZXNzIG91dCBvZiByYW5nZS4gIgorCQkJCQkiV3JvbmcgbWFwIGZpbGU/Iik7CisKKwkJd2hpbGUgKGluZHggPCAobmV4dF9hZGQtYWRkMCkvc3RlcCkgeworCQkJaWYgKG9wdEJpbnMgJiYgKGJ1ZltpbmR4XSB8fCBvcHRBbGwpKSB7CisJCQkJaWYgKCFoZWFkZXJfcHJpbnRlZCkgeworCQkJCQlwcmludGYoIiVzOlxuIiwgZm5fbmFtZSk7CisJCQkJCWhlYWRlcl9wcmludGVkID0gMTsKKwkJCQl9CisJCQkJcHJpbnRmKCJcdCUiUFJJeDY0Ilx0JXVcbiIsIChpbmR4IC0gMSkqc3RlcCArIGFkZDAsIGJ1ZltpbmR4XSk7CisJCQl9CisJCQl0aGlzICs9IGJ1ZltpbmR4KytdOworCQl9CisJCXRvdGFsICs9IHRoaXM7CisKKwkJaWYgKG9wdEJpbnMpIHsKKwkJCWlmIChvcHRWZXJib3NlIHx8IHRoaXMgPiAwKQorCQkJCXByaW50ZigiICB0b3RhbFx0XHRcdFx0JXVcbiIsIHRoaXMpOworCQl9IGVsc2UgaWYgKCh0aGlzIHx8IG9wdEFsbCkKKwkJICAgICAgICAmJiAoZm5fbGVuID0gbmV4dF9hZGQtZm5fYWRkKSAhPSAwCisJCSkgeworCQkJaWYgKG9wdFZlcmJvc2UpCisJCQkJcHJpbnRmKCIlMDE2bGx4ICUtNDBzICU2dSAlOC40ZlxuIiwgZm5fYWRkLAorCQkJCQlmbl9uYW1lLCB0aGlzLCB0aGlzLyhkb3VibGUpZm5fbGVuKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoIiU2dSAlLTQwcyAlOC40ZlxuIiwKKwkJCQkJdGhpcywgZm5fbmFtZSwgdGhpcy8oZG91YmxlKWZuX2xlbik7CisJCQlpZiAob3B0U3ViKSB7CisJCQkJdW5zaWduZWQgbG9uZyBsb25nIHNjYW47CisKKwkJCQlmb3IgKHNjYW4gPSAoZm5fYWRkLWFkZDApL3N0ZXAgKyAxOworCQkJCSAgICAgc2NhbiA8IChuZXh0X2FkZC1hZGQwKS9zdGVwOyBzY2FuKyspIHsKKwkJCQkJdW5zaWduZWQgbG9uZyBsb25nIGFkZHI7CisKKwkJCQkJYWRkciA9IChzY2FuIC0gMSkqc3RlcCArIGFkZDA7CisJCQkJCXByaW50ZigiXHQlI2xseFx0JXMrJSNsbHhcdCV1XG4iLAorCQkJCQkJYWRkciwgZm5fbmFtZSwgYWRkciAtIGZuX2FkZCwKKwkJCQkJCWJ1ZltzY2FuXSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJZm5fYWRkID0gbmV4dF9hZGQ7CisJCXN0cmNweShmbl9uYW1lLCBuZXh0X25hbWUpOworCisJCW1hcGxpbmVubysrOworCX0KKworCS8qIGNsb2NrIHRpY2tzLCBvdXQgb2Yga2VybmVsIHRleHQgLSBwcm9iYWJseSBtb2R1bGVzICovCisJcHJpbnRmKCIlNnUgJXNcbiIsIGJ1ZltsZW4vc2l6ZW9mKCpidWYpLTFdLCAiKnVua25vd24qIik7CisKKwkvKiB0cmFpbGVyICovCisJaWYgKG9wdFZlcmJvc2UpCisJCXByaW50ZigiJTAxNnggJS00MHMgJTZ1ICU4LjRmXG4iLAorCQkJMCwgInRvdGFsIiwgdG90YWwsIHRvdGFsLyhkb3VibGUpKGZuX2FkZC1hZGQwKSk7CisJZWxzZQorCQlwcmludGYoIiU2dSAlLTQwcyAlOC40ZlxuIiwKKwkJCXRvdGFsLCAidG90YWwiLCB0b3RhbC8oZG91YmxlKShmbl9hZGQtYWRkMCkpOworCisJZmNsb3NlKG1hcCk7CisJZnJlZShidWYpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvcmV2LmMgYi91dGlsLWxpbnV4L3Jldi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMWIyMmYKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3Jldi5jCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogcmV2IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAyMDEwIE1hcmVrIFBvbGFjZWsgPG1tcG9sYWNla0BnbWFpbC5jb20+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2FwcGxldDpJRl9SRVYoQVBQTEVUKHJldiwgQkJfRElSX0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1JFVikgKz0gcmV2Lm8KKworLy9jb25maWc6Y29uZmlnIFJFVgorLy9jb25maWc6CWJvb2wgInJldiIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBSZXZlcnNlIGxpbmVzIG9mIGEgZmlsZSBvciBmaWxlcy4KKworLy91c2FnZTojZGVmaW5lIHJldl90cml2aWFsX3VzYWdlCisvL3VzYWdlOgkiW0ZJTEVdLi4uIgorLy91c2FnZTojZGVmaW5lIHJldl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZToJIlJldmVyc2UgbGluZXMgb2YgRklMRSIKKworI2luY2x1ZGUgImxpYmJiLmgiCisjaW5jbHVkZSAidW5pY29kZS5oIgorCisjdW5kZWYgQ0hBUl9UCisjaWYgRU5BQkxFX1VOSUNPREVfU1VQUE9SVAorIyBkZWZpbmUgQ0hBUl9UIHdjaGFyX3QKKyNlbHNlCisjIGRlZmluZSBDSEFSX1QgY2hhcgorI2VuZGlmCisKKy8qIEluLXBsYWNlIGludmVydCAqLworc3RhdGljIHZvaWQgc3RycmV2KENIQVJfVCAqcywgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCWlmIChsZW4gIT0gMCkgeworCQlsZW4tLTsKKwkJaWYgKGxlbiAhPSAwICYmIHNbbGVuXSA9PSAnXG4nKQorCQkJbGVuLS07CisJfQorCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrLCBsZW4tLSkgeworCQlDSEFSX1QgYyA9IHNbaV07CisJCXNbaV0gPSBzW2xlbl07CisJCXNbbGVuXSA9IGM7CisJfQorfQorCitpbnQgcmV2X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCByZXZfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCWludCByZXR2YWw7CisJc2l6ZV90IGJ1ZnNpemU7CisJY2hhciAqYnVmOworCisJaW5pdF91bmljb2RlKCk7CisKKwlnZXRvcHQzMihhcmd2LCAiIik7CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKCFhcmd2WzBdKQorCQlhcmd2ID0gKGNoYXIgKiopJmJiX2FyZ3ZfZGFzaDsKKworCXJldHZhbCA9IEVYSVRfU1VDQ0VTUzsKKwlidWZzaXplID0gMjU2OworCWJ1ZiA9IHhtYWxsb2MoYnVmc2l6ZSk7CisJZG8geworCQlzaXplX3QgcG9zOworCQlGSUxFICpmcDsKKworCQlmcCA9IGZvcGVuX29yX3dhcm5fc3RkaW4oKmFyZ3YrKyk7CisJCWlmICghZnApIHsKKwkJCXJldHZhbCA9IEVYSVRfRkFJTFVSRTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJcG9zID0gMDsKKwkJd2hpbGUgKDEpIHsKKwkJCS8qIFJlYWQgb25lIGxpbmUgKi8KKwkJCWJ1ZltidWZzaXplIC0gMV0gPSAxOyAvKiBub3QgMCAqLworCQkJaWYgKCFmZ2V0cyhidWYgKyBwb3MsIGJ1ZnNpemUgLSBwb3MsIGZwKSkKKwkJCQlicmVhazsgLyogRU9GL2Vycm9yICovCisJCQlpZiAoYnVmW2J1ZnNpemUgLSAxXSA9PSAnXDAnIC8qIGZnZXRzIGZpbGxlZCBlbnRpcmUgYnVmZmVyICovCisJCQkgJiYgYnVmW2J1ZnNpemUgLSAyXSAhPSAnXG4nIC8qIGFuZCBkaWQgbm90IHJlYWQgJ1xuJyAqLworCQkJICYmICFmZW9mKGZwKQorCQkJKSB7CisJCQkJLyogTGluZSBpcyB0b28gbG9uZywgZXh0ZW5kIGJ1ZmZlciAqLworCQkJCXBvcyA9IGJ1ZnNpemUgLSAxOworCQkJCWJ1ZnNpemUgKz0gNjQgKyBidWZzaXplIC8gODsKKwkJCQlidWYgPSB4cmVhbGxvYyhidWYsIGJ1ZnNpemUpOworCQkJCWNvbnRpbnVlOworCQkJfQorCisJCQkvKiBQcm9jZXNzIGFuZCBwcmludCBpdCAqLworI2lmIEVOQUJMRV9VTklDT0RFX1NVUFBPUlQKKwkJCXsKKwkJCQl3Y2hhcl90ICp0bXAgPSB4bWFsbG9jKGJ1ZnNpemUgKiBzaXplb2Yod2NoYXJfdCkpOworCQkJCS8qIENvbnZlcnQgdG8gd2NoYXJfdCAobWlnaHQgZXJyb3Igb3V0ISkgKi8KKwkJCQlpbnQgbGVuICA9IG1ic3Rvd2NzKHRtcCwgYnVmLCBidWZzaXplKTsKKwkJCQlpZiAobGVuID49IDApIHsKKwkJCQkJc3RycmV2KHRtcCwgbGVuKTsKKwkJCQkJLyogQ29udmVydCBiYWNrIHRvIGNoYXIgKi8KKwkJCQkJd2NzdG9tYnMoYnVmLCB0bXAsIGJ1ZnNpemUpOworCQkJCX0KKwkJCQlmcmVlKHRtcCk7CisJCQl9CisjZWxzZQorCQkJc3RycmV2KGJ1Ziwgc3RybGVuKGJ1ZikpOworI2VuZGlmCisJCQlmcHV0cyhidWYsIHN0ZG91dCk7CisJCX0KKwkJZmNsb3NlKGZwKTsKKwl9IHdoaWxlICgqYXJndik7CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWZyZWUoYnVmKTsKKworCWZmbHVzaF9zdGRvdXRfYW5kX2V4aXQocmV0dmFsKTsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvcnRjd2FrZS5jIGIvdXRpbC1saW51eC9ydGN3YWtlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFlZTBjZgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvcnRjd2FrZS5jCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogcnRjd2FrZSAtLSBlbnRlciBhIHN5c3RlbSBzbGVlcCBzdGF0ZSB1bnRpbCBzcGVjaWZpZWQgd2FrZXVwIHRpbWUuCisgKgorICogVGhpcyB2ZXJzaW9uIHdhcyB0YWtlbiBmcm9tIHV0aWwtbGludXggYW5kIHNjcnViYmVkIGRvd24gZm9yIGJ1c3lib3guCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqCisgKiBUaGlzIHVzZXMgY3Jvc3MtcGxhdGZvcm0gTGludXggaW50ZXJmYWNlcyB0byBlbnRlciBhIHN5c3RlbSBzbGVlcCBzdGF0ZSwKKyAqIGFuZCBsZWF2ZSBpdCBubyBsYXRlciB0aGFuIGEgc3BlY2lmaWVkIHRpbWUuICBJdCB1c2VzIGFueSBSVEMgZnJhbWV3b3JrCisgKiBkcml2ZXIgdGhhdCBzdXBwb3J0cyBzdGFuZGFyZCBkcml2ZXIgbW9kZWwgd2FrZXVwIGZsYWdzLgorICoKKyAqIFRoaXMgaXMgbm9ybWFsbHkgdXNlZCBsaWtlIHRoZSBvbGQgImFwbXNsZWVwIiB1dGlsaXR5LCB0byB3YWtlIGZyb20gYQorICogc3VzcGVuZCBzdGF0ZSBsaWtlIEFDUEkgUzEgKHN0YW5kYnkpIG9yIFMzIChzdXNwZW5kLXRvLVJBTSkuICBNb3N0CisgKiBwbGF0Zm9ybXMgY2FuIGltcGxlbWVudCB0aG9zZSB3aXRob3V0IGFuYWxvZ3VlcyBvZiBCSU9TLCBBUE0sIG9yIEFDUEkuCisgKgorICogT24gc29tZSBzeXN0ZW1zLCB0aGlzIGNhbiBhbHNvIGJlIHVzZWQgbGlrZSAibnZyYW0td2FrZXVwIiwgd2FraW5nCisgKiBmcm9tIHN0YXRlcyBsaWtlIEFDUEkgUzQgKHN1c3BlbmQgdG8gZGlzaykuICBOb3QgYWxsIHN5c3RlbXMgaGF2ZQorICogcGVyc2lzdGVudCBtZWRpYSB0aGF0IGFyZSBhcHByb3ByaWF0ZSBmb3Igc3VjaCBzdXNwZW5kIG1vZGVzLgorICoKKyAqIFRoZSBiZXN0IHdheSB0byBzZXQgdGhlIHN5c3RlbSdzIFJUQyBpcyBzbyB0aGF0IGl0IGhvbGRzIHRoZSBjdXJyZW50CisgKiB0aW1lIGluIFVUQy4gIFVzZSB0aGUgIi1sIiBmbGFnIHRvIHRlbGwgdGhpcyBwcm9ncmFtIHRoYXQgdGhlIHN5c3RlbQorICogUlRDIHVzZXMgYSBsb2NhbCB0aW1lem9uZSBpbnN0ZWFkIChtYXliZSB5b3UgZHVhbC1ib290IE1TLVdpbmRvd3MpLgorICogVGhhdCBmbGFnIHNob3VsZCBub3QgYmUgbmVlZGVkIG9uIHN5c3RlbXMgd2l0aCBhZGp0aW1lIHN1cHBvcnQuCisgKi8KKworLy91c2FnZTojZGVmaW5lIHJ0Y3dha2VfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYSB8IC1sIHwgLXVdIFstZCBERVZdIFstbSBNT0RFXSBbLXMgU0VDIHwgLXQgVElNRV0iCisvL3VzYWdlOiNkZWZpbmUgcnRjd2FrZV9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIkVudGVyIGEgc3lzdGVtIHNsZWVwIHN0YXRlIHVudGlsIHNwZWNpZmllZCB3YWtldXAgdGltZVxuIgorLy91c2FnZToJSUZfTE9OR19PUFRTKAorLy91c2FnZTogICAgICJcbgktYSwtLWF1dG8JUmVhZCBjbG9jayBtb2RlIGZyb20gYWRqdGltZSIKKy8vdXNhZ2U6ICAgICAiXG4JLWwsLS1sb2NhbAlDbG9jayBpcyBzZXQgdG8gbG9jYWwgdGltZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUsLS11dGMJQ2xvY2sgaXMgc2V0IHRvIFVUQyB0aW1lIgorLy91c2FnZTogICAgICJcbgktZCwtLWRldmljZT1ERVYJU3BlY2lmeSB0aGUgUlRDIGRldmljZSIKKy8vdXNhZ2U6ICAgICAiXG4JLW0sLS1tb2RlPU1PREUJU2V0IHNsZWVwIHN0YXRlIChkZWZhdWx0OiBzdGFuZGJ5KSIKKy8vdXNhZ2U6ICAgICAiXG4JLXMsLS1zZWNvbmRzPVNFQyBTZXQgdGltZW91dCBpbiBTRUMgc2Vjb25kcyBmcm9tIG5vdyIKKy8vdXNhZ2U6ICAgICAiXG4JLXQsLS10aW1lPVRJTUUJU2V0IHRpbWVvdXQgdG8gVElNRSBzZWNvbmRzIGZyb20gZXBvY2giCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9OT1RfTE9OR19PUFRTKAorLy91c2FnZTogICAgICJcbgktYQlSZWFkIGNsb2NrIG1vZGUgZnJvbSBhZGp0aW1lIgorLy91c2FnZTogICAgICJcbgktbAlDbG9jayBpcyBzZXQgdG8gbG9jYWwgdGltZSIKKy8vdXNhZ2U6ICAgICAiXG4JLXUJQ2xvY2sgaXMgc2V0IHRvIFVUQyB0aW1lIgorLy91c2FnZTogICAgICJcbgktZCBERVYJU3BlY2lmeSB0aGUgUlRDIGRldmljZSIKKy8vdXNhZ2U6ICAgICAiXG4JLW0gTU9ERQlTZXQgc2xlZXAgc3RhdGUgKGRlZmF1bHQ6IHN0YW5kYnkpIgorLy91c2FnZTogICAgICJcbgktcyBTRUMJU2V0IHRpbWVvdXQgaW4gU0VDIHNlY29uZHMgZnJvbSBub3ciCisvL3VzYWdlOiAgICAgIlxuCS10IFRJTUUJU2V0IHRpbWVvdXQgdG8gVElNRSBzZWNvbmRzIGZyb20gZXBvY2giCisvL3VzYWdlOgkpCisKKyNpbmNsdWRlICJsaWJiYi5oIgorI2luY2x1ZGUgInJ0Y18uaCIKKworI2RlZmluZSBTWVNfUlRDX1BBVEggICAiL3N5cy9jbGFzcy9ydGMvJXMvZGV2aWNlL3Bvd2VyL3dha2V1cCIKKyNkZWZpbmUgU1lTX1BPV0VSX1BBVEggIi9zeXMvcG93ZXIvc3RhdGUiCisKK3N0YXRpYyBOT0lOTElORSBib29sIG1heV93YWtldXAoY29uc3QgY2hhciAqcnRjbmFtZSkKK3sKKwlzc2l6ZV90IHJldDsKKwljaGFyIGJ1ZlsxMjhdOworCisJLyogc3RyaXAgIi9kZXYvIiBmcm9tIHRoZSBydGNuYW1lIGhlcmUgKi8KKwlydGNuYW1lID0gc2tpcF9kZXZfcGZ4KHJ0Y25hbWUpOworCisJc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgU1lTX1JUQ19QQVRILCBydGNuYW1lKTsKKwlyZXQgPSBvcGVuX3JlYWRfY2xvc2UoYnVmLCBidWYsIHNpemVvZihidWYpKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogd2FrZXVwIGV2ZW50cyBjb3VsZCBiZSBkaXNhYmxlZCBvciBub3Qgc3VwcG9ydGVkICovCisJcmV0dXJuIGlzX3ByZWZpeGVkX3dpdGgoYnVmLCAiZW5hYmxlZFxuIikgIT0gTlVMTDsKK30KKworc3RhdGljIE5PSU5MSU5FIHZvaWQgc2V0dXBfYWxhcm0oaW50IGZkLCB0aW1lX3QgKndha2V1cCwgdGltZV90IHJ0Y190aW1lKQoreworCXN0cnVjdCB0bSAqcHRtOworCXN0cnVjdCBsaW51eF9ydGNfd2thbHJtIHdha2U7CisKKwkvKiBUaGUgd2FrZXVwIHRpbWUgaXMgaW4gUE9TSVggdGltZSAobW9yZSBvciBsZXNzIFVUQykuCisJICogSWRlYWxseSBSVENzIHVzZSB0aGF0IHNhbWUgdGltZTsgYnV0IFBDcyBjYW4ndCBkbyB0aGF0CisJICogaWYgdGhleSBuZWVkIHRvIGJvb3QgTVMtV2luZG93cy4gIE1lc3N5Li4uCisJICoKKwkgKiBXaGVuIHJ1bm5pbmcgaW4gdXRjIG1vZGUgdGhpcyBwcm9jZXNzJ3MgdGltZXpvbmUgaXMgVVRDLAorCSAqIHNvIHdlJ2xsIHBhc3MgYSBVVEMgZGF0ZSB0byB0aGUgUlRDLgorCSAqCisJICogRWxzZSBtb2RlIGlzIGxvY2FsIHNvIHRoZSB0aW1lIGdpdmVuIHRvIHRoZSBSVEMKKwkgKiB3aWxsIGluc3RlYWQgdXNlIHRoZSBsb2NhbCB0aW1lIHpvbmUuCisJICovCisJcHRtID0gbG9jYWx0aW1lKHdha2V1cCk7CisKKwl3YWtlLnRpbWUudG1fc2VjID0gcHRtLT50bV9zZWM7CisJd2FrZS50aW1lLnRtX21pbiA9IHB0bS0+dG1fbWluOworCXdha2UudGltZS50bV9ob3VyID0gcHRtLT50bV9ob3VyOworCXdha2UudGltZS50bV9tZGF5ID0gcHRtLT50bV9tZGF5OworCXdha2UudGltZS50bV9tb24gPSBwdG0tPnRtX21vbjsKKwl3YWtlLnRpbWUudG1feWVhciA9IHB0bS0+dG1feWVhcjsKKwkvKiB3ZGF5LCB5ZGF5LCBhbmQgaXNkc3QgZmllbGRzIGFyZSB1bnVzZWQgYnkgTGludXggKi8KKwl3YWtlLnRpbWUudG1fd2RheSA9IC0xOworCXdha2UudGltZS50bV95ZGF5ID0gLTE7CisJd2FrZS50aW1lLnRtX2lzZHN0ID0gLTE7CisKKwkvKiBtYW55IHJ0YyBhbGFybXMgb25seSBzdXBwb3J0IHVwIHRvIDI0IGhvdXJzIGZyb20gJ25vdycsCisJICogc28gdXNlIHRoZSAibW9yZSB0aGFuIDI0IGhvdXJzIiByZXF1ZXN0IG9ubHkgaWYgd2UgbXVzdAorCSAqLworCWlmICgocnRjX3RpbWUgKyAoMjQgKiA2MCAqIDYwKSkgPiAqd2FrZXVwKSB7CisJCXhpb2N0bChmZCwgUlRDX0FMTV9TRVQsICZ3YWtlLnRpbWUpOworCQl4aW9jdGwoZmQsIFJUQ19BSUVfT04sIDApOworCX0gZWxzZSB7CisJCS8qIGF2b2lkIGFuIGV4dHJhIEFJRV9PTiBjYWxsICovCisJCXdha2UuZW5hYmxlZCA9IDE7CisJCXhpb2N0bChmZCwgUlRDX1dLQUxNX1NFVCwgJndha2UpOworCX0KK30KKworI2RlZmluZSBSVENXQUtFX09QVF9BVVRPICAgICAgICAgMHgwMQorI2RlZmluZSBSVENXQUtFX09QVF9MT0NBTCAgICAgICAgMHgwMgorI2RlZmluZSBSVENXQUtFX09QVF9VVEMgICAgICAgICAgMHgwNAorI2RlZmluZSBSVENXQUtFX09QVF9ERVZJQ0UgICAgICAgMHgwOAorI2RlZmluZSBSVENXQUtFX09QVF9TVVNQRU5EX01PREUgMHgxMAorI2RlZmluZSBSVENXQUtFX09QVF9TRUNPTkRTICAgICAgMHgyMAorI2RlZmluZSBSVENXQUtFX09QVF9USU1FICAgICAgICAgMHg0MAorCitpbnQgcnRjd2FrZV9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgcnRjd2FrZV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgb3B0OworCWNvbnN0IGNoYXIgKnJ0Y25hbWUgPSBOVUxMOworCWNvbnN0IGNoYXIgKnN1c3BlbmQgPSAic3RhbmRieSI7CisJY29uc3QgY2hhciAqb3B0X3NlY29uZHM7CisJY29uc3QgY2hhciAqb3B0X3RpbWU7CisKKwl0aW1lX3QgcnRjX3RpbWU7CisJdGltZV90IHN5c190aW1lOworCXRpbWVfdCBhbGFybV90aW1lID0gYWxhcm1fdGltZTsKKwl1bnNpZ25lZCBzZWNvbmRzID0gc2Vjb25kczsgLyogZm9yIGNvbXBpbGVyICovCisJaW50IHV0YyA9IC0xOworCWludCBmZDsKKworI2lmIEVOQUJMRV9MT05HX09QVFMKKwlzdGF0aWMgY29uc3QgY2hhciBydGN3YWtlX2xvbmdvcHRzW10gQUxJR04xID0KKwkJImF1dG9cMCIgICAgTm9fYXJndW1lbnQgImEiCisJCSJsb2NhbFwwIiAgIE5vX2FyZ3VtZW50ICJsIgorCQkidXRjXDAiICAgICBOb19hcmd1bWVudCAidSIKKwkJImRldmljZVwwIiAgUmVxdWlyZWRfYXJndW1lbnQgImQiCisJCSJtb2RlXDAiICAgIFJlcXVpcmVkX2FyZ3VtZW50ICJtIgorCQkic2Vjb25kc1wwIiBSZXF1aXJlZF9hcmd1bWVudCAicyIKKwkJInRpbWVcMCIgICAgUmVxdWlyZWRfYXJndW1lbnQgInQiCisJCTsKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gcnRjd2FrZV9sb25nb3B0czsKKyNlbmRpZgorCS8qIE11c3QgaGF2ZSAtcyBvciAtdCwgZXhjbHVzaXZlICovCisJb3B0X2NvbXBsZW1lbnRhcnkgPSAiczp0OnMtLXQ6dC0tcyI7CisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImFsdWQ6bTpzOnQ6IiwgJnJ0Y25hbWUsICZzdXNwZW5kLCAmb3B0X3NlY29uZHMsICZvcHRfdGltZSk7CisKKwkvKiB0aGlzIGlzIHRoZSBkZWZhdWx0CisJaWYgKG9wdCAmIFJUQ1dBS0VfT1BUX0FVVE8pCisJCXV0YyA9IC0xOworCSovCisJaWYgKG9wdCAmIChSVENXQUtFX09QVF9VVEMgfCBSVENXQUtFX09QVF9MT0NBTCkpCisJCXV0YyA9IG9wdCAmIFJUQ1dBS0VfT1BUX1VUQzsKKwlpZiAob3B0ICYgUlRDV0FLRV9PUFRfU0VDT05EUykgeworCQkvKiBhbGFybSB0aW1lLCBzZWNvbmRzLXRvLXNsZWVwIChyZWxhdGl2ZSkgKi8KKwkJc2Vjb25kcyA9IHhhdG91KG9wdF9zZWNvbmRzKTsKKwl9IGVsc2UgeworCQkvKiBSVENXQUtFX09QVF9USU1FICovCisJCS8qIGFsYXJtIHRpbWUsIHRpbWVfdCAoYWJzb2x1dGUsIHNlY29uZHMgc2luY2UgMS8xIDE5NzAgVVRDKSAqLworCQlpZiAoc2l6ZW9mKGFsYXJtX3RpbWUpIDw9IHNpemVvZihsb25nKSkKKwkJCWFsYXJtX3RpbWUgPSB4YXRvbChvcHRfdGltZSk7CisJCWVsc2UKKwkJCWFsYXJtX3RpbWUgPSB4YXRvbGwob3B0X3RpbWUpOworCX0KKworCWlmICh1dGMgPT0gLTEpCisJCXV0YyA9IHJ0Y19hZGp0aW1lX2lzX3V0YygpOworCisJLyogdGhlIHJ0Y25hbWUgaXMgcmVsYXRpdmUgdG8gL2RldiAqLworCXhjaGRpcigiL2RldiIpOworCisJLyogdGhpcyBSVEMgbXVzdCBleGlzdCBhbmQgKGlmIHdlJ2xsIHNsZWVwKSBiZSB3YWtldXAtZW5hYmxlZCAqLworCWZkID0gcnRjX3hvcGVuKCZydGNuYW1lLCBPX1JET05MWSk7CisKKwlpZiAoc3RyY21wKHN1c3BlbmQsICJvbiIpICE9IDApCisJCWlmICghbWF5X3dha2V1cChydGNuYW1lKSkKKwkJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIlcyBub3QgZW5hYmxlZCBmb3Igd2FrZXVwIGV2ZW50cyIsIHJ0Y25hbWUpOworCisJLyogcmVsYXRpdmUgb3IgYWJzb2x1dGUgYWxhcm0gdGltZSwgbm9ybWFsaXplZCB0byB0aW1lX3QgKi8KKwlzeXNfdGltZSA9IHRpbWUoTlVMTCk7CisJeworCQlzdHJ1Y3QgdG0gdG1fdGltZTsKKwkJcnRjX3JlYWRfdG0oJnRtX3RpbWUsIGZkKTsKKwkJcnRjX3RpbWUgPSBydGNfdG0ydGltZSgmdG1fdGltZSwgdXRjKTsKKwl9CisKKwlpZiAob3B0ICYgUlRDV0FLRV9PUFRfVElNRSkgeworCQkvKiBDb3JyZWN0IGZvciBSVEM8LT5zeXN0ZW0gY2xvY2sgZGlmZmVyZW5jZSAqLworCQlhbGFybV90aW1lICs9IHJ0Y190aW1lIC0gc3lzX3RpbWU7CisJCWlmIChhbGFybV90aW1lIDwgcnRjX3RpbWUpCisJCQkvKgorCQkJICogQ29tcGF0IG1lc3NhZ2UgdGV4dC4KKwkJCSAqIEknZCBzYXkgIlJUQyB0aW1lIGlzIGFscmVhZHkgYWhlYWQgb2YgLi4uIiBpbnN0ZWFkLgorCQkJICovCisJCQliYl9lcnJvcl9tc2dfYW5kX2RpZSgidGltZSBkb2Vzbid0IGdvIGJhY2t3YXJkIHRvICVzIiwgY3RpbWUoJmFsYXJtX3RpbWUpKTsKKwl9IGVsc2UKKwkJYWxhcm1fdGltZSA9IHJ0Y190aW1lICsgc2Vjb25kcyArIDE7CisKKwlzZXR1cF9hbGFybShmZCwgJmFsYXJtX3RpbWUsIHJ0Y190aW1lKTsKKwlzeW5jKCk7CisjaWYgMCAvKmRlYnVnKi8KKwlwcmludGYoInN5c190aW1lOiAlcyIsIGN0aW1lKCZzeXNfdGltZSkpOworCXByaW50ZigicnRjX3RpbWU6ICVzIiwgY3RpbWUoJnJ0Y190aW1lKSk7CisjZW5kaWYKKwlwcmludGYoIndha2V1cCBmcm9tIFwiJXNcIiBhdCAlcyIsIHN1c3BlbmQsIGN0aW1lKCZhbGFybV90aW1lKSk7CisJZmZsdXNoX2FsbCgpOworCXVzbGVlcCgxMCAqIDEwMDApOworCisJaWYgKHN0cmNtcChzdXNwZW5kLCAib24iKSAhPSAwKQorCQl4b3Blbl94d3JpdGVfY2xvc2UoU1lTX1BPV0VSX1BBVEgsIHN1c3BlbmQpOworCWVsc2UgeworCQkvKiAiZmFrZSIgc3VzcGVuZCAuLi4gd2UnbGwgZG8gdGhlIGRlbGF5IG91cnNlbHZlcyAqLworCQl1bnNpZ25lZCBsb25nIGRhdGE7CisKKwkJZG8geworCQkJc3NpemVfdCByZXQgPSBzYWZlX3JlYWQoZmQsICZkYXRhLCBzaXplb2YoZGF0YSkpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQliYl9wZXJyb3JfbXNnKCJydGMgcmVhZCIpOworCQkJCWJyZWFrOworCQkJfQorCQl9IHdoaWxlICghKGRhdGEgJiBSVENfQUYpKTsKKwl9CisKKwl4aW9jdGwoZmQsIFJUQ19BSUVfT0ZGLCAwKTsKKworCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkKKwkJY2xvc2UoZmQpOworCisJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvc2NyaXB0LmMgYi91dGlsLWxpbnV4L3NjcmlwdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiY2Q3M2IKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3NjcmlwdC5jCkBAIC0wLDAgKzEsMjExIEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qCisgKiBzY3JpcHQgaW1wbGVtZW50YXRpb24gZm9yIGJ1c3lib3gKKyAqCisgKiBwYXNjYWwuYmVsbGFyZEBhZHMtbHUuY29tCisgKgorICogQmFzZWQgb24gY29kZSBmcm9tIHV0aWwtbGludXggdiAyLjEycgorICogQ29weXJpZ2h0IChjKSAxOTgwCisgKiBUaGUgUmVnZW50cyBvZiB0aGUgVW5pdmVyc2l0eSBvZiBDYWxpZm9ybmlhLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzY3JpcHRfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYWZxIiBJRl9TQ1JJUFRSRVBMQVkoInQiKSAiXSBbLWMgUFJPR10gW09VVEZJTEVdIgorLy91c2FnZTojZGVmaW5lIHNjcmlwdF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIgktYQlBcHBlbmQgb3V0cHV0IgorLy91c2FnZTogICAgICJcbgktYyBQUk9HCVJ1biBQUk9HLCBub3Qgc2hlbGwiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZsdXNoIG91dHB1dCBhZnRlciBlYWNoIHdyaXRlIgorLy91c2FnZTogICAgICJcbgktcQlRdWlldCIKKy8vdXNhZ2U6CUlGX1NDUklQVFJFUExBWSgKKy8vdXNhZ2U6ICAgICAiXG4JLXQJU2VuZCB0aW1pbmcgdG8gc3RkZXJyIgorLy91c2FnZToJKQorCisjaW5jbHVkZSAibGliYmIuaCIKKworaW50IHNjcmlwdF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc2NyaXB0X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgb3B0OworCWludCBtb2RlOworCWludCBjaGlsZF9waWQ7CisJaW50IGF0dHJfb2s7IC8qIE5COiAwOiBvayAqLworCWludCB3aW5zel9vazsKKwlpbnQgcHR5OworCWNoYXIgcHR5X2xpbmVbR0VUUFRZX0JVRlNJWkVdOworCXN0cnVjdCB0ZXJtaW9zIHR0LCBydHQ7CisJc3RydWN0IHdpbnNpemUgd2luOworCWNvbnN0IGNoYXIgKmZuYW1lID0gInR5cGVzY3JpcHQiOworCWNvbnN0IGNoYXIgKnNoZWxsOworCWNoYXIgc2hlbGxfb3B0W10gPSAiLWkiOworCWNoYXIgKnNoZWxsX2FyZyA9IE5VTEw7CisJZW51bSB7CisJCU9QVF9hID0gKDEgPDwgMCksCisJCU9QVF9jID0gKDEgPDwgMSksCisJCU9QVF9mID0gKDEgPDwgMiksCisJCU9QVF9xID0gKDEgPDwgMyksCisJCU9QVF90ID0gKDEgPDwgNCksCisJfTsKKworI2lmIEVOQUJMRV9MT05HX09QVFMKKwlzdGF0aWMgY29uc3QgY2hhciBnZXRvcHRfbG9uZ29wdHNbXSBBTElHTjEgPQorCQkiYXBwZW5kXDAiICBOb19hcmd1bWVudCAgICAgICAiYSIKKwkJImNvbW1hbmRcMCIgUmVxdWlyZWRfYXJndW1lbnQgImMiCisJCSJmbHVzaFwwIiAgIE5vX2FyZ3VtZW50ICAgICAgICJmIgorCQkicXVpZXRcMCIgICBOb19hcmd1bWVudCAgICAgICAicSIKKwkJSUZfU0NSSVBUUkVQTEFZKCJ0aW1pbmdcMCIgTm9fYXJndW1lbnQgInQiKQorCQk7CisKKwlhcHBsZXRfbG9uZ19vcHRpb25zID0gZ2V0b3B0X2xvbmdvcHRzOworI2VuZGlmCisKKwlvcHRfY29tcGxlbWVudGFyeSA9ICI/MSI7IC8qIG1heCBvbmUgYXJnICovCisJb3B0ID0gZ2V0b3B0MzIoYXJndiwgImFjOmZxIiBJRl9TQ1JJUFRSRVBMQVkoInQiKSAsICZzaGVsbF9hcmcpOworCS8vYXJnYyAtPSBvcHRpbmQ7CisJYXJndiArPSBvcHRpbmQ7CisJaWYgKGFyZ3ZbMF0pIHsKKwkJZm5hbWUgPSBhcmd2WzBdOworCX0KKwltb2RlID0gT19DUkVBVHxPX1RSVU5DfE9fV1JPTkxZOworCWlmIChvcHQgJiBPUFRfYSkgeworCQltb2RlID0gT19DUkVBVHxPX0FQUEVORHxPX1dST05MWTsKKwl9CisJaWYgKG9wdCAmIE9QVF9jKSB7CisJCXNoZWxsX29wdFsxXSA9ICdjJzsKKwl9CisJaWYgKCEob3B0ICYgT1BUX3EpKSB7CisJCXByaW50ZigiU2NyaXB0IHN0YXJ0ZWQsIGZpbGUgaXMgJXNcbiIsIGZuYW1lKTsKKwl9CisKKwlzaGVsbCA9IGdldF9zaGVsbF9uYW1lKCk7CisKKwkvKiBTb21lIHBlb3BsZSBydW4gInNjcmlwdCAuLi4gMD4mLSIuCisJICogT3VyIGNvZGUgYXNzdW1lcyB0aGF0IFNURElOX0ZJTEVOTyAhPSBwdHkuCisJICogRW5zdXJlIFNURElOX0ZJTEVOTyBpcyBub3QgY2xvc2VkOgorCSAqLworCWJiX3Nhbml0aXplX3N0ZGlvKCk7CisKKwlwdHkgPSB4Z2V0cHR5KHB0eV9saW5lKTsKKworCS8qIGdldCBjdXJyZW50IHN0ZGluJ3MgdHR5IHBhcmFtcyAqLworCWF0dHJfb2sgPSB0Y2dldGF0dHIoMCwgJnR0KTsKKwl3aW5zel9vayA9IGlvY3RsKDAsIFRJT0NHV0lOU1osIChjaGFyICopJndpbik7CisKKwlydHQgPSB0dDsKKwljZm1ha2VyYXcoJnJ0dCk7CisJcnR0LmNfbGZsYWcgJj0gfkVDSE87CisJdGNzZXRhdHRyKDAsIFRDU0FGTFVTSCwgJnJ0dCk7CisKKwkvKiAic2NyaXB0IiBmcm9tIHV0aWwtbGludXggZXhpdHMgd2hlbiBjaGlsZCBleGl0cywKKwkgKiB3ZSB3b3VsZG4ndCB3YWl0IGZvciBFT0YgZnJvbSBzbGF2ZSBwdHkKKwkgKiAob3V0cHV0IG1heSBiZSBwcm9kdWNlZCBieSBncmFuZGNoaWxkcmVuIG9mIGNoaWxkKSAqLworCXNpZ25hbChTSUdDSExELCByZWNvcmRfc2lnbm8pOworCisJLyogVE9ETzogU0lHV0lOQ0g/IHBhc3Mgd2luZG93IHNpemUgY2hhbmdlcyBkb3duIHRvIHNsYXZlPyAqLworCisJY2hpbGRfcGlkID0geHZmb3JrKCk7CisKKwlpZiAoY2hpbGRfcGlkKSB7CisJCS8qIHBhcmVudCAqLworI2RlZmluZSBidWYgYmJfY29tbW9uX2J1ZnNpejEKKwkJc3RydWN0IHBvbGxmZCBwZmRbMl07CisJCWludCBvdXRmZCwgY291bnQsIGxvb3A7CisJCWRvdWJsZSBvbGR0aW1lID0gRU5BQkxFX1NDUklQVFJFUExBWSA/IHRpbWUoTlVMTCkgOiAwOworCQlzbWFsbGludCBmZF9jb3VudCA9IDI7CisKKwkJb3V0ZmQgPSB4b3BlbihmbmFtZSwgbW9kZSk7CisJCXBmZFswXS5mZCA9IHB0eTsKKwkJcGZkWzBdLmV2ZW50cyA9IFBPTExJTjsKKwkJcGZkWzFdLmZkID0gU1RESU5fRklMRU5POworCQlwZmRbMV0uZXZlbnRzID0gUE9MTElOOworCQluZGVsYXlfb24ocHR5KTsgLyogdGhpcyBkZXNjcmlwdG9yIGlzIG5vdCBzaGFyZWQsIGNhbiBkbyB0aGlzICovCisJCS8qIG5kZWxheV9vbihTVERJTl9GSUxFTk8pOyAtIE5PLCBzdGRpbiBjYW4gYmUgc2hhcmVkISBQaXR5IDooICovCisKKwkJLyogY29weSBzdGRpbiB0byBwdHkgbWFzdGVyIGlucHV0LAorCQkgKiBjb3B5IHB0eSBtYXN0ZXIgb3V0cHV0IHRvIHN0ZG91dCBhbmQgZmlsZSAqLworCQkvKiBUT0RPOiBkb24ndCB1c2UgZnVsbF93cml0ZSdzLCB1c2UgcHJvcGVyIHdyaXRlIGJ1ZmZlcmluZyAqLworCQl3aGlsZSAoZmRfY291bnQgJiYgIWJiX2dvdF9zaWduYWwpIHsKKwkJCS8qIG5vdCBzYWZlX3BvbGwhIHdlIHdhbnQgU0lHQ0hMRCB0byBFSU5UUiBwb2xsICovCisJCQlpZiAocG9sbChwZmQsIGZkX2NvdW50LCAtMSkgPCAwICYmIGVycm5vICE9IEVJTlRSKSB7CisJCQkJLyogSWYgY2hpbGQgZXhpdHMgdG9vIHF1aWNrbHksIHdlIG1heSBnZXQgRUlPOgorCQkJCSAqIGZvciBleGFtcGxlLCB0cnkgInNjcmlwdCAtYyB0cnVlIiAqLworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHBmZFswXS5yZXZlbnRzKSB7CisJCQkJZXJybm8gPSAwOworCQkJCWNvdW50ID0gc2FmZV9yZWFkKHB0eSwgYnVmLCBzaXplb2YoYnVmKSk7CisJCQkJaWYgKGNvdW50IDw9IDAgJiYgZXJybm8gIT0gRUFHQUlOKSB7CisJCQkJCS8qIGVyci9lb2YgZnJvbSBwdHk6IGV4aXQgKi8KKwkJCQkJZ290byByZXN0b3JlOworCQkJCX0KKwkJCQlpZiAoY291bnQgPiAwKSB7CisJCQkJCWlmIChFTkFCTEVfU0NSSVBUUkVQTEFZICYmIChvcHQgJiBPUFRfdCkpIHsKKwkJCQkJCXN0cnVjdCB0aW1ldmFsIHR2OworCQkJCQkJZG91YmxlIG5ld3RpbWU7CisKKwkJCQkJCWdldHRpbWVvZmRheSgmdHYsIE5VTEwpOworCQkJCQkJbmV3dGltZSA9IHR2LnR2X3NlYyArIChkb3VibGUpIHR2LnR2X3VzZWMgLyAxMDAwMDAwOworCQkJCQkJZnByaW50ZihzdGRlcnIsICIlZiAldVxuIiwgbmV3dGltZSAtIG9sZHRpbWUsIGNvdW50KTsKKwkJCQkJCW9sZHRpbWUgPSBuZXd0aW1lOworCQkJCQl9CisJCQkJCWZ1bGxfd3JpdGUoU1RET1VUX0ZJTEVOTywgYnVmLCBjb3VudCk7CisJCQkJCWZ1bGxfd3JpdGUob3V0ZmQsIGJ1ZiwgY291bnQpOworCQkJCQlpZiAob3B0ICYgT1BUX2YpIHsKKwkJCQkJCWZzeW5jKG91dGZkKTsKKwkJCQkJfQorCQkJCX0KKwkJCX0KKwkJCWlmIChwZmRbMV0ucmV2ZW50cykgeworCQkJCWNvdW50ID0gc2FmZV9yZWFkKFNURElOX0ZJTEVOTywgYnVmLCBzaXplb2YoYnVmKSk7CisJCQkJaWYgKGNvdW50IDw9IDApIHsKKwkJCQkJLyogZXJyL2VvZiBmcm9tIHN0ZGluOiBkb24ndCByZWFkIHN0ZGluIGFueW1vcmUgKi8KKwkJCQkJcGZkWzFdLnJldmVudHMgPSAwOworCQkJCQlmZF9jb3VudC0tOworCQkJCX0gZWxzZSB7CisJCQkJCWZ1bGxfd3JpdGUocHR5LCBidWYsIGNvdW50KTsKKwkJCQl9CisJCQl9CisJCX0KKwkJLyogSWYgbG9vcCB3YXMgZXhpdGVkIGJlY2F1c2UgU0lHQ0hMRCBoYW5kbGVyIHNldCBiYl9nb3Rfc2lnbmFsLAorCQkgKiB0aGVyZSBzdGlsbCBjYW4gYmUgc29tZSBidWZmZXJlZCBvdXRwdXQuIEJ1dCBkb250IGxvb3AgZm9yZXZlcjoKKwkJICogd2Ugd29uJ3QgcHVtcCBvcnBoYW5lZCBncmFuZGNoaWxkcmVuJ3Mgb3V0cHV0IGluZGVmaW5pdGVseS4KKwkJICogVGVzdGNhc2U6IHJ1bm5pbmcgdGhpcyBpbiBzY3JpcHQ6CisJCSAqICAgICAgZXhlYyBkZCBpZj0vZGV2L3plcm8gYnM9MU0gY291bnQ9MQorCQkgKiBtdXN0IGhhdmUgIjErMCByZWNvcmRzIGluLCAxKzAgcmVjb3JkcyBvdXQiIGNhcHR1cmVkIHRvby4KKwkJICogKHV0aWwtbGludXgncyBzY3JpcHQgZG9lc24ndCBkbyB0aGlzLiBidWdneSA6KSAqLworCQlsb29wID0gOTk5OworCQkvKiBwdHkgaXMgaW4gT19OT05CTE9DSyBtb2RlLCB3ZSBleGl0IGFzIHNvb24gYXMgYnVmZmVyIGlzIGVtcHR5ICovCisJCXdoaWxlICgtLWxvb3AgJiYgKGNvdW50ID0gc2FmZV9yZWFkKHB0eSwgYnVmLCBzaXplb2YoYnVmKSkpID4gMCkgeworCQkJZnVsbF93cml0ZShTVERPVVRfRklMRU5PLCBidWYsIGNvdW50KTsKKwkJCWZ1bGxfd3JpdGUob3V0ZmQsIGJ1ZiwgY291bnQpOworCQl9CisgcmVzdG9yZToKKwkJaWYgKGF0dHJfb2sgPT0gMCkKKwkJCXRjc2V0YXR0cigwLCBUQ1NBRkxVU0gsICZ0dCk7CisJCWlmICghKG9wdCAmIE9QVF9xKSkKKwkJCXByaW50ZigiU2NyaXB0IGRvbmUsIGZpbGUgaXMgJXNcbiIsIGZuYW1lKTsKKwkJcmV0dXJuIEVYSVRfU1VDQ0VTUzsKKwl9CisKKwkvKiBjaGlsZDogbWFrZSBwdHkgc2xhdmUgdG8gYmUgaW5wdXQsIG91dHB1dCwgZXJyb3I7IHJ1biBzaGVsbCAqLworCWNsb3NlKHB0eSk7IC8qIGNsb3NlIHB0eSBtYXN0ZXIgKi8KKwkvKiBvcGVuIHB0eSBzbGF2ZSB0byBmZCAwLDEsMiAqLworCWNsb3NlKDApOworCXhvcGVuKHB0eV9saW5lLCBPX1JEV1IpOyAvKiB1c2VzIGZkIDAgKi8KKwl4ZHVwMigwLCAxKTsKKwl4ZHVwMigwLCAyKTsKKwkvKiBjb3B5IG91ciBvcmlnaW5hbCBzdGRpbiB0dHkncyBwYXJhbWV0ZXJzIHRvIHB0eSAqLworCWlmIChhdHRyX29rID09IDApCisJCXRjc2V0YXR0cigwLCBUQ1NBRkxVU0gsICZ0dCk7CisJaWYgKHdpbnN6X29rID09IDApCisJCWlvY3RsKDAsIFRJT0NTV0lOU1osIChjaGFyICopJndpbik7CisJLyogc2V0IHB0eSBhcyBhIGNvbnRyb2xsaW5nIHR0eSAqLworCXNldHNpZCgpOworCWlvY3RsKDAsIFRJT0NTQ1RUWSwgMCAvKiAwOiBkb24ndCBmb3JjaWJseSBzdGVhbCAqLyk7CisKKwkvKiBOb24taWdub3JlZCBzaWduYWxzIHJldmVydCB0byBTSUdfREZMIG9uIGV4ZWMgYW55d2F5ICovCisJLypzaWduYWwoU0lHQ0hMRCwgU0lHX0RGTCk7Ki8KKwlleGVjbChzaGVsbCwgc2hlbGwsIHNoZWxsX29wdCwgc2hlbGxfYXJnLCAoY2hhciAqKSBOVUxMKTsKKwliYl9zaW1wbGVfcGVycm9yX21zZ19hbmRfZGllKHNoZWxsKTsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvc2NyaXB0cmVwbGF5LmMgYi91dGlsLWxpbnV4L3NjcmlwdHJlcGxheS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MmY1NmQKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3NjcmlwdHJlcGxheS5jCkBAIC0wLDAgKzEsNDcgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIHNjcmlwdHJlcGxheSAtIHBsYXkgYmFjayB0eXBlc2NyaXB0cywgdXNpbmcgdGltaW5nIGluZm9ybWF0aW9uCisgKgorICogcGFzY2FsLmJlbGxhcmRAYWRzLWx1LmNvbQorICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyIG9yIGxhdGVyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzY3JpcHRyZXBsYXlfdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgInRpbWluZ2ZpbGUgW3R5cGVzY3JpcHQgW2Rpdmlzb3JdXSIKKy8vdXNhZ2U6I2RlZmluZSBzY3JpcHRyZXBsYXlfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJQbGF5IGJhY2sgdHlwZXNjcmlwdHMsIHVzaW5nIHRpbWluZyBpbmZvcm1hdGlvbiIKKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBzY3JpcHRyZXBsYXlfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHNjcmlwdHJlcGxheV9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY29uc3QgY2hhciAqc2NyaXB0ID0gInR5cGVzY3JpcHQiOworCWRvdWJsZSBkZWxheSwgZmFjdG9yID0gMTAwMDAwMC4wOworCWludCBmZDsKKwl1bnNpZ25lZCBsb25nIGNvdW50OworCUZJTEUgKnRmcDsKKworCWlmICghYXJndlsxXSkKKwkJYmJfc2hvd191c2FnZSgpOworCisJaWYgKGFyZ3ZbMl0pIHsKKwkJc2NyaXB0ID0gYXJndlsyXTsKKwkJaWYgKGFyZ3ZbM10pCisJCQlmYWN0b3IgLz0gYXRvZihhcmd2WzNdKTsKKwl9CisKKwl0ZnAgPSB4Zm9wZW5fZm9yX3JlYWQoYXJndlsxXSk7CisJZmQgPSB4b3BlbihzY3JpcHQsIE9fUkRPTkxZKTsKKwl3aGlsZSAoZnNjYW5mKHRmcCwgIiVsZiAlbHVcbiIsICZkZWxheSwgJmNvdW50KSA9PSAyKSB7CisJCXVzbGVlcChkZWxheSAqIGZhY3Rvcik7CisJCWJiX2NvcHlmZF9leGFjdF9zaXplKGZkLCBTVERPVVRfRklMRU5PLCBjb3VudCk7CisJfQorCWlmIChFTkFCTEVfRkVBVFVSRV9DTEVBTl9VUCkgeworCQljbG9zZShmZCk7CisJCWZjbG9zZSh0ZnApOworCX0KKwlyZXR1cm4gRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC9zZXRhcmNoLmMgYi91dGlsLWxpbnV4L3NldGFyY2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjk0MjFhCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9zZXRhcmNoLmMKQEAgLTAsMCArMSw2MSBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogbGludXgzMi9saW51eDY0IGFsbG93cyBmb3IgY2hhbmdpbmcgdW5hbWUgZW11bGF0aW9uLgorICoKKyAqIENvcHlyaWdodCAyMDAyIEFuZGkgS2xlZW4sIFN1U0UgTGFicy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2MiBvciBsYXRlciwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzZXRhcmNoX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJwZXJzb25hbGl0eSBQUk9HIEFSR1MiCisvL3VzYWdlOiNkZWZpbmUgc2V0YXJjaF9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlBlcnNvbmFsaXR5IG1heSBiZTpcbiIKKy8vdXNhZ2U6ICAgICAgICIJbGludXgzMgkJU2V0IDMyYml0IHVuYW1lIGVtdWxhdGlvblxuIgorLy91c2FnZTogICAgICAgIglsaW51eDY0CQlTZXQgNjRiaXQgdW5hbWUgZW11bGF0aW9uIgorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBsaW51eDMyX3RyaXZpYWxfdXNhZ2UgTk9VU0FHRV9TVFIKKy8vdXNhZ2U6I2RlZmluZSBsaW51eDMyX2Z1bGxfdXNhZ2UgIiIKKy8vdXNhZ2U6CisvL3VzYWdlOiNkZWZpbmUgbGludXg2NF90cml2aWFsX3VzYWdlIE5PVVNBR0VfU1RSCisvL3VzYWdlOiNkZWZpbmUgbGludXg2NF9mdWxsX3VzYWdlICIiCisKKyNpbmNsdWRlIDxzeXMvcGVyc29uYWxpdHkuaD4KKworI2luY2x1ZGUgImxpYmJiLmgiCisKK2ludCBzZXRhcmNoX21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzZXRhcmNoX21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgcGVyczsKKworCS8qIEZpZ3VyZSBvdXQgd2hhdCBwZXJzb25hbGl0eSB3ZSBhcmUgc3VwcG9zZWQgdG8gc3dpdGNoIHRvIC4uLgorCSAqIHdlIGNhbiBiZSBpbnZva2VkIGFzIGVpdGhlcjoKKwkgKiBhcmd2WzBdLGFyZ3ZbMV0gPT0gInNldGFyY2giLCJwZXJzb25hbGl0eSIKKwkgKiBhcmd2WzBdICAgICAgICAgPT0gInBlcnNvbmFsaXR5IgorCSAqLworCWlmIChFTkFCTEVfU0VUQVJDSCAmJiBhcHBsZXRfbmFtZVswXSA9PSAncycKKwkgJiYgYXJndlsxXSAmJiBzdHJuY3B5KGFyZ3ZbMV0sICJsaW51eCIsIDUpCisJKSB7CisJCWFwcGxldF9uYW1lID0gYXJndlsxXTsKKwkJYXJndisrOworCX0KKwlpZiAoYXBwbGV0X25hbWVbNV0gPT0gJzYnKSAvKiBsaW51eDY0ICovCisJCXBlcnMgPSBQRVJfTElOVVg7CisJZWxzZSBpZiAoYXBwbGV0X25hbWVbNV0gPT0gJzMnKSAvKiBsaW51eDMyICovCisJCXBlcnMgPSBQRVJfTElOVVgzMjsKKwllbHNlCisJCWJiX3Nob3dfdXNhZ2UoKTsKKworCWFyZ3YrKzsKKwlpZiAoYXJndlswXSA9PSBOVUxMKQorCQliYl9zaG93X3VzYWdlKCk7CisKKwkvKiBUcnkgdG8gc2V0IHBlcnNvbmFsaXR5ICovCisJaWYgKHBlcnNvbmFsaXR5KHBlcnMpID49IDApIHsKKwkJLyogVHJ5IHRvIGV4ZWN1dGUgdGhlIHByb2dyYW0gKi8KKwkJQkJfRVhFQ1ZQKGFyZ3ZbMF0sIGFyZ3YpOworCX0KKworCWJiX3NpbXBsZV9wZXJyb3JfbXNnX2FuZF9kaWUoYXJndlswXSk7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3N3YXBvbm9mZi5jIGIvdXRpbC1saW51eC9zd2Fwb25vZmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2QxZmJlCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9zd2Fwb25vZmYuYwpAQCAtMCwwICsxLDI4MyBAQAorLyogdmk6IHNldCBzdz00IHRzPTQ6ICovCisvKgorICogTWluaSBzd2Fwb24vc3dhcG9mZiBpbXBsZW1lbnRhdGlvbiBmb3IgYnVzeWJveAorICoKKyAqIENvcHlyaWdodCAoQykgMTk5OS0yMDA0IGJ5IEVyaWsgQW5kZXJzZW4gPGFuZGVyc2VuQGNvZGVwb2V0Lm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzd2Fwb25fdHJpdmlhbF91c2FnZQorLy91c2FnZTogICAgICAgIlstYV0gWy1lXSIgSUZfRkVBVFVSRV9TV0FQT05fRElTQ0FSRCgiIFstZFtQT0xdXSIpIElGX0ZFQVRVUkVfU1dBUE9OX1BSSSgiIFstcCBQUkldIikgIiBbREVWSUNFXSIKKy8vdXNhZ2U6I2RlZmluZSBzd2Fwb25fZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJTdGFydCBzd2FwcGluZyBvbiBERVZJQ0VcbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWEJU3RhcnQgc3dhcHBpbmcgb24gYWxsIHN3YXAgZGV2aWNlcyIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfU1dBUE9OX0RJU0NBUkQoCisvL3VzYWdlOiAgICAgIlxuCS1kW1BPTF0JRGlzY2FyZCBibG9ja3MgYXQgc3dhcG9uIChQT0w9b25jZSksIgorLy91c2FnZTogICAgICJcbgkJYXMgZnJlZWQgKFBPTD1wYWdlcyksIG9yIGJvdGggKFBPTCBvbWl0dGVkKSIKKy8vdXNhZ2U6CSkKKy8vdXNhZ2U6ICAgICAiXG4JLWUJU2lsZW50bHkgc2tpcCBkZXZpY2VzIHRoYXQgZG8gbm90IGV4aXN0IgorLy91c2FnZToJSUZfRkVBVFVSRV9TV0FQT05fUFJJKAorLy91c2FnZTogICAgICJcbgktcCBQUkkJU2V0IHN3YXAgZGV2aWNlIHByaW9yaXR5IgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSBzd2Fwb2ZmX3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbLWFdIFstZV0gW0RFVklDRV0iCisvL3VzYWdlOiNkZWZpbmUgc3dhcG9mZl9mdWxsX3VzYWdlICJcblxuIgorLy91c2FnZTogICAgICAgIlN0b3Agc3dhcHBpbmcgb24gREVWSUNFXG4iCisvL3VzYWdlOiAgICAgIlxuCS1hCVN0b3Agc3dhcHBpbmcgb24gYWxsIHN3YXAgZGV2aWNlcyIKKy8vdXNhZ2U6ICAgICAiXG4JLWUJU2lsZW50bHkgc2tpcCBkZXZpY2VzIHRoYXQgZG8gbm90IGV4aXN0IgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxtbnRlbnQuaD4KKyNpZm5kZWYgX19CSU9OSUNfXworIyBpbmNsdWRlIDxzeXMvc3dhcC5oPgorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9NT1VOVF9MQUJFTAorIyBpbmNsdWRlICJ2b2x1bWVfaWQuaCIKKyNlbHNlCisjIGRlZmluZSByZXNvbHZlX21vdW50X3NwZWMoZnNuYW1lKSAoKHZvaWQpMCkKKyNlbmRpZgorCisjaWZuZGVmIE1OVFRZUEVfU1dBUAorIyBkZWZpbmUgTU5UVFlQRV9TV0FQICJzd2FwIgorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TV0FQT05fRElTQ0FSRAorI2lmbmRlZiBTV0FQX0ZMQUdfRElTQ0FSRAorI2RlZmluZSBTV0FQX0ZMQUdfRElTQ0FSRCAweDEwMDAwCisjZW5kaWYKKyNpZm5kZWYgU1dBUF9GTEFHX0RJU0NBUkRfT05DRQorI2RlZmluZSBTV0FQX0ZMQUdfRElTQ0FSRF9PTkNFIDB4MjAwMDAKKyNlbmRpZgorI2lmbmRlZiBTV0FQX0ZMQUdfRElTQ0FSRF9QQUdFUworI2RlZmluZSBTV0FQX0ZMQUdfRElTQ0FSRF9QQUdFUyAweDQwMDAwCisjZW5kaWYKKyNkZWZpbmUgU1dBUF9GTEFHX0RJU0NBUkRfTUFTSyBcCisJKFNXQVBfRkxBR19ESVNDQVJEIHwgU1dBUF9GTEFHX0RJU0NBUkRfT05DRSB8IFNXQVBfRkxBR19ESVNDQVJEX1BBR0VTKQorI2VuZGlmCisKKworI2lmIEVOQUJMRV9GRUFUVVJFX1NXQVBPTl9ESVNDQVJEIHx8IEVOQUJMRV9GRUFUVVJFX1NXQVBPTl9QUkkKK3N0cnVjdCBnbG9iYWxzIHsKKwlpbnQgZmxhZ3M7Cit9IEZJWF9BTElBU0lORzsKKyNkZWZpbmUgRyAoKihzdHJ1Y3QgZ2xvYmFscyopJmJiX2NvbW1vbl9idWZzaXoxKQorI2RlZmluZSBnX2ZsYWdzIChHLmZsYWdzKQorI2RlZmluZSBzYXZlX2dfZmxhZ3MoKSAgICBpbnQgc2F2ZV9nX2ZsYWdzID0gZ19mbGFncworI2RlZmluZSByZXN0b3JlX2dfZmxhZ3MoKSBnX2ZsYWdzID0gc2F2ZV9nX2ZsYWdzCisjZWxzZQorI2RlZmluZSBnX2ZsYWdzIDAKKyNkZWZpbmUgc2F2ZV9nX2ZsYWdzKCkgICAgKCh2b2lkKTApCisjZGVmaW5lIHJlc3RvcmVfZ19mbGFncygpICgodm9pZCkwKQorI2VuZGlmCisjZGVmaW5lIElOSVRfRygpIGRvIHsgfSB3aGlsZSAoMCkKKworI2RlZmluZSBkb19zd2Fwb2ZmICAgKGFwcGxldF9uYW1lWzVdID09ICdmJykKKworLyogQ29tbWFuZCBsaW5lIG9wdGlvbnMgKi8KK2VudW0geworCU9QVEJJVF9hLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC1hIGFsbCAgICAgICovCisJT1BUQklUX2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogLWUgaWZleGlzdHMgKi8KKwlJRl9GRUFUVVJFX1NXQVBPTl9ESVNDQVJEKCBPUFRCSVRfZCAsKSAvKiAtZCBkaXNjYXJkICAqLworCUlGX0ZFQVRVUkVfU1dBUE9OX1BSSSAgICAoIE9QVEJJVF9wICwpIC8qIC1wIHByaW9yaXR5ICovCisJT1BUX2EgPSAxIDw8IE9QVEJJVF9hLAorCU9QVF9lID0gMSA8PCBPUFRCSVRfZSwKKwlPUFRfZCA9IElGX0ZFQVRVUkVfU1dBUE9OX0RJU0NBUkQoKDEgPDwgT1BUQklUX2QpKSArIDAsCisJT1BUX3AgPSBJRl9GRUFUVVJFX1NXQVBPTl9QUkkgICAgKCgxIDw8IE9QVEJJVF9wKSkgKyAwLAorfTsKKworI2RlZmluZSBPUFRfQUxMICAgICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfYSkKKyNkZWZpbmUgT1BUX0RJU0NBUkQgIChvcHRpb25fbWFzazMyICYgT1BUX2QpCisjZGVmaW5lIE9QVF9JRkVYSVNUUyAob3B0aW9uX21hc2szMiAmIE9QVF9lKQorI2RlZmluZSBPUFRfUFJJTyAgICAgKG9wdGlvbl9tYXNrMzIgJiBPUFRfcCkKKworc3RhdGljIGludCBzd2FwX2VuYWJsZV9kaXNhYmxlKGNoYXIgKmRldmljZSkKK3sKKwlpbnQgZXJyID0gMDsKKwlpbnQgcXVpZXQgPSAwOworCXN0cnVjdCBzdGF0IHN0OworCisJcmVzb2x2ZV9tb3VudF9zcGVjKCZkZXZpY2UpOworCWlmICghT1BUX0lGRVhJU1RTKQorCQl4c3RhdChkZXZpY2UsICZzdCk7CisKKwlpZiAoZG9fc3dhcG9mZikgeworCQllcnIgPSBzd2Fwb2ZmKGRldmljZSk7CisJCS8qIERvbid0IGNvbXBsYWluIG9uIE9QVF9BTEwgaWYgbm90IGEgc3dhcCBkZXZpY2Ugb3IgaWYgaXQgZG9lc24ndCBleGlzdCAqLworCQlxdWlldCA9IChPUFRfQUxMICYmIChlcnJubyA9PSBFSU5WQUwgfHwgZXJybm8gPT0gRU5PRU5UKSk7CisJfSBlbHNlIHsKKwkJLyogc3dhcG9uICovCisJCWVyciA9IHN0YXQoZGV2aWNlLCAmc3QpOworCQlpZiAoIWVycikgeworCQkJaWYgKEVOQUJMRV9ERVNLVE9QICYmIFNfSVNSRUcoc3Quc3RfbW9kZSkpIHsKKwkJCQlpZiAoc3Quc3RfYmxvY2tzICogKG9mZl90KTUxMiA8IHN0LnN0X3NpemUpIHsKKwkJCQkJYmJfZXJyb3JfbXNnKCIlczogZmlsZSBoYXMgaG9sZXMiLCBkZXZpY2UpOworCQkJCQlyZXR1cm4gMTsKKwkJCQl9CisJCQl9CisJCQllcnIgPSBzd2Fwb24oZGV2aWNlLCBnX2ZsYWdzKTsKKwkJCS8qIERvbid0IGNvbXBsYWluIG9uIHN3YXBvbiAtYSBpZiBkZXZpY2UgaXMgYWxyZWFkeSBpbiB1c2UgKi8KKwkJCS8qIERvbid0IGNvbXBsYWluIGlmIGZpbGUgZG9lcyBub3QgZXhpc3Qgd2l0aCAtZSBvcHRpb24gKi8KKwkJCXF1aWV0ID0gKE9QVF9BTEwgJiYgZXJybm8gPT0gRUJVU1kpIHx8IChPUFRfSUZFWElTVFMgJiYgZXJybm8gPT0gRU5PRU5UKTsKKwkJfQorCX0KKworCWlmIChlcnIgJiYgIXF1aWV0KSB7CisJCWJiX3NpbXBsZV9wZXJyb3JfbXNnKGRldmljZSk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworI2lmIEVOQUJMRV9GRUFUVVJFX1NXQVBPTl9ESVNDQVJECitzdGF0aWMgdm9pZCBzZXRfZGlzY2FyZF9mbGFnKGNoYXIgKnMpCit7CisJLyogVW5zZXQgdGhlIGZsYWcgZmlyc3QgdG8gYWxsb3cgZnN0YWIgb3B0aW9ucyB0byBvdmVycmlkZSAqLworCS8qIG9wdGlvbnMgc2V0IG9uIHRoZSBjb21tYW5kIGxpbmUgKi8KKwlnX2ZsYWdzID0gKGdfZmxhZ3MgJiB+U1dBUF9GTEFHX0RJU0NBUkRfTUFTSykgfCBTV0FQX0ZMQUdfRElTQ0FSRDsKKworCWlmICghcykgLyogTm8gb3B0aW9uYWwgcG9saWN5IHZhbHVlIG9uIHRoZSBjb21tYW5kbGluZSAqLworCQlyZXR1cm47CisJLyogU2tpcCBwcmVwZW5kZWQgJz0nICovCisJaWYgKCpzID09ICc9JykKKwkJcysrOworCS8qIEZvciBmc3RhYiBwYXJzaW5nOiByZW1vdmUgb3RoZXIgYXBwZW5kZWQgb3B0aW9ucyAqLworCSpzdHJjaHJudWwocywgJywnKSA9ICdcMCc7CisKKwlpZiAoc3RyY21wKHMsICJvbmNlIikgPT0gMCkKKwkJZ19mbGFncyB8PSBTV0FQX0ZMQUdfRElTQ0FSRF9PTkNFOworCWlmICAoc3RyY21wKHMsICJwYWdlcyIpID09IDApCisJCWdfZmxhZ3MgfD0gU1dBUF9GTEFHX0RJU0NBUkRfUEFHRVM7Cit9CisjZWxzZQorI2RlZmluZSBzZXRfZGlzY2FyZF9mbGFnKHMpICgodm9pZCkwKQorI2VuZGlmCisKKyNpZiBFTkFCTEVfRkVBVFVSRV9TV0FQT05fUFJJCitzdGF0aWMgdm9pZCBzZXRfcHJpb3JpdHlfZmxhZyhjaGFyICpzKQoreworCXVuc2lnbmVkIHByaW87CisKKwkvKiBGb3IgZnN0YWIgcGFyc2luZzogcmVtb3ZlIG90aGVyIGFwcGVuZGVkIG9wdGlvbnMgKi8KKwkqc3RyY2hybnVsKHMsICcsJykgPSAnXDAnOworCS8qIE1heCBhbGxvd2VkIDMyNzY3ICg9PSBTV0FQX0ZMQUdfUFJJT19NQVNLKSAqLworCXByaW8gPSBiYl9zdHJ0b3UocywgTlVMTCwgMTApOworCWlmICghZXJybm8pIHsKKwkJLyogVW5zZXQgdGhlIGZsYWcgZmlyc3QgdG8gYWxsb3cgZnN0YWIgb3B0aW9ucyB0byBvdmVycmlkZSAqLworCQkvKiBvcHRpb25zIHNldCBvbiB0aGUgY29tbWFuZCBsaW5lICovCisJCWdfZmxhZ3MgPSAoZ19mbGFncyAmIH5TV0FQX0ZMQUdfUFJJT19NQVNLKSB8IFNXQVBfRkxBR19QUkVGRVIgfAorCQkJCQlNSU4ocHJpbywgU1dBUF9GTEFHX1BSSU9fTUFTSyk7CisJfQorfQorI2Vsc2UKKyNkZWZpbmUgc2V0X3ByaW9yaXR5X2ZsYWcocykgKCh2b2lkKTApCisjZW5kaWYKKworc3RhdGljIGludCBkb19lbV9hbGxfaW5fZnN0YWIodm9pZCkKK3sKKwlzdHJ1Y3QgbW50ZW50ICptOworCWludCBlcnIgPSAwOworCUZJTEUgKmYgPSB4Zm9wZW5fZm9yX3JlYWQoIi9ldGMvZnN0YWIiKTsKKworCXdoaWxlICgobSA9IGdldG1udGVudChmKSkgIT0gTlVMTCkgeworCQlpZiAoc3RyY21wKG0tPm1udF90eXBlLCBNTlRUWVBFX1NXQVApID09IDApIHsKKwkJCS8qIHN3YXBvbiAtYSBzaG91bGQgaWdub3JlIGVudHJpZXMgd2l0aCBub2F1dG8sCisJCQkgKiBidXQgc3dhcG9mZiAtYSBzaG91bGQgcHJvY2VzcyB0aGVtCisJCQkgKi8KKwkJCWlmIChkb19zd2Fwb2ZmIHx8IGhhc21udG9wdChtLCBNTlRPUFRfTk9BVVRPKSA9PSBOVUxMKSB7CisJCQkJLyogZWFjaCBzd2FwIHNwYWNlIG1pZ2h0IGhhdmUgZGlmZmVyZW50IGZsYWdzICovCisJCQkJLyogc2F2ZSBnbG9iYWwgZmxhZ3MgZm9yIHRoZSBuZXh0IHJvdW5kICovCisJCQkJc2F2ZV9nX2ZsYWdzKCk7CisJCQkJaWYgKEVOQUJMRV9GRUFUVVJFX1NXQVBPTl9ESVNDQVJEKSB7CisJCQkJCWNoYXIgKnAgPSBoYXNtbnRvcHQobSwgImRpc2NhcmQiKTsKKwkJCQkJaWYgKHApIHsKKwkJCQkJCS8qIG1vdmUgdG8gJz0nIG9yIHRvIGVuZCBvZiBzdHJpbmcgKi8KKwkJCQkJCXAgKz0gNzsKKwkJCQkJCXNldF9kaXNjYXJkX2ZsYWcocCk7CisJCQkJCX0KKwkJCQl9CisJCQkJaWYgKEVOQUJMRV9GRUFUVVJFX1NXQVBPTl9QUkkpIHsKKwkJCQkJY2hhciAqcCA9IGhhc21udG9wdChtLCAicHJpIik7CisJCQkJCWlmIChwKSB7CisJCQkJCQlzZXRfcHJpb3JpdHlfZmxhZyhwICsgNCk7CisJCQkJCX0KKwkJCQl9CisJCQkJZXJyIHw9IHN3YXBfZW5hYmxlX2Rpc2FibGUobS0+bW50X2ZzbmFtZSk7CisJCQkJcmVzdG9yZV9nX2ZsYWdzKCk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApCisJCWVuZG1udGVudChmKTsKKworCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyBpbnQgZG9fYWxsX2luX3Byb2Nfc3dhcHModm9pZCkKK3sKKwljaGFyICpsaW5lOworCWludCBlcnIgPSAwOworCUZJTEUgKmYgPSBmb3Blbl9mb3JfcmVhZCgiL3Byb2Mvc3dhcHMiKTsKKwkvKiBEb24ndCBjb21wbGFpbiBpZiBtaXNzaW5nICovCisJaWYgKGYpIHsKKwkJd2hpbGUgKChsaW5lID0geG1hbGxvY19mZ2V0bGluZShmKSkgIT0gTlVMTCkgeworCQkJaWYgKGxpbmVbMF0gPT0gJy8nKSB7CisJCQkJKnN0cmNocm51bChsaW5lLCAnICcpID0gJ1wwJzsKKwkJCQllcnIgfD0gc3dhcF9lbmFibGVfZGlzYWJsZShsaW5lKTsKKwkJCX0KKwkJCWZyZWUobGluZSk7CisJCX0KKwkJaWYgKEVOQUJMRV9GRUFUVVJFX0NMRUFOX1VQKQorCQkJZmNsb3NlKGYpOworCX0KKworCXJldHVybiBlcnI7Cit9CisKKyNkZWZpbmUgT1BUU1RSX1NXQVBPTiAiYWUiIFwKKwlJRl9GRUFUVVJFX1NXQVBPTl9ESVNDQVJEKCJkOjoiKSBcCisJSUZfRkVBVFVSRV9TV0FQT05fUFJJKCJwOiIpCisKK2ludCBzd2FwX29uX29mZl9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgc3dhcF9vbl9vZmZfbWFpbihpbnQgYXJnYyBVTlVTRURfUEFSQU0sIGNoYXIgKiphcmd2KQoreworCUlGX0ZFQVRVUkVfU1dBUE9OX1BSSShjaGFyICpwcmlvOykKKwlJRl9GRUFUVVJFX1NXQVBPTl9ESVNDQVJEKGNoYXIgKmRpc2NhcmQgPSBOVUxMOykKKwlpbnQgcmV0ID0gMDsKKworCUlOSVRfRygpOworCisJZ2V0b3B0MzIoYXJndiwgZG9fc3dhcG9mZiA/ICJhZSIgOiBPUFRTVFJfU1dBUE9OCisJCQlJRl9GRUFUVVJFX1NXQVBPTl9ESVNDQVJEKCwgJmRpc2NhcmQpCisJCQlJRl9GRUFUVVJFX1NXQVBPTl9QUkkoLCAmcHJpbykKKwkpOworCisJYXJndiArPSBvcHRpbmQ7CisKKwlpZiAoT1BUX0RJU0NBUkQpIHsKKwkJc2V0X2Rpc2NhcmRfZmxhZyhkaXNjYXJkKTsKKwl9CisJaWYgKE9QVF9QUklPKSB7CisJCXNldF9wcmlvcml0eV9mbGFnKHByaW8pOworCX0KKworCWlmIChPUFRfQUxMKSB7CisJCS8qIHN3YXBvZmYgLWEgZG9lcyBhbHNvIC9wcm9jL3N3YXBzICovCisJCWlmIChkb19zd2Fwb2ZmKQorCQkJcmV0ID0gZG9fYWxsX2luX3Byb2Nfc3dhcHMoKTsKKwkJcmV0IHw9IGRvX2VtX2FsbF9pbl9mc3RhYigpOworCX0gZWxzZSBpZiAoISphcmd2KSB7CisJCS8qIGlmIG5vdCAtYSB3ZSBuZWVkIGF0IGxlYXN0IG9uZSBhcmcgKi8KKwkJYmJfc2hvd191c2FnZSgpOworCX0KKwkvKiBVbnNldCAtYSBub3cgdG8gYWxsb3cgZm9yIG1vcmUgbWVzc2FnZXMgaW4gc3dhcF9lbmFibGVfZGlzYWJsZSAqLworCW9wdGlvbl9tYXNrMzIgPSBvcHRpb25fbWFzazMyICYgfk9QVF9hOworCS8qIE5vdyBwcm9jZXNzIGRldmljZXMgb24gdGhlIGNvbW1hbmRsaW5lIGlmIGFueSAqLworCXdoaWxlICgqYXJndikgeworCQlyZXQgfD0gc3dhcF9lbmFibGVfZGlzYWJsZSgqYXJndisrKTsKKwl9CisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvc3dpdGNoX3Jvb3QuYyBiL3V0aWwtbGludXgvc3dpdGNoX3Jvb3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzAxYjM2Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC9zd2l0Y2hfcm9vdC5jCkBAIC0wLDAgKzEsMjE5IEBACisvKiB2aTogc2V0IHN3PTQgdHM9NDogKi8KKy8qIENvcHlyaWdodCAyMDA1IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogU3dpdGNoIGZyb20gcm9vdGZzIHRvIGFub3RoZXIgZmlsZXN5c3RlbSBhcyB0aGUgcm9vdCBvZiB0aGUgbW91bnQgdHJlZS4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8vdXNhZ2U6I2RlZmluZSBzd2l0Y2hfcm9vdF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiWy1jIC9kZXYvY29uc29sZV0gTkVXX1JPT1QgTkVXX0lOSVQgW0FSR1NdIgorLy91c2FnZTojZGVmaW5lIHN3aXRjaF9yb290X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiRnJlZSBpbml0cmFtZnMgYW5kIHN3aXRjaCB0byBhbm90aGVyIHJvb3QgZnM6XG4iCisvL3VzYWdlOiAgICAgICAiY2hyb290IHRvIE5FV19ST09ULCBkZWxldGUgYWxsIGluIC8sIG1vdmUgTkVXX1JPT1QgdG8gLyxcbiIKKy8vdXNhZ2U6ICAgICAgICJleGVjdXRlIE5FV19JTklULiBQSUQgbXVzdCBiZSAxLiBORVdfUk9PVCBtdXN0IGJlIGEgbW91bnRwb2ludC5cbiIKKy8vdXNhZ2U6ICAgICAiXG4JLWMgREVWCVJlb3BlbiBzdGRpbyB0byBERVYgYWZ0ZXIgc3dpdGNoIgorCisjaW5jbHVkZSA8c3lzL3Zmcy5oPgorI2luY2x1ZGUgPHN5cy9tb3VudC5oPgorI2luY2x1ZGUgImxpYmJiLmgiCisvLyBNYWtlIHVwIGZvciBoZWFkZXIgZGVmaWNpZW5jaWVzCisjaWZuZGVmIFJBTUZTX01BR0lDCisjIGRlZmluZSBSQU1GU19NQUdJQyAoKHVuc2lnbmVkKTB4ODU4NDU4ZjYpCisjZW5kaWYKKyNpZm5kZWYgVE1QRlNfTUFHSUMKKyMgZGVmaW5lIFRNUEZTX01BR0lDICgodW5zaWduZWQpMHgwMTAyMTk5NCkKKyNlbmRpZgorI2lmbmRlZiBNU19NT1ZFCisjIGRlZmluZSBNU19NT1ZFICAgICA4MTkyCisjZW5kaWYKKworLy8gUmVjdXJzaXZlbHkgZGVsZXRlIGNvbnRlbnRzIG9mIHJvb3Rmcworc3RhdGljIHZvaWQgZGVsZXRlX2NvbnRlbnRzKGNvbnN0IGNoYXIgKmRpcmVjdG9yeSwgZGV2X3Qgcm9vdGRldikKK3sKKwlESVIgKmRpcjsKKwlzdHJ1Y3QgZGlyZW50ICpkOworCXN0cnVjdCBzdGF0IHN0OworCisJLy8gRG9uJ3QgZGVzY2VuZCBpbnRvIG90aGVyIGZpbGVzeXN0ZW1zCisJaWYgKGxzdGF0KGRpcmVjdG9yeSwgJnN0KSB8fCBzdC5zdF9kZXYgIT0gcm9vdGRldikKKwkJcmV0dXJuOworCisJLy8gUmVjdXJzaXZlbHkgZGVsZXRlIHRoZSBjb250ZW50cyBvZiBkaXJlY3RvcmllcworCWlmIChTX0lTRElSKHN0LnN0X21vZGUpKSB7CisJCWRpciA9IG9wZW5kaXIoZGlyZWN0b3J5KTsKKwkJaWYgKGRpcikgeworCQkJd2hpbGUgKChkID0gcmVhZGRpcihkaXIpKSkgeworCQkJCWNoYXIgKm5ld2RpciA9IGQtPmRfbmFtZTsKKworCQkJCS8vIFNraXAgLiBhbmQgLi4KKwkJCQlpZiAoRE9UX09SX0RPVERPVChuZXdkaXIpKQorCQkJCQljb250aW51ZTsKKworCQkJCS8vIFJlY3Vyc2UgdG8gZGVsZXRlIGNvbnRlbnRzCisJCQkJbmV3ZGlyID0gY29uY2F0X3BhdGhfZmlsZShkaXJlY3RvcnksIG5ld2Rpcik7CisJCQkJZGVsZXRlX2NvbnRlbnRzKG5ld2Rpciwgcm9vdGRldik7CisJCQkJZnJlZShuZXdkaXIpOworCQkJfQorCQkJY2xvc2VkaXIoZGlyKTsKKworCQkJLy8gRGlyZWN0b3J5IHNob3VsZCBub3cgYmUgZW1wdHksIHphcCBpdAorCQkJcm1kaXIoZGlyZWN0b3J5KTsKKwkJfQorCX0gZWxzZSB7CisJCS8vIEl0IHdhc24ndCBhIGRpcmVjdG9yeSwgemFwIGl0CisJCXVubGluayhkaXJlY3RvcnkpOworCX0KK30KKworaW50IHN3aXRjaF9yb290X21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSBNQUlOX0VYVEVSTkFMTFlfVklTSUJMRTsKK2ludCBzd2l0Y2hfcm9vdF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJY2hhciAqbmV3cm9vdCwgKmNvbnNvbGUgPSBOVUxMOworCXN0cnVjdCBzdGF0IHN0OworCXN0cnVjdCBzdGF0ZnMgc3RmczsKKwlkZXZfdCByb290ZGV2OworCisJLy8gUGFyc2UgYXJncyAoLWMgY29uc29sZSkKKwlvcHRfY29tcGxlbWVudGFyeSA9ICItMiI7IC8vIG1pbmltdW0gMiBwYXJhbXMKKwlnZXRvcHQzMihhcmd2LCAiK2M6IiwgJmNvbnNvbGUpOyAvLyAnKyc6IHN0b3AgYXQgZmlyc3Qgbm9uLW9wdGlvbgorCWFyZ3YgKz0gb3B0aW5kOworCW5ld3Jvb3QgPSAqYXJndisrOworCisJLy8gQ2hhbmdlIHRvIG5ldyByb290IGRpcmVjdG9yeSBhbmQgdmVyaWZ5IGl0J3MgYSBkaWZmZXJlbnQgZnMKKwl4Y2hkaXIobmV3cm9vdCk7CisJeHN0YXQoIi8iLCAmc3QpOworCXJvb3RkZXYgPSBzdC5zdF9kZXY7CisJeHN0YXQoIi4iLCAmc3QpOworCWlmIChzdC5zdF9kZXYgPT0gcm9vdGRldiB8fCBnZXRwaWQoKSAhPSAxKSB7CisJCS8vIFNob3cgdXNhZ2UsIGl0IHNheXMgbmV3IHJvb3QgbXVzdCBiZSBhIG1vdW50cG9pbnQKKwkJLy8gYW5kIHdlIG11c3QgYmUgUElEIDEKKwkJYmJfc2hvd191c2FnZSgpOworCX0KKworCS8vIEFkZGl0aW9uYWwgc2FuaXR5IGNoZWNrczogd2UncmUgYWJvdXQgdG8gcm0gLXJmIC8sIHNvIGJlIFJFQUxMWSBTVVJFCisJLy8gd2UgbWVhbiBpdC4gSSBjb3VsZCBtYWtlIHRoaXMgYSBDT05GSUcgb3B0aW9uLCBidXQgSSB3b3VsZCBnZXQgZW1haWwKKwkvLyBmcm9tIGFsbCB0aGUgcGVvcGxlIHdobyBXSUxMIGRlc3Ryb3kgdGhlaXIgZmlsZXN5c3RlbXMuCisJaWYgKHN0YXQoIi9pbml0IiwgJnN0KSAhPSAwIHx8ICFTX0lTUkVHKHN0LnN0X21vZGUpKSB7CisJCWJiX2Vycm9yX21zZ19hbmRfZGllKCIvaW5pdCBpcyBub3QgYSByZWd1bGFyIGZpbGUiKTsKKwl9CisJc3RhdGZzKCIvIiwgJnN0ZnMpOyAvLyB0aGlzIG5ldmVyIGZhaWxzCisJaWYgKCh1bnNpZ25lZClzdGZzLmZfdHlwZSAhPSBSQU1GU19NQUdJQworCSAmJiAodW5zaWduZWQpc3Rmcy5mX3R5cGUgIT0gVE1QRlNfTUFHSUMKKwkpIHsKKwkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoInJvb3QgZmlsZXN5c3RlbSBpcyBub3QgcmFtZnMvdG1wZnMiKTsKKwl9CisKKwkvLyBaYXAgZXZlcnl0aGluZyBvdXQgb2Ygcm9vdGRldgorCWRlbGV0ZV9jb250ZW50cygiLyIsIHJvb3RkZXYpOworCisJLy8gT3Zlcm1vdW50IC8gd2l0aCBuZXdkaXIgYW5kIGNocm9vdCBpbnRvIGl0CisJaWYgKG1vdW50KCIuIiwgIi8iLCBOVUxMLCBNU19NT1ZFLCBOVUxMKSkgeworCQkvLyBGb3IgZXhhbXBsZSwgZmFpbHMgd2hlbiBuZXdyb290IGlzIG5vdCBhIG1vdW50cG9pbnQKKwkJYmJfcGVycm9yX21zZ19hbmRfZGllKCJlcnJvciBtb3Zpbmcgcm9vdCIpOworCX0KKwl4Y2hyb290KCIuIik7CisJLy8gVGhlIGNoZGlyIGlzIG5lZWRlZCB0byByZWNhbGN1bGF0ZSAiLiIgYW5kICIuLiIgbGlua3MKKwkvKnhjaGRpcigiLyIpOyAtIGRvbmUgaW4geGNocm9vdCAqLworCisJLy8gSWYgYSBuZXcgY29uc29sZSBzcGVjaWZpZWQsIHJlZGlyZWN0IHN0ZGluL3N0ZG91dC9zdGRlcnIgdG8gaXQKKwlpZiAoY29uc29sZSkgeworCQljbG9zZSgwKTsKKwkJeG9wZW4oY29uc29sZSwgT19SRFdSKTsKKwkJeGR1cDIoMCwgMSk7CisJCXhkdXAyKDAsIDIpOworCX0KKworCS8vIEV4ZWMgcmVhbCBpbml0CisJZXhlY3YoYXJndlswXSwgYXJndik7CisJYmJfcGVycm9yX21zZ19hbmRfZGllKCJjYW4ndCBleGVjdXRlICclcyciLCBhcmd2WzBdKTsKK30KKworLyoKK0Zyb206IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CitEYXRlOiBUdWUsIEp1biAxNiwgMjAwOSBhdCA3OjQ3IFBNCitTdWJqZWN0OiBSZTogc3dpdGNoX3Jvb3QuLi4KKworLi4uCisuLi4KKy4uLgorCitJZiB5b3UncmUgX25vdF8gcnVubmluZyBvdXQgb2YgaW5pdF9yYW1mcyAoaWYgZm9yIGV4YW1wbGUgeW91J3JlIHVzaW5nIGluaXRyZAoraW5zdGVhZCksIHlvdSBwcm9iYWJseSBzaG91bGRuJ3QgdXNlIHN3aXRjaF9yb290IGJlY2F1c2UgaXQncyB0aGUgd3JvbmcgdG9vbC4KKworQmFzaWNhbGx5IHdoYXQgdGhlIHN1Y2tlciBkb2VzIGlzIHNvbWV0aGluZyBsaWtlIHRoZSBmb2xsb3dpbmcgc2hlbGwgc2NyaXB0OgorCisgZmluZCAvIC14ZGV2IHwgeGFyZ3Mgcm0gLXJmCisgY2QgIiQxIgorIHNoaWZ0CisgbW91bnQgLS1tb3ZlIC4gLworIGV4ZWMgY2hyb290IC4gIiRAIgorCitUaGVyZSBhcmUgYSBjb3VwbGUgcmVhc29ucyB0aGF0IHdvbid0IHdvcmsgYXMgYSBzaGVsbCBzY3JpcHQ6CisKKzEpIElmIHlvdSBkZWxldGUgdGhlIGNvbW1hbmRzIG91dCBvZiB5b3VyICRQQVRILCB5b3VyIHNoZWxsIHNjcmlwdHMgY2FuJ3QgcnVuCittb3JlIGNvbW1hbmRzLCBidXQgeW91IGNhbid0IHN0YXJ0IHVzaW5nIGR5bmFtaWNhbGx5IGxpbmtlZCBfbmV3XyBjb21tYW5kcwordW50aWwgYWZ0ZXIgeW91IGRvIHRoZSBjaHJvb3QgYmVjYXVzZSB0aGUgcGF0aCB0byB0aGUgZHluYW1pYyBsaW5rZXIgaXMgd3JvbmcuCitTbyB0aGVyZSdzIGEgc3RlcCB0aGF0IG5lZWRzIHRvIGJlIHNvcnQgb2YgYXRvbWljIGJ1dCBjYW4ndCBiZSBhcyBhIHNoZWxsCitzY3JpcHQuICAoWW91IGNhbiB3b3JrIGFyb3VuZCB0aGlzIHdpdGggc3RhdGljIGxpbmtpbmcgb3IgdmVyeSBjYXJlZnVsbHkgbGFpZAorb3V0IHBhdGhzIGFuZCBzZXF1ZW5jaW5nLCBidXQgaXQncyBicml0dGxlLCB1Z2x5LCBhbmQgbm9uLW9idmlvdXMuKQorCisyKSBUaGUgImZpbmQgfCBybSIgYml0IHdpbGwgYWN1YWxseSBkZWxldGUgZXZlcnl0aGluZyBiZWNhdXNlIHRoZSBtb3VudCBwb2ludHMKK3N0aWxsIHNob3cgdXAgKGV2ZW4gaWYgdGhlaXIgY29udGVudHMgZG9uJ3QpLCBhbmQgcm0gLXJmIHdpbGwgdGhlbiBoYXBwaWx5IHphcAordGhhdC4gIFNvIHRoZSBmaXJzdCBsaW5lIGlzIGFuIG92ZXJzaW1wbGlmaWNhdGlvbiBvZiB3aGF0IHlvdSBuZWVkIHRvIGRvIF9ub3RfCit0byBkZXNjZW5kIGludG8gb3RoZXIgZmlsZXN5c3RlbXMgYW5kIGRlbGV0ZSB0aGVpciBjb250ZW50cy4KKworVGhlIHJlYXNvbiB3ZSBkbyB0aGlzIGlzIHRvIGZyZWUgdXAgbWVtb3J5LCBieSB0aGUgd2F5LiAgU2luY2UgaW5pdHJhbWZzIGlzIGEKK3JhbWZzLCBkZWxldGluZyBpdHMgY29udGVudHMgZnJlZXMgdXAgdGhlIG1lbW9yeSBpdCB1c2VzLiAgKFdlIGxlYXZlIGl0IHdpdGgKK29uZSByZW1haW5pbmcgZGVudHJ5IGZvciB0aGUgbmV3IG1vdW50IHBvaW50LCBidXQgdGhhdCdzIG9rLikKKworTm90ZSB0aGF0IHlvdSBjYW5ub3QgZXZlciB1bW91bnQgcm9vdGZzLCBmb3IgYXBwcm94aW1hdGVseSB0aGUgc2FtZSByZWFzb24geW91CitjYW4ndCBraWxsIFBJRCAxLiAgVGhlIGtlcm5lbCB0cmFja3MgbW91bnQgcG9pbnRzIGFzIGEgZG91Ymx5IGxpbmtlZCBsaXN0LCBhbmQKK3RoZSBwb2ludGVyIHRvIHRoZSBzdGFydC9lbmQgb2YgdGhhdCBsaXN0IGFsd2F5cyBwb2ludHMgdG8gYW4gZW50cnkgdGhhdCdzCitrbm93biB0byBiZSB0aGVyZSAocm9vdGZzKSwgc28gaXQgbmV2ZXIgaGFzIHRvIHdvcnJ5IGFib3V0IG1vdmluZyB0aGF0IHBvaW50ZXIKK2FuZCBpdCBuZXZlciBoYXMgdG8gd29ycnkgYWJvdXQgdGhlIGxpc3QgYmVpbmcgZW1wdHkuICAoQmFjayBhcm91bmQgMi42LjEzCit0aGVyZSBfd2FzXyBhIGJ1ZyB0aGF0IGxldCB5b3UgdW1vdW50IHJvb3RmcywgYW5kIHRoZSBzeXN0ZW0gbG9ja2VkIGhhcmQgdGhlCitpbnN0YW50IHlvdSBkaWQgc28gZW5kbGVzc2x5IGxvb3BpbmcgdG8gZmluZCB0aGUgZW5kIG9mIHRoZSBtb3VudCBsaXN0IGFuZAorbmV2ZXIgc3RvcHBpbmcuICBUaGV5IGZpeGVkIGl0LikKKworT2gsIGFuZCB0aGUgcmVhc29uIHdlIG1vdW50IC0tbW92ZSBfYW5kXyBkbyB0aGUgY2hyb290IGlzIGR1ZSB0byB0aGUgd2F5ICIvIgord29ya3MuICBFYWNoIHByb2Nlc3MgaGFzIHR3byBzcGVjaWFsIHN5bWxpbmtzLCAiLiIsIGFuZCAiLyIuICBFYWNoIG9mIHRoZW0KK3BvaW50cyB0byB0aGUgZGVudHJ5IG9mIGEgZGlyZWN0b3J5LCBhbmQgZ2l2ZSB5b3UgYSBsb2NhdGlvbiBwYXRocyBjYW4gc3RhcnQKK2Zyb20uICAoSGlzdG9yaWNhbGx5ICIuLiIgd2FzIGFsc28gc3BlY2lhbCwgYmVjYXVzZSB5b3UgY291bGQgZW50ZXIgYQorZGlyZWN0b3J5IHZpYSBhIHN5bWxpbmsgc28gYmFja2luZyBvdXQgdG8gdGhlIGRpcmVjdG9yeSB5b3UgY2FtZSBmcm9tIGRvZXNuJ3QKK25lY2Vzc2FyaWx5IG1lYW4gdGhlIG9uZSBwaHlzaWNhbGx5IGFib3ZlIHdoZXJlICIuIiBwb2ludHMgdG8uICBUaGVzZSBkYXlzIEkKK3RoaW5rIGl0J3MganVzdCBoYW5kZWQgb2ZmIHRvIHRoZSBmaWxlc3lzdGVtLikKKworQW55d2F5LCBwYXRoIHJlc29sdXRpb24gc3RhcnRzIHdpdGggIi4iIG9yICIvIiAoYWx0aG91Z2ggdGhlICIuLyIgYXQgdGhlIHN0YXJ0CitvZiB0aGUgcGF0aCBtYXkgYmUgaW1wbGljaXQpLCBtZWFuaW5nIGl0J3MgcmVsYXRpdmUgdG8gb25lIG9mIHRob3NlIHR3bworZGlyZWN0b3JpZXMuICBZb3VyIGN1cnJlbnQgZGlyZWN0b3J5LCBhbmQgeW91ciBjdXJyZW50IHJvb3QgZGlyZWN0b3J5LiAgVGhlCitjaGRpcigpIHN5c2NhbGwgY2hhbmdlcyB3aGVyZSAiLiIgcG9pbnRzIHRvLCBhbmQgdGhlIGNocm9vdCgpIHN5c2NhbGwgY2hhbmdlcword2hlcmUgIi8iIHBvaW50cyB0by4gIChBZ2FpbiwgYm90aCBhcmUgcGVyLXByb2Nlc3Mgd2hpY2ggaXMgd2h5IGNocm9vdCBvbmx5CithZmZlY3RzIHlvdXIgY3VycmVudCBwcm9jZXNzIGFuZCBpdHMgY2hpbGQgcHJvY2Vzc2VzLikKKworTm90ZSB0aGF0IGNocm9vdCgpIGRvZXMgX25vdF8gY2hhbmdlIHdoZXJlICIuIiBwb2ludHMgdG8sIGFuZCBiYWNrIGJlZm9yZSB0aGV5CitwdXQgY3Jhenkgc2VjdXJpdHkgY2hlY2tzIGludG8gdGhlIGtlcm5lbCB5b3VyIGN1cnJlbnQgZGlyZWN0b3J5IGNvdWxkIGJlCitzb21ld2hlcmUgeW91IGNvdWxkIG5vIGxvbmdlciBhY2Nlc3MgYWZ0ZXIgdGhlIGNocm9vdC4gIChUaGUgY29tbWFuZCBsaW5lCitjaHJvb3QgZG9lcyBhIGNkIGFzIHdlbGwsIHRoZSBjaHJvb3QgX3N5c2NhbGxfIGlzIHdoYXQgSSdtIHRhbGtpbmcgYWJvdXQuKQorCitUaGUgcmVhc29uIG1vdW50aW5nIHNvbWV0aGluZyBuZXcgb3ZlciAvIGhhcyBubyBvYnZpb3VzIGVmZmVjdCBpcyB0aGUgc2FtZQorcmVhc29uIG1vdW50aW5nIHNvbWV0aGluZyBvdmVyIHlvdXIgY3VycmVudCBkaXJlY3RvcnkgaGFzIG5vIG9idmlvdXMgZWZmZWN0OgordGhlIC4gYW5kIC8gbGlua3MgYXJlbid0IHJlY2FsY3VsYXRlZCBhZnRlciBhIG1vdW50LCBzbyB0aGV5IHN0aWxsIHBvaW50IHRvCit0aGUgc2FtZSBkZW50cnkgdGhleSBkaWQgYmVmb3JlLCBldmVuIGlmIHRoYXQgZGVudHJ5IGlzIG5vIGxvbmdlciBhY2Nlc3NpYmxlCitieSBvdGhlciBtZWFucy4gIE5vdGUgdGhhdCAiY2QgLiIgaXMgYSBOT1AsIGFuZCAiY2hyb290IC8iIGlzIGEgbm9wOyBib3RoIGxvb2sKK3VwIHRoZSBjYWNoZWQgZGVudHJ5IGFuZCBzZXQgaXQgcmlnaHQgYmFjay4gIFRoZXkgZG9uJ3QgcmUtcGFyc2UgYW55IHBhdGhzLAorYmVjYXVzZSB0aGV5J3JlIHdoYXQgYWxsIHBhdGhzIHlvdXIgcHJvY2VzcyB1c2VzIHdvdWxkIGJlIHJlbGF0aXZlIHRvLgorCitUaGF0J3Mgd2h5IHRoZSBjYXJlZnVsIHNlcXVlbmNpbmcgYWJvdmU6IHdlIGNkIGludG8gdGhlIG5ldyBtb3VudCBwb2ludCBiZWZvcmUKK3dlIGRvIHRoZSBtb3VudCAtLW1vdmUuICBNb3ZpbmcgdGhlIG1vdW50IHBvaW50IHdvdWxkIG90aGVyd2lzZSBtYWtlIGl0Cit0b3RhbGx5IGluYWNjZXNzaWJsZSB0byBpcyBiZWNhdXNlIGNkLWluZyB0byB0aGUgb2xkIHBhdGggd291bGRuJ3QgZ2l2ZSBpdCB0bwordXMgYW55bW9yZSwgYW5kIGNkICIvIiBqdXN0IGdpdmVzIHVzIHRoZSBjYWNoZWQgZGVudHJ5IGZyb20gd2hlbiB0aGUgcHJvY2Vzcword2FzIGNyZWF0ZWQgKGluIHRoaXMgY2FzZSB0aGUgb2xkIGluaXRyYW1mcyBvbmUpLiAgQnV0IHRoZSAiLiIgc3ltbGluayBnaXZlcwordXMgdGhlIGRlbnRyeSBvZiB0aGUgZmlsZXN5c3RlbSB3ZSBqdXN0IG1vdmVkLCBzbyB3ZSBjYW4gdGhlbiAiY2hyb290IC4iIHRvCitjb3B5IHRoYXQgZGVudHJ5IHRvICIvIiBhbmQgZ2V0IHRoZSBuZXcgZmlsZXN5c3RlbS4gIElmIHdlIF9kaWRuJ3RfIHNhdmUgdGhhdAorZGVudHJ5IGluICIuIiB3ZSBjb3VsZG4ndCBnZXQgaXQgYmFjayBhZnRlciB0aGUgbW91bnQgLS1tb3ZlLgorCisoWWVzLCB0aGlzIGlzIGFsbCBzY3Jld3kgYW5kIEkgaGFkIHRvIGVtYWlsIHF1ZXN0aW9ucyB0byBMaW51cyBUb3J2YWxkcyB0byBnZXQKK2l0IHN0cmFpZ2h0IG15c2VsZi4gIEkga2VlcCBtZWFuaW5nIHRvIHdyaXRlIHVwIGEgImhvdyBtb3VudCBhY3R1YWxseSB3b3JrcyIKK2RvY3VtZW50IHNvbWVkYXkuLi4pCisqLwpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC91ZXZlbnQuYyBiL3V0aWwtbGludXgvdWV2ZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0YTllOQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdWV2ZW50LmMKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBEZW55cyBWbGFzZW5rbworICoKKyAqIExpY2Vuc2VkIHVuZGVyIEdQTHYyLCBzZWUgZmlsZSBMSUNFTlNFIGluIHRoaXMgc291cmNlIHRyZWUuCisgKi8KKworLy9jb25maWc6Y29uZmlnIFVFVkVOVAorLy9jb25maWc6CWJvb2wgInVldmVudCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglzZWxlY3QgUExBVEZPUk1fTElOVVgKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICB1ZXZlbnQgaXMgYSBuZXRsaW5rIGxpc3RlbmVyIGZvciBrZXJuZWwgdWV2ZW50IG5vdGlmaWNhdGlvbnMKKy8vY29uZmlnOgkgIHNlbnQgdmlhIG5ldGxpbmsuIEl0IGlzIHVzdWFsbHkgdXNlZCBmb3IgZHluYW1pYyBkZXZpY2UgY3JlYXRpb24uCisKKy8vYXBwbGV0OklGX1VFVkVOVChBUFBMRVQodWV2ZW50LCBCQl9ESVJfU0JJTiwgQkJfU1VJRF9EUk9QKSkKKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX1VFVkVOVCkgKz0gdWV2ZW50Lm8KKworLy91c2FnZTojZGVmaW5lIHVldmVudF90cml2aWFsX3VzYWdlCisvL3VzYWdlOiAgICAgICAiW1BST0cgW0FSR1NdXSIKKy8vdXNhZ2U6I2RlZmluZSB1ZXZlbnRfZnVsbF91c2FnZSAiXG5cbiIKKy8vdXNhZ2U6ICAgICAgICJ1ZXZlbnQgcnVucyBQUk9HIGZvciBldmVyeSBuZXRsaW5rIG5vdGlmaWNhdGlvbi4iCisvL3VzYWdlOiAgICJcbiIiUFJPRydzIGVudmlyb25tZW50IGNvbnRhaW5zIGRhdGEgcGFzc2VkIGZyb20gdGhlIGtlcm5lbC4iCisvL3VzYWdlOiAgICJcbiIiVHlwaWNhbCB1c2FnZSAoZGFlbW9uIGZvciBkeW5hbWljIGRldmljZSBub2RlIGNyZWF0aW9uKToiCisvL3VzYWdlOiAgICJcbiIiCSMgdWV2ZW50IG1kZXYgJiBtZGV2IC1zIgorCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CisKKyNkZWZpbmUgQlVGRkVSX1NJWkUgMTYqMTAyNAorCisjZGVmaW5lIGVudiAoKGNoYXIgKiopJmJiX2NvbW1vbl9idWZzaXoxKQorZW51bSB7CisJTUFYX0VOViA9IENPTU1PTl9CVUZTSVpFIC8gc2l6ZW9mKGVudlswXSkgLSAxLAorfTsKKworI2lmbmRlZiBTT19SQ1ZCVUZGT1JDRQorI2RlZmluZSBTT19SQ1ZCVUZGT1JDRSAzMworI2VuZGlmCitlbnVtIHsgUkNWQlVGID0gMiAqIDEwMjQgKiAxMDI0IH07CisKK2ludCB1ZXZlbnRfbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIE1BSU5fRVhURVJOQUxMWV9WSVNJQkxFOworaW50IHVldmVudF9tYWluKGludCBhcmdjIFVOVVNFRF9QQVJBTSwgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IHNvY2thZGRyX25sIHNhOworCWludCBmZDsKKworCWFyZ3YrKzsKKworCS8vIFN1YnNjcmliZSBmb3IgVUVWRU5UIGtlcm5lbCBtZXNzYWdlcworCXNhLm5sX2ZhbWlseSA9IEFGX05FVExJTks7CisJc2EubmxfcGFkID0gMDsKKwlzYS5ubF9waWQgPSBnZXRwaWQoKTsKKwlzYS5ubF9ncm91cHMgPSAxIDw8IDA7CisJZmQgPSB4c29ja2V0KEFGX05FVExJTkssIFNPQ0tfREdSQU0sIE5FVExJTktfS09CSkVDVF9VRVZFTlQpOworCXhiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopICZzYSwgc2l6ZW9mKHNhKSk7CisJY2xvc2Vfb25fZXhlY19vbihmZCk7CisKKwkvLyBXaXRob3V0IGEgc3VmZmljaWVudGx5IGJpZyBSQ1ZCVUYsIGEgdG9uIG9mIHNpbXVsdGFuZW91cyBldmVudHMKKwkvLyBjYW4gdHJpZ2dlciBFTk9CVUZTIG9uIHJlYWQsIHdoaWNoIGlzIHVucmVjb3ZlcmFibGUuCisJLy8gUmVwcm9kdWNlcjoKKwkvLwl1ZXZlbnQgbWRldiAmCisJLy8gCWZpbmQgL3N5cyAtbmFtZSB1ZXZlbnQgLWV4ZWMgc2ggLWMgJ2VjaG8gYWRkID4ie30iJyAnOycKKwkvLworCS8vIFNPX1JDVkJVRkZPUkNFIChyb290IG9ubHkpIGNhbiBnbyBhYm92ZSBuZXQuY29yZS5ybWVtX21heCBzeXNjdGwKKwlzZXRzb2Nrb3B0X1NPTF9TT0NLRVRfaW50KGZkLCBTT19SQ1ZCVUYsICAgICAgUkNWQlVGKTsKKwlzZXRzb2Nrb3B0X1NPTF9TT0NLRVRfaW50KGZkLCBTT19SQ1ZCVUZGT1JDRSwgUkNWQlVGKTsKKwlpZiAoMCkgeworCQlpbnQgejsKKwkJc29ja2xlbl90IHpsID0gc2l6ZW9mKHopOworCQlnZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SQ1ZCVUYsICZ6LCAmemwpOworCQliYl9lcnJvcl9tc2coIlNPX1JDVkJVRjolZCIsIHopOworCX0KKworCWZvciAoOzspIHsKKwkJY2hhciAqbmV0YnVmOworCQljaGFyICpzLCAqZW5kOworCQlzc2l6ZV90IGxlbjsKKwkJaW50IGlkeDsKKworCQkvLyBJbiBtYW55IGNhc2VzLCBhIHN5c3RlbSBzaXRzIGZvciAqZGF5cyogd2FpdGluZworCQkvLyBmb3IgYSBuZXcgdWV2ZW50IG5vdGlmaWNhdGlvbiB0byBjb21lIGluLgorCQkvLyBXZSB1c2UgYSBmcmVzaCBtbWFwIHNvIHRoYXQgYnVmZmVyIGlzIG5vdCBhbGxvY2F0ZWQKKwkJLy8gdW50aWwga2VybmVsIGFjdHVhbGx5IHN0YXJ0cyBmaWxsaW5nIGl0LgorCQluZXRidWYgPSBtbWFwKE5VTEwsIEJVRkZFUl9TSVpFLAorCQkJCQlQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAorCQkJCQlNQVBfUFJJVkFURSB8IE1BUF9BTk9OLAorCQkJCQkvKiBpZ25vcmVkOiAqLyAtMSwgMCk7CisJCWlmIChuZXRidWYgPT0gTUFQX0ZBSUxFRCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgibW1hcCIpOworCisJCS8vIEhlcmUgd2UgYmxvY2ssIHBvc3NpYmx5IGZvciBhIHZlcnkgbG9uZyB0aW1lCisJCWxlbiA9IHNhZmVfcmVhZChmZCwgbmV0YnVmLCBCVUZGRVJfU0laRSAtIDEpOworCQlpZiAobGVuIDwgMCkKKwkJCWJiX3BlcnJvcl9tc2dfYW5kX2RpZSgicmVhZCIpOworCQllbmQgPSBuZXRidWYgKyBsZW47CisJCSplbmQgPSAnXDAnOworCisJCS8vIEVhY2ggbmV0bGluayBtZXNzYWdlIHN0YXJ0cyB3aXRoICJBQ1RJT05AL3BhdGgiCisJCS8vICh3aGljaCB3ZSBjdXJyZW50bHkgaWdub3JlKSwKKwkJLy8gZm9sbG93ZWQgYnkgZW52aXJvbm1lbnQgdmFyaWFibGVzLgorCQlpZiAoIWFyZ3ZbMF0pCisJCQlwdXRjaGFyKCdcbicpOworCQlpZHggPSAwOworCQlzID0gbmV0YnVmOworCQl3aGlsZSAocyA8IGVuZCkgeworCQkJaWYgKCFhcmd2WzBdKQorCQkJCXB1dHMocyk7CisJCQlpZiAoc3RyY2hyKHMsICc9JykgJiYgaWR4IDwgTUFYX0VOVikKKwkJCQllbnZbaWR4KytdID0gczsKKwkJCXMgKz0gc3RybGVuKHMpICsgMTsKKwkJfQorCQllbnZbaWR4XSA9IE5VTEw7CisKKwkJaWR4ID0gMDsKKwkJd2hpbGUgKGVudltpZHhdKQorCQkJcHV0ZW52KGVudltpZHgrK10pOworCQlpZiAoYXJndlswXSkKKwkJCXNwYXduX2FuZF93YWl0KGFyZ3YpOworCQlpZHggPSAwOworCQl3aGlsZSAoZW52W2lkeF0pCisJCQliYl91bnNldGVudihlbnZbaWR4KytdKTsKKwkJbXVubWFwKG5ldGJ1ZiwgQlVGRkVSX1NJWkUpOworCX0KKworCXJldHVybiAwOyAvLyBub3QgcmVhY2hlZAorfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC91bW91bnQuYyBiL3V0aWwtbGludXgvdW1vdW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZjNzQ0MQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdW1vdW50LmMKQEAgLTAsMCArMSwyMTggQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIE1pbmkgdW1vdW50IGltcGxlbWVudGF0aW9uIGZvciBidXN5Ym94CisgKgorICogQ29weXJpZ2h0IChDKSAxOTk5LTIwMDQgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDA1IGJ5IFJvYiBMYW5kbGV5IDxyb2JAbGFuZGxleS5uZXQ+CisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL3VzYWdlOiNkZWZpbmUgdW1vdW50X3RyaXZpYWxfdXNhZ2UKKy8vdXNhZ2U6ICAgICAgICJbT1BUSU9OU10gRklMRVNZU1RFTXxESVJFQ1RPUlkiCisvL3VzYWdlOiNkZWZpbmUgdW1vdW50X2Z1bGxfdXNhZ2UgIlxuXG4iCisvL3VzYWdlOiAgICAgICAiVW5tb3VudCBmaWxlIHN5c3RlbXNcbiIKKy8vdXNhZ2U6CUlGX0ZFQVRVUkVfVU1PVU5UX0FMTCgKKy8vdXNhZ2U6ICAgICAiXG4JLWEJVW5tb3VudCBhbGwgZmlsZSBzeXN0ZW1zIiBJRl9GRUFUVVJFX01UQUJfU1VQUE9SVCgiIGluIC9ldGMvbXRhYiIpCisvL3VzYWdlOgkpCisvL3VzYWdlOglJRl9GRUFUVVJFX01UQUJfU1VQUE9SVCgKKy8vdXNhZ2U6ICAgICAiXG4JLW4JRG9uJ3QgZXJhc2UgL2V0Yy9tdGFiIGVudHJpZXMiCisvL3VzYWdlOgkpCisvL3VzYWdlOiAgICAgIlxuCS1yCVRyeSB0byByZW1vdW50IGRldmljZXMgYXMgcmVhZC1vbmx5IGlmIG1vdW50IGlzIGJ1c3kiCisvL3VzYWdlOiAgICAgIlxuCS1sCUxhenkgdW1vdW50IChkZXRhY2ggZmlsZXN5c3RlbSkiCisvL3VzYWdlOiAgICAgIlxuCS1mCUZvcmNlIHVtb3VudCAoaS5lLiwgdW5yZWFjaGFibGUgTkZTIHNlcnZlcikiCisvL3VzYWdlOglJRl9GRUFUVVJFX01PVU5UX0xPT1AoCisvL3VzYWdlOiAgICAgIlxuCS1ECURvbid0IGZyZWUgbG9vcCBkZXZpY2UgZXZlbiBpZiBpdCBoYXMgYmVlbiB1c2VkIgorLy91c2FnZToJKQorLy91c2FnZToKKy8vdXNhZ2U6I2RlZmluZSB1bW91bnRfZXhhbXBsZV91c2FnZQorLy91c2FnZTogICAgICAgIiQgdW1vdW50IC9kZXYvaGRjMVxuIgorCisjaW5jbHVkZSA8bW50ZW50Lmg+CisjaW5jbHVkZSA8c3lzL21vdW50Lmg+CisjaW5jbHVkZSAibGliYmIuaCIKKworI2lmIGRlZmluZWQoX19kaWV0bGliY19fKQorLy8gVE9ETzogVGhpcyBkb2VzIG5vdCBiZWxvbmcgaGVyZS4KKy8qIDE2LjEyLjIwMDYsIFNhbXBvIEtlbGxvbWFraSAoc2FtcG9AaWtpLmZpKQorICogZGlldGxpYmMtMC4zMCBkb2VzIG5vdCBoYXZlIGltcGxlbWVudGF0aW9uIG9mIGdldG1udGVudF9yKCkgKi8KK3N0YXRpYyBzdHJ1Y3QgbW50ZW50ICpnZXRtbnRlbnRfcihGSUxFKiBzdHJlYW0sIHN0cnVjdCBtbnRlbnQqIHJlc3VsdCwKKwkJY2hhciogYnVmZmVyIFVOVVNFRF9QQVJBTSwgaW50IGJ1ZnNpemUgVU5VU0VEX1BBUkFNKQoreworCXN0cnVjdCBtbnRlbnQqIG1lbnQgPSBnZXRtbnRlbnQoc3RyZWFtKTsKKwlyZXR1cm4gbWVtY3B5KHJlc3VsdCwgbWVudCwgc2l6ZW9mKCptZW50KSk7Cit9CisjZW5kaWYKKworLyogSWdub3JlZDogLXYgLXQgLWkKKyAqIGJib3ggYWx3YXlzIGFjdHMgYXMgaWYgLWQgaXMgcHJlc2VudC4KKyAqIC1EIGNhbiBiZSB1c2VkIHRvIHN1cHByZXNzIGl0IChiYm94IGV4dGVuc2lvbikuCisgKiBSYXRpb25hbGU6CisgKiAoMSkgdXRpbC1saW51eCdzIHVtb3VudCBkb2VzIGl0IGlmICJsb29wPS4uLiIgaXMgc2VlbiBpbiAvZXRjL210YWI6CisgKiB0aHVzLCBvbiBtYW55IHN5c3RlbXMsIGJhcmUgdW1vdW50IF9kb2VzXyBkcm9wIGxvb3AgZGV2aWNlcy4KKyAqICgyKSBtYW55IHVzZXJzIHJlcXVlc3QgdGhpcyBmZWF0dXJlLgorICovCisjZGVmaW5lIE9QVElPTl9TVFJJTkcgICAgICAgICAgICJmbGREbnJhIiAidnQ6aSIKKyNkZWZpbmUgT1BUX0ZPUkNFICAgICAgICAgICAgICAgKDEgPDwgMCkgLy8gU2FtZSBhcyBNTlRfRk9SQ0UKKyNkZWZpbmUgT1BUX0xBWlkgICAgICAgICAgICAgICAgKDEgPDwgMSkgLy8gU2FtZSBhcyBNTlRfREVUQUNICisvLyNkZWZpbmUgT1BUX0ZSRUVfTE9PUCAgICAgICAgICAgKDEgPDwgMikgLy8gLWQgaXMgYXNzdW1lZCBhbHdheXMgcHJlc2VudAorI2RlZmluZSBPUFRfRE9OVF9GUkVFX0xPT1AgICAgICAoMSA8PCAzKQorI2RlZmluZSBPUFRfTk9fTVRBQiAgICAgICAgICAgICAoMSA8PCA0KQorI2RlZmluZSBPUFRfUkVNT1VOVCAgICAgICAgICAgICAoMSA8PCA1KQorI2RlZmluZSBPUFRfQUxMICAgICAgICAgICAgICAgICAoRU5BQkxFX0ZFQVRVUkVfVU1PVU5UX0FMTCA/ICgxIDw8IDYpIDogMCkKKworaW50IHVtb3VudF9tYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgTUFJTl9FWFRFUk5BTExZX1ZJU0lCTEU7CitpbnQgdW1vdW50X21haW4oaW50IGFyZ2MgVU5VU0VEX1BBUkFNLCBjaGFyICoqYXJndikKK3sKKwlpbnQgZG9Gb3JjZTsKKwlzdHJ1Y3QgbW50ZW50IG1lOworCUZJTEUgKmZwOworCWNoYXIgKmZzdHlwZSA9IE5VTEw7CisJaW50IHN0YXR1cyA9IEVYSVRfU1VDQ0VTUzsKKwl1bnNpZ25lZCBvcHQ7CisJc3RydWN0IG10YWJfbGlzdCB7CisJCWNoYXIgKmRpcjsKKwkJY2hhciAqZGV2aWNlOworCQlzdHJ1Y3QgbXRhYl9saXN0ICpuZXh0OworCX0gKm10bCwgKm07CisKKwlvcHQgPSBnZXRvcHQzMihhcmd2LCBPUFRJT05fU1RSSU5HLCAmZnN0eXBlKTsKKwkvL2FyZ2MgLT0gb3B0aW5kOworCWFyZ3YgKz0gb3B0aW5kOworCisJLy8gTU5UX0ZPUkNFIGFuZCBNTlRfREVUQUNIIChmcm9tIGxpbnV4L2ZzLmgpIG11c3QgbWF0Y2gKKwkvLyBPUFRfRk9SQ0UgYW5kIE9QVF9MQVpZLgorCXsKKwkJdHlwZWRlZiBjaGFyIGJ1Z1sKKwkJCShPUFRfRk9SQ0UgIT0gTU5UX0ZPUkNFIHx8IE9QVF9MQVpZICE9IE1OVF9ERVRBQ0gpID8gLTEgOiAxCisJCV07CisJfQorCWRvRm9yY2UgPSBvcHQgJiAoT1BUX0ZPUkNFfE9QVF9MQVpZKTsKKworCS8qIEdldCBhIGxpc3Qgb2YgbW91bnQgcG9pbnRzIGZyb20gbXRhYi4gIFdlIHJlYWQgdGhlbSBhbGwgaW4gbm93IG1vc3RseQorCSAqIGZvciB1bW91bnQgLWEgKHNvIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGxpc3QgY2hhbmdpbmcgd2hpbGUKKwkgKiB3ZSBpdGVyYXRlIG92ZXIgaXQsIG9yIGFib3V0IGdldHRpbmcgc3R1Y2sgaW4gYSBsb29wIG9uIHRoZSBzYW1lIGZhaWxpbmcKKwkgKiBlbnRyeS4gIE5vdGljZSB0aGF0IHRoaXMgYWxzbyBuYXR1cmFsbHkgcmV2ZXJzZXMgdGhlIGxpc3Qgc28gdGhhdCAtYQorCSAqIHVtb3VudHMgdGhlIG1vc3QgcmVjZW50IGVudHJpZXMgZmlyc3QuICovCisJbSA9IG10bCA9IE5VTEw7CisKKwkvLyBJZiB3ZSdyZSB1bW91bnRpbmcgYWxsLCB0aGVuIG0gcG9pbnRzIHRvIHRoZSBzdGFydCBvZiB0aGUgbGlzdCBhbmQKKwkvLyB0aGUgYXJndW1lbnQgbGlzdCBzaG91bGQgYmUgZW1wdHkgKHdoaWNoIHdpbGwgbWF0Y2ggYWxsKS4KKwlmcCA9IHNldG1udGVudChiYl9wYXRoX210YWJfZmlsZSwgInIiKTsKKwlpZiAoIWZwKSB7CisJCWlmIChvcHQgJiBPUFRfQUxMKQorCQkJYmJfZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IG9wZW4gJyVzJyIsIGJiX3BhdGhfbXRhYl9maWxlKTsKKwl9IGVsc2UgeworCQl3aGlsZSAoZ2V0bW50ZW50X3IoZnAsICZtZSwgYmJfY29tbW9uX2J1ZnNpejEsIHNpemVvZihiYl9jb21tb25fYnVmc2l6MSkpKSB7CisJCQkvKiBNYXRjaCBmc3R5cGUgaWYgcGFzc2VkICovCisJCQlpZiAoIW1hdGNoX2ZzdHlwZSgmbWUsIGZzdHlwZSkpCisJCQkJY29udGludWU7CisJCQltID0geHphbGxvYyhzaXplb2YoKm0pKTsKKwkJCW0tPm5leHQgPSBtdGw7CisJCQltLT5kZXZpY2UgPSB4c3RyZHVwKG1lLm1udF9mc25hbWUpOworCQkJbS0+ZGlyID0geHN0cmR1cChtZS5tbnRfZGlyKTsKKwkJCW10bCA9IG07CisJCX0KKwkJZW5kbW50ZW50KGZwKTsKKwl9CisKKwkvLyBJZiB3ZSdyZSBub3QgdW1vdW50aW5nIGFsbCwgd2UgbmVlZCBhdCBsZWFzdCBvbmUgYXJndW1lbnQuCisJaWYgKCEob3B0ICYgT1BUX0FMTCkgJiYgIWZzdHlwZSkgeworCQlpZiAoIWFyZ3ZbMF0pCisJCQliYl9zaG93X3VzYWdlKCk7CisJCW0gPSBOVUxMOworCX0KKworCS8vIExvb3AgdGhyb3VnaCBldmVyeXRoaW5nIHdlJ3JlIHN1cHBvc2VkIHRvIHVtb3VudCwgYW5kIGRvIHNvLgorCWZvciAoOzspIHsKKwkJaW50IGN1cnN0YXQ7CisJCWNoYXIgKnphcGl0ID0gKmFyZ3Y7CisJCWNoYXIgKnBhdGg7CisKKwkJLy8gRG8gd2UgYWxyZWFkeSBrbm93IHdoYXQgdG8gdW1vdW50IHRoaXMgdGltZSB0aHJvdWdoIHRoZSBsb29wPworCQlpZiAobSkKKwkJCXBhdGggPSB4c3RyZHVwKG0tPmRpcik7CisJCS8vIEZvciB1bW91bnQgLWEsIGVuZCBvZiBtdGFiIG1lYW5zIHRpbWUgdG8gZXhpdC4KKwkJZWxzZSBpZiAob3B0ICYgT1BUX0FMTCkKKwkJCWJyZWFrOworCQkvLyBVc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50IChhbmQgbG9vayBpdCB1cCBpbiBtdGFiIGxpc3QpCisJCWVsc2UgeworCQkJaWYgKCF6YXBpdCkKKwkJCQlicmVhazsKKwkJCWFyZ3YrKzsKKwkJCXBhdGggPSB4bWFsbG9jX3JlYWxwYXRoKHphcGl0KTsKKwkJCWlmIChwYXRoKSB7CisJCQkJZm9yIChtID0gbXRsOyBtOyBtID0gbS0+bmV4dCkKKwkJCQkJaWYgKHN0cmNtcChwYXRoLCBtLT5kaXIpID09IDAgfHwgc3RyY21wKHBhdGgsIG0tPmRldmljZSkgPT0gMCkKKwkJCQkJCWJyZWFrOworCQkJfQorCQl9CisJCS8vIElmIHdlIGNvdWxkbid0IGZpbmQgdGhpcyBzdWNrZXIgaW4gL2V0Yy9tdGFiLCBwdW50IGJ5IHBhc3Npbmcgb3VyCisJCS8vIGNvbW1hbmQgbGluZSBhcmd1bWVudCBzdHJhaWdodCB0byB0aGUgdW1vdW50IHN5c2NhbGwuICBPdGhlcndpc2UsCisJCS8vIHVtb3VudCB0aGUgZGlyZWN0b3J5IGV2ZW4gaWYgd2Ugd2VyZSBnaXZlbiB0aGUgYmxvY2sgZGV2aWNlLgorCQlpZiAobSkgemFwaXQgPSBtLT5kaXI7CisKKy8vIHVtb3VudCBmcm9tIHV0aWwtbGludXggMi4yMi4yIGRvZXMgbm90IGRvIHRoaXM6CisvLyB1bW91bnQgLWYgdXNlcyB1bW91bnQyKE1OVF9GT1JDRSkgaW1tZWRpYXRlbHksCisvLyBub3QgdHJ5aW5nIHVtb3VudCgpIGZpcnN0LgorLy8gKFN0cmFuZ2VseSwgdW1vdW50IC1mbCBpZ25vcmVzIC1mOiBpdCBpcyBlcXVpdmFsZW50IHRvIHVtb3VudCAtbC4KKy8vIFdlIGRvIHBhc3MgYm90aCBmbGFncyBpbiB0aGlzIGNhc2UpCisjaWYgMAorCQkvLyBMZXQncyBhc2sgdGhlIHRoaW5nIG5pY2VseSB0byB1bm1vdW50LgorCQljdXJzdGF0ID0gdW1vdW50KHphcGl0KTsKKworCQkvLyBVbm1vdW50IHdpdGggZm9yY2UgYW5kL29yIGxhenkgZmxhZ3MsIGlmIG5lY2Vzc2FyeS4KKwkJaWYgKGN1cnN0YXQgJiYgZG9Gb3JjZSkKKyNlbmRpZgorCQkJY3Vyc3RhdCA9IHVtb3VudDIoemFwaXQsIGRvRm9yY2UpOworCisJCS8vIElmIHN0aWxsIGNhbid0IHVtb3VudCwgbWF5YmUgcmVtb3VudCByZWFkLW9ubHk/CisJCWlmIChjdXJzdGF0KSB7CisJCQlpZiAoKG9wdCAmIE9QVF9SRU1PVU5UKSAmJiBlcnJubyA9PSBFQlVTWSAmJiBtKSB7CisJCQkJLy8gTm90ZSEgRXZlbiBpZiB3ZSBzdWNjZWVkIGhlcmUsIGxhdGVyIHdlIHNob3VsZCBub3QKKwkJCQkvLyBmcmVlIGxvb3AgZGV2aWNlIG9yIGVyYXNlIG10YWIgZW50cnkhCisJCQkJY29uc3QgY2hhciAqbXNnID0gIiVzIGJ1c3kgLSByZW1vdW50ZWQgcmVhZC1vbmx5IjsKKwkJCQljdXJzdGF0ID0gbW91bnQobS0+ZGV2aWNlLCB6YXBpdCwgTlVMTCwgTVNfUkVNT1VOVHxNU19SRE9OTFksIE5VTEwpOworCQkJCWlmIChjdXJzdGF0KSB7CisJCQkJCW1zZyA9ICJjYW4ndCByZW1vdW50ICVzIHJlYWQtb25seSI7CisJCQkJCXN0YXR1cyA9IEVYSVRfRkFJTFVSRTsKKwkJCQl9CisJCQkJYmJfZXJyb3JfbXNnKG1zZywgbS0+ZGV2aWNlKTsKKwkJCX0gZWxzZSB7CisJCQkJc3RhdHVzID0gRVhJVF9GQUlMVVJFOworCQkJCWJiX3BlcnJvcl9tc2coImNhbid0IHVubW91bnQgJXMiLCB6YXBpdCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyBEZS1hbGxvY2F0ZSB0aGUgbG9vcCBkZXZpY2UuICBUaGlzIGlvY3RsIHNob3VsZCBiZSBpZ25vcmVkIG9uCisJCQkvLyBhbnkgbm9uLWxvb3AgYmxvY2sgZGV2aWNlcy4KKwkJCWlmIChFTkFCTEVfRkVBVFVSRV9NT1VOVF9MT09QICYmICEob3B0ICYgT1BUX0RPTlRfRlJFRV9MT09QKSAmJiBtKQorCQkJCWRlbF9sb29wKG0tPmRldmljZSk7CisJCQlpZiAoRU5BQkxFX0ZFQVRVUkVfTVRBQl9TVVBQT1JUICYmICEob3B0ICYgT1BUX05PX01UQUIpICYmIG0pCisJCQkJZXJhc2VfbXRhYihtLT5kaXIpOworCQl9CisKKwkJLy8gRmluZCBuZXh0IG1hdGNoaW5nIG10YWIgZW50cnkgZm9yIC1hIG9yIHVtb3VudCAvZGV2CisJCS8vIE5vdGUgdGhpcyBtZWFucyB0aGF0ICJ1bW91bnQgL2Rldi9ibGFoIiB3aWxsIHVubW91bnQgYWxsIGluc3RhbmNlcworCQkvLyBvZiAvZGV2L2JsYWgsIG5vdCBqdXN0IHRoZSBtb3N0IHJlY2VudC4KKwkJaWYgKG0pIHsKKwkJCXdoaWxlICgobSA9IG0tPm5leHQpICE9IE5VTEwpCisJCQkJLy8gTkI6IGlmIG0gaXMgbm9uLU5VTEwsIHBhdGggaXMgbm9uLU5VTEwgYXMgd2VsbAorCQkJCWlmICgob3B0ICYgT1BUX0FMTCkgfHwgc3RyY21wKHBhdGgsIG0tPmRldmljZSkgPT0gMCkKKwkJCQkJYnJlYWs7CisJCX0KKwkJZnJlZShwYXRoKTsKKwl9CisKKwkvLyBGcmVlIG10YWIgbGlzdCBpZiBuZWNlc3NhcnkKKwlpZiAoRU5BQkxFX0ZFQVRVUkVfQ0xFQU5fVVApIHsKKwkJd2hpbGUgKG10bCkgeworCQkJbSA9IG10bC0+bmV4dDsKKwkJCWZyZWUobXRsLT5kZXZpY2UpOworCQkJZnJlZShtdGwtPmRpcik7CisJCQlmcmVlKG10bCk7CisJCQltdGwgPSBtOworCQl9CisJfQorCisJcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL0NvbmZpZy5zcmMgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9Db25maWcuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMjA4YzkKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9Db25maWcuc3JjCkBAIC0wLDAgKzEsMTUgQEAKKyMKKyMgRm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIHN5bnRheCBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwKKyMgc2VlIHNjcmlwdHMva2J1aWxkL2NvbmZpZy1sYW5ndWFnZS50eHQuCisjCisKK2NvbmZpZyBWT0xVTUVJRAorCWJvb2wgI05vIGRlc2NyaXB0aW9uIG1ha2VzIGl0IGEgaGlkZGVuIG9wdGlvbgorCWRlZmF1bHQgbgorCittZW51ICJGaWxlc3lzdGVtL1ZvbHVtZSBpZGVudGlmaWNhdGlvbiIKKwlkZXBlbmRzIG9uIFZPTFVNRUlECisKK0lOU0VSVAorCitlbmRtZW51CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3ZvbHVtZV9pZC9LYnVpbGQuc3JjIGIvdXRpbC1saW51eC92b2x1bWVfaWQvS2J1aWxkLnNyYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjRmYjc0Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvS2J1aWxkLnNyYwpAQCAtMCwwICsxLDkgQEAKKyMgTWFrZWZpbGUgZm9yIGJ1c3lib3gKKyMKKyMgQ29weXJpZ2h0IChDKSAxOTk5LTIwMDUgYnkgRXJpayBBbmRlcnNlbiA8YW5kZXJzZW5AY29kZXBvZXQub3JnPgorIworIyBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorCitsaWIteTo9CisKK0lOU0VSVApkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvYnRyZnMuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL2J0cmZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRkZGRmMgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL2J0cmZzLmMKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwOSBWbGFkaW1pciBEcm9ubmlrb3YgPGRyb25uaWtvdkBnbWFpbC5jb20+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfQlRSRlMpICs9IGJ0cmZzLm8KKworLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9CVFJGUworLy9jb25maWc6CWJvb2wgImJ0cmZzIGZpbGVzeXN0ZW0iCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBWT0xVTUVJRAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRPRE8KKy8vY29uZmlnOgorCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKKyNkZWZpbmUgQlRSRlNfVVVJRF9TSVpFIDE2CisjZGVmaW5lIEJUUkZTX0xBQkVMX1NJWkUgMjU2CisjZGVmaW5lIEJUUkZTX0NTVU1fU0laRSAzMgorI2RlZmluZSBCVFJGU19GU0lEX1NJWkUgMTYKKworI2RlZmluZSBCVFJGU19NQUdJQyAiX0JIUmZTX00iCisKK3N0cnVjdCBidHJmc19kZXZfaXRlbSB7CisJdWludDY0X3QgZGV2aWQ7CisJdWludDY0X3QgdG90YWxfYnl0ZXM7CisJdWludDY0X3QgYnl0ZXNfdXNlZDsKKwl1aW50MzJfdCBpb19hbGlnbjsKKwl1aW50MzJfdCBpb193aWR0aDsKKwl1aW50MzJfdCBzZWN0b3Jfc2l6ZTsKKwl1aW50NjRfdCB0eXBlOworCXVpbnQ2NF90IGdlbmVyYXRpb247CisJdWludDY0X3Qgc3RhcnRfb2Zmc2V0OworCXVpbnQzMl90IGRldl9ncm91cDsKKwl1aW50OF90IHNlZWtfc3BlZWQ7CisJdWludDhfdCBiYW5kd2lkdGg7CisJdWludDhfdCB1dWlkW0JUUkZTX1VVSURfU0laRV07CisJdWludDhfdCBmc2lkW0JUUkZTX1VVSURfU0laRV07Cit9IFBBQ0tFRDsKKworc3RydWN0IGJ0cmZzX3N1cGVyX2Jsb2NrIHsKKwl1aW50OF90IGNzdW1bQlRSRlNfQ1NVTV9TSVpFXTsKKwl1aW50OF90IGZzaWRbQlRSRlNfRlNJRF9TSVpFXTsJLy8gVVVJRAorCXVpbnQ2NF90IGJ5dGVucjsKKwl1aW50NjRfdCBmbGFnczsKKwl1aW50OF90IG1hZ2ljWzhdOworCXVpbnQ2NF90IGdlbmVyYXRpb247CisJdWludDY0X3Qgcm9vdDsKKwl1aW50NjRfdCBjaHVua19yb290OworCXVpbnQ2NF90IGxvZ19yb290OworCXVpbnQ2NF90IGxvZ19yb290X3RyYW5zaWQ7CisJdWludDY0X3QgdG90YWxfYnl0ZXM7CisJdWludDY0X3QgYnl0ZXNfdXNlZDsKKwl1aW50NjRfdCByb290X2Rpcl9vYmplY3RpZDsKKwl1aW50NjRfdCBudW1fZGV2aWNlczsKKwl1aW50MzJfdCBzZWN0b3JzaXplOworCXVpbnQzMl90IG5vZGVzaXplOworCXVpbnQzMl90IGxlYWZzaXplOworCXVpbnQzMl90IHN0cmlwZXNpemU7CisJdWludDMyX3Qgc3lzX2NodW5rX2FycmF5X3NpemU7CisJdWludDY0X3QgY2h1bmtfcm9vdF9nZW5lcmF0aW9uOworCXVpbnQ2NF90IGNvbXBhdF9mbGFnczsKKwl1aW50NjRfdCBjb21wYXRfcm9fZmxhZ3M7CisJdWludDY0X3QgaW5jb21wYXRfZmxhZ3M7CisJdWludDE2X3QgY3N1bV90eXBlOworCXVpbnQ4X3Qgcm9vdF9sZXZlbDsKKwl1aW50OF90IGNodW5rX3Jvb3RfbGV2ZWw7CisJdWludDhfdCBsb2dfcm9vdF9sZXZlbDsKKwlzdHJ1Y3QgYnRyZnNfZGV2X2l0ZW0gZGV2X2l0ZW07CisJdWludDhfdCBsYWJlbFtCVFJGU19MQUJFTF9TSVpFXTsJLy8gTEFCRUwKKwkvLyAuLi4KK30gUEFDS0VEOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9idHJmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLykKK3sKKwkvLyBidHJmcyBoYXMgc3VwZXJibG9ja3MgYXQgNjRLLCA2NE0gYW5kIDI1NkcKKwkvLyBtaW5pbXVtIGJ0cmZzIHNpemUgaXMgMjU2TQorCS8vIHNvIHdlIG5ldmVyIHN0ZXAgb3V0IHRoZSBkZXZpY2UgaWYgd2UgYW5hbHl6ZQorCS8vIHRoZSBmaXJzdCBhbmQgdGhlIHNlY29uZCBzdXBlcmJsb2NrcworCXN0cnVjdCBidHJmc19zdXBlcl9ibG9jayAqc2I7CisJdW5zaWduZWQgb2ZmID0gNjQ7CisKKwl3aGlsZSAob2ZmIDwgNjQqMTAyNCoxMDI0KSB7CisJCW9mZiAqPSAxMDI0OworCQlkYmcoImJ0cmZzOiBwcm9iaW5nIGF0IG9mZnNldCAweCV4Iiwgb2ZmKTsKKworCQlzYiA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYsIHNpemVvZigqc2IpKTsKKwkJaWYgKHNiID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisKKwkJaWYgKG1lbWNtcChzYi0+bWFnaWMsIEJUUkZTX01BR0lDLCA4KSAhPSAwKQorCQkJcmV0dXJuIC0xOworCX0KKworCS8vIE4uQi46IGJ0cmZzIG5hdGl2ZWx5IHN1cHBvcnRzIDI1NiAoPlZPTFVNRV9JRF9MQUJFTF9TSVpFKSBzaXplIGxhYmVscworCXZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKGlkLCBzYi0+bGFiZWwsIFZPTFVNRV9JRF9MQUJFTF9TSVpFKTsKKwl2b2x1bWVfaWRfc2V0X3V1aWQoaWQsIHNiLT5mc2lkLCBVVUlEX0RDRSk7CisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gImJ0cmZzIjspCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL2NyYW1mcy5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvY3JhbWZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViN2YyMAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL2NyYW1mcy5jCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvL2tidWlsZDpsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9DUkFNRlMpICs9IGNyYW1mcy5vCisKKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVk9MVU1FSURfQ1JBTUZTCisvL2NvbmZpZzoJYm9vbCAiY3JhbWZzIGZpbGVzeXN0ZW0iCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBWT0xVTUVJRAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRPRE8KKy8vY29uZmlnOgorCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCBjcmFtZnNfc3VwZXIgeworCXVpbnQzMl90CW1hZ2ljOworCXVpbnQzMl90CXNpemU7CisJdWludDMyX3QJZmxhZ3M7CisJdWludDMyX3QJZnV0dXJlOworCXVpbnQ4X3QJCXNpZ25hdHVyZVsxNl07CisJc3RydWN0IGNyYW1mc19pbmZvIHsKKwkJdWludDMyX3QJY3JjOworCQl1aW50MzJfdAllZGl0aW9uOworCQl1aW50MzJfdAlibG9ja3M7CisJCXVpbnQzMl90CWZpbGVzOworCX0gUEFDS0VEIGluZm87CisJdWludDhfdAkJbmFtZVsxNl07Cit9IFBBQ0tFRDsKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfY3JhbWZzKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKQoreworI2RlZmluZSBvZmYgKCh1aW50NjRfdCkwKQorCXN0cnVjdCBjcmFtZnNfc3VwZXIgKmNzOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYpOworCisJY3MgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmLCAweDIwMCk7CisJaWYgKGNzID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChjcy0+bWFnaWMgPT0gY3B1X3RvX2JlMzIoMHg0NTNkY2QyOCkpIHsKKy8vCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgY3MtPm5hbWUsIDE2KTsKKwkJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIGNzLT5uYW1lLCAxNik7CisKKy8vCQl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfRklMRVNZU1RFTSk7CisJCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJjcmFtZnMiOykKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvZXhmYXQuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL2V4ZmF0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNhYTM2OAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL2V4ZmF0LmMKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFMtRyBCZXJnaCA8c2diQHN5c3RlbWFzaXMub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0VYRkFUKSArPSBleGZhdC5vCisKKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVk9MVU1FSURfRVhGQVQKKy8vY29uZmlnOglib29sICJleEZBVCBmaWxlc3lzdGVtIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVk9MVU1FSUQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBleEZBVCAoZXh0ZW5kZWQgRkFUKSBpcyBhIHByb3ByaWV0YXJ5IGZpbGUgc3lzdGVtIGRlc2lnbmVkIGVzcGVjaWFsbHkKKy8vY29uZmlnOgkgIGZvciBmbGFzaCBkcml2ZXMuIEl0IGhhcyBtYW55IGZlYXR1cmVzIGZyb20gTlRGUywgYnV0IHdpdGggbGVzcworLy9jb25maWc6CSAgb3ZlcmhlYWQuIGV4RkFUIGlzIHVzZWQgb24gbW9zdCBTRFhDIGNhcmRzIGZvciBjb25zdW1lciBlbGVjdHJvbmljcy4KKy8vY29uZmlnOgorCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKKyNkZWZpbmUgRVhGQVRfU0JfT0ZGU0VUCQkwCisjZGVmaW5lIEVYRkFUX0RJUl9FTlRSWV9TWgkzMgorI2RlZmluZSBFWEZBVF9NQVhfRElSX0VOVFJJRVMJMTAwCisKK3N0cnVjdCBleGZhdF9zdXBlcl9ibG9jayB7CisvKiAweDAwICovCXVpbnQ4X3QJCWJvb3RfanVtcFszXTsKKy8qIDB4MDMgKi8JdWludDhfdAkJZnNfbmFtZVs4XTsKKy8qIDB4MEIgKi8JdWludDhfdAkJbXVzdF9iZV96ZXJvWzUzXTsKKy8qIDB4NDAgKi8JdWludDY0X3QJcGFydGl0aW9uX29mZnNldDsKKy8qIDB4NDggKi8JdWludDY0X3QJdm9sdW1lX2xlbmd0aDsKKy8qIDB4NTAgKi8JdWludDMyX3QJZmF0X29mZnNldDsJCS8vIFNlY3RvciBhZGRyZXNzIG9mIDFzdCBGQVQKKy8qIDB4NTQgKi8JdWludDMyX3QJZmF0X3NpemU7CQkvLyBJbiBzZWN0b3JzCisvKiAweDU4ICovCXVpbnQzMl90CWNsdXN0ZXJfaGVhcF9vZmZzZXQ7CS8vIFNlY3RvciBhZGRyZXNzIG9mIERhdGEgUmVnaW9uCisvKiAweDVDICovCXVpbnQzMl90CWNsdXN0ZXJfY291bnQ7CisvKiAweDYwICovCXVpbnQzMl90CXJvb3RfZGlyOwkJLy8gQ2x1c3RlciBhZGRyZXNzIG9mIFJvb3QgRGlyZWN0b3J5CisvKiAweDY0ICovCXVpbnQ4X3QJCXZvbF9zZXJpYWxfbnJbNF07CS8vIFZvbHVtZSBJRAorLyogMHg2OCAqLwl1aW50MTZfdAlmc19yZXZpc2lvbjsJCS8vIFZWLk1NCisvKiAweDZBICovCXVpbnQxNl90CXZvbF9mbGFnczsKKy8qIDB4NkMgKi8JdWludDhfdAkJYnl0ZXNfcGVyX3NlY3RvcjsJLy8gUG93ZXIgb2YgMjogOSA9PiA1MTIsIDEyID0+IDQwOTYKKy8qIDB4NkQgKi8JdWludDhfdAkJc2VjdG9yc19wZXJfY2x1c3RlcjsJLy8gUG93ZXIgb2YgMgorLyogMHg2RSAqLwl1aW50OF90CQlucl9vZl9mYXRzOwkJLy8gMiBmb3IgVGV4RkFUCisvKiAweDZGICovCS8vIC4uLgorfSBQQUNLRUQ7CisKK3N0cnVjdCBleGZhdF9kaXJfZW50cnkgeworLyogMHgwMCAqLwl1aW50OF90CQllbnRyeV90eXBlOworCQl1bmlvbiB7CisJCQlzdHJ1Y3Qgdm9sdW1lX2xhYmVsIHsKKy8qIDB4MDEgKi8JCQl1aW50OF90CQljaGFyX2NvdW50OwkJLy8gTGVuZ3RoIG9mIGxhYmVsCisvKiAweDAyICovCQkJdWludDE2X3QJdm9sX2xhYmVsWzExXTsJCS8vIFVURjE2IHN0cmluZyB3aXRob3V0IG51bGwgdGVybWluYXRpb24KKy8qIDB4MTggKi8JCQl1aW50OF90CQlyZXNlcnZlZFs4XTsKKy8qIDB4MjAgKi8JCX0gUEFDS0VEIGxhYmVsOworCQkJc3RydWN0IHZvbHVtZV9ndWlkIHsKKy8qIDB4MDEgKi8JCQl1aW50OF90CQlzZWNfY291bnQ7CisvKiAweDAyICovCQkJdWludDE2X3QJc2V0X2NoZWNrc3VtOworLyogMHgwNCAqLwkJCXVpbnQxNl90CWZsYWdzOworLyogMHgwNiAqLwkJCXVpbnQ4X3QJCXZvbF9ndWlkWzE2XTsKKy8qIDB4MTYgKi8JCQl1aW50OF90CQlyZXNlcnZlZFsxMF07CisvKiAweDIwICovCQl9IFBBQ0tFRCBndWlkOworCQl9IFBBQ0tFRCB0eXBlOworfSBQQUNLRUQ7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2V4ZmF0KHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKQoreworCXN0cnVjdCBleGZhdF9zdXBlcl9ibG9jayAqc2I7CisJc3RydWN0IGV4ZmF0X2Rpcl9lbnRyeSAqZGU7CisJdW5zaWduZWQJc2VjdG9yX3N6OworCXVuc2lnbmVkCWNsdXN0ZXJfc3o7CisJdWludDY0X3QJcm9vdF9kaXJfb2ZmOworCXVuc2lnbmVkCWNvdW50OworCXVuc2lnbmVkCW5lZWRfbGJsX2d1aWQ7CisKKwkvLyBQcmltYXJ5IHN1cGVyIGJsb2NrCisJZGJnKCJleEZBVDogcHJvYmluZyBhdCBvZmZzZXQgMHgleCIsIEVYRkFUX1NCX09GRlNFVCk7CisJc2IgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgRVhGQVRfU0JfT0ZGU0VULCBzaXplb2YoKnNiKSk7CisKKwlpZiAoIXNiKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobWVtY21wKHNiLT5mc19uYW1lLCAiRVhGQVQgICAiLCA4KSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwlzZWN0b3Jfc3ogPSAxIDw8IHNiLT5ieXRlc19wZXJfc2VjdG9yOworCWNsdXN0ZXJfc3ogPSBzZWN0b3Jfc3ogPDwgc2ItPnNlY3RvcnNfcGVyX2NsdXN0ZXI7CisJLy8gVGhlcmUgYXJlIG5vIGNsdXN0ZXJzIDAgYW5kIDEsIHNvIHRoZSBmaXJzdCBjbHVzdGVyIGlzIDIuCisJcm9vdF9kaXJfb2ZmID0gKHVpbnQ2NF90KUVYRkFUX1NCX09GRlNFVCArCisJCS8vIEhtbS4uLiBzaG91bGQgd2UgY2FzdCBzZWN0b3Jfc3ovY2x1c3Rlcl9zeiB0byB1aW50NjRfdD8KKwkJKGxlMzJfdG9fY3B1KHNiLT5jbHVzdGVyX2hlYXBfb2Zmc2V0KSkgKiBzZWN0b3Jfc3ogKworCQkobGUzMl90b19jcHUoc2ItPnJvb3RfZGlyKSAtIDIpICogY2x1c3Rlcl9zejsKKwlkYmcoImV4RkFUOiBzZWN0b3Igc2l6ZSAweCV4IGJ5dGVzIiwgc2VjdG9yX3N6KTsKKwlkYmcoImV4RkFUOiBjbHVzdGVyIHNpemUgMHgleCBieXRlcyIsIGNsdXN0ZXJfc3opOworCWRiZygiZXhGQVQ6IHJvb3QgZGlyIGlzIGF0IDB4JWxseCIsIChsb25nIGxvbmcpcm9vdF9kaXJfb2ZmKTsKKworCS8vIFVzZSBET1MgdXVpZCBhcyBmYWxsYmFjaywgaWYgbm8gR1VJRCBzZXQKKwl2b2x1bWVfaWRfc2V0X3V1aWQoaWQsIHNiLT52b2xfc2VyaWFsX25yLCBVVUlEX0RPUyk7CisKKwkvLyBFWEZBVF9NQVhfRElSX0VOVFJJRVMgaXMgdXNlZCBhcyBhIHNhZmV0eSBiZWx0LgorCS8vIFRoZSBSb290IERpcmVjdG9yeSBtYXkgaG9sZCBhbiB1bmxpbWl0ZWQgbnVtYmVyIG9mIGVudHJpZXMsCisJLy8gc28gd2UgZG8gbm90IHdhbnQgdG8gY2hlY2sgYWxsLiBVc3VhbGx5IGxhYmVsIGFuZCBHVUlECisJLy8gYXJlIGluIHRoZSBiZWdpbm5pbmcsIGJ1dCB0aGVyZSBhcmUgbm8gZ3VhcmFudGVlcy4KKwluZWVkX2xibF9ndWlkID0gKDEgPDwgMCkgfCAoMSA8PCAxKTsKKwlmb3IgKGNvdW50ID0gMDsgY291bnQgPCBFWEZBVF9NQVhfRElSX0VOVFJJRVM7IGNvdW50KyspIHsKKwkJZGUgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgcm9vdF9kaXJfb2ZmICsgKGNvdW50ICogRVhGQVRfRElSX0VOVFJZX1NaKSwgRVhGQVRfRElSX0VOVFJZX1NaKTsKKwkJaWYgKGRlID09IE5VTEwpCisJCQlicmVhazsKKwkJaWYgKGRlLT5lbnRyeV90eXBlID09IDB4MDApIHsKKwkJCS8vIEVuZCBvZiBEaXJlY3RvcnkgTWFya2VyCisJCQlkYmcoImV4RkFUOiBFbmQgb2Ygcm9vdCBkaXJlY3RvcnkgcmVhY2hlZCBhZnRlciAldSBlbnRyaWVzIiwgY291bnQpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGRlLT5lbnRyeV90eXBlID09IDB4ODMpIHsKKwkJCS8vIFZvbHVtZSBMYWJlbCBEaXJlY3RvcnkgRW50cnkKKwkJCXZvbHVtZV9pZF9zZXRfbGFiZWxfdW5pY29kZTE2KGlkLCAodWludDhfdCAqKWRlLT50eXBlLmxhYmVsLnZvbF9sYWJlbCwKKwkJCQkJCUxFLCAyICogZGUtPnR5cGUubGFiZWwuY2hhcl9jb3VudCk7CisJCQluZWVkX2xibF9ndWlkICY9IH4oMSA8PCAwKTsKKwkJfQorCQlpZiAoZGUtPmVudHJ5X3R5cGUgPT0gMHhBMCkgeworCQkJLy8gVm9sdW1lIEdVSUQgRGlyZWN0b3J5IEVudHJ5CisJCQl2b2x1bWVfaWRfc2V0X3V1aWQoaWQsIGRlLT50eXBlLmd1aWQudm9sX2d1aWQsIFVVSURfRENFKTsKKwkJCW5lZWRfbGJsX2d1aWQgJj0gfigxIDw8IDEpOworCQl9CisJCWlmICghbmVlZF9sYmxfZ3VpZCkKKwkJCWJyZWFrOworCX0KKworCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJleGZhdCI7KQorCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvZXh0LmMgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9leHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjM5ZDkzCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvZXh0LmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0VYVCkgKz0gZXh0Lm8KKworLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9FWFQKKy8vY29uZmlnOglib29sICJFeHQgZmlsZXN5c3RlbSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFZPTFVNRUlECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVE9ETworLy9jb25maWc6CisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJiYl9lMmZzX2RlZnMuaCIKKworI2RlZmluZSBFWFRfU1VQRVJCTE9DS19PRkZTRVQJCQkweDQwMAorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9leHQoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pCit7CisjZGVmaW5lIG9mZiAoKHVpbnQ2NF90KTApCisJc3RydWN0IGV4dDJfc3VwZXJfYmxvY2sgKmVzOworCisJZGJnKCJleHQ6IHByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwllcyA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBFWFRfU1VQRVJCTE9DS19PRkZTRVQsIDB4MjAwKTsKKwlpZiAoZXMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGVzLT5zX21hZ2ljICE9IGNwdV90b19sZTE2KEVYVDJfU1VQRVJfTUFHSUMpKSB7CisJCWRiZygiZXh0OiBubyBtYWdpYyBmb3VuZCIpOworCQlyZXR1cm4gLTE7CisJfQorCisvLwl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfRklMRVNZU1RFTSk7CisvLwl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgZXMtPnZvbHVtZV9uYW1lLCAxNik7CisJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsICh2b2lkKillcy0+c192b2x1bWVfbmFtZSwgMTYpOworCXZvbHVtZV9pZF9zZXRfdXVpZChpZCwgZXMtPnNfdXVpZCwgVVVJRF9EQ0UpOworCWRiZygiZXh0OiBsYWJlbCAnJXMnIHV1aWQgJyVzJyIsIGlkLT5sYWJlbCwgaWQtPnV1aWQpOworCisjaWYgRU5BQkxFX0ZFQVRVUkVfQkxLSURfVFlQRQorCWlmICgoZXMtPnNfZmVhdHVyZV9yb19jb21wYXQgJiBjcHVfdG9fbGUzMihFWFQ0X0ZFQVRVUkVfUk9fQ09NUEFUX0hVR0VfRklMRSB8IEVYVDRfRkVBVFVSRV9ST19DT01QQVRfRElSX05MSU5LKSkKKwkgfHwgKGVzLT5zX2ZlYXR1cmVfaW5jb21wYXQgJiBjcHVfdG9fbGUzMihFWFQ0X0ZFQVRVUkVfSU5DT01QQVRfRVhURU5UUyB8IEVYVDRfRkVBVFVSRV9JTkNPTVBBVF82NEJJVCkpCisJKSB7CisJCWlkLT50eXBlID0gImV4dDQiOworCX0KKwllbHNlIGlmIChlcy0+c19mZWF0dXJlX2NvbXBhdCAmIGNwdV90b19sZTMyKEVYVDNfRkVBVFVSRV9DT01QQVRfSEFTX0pPVVJOQUwpKQorCQlpZC0+dHlwZSA9ICJleHQzIjsKKwllbHNlCisJCWlkLT50eXBlID0gImV4dDIiOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3ZvbHVtZV9pZC9mMmZzLmMgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9mMmZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYwYjY2MgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL2YyZnMuYwpAQCAtMCwwICsxLDk1IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBTLUcgQmVyZ2ggPHNnYkBzeXN0ZW1hc2lzLm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0YyRlMpICs9IGYyZnMubworCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0YyRlMKKy8vY29uZmlnOglib29sICJmMmZzIGZpbGVzeXN0ZW0iCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBWT0xVTUVJRAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIEYyRlMgKGFrYSBGbGFzaC1GcmllbmRseSBGaWxlIFN5c3RlbSkgaXMgYSBsb2ctc3RydWN0dXJlZCBmaWxlIHN5c3RlbSwKKy8vY29uZmlnOgkgIHdoaWNoIGlzIGFkYXB0ZWQgdG8gbmV3ZXIgZm9ybXMgb2Ygc3RvcmFnZS4gRjJGUyBhbHNvIHJlbWVkaWVzIHNvbWUKKy8vY29uZmlnOgkgIGtub3duIGlzc3VlcyBvZiB0aGUgb2xkZXIgbG9nIHN0cnVjdHVyZWQgZmlsZSBzeXN0ZW1zLCBzdWNoIGFzIGhpZ2gKKy8vY29uZmlnOgkgIGNsZWFuaW5nIG92ZXJoZWFkLgorLy9jb25maWc6CisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworI2RlZmluZSBGMkZTX01BR0lDCQkweEYyRjUyMDEwCS8vIEYyRlMgTWFnaWMgTnVtYmVyCisjZGVmaW5lIEYyRlNfVVVJRF9TSVpFCQkxNgorI2RlZmluZSBGMkZTX0xBQkVMX1NJWkUJCTUxMgorI2RlZmluZSBGMkZTX0xBQkVMX0JZVEVTCTEwMjQKKyNkZWZpbmUgRjJGU19TQjFfT0ZGU0VUCQkweDQwMAkJLy8gb2Zmc2V0IGZvciAxOnN0IHN1cGVyIGJsb2NrCisvKgorI2RlZmluZSBGMkZTX1NCMl9PRkZTRVQJCTB4MTQwMAkJLy8gb2Zmc2V0IGZvciAyOm5kIHN1cGVyIGJsb2NrCisqLworCitzdHJ1Y3QgZjJmc19zdXBlcl9ibG9jayB7CS8vIEFjY29yZGluZyB0byB2ZXJzaW9uIDEuMQorLyogMHgwMCAqLwl1aW50MzJfdAltYWdpYzsJCQkvLyBNYWdpYyBOdW1iZXIKKy8qIDB4MDQgKi8JdWludDE2X3QJbWFqb3JfdmVyOwkJLy8gTWFqb3IgVmVyc2lvbgorLyogMHgwNiAqLwl1aW50MTZfdAltaW5vcl92ZXI7CQkvLyBNaW5vciBWZXJzaW9uCisvKiAweDA4ICovCXVpbnQzMl90CWxvZ19zZWN0b3JzaXplOwkJLy8gbG9nMiBzZWN0b3Igc2l6ZSBpbiBieXRlcworLyogMHgwQyAqLwl1aW50MzJfdAlsb2dfc2VjdG9yc19wZXJfYmxvY2s7CS8vIGxvZzIgIyBvZiBzZWN0b3JzIHBlciBibG9jaworLyogMHgxMCAqLwl1aW50MzJfdAlsb2dfYmxvY2tzaXplOwkJLy8gbG9nMiBibG9jayBzaXplIGluIGJ5dGVzCisvKiAweDE0ICovCXVpbnQzMl90CWxvZ19ibG9ja3NfcGVyX3NlZzsJLy8gbG9nMiAjIG9mIGJsb2NrcyBwZXIgc2VnbWVudAorLyogMHgxOCAqLwl1aW50MzJfdAlzZWdzX3Blcl9zZWM7CQkvLyAjIG9mIHNlZ21lbnRzIHBlciBzZWN0aW9uCisvKiAweDFDICovCXVpbnQzMl90CXNlY3NfcGVyX3pvbmU7CQkvLyAjIG9mIHNlY3Rpb25zIHBlciB6b25lCisvKiAweDIwICovCXVpbnQzMl90CWNoZWNrc3VtX29mZnNldDsJLy8gY2hlY2tzdW0gb2Zmc2V0IGluc2lkZSBzdXBlciBibG9jaworLyogMHgyNCAqLwl1aW50NjRfdAlibG9ja19jb3VudDsJCS8vIHRvdGFsICMgb2YgdXNlciBibG9ja3MKKy8qIDB4MkMgKi8JdWludDMyX3QJc2VjdGlvbl9jb3VudDsJCS8vIHRvdGFsICMgb2Ygc2VjdGlvbnMKKy8qIDB4MzAgKi8JdWludDMyX3QJc2VnbWVudF9jb3VudDsJCS8vIHRvdGFsICMgb2Ygc2VnbWVudHMKKy8qIDB4MzQgKi8JdWludDMyX3QJc2VnbWVudF9jb3VudF9ja3B0OwkvLyAjIG9mIHNlZ21lbnRzIGZvciBjaGVja3BvaW50CisvKiAweDM4ICovCXVpbnQzMl90CXNlZ21lbnRfY291bnRfc2l0OwkvLyAjIG9mIHNlZ21lbnRzIGZvciBTSVQKKy8qIDB4M0MgKi8JdWludDMyX3QJc2VnbWVudF9jb3VudF9uYXQ7CS8vICMgb2Ygc2VnbWVudHMgZm9yIE5BVAorLyogMHg0MCAqLwl1aW50MzJfdAlzZWdtZW50X2NvdW50X3NzYTsJLy8gIyBvZiBzZWdtZW50cyBmb3IgU1NBCisvKiAweDQ0ICovCXVpbnQzMl90CXNlZ21lbnRfY291bnRfbWFpbjsJLy8gIyBvZiBzZWdtZW50cyBmb3IgbWFpbiBhcmVhCisvKiAweDQ4ICovCXVpbnQzMl90CXNlZ21lbnQwX2Jsa2FkZHI7CS8vIHN0YXJ0IGJsb2NrIGFkZHJlc3Mgb2Ygc2VnbWVudCAwCisvKiAweDRDICovCXVpbnQzMl90CWNwX2Jsa2FkZHI7CQkvLyBzdGFydCBibG9jayBhZGRyZXNzIG9mIGNoZWNrcG9pbnQKKy8qIDB4NTAgKi8JdWludDMyX3QJc2l0X2Jsa2FkZHI7CQkvLyBzdGFydCBibG9jayBhZGRyZXNzIG9mIFNJVAorLyogMHg1NCAqLwl1aW50MzJfdAluYXRfYmxrYWRkcjsJCS8vIHN0YXJ0IGJsb2NrIGFkZHJlc3Mgb2YgTkFUCisvKiAweDU4ICovCXVpbnQzMl90CXNzYV9ibGthZGRyOwkJLy8gc3RhcnQgYmxvY2sgYWRkcmVzcyBvZiBTU0EKKy8qIDB4NUMgKi8JdWludDMyX3QJbWFpbl9ibGthZGRyOwkJLy8gc3RhcnQgYmxvY2sgYWRkcmVzcyBvZiBtYWluIGFyZWEKKy8qIDB4NjAgKi8JdWludDMyX3QJcm9vdF9pbm87CQkvLyByb290IGlub2RlIG51bWJlcgorLyogMHg2NCAqLwl1aW50MzJfdAlub2RlX2lubzsJCS8vIG5vZGUgaW5vZGUgbnVtYmVyCisvKiAweDY4ICovCXVpbnQzMl90CW1ldGFfaW5vOwkJLy8gbWV0YSBpbm9kZSBudW1iZXIKKy8qIDB4NkMgKi8JdWludDhfdAkJdXVpZFtGMkZTX1VVSURfU0laRV07CS8vIDEyOC1iaXQgdXVpZCBmb3Igdm9sdW1lCisvKiAweDdDICovCXVpbnQxNl90CXZvbHVtZV9uYW1lW0YyRlNfTEFCRUxfU0laRV07CS8vIHZvbHVtZSBuYW1lCisvLyAvKiAweDQ3QyAqLwl1aW50MzJfdAlleHRlbnNpb25fY291bnQ7CS8vICMgb2YgZXh0ZW5zaW9ucyBiZWxvdworLy8gLyogMHg0ODAgKi8JdWludDhfdAkJZXh0ZW5zaW9uX2xpc3RbNjRdWzhdOwkvLyBleHRlbnNpb24gYXJyYXkKK30gUEFDS0VEOworCisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2YyZnMoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pCit7CisJc3RydWN0IGYyZnNfc3VwZXJfYmxvY2sgKnNiOworCisJLy8gR28gZm9yIHByaW1hcnkgc3VwZXIgYmxvY2sgKGlnbm9yZSBzZWNvbmQgc2IpCisJZGJnKCJmMmZzOiBwcm9iaW5nIGF0IG9mZnNldCAweCV4IiwgRjJGU19TQjFfT0ZGU0VUKTsKKwlzYiA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBGMkZTX1NCMV9PRkZTRVQsIHNpemVvZigqc2IpKTsKKworCWlmICghc2IpCisJCXJldHVybiAtMTsKKworCWlmIChzYi0+bWFnaWMgIT0gY3B1X3RvX2xlMzIoRjJGU19NQUdJQykpCisJCXJldHVybiAtMTsKKworCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJmMmZzIik7CisKKwkvLyBGb3IgdmVyc2lvbiAxLjAgd2UgZG9uJ3Qga25vdyBzYiBzdHJ1Y3R1cmUgYW5kIGNhbid0IHNldCBsYWJlbC91dWlkCisJaWYgKHNiLT5tYWpvcl92ZXIgPT0gY3B1X3RvX2xlMTYoMSkgJiYgc2ItPm1pbm9yX3ZlciA9PSBjcHVfdG9fbGUxNigwKSkKKwkJcmV0dXJuIDA7CisKKwl2b2x1bWVfaWRfc2V0X2xhYmVsX3VuaWNvZGUxNihpZCwgKHVpbnQ4X3QgKilzYi0+dm9sdW1lX25hbWUsCisJCQkJICAgICAgTEUsIE1JTihGMkZTX0xBQkVMX0JZVEVTLCBWT0xVTUVfSURfTEFCRUxfU0laRSkpOworCisJdm9sdW1lX2lkX3NldF91dWlkKGlkLCBzYi0+dXVpZCwgVVVJRF9EQ0UpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3ZvbHVtZV9pZC9mYXQuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL2ZhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NmQ1MDAKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9mYXQuYwpAQCAtMCwwICsxLDM0OSBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0ZBVCkgKz0gZmF0Lm8KKworLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9GQVQKKy8vY29uZmlnOglib29sICJmYXQgZmlsZXN5c3RlbSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFZPTFVNRUlECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVE9ETworLy9jb25maWc6CisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworLyogbGludXgvbXNkb3NfZnMuaCBzYXlzOiAqLworI2RlZmluZSBGQVQxMl9NQVgJCQkweGZmNAorI2RlZmluZSBGQVQxNl9NQVgJCQkweGZmZjQKKyNkZWZpbmUgRkFUMzJfTUFYCQkJMHgwZmZmZmZmNgorCisjZGVmaW5lIEZBVF9BVFRSX1ZPTFVNRV9JRAkJMHgwOAorI2RlZmluZSBGQVRfQVRUUl9ESVIJCQkweDEwCisjZGVmaW5lIEZBVF9BVFRSX0xPTkdfTkFNRQkJMHgwZgorI2RlZmluZSBGQVRfQVRUUl9NQVNLCQkJMHgzZgorI2RlZmluZSBGQVRfRU5UUllfRlJFRQkJCTB4ZTUKKworc3RydWN0IHZmYXRfc3VwZXJfYmxvY2sgeworCXVpbnQ4X3QJCWJvb3RfanVtcFszXTsKKwl1aW50OF90CQlzeXNpZFs4XTsKKwl1aW50MTZfdAlzZWN0b3Jfc2l6ZV9ieXRlczsKKwl1aW50OF90CQlzZWN0b3JzX3Blcl9jbHVzdGVyOworCXVpbnQxNl90CXJlc2VydmVkX3NjdDsKKwl1aW50OF90CQlmYXRzOworCXVpbnQxNl90CWRpcl9lbnRyaWVzOworCXVpbnQxNl90CXNlY3RvcnM7CisJdWludDhfdAkJbWVkaWE7CisJdWludDE2X3QJZmF0X2xlbmd0aDsKKwl1aW50MTZfdAlzZWNzX3RyYWNrOworCXVpbnQxNl90CWhlYWRzOworCXVpbnQzMl90CWhpZGRlbjsKKwl1aW50MzJfdAl0b3RhbF9zZWN0OworCXVuaW9uIHsKKwkJc3RydWN0IGZhdF9zdXBlcl9ibG9jayB7CisJCQl1aW50OF90CQl1bmtub3duWzNdOworCQkJdWludDhfdAkJc2Vybm9bNF07CisJCQl1aW50OF90CQlsYWJlbFsxMV07CisJCQl1aW50OF90CQltYWdpY1s4XTsKKwkJCXVpbnQ4X3QJCWR1bW15MlsxOTJdOworCQkJdWludDhfdAkJcG1hZ2ljWzJdOworCQl9IFBBQ0tFRCBmYXQ7CisJCXN0cnVjdCBmYXQzMl9zdXBlcl9ibG9jayB7CisJCQl1aW50MzJfdAlmYXQzMl9sZW5ndGg7CisJCQl1aW50MTZfdAlmbGFnczsKKwkJCXVpbnQ4X3QJCXZlcnNpb25bMl07CisJCQl1aW50MzJfdAlyb290X2NsdXN0ZXI7CisJCQl1aW50MTZfdAlpbnNmb19zZWN0b3I7CisJCQl1aW50MTZfdAliYWNrdXBfYm9vdDsKKwkJCXVpbnQxNl90CXJlc2VydmVkMls2XTsKKwkJCXVpbnQ4X3QJCXVua25vd25bM107CisJCQl1aW50OF90CQlzZXJub1s0XTsKKwkJCXVpbnQ4X3QJCWxhYmVsWzExXTsKKwkJCXVpbnQ4X3QJCW1hZ2ljWzhdOworCQkJdWludDhfdAkJZHVtbXkyWzE2NF07CisJCQl1aW50OF90CQlwbWFnaWNbMl07CisJCX0gUEFDS0VEIGZhdDMyOworCX0gUEFDS0VEIHR5cGU7Cit9IFBBQ0tFRDsKKworc3RydWN0IHZmYXRfZGlyX2VudHJ5IHsKKwl1aW50OF90CQluYW1lWzExXTsKKwl1aW50OF90CQlhdHRyOworCXVpbnQxNl90CXRpbWVfY3JlYXQ7CisJdWludDE2X3QJZGF0ZV9jcmVhdDsKKwl1aW50MTZfdAl0aW1lX2FjYzsKKwl1aW50MTZfdAlkYXRlX2FjYzsKKwl1aW50MTZfdAljbHVzdGVyX2hpZ2g7CisJdWludDE2X3QJdGltZV93cml0ZTsKKwl1aW50MTZfdAlkYXRlX3dyaXRlOworCXVpbnQxNl90CWNsdXN0ZXJfbG93OworCXVpbnQzMl90CXNpemU7Cit9IFBBQ0tFRDsKKworc3RhdGljIHVpbnQ4X3QgKmdldF9hdHRyX3ZvbHVtZV9pZChzdHJ1Y3QgdmZhdF9kaXJfZW50cnkgKmRpciwgaW50IGNvdW50KQoreworCWZvciAoOy0tY291bnQgPj0gMDsgZGlyKyspIHsKKwkJLyogZW5kIG1hcmtlciAqLworCQlpZiAoZGlyLT5uYW1lWzBdID09IDB4MDApIHsKKwkJCWRiZygiZW5kIG9mIGRpciIpOworCQkJYnJlYWs7CisJCX0KKworCQkvKiBlbXB0eSBlbnRyeSAqLworCQlpZiAoZGlyLT5uYW1lWzBdID09IEZBVF9FTlRSWV9GUkVFKQorCQkJY29udGludWU7CisKKwkJLyogbG9uZyBuYW1lICovCisJCWlmICgoZGlyLT5hdHRyICYgRkFUX0FUVFJfTUFTSykgPT0gRkFUX0FUVFJfTE9OR19OQU1FKQorCQkJY29udGludWU7CisKKwkJaWYgKChkaXItPmF0dHIgJiAoRkFUX0FUVFJfVk9MVU1FX0lEIHwgRkFUX0FUVFJfRElSKSkgPT0gRkFUX0FUVFJfVk9MVU1FX0lEKSB7CisJCQkvKiBsYWJlbHMgZG8gbm90IGhhdmUgZmlsZSBkYXRhICovCisJCQlpZiAoZGlyLT5jbHVzdGVyX2hpZ2ggIT0gMCB8fCBkaXItPmNsdXN0ZXJfbG93ICE9IDApCisJCQkJY29udGludWU7CisKKwkJCWRiZygiZm91bmQgQVRUUl9WT0xVTUVfSUQgaWQgaW4gcm9vdCBkaXIiKTsKKwkJCXJldHVybiBkaXItPm5hbWU7CisJCX0KKworCQlkYmcoInNraXAgZGlyIGVudHJ5Iik7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX3ZmYXQoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3QgZmF0X3BhcnRpdGlvbl9vZmYqLykKK3sKKyNkZWZpbmUgZmF0X3BhcnRpdGlvbl9vZmYgKCh1aW50NjRfdCkwKQorCXN0cnVjdCB2ZmF0X3N1cGVyX2Jsb2NrICp2czsKKwlzdHJ1Y3QgdmZhdF9kaXJfZW50cnkgKmRpcjsKKwl1aW50MTZfdCBzZWN0b3Jfc2l6ZV9ieXRlczsKKwl1aW50MTZfdCBkaXJfZW50cmllczsKKwl1aW50MzJfdCBzZWN0X2NvdW50OworCXVpbnQxNl90IHJlc2VydmVkX3NjdDsKKwl1aW50MzJfdCBmYXRfc2l6ZV9zY3Q7CisJdWludDMyX3Qgcm9vdF9jbHVzdGVyOworCXVpbnQzMl90IGRpcl9zaXplX3NjdDsKKwl1aW50MzJfdCBjbHVzdGVyX2NvdW50OworCXVpbnQ2NF90IHJvb3Rfc3RhcnRfb2ZmOworCXVpbnQzMl90IHN0YXJ0X2RhdGFfc2N0OworCXVpbnQ4X3QgKmJ1ZjsKKwl1aW50MzJfdCBidWZfc2l6ZTsKKwl1aW50OF90ICpsYWJlbCA9IE5VTEw7CisJdWludDMyX3QgbmV4dF9jbHVzdGVyOworCWludCBtYXhsb29wOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBmYXRfcGFydGl0aW9uX29mZik7CisKKwl2cyA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBmYXRfcGFydGl0aW9uX29mZiwgMHgyMDApOworCWlmICh2cyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwkvKiBiZWxpZXZlIG9ubHkgdGhhdCdzIGZhdCwgZG9uJ3QgdHJ1c3QgdGhlIHZlcnNpb24KKwkgKiB0aGUgY2x1c3Rlcl9jb3VudCB3aWxsIHRlbGwgdXMKKwkgKi8KKwlpZiAobWVtY21wKHZzLT5zeXNpZCwgIk5URlMiLCA0KSA9PSAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobWVtY21wKHZzLT50eXBlLmZhdDMyLm1hZ2ljLCAiTVNXSU4iLCA1KSA9PSAwKQorCQlnb3RvIHZhbGlkOworCisJaWYgKG1lbWNtcCh2cy0+dHlwZS5mYXQzMi5tYWdpYywgIkZBVDMyICAgIiwgOCkgPT0gMCkKKwkJZ290byB2YWxpZDsKKworCWlmIChtZW1jbXAodnMtPnR5cGUuZmF0Lm1hZ2ljLCAiRkFUMTYgICAiLCA4KSA9PSAwKQorCQlnb3RvIHZhbGlkOworCisJaWYgKG1lbWNtcCh2cy0+dHlwZS5mYXQubWFnaWMsICJNU0RPUyIsIDUpID09IDApCisJCWdvdG8gdmFsaWQ7CisKKwlpZiAobWVtY21wKHZzLT50eXBlLmZhdC5tYWdpYywgIkZBVDEyICAgIiwgOCkgPT0gMCkKKwkJZ290byB2YWxpZDsKKworCS8qCisJICogVGhlcmUgYXJlIG9sZCBmbG9wcGllcyBvdXQgdGhlcmUgd2l0aG91dCBhIG1hZ2ljLCBzbyB3ZSBjaGVjaworCSAqIGZvciB3ZWxsIGtub3duIHZhbHVlcyBhbmQgZ3Vlc3MgaWYgaXQncyBhIGZhdCB2b2x1bWUKKwkgKi8KKworCS8qIGJvb3QganVtcCBhZGRyZXNzIGNoZWNrICovCisJaWYgKCh2cy0+Ym9vdF9qdW1wWzBdICE9IDB4ZWIgfHwgdnMtPmJvb3RfanVtcFsyXSAhPSAweDkwKQorCSAmJiB2cy0+Ym9vdF9qdW1wWzBdICE9IDB4ZTkKKwkpIHsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGhlYWRzIGNoZWNrICovCisJaWYgKHZzLT5oZWFkcyA9PSAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBjbHVzdGVyIHNpemUgY2hlY2sgKi8KKwlpZiAodnMtPnNlY3RvcnNfcGVyX2NsdXN0ZXIgPT0gMAorCSB8fCAodnMtPnNlY3RvcnNfcGVyX2NsdXN0ZXIgJiAodnMtPnNlY3RvcnNfcGVyX2NsdXN0ZXItMSkpCisJKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBtZWRpYSBjaGVjayAqLworCWlmICh2cy0+bWVkaWEgPCAweGY4ICYmIHZzLT5tZWRpYSAhPSAweGYwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBmYXQgY291bnQqLworCWlmICh2cy0+ZmF0cyAhPSAyKQorCQlyZXR1cm4gLTE7CisKKyB2YWxpZDoKKwkvKiBzZWN0b3Igc2l6ZSBjaGVjayAqLworCXNlY3Rvcl9zaXplX2J5dGVzID0gbGUxNl90b19jcHUodnMtPnNlY3Rvcl9zaXplX2J5dGVzKTsKKwlpZiAoc2VjdG9yX3NpemVfYnl0ZXMgIT0gMHgyMDAgJiYgc2VjdG9yX3NpemVfYnl0ZXMgIT0gMHg0MDAKKwkgJiYgc2VjdG9yX3NpemVfYnl0ZXMgIT0gMHg4MDAgJiYgc2VjdG9yX3NpemVfYnl0ZXMgIT0gMHgxMDAwCisJKSB7CisJCXJldHVybiAtMTsKKwl9CisKKwlkYmcoInNlY3Rvcl9zaXplX2J5dGVzIDB4JXgiLCBzZWN0b3Jfc2l6ZV9ieXRlcyk7CisJZGJnKCJzZWN0b3JzX3Blcl9jbHVzdGVyIDB4JXgiLCB2cy0+c2VjdG9yc19wZXJfY2x1c3Rlcik7CisKKwlyZXNlcnZlZF9zY3QgPSBsZTE2X3RvX2NwdSh2cy0+cmVzZXJ2ZWRfc2N0KTsKKwlkYmcoInJlc2VydmVkX3NjdCAweCV4IiwgcmVzZXJ2ZWRfc2N0KTsKKworCXNlY3RfY291bnQgPSBsZTE2X3RvX2NwdSh2cy0+c2VjdG9ycyk7CisJaWYgKHNlY3RfY291bnQgPT0gMCkKKwkJc2VjdF9jb3VudCA9IGxlMzJfdG9fY3B1KHZzLT50b3RhbF9zZWN0KTsKKwlkYmcoInNlY3RfY291bnQgMHgleCIsIHNlY3RfY291bnQpOworCisJZmF0X3NpemVfc2N0ID0gbGUxNl90b19jcHUodnMtPmZhdF9sZW5ndGgpOworCWlmIChmYXRfc2l6ZV9zY3QgPT0gMCkKKwkJZmF0X3NpemVfc2N0ID0gbGUzMl90b19jcHUodnMtPnR5cGUuZmF0MzIuZmF0MzJfbGVuZ3RoKTsKKwlmYXRfc2l6ZV9zY3QgKj0gdnMtPmZhdHM7CisJZGJnKCJmYXRfc2l6ZV9zY3QgMHgleCIsIGZhdF9zaXplX3NjdCk7CisKKwlkaXJfZW50cmllcyA9IGxlMTZfdG9fY3B1KHZzLT5kaXJfZW50cmllcyk7CisJZGlyX3NpemVfc2N0ID0gKChkaXJfZW50cmllcyAqIHNpemVvZihzdHJ1Y3QgdmZhdF9kaXJfZW50cnkpKSArCisJCQkoc2VjdG9yX3NpemVfYnl0ZXMtMSkpIC8gc2VjdG9yX3NpemVfYnl0ZXM7CisJZGJnKCJkaXJfc2l6ZV9zY3QgMHgleCIsIGRpcl9zaXplX3NjdCk7CisKKwljbHVzdGVyX2NvdW50ID0gc2VjdF9jb3VudCAtIChyZXNlcnZlZF9zY3QgKyBmYXRfc2l6ZV9zY3QgKyBkaXJfc2l6ZV9zY3QpOworCWNsdXN0ZXJfY291bnQgLz0gdnMtPnNlY3RvcnNfcGVyX2NsdXN0ZXI7CisJZGJnKCJjbHVzdGVyX2NvdW50IDB4JXgiLCBjbHVzdGVyX2NvdW50KTsKKworLy8JaWYgKGNsdXN0ZXJfY291bnQgPCBGQVQxMl9NQVgpIHsKKy8vCQlzdHJjcHkoaWQtPnR5cGVfdmVyc2lvbiwgIkZBVDEyIik7CisvLwl9IGVsc2UgaWYgKGNsdXN0ZXJfY291bnQgPCBGQVQxNl9NQVgpIHsKKy8vCQlzdHJjcHkoaWQtPnR5cGVfdmVyc2lvbiwgIkZBVDE2Iik7CisvLwl9IGVsc2UgeworLy8JCXN0cmNweShpZC0+dHlwZV92ZXJzaW9uLCAiRkFUMzIiKTsKKy8vCQlnb3RvIGZhdDMyOworLy8JfQorCWlmIChjbHVzdGVyX2NvdW50ID49IEZBVDE2X01BWCkKKwkJZ290byBmYXQzMjsKKworCS8qIHRoZSBsYWJlbCBtYXkgYmUgYW4gYXR0cmlidXRlIGluIHRoZSByb290IGRpcmVjdG9yeSAqLworCXJvb3Rfc3RhcnRfb2ZmID0gKHJlc2VydmVkX3NjdCArIGZhdF9zaXplX3NjdCkgKiBzZWN0b3Jfc2l6ZV9ieXRlczsKKwlkYmcoInJvb3QgZGlyIHN0YXJ0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIHJvb3Rfc3RhcnRfb2ZmKTsKKwlkYmcoImV4cGVjdGVkIGVudHJpZXMgMHgleCIsIGRpcl9lbnRyaWVzKTsKKworCWJ1Zl9zaXplID0gZGlyX2VudHJpZXMgKiBzaXplb2Yoc3RydWN0IHZmYXRfZGlyX2VudHJ5KTsKKwlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgZmF0X3BhcnRpdGlvbl9vZmYgKyByb290X3N0YXJ0X29mZiwgYnVmX3NpemUpOworCWlmIChidWYgPT0gTlVMTCkKKwkJZ290byByZXQ7CisKKwlsYWJlbCA9IGdldF9hdHRyX3ZvbHVtZV9pZCgoc3RydWN0IHZmYXRfZGlyX2VudHJ5KikgYnVmLCBkaXJfZW50cmllcyk7CisKKwl2cyA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBmYXRfcGFydGl0aW9uX29mZiwgMHgyMDApOworCWlmICh2cyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobGFiZWwgIT0gTlVMTCAmJiBtZW1jbXAobGFiZWwsICJOTyBOQU1FICAgICIsIDExKSAhPSAwKSB7CisvLwkJdm9sdW1lX2lkX3NldF9sYWJlbF9yYXcoaWQsIGxhYmVsLCAxMSk7CisJCXZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKGlkLCBsYWJlbCwgMTEpOworCX0gZWxzZSBpZiAobWVtY21wKHZzLT50eXBlLmZhdC5sYWJlbCwgIk5PIE5BTUUgICAgIiwgMTEpICE9IDApIHsKKy8vCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgdnMtPnR5cGUuZmF0LmxhYmVsLCAxMSk7CisJCXZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKGlkLCB2cy0+dHlwZS5mYXQubGFiZWwsIDExKTsKKwl9CisJdm9sdW1lX2lkX3NldF91dWlkKGlkLCB2cy0+dHlwZS5mYXQuc2Vybm8sIFVVSURfRE9TKTsKKwlnb3RvIHJldDsKKworIGZhdDMyOgorCS8qIEZBVDMyIHJvb3QgZGlyIGlzIGEgY2x1c3RlciBjaGFpbiBsaWtlIGFueSBvdGhlciBkaXJlY3RvcnkgKi8KKwlidWZfc2l6ZSA9IHZzLT5zZWN0b3JzX3Blcl9jbHVzdGVyICogc2VjdG9yX3NpemVfYnl0ZXM7CisJcm9vdF9jbHVzdGVyID0gbGUzMl90b19jcHUodnMtPnR5cGUuZmF0MzIucm9vdF9jbHVzdGVyKTsKKwlzdGFydF9kYXRhX3NjdCA9IHJlc2VydmVkX3NjdCArIGZhdF9zaXplX3NjdDsKKworCW5leHRfY2x1c3RlciA9IHJvb3RfY2x1c3RlcjsKKwltYXhsb29wID0gMTAwOworCXdoaWxlICgtLW1heGxvb3ApIHsKKwkJdWludDY0X3QgbmV4dF9vZmZfc2N0OworCQl1aW50NjRfdCBuZXh0X29mZjsKKwkJdWludDY0X3QgZmF0X2VudHJ5X29mZjsKKwkJaW50IGNvdW50OworCisJCWRiZygibmV4dF9jbHVzdGVyIDB4JXgiLCAodW5zaWduZWQpbmV4dF9jbHVzdGVyKTsKKwkJbmV4dF9vZmZfc2N0ID0gKHVpbnQ2NF90KShuZXh0X2NsdXN0ZXIgLSAyKSAqIHZzLT5zZWN0b3JzX3Blcl9jbHVzdGVyOworCQluZXh0X29mZiA9IChzdGFydF9kYXRhX3NjdCArIG5leHRfb2ZmX3NjdCkgKiBzZWN0b3Jfc2l6ZV9ieXRlczsKKwkJZGJnKCJjbHVzdGVyIG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBuZXh0X29mZik7CisKKwkJLyogZ2V0IGNsdXN0ZXIgKi8KKwkJYnVmID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIGZhdF9wYXJ0aXRpb25fb2ZmICsgbmV4dF9vZmYsIGJ1Zl9zaXplKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJZ290byByZXQ7CisKKwkJZGlyID0gKHN0cnVjdCB2ZmF0X2Rpcl9lbnRyeSopIGJ1ZjsKKwkJY291bnQgPSBidWZfc2l6ZSAvIHNpemVvZihzdHJ1Y3QgdmZhdF9kaXJfZW50cnkpOworCQlkYmcoImV4cGVjdGVkIGVudHJpZXMgMHgleCIsIGNvdW50KTsKKworCQlsYWJlbCA9IGdldF9hdHRyX3ZvbHVtZV9pZChkaXIsIGNvdW50KTsKKwkJaWYgKGxhYmVsKQorCQkJYnJlYWs7CisKKwkJLyogZ2V0IEZBVCBlbnRyeSAqLworCQlmYXRfZW50cnlfb2ZmID0gKHJlc2VydmVkX3NjdCAqIHNlY3Rvcl9zaXplX2J5dGVzKSArIChuZXh0X2NsdXN0ZXIgKiBzaXplb2YodWludDMyX3QpKTsKKwkJZGJnKCJmYXRfZW50cnlfb2ZmIDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpZmF0X2VudHJ5X29mZik7CisJCWJ1ZiA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBmYXRfcGFydGl0aW9uX29mZiArIGZhdF9lbnRyeV9vZmYsIGJ1Zl9zaXplKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJZ290byByZXQ7CisKKwkJLyogc2V0IG5leHQgY2x1c3RlciAqLworCQluZXh0X2NsdXN0ZXIgPSBsZTMyX3RvX2NwdSgqKHVpbnQzMl90KilidWYpICYgMHgwZmZmZmZmZjsKKwkJaWYgKG5leHRfY2x1c3RlciA8IDIgfHwgbmV4dF9jbHVzdGVyID4gRkFUMzJfTUFYKQorCQkJYnJlYWs7CisJfQorCWlmIChtYXhsb29wID09IDApCisJCWRiZygicmVhY2hlZCBtYXhpbXVtIGZvbGxvdyBjb3VudCBvZiByb290IGNsdXN0ZXIgY2hhaW4sIGdpdmUgdXAiKTsKKworCXZzID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIGZhdF9wYXJ0aXRpb25fb2ZmLCAweDIwMCk7CisJaWYgKHZzID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChsYWJlbCAhPSBOVUxMICYmIG1lbWNtcChsYWJlbCwgIk5PIE5BTUUgICAgIiwgMTEpICE9IDApIHsKKy8vCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgbGFiZWwsIDExKTsKKwkJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIGxhYmVsLCAxMSk7CisJfSBlbHNlIGlmIChtZW1jbXAodnMtPnR5cGUuZmF0MzIubGFiZWwsICJOTyBOQU1FICAgICIsIDExKSAhPSAwKSB7CisvLwkJdm9sdW1lX2lkX3NldF9sYWJlbF9yYXcoaWQsIHZzLT50eXBlLmZhdDMyLmxhYmVsLCAxMSk7CisJCXZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKGlkLCB2cy0+dHlwZS5mYXQzMi5sYWJlbCwgMTEpOworCX0KKwl2b2x1bWVfaWRfc2V0X3V1aWQoaWQsIHZzLT50eXBlLmZhdDMyLnNlcm5vLCBVVUlEX0RPUyk7CisKKyByZXQ6CisvLwl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfRklMRVNZU1RFTSk7CisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gInZmYXQiOykKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvZ2V0X2Rldm5hbWUuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL2dldF9kZXZuYW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI5N2RmMQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL2dldF9kZXZuYW1lLmMKQEAgLTAsMCArMSwzMTYgQEAKKy8qIHZpOiBzZXQgc3c9NCB0cz00OiAqLworLyoKKyAqIFN1cHBvcnQgZnVuY3Rpb25zIGZvciBtb3VudGluZyBkZXZpY2VzIGJ5IGxhYmVsL3V1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDYgYnkgSmFzb24gU2Nob29uIDxmbG95ZHBpbmtAZ21haWwuY29tPgorICogU29tZSBwb3J0aW9ucyBjcmliYmVkIGZyb20gZTJmc3Byb2dzLCB1dGlsLWxpbnV4LCBkb3Nmc3Rvb2xzCisgKgorICogTGljZW5zZWQgdW5kZXIgR1BMdjIgb3IgbGF0ZXIsIHNlZSBmaWxlIExJQ0VOU0UgaW4gdGhpcyBzb3VyY2UgdHJlZS4KKyAqLworCisvL2tidWlsZDpsaWItJChDT05GSUdfQkxLSUQpICs9IGdldF9kZXZuYW1lLm8KKy8va2J1aWxkOmxpYi0kKENPTkZJR19GSU5ERlMpICs9IGdldF9kZXZuYW1lLm8KKy8va2J1aWxkOmxpYi0kKENPTkZJR19GRUFUVVJFX01PVU5UX0xBQkVMKSArPSBnZXRfZGV2bmFtZS5vCisKKyNpbmNsdWRlIDxzeXMvbW91bnQuaD4gLyogQkxLR0VUU0laRTY0ICovCisjaWYgIWRlZmluZWQoQkxLR0VUU0laRTY0KQorIyBkZWZpbmUgQkxLR0VUU0laRTY0IF9JT1IoMHgxMiwxMTQsc2l6ZV90KQorI2VuZGlmCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0YXRpYyBzdHJ1Y3QgdXVpZENhY2hlX3MgeworCXN0cnVjdCB1dWlkQ2FjaGVfcyAqbmV4dDsKKy8vCWludCBtYWpvciwgbWlub3I7CisJY2hhciAqZGV2aWNlOworCWNoYXIgKmxhYmVsOworCWNoYXIgKnVjX3V1aWQ7IC8qIHByZWZpeCBtYWtlcyBpdCBlYXNpZXIgdG8gZ3JlcCBmb3IgKi8KKwlJRl9GRUFUVVJFX0JMS0lEX1RZUEUoY29uc3QgY2hhciAqdHlwZTspCit9ICp1dWlkQ2FjaGU7CisKKyNpZiAhRU5BQkxFX0ZFQVRVUkVfQkxLSURfVFlQRQorI2RlZmluZSBnZXRfbGFiZWxfdXVpZChmZCwgbGFiZWwsIHV1aWQsIHR5cGUpIFwKKwlnZXRfbGFiZWxfdXVpZChmZCwgbGFiZWwsIHV1aWQpCisjZGVmaW5lIHV1aWRjYWNoZV9hZGRlbnRyeShkZXZpY2UsIGxhYmVsLCB1dWlkLCB0eXBlKSBcCisJdXVpZGNhY2hlX2FkZGVudHJ5KGRldmljZSwgbGFiZWwsIHV1aWQpCisjZW5kaWYKKworLyogUmV0dXJucyAhMCBvbiBlcnJvci4KKyAqIE90aGVyd2lzZSwgcmV0dXJucyBtYWxsb2MnZWQgc3RyaW5ncyBmb3IgbGFiZWwgYW5kIHV1aWQKKyAqIChhbmQgdGhleSBjYW4ndCBiZSBOVUxMLCBhbHRob3VnaCB0aGV5IGNhbiBiZSAiIikuCisgKiBOQjogY2xvc2VzIGZkLiAqLworc3RhdGljIGludAorZ2V0X2xhYmVsX3V1aWQoaW50IGZkLCBjaGFyICoqbGFiZWwsIGNoYXIgKip1dWlkLCBjb25zdCBjaGFyICoqdHlwZSkKK3sKKwlpbnQgcnYgPSAxOworCXVpbnQ2NF90IHNpemU7CisJc3RydWN0IHZvbHVtZV9pZCAqdmlkOworCisJLyogZmQgaXMgb3duZWQgYnkgdmlkIG5vdyAqLworCXZpZCA9IHZvbHVtZV9pZF9vcGVuX25vZGUoZmQpOworCisJaWYgKGlvY3RsKC8qdmlkLT4qL2ZkLCBCTEtHRVRTSVpFNjQsICZzaXplKSAhPSAwKQorCQlzaXplID0gMDsKKworCWlmICh2b2x1bWVfaWRfcHJvYmVfYWxsKHZpZCwgLyowLCovIHNpemUpICE9IDApCisJCWdvdG8gcmV0OworCisJaWYgKHZpZC0+bGFiZWxbMF0gIT0gJ1wwJyB8fCB2aWQtPnV1aWRbMF0gIT0gJ1wwJworI2lmIEVOQUJMRV9GRUFUVVJFX0JMS0lEX1RZUEUKKwkgfHwgdmlkLT50eXBlICE9IE5VTEwKKyNlbmRpZgorCSkgeworCQkqbGFiZWwgPSB4c3RybmR1cCh2aWQtPmxhYmVsLCBzaXplb2YodmlkLT5sYWJlbCkpOworCQkqdXVpZCAgPSB4c3RybmR1cCh2aWQtPnV1aWQsIHNpemVvZih2aWQtPnV1aWQpKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9CTEtJRF9UWVBFCisJCSp0eXBlID0gdmlkLT50eXBlOworCQlkYmcoImZvdW5kIGxhYmVsICclcycsIHV1aWQgJyVzJywgdHlwZSAnJXMnIiwgKmxhYmVsLCAqdXVpZCwgKnR5cGUpOworI2Vsc2UKKwkJZGJnKCJmb3VuZCBsYWJlbCAnJXMnLCB1dWlkICclcyciLCAqbGFiZWwsICp1dWlkKTsKKyNlbmRpZgorCQlydiA9IDA7CisJfQorIHJldDoKKwlmcmVlX3ZvbHVtZV9pZCh2aWQpOyAvKiBhbHNvIGNsb3NlcyBmZCAqLworCXJldHVybiBydjsKK30KKworLyogTkI6IHdlIHRha2Ugb3duZXJzaGlwIG9mIChtYWxsb2MnZWQpIGxhYmVsIGFuZCB1dWlkICovCitzdGF0aWMgdm9pZAordXVpZGNhY2hlX2FkZGVudHJ5KGNoYXIgKmRldmljZSwgLyppbnQgbWFqb3IsIGludCBtaW5vciwqLyBjaGFyICpsYWJlbCwgY2hhciAqdXVpZCwgY29uc3QgY2hhciAqdHlwZSkKK3sKKwlzdHJ1Y3QgdXVpZENhY2hlX3MgKmxhc3Q7CisKKwlpZiAoIXV1aWRDYWNoZSkgeworCQlsYXN0ID0gdXVpZENhY2hlID0geHphbGxvYyhzaXplb2YoKnV1aWRDYWNoZSkpOworCX0gZWxzZSB7CisJCWZvciAobGFzdCA9IHV1aWRDYWNoZTsgbGFzdC0+bmV4dDsgbGFzdCA9IGxhc3QtPm5leHQpCisJCQljb250aW51ZTsKKwkJbGFzdC0+bmV4dCA9IHh6YWxsb2Moc2l6ZW9mKCp1dWlkQ2FjaGUpKTsKKwkJbGFzdCA9IGxhc3QtPm5leHQ7CisJfQorCS8qbGFzdC0+bmV4dCA9IE5VTEw7IC0geHphbGxvYyBkaWQgaXQqLworLy8JbGFzdC0+bWFqb3IgPSBtYWpvcjsKKy8vCWxhc3QtPm1pbm9yID0gbWlub3I7CisJbGFzdC0+ZGV2aWNlID0gZGV2aWNlOworCWxhc3QtPmxhYmVsID0gbGFiZWw7CisJbGFzdC0+dWNfdXVpZCA9IHV1aWQ7CisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGxhc3QtPnR5cGUgPSB0eXBlOykKK30KKworLyogSWYgZ2V0X2xhYmVsX3V1aWQoKSBvbiBkZXZpY2VfbmFtZSByZXR1cm5zIHN1Y2Nlc3MsCisgKiBhZGQgYSBjYWNoZSBlbnRyeSBmb3IgdGhpcyBkZXZpY2UuCisgKiBJZiBkZXZpY2Ugbm9kZSBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSB0ZW1wb3JhcmlseSBjcmVhdGVkLiAqLworc3RhdGljIGludCBGQVNUX0ZVTkMKK3V1aWRjYWNoZV9jaGVja19kZXZpY2UoY29uc3QgY2hhciAqZGV2aWNlLAorCQlzdHJ1Y3Qgc3RhdCAqc3RhdGJ1ZiwKKwkJdm9pZCAqdXNlckRhdGEgVU5VU0VEX1BBUkFNLAorCQlpbnQgZGVwdGggVU5VU0VEX1BBUkFNKQoreworCS8qIG5vdGU6IHRoaXMgY2hlY2sgcmVqZWN0cyBsaW5rcyB0byBkZXZpY2VzLCBhbW9uZyBvdGhlciBub2RlcyAqLworCWlmICghU19JU0JMSyhzdGF0YnVmLT5zdF9tb2RlKSkKKwkJcmV0dXJuIFRSVUU7CisKKwkvKiBVc2VycyByZXBvcnQgdGhhdCBtdWNraW5nIHdpdGggZmxvcHBpZXMgKGVzcGVjaWFsbHkgbm9uLXByZXNlbnQKKwkgKiBvbmVzKSBpcyBzaWduaWZpY2FudCBQSVRBLiBUaGlzIGlzIGEgaG9ycmlibHkgZGlydHkgaGFjaywKKwkgKiBidXQgaXQgaXMgdmVyeSB1c2VmdWwgaW4gcmVhbCB3b3JsZC4KKwkgKiBJZiB0aGlzIHdpbGwgZXZlciBuZWVkIHRvIGJlIGVuYWJsZWQsIGNvbnNpZGVyIHVzaW5nIE9fTk9OQkxPQ0suCisJICovCisJaWYgKG1ham9yKHN0YXRidWYtPnN0X3JkZXYpID09IDIpCisJCXJldHVybiBUUlVFOworCisJYWRkX3RvX3V1aWRfY2FjaGUoZGV2aWNlKTsKKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgc3RydWN0IHV1aWRDYWNoZV9zKgordXVpZGNhY2hlX2luaXQoaW50IHNjYW5fZGV2aWNlcykKK3sKKwlkYmcoIkRCRzogdXVpZENhY2hlPSV4LCB1dWlkQ2FjaGUiKTsKKwlpZiAodXVpZENhY2hlKQorCQlyZXR1cm4gdXVpZENhY2hlOworCisJLyogV2Ugd2VyZSBzY2FubmluZyAvcHJvYy9wYXJ0aXRpb25zCisJICogYW5kIC9wcm9jL3N5cy9kZXYvY2Ryb20vaW5mbyBoZXJlLgorCSAqIE1pc3NlZCB2b2x1bWUgbWFuYWdlcnMuIEkgc2VlIHRoYXQgInN0YW5kYXJkIiBibGtpZCB1c2VzIHRoZXNlOgorCSAqIC9kZXYvbWFwcGVyL2NvbnRyb2wKKwkgKiAvcHJvYy9kZXZpY2VzCisJICogL3Byb2MvZXZtcy92b2x1bWVzCisJICogL3Byb2MvbHZtL1ZHcworCSAqIFRoaXMgaXMgdW5hY2NlcHRhYmx5IGNvbXBsZXguIExldCdzIGp1c3Qgc2NhbiAvZGV2LgorCSAqIChNYXliZSBhZGQgc2Nhbm5pbmcgb2YgL3N5cy9ibG9jay9YWFgvZGV2IGZvciBkZXZpY2VzCisJICogc29tZWhvdyBub3QgaGF2aW5nIHRoZWlyIC9kZXYvWFhYIGVudHJpZXMgY3JlYXRlZD8pICovCisJaWYgKHNjYW5fZGV2aWNlcykKKwkJcmVjdXJzaXZlX2FjdGlvbigiL2RldiIsIEFDVElPTl9SRUNVUlNFLAorCQkJdXVpZGNhY2hlX2NoZWNrX2RldmljZSwgLyogZmlsZV9hY3Rpb24gKi8KKwkJCU5VTEwsIC8qIGRpcl9hY3Rpb24gKi8KKwkJCU5VTEwsIC8qIHVzZXJEYXRhICovCisJCQkwIC8qIGRlcHRoICovKTsKKworCXJldHVybiB1dWlkQ2FjaGU7Cit9CisKKyNkZWZpbmUgVVVJRCAgIDEKKyNkZWZpbmUgVk9MICAgIDIKKworI2lmZGVmIFVOVVNFRAorc3RhdGljIGNoYXIgKgorZ2V0X3NwZWNfYnlfeChpbnQgbiwgY29uc3QgY2hhciAqdCwgaW50ICptYWpvclB0ciwgaW50ICptaW5vclB0cikKK3sKKwlzdHJ1Y3QgdXVpZENhY2hlX3MgKnVjOworCisJdWMgPSB1dWlkY2FjaGVfaW5pdCgvKnNjYW5fZGV2aWNlczoqLyAxKTsKKwl3aGlsZSAodWMpIHsKKwkJc3dpdGNoIChuKSB7CisJCWNhc2UgVVVJRDoKKwkJCWlmIChzdHJjbXAodCwgdWMtPnVjX3V1aWQpID09IDApIHsKKwkJCQkqbWFqb3JQdHIgPSB1Yy0+bWFqb3I7CisJCQkJKm1pbm9yUHRyID0gdWMtPm1pbm9yOworCQkJCXJldHVybiB1Yy0+ZGV2aWNlOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgVk9MOgorCQkJaWYgKHN0cmNtcCh0LCB1Yy0+bGFiZWwpID09IDApIHsKKwkJCQkqbWFqb3JQdHIgPSB1Yy0+bWFqb3I7CisJCQkJKm1pbm9yUHRyID0gdWMtPm1pbm9yOworCQkJCXJldHVybiB1Yy0+ZGV2aWNlOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJdWMgPSB1Yy0+bmV4dDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyCitmcm9taGV4KGNoYXIgYykKK3sKKwlpZiAoaXNkaWdpdChjKSkKKwkJcmV0dXJuIChjIC0gJzAnKTsKKwlyZXR1cm4gKChjfDB4MjApIC0gJ2EnICsgMTApOworfQorCitzdGF0aWMgY2hhciAqCitnZXRfc3BlY19ieV91dWlkKGNvbnN0IGNoYXIgKnMsIGludCAqbWFqb3IsIGludCAqbWlub3IpCit7CisJdW5zaWduZWQgY2hhciB1dWlkWzE2XTsKKwlpbnQgaTsKKworCWlmIChzdHJsZW4ocykgIT0gMzYgfHwgc1s4XSAhPSAnLScgfHwgc1sxM10gIT0gJy0nCisJIHx8IHNbMThdICE9ICctJyB8fCBzWzIzXSAhPSAnLScKKwkpIHsKKwkJZ290byBiYWRfdXVpZDsKKwl9CisJZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKwkJaWYgKCpzID09ICctJykKKwkJCXMrKzsKKwkJaWYgKCFpc3hkaWdpdChzWzBdKSB8fCAhaXN4ZGlnaXQoc1sxXSkpCisJCQlnb3RvIGJhZF91dWlkOworCQl1dWlkW2ldID0gKChmcm9taGV4KHNbMF0pIDw8IDQpIHwgZnJvbWhleChzWzFdKSk7CisJCXMgKz0gMjsKKwl9CisJcmV0dXJuIGdldF9zcGVjX2J5X3goVVVJRCwgKGNoYXIgKil1dWlkLCBtYWpvciwgbWlub3IpOworCisgYmFkX3V1aWQ6CisJZnByaW50ZihzdGRlcnIsIF8oIm1vdW50OiBiYWQgVVVJRCIpKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNoYXIgKgorZ2V0X3NwZWNfYnlfdm9sdW1lX2xhYmVsKGNvbnN0IGNoYXIgKnMsIGludCAqbWFqb3IsIGludCAqbWlub3IpCit7CisJcmV0dXJuIGdldF9zcGVjX2J5X3goVk9MLCBzLCBtYWpvciwgbWlub3IpOworfQorI2VuZGlmIC8vIFVOVVNFRAorCisvKiBVc2VkIGJ5IGJsa2lkICovCit2b2lkIGRpc3BsYXlfdXVpZF9jYWNoZShpbnQgc2Nhbl9kZXZpY2VzKQoreworCXN0cnVjdCB1dWlkQ2FjaGVfcyAqdWM7CisKKwl1YyA9IHV1aWRjYWNoZV9pbml0KHNjYW5fZGV2aWNlcyk7CisJd2hpbGUgKHVjKSB7CisJCXByaW50ZigiJXM6IiwgdWMtPmRldmljZSk7CisJCWlmICh1Yy0+bGFiZWxbMF0pCisJCQlwcmludGYoIiBMQUJFTD1cIiVzXCIiLCB1Yy0+bGFiZWwpOworCQlpZiAodWMtPnVjX3V1aWRbMF0pCisJCQlwcmludGYoIiBVVUlEPVwiJXNcIiIsIHVjLT51Y191dWlkKTsKKyNpZiBFTkFCTEVfRkVBVFVSRV9CTEtJRF9UWVBFCisJaWYgKHVjLT50eXBlKQorCQlwcmludGYoIiBUWVBFPVwiJXNcIiIsIHVjLT50eXBlKTsKKyNlbmRpZgorCQliYl9wdXRjaGFyKCdcbicpOworCQl1YyA9IHVjLT5uZXh0OworCX0KK30KKworaW50IGFkZF90b191dWlkX2NhY2hlKGNvbnN0IGNoYXIgKmRldmljZSkKK3sKKwljaGFyICp1dWlkID0gdXVpZDsgLyogZm9yIGNvbXBpbGVyICovCisJY2hhciAqbGFiZWwgPSBsYWJlbDsKKyNpZiBFTkFCTEVfRkVBVFVSRV9CTEtJRF9UWVBFCisJY29uc3QgY2hhciAqdHlwZSA9IHR5cGU7CisjZW5kaWYKKwlpbnQgZmQ7CisKKwlmZCA9IG9wZW4oZGV2aWNlLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIDA7CisKKwkvKiBnZXRfbGFiZWxfdXVpZCgpIGNsb3NlcyBmZCBpbiBhbGwgY2FzZXMgKHN1Y2Nlc3MgJiBmYWlsdXJlKSAqLworCWlmIChnZXRfbGFiZWxfdXVpZChmZCwgJmxhYmVsLCAmdXVpZCwgJnR5cGUpID09IDApIHsKKwkJLyogdXVpZGNhY2hlX2FkZGVudHJ5KCkgdGFrZXMgb3duZXJzaGlwIG9mIGFsbCBmb3VyIHBhcmFtcyAqLworCQl1dWlkY2FjaGVfYWRkZW50cnkoeHN0cmR1cChkZXZpY2UpLCAvKm1hLCBtaSwqLyBsYWJlbCwgdXVpZCwgdHlwZSk7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworCisvKiBVc2VkIGJ5IG1vdW50IGFuZCBmaW5kZnMgKi8KKworY2hhciAqZ2V0X2Rldm5hbWVfZnJvbV9sYWJlbChjb25zdCBjaGFyICpzcGVjKQoreworCXN0cnVjdCB1dWlkQ2FjaGVfcyAqdWM7CisKKwl1YyA9IHV1aWRjYWNoZV9pbml0KC8qc2Nhbl9kZXZpY2VzOiovIDEpOworCXdoaWxlICh1YykgeworCQlpZiAodWMtPmxhYmVsWzBdICYmIHN0cmNtcChzcGVjLCB1Yy0+bGFiZWwpID09IDApIHsKKwkJCXJldHVybiB4c3RyZHVwKHVjLT5kZXZpY2UpOworCQl9CisJCXVjID0gdWMtPm5leHQ7CisJfQorCXJldHVybiBOVUxMOworfQorCitjaGFyICpnZXRfZGV2bmFtZV9mcm9tX3V1aWQoY29uc3QgY2hhciAqc3BlYykKK3sKKwlzdHJ1Y3QgdXVpZENhY2hlX3MgKnVjOworCisJdWMgPSB1dWlkY2FjaGVfaW5pdCgvKnNjYW5fZGV2aWNlczoqLyAxKTsKKwl3aGlsZSAodWMpIHsKKwkJLyogY2FzZSBvZiBoZXggbnVtYmVycyBkb2Vzbid0IG1hdHRlciAqLworCQlpZiAoc3RyY2FzZWNtcChzcGVjLCB1Yy0+dWNfdXVpZCkgPT0gMCkgeworCQkJcmV0dXJuIHhzdHJkdXAodWMtPmRldmljZSk7CisJCX0KKwkJdWMgPSB1Yy0+bmV4dDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCByZXNvbHZlX21vdW50X3NwZWMoY2hhciAqKmZzbmFtZSkKK3sKKwljaGFyICp0bXAgPSAqZnNuYW1lOworCisJaWYgKGlzX3ByZWZpeGVkX3dpdGgoKmZzbmFtZSwgIlVVSUQ9IikpCisJCXRtcCA9IGdldF9kZXZuYW1lX2Zyb21fdXVpZCgqZnNuYW1lICsgNSk7CisJZWxzZSBpZiAoaXNfcHJlZml4ZWRfd2l0aCgqZnNuYW1lLCAiTEFCRUw9IikpCisJCXRtcCA9IGdldF9kZXZuYW1lX2Zyb21fbGFiZWwoKmZzbmFtZSArIDYpOworCisJaWYgKHRtcCA9PSAqZnNuYW1lKQorCQlyZXR1cm4gMDsgLyogbm8gVVVJRD0gb3IgTEFCRUw9IHByZWZpeCBmb3VuZCAqLworCisJaWYgKHRtcCkKKwkJKmZzbmFtZSA9IHRtcDsKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL2hmcy5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvaGZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQzNGFhZgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL2hmcy5jCkBAIC0wLDAgKzEsMzI0IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSEZTKSArPSBoZnMubworCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0hGUworLy9jb25maWc6CWJvb2wgImhmcyBmaWxlc3lzdGVtIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVk9MVU1FSUQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUT0RPCisvL2NvbmZpZzoKKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdHJ1Y3QgaGZzX2ZpbmRlcl9pbmZveworCXVpbnQzMl90CWJvb3RfZm9sZGVyOworCXVpbnQzMl90CXN0YXJ0X2FwcDsKKwl1aW50MzJfdAlvcGVuX2ZvbGRlcjsKKwl1aW50MzJfdAlvczlfZm9sZGVyOworCXVpbnQzMl90CXJlc2VydmVkOworCXVpbnQzMl90CW9zeF9mb2xkZXI7CisJdWludDhfdAkJaWRbOF07Cit9IFBBQ0tFRDsKKworc3RydWN0IGhmc19tZGIgeworCXVpbnQ4X3QJCXNpZ25hdHVyZVsyXTsKKwl1aW50MzJfdAljcl9kYXRlOworCXVpbnQzMl90CWxzX01vZDsKKwl1aW50MTZfdAlhdHJiOworCXVpbnQxNl90CW5tX2ZsczsKKwl1aW50MTZfdAl2Ym1fc3Q7CisJdWludDE2X3QJYWxsb2NfcHRyOworCXVpbnQxNl90CW5tX2FsX2Jsa3M7CisJdWludDMyX3QJYWxfYmxrX3NpemU7CisJdWludDMyX3QJY2xwX3NpemU7CisJdWludDE2X3QJYWxfYmxfc3Q7CisJdWludDMyX3QJbnh0X2NuaWQ7CisJdWludDE2X3QJZnJlZV9ia3M7CisJdWludDhfdAkJbGFiZWxfbGVuOworCXVpbnQ4X3QJCWxhYmVsWzI3XTsKKwl1aW50MzJfdAl2b2xfYmt1cDsKKwl1aW50MTZfdAl2b2xfc2VxX251bTsKKwl1aW50MzJfdAl3cl9jbnQ7CisJdWludDMyX3QJeHRfY2x1bXBfc2l6ZTsKKwl1aW50MzJfdAljdF9jbHVtcF9zaXplOworCXVpbnQxNl90CW51bV9yb290X2RpcnM7CisJdWludDMyX3QJZmlsZV9jb3VudDsKKwl1aW50MzJfdAlkaXJfY291bnQ7CisJc3RydWN0IGhmc19maW5kZXJfaW5mbyBmaW5kZXJfaW5mbzsKKwl1aW50OF90CQllbWJlZF9zaWdbMl07CisJdWludDE2X3QJZW1iZWRfc3RhcnRibG9jazsKKwl1aW50MTZfdAllbWJlZF9ibG9ja2NvdW50OworfSBQQUNLRUQ7CisKK3N0cnVjdCBoZnNwbHVzX2Jub2RlX2Rlc2NyaXB0b3IgeworCXVpbnQzMl90CW5leHQ7CisJdWludDMyX3QJcHJldjsKKwl1aW50OF90CQl0eXBlOworCXVpbnQ4X3QJCWhlaWdodDsKKwl1aW50MTZfdAludW1fcmVjczsKKwl1aW50MTZfdAlyZXNlcnZlZDsKK30gUEFDS0VEOworCitzdHJ1Y3QgaGZzcGx1c19iaGVhZGVyX3JlY29yZCB7CisJdWludDE2X3QJZGVwdGg7CisJdWludDMyX3QJcm9vdDsKKwl1aW50MzJfdAlsZWFmX2NvdW50OworCXVpbnQzMl90CWxlYWZfaGVhZDsKKwl1aW50MzJfdAlsZWFmX3RhaWw7CisJdWludDE2X3QJbm9kZV9zaXplOworfSBQQUNLRUQ7CisKK3N0cnVjdCBoZnNwbHVzX2NhdGFsb2dfa2V5IHsKKwl1aW50MTZfdAlrZXlfbGVuOworCXVpbnQzMl90CXBhcmVudF9pZDsKKwl1aW50MTZfdAl1bmljb2RlX2xlbjsKKwl1aW50OF90CQl1bmljb2RlWzI1NSAqIDJdOworfSBQQUNLRUQ7CisKK3N0cnVjdCBoZnNwbHVzX2V4dGVudCB7CisJdWludDMyX3QJc3RhcnRfYmxvY2s7CisJdWludDMyX3QJYmxvY2tfY291bnQ7Cit9IFBBQ0tFRDsKKworI2RlZmluZSBIRlNQTFVTX0VYVEVOVF9DT1VOVAkJOAorc3RydWN0IGhmc3BsdXNfZm9yayB7CisJdWludDY0X3QJdG90YWxfc2l6ZTsKKwl1aW50MzJfdAljbHVtcF9zaXplOworCXVpbnQzMl90CXRvdGFsX2Jsb2NrczsKKwlzdHJ1Y3QgaGZzcGx1c19leHRlbnQgZXh0ZW50c1tIRlNQTFVTX0VYVEVOVF9DT1VOVF07Cit9IFBBQ0tFRDsKKworc3RydWN0IGhmc3BsdXNfdm9sX2hlYWRlciB7CisJdWludDhfdAkJc2lnbmF0dXJlWzJdOworCXVpbnQxNl90CXZlcnNpb247CisJdWludDMyX3QJYXR0cmlidXRlczsKKwl1aW50MzJfdAlsYXN0X21vdW50X3ZlcnM7CisJdWludDMyX3QJcmVzZXJ2ZWQ7CisJdWludDMyX3QJY3JlYXRlX2RhdGU7CisJdWludDMyX3QJbW9kaWZ5X2RhdGU7CisJdWludDMyX3QJYmFja3VwX2RhdGU7CisJdWludDMyX3QJY2hlY2tlZF9kYXRlOworCXVpbnQzMl90CWZpbGVfY291bnQ7CisJdWludDMyX3QJZm9sZGVyX2NvdW50OworCXVpbnQzMl90CWJsb2Nrc2l6ZTsKKwl1aW50MzJfdAl0b3RhbF9ibG9ja3M7CisJdWludDMyX3QJZnJlZV9ibG9ja3M7CisJdWludDMyX3QJbmV4dF9hbGxvYzsKKwl1aW50MzJfdAlyc3JjX2NsdW1wX3N6OworCXVpbnQzMl90CWRhdGFfY2x1bXBfc3o7CisJdWludDMyX3QJbmV4dF9jbmlkOworCXVpbnQzMl90CXdyaXRlX2NvdW50OworCXVpbnQ2NF90CWVuY29kaW5nc19ibXA7CisJc3RydWN0IGhmc19maW5kZXJfaW5mbyBmaW5kZXJfaW5mbzsKKwlzdHJ1Y3QgaGZzcGx1c19mb3JrIGFsbG9jX2ZpbGU7CisJc3RydWN0IGhmc3BsdXNfZm9yayBleHRfZmlsZTsKKwlzdHJ1Y3QgaGZzcGx1c19mb3JrIGNhdF9maWxlOworCXN0cnVjdCBoZnNwbHVzX2ZvcmsgYXR0cl9maWxlOworCXN0cnVjdCBoZnNwbHVzX2Zvcmsgc3RhcnRfZmlsZTsKK30gUEFDS0VEOworCisjZGVmaW5lIEhGU19TVVBFUkJMT0NLX09GRlNFVAkJMHg0MDAKKyNkZWZpbmUgSEZTX05PREVfTEVBRgkJCTB4ZmYKKyNkZWZpbmUgSEZTUExVU19QT1JfQ05JRAkJMQorCitzdGF0aWMgdm9pZCBGQVNUX0ZVTkMgaGZzX3NldF91dWlkKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCBjb25zdCB1aW50OF90ICpoZnNfaWQpCit7CisjZGVmaW5lIGhmc19pZF9sZW4gOAorCW1kNV9jdHhfdCBtZDVjOworCXVpbnQ4X3QgdXVpZFsxNl07CisJdW5zaWduZWQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBoZnNfaWRfbGVuOyBpKyspCisJCWlmIChoZnNfaWRbaV0gIT0gMCkKKwkJCWdvdG8gZG9fbWQ1OworCXJldHVybjsKKyBkb19tZDU6CisJbWQ1X2JlZ2luKCZtZDVjKTsKKwltZDVfaGFzaCgmbWQ1YywgIlwyNjNcMzQyXDE3XDcxXDM2MlwyMjJcMjFcMzI2XDIyN1wyNDRcMFw2MFwxNDVcMTAzXDM1NFwyNTQiLCAxNik7CisJbWQ1X2hhc2goJm1kNWMsIGhmc19pZCwgaGZzX2lkX2xlbik7CisJbWQ1X2VuZCgmbWQ1YywgdXVpZCk7CisJdXVpZFs2XSA9IDB4MzAgfCAodXVpZFs2XSAmIDB4MGYpOworCXV1aWRbOF0gPSAweDgwIHwgKHV1aWRbOF0gJiAweDNmKTsKKwl2b2x1bWVfaWRfc2V0X3V1aWQoaWQsIHV1aWQsIFVVSURfRENFKTsKK30KKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfaGZzX2hmc3BsdXMoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pCit7CisJdWludDY0X3Qgb2ZmID0gMDsKKwl1bnNpZ25lZCBibG9ja3NpemU7CisJdW5zaWduZWQgY2F0X2Jsb2NrOworCXVuc2lnbmVkIGV4dF9ibG9ja19zdGFydDsKKwl1bnNpZ25lZCBleHRfYmxvY2tfY291bnQ7CisJaW50IGV4dDsKKwl1bnNpZ25lZCBsZWFmX25vZGVfaGVhZDsKKwl1bnNpZ25lZCBsZWFmX25vZGVfY291bnQ7CisJdW5zaWduZWQgbGVhZl9ub2RlX3NpemU7CisJdW5zaWduZWQgbGVhZl9ibG9jazsKKwl1aW50NjRfdCBsZWFmX29mZjsKKwl1bnNpZ25lZCBhbGxvY19ibG9ja19zaXplOworCXVuc2lnbmVkIGFsbG9jX2ZpcnN0X2Jsb2NrOworCXVuc2lnbmVkIGVtYmVkX2ZpcnN0X2Jsb2NrOworCXVuc2lnbmVkIHJlY29yZF9jb3VudDsKKwlzdHJ1Y3QgaGZzcGx1c192b2xfaGVhZGVyICpoZnNwbHVzOworCXN0cnVjdCBoZnNwbHVzX2Jub2RlX2Rlc2NyaXB0b3IgKmRlc2NyOworCXN0cnVjdCBoZnNwbHVzX2JoZWFkZXJfcmVjb3JkICpibm9kZTsKKwlzdHJ1Y3QgaGZzcGx1c19jYXRhbG9nX2tleSAqa2V5OworCXVuc2lnbmVkIGxhYmVsX2xlbjsKKwlzdHJ1Y3QgaGZzcGx1c19leHRlbnQgZXh0ZW50c1tIRlNQTFVTX0VYVEVOVF9DT1VOVF07CisJc3RydWN0IGhmc19tZGIgKmhmczsKKwljb25zdCB1aW50OF90ICpidWY7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgSEZTX1NVUEVSQkxPQ0tfT0ZGU0VULCAweDIwMCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwloZnMgPSAoc3RydWN0IGhmc19tZGIgKikgYnVmOworCWlmIChoZnMtPnNpZ25hdHVyZVswXSAhPSAnQicgfHwgaGZzLT5zaWduYXR1cmVbMV0gIT0gJ0QnKQorCQlnb3RvIGNoZWNrcGx1czsKKworCS8qIGl0IG1heSBiZSBqdXN0IGEgaGZzIHdyYXBwZXIgZm9yIGhmcysgKi8KKwlpZiAoaGZzLT5lbWJlZF9zaWdbMF0gPT0gJ0gnICYmIGhmcy0+ZW1iZWRfc2lnWzFdID09ICcrJykgeworCQlhbGxvY19ibG9ja19zaXplID0gYmUzMl90b19jcHUoaGZzLT5hbF9ibGtfc2l6ZSk7CisJCWRiZygiYWxsb2NfYmxvY2tfc2l6ZSAweCV4IiwgYWxsb2NfYmxvY2tfc2l6ZSk7CisKKwkJYWxsb2NfZmlyc3RfYmxvY2sgPSBiZTE2X3RvX2NwdShoZnMtPmFsX2JsX3N0KTsKKwkJZGJnKCJhbGxvY19maXJzdF9ibG9jayAweCV4IiwgYWxsb2NfZmlyc3RfYmxvY2spOworCisJCWVtYmVkX2ZpcnN0X2Jsb2NrID0gYmUxNl90b19jcHUoaGZzLT5lbWJlZF9zdGFydGJsb2NrKTsKKwkJZGJnKCJlbWJlZF9maXJzdF9ibG9jayAweCV4IiwgZW1iZWRfZmlyc3RfYmxvY2spOworCisJCW9mZiArPSAoYWxsb2NfZmlyc3RfYmxvY2sgKiA1MTIpICsKKwkJICAgICAgIChlbWJlZF9maXJzdF9ibG9jayAqIGFsbG9jX2Jsb2NrX3NpemUpOworCQlkYmcoImhmcyB3cmFwcGVkIGhmcysgZm91bmQgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwkJYnVmID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIEhGU19TVVBFUkJMT0NLX09GRlNFVCwgMHgyMDApOworCQlpZiAoYnVmID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisJCWdvdG8gY2hlY2twbHVzOworCX0KKworCWlmIChoZnMtPmxhYmVsX2xlbiA+IDAgJiYgaGZzLT5sYWJlbF9sZW4gPCAyOCkgeworLy8JCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCBoZnMtPmxhYmVsLCBoZnMtPmxhYmVsX2xlbik7CisJCXZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKGlkLCBoZnMtPmxhYmVsLCBoZnMtPmxhYmVsX2xlbikgOworCX0KKworCWhmc19zZXRfdXVpZChpZCwgaGZzLT5maW5kZXJfaW5mby5pZCk7CisvLwl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfRklMRVNZU1RFTSk7CisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gImhmcyI7KQorCisJcmV0dXJuIDA7CisKKyBjaGVja3BsdXM6CisJaGZzcGx1cyA9IChzdHJ1Y3QgaGZzcGx1c192b2xfaGVhZGVyICopIGJ1ZjsKKwlpZiAoaGZzLT5zaWduYXR1cmVbMF0gPT0gJ0gnKQorCQlpZiAoaGZzLT5zaWduYXR1cmVbMV0gPT0gJysnIHx8IGhmcy0+c2lnbmF0dXJlWzFdID09ICdYJykKKwkJCWdvdG8gaGZzcGx1czsKKwlyZXR1cm4gLTE7CisKKyBoZnNwbHVzOgorCWhmc19zZXRfdXVpZChpZCwgaGZzcGx1cy0+ZmluZGVyX2luZm8uaWQpOworCisJYmxvY2tzaXplID0gYmUzMl90b19jcHUoaGZzcGx1cy0+YmxvY2tzaXplKTsKKwlkYmcoImJsb2Nrc2l6ZSAldSIsIGJsb2Nrc2l6ZSk7CisKKwltZW1jcHkoZXh0ZW50cywgaGZzcGx1cy0+Y2F0X2ZpbGUuZXh0ZW50cywgc2l6ZW9mKGV4dGVudHMpKTsKKwljYXRfYmxvY2sgPSBiZTMyX3RvX2NwdShleHRlbnRzWzBdLnN0YXJ0X2Jsb2NrKTsKKwlkYmcoImNhdGFsb2cgc3RhcnQgYmxvY2sgMHgleCIsIGNhdF9ibG9jayk7CisKKwlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgKGNhdF9ibG9jayAqIGJsb2Nrc2l6ZSksIDB4MjAwMCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlnb3RvIGZvdW5kOworCisJYm5vZGUgPSAoc3RydWN0IGhmc3BsdXNfYmhlYWRlcl9yZWNvcmQgKikKKwkJJmJ1ZltzaXplb2Yoc3RydWN0IGhmc3BsdXNfYm5vZGVfZGVzY3JpcHRvcildOworCisJbGVhZl9ub2RlX2hlYWQgPSBiZTMyX3RvX2NwdShibm9kZS0+bGVhZl9oZWFkKTsKKwlkYmcoImNhdGFsb2cgbGVhZiBub2RlIDB4JXgiLCBsZWFmX25vZGVfaGVhZCk7CisKKwlsZWFmX25vZGVfc2l6ZSA9IGJlMTZfdG9fY3B1KGJub2RlLT5ub2RlX3NpemUpOworCWRiZygibGVhZiBub2RlIHNpemUgMHgleCIsIGxlYWZfbm9kZV9zaXplKTsKKworCWxlYWZfbm9kZV9jb3VudCA9IGJlMzJfdG9fY3B1KGJub2RlLT5sZWFmX2NvdW50KTsKKwlkYmcoImxlYWYgbm9kZSBjb3VudCAweCV4IiwgbGVhZl9ub2RlX2NvdW50KTsKKwlpZiAobGVhZl9ub2RlX2NvdW50ID09IDApCisJCWdvdG8gZm91bmQ7CisKKwlsZWFmX2Jsb2NrID0gKGxlYWZfbm9kZV9oZWFkICogbGVhZl9ub2RlX3NpemUpIC8gYmxvY2tzaXplOworCisJLyogZ2V0IHBoeXNpY2FsIGxvY2F0aW9uICovCisJZm9yIChleHQgPSAwOyBleHQgPCBIRlNQTFVTX0VYVEVOVF9DT1VOVDsgZXh0KyspIHsKKwkJZXh0X2Jsb2NrX3N0YXJ0ID0gYmUzMl90b19jcHUoZXh0ZW50c1tleHRdLnN0YXJ0X2Jsb2NrKTsKKwkJZXh0X2Jsb2NrX2NvdW50ID0gYmUzMl90b19jcHUoZXh0ZW50c1tleHRdLmJsb2NrX2NvdW50KTsKKwkJZGJnKCJleHRlbnQgc3RhcnQgYmxvY2sgMHgleCwgY291bnQgMHgleCIsIGV4dF9ibG9ja19zdGFydCwgZXh0X2Jsb2NrX2NvdW50KTsKKworCQlpZiAoZXh0X2Jsb2NrX2NvdW50ID09IDApCisJCQlnb3RvIGZvdW5kOworCisJCS8qIHRoaXMgaXMgb3VyIGV4dGVudCAqLworCQlpZiAobGVhZl9ibG9jayA8IGV4dF9ibG9ja19jb3VudCkKKwkJCWJyZWFrOworCisJCWxlYWZfYmxvY2sgLT0gZXh0X2Jsb2NrX2NvdW50OworCX0KKwlpZiAoZXh0ID09IEhGU1BMVVNfRVhURU5UX0NPVU5UKQorCQlnb3RvIGZvdW5kOworCWRiZygiZm91bmQgYmxvY2sgaW4gZXh0ZW50ICVpIiwgZXh0KTsKKworCWxlYWZfb2ZmID0gKGV4dF9ibG9ja19zdGFydCArIGxlYWZfYmxvY2spICogYmxvY2tzaXplOworCisJYnVmID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIGxlYWZfb2ZmLCBsZWFmX25vZGVfc2l6ZSk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlnb3RvIGZvdW5kOworCisJZGVzY3IgPSAoc3RydWN0IGhmc3BsdXNfYm5vZGVfZGVzY3JpcHRvciAqKSBidWY7CisJZGJnKCJkZXNjcmlwdG9yIHR5cGUgMHgleCIsIGRlc2NyLT50eXBlKTsKKworCXJlY29yZF9jb3VudCA9IGJlMTZfdG9fY3B1KGRlc2NyLT5udW1fcmVjcyk7CisJZGJnKCJudW1iZXIgb2YgcmVjb3JkcyAldSIsIHJlY29yZF9jb3VudCk7CisJaWYgKHJlY29yZF9jb3VudCA9PSAwKQorCQlnb3RvIGZvdW5kOworCisJaWYgKGRlc2NyLT50eXBlICE9IEhGU19OT0RFX0xFQUYpCisJCWdvdG8gZm91bmQ7CisKKwlrZXkgPSAoc3RydWN0IGhmc3BsdXNfY2F0YWxvZ19rZXkgKikKKwkJJmJ1ZltzaXplb2Yoc3RydWN0IGhmc3BsdXNfYm5vZGVfZGVzY3JpcHRvcildOworCisJZGJnKCJwYXJlbnQgaWQgMHgleCIsIGJlMzJfdG9fY3B1KGtleS0+cGFyZW50X2lkKSk7CisJaWYgKGtleS0+cGFyZW50X2lkICE9IGNwdV90b19iZTMyKEhGU1BMVVNfUE9SX0NOSUQpKQorCQlnb3RvIGZvdW5kOworCisJbGFiZWxfbGVuID0gYmUxNl90b19jcHUoa2V5LT51bmljb2RlX2xlbikgKiAyOworCWRiZygibGFiZWwgdW5pY29kZTE2IGxlbiAlaSIsIGxhYmVsX2xlbik7CisvLwl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwga2V5LT51bmljb2RlLCBsYWJlbF9sZW4pOworCXZvbHVtZV9pZF9zZXRfbGFiZWxfdW5pY29kZTE2KGlkLCBrZXktPnVuaWNvZGUsIEJFLCBsYWJlbF9sZW4pOworCisgZm91bmQ6CisvLwl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfRklMRVNZU1RFTSk7CisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gImhmc3BsdXMiOykKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvaXNvOTY2MC5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvaXNvOTY2MC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NDhkZTQKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9pc285NjYwLmMKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvL2tidWlsZDpsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9JU085NjYwKSArPSBpc285NjYwLm8KKworLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9JU085NjYwCisvL2NvbmZpZzoJYm9vbCAiaXNvOTY2MCBmaWxlc3lzdGVtIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVk9MVU1FSUQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUT0RPCisvL2NvbmZpZzoKKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCisjZGVmaW5lIElTT19TVVBFUkJMT0NLX09GRlNFVAkJMHg4MDAwCisjZGVmaW5lIElTT19TRUNUT1JfU0laRQkJCTB4ODAwCisjZGVmaW5lIElTT19WRF9PRkZTRVQJCQkoSVNPX1NVUEVSQkxPQ0tfT0ZGU0VUICsgSVNPX1NFQ1RPUl9TSVpFKQorI2RlZmluZSBJU09fVkRfUFJJTUFSWQkJCTB4MQorI2RlZmluZSBJU09fVkRfU1VQUExFTUVOVEFSWQkJMHgyCisjZGVmaW5lIElTT19WRF9FTkQJCQkweGZmCisjZGVmaW5lIElTT19WRF9NQVgJCQkxNgorCitzdHJ1Y3QgaXNvX3ZvbHVtZV9kZXNjcmlwdG9yIHsKKwl1aW50OF90CQl2ZF90eXBlOworCXVpbnQ4X3QJCXZkX2lkWzVdOworCXVpbnQ4X3QJCXZkX3ZlcnNpb247CisJdWludDhfdAkJZmxhZ3M7CisJdWludDhfdAkJc3lzdGVtX2lkWzMyXTsKKwl1aW50OF90CQl2b2x1bWVfaWRbMzJdOworCXVpbnQ4X3QJCXVudXNlZFs4XTsKKwl1aW50OF90CQlzcGFjZV9zaXplWzhdOworCXVpbnQ4X3QJCWVzY2FwZV9zZXF1ZW5jZXNbOF07Cit9IFBBQ0tFRDsKKworc3RydWN0IGhpZ2hfc2llcnJhX3ZvbHVtZV9kZXNjcmlwdG9yIHsKKwl1aW50OF90CQlmb29bOF07CisJdWludDhfdAkJdHlwZTsKKwl1aW50OF90CQlpZFs0XTsKKwl1aW50OF90CQl2ZXJzaW9uOworfSBQQUNLRUQ7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2lzbzk2NjAoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pCit7CisjZGVmaW5lIG9mZiAoKHVpbnQ2NF90KTApCisJdWludDhfdCAqYnVmOworCXN0cnVjdCBpc29fdm9sdW1lX2Rlc2NyaXB0b3IgKmlzOworCXN0cnVjdCBoaWdoX3NpZXJyYV92b2x1bWVfZGVzY3JpcHRvciAqaHM7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgSVNPX1NVUEVSQkxPQ0tfT0ZGU0VULCAweDIwMCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpcyA9IChzdHJ1Y3QgaXNvX3ZvbHVtZV9kZXNjcmlwdG9yICopIGJ1ZjsKKworCWlmIChtZW1jbXAoaXMtPnZkX2lkLCAiQ0QwMDEiLCA1KSA9PSAwKSB7CisJCWludCB2ZF9vZmZzZXQ7CisJCWludCBpOworCisJCWRiZygicmVhZCBsYWJlbCBmcm9tIFBWRCIpOworLy8JCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCBpcy0+dm9sdW1lX2lkLCAzMik7CisJCXZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKGlkLCBpcy0+dm9sdW1lX2lkLCAzMik7CisKKwkJZGJnKCJsb29raW5nIGZvciBTVkRzIik7CisJCXZkX29mZnNldCA9IElTT19WRF9PRkZTRVQ7CisJCWZvciAoaSA9IDA7IGkgPCBJU09fVkRfTUFYOyBpKyspIHsKKwkJCXVpbnQ4X3Qgc3ZkX2xhYmVsWzY0XTsKKworCQkJaXMgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgdmRfb2Zmc2V0LCAweDIwMCk7CisJCQlpZiAoaXMgPT0gTlVMTCB8fCBpcy0+dmRfdHlwZSA9PSBJU09fVkRfRU5EKQorCQkJCWJyZWFrOworCQkJaWYgKGlzLT52ZF90eXBlICE9IElTT19WRF9TVVBQTEVNRU5UQVJZKQorCQkJCWNvbnRpbnVlOworCisJCQlkYmcoImZvdW5kIFNWRCBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgKG9mZiArIHZkX29mZnNldCkpOworCQkJaWYgKG1lbWNtcChpcy0+ZXNjYXBlX3NlcXVlbmNlcywgIiUvQCIsIDMpID09IDAKKwkJCSB8fCBtZW1jbXAoaXMtPmVzY2FwZV9zZXF1ZW5jZXMsICIlL0MiLCAzKSA9PSAwCisJCQkgfHwgbWVtY21wKGlzLT5lc2NhcGVfc2VxdWVuY2VzLCAiJS9FIiwgMykgPT0gMAorCQkJKSB7CisJCQkJZGJnKCJKb2xpZXQgZXh0ZW5zaW9uIGZvdW5kIik7CisJCQkJdm9sdW1lX2lkX3NldF91bmljb2RlMTYoKGNoYXIgKilzdmRfbGFiZWwsIHNpemVvZihzdmRfbGFiZWwpLCBpcy0+dm9sdW1lX2lkLCBCRSwgMzIpOworCQkJCWlmIChtZW1jbXAoaWQtPmxhYmVsLCBzdmRfbGFiZWwsIDE2KSA9PSAwKSB7CisJCQkJCWRiZygiU1ZEIGxhYmVsIGlzIGlkZW50aWNhbCwgdXNlIHRoZSBwb3NzaWJseSBsb25nZXIgUFZEIG9uZSIpOworCQkJCQlicmVhazsKKwkJCQl9CisKKy8vCQkJCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCBpcy0+dm9sdW1lX2lkLCAzMik7CisJCQkJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIHN2ZF9sYWJlbCwgMzIpOworLy8JCQkJc3RyY3B5KGlkLT50eXBlX3ZlcnNpb24sICJKb2xpZXQgRXh0ZW5zaW9uIik7CisJCQkJZ290byBmb3VuZDsKKwkJCX0KKwkJCXZkX29mZnNldCArPSBJU09fU0VDVE9SX1NJWkU7CisJCX0KKwkJZ290byBmb3VuZDsKKwl9CisKKwlocyA9IChzdHJ1Y3QgaGlnaF9zaWVycmFfdm9sdW1lX2Rlc2NyaXB0b3IgKikgYnVmOworCisJaWYgKG1lbWNtcChocy0+aWQsICJDRFJPTSIsIDUpID09IDApIHsKKy8vCQlzdHJjcHkoaWQtPnR5cGVfdmVyc2lvbiwgIkhpZ2ggU2llcnJhIik7CisJCWdvdG8gZm91bmQ7CisJfQorCisJcmV0dXJuIC0xOworCisgZm91bmQ6CisvLwl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfRklMRVNZU1RFTSk7CisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gImlzbzk2NjAiOykKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvamZzLmMgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9qZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmVhZmY0Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvamZzLmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0pGUykgKz0gamZzLm8KKworLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9KRlMKKy8vY29uZmlnOglib29sICJqZnMgZmlsZXN5c3RlbSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFZPTFVNRUlECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVE9ETworLy9jb25maWc6CisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworc3RydWN0IGpmc19zdXBlcl9ibG9jayB7CisJdWludDhfdAkJbWFnaWNbNF07CisJdWludDMyX3QJdmVyc2lvbjsKKwl1aW50NjRfdAlzaXplOworCXVpbnQzMl90CWJzaXplOworCXVpbnQzMl90CWR1bW15MTsKKwl1aW50MzJfdAlwYnNpemU7CisJdWludDMyX3QJZHVtbXkyWzI3XTsKKwl1aW50OF90CQl1dWlkWzE2XTsKKwl1aW50OF90CQlsYWJlbFsxNl07CisJdWludDhfdAkJbG9ndXVpZFsxNl07Cit9IFBBQ0tFRDsKKworI2RlZmluZSBKRlNfU1VQRVJCTE9DS19PRkZTRVQJCQkweDgwMDAKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfamZzKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKQoreworI2RlZmluZSBvZmYgKCh1aW50NjRfdCkwKQorCXN0cnVjdCBqZnNfc3VwZXJfYmxvY2sgKmpzOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYpOworCisJanMgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgSkZTX1NVUEVSQkxPQ0tfT0ZGU0VULCAweDIwMCk7CisJaWYgKGpzID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChtZW1jbXAoanMtPm1hZ2ljLCAiSkZTMSIsIDQpICE9IDApCisJCXJldHVybiAtMTsKKworLy8Jdm9sdW1lX2lkX3NldF9sYWJlbF9yYXcoaWQsIGpzLT5sYWJlbCwgMTYpOworCXZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKGlkLCBqcy0+bGFiZWwsIDE2KTsKKwl2b2x1bWVfaWRfc2V0X3V1aWQoaWQsIGpzLT51dWlkLCBVVUlEX0RDRSk7CisKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9GSUxFU1lTVEVNKTsKKwlJRl9GRUFUVVJFX0JMS0lEX1RZUEUoaWQtPnR5cGUgPSAiamZzIjspCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL2xpbnV4X3JhaWQuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL2xpbnV4X3JhaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjA4MjNhCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvbGludXhfcmFpZC5jCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvL2tidWlsZDpsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFJBSUQpICs9IGxpbnV4X3JhaWQubworCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0xJTlVYUkFJRAorLy9jb25maWc6CWJvb2wgImxpbnV4cmFpZCIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFZPTFVNRUlECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVE9ETworLy9jb25maWc6CisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworc3RydWN0IG1kcF9zdXBlcl9ibG9jayB7CisJdWludDMyX3QJbWRfbWFnaWM7CisJdWludDMyX3QJbWFqb3JfdmVyc2lvbjsKKwl1aW50MzJfdAltaW5vcl92ZXJzaW9uOworCXVpbnQzMl90CXBhdGNoX3ZlcnNpb247CisJdWludDMyX3QJZ3ZhbGlkX3dvcmRzOworCXVpbnQzMl90CXNldF91dWlkMDsKKwl1aW50MzJfdAljdGltZTsKKwl1aW50MzJfdAlsZXZlbDsKKwl1aW50MzJfdAlzaXplOworCXVpbnQzMl90CW5yX2Rpc2tzOworCXVpbnQzMl90CXJhaWRfZGlza3M7CisJdWludDMyX3QJbWRfbWlub3I7CisJdWludDMyX3QJbm90X3BlcnNpc3RlbnQ7CisJdWludDMyX3QJc2V0X3V1aWQxOworCXVpbnQzMl90CXNldF91dWlkMjsKKwl1aW50MzJfdAlzZXRfdXVpZDM7Cit9IFBBQ0tFRDsKKworI2RlZmluZSBNRF9SRVNFUlZFRF9CWVRFUwkJMHgxMDAwMAorI2RlZmluZSBNRF9NQUdJQwkJCTB4YTkyYjRlZmMKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfbGludXhfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLywgdWludDY0X3Qgc2l6ZSkKK3sKKwl0eXBlZGVmIHVpbnQzMl90IGFsaWFzZWRfdWludDMyX3QgRklYX0FMSUFTSU5HOworI2RlZmluZSBvZmYgKCh1aW50NjRfdCkwKQorCXVpbnQ2NF90IHNib2ZmOworCXVpbnQ4X3QgdXVpZFsxNl07CisJc3RydWN0IG1kcF9zdXBlcl9ibG9jayAqbWRwOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgsIHNpemUgMHglbGx4IiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKSBzaXplKTsKKworCWlmIChzaXplIDwgMHgxMDAwMCkKKwkJcmV0dXJuIC0xOworCisJc2JvZmYgPSAoc2l6ZSAmIH4oTURfUkVTRVJWRURfQllURVMgLSAxKSkgLSBNRF9SRVNFUlZFRF9CWVRFUzsKKwltZHAgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgc2JvZmYsIDB4ODAwKTsKKwlpZiAobWRwID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChtZHAtPm1kX21hZ2ljICE9IGNwdV90b19sZTMyKE1EX01BR0lDKSkKKwkJcmV0dXJuIC0xOworCisJKihhbGlhc2VkX3VpbnQzMl90Kil1dWlkID0gbWRwLT5zZXRfdXVpZDA7CisJbWVtY3B5KCZ1dWlkWzRdLCAmbWRwLT5zZXRfdXVpZDEsIDEyKTsKKwl2b2x1bWVfaWRfc2V0X3V1aWQoaWQsIHV1aWQsIFVVSURfRENFKTsKKworLy8Jc25wcmludGYoaWQtPnR5cGVfdmVyc2lvbiwgc2l6ZW9mKGlkLT50eXBlX3ZlcnNpb24pLTEsICIldS4ldS4ldSIsCisvLwkJbGUzMl90b19jcHUobWRwLT5tYWpvcl92ZXJzaW9uKSwKKy8vCQlsZTMyX3RvX2NwdShtZHAtPm1pbm9yX3ZlcnNpb24pLAorLy8JCWxlMzJfdG9fY3B1KG1kcC0+cGF0Y2hfdmVyc2lvbikpOworCisJZGJnKCJmb3VuZCByYWlkIHNpZ25hdHVyZSIpOworLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX1JBSUQpOworCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJsaW51eF9yYWlkX21lbWJlciI7KQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3ZvbHVtZV9pZC9saW51eF9zd2FwLmMgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9saW51eF9zd2FwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk0NzBkNAotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL2xpbnV4X3N3YXAuYwpAQCAtMCwwICsxLDg5IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTElOVVhTV0FQKSArPSBsaW51eF9zd2FwLm8KKworLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFNXQVAKKy8vY29uZmlnOglib29sICJsaW51eCBzd2FwIGZpbGVzeXN0ZW0iCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBWT0xVTUVJRAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRPRE8KKy8vY29uZmlnOgorCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCBzd2FwX2hlYWRlcl92MV8yIHsKKwl1aW50OF90CQlib290Yml0c1sxMDI0XTsKKwl1aW50MzJfdAl2ZXJzaW9uOworCXVpbnQzMl90CWxhc3RfcGFnZTsKKwl1aW50MzJfdAlucl9iYWRwYWdlczsKKwl1aW50OF90CQl1dWlkWzE2XTsKKwl1aW50OF90CQl2b2x1bWVfbmFtZVsxNl07Cit9IFBBQ0tFRDsKKworI2RlZmluZSBMQVJHRVNUX1BBR0VTSVpFCQkJMHg0MDAwCisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2xpbnV4X3N3YXAoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pCit7CisjZGVmaW5lIG9mZiAoKHVpbnQ2NF90KTApCisJc3RydWN0IHN3YXBfaGVhZGVyX3YxXzIgKnN3OworCWNvbnN0IHVpbnQ4X3QgKmJ1ZjsKKwl1bnNpZ25lZCBwYWdlOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYpOworCisJLyogdGhlIHN3YXAgc2lnbmF0dXJlIGlzIGF0IHRoZSBlbmQgb2YgdGhlIFBBR0VfU0laRSAqLworCWZvciAocGFnZSA9IDB4MTAwMDsgcGFnZSA8PSBMQVJHRVNUX1BBR0VTSVpFOyBwYWdlIDw8PSAxKSB7CisJCQlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgcGFnZS0xMCwgMTApOworCQkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJCXJldHVybiAtMTsKKworCQkJaWYgKG1lbWNtcChidWYsICJTV0FQLVNQQUNFIiwgMTApID09IDApIHsKKy8vCQkJCWlkLT50eXBlX3ZlcnNpb25bMF0gPSAnMSc7CisvLwkJCQlpZC0+dHlwZV92ZXJzaW9uWzFdID0gJ1wwJzsKKwkJCQlnb3RvIGZvdW5kOworCQkJfQorCisJCQlpZiAobWVtY21wKGJ1ZiwgIlNXQVBTUEFDRTIiLCAxMCkgPT0gMAorCQkJIHx8IG1lbWNtcChidWYsICJTMVNVU1BFTkQiLCA5KSA9PSAwCisJCQkgfHwgbWVtY21wKGJ1ZiwgIlMyU1VTUEVORCIsIDkpID09IDAKKwkJCSB8fCBtZW1jbXAoYnVmLCAiVUxTVVNQRU5EIiwgOSkgPT0gMAorCQkJKSB7CisJCQkJc3cgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmLCBzaXplb2Yoc3RydWN0IHN3YXBfaGVhZGVyX3YxXzIpKTsKKwkJCQlpZiAoc3cgPT0gTlVMTCkKKwkJCQkJcmV0dXJuIC0xOworLy8JCQkJaWQtPnR5cGVfdmVyc2lvblswXSA9ICcyJzsKKy8vCQkJCWlkLT50eXBlX3ZlcnNpb25bMV0gPSAnXDAnOworLy8JCQkJdm9sdW1lX2lkX3NldF9sYWJlbF9yYXcoaWQsIHN3LT52b2x1bWVfbmFtZSwgMTYpOworCQkJCXZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKGlkLCBzdy0+dm9sdW1lX25hbWUsIDE2KTsKKwkJCQl2b2x1bWVfaWRfc2V0X3V1aWQoaWQsIHN3LT51dWlkLCBVVUlEX0RDRSk7CisJCQkJZ290byBmb3VuZDsKKwkJCX0KKwl9CisJcmV0dXJuIC0xOworCitmb3VuZDoKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9PVEhFUik7CisJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gInN3YXAiOykKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvbHVrcy5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvbHVrcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYmY4NzYKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9sdWtzLmMKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFcuIE1pY2hhZWwgUGV0dWxsbyA8bWlrZUBmbHluLm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvL2tidWlsZDpsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MVUtTKSArPSBsdWtzLm8KKworLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9MVUtTCisvL2NvbmZpZzoJYm9vbCAibHVrcyBmaWxlc3lzdGVtIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVk9MVU1FSUQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUT0RPCisvL2NvbmZpZzoKKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCisjZGVmaW5lIExVS1NfTUFHSUNfTCAgICAgICAgICAgICA2CisjZGVmaW5lIFVVSURfU1RSSU5HX0wgICAgICAgICAgIDQwCisjZGVmaW5lIExVS1NfQ0lQSEVSTkFNRV9MICAgICAgIDMyCisjZGVmaW5lIExVS1NfQ0lQSEVSTU9ERV9MICAgICAgIDMyCisjZGVmaW5lIExVS1NfSEFTSFNQRUNfTCAgICAgICAgIDMyCisjZGVmaW5lIExVS1NfRElHRVNUU0laRSAgICAgICAgIDIwCisjZGVmaW5lIExVS1NfU0FMVFNJWkUgICAgICAgICAgIDMyCisjZGVmaW5lIExVS1NfTlVNS0VZUyAgICAgICAgICAgICA4CisKK3N0YXRpYyBjb25zdCB1aW50OF90IExVS1NfTUFHSUNbXSA9IHsgJ0wnLCdVJywnSycsJ1MnLCAweGJhLCAweGJlIH07CisKK3N0cnVjdCBsdWtzX3BoZHIgeworCXVpbnQ4X3QJCW1hZ2ljW0xVS1NfTUFHSUNfTF07CisJdWludDE2X3QJdmVyc2lvbjsKKwl1aW50OF90CQljaXBoZXJOYW1lW0xVS1NfQ0lQSEVSTkFNRV9MXTsKKwl1aW50OF90CQljaXBoZXJNb2RlW0xVS1NfQ0lQSEVSTU9ERV9MXTsKKwl1aW50OF90CQloYXNoU3BlY1tMVUtTX0hBU0hTUEVDX0xdOworCXVpbnQzMl90CXBheWxvYWRPZmZzZXQ7CisJdWludDMyX3QJa2V5Qnl0ZXM7CisJdWludDhfdAkJbWtEaWdlc3RbTFVLU19ESUdFU1RTSVpFXTsKKwl1aW50OF90CQlta0RpZ2VzdFNhbHRbTFVLU19TQUxUU0laRV07CisJdWludDMyX3QJbWtEaWdlc3RJdGVyYXRpb25zOworCXVpbnQ4X3QJCXV1aWRbVVVJRF9TVFJJTkdfTF07CisJc3RydWN0IHsKKwkJdWludDMyX3QJYWN0aXZlOworCQl1aW50MzJfdAlwYXNzd29yZEl0ZXJhdGlvbnM7CisJCXVpbnQ4X3QJCXBhc3N3b3JkU2FsdFtMVUtTX1NBTFRTSVpFXTsKKwkJdWludDMyX3QJa2V5TWF0ZXJpYWxPZmZzZXQ7CisJCXVpbnQzMl90CXN0cmlwZXM7CisJfSBrZXlibG9ja1tMVUtTX05VTUtFWVNdOworfTsKKworZW51bSB7CisJRVhQRUNURURfU0laRV9sdWtzX3BoZHIgPSAwCisJCSsgMSAqIExVS1NfTUFHSUNfTAorCQkrIDIKKwkJKyAxICogTFVLU19DSVBIRVJOQU1FX0wKKwkJKyAxICogTFVLU19DSVBIRVJNT0RFX0wKKwkJKyAxICogTFVLU19IQVNIU1BFQ19MCisJCSsgNAorCQkrIDQKKwkJKyAxICogTFVLU19ESUdFU1RTSVpFCisJCSsgMSAqIExVS1NfU0FMVFNJWkUKKwkJKyA0CisJCSsgMSAqIFVVSURfU1RSSU5HX0wKKwkJKyBMVUtTX05VTUtFWVMgKiAoMAorCQkgICsgNAorCQkgICsgNAorCQkgICsgMSAqIExVS1NfU0FMVFNJWkUKKwkJICArIDQKKwkJICArIDQKKwkJICApCit9OworCitzdHJ1Y3QgQlVHX2JhZF9zaXplX2x1a3NfcGhkciB7CisJY2hhciBCVUdfYmFkX3NpemVfbHVrc19waGRyWworCQlzaXplb2Yoc3RydWN0IGx1a3NfcGhkcikgPT0gRVhQRUNURURfU0laRV9sdWtzX3BoZHIgPworCQkxIDogLTFdOworfTsKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfbHVrcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLykKK3sKKyNkZWZpbmUgb2ZmICgodWludDY0X3QpMCkKKwlzdHJ1Y3QgbHVrc19waGRyICpoZWFkZXI7CisKKwloZWFkZXIgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmLCBzaXplb2YoKmhlYWRlcikpOworCWlmIChoZWFkZXIgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKG1lbWNtcChoZWFkZXItPm1hZ2ljLCBMVUtTX01BR0lDLCBMVUtTX01BR0lDX0wpKQorCQlyZXR1cm4gLTE7CisKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9DUllQVE8pOworCXZvbHVtZV9pZF9zZXRfdXVpZChpZCwgaGVhZGVyLT51dWlkLCBVVUlEX0RDRV9TVFJJTkcpOworCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJjcnlwdG9fTFVLUyI7KQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3ZvbHVtZV9pZC9uaWxmcy5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvbmlsZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2E5ZWY1Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvbmlsZnMuYwpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICogQ29weXJpZ2h0IChDKSAyMDEyIFMtRyBCZXJnaCA8c2diQHN5c3RlbWFzaXMub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX05JTEZTKSArPSBuaWxmcy5vCisKKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVk9MVU1FSURfTklMRlMKKy8vY29uZmlnOglib29sICJuaWxmcyBmaWxlc3lzdGVtIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVk9MVU1FSUQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBOSUxGUyBpcyBhIE5ldyBJbXBsZW1lbnRhdGlvbiBvZiBhIExvZy1TdHJ1Y3R1cmVkIEZpbGUgU3lzdGVtIChMRlMpCisvL2NvbmZpZzoJICB0aGF0IHN1cHBvcnRzIGNvbnRpbnVvdXMgc25hcHNob3RzLiBUaGlzIHByb3ZpZGVzIGZlYXR1cmVzIGxpa2UKKy8vY29uZmlnOgkgIHZlcnNpb25pbmcgb2YgdGhlIGVudGlyZSBmaWxlc3lzdGVtLCByZXN0b3JhdGlvbiBvZiBmaWxlcyB0aGF0CisvL2NvbmZpZzoJICB3ZXJlIGRlbGV0ZWQgYSBmZXcgbWludXRlcyBhZ28uIE5JTEZTIGtlZXBzIGNvbnNpc3RlbmN5IGxpa2UKKy8vY29uZmlnOgkgIGNvbnZlbnRpb25hbCBMRlMsIHNvIGl0IHByb3ZpZGVzIHF1aWNrIHJlY292ZXJ5IGFmdGVyIHN5c3RlbSBjcmFzaGVzLgorLy9jb25maWc6CisvL2NvbmZpZzoJICBUaGUgcG9zc2libGUgdXNlIG9mIE5JTEZTIGluY2x1ZGVzIHZlcnNpb25pbmcsIHRhbXBlciBkZXRlY3Rpb24sCisvL2NvbmZpZzoJICBTT1ggY29tcGxpYW5jZSBsb2dnaW5nLCBhbmQgc28gZm9ydGguIEl0IGNhbiBzZXJ2ZSBhcyBhbiBhbHRlcm5hdGl2ZQorLy9jb25maWc6CSAgZmlsZXN5c3RlbSBmb3IgTGludXggZGVza3RvcCBlbnZpcm9ubWVudCwgb3IgYXMgYSBiYXNpcyBvZiBhZHZhbmNlZAorLy9jb25maWc6CSAgc3RvcmFnZSBhcHBsaWFuY2VzLgorLy9jb25maWc6CisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworI2RlZmluZSBOSUxGU19VVUlEX1NJWkUgMTYKKyNkZWZpbmUgTklMRlNfTEFCRUxfU0laRSA4MAorI2RlZmluZSBOSUxGU19TQjFfT0ZGU0VUIDB4NDAwCisjZGVmaW5lIE5JTEZTX1NCMl9PRkZTRVQgMHgxMDAwCisjZGVmaW5lIE5JTEZTX01BR0lDIDB4MzQzNAorCitzdHJ1Y3QgbmlsZnMyX3N1cGVyX2Jsb2NrIHsKKy8qIDB4MDAgKi8JdWludDMyX3Qgc19yZXZfbGV2ZWw7CQkJCS8vIE1ham9yIHJldmlzaW9uIGxldmVsLgorLyogMHgwNCAqLwl1aW50MTZfdCBzX21pbm9yX3Jldl9sZXZlbDsJCQkvLyBNaW5vciByZXZpc2lvbiBsZXZlbC4KKy8qIDB4MDYgKi8JdWludDE2X3Qgc19tYWdpYzsJCQkJLy8gTWFnaWMgc2lnbmF0dXJlLgorLyogMHgwOCAqLwl1aW50MTZfdCBzX2J5dGVzOworLyogMHgwQSAqLwl1aW50MTZfdCBzX2ZsYWdzOworLyogMHgwQyAqLwl1aW50MzJfdCBzX2NyY19zZWVkOworLyogMHgxMCAqLwl1aW50MzJfdCBzX3N1bTsKKy8qIDB4MTQgKi8JdWludDMyX3Qgc19sb2dfYmxvY2tfc2l6ZTsKKy8qIDB4MTggKi8JdWludDY0X3Qgc19uc2VnbWVudHM7CisvKiAweDIwICovCXVpbnQ2NF90IHNfZGV2X3NpemU7CQkJCS8vIEJsb2NrIGRldmljZSBzaXplIGluIGJ5dGVzLgorLyogMHgyOCAqLwl1aW50NjRfdCBzX2ZpcnN0X2RhdGFfYmxvY2s7CisvKiAweDMwICovCXVpbnQzMl90IHNfYmxvY2tzX3Blcl9zZWdtZW50OworLyogMHgzNCAqLwl1aW50MzJfdCBzX3Jfc2VnbWVudHNfcGVyY2VudGFnZTsKKy8qIDB4MzggKi8JdWludDY0X3Qgc19sYXN0X2NubzsKKy8qIDB4NDAgKi8JdWludDY0X3Qgc19sYXN0X3BzZWc7CisvKiAweDQ4ICovCXVpbnQ2NF90IHNfbGFzdF9zZXE7CisvKiAweDUwICovCXVpbnQ2NF90IHNfZnJlZV9ibG9ja3NfY291bnQ7CisvKiAweDU4ICovCXVpbnQ2NF90IHNfY3RpbWU7CisvKiAweDYwICovCXVpbnQ2NF90IHNfbXRpbWU7CisvKiAweDY4ICovCXVpbnQ2NF90IHNfd3RpbWU7CisvKiAweDcwICovCXVpbnQxNl90IHNfbW50X2NvdW50OworLyogMHg3MiAqLwl1aW50MTZfdCBzX21heF9tbnRfY291bnQ7CisvKiAweDc0ICovCXVpbnQxNl90IHNfc3RhdGU7CisvKiAweDc2ICovCXVpbnQxNl90IHNfZXJyb3JzOworLyogMHg3OCAqLwl1aW50NjRfdCBzX2xhc3RjaGVjazsKKy8qIDB4ODAgKi8JdWludDMyX3Qgc19jaGVja2ludGVydmFsOworLyogMHg4NCAqLwl1aW50MzJfdCBzX2NyZWF0b3Jfb3M7CisvKiAweDg4ICovCXVpbnQxNl90IHNfZGVmX3Jlc3VpZDsKKy8qIDB4OEEgKi8JdWludDE2X3Qgc19kZWZfcmVzZ2lkOworLyogMHg4QyAqLwl1aW50MzJfdCBzX2ZpcnN0X2lubzsKKy8qIDB4OTAgKi8JdWludDE2X3Qgc19pbm9kZV9zaXplOworLyogMHg5MiAqLwl1aW50MTZfdCBzX2RhdF9lbnRyeV9zaXplOworLyogMHg5NCAqLwl1aW50MTZfdCBzX2NoZWNrcG9pbnRfc2l6ZTsKKy8qIDB4OTYgKi8JdWludDE2X3Qgc19zZWdtZW50X3VzYWdlX3NpemU7CisvKiAweDk4ICovCXVpbnQ4X3Qgc191dWlkW05JTEZTX1VVSURfU0laRV07CQkvLyAxMjgtYml0IFVVSUQgZm9yIHZvbHVtZS4KKy8qIDB4QTggKi8JdWludDhfdCBzX3ZvbHVtZV9uYW1lW05JTEZTX0xBQkVMX1NJWkVdOwkvLyBWb2x1bWUgbGFiZWwuCisvKiAweEY4ICovCS8vIC4uLgorfSBQQUNLRUQ7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX25pbGZzKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKQoreworCXN0cnVjdCBuaWxmczJfc3VwZXJfYmxvY2sgKnNiOworCisJLy8gUHJpbWFyeSBzdXBlciBibG9jaworCWRiZygibmlsZnM6IHByb2JpbmcgYXQgb2Zmc2V0IDB4JXgiLCBOSUxGU19TQjFfT0ZGU0VUKTsKKworCXNiID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIE5JTEZTX1NCMV9PRkZTRVQsIHNpemVvZigqc2IpKTsKKworCWlmIChzYiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoc2ItPnNfbWFnaWMgIT0gTklMRlNfTUFHSUMpCisJCXJldHVybiAtMTsKKworCS8vIFRoZSBzZWNvbmRhcnkgc3VwZXJibG9jayBpcyBub3QgYWx3YXlzIHVzZWQsIHNvIGlnbm9yZSBpdCBmb3Igbm93LgorCS8vIFdoZW4gdXNlZCBpdCBpcyBhdCA0SyBmcm9tIHRoZSBlbmQgb2YgdGhlIHBhcnRpdGlvbiAoc2ItPnNfZGV2X3NpemUgLSBOSUxGU19TQjJfT0ZGU0VUKS4KKworCXZvbHVtZV9pZF9zZXRfbGFiZWxfc3RyaW5nKGlkLCBzYi0+c192b2x1bWVfbmFtZSwgTklMRlNfTEFCRUxfU0laRSA8IFZPTFVNRV9JRF9MQUJFTF9TSVpFID8KKwkJCQlOSUxGU19MQUJFTF9TSVpFIDogVk9MVU1FX0lEX0xBQkVMX1NJWkUpOworCXZvbHVtZV9pZF9zZXRfdXVpZChpZCwgc2ItPnNfdXVpZCwgVVVJRF9EQ0UpOworCisJaWYgKHNiLT5zX3Jldl9sZXZlbCA9PSAyKQorCQlJRl9GRUFUVVJFX0JMS0lEX1RZUEUoaWQtPnR5cGUgPSAibmlsZnMyIik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL250ZnMuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL250ZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmY2ODdhCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvbnRmcy5jCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTlRGUykgKz0gbnRmcy5vCisKKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVk9MVU1FSURfTlRGUworLy9jb25maWc6CWJvb2wgIm50ZnMgZmlsZXN5c3RlbSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFZPTFVNRUlECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVE9ETworLy9jb25maWc6CisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworc3RydWN0IG50ZnNfc3VwZXJfYmxvY2sgeworCXVpbnQ4X3QJCWp1bXBbM107CisJdWludDhfdAkJb2VtX2lkWzhdOworCXVpbnQxNl90CWJ5dGVzX3Blcl9zZWN0b3I7CisJdWludDhfdAkJc2VjdG9yc19wZXJfY2x1c3RlcjsKKwl1aW50MTZfdAlyZXNlcnZlZF9zZWN0b3JzOworCXVpbnQ4X3QJCWZhdHM7CisJdWludDE2X3QJcm9vdF9lbnRyaWVzOworCXVpbnQxNl90CXNlY3RvcnM7CisJdWludDhfdAkJbWVkaWFfdHlwZTsKKwl1aW50MTZfdAlzZWN0b3JzX3Blcl9mYXQ7CisJdWludDE2X3QJc2VjdG9yc19wZXJfdHJhY2s7CisJdWludDE2X3QJaGVhZHM7CisJdWludDMyX3QJaGlkZGVuX3NlY3RvcnM7CisJdWludDMyX3QJbGFyZ2Vfc2VjdG9yczsKKwl1aW50MTZfdAl1bnVzZWRbMl07CisJdWludDY0X3QJbnVtYmVyX29mX3NlY3RvcnM7CisJdWludDY0X3QJbWZ0X2NsdXN0ZXJfbG9jYXRpb247CisJdWludDY0X3QJbWZ0X21pcnJvcl9jbHVzdGVyX2xvY2F0aW9uOworCWludDhfdAkJY2x1c3Rlcl9wZXJfbWZ0X3JlY29yZDsKKwl1aW50OF90CQlyZXNlcnZlZDFbM107CisJaW50OF90CQljbHVzdGVyX3Blcl9pbmRleF9yZWNvcmQ7CisJdWludDhfdAkJcmVzZXJ2ZWQyWzNdOworCXVpbnQ4X3QJCXZvbHVtZV9zZXJpYWxbOF07CisJdWludDE2X3QJY2hlY2tzdW07Cit9IFBBQ0tFRDsKKworc3RydWN0IG1hc3Rlcl9maWxlX3RhYmxlX3JlY29yZCB7CisJdWludDhfdAkJbWFnaWNbNF07CisJdWludDE2X3QJdXNhX29mczsKKwl1aW50MTZfdAl1c2FfY291bnQ7CisJdWludDY0X3QJbHNuOworCXVpbnQxNl90CXNlcXVlbmNlX251bWJlcjsKKwl1aW50MTZfdAlsaW5rX2NvdW50OworCXVpbnQxNl90CWF0dHJzX29mZnNldDsKKwl1aW50MTZfdAlmbGFnczsKKwl1aW50MzJfdAlieXRlc19pbl91c2U7CisJdWludDMyX3QJYnl0ZXNfYWxsb2NhdGVkOworfSBQQUNLRUQ7CisKK3N0cnVjdCBmaWxlX2F0dHJpYnV0ZSB7CisJdWludDMyX3QJdHlwZTsKKwl1aW50MzJfdAlsZW47CisJdWludDhfdAkJbm9uX3Jlc2lkZW50OworCXVpbnQ4X3QJCW5hbWVfbGVuOworCXVpbnQxNl90CW5hbWVfb2Zmc2V0OworCXVpbnQxNl90CWZsYWdzOworCXVpbnQxNl90CWluc3RhbmNlOworCXVpbnQzMl90CXZhbHVlX2xlbjsKKwl1aW50MTZfdAl2YWx1ZV9vZmZzZXQ7Cit9IFBBQ0tFRDsKKworc3RydWN0IHZvbHVtZV9pbmZvIHsKKwl1aW50NjRfdAlyZXNlcnZlZDsKKwl1aW50OF90CQltYWpvcl92ZXI7CisJdWludDhfdAkJbWlub3JfdmVyOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgTUZUX1JFQ09SRF9WT0xVTUUJCQkzCisjZGVmaW5lIE1GVF9SRUNPUkRfQVRUUl9WT0xVTUVfTkFNRQkJMHg2MAorI2RlZmluZSBNRlRfUkVDT1JEX0FUVFJfVk9MVU1FX0lORk8JCTB4NzAKKyNkZWZpbmUgTUZUX1JFQ09SRF9BVFRSX09CSkVDVF9JRAkJMHg0MAorI2RlZmluZSBNRlRfUkVDT1JEX0FUVFJfRU5ECQkJMHhmZmZmZmZmZnUKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfbnRmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLykKK3sKKyNkZWZpbmUgb2ZmICgodWludDY0X3QpMCkKKwl1bnNpZ25lZCBzZWN0b3Jfc2l6ZTsKKwl1bnNpZ25lZCBjbHVzdGVyX3NpemU7CisJdWludDY0X3QgbWZ0X2NsdXN0ZXI7CisJdWludDY0X3QgbWZ0X29mZjsKKwl1bnNpZ25lZCBtZnRfcmVjb3JkX3NpemU7CisJdW5zaWduZWQgYXR0cl90eXBlOworCXVuc2lnbmVkIGF0dHJfb2ZmOworCXVuc2lnbmVkIGF0dHJfbGVuOworCXVuc2lnbmVkIHZhbF9vZmY7CisJdW5zaWduZWQgdmFsX2xlbjsKKwlzdHJ1Y3QgbWFzdGVyX2ZpbGVfdGFibGVfcmVjb3JkICptZnRyOworCXN0cnVjdCBudGZzX3N1cGVyX2Jsb2NrICpuczsKKwljb25zdCB1aW50OF90ICpidWY7CisJY29uc3QgdWludDhfdCAqdmFsOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYpOworCisJbnMgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmLCAweDIwMCk7CisJaWYgKG5zID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChtZW1jbXAobnMtPm9lbV9pZCwgIk5URlMiLCA0KSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwl2b2x1bWVfaWRfc2V0X3V1aWQoaWQsIG5zLT52b2x1bWVfc2VyaWFsLCBVVUlEX05URlMpOworCisJc2VjdG9yX3NpemUgPSBsZTE2X3RvX2NwdShucy0+Ynl0ZXNfcGVyX3NlY3Rvcik7CisJY2x1c3Rlcl9zaXplID0gbnMtPnNlY3RvcnNfcGVyX2NsdXN0ZXIgKiBzZWN0b3Jfc2l6ZTsKKwltZnRfY2x1c3RlciA9IGxlNjRfdG9fY3B1KG5zLT5tZnRfY2x1c3Rlcl9sb2NhdGlvbik7CisJbWZ0X29mZiA9IG1mdF9jbHVzdGVyICogY2x1c3Rlcl9zaXplOworCisJaWYgKG5zLT5jbHVzdGVyX3Blcl9tZnRfcmVjb3JkIDwgMCkKKwkJLyogc2l6ZSA9IC1sb2cyKG1mdF9yZWNvcmRfc2l6ZSk7IG5vcm1hbGx5IDEwMjQgQnl0ZXMgKi8KKwkJbWZ0X3JlY29yZF9zaXplID0gMSA8PCAtbnMtPmNsdXN0ZXJfcGVyX21mdF9yZWNvcmQ7CisJZWxzZQorCQltZnRfcmVjb3JkX3NpemUgPSBucy0+Y2x1c3Rlcl9wZXJfbWZ0X3JlY29yZCAqIGNsdXN0ZXJfc2l6ZTsKKworCWRiZygic2VjdG9yc2l6ZSAgMHgleCIsIHNlY3Rvcl9zaXplKTsKKwlkYmcoImNsdXN0ZXJzaXplIDB4JXgiLCBjbHVzdGVyX3NpemUpOworCWRiZygibWZ0Y2x1c3RlciAgJWxsdSIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG1mdF9jbHVzdGVyKTsKKwlkYmcoIm1mdG9mZnNldCAgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgbWZ0X29mZik7CisJZGJnKCJjbHVzdGVyIHBlciBtZnRfcmVjb3JkICAlaSIsIG5zLT5jbHVzdGVyX3Blcl9tZnRfcmVjb3JkKTsKKwlkYmcoIm1mdCByZWNvcmQgc2l6ZSAgJWkiLCBtZnRfcmVjb3JkX3NpemUpOworCisJYnVmID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIG1mdF9vZmYgKyAoTUZUX1JFQ09SRF9WT0xVTUUgKiBtZnRfcmVjb3JkX3NpemUpLAorCQkJbWZ0X3JlY29yZF9zaXplKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCWdvdG8gZm91bmQ7CisKKwltZnRyID0gKHN0cnVjdCBtYXN0ZXJfZmlsZV90YWJsZV9yZWNvcmQqKSBidWY7CisKKwlkYmcoIm1mdHItPm1hZ2ljICclYyVjJWMlYyciLCBtZnRyLT5tYWdpY1swXSwgbWZ0ci0+bWFnaWNbMV0sIG1mdHItPm1hZ2ljWzJdLCBtZnRyLT5tYWdpY1szXSk7CisJaWYgKG1lbWNtcChtZnRyLT5tYWdpYywgIkZJTEUiLCA0KSAhPSAwKQorCQlnb3RvIGZvdW5kOworCisJYXR0cl9vZmYgPSBsZTE2X3RvX2NwdShtZnRyLT5hdHRyc19vZmZzZXQpOworCWRiZygiZmlsZSAkVm9sdW1lJ3MgYXR0cmlidXRlcyBhcmUgYXQgb2Zmc2V0ICVpIiwgYXR0cl9vZmYpOworCisJd2hpbGUgKDEpIHsKKwkJc3RydWN0IGZpbGVfYXR0cmlidXRlICphdHRyOworCisJCWF0dHIgPSAoc3RydWN0IGZpbGVfYXR0cmlidXRlKikgJmJ1ZlthdHRyX29mZl07CisJCWF0dHJfdHlwZSA9IGxlMzJfdG9fY3B1KGF0dHItPnR5cGUpOworCQlhdHRyX2xlbiA9IGxlMzJfdG9fY3B1KGF0dHItPmxlbik7CisJCXZhbF9vZmYgPSBsZTE2X3RvX2NwdShhdHRyLT52YWx1ZV9vZmZzZXQpOworCQl2YWxfbGVuID0gbGUzMl90b19jcHUoYXR0ci0+dmFsdWVfbGVuKTsKKwkJYXR0cl9vZmYgKz0gYXR0cl9sZW47CisKKwkJaWYgKGF0dHJfbGVuID09IDApCisJCQlicmVhazsKKworCQlpZiAoYXR0cl9vZmYgPj0gbWZ0X3JlY29yZF9zaXplKQorCQkJYnJlYWs7CisKKwkJaWYgKGF0dHJfdHlwZSA9PSBNRlRfUkVDT1JEX0FUVFJfRU5EKQorCQkJYnJlYWs7CisKKwkJZGJnKCJmb3VuZCBhdHRyaWJ1dGUgdHlwZSAweCV4LCBsZW4gJWksIGF0IG9mZnNldCAlaSIsCisJCQlhdHRyX3R5cGUsIGF0dHJfbGVuLCBhdHRyX29mZik7CisKKy8vCQlpZiAoYXR0cl90eXBlID09IE1GVF9SRUNPUkRfQVRUUl9WT0xVTUVfSU5GTykgeworLy8JCQlzdHJ1Y3Qgdm9sdW1lX2luZm8gKmluZm87CisvLwkJCWRiZygiZm91bmQgaW5mbywgbGVuICVpIiwgdmFsX2xlbik7CisvLwkJCWluZm8gPSAoc3RydWN0IHZvbHVtZV9pbmZvKikgKCgodWludDhfdCAqKSBhdHRyKSArIHZhbF9vZmYpOworLy8JCQlzbnByaW50ZihpZC0+dHlwZV92ZXJzaW9uLCBzaXplb2YoaWQtPnR5cGVfdmVyc2lvbiktMSwKKy8vCQkJCSAiJXUuJXUiLCBpbmZvLT5tYWpvcl92ZXIsIGluZm8tPm1pbm9yX3Zlcik7CisvLwkJfQorCisJCWlmIChhdHRyX3R5cGUgPT0gTUZUX1JFQ09SRF9BVFRSX1ZPTFVNRV9OQU1FKSB7CisJCQlkYmcoImZvdW5kIGxhYmVsLCBsZW4gJWkiLCB2YWxfbGVuKTsKKwkJCWlmICh2YWxfbGVuID4gVk9MVU1FX0lEX0xBQkVMX1NJWkUpCisJCQkJdmFsX2xlbiA9IFZPTFVNRV9JRF9MQUJFTF9TSVpFOworCisJCQl2YWwgPSAoKHVpbnQ4X3QgKikgYXR0cikgKyB2YWxfb2ZmOworLy8JCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgdmFsLCB2YWxfbGVuKTsKKwkJCXZvbHVtZV9pZF9zZXRfbGFiZWxfdW5pY29kZTE2KGlkLCB2YWwsIExFLCB2YWxfbGVuKTsKKwkJfQorCX0KKworIGZvdW5kOgorLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX0ZJTEVTWVNURU0pOworCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJudGZzIjspCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL29jZnMyLmMgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9vY2ZzMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNWUwYmYKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9vY2ZzMi5jCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgQW5kcmUgTWFzZWxsYSA8YW5kcmVAbWFzZWxsYS5uby1pcC5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLy9rYnVpbGQ6bGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfT0NGUzIpICs9IG9jZnMyLm8KKworLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9PQ0ZTMgorLy9jb25maWc6CWJvb2wgIm9jZnMyIGZpbGVzeXN0ZW0iCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBWT0xVTUVJRAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRPRE8KKy8vY29uZmlnOgorCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKKy8qIEFsbCB0aGVzZSB2YWx1ZXMgYXJlIHRha2VuIGZyb20gb2NmczItdG9vbHMncyBvY2ZzMl9mcy5oICovCisjZGVmaW5lIE9DRlMyX1ZPTF9VVUlEX0xFTgkJCTE2CisjZGVmaW5lIE9DRlMyX01BWF9WT0xfTEFCRUxfTEVOCQkJNjQKKyNkZWZpbmUgT0NGUzJfU1VQRVJCTE9DS19PRkZTRVQJCQkweDIwMDAKKworCisvKiBUaGlzIGlzIHRoZSBzdXBlcmJsb2NrLiBUaGUgT0NGUzIgaGVhZGVyIGZpbGVzIGhhdmUgc3RydWN0cyBpbiBzdHJ1Y3RzLgorVGhpcyBpcyBvbmUgaGFzIGJlZW4gc2ltcGxpZmllZCBzaW5jZSB3ZSBvbmx5IGNhcmUgYWJvdXQgdGhlIHN1cGVyYmxvY2suCisqLworCitzdHJ1Y3Qgb2NmczJfc3VwZXJfYmxvY2sgeworCXVpbnQ4X3QJCWlfc2lnbmF0dXJlWzhdOwkJCS8qIFNpZ25hdHVyZSBmb3IgdmFsaWRhdGlvbiAqLworCXVpbnQzMl90CWlfZ2VuZXJhdGlvbjsJCQkvKiBHZW5lcmF0aW9uIG51bWJlciAqLworCWludDE2X3QJCWlfc3ViYWxsb2Nfc2xvdDsJCQkvKiBTbG90IHN1YmFsbG9jYXRvciB0aGlzIGlub2RlIGJlbG9uZ3MgdG8gKi8KKwl1aW50MTZfdAlpX3N1YmFsbG9jX2JpdDsJCQkvKiBCaXQgb2Zmc2V0IGluIHN1YmFsbG9jYXRvciBibG9jayBncm91cCAqLworCXVpbnQzMl90CWlfcmVzZXJ2ZWQwOworCXVpbnQzMl90CWlfY2x1c3RlcnM7CQkJLyogQ2x1c3RlciBjb3VudCAqLworCXVpbnQzMl90CWlfdWlkOwkJCQkvKiBPd25lciBVSUQgKi8KKwl1aW50MzJfdAlpX2dpZDsJCQkJLyogT3duaW5nIEdJRCAqLworCXVpbnQ2NF90CWlfc2l6ZTsJCQkJLyogU2l6ZSBpbiBieXRlcyAqLworCXVpbnQxNl90CWlfbW9kZTsJCQkJLyogRmlsZSBtb2RlICovCisJdWludDE2X3QJaV9saW5rc19jb3VudDsJCQkvKiBMaW5rcyBjb3VudCAqLworCXVpbnQzMl90CWlfZmxhZ3M7CQkJCS8qIEZpbGUgZmxhZ3MgKi8KKwl1aW50NjRfdAlpX2F0aW1lOwkJCQkvKiBBY2Nlc3MgdGltZSAqLworCXVpbnQ2NF90CWlfY3RpbWU7CQkJCS8qIENyZWF0aW9uIHRpbWUgKi8KKwl1aW50NjRfdAlpX210aW1lOwkJCQkvKiBNb2RpZmljYXRpb24gdGltZSAqLworCXVpbnQ2NF90CWlfZHRpbWU7CQkJCS8qIERlbGV0aW9uIHRpbWUgKi8KKwl1aW50NjRfdAlpX2Jsa25vOwkJCQkvKiBPZmZzZXQgb24gZGlzaywgaW4gYmxvY2tzICovCisJdWludDY0X3QJaV9sYXN0X2ViX2JsazsJCQkvKiBQb2ludGVyIHRvIGxhc3QgZXh0ZW50IGJsb2NrICovCisJdWludDMyX3QJaV9mc19nZW5lcmF0aW9uOwkJCS8qIEdlbmVyYXRpb24gcGVyIGZzLWluc3RhbmNlICovCisJdWludDMyX3QJaV9hdGltZV9uc2VjOworCXVpbnQzMl90CWlfY3RpbWVfbnNlYzsKKwl1aW50MzJfdAlpX210aW1lX25zZWM7CisJdWludDY0X3QJaV9yZXNlcnZlZDFbOV07CisJdWludDY0X3QJaV9wYWQxOwkJCQkvKiBHZW5lcmljIHdheSB0byByZWZlciB0byB0aGlzIDY0Yml0IHVuaW9uICovCisJLyogTm9ybWFsbHkgdGhlcmUgaXMgYSB1bmlvbiBvZiB0aGUgZGlmZmVyZW50IGJsb2NrIHR5cGVzLCBidXQgd2Ugb25seSBjYXJlIGFib3V0IHRoZSBzdXBlcmJsb2NrLiAqLworCXVpbnQxNl90CXNfbWFqb3JfcmV2X2xldmVsOworCXVpbnQxNl90CXNfbWlub3JfcmV2X2xldmVsOworCXVpbnQxNl90CXNfbW50X2NvdW50OworCWludDE2X3QJCXNfbWF4X21udF9jb3VudDsKKwl1aW50MTZfdAlzX3N0YXRlOwkJCQkvKiBGaWxlIHN5c3RlbSBzdGF0ZSAqLworCXVpbnQxNl90CXNfZXJyb3JzOwkJCQkvKiBCZWhhdmlvdXIgd2hlbiBkZXRlY3RpbmcgZXJyb3JzICovCisJdWludDMyX3QJc19jaGVja2ludGVydmFsOwkJCS8qIE1heCB0aW1lIGJldHdlZW4gY2hlY2tzICovCisJdWludDY0X3QJc19sYXN0Y2hlY2s7CQkJLyogVGltZSBvZiBsYXN0IGNoZWNrICovCisJdWludDMyX3QJc19jcmVhdG9yX29zOwkJCS8qIE9TICovCisJdWludDMyX3QJc19mZWF0dXJlX2NvbXBhdDsJCQkvKiBDb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisJdWludDMyX3QJc19mZWF0dXJlX2luY29tcGF0OwkJLyogSW5jb21wYXRpYmxlIGZlYXR1cmUgc2V0ICovCisJdWludDMyX3QJc19mZWF0dXJlX3JvX2NvbXBhdDsJCS8qIFJlYWRvbmx5LWNvbXBhdGlibGUgZmVhdHVyZSBzZXQgKi8KKwl1aW50NjRfdAlzX3Jvb3RfYmxrbm87CQkJLyogT2Zmc2V0LCBpbiBibG9ja3MsIG9mIHJvb3QgZGlyZWN0b3J5IGRpbm9kZSAqLworCXVpbnQ2NF90CXNfc3lzdGVtX2Rpcl9ibGtubzsJCS8qIE9mZnNldCwgaW4gYmxvY2tzLCBvZiBzeXN0ZW0gZGlyZWN0b3J5IGRpbm9kZSAqLworCXVpbnQzMl90CXNfYmxvY2tzaXplX2JpdHM7CQkJLyogQmxvY2tzaXplIGZvciB0aGlzIGZzICovCisJdWludDMyX3QJc19jbHVzdGVyc2l6ZV9iaXRzOwkJLyogQ2x1c3RlcnNpemUgZm9yIHRoaXMgZnMgKi8KKwl1aW50MTZfdAlzX21heF9zbG90czsJCQkvKiBNYXggbnVtYmVyIG9mIHNpbXVsdGFuZW91cyBtb3VudHMgYmVmb3JlIHR1bmVmcyByZXF1aXJlZCAqLworCXVpbnQxNl90CXNfcmVzZXJ2ZWQxOworCXVpbnQzMl90CXNfcmVzZXJ2ZWQyOworCXVpbnQ2NF90CXNfZmlyc3RfY2x1c3Rlcl9ncm91cDsJCS8qIEJsb2NrIG9mZnNldCBvZiAxc3QgY2x1c3RlciBncm91cCBoZWFkZXIgKi8KKwl1aW50OF90CQlzX2xhYmVsW09DRlMyX01BWF9WT0xfTEFCRUxfTEVOXTsJLyogTGFiZWwgZm9yIG1vdW50aW5nLCBldGMuICovCisJdWludDhfdAkJc191dWlkW09DRlMyX1ZPTF9VVUlEX0xFTl07CS8qIDEyOC1iaXQgdXVpZCAqLworfSBQQUNLRUQ7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX29jZnMyKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKQoreworI2RlZmluZSBvZmYgKCh1aW50NjRfdCkwKQorCXN0cnVjdCBvY2ZzMl9zdXBlcl9ibG9jayAqb3M7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwlvcyA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBPQ0ZTMl9TVVBFUkJMT0NLX09GRlNFVCwgMHgyMDApOworCWlmIChvcyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobWVtY21wKG9zLT5pX3NpZ25hdHVyZSwgIk9DRlNWMiIsIDYpICE9IDApIHsKKwkJcmV0dXJuIC0xOworCX0KKworLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX0ZJTEVTWVNURU0pOworLy8Jdm9sdW1lX2lkX3NldF9sYWJlbF9yYXcoaWQsIG9zLT5zX2xhYmVsLCBPQ0ZTMl9NQVhfVk9MX0xBQkVMX0xFTiA8IFZPTFVNRV9JRF9MQUJFTF9TSVpFID8KKy8vCQkJCQlPQ0ZTMl9NQVhfVk9MX0xBQkVMX0xFTiA6IFZPTFVNRV9JRF9MQUJFTF9TSVpFKTsKKwl2b2x1bWVfaWRfc2V0X2xhYmVsX3N0cmluZyhpZCwgb3MtPnNfbGFiZWwsIE9DRlMyX01BWF9WT0xfTEFCRUxfTEVOIDwgVk9MVU1FX0lEX0xBQkVMX1NJWkUgPworCQkJCQlPQ0ZTMl9NQVhfVk9MX0xBQkVMX0xFTiA6IFZPTFVNRV9JRF9MQUJFTF9TSVpFKTsKKwl2b2x1bWVfaWRfc2V0X3V1aWQoaWQsIG9zLT5zX3V1aWQsIFVVSURfRENFKTsKKwlJRl9GRUFUVVJFX0JMS0lEX1RZUEUoaWQtPnR5cGUgPSAib2NmczIiOykKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL3JlaXNlcmZzLmMgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9yZWlzZXJmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OTc5ZmIKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9yZWlzZXJmcy5jCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgVG9iaWFzIEtsYXVzZXIgPHRrbGF1c2VyQGFjY2Vzcy51bml6aC5jaD4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvL2tidWlsZDpsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9SRUlTRVJGUykgKz0gcmVpc2VyZnMubworCisvL2NvbmZpZzoKKy8vY29uZmlnOmNvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX1JFSVNFUkZTCisvL2NvbmZpZzoJYm9vbCAiUmVpc2VyIGZpbGVzeXN0ZW0iCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBWT0xVTUVJRAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRPRE8KKy8vY29uZmlnOgorCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCByZWlzZXJmc19zdXBlcl9ibG9jayB7CisJdWludDMyX3QJYmxvY2tzX2NvdW50OworCXVpbnQzMl90CWZyZWVfYmxvY2tzOworCXVpbnQzMl90CXJvb3RfYmxvY2s7CisJdWludDMyX3QJam91cm5hbF9ibG9jazsKKwl1aW50MzJfdAlqb3VybmFsX2RldjsKKwl1aW50MzJfdAlvcmlnX2pvdXJuYWxfc2l6ZTsKKwl1aW50MzJfdAlkdW1teTJbNV07CisJdWludDE2X3QJYmxvY2tzaXplOworCXVpbnQxNl90CWR1bW15M1szXTsKKwl1aW50OF90CQltYWdpY1sxMl07CisJdWludDMyX3QJZHVtbXk0WzVdOworCXVpbnQ4X3QJCXV1aWRbMTZdOworCXVpbnQ4X3QJCWxhYmVsWzE2XTsKK30gUEFDS0VEOworCitzdHJ1Y3QgcmVpc2VyNF9zdXBlcl9ibG9jayB7CisJdWludDhfdAkJbWFnaWNbMTZdOworCXVpbnQxNl90CWR1bW15WzJdOworCXVpbnQ4X3QJCXV1aWRbMTZdOworCXVpbnQ4X3QJCWxhYmVsWzE2XTsKKwl1aW50NjRfdAlkdW1teTI7Cit9IFBBQ0tFRDsKKworI2RlZmluZSBSRUlTRVJGUzFfU1VQRVJCTE9DS19PRkZTRVQJCTB4MjAwMAorI2RlZmluZSBSRUlTRVJGU19TVVBFUkJMT0NLX09GRlNFVAkJMHgxMDAwMAorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9yZWlzZXJmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLykKK3sKKyNkZWZpbmUgb2ZmICgodWludDY0X3QpMCkKKwlzdHJ1Y3QgcmVpc2VyZnNfc3VwZXJfYmxvY2sgKnJzOworCXN0cnVjdCByZWlzZXI0X3N1cGVyX2Jsb2NrICpyczQ7CisKKwlkYmcoInJlaXNlcmZzOiBwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYpOworCisJcnMgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgUkVJU0VSRlNfU1VQRVJCTE9DS19PRkZTRVQsIDB4MjAwKTsKKwlpZiAocnMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKG1lbWNtcChycy0+bWFnaWMsICJSZUlzRXJGcyIsIDgpID09IDApIHsKKwkJZGJnKCJyZWlzZXJmczogUmVJc0VyRnMsIG5vIGxhYmVsIik7CisvLwkJc3RyY3B5KGlkLT50eXBlX3ZlcnNpb24sICIzLjUiKTsKKwkJZ290byBmb3VuZDsKKwl9CisJaWYgKG1lbWNtcChycy0+bWFnaWMsICJSZUlzRXIyRnMiLCA5KSA9PSAwKSB7CisJCWRiZygicmVpc2VyZnM6IFJlSXNFcjJGcyIpOworLy8JCXN0cmNweShpZC0+dHlwZV92ZXJzaW9uLCAiMy42Iik7CisJCWdvdG8gZm91bmRfbGFiZWw7CisJfQorCWlmIChtZW1jbXAocnMtPm1hZ2ljLCAiUmVJc0VyM0ZzIiwgOSkgPT0gMCkgeworCQlkYmcoInJlaXNlcmZzOiBSZUlzRXIzRnMiKTsKKy8vCQlzdHJjcHkoaWQtPnR5cGVfdmVyc2lvbiwgIkpSIik7CisJCWdvdG8gZm91bmRfbGFiZWw7CisJfQorCisJcnM0ID0gKHN0cnVjdCByZWlzZXI0X3N1cGVyX2Jsb2NrICopIHJzOworCWlmIChtZW1jbXAocnM0LT5tYWdpYywgIlJlSXNFcjQiLCA3KSA9PSAwKSB7CisvLwkJc3RyY3B5KGlkLT50eXBlX3ZlcnNpb24sICI0Iik7CisvLwkJdm9sdW1lX2lkX3NldF9sYWJlbF9yYXcoaWQsIHJzNC0+bGFiZWwsIDE2KTsKKwkJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIHJzNC0+bGFiZWwsIDE2KTsKKwkJdm9sdW1lX2lkX3NldF91dWlkKGlkLCByczQtPnV1aWQsIFVVSURfRENFKTsKKwkJZGJnKCJyZWlzZXJmczogUmVJc0VyNCwgbGFiZWwgJyVzJyB1dWlkICclcyciLCBpZC0+bGFiZWwsIGlkLT51dWlkKTsKKwkJZ290byBmb3VuZDsKKwl9CisKKwlycyA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBSRUlTRVJGUzFfU1VQRVJCTE9DS19PRkZTRVQsIDB4MjAwKTsKKwlpZiAocnMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKG1lbWNtcChycy0+bWFnaWMsICJSZUlzRXJGcyIsIDgpID09IDApIHsKKwkJZGJnKCJyZWlzZXJmczogUmVJc0VyRnMsIG5vIGxhYmVsIik7CisvLwkJc3RyY3B5KGlkLT50eXBlX3ZlcnNpb24sICIzLjUiKTsKKwkJZ290byBmb3VuZDsKKwl9CisKKwlkYmcoInJlaXNlcmZzOiBubyBzaWduYXR1cmUgZm91bmQiKTsKKwlyZXR1cm4gLTE7CisKKyBmb3VuZF9sYWJlbDoKKy8vCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCBycy0+bGFiZWwsIDE2KTsKKwl2b2x1bWVfaWRfc2V0X2xhYmVsX3N0cmluZyhpZCwgcnMtPmxhYmVsLCAxNik7CisJdm9sdW1lX2lkX3NldF91dWlkKGlkLCBycy0+dXVpZCwgVVVJRF9EQ0UpOworCWRiZygicmVpc2VyZnM6IGxhYmVsICclcycgdXVpZCAnJXMnIiwgaWQtPmxhYmVsLCBpZC0+dXVpZCk7CisKKyBmb3VuZDoKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9GSUxFU1lTVEVNKTsKKwlJRl9GRUFUVVJFX0JMS0lEX1RZUEUoaWQtPnR5cGUgPSAicmVpc2VyZnMiOykKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvcm9tZnMuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3JvbWZzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDc1NGZkYgotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3JvbWZzLmMKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1JPTUZTKSArPSByb21mcy5vCisKKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVk9MVU1FSURfUk9NRlMKKy8vY29uZmlnOglib29sICJyb21mcyBmaWxlc3lzdGVtIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVk9MVU1FSUQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUT0RPCisvL2NvbmZpZzoKKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdHJ1Y3Qgcm9tZnNfc3VwZXIgeworCXVpbnQ4X3QgbWFnaWNbOF07CisJdWludDMyX3Qgc2l6ZTsKKwl1aW50MzJfdCBjaGVja3N1bTsKKwl1aW50OF90IG5hbWVbXTsKK30gUEFDS0VEOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9yb21mcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLykKK3sKKyNkZWZpbmUgb2ZmICgodWludDY0X3QpMCkKKwlzdHJ1Y3Qgcm9tZnNfc3VwZXIgKnJmczsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCXJmcyA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYsIDB4MjAwKTsKKwlpZiAocmZzID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChtZW1jbXAocmZzLT5tYWdpYywgIi1yb20xZnMtIiwgNCkgPT0gMCkgeworCQlzaXplX3QgbGVuID0gc3RybGVuKChjaGFyICopcmZzLT5uYW1lKTsKKworCQlpZiAobGVuKSB7CisvLwkJCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCByZnMtPm5hbWUsIGxlbik7CisJCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3N0cmluZyhpZCwgcmZzLT5uYW1lLCBsZW4pOworCQl9CisKKy8vCQl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfRklMRVNZU1RFTSk7CisJCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJyb21mcyI7KQorCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3ZvbHVtZV9pZC9zcXVhc2hmcy5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvc3F1YXNoZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzliNmNjCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvc3F1YXNoZnMuYwpAQCAtMCwwICsxLDYxIEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBTLUcgQmVyZ2ggPHNnYkBzeXN0ZW1hc2lzLm9yZz4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciBHUEx2Miwgc2VlIGZpbGUgTElDRU5TRSBpbiB0aGlzIHNvdXJjZSB0cmVlLgorICovCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1NRVUFTSEZTKSArPSBzcXVhc2hmcy5vCisKKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVk9MVU1FSURfU1FVQVNIRlMKKy8vY29uZmlnOglib29sICJTcXVhc2hGUyBmaWxlc3lzdGVtIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVk9MVU1FSUQgJiYgRkVBVFVSRV9CTEtJRF9UWVBFCisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgU3F1YXNoZnMgaXMgYSBjb21wcmVzc2VkIHJlYWQtb25seSBmaWxlc3lzdGVtIGZvciBMaW51eC4gU3F1YXNoZnMgaXMKKy8vY29uZmlnOgkgIGludGVuZGVkIGZvciBnZW5lcmFsIHJlYWQtb25seSBmaWxlc3lzdGVtIHVzZSBhbmQgaW4gY29uc3RyYWluZWQgYmxvY2sKKy8vY29uZmlnOgkgIGRldmljZS9tZW1vcnkgc3lzdGVtcyAoZS5nLiBlbWJlZGRlZCBzeXN0ZW1zKSB3aGVyZSBsb3cgb3ZlcmhlYWQgaXMKKy8vY29uZmlnOgkgIG5lZWRlZC4KKy8vY29uZmlnOgorCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCBzcXVhc2hmc19zdXBlcmJsb2NrIHsKKwl1aW50MzJfdAltYWdpYzsKKy8qCisJdWludDMyX3QJZHVtbXlbNl07CisJdWludDE2X3QgICAgICAgIG1ham9yOworCXVpbnQxNl90ICAgICAgICBtaW5vcjsKKyovCit9IFBBQ0tFRDsKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfc3F1YXNoZnMoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pCit7CisjZGVmaW5lIG9mZiAoKHVpbnQ2NF90KTApCisJc3RydWN0IHNxdWFzaGZzX3N1cGVyYmxvY2sgKnNiOworCisJZGJnKCJTcXVhc2hGUzogcHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKwlzYiA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYsIDB4MjAwKTsKKwlpZiAoIXNiKQorCQlyZXR1cm4gLTE7CisKKwkvLyBPbGQgU3F1YXNoRlMgKHByZSA0LjApIGNhbiBiZSBib3RoIGJpZyBhbmQgbGl0dGxlIGVuZGlhbiwgc28gdGVzdCBmb3IgYm90aC4KKwkvLyBMaWtld2lzZSwgaXQgaXMgY29tbW9ubHkgdXNlZCBpbiBmaXJ3bWFyZSB3aXRoIHNvbWUgbm9uLXN0YW5kYXJkIHNpZ25hdHVyZXMuCisjZGVmaW5lIHBhY2soYSxiLGMsZCkgKCAodWludDMyX3QpKChhICogMjU2ICsgYikgKiAyNTYgKyBjKSAqIDI1NiArIGQgKQorI2RlZmluZSBTSUcxIHBhY2soJ3MnLCdxJywncycsJ2gnKQorI2RlZmluZSBTSUcyIHBhY2soJ2gnLCdzJywncScsJ3MnKQorI2RlZmluZSBTSUczIHBhY2soJ3MnLCdoJywncycsJ3EnKQorI2RlZmluZSBTSUc0IHBhY2soJ3EnLCdzJywnaCcsJ3MnKQorCWlmIChzYi0+bWFnaWMgPT0gU0lHMQorCSB8fCBzYi0+bWFnaWMgPT0gU0lHMgorCSB8fCBzYi0+bWFnaWMgPT0gU0lHMworCSB8fCBzYi0+bWFnaWMgPT0gU0lHNAorCSkgeworCQlJRl9GRUFUVVJFX0JMS0lEX1RZUEUoaWQtPnR5cGUgPSAic3F1YXNoZnMiOykKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC0xOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvc3lzdi5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvc3lzdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNGI1MzYKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC9zeXN2LmMKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvL2tidWlsZDpsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9TWVNWKSArPSBzeXN2Lm8KKworLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9TWVNWCisvL2NvbmZpZzoJYm9vbCAic3lzdiBmaWxlc3lzdGVtIgorLy9jb25maWc6CWRlZmF1bHQgeQorLy9jb25maWc6CWRlcGVuZHMgb24gVk9MVU1FSUQKKy8vY29uZmlnOgloZWxwCisvL2NvbmZpZzoJICBUT0RPCisvL2NvbmZpZzoKKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCisjZGVmaW5lIFNZU1ZfTklDSU5PRAkJCTEwMAorI2RlZmluZSBTWVNWX05JQ0ZSRUUJCQk1MAorCitzdHJ1Y3Qgc3lzdl9zdXBlciB7CisJdWludDE2X3QJc19pc2l6ZTsKKwl1aW50MTZfdAlzX3BhZDA7CisJdWludDMyX3QJc19mc2l6ZTsKKwl1aW50MTZfdAlzX25mcmVlOworCXVpbnQxNl90CXNfcGFkMTsKKwl1aW50MzJfdAlzX2ZyZWVbU1lTVl9OSUNGUkVFXTsKKwl1aW50MTZfdAlzX25pbm9kZTsKKwl1aW50MTZfdAlzX3BhZDI7CisJdWludDE2X3QJc19pbm9kZVtTWVNWX05JQ0lOT0RdOworCXVpbnQ4X3QJCXNfZmxvY2s7CisJdWludDhfdAkJc19pbG9jazsKKwl1aW50OF90CQlzX2Ztb2Q7CisJdWludDhfdAkJc19yb25seTsKKwl1aW50MzJfdAlzX3RpbWU7CisJdWludDE2X3QJc19kaW5mb1s0XTsKKwl1aW50MzJfdAlzX3RmcmVlOworCXVpbnQxNl90CXNfdGlub2RlOworCXVpbnQxNl90CXNfcGFkMzsKKwl1aW50OF90CQlzX2ZuYW1lWzZdOworCXVpbnQ4X3QJCXNfZnBhY2tbNl07CisJdWludDMyX3QJc19maWxsWzEyXTsKKwl1aW50MzJfdAlzX3N0YXRlOworCXVpbnQzMl90CXNfbWFnaWM7CisJdWludDMyX3QJc190eXBlOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgWEVOSVhfTklDSU5PRAkJCQkxMDAKKyNkZWZpbmUgWEVOSVhfTklDRlJFRQkJCQkxMDAKKworc3RydWN0IHhlbml4X3N1cGVyIHsKKwl1aW50MTZfdAlzX2lzaXplOworCXVpbnQzMl90CXNfZnNpemU7CisJdWludDE2X3QJc19uZnJlZTsKKwl1aW50MzJfdAlzX2ZyZWVbWEVOSVhfTklDRlJFRV07CisJdWludDE2X3QJc19uaW5vZGU7CisJdWludDE2X3QJc19pbm9kZVtYRU5JWF9OSUNJTk9EXTsKKwl1aW50OF90CQlzX2Zsb2NrOworCXVpbnQ4X3QJCXNfaWxvY2s7CisJdWludDhfdAkJc19mbW9kOworCXVpbnQ4X3QJCXNfcm9ubHk7CisJdWludDMyX3QJc190aW1lOworCXVpbnQzMl90CXNfdGZyZWU7CisJdWludDE2X3QJc190aW5vZGU7CisJdWludDE2X3QJc19kaW5mb1s0XTsKKwl1aW50OF90CQlzX2ZuYW1lWzZdOworCXVpbnQ4X3QJCXNfZnBhY2tbNl07CisJdWludDhfdAkJc19jbGVhbjsKKwl1aW50OF90CQlzX2ZpbGxbMzcxXTsKKwl1aW50MzJfdAlzX21hZ2ljOworCXVpbnQzMl90CXNfdHlwZTsKK30gUEFDS0VEOworCisjZGVmaW5lIFNZU1ZfU1VQRVJCTE9DS19CTE9DSwkJCTB4MDEKKyNkZWZpbmUgU1lTVl9NQUdJQwkJCQkweGZkMTg3ZTIwCisjZGVmaW5lIFhFTklYX1NVUEVSQkxPQ0tfQkxPQ0sJCQkweDE4CisjZGVmaW5lIFhFTklYX01BR0lDCQkJCTB4MmI1NTQ0CisjZGVmaW5lIFNZU1ZfTUFYX0JMT0NLU0laRQkJCTB4ODAwCisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX3N5c3Yoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pCit7CisjZGVmaW5lIG9mZiAoKHVpbnQ2NF90KTApCisJc3RydWN0IHN5c3Zfc3VwZXIgKnZzOworCXN0cnVjdCB4ZW5peF9zdXBlciAqeHM7CisJdW5zaWduZWQgYm9mZjsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCWZvciAoYm9mZiA9IDB4MjAwOyBib2ZmIDw9IFNZU1ZfTUFYX0JMT0NLU0laRTsgYm9mZiA8PD0gMSkgeworCQl2cyA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyAoYm9mZiAqIFNZU1ZfU1VQRVJCTE9DS19CTE9DSyksIDB4MjAwKTsKKwkJaWYgKHZzID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisKKwkJaWYgKHZzLT5zX21hZ2ljID09IGNwdV90b19sZTMyKFNZU1ZfTUFHSUMpIHx8IHZzLT5zX21hZ2ljID09IGNwdV90b19iZTMyKFNZU1ZfTUFHSUMpKSB7CisvLwkJCXZvbHVtZV9pZF9zZXRfbGFiZWxfcmF3KGlkLCB2cy0+c19mbmFtZSwgNik7CisJCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3N0cmluZyhpZCwgdnMtPnNfZm5hbWUsIDYpOworCQkJSUZfRkVBVFVSRV9CTEtJRF9UWVBFKGlkLT50eXBlID0gInN5c3YiKTsKKwkJCWdvdG8gZm91bmQ7CisJCX0KKwl9CisKKwlmb3IgKGJvZmYgPSAweDIwMDsgYm9mZiA8PSBTWVNWX01BWF9CTE9DS1NJWkU7IGJvZmYgPDw9IDEpIHsKKwkJeHMgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgKGJvZmYgKyBYRU5JWF9TVVBFUkJMT0NLX0JMT0NLKSwgMHgyMDApOworCQlpZiAoeHMgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKworCQlpZiAoeHMtPnNfbWFnaWMgPT0gY3B1X3RvX2xlMzIoWEVOSVhfTUFHSUMpIHx8IHhzLT5zX21hZ2ljID09IGNwdV90b19iZTMyKFhFTklYX01BR0lDKSkgeworLy8JCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgeHMtPnNfZm5hbWUsIDYpOworCQkJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIHhzLT5zX2ZuYW1lLCA2KTsKKwkJCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJ4ZW5peCI7KQorCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKworCXJldHVybiAtMTsKKworIGZvdW5kOgorLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX0ZJTEVTWVNURU0pOworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvdWRmLmMgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC91ZGYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjE0NTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdWRmLmMKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvL2tidWlsZDpsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9VREYpICs9IHVkZi5vCisKKy8vY29uZmlnOgorLy9jb25maWc6Y29uZmlnIEZFQVRVUkVfVk9MVU1FSURfVURGCisvL2NvbmZpZzoJYm9vbCAidWRmIGZpbGVzeXN0ZW0iCisvL2NvbmZpZzoJZGVmYXVsdCB5CisvL2NvbmZpZzoJZGVwZW5kcyBvbiBWT0xVTUVJRAorLy9jb25maWc6CWhlbHAKKy8vY29uZmlnOgkgIFRPRE8KKy8vY29uZmlnOgorCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCB2b2x1bWVfZGVzY3JpcHRvciB7CisJc3RydWN0IGRlc2NyaXB0b3JfdGFnIHsKKwkJdWludDE2X3QJaWQ7CisJCXVpbnQxNl90CXZlcnNpb247CisJCXVpbnQ4X3QJCWNoZWNrc3VtOworCQl1aW50OF90CQlyZXNlcnZlZDsKKwkJdWludDE2X3QJc2VyaWFsOworCQl1aW50MTZfdAljcmM7CisJCXVpbnQxNl90CWNyY19sZW47CisJCXVpbnQzMl90CWxvY2F0aW9uOworCX0gUEFDS0VEIHRhZzsKKwl1bmlvbiB7CisJCXN0cnVjdCBhbmNob3JfZGVzY3JpcHRvciB7CisJCQl1aW50MzJfdAlsZW5ndGg7CisJCQl1aW50MzJfdAlsb2NhdGlvbjsKKwkJfSBQQUNLRUQgYW5jaG9yOworCQlzdHJ1Y3QgcHJpbWFyeV9kZXNjcmlwdG9yIHsKKwkJCXVpbnQzMl90CXNlcV9udW07CisJCQl1aW50MzJfdAlkZXNjX251bTsKKwkJCXN0cnVjdCBkc3RyaW5nIHsKKwkJCQl1aW50OF90CWNsZW47CisJCQkJdWludDhfdAljWzMxXTsKKwkJCX0gUEFDS0VEIGlkZW50OworCQl9IFBBQ0tFRCBwcmltYXJ5OworCX0gUEFDS0VEIHR5cGU7Cit9IFBBQ0tFRDsKKworc3RydWN0IHZvbHVtZV9zdHJ1Y3R1cmVfZGVzY3JpcHRvciB7CisJdWludDhfdAkJdHlwZTsKKwl1aW50OF90CQlpZFs1XTsKKwl1aW50OF90CQl2ZXJzaW9uOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgVURGX1ZTRF9PRkZTRVQJCQkweDgwMDAKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfdWRmKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKQoreworI2RlZmluZSBvZmYgKCh1aW50NjRfdCkwKQorCXN0cnVjdCB2b2x1bWVfZGVzY3JpcHRvciAqdmQ7CisJc3RydWN0IHZvbHVtZV9zdHJ1Y3R1cmVfZGVzY3JpcHRvciAqdnNkOworCXVuc2lnbmVkIGJzOworCXVuc2lnbmVkIGI7CisJdW5zaWduZWQgdHlwZTsKKwl1bnNpZ25lZCBjb3VudDsKKwl1bnNpZ25lZCBsb2M7CisJdW5zaWduZWQgY2xlbjsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCXZzZCA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBVREZfVlNEX09GRlNFVCwgMHgyMDApOworCWlmICh2c2QgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKG1lbWNtcCh2c2QtPmlkLCAiTlNSMDIiLCA1KSA9PSAwKQorCQlnb3RvIGJsb2Nrc2l6ZTsKKwlpZiAobWVtY21wKHZzZC0+aWQsICJOU1IwMyIsIDUpID09IDApCisJCWdvdG8gYmxvY2tzaXplOworCWlmIChtZW1jbXAodnNkLT5pZCwgIkJFQTAxIiwgNSkgPT0gMCkKKwkJZ290byBibG9ja3NpemU7CisJaWYgKG1lbWNtcCh2c2QtPmlkLCAiQk9PVDIiLCA1KSA9PSAwKQorCQlnb3RvIGJsb2Nrc2l6ZTsKKwlpZiAobWVtY21wKHZzZC0+aWQsICJDRDAwMSIsIDUpID09IDApCisJCWdvdG8gYmxvY2tzaXplOworCWlmIChtZW1jbXAodnNkLT5pZCwgIkNEVzAyIiwgNSkgPT0gMCkKKwkJZ290byBibG9ja3NpemU7CisJaWYgKG1lbWNtcCh2c2QtPmlkLCAiVEVBMDMiLCA1KSA9PSAwKQorCQlnb3RvIGJsb2Nrc2l6ZTsKKwlyZXR1cm4gLTE7CisKK2Jsb2Nrc2l6ZToKKwkvKiBzZWFyY2ggdGhlIG5leHQgVlNEIHRvIGdldCB0aGUgbG9naWNhbCBibG9jayBzaXplIG9mIHRoZSB2b2x1bWUgKi8KKwlmb3IgKGJzID0gMHg4MDA7IGJzIDwgMHg4MDAwOyBicyArPSAweDgwMCkgeworCQl2c2QgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgVURGX1ZTRF9PRkZTRVQgKyBicywgMHg4MDApOworCQlpZiAodnNkID09IE5VTEwpCisJCQlyZXR1cm4gLTE7CisJCWRiZygidGVzdCBmb3IgYmxvY2tzaXplOiAweCV4IiwgYnMpOworCQlpZiAodnNkLT5pZFswXSAhPSAnXDAnKQorCQkJZ290byBuc3I7CisJfQorCXJldHVybiAtMTsKKworbnNyOgorCS8qIHNlYXJjaCB0aGUgbGlzdCBvZiBWU0RzIGZvciBhIE5TUiBkZXNjcmlwdG9yICovCisJZm9yIChiID0gMDsgYiA8IDY0OyBiKyspIHsKKwkJdnNkID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIFVERl9WU0RfT0ZGU0VUICsgKGIgKiBicyksIDB4ODAwKTsKKwkJaWYgKHZzZCA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCisJCWRiZygidnNkOiAlYyVjJWMlYyVjIiwKKwkJCXZzZC0+aWRbMF0sIHZzZC0+aWRbMV0sIHZzZC0+aWRbMl0sIHZzZC0+aWRbM10sIHZzZC0+aWRbNF0pOworCisJCWlmICh2c2QtPmlkWzBdID09ICdcMCcpCisJCQlyZXR1cm4gLTE7CisJCWlmIChtZW1jbXAodnNkLT5pZCwgIk5TUjAyIiwgNSkgPT0gMCkKKwkJCWdvdG8gYW5jaG9yOworCQlpZiAobWVtY21wKHZzZC0+aWQsICJOU1IwMyIsIDUpID09IDApCisJCQlnb3RvIGFuY2hvcjsKKwl9CisJcmV0dXJuIC0xOworCithbmNob3I6CisJLyogcmVhZCBhbmNob3Igdm9sdW1lIGRlc2NyaXB0b3IgKi8KKwl2ZCA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyAoMjU2ICogYnMpLCAweDIwMCk7CisJaWYgKHZkID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXR5cGUgPSBsZTE2X3RvX2NwdSh2ZC0+dGFnLmlkKTsKKwlpZiAodHlwZSAhPSAyKSAvKiBUQUdfSURfQVZEUCAqLworCQlnb3RvIGZvdW5kOworCisJLyogZ2V0IGRlc3JpcHRvciBsaXN0IGFkZHJlc3MgYW5kIGJsb2NrIGNvdW50ICovCisJY291bnQgPSBsZTMyX3RvX2NwdSh2ZC0+dHlwZS5hbmNob3IubGVuZ3RoKSAvIGJzOworCWxvYyA9IGxlMzJfdG9fY3B1KHZkLT50eXBlLmFuY2hvci5sb2NhdGlvbik7CisJZGJnKCIweCV4IGRlc2NyaXB0b3JzIHN0YXJ0aW5nIGF0IGxvZ2ljYWwgc2Vjb3IgMHgleCIsIGNvdW50LCBsb2MpOworCisJLyogcGljayB0aGUgcHJpbWFyeSBkZXNjcmlwdG9yIGZyb20gdGhlIGxpc3QgKi8KKwlmb3IgKGIgPSAwOyBiIDwgY291bnQ7IGIrKykgeworCQl2ZCA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyAoKGxvYyArIGIpICogYnMpLCAweDIwMCk7CisJCWlmICh2ZCA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCisJCXR5cGUgPSBsZTE2X3RvX2NwdSh2ZC0+dGFnLmlkKTsKKwkJZGJnKCJkZXNjcmlwdG9yIHR5cGUgJWkiLCB0eXBlKTsKKworCQkvKiBjaGVjayB2YWxpZGl0eSAqLworCQlpZiAodHlwZSA9PSAwKQorCQkJZ290byBmb3VuZDsKKwkJaWYgKGxlMzJfdG9fY3B1KHZkLT50YWcubG9jYXRpb24pICE9IGxvYyArIGIpCisJCQlnb3RvIGZvdW5kOworCisJCWlmICh0eXBlID09IDEpIC8qIFRBR19JRF9QVkQgKi8KKwkJCWdvdG8gcHZkOworCX0KKwlnb3RvIGZvdW5kOworCisgcHZkOgorLy8Jdm9sdW1lX2lkX3NldF9sYWJlbF9yYXcoaWQsICYodmQtPnR5cGUucHJpbWFyeS5pZGVudC5jbGVuKSwgMzIpOworCisJY2xlbiA9IHZkLT50eXBlLnByaW1hcnkuaWRlbnQuY2xlbjsKKwlkYmcoImxhYmVsIHN0cmluZyBjaGFyc2l6ZT0laSBiaXQiLCBjbGVuKTsKKwlpZiAoY2xlbiA9PSA4KQorCQl2b2x1bWVfaWRfc2V0X2xhYmVsX3N0cmluZyhpZCwgdmQtPnR5cGUucHJpbWFyeS5pZGVudC5jLCAzMSk7CisJZWxzZSBpZiAoY2xlbiA9PSAxNikKKwkJdm9sdW1lX2lkX3NldF9sYWJlbF91bmljb2RlMTYoaWQsIHZkLT50eXBlLnByaW1hcnkuaWRlbnQuYywgQkUsIDMxKTsKKworIGZvdW5kOgorLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX0ZJTEVTWVNURU0pOworCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJ1ZGYiOykKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9oaWdocG9pbnQuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9oaWdocG9pbnQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjMxYTFkCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX2hpZ2hwb2ludC5jCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA0IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvL2tidWlsZDojIyMgbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSElHSFBPSU5UUkFJRCkgKz0gaGlnaHBvaW50Lm8KKworLy9jb25maWc6CisvL2NvbmZpZzojIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfSElHSFBPSU5UUkFJRAorLy9jb25maWc6IyMjCWJvb2wgImhpZ2hwb2ludCByYWlkIgorLy9jb25maWc6IyMjCWRlZmF1bHQgeQorLy9jb25maWc6IyMjCWRlcGVuZHMgb24gVk9MVU1FSUQKKy8vY29uZmlnOiMjIwloZWxwCisvL2NvbmZpZzojIyMJICBUT0RPCisvL2NvbmZpZzoKKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdHJ1Y3QgaHB0Mzd4X21ldGEgeworCXVpbnQ4X3QJCWZpbGxlcjFbMzJdOworCXVpbnQzMl90CW1hZ2ljOworfSBQQUNLRUQ7CisKK3N0cnVjdCBocHQ0NXhfbWV0YSB7CisJdWludDMyX3QJbWFnaWM7Cit9IFBBQ0tFRDsKKworI2RlZmluZSBIUFQzN1hfQ09ORklHX09GRgkJMHgxMjAwCisjZGVmaW5lIEhQVDM3WF9NQUdJQ19PSwkJCTB4NWE3ODE2ZjAKKyNkZWZpbmUgSFBUMzdYX01BR0lDX0JBRAkJMHg1YTc4MTZmZAorCisjZGVmaW5lIEhQVDQ1WF9NQUdJQ19PSwkJCTB4NWE3ODE2ZjMKKyNkZWZpbmUgSFBUNDVYX01BR0lDX0JBRAkJMHg1YTc4MTZmZAorCisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2hpZ2hwb2ludF8zN3hfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgdWludDY0X3Qgb2ZmKQoreworCXN0cnVjdCBocHQzN3hfbWV0YSAqaHB0OworCXVpbnQzMl90IG1hZ2ljOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYpOworCisJaHB0ID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIEhQVDM3WF9DT05GSUdfT0ZGLCAweDIwMCk7CisJaWYgKGhwdCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwltYWdpYyA9IGhwdC0+bWFnaWM7CisJaWYgKG1hZ2ljICE9IGNwdV90b19sZTMyKEhQVDM3WF9NQUdJQ19PSykgJiYgbWFnaWMgIT0gY3B1X3RvX2xlMzIoSFBUMzdYX01BR0lDX0JBRCkpCisJCXJldHVybiAtMTsKKworLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX1JBSUQpOworLy8JaWQtPnR5cGUgPSAiaGlnaHBvaW50X3JhaWRfbWVtYmVyIjsKKworCXJldHVybiAwOworfQorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9oaWdocG9pbnRfNDV4X3JhaWQoc3RydWN0IHZvbHVtZV9pZCAqaWQsIHVpbnQ2NF90IG9mZiwgdWludDY0X3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgaHB0NDV4X21ldGEgKmhwdDsKKwl1aW50NjRfdCBtZXRhX29mZjsKKwl1aW50MzJfdCBtYWdpYzsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4LCBzaXplIDB4JWxseCIsCisJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2l6ZSk7CisKKwlpZiAoc2l6ZSA8IDB4MTAwMDApCisJCXJldHVybiAtMTsKKworCW1ldGFfb2ZmID0gKChzaXplIC8gMHgyMDApLTExKSAqIDB4MjAwOworCWhwdCA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBtZXRhX29mZiwgMHgyMDApOworCWlmIChocHQgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJbWFnaWMgPSBocHQtPm1hZ2ljOworCWlmIChtYWdpYyAhPSBjcHVfdG9fbGUzMihIUFQ0NVhfTUFHSUNfT0spICYmIG1hZ2ljICE9IGNwdV90b19sZTMyKEhQVDQ1WF9NQUdJQ19CQUQpKQorCQlyZXR1cm4gLTE7CisKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9SQUlEKTsKKy8vCWlkLT50eXBlID0gImhpZ2hwb2ludF9yYWlkX21lbWJlciI7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9ocGZzLmMgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfaHBmcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4N2M4OWYKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfaHBmcy5jCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvL2tidWlsZDojIyMgbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfSFBGUykgKz0gaHBmcy5vCisKKy8vY29uZmlnOgorLy9jb25maWc6IyMjIGNvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0hQRlMKKy8vY29uZmlnOiMjIwlib29sICJocGZzIGZpbGVzeXN0ZW0iCisvL2NvbmZpZzojIyMJZGVmYXVsdCB5CisvL2NvbmZpZzojIyMJZGVwZW5kcyBvbiBWT0xVTUVJRAorLy9jb25maWc6IyMjCWhlbHAKKy8vY29uZmlnOiMjIwkgIFRPRE8KKy8vY29uZmlnOgorCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCBocGZzX3N1cGVyIHsKKwl1aW50OF90CQltYWdpY1s0XTsKKwl1aW50OF90CQl2ZXJzaW9uOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgSFBGU19TVVBFUkJMT0NLX09GRlNFVAkJCTB4MjAwMAorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9ocGZzKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCB1aW50NjRfdCBvZmYpCit7CisJc3RydWN0IGhwZnNfc3VwZXIgKmhzOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYpOworCisJaHMgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgSFBGU19TVVBFUkJMT0NLX09GRlNFVCwgMHgyMDApOworCWlmIChocyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobWVtY21wKGhzLT5tYWdpYywgIlx4NDlceGU4XHg5NVx4ZjkiLCA0KSA9PSAwKSB7CisvLwkJc3ByaW50ZihpZC0+dHlwZV92ZXJzaW9uLCAiJXUiLCBocy0+dmVyc2lvbik7CisvLwkJdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX0ZJTEVTWVNURU0pOworLy8JCWlkLT50eXBlID0gImhwZnMiOworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfaXN3X3JhaWQuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9pc3dfcmFpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MWJkMmYKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfaXN3X3JhaWQuYwpAQCAtMCwwICsxLDY5IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLy9rYnVpbGQ6IyMjIGxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX0lTV1JBSUQpICs9IGlzd19yYWlkLm8KKworLy9jb25maWc6CisvL2NvbmZpZzojIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfSVNXUkFJRAorLy9jb25maWc6IyMjCWJvb2wgImludGVsIHJhaWQiCisvL2NvbmZpZzojIyMJZGVmYXVsdCB5CisvL2NvbmZpZzojIyMJZGVwZW5kcyBvbiBWT0xVTUVJRAorLy9jb25maWc6IyMjCWhlbHAKKy8vY29uZmlnOiMjIwkgIFRPRE8KKy8vY29uZmlnOgorCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCBpc3dfbWV0YSB7CisJdWludDhfdAkJc2lnWzMyXTsKKwl1aW50MzJfdAljaGVja19zdW07CisJdWludDMyX3QJbXBiX3NpemU7CisJdWludDMyX3QJZmFtaWx5X251bTsKKwl1aW50MzJfdAlnZW5lcmF0aW9uX251bTsKK30gUEFDS0VEOworCisjZGVmaW5lIElTV19TSUdOQVRVUkUJCSJJbnRlbCBSYWlkIElTTSBDZmcgU2lnLiAiCisKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfaW50ZWxfc29mdHdhcmVfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgdWludDY0X3Qgb2ZmLCB1aW50NjRfdCBzaXplKQoreworCXVpbnQ2NF90IG1ldGFfb2ZmOworCXN0cnVjdCBpc3dfbWV0YSAqaXN3OworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgsIHNpemUgMHglbGx4IiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKSBzaXplKTsKKworCWlmIChzaXplIDwgMHgxMDAwMCkKKwkJcmV0dXJuIC0xOworCisJbWV0YV9vZmYgPSAoKHNpemUgLyAweDIwMCktMikgKiAweDIwMDsKKwlpc3cgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgbWV0YV9vZmYsIDB4MjAwKTsKKwlpZiAoaXN3ID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChtZW1jbXAoaXN3LT5zaWcsIElTV19TSUdOQVRVUkUsIHNpemVvZihJU1dfU0lHTkFUVVJFKS0xKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9SQUlEKTsKKy8vCW1lbWNweShpZC0+dHlwZV92ZXJzaW9uLCAmaXN3LT5zaWdbc2l6ZW9mKElTV19TSUdOQVRVUkUpLTFdLCA2KTsKKy8vCWlkLT50eXBlID0gImlzd19yYWlkX21lbWJlciI7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9sc2lfcmFpZC5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX2xzaV9yYWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkNjhkZQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9sc2lfcmFpZC5jCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvL2tidWlsZDojIyMgbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTFNJUkFJRCkgKz0gbHNpX3JhaWQubworCisvL2NvbmZpZzoKKy8vY29uZmlnOiMjIyBjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9MU0lSQUlECisvL2NvbmZpZzojIyMJYm9vbCAibHNpIHJhaWQiCisvL2NvbmZpZzojIyMJZGVmYXVsdCB5CisvL2NvbmZpZzojIyMJZGVwZW5kcyBvbiBWT0xVTUVJRAorLy9jb25maWc6IyMjCWhlbHAKKy8vY29uZmlnOiMjIwkgIFRPRE8KKy8vY29uZmlnOgorCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCBsc2lfbWV0YSB7CisJdWludDhfdAkJc2lnWzZdOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgTFNJX1NJR05BVFVSRQkJIiRYSURFJCIKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfbHNpX21lZ2FfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgdWludDY0X3Qgb2ZmLCB1aW50NjRfdCBzaXplKQoreworCXVpbnQ2NF90IG1ldGFfb2ZmOworCXN0cnVjdCBsc2lfbWV0YSAqbHNpOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgsIHNpemUgMHglbGx4IiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKSBzaXplKTsKKworCWlmIChzaXplIDwgMHgxMDAwMCkKKwkJcmV0dXJuIC0xOworCisJbWV0YV9vZmYgPSAoKHNpemUgLyAweDIwMCktMSkgKiAweDIwMDsKKwlsc2kgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgbWV0YV9vZmYsIDB4MjAwKTsKKwlpZiAobHNpID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChtZW1jbXAobHNpLT5zaWcsIExTSV9TSUdOQVRVUkUsIHNpemVvZihMU0lfU0lHTkFUVVJFKS0xKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9SQUlEKTsKKy8vCWlkLT50eXBlID0gImxzaV9tZWdhX3JhaWRfbWVtYmVyIjsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX2x2bS5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX2x2bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4ZmEwNTIKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfbHZtLmMKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8va2J1aWxkOiMjIyBsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9MVk0pICs9IGx2bS5vCisKKy8vY29uZmlnOgorLy9jb25maWc6IyMjIGNvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX0xWTQorLy9jb25maWc6IyMjCWJvb2wgImx2bSIKKy8vY29uZmlnOiMjIwlkZWZhdWx0IHkKKy8vY29uZmlnOiMjIwlkZXBlbmRzIG9uIFZPTFVNRUlECisvL2NvbmZpZzojIyMJaGVscAorLy9jb25maWc6IyMjCSAgVE9ETworLy9jb25maWc6CisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworc3RydWN0IGx2bTFfc3VwZXJfYmxvY2sgeworCXVpbnQ4X3QJaWRbMl07Cit9IFBBQ0tFRDsKKworc3RydWN0IGx2bTJfc3VwZXJfYmxvY2sgeworCXVpbnQ4X3QJCWlkWzhdOworCXVpbnQ2NF90CXNlY3Rvcl94bDsKKwl1aW50MzJfdAljcmNfeGw7CisJdWludDMyX3QJb2Zmc2V0X3hsOworCXVpbnQ4X3QJCXR5cGVbOF07Cit9IFBBQ0tFRDsKKworI2RlZmluZSBMVk0xX1NCX09GRgkJCTB4NDAwCisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2x2bTEoc3RydWN0IHZvbHVtZV9pZCAqaWQsIHVpbnQ2NF90IG9mZikKK3sKKwlzdHJ1Y3QgbHZtMV9zdXBlcl9ibG9jayAqbHZtOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBvZmYpOworCisJbHZtID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIExWTTFfU0JfT0ZGLCAweDgwMCk7CisJaWYgKGx2bSA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobHZtLT5pZFswXSAhPSAnSCcgfHwgbHZtLT5pZFsxXSAhPSAnTScpCisJCXJldHVybiAtMTsKKworLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX1JBSUQpOworLy8JaWQtPnR5cGUgPSAiTFZNMV9tZW1iZXIiOworCisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTFZNMl9MQUJFTF9JRAkJCSJMQUJFTE9ORSIKKyNkZWZpbmUgTFZNMkxBQkVMX1NDQU5fU0VDVE9SUwkJNAorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9sdm0yKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCB1aW50NjRfdCBvZmYpCit7CisJY29uc3QgdWludDhfdCAqYnVmOworCXVuc2lnbmVkIHNvZmY7CisJc3RydWN0IGx2bTJfc3VwZXJfYmxvY2sgKmx2bTsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCWJ1ZiA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYsIExWTTJMQUJFTF9TQ0FOX1NFQ1RPUlMgKiAweDIwMCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKworCWZvciAoc29mZiA9IDA7IHNvZmYgPCBMVk0yTEFCRUxfU0NBTl9TRUNUT1JTICogMHgyMDA7IHNvZmYgKz0gMHgyMDApIHsKKwkJbHZtID0gKHN0cnVjdCBsdm0yX3N1cGVyX2Jsb2NrICopICZidWZbc29mZl07CisKKwkJaWYgKG1lbWNtcChsdm0tPmlkLCBMVk0yX0xBQkVMX0lELCA4KSA9PSAwKQorCQkJZ290byBmb3VuZDsKKwl9CisKKwlyZXR1cm4gLTE7CisKKyBmb3VuZDoKKy8vCW1lbWNweShpZC0+dHlwZV92ZXJzaW9uLCBsdm0tPnR5cGUsIDgpOworLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX1JBSUQpOworLy8JaWQtPnR5cGUgPSAiTFZNMl9tZW1iZXIiOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfbWFjLmMgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfbWFjLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhNTNkMQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9tYWMuYwpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8va2J1aWxkOiMjIyBsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9NQUMpICs9IG1hYy5vCisKKy8vY29uZmlnOgorLy9jb25maWc6IyMjIGNvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX01BQworLy9jb25maWc6IyMjCWJvb2wgIm1hYyBmaWxlc3lzdGVtIgorLy9jb25maWc6IyMjCWRlZmF1bHQgeQorLy9jb25maWc6IyMjCWRlcGVuZHMgb24gVk9MVU1FSUQKKy8vY29uZmlnOiMjIwloZWxwCisvL2NvbmZpZzojIyMJICBUT0RPCisvL2NvbmZpZzoKKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdHJ1Y3QgbWFjX2RyaXZlcl9kZXNjIHsKKwl1aW50OF90CQlzaWduYXR1cmVbMl07CisJdWludDE2X3QJYmxvY2tfc2l6ZTsKKwl1aW50MzJfdAlibG9ja19jb3VudDsKK30gUEFDS0VEOworCitzdHJ1Y3QgbWFjX3BhcnRpdGlvbiB7CisJdWludDhfdAkJc2lnbmF0dXJlWzJdOworCXVpbnQxNl90CXJlczE7CisJdWludDMyX3QJbWFwX2NvdW50OworCXVpbnQzMl90CXN0YXJ0X2Jsb2NrOworCXVpbnQzMl90CWJsb2NrX2NvdW50OworCXVpbnQ4X3QJCW5hbWVbMzJdOworCXVpbnQ4X3QJCXR5cGVbMzJdOworfSBQQUNLRUQ7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX21hY19wYXJ0aXRpb25fbWFwKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCB1aW50NjRfdCBvZmYpCit7CisJY29uc3QgdWludDhfdCAqYnVmOworCXN0cnVjdCBtYWNfZHJpdmVyX2Rlc2MgKmRyaXZlcjsKKwlzdHJ1Y3QgbWFjX3BhcnRpdGlvbiAqcGFydDsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCWJ1ZiA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYsIDB4MjAwKTsKKwlpZiAoYnVmID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXBhcnQgPSAoc3RydWN0IG1hY19wYXJ0aXRpb24gKikgYnVmOworCWlmIChwYXJ0LT5zaWduYXR1cmVbMF0gPT0gJ1AnICYmIHBhcnQtPnNpZ25hdHVyZVsxXSA9PSAnTScgLyogIlBNIiAqLworCSAmJiAobWVtY21wKHBhcnQtPnR5cGUsICJBcHBsZV9wYXJ0aXRpb25fbWFwIiwgMTkpID09IDApCisJKSB7CisJCS8qIGxpbnV4IGNyZWF0ZXMgYW4gb3duIHN1YmRldmljZSBmb3IgdGhlIG1hcAorCQkgKiBqdXN0IHJldHVybiB0aGUgdHlwZSBpZiB0aGUgZHJpdmUgaGVhZGVyIGlzIG1pc3NpbmcgKi8KKy8vCQl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfUEFSVElUSU9OVEFCTEUpOworLy8JCWlkLT50eXBlID0gIm1hY19wYXJ0aXRpb25fbWFwIjsKKwkJcmV0dXJuIDA7CisJfQorCisJZHJpdmVyID0gKHN0cnVjdCBtYWNfZHJpdmVyX2Rlc2MgKikgYnVmOworCWlmIChkcml2ZXItPnNpZ25hdHVyZVswXSA9PSAnRScgJiYgZHJpdmVyLT5zaWduYXR1cmVbMV0gPT0gJ1InKSB7IC8qICJFUiIgKi8KKwkJLyogd2UgYXJlIG9uIGEgbWFpbiBkZXZpY2UsIGxpa2UgYSBDRAorCQkgKiBqdXN0IHRyeSB0byBwcm9iZSB0aGUgZmlyc3QgcGFydGl0aW9uIGZyb20gdGhlIG1hcCAqLworCQl1bnNpZ25lZCBic2l6ZSA9IGJlMTZfdG9fY3B1KGRyaXZlci0+YmxvY2tfc2l6ZSk7CisJCWludCBwYXJ0X2NvdW50OworCQlpbnQgaTsKKworCQkvKiBnZXQgZmlyc3QgZW50cnkgb2YgcGFydGl0aW9uIHRhYmxlICovCisJCWJ1ZiA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyAgYnNpemUsIDB4MjAwKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCisJCXBhcnQgPSAoc3RydWN0IG1hY19wYXJ0aXRpb24gKikgYnVmOworCQlpZiAocGFydC0+c2lnbmF0dXJlWzBdICE9ICdQJyB8fCBwYXJ0LT5zaWduYXR1cmVbMV0gIT0gJ00nKSAvKiBub3QgIlBNIiAqLworCQkJcmV0dXJuIC0xOworCisJCXBhcnRfY291bnQgPSBiZTMyX3RvX2NwdShwYXJ0LT5tYXBfY291bnQpOworCQlkYmcoImV4cGVjdGluZyAlZCBwYXJ0aXRpb24gZW50cmllcyIsIHBhcnRfY291bnQpOworCisJCWlmIChpZC0+cGFydGl0aW9ucyAhPSBOVUxMKQorCQkJZnJlZShpZC0+cGFydGl0aW9ucyk7CisJCWlkLT5wYXJ0aXRpb25zID0geHphbGxvYyhwYXJ0X2NvdW50ICogc2l6ZW9mKHN0cnVjdCB2b2x1bWVfaWRfcGFydGl0aW9uKSk7CisKKwkJaWQtPnBhcnRpdGlvbl9jb3VudCA9IHBhcnRfY291bnQ7CisKKwkJZm9yIChpID0gMDsgaSA8IHBhcnRfY291bnQ7IGkrKykgeworCQkJdWludDY0X3QgcG9mZjsKKwkJCXVpbnQ2NF90IHBsZW47CisKKwkJCWJ1ZiA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyAoKGkrMSkgKiBic2l6ZSksIDB4MjAwKTsKKwkJCWlmIChidWYgPT0gTlVMTCkKKwkJCQlyZXR1cm4gLTE7CisKKwkJCXBhcnQgPSAoc3RydWN0IG1hY19wYXJ0aXRpb24gKikgYnVmOworCQkJaWYgKHBhcnQtPnNpZ25hdHVyZVswXSAhPSAnUCcgfHwgcGFydC0+c2lnbmF0dXJlWzFdICE9ICdNJykgLyogbm90ICJQTSIgKi8KKwkJCQlyZXR1cm4gLTE7CisKKwkJCXBvZmYgPSBiZTMyX3RvX2NwdShwYXJ0LT5zdGFydF9ibG9jaykgKiBic2l6ZTsKKwkJCXBsZW4gPSBiZTMyX3RvX2NwdShwYXJ0LT5ibG9ja19jb3VudCkgKiBic2l6ZTsKKwkJCWRiZygiZm91bmQgJyVzJyBwYXJ0aXRpb24gZW50cnkgYXQgMHglbGx4LCBsZW4gMHglbGx4IiwKKwkJCQkJcGFydC0+dHlwZSwgKHVuc2lnbmVkIGxvbmcgbG9uZykgcG9mZiwKKwkJCQkJKHVuc2lnbmVkIGxvbmcgbG9uZykgcGxlbik7CisKKy8vCQkJaWQtPnBhcnRpdGlvbnNbaV0ucHRfb2ZmID0gcG9mZjsKKy8vCQkJaWQtPnBhcnRpdGlvbnNbaV0ucHRfbGVuID0gcGxlbjsKKworLy8JCQlpZiAobWVtY21wKHBhcnQtPnR5cGUsICJBcHBsZV9GcmVlIiwgMTApID09IDApIHsKKy8vCQkJCXZvbHVtZV9pZF9zZXRfdXNhZ2VfcGFydCgmaWQtPnBhcnRpdGlvbnNbaV0sIFZPTFVNRV9JRF9VTlVTRUQpOworLy8JCQl9IGVsc2UgaWYgKG1lbWNtcChwYXJ0LT50eXBlLCAiQXBwbGVfcGFydGl0aW9uX21hcCIsIDE5KSA9PSAwKSB7CisvLwkJCQl2b2x1bWVfaWRfc2V0X3VzYWdlX3BhcnQoJmlkLT5wYXJ0aXRpb25zW2ldLCBWT0xVTUVfSURfUEFSVElUSU9OVEFCTEUpOworLy8JCQl9IGVsc2UgeworLy8JCQkJdm9sdW1lX2lkX3NldF91c2FnZV9wYXJ0KCZpZC0+cGFydGl0aW9uc1tpXSwgVk9MVU1FX0lEX1VOUFJPQkVEKTsKKy8vCQkJfQorCQl9CisvLwkJdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX1BBUlRJVElPTlRBQkxFKTsKKy8vCQlpZC0+dHlwZSA9ICJtYWNfcGFydGl0aW9uX21hcCI7CisJCXJldHVybiAwOworCX0KKworCXJldHVybiAtMTsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9taW5peC5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX21pbml4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhZmQ1YwotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9taW5peC5jCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvL2tidWlsZDojIyMgbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfTUlOSVgpICs9IG1pbml4Lm8KKworLy9jb25maWc6CisvL2NvbmZpZzojIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfTUlOSVgKKy8vY29uZmlnOiMjIwlib29sICJtaW5peCBmaWxlc3lzdGVtIgorLy9jb25maWc6IyMjCWRlZmF1bHQgeQorLy9jb25maWc6IyMjCWRlcGVuZHMgb24gVk9MVU1FSUQKKy8vY29uZmlnOiMjIwloZWxwCisvL2NvbmZpZzojIyMJICBUT0RPCisvL2NvbmZpZzoKKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdHJ1Y3QgbWluaXhfc3VwZXJfYmxvY2sgeworCXVpbnQxNl90CXNfbmlub2RlczsKKwl1aW50MTZfdAlzX256b25lczsKKwl1aW50MTZfdAlzX2ltYXBfYmxvY2tzOworCXVpbnQxNl90CXNfem1hcF9ibG9ja3M7CisJdWludDE2X3QJc19maXJzdGRhdGF6b25lOworCXVpbnQxNl90CXNfbG9nX3pvbmVfc2l6ZTsKKwl1aW50MzJfdAlzX21heF9zaXplOworCXVpbnQxNl90CXNfbWFnaWM7CisJdWludDE2X3QJc19zdGF0ZTsKKwl1aW50MzJfdAlzX3pvbmVzOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgTUlOSVhfU1VQRVJCTE9DS19PRkZTRVQJCQkweDQwMAorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9taW5peChzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgdWludDY0X3Qgb2ZmKQoreworCXN0cnVjdCBtaW5peF9zdXBlcl9ibG9jayAqbXM7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwltcyA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBNSU5JWF9TVVBFUkJMT0NLX09GRlNFVCwgMHgyMDApOworCWlmIChtcyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobXMtPnNfbWFnaWMgPT0gY3B1X3RvX2xlMTYoMHgxMzdmKSkgeworLy8JCWlkLT50eXBlX3ZlcnNpb25bMF0gPSAnMSc7CisJCWdvdG8gZm91bmQ7CisJfQorCisJaWYgKG1zLT5zX21hZ2ljID09IGNwdV90b19sZTE2KDB4MTM4NykpIHsKKy8vCQlpZC0+dHlwZV92ZXJzaW9uWzBdID0gJzEnOworCQlnb3RvIGZvdW5kOworCX0KKworCWlmIChtcy0+c19tYWdpYyA9PSBjcHVfdG9fbGUxNigweDI0NjgpKSB7CisvLwkJaWQtPnR5cGVfdmVyc2lvblswXSA9ICcyJzsKKwkJZ290byBmb3VuZDsKKwl9CisKKwlpZiAobXMtPnNfbWFnaWMgPT0gY3B1X3RvX2xlMTYoMHgyNDc4KSkgeworLy8JCWlkLT50eXBlX3ZlcnNpb25bMF0gPSAnMic7CisJCWdvdG8gZm91bmQ7CisJfQorCisJcmV0dXJuIC0xOworCisgZm91bmQ6CisvLwlpZC0+dHlwZV92ZXJzaW9uWzFdID0gJ1wwJzsKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9GSUxFU1lTVEVNKTsKKy8vCWlkLT50eXBlID0gIm1pbml4IjsKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9tc2Rvcy5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX21zZG9zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWViYWEzZQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9tc2Rvcy5jCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLy9rYnVpbGQ6IyMjIGxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX01TRE9TKSArPSBtc2Rvcy5vCisKKy8vY29uZmlnOgorLy9jb25maWc6IyMjIGNvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX01TRE9TCisvL2NvbmZpZzojIyMJYm9vbCAibXNkb3MgZmlsZXN5c3RlbSIKKy8vY29uZmlnOiMjIwlkZWZhdWx0IHkKKy8vY29uZmlnOiMjIwlkZXBlbmRzIG9uIFZPTFVNRUlECisvL2NvbmZpZzojIyMJaGVscAorLy9jb25maWc6IyMjCSAgVE9ETworLy9jb25maWc6CisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworc3RydWN0IG1zZG9zX3BhcnRpdGlvbl9lbnRyeSB7CisJdWludDhfdAkJYm9vdF9pbmQ7CisJdWludDhfdAkJaGVhZDsKKwl1aW50OF90CQlzZWN0b3I7CisJdWludDhfdAkJY3lsOworCXVpbnQ4X3QJCXN5c19pbmQ7CisJdWludDhfdAkJZW5kX2hlYWQ7CisJdWludDhfdAkJZW5kX3NlY3RvcjsKKwl1aW50OF90CQllbmRfY3lsOworCXVpbnQzMl90CXN0YXJ0X3NlY3Q7CisJdWludDMyX3QJbnJfc2VjdHM7Cit9IFBBQ0tFRDsKKworI2RlZmluZSBNU0RPU19QQVJUVEFCTEVfT0ZGU0VUCQkweDFiZQorI2RlZmluZSBNU0RPU19TSUdfT0ZGCQkJMHgxZmUKKyNkZWZpbmUgQlNJWkUJCQkJMHgyMDAKKyNkZWZpbmUgRE9TX0VYVEVOREVEX1BBUlRJVElPTgkJMHgwNQorI2RlZmluZSBMSU5VWF9FWFRFTkRFRF9QQVJUSVRJT04JMHg4NQorI2RlZmluZSBXSU45OF9FWFRFTkRFRF9QQVJUSVRJT04JMHgwZgorI2RlZmluZSBMSU5VWF9SQUlEX1BBUlRJVElPTgkJMHhmZAorI2RlZmluZSBpc19leHRlbmRlZCh0eXBlKSBcCisJKHR5cGUgPT0gRE9TX0VYVEVOREVEX1BBUlRJVElPTiB8fAlcCisJIHR5cGUgPT0gV0lOOThfRVhURU5ERURfUEFSVElUSU9OIHx8CVwKKwkgdHlwZSA9PSBMSU5VWF9FWFRFTkRFRF9QQVJUSVRJT04pCisjZGVmaW5lIGlzX3JhaWQodHlwZSkgXAorCSh0eXBlID09IExJTlVYX1JBSURfUEFSVElUSU9OKQorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9tc2Rvc19wYXJ0X3RhYmxlKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCB1aW50NjRfdCBvZmYpCit7CisJY29uc3QgdWludDhfdCAqYnVmOworCWludCBpOworCXVpbnQ2NF90IHBvZmY7CisJdWludDY0X3QgcGxlbjsKKwl1aW50NjRfdCBleHRlbmRlZCA9IDA7CisJdWludDY0X3QgY3VycmVudDsKKwl1aW50NjRfdCBuZXh0OworCWludCBsaW1pdDsKKwlpbnQgZW1wdHkgPSAxOworCXN0cnVjdCBtc2Rvc19wYXJ0aXRpb25fZW50cnkgKnBhcnQ7CisJc3RydWN0IHZvbHVtZV9pZF9wYXJ0aXRpb24gKnA7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwlidWYgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmLCAweDIwMCk7CisJaWYgKGJ1ZiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoYnVmW01TRE9TX1NJR19PRkZdICE9IDB4NTUgfHwgYnVmW01TRE9TX1NJR19PRkYgKyAxXSAhPSAweGFhKQorCQlyZXR1cm4gLTE7CisKKwkvKiBjaGVjayBmbGFncyBvbiBhbGwgZW50cmllcyBmb3IgYSB2YWxpZCBwYXJ0aXRpb24gdGFibGUgKi8KKwlwYXJ0ID0gKHN0cnVjdCBtc2Rvc19wYXJ0aXRpb25fZW50cnkqKSAmYnVmW01TRE9TX1BBUlRUQUJMRV9PRkZTRVRdOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJaWYgKHBhcnRbaV0uYm9vdF9pbmQgIT0gMAorCQkgJiYgcGFydFtpXS5ib290X2luZCAhPSAweDgwCisJCSkgeworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJaWYgKHBhcnRbaV0ubnJfc2VjdHMgIT0gMCkKKwkJCWVtcHR5ID0gMDsKKwl9CisJaWYgKGVtcHR5ID09IDEpCisJCXJldHVybiAtMTsKKworCWlmIChpZC0+cGFydGl0aW9ucyAhPSBOVUxMKQorCQlmcmVlKGlkLT5wYXJ0aXRpb25zKTsKKwlpZC0+cGFydGl0aW9ucyA9IHh6YWxsb2MoVk9MVU1FX0lEX1BBUlRJVElPTlNfTUFYICoKKwkJCQlzaXplb2Yoc3RydWN0IHZvbHVtZV9pZF9wYXJ0aXRpb24pKTsKKworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJcG9mZiA9ICh1aW50NjRfdCkgbGUzMl90b19jcHUocGFydFtpXS5zdGFydF9zZWN0KSAqIEJTSVpFOworCQlwbGVuID0gKHVpbnQ2NF90KSBsZTMyX3RvX2NwdShwYXJ0W2ldLm5yX3NlY3RzKSAqIEJTSVpFOworCisJCWlmIChwbGVuID09IDApCisJCQljb250aW51ZTsKKworCQlwID0gJmlkLT5wYXJ0aXRpb25zW2ldOworCisvLwkJcC0+cHRfdHlwZV9yYXcgPSBwYXJ0W2ldLnN5c19pbmQ7CisKKwkJaWYgKGlzX2V4dGVuZGVkKHBhcnRbaV0uc3lzX2luZCkpIHsKKwkJCWRiZygiZm91bmQgZXh0ZW5kZWQgcGFydGl0aW9uIGF0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIHBvZmYpOworLy8JCQl2b2x1bWVfaWRfc2V0X3VzYWdlX3BhcnQocCwgVk9MVU1FX0lEX1BBUlRJVElPTlRBQkxFKTsKKy8vCQkJcC0+dHlwZSA9ICJtc2Rvc19leHRlbmRlZF9wYXJ0aXRpb24iOworCQkJaWYgKGV4dGVuZGVkID09IDApCisJCQkJZXh0ZW5kZWQgPSBvZmYgKyBwb2ZmOworCQl9IGVsc2UgeworCQkJZGJnKCJmb3VuZCAweCV4IGRhdGEgcGFydGl0aW9uIGF0IDB4JWxseCwgbGVuIDB4JWxseCIsCisJCQkJcGFydFtpXS5zeXNfaW5kLCAodW5zaWduZWQgbG9uZyBsb25nKSBwb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKSBwbGVuKTsKKworLy8JCQlpZiAoaXNfcmFpZChwYXJ0W2ldLnN5c19pbmQpKQorLy8JCQkJdm9sdW1lX2lkX3NldF91c2FnZV9wYXJ0KHAsIFZPTFVNRV9JRF9SQUlEKTsKKy8vCQkJZWxzZQorLy8JCQkJdm9sdW1lX2lkX3NldF91c2FnZV9wYXJ0KHAsIFZPTFVNRV9JRF9VTlBST0JFRCk7CisJCX0KKworLy8JCXAtPnB0X29mZiA9IG9mZiArIHBvZmY7CisvLwkJcC0+cHRfbGVuID0gcGxlbjsKKwkJaWQtPnBhcnRpdGlvbl9jb3VudCA9IGkrMTsKKwl9CisKKwluZXh0ID0gZXh0ZW5kZWQ7CisJY3VycmVudCA9IGV4dGVuZGVkOworCWxpbWl0ID0gNTA7CisKKwkvKiBmb2xsb3cgZXh0ZW5kZWQgcGFydGl0aW9uIGNoYWluIGFuZCBhZGQgZGF0YSBwYXJ0aXRpb25zICovCisJd2hpbGUgKG5leHQgIT0gMCkgeworCQlpZiAobGltaXQtLSA9PSAwKSB7CisJCQlkYmcoImV4dGVuZGVkIGNoYWluIGxpbWl0IHJlYWNoZWQiKTsKKwkJCWJyZWFrOworCQl9CisKKwkJYnVmID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIGN1cnJlbnQsIDB4MjAwKTsKKwkJaWYgKGJ1ZiA9PSBOVUxMKQorCQkJYnJlYWs7CisKKwkJcGFydCA9IChzdHJ1Y3QgbXNkb3NfcGFydGl0aW9uX2VudHJ5KikgJmJ1ZltNU0RPU19QQVJUVEFCTEVfT0ZGU0VUXTsKKworCQlpZiAoYnVmW01TRE9TX1NJR19PRkZdICE9IDB4NTUgfHwgYnVmW01TRE9TX1NJR19PRkYgKyAxXSAhPSAweGFhKQorCQkJYnJlYWs7CisKKwkJbmV4dCA9IDA7CisKKwkJZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworCQkJcG9mZiA9ICh1aW50NjRfdCkgbGUzMl90b19jcHUocGFydFtpXS5zdGFydF9zZWN0KSAqIEJTSVpFOworCQkJcGxlbiA9ICh1aW50NjRfdCkgbGUzMl90b19jcHUocGFydFtpXS5ucl9zZWN0cykgKiBCU0laRTsKKworCQkJaWYgKHBsZW4gPT0gMCkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKGlzX2V4dGVuZGVkKHBhcnRbaV0uc3lzX2luZCkpIHsKKwkJCQlkYmcoImZvdW5kIGV4dGVuZGVkIHBhcnRpdGlvbiBhdCAweCVsbHgiLCAodW5zaWduZWQgbG9uZyBsb25nKSBwb2ZmKTsKKwkJCQlpZiAobmV4dCA9PSAwKQorCQkJCQluZXh0ID0gZXh0ZW5kZWQgKyBwb2ZmOworCQkJfSBlbHNlIHsKKwkJCQlkYmcoImZvdW5kIDB4JXggZGF0YSBwYXJ0aXRpb24gYXQgMHglbGx4LCBsZW4gMHglbGx4IiwKKwkJCQkJcGFydFtpXS5zeXNfaW5kLCAodW5zaWduZWQgbG9uZyBsb25nKSBwb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKSBwbGVuKTsKKworCQkJCS8qIHdlIGFsd2F5cyBzdGFydCBhdCB0aGUgNXRoIGVudHJ5ICovCisvLwkJCQl3aGlsZSAoaWQtPnBhcnRpdGlvbl9jb3VudCA8IDQpCisvLwkJCQkJdm9sdW1lX2lkX3NldF91c2FnZV9wYXJ0KCZpZC0+cGFydGl0aW9uc1tpZC0+cGFydGl0aW9uX2NvdW50KytdLCBWT0xVTUVfSURfVU5VU0VEKTsKKwkJCQlpZiAoaWQtPnBhcnRpdGlvbl9jb3VudCA8IDQpCisJCQkJCWlkLT5wYXJ0aXRpb25fY291bnQgPSA0OworCisvLwkJCQlwID0gJmlkLT5wYXJ0aXRpb25zW2lkLT5wYXJ0aXRpb25fY291bnRdOworCisvLwkJCQlpZiAoaXNfcmFpZChwYXJ0W2ldLnN5c19pbmQpKQorLy8JCQkJCXZvbHVtZV9pZF9zZXRfdXNhZ2VfcGFydChwLCBWT0xVTUVfSURfUkFJRCk7CisvLwkJCQllbHNlCisvLwkJCQkJdm9sdW1lX2lkX3NldF91c2FnZV9wYXJ0KHAsIFZPTFVNRV9JRF9VTlBST0JFRCk7CisKKy8vCQkJCXAtPnB0X29mZiA9IGN1cnJlbnQgKyBwb2ZmOworLy8JCQkJcC0+cHRfbGVuID0gcGxlbjsKKwkJCQlpZC0+cGFydGl0aW9uX2NvdW50Kys7CisKKy8vCQkJCXAtPnB0X3R5cGVfcmF3ID0gcGFydFtpXS5zeXNfaW5kOworCisJCQkJaWYgKGlkLT5wYXJ0aXRpb25fY291bnQgPj0gVk9MVU1FX0lEX1BBUlRJVElPTlNfTUFYKSB7CisJCQkJCWRiZygidG9vIG1hbnkgcGFydGl0aW9ucyIpOworCQkJCQluZXh0ID0gMDsKKwkJCQl9CisJCQl9CisJCX0KKworCQljdXJyZW50ID0gbmV4dDsKKwl9CisKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9QQVJUSVRJT05UQUJMRSk7CisvLwlpZC0+dHlwZSA9ICJtc2Rvc19wYXJ0aXRpb25fdGFibGUiOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfbnZpZGlhX3JhaWQuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9udmlkaWFfcmFpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OWExMDgKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfbnZpZGlhX3JhaWQuYwpAQCAtMCwwICsxLDY3IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLy9rYnVpbGQ6IyMjIGxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX05WSURJQVJBSUQpICs9IG52aWRpYV9yYWlkLm8KKworLy9jb25maWc6CisvL2NvbmZpZzojIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfTlZJRElBUkFJRAorLy9jb25maWc6IyMjCWJvb2wgIm52aWRpYSByYWlkIgorLy9jb25maWc6IyMjCWRlZmF1bHQgeQorLy9jb25maWc6IyMjCWRlcGVuZHMgb24gVk9MVU1FSUQKKy8vY29uZmlnOiMjIwloZWxwCisvL2NvbmZpZzojIyMJICBUT0RPCisvL2NvbmZpZzoKKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdHJ1Y3QgbnZpZGlhX21ldGEgeworCXVpbnQ4X3QJCXZlbmRvcls4XTsKKwl1aW50MzJfdAlzaXplOworCXVpbnQzMl90CWNoa3N1bTsKKwl1aW50MTZfdAl2ZXJzaW9uOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgTlZJRElBX1NJR05BVFVSRQkJIk5WSURJQSIKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfbnZpZGlhX3JhaWQoc3RydWN0IHZvbHVtZV9pZCAqaWQsIHVpbnQ2NF90IG9mZiwgdWludDY0X3Qgc2l6ZSkKK3sKKwl1aW50NjRfdCBtZXRhX29mZjsKKwlzdHJ1Y3QgbnZpZGlhX21ldGEgKm52OworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgsIHNpemUgMHglbGx4IiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKSBzaXplKTsKKworCWlmIChzaXplIDwgMHgxMDAwMCkKKwkJcmV0dXJuIC0xOworCisJbWV0YV9vZmYgPSAoKHNpemUgLyAweDIwMCktMikgKiAweDIwMDsKKwludiA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBtZXRhX29mZiwgMHgyMDApOworCWlmIChudiA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAobWVtY21wKG52LT52ZW5kb3IsIE5WSURJQV9TSUdOQVRVUkUsIHNpemVvZihOVklESUFfU0lHTkFUVVJFKS0xKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9SQUlEKTsKKy8vCXNucHJpbnRmKGlkLT50eXBlX3ZlcnNpb24sIHNpemVvZihpZC0+dHlwZV92ZXJzaW9uKS0xLCAiJXUiLCBsZTE2X3RvX2NwdShudi0+dmVyc2lvbikpOworLy8JaWQtPnR5cGUgPSAibnZpZGlhX3JhaWRfbWVtYmVyIjsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX3Byb21pc2VfcmFpZC5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX3Byb21pc2VfcmFpZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYmViZTMKLS0tIC9kZXYvbnVsbAorKysgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC91bnVzZWRfcHJvbWlzZV9yYWlkLmMKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8va2J1aWxkOiMjIyBsaWItJChDT05GSUdfRkVBVFVSRV9WT0xVTUVJRF9QUk9NSVNFUkFJRCkgKz0gcHJvbWlzZV9yYWlkLm8KKworLy9jb25maWc6CisvL2NvbmZpZzojIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfUFJPTUlTRVJBSUQKKy8vY29uZmlnOiMjIwlib29sICJwcm9taXNlIHJhaWQiCisvL2NvbmZpZzojIyMJZGVmYXVsdCB5CisvL2NvbmZpZzojIyMJZGVwZW5kcyBvbiBWT0xVTUVJRAorLy9jb25maWc6IyMjCWhlbHAKKy8vY29uZmlnOiMjIwkgIFRPRE8KKy8vY29uZmlnOgorCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCBwcm9taXNlX21ldGEgeworCXVpbnQ4X3QJc2lnWzI0XTsKK30gUEFDS0VEOworCisjZGVmaW5lIFBEQ19DT05GSUdfT0ZGCQkweDEyMDAKKyNkZWZpbmUgUERDX1NJR05BVFVSRQkJIlByb21pc2UgVGVjaG5vbG9neSwgSW5jLiIKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfcHJvbWlzZV9mYXN0dHJhY2tfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgdWludDY0X3Qgb2ZmLCB1aW50NjRfdCBzaXplKQoreworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBzZWN0b3JzW10gPSB7CisJCTYzLCAyNTUsIDI1NiwgMTYsIDM5OQorCX07CisKKwlzdHJ1Y3QgcHJvbWlzZV9tZXRhICpwZGM7CisJdW5zaWduZWQgaTsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4LCBzaXplIDB4JWxseCIsCisJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2l6ZSk7CisKKwlpZiAoc2l6ZSA8IDB4NDAwMDApCisJCXJldHVybiAtMTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNlY3RvcnMpOyBpKyspIHsKKwkJdWludDY0X3QgbWV0YV9vZmY7CisKKwkJbWV0YV9vZmYgPSAoKHNpemUgLyAweDIwMCkgLSBzZWN0b3JzW2ldKSAqIDB4MjAwOworCQlwZGMgPSB2b2x1bWVfaWRfZ2V0X2J1ZmZlcihpZCwgb2ZmICsgbWV0YV9vZmYsIDB4MjAwKTsKKwkJaWYgKHBkYyA9PSBOVUxMKQorCQkJcmV0dXJuIC0xOworCisJCWlmIChtZW1jbXAocGRjLT5zaWcsIFBEQ19TSUdOQVRVUkUsIHNpemVvZihQRENfU0lHTkFUVVJFKS0xKSA9PSAwKQorCQkJZ290byBmb3VuZDsKKwl9CisJcmV0dXJuIC0xOworCisgZm91bmQ6CisvLwl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfUkFJRCk7CisvLwlpZC0+dHlwZSA9ICJwcm9taXNlX2Zhc3R0cmFja19yYWlkX21lbWJlciI7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9zaWxpY29uX3JhaWQuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF9zaWxpY29uX3JhaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGM4ZmFhCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX3NpbGljb25fcmFpZC5jCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvL2tidWlsZDojIyMgbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfU0lMSUNPTlJBSUQpICs9IHNpbGljb25fcmFpZC5vCisKKy8vY29uZmlnOgorLy9jb25maWc6IyMjIGNvbmZpZyBGRUFUVVJFX1ZPTFVNRUlEX1NJTElDT05SQUlECisvL2NvbmZpZzojIyMJYm9vbCAic2lsaWNvbiByYWlkIgorLy9jb25maWc6IyMjCWRlZmF1bHQgeQorLy9jb25maWc6IyMjCWRlcGVuZHMgb24gVk9MVU1FSUQKKy8vY29uZmlnOiMjIwloZWxwCisvL2NvbmZpZzojIyMJICBUT0RPCisvL2NvbmZpZzoKKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCitzdHJ1Y3Qgc2lsaWNvbl9tZXRhIHsKKwl1aW50OF90CQl1bmtub3duMFsweDJFXTsKKwl1aW50OF90CQlhc2NpaV92ZXJzaW9uWzB4MzYgLSAweDJFXTsKKwl1aW50OF90CQlkaXNrbmFtZVsweDU2IC0gMHgzNl07CisJdWludDhfdAkJdW5rbm93bjFbMHg2MCAtIDB4NTZdOworCXVpbnQzMl90CW1hZ2ljOworCXVpbnQzMl90CXVua25vd24xYVsweDZDIC0gMHg2NF07CisJdWludDMyX3QJYXJyYXlfc2VjdG9yc19sb3c7CisJdWludDMyX3QJYXJyYXlfc2VjdG9yc19oaWdoOworCXVpbnQ4X3QJCXVua25vd24yWzB4NzggLSAweDc0XTsKKwl1aW50MzJfdAl0aGlzZGlza19zZWN0b3JzOworCXVpbnQ4X3QJCXVua25vd24zWzB4MTAwIC0gMHg3Q107CisJdWludDhfdAkJdW5rbm93bjRbMHgxMDQgLSAweDEwMF07CisJdWludDE2X3QJcHJvZHVjdF9pZDsKKwl1aW50MTZfdAl2ZW5kb3JfaWQ7CisJdWludDE2X3QJbWlub3JfdmVyOworCXVpbnQxNl90CW1ham9yX3ZlcjsKK30gUEFDS0VEOworCisjZGVmaW5lIFNJTElDT05fTUFHSUMJCTB4MkYwMDAwMDAKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfc2lsaWNvbl9tZWRsZXlfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgdWludDY0X3Qgb2ZmLCB1aW50NjRfdCBzaXplKQoreworCXVpbnQ2NF90IG1ldGFfb2ZmOworCXN0cnVjdCBzaWxpY29uX21ldGEgKnNpbDsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4LCBzaXplIDB4JWxseCIsCisJICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2l6ZSk7CisKKwlpZiAoc2l6ZSA8IDB4MTAwMDApCisJCXJldHVybiAtMTsKKworCW1ldGFfb2ZmID0gKChzaXplIC8gMHgyMDApLTEpICogMHgyMDA7CisJc2lsID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIG1ldGFfb2ZmLCAweDIwMCk7CisJaWYgKHNpbCA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoc2lsLT5tYWdpYyAhPSBjcHVfdG9fbGUzMihTSUxJQ09OX01BR0lDKSkKKwkJcmV0dXJuIC0xOworCisvLwl2b2x1bWVfaWRfc2V0X3VzYWdlKGlkLCBWT0xVTUVfSURfUkFJRCk7CisvLwlzbnByaW50ZihpZC0+dHlwZV92ZXJzaW9uLCBzaXplb2YoaWQtPnR5cGVfdmVyc2lvbiktMSwgIiV1LiV1IiwKKy8vCQlsZTE2X3RvX2NwdShzaWwtPm1ham9yX3ZlciksIGxlMTZfdG9fY3B1KHNpbC0+bWlub3JfdmVyKSk7CisvLwlpZC0+dHlwZSA9ICJzaWxpY29uX21lZGxleV9yYWlkX21lbWJlciI7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF91ZnMuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF91ZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzNjMTBmCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX3Vmcy5jCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNCBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworLy9rYnVpbGQ6IyMjIGxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1VGUykgKz0gdWZzLm8KKworLy9jb25maWc6CisvL2NvbmZpZzojIyMgY29uZmlnIEZFQVRVUkVfVk9MVU1FSURfVUZTCisvL2NvbmZpZzojIyMJYm9vbCAidWZzIGZpbGVzeXN0ZW0iCisvL2NvbmZpZzojIyMJZGVmYXVsdCB5CisvL2NvbmZpZzojIyMJZGVwZW5kcyBvbiBWT0xVTUVJRAorLy9jb25maWc6IyMjCWhlbHAKKy8vY29uZmlnOiMjIwkgIFRPRE8KKy8vY29uZmlnOgorCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCB1ZnNfc3VwZXJfYmxvY2sgeworCXVpbnQzMl90CWZzX2xpbms7CisJdWludDMyX3QJZnNfcmxpbms7CisJdWludDMyX3QJZnNfc2Jsa25vOworCXVpbnQzMl90CWZzX2NibGtubzsKKwl1aW50MzJfdAlmc19pYmxrbm87CisJdWludDMyX3QJZnNfZGJsa25vOworCXVpbnQzMl90CWZzX2Nnb2Zmc2V0OworCXVpbnQzMl90CWZzX2NnbWFzazsKKwl1aW50MzJfdAlmc190aW1lOworCXVpbnQzMl90CWZzX3NpemU7CisJdWludDMyX3QJZnNfZHNpemU7CisJdWludDMyX3QJZnNfbmNnOworCXVpbnQzMl90CWZzX2JzaXplOworCXVpbnQzMl90CWZzX2ZzaXplOworCXVpbnQzMl90CWZzX2ZyYWc7CisJdWludDMyX3QJZnNfbWluZnJlZTsKKwl1aW50MzJfdAlmc19yb3RkZWxheTsKKwl1aW50MzJfdAlmc19ycHM7CisJdWludDMyX3QJZnNfYm1hc2s7CisJdWludDMyX3QJZnNfZm1hc2s7CisJdWludDMyX3QJZnNfYnNoaWZ0OworCXVpbnQzMl90CWZzX2ZzaGlmdDsKKwl1aW50MzJfdAlmc19tYXhjb250aWc7CisJdWludDMyX3QJZnNfbWF4YnBnOworCXVpbnQzMl90CWZzX2ZyYWdzaGlmdDsKKwl1aW50MzJfdAlmc19mc2J0b2RiOworCXVpbnQzMl90CWZzX3Nic2l6ZTsKKwl1aW50MzJfdAlmc19jc21hc2s7CisJdWludDMyX3QJZnNfY3NzaGlmdDsKKwl1aW50MzJfdAlmc19uaW5kaXI7CisJdWludDMyX3QJZnNfaW5vcGI7CisJdWludDMyX3QJZnNfbnNwZjsKKwl1aW50MzJfdAlmc19vcHRpbTsKKwl1aW50MzJfdAlmc19ucHNlY3Rfc3RhdGU7CisJdWludDMyX3QJZnNfaW50ZXJsZWF2ZTsKKwl1aW50MzJfdAlmc190cmFja3NrZXc7CisJdWludDMyX3QJZnNfaWRbMl07CisJdWludDMyX3QJZnNfY3NhZGRyOworCXVpbnQzMl90CWZzX2Nzc2l6ZTsKKwl1aW50MzJfdAlmc19jZ3NpemU7CisJdWludDMyX3QJZnNfbnRyYWs7CisJdWludDMyX3QJZnNfbnNlY3Q7CisJdWludDMyX3QJZnNfc3BjOworCXVpbnQzMl90CWZzX25jeWw7CisJdWludDMyX3QJZnNfY3BnOworCXVpbnQzMl90CWZzX2lwZzsKKwl1aW50MzJfdAlmc19mcGc7CisJc3RydWN0IHVmc19jc3VtIHsKKwkJdWludDMyX3QJY3NfbmRpcjsKKwkJdWludDMyX3QJY3NfbmJmcmVlOworCQl1aW50MzJfdAljc19uaWZyZWU7CisJCXVpbnQzMl90CWNzX25mZnJlZTsKKwl9IFBBQ0tFRCBmc19jc3RvdGFsOworCWludDhfdAkJZnNfZm1vZDsKKwlpbnQ4X3QJCWZzX2NsZWFuOworCWludDhfdAkJZnNfcm9ubHk7CisJaW50OF90CQlmc19mbGFnczsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQlpbnQ4X3QJZnNfZnNtbnRbNTEyXTsKKwkJCXVpbnQzMl90CWZzX2Nncm90b3I7CisJCQl1aW50MzJfdAlmc19jc3BbMzFdOworCQkJdWludDMyX3QJZnNfbWF4Y2x1c3RlcjsKKwkJCXVpbnQzMl90CWZzX2NwYzsKKwkJCXVpbnQxNl90CWZzX29wb3N0YmxbMTZdWzhdOworCQl9IFBBQ0tFRCBmc191MTsKKwkJc3RydWN0IHsKKwkJCWludDhfdAkJZnNfZnNtbnRbNDY4XTsKKwkJCXVpbnQ4X3QJCWZzX3ZvbG5hbWVbMzJdOworCQkJdWludDY0X3QJZnNfc3d1aWQ7CisJCQlpbnQzMl90CQlmc19wYWQ7CisJCQl1aW50MzJfdAlmc19jZ3JvdG9yOworCQkJdWludDMyX3QJZnNfb2NzcFsyOF07CisJCQl1aW50MzJfdAlmc19jb250aWdkaXJzOworCQkJdWludDMyX3QJZnNfY3NwOworCQkJdWludDMyX3QJZnNfbWF4Y2x1c3RlcjsKKwkJCXVpbnQzMl90CWZzX2FjdGl2ZTsKKwkJCWludDMyX3QJCWZzX29sZF9jcGM7CisJCQlpbnQzMl90CQlmc19tYXhic2l6ZTsKKwkJCWludDY0X3QJCWZzX3NwYXJlY29uNjRbMTddOworCQkJaW50NjRfdAkJZnNfc2Jsb2NrbG9jOworCQkJc3RydWN0IHVmczJfY3N1bV90b3RhbCB7CisJCQkJdWludDY0X3QJY3NfbmRpcjsKKwkJCQl1aW50NjRfdAljc19uYmZyZWU7CisJCQkJdWludDY0X3QJY3NfbmlmcmVlOworCQkJCXVpbnQ2NF90CWNzX25mZnJlZTsKKwkJCQl1aW50NjRfdAljc19udW1jbHVzdGVyczsKKwkJCQl1aW50NjRfdAljc19zcGFyZVszXTsKKwkJCX0gUEFDS0VEIGZzX2NzdG90YWw7CisJCQlzdHJ1Y3QgdWZzX3RpbWV2YWwgeworCQkJCWludDMyX3QJCXR2X3NlYzsKKwkJCQlpbnQzMl90CQl0dl91c2VjOworCQkJfSBQQUNLRUQgZnNfdGltZTsKKwkJCWludDY0X3QJCWZzX3NpemU7CisJCQlpbnQ2NF90CQlmc19kc2l6ZTsKKwkJCXVpbnQ2NF90CWZzX2NzYWRkcjsKKwkJCWludDY0X3QJCWZzX3BlbmRpbmdibG9ja3M7CisJCQlpbnQzMl90CQlmc19wZW5kaW5naW5vZGVzOworCQl9IFBBQ0tFRCBmc191MjsKKwl9ICBmc191MTE7CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJaW50MzJfdAkJZnNfc3BhcmVjb25bNTNdOworCQkJaW50MzJfdAkJZnNfcmVjbGFpbTsKKwkJCWludDMyX3QJCWZzX3NwYXJlY29uMlsxXTsKKwkJCWludDMyX3QJCWZzX3N0YXRlOworCQkJdWludDMyX3QJZnNfcWJtYXNrWzJdOworCQkJdWludDMyX3QJZnNfcWZtYXNrWzJdOworCQl9IFBBQ0tFRCBmc19zdW47CisJCXN0cnVjdCB7CisJCQlpbnQzMl90CQlmc19zcGFyZWNvbls1M107CisJCQlpbnQzMl90CQlmc19yZWNsYWltOworCQkJaW50MzJfdAkJZnNfc3BhcmVjb24yWzFdOworCQkJdWludDMyX3QJZnNfbnBzZWN0OworCQkJdWludDMyX3QJZnNfcWJtYXNrWzJdOworCQkJdWludDMyX3QJZnNfcWZtYXNrWzJdOworCQl9IFBBQ0tFRCBmc19zdW54ODY7CisJCXN0cnVjdCB7CisJCQlpbnQzMl90CQlmc19zcGFyZWNvbls1MF07CisJCQlpbnQzMl90CQlmc19jb250aWdzdW1zaXplOworCQkJaW50MzJfdAkJZnNfbWF4c3ltbGlua2xlbjsKKwkJCWludDMyX3QJCWZzX2lub2RlZm10OworCQkJdWludDMyX3QJZnNfbWF4ZmlsZXNpemVbMl07CisJCQl1aW50MzJfdAlmc19xYm1hc2tbMl07CisJCQl1aW50MzJfdAlmc19xZm1hc2tbMl07CisJCQlpbnQzMl90CQlmc19zdGF0ZTsKKwkJfSBQQUNLRUQgZnNfNDQ7CisJfSBmc191MjsKKwlpbnQzMl90CQlmc19wb3N0Ymxmb3JtYXQ7CisJaW50MzJfdAkJZnNfbnJwb3M7CisJaW50MzJfdAkJZnNfcG9zdGJsb2ZmOworCWludDMyX3QJCWZzX3JvdGJsb2ZmOworCXVpbnQzMl90CWZzX21hZ2ljOworCXVpbnQ4X3QJCWZzX3NwYWNlWzFdOworfSBQQUNLRUQ7CisKKyNkZWZpbmUgVUZTX01BR0lDCQkJMHgwMDAxMTk1NAorI2RlZmluZSBVRlMyX01BR0lDCQkJMHgxOTU0MDExOQorI2RlZmluZSBVRlNfTUFHSUNfRkVBCQkJMHgwMDE5NTYxMgorI2RlZmluZSBVRlNfTUFHSUNfTEZOCQkJMHgwMDA5NTAxNAorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV91ZnMoc3RydWN0IHZvbHVtZV9pZCAqaWQsIHVpbnQ2NF90IG9mZikKK3sKKwlzdGF0aWMgY29uc3Qgc2hvcnQgb2Zmc2V0c1tdID0geyAwLCA4LCA2NCwgMjU2IH07CisKKwl1aW50MzJfdCBtYWdpYzsKKwl1bnNpZ25lZCBpOworCXN0cnVjdCB1ZnNfc3VwZXJfYmxvY2sgKnVmczsKKworCWRiZygicHJvYmluZyBhdCBvZmZzZXQgMHglbGx4IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG9mZnNldHMpOyBpKyspIHsKKwkJdWZzID0gdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIG9mZiArIChvZmZzZXRzW2ldICogMHg0MDApLCAweDgwMCk7CisJCWlmICh1ZnMgPT0gTlVMTCkKKwkJCXJldHVybiAtMTsKKworCQlkYmcoIm9mZnNldCAweCV4Iiwgb2Zmc2V0c1tpXSAqIDB4NDAwKTsKKwkJbWFnaWMgPSB1ZnMtPmZzX21hZ2ljOworCQlpZiAoKG1hZ2ljID09IGNwdV90b19iZTMyKFVGU19NQUdJQykpCisJCSB8fCAobWFnaWMgPT0gY3B1X3RvX2JlMzIoVUZTMl9NQUdJQykpCisJCSB8fCAobWFnaWMgPT0gY3B1X3RvX2JlMzIoVUZTX01BR0lDX0ZFQSkpCisJCSB8fCAobWFnaWMgPT0gY3B1X3RvX2JlMzIoVUZTX01BR0lDX0xGTikpCisJCSkgeworCQkJZGJnKCJtYWdpYyAweCUwOHgoYmUpIiwgbWFnaWMpOworCQkJZ290byBmb3VuZDsKKwkJfQorCQlpZiAoKG1hZ2ljID09IGNwdV90b19sZTMyKFVGU19NQUdJQykpCisJCSB8fCAobWFnaWMgPT0gY3B1X3RvX2xlMzIoVUZTMl9NQUdJQykpCisJCSB8fCAobWFnaWMgPT0gY3B1X3RvX2xlMzIoVUZTX01BR0lDX0ZFQSkpCisJCSB8fCAobWFnaWMgPT0gY3B1X3RvX2xlMzIoVUZTX01BR0lDX0xGTikpCisJCSkgeworCQkJZGJnKCJtYWdpYyAweCUwOHgobGUpIiwgbWFnaWMpOworCQkJZ290byBmb3VuZDsKKwkJfQorCX0KKwlyZXR1cm4gLTE7CisKKyBmb3VuZDoKKy8vCXZvbHVtZV9pZF9zZXRfdXNhZ2UoaWQsIFZPTFVNRV9JRF9GSUxFU1lTVEVNKTsKKy8vCWlkLT50eXBlID0gInVmcyI7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF92aWFfcmFpZC5jIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdW51c2VkX3ZpYV9yYWlkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU4ZjkzYQotLS0gL2Rldi9udWxsCisrKyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3VudXNlZF92aWFfcmFpZC5jCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvL2tidWlsZDojIyMgbGliLSQoQ09ORklHX0ZFQVRVUkVfVk9MVU1FSURfVklBUkFJRCkgKz0gdmlhX3JhaWQubworCisvL2NvbmZpZzoKKy8vY29uZmlnOiMjIyBjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9WSUFSQUlECisvL2NvbmZpZzojIyMJYm9vbCAidmlhIHJhaWQiCisvL2NvbmZpZzojIyMJZGVmYXVsdCB5CisvL2NvbmZpZzojIyMJZGVwZW5kcyBvbiBWT0xVTUVJRAorLy9jb25maWc6IyMjCWhlbHAKKy8vY29uZmlnOiMjIwkgIFRPRE8KKy8vY29uZmlnOgorCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKK3N0cnVjdCB2aWFfbWV0YSB7CisJdWludDE2X3QJc2lnbmF0dXJlOworCXVpbnQ4X3QJCXZlcnNpb25fbnVtYmVyOworCXN0cnVjdCB2aWFfYXJyYXkgeworCQl1aW50MTZfdAlkaXNrX2JpdHM7CisJCXVpbnQ4X3QJCWRpc2tfYXJyYXlfZXg7CisJCXVpbnQzMl90CWNhcGFjaXR5X2xvdzsKKwkJdWludDMyX3QJY2FwYWNpdHlfaGlnaDsKKwkJdWludDMyX3QJc2VyaWFsX2NoZWNrc3VtOworCX0gUEFDS0VEIGFycmF5OworCXVpbnQzMl90CXNlcmlhbF9jaGVja3N1bVs4XTsKKwl1aW50OF90CQljaGVja3N1bTsKK30gUEFDS0VEOworCisjZGVmaW5lIFZJQV9TSUdOQVRVUkUJCTB4QUE1NQorCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV92aWFfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgdWludDY0X3Qgb2ZmLCB1aW50NjRfdCBzaXplKQoreworCXVpbnQ2NF90IG1ldGFfb2ZmOworCXN0cnVjdCB2aWFfbWV0YSAqdmlhOworCisJZGJnKCJwcm9iaW5nIGF0IG9mZnNldCAweCVsbHgsIHNpemUgMHglbGx4IiwKKwkgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmLCAodW5zaWduZWQgbG9uZyBsb25nKSBzaXplKTsKKworCWlmIChzaXplIDwgMHgxMDAwMCkKKwkJcmV0dXJuIC0xOworCisJbWV0YV9vZmYgPSAoKHNpemUgLyAweDIwMCktMSkgKiAweDIwMDsKKworCXZpYSA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYgKyBtZXRhX29mZiwgMHgyMDApOworCWlmICh2aWEgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKHZpYS0+c2lnbmF0dXJlICE9IGNwdV90b19sZTE2KFZJQV9TSUdOQVRVUkUpKQorCQlyZXR1cm4gLTE7CisKKwlpZiAodmlhLT52ZXJzaW9uX251bWJlciA+IDEpCisJCXJldHVybiAtMTsKKworLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX1JBSUQpOworLy8JaWQtPnR5cGVfdmVyc2lvblswXSA9ICcwJyArIHZpYS0+dmVyc2lvbl9udW1iZXI7CisvLwlpZC0+dHlwZV92ZXJzaW9uWzFdID0gJ1wwJzsKKy8vCWlkLT50eXBlID0gInZpYV9yYWlkX21lbWJlciI7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3V0aWwtbGludXgvdm9sdW1lX2lkL3V0aWwuYyBiL3V0aWwtbGludXgvdm9sdW1lX2lkL3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjE1NDVmCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdXRpbC5jCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogdm9sdW1lX2lkIC0gcmVhZHMgZmlsZXN5c3RlbSBsYWJlbCBhbmQgdXVpZAorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBLYXkgU2lldmVycyA8a2F5LnNpZXZlcnNAdnJmeS5vcmc+CisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICoJbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCisgKgl2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqCWJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKglNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VCisgKglMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqCVlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqCUZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBCisgKi8KKworI2luY2x1ZGUgInZvbHVtZV9pZF9pbnRlcm5hbC5oIgorCit2b2lkIHZvbHVtZV9pZF9zZXRfdW5pY29kZTE2KGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgY29uc3QgdWludDhfdCAqYnVmLCBlbnVtIGVuZGlhbiBlbmRpYW5lc3MsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBpLCBqOworCXVuc2lnbmVkIGM7CisKKwlqID0gMDsKKwlmb3IgKGkgPSAwOyBpICsgMiA8PSBjb3VudDsgaSArPSAyKSB7CisJCWlmIChlbmRpYW5lc3MgPT0gTEUpCisJCQljID0gKGJ1ZltpKzFdIDw8IDgpIHwgYnVmW2ldOworCQllbHNlCisJCQljID0gKGJ1ZltpXSA8PCA4KSB8IGJ1ZltpKzFdOworCQlpZiAoYyA9PSAwKQorCQkJYnJlYWs7CisJCWlmIChqKzEgPj0gbGVuKQorCQkJYnJlYWs7CisJCWlmIChjIDwgMHg4MCkgeworCQkJLyogMHh4eHh4eHggKi8KKwkJfSBlbHNlIHsKKwkJCXVpbnQ4X3QgdG9wYml0cyA9IDB4YzA7CisJCQlpZiAoaisyID49IGxlbikKKwkJCQlicmVhazsKKwkJCWlmIChjIDwgMHg4MDApIHsKKwkJCQkvKiAxMTB5eXl4eCAxMHh4eHh4eCAqLworCQkJfSBlbHNlIHsKKwkJCQlpZiAoaiszID49IGxlbikKKwkJCQkJYnJlYWs7CisJCQkJLyogMTExMHl5eXkgMTB5eXl5eHggMTB4eHh4eHggKi8KKwkJCQlzdHJbaisrXSA9ICh1aW50OF90KSAoMHhlMCB8IChjID4+IDEyKSk7CisJCQkJdG9wYml0cyA9IDB4ODA7CisJCQl9CisJCQlzdHJbaisrXSA9ICh1aW50OF90KSAodG9wYml0cyB8ICgoYyA+PiA2KSAmIDB4M2YpKTsKKwkJCWMgPSAweDgwIHwgKGMgJiAweDNmKTsKKwkJfQorCQlzdHJbaisrXSA9ICh1aW50OF90KSBjOworCX0KKwlzdHJbal0gPSAnXDAnOworfQorCisjaWZkZWYgVU5VU0VECitzdGF0aWMgY29uc3QgY2hhciAqdXNhZ2VfdG9fc3RyaW5nKGVudW0gdm9sdW1lX2lkX3VzYWdlIHVzYWdlX2lkKQoreworCXN3aXRjaCAodXNhZ2VfaWQpIHsKKwljYXNlIFZPTFVNRV9JRF9GSUxFU1lTVEVNOgorCQlyZXR1cm4gImZpbGVzeXN0ZW0iOworCWNhc2UgVk9MVU1FX0lEX1BBUlRJVElPTlRBQkxFOgorCQlyZXR1cm4gInBhcnRpdGlvbnRhYmxlIjsKKwljYXNlIFZPTFVNRV9JRF9PVEhFUjoKKwkJcmV0dXJuICJvdGhlciI7CisJY2FzZSBWT0xVTUVfSURfUkFJRDoKKwkJcmV0dXJuICJyYWlkIjsKKwljYXNlIFZPTFVNRV9JRF9ESVNLTEFCRUw6CisJCXJldHVybiAiZGlza2xhYmVsIjsKKwljYXNlIFZPTFVNRV9JRF9DUllQVE86CisJCXJldHVybiAiY3J5cHRvIjsKKwljYXNlIFZPTFVNRV9JRF9VTlBST0JFRDoKKwkJcmV0dXJuICJ1bnByb2JlZCI7CisJY2FzZSBWT0xVTUVfSURfVU5VU0VEOgorCQlyZXR1cm4gInVudXNlZCI7CisJfQorCXJldHVybiBOVUxMOworfQorCit2b2lkIHZvbHVtZV9pZF9zZXRfdXNhZ2VfcGFydChzdHJ1Y3Qgdm9sdW1lX2lkX3BhcnRpdGlvbiAqcGFydCwgZW51bSB2b2x1bWVfaWRfdXNhZ2UgdXNhZ2VfaWQpCit7CisJcGFydC0+dXNhZ2VfaWQgPSB1c2FnZV9pZDsKKwlwYXJ0LT51c2FnZSA9IHVzYWdlX3RvX3N0cmluZyh1c2FnZV9pZCk7Cit9CisKK3ZvaWQgdm9sdW1lX2lkX3NldF91c2FnZShzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgZW51bSB2b2x1bWVfaWRfdXNhZ2UgdXNhZ2VfaWQpCit7CisJaWQtPnVzYWdlX2lkID0gdXNhZ2VfaWQ7CisJaWQtPnVzYWdlID0gdXNhZ2VfdG9fc3RyaW5nKHVzYWdlX2lkKTsKK30KKwordm9pZCB2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCwgY29uc3QgdWludDhfdCAqYnVmLCBzaXplX3QgY291bnQpCit7CisJbWVtY3B5KGlkLT5sYWJlbF9yYXcsIGJ1ZiwgY291bnQpOworCWlkLT5sYWJlbF9yYXdfbGVuID0gY291bnQ7Cit9CisjZW5kaWYKKworI2lmZGVmIE5PVF9ORUVERUQKK3N0YXRpYyBzaXplX3Qgc3Rybmxlbihjb25zdCBjaGFyICpzLCBzaXplX3QgbWF4bGVuKQoreworCXNpemVfdCBpOworCWlmICghbWF4bGVuKSByZXR1cm4gMDsKKwlpZiAoIXMpIHJldHVybiAwOworCWZvciAoaSA9IDA7ICpzICYmIGkgPCBtYXhsZW47ICsrcykgKytpOworCXJldHVybiBpOworfQorI2VuZGlmCisKK3ZvaWQgdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoc3RydWN0IHZvbHVtZV9pZCAqaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXVuc2lnbmVkIGk7CisKKwltZW1jcHkoaWQtPmxhYmVsLCBidWYsIGNvdW50KTsKKworCS8qIHJlbW92ZSB0cmFpbGluZyB3aGl0ZXNwYWNlICovCisJaSA9IHN0cm5sZW4oaWQtPmxhYmVsLCBjb3VudCk7CisJd2hpbGUgKGktLSkgeworCQlpZiAoIWlzc3BhY2UoaWQtPmxhYmVsW2ldKSkKKwkJCWJyZWFrOworCX0KKwlpZC0+bGFiZWxbaSsxXSA9ICdcMCc7Cit9CisKK3ZvaWQgdm9sdW1lX2lkX3NldF9sYWJlbF91bmljb2RlMTYoc3RydWN0IHZvbHVtZV9pZCAqaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgZW51bSBlbmRpYW4gZW5kaWFuZXNzLCBzaXplX3QgY291bnQpCit7CisJdm9sdW1lX2lkX3NldF91bmljb2RlMTYoaWQtPmxhYmVsLCBzaXplb2YoaWQtPmxhYmVsKSwgYnVmLCBlbmRpYW5lc3MsIGNvdW50KTsKK30KKwordm9pZCB2b2x1bWVfaWRfc2V0X3V1aWQoc3RydWN0IHZvbHVtZV9pZCAqaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgZW51bSB1dWlkX2Zvcm1hdCBmb3JtYXQpCit7CisJdW5zaWduZWQgaTsKKwl1bnNpZ25lZCBjb3VudCA9IChmb3JtYXQgPT0gVVVJRF9EQ0VfU1RSSU5HID8gVk9MVU1FX0lEX1VVSURfU0laRSA6IDQgPDwgZm9ybWF0KTsKKworLy8JbWVtY3B5KGlkLT51dWlkX3JhdywgYnVmLCBjb3VudCk7CisvLwlpZC0+dXVpZF9yYXdfbGVuID0gY291bnQ7CisKKwkvKiBpZiBzZXQsIGNyZWF0ZSBzdHJpbmcgaW4gdGhlIHNhbWUgZm9ybWF0LCB0aGUgbmF0aXZlIHBsYXRmb3JtIHVzZXMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJaWYgKGJ1ZltpXSAhPSAwKQorCQkJZ290byBzZXQ7CisJcmV0dXJuOyAvKiBhbGwgYnl0ZXMgYXJlIHplcm8sIGxlYXZlIGl0IGVtcHR5ICgiIikgKi8KKworc2V0OgorCXN3aXRjaCAoZm9ybWF0KSB7CisJY2FzZSBVVUlEX0RPUzoKKwkJc3ByaW50ZihpZC0+dXVpZCwgIiUwMlglMDJYLSUwMlglMDJYIiwKKwkJCWJ1ZlszXSwgYnVmWzJdLCBidWZbMV0sIGJ1ZlswXSk7CisJCWJyZWFrOworCWNhc2UgVVVJRF9OVEZTOgorCQlzcHJpbnRmKGlkLT51dWlkLCAiJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYJTAyWCUwMlgiLAorCQkJYnVmWzddLCBidWZbNl0sIGJ1Zls1XSwgYnVmWzRdLAorCQkJYnVmWzNdLCBidWZbMl0sIGJ1ZlsxXSwgYnVmWzBdKTsKKwkJYnJlYWs7CisJY2FzZSBVVUlEX0RDRToKKwkJc3ByaW50ZihpZC0+dXVpZCwKKwkJCSIlMDJ4JTAyeCUwMnglMDJ4LSUwMnglMDJ4LSUwMnglMDJ4LSUwMnglMDJ4LSUwMnglMDJ4JTAyeCUwMnglMDJ4JTAyeCIsCisJCQlidWZbMF0sIGJ1ZlsxXSwgYnVmWzJdLCBidWZbM10sCisJCQlidWZbNF0sIGJ1Zls1XSwKKwkJCWJ1Zls2XSwgYnVmWzddLAorCQkJYnVmWzhdLCBidWZbOV0sCisJCQlidWZbMTBdLCBidWZbMTFdLCBidWZbMTJdLCBidWZbMTNdLCBidWZbMTRdLCBidWZbMTVdKTsKKwkJYnJlYWs7CisJY2FzZSBVVUlEX0RDRV9TVFJJTkc6CisJCW1lbWNweShpZC0+dXVpZCwgYnVmLCBjb3VudCk7CisJCWlkLT51dWlkW2NvdW50XSA9ICdcMCc7CisJCWJyZWFrOworCX0KK30KKworLyogRG8gbm90IHVzZSB4bHNlZWsgaGVyZS4gV2l0aCBpdCwgc2luZ2xlIGNvcnJ1cHRlZCBmaWxlc3lzdGVtCisgKiBtYXkgcmVzdWx0IGluIGF0dGVtcHQgdG8gc2VlayBwYXN0IGRldmljZSAtPiBleGl0LgorICogSXQncyBiZXR0ZXIgdG8gaWdub3JlIHN1Y2ggZnMgYW5kIGNvbnRpbnVlLiAgKi8KK3ZvaWQgKnZvbHVtZV9pZF9nZXRfYnVmZmVyKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCB1aW50NjRfdCBvZmYsIHNpemVfdCBsZW4pCit7CisJdWludDhfdCAqZHN0OworCXVuc2lnbmVkIHNtYWxsX29mZjsKKwlzc2l6ZV90IHJlYWRfbGVuOworCisJZGJnKCJnZXQgYnVmZmVyIG9mZiAweCVsbHgoJWxsdSksIGxlbiAweCV6eCIsCisJCSh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmLCBsZW4pOworCisJLyogY2hlY2sgaWYgcmVxdWVzdGVkIGFyZWEgZml0cyBpbiBzdXBlcmJsb2NrIGJ1ZmZlciAqLworCWlmIChvZmYgKyBsZW4gPD0gU0JfQlVGRkVSX1NJWkUKKwkgLyogJiYgb2ZmIDw9IFNCX0JVRkZFUl9TSVpFIC0gd2FudCB0aGlzIHBhcmFub2lkIG92ZXJmbG93IGNoZWNrPyAqLworCSkgeworCQlpZiAoaWQtPnNiYnVmID09IE5VTEwpIHsKKwkJCWlkLT5zYmJ1ZiA9IHhtYWxsb2MoU0JfQlVGRkVSX1NJWkUpOworCQl9CisJCXNtYWxsX29mZiA9IG9mZjsKKwkJZHN0ID0gaWQtPnNiYnVmOworCisJCS8qIGNoZWNrIGlmIHdlIG5lZWQgdG8gcmVhZCAqLworCQlsZW4gKz0gb2ZmOworCQlpZiAobGVuIDw9IGlkLT5zYmJ1Zl9sZW4pCisJCQlnb3RvIHJldDsgLyogd2UgYWxyZWFkeSBoYXZlIGl0ICovCisKKwkJZGJnKCJyZWFkIHNiYnVmIGxlbjoweCV4IiwgKHVuc2lnbmVkKSBsZW4pOworCQlpZC0+c2JidWZfbGVuID0gbGVuOworCQlvZmYgPSAwOworCQlnb3RvIGRvX3JlYWQ7CisJfQorCisJaWYgKGxlbiA+IFNFRUtfQlVGRkVSX1NJWkUpIHsKKwkJZGJnKCJzZWVrIGJ1ZmZlciB0b28gc21hbGwgJWQiLCBTRUVLX0JVRkZFUl9TSVpFKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCWRzdCA9IGlkLT5zZWVrYnVmOworCisJLyogY2hlY2sgaWYgd2UgbmVlZCB0byByZWFkICovCisJaWYgKChvZmYgPj0gaWQtPnNlZWtidWZfb2ZmKQorCSAmJiAoKG9mZiArIGxlbikgPD0gKGlkLT5zZWVrYnVmX29mZiArIGlkLT5zZWVrYnVmX2xlbikpCisJKSB7CisJCXNtYWxsX29mZiA9IG9mZiAtIGlkLT5zZWVrYnVmX29mZjsgLyogY2FuJ3Qgb3ZlcmZsb3cgKi8KKwkJZ290byByZXQ7IC8qIHdlIGFscmVhZHkgaGF2ZSBpdCAqLworCX0KKworCWlkLT5zZWVrYnVmX29mZiA9IG9mZjsKKwlpZC0+c2Vla2J1Zl9sZW4gPSBsZW47CisJaWQtPnNlZWtidWYgPSB4cmVhbGxvYyhpZC0+c2Vla2J1ZiwgbGVuKTsKKwlzbWFsbF9vZmYgPSAwOworCWRzdCA9IGlkLT5zZWVrYnVmOworCWRiZygicmVhZCBzZWVrYnVmIG9mZjoweCVsbHggbGVuOjB4JXp4IiwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKSBvZmYsIGxlbik7CisgZG9fcmVhZDoKKwlpZiAobHNlZWsoaWQtPmZkLCBvZmYsIFNFRUtfU0VUKSAhPSBvZmYpIHsKKwkJZGJnKCJzZWVrKDB4JWxseCkgZmFpbGVkIiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgb2ZmKTsKKwkJZ290byBlcnI7CisJfQorCXJlYWRfbGVuID0gZnVsbF9yZWFkKGlkLT5mZCwgZHN0LCBsZW4pOworCWlmIChyZWFkX2xlbiAhPSBsZW4pIHsKKwkJZGJnKCJyZXF1ZXN0ZWQgMHgleCBieXRlcywgZ290IDB4JXggYnl0ZXMiLAorCQkJCSh1bnNpZ25lZCkgbGVuLCAodW5zaWduZWQpIHJlYWRfbGVuKTsKKyBlcnI6CisJCS8qIE5vIGZpbGVzeXN0ZW0gY2FuIGJlIHRoaXMgdGlueS4gSXQncyBtb3N0IGxpa2VseQorCQkgKiBub24tYXNzb2NpYXRlZCBsb29wIGRldmljZSwgZW1wdHkgZHJpdmUgYW5kIHNvIG9uLgorCQkgKiBGbGFnIGl0LCBtYWtpbmcgaXQgcG9zc2libGUgdG8gc2hvcnQgY2lyY3VpdCBmdXR1cmUKKwkJICogYWNjZXNzZXMuIFJhdGlvbmFsZToKKwkJICogdXNlcnMgY29tcGxhaW5lZCBvZiBzbG93IGJsa2lkIGR1ZSB0byBlbXB0eSBmbG9wcHkgZHJpdmVzLgorCQkgKi8KKwkJaWYgKG9mZiA8IDY0KjEwMjQpCisJCQlpZC0+ZXJyb3IgPSAxOworCQkvKiBpZC0+c2Vla2J1Zl9sZW4gb3IgaWQtPnNiYnVmX2xlbiBpcyB3cm9uZyBub3chIEZpeGluZy4gKi8KKwkJdm9sdW1lX2lkX2ZyZWVfYnVmZmVyKGlkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorIHJldDoKKwlyZXR1cm4gZHN0ICsgc21hbGxfb2ZmOworfQorCit2b2lkIHZvbHVtZV9pZF9mcmVlX2J1ZmZlcihzdHJ1Y3Qgdm9sdW1lX2lkICppZCkKK3sKKwlmcmVlKGlkLT5zYmJ1Zik7CisJaWQtPnNiYnVmID0gTlVMTDsKKwlpZC0+c2JidWZfbGVuID0gMDsKKwlmcmVlKGlkLT5zZWVrYnVmKTsKKwlpZC0+c2Vla2J1ZiA9IE5VTEw7CisJaWQtPnNlZWtidWZfbGVuID0gMDsKKwlpZC0+c2Vla2J1Zl9vZmYgPSAwOyAvKiBwYXJhbm9pYSAqLworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvdm9sdW1lX2lkLmMgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC92b2x1bWVfaWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzQ1OWEwCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdm9sdW1lX2lkLmMKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisvL2tidWlsZDpsaWItJChDT05GSUdfVk9MVU1FSUQpICs9IHZvbHVtZV9pZC5vIHV0aWwubworCisjaW5jbHVkZSAidm9sdW1lX2lkX2ludGVybmFsLmgiCisKKworLyogU29tZSBkZXRlY3Rpb24gcm91dGluZXMgZG8gbm90IHNldCBsYWJlbCBvciB1dWlkIGFueXdheSwKKyAqIHNvIHRoZXkgYXJlIGRpc2FibGVkLiAqLworCisvKiBMb29rcyBmb3IgcGFydGl0aW9ucywgd2UgZG9uJ3QgdXNlIGl0OiAqLworI2RlZmluZSBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9NQUMgICAgICAgICAgIDAKKy8qICNkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTVNET1MgICAgICAwIC0gTkI6IHRoaXMgb25lCisgKiB3YXMgbm90IHByb3Blcmx5IGFkZGVkIHRvIHByb2JlIHRhYmxlIGFueXdheSAtID8/ISAqLworCisvKiBOb25lIG9mIFJBSURzIGhhdmUgbGFiZWwgb3IgdXVpZCwgZXhjZXB0IExpbnV4UkFJRDogKi8KKyNkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfSElHSFBPSU5UUkFJRCAwCisjZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0lTV1JBSUQgICAgICAgMAorI2RlZmluZSBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9MU0lSQUlEICAgICAgIDAKKyNkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTFZNICAgICAgICAgICAwCisjZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX05WSURJQVJBSUQgICAgMAorI2RlZmluZSBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9QUk9NSVNFUkFJRCAgIDAKKyNkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfU0lMSUNPTlJBSUQgICAwCisjZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX1ZJQVJBSUQgICAgICAgMAorCisvKiBUaGVzZSBmaWxlc3lzdGVtcyBhbHNvIGhhdmUgbm8gbGFiZWwgb3IgdXVpZDogKi8KKyNkZWZpbmUgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTUlOSVggICAgICAgICAwCisjZGVmaW5lIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0hQRlMgICAgICAgICAgMAorI2RlZmluZSBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9VRlMgICAgICAgICAgIDAKKworCit0eXBlZGVmIGludCBGQVNUX0ZVTkMgKCpyYWlkX3Byb2JlX2ZwdHIpKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCAvKnVpbnQ2NF90IG9mZiwqLyB1aW50NjRfdCBzaXplKTsKK3R5cGVkZWYgaW50IEZBU1RfRlVOQyAoKnByb2JlX2ZwdHIpKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLCB1aW50NjRfdCBvZmYqLyk7CisKK3N0YXRpYyBjb25zdCByYWlkX3Byb2JlX2ZwdHIgcmFpZDFbXSA9IHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9MSU5VWFJBSUQKKwl2b2x1bWVfaWRfcHJvYmVfbGludXhfcmFpZCwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0lTV1JBSUQKKwl2b2x1bWVfaWRfcHJvYmVfaW50ZWxfc29mdHdhcmVfcmFpZCwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0xTSVJBSUQKKwl2b2x1bWVfaWRfcHJvYmVfbHNpX21lZ2FfcmFpZCwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX1ZJQVJBSUQKKwl2b2x1bWVfaWRfcHJvYmVfdmlhX3JhaWQsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9TSUxJQ09OUkFJRAorCXZvbHVtZV9pZF9wcm9iZV9zaWxpY29uX21lZGxleV9yYWlkLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTlZJRElBUkFJRAorCXZvbHVtZV9pZF9wcm9iZV9udmlkaWFfcmFpZCwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX1BST01JU0VSQUlECisJdm9sdW1lX2lkX3Byb2JlX3Byb21pc2VfZmFzdHRyYWNrX3JhaWQsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9ISUdIUE9JTlRSQUlECisJdm9sdW1lX2lkX3Byb2JlX2hpZ2hwb2ludF80NXhfcmFpZCwKKyNlbmRpZgorfTsKKworc3RhdGljIGNvbnN0IHByb2JlX2ZwdHIgcmFpZDJbXSA9IHsKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9MVk0KKwl2b2x1bWVfaWRfcHJvYmVfbHZtMSwKKwl2b2x1bWVfaWRfcHJvYmVfbHZtMiwKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0hJR0hQT0lOVFJBSUQKKwl2b2x1bWVfaWRfcHJvYmVfaGlnaHBvaW50XzM3eF9yYWlkLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTFVLUworCXZvbHVtZV9pZF9wcm9iZV9sdWtzLAorI2VuZGlmCit9OworCisvKiBzaWduYXR1cmUgaW4gdGhlIGZpcnN0IGJsb2NrLCBvbmx5IHNtYWxsIGJ1ZmZlciBuZWVkZWQgKi8KK3N0YXRpYyBjb25zdCBwcm9iZV9mcHRyIGZzMVtdID0geworI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0ZBVAorCXZvbHVtZV9pZF9wcm9iZV92ZmF0LAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfRVhGQVQKKwl2b2x1bWVfaWRfcHJvYmVfZXhmYXQsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9NQUMKKwl2b2x1bWVfaWRfcHJvYmVfbWFjX3BhcnRpdGlvbl9tYXAsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9TUVVBU0hGUworCXZvbHVtZV9pZF9wcm9iZV9zcXVhc2hmcywKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX1hGUworCXZvbHVtZV9pZF9wcm9iZV94ZnMsCisjZW5kaWYKK307CisKKy8qIGZpbGwgYnVmZmVyIHdpdGggbWF4aW11bSAqLworc3RhdGljIGNvbnN0IHByb2JlX2ZwdHIgZnMyW10gPSB7CisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTElOVVhTV0FQCisJdm9sdW1lX2lkX3Byb2JlX2xpbnV4X3N3YXAsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9FWFQKKwl2b2x1bWVfaWRfcHJvYmVfZXh0LAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfQlRSRlMKKwl2b2x1bWVfaWRfcHJvYmVfYnRyZnMsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9SRUlTRVJGUworCXZvbHVtZV9pZF9wcm9iZV9yZWlzZXJmcywKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0pGUworCXZvbHVtZV9pZF9wcm9iZV9qZnMsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9VREYKKwl2b2x1bWVfaWRfcHJvYmVfdWRmLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfSVNPOTY2MAorCXZvbHVtZV9pZF9wcm9iZV9pc285NjYwLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfSEZTCisJdm9sdW1lX2lkX3Byb2JlX2hmc19oZnNwbHVzLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfVUZTCisJdm9sdW1lX2lkX3Byb2JlX3VmcywKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX0YyRlMKKwl2b2x1bWVfaWRfcHJvYmVfZjJmcywKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX05JTEZTCisJdm9sdW1lX2lkX3Byb2JlX25pbGZzLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTlRGUworCXZvbHVtZV9pZF9wcm9iZV9udGZzLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfQ1JBTUZTCisJdm9sdW1lX2lkX3Byb2JlX2NyYW1mcywKKyNlbmRpZgorI2lmIEVOQUJMRV9GRUFUVVJFX1ZPTFVNRUlEX1JPTUZTCisJdm9sdW1lX2lkX3Byb2JlX3JvbWZzLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfSFBGUworCXZvbHVtZV9pZF9wcm9iZV9ocGZzLAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfU1lTVgorCXZvbHVtZV9pZF9wcm9iZV9zeXN2LAorI2VuZGlmCisjaWYgRU5BQkxFX0ZFQVRVUkVfVk9MVU1FSURfTUlOSVgKKwl2b2x1bWVfaWRfcHJvYmVfbWluaXgsCisjZW5kaWYKKyNpZiBFTkFCTEVfRkVBVFVSRV9WT0xVTUVJRF9PQ0ZTMgorCXZvbHVtZV9pZF9wcm9iZV9vY2ZzMiwKKyNlbmRpZgorfTsKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfYWxsKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCAvKnVpbnQ2NF90IG9mZiwqLyB1aW50NjRfdCBzaXplKQoreworCXVuc2lnbmVkIGk7CisKKwkvKiBwcm9iZSBmb3IgcmFpZCBmaXJzdCwgY2F1c2UgZnMgcHJvYmVzIG1heSBiZSBzdWNjZXNzZnVsIG9uIHJhaWQgbWVtYmVycyAqLworCWlmIChzaXplKSB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJhaWQxKTsgaSsrKSB7CisJCQlpZiAocmFpZDFbaV0oaWQsIC8qb2ZmLCovIHNpemUpID09IDApCisJCQkJZ290byByZXQ7CisJCQlpZiAoaWQtPmVycm9yKQorCQkJCWdvdG8gcmV0OworCQl9CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocmFpZDIpOyBpKyspIHsKKwkJaWYgKHJhaWQyW2ldKGlkIC8qLG9mZiovKSA9PSAwKQorCQkJZ290byByZXQ7CisJCWlmIChpZC0+ZXJyb3IpCisJCQlnb3RvIHJldDsKKwl9CisKKwkvKiBzaWduYXR1cmUgaW4gdGhlIGZpcnN0IGJsb2NrLCBvbmx5IHNtYWxsIGJ1ZmZlciBuZWVkZWQgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShmczEpOyBpKyspIHsKKwkJaWYgKGZzMVtpXShpZCAvKixvZmYqLykgPT0gMCkKKwkJCWdvdG8gcmV0OworCQlpZiAoaWQtPmVycm9yKQorCQkJZ290byByZXQ7CisJfQorCisJLyogZmlsbCBidWZmZXIgd2l0aCBtYXhpbXVtICovCisJdm9sdW1lX2lkX2dldF9idWZmZXIoaWQsIDAsIFNCX0JVRkZFUl9TSVpFKTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZzMik7IGkrKykgeworCQlpZiAoZnMyW2ldKGlkIC8qLG9mZiovKSA9PSAwKQorCQkJZ290byByZXQ7CisJCWlmIChpZC0+ZXJyb3IpCisJCQlnb3RvIHJldDsKKwl9CisKKyByZXQ6CisJdm9sdW1lX2lkX2ZyZWVfYnVmZmVyKGlkKTsKKwlyZXR1cm4gKC0gaWQtPmVycm9yKTsgLyogMCBvciAtMSAqLworfQorCisvKiBvcGVuIHZvbHVtZSBieSBkZXZpY2Ugbm9kZSAqLworc3RydWN0IHZvbHVtZV9pZCogRkFTVF9GVU5DIHZvbHVtZV9pZF9vcGVuX25vZGUoaW50IGZkKQoreworCXN0cnVjdCB2b2x1bWVfaWQgKmlkOworCisJaWQgPSB4emFsbG9jKHNpemVvZihzdHJ1Y3Qgdm9sdW1lX2lkKSk7CisJaWQtPmZkID0gZmQ7CisJLy8vKiBjbG9zZSBmZCBvbiBkZXZpY2UgY2xvc2UgKi8KKwkvL2lkLT5mZF9jbG9zZSA9IDE7CisJcmV0dXJuIGlkOworfQorCisjaWZkZWYgVU5VU0VECisvKiBvcGVuIHZvbHVtZSBieSBtYWpvci9taW5vciAqLworc3RydWN0IHZvbHVtZV9pZCogRkFTVF9GVU5DIHZvbHVtZV9pZF9vcGVuX2Rldl90KGRldl90IGRldnQpCit7CisJc3RydWN0IHZvbHVtZV9pZCAqaWQ7CisJY2hhciAqdG1wX25vZGVbVk9MVU1FX0lEX1BBVEhfTUFYXTsKKworCXRtcF9ub2RlID0geGFzcHJpbnRmKCIvZGV2Ly52b2x1bWVfaWQtJXUtJXUtJXUiLAorCQkodW5zaWduZWQpZ2V0cGlkKCksICh1bnNpZ25lZCltYWpvcihkZXZ0KSwgKHVuc2lnbmVkKW1pbm9yKGRldnQpKTsKKworCS8qIGNyZWF0ZSB0ZW1wb3Jhcnkgbm9kZSB0byBvcGVuIGJsb2NrIGRldmljZSAqLworCXVubGluayh0bXBfbm9kZSk7CisJaWYgKG1rbm9kKHRtcF9ub2RlLCAoU19JRkJMSyB8IDA2MDApLCBkZXZ0KSAhPSAwKQorCQliYl9wZXJyb3JfbXNnX2FuZF9kaWUoImNhbid0IG1rbm9kKCVzKSIsIHRtcF9ub2RlKTsKKworCWlkID0gdm9sdW1lX2lkX29wZW5fbm9kZSh0bXBfbm9kZSk7CisJdW5saW5rKHRtcF9ub2RlKTsKKwlmcmVlKHRtcF9ub2RlKTsKKwlyZXR1cm4gaWQ7Cit9CisjZW5kaWYKKwordm9pZCBGQVNUX0ZVTkMgZnJlZV92b2x1bWVfaWQoc3RydWN0IHZvbHVtZV9pZCAqaWQpCit7CisJaWYgKGlkID09IE5VTEwpCisJCXJldHVybjsKKworCS8vaWYgKGlkLT5mZF9jbG9zZSAhPSAwKSAtIGFsd2F5cyB0cnVlCisJCWNsb3NlKGlkLT5mZCk7CisJdm9sdW1lX2lkX2ZyZWVfYnVmZmVyKGlkKTsKKyNpZmRlZiBVTlVTRURfUEFSVElUSU9OX0NPREUKKwlmcmVlKGlkLT5wYXJ0aXRpb25zKTsKKyNlbmRpZgorCWZyZWUoaWQpOworfQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQvdm9sdW1lX2lkX2ludGVybmFsLmggYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC92b2x1bWVfaWRfaW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTJkYmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQvdm9sdW1lX2lkX2ludGVybmFsLmgKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiB2b2x1bWVfaWQgLSByZWFkcyBmaWxlc3lzdGVtIGxhYmVsIGFuZCB1dWlkCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA1IEtheSBTaWV2ZXJzIDxrYXkuc2lldmVyc0B2cmZ5Lm9yZz4KKyAqCisgKglUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKgltb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAqCXZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICoJYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqCU1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAqCUxlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYworICoJTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICoJRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNyBVU0EKKyAqLworCisjaW5jbHVkZSAibGliYmIuaCIKKyNpbmNsdWRlICJ2b2x1bWVfaWQuaCIKKworUFVTSF9BTkRfU0VUX0ZVTkNUSU9OX1ZJU0lCSUxJVFlfVE9fSElEREVOCisKKyNkZWZpbmUgZGJnKC4uLikgKCh2b2lkKTApCisvKiAjZGVmaW5lIGRiZyguLi4pIGJiX2Vycm9yX21zZyhfX1ZBX0FSR1NfXykgKi8KKworLyogdm9sdW1lX2lkLmggKi8KKworI2RlZmluZSBWT0xVTUVfSURfVkVSU0lPTgkJNDgKKworI2RlZmluZSBWT0xVTUVfSURfTEFCRUxfU0laRQkJNjQKKyNkZWZpbmUgVk9MVU1FX0lEX1VVSURfU0laRQkJMzYKKyNkZWZpbmUgVk9MVU1FX0lEX0ZPUk1BVF9TSVpFCQkzMgorI2RlZmluZSBWT0xVTUVfSURfUEFSVElUSU9OU19NQVgJMjU2CisKK2VudW0gdm9sdW1lX2lkX3VzYWdlIHsKKwlWT0xVTUVfSURfVU5VU0VELAorCVZPTFVNRV9JRF9VTlBST0JFRCwKKwlWT0xVTUVfSURfT1RIRVIsCisJVk9MVU1FX0lEX0ZJTEVTWVNURU0sCisJVk9MVU1FX0lEX1BBUlRJVElPTlRBQkxFLAorCVZPTFVNRV9JRF9SQUlELAorCVZPTFVNRV9JRF9ESVNLTEFCRUwsCisJVk9MVU1FX0lEX0NSWVBUTywKK307CisKKyNpZmRlZiBVTlVTRURfUEFSVElUSU9OX0NPREUKK3N0cnVjdCB2b2x1bWVfaWRfcGFydGl0aW9uIHsKKy8vCWNvbnN0IGNoYXIJKnR5cGU7CisvLwljb25zdCBjaGFyCSp1c2FnZTsKKy8vCXNtYWxsaW50CXVzYWdlX2lkOworLy8JdWludDhfdAkJcHRfdHlwZV9yYXc7CisvLwl1aW50NjRfdAlwdF9vZmY7CisvLwl1aW50NjRfdAlwdF9sZW47Cit9OworI2VuZGlmCisKK3N0cnVjdCB2b2x1bWVfaWQgeworCWludAkJZmQ7CisvLwlpbnQJCWZkX2Nsb3NlOjE7CisJaW50CQllcnJvcjsKKwlzaXplX3QJCXNiYnVmX2xlbjsKKwlzaXplX3QJCXNlZWtidWZfbGVuOworCXVpbnQ4X3QJCSpzYmJ1ZjsKKwl1aW50OF90CQkqc2Vla2J1ZjsKKwl1aW50NjRfdAlzZWVrYnVmX29mZjsKKyNpZmRlZiBVTlVTRURfUEFSVElUSU9OX0NPREUKKwlzdHJ1Y3Qgdm9sdW1lX2lkX3BhcnRpdGlvbiAqcGFydGl0aW9uczsKKwlzaXplX3QJCXBhcnRpdGlvbl9jb3VudDsKKyNlbmRpZgorLy8JdWludDhfdAkJbGFiZWxfcmF3W1ZPTFVNRV9JRF9MQUJFTF9TSVpFXTsKKy8vCXNpemVfdAkJbGFiZWxfcmF3X2xlbjsKKwljaGFyCQlsYWJlbFtWT0xVTUVfSURfTEFCRUxfU0laRSsxXTsKKy8vCXVpbnQ4X3QJCXV1aWRfcmF3W1ZPTFVNRV9JRF9VVUlEX1NJWkVdOworLy8Jc2l6ZV90CQl1dWlkX3Jhd19sZW47CisJLyogdXVpZCBpcyBzdG9yZWQgaW4gQVNDSUkgKG5vdCBiaW5hcnkpIGZvcm0gaGVyZTogKi8KKwljaGFyCQl1dWlkW1ZPTFVNRV9JRF9VVUlEX1NJWkUrMV07CisvLwljaGFyCQl0eXBlX3ZlcnNpb25bVk9MVU1FX0lEX0ZPUk1BVF9TSVpFXTsKKy8vCXNtYWxsaW50CXVzYWdlX2lkOworLy8JY29uc3QgY2hhcgkqdXNhZ2U7CisjaWYgRU5BQkxFX0ZFQVRVUkVfQkxLSURfVFlQRQorCWNvbnN0IGNoYXIJKnR5cGU7CisjZW5kaWYKK307CisKK3N0cnVjdCB2b2x1bWVfaWQqIEZBU1RfRlVOQyB2b2x1bWVfaWRfb3Blbl9ub2RlKGludCBmZCk7CitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9hbGwoc3RydWN0IHZvbHVtZV9pZCAqaWQsIC8qdWludDY0X3Qgb2ZmLCovIHVpbnQ2NF90IHNpemUpOwordm9pZCBGQVNUX0ZVTkMgZnJlZV92b2x1bWVfaWQoc3RydWN0IHZvbHVtZV9pZCAqaWQpOworCisvKiB1dGlsLmggKi8KKworLyogc2l6ZSBvZiBzdXBlcmJsb2NrIGJ1ZmZlciwgcmVpc2VyZnMgYmxvY2sgaXMgYXQgNjRrICovCisjZGVmaW5lIFNCX0JVRkZFUl9TSVpFCQkJCTB4MTEwMDAKKy8qIHNpemUgb2Ygc2VlayBidWZmZXIsIEZBVCBjbHVzdGVyIGlzIDMyayBtYXggKi8KKyNkZWZpbmUgU0VFS19CVUZGRVJfU0laRQkJCTB4MTAwMDAKKworI2lmIEJCX0xJVFRMRV9FTkRJQU4KKyMgZGVmaW5lIGxlMTZfdG9fY3B1KHgpICh1aW50MTZfdCkoeCkKKyMgZGVmaW5lIGxlMzJfdG9fY3B1KHgpICh1aW50MzJfdCkoeCkKKyMgZGVmaW5lIGxlNjRfdG9fY3B1KHgpICh1aW50NjRfdCkoeCkKKyMgZGVmaW5lIGJlMTZfdG9fY3B1KHgpICh1aW50MTZfdCkoYnN3YXBfMTYoeCkpCisjIGRlZmluZSBiZTMyX3RvX2NwdSh4KSAodWludDMyX3QpKGJzd2FwXzMyKHgpKQorIyBkZWZpbmUgY3B1X3RvX2xlMTYoeCkgKHVpbnQxNl90KSh4KQorIyBkZWZpbmUgY3B1X3RvX2xlMzIoeCkgKHVpbnQzMl90KSh4KQorIyBkZWZpbmUgY3B1X3RvX2JlMzIoeCkgKHVpbnQzMl90KShic3dhcF8zMih4KSkKKyNlbHNlCisjIGRlZmluZSBsZTE2X3RvX2NwdSh4KSAodWludDE2X3QpKGJzd2FwXzE2KHgpKQorIyBkZWZpbmUgbGUzMl90b19jcHUoeCkgKHVpbnQzMl90KShic3dhcF8zMih4KSkKKyMgZGVmaW5lIGxlNjRfdG9fY3B1KHgpICh1aW50NjRfdCkoYmJfYnN3YXBfNjQoeCkpCisjIGRlZmluZSBiZTE2X3RvX2NwdSh4KSAodWludDE2X3QpKHgpCisjIGRlZmluZSBiZTMyX3RvX2NwdSh4KSAodWludDMyX3QpKHgpCisjIGRlZmluZSBjcHVfdG9fbGUxNih4KSAodWludDE2X3QpKGJzd2FwXzE2KHgpKQorIyBkZWZpbmUgY3B1X3RvX2xlMzIoeCkgKHVpbnQzMl90KShic3dhcF8zMih4KSkKKyMgZGVmaW5lIGNwdV90b19iZTMyKHgpICh1aW50MzJfdCkoeCkKKyNlbmRpZgorCisvKiB2b2x1bWVfaWRfc2V0X3V1aWQoaWQsYnVmLGZtdCkgYXNzdW1lcyBzaXplIG9mIHV1aWQgYnVmCisgKiBieSBzaGlmdGluZzogNCA8PCBmbXQsIGV4Y2VwdCBmb3IgZm10ID09IFVVSURfRENFX1NUUklORy4KKyAqIFRoZSBjb25zdGFudHMgYmVsb3cgc2hvdWxkIG1hdGNoIHNpemVzLgorICovCitlbnVtIHV1aWRfZm9ybWF0IHsKKwlVVUlEX0RPUyA9IDAsCQkvKiA0IGJ5dGVzICovCisJVVVJRF9OVEZTID0gMSwJCS8qIDggYnl0ZXMgKi8KKwlVVUlEX0RDRSA9IDIsCQkvKiAxNiBieXRlcyAqLworCVVVSURfRENFX1NUUklORyA9IDMsCS8qIDM2IGJ5dGVzIChWT0xVTUVfSURfVVVJRF9TSVpFKSAqLworfTsKKworZW51bSBlbmRpYW4geworCUxFID0gMCwKKwlCRSA9IDEKK307CisKK3ZvaWQgdm9sdW1lX2lkX3NldF91bmljb2RlMTYoY2hhciAqc3RyLCBzaXplX3QgbGVuLCBjb25zdCB1aW50OF90ICpidWYsIGVudW0gZW5kaWFuIGVuZGlhbmVzcywgc2l6ZV90IGNvdW50KTsKKy8vdm9pZCB2b2x1bWVfaWRfc2V0X3VzYWdlKHN0cnVjdCB2b2x1bWVfaWQgKmlkLCBlbnVtIHZvbHVtZV9pZF91c2FnZSB1c2FnZV9pZCk7CisvL3ZvaWQgdm9sdW1lX2lkX3NldF91c2FnZV9wYXJ0KHN0cnVjdCB2b2x1bWVfaWRfcGFydGl0aW9uICpwYXJ0LCBlbnVtIHZvbHVtZV9pZF91c2FnZSB1c2FnZV9pZCk7CisvL3ZvaWQgdm9sdW1lX2lkX3NldF9sYWJlbF9yYXcoc3RydWN0IHZvbHVtZV9pZCAqaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK3ZvaWQgdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoc3RydWN0IHZvbHVtZV9pZCAqaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1Ziwgc2l6ZV90IGNvdW50KTsKK3ZvaWQgdm9sdW1lX2lkX3NldF9sYWJlbF91bmljb2RlMTYoc3RydWN0IHZvbHVtZV9pZCAqaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgZW51bSBlbmRpYW4gZW5kaWFuZXNzLCBzaXplX3QgY291bnQpOwordm9pZCB2b2x1bWVfaWRfc2V0X3V1aWQoc3RydWN0IHZvbHVtZV9pZCAqaWQsIGNvbnN0IHVpbnQ4X3QgKmJ1ZiwgZW51bSB1dWlkX2Zvcm1hdCBmb3JtYXQpOwordm9pZCAqdm9sdW1lX2lkX2dldF9idWZmZXIoc3RydWN0IHZvbHVtZV9pZCAqaWQsIHVpbnQ2NF90IG9mZiwgc2l6ZV90IGxlbik7Cit2b2lkIHZvbHVtZV9pZF9mcmVlX2J1ZmZlcihzdHJ1Y3Qgdm9sdW1lX2lkICppZCk7CisKKworLyogUHJvYmUgcm91dGluZXMgKi8KKworLyogUkFJRCAqLworCisvL2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2hpZ2hwb2ludF8zN3hfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisvL2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2hpZ2hwb2ludF80NXhfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLywgdWludDY0X3Qgc2l6ZSk7CisKKy8vaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfaW50ZWxfc29mdHdhcmVfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLywgdWludDY0X3Qgc2l6ZSk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2xpbnV4X3JhaWQoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8sIHVpbnQ2NF90IHNpemUpOworCisvL2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2xzaV9tZWdhX3JhaWQoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8sIHVpbnQ2NF90IHNpemUpOworCisvL2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX252aWRpYV9yYWlkKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovLCB1aW50NjRfdCBzaXplKTsKKworLy9pbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9wcm9taXNlX2Zhc3R0cmFja19yYWlkKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovLCB1aW50NjRfdCBzaXplKTsKKworLy9pbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9zaWxpY29uX21lZGxleV9yYWlkKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovLCB1aW50NjRfdCBzaXplKTsKKworLy9pbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV92aWFfcmFpZChzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLywgdWludDY0X3Qgc2l6ZSk7CisKKy8vaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfbHZtMShzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisvL2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2x2bTIoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCisvKiBGUyAqLworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9idHJmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2NyYW1mcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2V4dChzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX3ZmYXQoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9oZnNfaGZzcGx1cyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKKy8vaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfaHBmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2lzbzk2NjAoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9qZnMoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9saW51eF9zd2FwKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKTsKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfbHVrcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKKy8vaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfbWFjX3BhcnRpdGlvbl9tYXAoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCisvL2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX21pbml4KHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKTsKKworLy9pbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9tc2Rvc19wYXJ0X3RhYmxlKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKTsKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfZjJmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX25pbGZzKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKTsKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfbnRmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX2V4ZmF0KHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKTsKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfb2NmczIoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9yZWlzZXJmcyhzdHJ1Y3Qgdm9sdW1lX2lkICppZCAvKix1aW50NjRfdCBvZmYqLyk7CisKK2ludCBGQVNUX0ZVTkMgdm9sdW1lX2lkX3Byb2JlX3JvbWZzKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKTsKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfc3F1YXNoZnMoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV9zeXN2KHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKTsKKworaW50IEZBU1RfRlVOQyB2b2x1bWVfaWRfcHJvYmVfdWRmKHN0cnVjdCB2b2x1bWVfaWQgKmlkIC8qLHVpbnQ2NF90IG9mZiovKTsKKworLy9pbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV91ZnMoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV94ZnMoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pOworCitQT1BfU0FWRURfRlVOQ1RJT05fVklTSUJJTElUWQpkaWZmIC0tZ2l0IGEvdXRpbC1saW51eC92b2x1bWVfaWQveGZzLmMgYi91dGlsLWxpbnV4L3ZvbHVtZV9pZC94ZnMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWVmYzIwCi0tLSAvZGV2L251bGwKKysrIGIvdXRpbC1saW51eC92b2x1bWVfaWQveGZzLmMKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIHZvbHVtZV9pZCAtIHJlYWRzIGZpbGVzeXN0ZW0gbGFiZWwgYW5kIHV1aWQKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgS2F5IFNpZXZlcnMgPGtheS5zaWV2ZXJzQHZyZnkub3JnPgorICoKKyAqCVRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKKyAqCUxpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgorICoJdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICoJVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKglidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICoJTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVQorICoJTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKglZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCisgKglMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKglGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IFVTQQorICovCisKKy8va2J1aWxkOmxpYi0kKENPTkZJR19GRUFUVVJFX1ZPTFVNRUlEX1hGUykgKz0geGZzLm8KKworLy9jb25maWc6CisvL2NvbmZpZzpjb25maWcgRkVBVFVSRV9WT0xVTUVJRF9YRlMKKy8vY29uZmlnOglib29sICJ4ZnMgZmlsZXN5c3RlbSIKKy8vY29uZmlnOglkZWZhdWx0IHkKKy8vY29uZmlnOglkZXBlbmRzIG9uIFZPTFVNRUlECisvL2NvbmZpZzoJaGVscAorLy9jb25maWc6CSAgVE9ETworLy9jb25maWc6CisKKyNpbmNsdWRlICJ2b2x1bWVfaWRfaW50ZXJuYWwuaCIKKworc3RydWN0IHhmc19zdXBlcl9ibG9jayB7CisJdWludDhfdAltYWdpY1s0XTsKKwl1aW50MzJfdAlibG9ja3NpemU7CisJdWludDY0X3QJZGJsb2NrczsKKwl1aW50NjRfdAlyYmxvY2tzOworCXVpbnQzMl90CWR1bW15MVsyXTsKKwl1aW50OF90CXV1aWRbMTZdOworCXVpbnQzMl90CWR1bW15MlsxNV07CisJdWludDhfdAlmbmFtZVsxMl07CisJdWludDMyX3QJZHVtbXkzWzJdOworCXVpbnQ2NF90CWljb3VudDsKKwl1aW50NjRfdAlpZnJlZTsKKwl1aW50NjRfdAlmZGJsb2NrczsKK30gUEFDS0VEOworCitpbnQgRkFTVF9GVU5DIHZvbHVtZV9pZF9wcm9iZV94ZnMoc3RydWN0IHZvbHVtZV9pZCAqaWQgLyosdWludDY0X3Qgb2ZmKi8pCit7CisjZGVmaW5lIG9mZiAoKHVpbnQ2NF90KTApCisJc3RydWN0IHhmc19zdXBlcl9ibG9jayAqeHM7CisKKwlkYmcoInByb2JpbmcgYXQgb2Zmc2V0IDB4JWxseCIsICh1bnNpZ25lZCBsb25nIGxvbmcpIG9mZik7CisKKwl4cyA9IHZvbHVtZV9pZF9nZXRfYnVmZmVyKGlkLCBvZmYsIDB4MjAwKTsKKwlpZiAoeHMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJaWYgKG1lbWNtcCh4cy0+bWFnaWMsICJYRlNCIiwgNCkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisvLwl2b2x1bWVfaWRfc2V0X2xhYmVsX3JhdyhpZCwgeHMtPmZuYW1lLCAxMik7CisJdm9sdW1lX2lkX3NldF9sYWJlbF9zdHJpbmcoaWQsIHhzLT5mbmFtZSwgMTIpOworCXZvbHVtZV9pZF9zZXRfdXVpZChpZCwgeHMtPnV1aWQsIFVVSURfRENFKTsKKworLy8Jdm9sdW1lX2lkX3NldF91c2FnZShpZCwgVk9MVU1FX0lEX0ZJTEVTWVNURU0pOworCUlGX0ZFQVRVUkVfQkxLSURfVFlQRShpZC0+dHlwZSA9ICJ4ZnMiOykKKworCXJldHVybiAwOworfQo=